From 6d909d8e4008de38063c43a52ccdf9fb0be2d286 Mon Sep 17 00:00:00 2001 From: Joao Salavisa Date: Thu, 28 Dec 2017 13:41:28 +0000 Subject: [PATCH] New wraith fully implementation --- src/wraith/.gitignore | 235 + src/wraith/Kconfig | 1237 + src/wraith/changes/.dummy | 37 + src/wraith/changes/bug12062 | 16 + src/wraith/changes/bug22605 | 5 + src/wraith/changes/bug22907 | 3 + src/wraith/changes/bug23100 | 7 + src/wraith/changes/bug23114 | 6 + src/wraith/changes/bug23571 | 3 + src/wraith/changes/bug23826-23828 | 14 + src/wraith/changes/bug23827 | 8 + src/wraith/changes/bug23848 | 8 + src/wraith/changes/bug23953 | 3 + src/wraith/changes/bug24119 | 4 + src/wraith/changes/bug24137 | 3 + src/wraith/changes/bug24318 | 3 + src/wraith/changes/bug24337 | 8 + src/wraith/changes/bug24362 | 2 + src/wraith/changes/bug24374 | 4 + src/wraith/changes/bug24488 | 4 + src/wraith/changes/bug24489 | 3 + src/wraith/changes/bug24605 | 4 + src/wraith/changes/bug24612 | 4 + src/wraith/changes/bug24613 | 4 + src/wraith/changes/cargo-build-problem | 3 + src/wraith/changes/feature24427 | 5 + src/wraith/changes/ticket13605 | 5 + src/wraith/changes/ticket20020 | 4 + src/wraith/changes/ticket20699 | 14 + src/wraith/changes/ticket20895 | 6 + src/wraith/changes/ticket22342 | 3 + src/wraith/changes/ticket22703 | 6 + src/wraith/changes/ticket22840 | 8 + src/wraith/changes/ticket23271 | 6 + src/wraith/changes/ticket23459 | 4 + src/wraith/changes/ticket23577 | 7 + src/wraith/changes/ticket23637 | 5 + src/wraith/changes/ticket23709 | 11 + src/wraith/changes/ticket23760 | 4 + src/wraith/changes/ticket23845 | 9 + src/wraith/changes/ticket23900 | 7 + src/wraith/changes/ticket24363 | 2 + src/wraith/changes/ticket24467 | 3 + src/wraith/changes/ticket24518 | 4 + src/wraith/contrib/README | 68 + .../contrib/clang/sanitize_blacklist.txt | 103 + .../contrib/client-tools/tor-resolve.py | 153 + src/wraith/contrib/client-tools/torify | 61 + src/wraith/contrib/dirauth-tools/add-tor | 115 + .../nagios-check-tor-authority-cert | 86 + src/wraith/contrib/dist/rc.subr | 43 + src/wraith/contrib/dist/suse/tor.sh.in | 118 + src/wraith/contrib/dist/tor.service.in | 35 + src/wraith/contrib/dist/tor.sh.in | 123 + src/wraith/contrib/dist/torctl.in | 195 + src/wraith/contrib/include.am | 18 + .../contrib/operator-tools/linux-tor-prio.sh | 192 + .../operator-tools/tor-exit-notice.html | 144 + .../contrib/operator-tools/tor.logrotate.in | 14 + src/wraith/contrib/or-tools/check-tor | 41 + src/wraith/contrib/or-tools/checksocks.pl | 83 + src/wraith/contrib/or-tools/exitlist | 323 + .../contrib/win32build/package_nsis-mingw.sh | 95 + .../contrib/win32build/tor-mingw.nsi.in | 274 + src/wraith/contrib/win32build/tor.ico | Bin 0 -> 82726 bytes src/wraith/contrib/win32build/tor.nsi.in | 214 + src/wraith/defconfig | 1249 + src/wraith/doc/HACKING/CodingStandards.md | 419 + src/wraith/doc/HACKING/CodingStandardsRust.md | 469 + src/wraith/doc/HACKING/Fuzzing.md | 123 + src/wraith/doc/HACKING/GettingStarted.md | 188 + src/wraith/doc/HACKING/GettingStartedRust.md | 174 + src/wraith/doc/HACKING/HelpfulTools.md | 349 + src/wraith/doc/HACKING/HowToReview.md | 88 + src/wraith/doc/HACKING/README.1st.md | 62 + src/wraith/doc/HACKING/ReleasingTor.md | 206 + src/wraith/doc/HACKING/Tracing.md | 91 + src/wraith/doc/HACKING/WritingTests.md | 499 + src/wraith/doc/HACKING/android/Simpleperf.md | 98 + src/wraith/doc/TUNING | 86 + src/wraith/doc/asciidoc-helper.sh | 68 + src/wraith/doc/building-tor-msvc.txt | 122 + src/wraith/doc/contrib/tor-rpm-creation.txt | 56 + src/wraith/doc/include.am | 88 + src/wraith/doc/state-contents.txt | 105 + src/wraith/doc/tor-gencert.1.txt | 92 + src/wraith/doc/tor-resolve.1.txt | 54 + src/wraith/doc/tor.1.txt | 3196 + src/wraith/doc/torify.1.txt | 40 + src/wraith/doc/torrc_format.txt | 212 + src/wraith/m4/ax_check_sign.m4 | 54 + src/wraith/m4/pc_from_ucontext.m4 | 128 + src/wraith/m4/pkg.m4 | 214 + src/wraith/mach-default/setup.c | 106 + src/wraith/mach-default/topology.c | 67 + src/wraith/mach-es7000/es7000.h | 110 + src/wraith/mach-es7000/es7000plat.c | 304 + src/wraith/mach-generic/bigsmp.c | 54 + src/wraith/mach-generic/default.c | 27 + src/wraith/mach-generic/es7000.c | 28 + src/wraith/mach-generic/probe.c | 102 + src/wraith/mach-generic/summit.c | 27 + src/wraith/mach-visws/mpparse.c | 105 + src/wraith/mach-visws/reboot.c | 54 + src/wraith/mach-visws/setup.c | 134 + src/wraith/mach-visws/traps.c | 69 + src/wraith/mach-visws/visws_apic.c | 303 + src/wraith/mach-voyager/setup.c | 48 + src/wraith/mach-voyager/voyager_basic.c | 327 + src/wraith/mach-voyager/voyager_cat.c | 1178 + src/wraith/mach-voyager/voyager_smp.c | 1947 + src/wraith/mach-voyager/voyager_thread.c | 167 + src/wraith/math-emu/README | 427 + src/wraith/math-emu/control_w.h | 45 + src/wraith/math-emu/div_Xsig.S | 365 + src/wraith/math-emu/div_small.S | 47 + src/wraith/math-emu/errors.c | 737 + src/wraith/math-emu/exception.h | 53 + src/wraith/math-emu/fpu_arith.c | 174 + src/wraith/math-emu/fpu_asm.h | 32 + src/wraith/math-emu/fpu_aux.c | 204 + src/wraith/math-emu/fpu_emu.h | 217 + src/wraith/math-emu/fpu_entry.c | 760 + src/wraith/math-emu/fpu_etc.c | 143 + src/wraith/math-emu/fpu_proto.h | 142 + src/wraith/math-emu/fpu_system.h | 89 + src/wraith/math-emu/fpu_tags.c | 127 + src/wraith/math-emu/fpu_trig.c | 1845 + src/wraith/math-emu/get_address.c | 449 + src/wraith/math-emu/load_store.c | 270 + src/wraith/math-emu/mul_Xsig.S | 176 + src/wraith/math-emu/poly.h | 121 + src/wraith/math-emu/poly_2xm1.c | 156 + src/wraith/math-emu/poly_atan.c | 229 + src/wraith/math-emu/poly_l2.c | 272 + src/wraith/math-emu/poly_sin.c | 397 + src/wraith/math-emu/poly_tan.c | 222 + src/wraith/math-emu/polynom_Xsig.S | 135 + src/wraith/math-emu/reg_add_sub.c | 374 + src/wraith/math-emu/reg_compare.c | 381 + src/wraith/math-emu/reg_constant.c | 118 + src/wraith/math-emu/reg_constant.h | 31 + src/wraith/math-emu/reg_convert.c | 53 + src/wraith/math-emu/reg_divide.c | 207 + src/wraith/math-emu/reg_ld_str.c | 1370 + src/wraith/math-emu/reg_mul.c | 132 + src/wraith/math-emu/reg_norm.S | 147 + src/wraith/math-emu/reg_round.S | 708 + src/wraith/math-emu/reg_u_add.S | 167 + src/wraith/math-emu/reg_u_div.S | 471 + src/wraith/math-emu/reg_u_mul.S | 148 + src/wraith/math-emu/reg_u_sub.S | 272 + src/wraith/math-emu/round_Xsig.S | 141 + src/wraith/math-emu/shr_Xsig.S | 87 + src/wraith/math-emu/status_w.h | 65 + src/wraith/math-emu/version.h | 12 + src/wraith/math-emu/wm_shrx.S | 204 + src/wraith/math-emu/wm_sqrt.S | 470 + src/wraith/mm/boot_ioremap.c | 97 + src/wraith/mm/discontig.c | 476 + src/wraith/mm/extable.c | 36 + src/wraith/mm/fault.c | 547 + src/wraith/mm/highmem.c | 89 + src/wraith/mm/hugetlbpage.c | 424 + src/wraith/mm/init.c | 726 + src/wraith/mm/ioremap.c | 307 + src/wraith/mm/mmap.c | 71 + src/wraith/mm/pageattr.c | 214 + src/wraith/mm/pgtable.c | 257 + src/wraith/oprofile/Kconfig | 23 + src/wraith/oprofile/init.c | 42 + src/wraith/oprofile/nmi_int.c | 430 + src/wraith/oprofile/nmi_timer_int.c | 61 + src/wraith/oprofile/op_counter.h | 29 + src/wraith/oprofile/op_model_athlon.c | 152 + src/wraith/oprofile/op_model_p4.c | 728 + src/wraith/oprofile/op_model_ppro.c | 146 + src/wraith/oprofile/op_x86_model.h | 51 + src/wraith/pci/acpi.c | 62 + src/wraith/pci/common.c | 251 + src/wraith/pci/direct.c | 285 + src/wraith/pci/fixup.c | 386 + src/wraith/pci/i386.c | 304 + src/wraith/pci/irq.c | 1116 + src/wraith/pci/legacy.c | 54 + src/wraith/pci/mmconfig.c | 120 + src/wraith/pci/numa.c | 126 + src/wraith/pci/pcbios.c | 485 + src/wraith/pci/pci.h | 76 + src/wraith/pci/visws.c | 110 + src/wraith/power/cpu.c | 153 + src/wraith/power/swsusp.S | 61 + src/wraith/scripts/README | 63 + src/wraith/scripts/coccinelle/calloc.cocci | 23 + src/wraith/scripts/coccinelle/ceil_div.cocci | 6 + .../scripts/coccinelle/malloc_cast.cocci | 38 + .../scripts/coccinelle/test-operator-cleanup | 11 + .../scripts/coccinelle/test_assert_int.cocci | 49 + .../scripts/coccinelle/test_assert_null.cocci | 11 + .../scripts/coccinelle/test_assert_zero.cocci | 5 + src/wraith/scripts/coccinelle/uncalloc.cocci | 13 + .../scripts/codegen/fuzzing_include_am.py | 160 + .../scripts/codegen/gen_linux_syscalls.pl | 37 + .../scripts/codegen/gen_server_ciphers.py | 131 + .../scripts/codegen/get_mozilla_ciphers.py | 213 + src/wraith/scripts/codegen/makedesc.py | 351 + src/wraith/scripts/codegen/run_trunnel.sh | 17 + .../scripts/maint/annotate_ifdef_directives | 74 + src/wraith/scripts/maint/checkLogs.pl | 51 + .../scripts/maint/checkOptionDocs.pl.in | 69 + src/wraith/scripts/maint/checkSpace.pl | 203 + .../scripts/maint/check_config_macros.pl | 20 + src/wraith/scripts/maint/fallback.blacklist | 274 + src/wraith/scripts/maint/fallback.whitelist | 829 + src/wraith/scripts/maint/findMergedChanges.pl | 73 + src/wraith/scripts/maint/format_changelog.py | 569 + src/wraith/scripts/maint/lintChanges.py | 117 + .../scripts/maint/locatemissingdoxygen.py | 74 + src/wraith/scripts/maint/redox.py | 226 + src/wraith/scripts/maint/run_calltool.sh | 29 + src/wraith/scripts/maint/sortChanges.py | 108 + src/wraith/scripts/maint/updateCopyright.pl | 7 + .../scripts/maint/updateFallbackDirs.py | 2226 + src/wraith/scripts/maint/updateVersions.pl.in | 59 + src/wraith/scripts/test/cov-blame | 48 + src/wraith/scripts/test/cov-diff | 21 + src/wraith/scripts/test/cov-display | 81 + src/wraith/scripts/test/cov-exclude | 34 + src/wraith/scripts/test/coverage | 46 + src/wraith/scripts/test/scan-build.sh | 80 + src/wraith/src/config/README | 35 + src/wraith/src/config/geoip | 161213 +++++++++++++++ src/wraith/src/config/geoip6 | 41219 ++++ src/wraith/src/config/include.am | 20 + src/wraith/src/config/mmdb-convert.py | 466 + src/wraith/src/config/torrc.minimal.in | 192 + .../src/config/torrc.minimal.in-staging | 210 + src/wraith/src/config/torrc.sample.in | 220 + src/wraith/src/ext/Makefile.nmake | 12 + src/wraith/src/ext/OpenBSD_malloc_Linux.c | 2047 + src/wraith/src/ext/README | 79 + src/wraith/src/ext/byteorder.h | 67 + src/wraith/src/ext/csiphash.c | 125 + src/wraith/src/ext/curve25519_donna/README | 44 + .../curve25519_donna/curve25519-donna-c64.c | 451 + .../ext/curve25519_donna/curve25519-donna.c | 871 + src/wraith/src/ext/ed25519/donna/README.md | 183 + src/wraith/src/ext/ed25519/donna/README.tor | 46 + .../ed25519/donna/curve25519-donna-32bit.h | 579 + .../ed25519/donna/curve25519-donna-64bit.h | 413 + .../ed25519/donna/curve25519-donna-helpers.h | 84 + .../ext/ed25519/donna/curve25519-donna-sse2.h | 1105 + .../ed25519/donna/ed25519-donna-32bit-sse2.h | 513 + .../donna/ed25519-donna-32bit-tables.h | 61 + .../ed25519/donna/ed25519-donna-64bit-sse2.h | 436 + .../donna/ed25519-donna-64bit-tables.h | 53 + .../donna/ed25519-donna-64bit-x86-32bit.h | 435 + .../ed25519/donna/ed25519-donna-64bit-x86.h | 360 + .../donna/ed25519-donna-basepoint-table.h | 259 + .../ed25519/donna/ed25519-donna-batchverify.h | 275 + .../ed25519/donna/ed25519-donna-impl-base.h | 364 + .../ed25519/donna/ed25519-donna-impl-sse2.h | 390 + .../donna/ed25519-donna-portable-identify.h | 103 + .../ed25519/donna/ed25519-donna-portable.h | 174 + .../src/ext/ed25519/donna/ed25519-donna.h | 126 + .../ext/ed25519/donna/ed25519-hash-custom.h | 42 + .../src/ext/ed25519/donna/ed25519-hash.h | 219 + .../donna/ed25519-randombytes-custom.h | 17 + .../ext/ed25519/donna/ed25519-randombytes.h | 91 + src/wraith/src/ext/ed25519/donna/ed25519.c | 150 + src/wraith/src/ext/ed25519/donna/ed25519.h | 30 + .../src/ext/ed25519/donna/ed25519_donna_tor.h | 38 + .../src/ext/ed25519/donna/ed25519_tor.c | 367 + .../src/ext/ed25519/donna/fuzz/README.md | 173 + .../src/ext/ed25519/donna/fuzz/build-nix.php | 134 + .../ext/ed25519/donna/fuzz/curve25519-ref10.c | 1272 + .../ext/ed25519/donna/fuzz/curve25519-ref10.h | 8 + .../ed25519/donna/fuzz/ed25519-donna-sse2.c | 3 + .../ext/ed25519/donna/fuzz/ed25519-donna.c | 1 + .../ext/ed25519/donna/fuzz/ed25519-donna.h | 34 + .../ext/ed25519/donna/fuzz/ed25519-ref10.c | 4647 + .../ext/ed25519/donna/fuzz/ed25519-ref10.h | 9 + .../ext/ed25519/donna/fuzz/fuzz-curve25519.c | 172 + .../src/ext/ed25519/donna/fuzz/fuzz-ed25519.c | 219 + .../src/ext/ed25519/donna/modm-donna-32bit.h | 470 + .../src/ext/ed25519/donna/modm-donna-64bit.h | 366 + src/wraith/src/ext/ed25519/donna/regression.h | 1024 + .../src/ext/ed25519/donna/test-internals.c | 190 + src/wraith/src/ext/ed25519/donna/test-ticks.h | 50 + src/wraith/src/ext/ed25519/donna/test.c | 260 + src/wraith/src/ext/ed25519/ref10/README.tor | 23 + src/wraith/src/ext/ed25519/ref10/api.h | 4 + src/wraith/src/ext/ed25519/ref10/base.h | 1344 + src/wraith/src/ext/ed25519/ref10/base.py | 65 + src/wraith/src/ext/ed25519/ref10/base2.h | 40 + src/wraith/src/ext/ed25519/ref10/base2.py | 60 + src/wraith/src/ext/ed25519/ref10/blinding.c | 119 + .../ext/ed25519/ref10/crypto_hash_sha512.h | 32 + .../src/ext/ed25519/ref10/crypto_int32.h | 25 + .../src/ext/ed25519/ref10/crypto_int64.h | 23 + .../src/ext/ed25519/ref10/crypto_sign.h | 9 + .../src/ext/ed25519/ref10/crypto_uint32.h | 3 + .../src/ext/ed25519/ref10/crypto_uint64.h | 3 + .../src/ext/ed25519/ref10/crypto_verify_32.h | 5 + src/wraith/src/ext/ed25519/ref10/d.h | 1 + src/wraith/src/ext/ed25519/ref10/d.py | 28 + src/wraith/src/ext/ed25519/ref10/d2.h | 1 + src/wraith/src/ext/ed25519/ref10/d2.py | 28 + .../src/ext/ed25519/ref10/ed25519_ref10.h | 34 + src/wraith/src/ext/ed25519/ref10/fe.h | 56 + src/wraith/src/ext/ed25519/ref10/fe_0.c | 19 + src/wraith/src/ext/ed25519/ref10/fe_1.c | 19 + src/wraith/src/ext/ed25519/ref10/fe_add.c | 57 + src/wraith/src/ext/ed25519/ref10/fe_cmov.c | 63 + src/wraith/src/ext/ed25519/ref10/fe_copy.c | 29 + .../src/ext/ed25519/ref10/fe_frombytes.c | 73 + src/wraith/src/ext/ed25519/ref10/fe_invert.c | 14 + .../src/ext/ed25519/ref10/fe_isnegative.c | 16 + .../src/ext/ed25519/ref10/fe_isnonzero.c | 19 + src/wraith/src/ext/ed25519/ref10/fe_mul.c | 253 + src/wraith/src/ext/ed25519/ref10/fe_neg.c | 45 + .../src/ext/ed25519/ref10/fe_pow22523.c | 13 + src/wraith/src/ext/ed25519/ref10/fe_sq.c | 149 + src/wraith/src/ext/ed25519/ref10/fe_sq2.c | 160 + src/wraith/src/ext/ed25519/ref10/fe_sub.c | 57 + src/wraith/src/ext/ed25519/ref10/fe_tobytes.c | 119 + src/wraith/src/ext/ed25519/ref10/ge.h | 95 + src/wraith/src/ext/ed25519/ref10/ge_add.c | 11 + src/wraith/src/ext/ed25519/ref10/ge_add.h | 97 + src/wraith/src/ext/ed25519/ref10/ge_add.q | 49 + .../ext/ed25519/ref10/ge_double_scalarmult.c | 96 + .../src/ext/ed25519/ref10/ge_frombytes.c | 50 + src/wraith/src/ext/ed25519/ref10/ge_madd.c | 11 + src/wraith/src/ext/ed25519/ref10/ge_madd.h | 88 + src/wraith/src/ext/ed25519/ref10/ge_madd.q | 46 + src/wraith/src/ext/ed25519/ref10/ge_msub.c | 11 + src/wraith/src/ext/ed25519/ref10/ge_msub.h | 88 + src/wraith/src/ext/ed25519/ref10/ge_msub.q | 46 + .../src/ext/ed25519/ref10/ge_p1p1_to_p2.c | 12 + .../src/ext/ed25519/ref10/ge_p1p1_to_p3.c | 13 + src/wraith/src/ext/ed25519/ref10/ge_p2_0.c | 8 + src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.c | 11 + src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.h | 73 + src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.q | 41 + src/wraith/src/ext/ed25519/ref10/ge_p3_0.c | 9 + src/wraith/src/ext/ed25519/ref10/ge_p3_dbl.c | 12 + .../src/ext/ed25519/ref10/ge_p3_to_cached.c | 17 + .../src/ext/ed25519/ref10/ge_p3_to_p2.c | 12 + .../src/ext/ed25519/ref10/ge_p3_tobytes.c | 14 + .../src/ext/ed25519/ref10/ge_precomp_0.c | 8 + .../ext/ed25519/ref10/ge_scalarmult_base.c | 109 + src/wraith/src/ext/ed25519/ref10/ge_sub.c | 11 + src/wraith/src/ext/ed25519/ref10/ge_sub.h | 97 + src/wraith/src/ext/ed25519/ref10/ge_sub.q | 49 + src/wraith/src/ext/ed25519/ref10/ge_tobytes.c | 14 + src/wraith/src/ext/ed25519/ref10/keyconv.c | 37 + src/wraith/src/ext/ed25519/ref10/keypair.c | 52 + src/wraith/src/ext/ed25519/ref10/open.c | 43 + src/wraith/src/ext/ed25519/ref10/pow22523.h | 161 + src/wraith/src/ext/ed25519/ref10/pow22523.q | 61 + src/wraith/src/ext/ed25519/ref10/pow225521.h | 161 + src/wraith/src/ext/ed25519/ref10/pow225521.q | 61 + src/wraith/src/ext/ed25519/ref10/q2h.sh | 4 + .../src/ext/ed25519/ref10/randombytes.h | 4 + src/wraith/src/ext/ed25519/ref10/sc.h | 15 + src/wraith/src/ext/ed25519/ref10/sc_muladd.c | 368 + src/wraith/src/ext/ed25519/ref10/sc_reduce.c | 275 + src/wraith/src/ext/ed25519/ref10/sign.c | 29 + src/wraith/src/ext/ed25519/ref10/sqrtm1.h | 1 + src/wraith/src/ext/ed25519/ref10/sqrtm1.py | 28 + src/wraith/src/ext/ht.h | 620 + src/wraith/src/ext/include.am | 176 + .../src/ext/keccak-tiny/README.markdown | 82 + src/wraith/src/ext/keccak-tiny/do.sh | 5 + .../ext/keccak-tiny/keccak-tiny-unrolled.c | 391 + src/wraith/src/ext/keccak-tiny/keccak-tiny.c | 163 + src/wraith/src/ext/keccak-tiny/keccak-tiny.h | 66 + src/wraith/src/ext/mulodi/LICENSE.TXT | 91 + src/wraith/src/ext/mulodi/mulodi4.c | 67 + src/wraith/src/ext/readpassphrase.c | 222 + src/wraith/src/ext/rust/README | 5 + .../crates/libc-0.2.22/.cargo-checksum.json | 1 + .../src/ext/rust/crates/libc-0.2.22/.cargo-ok | 0 .../ext/rust/crates/libc-0.2.22/.gitignore | 3 + .../ext/rust/crates/libc-0.2.22/.travis.yml | 132 + .../ext/rust/crates/libc-0.2.22/Cargo.toml | 21 + .../rust/crates/libc-0.2.22/LICENSE-APACHE | 201 + .../ext/rust/crates/libc-0.2.22/LICENSE-MIT | 25 + .../src/ext/rust/crates/libc-0.2.22/README.md | 137 + .../ext/rust/crates/libc-0.2.22/appveyor.yml | 25 + .../ext/rust/crates/libc-0.2.22/ci/README.md | 203 + .../libc-0.2.22/ci/android-accept-licenses.sh | 15 + .../libc-0.2.22/ci/android-install-ndk.sh | 36 + .../libc-0.2.22/ci/android-install-sdk.sh | 57 + .../docker/aarch64-linux-android/Dockerfile | 32 + .../aarch64-unknown-linux-gnu/Dockerfile | 7 + .../docker/arm-linux-androideabi/Dockerfile | 32 + .../arm-unknown-linux-gnueabihf/Dockerfile | 7 + .../ci/docker/i686-linux-android/Dockerfile | 32 + .../docker/i686-unknown-linux-gnu/Dockerfile | 5 + .../docker/i686-unknown-linux-musl/Dockerfile | 23 + .../docker/mips-unknown-linux-gnu/Dockerfile | 10 + .../docker/mips-unknown-linux-musl/Dockerfile | 17 + .../mips64-unknown-linux-gnuabi64/Dockerfile | 11 + .../mipsel-unknown-linux-musl/Dockerfile | 17 + .../powerpc-unknown-linux-gnu/Dockerfile | 10 + .../powerpc64-unknown-linux-gnu/Dockerfile | 11 + .../ci/docker/x86_64-linux-android/Dockerfile | 32 + .../docker/x86_64-rumprun-netbsd/Dockerfile | 6 + .../docker/x86_64-unknown-freebsd/Dockerfile | 13 + .../x86_64-unknown-linux-gnu/Dockerfile | 5 + .../x86_64-unknown-linux-musl/Dockerfile | 13 + .../docker/x86_64-unknown-openbsd/Dockerfile | 8 + .../src/ext/rust/crates/libc-0.2.22/ci/dox.sh | 33 + .../ci/ios/deploy_and_run_on_ios_simulator.rs | 171 + .../libc-0.2.22/ci/landing-page-footer.html | 3 + .../libc-0.2.22/ci/landing-page-head.html | 7 + .../rust/crates/libc-0.2.22/ci/run-docker.sh | 36 + .../rust/crates/libc-0.2.22/ci/run-qemu.sh | 32 + .../src/ext/rust/crates/libc-0.2.22/ci/run.sh | 179 + .../ext/rust/crates/libc-0.2.22/ci/style.rs | 204 + .../ext/rust/crates/libc-0.2.22/src/dox.rs | 172 + .../ext/rust/crates/libc-0.2.22/src/lib.rs | 279 + .../ext/rust/crates/libc-0.2.22/src/macros.rs | 108 + .../ext/rust/crates/libc-0.2.22/src/redox.rs | 57 + .../libc-0.2.22/src/unix/bsd/apple/b32.rs | 19 + .../libc-0.2.22/src/unix/bsd/apple/b64.rs | 21 + .../libc-0.2.22/src/unix/bsd/apple/mod.rs | 1687 + .../src/unix/bsd/freebsdlike/dragonfly/mod.rs | 420 + .../unix/bsd/freebsdlike/freebsd/aarch64.rs | 30 + .../src/unix/bsd/freebsdlike/freebsd/mod.rs | 577 + .../src/unix/bsd/freebsdlike/freebsd/x86.rs | 31 + .../unix/bsd/freebsdlike/freebsd/x86_64.rs | 30 + .../src/unix/bsd/freebsdlike/mod.rs | 1041 + .../crates/libc-0.2.22/src/unix/bsd/mod.rs | 449 + .../src/unix/bsd/netbsdlike/mod.rs | 626 + .../src/unix/bsd/netbsdlike/netbsd/mod.rs | 725 + .../bsd/netbsdlike/netbsd/other/b32/mod.rs | 2 + .../bsd/netbsdlike/netbsd/other/b64/mod.rs | 2 + .../unix/bsd/netbsdlike/netbsd/other/mod.rs | 14 + .../unix/bsd/netbsdlike/openbsdlike/bitrig.rs | 75 + .../unix/bsd/netbsdlike/openbsdlike/mod.rs | 504 + .../bsd/netbsdlike/openbsdlike/openbsd.rs | 33 + .../netbsdlike/openbsdlike/other/b32/mod.rs | 2 + .../netbsdlike/openbsdlike/other/b64/mod.rs | 2 + .../bsd/netbsdlike/openbsdlike/other/mod.rs | 11 + .../crates/libc-0.2.22/src/unix/haiku/b32.rs | 2 + .../crates/libc-0.2.22/src/unix/haiku/b64.rs | 2 + .../crates/libc-0.2.22/src/unix/haiku/mod.rs | 817 + .../rust/crates/libc-0.2.22/src/unix/mod.rs | 873 + .../src/unix/notbsd/android/b32/arm.rs | 6 + .../src/unix/notbsd/android/b32/mod.rs | 199 + .../src/unix/notbsd/android/b32/x86.rs | 6 + .../src/unix/notbsd/android/b64/aarch64.rs | 56 + .../src/unix/notbsd/android/b64/mod.rs | 162 + .../src/unix/notbsd/android/b64/x86_64.rs | 50 + .../src/unix/notbsd/android/mod.rs | 806 + .../src/unix/notbsd/linux/mips/mips32.rs | 287 + .../src/unix/notbsd/linux/mips/mips64.rs | 225 + .../src/unix/notbsd/linux/mips/mod.rs | 509 + .../libc-0.2.22/src/unix/notbsd/linux/mod.rs | 978 + .../src/unix/notbsd/linux/musl/b32/arm.rs | 346 + .../src/unix/notbsd/linux/musl/b32/asmjs.rs | 336 + .../src/unix/notbsd/linux/musl/b32/mips.rs | 354 + .../src/unix/notbsd/linux/musl/b32/mod.rs | 56 + .../src/unix/notbsd/linux/musl/b32/x86.rs | 360 + .../src/unix/notbsd/linux/musl/b64/aarch64.rs | 3 + .../src/unix/notbsd/linux/musl/b64/mod.rs | 387 + .../unix/notbsd/linux/musl/b64/powerpc64.rs | 3 + .../src/unix/notbsd/linux/musl/b64/x86_64.rs | 20 + .../src/unix/notbsd/linux/musl/mod.rs | 337 + .../src/unix/notbsd/linux/other/b32/arm.rs | 203 + .../src/unix/notbsd/linux/other/b32/mod.rs | 284 + .../unix/notbsd/linux/other/b32/powerpc.rs | 207 + .../src/unix/notbsd/linux/other/b32/x86.rs | 254 + .../unix/notbsd/linux/other/b64/aarch64.rs | 447 + .../src/unix/notbsd/linux/other/b64/mod.rs | 67 + .../unix/notbsd/linux/other/b64/powerpc64.rs | 446 + .../unix/notbsd/linux/other/b64/sparc64.rs | 370 + .../src/unix/notbsd/linux/other/b64/x86_64.rs | 515 + .../src/unix/notbsd/linux/other/mod.rs | 521 + .../src/unix/notbsd/linux/s390x.rs | 738 + .../crates/libc-0.2.22/src/unix/notbsd/mod.rs | 998 + .../libc-0.2.22/src/unix/solaris/mod.rs | 1194 + .../rust/crates/libc-0.2.22/src/windows.rs | 235 + src/wraith/src/ext/siphash.h | 13 + src/wraith/src/ext/strlcat.c | 70 + src/wraith/src/ext/strlcpy.c | 60 + src/wraith/src/ext/timeouts/Rules.shrc | 40 + src/wraith/src/ext/timeouts/bench/Rules.mk | 49 + .../src/ext/timeouts/bench/bench-add.lua | 30 + .../src/ext/timeouts/bench/bench-aux.lua | 30 + .../src/ext/timeouts/bench/bench-del.lua | 25 + .../src/ext/timeouts/bench/bench-expire.lua | 29 + .../src/ext/timeouts/bench/bench-heap.c | 236 + .../src/ext/timeouts/bench/bench-llrb.c | 425 + .../src/ext/timeouts/bench/bench-wheel.c | 81 + src/wraith/src/ext/timeouts/bench/bench.c | 293 + src/wraith/src/ext/timeouts/bench/bench.h | 11 + src/wraith/src/ext/timeouts/bench/bench.plt | 19 + src/wraith/src/ext/timeouts/lua/Rules.mk | 20 + src/wraith/src/ext/timeouts/lua/timeout-lua.c | 396 + src/wraith/src/ext/timeouts/test-timeout.c | 530 + src/wraith/src/ext/timeouts/timeout-bitops.c | 255 + src/wraith/src/ext/timeouts/timeout-debug.h | 77 + src/wraith/src/ext/timeouts/timeout.c | 754 + src/wraith/src/ext/timeouts/timeout.h | 256 + src/wraith/src/ext/tinytest.c | 501 + src/wraith/src/ext/tinytest.h | 100 + src/wraith/src/ext/tinytest_demo.c | 264 + src/wraith/src/ext/tinytest_macros.h | 199 + src/wraith/src/ext/tor_queue.h | 575 + src/wraith/src/ext/tor_queue.txt | 883 + src/wraith/src/ext/tor_readpassphrase.h | 48 + src/wraith/src/ext/trunnel/trunnel-impl.h | 311 + src/wraith/src/ext/trunnel/trunnel.c | 247 + src/wraith/src/ext/trunnel/trunnel.h | 64 + src/wraith/src/include.am | 11 + src/wraith/src/rust/.cargo/config.in | 8 + src/wraith/src/rust/.rustfmt.toml | 2 + src/wraith/src/rust/Cargo.lock | 55 + src/wraith/src/rust/Cargo.toml | 7 + src/wraith/src/rust/external/Cargo.toml | 13 + src/wraith/src/rust/external/external.rs | 33 + src/wraith/src/rust/external/lib.rs | 14 + src/wraith/src/rust/include.am | 26 + src/wraith/src/rust/protover/Cargo.toml | 25 + src/wraith/src/rust/protover/ffi.rs | 219 + src/wraith/src/rust/protover/lib.rs | 33 + src/wraith/src/rust/protover/protover.rs | 906 + .../src/rust/protover/tests/protover.rs | 291 + src/wraith/src/rust/smartlist/Cargo.toml | 13 + src/wraith/src/rust/smartlist/lib.rs | 8 + src/wraith/src/rust/smartlist/smartlist.rs | 115 + src/wraith/src/rust/tor_allocate/Cargo.toml | 13 + src/wraith/src/rust/tor_allocate/lib.rs | 15 + .../src/rust/tor_allocate/tor_allocate.rs | 97 + src/wraith/src/rust/tor_rust/Cargo.toml | 16 + src/wraith/src/rust/tor_rust/include.am | 30 + src/wraith/src/rust/tor_rust/lib.rs | 5 + src/wraith/src/rust/tor_util/Cargo.toml | 16 + src/wraith/src/rust/tor_util/ffi.rs | 26 + src/wraith/src/rust/tor_util/lib.rs | 11 + src/wraith/src/test/Makefile.nmake | 37 + src/wraith/src/test/bench.c | 738 + src/wraith/src/test/bt_test.py | 53 + src/wraith/src/test/ed25519_exts_ref.py | 262 + src/wraith/src/test/ed25519_vectors.inc | 150 + src/wraith/src/test/example_extrainfo.inc | 435 + src/wraith/src/test/failing_routerdescs.inc | 1569 + src/wraith/src/test/fakechans.h | 25 + src/wraith/src/test/fuzz/dict/consensus | 52 + src/wraith/src/test/fuzz/dict/descriptor | 41 + src/wraith/src/test/fuzz/dict/extrainfo | 32 + src/wraith/src/test/fuzz/dict/hsdescv2 | 8 + src/wraith/src/test/fuzz/dict/hsdescv3 | 6 + src/wraith/src/test/fuzz/dict/http | 24 + src/wraith/src/test/fuzz/dict/iptsv2 | 6 + src/wraith/src/test/fuzz/dict/microdesc | 7 + src/wraith/src/test/fuzz/fixup_filenames.sh | 19 + src/wraith/src/test/fuzz/fuzz_consensus.c | 78 + src/wraith/src/test/fuzz/fuzz_descriptor.c | 79 + src/wraith/src/test/fuzz/fuzz_diff.c | 69 + src/wraith/src/test/fuzz/fuzz_diff_apply.c | 65 + src/wraith/src/test/fuzz/fuzz_extrainfo.c | 65 + src/wraith/src/test/fuzz/fuzz_hsdescv2.c | 52 + src/wraith/src/test/fuzz/fuzz_hsdescv3.c | 99 + src/wraith/src/test/fuzz/fuzz_http.c | 133 + src/wraith/src/test/fuzz/fuzz_http_connect.c | 106 + src/wraith/src/test/fuzz/fuzz_iptsv2.c | 46 + src/wraith/src/test/fuzz/fuzz_microdesc.c | 47 + src/wraith/src/test/fuzz/fuzz_multi.sh | 34 + src/wraith/src/test/fuzz/fuzz_vrs.c | 82 + src/wraith/src/test/fuzz/fuzzing.h | 13 + src/wraith/src/test/fuzz/fuzzing_common.c | 189 + src/wraith/src/test/fuzz/include.am | 351 + src/wraith/src/test/fuzz/minimize.sh | 14 + src/wraith/src/test/fuzz_static_testcases.sh | 27 + src/wraith/src/test/hs_build_address.py | 38 + src/wraith/src/test/hs_indexes.py | 70 + src/wraith/src/test/hs_ntor_ref.py | 425 + src/wraith/src/test/hs_test_helpers.c | 276 + src/wraith/src/test/hs_test_helpers.h | 25 + src/wraith/src/test/include.am | 359 + src/wraith/src/test/log_test_helpers.c | 241 + src/wraith/src/test/log_test_helpers.h | 105 + src/wraith/src/test/ntor_ref.py | 405 + src/wraith/src/test/rend_test_helpers.c | 89 + src/wraith/src/test/rend_test_helpers.h | 16 + src/wraith/src/test/slow_ed25519.py | 115 + src/wraith/src/test/slownacl_curve25519.py | 117 + src/wraith/src/test/sr_commit_calc_ref.py | 51 + src/wraith/src/test/sr_srv_calc_ref.py | 71 + src/wraith/src/test/test-child.c | 61 + src/wraith/src/test/test-memwipe.c | 218 + src/wraith/src/test/test-network.sh | 108 + src/wraith/src/test/test-timers.c | 144 + src/wraith/src/test/test.c | 1248 + src/wraith/src/test/test.h | 276 + src/wraith/src/test/test_accounting.c | 105 + src/wraith/src/test/test_addr.c | 1105 + src/wraith/src/test/test_address.c | 1175 + src/wraith/src/test/test_bt.sh | 13 + src/wraith/src/test/test_bt_cl.c | 121 + src/wraith/src/test/test_buffers.c | 821 + src/wraith/src/test/test_cell_formats.c | 1299 + src/wraith/src/test/test_cell_queue.c | 142 + src/wraith/src/test/test_channel.c | 1556 + src/wraith/src/test/test_channelpadding.c | 1163 + src/wraith/src/test/test_channeltls.c | 337 + src/wraith/src/test/test_checkdir.c | 149 + src/wraith/src/test/test_circuitbuild.c | 133 + src/wraith/src/test/test_circuitlist.c | 469 + src/wraith/src/test/test_circuitmux.c | 84 + src/wraith/src/test/test_circuitstats.c | 199 + src/wraith/src/test/test_circuituse.c | 307 + src/wraith/src/test/test_compat_libevent.c | 131 + src/wraith/src/test/test_config.c | 5649 + src/wraith/src/test/test_connection.c | 797 + src/wraith/src/test/test_connection.h | 13 + src/wraith/src/test/test_conscache.c | 340 + src/wraith/src/test/test_consdiff.c | 1185 + src/wraith/src/test/test_consdiffmgr.c | 896 + src/wraith/src/test/test_containers.c | 1297 + src/wraith/src/test/test_controller.c | 1485 + src/wraith/src/test/test_controller_events.c | 406 + src/wraith/src/test/test_crypto.c | 3028 + src/wraith/src/test/test_crypto_openssl.c | 107 + src/wraith/src/test/test_crypto_slow.c | 617 + src/wraith/src/test/test_data.c | 202 + src/wraith/src/test/test_descriptors.inc | 305 + src/wraith/src/test/test_dir.c | 6349 + src/wraith/src/test/test_dir_common.c | 419 + src/wraith/src/test/test_dir_common.h | 52 + src/wraith/src/test/test_dir_handle_get.c | 2634 + src/wraith/src/test/test_dns.c | 748 + src/wraith/src/test/test_entryconn.c | 833 + src/wraith/src/test/test_entrynodes.c | 2868 + src/wraith/src/test/test_extorport.c | 609 + src/wraith/src/test/test_guardfraction.c | 423 + src/wraith/src/test/test_handles.c | 97 + src/wraith/src/test/test_helpers.c | 279 + src/wraith/src/test/test_helpers.h | 32 + src/wraith/src/test/test_hs.c | 1054 + src/wraith/src/test/test_hs_cache.c | 561 + src/wraith/src/test/test_hs_cell.c | 130 + src/wraith/src/test/test_hs_client.c | 599 + src/wraith/src/test/test_hs_common.c | 1822 + src/wraith/src/test/test_hs_config.c | 487 + src/wraith/src/test/test_hs_control.c | 199 + src/wraith/src/test/test_hs_descriptor.c | 895 + src/wraith/src/test/test_hs_descriptor.inc | 224 + src/wraith/src/test/test_hs_intropoint.c | 921 + src/wraith/src/test/test_hs_ntor.c | 114 + src/wraith/src/test/test_hs_ntor.sh | 11 + src/wraith/src/test/test_hs_ntor_cl.c | 255 + src/wraith/src/test/test_hs_service.c | 1620 + src/wraith/src/test/test_introduce.c | 538 + src/wraith/src/test/test_key_expiration.sh | 129 + src/wraith/src/test/test_keygen.sh | 477 + src/wraith/src/test/test_keypin.c | 257 + src/wraith/src/test/test_link_handshake.c | 1579 + src/wraith/src/test/test_logging.c | 173 + src/wraith/src/test/test_microdesc.c | 857 + src/wraith/src/test/test_nodelist.c | 216 + src/wraith/src/test/test_ntor.sh | 9 + src/wraith/src/test/test_ntor_cl.c | 170 + src/wraith/src/test/test_oom.c | 356 + src/wraith/src/test/test_oos.c | 456 + src/wraith/src/test/test_options.c | 4301 + src/wraith/src/test/test_policy.c | 2392 + src/wraith/src/test/test_procmon.c | 58 + src/wraith/src/test/test_proto_http.c | 213 + src/wraith/src/test/test_proto_misc.c | 263 + src/wraith/src/test/test_protover.c | 266 + src/wraith/src/test/test_pt.c | 547 + src/wraith/src/test/test_pubsub.c | 85 + src/wraith/src/test/test_relay.c | 130 + src/wraith/src/test/test_relaycell.c | 249 + src/wraith/src/test/test_rendcache.c | 1242 + src/wraith/src/test/test_replay.c | 391 + src/wraith/src/test/test_router.c | 112 + src/wraith/src/test/test_routerkeys.c | 698 + src/wraith/src/test/test_routerlist.c | 615 + src/wraith/src/test/test_routerset.c | 2224 + src/wraith/src/test/test_rust.sh | 20 + src/wraith/src/test/test_scheduler.c | 1072 + src/wraith/src/test/test_shared_random.c | 1388 + src/wraith/src/test/test_slow.c | 26 + src/wraith/src/test/test_socks.c | 1031 + src/wraith/src/test/test_status.c | 1086 + src/wraith/src/test/test_storagedir.c | 375 + src/wraith/src/test/test_switch_id.c | 192 + src/wraith/src/test/test_switch_id.sh | 32 + src/wraith/src/test/test_threads.c | 304 + src/wraith/src/test/test_tortls.c | 2827 + src/wraith/src/test/test_util.c | 6225 + src/wraith/src/test/test_util_format.c | 419 + src/wraith/src/test/test_util_process.c | 83 + src/wraith/src/test/test_util_slow.c | 391 + src/wraith/src/test/test_workqueue.c | 454 + src/wraith/src/test/test_workqueue_cancel.sh | 4 + src/wraith/src/test/test_workqueue_efd.sh | 4 + src/wraith/src/test/test_workqueue_efd2.sh | 4 + src/wraith/src/test/test_workqueue_pipe.sh | 4 + src/wraith/src/test/test_workqueue_pipe2.sh | 4 + .../src/test/test_workqueue_socketpair.sh | 4 + src/wraith/src/test/test_zero_length_keys.sh | 10 + src/wraith/src/test/testing_common.c | 330 + src/wraith/src/test/testing_rsakeys.c | 546 + src/wraith/src/test/vote_descriptors.inc | 94 + src/wraith/src/test/zero_length_keys.sh | 126 + src/wraith/src/tools/Makefile.nmake | 19 + src/wraith/src/tools/include.am | 52 + src/wraith/src/tools/tor-fw-helper/README | 10 + src/wraith/src/tools/tor-gencert.c | 600 + src/wraith/src/tools/tor-resolve.c | 452 + src/wraith/src/tools/tor_runner.c | 101 + 718 files changed, 404790 insertions(+) create mode 100644 src/wraith/.gitignore create mode 100644 src/wraith/Kconfig create mode 100644 src/wraith/changes/.dummy create mode 100644 src/wraith/changes/bug12062 create mode 100644 src/wraith/changes/bug22605 create mode 100644 src/wraith/changes/bug22907 create mode 100644 src/wraith/changes/bug23100 create mode 100644 src/wraith/changes/bug23114 create mode 100644 src/wraith/changes/bug23571 create mode 100644 src/wraith/changes/bug23826-23828 create mode 100644 src/wraith/changes/bug23827 create mode 100644 src/wraith/changes/bug23848 create mode 100644 src/wraith/changes/bug23953 create mode 100644 src/wraith/changes/bug24119 create mode 100644 src/wraith/changes/bug24137 create mode 100644 src/wraith/changes/bug24318 create mode 100644 src/wraith/changes/bug24337 create mode 100644 src/wraith/changes/bug24362 create mode 100644 src/wraith/changes/bug24374 create mode 100644 src/wraith/changes/bug24488 create mode 100644 src/wraith/changes/bug24489 create mode 100644 src/wraith/changes/bug24605 create mode 100644 src/wraith/changes/bug24612 create mode 100644 src/wraith/changes/bug24613 create mode 100644 src/wraith/changes/cargo-build-problem create mode 100644 src/wraith/changes/feature24427 create mode 100644 src/wraith/changes/ticket13605 create mode 100644 src/wraith/changes/ticket20020 create mode 100644 src/wraith/changes/ticket20699 create mode 100644 src/wraith/changes/ticket20895 create mode 100644 src/wraith/changes/ticket22342 create mode 100644 src/wraith/changes/ticket22703 create mode 100644 src/wraith/changes/ticket22840 create mode 100644 src/wraith/changes/ticket23271 create mode 100644 src/wraith/changes/ticket23459 create mode 100644 src/wraith/changes/ticket23577 create mode 100644 src/wraith/changes/ticket23637 create mode 100644 src/wraith/changes/ticket23709 create mode 100644 src/wraith/changes/ticket23760 create mode 100644 src/wraith/changes/ticket23845 create mode 100644 src/wraith/changes/ticket23900 create mode 100644 src/wraith/changes/ticket24363 create mode 100644 src/wraith/changes/ticket24467 create mode 100644 src/wraith/changes/ticket24518 create mode 100644 src/wraith/contrib/README create mode 100644 src/wraith/contrib/clang/sanitize_blacklist.txt create mode 100644 src/wraith/contrib/client-tools/tor-resolve.py create mode 100644 src/wraith/contrib/client-tools/torify create mode 100644 src/wraith/contrib/dirauth-tools/add-tor create mode 100644 src/wraith/contrib/dirauth-tools/nagios-check-tor-authority-cert create mode 100644 src/wraith/contrib/dist/rc.subr create mode 100644 src/wraith/contrib/dist/suse/tor.sh.in create mode 100644 src/wraith/contrib/dist/tor.service.in create mode 100644 src/wraith/contrib/dist/tor.sh.in create mode 100644 src/wraith/contrib/dist/torctl.in create mode 100644 src/wraith/contrib/include.am create mode 100644 src/wraith/contrib/operator-tools/linux-tor-prio.sh create mode 100644 src/wraith/contrib/operator-tools/tor-exit-notice.html create mode 100644 src/wraith/contrib/operator-tools/tor.logrotate.in create mode 100644 src/wraith/contrib/or-tools/check-tor create mode 100644 src/wraith/contrib/or-tools/checksocks.pl create mode 100644 src/wraith/contrib/or-tools/exitlist create mode 100644 src/wraith/contrib/win32build/package_nsis-mingw.sh create mode 100644 src/wraith/contrib/win32build/tor-mingw.nsi.in create mode 100644 src/wraith/contrib/win32build/tor.ico create mode 100644 src/wraith/contrib/win32build/tor.nsi.in create mode 100644 src/wraith/defconfig create mode 100644 src/wraith/doc/HACKING/CodingStandards.md create mode 100644 src/wraith/doc/HACKING/CodingStandardsRust.md create mode 100644 src/wraith/doc/HACKING/Fuzzing.md create mode 100644 src/wraith/doc/HACKING/GettingStarted.md create mode 100644 src/wraith/doc/HACKING/GettingStartedRust.md create mode 100644 src/wraith/doc/HACKING/HelpfulTools.md create mode 100644 src/wraith/doc/HACKING/HowToReview.md create mode 100644 src/wraith/doc/HACKING/README.1st.md create mode 100644 src/wraith/doc/HACKING/ReleasingTor.md create mode 100644 src/wraith/doc/HACKING/Tracing.md create mode 100644 src/wraith/doc/HACKING/WritingTests.md create mode 100644 src/wraith/doc/HACKING/android/Simpleperf.md create mode 100644 src/wraith/doc/TUNING create mode 100644 src/wraith/doc/asciidoc-helper.sh create mode 100644 src/wraith/doc/building-tor-msvc.txt create mode 100644 src/wraith/doc/contrib/tor-rpm-creation.txt create mode 100644 src/wraith/doc/include.am create mode 100644 src/wraith/doc/state-contents.txt create mode 100644 src/wraith/doc/tor-gencert.1.txt create mode 100644 src/wraith/doc/tor-resolve.1.txt create mode 100644 src/wraith/doc/tor.1.txt create mode 100644 src/wraith/doc/torify.1.txt create mode 100644 src/wraith/doc/torrc_format.txt create mode 100644 src/wraith/m4/ax_check_sign.m4 create mode 100644 src/wraith/m4/pc_from_ucontext.m4 create mode 100644 src/wraith/m4/pkg.m4 create mode 100644 src/wraith/mach-default/setup.c create mode 100644 src/wraith/mach-default/topology.c create mode 100644 src/wraith/mach-es7000/es7000.h create mode 100644 src/wraith/mach-es7000/es7000plat.c create mode 100644 src/wraith/mach-generic/bigsmp.c create mode 100644 src/wraith/mach-generic/default.c create mode 100644 src/wraith/mach-generic/es7000.c create mode 100644 src/wraith/mach-generic/probe.c create mode 100644 src/wraith/mach-generic/summit.c create mode 100644 src/wraith/mach-visws/mpparse.c create mode 100644 src/wraith/mach-visws/reboot.c create mode 100644 src/wraith/mach-visws/setup.c create mode 100644 src/wraith/mach-visws/traps.c create mode 100644 src/wraith/mach-visws/visws_apic.c create mode 100644 src/wraith/mach-voyager/setup.c create mode 100644 src/wraith/mach-voyager/voyager_basic.c create mode 100644 src/wraith/mach-voyager/voyager_cat.c create mode 100644 src/wraith/mach-voyager/voyager_smp.c create mode 100644 src/wraith/mach-voyager/voyager_thread.c create mode 100644 src/wraith/math-emu/README create mode 100644 src/wraith/math-emu/control_w.h create mode 100644 src/wraith/math-emu/div_Xsig.S create mode 100644 src/wraith/math-emu/div_small.S create mode 100644 src/wraith/math-emu/errors.c create mode 100644 src/wraith/math-emu/exception.h create mode 100644 src/wraith/math-emu/fpu_arith.c create mode 100644 src/wraith/math-emu/fpu_asm.h create mode 100644 src/wraith/math-emu/fpu_aux.c create mode 100644 src/wraith/math-emu/fpu_emu.h create mode 100644 src/wraith/math-emu/fpu_entry.c create mode 100644 src/wraith/math-emu/fpu_etc.c create mode 100644 src/wraith/math-emu/fpu_proto.h create mode 100644 src/wraith/math-emu/fpu_system.h create mode 100644 src/wraith/math-emu/fpu_tags.c create mode 100644 src/wraith/math-emu/fpu_trig.c create mode 100644 src/wraith/math-emu/get_address.c create mode 100644 src/wraith/math-emu/load_store.c create mode 100644 src/wraith/math-emu/mul_Xsig.S create mode 100644 src/wraith/math-emu/poly.h create mode 100644 src/wraith/math-emu/poly_2xm1.c create mode 100644 src/wraith/math-emu/poly_atan.c create mode 100644 src/wraith/math-emu/poly_l2.c create mode 100644 src/wraith/math-emu/poly_sin.c create mode 100644 src/wraith/math-emu/poly_tan.c create mode 100644 src/wraith/math-emu/polynom_Xsig.S create mode 100644 src/wraith/math-emu/reg_add_sub.c create mode 100644 src/wraith/math-emu/reg_compare.c create mode 100644 src/wraith/math-emu/reg_constant.c create mode 100644 src/wraith/math-emu/reg_constant.h create mode 100644 src/wraith/math-emu/reg_convert.c create mode 100644 src/wraith/math-emu/reg_divide.c create mode 100644 src/wraith/math-emu/reg_ld_str.c create mode 100644 src/wraith/math-emu/reg_mul.c create mode 100644 src/wraith/math-emu/reg_norm.S create mode 100644 src/wraith/math-emu/reg_round.S create mode 100644 src/wraith/math-emu/reg_u_add.S create mode 100644 src/wraith/math-emu/reg_u_div.S create mode 100644 src/wraith/math-emu/reg_u_mul.S create mode 100644 src/wraith/math-emu/reg_u_sub.S create mode 100644 src/wraith/math-emu/round_Xsig.S create mode 100644 src/wraith/math-emu/shr_Xsig.S create mode 100644 src/wraith/math-emu/status_w.h create mode 100644 src/wraith/math-emu/version.h create mode 100644 src/wraith/math-emu/wm_shrx.S create mode 100644 src/wraith/math-emu/wm_sqrt.S create mode 100644 src/wraith/mm/boot_ioremap.c create mode 100644 src/wraith/mm/discontig.c create mode 100644 src/wraith/mm/extable.c create mode 100644 src/wraith/mm/fault.c create mode 100644 src/wraith/mm/highmem.c create mode 100644 src/wraith/mm/hugetlbpage.c create mode 100644 src/wraith/mm/init.c create mode 100644 src/wraith/mm/ioremap.c create mode 100644 src/wraith/mm/mmap.c create mode 100644 src/wraith/mm/pageattr.c create mode 100644 src/wraith/mm/pgtable.c create mode 100644 src/wraith/oprofile/Kconfig create mode 100644 src/wraith/oprofile/init.c create mode 100644 src/wraith/oprofile/nmi_int.c create mode 100644 src/wraith/oprofile/nmi_timer_int.c create mode 100644 src/wraith/oprofile/op_counter.h create mode 100644 src/wraith/oprofile/op_model_athlon.c create mode 100644 src/wraith/oprofile/op_model_p4.c create mode 100644 src/wraith/oprofile/op_model_ppro.c create mode 100644 src/wraith/oprofile/op_x86_model.h create mode 100644 src/wraith/pci/acpi.c create mode 100644 src/wraith/pci/common.c create mode 100644 src/wraith/pci/direct.c create mode 100644 src/wraith/pci/fixup.c create mode 100644 src/wraith/pci/i386.c create mode 100644 src/wraith/pci/irq.c create mode 100644 src/wraith/pci/legacy.c create mode 100644 src/wraith/pci/mmconfig.c create mode 100644 src/wraith/pci/numa.c create mode 100644 src/wraith/pci/pcbios.c create mode 100644 src/wraith/pci/pci.h create mode 100644 src/wraith/pci/visws.c create mode 100644 src/wraith/power/cpu.c create mode 100644 src/wraith/power/swsusp.S create mode 100644 src/wraith/scripts/README create mode 100644 src/wraith/scripts/coccinelle/calloc.cocci create mode 100644 src/wraith/scripts/coccinelle/ceil_div.cocci create mode 100644 src/wraith/scripts/coccinelle/malloc_cast.cocci create mode 100644 src/wraith/scripts/coccinelle/test-operator-cleanup create mode 100644 src/wraith/scripts/coccinelle/test_assert_int.cocci create mode 100644 src/wraith/scripts/coccinelle/test_assert_null.cocci create mode 100644 src/wraith/scripts/coccinelle/test_assert_zero.cocci create mode 100644 src/wraith/scripts/coccinelle/uncalloc.cocci create mode 100644 src/wraith/scripts/codegen/fuzzing_include_am.py create mode 100644 src/wraith/scripts/codegen/gen_linux_syscalls.pl create mode 100644 src/wraith/scripts/codegen/gen_server_ciphers.py create mode 100644 src/wraith/scripts/codegen/get_mozilla_ciphers.py create mode 100644 src/wraith/scripts/codegen/makedesc.py create mode 100644 src/wraith/scripts/codegen/run_trunnel.sh create mode 100644 src/wraith/scripts/maint/annotate_ifdef_directives create mode 100644 src/wraith/scripts/maint/checkLogs.pl create mode 100644 src/wraith/scripts/maint/checkOptionDocs.pl.in create mode 100644 src/wraith/scripts/maint/checkSpace.pl create mode 100644 src/wraith/scripts/maint/check_config_macros.pl create mode 100644 src/wraith/scripts/maint/fallback.blacklist create mode 100644 src/wraith/scripts/maint/fallback.whitelist create mode 100644 src/wraith/scripts/maint/findMergedChanges.pl create mode 100644 src/wraith/scripts/maint/format_changelog.py create mode 100644 src/wraith/scripts/maint/lintChanges.py create mode 100644 src/wraith/scripts/maint/locatemissingdoxygen.py create mode 100644 src/wraith/scripts/maint/redox.py create mode 100644 src/wraith/scripts/maint/run_calltool.sh create mode 100644 src/wraith/scripts/maint/sortChanges.py create mode 100644 src/wraith/scripts/maint/updateCopyright.pl create mode 100644 src/wraith/scripts/maint/updateFallbackDirs.py create mode 100644 src/wraith/scripts/maint/updateVersions.pl.in create mode 100644 src/wraith/scripts/test/cov-blame create mode 100644 src/wraith/scripts/test/cov-diff create mode 100644 src/wraith/scripts/test/cov-display create mode 100644 src/wraith/scripts/test/cov-exclude create mode 100644 src/wraith/scripts/test/coverage create mode 100644 src/wraith/scripts/test/scan-build.sh create mode 100644 src/wraith/src/config/README create mode 100644 src/wraith/src/config/geoip create mode 100644 src/wraith/src/config/geoip6 create mode 100644 src/wraith/src/config/include.am create mode 100644 src/wraith/src/config/mmdb-convert.py create mode 100644 src/wraith/src/config/torrc.minimal.in create mode 100644 src/wraith/src/config/torrc.minimal.in-staging create mode 100644 src/wraith/src/config/torrc.sample.in create mode 100644 src/wraith/src/ext/Makefile.nmake create mode 100644 src/wraith/src/ext/OpenBSD_malloc_Linux.c create mode 100644 src/wraith/src/ext/README create mode 100644 src/wraith/src/ext/byteorder.h create mode 100644 src/wraith/src/ext/csiphash.c create mode 100644 src/wraith/src/ext/curve25519_donna/README create mode 100644 src/wraith/src/ext/curve25519_donna/curve25519-donna-c64.c create mode 100644 src/wraith/src/ext/curve25519_donna/curve25519-donna.c create mode 100644 src/wraith/src/ext/ed25519/donna/README.md create mode 100644 src/wraith/src/ext/ed25519/donna/README.tor create mode 100644 src/wraith/src/ext/ed25519/donna/curve25519-donna-32bit.h create mode 100644 src/wraith/src/ext/ed25519/donna/curve25519-donna-64bit.h create mode 100644 src/wraith/src/ext/ed25519/donna/curve25519-donna-helpers.h create mode 100644 src/wraith/src/ext/ed25519/donna/curve25519-donna-sse2.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-32bit-sse2.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-32bit-tables.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-sse2.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-tables.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-x86-32bit.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-x86.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-basepoint-table.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-batchverify.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-impl-base.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-impl-sse2.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-portable-identify.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna-portable.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-donna.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-hash-custom.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-hash.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-randombytes-custom.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519-randombytes.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519.c create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519_donna_tor.h create mode 100644 src/wraith/src/ext/ed25519/donna/ed25519_tor.c create mode 100644 src/wraith/src/ext/ed25519/donna/fuzz/README.md create mode 100644 src/wraith/src/ext/ed25519/donna/fuzz/build-nix.php create mode 100644 src/wraith/src/ext/ed25519/donna/fuzz/curve25519-ref10.c create mode 100644 src/wraith/src/ext/ed25519/donna/fuzz/curve25519-ref10.h create mode 100644 src/wraith/src/ext/ed25519/donna/fuzz/ed25519-donna-sse2.c create mode 100644 src/wraith/src/ext/ed25519/donna/fuzz/ed25519-donna.c create mode 100644 src/wraith/src/ext/ed25519/donna/fuzz/ed25519-donna.h create mode 100644 src/wraith/src/ext/ed25519/donna/fuzz/ed25519-ref10.c create mode 100644 src/wraith/src/ext/ed25519/donna/fuzz/ed25519-ref10.h create mode 100644 src/wraith/src/ext/ed25519/donna/fuzz/fuzz-curve25519.c create mode 100644 src/wraith/src/ext/ed25519/donna/fuzz/fuzz-ed25519.c create mode 100644 src/wraith/src/ext/ed25519/donna/modm-donna-32bit.h create mode 100644 src/wraith/src/ext/ed25519/donna/modm-donna-64bit.h create mode 100644 src/wraith/src/ext/ed25519/donna/regression.h create mode 100644 src/wraith/src/ext/ed25519/donna/test-internals.c create mode 100644 src/wraith/src/ext/ed25519/donna/test-ticks.h create mode 100644 src/wraith/src/ext/ed25519/donna/test.c create mode 100644 src/wraith/src/ext/ed25519/ref10/README.tor create mode 100644 src/wraith/src/ext/ed25519/ref10/api.h create mode 100644 src/wraith/src/ext/ed25519/ref10/base.h create mode 100644 src/wraith/src/ext/ed25519/ref10/base.py create mode 100644 src/wraith/src/ext/ed25519/ref10/base2.h create mode 100644 src/wraith/src/ext/ed25519/ref10/base2.py create mode 100644 src/wraith/src/ext/ed25519/ref10/blinding.c create mode 100644 src/wraith/src/ext/ed25519/ref10/crypto_hash_sha512.h create mode 100644 src/wraith/src/ext/ed25519/ref10/crypto_int32.h create mode 100644 src/wraith/src/ext/ed25519/ref10/crypto_int64.h create mode 100644 src/wraith/src/ext/ed25519/ref10/crypto_sign.h create mode 100644 src/wraith/src/ext/ed25519/ref10/crypto_uint32.h create mode 100644 src/wraith/src/ext/ed25519/ref10/crypto_uint64.h create mode 100644 src/wraith/src/ext/ed25519/ref10/crypto_verify_32.h create mode 100644 src/wraith/src/ext/ed25519/ref10/d.h create mode 100644 src/wraith/src/ext/ed25519/ref10/d.py create mode 100644 src/wraith/src/ext/ed25519/ref10/d2.h create mode 100644 src/wraith/src/ext/ed25519/ref10/d2.py create mode 100644 src/wraith/src/ext/ed25519/ref10/ed25519_ref10.h create mode 100644 src/wraith/src/ext/ed25519/ref10/fe.h create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_0.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_1.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_add.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_cmov.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_copy.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_frombytes.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_invert.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_isnegative.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_isnonzero.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_mul.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_neg.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_pow22523.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_sq.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_sq2.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_sub.c create mode 100644 src/wraith/src/ext/ed25519/ref10/fe_tobytes.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge.h create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_add.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_add.h create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_add.q create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_double_scalarmult.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_frombytes.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_madd.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_madd.h create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_madd.q create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_msub.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_msub.h create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_msub.q create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_p1p1_to_p2.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_p1p1_to_p3.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_p2_0.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.h create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.q create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_p3_0.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_p3_dbl.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_p3_to_cached.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_p3_to_p2.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_p3_tobytes.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_precomp_0.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_scalarmult_base.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_sub.c create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_sub.h create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_sub.q create mode 100644 src/wraith/src/ext/ed25519/ref10/ge_tobytes.c create mode 100644 src/wraith/src/ext/ed25519/ref10/keyconv.c create mode 100644 src/wraith/src/ext/ed25519/ref10/keypair.c create mode 100644 src/wraith/src/ext/ed25519/ref10/open.c create mode 100644 src/wraith/src/ext/ed25519/ref10/pow22523.h create mode 100644 src/wraith/src/ext/ed25519/ref10/pow22523.q create mode 100644 src/wraith/src/ext/ed25519/ref10/pow225521.h create mode 100644 src/wraith/src/ext/ed25519/ref10/pow225521.q create mode 100644 src/wraith/src/ext/ed25519/ref10/q2h.sh create mode 100644 src/wraith/src/ext/ed25519/ref10/randombytes.h create mode 100644 src/wraith/src/ext/ed25519/ref10/sc.h create mode 100644 src/wraith/src/ext/ed25519/ref10/sc_muladd.c create mode 100644 src/wraith/src/ext/ed25519/ref10/sc_reduce.c create mode 100644 src/wraith/src/ext/ed25519/ref10/sign.c create mode 100644 src/wraith/src/ext/ed25519/ref10/sqrtm1.h create mode 100644 src/wraith/src/ext/ed25519/ref10/sqrtm1.py create mode 100644 src/wraith/src/ext/ht.h create mode 100644 src/wraith/src/ext/include.am create mode 100644 src/wraith/src/ext/keccak-tiny/README.markdown create mode 100644 src/wraith/src/ext/keccak-tiny/do.sh create mode 100644 src/wraith/src/ext/keccak-tiny/keccak-tiny-unrolled.c create mode 100644 src/wraith/src/ext/keccak-tiny/keccak-tiny.c create mode 100644 src/wraith/src/ext/keccak-tiny/keccak-tiny.h create mode 100644 src/wraith/src/ext/mulodi/LICENSE.TXT create mode 100644 src/wraith/src/ext/mulodi/mulodi4.c create mode 100644 src/wraith/src/ext/readpassphrase.c create mode 100644 src/wraith/src/ext/rust/README create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/.cargo-checksum.json create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/.cargo-ok create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/.gitignore create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/.travis.yml create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/Cargo.toml create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/LICENSE-APACHE create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/LICENSE-MIT create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/README.md create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/appveyor.yml create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/README.md create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-accept-licenses.sh create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-install-ndk.sh create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-install-sdk.sh create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-linux-android/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-unknown-linux-gnu/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-linux-androideabi/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-linux-android/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-gnu/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-musl/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-gnu/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-musl/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mipsel-unknown-linux-musl/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc-unknown-linux-gnu/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-linux-android/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-rumprun-netbsd/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-freebsd/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-gnu/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-musl/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-openbsd/Dockerfile create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/dox.sh create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/ios/deploy_and_run_on_ios_simulator.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/landing-page-footer.html create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/landing-page-head.html create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run-docker.sh create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run-qemu.sh create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run.sh create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/ci/style.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/dox.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/lib.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/macros.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/redox.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b32.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/dragonfly/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/aarch64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86_64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b32.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/arm.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/x86.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/aarch64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/x86_64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips32.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/arm.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/asmjs.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mips.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/x86.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/aarch64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/powerpc64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/x86_64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/arm.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/powerpc.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/x86.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/aarch64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/powerpc64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/sparc64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/x86_64.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/s390x.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/solaris/mod.rs create mode 100644 src/wraith/src/ext/rust/crates/libc-0.2.22/src/windows.rs create mode 100644 src/wraith/src/ext/siphash.h create mode 100644 src/wraith/src/ext/strlcat.c create mode 100644 src/wraith/src/ext/strlcpy.c create mode 100644 src/wraith/src/ext/timeouts/Rules.shrc create mode 100644 src/wraith/src/ext/timeouts/bench/Rules.mk create mode 100644 src/wraith/src/ext/timeouts/bench/bench-add.lua create mode 100644 src/wraith/src/ext/timeouts/bench/bench-aux.lua create mode 100644 src/wraith/src/ext/timeouts/bench/bench-del.lua create mode 100644 src/wraith/src/ext/timeouts/bench/bench-expire.lua create mode 100644 src/wraith/src/ext/timeouts/bench/bench-heap.c create mode 100644 src/wraith/src/ext/timeouts/bench/bench-llrb.c create mode 100644 src/wraith/src/ext/timeouts/bench/bench-wheel.c create mode 100644 src/wraith/src/ext/timeouts/bench/bench.c create mode 100644 src/wraith/src/ext/timeouts/bench/bench.h create mode 100644 src/wraith/src/ext/timeouts/bench/bench.plt create mode 100644 src/wraith/src/ext/timeouts/lua/Rules.mk create mode 100644 src/wraith/src/ext/timeouts/lua/timeout-lua.c create mode 100644 src/wraith/src/ext/timeouts/test-timeout.c create mode 100644 src/wraith/src/ext/timeouts/timeout-bitops.c create mode 100644 src/wraith/src/ext/timeouts/timeout-debug.h create mode 100644 src/wraith/src/ext/timeouts/timeout.c create mode 100644 src/wraith/src/ext/timeouts/timeout.h create mode 100644 src/wraith/src/ext/tinytest.c create mode 100644 src/wraith/src/ext/tinytest.h create mode 100644 src/wraith/src/ext/tinytest_demo.c create mode 100644 src/wraith/src/ext/tinytest_macros.h create mode 100644 src/wraith/src/ext/tor_queue.h create mode 100644 src/wraith/src/ext/tor_queue.txt create mode 100644 src/wraith/src/ext/tor_readpassphrase.h create mode 100644 src/wraith/src/ext/trunnel/trunnel-impl.h create mode 100644 src/wraith/src/ext/trunnel/trunnel.c create mode 100644 src/wraith/src/ext/trunnel/trunnel.h create mode 100644 src/wraith/src/include.am create mode 100644 src/wraith/src/rust/.cargo/config.in create mode 100644 src/wraith/src/rust/.rustfmt.toml create mode 100644 src/wraith/src/rust/Cargo.lock create mode 100644 src/wraith/src/rust/Cargo.toml create mode 100644 src/wraith/src/rust/external/Cargo.toml create mode 100644 src/wraith/src/rust/external/external.rs create mode 100644 src/wraith/src/rust/external/lib.rs create mode 100644 src/wraith/src/rust/include.am create mode 100644 src/wraith/src/rust/protover/Cargo.toml create mode 100644 src/wraith/src/rust/protover/ffi.rs create mode 100644 src/wraith/src/rust/protover/lib.rs create mode 100644 src/wraith/src/rust/protover/protover.rs create mode 100644 src/wraith/src/rust/protover/tests/protover.rs create mode 100644 src/wraith/src/rust/smartlist/Cargo.toml create mode 100644 src/wraith/src/rust/smartlist/lib.rs create mode 100644 src/wraith/src/rust/smartlist/smartlist.rs create mode 100644 src/wraith/src/rust/tor_allocate/Cargo.toml create mode 100644 src/wraith/src/rust/tor_allocate/lib.rs create mode 100644 src/wraith/src/rust/tor_allocate/tor_allocate.rs create mode 100644 src/wraith/src/rust/tor_rust/Cargo.toml create mode 100644 src/wraith/src/rust/tor_rust/include.am create mode 100644 src/wraith/src/rust/tor_rust/lib.rs create mode 100644 src/wraith/src/rust/tor_util/Cargo.toml create mode 100644 src/wraith/src/rust/tor_util/ffi.rs create mode 100644 src/wraith/src/rust/tor_util/lib.rs create mode 100644 src/wraith/src/test/Makefile.nmake create mode 100644 src/wraith/src/test/bench.c create mode 100644 src/wraith/src/test/bt_test.py create mode 100644 src/wraith/src/test/ed25519_exts_ref.py create mode 100644 src/wraith/src/test/ed25519_vectors.inc create mode 100644 src/wraith/src/test/example_extrainfo.inc create mode 100644 src/wraith/src/test/failing_routerdescs.inc create mode 100644 src/wraith/src/test/fakechans.h create mode 100644 src/wraith/src/test/fuzz/dict/consensus create mode 100644 src/wraith/src/test/fuzz/dict/descriptor create mode 100644 src/wraith/src/test/fuzz/dict/extrainfo create mode 100644 src/wraith/src/test/fuzz/dict/hsdescv2 create mode 100644 src/wraith/src/test/fuzz/dict/hsdescv3 create mode 100644 src/wraith/src/test/fuzz/dict/http create mode 100644 src/wraith/src/test/fuzz/dict/iptsv2 create mode 100644 src/wraith/src/test/fuzz/dict/microdesc create mode 100644 src/wraith/src/test/fuzz/fixup_filenames.sh create mode 100644 src/wraith/src/test/fuzz/fuzz_consensus.c create mode 100644 src/wraith/src/test/fuzz/fuzz_descriptor.c create mode 100644 src/wraith/src/test/fuzz/fuzz_diff.c create mode 100644 src/wraith/src/test/fuzz/fuzz_diff_apply.c create mode 100644 src/wraith/src/test/fuzz/fuzz_extrainfo.c create mode 100644 src/wraith/src/test/fuzz/fuzz_hsdescv2.c create mode 100644 src/wraith/src/test/fuzz/fuzz_hsdescv3.c create mode 100644 src/wraith/src/test/fuzz/fuzz_http.c create mode 100644 src/wraith/src/test/fuzz/fuzz_http_connect.c create mode 100644 src/wraith/src/test/fuzz/fuzz_iptsv2.c create mode 100644 src/wraith/src/test/fuzz/fuzz_microdesc.c create mode 100644 src/wraith/src/test/fuzz/fuzz_multi.sh create mode 100644 src/wraith/src/test/fuzz/fuzz_vrs.c create mode 100644 src/wraith/src/test/fuzz/fuzzing.h create mode 100644 src/wraith/src/test/fuzz/fuzzing_common.c create mode 100644 src/wraith/src/test/fuzz/include.am create mode 100644 src/wraith/src/test/fuzz/minimize.sh create mode 100644 src/wraith/src/test/fuzz_static_testcases.sh create mode 100644 src/wraith/src/test/hs_build_address.py create mode 100644 src/wraith/src/test/hs_indexes.py create mode 100644 src/wraith/src/test/hs_ntor_ref.py create mode 100644 src/wraith/src/test/hs_test_helpers.c create mode 100644 src/wraith/src/test/hs_test_helpers.h create mode 100644 src/wraith/src/test/include.am create mode 100644 src/wraith/src/test/log_test_helpers.c create mode 100644 src/wraith/src/test/log_test_helpers.h create mode 100644 src/wraith/src/test/ntor_ref.py create mode 100644 src/wraith/src/test/rend_test_helpers.c create mode 100644 src/wraith/src/test/rend_test_helpers.h create mode 100644 src/wraith/src/test/slow_ed25519.py create mode 100644 src/wraith/src/test/slownacl_curve25519.py create mode 100644 src/wraith/src/test/sr_commit_calc_ref.py create mode 100644 src/wraith/src/test/sr_srv_calc_ref.py create mode 100644 src/wraith/src/test/test-child.c create mode 100644 src/wraith/src/test/test-memwipe.c create mode 100644 src/wraith/src/test/test-network.sh create mode 100644 src/wraith/src/test/test-timers.c create mode 100644 src/wraith/src/test/test.c create mode 100644 src/wraith/src/test/test.h create mode 100644 src/wraith/src/test/test_accounting.c create mode 100644 src/wraith/src/test/test_addr.c create mode 100644 src/wraith/src/test/test_address.c create mode 100644 src/wraith/src/test/test_bt.sh create mode 100644 src/wraith/src/test/test_bt_cl.c create mode 100644 src/wraith/src/test/test_buffers.c create mode 100644 src/wraith/src/test/test_cell_formats.c create mode 100644 src/wraith/src/test/test_cell_queue.c create mode 100644 src/wraith/src/test/test_channel.c create mode 100644 src/wraith/src/test/test_channelpadding.c create mode 100644 src/wraith/src/test/test_channeltls.c create mode 100644 src/wraith/src/test/test_checkdir.c create mode 100644 src/wraith/src/test/test_circuitbuild.c create mode 100644 src/wraith/src/test/test_circuitlist.c create mode 100644 src/wraith/src/test/test_circuitmux.c create mode 100644 src/wraith/src/test/test_circuitstats.c create mode 100644 src/wraith/src/test/test_circuituse.c create mode 100644 src/wraith/src/test/test_compat_libevent.c create mode 100644 src/wraith/src/test/test_config.c create mode 100644 src/wraith/src/test/test_connection.c create mode 100644 src/wraith/src/test/test_connection.h create mode 100644 src/wraith/src/test/test_conscache.c create mode 100644 src/wraith/src/test/test_consdiff.c create mode 100644 src/wraith/src/test/test_consdiffmgr.c create mode 100644 src/wraith/src/test/test_containers.c create mode 100644 src/wraith/src/test/test_controller.c create mode 100644 src/wraith/src/test/test_controller_events.c create mode 100644 src/wraith/src/test/test_crypto.c create mode 100644 src/wraith/src/test/test_crypto_openssl.c create mode 100644 src/wraith/src/test/test_crypto_slow.c create mode 100644 src/wraith/src/test/test_data.c create mode 100644 src/wraith/src/test/test_descriptors.inc create mode 100644 src/wraith/src/test/test_dir.c create mode 100644 src/wraith/src/test/test_dir_common.c create mode 100644 src/wraith/src/test/test_dir_common.h create mode 100644 src/wraith/src/test/test_dir_handle_get.c create mode 100644 src/wraith/src/test/test_dns.c create mode 100644 src/wraith/src/test/test_entryconn.c create mode 100644 src/wraith/src/test/test_entrynodes.c create mode 100644 src/wraith/src/test/test_extorport.c create mode 100644 src/wraith/src/test/test_guardfraction.c create mode 100644 src/wraith/src/test/test_handles.c create mode 100644 src/wraith/src/test/test_helpers.c create mode 100644 src/wraith/src/test/test_helpers.h create mode 100644 src/wraith/src/test/test_hs.c create mode 100644 src/wraith/src/test/test_hs_cache.c create mode 100644 src/wraith/src/test/test_hs_cell.c create mode 100644 src/wraith/src/test/test_hs_client.c create mode 100644 src/wraith/src/test/test_hs_common.c create mode 100644 src/wraith/src/test/test_hs_config.c create mode 100644 src/wraith/src/test/test_hs_control.c create mode 100644 src/wraith/src/test/test_hs_descriptor.c create mode 100644 src/wraith/src/test/test_hs_descriptor.inc create mode 100644 src/wraith/src/test/test_hs_intropoint.c create mode 100644 src/wraith/src/test/test_hs_ntor.c create mode 100644 src/wraith/src/test/test_hs_ntor.sh create mode 100644 src/wraith/src/test/test_hs_ntor_cl.c create mode 100644 src/wraith/src/test/test_hs_service.c create mode 100644 src/wraith/src/test/test_introduce.c create mode 100644 src/wraith/src/test/test_key_expiration.sh create mode 100644 src/wraith/src/test/test_keygen.sh create mode 100644 src/wraith/src/test/test_keypin.c create mode 100644 src/wraith/src/test/test_link_handshake.c create mode 100644 src/wraith/src/test/test_logging.c create mode 100644 src/wraith/src/test/test_microdesc.c create mode 100644 src/wraith/src/test/test_nodelist.c create mode 100644 src/wraith/src/test/test_ntor.sh create mode 100644 src/wraith/src/test/test_ntor_cl.c create mode 100644 src/wraith/src/test/test_oom.c create mode 100644 src/wraith/src/test/test_oos.c create mode 100644 src/wraith/src/test/test_options.c create mode 100644 src/wraith/src/test/test_policy.c create mode 100644 src/wraith/src/test/test_procmon.c create mode 100644 src/wraith/src/test/test_proto_http.c create mode 100644 src/wraith/src/test/test_proto_misc.c create mode 100644 src/wraith/src/test/test_protover.c create mode 100644 src/wraith/src/test/test_pt.c create mode 100644 src/wraith/src/test/test_pubsub.c create mode 100644 src/wraith/src/test/test_relay.c create mode 100644 src/wraith/src/test/test_relaycell.c create mode 100644 src/wraith/src/test/test_rendcache.c create mode 100644 src/wraith/src/test/test_replay.c create mode 100644 src/wraith/src/test/test_router.c create mode 100644 src/wraith/src/test/test_routerkeys.c create mode 100644 src/wraith/src/test/test_routerlist.c create mode 100644 src/wraith/src/test/test_routerset.c create mode 100644 src/wraith/src/test/test_rust.sh create mode 100644 src/wraith/src/test/test_scheduler.c create mode 100644 src/wraith/src/test/test_shared_random.c create mode 100644 src/wraith/src/test/test_slow.c create mode 100644 src/wraith/src/test/test_socks.c create mode 100644 src/wraith/src/test/test_status.c create mode 100644 src/wraith/src/test/test_storagedir.c create mode 100644 src/wraith/src/test/test_switch_id.c create mode 100644 src/wraith/src/test/test_switch_id.sh create mode 100644 src/wraith/src/test/test_threads.c create mode 100644 src/wraith/src/test/test_tortls.c create mode 100644 src/wraith/src/test/test_util.c create mode 100644 src/wraith/src/test/test_util_format.c create mode 100644 src/wraith/src/test/test_util_process.c create mode 100644 src/wraith/src/test/test_util_slow.c create mode 100644 src/wraith/src/test/test_workqueue.c create mode 100644 src/wraith/src/test/test_workqueue_cancel.sh create mode 100644 src/wraith/src/test/test_workqueue_efd.sh create mode 100644 src/wraith/src/test/test_workqueue_efd2.sh create mode 100644 src/wraith/src/test/test_workqueue_pipe.sh create mode 100644 src/wraith/src/test/test_workqueue_pipe2.sh create mode 100644 src/wraith/src/test/test_workqueue_socketpair.sh create mode 100644 src/wraith/src/test/test_zero_length_keys.sh create mode 100644 src/wraith/src/test/testing_common.c create mode 100644 src/wraith/src/test/testing_rsakeys.c create mode 100644 src/wraith/src/test/vote_descriptors.inc create mode 100644 src/wraith/src/test/zero_length_keys.sh create mode 100644 src/wraith/src/tools/Makefile.nmake create mode 100644 src/wraith/src/tools/include.am create mode 100644 src/wraith/src/tools/tor-fw-helper/README create mode 100644 src/wraith/src/tools/tor-gencert.c create mode 100644 src/wraith/src/tools/tor-resolve.c create mode 100644 src/wraith/src/tools/tor_runner.c diff --git a/src/wraith/.gitignore b/src/wraith/.gitignore new file mode 100644 index 000000000..c00fbe97e --- /dev/null +++ b/src/wraith/.gitignore @@ -0,0 +1,235 @@ +# Editor droppings +\#*\# +.#* +*~ +*.swp +*.swo +# C stuff +*.o +*.obj +# Diff droppings +*.orig +*.rej +# gcov stuff +*.gcno +*.gcov +*.gcda +# Autotools stuff +.deps +.dirstamp +*.trs +*.log +# Calltool stuff +.*.graph +# Stuff made by our makefiles +*.bak +# Python droppings +*.pyc +*.pyo +# Cscope +cscope.* +# OSX junk +*.dSYM +.DS_Store +# updateFallbackDirs.py temp files +details-*.json +uptime-*.json +*.full_url +*.last_modified + +# / +/Makefile +/Makefile.in +/aclocal.m4 +/ar-lib +/autom4te.cache +/build-stamp +/compile +/configure +/Doxyfile +/orconfig.h +/orconfig.h.in +/config.cache +/config.log +/config.status +/config.guess +/config.sub +/conftest* +/micro-revision.* +/patch-stamp +/stamp-h +/stamp-h.in +/stamp-h1 +/TAGS +/test-driver +/tor.sh +/tor.spec +/depcomp +/install-sh +/missing +/mkinstalldirs +/Tor*Bundle.dmg +/tor-*-win32.exe +/coverage_html/ +/callgraph/ + +# /contrib/ +/contrib/dist/tor.sh +/contrib/dist/torctl +/contrib/dist/tor.service +/contrib/operator-tools/tor.logrotate +/contrib/dist/suse/tor.sh + +# /debian/ +/debian/files +/debian/micro-revision.i +/debian/patched +/debian/tor +/debian/tor.postinst.debhelper +/debian/tor.postrm.debhelper +/debian/tor.prerm.debhelper +/debian/tor.substvars + +# /doc/ +/doc/Makefile +/doc/Makefile.in +/doc/doxygen +/doc/tor.1 +/doc/tor.1.in +/doc/tor.html +/doc/tor.html.in +/doc/tor.1.xml +/doc/tor-gencert.1 +/doc/tor-gencert.1.in +/doc/tor-gencert.html +/doc/tor-gencert.html.in +/doc/tor-gencert.1.xml +/doc/tor-resolve.1 +/doc/tor-resolve.1.in +/doc/tor-resolve.html +/doc/tor-resolve.html.in +/doc/tor-resolve.1.xml +/doc/torify.1 +/doc/torify.1.in +/doc/torify.html +/doc/torify.html.in +/doc/torify.1.xml + +# /doc/spec/ +/doc/spec/Makefile +/doc/spec/Makefile.in + +# /scripts +/scripts/maint/checkOptionDocs.pl +/scripts/maint/updateVersions.pl + +# /src/ +/src/Makefile +/src/Makefile.in + +# /src/trace +/src/trace/libor-trace.a + +# /src/common/ +/src/common/Makefile +/src/common/Makefile.in +/src/common/libor.a +/src/common/libor-testing.a +/src/common/libor.lib +/src/common/libor-ctime.a +/src/common/libor-ctime-testing.a +/src/common/libor-ctime.lib +/src/common/libor-crypto.a +/src/common/libor-crypto-testing.a +/src/common/libor-crypto.lib +/src/common/libor-event.a +/src/common/libor-event-testing.a +/src/common/libor-event.lib +/src/common/libcurve25519_donna.a +/src/common/libcurve25519_donna.lib + +# /src/config/ +/src/config/Makefile +/src/config/Makefile.in +/src/config/sample-server-torrc +/src/config/torrc +/src/config/torrc.sample +/src/config/torrc.minimal + +# /src/ext/ +/src/ext/ed25519/ref10/libed25519_ref10.a +/src/ext/ed25519/ref10/libed25519_ref10.lib +/src/ext/ed25519/donna/libed25519_donna.a +/src/ext/ed25519/donna/libed25519_donna.lib +/src/ext/keccak-tiny/libkeccak-tiny.a +/src/ext/keccak-tiny/libkeccak-tiny.lib + +# /src/or/ +/src/or/Makefile +/src/or/Makefile.in +/src/or/tor +/src/or/tor.exe +/src/or/tor-cov +/src/or/tor-cov.exe +/src/or/libtor.a +/src/or/libtor-testing.a +/src/or/libtor.lib + +# /src/rust +/src/rust/.cargo/config +/src/rust/.cargo/registry +/src/rust/target +/src/rust/registry + +# /src/test +/src/test/Makefile +/src/test/Makefile.in +/src/test/bench +/src/test/bench.exe +/src/test/test +/src/test/test-slow +/src/test/test-bt-cl +/src/test/test-child +/src/test/test-memwipe +/src/test/test-ntor-cl +/src/test/test-hs-ntor-cl +/src/test/test-switch-id +/src/test/test-timers +/src/test/test_workqueue +/src/test/test.exe +/src/test/test-slow.exe +/src/test/test-bt-cl.exe +/src/test/test-child.exe +/src/test/test-ntor-cl.exe +/src/test/test-hs-ntor-cl.exe +/src/test/test-memwipe.exe +/src/test/test-switch-id.exe +/src/test/test-timers.exe +/src/test/test_workqueue.exe + +# /src/test/fuzz +/src/test/fuzz/fuzz-* +/src/test/fuzz/lf-fuzz-* + +# /src/tools/ +/src/tools/libtorrunner.a +/src/tools/tor-checkkey +/src/tools/tor-resolve +/src/tools/tor-cov-resolve +/src/tools/tor-gencert +/src/tools/tor-cov-gencert +/src/tools/tor-checkkey.exe +/src/tools/tor-resolve.exe +/src/tools/tor-cov-resolve.exe +/src/tools/tor-gencert.exe +/src/tools/tor-cov-gencert.exe +/src/tools/Makefile +/src/tools/Makefile.in + +# /src/trunnel/ +/src/trunnel/libor-trunnel-testing.a +/src/trunnel/libor-trunnel.a + +# /src/win32/ +/src/win32/Makefile +/src/win32/Makefile.in diff --git a/src/wraith/Kconfig b/src/wraith/Kconfig new file mode 100644 index 000000000..402a71fd1 --- /dev/null +++ b/src/wraith/Kconfig @@ -0,0 +1,1237 @@ +# +# For a description of the syntax of this configuration file, +# see Documentation/kbuild/kconfig-language.txt. +# + +mainmenu "Linux Kernel Configuration" + +config X86 + bool + default y + help + This is Linux's home port. Linux was originally native to the Intel + 386, and runs on all the later x86 processors including the Intel + 486, 586, Pentiums, and various instruction-set-compatible chips by + AMD, Cyrix, and others. + +config MMU + bool + default y + +config SBUS + bool + +config UID16 + bool + default y + +config GENERIC_ISA_DMA + bool + default y + +config GENERIC_IOMAP + bool + default y + +source "init/Kconfig" + +menu "Processor type and features" + +choice + prompt "Subarchitecture Type" + default X86_PC + +config X86_PC + bool "PC-compatible" + help + Choose this option if your computer is a standard PC or compatible. + +config X86_ELAN + bool "AMD Elan" + help + Select this for an AMD Elan processor. + + Do not use this option for K6/Athlon/Opteron processors! + + If unsure, choose "PC-compatible" instead. + +config X86_VOYAGER + bool "Voyager (NCR)" + help + Voyager is an MCA-based 32-way capable SMP architecture proprietary + to NCR Corp. Machine classes 345x/35xx/4100/51xx are Voyager-based. + + *** WARNING *** + + If you do not specifically know you have a Voyager based machine, + say N here, otherwise the kernel you build will not be bootable. + +config X86_NUMAQ + bool "NUMAQ (IBM/Sequent)" + select DISCONTIGMEM + select NUMA + help + This option is used for getting Linux to run on a (IBM/Sequent) NUMA + multiquad box. This changes the way that processors are bootstrapped, + and uses Clustered Logical APIC addressing mode instead of Flat Logical. + You will need a new lynxer.elf file to flash your firmware with - send + email to . + +config X86_SUMMIT + bool "Summit/EXA (IBM x440)" + depends on SMP + help + This option is needed for IBM systems that use the Summit/EXA chipset. + In particular, it is needed for the x440. + + If you don't have one of these computers, you should say N here. + +config X86_BIGSMP + bool "Support for other sub-arch SMP systems with more than 8 CPUs" + depends on SMP + help + This option is needed for the systems that have more than 8 CPUs + and if the system is not of any sub-arch type above. + + If you don't have such a system, you should say N here. + +config X86_VISWS + bool "SGI 320/540 (Visual Workstation)" + help + The SGI Visual Workstation series is an IA32-based workstation + based on SGI systems chips with some legacy PC hardware attached. + + Say Y here to create a kernel to run on the SGI 320 or 540. + + A kernel compiled for the Visual Workstation will not run on PCs + and vice versa. See for details. + +config X86_GENERICARCH + bool "Generic architecture (Summit, bigsmp, ES7000, default)" + depends on SMP + help + This option compiles in the Summit, bigsmp, ES7000, default subarchitectures. + It is intended for a generic binary kernel. + +config X86_ES7000 + bool "Support for Unisys ES7000 IA32 series" + depends on SMP + help + Support for Unisys ES7000 systems. Say 'Y' here if this kernel is + supposed to run on an IA32-based Unisys ES7000 system. + Only choose this option if you have such a system, otherwise you + should say N here. + +endchoice + +config ACPI_SRAT + bool + default y + depends on NUMA && (X86_SUMMIT || X86_GENERICARCH) + +config X86_SUMMIT_NUMA + bool + default y + depends on NUMA && (X86_SUMMIT || X86_GENERICARCH) + +config X86_CYCLONE_TIMER + bool + default y + depends on X86_SUMMIT || X86_GENERICARCH + +config ES7000_CLUSTERED_APIC + bool + default y + depends on SMP && X86_ES7000 && MPENTIUMIII + +if !X86_ELAN + +choice + prompt "Processor family" + default M686 + +config M386 + bool "386" + ---help--- + This is the processor type of your CPU. This information is used for + optimizing purposes. In order to compile a kernel that can run on + all x86 CPU types (albeit not optimally fast), you can specify + "386" here. + + The kernel will not necessarily run on earlier architectures than + the one you have chosen, e.g. a Pentium optimized kernel will run on + a PPro, but not necessarily on a i486. + + Here are the settings recommended for greatest speed: + - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI + 486DLC/DLC2, UMC 486SX-S and NexGen Nx586. Only "386" kernels + will run on a 386 class machine. + - "486" for the AMD/Cyrix/IBM/Intel 486DX/DX2/DX4 or + SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or U5S. + - "586" for generic Pentium CPUs lacking the TSC + (time stamp counter) register. + - "Pentium-Classic" for the Intel Pentium. + - "Pentium-MMX" for the Intel Pentium MMX. + - "Pentium-Pro" for the Intel Pentium Pro. + - "Pentium-II" for the Intel Pentium II or pre-Coppermine Celeron. + - "Pentium-III" for the Intel Pentium III or Coppermine Celeron. + - "Pentium-4" for the Intel Pentium 4 or P4-based Celeron. + - "K6" for the AMD K6, K6-II and K6-III (aka K6-3D). + - "Athlon" for the AMD K7 family (Athlon/Duron/Thunderbird). + - "Crusoe" for the Transmeta Crusoe series. + - "Efficeon" for the Transmeta Efficeon series. + - "Winchip-C6" for original IDT Winchip. + - "Winchip-2" for IDT Winchip 2. + - "Winchip-2A" for IDT Winchips with 3dNow! capabilities. + - "CyrixIII/VIA C3" for VIA Cyrix III or VIA C3. + - "VIA C3-2 for VIA C3-2 "Nehemiah" (model 9 and above). + + If you don't know what to do, choose "386". + +config M486 + bool "486" + help + Select this for a 486 series processor, either Intel or one of the + compatible processors from AMD, Cyrix, IBM, or Intel. Includes DX, + DX2, and DX4 variants; also SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or + U5S. + +config M586 + bool "586/K5/5x86/6x86/6x86MX" + help + Select this for an 586 or 686 series processor such as the AMD K5, + the Cyrix 5x86, 6x86 and 6x86MX. This choice does not + assume the RDTSC (Read Time Stamp Counter) instruction. + +config M586TSC + bool "Pentium-Classic" + help + Select this for a Pentium Classic processor with the RDTSC (Read + Time Stamp Counter) instruction for benchmarking. + +config M586MMX + bool "Pentium-MMX" + help + Select this for a Pentium with the MMX graphics/multimedia + extended instructions. + +config M686 + bool "Pentium-Pro" + help + Select this for Intel Pentium Pro chips. This enables the use of + Pentium Pro extended instructions, and disables the init-time guard + against the f00f bug found in earlier Pentiums. + +config MPENTIUMII + bool "Pentium-II/Celeron(pre-Coppermine)" + help + Select this for Intel chips based on the Pentium-II and + pre-Coppermine Celeron core. This option enables an unaligned + copy optimization, compiles the kernel with optimization flags + tailored for the chip, and applies any applicable Pentium Pro + optimizations. + +config MPENTIUMIII + bool "Pentium-III/Celeron(Coppermine)/Pentium-III Xeon" + help + Select this for Intel chips based on the Pentium-III and + Celeron-Coppermine core. This option enables use of some + extended prefetch instructions in addition to the Pentium II + extensions. + +config MPENTIUMM + bool "Pentium M" + help + Select this for Intel Pentium M (not Pentium-4 M) + notebook chips. + +config MPENTIUM4 + bool "Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon" + help + Select this for Intel Pentium 4 chips. This includes the + Pentium 4, P4-based Celeron and Xeon, and Pentium-4 M + (not Pentium M) chips. This option enables compile flags + optimized for the chip, uses the correct cache shift, and + applies any applicable Pentium III optimizations. + +config MK6 + bool "K6/K6-II/K6-III" + help + Select this for an AMD K6-family processor. Enables use of + some extended instructions, and passes appropriate optimization + flags to GCC. + +config MK7 + bool "Athlon/Duron/K7" + help + Select this for an AMD Athlon K7-family processor. Enables use of + some extended instructions, and passes appropriate optimization + flags to GCC. + +config MK8 + bool "Opteron/Athlon64/Hammer/K8" + help + Select this for an AMD Opteron or Athlon64 Hammer-family processor. Enables + use of some extended instructions, and passes appropriate optimization + flags to GCC. + +config MCRUSOE + bool "Crusoe" + help + Select this for a Transmeta Crusoe processor. Treats the processor + like a 586 with TSC, and sets some GCC optimization flags (like a + Pentium Pro with no alignment requirements). + +config MEFFICEON + bool "Efficeon" + help + Select this for a Transmeta Efficeon processor. + +config MWINCHIPC6 + bool "Winchip-C6" + help + Select this for an IDT Winchip C6 chip. Linux and GCC + treat this chip as a 586TSC with some extended instructions + and alignment requirements. + +config MWINCHIP2 + bool "Winchip-2" + help + Select this for an IDT Winchip-2. Linux and GCC + treat this chip as a 586TSC with some extended instructions + and alignment requirements. + +config MWINCHIP3D + bool "Winchip-2A/Winchip-3" + help + Select this for an IDT Winchip-2A or 3. Linux and GCC + treat this chip as a 586TSC with some extended instructions + and alignment reqirements. Also enable out of order memory + stores for this CPU, which can increase performance of some + operations. + +config MCYRIXIII + bool "CyrixIII/VIA-C3" + help + Select this for a Cyrix III or C3 chip. Presently Linux and GCC + treat this chip as a generic 586. Whilst the CPU is 686 class, + it lacks the cmov extension which gcc assumes is present when + generating 686 code. + Note that Nehemiah (Model 9) and above will not boot with this + kernel due to them lacking the 3DNow! instructions used in earlier + incarnations of the CPU. + +config MVIAC3_2 + bool "VIA C3-2 (Nehemiah)" + help + Select this for a VIA C3 "Nehemiah". Selecting this enables usage + of SSE and tells gcc to treat the CPU as a 686. + Note, this kernel will not boot on older (pre model 9) C3s. + +endchoice + +config X86_GENERIC + bool "Generic x86 support" + help + Instead of just including optimizations for the selected + x86 variant (e.g. PII, Crusoe or Athlon), include some more + generic optimizations as well. This will make the kernel + perform better on x86 CPUs other than that selected. + + This is really intended for distributors who need more + generic optimizations. + +endif + +# +# Define implied options from the CPU selection here +# +config X86_CMPXCHG + bool + depends on !M386 + default y + +config X86_XADD + bool + depends on !M386 + default y + +config X86_L1_CACHE_SHIFT + int + default "7" if MPENTIUM4 || X86_GENERIC + default "4" if X86_ELAN || M486 || M386 + default "5" if MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 + default "6" if MK7 || MK8 || MPENTIUMM + +config RWSEM_GENERIC_SPINLOCK + bool + depends on M386 + default y + +config RWSEM_XCHGADD_ALGORITHM + bool + depends on !M386 + default y + +config X86_PPRO_FENCE + bool + depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 + default y + +config X86_F00F_BUG + bool + depends on M586MMX || M586TSC || M586 || M486 || M386 + default y + +config X86_WP_WORKS_OK + bool + depends on !M386 + default y + +config X86_INVLPG + bool + depends on !M386 + default y + +config X86_BSWAP + bool + depends on !M386 + default y + +config X86_POPAD_OK + bool + depends on !M386 + default y + +config X86_ALIGNMENT_16 + bool + depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK6 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 + default y + +config X86_GOOD_APIC + bool + depends on MK7 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || MK8 || MEFFICEON + default y + +config X86_INTEL_USERCOPY + bool + depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON + default y + +config X86_USE_PPRO_CHECKSUM + bool + depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MEFFICEON + default y + +config X86_USE_3DNOW + bool + depends on MCYRIXIII || MK7 + default y + +config X86_OOSTORE + bool + depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6) && MTRR + default y + +config HPET_TIMER + bool "HPET Timer Support" + help + This enables the use of the HPET for the kernel's internal timer. + HPET is the next generation timer replacing legacy 8254s. + You can safely choose Y here. However, HPET will only be + activated if the platform and the BIOS support this feature. + Otherwise the 8254 will be used for timing services. + + Choose N to continue using the legacy 8254 timer. + +config HPET_EMULATE_RTC + bool "Provide RTC interrupt" + depends on HPET_TIMER && RTC=y + +config SMP + bool "Symmetric multi-processing support" + ---help--- + This enables support for systems with more than one CPU. If you have + a system with only one CPU, like most personal computers, say N. If + you have a system with more than one CPU, say Y. + + If you say N here, the kernel will run on single and multiprocessor + machines, but will use only one CPU of a multiprocessor machine. If + you say Y here, the kernel will run on many, but not all, + singleprocessor machines. On a singleprocessor machine, the kernel + will run faster if you say N here. + + Note that if you say Y here and choose architecture "586" or + "Pentium" under "Processor family", the kernel will not work on 486 + architectures. Similarly, multiprocessor kernels for the "PPro" + architecture may not work on all Pentium based boards. + + People using multiprocessor machines who say Y here should also say + Y to "Enhanced Real Time Clock Support", below. The "Advanced Power + Management" code will be disabled if you say Y here. + + See also the , + , + and the SMP-HOWTO available at + . + + If you don't know what to do here, say N. + +config NR_CPUS + int "Maximum number of CPUs (2-255)" + range 2 255 + depends on SMP + default "32" if X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000 + default "8" + help + This allows you to specify the maximum number of CPUs which this + kernel will support. The maximum supported value is 255 and the + minimum value which makes sense is 2. + + This is purely to save memory - each supported CPU adds + approximately eight kilobytes to the kernel image. + +config SCHED_SMT + bool "SMT (Hyperthreading) scheduler support" + depends on SMP + default off + help + SMT scheduler support improves the CPU scheduler's decision making + when dealing with Intel Pentium 4 chips with HyperThreading at a + cost of slightly increased overhead in some places. If unsure say + N here. + +config PREEMPT + bool "Preemptible Kernel" + help + This option reduces the latency of the kernel when reacting to + real-time or interactive events by allowing a low priority process to + be preempted even if it is in kernel mode executing a system call. + This allows applications to run more reliably even when the system is + under load. + + Say Y here if you are building a kernel for a desktop, embedded + or real-time system. Say N if you are unsure. + +config X86_UP_APIC + bool "Local APIC support on uniprocessors" if !SMP + depends on !(X86_VISWS || X86_VOYAGER) + ---help--- + A local APIC (Advanced Programmable Interrupt Controller) is an + integrated interrupt controller in the CPU. If you have a single-CPU + system which has a processor with a local APIC, you can say Y here to + enable and use it. If you say Y here even though your machine doesn't + have a local APIC, then the kernel will still run with no slowdown at + all. The local APIC supports CPU-generated self-interrupts (timer, + performance counters), and the NMI watchdog which detects hard + lockups. + + If you have a system with several CPUs, you do not need to say Y + here: the local APIC will be used automatically. + +config X86_UP_IOAPIC + bool "IO-APIC support on uniprocessors" + depends on !SMP && X86_UP_APIC + help + An IO-APIC (I/O Advanced Programmable Interrupt Controller) is an + SMP-capable replacement for PC-style interrupt controllers. Most + SMP systems and a small number of uniprocessor systems have one. + If you have a single-CPU system with an IO-APIC, you can say Y here + to use it. If you say Y here even though your machine doesn't have + an IO-APIC, then the kernel will still run with no slowdown at all. + + If you have a system with several CPUs, you do not need to say Y + here: the IO-APIC will be used automatically. + +config X86_LOCAL_APIC + bool + depends on !SMP && X86_UP_APIC + default y + +config X86_IO_APIC + bool + depends on !SMP && X86_UP_IOAPIC + default y + +config X86_TSC + bool + depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2) && !X86_NUMAQ + default y + +config X86_MCE + bool "Machine Check Exception" + depends on !X86_VOYAGER + ---help--- + Machine Check Exception support allows the processor to notify the + kernel if it detects a problem (e.g. overheating, component failure). + The action the kernel takes depends on the severity of the problem, + ranging from a warning message on the console, to halting the machine. + Your processor must be a Pentium or newer to support this - check the + flags in /proc/cpuinfo for mce. Note that some older Pentium systems + have a design flaw which leads to false MCE events - hence MCE is + disabled on all P5 processors, unless explicitly enabled with "mce" + as a boot argument. Similarly, if MCE is built in and creates a + problem on some new non-standard machine, you can boot with "nomce" + to disable it. MCE support simply ignores non-MCE processors like + the 386 and 486, so nearly everyone can say Y here. + +config X86_MCE_NONFATAL + tristate "Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4" + depends on X86_MCE + help + Enabling this feature starts a timer that triggers every 5 seconds which + will look at the machine check registers to see if anything happened. + Non-fatal problems automatically get corrected (but still logged). + Disable this if you don't want to see these messages. + Seeing the messages this option prints out may be indicative of dying hardware, + or out-of-spec (ie, overclocked) hardware. + This option only does something on certain CPUs. + (AMD Athlon/Duron and Intel Pentium 4) + +config X86_MCE_P4THERMAL + bool "check for P4 thermal throttling interrupt." + depends on X86_MCE && (X86_UP_APIC || SMP) && !X86_VISWS + help + Enabling this feature will cause a message to be printed when the P4 + enters thermal throttling. + +config TOSHIBA + tristate "Toshiba Laptop support" + ---help--- + This adds a driver to safely access the System Management Mode of + the CPU on Toshiba portables with a genuine Toshiba BIOS. It does + not work on models with a Phoenix BIOS. The System Management Mode + is used to set the BIOS and power saving options on Toshiba portables. + + For information on utilities to make use of this driver see the + Toshiba Linux utilities web site at: + . + + Say Y if you intend to run this kernel on a Toshiba portable. + Say N otherwise. + +config I8K + tristate "Dell laptop support" + ---help--- + This adds a driver to safely access the System Management Mode + of the CPU on the Dell Inspiron 8000. The System Management Mode + is used to read cpu temperature and cooling fan status and to + control the fans on the I8K portables. + + This driver has been tested only on the Inspiron 8000 but it may + also work with other Dell laptops. You can force loading on other + models by passing the parameter `force=1' to the module. Use at + your own risk. + + For information on utilities to make use of this driver see the + I8K Linux utilities web site at: + + + Say Y if you intend to run this kernel on a Dell Inspiron 8000. + Say N otherwise. + +config MICROCODE + tristate "/dev/cpu/microcode - Intel IA32 CPU microcode support" + ---help--- + If you say Y here and also to "/dev file system support" in the + 'File systems' section, you will be able to update the microcode on + Intel processors in the IA32 family, e.g. Pentium Pro, Pentium II, + Pentium III, Pentium 4, Xeon etc. You will obviously need the + actual microcode binary data itself which is not shipped with the + Linux kernel. + + For latest news and information on obtaining all the required + ingredients for this driver, check: + . + + To compile this driver as a module, choose M here: the + module will be called microcode. + +config X86_MSR + tristate "/dev/cpu/*/msr - Model-specific register support" + help + This device gives privileged processes access to the x86 + Model-Specific Registers (MSRs). It is a character device with + major 202 and minors 0 to 31 for /dev/cpu/0/msr to /dev/cpu/31/msr. + MSR accesses are directed to a specific CPU on multi-processor + systems. + +config X86_CPUID + tristate "/dev/cpu/*/cpuid - CPU information support" + help + This device gives processes access to the x86 CPUID instruction to + be executed on a specific processor. It is a character device + with major 203 and minors 0 to 31 for /dev/cpu/0/cpuid to + /dev/cpu/31/cpuid. + +source "drivers/firmware/Kconfig" + +choice + prompt "High Memory Support" + default NOHIGHMEM + +config NOHIGHMEM + bool "off" + ---help--- + Linux can use up to 64 Gigabytes of physical memory on x86 systems. + However, the address space of 32-bit x86 processors is only 4 + Gigabytes large. That means that, if you have a large amount of + physical memory, not all of it can be "permanently mapped" by the + kernel. The physical memory that's not permanently mapped is called + "high memory". + + If you are compiling a kernel which will never run on a machine with + more than 1 Gigabyte total physical RAM, answer "off" here (default + choice and suitable for most users). This will result in a "3GB/1GB" + split: 3GB are mapped so that each process sees a 3GB virtual memory + space and the remaining part of the 4GB virtual memory space is used + by the kernel to permanently map as much physical memory as + possible. + + If the machine has between 1 and 4 Gigabytes physical RAM, then + answer "4GB" here. + + If more than 4 Gigabytes is used then answer "64GB" here. This + selection turns Intel PAE (Physical Address Extension) mode on. + PAE implements 3-level paging on IA32 processors. PAE is fully + supported by Linux, PAE mode is implemented on all recent Intel + processors (Pentium Pro and better). NOTE: If you say "64GB" here, + then the kernel will not boot on CPUs that don't support PAE! + + The actual amount of total physical memory will either be + auto detected or can be forced by using a kernel command line option + such as "mem=256M". (Try "man bootparam" or see the documentation of + your boot loader (lilo or loadlin) about how to pass options to the + kernel at boot time.) + + If unsure, say "off". + +config HIGHMEM4G + bool "4GB" + help + Select this if you have a 32-bit processor and between 1 and 4 + gigabytes of physical RAM. + +config HIGHMEM64G + bool "64GB" + help + Select this if you have a 32-bit processor and more than 4 + gigabytes of physical RAM. + +endchoice + +config HIGHMEM + bool + depends on HIGHMEM64G || HIGHMEM4G + default y + +config X86_PAE + bool + depends on HIGHMEM64G + default y + +# Common NUMA Features +config NUMA + bool "Numa Memory Allocation and Scheduler Support" + depends on SMP && HIGHMEM64G && (X86_NUMAQ || X86_GENERICARCH || (X86_SUMMIT && ACPI)) + default n if X86_PC + default y if (X86_NUMAQ || X86_SUMMIT) + +# Need comments to help the hapless user trying to turn on NUMA support +comment "NUMA (NUMA-Q) requires SMP, 64GB highmem support" + depends on X86_NUMAQ && (!HIGHMEM64G || !SMP) + +comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI" + depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI) + +config DISCONTIGMEM + bool + depends on NUMA + default y + +config HAVE_ARCH_BOOTMEM_NODE + bool + depends on NUMA + default y + +config HIGHPTE + bool "Allocate 3rd-level pagetables from highmem" + depends on HIGHMEM4G || HIGHMEM64G + help + The VM uses one page table entry for each page of physical memory. + For systems with a lot of RAM, this can be wasteful of precious + low memory. Setting this option will put user-space page table + entries in high memory. + +config MATH_EMULATION + bool "Math emulation" + ---help--- + Linux can emulate a math coprocessor (used for floating point + operations) if you don't have one. 486DX and Pentium processors have + a math coprocessor built in, 486SX and 386 do not, unless you added + a 487DX or 387, respectively. (The messages during boot time can + give you some hints here ["man dmesg"].) Everyone needs either a + coprocessor or this emulation. + + If you don't have a math coprocessor, you need to say Y here; if you + say Y here even though you have a coprocessor, the coprocessor will + be used nevertheless. (This behavior can be changed with the kernel + command line option "no387", which comes handy if your coprocessor + is broken. Try "man bootparam" or see the documentation of your boot + loader (lilo or loadlin) about how to pass options to the kernel at + boot time.) This means that it is a good idea to say Y here if you + intend to use this kernel on different machines. + + More information about the internals of the Linux math coprocessor + emulation can be found in . + + If you are not sure, say Y; apart from resulting in a 66 KB bigger + kernel, it won't hurt. + +config MTRR + bool "MTRR (Memory Type Range Register) support" + ---help--- + On Intel P6 family processors (Pentium Pro, Pentium II and later) + the Memory Type Range Registers (MTRRs) may be used to control + processor access to memory ranges. This is most useful if you have + a video (VGA) card on a PCI or AGP bus. Enabling write-combining + allows bus write transfers to be combined into a larger transfer + before bursting over the PCI/AGP bus. This can increase performance + of image write operations 2.5 times or more. Saying Y here creates a + /proc/mtrr file which may be used to manipulate your processor's + MTRRs. Typically the X server should use this. + + This code has a reasonably generic interface so that similar + control registers on other processors can be easily supported + as well: + + The Cyrix 6x86, 6x86MX and M II processors have Address Range + Registers (ARRs) which provide a similar functionality to MTRRs. For + these, the ARRs are used to emulate the MTRRs. + The AMD K6-2 (stepping 8 and above) and K6-3 processors have two + MTRRs. The Centaur C6 (WinChip) has 8 MCRs, allowing + write-combining. All of these processors are supported by this code + and it makes sense to say Y here if you have one of them. + + Saying Y here also fixes a problem with buggy SMP BIOSes which only + set the MTRRs for the boot CPU and not for the secondary CPUs. This + can lead to all sorts of problems, so it's good to say Y here. + + You can safely say Y even if your machine doesn't have MTRRs, you'll + just add about 9 KB to your kernel. + + See for more information. + +config EFI + bool "Boot from EFI support (EXPERIMENTAL)" + depends on ACPI + default n + ---help--- + + This enables the the kernel to boot on EFI platforms using + system configuration information passed to it from the firmware. + This also enables the kernel to use any EFI runtime services that are + available (such as the EFI variable services). + + This option is only useful on systems that have EFI firmware + and will result in a kernel image that is ~8k larger. In addition, + you must use the latest ELILO loader available at + in order to take advantage of + kernel initialization using EFI information (neither GRUB nor LILO know + anything about EFI). However, even with this option, the resultant + kernel should continue to boot on existing non-EFI platforms. + +config IRQBALANCE + bool "Enable kernel irq balancing" + depends on SMP && X86_IO_APIC + default y + help + The default yes will allow the kernel to do irq load balancing. + Saying no will keep the kernel from doing irq load balancing. + +config HAVE_DEC_LOCK + bool + depends on (SMP || PREEMPT) && X86_CMPXCHG + default y + +# turning this on wastes a bunch of space. +# Summit needs it only when NUMA is on +config BOOT_IOREMAP + bool + depends on (((X86_SUMMIT || X86_GENERICARCH) && NUMA) || (X86 && EFI)) + default y + +config REGPARM + bool "Use register arguments (EXPERIMENTAL)" + depends on EXPERIMENTAL + default n + help + Compile the kernel with -mregparm=3. This uses an different ABI + and passes the first three arguments of a function call in registers. + This will probably break binary only modules. + + This feature is only enabled for gcc-3.0 and later - earlier compilers + generate incorrect output with certain kernel constructs when + -mregparm=3 is used. + +endmenu + + +menu "Power management options (ACPI, APM)" + depends on !X86_VOYAGER + +source kernel/power/Kconfig + +source "drivers/acpi/Kconfig" + +menu "APM (Advanced Power Management) BIOS Support" +depends on PM && !X86_VISWS + +config APM + tristate "APM (Advanced Power Management) BIOS support" + depends on PM + ---help--- + APM is a BIOS specification for saving power using several different + techniques. This is mostly useful for battery powered laptops with + APM compliant BIOSes. If you say Y here, the system time will be + reset after a RESUME operation, the /proc/apm device will provide + battery status information, and user-space programs will receive + notification of APM "events" (e.g. battery status change). + + If you select "Y" here, you can disable actual use of the APM + BIOS by passing the "apm=off" option to the kernel at boot time. + + Note that the APM support is almost completely disabled for + machines with more than one CPU. + + In order to use APM, you will need supporting software. For location + and more information, read and the + Battery Powered Linux mini-HOWTO, available from + . + + This driver does not spin down disk drives (see the hdparm(8) + manpage ("man 8 hdparm") for that), and it doesn't turn off + VESA-compliant "green" monitors. + + This driver does not support the TI 4000M TravelMate and the ACER + 486/DX4/75 because they don't have compliant BIOSes. Many "green" + desktop machines also don't have compliant BIOSes, and this driver + may cause those machines to panic during the boot phase. + + Generally, if you don't have a battery in your machine, there isn't + much point in using this driver and you should say N. If you get + random kernel OOPSes or reboots that don't seem to be related to + anything, try disabling/enabling this option (or disabling/enabling + APM in your BIOS). + + Some other things you should try when experiencing seemingly random, + "weird" problems: + + 1) make sure that you have enough swap space and that it is + enabled. + 2) pass the "no-hlt" option to the kernel + 3) switch on floating point emulation in the kernel and pass + the "no387" option to the kernel + 4) pass the "floppy=nodma" option to the kernel + 5) pass the "mem=4M" option to the kernel (thereby disabling + all but the first 4 MB of RAM) + 6) make sure that the CPU is not over clocked. + 7) read the sig11 FAQ at + 8) disable the cache from your BIOS settings + 9) install a fan for the video card or exchange video RAM + 10) install a better fan for the CPU + 11) exchange RAM chips + 12) exchange the motherboard. + + To compile this driver as a module, choose M here: the + module will be called apm. + +config APM_IGNORE_USER_SUSPEND + bool "Ignore USER SUSPEND" + depends on APM + help + This option will ignore USER SUSPEND requests. On machines with a + compliant APM BIOS, you want to say N. However, on the NEC Versa M + series notebooks, it is necessary to say Y because of a BIOS bug. + +config APM_DO_ENABLE + bool "Enable PM at boot time" + depends on APM + ---help--- + Enable APM features at boot time. From page 36 of the APM BIOS + specification: "When disabled, the APM BIOS does not automatically + power manage devices, enter the Standby State, enter the Suspend + State, or take power saving steps in response to CPU Idle calls." + This driver will make CPU Idle calls when Linux is idle (unless this + feature is turned off -- see "Do CPU IDLE calls", below). This + should always save battery power, but more complicated APM features + will be dependent on your BIOS implementation. You may need to turn + this option off if your computer hangs at boot time when using APM + support, or if it beeps continuously instead of suspending. Turn + this off if you have a NEC UltraLite Versa 33/C or a Toshiba + T400CDT. This is off by default since most machines do fine without + this feature. + +config APM_CPU_IDLE + bool "Make CPU Idle calls when idle" + depends on APM + help + Enable calls to APM CPU Idle/CPU Busy inside the kernel's idle loop. + On some machines, this can activate improved power savings, such as + a slowed CPU clock rate, when the machine is idle. These idle calls + are made after the idle loop has run for some length of time (e.g., + 333 mS). On some machines, this will cause a hang at boot time or + whenever the CPU becomes idle. (On machines with more than one CPU, + this option does nothing.) + +config APM_DISPLAY_BLANK + bool "Enable console blanking using APM" + depends on APM + help + Enable console blanking using the APM. Some laptops can use this to + turn off the LCD backlight when the screen blanker of the Linux + virtual console blanks the screen. Note that this is only used by + the virtual console screen blanker, and won't turn off the backlight + when using the X Window system. This also doesn't have anything to + do with your VESA-compliant power-saving monitor. Further, this + option doesn't work for all laptops -- it might not turn off your + backlight at all, or it might print a lot of errors to the console, + especially if you are using gpm. + +config APM_RTC_IS_GMT + bool "RTC stores time in GMT" + depends on APM + help + Say Y here if your RTC (Real Time Clock a.k.a. hardware clock) + stores the time in GMT (Greenwich Mean Time). Say N if your RTC + stores localtime. + + It is in fact recommended to store GMT in your RTC, because then you + don't have to worry about daylight savings time changes. The only + reason not to use GMT in your RTC is if you also run a broken OS + that doesn't understand GMT. + +config APM_ALLOW_INTS + bool "Allow interrupts during APM BIOS calls" + depends on APM + help + Normally we disable external interrupts while we are making calls to + the APM BIOS as a measure to lessen the effects of a badly behaving + BIOS implementation. The BIOS should reenable interrupts if it + needs to. Unfortunately, some BIOSes do not -- especially those in + many of the newer IBM Thinkpads. If you experience hangs when you + suspend, try setting this to Y. Otherwise, say N. + +config APM_REAL_MODE_POWER_OFF + bool "Use real mode APM BIOS call to power off" + depends on APM + help + Use real mode APM BIOS calls to switch off the computer. This is + a work-around for a number of buggy BIOSes. Switch this option on if + your computer crashes instead of powering off properly. + +endmenu + +source "arch/i386/kernel/cpu/cpufreq/Kconfig" + +endmenu + +menu "Bus options (PCI, PCMCIA, EISA, MCA, ISA)" + +config X86_VISWS_APIC + bool + depends on X86_VISWS + default y + +config X86_LOCAL_APIC + bool + depends on (X86_VISWS || SMP) && !X86_VOYAGER + default y + +config X86_IO_APIC + bool + depends on SMP && !(X86_VISWS || X86_VOYAGER) + default y + +config PCI + bool "PCI support" if !X86_VISWS + depends on !X86_VOYAGER + default y if X86_VISWS + help + Find out whether you have a PCI motherboard. PCI is the name of a + bus system, i.e. the way the CPU talks to the other stuff inside + your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or + VESA. If you have PCI, say Y, otherwise N. + + The PCI-HOWTO, available from + , contains valuable + information about which PCI hardware does work under Linux and which + doesn't. + +choice + prompt "PCI access mode" + depends on PCI && !X86_VISWS + default PCI_GOANY + ---help--- + On PCI systems, the BIOS can be used to detect the PCI devices and + determine their configuration. However, some old PCI motherboards + have BIOS bugs and may crash if this is done. Also, some embedded + PCI-based systems don't have any BIOS at all. Linux can also try to + detect the PCI hardware directly without using the BIOS. + + With this option, you can specify how Linux should detect the + PCI devices. If you choose "BIOS", the BIOS will be used, + if you choose "Direct", the BIOS won't be used, and if you + choose "MMConfig", then PCI Express MMCONFIG will be used. + If you choose "Any", the kernel will try MMCONFIG, then the + direct access method and falls back to the BIOS if that doesn't + work. If unsure, go with the default, which is "Any". + +config PCI_GOBIOS + bool "BIOS" + +config PCI_GOMMCONFIG + bool "MMConfig" + +config PCI_GODIRECT + bool "Direct" + +config PCI_GOANY + bool "Any" + +endchoice + +config PCI_BIOS + bool + depends on !X86_VISWS && PCI && (PCI_GOBIOS || PCI_GOANY) + default y + +config PCI_DIRECT + bool + depends on PCI && ((PCI_GODIRECT || PCI_GOANY) || X86_VISWS) + default y + +config PCI_MMCONFIG + bool + depends on PCI && (PCI_GOMMCONFIG || (PCI_GOANY && ACPI)) + select ACPI_BOOT + default y + +source "drivers/pci/Kconfig" + +config ISA + bool "ISA support" + depends on !(X86_VOYAGER || X86_VISWS) + help + Find out whether you have ISA slots on your motherboard. ISA is the + name of a bus system, i.e. the way the CPU talks to the other stuff + inside your box. Other bus systems are PCI, EISA, MicroChannel + (MCA) or VESA. ISA is an older system, now being displaced by PCI; + newer boards don't support it. If you have ISA, say Y, otherwise N. + +config EISA + bool "EISA support" + depends on ISA + ---help--- + The Extended Industry Standard Architecture (EISA) bus was + developed as an open alternative to the IBM MicroChannel bus. + + The EISA bus provided some of the features of the IBM MicroChannel + bus while maintaining backward compatibility with cards made for + the older ISA bus. The EISA bus saw limited use between 1988 and + 1995 when it was made obsolete by the PCI bus. + + Say Y here if you are building a kernel for an EISA-based machine. + + Otherwise, say N. + +source "drivers/eisa/Kconfig" + +config MCA + bool "MCA support" + depends on !(X86_VISWS || X86_VOYAGER) + help + MicroChannel Architecture is found in some IBM PS/2 machines and + laptops. It is a bus system similar to PCI or ISA. See + (and especially the web page given + there) before attempting to build an MCA bus kernel. + +config MCA + depends on X86_VOYAGER + default y if X86_VOYAGER + +source "drivers/mca/Kconfig" + +config SCx200 + tristate "NatSemi SCx200 support" + depends on !X86_VOYAGER + help + This provides basic support for the National Semiconductor SCx200 + processor. Right now this is just a driver for the GPIO pins. + + If you don't know what to do here, say N. + + This support is also available as a module. If compiled as a + module, it will be called scx200. + +source "drivers/pcmcia/Kconfig" + +source "drivers/pci/hotplug/Kconfig" + +endmenu + +menu "Executable file formats" + +source "fs/Kconfig.binfmt" + +endmenu + +source "drivers/Kconfig" + +source "fs/Kconfig" + +source "arch/i386/oprofile/Kconfig" + +source "arch/i386/Kconfig.debug" + +source "security/Kconfig" + +source "crypto/Kconfig" + +source "lib/Kconfig" + +# +# Use the generic interrupt handling code in kernel/irq/: +# +config GENERIC_HARDIRQS + bool + default y + +config GENERIC_IRQ_PROBE + bool + default y + +config X86_SMP + bool + depends on SMP && !X86_VOYAGER + default y + +config X86_HT + bool + depends on SMP && !(X86_VISWS || X86_VOYAGER) + default y + +config X86_BIOS_REBOOT + bool + depends on !(X86_VISWS || X86_VOYAGER) + default y + +config X86_TRAMPOLINE + bool + depends on X86_SMP || (X86_VOYAGER && SMP) + default y + +config PC + bool + depends on X86 && !EMBEDDED + default y diff --git a/src/wraith/changes/.dummy b/src/wraith/changes/.dummy new file mode 100644 index 000000000..dd9738feb --- /dev/null +++ b/src/wraith/changes/.dummy @@ -0,0 +1,37 @@ +This file is here to keep git from removing the changes directory when +all the changes files have been merged. + + + + + + + + + + + + + + + + + + + + + + + + +"I'm Nobody! Who are you? + Are you--Nobody--too? + Then there's a pair of us! + Don’t tell! they'd advertise--you know! + + How dreary--to be--Somebody! + How public--like a Frog-- + To tell one's name--the livelong June-- + To an admiring Bog!" + -- Emily Dickinson + diff --git a/src/wraith/changes/bug12062 b/src/wraith/changes/bug12062 new file mode 100644 index 000000000..8972929d8 --- /dev/null +++ b/src/wraith/changes/bug12062 @@ -0,0 +1,16 @@ + o Minor bugfixes (hibernation, bandwidth accounting, shutdown): + + - When hibernating, do not attempt to launch DNS checks. Fixes a + case of bug 12062; bugfix on 0.1.2.2-alpha. + + - Resolve several bugs related to descriptor fetching on bridge + clients with bandwidth accounting enabled. (This combination is + not recommended!) Fixes a case of bug 12062; bugfix on + 0.2.0.3-alpha. + + - When hibernating, do not try to upload or download + descriptors. Fixes a case of bug 12062; bugfix on 0.0.9pre5. + + - Do not attempt to launch self-reachability tests when entering + hibernation. Fixes a base of bug 12062; bugfix on 0.0.9pre5. + diff --git a/src/wraith/changes/bug22605 b/src/wraith/changes/bug22605 new file mode 100644 index 000000000..fdfe20202 --- /dev/null +++ b/src/wraith/changes/bug22605 @@ -0,0 +1,5 @@ + o Minor bugfixes (linux seccomp2 sandbox): + - When running with the sandbox enabled, reload configuration files + correctly even when %include was used. Previously we + would crash. Fixes bug 22605; bugfix on 0.3.1. + Patch from Daniel Pinto. diff --git a/src/wraith/changes/bug22907 b/src/wraith/changes/bug22907 new file mode 100644 index 000000000..ff6ab8375 --- /dev/null +++ b/src/wraith/changes/bug22907 @@ -0,0 +1,3 @@ + o Documentation: + - Add documentation on how to build tor with Rust dependencies without + requiring being online. Closes ticket 22907; bugfix on tor-0.3.0.3-alpha. diff --git a/src/wraith/changes/bug23100 b/src/wraith/changes/bug23100 new file mode 100644 index 000000000..22e2485d6 --- /dev/null +++ b/src/wraith/changes/bug23100 @@ -0,0 +1,7 @@ + o Minor bugfixes (Performance): + - Use hidden service circuits (and other circuits longer than 3 hops) + to calculate a circuit build timeout. Previously, Tor only calculated + its build timeout based on circuits that planned to be exactly 3 hops + long. With this change, we include measurements from all circuits at + the point where they complete their third hop. Fixes bug 23100; + bugfix on 0.2.2.2-alpha. diff --git a/src/wraith/changes/bug23114 b/src/wraith/changes/bug23114 new file mode 100644 index 000000000..b67f75a5a --- /dev/null +++ b/src/wraith/changes/bug23114 @@ -0,0 +1,6 @@ + o Minor bugfixes (Performance): + - Consider circuits for timeout as soon as they complete a hop. This + is more accurate than applying the timeout in circuit_expire_building() + because that function is only called once per second, which is now + too slow for typical timeouts on the current network. Fixes bug 23114; + bugfix on 0.2.2.2-alpha. diff --git a/src/wraith/changes/bug23571 b/src/wraith/changes/bug23571 new file mode 100644 index 000000000..f2efbdfb9 --- /dev/null +++ b/src/wraith/changes/bug23571 @@ -0,0 +1,3 @@ + o Minor bugfixes (hibernation): + - When hibernating, close connections normally and allow them to flush. + Fixes bug 23571; bugfix on 0.2.4.7-alpha. Also fixes bug 7267. diff --git a/src/wraith/changes/bug23826-23828 b/src/wraith/changes/bug23826-23828 new file mode 100644 index 000000000..2b991e5c1 --- /dev/null +++ b/src/wraith/changes/bug23826-23828 @@ -0,0 +1,14 @@ + o Major features (IPv6, directory documents): + - Add consensus method 27, which adds IPv6 ORPorts to the microdesc + consensus. This makes it easier for IPv6 clients to bootstrap and + choose reachable entry guards. + Implements 23826. + - Add consensus method 28, which removes IPv6 ORPorts from + microdescriptors. Now that there are IPv6 ORPorts in the microdesc + consensus, they are redundant in microdescs. This change is compatible + with tor clients on 0.2.8.x and later. (0.2.8.x introduced client IPv6 + bootstrap and guard support.) + Implements 23828. + - Expand the documentation for AuthDirHasIPv6Connectivity when it is set + by different numbers of authorities. + Fixes 23870 on 0.2.4.1-alpha. diff --git a/src/wraith/changes/bug23827 b/src/wraith/changes/bug23827 new file mode 100644 index 000000000..75279abb8 --- /dev/null +++ b/src/wraith/changes/bug23827 @@ -0,0 +1,8 @@ + o Minor feature (IPv6): + - When a consensus has IPv6 ORPorts, make IPv6-only clients use them, + rather than waiting to download microdescriptors. + Implements 23827. + - Make IPv6-only clients wait for microdescs for relays, even if we were + previously using descriptors (or were using them as a bridge) and have + a cached descriptor for them. + Implements 23827. diff --git a/src/wraith/changes/bug23848 b/src/wraith/changes/bug23848 new file mode 100644 index 000000000..e2aec687c --- /dev/null +++ b/src/wraith/changes/bug23848 @@ -0,0 +1,8 @@ + o Minor features (embedding): + - On most errors that would cause Tor to exit, it now tries to return + from the tor_main() function, rather than calling the system exit() + function. Most users won't notice a difference here, but it should + make a significant difference on platforms that try to run Tor inside + a separate thread: they should now be able to survive Tor's exit + conditions rather than having Tor shut down the entire process. + Closes ticket 23848. diff --git a/src/wraith/changes/bug23953 b/src/wraith/changes/bug23953 new file mode 100644 index 000000000..10d41a00d --- /dev/null +++ b/src/wraith/changes/bug23953 @@ -0,0 +1,3 @@ + o Minor features (performance): + - Use stdatomic.h where available, rather than mutexes, to implement + atomic_counter_t. Closes ticket 23953. diff --git a/src/wraith/changes/bug24119 b/src/wraith/changes/bug24119 new file mode 100644 index 000000000..501425760 --- /dev/null +++ b/src/wraith/changes/bug24119 @@ -0,0 +1,4 @@ + o Code simplification and refactoring: + - Rewrite channel_rsa_id_group_set_badness to reduce temporary memory + allocations with large numbers of OR connections (e.g. relays). Closes + ticket 24119. diff --git a/src/wraith/changes/bug24137 b/src/wraith/changes/bug24137 new file mode 100644 index 000000000..588e68d19 --- /dev/null +++ b/src/wraith/changes/bug24137 @@ -0,0 +1,3 @@ + o Minor bugfixes (Private Networks): + - Give out Exit flags in bootstrapping networks. Fixes bug 24137; + bugfix on 0.2.3.1-alpha. diff --git a/src/wraith/changes/bug24318 b/src/wraith/changes/bug24318 new file mode 100644 index 000000000..c92f7209f --- /dev/null +++ b/src/wraith/changes/bug24318 @@ -0,0 +1,3 @@ + o Documentation: + - Clarify the behavior of RelayBandwidth{Rate,Burst} with client traffic. + Closes ticket 24318. diff --git a/src/wraith/changes/bug24337 b/src/wraith/changes/bug24337 new file mode 100644 index 000000000..82b430425 --- /dev/null +++ b/src/wraith/changes/bug24337 @@ -0,0 +1,8 @@ + o Minor features (defensive programming): + - Most of the functions in Tor that free objects have been replaced + with macros that free the objects and set the corresponding pointers + to NULL. This change should help prevent a large class of dangling + pointer bugs. Closes ticket 24337. + + - Where possible, the tor_free() macro now only evaluates its input once. + Part of ticket 24337. diff --git a/src/wraith/changes/bug24362 b/src/wraith/changes/bug24362 new file mode 100644 index 000000000..15e393cf3 --- /dev/null +++ b/src/wraith/changes/bug24362 @@ -0,0 +1,2 @@ + o Minor features (logging, android): + - Added support for the Android logging subsystem. Closes ticket 24362. diff --git a/src/wraith/changes/bug24374 b/src/wraith/changes/bug24374 new file mode 100644 index 000000000..d0b07f12d --- /dev/null +++ b/src/wraith/changes/bug24374 @@ -0,0 +1,4 @@ + o Minor features (performance, 32-bit): + - Improve performance on 32-bit systems by avoiding 64-bit division + when timestamping cells and buffer chunks for OOM calculations. + Implements ticket 24374. diff --git a/src/wraith/changes/bug24488 b/src/wraith/changes/bug24488 new file mode 100644 index 000000000..b8094e29e --- /dev/null +++ b/src/wraith/changes/bug24488 @@ -0,0 +1,4 @@ + o Minor bugfixes (directory authorities, IPv6): + - When creating a routerstatus (vote) from a routerinfo (descriptor), + set the IPv6 address to the unspecified IPv6 address, and explicitly + initialise the port to zero. Fixes bug 24488; bugfix on 0.2.4.1-alpha. diff --git a/src/wraith/changes/bug24489 b/src/wraith/changes/bug24489 new file mode 100644 index 000000000..6864ba6f5 --- /dev/null +++ b/src/wraith/changes/bug24489 @@ -0,0 +1,3 @@ + o Code simplification and refactoring (controller): + - Make most of the variables in networkstatus_getinfo_by_purpose() const. + Implements ticket 24489. diff --git a/src/wraith/changes/bug24605 b/src/wraith/changes/bug24605 new file mode 100644 index 000000000..7ee292b27 --- /dev/null +++ b/src/wraith/changes/bug24605 @@ -0,0 +1,4 @@ + o Minor features (instrumentation): + - Add the MainloopStats option to Tor that allows developers to get + instrumentation information from the main event loop via the heartbeat + messages. Closes ticket 24605. diff --git a/src/wraith/changes/bug24612 b/src/wraith/changes/bug24612 new file mode 100644 index 000000000..83db7f1df --- /dev/null +++ b/src/wraith/changes/bug24612 @@ -0,0 +1,4 @@ + o Minor bugfixes (build): + - Fix output of autoconf checks to display success messages for + Rust dependencies and a suitable rustc compiler version. Fixes + bug 24612; bugfix on 0.3.1.3-alpha. diff --git a/src/wraith/changes/bug24613 b/src/wraith/changes/bug24613 new file mode 100644 index 000000000..d718f8f94 --- /dev/null +++ b/src/wraith/changes/bug24613 @@ -0,0 +1,4 @@ + o Minor features (performance, 32-bit): + - Improve performance on 32-bit systems by avoiding 64-bit division + to calculate the current timestamp in milliseconds for channel + padding computations. Implements ticket 24613. diff --git a/src/wraith/changes/cargo-build-problem b/src/wraith/changes/cargo-build-problem new file mode 100644 index 000000000..6691b0efc --- /dev/null +++ b/src/wraith/changes/cargo-build-problem @@ -0,0 +1,3 @@ + o Minor bugfixes (compilation, rust): + - Build correctly when building from outside Tor's source tree with the + TOR_RUST_DEPENDENCIES option set. Fixes bug 22768; bugfix on 0.3.1.7. diff --git a/src/wraith/changes/feature24427 b/src/wraith/changes/feature24427 new file mode 100644 index 000000000..8650c45d3 --- /dev/null +++ b/src/wraith/changes/feature24427 @@ -0,0 +1,5 @@ + o Minor features (OSX, iOS, performance): + - Use the mach_approximate_time() function (when available) to + implement coarse monotonic time. Having a coarse time function + should avoid a large number of system calls, and improve + performance slightly, especially under load. Closes ticket 24427. diff --git a/src/wraith/changes/ticket13605 b/src/wraith/changes/ticket13605 new file mode 100644 index 000000000..0456881ff --- /dev/null +++ b/src/wraith/changes/ticket13605 @@ -0,0 +1,5 @@ + o Major features (relay): + - Implement an option, ReducedExitPolicy, to allow an Tor exit relay + operator to use a more reasonable ("reduced") exit policy, rather + than the default one. Closes ticket 13605. Patch from Neel Chauhan. + diff --git a/src/wraith/changes/ticket20020 b/src/wraith/changes/ticket20020 new file mode 100644 index 000000000..737fb9598 --- /dev/null +++ b/src/wraith/changes/ticket20020 @@ -0,0 +1,4 @@ + o Minor features (logging): + - Improve a warning message that happens when we fail to re-parse + an old router because of an expired certificate. Closes ticket + 20020. diff --git a/src/wraith/changes/ticket20699 b/src/wraith/changes/ticket20699 new file mode 100644 index 000000000..a93236ba4 --- /dev/null +++ b/src/wraith/changes/ticket20699 @@ -0,0 +1,14 @@ + o Major features (hidden service v3, control port): + - Control port now supports command and events for hidden service v3. See + proposal 284 for more information on what has been done exactly. Only + the HSFETCH command hasn't been implemented at this stage because of a + lack of use case with v3. + + It is now possible to create ephemeral v3 services using the ADD_ONION + command. Here is a summary of the events and commands that have been + modified to support v3: + + Events: HS_DESC, HS_DESC_CONTENT, CIRC and CIRC_MINOR The + Commands: GETINFO, HSPOST, ADD_ONION and DEL_ONION. + + This closes ticket 20699. diff --git a/src/wraith/changes/ticket20895 b/src/wraith/changes/ticket20895 new file mode 100644 index 000000000..a1d820499 --- /dev/null +++ b/src/wraith/changes/ticket20895 @@ -0,0 +1,6 @@ + o Minor features (forward-compatibility): + - If a relay supports some link authentication protocol that we do not + recognize, then include that relay's ed25519 key when telling other + relays to extend to it. Previously, we treated future versions as if + they were too old to support ed25519 link authentication. + Closes ticket 20895. diff --git a/src/wraith/changes/ticket22342 b/src/wraith/changes/ticket22342 new file mode 100644 index 000000000..53505509d --- /dev/null +++ b/src/wraith/changes/ticket22342 @@ -0,0 +1,3 @@ + o Code simplification and refactoring: + - Small changes to Tor's buf_t API to make it suitable for use as + a general-purpose safe string constructor. Closes ticket 22342. diff --git a/src/wraith/changes/ticket22703 b/src/wraith/changes/ticket22703 new file mode 100644 index 000000000..c1eda615f --- /dev/null +++ b/src/wraith/changes/ticket22703 @@ -0,0 +1,6 @@ + o Major features (storage): + - Users can choose to store cached directory documents somewhere other + than the DataDirectory by using the CacheDirectory option. + Similarly, the storage location for relay's keys can be overridden + with the KeyDirectory option. + Closes ticket 22703. diff --git a/src/wraith/changes/ticket22840 b/src/wraith/changes/ticket22840 new file mode 100644 index 000000000..6d234fb0d --- /dev/null +++ b/src/wraith/changes/ticket22840 @@ -0,0 +1,8 @@ + o Major features (Rust experimentation): + - Tor now ships with an optional implementation of one of its smaller + modules (protover.c) in the Rust programming language. To try it + out, install a Rust build environment, and configure Tor with + "--enable-rust --enable-cargo-online-mode". This should not + cause any user-visible changes, but should help us gain more experience + with Rust, and plan future Rust integration work. + Implementation by Chelsea Komlo. Closes ticket 22840. diff --git a/src/wraith/changes/ticket23271 b/src/wraith/changes/ticket23271 new file mode 100644 index 000000000..42d5921a7 --- /dev/null +++ b/src/wraith/changes/ticket23271 @@ -0,0 +1,6 @@ + o Code simplification and refactoring: + - Separate the function that deletes ephemeral files when Tor stops + gracefully. + o Minor features (cleanup): + - Tor now deletes the CookieAuthFile and ExtORPortCookieAuthFile when it + stops. Closes ticket 23271. diff --git a/src/wraith/changes/ticket23459 b/src/wraith/changes/ticket23459 new file mode 100644 index 000000000..a6452e4ee --- /dev/null +++ b/src/wraith/changes/ticket23459 @@ -0,0 +1,4 @@ + o Code simplification and refactoring (circuit rendezvous): + - Split get rendezvous circuit on client side on two different functions. + One that returns only established circuits and another that returns all + kinds of circuits. Closes ticket 23459. diff --git a/src/wraith/changes/ticket23577 b/src/wraith/changes/ticket23577 new file mode 100644 index 000000000..7cd80bcb6 --- /dev/null +++ b/src/wraith/changes/ticket23577 @@ -0,0 +1,7 @@ + o Major features (v3 onion services): + - When v3 onion service clients send introduce cells, include the IPv6 + address of the rendezvous point, if it has one. v3 onion services running + 0.3.2 ignore IPv6 addresses. In future Tor versions, IPv6-only v3 single + onion services can use IPv6 addresses to connect directly to the + rendezvous point. Closes ticket 23577. Patch by Neel Chauhan. + diff --git a/src/wraith/changes/ticket23637 b/src/wraith/changes/ticket23637 new file mode 100644 index 000000000..0c524f34c --- /dev/null +++ b/src/wraith/changes/ticket23637 @@ -0,0 +1,5 @@ + o Minor features (directory authority): + - Make the "Exit" flag assignment only depend on whether the exit + policy allows connections to ports 80 and 443. Previously relays + would get the Exit flag if they allowed connections to one of + these ports and also port 6667. Resolves ticket 23637. diff --git a/src/wraith/changes/ticket23709 b/src/wraith/changes/ticket23709 new file mode 100644 index 000000000..7948f9ae0 --- /dev/null +++ b/src/wraith/changes/ticket23709 @@ -0,0 +1,11 @@ + o Major feature (channel): + - Remove the incoming and outgoing channel queues. The reason to do so was + due to the fact that they were always empty meaning never used but still + looked at in our fast path. Bottom line, it was an unused code path. + - We've simplify a lot the channel subsystem by removing those queues but + also by removing a lot of unused code or dead code around it. Overall + this is a cleanup removing more than 1500 lines of code overall and + adding very little except for unit test. + - The majority ot the channel unit tests have been rewritten and the code + coverage has now been raised to 83.6% for channel.c. + Closes ticket 23709. diff --git a/src/wraith/changes/ticket23760 b/src/wraith/changes/ticket23760 new file mode 100644 index 000000000..9213b1462 --- /dev/null +++ b/src/wraith/changes/ticket23760 @@ -0,0 +1,4 @@ + o Code simplification and refactoring: + - We make extend_info_from_node() use node_get_curve25519_onion_key() + introduced in ticket 23577 to access the curve25519 public keys rather + than accessing it directly. Closes ticket 23760. Patch by Neel Chauhan. diff --git a/src/wraith/changes/ticket23845 b/src/wraith/changes/ticket23845 new file mode 100644 index 000000000..93c150bdb --- /dev/null +++ b/src/wraith/changes/ticket23845 @@ -0,0 +1,9 @@ + o Major features (embedding): + - There is now a documented stable API for programs that need to + embed Tor. See tor_api.h for full documentation and known bugs. + Closes ticket 23684. + + o Code simplification and refactoring: + - The tor_git_revision[] constant no longer needs to be redeclared + by everything that links against the rest of Tor. Done as part + of ticket 23845, to simplify our external API. diff --git a/src/wraith/changes/ticket23900 b/src/wraith/changes/ticket23900 new file mode 100644 index 000000000..0f949f4f4 --- /dev/null +++ b/src/wraith/changes/ticket23900 @@ -0,0 +1,7 @@ + o Minor features (API, embedding): + - Tor can now start with a preauthenticated control connection + created by the process that launched it. This feature is meant + for use by programs that want to launch and manage a Tor process + without allowing other programs to manage it as well. + For more information, see the __OwningControllerFD option + documented in control-spec.txt. Closes ticket 23900. diff --git a/src/wraith/changes/ticket24363 b/src/wraith/changes/ticket24363 new file mode 100644 index 000000000..6f90fc066 --- /dev/null +++ b/src/wraith/changes/ticket24363 @@ -0,0 +1,2 @@ + o Code simplification and refactoring: + - Remove /usr/athena from search path in configure.ac. Closes ticket 24363. diff --git a/src/wraith/changes/ticket24467 b/src/wraith/changes/ticket24467 new file mode 100644 index 000000000..1b1c223f5 --- /dev/null +++ b/src/wraith/changes/ticket24467 @@ -0,0 +1,3 @@ + o Code simplification and refactoring: + - Switch -Wnormalized=id to -Wnormalized=nfkc in configure.ac to avoid + source code identifier confusion. Closes ticket 24467. diff --git a/src/wraith/changes/ticket24518 b/src/wraith/changes/ticket24518 new file mode 100644 index 000000000..28d40a3f2 --- /dev/null +++ b/src/wraith/changes/ticket24518 @@ -0,0 +1,4 @@ + o Minor bugfixes (build, rust): + - Don't pass the --quiet option to cargo: it seems to suppress some + errors, which is not what we want to do when building. + Fixes bug 24518; bugfix on 0.3.1.7. diff --git a/src/wraith/contrib/README b/src/wraith/contrib/README new file mode 100644 index 000000000..3a94bb501 --- /dev/null +++ b/src/wraith/contrib/README @@ -0,0 +1,68 @@ +The contrib/ directory contains small tools that might be useful for using +with Tor. A few of them are included in the Tor source distribution; you can +find the others in the main Tor repository. We don't guarantee that they're +particularly useful. + +dirauth-tools/ -- Tools useful for directory authority administrators +--------------------------------------------------------------------- + +add-tor is an old script to manipulate the approved-routers file. + +nagios-check-tor-authority-cert is a nagios script to check when Tor +authority certificates are expired or nearly expired. + +clang/ -- Files for use with the clang compiler +----------------------------------------------- + +sanitize_blacklist.txt is used to build Tor with clang's dynamic +AddressSanitizer and UndefinedBehaviorSanitizer. It contains detailed +instructions on configuration, build, and testing with clang's sanitizers. + +client-tools/ -- Tools for use with Tor clients +----------------------------------------------- + +torify is a small wrapper script around torsocks. + +tor-resolve.py uses Tor's SOCKS port extensions to perform DNS lookups. You +should probably use src/tools/tor-resolve instead. + +dist/ -- Scripts and files for use when packaging Tor +----------------------------------------------------- + +torctl, rc.subr, and tor.sh are init scripts for use with SysV-style init +tools. Everybody likes to write init scripts differently, it seems. + +tor.service is a sample service file for use with systemd. + +The suse/ subdirectory contains files used by the suse distribution. + +operator-tools/ -- Tools for Tor relay operators +------------------------------------------------ + +tor-exit-notice.html is an HTML file for use with the DirPortFrontPage +option. It tells visitors that your relay is a Tor exit node, and that they +shouldn't assume you're the origin for the traffic that you're delivering. + +tor.logrotate is a configuration file for use with the logrotate tool. You +may need to edit it to work for you. + +linux-tor-prio.sh uses Linux iptables tools to traffic-shape your Tor relay's +traffic. If it breaks, you get to keep both pieces. + +or-tools/ -- Tools for interacting with relays +---------------------------------------------- + +checksocks.pl is a tool to scan relays to see if any of them have advertised +public SOCKS ports, so we can tell them not to. + +check-tor is a quick shell script to try doing a TLS handshake with a router +or to try fetching a directory from it. + +exitlist is a precursor of check.torproject.org: it parses a bunch of cached +server descriptors to determine which can connect to a given address:port. + +win32build -- Old files for windows packaging +--------------------------------------------- + +You shouldn't need these unless you're building some of the older Windows +packages. diff --git a/src/wraith/contrib/clang/sanitize_blacklist.txt b/src/wraith/contrib/clang/sanitize_blacklist.txt new file mode 100644 index 000000000..c71cc4d87 --- /dev/null +++ b/src/wraith/contrib/clang/sanitize_blacklist.txt @@ -0,0 +1,103 @@ +# clang sanitizer special case list +# syntax specified in http://clang.llvm.org/docs/SanitizerSpecialCaseList.html +# for more info see http://clang.llvm.org/docs/AddressSanitizer.html + +# +# Tor notes: This file is obsolete! +# +# It was necessary in order to apply the sanitizers to all of tor. But +# we don't believe that's a good idea: some parts of tor need constant-time +# behavior that is hard to guarantee with these sanitizers. +# +# If you need this behavior, then please consider --enable-expensive-hardening, +# and report bugs as needed. +# + +# usage: +# 1. configure tor build: +# ./configure \ +# CC=clang \ +# CFLAGS="-fsanitize-blacklist=contrib/clang/sanitize_blacklist.txt -fsanitize=undefined -fsanitize=address -fno-sanitize-recover=all -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-inline" \ +# LDFLAGS="-fsanitize=address" \ +# --disable-gcc-hardening +# and any other flags required to build tor on your OS. +# +# 2. build tor: +# make +# +# 3. test tor: +# ASAN_OPTIONS=allow_user_segv_handler=1 make test +# ASAN_OPTIONS=allow_user_segv_handler=1 make check +# make test-network # requires chutney +# +# 4. the tor binary is now instrumented with clang sanitizers, +# and can be run just like a standard tor binary + +# Compatibility: +# This blacklist has been tested with clang 3.7's UndefinedBehaviorSanitizer +# and AddressSanitizer on OS X 10.10 Yosemite, with all tests passing +# on both x86_64 and i386 (using CC="clang -arch i386") +# It has not been tested with ThreadSanitizer or MemorySanitizer +# Success report and patches for other sanitizers or OSs are welcome + +# ccache and make don't account for the sanitizer blacklist as a dependency +# you might need to set CCACHE_DISABLE=1 and/or use make clean to workaround + +# Configuration Flags: +# -fno-sanitize-recover=all +# causes clang to crash on undefined behavior, rather than printing +# a warning and continuing (the AddressSanitizer always crashes) +# -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-inline +# make clang backtraces easier to read +# --disable-gcc-hardening +# disables warnings about the redefinition of _FORTIFY_SOURCE +# (it conflicts with the sanitizers) + +# Turning the sanitizers off for particular functions: +# (Unfortunately, exempting functions doesn't work for the blacklisted +# functions below, and we can't turn the code off because it's essential) +# +# #if defined(__has_feature) +# #if __has_feature(address_sanitizer) +# /* tell clang AddressSanitizer not to instrument this function */ +# #define NOASAN __attribute__((no_sanitize_address)) +# #define _CLANG_ASAN_ +# #else +# #define NOASAN +# #endif +# #else +# #define NOASAN +# #endif +# +# /* Telling AddressSanitizer to not instrument a function */ +# void func(void) NOASAN; +# +# /* Including or excluding sections of code */ +# #ifdef _CLANG_ASAN_ +# /* code that only runs under address sanitizer */ +# #else +# /* code that doesn't run under address sanitizer */ +# #endif + +# Blacklist Entries: + +# test-memwipe.c checks if a freed buffer was properly wiped +fun:vmemeq +fun:check_a_buffer + +# we need to allow the tor bt handler to catch SIGSEGV +# otherwise address sanitizer munges the expected output and the test fails +# we can do this by setting an environmental variable +# See https://code.google.com/p/address-sanitizer/wiki/Flags +# ASAN_OPTIONS=allow_user_segv_handler=1 + +# test_bt_cl.c stores to a NULL pointer to trigger a crash +fun:crash + +# curve25519-donna.c left-shifts 1 bits into and past the sign bit of signed +# integers. Until #13538 is resolved, we exempt functions that do left shifts. +# Note that x86_64 uses curve25519-donna-c64.c instead of curve25519-donna.c +fun:freduce_coefficients +fun:freduce_degree +fun:s32_eq +fun:fcontract diff --git a/src/wraith/contrib/client-tools/tor-resolve.py b/src/wraith/contrib/client-tools/tor-resolve.py new file mode 100644 index 000000000..47ae1a0c3 --- /dev/null +++ b/src/wraith/contrib/client-tools/tor-resolve.py @@ -0,0 +1,153 @@ +#!/usr/bin/python + +import socket +import struct +import sys + +def socks4AResolveRequest(hostname): + version = 4 + command = 0xF0 + port = 0 + addr = 0x0000001 + username = "" + reqheader = struct.pack("!BBHL", version, command, port, addr) + return "%s%s\x00%s\x00"%(reqheader,username,hostname) + +def socks4AParseResponse(response): + RESPONSE_LEN = 8 + if len(response) < RESPONSE_LEN: + return None + assert len(response) >= RESPONSE_LEN + version,status,port = struct.unpack("!BBH",response[:4]) + assert version == 0 + assert port == 0 + if status == 90: + return "%d.%d.%d.%d"%tuple(map(ord, response[4:])) + else: + return "ERROR (status %d)"%status + +def socks5Hello(): + return "\x05\x01\x00" +def socks5ParseHello(response): + if response != "\x05\x00": + raise ValueError("Bizarre socks5 response") +def socks5ResolveRequest(hostname, atype=0x03, command=0xF0): + version = 5 + rsv = 0 + port = 0 + reqheader = struct.pack("!BBBB",version, command, rsv, atype) + if atype == 0x03: + reqheader += struct.pack("!B", len(hostname)) + portstr = struct.pack("!H",port) + return "%s%s%s"%(reqheader,hostname,portstr) + +def socks5ParseResponse(r): + if len(r)<8: + return None + version, reply, rsv, atype = struct.unpack("!BBBB",r[:4]) + assert version==5 + assert rsv==0 + if reply != 0x00: + return "ERROR",reply + assert atype in (0x01,0x03,0x04) + if atype != 0x03: + expected_len = 4 + ({1:4,4:16}[atype]) + 2 + if len(r) < expected_len: + return None + elif len(r) > expected_len: + raise ValueError("Overlong socks5 reply!") + addr = r[4:-2] + if atype == 0x01: + return "%d.%d.%d.%d"%tuple(map(ord,addr)) + else: + # not really the right way to format IPv6 + return "IPv6: %s"%(":".join([hex(ord(c)) for c in addr])) + else: + hlen, = struct.unpack("!B", r[4]) + expected_len = 5 + hlen + 2 + if len(r) < expected_len: + return None + return r[5:-2] + +def socks5ResolvePTRRequest(hostname): + return socks5ResolveRequest(socket.inet_aton(hostname), + atype=1, command = 0xF1) + + +def parseHostAndPort(h): + host, port = "localhost", 9050 + if ":" in h: + i = h.index(":") + host = h[:i] + try: + port = int(h[i+1:]) + except ValueError: + print "Bad hostname %r"%h + sys.exit(1) + elif h: + try: + port = int(h) + except ValueError: + host = h + + return host, port + +def resolve(hostname, sockshost, socksport, socksver=4, reverse=0): + assert socksver in (4,5) + if socksver == 4: + fmt = socks4AResolveRequest + parse = socks4AParseResponse + elif not reverse: + fmt = socks5ResolveRequest + parse = socks5ParseResponse + else: + fmt = socks5ResolvePTRRequest + parse = socks5ParseResponse + + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((sockshost,socksport)) + if socksver == 5: + s.send(socks5Hello()) + socks5ParseHello(s.recv(2)) + s.send(fmt(hostname)) + answer = s.recv(6) + result = parse(answer) + while result is None: + more = s.recv(1) + if not more: + return None + answer += more + result = parse(answer) + print "Got answer",result + m = s.recv(1) + if m: + print "Got extra data too: %r"%m + return result + +if __name__ == '__main__': + if len(sys.argv) not in (2,3,4): + print "Syntax: resolve.py [-4|-5] hostname [sockshost:socksport]" + sys.exit(0) + socksver = 4 + reverse = 0 + while sys.argv[1][0] == '-': + if sys.argv[1] in ("-4", "-5"): + socksver = int(sys.argv[1][1]) + del sys.argv[1] + elif sys.argv[1] == '-x': + reverse = 1 + del sys.argv[1] + elif sys.argv[1] == '--': + break + + if len(sys.argv) >= 4: + print "Syntax: resolve.py [-x] [-4|-5] hostname [sockshost:socksport]" + sys.exit(0) + if len(sys.argv) == 3: + sh,sp = parseHostAndPort(sys.argv[2]) + else: + sh,sp = parseHostAndPort("") + + if reverse and socksver == 4: + socksver = 5 + resolve(sys.argv[1], sh, sp, socksver, reverse) diff --git a/src/wraith/contrib/client-tools/torify b/src/wraith/contrib/client-tools/torify new file mode 100644 index 000000000..54acfed65 --- /dev/null +++ b/src/wraith/contrib/client-tools/torify @@ -0,0 +1,61 @@ +#! /bin/sh + +# This script used to call (the now deprecated) tsocks as a fallback in case +# torsocks wasn't installed. +# Now, it's just a backwards compatible shim around torsocks with reasonable +# behavior if -v/--verbose or -h/--help arguments are passed. +# +# Copyright (c) 2004, 2006, 2009 Peter Palfrader +# Modified by Jacob Appelbaum April 16th 2006 +# Stripped of all the tsocks cruft by ugh on February 22nd 2012 +# May be distributed under the same terms as Tor itself + + +compat() { + echo "torify is now just a wrapper around torsocks(1) for backwards compatibility." +} + +usage() { + compat + echo "Usage: $0 [-hv] [...]" +} + +case $# in 0) + usage >&2 + exit 1 +esac + +case $# in 1) + case $1 in -h|--help) + usage + exit 0 + esac +esac + +case $1 in -v|--verbose) + compat >&2 + shift +esac + +# taken from Debian's Developer's Reference, 6.4 +pathfind() { + OLDIFS="$IFS" + IFS=: + for p in $PATH; do + if [ -x "$p/$*" ]; then + IFS="$OLDIFS" + return 0 + fi + done + IFS="$OLDIFS" + return 1 +} + +if pathfind torsocks; then + exec torsocks "$@" + echo "$0: Failed to exec torsocks $@" >&2 + exit 1 +else + echo "$0: torsocks not found in your PATH. Perhaps it isn't installed? (tsocks is no longer supported, for security reasons.)" >&2 +fi + diff --git a/src/wraith/contrib/dirauth-tools/add-tor b/src/wraith/contrib/dirauth-tools/add-tor new file mode 100644 index 000000000..5a12abca8 --- /dev/null +++ b/src/wraith/contrib/dirauth-tools/add-tor @@ -0,0 +1,115 @@ +#!/usr/bin/ruby + +# add-tor - Add a tor fingerprint line to the approved-routers file +# +# Tor's approved-routers file is expected to be versioned using RCS. +# This script checks for uncommitted changes, does a checkout of the +# file, adds the new fingerprint with a comment stating the server's +# operator, and commits the file to RCS again (using -u so that the +# working copy is not removed. +# +# Operator and fingerprint line are read from stdin. +# +# Before adding a fingerprint line, approved-routers is checked for +# rough syntactical correctness. This script also checks that the +# nickname and fingerprint to be added do not already exist in the +# binding list. + + +# Copyright (c) 2006 by Peter Palfrader +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +BINDING = '/etc/tor/approved-routers' + +def mysys(cmd) + unless system(cmd) + STDERR.puts "ERROR: #{cmd} failed" + exit 1 + end +end + +def check_nick(n) + n =~ /^[a-zA-Z0-9]+$/ +end + +def check_fpr(fpr) + fpr =~ /^([0-9A-F]{4} ){9}[0-9A-F]{4}$/ +end + +def parse_fprline(fprline) + n = fprline[0 ... fprline.index(' ')] + f = fprline[fprline.index(' ') + 1 .. -1 ] + unless check_nick(n) and check_fpr(f) + STDERR.puts "Invalid fpr syntax '#{fprline}'" + exit 1 + end + [n, f] +end + + + +unless system("rcsdiff -q -u #{BINDING}") + STDERR.puts "Uncommitted changes in #{BINDING}. Aborting." + exit 1 +end + +puts "Checking out #{BINDING}..." +mysys("co -l #{BINDING}") + +print "Operator: " +@operator = readline.chop +unless @operator.index('@') + STDERR.puts "ERROR: No @ found" + exit 1 +end + +print "FPR Line: " +@fprline = readline.chop +(@nickname, @fpr) = parse_fprline(@fprline) + +binding = File.new(BINDING, "r+") +binding.readlines.each do |line| + line.chop! + next if line[0..0] == "#" + (n,f) = parse_fprline(line) + if (n == @nickname) + STDERR.puts + STDERR.puts "ERROR: Nickname #{n} already exists in #{BINDING} (fpr: #{f})" + exit 1 + end + if (f == @fpr) + STDERR.puts + STDERR.puts "ERROR: Fpr #{f} already exists in #{BINDING} (nickname: #{n})" + exit 1 + end +end + +puts +puts '| # ' + @operator +puts '| ' + @fprline +puts + +binding.puts '# '+@operator +binding.puts @fprline +binding.close + +puts "Committing #{BINDING}..." +mysys("ci -u -m'Add #{@nickname}' #{BINDING}") diff --git a/src/wraith/contrib/dirauth-tools/nagios-check-tor-authority-cert b/src/wraith/contrib/dirauth-tools/nagios-check-tor-authority-cert new file mode 100644 index 000000000..46dc7284b --- /dev/null +++ b/src/wraith/contrib/dirauth-tools/nagios-check-tor-authority-cert @@ -0,0 +1,86 @@ +#!/bin/bash + +# nagios-check-tor-authority-cert - check certificate expiry time + +# A nagios check for Tor v3 directory authorities: +# - Checks the current certificate expiry time +# +# Usage: nagios-check-tor-authority-cert +# e.g.: nagios-check-tor-authority-cert A9AC67E64B200BBF2FA26DF194AC0469E2A948C6 + +# Copyright (c) 2008 Peter Palfrader +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +set -e +set -u + +if [ -z "${1:-}" ]; then + echo "Usage: $0 " 2>&1 + exit 3 +fi + +identity="$1" + +DIRSERVERS="" +DIRSERVERS="$DIRSERVERS 86.59.21.38:80" # tor26 +DIRSERVERS="$DIRSERVERS 128.31.0.34:9031" # moria1 +DIRSERVERS="$DIRSERVERS 216.224.124.114:9030" # ides +DIRSERVERS="$DIRSERVERS 80.190.246.100:80" # gabelmoo +#DIRSERVERS="$DIRSERVERS 140.247.60.64:80" # lefkada +DIRSERVERS="$DIRSERVERS 194.109.206.212:80" # dizum +DIRSERVERS="$DIRSERVERS 213.73.91.31:80" # dannenberg + +TMPFILE="`tempfile`" +trap 'rm -f "$TMPFILE"' 0 + +for dirserver in $DIRSERVERS; do + wget -q -O "$TMPFILE" "http://$dirserver/tor/keys/fp/$identity" + if [ "$?" = 0 ]; then + break + else + cat /dev/null > "$TMPFILE" + continue + fi +done + +if ! [ -s "$TMPFILE" ] ; then + echo "UNKNOWN: Downloading certificate for $identity failed." + exit 3 +fi + +expirydate="$(awk '$1=="dir-key-expires" {printf "%s %s", $2, $3}' < "$TMPFILE")" +expiryunix=$(TZ=UTC date -d "$expirydate" +%s) +now=$(date +%s) + +if [ "$now" -ge "$expiryunix" ]; then + echo "CRITICAL: Certificate expired $expirydate (authority $identity)." + exit 2 +elif [ "$(( $now + 7*24*60*60 ))" -ge "$expiryunix" ]; then + echo "CRITICAL: Certificate expires $expirydate (authority $identity)." + exit 2 +elif [ "$(( $now + 30*24*60*60 ))" -ge "$expiryunix" ]; then + echo "WARNING: Certificate expires $expirydate (authority $identity)." + exit 1 +else + echo "OK: Certificate expires $expirydate (authority $identity)." + exit 0 +fi diff --git a/src/wraith/contrib/dist/rc.subr b/src/wraith/contrib/dist/rc.subr new file mode 100644 index 000000000..d757e8952 --- /dev/null +++ b/src/wraith/contrib/dist/rc.subr @@ -0,0 +1,43 @@ +#!/bin/sh +# $FreeBSD: ports/security/tor-devel/files/tor.in,v 1.1 2006/02/17 22:21:25 mnag Exp $ +# +# (rc.subr written by Peter Thoenen for Net/FreeBSD) +# +# REQUIRE: NETWORKING SERVERS USR +# BEFORE: LOGIN +# +# Add the following lines to /etc/rc.conf to enable tor +# +# tor_enable (bool): Set to "NO" by default +# Set it to "YES" to enable tor +# tor_conf (str): Points to your tor conf file +# Default: /usr/local/etc/tor/torrc +# tor_user (str): Tor Daemon user. Default _tor +# + +. /etc/rc.subr + +name="tor" +rcvar=${name}_enable + +load_rc_config ${name} + +: ${tor_enable="NO"} +: ${tor_conf="/usr/local/etc/tor/torrc"} +: ${tor_user="_tor"} +: ${tor_pidfile="/var/run/tor/tor.pid"} +: ${tor_logfile="/var/log/tor"} +: ${tor_datadir="/var/run/tor"} + +required_files=${tor_conf} +required_dirs=${tor_datadir} +command="/usr/local/bin/${name}" +command_args="-f ${tor_conf} --pidfile ${tor_pidfile} --runasdaemon 1 --datadirectory ${tor_datadir} --user ${tor_user}" +extra_commands="log" +log_cmd="${name}_log" + +tor_log() { + cat ${tor_logfile} +} + +run_rc_command "$1" diff --git a/src/wraith/contrib/dist/suse/tor.sh.in b/src/wraith/contrib/dist/suse/tor.sh.in new file mode 100644 index 000000000..b7e9005eb --- /dev/null +++ b/src/wraith/contrib/dist/suse/tor.sh.in @@ -0,0 +1,118 @@ +#!/bin/sh +# +# Copyright (c) 2006-2007 Andrew Lewman +# +# tor The Onion Router +# +# Startup/shutdown script for tor. This is a wrapper around torctl; +# torctl does the actual work in a relatively system-independent, or at least +# distribution-independent, way, and this script deals with fitting the +# whole thing into the conventions of the particular system at hand. +# +# These next couple of lines "declare" tor for the "chkconfig" program, +# originally from SGI, used on Red Hat/Fedora and probably elsewhere. +# +# chkconfig: 2345 90 10 +# description: Onion Router - A low-latency anonymous proxy +# + +### BEGIN INIT INFO +# Provides: tor +# Required-Start: $remote_fs $network +# Required-Stop: $remote_fs $network +# Default-Start: 3 5 +# Default-Stop: 0 1 2 6 +# Short-Description: Start the tor daemon +# Description: Start the tor daemon: the anon-proxy server +### END INIT INFO + +. /etc/rc.status + +# Shell functions sourced from /etc/rc.status: +# rc_check check and set local and overall rc status +# rc_status check and set local and overall rc status +# rc_status -v ditto but be verbose in local rc status +# rc_status -v -r ditto and clear the local rc status +# rc_failed set local and overall rc status to failed +# rc_reset clear local rc status (overall remains) +# rc_exit exit appropriate to overall rc status + +# First reset status of this service +rc_reset + +# Increase open file descriptors a reasonable amount +ulimit -n 8192 + +TORCTL=@BINDIR@/torctl + +# torctl will use these environment variables +TORUSER=@TORUSER@ +export TORUSER +TORGROUP=@TORGROUP@ +export TORGROUP + +TOR_DAEMON_PID_DIR="@LOCALSTATEDIR@/run/tor" + +if [ -x /bin/su ] ; then + SUPROG=/bin/su +elif [ -x /sbin/su ] ; then + SUPROG=/sbin/su +elif [ -x /usr/bin/su ] ; then + SUPROG=/usr/bin/su +elif [ -x /usr/sbin/su ] ; then + SUPROG=/usr/sbin/su +else + SUPROG=/bin/su +fi + +case "$1" in + + start) + echo "Starting tor daemon" + + if [ ! -d $TOR_DAEMON_PID_DIR ] ; then + mkdir -p $TOR_DAEMON_PID_DIR + chown $TORUSER:$TORGROUP $TOR_DAEMON_PID_DIR + fi + + ## Start daemon with startproc(8). If this fails + ## the echo return value is set appropriate. + + startproc -f $TORCTL start + # Remember status and be verbose + rc_status -v + ;; + + stop) + echo "Stopping tor daemon" + startproc -f $TORCTL stop + # Remember status and be verbose + rc_status -v + ;; + + restart) + echo "Restarting tor daemon" + startproc -f $TORCTL restart + # Remember status and be verbose + rc_status -v + ;; + + reload) + echo "Reloading tor daemon" + startproc -f $TORCTL reload + # Remember status and be verbose + rc_status -v + ;; + + status) + startproc -f $TORCTL status + # Remember status and be verbose + rc_status -v + ;; + + *) + echo "Usage: $0 (start|stop|restart|reload|status)" + RETVAL=1 +esac + +rc_exit diff --git a/src/wraith/contrib/dist/tor.service.in b/src/wraith/contrib/dist/tor.service.in new file mode 100644 index 000000000..9c1a255b2 --- /dev/null +++ b/src/wraith/contrib/dist/tor.service.in @@ -0,0 +1,35 @@ +# tor.service -- this systemd configuration file for Tor sets up a +# relatively conservative, hardened Tor service. You may need to +# edit it if you are making changes to your Tor configuration that it +# does not allow. Package maintainers: this should be a starting point +# for your tor.service; it is not the last point. + +[Unit] +Description=Anonymizing overlay network for TCP +After=syslog.target network.target nss-lookup.target + +[Service] +Type=notify +NotifyAccess=all +ExecStartPre=@BINDIR@/tor -f @CONFDIR@/torrc --verify-config +ExecStart=@BINDIR@/tor -f @CONFDIR@/torrc +ExecReload=/bin/kill -HUP ${MAINPID} +KillSignal=SIGINT +TimeoutSec=30 +Restart=on-failure +WatchdogSec=1m +LimitNOFILE=32768 + +# Hardening +PrivateTmp=yes +PrivateDevices=yes +ProtectHome=yes +ProtectSystem=full +ReadOnlyDirectories=/ +ReadWriteDirectories=-@LOCALSTATEDIR@/lib/tor +ReadWriteDirectories=-@LOCALSTATEDIR@/log/tor +NoNewPrivileges=yes +CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_NET_BIND_SERVICE + +[Install] +WantedBy=multi-user.target diff --git a/src/wraith/contrib/dist/tor.sh.in b/src/wraith/contrib/dist/tor.sh.in new file mode 100644 index 000000000..92f890681 --- /dev/null +++ b/src/wraith/contrib/dist/tor.sh.in @@ -0,0 +1,123 @@ +#!/bin/sh +# +# tor The Onion Router +# +# Startup/shutdown script for tor. This is a wrapper around torctl; +# torctl does the actual work in a relatively system-independent, or at least +# distribution-independent, way, and this script deals with fitting the +# whole thing into the conventions of the particular system at hand. +# This particular script is written for Red Hat/Fedora Linux, and may +# also work on Mandrake, but not SuSE. +# +# These next couple of lines "declare" tor for the "chkconfig" program, +# originally from SGI, used on Red Hat/Fedora and probably elsewhere. +# +# chkconfig: 2345 90 10 +# description: Onion Router - A low-latency anonymous proxy +# + +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +DAEMON=/usr/sbin/tor +NAME=tor +DESC="tor daemon" +TORPIDDIR=/var/run/tor +TORPID=$TORPIDDIR/tor.pid +WAITFORDAEMON=60 +ARGS="" + +# Library functions +if [ -f /etc/rc.d/init.d/functions ]; then + . /etc/rc.d/init.d/functions +elif [ -f /etc/init.d/functions ]; then + . /etc/init.d/functions +fi + +TORCTL=@BINDIR@/torctl + +# torctl will use these environment variables +TORUSER=@TORUSER@ +export TORUSER + +if [ -x /bin/su ] ; then + SUPROG=/bin/su +elif [ -x /sbin/su ] ; then + SUPROG=/sbin/su +elif [ -x /usr/bin/su ] ; then + SUPROG=/usr/bin/su +elif [ -x /usr/sbin/su ] ; then + SUPROG=/usr/sbin/su +else + SUPROG=/bin/su +fi + +# Raise ulimit based on number of file descriptors available (thanks, Debian) + +if [ -r /proc/sys/fs/file-max ]; then + system_max=`cat /proc/sys/fs/file-max` + if [ "$system_max" -gt "80000" ] ; then + MAX_FILEDESCRIPTORS=32768 + elif [ "$system_max" -gt "40000" ] ; then + MAX_FILEDESCRIPTORS=16384 + elif [ "$system_max" -gt "10000" ] ; then + MAX_FILEDESCRIPTORS=8192 + else + MAX_FILEDESCRIPTORS=1024 + cat << EOF + +Warning: Your system has very few filedescriptors available in total. + +Maybe you should try raising that by adding 'fs.file-max=100000' to your +/etc/sysctl.conf file. Feel free to pick any number that you deem appropriate. +Then run 'sysctl -p'. See /proc/sys/fs/file-max for the current value, and +file-nr in the same directory for how many of those are used at the moment. + +EOF + fi +else + MAX_FILEDESCRIPTORS=8192 +fi + +NICE="" + +case "$1" in + + start) + if [ -n "$MAX_FILEDESCRIPTORS" ]; then + echo -n "Raising maximum number of filedescriptors (ulimit -n) to $MAX_FILEDESCRIPTORS" + if ulimit -n "$MAX_FILEDESCRIPTORS" ; then + echo "." + else + echo ": FAILED." + fi + fi + + action $"Starting tor:" $TORCTL start + RETVAL=$? + ;; + + stop) + action $"Stopping tor:" $TORCTL stop + RETVAL=$? + ;; + + restart) + action $"Restarting tor:" $TORCTL restart + RETVAL=$? + ;; + + reload) + action $"Reloading tor:" $TORCTL reload + RETVAL=$? + ;; + + status) + $TORCTL status + RETVAL=$? + ;; + + *) + echo "Usage: $0 (start|stop|restart|reload|status)" + RETVAL=1 +esac + +exit $RETVAL diff --git a/src/wraith/contrib/dist/torctl.in b/src/wraith/contrib/dist/torctl.in new file mode 100644 index 000000000..4cc137da4 --- /dev/null +++ b/src/wraith/contrib/dist/torctl.in @@ -0,0 +1,195 @@ +#!/bin/sh +# +# TOR control script designed to allow an easy command line interface +# to controlling The Onion Router +# +# The exit codes returned are: +# 0 - operation completed successfully. For "status", tor running. +# 1 - For "status", tor not running. +# 2 - Command not supported +# 3 - Could not be started or reloaded +# 4 - Could not be stopped +# 5 - +# 6 - +# 7 - +# 8 - +# +# When multiple arguments are given, only the error from the _last_ +# one is reported. +# +# +# |||||||||||||||||||| START CONFIGURATION SECTION |||||||||||||||||||| +# -------------------- -------------------- +# Name of the executable +EXEC=tor +# +# the path to your binary, including options if necessary +TORBIN="@BINDIR@/$EXEC" +# +# the path to the configuration file +TORCONF="@CONFDIR@/torrc" +# +# the path to your PID file +PIDFILE="@LOCALSTATEDIR@/run/tor/tor.pid" +# +# The path to the log file +LOGFILE="@LOCALSTATEDIR@/log/tor/tor.log" +# +# The path to the datadirectory +TORDATA="@LOCALSTATEDIR@/lib/tor" +# +TORARGS="--pidfile $PIDFILE --log \"notice file $LOGFILE\" --runasdaemon 1" +TORARGS="$TORARGS --datadirectory $TORDATA" + +# If user name is set in the environment, then use it; +# otherwise run as the invoking user (or whatever user the config +# file says)... unless the invoking user is root. The idea here is to +# let an unprivileged user run tor for her own use using this script, +# while still providing for it to be used as a system daemon. +if [ "x`id -u`" = "x0" ]; then + TORUSER=@TORUSER@ +fi + +if [ "x$TORUSER" != "x" ]; then + TORARGS="$TORARGS --user $TORUSER" +fi + +# We no longer wrap the Tor daemon startup in an su when running as +# root, because it's too painful to make the use of su portable. +# Just let the daemon set the UID and GID. +START="$TORBIN -f $TORCONF $TORARGS" + +# +# -------------------- -------------------- +# |||||||||||||||||||| END CONFIGURATION SECTION |||||||||||||||||||| + +ERROR=0 +ARGV="$@" +if [ "x$ARGV" = "x" ] ; then + ARGS="help" +fi + +checkIfRunning ( ) { + # check for pidfile + PID=unknown + if [ -f $PIDFILE ] ; then + PID=`/bin/cat $PIDFILE` + if [ "x$PID" != "x" ] ; then + if kill -0 $PID 2>/dev/null ; then + STATUS="$EXEC (pid $PID) running" + RUNNING=1 + else + STATUS="PID file ($PIDFILE) present, but $EXEC ($PID) not running" + RUNNING=0 + fi + else + STATUS="$EXEC (pid $PID?) not running" + RUNNING=0 + fi + else + STATUS="$EXEC apparently not running (no pid file)" + RUNNING=0 + fi + return +} + +for ARG in $@ $ARGS +do + checkIfRunning + + case $ARG in + start) + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: $EXEC (pid $PID) already running" + continue + fi + if eval "$START" ; then + echo "$0 $ARG: $EXEC started" + # Make sure it stayed up! + /bin/sleep 1 + checkIfRunning + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $EXEC (pid $PID) quit unexpectedly" + fi + else + echo "$0 $ARG: $EXEC could not be started" + ERROR=3 + fi + ;; + stop) + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $STATUS" + continue + fi + if kill -15 $PID ; then + echo "$0 $ARG: $EXEC stopped" + else + /bin/sleep 1 + if kill -9 $PID ; then + echo "$0 $ARG: $EXEC stopped" + else + echo "$0 $ARG: $EXEC could not be stopped" + ERROR=4 + fi + fi + # Make sure it really died! + /bin/sleep 1 + checkIfRunning + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: $EXEC (pid $PID) unexpectedly still running" + ERROR=4 + fi + ;; + restart) + $0 stop start + ;; + reload) + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $STATUS" + continue + fi + if kill -1 $PID; then + /bin/sleep 1 + echo "$EXEC (PID $PID) reloaded" + else + echo "Can't reload $EXEC" + ERROR=3 + fi + ;; + status) + echo $STATUS + if [ $RUNNING -eq 1 ]; then + ERROR=0 + else + ERROR=1 + fi + ;; + log) + cat $LOGFILE + ;; + help) + echo "usage: $0 (start|stop|restart|status|help)" + /bin/cat < +# int main(int argc, char **argv) { +# if(initgroups("tor", GID) == -1) { perror("initgroups"); return 1; } +# if(setresgid(GID, GID, GID) == -1) { perror("setresgid"); return 1; } +# if(setresuid(UID, UID, UID) == -1) { perror("setresuid"); return 1; } +# execl("/bin/tor", "/bin/tor", "-f", "/etc/tor/torrc", NULL); +# perror("execl"); return 1; +# } + +# IP BASED PRIORITIZATION +# +# The IP setting requires that a separate IP address be dedicated to Tor. +# Your Torrc should be set to bind to this IP for "OutboundBindAddress", +# "ListenAddress", and "Address". + +# GENERAL USAGE +# +# You should also tune the individual connection rate parameters below +# to your individual connection. In particular, you should leave *some* +# minimum amount of bandwidth for Tor, so that Tor users are not +# completely choked out when you use your server's bandwidth. 30% is +# probably a reasonable choice. More is better of course. +# +# To start the shaping, run it as: +# ./linux-tor-prio.sh +# +# To get status information (useful to verify packets are getting marked +# and prioritized), run: +# ./linux-tor-prio.sh status +# +# And to stop prioritization: +# ./linux-tor-prio.sh stop +# +######################################################################## + +# BEGIN USER TUNABLE PARAMETERS + +DEV=eth0 + +# NOTE! You must START Tor under this UID. Using the Tor User +# config setting is NOT sufficient. See above. +TOR_UID=$(id -u tor) + +# If the UID mechanism doesn't work for you, you can set this parameter +# instead. If set, it will take precedence over the UID setting. Note that +# you need multiple IPs with one specifically devoted to Tor for this to +# work. +#TOR_IP="42.42.42.42" + +# Average ping to most places on the net, milliseconds +RTT_LATENCY=40 + +# RATE_UP must be less than your connection's upload capacity in +# kbits/sec. If it is larger, then the bottleneck will be at your +# router's queue, which you do not control. This will cause congestion +# and a revert to normal TCP fairness no matter what the queing +# priority is. +RATE_UP=5000 + +# RATE_UP_TOR is the minimum speed your Tor connections will have in +# kbits/sec. They will have at least this much bandwidth for upload. +# In general, you probably shouldn't set this too low, or else Tor +# users who use your node will be completely choked out whenever your +# machine does any other network activity. That is not very fun. +RATE_UP_TOR=1500 + +# RATE_UP_TOR_CEIL is the maximum rate allowed for all Tor trafic in +# kbits/sec. +RATE_UP_TOR_CEIL=5000 + +CHAIN=OUTPUT +#CHAIN=PREROUTING +#CHAIN=POSTROUTING + +MTU=1500 +AVG_PKT=900 # should be more like 600 for non-exit nodes + +# END USER TUNABLE PARAMETERS + + + +# The queue size should be no larger than your bandwidth-delay +# product. This is RT latency*bandwidth/MTU/2 + +BDP=$(expr $RTT_LATENCY \* $RATE_UP / $AVG_PKT) + +# Further research indicates that the BDP calculations should use +# RTT/sqrt(n) where n is the expected number of active connections.. + +BDP=$(expr $BDP / 4) + +if [ "$1" = "status" ] +then + echo "[qdisc]" + tc -s qdisc show dev $DEV + tc -s qdisc show dev imq0 + echo "[class]" + tc -s class show dev $DEV + tc -s class show dev imq0 + echo "[filter]" + tc -s filter show dev $DEV + tc -s filter show dev imq0 + echo "[iptables]" + iptables -t mangle -L TORSHAPER-OUT -v -x 2> /dev/null + exit +fi + + +# Reset everything to a known state (cleared) +tc qdisc del dev $DEV root 2> /dev/null > /dev/null +tc qdisc del dev imq0 root 2> /dev/null > /dev/null +iptables -t mangle -D POSTROUTING -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null +iptables -t mangle -D PREROUTING -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null +iptables -t mangle -D OUTPUT -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null +iptables -t mangle -F TORSHAPER-OUT 2> /dev/null > /dev/null +iptables -t mangle -X TORSHAPER-OUT 2> /dev/null > /dev/null +ip link set imq0 down 2> /dev/null > /dev/null +rmmod imq 2> /dev/null > /dev/null + +if [ "$1" = "stop" ] +then + echo "Shaping removed on $DEV." + exit +fi + +# Outbound Shaping (limits total bandwidth to RATE_UP) + +ip link set dev $DEV qlen $BDP + +# Add HTB root qdisc, default is high prio +tc qdisc add dev $DEV root handle 1: htb default 20 + +# Add main rate limit class +tc class add dev $DEV parent 1: classid 1:1 htb rate ${RATE_UP}kbit + +# Create the two classes, giving Tor at least RATE_UP_TOR kbit and capping +# total upstream at RATE_UP so the queue is under our control. +tc class add dev $DEV parent 1:1 classid 1:20 htb rate $(expr $RATE_UP - $RATE_UP_TOR)kbit ceil ${RATE_UP}kbit prio 0 +tc class add dev $DEV parent 1:1 classid 1:21 htb rate $[$RATE_UP_TOR]kbit ceil ${RATE_UP_TOR_CEIL}kbit prio 10 + +# Start up pfifo +tc qdisc add dev $DEV parent 1:20 handle 20: pfifo limit $BDP +tc qdisc add dev $DEV parent 1:21 handle 21: pfifo limit $BDP + +# filter traffic into classes by fwmark +tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20 +tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21 + +# add TORSHAPER-OUT chain to the mangle table in iptables +iptables -t mangle -N TORSHAPER-OUT +iptables -t mangle -I $CHAIN -o $DEV -j TORSHAPER-OUT + + +# Set firewall marks +# Low priority to Tor +if [ ""$TOR_IP == "" ] +then + echo "Using UID-based QoS. UID $TOR_UID marked as low priority." + iptables -t mangle -A TORSHAPER-OUT -m owner --uid-owner $TOR_UID -j MARK --set-mark 21 +else + echo "Using IP-based QoS. $TOR_IP marked as low priority." + iptables -t mangle -A TORSHAPER-OUT -s $TOR_IP -j MARK --set-mark 21 +fi + +# High prio for everything else +iptables -t mangle -A TORSHAPER-OUT -m mark --mark 0 -j MARK --set-mark 20 + +echo "Outbound shaping added to $DEV. Rate for Tor upload at least: ${RATE_UP_TOR}Kbyte/sec." + diff --git a/src/wraith/contrib/operator-tools/tor-exit-notice.html b/src/wraith/contrib/operator-tools/tor-exit-notice.html new file mode 100644 index 000000000..8cf5c294f --- /dev/null +++ b/src/wraith/contrib/operator-tools/tor-exit-notice.html @@ -0,0 +1,144 @@ + + + + + +This is a Tor Exit Router + + + + + + +

This is a +Tor Exit Router

+ +

+Most likely you are accessing this website because you had some issue with +the traffic coming from this IP. This router is part of the Tor Anonymity Network, which is +dedicated to providing +privacy to people who need it most: average computer users. This +router IP should be generating no other traffic, unless it has been +compromised.

+ + + + +

+ +How Tor works +

+ +

+Tor sees use by many +important segments of the population, including whistle blowers, +journalists, Chinese dissidents skirting the Great Firewall and oppressive +censorship, abuse victims, stalker targets, the US military, and law +enforcement, just to name a few. While Tor is not designed for malicious +computer users, it is true that they can use the network for malicious ends. +In reality however, the actual amount of abuse is quite low. This +is largely because criminals and hackers have significantly better access to +privacy and anonymity than do the regular users whom they prey upon. Criminals +can and do build, +sell, and trade far larger and more +powerful networks than Tor on a daily basis. Thus, in the mind of this +operator, the social need for easily accessible censorship-resistant private, +anonymous communication trumps the risk of unskilled bad actors, who are +almost always more easily uncovered by traditional police work than by +extensive monitoring and surveillance anyway.

+ +

+In terms of applicable law, the best way to understand Tor is to consider it a +network of routers operating as common carriers, much like the Internet +backbone. However, unlike the Internet backbone routers, Tor routers +explicitly do not contain identifiable routing information about the source of +a packet, and no single Tor node can determine both the origin and destination +of a given transmission.

+ +

+As such, there is little the operator of this router can do to help you track +the connection further. This router maintains no logs of any of the Tor +traffic, so there is little that can be done to trace either legitimate or +illegitimate traffic (or to filter one from the other). Attempts to +seize this router will accomplish nothing.

+ + + +

+Furthermore, this machine also serves as a carrier of email, which means that +its contents are further protected under the ECPA. 18 +USC 2707 explicitly allows for civil remedies ($1000/account +plus legal fees) +in the event of a seizure executed without good faith or probable cause (it +should be clear at this point that traffic with an originating IP address of +FIXME_DNS_NAME should not constitute probable cause to seize the +machine). Similar considerations exist for 1st amendment content on this +machine.

+ + + +

+If you are a representative of a company who feels that this router is being +used to violate the DMCA, please be aware that this machine does not host or +contain any illegal content. Also be aware that network infrastructure +maintainers are not liable for the type of content that passes over their +equipment, in accordance with DMCA +"safe harbor" provisions. In other words, you will have just as much luck +sending a takedown notice to the Internet backbone providers. Please consult +EFF's prepared +response for more information on this matter.

+ +

For more information, please consult the following documentation:

+ +
    +
  1. Tor Overview
  2. +
  3. Tor Abuse FAQ
  4. +
  5. Tor Legal FAQ
  6. +
+ +

+That being said, if you still have a complaint about the router, you may +email the maintainer. If +complaints are related to a particular service that is being abused, I will +consider removing that service from my exit policy, which would prevent my +router from allowing that traffic to exit through it. I can only do this on an +IP+destination port basis, however. Common P2P ports are +already blocked.

+ +

+You also have the option of blocking this IP address and others on +the Tor network if you so desire. The Tor project provides a web service +to fetch a list of all IP addresses of Tor exit nodes that allow exiting to a +specified IP:port combination, and an official DNSRBL is also available to +determine if a given IP address is actually a Tor exit server. Please +be considerate +when using these options. It would be unfortunate to deny all Tor users access +to your site indefinitely simply because of a few bad apples.

+ + + diff --git a/src/wraith/contrib/operator-tools/tor.logrotate.in b/src/wraith/contrib/operator-tools/tor.logrotate.in new file mode 100644 index 000000000..6e75f80bf --- /dev/null +++ b/src/wraith/contrib/operator-tools/tor.logrotate.in @@ -0,0 +1,14 @@ +@LOCALSTATEDIR@/log/tor/*log { + daily + rotate 5 + compress + delaycompress + missingok + notifempty + # you may need to change the username/groupname below + create 0640 _tor _tor + sharedscripts + postrotate + /etc/init.d/tor reload > /dev/null + endscript +} diff --git a/src/wraith/contrib/or-tools/check-tor b/src/wraith/contrib/or-tools/check-tor new file mode 100644 index 000000000..e981a35fc --- /dev/null +++ b/src/wraith/contrib/or-tools/check-tor @@ -0,0 +1,41 @@ +#!/bin/sh + +## Originally written by Peter Palfrader. + +## This script lets you quickly check if a given router (by nickname) +## will let you do a TLS handshake, or will let you download a directory. + +## Usage: check-tor nickname + +#set -x + +router="$1" +dirserver="http://belegost.seul.org:80/tor/" + +lines=$( wget -q $dirserver --proxy=off -O - | grep -A5 '^router '"$router"' ' ) +line=$( echo "$lines" | head -n1 ) + +if [ -z "$line" ]; then + echo "Not found" >&2 + exit 1 +fi + +echo "$lines" +echo + +ipor=$( echo "$line" | awk '{printf "%s:%s", $3, $4}' ) + +op=$( echo "$line" | awk '{printf $6}' ) +ipop=$( echo "$line" | awk '{printf "%s:%s", $3, $6}' ) + +echo +echo ">>" openssl s_client -connect "$ipor" +timeout 5 openssl s_client -connect "$ipor" < /dev/null +if [ "$op" != "0" ]; then + echo + echo ">>" wget --proxy=off -O - http://$ipop/tor/ + timeout 5 wget --proxy=off -O - http://$ipop/tor/ | head -n3 +fi + +echo +echo -n "$router "; echo "$lines" | grep 'fingerprint' | sed -e 's/^opt //' -e 's/^fingerprint //'; diff --git a/src/wraith/contrib/or-tools/checksocks.pl b/src/wraith/contrib/or-tools/checksocks.pl new file mode 100644 index 000000000..3fcc0df14 --- /dev/null +++ b/src/wraith/contrib/or-tools/checksocks.pl @@ -0,0 +1,83 @@ +#!/usr/bin/perl -w + +require 5.005; +use strict; +use IO::Socket; +use Getopt::Std; + +# Checks routers for open socks-ports and socks5 +# Successful connects go to STDOUT, failed ones to STDERR. +# We only do one check per loop in -d mode, so it takes some time. + +# Contributed by Peter Kornherr , and +# cleaned up by Peter Palfrader . + +our($opt_i,$opt_p,$opt_d,$opt_h,$opt_l); +getopts('i:p:dhl:'); + +if ($opt_h || !($opt_d||$opt_i||$opt_l)) { + print "Usage: $0 -d < file_with_routers_in_it\n"; + print "or: $0 -i IP -p Port\n"; + print "or: $0 -l IP:Port\n"; + exit; +} + +if ($opt_d) { + open (IN,"<-") or die $!; + while () { + next unless /^router /; + (my $routername,my $checkip,my $checkport) = (split(" "))[1,2,4]; + &do_check($checkip,$checkport,$routername); + } +} elsif ($opt_i && $opt_p) { + &do_check($opt_i,$opt_p); +} elsif ($opt_l) { + &do_check(split(":",$opt_l)); +} + +sub do_check { + (my $checkip, my $checkport,my $routername) = @_; + # as socksports may not be published (therefore "0") here, + # let's try 9050, the default port: + if ($checkport == 0) { $checkport = 9050; } + # print "Checking $checkip:$checkport\n"; + my $s5socket = IO::Socket::INET->new(PeerAddr => $checkip, + PeerPort => $checkport, Proto => "tcp", Type => SOCK_STREAM, + Timeout => "20"); + if ($s5socket) { + my @got; + print $s5socket pack("CCC",'5','1','0'); + eval { + local $SIG{ALRM} = sub { die "alarm\n" }; + alarm 10; + read ($s5socket,$got[0],1); + read ($s5socket,$got[1],1); + alarm 0; + }; + if ($@) { + return; # die unless $@ eq "alarm\n"; + } + if ($got[0] eq pack('C','5')) { + if(defined($routername)) { + print "Found SOCKS5 at $routername ($checkip:$checkport)\n"; + } else { + print "Found SOCKS5 at $checkip:$checkport\n"; + } + } else { + if(defined($routername)) { + print "$routername ($checkip:$checkport) answers - " . + "but not SOCKS5.\n"; + } else { + print "$checkip:$checkport answers - but not SOCKS5.\n"; + } + } + } else { + if(defined($routername)) { + print STDERR "Can't connect to $routername " . + "($checkip:$checkport) ($!)\n"; + } else { + print STDERR "Can't connect to $checkip:$checkport ($!)\n"; + } + } +} + diff --git a/src/wraith/contrib/or-tools/exitlist b/src/wraith/contrib/or-tools/exitlist new file mode 100644 index 000000000..3fd26b516 --- /dev/null +++ b/src/wraith/contrib/or-tools/exitlist @@ -0,0 +1,323 @@ +#!/usr/bin/python +# Copyright 2005-2006 Nick Mathewson +# See the LICENSE file in the Tor distribution for licensing information. + +# Requires Python 2.2 or later. + +""" + exitlist -- Given a Tor directory on stdin, lists the Tor servers + that accept connections to given addreses. + + example usage: + + cat ~/.tor/cached-descriptors* | python exitlist 18.244.0.188:80 + + You should look at the "FetchUselessDescriptors" and "FetchDirInfoEarly" + config options in the man page. + + Note that this script won't give you a perfect list of IP addresses + that might connect to you using Tor. + False negatives: + - Some Tor servers might exit from other addresses than the one they + publish in their descriptor. + False positives: + - This script just looks at the descriptor lists, so it counts relays + that were running a day in the past and aren't running now (or are + now running at a different address). + + See https://check.torproject.org/ for an alternative (more accurate!) + approach. + +""" + +# +# Change this to True if you want more verbose output. By default, we +# only print the IPs of the servers that accept any the listed +# addresses, one per line. +# +VERBOSE = False + +# +# Change this to True if you want to reverse the output, and list the +# servers that accept *none* of the listed addresses. +# +INVERSE = False + +# +# Change this list to contain all of the target services you are interested +# in. It must contain one entry per line, each consisting of an IPv4 address, +# a colon, and a port number. This default is only used if we don't learn +# about any addresses from the command-line. +# +ADDRESSES_OF_INTEREST = """ + 1.2.3.4:80 +""" + + +# +# YOU DO NOT NEED TO EDIT AFTER THIS POINT. +# + +import sys +import re +import getopt +import socket +import struct +import time + +assert sys.version_info >= (2,2) + + +def maskIP(ip,mask): + return "".join([chr(ord(a) & ord(b)) for a,b in zip(ip,mask)]) + +def maskFromLong(lng): + return struct.pack("!L", lng) + +def maskByBits(n): + return maskFromLong(0xffffffffl ^ ((1L<<(32-n))-1)) + +class Pattern: + """ + >>> import socket + >>> ip1 = socket.inet_aton("192.169.64.11") + >>> ip2 = socket.inet_aton("192.168.64.11") + >>> ip3 = socket.inet_aton("18.244.0.188") + + >>> print Pattern.parse("18.244.0.188") + 18.244.0.188/255.255.255.255:1-65535 + >>> print Pattern.parse("18.244.0.188/16:*") + 18.244.0.0/255.255.0.0:1-65535 + >>> print Pattern.parse("18.244.0.188/2.2.2.2:80") + 2.0.0.0/2.2.2.2:80-80 + >>> print Pattern.parse("192.168.0.1/255.255.00.0:22-25") + 192.168.0.0/255.255.0.0:22-25 + >>> p1 = Pattern.parse("192.168.0.1/255.255.00.0:22-25") + >>> import socket + >>> p1.appliesTo(ip1, 22) + False + >>> p1.appliesTo(ip2, 22) + True + >>> p1.appliesTo(ip2, 25) + True + >>> p1.appliesTo(ip2, 26) + False + """ + def __init__(self, ip, mask, portMin, portMax): + self.ip = maskIP(ip,mask) + self.mask = mask + self.portMin = portMin + self.portMax = portMax + + def __str__(self): + return "%s/%s:%s-%s"%(socket.inet_ntoa(self.ip), + socket.inet_ntoa(self.mask), + self.portMin, + self.portMax) + + def parse(s): + if ":" in s: + addrspec, portspec = s.split(":",1) + else: + addrspec, portspec = s, "*" + + if addrspec == '*': + ip,mask = "\x00\x00\x00\x00","\x00\x00\x00\x00" + elif '/' not in addrspec: + ip = socket.inet_aton(addrspec) + mask = "\xff\xff\xff\xff" + else: + ip,mask = addrspec.split("/",1) + ip = socket.inet_aton(ip) + if "." in mask: + mask = socket.inet_aton(mask) + else: + mask = maskByBits(int(mask)) + + if portspec == '*': + portMin = 1 + portMax = 65535 + elif '-' not in portspec: + portMin = portMax = int(portspec) + else: + portMin, portMax = map(int,portspec.split("-",1)) + + return Pattern(ip,mask,portMin,portMax) + + parse = staticmethod(parse) + + def appliesTo(self, ip, port): + return ((maskIP(ip,self.mask) == self.ip) and + (self.portMin <= port <= self.portMax)) + +class Policy: + """ + >>> import socket + >>> ip1 = socket.inet_aton("192.169.64.11") + >>> ip2 = socket.inet_aton("192.168.64.11") + >>> ip3 = socket.inet_aton("18.244.0.188") + + >>> pol = Policy.parseLines(["reject *:80","accept 18.244.0.188:*"]) + >>> print str(pol).strip() + reject 0.0.0.0/0.0.0.0:80-80 + accept 18.244.0.188/255.255.255.255:1-65535 + >>> pol.accepts(ip1,80) + False + >>> pol.accepts(ip3,80) + False + >>> pol.accepts(ip3,81) + True + """ + + def __init__(self, lst): + self.lst = lst + + def parseLines(lines): + r = [] + for item in lines: + a,p=item.split(" ",1) + if a == 'accept': + a = True + elif a == 'reject': + a = False + else: + raise ValueError("Unrecognized action %r",a) + p = Pattern.parse(p) + r.append((p,a)) + return Policy(r) + + parseLines = staticmethod(parseLines) + + def __str__(self): + r = [] + for pat, accept in self.lst: + rule = accept and "accept" or "reject" + r.append("%s %s\n"%(rule,pat)) + return "".join(r) + + def accepts(self, ip, port): + for pattern,accept in self.lst: + if pattern.appliesTo(ip,port): + return accept + return True + +class Server: + def __init__(self, name, ip, policy, published, fingerprint): + self.name = name + self.ip = ip + self.policy = policy + self.published = published + self.fingerprint = fingerprint + +def uniq_sort(lst): + d = {} + for item in lst: d[item] = 1 + lst = d.keys() + lst.sort() + return lst + +def run(): + global VERBOSE + global INVERSE + global ADDRESSES_OF_INTEREST + + if len(sys.argv) > 1: + try: + opts, pargs = getopt.getopt(sys.argv[1:], "vx") + except getopt.GetoptError, e: + print """ +usage: cat ~/.tor/cached-routers* | %s [-v] [-x] [host:port [host:port [...]]] + -v verbose output + -x invert results +""" % sys.argv[0] + sys.exit(0) + + for o, a in opts: + if o == "-v": + VERBOSE = True + if o == "-x": + INVERSE = True + if len(pargs): + ADDRESSES_OF_INTEREST = "\n".join(pargs) + + servers = [] + policy = [] + name = ip = None + published = 0 + fp = "" + for line in sys.stdin.xreadlines(): + if line.startswith('router '): + if name: + servers.append(Server(name, ip, Policy.parseLines(policy), + published, fp)) + _, name, ip, rest = line.split(" ", 3) + policy = [] + published = 0 + fp = "" + elif line.startswith('fingerprint') or \ + line.startswith('opt fingerprint'): + elts = line.strip().split() + if elts[0] == 'opt': del elts[0] + assert elts[0] == 'fingerprint' + del elts[0] + fp = "".join(elts) + elif line.startswith('accept ') or line.startswith('reject '): + policy.append(line.strip()) + elif line.startswith('published '): + date = time.strptime(line[len('published '):].strip(), + "%Y-%m-%d %H:%M:%S") + published = time.mktime(date) + + if name: + servers.append(Server(name, ip, Policy.parseLines(policy), published, + fp)) + + targets = [] + for line in ADDRESSES_OF_INTEREST.split("\n"): + line = line.strip() + if not line: continue + p = Pattern.parse(line) + targets.append((p.ip, p.portMin)) + + # remove all but the latest server of each IP/Nickname pair. + latest = {} + for s in servers: + if (not latest.has_key((s.fingerprint)) + or s.published > latest[(s.fingerprint)]): + latest[s.fingerprint] = s + servers = latest.values() + + accepters, rejecters = {}, {} + for s in servers: + for ip,port in targets: + if s.policy.accepts(ip,port): + accepters[s.ip] = s + break + else: + rejecters[s.ip] = s + + # If any server at IP foo accepts, the IP does not reject. + for k in accepters.keys(): + if rejecters.has_key(k): + del rejecters[k] + + if INVERSE: + printlist = rejecters.values() + else: + printlist = accepters.values() + + ents = [] + if VERBOSE: + ents = uniq_sort([ "%s\t%s"%(s.ip,s.name) for s in printlist ]) + else: + ents = uniq_sort([ s.ip for s in printlist ]) + for e in ents: + print e + +def _test(): + import doctest, exitparse + return doctest.testmod(exitparse) +#_test() + +run() + diff --git a/src/wraith/contrib/win32build/package_nsis-mingw.sh b/src/wraith/contrib/win32build/package_nsis-mingw.sh new file mode 100644 index 000000000..cae862b91 --- /dev/null +++ b/src/wraith/contrib/win32build/package_nsis-mingw.sh @@ -0,0 +1,95 @@ +#!/bin/sh +# +# =============================================================================== +# package_nsis-ming.sh is distributed under this license: + +# Copyright (c) 2006-2007 Andrew Lewman +# Copyright (c) 2008 The Tor Project, Inc. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: + +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. + +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. + +# * Neither the names of the copyright owners nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# =============================================================================== + +# Script to package a Tor installer on win32. This script assumes that +# you have already built Tor, that you are running msys/mingw, and that +# you know what you are doing. + +# Start in the tor source directory after you've compiled tor.exe +# This means start as ./contrib/win32build/package_nsis-mingw.sh + +rm -rf win_tmp +mkdir win_tmp +mkdir win_tmp/bin +mkdir win_tmp/contrib +mkdir win_tmp/doc +mkdir win_tmp/doc/spec +mkdir win_tmp/doc/design-paper +mkdir win_tmp/doc/contrib +mkdir win_tmp/src +mkdir win_tmp/src/config +mkdir win_tmp/tmp + +cp src/or/tor.exe win_tmp/bin/ +cp src/tools/tor-resolve.exe win_tmp/bin/ +cp contrib/win32build/tor.ico win_tmp/bin/ +cp src/config/geoip win_tmp/bin/ +strip win_tmp/bin/*.exe + +# There is no man2html in mingw. +# Maybe we should add this into make dist instead. +# One has to do this manually and cp it do the tor-source/doc dir +#man2html doc/tor.1.in > win_tmp/tmp/tor-reference.html +#man2html doc/tor-resolve.1 > win_tmp/tmp/tor-resolve.html + +clean_newlines() { + perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg;' $1 >$2 +} + +clean_localstatedir() { + perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg; s{\@LOCALSTATEDIR\@/(lib|log)/tor/}{C:\\Documents and Settings\\Application Data\\Tor\\}' $1 >$2 +} + +for fn in address-spec.txt bridges-spec.txt control-spec.txt dir-spec.txt path-spec.txt rend-spec.txt socks-extensions.txt tor-spec.txt version-spec.txt; do + clean_newlines doc/spec/$fn win_tmp/doc/spec/$fn +done + +for fn in HACKING tor-gencert.html tor.html torify.html tor-resolve.html; do + clean_newlines doc/$fn win_tmp/doc/$fn +done + +for fn in README ChangeLog LICENSE; do + clean_newlines $fn win_tmp/$fn +done + +clean_localstatedir src/config/torrc.sample.in win_tmp/src/config/torrc.sample + +cp contrib/win32build/tor-mingw.nsi.in win_tmp/contrib/ + +cd win_tmp +makensis.exe contrib/tor-mingw.nsi.in + diff --git a/src/wraith/contrib/win32build/tor-mingw.nsi.in b/src/wraith/contrib/win32build/tor-mingw.nsi.in new file mode 100644 index 000000000..f3c23ef33 --- /dev/null +++ b/src/wraith/contrib/win32build/tor-mingw.nsi.in @@ -0,0 +1,274 @@ +;tor.nsi - A basic win32 installer for Tor +; Originally written by J Doe. +; Modified by Steve Topletz, Andrew Lewman +; See the Tor LICENSE for licensing information +;----------------------------------------- +; +!include "MUI.nsh" +!include "LogicLib.nsh" +!include "FileFunc.nsh" +!insertmacro GetParameters +!define VERSION "0.3.3.0-alpha-dev" +!define INSTALLER "tor-${VERSION}-win32.exe" +!define WEBSITE "https://www.torproject.org/" +!define LICENSE "LICENSE" +!define BIN "..\bin" ;BIN is where it expects to find tor.exe, tor-resolve.exe + + +SetCompressor /SOLID LZMA ;Tighter compression +RequestExecutionLevel user ;Updated for Vista compatibility +OutFile ${INSTALLER} +InstallDir $PROGRAMFILES\Tor +SetOverWrite ifnewer +Name "Tor" +Caption "Tor ${VERSION} Setup" +BrandingText "The Onion Router" +CRCCheck on +XPStyle on +VIProductVersion "${VERSION}" +VIAddVersionKey "ProductName" "The Onion Router: Tor" +VIAddVersionKey "Comments" "${WEBSITE}" +VIAddVersionKey "LegalTrademarks" "Three line BSD" +VIAddVersionKey "LegalCopyright" "©2004-2008, Roger Dingledine, Nick Mathewson. ©2009 The Tor Project, Inc. " +VIAddVersionKey "FileDescription" "Tor is an implementation of Onion Routing. You can read more at ${WEBSITE}" +VIAddVersionKey "FileVersion" "${VERSION}" + +!define MUI_WELCOMEPAGE_TITLE "Welcome to the Tor Setup Wizard" +!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Tor ${VERSION}.\r\n\r\nIf you have previously installed Tor and it is currently running, please exit Tor first before continuing this installation.\r\n\r\n$_CLICK" +!define MUI_ABORTWARNING +!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\win-install.ico" +!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\win-uninstall.ico" +!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp" +!define MUI_FINISHPAGE_RUN "$INSTDIR\tor.exe" +!define MUI_FINISHPAGE_LINK "Visit the Tor website for the latest updates." +!define MUI_FINISHPAGE_LINK_LOCATION ${WEBSITE} + +!insertmacro MUI_PAGE_WELCOME +; There's no point in having a clickthrough license: Our license adds +; certain rights, but doesn't remove them. +; !insertmacro MUI_PAGE_LICENSE "${LICENSE}" +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH +!insertmacro MUI_UNPAGE_WELCOME +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH +!insertmacro MUI_LANGUAGE "English" + +Var CONFIGDIR +Var CONFIGFILE + +Function .onInit + Call ParseCmdLine +FunctionEnd + +;Sections +;-------- + +Section "Tor" Tor +;Files that have to be installed for tor to run and that the user +;cannot choose not to install + SectionIn RO + SetOutPath $INSTDIR + Call ExtractBinaries + Call ExtractIcon + WriteINIStr "$INSTDIR\Tor Website.url" "InternetShortcut" "URL" ${WEBSITE} + + StrCpy $CONFIGFILE "torrc" + StrCpy $CONFIGDIR $APPDATA\Tor +; ;If $APPDATA isn't valid here (Early win95 releases with no updated +; ; shfolder.dll) then we put it in the program directory instead. +; StrCmp $APPDATA "" "" +2 +; StrCpy $CONFIGDIR $INSTDIR + SetOutPath $CONFIGDIR + ;If there's already a torrc config file, ask if they want to + ;overwrite it with the new one. + ${If} ${FileExists} "$CONFIGDIR\torrc" + MessageBox MB_ICONQUESTION|MB_YESNO "You already have a Tor config file.$\r$\nDo you want to overwrite it with the default sample config file?" IDYES Yes IDNO No + Yes: + Delete $CONFIGDIR\torrc + Goto Next + No: + StrCpy $CONFIGFILE "torrc.sample" + Next: + ${EndIf} + File /oname=$CONFIGFILE "..\src\config\torrc.sample" + +; the geoip file needs to be included and stuffed into the right directory +; otherwise tor is unhappy + SetOutPath $APPDATA\Tor + Call ExtractGEOIP +SectionEnd + +Section "Documents" Docs + Call ExtractDocuments +SectionEnd + +SubSection /e "Shortcuts" Shortcuts + +Section "Start Menu" StartMenu + SetOutPath $INSTDIR + ${If} ${FileExists} "$SMPROGRAMS\Tor\*.*" + RMDir /r "$SMPROGRAMS\Tor" + ${EndIf} + Call CreateTorLinks + ${If} ${FileExists} "$INSTDIR\Documents\*.*" + Call CreateDocLinks + ${EndIf} +SectionEnd + +Section "Desktop" Desktop + SetOutPath $INSTDIR + CreateShortCut "$DESKTOP\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico" +SectionEnd + +Section /o "Run at startup" Startup + SetOutPath $INSTDIR + CreateShortCut "$SMSTARTUP\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico" "" SW_SHOWMINIMIZED +SectionEnd + +SubSectionEnd + +Section "Uninstall" + Call un.InstallPackage +SectionEnd + +Section -End + WriteUninstaller "$INSTDIR\Uninstall.exe" + ;The registry entries simply add the Tor uninstaller to the Windows + ;uninstall list. + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "DisplayName" "Tor (remove only)" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "UninstallString" '"$INSTDIR\Uninstall.exe"' +SectionEnd + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN +!insertmacro MUI_DESCRIPTION_TEXT ${Tor} "The core executable and config files needed for Tor to run." +!insertmacro MUI_DESCRIPTION_TEXT ${Docs} "Documentation about Tor." +!insertmacro MUI_DESCRIPTION_TEXT ${ShortCuts} "Shortcuts to easily start Tor" +!insertmacro MUI_DESCRIPTION_TEXT ${StartMenu} "Shortcuts to access Tor and its documentation from the Start Menu" +!insertmacro MUI_DESCRIPTION_TEXT ${Desktop} "A shortcut to start Tor from the desktop" +!insertmacro MUI_DESCRIPTION_TEXT ${Startup} "Launches Tor automatically at startup in a minimized window" +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +;####################Functions######################### + +Function ExtractBinaries + File "${BIN}\tor.exe" + File "${BIN}\tor-resolve.exe" +FunctionEnd + +Function ExtractGEOIP + File "${BIN}\geoip" +FunctionEnd + +Function ExtractIcon + File "${BIN}\tor.ico" +FunctionEnd + +Function ExtractSpecs + File "..\doc\HACKING" + File "..\doc\spec\address-spec.txt" + File "..\doc\spec\bridges-spec.txt" + File "..\doc\spec\control-spec.txt" + File "..\doc\spec\dir-spec.txt" + File "..\doc\spec\path-spec.txt" + File "..\doc\spec\rend-spec.txt" + File "..\doc\spec\socks-extensions.txt" + File "..\doc\spec\tor-spec.txt" + File "..\doc\spec\version-spec.txt" +FunctionEnd + +Function ExtractHTML + File "..\doc\tor.html" + File "..\doc\torify.html" + File "..\doc\tor-resolve.html" + File "..\doc\tor-gencert.html" +FunctionEnd + +Function ExtractReleaseDocs + File "..\README" + File "..\ChangeLog" + File "..\LICENSE" +FunctionEnd + +Function ExtractDocuments + SetOutPath "$INSTDIR\Documents" + Call ExtractSpecs + Call ExtractHTML + Call ExtractReleaseDocs +FunctionEnd + +Function un.InstallFiles + Delete "$DESKTOP\Tor.lnk" + Delete "$INSTDIR\tor.exe" + Delete "$INSTDIR\tor-resolve.exe" + Delete "$INSTDIR\Tor Website.url" + Delete "$INSTDIR\torrc" + Delete "$INSTDIR\torrc.sample" + Delete "$INSTDIR\tor.ico" + Delete "$SMSTARTUP\Tor.lnk" + Delete "$INSTDIR\Uninstall.exe" + Delete "$INSTDIR\geoip" +FunctionEnd + +Function un.InstallDirectories + ${If} $CONFIGDIR == $INSTDIR + RMDir /r $CONFIGDIR + ${EndIf} + RMDir /r "$INSTDIR\Documents" + RMDir $INSTDIR + RMDir /r "$SMPROGRAMS\Tor" + RMDir /r "$APPDATA\Tor" +FunctionEnd + +Function un.WriteRegistry + DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Tor" +FunctionEnd + +Function un.InstallPackage + Call un.InstallFiles + Call un.InstallDirectories + Call un.WriteRegistry +FunctionEnd + +Function CreateTorLinks + CreateDirectory "$SMPROGRAMS\Tor" + CreateShortCut "$SMPROGRAMS\Tor\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico" + CreateShortCut "$SMPROGRAMS\Tor\Torrc.lnk" "Notepad.exe" "$CONFIGDIR\torrc" + CreateShortCut "$SMPROGRAMS\Tor\Tor Website.lnk" "$INSTDIR\Tor Website.url" + CreateShortCut "$SMPROGRAMS\Tor\Uninstall.lnk" "$INSTDIR\Uninstall.exe" +FunctionEnd + +Function CreateDocLinks + CreateDirectory "$SMPROGRAMS\Tor\Documents" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Documentation.lnk" "$INSTDIR\Documents" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Specification.lnk" "$INSTDIR\Documents\tor-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Address Specification.lnk" "$INSTDIR\Documents\address-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Bridges Specification.lnk" "$INSTDIR\Documents\bridges-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Control Specification.lnk" "$INSTDIR\Documents\control-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Directory Specification.lnk" "$INSTDIR\Documents\dir-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Path Specification.lnk" "$INSTDIR\Documents\path-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Rend Specification.lnk" "$INSTDIR\Documents\rend-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Version Specification.lnk" "$INSTDIR\Documents\version-spec.txt" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor SOCKS Extensions.lnk" "$INSTDIR\Documents\socks-extensions.txt" +FunctionEnd + +Function ParseCmdLine + ${GetParameters} $1 + ${If} $1 == "-x" ;Extract All Files + StrCpy $INSTDIR $EXEDIR + Call ExtractBinaries + Call ExtractDocuments + Quit + ${ElseIf} $1 == "-b" ;Extract Binaries Only + StrCpy $INSTDIR $EXEDIR + Call ExtractBinaries + Quit + ${ElseIf} $1 != "" + MessageBox MB_OK|MB_TOPMOST `${Installer} [-x|-b]$\r$\n$\r$\n -x Extract all files$\r$\n -b Extract binary files only` + Quit + ${EndIf} +FunctionEnd + diff --git a/src/wraith/contrib/win32build/tor.ico b/src/wraith/contrib/win32build/tor.ico new file mode 100644 index 0000000000000000000000000000000000000000..0cac29704909962aa55677fa4b8b06c74a1401d3 GIT binary patch literal 82726 zcmdSC2Ut~UmM&afId$b=4wyiYoO8}O=bUp85K)N=B8o&60}5geh@gT9idoD#RP5?7 z@y@-^{b%ORbXUFqyH2^QPdiq1_e|fJx#xM_XYX?kXNT`y>04`kn-^aA*$XefP+9o` zx3gZ*eEnxHxW4eh3;O!szuzUfRs)$uytzoCXVxv!45 z`2J6U@*DMI$-W$4Am>!S4rTupelC#fRlf(>f8M?R)c7dh@u&Y!zLe|#vF)?tp*~&; z-!hiU*vgoz^D7()mv0k4C*FCAce$lD{2RQ_&jcS3A3g{2x$-x%RX>ItQ-PdE&L`)U z^Q+5>A|Gv%>YW91Ab%JbuLYA3wz> z+Dx*jw{Dk&L!s+Ia1_Cu1jP@_2b3l+XC}fBTnmt%b3g93m*!f)3`sKm_f`WW)T|1 zoTr$}?YyU$&+URg6Y?ARy&Oj%$CcyHCT0kn`yfa&EZ> zxgL=hMNVdMUu06`Lu5l_R*?&lXR%*$&x)N8c@X;`vLIt5<0WJFyfNj+|E*rnyGHp; zu3zC@?n~}Z?o;f!*hm=z;akQ8BZ-j;aA38co0s6KXbx@uqJE>Tf&}jARGxN z!kKV=25x-sPIx?p>`f%5k*+!x3(<22EIIggyrhwvig8bp3XZbVib2t`ILxo<{@Y{)%{ zT!=i2Ow1)_6EX%O|B5Uqc0tDMRYJz`d2+yy|4U!$e5>y(+{?AgJ&27H-ajVfKE*DI zF31=te2Y$tK8sG-6HbJTr*N#!ukfI78o~Xjr- zCKDeLA_rnC#U8vuyhOZ6sE;+@{+GPeuR(oZu21AuxEEXY4k7m<_cW83Pssg>F31=N z-wuR~kHWQ#o$xH{Q5kZTp$6xk44A~Gv-;YWB8V!xaSMIKDK zuTLx_<`H5OCJ`SHKPTQG6d6z-Z)Klf|EIl_b3VHj?q4G0I^}wW`;Q2*^K%GoLS){O za3Ew1WGsYl(Hn(p(XDtwoo5+qgcShNawBhw`2B zx61G3SOPh&9A7z?oLA&XT~OND0{XBl@He|2sZP8A-@`Ta6AEa$$072H=x1>dVf{X6A1vQCrk+)LiA=b@jmeu@hTxYri{7z zmLLCLeW{=8dHce@y6%6%_p=CX!i;bvyb0l5Y-0i;`XRb4<0H0K_?EGImTPsM)j3vp z`hmMQ-+Z(7lTSWwm^o`^(}D#HS{E%^w87BOaI=YtNtd~~dAFsdMX!~W#cpeB%RM$W zR(ox1toK-3TkSG4H|^EY)$Z0e(A%c3ueW*OLahz+=FM%LIdjIkk3asn{*5=@sNr>q zyvVtf^Qy~-A{%n80+9=mRgnw1A4MkQK1H?_c}U`ZJRx==i0~pD2opk!m`Qw0{8!q5 z=kcw4CcFzoE=4}yB;F%LZbkRSuh|gpgxsIlK)Gkpa~TKG6VY$QcFVXuk8fqnW&DMQ z%9mbxsp|a?-mRN7<)d{oW>0NfpfzukyNB!E)U<@-D^@H$*WA4BMpxIiNBj2e`+8vD z=-&(v5B;yvv6KIF`pn3`j-MO-_QJ(8-<>}{{=4yWr~l>H@W4NA-m&R__U`Te>)zcv zzG`k+`(Wj&s%z!tOU6@Dk_KH|oOdl;xNzg#Idfa5PMzBL-h1z@dhx{g3q5e>s0)budg;eYBoeCXGkH*LOKSy6E&Dk|!Lrlw}clqplze(=Eu^{>AAYBjI(SvgQ-LGc-K zf9f_t( z$ao^5*nM^Vm$CUbGVt=tFIT+%^S5iKPMzFnXJ@sos5o!9vvcE}fx-U2J$rEs11Aq) z==5O>pYF%ldGdAXBraV!i7Qu6;p(+>xPI*_aUIvLT~p!4jqA8^qTx<=f<&D*zd>o&jR{?+RfxN-9uZgT(Dt()Ax&fiZESNNUC!7wgQ zj9}vGSzNj#c48dkm&S1J@_E{gaU4If_wO2-@~_7ydmoxTdrBj(dpYG`>Cb-l2l_7e zr}%%-d9i~@L>v)81QMeAc7!pZNz5R`|Gz`LPAK{>94LG|Z_BU$L$Bu@Q$ADYUiKC4 zU*^7CoA58!`VldW5Fa3NEHYqExD$RvFd=dv_ntt=Sco4~`Gt=@dVh(Vr}Kt{%;+;Y z%aec8wqrF0hxg&^#p5`0=@>3uKZ&b1$nnj~uNlPo8miONKx!5$(bGa{tbCG+w?`R^N z5SW3JA_k8#C6`***7?3n83mHp@OFW34WA#y7+ zFqhCFj0j7@fsh!-hX^1-36X`Ek3W4ccfQ_?4(CAY^Wo|Kf16*O`P-Ke(F5f0!H;G&1@ACC=oH(-&-3Oac-&TzBx*TloZo$nv zqU)D=tWo~vB4yw)=rPF)uHN=IPU?iwwjP;{Swmk$=$x ziHlqa(Rp*ifLKT<+<(Y@(Wf^Fv9JG~_*b}>tz4H}pU9|O>(2?1+fRt8gxrtVvqgm1 zHVZ=T*@xpG&*IAUGZ?#Y2s`>} zv2kY^V~sb*8!w!T9#|7%8-;h#`T4|5LgFW}p`u4`5sK}99{-|;&(l|a{O@`_?^yDgoJWDe zyC8Ek@)jD**>7yO;A`J_hkx`yH(!McA~b5hqR`#4+-Je7px|FPx-5xc0prxpkRbU&Mv$ zqd0uB7yAdc;>`J@xXtt3x!_!l{q>lGUy*Dm)U_aZVN^BB3mS+BhM zvZl7-Y;PSyjfU8?z-Q#z8RS8(TrJ9^?#KDs-*n7MM$IkA>g=^GVa&&{X z{_0J}URREy@62|z9;(NdL(MpQZG^mBQOSV#{9B9#Zr;2>A8?VjqZ@VGDp0v)2~um~ z5V<%QWvdGrzYUVJ5ypz+DjRU|`e}?`8^ZDP`_VVP6FZK!QC3!C+rD+!ceE3yFAP$y zzKozULo`H7$rWQ@x7GwR^Le#8HMrj5ArqmztX%7FI zkm~TafgvUnmX>p?O$=v?4;0>K5i%|^J~B=+UZOkd+{@Ui^Di8zb0YiC6Kg9TYn7VzMe)cpbZj90f>_q*>QY>DbjAdK)~1 z=&C|}XAO1@bd%Q+&gak5USB3I(O#dx;gMc!IoN{YHF-#05sSjQbgbK2h5h|q=o{?j z{B8)RuMA=I+HoAaa1cisHyl565JP7UU}s-Ds#=P$vbh{5PaUJ5V4O)?bBXcirakLW z*^+~>414$`SfIF;vOqaox;7n!weiR-4MlX46Jk>wk(%#~lw8m6(z3n&Pe`!IX8~S% zy$&{7Q7^yr;&hIS_(}2gVlNf$MTZpKe;)q|4+=Lw#vKpyC%>L|4CVN;RnDo{{6Cfd z_a{yMWO7Kjk41J-;4UT|13a z=lZFuThZ9F5((uo2+HwA$?9yZXembQ;xMF^L}JUHW^CQxLHXH1xjTlFX9m%=dlOo= ztVUaR9hR@lLujfGqBA0}s)@1a@Bsb61TNBk96Y{-v1KZ9%Om;sRXBWnJ2viGhZXBf zkXR6k&^QO=6#1cWX%G^#Tu`<=0=d~9zY7a7`ddFAgUj>heVRLe-X#6kUVB+|U$_^Y z5&cp47oAe<|FbsWSv&AN{`m7h>Gizd%4Z7ye=7HK-HQIp{k*H8F>7W)VW!Xa-R}Q%vqp;ojXlcyRX~?%!h!clRPrpFcvIJAje1eb~Hr4L0nm zSLx%a^UU>}--E$3-B`MAF`N@TP~A~W+uMWPN4Mc5?e`hRb^WJzt9Oz+jXSK0pg^XJVeTe>)Q;P~$Sd;7QkY6<6I z!AWk6&707;c_}vTXk-k36%QXgz{C3w@qpVKjL}b?+l{e{hnd^kkFEpjad2n{?K*wI z&GYpC$5GQ(hS2N?>T)^bh5a~qY&ZJoKTcgdgwZR9acHCmJx8{nZ^-;{RcjZ6{tPP`GO@3}9YbR~FnXpJ+jll0 zCdmUSS+2;)a6@pA4J?dj!(4YN%ycGyWvn~3d*+mP11JMBUlRVGX9Lt_K;ix`VFRAW z{U6hPxfZcYKj!z}VGV6TK~YZD&b^yY?Ks%_4|N-tA}rer%NlcO&s(sozeDBY@7=$R zM-LwokMQ8(J)FOO9LLXX$Ei!ZDF?mS!};HVk!_3(PN?Q)XD*+@(#BFOsV^ZG|E__0T$k7 zF!eG-a%l`Qm!~4TDhEr}E=3-<6>FDZ`@T)+=x#%PbvA84Ad-ud5SJH^n)FW0>#x2nbHG2wzv6=xIZ$-<$GGGnfAsad-zdlXvvvR7 zci(xJwN$O*vclpG+nXjT))oG98DpZ%sz`)nyP~nH60JMxag)CO(c}Ag`0zd+JtF^) z9^wAOyErPU-=1fkU>L*a22jzo94=vQF!nHq zo|8Ue3u3W)OCvh=ZleEQhQ+j1^_+`t+S!KsjvDwRxx(DX2%gbyC|R=q6NrSuP&9N@GA`JI%C)6%^*2ONh&e)o&Ef8(30IqW za4?wx2h-WG)}8uK=9-hoXMXzgl(%1hS>vS_ej~=M_?>@K*)f)=YzHcRtj_tkM*EyZwu$~C0Ihgy|S$YoA<0m8Dq@gbT0&@ z`5><*534qXQz;rYmeZ%zp?hyD)^Dk!??^|&;&7DKXJQ%S&X5=f zc=;J2Du#0ge`DC$&4Gih215Kz;p3tUYr`4enrcs)(46^x_J{AhKKJF9ex}R=l{iq{ z2Pm8<94VYB96q~!RtBE^UU{z^N4Cnb*-M{T|UF$NW zE(u4*@=&bWkcYYr+1T0NNI%TH-pD=`_fMWY!ef>0lmCYgaOeIF#(OQO=_tnjdF9RWq^L85679O zIWW2%TaLD(U_NGR-+Im+TCt+N6h-y9Wg(5K3A0b)ca0+)qSwjIjb~j+f+I)0uU&&g< zQO*xWv1xZJq6>oH9AbpPNGn9gyTCix0x5ZZh)i;Xi?=d5AxFseh-wuN+66dxd|+@5{9) zxgJ%#Z|`6+r>$enimu-F&q`}E5S{DE{HrgD8xm00nTwU}*(j?^=6op&hfnlyu6LcB z-=W=q@V)PU@DLIU?B_hJp>r8}4!3h2H;i-FPvF2<7uM~n#M<8F=;?1JHo!k45IYWc zF^6{s7q75R$9l|#D`)9H$S3pu?FUw2E9Gs&!8NGssYJ$BRL3Sv0vcqu%>6ZghgV zn+Y8JZ4sE@iOB3=I0Rd9-WQA>#;jd?nowMwiE!Er2XB3ZMA;#odB`}%29e1w@CYzL zFh5Jp34m{iB|N}_LRZaeo+PzIzfJHol&0krI0i^kqM^d9fRq0s|a zzq=VJHOa_YosNpmrD)x~7OOT_GiKOAS?a{T!EG2}zW6NTxIF{RGi|NI>aNv{1xpZ| z!~9)oI2PBWQGT-!nBt1yEOJP_&RUuVGbbb1(;p?|gd$@}9HJ=)i>tDbm>mKKH$8ax zn!t*B_2rjel>E?->A%9ix(ujus=lu-0P3GB`wIW+-2bHRzx?t`?`PzP<*eRN`gv>b z>hGFaBVE;1j*1Nh9KSTiK^|}oH9hgOTg3?JHyD#m-v;Dq<_+5w|3s@(>71 z4>R~gIlwc_7BN|oNXkuwv$rMm4W_`-Y!;l|7QsKt7HK7+NX++Ry|@gQZXZJy<;B!d z69LgS@TY%p_cexv)dHB9%!9j&34(mBzjdSqw0TON96ReRCDwshB^X~#;GGiF-WQG&Isk5;tgBZNBR z6>W>e;!t=eI?-oZFdnF-&fn#n{|#x@;GF1p16&*3u`}f7`ZG&TB#ql?XE*zQz<G1DhnSQA_=VU}cJ%)_ zKF)i*Y)O{yPw@Yz+5jHnhnK>;vi&js)ouSD`2GClk*+Hm<3{sV1pZ@LL(+F``>N49 zvIQHDbfRQ^8S?5gu&g~FsnxM?V=mM>&;nMz7I5&hVH`e;2ekd?t}(|;{gr->;qiW? zE{;GvePVSJ<8JcYKYEBc`~x_8az8FyK8bPmfgGhxAEnKg-mRk|HFK}GO)8OuVkl6I}*U^ANbGWJ2m@gvT~_OSM|pSjeFXx_3G9$^mDlN8jomUC_vh9#V5pBO!gv9m+e z^|Kf~H_W{LFiu_=LeHUI+63v*yTo2k(eDY$z!jXExPURng4>Vm#L~9qC}d2MvML*y zYZjxhZ3S`~Ik#)8Kw5PHsx~#C>sT-Mv*4W;0H5Rlq%gOT!MR&hQ7H2QK?sU>$07?& zxCGdvUds$+^*f%3D6`9OXPu5{zuLU}8NVQHjpq zZrob&>;C@kmL*FH=c>toqMLt7{{N`$fAzIjKFBNxs?J{Q^Ea8rUf}*xb}?2oRdBvG&iUUH`v04(pRT5zKFtXW3+iN!kRS596y#(F>d@2KBn<6{_Q-JoGx2aj2Wo}Xu~)r!9!f^vB@Ijht_6VxF71kk4-5>tB4y zIOrOC6Lwp|e8=&x}ZpRhduD<2Z zRWJ3=WMBE6avYHIoL>~Rm3Bw zE)$iTmSbsaDZ&auU>9kJz^owlPSvC9@HXb+Pch%aTpx2khlUQIj(K*m*9ZG{!zaQO z?jf9Sr3RyRZ6#W^wQ_D<#(1rRV|5${2lp|?8>LUb$bQTT)NX1*P(c!7_ye2=vfuma zWy**60QsIifw(krnSSGf3M${gp3xKZ{hhs?Sk<F@dgMP-RMxlsIoa3owQHbCJ~w$E}b@0FMO zcj~`+mj54Y{~K?<_O6MAwzWr~$v}95{dbG2;=fBQ3P60JFOn7qFgNbUZ5VB55>hIX z5zIV^Pr45Z>+@KLqmRGCIX~z7;`e)w?4y5eV*lg;T$nhGRm`V5`B)$%&Ihi6_OSM_ zKrnN1rPR%yqutnkU@La_^{^LokX&9;>3eQ%3G(ZihaY24=!EocGZuIXrRVz(xAMLC zi7V{kyhvF(%{bKivzBhf(HqX84)Bk0 zM^bhmbCi9!|M;p(@4xx_7x=|D-{6~HeuH2B>KpEVfiJ&$h|j)YFXF>%oR^-$k-;4p zI=Sn+v*%9zf32Gvce(mlYH{u*I{7UB!k@yYI>*ZXpTfT)Pjc)Z`2XO;_ogRhhObO3 zi2Qp8FMZax9T88P7nSCLaOO&)bA4&|f)L3$vlsJOo~)Z^*5+XQp)U6BT*2p`e~w%C zZln9qPWs7WbRFzrJ+20eSEMmka)PCU4&42$;L7;WzcvtoDUuXaJ9|imU*)M+W`c>wb&SPNYC~HX_^hNbp z)v+A;D^n4jAB@P{aON@+Soh1onpWnDSWg^dk3jQ|wXmhF@Q$V*aMGoX*JZrF2zG9| zaPXuYFvl0jTwiig1S-}q;heIHb|eOFu`X~4vB8>_3Osy#leqOg|G)T}Jl|!%<1u1@ z{cTt91#QAN-+WEm@CEJVJ=(k>43F-_>9favx4N_DS1HAz#q`6HA69I%qW}L9{?&C~ zj`suq?|<;#M*$(;AvLR)-s{@gfv`j$II?yYz!=yo$O2A5W{AlPMqFV8bEAF;&k4ga z%Kd?%L!94D;Qsx4w9#j&SF4c69;_PHRO*^n!_nIs`pkJ5a?WdPJQp^0izow(tDTIY zsW%%2mfCQSaAUtlJc?PHD_FgR`GvJu+_;>%fm77^YpQwO1m}Xn=T&ll?T2+9T<@VK z3%_6cA?pF8&!2zG-(0_OO%*$wV=l3$Z#%N9(-6mbNNr0MWA$C=Ki-EEC%MLCocx?R zjMiPP@JMiH|9~gl*%#p8Z3;`LMQ~y4;uT~Cw;*%aGr#8$VnO+dM9rouq%#-j$Q*%d zgf06Ew&3$GIQM-xfnWUMG41|i_8uKWHT#${IA18JDM0hq7L1)6!xvvZp-;F&IX%vL zRs-k4O<3Di{oBMs|Lg8P=Jv0@@v0&N&*T4jKH#VHU!8wNu3mlR3HGdaRSsR{B^&$8a_b%@)AemSY?4Onc&s z#Vw_1V*f@9=Z3NdL)LakZTABGx^Q`kc3|+-Fpiu!##oSRfNm)3eYoy}>p^}L{JZO1 z3v!Y$Scllaxy4Z&8DegNal5pUenPWw;*zhpnSML5GH$QEt^HZZr> zVH}_bH_C#00AoeUfKP%8R;(*w&+u0MrU<62H~X>=U<><=uHU=NxaSz|JwAg+U*5vW zt0x$ju0%vpFnl<-^iK*v&e9z0*t3~&PdB!*->hS26?5aosM}clU37-)Z_BFUTD*Mi zX1@LNHzgMM_wuj!3fVr(zsmN%{no2fbQVrccXT!Ta#{5f?Aq5&zr7c&tZ}truCYJv@#jzQ72}z^DxE*avFoE9tY+*Kj%3b->O0pWAvYfL^)xVV;S6ZZ zn*?(UZJ3&KzGJ1s+-WTBOCa>j=JWkR7~3p_iK`xaK7z3G82fyfvymLYIj+AEoxaGp zZ}*YCjOn_VSJ}<^SuIk^@)_T)#o@tzmA}7v^A@>(3e}nqS@-dKh+JH!{9IvP@f_C} zU7+lqV_)y4gPllOp2%8Y0eaapSixRE=P)PEQ>o2tPr5hKS0-~_a)@!uew@9^`2ULuJpA$w#xBzj?OH`& zm&=}nXm~`hP7vbEd~pcMsxz1$;XG#l8st<&!8gi^y`>S4>(>_rO_}&@5S(q1^r%F)U2kcqV}!V^MJRbP&_&CTdLx(}nL2XT&l zmUr%6z`ciDGecW1@mTMnee|czs9v{A+snQOR9@u#~4t@WG-U?Etq>4u#TFCorgP_2N+|le}?nCF~-TG zjNwjU&9)YVQl^3l*Mvamdsx9Lz!}-g7GuwmL#mkZ)-A3Pxk+#<>qXQd->KFBJzWPR z`Bg=b~^ z$M{#|Nag!y&73?fF*zVFza;e=4~}O-MijF0JU;K5!w|I{effU{UHFXEga9}V;i9o?PGXGCDuoR6?@{#0mbOoEBgTqI`%!HIR0 zMdZ79MK0Qz3rpmA?C1w9+>JRWbHHlOD_3u-WK2Pye5#+d+}&8YwVkZ4a zF2~Bk&kn|J7MNqE4Vz#Ol&xDyJ3dI>Z>i=7H&yF>e!tE~S?{B4MJ|MY$uFN^uUOBq zjm%%w(ypXq>B>b{Kh`cB?vL9_X?dD$Ax;t3ktZC0gVKs9Ou{?ILF+w<>jA7j< zh{tkw*TZ_|)q9zjc5-JfGSU%l&RSSn9{u^|?X{7bT63g#T+x5gV@0nO-j(f-@vpA? za-3J__up8kInz2PC#r94a|H@Z)8Oc80$0{Ot*MiXc+Wa|Ght*#+vi{ieQQ0;w^{@< z+N`9?Jl4}&X)mkUcN@dG`WkHA*G29lnHQT2O|8k$)tn05xs%{%ql?fmXPDC0>zmAG z{wE66%}cOsT^Y(7mm)TwIbp^Z)vZghZhIqY>2q54Z)D!K6M!UX>OuLY8iW-`VM$9NT6$Not`Nswi6G_;qIthw%qbevkLbaV{URPNybsGc z$Y*TbwW|SkE?V&9eAB^d7FI0fI+Vkkw|jfLE@Tsi=&Zuyf0+MIK78v_OCyaeA2-vl zVx!!Uz#N8OAnmHHHf$XY;UCI=2IfTlL!ICgVvoqwK-#quR5RDLqOA%g?9t0uk%PtS zDp9wk389Ihm`QzKs5ygna|#SJr^8Hp7WC&&gN`PlGYyuun)Ltv$S#jX=F&Jcu^zbN z@FwPyixIjw8a`Peh$)Ll^TBnf-Pwrco%QhMd3`wFOezV1Z@eo^T#TS?xd_^nE58(f zRjk;@*u9V3?>xr-{_$aQ&w4X)kA25K;2!tYAw9{&ZLSL(9PLMbO(r6;{ji!n1iJ>; zGOyT(;#CRo3A2U^a{xZR>F+7Gng$Z4({5+A_)!*#Cf zyu)17J@y>jC*Sw)-v1u=xV`^9q!;=A{RjLTz9+77J$Toljfh_s0>5lWtm#_9`A!Ob zRTM&{7sO%?^!290(3CMNa~G~&mI#V=M_6Vs;!C2CRu;uMPaTe&J%F|BPpH_k4BpJ| zHgSFP?MK&`!`zPEqgyaC(T|N>cM_c&3{U2mLOG}OrfqSg3^c4RLEENPFr_S*E}8{z z+J!{+5gqQ^hM}Rsb_)xO`F|n)U*Y=o*ED8)5aw(-`>u=SY-BK})wr&Jxr;IkoI1cU zJjeXRW8yPDH)EK+TjPwGPhidZ3idcL&k^8+H1LPg|X3mmA;#D z&S$DM6$a#8Z}udZQ7-Hm|9g4S?=iNGNpqy{b7nuK6LaD0zgZQ7;-(zbZe!mDdwq|v z7jSiVEyvIq7R^=Gc>_w5!6x?Hf>b(c|RQ*clCXTZYZ6i9l7Nv;wVh8p$Bou}qoxaJQ z{hYS;bJ^c%3l|sWE_i?QH5u2kc96+@XeRUHvZk%`NCP_h*J1NO8;`+t$y{r4hu1NB zna?xe`ojlbKcYX_2%l&V+I+?ntRdOx&Y+LfM14acO1OT(#%LDoj5Xk7J0FRO9vB$h zi_y`MD}1Jr9iN||_<%oV|CR5RtztJ+zJKbJcQqZX=63qgxB0TZ=}&(X#@?q~>SQ_V z;U^i#+_^7#`|Zr54qyl4oQN1#=0S9j&HQLB?SD}%`(QXeA*}fqEQ>%=x+^?fb>K$- z;l^0W%}NUvi>ASd@xLi;fsxKE%Ev4?uqGbB_%@P zM-%5|nXKPwa(<{|sYPhRz{Qk3TYjkAP=q7QpWkLZ(7Sf+{su(|7LD6pEXTut|v+78uUtZ9<0ZH=J6UC!*uQ6tXfyJ{lGS?WBfXPg}vlA zFQBrm9$sOt)Ok&~)6ToFCoq7vU~OX|BAGw3HJAZc_6j-J%tcjYHn~56Q)2^MTM$_@ zdGd#{)>gPwcva#)Wy`NrFXek>`v?5bnEIZ(z3HscFy=F>Xp8G>k`NYTj8yi+wXl!3 zcVIJ`cdlW*vKYQG``HJQ(rC7B#5%ud*v8*N%b!$@L=D{4V zn*m%|8}qhf-GqGG8_a?kZKs(r<(zutA8N+lIL5qwrm(PI2t&(xFy-9Zit{Sh04w&B z_`xaC8Ft~0tlv4n*w+-=F4_oVy>=t(B*T}EW8&r|@^nwNwm`){`ICIa18#5Mp&j5F z|A)`v{s%eWcOpBg_v}%6{NOPjJz(AH!Cm&QQx5n{kaatonIn!wP?S3=ncvII_GO&T z`MI+I|fKS?!){md;~VLi2jeM@1%HisvF z`mQP2{SWbPYNGkBw~Il6mF~1(I2ukzAjdWYn)47X+7KK5O<-OK zvZ~UV|7m64_c-;Pypy}fkEFl+_fWW%cu#a(^*3tYD}O6%Q6BU6PaZw_0rK5dK38ND z^MZ?+huE;U1?kI@;pk@xYtH*!9SvYbzie$X6Q1NhB*Y3)u}%mJw}vlcc^}RTTzzyA z5Mjw$u?3vH79lj+j<(SSmRuK*Tak*@8)`V;p|4Evg^LaCq`n3`^k>13c0Qi#1~L;| z;me*7n}t(gt^YB?n0GwS+($3hETnKA5*y|4#NI?B^24`ZmEJ5xuNA#lw%=?2@4r|6 z?g#z%@GxBzA8xb5(O~+&dYa9Kul)kV23sPJwl$0EU{$$CfyT3i-DjgWv>cT758@8;)d&Y1*Q3HGK=|hLP zu0#B~tS6Cm1=3%j;Iq#@g97C-JS|p>v?daPY7r2J1O0hYrkAjvnB_{6$z>y zpfJu+tZDx&EM~*q(~#>!6Icsv;9A23gfp+~!91A5qUrG9+}hJu}7prol}2V{B}#RXwjNojET@2TdeJ*#AqQz4n@^@4un(AK~A|O3ORk&v@KXpZ7xB z6X>LcF!m;TG6!qTyqAZYDQwI&VNM-hWT3%3ohi94WglKY`&cehPuO>Lmi_q5ogCx3 z?H=YVR@5gWI@u9nQPv2d{D;!UJ3G#2Tr(dQ2GkqF`LH)#2s8aT-`4?b^*H}!FC6FZ zP63Y4GUwdEav}T3yqG`D!!q^{9y)c9ydP)Z%pqLin%qa9JtohetLltWYZS!1bbPtukkF7Ft_RA zYys1SpTdKGf(B7x#C1A(C&0L>#5|6&RieLQZF?$(U^LfI#)5BXh&(FKK z?joDHsF0rrt@F!Qs3C;PTMqPb=-(waRE{>)==UXtvonyXmS#~aT3 z7>3Men$G_Sj`U}qR`ck~v>4|w9;D7%(dIe(nZZB89zjGnYlo2uUWj17ODIv(xD1V4 ze-a$z1{>sq`lhxPDL+-H6Av#;;q%U@Fee(@RWe&;aEwN^*D=5}Y_X4+@w zI@*_@wTo+O*&n>5GKu}}v~jHW8&F?#sXuz03+gbRuFIN`8FM%0%-@+ZpBNG!#NTlJ z)*0sfS*Mjc`L%mD(0O<_YPy=y%D#~CYZvf|yNu;;(`Q`fGe$06yTbXw13dZsGxnVJGiQ^<{E;W} zDpL5Yf=cADU)z&@(1z>wqJvrYV{XQB5!di8U=GuK0ir`38OInR(1USOs12f-7lP==W=FXhebyY81M4*@I{H{jR5nwfkvNHXD+iJX5Ipyt_<+&0+#lIpC zik(pTe_QJXR!Pwo$4j%_v4lMxVV*khvYi7r<^cRT$B7QJL1AGS)~s8`=Od2cn_qv4 zuYdUke)XHL@$0|(CHKE#kH-z>0@#aBA8`ECew<*w;1JhZUA{F=4o{(}Z5aYW*i*;x zOUn#LYFa4L(!&s+9LzP+5tOS8EMK)4wagptJlKmH%+oxeZl7gschAT$+Sxm_jP;&% zy|UhK2zSZfXXNaQFUkK`U$ST7EA~}A;X3aTbnM%PwYxSUZ)G{63X(ZzE5LsCBAsL3 z$Kx*_VT3(`+xm8KO;|muI_j~H>xEB@9%sJqC^~xABa=D1+Vv&qXU?``(@M&$uFB6l z8qJ0i;}r+`E}5hIGX6`A^M;SB0bJ}B!iP1$FvhTPF)oN^u0DtPh)nhmhtppKGQJJt zoW+Cl#e$+(l(J{opS3PK`g~WdN$}C03}5o>%NRezWEv6}PsZ^#?u?fl4X0rD)cV5x`_wa9StPz%<;W1Il^;>C?7KrfH zMKI@Vnelcg4o7wfqWy|M!1~-*EdG$MnGy=24$;O~>6c z%$*OhPJ0ZyXt(zd?Bz3)c5xn1gY<0niBMlUI_sF%C`0wCLe#TYW?lO-#bJ4fJ=N1BWrd+Mme97wnI@L46)(y|(|{DLy;s7!EPdw|Rdz z3LDFjz`AKfSppVujfR=@)tAPhYGVc0gRJ9vkDYve#7e}nHfbN`0w>0lQJG;#=Q{5t zjAiqdu>Xs>?XVb66mmZ|F9t5w+OX7S&SLIIFq{7gY`Jewf9%RQ$cyz0Hxmuo%Q*<3 z?GK@i^JPB3hxv|R7v_gK-}NQJ$-B&}quC3T810G#p2L^1tuv41N!uU5JgC1ub)WV> zjrJy+wj+vhzrEfR1iPEy{OA!r7iR(izKkE3J9l63DV*nifB?qPK76KtgT}ifGv0m0 z<!OR=5igguO7nObdbwuXl?Gu!&=rTV&ko`VcROMwd3=XsLz-A z?4-wE+{dqe{Y!Gq=O7&F=DPc>%-MHh!|v5wJIm)Z@i{6>*<+c_dY%IQ0 z?Pa8fB7*C%gJ=&@@&i$|nzg@8^{8H3gUFH`gjX*`&HmlkI&>VH`VQh0ZNO#L=e}XT z+}B@!jk~n%JJ_33-m?LD^r10)Mnl{(uGcS3KtKWKg$=B|G#0>)y?4&^wZW_r#^i-^ z4j#$%yzJrN+6}t^YnZUd#MEK|jL4k@^Q{i7A=pYS%U~|!+y%_APJ;bb^4Hn5xb{rADl-T2e5 z2hb0=(U;qE-eAXLxiW?fVLl{;aa^#S7Luc!kjzOYd9>yU1J5Tc2e?#oqy2{$!=k)PU7_(nyzscqkhf%$^3;7-E;9Hms zclKF$aX##q;f>Np)*-uUxehakbyY6}vj0~4wS2fb7I`$OdH@%`|C0PQ@GQ2yYn+Q&I4Sv zK7pt9Bm{Ck8_pa~An)08;UxGQ&O`#^!7y{$i$#;*!OuL%yDN|5t2-It<}(q){AXsI z3(`3j-mGWaa}JmgV2d4_8kxVoj>hJCI2bWc!rZAl?Sz*$WB>Ud!jH%DqKr9AfAjAb ze*Ajr&tHE<){QEDUfJ>^)k}G=`2QCz^rp`VaGci{;i>a&W;FZGS>uilGC}#0Fx0YV zWjXUzP3sGgnd5~LuInyh%_^%X45iG+rshW?kk3X4VcyzTd|a>{qN1JQ&$!o(>z_P1 zX9#jIfIH`n4u*^;ST}bz=6YA|+fxo4*+=8)Y|Of%J`9{pVHO<@=hEd!-PnbWvD0WB z9>V(J&YhHl6dvRr!o77r@GdIV4_-E1&(4o*Doba%^eD90adNu1T)Zf&GUr^zS~bNrv&+ z5Ang)aH5U1r#?IBOku1&6K>>A_;;u7d1+2j?Yn4v1UJ6-T{sn?`ZE#6-vkpu)a@X~ zaAC9$0gFB*rl@q+hw-B?ZGQlt1rlU771^QYC`$2Syk$uJn2Km}zqhBAJyj2}pK-6b zi5Bb@e28@R2o$jX;cYepF3bnS*lQt(^8kk#Z-48c@qWkrPv4QX!wS#J_9^{8eEtLf zrn=KCBm9g;6Bzdw=Z9b^ZDdTS1$;fUk)Gj&7RK;xZG~8z?~bL*0+GSzxj56$6_l{= zpFJ(r?EP=z`l&+xHkv&P5$uEWqp$O34%drwMNjs4x>E0*7~?y!-_OZ_&%Yq|uJnB# z?4@#&yoawf5|-tmU}Gy%J2oP2!xn_Lbs({g>o-qw?GO9@2PdwfY|nm_@7#rk!2zVT zH6gWS4gaPAPSk$~+8|f1y|Sadv1P5)iSzK-bbnMZrt}W5W8Os*PByHm5pLu^G{_E) z>}PPK-aD}u#fjXz8gUJ#fPFolv{?c43E?jK2%`V@p%3t7UOt4s7a4G+|8=52a3xpX zj0-)a-W_K@e?Q7=23s=k%Vm)n1w(BY?Ich~EW}`vA^;{Fp-uZ(|q&EXm#&XL2J&+=xi%GGop$C7z4j;SBH4`A-r zlltyX-re*$&Uy>@J;$7S@8N7j-^z6tK~C(g&%>5uhjE0@W!-(_CRPoPA-#JKI!90A z%EQO3jSj%2ybAh-T+`LL4dKmANN!n&UF_X$=J;I%cY$>TXU6be?Ai8aJ;8^0dLKvTnpmfCr=J(jU8(o3>`(Kgta`I2*@y6_U+@xJ zKrRCr_lH?%A&c>AET8%6%Y3%@`B={TN@=t6V%!i$o8eBo9ArKpS;2e`pqmL?7~6Z3 zb8pH<0DB!msPjRL`Td#K@!@U#qkV>6SqWaCV8vWNdkNia7V-Hfto5;%zMRik+O%ggMp$R>WxQWK zcod6=PNH;V4Bgjm;q?7SSh@QU<^;t>~TIrnp6eyJ?m6OFYISe)&E<9%yU%s9*2U^4v4zdz#+*E#ROZuUDDG(LFU z|IgvyOlQX8NFU2D)~sYrub~X7+&)TjZ^AfS#4>Dn1*ogBH);ogf z(?ZE{2z5D#eY}CJ;|DTtC-5i#Dw*Kedh`20dqd7E>{NCmfbq05*G*(_4&2EY^2FoY z80Ryg&T>A#pEa7svzM`M>>{>Zx`mRxr=Xj?60^e6QMr9LE`Iej>c>Wq+S3KE%4GSE)OmGe&(vY+4t$mJ|;irWPO;E z7klr_INqHxfiL4)|3%bm{;k*iN&Fj*73YZ|wDp11;h;rg117^ucN&s{9FUh91`qbo zB}KWTlYMR%`5ddypN!(nsa`B!91BS$7OHK9c8-D|TPm@*~wtdH;j`*PZ-UjfdWp-?$r7);W*$Wj!{~ zfc}X!Og{tqC_bwyk^KM}l!F9kP4Yb*QMPjt!F*>V{bB@b@Zm(LCF@`8;|?NxDG%-( zS2r^)_%NsE!@R!0m;GZtjBQunLi%jnwPCyyHP!I5#gJU z!LWD>G*eeYFQu4vU=PMP2gumI1sPj6q37IL_6PBqFh#kH{S#mp6##QTXFiv~77ngv z?3FWuFS!q7JQBrc{%z-TgeI;ZLpyT~f$SNP`MEd!vp-{i04r_UH%%4yNj`>%XWl!2 z>r?!x zfYvoJs4nBP0i32Ii~T2w>;(*9>=#A^YQ4|+|9!?7A0WwH=L;9}1zBWTooCrsUh1E# z{J(|v^kxsEng7Fva^z|@opTNoB>5Pqa*@82vB)4pgwq#z>Q5%evyi}N8iZNTr45{o zNape)_&ly)3q82A@79@p8J>*g1F2t8^uuwH?EPRrn>%}>yzIDkl6JtE@xG~@KKta0 zxaR35?)~c5s6Wz&yq+G^42~eXdjQrIJ7BV69~|rY5z=uC@m>27+qnU5OH0r_auT;V z2i$*l9GM+$2wPDG(-41Xx!A(U-GR^NvEg$U%$SEK|Fq2^5q6xLdScJu2IdwE5W_lL z0ArW{ejh?akdF|1T~&-1!Jd~m`iUejBP6lMBb>2bfRP4b=+~3%7a^H-ni#SD65rE* zhch+^=l4;J3u7ru5oYt4yVF24Yul;Rmvq{oM8+5?^y{7>{0lq7QPoHz5q{9RFI z6s~dI`rrQD-{8QZ9^_|-BA&ghk?bW7VQnv+wTBaf>)DgsgXVQP2ymK*FdGeoQZIex zQ};FBhyQ~2;4$YNIBWd>?7aneo#&b6pU%wg&dkmKe&O}Ag8F(!*OYt0IDCgxFR zr-rd&x=hJOEx_Upctk8UI4c9bK|RB4eu*6O`?Z^KPFrL?pV&doT@BgQb~7q;xfq);oB6o)Al zU4_^PbV{h5nt=7LBF0?${DWG~wUo7AP0iM51To-{hd&zp#J|Sex6X!j|MBDBtpAXK zk2M%A9Q|cRa)|N^=|ut$ok`5$iqGlpDh6*k`GaOBwTF#u`LcqewR{e?lGkU5eQn{t zI`W<-C%MB%Y5*ffPkl4B!IL||}q-P`oiowxJ~7~o0jcjw=DLq{&Y zq{y;D&2+Yw5gNTF-cFjn5`2_cV;Q)wDfpiyxqvNLrnCD}+0naZ2fu6$IJ_A(8#8!= z=A21$a3FK?Q8WD3YJ8R@@tE5xIH~5~z+kr)#EO>q2Xo>XGs9XE`>y8Ef^+YPZFj{E zx?vw&z!MzFF`VX&mL1#`W7d8-y$$9DAHQO%oR&PbAN0Ei*R$C7uJey;Z+N`->wV{c(W3FK&Mr&8&7`)ImJuamqiJw5pOrQ1oRt}@ zEA*YXg0FZOz##%L|nUJX~{PMn{LmYG}%WbBV6{k&WQ8*Ee>o^*qLDg0A*tkvB6&p1tG({6VA~n%xy=I1%YEEpk7G?Fy zvhkqSRBY3N#40UXUn<{?y(+`!hn1GfF+N`2Ia#t#jMZ#c2d$#-%PibibF7Uujksdb zsySM1yBOZmBF_9g@ay?nyLO=*u?4oAP0Quzabkj3m&cLTeIXc?~94qLug9)($AKI zrgT+Nk}~M=^ae|GT{=Y;#2%}`M=FbA;qtp_4Y>H)mHa(;uq(lXmVx>E^SaYx9EqcT zCwua-oLEz(GgrWM@o*2LJA%^n2F%-nIXq zt^Y4fSI^y)wBGM~Lv7F7*G9|0osIY#R^Fsyk&<7vgK(CvA z{G;{kgLqYxg{r8~Uuo&<)X`NyZRQlU^us!OzFSvr9n{OO9n_6CU(yF3zOD0@PU*mf zBPu;|LcX2*v^2RuGXi5Y(KA}(JyJBqzeqE}YcwaJNsF`EwJdX!79`YaZcLGuVgr_j zM{(9&HQCBSQ|;j71bAqstF0`fgTem2;0Glc^+IAp_JAcm%mUwT$v&`T?ad55Z_`KN2k>{)r45%gUt5cxvnPHv zoMkt&xpFk0uTU==xvinLPrm20e2OBdbtGfoQeuOYogM>D5-fjLOS!Mc58-dt!eO(( zSF9yx%uET8EA?Ts`6K1Bbi91nU^YsghT06i-(=9k zGQ|cM_5USy{|VV(%Z$J`XAget`+<-BOV-a>fAcl-+sn$6zpJXvm6wk#{&}>_;I7$Y zYb@aF*s^D1V||HF>frYn`Y+K`*%+s~nqU=Xx~Yt{-`Jk0#^y-1ccj6c-$hOMl&;>~ zr5ksS=<@5#WxKkMbH76wwd7iC}HrG?Q+ni&wPDc(_<>XWV+LB*OAS*f|P zRhko5rNzlj?2&rSi_F)o;6zRH4b^04H%+mz(L_tM7hP;LbFGyYINNHelNCBXmOPqk z30UB2H&a=_-?3hcCZ#>Sz?w7G`zg@dT7ItRpqNw7y);0OvVd2hYLXuTPOJeOUop_sb}! zTJwYBG>0{v?H3L1pP?mjZ)-VMcBbfY zW7{2;PY36kD!av#!0OOzoJZ`va0)oZTxyex!3`G4cq#G1!pX$l*a31_2kf_>y^#W3 z;4Q4CSI@A2=8lye+68OpPmuG%iE>&nfmols314D`-*6=7aa}q=;rQ`9c#-Ra)+jT< zOOZbG|A7AmVw1wqk_skv^Z*;NrygWIrJn*Vrz_HaF1g+#S_Ajf8BErcnBR23FJ&?K zA(;;Rl}zvj#@K{~*o3*y{OeaQJoJxgzd!%?+y4Kl{kO1QQd?S?`b8Igy#>W+c!j%g zS#VzHZvq3F3r0N;uER_;D(92GE}t?`7T7`ORrEU33+9Ghb2gdNXA9TSlNG_9PA`an zmz$!-4tTTC>*xb;(az(W6oO2MPIJK=MJ22r&(jU438t_MBeL&op<8B za>rjp(?hlaeZ(?!CVa?AlS6Hl5$UL4>SbQ!n*Lk?>=B;@qsSSb!(I$j40Wt1v;$TQ z=A4gsSnl)StT;lOZYXh=x=xp1IW#Z|As#LY5#}+G4bcD|B6-fic89~ zKknVqqoxgw%E*hSzsX6qF3Yf&3$&8@%wjl83*j2ApvGaqMQs;>c^cE>!n%9#KDzQg z+8G&m>Pv|k@VRy?tv^S z_Lf@2S}k&5{!SP?qVhyE{vyz9CGRwR&Ba8vtiJ<(z{L?wR{me^Hq2%K%U{d-yTGe- zTsT!0i>GU~*%Fx=d)?Z>hdU@c%2nPbv*b*^;7>jn zjtvN+m(7lN-kh@@?q;M&Ua!gUN6GQ90porn2QV0e9k7Hav~tL=WyGUB{Rd7f$AP)` zd;i%-{xR}@cJP1ywfp1$U(B92IXy2w^WE<5E^X@EsCslS3d+-|@n@^GqfS{_(Y$9X z=sOrfeT@1D`Hb}v{=clfm+2f{KYoFD+ld;Rr!6|^&Zcr$16E+RNY=LS7@XjJCPm5% ztZ!9hgq8;SYh`$djKk;?&CQZ)ahV)Tnq-mRrWNT;T(vUEs*rtAl~T5&?F-ju3tY1r z=D>M1)N4&@s;rZfWE2)6qtF2GKX)y6vuCX=SpPLL^K({UP9$2Sv9j`Yl(F3^_yxxF z%q@{4XMZi1D;h2V^ys;Rzq^trx*7KFQu2Zob7TgNXv)4?vCfr#b~`P%TMb_gZAN0f zbw;z~#9FV#o;zae*I_rjmQR%r`KITx8FE=LncQ!p))7~Dt(YNSes>5p=@jau$zhK2 zXV3Y8N%*avsW|V|3UOF258gKq@St#dS`v6}$SQ0R*s6gO;9)dg&hYQdM?Wr$(T{2M zh=*hYHgCuGEXIH(4*|35|7)4e93Ustv2aWJ-+uPd|8CHV`}aQn&H680J};`UIOk?Z z2Q#qIRbuwFwlnvt1KqW)^xN+`uoZsRdV2F#)8{+`e%ox>7}nZsf&48O$!`tyD|-Lj z*axoEyw<_%aj_ugGF>REHA~S0_mEd{zHCy^uqdF%EhlWps}ed|m9%x6 ze4D#vSJEt(>Q;HwH*?>hWO!YT7fz}7<@0K1wpSWFJ*UD9rSI9Sb?87@rzglf!e7Q- zPUxrD{BV&EnEN}UK@}+HNOyWt;dZ&3$kllToI~;_wEcXDSt3KxsitnX4xG{rTjogb zjm>KEMMw6Ko0E*)-L%xjL1wNt%y9COCw9zvCHOmep$li-b=h>*alQgf(3@cWomg|n zC2*Te_?pc!1==r_4?Hh#`jsN=m&u3N(1*Aq2yS2~{d-yA_6j5>i6l0OBnFJ;xv|8C zhV^%4&27P6ofm?yPNo*a*|!|?8}LSK{_uyX_xxI`N5Un*2h4r`SACo#2a|C!nmORg zxWWBg{=LP&=j(si2W!__d)3xfTs5qJ@0Kp~rr_3ZZBrIp`*3&@vGk_+N4YDrJQ;3Y zjWUZ8=?gWHkNpZoxY4`L9(E`H@nGG(dGuoK-7S}KUZ}-6td?hL5^G%}+r*^4^*2k; zQ0(rV3hnBUT~3D973CTWghpZePxhE;XMytQ@p? zOp?Qtv9DLrT@A8MjRyDO{ChZYULDYF<8rk}gTjU$D+jrTyQAOkOgzi$a9t%&Pc&5` zY?P7hL+@0yf~m2r11E4}-#V>?Z*H*yzh_Oqx0B4h-Pr?Z4EVaLq9IT5FMF(739sCK>HAIG$HtRB7E9Hjo_hV1^I2dW2 z^)h0C<#JqSC7;X;Ic4T(xv!fRczenwJx!q-n&p_2tyNKxvQ1--3N_r~6FXFXc8>~= z?NoeMi=1-P#!HJ8~sWkot`Y-Q_ZFBft&cQ-S6q3!A6W~@}Wf!&*#{kAbz35nhc53p7s{>>AggTI|10yQ1I4Z(^(3luPYe)8iu_H zUNeI{ak?VtAzD8AVVRAGH!}VSIe`6H&U_xO*iiD75%h{YMIJLAdplc;;ekvV^5}kx zmGhVUdy9VG*ZcOs@L|s`G&Y`l#2@{gd~9oeNv4v(0aNlKm0cE#hDw#HT9V~RPH69H z3^%(3eY8rI*XN;IL!VDek>cXK<%NH6b1;@S_(y;*bF(}x_^PHfM}Fwx1g=}7 zV&2cQ=b2*_vW{2@oPgLfnzfF^??+n9Q9K;QxV1|a3jfmwAFvh-&X)CFF@`$d#NUEH zJ&nDX42C#W>#U|J)Q32Qec-ZY7Tlbv^o`OVHt?Zt3!{0H?_1~p)$K3(J^nAFhd%qz zjxj@?`hLb__>kzQOabpSCr=KA`&U#IA%A8n&z?q)1~$kMJk7vg&nZlRkBlC`TbJnz zZ_)a+05I0o*wl5Z05gnD@t1qBn`*aoD%ueHfzM@hG%6Dv$l%&SIi$zQGSpiRu_1Cv zM=Jz;DRavPx#y$H&HGlwj2ExcY=zQST6=7lnwYK9_A>pw@88tjFF(~gpM0d-AHAnf zKL1ST;G-8a$0Mw@QZ5;>)Bzl26R?&(u2A%te16D5+}Fs**GiuFf^~3_J-PhhtOj|k zQ4n_9*9NrO9-jZCT28~UAN&;oHKu3blL6YfVZU=iAES)mFJ zbD|G;4RMA!`wKm2H_pJ?Rq`VbiUuFdrvIS6I+K2e)AAuF@x^w85ckIr4~DOqrwDq& z;)oZb;8KQQ54`CwwTD0H3>IWQxgRzk?%420;CbW!$;mC4Env5j8Ydi*h13{k!4H`- z}lw5lD94g z)11KGGSq|?!Z(^vZ6GpqZ6E(HHa)O!_Ri7s=;zVP=o)Jbd1>npM3V2zWDM>efs4W`t+;Mb^YD9v=6`3b?zAT#41^Zd&@4` z6J26I=1-(5A~gigs)Kxk?09X?yv{Z90u%7XW_dcGS7JlH%KAH6pws4VO@Diw!s!b! z$Cns8+cVqEk=YStYTjI-wP1^$N`~=EKFAKJvHUP96QbY>U;44Rd$@ zKY#rF-~Zj;EnYGw(aqiF-9^;RCyb;wn|ilFXJi(2ek<_6*eEAzlk|kle*tdz2>B34 z`})|ack3p-{ob2;?dB!s9p+$HnRDQbetU=$+Nx>HTB$)7C|$iT9#z?{E}eVzO5eKG zbx_Y|ZG*})mD5wFz*6+$+DnzXxlZ1t_?ol`e1)%U)-zM0DNkwL^n1N}PM?4El|Ezb z-}~@Gef-52{I0L`C0{dK?|ky1wq7`<2>OCu^Wx-|9wMiBPqg48Rn%6fKu`_&>TNq4k6iU6bg8s)d`t0)$sB_&^XD6{M_9nn)xgs1*!1z`ul>HKnZ3uEP zQ=+Gp;=re4$x9RI4~l~i5@oln?}{ZS2?2ZYWL{7Ra|0~E;*Dp5!47>0e(A&Xeo*fp z3=TX5zWKn1H47fVH1@%i(Z9V-zU3Yj6>0G6Kj-5Y3zy7UmzI%qIV&qwYr#v5z&M?V zi%p3wtX5A`T{SatqaFMDHxD1E(;i}i*cf*-AyVj_yP!`$`+%N0;&$wzmzO1W(oZD~ z*^0|z4r*?qj$fo6aOZX1{P11f`TSEwlJ|S2#;9V?Ce!&{g&SU^i$pa;>*5$@yVB;>lJG0 zO~-dDg!t7XD@+0Tk!aCGDY`g@eHgDmFnf2fd;cJEacUi2uEd4pGQqAE@GfoSLA)9Z z-chx?MQNP(0P5Dza?|$k;%_l z_#dCU%xK{;EjV?Ni03iNWD1&*u)Y;H1j7=4}L0gjx1)}Je${wF`yKge>aLbyV0mMWaH z9!Ea99zT@G`p1!*BoI5qlc&USA5Kl(#dw0Om%<@s&GR#YREIrHNb)4l@IyO;9+nq4 z_nd!25Ack!Pixx5=Xz{yO{V?0ra$L#?K;~L_AYBWS5ohoIejd9iFtHzN@mfgI|tsI zDR`d^{%j^Z2q$J@cJ$_|qo+jCVEul64hju*Q$oC-;(2cq<2;qj+J^)>qh02pVC;B0 zx}n#I*U!T7yY}uKUApy#&R$1bO{Mh96WqY=zefycumc}p4{m+*zIMM%zf4!H zincW=ds7K>KcdhMKyNQC2z@H>;UaR5^+9s?pnk{tga$e(JQ!Rayf7%nPuXZ)C)DJ~ zHOZg;!vdYWaz-C~^^q>W`3m!+h*7X3e%O)3lu&J`XkmUz{^@8yeEmo zK566)>Fl)_;=wR{Km@TsJbNx4+n?lRrW7AbWdzu1J-JDOJ9dCQkmzlxFsJ2x9IHj- z`!>dtRZ*Hi4;{MtE2q(4vp_cHGvS6lM_G3ozv*8Rul+BvOx z(A;KOvbV462kX|^p)olce?tEnG2aT}z-4e*7S0?--|I7)OKmbeV;x%hEox|hhmPJ; zWVo|pqut<-dnpOO5F5@J2zF5b=OZ$KI(U7dPTah#ZRgR6xc#bL{_u{roja~x^7^Fu zBE?i@s<@{?1-%VQXWcT%D-$=CYCUtivbWZ&^V}X?eeZ@o`T8rJd;3k@c;}AZ{P?aq z;7u7YfkQX0>Ky$+ue^0zZ+!ZJ&cjpKfIUfRDOF5$x-vHwsC;LA-wcrW5;Q%zQtNW4 zP5CJx&`rTXZp4M|N=yx6hBum=+4zn10cgHwu=Xc({>DY^C$_lp(VK9Njw%#vF*M$n zJh+y*h8tBtY@eDN376Ad5$vVxv=Eh`%~Og7d_trvwH{}M;|D_Rjg{nWqhufE5R!)^ zaMn}(?UWv9ul3|6Nxs%fWnYDY2bog;SwwzsL>}O{hJJE*>^^?B^((A(O2l|dK$XMgwwc>iMcnq~HDU94V=iYHd~0ZUyp8l4{c7{?Lw z6JO4Qt2z(AGl%t0NOEMxbq(C5Le-$hmX*akHAAeO97x}wkK&^}6on34FxsJ^oTtjJ z8g+A?H=W+E60pVmo@QlltWzs94r=#ys%%@cGB%d0aC5VokM2|<_i1g#YDMRx<;Zqb zU=y~yctr1W{_lMJv2MKkj^6s@6PV2h zou!EKBpy>$*jugcliRfI%r0f1Bbv)TODIZLAiN>J0OtHfd8@Xq9G+;S!V>+#ynLu# zH|xZuV`>El-?V?5-gxh}-u~!qHFoj(nN?FmzL}AOeov&g!pQ4`J?#{OPb|dGRH9*7 zM$C~++*wE-ni=DxKs)?DJ|@KteRy)tIP#B7aI`ey(e>E#oK;30xf4D-9%$351WCo(C!W@FJ{m{*LjGVpyvDK!Fmiqg9|J>N`4|~Pjbjgfa zGe&GR1=qI&$1_?yPLqZ{N6{=znLZcSnV4o6?n<5scmU z)A~4nCC2&?8+s}t3LT(O&J;6U4!?Xv`>!5T2k~=4eJ+?_w4%#0RKK%R`!Ao-hC^HN z)0s+S&PEgK-2fI;#U42H(kbmlSD*$Ac-Q4~x_$Q}ee=z?I(OT^7r(A!EOkg3I58(N92$X7NmtL+;t5xo|%$e@cUfxU}Y(swe{Xs z>;dY55$lv5;i7c3L^HDjiLY$vlY*19WL#gKXU6;uD{J~@;#|;Rnxn}RpGSx2x0*EZ z`9?=a%Ta$=%s=51bCZQnPZ;^z?8#%E{&*HWvNJjNQ^+&tfG?X7gRJIn&m;d|3@<&q z$d8$s1?t_~sPcv^`uGFr6ZQlb@KQK-Gz>c!#s57fC0xm9EF8beEQoi&iC#I#8Rz{i zU#}SI2`P1X;CFk}bf8ypH5u6IRMj5bq_#6VRJDhBZ)mRVdF6t7(BL}^m-OX#-_++{ ze@P$66%`-YraE*ST2Jg#HhQ}y`H>1Hy z%(CG`r%K2xwqP&Pt4kCDURc#!`Gdv?dNS?IIp|#C&qNEO|+NK7M^9w$9Iq{v3P71-dBS-vO-GfbVmz+5f3r2|>=p0q$BK=z#sV zRub4~0{LMQxl#(8yHviO9^$NQo>K^pT#y&2*rauG2Cp`Ti*CSpm!carlXzg|Vz}zY zlhD)~qgiu?phNb;hco633w3g_{>`7T?0@(XH&?s=x@gWQ`^h67zc^(mHiff4b0mGP zQ=gS#-x<+!Fc<7$+1!C(9xmv-hpPe}Xc^}@f&Cp0-W?MYp!lR*Uwmq#WhcgM@+*7Sea=emlbt>CYuZ^d+sQKhpmG4KBbF6*1t(S)tor9AvbA=vSbE2oJ6U)R11$5n=(IrAp= z;G=hS?DZFw*@3S*gr)#``mN-g=b5pw`@~Ug*tUtseY!-S?Nw?FuNi*kt*bgr-qE?I zQF)c?6&&r&|0iB&uAW1Os2vUH0%`}$WS}mXLX9aFn{QbA)JWnV;+|M9@KHW5CQeB3 zvsY4}qmumXl?pDB8|$TXFo;wz)WSG-6(xBqKb}|-?AUN+#JDMfnVIX{7Rm_>U^Jjfnn=hZt`gcxa{S6oO zB$=TBX1jU{y^?4aU<(X&CI?&QdzqsN6Shtn`H6}Hql?D=my)x0Y$q~8H_>oTx}&hrO#>CO#Z0T1pty+<7v znGeQ(Is4`{`iSA79oV3Pt!O8{az^jLOaAb)PxR`YSGAwI(}4@S_0k(>^!j_(i7&6| z^eacud+cHMK#}5!=Q4}X@!h#m8AWK^!Ie*8{gc@9aRJUs406S8dnql#TXEQeIN!Cb zYlteTqhxTV^N1DGBgm2110^Yessb~v%L!9kHFIW5qErMAG?REKgSaUIOu&V?seWGI z?990^lnh|NOLgmpm|)y8RQwSSQ3&_8S8fB(a7E_RPEo;f0J z+OWqzno2*}40^vz!5xgzEtx|sIve}HX4OQQtsXBU`h;A_SE4!ZDLJu9;k>uuS1;c} zU-{O{+Q*E~J*W2S!p-x<%{O#_xVdhBH+`P)2{u$QgOQmr&Be;3wpPBQ3EXC@YOvG! zJ2xnc-;>QcWo@ofPDiEop!2rxMKmAasBJ+9qkMBaXZwa4sZ}S{7b~wD|9_}kTP_{d z1!91!Z{O0XH?L^hE6j+*cD%%XXgS=i0_;mQvwW`Kg3J8=9i3+$&xy;&wE0jw{6yx) zzPwKdsL>pK>9DpR*{W7BsitoB7`b;rRf=-T5|xr0tpw~_axAeX9Wz08w5bUkw;64n z!xs*K&)oo%`$AvgtKTDUfA`b(^fr&X$f3IM_v`Bl6$k#`yt_yB)byL!6I;(8RR{Z} z^(6DSPj1JjQ-|K)qSj;E)Q;}%emEd!Z(QfxA6HsSt&YEj_7`i|ypR0^zSO|)*>qx$ z8uo2g7dGM|IPBZ}-A}&xjJ}Z@s@ad}|RkdNy@MUo+Vf1SRDS`T40`;xLAa~Z=L-9WJsKP@@ z^mFd>`)Q#b_g3YDzYL~N_?0Bb`osR zuR$}}$(EY#j2F;h9j%4*6;B=bkj8=c4SVh(&1C)UoR-MV$81|zM8KH8$in~rmpIy* z51caknY>9OfA_`QY4o&#HO!lZ?#OiNOq1#3pHDB}iqWzpKiS0lcm4G%dK29BMe4LC zUp}Rmz(Q}`xvj6jY7O<7n_zX<-hWH4g5Tcw;2m`m-}j!|r`|LB!2(~^i*Mf`FFVNn zG2;5ybd#Qui?^@!t$Y2kF73JmPH^&>Umvci#dhJVd;>OJ~XbUI**h3;tZatxJ2) zoy2~lOMdB`PLUV9_Q8945BvW1XCLbvdSzYAbJ%+RKwo@t9s6(yo6^l*s6e;KFas_c z9~P6$8t{2p3p3)oTG-EMhFv_VTI|3kbng$I+OM?iWa1oneAK9u;{(8G{pr*4Q6jwv z>*+ztVBK@63+F`n^zDOm;=jCD@bJtC*Xeq8yGMK?(>rZRGc0LUgS;v z6#l{5xmtvN@N8;(^Wa-9=KL?_EKVEoxW){H?+1<)8SDGGN05C?NO-`Lf64WCaP;4(99zR^jf!eBznt_Ys4bSS;19eLLw1d7GY)_jQ9cGo1U| z#Vv@p$~lbE!O@97~x%QK6X&8Xvnqi-Kt0o))Lf?6l(!9=0?6f_x40y8fac>zr%{Papq$ z*|bT|f4dr9k`Fme26dc{u6D)nf1eLmWhOkh()uc0rWg1958u~aaQL@5-&>CC?VJ5@ z_%gbR#8!>WSuE-ThehwapsiL1IiDLjzpcEV`RK#d631WQEZ<nk;xqbCFJ=Ir-t2pY_#!-umROb~D!@1MRmY;);f&yR_#z za|aFUkI&dkPInHh;119G1e^251;_?l#T%?kiZ?--WjHZCOBWMzA+Q+Q; zBfIq`J!`k$c~h6c8?L|e4%&kIREJ$K=yhMdMo$xa{P5W$s%fr3r#+6IpFnc{V0ylo zS;Kl~QwPgW3{U}IPsc7~u*uUu6|8Wzob+r8Nj{_5joB0n;C@DDGLNYwMf2e=6~cA8c=@8<;k|hSEx60P&j-+G?K!Yh=dNAk{NL2| zkKWMn8yAT8E13x!fi`1}c2lQsKd@QV*wr-rYg&Dwa@wl;&ROsAeQ5vfBtI;dFXypz zb3JE#J3f7jlIydT%=z4Sc!%C$zZq=B=d9_+-+ZY{_>S!tPG~dsdgJK>s$t*lf91Tc z5qBJU?PY39H*^UD$cK}Y&46)Z`V~(BcbrWAIhi>Zv%n!7 z!Ki(~Jm#&M4K5O@1IG^O8v2_@(QxV7y;*ySz0SV+vUZ(2s!gm@E7(rs?siphu9AtT z_R;^h_aaxbvo=EsSu&tPISzq_L3ruUT!(gij&ATTk70-?6>=o;5b?vG>57I}Yz=9tl3* zpv8Cj6uIL^I)3S_D%S&}(y2cbu*WyGmg(SuF8XH+sGWv@N0AqRS2=U;CKKz8CJ$c#1{1~X5DVv( zTC;XVQb>5vpN04Q?>3Exr^`Rjnmc0AqQ&D+E@RJ`Qg>QmJ_Ai#bn_OD)f{+1hB<`} z;9QY8F<|^voRJpw9NDaG6@$B*nfhbGXD9+hKnbHL{|kSo0P`CaTevmeo!ejER9;Dfx& zqaokxJ$;B;!EPPCdWl@&MKvDSt-S_4YWOKBGkP`uqIF z{rJc^HcbZrtRHe?zzlbN=8GP9E^N12OqH&%+`PbUw-o@xy6_I0^5I`TF>d*uc-Un z0rViY>Fl-3Kg19pexO^#CAU8PNGHL74EEsojaQTl|FERJPEBx^GMQZ%LvKn_3S1QS z!sgwb=tQ3e<9}P9QER$>`zCs^XwMSo)$iD-?7CvGty<>y6oLoWs->p|T%cH~h3S2` z;0a>Q-Ppf!^3mj+L^K^@ltOHo&UrWZfWp*B6{ByQ4mOkmZqm;0I!0aW_&F}}p%Z70 zYRAECs_H1`OoeGVoUjEZvzYrhPd?#J-zQ{7eP!cj72xUPVVL>#AO67}_%F_`c4J0O zd~Vy^B@^UC&2k$3iPIO3)^ZE9>>ZagvmGs;`DkC+uTmxP*Cpcl)7Q_a_vjXtP&>&1 z172USUWJWiN-D{srgIt&;QO4#D{z8dh0Ae6$6mXD?LV)Z?UR?6DMAI>rH+3)tCAf`}__zVb7%#s>gnoZ*Nr#y()LW8NgumIeW0NkiSFWN-RI`y; zlliIY06XY8($kkKRy39>1K!gn!};&5W&UNRN|}w;O&xQ~p&i<^6CT5X9h_xm${yRN z(sJfhCZnyE6hSQztz&w^v#5#X;zxE-=XwP$^Oft&r(rhL$x|n^|KL96o5P99S6%2oHFE*^_S(f?S-Gs(6cifJFFGdLpxyIV`S9`edT_|7r`OJyH|AA8>g4W$4rr`Q zf)lw~$$9J1*9_4TxbxFjOyj)9>NIEIHQwJ-mrtu5zh6(SrLw(Jsbv|8VIOQixlb?Q zlP_Z{?+{15`^86k4Q|M-yYH~3pX*JuaJC%U!z}DV>Wp#J7L$}qovsicP}Q>m&d*zV z@#Y)E|6kyj@9HKT;NxHphrk~U`Q%1wLM`MM8;>5;wu|R=jM%-GT;lM}*VJ%u2Q`TE zItcdj3LKPcx8SAj--E_Cc8dL$nMKT2o3AeN%q`#)Ipmz{bK}tk@6c5+O#{YpmYA}J zS;!U5W%Nnpsu1qNHgL_eS5Gs?ZFk?#9lLZ!N0=LPkXU#pb&FPPNNZ13A`q9o9H~aDd5(oKIRI{ z3{uB|9$kF>vM#(%4tDv7c3jw{O@}tAu%$pba4u@WY7e6Was9owIEQcQ4qToa@4VHA z6TQz_J^k`as@l*%Or8bDE*?!1X2xf&ryg5G?f~w`xqju%+xi$T$XnnJN5Owuc5NX( z*rqP>`i+M7``CUsU`N0bk7@S};y?OUy6GP*H(&?XUZn2a%S?$DZQQk4^&Ktv>1<_@ zzvYnw6p{-R!~LmY&o+Z;Hg?wOF#i13`>(?-x&_zxCUyayNFx@&XT53Sm@ zm;JMqx^-Qp+{qEvIIpIE!Rq_@E2n%gdffAg-o9=RbN2t_8voB(_j{ik5fT1h%q&)o zA2W5xUK9Hz-&nY#2MSJQA7&@d^g#LMg~>AqEsInyg;FoAC6?ZEVIRJoSpV{VZ9TJD zn~!#?V_&QC;nlY8YA3fp#Qjbk!dCBM@Aq)#w=>VZvAYeMPu#@0&tUB{iO({yGnx2~ z+}dItCAPbA`<6aq{XYX^K0>WGzrKPvAzLMF@Cupt*~T7dKDQLL{q#vVTljP0(>!c`ae20iiPcKW(o|lBJ%=|^PhQZyYopr9J+@;D-XNEK z>+T(1>u%;57ck?uK$ZMo+E~A1=MU-98`uY87z1DE*u@j*RK2X*;M1>@o4ks>dgtAD z!AU;U8@%?*uU*%E;>m308Tfy_pZrb`}1)2z>v|;S&g4D^1_sb6TY5L9$@0WLXPCAzWKrQ-MDJux@DRRf87r} zW6M!|;43GHr{pIfK;O;a!x#yU1czbT)N?49-?g zUJAOxhR0;yXWno6j7po!b(MVk=KJpw+r6hdpWW4qV7@ire+IlRtFA;<#C2`-4{kWR zpW5&~H4>Yrw;1L@l;IEHlVA_dvj$g~RljZD4wcjvsgU@zoW6q^^1!+crK;w!s=h$A z@K9^OCAydc`w}_r9`8) z$LWzdtyjP{kDWOIrm$b#J9_D<>LF$zH-tlwU7Vrjjo`~Y9cpN6qTi;JJTFdW_7<8r zbNpvxCk#0-dQ^X-zxI0H|Mw!{m9H>f^2neO{i9wO`TT36rw{*TB6;9)`d1y9mtpE- zqRDU-hs{Cf)z*|VSxNo$FxP(0I5PvT9@dr<)M)m%fv*;;ls!<_Rijq&omM!%1$9Nr zC`s$9!L)W)YXh9hN@D(+<`Qk(Ru3nG8X@(i6T}r)!I#gH%bjHH&)&MOoo5c?1Lz&? zY*Y!F^!0GHYWJa21vXI&&p01@UEI;29T!il`{lFnP+scG>n^evs_^CM?6o4+p|U!U zvzMph5^9q<#2xu5yoM5HpZ2N~ed4UFWMyZ>tCBrhf!!#rVE!%Ga7%X+dKV?kysBUg z%T-*F#k`9&6_=rrRau}Gu*qWLz{0W|<@2>Hu;WPTz&WKU>gsLR)@@tWu%TH|^uk%W z+cEoYu7-^2|JA^Ok6#!&@;M)qm5cvk^}YMo_2=F%S+QvFkTC;GhKwC}XUMo0z8g1Z zv}UiGt|ivDf9_-X!>Z?uL8v1gaMrwRb zTj71c1t_S?V{Sx=+O{`nTM{y6FPNJ?R>8ltfrbX*2?*>rH8zdwX59Lu1@wz*QJwi4feo0I*4sLMm*A@ zYjZnE;TS#x|&4){PeIbkl36|7kecBLRM6zUt+Xq^6+tk+Xs#6|Iy$v1HT_K z{soPkPVXQ(I#U)+VlL}24MQ_&zVSkOKm+0b!~di|Z!i3eL-dJs9_Z-n4Qi&wU*B6P z!#-%?Y&T#J8aVem;euSc1zhkHkjG_s%w#X*r^l&?tHiJ;*eB(zWpVC$6|rxM_`HmDt)aiG z8Z4=dx_yw%)>TipGT->Q!_PGu+i?^UcyW`e;hk60_g;amFD%N$4sd?4 z14V`ln_Pmhibs&5qe?L2o2&IGL?Dk)5mDa{He@`v7iqq zTG^$L!lt;;c7xHK~x; zE4MV4-;tw@JG#J&5Al6!iPUj-oOQ^)+i+eR4sM|~{36dgscm4rdx#shVhhWd`S(`C&X(Qy(ga4_ZdAc^N*T4BuXapU6*%CN_vs zAwIt}D_+&a12yE9rPzxkuo4S6+wy9@XU#<|5*0HXs%HjF=sq_ z@61A^w_ARYHaKWDTG8wU!}{`=V_0J}Veijq<-AntS;^klwS0`g+e#-Fij4;es2uC;P9z z2u1{t=*S^$I&+fR^07YLu|tzj)$$69Q873aD# zH%V3a_DXQ0a^kyk9xL$imBa$&#DC@ZimHOtKK~yF7sSzW0rQ>F%tse`26g-e@H^(v zPd9qNBi|42_sg%xu=eAJJTcGAc+p=K-}_5!GILMQf0$@xv2>)V@t$ETmV7s8(Of-0 zcefp52Q}1f5!7uPwM!haE%nc3yIhsoieGHndV+K8yzuo0zQx#5gq;C90CI;Pj_-H8EfNkdxE{A zCZN^)^ptTLHhZduF`r@J%t_38o2C^utK}03cRU|^UxB7mIagT`@g23^zKfUuZTGy2 zBI3m2A1-2neChz1*!?cB`)i!z*QovP!uPk3#M z>8E>KV+TH>5&eFt;ZOha#?UAKCEdo{c(?&y|M5NiTYog{0mtC5k+VJhV&-^ypPz${ z-f&Y>ja+T6@piTvXKAis%NJ>+5&h&=%)1CgV=gnDwJyOYl(G*>lvBZDbvfMYN**hy z1(tEK2dLHNSCwGAu*)hebAP*hu{YHUF>Jz5Q{bsId-y6xSn z=-mW1Ol}5uuL;b#dRMQicW;MZwv~PqIEw8(Drnh+MsKefedsMQ8`t6Pb@QZij zd&*RRK1O+78f*Q-nXe}wsjbQTu>=_j~ZfpvV6yfVCeG9v1eWX6=96yW!C>|J5Zd;<*)pAr31;!*-(g`rUNT z0L}0Y*23Tj&Ghuq*tO0Y7Fw0tcB(NJRMXL>1pxmB!pO_lPP2UE~QZLX=Ax=$_m zU^RW#e2=}6$9~AKDhDezta}apSZJ2kus-aK0``gFDy%M}UI0J0w?j4PTGsB^tfsx& z;U*n{FM2|os1Y_(`z_oAuG`W9@WR)$4XE(?o#b#Zu{ zjAD~yoUmT=(D9w@ABE__>=7Jg3?`2R+*p55v=vX4HL zQ`$j4QRj)H@XvOtY2SW01INi3j;V6jG1VMAr@CV=tLpH}syM*?it-ADNw73kd? z&U%)rh&^k;|0_!~!3d)i=7Z*#=>mA$qYVAn%oTl>SnoF)@+_E6|A)UGGos(iv!@L! zaJ01;>ttv3Am{$C#^Lxsxwj%?V*Zn=tgQIpY50C!bG(O>blZ0euIwoss zNV28`CTfZ&ymFriS;u9_C#zU7rSu4Hz%Fmv!P?Ppy=e=&FsUf4SS$3R`_xK@gb$?$mZiK3R=(?qQ=&|YpdF+32vl5+(Qkv3!ca(_C?c{ z&8q3_VlF(K!_F-#>!vo?y-UU2U`M@s;D7C-##0Z@ORW$ePy!b)hkQR4PRu&XWm++F z6nY8IX!PL6H5^|*27G7K3y*#`YT#oZGGn-B*|Hg~o*vEvqND$M+@1fE>wfRwj*5x- zJGY3)C!E6~XD<#6DOnsGdUk18^cM@m6IlNwP4JJ?c<%^J@`=>!p!Hf2nSFk^d`MDzEO~X}CiVeXR6_n#sD$1$JR#Jm* zphjE<-k;W2`-uzlMMKaG?bXTj=se#y7oK=tW5IPNjOhnw`g9#hg$0^}Pqs4>$;yW50^J52~c+fQmcWABH%An4z$S^=A(lVuQTC zeLy@xOqo+zf#0Z9HQbVhZJpE(y8EvB?v3;4i ze00C^i2HIfQmlZI+Cxc#_i!S9}WQ22I@8TRDIQ>G5OFn#*a z$_Zopo7-5g{*yF${xhxl{r?x+;D~=V^$8j`&eGXy$Qrke!yN)I548{ebl@644OkPX z;cju75uL^CpIpt3Enx0PwOq>E6uuG7Uu;3*#@))=w4c7O{qzu_Mb=19z9C+y$Idew zw!q*Ic+BJ6=CbzLT!l^bY6tUa+13m9r%h!I)qPhdys-}QfO_^p)uvYR$2K@&8{vL5 zf;-XMm5zQ)Y=r!L+|XSzW_GY)ChI_r8}Ot?JpG7V{ue-`2tzFI5(}Lmm9yrY+P5S~n0^G!tuds@6vh>< zxt_k7Xl1GXQzmG@sKFn2{mCe=SdH?I)d-I$yZ9C zYzyzdN-xHr`L_Pe{kVH@_P#IM!M(EJ@CNHpZvML`+fI5 zzn>I)?>#TzC-=O7d%w*Ky7%Qg@W9{ypR_ssk5W9~Iy{OX^5|5N+(zZ@SgPh;eHUyJ&Mbo>lY6^!@mza5Idmn;phHi z=t2GQGSo2*m!Xzz;4&EEjSWf{Kb=vBYlLCOc&}voo35 zNtwjtyWjVYH;?h3WHPh6|2@z1uq~SpRny)px1dEatuGG|?6jqnSf{i}p56^p5DZWwaHvl~0-YpLk8YNBH^0 zXWpc}P7~iH_Dy`Z*oN2_)wcQYpITI(7yT^yN^C>4Rcv3>is;geX;w6QnuI1aLELGc zG;f;EvizcV#ygX}Wnffxd9nQ{9JrUvI!^z2s z=hD(sE~lm?UkZ%~IpgK+e#FAUZ2$cE^S4Z&KE05iQP8q!GMd;wvG1ZELTE0ubu_VU z@%vDR1COsowJFm#x>mFYvbe$bsiO5m(A32*p1ARaKSeI zz{ps;Y5Mf%RqeLoHbmPO(q_`c?@zQx)jmG_(M9#Ts_hf`F46uOv{|&bo}V^l%?i!M zHIe|cf7?neg@Y$raEkQ{=dX@1x2+pD$hNz|_U>q_L2Pjtc6DvV1@Z;eLoFl(={~^XtTZP_EJStnt$VXs}^w=R3 z?aW0=X$)kgv1A;vzMd?oO*;z_mKs1-R;zMfHdd#hvata18Qw^gxgspo>`TqnZ*87F zZL*jz#CFB@Mf*j2ey;sbwq5M2_>Aa#F^9e2D6w~`*;V}OtcqCb9QWY<-Fp}#WA5L#5yB@ta4d7nRLxXWcK7BB+&&Pe#WqM(14rs zdaPS9_u9)ZOcm!maSX&*_^D%{YQJjSf8Y0Z5>v18hP*El3jGkCK|M}IAp3O$x0!pt zyJv@zAKrAZj@+0!)`GTh+zg_Vx%=BXwlGFRF2wF)=KoZp<46nn{M&d8(#V}j;_>i? zYm_q_$SDg=_Jx~|1)MxLAc8ttQ7N9VbzVnZqqnJRu=v{4DHFx~_vA59wU_@^E~@8G z_We|SlaiKO)q1;c#m>FPMteRogBdd z8lz4S^G%MCe@#t_25Oz;Hsm8Lm%QM*RBBXHPp>E%7UZj0v6k8+!VTuOI`E`cd6L4P zyooZ7t$Ku~c*DWn2#Lwwg9{eSo6VN~)bCi;elfnpF`Dx7tQY6RXS&^uQc$0-CJmwT z0Hl;tmy)$J$C(Q~z-Rj`rm`l&G_+W-C7;h3N96C|y7@iT#2h`I9n{nGt0bb65eI;iCJ1yNVYlq@O@ z)*feV%49A$^Fj7D;2hZ^SI5UO{)Am&-f&yrelkN8h|eQeZEGRAs5xZjY5)UE4Olp> zBiGKIb5$}mggtPd%%HpE%5_o`{l+cwg~<}$-@Efm&GqWWZ0C>t27b`~H|D-Fp z=dF$83^bSG82OkNu3RKXXgA`hlVR>)jFqbw!pvG1hL+@Mk-52L?`HBQMli%0mF>)J zF5h0QJpW$5euL)&GEJ|OsY}ku$k|~OZOen4`@DfHHa)|YFt^r1Adf*2`IBDMZ5uh; zkDIKME!(L;KmxS~%Tt*z#qpOQIq}-;S>hV?$$5xRmFG3(*rz_^)QBk0ArD`B*f<&@ zCNTuwae)ZSjzeN`I%3jdpuS`dtgWF$Z@rAH^lhxoNh9}IPr3oi3^W*z zZ^Bt}dER~Z-S2Ju+Ewztno+=WMNqU8boA6<>!i)v560(8<5<_R4RY%EZP}BD*c=bo zd+0$zCcP|&wH2;=x(L+$7qX@y`Z+L^3Ge4;mOsjt`7 z)iU-Y?H7Ij?8J%BO}7zofOV%_2@NX%Ej!;$+)t@8HH1}vQas<<{1 zZ5HEREXwxJer@J#djqxi+-z3EiyGAqPR4Ncv*(y5SBK}JJZf>fl5cNrq(-fQMbOt) zgS)>2xsnzzb)^nA&%a%)0lt6#F5Y|ZJvBy^*NBNn+G>)zd4&MM-O>1rmN?}cJ&+M(pQ}}>dY5lB&+I@gLt)0b4%Ls!9IiA765)^GpC8L-6rh`Yw zygNy)_j}Z1?C1HS1Y!9x@JaKBbA%Mp*Gpd& zY90#X*iVRcAamUxu}MydOZ7uwhyz^NH+DwLsDHeKx->LBK9-uor=$!8%;W7ne-4d9 z$EYdS$DHC+m~(Cqh;fEjpgpyXm&1|g3S+W1%-1Z0lznN>-;l%Fg|Jqe4M&a*JNC7Q z_994GyCr2Vuj8^e5J2q{XA2E9kP(|DqrR|@9z4v{sn7hzcj~XraCo}?^7P=FaY0t_ zAvZIS>|PiBMesCR1F8OUIB={x=%~R_ZzXJ)I~+mXzx~IlWpH{7+fJT?b50r3Iy#ZW zJVtMM5?n)_A?28`ruK&m=Oa7zw-wv(uyzqO!WY7hbtO`*MQ~cZ0KOKQaANI=yRJH% zmd%BPIjMd&I`Ea~<3Ky>CX160%z2|IQ-W}(wQyv#`Oh3rT4U?K_z{PL{e9c$E!(bUa+5ev07kBo(7srYhp9kuz!JoPGLF5dD zdRpT0<73%H+aDb+`D<9PBl0z{V2y{nF7^3rb>Yop>b+ha?%InH#A6dcZes}Rzhn{a2<2ESOry?Z zaxh%DUx|ShND8w+IJJ}|@64pW^IR-{b7n2uuUf=$m_R+ftwGhS@JHmGRPA2tZBxE#C(|LG%;_o1(rG0*bo&DqhMcHh55lYm^rIa zuJ8}ChA-J&{`UIRm!`h2*;?v4>%zlO17SR-Db$&aa5YB?&-cket_ZMPj}%_x7G#DX zhQGOZ+cgNXRENLOLb$T;otMmn3w0ruzViHbRpUk5h3#ml{BzaTA_N87z)I&G&IL;l zNp5r)P3WX&=20iCG6$}TY&gjCVWnWsRpoy8)$T#z$S@oWD_{~D0*fGT)(C}>GZjS+ zrV~N}tPtj5ju5*I@Nl*ygUT0vJ`M;l)qmCKR=x@^j_YOfezoa|_KSxTb~e<$KR7&qJv_%1S1LGHhEvns z9x)zPh~{}C(3c#<@=^p>*C4gE1@Z$u$m%}~8S@I;=zqxW+Kt$zt#FD9g;PWTLRbqN zNtSPNvL_T-!H94%gI}N|rigJhqXx7m_2gWT%yFL;;e>2z!sZ6r zLdJP4)Jh#5TC?G*@fswnW^;a3r)IZC#?$Tha<@5^L5^VIrWE9rL^79EM#fn!HgTOC z>r3s!7&7~c5WaaMymDp8BwtP5*$8<%`CB)rf%D)hE`EF;TX`M}BDW@pI#*FK)U{4# z{VvBt2Cun8{G{+prS4mq4AC4jS@Hg;Ckr?&DHw&+z9>i!<6JMNuDzL3=RV8ZoWBQZ ziLa%Oh0O|h+h}ku;Bz}8aUJ)A#ngCRm4(4-YEfz;z{?bo{$^yg%5jxEu>`h%(~d&c zatxEZ_db%zS5c7LsNnv^lDkt&2H|hWi2Kv$pOY2+M{GOVjhM1j6Kus?>Zj!L_r9$W8@(ln=kLg#=M)pe zmHVDcjp z569o7?~rVSljNk`Byaf~c_+POosW}`b%_4OKKe@A`Fc|)=Y^Vl6j7U^BqNr(bz!Jf zP~)Du&f7|o$vP^<_A+YwrTI{o)Cg8&Sgc?91|niyev^|Y7k;@PT@vD=W*F-&{xHDb z2L9BoQ54JYJF;J|KNJkUk1=@dJkGK$hsV#5<9nBy?*FN*-R{4@nyk?y+`r$kHg6cC z_im8u^&a)Sc;E8de?i-^K62EuS>spDdn>YlSo7UIZ~#4I01B4tCPgAPldDxtzSb6= zJ1gbX*W$f)T%-gRyv}wYf5Y3|oO%su!VmGYi;cBzq=Q8FkuRCY;hY06@P6+ES#!r| z?I-$JSF)cRv34}j_ji_T;U;p5_n%~~8GjeQ`|LmP0r|EkAKWB=Xk4j9G(bJ0X8Io* zTDM^bd1mkPH*)Kv56CZQz=KcT!+H9oyU8)!*RcbY)RL%UU1=5d#`d>ze&TOWQ4~j? zoHqQzr5~ndBnqG6&n~HHi8JX>x?sioAPZgtx^O-?e&sk?=;sk^^@C@I$gaJGiyvIW zEwX7hlFL)GhhyyiE&S(~UsAj08jg^cck`2vsJr$rI7H3WKGxq?vF82A=wV#Hcbmtf z2lbr4TKo2pnYjx?g2Tss+*GPS6}jiT${UYz2rfQ z--2KQ_usfo9b)Pc(r;A9+TFSxWO?=O!WgxQuhGv_*IdQNqqunQ619IBAGpVH`qBGj zO^l$K_rC+YrVU99g@uFus4O#G_(6a1qHDZXp>M16jbEle^jwU{z3ZmF6m>|*Hf$ts zcrVA%4vq<-DYUPz3CG!{JHP#eEcFxQ6Og4%w#D}T4zlj9k%M`g{^bhRq>*3C8q~f) za_YH1;3yG^hj$z!1YcH8k@4BxwmF>3M*-MvN@ z*AND%6V^U9fF?3v>sU9xl}x=_GL&|btI$lARs;8^ot*WZ;GLcxIq>9W2vPkN7)sZz+O@;vLz;?5a zkdJrnZziL#i`wOa8F!p~=@S^fb&;C%m&lrAJ@I*RWXQH_rnbqR`f@Ts$c7;wrjfiz z!2znOkV9g-j&lxmJQlzD`39{efvUFrv+IP6jOk_p{te5V9KKPvBp+OAjU4hLw~(8% zW&2}Z5^G=uE2ZsV2l=`K^gSIS`;2Vy(E;?a-CgA4c3ixG*5k*huftk**1zo}_pXur zid{R%IwI4el;>f4!{w}Fe+8P0U-?vOV=Vb++x+zB1Si5VDMg_l685=nNGSBkhDa(Z z!WP!+)$C^NmZ;n0z3;xh9-f=XZ{5>CRv@)8h7OVMM2$eQcxw+FMpauM8b{8f@z4l% zY$d0ukz6pgy{sS&R%B9&`g@Iqvu-=vnu?hA|M(ImSFD$0=U%W;6g|>o9jmLN40+A0 zJ7SG$O-CQ=PFaV-F~SMBX$OO3jBuxj2*U$0p7>QQfRi9R(X zgm3o$%Mza{pWzTA^I8`v8(bZu_*5&U7#rg0123#aO!-#EY_{^Ap$@r)auil?LT+s> zGIlh;H8Te$vB}@8c65BGW3pkVkB9SWSw_0>Vg8>iY1xWN!Ks-Gq{*2+W|7I2E4?E| zS2=sWzeIQKpOc1|wu=-RQ9e2|rI`N=)iY(nBGQlh%BU8kb|Jw`r4HNk1 zJMm3iD|3)?pLymh@!aT{XFe0_`H$C(9*m0Tsx_l(%I93?iT|sP{?qFxJx$_$|69+W z-Y%c#iS0eH9)0}$2kR&H<0J7ppDWkgPv!or*6asmzi_SWC-#r3zf}DPeq8h?^0-;C z<`+#7Yktv-V$Ba2i8c5(u9x!t3uwl)@AI_&u^B-0rWn5>HpP}JElu4mI; ze{8RDE$;n9PKC(J5%F>H8Sz>19jYV4hd;kO`|Pvgy`sm(cZlsQq^+ds(2QsnG+UbR zm5RI^VdAmK;SjGG(nMa3h%vuS6W<}?<)R(GWD)NZ`yf6qzEk)V!f3*`DXulsCQX`@ zHEr6o+!-@w6ilBnz2N!hpU-*jx#whjEtQr?i=lSudBkxJvtr%5rb_^|$~2?AV#FE?vI(?YRqQAB`Lz{JgDW_iyv^a;}(~8Sk4q zb#g90BYZicEx|O=Z{qlfefz04i2sY%#W556zldfqZTgf*ONr5`oo$={dg01x`amx; z=VcsKjnrY`{mD4>Nksn37dwk|7G3n-KJ^3B_w1u=8G;v&iZ2RJW z!o=$$o;!_w`l^woPL`r1`A;L%bsHID&HdpWsG#2UD6f~g$#PC*o|1KgGLNL6x@g-vDtOLp zU~UO@ih8%9bXNhkx04gxy`6EcC^DdfAYoi1DJL8Oyhja;vV(7!4SgF+zgaT>RWTlZ ztPfQCE{^+Dk08^!qK54666xy;O!37jYT=aDkU`#9POXDO%n=&G*$Zc>YjF@Q{d-VQ zzY+c!fr!lwf-mFTW|H-AqkqfZ)fiFKq2AX=7XI#XGMvr6_V85tC`2DTISy6FeUhg3 zN~vFz?W3Sncf>GObc`BE)nwvHy)5Au?ZdpKUA$JY900SzCERg9E}|6 z$k&&^gfT^H#_eL6N8!OfxJx~sQ{?xZzcPvghg<&rwK*@(f9e=0w?BRQ)R#gceD0Q1 zDbPxGZwt4RQ7(rT`3x3z`mk^`U|vfKj!r=fQ&d&53zINUBIg660$ojPrTLdNUVd6t{2P!tL9)aqHH*yjQA3Qm!AY z?ADSEAA{27JhI42dHu*bXB#bqaBM_{JAI+4xkl~rcE$Feoib(86l(*ui!t;mZK^9o zXq*pqnNsO%v4HWqg)m|a#WTnj=DhEB2zFwuw1T-d)LLUKSj2xHJb0jt0UsRhMN~#G zEKOIyiZQ0xbh6oEU9fR0{qnkMaI?{bToyrH;&r7@Zh!8a7nitMF8|7nV<#&o0XOen z;#fPt*lrwbtTZ`(H5hYq<@Nk_bPo67!FvyJgYom@jDOy`dz-o#ml-#gF*YZqk833? z^_Rkl@%_M1d-w&|!Od1567BhLBqzC~fOXg_=e|4fS>-$<_J6`E^*4MYd<>AI@J0WT zy<~WArxtw%qM1YEO8u(VfGA&M zzHco8qy}(g{KsBL9X4b^<&hCvbYuuwyV?-nvJ0VQxp4HcfTKhYj+R=CUoM6{<6aJo z;Yqo6B@{$`7}ttNer zzVNqRP18nJsy{MQL&@ECqbBYF1T+uAt!6)ZE}Vy7jtr)bCJ2diL|71GTE;8kW4a2S z+^)OUJMd-9Gm!oS2Cj62VVllm+yeEnCxs_pywId%jxo>tBH z$bkd3C@&6YE0|> zioSYx3oS%3b`r~DpF)j2kD@~OR@TA2dN0aGM&MOe4x6Z8_%jaU!}ml4*&$4740m4_ z>Y2MCh;gHE#xo37@MK^7j*L%;pwAC&&Ex`B3NGrvz62MKfI+$U$; zpBjj*ThQ7@rd@L-(u19$i1a{ym=u}8wg_|6W88WXj8@M1A}KLezPu8%r9{p4~KqEH@WcxE$poIBG+v&sWA3KPh)N`#nOzsnNV-H4op*D1F_7SI<+I_$J0ben@?b>x_NSf48@e z+}b159HM`K3~8YYTuI;cR{E=JIG(~8v$Zu?3STelzhq{oFZjX6`6N9(b*ig#OraT%mT`1s?yNbED+1le}rFx)aVmgR{H-Fqf%{Otj%qW3oX6PzqRvsq^=ZoppJLaXCyS- zc2Uc%1;;L(q)xzj>cY^MOCIbo`XgHy``<3KJNE1#+l>rQ`W^S|qyM$F0b9uS-MpomL3P!IklN`8j^Nj}=DOk@<`*q8xqOm!NJ!Nx zC%Z?MKCURLDkoEy`PhPo*iw(a6GwO+K8SY4Ryr9o+&^}PeA7Yt&<~SWEqs5QP`fz~ zPRvu$T=L4FTpi4Pe$j@Xc$470g=A%W*~;X!`%iz{F(3tn6%Yjs1%j z;WnTPVLt7}k9dDDO3ULtim+$?c5N!IPk)i|GZUV$=SKM*v?(9a#P^Hse8uf?o4F9K ziqYpF{1h{33ur1og|WCg{)uJIoH?Q`Q)#nl;vRJsP4lq{KfyaR;g6WAsi`U6`}89G z3YN6!IdfkxW}QlRRCMHt@bJ(PTRZFamuJ0{$Je507PP02pSW+C`tmC?Hv~s{pX(pq z|Lrj27CU(!I>vjWw*Dq;+Ajab)?xkNRXv;o-FI zk5$ZDD`CF8sR47AVtpBVug5jkz}&iXo9BUA##nUW>1T%UXm>bmP(!GX{T*)n*|+As zsuvq#i2~l2gph3;7$ikWXBRf^Z(%;R1MHdKWWRwqej;~~+*4P^=CgQx<7>9!+i8=Y zo3m))8_p@rdr>5LVlVS=V=8%HSlNcivW;-@w}r1GW8lWCnZL6J;moDVj`l#D*9N#U zzd~){n;PrZt+6R6PDUDYhT_vB5nNRXMQ<#6;d#as!YPutQ~hqByw6hyfr z&et6FCd)sIj*1lb-Oun^{ajvQqEi2{{q$kRs~H2OrjXE*Ie3P1=~2#Y)c2{N*27l5 zFWA!vfq{}%@maA%LKB_$b^--s$lUf$( zIq_d*WTvVA?bCnz>*(cF<{jhDI3#0I)GO+tj%*k2@q4L()4ZFyIpmSIG*vUdz~@_E zAGgRSKPw*RCZm- zJXR)GlcW_?dly#UkIc^cYf4f6mr?nJH(gyN#Yu^A-(MT5J~PVMNLZd2$-;hS5$_SE M{0w{kGkPum3!LS*x&QzG literal 0 HcmV?d00001 diff --git a/src/wraith/contrib/win32build/tor.nsi.in b/src/wraith/contrib/win32build/tor.nsi.in new file mode 100644 index 000000000..dd24df454 --- /dev/null +++ b/src/wraith/contrib/win32build/tor.nsi.in @@ -0,0 +1,214 @@ +;tor.nsi - A basic win32 installer for Tor +; Originally written by J Doe. +; See LICENSE for licensing information +;----------------------------------------- +; NOTE: This file might be obsolete. Look at tor-mingw.nsi.in instead. +;----------------------------------------- +; How to make an installer: +; Step 0. If you are a Tor maintainer, make sure that tor.nsi and +; src/win32/orconfig.h all have the correct version number. +; Step 1. Download and install OpenSSL. Make sure that the OpenSSL +; version listed below matches the one you downloaded. +; Step 2. Download and install NSIS (http://nsis.sourceforge.net) +; Step 3. Make a directory under the main tor directory called "bin". +; Step 4. Copy ssleay32.dll and libeay32.dll from OpenSSL into "bin". +; Step 5. Run man2html on tor.1.in; call the result tor-reference.html +; Run man2html on tor-resolve.1; call the result tor-resolve.html +; Step 6. Copy torrc.sample.in to torrc.sample. +; Step 7. Build tor.exe and tor_resolve.exe; save the result into bin. +; Step 8. cd into contrib and run "makensis tor.nsi". +; +; Problems: +; - Copying torrc.sample.in to torrc.sample and tor.1.in (implicitly) +; to tor.1 is a Bad Thing, and leaves us with @autoconf@ vars in the final +; result. +; - Building Tor requires too much windows C clue. +; - We should have actual makefiles for VC that do the right thing. +; - I need to learn more NSIS juju to solve these: +; - There should be a batteries-included installer that comes with +; privoxy too. (Check privoxy license on this; be sure to include +; all privoxy documents.) +; - The filename should probably have a revision number. + +!include "MUI.nsh" + +!define VERSION "0.1.2.3-alpha-dev" +!define INSTALLER "tor-${VERSION}-win32.exe" +!define WEBSITE "https://www.torproject.org/" + +!define LICENSE "..\LICENSE" +;BIN is where it expects to find tor.exe, tor_resolve.exe, libeay32.dll and +; ssleay32.dll +!define BIN "..\bin" + +SetCompressor lzma +;SetCompressor zlib +OutFile ${INSTALLER} +InstallDir $PROGRAMFILES\Tor +SetOverWrite ifnewer + +Name "Tor" +Caption "Tor ${VERSION} Setup" +BrandingText "The Onion Router" +CRCCheck on + +;Use upx on the installer header to shrink the size. +!packhdr header.dat "upx --best header.dat" + +!define MUI_WELCOMEPAGE_TITLE "Welcome to the Tor ${VERSION} Setup Wizard" +!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Tor ${VERSION}.\r\n\r\nIf you have previously installed Tor and it is currently running, please exit Tor first before continuing this installation.\r\n\r\n$_CLICK" +!define MUI_ABORTWARNING +!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\win-install.ico" +!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\win-uninstall.ico" +!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp" +!define MUI_HEADERIMAGE +!define MUI_FINISHPAGE_RUN "$INSTDIR\tor.exe" +!define MUI_FINISHPAGE_LINK "Visit the Tor website for the latest updates." +!define MUI_FINISHPAGE_LINK_LOCATION ${WEBSITE} + +!insertmacro MUI_PAGE_WELCOME +; There's no point in having a clickthrough license: Our license adds +; certain rights, but doesn't remove them. +; !insertmacro MUI_PAGE_LICENSE "${LICENSE}" +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH +!insertmacro MUI_UNPAGE_WELCOME +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH +!insertmacro MUI_LANGUAGE "English" + +Var configdir +Var configfile + +;Sections +;-------- + +Section "Tor" Tor +;Files that have to be installed for tor to run and that the user +;cannot choose not to install + SectionIn RO + SetOutPath $INSTDIR + File "${BIN}\tor.exe" + File "${BIN}\tor_resolve.exe" + WriteIniStr "$INSTDIR\Tor Website.url" "InternetShortcut" "URL" ${WEBSITE} + + StrCpy $configfile "torrc" + StrCpy $configdir $APPDATA\Tor +; ;If $APPDATA isn't valid here (Early win95 releases with no updated +; ; shfolder.dll) then we put it in the program directory instead. +; StrCmp $APPDATA "" "" +2 +; StrCpy $configdir $INSTDIR + SetOutPath $configdir + ;If there's already a torrc config file, ask if they want to + ;overwrite it with the new one. + IfFileExists "$configdir\torrc" "" endiftorrc + MessageBox MB_ICONQUESTION|MB_YESNO "You already have a Tor config file.$\r$\nDo you want to overwrite it with the default sample config file?" IDNO yesreplace + Delete $configdir\torrc + Goto endiftorrc + yesreplace: + StrCpy $configfile "torrc.sample" + endiftorrc: + File /oname=$configfile "..\src\config\torrc.sample" +SectionEnd + +Section "OpenSSL 0.9.8a" OpenSSL + SetOutPath $INSTDIR + File "${BIN}\libeay32.dll" + File "${BIN}\ssleay32.dll" +SectionEnd + +Section "Documents" Docs + SetOutPath "$INSTDIR\Documents" + ;File "..\doc\FAQ" + File "..\doc\HACKING" + File "..\doc\spec\control-spec.txt" + File "..\doc\spec\dir-spec.txt" + File "..\doc\spec\rend-spec.txt" + File "..\doc\spec\socks-extensions.txt" + File "..\doc\spec\tor-spec.txt" + File "..\doc\spec\version-spec.txt" + ; + ; WEBSITE-FILES-HERE + ; + File "..\doc\tor-resolve.html" + File "..\doc\tor-reference.html" + ; + File "..\doc\design-paper\tor-design.pdf" + ; + File "..\README" + File "..\AUTHORS" + File "..\ChangeLog" + File "..\LICENSE" +SectionEnd + +SubSection /e "Shortcuts" Shortcuts + +Section "Start Menu" StartMenu + SetOutPath $INSTDIR + IfFileExists "$SMPROGRAMS\Tor\*.*" "" +2 + RMDir /r "$SMPROGRAMS\Tor" + CreateDirectory "$SMPROGRAMS\Tor" + CreateShortCut "$SMPROGRAMS\Tor\Tor.lnk" "$INSTDIR\tor.exe" + CreateShortCut "$SMPROGRAMS\Tor\Torrc.lnk" "Notepad.exe" "$configdir\torrc" + CreateShortCut "$SMPROGRAMS\Tor\Tor Website.lnk" "$INSTDIR\Tor Website.url" + CreateShortCut "$SMPROGRAMS\Tor\Uninstall.lnk" "$INSTDIR\Uninstall.exe" + IfFileExists "$INSTDIR\Documents\*.*" "" endifdocs + CreateDirectory "$SMPROGRAMS\Tor\Documents" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Manual.lnk" "$INSTDIR\Documents\tor-reference.html" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Documentation.lnk" "$INSTDIR\Documents" + CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Specification.lnk" "$INSTDIR\Documents\tor-spec.txt" + endifdocs: +SectionEnd + +Section "Desktop" Desktop + SetOutPath $INSTDIR + CreateShortCut "$DESKTOP\Tor.lnk" "$INSTDIR\tor.exe" +SectionEnd + +Section /o "Run at startup" Startup + SetOutPath $INSTDIR + CreateShortCut "$SMSTARTUP\Tor.lnk" "$INSTDIR\tor.exe" "" "" 0 SW_SHOWMINIMIZED +SectionEnd + +SubSectionEnd + +Section "Uninstall" + Delete "$DESKTOP\Tor.lnk" + Delete "$INSTDIR\libeay32.dll" + Delete "$INSTDIR\ssleay32.dll" + Delete "$INSTDIR\tor.exe" + Delete "$INSTDIR\tor_resolve.exe" + Delete "$INSTDIR\Tor Website.url" + Delete "$INSTDIR\torrc" + Delete "$INSTDIR\torrc.sample" + StrCmp $configdir $INSTDIR +2 "" + RMDir /r $configdir + Delete "$INSTDIR\Uninstall.exe" + RMDir /r "$INSTDIR\Documents" + RMDir $INSTDIR + RMDir /r "$SMPROGRAMS\Tor" + Delete "$SMSTARTUP\Tor.lnk" + DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Tor" +SectionEnd + +Section -End + WriteUninstaller "$INSTDIR\Uninstall.exe" + ;The registry entries simply add the Tor uninstaller to the Windows + ;uninstall list. + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "DisplayName" "Tor (remove only)" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "UninstallString" '"$INSTDIR\Uninstall.exe"' +SectionEnd + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${Tor} "The core executable and config files needed for Tor to run." + !insertmacro MUI_DESCRIPTION_TEXT ${OpenSSL} "OpenSSL libraries required by Tor." + !insertmacro MUI_DESCRIPTION_TEXT ${Docs} "Documentation about Tor." + !insertmacro MUI_DESCRIPTION_TEXT ${ShortCuts} "Shortcuts to easily start Tor" + !insertmacro MUI_DESCRIPTION_TEXT ${StartMenu} "Shortcuts to access Tor and its documentation from the Start Menu" + !insertmacro MUI_DESCRIPTION_TEXT ${Desktop} "A shortcut to start Tor from the desktop" + !insertmacro MUI_DESCRIPTION_TEXT ${Startup} "Launches Tor automatically at startup in a minimized window" +!insertmacro MUI_FUNCTION_DESCRIPTION_END + diff --git a/src/wraith/defconfig b/src/wraith/defconfig new file mode 100644 index 000000000..1a0ba2c4d --- /dev/null +++ b/src/wraith/defconfig @@ -0,0 +1,1249 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_UID16=y +CONFIG_GENERIC_ISA_DMA=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +CONFIG_STANDALONE=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_AUDIT=y +CONFIG_AUDITSYSCALL=y +CONFIG_LOG_BUF_SHIFT=15 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODULE_UNLOAD is not set +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +CONFIG_KMOD=y + +# +# Processor type and features +# +CONFIG_X86_PC=y +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +# CONFIG_M686 is not set +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +CONFIG_MPENTIUM4=y +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MEFFICEON is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +# CONFIG_X86_GENERIC is not set +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_GOOD_APIC=y +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +# CONFIG_HPET_TIMER is not set +# CONFIG_HPET_EMULATE_RTC is not set +CONFIG_SMP=y +CONFIG_NR_CPUS=8 +CONFIG_SCHED_SMT=y +CONFIG_PREEMPT=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_TSC=y +CONFIG_X86_MCE=y +CONFIG_X86_MCE_NONFATAL=y +CONFIG_X86_MCE_P4THERMAL=y +# CONFIG_TOSHIBA is not set +# CONFIG_I8K is not set +# CONFIG_MICROCODE is not set +# CONFIG_X86_MSR is not set +# CONFIG_X86_CPUID is not set + +# +# Firmware Drivers +# +# CONFIG_EDD is not set +CONFIG_NOHIGHMEM=y +# CONFIG_HIGHMEM4G is not set +# CONFIG_HIGHMEM64G is not set +# CONFIG_MATH_EMULATION is not set +CONFIG_MTRR=y +# CONFIG_EFI is not set +CONFIG_IRQBALANCE=y +CONFIG_HAVE_DEC_LOCK=y +# CONFIG_REGPARM is not set + +# +# Power management options (ACPI, APM) +# +CONFIG_PM=y +CONFIG_SOFTWARE_SUSPEND=y +# CONFIG_PM_DISK is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_BOOT=y +CONFIG_ACPI_INTERPRETER=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +CONFIG_ACPI_AC=y +CONFIG_ACPI_BATTERY=y +CONFIG_ACPI_BUTTON=y +CONFIG_ACPI_FAN=y +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_THERMAL=y +# CONFIG_ACPI_ASUS is not set +# CONFIG_ACPI_TOSHIBA is not set +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_BUS=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_PCI=y +CONFIG_ACPI_SYSTEM=y +# CONFIG_X86_PM_TIMER is not set + +# +# APM (Advanced Power Management) BIOS Support +# +# CONFIG_APM is not set + +# +# CPU Frequency scaling +# +# CONFIG_CPU_FREQ is not set + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GODIRECT is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +# CONFIG_PCI_USE_VECTOR is not set +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y +CONFIG_ISA=y +# CONFIG_EISA is not set +# CONFIG_MCA is not set +# CONFIG_SCx200 is not set + +# +# PCMCIA/CardBus support +# +# CONFIG_PCMCIA is not set +CONFIG_PCMCIA_PROBE=y + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_AOUT=y +CONFIG_BINFMT_MISC=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_FW_LOADER=m + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +CONFIG_PARPORT=y +CONFIG_PARPORT_PC=y +CONFIG_PARPORT_PC_CML1=y +# CONFIG_PARPORT_SERIAL is not set +# CONFIG_PARPORT_PC_FIFO is not set +# CONFIG_PARPORT_PC_SUPERIO is not set +# CONFIG_PARPORT_OTHER is not set +# CONFIG_PARPORT_1284 is not set + +# +# Plug and Play support +# +CONFIG_PNP=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +# CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set + +# +# Block devices +# +CONFIG_BLK_DEV_FD=y +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_CARMEL is not set +# CONFIG_BLK_DEV_RAM is not set +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=y +CONFIG_IDEDISK_MULTI_MODE=y +CONFIG_BLK_DEV_IDECD=y +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_TASKFILE_IO=y + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=y +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +# CONFIG_BLK_DEV_IDEPNP is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=y +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_RZ1000=y +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_ADMA=y +# CONFIG_BLK_DEV_AEC62XX is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +# CONFIG_BLK_DEV_ATIIXP is not set +# CONFIG_BLK_DEV_CMD64X is not set +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_BLK_DEV_SC1200 is not set +CONFIG_BLK_DEV_PIIX=y +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_PDC202XX_OLD is not set +# CONFIG_BLK_DEV_PDC202XX_NEW is not set +# CONFIG_BLK_DEV_SVWKS is not set +# CONFIG_BLK_DEV_SIIMAGE is not set +# CONFIG_BLK_DEV_SIS5513 is not set +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_VIA82CXXX is not set +# CONFIG_IDE_ARM is not set +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +CONFIG_CHR_DEV_SG=y + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set + +# +# SCSI Transport Attributes +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set + +# +# SCSI low-level drivers +# +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_7000FASST is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AHA152X is not set +# CONFIG_SCSI_AHA1542 is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC7XXX_OLD is not set +# CONFIG_SCSI_AIC79XX is not set +CONFIG_SCSI_DPT_I2O=m +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_IN2000 is not set +# CONFIG_SCSI_MEGARAID is not set +CONFIG_SCSI_SATA=y +# CONFIG_SCSI_SATA_SVW is not set +CONFIG_SCSI_ATA_PIIX=y +# CONFIG_SCSI_SATA_PROMISE is not set +CONFIG_SCSI_SATA_SX4=m +# CONFIG_SCSI_SATA_SIL is not set +CONFIG_SCSI_SATA_SIS=m +# CONFIG_SCSI_SATA_VIA is not set +# CONFIG_SCSI_SATA_VITESSE is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_CPQFCTS is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_DTC3280 is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_EATA_PIO is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_GDTH is not set +# CONFIG_SCSI_GENERIC_NCR5380 is not set +# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_PPA is not set +# CONFIG_SCSI_IMM is not set +# CONFIG_SCSI_NCR53C406A is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +# CONFIG_SCSI_PAS16 is not set +# CONFIG_SCSI_PSI240I is not set +# CONFIG_SCSI_QLOGIC_FAS is not set +# CONFIG_SCSI_QLOGIC_ISP is not set +# CONFIG_SCSI_QLOGIC_FC is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +CONFIG_SCSI_QLA2XXX=y +# CONFIG_SCSI_QLA21XX is not set +# CONFIG_SCSI_QLA22XX is not set +# CONFIG_SCSI_QLA2300 is not set +# CONFIG_SCSI_QLA2322 is not set +# CONFIG_SCSI_QLA6312 is not set +# CONFIG_SCSI_QLA6322 is not set +# CONFIG_SCSI_SYM53C416 is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_T128 is not set +# CONFIG_SCSI_U14_34F is not set +# CONFIG_SCSI_ULTRASTOR is not set +# CONFIG_SCSI_NSP32 is not set +# CONFIG_SCSI_DEBUG is not set + +# +# Old CD-ROM drivers (not SCSI, not IDE) +# +# CONFIG_CD_NO_IDESCSI is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set + +# +# Fusion MPT device support +# +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=y + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +# CONFIG_IEEE1394_OUI_DB is not set +# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set + +# +# Device Drivers +# + +# +# Texas Instruments PCILynx requires I2C +# +CONFIG_IEEE1394_OHCI1394=y + +# +# Protocol Drivers +# +# CONFIG_IEEE1394_VIDEO1394 is not set +# CONFIG_IEEE1394_SBP2 is not set +# CONFIG_IEEE1394_ETH1394 is not set +# CONFIG_IEEE1394_DV1394 is not set +CONFIG_IEEE1394_RAWIO=y +# CONFIG_IEEE1394_CMP is not set + +# +# I2O device support +# +# CONFIG_I2O is not set + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +# CONFIG_NETLINK_DEV is not set +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set + +# +# IP: Virtual Server Configuration +# +# CONFIG_IP_VS is not set +# CONFIG_IPV6 is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=y +# CONFIG_IP_NF_FTP is not set +# CONFIG_IP_NF_IRC is not set +# CONFIG_IP_NF_TFTP is not set +# CONFIG_IP_NF_AMANDA is not set +CONFIG_IP_NF_QUEUE=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_LIMIT=y +CONFIG_IP_NF_MATCH_IPRANGE=y +CONFIG_IP_NF_MATCH_MAC=y +CONFIG_IP_NF_MATCH_PKTTYPE=y +CONFIG_IP_NF_MATCH_MARK=y +CONFIG_IP_NF_MATCH_MULTIPORT=y +CONFIG_IP_NF_MATCH_TOS=y +CONFIG_IP_NF_MATCH_RECENT=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_DSCP=y +CONFIG_IP_NF_MATCH_AH_ESP=y +CONFIG_IP_NF_MATCH_LENGTH=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_MATCH_TCPMSS=y +CONFIG_IP_NF_MATCH_HELPER=y +CONFIG_IP_NF_MATCH_STATE=y +CONFIG_IP_NF_MATCH_CONNTRACK=y +CONFIG_IP_NF_MATCH_OWNER=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_SAME=y +# CONFIG_IP_NF_NAT_LOCAL is not set +# CONFIG_IP_NF_NAT_SNMP_BASIC is not set +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_TARGET_TOS=y +CONFIG_IP_NF_TARGET_ECN=y +CONFIG_IP_NF_TARGET_DSCP=y +CONFIG_IP_NF_TARGET_MARK=y +CONFIG_IP_NF_TARGET_CLASSIFY=y +CONFIG_IP_NF_TARGET_LOG=y +CONFIG_IP_NF_TARGET_ULOG=y +CONFIG_IP_NF_TARGET_TCPMSS=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_NET_SB1000 is not set + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set + +# +# Tulip family network device support +# +# CONFIG_NET_TULIP is not set +# CONFIG_AT1700 is not set +# CONFIG_DEPCA is not set +# CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set +CONFIG_NET_PCI=y +# CONFIG_PCNET32 is not set +# CONFIG_AMD8111_ETH is not set +# CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_AC3200 is not set +# CONFIG_APRICOT is not set +# CONFIG_B44 is not set +# CONFIG_FORCEDETH is not set +# CONFIG_CS89x0 is not set +# CONFIG_DGRS is not set +# CONFIG_EEPRO100 is not set +# CONFIG_E100 is not set +# CONFIG_FEALNX is not set +# CONFIG_NATSEMI is not set +# CONFIG_NE2K_PCI is not set +# CONFIG_8139CP is not set +CONFIG_8139TOO=y +CONFIG_8139TOO_PIO=y +# CONFIG_8139TOO_TUNE_TWISTER is not set +# CONFIG_8139TOO_8129 is not set +# CONFIG_8139_OLD_RX_RESET is not set +# CONFIG_SIS900 is not set +# CONFIG_EPIC100 is not set +# CONFIG_SUNDANCE is not set +# CONFIG_TLAN is not set +# CONFIG_VIA_RHINE is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set + +# +# Ethernet (10000 Mbit) +# +# CONFIG_IXGB is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_NET_FC is not set +# CONFIG_SHAPER is not set +# CONFIG_NETCONSOLE is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input I/O drivers +# +# CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PARKBD is not set +# CONFIG_SERIO_PCIPS2 is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_INPORT is not set +# CONFIG_MOUSE_LOGIBM is not set +# CONFIG_MOUSE_PC110PAD is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_ACPI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_PRINTER=y +# CONFIG_LP_CONSOLE is not set +# CONFIG_PPDEV is not set +# CONFIG_TIPAR is not set +# CONFIG_QIC02_TAPE is not set + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_HW_RANDOM is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_GEN_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set + +# +# Ftape, the floppy tape device driver +# +CONFIG_AGP=y +# CONFIG_AGP_ALI is not set +# CONFIG_AGP_ATI is not set +# CONFIG_AGP_AMD is not set +# CONFIG_AGP_AMD64 is not set +CONFIG_AGP_INTEL=y +CONFIG_AGP_INTEL_MCH=m +# CONFIG_AGP_NVIDIA is not set +# CONFIG_AGP_SIS is not set +# CONFIG_AGP_SWORKS is not set +# CONFIG_AGP_VIA is not set +# CONFIG_AGP_EFFICEON is not set +CONFIG_DRM=y +# CONFIG_DRM_TDFX is not set +# CONFIG_DRM_GAMMA is not set +# CONFIG_DRM_R128 is not set +# CONFIG_DRM_RADEON is not set +# CONFIG_DRM_I810 is not set +CONFIG_DRM_I830=y +# CONFIG_DRM_MGA is not set +# CONFIG_DRM_SIS is not set +# CONFIG_MWAVE is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_HANGCHECK_TIMER is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Misc devices +# +# CONFIG_IBM_ASM is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set + +# +# Graphics support +# +# CONFIG_FB is not set +# CONFIG_VIDEO_SELECT is not set + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y + +# +# Sound +# +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +CONFIG_SND_RAWMIDI=y +CONFIG_SND_SEQUENCER=y +# CONFIG_SND_SEQ_DUMMY is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +CONFIG_SND_SEQUENCER_OSS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_VIRMIDI is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# ISA devices +# +# CONFIG_SND_AD1848 is not set +# CONFIG_SND_CS4231 is not set +# CONFIG_SND_CS4232 is not set +# CONFIG_SND_CS4236 is not set +# CONFIG_SND_ES1688 is not set +# CONFIG_SND_ES18XX is not set +# CONFIG_SND_GUSCLASSIC is not set +# CONFIG_SND_GUSEXTREME is not set +# CONFIG_SND_GUSMAX is not set +# CONFIG_SND_INTERWAVE is not set +# CONFIG_SND_INTERWAVE_STB is not set +# CONFIG_SND_OPTI92X_AD1848 is not set +# CONFIG_SND_OPTI92X_CS4231 is not set +# CONFIG_SND_OPTI93X is not set +# CONFIG_SND_SB8 is not set +# CONFIG_SND_SB16 is not set +# CONFIG_SND_SBAWE is not set +# CONFIG_SND_WAVEFRONT is not set +# CONFIG_SND_CMI8330 is not set +# CONFIG_SND_OPL3SA2 is not set +# CONFIG_SND_SGALAXY is not set +# CONFIG_SND_SSCAPE is not set + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=y +# CONFIG_SND_ALI5451 is not set +# CONFIG_SND_ATIIXP is not set +# CONFIG_SND_AU8810 is not set +# CONFIG_SND_AU8820 is not set +# CONFIG_SND_AU8830 is not set +# CONFIG_SND_AZT3328 is not set +# CONFIG_SND_BT87X is not set +# CONFIG_SND_CS46XX is not set +# CONFIG_SND_CS4281 is not set +# CONFIG_SND_EMU10K1 is not set +# CONFIG_SND_KORG1212 is not set +# CONFIG_SND_MIXART is not set +# CONFIG_SND_NM256 is not set +# CONFIG_SND_RME32 is not set +# CONFIG_SND_RME96 is not set +# CONFIG_SND_RME9652 is not set +# CONFIG_SND_HDSP is not set +# CONFIG_SND_TRIDENT is not set +# CONFIG_SND_YMFPCI is not set +# CONFIG_SND_ALS4000 is not set +# CONFIG_SND_CMIPCI is not set +# CONFIG_SND_ENS1370 is not set +# CONFIG_SND_ENS1371 is not set +# CONFIG_SND_ES1938 is not set +# CONFIG_SND_ES1968 is not set +# CONFIG_SND_MAESTRO3 is not set +# CONFIG_SND_FM801 is not set +# CONFIG_SND_ICE1712 is not set +# CONFIG_SND_ICE1724 is not set +CONFIG_SND_INTEL8X0=y +# CONFIG_SND_INTEL8X0M is not set +# CONFIG_SND_SONICVIBES is not set +# CONFIG_SND_VIA82XX is not set +# CONFIG_SND_VX222 is not set + +# +# ALSA USB devices +# +# CONFIG_SND_USB_AUDIO is not set + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set + +# +# USB support +# +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=y +# CONFIG_USB_EHCI_SPLIT_ISO is not set +# CONFIG_USB_EHCI_ROOT_HUB_TT is not set +# CONFIG_USB_OHCI_HCD is not set +CONFIG_USB_UHCI_HCD=y + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH_TTY is not set +# CONFIG_USB_MIDI is not set +# CONFIG_USB_ACM is not set +CONFIG_USB_PRINTER=y +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +# CONFIG_USB_HIDDEV is not set +# CONFIG_USB_AIPTEK is not set +# CONFIG_USB_WACOM is not set +# CONFIG_USB_KBTAB is not set +# CONFIG_USB_POWERMATE is not set +# CONFIG_USB_MTOUCH is not set +CONFIG_USB_EGALAX=m +# CONFIG_USB_XPAD is not set +# CONFIG_USB_ATI_REMOTE is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# +# CONFIG_USB_DABUSB is not set + +# +# Video4Linux support is needed for USB Multimedia device support +# + +# +# USB Network adaptors +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_TIGL is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set +CONFIG_USB_CYTHERM=m +CONFIG_USB_PHIDGETSERVO=m +# CONFIG_USB_TEST is not set + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=y + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +# CONFIG_ZISOFS is not set +CONFIG_UDF_FS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +# CONFIG_DEVFS_FS is not set +# CONFIG_DEVPTS_FS_XATTR is not set +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=y +# CONFIG_NFS_V3 is not set +# CONFIG_NFS_V4 is not set +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=y +# CONFIG_NFSD_V3 is not set +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=y +CONFIG_EXPORTFS=y +CONFIG_SUNRPC=y +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=y + +# +# Kernel hacking +# +# CONFIG_DEBUG_KERNEL is not set +CONFIG_EARLY_PRINTK=y +CONFIG_DEBUG_SPINLOCK_SLEEP=y +# CONFIG_FRAME_POINTER is not set +CONFIG_4KSTACKS=y +CONFIG_X86_FIND_SMP_CONFIG=y +CONFIG_X86_MPPARSE=y + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +CONFIG_CRC32=y +CONFIG_LIBCRC32C=m +CONFIG_X86_SMP=y +CONFIG_X86_HT=y +CONFIG_X86_BIOS_REBOOT=y +CONFIG_X86_TRAMPOLINE=y +CONFIG_X86_STD_RESOURCES=y +CONFIG_PC=y diff --git a/src/wraith/doc/HACKING/CodingStandards.md b/src/wraith/doc/HACKING/CodingStandards.md new file mode 100644 index 000000000..79a6a9f0c --- /dev/null +++ b/src/wraith/doc/HACKING/CodingStandards.md @@ -0,0 +1,419 @@ +Coding conventions for Tor +========================== + +tl;dr: + + - Run configure with `--enable-fatal-warnings` + - Document your functions + - Write unit tests + - Run `make check` before submitting a patch + - Run `make distcheck` if you have made changes to build system components + - Add a file in `changes` for your branch. + +Patch checklist +--------------- + +If possible, send your patch as one of these (in descending order of +preference) + + - A git branch we can pull from + - Patches generated by git format-patch + - A unified diff + +Did you remember... + + - To build your code while configured with `--enable-fatal-warnings`? + - To run `make check-docs` to see whether all new options are on + the manpage? + - To write unit tests, as possible? + - To run `make test-full` to test against all unit and integration tests (or + `make test-full-online` if you have a working connection to the internet)? + - To test that the distribution will actually work via `make distcheck`? + - To base your code on the appropriate branch? + - To include a file in the `changes` directory as appropriate? + +If you are submitting a major patch or new feature, or want to in the future... + + - Set up Chutney and Stem, see HACKING/WritingTests.md + - Run `make test-full` to test against all unit and integration tests. + +If you have changed build system components: + - Please run `make distcheck` + - For example, if you have changed Makefiles, autoconf files, or anything + else that affects the build system. + +How we use Git branches +======================= + +Each main development series (like 0.2.1, 0.2.2, etc) has its main work +applied to a single branch. At most one series can be the development series +at a time; all other series are maintenance series that get bug-fixes only. +The development series is built in a git branch called "master"; the +maintenance series are built in branches called "maint-0.2.0", "maint-0.2.1", +and so on. We regularly merge the active maint branches forward. + +For all series except the development series, we also have a "release" branch +(as in "release-0.2.1"). The release series is based on the corresponding +maintenance series, except that it deliberately lags the maint series for +most of its patches, so that bugfix patches are not typically included in a +maintenance release until they've been tested for a while in a development +release. Occasionally, we'll merge an urgent bugfix into the release branch +before it gets merged into maint, but that's rare. + +If you're working on a bugfix for a bug that occurs in a particular version, +base your bugfix branch on the "maint" branch for the first supported series +that has that bug. (As of June 2013, we're supporting 0.2.3 and later.) + +If you're working on a new feature, base it on the master branch. If you're +working on a new feature and it will take a while to implement and/or you'd +like to avoid the possibility of unrelated bugs in Tor while you're +implementing your feature, consider branching off of the latest maint- branch. +_Never_ branch off a relase- branch. Don't branch off a tag either: they come +from release branches. Doing so will likely produce a nightmare of merge +conflicts in the ChangeLog when it comes time to merge your branch into Tor. +Best advice: don't try to keep an independent branch forked for more than 6 +months and expect it to merge cleanly. Try to merge pieces early and often. + + +How we log changes +================== + +When you do a commit that needs a ChangeLog entry, add a new file to +the `changes` toplevel subdirectory. It should have the format of a +one-entry changelog section from the current ChangeLog file, as in + +- Major bugfixes: + - Fix a potential buffer overflow. Fixes bug 99999; bugfix on + 0.3.1.4-beta. + +To write a changes file, first categorize the change. Some common categories +are: Minor bugfixes, Major bugfixes, Minor features, Major features, Code +simplifications and refactoring. Then say what the change does. If +it's a bugfix, mention what bug it fixes and when the bug was +introduced. To find out which Git tag the change was introduced in, +you can use `git describe --contains `. + +If at all possible, try to create this file in the same commit where you are +making the change. Please give it a distinctive name that no other branch will +use for the lifetime of your change. To verify the format of the changes file, +you can use `make check-changes`. This is run automatically as part of +`make check` -- if it fails, we must fix it before we release. These +checks are implemented in `scripts/maint/lintChanges.py`. + +Changes file style guide: + * Changes files begin with " o Header (subheading):". The header + should usually be "Minor/Major bugfixes/features". The subheading is a + particular area within Tor. See the ChangeLog for examples. + + * Make everything terse. + + * Write from the user's point of view: describe the user-visible changes + right away. + + * Mention configuration options by name. If they're rare or unusual, + remind people what they're for. + + * Describe changes in the present tense and in the imperative: not past. + + * Every bugfix should have a sentence of the form "Fixes bug 1234; bugfix + on 0.1.2.3-alpha", describing what bug was fixed and where it came from. + + * "Relays", not "servers", "nodes", or "Tor relays". + +When we go to make a release, we will concatenate all the entries +in changes to make a draft changelog, and clear the directory. We'll +then edit the draft changelog into a nice readable format. + +What needs a changes file? + + * A not-exhaustive list: Anything that might change user-visible + behavior. Anything that changes internals, documentation, or the build + system enough that somebody could notice. Big or interesting code + rewrites. Anything about which somebody might plausibly wonder "when + did that happen, and/or why did we do that" 6 months down the line. + +What does not need a changes file? + + * Bugfixes for code that hasn't shipped in any released version of Tor + +Why use changes files instead of Git commit messages? + + * Git commit messages are written for developers, not users, and they + are nigh-impossible to revise after the fact. + +Why use changes files instead of entries in the ChangeLog? + + * Having every single commit touch the ChangeLog file tended to create + zillions of merge conflicts. + +Whitespace and C conformance +---------------------------- + +Invoke `make check-spaces` from time to time, so it can tell you about +deviations from our C whitespace style. Generally, we use: + + - Unix-style line endings + - K&R-style indentation + - No space before newlines + - A blank line at the end of each file + - Never more than one blank line in a row + - Always spaces, never tabs + - No more than 79-columns per line. + - Two spaces per indent. + - A space between control keywords and their corresponding paren + `if (x)`, `while (x)`, and `switch (x)`, never `if(x)`, `while(x)`, or + `switch(x)`. + - A space between anything and an open brace. + - No space between a function name and an opening paren. `puts(x)`, not + `puts (x)`. + - Function declarations at the start of the line. + +We try hard to build without warnings everywhere. In particular, if +you're using gcc, you should invoke the configure script with the +option `--enable-fatal-warnings`. This will tell the compiler +to make all warnings into errors. + +Functions to use; functions not to use +-------------------------------------- + +We have some wrapper functions like `tor_malloc`, `tor_free`, `tor_strdup`, and +`tor_gettimeofday;` use them instead of their generic equivalents. (They +always succeed or exit.) + +You can get a full list of the compatibility functions that Tor provides by +looking through `src/common/util*.h` and `src/common/compat*.h`. You can see the +available containers in `src/common/containers*.h`. You should probably +familiarize yourself with these modules before you write too much code, or +else you'll wind up reinventing the wheel. + +We don't use `strcat` or `strcpy` or `sprintf` of any of those notoriously broken +old C functions. Use `strlcat`, `strlcpy`, or `tor_snprintf/tor_asprintf` instead. + +We don't call `memcmp()` directly. Use `fast_memeq()`, `fast_memneq()`, +`tor_memeq()`, or `tor_memneq()` for most purposes. + +Also see a longer list of functions to avoid in: +https://people.torproject.org/~nickm/tor-auto/internal/this-not-that.html + +Floating point math is hard +--------------------------- + +Floating point arithmetic as typically implemented by computers is +very counterintuitive. Failure to adequately analyze floating point +usage can result in surprising behavior and even security +vulnerabilities! + +General advice: + + - Don't use floating point. + - If you must use floating point, document how the limits of + floating point precision and calculation accuracy affect function + outputs. + - Try to do as much as possible of your calculations using integers + (possibly acting as fixed-point numbers) and convert to floating + point for display. + - If you must send floating point numbers on the wire, serialize + them in a platform-independent way. Tor avoids exchanging + floating-point values, but when it does, it uses ASCII numerals, + with a decimal point ("."). + - Binary fractions behave very differently from decimal fractions. + Make sure you understand how these differences affect your + calculations. + - Every floating point arithmetic operation is an opportunity to + lose precision, overflow, underflow, or otherwise produce + undesired results. Addition and subtraction tend to be worse + than multiplication and division (due to things like catastrophic + cancellation). Try to arrange your calculations to minimize such + effects. + - Changing the order of operations changes the results of many + floating-point calculations. Be careful when you simplify + calculations! If the order is significant, document it using a + code comment. + - Comparing most floating point values for equality is unreliable. + Avoid using `==`, instead, use `>=` or `<=`. If you use an + epsilon value, make sure it's appropriate for the ranges in + question. + - Different environments (including compiler flags and per-thread + state on a single platform!) can get different results from the + same floating point calculations. This means you can't use + floats in anything that needs to be deterministic, like consensus + generation. This also makes reliable unit tests of + floating-point outputs hard to write. + +For additional useful advice (and a little bit of background), see +[What Every Programmer Should Know About Floating-Point +Arithmetic](http://floating-point-gui.de/). + +A list of notable (and surprising) facts about floating point +arithmetic is at [Floating-point +complexities](https://randomascii.wordpress.com/2012/04/05/floating-point-complexities/). +Most of that [series of posts on floating +point](https://randomascii.wordpress.com/category/floating-point/) is +helpful. + +For more detailed (and math-intensive) background, see [What Every +Computer Scientist Should Know About Floating-Point +Arithmetic](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). + +Other C conventions +------------------- + +The `a ? b : c` trinary operator only goes inside other expressions; +don't use it as a replacement for if. (You can ignore this inside macro +definitions when necessary.) + +Assignment operators shouldn't nest inside other expressions. (You can +ignore this inside macro definitions when necessary.) + +Functions not to write +---------------------- + +Try to never hand-write new code to parse or generate binary +formats. Instead, use trunnel if at all possible. See + + https://gitweb.torproject.org/trunnel.git/tree + +for more information about trunnel. + +For information on adding new trunnel code to Tor, see src/trunnel/README + + +Calling and naming conventions +------------------------------ + +Whenever possible, functions should return -1 on error and 0 on success. + +For multi-word identifiers, use lowercase words combined with +underscores. (e.g., `multi_word_identifier`). Use ALL_CAPS for macros and +constants. + +Typenames should end with `_t`. + +Function names should be prefixed with a module name or object name. (In +general, code to manipulate an object should be a module with the same name +as the object, so it's hard to tell which convention is used.) + +Functions that do things should have imperative-verb names +(e.g. `buffer_clear`, `buffer_resize`); functions that return booleans should +have predicate names (e.g. `buffer_is_empty`, `buffer_needs_resizing`). + +If you find that you have four or more possible return code values, it's +probably time to create an enum. If you find that you are passing three or +more flags to a function, it's probably time to create a flags argument that +takes a bitfield. + +What To Optimize +---------------- + +Don't optimize anything if it's not in the critical path. Right now, the +critical path seems to be AES, logging, and the network itself. Feel free to +do your own profiling to determine otherwise. + +Log conventions +--------------- + +`https://www.torproject.org/docs/faq#LogLevel` + +No error or warning messages should be expected during normal OR or OP +operation. + +If a library function is currently called such that failure always means ERR, +then the library function should log WARN and let the caller log ERR. + +Every message of severity INFO or higher should either (A) be intelligible +to end-users who don't know the Tor source; or (B) somehow inform the +end-users that they aren't expected to understand the message (perhaps +with a string like "internal error"). Option (A) is to be preferred to +option (B). + +Assertions In Tor +----------------- + +Assertions should be used for bug-detection only. Don't use assertions to +detect bad user inputs, network errors, resource exhaustion, or similar +issues. + +Tor is always built with assertions enabled, so try to only use +`tor_assert()` for cases where you are absolutely sure that crashing is the +least bad option. Many bugs have been caused by use of `tor_assert()` when +another kind of check would have been safer. + +If you're writing an assertion to test for a bug that you _can_ recover from, +use `tor_assert_nonfatal()` in place of `tor_assert()`. If you'd like to +write a conditional that incorporates a nonfatal assertion, use the `BUG()` +macro, as in: + + if (BUG(ptr == NULL)) + return -1; + +Allocator conventions +--------------------- + +By convention, any tor type with a name like `abc_t` should be allocated +by a function named `abc_new()`. This function should never return +NULL. + +Also, a type named `abc_t` should be freed by a function named `abc_free_()`. +Don't call this `abc_free_()` function directly -- instead, wrap it in a +macro called `abc_free()`, using the `FREE_AND_NULL` macro: + + void abc_free_(abc_t *obj); + #define abc_free(obj) FREE_AND_NULL(abc_t, abc_free_, (obj)) + +This macro will free the underlying `abc_t` object, and will also set +the object pointer to NULL. + +You should define all `abc_free_()` functions to accept NULL inputs: + + void + abc_free_(abc_t *obj) + { + if (!obj) + return; + tor_free(obj->name); + thing_free(obj->thing); + tor_free(obj); + } + +If you need a free function that takes a `void *` argument (for example, +to use it as a function callback), define it with a name like +`abc_free_void()`: + + static void + abc_free_void_(void *obj) + { + abc_free_(obj); + } + + +Doxygen comment conventions +--------------------------- + +Say what functions do as a series of one or more imperative sentences, as +though you were telling somebody how to be the function. In other words, DO +NOT say: + + /** The strtol function parses a number. + * + * nptr -- the string to parse. It can include whitespace. + * endptr -- a string pointer to hold the first thing that is not part + * of the number, if present. + * base -- the numeric base. + * returns: the resulting number. + */ + long strtol(const char *nptr, char **nptr, int base); + +Instead, please DO say: + + /** Parse a number in radix base from the string nptr, + * and return the result. Skip all leading whitespace. If + * endptr is not NULL, set *endptr to the first character + * after the number parsed. + **/ + long strtol(const char *nptr, char **nptr, int base); + +Doxygen comments are the contract in our abstraction-by-contract world: if +the functions that call your function rely on it doing something, then your +function should mention that it does that something in the documentation. If +you rely on a function doing something beyond what is in its documentation, +then you should watch out, or it might do something else later. diff --git a/src/wraith/doc/HACKING/CodingStandardsRust.md b/src/wraith/doc/HACKING/CodingStandardsRust.md new file mode 100644 index 000000000..d0b17c160 --- /dev/null +++ b/src/wraith/doc/HACKING/CodingStandardsRust.md @@ -0,0 +1,469 @@ + + Rust Coding Standards +======================= + +You MUST follow the standards laid out in `.../doc/HACKING/CodingStandards.md`, +where applicable. + + Module/Crate Declarations +--------------------------- + +Each Tor C module which is being rewritten MUST be in its own crate. +See the structure of `.../src/rust` for examples. + +In your crate, you MUST use `lib.rs` ONLY for pulling in external +crates (e.g. `extern crate libc;`) and exporting public objects from +other Rust modules (e.g. `pub use mymodule::foo;`). For example, if +you create a crate in `.../src/rust/yourcrate`, your Rust code should +live in `.../src/rust/yourcrate/yourcode.rs` and the public interface +to it should be exported in `.../src/rust/yourcrate/lib.rs`. + +If your code is to be called from Tor C code, you MUST define a safe +`ffi.rs`. See the "Safety" section further down for more details. + +For example, in a hypothetical `tor_addition` Rust module: + +In `.../src/rust/tor_addition/addition.rs`: + + pub fn get_sum(a: i32, b: i32) -> i32 { + a + b + } + +In `.../src/rust/tor_addition/lib.rs`: + + pub use addition::*; + +In `.../src/rust/tor_addition/ffi.rs`: + + #[no_mangle] + pub extern "C" fn tor_get_sum(a: c_int, b: c_int) -> c_int { + get_sum(a, b) + } + +If your Rust code must call out to parts of Tor's C code, you must +declare the functions you are calling in the `external` crate, located +at `.../src/rust/external`. + + + + +Modules should strive to be below 500 lines (tests excluded). Single +responsibility and limited dependencies should be a guiding standard. + +If you have any external modules as dependencies (e.g. `extern crate +libc;`), you MUST declare them in your crate's `lib.rs` and NOT in any +other module. + + Dependencies +-------------- + +In general, we use modules from only the Rust standard library +whenever possible. We will review including external crates on a +case-by-case basis. + + Documentation +--------------- + +You MUST include `#[deny(missing_docs)]` in your crate. + +For function/method comments, you SHOULD include a one-sentence, "first person" +description of function behaviour (see requirements for documentation as +described in `.../src/HACKING/CodingStandards.md`), then an `# Inputs` section +for inputs or initialisation values, a `# Returns` section for return +values/types, a `# Warning` section containing warnings for unsafe behaviours or +panics that could happen. For publicly accessible +types/constants/objects/functions/methods, you SHOULD also include an +`# Examples` section with runnable doctests. + +You MUST document your module with _module docstring_ comments, +i.e. `//!` at the beginning of each line. + + Style +------- + +You SHOULD consider breaking up large literal numbers with `_` when it makes it +more human readable to do so, e.g. `let x: u64 = 100_000_000_000`. + + Testing +--------- + +All code MUST be unittested and integration tested. + +Public functions/objects exported from a crate SHOULD include doctests +describing how the function/object is expected to be used. + +Integration tests SHOULD go into a `tests/` directory inside your +crate. Unittests SHOULD go into their own module inside the module +they are testing, e.g. in `.../src/rust/tor_addition/addition.rs` you +should put: + + #[cfg(test)] + mod test { + use super::*; + + #[test] + fn addition_with_zero() { + let sum: i32 = get_sum(5i32, 0i32); + assert_eq!(sum, 5); + } + } + + Benchmarking +-------------- + +The external `test` crate can be used for most benchmarking. However, using +this crate requires nightly Rust. Since we may want to switch to a more +stable Rust compiler eventually, we shouldn't do things which will automatically +break builds for stable compilers. Therefore, you MUST feature-gate your +benchmarks in the following manner. + +If you wish to benchmark some of your Rust code, you MUST put the +following in the `[features]` section of your crate's `Cargo.toml`: + + [features] + bench = [] + +Next, in your crate's `lib.rs` you MUST put: + + #[cfg(all(test, feature = "bench"))] + extern crate test; + +This ensures that the external crate `test`, which contains utilities +for basic benchmarks, is only used when running benchmarks via `cargo +bench --features bench`. + +Finally, to write your benchmark code, in +`.../src/rust/tor_addition/addition.rs` you SHOULD put: + + #[cfg(all(test, features = "bench"))] + mod bench { + use test::Bencher; + use super::*; + + #[bench] + fn addition_small_integers(b: &mut Bencher) { + b.iter(| | get_sum(5i32, 0i32)); + } + } + + Fuzzing +--------- + +If you wish to fuzz parts of your code, please see the +[`cargo fuzz`](https://github.com/rust-fuzz/cargo-fuzz) crate, which uses +[libfuzzer-sys](https://github.com/rust-fuzz/libfuzzer-sys). + + Whitespace & Formatting +------------------------- + +You MUST run `rustfmt` (https://github.com/rust-lang-nursery/rustfmt) +on your code before your code will be merged. You can install rustfmt +by doing `cargo install rustfmt-nightly` and then run it with `cargo +fmt`. + + Safety +-------- + +You SHOULD read [the nomicon](https://doc.rust-lang.org/nomicon/) before writing +Rust FFI code. It is *highly advised* that you read and write normal Rust code +before attempting to write FFI or any other unsafe code. + +Here are some additional bits of advice and rules: + +0. Any behaviours which Rust considers to be undefined are forbidden + + From https://doc.rust-lang.org/reference/behavior-considered-undefined.html: + + > Behavior considered undefined + > + > The following is a list of behavior which is forbidden in all Rust code, + > including within unsafe blocks and unsafe functions. Type checking provides the + > guarantee that these issues are never caused by safe code. + > + > * Data races + > * Dereferencing a null/dangling raw pointer + > * Reads of [undef](http://llvm.org/docs/LangRef.html#undefined-values) + > (uninitialized) memory + > * Breaking the + > [pointer aliasing rules](http://llvm.org/docs/LangRef.html#pointer-aliasing-rules) + > with raw pointers (a subset of the rules used by C) + > * `&mut T` and `&T` follow LLVM’s scoped noalias model, except if the `&T` + > contains an `UnsafeCell`. Unsafe code must not violate these aliasing + > guarantees. + > * Mutating non-mutable data (that is, data reached through a shared + > reference or data owned by a `let` binding), unless that data is + > contained within an `UnsafeCell`. + > * Invoking undefined behavior via compiler intrinsics: + > - Indexing outside of the bounds of an object with + > `std::ptr::offset` (`offset` intrinsic), with the exception of + > one byte past the end which is permitted. + > - Using `std::ptr::copy_nonoverlapping_memory` (`memcpy32`/`memcpy64` + > intrinsics) on overlapping buffers + > * Invalid values in primitive types, even in private fields/locals: + > - Dangling/null references or boxes + > - A value other than `false` (0) or `true` (1) in a `bool` + > - A discriminant in an `enum` not included in the type definition + > - A value in a `char` which is a surrogate or above `char::MAX` + > - Non-UTF-8 byte sequences in a `str` + > * Unwinding into Rust from foreign code or unwinding from Rust into foreign + > code. Rust's failure system is not compatible with exception handling in other + > languages. Unwinding must be caught and handled at FFI boundaries. + +1. `unwrap()` + + If you call `unwrap()`, anywhere, even in a test, you MUST include + an inline comment stating how the unwrap will either 1) never fail, + or 2) should fail (i.e. in a unittest). + + You SHOULD NOT use `unwrap()` anywhere in which it is possible to handle the + potential error with either `expect()` or the eel operator, `?`. + For example, consider a function which parses a string into an integer: + + fn parse_port_number(config_string: &str) -> u16 { + u16::from_str_radix(config_string, 10).unwrap() + } + + There are numerous ways this can fail, and the `unwrap()` will cause the + whole program to byte the dust! Instead, either you SHOULD use `expect()` + (or another equivalent function which will return an `Option` or a `Result`) + and change the return type to be compatible: + + fn parse_port_number(config_string: &str) -> Option { + u16::from_str_radix(config_string, 10).expect("Couldn't parse port into a u16") + } + + or you SHOULD use `or()` (or another similar method): + + fn parse_port_number(config_string: &str) -> Option { + u16::from_str_radix(config_string, 10).or(Err("Couldn't parse port into a u16") + } + + Using methods like `or()` can be particularly handy when you must do + something afterwards with the data, for example, if we wanted to guarantee + that the port is high. Combining these methods with the eel operator (`?`) + makes this even easier: + + fn parse_port_number(config_string: &str) -> Result { + let port = u16::from_str_radix(config_string, 10).or(Err("Couldn't parse port into a u16"))?; + + if port > 1024 { + return Ok(port); + } else { + return Err("Low ports not allowed"); + } + } + +2. `unsafe` + + If you use `unsafe`, you MUST describe a contract in your + documentation which describes how and when the unsafe code may + fail, and what expectations are made w.r.t. the interfaces to + unsafe code. This is also REQUIRED for major pieces of FFI between + C and Rust. + + When creating an FFI in Rust for C code to call, it is NOT REQUIRED + to declare the entire function `unsafe`. For example, rather than doing: + + #[no_mangle] + pub unsafe extern "C" fn increment_and_combine_numbers(mut numbers: [u8; 4]) -> u32 { + for number in &mut numbers { + *number += 1; + } + std::mem::transmute::<[u8; 4], u32>(numbers) + } + + You SHOULD instead do: + + #[no_mangle] + pub extern "C" fn increment_and_combine_numbers(mut numbers: [u8; 4]) -> u32 { + for index in 0..numbers.len() { + numbers[index] += 1; + } + unsafe { + std::mem::transmute::<[u8; 4], u32>(numbers) + } + } + +3. Pass only integer types and bytes over the boundary + + The only non-integer type which may cross the FFI boundary is + bytes, e.g. `&[u8]`. This SHOULD be done on the Rust side by + passing a pointer (`*mut libc::c_char`) and a length + (`libc::size_t`). + + One might be tempted to do this via doing + `CString::new("blah").unwrap().into_raw()`. This has several problems: + + a) If you do `CString::new("bl\x00ah")` then the unwrap() will fail + due to the additional NULL terminator, causing a dangling + pointer to be returned (as well as a potential use-after-free). + + b) Returning the raw pointer will cause the CString to run its deallocator, + which causes any C code which tries to access the contents to dereference a + NULL pointer. + + c) If we were to do `as_raw()` this would result in a potential double-free + since the Rust deallocator would run and possibly Tor's deallocator. + + d) Calling `into_raw()` without later using the same pointer in Rust to call + `from_raw()` and then deallocate in Rust can result in a + [memory leak](https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_raw). + + [It was determined](https://github.com/rust-lang/rust/pull/41074) that this + is safe to do if you use the same allocator in C and Rust and also specify + the memory alignment for CString (except that there is no way to specify + the alignment for CString). It is believed that the alignment is always 1, + which would mean it's safe to dealloc the resulting `*mut c_char` in Tor's + C code. However, the Rust developers are not willing to guarantee the + stability of, or a contract for, this behaviour, citing concerns that this + is potentially extremely and subtly unsafe. + +4. Perform an allocation on the other side of the boundary + + After crossing the boundary, the other side MUST perform an + allocation to copy the data and is therefore responsible for + freeing that memory later. + +5. No touching other language's enums + + Rust enums should never be touched from C (nor can they be safely + `#[repr(C)]`) nor vice versa: + + > "The chosen size is the default enum size for the target platform's C + > ABI. Note that enum representation in C is implementation defined, so this is + > really a "best guess". In particular, this may be incorrect when the C code + > of interest is compiled with certain flags." + + (from https://gankro.github.io/nomicon/other-reprs.html) + +6. Type safety + + Wherever possible and sensical, you SHOULD create new types in a + manner which prevents type confusion or misuse. For example, + rather than using an untyped mapping between strings and integers + like so: + + use std::collections::HashMap; + + pub fn get_elements_with_over_9000_points(map: &HashMap) -> Vec { + ... + } + + It would be safer to define a new type, such that some other usage + of `HashMap` cannot be confused for this type: + + pub struct DragonBallZPowers(pub HashMap); + + impl DragonBallZPowers { + pub fn over_nine_thousand<'a>(&'a self) -> Vec<&'a String> { + let mut powerful_enough: Vec<&'a String> = Vec::with_capacity(5); + + for (character, power) in &self.0 { + if *power > 9000 { + powerful_enough.push(character); + } + } + powerful_enough + } + } + + Note the following code, which uses Rust's type aliasing, is valid + but it does NOT meet the desired type safety goals: + + pub type Power = usize; + + pub fn over_nine_thousand(power: &Power) -> bool { + if *power > 9000 { + return true; + } + false + } + + // We can still do the following: + let his_power: usize = 9001; + over_nine_thousand(&his_power); + +7. Unsafe mucking around with lifetimes + + Because lifetimes are technically, in type theory terms, a kind, i.e. a + family of types, individual lifetimes can be treated as types. For example, + one can arbitrarily extend and shorten lifetime using `std::mem::transmute`: + + struct R<'a>(&'a i32); + + unsafe fn extend_lifetime<'b>(r: R<'b>) -> R<'static> { + std::mem::transmute::, R<'static>>(r) + } + + unsafe fn shorten_invariant_lifetime<'b, 'c>(r: &'b mut R<'static>) -> &'b mut R<'c> { + std::mem::transmute::<&'b mut R<'static>, &'b mut R<'c>>(r) + } + + Calling `extend_lifetime()` would cause an `R` passed into it to live forever + for the life of the program (the `'static` lifetime). Similarly, + `shorten_invariant_lifetime()` could be used to take something meant to live + forever, and cause it to disappear! This is incredibly unsafe. If you're + going to be mucking around with lifetimes like this, first, you better have + an extremely good reason, and second, you may as be honest and explicit about + it, and for ferris' sake just use a raw pointer. + + In short, just because lifetimes can be treated like types doesn't mean you + should do it. + +8. Doing excessively unsafe things when there's a safer alternative + + Similarly to #7, often there are excessively unsafe ways to do a task and a + simpler, safer way. You MUST choose the safer option where possible. + + For example, `std::mem::transmute` can be abused in ways where casting with + `as` would be both simpler and safer: + + // Don't do this + let ptr = &0; + let ptr_num_transmute = unsafe { std::mem::transmute::<&i32, usize>(ptr)}; + + // Use an `as` cast instead + let ptr_num_cast = ptr as *const i32 as usize; + + In fact, using `std::mem::transmute` for *any* reason is a code smell and as + such SHOULD be avoided. + +9. Casting integers with `as` + + This is generally fine to do, but it has some behaviours which you should be + aware of. Casting down chops off the high bits, e.g.: + + let x: u32 = 4294967295; + println!("{}", x as u16); // prints 65535 + + Some cases which you MUST NOT do include: + + * Casting an `u128` down to an `f32` or vice versa (e.g. + `u128::MAX as f32` but this isn't only a problem with overflowing + as it is also undefined behaviour for `42.0f32 as u128`), + + * Casting between integers and floats when the thing being cast + cannot fit into the type it is being casted into, e.g.: + + println!("{}", 42949.0f32 as u8); // prints 197 in debug mode and 0 in release + println!("{}", 1.04E+17 as u8); // prints 0 in both modes + println!("{}", (0.0/0.0) as i64); // prints whatever the heck LLVM wants + + Because this behaviour is undefined, it can even produce segfaults in + safe Rust code. For example, the following program built in release + mode segfaults: + + #[inline(never)] + pub fn trigger_ub(sl: &[u8; 666]) -> &[u8] { + // Note that the float is out of the range of `usize`, invoking UB when casting. + let idx = 1e99999f64 as usize; + &sl[idx..] // The bound check is elided due to `idx` being of an undefined value. + } + + fn main() { + println!("{}", trigger_ub(&[1; 666])[999999]); // ~ out of bound + } + + And in debug mode panics with: + + thread 'main' panicked at 'slice index starts at 140721821254240 but ends at 666', /checkout/src/libcore/slice/mod.rs:754:4 diff --git a/src/wraith/doc/HACKING/Fuzzing.md b/src/wraith/doc/HACKING/Fuzzing.md new file mode 100644 index 000000000..2039d6a4c --- /dev/null +++ b/src/wraith/doc/HACKING/Fuzzing.md @@ -0,0 +1,123 @@ += Fuzzing Tor + +== The simple version (no fuzzing, only tests) + +Check out fuzzing-corpora, and set TOR_FUZZ_CORPORA to point to the place +where you checked it out. + +To run the fuzzing test cases in a deterministic fashion, use: + make test-fuzz-corpora + +This won't actually fuzz Tor! It will just run all the fuzz binaries +on our existing set of testcases for the fuzzer. + + +== Different kinds of fuzzing + +Right now we support three different kinds of fuzzer. + +First, there's American Fuzzy Lop (AFL), a fuzzer that works by forking +a target binary and passing it lots of different inputs on stdin. It's the +trickiest one to set up, so I'll be describing it more below. + +Second, there's libFuzzer, a llvm-based fuzzer that you link in as a library, +and it runs a target function over and over. To use this one, you'll need to +have a reasonably recent clang and libfuzzer installed. At that point, you +just build with --enable-expensive-hardening and --enable-libfuzzer. That +will produce a set of binaries in src/test/fuzz/lf-fuzz-* . These programs +take as input a series of directories full of fuzzing examples. For more +information on libfuzzer, see http://llvm.org/docs/LibFuzzer.html + +Third, there's Google's OSS-Fuzz infrastructure, which expects to get all of +its. For more on this, see https://github.com/google/oss-fuzz and the +projects/tor subdirectory. You'll need to mess around with Docker a bit to +test this one out; it's meant to run on Google's infrastructure. + +In all cases, you'll need some starting examples to give the fuzzer when it +starts out. There's a set in the "fuzzing-corpora" git repository. Try +setting TOR_FUZZ_CORPORA to point to a checkout of that repository + +== Writing Tor fuzzers + +A tor fuzzing harness should have: +* a fuzz_init() function to set up any necessary global state. +* a fuzz_main() function to receive input and pass it to a parser. +* a fuzz_cleanup() function to clear global state. + +Most fuzzing frameworks will produce many invalid inputs - a tor fuzzing +harness should rejecting invalid inputs without crashing or behaving badly. + +But the fuzzing harness should crash if tor fails an assertion, triggers a +bug, or accesses memory it shouldn't. This helps fuzzing frameworks detect +"interesting" cases. + + +== Guided Fuzzing with AFL + +There is no HTTPS, hash, or signature for American Fuzzy Lop's source code, so +its integrity can't be verified. That said, you really shouldn't fuzz on a +machine you care about, anyway. + +To Build: + Get AFL from http://lcamtuf.coredump.cx/afl/ and unpack it + cd afl + make + cd ../tor + PATH=$PATH:../afl/ CC="../afl/afl-gcc" ./configure --enable-expensive-hardening + AFL_HARDEN=1 make clean fuzzers + +To Find The ASAN Memory Limit: (64-bit only) + +On 64-bit platforms, afl needs to know how much memory ASAN uses, +because ASAN tends to allocate a ridiculous amount of virtual memory, +and then not actually use it. + +Read afl/docs/notes_for_asan.txt for more details. + + Download recidivm from http://jwilk.net/software/recidivm + Download the signature + Check the signature + tar xvzf recidivm*.tar.gz + cd recidivm* + make + /path/to/recidivm -v src/test/fuzz/fuzz-http + Use the final "ok" figure as the input to -m when calling afl-fuzz + (Normally, recidivm would output a figure automatically, but in some cases, + the fuzzing harness will hang when the memory limit is too small.) + +You could also just say "none" instead of the memory limit below, if you +don't care about memory limits. + + +To Run: + mkdir -p src/test/fuzz/fuzz_http_findings + ../afl/afl-fuzz -i ${TOR_FUZZ_CORPORA}/http -o src/test/fuzz/fuzz_http_findings -m -- src/test/fuzz/fuzz-http + + +AFL has a multi-core mode, check the documentation for details. +You might find the included fuzz-multi.sh script useful for this. + +macOS (OS X) requires slightly more preparation, including: +* using afl-clang (or afl-clang-fast from the llvm directory) +* disabling external crash reporting (AFL will guide you through this step) + +== Triaging Issues + +Crashes are usually interesting, particularly if using AFL_HARDEN=1 and --enable-expensive-hardening. Sometimes crashes are due to bugs in the harness code. + +Hangs might be interesting, but they might also be spurious machine slowdowns. +Check if a hang is reproducible before reporting it. Sometimes, processing +valid inputs may take a second or so, particularly with the fuzzer and +sanitizers enabled. + +To see what fuzz-http is doing with a test case, call it like this: + src/test/fuzz/fuzz-http --debug < /path/to/test.case + +(Logging is disabled while fuzzing to increase fuzzing speed.) + +== Reporting Issues + +Please report any issues discovered using the process in Tor's security issue +policy: + +https://trac.torproject.org/projects/tor/wiki/org/meetings/2016SummerDevMeeting/Notes/SecurityIssuePolicy diff --git a/src/wraith/doc/HACKING/GettingStarted.md b/src/wraith/doc/HACKING/GettingStarted.md new file mode 100644 index 000000000..0c4240463 --- /dev/null +++ b/src/wraith/doc/HACKING/GettingStarted.md @@ -0,0 +1,188 @@ + +Getting started in Tor development +================================== + +Congratulations! You've found this file, and you're reading it! This +means that you might be interested in getting started in developing Tor. + +(This guide is just about Tor itself--the small network program at the +heart of the Tor network--and not about all the other programs in the +whole Tor ecosystem.) + + +If you are looking for a more bare-bones, less user-friendly information +dump of important information, you might like reading the "torguts" +documents linked to below. You should probably read it before you write +your first patch. + + +Required background +------------------- + +First, I'm going to assume that you can build Tor from source, and that +you know enough of the C language to read and write it. (See the README +file that comes with the Tor source for more information on building it, +and any high-quality guide to C for information on programming.) + +I'm also going to assume that you know a little bit about how to use +Git, or that you're able to follow one of the several excellent guides +at http://git-scm.org to learn. + +Most Tor developers develop using some Unix-based system, such as Linux, +BSD, or OSX. It's okay to develop on Windows if you want, but you're +going to have a more difficult time. + + +Getting your first patch into Tor +--------------------------------- + +Once you've reached this point, here's what you need to know. + + 1. Get the source. + + We keep our source under version control in Git. To get the latest + version, run + + git clone https://git.torproject.org/git/tor + + This will give you a checkout of the master branch. If you're + going to fix a bug that appears in a stable version, check out the + appropriate "maint" branch, as in: + + git checkout maint-0.2.7 + + 2. Find your way around the source + + Our overall code structure is explained in the "torguts" documents, + currently at + + git clone https://git.torproject.org/user/nickm/torguts.git + + Find a part of the code that looks interesting to you, and start + looking around it to see how it fits together! + + We do some unusual things in our codebase. Our testing-related + practices and kludges are explained in doc/WritingTests.txt. + + If you see something that doesn't make sense, we love to get + questions! + + 3. Find something cool to hack on. + + You may already have a good idea of what you'd like to work on, or + you might be looking for a way to contribute. + + Many people have gotten started by looking for an area where they + personally felt Tor was underperforming, and investigating ways to + fix it. If you're looking for ideas, you can head to our bug + tracker at trac.torproject.org and look for tickets that have + received the "easy" tag: these are ones that developers think would + be pretty simple for a new person to work on. For a bigger + challenge, you might want to look for tickets with the "lorax" + keyword: these are tickets that the developers think might be a + good idea to build, but which we have no time to work on any time + soon. + + Or you might find another open ticket that piques your + interest. It's all fine! + + For your first patch, it is probably NOT a good idea to make + something huge or invasive. In particular, you should probably + avoid: + + * Major changes spread across many parts of the codebase. + * Major changes to programming practice or coding style. + * Huge new features or protocol changes. + + 4. Meet the developers! + + We discuss stuff on the tor-dev mailing list and on the #tor-dev + IRC channel on OFTC. We're generally friendly and approachable, + and we like to talk about how Tor fits together. If we have ideas + about how something should be implemented, we'll be happy to share + them. + + We currently have a patch workshop at least once a week, where + people share patches they've made and discuss how to make them + better. The time might change in the future, but generally, + there's no bad time to talk, and ask us about patch ideas. + + 5. Do you need to write a design proposal? + + If your idea is very large, or it will require a change to Tor's + protocols, there needs to be a written design proposal before it + can be merged. (We use this process to manage changes in the + protocols.) To write one, see the instructions at + https://gitweb.torproject.org/torspec.git/tree/proposals/001-process.txt + . If you'd like help writing a proposal, just ask! We're happy to + help out with good ideas. + + You might also like to look around the rest of that directory, to + see more about open and past proposed changes to Tor's behavior. + + 6. Writing your patch + + As you write your code, you'll probably want it to fit in with the + standards of the rest of the Tor codebase so it will be easy for us + to review and merge. You can learn our coding standards in + doc/HACKING. + + If your patch is large and/or is divided into multiple logical + components, remember to divide it into a series of Git commits. A + series of small changes is much easier to review than one big lump. + + 7. Testing your patch + + We prefer that all new or modified code have unit tests for it to + ensure that it runs correctly. Also, all code should actually be + _run_ by somebody, to make sure it works. + + See doc/WritingTests.txt for more information on how we test things + in Tor. If you'd like any help writing tests, just ask! We're + glad to help out. + + 8. Submitting your patch + + We review patches through tickets on our bugtracker at + trac.torproject.org. You can either upload your patches there, or + put them at a public git repository somewhere we can fetch them + (like github or bitbucket) and then paste a link on the appropriate + trac ticket. + + Once your patches are available, write a short explanation of what + you've done on trac, and then change the status of the ticket to + needs_review. + + 9. Review, Revision, and Merge + + With any luck, somebody will review your patch soon! If not, you + can ask on the IRC channel; sometimes we get really busy and take + longer than we should. But don't let us slow you down: you're the + one who's offering help here, and we should respect your time and + contributions. + + When your patch is reviewed, one of these things will happen: + + * The reviewer will say "looks good to me" and your + patch will get merged right into Tor. [Assuming we're not + in the middle of a code-freeze window. If the codebase is + frozen, your patch will go into the next release series.] + + * OR the reviewer will say "looks good, just needs some small + changes!" And then the reviewer will make those changes, + and merge the modified patch into Tor. + + * OR the reviewer will say "Here are some questions and + comments," followed by a bunch of stuff that the reviewer + thinks should change in your code, or questions that the + reviewer has. + + At this point, you might want to make the requested changes + yourself, and comment on the trac ticket once you have done + so. Or if you disagree with any of the comments, you should + say so! And if you won't have time to make some of the + changes, you should say that too, so that other developers + will be able to pick up the unfinished portion. + + Congratulations! You have now written your first patch, and gotten + it integrated into mainline Tor. diff --git a/src/wraith/doc/HACKING/GettingStartedRust.md b/src/wraith/doc/HACKING/GettingStartedRust.md new file mode 100644 index 000000000..3d0038831 --- /dev/null +++ b/src/wraith/doc/HACKING/GettingStartedRust.md @@ -0,0 +1,174 @@ + + Hacking on Rust in Tor +======================== + + Getting Started +----------------- + +Please read or review our documentation on Rust coding standards +(`.../doc/HACKING/CodingStandardsRust.md`) before doing anything. + +Please also read +[the Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html). We aim +to follow the good example set by the Rust community and be excellent to one +another. Let's be careful with each other, so we can be memory-safe together! + +Next, please contact us before rewriting anything! Rust in Tor is still an +experiment. It is an experiment that we very much want to see succeed, so we're +going slowly and carefully. For the moment, it's also a completely +volunteer-driven effort: while many, if not most, of us are paid to work on Tor, +we are not yet funded to write Rust code for Tor. Please be patient with the +other people who are working on getting more Rust code into Tor, because they +are graciously donating their free time to contribute to this effort. + + Resources for learning Rust +----------------------------- + +**Beginning resources** + +The primary resource for learning Rust is +[The Book](https://doc.rust-lang.org/book/). If you'd like to start writing +Rust immediately, without waiting for anything to install, there is +[an interactive browser-based playground](https://play.rust-lang.org/). + +**Advanced resources** + +If you're interested in playing with various Rust compilers and viewing a very +nicely displayed output of the generated assembly, there is +[the Godbolt compiler explorer](https://rust.godbolt.org/) + +For learning how to write unsafe Rust, read +[The Rustonomicon](https://doc.rust-lang.org/nomicon/). + +For learning everything you ever wanted to know about Rust macros, there is +[The Little Book of Rust Macros](https://danielkeep.github.io/tlborm/book/index.html). + +For learning more about FFI and Rust, see Jake Goulding's +[Rust FFI Omnibus](http://jakegoulding.com/rust-ffi-omnibus/). + + Compiling Tor with Rust enabled +--------------------------------- + +You will need to run the `configure` script with the `--enable-rust` flag to +explicitly build with Rust. Additionally, you will need to specify where to +fetch Rust dependencies, as we allow for either fetching dependencies from Cargo +or specifying a local directory. + +**Fetch dependencies from Cargo** + + ./configure --enable-rust --enable-cargo-online-mode + +**Using a local dependency cache** + +You'll need the following Rust dependencies (as of this writing): + + libc==0.2.22 + +We vendor our Rust dependencies in a separate repo using +[cargo-vendor](https://github.com/alexcrichton/cargo-vendor). To use them, do: + + git submodule init + git submodule update + +To specify the local directory containing the dependencies, (assuming you are in +the top level of the repository) configure tor with: + + TOR_RUST_DEPENDENCIES='path_to_dependencies_directory' ./configure --enable-rust + +(Note that RUST_DEPENDENCIES must be the full path to the directory; it cannot +be relative.) + +Assuming you used the above `git submodule` commands and you're in the topmost +directory of the repository, this would be: + + TOR_RUST_DEPENDENCIES=`pwd`/src/ext/rust/crates ./configure --enable-rust + + + Identifying which modules to rewrite +====================================== + +The places in the Tor codebase that are good candidates for porting to Rust are: + +1. loosely coupled to other Tor submodules, +2. have high test coverage, and +3. would benefit from being implemented in a memory safe language. + +Help in either identifying places such as this, or working to improve existing +areas of the C codebase by adding regression tests and simplifying dependencies, +would be really helpful. + +Furthermore, as submodules in C are implemented in Rust, this is a good +opportunity to refactor, add more tests, and split modules into smaller areas of +responsibility. + +A good first step is to build a module-level callgraph to understand how +interconnected your target module is. + + git clone https://git.torproject.org/user/nickm/calltool.git + cd tor + CFLAGS=0 ./configure + ../calltool/src/main.py module_callgraph + +The output will tell you each module name, along with a set of every module that +the module calls. Modules which call fewer other modules are better targets. + + Writing your Rust module +========================== + +Strive to change the C API as little as possible. + +We are currently targetting Rust nightly, *for now*. We expect this to change +moving forward, as we understand more about which nightly features we need. It +is on our TODO list to try to cultivate good standing with various distro +maintainers of `rustc` and `cargo`, in order to ensure that whatever version we +solidify on is readily available. + +If parts of your Rust code needs to stay in sync with C code (such as handling +enums across the FFI boundary), annonotate these places in a comment structured +as follows: + + /// C_RUST_COUPLED: `` + +Where can be an enum, struct, constant, etc. Then, do the +same in the C code, to note that rust will need to be changed when the C +does. + + Adding your Rust module to Tor's build system +----------------------------------------------- + +0. Your translation of the C module should live in its own crate(s) + in the `.../tor/src/rust/` directory. +1. Add your crate to `.../tor/src/rust/Cargo.toml`, in the + `[workspace.members]` section. +2. Add your crate's files to src/rust/include.am + +If your crate should be available to C (rather than just being included as a +dependency of other Rust modules): +0. Declare the crate as a dependency of tor_rust in + `src/rust/tor_util/Cargo.toml` and include it in + `src/rust/tor_rust/lib.rs` + + How to test your Rust code +---------------------------- + +Everything should be tested full stop. Even non-public functionality. + +Be sure to edit `.../tor/src/test/test_rust.sh` to add the name of your crate to +the `crates` variable! This will ensure that `cargo test` is run on your crate. + +Configure Tor's build system to build with Rust enabled: + + ./configure --enable-fatal-warnings --enable-rust --enable-cargo-online-mode + +Tor's test should be run by doing: + + make check + +Tor's integration tests should also pass: + + make test-stem + + Submitting a patch +===================== + +Please follow the instructions in `.../doc/HACKING/GettingStarted.md`. diff --git a/src/wraith/doc/HACKING/HelpfulTools.md b/src/wraith/doc/HACKING/HelpfulTools.md new file mode 100644 index 000000000..f919d08ec --- /dev/null +++ b/src/wraith/doc/HACKING/HelpfulTools.md @@ -0,0 +1,349 @@ +Useful tools +============ + +These aren't strictly necessary for hacking on Tor, but they can help track +down bugs. + +Jenkins +------- + + https://jenkins.torproject.org + +Dmalloc +------- + +The dmalloc library will keep track of memory allocation, so you can find out +if we're leaking memory, doing any double-frees, or so on. + + dmalloc -l -/dmalloc.log + (run the commands it tells you) + ./configure --with-dmalloc + +Valgrind +-------- + + valgrind --leak-check=yes --error-limit=no --show-reachable=yes src/or/tor + +(Note that if you get a zillion openssl warnings, you will also need to +pass `--undef-value-errors=no` to valgrind, or rebuild your openssl +with `-DPURIFY`.) + +Coverity +-------- + +Nick regularly runs the coverity static analyzer on the Tor codebase. + +The preprocessor define `__COVERITY__` is used to work around instances +where coverity picks up behavior that we wish to permit. + +clang Static Analyzer +--------------------- + +The clang static analyzer can be run on the Tor codebase using Xcode (WIP) +or a command-line build. + +The preprocessor define `__clang_analyzer__` is used to work around instances +where clang picks up behavior that we wish to permit. + +clang Runtime Sanitizers +------------------------ + +To build the Tor codebase with the clang Address and Undefined Behavior +sanitizers, see the file `contrib/clang/sanitize_blacklist.txt`. + +Preprocessor workarounds for instances where clang picks up behavior that +we wish to permit are also documented in the blacklist file. + +Running lcov for unit test coverage +----------------------------------- + +Lcov is a utility that generates pretty HTML reports of test code coverage. +To generate such a report: + + ./configure --enable-coverage + make + make coverage-html + $BROWSER ./coverage_html/index.html + +This will run the tor unit test suite `./src/test/test` and generate the HTML +coverage code report under the directory `./coverage_html/`. To change the +output directory, use `make coverage-html HTML_COVER_DIR=./funky_new_cov_dir`. + +Coverage diffs using lcov are not currently implemented, but are being +investigated (as of July 2014). + +Running the unit tests +---------------------- + +To quickly run all the tests distributed with Tor: + + make check + +To run the fast unit tests only: + + make test + +To selectively run just some tests (the following can be combined +arbitrarily): + + ./src/test/test [] ... + ./src/test/test .. [..] ... + ./src/test/test : [: sleep ` + + (You may need to do this as root.) + + You might need to add `-e cpu-clock` as an option to the perf record line + above, if you are on an older CPU without access to hardware profiling + events, or in a VM, or something. + +4. Now you have a perf.data file. Have a look at it with `perf report + --no-children --sort symbol,dso` or `perf report --no-children --sort + symbol,dso --stdio --header`. How does it look? + +5a. Once you have a nice big perf.data file, you can compress it, encrypt it, + and send it to your favorite Tor developers. + +5b. Or maybe you'd rather not send a nice big perf.data file. Who knows what's + in that!? It's kinda scary. To generate a less scary file, you can use `perf + report -g > .out`. Then you can compress that and put it somewhere + public. + +Profiling Tor with gperftools aka Google-performance-tools +---------------------------------------------------------- + +This should work on nearly any unixy system. It doesn't seem to be compatible +with RunAsDaemon though. + +Beforehand, install google-perftools. + +1. You need to rebuild Tor, hack the linking steps to add `-lprofiler` to the + libs. You can do this by adding `LIBS=-lprofiler` when you call `./configure`. + +Now you can run Tor with profiling enabled, and use the pprof utility to look at +performance! See the gperftools manual for more info, but basically: + +2. Run `env CPUPROFILE=/tmp/profile src/or/tor -f `. The profile file + is not written to until Tor finishes execuction. + +3. Run `pprof src/or/tor /tm/profile` to start the REPL. + +Generating and analyzing a callgraph +------------------------------------ + +0. Build Tor on linux or mac, ideally with -O0 or -fno-inline. + +1. Clone 'https://gitweb.torproject.org/user/nickm/calltool.git/' . + Follow the README in that repository. + +Note that currently the callgraph generator can't detect calls that pass +through function pointers. + +Getting emacs to edit Tor source properly +----------------------------------------- + +Nick likes to put the following snippet in his .emacs file: + + + (add-hook 'c-mode-hook + (lambda () + (font-lock-mode 1) + (set-variable 'show-trailing-whitespace t) + + (let ((fname (expand-file-name (buffer-file-name)))) + (cond + ((string-match "^/home/nickm/src/libevent" fname) + (set-variable 'indent-tabs-mode t) + (set-variable 'c-basic-offset 4) + (set-variable 'tab-width 4)) + ((string-match "^/home/nickm/src/tor" fname) + (set-variable 'indent-tabs-mode nil) + (set-variable 'c-basic-offset 2)) + ((string-match "^/home/nickm/src/openssl" fname) + (set-variable 'indent-tabs-mode t) + (set-variable 'c-basic-offset 8) + (set-variable 'tab-width 8)) + )))) + + +You'll note that it defaults to showing all trailing whitespace. The `cond` +test detects whether the file is one of a few C free software projects that I +often edit, and sets up the indentation level and tab preferences to match +what they want. + +If you want to try this out, you'll need to change the filename regex +patterns to match where you keep your Tor files. + +If you use emacs for editing Tor and nothing else, you could always just say: + + + (add-hook 'c-mode-hook + (lambda () + (font-lock-mode 1) + (set-variable 'show-trailing-whitespace t) + (set-variable 'indent-tabs-mode nil) + (set-variable 'c-basic-offset 2))) + + +There is probably a better way to do this. No, we are probably not going +to clutter the files with emacs stuff. + + +Doxygen +------- + +We use the 'doxygen' utility to generate documentation from our +source code. Here's how to use it: + + 1. Begin every file that should be documented with + + /** + * \file filename.c + * \brief Short description of the file. + */ + + (Doxygen will recognize any comment beginning with /** as special.) + + 2. Before any function, structure, #define, or variable you want to + document, add a comment of the form: + + /** Describe the function's actions in imperative sentences. + * + * Use blank lines for paragraph breaks + * - and + * - hyphens + * - for + * - lists. + * + * Write argument_names in boldface. + * + * \code + * place_example_code(); + * between_code_and_endcode_commands(); + * \endcode + */ + + 3. Make sure to escape the characters `<`, `>`, `\`, `%` and `#` as `\<`, + `\>`, `\\`, `\%` and `\#`. + + 4. To document structure members, you can use two forms: + + struct foo { + /** You can put the comment before an element; */ + int a; + int b; /**< Or use the less-than symbol to put the comment + * after the element. */ + }; + + 5. To generate documentation from the Tor source code, type: + + $ doxygen -g + + to generate a file called `Doxyfile`. Edit that file and run + `doxygen` to generate the API documentation. + + 6. See the Doxygen manual for more information; this summary just + scratches the surface. diff --git a/src/wraith/doc/HACKING/HowToReview.md b/src/wraith/doc/HACKING/HowToReview.md new file mode 100644 index 000000000..2d1f3d1c9 --- /dev/null +++ b/src/wraith/doc/HACKING/HowToReview.md @@ -0,0 +1,88 @@ +How to review a patch +===================== + +Some folks have said that they'd like to review patches more often, but they +don't know how. + +So, here are a bunch of things to check for when reviewing a patch! + +Note that if you can't do every one of these, that doesn't mean you can't do +a good review! Just make it clear what you checked for and what you didn't. + + +Top-level smell-checks +---------------------- + +(Difficulty: easy) + +- Does it compile with `--enable-fatal-warnings`? + +- Does `make check-spaces` pass? + +- Does `make check-changes` pass? + +- Does it have a reasonable amount of tests? Do they pass? Do they leak + memory? + +- Do all the new functions, global variables, types, and structure members have + documentation? + +- Do all the functions, global variables, types, and structure members with + modified behavior have modified documentation? + +- Do all the new torrc options have documentation? + +- If this changes Tor's behavior on the wire, is there a design proposal? + +- If this changes anything in the code, is there a "changes" file? + + +Let's look at the code! +----------------------- + +- Does the code conform to CodingStandards.txt? + +- Does the code leak memory? + +- If two or more pointers ever point to the same object, is it clear which + pointer "owns" the object? + +- Are all allocated resources freed? + +- Are all pointers that should be const, const? + +- Are `#defines` used for 'magic' numbers? + +- Can you understand what the code is trying to do? + +- Can you convince yourself that the code really does that? + +- Is there duplicated code that could be turned into a function? + + +Let's look at the documentation! +-------------------------------- + +- Does the documentation confirm to CodingStandards.txt? + +- Does it make sense? + +- Can you predict what the function will do from its documentation? + + +Let's think about security! +--------------------------- + +- If there are any arrays, buffers, are you 100% sure that they cannot + overflow? + +- If there is any integer math, can it overflow or underflow? + +- If there are any allocations, are you sure there are corresponding + deallocations? + +- Is there a safer pattern that could be used in any case? + +- Have they used one of the Forbidden Functions? + +(Also see your favorite secure C programming guides.) diff --git a/src/wraith/doc/HACKING/README.1st.md b/src/wraith/doc/HACKING/README.1st.md new file mode 100644 index 000000000..8299fe634 --- /dev/null +++ b/src/wraith/doc/HACKING/README.1st.md @@ -0,0 +1,62 @@ + +In this directory +----------------- + +This directory has helpful information about what you need to know to +hack on Tor! + +First, read `GettingStarted.md` to learn how to get a start in Tor +development. + +If you've decided to write a patch, `CodingStandards.txt` will give +you a bunch of information about how we structure our code. + +It's important to get code right! Reading `WritingTests.md` will +tell you how to write and run tests in the Tor codebase. + +There are a bunch of other programs we use to help maintain and +develop the codebase: `HelpfulTools.md` can tell you how to use them +with Tor. + +If it's your job to put out Tor releases, see `ReleasingTor.md` so +that you don't miss any steps! + + +----------------------- + +For full information on how Tor is supposed to work, look at the files in +`https://gitweb.torproject.org/torspec.git/tree`. + +For an explanation of how to change Tor's design to work differently, look at +`https://gitweb.torproject.org/torspec.git/blob_plain/HEAD:/proposals/001-process.txt`. + +For the latest version of the code, get a copy of git, and + + git clone https://git.torproject.org/git/tor + +We talk about Tor on the `tor-talk` mailing list. Design proposals and +discussion belong on the `tor-dev` mailing list. We hang around on +irc.oftc.net, with general discussion happening on #tor and development +happening on `#tor-dev`. + +The other files in this `HACKING` directory may also be useful as you +get started working with Tor. + +Happy hacking! + + +----------------------- + +XXXXX also describe + +doc/HACKING/WritingTests.md + +torguts.git + +torspec.git + +The design paper + +freehaven.net/anonbib + +XXXX describe these and add links. diff --git a/src/wraith/doc/HACKING/ReleasingTor.md b/src/wraith/doc/HACKING/ReleasingTor.md new file mode 100644 index 000000000..9cbc8710b --- /dev/null +++ b/src/wraith/doc/HACKING/ReleasingTor.md @@ -0,0 +1,206 @@ + +Putting out a new release +------------------------- + +Here are the steps that the maintainer should take when putting out a +new Tor release: + +=== 0. Preliminaries + +1. Get at least three of weasel/arma/Sebastian/Sina to put the new + version number in their approved versions list. Give them a few + days to do this if you can. + +2. If this is going to be an important security release, give the packagers + some advance warning: See this list of packagers in IV.3 below. + + +=== I. Make sure it works + +1. Use it for a while, as a client, as a relay, as a hidden service, + and as a directory authority. See if it has any obvious bugs, and + resolve those. + + As applicable, merge the `maint-X` branch into the `release-X` branch. + +2. Are all of the jenkins builders happy? See jenkins.torproject.org. + + What about the bsd buildbots? + See http://buildbot.pixelminers.net/builders/ + + What about Coverity Scan? + + What about clan scan-build? + + Does 'make distcheck' complain? + + How about 'make test-stem' and 'make test-network' and + `make test-network-full`? + + - Are all those tests still happy with --enable-expensive-hardening ? + + Any memory leaks? + + +=== II. Write a changelog + + +1a. (Alpha release variant) + + Gather the `changes/*` files into a changelog entry, rewriting many + of them and reordering to focus on what users and funders would find + interesting and understandable. + + To do this, first run `./scripts/maint/lintChanges.py changes/*` and + fix as many warnings as you can. Then run `./scripts/maint/sortChanges.py + changes/* > changelog.in` to combine headings and sort the entries. + After that, it's time to hand-edit and fix the issues that lintChanges + can't find: + + 1. Within each section, sort by "version it's a bugfix on", else by + numerical ticket order. + + 2. Clean them up: + + Make stuff very terse + + Make sure each section name ends with a colon + + Describe the user-visible problem right away + + Mention relevant config options by name. If they're rare or unusual, + remind people what they're for + + Avoid starting lines with open-paren + + Present and imperative tense: not past. + + 'Relays', not 'servers' or 'nodes' or 'Tor relays'. + + "Stop FOOing", not "Fix a bug where we would FOO". + + Try not to let any given section be longer than about a page. Break up + long sections into subsections by some sort of common subtopic. This + guideline is especially important when organizing Release Notes for + new stable releases. + + If a given changes stanza showed up in a different release (e.g. + maint-0.2.1), be sure to make the stanzas identical (so people can + distinguish if these are the same change). + + 3. Clean everything one last time. + + 4. Run `./scripts/maint/format_changelog.py --inplace` to make it prettier + +1b. (old-stable release variant) + + For stable releases that backport things from later, we try to compose + their releases, we try to make sure that we keep the changelog entries + identical to their original versions, with a 'backport from 0.x.y.z' + note added to each section. So in this case, once you have the items + from the changes files copied together, don't use them to build a new + changelog: instead, look up the corrected versions that were merged + into ChangeLog in the master branch, and use those. + +2. Compose a short release blurb to highlight the user-facing + changes. Insert said release blurb into the ChangeLog stanza. If it's + a stable release, add it to the ReleaseNotes file too. If we're adding + to a release-* branch, manually commit the changelogs to the later + git branches too. + +3. If there are changes that require or suggest operator intervention + before or during the update, mail operators (either dirauth or relays + list) with a headline that indicates that an action is required or + appreciated. + +4. If you're doing the first stable release in a series, you need to + create a ReleaseNotes for the series as a whole. To get started + there, copy all of the Changelog entries from the series into a new + file, and run `./scripts/maint/sortChanges.py` on it. That will + group them by category. Then kill every bugfix entry for fixing + bugs that were introduced within that release series; those aren't + relevant changes since the last series. At that point, it's time + to start sorting and condensing entries. (Generally, we don't edit the + text of existing entries, though.) + + +=== III. Making the source release. + +1. In `maint-0.?.x`, bump the version number in `configure.ac` and run + `perl scripts/maint/updateVersions.pl` to update version numbers in other + places, and commit. Then merge `maint-0.?.x` into `release-0.?.x`. + + (NOTE: To bump the version number, edit `configure.ac`, and then run + either `make`, or `perl scripts/maint/updateVersions.pl`, depending on + your version.) + +2. Make distcheck, put the tarball up in somewhere (how about your + homedir on your homedir on people.torproject.org?) , and tell `#tor` + about it. Wait a while to see if anybody has problems building it. + (Though jenkins is usually pretty good about catching these things.) + +=== IV. Commit, upload, announce + +1. Sign the tarball, then sign and push the git tag: + + gpg -ba + git tag -u tor-0.3.x.y-status + git push origin tag tor-0.3.x.y-status + +2. scp the tarball and its sig to the dist website, i.e. + `/srv/dist-master.torproject.org/htdocs/` on dist-master. When you want + it to go live, you run "static-update-component dist.torproject.org" + on dist-master. + + In the webwml.git repository, `include/versions.wmi` and `Makefile` + to note the new version. + + (NOTE: Due to #17805, there can only be one stable version listed at + once. Nonetheless, do not call your version "alpha" if it is stable, + or people will get confused.) + +3. Email the packagers (cc'ing tor-team) that a new tarball is up. + The current list of packagers is: + + - {weasel,gk,mikeperry} at torproject dot org + - {blueness} at gentoo dot org + - {paul} at invizbox dot io + - {vincent} at invizbox dot com + - {lfleischer} at archlinux dot org + - {Nathan} at freitas dot net + - {mike} at tig dot as + - {tails-rm} at boum dot org + - {simon} at sdeziel.info + - {yuri} at freebsd.org + - {mh+tor} at scrit.ch + +4. Add the version number to Trac. To do this, go to Trac, log in, + select "Admin" near the top of the screen, then select "Versions" from + the menu on the left. At the right, there will be an "Add version" + box. By convention, we enter the version in the form "Tor: + 0.2.2.23-alpha" (or whatever the version is), and we select the date as + the date in the ChangeLog. + +5. Mail the release blurb and ChangeLog to tor-talk (development release) or + tor-announce (stable). + + Post the changelog on the blog as well. You can generate a + blog-formatted version of the changelog with the -B option to + format-changelog. + + When you post, include an estimate of when the next TorBrowser + releases will come out that include this Tor release. This will + usually track https://wiki.mozilla.org/RapidRelease/Calendar , but it + can vary. + + +=== V. Aftermath and cleanup + +1. If it's a stable release, bump the version number in the + `maint-x.y.z` branch to "newversion-dev", and do a `merge -s ours` + merge to avoid taking that change into master. + +2. Forward-port the ChangeLog (and ReleaseNotes if appropriate). + +3. Keep an eye on the blog post, to moderate comments and answer questions. + diff --git a/src/wraith/doc/HACKING/Tracing.md b/src/wraith/doc/HACKING/Tracing.md new file mode 100644 index 000000000..a5fb5165e --- /dev/null +++ b/src/wraith/doc/HACKING/Tracing.md @@ -0,0 +1,91 @@ +# Tracing # + +This document describes how the event tracing subsystem works in tor so +developers can add events to the code base but also hook them to an event +tracing framework. + +## Basics ### + +Event tracing is seperated in two concepts, trace events and a tracer. The +tracing subsystem can be found in `src/trace`. The `events.h` header file is +the main file that maps the different tracers to trace events. + +### Events ### + +A trace event is basically a function from which we can pass any data that +we want to collect. In addition, we specify a context for the event such as +a subsystem and an event name. + +A trace event in tor has the following standard format: + + tor_trace(subsystem, event\_name, args...) + +The `subsystem` parameter is the name of the subsytem the trace event is in. +For example that could be "scheduler" or "vote" or "hs". The idea is to add +some context to the event so when we collect them we know where it's coming +from. The `event_name` is the name of the event which helps a lot with +adding some semantic to the event. Finally, `args` is any number of +arguments we want to collect. + +Here is an example of a possible tracepoint in main(): + + tor_trace(main, init_phase, argc) + +The above is a tracepoint in the `main` subsystem with `init_phase` as the +event name and the `int argc` is passed to the event as well. + +How `argc` is collected or used has nothing to do with the instrumentation +(adding trace events to the code). It is the work of the tracer so this is why +the trace events and collection framework (tracer) are decoupled. You _can_ +have trace events without a tracer. + +### Tracer ### + +In `src/trace/events.h`, we map the `tor_trace()` function to the right +tracer. A tracer support is only enabled at compile time. For instance, the +file `src/trace/debug.h` contains the mapping of the generic tracing function +`tor_trace()` to the `log_debug()` function. More specialized function can be +mapped depending on the tracepoint. + +## Build System ## + +This section describes how it is integrated into the build system of tor. + +By default, every tracing events are disabled in tor that is `tor_trace()` +is a NOP. + +To enable a tracer, there is a configure option on the form of: + + --enable-tracing- + +We have an option that will send every trace events to a `log_debug()` (as +mentionned above) which will print you the subsystem and name of the event but +not the arguments for technical reasons. This is useful if you want to quickly +see if your trace event is being hit or well written. To do so, use this +configure option: + + --enable-tracing-debug + +## Instrument Tor ## + +This is pretty easy. Let's say you want to add a trace event in +`src/or/rendcache.c`, you only have to add this include statement: + + #include "trace/events.h" + +Once done, you can add as many as you want `tor_trace()` that you need. +Please use the right subsystem (here it would be `hs`) and a unique name that +tells what the event is for. For example: + + tor_trace(hs, store_desc_as_client, desc, desc_id); + +If you look in `src/trace/events.h`, you'll see that if tracing is enabled it +will be mapped to a function called: + + tor_trace_hs_store_desc_as_client(desc, desc_id) + +And the point of all this is for that function to be defined in a new file +that you might want to add named `src/trace/hs.{c|h}` which would defined how +to collect the data for the `tor_trace_hs_store_desc_as_client()` function +like for instance sending it to a `log_debug()` or do more complex operations +or use a userspace tracer like LTTng (https://lttng.org). diff --git a/src/wraith/doc/HACKING/WritingTests.md b/src/wraith/doc/HACKING/WritingTests.md new file mode 100644 index 000000000..cc393494e --- /dev/null +++ b/src/wraith/doc/HACKING/WritingTests.md @@ -0,0 +1,499 @@ + +Writing tests for Tor: an incomplete guide +========================================== + +Tor uses a variety of testing frameworks and methodologies to try to +keep from introducing bugs. The major ones are: + + 1. Unit tests written in C and shipped with the Tor distribution. + + 2. Integration tests written in Python and shipped with the Tor + distribution. + + 3. Integration tests written in Python and shipped with the Stem + library. Some of these use the Tor controller protocol. + + 4. System tests written in Python and SH, and shipped with the + Chutney package. These work by running many instances of Tor + locally, and sending traffic through them. + + 5. The Shadow network simulator. + +How to run these tests +---------------------- + +### The easy version + +To run all the tests that come bundled with Tor, run `make check`. + +To run the Stem tests as well, fetch stem from the git repository, +set `STEM_SOURCE_DIR` to the checkout, and run `make test-stem`. + +To run the Chutney tests as well, fetch chutney from the git repository, +set `CHUTNEY_PATH` to the checkout, and run `make test-network`. + +To run all of the above, run `make test-full`. + +To run all of the above, plus tests that require a working connection to the +internet, run `make test-full-online`. + +### Running particular subtests + +The Tor unit tests are divided into separate programs and a couple of +bundled unit test programs. + +Separate programs are easy. For example, to run the memwipe tests in +isolation, you just run `./src/test/test-memwipe`. + +To run tests within the unit test programs, you can specify the name +of the test. The string ".." can be used as a wildcard at the end of the +test name. For example, to run all the cell format tests, enter +`./src/test/test cellfmt/..`. + +Many tests that need to mess with global state run in forked subprocesses in +order to keep from contaminating one another. But when debugging a failing test, +you might want to run it without forking a subprocess. To do so, use the +`--no-fork` option with a single test. (If you specify it along with +multiple tests, they might interfere.) + +You can turn on logging in the unit tests by passing one of `--debug`, +`--info`, `--notice`, or `--warn`. By default only errors are displayed. + +Unit tests are divided into `./src/test/test` and `./src/test/test-slow`. +The former are those that should finish in a few seconds; the latter tend to +take more time, and may include CPU-intensive operations, deliberate delays, +and stuff like that. + +### Finding test coverage + +Test coverage is a measurement of which lines your tests actually visit. + +When you configure Tor with the `--enable-coverage` option, it should +build with support for coverage in the unit tests, and in a special +`tor-cov` binary. + +Then, run the tests you'd like to see coverage from. If you have old +coverage output, you may need to run `reset-gcov` first. + +Now you've got a bunch of files scattered around your build directories +called `*.gcda`. In order to extract the coverage output from them, make a +temporary directory for them and run `./scripts/test/coverage ${TMPDIR}`, +where `${TMPDIR}` is the temporary directory you made. This will create a +`.gcov` file for each source file under tests, containing that file's source +annotated with the number of times the tests hit each line. (You'll need to +have gcov installed.) + +You can get a summary of the test coverage for each file by running +`./scripts/test/cov-display ${TMPDIR}/*` . Each line lists the file's name, +the number of uncovered lines, the number of uncovered lines, and the +coverage percentage. + +For a summary of the test coverage for each _function_, run +`./scripts/test/cov-display -f ${TMPDIR}/*`. + +For more details on using gcov, including the helper scripts in +scripts/test, see HelpfulTools.md. + +### Comparing test coverage + +Sometimes it's useful to compare test coverage for a branch you're writing to +coverage from another branch (such as git master, for example). But you +can't run `diff` on the two coverage outputs directly, since the actual +number of times each line is executed aren't so important, and aren't wholly +deterministic. + +Instead, follow the instructions above for each branch, creating a separate +temporary directory for each. Then, run `./scripts/test/cov-diff ${D1} +${D2}`, where D1 and D2 are the directories you want to compare. This will +produce a diff of the two directories, with all lines normalized to be either +covered or uncovered. + +To count new or modified uncovered lines in D2, you can run: + + ./scripts/test/cov-diff ${D1} ${D2}" | grep '^+ *\#' | wc -l + +### Marking lines as unreachable by tests + +You can mark a specific line as unreachable by using the special +string LCOV_EXCL_LINE. You can mark a range of lines as unreachable +with LCOV_EXCL_START... LCOV_EXCL_STOP. Note that older versions of +lcov don't understand these lines. + +You can post-process .gcov files to make these lines 'unreached' by +running ./scripts/test/cov-exclude on them. It marks excluded +unreached lines with 'x', and excluded reached lines with '!!!'. + +Note: you should never do this unless the line is meant to 100% +unreachable by actual code. + + +What kinds of test should I write? +---------------------------------- + +Integration testing and unit testing are complementary: it's probably a +good idea to make sure that your code is hit by both if you can. + +If your code is very-low level, and its behavior is easily described in +terms of a relation between inputs and outputs, or a set of state +transitions, then it's a natural fit for unit tests. (If not, please +consider refactoring it until most of it _is_ a good fit for unit +tests!) + +If your code adds new externally visible functionality to Tor, it would +be great to have a test for that functionality. That's where +integration tests more usually come in. + +Unit and regression tests: Does this function do what it's supposed to? +----------------------------------------------------------------------- + +Most of Tor's unit tests are made using the "tinytest" testing framework. +You can see a guide to using it in the tinytest manual at + + https://github.com/nmathewson/tinytest/blob/master/tinytest-manual.md + +To add a new test of this kind, either edit an existing C file in `src/test/`, +or create a new C file there. Each test is a single function that must +be indexed in the table at the end of the file. We use the label "done:" as +a cleanup point for all test functions. + +If you have created a new test file, you will need to: +1. Add the new test file to include.am +2. In `test.h`, include the new test cases (testcase_t) +3. In `test.c`, add the new test cases to testgroup_t testgroups + +(Make sure you read `tinytest-manual.md` before proceeding.) + +I use the term "unit test" and "regression tests" very sloppily here. + +### A simple example + +Here's an example of a test function for a simple function in util.c: + + static void + test_util_writepid(void *arg) + { + (void) arg; + + char *contents = NULL; + const char *fname = get_fname("tmp_pid"); + unsigned long pid; + char c; + + write_pidfile(fname); + + contents = read_file_to_str(fname, 0, NULL); + tt_assert(contents); + + int n = sscanf(contents, "%lu\n%c", &pid, &c); + tt_int_op(n, OP_EQ, 1); + tt_int_op(pid, OP_EQ, getpid()); + + done: + tor_free(contents); + } + +This should look pretty familiar to you if you've read the tinytest +manual. One thing to note here is that we use the testing-specific +function `get_fname` to generate a file with respect to a temporary +directory that the tests use. You don't need to delete the file; +it will get removed when the tests are done. + +Also note our use of `OP_EQ` instead of `==` in the `tt_int_op()` calls. +We define `OP_*` macros to use instead of the binary comparison +operators so that analysis tools can more easily parse our code. +(Coccinelle really hates to see `==` used as a macro argument.) + +Finally, remember that by convention, all `*_free()` functions that +Tor defines are defined to accept NULL harmlessly. Thus, you don't +need to say `if (contents)` in the cleanup block. + +### Exposing static functions for testing + +Sometimes you need to test a function, but you don't want to expose +it outside its usual module. + +To support this, Tor's build system compiles a testing version of +each module, with extra identifiers exposed. If you want to +declare a function as static but available for testing, use the +macro `STATIC` instead of `static`. Then, make sure there's a +macro-protected declaration of the function in the module's header. + +For example, `crypto_curve25519.h` contains: + + #ifdef CRYPTO_CURVE25519_PRIVATE + STATIC int curve25519_impl(uint8_t *output, const uint8_t *secret, + const uint8_t *basepoint); + #endif + +The `crypto_curve25519.c` file and the `test_crypto.c` file both define +`CRYPTO_CURVE25519_PRIVATE`, so they can see this declaration. + +### STOP! Does this test really test? + +When writing tests, it's not enough to just generate coverage on all the +lines of the code that you're testing: It's important to make sure that +the test _really tests_ the code. + +For example, here is a _bad_ test for the unlink() function (which is +supposed to remove a file). + + static void + test_unlink_badly(void *arg) + { + (void) arg; + int r; + + const char *fname = get_fname("tmpfile"); + + /* If the file isn't there, unlink returns -1 and sets ENOENT */ + r = unlink(fname); + tt_int_op(n, OP_EQ, -1); + tt_int_op(errno, OP_EQ, ENOENT); + + /* If the file DOES exist, unlink returns 0. */ + write_str_to_file(fname, "hello world", 0); + r = unlink(fnme); + tt_int_op(r, OP_EQ, 0); + + done: + tor_free(contents); + } + + +This test might get very high coverage on unlink(). So why is it a +bad test? Because it doesn't check that unlink() *actually removes the +named file*! + +Remember, the purpose of a test is to succeed if the code does what +it's supposed to do, and fail otherwise. Try to design your tests so +that they check for the code's intended and documented functionality +as much as possible. + + +### Mock functions for testing in isolation + +Often we want to test that a function works right, but the function to +be tested depends on other functions whose behavior is hard to observe, +or which require a working Tor network, or something like that. + +To write tests for this case, you can replace the underlying functions +with testing stubs while your unit test is running. You need to declare +the underlying function as 'mockable', as follows: + + MOCK_DECL(returntype, functionname, (argument list)); + +and then later implement it as: + + MOCK_IMPL(returntype, functionname, (argument list)) + { + /* implementation here */ + } + +For example, if you had a 'connect to remote server' function, you could +declare it as: + + + MOCK_DECL(int, connect_to_remote, (const char *name, status_t *status)); + +When you declare a function this way, it will be declared as normal in +regular builds, but when the module is built for testing, it is declared +as a function pointer initialized to the actual implementation. + +In your tests, if you want to override the function with a temporary +replacement, you say: + + MOCK(functionname, replacement_function_name); + +And later, you can restore the original function with: + + UNMOCK(functionname); + +For more information, see the definitions of this mocking logic in +`testsupport.h`. + +### Okay but what should my tests actually do? + +We talk above about "test coverage" -- making sure that your tests visit +every line of code, or every branch of code. But visiting the code isn't +enough: we want to verify that it's correct. + +So when writing tests, try to make tests that should pass with any correct +implementation of the code, and that should fail if the code doesn't do what +it's supposed to do. + +You can write "black-box" tests or "glass-box" tests. A black-box test is +one that you write without looking at the structure of the function. A +glass-box one is one you implement while looking at how the function is +implemented. + +In either case, make sure to consider common cases *and* edge cases; success +cases and failure csaes. + +For example, consider testing this function: + + /** Remove all elements E from sl such that E==element. Preserve + * the order of any elements before E, but elements after E can be + * rearranged. + */ + void smartlist_remove(smartlist_t *sl, const void *element); + +In order to test it well, you should write tests for at least all of the +following cases. (These would be black-box tests, since we're only looking +at the declared behavior for the function: + + * Remove an element that is in the smartlist. + * Remove an element that is not in the smartlist. + * Remove an element that appears in the smartlist more than once. + +And your tests should verify that it behaves correct. At minimum, you should +test: + + * That other elements before E are in the same order after you call the + functions. + * That the target element is really removed. + * That _only_ the target element is removed. + +When you consider edge cases, you might try: + + * Remove an element from an empty list. + * Remove an element from a singleton list containing that element. + * Remove an element for a list containing several instances of that + element, and nothing else. + +Now let's look at the implementation: + + void + smartlist_remove(smartlist_t *sl, const void *element) + { + int i; + if (element == NULL) + return; + for (i=0; i < sl->num_used; i++) + if (sl->list[i] == element) { + sl->list[i] = sl->list[--sl->num_used]; /* swap with the end */ + i--; /* so we process the new i'th element */ + sl->list[sl->num_used] = NULL; + } + } + +Based on the implementation, we now see three more edge cases to test: + + * Removing NULL from the list. + * Removing an element from the end of the list + * Removing an element from a position other than the end of the list. + + +### What should my tests NOT do? + +Tests shouldn't require a network connection. + +Whenever possible, tests shouldn't take more than a second. Put the test +into test/slow if it genuinely needs to be run. + +Tests should not alter global state unless they run with `TT_FORK`: Tests +should not require other tests to be run before or after them. + +Tests should not leak memory or other resources. To find out if your tests +are leaking memory, run them under valgrind (see HelpfulTools.txt for more +information on how to do that). + +When possible, tests should not be over-fit to the implementation. That is, +the test should verify that the documented behavior is implemented, but +should not break if other permissible behavior is later implemented. + + +### Advanced techniques: Namespaces + +Sometimes, when you're doing a lot of mocking at once, it's convenient to +isolate your identifiers within a single namespace. If this were C++, we'd +already have namespaces, but for C, we do the best we can with macros and +token-pasting. + +We have some macros defined for this purpose in `src/test/test.h`. To use +them, you define `NS_MODULE` to a prefix to be used for your identifiers, and +then use other macros in place of identifier names. See `src/test/test.h` for +more documentation. + + +Integration tests: Calling Tor from the outside +----------------------------------------------- + +Some tests need to invoke Tor from the outside, and shouldn't run from the +same process as the Tor test program. Reasons for doing this might include: + + * Testing the actual behavior of Tor when run from the command line + * Testing that a crash-handler correctly logs a stack trace + * Verifying that violating a sandbox or capability requirement will + actually crash the program. + * Needing to run as root in order to test capability inheritance or + user switching. + +To add one of these, you generally want a new C program in `src/test`. Add it +to `TESTS` and `noinst_PROGRAMS` if it can run on its own and return success or +failure. If it needs to be invoked multiple times, or it needs to be +wrapped, add a new shell script to `TESTS`, and the new program to +`noinst_PROGRAMS`. If you need access to any environment variable from the +makefile (eg `${PYTHON}` for a python interpreter), then make sure that the +makefile exports them. + +Writing integration tests with Stem +----------------------------------- + +The 'stem' library includes extensive tests for the Tor controller protocol. +You can run stem tests from tor with `make test-stem`, or see +`https://stem.torproject.org/faq.html#how-do-i-run-the-tests`. + +To see what tests are available, have a look around the `test/*` directory in +stem. The first thing you'll notice is that there are both `unit` and `integ` +tests. The former are for tests of the facilities provided by stem itself that +can be tested on their own, without the need to hook up a tor process. These +are less relevant, unless you want to develop a new stem feature. The latter, +however, are a very useful tool to write tests for controller features. They +provide a default environment with a connected tor instance that can be +modified and queried. Adding more integration tests is a great way to increase +the test coverage inside Tor, especially for controller features. + +Let's assume you actually want to write a test for a previously untested +controller feature. I'm picking the `exit-policy/*` GETINFO queries. Since +these are a controller feature that we want to write an integration test for, +the right file to modify is +`https://gitweb.torproject.org/stem.git/tree/test/integ/control/controller.py`. + +First off we notice that there is an integration test called +`test_get_exit_policy()` that's already written. This exercises the interaction +of stem's `Controller.get_exit_policy()` method, and is not relevant for our +test since there are no stem methods to make use of all `exit-policy/*` +queries (if there were, likely they'd be tested already. Maybe you want to +write a stem feature, but I chose to just add tests). + +Our test requires a tor controller connection, so we'll use the +`@require_controller` annotation for our `test_exit_policy()` method. We need a +controller instance, which we get from +`test.runner.get_runner().get_tor_controller()`. The attached Tor instance is +configured as a client, but the exit-policy GETINFO queries need a relay to +work, so we have to change the config (using `controller.set_options()`). This +is OK for us to do, we just have to remember to set DisableNetwork so we don't +actually start an exit relay and also to undo the changes we made (by calling +`controller.reset_conf()` at the end of our test). Additionally, we have to +configure a static Address for Tor to use, because it refuses to build a +descriptor when it can't guess a suitable IP address. Unfortunately, these +kinds of tripwires are everywhere. Don't forget to file appropriate tickets if +you notice any strange behaviour that seems totally unreasonable. + +Check out the `test_exit_policy()` function in abovementioned file to see the +final implementation for this test. + +System testing with Chutney +--------------------------- + +The 'chutney' program configures and launches a set of Tor relays, +authorities, and clients on your local host. It has a `test network` +functionality to send traffic through them and verify that the traffic +arrives correctly. + +You can write new test networks by adding them to `networks`. To add +them to Tor's tests, add them to the `test-network` or `test-network-all` +targets in `Makefile.am`. + +(Adding new kinds of program to chutney will still require hacking the +code.) diff --git a/src/wraith/doc/HACKING/android/Simpleperf.md b/src/wraith/doc/HACKING/android/Simpleperf.md new file mode 100644 index 000000000..c12558aed --- /dev/null +++ b/src/wraith/doc/HACKING/android/Simpleperf.md @@ -0,0 +1,98 @@ +# Using `simpleperf` to collect CPU profiling on Android + +This document describes how you can use Android's `simpleperf` +command-line tool to get CPU profiling information from Tor via the +Orbot application. The tool is particularly useful for Tor development +because it is able to profile native applications on the platform +whereas a lot of the normal tooling for the Android platform is only +able to collect information from Java-based applications. + +## Prerequisites + +Before using `simpleperf` there is a couple of steps that must be +followed. You should make sure you have both a recent installation of +the Android Software Development Kit (SDK) and Native Development Kit +(NDK) installed. These can be found on the Android Developers website. + +1. Follow the build instructions from the `BUILD` file in the Orbot + repository and build an Orbot APK (Android Package) file with + debugging enabled. Make sure that when you build the native content of + the Orbot application that you run the `make -C external` command with + an additional `DEBUG=1` as paramter to ensure that the Orbot build + process does not strip the debug symbols from the Tor binary. + +2. (Optional) Uninstall and clean-up your old Orbot installation that + is most likely downloaded from Google's Play Store or via fdroid: + + $ adb shell pm clear org.torproject.android + $ adb uninstall org.torproject.android + +3. Install the Android Package you generated in step 1: + + $ adb install /path/to/your/app-fullperm-debug.apk + +4. Check on your device that the newly installed Orbot actually works + and behaves in the way you expect it to. + +## Profiling using `simpleperf` + +The `simpleperf` tool can be found in the `simpleperf/` directory in +the directory where you installed the Android NDK to. In this +directory there is a set of Python files that will help you deploy the +tool to a device and collect the measurement data such that you can +analyze the results on your computer rather than on your phone. + +1. Change directory to the location of the `simpleperf` directory. +2. Open the `app_profiler.config` file and change + `app_package_name` to `org.torproject.android`, `apk_file_path` to + the path of your Orbot Android Package (APK file). +3. Optionally change the duration parameter in the `record_options` + variable in `app_profiler.config` to the duration which you would like + to collect samples in. The value is specified in seconds. +4. Run the app profiler using `python app_profiler.py`. This helper + script will push the `simpleperf` tool to your device, start the + profiler, and once it has completed copy the generated `perf.data` + file over to your computer with the results. + +### Analyzing the results + +You can inspect your resulting `perf.data` file via a simple GUI +program `python report.py` or via the command-line tool `simpleperf +report`. I've found the GUI tool to be easier to navigate around with +than the command-line tool. + +The `-g` option can be passed to the command line `simpleperf report` +tool allows you to see the call graph of functions and how much time +was spend on the call. + +## Tips & Tricks + +- When you have installed Orbot the first time, you will notice that + if you get a shell on the Android device that there is no Tor binary + available. This is because Orbot unpacks the Tor binary first time it + is executed and places it under the `app_bin/` directory on the + device. + + To access binaries, `torrc` files, and other useful information on + the device do the following: + + $ adb shell + (device):/ $ run-as org.torproject.android + (device):/data/data/org.torproject.android $ ls + app_bin app_data cache databases files lib shared_prefs + + Descriptors, control authentication cookie, state, and other files can be + found in the `app_data` directory. The `torrc` can be found in the `app_bin/` + directory. + +- You can enable logging in Tor via the syslog (or android) log + mechanism with: + + $ adb shell + (device):/ $ run-as org.torproject.android + (device):/data/data/org.torproject.android $ echo -e "\nLog info syslog" >> app_bin/torrc + + Start Tor the normal way via Orbot and collect the logs from your computer using + + $ adb logcat + diff --git a/src/wraith/doc/TUNING b/src/wraith/doc/TUNING new file mode 100644 index 000000000..24552a38c --- /dev/null +++ b/src/wraith/doc/TUNING @@ -0,0 +1,86 @@ +Most operating systems limit an amount of TCP sockets that can be used +simultaneously. It is possible for a busy Tor relay to run into these +limits, thus being unable to fully utilize the bandwidth resources it +has at its disposal. Following system-specific tips might be helpful +to alleviate the aforementioned problem. + +Linux +----- + +Use 'ulimit -n' to raise an allowed number of file descriptors to be +opened on your host at the same time. + +FreeBSD +------- + +Tune the followind sysctl(8) variables: + * kern.maxfiles - maximum allowed file descriptors (for entire system) + * kern.maxfilesperproc - maximum file descriptors one process is allowed + to use + * kern.ipc.maxsockets - overall maximum numbers of sockets for entire + system + * kern.ipc.somaxconn - size of listen queue for incoming TCP connections + for entire system + +See also: + * https://www.freebsd.org/doc/handbook/configtuning-kernel-limits.html + * https://wiki.freebsd.org/NetworkPerformanceTuning + +Mac OS X +-------- + +Since Mac OS X is BSD-based system, most of the above hold for OS X as well. +However, launchd(8) is known to modify kern.maxfiles and kern.maxfilesperproc +when it launches tor service (see launchd.plist(5) manpage). Also, +kern.ipc.maxsockets is determined dynamically by the system and thus is +read-only on OS X. + +OpenBSD +------- + +Because OpenBSD is primarily focused on security and stability, it uses default +resource limits stricter than those of more popular Unix-like operating systems. + +OpenBSD stores a kernel-level file descriptor limit in the sysctl variable +kern.maxfiles. It defaults to 7,030. To change it to, for example, 16,000 while +the system is running, use the command 'sudo sysctl kern.maxfiles=16000'. +kern.maxfiles will reset to the default value upon system reboot unless you also +add 'kern.maxfiles=16000' to the file /etc/sysctl.conf. + +There are stricter resource limits set on user classes, which are stored in +/etc/login.conf. This config file also allows limit sets for daemons started +with scripts in the /etc/rc.d directory, which presumably includes Tor. + +To increase the file descriptor limit from its default of 1,024, add the +following to /etc/login.conf: + +tor:\ + :openfiles-max=13500:\ + :tc=daemon: + +Upon restarting Tor, it will be able to open up to 13,500 file descriptors. + +This will work *only* if you are starting Tor with the script /etc/rc.d/tor. If +you're using a custom build instead of the package, you can easily copy the rc.d +script from the Tor port directory. Alternatively, you can ensure that the Tor's +daemon user has its own user class and make a /etc/login.conf entry for it. + +High-bandwidth relays sometimes give the syslog warning: + +/bsd: WARNING: mclpools limit reached; increase kern.maxclusters + +In this case, increase kern.maxclusters with the sysctl command and in the file +/etc/sysctl.conf, as described with kern.maxfiles above. Use 'sysctl +kern.maxclusters' to query the current value. Increasing by about 15% per day +until the error no longer appears is a good guideline. + +Disclaimer +---------- + +Do note that this document is a draft and above information may be +technically incorrect and/or incomplete. If so, please open a ticket +on https://trac.torproject.org or post to tor-relays mailing list. + +Are you running a busy Tor relay? Let us know how you are solving +the out-of-sockets problem on your system. + diff --git a/src/wraith/doc/asciidoc-helper.sh b/src/wraith/doc/asciidoc-helper.sh new file mode 100644 index 000000000..a3ef53f88 --- /dev/null +++ b/src/wraith/doc/asciidoc-helper.sh @@ -0,0 +1,68 @@ +#!/bin/sh + +# Copyright (c) The Tor Project, Inc. +# See LICENSE for licensing information +# Run this to generate .html.in or .1.in files from asciidoc files. +# Arguments: +# html|man asciidocpath outputfile + +set -e + +if [ $# != 3 ]; then + exit 1; +fi + +output=$3 + +if [ "$1" = "html" ]; then + input=${output%%.html.in}.1.txt + base=${output%%.html.in} + + if [ "$2" != none ]; then + TZ=UTC "$2" -d manpage -o $output $input; + else + echo "=================================="; + echo; + echo "You need asciidoc installed to be able to build the manpage."; + echo "To build without manpages, use the --disable-asciidoc argument"; + echo "when calling configure."; + echo; + echo "=================================="; + exit 1; + fi +elif [ "$1" = "man" ]; then + input=${output%%.1.in}.1.txt + base=${output%%.1.in} + + if test "$2" = none; then + echo "=================================="; + echo; + echo "You need asciidoc installed to be able to build the manpage."; + echo "To build without manpages, use the --disable-asciidoc argument"; + echo "when calling configure."; + echo; + echo "=================================="; + exit 1; + fi + if "$2" -f manpage $input; then + mv $base.1 $output; + else + cat< + perl Configure VC-WIN32 + perl util\mkfiles.pl >MINFO + perl util\mk1mf.pl no-asm dll VC-WIN32 >32dll.mak + perl util\mkdef.pl 32 libeay > ms\libeay32.def + perl util\mkdef.pl 32 ssleay > ms\ssleay32.def + nmake -f 32dll.mak + +Making OpenSSL final package: + + Create , I'd recommend using a name like -vc10. + + Copy the following directories and files to their respective locations + \inc32\openssl => \include\openssl + \out32dll\libeay32.lib => \lib\libeay32.lib + \out32dll\ssleay32.lib => \lib\ssleay32.lib + \out32dll\libeay32.dll => \bin\libeay32.dll + \out32dll\openssl.exe => \bin\openssl.exe + \out32dll\ssleay32.dll => \bin\ssleay32.dll + +Building Zlib from source: + + cd + nmake -f win32/Makefile.msc + +Building libevent: + + cd + mkdir build && cd build + SET OPENSSL_ROOT_DIR= + cmake -G "NMake Makefiles" .. -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo -DCMAKE_C_FLAGS_RELWITHDEBINFO:STRING="/MT /Zi /O2 /Ob1 /D NDEBUG" -DZLIB_LIBRARY:FILEPATH="\zdll.lib" -DZLIB_INCLUDE_DIR:PATH="" + nmake event + +Building Tor: + + Create a dir above tor source dir named build-alpha and two subdirs include + and lib. + + Your build tree should now be similar to this one: + * build-alpha + - include + - lib + * + - build + - cmake + - ... + * + - ... + - ms + - util + - ... + * + - bin + - include + - lib + * + - ... + - src + - ... + * + - ... + - win32 + - ... + + Copy the following dirs and files to the following locations: + \include\openssl => build-alpha\include\openssl + \include => build-alpha\include + \WIN32-Code\nmake\event2 => build-alpha\include\event2 + \z*.h => build-alpha\include\z*.h + + Now copy the following files to the following locations and rename them + according new names: + + \build\lib\event.lib => build-alpha\lib\libevent.lib + \lib\libeay32.lib => build-alpha\lib\libcrypto.lib + \lib\ssleay32.lib => build-alpha\lib\libssl.lib + \zdll.lib => build-alpha\lib\libz.lib + + And we are now ready for the build process: + + cd + nmake -f Makefile.nmake + + After the above process is completed there should be a tor.exe in \src\or + + Copy tor.exe to desired location and also copy zlib1.dll, libeay32.dll and + ssleay32.dll from built zlib and openssl packages + diff --git a/src/wraith/doc/contrib/tor-rpm-creation.txt b/src/wraith/doc/contrib/tor-rpm-creation.txt new file mode 100644 index 000000000..9c4e05764 --- /dev/null +++ b/src/wraith/doc/contrib/tor-rpm-creation.txt @@ -0,0 +1,56 @@ +## Instructions for building the official rpms. +## +The process used to create the official rpms is as follows: + +You'll need to install libevent headers, usually located in package named +libevent-devel. Alternatively, you could download latest libevent from +http://libevent.org/ but that shouldn't be necessary. + +Download and Extract the latest tor source code from +https://www.torproject.org/download + +In the resulting directory: +LIBS=-lrt ./configure +make dist-rpm + +You should have at least two, maybe three, rpms. There should be the binary +(i686|x86_64).rpm, a src.rpm, and on redhat/centos machines, a debuginfo.rpm. +The debuginfo rpms are created if package redhat-rpm-config is installed (case +of redhat distros). + +This step suffices unless you want to create RPMs for distros other than the +one you used for building. + + +## Instructions for building RPMs for multiple architectures or distributions +## using 'mock' on Fedora or RHEL (and clones) + +Make sure you have mock installed and configured, see following HOWTOs for setup: +https://fedoraproject.org/wiki/How_to_create_an_RPM_package +https://fedoraproject.org/wiki/Using_Mock_to_test_package_builds + +Take the source RPM generated by previous step, and execute mock for every +target architecture (the names come from files in /etc/mock, strip the .cfg +extension in the -r parameter): + +mock --rebuild -r fedora-17-x86_64 tor-X.Y.Z.src.rpm + +Building for EL5 from newer distro (e.g. EL6 or Fedora 17) will fail due to bug +(https://bugzilla.redhat.com/show_bug.cgi?id=490613). +Here's a workaround: + +Before even building the source RPM, install fedora-packager and instruct +the build system to use rpmbuild-md5 like this: + +dnf install fedora-packager +export RPMBUILD=rpmbuild-md5 + +Then proceed as usual to create the source RPM and binary RPMs: + +LIBS=-lrt ./configure +make dist-rpm +mock --rebuild -r epel-5-x86_64 tor-X.Y.Z.src.rpm + + +(Note: don't build under OpenVZ - it breaks unshare() syscall, which in turn +breaks mock. It could save you several hours.) diff --git a/src/wraith/doc/include.am b/src/wraith/doc/include.am new file mode 100644 index 000000000..0e8de231e --- /dev/null +++ b/src/wraith/doc/include.am @@ -0,0 +1,88 @@ +# We use a two-step process to generate documentation from asciidoc files. +# +# First, we use asciidoc/a2x to process the asciidoc files into .1.in and +# .html.in files (see the asciidoc-helper.sh script). These are the same as +# the regular .1 and .html files, except that they still have some autoconf +# variables set in them. +# +# Second, we use config.status to turn .1.in files into .1 files and +# .html.in files into .html files. +# +# We do the steps in this order so that we can ship the .*.in files as +# part of the source distribution, so that people without asciidoc can +# just use the .1 and .html files. + +all_mans = doc/tor doc/tor-gencert doc/tor-resolve doc/torify + +if USE_ASCIIDOC +nodist_man1_MANS = $(all_mans:=.1) +doc_DATA = $(all_mans:=.html) +html_in = $(all_mans:=.html.in) +man_in = $(all_mans:=.1.in) +txt_in = $(all_mans:=.1.txt) +else +html_in = +man_in = +txt_in = +nodist_man1_MANS = +doc_DATA = +endif + +EXTRA_DIST+= doc/asciidoc-helper.sh \ + $(html_in) $(man_in) $(txt_in) \ + doc/state-contents.txt \ + doc/torrc_format.txt \ + doc/TUNING \ + doc/HACKING/README.1st.md \ + doc/HACKING/CodingStandards.md \ + doc/HACKING/GettingStarted.md \ + doc/HACKING/HelpfulTools.md \ + doc/HACKING/HowToReview.md \ + doc/HACKING/ReleasingTor.md \ + doc/HACKING/WritingTests.md + +docdir = @docdir@ + +asciidoc_product = $(nodist_man1_MANS) $(doc_DATA) + +# Generate the html documentation from asciidoc, but don't do +# machine-specific replacements yet +$(html_in) : + $(AM_V_GEN)$(top_srcdir)/doc/asciidoc-helper.sh html @ASCIIDOC@ $(top_srcdir)/$@ + +# Generate the manpage from asciidoc, but don't do +# machine-specific replacements yet +$(man_in) : + $(AM_V_GEN)$(top_srcdir)/doc/asciidoc-helper.sh man @A2X@ $(top_srcdir)/$@ + +doc/tor.1.in: doc/tor.1.txt +doc/torify.1.in: doc/torify.1.txt +doc/tor-gencert.1.in: doc/tor-gencert.1.txt +doc/tor-resolve.1.in: doc/tor-resolve.1.txt + +doc/tor.html.in: doc/tor.1.txt +doc/torify.html.in: doc/torify.1.txt +doc/tor-gencert.html.in: doc/tor-gencert.1.txt +doc/tor-resolve.html.in: doc/tor-resolve.1.txt + +# use config.status to swap all machine-specific magic strings +# in the asciidoc with their replacements. +$(asciidoc_product) : + $(AM_V_GEN)$(MKDIR_P) $(@D) + $(AM_V_at)if test -e $(top_srcdir)/$@.in && ! test -e $@.in ; then \ + cp $(top_srcdir)/$@.in $@; \ + fi + $(AM_V_at)$(top_builddir)/config.status -q --file=$@; + +doc/tor.html: doc/tor.html.in +doc/tor-gencert.html: doc/tor-gencert.html.in +doc/tor-resolve.html: doc/tor-resolve.html.in +doc/torify.html: doc/torify.html.in + +doc/tor.1: doc/tor.1.in +doc/tor-gencert.1: doc/tor-gencert.1.in +doc/tor-resolve.1: doc/tor-resolve.1.in +doc/torify.1: doc/torify.1.in + +CLEANFILES+= $(asciidoc_product) +DISTCLEANFILES+= $(html_in) $(man_in) diff --git a/src/wraith/doc/state-contents.txt b/src/wraith/doc/state-contents.txt new file mode 100644 index 000000000..44716efc0 --- /dev/null +++ b/src/wraith/doc/state-contents.txt @@ -0,0 +1,105 @@ + +Contents of the Tor state file +============================== + +The state file is structured with more or less the same rules as torrc. +Recognized fields are: + + TorVersion + + The version of Tor that wrote this file + + LastWritten + + Time when this state file was written. + Given in ISO format (YYYY-MM-DD HH:MM:SS) + + AccountingBytesReadInInterval (memory unit) + AccountingBytesWrittenInInterval (memory unit) + AccountingExpectedUsage (memory unit) + AccountingIntervalStart (ISO time) + AccountingSecondsActive (time interval) + AccountingSecondsToReachSoftLimit (time interval) + AccountingSoftLimitHitAt (ISO time) + AccountingBytesAtSoftLimit (memory unit) + + These fields describe the state of the accounting subsystem. + + The IntervalStart is the time at which the current accounting + interval began. We were expecting to use ExpectedUsage over the + course of the interval. BytesRead/BytesWritten are the total + number of bytes transferred over the whole interval. If Tor has + been active during the interval, then AccountingSecondsActive is + the amount of time for which it has been active. We were expecting + to hit the bandwidth soft limit in SecondsToReachSoftLimit after we + became active. When we hit the soft limit, we record + BytesAtSoftLimit. If we hit the soft limit already, we did so at + SoftLimitHitAt. + + EntryGuard + EntryGuardDownSince + EntryGuardUnlistedSince + EntryGuardAddedBy + + These lines form sections related to entry guards. Each section + starts with a single EntryGuard line, and is then followed by + information on the state of the Entry guard. + + The EntryGuard line contains a nickname, then an identity digest, of + the guard. + + The EntryGuardDownSince and EntryGuardUnlistedSince lines are present + if the entry guard is believed to be non-running or non-listed. If + present, they contain a line in ISO format (YYYY-MM-DD HH:MM:SS). + + The EntryGuardAddedBy line is optional. It contains three + space-separated fields: the identity of the entry guard, the version of + Tor that added it, and the ISO time at which it was added. + + TransportProxy + + One or more of these may be present. + + The format is "transportname addr:port", to remember the address + at which a pluggable transport was listening. Tor bridges use + this information to spawn pluggable transport listeners in the + same IP address and TCP port even after tor client restarts. + + BWHistoryReadEnds (ISO time) + BWHistoryReadInterval (integer, number of seconds) + BWHistoryReadValues (comma-separated list of integer) + BWHistoryReadMaxima (comma-separated list of integer) + BWHistoryWriteEnds + BWHistoryWriteInterval + BWHistoryWriteValues + BWHistoryWriteMaxima + BWHistoryDirReadEnds + BWHistoryDirReadInterval + BWHistoryDirReadValues + BWHistoryDirReadMaxima + BWHistoryDirWriteEnds + BWHistoryDirWriteInterval + BWHistoryDirWriteValues + BWHistoryDirWriteMaxima + + These values record bandwidth history. The "Values" fields are a list, for + some number of "Intervals", of the total amount read/written during that + integer. The "Maxima" are the highest burst for each interval. + + Interval duration is set by the "Interval" field, in seconds. The + "Ends" field is the ending time of the last interval in each list. + + The *Read* and *Write* fields are the total amount read and + written; the *DirRead* and *DirWrite* variants are for directory + traffic only. + + LastRotatedOnionKey + + The last time that we changed our onion key for a new one. + Given in ISO format (YYYY-MM-DD HH:MM:SS) + + TotalBuildTimes + CircuitBuildAbandonedCount + CircuitBuildTimeBin + + XXXX writeme. diff --git a/src/wraith/doc/tor-gencert.1.txt b/src/wraith/doc/tor-gencert.1.txt new file mode 100644 index 000000000..6bba548b8 --- /dev/null +++ b/src/wraith/doc/tor-gencert.1.txt @@ -0,0 +1,92 @@ +// Copyright (c) The Tor Project, Inc. +// See LICENSE for licensing information +// This is an asciidoc file used to generate the manpage/html reference. +// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html +:man source: Tor +:man manual: Tor Manual +tor-gencert(1) +============== +Nick Mathewson + +NAME +---- +tor-gencert - Generate certs and keys for Tor directory authorities + +SYNOPSIS +-------- +**tor-gencert** [-h|--help] [-v] [-r|--reuse] [--create-identity-key] [-i __id_file__] [-c +__cert_file__] [-m __num__] [-a __address__:__port__] + +DESCRIPTION +----------- +**tor-gencert** generates certificates and private keys for use by Tor +directory authorities running the v3 Tor directory protocol, as used by +Tor 0.2.0 and later. If you are not running a directory authority, you +don't need to use tor-gencert. + + +Every directory authority has a long term authority __identity__ __key__ (which +is distinct from the identity key it uses as a Tor server); this key +should be kept offline in a secure location. It is used to certify +shorter-lived __signing__ __keys__, which are kept online and used by the +directory authority to sign votes and consensus documents. + + +After you use this program to generate a signing key and a certificate, +copy those files to the keys subdirectory of your Tor process, and send +Tor a SIGHUP signal. DO NOT COPY THE IDENTITY KEY. + +OPTIONS +------- +**-v**:: + Display verbose output. + +**-h** or **--help**:: + Display help text and exit. + +**-r** or **--reuse**:: + Generate a new certificate, but not a new signing key. This can be used to + change the address or lifetime associated with a given key. + +**--create-identity-key**:: + Generate a new identity key. You should only use this option the first time + you run tor-gencert; in the future, you should use the identity key that's + already there. + +**-i** __FILENAME__:: + Read the identity key from the specified file. If the file is not present + and --create-identity-key is provided, create the identity key in the + specified file. Default: "./authority_identity_key" + +**-s** __FILENAME__:: + Write the signing key to the specified file. Default: + "./authority_signing_key" + +**-c** __FILENAME__:: + Write the certificate to the specified file. Default: + "./authority_certificate" + +**-m** __NUM__:: + Number of months that the certificate should be valid. Default: 12. + +**--passphrase-fd** __FILEDES__:: + Filedescriptor to read the passphrase from. Ends at the first NUL or + newline. Default: read from the terminal. + +**-a** __address__:__port__:: + If provided, advertise the address:port combination as this authority's + preferred directory port in its certificate. If the address is a hostname, + the hostname is resolved to an IP before it's published. + +BUGS +---- +This probably doesn't run on Windows. That's not a big issue, since we don't +really want authorities to be running on Windows anyway. + +SEE ALSO +-------- +**tor**(1) + + +See also the "dir-spec.txt" file, distributed with Tor. + +AUTHORS +------- + Roger Dingledine , Nick Mathewson . diff --git a/src/wraith/doc/tor-resolve.1.txt b/src/wraith/doc/tor-resolve.1.txt new file mode 100644 index 000000000..30e16d5da --- /dev/null +++ b/src/wraith/doc/tor-resolve.1.txt @@ -0,0 +1,54 @@ +// Copyright (c) The Tor Project, Inc. +// See LICENSE for licensing information +// This is an asciidoc file used to generate the manpage/html reference. +// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html +:man source: Tor +:man manual: Tor Manual +tor-resolve(1) +============== +Peter Palfrader + +NAME +---- +tor-resolve - resolve a hostname to an IP address via tor + +SYNOPSIS +-------- +**tor-resolve** [-4|-5] [-v] [-x] [-p __socksport__] __hostname__ [__sockshost__[:__socksport__]] + +DESCRIPTION +----------- +**tor-resolve** is a simple script to connect to a SOCKS proxy that knows about +the SOCKS RESOLVE command, hand it a hostname, and return an IP address. + +By default, **tor-resolve** uses the Tor server running on 127.0.0.1 on SOCKS +port 9050. If this isn't what you want, you should specify an explicit +__sockshost__ and/or __socksport__ on the command line. + +OPTIONS +------- +**-v**:: + Display verbose output. + +**-x**:: + Perform a reverse lookup: get the PTR record for an IPv4 address. + +**-5**:: + Use the SOCKS5 protocol. (Default) + +**-4**:: + Use the SOCKS4a protocol rather than the default SOCKS5 protocol. Doesn't + support reverse DNS. + +**-p** __socksport__:: + Override the default SOCKS port without setting the hostname. + +SEE ALSO +-------- +**tor**(1), **torify**(1). + + +See doc/socks-extensions.txt in the Tor package for protocol details. + +AUTHORS +------- +Roger Dingledine , Nick Mathewson . diff --git a/src/wraith/doc/tor.1.txt b/src/wraith/doc/tor.1.txt new file mode 100644 index 000000000..64114d6e6 --- /dev/null +++ b/src/wraith/doc/tor.1.txt @@ -0,0 +1,3196 @@ +// Copyright (c) The Tor Project, Inc. +// See LICENSE for licensing information +// This is an asciidoc file used to generate the manpage/html reference. +// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html +:man source: Tor +:man manual: Tor Manual +TOR(1) +====== + +NAME +---- +tor - The second-generation onion router + + +SYNOPSIS +-------- +**tor** [__OPTION__ __value__]... + +DESCRIPTION +----------- +Tor is a connection-oriented anonymizing communication +service. Users choose a source-routed path through a set of nodes, and +negotiate a "virtual circuit" through the network, in which each node +knows its predecessor and successor, but no others. Traffic flowing down +the circuit is unwrapped by a symmetric key at each node, which reveals +the downstream node. + + +Basically, Tor provides a distributed network of servers or relays ("onion routers"). +Users bounce their TCP streams -- web traffic, ftp, ssh, etc. -- around the +network, and recipients, observers, and even the relays themselves have +difficulty tracking the source of the stream. + +By default, **tor** will act as a client only. To help the network +by providing bandwidth as a relay, change the **ORPort** configuration +option -- see below. Please also consult the documentation on the Tor +Project's website. + +COMMAND-LINE OPTIONS +-------------------- +[[opt-h]] **-h**, **-help**:: + Display a short help message and exit. + +[[opt-f]] **-f** __FILE__:: + Specify a new configuration file to contain further Tor configuration + options OR pass *-* to make Tor read its configuration from standard + input. (Default: @CONFDIR@/torrc, or $HOME/.torrc if that file is not + found) + +[[opt-allow-missing-torrc]] **--allow-missing-torrc**:: + Do not require that configuration file specified by **-f** exist if + default torrc can be accessed. + +[[opt-defaults-torrc]] **--defaults-torrc** __FILE__:: + Specify a file in which to find default values for Tor options. The + contents of this file are overridden by those in the regular + configuration file, and by those on the command line. (Default: + @CONFDIR@/torrc-defaults.) + +[[opt-ignore-missing-torrc]] **--ignore-missing-torrc**:: + Specifies that Tor should treat a missing torrc file as though it + were empty. Ordinarily, Tor does this for missing default torrc files, + but not for those specified on the command line. + +[[opt-hash-password]] **--hash-password** __PASSWORD__:: + Generates a hashed password for control port access. + +[[opt-list-fingerprint]] **--list-fingerprint**:: + Generate your keys and output your nickname and fingerprint. + +[[opt-verify-config]] **--verify-config**:: + Verify the configuration file is valid. + +[[opt-serviceinstall]] **--service install** [**--options** __command-line options__]:: + Install an instance of Tor as a Windows service, with the provided + command-line options. Current instructions can be found at + https://www.torproject.org/docs/faq#NTService + +[[opt-service]] **--service** **remove**|**start**|**stop**:: + Remove, start, or stop a configured Tor Windows service. + +[[opt-nt-service]] **--nt-service**:: + Used internally to implement a Windows service. + +[[opt-list-torrc-options]] **--list-torrc-options**:: + List all valid options. + +[[opt-list-deprecated-options]] **--list-deprecated-options**:: + List all valid options that are scheduled to become obsolete in a + future version. (This is a warning, not a promise.) + +[[opt-version]] **--version**:: + Display Tor version and exit. + +[[opt-quiet]] **--quiet**|**--hush**:: + Override the default console log. By default, Tor starts out logging + messages at level "notice" and higher to the console. It stops doing so + after it parses its configuration, if the configuration tells it to log + anywhere else. You can override this behavior with the **--hush** option, + which tells Tor to only send warnings and errors to the console, or with + the **--quiet** option, which tells Tor not to log to the console at all. + +[[opt-keygen]] **--keygen** [**--newpass**]:: + Running "tor --keygen" creates a new ed25519 master identity key for a + relay, or only a fresh temporary signing key and certificate, if you + already have a master key. Optionally you can encrypt the master identity + key with a passphrase: Tor will ask you for one. If you don't want to + encrypt the master key, just don't enter any passphrase when asked. + + + + The **--newpass** option should be used with --keygen only when you need + to add, change, or remove a passphrase on an existing ed25519 master + identity key. You will be prompted for the old passphase (if any), + and the new passphrase (if any). + + + + When generating a master key, you will probably want to use + **--DataDirectory** to control where the keys + and certificates will be stored, and **--SigningKeyLifetime** to + control their lifetimes. Their behavior is as documented in the + server options section below. (You must have write access to the specified + DataDirectory.) + + + + To use the generated files, you must copy them to the DataDirectory/keys + directory of your Tor daemon, and make sure that they are owned by the + user actually running the Tor daemon on your system. + +**--passphrase-fd** __FILEDES__:: + Filedescriptor to read the passphrase from. Note that unlike with the + tor-gencert program, the entire file contents are read and used as + the passphrase, including any trailing newlines. + Default: read from the terminal. + +[[opt-key-expiration]] **--key-expiration** [**purpose**]:: + The **purpose** specifies which type of key certificate to determine + the expiration of. The only currently recognised **purpose** is + "sign". + + + + Running "tor --key-expiration sign" will attempt to find your signing + key certificate and will output, both in the logs as well as to stdout, + the signing key certificate's expiration time in ISO-8601 format. + For example, the output sent to stdout will be of the form: + "signing-cert-expiry: 2017-07-25 08:30:15 UTC" + +Other options can be specified on the command-line in the format "--option +value", in the format "option value", or in a configuration file. For +instance, you can tell Tor to start listening for SOCKS connections on port +9999 by passing --SocksPort 9999 or SocksPort 9999 to it on the command line, +or by putting "SocksPort 9999" in the configuration file. You will need to +quote options with spaces in them: if you want Tor to log all debugging +messages to debug.log, you will probably need to say --Log 'debug file +debug.log'. + +Options on the command line override those in configuration files. See the +next section for more information. + +THE CONFIGURATION FILE FORMAT +----------------------------- + +All configuration options in a configuration are written on a single line by +default. They take the form of an option name and a value, or an option name +and a quoted value (option value or option "value"). Anything after a # +character is treated as a comment. Options are +case-insensitive. C-style escaped characters are allowed inside quoted +values. To split one configuration entry into multiple lines, use a single +backslash character (\) before the end of the line. Comments can be used in +such multiline entries, but they must start at the beginning of a line. + +Configuration options can be imported from files or folders using the %include +option with the value being a path. If the path is a file, the options from the +file will be parsed as if they were written where the %include option is. If +the path is a folder, all files on that folder will be parsed following lexical +order. Files starting with a dot are ignored. Files on subfolders are ignored. +The %include option can be used recursively. + +By default, an option on the command line overrides an option found in the +configuration file, and an option in a configuration file overrides one in +the defaults file. + +This rule is simple for options that take a single value, but it can become +complicated for options that are allowed to occur more than once: if you +specify four SocksPorts in your configuration file, and one more SocksPort on +the command line, the option on the command line will replace __all__ of the +SocksPorts in the configuration file. If this isn't what you want, prefix +the option name with a plus sign (+), and it will be appended to the previous +set of options instead. For example, setting SocksPort 9100 will use only +port 9100, but setting +SocksPort 9100 will use ports 9100 and 9050 (because +this is the default). + +Alternatively, you might want to remove every instance of an option in the +configuration file, and not replace it at all: you might want to say on the +command line that you want no SocksPorts at all. To do that, prefix the +option name with a forward slash (/). You can use the plus sign (+) and the +forward slash (/) in the configuration file and on the command line. + +GENERAL OPTIONS +--------------- + +[[BandwidthRate]] **BandwidthRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + A token bucket limits the average incoming bandwidth usage on this node + to the specified number of bytes per second, and the average outgoing + bandwidth usage to that same value. If you want to run a relay in the + public network, this needs to be _at the very least_ 75 KBytes for a + relay (that is, 600 kbits) or 50 KBytes for a bridge (400 kbits) -- but of + course, more is better; we recommend at least 250 KBytes (2 mbits) if + possible. (Default: 1 GByte) + + + + Note that this option, and other bandwidth-limiting options, apply to TCP + data only: They do not count TCP headers or DNS traffic. + + + + With this option, and in other options that take arguments in bytes, + KBytes, and so on, other formats are also supported. Notably, "KBytes" can + also be written as "kilobytes" or "kb"; "MBytes" can be written as + "megabytes" or "MB"; "kbits" can be written as "kilobits"; and so forth. + Tor also accepts "byte" and "bit" in the singular. + The prefixes "tera" and "T" are also recognized. + If no units are given, we default to bytes. + To avoid confusion, we recommend writing "bytes" or "bits" explicitly, + since it's easy to forget that "B" means bytes, not bits. + +[[BandwidthBurst]] **BandwidthBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + Limit the maximum token bucket size (also known as the burst) to the given + number of bytes in each direction. (Default: 1 GByte) + +[[MaxAdvertisedBandwidth]] **MaxAdvertisedBandwidth** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + If set, we will not advertise more than this amount of bandwidth for our + BandwidthRate. Server operators who want to reduce the number of clients + who ask to build circuits through them (since this is proportional to + advertised bandwidth rate) can thus reduce the CPU demands on their server + without impacting network performance. + +[[RelayBandwidthRate]] **RelayBandwidthRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + If not 0, a separate token bucket limits the average incoming bandwidth + usage for \_relayed traffic_ on this node to the specified number of bytes + per second, and the average outgoing bandwidth usage to that same value. + Relayed traffic currently is calculated to include answers to directory + requests, but that may change in future versions. They do not include directory + fetches by the relay (from authority or other relays), because that is considered + "client" activity. (Default: 0) + +[[RelayBandwidthBurst]] **RelayBandwidthBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + If not 0, limit the maximum token bucket size (also known as the burst) for + \_relayed traffic_ to the given number of bytes in each direction. + They do not include directory fetches by the relay (from authority + or other relays), because that is considered "client" activity. (Default: 0) + +[[PerConnBWRate]] **PerConnBWRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + If set, do separate rate limiting for each connection from a non-relay. + You should never need to change this value, since a network-wide value is + published in the consensus and your relay will use that value. (Default: 0) + +[[PerConnBWBurst]] **PerConnBWBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + If set, do separate rate limiting for each connection from a non-relay. + You should never need to change this value, since a network-wide value is + published in the consensus and your relay will use that value. (Default: 0) + +[[ClientTransportPlugin]] **ClientTransportPlugin** __transport__ socks4|socks5 __IP__:__PORT__:: +**ClientTransportPlugin** __transport__ exec __path-to-binary__ [options]:: + In its first form, when set along with a corresponding Bridge line, the Tor + client forwards its traffic to a SOCKS-speaking proxy on "IP:PORT". + (IPv4 addresses should written as-is; IPv6 addresses should be wrapped in + square brackets.) It's the + duty of that proxy to properly forward the traffic to the bridge. + + + + In its second form, when set along with a corresponding Bridge line, the Tor + client launches the pluggable transport proxy executable in + __path-to-binary__ using __options__ as its command-line options, and + forwards its traffic to it. It's the duty of that proxy to properly forward + the traffic to the bridge. + +[[ServerTransportPlugin]] **ServerTransportPlugin** __transport__ exec __path-to-binary__ [options]:: + The Tor relay launches the pluggable transport proxy in __path-to-binary__ + using __options__ as its command-line options, and expects to receive + proxied client traffic from it. + +[[ServerTransportListenAddr]] **ServerTransportListenAddr** __transport__ __IP__:__PORT__:: + When this option is set, Tor will suggest __IP__:__PORT__ as the + listening address of any pluggable transport proxy that tries to + launch __transport__. (IPv4 addresses should written as-is; IPv6 + addresses should be wrapped in square brackets.) + +[[ServerTransportOptions]] **ServerTransportOptions** __transport__ __k=v__ __k=v__ ...:: + When this option is set, Tor will pass the __k=v__ parameters to + any pluggable transport proxy that tries to launch __transport__. + + (Example: ServerTransportOptions obfs45 shared-secret=bridgepasswd cache=/var/lib/tor/cache) + +[[ExtORPort]] **ExtORPort** \['address':]__port__|**auto**:: + Open this port to listen for Extended ORPort connections from your + pluggable transports. + +[[ExtORPortCookieAuthFile]] **ExtORPortCookieAuthFile** __Path__:: + If set, this option overrides the default location and file name + for the Extended ORPort's cookie file -- the cookie file is needed + for pluggable transports to communicate through the Extended ORPort. + +[[ExtORPortCookieAuthFileGroupReadable]] **ExtORPortCookieAuthFileGroupReadable** **0**|**1**:: + If this option is set to 0, don't allow the filesystem group to read the + Extended OR Port cookie file. If the option is set to 1, make the cookie + file readable by the default GID. [Making the file readable by other + groups is not yet implemented; let us know if you need this for some + reason.] (Default: 0) + +[[ConnLimit]] **ConnLimit** __NUM__:: + The minimum number of file descriptors that must be available to the Tor + process before it will start. Tor will ask the OS for as many file + descriptors as the OS will allow (you can find this by "ulimit -H -n"). + If this number is less than ConnLimit, then Tor will refuse to start. + + + + You probably don't need to adjust this. It has no effect on Windows + since that platform lacks getrlimit(). (Default: 1000) + +[[DisableNetwork]] **DisableNetwork** **0**|**1**:: + When this option is set, we don't listen for or accept any connections + other than controller connections, and we close (and don't reattempt) + any outbound + connections. Controllers sometimes use this option to avoid using + the network until Tor is fully configured. (Default: 0) + +[[ConstrainedSockets]] **ConstrainedSockets** **0**|**1**:: + If set, Tor will tell the kernel to attempt to shrink the buffers for all + sockets to the size specified in **ConstrainedSockSize**. This is useful for + virtual servers and other environments where system level TCP buffers may + be limited. If you're on a virtual server, and you encounter the "Error + creating network socket: No buffer space available" message, you are + likely experiencing this problem. + + + + The preferred solution is to have the admin increase the buffer pool for + the host itself via /proc/sys/net/ipv4/tcp_mem or equivalent facility; + this configuration option is a second-resort. + + + + The DirPort option should also not be used if TCP buffers are scarce. The + cached directory requests consume additional sockets which exacerbates + the problem. + + + + You should **not** enable this feature unless you encounter the "no buffer + space available" issue. Reducing the TCP buffers affects window size for + the TCP stream and will reduce throughput in proportion to round trip + time on long paths. (Default: 0) + +[[ConstrainedSockSize]] **ConstrainedSockSize** __N__ **bytes**|**KBytes**:: + When **ConstrainedSockets** is enabled the receive and transmit buffers for + all sockets will be set to this limit. Must be a value between 2048 and + 262144, in 1024 byte increments. Default of 8192 is recommended. + +[[ControlPort]] **ControlPort** __PORT__|**unix:**__path__|**auto** [__flags__]:: + If set, Tor will accept connections on this port and allow those + connections to control the Tor process using the Tor Control Protocol + (described in control-spec.txt in + https://spec.torproject.org[torspec]). Note: unless you also + specify one or more of **HashedControlPassword** or + **CookieAuthentication**, setting this option will cause Tor to allow + any process on the local host to control it. (Setting both authentication + methods means either method is sufficient to authenticate to Tor.) This + option is required for many Tor controllers; most use the value of 9051. + If a unix domain socket is used, you may quote the path using standard + C escape sequences. + Set it to "auto" to have Tor pick a port for you. (Default: 0) + + + + Recognized flags are... + **GroupWritable**;; + Unix domain sockets only: makes the socket get created as + group-writable. + **WorldWritable**;; + Unix domain sockets only: makes the socket get created as + world-writable. + **RelaxDirModeCheck**;; + Unix domain sockets only: Do not insist that the directory + that holds the socket be read-restricted. + +[[ControlSocket]] **ControlSocket** __Path__:: + Like ControlPort, but listens on a Unix domain socket, rather than a TCP + socket. '0' disables ControlSocket (Unix and Unix-like systems only.) + +[[ControlSocketsGroupWritable]] **ControlSocketsGroupWritable** **0**|**1**:: + If this option is set to 0, don't allow the filesystem group to read and + write unix sockets (e.g. ControlSocket). If the option is set to 1, make + the control socket readable and writable by the default GID. (Default: 0) + +[[HashedControlPassword]] **HashedControlPassword** __hashed_password__:: + Allow connections on the control port if they present + the password whose one-way hash is __hashed_password__. You + can compute the hash of a password by running "tor --hash-password + __password__". You can provide several acceptable passwords by using more + than one HashedControlPassword line. + +[[CookieAuthentication]] **CookieAuthentication** **0**|**1**:: + If this option is set to 1, allow connections on the control port + when the connecting process knows the contents of a file named + "control_auth_cookie", which Tor will create in its data directory. This + authentication method should only be used on systems with good filesystem + security. (Default: 0) + +[[CookieAuthFile]] **CookieAuthFile** __Path__:: + If set, this option overrides the default location and file name + for Tor's cookie file. (See CookieAuthentication above.) + +[[CookieAuthFileGroupReadable]] **CookieAuthFileGroupReadable** **0**|**1**:: + If this option is set to 0, don't allow the filesystem group to read the + cookie file. If the option is set to 1, make the cookie file readable by + the default GID. [Making the file readable by other groups is not yet + implemented; let us know if you need this for some reason.] (Default: 0) + +[[ControlPortWriteToFile]] **ControlPortWriteToFile** __Path__:: + If set, Tor writes the address and port of any control port it opens to + this address. Usable by controllers to learn the actual control port + when ControlPort is set to "auto". + +[[ControlPortFileGroupReadable]] **ControlPortFileGroupReadable** **0**|**1**:: + If this option is set to 0, don't allow the filesystem group to read the + control port file. If the option is set to 1, make the control port + file readable by the default GID. (Default: 0) + +[[DataDirectory]] **DataDirectory** __DIR__:: + Store working data in DIR. Can not be changed while tor is running. + (Default: ~/.tor if your home directory is not /; otherwise, + @LOCALSTATEDIR@/lib/tor. On Windows, the default is + your ApplicationData folder.) + +[[DataDirectoryGroupReadable]] **DataDirectoryGroupReadable** **0**|**1**:: + If this option is set to 0, don't allow the filesystem group to read the + DataDirectory. If the option is set to 1, make the DataDirectory readable + by the default GID. (Default: 0) + +[[CacheDirectory]] **CacheDirectory** __DIR__:: + Store cached directory data in DIR. Can not be changed while tor is + running. + (Default: uses the value of DataDirectory.) + +[[CacheDirectoryGroupReadable]] **CacheDirectoryGroupReadable** **0**|**1**:: + If this option is set to 0, don't allow the filesystem group to read the + CacheDirectory. If the option is set to 1, make the CacheDirectory readable + by the default GID. (Default: 0) + +[[FallbackDir]] **FallbackDir** __ipv4address__:__port__ orport=__port__ id=__fingerprint__ [weight=__num__] [ipv6=**[**__ipv6address__**]**:__orport__]:: + When we're unable to connect to any directory cache for directory info + (usually because we don't know about any yet) we try a directory authority. + Clients also simultaneously try a FallbackDir, to avoid hangs on client + startup if a directory authority is down. Clients retry FallbackDirs more + often than directory authorities, to reduce the load on the directory + authorities. + By default, the directory authorities are also FallbackDirs. Specifying a + FallbackDir replaces Tor's default hard-coded FallbackDirs (if any). + (See the **DirAuthority** entry for an explanation of each flag.) + +[[UseDefaultFallbackDirs]] **UseDefaultFallbackDirs** **0**|**1**:: + Use Tor's default hard-coded FallbackDirs (if any). (When a + FallbackDir line is present, it replaces the hard-coded FallbackDirs, + regardless of the value of UseDefaultFallbackDirs.) (Default: 1) + +[[DirAuthority]] **DirAuthority** [__nickname__] [**flags**] __ipv4address__:__port__ __fingerprint__:: + Use a nonstandard authoritative directory server at the provided address + and port, with the specified key fingerprint. This option can be repeated + many times, for multiple authoritative directory servers. Flags are + separated by spaces, and determine what kind of an authority this directory + is. By default, an authority is not authoritative for any directory style + or version unless an appropriate flag is given. + Tor will use this authority as a bridge authoritative directory if the + "bridge" flag is set. If a flag "orport=**port**" is given, Tor will use the + given port when opening encrypted tunnels to the dirserver. If a flag + "weight=**num**" is given, then the directory server is chosen randomly + with probability proportional to that weight (default 1.0). If a + flag "v3ident=**fp**" is given, the dirserver is a v3 directory authority + whose v3 long-term signing key has the fingerprint **fp**. Lastly, + if an "ipv6=**[**__ipv6address__**]**:__orport__" flag is present, then + the directory + authority is listening for IPv6 connections on the indicated IPv6 address + and OR Port. + + + + Tor will contact the authority at __ipv4address__ to + download directory documents. The provided __port__ value is a dirport; + clients ignore this in favor of the specified "orport=" value. If an + IPv6 ORPort is supplied, Tor will + also download directory documents at the IPv6 ORPort. + + + + If no **DirAuthority** line is given, Tor will use the default directory + authorities. NOTE: this option is intended for setting up a private Tor + network with its own directory authorities. If you use it, you will be + distinguishable from other users, because you won't believe the same + authorities they do. + +[[DirAuthorityFallbackRate]] **DirAuthorityFallbackRate** __NUM__:: + When configured to use both directory authorities and fallback + directories, the directory authorities also work as fallbacks. They are + chosen with their regular weights, multiplied by this number, which + should be 1.0 or less. (Default: 1.0) + +[[AlternateDirAuthority]] **AlternateDirAuthority** [__nickname__] [**flags**] __ipv4address__:__port__ __fingerprint__ + + +[[AlternateBridgeAuthority]] **AlternateBridgeAuthority** [__nickname__] [**flags**] __ipv4address__:__port__ __ fingerprint__:: + These options behave as DirAuthority, but they replace fewer of the + default directory authorities. Using + AlternateDirAuthority replaces the default Tor directory authorities, but + leaves the default bridge authorities in + place. Similarly, + AlternateBridgeAuthority replaces the default bridge authority, + but leaves the directory authorities alone. + +[[DisableAllSwap]] **DisableAllSwap** **0**|**1**:: + If set to 1, Tor will attempt to lock all current and future memory pages, + so that memory cannot be paged out. Windows, OS X and Solaris are currently + not supported. We believe that this feature works on modern Gnu/Linux + distributions, and that it should work on *BSD systems (untested). This + option requires that you start your Tor as root, and you should use the + **User** option to properly reduce Tor's privileges. + Can not be changed while tor is running. (Default: 0) + +[[DisableDebuggerAttachment]] **DisableDebuggerAttachment** **0**|**1**:: + If set to 1, Tor will attempt to prevent basic debugging attachment attempts + by other processes. This may also keep Tor from generating core files if + it crashes. It has no impact for users who wish to attach if they + have CAP_SYS_PTRACE or if they are root. We believe that this feature + works on modern Gnu/Linux distributions, and that it may also work on *BSD + systems (untested). Some modern Gnu/Linux systems such as Ubuntu have the + kernel.yama.ptrace_scope sysctl and by default enable it as an attempt to + limit the PTRACE scope for all user processes by default. This feature will + attempt to limit the PTRACE scope for Tor specifically - it will not attempt + to alter the system wide ptrace scope as it may not even exist. If you wish + to attach to Tor with a debugger such as gdb or strace you will want to set + this to 0 for the duration of your debugging. Normal users should leave it + on. Disabling this option while Tor is running is prohibited. (Default: 1) + +[[FetchDirInfoEarly]] **FetchDirInfoEarly** **0**|**1**:: + If set to 1, Tor will always fetch directory information like other + directory caches, even if you don't meet the normal criteria for fetching + early. Normal users should leave it off. (Default: 0) + +[[FetchDirInfoExtraEarly]] **FetchDirInfoExtraEarly** **0**|**1**:: + If set to 1, Tor will fetch directory information before other directory + caches. It will attempt to download directory information closer to the + start of the consensus period. Normal users should leave it off. + (Default: 0) + +[[FetchHidServDescriptors]] **FetchHidServDescriptors** **0**|**1**:: + If set to 0, Tor will never fetch any hidden service descriptors from the + rendezvous directories. This option is only useful if you're using a Tor + controller that handles hidden service fetches for you. (Default: 1) + +[[FetchServerDescriptors]] **FetchServerDescriptors** **0**|**1**:: + If set to 0, Tor will never fetch any network status summaries or server + descriptors from the directory servers. This option is only useful if + you're using a Tor controller that handles directory fetches for you. + (Default: 1) + +[[FetchUselessDescriptors]] **FetchUselessDescriptors** **0**|**1**:: + If set to 1, Tor will fetch every consensus flavor, descriptor, and + certificate that it hears about. Otherwise, it will avoid fetching useless + descriptors: flavors that it is not using to build circuits, and authority + certificates it does not trust. This option is useful if you're using a + tor client with an external parser that uses a full consensus. + This option fetches all documents, **DirCache** fetches and serves + all documents. (Default: 0) + +[[HTTPProxy]] **HTTPProxy** __host__[:__port__]:: + Tor will make all its directory requests through this host:port (or host:80 + if port is not specified), rather than connecting directly to any directory + servers. (DEPRECATED: As of 0.3.1.0-alpha you should use HTTPSProxy.) + +[[HTTPProxyAuthenticator]] **HTTPProxyAuthenticator** __username:password__:: + If defined, Tor will use this username:password for Basic HTTP proxy + authentication, as in RFC 2617. This is currently the only form of HTTP + proxy authentication that Tor supports; feel free to submit a patch if you + want it to support others. (DEPRECATED: As of 0.3.1.0-alpha you should use + HTTPSProxyAuthenticator.) + +[[HTTPSProxy]] **HTTPSProxy** __host__[:__port__]:: + Tor will make all its OR (SSL) connections through this host:port (or + host:443 if port is not specified), via HTTP CONNECT rather than connecting + directly to servers. You may want to set **FascistFirewall** to restrict + the set of ports you might try to connect to, if your HTTPS proxy only + allows connecting to certain ports. + +[[HTTPSProxyAuthenticator]] **HTTPSProxyAuthenticator** __username:password__:: + If defined, Tor will use this username:password for Basic HTTPS proxy + authentication, as in RFC 2617. This is currently the only form of HTTPS + proxy authentication that Tor supports; feel free to submit a patch if you + want it to support others. + +[[Sandbox]] **Sandbox** **0**|**1**:: + If set to 1, Tor will run securely through the use of a syscall sandbox. + Otherwise the sandbox will be disabled. The option is currently an + experimental feature. It only works on Linux-based operating systems, + and only when Tor has been built with the libseccomp library. This option + can not be changed while tor is running. + + + When the Sandbox is 1, the following options can not be changed when tor + is running: + Address + ConnLimit + CookieAuthFile + DirPortFrontPage + ExtORPortCookieAuthFile + Logs + ServerDNSResolvConfFile + Tor must remain in client or server mode (some changes to ClientOnly and + ORPort are not allowed). + (Default: 0) + +[[Socks4Proxy]] **Socks4Proxy** __host__[:__port__]:: + Tor will make all OR connections through the SOCKS 4 proxy at host:port + (or host:1080 if port is not specified). + +[[Socks5Proxy]] **Socks5Proxy** __host__[:__port__]:: + Tor will make all OR connections through the SOCKS 5 proxy at host:port + (or host:1080 if port is not specified). + +[[Socks5ProxyUsername]] **Socks5ProxyUsername** __username__ + + +[[Socks5ProxyPassword]] **Socks5ProxyPassword** __password__:: + If defined, authenticate to the SOCKS 5 server using username and password + in accordance to RFC 1929. Both username and password must be between 1 and + 255 characters. + +[[SocksSocketsGroupWritable]] **SocksSocketsGroupWritable** **0**|**1**:: + If this option is set to 0, don't allow the filesystem group to read and + write unix sockets (e.g. SocksSocket). If the option is set to 1, make + the SocksSocket socket readable and writable by the default GID. (Default: 0) + +[[KeepalivePeriod]] **KeepalivePeriod** __NUM__:: + To keep firewalls from expiring connections, send a padding keepalive cell + every NUM seconds on open connections that are in use. If the connection + has no open circuits, it will instead be closed after NUM seconds of + idleness. (Default: 5 minutes) + +[[Log]] **Log** __minSeverity__[-__maxSeverity__] **stderr**|**stdout**|**syslog**:: + Send all messages between __minSeverity__ and __maxSeverity__ to the standard + output stream, the standard error stream, or to the system log. (The + "syslog" value is only supported on Unix.) Recognized severity levels are + debug, info, notice, warn, and err. We advise using "notice" in most cases, + since anything more verbose may provide sensitive information to an + attacker who obtains the logs. If only one severity level is given, all + messages of that level or higher will be sent to the listed destination. + +[[Log2]] **Log** __minSeverity__[-__maxSeverity__] **file** __FILENAME__:: + As above, but send log messages to the listed filename. The + "Log" option may appear more than once in a configuration file. + Messages are sent to all the logs that match their severity + level. + +[[Log3]] **Log** **[**__domain__,...**]**__minSeverity__[-__maxSeverity__] ... **file** __FILENAME__ + + +[[Log4]] **Log** **[**__domain__,...**]**__minSeverity__[-__maxSeverity__] ... **stderr**|**stdout**|**syslog**:: + As above, but select messages by range of log severity __and__ by a + set of "logging domains". Each logging domain corresponds to an area of + functionality inside Tor. You can specify any number of severity ranges + for a single log statement, each of them prefixed by a comma-separated + list of logging domains. You can prefix a domain with $$~$$ to indicate + negation, and use * to indicate "all domains". If you specify a severity + range without a list of domains, it matches all domains. + + + + This is an advanced feature which is most useful for debugging one or two + of Tor's subsystems at a time. + + + + The currently recognized domains are: general, crypto, net, config, fs, + protocol, mm, http, app, control, circ, rend, bug, dir, dirserv, or, edge, + acct, hist, and handshake. Domain names are case-insensitive. + + + + For example, "`Log [handshake]debug [~net,~mm]info notice stdout`" sends + to stdout: all handshake messages of any severity, all info-and-higher + messages from domains other than networking and memory management, and all + messages of severity notice or higher. + +[[LogMessageDomains]] **LogMessageDomains** **0**|**1**:: + If 1, Tor includes message domains with each log message. Every log + message currently has at least one domain; most currently have exactly + one. This doesn't affect controller log messages. (Default: 0) + +[[MaxUnparseableDescSizeToLog]] **MaxUnparseableDescSizeToLog** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**:: + Unparseable descriptors (e.g. for votes, consensuses, routers) are logged + in separate files by hash, up to the specified size in total. Note that + only files logged during the lifetime of this Tor process count toward the + total; this is intended to be used to debug problems without opening live + servers to resource exhaustion attacks. (Default: 10 MB) + +[[OutboundBindAddress]] **OutboundBindAddress** __IP__:: + Make all outbound connections originate from the IP address specified. This + is only useful when you have multiple network interfaces, and you want all + of Tor's outgoing connections to use a single one. This option may + be used twice, once with an IPv4 address and once with an IPv6 address. + IPv6 addresses should be wrapped in square brackets. + This setting will be ignored for connections to the loopback addresses + (127.0.0.0/8 and ::1). + +[[OutboundBindAddressOR]] **OutboundBindAddressOR** __IP__:: + Make all outbound non-exit (relay and other) connections + originate from the IP address specified. This option overrides + **OutboundBindAddress** for the same IP version. This option may + be used twice, once with an IPv4 address and once with an IPv6 + address. IPv6 addresses should be wrapped in square brackets. + This setting will be ignored for connections to the loopback + addresses (127.0.0.0/8 and ::1). + +[[OutboundBindAddressExit]] **OutboundBindAddressExit** __IP__:: + Make all outbound exit connections originate from the IP address + specified. This option overrides **OutboundBindAddress** for the + same IP version. This option may be used twice, once with an IPv4 + address and once with an IPv6 address. + IPv6 addresses should be wrapped in square brackets. + This setting will be ignored + for connections to the loopback addresses (127.0.0.0/8 and ::1). + +[[PidFile]] **PidFile** __FILE__:: + On startup, write our PID to FILE. On clean shutdown, remove + FILE. Can not be changed while tor is running. + +[[ProtocolWarnings]] **ProtocolWarnings** **0**|**1**:: + If 1, Tor will log with severity \'warn' various cases of other parties not + following the Tor specification. Otherwise, they are logged with severity + \'info'. (Default: 0) + +[[RunAsDaemon]] **RunAsDaemon** **0**|**1**:: + If 1, Tor forks and daemonizes to the background. This option has no effect + on Windows; instead you should use the --service command-line option. + Can not be changed while tor is running. + (Default: 0) + +[[LogTimeGranularity]] **LogTimeGranularity** __NUM__:: + Set the resolution of timestamps in Tor's logs to NUM milliseconds. + NUM must be positive and either a divisor or a multiple of 1 second. + Note that this option only controls the granularity written by Tor to + a file or console log. Tor does not (for example) "batch up" log + messages to affect times logged by a controller, times attached to + syslog messages, or the mtime fields on log files. (Default: 1 second) + +[[TruncateLogFile]] **TruncateLogFile** **0**|**1**:: + If 1, Tor will overwrite logs at startup and in response to a HUP signal, + instead of appending to them. (Default: 0) + +[[SyslogIdentityTag]] **SyslogIdentityTag** __tag__:: + When logging to syslog, adds a tag to the syslog identity such that + log entries are marked with "Tor-__tag__". Can not be changed while tor is + running. (Default: none) + +[[AndroidIdentityTag]] **AndroidIdentityTag** __tag__:: + When logging to Android's logging subsystem, adds a tag to the log identity + such that log entries are marked with "Tor-__tag__". Can not be changed while + tor is running. (Default: none) + +[[SafeLogging]] **SafeLogging** **0**|**1**|**relay**:: + Tor can scrub potentially sensitive strings from log messages (e.g. + addresses) by replacing them with the string [scrubbed]. This way logs can + still be useful, but they don't leave behind personally identifying + information about what sites a user might have visited. + + + + If this option is set to 0, Tor will not perform any scrubbing, if it is + set to 1, all potentially sensitive strings are replaced. If it is set to + relay, all log messages generated when acting as a relay are sanitized, but + all messages generated when acting as a client are not. (Default: 1) + +[[User]] **User** __Username__:: + On startup, setuid to this user and setgid to their primary group. + Can not be changed while tor is running. + +[[KeepBindCapabilities]] **KeepBindCapabilities** **0**|**1**|**auto**:: + On Linux, when we are started as root and we switch our identity using + the **User** option, the **KeepBindCapabilities** option tells us whether to + try to retain our ability to bind to low ports. If this value is 1, we + try to keep the capability; if it is 0 we do not; and if it is **auto**, + we keep the capability only if we are configured to listen on a low port. + Can not be changed while tor is running. + (Default: auto.) + +[[HardwareAccel]] **HardwareAccel** **0**|**1**:: + If non-zero, try to use built-in (static) crypto hardware acceleration when + available. Can not be changed while tor is running. (Default: 0) + +[[AccelName]] **AccelName** __NAME__:: + When using OpenSSL hardware crypto acceleration attempt to load the dynamic + engine of this name. This must be used for any dynamic hardware engine. + Names can be verified with the openssl engine command. Can not be changed + while tor is running. + +[[AccelDir]] **AccelDir** __DIR__:: + Specify this option if using dynamic hardware acceleration and the engine + implementation library resides somewhere other than the OpenSSL default. + Can not be changed while tor is running. + +[[AvoidDiskWrites]] **AvoidDiskWrites** **0**|**1**:: + If non-zero, try to write to disk less frequently than we would otherwise. + This is useful when running on flash memory or other media that support + only a limited number of writes. (Default: 0) + +[[CircuitPriorityHalflife]] **CircuitPriorityHalflife** __NUM1__:: + If this value is set, we override the default algorithm for choosing which + circuit's cell to deliver or relay next. When the value is 0, we + round-robin between the active circuits on a connection, delivering one + cell from each in turn. When the value is positive, we prefer delivering + cells from whichever connection has the lowest weighted cell count, where + cells are weighted exponentially according to the supplied + CircuitPriorityHalflife value (in seconds). If this option is not set at + all, we use the behavior recommended in the current consensus + networkstatus. This is an advanced option; you generally shouldn't have + to mess with it. (Default: not set) + +[[CountPrivateBandwidth]] **CountPrivateBandwidth** **0**|**1**:: + If this option is set, then Tor's rate-limiting applies not only to + remote connections, but also to connections to private addresses like + 127.0.0.1 or 10.0.0.1. This is mostly useful for debugging + rate-limiting. (Default: 0) + +[[ExtendByEd25519ID]] **ExtendByEd25519ID** **0**|**1**|**auto**:: + If this option is set to 1, we always try to include a relay's Ed25519 ID + when telling the proceeding relay in a circuit to extend to it. + If this option is set to 0, we never include Ed25519 IDs when extending + circuits. If the option is set to "default", we obey a + parameter in the consensus document. (Default: auto) + +[[NoExec]] **NoExec** **0**|**1**:: + If this option is set to 1, then Tor will never launch another + executable, regardless of the settings of PortForwardingHelper, + ClientTransportPlugin, or ServerTransportPlugin. Once this + option has been set to 1, it cannot be set back to 0 without + restarting Tor. (Default: 0) + +[[Schedulers]] **Schedulers** **KIST**|**KISTLite**|**Vanilla**:: + Specify the scheduler type that tor should use. The scheduler is + responsible for moving data around within a Tor process. This is an ordered + list by priority which means that the first value will be tried first and if + unavailable, the second one is tried and so on. It is possible to change + these values at runtime. This option mostly effects relays, and most + operators should leave it set to its default value. + (Default: KIST,KISTLite,Vanilla) + + + The possible scheduler types are: + + + **KIST**: Kernel-Informed Socket Transport. Tor will use TCP information + from the kernel to make informed decisions regarding how much data to send + and when to send it. KIST also handles traffic in batches (see + KISTSchedRunInterval) in order to improve traffic prioritization decisions. + As implemented, KIST will only work on Linux kernel version 2.6.39 or + higher. + + + **KISTLite**: Same as KIST but without kernel support. Tor will use all + the same mechanics as with KIST, including the batching, but its decisions + regarding how much data to send will not be as good. KISTLite will work on + all kernels and operating systems, and the majority of the benefits of KIST + are still realized with KISTLite. + + + **Vanilla**: The scheduler that Tor used before KIST was implemented. It + sends as much data as possible, as soon as possible. Vanilla will work on + all kernels and operating systems. + +[[KISTSchedRunInterval]] **KISTSchedRunInterval** __NUM__ **msec**:: + If KIST or KISTLite is used in the Schedulers option, this controls at which + interval the scheduler tick is. If the value is 0 msec, the value is taken + from the consensus if possible else it will fallback to the default 10 + msec. Maximum possible value is 100 msec. (Default: 0 msec) + +[[KISTSockBufSizeFactor]] **KISTSockBufSizeFactor** __NUM__:: + If KIST is used in Schedulers, this is a multiplier of the per-socket + limit calculation of the KIST algorithm. (Default: 1.0) + +CLIENT OPTIONS +-------------- + +The following options are useful only for clients (that is, if +**SocksPort**, **HTTPTunnelPort**, **TransPort**, **DNSPort**, or +**NATDPort** is non-zero): + +[[Bridge]] **Bridge** [__transport__] __IP__:__ORPort__ [__fingerprint__]:: + When set along with UseBridges, instructs Tor to use the relay at + "IP:ORPort" as a "bridge" relaying into the Tor network. If "fingerprint" + is provided (using the same format as for DirAuthority), we will verify that + the relay running at that location has the right fingerprint. We also use + fingerprint to look up the bridge descriptor at the bridge authority, if + it's provided and if UpdateBridgesFromAuthority is set too. + + + + If "transport" is provided, it must match a ClientTransportPlugin line. We + then use that pluggable transport's proxy to transfer data to the bridge, + rather than connecting to the bridge directly. Some transports use a + transport-specific method to work out the remote address to connect to. + These transports typically ignore the "IP:ORPort" specified in the bridge + line. + + + + Tor passes any "key=val" settings to the pluggable transport proxy as + per-connection arguments when connecting to the bridge. Consult + the documentation of the pluggable transport for details of what + arguments it supports. + +[[LearnCircuitBuildTimeout]] **LearnCircuitBuildTimeout** **0**|**1**:: + If 0, CircuitBuildTimeout adaptive learning is disabled. (Default: 1) + +[[CircuitBuildTimeout]] **CircuitBuildTimeout** __NUM__:: + + Try for at most NUM seconds when building circuits. If the circuit isn't + open in that time, give up on it. If LearnCircuitBuildTimeout is 1, this + value serves as the initial value to use before a timeout is learned. If + LearnCircuitBuildTimeout is 0, this value is the only value used. + (Default: 60 seconds) + +[[CircuitsAvailableTimeout]] **CircuitsAvailableTimeout** __NUM__:: + Tor will attempt to keep at least one open, unused circuit available for + this amount of time. This option governs how long idle circuits are kept + open, as well as the amount of time Tor will keep a circuit open to each + of the recently used ports. This way when the Tor client is entirely + idle, it can expire all of its circuits, and then expire its TLS + connections. Note that the actual timeout value is uniformly randomized + from the specified value to twice that amount. (Default: 30 minutes; + Max: 24 hours) + +[[CircuitStreamTimeout]] **CircuitStreamTimeout** __NUM__:: + If non-zero, this option overrides our internal timeout schedule for how + many seconds until we detach a stream from a circuit and try a new circuit. + If your network is particularly slow, you might want to set this to a + number like 60. (Default: 0) + +[[ClientOnly]] **ClientOnly** **0**|**1**:: + If set to 1, Tor will not run as a relay or serve + directory requests, even if the ORPort, ExtORPort, or DirPort options are + set. (This config option is + mostly unnecessary: we added it back when we were considering having + Tor clients auto-promote themselves to being relays if they were stable + and fast enough. The current behavior is simply that Tor is a client + unless ORPort, ExtORPort, or DirPort are configured.) (Default: 0) + +[[ConnectionPadding]] **ConnectionPadding** **0**|**1**|**auto**:: + This option governs Tor's use of padding to defend against some forms of + traffic analysis. If it is set to 'auto', Tor will send padding only + if both the client and the relay support it. If it is set to 0, Tor will + not send any padding cells. If it is set to 1, Tor will still send padding + for client connections regardless of relay support. Only clients may set + this option. This option should be offered via the UI to mobile users + for use where bandwidth may be expensive. + (Default: auto) + +[[ReducedConnectionPadding]] **ReducedConnectionPadding** **0**|**1**:: + If set to 1, Tor will not not hold OR connections open for very long, + and will send less padding on these connections. Only clients may set + this option. This option should be offered via the UI to mobile users + for use where bandwidth may be expensive. (Default: 0) + +[[ExcludeNodes]] **ExcludeNodes** __node__,__node__,__...__:: + A list of identity fingerprints, country codes, and address + patterns of nodes to avoid when building a circuit. Country codes are + 2-letter ISO3166 codes, and must + be wrapped in braces; fingerprints may be preceded by a dollar sign. + (Example: + ExcludeNodes ABCD1234CDEF5678ABCD1234CDEF5678ABCD1234, \{cc}, 255.254.0.0/8) + + + + By default, this option is treated as a preference that Tor is allowed + to override in order to keep working. + For example, if you try to connect to a hidden service, + but you have excluded all of the hidden service's introduction points, + Tor will connect to one of them anyway. If you do not want this + behavior, set the StrictNodes option (documented below). + + + + Note also that if you are a relay, this (and the other node selection + options below) only affects your own circuits that Tor builds for you. + Clients can still build circuits through you to any node. Controllers + can tell Tor to build circuits through any node. + + + + Country codes are case-insensitive. The code "\{??}" refers to nodes whose + country can't be identified. No country code, including \{??}, works if + no GeoIPFile can be loaded. See also the GeoIPExcludeUnknown option below. + + +[[ExcludeExitNodes]] **ExcludeExitNodes** __node__,__node__,__...__:: + A list of identity fingerprints, country codes, and address + patterns of nodes to never use when picking an exit node---that is, a + node that delivers traffic for you *outside* the Tor network. Note that any + node listed in ExcludeNodes is automatically considered to be part of this + list too. See + the **ExcludeNodes** option for more information on how to specify + nodes. See also the caveats on the "ExitNodes" option below. + +[[GeoIPExcludeUnknown]] **GeoIPExcludeUnknown** **0**|**1**|**auto**:: + If this option is set to 'auto', then whenever any country code is set in + ExcludeNodes or ExcludeExitNodes, all nodes with unknown country (\{??} and + possibly \{A1}) are treated as excluded as well. If this option is set to + '1', then all unknown countries are treated as excluded in ExcludeNodes + and ExcludeExitNodes. This option has no effect when a GeoIP file isn't + configured or can't be found. (Default: auto) + +[[ExitNodes]] **ExitNodes** __node__,__node__,__...__:: + A list of identity fingerprints, country codes, and address + patterns of nodes to use as exit node---that is, a + node that delivers traffic for you *outside* the Tor network. See + the **ExcludeNodes** option for more information on how to specify nodes. + + + + Note that if you list too few nodes here, or if you exclude too many exit + nodes with ExcludeExitNodes, you can degrade functionality. For example, + if none of the exits you list allows traffic on port 80 or 443, you won't + be able to browse the web. + + + + Note also that not every circuit is used to deliver traffic *outside* of + the Tor network. It is normal to see non-exit circuits (such as those + used to connect to hidden services, those that do directory fetches, + those used for relay reachability self-tests, and so on) that end + at a non-exit node. To + keep a node from being used entirely, see ExcludeNodes and StrictNodes. + + + + The ExcludeNodes option overrides this option: any node listed in both + ExitNodes and ExcludeNodes is treated as excluded. + + + + The .exit address notation, if enabled via MapAddress, overrides + this option. + +[[EntryNodes]] **EntryNodes** __node__,__node__,__...__:: + A list of identity fingerprints and country codes of nodes + to use for the first hop in your normal circuits. + Normal circuits include all + circuits except for direct connections to directory servers. The Bridge + option overrides this option; if you have configured bridges and + UseBridges is 1, the Bridges are used as your entry nodes. + + + + The ExcludeNodes option overrides this option: any node listed in both + EntryNodes and ExcludeNodes is treated as excluded. See + the **ExcludeNodes** option for more information on how to specify nodes. + +[[StrictNodes]] **StrictNodes** **0**|**1**:: + If StrictNodes is set to 1, Tor will treat solely the ExcludeNodes option + as a requirement to follow for all the circuits you generate, even if + doing so will break functionality for you (StrictNodes applies to neither + ExcludeExitNodes nor to ExitNodes). If StrictNodes is set to 0, Tor will + still try to avoid nodes in the ExcludeNodes list, but it will err on the + side of avoiding unexpected errors. Specifically, StrictNodes 0 tells Tor + that it is okay to use an excluded node when it is *necessary* to perform + relay reachability self-tests, connect to a hidden service, provide a + hidden service to a client, fulfill a .exit request, upload directory + information, or download directory information. (Default: 0) + +[[FascistFirewall]] **FascistFirewall** **0**|**1**:: + If 1, Tor will only create outgoing connections to ORs running on ports + that your firewall allows (defaults to 80 and 443; see **FirewallPorts**). + This will allow you to run Tor as a client behind a firewall with + restrictive policies, but will not allow you to run as a server behind such + a firewall. If you prefer more fine-grained control, use + ReachableAddresses instead. + +[[FirewallPorts]] **FirewallPorts** __PORTS__:: + A list of ports that your firewall allows you to connect to. Only used when + **FascistFirewall** is set. This option is deprecated; use ReachableAddresses + instead. (Default: 80, 443) + +[[ReachableAddresses]] **ReachableAddresses** __IP__[/__MASK__][:__PORT__]...:: + A comma-separated list of IP addresses and ports that your firewall allows + you to connect to. The format is as for the addresses in ExitPolicy, except + that "accept" is understood unless "reject" is explicitly provided. For + example, \'ReachableAddresses 99.0.0.0/8, reject 18.0.0.0/8:80, accept + \*:80' means that your firewall allows connections to everything inside net + 99, rejects port 80 connections to net 18, and accepts connections to port + 80 otherwise. (Default: \'accept \*:*'.) + +[[ReachableDirAddresses]] **ReachableDirAddresses** __IP__[/__MASK__][:__PORT__]...:: + Like **ReachableAddresses**, a list of addresses and ports. Tor will obey + these restrictions when fetching directory information, using standard HTTP + GET requests. If not set explicitly then the value of + **ReachableAddresses** is used. If **HTTPProxy** is set then these + connections will go through that proxy. (DEPRECATED: This option has + had no effect for some time.) + +[[ReachableORAddresses]] **ReachableORAddresses** __IP__[/__MASK__][:__PORT__]...:: + Like **ReachableAddresses**, a list of addresses and ports. Tor will obey + these restrictions when connecting to Onion Routers, using TLS/SSL. If not + set explicitly then the value of **ReachableAddresses** is used. If + **HTTPSProxy** is set then these connections will go through that proxy. + + + + The separation between **ReachableORAddresses** and + **ReachableDirAddresses** is only interesting when you are connecting + through proxies (see **HTTPProxy** and **HTTPSProxy**). Most proxies limit + TLS connections (which Tor uses to connect to Onion Routers) to port 443, + and some limit HTTP GET requests (which Tor uses for fetching directory + information) to port 80. + +[[HidServAuth]] **HidServAuth** __onion-address__ __auth-cookie__ [__service-name__]:: + Client authorization for a hidden service. Valid onion addresses contain 16 + characters in a-z2-7 plus ".onion", and valid auth cookies contain 22 + characters in A-Za-z0-9+/. The service name is only used for internal + purposes, e.g., for Tor controllers. This option may be used multiple times + for different hidden services. If a hidden service uses authorization and + this option is not set, the hidden service is not accessible. Hidden + services can be configured to require authorization using the + **HiddenServiceAuthorizeClient** option. + +[[LongLivedPorts]] **LongLivedPorts** __PORTS__:: + A list of ports for services that tend to have long-running connections + (e.g. chat and interactive shells). Circuits for streams that use these + ports will contain only high-uptime nodes, to reduce the chance that a node + will go down before the stream is finished. Note that the list is also + honored for circuits (both client and service side) involving hidden + services whose virtual port is in this list. (Default: 21, 22, 706, + 1863, 5050, 5190, 5222, 5223, 6523, 6667, 6697, 8300) + +[[MapAddress]] **MapAddress** __address__ __newaddress__:: + When a request for address arrives to Tor, it will transform to newaddress + before processing it. For example, if you always want connections to + www.example.com to exit via __torserver__ (where __torserver__ is the + fingerprint of the server), use "MapAddress www.example.com + www.example.com.torserver.exit". If the value is prefixed with a + "\*.", matches an entire domain. For example, if you + always want connections to example.com and any if its subdomains + to exit via + __torserver__ (where __torserver__ is the fingerprint of the server), use + "MapAddress \*.example.com \*.example.com.torserver.exit". (Note the + leading "*." in each part of the directive.) You can also redirect all + subdomains of a domain to a single address. For example, "MapAddress + *.example.com www.example.com". + + + + NOTES: + + 1. When evaluating MapAddress expressions Tor stops when it hits the most + recently added expression that matches the requested address. So if you + have the following in your torrc, www.torproject.org will map to 1.1.1.1: + + MapAddress www.torproject.org 2.2.2.2 + MapAddress www.torproject.org 1.1.1.1 + + 2. Tor evaluates the MapAddress configuration until it finds no matches. So + if you have the following in your torrc, www.torproject.org will map to + 2.2.2.2: + + MapAddress 1.1.1.1 2.2.2.2 + MapAddress www.torproject.org 1.1.1.1 + + 3. The following MapAddress expression is invalid (and will be + ignored) because you cannot map from a specific address to a wildcard + address: + + MapAddress www.torproject.org *.torproject.org.torserver.exit + + 4. Using a wildcard to match only part of a string (as in *ample.com) is + also invalid. + +[[NewCircuitPeriod]] **NewCircuitPeriod** __NUM__:: + Every NUM seconds consider whether to build a new circuit. (Default: 30 + seconds) + +[[MaxCircuitDirtiness]] **MaxCircuitDirtiness** __NUM__:: + Feel free to reuse a circuit that was first used at most NUM seconds ago, + but never attach a new stream to a circuit that is too old. For hidden + services, this applies to the __last__ time a circuit was used, not the + first. Circuits with streams constructed with SOCKS authentication via + SocksPorts that have **KeepAliveIsolateSOCKSAuth** also remain alive + for MaxCircuitDirtiness seconds after carrying the last such stream. + (Default: 10 minutes) + +[[MaxClientCircuitsPending]] **MaxClientCircuitsPending** __NUM__:: + Do not allow more than NUM circuits to be pending at a time for handling + client streams. A circuit is pending if we have begun constructing it, + but it has not yet been completely constructed. (Default: 32) + +[[NodeFamily]] **NodeFamily** __node__,__node__,__...__:: + The Tor servers, defined by their identity fingerprints, + constitute a "family" of similar or co-administered servers, so never use + any two of them in the same circuit. Defining a NodeFamily is only needed + when a server doesn't list the family itself (with MyFamily). This option + can be used multiple times; each instance defines a separate family. In + addition to nodes, you can also list IP address and ranges and country + codes in {curly braces}. See the **ExcludeNodes** option for more + information on how to specify nodes. + +[[EnforceDistinctSubnets]] **EnforceDistinctSubnets** **0**|**1**:: + If 1, Tor will not put two servers whose IP addresses are "too close" on + the same circuit. Currently, two addresses are "too close" if they lie in + the same /16 range. (Default: 1) + +[[SocksPort]] **SocksPort** \['address':]__port__|**unix:**__path__|**auto** [_flags_] [_isolation flags_]:: + Open this port to listen for connections from SOCKS-speaking + applications. Set this to 0 if you don't want to allow application + connections via SOCKS. Set it to "auto" to have Tor pick a port for + you. This directive can be specified multiple times to bind + to multiple addresses/ports. If a unix domain socket is used, you may + quote the path using standard C escape sequences. + (Default: 9050) + + + + NOTE: Although this option allows you to specify an IP address + other than localhost, you should do so only with extreme caution. + The SOCKS protocol is unencrypted and (as we use it) + unauthenticated, so exposing it in this way could leak your + information to anybody watching your network, and allow anybody + to use your computer as an open proxy. + + + + The _isolation flags_ arguments give Tor rules for which streams + received on this SocksPort are allowed to share circuits with one + another. Recognized isolation flags are: + **IsolateClientAddr**;; + Don't share circuits with streams from a different + client address. (On by default and strongly recommended when + supported; you can disable it with **NoIsolateClientAddr**. + Unsupported and force-disabled when using Unix domain sockets.) + **IsolateSOCKSAuth**;; + Don't share circuits with streams for which different + SOCKS authentication was provided. (For HTTPTunnelPort + connections, this option looks at the Proxy-Authorization and + X-Tor-Stream-Isolation headers. On by default; + you can disable it with **NoIsolateSOCKSAuth**.) + **IsolateClientProtocol**;; + Don't share circuits with streams using a different protocol. + (SOCKS 4, SOCKS 5, TransPort connections, NATDPort connections, + and DNSPort requests are all considered to be different protocols.) + **IsolateDestPort**;; + Don't share circuits with streams targeting a different + destination port. + **IsolateDestAddr**;; + Don't share circuits with streams targeting a different + destination address. + **KeepAliveIsolateSOCKSAuth**;; + If **IsolateSOCKSAuth** is enabled, keep alive circuits while they have + at least one stream with SOCKS authentication active. After such a circuit + is idle for more than MaxCircuitDirtiness seconds, it can be closed. + **SessionGroup=**__INT__;; + If no other isolation rules would prevent it, allow streams + on this port to share circuits with streams from every other + port with the same session group. (By default, streams received + on different SocksPorts, TransPorts, etc are always isolated from one + another. This option overrides that behavior.) + +[[OtherSocksPortFlags]]:: + Other recognized __flags__ for a SocksPort are: + **NoIPv4Traffic**;; + Tell exits to not connect to IPv4 addresses in response to SOCKS + requests on this connection. + **IPv6Traffic**;; + Tell exits to allow IPv6 addresses in response to SOCKS requests on + this connection, so long as SOCKS5 is in use. (SOCKS4 can't handle + IPv6.) + **PreferIPv6**;; + Tells exits that, if a host has both an IPv4 and an IPv6 address, + we would prefer to connect to it via IPv6. (IPv4 is the default.) + **NoDNSRequest**;; + Do not ask exits to resolve DNS addresses in SOCKS5 requests. Tor will + connect to IPv4 addresses, IPv6 addresses (if IPv6Traffic is set) and + .onion addresses. + **NoOnionTraffic**;; + Do not connect to .onion addresses in SOCKS5 requests. + **OnionTrafficOnly**;; + Tell the tor client to only connect to .onion addresses in response to + SOCKS5 requests on this connection. This is equivalent to NoDNSRequest, + NoIPv4Traffic, NoIPv6Traffic. The corresponding NoOnionTrafficOnly + flag is not supported. + **CacheIPv4DNS**;; + Tells the client to remember IPv4 DNS answers we receive from exit + nodes via this connection. (On by default.) + **CacheIPv6DNS**;; + Tells the client to remember IPv6 DNS answers we receive from exit + nodes via this connection. + **GroupWritable**;; + Unix domain sockets only: makes the socket get created as + group-writable. + **WorldWritable**;; + Unix domain sockets only: makes the socket get created as + world-writable. + **CacheDNS**;; + Tells the client to remember all DNS answers we receive from exit + nodes via this connection. + **UseIPv4Cache**;; + Tells the client to use any cached IPv4 DNS answers we have when making + requests via this connection. (NOTE: This option, or UseIPv6Cache + or UseDNSCache, can harm your anonymity, and probably + won't help performance as much as you might expect. Use with care!) + **UseIPv6Cache**;; + Tells the client to use any cached IPv6 DNS answers we have when making + requests via this connection. + **UseDNSCache**;; + Tells the client to use any cached DNS answers we have when making + requests via this connection. + **PreferIPv6Automap**;; + When serving a hostname lookup request on this port that + should get automapped (according to AutomapHostsOnResolve), + if we could return either an IPv4 or an IPv6 answer, prefer + an IPv6 answer. (On by default.) + **PreferSOCKSNoAuth**;; + Ordinarily, when an application offers both "username/password + authentication" and "no authentication" to Tor via SOCKS5, Tor + selects username/password authentication so that IsolateSOCKSAuth can + work. This can confuse some applications, if they offer a + username/password combination then get confused when asked for + one. You can disable this behavior, so that Tor will select "No + authentication" when IsolateSOCKSAuth is disabled, or when this + option is set. + +[[SocksPortFlagsMisc]]:: + Flags are processed left to right. If flags conflict, the last flag on the + line is used, and all earlier flags are ignored. No error is issued for + conflicting flags. + +[[SocksPolicy]] **SocksPolicy** __policy__,__policy__,__...__:: + Set an entrance policy for this server, to limit who can connect to the + SocksPort and DNSPort ports. The policies have the same form as exit + policies below, except that port specifiers are ignored. Any address + not matched by some entry in the policy is accepted. + +[[SocksTimeout]] **SocksTimeout** __NUM__:: + Let a socks connection wait NUM seconds handshaking, and NUM seconds + unattached waiting for an appropriate circuit, before we fail it. (Default: + 2 minutes) + +[[TokenBucketRefillInterval]] **TokenBucketRefillInterval** __NUM__ [**msec**|**second**]:: + Set the refill interval of Tor's token bucket to NUM milliseconds. + NUM must be between 1 and 1000, inclusive. Note that the configured + bandwidth limits are still expressed in bytes per second: this + option only affects the frequency with which Tor checks to see whether + previously exhausted connections may read again. + Can not be changed while tor is running. (Default: 100 msec) + +[[TrackHostExits]] **TrackHostExits** __host__,__.domain__,__...__:: + For each value in the comma separated list, Tor will track recent + connections to hosts that match this value and attempt to reuse the same + exit node for each. If the value is prepended with a \'.\', it is treated as + matching an entire domain. If one of the values is just a \'.', it means + match everything. This option is useful if you frequently connect to sites + that will expire all your authentication cookies (i.e. log you out) if + your IP address changes. Note that this option does have the disadvantage + of making it more clear that a given history is associated with a single + user. However, most people who would wish to observe this will observe it + through cookies or other protocol-specific means anyhow. + +[[TrackHostExitsExpire]] **TrackHostExitsExpire** __NUM__:: + Since exit servers go up and down, it is desirable to expire the + association between host and exit server after NUM seconds. The default is + 1800 seconds (30 minutes). + +[[UpdateBridgesFromAuthority]] **UpdateBridgesFromAuthority** **0**|**1**:: + When set (along with UseBridges), Tor will try to fetch bridge descriptors + from the configured bridge authorities when feasible. It will fall back to + a direct request if the authority responds with a 404. (Default: 0) + +[[UseBridges]] **UseBridges** **0**|**1**:: + When set, Tor will fetch descriptors for each bridge listed in the "Bridge" + config lines, and use these relays as both entry guards and directory + guards. (Default: 0) + +[[UseEntryGuards]] **UseEntryGuards** **0**|**1**:: + If this option is set to 1, we pick a few long-term entry servers, and try + to stick with them. This is desirable because constantly changing servers + increases the odds that an adversary who owns some servers will observe a + fraction of your paths. Entry Guards can not be used by Directory + Authorities, Single Onion Services, and Tor2web clients. In these cases, + the this option is ignored. (Default: 1) + +[[GuardfractionFile]] **GuardfractionFile** __FILENAME__:: + V3 authoritative directories only. Configures the location of the + guardfraction file which contains information about how long relays + have been guards. (Default: unset) + +[[UseGuardFraction]] **UseGuardFraction** **0**|**1**|**auto**:: + This torrc option specifies whether clients should use the + guardfraction information found in the consensus during path + selection. If it's set to 'auto', clients will do what the + UseGuardFraction consensus parameter tells them to do. (Default: auto) + +[[NumEntryGuards]] **NumEntryGuards** __NUM__:: + If UseEntryGuards is set to 1, we will try to pick a total of NUM routers + as long-term entries for our circuits. If NUM is 0, we try to learn the + number from the guard-n-primary-guards-to-use consensus parameter, and + default to 1 if the consensus parameter isn't set. (Default: 0) + +[[NumDirectoryGuards]] **NumDirectoryGuards** __NUM__:: + If UseEntryGuards is set to 1, we try to make sure we have at least NUM + routers to use as directory guards. If this option is set to 0, use the + value from the guard-n-primary-dir-guards-to-use consensus parameter, and + default to 3 if the consensus parameter isn't set. (Default: 0) + +[[GuardLifetime]] **GuardLifetime** __N__ **days**|**weeks**|**months**:: + If nonzero, and UseEntryGuards is set, minimum time to keep a guard before + picking a new one. If zero, we use the GuardLifetime parameter from the + consensus directory. No value here may be less than 1 month or greater + than 5 years; out-of-range values are clamped. (Default: 0) + +[[SafeSocks]] **SafeSocks** **0**|**1**:: + When this option is enabled, Tor will reject application connections that + use unsafe variants of the socks protocol -- ones that only provide an IP + address, meaning the application is doing a DNS resolve first. + Specifically, these are socks4 and socks5 when not doing remote DNS. + (Default: 0) + +[[TestSocks]] **TestSocks** **0**|**1**:: + When this option is enabled, Tor will make a notice-level log entry for + each connection to the Socks port indicating whether the request used a + safe socks protocol or an unsafe one (see above entry on SafeSocks). This + helps to determine whether an application using Tor is possibly leaking + DNS requests. (Default: 0) + +[[VirtualAddrNetworkIPv4]] **VirtualAddrNetworkIPv4** __IPv4Address__/__bits__ + + +[[VirtualAddrNetworkIPv6]] **VirtualAddrNetworkIPv6** [__IPv6Address__]/__bits__:: + When Tor needs to assign a virtual (unused) address because of a MAPADDRESS + command from the controller or the AutomapHostsOnResolve feature, Tor + picks an unassigned address from this range. (Defaults: + 127.192.0.0/10 and [FE80::]/10 respectively.) + + + + When providing proxy server service to a network of computers using a tool + like dns-proxy-tor, change the IPv4 network to "10.192.0.0/10" or + "172.16.0.0/12" and change the IPv6 network to "[FC00::]/7". + The default **VirtualAddrNetwork** address ranges on a + properly configured machine will route to the loopback or link-local + interface. The maximum number of bits for the network prefix is set to 104 + for IPv6 and 16 for IPv4. However, a wider network - smaller prefix length + - is preferable since it reduces the chances for an attacker to guess the + used IP. For local use, no change to the default VirtualAddrNetwork setting + is needed. + +[[AllowNonRFC953Hostnames]] **AllowNonRFC953Hostnames** **0**|**1**:: + When this option is disabled, Tor blocks hostnames containing illegal + characters (like @ and :) rather than sending them to an exit node to be + resolved. This helps trap accidental attempts to resolve URLs and so on. + (Default: 0) + +[[HTTPTunnelPort]] **HTTPTunnelPort** \['address':]__port__|**auto** [_isolation flags_]:: + Open this port to listen for proxy connections using the "HTTP CONNECT" + protocol instead of SOCKS. Set this to 0 + 0 if you don't want to allow "HTTP CONNECT" connections. Set the port + to "auto" to have Tor pick a port for you. This directive can be + specified multiple times to bind to multiple addresses/ports. See + SOCKSPort for an explanation of isolation flags. (Default: 0) + +[[TransPort]] **TransPort** \['address':]__port__|**auto** [_isolation flags_]:: + Open this port to listen for transparent proxy connections. Set this to + 0 if you don't want to allow transparent proxy connections. Set the port + to "auto" to have Tor pick a port for you. This directive can be + specified multiple times to bind to multiple addresses/ports. See + SOCKSPort for an explanation of isolation flags. + + + + TransPort requires OS support for transparent proxies, such as BSDs' pf or + Linux's IPTables. If you're planning to use Tor as a transparent proxy for + a network, you'll want to examine and change VirtualAddrNetwork from the + default setting. (Default: 0) + +[[TransProxyType]] **TransProxyType** **default**|**TPROXY**|**ipfw**|**pf-divert**:: + TransProxyType may only be enabled when there is transparent proxy listener + enabled. + + + + Set this to "TPROXY" if you wish to be able to use the TPROXY Linux module + to transparently proxy connections that are configured using the TransPort + option. Detailed information on how to configure the TPROXY + feature can be found in the Linux kernel source tree in the file + Documentation/networking/tproxy.txt. + + + + Set this option to "ipfw" to use the FreeBSD ipfw interface. + + + + On *BSD operating systems when using pf, set this to "pf-divert" to take + advantage of +divert-to+ rules, which do not modify the packets like + +rdr-to+ rules do. Detailed information on how to configure pf to use + +divert-to+ rules can be found in the pf.conf(5) manual page. On OpenBSD, + +divert-to+ is available to use on versions greater than or equal to + OpenBSD 4.4. + + + + Set this to "default", or leave it unconfigured, to use regular IPTables + on Linux, or to use pf +rdr-to+ rules on *BSD systems. + + + + (Default: "default".) + +[[NATDPort]] **NATDPort** \['address':]__port__|**auto** [_isolation flags_]:: + Open this port to listen for connections from old versions of ipfw (as + included in old versions of FreeBSD, etc) using the NATD protocol. + Use 0 if you don't want to allow NATD connections. Set the port + to "auto" to have Tor pick a port for you. This directive can be + specified multiple times to bind to multiple addresses/ports. See + SocksPort for an explanation of isolation flags. + + + + This option is only for people who cannot use TransPort. (Default: 0) + +[[AutomapHostsOnResolve]] **AutomapHostsOnResolve** **0**|**1**:: + When this option is enabled, and we get a request to resolve an address + that ends with one of the suffixes in **AutomapHostsSuffixes**, we map an + unused virtual address to that address, and return the new virtual address. + This is handy for making ".onion" addresses work with applications that + resolve an address and then connect to it. (Default: 0) + +[[AutomapHostsSuffixes]] **AutomapHostsSuffixes** __SUFFIX__,__SUFFIX__,__...__:: + A comma-separated list of suffixes to use with **AutomapHostsOnResolve**. + The "." suffix is equivalent to "all addresses." (Default: .exit,.onion). + +[[DNSPort]] **DNSPort** \['address':]__port__|**auto** [_isolation flags_]:: + If non-zero, open this port to listen for UDP DNS requests, and resolve + them anonymously. This port only handles A, AAAA, and PTR requests---it + doesn't handle arbitrary DNS request types. Set the port to "auto" to + have Tor pick a port for + you. This directive can be specified multiple times to bind to multiple + addresses/ports. See SocksPort for an explanation of isolation + flags. (Default: 0) + +[[ClientDNSRejectInternalAddresses]] **ClientDNSRejectInternalAddresses** **0**|**1**:: + If true, Tor does not believe any anonymously retrieved DNS answer that + tells it that an address resolves to an internal address (like 127.0.0.1 or + 192.168.0.1). This option prevents certain browser-based attacks; it + is not allowed to be set on the default network. (Default: 1) + +[[ClientRejectInternalAddresses]] **ClientRejectInternalAddresses** **0**|**1**:: + If true, Tor does not try to fulfill requests to connect to an internal + address (like 127.0.0.1 or 192.168.0.1) __unless an exit node is + specifically requested__ (for example, via a .exit hostname, or a + controller request). If true, multicast DNS hostnames for machines on the + local network (of the form *.local) are also rejected. (Default: 1) + +[[DownloadExtraInfo]] **DownloadExtraInfo** **0**|**1**:: + If true, Tor downloads and caches "extra-info" documents. These documents + contain information about servers other than the information in their + regular server descriptors. Tor does not use this information for anything + itself; to save bandwidth, leave this option turned off. (Default: 0) + +[[WarnPlaintextPorts]] **WarnPlaintextPorts** __port__,__port__,__...__:: + Tells Tor to issue a warnings whenever the user tries to make an anonymous + connection to one of these ports. This option is designed to alert users + to services that risk sending passwords in the clear. (Default: + 23,109,110,143) + +[[RejectPlaintextPorts]] **RejectPlaintextPorts** __port__,__port__,__...__:: + Like WarnPlaintextPorts, but instead of warning about risky port uses, Tor + will instead refuse to make the connection. (Default: None) + +[[OptimisticData]] **OptimisticData** **0**|**1**|**auto**:: + When this option is set, and Tor is using an exit node that supports + the feature, it will try optimistically to send data to the exit node + without waiting for the exit node to report whether the connection + succeeded. This can save a round-trip time for protocols like HTTP + where the client talks first. If OptimisticData is set to **auto**, + Tor will look at the UseOptimisticData parameter in the networkstatus. + (Default: auto) + +[[Tor2webMode]] **Tor2webMode** **0**|**1**:: + When this option is set, Tor connects to hidden services + **non-anonymously**. This option also disables client connections to + non-hidden-service hostnames through Tor. It **must only** be used when + running a tor2web Hidden Service web proxy. + To enable this option the compile time flag --enable-tor2web-mode must be + specified. Since Tor2webMode is non-anonymous, you can not run an + anonymous Hidden Service on a tor version compiled with Tor2webMode. + (Default: 0) + +[[Tor2webRendezvousPoints]] **Tor2webRendezvousPoints** __node__,__node__,__...__:: + A list of identity fingerprints, nicknames, country codes and + address patterns of nodes that are allowed to be used as RPs + in HS circuits; any other nodes will not be used as RPs. + (Example: + Tor2webRendezvousPoints Fastyfasty, ABCD1234CDEF5678ABCD1234CDEF5678ABCD1234, \{cc}, 255.254.0.0/8) + + + + This feature can only be used if Tor2webMode is also enabled. + + + + ExcludeNodes have higher priority than Tor2webRendezvousPoints, + which means that nodes specified in ExcludeNodes will not be + picked as RPs. + + + + If no nodes in Tor2webRendezvousPoints are currently available for + use, Tor will choose a random node when building HS circuits. + +[[UseMicrodescriptors]] **UseMicrodescriptors** **0**|**1**|**auto**:: + Microdescriptors are a smaller version of the information that Tor needs + in order to build its circuits. Using microdescriptors makes Tor clients + download less directory information, thus saving bandwidth. Directory + caches need to fetch regular descriptors and microdescriptors, so this + option doesn't save any bandwidth for them. If this option is set to + "auto" (recommended) then it is on for all clients that do not set + FetchUselessDescriptors. (Default: auto) + +[[PathBiasCircThreshold]] **PathBiasCircThreshold** __NUM__ + + +[[PathBiasNoticeRate]] **PathBiasNoticeRate** __NUM__ + + +[[PathBiasWarnRate]] **PathBiasWarnRate** __NUM__ + + +[[PathBiasExtremeRate]] **PathBiasExtremeRate** __NUM__ + + +[[PathBiasDropGuards]] **PathBiasDropGuards** __NUM__ + + +[[PathBiasScaleThreshold]] **PathBiasScaleThreshold** __NUM__:: + These options override the default behavior of Tor's (**currently + experimental**) path bias detection algorithm. To try to find broken or + misbehaving guard nodes, Tor looks for nodes where more than a certain + fraction of circuits through that guard fail to get built. + + + + The PathBiasCircThreshold option controls how many circuits we need to build + through a guard before we make these checks. The PathBiasNoticeRate, + PathBiasWarnRate and PathBiasExtremeRate options control what fraction of + circuits must succeed through a guard so we won't write log messages. + If less than PathBiasExtremeRate circuits succeed *and* PathBiasDropGuards + is set to 1, we disable use of that guard. + + + + When we have seen more than PathBiasScaleThreshold + circuits through a guard, we scale our observations by 0.5 (governed by + the consensus) so that new observations don't get swamped by old ones. + + + + By default, or if a negative value is provided for one of these options, + Tor uses reasonable defaults from the networkstatus consensus document. + If no defaults are available there, these options default to 150, .70, + .50, .30, 0, and 300 respectively. + +[[PathBiasUseThreshold]] **PathBiasUseThreshold** __NUM__ + + +[[PathBiasNoticeUseRate]] **PathBiasNoticeUseRate** __NUM__ + + +[[PathBiasExtremeUseRate]] **PathBiasExtremeUseRate** __NUM__ + + +[[PathBiasScaleUseThreshold]] **PathBiasScaleUseThreshold** __NUM__:: + Similar to the above options, these options override the default behavior + of Tor's (**currently experimental**) path use bias detection algorithm. + + + + Where as the path bias parameters govern thresholds for successfully + building circuits, these four path use bias parameters govern thresholds + only for circuit usage. Circuits which receive no stream usage + are not counted by this detection algorithm. A used circuit is considered + successful if it is capable of carrying streams or otherwise receiving + well-formed responses to RELAY cells. + + + + By default, or if a negative value is provided for one of these options, + Tor uses reasonable defaults from the networkstatus consensus document. + If no defaults are available there, these options default to 20, .80, + .60, and 100, respectively. + +[[ClientUseIPv4]] **ClientUseIPv4** **0**|**1**:: + If this option is set to 0, Tor will avoid connecting to directory servers + and entry nodes over IPv4. Note that clients with an IPv4 + address in a **Bridge**, proxy, or pluggable transport line will try + connecting over IPv4 even if **ClientUseIPv4** is set to 0. (Default: 1) + +[[ClientUseIPv6]] **ClientUseIPv6** **0**|**1**:: + If this option is set to 1, Tor might connect to directory servers or + entry nodes over IPv6. Note that clients configured with an IPv6 address + in a **Bridge**, proxy, or pluggable transport line will try connecting + over IPv6 even if **ClientUseIPv6** is set to 0. (Default: 0) + +[[ClientPreferIPv6DirPort]] **ClientPreferIPv6DirPort** **0**|**1**|**auto**:: + If this option is set to 1, Tor prefers a directory port with an IPv6 + address over one with IPv4, for direct connections, if a given directory + server has both. (Tor also prefers an IPv6 DirPort if IPv4Client is set to + 0.) If this option is set to auto, clients prefer IPv4. Other things may + influence the choice. This option breaks a tie to the favor of IPv6. + (Default: auto) (DEPRECATED: This option has had no effect for some + time.) + +[[ClientPreferIPv6ORPort]] **ClientPreferIPv6ORPort** **0**|**1**|**auto**:: + If this option is set to 1, Tor prefers an OR port with an IPv6 + address over one with IPv4 if a given entry node has both. (Tor also + prefers an IPv6 ORPort if IPv4Client is set to 0.) If this option is set + to auto, Tor bridge clients prefer the configured bridge address, and + other clients prefer IPv4. Other things may influence the choice. This + option breaks a tie to the favor of IPv6. (Default: auto) + +[[PathsNeededToBuildCircuits]] **PathsNeededToBuildCircuits** __NUM__:: + Tor clients don't build circuits for user traffic until they know + about enough of the network so that they could potentially construct + enough of the possible paths through the network. If this option + is set to a fraction between 0.25 and 0.95, Tor won't build circuits + until it has enough descriptors or microdescriptors to construct + that fraction of possible paths. Note that setting this option too low + can make your Tor client less anonymous, and setting it too high can + prevent your Tor client from bootstrapping. If this option is negative, + Tor will use a default value chosen by the directory authorities. If the + directory authorities do not choose a value, Tor will default to 0.6. + (Default: -1.) + +[[ClientBootstrapConsensusAuthorityDownloadSchedule]] **ClientBootstrapConsensusAuthorityDownloadSchedule** __N__,__N__,__...__:: + Schedule for when clients should download consensuses from authorities + if they are bootstrapping (that is, they don't have a usable, reasonably + live consensus). Only used by clients fetching from a list of fallback + directory mirrors. This schedule is advanced by (potentially concurrent) + connection attempts, unlike other schedules, which are advanced by + connection failures. (Default: 6, 11, 3600, 10800, 25200, 54000, 111600, + 262800) + +[[ClientBootstrapConsensusFallbackDownloadSchedule]] **ClientBootstrapConsensusFallbackDownloadSchedule** __N__,__N__,__...__:: + Schedule for when clients should download consensuses from fallback + directory mirrors if they are bootstrapping (that is, they don't have a + usable, reasonably live consensus). Only used by clients fetching from a + list of fallback directory mirrors. This schedule is advanced by + (potentially concurrent) connection attempts, unlike other schedules, + which are advanced by connection failures. (Default: 0, 1, 4, 11, 3600, + 10800, 25200, 54000, 111600, 262800) + +[[ClientBootstrapConsensusAuthorityOnlyDownloadSchedule]] **ClientBootstrapConsensusAuthorityOnlyDownloadSchedule** __N__,__N__,__...__:: + Schedule for when clients should download consensuses from authorities + if they are bootstrapping (that is, they don't have a usable, reasonably + live consensus). Only used by clients which don't have or won't fetch + from a list of fallback directory mirrors. This schedule is advanced by + (potentially concurrent) connection attempts, unlike other schedules, + which are advanced by connection failures. (Default: 0, 3, 7, 3600, + 10800, 25200, 54000, 111600, 262800) + +[[ClientBootstrapConsensusMaxDownloadTries]] **ClientBootstrapConsensusMaxDownloadTries** __NUM__:: + Try this many times to download a consensus while bootstrapping using + fallback directory mirrors before giving up. (Default: 7) + +[[ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries]] **ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries** __NUM__:: + Try this many times to download a consensus while bootstrapping using + authorities before giving up. (Default: 4) + +[[ClientBootstrapConsensusMaxInProgressTries]] **ClientBootstrapConsensusMaxInProgressTries** __NUM__:: + Try this many simultaneous connections to download a consensus before + waiting for one to complete, timeout, or error out. (Default: 3) + +SERVER OPTIONS +-------------- + +The following options are useful only for servers (that is, if ORPort +is non-zero): + +[[Address]] **Address** __address__:: + The IPv4 address of this server, or a fully qualified domain name of + this server that resolves to an IPv4 address. You can leave this + unset, and Tor will try to guess your IPv4 address. This IPv4 + address is the one used to tell clients and other servers where to + find your Tor server; it doesn't affect the address that your server + binds to. To bind to a different address, use the ORPort and + OutboundBindAddress options. + +[[AssumeReachable]] **AssumeReachable** **0**|**1**:: + This option is used when bootstrapping a new Tor network. If set to 1, + don't do self-reachability testing; just upload your server descriptor + immediately. If **AuthoritativeDirectory** is also set, this option + instructs the dirserver to bypass remote reachability testing too and list + all connected servers as running. + +[[BridgeRelay]] **BridgeRelay** **0**|**1**:: + Sets the relay to act as a "bridge" with respect to relaying connections + from bridge users to the Tor network. It mainly causes Tor to publish a + server descriptor to the bridge database, rather than + to the public directory authorities. + +[[BridgeDistribution]] **BridgeDistribution** __string__:: + If set along with BridgeRelay, Tor will include a new line in its + bridge descriptor which indicates to the BridgeDB service how it + would like its bridge address to be given out. Set it to "none" if + you want BridgeDB to avoid distributing your bridge address, or "any" to + let BridgeDB decide. (Default: any) + + + Note: as of Oct 2017, the BridgeDB part of this option is not yet + implemented. Until BridgeDB is updated to obey this option, your + bridge will make this request, but it will not (yet) be obeyed. + +[[ContactInfo]] **ContactInfo** __email_address__:: + Administrative contact information for this relay or bridge. This line + can be used to contact you if your relay or bridge is misconfigured or + something else goes wrong. Note that we archive and publish all + descriptors containing these lines and that Google indexes them, so + spammers might also collect them. You may want to obscure the fact + that it's an email address and/or generate a new address for this + purpose. + +[[ExitRelay]] **ExitRelay** **0**|**1**|**auto**:: + Tells Tor whether to run as an exit relay. If Tor is running as a + non-bridge server, and ExitRelay is set to 1, then Tor allows traffic to + exit according to the ExitPolicy option (or the default ExitPolicy if + none is specified). + + + + If ExitRelay is set to 0, no traffic is allowed to + exit, and the ExitPolicy option is ignored. + + + + If ExitRelay is set to "auto", then Tor behaves as if it were set to 1, but + warns the user if this would cause traffic to exit. In a future version, + the default value will be 0. (Default: auto) + +[[ExitPolicy]] **ExitPolicy** __policy__,__policy__,__...__:: + Set an exit policy for this server. Each policy is of the form + "**accept[6]**|**reject[6]** __ADDR__[/__MASK__][:__PORT__]". If /__MASK__ is + omitted then this policy just applies to the host given. Instead of giving + a host or network you can also use "\*" to denote the universe (0.0.0.0/0 + and ::/128), or \*4 to denote all IPv4 addresses, and \*6 to denote all + IPv6 addresses. + __PORT__ can be a single port number, an interval of ports + "__FROM_PORT__-__TO_PORT__", or "\*". If __PORT__ is omitted, that means + "\*". + + + + For example, "accept 18.7.22.69:\*,reject 18.0.0.0/8:\*,accept \*:\*" would + reject any IPv4 traffic destined for MIT except for web.mit.edu, and accept + any other IPv4 or IPv6 traffic. + + + + Tor also allows IPv6 exit policy entries. For instance, "reject6 [FC00::]/7:\*" + rejects all destinations that share 7 most significant bit prefix with + address FC00::. Respectively, "accept6 [C000::]/3:\*" accepts all destinations + that share 3 most significant bit prefix with address C000::. + + + + accept6 and reject6 only produce IPv6 exit policy entries. Using an IPv4 + address with accept6 or reject6 is ignored and generates a warning. + accept/reject allows either IPv4 or IPv6 addresses. Use \*4 as an IPv4 + wildcard address, and \*6 as an IPv6 wildcard address. accept/reject * + expands to matching IPv4 and IPv6 wildcard address rules. + + + + To specify all IPv4 and IPv6 internal and link-local networks (including + 0.0.0.0/8, 169.254.0.0/16, 127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, + 172.16.0.0/12, [::]/8, [FC00::]/7, [FE80::]/10, [FEC0::]/10, [FF00::]/8, + and [::]/127), you can use the "private" alias instead of an address. + ("private" always produces rules for IPv4 and IPv6 addresses, even when + used with accept6/reject6.) + + + + Private addresses are rejected by default (at the beginning of your exit + policy), along with any configured primary public IPv4 and IPv6 addresses. + These private addresses are rejected unless you set the + ExitPolicyRejectPrivate config option to 0. For example, once you've done + that, you could allow HTTP to 127.0.0.1 and block all other connections to + internal networks with "accept 127.0.0.1:80,reject private:\*", though that + may also allow connections to your own computer that are addressed to its + public (external) IP address. See RFC 1918 and RFC 3330 for more details + about internal and reserved IP address space. See + ExitPolicyRejectLocalInterfaces if you want to block every address on the + relay, even those that aren't advertised in the descriptor. + + + + This directive can be specified multiple times so you don't have to put it + all on one line. + + + + Policies are considered first to last, and the first match wins. If you + want to allow the same ports on IPv4 and IPv6, write your rules using + accept/reject \*. If you want to allow different ports on IPv4 and IPv6, + write your IPv6 rules using accept6/reject6 \*6, and your IPv4 rules using + accept/reject \*4. If you want to \_replace_ the default exit policy, end + your exit policy with either a reject \*:* or an accept \*:*. Otherwise, + you're \_augmenting_ (prepending to) the default exit policy. + + + + If you want to use a reduced exit policy rather than the default exit + policy, set "ReducedExitPolicy 1". If you want to _replace_ the default + exit policy with your custom exit policy, end your exit policy with either + a reject *:* or an accept *:*. Otherwise, you’re _augmenting_ (prepending + to) the default or reduced exit policy. + + + + The default exit policy is: + + reject *:25 + reject *:119 + reject *:135-139 + reject *:445 + reject *:563 + reject *:1214 + reject *:4661-4666 + reject *:6346-6429 + reject *:6699 + reject *:6881-6999 + accept *:* + +[[ExitPolicyDefault]] **ExitPolicyDefault**:: + Since the default exit policy uses accept/reject *, it applies to both + IPv4 and IPv6 addresses. + +[[ExitPolicyRejectPrivate]] **ExitPolicyRejectPrivate** **0**|**1**:: + Reject all private (local) networks, along with the relay's advertised + public IPv4 and IPv6 addresses, at the beginning of your exit policy. + See above entry on ExitPolicy. + (Default: 1) + +[[ExitPolicyRejectLocalInterfaces]] **ExitPolicyRejectLocalInterfaces** **0**|**1**:: + Reject all IPv4 and IPv6 addresses that the relay knows about, at the + beginning of your exit policy. This includes any OutboundBindAddress, the + bind addresses of any port options, such as ControlPort or DNSPort, and any + public IPv4 and IPv6 addresses on any interface on the relay. (If IPv6Exit + is not set, all IPv6 addresses will be rejected anyway.) + See above entry on ExitPolicy. + This option is off by default, because it lists all public relay IP + addresses in the ExitPolicy, even those relay operators might prefer not + to disclose. + (Default: 0) + +[[ReducedExitPolicy]] **ReducedExitPolicy** **0**|**1**:: + If set, use a reduced exit policy rather than the default one. + + + + The reduced exit policy is an alternative to the default exit policy. It + allows as many Internet services as possible while still blocking the + majority of TCP ports. Currently, the policy allows approximately 65 ports. + This reduces the odds that your node will be used for peer-to-peer + applications. + + + + The reduced exit policy is: + + accept *:20-21 + accept *:22 + accept *:23 + accept *:43 + accept *:53 + accept *:79 + accept *:80-81 + accept *:88 + accept *:110 + accept *:143 + accept *:194 + accept *:220 + accept *:389 + accept *:443 + accept *:464 + accept *:465 + accept *:531 + accept *:543-544 + accept *:554 + accept *:563 + accept *:587 + accept *:636 + accept *:706 + accept *:749 + accept *:873 + accept *:902-904 + accept *:981 + accept *:989-990 + accept *:991 + accept *:992 + accept *:993 + accept *:994 + accept *:995 + accept *:1194 + accept *:1220 + accept *:1293 + accept *:1500 + accept *:1533 + accept *:1677 + accept *:1723 + accept *:1755 + accept *:1863 + accept *:2082 + accept *:2083 + accept *:2086-2087 + accept *:2095-2096 + accept *:2102-2104 + accept *:3128 + accept *:3389 + accept *:3690 + accept *:4321 + accept *:4643 + accept *:5050 + accept *:5190 + accept *:5222-5223 + accept *:5228 + accept *:5900 + accept *:6660-6669 + accept *:6679 + accept *:6697 + accept *:8000 + accept *:8008 + accept *:8074 + accept *:8080 + accept *:8082 + accept *:8087-8088 + accept *:8232-8233 + accept *:8332-8333 + accept *:8443 + accept *:8888 + accept *:9418 + accept *:9999 + accept *:10000 + accept *:11371 + accept *:19294 + accept *:19638 + accept *:50002 + accept *:64738 + reject *:* + + (Default: 0) + +[[IPv6Exit]] **IPv6Exit** **0**|**1**:: + If set, and we are an exit node, allow clients to use us for IPv6 + traffic. (Default: 0) + +[[MaxOnionQueueDelay]] **MaxOnionQueueDelay** __NUM__ [**msec**|**second**]:: + If we have more onionskins queued for processing than we can process in + this amount of time, reject new ones. (Default: 1750 msec) + +[[MyFamily]] **MyFamily** __fingerprint__,__fingerprint__,...:: + Declare that this Tor relay is controlled or administered by a group or + organization identical or similar to that of the other relays, defined by + their (possibly $-prefixed) identity fingerprints. + This option can be repeated many times, for + convenience in defining large families: all fingerprints in all MyFamily + lines are merged into one list. + When two relays both declare that they are in the + same \'family', Tor clients will not use them in the same circuit. (Each + relay only needs to list the other servers in its family; it doesn't need to + list itself, but it won't hurt if it does.) Do not list any bridge relay as it would + compromise its concealment. + + + + When listing a node, it's better to list it by fingerprint than by + nickname: fingerprints are more reliable. + +[[Nickname]] **Nickname** __name__:: + Set the server's nickname to \'name'. Nicknames must be between 1 and 19 + characters inclusive, and must contain only the characters [a-zA-Z0-9]. + +[[NumCPUs]] **NumCPUs** __num__:: + How many processes to use at once for decrypting onionskins and other + parallelizable operations. If this is set to 0, Tor will try to detect + how many CPUs you have, defaulting to 1 if it can't tell. (Default: 0) + +[[ORPort]] **ORPort** \['address':]__PORT__|**auto** [_flags_]:: + Advertise this port to listen for connections from Tor clients and + servers. This option is required to be a Tor server. + Set it to "auto" to have Tor pick a port for you. Set it to 0 to not + run an ORPort at all. This option can occur more than once. (Default: 0) + + + + Tor recognizes these flags on each ORPort: + **NoAdvertise**;; + By default, we bind to a port and tell our users about it. If + NoAdvertise is specified, we don't advertise, but listen anyway. This + can be useful if the port everybody will be connecting to (for + example, one that's opened on our firewall) is somewhere else. + **NoListen**;; + By default, we bind to a port and tell our users about it. If + NoListen is specified, we don't bind, but advertise anyway. This + can be useful if something else (for example, a firewall's port + forwarding configuration) is causing connections to reach us. + **IPv4Only**;; + If the address is absent, or resolves to both an IPv4 and an IPv6 + address, only listen to the IPv4 address. + **IPv6Only**;; + If the address is absent, or resolves to both an IPv4 and an IPv6 + address, only listen to the IPv6 address. + +[[ORPortFlagsExclusive]]:: + For obvious reasons, NoAdvertise and NoListen are mutually exclusive, and + IPv4Only and IPv6Only are mutually exclusive. + +[[PortForwarding]] **PortForwarding** **0**|**1**:: + Attempt to automatically forward the DirPort and ORPort on a NAT router + connecting this Tor server to the Internet. If set, Tor will try both + NAT-PMP (common on Apple routers) and UPnP (common on routers from other + manufacturers). (Default: 0) + +[[PortForwardingHelper]] **PortForwardingHelper** __filename__|__pathname__:: + If PortForwarding is set, use this executable to configure the forwarding. + If set to a filename, the system path will be searched for the executable. + If set to a path, only the specified path will be executed. + (Default: tor-fw-helper) + +[[PublishServerDescriptor]] **PublishServerDescriptor** **0**|**1**|**v3**|**bridge**,**...**:: + This option specifies which descriptors Tor will publish when acting as + a relay. You can + choose multiple arguments, separated by commas. + + + + If this option is set to 0, Tor will not publish its + descriptors to any directories. (This is useful if you're testing + out your server, or if you're using a Tor controller that handles + directory publishing for you.) Otherwise, Tor will publish its + descriptors of all type(s) specified. The default is "1", which + means "if running as a relay or bridge, publish descriptors to the + appropriate authorities". Other possibilities are "v3", meaning + "publish as if you're a relay", and "bridge", meaning "publish as + if you're a bridge". + +[[ShutdownWaitLength]] **ShutdownWaitLength** __NUM__:: + When we get a SIGINT and we're a server, we begin shutting down: + we close listeners and start refusing new circuits. After **NUM** + seconds, we exit. If we get a second SIGINT, we exit immediately. + (Default: 30 seconds) + +[[SSLKeyLifetime]] **SSLKeyLifetime** __N__ **minutes**|**hours**|**days**|**weeks**:: + When creating a link certificate for our outermost SSL handshake, + set its lifetime to this amount of time. If set to 0, Tor will choose + some reasonable random defaults. (Default: 0) + +[[HeartbeatPeriod]] **HeartbeatPeriod** __N__ **minutes**|**hours**|**days**|**weeks**:: + Log a heartbeat message every **HeartbeatPeriod** seconds. This is + a log level __notice__ message, designed to let you know your Tor + server is still alive and doing useful things. Settings this + to 0 will disable the heartbeat. Otherwise, it must be at least 30 + minutes. (Default: 6 hours) + +[[MainloopStats]] **MainloopStats** **0**|**1**:: + Log main loop statistics every **HeartbeatPeriod** seconds. This is a log + level __notice__ message designed to help developers instrumenting Tor's + main event loop. (Default: 0) + +[[AccountingMax]] **AccountingMax** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + Limits the max number of bytes sent and received within a set time period + using a given calculation rule (see: AccountingStart, AccountingRule). + Useful if you need to stay under a specific bandwidth. By default, the + number used for calculation is the max of either the bytes sent or + received. For example, with AccountingMax set to 1 GByte, a server + could send 900 MBytes and receive 800 MBytes and continue running. + It will only hibernate once one of the two reaches 1 GByte. This can + be changed to use the sum of the both bytes received and sent by setting + the AccountingRule option to "sum" (total bandwidth in/out). When the + number of bytes remaining gets low, Tor will stop accepting new connections + and circuits. When the number of bytes is exhausted, Tor will hibernate + until some time in the next accounting period. To prevent all servers + from waking at the same time, Tor will also wait until a random point + in each period before waking up. If you have bandwidth cost issues, + enabling hibernation is preferable to setting a low bandwidth, since + it provides users with a collection of fast servers that are up some + of the time, which is more useful than a set of slow servers that are + always "available". + +[[AccountingRule]] **AccountingRule** **sum**|**max**|**in**|**out**:: + How we determine when our AccountingMax has been reached (when we + should hibernate) during a time interval. Set to "max" to calculate + using the higher of either the sent or received bytes (this is the + default functionality). Set to "sum" to calculate using the sent + plus received bytes. Set to "in" to calculate using only the + received bytes. Set to "out" to calculate using only the sent bytes. + (Default: max) + +[[AccountingStart]] **AccountingStart** **day**|**week**|**month** [__day__] __HH:MM__:: + Specify how long accounting periods last. If **month** is given, each + accounting period runs from the time __HH:MM__ on the __dayth__ day of one + month to the same day and time of the next. (The day must be between 1 and + 28.) If **week** is given, each accounting period runs from the time __HH:MM__ + of the __dayth__ day of one week to the same day and time of the next week, + with Monday as day 1 and Sunday as day 7. If **day** is given, each + accounting period runs from the time __HH:MM__ each day to the same time on + the next day. All times are local, and given in 24-hour time. (Default: + "month 1 0:00") + +[[RefuseUnknownExits]] **RefuseUnknownExits** **0**|**1**|**auto**:: + Prevent nodes that don't appear in the consensus from exiting using this + relay. If the option is 1, we always block exit attempts from such + nodes; if it's 0, we never do, and if the option is "auto", then we do + whatever the authorities suggest in the consensus (and block if the consensus + is quiet on the issue). (Default: auto) + +[[ServerDNSResolvConfFile]] **ServerDNSResolvConfFile** __filename__:: + Overrides the default DNS configuration with the configuration in + __filename__. The file format is the same as the standard Unix + "**resolv.conf**" file (7). This option, like all other ServerDNS options, + only affects name lookups that your server does on behalf of clients. + (Defaults to use the system DNS configuration.) + +[[ServerDNSAllowBrokenConfig]] **ServerDNSAllowBrokenConfig** **0**|**1**:: + If this option is false, Tor exits immediately if there are problems + parsing the system DNS configuration or connecting to nameservers. + Otherwise, Tor continues to periodically retry the system nameservers until + it eventually succeeds. (Default: 1) + +[[ServerDNSSearchDomains]] **ServerDNSSearchDomains** **0**|**1**:: + If set to 1, then we will search for addresses in the local search domain. + For example, if this system is configured to believe it is in + "example.com", and a client tries to connect to "www", the client will be + connected to "www.example.com". This option only affects name lookups that + your server does on behalf of clients. (Default: 0) + +[[ServerDNSDetectHijacking]] **ServerDNSDetectHijacking** **0**|**1**:: + When this option is set to 1, we will test periodically to determine + whether our local nameservers have been configured to hijack failing DNS + requests (usually to an advertising site). If they are, we will attempt to + correct this. This option only affects name lookups that your server does + on behalf of clients. (Default: 1) + +[[ServerDNSTestAddresses]] **ServerDNSTestAddresses** __hostname__,__hostname__,__...__:: + When we're detecting DNS hijacking, make sure that these __valid__ addresses + aren't getting redirected. If they are, then our DNS is completely useless, + and we'll reset our exit policy to "reject \*:*". This option only affects + name lookups that your server does on behalf of clients. (Default: + "www.google.com, www.mit.edu, www.yahoo.com, www.slashdot.org") + +[[ServerDNSAllowNonRFC953Hostnames]] **ServerDNSAllowNonRFC953Hostnames** **0**|**1**:: + When this option is disabled, Tor does not try to resolve hostnames + containing illegal characters (like @ and :) rather than sending them to an + exit node to be resolved. This helps trap accidental attempts to resolve + URLs and so on. This option only affects name lookups that your server does + on behalf of clients. (Default: 0) + +[[BridgeRecordUsageByCountry]] **BridgeRecordUsageByCountry** **0**|**1**:: + When this option is enabled and BridgeRelay is also enabled, and we have + GeoIP data, Tor keeps a per-country count of how many client + addresses have contacted it so that it can help the bridge authority guess + which countries have blocked access to it. (Default: 1) + +[[ServerDNSRandomizeCase]] **ServerDNSRandomizeCase** **0**|**1**:: + When this option is set, Tor sets the case of each character randomly in + outgoing DNS requests, and makes sure that the case matches in DNS replies. + This so-called "0x20 hack" helps resist some types of DNS poisoning attack. + For more information, see "Increased DNS Forgery Resistance through + 0x20-Bit Encoding". This option only affects name lookups that your server + does on behalf of clients. (Default: 1) + +[[GeoIPFile]] **GeoIPFile** __filename__:: + A filename containing IPv4 GeoIP data, for use with by-country statistics. + +[[GeoIPv6File]] **GeoIPv6File** __filename__:: + A filename containing IPv6 GeoIP data, for use with by-country statistics. + +[[CellStatistics]] **CellStatistics** **0**|**1**:: + Relays only. + When this option is enabled, Tor collects statistics about cell + processing (i.e. mean time a cell is spending in a queue, mean + number of cells in a queue and mean number of processed cells per + circuit) and writes them into disk every 24 hours. Onion router + operators may use the statistics for performance monitoring. + If ExtraInfoStatistics is enabled, it will published as part of + extra-info document. (Default: 0) + +[[PaddingStatistics]] **PaddingStatistics** **0**|**1**:: + Relays only. + When this option is enabled, Tor collects statistics for padding cells + sent and received by this relay, in addition to total cell counts. + These statistics are rounded, and omitted if traffic is low. This + information is important for load balancing decisions related to padding. + (Default: 1) + +[[DirReqStatistics]] **DirReqStatistics** **0**|**1**:: + Relays and bridges only. + When this option is enabled, a Tor directory writes statistics on the + number and response time of network status requests to disk every 24 + hours. Enables relay and bridge operators to monitor how much their + server is being used by clients to learn about Tor network. + If ExtraInfoStatistics is enabled, it will published as part of + extra-info document. (Default: 1) + +[[EntryStatistics]] **EntryStatistics** **0**|**1**:: + Relays only. + When this option is enabled, Tor writes statistics on the number of + directly connecting clients to disk every 24 hours. Enables relay + operators to monitor how much inbound traffic that originates from + Tor clients passes through their server to go further down the + Tor network. If ExtraInfoStatistics is enabled, it will be published + as part of extra-info document. (Default: 0) + +[[ExitPortStatistics]] **ExitPortStatistics** **0**|**1**:: + Exit relays only. + When this option is enabled, Tor writes statistics on the number of + relayed bytes and opened stream per exit port to disk every 24 hours. + Enables exit relay operators to measure and monitor amounts of traffic + that leaves Tor network through their exit node. If ExtraInfoStatistics + is enabled, it will be published as part of extra-info document. + (Default: 0) + +[[ConnDirectionStatistics]] **ConnDirectionStatistics** **0**|**1**:: + Relays only. + When this option is enabled, Tor writes statistics on the amounts of + traffic it passes between itself and other relays to disk every 24 + hours. Enables relay operators to monitor how much their relay is + being used as middle node in the circuit. If ExtraInfoStatistics is + enabled, it will be published as part of extra-info document. + (Default: 0) + +[[HiddenServiceStatistics]] **HiddenServiceStatistics** **0**|**1**:: + Relays only. + When this option is enabled, a Tor relay writes obfuscated + statistics on its role as hidden-service directory, introduction + point, or rendezvous point to disk every 24 hours. If + ExtraInfoStatistics is also enabled, these statistics are further + published to the directory authorities. (Default: 1) + +[[ExtraInfoStatistics]] **ExtraInfoStatistics** **0**|**1**:: + When this option is enabled, Tor includes previously gathered statistics in + its extra-info documents that it uploads to the directory authorities. + (Default: 1) + +[[ExtendAllowPrivateAddresses]] **ExtendAllowPrivateAddresses** **0**|**1**:: + When this option is enabled, Tor will connect to relays on localhost, + RFC1918 addresses, and so on. In particular, Tor will make direct OR + connections, and Tor routers allow EXTEND requests, to these private + addresses. (Tor will always allow connections to bridges, proxies, and + pluggable transports configured on private addresses.) Enabling this + option can create security issues; you should probably leave it off. + (Default: 0) + +[[MaxMemInQueues]] **MaxMemInQueues** __N__ **bytes**|**KB**|**MB**|**GB**:: + This option configures a threshold above which Tor will assume that it + needs to stop queueing or buffering data because it's about to run out of + memory. If it hits this threshold, it will begin killing circuits until + it has recovered at least 10% of this memory. Do not set this option too + low, or your relay may be unreliable under load. This option only + affects some queues, so the actual process size will be larger than + this. If this option is set to 0, Tor will try to pick a reasonable + default based on your system's physical memory. (Default: 0) + +[[DisableOOSCheck]] **DisableOOSCheck** **0**|**1**:: + This option disables the code that closes connections when Tor notices + that it is running low on sockets. Right now, it is on by default, + since the existing out-of-sockets mechanism tends to kill OR connections + more than it should. (Default: 1) + +[[SigningKeyLifetime]] **SigningKeyLifetime** __N__ **days**|**weeks**|**months**:: + For how long should each Ed25519 signing key be valid? Tor uses a + permanent master identity key that can be kept offline, and periodically + generates new "signing" keys that it uses online. This option + configures their lifetime. + (Default: 30 days) + +[[OfflineMasterKey]] **OfflineMasterKey** **0**|**1**:: + If non-zero, the Tor relay will never generate or load its master secret + key. Instead, you'll have to use "tor --keygen" to manage the permanent + ed25519 master identity key, as well as the corresponding temporary + signing keys and certificates. (Default: 0) + +[[KeyDirectory]] **KeyDirectory** __DIR__:: + Store secret keys in DIR. Can not be changed while tor is + running. + (Default: the "keys" subdirectory of DataDirectory.) + +[[KeyDirectoryGroupReadable]] **KeyDirectoryGroupReadable** **0**|**1**:: + If this option is set to 0, don't allow the filesystem group to read the + KeywDirectory. If the option is set to 1, make the KeyDirectory readable + by the default GID. (Default: 0) + + +DIRECTORY SERVER OPTIONS +------------------------ + +The following options are useful only for directory servers. (Relays with +enough bandwidth automatically become directory servers; see DirCache for +details.) + +[[DirPortFrontPage]] **DirPortFrontPage** __FILENAME__:: + When this option is set, it takes an HTML file and publishes it as "/" on + the DirPort. Now relay operators can provide a disclaimer without needing + to set up a separate webserver. There's a sample disclaimer in + contrib/operator-tools/tor-exit-notice.html. + +[[DirPort]] **DirPort** \['address':]__PORT__|**auto** [_flags_]:: + If this option is nonzero, advertise the directory service on this port. + Set it to "auto" to have Tor pick a port for you. This option can occur + more than once, but only one advertised DirPort is supported: all + but one DirPort must have the **NoAdvertise** flag set. (Default: 0) + + + + The same flags are supported here as are supported by ORPort. + +[[DirPolicy]] **DirPolicy** __policy__,__policy__,__...__:: + Set an entrance policy for this server, to limit who can connect to the + directory ports. The policies have the same form as exit policies above, + except that port specifiers are ignored. Any address not matched by + some entry in the policy is accepted. + +[[DirCache]] **DirCache** **0**|**1**:: + When this option is set, Tor caches all current directory documents and + accepts client requests for them. Setting DirPort is not required for this, + because clients connect via the ORPort by default. Setting either DirPort + or BridgeRelay and setting DirCache to 0 is not supported. (Default: 1) + +[[MaxConsensusAgeForDiffs]] **MaxConsensusAgeForDiffs** __N__ **minutes**|**hours**|**days**|**weeks**:: + When this option is nonzero, Tor caches will not try to generate + consensus diffs for any consensus older than this amount of time. + If this option is set to zero, Tor will pick a reasonable default from + the current networkstatus document. You should not set this + option unless your cache is severely low on disk space or CPU. + If you need to set it, keeping it above 3 or 4 hours will help clients + much more than setting it to zero. + (Default: 0) + + +DIRECTORY AUTHORITY SERVER OPTIONS +---------------------------------- + +The following options enable operation as a directory authority, and +control how Tor behaves as a directory authority. You should not need +to adjust any of them if you're running a regular relay or exit server +on the public Tor network. + +[[AuthoritativeDirectory]] **AuthoritativeDirectory** **0**|**1**:: + When this option is set to 1, Tor operates as an authoritative directory + server. Instead of caching the directory, it generates its own list of + good servers, signs it, and sends that to the clients. Unless the clients + already have you listed as a trusted directory, you probably do not want + to set this option. + +[[V3AuthoritativeDirectory]] **V3AuthoritativeDirectory** **0**|**1**:: + When this option is set in addition to **AuthoritativeDirectory**, Tor + generates version 3 network statuses and serves descriptors, etc as + described in dir-spec.txt file of https://spec.torproject.org/[torspec] + (for Tor clients and servers running at least 0.2.0.x). + +[[VersioningAuthoritativeDirectory]] **VersioningAuthoritativeDirectory** **0**|**1**:: + When this option is set to 1, Tor adds information on which versions of + Tor are still believed safe for use to the published directory. Each + version 1 authority is automatically a versioning authority; version 2 + authorities provide this service optionally. See **RecommendedVersions**, + **RecommendedClientVersions**, and **RecommendedServerVersions**. + +[[RecommendedVersions]] **RecommendedVersions** __STRING__:: + STRING is a comma-separated list of Tor versions currently believed to be + safe. The list is included in each directory, and nodes which pull down the + directory learn whether they need to upgrade. This option can appear + multiple times: the values from multiple lines are spliced together. When + this is set then **VersioningAuthoritativeDirectory** should be set too. + +[[RecommendedPackages]] **RecommendedPackages** __PACKAGENAME__ __VERSION__ __URL__ __DIGESTTYPE__**=**__DIGEST__ :: + Adds "package" line to the directory authority's vote. This information + is used to vote on the correct URL and digest for the released versions + of different Tor-related packages, so that the consensus can certify + them. This line may appear any number of times. + +[[RecommendedClientVersions]] **RecommendedClientVersions** __STRING__:: + STRING is a comma-separated list of Tor versions currently believed to be + safe for clients to use. This information is included in version 2 + directories. If this is not set then the value of **RecommendedVersions** + is used. When this is set then **VersioningAuthoritativeDirectory** should + be set too. + +[[BridgeAuthoritativeDir]] **BridgeAuthoritativeDir** **0**|**1**:: + When this option is set in addition to **AuthoritativeDirectory**, Tor + accepts and serves server descriptors, but it caches and serves the main + networkstatus documents rather than generating its own. (Default: 0) + +[[MinUptimeHidServDirectoryV2]] **MinUptimeHidServDirectoryV2** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**:: + Minimum uptime of a v2 hidden service directory to be accepted as such by + authoritative directories. (Default: 25 hours) + +[[RecommendedServerVersions]] **RecommendedServerVersions** __STRING__:: + STRING is a comma-separated list of Tor versions currently believed to be + safe for servers to use. This information is included in version 2 + directories. If this is not set then the value of **RecommendedVersions** + is used. When this is set then **VersioningAuthoritativeDirectory** should + be set too. + +[[ConsensusParams]] **ConsensusParams** __STRING__:: + STRING is a space-separated list of key=value pairs that Tor will include + in the "params" line of its networkstatus vote. + +[[DirAllowPrivateAddresses]] **DirAllowPrivateAddresses** **0**|**1**:: + If set to 1, Tor will accept server descriptors with arbitrary "Address" + elements. Otherwise, if the address is not an IP address or is a private IP + address, it will reject the server descriptor. Additionally, Tor + will allow exit policies for private networks to fulfill Exit flag + requirements. (Default: 0) + +[[AuthDirBadExit]] **AuthDirBadExit** __AddressPattern...__:: + Authoritative directories only. A set of address patterns for servers that + will be listed as bad exits in any network status document this authority + publishes, if **AuthDirListBadExits** is set. + + + + (The address pattern syntax here and in the options below + is the same as for exit policies, except that you don't need to say + "accept" or "reject", and ports are not needed.) + +[[AuthDirInvalid]] **AuthDirInvalid** __AddressPattern...__:: + Authoritative directories only. A set of address patterns for servers that + will never be listed as "valid" in any network status document that this + authority publishes. + +[[AuthDirReject]] **AuthDirReject** __AddressPattern__...:: + Authoritative directories only. A set of address patterns for servers that + will never be listed at all in any network status document that this + authority publishes, or accepted as an OR address in any descriptor + submitted for publication by this authority. + +[[AuthDirBadExitCCs]] **AuthDirBadExitCCs** __CC__,... + + +[[AuthDirInvalidCCs]] **AuthDirInvalidCCs** __CC__,... + + +[[AuthDirRejectCCs]] **AuthDirRejectCCs** __CC__,...:: + Authoritative directories only. These options contain a comma-separated + list of country codes such that any server in one of those country codes + will be marked as a bad exit/invalid for use, or rejected + entirely. + +[[AuthDirListBadExits]] **AuthDirListBadExits** **0**|**1**:: + Authoritative directories only. If set to 1, this directory has some + opinion about which nodes are unsuitable as exit nodes. (Do not set this to + 1 unless you plan to list non-functioning exits as bad; otherwise, you are + effectively voting in favor of every declared exit as an exit.) + +[[AuthDirMaxServersPerAddr]] **AuthDirMaxServersPerAddr** __NUM__:: + Authoritative directories only. The maximum number of servers that we will + list as acceptable on a single IP address. Set this to "0" for "no limit". + (Default: 2) + +[[AuthDirFastGuarantee]] **AuthDirFastGuarantee** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + Authoritative directories only. If non-zero, always vote the + Fast flag for any relay advertising this amount of capacity or + more. (Default: 100 KBytes) + +[[AuthDirGuardBWGuarantee]] **AuthDirGuardBWGuarantee** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + Authoritative directories only. If non-zero, this advertised capacity + or more is always sufficient to satisfy the bandwidth requirement + for the Guard flag. (Default: 2 MBytes) + +[[AuthDirPinKeys]] **AuthDirPinKeys** **0**|**1**:: + Authoritative directories only. If non-zero, do not allow any relay to + publish a descriptor if any other relay has reserved its + identity keypair. In all cases, Tor records every keypair it accepts + in a journal if it is new, or if it differs from the most recently + accepted pinning for one of the keys it contains. (Default: 1) + +[[AuthDirSharedRandomness]] **AuthDirSharedRandomness** **0**|**1**:: + Authoritative directories only. Switch for the shared random protocol. + If zero, the authority won't participate in the protocol. If non-zero + (default), the flag "shared-rand-participate" is added to the authority + vote indicating participation in the protocol. (Default: 1) + +[[AuthDirTestEd25519LinkKeys]] **AuthDirTestEd25519LinkKeys** **0**|**1**:: + Authoritative directories only. If this option is set to 0, then we treat + relays as "Running" if their RSA key is correct when we probe them, + regardless of their Ed25519 key. We should only ever set this option to 0 + if there is some major bug in Ed25519 link authentication that causes us + to label all the relays as not Running. (Default: 1) + +[[BridgePassword]] **BridgePassword** __Password__:: + If set, contains an HTTP authenticator that tells a bridge authority to + serve all requested bridge information. Used by the (only partially + implemented) "bridge community" design, where a community of bridge + relay operators all use an alternate bridge directory authority, + and their target user audience can periodically fetch the list of + available community bridges to stay up-to-date. (Default: not set) + +[[V3AuthVotingInterval]] **V3AuthVotingInterval** __N__ **minutes**|**hours**:: + V3 authoritative directories only. Configures the server's preferred voting + interval. Note that voting will __actually__ happen at an interval chosen + by consensus from all the authorities' preferred intervals. This time + SHOULD divide evenly into a day. (Default: 1 hour) + +[[V3AuthVoteDelay]] **V3AuthVoteDelay** __N__ **minutes**|**hours**:: + V3 authoritative directories only. Configures the server's preferred delay + between publishing its vote and assuming it has all the votes from all the + other authorities. Note that the actual time used is not the server's + preferred time, but the consensus of all preferences. (Default: 5 minutes) + +[[V3AuthDistDelay]] **V3AuthDistDelay** __N__ **minutes**|**hours**:: + V3 authoritative directories only. Configures the server's preferred delay + between publishing its consensus and signature and assuming it has all the + signatures from all the other authorities. Note that the actual time used + is not the server's preferred time, but the consensus of all preferences. + (Default: 5 minutes) + +[[V3AuthNIntervalsValid]] **V3AuthNIntervalsValid** __NUM__:: + V3 authoritative directories only. Configures the number of VotingIntervals + for which each consensus should be valid for. Choosing high numbers + increases network partitioning risks; choosing low numbers increases + directory traffic. Note that the actual number of intervals used is not the + server's preferred number, but the consensus of all preferences. Must be at + least 2. (Default: 3) + +[[V3BandwidthsFile]] **V3BandwidthsFile** __FILENAME__:: + V3 authoritative directories only. Configures the location of the + bandwidth-authority generated file storing information on relays' measured + bandwidth capacities. (Default: unset) + +[[V3AuthUseLegacyKey]] **V3AuthUseLegacyKey** **0**|**1**:: + If set, the directory authority will sign consensuses not only with its + own signing key, but also with a "legacy" key and certificate with a + different identity. This feature is used to migrate directory authority + keys in the event of a compromise. (Default: 0) + +[[RephistTrackTime]] **RephistTrackTime** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**:: + Tells an authority, or other node tracking node reliability and history, + that fine-grained information about nodes can be discarded when it hasn't + changed for a given amount of time. (Default: 24 hours) + +[[AuthDirHasIPv6Connectivity]] **AuthDirHasIPv6Connectivity** **0**|**1**:: + Authoritative directories only. When set to 0, OR ports with an + IPv6 address are not included in the authority's votes. When set to 1, + IPv6 OR ports are tested for reachability like IPv4 OR ports. If the + reachability test succeeds, the authority votes for the IPv6 ORPort, and + votes Running for the relay. If the reachability test fails, the authority + does not vote for the IPv6 ORPort, and does not vote Running (Default: 0) + ++ + The content of the consensus depends on the number of voting authorities + that set AuthDirHasIPv6Connectivity: + + If no authorities set AuthDirHasIPv6Connectivity 1, there will be no + IPv6 ORPorts in the consensus. + + If a minority of authorities set AuthDirHasIPv6Connectivity 1, + unreachable IPv6 ORPorts will be removed from the consensus. But the + majority of IPv4-only authorities will still vote the relay as Running. + Reachable IPv6 ORPort lines will be included in the consensus + + If a majority of voting authorities set AuthDirHasIPv6Connectivity 1, + relays with unreachable IPv6 ORPorts will not be listed as Running. + Reachable IPv6 ORPort lines will be included in the consensus + (To ensure that any valid majority will vote relays with unreachable + IPv6 ORPorts not Running, 75% of authorities must set + AuthDirHasIPv6Connectivity 1.) + +[[MinMeasuredBWsForAuthToIgnoreAdvertised]] **MinMeasuredBWsForAuthToIgnoreAdvertised** __N__:: + A total value, in abstract bandwidth units, describing how much + measured total bandwidth an authority should have observed on the network + before it will treat advertised bandwidths as wholly + unreliable. (Default: 500) + +HIDDEN SERVICE OPTIONS +---------------------- + +The following options are used to configure a hidden service. + +[[HiddenServiceDir]] **HiddenServiceDir** __DIRECTORY__:: + Store data files for a hidden service in DIRECTORY. Every hidden service + must have a separate directory. You may use this option multiple times to + specify multiple services. If DIRECTORY does not exist, Tor will create it. + (Note: in current versions of Tor, if DIRECTORY is a relative path, + it will be relative to the current + working directory of Tor instance, not to its DataDirectory. Do not + rely on this behavior; it is not guaranteed to remain the same in future + versions.) + +[[HiddenServicePort]] **HiddenServicePort** __VIRTPORT__ [__TARGET__]:: + Configure a virtual port VIRTPORT for a hidden service. You may use this + option multiple times; each time applies to the service using the most + recent HiddenServiceDir. By default, this option maps the virtual port to + the same port on 127.0.0.1 over TCP. You may override the target port, + address, or both by specifying a target of addr, port, addr:port, or + **unix:**__path__. (You can specify an IPv6 target as [addr]:port. Unix + paths may be quoted, and may use standard C escapes.) + You may also have multiple lines with the same VIRTPORT: when a user + connects to that VIRTPORT, one of the TARGETs from those lines will be + chosen at random. + +[[PublishHidServDescriptors]] **PublishHidServDescriptors** **0**|**1**:: + If set to 0, Tor will run any hidden services you configure, but it won't + advertise them to the rendezvous directory. This option is only useful if + you're using a Tor controller that handles hidserv publishing for you. + (Default: 1) + +[[HiddenServiceVersion]] **HiddenServiceVersion** __version__,__version__,__...__:: + A list of rendezvous service descriptor versions to publish for the hidden + service. Currently, versions 2 and 3 are supported. (Default: 2) + +[[HiddenServiceAuthorizeClient]] **HiddenServiceAuthorizeClient** __auth-type__ __client-name__,__client-name__,__...__:: + If configured, the hidden service is accessible for authorized clients + only. The auth-type can either be \'basic' for a general-purpose + authorization protocol or \'stealth' for a less scalable protocol that also + hides service activity from unauthorized clients. Only clients that are + listed here are authorized to access the hidden service. Valid client names + are 1 to 16 characters long and only use characters in A-Za-z0-9+-_ (no + spaces). If this option is set, the hidden service is not accessible for + clients without authorization any more. Generated authorization data can be + found in the hostname file. Clients need to put this authorization data in + their configuration file using **HidServAuth**. + +[[HiddenServiceAllowUnknownPorts]] **HiddenServiceAllowUnknownPorts** **0**|**1**:: + If set to 1, then connections to unrecognized ports do not cause the + current hidden service to close rendezvous circuits. (Setting this to 0 is + not an authorization mechanism; it is instead meant to be a mild + inconvenience to port-scanners.) (Default: 0) + +[[HiddenServiceMaxStreams]] **HiddenServiceMaxStreams** __N__:: + The maximum number of simultaneous streams (connections) per rendezvous + circuit. The maximum value allowed is 65535. (Setting this to 0 will allow + an unlimited number of simultanous streams.) (Default: 0) + +[[HiddenServiceMaxStreamsCloseCircuit]] **HiddenServiceMaxStreamsCloseCircuit** **0**|**1**:: + If set to 1, then exceeding **HiddenServiceMaxStreams** will cause the + offending rendezvous circuit to be torn down, as opposed to stream creation + requests that exceed the limit being silently ignored. (Default: 0) + +[[RendPostPeriod]] **RendPostPeriod** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**:: + Every time the specified period elapses, Tor uploads any rendezvous + service descriptors to the directory servers. This information is also + uploaded whenever it changes. Minimum value allowed is 10 minutes and + maximum is 3.5 days. (Default: 1 hour) + +[[HiddenServiceDirGroupReadable]] **HiddenServiceDirGroupReadable** **0**|**1**:: + If this option is set to 1, allow the filesystem group to read the + hidden service directory and hostname file. If the option is set to 0, + only owner is able to read the hidden service directory. (Default: 0) + Has no effect on Windows. + +[[HiddenServiceNumIntroductionPoints]] **HiddenServiceNumIntroductionPoints** __NUM__:: + Number of introduction points the hidden service will have. You can't + have more than 10 for v2 service and 20 for v3. (Default: 3) + +[[HiddenServiceSingleHopMode]] **HiddenServiceSingleHopMode** **0**|**1**:: + **Experimental - Non Anonymous** Hidden Services on a tor instance in + HiddenServiceSingleHopMode make one-hop (direct) circuits between the onion + service server, and the introduction and rendezvous points. (Onion service + descriptors are still posted using 3-hop paths, to avoid onion service + directories blocking the service.) + This option makes every hidden service instance hosted by a tor instance a + Single Onion Service. One-hop circuits make Single Onion servers easily + locatable, but clients remain location-anonymous. However, the fact that a + client is accessing a Single Onion rather than a Hidden Service may be + statistically distinguishable. + + + + **WARNING:** Once a hidden service directory has been used by a tor + instance in HiddenServiceSingleHopMode, it can **NEVER** be used again for + a hidden service. It is best practice to create a new hidden service + directory, key, and address for each new Single Onion Service and Hidden + Service. It is not possible to run Single Onion Services and Hidden + Services from the same tor instance: they should be run on different + servers with different IP addresses. + + + + HiddenServiceSingleHopMode requires HiddenServiceNonAnonymousMode to be set + to 1. Since a Single Onion service is non-anonymous, you can not configure + a SOCKSPort on a tor instance that is running in + **HiddenServiceSingleHopMode**. Can not be changed while tor is running. + (Default: 0) + +[[HiddenServiceNonAnonymousMode]] **HiddenServiceNonAnonymousMode** **0**|**1**:: + Makes hidden services non-anonymous on this tor instance. Allows the + non-anonymous HiddenServiceSingleHopMode. Enables direct connections in the + server-side hidden service protocol. If you are using this option, + you need to disable all client-side services on your Tor instance, + including setting SOCKSPort to "0". Can not be changed while tor is + running. (Default: 0) + +TESTING NETWORK OPTIONS +----------------------- + +The following options are used for running a testing Tor network. + +[[TestingTorNetwork]] **TestingTorNetwork** **0**|**1**:: + If set to 1, Tor adjusts default values of the configuration options below, + so that it is easier to set up a testing Tor network. May only be set if + non-default set of DirAuthorities is set. Cannot be unset while Tor is + running. + (Default: 0) + + + ServerDNSAllowBrokenConfig 1 + DirAllowPrivateAddresses 1 + EnforceDistinctSubnets 0 + AssumeReachable 1 + AuthDirMaxServersPerAddr 0 + AuthDirMaxServersPerAuthAddr 0 + ClientBootstrapConsensusAuthorityDownloadSchedule 0, 2, + 4 (for 40 seconds), 8, 16, 32, 60 + ClientBootstrapConsensusFallbackDownloadSchedule 0, 1, + 4 (for 40 seconds), 8, 16, 32, 60 + ClientBootstrapConsensusAuthorityOnlyDownloadSchedule 0, 1, + 4 (for 40 seconds), 8, 16, 32, 60 + ClientBootstrapConsensusMaxDownloadTries 80 + ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries 80 + ClientDNSRejectInternalAddresses 0 + ClientRejectInternalAddresses 0 + CountPrivateBandwidth 1 + ExitPolicyRejectPrivate 0 + ExtendAllowPrivateAddresses 1 + V3AuthVotingInterval 5 minutes + V3AuthVoteDelay 20 seconds + V3AuthDistDelay 20 seconds + MinUptimeHidServDirectoryV2 0 seconds + TestingV3AuthInitialVotingInterval 5 minutes + TestingV3AuthInitialVoteDelay 20 seconds + TestingV3AuthInitialDistDelay 20 seconds + TestingAuthDirTimeToLearnReachability 0 minutes + TestingEstimatedDescriptorPropagationTime 0 minutes + TestingServerDownloadSchedule 0, 0, 0, 5, 10, 15, 20, 30, 60 + TestingClientDownloadSchedule 0, 0, 5, 10, 15, 20, 30, 60 + TestingServerConsensusDownloadSchedule 0, 0, 5, 10, 15, 20, 30, 60 + TestingClientConsensusDownloadSchedule 0, 0, 5, 10, 15, 20, 30, 60 + TestingBridgeDownloadSchedule 10, 30, 60 + TestingBridgeBootstrapDownloadSchedule 0, 0, 5, 10, 15, 20, 30, 60 + TestingClientMaxIntervalWithoutRequest 5 seconds + TestingDirConnectionMaxStall 30 seconds + TestingConsensusMaxDownloadTries 80 + TestingDescriptorMaxDownloadTries 80 + TestingMicrodescMaxDownloadTries 80 + TestingCertMaxDownloadTries 80 + TestingEnableConnBwEvent 1 + TestingEnableCellStatsEvent 1 + TestingEnableTbEmptyEvent 1 + +[[TestingV3AuthInitialVotingInterval]] **TestingV3AuthInitialVotingInterval** __N__ **minutes**|**hours**:: + Like V3AuthVotingInterval, but for initial voting interval before the first + consensus has been created. Changing this requires that + **TestingTorNetwork** is set. (Default: 30 minutes) + +[[TestingV3AuthInitialVoteDelay]] **TestingV3AuthInitialVoteDelay** __N__ **minutes**|**hours**:: + Like V3AuthVoteDelay, but for initial voting interval before + the first consensus has been created. Changing this requires that + **TestingTorNetwork** is set. (Default: 5 minutes) + +[[TestingV3AuthInitialDistDelay]] **TestingV3AuthInitialDistDelay** __N__ **minutes**|**hours**:: + Like V3AuthDistDelay, but for initial voting interval before + the first consensus has been created. Changing this requires that + **TestingTorNetwork** is set. (Default: 5 minutes) + +[[TestingV3AuthVotingStartOffset]] **TestingV3AuthVotingStartOffset** __N__ **seconds**|**minutes**|**hours**:: + Directory authorities offset voting start time by this much. + Changing this requires that **TestingTorNetwork** is set. (Default: 0) + +[[TestingAuthDirTimeToLearnReachability]] **TestingAuthDirTimeToLearnReachability** __N__ **minutes**|**hours**:: + After starting as an authority, do not make claims about whether routers + are Running until this much time has passed. Changing this requires + that **TestingTorNetwork** is set. (Default: 30 minutes) + +[[TestingEstimatedDescriptorPropagationTime]] **TestingEstimatedDescriptorPropagationTime** __N__ **minutes**|**hours**:: + Clients try downloading server descriptors from directory caches after this + time. Changing this requires that **TestingTorNetwork** is set. (Default: + 10 minutes) + +[[TestingMinFastFlagThreshold]] **TestingMinFastFlagThreshold** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + Minimum value for the Fast flag. Overrides the ordinary minimum taken + from the consensus when TestingTorNetwork is set. (Default: 0.) + +[[TestingServerDownloadSchedule]] **TestingServerDownloadSchedule** __N__,__N__,__...__:: + Schedule for when servers should download things in general. Changing this + requires that **TestingTorNetwork** is set. (Default: 0, 0, 0, 60, 60, 120, + 300, 900, 2147483647) + +[[TestingClientDownloadSchedule]] **TestingClientDownloadSchedule** __N__,__N__,__...__:: + Schedule for when clients should download things in general. Changing this + requires that **TestingTorNetwork** is set. (Default: 0, 0, 60, 300, 600, + 2147483647) + +[[TestingServerConsensusDownloadSchedule]] **TestingServerConsensusDownloadSchedule** __N__,__N__,__...__:: + Schedule for when servers should download consensuses. Changing this + requires that **TestingTorNetwork** is set. (Default: 0, 0, 60, 300, 600, + 1800, 1800, 1800, 1800, 1800, 3600, 7200) + +[[TestingClientConsensusDownloadSchedule]] **TestingClientConsensusDownloadSchedule** __N__,__N__,__...__:: + Schedule for when clients should download consensuses. Changing this + requires that **TestingTorNetwork** is set. (Default: 0, 0, 60, 300, 600, + 1800, 3600, 3600, 3600, 10800, 21600, 43200) + +[[TestingBridgeDownloadSchedule]] **TestingBridgeDownloadSchedule** __N__,__N__,__...__:: + Schedule for when clients should download each bridge descriptor when they + know that one or more of their configured bridges are running. Changing + this requires that **TestingTorNetwork** is set. (Default: 10800, 25200, + 54000, 111600, 262800) + +[[TestingBridgeBootstrapDownloadSchedule]] **TestingBridgeBootstrapDownloadSchedule** __N__,__N__,__...__:: + Schedule for when clients should download each bridge descriptor when they + have just started, or when they can not contact any of their bridges. + Changing this requires that **TestingTorNetwork** is set. (Default: 0, 30, + 90, 600, 3600, 10800, 25200, 54000, 111600, 262800) + +[[TestingClientMaxIntervalWithoutRequest]] **TestingClientMaxIntervalWithoutRequest** __N__ **seconds**|**minutes**:: + When directory clients have only a few descriptors to request, they batch + them until they have more, or until this amount of time has passed. + Changing this requires that **TestingTorNetwork** is set. (Default: 10 + minutes) + +[[TestingDirConnectionMaxStall]] **TestingDirConnectionMaxStall** __N__ **seconds**|**minutes**:: + Let a directory connection stall this long before expiring it. + Changing this requires that **TestingTorNetwork** is set. (Default: + 5 minutes) + +[[TestingConsensusMaxDownloadTries]] **TestingConsensusMaxDownloadTries** __NUM__:: + Try this many times to download a consensus before giving up. Changing + this requires that **TestingTorNetwork** is set. (Default: 8) + +[[TestingDescriptorMaxDownloadTries]] **TestingDescriptorMaxDownloadTries** __NUM__:: + Try this often to download a server descriptor before giving up. + Changing this requires that **TestingTorNetwork** is set. (Default: 8) + +[[TestingMicrodescMaxDownloadTries]] **TestingMicrodescMaxDownloadTries** __NUM__:: + Try this often to download a microdesc descriptor before giving up. + Changing this requires that **TestingTorNetwork** is set. (Default: 8) + +[[TestingCertMaxDownloadTries]] **TestingCertMaxDownloadTries** __NUM__:: + Try this often to download a v3 authority certificate before giving up. + Changing this requires that **TestingTorNetwork** is set. (Default: 8) + +[[TestingDirAuthVoteExit]] **TestingDirAuthVoteExit** __node__,__node__,__...__:: + A list of identity fingerprints, country codes, and + address patterns of nodes to vote Exit for regardless of their + uptime, bandwidth, or exit policy. See the **ExcludeNodes** + option for more information on how to specify nodes. + + + + In order for this option to have any effect, **TestingTorNetwork** + has to be set. See the **ExcludeNodes** option for more + information on how to specify nodes. + +[[TestingDirAuthVoteExitIsStrict]] **TestingDirAuthVoteExitIsStrict** **0**|**1** :: + If True (1), a node will never receive the Exit flag unless it is specified + in the **TestingDirAuthVoteExit** list, regardless of its uptime, bandwidth, + or exit policy. + + + + In order for this option to have any effect, **TestingTorNetwork** + has to be set. + +[[TestingDirAuthVoteGuard]] **TestingDirAuthVoteGuard** __node__,__node__,__...__:: + A list of identity fingerprints and country codes and + address patterns of nodes to vote Guard for regardless of their + uptime and bandwidth. See the **ExcludeNodes** option for more + information on how to specify nodes. + + + + In order for this option to have any effect, **TestingTorNetwork** + has to be set. + +[[TestingDirAuthVoteGuardIsStrict]] **TestingDirAuthVoteGuardIsStrict** **0**|**1** :: + If True (1), a node will never receive the Guard flag unless it is specified + in the **TestingDirAuthVoteGuard** list, regardless of its uptime and bandwidth. + + + + In order for this option to have any effect, **TestingTorNetwork** + has to be set. + +[[TestingDirAuthVoteHSDir]] **TestingDirAuthVoteHSDir** __node__,__node__,__...__:: + A list of identity fingerprints and country codes and + address patterns of nodes to vote HSDir for regardless of their + uptime and DirPort. See the **ExcludeNodes** option for more + information on how to specify nodes. + + + + In order for this option to have any effect, **TestingTorNetwork** + must be set. + +[[TestingDirAuthVoteHSDirIsStrict]] **TestingDirAuthVoteHSDirIsStrict** **0**|**1** :: + If True (1), a node will never receive the HSDir flag unless it is specified + in the **TestingDirAuthVoteHSDir** list, regardless of its uptime and DirPort. + + + + In order for this option to have any effect, **TestingTorNetwork** + has to be set. + +[[TestingEnableConnBwEvent]] **TestingEnableConnBwEvent** **0**|**1**:: + If this option is set, then Tor controllers may register for CONN_BW + events. Changing this requires that **TestingTorNetwork** is set. + (Default: 0) + +[[TestingEnableCellStatsEvent]] **TestingEnableCellStatsEvent** **0**|**1**:: + If this option is set, then Tor controllers may register for CELL_STATS + events. Changing this requires that **TestingTorNetwork** is set. + (Default: 0) + +[[TestingEnableTbEmptyEvent]] **TestingEnableTbEmptyEvent** **0**|**1**:: + If this option is set, then Tor controllers may register for TB_EMPTY + events. Changing this requires that **TestingTorNetwork** is set. + (Default: 0) + +[[TestingMinExitFlagThreshold]] **TestingMinExitFlagThreshold** __N__ **KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: + Sets a lower-bound for assigning an exit flag when running as an + authority on a testing network. Overrides the usual default lower bound + of 4 KB. (Default: 0) + +[[TestingLinkCertLifetime]] **TestingLinkCertLifetime** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**|**months**:: + Overrides the default lifetime for the certificates used to authenticate + our X509 link cert with our ed25519 signing key. + (Default: 2 days) + +[[TestingAuthKeyLifetime]] **TestingAuthKeyLifetime** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**|**months**:: + Overrides the default lifetime for a signing Ed25519 TLS Link authentication + key. + (Default: 2 days) + +[[TestingLinkKeySlop]] **TestingLinkKeySlop** __N__ **seconds**|**minutes**|**hours** + + +[[TestingAuthKeySlop]] **TestingAuthKeySlop** __N__ **seconds**|**minutes**|**hours** + + +[[TestingSigningKeySlop]] **TestingSigningKeySlop** __N__ **seconds**|**minutes**|**hours**:: + How early before the official expiration of a an Ed25519 signing key do + we replace it and issue a new key? + (Default: 3 hours for link and auth; 1 day for signing.) + +NON-PERSISTENT OPTIONS +---------------------- + +These options are not saved to the torrc file by the "SAVECONF" controller +command. Other options of this type are documented in control-spec.txt, +section 5.4. End-users should mostly ignore them. + +[[UnderscorePorts]] **\_\_ControlPort**, **\_\_DirPort**, **\_\_DNSPort**, **\_\_ExtORPort**, **\_\_NATDPort**, **\_\_ORPort**, **\_\_SocksPort**, **\_\_TransPort**:: + These underscore-prefixed options are variants of the regular Port + options. They behave the same, except they are not saved to the + torrc file by the controller's SAVECONF command. + + +SIGNALS +------- + +Tor catches the following signals: + +[[SIGTERM]] **SIGTERM**:: + Tor will catch this, clean up and sync to disk if necessary, and exit. + +[[SIGINT]] **SIGINT**:: + Tor clients behave as with SIGTERM; but Tor servers will do a controlled + slow shutdown, closing listeners and waiting 30 seconds before exiting. + (The delay can be configured with the ShutdownWaitLength config option.) + +[[SIGHUP]] **SIGHUP**:: + The signal instructs Tor to reload its configuration (including closing and + reopening logs), and kill and restart its helper processes if applicable. + +[[SIGUSR1]] **SIGUSR1**:: + Log statistics about current connections, past connections, and throughput. + +[[SIGUSR2]] **SIGUSR2**:: + Switch all logs to loglevel debug. You can go back to the old loglevels by + sending a SIGHUP. + +[[SIGCHLD]] **SIGCHLD**:: + Tor receives this signal when one of its helper processes has exited, so it + can clean up. + +[[SIGPIPE]] **SIGPIPE**:: + Tor catches this signal and ignores it. + +[[SIGXFSZ]] **SIGXFSZ**:: + If this signal exists on your platform, Tor catches and ignores it. + +FILES +----- + +**@CONFDIR@/torrc**:: + The configuration file, which contains "option value" pairs. + +**$HOME/.torrc**:: + Fallback location for torrc, if @CONFDIR@/torrc is not found. + +**@LOCALSTATEDIR@/lib/tor/**:: + The tor process stores keys and other data here. + + +__CacheDirectory__**/cached-certs**:: + This file holds downloaded directory key certificates that are used to + verify authenticity of documents generated by Tor directory authorities. + +__CacheDirectory__**/cached-consensus** and/or **cached-microdesc-consensus**:: + The most recent consensus network status document we've downloaded. + +__CacheDirectory__**/cached-descriptors** and **cached-descriptors.new**:: + These files hold downloaded router statuses. Some routers may appear more + than once; if so, the most recently published descriptor is used. Lines + beginning with @-signs are annotations that contain more information about + a given router. The ".new" file is an append-only journal; when it gets + too large, all entries are merged into a new cached-descriptors file. + +__CacheDirectory__**/cached-extrainfo** and **cached-extrainfo.new**:: + As "cached-descriptors", but holds optionally-downloaded "extra-info" + documents. Relays use these documents to send inessential information + about statistics, bandwidth history, and network health to the + authorities. They aren't fetched by default; see the DownloadExtraInfo + option for more info. + +__CacheDirectory__**/cached-microdescs** and **cached-microdescs.new**:: + These files hold downloaded microdescriptors. Lines beginning with + @-signs are annotations that contain more information about a given + router. The ".new" file is an append-only journal; when it gets too + large, all entries are merged into a new cached-microdescs file. + +__CacheDirectory__**/cached-routers** and **cached-routers.new**:: + Obsolete versions of cached-descriptors and cached-descriptors.new. When + Tor can't find the newer files, it looks here instead. + +__DataDirectory__**/state**:: + A set of persistent key-value mappings. These are documented in + the file. These include: + - The current entry guards and their status. + - The current bandwidth accounting values. + - When the file was last written + - What version of Tor generated the state file + - A short history of bandwidth usage, as produced in the server + descriptors. + +__DataDirectory__**/sr-state**:: + Authority only. State file used to record information about the current + status of the shared-random-value voting state. + +__CacheDirectory__**/diff-cache**:: + Directory cache only. Holds older consensuses, and diffs from older + consensuses to the most recent consensus of each type, compressed + in various ways. Each file contains a set of key-value arguments + decribing its contents, followed by a single NUL byte, followed by the + main file contents. + +__DataDirectory__**/bw_accounting**:: + Used to track bandwidth accounting values (when the current period starts + and ends; how much has been read and written so far this period). This file + is obsolete, and the data is now stored in the \'state' file instead. + +__DataDirectory__**/control_auth_cookie**:: + Used for cookie authentication with the controller. Location can be + overridden by the CookieAuthFile config option. Regenerated on startup. See + control-spec.txt in https://spec.torproject.org/[torspec] for details. + Only used when cookie authentication is enabled. + +__DataDirectory__**/lock**:: + This file is used to prevent two Tor instances from using same data + directory. If access to this file is locked, data directory is already + in use by Tor. + +__DataDirectory__**/key-pinning-journal**:: + Used by authorities. A line-based file that records mappings between + RSA1024 identity keys and Ed25519 identity keys. Authorities enforce + these mappings, so that once a relay has picked an Ed25519 key, stealing + or factoring the RSA1024 key will no longer let an attacker impersonate + the relay. + +__KeyDirectory__**/authority_identity_key**:: + A v3 directory authority's master identity key, used to authenticate its + signing key. Tor doesn't use this while it's running. The tor-gencert + program uses this. If you're running an authority, you should keep this + key offline, and not actually put it here. + +__KeyDirectory__**/authority_certificate**:: + A v3 directory authority's certificate, which authenticates the authority's + current vote- and consensus-signing key using its master identity key. + Only directory authorities use this file. + +__KeyDirectory__**/authority_signing_key**:: + A v3 directory authority's signing key, used to sign votes and consensuses. + Only directory authorities use this file. Corresponds to the + **authority_certificate** cert. + +__KeyDirectory__**/legacy_certificate**:: + As authority_certificate: used only when V3AuthUseLegacyKey is set. + See documentation for V3AuthUseLegacyKey. + +__KeyDirectory__**/legacy_signing_key**:: + As authority_signing_key: used only when V3AuthUseLegacyKey is set. + See documentation for V3AuthUseLegacyKey. + +__KeyDirectory__**/secret_id_key**:: + A relay's RSA1024 permanent identity key, including private and public + components. Used to sign router descriptors, and to sign other keys. + +__KeyDirectory__**/ed25519_master_id_public_key**:: + The public part of a relay's Ed25519 permanent identity key. + +__KeyDirectory__**/ed25519_master_id_secret_key**:: + The private part of a relay's Ed25519 permanent identity key. This key + is used to sign the medium-term ed25519 signing key. This file can be + kept offline, or kept encrypted. If so, Tor will not be able to generate + new signing keys itself; you'll need to use tor --keygen yourself to do + so. + +__KeyDirectory__**/ed25519_signing_secret_key**:: + The private and public components of a relay's medium-term Ed25519 signing + key. This key is authenticated by the Ed25519 master key, in turn + authenticates other keys (and router descriptors). + +__KeyDirectory__**/ed25519_signing_cert**:: + The certificate which authenticates "ed25519_signing_secret_key" as + having been signed by the Ed25519 master key. + +__KeyDirectory__**/secret_onion_key** and **secret_onion_key.old**:: + A relay's RSA1024 short-term onion key. Used to decrypt old-style ("TAP") + circuit extension requests. The ".old" file holds the previously + generated key, which the relay uses to handle any requests that were + made by clients that didn't have the new one. + +__KeyDirectory__**/secret_onion_key_ntor** and **secret_onion_key_ntor.old**:: + A relay's Curve25519 short-term onion key. Used to handle modern ("ntor") + circuit extension requests. The ".old" file holds the previously + generated key, which the relay uses to handle any requests that were + made by clients that didn't have the new one. + +__DataDirectory__**/fingerprint**:: + Only used by servers. Holds the fingerprint of the server's identity key. + +__DataDirectory__**/hashed-fingerprint**:: + Only used by bridges. Holds the hashed fingerprint of the bridge's + identity key. (That is, the hash of the hash of the identity key.) + +__DataDirectory__**/approved-routers**:: + Only used by authoritative directory servers. This file lists + the status of routers by their identity fingerprint. + Each line lists a status and a fingerprint separated by + whitespace. See your **fingerprint** file in the __DataDirectory__ for an + example line. If the status is **!reject** then descriptors from the + given identity (fingerprint) are rejected by this server. If it is + **!invalid** then descriptors are accepted but marked in the directory as + not valid, that is, not recommended. + +__DataDirectory__**/v3-status-votes**:: + Only for v3 authoritative directory servers. This file contains + status votes from all the authoritative directory servers. + +__CacheDirectory__**/unverified-consensus**:: + This file contains a network consensus document that has been downloaded, + but which we didn't have the right certificates to check yet. + +__CacheDirectory__**/unverified-microdesc-consensus**:: + This file contains a microdescriptor-flavored network consensus document + that has been downloaded, but which we didn't have the right certificates + to check yet. + +__DataDirectory__**/unparseable-desc**:: + Onion server descriptors that Tor was unable to parse are dumped to this + file. Only used for debugging. + +__DataDirectory__**/router-stability**:: + Only used by authoritative directory servers. Tracks measurements for + router mean-time-between-failures so that authorities have a good idea of + how to set their Stable flags. + +__DataDirectory__**/stats/dirreq-stats**:: + Only used by directory caches and authorities. This file is used to + collect directory request statistics. + +__DataDirectory__**/stats/entry-stats**:: + Only used by servers. This file is used to collect incoming connection + statistics by Tor entry nodes. + +__DataDirectory__**/stats/bridge-stats**:: + Only used by servers. This file is used to collect incoming connection + statistics by Tor bridges. + +__DataDirectory__**/stats/exit-stats**:: + Only used by servers. This file is used to collect outgoing connection + statistics by Tor exit routers. + +__DataDirectory__**/stats/buffer-stats**:: + Only used by servers. This file is used to collect buffer usage + history. + +__DataDirectory__**/stats/conn-stats**:: + Only used by servers. This file is used to collect approximate connection + history (number of active connections over time). + +__DataDirectory__**/stats/hidserv-stats**:: + Only used by servers. This file is used to collect approximate counts + of what fraction of the traffic is hidden service rendezvous traffic, and + approximately how many hidden services the relay has seen. + +__DataDirectory__**/networkstatus-bridges**:: + Only used by authoritative bridge directories. Contains information + about bridges that have self-reported themselves to the bridge + authority. + +__DataDirectory__**/approved-routers**:: + Authorities only. This file is used to configure which relays are + known to be valid, invalid, and so forth. + +__HiddenServiceDirectory__**/hostname**:: + The .onion domain name for this hidden service. + If the hidden service is restricted to authorized clients only, this file + also contains authorization data for all clients. + + + Note that clients will ignore any extra subdomains prepended to a hidden + service hostname. So if you have "xyz.onion" as your hostname, you + can tell clients to connect to "www.xyz.onion" or "irc.xyz.onion" + for virtual-hosting purposes. + +__HiddenServiceDirectory__**/private_key**:: + The private key for this hidden service. + +__HiddenServiceDirectory__**/client_keys**:: + Authorization data for a hidden service that is only accessible by + authorized clients. + +__HiddenServiceDirectory__**/onion_service_non_anonymous**:: + This file is present if a hidden service key was created in + **HiddenServiceNonAnonymousMode**. + +SEE ALSO +-------- +**torsocks**(1), **torify**(1) + + +**https://www.torproject.org/** + +**torspec: https://spec.torproject.org ** + +BUGS +---- + +Plenty, probably. Tor is still in development. Please report them at https://trac.torproject.org/. + +AUTHORS +------- +Roger Dingledine [arma at mit.edu], Nick Mathewson [nickm at alum.mit.edu]. diff --git a/src/wraith/doc/torify.1.txt b/src/wraith/doc/torify.1.txt new file mode 100644 index 000000000..7e49081cf --- /dev/null +++ b/src/wraith/doc/torify.1.txt @@ -0,0 +1,40 @@ +// Copyright (c) The Tor Project, Inc. +// See LICENSE for licensing information +// This is an asciidoc file used to generate the manpage/html reference. +// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html +:man source: Tor +:man manual: Tor Manual +torify(1) +========= + +NAME +---- +torify - wrapper for torsocks and tor + +SYNOPSIS +-------- +**torify** __application__ [__application's__ __arguments__] + +DESCRIPTION +----------- +**torify** is a simple wrapper that calls torsocks with a tor-specific +configuration file. + +It is provided for backward compatibility; instead you should use torsocks. + +WARNING +------- +When used with torsocks, torify should not leak DNS requests or UDP data. + +torify can leak ICMP data. + +torify will not ensure that different requests are processed on +different circuits. + +SEE ALSO +-------- +**tor**(1), **torsocks**(1) + +AUTHORS +------- +Peter Palfrader and Jacob Appelbaum wrote this manual. diff --git a/src/wraith/doc/torrc_format.txt b/src/wraith/doc/torrc_format.txt new file mode 100644 index 000000000..7a4a92a66 --- /dev/null +++ b/src/wraith/doc/torrc_format.txt @@ -0,0 +1,212 @@ + +This document specifies the current format and semantics of the torrc +file, as of July 2015. Note that we make no guarantee about the +stability of this format. If you write something designed for strict +compatibility with this document, please expect us to break it sooner or +later. + +Yes, some of this is quite stupid. My goal here is to explain what it +does, not what it should do. + + - Nick + + + +1. File Syntax + + ; The syntax here is defined an Augmented Backus-Naur form, as + ; specified in RFC5234. + + ; A file is interpreted as every Entry in the file, in order. + TorrcFile = *Line [ UnterminatedLine ] + + Line = BlankLine LF / Entry LF + UnterminatedLine = BlankLine / Entry + + BlankLine = *WSP OptComment LF + BlankLine =/ *WSP LF + + OptComment = [ Comment ] + + Comment = "#" *NonLF + + ; Each Entry is interpreted as an optional "Magic" flag, a key, and a + ; value. + Entry = *WSP [ Magic ] Key 1*(1*WSP / "\" NL *WSP) Val LF + Entry =/ *WSP [ Magic ] Key *( *WSP / "\" NL *WSP) LF + + Magic = "+" / "/" + + ; Keys are always specified verbatim. They are case insensitive. It + ; is an error to specify a key that Tor does not recognize. + Key = 1*KC + + ; Sadly, every kind of value is decoded differently... + Val = QuotedVal / ContinuedVal / PlainVal + + ; The text of a PlainVal is the text of its PVBody portion, + ; plus the optional trailing backslash. + PlainVal = PVBody [ "\" ] *WSP OptComment + + ; Note that a PVBody is copied verbatim. Slashes are included + ; verbatim. No changes are made. Note that a body may be empty. + PVBody = * (VC / "\" NonLF ) + + ; The text of a ContinuedVal is the text of each of its PVBody + ; sub-elements, in order, concatenated. + ContinuedVal = CVal1 *CVal2 CVal3 + + CVal1 = PVBody "\" LF + CVal2 = PVBody ( "\" LF / Comment LF ) + CVal3 = PVBody + + ; The text of a QuotedVal is decoded as if it were a C string. + QuotedVal = DQ QVBody DQ *WSP Comment + + QVBody = QC + QVBody =/ "\" ( "n" / "r" / "t" / "\" / "'" / DQUOTE ) + QVBOdy =/ "\" ( "x" 2HEXDIG / 1*3OCTDIG ) + + ; Anything besides NUL and LF + NonLF = %x01-%x09 / %x0b - %xff + + ; Note that on windows, we open our configuration files in "text" mode, + ; which causes CRLF pairs to be interpreted as LF. So, on windows: + ; LF = [ %x0d ] %x0a + ; but everywhere else, + LF = %0x0a + + OCTDIG = '0' - '7' + + KC = Any character except an isspace() character or '#' or NUL + VC = Any character except '\\', '\n', '#', or NUL + QC = Any character except '\n', '\\', '\"', or NUL + +2. Mid-level Semantics + + + There are four configuration "domains", from lowest to highest priority: + + * Built-in defaults + * The "torrc_defaults" file, if any + * The "torrc" file, if any + * Arguments provided on the command line, if any. + + Normally, values from high-priority domains override low-priority + domains, but see 'magic' below. + + Configuration keys fall into three categories: singletons, lists, and + groups. + + A singleton key may appear at most once in any domain. Its + corresponding value is equal to its value in the highest-priority + domain in which it occurs. + + A list key may appear any number of times in a domain. By default, + its corresponding value is equal to all of the values specified for + it in the highest-priority domain in which it appears. (See 'magic' + below). + + A group key may appear any number of times in a domain. It is + associated with a number of other keys in the same group. The + relative positions of entries with the keys in a single group + matters, but entries with keys not in the group may be freely + interspersed. By default, the group has a value equal to all keys + and values it contains, from the highest-priority domain in which any + of its keys occurs. + + Magic: + + If the '/' flag is specified for an entry, it sets the value for + that entry to an empty list. (This will cause a higher-priority + domain to clear a list from a lower-priority domain, without + actually adding any entries.) + + If the '+' flag is specified for the first entry in a list or a + group that appears in a given domain, that list or group is + appended to the list or group from the next-lowest-priority + domain, rather than replacing it. + +3. High-level semantics + + There are further constraints on the values that each entry can take. + These constraints are out-of-scope for this document. + +4. Examples + + (Indentation is removed in this section, to avoid confusion.) + +4.1. Syntax examples + +# Here is a simple configuration entry. The key is "Foo"; the value is +# "Bar" + +Foo Bar + +# A configuration entry can have spaces in its value, as below. Here the +# key is "Foo" and the value is "Bar Baz" +Foo Bar Baz + +# This configuration entry has space at the end of the line, but those +# spaces don't count, so the key and value are still "Foo" and "Bar Baz" +Foo Bar Baz + +# There can be an escaped newline between the value and the key. This +# is another way to say key="Hello", value="World" +Hello\ +World + +# In regular entries of this kind, you can have a comment at the end of +# the line, either with a space before it or not. Each of these is a +# different spelling of key="Hello", value="World" + +Hello World #today +Hello World#tomorrow + +# One way to encode a complex entry is as a C string. This is the same +# as key="Hello", value="World!" +Hello "World!" + +# The string can contain the usual set of C escapes. This entry has +# key="Hello", and value="\"World\"\nand\nuniverse" +Hello "\"World\"\nand\nuniverse" + +# And now we get to the more-or-less awful part. +# +# Multi-line entries ending with a backslash on each line aren't so +# bad. The backslash is removed, and everything else is included +# verbatim. So this entry has key="Hello" and value="Worldandfriends" +Hello\ +World\ +and\ +friends + +# Backslashes in the middle of a line are included as-is. The key of +# this one is "Too" and the value is "Many\\Backsl\ashes \here" (with +# backslashes in that last string as-is) +Too \ +Many\\\ +Backsl\ashes \\ +here + +# And here's the really yucky part. If a comment appears in a multi-line +# entry, the entry is still able to continue on the next line, as in the +# following, where the key is "This" and the value is +# "entry and some are silly" +This entry \ + # has comments \ + and some \ + are # generally \ + silly + +# But you can also write that without the backslashes at the end of the +# comment lines. That is to say, this entry is exactly the same as the +# one above! +This entry \ + # has comments + and some \ + are # generally + silly + + + diff --git a/src/wraith/m4/ax_check_sign.m4 b/src/wraith/m4/ax_check_sign.m4 new file mode 100644 index 000000000..d67e114db --- /dev/null +++ b/src/wraith/m4/ax_check_sign.m4 @@ -0,0 +1,54 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_sign.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_SIGN (TYPE, [ACTION-IF-SIGNED], [ACTION-IF-UNSIGNED], [INCLUDES]) +# +# DESCRIPTION +# +# Checks whether TYPE is signed or not. If no INCLUDES are specified, the +# default includes are used. If ACTION-IF-SIGNED is given, it is +# additional shell code to execute when the type is signed. If +# ACTION-IF-UNSIGNED is given, it is executed when the type is unsigned. +# +# This macro assumes that the type exists. Therefore the existence of the +# type should be checked before calling this macro. For example: +# +# AC_CHECK_HEADERS([wchar.h]) +# AC_CHECK_TYPE([wchar_t],,[ AC_MSG_ERROR([Type wchar_t not found.]) ]) +# AX_CHECK_SIGN([wchar_t], +# [ AC_DEFINE(WCHAR_T_SIGNED, 1, [Define if wchar_t is signed]) ], +# [ AC_DEFINE(WCHAR_T_UNSIGNED, 1, [Define if wchar_t is unsigned]) ], [ +# #ifdef HAVE_WCHAR_H +# #include +# #endif +# ]) +# +# LICENSE +# +# Copyright (c) 2008 Ville Laurikari +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 6 + +AU_ALIAS([VL_CHECK_SIGN], [AX_CHECK_SIGN]) +AC_DEFUN([AX_CHECK_SIGN], [ + typename=`echo $1 | sed "s/@<:@^a-zA-Z0-9_@:>@/_/g"` + AC_CACHE_CHECK([whether $1 is signed], ax_cv_decl_${typename}_signed, [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$4]], + [[ int foo @<:@ 1 - 2 * !((($1) -1) < 0) @:>@ ]])], + [ eval "ax_cv_decl_${typename}_signed=\"yes\"" ], + [ eval "ax_cv_decl_${typename}_signed=\"no\"" ])]) + symbolname=`echo $1 | sed "s/@<:@^a-zA-Z0-9_@:>@/_/g" | tr "a-z" "A-Z"` + if eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"yes\""; then + $2 + elif eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"no\""; then + $3 + fi +])dnl diff --git a/src/wraith/m4/pc_from_ucontext.m4 b/src/wraith/m4/pc_from_ucontext.m4 new file mode 100644 index 000000000..9b66bf752 --- /dev/null +++ b/src/wraith/m4/pc_from_ucontext.m4 @@ -0,0 +1,128 @@ +# This file is from Google Performance Tools, svn revision r226. +# +# The Google Performance Tools license is: +######## +# Copyright (c) 2005, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +######## +# Original file follows below. + +# We want to access the "PC" (Program Counter) register from a struct +# ucontext. Every system has its own way of doing that. We try all the +# possibilities we know about. Note REG_PC should come first (REG_RIP +# is also defined on solaris, but does the wrong thing). + +# OpenBSD doesn't have ucontext.h, but we can get PC from ucontext_t +# by using signal.h. + +# The first argument of AC_PC_FROM_UCONTEXT will be invoked when we +# cannot find a way to obtain PC from ucontext. + +AC_DEFUN([AC_PC_FROM_UCONTEXT], + [AC_CHECK_HEADERS(ucontext.h) + # Redhat 7 has , but it barfs if we #include it directly + # (this was fixed in later redhats). works fine, so use that. + if grep "Red Hat Linux release 7" /etc/redhat-release >/dev/null 2>&1; then + AC_DEFINE(HAVE_SYS_UCONTEXT_H, 0, [ is broken on redhat 7]) + ac_cv_header_sys_ucontext_h=no + else + AC_CHECK_HEADERS(sys/ucontext.h) # ucontext on OS X 10.6 (at least) + fi + AC_CHECK_HEADERS(cygwin/signal.h) # ucontext on cywgin + AC_MSG_CHECKING([how to access the program counter from a struct ucontext]) + pc_fields=" uc_mcontext.gregs[[REG_PC]]" # Solaris x86 (32 + 64 bit) + pc_fields="$pc_fields uc_mcontext.gregs[[REG_EIP]]" # Linux (i386) + pc_fields="$pc_fields uc_mcontext.gregs[[REG_RIP]]" # Linux (x86_64) + pc_fields="$pc_fields uc_mcontext.sc_ip" # Linux (ia64) + pc_fields="$pc_fields uc_mcontext.uc_regs->gregs[[PT_NIP]]" # Linux (ppc) + pc_fields="$pc_fields uc_mcontext.gregs[[R15]]" # Linux (arm old [untested]) + pc_fields="$pc_fields uc_mcontext.arm_pc" # Linux (arm arch 5) + pc_fields="$pc_fields uc_mcontext.gp_regs[[PT_NIP]]" # Suse SLES 11 (ppc64) + pc_fields="$pc_fields uc_mcontext.mc_eip" # FreeBSD (i386) + pc_fields="$pc_fields uc_mcontext.mc_rip" # FreeBSD (x86_64 [untested]) + pc_fields="$pc_fields uc_mcontext.__gregs[[_REG_EIP]]" # NetBSD (i386) + pc_fields="$pc_fields uc_mcontext.__gregs[[_REG_RIP]]" # NetBSD (x86_64) + pc_fields="$pc_fields uc_mcontext->ss.eip" # OS X (i386, <=10.4) + pc_fields="$pc_fields uc_mcontext->__ss.__eip" # OS X (i386, >=10.5) + pc_fields="$pc_fields uc_mcontext->ss.rip" # OS X (x86_64) + pc_fields="$pc_fields uc_mcontext->__ss.__rip" # OS X (>=10.5 [untested]) + pc_fields="$pc_fields uc_mcontext->ss.srr0" # OS X (ppc, ppc64 [untested]) + pc_fields="$pc_fields uc_mcontext->__ss.__srr0" # OS X (>=10.5 [untested]) + pc_field_found=false + for pc_field in $pc_fields; do + if ! $pc_field_found; then + # Prefer sys/ucontext.h to ucontext.h, for OS X's sake. + if test "x$ac_cv_header_cygwin_signal_h" = xyes; then + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ucontext_t u; return u.$pc_field == 0;]])], + AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, + How to access the PC from a struct ucontext) + AC_MSG_RESULT([$pc_field]) + pc_field_found=true) + elif test "x$ac_cv_header_sys_ucontext_h" = xyes; then + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ucontext_t u; return u.$pc_field == 0;]])], + AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, + How to access the PC from a struct ucontext) + AC_MSG_RESULT([$pc_field]) + pc_field_found=true) + elif test "x$ac_cv_header_ucontext_h" = xyes; then + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ucontext_t u; return u.$pc_field == 0;]])], + AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, + How to access the PC from a struct ucontext) + AC_MSG_RESULT([$pc_field]) + pc_field_found=true) + else # hope some standard header gives it to us + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], + [[ucontext_t u; return u.$pc_field == 0;]])], + AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, + How to access the PC from a struct ucontext) + AC_MSG_RESULT([$pc_field]) + pc_field_found=true) + fi + fi + done + if ! $pc_field_found; then + pc_fields=" sc_eip" # OpenBSD (i386) + pc_fields="$pc_fields sc_rip" # OpenBSD (x86_64) + for pc_field in $pc_fields; do + if ! $pc_field_found; then + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ucontext_t u; return u.$pc_field == 0;]])], + AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, + How to access the PC from a struct ucontext) + AC_MSG_RESULT([$pc_field]) + pc_field_found=true) + fi + done + fi + if ! $pc_field_found; then + [$1] + fi]) diff --git a/src/wraith/m4/pkg.m4 b/src/wraith/m4/pkg.m4 new file mode 100644 index 000000000..c5b26b52e --- /dev/null +++ b/src/wraith/m4/pkg.m4 @@ -0,0 +1,214 @@ +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) +# +# Copyright © 2004 Scott James Remnant . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])# PKG_CHECK_MODULES + + +# PKG_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable pkgconfigdir as the location where a module +# should install pkg-config .pc files. By default the directory is +# $libdir/pkgconfig, but the default can be changed by passing +# DIRECTORY. The user can override through the --with-pkgconfigdir +# parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_INSTALLDIR + + +# PKG_NOARCH_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable noarch_pkgconfigdir as the location where a +# module should install arch-independent pkg-config .pc files. By +# default the directory is $datadir/pkgconfig, but the default can be +# changed by passing DIRECTORY. The user can override through the +# --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_NOARCH_INSTALLDIR + + +# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# ------------------------------------------- +# Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])# PKG_CHECK_VAR diff --git a/src/wraith/mach-default/setup.c b/src/wraith/mach-default/setup.c new file mode 100644 index 000000000..0aa08eaa8 --- /dev/null +++ b/src/wraith/mach-default/setup.c @@ -0,0 +1,106 @@ +/* + * Machine specific setup for generic + */ + +#include +#include +#include +#include +#include +#include +#include + +/** + * pre_intr_init_hook - initialisation prior to setting up interrupt vectors + * + * Description: + * Perform any necessary interrupt initialisation prior to setting up + * the "ordinary" interrupt call gates. For legacy reasons, the ISA + * interrupts should be initialised here if the machine emulates a PC + * in any way. + **/ +void __init pre_intr_init_hook(void) +{ + init_ISA_irqs(); +} + +/* + * IRQ2 is cascade interrupt to second interrupt controller + */ +static struct irqaction irq2 = { no_action, 0, CPU_MASK_NONE, "cascade", NULL, NULL}; + +/** + * intr_init_hook - post gate setup interrupt initialisation + * + * Description: + * Fill in any interrupts that may have been left out by the general + * init_IRQ() routine. interrupts having to do with the machine rather + * than the devices on the I/O bus (like APIC interrupts in intel MP + * systems) are started here. + **/ +void __init intr_init_hook(void) +{ +#ifdef CONFIG_X86_LOCAL_APIC + apic_intr_init(); +#endif + + if (!acpi_ioapic) + setup_irq(2, &irq2); +} + +/** + * pre_setup_arch_hook - hook called prior to any setup_arch() execution + * + * Description: + * generally used to activate any machine specific identification + * routines that may be needed before setup_arch() runs. On VISWS + * this is used to get the board revision and type. + **/ +void __init pre_setup_arch_hook(void) +{ +} + +/** + * trap_init_hook - initialise system specific traps + * + * Description: + * Called as the final act of trap_init(). Used in VISWS to initialise + * the various board specific APIC traps. + **/ +void __init trap_init_hook(void) +{ +} + +static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, CPU_MASK_NONE, "timer", NULL, NULL}; + +/** + * time_init_hook - do any specific initialisations for the system timer. + * + * Description: + * Must plug the system timer interrupt source at HZ into the IRQ listed + * in irq_vectors.h:TIMER_IRQ + **/ +void __init time_init_hook(void) +{ + setup_irq(0, &irq0); +} + +#ifdef CONFIG_MCA +/** + * mca_nmi_hook - hook into MCA specific NMI chain + * + * Description: + * The MCA (Microchannel Arcitecture) has an NMI chain for NMI sources + * along the MCA bus. Use this to hook into that chain if you will need + * it. + **/ +void __init mca_nmi_hook(void) +{ + /* If I recall correctly, there's a whole bunch of other things that + * we can do to check for NMI problems, but that's all I know about + * at the moment. + */ + + printk("NMI generated from unknown source!\n"); +} +#endif diff --git a/src/wraith/mach-default/topology.c b/src/wraith/mach-default/topology.c new file mode 100644 index 000000000..37bfa9144 --- /dev/null +++ b/src/wraith/mach-default/topology.c @@ -0,0 +1,67 @@ +/* + * arch/i386/mach-generic/topology.c - Populate driverfs with topology information + * + * Written by: Matthew Dobson, IBM Corporation + * Original Code: Paul Dorwin, IBM Corporation, Patrick Mochel, OSDL + * + * Copyright (C) 2002, IBM Corp. + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or + * NON INFRINGEMENT. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Send feedback to + */ +#include +#include +#include +#include + +struct i386_cpu cpu_devices[NR_CPUS]; + +#ifdef CONFIG_NUMA +#include +#include + +struct i386_node node_devices[MAX_NUMNODES]; + +static int __init topology_init(void) +{ + int i; + + for (i = 0; i < MAX_NUMNODES; i++) { + if (node_online(i)) + arch_register_node(i); + } + for (i = 0; i < NR_CPUS; i++) + if (cpu_possible(i)) arch_register_cpu(i); + return 0; +} + +#else /* !CONFIG_NUMA */ + +static int __init topology_init(void) +{ + int i; + + for (i = 0; i < NR_CPUS; i++) + if (cpu_possible(i)) arch_register_cpu(i); + return 0; +} + +#endif /* CONFIG_NUMA */ + +subsys_initcall(topology_init); diff --git a/src/wraith/mach-es7000/es7000.h b/src/wraith/mach-es7000/es7000.h new file mode 100644 index 000000000..70691f0c4 --- /dev/null +++ b/src/wraith/mach-es7000/es7000.h @@ -0,0 +1,110 @@ +/* + * Written by: Garry Forsgren, Unisys Corporation + * Natalie Protasevich, Unisys Corporation + * This file contains the code to configure and interface + * with Unisys ES7000 series hardware system manager. + * + * Copyright (c) 2003 Unisys Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston MA 02111-1307, USA. + * + * Contact information: Unisys Corporation, Township Line & Union Meeting + * Roads-A, Unisys Way, Blue Bell, Pennsylvania, 19424, or: + * + * http://www.unisys.com + */ + +#define MIP_REG 1 +#define MIP_PSAI_REG 4 + +#define MIP_BUSY 1 +#define MIP_SPIN 0xf0000 +#define MIP_VALID 0x0100000000000000ULL +#define MIP_PORT(VALUE) ((VALUE >> 32) & 0xffff) + +#define MIP_RD_LO(VALUE) (VALUE & 0xffffffff) + +struct mip_reg_info { + unsigned long long mip_info; + unsigned long long delivery_info; + unsigned long long host_reg; + unsigned long long mip_reg; +}; + +struct part_info { + unsigned char type; + unsigned char length; + unsigned char part_id; + unsigned char apic_mode; + unsigned long snum; + char ptype[16]; + char sname[64]; + char pname[64]; +}; + +struct psai { + unsigned long long entry_type; + unsigned long long addr; + unsigned long long bep_addr; +}; + +struct es7000_mem_info { + unsigned char type; + unsigned char length; + unsigned char resv[6]; + unsigned long long start; + unsigned long long size; +}; + +struct es7000_oem_table { + unsigned long long hdr; + struct mip_reg_info mip; + struct part_info pif; + struct es7000_mem_info shm; + struct psai psai; +}; + +struct acpi_table_sdt { + unsigned long pa; + unsigned long count; + struct { + unsigned long pa; + enum acpi_table_id id; + unsigned long size; + } entry[50]; +}; + +struct oem_table { + struct acpi_table_header Header; + u32 OEMTableAddr; + u32 OEMTableSize; +}; + +struct mip_reg { + unsigned long long off_0; + unsigned long long off_8; + unsigned long long off_10; + unsigned long long off_18; + unsigned long long off_20; + unsigned long long off_28; + unsigned long long off_30; + unsigned long long off_38; +}; + +#define MIP_SW_APIC 0x1020b +#define MIP_FUNC(VALUE) (VALUE & 0xff) + +extern int parse_unisys_oem (char *oemptr, int oem_entries); +extern int find_unisys_acpi_oem_table(unsigned long *oem_addr, int *length); +extern int es7000_start_cpu(int cpu, unsigned long eip); +extern void es7000_sw_apic(void); diff --git a/src/wraith/mach-es7000/es7000plat.c b/src/wraith/mach-es7000/es7000plat.c new file mode 100644 index 000000000..9707a9e45 --- /dev/null +++ b/src/wraith/mach-es7000/es7000plat.c @@ -0,0 +1,304 @@ +/* + * Written by: Garry Forsgren, Unisys Corporation + * Natalie Protasevich, Unisys Corporation + * This file contains the code to configure and interface + * with Unisys ES7000 series hardware system manager. + * + * Copyright (c) 2003 Unisys Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston MA 02111-1307, USA. + * + * Contact information: Unisys Corporation, Township Line & Union Meeting + * Roads-A, Unisys Way, Blue Bell, Pennsylvania, 19424, or: + * + * http://www.unisys.com + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "es7000.h" + +/* + * ES7000 Globals + */ + +volatile unsigned long *psai = NULL; +struct mip_reg *mip_reg; +struct mip_reg *host_reg; +int mip_port; +unsigned long mip_addr, host_addr; + +#if defined(CONFIG_X86_IO_APIC) && (defined(CONFIG_ACPI_INTERPRETER) || defined(CONFIG_ACPI_BOOT)) + +/* + * GSI override for ES7000 platforms. + */ + +static unsigned int base; + +static int +es7000_rename_gsi(int ioapic, int gsi) +{ + if (!base) { + int i; + for (i = 0; i < nr_ioapics; i++) + base += nr_ioapic_registers[i]; + } + + if (!ioapic && (gsi < 16)) + gsi += base; + return gsi; +} + +#endif // (CONFIG_X86_IO_APIC) && (CONFIG_ACPI_INTERPRETER || CONFIG_ACPI_BOOT) + +/* + * Parse the OEM Table + */ + +int __init +parse_unisys_oem (char *oemptr, int oem_entries) +{ + int i; + int success = 0; + unsigned char type, size; + unsigned long val; + char *tp = NULL; + struct psai *psaip = NULL; + struct mip_reg_info *mi; + struct mip_reg *host, *mip; + + tp = oemptr; + + tp += 8; + + for (i=0; i <= oem_entries; i++) { + type = *tp++; + size = *tp++; + tp -= 2; + switch (type) { + case MIP_REG: + mi = (struct mip_reg_info *)tp; + val = MIP_RD_LO(mi->host_reg); + host_addr = val; + host = (struct mip_reg *)val; + host_reg = __va(host); + val = MIP_RD_LO(mi->mip_reg); + mip_port = MIP_PORT(mi->mip_info); + mip_addr = val; + mip = (struct mip_reg *)val; + mip_reg = __va(mip); + Dprintk("es7000_mipcfg: host_reg = 0x%lx \n", + (unsigned long)host_reg); + Dprintk("es7000_mipcfg: mip_reg = 0x%lx \n", + (unsigned long)mip_reg); + success++; + break; + case MIP_PSAI_REG: + psaip = (struct psai *)tp; + if (tp != NULL) { + if (psaip->addr) + psai = __va(psaip->addr); + else + psai = NULL; + success++; + } + break; + default: + break; + } + if (i == 6) break; + tp += size; + } + + if (success < 2) { + es7000_plat = 0; + } else { + printk("\nEnabling ES7000 specific features...\n"); + es7000_plat = 1; + ioapic_renumber_irq = es7000_rename_gsi; + } + return es7000_plat; +} + +int __init +find_unisys_acpi_oem_table(unsigned long *oem_addr, int *length) +{ + struct acpi_table_rsdp *rsdp = NULL; + unsigned long rsdp_phys = 0; + struct acpi_table_header *header = NULL; + int i; + struct acpi_table_sdt sdt; + + rsdp_phys = acpi_find_rsdp(); + rsdp = __va(rsdp_phys); + if (rsdp->rsdt_address) { + struct acpi_table_rsdt *mapped_rsdt = NULL; + sdt.pa = rsdp->rsdt_address; + + header = (struct acpi_table_header *) + __acpi_map_table(sdt.pa, sizeof(struct acpi_table_header)); + if (!header) + return -ENODEV; + + sdt.count = (header->length - sizeof(struct acpi_table_header)) >> 3; + mapped_rsdt = (struct acpi_table_rsdt *) + __acpi_map_table(sdt.pa, header->length); + if (!mapped_rsdt) + return -ENODEV; + + header = &mapped_rsdt->header; + + for (i = 0; i < sdt.count; i++) + sdt.entry[i].pa = (unsigned long) mapped_rsdt->entry[i]; + }; + for (i = 0; i < sdt.count; i++) { + + header = (struct acpi_table_header *) + __acpi_map_table(sdt.entry[i].pa, + sizeof(struct acpi_table_header)); + if (!header) + continue; + if (!strncmp((char *) &header->signature, "OEM1", 4)) { + if (!strncmp((char *) &header->oem_id, "UNISYS", 6)) { + void *addr; + struct oem_table *t; + acpi_table_print(header, sdt.entry[i].pa); + t = (struct oem_table *) __acpi_map_table(sdt.entry[i].pa, header->length); + addr = (void *) __acpi_map_table(t->OEMTableAddr, t->OEMTableSize); + *length = header->length; + *oem_addr = (unsigned long) addr; + return 0; + } + } + } + Dprintk("ES7000: did not find Unisys ACPI OEM table!\n"); + return -1; +} + +static void +es7000_spin(int n) +{ + int i = 0; + + while (i++ < n) + rep_nop(); +} + +static int __init +es7000_mip_write(struct mip_reg *mip_reg) +{ + int status = 0; + int spin; + + spin = MIP_SPIN; + while (((unsigned long long)host_reg->off_38 & + (unsigned long long)MIP_VALID) != 0) { + if (--spin <= 0) { + printk("es7000_mip_write: Timeout waiting for Host Valid Flag"); + return -1; + } + es7000_spin(MIP_SPIN); + } + + memcpy(host_reg, mip_reg, sizeof(struct mip_reg)); + outb(1, mip_port); + + spin = MIP_SPIN; + + while (((unsigned long long)mip_reg->off_38 & + (unsigned long long)MIP_VALID) == 0) { + if (--spin <= 0) { + printk("es7000_mip_write: Timeout waiting for MIP Valid Flag"); + return -1; + } + es7000_spin(MIP_SPIN); + } + + status = ((unsigned long long)mip_reg->off_0 & + (unsigned long long)0xffff0000000000ULL) >> 48; + mip_reg->off_38 = ((unsigned long long)mip_reg->off_38 & + (unsigned long long)~MIP_VALID); + return status; +} + +int +es7000_start_cpu(int cpu, unsigned long eip) +{ + unsigned long vect = 0, psaival = 0; + + if (psai == NULL) + return -1; + + vect = ((unsigned long)__pa(eip)/0x1000) << 16; + psaival = (0x1000000 | vect | cpu); + + while (*psai & 0x1000000) + ; + + *psai = psaival; + + return 0; + +} + +int +es7000_stop_cpu(int cpu) +{ + int startup; + + if (psai == NULL) + return -1; + + startup= (0x1000000 | cpu); + + while ((*psai & 0xff00ffff) != startup) + ; + + startup = (*psai & 0xff0000) >> 16; + *psai &= 0xffffff; + + return 0; + +} + +void __init +es7000_sw_apic() +{ + if (es7000_plat) { + int mip_status; + struct mip_reg es7000_mip_reg; + + printk("ES7000: Enabling APIC mode.\n"); + memset(&es7000_mip_reg, 0, sizeof(struct mip_reg)); + es7000_mip_reg.off_0 = MIP_SW_APIC; + es7000_mip_reg.off_38 = (MIP_VALID); + while ((mip_status = es7000_mip_write(&es7000_mip_reg)) != 0) + printk("es7000_sw_apic: command failed, status = %x\n", + mip_status); + return; + } +} diff --git a/src/wraith/mach-generic/bigsmp.c b/src/wraith/mach-generic/bigsmp.c new file mode 100644 index 000000000..25883b44f --- /dev/null +++ b/src/wraith/mach-generic/bigsmp.c @@ -0,0 +1,54 @@ +/* + * APIC driver for "bigsmp" XAPIC machines with more than 8 virtual CPUs. + * Drives the local APIC in "clustered mode". + */ +#define APIC_DEFINITION 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int dmi_bigsmp; /* can be set by dmi scanners */ + +static __init int hp_ht_bigsmp(struct dmi_system_id *d) +{ +#ifdef CONFIG_X86_GENERICARCH + printk(KERN_NOTICE "%s detected: force use of apic=bigsmp\n", d->ident); + dmi_bigsmp = 1; +#endif + return 0; +} + + +static struct dmi_system_id __initdata bigsmp_dmi_table[] = { + { hp_ht_bigsmp, "HP ProLiant DL760 G2", { + DMI_MATCH(DMI_BIOS_VENDOR, "HP"), + DMI_MATCH(DMI_BIOS_VERSION, "P44-"), + }}, + + { hp_ht_bigsmp, "HP ProLiant DL740", { + DMI_MATCH(DMI_BIOS_VENDOR, "HP"), + DMI_MATCH(DMI_BIOS_VERSION, "P47-"), + }}, + { } +}; + + +static __init int probe_bigsmp(void) +{ + dmi_check_system(bigsmp_dmi_table); + return dmi_bigsmp; +} + +struct genapic apic_bigsmp = APIC_INIT("bigsmp", probe_bigsmp); diff --git a/src/wraith/mach-generic/default.c b/src/wraith/mach-generic/default.c new file mode 100644 index 000000000..7da14e9a7 --- /dev/null +++ b/src/wraith/mach-generic/default.c @@ -0,0 +1,27 @@ +/* + * Default generic APIC driver. This handles upto 8 CPUs. + */ +#define APIC_DEFINITION 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* should be called last. */ +static __init int probe_default(void) +{ + return 1; +} + +struct genapic apic_default = APIC_INIT("default", probe_default); diff --git a/src/wraith/mach-generic/es7000.c b/src/wraith/mach-generic/es7000.c new file mode 100644 index 000000000..48d3ec372 --- /dev/null +++ b/src/wraith/mach-generic/es7000.c @@ -0,0 +1,28 @@ +/* + * APIC driver for the Unisys ES7000 chipset. + */ +#define APIC_DEFINITION 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static __init int probe_es7000(void) +{ + /* probed later in mptable/ACPI hooks */ + return 0; +} + +struct genapic apic_es7000 = APIC_INIT("es7000", probe_es7000); diff --git a/src/wraith/mach-generic/probe.c b/src/wraith/mach-generic/probe.c new file mode 100644 index 000000000..5497c65a8 --- /dev/null +++ b/src/wraith/mach-generic/probe.c @@ -0,0 +1,102 @@ +/* Copyright 2003 Andi Kleen, SuSE Labs. + * Subject to the GNU Public License, v.2 + * + * Generic x86 APIC driver probe layer. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern struct genapic apic_summit; +extern struct genapic apic_bigsmp; +extern struct genapic apic_es7000; +extern struct genapic apic_default; + +struct genapic *genapic = &apic_default; + +struct genapic *apic_probe[] __initdata = { + &apic_summit, + &apic_bigsmp, + &apic_es7000, + &apic_default, /* must be last */ + NULL, +}; + +void __init generic_apic_probe(char *command_line) +{ + char *s; + int i; + int changed = 0; + + s = strstr(command_line, "apic="); + if (s && (s == command_line || isspace(s[-1]))) { + char *p = strchr(s, ' '), old; + if (!p) + p = strchr(s, '\0'); + old = *p; + *p = 0; + for (i = 0; !changed && apic_probe[i]; i++) { + if (!strcmp(apic_probe[i]->name, s+5)) { + changed = 1; + genapic = apic_probe[i]; + } + } + if (!changed) + printk(KERN_ERR "Unknown genapic `%s' specified.\n", s); + *p = old; + } + for (i = 0; !changed && apic_probe[i]; i++) { + if (apic_probe[i]->probe()) { + changed = 1; + genapic = apic_probe[i]; + } + } + /* Not visible without early console */ + if (!changed) + panic("Didn't find an APIC driver"); + + printk(KERN_INFO "Using APIC driver %s\n", genapic->name); +} + +/* These functions can switch the APIC even after the initial ->probe() */ + +int __init mps_oem_check(struct mp_config_table *mpc, char *oem, char *productid) +{ + int i; + for (i = 0; apic_probe[i]; ++i) { + if (apic_probe[i]->mps_oem_check(mpc,oem,productid)) { + genapic = apic_probe[i]; + printk(KERN_INFO "Switched to APIC driver `%s'.\n", + genapic->name); + return 1; + } + } + return 0; +} + +int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id) +{ + int i; + for (i = 0; apic_probe[i]; ++i) { + if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) { + genapic = apic_probe[i]; + printk(KERN_INFO "Switched to APIC driver `%s'.\n", + genapic->name); + return 1; + } + } + return 0; +} + +int hard_smp_processor_id(void) +{ + return genapic->get_apic_id(*(unsigned long *)(APIC_BASE+APIC_ID)); +} diff --git a/src/wraith/mach-generic/summit.c b/src/wraith/mach-generic/summit.c new file mode 100644 index 000000000..65ddf74d7 --- /dev/null +++ b/src/wraith/mach-generic/summit.c @@ -0,0 +1,27 @@ +/* + * APIC driver for the IBM "Summit" chipset. + */ +#define APIC_DEFINITION 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static __init int probe_summit(void) +{ + /* probed later in mptable/ACPI hooks */ + return 0; +} + +struct genapic apic_summit = APIC_INIT("summit", probe_summit); diff --git a/src/wraith/mach-visws/mpparse.c b/src/wraith/mach-visws/mpparse.c new file mode 100644 index 000000000..fa800641a --- /dev/null +++ b/src/wraith/mach-visws/mpparse.c @@ -0,0 +1,105 @@ + +#include +#include +#include + +#include +#include + +#include "cobalt.h" +#include "mach_apic.h" + +/* Have we found an MP table */ +int smp_found_config; + +/* + * Various Linux-internal data structures created from the + * MP-table. + */ +int apic_version [MAX_APICS]; + +int pic_mode; +unsigned long mp_lapic_addr; + +/* Processor that is doing the boot up */ +unsigned int boot_cpu_physical_apicid = -1U; +unsigned int boot_cpu_logical_apicid = -1U; + +/* Bitmask of physically existing CPUs */ +physid_mask_t phys_cpu_present_map; + +unsigned int __initdata maxcpus = NR_CPUS; + +/* + * The Visual Workstation is Intel MP compliant in the hardware + * sense, but it doesn't have a BIOS(-configuration table). + * No problem for Linux. + */ + +void __init MP_processor_info (struct mpc_config_processor *m) +{ + int ver, logical_apicid; + physid_mask_t apic_cpus; + + if (!(m->mpc_cpuflag & CPU_ENABLED)) + return; + + logical_apicid = m->mpc_apicid; + printk(KERN_INFO "%sCPU #%d %ld:%ld APIC version %d\n", + m->mpc_cpuflag & CPU_BOOTPROCESSOR ? "Bootup " : "", + m->mpc_apicid, + (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8, + (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4, + m->mpc_apicver); + + if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) { + boot_cpu_physical_apicid = m->mpc_apicid; + boot_cpu_logical_apicid = logical_apicid; + } + + ver = m->mpc_apicver; + if ((ver >= 0x14 && m->mpc_apicid >= 0xff) || m->mpc_apicid >= 0xf) { + printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n", + m->mpc_apicid, MAX_APICS); + return; + } + + apic_cpus = apicid_to_cpu_present(m->mpc_apicid); + physids_or(phys_cpu_present_map, phys_cpu_present_map, apic_cpus); + /* + * Validate version + */ + if (ver == 0x0) { + printk(KERN_ERR "BIOS bug, APIC version is 0 for CPU#%d! " + "fixing up to 0x10. (tell your hw vendor)\n", + m->mpc_apicid); + ver = 0x10; + } + apic_version[m->mpc_apicid] = ver; +} + +void __init find_smp_config(void) +{ + struct mpc_config_processor *mp = phys_to_virt(CO_CPU_TAB_PHYS); + unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS)); + + if (ncpus > CO_CPU_MAX) { + printk(KERN_WARNING "find_visws_smp: got cpu count of %d at %p\n", + ncpus, mp); + + ncpus = CO_CPU_MAX; + } + + if (ncpus > maxcpus) + ncpus = maxcpus; + + smp_found_config = 1; + while (ncpus--) + MP_processor_info(mp++); + + mp_lapic_addr = APIC_DEFAULT_PHYS_BASE; +} + +void __init get_smp_config (void) +{ +} diff --git a/src/wraith/mach-visws/reboot.c b/src/wraith/mach-visws/reboot.c new file mode 100644 index 000000000..8fc9fdc75 --- /dev/null +++ b/src/wraith/mach-visws/reboot.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include + +#include +#include "piix4.h" + +void (*pm_power_off)(void); + +int reboot_thru_bios; +int reboot_smp; + +void machine_restart(char * __unused) +{ +#ifdef CONFIG_SMP + smp_send_stop(); +#endif + + /* + * Visual Workstations restart after this + * register is poked on the PIIX4 + */ + outb(PIIX4_RESET_VAL, PIIX4_RESET_PORT); +} + +EXPORT_SYMBOL(machine_restart); + +void machine_power_off(void) +{ + unsigned short pm_status; + extern unsigned int pci_bus0; + + while ((pm_status = inw(PMSTS_PORT)) & 0x100) + outw(pm_status, PMSTS_PORT); + + outw(PM_SUSPEND_ENABLE, PMCNTRL_PORT); + + mdelay(10); + +#define PCI_CONF1_ADDRESS(bus, devfn, reg) \ + (0x80000000 | (bus << 16) | (devfn << 8) | (reg & ~3)) + + outl(PCI_CONF1_ADDRESS(pci_bus0, SPECIAL_DEV, SPECIAL_REG), 0xCF8); + outl(PIIX_SPECIAL_STOP, 0xCFC); +} + +EXPORT_SYMBOL(machine_power_off); + +void machine_halt(void) +{ +} + +EXPORT_SYMBOL(machine_halt); diff --git a/src/wraith/mach-visws/setup.c b/src/wraith/mach-visws/setup.c new file mode 100644 index 000000000..9f6d2d9b1 --- /dev/null +++ b/src/wraith/mach-visws/setup.c @@ -0,0 +1,134 @@ +/* + * Unmaintained SGI Visual Workstation support. + * Split out from setup.c by davej@suse.de + */ + +#include +#include +#include +#include + +#include +#include +#include +#include "cobalt.h" +#include "piix4.h" + +char visws_board_type = -1; +char visws_board_rev = -1; + +void __init visws_get_board_type_and_rev(void) +{ + int raw; + + visws_board_type = (char)(inb_p(PIIX_GPI_BD_REG) & PIIX_GPI_BD_REG) + >> PIIX_GPI_BD_SHIFT; + /* + * Get Board rev. + * First, we have to initialize the 307 part to allow us access + * to the GPIO registers. Let's map them at 0x0fc0 which is right + * after the PIIX4 PM section. + */ + outb_p(SIO_DEV_SEL, SIO_INDEX); + outb_p(SIO_GP_DEV, SIO_DATA); /* Talk to GPIO regs. */ + + outb_p(SIO_DEV_MSB, SIO_INDEX); + outb_p(SIO_GP_MSB, SIO_DATA); /* MSB of GPIO base address */ + + outb_p(SIO_DEV_LSB, SIO_INDEX); + outb_p(SIO_GP_LSB, SIO_DATA); /* LSB of GPIO base address */ + + outb_p(SIO_DEV_ENB, SIO_INDEX); + outb_p(1, SIO_DATA); /* Enable GPIO registers. */ + + /* + * Now, we have to map the power management section to write + * a bit which enables access to the GPIO registers. + * What lunatic came up with this shit? + */ + outb_p(SIO_DEV_SEL, SIO_INDEX); + outb_p(SIO_PM_DEV, SIO_DATA); /* Talk to GPIO regs. */ + + outb_p(SIO_DEV_MSB, SIO_INDEX); + outb_p(SIO_PM_MSB, SIO_DATA); /* MSB of PM base address */ + + outb_p(SIO_DEV_LSB, SIO_INDEX); + outb_p(SIO_PM_LSB, SIO_DATA); /* LSB of PM base address */ + + outb_p(SIO_DEV_ENB, SIO_INDEX); + outb_p(1, SIO_DATA); /* Enable PM registers. */ + + /* + * Now, write the PM register which enables the GPIO registers. + */ + outb_p(SIO_PM_FER2, SIO_PM_INDEX); + outb_p(SIO_PM_GP_EN, SIO_PM_DATA); + + /* + * Now, initialize the GPIO registers. + * We want them all to be inputs which is the + * power on default, so let's leave them alone. + * So, let's just read the board rev! + */ + raw = inb_p(SIO_GP_DATA1); + raw &= 0x7f; /* 7 bits of valid board revision ID. */ + + if (visws_board_type == VISWS_320) { + if (raw < 0x6) { + visws_board_rev = 4; + } else if (raw < 0xc) { + visws_board_rev = 5; + } else { + visws_board_rev = 6; + } + } else if (visws_board_type == VISWS_540) { + visws_board_rev = 2; + } else { + visws_board_rev = raw; + } + + printk(KERN_INFO "Silicon Graphics Visual Workstation %s (rev %d) detected\n", + (visws_board_type == VISWS_320 ? "320" : + (visws_board_type == VISWS_540 ? "540" : + "unknown")), visws_board_rev); +} + +void __init pre_intr_init_hook(void) +{ + init_VISWS_APIC_irqs(); +} + +void __init intr_init_hook(void) +{ +#ifdef CONFIG_X86_LOCAL_APIC + apic_intr_init(); +#endif +} + +void __init pre_setup_arch_hook() +{ + visws_get_board_type_and_rev(); +} + +static struct irqaction irq0 = { + .handler = timer_interrupt, + .flags = SA_INTERRUPT, + .name = "timer", +}; + +void __init time_init_hook(void) +{ + printk(KERN_INFO "Starting Cobalt Timer system clock\n"); + + /* Set the countdown value */ + co_cpu_write(CO_CPU_TIMEVAL, CO_TIME_HZ/HZ); + + /* Start the timer */ + co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) | CO_CTRL_TIMERUN); + + /* Enable (unmask) the timer interrupt */ + co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) & ~CO_CTRL_TIMEMASK); + + /* Wire cpu IDT entry to s/w handler (and Cobalt APIC to IDT) */ + setup_irq(0, &irq0); +} diff --git a/src/wraith/mach-visws/traps.c b/src/wraith/mach-visws/traps.c new file mode 100644 index 000000000..964353992 --- /dev/null +++ b/src/wraith/mach-visws/traps.c @@ -0,0 +1,69 @@ +/* VISWS traps */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "cobalt.h" +#include "lithium.h" + + +#define A01234 (LI_INTA_0 | LI_INTA_1 | LI_INTA_2 | LI_INTA_3 | LI_INTA_4) +#define BCD (LI_INTB | LI_INTC | LI_INTD) +#define ALLDEVS (A01234 | BCD) + +static __init void lithium_init(void) +{ + set_fixmap(FIX_LI_PCIA, LI_PCI_A_PHYS); + set_fixmap(FIX_LI_PCIB, LI_PCI_B_PHYS); + + if ((li_pcia_read16(PCI_VENDOR_ID) != PCI_VENDOR_ID_SGI) || + (li_pcia_read16(PCI_DEVICE_ID) != PCI_VENDOR_ID_SGI_LITHIUM)) { + printk(KERN_EMERG "Lithium hostbridge %c not found\n", 'A'); + panic("This machine is not SGI Visual Workstation 320/540"); + } + + if ((li_pcib_read16(PCI_VENDOR_ID) != PCI_VENDOR_ID_SGI) || + (li_pcib_read16(PCI_DEVICE_ID) != PCI_VENDOR_ID_SGI_LITHIUM)) { + printk(KERN_EMERG "Lithium hostbridge %c not found\n", 'B'); + panic("This machine is not SGI Visual Workstation 320/540"); + } + + li_pcia_write16(LI_PCI_INTEN, ALLDEVS); + li_pcib_write16(LI_PCI_INTEN, ALLDEVS); +} + +static __init void cobalt_init(void) +{ + /* + * On normal SMP PC this is used only with SMP, but we have to + * use it and set it up here to start the Cobalt clock + */ + set_fixmap(FIX_APIC_BASE, APIC_DEFAULT_PHYS_BASE); + setup_local_APIC(); + printk(KERN_INFO "Local APIC Version %#lx, ID %#lx\n", + apic_read(APIC_LVR), apic_read(APIC_ID)); + + set_fixmap(FIX_CO_CPU, CO_CPU_PHYS); + set_fixmap(FIX_CO_APIC, CO_APIC_PHYS); + printk(KERN_INFO "Cobalt Revision %#lx, APIC ID %#lx\n", + co_cpu_read(CO_CPU_REV), co_apic_read(CO_APIC_ID)); + + /* Enable Cobalt APIC being careful to NOT change the ID! */ + co_apic_write(CO_APIC_ID, co_apic_read(CO_APIC_ID) | CO_APIC_ENABLE); + + printk(KERN_INFO "Cobalt APIC enabled: ID reg %#lx\n", + co_apic_read(CO_APIC_ID)); +} + +void __init trap_init_hook(void) +{ + lithium_init(); + cobalt_init(); +} diff --git a/src/wraith/mach-visws/visws_apic.c b/src/wraith/mach-visws/visws_apic.c new file mode 100644 index 000000000..818a2c5ae --- /dev/null +++ b/src/wraith/mach-visws/visws_apic.c @@ -0,0 +1,303 @@ +/* + * linux/arch/i386/mach_visws/visws_apic.c + * + * Copyright (C) 1999 Bent Hagemark, Ingo Molnar + * + * SGI Visual Workstation interrupt controller + * + * The Cobalt system ASIC in the Visual Workstation contains a "Cobalt" APIC + * which serves as the main interrupt controller in the system. Non-legacy + * hardware in the system uses this controller directly. Legacy devices + * are connected to the PIIX4 which in turn has its 8259(s) connected to + * a of the Cobalt APIC entry. + * + * 09/02/2000 - Updated for 2.4 by jbarnes@sgi.com + * + * 25/11/2002 - Updated for 2.5 by Andrey Panin + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "cobalt.h" +#include "irq_vectors.h" + + +static spinlock_t cobalt_lock = SPIN_LOCK_UNLOCKED; + +/* + * Set the given Cobalt APIC Redirection Table entry to point + * to the given IDT vector/index. + */ +static inline void co_apic_set(int entry, int irq) +{ + co_apic_write(CO_APIC_LO(entry), CO_APIC_LEVEL | (irq + FIRST_EXTERNAL_VECTOR)); + co_apic_write(CO_APIC_HI(entry), 0); +} + +/* + * Cobalt (IO)-APIC functions to handle PCI devices. + */ +static inline int co_apic_ide0_hack(void) +{ + extern char visws_board_type; + extern char visws_board_rev; + + if (visws_board_type == VISWS_320 && visws_board_rev == 5) + return 5; + return CO_APIC_IDE0; +} + +static int is_co_apic(unsigned int irq) +{ + if (IS_CO_APIC(irq)) + return CO_APIC(irq); + + switch (irq) { + case 0: return CO_APIC_CPU; + case CO_IRQ_IDE0: return co_apic_ide0_hack(); + case CO_IRQ_IDE1: return CO_APIC_IDE1; + default: return -1; + } +} + + +/* + * This is the SGI Cobalt (IO-)APIC: + */ + +static void enable_cobalt_irq(unsigned int irq) +{ + co_apic_set(is_co_apic(irq), irq); +} + +static void disable_cobalt_irq(unsigned int irq) +{ + int entry = is_co_apic(irq); + + co_apic_write(CO_APIC_LO(entry), CO_APIC_MASK); + co_apic_read(CO_APIC_LO(entry)); +} + +/* + * "irq" really just serves to identify the device. Here is where we + * map this to the Cobalt APIC entry where it's physically wired. + * This is called via request_irq -> setup_irq -> irq_desc->startup() + */ +static unsigned int startup_cobalt_irq(unsigned int irq) +{ + unsigned long flags; + + spin_lock_irqsave(&cobalt_lock, flags); + if ((irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS | IRQ_WAITING))) + irq_desc[irq].status &= ~(IRQ_DISABLED | IRQ_INPROGRESS | IRQ_WAITING); + enable_cobalt_irq(irq); + spin_unlock_irqrestore(&cobalt_lock, flags); + return 0; +} + +static void ack_cobalt_irq(unsigned int irq) +{ + unsigned long flags; + + spin_lock_irqsave(&cobalt_lock, flags); + disable_cobalt_irq(irq); + apic_write(APIC_EOI, APIC_EIO_ACK); + spin_unlock_irqrestore(&cobalt_lock, flags); +} + +static void end_cobalt_irq(unsigned int irq) +{ + unsigned long flags; + + spin_lock_irqsave(&cobalt_lock, flags); + if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) + enable_cobalt_irq(irq); + spin_unlock_irqrestore(&cobalt_lock, flags); +} + +static struct hw_interrupt_type cobalt_irq_type = { + .typename = "Cobalt-APIC", + .startup = startup_cobalt_irq, + .shutdown = disable_cobalt_irq, + .enable = enable_cobalt_irq, + .disable = disable_cobalt_irq, + .ack = ack_cobalt_irq, + .end = end_cobalt_irq, +}; + + +/* + * This is the PIIX4-based 8259 that is wired up indirectly to Cobalt + * -- not the manner expected by the code in i8259.c. + * + * there is a 'master' physical interrupt source that gets sent to + * the CPU. But in the chipset there are various 'virtual' interrupts + * waiting to be handled. We represent this to Linux through a 'master' + * interrupt controller type, and through a special virtual interrupt- + * controller. Device drivers only see the virtual interrupt sources. + */ +static unsigned int startup_piix4_master_irq(unsigned int irq) +{ + init_8259A(0); + + return startup_cobalt_irq(irq); +} + +static void end_piix4_master_irq(unsigned int irq) +{ + unsigned long flags; + + spin_lock_irqsave(&cobalt_lock, flags); + enable_cobalt_irq(irq); + spin_unlock_irqrestore(&cobalt_lock, flags); +} + +static struct hw_interrupt_type piix4_master_irq_type = { + .typename = "PIIX4-master", + .startup = startup_piix4_master_irq, + .ack = ack_cobalt_irq, + .end = end_piix4_master_irq, +}; + + +static struct hw_interrupt_type piix4_virtual_irq_type = { + .typename = "PIIX4-virtual", + .startup = startup_8259A_irq, + .shutdown = disable_8259A_irq, + .enable = enable_8259A_irq, + .disable = disable_8259A_irq, +}; + + +/* + * PIIX4-8259 master/virtual functions to handle interrupt requests + * from legacy devices: floppy, parallel, serial, rtc. + * + * None of these get Cobalt APIC entries, neither do they have IDT + * entries. These interrupts are purely virtual and distributed from + * the 'master' interrupt source: CO_IRQ_8259. + * + * When the 8259 interrupts its handler figures out which of these + * devices is interrupting and dispatches to its handler. + * + * CAREFUL: devices see the 'virtual' interrupt only. Thus disable/ + * enable_irq gets the right irq. This 'master' irq is never directly + * manipulated by any driver. + */ +static irqreturn_t piix4_master_intr(int irq, void *dev_id, struct pt_regs * regs) +{ + int realirq; + irq_desc_t *desc; + unsigned long flags; + + spin_lock_irqsave(&i8259A_lock, flags); + + /* Find out what's interrupting in the PIIX4 master 8259 */ + outb(0x0c, 0x20); /* OCW3 Poll command */ + realirq = inb(0x20); + + /* + * Bit 7 == 0 means invalid/spurious + */ + if (unlikely(!(realirq & 0x80))) + goto out_unlock; + + realirq &= 7; + + if (unlikely(realirq == 2)) { + outb(0x0c, 0xa0); + realirq = inb(0xa0); + + if (unlikely(!(realirq & 0x80))) + goto out_unlock; + + realirq = (realirq & 7) + 8; + } + + /* mask and ack interrupt */ + cached_irq_mask |= 1 << realirq; + if (unlikely(realirq > 7)) { + inb(0xa1); + outb(cached_slave_mask, 0xa1); + outb(0x60 + (realirq & 7), 0xa0); + outb(0x60 + 2, 0x20); + } else { + inb(0x21); + outb(cached_master_mask, 0x21); + outb(0x60 + realirq, 0x20); + } + + spin_unlock_irqrestore(&i8259A_lock, flags); + + desc = irq_desc + realirq; + + /* + * handle this 'virtual interrupt' as a Cobalt one now. + */ + kstat_cpu(smp_processor_id()).irqs[realirq]++; + + if (likely(desc->action != NULL)) + handle_IRQ_event(realirq, regs, desc->action); + + if (!(desc->status & IRQ_DISABLED)) + enable_8259A_irq(realirq); + + return IRQ_HANDLED; + +out_unlock: + spin_unlock_irqrestore(&i8259A_lock, flags); + return IRQ_NONE; +} + +static struct irqaction master_action = { + .handler = piix4_master_intr, + .name = "PIIX4-8259", +}; + +static struct irqaction cascade_action = { + .handler = no_action, + .name = "cascade", +}; + + +void init_VISWS_APIC_irqs(void) +{ + int i; + + for (i = 0; i < CO_IRQ_APIC0 + CO_APIC_LAST + 1; i++) { + irq_desc[i].status = IRQ_DISABLED; + irq_desc[i].action = 0; + irq_desc[i].depth = 1; + + if (i == 0) { + irq_desc[i].handler = &cobalt_irq_type; + } + else if (i == CO_IRQ_IDE0) { + irq_desc[i].handler = &cobalt_irq_type; + } + else if (i == CO_IRQ_IDE1) { + irq_desc[i].handler = &cobalt_irq_type; + } + else if (i == CO_IRQ_8259) { + irq_desc[i].handler = &piix4_master_irq_type; + } + else if (i < CO_IRQ_APIC0) { + irq_desc[i].handler = &piix4_virtual_irq_type; + } + else if (IS_CO_APIC(i)) { + irq_desc[i].handler = &cobalt_irq_type; + } + } + + setup_irq(CO_IRQ_8259, &master_action); + setup_irq(2, &cascade_action); +} diff --git a/src/wraith/mach-voyager/setup.c b/src/wraith/mach-voyager/setup.c new file mode 100644 index 000000000..df123fc48 --- /dev/null +++ b/src/wraith/mach-voyager/setup.c @@ -0,0 +1,48 @@ +/* + * Machine specific setup for generic + */ + +#include +#include +#include +#include +#include +#include + +void __init pre_intr_init_hook(void) +{ + init_ISA_irqs(); +} + +/* + * IRQ2 is cascade interrupt to second interrupt controller + */ +static struct irqaction irq2 = { no_action, 0, CPU_MASK_NONE, "cascade", NULL, NULL}; + +void __init intr_init_hook(void) +{ +#ifdef CONFIG_SMP + smp_intr_init(); +#endif + + if (!acpi_ioapic) + setup_irq(2, &irq2); +} + +void __init pre_setup_arch_hook(void) +{ + /* Voyagers run their CPUs from independent clocks, so disable + * the TSC code because we can't sync them */ + tsc_disable = 1; +} + +void __init trap_init_hook(void) +{ +} + +static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, CPU_MASK_NONE, "timer", NULL, NULL}; + +void __init time_init_hook(void) +{ + setup_irq(0, &irq0); +} diff --git a/src/wraith/mach-voyager/voyager_basic.c b/src/wraith/mach-voyager/voyager_basic.c new file mode 100644 index 000000000..ab33293aa --- /dev/null +++ b/src/wraith/mach-voyager/voyager_basic.c @@ -0,0 +1,327 @@ +/* Copyright (C) 1999,2001 + * + * Author: J.E.J.Bottomley@HansenPartnership.com + * + * linux/arch/i386/kernel/voyager.c + * + * This file contains all the voyager specific routines for getting + * initialisation of the architecture to function. For additional + * features see: + * + * voyager_cat.c - Voyager CAT bus interface + * voyager_smp.c - Voyager SMP hal (emulates linux smp.c) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Power off function, if any + */ +void (*pm_power_off)(void); + +int reboot_thru_bios; + +int voyager_level = 0; + +struct voyager_SUS *voyager_SUS = NULL; + +#ifdef CONFIG_SMP +static void +voyager_dump(int dummy1, struct pt_regs *dummy2, struct tty_struct *dummy3) +{ + /* get here via a sysrq */ + voyager_smp_dump(); +} + +static struct sysrq_key_op sysrq_voyager_dump_op = { + .handler = voyager_dump, + .help_msg = "Voyager", + .action_msg = "Dump Voyager Status", +}; +#endif + +void +voyager_detect(struct voyager_bios_info *bios) +{ + if(bios->len != 0xff) { + int class = (bios->class_1 << 8) + | (bios->class_2 & 0xff); + + printk("Voyager System detected.\n" + " Class %x, Revision %d.%d\n", + class, bios->major, bios->minor); + if(class == VOYAGER_LEVEL4) + voyager_level = 4; + else if(class < VOYAGER_LEVEL5_AND_ABOVE) + voyager_level = 3; + else + voyager_level = 5; + printk(" Architecture Level %d\n", voyager_level); + if(voyager_level < 4) + printk("\n**WARNING**: Voyager HAL only supports Levels 4 and 5 Architectures at the moment\n\n"); + /* install the power off handler */ + pm_power_off = voyager_power_off; +#ifdef CONFIG_SMP + register_sysrq_key('v', &sysrq_voyager_dump_op); +#endif + } else { + printk("\n\n**WARNING**: No Voyager Subsystem Found\n"); + } +} + +void +voyager_system_interrupt(int cpl, void *dev_id, struct pt_regs *regs) +{ + printk("Voyager: detected system interrupt\n"); +} + +/* Routine to read information from the extended CMOS area */ +__u8 +voyager_extended_cmos_read(__u16 addr) +{ + outb(addr & 0xff, 0x74); + outb((addr >> 8) & 0xff, 0x75); + return inb(0x76); +} + +/* internal definitions for the SUS Click Map of memory */ + +#define CLICK_ENTRIES 16 +#define CLICK_SIZE 4096 /* click to byte conversion for Length */ + +typedef struct ClickMap { + struct Entry { + __u32 Address; + __u32 Length; + } Entry[CLICK_ENTRIES]; +} ClickMap_t; + + +/* This routine is pretty much an awful hack to read the bios clickmap by + * mapping it into page 0. There are usually three regions in the map: + * Base Memory + * Extended Memory + * zero length marker for end of map + * + * Returns are 0 for failure and 1 for success on extracting region. + */ +int __init +voyager_memory_detect(int region, __u32 *start, __u32 *length) +{ + int i; + int retval = 0; + __u8 cmos[4]; + ClickMap_t *map; + unsigned long map_addr; + unsigned long old; + + if(region >= CLICK_ENTRIES) { + printk("Voyager: Illegal ClickMap region %d\n", region); + return 0; + } + + for(i = 0; i < sizeof(cmos); i++) + cmos[i] = voyager_extended_cmos_read(VOYAGER_MEMORY_CLICKMAP + i); + + map_addr = *(unsigned long *)cmos; + + /* steal page 0 for this */ + old = pg0[0]; + pg0[0] = ((map_addr & PAGE_MASK) | _PAGE_RW | _PAGE_PRESENT); + local_flush_tlb(); + /* now clear everything out but page 0 */ + map = (ClickMap_t *)(map_addr & (~PAGE_MASK)); + + /* zero length is the end of the clickmap */ + if(map->Entry[region].Length != 0) { + *length = map->Entry[region].Length * CLICK_SIZE; + *start = map->Entry[region].Address; + retval = 1; + } + + /* replace the mapping */ + pg0[0] = old; + local_flush_tlb(); + return retval; +} + +/* voyager specific handling code for timer interrupts. Used to hand + * off the timer tick to the SMP code, since the VIC doesn't have an + * internal timer (The QIC does, but that's another story). */ +void +voyager_timer_interrupt(struct pt_regs *regs) +{ + if((jiffies & 0x3ff) == 0) { + + /* There seems to be something flaky in either + * hardware or software that is resetting the timer 0 + * count to something much higher than it should be + * This seems to occur in the boot sequence, just + * before root is mounted. Therefore, every 10 + * seconds or so, we sanity check the timer zero count + * and kick it back to where it should be. + * + * FIXME: This is the most awful hack yet seen. I + * should work out exactly what is interfering with + * the timer count settings early in the boot sequence + * and swiftly introduce it to something sharp and + * pointy. */ + __u16 val; + extern spinlock_t i8253_lock; + + spin_lock(&i8253_lock); + + outb_p(0x00, 0x43); + val = inb_p(0x40); + val |= inb(0x40) << 8; + spin_unlock(&i8253_lock); + + if(val > LATCH) { + printk("\nVOYAGER: countdown timer value too high (%d), resetting\n\n", val); + spin_lock(&i8253_lock); + outb(0x34,0x43); + outb_p(LATCH & 0xff , 0x40); /* LSB */ + outb(LATCH >> 8 , 0x40); /* MSB */ + spin_unlock(&i8253_lock); + } + } +#ifdef CONFIG_SMP + smp_vic_timer_interrupt(regs); +#endif +} + +void +voyager_power_off(void) +{ + printk("VOYAGER Power Off\n"); + + if(voyager_level == 5) { + voyager_cat_power_off(); + } else if(voyager_level == 4) { + /* This doesn't apparently work on most L4 machines, + * but the specs say to do this to get automatic power + * off. Unfortunately, if it doesn't power off the + * machine, it ends up doing a cold restart, which + * isn't really intended, so comment out the code */ +#if 0 + int port; + + + /* enable the voyager Configuration Space */ + outb((inb(VOYAGER_MC_SETUP) & 0xf0) | 0x8, + VOYAGER_MC_SETUP); + /* the port for the power off flag is an offset from the + floating base */ + port = (inb(VOYAGER_SSPB_RELOCATION_PORT) << 8) + 0x21; + /* set the power off flag */ + outb(inb(port) | 0x1, port); +#endif + } + /* and wait for it to happen */ + for(;;) { + __asm("cli"); + __asm("hlt"); + } +} + +/* copied from process.c */ +static inline void +kb_wait(void) +{ + int i; + + for (i=0; i<0x10000; i++) + if ((inb_p(0x64) & 0x02) == 0) + break; +} + +void +machine_restart(char *cmd) +{ + printk("Voyager Warm Restart\n"); + kb_wait(); + + if(voyager_level == 5) { + /* write magic values to the RTC to inform system that + * shutdown is beginning */ + outb(0x8f, 0x70); + outb(0x5 , 0x71); + + udelay(50); + outb(0xfe,0x64); /* pull reset low */ + } else if(voyager_level == 4) { + __u16 catbase = inb(VOYAGER_SSPB_RELOCATION_PORT)<<8; + __u8 basebd = inb(VOYAGER_MC_SETUP); + + outb(basebd | 0x08, VOYAGER_MC_SETUP); + outb(0x02, catbase + 0x21); + } + for(;;) { + asm("cli"); + asm("hlt"); + } +} + +EXPORT_SYMBOL(machine_restart); + +void +mca_nmi_hook(void) +{ + __u8 dumpval __attribute__((unused)) = inb(0xf823); + __u8 swnmi __attribute__((unused)) = inb(0xf813); + + /* FIXME: assume dump switch pressed */ + /* check to see if the dump switch was pressed */ + VDEBUG(("VOYAGER: dumpval = 0x%x, swnmi = 0x%x\n", dumpval, swnmi)); + /* clear swnmi */ + outb(0xff, 0xf813); + /* tell SUS to ignore dump */ + if(voyager_level == 5 && voyager_SUS != NULL) { + if(voyager_SUS->SUS_mbox == VOYAGER_DUMP_BUTTON_NMI) { + voyager_SUS->kernel_mbox = VOYAGER_NO_COMMAND; + voyager_SUS->kernel_flags |= VOYAGER_OS_IN_PROGRESS; + udelay(1000); + voyager_SUS->kernel_mbox = VOYAGER_IGNORE_DUMP; + voyager_SUS->kernel_flags &= ~VOYAGER_OS_IN_PROGRESS; + } + } + printk(KERN_ERR "VOYAGER: Dump switch pressed, printing CPU%d tracebacks\n", smp_processor_id()); + show_stack(NULL, NULL); + show_state(); +} + + + +void +machine_halt(void) +{ + /* treat a halt like a power off */ + machine_power_off(); +} + +EXPORT_SYMBOL(machine_halt); + +void machine_power_off(void) +{ + if (pm_power_off) + pm_power_off(); +} + +EXPORT_SYMBOL(machine_power_off); diff --git a/src/wraith/mach-voyager/voyager_cat.c b/src/wraith/mach-voyager/voyager_cat.c new file mode 100644 index 000000000..23967fe65 --- /dev/null +++ b/src/wraith/mach-voyager/voyager_cat.c @@ -0,0 +1,1178 @@ +/* -*- mode: c; c-basic-offset: 8 -*- */ + +/* Copyright (C) 1999,2001 + * + * Author: J.E.J.Bottomley@HansenPartnership.com + * + * linux/arch/i386/kernel/voyager_cat.c + * + * This file contains all the logic for manipulating the CAT bus + * in a level 5 machine. + * + * The CAT bus is a serial configuration and test bus. Its primary + * uses are to probe the initial configuration of the system and to + * diagnose error conditions when a system interrupt occurs. The low + * level interface is fairly primitive, so most of this file consists + * of bit shift manipulations to send and receive packets on the + * serial bus */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef VOYAGER_CAT_DEBUG +#define CDEBUG(x) printk x +#else +#define CDEBUG(x) +#endif + +/* the CAT command port */ +#define CAT_CMD (sspb + 0xe) +/* the CAT data port */ +#define CAT_DATA (sspb + 0xd) + +/* the internal cat functions */ +static void cat_pack(__u8 *msg, __u16 start_bit, __u8 *data, + __u16 num_bits); +static void cat_unpack(__u8 *msg, __u16 start_bit, __u8 *data, + __u16 num_bits); +static void cat_build_header(__u8 *header, const __u16 len, + const __u16 smallest_reg_bits, + const __u16 longest_reg_bits); +static int cat_sendinst(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 op); +static int cat_getdata(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 *value); +static int cat_shiftout(__u8 *data, __u16 data_bytes, __u16 header_bytes, + __u8 pad_bits); +static int cat_write(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, + __u8 value); +static int cat_read(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, + __u8 *value); +static int cat_subread(voyager_module_t *modp, voyager_asic_t *asicp, + __u16 offset, __u16 len, void *buf); +static int cat_senddata(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 value); +static int cat_disconnect(voyager_module_t *modp, voyager_asic_t *asicp); +static int cat_connect(voyager_module_t *modp, voyager_asic_t *asicp); + +static inline const char * +cat_module_name(int module_id) +{ + switch(module_id) { + case 0x10: + return "Processor Slot 0"; + case 0x11: + return "Processor Slot 1"; + case 0x12: + return "Processor Slot 2"; + case 0x13: + return "Processor Slot 4"; + case 0x14: + return "Memory Slot 0"; + case 0x15: + return "Memory Slot 1"; + case 0x18: + return "Primary Microchannel"; + case 0x19: + return "Secondary Microchannel"; + case 0x1a: + return "Power Supply Interface"; + case 0x1c: + return "Processor Slot 5"; + case 0x1d: + return "Processor Slot 6"; + case 0x1e: + return "Processor Slot 7"; + case 0x1f: + return "Processor Slot 8"; + default: + return "Unknown Module"; + } +} + +static int sspb = 0; /* stores the super port location */ +int voyager_8slot = 0; /* set to true if a 51xx monster */ + +voyager_module_t *voyager_cat_list; + +/* the I/O port assignments for the VIC and QIC */ +static struct resource vic_res = { + "Voyager Interrupt Controller", 0xFC00, 0xFC6F }; +static struct resource qic_res = { + "Quad Interrupt Controller", 0xFC70, 0xFCFF }; + +/* This function is used to pack a data bit stream inside a message. + * It writes num_bits of the data buffer in msg starting at start_bit. + * Note: This function assumes that any unused bit in the data stream + * is set to zero so that the ors will work correctly */ +#define BITS_PER_BYTE 8 +static void +cat_pack(__u8 *msg, const __u16 start_bit, __u8 *data, const __u16 num_bits) +{ + /* compute initial shift needed */ + const __u16 offset = start_bit % BITS_PER_BYTE; + __u16 len = num_bits / BITS_PER_BYTE; + __u16 byte = start_bit / BITS_PER_BYTE; + __u16 residue = (num_bits % BITS_PER_BYTE) + offset; + int i; + + /* adjust if we have more than a byte of residue */ + if(residue >= BITS_PER_BYTE) { + residue -= BITS_PER_BYTE; + len++; + } + + /* clear out the bits. We assume here that if len==0 then + * residue >= offset. This is always true for the catbus + * operations */ + msg[byte] &= 0xff << (BITS_PER_BYTE - offset); + msg[byte++] |= data[0] >> offset; + if(len == 0) + return; + for(i = 1; i < len; i++) + msg[byte++] = (data[i-1] << (BITS_PER_BYTE - offset)) + | (data[i] >> offset); + if(residue != 0) { + __u8 mask = 0xff >> residue; + __u8 last_byte = data[i-1] << (BITS_PER_BYTE - offset) + | (data[i] >> offset); + + last_byte &= ~mask; + msg[byte] &= mask; + msg[byte] |= last_byte; + } + return; +} +/* unpack the data again (same arguments as cat_pack()). data buffer + * must be zero populated. + * + * Function: given a message string move to start_bit and copy num_bits into + * data (starting at bit 0 in data). + */ +static void +cat_unpack(__u8 *msg, const __u16 start_bit, __u8 *data, const __u16 num_bits) +{ + /* compute initial shift needed */ + const __u16 offset = start_bit % BITS_PER_BYTE; + __u16 len = num_bits / BITS_PER_BYTE; + const __u8 last_bits = num_bits % BITS_PER_BYTE; + __u16 byte = start_bit / BITS_PER_BYTE; + int i; + + if(last_bits != 0) + len++; + + /* special case: want < 8 bits from msg and we can get it from + * a single byte of the msg */ + if(len == 0 && BITS_PER_BYTE - offset >= num_bits) { + data[0] = msg[byte] << offset; + data[0] &= 0xff >> (BITS_PER_BYTE - num_bits); + return; + } + for(i = 0; i < len; i++) { + /* this annoying if has to be done just in case a read of + * msg one beyond the array causes a panic */ + if(offset != 0) { + data[i] = msg[byte++] << offset; + data[i] |= msg[byte] >> (BITS_PER_BYTE - offset); + } + else { + data[i] = msg[byte++]; + } + } + /* do we need to truncate the final byte */ + if(last_bits != 0) { + data[i-1] &= 0xff << (BITS_PER_BYTE - last_bits); + } + return; +} + +static void +cat_build_header(__u8 *header, const __u16 len, const __u16 smallest_reg_bits, + const __u16 longest_reg_bits) +{ + int i; + __u16 start_bit = (smallest_reg_bits - 1) % BITS_PER_BYTE; + __u8 *last_byte = &header[len - 1]; + + if(start_bit == 0) + start_bit = 1; /* must have at least one bit in the hdr */ + + for(i=0; i < len; i++) + header[i] = 0; + + for(i = start_bit; i > 0; i--) + *last_byte = ((*last_byte) << 1) + 1; + +} + +static int +cat_sendinst(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, __u8 op) +{ + __u8 parity, inst, inst_buf[4] = { 0 }; + __u8 iseq[VOYAGER_MAX_SCAN_PATH], hseq[VOYAGER_MAX_REG_SIZE]; + __u16 ibytes, hbytes, padbits; + int i; + + /* + * Parity is the parity of the register number + 1 (READ_REGISTER + * and WRITE_REGISTER always add '1' to the number of bits == 1) + */ + parity = (__u8)(1 + (reg & 0x01) + + ((__u8)(reg & 0x02) >> 1) + + ((__u8)(reg & 0x04) >> 2) + + ((__u8)(reg & 0x08) >> 3)) % 2; + + inst = ((parity << 7) | (reg << 2) | op); + + outb(VOYAGER_CAT_IRCYC, CAT_CMD); + if(!modp->scan_path_connected) { + if(asicp->asic_id != VOYAGER_CAT_ID) { + printk("**WARNING***: cat_sendinst has disconnected scan path not to CAT asic\n"); + return 1; + } + outb(VOYAGER_CAT_HEADER, CAT_DATA); + outb(inst, CAT_DATA); + if(inb(CAT_DATA) != VOYAGER_CAT_HEADER) { + CDEBUG(("VOYAGER CAT: cat_sendinst failed to get CAT_HEADER\n")); + return 1; + } + return 0; + } + ibytes = modp->inst_bits / BITS_PER_BYTE; + if((padbits = modp->inst_bits % BITS_PER_BYTE) != 0) { + padbits = BITS_PER_BYTE - padbits; + ibytes++; + } + hbytes = modp->largest_reg / BITS_PER_BYTE; + if(modp->largest_reg % BITS_PER_BYTE) + hbytes++; + CDEBUG(("cat_sendinst: ibytes=%d, hbytes=%d\n", ibytes, hbytes)); + /* initialise the instruction sequence to 0xff */ + for(i=0; i < ibytes + hbytes; i++) + iseq[i] = 0xff; + cat_build_header(hseq, hbytes, modp->smallest_reg, modp->largest_reg); + cat_pack(iseq, modp->inst_bits, hseq, hbytes * BITS_PER_BYTE); + inst_buf[0] = inst; + inst_buf[1] = 0xFF >> (modp->largest_reg % BITS_PER_BYTE); + cat_pack(iseq, asicp->bit_location, inst_buf, asicp->ireg_length); +#ifdef VOYAGER_CAT_DEBUG + printk("ins = 0x%x, iseq: ", inst); + for(i=0; i< ibytes + hbytes; i++) + printk("0x%x ", iseq[i]); + printk("\n"); +#endif + if(cat_shiftout(iseq, ibytes, hbytes, padbits)) { + CDEBUG(("VOYAGER CAT: cat_sendinst: cat_shiftout failed\n")); + return 1; + } + CDEBUG(("CAT SHIFTOUT DONE\n")); + return 0; +} + +static int +cat_getdata(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, + __u8 *value) +{ + if(!modp->scan_path_connected) { + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("VOYAGER CAT: ERROR: cat_getdata to CAT asic with scan path connected\n")); + return 1; + } + if(reg > VOYAGER_SUBADDRHI) + outb(VOYAGER_CAT_RUN, CAT_CMD); + outb(VOYAGER_CAT_DRCYC, CAT_CMD); + outb(VOYAGER_CAT_HEADER, CAT_DATA); + *value = inb(CAT_DATA); + outb(0xAA, CAT_DATA); + if(inb(CAT_DATA) != VOYAGER_CAT_HEADER) { + CDEBUG(("cat_getdata: failed to get VOYAGER_CAT_HEADER\n")); + return 1; + } + return 0; + } + else { + __u16 sbits = modp->num_asics -1 + asicp->ireg_length; + __u16 sbytes = sbits / BITS_PER_BYTE; + __u16 tbytes; + __u8 string[VOYAGER_MAX_SCAN_PATH], trailer[VOYAGER_MAX_REG_SIZE]; + __u8 padbits; + int i; + + outb(VOYAGER_CAT_DRCYC, CAT_CMD); + + if((padbits = sbits % BITS_PER_BYTE) != 0) { + padbits = BITS_PER_BYTE - padbits; + sbytes++; + } + tbytes = asicp->ireg_length / BITS_PER_BYTE; + if(asicp->ireg_length % BITS_PER_BYTE) + tbytes++; + CDEBUG(("cat_getdata: tbytes = %d, sbytes = %d, padbits = %d\n", + tbytes, sbytes, padbits)); + cat_build_header(trailer, tbytes, 1, asicp->ireg_length); + + + for(i = tbytes - 1; i >= 0; i--) { + outb(trailer[i], CAT_DATA); + string[sbytes + i] = inb(CAT_DATA); + } + + for(i = sbytes - 1; i >= 0; i--) { + outb(0xaa, CAT_DATA); + string[i] = inb(CAT_DATA); + } + *value = 0; + cat_unpack(string, padbits + (tbytes * BITS_PER_BYTE) + asicp->asic_location, value, asicp->ireg_length); +#ifdef VOYAGER_CAT_DEBUG + printk("value=0x%x, string: ", *value); + for(i=0; i< tbytes+sbytes; i++) + printk("0x%x ", string[i]); + printk("\n"); +#endif + + /* sanity check the rest of the return */ + for(i=0; i < tbytes; i++) { + __u8 input = 0; + + cat_unpack(string, padbits + (i * BITS_PER_BYTE), &input, BITS_PER_BYTE); + if(trailer[i] != input) { + CDEBUG(("cat_getdata: failed to sanity check rest of ret(%d) 0x%x != 0x%x\n", i, input, trailer[i])); + return 1; + } + } + CDEBUG(("cat_getdata DONE\n")); + return 0; + } +} + +static int +cat_shiftout(__u8 *data, __u16 data_bytes, __u16 header_bytes, __u8 pad_bits) +{ + int i; + + for(i = data_bytes + header_bytes - 1; i >= header_bytes; i--) + outb(data[i], CAT_DATA); + + for(i = header_bytes - 1; i >= 0; i--) { + __u8 header = 0; + __u8 input; + + outb(data[i], CAT_DATA); + input = inb(CAT_DATA); + CDEBUG(("cat_shiftout: returned 0x%x\n", input)); + cat_unpack(data, ((data_bytes + i) * BITS_PER_BYTE) - pad_bits, + &header, BITS_PER_BYTE); + if(input != header) { + CDEBUG(("VOYAGER CAT: cat_shiftout failed to return header 0x%x != 0x%x\n", input, header)); + return 1; + } + } + return 0; +} + +static int +cat_senddata(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 value) +{ + outb(VOYAGER_CAT_DRCYC, CAT_CMD); + if(!modp->scan_path_connected) { + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("VOYAGER CAT: ERROR: scan path disconnected when asic != CAT\n")); + return 1; + } + outb(VOYAGER_CAT_HEADER, CAT_DATA); + outb(value, CAT_DATA); + if(inb(CAT_DATA) != VOYAGER_CAT_HEADER) { + CDEBUG(("cat_senddata: failed to get correct header response to sent data\n")); + return 1; + } + if(reg > VOYAGER_SUBADDRHI) { + outb(VOYAGER_CAT_RUN, CAT_CMD); + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + } + + return 0; + } + else { + __u16 hbytes = asicp->ireg_length / BITS_PER_BYTE; + __u16 dbytes = (modp->num_asics - 1 + asicp->ireg_length)/BITS_PER_BYTE; + __u8 padbits, dseq[VOYAGER_MAX_SCAN_PATH], + hseq[VOYAGER_MAX_REG_SIZE]; + int i; + + if((padbits = (modp->num_asics - 1 + + asicp->ireg_length) % BITS_PER_BYTE) != 0) { + padbits = BITS_PER_BYTE - padbits; + dbytes++; + } + if(asicp->ireg_length % BITS_PER_BYTE) + hbytes++; + + cat_build_header(hseq, hbytes, 1, asicp->ireg_length); + + for(i = 0; i < dbytes + hbytes; i++) + dseq[i] = 0xff; + CDEBUG(("cat_senddata: dbytes=%d, hbytes=%d, padbits=%d\n", + dbytes, hbytes, padbits)); + cat_pack(dseq, modp->num_asics - 1 + asicp->ireg_length, + hseq, hbytes * BITS_PER_BYTE); + cat_pack(dseq, asicp->asic_location, &value, + asicp->ireg_length); +#ifdef VOYAGER_CAT_DEBUG + printk("dseq "); + for(i=0; i 1) { + /* set auto increment */ + __u8 newval; + + if(cat_read(modp, asicp, VOYAGER_AUTO_INC_REG, &val)) { + CDEBUG(("cat_subaddrsetup: read of VOYAGER_AUTO_INC_REG failed\n")); + return 1; + } + CDEBUG(("cat_subaddrsetup: VOYAGER_AUTO_INC_REG = 0x%x\n", val)); + newval = val | VOYAGER_AUTO_INC; + if(newval != val) { + if(cat_write(modp, asicp, VOYAGER_AUTO_INC_REG, val)) { + CDEBUG(("cat_subaddrsetup: write to VOYAGER_AUTO_INC_REG failed\n")); + return 1; + } + } + } + if(cat_write(modp, asicp, VOYAGER_SUBADDRLO, (__u8)(offset &0xff))) { + CDEBUG(("cat_subaddrsetup: write to SUBADDRLO failed\n")); + return 1; + } + if(asicp->subaddr > VOYAGER_SUBADDR_LO) { + if(cat_write(modp, asicp, VOYAGER_SUBADDRHI, (__u8)(offset >> 8))) { + CDEBUG(("cat_subaddrsetup: write to SUBADDRHI failed\n")); + return 1; + } + cat_read(modp, asicp, VOYAGER_SUBADDRHI, &val); + CDEBUG(("cat_subaddrsetup: offset = %d, hi = %d\n", offset, val)); + } + cat_read(modp, asicp, VOYAGER_SUBADDRLO, &val); + CDEBUG(("cat_subaddrsetup: offset = %d, lo = %d\n", offset, val)); + return 0; +} + +static int +cat_subwrite(voyager_module_t *modp, voyager_asic_t *asicp, __u16 offset, + __u16 len, void *buf) +{ + int i, retval; + + /* FIXME: need special actions for VOYAGER_CAT_ID here */ + if(asicp->asic_id == VOYAGER_CAT_ID) { + CDEBUG(("cat_subwrite: ATTEMPT TO WRITE TO CAT ASIC\n")); + /* FIXME -- This is supposed to be handled better + * There is a problem writing to the cat asic in the + * PSI. The 30us delay seems to work, though */ + udelay(30); + } + + if((retval = cat_subaddrsetup(modp, asicp, offset, len)) != 0) { + printk("cat_subwrite: cat_subaddrsetup FAILED\n"); + return retval; + } + + if(cat_sendinst(modp, asicp, VOYAGER_SUBADDRDATA, VOYAGER_WRITE_CONFIG)) { + printk("cat_subwrite: cat_sendinst FAILED\n"); + return 1; + } + for(i = 0; i < len; i++) { + if(cat_senddata(modp, asicp, 0xFF, ((__u8 *)buf)[i])) { + printk("cat_subwrite: cat_sendata element at %d FAILED\n", i); + return 1; + } + } + return 0; +} +static int +cat_subread(voyager_module_t *modp, voyager_asic_t *asicp, __u16 offset, + __u16 len, void *buf) +{ + int i, retval; + + if((retval = cat_subaddrsetup(modp, asicp, offset, len)) != 0) { + CDEBUG(("cat_subread: cat_subaddrsetup FAILED\n")); + return retval; + } + + if(cat_sendinst(modp, asicp, VOYAGER_SUBADDRDATA, VOYAGER_READ_CONFIG)) { + CDEBUG(("cat_subread: cat_sendinst failed\n")); + return 1; + } + for(i = 0; i < len; i++) { + if(cat_getdata(modp, asicp, 0xFF, + &((__u8 *)buf)[i])) { + CDEBUG(("cat_subread: cat_getdata element %d failed\n", i)); + return 1; + } + } + return 0; +} + + +/* buffer for storing EPROM data read in during initialisation */ +static __initdata __u8 eprom_buf[0xFFFF]; +static voyager_module_t *voyager_initial_module; + +/* Initialise the cat bus components. We assume this is called by the + * boot cpu *after* all memory initialisation has been done (so we can + * use kmalloc) but before smp initialisation, so we can probe the SMP + * configuration and pick up necessary information. */ +void +voyager_cat_init(void) +{ + voyager_module_t **modpp = &voyager_initial_module; + voyager_asic_t **asicpp; + voyager_asic_t *qabc_asic = NULL; + int i, j; + unsigned long qic_addr = 0; + __u8 qabc_data[0x20]; + __u8 num_submodules, val; + voyager_eprom_hdr_t *eprom_hdr = (voyager_eprom_hdr_t *)&eprom_buf[0]; + + __u8 cmos[4]; + unsigned long addr; + + /* initiallise the SUS mailbox */ + for(i=0; iSUS_version); + voyager_SUS->kernel_version = VOYAGER_MAILBOX_VERSION; + voyager_SUS->kernel_flags = VOYAGER_OS_HAS_SYSINT; + } + + /* clear the processor counts */ + voyager_extended_vic_processors = 0; + voyager_quad_processors = 0; + + + + printk("VOYAGER: beginning CAT bus probe\n"); + /* set up the SuperSet Port Block which tells us where the + * CAT communication port is */ + sspb = inb(VOYAGER_SSPB_RELOCATION_PORT) * 0x100; + VDEBUG(("VOYAGER DEBUG: sspb = 0x%x\n", sspb)); + + /* now find out if were 8 slot or normal */ + if((inb(VIC_PROC_WHO_AM_I) & EIGHT_SLOT_IDENTIFIER) + == EIGHT_SLOT_IDENTIFIER) { + voyager_8slot = 1; + printk(KERN_NOTICE "Voyager: Eight slot 51xx configuration detected\n"); + } + + for(i = VOYAGER_MIN_MODULE; + i <= VOYAGER_MAX_MODULE; i++) { + __u8 input; + int asic; + __u16 eprom_size; + __u16 sp_offset; + + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(i, VOYAGER_CAT_CONFIG_PORT); + + /* check the presence of the module */ + outb(VOYAGER_CAT_RUN, CAT_CMD); + outb(VOYAGER_CAT_IRCYC, CAT_CMD); + outb(VOYAGER_CAT_HEADER, CAT_DATA); + /* stream series of alternating 1's and 0's to stimulate + * response */ + outb(0xAA, CAT_DATA); + input = inb(CAT_DATA); + outb(VOYAGER_CAT_END, CAT_CMD); + if(input != VOYAGER_CAT_HEADER) { + continue; + } + CDEBUG(("VOYAGER DEBUG: found module id 0x%x, %s\n", i, + cat_module_name(i))); + *modpp = kmalloc(sizeof(voyager_module_t), GFP_KERNEL); /*&voyager_module_storage[cat_count++];*/ + if(*modpp == NULL) { + printk("**WARNING** kmalloc failure in cat_init\n"); + continue; + } + memset(*modpp, 0, sizeof(voyager_module_t)); + /* need temporary asic for cat_subread. It will be + * filled in correctly later */ + (*modpp)->asic = kmalloc(sizeof(voyager_asic_t), GFP_KERNEL); /*&voyager_asic_storage[asic_count];*/ + if((*modpp)->asic == NULL) { + printk("**WARNING** kmalloc failure in cat_init\n"); + continue; + } + memset((*modpp)->asic, 0, sizeof(voyager_asic_t)); + (*modpp)->asic->asic_id = VOYAGER_CAT_ID; + (*modpp)->asic->subaddr = VOYAGER_SUBADDR_HI; + (*modpp)->module_addr = i; + (*modpp)->scan_path_connected = 0; + if(i == VOYAGER_PSI) { + /* Exception leg for modules with no EEPROM */ + printk("Module \"%s\"\n", cat_module_name(i)); + continue; + } + + CDEBUG(("cat_init: Reading eeprom for module 0x%x at offset %d\n", i, VOYAGER_XSUM_END_OFFSET)); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(*modpp, (*modpp)->asic); + if(cat_subread(*modpp, (*modpp)->asic, + VOYAGER_XSUM_END_OFFSET, sizeof(eprom_size), + &eprom_size)) { + printk("**WARNING**: Voyager couldn't read EPROM size for module 0x%x\n", i); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + if(eprom_size > sizeof(eprom_buf)) { + printk("**WARNING**: Voyager insufficient size to read EPROM data, module 0x%x. Need %d\n", i, eprom_size); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + CDEBUG(("cat_init: module 0x%x, eeprom_size %d\n", i, eprom_size)); + if(cat_subread(*modpp, (*modpp)->asic, 0, + eprom_size, eprom_buf)) { + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + printk("Module \"%s\", version 0x%x, tracer 0x%x, asics %d\n", + cat_module_name(i), eprom_hdr->version_id, + *((__u32 *)eprom_hdr->tracer), eprom_hdr->num_asics); + (*modpp)->ee_size = eprom_hdr->ee_size; + (*modpp)->num_asics = eprom_hdr->num_asics; + asicpp = &((*modpp)->asic); + sp_offset = eprom_hdr->scan_path_offset; + /* All we really care about are the Quad cards. We + * identify them because they are in a processor slot + * and have only four asics */ + if((i < 0x10 || (i>=0x14 && i < 0x1c) || i>0x1f)) { + modpp = &((*modpp)->next); + continue; + } + /* Now we know it's in a processor slot, does it have + * a quad baseboard submodule */ + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_read(*modpp, (*modpp)->asic, VOYAGER_SUBMODPRESENT, + &num_submodules); + /* lowest two bits, active low */ + num_submodules = ~(0xfc | num_submodules); + CDEBUG(("VOYAGER CAT: %d submodules present\n", num_submodules)); + if(num_submodules == 0) { + /* fill in the dyadic extended processors */ + __u8 cpu = i & 0x07; + + printk("Module \"%s\": Dyadic Processor Card\n", + cat_module_name(i)); + voyager_extended_vic_processors |= (1<asic, VOYAGER_SUBMODSELECT, &val); + CDEBUG(("cat_init: SUBMODSELECT value = 0x%x\n", val)); + val = (val & 0x7c) | VOYAGER_QUAD_BASEBOARD; + cat_write(*modpp, (*modpp)->asic, VOYAGER_SUBMODSELECT, val); + + outb(VOYAGER_CAT_END, CAT_CMD); + + + CDEBUG(("cat_init: Reading eeprom for module 0x%x at offset %d\n", i, VOYAGER_XSUM_END_OFFSET)); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(*modpp, (*modpp)->asic); + if(cat_subread(*modpp, (*modpp)->asic, + VOYAGER_XSUM_END_OFFSET, sizeof(eprom_size), + &eprom_size)) { + printk("**WARNING**: Voyager couldn't read EPROM size for module 0x%x\n", i); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + if(eprom_size > sizeof(eprom_buf)) { + printk("**WARNING**: Voyager insufficient size to read EPROM data, module 0x%x. Need %d\n", i, eprom_size); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + CDEBUG(("cat_init: module 0x%x, eeprom_size %d\n", i, eprom_size)); + if(cat_subread(*modpp, (*modpp)->asic, 0, + eprom_size, eprom_buf)) { + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + /* Now do everything for the QBB submodule 1 */ + (*modpp)->ee_size = eprom_hdr->ee_size; + (*modpp)->num_asics = eprom_hdr->num_asics; + asicpp = &((*modpp)->asic); + sp_offset = eprom_hdr->scan_path_offset; + /* get rid of the dummy CAT asic and read the real one */ + kfree((*modpp)->asic); + for(asic=0; asic < (*modpp)->num_asics; asic++) { + int j; + voyager_asic_t *asicp = *asicpp + = kmalloc(sizeof(voyager_asic_t), GFP_KERNEL); /*&voyager_asic_storage[asic_count++];*/ + voyager_sp_table_t *sp_table; + voyager_at_t *asic_table; + voyager_jtt_t *jtag_table; + + if(asicp == NULL) { + printk("**WARNING** kmalloc failure in cat_init\n"); + continue; + } + memset(asicp, 0, sizeof(voyager_asic_t)); + asicpp = &(asicp->next); + asicp->asic_location = asic; + sp_table = (voyager_sp_table_t *)(eprom_buf + sp_offset); + asicp->asic_id = sp_table->asic_id; + asic_table = (voyager_at_t *)(eprom_buf + sp_table->asic_data_offset); + for(j=0; j<4; j++) + asicp->jtag_id[j] = asic_table->jtag_id[j]; + jtag_table = (voyager_jtt_t *)(eprom_buf + asic_table->jtag_offset); + asicp->ireg_length = jtag_table->ireg_len; + asicp->bit_location = (*modpp)->inst_bits; + (*modpp)->inst_bits += asicp->ireg_length; + if(asicp->ireg_length > (*modpp)->largest_reg) + (*modpp)->largest_reg = asicp->ireg_length; + if (asicp->ireg_length < (*modpp)->smallest_reg || + (*modpp)->smallest_reg == 0) + (*modpp)->smallest_reg = asicp->ireg_length; + CDEBUG(("asic 0x%x, ireg_length=%d, bit_location=%d\n", + asicp->asic_id, asicp->ireg_length, + asicp->bit_location)); + if(asicp->asic_id == VOYAGER_QUAD_QABC) { + CDEBUG(("VOYAGER CAT: QABC ASIC found\n")); + qabc_asic = asicp; + } + sp_offset += sizeof(voyager_sp_table_t); + } + CDEBUG(("Module inst_bits = %d, largest_reg = %d, smallest_reg=%d\n", + (*modpp)->inst_bits, (*modpp)->largest_reg, + (*modpp)->smallest_reg)); + /* OK, now we have the QUAD ASICs set up, use them. + * we need to: + * + * 1. Find the Memory area for the Quad CPIs. + * 2. Find the Extended VIC processor + * 3. Configure a second extended VIC processor (This + * cannot be done for the 51xx. + * */ + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_connect(*modpp, (*modpp)->asic); + CDEBUG(("CAT CONNECTED!!\n")); + cat_subread(*modpp, qabc_asic, 0, sizeof(qabc_data), qabc_data); + qic_addr = qabc_data[5] << 8; + qic_addr = (qic_addr | qabc_data[6]) << 8; + qic_addr = (qic_addr | qabc_data[7]) << 8; + printk("Module \"%s\": Quad Processor Card; CPI 0x%lx, SET=0x%x\n", + cat_module_name(i), qic_addr, qabc_data[8]); +#if 0 /* plumbing fails---FIXME */ + if((qabc_data[8] & 0xf0) == 0) { + /* FIXME: 32 way 8 CPU slot monster cannot be + * plumbed this way---need to check for it */ + + printk("Plumbing second Extended Quad Processor\n"); + /* second VIC line hardwired to Quad CPU 1 */ + qabc_data[8] |= 0x20; + cat_subwrite(*modpp, qabc_asic, 8, 1, &qabc_data[8]); +#ifdef VOYAGER_CAT_DEBUG + /* verify plumbing */ + cat_subread(*modpp, qabc_asic, 8, 1, &qabc_data[8]); + if((qabc_data[8] & 0xf0) == 0) { + CDEBUG(("PLUMBING FAILED: 0x%x\n", qabc_data[8])); + } +#endif + } +#endif + + { + struct resource *res = kmalloc(sizeof(struct resource),GFP_KERNEL); + memset(res, 0, sizeof(struct resource)); + res->name = kmalloc(128, GFP_KERNEL); + sprintf((char *)res->name, "Voyager %s Quad CPI", cat_module_name(i)); + res->start = qic_addr; + res->end = qic_addr + 0x3ff; + request_resource(&iomem_resource, res); + } + + qic_addr = (unsigned long)ioremap(qic_addr, 0x400); + + for(j = 0; j < 4; j++) { + __u8 cpu; + + if(voyager_8slot) { + /* 8 slot has a different mapping, + * each slot has only one vic line, so + * 1 cpu in each slot must be < 8 */ + cpu = (i & 0x07) + j*8; + } else { + cpu = (i & 0x03) + j*4; + } + if( (qabc_data[8] & (1<next); + } + *modpp = NULL; + printk("CAT Bus Initialisation finished: extended procs 0x%x, quad procs 0x%x, allowed vic boot = 0x%x\n", voyager_extended_vic_processors, voyager_quad_processors, voyager_allowed_boot_processors); + request_resource(&ioport_resource, &vic_res); + if(voyager_quad_processors) + request_resource(&ioport_resource, &qic_res); + /* set up the front power switch */ +} + +int +voyager_cat_readb(__u8 module, __u8 asic, int reg) +{ + return 0; +} + +static int +cat_disconnect(voyager_module_t *modp, voyager_asic_t *asicp) +{ + __u8 val; + int err = 0; + + if(!modp->scan_path_connected) + return 0; + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("cat_disconnect: ASIC is not CAT\n")); + return 1; + } + err = cat_read(modp, asicp, VOYAGER_SCANPATH, &val); + if(err) { + CDEBUG(("cat_disconnect: failed to read SCANPATH\n")); + return err; + } + val &= VOYAGER_DISCONNECT_ASIC; + err = cat_write(modp, asicp, VOYAGER_SCANPATH, val); + if(err) { + CDEBUG(("cat_disconnect: failed to write SCANPATH\n")); + return err; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + modp->scan_path_connected = 0; + + return 0; +} + +static int +cat_connect(voyager_module_t *modp, voyager_asic_t *asicp) +{ + __u8 val; + int err = 0; + + if(modp->scan_path_connected) + return 0; + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("cat_connect: ASIC is not CAT\n")); + return 1; + } + + err = cat_read(modp, asicp, VOYAGER_SCANPATH, &val); + if(err) { + CDEBUG(("cat_connect: failed to read SCANPATH\n")); + return err; + } + val |= VOYAGER_CONNECT_ASIC; + err = cat_write(modp, asicp, VOYAGER_SCANPATH, val); + if(err) { + CDEBUG(("cat_connect: failed to write SCANPATH\n")); + return err; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + modp->scan_path_connected = 1; + + return 0; +} + +void +voyager_cat_power_off(void) +{ + /* Power the machine off by writing to the PSI over the CAT + * bus */ + __u8 data; + voyager_module_t psi = { 0 }; + voyager_asic_t psi_asic = { 0 }; + + psi.asic = &psi_asic; + psi.asic->asic_id = VOYAGER_CAT_ID; + psi.asic->subaddr = VOYAGER_SUBADDR_HI; + psi.module_addr = VOYAGER_PSI; + psi.scan_path_connected = 0; + + outb(VOYAGER_CAT_END, CAT_CMD); + /* Connect the PSI to the CAT Bus */ + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_PSI, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(&psi, &psi_asic); + /* Read the status */ + cat_subread(&psi, &psi_asic, VOYAGER_PSI_GENERAL_REG, 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); + CDEBUG(("PSI STATUS 0x%x\n", data)); + /* These two writes are power off prep and perform */ + data = PSI_CLEAR; + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_subwrite(&psi, &psi_asic, VOYAGER_PSI_GENERAL_REG, 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); + data = PSI_POWER_DOWN; + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_subwrite(&psi, &psi_asic, VOYAGER_PSI_GENERAL_REG, 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); +} + +struct voyager_status voyager_status = { 0 }; + +void +voyager_cat_psi(__u8 cmd, __u16 reg, __u8 *data) +{ + voyager_module_t psi = { 0 }; + voyager_asic_t psi_asic = { 0 }; + + psi.asic = &psi_asic; + psi.asic->asic_id = VOYAGER_CAT_ID; + psi.asic->subaddr = VOYAGER_SUBADDR_HI; + psi.module_addr = VOYAGER_PSI; + psi.scan_path_connected = 0; + + outb(VOYAGER_CAT_END, CAT_CMD); + /* Connect the PSI to the CAT Bus */ + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_PSI, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(&psi, &psi_asic); + switch(cmd) { + case VOYAGER_PSI_READ: + cat_read(&psi, &psi_asic, reg, data); + break; + case VOYAGER_PSI_WRITE: + cat_write(&psi, &psi_asic, reg, *data); + break; + case VOYAGER_PSI_SUBREAD: + cat_subread(&psi, &psi_asic, reg, 1, data); + break; + case VOYAGER_PSI_SUBWRITE: + cat_subwrite(&psi, &psi_asic, reg, 1, data); + break; + default: + printk(KERN_ERR "Voyager PSI, unrecognised command %d\n", cmd); + break; + } + outb(VOYAGER_CAT_END, CAT_CMD); +} + +void +voyager_cat_do_common_interrupt(void) +{ + /* This is caused either by a memory parity error or something + * in the PSI */ + __u8 data; + voyager_module_t psi = { 0 }; + voyager_asic_t psi_asic = { 0 }; + struct voyager_psi psi_reg; + int i; + re_read: + psi.asic = &psi_asic; + psi.asic->asic_id = VOYAGER_CAT_ID; + psi.asic->subaddr = VOYAGER_SUBADDR_HI; + psi.module_addr = VOYAGER_PSI; + psi.scan_path_connected = 0; + + outb(VOYAGER_CAT_END, CAT_CMD); + /* Connect the PSI to the CAT Bus */ + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_PSI, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(&psi, &psi_asic); + /* Read the status. NOTE: Need to read *all* the PSI regs here + * otherwise the cmn int will be reasserted */ + for(i = 0; i < sizeof(psi_reg.regs); i++) { + cat_read(&psi, &psi_asic, i, &((__u8 *)&psi_reg.regs)[i]); + } + outb(VOYAGER_CAT_END, CAT_CMD); + if((psi_reg.regs.checkbit & 0x02) == 0) { + psi_reg.regs.checkbit |= 0x02; + cat_write(&psi, &psi_asic, 5, psi_reg.regs.checkbit); + printk("VOYAGER RE-READ PSI\n"); + goto re_read; + } + outb(VOYAGER_CAT_RUN, CAT_CMD); + for(i = 0; i < sizeof(psi_reg.subregs); i++) { + /* This looks strange, but the PSI doesn't do auto increment + * correctly */ + cat_subread(&psi, &psi_asic, VOYAGER_PSI_SUPPLY_REG + i, + 1, &((__u8 *)&psi_reg.subregs)[i]); + } + outb(VOYAGER_CAT_END, CAT_CMD); +#ifdef VOYAGER_CAT_DEBUG + printk("VOYAGER PSI: "); + for(i=0; i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +int reboot_smp = 0; + +/* TLB state -- visible externally, indexed physically */ +DEFINE_PER_CPU(struct tlb_state, cpu_tlbstate) ____cacheline_aligned = { &init_mm, 0 }; + +/* CPU IRQ affinity -- set to all ones initially */ +static unsigned long cpu_irq_affinity[NR_CPUS] __cacheline_aligned = { [0 ... NR_CPUS-1] = ~0UL }; + +/* Set when the idlers are all forked - Set in main.c but not actually + * used by any other parts of the kernel */ +int smp_threads_ready = 0; + +/* per CPU data structure (for /proc/cpuinfo et al), visible externally + * indexed physically */ +struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned; + +/* physical ID of the CPU used to boot the system */ +unsigned char boot_cpu_id; + +/* The memory line addresses for the Quad CPIs */ +struct voyager_qic_cpi *voyager_quad_cpi_addr[NR_CPUS] __cacheline_aligned; + +/* The masks for the Extended VIC processors, filled in by cat_init */ +__u32 voyager_extended_vic_processors = 0; + +/* Masks for the extended Quad processors which cannot be VIC booted */ +__u32 voyager_allowed_boot_processors = 0; + +/* The mask for the Quad Processors (both extended and non-extended) */ +__u32 voyager_quad_processors = 0; + +/* Total count of live CPUs, used in process.c to display + * the CPU information and in irq.c for the per CPU irq + * activity count. Finally exported by i386_ksyms.c */ +static int voyager_extended_cpus = 1; + +/* Have we found an SMP box - used by time.c to do the profiling + interrupt for timeslicing; do not set to 1 until the per CPU timer + interrupt is active */ +int smp_found_config = 0; + +/* Used for the invalidate map that's also checked in the spinlock */ +static volatile unsigned long smp_invalidate_needed; + +/* Bitmask of currently online CPUs - used by setup.c for + /proc/cpuinfo, visible externally but still physical */ +cpumask_t cpu_online_map = CPU_MASK_NONE; + +/* Bitmask of CPUs present in the system - exported by i386_syms.c, used + * by scheduler but indexed physically */ +cpumask_t phys_cpu_present_map = CPU_MASK_NONE; + +/* estimate of time used to flush the SMP-local cache - used in + * processor affinity calculations */ +cycles_t cacheflush_time = 0; + +/* cache decay ticks for scheduler---a fairly useless quantity for the + voyager system with its odd affinity and huge L3 cache */ +unsigned long cache_decay_ticks = 20; + + +/* The internal functions */ +static void send_CPI(__u32 cpuset, __u8 cpi); +static void ack_CPI(__u8 cpi); +static int ack_QIC_CPI(__u8 cpi); +static void ack_special_QIC_CPI(__u8 cpi); +static void ack_VIC_CPI(__u8 cpi); +static void send_CPI_allbutself(__u8 cpi); +static void enable_vic_irq(unsigned int irq); +static void disable_vic_irq(unsigned int irq); +static unsigned int startup_vic_irq(unsigned int irq); +static void enable_local_vic_irq(unsigned int irq); +static void disable_local_vic_irq(unsigned int irq); +static void before_handle_vic_irq(unsigned int irq); +static void after_handle_vic_irq(unsigned int irq); +static void set_vic_irq_affinity(unsigned int irq, cpumask_t mask); +static void ack_vic_irq(unsigned int irq); +static void vic_enable_cpi(void); +static void do_boot_cpu(__u8 cpuid); +static void do_quad_bootstrap(void); +static inline void wrapper_smp_local_timer_interrupt(struct pt_regs *); + +int hard_smp_processor_id(void); + +/* Inline functions */ +static inline void +send_one_QIC_CPI(__u8 cpu, __u8 cpi) +{ + voyager_quad_cpi_addr[cpu]->qic_cpi[cpi].cpi = + (smp_processor_id() << 16) + cpi; +} + +static inline void +send_QIC_CPI(__u32 cpuset, __u8 cpi) +{ + int cpu; + + for_each_online_cpu(cpu) { + if(cpuset & (1<>3 &0x7 on the 32 way */ + if(((cpuid >> 2) & 0x03) == i) + /* don't lower our own mask! */ + continue; + + /* masquerade as local Quad CPU */ + outb(QIC_CPUID_ENABLE | i, QIC_PROCESSOR_ID); + /* enable the startup CPI */ + outb(QIC_BOOT_CPI_MASK, QIC_MASK_REGISTER1); + /* restore cpu id */ + outb(0, QIC_PROCESSOR_ID); + } + local_irq_restore(flags); + } +} + + +/* Set up all the basic stuff: read the SMP config and make all the + * SMP information reflect only the boot cpu. All others will be + * brought on-line later. */ +void __init +find_smp_config(void) +{ + int i; + + boot_cpu_id = hard_smp_processor_id(); + + printk("VOYAGER SMP: Boot cpu is %d\n", boot_cpu_id); + + /* initialize the CPU structures (moved from smp_boot_cpus) */ + for(i=0; icpu = boot_cpu_id; +} + +/* + * The bootstrap kernel entry code has set these up. Save them + * for a given CPU, id is physical */ +void __init +smp_store_cpu_info(int id) +{ + struct cpuinfo_x86 *c=&cpu_data[id]; + + *c = boot_cpu_data; + + identify_cpu(c); +} + +/* set up the trampoline and return the physical address of the code */ +static __u32 __init +setup_trampoline(void) +{ + /* these two are global symbols in trampoline.S */ + extern __u8 trampoline_end[]; + extern __u8 trampoline_data[]; + + memcpy((__u8 *)trampoline_base, trampoline_data, + trampoline_end - trampoline_data); + return virt_to_phys((__u8 *)trampoline_base); +} + +/* Routine initially called when a non-boot CPU is brought online */ +int __init +start_secondary(void *unused) +{ + __u8 cpuid = hard_smp_processor_id(); + /* external functions not defined in the headers */ + extern void calibrate_delay(void); + extern int cpu_idle(void); + + cpu_init(); + + /* OK, we're in the routine */ + ack_CPI(VIC_CPU_BOOT_CPI); + + /* setup the 8259 master slave pair belonging to this CPU --- + * we won't actually receive any until the boot CPU + * relinquishes it's static routing mask */ + vic_setup_pic(); + + qic_setup(); + + if(is_cpu_quad() && !is_cpu_vic_boot()) { + /* clear the boot CPI */ + __u8 dummy; + + dummy = voyager_quad_cpi_addr[cpuid]->qic_cpi[VIC_CPU_BOOT_CPI].cpi; + printk("read dummy %d\n", dummy); + } + + /* lower the mask to receive CPIs */ + vic_enable_cpi(); + + VDEBUG(("VOYAGER SMP: CPU%d, stack at about %p\n", cpuid, &cpuid)); + + /* enable interrupts */ + local_irq_enable(); + + /* get our bogomips */ + calibrate_delay(); + + /* save our processor parameters */ + smp_store_cpu_info(cpuid); + + /* if we're a quad, we may need to bootstrap other CPUs */ + do_quad_bootstrap(); + + /* FIXME: this is rather a poor hack to prevent the CPU + * activating softirqs while it's supposed to be waiting for + * permission to proceed. Without this, the new per CPU stuff + * in the softirqs will fail */ + local_irq_disable(); + cpu_set(cpuid, cpu_callin_map); + + /* signal that we're done */ + cpu_booted_map = 1; + + while (!cpu_isset(cpuid, smp_commenced_mask)) + rep_nop(); + local_irq_enable(); + + local_flush_tlb(); + + cpu_set(cpuid, cpu_online_map); + wmb(); + return cpu_idle(); +} + + +/* Routine to kick start the given CPU and wait for it to report ready + * (or timeout in startup). When this routine returns, the requested + * CPU is either fully running and configured or known to be dead. + * + * We call this routine sequentially 1 CPU at a time, so no need for + * locking */ + +static void __init +do_boot_cpu(__u8 cpu) +{ + struct task_struct *idle; + int timeout; + unsigned long flags; + int quad_boot = (1<> 4) & 0xFFFF; + + cpucount++; + idle = fork_idle(cpu); + if(IS_ERR(idle)) + panic("failed fork for CPU%d", cpu); + idle->thread.eip = (unsigned long) start_secondary; + /* init_tasks (in sched.c) is indexed logically */ + stack_start.esp = (void *) idle->thread.esp; + + irq_ctx_init(cpu); + + /* Note: Don't modify initial ss override */ + VDEBUG(("VOYAGER SMP: Booting CPU%d at 0x%lx[%x:%x], stack %p\n", cpu, + (unsigned long)hijack_source.val, hijack_source.idt.Segment, + hijack_source.idt.Offset, stack_start.esp)); + /* set the original swapper_pg_dir[0] to map 0 to 4Mb transparently + * (so that the booting CPU can find start_32 */ + orig_swapper_pg_dir0 = swapper_pg_dir[0]; +#ifdef CONFIG_M486 + if(page_table_copies == NULL) + panic("No free memory for 486 page tables\n"); + for(i = 0; i < PAGE_SIZE/sizeof(unsigned long); i++) + page_table_copies[i] = (i * PAGE_SIZE) + | _PAGE_RW | _PAGE_USER | _PAGE_PRESENT; + + ((unsigned long *)swapper_pg_dir)[0] = + ((virt_to_phys(page_table_copies)) & PAGE_MASK) + | _PAGE_RW | _PAGE_USER | _PAGE_PRESENT; +#else + ((unsigned long *)swapper_pg_dir)[0] = + (virt_to_phys(pg0) & PAGE_MASK) + | _PAGE_RW | _PAGE_USER | _PAGE_PRESENT; +#endif + + if(quad_boot) { + printk("CPU %d: non extended Quad boot\n", cpu); + hijack_vector = (__u32 *)phys_to_virt((VIC_CPU_BOOT_CPI + QIC_DEFAULT_CPI_BASE)*4); + *hijack_vector = hijack_source.val; + } else { + printk("CPU%d: extended VIC boot\n", cpu); + hijack_vector = (__u32 *)phys_to_virt((VIC_CPU_BOOT_CPI + VIC_DEFAULT_CPI_BASE)*4); + *hijack_vector = hijack_source.val; + /* VIC errata, may also receive interrupt at this address */ + hijack_vector = (__u32 *)phys_to_virt((VIC_CPU_BOOT_ERRATA_CPI + VIC_DEFAULT_CPI_BASE)*4); + *hijack_vector = hijack_source.val; + } + /* All non-boot CPUs start with interrupts fully masked. Need + * to lower the mask of the CPI we're about to send. We do + * this in the VIC by masquerading as the processor we're + * about to boot and lowering its interrupt mask */ + local_irq_save(flags); + if(quad_boot) { + send_one_QIC_CPI(cpu, VIC_CPU_BOOT_CPI); + } else { + outb(VIC_CPU_MASQUERADE_ENABLE | cpu, VIC_PROCESSOR_ID); + /* here we're altering registers belonging to `cpu' */ + + outb(VIC_BOOT_INTERRUPT_MASK, 0x21); + /* now go back to our original identity */ + outb(boot_cpu_id, VIC_PROCESSOR_ID); + + /* and boot the CPU */ + + send_CPI((1<thread.esp),"r" (current->thread.eip)); +} + +/* handle a Voyager SYS_INT -- If we don't, the base board will + * panic the system. + * + * System interrupts occur because some problem was detected on the + * various busses. To find out what you have to probe all the + * hardware via the CAT bus. FIXME: At the moment we do nothing. */ +fastcall void +smp_vic_sys_interrupt(struct pt_regs *regs) +{ + ack_CPI(VIC_SYS_INT); + printk("Voyager SYSTEM INTERRUPT\n"); +} + +/* Handle a voyager CMN_INT; These interrupts occur either because of + * a system status change or because a single bit memory error + * occurred. FIXME: At the moment, ignore all this. */ +fastcall void +smp_vic_cmn_interrupt(struct pt_regs *regs) +{ + static __u8 in_cmn_int = 0; + static spinlock_t cmn_int_lock = SPIN_LOCK_UNLOCKED; + + /* common ints are broadcast, so make sure we only do this once */ + _raw_spin_lock(&cmn_int_lock); + if(in_cmn_int) + goto unlock_end; + + in_cmn_int++; + _raw_spin_unlock(&cmn_int_lock); + + VDEBUG(("Voyager COMMON INTERRUPT\n")); + + if(voyager_level == 5) + voyager_cat_do_common_interrupt(); + + _raw_spin_lock(&cmn_int_lock); + in_cmn_int = 0; + unlock_end: + _raw_spin_unlock(&cmn_int_lock); + ack_CPI(VIC_CMN_INT); +} + +/* + * Reschedule call back. Nothing to do, all the work is done + * automatically when we return from the interrupt. */ +static void +smp_reschedule_interrupt(void) +{ + /* do nothing */ +} + +static struct mm_struct * flush_mm; +static unsigned long flush_va; +static spinlock_t tlbstate_lock = SPIN_LOCK_UNLOCKED; +#define FLUSH_ALL 0xffffffff + +/* + * We cannot call mmdrop() because we are in interrupt context, + * instead update mm->cpu_vm_mask. + * + * We need to reload %cr3 since the page tables may be going + * away from under us.. + */ +static inline void +leave_mm (unsigned long cpu) +{ + if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_OK) + BUG(); + cpu_clear(cpu, per_cpu(cpu_tlbstate, cpu).active_mm->cpu_vm_mask); + load_cr3(swapper_pg_dir); +} + + +/* + * Invalidate call-back + */ +static void +smp_invalidate_interrupt(void) +{ + __u8 cpu = smp_processor_id(); + + if (!test_bit(cpu, &smp_invalidate_needed)) + return; + /* This will flood messages. Don't uncomment unless you see + * Problems with cross cpu invalidation + VDEBUG(("VOYAGER SMP: CPU%d received INVALIDATE_CPI\n", + smp_processor_id())); + */ + + if (flush_mm == per_cpu(cpu_tlbstate, cpu).active_mm) { + if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_OK) { + if (flush_va == FLUSH_ALL) + local_flush_tlb(); + else + __flush_tlb_one(flush_va); + } else + leave_mm(cpu); + } + smp_mb__before_clear_bit(); + clear_bit(cpu, &smp_invalidate_needed); + smp_mb__after_clear_bit(); +} + +/* All the new flush operations for 2.4 */ + + +/* This routine is called with a physical cpu mask */ +static void +flush_tlb_others (unsigned long cpumask, struct mm_struct *mm, + unsigned long va) +{ + int stuck = 50000; + + if (!cpumask) + BUG(); + if ((cpumask & cpus_addr(cpu_online_map)[0]) != cpumask) + BUG(); + if (cpumask & (1 << smp_processor_id())) + BUG(); + if (!mm) + BUG(); + + spin_lock(&tlbstate_lock); + + flush_mm = mm; + flush_va = va; + atomic_set_mask(cpumask, &smp_invalidate_needed); + /* + * We have to send the CPI only to + * CPUs affected. + */ + send_CPI(cpumask, VIC_INVALIDATE_CPI); + + while (smp_invalidate_needed) { + mb(); + if(--stuck == 0) { + printk("***WARNING*** Stuck doing invalidate CPI (CPU%d)\n", smp_processor_id()); + break; + } + } + + /* Uncomment only to debug invalidation problems + VDEBUG(("VOYAGER SMP: Completed invalidate CPI (CPU%d)\n", cpu)); + */ + + flush_mm = NULL; + flush_va = 0; + spin_unlock(&tlbstate_lock); +} + +void +flush_tlb_current_task(void) +{ + struct mm_struct *mm = current->mm; + unsigned long cpu_mask; + + preempt_disable(); + + cpu_mask = cpus_addr(mm->cpu_vm_mask)[0] & ~(1 << smp_processor_id()); + local_flush_tlb(); + if (cpu_mask) + flush_tlb_others(cpu_mask, mm, FLUSH_ALL); + + preempt_enable(); +} + + +void +flush_tlb_mm (struct mm_struct * mm) +{ + unsigned long cpu_mask; + + preempt_disable(); + + cpu_mask = cpus_addr(mm->cpu_vm_mask)[0] & ~(1 << smp_processor_id()); + + if (current->active_mm == mm) { + if (current->mm) + local_flush_tlb(); + else + leave_mm(smp_processor_id()); + } + if (cpu_mask) + flush_tlb_others(cpu_mask, mm, FLUSH_ALL); + + preempt_enable(); +} + +void flush_tlb_page(struct vm_area_struct * vma, unsigned long va) +{ + struct mm_struct *mm = vma->vm_mm; + unsigned long cpu_mask; + + preempt_disable(); + + cpu_mask = cpus_addr(mm->cpu_vm_mask)[0] & ~(1 << smp_processor_id()); + if (current->active_mm == mm) { + if(current->mm) + __flush_tlb_one(va); + else + leave_mm(smp_processor_id()); + } + + if (cpu_mask) + flush_tlb_others(cpu_mask, mm, va); + + preempt_enable(); +} + +/* enable the requested IRQs */ +static void +smp_enable_irq_interrupt(void) +{ + __u8 irq; + __u8 cpu = get_cpu(); + + VDEBUG(("VOYAGER SMP: CPU%d enabling irq mask 0x%x\n", cpu, + vic_irq_enable_mask[cpu])); + + spin_lock(&vic_irq_lock); + for(irq = 0; irq < 16; irq++) { + if(vic_irq_enable_mask[cpu] & (1<func; + void *info = call_data->info; + /* must take copy of wait because call_data may be replaced + * unless the function is waiting for us to finish */ + int wait = call_data->wait; + __u8 cpu = smp_processor_id(); + + /* + * Notify initiating CPU that I've grabbed the data and am + * about to execute the function + */ + mb(); + if(!test_and_clear_bit(cpu, &call_data->started)) { + /* If the bit wasn't set, this could be a replay */ + printk(KERN_WARNING "VOYAGER SMP: CPU %d received call funtion with no call pending\n", cpu); + return; + } + /* + * At this point the info structure may be out of scope unless wait==1 + */ + irq_enter(); + (*func)(info); + irq_exit(); + if (wait) { + mb(); + clear_bit(cpu, &call_data->finished); + } +} + +/* Call this function on all CPUs using the function_interrupt above + The function to run. This must be fast and non-blocking. + An arbitrary pointer to pass to the function. + If true, keep retrying until ready. + If true, wait until function has completed on other CPUs. + [RETURNS] 0 on success, else a negative status code. Does not return until + remote CPUs are nearly ready to execute <> or are or have executed. +*/ +int +smp_call_function (void (*func) (void *info), void *info, int retry, + int wait) +{ + struct call_data_struct data; + __u32 mask = cpus_addr(cpu_online_map)[0]; + + mask &= ~(1<= 0x93000) + BUG(); +} + +/* send a reschedule CPI to one CPU by physical CPU number*/ +void +smp_send_reschedule(int cpu) +{ + send_one_CPI(cpu, VIC_RESCHEDULE_CPI); +} + + +int +hard_smp_processor_id(void) +{ + __u8 i; + __u8 cpumask = inb(VIC_PROC_WHO_AM_I); + if((cpumask & QUAD_IDENTIFIER) == QUAD_IDENTIFIER) + return cpumask & 0x1F; + + for(i = 0; i < 8; i++) { + if(cpumask & (1<1 eligible CPUs are equal lowest, the + * lowest processor number gets it. + * + * The priority of a CPU is controlled by a special per-CPU + * VIC priority register which is 3 bits wide 0 being lowest + * and 7 highest priority.. + * + * Therefore we subtract the average number of interrupts from + * the number we've fielded. If this number is negative, we + * lower the activity count and if it is positive, we raise + * it. + * + * I'm afraid this still leads to odd looking interrupt counts: + * the totals are all roughly equal, but the individual ones + * look rather skewed. + * + * FIXME: This algorithm is total crap when mixed with SMP + * affinity code since we now try to even up the interrupt + * counts when an affinity binding is keeping them on a + * particular CPU*/ + weight = (vic_intr_count[cpu]*voyager_extended_cpus + - vic_intr_total) >> 4; + weight += 4; + if(weight > 7) + weight = 7; + if(weight < 0) + weight = 0; + + outb((__u8)weight, VIC_PRIORITY_REGISTER); + +#ifdef VOYAGER_DEBUG + if((vic_tick[cpu] & 0xFFF) == 0) { + /* print this message roughly every 25 secs */ + printk("VOYAGER SMP: vic_tick[%d] = %lu, weight = %ld\n", + cpu, vic_tick[cpu], weight); + } +#endif +} + +/* setup the profiling timer */ +int +setup_profiling_timer(unsigned int multiplier) +{ + int i; + + if ( (!multiplier)) + return -EINVAL; + + /* + * Set the new multiplier for each CPU. CPUs don't start using the + * new values until the next timer interrupt in which they do process + * accounting. + */ + for (i = 0; i < NR_CPUS; ++i) + per_cpu(prof_multiplier, i) = multiplier; + + return 0; +} + + +/* The CPIs are handled in the per cpu 8259s, so they must be + * enabled to be received: FIX: enabling the CPIs in the early + * boot sequence interferes with bug checking; enable them later + * on in smp_init */ +#define VIC_SET_GATE(cpi, vector) \ + set_intr_gate((cpi) + VIC_DEFAULT_CPI_BASE, (vector)) +#define QIC_SET_GATE(cpi, vector) \ + set_intr_gate((cpi) + QIC_DEFAULT_CPI_BASE, (vector)) + +void __init +smp_intr_init(void) +{ + int i; + + /* initialize the per cpu irq mask to all disabled */ + for(i = 0; i < NR_CPUS; i++) + vic_irq_mask[i] = 0xFFFF; + + VIC_SET_GATE(VIC_CPI_LEVEL0, vic_cpi_interrupt); + + VIC_SET_GATE(VIC_SYS_INT, vic_sys_interrupt); + VIC_SET_GATE(VIC_CMN_INT, vic_cmn_interrupt); + + QIC_SET_GATE(QIC_TIMER_CPI, qic_timer_interrupt); + QIC_SET_GATE(QIC_INVALIDATE_CPI, qic_invalidate_interrupt); + QIC_SET_GATE(QIC_RESCHEDULE_CPI, qic_reschedule_interrupt); + QIC_SET_GATE(QIC_ENABLE_IRQ_CPI, qic_enable_irq_interrupt); + QIC_SET_GATE(QIC_CALL_FUNCTION_CPI, qic_call_function_interrupt); + + + /* now put the VIC descriptor into the first 48 IRQs + * + * This is for later: first 16 correspond to PC IRQs; next 16 + * are Primary MC IRQs and final 16 are Secondary MC IRQs */ + for(i = 0; i < 48; i++) + irq_desc[i].handler = &vic_irq_type; +} + +/* send a CPI at level cpi to a set of cpus in cpuset (set 1 bit per + * processor to receive CPI */ +static void +send_CPI(__u32 cpuset, __u8 cpi) +{ + int cpu; + __u32 quad_cpuset = (cpuset & voyager_quad_processors); + + if(cpi < VIC_START_FAKE_CPI) { + /* fake CPI are only used for booting, so send to the + * extended quads as well---Quads must be VIC booted */ + outb((__u8)(cpuset), VIC_CPI_Registers[cpi]); + return; + } + if(quad_cpuset) + send_QIC_CPI(quad_cpuset, cpi); + cpuset &= ~quad_cpuset; + cpuset &= 0xff; /* only first 8 CPUs vaild for VIC CPI */ + if(cpuset == 0) + return; + for_each_online_cpu(cpu) { + if(cpuset & (1<qic_cpi[cpi].cpi; +} + +static void +ack_special_QIC_CPI(__u8 cpi) +{ + switch(cpi) { + case VIC_CMN_INT: + outb(QIC_CMN_INT, QIC_INTERRUPT_CLEAR0); + break; + case VIC_SYS_INT: + outb(QIC_SYS_INT, QIC_INTERRUPT_CLEAR0); + break; + } + /* also clear at the VIC, just in case (nop for non-extended proc) */ + ack_VIC_CPI(cpi); +} + +/* Acknowledge receipt of CPI in the VIC (essentially an EOI) */ +static void +ack_VIC_CPI(__u8 cpi) +{ +#ifdef VOYAGER_DEBUG + unsigned long flags; + __u16 isr; + __u8 cpu = smp_processor_id(); + + local_irq_save(flags); + isr = vic_read_isr(); + if((isr & (1<<(cpi &7))) == 0) { + printk("VOYAGER SMP: CPU%d lost CPI%d\n", cpu, cpi); + } +#endif + /* send specific EOI; the two system interrupts have + * bit 4 set for a separate vector but behave as the + * corresponding 3 bit intr */ + outb_p(0x60|(cpi & 7),0x20); + +#ifdef VOYAGER_DEBUG + if((vic_read_isr() & (1<<(cpi &7))) != 0) { + printk("VOYAGER SMP: CPU%d still asserting CPI%d\n", cpu, cpi); + } + local_irq_restore(flags); +#endif +} + +/* cribbed with thanks from irq.c */ +#define __byte(x,y) (((unsigned char *)&(y))[x]) +#define cached_21(cpu) (__byte(0,vic_irq_mask[cpu])) +#define cached_A1(cpu) (__byte(1,vic_irq_mask[cpu])) + +static unsigned int +startup_vic_irq(unsigned int irq) +{ + enable_vic_irq(irq); + + return 0; +} + +/* The enable and disable routines. This is where we run into + * conflicting architectural philosophy. Fundamentally, the voyager + * architecture does not expect to have to disable interrupts globally + * (the IRQ controllers belong to each CPU). The processor masquerade + * which is used to start the system shouldn't be used in a running OS + * since it will cause great confusion if two separate CPUs drive to + * the same IRQ controller (I know, I've tried it). + * + * The solution is a variant on the NCR lazy SPL design: + * + * 1) To disable an interrupt, do nothing (other than set the + * IRQ_DISABLED flag). This dares the interrupt actually to arrive. + * + * 2) If the interrupt dares to come in, raise the local mask against + * it (this will result in all the CPU masks being raised + * eventually). + * + * 3) To enable the interrupt, lower the mask on the local CPU and + * broadcast an Interrupt enable CPI which causes all other CPUs to + * adjust their masks accordingly. */ + +static void +enable_vic_irq(unsigned int irq) +{ + /* linux doesn't to processor-irq affinity, so enable on + * all CPUs we know about */ + int cpu = smp_processor_id(), real_cpu; + __u16 mask = (1<status |= IRQ_REPLAY | IRQ_INPROGRESS; + } else if(desc->status & IRQ_DISABLED) { + /* Damn, the interrupt actually arrived, do the lazy + * disable thing. The interrupt routine in irq.c will + * not handle a IRQ_DISABLED interrupt, so nothing more + * need be done here */ + VDEBUG(("VOYAGER DEBUG: lazy disable of irq %d on CPU %d\n", + irq, cpu)); + disable_local_vic_irq(irq); + desc->status |= IRQ_REPLAY; + } else { + desc->status &= ~IRQ_REPLAY; + } + + _raw_spin_unlock(&vic_irq_lock); +} + +/* Finish the VIC interrupt: basically mask */ +static void +after_handle_vic_irq(unsigned int irq) +{ + irq_desc_t *desc = irq_desc + irq; + + _raw_spin_lock(&vic_irq_lock); + { + unsigned int status = desc->status & ~IRQ_INPROGRESS; +#ifdef VOYAGER_DEBUG + __u16 isr; +#endif + + desc->status = status; + if ((status & IRQ_DISABLED)) + disable_local_vic_irq(irq); +#ifdef VOYAGER_DEBUG + /* DEBUG: before we ack, check what's in progress */ + isr = vic_read_isr(); + if((isr & (1<status &= ~(IRQ_REPLAY | IRQ_INPROGRESS); + } +#ifdef VOYAGER_DEBUG + isr = vic_read_isr(); + if((isr & (1<= 32) + /* You can only have 32 interrupts in a voyager system + * (and 32 only if you have a secondary microchannel + * bus) */ + return; + + for_each_online_cpu(cpu) { + unsigned long cpu_mask = 1 << cpu; + + if(cpu_mask & real_mask) { + /* enable the interrupt for this cpu */ + cpu_irq_affinity[cpu] |= irq_mask; + } else { + /* disable the interrupt for this cpu */ + cpu_irq_affinity[cpu] &= ~irq_mask; + } + } + /* this is magic, we now have the correct affinity maps, so + * enable the interrupt. This will send an enable CPI to + * those cpu's who need to enable it in their local masks, + * causing them to correct for the new affinity . If the + * interrupt is currently globally disabled, it will simply be + * disabled again as it comes in (voyager lazy disable). If + * the affinity map is tightened to disable the interrupt on a + * cpu, it will be pushed off when it comes in */ + enable_vic_irq(irq); +} + +static void +ack_vic_irq(unsigned int irq) +{ + if (irq & 8) { + outb(0x62,0x20); /* Specific EOI to cascade */ + outb(0x60|(irq & 7),0xA0); + } else { + outb(0x60 | (irq & 7),0x20); + } +} + +/* enable the CPIs. In the VIC, the CPIs are delivered by the 8259 + * but are not vectored by it. This means that the 8259 mask must be + * lowered to receive them */ +static __init void +vic_enable_cpi(void) +{ + __u8 cpu = smp_processor_id(); + + /* just take a copy of the current mask (nop for boot cpu) */ + vic_irq_mask[cpu] = vic_irq_mask[boot_cpu_id]; + + enable_local_vic_irq(VIC_CPI_LEVEL0); + enable_local_vic_irq(VIC_CPI_LEVEL1); + /* for sys int and cmn int */ + enable_local_vic_irq(7); + + if(is_cpu_quad()) { + outb(QIC_DEFAULT_MASK0, QIC_MASK_REGISTER0); + outb(QIC_CPI_ENABLE, QIC_MASK_REGISTER1); + VDEBUG(("VOYAGER SMP: QIC ENABLE CPI: CPU%d: MASK 0x%x\n", + cpu, QIC_CPI_ENABLE)); + } + + VDEBUG(("VOYAGER SMP: ENABLE CPI: CPU%d: MASK 0x%x\n", + cpu, vic_irq_mask[cpu])); +} + +void +voyager_smp_dump() +{ + int old_cpu = smp_processor_id(), cpu; + + /* dump the interrupt masks of each processor */ + for_each_online_cpu(cpu) { + __u16 imr, isr, irr; + unsigned long flags; + + local_irq_save(flags); + outb(VIC_CPU_MASQUERADE_ENABLE | cpu, VIC_PROCESSOR_ID); + imr = (inb(0xa1) << 8) | inb(0x21); + outb(0x0a, 0xa0); + irr = inb(0xa0) << 8; + outb(0x0a, 0x20); + irr |= inb(0x20); + outb(0x0b, 0xa0); + isr = inb(0xa0) << 8; + outb(0x0b, 0x20); + isr |= inb(0x20); + outb(old_cpu, VIC_PROCESSOR_ID); + local_irq_restore(flags); + printk("\tCPU%d: mask=0x%x, IMR=0x%x, IRR=0x%x, ISR=0x%x\n", + cpu, vic_irq_mask[cpu], imr, irr, isr); +#if 0 + /* These lines are put in to try to unstick an un ack'd irq */ + if(isr != 0) { + int irq; + for(irq=0; irq<16; irq++) { + if(isr & (1< +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define THREAD_NAME "kvoyagerd" + +/* external variables */ +int kvoyagerd_running = 0; +DECLARE_MUTEX_LOCKED(kvoyagerd_sem); + +static int thread(void *); + +static __u8 set_timeout = 0; + +/* Start the machine monitor thread. Return 1 if OK, 0 if fail */ +static int __init +voyager_thread_start(void) +{ + if(kernel_thread(thread, NULL, CLONE_KERNEL) < 0) { + /* This is serious, but not fatal */ + printk(KERN_ERR "Voyager: Failed to create system monitor thread!!!\n"); + return 1; + } + return 0; +} + +static int +execute(const char *string) +{ + int ret; + + char *envp[] = { + "HOME=/", + "TERM=linux", + "PATH=/sbin:/usr/sbin:/bin:/usr/bin", + NULL, + }; + char *argv[] = { + "/bin/bash", + "-c", + (char *)string, + NULL, + }; + + if ((ret = call_usermodehelper(argv[0], argv, envp, 1)) != 0) { + printk(KERN_ERR "Voyager failed to run \"%s\": %i\n", + string, ret); + } + return ret; +} + +static void +check_from_kernel(void) +{ + if(voyager_status.switch_off) { + + /* FIXME: This should be configureable via proc */ + execute("umask 600; echo 0 > /etc/initrunlvl; kill -HUP 1"); + } else if(voyager_status.power_fail) { + VDEBUG(("Voyager daemon detected AC power failure\n")); + + /* FIXME: This should be configureable via proc */ + execute("umask 600; echo F > /etc/powerstatus; kill -PWR 1"); + set_timeout = 1; + } +} + +static void +check_continuing_condition(void) +{ + if(voyager_status.power_fail) { + __u8 data; + voyager_cat_psi(VOYAGER_PSI_SUBREAD, + VOYAGER_PSI_AC_FAIL_REG, &data); + if((data & 0x1f) == 0) { + /* all power restored */ + printk(KERN_NOTICE "VOYAGER AC power restored, cancelling shutdown\n"); + /* FIXME: should be user configureable */ + execute("umask 600; echo O > /etc/powerstatus; kill -PWR 1"); + set_timeout = 0; + } + } +} + +static void +wakeup(unsigned long unused) +{ + up(&kvoyagerd_sem); +} + +static int +thread(void *unused) +{ + struct timer_list wakeup_timer; + + kvoyagerd_running = 1; + + reparent_to_init(); + daemonize(THREAD_NAME); + + set_timeout = 0; + + init_timer(&wakeup_timer); + + sigfillset(¤t->blocked); + current->signal->tty = NULL; + + printk(KERN_NOTICE "Voyager starting monitor thread\n"); + + for(;;) { + down_interruptible(&kvoyagerd_sem); + VDEBUG(("Voyager Daemon awoken\n")); + if(voyager_status.request_from_kernel == 0) { + /* probably awoken from timeout */ + check_continuing_condition(); + } else { + check_from_kernel(); + voyager_status.request_from_kernel = 0; + } + if(set_timeout) { + del_timer(&wakeup_timer); + wakeup_timer.expires = HZ + jiffies; + wakeup_timer.function = wakeup; + add_timer(&wakeup_timer); + } + } +} + +static void __exit +voyager_thread_stop(void) +{ + /* FIXME: do nothing at the moment */ +} + +module_init(voyager_thread_start); +//module_exit(voyager_thread_stop); diff --git a/src/wraith/math-emu/README b/src/wraith/math-emu/README new file mode 100644 index 000000000..e6235491d --- /dev/null +++ b/src/wraith/math-emu/README @@ -0,0 +1,427 @@ + +---------------------------------------------------------------------------+ + | wm-FPU-emu an FPU emulator for 80386 and 80486SX microprocessors. | + | | + | Copyright (C) 1992,1993,1994,1995,1996,1997,1999 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@melbpc.org.au | + | | + | This program is free software; you can redistribute it and/or modify | + | it under the terms of the GNU General Public License version 2 as | + | published by the Free Software Foundation. | + | | + | This program is distributed in the hope that it will be useful, | + | but WITHOUT ANY WARRANTY; without even the implied warranty of | + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | + | GNU General Public License for more details. | + | | + | You should have received a copy of the GNU General Public License | + | along with this program; if not, write to the Free Software | + | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | + | | + +---------------------------------------------------------------------------+ + + + +wm-FPU-emu is an FPU emulator for Linux. It is derived from wm-emu387 +which was my 80387 emulator for early versions of djgpp (gcc under +msdos); wm-emu387 was in turn based upon emu387 which was written by +DJ Delorie for djgpp. The interface to the Linux kernel is based upon +the original Linux math emulator by Linus Torvalds. + +My target FPU for wm-FPU-emu is that described in the Intel486 +Programmer's Reference Manual (1992 edition). Unfortunately, numerous +facets of the functioning of the FPU are not well covered in the +Reference Manual. The information in the manual has been supplemented +with measurements on real 80486's. Unfortunately, it is simply not +possible to be sure that all of the peculiarities of the 80486 have +been discovered, so there is always likely to be obscure differences +in the detailed behaviour of the emulator and a real 80486. + +wm-FPU-emu does not implement all of the behaviour of the 80486 FPU, +but is very close. See "Limitations" later in this file for a list of +some differences. + +Please report bugs, etc to me at: + billm@melbpc.org.au +or b.metzenthen@medoto.unimelb.edu.au + +For more information on the emulator and on floating point topics, see +my web pages, currently at http://www.suburbia.net/~billm/ + + +--Bill Metzenthen + December 1999 + + +----------------------- Internals of wm-FPU-emu ----------------------- + +Numeric algorithms: +(1) Add, subtract, and multiply. Nothing remarkable in these. +(2) Divide has been tuned to get reasonable performance. The algorithm + is not the obvious one which most people seem to use, but is designed + to take advantage of the characteristics of the 80386. I expect that + it has been invented many times before I discovered it, but I have not + seen it. It is based upon one of those ideas which one carries around + for years without ever bothering to check it out. +(3) The sqrt function has been tuned to get good performance. It is based + upon Newton's classic method. Performance was improved by capitalizing + upon the properties of Newton's method, and the code is once again + structured taking account of the 80386 characteristics. +(4) The trig, log, and exp functions are based in each case upon quasi- + "optimal" polynomial approximations. My definition of "optimal" was + based upon getting good accuracy with reasonable speed. +(5) The argument reducing code for the trig function effectively uses + a value of pi which is accurate to more than 128 bits. As a consequence, + the reduced argument is accurate to more than 64 bits for arguments up + to a few pi, and accurate to more than 64 bits for most arguments, + even for arguments approaching 2^63. This is far superior to an + 80486, which uses a value of pi which is accurate to 66 bits. + +The code of the emulator is complicated slightly by the need to +account for a limited form of re-entrancy. Normally, the emulator will +emulate each FPU instruction to completion without interruption. +However, it may happen that when the emulator is accessing the user +memory space, swapping may be needed. In this case the emulator may be +temporarily suspended while disk i/o takes place. During this time +another process may use the emulator, thereby perhaps changing static +variables. The code which accesses user memory is confined to five +files: + fpu_entry.c + reg_ld_str.c + load_store.c + get_address.c + errors.c +As from version 1.12 of the emulator, no static variables are used +(apart from those in the kernel's per-process tables). The emulator is +therefore now fully re-entrant, rather than having just the restricted +form of re-entrancy which is required by the Linux kernel. + +----------------------- Limitations of wm-FPU-emu ----------------------- + +There are a number of differences between the current wm-FPU-emu +(version 2.01) and the 80486 FPU (apart from bugs). The differences +are fewer than those which applied to the 1.xx series of the emulator. +Some of the more important differences are listed below: + +The Roundup flag does not have much meaning for the transcendental +functions and its 80486 value with these functions is likely to differ +from its emulator value. + +In a few rare cases the Underflow flag obtained with the emulator will +be different from that obtained with an 80486. This occurs when the +following conditions apply simultaneously: +(a) the operands have a higher precision than the current setting of the + precision control (PC) flags. +(b) the underflow exception is masked. +(c) the magnitude of the exact result (before rounding) is less than 2^-16382. +(d) the magnitude of the final result (after rounding) is exactly 2^-16382. +(e) the magnitude of the exact result would be exactly 2^-16382 if the + operands were rounded to the current precision before the arithmetic + operation was performed. +If all of these apply, the emulator will set the Underflow flag but a real +80486 will not. + +NOTE: Certain formats of Extended Real are UNSUPPORTED. They are +unsupported by the 80486. They are the Pseudo-NaNs, Pseudoinfinities, +and Unnormals. None of these will be generated by an 80486 or by the +emulator. Do not use them. The emulator treats them differently in +detail from the way an 80486 does. + +Self modifying code can cause the emulator to fail. An example of such +code is: + movl %esp,[%ebx] + fld1 +The FPU instruction may be (usually will be) loaded into the pre-fetch +queue of the CPU before the mov instruction is executed. If the +destination of the 'movl' overlaps the FPU instruction then the bytes +in the prefetch queue and memory will be inconsistent when the FPU +instruction is executed. The emulator will be invoked but will not be +able to find the instruction which caused the device-not-present +exception. For this case, the emulator cannot emulate the behaviour of +an 80486DX. + +Handling of the address size override prefix byte (0x67) has not been +extensively tested yet. A major problem exists because using it in +vm86 mode can cause a general protection fault. Address offsets +greater than 0xffff appear to be illegal in vm86 mode but are quite +acceptable (and work) in real mode. A small test program developed to +check the addressing, and which runs successfully in real mode, +crashes dosemu under Linux and also brings Windows down with a general +protection fault message when run under the MS-DOS prompt of Windows +3.1. (The program simply reads data from a valid address). + +The emulator supports 16-bit protected mode, with one difference from +an 80486DX. A 80486DX will allow some floating point instructions to +write a few bytes below the lowest address of the stack. The emulator +will not allow this in 16-bit protected mode: no instructions are +allowed to write outside the bounds set by the protection. + +----------------------- Performance of wm-FPU-emu ----------------------- + +Speed. +----- + +The speed of floating point computation with the emulator will depend +upon instruction mix. Relative performance is best for the instructions +which require most computation. The simple instructions are adversely +affected by the FPU instruction trap overhead. + + +Timing: Some simple timing tests have been made on the emulator functions. +The times include load/store instructions. All times are in microseconds +measured on a 33MHz 386 with 64k cache. The Turbo C tests were under +ms-dos, the next two columns are for emulators running with the djgpp +ms-dos extender. The final column is for wm-FPU-emu in Linux 0.97, +using libm4.0 (hard). + +function Turbo C djgpp 1.06 WM-emu387 wm-FPU-emu + + + 60.5 154.8 76.5 139.4 + - 61.1-65.5 157.3-160.8 76.2-79.5 142.9-144.7 + * 71.0 190.8 79.6 146.6 + / 61.2-75.0 261.4-266.9 75.3-91.6 142.2-158.1 + + sin() 310.8 4692.0 319.0 398.5 + cos() 284.4 4855.2 308.0 388.7 + tan() 495.0 8807.1 394.9 504.7 + atan() 328.9 4866.4 601.1 419.5-491.9 + + sqrt() 128.7 crashed 145.2 227.0 + log() 413.1-419.1 5103.4-5354.21 254.7-282.2 409.4-437.1 + exp() 479.1 6619.2 469.1 850.8 + + +The performance under Linux is improved by the use of look-ahead code. +The following results show the improvement which is obtained under +Linux due to the look-ahead code. Also given are the times for the +original Linux emulator with the 4.1 'soft' lib. + + [ Linus' note: I changed look-ahead to be the default under linux, as + there was no reason not to use it after I had edited it to be + disabled during tracing ] + + wm-FPU-emu w original w + look-ahead 'soft' lib + + 106.4 190.2 + - 108.6-111.6 192.4-216.2 + * 113.4 193.1 + / 108.8-124.4 700.1-706.2 + + sin() 390.5 2642.0 + cos() 381.5 2767.4 + tan() 496.5 3153.3 + atan() 367.2-435.5 2439.4-3396.8 + + sqrt() 195.1 4732.5 + log() 358.0-387.5 3359.2-3390.3 + exp() 619.3 4046.4 + + +These figures are now somewhat out-of-date. The emulator has become +progressively slower for most functions as more of the 80486 features +have been implemented. + + +----------------------- Accuracy of wm-FPU-emu ----------------------- + + +The accuracy of the emulator is in almost all cases equal to or better +than that of an Intel 80486 FPU. + +The results of the basic arithmetic functions (+,-,*,/), and fsqrt +match those of an 80486 FPU. They are the best possible; the error for +these never exceeds 1/2 an lsb. The fprem and fprem1 instructions +return exact results; they have no error. + + +The following table compares the emulator accuracy for the sqrt(), +trig and log functions against the Turbo C "emulator". For this table, +each function was tested at about 400 points. Ideal worst-case results +would be 64 bits. The reduced Turbo C accuracy of cos() and tan() for +arguments greater than pi/4 can be thought of as being related to the +precision of the argument x; e.g. an argument of pi/2-(1e-10) which is +accurate to 64 bits can result in a relative accuracy in cos() of +about 64 + log2(cos(x)) = 31 bits. + + +Function Tested x range Worst result Turbo C + (relative bits) + +sqrt(x) 1 .. 2 64.1 63.2 +atan(x) 1e-10 .. 200 64.2 62.8 +cos(x) 0 .. pi/2-(1e-10) 64.4 (x <= pi/4) 62.4 + 64.1 (x = pi/2-(1e-10)) 31.9 +sin(x) 1e-10 .. pi/2 64.0 62.8 +tan(x) 1e-10 .. pi/2-(1e-10) 64.0 (x <= pi/4) 62.1 + 64.1 (x = pi/2-(1e-10)) 31.9 +exp(x) 0 .. 1 63.1 ** 62.9 +log(x) 1+1e-6 .. 2 63.8 ** 62.1 + +** The accuracy for exp() and log() is low because the FPU (emulator) +does not compute them directly; two operations are required. + + +The emulator passes the "paranoia" tests (compiled with gcc 2.3.3 or +later) for 'float' variables (24 bit precision numbers) when precision +control is set to 24, 53 or 64 bits, and for 'double' variables (53 +bit precision numbers) when precision control is set to 53 bits (a +properly performing FPU cannot pass the 'paranoia' tests for 'double' +variables when precision control is set to 64 bits). + +The code for reducing the argument for the trig functions (fsin, fcos, +fptan and fsincos) has been improved and now effectively uses a value +for pi which is accurate to more than 128 bits precision. As a +consequence, the accuracy of these functions for large arguments has +been dramatically improved (and is now very much better than an 80486 +FPU). There is also now no degradation of accuracy for fcos and fptan +for operands close to pi/2. Measured results are (note that the +definition of accuracy has changed slightly from that used for the +above table): + +Function Tested x range Worst result + (absolute bits) + +cos(x) 0 .. 9.22e+18 62.0 +sin(x) 1e-16 .. 9.22e+18 62.1 +tan(x) 1e-16 .. 9.22e+18 61.8 + +It is possible with some effort to find very large arguments which +give much degraded precision. For example, the integer number + 8227740058411162616.0 +is within about 10e-7 of a multiple of pi. To find the tan (for +example) of this number to 64 bits precision it would be necessary to +have a value of pi which had about 150 bits precision. The FPU +emulator computes the result to about 42.6 bits precision (the correct +result is about -9.739715e-8). On the other hand, an 80486 FPU returns +0.01059, which in relative terms is hopelessly inaccurate. + +For arguments close to critical angles (which occur at multiples of +pi/2) the emulator is more accurate than an 80486 FPU. For very large +arguments, the emulator is far more accurate. + + +Prior to version 1.20 of the emulator, the accuracy of the results for +the transcendental functions (in their principal range) was not as +good as the results from an 80486 FPU. From version 1.20, the accuracy +has been considerably improved and these functions now give measured +worst-case results which are better than the worst-case results given +by an 80486 FPU. + +The following table gives the measured results for the emulator. The +number of randomly selected arguments in each case is about half a +million. The group of three columns gives the frequency of the given +accuracy in number of times per million, thus the second of these +columns shows that an accuracy of between 63.80 and 63.89 bits was +found at a rate of 133 times per one million measurements for fsin. +The results show that the fsin, fcos and fptan instructions return +results which are in error (i.e. less accurate than the best possible +result (which is 64 bits)) for about one per cent of all arguments +between -pi/2 and +pi/2. The other instructions have a lower +frequency of results which are in error. The last two columns give +the worst accuracy which was found (in bits) and the approximate value +of the argument which produced it. + + frequency (per M) + ------------------- --------------- +instr arg range # tests 63.7 63.8 63.9 worst at arg + bits bits bits bits +----- ------------ ------- ---- ---- ----- ----- -------- +fsin (0,pi/2) 547756 0 133 10673 63.89 0.451317 +fcos (0,pi/2) 547563 0 126 10532 63.85 0.700801 +fptan (0,pi/2) 536274 11 267 10059 63.74 0.784876 +fpatan 4 quadrants 517087 0 8 1855 63.88 0.435121 (4q) +fyl2x (0,20) 541861 0 0 1323 63.94 1.40923 (x) +fyl2xp1 (-.293,.414) 520256 0 0 5678 63.93 0.408542 (x) +f2xm1 (-1,1) 538847 4 481 6488 63.79 0.167709 + + +Tests performed on an 80486 FPU showed results of lower accuracy. The +following table gives the results which were obtained with an AMD +486DX2/66 (other tests indicate that an Intel 486DX produces +identical results). The tests were basically the same as those used +to measure the emulator (the values, being random, were in general not +the same). The total number of tests for each instruction are given +at the end of the table, in case each about 100k tests were performed. +Another line of figures at the end of the table shows that most of the +instructions return results which are in error for more than 10 +percent of the arguments tested. + +The numbers in the body of the table give the approx number of times a +result of the given accuracy in bits (given in the left-most column) +was obtained per one million arguments. For three of the instructions, +two columns of results are given: * The second column for f2xm1 gives +the number cases where the results of the first column were for a +positive argument, this shows that this instruction gives better +results for positive arguments than it does for negative. * In the +cases of fcos and fptan, the first column gives the results when all +cases where arguments greater than 1.5 were removed from the results +given in the second column. Unlike the emulator, an 80486 FPU returns +results of relatively poor accuracy for these instructions when the +argument approaches pi/2. The table does not show those cases when the +accuracy of the results were less than 62 bits, which occurs quite +often for fsin and fptan when the argument approaches pi/2. This poor +accuracy is discussed above in relation to the Turbo C "emulator", and +the accuracy of the value of pi. + + +bits f2xm1 f2xm1 fpatan fcos fcos fyl2x fyl2xp1 fsin fptan fptan +62.0 0 0 0 0 437 0 0 0 0 925 +62.1 0 0 10 0 894 0 0 0 0 1023 +62.2 14 0 0 0 1033 0 0 0 0 945 +62.3 57 0 0 0 1202 0 0 0 0 1023 +62.4 385 0 0 10 1292 0 23 0 0 1178 +62.5 1140 0 0 119 1649 0 39 0 0 1149 +62.6 2037 0 0 189 1620 0 16 0 0 1169 +62.7 5086 14 0 646 2315 10 101 35 39 1402 +62.8 8818 86 0 984 3050 59 287 131 224 2036 +62.9 11340 1355 0 2126 4153 79 605 357 321 1948 +63.0 15557 4750 0 3319 5376 246 1281 862 808 2688 +63.1 20016 8288 0 4620 6628 511 2569 1723 1510 3302 +63.2 24945 11127 10 6588 8098 1120 4470 2968 2990 4724 +63.3 25686 12382 69 8774 10682 1906 6775 4482 5474 7236 +63.4 29219 14722 79 11109 12311 3094 9414 7259 8912 10587 +63.5 30458 14936 393 13802 15014 5874 12666 9609 13762 15262 +63.6 32439 16448 1277 17945 19028 10226 15537 14657 19158 20346 +63.7 35031 16805 4067 23003 23947 18910 20116 21333 25001 26209 +63.8 33251 15820 7673 24781 25675 24617 25354 24440 29433 30329 +63.9 33293 16833 18529 28318 29233 31267 31470 27748 29676 30601 + +Per cent with error: + 30.9 3.2 18.5 9.8 13.1 11.6 17.4 +Total arguments tested: + 70194 70099 101784 100641 100641 101799 128853 114893 102675 102675 + + +------------------------- Contributors ------------------------------- + +A number of people have contributed to the development of the +emulator, often by just reporting bugs, sometimes with suggested +fixes, and a few kind people have provided me with access in one way +or another to an 80486 machine. Contributors include (to those people +who I may have forgotten, please forgive me): + +Linus Torvalds +Tommy.Thorn@daimi.aau.dk +Andrew.Tridgell@anu.edu.au +Nick Holloway, alfie@dcs.warwick.ac.uk +Hermano Moura, moura@dcs.gla.ac.uk +Jon Jagger, J.Jagger@scp.ac.uk +Lennart Benschop +Brian Gallew, geek+@CMU.EDU +Thomas Staniszewski, ts3v+@andrew.cmu.edu +Martin Howell, mph@plasma.apana.org.au +M Saggaf, alsaggaf@athena.mit.edu +Peter Barker, PETER@socpsy.sci.fau.edu +tom@vlsivie.tuwien.ac.at +Dan Russel, russed@rpi.edu +Daniel Carosone, danielce@ee.mu.oz.au +cae@jpmorgan.com +Hamish Coleman, t933093@minyos.xx.rmit.oz.au +Bruce Evans, bde@kralizec.zeta.org.au +Timo Korvola, Timo.Korvola@hut.fi +Rick Lyons, rick@razorback.brisnet.org.au +Rick, jrs@world.std.com + +...and numerous others who responded to my request for help with +a real 80486. + diff --git a/src/wraith/math-emu/control_w.h b/src/wraith/math-emu/control_w.h new file mode 100644 index 000000000..ae2274dbd --- /dev/null +++ b/src/wraith/math-emu/control_w.h @@ -0,0 +1,45 @@ +/*---------------------------------------------------------------------------+ + | control_w.h | + | | + | Copyright (C) 1992,1993 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@vaxc.cc.monash.edu.au | + | | + +---------------------------------------------------------------------------*/ + +#ifndef _CONTROLW_H_ +#define _CONTROLW_H_ + +#ifdef __ASSEMBLY__ +#define _Const_(x) $##x +#else +#define _Const_(x) x +#endif + +#define CW_RC _Const_(0x0C00) /* rounding control */ +#define CW_PC _Const_(0x0300) /* precision control */ + +#define CW_Precision Const_(0x0020) /* loss of precision mask */ +#define CW_Underflow Const_(0x0010) /* underflow mask */ +#define CW_Overflow Const_(0x0008) /* overflow mask */ +#define CW_ZeroDiv Const_(0x0004) /* divide by zero mask */ +#define CW_Denormal Const_(0x0002) /* denormalized operand mask */ +#define CW_Invalid Const_(0x0001) /* invalid operation mask */ + +#define CW_Exceptions _Const_(0x003f) /* all masks */ + +#define RC_RND _Const_(0x0000) +#define RC_DOWN _Const_(0x0400) +#define RC_UP _Const_(0x0800) +#define RC_CHOP _Const_(0x0C00) + +/* p 15-5: Precision control bits affect only the following: + ADD, SUB(R), MUL, DIV(R), and SQRT */ +#define PR_24_BITS _Const_(0x000) +#define PR_53_BITS _Const_(0x200) +#define PR_64_BITS _Const_(0x300) +#define PR_RESERVED_BITS _Const_(0x100) +/* FULL_PRECISION simulates all exceptions masked */ +#define FULL_PRECISION (PR_64_BITS | RC_RND | 0x3f) + +#endif /* _CONTROLW_H_ */ diff --git a/src/wraith/math-emu/div_Xsig.S b/src/wraith/math-emu/div_Xsig.S new file mode 100644 index 000000000..f77ba3058 --- /dev/null +++ b/src/wraith/math-emu/div_Xsig.S @@ -0,0 +1,365 @@ + .file "div_Xsig.S" +/*---------------------------------------------------------------------------+ + | div_Xsig.S | + | | + | Division subroutine for 96 bit quantities | + | | + | Copyright (C) 1994,1995 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@jacobi.maths.monash.edu.au | + | | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | Divide the 96 bit quantity pointed to by a, by that pointed to by b, and | + | put the 96 bit result at the location d. | + | | + | The result may not be accurate to 96 bits. It is intended for use where | + | a result better than 64 bits is required. The result should usually be | + | good to at least 94 bits. | + | The returned result is actually divided by one half. This is done to | + | prevent overflow. | + | | + | .aaaaaaaaaaaaaa / .bbbbbbbbbbbbb -> .dddddddddddd | + | | + | void div_Xsig(Xsig *a, Xsig *b, Xsig *dest) | + | | + +---------------------------------------------------------------------------*/ + +#include "exception.h" +#include "fpu_emu.h" + + +#define XsigLL(x) (x) +#define XsigL(x) 4(x) +#define XsigH(x) 8(x) + + +#ifndef NON_REENTRANT_FPU +/* + Local storage on the stack: + Accumulator: FPU_accum_3:FPU_accum_2:FPU_accum_1:FPU_accum_0 + */ +#define FPU_accum_3 -4(%ebp) +#define FPU_accum_2 -8(%ebp) +#define FPU_accum_1 -12(%ebp) +#define FPU_accum_0 -16(%ebp) +#define FPU_result_3 -20(%ebp) +#define FPU_result_2 -24(%ebp) +#define FPU_result_1 -28(%ebp) + +#else +.data +/* + Local storage in a static area: + Accumulator: FPU_accum_3:FPU_accum_2:FPU_accum_1:FPU_accum_0 + */ + .align 4,0 +FPU_accum_3: + .long 0 +FPU_accum_2: + .long 0 +FPU_accum_1: + .long 0 +FPU_accum_0: + .long 0 +FPU_result_3: + .long 0 +FPU_result_2: + .long 0 +FPU_result_1: + .long 0 +#endif /* NON_REENTRANT_FPU */ + + +.text +ENTRY(div_Xsig) + pushl %ebp + movl %esp,%ebp +#ifndef NON_REENTRANT_FPU + subl $28,%esp +#endif /* NON_REENTRANT_FPU */ + + pushl %esi + pushl %edi + pushl %ebx + + movl PARAM1,%esi /* pointer to num */ + movl PARAM2,%ebx /* pointer to denom */ + +#ifdef PARANOID + testl $0x80000000, XsigH(%ebx) /* Divisor */ + je L_bugged +#endif /* PARANOID */ + + +/*---------------------------------------------------------------------------+ + | Divide: Return arg1/arg2 to arg3. | + | | + | The maximum returned value is (ignoring exponents) | + | .ffffffff ffffffff | + | ------------------ = 1.ffffffff fffffffe | + | .80000000 00000000 | + | and the minimum is | + | .80000000 00000000 | + | ------------------ = .80000000 00000001 (rounded) | + | .ffffffff ffffffff | + | | + +---------------------------------------------------------------------------*/ + + /* Save extended dividend in local register */ + + /* Divide by 2 to prevent overflow */ + clc + movl XsigH(%esi),%eax + rcrl %eax + movl %eax,FPU_accum_3 + movl XsigL(%esi),%eax + rcrl %eax + movl %eax,FPU_accum_2 + movl XsigLL(%esi),%eax + rcrl %eax + movl %eax,FPU_accum_1 + movl $0,%eax + rcrl %eax + movl %eax,FPU_accum_0 + + movl FPU_accum_2,%eax /* Get the current num */ + movl FPU_accum_3,%edx + +/*----------------------------------------------------------------------*/ +/* Initialization done. + Do the first 32 bits. */ + + /* We will divide by a number which is too large */ + movl XsigH(%ebx),%ecx + addl $1,%ecx + jnc LFirst_div_not_1 + + /* here we need to divide by 100000000h, + i.e., no division at all.. */ + mov %edx,%eax + jmp LFirst_div_done + +LFirst_div_not_1: + divl %ecx /* Divide the numerator by the augmented + denom ms dw */ + +LFirst_div_done: + movl %eax,FPU_result_3 /* Put the result in the answer */ + + mull XsigH(%ebx) /* mul by the ms dw of the denom */ + + subl %eax,FPU_accum_2 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_3 + + movl FPU_result_3,%eax /* Get the result back */ + mull XsigL(%ebx) /* now mul the ls dw of the denom */ + + subl %eax,FPU_accum_1 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_2 + sbbl $0,FPU_accum_3 + je LDo_2nd_32_bits /* Must check for non-zero result here */ + +#ifdef PARANOID + jb L_bugged_1 +#endif /* PARANOID */ + + /* need to subtract another once of the denom */ + incl FPU_result_3 /* Correct the answer */ + + movl XsigL(%ebx),%eax + movl XsigH(%ebx),%edx + subl %eax,FPU_accum_1 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_2 + +#ifdef PARANOID + sbbl $0,FPU_accum_3 + jne L_bugged_1 /* Must check for non-zero result here */ +#endif /* PARANOID */ + +/*----------------------------------------------------------------------*/ +/* Half of the main problem is done, there is just a reduced numerator + to handle now. + Work with the second 32 bits, FPU_accum_0 not used from now on */ +LDo_2nd_32_bits: + movl FPU_accum_2,%edx /* get the reduced num */ + movl FPU_accum_1,%eax + + /* need to check for possible subsequent overflow */ + cmpl XsigH(%ebx),%edx + jb LDo_2nd_div + ja LPrevent_2nd_overflow + + cmpl XsigL(%ebx),%eax + jb LDo_2nd_div + +LPrevent_2nd_overflow: +/* The numerator is greater or equal, would cause overflow */ + /* prevent overflow */ + subl XsigL(%ebx),%eax + sbbl XsigH(%ebx),%edx + movl %edx,FPU_accum_2 + movl %eax,FPU_accum_1 + + incl FPU_result_3 /* Reflect the subtraction in the answer */ + +#ifdef PARANOID + je L_bugged_2 /* Can't bump the result to 1.0 */ +#endif /* PARANOID */ + +LDo_2nd_div: + cmpl $0,%ecx /* augmented denom msw */ + jnz LSecond_div_not_1 + + /* %ecx == 0, we are dividing by 1.0 */ + mov %edx,%eax + jmp LSecond_div_done + +LSecond_div_not_1: + divl %ecx /* Divide the numerator by the denom ms dw */ + +LSecond_div_done: + movl %eax,FPU_result_2 /* Put the result in the answer */ + + mull XsigH(%ebx) /* mul by the ms dw of the denom */ + + subl %eax,FPU_accum_1 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_2 + +#ifdef PARANOID + jc L_bugged_2 +#endif /* PARANOID */ + + movl FPU_result_2,%eax /* Get the result back */ + mull XsigL(%ebx) /* now mul the ls dw of the denom */ + + subl %eax,FPU_accum_0 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_1 /* Subtract from the num local reg */ + sbbl $0,FPU_accum_2 + +#ifdef PARANOID + jc L_bugged_2 +#endif /* PARANOID */ + + jz LDo_3rd_32_bits + +#ifdef PARANOID + cmpl $1,FPU_accum_2 + jne L_bugged_2 +#endif /* PARANOID */ + + /* need to subtract another once of the denom */ + movl XsigL(%ebx),%eax + movl XsigH(%ebx),%edx + subl %eax,FPU_accum_0 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_1 + sbbl $0,FPU_accum_2 + +#ifdef PARANOID + jc L_bugged_2 + jne L_bugged_2 +#endif /* PARANOID */ + + addl $1,FPU_result_2 /* Correct the answer */ + adcl $0,FPU_result_3 + +#ifdef PARANOID + jc L_bugged_2 /* Must check for non-zero result here */ +#endif /* PARANOID */ + +/*----------------------------------------------------------------------*/ +/* The division is essentially finished here, we just need to perform + tidying operations. + Deal with the 3rd 32 bits */ +LDo_3rd_32_bits: + /* We use an approximation for the third 32 bits. + To take account of the 3rd 32 bits of the divisor + (call them del), we subtract del * (a/b) */ + + movl FPU_result_3,%eax /* a/b */ + mull XsigLL(%ebx) /* del */ + + subl %edx,FPU_accum_1 + + /* A borrow indicates that the result is negative */ + jnb LTest_over + + movl XsigH(%ebx),%edx + addl %edx,FPU_accum_1 + + subl $1,FPU_result_2 /* Adjust the answer */ + sbbl $0,FPU_result_3 + + /* The above addition might not have been enough, check again. */ + movl FPU_accum_1,%edx /* get the reduced num */ + cmpl XsigH(%ebx),%edx /* denom */ + jb LDo_3rd_div + + movl XsigH(%ebx),%edx + addl %edx,FPU_accum_1 + + subl $1,FPU_result_2 /* Adjust the answer */ + sbbl $0,FPU_result_3 + jmp LDo_3rd_div + +LTest_over: + movl FPU_accum_1,%edx /* get the reduced num */ + + /* need to check for possible subsequent overflow */ + cmpl XsigH(%ebx),%edx /* denom */ + jb LDo_3rd_div + + /* prevent overflow */ + subl XsigH(%ebx),%edx + movl %edx,FPU_accum_1 + + addl $1,FPU_result_2 /* Reflect the subtraction in the answer */ + adcl $0,FPU_result_3 + +LDo_3rd_div: + movl FPU_accum_0,%eax + movl FPU_accum_1,%edx + divl XsigH(%ebx) + + movl %eax,FPU_result_1 /* Rough estimate of third word */ + + movl PARAM3,%esi /* pointer to answer */ + + movl FPU_result_1,%eax + movl %eax,XsigLL(%esi) + movl FPU_result_2,%eax + movl %eax,XsigL(%esi) + movl FPU_result_3,%eax + movl %eax,XsigH(%esi) + +L_exit: + popl %ebx + popl %edi + popl %esi + + leave + ret + + +#ifdef PARANOID +/* The logic is wrong if we got here */ +L_bugged: + pushl EX_INTERNAL|0x240 + call EXCEPTION + pop %ebx + jmp L_exit + +L_bugged_1: + pushl EX_INTERNAL|0x241 + call EXCEPTION + pop %ebx + jmp L_exit + +L_bugged_2: + pushl EX_INTERNAL|0x242 + call EXCEPTION + pop %ebx + jmp L_exit +#endif /* PARANOID */ diff --git a/src/wraith/math-emu/div_small.S b/src/wraith/math-emu/div_small.S new file mode 100644 index 000000000..47099628f --- /dev/null +++ b/src/wraith/math-emu/div_small.S @@ -0,0 +1,47 @@ + .file "div_small.S" +/*---------------------------------------------------------------------------+ + | div_small.S | + | | + | Divide a 64 bit integer by a 32 bit integer & return remainder. | + | | + | Copyright (C) 1992,1995 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@jacobi.maths.monash.edu.au | + | | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | unsigned long FPU_div_small(unsigned long long *x, unsigned long y) | + +---------------------------------------------------------------------------*/ + +#include "fpu_emu.h" + +.text +ENTRY(FPU_div_small) + pushl %ebp + movl %esp,%ebp + + pushl %esi + + movl PARAM1,%esi /* pointer to num */ + movl PARAM2,%ecx /* The denominator */ + + movl 4(%esi),%eax /* Get the current num msw */ + xorl %edx,%edx + divl %ecx + + movl %eax,4(%esi) + + movl (%esi),%eax /* Get the num lsw */ + divl %ecx + + movl %eax,(%esi) + + movl %edx,%eax /* Return the remainder in eax */ + + popl %esi + + leave + ret + diff --git a/src/wraith/math-emu/errors.c b/src/wraith/math-emu/errors.c new file mode 100644 index 000000000..f755641cf --- /dev/null +++ b/src/wraith/math-emu/errors.c @@ -0,0 +1,737 @@ +/*---------------------------------------------------------------------------+ + | errors.c | + | | + | The error handling functions for wm-FPU-emu | + | | + | Copyright (C) 1992,1993,1994,1996 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@jacobi.maths.monash.edu.au | + | | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | Note: | + | The file contains code which accesses user memory. | + | Emulator static data may change when user memory is accessed, due to | + | other processes using the emulator while swapping is in progress. | + +---------------------------------------------------------------------------*/ + +#include + +#include + +#include "fpu_emu.h" +#include "fpu_system.h" +#include "exception.h" +#include "status_w.h" +#include "control_w.h" +#include "reg_constant.h" +#include "version.h" + +/* */ +#undef PRINT_MESSAGES +/* */ + + +void Un_impl(void) +{ + u_char byte1, FPU_modrm; + unsigned long address = FPU_ORIG_EIP; + + RE_ENTRANT_CHECK_OFF; + /* No need to verify_area(), we have previously fetched these bytes. */ + printk("Unimplemented FPU Opcode at eip=%p : ", (void __user *) address); + if ( FPU_CS == __USER_CS ) + { + while ( 1 ) + { + FPU_get_user(byte1, (u_char __user *) address); + if ( (byte1 & 0xf8) == 0xd8 ) break; + printk("[%02x]", byte1); + address++; + } + printk("%02x ", byte1); + FPU_get_user(FPU_modrm, 1 + (u_char __user *) address); + + if (FPU_modrm >= 0300) + printk("%02x (%02x+%d)\n", FPU_modrm, FPU_modrm & 0xf8, FPU_modrm & 7); + else + printk("/%d\n", (FPU_modrm >> 3) & 7); + } + else + { + printk("cs selector = %04x\n", FPU_CS); + } + + RE_ENTRANT_CHECK_ON; + + EXCEPTION(EX_Invalid); + +} + + +/* + Called for opcodes which are illegal and which are known to result in a + SIGILL with a real 80486. + */ +void FPU_illegal(void) +{ + math_abort(FPU_info,SIGILL); +} + + + +void FPU_printall(void) +{ + int i; + static const char *tag_desc[] = { "Valid", "Zero", "ERROR", "Empty", + "DeNorm", "Inf", "NaN" }; + u_char byte1, FPU_modrm; + unsigned long address = FPU_ORIG_EIP; + + RE_ENTRANT_CHECK_OFF; + /* No need to verify_area(), we have previously fetched these bytes. */ + printk("At %p:", (void *) address); + if ( FPU_CS == __USER_CS ) + { +#define MAX_PRINTED_BYTES 20 + for ( i = 0; i < MAX_PRINTED_BYTES; i++ ) + { + FPU_get_user(byte1, (u_char __user *) address); + if ( (byte1 & 0xf8) == 0xd8 ) + { + printk(" %02x", byte1); + break; + } + printk(" [%02x]", byte1); + address++; + } + if ( i == MAX_PRINTED_BYTES ) + printk(" [more..]\n"); + else + { + FPU_get_user(FPU_modrm, 1 + (u_char __user *) address); + + if (FPU_modrm >= 0300) + printk(" %02x (%02x+%d)\n", FPU_modrm, FPU_modrm & 0xf8, FPU_modrm & 7); + else + printk(" /%d, mod=%d rm=%d\n", + (FPU_modrm >> 3) & 7, (FPU_modrm >> 6) & 3, FPU_modrm & 7); + } + } + else + { + printk("%04x\n", FPU_CS); + } + + partial_status = status_word(); + +#ifdef DEBUGGING +if ( partial_status & SW_Backward ) printk("SW: backward compatibility\n"); +if ( partial_status & SW_C3 ) printk("SW: condition bit 3\n"); +if ( partial_status & SW_C2 ) printk("SW: condition bit 2\n"); +if ( partial_status & SW_C1 ) printk("SW: condition bit 1\n"); +if ( partial_status & SW_C0 ) printk("SW: condition bit 0\n"); +if ( partial_status & SW_Summary ) printk("SW: exception summary\n"); +if ( partial_status & SW_Stack_Fault ) printk("SW: stack fault\n"); +if ( partial_status & SW_Precision ) printk("SW: loss of precision\n"); +if ( partial_status & SW_Underflow ) printk("SW: underflow\n"); +if ( partial_status & SW_Overflow ) printk("SW: overflow\n"); +if ( partial_status & SW_Zero_Div ) printk("SW: divide by zero\n"); +if ( partial_status & SW_Denorm_Op ) printk("SW: denormalized operand\n"); +if ( partial_status & SW_Invalid ) printk("SW: invalid operation\n"); +#endif /* DEBUGGING */ + + printk(" SW: b=%d st=%ld es=%d sf=%d cc=%d%d%d%d ef=%d%d%d%d%d%d\n", + partial_status & 0x8000 ? 1 : 0, /* busy */ + (partial_status & 0x3800) >> 11, /* stack top pointer */ + partial_status & 0x80 ? 1 : 0, /* Error summary status */ + partial_status & 0x40 ? 1 : 0, /* Stack flag */ + partial_status & SW_C3?1:0, partial_status & SW_C2?1:0, /* cc */ + partial_status & SW_C1?1:0, partial_status & SW_C0?1:0, /* cc */ + partial_status & SW_Precision?1:0, partial_status & SW_Underflow?1:0, + partial_status & SW_Overflow?1:0, partial_status & SW_Zero_Div?1:0, + partial_status & SW_Denorm_Op?1:0, partial_status & SW_Invalid?1:0); + +printk(" CW: ic=%d rc=%ld%ld pc=%ld%ld iem=%d ef=%d%d%d%d%d%d\n", + control_word & 0x1000 ? 1 : 0, + (control_word & 0x800) >> 11, (control_word & 0x400) >> 10, + (control_word & 0x200) >> 9, (control_word & 0x100) >> 8, + control_word & 0x80 ? 1 : 0, + control_word & SW_Precision?1:0, control_word & SW_Underflow?1:0, + control_word & SW_Overflow?1:0, control_word & SW_Zero_Div?1:0, + control_word & SW_Denorm_Op?1:0, control_word & SW_Invalid?1:0); + + for ( i = 0; i < 8; i++ ) + { + FPU_REG *r = &st(i); + u_char tagi = FPU_gettagi(i); + switch (tagi) + { + case TAG_Empty: + continue; + break; + case TAG_Zero: + case TAG_Special: + tagi = FPU_Special(r); + case TAG_Valid: + printk("st(%d) %c .%04lx %04lx %04lx %04lx e%+-6d ", i, + getsign(r) ? '-' : '+', + (long)(r->sigh >> 16), + (long)(r->sigh & 0xFFFF), + (long)(r->sigl >> 16), + (long)(r->sigl & 0xFFFF), + exponent(r) - EXP_BIAS + 1); + break; + default: + printk("Whoops! Error in errors.c: tag%d is %d ", i, tagi); + continue; + break; + } + printk("%s\n", tag_desc[(int) (unsigned) tagi]); + } + + RE_ENTRANT_CHECK_ON; + +} + +static struct { + int type; + const char *name; +} exception_names[] = { + { EX_StackOver, "stack overflow" }, + { EX_StackUnder, "stack underflow" }, + { EX_Precision, "loss of precision" }, + { EX_Underflow, "underflow" }, + { EX_Overflow, "overflow" }, + { EX_ZeroDiv, "divide by zero" }, + { EX_Denormal, "denormalized operand" }, + { EX_Invalid, "invalid operation" }, + { EX_INTERNAL, "INTERNAL BUG in "FPU_VERSION }, + { 0, NULL } +}; + +/* + EX_INTERNAL is always given with a code which indicates where the + error was detected. + + Internal error types: + 0x14 in fpu_etc.c + 0x1nn in a *.c file: + 0x101 in reg_add_sub.c + 0x102 in reg_mul.c + 0x104 in poly_atan.c + 0x105 in reg_mul.c + 0x107 in fpu_trig.c + 0x108 in reg_compare.c + 0x109 in reg_compare.c + 0x110 in reg_add_sub.c + 0x111 in fpe_entry.c + 0x112 in fpu_trig.c + 0x113 in errors.c + 0x115 in fpu_trig.c + 0x116 in fpu_trig.c + 0x117 in fpu_trig.c + 0x118 in fpu_trig.c + 0x119 in fpu_trig.c + 0x120 in poly_atan.c + 0x121 in reg_compare.c + 0x122 in reg_compare.c + 0x123 in reg_compare.c + 0x125 in fpu_trig.c + 0x126 in fpu_entry.c + 0x127 in poly_2xm1.c + 0x128 in fpu_entry.c + 0x129 in fpu_entry.c + 0x130 in get_address.c + 0x131 in get_address.c + 0x132 in get_address.c + 0x133 in get_address.c + 0x140 in load_store.c + 0x141 in load_store.c + 0x150 in poly_sin.c + 0x151 in poly_sin.c + 0x160 in reg_ld_str.c + 0x161 in reg_ld_str.c + 0x162 in reg_ld_str.c + 0x163 in reg_ld_str.c + 0x164 in reg_ld_str.c + 0x170 in fpu_tags.c + 0x171 in fpu_tags.c + 0x172 in fpu_tags.c + 0x180 in reg_convert.c + 0x2nn in an *.S file: + 0x201 in reg_u_add.S + 0x202 in reg_u_div.S + 0x203 in reg_u_div.S + 0x204 in reg_u_div.S + 0x205 in reg_u_mul.S + 0x206 in reg_u_sub.S + 0x207 in wm_sqrt.S + 0x208 in reg_div.S + 0x209 in reg_u_sub.S + 0x210 in reg_u_sub.S + 0x211 in reg_u_sub.S + 0x212 in reg_u_sub.S + 0x213 in wm_sqrt.S + 0x214 in wm_sqrt.S + 0x215 in wm_sqrt.S + 0x220 in reg_norm.S + 0x221 in reg_norm.S + 0x230 in reg_round.S + 0x231 in reg_round.S + 0x232 in reg_round.S + 0x233 in reg_round.S + 0x234 in reg_round.S + 0x235 in reg_round.S + 0x236 in reg_round.S + 0x240 in div_Xsig.S + 0x241 in div_Xsig.S + 0x242 in div_Xsig.S + */ + +asmlinkage void FPU_exception(int n) +{ + int i, int_type; + + int_type = 0; /* Needed only to stop compiler warnings */ + if ( n & EX_INTERNAL ) + { + int_type = n - EX_INTERNAL; + n = EX_INTERNAL; + /* Set lots of exception bits! */ + partial_status |= (SW_Exc_Mask | SW_Summary | SW_Backward); + } + else + { + /* Extract only the bits which we use to set the status word */ + n &= (SW_Exc_Mask); + /* Set the corresponding exception bit */ + partial_status |= n; + /* Set summary bits iff exception isn't masked */ + if ( partial_status & ~control_word & CW_Exceptions ) + partial_status |= (SW_Summary | SW_Backward); + if ( n & (SW_Stack_Fault | EX_Precision) ) + { + if ( !(n & SW_C1) ) + /* This bit distinguishes over- from underflow for a stack fault, + and roundup from round-down for precision loss. */ + partial_status &= ~SW_C1; + } + } + + RE_ENTRANT_CHECK_OFF; + if ( (~control_word & n & CW_Exceptions) || (n == EX_INTERNAL) ) + { +#ifdef PRINT_MESSAGES + /* My message from the sponsor */ + printk(FPU_VERSION" "__DATE__" (C) W. Metzenthen.\n"); +#endif /* PRINT_MESSAGES */ + + /* Get a name string for error reporting */ + for (i=0; exception_names[i].type; i++) + if ( (exception_names[i].type & n) == exception_names[i].type ) + break; + + if (exception_names[i].type) + { +#ifdef PRINT_MESSAGES + printk("FP Exception: %s!\n", exception_names[i].name); +#endif /* PRINT_MESSAGES */ + } + else + printk("FPU emulator: Unknown Exception: 0x%04x!\n", n); + + if ( n == EX_INTERNAL ) + { + printk("FPU emulator: Internal error type 0x%04x\n", int_type); + FPU_printall(); + } +#ifdef PRINT_MESSAGES + else + FPU_printall(); +#endif /* PRINT_MESSAGES */ + + /* + * The 80486 generates an interrupt on the next non-control FPU + * instruction. So we need some means of flagging it. + * We use the ES (Error Summary) bit for this. + */ + } + RE_ENTRANT_CHECK_ON; + +#ifdef __DEBUG__ + math_abort(FPU_info,SIGFPE); +#endif /* __DEBUG__ */ + +} + + +/* Real operation attempted on a NaN. */ +/* Returns < 0 if the exception is unmasked */ +int real_1op_NaN(FPU_REG *a) +{ + int signalling, isNaN; + + isNaN = (exponent(a) == EXP_OVER) && (a->sigh & 0x80000000); + + /* The default result for the case of two "equal" NaNs (signs may + differ) is chosen to reproduce 80486 behaviour */ + signalling = isNaN && !(a->sigh & 0x40000000); + + if ( !signalling ) + { + if ( !isNaN ) /* pseudo-NaN, or other unsupported? */ + { + if ( control_word & CW_Invalid ) + { + /* Masked response */ + reg_copy(&CONST_QNaN, a); + } + EXCEPTION(EX_Invalid); + return (!(control_word & CW_Invalid) ? FPU_Exception : 0) | TAG_Special; + } + return TAG_Special; + } + + if ( control_word & CW_Invalid ) + { + /* The masked response */ + if ( !(a->sigh & 0x80000000) ) /* pseudo-NaN ? */ + { + reg_copy(&CONST_QNaN, a); + } + /* ensure a Quiet NaN */ + a->sigh |= 0x40000000; + } + + EXCEPTION(EX_Invalid); + + return (!(control_word & CW_Invalid) ? FPU_Exception : 0) | TAG_Special; +} + + +/* Real operation attempted on two operands, one a NaN. */ +/* Returns < 0 if the exception is unmasked */ +int real_2op_NaN(FPU_REG const *b, u_char tagb, + int deststnr, + FPU_REG const *defaultNaN) +{ + FPU_REG *dest = &st(deststnr); + FPU_REG const *a = dest; + u_char taga = FPU_gettagi(deststnr); + FPU_REG const *x; + int signalling, unsupported; + + if ( taga == TAG_Special ) + taga = FPU_Special(a); + if ( tagb == TAG_Special ) + tagb = FPU_Special(b); + + /* TW_NaN is also used for unsupported data types. */ + unsupported = ((taga == TW_NaN) + && !((exponent(a) == EXP_OVER) && (a->sigh & 0x80000000))) + || ((tagb == TW_NaN) + && !((exponent(b) == EXP_OVER) && (b->sigh & 0x80000000))); + if ( unsupported ) + { + if ( control_word & CW_Invalid ) + { + /* Masked response */ + FPU_copy_to_regi(&CONST_QNaN, TAG_Special, deststnr); + } + EXCEPTION(EX_Invalid); + return (!(control_word & CW_Invalid) ? FPU_Exception : 0) | TAG_Special; + } + + if (taga == TW_NaN) + { + x = a; + if (tagb == TW_NaN) + { + signalling = !(a->sigh & b->sigh & 0x40000000); + if ( significand(b) > significand(a) ) + x = b; + else if ( significand(b) == significand(a) ) + { + /* The default result for the case of two "equal" NaNs (signs may + differ) is chosen to reproduce 80486 behaviour */ + x = defaultNaN; + } + } + else + { + /* return the quiet version of the NaN in a */ + signalling = !(a->sigh & 0x40000000); + } + } + else +#ifdef PARANOID + if (tagb == TW_NaN) +#endif /* PARANOID */ + { + signalling = !(b->sigh & 0x40000000); + x = b; + } +#ifdef PARANOID + else + { + signalling = 0; + EXCEPTION(EX_INTERNAL|0x113); + x = &CONST_QNaN; + } +#endif /* PARANOID */ + + if ( (!signalling) || (control_word & CW_Invalid) ) + { + if ( ! x ) + x = b; + + if ( !(x->sigh & 0x80000000) ) /* pseudo-NaN ? */ + x = &CONST_QNaN; + + FPU_copy_to_regi(x, TAG_Special, deststnr); + + if ( !signalling ) + return TAG_Special; + + /* ensure a Quiet NaN */ + dest->sigh |= 0x40000000; + } + + EXCEPTION(EX_Invalid); + + return (!(control_word & CW_Invalid) ? FPU_Exception : 0) | TAG_Special; +} + + +/* Invalid arith operation on Valid registers */ +/* Returns < 0 if the exception is unmasked */ +asmlinkage int arith_invalid(int deststnr) +{ + + EXCEPTION(EX_Invalid); + + if ( control_word & CW_Invalid ) + { + /* The masked response */ + FPU_copy_to_regi(&CONST_QNaN, TAG_Special, deststnr); + } + + return (!(control_word & CW_Invalid) ? FPU_Exception : 0) | TAG_Valid; + +} + + +/* Divide a finite number by zero */ +asmlinkage int FPU_divide_by_zero(int deststnr, u_char sign) +{ + FPU_REG *dest = &st(deststnr); + int tag = TAG_Valid; + + if ( control_word & CW_ZeroDiv ) + { + /* The masked response */ + FPU_copy_to_regi(&CONST_INF, TAG_Special, deststnr); + setsign(dest, sign); + tag = TAG_Special; + } + + EXCEPTION(EX_ZeroDiv); + + return (!(control_word & CW_ZeroDiv) ? FPU_Exception : 0) | tag; + +} + + +/* This may be called often, so keep it lean */ +int set_precision_flag(int flags) +{ + if ( control_word & CW_Precision ) + { + partial_status &= ~(SW_C1 & flags); + partial_status |= flags; /* The masked response */ + return 0; + } + else + { + EXCEPTION(flags); + return 1; + } +} + + +/* This may be called often, so keep it lean */ +asmlinkage void set_precision_flag_up(void) +{ + if ( control_word & CW_Precision ) + partial_status |= (SW_Precision | SW_C1); /* The masked response */ + else + EXCEPTION(EX_Precision | SW_C1); +} + + +/* This may be called often, so keep it lean */ +asmlinkage void set_precision_flag_down(void) +{ + if ( control_word & CW_Precision ) + { /* The masked response */ + partial_status &= ~SW_C1; + partial_status |= SW_Precision; + } + else + EXCEPTION(EX_Precision); +} + + +asmlinkage int denormal_operand(void) +{ + if ( control_word & CW_Denormal ) + { /* The masked response */ + partial_status |= SW_Denorm_Op; + return TAG_Special; + } + else + { + EXCEPTION(EX_Denormal); + return TAG_Special | FPU_Exception; + } +} + + +asmlinkage int arith_overflow(FPU_REG *dest) +{ + int tag = TAG_Valid; + + if ( control_word & CW_Overflow ) + { + /* The masked response */ +/* ###### The response here depends upon the rounding mode */ + reg_copy(&CONST_INF, dest); + tag = TAG_Special; + } + else + { + /* Subtract the magic number from the exponent */ + addexponent(dest, (-3 * (1 << 13))); + } + + EXCEPTION(EX_Overflow); + if ( control_word & CW_Overflow ) + { + /* The overflow exception is masked. */ + /* By definition, precision is lost. + The roundup bit (C1) is also set because we have + "rounded" upwards to Infinity. */ + EXCEPTION(EX_Precision | SW_C1); + return tag; + } + + return tag; + +} + + +asmlinkage int arith_underflow(FPU_REG *dest) +{ + int tag = TAG_Valid; + + if ( control_word & CW_Underflow ) + { + /* The masked response */ + if ( exponent16(dest) <= EXP_UNDER - 63 ) + { + reg_copy(&CONST_Z, dest); + partial_status &= ~SW_C1; /* Round down. */ + tag = TAG_Zero; + } + else + { + stdexp(dest); + } + } + else + { + /* Add the magic number to the exponent. */ + addexponent(dest, (3 * (1 << 13)) + EXTENDED_Ebias); + } + + EXCEPTION(EX_Underflow); + if ( control_word & CW_Underflow ) + { + /* The underflow exception is masked. */ + EXCEPTION(EX_Precision); + return tag; + } + + return tag; + +} + + +void FPU_stack_overflow(void) +{ + + if ( control_word & CW_Invalid ) + { + /* The masked response */ + top--; + FPU_copy_to_reg0(&CONST_QNaN, TAG_Special); + } + + EXCEPTION(EX_StackOver); + + return; + +} + + +void FPU_stack_underflow(void) +{ + + if ( control_word & CW_Invalid ) + { + /* The masked response */ + FPU_copy_to_reg0(&CONST_QNaN, TAG_Special); + } + + EXCEPTION(EX_StackUnder); + + return; + +} + + +void FPU_stack_underflow_i(int i) +{ + + if ( control_word & CW_Invalid ) + { + /* The masked response */ + FPU_copy_to_regi(&CONST_QNaN, TAG_Special, i); + } + + EXCEPTION(EX_StackUnder); + + return; + +} + + +void FPU_stack_underflow_pop(int i) +{ + + if ( control_word & CW_Invalid ) + { + /* The masked response */ + FPU_copy_to_regi(&CONST_QNaN, TAG_Special, i); + FPU_pop(); + } + + EXCEPTION(EX_StackUnder); + + return; + +} + diff --git a/src/wraith/math-emu/exception.h b/src/wraith/math-emu/exception.h new file mode 100644 index 000000000..b463f21a8 --- /dev/null +++ b/src/wraith/math-emu/exception.h @@ -0,0 +1,53 @@ +/*---------------------------------------------------------------------------+ + | exception.h | + | | + | Copyright (C) 1992 W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@vaxc.cc.monash.edu.au | + | | + +---------------------------------------------------------------------------*/ + +#ifndef _EXCEPTION_H_ +#define _EXCEPTION_H_ + + +#ifdef __ASSEMBLY__ +#define Const_(x) $##x +#else +#define Const_(x) x +#endif + +#ifndef SW_C1 +#include "fpu_emu.h" +#endif /* SW_C1 */ + +#define FPU_BUSY Const_(0x8000) /* FPU busy bit (8087 compatibility) */ +#define EX_ErrorSummary Const_(0x0080) /* Error summary status */ +/* Special exceptions: */ +#define EX_INTERNAL Const_(0x8000) /* Internal error in wm-FPU-emu */ +#define EX_StackOver Const_(0x0041|SW_C1) /* stack overflow */ +#define EX_StackUnder Const_(0x0041) /* stack underflow */ +/* Exception flags: */ +#define EX_Precision Const_(0x0020) /* loss of precision */ +#define EX_Underflow Const_(0x0010) /* underflow */ +#define EX_Overflow Const_(0x0008) /* overflow */ +#define EX_ZeroDiv Const_(0x0004) /* divide by zero */ +#define EX_Denormal Const_(0x0002) /* denormalized operand */ +#define EX_Invalid Const_(0x0001) /* invalid operation */ + + +#define PRECISION_LOST_UP Const_((EX_Precision | SW_C1)) +#define PRECISION_LOST_DOWN Const_(EX_Precision) + + +#ifndef __ASSEMBLY__ + +#ifdef DEBUG +#define EXCEPTION(x) { printk("exception in %s at line %d\n", \ + __FILE__, __LINE__); FPU_exception(x); } +#else +#define EXCEPTION(x) FPU_exception(x) +#endif + +#endif /* __ASSEMBLY__ */ + +#endif /* _EXCEPTION_H_ */ diff --git a/src/wraith/math-emu/fpu_arith.c b/src/wraith/math-emu/fpu_arith.c new file mode 100644 index 000000000..6972dec01 --- /dev/null +++ b/src/wraith/math-emu/fpu_arith.c @@ -0,0 +1,174 @@ +/*---------------------------------------------------------------------------+ + | fpu_arith.c | + | | + | Code to implement the FPU register/register arithmetic instructions | + | | + | Copyright (C) 1992,1993,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +#include "fpu_system.h" +#include "fpu_emu.h" +#include "control_w.h" +#include "status_w.h" + + +void fadd__(void) +{ + /* fadd st,st(i) */ + int i = FPU_rm; + clear_C1(); + FPU_add(&st(i), FPU_gettagi(i), 0, control_word); +} + + +void fmul__(void) +{ + /* fmul st,st(i) */ + int i = FPU_rm; + clear_C1(); + FPU_mul(&st(i), FPU_gettagi(i), 0, control_word); +} + + + +void fsub__(void) +{ + /* fsub st,st(i) */ + clear_C1(); + FPU_sub(0, FPU_rm, control_word); +} + + +void fsubr_(void) +{ + /* fsubr st,st(i) */ + clear_C1(); + FPU_sub(REV, FPU_rm, control_word); +} + + +void fdiv__(void) +{ + /* fdiv st,st(i) */ + clear_C1(); + FPU_div(0, FPU_rm, control_word); +} + + +void fdivr_(void) +{ + /* fdivr st,st(i) */ + clear_C1(); + FPU_div(REV, FPU_rm, control_word); +} + + + +void fadd_i(void) +{ + /* fadd st(i),st */ + int i = FPU_rm; + clear_C1(); + FPU_add(&st(i), FPU_gettagi(i), i, control_word); +} + + +void fmul_i(void) +{ + /* fmul st(i),st */ + clear_C1(); + FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word); +} + + +void fsubri(void) +{ + /* fsubr st(i),st */ + clear_C1(); + FPU_sub(DEST_RM, FPU_rm, control_word); +} + + +void fsub_i(void) +{ + /* fsub st(i),st */ + clear_C1(); + FPU_sub(REV|DEST_RM, FPU_rm, control_word); +} + + +void fdivri(void) +{ + /* fdivr st(i),st */ + clear_C1(); + FPU_div(DEST_RM, FPU_rm, control_word); +} + + +void fdiv_i(void) +{ + /* fdiv st(i),st */ + clear_C1(); + FPU_div(REV|DEST_RM, FPU_rm, control_word); +} + + + +void faddp_(void) +{ + /* faddp st(i),st */ + int i = FPU_rm; + clear_C1(); + if ( FPU_add(&st(i), FPU_gettagi(i), i, control_word) >= 0 ) + FPU_pop(); +} + + +void fmulp_(void) +{ + /* fmulp st(i),st */ + clear_C1(); + if ( FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word) >= 0 ) + FPU_pop(); +} + + + +void fsubrp(void) +{ + /* fsubrp st(i),st */ + clear_C1(); + if ( FPU_sub(DEST_RM, FPU_rm, control_word) >= 0 ) + FPU_pop(); +} + + +void fsubp_(void) +{ + /* fsubp st(i),st */ + clear_C1(); + if ( FPU_sub(REV|DEST_RM, FPU_rm, control_word) >= 0 ) + FPU_pop(); +} + + +void fdivrp(void) +{ + /* fdivrp st(i),st */ + clear_C1(); + if ( FPU_div(DEST_RM, FPU_rm, control_word) >= 0 ) + FPU_pop(); +} + + +void fdivp_(void) +{ + /* fdivp st(i),st */ + clear_C1(); + if ( FPU_div(REV|DEST_RM, FPU_rm, control_word) >= 0 ) + FPU_pop(); +} diff --git a/src/wraith/math-emu/fpu_asm.h b/src/wraith/math-emu/fpu_asm.h new file mode 100644 index 000000000..9ba12416d --- /dev/null +++ b/src/wraith/math-emu/fpu_asm.h @@ -0,0 +1,32 @@ +/*---------------------------------------------------------------------------+ + | fpu_asm.h | + | | + | Copyright (C) 1992,1995,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@suburbia.net | + | | + +---------------------------------------------------------------------------*/ + +#ifndef _FPU_ASM_H_ +#define _FPU_ASM_H_ + +#include + +#define EXCEPTION FPU_exception + + +#define PARAM1 8(%ebp) +#define PARAM2 12(%ebp) +#define PARAM3 16(%ebp) +#define PARAM4 20(%ebp) +#define PARAM5 24(%ebp) +#define PARAM6 28(%ebp) +#define PARAM7 32(%ebp) + +#define SIGL_OFFSET 0 +#define EXP(x) 8(x) +#define SIG(x) SIGL_OFFSET##(x) +#define SIGL(x) SIGL_OFFSET##(x) +#define SIGH(x) 4(x) + +#endif /* _FPU_ASM_H_ */ diff --git a/src/wraith/math-emu/fpu_aux.c b/src/wraith/math-emu/fpu_aux.c new file mode 100644 index 000000000..0251b2c6b --- /dev/null +++ b/src/wraith/math-emu/fpu_aux.c @@ -0,0 +1,204 @@ +/*---------------------------------------------------------------------------+ + | fpu_aux.c | + | | + | Code to implement some of the FPU auxiliary instructions. | + | | + | Copyright (C) 1992,1993,1994,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +#include "fpu_system.h" +#include "exception.h" +#include "fpu_emu.h" +#include "status_w.h" +#include "control_w.h" + + +static void fnop(void) +{ +} + +void fclex(void) +{ + partial_status &= ~(SW_Backward|SW_Summary|SW_Stack_Fault|SW_Precision| + SW_Underflow|SW_Overflow|SW_Zero_Div|SW_Denorm_Op| + SW_Invalid); + no_ip_update = 1; +} + +/* Needs to be externally visible */ +void finit(void) +{ + control_word = 0x037f; + partial_status = 0; + top = 0; /* We don't keep top in the status word internally. */ + fpu_tag_word = 0xffff; + /* The behaviour is different from that detailed in + Section 15.1.6 of the Intel manual */ + operand_address.offset = 0; + operand_address.selector = 0; + instruction_address.offset = 0; + instruction_address.selector = 0; + instruction_address.opcode = 0; + no_ip_update = 1; +} + +/* + * These are nops on the i387.. + */ +#define feni fnop +#define fdisi fnop +#define fsetpm fnop + +static FUNC const finit_table[] = { + feni, fdisi, fclex, finit, + fsetpm, FPU_illegal, FPU_illegal, FPU_illegal +}; + +void finit_(void) +{ + (finit_table[FPU_rm])(); +} + + +static void fstsw_ax(void) +{ + *(short *) &FPU_EAX = status_word(); + no_ip_update = 1; +} + +static FUNC const fstsw_table[] = { + fstsw_ax, FPU_illegal, FPU_illegal, FPU_illegal, + FPU_illegal, FPU_illegal, FPU_illegal, FPU_illegal +}; + +void fstsw_(void) +{ + (fstsw_table[FPU_rm])(); +} + + +static FUNC const fp_nop_table[] = { + fnop, FPU_illegal, FPU_illegal, FPU_illegal, + FPU_illegal, FPU_illegal, FPU_illegal, FPU_illegal +}; + +void fp_nop(void) +{ + (fp_nop_table[FPU_rm])(); +} + + +void fld_i_(void) +{ + FPU_REG *st_new_ptr; + int i; + u_char tag; + + if ( STACK_OVERFLOW ) + { FPU_stack_overflow(); return; } + + /* fld st(i) */ + i = FPU_rm; + if ( NOT_EMPTY(i) ) + { + reg_copy(&st(i), st_new_ptr); + tag = FPU_gettagi(i); + push(); + FPU_settag0(tag); + } + else + { + if ( control_word & CW_Invalid ) + { + /* The masked response */ + FPU_stack_underflow(); + } + else + EXCEPTION(EX_StackUnder); + } + +} + + +void fxch_i(void) +{ + /* fxch st(i) */ + FPU_REG t; + int i = FPU_rm; + FPU_REG *st0_ptr = &st(0), *sti_ptr = &st(i); + long tag_word = fpu_tag_word; + int regnr = top & 7, regnri = ((regnr + i) & 7); + u_char st0_tag = (tag_word >> (regnr*2)) & 3; + u_char sti_tag = (tag_word >> (regnri*2)) & 3; + + if ( st0_tag == TAG_Empty ) + { + if ( sti_tag == TAG_Empty ) + { + FPU_stack_underflow(); + FPU_stack_underflow_i(i); + return; + } + if ( control_word & CW_Invalid ) + { + /* Masked response */ + FPU_copy_to_reg0(sti_ptr, sti_tag); + } + FPU_stack_underflow_i(i); + return; + } + if ( sti_tag == TAG_Empty ) + { + if ( control_word & CW_Invalid ) + { + /* Masked response */ + FPU_copy_to_regi(st0_ptr, st0_tag, i); + } + FPU_stack_underflow(); + return; + } + clear_C1(); + + reg_copy(st0_ptr, &t); + reg_copy(sti_ptr, st0_ptr); + reg_copy(&t, sti_ptr); + + tag_word &= ~(3 << (regnr*2)) & ~(3 << (regnri*2)); + tag_word |= (sti_tag << (regnr*2)) | (st0_tag << (regnri*2)); + fpu_tag_word = tag_word; +} + + +void ffree_(void) +{ + /* ffree st(i) */ + FPU_settagi(FPU_rm, TAG_Empty); +} + + +void ffreep(void) +{ + /* ffree st(i) + pop - unofficial code */ + FPU_settagi(FPU_rm, TAG_Empty); + FPU_pop(); +} + + +void fst_i_(void) +{ + /* fst st(i) */ + FPU_copy_to_regi(&st(0), FPU_gettag0(), FPU_rm); +} + + +void fstp_i(void) +{ + /* fstp st(i) */ + FPU_copy_to_regi(&st(0), FPU_gettag0(), FPU_rm); + FPU_pop(); +} + diff --git a/src/wraith/math-emu/fpu_emu.h b/src/wraith/math-emu/fpu_emu.h new file mode 100644 index 000000000..d62b20a3e --- /dev/null +++ b/src/wraith/math-emu/fpu_emu.h @@ -0,0 +1,217 @@ +/*---------------------------------------------------------------------------+ + | fpu_emu.h | + | | + | Copyright (C) 1992,1993,1994,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@suburbia.net | + | | + +---------------------------------------------------------------------------*/ + + +#ifndef _FPU_EMU_H_ +#define _FPU_EMU_H_ + +/* + * Define PECULIAR_486 to get a closer approximation to 80486 behaviour, + * rather than behaviour which appears to be cleaner. + * This is a matter of opinion: for all I know, the 80486 may simply + * be complying with the IEEE spec. Maybe one day I'll get to see the + * spec... + */ +#define PECULIAR_486 + +#ifdef __ASSEMBLY__ +#include "fpu_asm.h" +#define Const(x) $##x +#else +#define Const(x) x +#endif + +#define EXP_BIAS Const(0) +#define EXP_OVER Const(0x4000) /* smallest invalid large exponent */ +#define EXP_UNDER Const(-0x3fff) /* largest invalid small exponent */ +#define EXP_WAY_UNDER Const(-0x6000) /* Below the smallest denormal, but + still a 16 bit nr. */ +#define EXP_Infinity EXP_OVER +#define EXP_NaN EXP_OVER + +#define EXTENDED_Ebias Const(0x3fff) +#define EXTENDED_Emin (-0x3ffe) /* smallest valid exponent */ + +#define SIGN_POS Const(0) +#define SIGN_NEG Const(0x80) + +#define SIGN_Positive Const(0) +#define SIGN_Negative Const(0x8000) + + +/* Keep the order TAG_Valid, TAG_Zero, TW_Denormal */ +/* The following fold to 2 (Special) in the Tag Word */ +#define TW_Denormal Const(4) /* De-normal */ +#define TW_Infinity Const(5) /* + or - infinity */ +#define TW_NaN Const(6) /* Not a Number */ +#define TW_Unsupported Const(7) /* Not supported by an 80486 */ + +#define TAG_Valid Const(0) /* valid */ +#define TAG_Zero Const(1) /* zero */ +#define TAG_Special Const(2) /* De-normal, + or - infinity, + or Not a Number */ +#define TAG_Empty Const(3) /* empty */ + +#define LOADED_DATA Const(10101) /* Special st() number to identify + loaded data (not on stack). */ + +/* A few flags (must be >= 0x10). */ +#define REV 0x10 +#define DEST_RM 0x20 +#define LOADED 0x40 + +#define FPU_Exception Const(0x80000000) /* Added to tag returns. */ + + +#ifndef __ASSEMBLY__ + +#include "fpu_system.h" + +#include /* for struct _fpstate */ +#include +#include + +/* +#define RE_ENTRANT_CHECKING + */ + +#ifdef RE_ENTRANT_CHECKING +extern u_char emulating; +# define RE_ENTRANT_CHECK_OFF emulating = 0 +# define RE_ENTRANT_CHECK_ON emulating = 1 +#else +# define RE_ENTRANT_CHECK_OFF +# define RE_ENTRANT_CHECK_ON +#endif /* RE_ENTRANT_CHECKING */ + +#define FWAIT_OPCODE 0x9b +#define OP_SIZE_PREFIX 0x66 +#define ADDR_SIZE_PREFIX 0x67 +#define PREFIX_CS 0x2e +#define PREFIX_DS 0x3e +#define PREFIX_ES 0x26 +#define PREFIX_SS 0x36 +#define PREFIX_FS 0x64 +#define PREFIX_GS 0x65 +#define PREFIX_REPE 0xf3 +#define PREFIX_REPNE 0xf2 +#define PREFIX_LOCK 0xf0 +#define PREFIX_CS_ 1 +#define PREFIX_DS_ 2 +#define PREFIX_ES_ 3 +#define PREFIX_FS_ 4 +#define PREFIX_GS_ 5 +#define PREFIX_SS_ 6 +#define PREFIX_DEFAULT 7 + +struct address { + unsigned int offset; + unsigned int selector:16; + unsigned int opcode:11; + unsigned int empty:5; +}; +struct fpu__reg { + unsigned sigl; + unsigned sigh; + short exp; +}; + +typedef void (*FUNC)(void); +typedef struct fpu__reg FPU_REG; +typedef void (*FUNC_ST0)(FPU_REG *st0_ptr, u_char st0_tag); +typedef struct { u_char address_size, operand_size, segment; } + overrides; +/* This structure is 32 bits: */ +typedef struct { overrides override; + u_char default_mode; } fpu_addr_modes; +/* PROTECTED has a restricted meaning in the emulator; it is used + to signal that the emulator needs to do special things to ensure + that protection is respected in a segmented model. */ +#define PROTECTED 4 +#define SIXTEEN 1 /* We rely upon this being 1 (true) */ +#define VM86 SIXTEEN +#define PM16 (SIXTEEN | PROTECTED) +#define SEG32 PROTECTED +extern u_char const data_sizes_16[32]; + +#define register_base ((u_char *) registers ) +#define fpu_register(x) ( * ((FPU_REG *)( register_base + 10 * (x & 7) )) ) +#define st(x) ( * ((FPU_REG *)( register_base + 10 * ((top+x) & 7) )) ) + +#define STACK_OVERFLOW (FPU_stackoverflow(&st_new_ptr)) +#define NOT_EMPTY(i) (!FPU_empty_i(i)) + +#define NOT_EMPTY_ST0 (st0_tag ^ TAG_Empty) + +#define poppop() { FPU_pop(); FPU_pop(); } + +/* push() does not affect the tags */ +#define push() { top--; } + +#define signbyte(a) (((u_char *)(a))[9]) +#define getsign(a) (signbyte(a) & 0x80) +#define setsign(a,b) { if (b) signbyte(a) |= 0x80; else signbyte(a) &= 0x7f; } +#define copysign(a,b) { if (getsign(a)) signbyte(b) |= 0x80; \ + else signbyte(b) &= 0x7f; } +#define changesign(a) { signbyte(a) ^= 0x80; } +#define setpositive(a) { signbyte(a) &= 0x7f; } +#define setnegative(a) { signbyte(a) |= 0x80; } +#define signpositive(a) ( (signbyte(a) & 0x80) == 0 ) +#define signnegative(a) (signbyte(a) & 0x80) + +static inline void reg_copy(FPU_REG const *x, FPU_REG *y) +{ + *(short *)&(y->exp) = *(const short *)&(x->exp); + *(long long *)&(y->sigl) = *(const long long *)&(x->sigl); +} + +#define exponent(x) (((*(short *)&((x)->exp)) & 0x7fff) - EXTENDED_Ebias) +#define setexponentpos(x,y) { (*(short *)&((x)->exp)) = \ + ((y) + EXTENDED_Ebias) & 0x7fff; } +#define exponent16(x) (*(short *)&((x)->exp)) +#define setexponent16(x,y) { (*(short *)&((x)->exp)) = (y); } +#define addexponent(x,y) { (*(short *)&((x)->exp)) += (y); } +#define stdexp(x) { (*(short *)&((x)->exp)) += EXTENDED_Ebias; } + +#define isdenormal(ptr) (exponent(ptr) == EXP_BIAS+EXP_UNDER) + +#define significand(x) ( ((unsigned long long *)&((x)->sigl))[0] ) + + +/*----- Prototypes for functions written in assembler -----*/ +/* extern void reg_move(FPU_REG *a, FPU_REG *b); */ + +asmlinkage int FPU_normalize(FPU_REG *x); +asmlinkage int FPU_normalize_nuo(FPU_REG *x); +asmlinkage int FPU_u_sub(FPU_REG const *arg1, FPU_REG const *arg2, + FPU_REG *answ, unsigned int control_w, u_char sign, + int expa, int expb); +asmlinkage int FPU_u_mul(FPU_REG const *arg1, FPU_REG const *arg2, + FPU_REG *answ, unsigned int control_w, u_char sign, + int expon); +asmlinkage int FPU_u_div(FPU_REG const *arg1, FPU_REG const *arg2, + FPU_REG *answ, unsigned int control_w, u_char sign); +asmlinkage int FPU_u_add(FPU_REG const *arg1, FPU_REG const *arg2, + FPU_REG *answ, unsigned int control_w, u_char sign, + int expa, int expb); +asmlinkage int wm_sqrt(FPU_REG *n, int dummy1, int dummy2, + unsigned int control_w, u_char sign); +asmlinkage unsigned FPU_shrx(void *l, unsigned x); +asmlinkage unsigned FPU_shrxs(void *v, unsigned x); +asmlinkage unsigned long FPU_div_small(unsigned long long *x, unsigned long y); +asmlinkage int FPU_round(FPU_REG *arg, unsigned int extent, int dummy, + unsigned int control_w, u_char sign); + +#ifndef MAKING_PROTO +#include "fpu_proto.h" +#endif + +#endif /* __ASSEMBLY__ */ + +#endif /* _FPU_EMU_H_ */ diff --git a/src/wraith/math-emu/fpu_entry.c b/src/wraith/math-emu/fpu_entry.c new file mode 100644 index 000000000..633f954c3 --- /dev/null +++ b/src/wraith/math-emu/fpu_entry.c @@ -0,0 +1,760 @@ +/*---------------------------------------------------------------------------+ + | fpu_entry.c | + | | + | The entry functions for wm-FPU-emu | + | | + | Copyright (C) 1992,1993,1994,1996,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | See the files "README" and "COPYING" for further copyright and warranty | + | information. | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | Note: | + | The file contains code which accesses user memory. | + | Emulator static data may change when user memory is accessed, due to | + | other processes using the emulator while swapping is in progress. | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | math_emulate(), restore_i387_soft() and save_i387_soft() are the only | + | entry points for wm-FPU-emu. | + +---------------------------------------------------------------------------*/ + +#include +#include + +#include +#include + +#include "fpu_system.h" +#include "fpu_emu.h" +#include "exception.h" +#include "control_w.h" +#include "status_w.h" + +#define __BAD__ FPU_illegal /* Illegal on an 80486, causes SIGILL */ + +#ifndef NO_UNDOC_CODE /* Un-documented FPU op-codes supported by default. */ + +/* WARNING: These codes are not documented by Intel in their 80486 manual + and may not work on FPU clones or later Intel FPUs. */ + +/* Changes to support the un-doc codes provided by Linus Torvalds. */ + +#define _d9_d8_ fstp_i /* unofficial code (19) */ +#define _dc_d0_ fcom_st /* unofficial code (14) */ +#define _dc_d8_ fcompst /* unofficial code (1c) */ +#define _dd_c8_ fxch_i /* unofficial code (0d) */ +#define _de_d0_ fcompst /* unofficial code (16) */ +#define _df_c0_ ffreep /* unofficial code (07) ffree + pop */ +#define _df_c8_ fxch_i /* unofficial code (0f) */ +#define _df_d0_ fstp_i /* unofficial code (17) */ +#define _df_d8_ fstp_i /* unofficial code (1f) */ + +static FUNC const st_instr_table[64] = { + fadd__, fld_i_, __BAD__, __BAD__, fadd_i, ffree_, faddp_, _df_c0_, + fmul__, fxch_i, __BAD__, __BAD__, fmul_i, _dd_c8_, fmulp_, _df_c8_, + fcom_st, fp_nop, __BAD__, __BAD__, _dc_d0_, fst_i_, _de_d0_, _df_d0_, + fcompst, _d9_d8_, __BAD__, __BAD__, _dc_d8_, fstp_i, fcompp, _df_d8_, + fsub__, FPU_etc, __BAD__, finit_, fsubri, fucom_, fsubrp, fstsw_, + fsubr_, fconst, fucompp, __BAD__, fsub_i, fucomp, fsubp_, __BAD__, + fdiv__, FPU_triga, __BAD__, __BAD__, fdivri, __BAD__, fdivrp, __BAD__, + fdivr_, FPU_trigb, __BAD__, __BAD__, fdiv_i, __BAD__, fdivp_, __BAD__, +}; + +#else /* Support only documented FPU op-codes */ + +static FUNC const st_instr_table[64] = { + fadd__, fld_i_, __BAD__, __BAD__, fadd_i, ffree_, faddp_, __BAD__, + fmul__, fxch_i, __BAD__, __BAD__, fmul_i, __BAD__, fmulp_, __BAD__, + fcom_st, fp_nop, __BAD__, __BAD__, __BAD__, fst_i_, __BAD__, __BAD__, + fcompst, __BAD__, __BAD__, __BAD__, __BAD__, fstp_i, fcompp, __BAD__, + fsub__, FPU_etc, __BAD__, finit_, fsubri, fucom_, fsubrp, fstsw_, + fsubr_, fconst, fucompp, __BAD__, fsub_i, fucomp, fsubp_, __BAD__, + fdiv__, FPU_triga, __BAD__, __BAD__, fdivri, __BAD__, fdivrp, __BAD__, + fdivr_, FPU_trigb, __BAD__, __BAD__, fdiv_i, __BAD__, fdivp_, __BAD__, +}; + +#endif /* NO_UNDOC_CODE */ + + +#define _NONE_ 0 /* Take no special action */ +#define _REG0_ 1 /* Need to check for not empty st(0) */ +#define _REGI_ 2 /* Need to check for not empty st(0) and st(rm) */ +#define _REGi_ 0 /* Uses st(rm) */ +#define _PUSH_ 3 /* Need to check for space to push onto stack */ +#define _null_ 4 /* Function illegal or not implemented */ +#define _REGIi 5 /* Uses st(0) and st(rm), result to st(rm) */ +#define _REGIp 6 /* Uses st(0) and st(rm), result to st(rm) then pop */ +#define _REGIc 0 /* Compare st(0) and st(rm) */ +#define _REGIn 0 /* Uses st(0) and st(rm), but handle checks later */ + +#ifndef NO_UNDOC_CODE + +/* Un-documented FPU op-codes supported by default. (see above) */ + +static u_char const type_table[64] = { + _REGI_, _NONE_, _null_, _null_, _REGIi, _REGi_, _REGIp, _REGi_, + _REGI_, _REGIn, _null_, _null_, _REGIi, _REGI_, _REGIp, _REGI_, + _REGIc, _NONE_, _null_, _null_, _REGIc, _REG0_, _REGIc, _REG0_, + _REGIc, _REG0_, _null_, _null_, _REGIc, _REG0_, _REGIc, _REG0_, + _REGI_, _NONE_, _null_, _NONE_, _REGIi, _REGIc, _REGIp, _NONE_, + _REGI_, _NONE_, _REGIc, _null_, _REGIi, _REGIc, _REGIp, _null_, + _REGI_, _NONE_, _null_, _null_, _REGIi, _null_, _REGIp, _null_, + _REGI_, _NONE_, _null_, _null_, _REGIi, _null_, _REGIp, _null_ +}; + +#else /* Support only documented FPU op-codes */ + +static u_char const type_table[64] = { + _REGI_, _NONE_, _null_, _null_, _REGIi, _REGi_, _REGIp, _null_, + _REGI_, _REGIn, _null_, _null_, _REGIi, _null_, _REGIp, _null_, + _REGIc, _NONE_, _null_, _null_, _null_, _REG0_, _null_, _null_, + _REGIc, _null_, _null_, _null_, _null_, _REG0_, _REGIc, _null_, + _REGI_, _NONE_, _null_, _NONE_, _REGIi, _REGIc, _REGIp, _NONE_, + _REGI_, _NONE_, _REGIc, _null_, _REGIi, _REGIc, _REGIp, _null_, + _REGI_, _NONE_, _null_, _null_, _REGIi, _null_, _REGIp, _null_, + _REGI_, _NONE_, _null_, _null_, _REGIi, _null_, _REGIp, _null_ +}; + +#endif /* NO_UNDOC_CODE */ + + +#ifdef RE_ENTRANT_CHECKING +u_char emulating=0; +#endif /* RE_ENTRANT_CHECKING */ + +static int valid_prefix(u_char *Byte, u_char __user **fpu_eip, + overrides *override); + +asmlinkage void math_emulate(long arg) +{ + u_char FPU_modrm, byte1; + unsigned short code; + fpu_addr_modes addr_modes; + int unmasked; + FPU_REG loaded_data; + FPU_REG *st0_ptr; + u_char loaded_tag, st0_tag; + void __user *data_address; + struct address data_sel_off; + struct address entry_sel_off; + unsigned long code_base = 0; + unsigned long code_limit = 0; /* Initialized to stop compiler warnings */ + struct desc_struct code_descriptor; + +#ifdef RE_ENTRANT_CHECKING + if ( emulating ) + { + printk("ERROR: wm-FPU-emu is not RE-ENTRANT!\n"); + } + RE_ENTRANT_CHECK_ON; +#endif /* RE_ENTRANT_CHECKING */ + + if (!current->used_math) + { + finit(); + current->used_math = 1; + } + + SETUP_DATA_AREA(arg); + + FPU_ORIG_EIP = FPU_EIP; + + if ( (FPU_EFLAGS & 0x00020000) != 0 ) + { + /* Virtual 8086 mode */ + addr_modes.default_mode = VM86; + FPU_EIP += code_base = FPU_CS << 4; + code_limit = code_base + 0xffff; /* Assumes code_base <= 0xffff0000 */ + } + else if ( FPU_CS == __USER_CS && FPU_DS == __USER_DS ) + { + addr_modes.default_mode = 0; + } + else if ( FPU_CS == __KERNEL_CS ) + { + printk("math_emulate: %04x:%08lx\n",FPU_CS,FPU_EIP); + panic("Math emulation needed in kernel"); + } + else + { + + if ( (FPU_CS & 4) != 4 ) /* Must be in the LDT */ + { + /* Can only handle segmented addressing via the LDT + for now, and it must be 16 bit */ + printk("FPU emulator: Unsupported addressing mode\n"); + math_abort(FPU_info, SIGILL); + } + + code_descriptor = LDT_DESCRIPTOR(FPU_CS); + if ( SEG_D_SIZE(code_descriptor) ) + { + /* The above test may be wrong, the book is not clear */ + /* Segmented 32 bit protected mode */ + addr_modes.default_mode = SEG32; + } + else + { + /* 16 bit protected mode */ + addr_modes.default_mode = PM16; + } + FPU_EIP += code_base = SEG_BASE_ADDR(code_descriptor); + code_limit = code_base + + (SEG_LIMIT(code_descriptor)+1) * SEG_GRANULARITY(code_descriptor) + - 1; + if ( code_limit < code_base ) code_limit = 0xffffffff; + } + + FPU_lookahead = 1; + if (current->ptrace & PT_PTRACED) + FPU_lookahead = 0; + + if ( !valid_prefix(&byte1, (u_char __user **)&FPU_EIP, + &addr_modes.override) ) + { + RE_ENTRANT_CHECK_OFF; + printk("FPU emulator: Unknown prefix byte 0x%02x, probably due to\n" + "FPU emulator: self-modifying code! (emulation impossible)\n", + byte1); + RE_ENTRANT_CHECK_ON; + EXCEPTION(EX_INTERNAL|0x126); + math_abort(FPU_info,SIGILL); + } + +do_another_FPU_instruction: + + no_ip_update = 0; + + FPU_EIP++; /* We have fetched the prefix and first code bytes. */ + + if ( addr_modes.default_mode ) + { + /* This checks for the minimum instruction bytes. + We also need to check any extra (address mode) code access. */ + if ( FPU_EIP > code_limit ) + math_abort(FPU_info,SIGSEGV); + } + + if ( (byte1 & 0xf8) != 0xd8 ) + { + if ( byte1 == FWAIT_OPCODE ) + { + if (partial_status & SW_Summary) + goto do_the_FPU_interrupt; + else + goto FPU_fwait_done; + } +#ifdef PARANOID + EXCEPTION(EX_INTERNAL|0x128); + math_abort(FPU_info,SIGILL); +#endif /* PARANOID */ + } + + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(1); + FPU_get_user(FPU_modrm, (u_char __user *) FPU_EIP); + RE_ENTRANT_CHECK_ON; + FPU_EIP++; + + if (partial_status & SW_Summary) + { + /* Ignore the error for now if the current instruction is a no-wait + control instruction */ + /* The 80486 manual contradicts itself on this topic, + but a real 80486 uses the following instructions: + fninit, fnstenv, fnsave, fnstsw, fnstenv, fnclex. + */ + code = (FPU_modrm << 8) | byte1; + if ( ! ( (((code & 0xf803) == 0xe003) || /* fnclex, fninit, fnstsw */ + (((code & 0x3003) == 0x3001) && /* fnsave, fnstcw, fnstenv, + fnstsw */ + ((code & 0xc000) != 0xc000))) ) ) + { + /* + * We need to simulate the action of the kernel to FPU + * interrupts here. + */ + do_the_FPU_interrupt: + + FPU_EIP = FPU_ORIG_EIP; /* Point to current FPU instruction. */ + + RE_ENTRANT_CHECK_OFF; + current->thread.trap_no = 16; + current->thread.error_code = 0; + send_sig(SIGFPE, current, 1); + return; + } + } + + entry_sel_off.offset = FPU_ORIG_EIP; + entry_sel_off.selector = FPU_CS; + entry_sel_off.opcode = (byte1 << 8) | FPU_modrm; + + FPU_rm = FPU_modrm & 7; + + if ( FPU_modrm < 0300 ) + { + /* All of these instructions use the mod/rm byte to get a data address */ + + if ( (addr_modes.default_mode & SIXTEEN) + ^ (addr_modes.override.address_size == ADDR_SIZE_PREFIX) ) + data_address = FPU_get_address_16(FPU_modrm, &FPU_EIP, &data_sel_off, + addr_modes); + else + data_address = FPU_get_address(FPU_modrm, &FPU_EIP, &data_sel_off, + addr_modes); + + if ( addr_modes.default_mode ) + { + if ( FPU_EIP-1 > code_limit ) + math_abort(FPU_info,SIGSEGV); + } + + if ( !(byte1 & 1) ) + { + unsigned short status1 = partial_status; + + st0_ptr = &st(0); + st0_tag = FPU_gettag0(); + + /* Stack underflow has priority */ + if ( NOT_EMPTY_ST0 ) + { + if ( addr_modes.default_mode & PROTECTED ) + { + /* This table works for 16 and 32 bit protected mode */ + if ( access_limit < data_sizes_16[(byte1 >> 1) & 3] ) + math_abort(FPU_info,SIGSEGV); + } + + unmasked = 0; /* Do this here to stop compiler warnings. */ + switch ( (byte1 >> 1) & 3 ) + { + case 0: + unmasked = FPU_load_single((float __user *)data_address, + &loaded_data); + loaded_tag = unmasked & 0xff; + unmasked &= ~0xff; + break; + case 1: + loaded_tag = FPU_load_int32((long __user *)data_address, &loaded_data); + break; + case 2: + unmasked = FPU_load_double((double __user *)data_address, + &loaded_data); + loaded_tag = unmasked & 0xff; + unmasked &= ~0xff; + break; + case 3: + default: /* Used here to suppress gcc warnings. */ + loaded_tag = FPU_load_int16((short __user *)data_address, &loaded_data); + break; + } + + /* No more access to user memory, it is safe + to use static data now */ + + /* NaN operands have the next priority. */ + /* We have to delay looking at st(0) until after + loading the data, because that data might contain an SNaN */ + if ( ((st0_tag == TAG_Special) && isNaN(st0_ptr)) || + ((loaded_tag == TAG_Special) && isNaN(&loaded_data)) ) + { + /* Restore the status word; we might have loaded a + denormal. */ + partial_status = status1; + if ( (FPU_modrm & 0x30) == 0x10 ) + { + /* fcom or fcomp */ + EXCEPTION(EX_Invalid); + setcc(SW_C3 | SW_C2 | SW_C0); + if ( (FPU_modrm & 0x08) && (control_word & CW_Invalid) ) + FPU_pop(); /* fcomp, masked, so we pop. */ + } + else + { + if ( loaded_tag == TAG_Special ) + loaded_tag = FPU_Special(&loaded_data); +#ifdef PECULIAR_486 + /* This is not really needed, but gives behaviour + identical to an 80486 */ + if ( (FPU_modrm & 0x28) == 0x20 ) + /* fdiv or fsub */ + real_2op_NaN(&loaded_data, loaded_tag, 0, &loaded_data); + else +#endif /* PECULIAR_486 */ + /* fadd, fdivr, fmul, or fsubr */ + real_2op_NaN(&loaded_data, loaded_tag, 0, st0_ptr); + } + goto reg_mem_instr_done; + } + + if ( unmasked && !((FPU_modrm & 0x30) == 0x10) ) + { + /* Is not a comparison instruction. */ + if ( (FPU_modrm & 0x38) == 0x38 ) + { + /* fdivr */ + if ( (st0_tag == TAG_Zero) && + ((loaded_tag == TAG_Valid) + || (loaded_tag == TAG_Special + && isdenormal(&loaded_data))) ) + { + if ( FPU_divide_by_zero(0, getsign(&loaded_data)) + < 0 ) + { + /* We use the fact here that the unmasked + exception in the loaded data was for a + denormal operand */ + /* Restore the state of the denormal op bit */ + partial_status &= ~SW_Denorm_Op; + partial_status |= status1 & SW_Denorm_Op; + } + else + setsign(st0_ptr, getsign(&loaded_data)); + } + } + goto reg_mem_instr_done; + } + + switch ( (FPU_modrm >> 3) & 7 ) + { + case 0: /* fadd */ + clear_C1(); + FPU_add(&loaded_data, loaded_tag, 0, control_word); + break; + case 1: /* fmul */ + clear_C1(); + FPU_mul(&loaded_data, loaded_tag, 0, control_word); + break; + case 2: /* fcom */ + FPU_compare_st_data(&loaded_data, loaded_tag); + break; + case 3: /* fcomp */ + if ( !FPU_compare_st_data(&loaded_data, loaded_tag) + && !unmasked ) + FPU_pop(); + break; + case 4: /* fsub */ + clear_C1(); + FPU_sub(LOADED|loaded_tag, (int)&loaded_data, control_word); + break; + case 5: /* fsubr */ + clear_C1(); + FPU_sub(REV|LOADED|loaded_tag, (int)&loaded_data, control_word); + break; + case 6: /* fdiv */ + clear_C1(); + FPU_div(LOADED|loaded_tag, (int)&loaded_data, control_word); + break; + case 7: /* fdivr */ + clear_C1(); + if ( st0_tag == TAG_Zero ) + partial_status = status1; /* Undo any denorm tag, + zero-divide has priority. */ + FPU_div(REV|LOADED|loaded_tag, (int)&loaded_data, control_word); + break; + } + } + else + { + if ( (FPU_modrm & 0x30) == 0x10 ) + { + /* The instruction is fcom or fcomp */ + EXCEPTION(EX_StackUnder); + setcc(SW_C3 | SW_C2 | SW_C0); + if ( (FPU_modrm & 0x08) && (control_word & CW_Invalid) ) + FPU_pop(); /* fcomp */ + } + else + FPU_stack_underflow(); + } + reg_mem_instr_done: + operand_address = data_sel_off; + } + else + { + if ( !(no_ip_update = + FPU_load_store(((FPU_modrm & 0x38) | (byte1 & 6)) >> 1, + addr_modes, data_address)) ) + { + operand_address = data_sel_off; + } + } + + } + else + { + /* None of these instructions access user memory */ + u_char instr_index = (FPU_modrm & 0x38) | (byte1 & 7); + +#ifdef PECULIAR_486 + /* This is supposed to be undefined, but a real 80486 seems + to do this: */ + operand_address.offset = 0; + operand_address.selector = FPU_DS; +#endif /* PECULIAR_486 */ + + st0_ptr = &st(0); + st0_tag = FPU_gettag0(); + switch ( type_table[(int) instr_index] ) + { + case _NONE_: /* also _REGIc: _REGIn */ + break; + case _REG0_: + if ( !NOT_EMPTY_ST0 ) + { + FPU_stack_underflow(); + goto FPU_instruction_done; + } + break; + case _REGIi: + if ( !NOT_EMPTY_ST0 || !NOT_EMPTY(FPU_rm) ) + { + FPU_stack_underflow_i(FPU_rm); + goto FPU_instruction_done; + } + break; + case _REGIp: + if ( !NOT_EMPTY_ST0 || !NOT_EMPTY(FPU_rm) ) + { + FPU_stack_underflow_pop(FPU_rm); + goto FPU_instruction_done; + } + break; + case _REGI_: + if ( !NOT_EMPTY_ST0 || !NOT_EMPTY(FPU_rm) ) + { + FPU_stack_underflow(); + goto FPU_instruction_done; + } + break; + case _PUSH_: /* Only used by the fld st(i) instruction */ + break; + case _null_: + FPU_illegal(); + goto FPU_instruction_done; + default: + EXCEPTION(EX_INTERNAL|0x111); + goto FPU_instruction_done; + } + (*st_instr_table[(int) instr_index])(); + +FPU_instruction_done: + ; + } + + if ( ! no_ip_update ) + instruction_address = entry_sel_off; + +FPU_fwait_done: + +#ifdef DEBUG + RE_ENTRANT_CHECK_OFF; + FPU_printall(); + RE_ENTRANT_CHECK_ON; +#endif /* DEBUG */ + + if (FPU_lookahead && !need_resched()) + { + FPU_ORIG_EIP = FPU_EIP - code_base; + if ( valid_prefix(&byte1, (u_char __user **)&FPU_EIP, + &addr_modes.override) ) + goto do_another_FPU_instruction; + } + + if ( addr_modes.default_mode ) + FPU_EIP -= code_base; + + RE_ENTRANT_CHECK_OFF; +} + + +/* Support for prefix bytes is not yet complete. To properly handle + all prefix bytes, further changes are needed in the emulator code + which accesses user address space. Access to separate segments is + important for msdos emulation. */ +static int valid_prefix(u_char *Byte, u_char __user **fpu_eip, + overrides *override) +{ + u_char byte; + u_char __user *ip = *fpu_eip; + + *override = (overrides) { 0, 0, PREFIX_DEFAULT }; /* defaults */ + + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(1); + FPU_get_user(byte, ip); + RE_ENTRANT_CHECK_ON; + + while ( 1 ) + { + switch ( byte ) + { + case ADDR_SIZE_PREFIX: + override->address_size = ADDR_SIZE_PREFIX; + goto do_next_byte; + + case OP_SIZE_PREFIX: + override->operand_size = OP_SIZE_PREFIX; + goto do_next_byte; + + case PREFIX_CS: + override->segment = PREFIX_CS_; + goto do_next_byte; + case PREFIX_ES: + override->segment = PREFIX_ES_; + goto do_next_byte; + case PREFIX_SS: + override->segment = PREFIX_SS_; + goto do_next_byte; + case PREFIX_FS: + override->segment = PREFIX_FS_; + goto do_next_byte; + case PREFIX_GS: + override->segment = PREFIX_GS_; + goto do_next_byte; + case PREFIX_DS: + override->segment = PREFIX_DS_; + goto do_next_byte; + +/* lock is not a valid prefix for FPU instructions, + let the cpu handle it to generate a SIGILL. */ +/* case PREFIX_LOCK: */ + + /* rep.. prefixes have no meaning for FPU instructions */ + case PREFIX_REPE: + case PREFIX_REPNE: + + do_next_byte: + ip++; + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(1); + FPU_get_user(byte, ip); + RE_ENTRANT_CHECK_ON; + break; + case FWAIT_OPCODE: + *Byte = byte; + return 1; + default: + if ( (byte & 0xf8) == 0xd8 ) + { + *Byte = byte; + *fpu_eip = ip; + return 1; + } + else + { + /* Not a valid sequence of prefix bytes followed by + an FPU instruction. */ + *Byte = byte; /* Needed for error message. */ + return 0; + } + } + } +} + + +void math_abort(struct info * info, unsigned int signal) +{ + FPU_EIP = FPU_ORIG_EIP; + current->thread.trap_no = 16; + current->thread.error_code = 0; + send_sig(signal,current,1); + RE_ENTRANT_CHECK_OFF; + __asm__("movl %0,%%esp ; ret": :"g" (((long) info)-4)); +#ifdef PARANOID + printk("ERROR: wm-FPU-emu math_abort failed!\n"); +#endif /* PARANOID */ +} + + + +#define S387 ((struct i387_soft_struct *)s387) +#define sstatus_word() \ + ((S387->swd & ~SW_Top & 0xffff) | ((S387->ftop << SW_Top_Shift) & SW_Top)) + +int restore_i387_soft(void *s387, struct _fpstate __user *buf) +{ + u_char __user *d = (u_char __user *)buf; + int offset, other, i, tags, regnr, tag, newtop; + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ, d, 7*4 + 8*10); + if (__copy_from_user(&S387->cwd, d, 7*4)) + return -1; + RE_ENTRANT_CHECK_ON; + + d += 7*4; + + S387->ftop = (S387->swd >> SW_Top_Shift) & 7; + offset = (S387->ftop & 7) * 10; + other = 80 - offset; + + RE_ENTRANT_CHECK_OFF; + /* Copy all registers in stack order. */ + if (__copy_from_user(((u_char *)&S387->st_space)+offset, d, other)) + return -1; + if ( offset ) + if (__copy_from_user((u_char *)&S387->st_space, d+other, offset)) + return -1; + RE_ENTRANT_CHECK_ON; + + /* The tags may need to be corrected now. */ + tags = S387->twd; + newtop = S387->ftop; + for ( i = 0; i < 8; i++ ) + { + regnr = (i+newtop) & 7; + if ( ((tags >> ((regnr & 7)*2)) & 3) != TAG_Empty ) + { + /* The loaded data over-rides all other cases. */ + tag = FPU_tagof((FPU_REG *)((u_char *)S387->st_space + 10*regnr)); + tags &= ~(3 << (regnr*2)); + tags |= (tag & 3) << (regnr*2); + } + } + S387->twd = tags; + + return 0; +} + + +int save_i387_soft(void *s387, struct _fpstate __user * buf) +{ + u_char __user *d = (u_char __user *)buf; + int offset = (S387->ftop & 7) * 10, other = 80 - offset; + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE, d, 7*4 + 8*10); +#ifdef PECULIAR_486 + S387->cwd &= ~0xe080; + /* An 80486 sets nearly all of the reserved bits to 1. */ + S387->cwd |= 0xffff0040; + S387->swd = sstatus_word() | 0xffff0000; + S387->twd |= 0xffff0000; + S387->fcs &= ~0xf8000000; + S387->fos |= 0xffff0000; +#endif /* PECULIAR_486 */ + __copy_to_user(d, &S387->cwd, 7*4); + RE_ENTRANT_CHECK_ON; + + d += 7*4; + + RE_ENTRANT_CHECK_OFF; + /* Copy all registers in stack order. */ + if (__copy_to_user(d, ((u_char *)&S387->st_space)+offset, other)) + return -1; + if ( offset ) + if (__copy_to_user(d+other, (u_char *)&S387->st_space, offset)) + return -1 + RE_ENTRANT_CHECK_ON; + + return 1; +} diff --git a/src/wraith/math-emu/fpu_etc.c b/src/wraith/math-emu/fpu_etc.c new file mode 100644 index 000000000..e3b5d4655 --- /dev/null +++ b/src/wraith/math-emu/fpu_etc.c @@ -0,0 +1,143 @@ +/*---------------------------------------------------------------------------+ + | fpu_etc.c | + | | + | Implement a few FPU instructions. | + | | + | Copyright (C) 1992,1993,1994,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +#include "fpu_system.h" +#include "exception.h" +#include "fpu_emu.h" +#include "status_w.h" +#include "reg_constant.h" + + +static void fchs(FPU_REG *st0_ptr, u_char st0tag) +{ + if ( st0tag ^ TAG_Empty ) + { + signbyte(st0_ptr) ^= SIGN_NEG; + clear_C1(); + } + else + FPU_stack_underflow(); +} + + +static void fabs(FPU_REG *st0_ptr, u_char st0tag) +{ + if ( st0tag ^ TAG_Empty ) + { + setpositive(st0_ptr); + clear_C1(); + } + else + FPU_stack_underflow(); +} + + +static void ftst_(FPU_REG *st0_ptr, u_char st0tag) +{ + switch (st0tag) + { + case TAG_Zero: + setcc(SW_C3); + break; + case TAG_Valid: + if (getsign(st0_ptr) == SIGN_POS) + setcc(0); + else + setcc(SW_C0); + break; + case TAG_Special: + switch ( FPU_Special(st0_ptr) ) + { + case TW_Denormal: + if (getsign(st0_ptr) == SIGN_POS) + setcc(0); + else + setcc(SW_C0); + if ( denormal_operand() < 0 ) + { +#ifdef PECULIAR_486 + /* This is weird! */ + if (getsign(st0_ptr) == SIGN_POS) + setcc(SW_C3); +#endif /* PECULIAR_486 */ + return; + } + break; + case TW_NaN: + setcc(SW_C0|SW_C2|SW_C3); /* Operand is not comparable */ + EXCEPTION(EX_Invalid); + break; + case TW_Infinity: + if (getsign(st0_ptr) == SIGN_POS) + setcc(0); + else + setcc(SW_C0); + break; + default: + setcc(SW_C0|SW_C2|SW_C3); /* Operand is not comparable */ + EXCEPTION(EX_INTERNAL|0x14); + break; + } + break; + case TAG_Empty: + setcc(SW_C0|SW_C2|SW_C3); + EXCEPTION(EX_StackUnder); + break; + } +} + + +static void fxam(FPU_REG *st0_ptr, u_char st0tag) +{ + int c = 0; + switch (st0tag) + { + case TAG_Empty: + c = SW_C3|SW_C0; + break; + case TAG_Zero: + c = SW_C3; + break; + case TAG_Valid: + c = SW_C2; + break; + case TAG_Special: + switch ( FPU_Special(st0_ptr) ) + { + case TW_Denormal: + c = SW_C2|SW_C3; /* Denormal */ + break; + case TW_NaN: + /* We also use NaN for unsupported types. */ + if ( (st0_ptr->sigh & 0x80000000) && (exponent(st0_ptr) == EXP_OVER) ) + c = SW_C0; + break; + case TW_Infinity: + c = SW_C2|SW_C0; + break; + } + } + if ( getsign(st0_ptr) == SIGN_NEG ) + c |= SW_C1; + setcc(c); +} + + +static FUNC_ST0 const fp_etc_table[] = { + fchs, fabs, (FUNC_ST0)FPU_illegal, (FUNC_ST0)FPU_illegal, + ftst_, fxam, (FUNC_ST0)FPU_illegal, (FUNC_ST0)FPU_illegal +}; + +void FPU_etc(void) +{ + (fp_etc_table[FPU_rm])(&st(0), FPU_gettag0()); +} diff --git a/src/wraith/math-emu/fpu_proto.h b/src/wraith/math-emu/fpu_proto.h new file mode 100644 index 000000000..a9fe07c9b --- /dev/null +++ b/src/wraith/math-emu/fpu_proto.h @@ -0,0 +1,142 @@ +#ifndef _FPU_PROTO_H +#define _FPU_PROTO_H + +/* errors.c */ +extern void Un_impl(void); +extern void FPU_illegal(void); +extern void FPU_printall(void); +asmlinkage void FPU_exception(int n); +extern int real_1op_NaN(FPU_REG *a); +extern int real_2op_NaN(FPU_REG const *b, u_char tagb, int deststnr, + FPU_REG const *defaultNaN); +asmlinkage int arith_invalid(int deststnr); +asmlinkage int FPU_divide_by_zero(int deststnr, u_char sign); +extern int set_precision_flag(int flags); +asmlinkage void set_precision_flag_up(void); +asmlinkage void set_precision_flag_down(void); +asmlinkage int denormal_operand(void); +asmlinkage int arith_overflow(FPU_REG *dest); +asmlinkage int arith_underflow(FPU_REG *dest); +extern void FPU_stack_overflow(void); +extern void FPU_stack_underflow(void); +extern void FPU_stack_underflow_i(int i); +extern void FPU_stack_underflow_pop(int i); +/* fpu_arith.c */ +extern void fadd__(void); +extern void fmul__(void); +extern void fsub__(void); +extern void fsubr_(void); +extern void fdiv__(void); +extern void fdivr_(void); +extern void fadd_i(void); +extern void fmul_i(void); +extern void fsubri(void); +extern void fsub_i(void); +extern void fdivri(void); +extern void fdiv_i(void); +extern void faddp_(void); +extern void fmulp_(void); +extern void fsubrp(void); +extern void fsubp_(void); +extern void fdivrp(void); +extern void fdivp_(void); +/* fpu_aux.c */ +extern void fclex(void); +extern void finit(void); +extern void finit_(void); +extern void fstsw_(void); +extern void fp_nop(void); +extern void fld_i_(void); +extern void fxch_i(void); +extern void ffree_(void); +extern void ffreep(void); +extern void fst_i_(void); +extern void fstp_i(void); +/* fpu_entry.c */ +asmlinkage extern void math_emulate(long arg); +extern void math_abort(struct info *info, unsigned int signal); +/* fpu_etc.c */ +extern void FPU_etc(void); +/* fpu_tags.c */ +extern int FPU_gettag0(void); +extern int FPU_gettagi(int stnr); +extern int FPU_gettag(int regnr); +extern void FPU_settag0(int tag); +extern void FPU_settagi(int stnr, int tag); +extern void FPU_settag(int regnr, int tag); +extern int FPU_Special(FPU_REG const *ptr); +extern int isNaN(FPU_REG const *ptr); +extern void FPU_pop(void); +extern int FPU_empty_i(int stnr); +extern int FPU_stackoverflow(FPU_REG **st_new_ptr); +extern void FPU_copy_to_regi(FPU_REG const *r, u_char tag, int stnr); +extern void FPU_copy_to_reg1(FPU_REG const *r, u_char tag); +extern void FPU_copy_to_reg0(FPU_REG const *r, u_char tag); +/* fpu_trig.c */ +extern void FPU_triga(void); +extern void FPU_trigb(void); +/* get_address.c */ +extern void __user *FPU_get_address(u_char FPU_modrm, unsigned long *fpu_eip, + struct address *addr, fpu_addr_modes addr_modes); +extern void __user *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip, + struct address *addr, fpu_addr_modes addr_modes); +/* load_store.c */ +extern int FPU_load_store(u_char type, fpu_addr_modes addr_modes, + void __user *data_address); +/* poly_2xm1.c */ +extern int poly_2xm1(u_char sign, FPU_REG *arg, FPU_REG *result); +/* poly_atan.c */ +extern void poly_atan(FPU_REG *st0_ptr, u_char st0_tag, FPU_REG *st1_ptr, + u_char st1_tag); +/* poly_l2.c */ +extern void poly_l2(FPU_REG *st0_ptr, FPU_REG *st1_ptr, u_char st1_sign); +extern int poly_l2p1(u_char s0, u_char s1, FPU_REG *r0, FPU_REG *r1, + FPU_REG *d); +/* poly_sin.c */ +extern void poly_sine(FPU_REG *st0_ptr); +extern void poly_cos(FPU_REG *st0_ptr); +/* poly_tan.c */ +extern void poly_tan(FPU_REG *st0_ptr); +/* reg_add_sub.c */ +extern int FPU_add(FPU_REG const *b, u_char tagb, int destrnr, int control_w); +extern int FPU_sub(int flags, int rm, int control_w); +/* reg_compare.c */ +extern int FPU_compare_st_data(FPU_REG const *loaded_data, u_char loaded_tag); +extern void fcom_st(void); +extern void fcompst(void); +extern void fcompp(void); +extern void fucom_(void); +extern void fucomp(void); +extern void fucompp(void); +/* reg_constant.c */ +extern void fconst(void); +/* reg_ld_str.c */ +extern int FPU_load_extended(long double __user *s, int stnr); +extern int FPU_load_double(double __user *dfloat, FPU_REG *loaded_data); +extern int FPU_load_single(float __user *single, FPU_REG *loaded_data); +extern int FPU_load_int64(long long __user *_s); +extern int FPU_load_int32(long __user *_s, FPU_REG *loaded_data); +extern int FPU_load_int16(short __user *_s, FPU_REG *loaded_data); +extern int FPU_load_bcd(u_char __user *s); +extern int FPU_store_extended(FPU_REG *st0_ptr, u_char st0_tag, + long double __user *d); +extern int FPU_store_double(FPU_REG *st0_ptr, u_char st0_tag, double __user *dfloat); +extern int FPU_store_single(FPU_REG *st0_ptr, u_char st0_tag, float __user *single); +extern int FPU_store_int64(FPU_REG *st0_ptr, u_char st0_tag, long long __user *d); +extern int FPU_store_int32(FPU_REG *st0_ptr, u_char st0_tag, long __user *d); +extern int FPU_store_int16(FPU_REG *st0_ptr, u_char st0_tag, short __user *d); +extern int FPU_store_bcd(FPU_REG *st0_ptr, u_char st0_tag, u_char __user *d); +extern int FPU_round_to_int(FPU_REG *r, u_char tag); +extern u_char __user *fldenv(fpu_addr_modes addr_modes, u_char __user *s); +extern void frstor(fpu_addr_modes addr_modes, u_char __user *data_address); +extern u_char __user *fstenv(fpu_addr_modes addr_modes, u_char __user *d); +extern void fsave(fpu_addr_modes addr_modes, u_char __user *data_address); +extern int FPU_tagof(FPU_REG *ptr); +/* reg_mul.c */ +extern int FPU_mul(FPU_REG const *b, u_char tagb, int deststnr, int control_w); + +extern int FPU_div(int flags, int regrm, int control_w); +/* reg_convert.c */ +extern int FPU_to_exp16(FPU_REG const *a, FPU_REG *x); +#endif /* _FPU_PROTO_H */ + diff --git a/src/wraith/math-emu/fpu_system.h b/src/wraith/math-emu/fpu_system.h new file mode 100644 index 000000000..2ddfe120b --- /dev/null +++ b/src/wraith/math-emu/fpu_system.h @@ -0,0 +1,89 @@ +/*---------------------------------------------------------------------------+ + | fpu_system.h | + | | + | Copyright (C) 1992,1994,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@suburbia.net | + | | + +---------------------------------------------------------------------------*/ + +#ifndef _FPU_SYSTEM_H +#define _FPU_SYSTEM_H + +/* system dependent definitions */ + +#include +#include +#include + +/* This sets the pointer FPU_info to point to the argument part + of the stack frame of math_emulate() */ +#define SETUP_DATA_AREA(arg) FPU_info = (struct info *) &arg + +/* s is always from a cpu register, and the cpu does bounds checking + * during register load --> no further bounds checks needed */ +#define LDT_DESCRIPTOR(s) (((struct desc_struct *)current->mm->context.ldt)[(s) >> 3]) +#define SEG_D_SIZE(x) ((x).b & (3 << 21)) +#define SEG_G_BIT(x) ((x).b & (1 << 23)) +#define SEG_GRANULARITY(x) (((x).b & (1 << 23)) ? 4096 : 1) +#define SEG_286_MODE(x) ((x).b & ( 0xff000000 | 0xf0000 | (1 << 23))) +#define SEG_BASE_ADDR(s) (((s).b & 0xff000000) \ + | (((s).b & 0xff) << 16) | ((s).a >> 16)) +#define SEG_LIMIT(s) (((s).b & 0xff0000) | ((s).a & 0xffff)) +#define SEG_EXECUTE_ONLY(s) (((s).b & ((1 << 11) | (1 << 9))) == (1 << 11)) +#define SEG_WRITE_PERM(s) (((s).b & ((1 << 11) | (1 << 9))) == (1 << 9)) +#define SEG_EXPAND_DOWN(s) (((s).b & ((1 << 11) | (1 << 10))) \ + == (1 << 10)) + +#define I387 (current->thread.i387) +#define FPU_info (I387.soft.info) + +#define FPU_CS (*(unsigned short *) &(FPU_info->___cs)) +#define FPU_SS (*(unsigned short *) &(FPU_info->___ss)) +#define FPU_DS (*(unsigned short *) &(FPU_info->___ds)) +#define FPU_EAX (FPU_info->___eax) +#define FPU_EFLAGS (FPU_info->___eflags) +#define FPU_EIP (FPU_info->___eip) +#define FPU_ORIG_EIP (FPU_info->___orig_eip) + +#define FPU_lookahead (I387.soft.lookahead) + +/* nz if ip_offset and cs_selector are not to be set for the current + instruction. */ +#define no_ip_update (*(u_char *)&(I387.soft.no_update)) +#define FPU_rm (*(u_char *)&(I387.soft.rm)) + +/* Number of bytes of data which can be legally accessed by the current + instruction. This only needs to hold a number <= 108, so a byte will do. */ +#define access_limit (*(u_char *)&(I387.soft.alimit)) + +#define partial_status (I387.soft.swd) +#define control_word (I387.soft.cwd) +#define fpu_tag_word (I387.soft.twd) +#define registers (I387.soft.st_space) +#define top (I387.soft.ftop) + +#define instruction_address (*(struct address *)&I387.soft.fip) +#define operand_address (*(struct address *)&I387.soft.foo) + +#define FPU_verify_area(x,y,z) if ( verify_area(x,y,z) ) \ + math_abort(FPU_info,SIGSEGV) + +#undef FPU_IGNORE_CODE_SEGV +#ifdef FPU_IGNORE_CODE_SEGV +/* verify_area() is very expensive, and causes the emulator to run + about 20% slower if applied to the code. Anyway, errors due to bad + code addresses should be much rarer than errors due to bad data + addresses. */ +#define FPU_code_verify_area(z) +#else +/* A simpler test than verify_area() can probably be done for + FPU_code_verify_area() because the only possible error is to step + past the upper boundary of a legal code area. */ +#define FPU_code_verify_area(z) FPU_verify_area(VERIFY_READ,(void __user *)FPU_EIP,z) +#endif + +#define FPU_get_user(x,y) get_user((x),(y)) +#define FPU_put_user(x,y) put_user((x),(y)) + +#endif diff --git a/src/wraith/math-emu/fpu_tags.c b/src/wraith/math-emu/fpu_tags.c new file mode 100644 index 000000000..cb436fe20 --- /dev/null +++ b/src/wraith/math-emu/fpu_tags.c @@ -0,0 +1,127 @@ +/*---------------------------------------------------------------------------+ + | fpu_tags.c | + | | + | Set FPU register tags. | + | | + | Copyright (C) 1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@jacobi.maths.monash.edu.au | + | | + | | + +---------------------------------------------------------------------------*/ + +#include "fpu_emu.h" +#include "fpu_system.h" +#include "exception.h" + + +void FPU_pop(void) +{ + fpu_tag_word |= 3 << ((top & 7)*2); + top++; +} + + +int FPU_gettag0(void) +{ + return (fpu_tag_word >> ((top & 7)*2)) & 3; +} + + +int FPU_gettagi(int stnr) +{ + return (fpu_tag_word >> (((top+stnr) & 7)*2)) & 3; +} + + +int FPU_gettag(int regnr) +{ + return (fpu_tag_word >> ((regnr & 7)*2)) & 3; +} + + +void FPU_settag0(int tag) +{ + int regnr = top; + regnr &= 7; + fpu_tag_word &= ~(3 << (regnr*2)); + fpu_tag_word |= (tag & 3) << (regnr*2); +} + + +void FPU_settagi(int stnr, int tag) +{ + int regnr = stnr+top; + regnr &= 7; + fpu_tag_word &= ~(3 << (regnr*2)); + fpu_tag_word |= (tag & 3) << (regnr*2); +} + + +void FPU_settag(int regnr, int tag) +{ + regnr &= 7; + fpu_tag_word &= ~(3 << (regnr*2)); + fpu_tag_word |= (tag & 3) << (regnr*2); +} + + +int FPU_Special(FPU_REG const *ptr) +{ + int exp = exponent(ptr); + + if ( exp == EXP_BIAS+EXP_UNDER ) + return TW_Denormal; + else if ( exp != EXP_BIAS+EXP_OVER ) + return TW_NaN; + else if ( (ptr->sigh == 0x80000000) && (ptr->sigl == 0) ) + return TW_Infinity; + return TW_NaN; +} + + +int isNaN(FPU_REG const *ptr) +{ + return ( (exponent(ptr) == EXP_BIAS+EXP_OVER) + && !((ptr->sigh == 0x80000000) && (ptr->sigl == 0)) ); +} + + +int FPU_empty_i(int stnr) +{ + int regnr = (top+stnr) & 7; + + return ((fpu_tag_word >> (regnr*2)) & 3) == TAG_Empty; +} + + +int FPU_stackoverflow(FPU_REG **st_new_ptr) +{ + *st_new_ptr = &st(-1); + + return ((fpu_tag_word >> (((top - 1) & 7)*2)) & 3) != TAG_Empty; +} + + +void FPU_copy_to_regi(FPU_REG const *r, u_char tag, int stnr) +{ + reg_copy(r, &st(stnr)); + FPU_settagi(stnr, tag); +} + +void FPU_copy_to_reg1(FPU_REG const *r, u_char tag) +{ + reg_copy(r, &st(1)); + FPU_settagi(1, tag); +} + +void FPU_copy_to_reg0(FPU_REG const *r, u_char tag) +{ + int regnr = top; + regnr &= 7; + + reg_copy(r, &st(0)); + + fpu_tag_word &= ~(3 << (regnr*2)); + fpu_tag_word |= (tag & 3) << (regnr*2); +} diff --git a/src/wraith/math-emu/fpu_trig.c b/src/wraith/math-emu/fpu_trig.c new file mode 100644 index 000000000..403cbde1d --- /dev/null +++ b/src/wraith/math-emu/fpu_trig.c @@ -0,0 +1,1845 @@ +/*---------------------------------------------------------------------------+ + | fpu_trig.c | + | | + | Implementation of the FPU "transcendental" functions. | + | | + | Copyright (C) 1992,1993,1994,1997,1999 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@melbpc.org.au | + | | + | | + +---------------------------------------------------------------------------*/ + +#include "fpu_system.h" +#include "exception.h" +#include "fpu_emu.h" +#include "status_w.h" +#include "control_w.h" +#include "reg_constant.h" + +static void rem_kernel(unsigned long long st0, unsigned long long *y, + unsigned long long st1, + unsigned long long q, int n); + +#define BETTER_THAN_486 + +#define FCOS 4 + +/* Used only by fptan, fsin, fcos, and fsincos. */ +/* This routine produces very accurate results, similar to + using a value of pi with more than 128 bits precision. */ +/* Limited measurements show no results worse than 64 bit precision + except for the results for arguments close to 2^63, where the + precision of the result sometimes degrades to about 63.9 bits */ +static int trig_arg(FPU_REG *st0_ptr, int even) +{ + FPU_REG tmp; + u_char tmptag; + unsigned long long q; + int old_cw = control_word, saved_status = partial_status; + int tag, st0_tag = TAG_Valid; + + if ( exponent(st0_ptr) >= 63 ) + { + partial_status |= SW_C2; /* Reduction incomplete. */ + return -1; + } + + control_word &= ~CW_RC; + control_word |= RC_CHOP; + + setpositive(st0_ptr); + tag = FPU_u_div(st0_ptr, &CONST_PI2, &tmp, PR_64_BITS | RC_CHOP | 0x3f, + SIGN_POS); + + FPU_round_to_int(&tmp, tag); /* Fortunately, this can't overflow + to 2^64 */ + q = significand(&tmp); + if ( q ) + { + rem_kernel(significand(st0_ptr), + &significand(&tmp), + significand(&CONST_PI2), + q, exponent(st0_ptr) - exponent(&CONST_PI2)); + setexponent16(&tmp, exponent(&CONST_PI2)); + st0_tag = FPU_normalize(&tmp); + FPU_copy_to_reg0(&tmp, st0_tag); + } + + if ( (even && !(q & 1)) || (!even && (q & 1)) ) + { + st0_tag = FPU_sub(REV|LOADED|TAG_Valid, (int)&CONST_PI2, FULL_PRECISION); + +#ifdef BETTER_THAN_486 + /* So far, the results are exact but based upon a 64 bit + precision approximation to pi/2. The technique used + now is equivalent to using an approximation to pi/2 which + is accurate to about 128 bits. */ + if ( (exponent(st0_ptr) <= exponent(&CONST_PI2extra) + 64) || (q > 1) ) + { + /* This code gives the effect of having pi/2 to better than + 128 bits precision. */ + + significand(&tmp) = q + 1; + setexponent16(&tmp, 63); + FPU_normalize(&tmp); + tmptag = + FPU_u_mul(&CONST_PI2extra, &tmp, &tmp, FULL_PRECISION, SIGN_POS, + exponent(&CONST_PI2extra) + exponent(&tmp)); + setsign(&tmp, getsign(&CONST_PI2extra)); + st0_tag = FPU_add(&tmp, tmptag, 0, FULL_PRECISION); + if ( signnegative(st0_ptr) ) + { + /* CONST_PI2extra is negative, so the result of the addition + can be negative. This means that the argument is actually + in a different quadrant. The correction is always < pi/2, + so it can't overflow into yet another quadrant. */ + setpositive(st0_ptr); + q++; + } + } +#endif /* BETTER_THAN_486 */ + } +#ifdef BETTER_THAN_486 + else + { + /* So far, the results are exact but based upon a 64 bit + precision approximation to pi/2. The technique used + now is equivalent to using an approximation to pi/2 which + is accurate to about 128 bits. */ + if ( ((q > 0) && (exponent(st0_ptr) <= exponent(&CONST_PI2extra) + 64)) + || (q > 1) ) + { + /* This code gives the effect of having p/2 to better than + 128 bits precision. */ + + significand(&tmp) = q; + setexponent16(&tmp, 63); + FPU_normalize(&tmp); /* This must return TAG_Valid */ + tmptag = FPU_u_mul(&CONST_PI2extra, &tmp, &tmp, FULL_PRECISION, + SIGN_POS, + exponent(&CONST_PI2extra) + exponent(&tmp)); + setsign(&tmp, getsign(&CONST_PI2extra)); + st0_tag = FPU_sub(LOADED|(tmptag & 0x0f), (int)&tmp, + FULL_PRECISION); + if ( (exponent(st0_ptr) == exponent(&CONST_PI2)) && + ((st0_ptr->sigh > CONST_PI2.sigh) + || ((st0_ptr->sigh == CONST_PI2.sigh) + && (st0_ptr->sigl > CONST_PI2.sigl))) ) + { + /* CONST_PI2extra is negative, so the result of the + subtraction can be larger than pi/2. This means + that the argument is actually in a different quadrant. + The correction is always < pi/2, so it can't overflow + into yet another quadrant. */ + st0_tag = FPU_sub(REV|LOADED|TAG_Valid, (int)&CONST_PI2, + FULL_PRECISION); + q++; + } + } + } +#endif /* BETTER_THAN_486 */ + + FPU_settag0(st0_tag); + control_word = old_cw; + partial_status = saved_status & ~SW_C2; /* Reduction complete. */ + + return (q & 3) | even; +} + + +/* Convert a long to register */ +static void convert_l2reg(long const *arg, int deststnr) +{ + int tag; + long num = *arg; + u_char sign; + FPU_REG *dest = &st(deststnr); + + if (num == 0) + { + FPU_copy_to_regi(&CONST_Z, TAG_Zero, deststnr); + return; + } + + if (num > 0) + { sign = SIGN_POS; } + else + { num = -num; sign = SIGN_NEG; } + + dest->sigh = num; + dest->sigl = 0; + setexponent16(dest, 31); + tag = FPU_normalize(dest); + FPU_settagi(deststnr, tag); + setsign(dest, sign); + return; +} + + +static void single_arg_error(FPU_REG *st0_ptr, u_char st0_tag) +{ + if ( st0_tag == TAG_Empty ) + FPU_stack_underflow(); /* Puts a QNaN in st(0) */ + else if ( st0_tag == TW_NaN ) + real_1op_NaN(st0_ptr); /* return with a NaN in st(0) */ +#ifdef PARANOID + else + EXCEPTION(EX_INTERNAL|0x0112); +#endif /* PARANOID */ +} + + +static void single_arg_2_error(FPU_REG *st0_ptr, u_char st0_tag) +{ + int isNaN; + + switch ( st0_tag ) + { + case TW_NaN: + isNaN = (exponent(st0_ptr) == EXP_OVER) && (st0_ptr->sigh & 0x80000000); + if ( isNaN && !(st0_ptr->sigh & 0x40000000) ) /* Signaling ? */ + { + EXCEPTION(EX_Invalid); + if ( control_word & CW_Invalid ) + { + /* The masked response */ + /* Convert to a QNaN */ + st0_ptr->sigh |= 0x40000000; + push(); + FPU_copy_to_reg0(st0_ptr, TAG_Special); + } + } + else if ( isNaN ) + { + /* A QNaN */ + push(); + FPU_copy_to_reg0(st0_ptr, TAG_Special); + } + else + { + /* pseudoNaN or other unsupported */ + EXCEPTION(EX_Invalid); + if ( control_word & CW_Invalid ) + { + /* The masked response */ + FPU_copy_to_reg0(&CONST_QNaN, TAG_Special); + push(); + FPU_copy_to_reg0(&CONST_QNaN, TAG_Special); + } + } + break; /* return with a NaN in st(0) */ +#ifdef PARANOID + default: + EXCEPTION(EX_INTERNAL|0x0112); +#endif /* PARANOID */ + } +} + + +/*---------------------------------------------------------------------------*/ + +static void f2xm1(FPU_REG *st0_ptr, u_char tag) +{ + FPU_REG a; + + clear_C1(); + + if ( tag == TAG_Valid ) + { + /* For an 80486 FPU, the result is undefined if the arg is >= 1.0 */ + if ( exponent(st0_ptr) < 0 ) + { + denormal_arg: + + FPU_to_exp16(st0_ptr, &a); + + /* poly_2xm1(x) requires 0 < st(0) < 1. */ + poly_2xm1(getsign(st0_ptr), &a, st0_ptr); + } + set_precision_flag_up(); /* 80486 appears to always do this */ + return; + } + + if ( tag == TAG_Zero ) + return; + + if ( tag == TAG_Special ) + tag = FPU_Special(st0_ptr); + + switch ( tag ) + { + case TW_Denormal: + if ( denormal_operand() < 0 ) + return; + goto denormal_arg; + case TW_Infinity: + if ( signnegative(st0_ptr) ) + { + /* -infinity gives -1 (p16-10) */ + FPU_copy_to_reg0(&CONST_1, TAG_Valid); + setnegative(st0_ptr); + } + return; + default: + single_arg_error(st0_ptr, tag); + } +} + + +static void fptan(FPU_REG *st0_ptr, u_char st0_tag) +{ + FPU_REG *st_new_ptr; + int q; + u_char arg_sign = getsign(st0_ptr); + + /* Stack underflow has higher priority */ + if ( st0_tag == TAG_Empty ) + { + FPU_stack_underflow(); /* Puts a QNaN in st(0) */ + if ( control_word & CW_Invalid ) + { + st_new_ptr = &st(-1); + push(); + FPU_stack_underflow(); /* Puts a QNaN in the new st(0) */ + } + return; + } + + if ( STACK_OVERFLOW ) + { FPU_stack_overflow(); return; } + + if ( st0_tag == TAG_Valid ) + { + if ( exponent(st0_ptr) > -40 ) + { + if ( (q = trig_arg(st0_ptr, 0)) == -1 ) + { + /* Operand is out of range */ + return; + } + + poly_tan(st0_ptr); + setsign(st0_ptr, (q & 1) ^ (arg_sign != 0)); + set_precision_flag_up(); /* We do not really know if up or down */ + } + else + { + /* For a small arg, the result == the argument */ + /* Underflow may happen */ + + denormal_arg: + + FPU_to_exp16(st0_ptr, st0_ptr); + + st0_tag = FPU_round(st0_ptr, 1, 0, FULL_PRECISION, arg_sign); + FPU_settag0(st0_tag); + } + push(); + FPU_copy_to_reg0(&CONST_1, TAG_Valid); + return; + } + + if ( st0_tag == TAG_Zero ) + { + push(); + FPU_copy_to_reg0(&CONST_1, TAG_Valid); + setcc(0); + return; + } + + if ( st0_tag == TAG_Special ) + st0_tag = FPU_Special(st0_ptr); + + if ( st0_tag == TW_Denormal ) + { + if ( denormal_operand() < 0 ) + return; + + goto denormal_arg; + } + + if ( st0_tag == TW_Infinity ) + { + /* The 80486 treats infinity as an invalid operand */ + if ( arith_invalid(0) >= 0 ) + { + st_new_ptr = &st(-1); + push(); + arith_invalid(0); + } + return; + } + + single_arg_2_error(st0_ptr, st0_tag); +} + + +static void fxtract(FPU_REG *st0_ptr, u_char st0_tag) +{ + FPU_REG *st_new_ptr; + u_char sign; + register FPU_REG *st1_ptr = st0_ptr; /* anticipate */ + + if ( STACK_OVERFLOW ) + { FPU_stack_overflow(); return; } + + clear_C1(); + + if ( st0_tag == TAG_Valid ) + { + long e; + + push(); + sign = getsign(st1_ptr); + reg_copy(st1_ptr, st_new_ptr); + setexponent16(st_new_ptr, exponent(st_new_ptr)); + + denormal_arg: + + e = exponent16(st_new_ptr); + convert_l2reg(&e, 1); + setexponentpos(st_new_ptr, 0); + setsign(st_new_ptr, sign); + FPU_settag0(TAG_Valid); /* Needed if arg was a denormal */ + return; + } + else if ( st0_tag == TAG_Zero ) + { + sign = getsign(st0_ptr); + + if ( FPU_divide_by_zero(0, SIGN_NEG) < 0 ) + return; + + push(); + FPU_copy_to_reg0(&CONST_Z, TAG_Zero); + setsign(st_new_ptr, sign); + return; + } + + if ( st0_tag == TAG_Special ) + st0_tag = FPU_Special(st0_ptr); + + if ( st0_tag == TW_Denormal ) + { + if (denormal_operand() < 0 ) + return; + + push(); + sign = getsign(st1_ptr); + FPU_to_exp16(st1_ptr, st_new_ptr); + goto denormal_arg; + } + else if ( st0_tag == TW_Infinity ) + { + sign = getsign(st0_ptr); + setpositive(st0_ptr); + push(); + FPU_copy_to_reg0(&CONST_INF, TAG_Special); + setsign(st_new_ptr, sign); + return; + } + else if ( st0_tag == TW_NaN ) + { + if ( real_1op_NaN(st0_ptr) < 0 ) + return; + + push(); + FPU_copy_to_reg0(st0_ptr, TAG_Special); + return; + } + else if ( st0_tag == TAG_Empty ) + { + /* Is this the correct behaviour? */ + if ( control_word & EX_Invalid ) + { + FPU_stack_underflow(); + push(); + FPU_stack_underflow(); + } + else + EXCEPTION(EX_StackUnder); + } +#ifdef PARANOID + else + EXCEPTION(EX_INTERNAL | 0x119); +#endif /* PARANOID */ +} + + +static void fdecstp(void) +{ + clear_C1(); + top--; +} + +static void fincstp(void) +{ + clear_C1(); + top++; +} + + +static void fsqrt_(FPU_REG *st0_ptr, u_char st0_tag) +{ + int expon; + + clear_C1(); + + if ( st0_tag == TAG_Valid ) + { + u_char tag; + + if (signnegative(st0_ptr)) + { + arith_invalid(0); /* sqrt(negative) is invalid */ + return; + } + + /* make st(0) in [1.0 .. 4.0) */ + expon = exponent(st0_ptr); + + denormal_arg: + + setexponent16(st0_ptr, (expon & 1)); + + /* Do the computation, the sign of the result will be positive. */ + tag = wm_sqrt(st0_ptr, 0, 0, control_word, SIGN_POS); + addexponent(st0_ptr, expon >> 1); + FPU_settag0(tag); + return; + } + + if ( st0_tag == TAG_Zero ) + return; + + if ( st0_tag == TAG_Special ) + st0_tag = FPU_Special(st0_ptr); + + if ( st0_tag == TW_Infinity ) + { + if ( signnegative(st0_ptr) ) + arith_invalid(0); /* sqrt(-Infinity) is invalid */ + return; + } + else if ( st0_tag == TW_Denormal ) + { + if (signnegative(st0_ptr)) + { + arith_invalid(0); /* sqrt(negative) is invalid */ + return; + } + + if ( denormal_operand() < 0 ) + return; + + FPU_to_exp16(st0_ptr, st0_ptr); + + expon = exponent16(st0_ptr); + + goto denormal_arg; + } + + single_arg_error(st0_ptr, st0_tag); + +} + + +static void frndint_(FPU_REG *st0_ptr, u_char st0_tag) +{ + int flags, tag; + + if ( st0_tag == TAG_Valid ) + { + u_char sign; + + denormal_arg: + + sign = getsign(st0_ptr); + + if (exponent(st0_ptr) > 63) + return; + + if ( st0_tag == TW_Denormal ) + { + if (denormal_operand() < 0 ) + return; + } + + /* Fortunately, this can't overflow to 2^64 */ + if ( (flags = FPU_round_to_int(st0_ptr, st0_tag)) ) + set_precision_flag(flags); + + setexponent16(st0_ptr, 63); + tag = FPU_normalize(st0_ptr); + setsign(st0_ptr, sign); + FPU_settag0(tag); + return; + } + + if ( st0_tag == TAG_Zero ) + return; + + if ( st0_tag == TAG_Special ) + st0_tag = FPU_Special(st0_ptr); + + if ( st0_tag == TW_Denormal ) + goto denormal_arg; + else if ( st0_tag == TW_Infinity ) + return; + else + single_arg_error(st0_ptr, st0_tag); +} + + +static int fsin(FPU_REG *st0_ptr, u_char tag) +{ + u_char arg_sign = getsign(st0_ptr); + + if ( tag == TAG_Valid ) + { + int q; + + if ( exponent(st0_ptr) > -40 ) + { + if ( (q = trig_arg(st0_ptr, 0)) == -1 ) + { + /* Operand is out of range */ + return 1; + } + + poly_sine(st0_ptr); + + if (q & 2) + changesign(st0_ptr); + + setsign(st0_ptr, getsign(st0_ptr) ^ arg_sign); + + /* We do not really know if up or down */ + set_precision_flag_up(); + return 0; + } + else + { + /* For a small arg, the result == the argument */ + set_precision_flag_up(); /* Must be up. */ + return 0; + } + } + + if ( tag == TAG_Zero ) + { + setcc(0); + return 0; + } + + if ( tag == TAG_Special ) + tag = FPU_Special(st0_ptr); + + if ( tag == TW_Denormal ) + { + if ( denormal_operand() < 0 ) + return 1; + + /* For a small arg, the result == the argument */ + /* Underflow may happen */ + FPU_to_exp16(st0_ptr, st0_ptr); + + tag = FPU_round(st0_ptr, 1, 0, FULL_PRECISION, arg_sign); + + FPU_settag0(tag); + + return 0; + } + else if ( tag == TW_Infinity ) + { + /* The 80486 treats infinity as an invalid operand */ + arith_invalid(0); + return 1; + } + else + { + single_arg_error(st0_ptr, tag); + return 1; + } +} + + +static int f_cos(FPU_REG *st0_ptr, u_char tag) +{ + u_char st0_sign; + + st0_sign = getsign(st0_ptr); + + if ( tag == TAG_Valid ) + { + int q; + + if ( exponent(st0_ptr) > -40 ) + { + if ( (exponent(st0_ptr) < 0) + || ((exponent(st0_ptr) == 0) + && (significand(st0_ptr) <= 0xc90fdaa22168c234LL)) ) + { + poly_cos(st0_ptr); + + /* We do not really know if up or down */ + set_precision_flag_down(); + + return 0; + } + else if ( (q = trig_arg(st0_ptr, FCOS)) != -1 ) + { + poly_sine(st0_ptr); + + if ((q+1) & 2) + changesign(st0_ptr); + + /* We do not really know if up or down */ + set_precision_flag_down(); + + return 0; + } + else + { + /* Operand is out of range */ + return 1; + } + } + else + { + denormal_arg: + + setcc(0); + FPU_copy_to_reg0(&CONST_1, TAG_Valid); +#ifdef PECULIAR_486 + set_precision_flag_down(); /* 80486 appears to do this. */ +#else + set_precision_flag_up(); /* Must be up. */ +#endif /* PECULIAR_486 */ + return 0; + } + } + else if ( tag == TAG_Zero ) + { + FPU_copy_to_reg0(&CONST_1, TAG_Valid); + setcc(0); + return 0; + } + + if ( tag == TAG_Special ) + tag = FPU_Special(st0_ptr); + + if ( tag == TW_Denormal ) + { + if ( denormal_operand() < 0 ) + return 1; + + goto denormal_arg; + } + else if ( tag == TW_Infinity ) + { + /* The 80486 treats infinity as an invalid operand */ + arith_invalid(0); + return 1; + } + else + { + single_arg_error(st0_ptr, tag); /* requires st0_ptr == &st(0) */ + return 1; + } +} + + +static void fcos(FPU_REG *st0_ptr, u_char st0_tag) +{ + f_cos(st0_ptr, st0_tag); +} + + +static void fsincos(FPU_REG *st0_ptr, u_char st0_tag) +{ + FPU_REG *st_new_ptr; + FPU_REG arg; + u_char tag; + + /* Stack underflow has higher priority */ + if ( st0_tag == TAG_Empty ) + { + FPU_stack_underflow(); /* Puts a QNaN in st(0) */ + if ( control_word & CW_Invalid ) + { + st_new_ptr = &st(-1); + push(); + FPU_stack_underflow(); /* Puts a QNaN in the new st(0) */ + } + return; + } + + if ( STACK_OVERFLOW ) + { FPU_stack_overflow(); return; } + + if ( st0_tag == TAG_Special ) + tag = FPU_Special(st0_ptr); + else + tag = st0_tag; + + if ( tag == TW_NaN ) + { + single_arg_2_error(st0_ptr, TW_NaN); + return; + } + else if ( tag == TW_Infinity ) + { + /* The 80486 treats infinity as an invalid operand */ + if ( arith_invalid(0) >= 0 ) + { + /* Masked response */ + push(); + arith_invalid(0); + } + return; + } + + reg_copy(st0_ptr, &arg); + if ( !fsin(st0_ptr, st0_tag) ) + { + push(); + FPU_copy_to_reg0(&arg, st0_tag); + f_cos(&st(0), st0_tag); + } + else + { + /* An error, so restore st(0) */ + FPU_copy_to_reg0(&arg, st0_tag); + } +} + + +/*---------------------------------------------------------------------------*/ +/* The following all require two arguments: st(0) and st(1) */ + +/* A lean, mean kernel for the fprem instructions. This relies upon + the division and rounding to an integer in do_fprem giving an + exact result. Because of this, rem_kernel() needs to deal only with + the least significant 64 bits, the more significant bits of the + result must be zero. + */ +static void rem_kernel(unsigned long long st0, unsigned long long *y, + unsigned long long st1, + unsigned long long q, int n) +{ + int dummy; + unsigned long long x; + + x = st0 << n; + + /* Do the required multiplication and subtraction in the one operation */ + + /* lsw x -= lsw st1 * lsw q */ + asm volatile ("mull %4; subl %%eax,%0; sbbl %%edx,%1" + :"=m" (((unsigned *)&x)[0]), "=m" (((unsigned *)&x)[1]), + "=a" (dummy) + :"2" (((unsigned *)&st1)[0]), "m" (((unsigned *)&q)[0]) + :"%dx"); + /* msw x -= msw st1 * lsw q */ + asm volatile ("mull %3; subl %%eax,%0" + :"=m" (((unsigned *)&x)[1]), "=a" (dummy) + :"1" (((unsigned *)&st1)[1]), "m" (((unsigned *)&q)[0]) + :"%dx"); + /* msw x -= lsw st1 * msw q */ + asm volatile ("mull %3; subl %%eax,%0" + :"=m" (((unsigned *)&x)[1]), "=a" (dummy) + :"1" (((unsigned *)&st1)[0]), "m" (((unsigned *)&q)[1]) + :"%dx"); + + *y = x; +} + + +/* Remainder of st(0) / st(1) */ +/* This routine produces exact results, i.e. there is never any + rounding or truncation, etc of the result. */ +static void do_fprem(FPU_REG *st0_ptr, u_char st0_tag, int round) +{ + FPU_REG *st1_ptr = &st(1); + u_char st1_tag = FPU_gettagi(1); + + if ( !((st0_tag ^ TAG_Valid) | (st1_tag ^ TAG_Valid)) ) + { + FPU_REG tmp, st0, st1; + u_char st0_sign, st1_sign; + u_char tmptag; + int tag; + int old_cw; + int expdif; + long long q; + unsigned short saved_status; + int cc; + + fprem_valid: + /* Convert registers for internal use. */ + st0_sign = FPU_to_exp16(st0_ptr, &st0); + st1_sign = FPU_to_exp16(st1_ptr, &st1); + expdif = exponent16(&st0) - exponent16(&st1); + + old_cw = control_word; + cc = 0; + + /* We want the status following the denorm tests, but don't want + the status changed by the arithmetic operations. */ + saved_status = partial_status; + control_word &= ~CW_RC; + control_word |= RC_CHOP; + + if ( expdif < 64 ) + { + /* This should be the most common case */ + + if ( expdif > -2 ) + { + u_char sign = st0_sign ^ st1_sign; + tag = FPU_u_div(&st0, &st1, &tmp, + PR_64_BITS | RC_CHOP | 0x3f, + sign); + setsign(&tmp, sign); + + if ( exponent(&tmp) >= 0 ) + { + FPU_round_to_int(&tmp, tag); /* Fortunately, this can't + overflow to 2^64 */ + q = significand(&tmp); + + rem_kernel(significand(&st0), + &significand(&tmp), + significand(&st1), + q, expdif); + + setexponent16(&tmp, exponent16(&st1)); + } + else + { + reg_copy(&st0, &tmp); + q = 0; + } + + if ( (round == RC_RND) && (tmp.sigh & 0xc0000000) ) + { + /* We may need to subtract st(1) once more, + to get a result <= 1/2 of st(1). */ + unsigned long long x; + expdif = exponent16(&st1) - exponent16(&tmp); + if ( expdif <= 1 ) + { + if ( expdif == 0 ) + x = significand(&st1) - significand(&tmp); + else /* expdif is 1 */ + x = (significand(&st1) << 1) - significand(&tmp); + if ( (x < significand(&tmp)) || + /* or equi-distant (from 0 & st(1)) and q is odd */ + ((x == significand(&tmp)) && (q & 1) ) ) + { + st0_sign = ! st0_sign; + significand(&tmp) = x; + q++; + } + } + } + + if (q & 4) cc |= SW_C0; + if (q & 2) cc |= SW_C3; + if (q & 1) cc |= SW_C1; + } + else + { + control_word = old_cw; + setcc(0); + return; + } + } + else + { + /* There is a large exponent difference ( >= 64 ) */ + /* To make much sense, the code in this section should + be done at high precision. */ + int exp_1, N; + u_char sign; + + /* prevent overflow here */ + /* N is 'a number between 32 and 63' (p26-113) */ + reg_copy(&st0, &tmp); + tmptag = st0_tag; + N = (expdif & 0x0000001f) + 32; /* This choice gives results + identical to an AMD 486 */ + setexponent16(&tmp, N); + exp_1 = exponent16(&st1); + setexponent16(&st1, 0); + expdif -= N; + + sign = getsign(&tmp) ^ st1_sign; + tag = FPU_u_div(&tmp, &st1, &tmp, PR_64_BITS | RC_CHOP | 0x3f, + sign); + setsign(&tmp, sign); + + FPU_round_to_int(&tmp, tag); /* Fortunately, this can't + overflow to 2^64 */ + + rem_kernel(significand(&st0), + &significand(&tmp), + significand(&st1), + significand(&tmp), + exponent(&tmp) + ); + setexponent16(&tmp, exp_1 + expdif); + + /* It is possible for the operation to be complete here. + What does the IEEE standard say? The Intel 80486 manual + implies that the operation will never be completed at this + point, and the behaviour of a real 80486 confirms this. + */ + if ( !(tmp.sigh | tmp.sigl) ) + { + /* The result is zero */ + control_word = old_cw; + partial_status = saved_status; + FPU_copy_to_reg0(&CONST_Z, TAG_Zero); + setsign(&st0, st0_sign); +#ifdef PECULIAR_486 + setcc(SW_C2); +#else + setcc(0); +#endif /* PECULIAR_486 */ + return; + } + cc = SW_C2; + } + + control_word = old_cw; + partial_status = saved_status; + tag = FPU_normalize_nuo(&tmp); + reg_copy(&tmp, st0_ptr); + + /* The only condition to be looked for is underflow, + and it can occur here only if underflow is unmasked. */ + if ( (exponent16(&tmp) <= EXP_UNDER) && (tag != TAG_Zero) + && !(control_word & CW_Underflow) ) + { + setcc(cc); + tag = arith_underflow(st0_ptr); + setsign(st0_ptr, st0_sign); + FPU_settag0(tag); + return; + } + else if ( (exponent16(&tmp) > EXP_UNDER) || (tag == TAG_Zero) ) + { + stdexp(st0_ptr); + setsign(st0_ptr, st0_sign); + } + else + { + tag = FPU_round(st0_ptr, 0, 0, FULL_PRECISION, st0_sign); + } + FPU_settag0(tag); + setcc(cc); + + return; + } + + if ( st0_tag == TAG_Special ) + st0_tag = FPU_Special(st0_ptr); + if ( st1_tag == TAG_Special ) + st1_tag = FPU_Special(st1_ptr); + + if ( ((st0_tag == TAG_Valid) && (st1_tag == TW_Denormal)) + || ((st0_tag == TW_Denormal) && (st1_tag == TAG_Valid)) + || ((st0_tag == TW_Denormal) && (st1_tag == TW_Denormal)) ) + { + if ( denormal_operand() < 0 ) + return; + goto fprem_valid; + } + else if ( (st0_tag == TAG_Empty) || (st1_tag == TAG_Empty) ) + { + FPU_stack_underflow(); + return; + } + else if ( st0_tag == TAG_Zero ) + { + if ( st1_tag == TAG_Valid ) + { + setcc(0); return; + } + else if ( st1_tag == TW_Denormal ) + { + if ( denormal_operand() < 0 ) + return; + setcc(0); return; + } + else if ( st1_tag == TAG_Zero ) + { arith_invalid(0); return; } /* fprem(?,0) always invalid */ + else if ( st1_tag == TW_Infinity ) + { setcc(0); return; } + } + else if ( (st0_tag == TAG_Valid) || (st0_tag == TW_Denormal) ) + { + if ( st1_tag == TAG_Zero ) + { + arith_invalid(0); /* fprem(Valid,Zero) is invalid */ + return; + } + else if ( st1_tag != TW_NaN ) + { + if ( ((st0_tag == TW_Denormal) || (st1_tag == TW_Denormal)) + && (denormal_operand() < 0) ) + return; + + if ( st1_tag == TW_Infinity ) + { + /* fprem(Valid,Infinity) is o.k. */ + setcc(0); return; + } + } + } + else if ( st0_tag == TW_Infinity ) + { + if ( st1_tag != TW_NaN ) + { + arith_invalid(0); /* fprem(Infinity,?) is invalid */ + return; + } + } + + /* One of the registers must contain a NaN if we got here. */ + +#ifdef PARANOID + if ( (st0_tag != TW_NaN) && (st1_tag != TW_NaN) ) + EXCEPTION(EX_INTERNAL | 0x118); +#endif /* PARANOID */ + + real_2op_NaN(st1_ptr, st1_tag, 0, st1_ptr); + +} + + +/* ST(1) <- ST(1) * log ST; pop ST */ +static void fyl2x(FPU_REG *st0_ptr, u_char st0_tag) +{ + FPU_REG *st1_ptr = &st(1), exponent; + u_char st1_tag = FPU_gettagi(1); + u_char sign; + int e, tag; + + clear_C1(); + + if ( (st0_tag == TAG_Valid) && (st1_tag == TAG_Valid) ) + { + both_valid: + /* Both regs are Valid or Denormal */ + if ( signpositive(st0_ptr) ) + { + if ( st0_tag == TW_Denormal ) + FPU_to_exp16(st0_ptr, st0_ptr); + else + /* Convert st(0) for internal use. */ + setexponent16(st0_ptr, exponent(st0_ptr)); + + if ( (st0_ptr->sigh == 0x80000000) && (st0_ptr->sigl == 0) ) + { + /* Special case. The result can be precise. */ + u_char esign; + e = exponent16(st0_ptr); + if ( e >= 0 ) + { + exponent.sigh = e; + esign = SIGN_POS; + } + else + { + exponent.sigh = -e; + esign = SIGN_NEG; + } + exponent.sigl = 0; + setexponent16(&exponent, 31); + tag = FPU_normalize_nuo(&exponent); + stdexp(&exponent); + setsign(&exponent, esign); + tag = FPU_mul(&exponent, tag, 1, FULL_PRECISION); + if ( tag >= 0 ) + FPU_settagi(1, tag); + } + else + { + /* The usual case */ + sign = getsign(st1_ptr); + if ( st1_tag == TW_Denormal ) + FPU_to_exp16(st1_ptr, st1_ptr); + else + /* Convert st(1) for internal use. */ + setexponent16(st1_ptr, exponent(st1_ptr)); + poly_l2(st0_ptr, st1_ptr, sign); + } + } + else + { + /* negative */ + if ( arith_invalid(1) < 0 ) + return; + } + + FPU_pop(); + + return; + } + + if ( st0_tag == TAG_Special ) + st0_tag = FPU_Special(st0_ptr); + if ( st1_tag == TAG_Special ) + st1_tag = FPU_Special(st1_ptr); + + if ( (st0_tag == TAG_Empty) || (st1_tag == TAG_Empty) ) + { + FPU_stack_underflow_pop(1); + return; + } + else if ( (st0_tag <= TW_Denormal) && (st1_tag <= TW_Denormal) ) + { + if ( st0_tag == TAG_Zero ) + { + if ( st1_tag == TAG_Zero ) + { + /* Both args zero is invalid */ + if ( arith_invalid(1) < 0 ) + return; + } + else + { + u_char sign; + sign = getsign(st1_ptr)^SIGN_NEG; + if ( FPU_divide_by_zero(1, sign) < 0 ) + return; + + setsign(st1_ptr, sign); + } + } + else if ( st1_tag == TAG_Zero ) + { + /* st(1) contains zero, st(0) valid <> 0 */ + /* Zero is the valid answer */ + sign = getsign(st1_ptr); + + if ( signnegative(st0_ptr) ) + { + /* log(negative) */ + if ( arith_invalid(1) < 0 ) + return; + } + else if ( (st0_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + else + { + if ( exponent(st0_ptr) < 0 ) + sign ^= SIGN_NEG; + + FPU_copy_to_reg1(&CONST_Z, TAG_Zero); + setsign(st1_ptr, sign); + } + } + else + { + /* One or both operands are denormals. */ + if ( denormal_operand() < 0 ) + return; + goto both_valid; + } + } + else if ( (st0_tag == TW_NaN) || (st1_tag == TW_NaN) ) + { + if ( real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) < 0 ) + return; + } + /* One or both arg must be an infinity */ + else if ( st0_tag == TW_Infinity ) + { + if ( (signnegative(st0_ptr)) || (st1_tag == TAG_Zero) ) + { + /* log(-infinity) or 0*log(infinity) */ + if ( arith_invalid(1) < 0 ) + return; + } + else + { + u_char sign = getsign(st1_ptr); + + if ( (st1_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + + FPU_copy_to_reg1(&CONST_INF, TAG_Special); + setsign(st1_ptr, sign); + } + } + /* st(1) must be infinity here */ + else if ( ((st0_tag == TAG_Valid) || (st0_tag == TW_Denormal)) + && ( signpositive(st0_ptr) ) ) + { + if ( exponent(st0_ptr) >= 0 ) + { + if ( (exponent(st0_ptr) == 0) && + (st0_ptr->sigh == 0x80000000) && + (st0_ptr->sigl == 0) ) + { + /* st(0) holds 1.0 */ + /* infinity*log(1) */ + if ( arith_invalid(1) < 0 ) + return; + } + /* else st(0) is positive and > 1.0 */ + } + else + { + /* st(0) is positive and < 1.0 */ + + if ( (st0_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + + changesign(st1_ptr); + } + } + else + { + /* st(0) must be zero or negative */ + if ( st0_tag == TAG_Zero ) + { + /* This should be invalid, but a real 80486 is happy with it. */ + +#ifndef PECULIAR_486 + sign = getsign(st1_ptr); + if ( FPU_divide_by_zero(1, sign) < 0 ) + return; +#endif /* PECULIAR_486 */ + + changesign(st1_ptr); + } + else if ( arith_invalid(1) < 0 ) /* log(negative) */ + return; + } + + FPU_pop(); +} + + +static void fpatan(FPU_REG *st0_ptr, u_char st0_tag) +{ + FPU_REG *st1_ptr = &st(1); + u_char st1_tag = FPU_gettagi(1); + int tag; + + clear_C1(); + if ( !((st0_tag ^ TAG_Valid) | (st1_tag ^ TAG_Valid)) ) + { + valid_atan: + + poly_atan(st0_ptr, st0_tag, st1_ptr, st1_tag); + + FPU_pop(); + + return; + } + + if ( st0_tag == TAG_Special ) + st0_tag = FPU_Special(st0_ptr); + if ( st1_tag == TAG_Special ) + st1_tag = FPU_Special(st1_ptr); + + if ( ((st0_tag == TAG_Valid) && (st1_tag == TW_Denormal)) + || ((st0_tag == TW_Denormal) && (st1_tag == TAG_Valid)) + || ((st0_tag == TW_Denormal) && (st1_tag == TW_Denormal)) ) + { + if ( denormal_operand() < 0 ) + return; + + goto valid_atan; + } + else if ( (st0_tag == TAG_Empty) || (st1_tag == TAG_Empty) ) + { + FPU_stack_underflow_pop(1); + return; + } + else if ( (st0_tag == TW_NaN) || (st1_tag == TW_NaN) ) + { + if ( real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) >= 0 ) + FPU_pop(); + return; + } + else if ( (st0_tag == TW_Infinity) || (st1_tag == TW_Infinity) ) + { + u_char sign = getsign(st1_ptr); + if ( st0_tag == TW_Infinity ) + { + if ( st1_tag == TW_Infinity ) + { + if ( signpositive(st0_ptr) ) + { + FPU_copy_to_reg1(&CONST_PI4, TAG_Valid); + } + else + { + setpositive(st1_ptr); + tag = FPU_u_add(&CONST_PI4, &CONST_PI2, st1_ptr, + FULL_PRECISION, SIGN_POS, + exponent(&CONST_PI4), exponent(&CONST_PI2)); + if ( tag >= 0 ) + FPU_settagi(1, tag); + } + } + else + { + if ( (st1_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + + if ( signpositive(st0_ptr) ) + { + FPU_copy_to_reg1(&CONST_Z, TAG_Zero); + setsign(st1_ptr, sign); /* An 80486 preserves the sign */ + FPU_pop(); + return; + } + else + { + FPU_copy_to_reg1(&CONST_PI, TAG_Valid); + } + } + } + else + { + /* st(1) is infinity, st(0) not infinity */ + if ( (st0_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + + FPU_copy_to_reg1(&CONST_PI2, TAG_Valid); + } + setsign(st1_ptr, sign); + } + else if ( st1_tag == TAG_Zero ) + { + /* st(0) must be valid or zero */ + u_char sign = getsign(st1_ptr); + + if ( (st0_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + + if ( signpositive(st0_ptr) ) + { + /* An 80486 preserves the sign */ + FPU_pop(); + return; + } + + FPU_copy_to_reg1(&CONST_PI, TAG_Valid); + setsign(st1_ptr, sign); + } + else if ( st0_tag == TAG_Zero ) + { + /* st(1) must be TAG_Valid here */ + u_char sign = getsign(st1_ptr); + + if ( (st1_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + + FPU_copy_to_reg1(&CONST_PI2, TAG_Valid); + setsign(st1_ptr, sign); + } +#ifdef PARANOID + else + EXCEPTION(EX_INTERNAL | 0x125); +#endif /* PARANOID */ + + FPU_pop(); + set_precision_flag_up(); /* We do not really know if up or down */ +} + + +static void fprem(FPU_REG *st0_ptr, u_char st0_tag) +{ + do_fprem(st0_ptr, st0_tag, RC_CHOP); +} + + +static void fprem1(FPU_REG *st0_ptr, u_char st0_tag) +{ + do_fprem(st0_ptr, st0_tag, RC_RND); +} + + +static void fyl2xp1(FPU_REG *st0_ptr, u_char st0_tag) +{ + u_char sign, sign1; + FPU_REG *st1_ptr = &st(1), a, b; + u_char st1_tag = FPU_gettagi(1); + + clear_C1(); + if ( !((st0_tag ^ TAG_Valid) | (st1_tag ^ TAG_Valid)) ) + { + valid_yl2xp1: + + sign = getsign(st0_ptr); + sign1 = getsign(st1_ptr); + + FPU_to_exp16(st0_ptr, &a); + FPU_to_exp16(st1_ptr, &b); + + if ( poly_l2p1(sign, sign1, &a, &b, st1_ptr) ) + return; + + FPU_pop(); + return; + } + + if ( st0_tag == TAG_Special ) + st0_tag = FPU_Special(st0_ptr); + if ( st1_tag == TAG_Special ) + st1_tag = FPU_Special(st1_ptr); + + if ( ((st0_tag == TAG_Valid) && (st1_tag == TW_Denormal)) + || ((st0_tag == TW_Denormal) && (st1_tag == TAG_Valid)) + || ((st0_tag == TW_Denormal) && (st1_tag == TW_Denormal)) ) + { + if ( denormal_operand() < 0 ) + return; + + goto valid_yl2xp1; + } + else if ( (st0_tag == TAG_Empty) | (st1_tag == TAG_Empty) ) + { + FPU_stack_underflow_pop(1); + return; + } + else if ( st0_tag == TAG_Zero ) + { + switch ( st1_tag ) + { + case TW_Denormal: + if ( denormal_operand() < 0 ) + return; + + case TAG_Zero: + case TAG_Valid: + setsign(st0_ptr, getsign(st0_ptr) ^ getsign(st1_ptr)); + FPU_copy_to_reg1(st0_ptr, st0_tag); + break; + + case TW_Infinity: + /* Infinity*log(1) */ + if ( arith_invalid(1) < 0 ) + return; + break; + + case TW_NaN: + if ( real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) < 0 ) + return; + break; + + default: +#ifdef PARANOID + EXCEPTION(EX_INTERNAL | 0x116); + return; +#endif /* PARANOID */ + break; + } + } + else if ( (st0_tag == TAG_Valid) || (st0_tag == TW_Denormal) ) + { + switch ( st1_tag ) + { + case TAG_Zero: + if ( signnegative(st0_ptr) ) + { + if ( exponent(st0_ptr) >= 0 ) + { + /* st(0) holds <= -1.0 */ +#ifdef PECULIAR_486 /* Stupid 80486 doesn't worry about log(negative). */ + changesign(st1_ptr); +#else + if ( arith_invalid(1) < 0 ) + return; +#endif /* PECULIAR_486 */ + } + else if ( (st0_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + else + changesign(st1_ptr); + } + else if ( (st0_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + break; + + case TW_Infinity: + if ( signnegative(st0_ptr) ) + { + if ( (exponent(st0_ptr) >= 0) && + !((st0_ptr->sigh == 0x80000000) && + (st0_ptr->sigl == 0)) ) + { + /* st(0) holds < -1.0 */ +#ifdef PECULIAR_486 /* Stupid 80486 doesn't worry about log(negative). */ + changesign(st1_ptr); +#else + if ( arith_invalid(1) < 0 ) return; +#endif /* PECULIAR_486 */ + } + else if ( (st0_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + else + changesign(st1_ptr); + } + else if ( (st0_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + break; + + case TW_NaN: + if ( real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) < 0 ) + return; + } + + } + else if ( st0_tag == TW_NaN ) + { + if ( real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) < 0 ) + return; + } + else if ( st0_tag == TW_Infinity ) + { + if ( st1_tag == TW_NaN ) + { + if ( real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) < 0 ) + return; + } + else if ( signnegative(st0_ptr) ) + { +#ifndef PECULIAR_486 + /* This should have higher priority than denormals, but... */ + if ( arith_invalid(1) < 0 ) /* log(-infinity) */ + return; +#endif /* PECULIAR_486 */ + if ( (st1_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; +#ifdef PECULIAR_486 + /* Denormal operands actually get higher priority */ + if ( arith_invalid(1) < 0 ) /* log(-infinity) */ + return; +#endif /* PECULIAR_486 */ + } + else if ( st1_tag == TAG_Zero ) + { + /* log(infinity) */ + if ( arith_invalid(1) < 0 ) + return; + } + + /* st(1) must be valid here. */ + + else if ( (st1_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + + /* The Manual says that log(Infinity) is invalid, but a real + 80486 sensibly says that it is o.k. */ + else + { + u_char sign = getsign(st1_ptr); + FPU_copy_to_reg1(&CONST_INF, TAG_Special); + setsign(st1_ptr, sign); + } + } +#ifdef PARANOID + else + { + EXCEPTION(EX_INTERNAL | 0x117); + return; + } +#endif /* PARANOID */ + + FPU_pop(); + return; + +} + + +static void fscale(FPU_REG *st0_ptr, u_char st0_tag) +{ + FPU_REG *st1_ptr = &st(1); + u_char st1_tag = FPU_gettagi(1); + int old_cw = control_word; + u_char sign = getsign(st0_ptr); + + clear_C1(); + if ( !((st0_tag ^ TAG_Valid) | (st1_tag ^ TAG_Valid)) ) + { + long scale; + FPU_REG tmp; + + /* Convert register for internal use. */ + setexponent16(st0_ptr, exponent(st0_ptr)); + + valid_scale: + + if ( exponent(st1_ptr) > 30 ) + { + /* 2^31 is far too large, would require 2^(2^30) or 2^(-2^30) */ + + if ( signpositive(st1_ptr) ) + { + EXCEPTION(EX_Overflow); + FPU_copy_to_reg0(&CONST_INF, TAG_Special); + } + else + { + EXCEPTION(EX_Underflow); + FPU_copy_to_reg0(&CONST_Z, TAG_Zero); + } + setsign(st0_ptr, sign); + return; + } + + control_word &= ~CW_RC; + control_word |= RC_CHOP; + reg_copy(st1_ptr, &tmp); + FPU_round_to_int(&tmp, st1_tag); /* This can never overflow here */ + control_word = old_cw; + scale = signnegative(st1_ptr) ? -tmp.sigl : tmp.sigl; + scale += exponent16(st0_ptr); + + setexponent16(st0_ptr, scale); + + /* Use FPU_round() to properly detect under/overflow etc */ + FPU_round(st0_ptr, 0, 0, control_word, sign); + + return; + } + + if ( st0_tag == TAG_Special ) + st0_tag = FPU_Special(st0_ptr); + if ( st1_tag == TAG_Special ) + st1_tag = FPU_Special(st1_ptr); + + if ( (st0_tag == TAG_Valid) || (st0_tag == TW_Denormal) ) + { + switch ( st1_tag ) + { + case TAG_Valid: + /* st(0) must be a denormal */ + if ( (st0_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + + FPU_to_exp16(st0_ptr, st0_ptr); /* Will not be left on stack */ + goto valid_scale; + + case TAG_Zero: + if ( st0_tag == TW_Denormal ) + denormal_operand(); + return; + + case TW_Denormal: + denormal_operand(); + return; + + case TW_Infinity: + if ( (st0_tag == TW_Denormal) && (denormal_operand() < 0) ) + return; + + if ( signpositive(st1_ptr) ) + FPU_copy_to_reg0(&CONST_INF, TAG_Special); + else + FPU_copy_to_reg0(&CONST_Z, TAG_Zero); + setsign(st0_ptr, sign); + return; + + case TW_NaN: + real_2op_NaN(st1_ptr, st1_tag, 0, st0_ptr); + return; + } + } + else if ( st0_tag == TAG_Zero ) + { + switch ( st1_tag ) + { + case TAG_Valid: + case TAG_Zero: + return; + + case TW_Denormal: + denormal_operand(); + return; + + case TW_Infinity: + if ( signpositive(st1_ptr) ) + arith_invalid(0); /* Zero scaled by +Infinity */ + return; + + case TW_NaN: + real_2op_NaN(st1_ptr, st1_tag, 0, st0_ptr); + return; + } + } + else if ( st0_tag == TW_Infinity ) + { + switch ( st1_tag ) + { + case TAG_Valid: + case TAG_Zero: + return; + + case TW_Denormal: + denormal_operand(); + return; + + case TW_Infinity: + if ( signnegative(st1_ptr) ) + arith_invalid(0); /* Infinity scaled by -Infinity */ + return; + + case TW_NaN: + real_2op_NaN(st1_ptr, st1_tag, 0, st0_ptr); + return; + } + } + else if ( st0_tag == TW_NaN ) + { + if ( st1_tag != TAG_Empty ) + { real_2op_NaN(st1_ptr, st1_tag, 0, st0_ptr); return; } + } + +#ifdef PARANOID + if ( !((st0_tag == TAG_Empty) || (st1_tag == TAG_Empty)) ) + { + EXCEPTION(EX_INTERNAL | 0x115); + return; + } +#endif + + /* At least one of st(0), st(1) must be empty */ + FPU_stack_underflow(); + +} + + +/*---------------------------------------------------------------------------*/ + +static FUNC_ST0 const trig_table_a[] = { + f2xm1, fyl2x, fptan, fpatan, + fxtract, fprem1, (FUNC_ST0)fdecstp, (FUNC_ST0)fincstp +}; + +void FPU_triga(void) +{ + (trig_table_a[FPU_rm])(&st(0), FPU_gettag0()); +} + + +static FUNC_ST0 const trig_table_b[] = + { + fprem, fyl2xp1, fsqrt_, fsincos, frndint_, fscale, (FUNC_ST0)fsin, fcos + }; + +void FPU_trigb(void) +{ + (trig_table_b[FPU_rm])(&st(0), FPU_gettag0()); +} diff --git a/src/wraith/math-emu/get_address.c b/src/wraith/math-emu/get_address.c new file mode 100644 index 000000000..59eee7218 --- /dev/null +++ b/src/wraith/math-emu/get_address.c @@ -0,0 +1,449 @@ +/*---------------------------------------------------------------------------+ + | get_address.c | + | | + | Get the effective address from an FPU instruction. | + | | + | Copyright (C) 1992,1993,1994,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | Note: | + | The file contains code which accesses user memory. | + | Emulator static data may change when user memory is accessed, due to | + | other processes using the emulator while swapping is in progress. | + +---------------------------------------------------------------------------*/ + + +#include + +#include +#include + +#include "fpu_system.h" +#include "exception.h" +#include "fpu_emu.h" + + +#define FPU_WRITE_BIT 0x10 + +static int reg_offset[] = { + offsetof(struct info,___eax), + offsetof(struct info,___ecx), + offsetof(struct info,___edx), + offsetof(struct info,___ebx), + offsetof(struct info,___esp), + offsetof(struct info,___ebp), + offsetof(struct info,___esi), + offsetof(struct info,___edi) +}; + +#define REG_(x) (*(long *)(reg_offset[(x)]+(u_char *) FPU_info)) + +static int reg_offset_vm86[] = { + offsetof(struct info,___cs), + offsetof(struct info,___vm86_ds), + offsetof(struct info,___vm86_es), + offsetof(struct info,___vm86_fs), + offsetof(struct info,___vm86_gs), + offsetof(struct info,___ss), + offsetof(struct info,___vm86_ds) + }; + +#define VM86_REG_(x) (*(unsigned short *) \ + (reg_offset_vm86[((unsigned)x)]+(u_char *) FPU_info)) + +/* These are dummy, fs and gs are not saved on the stack. */ +#define ___FS ___ds +#define ___GS ___ds + +static int reg_offset_pm[] = { + offsetof(struct info,___cs), + offsetof(struct info,___ds), + offsetof(struct info,___es), + offsetof(struct info,___FS), + offsetof(struct info,___GS), + offsetof(struct info,___ss), + offsetof(struct info,___ds) + }; + +#define PM_REG_(x) (*(unsigned short *) \ + (reg_offset_pm[((unsigned)x)]+(u_char *) FPU_info)) + + +/* Decode the SIB byte. This function assumes mod != 0 */ +static int sib(int mod, unsigned long *fpu_eip) +{ + u_char ss,index,base; + long offset; + + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(1); + FPU_get_user(base, (u_char __user *) (*fpu_eip)); /* The SIB byte */ + RE_ENTRANT_CHECK_ON; + (*fpu_eip)++; + ss = base >> 6; + index = (base >> 3) & 7; + base &= 7; + + if ((mod == 0) && (base == 5)) + offset = 0; /* No base register */ + else + offset = REG_(base); + + if (index == 4) + { + /* No index register */ + /* A non-zero ss is illegal */ + if ( ss ) + EXCEPTION(EX_Invalid); + } + else + { + offset += (REG_(index)) << ss; + } + + if (mod == 1) + { + /* 8 bit signed displacement */ + long displacement; + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(1); + FPU_get_user(displacement, (signed char __user *) (*fpu_eip)); + offset += displacement; + RE_ENTRANT_CHECK_ON; + (*fpu_eip)++; + } + else if (mod == 2 || base == 5) /* The second condition also has mod==0 */ + { + /* 32 bit displacement */ + long displacement; + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(4); + FPU_get_user(displacement, (long __user *) (*fpu_eip)); + offset += displacement; + RE_ENTRANT_CHECK_ON; + (*fpu_eip) += 4; + } + + return offset; +} + + +static unsigned long vm86_segment(u_char segment, + struct address *addr) +{ + segment--; +#ifdef PARANOID + if ( segment > PREFIX_SS_ ) + { + EXCEPTION(EX_INTERNAL|0x130); + math_abort(FPU_info,SIGSEGV); + } +#endif /* PARANOID */ + addr->selector = VM86_REG_(segment); + return (unsigned long)VM86_REG_(segment) << 4; +} + + +/* This should work for 16 and 32 bit protected mode. */ +static long pm_address(u_char FPU_modrm, u_char segment, + struct address *addr, long offset) +{ + struct desc_struct descriptor; + unsigned long base_address, limit, address, seg_top; + unsigned short selector; + + segment--; + +#ifdef PARANOID + /* segment is unsigned, so this also detects if segment was 0: */ + if ( segment > PREFIX_SS_ ) + { + EXCEPTION(EX_INTERNAL|0x132); + math_abort(FPU_info,SIGSEGV); + } +#endif /* PARANOID */ + + switch ( segment ) + { + /* fs and gs aren't used by the kernel, so they still have their + user-space values. */ + case PREFIX_FS_-1: + /* The cast is needed here to get gcc 2.8.0 to use a 16 bit register + in the assembler statement. */ + + __asm__("mov %%fs,%0":"=r" (selector)); + addr->selector = selector; + break; + case PREFIX_GS_-1: + /* The cast is needed here to get gcc 2.8.0 to use a 16 bit register + in the assembler statement. */ + __asm__("mov %%gs,%0":"=r" (selector)); + addr->selector = selector; + break; + default: + addr->selector = PM_REG_(segment); + } + + descriptor = LDT_DESCRIPTOR(PM_REG_(segment)); + base_address = SEG_BASE_ADDR(descriptor); + address = base_address + offset; + limit = base_address + + (SEG_LIMIT(descriptor)+1) * SEG_GRANULARITY(descriptor) - 1; + if ( limit < base_address ) limit = 0xffffffff; + + if ( SEG_EXPAND_DOWN(descriptor) ) + { + if ( SEG_G_BIT(descriptor) ) + seg_top = 0xffffffff; + else + { + seg_top = base_address + (1 << 20); + if ( seg_top < base_address ) seg_top = 0xffffffff; + } + access_limit = + (address <= limit) || (address >= seg_top) ? 0 : + ((seg_top-address) >= 255 ? 255 : seg_top-address); + } + else + { + access_limit = + (address > limit) || (address < base_address) ? 0 : + ((limit-address) >= 254 ? 255 : limit-address+1); + } + if ( SEG_EXECUTE_ONLY(descriptor) || + (!SEG_WRITE_PERM(descriptor) && (FPU_modrm & FPU_WRITE_BIT)) ) + { + access_limit = 0; + } + return address; +} + + +/* + MOD R/M byte: MOD == 3 has a special use for the FPU + SIB byte used iff R/M = 100b + + 7 6 5 4 3 2 1 0 + ..... ......... ......... + MOD OPCODE(2) R/M + + + SIB byte + + 7 6 5 4 3 2 1 0 + ..... ......... ......... + SS INDEX BASE + +*/ + +void __user *FPU_get_address(u_char FPU_modrm, unsigned long *fpu_eip, + struct address *addr, + fpu_addr_modes addr_modes) +{ + u_char mod; + unsigned rm = FPU_modrm & 7; + long *cpu_reg_ptr; + int address = 0; /* Initialized just to stop compiler warnings. */ + + /* Memory accessed via the cs selector is write protected + in `non-segmented' 32 bit protected mode. */ + if ( !addr_modes.default_mode && (FPU_modrm & FPU_WRITE_BIT) + && (addr_modes.override.segment == PREFIX_CS_) ) + { + math_abort(FPU_info,SIGSEGV); + } + + addr->selector = FPU_DS; /* Default, for 32 bit non-segmented mode. */ + + mod = (FPU_modrm >> 6) & 3; + + if (rm == 4 && mod != 3) + { + address = sib(mod, fpu_eip); + } + else + { + cpu_reg_ptr = & REG_(rm); + switch (mod) + { + case 0: + if (rm == 5) + { + /* Special case: disp32 */ + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(4); + FPU_get_user(address, (unsigned long __user *) (*fpu_eip)); + (*fpu_eip) += 4; + RE_ENTRANT_CHECK_ON; + addr->offset = address; + return (void __user *) address; + } + else + { + address = *cpu_reg_ptr; /* Just return the contents + of the cpu register */ + addr->offset = address; + return (void __user *) address; + } + case 1: + /* 8 bit signed displacement */ + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(1); + FPU_get_user(address, (signed char __user *) (*fpu_eip)); + RE_ENTRANT_CHECK_ON; + (*fpu_eip)++; + break; + case 2: + /* 32 bit displacement */ + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(4); + FPU_get_user(address, (long __user *) (*fpu_eip)); + (*fpu_eip) += 4; + RE_ENTRANT_CHECK_ON; + break; + case 3: + /* Not legal for the FPU */ + EXCEPTION(EX_Invalid); + } + address += *cpu_reg_ptr; + } + + addr->offset = address; + + switch ( addr_modes.default_mode ) + { + case 0: + break; + case VM86: + address += vm86_segment(addr_modes.override.segment, addr); + break; + case PM16: + case SEG32: + address = pm_address(FPU_modrm, addr_modes.override.segment, + addr, address); + break; + default: + EXCEPTION(EX_INTERNAL|0x133); + } + + return (void __user *)address; +} + + +void __user *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip, + struct address *addr, + fpu_addr_modes addr_modes) +{ + u_char mod; + unsigned rm = FPU_modrm & 7; + int address = 0; /* Default used for mod == 0 */ + + /* Memory accessed via the cs selector is write protected + in `non-segmented' 32 bit protected mode. */ + if ( !addr_modes.default_mode && (FPU_modrm & FPU_WRITE_BIT) + && (addr_modes.override.segment == PREFIX_CS_) ) + { + math_abort(FPU_info,SIGSEGV); + } + + addr->selector = FPU_DS; /* Default, for 32 bit non-segmented mode. */ + + mod = (FPU_modrm >> 6) & 3; + + switch (mod) + { + case 0: + if (rm == 6) + { + /* Special case: disp16 */ + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(2); + FPU_get_user(address, (unsigned short __user *) (*fpu_eip)); + (*fpu_eip) += 2; + RE_ENTRANT_CHECK_ON; + goto add_segment; + } + break; + case 1: + /* 8 bit signed displacement */ + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(1); + FPU_get_user(address, (signed char __user *) (*fpu_eip)); + RE_ENTRANT_CHECK_ON; + (*fpu_eip)++; + break; + case 2: + /* 16 bit displacement */ + RE_ENTRANT_CHECK_OFF; + FPU_code_verify_area(2); + FPU_get_user(address, (unsigned short __user *) (*fpu_eip)); + (*fpu_eip) += 2; + RE_ENTRANT_CHECK_ON; + break; + case 3: + /* Not legal for the FPU */ + EXCEPTION(EX_Invalid); + break; + } + switch ( rm ) + { + case 0: + address += FPU_info->___ebx + FPU_info->___esi; + break; + case 1: + address += FPU_info->___ebx + FPU_info->___edi; + break; + case 2: + address += FPU_info->___ebp + FPU_info->___esi; + if ( addr_modes.override.segment == PREFIX_DEFAULT ) + addr_modes.override.segment = PREFIX_SS_; + break; + case 3: + address += FPU_info->___ebp + FPU_info->___edi; + if ( addr_modes.override.segment == PREFIX_DEFAULT ) + addr_modes.override.segment = PREFIX_SS_; + break; + case 4: + address += FPU_info->___esi; + break; + case 5: + address += FPU_info->___edi; + break; + case 6: + address += FPU_info->___ebp; + if ( addr_modes.override.segment == PREFIX_DEFAULT ) + addr_modes.override.segment = PREFIX_SS_; + break; + case 7: + address += FPU_info->___ebx; + break; + } + + add_segment: + address &= 0xffff; + + addr->offset = address; + + switch ( addr_modes.default_mode ) + { + case 0: + break; + case VM86: + address += vm86_segment(addr_modes.override.segment, addr); + break; + case PM16: + case SEG32: + address = pm_address(FPU_modrm, addr_modes.override.segment, + addr, address); + break; + default: + EXCEPTION(EX_INTERNAL|0x131); + } + + return (void __user *)address ; +} diff --git a/src/wraith/math-emu/load_store.c b/src/wraith/math-emu/load_store.c new file mode 100644 index 000000000..ff3a61766 --- /dev/null +++ b/src/wraith/math-emu/load_store.c @@ -0,0 +1,270 @@ +/*---------------------------------------------------------------------------+ + | load_store.c | + | | + | This file contains most of the code to interpret the FPU instructions | + | which load and store from user memory. | + | | + | Copyright (C) 1992,1993,1994,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | Note: | + | The file contains code which accesses user memory. | + | Emulator static data may change when user memory is accessed, due to | + | other processes using the emulator while swapping is in progress. | + +---------------------------------------------------------------------------*/ + +#include + +#include "fpu_system.h" +#include "exception.h" +#include "fpu_emu.h" +#include "status_w.h" +#include "control_w.h" + + +#define _NONE_ 0 /* st0_ptr etc not needed */ +#define _REG0_ 1 /* Will be storing st(0) */ +#define _PUSH_ 3 /* Need to check for space to push onto stack */ +#define _null_ 4 /* Function illegal or not implemented */ + +#define pop_0() { FPU_settag0(TAG_Empty); top++; } + + +static u_char const type_table[32] = { + _PUSH_, _PUSH_, _PUSH_, _PUSH_, + _null_, _null_, _null_, _null_, + _REG0_, _REG0_, _REG0_, _REG0_, + _REG0_, _REG0_, _REG0_, _REG0_, + _NONE_, _null_, _NONE_, _PUSH_, + _NONE_, _PUSH_, _null_, _PUSH_, + _NONE_, _null_, _NONE_, _REG0_, + _NONE_, _REG0_, _NONE_, _REG0_ + }; + +u_char const data_sizes_16[32] = { + 4, 4, 8, 2, 0, 0, 0, 0, + 4, 4, 8, 2, 4, 4, 8, 2, + 14, 0, 94, 10, 2, 10, 0, 8, + 14, 0, 94, 10, 2, 10, 2, 8 +}; + +u_char const data_sizes_32[32] = { + 4, 4, 8, 2, 0, 0, 0, 0, + 4, 4, 8, 2, 4, 4, 8, 2, + 28, 0,108, 10, 2, 10, 0, 8, + 28, 0,108, 10, 2, 10, 2, 8 +}; + +int FPU_load_store(u_char type, fpu_addr_modes addr_modes, + void __user *data_address) +{ + FPU_REG loaded_data; + FPU_REG *st0_ptr; + u_char st0_tag = TAG_Empty; /* This is just to stop a gcc warning. */ + u_char loaded_tag; + + st0_ptr = NULL; /* Initialized just to stop compiler warnings. */ + + if ( addr_modes.default_mode & PROTECTED ) + { + if ( addr_modes.default_mode == SEG32 ) + { + if ( access_limit < data_sizes_32[type] ) + math_abort(FPU_info,SIGSEGV); + } + else if ( addr_modes.default_mode == PM16 ) + { + if ( access_limit < data_sizes_16[type] ) + math_abort(FPU_info,SIGSEGV); + } +#ifdef PARANOID + else + EXCEPTION(EX_INTERNAL|0x140); +#endif /* PARANOID */ + } + + switch ( type_table[type] ) + { + case _NONE_: + break; + case _REG0_: + st0_ptr = &st(0); /* Some of these instructions pop after + storing */ + st0_tag = FPU_gettag0(); + break; + case _PUSH_: + { + if ( FPU_gettagi(-1) != TAG_Empty ) + { FPU_stack_overflow(); return 0; } + top--; + st0_ptr = &st(0); + } + break; + case _null_: + FPU_illegal(); + return 0; +#ifdef PARANOID + default: + EXCEPTION(EX_INTERNAL|0x141); + return 0; +#endif /* PARANOID */ + } + + switch ( type ) + { + case 000: /* fld m32real */ + clear_C1(); + loaded_tag = FPU_load_single((float __user *)data_address, &loaded_data); + if ( (loaded_tag == TAG_Special) + && isNaN(&loaded_data) + && (real_1op_NaN(&loaded_data) < 0) ) + { + top++; + break; + } + FPU_copy_to_reg0(&loaded_data, loaded_tag); + break; + case 001: /* fild m32int */ + clear_C1(); + loaded_tag = FPU_load_int32((long __user *)data_address, &loaded_data); + FPU_copy_to_reg0(&loaded_data, loaded_tag); + break; + case 002: /* fld m64real */ + clear_C1(); + loaded_tag = FPU_load_double((double __user *)data_address, &loaded_data); + if ( (loaded_tag == TAG_Special) + && isNaN(&loaded_data) + && (real_1op_NaN(&loaded_data) < 0) ) + { + top++; + break; + } + FPU_copy_to_reg0(&loaded_data, loaded_tag); + break; + case 003: /* fild m16int */ + clear_C1(); + loaded_tag = FPU_load_int16((short __user *)data_address, &loaded_data); + FPU_copy_to_reg0(&loaded_data, loaded_tag); + break; + case 010: /* fst m32real */ + clear_C1(); + FPU_store_single(st0_ptr, st0_tag, (float __user *)data_address); + break; + case 011: /* fist m32int */ + clear_C1(); + FPU_store_int32(st0_ptr, st0_tag, (long __user *)data_address); + break; + case 012: /* fst m64real */ + clear_C1(); + FPU_store_double(st0_ptr, st0_tag, (double __user *)data_address); + break; + case 013: /* fist m16int */ + clear_C1(); + FPU_store_int16(st0_ptr, st0_tag, (short __user *)data_address); + break; + case 014: /* fstp m32real */ + clear_C1(); + if ( FPU_store_single(st0_ptr, st0_tag, (float __user *)data_address) ) + pop_0(); /* pop only if the number was actually stored + (see the 80486 manual p16-28) */ + break; + case 015: /* fistp m32int */ + clear_C1(); + if ( FPU_store_int32(st0_ptr, st0_tag, (long __user *)data_address) ) + pop_0(); /* pop only if the number was actually stored + (see the 80486 manual p16-28) */ + break; + case 016: /* fstp m64real */ + clear_C1(); + if ( FPU_store_double(st0_ptr, st0_tag, (double __user *)data_address) ) + pop_0(); /* pop only if the number was actually stored + (see the 80486 manual p16-28) */ + break; + case 017: /* fistp m16int */ + clear_C1(); + if ( FPU_store_int16(st0_ptr, st0_tag, (short __user *)data_address) ) + pop_0(); /* pop only if the number was actually stored + (see the 80486 manual p16-28) */ + break; + case 020: /* fldenv m14/28byte */ + fldenv(addr_modes, (u_char __user *)data_address); + /* Ensure that the values just loaded are not changed by + fix-up operations. */ + return 1; + case 022: /* frstor m94/108byte */ + frstor(addr_modes, (u_char __user *)data_address); + /* Ensure that the values just loaded are not changed by + fix-up operations. */ + return 1; + case 023: /* fbld m80dec */ + clear_C1(); + loaded_tag = FPU_load_bcd((u_char __user *)data_address); + FPU_settag0(loaded_tag); + break; + case 024: /* fldcw */ + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ, data_address, 2); + FPU_get_user(control_word, (unsigned short __user *) data_address); + RE_ENTRANT_CHECK_ON; + if ( partial_status & ~control_word & CW_Exceptions ) + partial_status |= (SW_Summary | SW_Backward); + else + partial_status &= ~(SW_Summary | SW_Backward); +#ifdef PECULIAR_486 + control_word |= 0x40; /* An 80486 appears to always set this bit */ +#endif /* PECULIAR_486 */ + return 1; + case 025: /* fld m80real */ + clear_C1(); + loaded_tag = FPU_load_extended((long double __user *)data_address, 0); + FPU_settag0(loaded_tag); + break; + case 027: /* fild m64int */ + clear_C1(); + loaded_tag = FPU_load_int64((long long __user *)data_address); + FPU_settag0(loaded_tag); + break; + case 030: /* fstenv m14/28byte */ + fstenv(addr_modes, (u_char __user *)data_address); + return 1; + case 032: /* fsave */ + fsave(addr_modes, (u_char __user *)data_address); + return 1; + case 033: /* fbstp m80dec */ + clear_C1(); + if ( FPU_store_bcd(st0_ptr, st0_tag, (u_char __user *)data_address) ) + pop_0(); /* pop only if the number was actually stored + (see the 80486 manual p16-28) */ + break; + case 034: /* fstcw m16int */ + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,data_address,2); + FPU_put_user(control_word, (unsigned short __user *) data_address); + RE_ENTRANT_CHECK_ON; + return 1; + case 035: /* fstp m80real */ + clear_C1(); + if ( FPU_store_extended(st0_ptr, st0_tag, (long double __user *)data_address) ) + pop_0(); /* pop only if the number was actually stored + (see the 80486 manual p16-28) */ + break; + case 036: /* fstsw m2byte */ + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,data_address,2); + FPU_put_user(status_word(),(unsigned short __user *) data_address); + RE_ENTRANT_CHECK_ON; + return 1; + case 037: /* fistp m64int */ + clear_C1(); + if ( FPU_store_int64(st0_ptr, st0_tag, (long long __user *)data_address) ) + pop_0(); /* pop only if the number was actually stored + (see the 80486 manual p16-28) */ + break; + } + return 0; +} diff --git a/src/wraith/math-emu/mul_Xsig.S b/src/wraith/math-emu/mul_Xsig.S new file mode 100644 index 000000000..717785a53 --- /dev/null +++ b/src/wraith/math-emu/mul_Xsig.S @@ -0,0 +1,176 @@ +/*---------------------------------------------------------------------------+ + | mul_Xsig.S | + | | + | Multiply a 12 byte fixed point number by another fixed point number. | + | | + | Copyright (C) 1992,1994,1995 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@jacobi.maths.monash.edu.au | + | | + | Call from C as: | + | void mul32_Xsig(Xsig *x, unsigned b) | + | | + | void mul64_Xsig(Xsig *x, unsigned long long *b) | + | | + | void mul_Xsig_Xsig(Xsig *x, unsigned *b) | + | | + | The result is neither rounded nor normalized, and the ls bit or so may | + | be wrong. | + | | + +---------------------------------------------------------------------------*/ + .file "mul_Xsig.S" + + +#include "fpu_emu.h" + +.text +ENTRY(mul32_Xsig) + pushl %ebp + movl %esp,%ebp + subl $16,%esp + pushl %esi + + movl PARAM1,%esi + movl PARAM2,%ecx + + xor %eax,%eax + movl %eax,-4(%ebp) + movl %eax,-8(%ebp) + + movl (%esi),%eax /* lsl of Xsig */ + mull %ecx /* msl of b */ + movl %edx,-12(%ebp) + + movl 4(%esi),%eax /* midl of Xsig */ + mull %ecx /* msl of b */ + addl %eax,-12(%ebp) + adcl %edx,-8(%ebp) + adcl $0,-4(%ebp) + + movl 8(%esi),%eax /* msl of Xsig */ + mull %ecx /* msl of b */ + addl %eax,-8(%ebp) + adcl %edx,-4(%ebp) + + movl -12(%ebp),%eax + movl %eax,(%esi) + movl -8(%ebp),%eax + movl %eax,4(%esi) + movl -4(%ebp),%eax + movl %eax,8(%esi) + + popl %esi + leave + ret + + +ENTRY(mul64_Xsig) + pushl %ebp + movl %esp,%ebp + subl $16,%esp + pushl %esi + + movl PARAM1,%esi + movl PARAM2,%ecx + + xor %eax,%eax + movl %eax,-4(%ebp) + movl %eax,-8(%ebp) + + movl (%esi),%eax /* lsl of Xsig */ + mull 4(%ecx) /* msl of b */ + movl %edx,-12(%ebp) + + movl 4(%esi),%eax /* midl of Xsig */ + mull (%ecx) /* lsl of b */ + addl %edx,-12(%ebp) + adcl $0,-8(%ebp) + adcl $0,-4(%ebp) + + movl 4(%esi),%eax /* midl of Xsig */ + mull 4(%ecx) /* msl of b */ + addl %eax,-12(%ebp) + adcl %edx,-8(%ebp) + adcl $0,-4(%ebp) + + movl 8(%esi),%eax /* msl of Xsig */ + mull (%ecx) /* lsl of b */ + addl %eax,-12(%ebp) + adcl %edx,-8(%ebp) + adcl $0,-4(%ebp) + + movl 8(%esi),%eax /* msl of Xsig */ + mull 4(%ecx) /* msl of b */ + addl %eax,-8(%ebp) + adcl %edx,-4(%ebp) + + movl -12(%ebp),%eax + movl %eax,(%esi) + movl -8(%ebp),%eax + movl %eax,4(%esi) + movl -4(%ebp),%eax + movl %eax,8(%esi) + + popl %esi + leave + ret + + + +ENTRY(mul_Xsig_Xsig) + pushl %ebp + movl %esp,%ebp + subl $16,%esp + pushl %esi + + movl PARAM1,%esi + movl PARAM2,%ecx + + xor %eax,%eax + movl %eax,-4(%ebp) + movl %eax,-8(%ebp) + + movl (%esi),%eax /* lsl of Xsig */ + mull 8(%ecx) /* msl of b */ + movl %edx,-12(%ebp) + + movl 4(%esi),%eax /* midl of Xsig */ + mull 4(%ecx) /* midl of b */ + addl %edx,-12(%ebp) + adcl $0,-8(%ebp) + adcl $0,-4(%ebp) + + movl 8(%esi),%eax /* msl of Xsig */ + mull (%ecx) /* lsl of b */ + addl %edx,-12(%ebp) + adcl $0,-8(%ebp) + adcl $0,-4(%ebp) + + movl 4(%esi),%eax /* midl of Xsig */ + mull 8(%ecx) /* msl of b */ + addl %eax,-12(%ebp) + adcl %edx,-8(%ebp) + adcl $0,-4(%ebp) + + movl 8(%esi),%eax /* msl of Xsig */ + mull 4(%ecx) /* midl of b */ + addl %eax,-12(%ebp) + adcl %edx,-8(%ebp) + adcl $0,-4(%ebp) + + movl 8(%esi),%eax /* msl of Xsig */ + mull 8(%ecx) /* msl of b */ + addl %eax,-8(%ebp) + adcl %edx,-4(%ebp) + + movl -12(%ebp),%edx + movl %edx,(%esi) + movl -8(%ebp),%edx + movl %edx,4(%esi) + movl -4(%ebp),%edx + movl %edx,8(%esi) + + popl %esi + leave + ret + diff --git a/src/wraith/math-emu/poly.h b/src/wraith/math-emu/poly.h new file mode 100644 index 000000000..4db798114 --- /dev/null +++ b/src/wraith/math-emu/poly.h @@ -0,0 +1,121 @@ +/*---------------------------------------------------------------------------+ + | poly.h | + | | + | Header file for the FPU-emu poly*.c source files. | + | | + | Copyright (C) 1994,1999 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@melbpc.org.au | + | | + | Declarations and definitions for functions operating on Xsig (12-byte | + | extended-significand) quantities. | + | | + +---------------------------------------------------------------------------*/ + +#ifndef _POLY_H +#define _POLY_H + +/* This 12-byte structure is used to improve the accuracy of computation + of transcendental functions. + Intended to be used to get results better than 8-byte computation + allows. 9-byte would probably be sufficient. + */ +typedef struct { + unsigned long lsw; + unsigned long midw; + unsigned long msw; +} Xsig; + +asmlinkage void mul64(unsigned long long const *a, unsigned long long const *b, + unsigned long long *result); +asmlinkage void polynomial_Xsig(Xsig *, const unsigned long long *x, + const unsigned long long terms[], const int n); + +asmlinkage void mul32_Xsig(Xsig *, const unsigned long mult); +asmlinkage void mul64_Xsig(Xsig *, const unsigned long long *mult); +asmlinkage void mul_Xsig_Xsig(Xsig *dest, const Xsig *mult); + +asmlinkage void shr_Xsig(Xsig *, const int n); +asmlinkage int round_Xsig(Xsig *); +asmlinkage int norm_Xsig(Xsig *); +asmlinkage void div_Xsig(Xsig *x1, const Xsig *x2, const Xsig *dest); + +/* Macro to extract the most significant 32 bits from a long long */ +#define LL_MSW(x) (((unsigned long *)&x)[1]) + +/* Macro to initialize an Xsig struct */ +#define MK_XSIG(a,b,c) { c, b, a } + +/* Macro to access the 8 ms bytes of an Xsig as a long long */ +#define XSIG_LL(x) (*(unsigned long long *)&x.midw) + + +/* + Need to run gcc with optimizations on to get these to + actually be in-line. + */ + +/* Multiply two fixed-point 32 bit numbers, producing a 32 bit result. + The answer is the ms word of the product. */ +/* Some versions of gcc make it difficult to stop eax from being clobbered. + Merely specifying that it is used doesn't work... + */ +static inline unsigned long mul_32_32(const unsigned long arg1, + const unsigned long arg2) +{ + int retval; + asm volatile ("mull %2; movl %%edx,%%eax" \ + :"=a" (retval) \ + :"0" (arg1), "g" (arg2) \ + :"dx"); + return retval; +} + + +/* Add the 12 byte Xsig x2 to Xsig dest, with no checks for overflow. */ +static inline void add_Xsig_Xsig(Xsig *dest, const Xsig *x2) +{ + asm volatile ("movl %1,%%edi; movl %2,%%esi;\n" + "movl (%%esi),%%eax; addl %%eax,(%%edi);\n" + "movl 4(%%esi),%%eax; adcl %%eax,4(%%edi);\n" + "movl 8(%%esi),%%eax; adcl %%eax,8(%%edi);\n" + :"=g" (*dest):"g" (dest), "g" (x2) + :"ax","si","di"); +} + + +/* Add the 12 byte Xsig x2 to Xsig dest, adjust exp if overflow occurs. */ +/* Note: the constraints in the asm statement didn't always work properly + with gcc 2.5.8. Changing from using edi to using ecx got around the + problem, but keep fingers crossed! */ +static inline void add_two_Xsig(Xsig *dest, const Xsig *x2, long int *exp) +{ + asm volatile ("movl %2,%%ecx; movl %3,%%esi;\n" + "movl (%%esi),%%eax; addl %%eax,(%%ecx);\n" + "movl 4(%%esi),%%eax; adcl %%eax,4(%%ecx);\n" + "movl 8(%%esi),%%eax; adcl %%eax,8(%%ecx);\n" + "jnc 0f;\n" + "rcrl 8(%%ecx); rcrl 4(%%ecx); rcrl (%%ecx)\n" + "movl %4,%%ecx; incl (%%ecx)\n" + "movl $1,%%eax; jmp 1f;\n" + "0: xorl %%eax,%%eax;\n" + "1:\n" + :"=g" (*exp), "=g" (*dest) + :"g" (dest), "g" (x2), "g" (exp) + :"cx","si","ax"); +} + + +/* Negate (subtract from 1.0) the 12 byte Xsig */ +/* This is faster in a loop on my 386 than using the "neg" instruction. */ +static inline void negate_Xsig(Xsig *x) +{ + asm volatile("movl %1,%%esi;\n" + "xorl %%ecx,%%ecx;\n" + "movl %%ecx,%%eax; subl (%%esi),%%eax; movl %%eax,(%%esi);\n" + "movl %%ecx,%%eax; sbbl 4(%%esi),%%eax; movl %%eax,4(%%esi);\n" + "movl %%ecx,%%eax; sbbl 8(%%esi),%%eax; movl %%eax,8(%%esi);\n" + :"=g" (*x):"g" (x):"si","ax","cx"); +} + +#endif /* _POLY_H */ diff --git a/src/wraith/math-emu/poly_2xm1.c b/src/wraith/math-emu/poly_2xm1.c new file mode 100644 index 000000000..9766ad5e9 --- /dev/null +++ b/src/wraith/math-emu/poly_2xm1.c @@ -0,0 +1,156 @@ +/*---------------------------------------------------------------------------+ + | poly_2xm1.c | + | | + | Function to compute 2^x-1 by a polynomial approximation. | + | | + | Copyright (C) 1992,1993,1994,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +#include "exception.h" +#include "reg_constant.h" +#include "fpu_emu.h" +#include "fpu_system.h" +#include "control_w.h" +#include "poly.h" + + +#define HIPOWER 11 +static const unsigned long long lterms[HIPOWER] = +{ + 0x0000000000000000LL, /* This term done separately as 12 bytes */ + 0xf5fdeffc162c7543LL, + 0x1c6b08d704a0bfa6LL, + 0x0276556df749cc21LL, + 0x002bb0ffcf14f6b8LL, + 0x0002861225ef751cLL, + 0x00001ffcbfcd5422LL, + 0x00000162c005d5f1LL, + 0x0000000da96ccb1bLL, + 0x0000000078d1b897LL, + 0x000000000422b029LL +}; + +static const Xsig hiterm = MK_XSIG(0xb17217f7, 0xd1cf79ab, 0xc8a39194); + +/* Four slices: 0.0 : 0.25 : 0.50 : 0.75 : 1.0, + These numbers are 2^(1/4), 2^(1/2), and 2^(3/4) + */ +static const Xsig shiftterm0 = MK_XSIG(0, 0, 0); +static const Xsig shiftterm1 = MK_XSIG(0x9837f051, 0x8db8a96f, 0x46ad2318); +static const Xsig shiftterm2 = MK_XSIG(0xb504f333, 0xf9de6484, 0x597d89b3); +static const Xsig shiftterm3 = MK_XSIG(0xd744fcca, 0xd69d6af4, 0x39a68bb9); + +static const Xsig *shiftterm[] = { &shiftterm0, &shiftterm1, + &shiftterm2, &shiftterm3 }; + + +/*--- poly_2xm1() -----------------------------------------------------------+ + | Requires st(0) which is TAG_Valid and < 1. | + +---------------------------------------------------------------------------*/ +int poly_2xm1(u_char sign, FPU_REG *arg, FPU_REG *result) +{ + long int exponent, shift; + unsigned long long Xll; + Xsig accumulator, Denom, argSignif; + u_char tag; + + exponent = exponent16(arg); + +#ifdef PARANOID + if ( exponent >= 0 ) /* Don't want a |number| >= 1.0 */ + { + /* Number negative, too large, or not Valid. */ + EXCEPTION(EX_INTERNAL|0x127); + return 1; + } +#endif /* PARANOID */ + + argSignif.lsw = 0; + XSIG_LL(argSignif) = Xll = significand(arg); + + if ( exponent == -1 ) + { + shift = (argSignif.msw & 0x40000000) ? 3 : 2; + /* subtract 0.5 or 0.75 */ + exponent -= 2; + XSIG_LL(argSignif) <<= 2; + Xll <<= 2; + } + else if ( exponent == -2 ) + { + shift = 1; + /* subtract 0.25 */ + exponent--; + XSIG_LL(argSignif) <<= 1; + Xll <<= 1; + } + else + shift = 0; + + if ( exponent < -2 ) + { + /* Shift the argument right by the required places. */ + if ( FPU_shrx(&Xll, -2-exponent) >= 0x80000000U ) + Xll++; /* round up */ + } + + accumulator.lsw = accumulator.midw = accumulator.msw = 0; + polynomial_Xsig(&accumulator, &Xll, lterms, HIPOWER-1); + mul_Xsig_Xsig(&accumulator, &argSignif); + shr_Xsig(&accumulator, 3); + + mul_Xsig_Xsig(&argSignif, &hiterm); /* The leading term */ + add_two_Xsig(&accumulator, &argSignif, &exponent); + + if ( shift ) + { + /* The argument is large, use the identity: + f(x+a) = f(a) * (f(x) + 1) - 1; + */ + shr_Xsig(&accumulator, - exponent); + accumulator.msw |= 0x80000000; /* add 1.0 */ + mul_Xsig_Xsig(&accumulator, shiftterm[shift]); + accumulator.msw &= 0x3fffffff; /* subtract 1.0 */ + exponent = 1; + } + + if ( sign != SIGN_POS ) + { + /* The argument is negative, use the identity: + f(-x) = -f(x) / (1 + f(x)) + */ + Denom.lsw = accumulator.lsw; + XSIG_LL(Denom) = XSIG_LL(accumulator); + if ( exponent < 0 ) + shr_Xsig(&Denom, - exponent); + else if ( exponent > 0 ) + { + /* exponent must be 1 here */ + XSIG_LL(Denom) <<= 1; + if ( Denom.lsw & 0x80000000 ) + XSIG_LL(Denom) |= 1; + (Denom.lsw) <<= 1; + } + Denom.msw |= 0x80000000; /* add 1.0 */ + div_Xsig(&accumulator, &Denom, &accumulator); + } + + /* Convert to 64 bit signed-compatible */ + exponent += round_Xsig(&accumulator); + + result = &st(0); + significand(result) = XSIG_LL(accumulator); + setexponent16(result, exponent); + + tag = FPU_round(result, 1, 0, FULL_PRECISION, sign); + + setsign(result, sign); + FPU_settag0(tag); + + return 0; + +} diff --git a/src/wraith/math-emu/poly_atan.c b/src/wraith/math-emu/poly_atan.c new file mode 100644 index 000000000..82f702952 --- /dev/null +++ b/src/wraith/math-emu/poly_atan.c @@ -0,0 +1,229 @@ +/*---------------------------------------------------------------------------+ + | poly_atan.c | + | | + | Compute the arctan of a FPU_REG, using a polynomial approximation. | + | | + | Copyright (C) 1992,1993,1994,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +#include "exception.h" +#include "reg_constant.h" +#include "fpu_emu.h" +#include "fpu_system.h" +#include "status_w.h" +#include "control_w.h" +#include "poly.h" + + +#define HIPOWERon 6 /* odd poly, negative terms */ +static const unsigned long long oddnegterms[HIPOWERon] = +{ + 0x0000000000000000LL, /* Dummy (not for - 1.0) */ + 0x015328437f756467LL, + 0x0005dda27b73dec6LL, + 0x0000226bf2bfb91aLL, + 0x000000ccc439c5f7LL, + 0x0000000355438407LL +} ; + +#define HIPOWERop 6 /* odd poly, positive terms */ +static const unsigned long long oddplterms[HIPOWERop] = +{ +/* 0xaaaaaaaaaaaaaaabLL, transferred to fixedpterm[] */ + 0x0db55a71875c9ac2LL, + 0x0029fce2d67880b0LL, + 0x0000dfd3908b4596LL, + 0x00000550fd61dab4LL, + 0x0000001c9422b3f9LL, + 0x000000003e3301e1LL +}; + +static const unsigned long long denomterm = 0xebd9b842c5c53a0eLL; + +static const Xsig fixedpterm = MK_XSIG(0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa); + +static const Xsig pi_signif = MK_XSIG(0xc90fdaa2, 0x2168c234, 0xc4c6628b); + + +/*--- poly_atan() -----------------------------------------------------------+ + | | + +---------------------------------------------------------------------------*/ +void poly_atan(FPU_REG *st0_ptr, u_char st0_tag, + FPU_REG *st1_ptr, u_char st1_tag) +{ + u_char transformed, inverted, + sign1, sign2; + int exponent; + long int dummy_exp; + Xsig accumulator, Numer, Denom, accumulatore, argSignif, + argSq, argSqSq; + u_char tag; + + sign1 = getsign(st0_ptr); + sign2 = getsign(st1_ptr); + if ( st0_tag == TAG_Valid ) + { + exponent = exponent(st0_ptr); + } + else + { + /* This gives non-compatible stack contents... */ + FPU_to_exp16(st0_ptr, st0_ptr); + exponent = exponent16(st0_ptr); + } + if ( st1_tag == TAG_Valid ) + { + exponent -= exponent(st1_ptr); + } + else + { + /* This gives non-compatible stack contents... */ + FPU_to_exp16(st1_ptr, st1_ptr); + exponent -= exponent16(st1_ptr); + } + + if ( (exponent < 0) || ((exponent == 0) && + ((st0_ptr->sigh < st1_ptr->sigh) || + ((st0_ptr->sigh == st1_ptr->sigh) && + (st0_ptr->sigl < st1_ptr->sigl))) ) ) + { + inverted = 1; + Numer.lsw = Denom.lsw = 0; + XSIG_LL(Numer) = significand(st0_ptr); + XSIG_LL(Denom) = significand(st1_ptr); + } + else + { + inverted = 0; + exponent = -exponent; + Numer.lsw = Denom.lsw = 0; + XSIG_LL(Numer) = significand(st1_ptr); + XSIG_LL(Denom) = significand(st0_ptr); + } + div_Xsig(&Numer, &Denom, &argSignif); + exponent += norm_Xsig(&argSignif); + + if ( (exponent >= -1) + || ((exponent == -2) && (argSignif.msw > 0xd413ccd0)) ) + { + /* The argument is greater than sqrt(2)-1 (=0.414213562...) */ + /* Convert the argument by an identity for atan */ + transformed = 1; + + if ( exponent >= 0 ) + { +#ifdef PARANOID + if ( !( (exponent == 0) && + (argSignif.lsw == 0) && (argSignif.midw == 0) && + (argSignif.msw == 0x80000000) ) ) + { + EXCEPTION(EX_INTERNAL|0x104); /* There must be a logic error */ + return; + } +#endif /* PARANOID */ + argSignif.msw = 0; /* Make the transformed arg -> 0.0 */ + } + else + { + Numer.lsw = Denom.lsw = argSignif.lsw; + XSIG_LL(Numer) = XSIG_LL(Denom) = XSIG_LL(argSignif); + + if ( exponent < -1 ) + shr_Xsig(&Numer, -1-exponent); + negate_Xsig(&Numer); + + shr_Xsig(&Denom, -exponent); + Denom.msw |= 0x80000000; + + div_Xsig(&Numer, &Denom, &argSignif); + + exponent = -1 + norm_Xsig(&argSignif); + } + } + else + { + transformed = 0; + } + + argSq.lsw = argSignif.lsw; argSq.midw = argSignif.midw; + argSq.msw = argSignif.msw; + mul_Xsig_Xsig(&argSq, &argSq); + + argSqSq.lsw = argSq.lsw; argSqSq.midw = argSq.midw; argSqSq.msw = argSq.msw; + mul_Xsig_Xsig(&argSqSq, &argSqSq); + + accumulatore.lsw = argSq.lsw; + XSIG_LL(accumulatore) = XSIG_LL(argSq); + + shr_Xsig(&argSq, 2*(-1-exponent-1)); + shr_Xsig(&argSqSq, 4*(-1-exponent-1)); + + /* Now have argSq etc with binary point at the left + .1xxxxxxxx */ + + /* Do the basic fixed point polynomial evaluation */ + accumulator.msw = accumulator.midw = accumulator.lsw = 0; + polynomial_Xsig(&accumulator, &XSIG_LL(argSqSq), + oddplterms, HIPOWERop-1); + mul64_Xsig(&accumulator, &XSIG_LL(argSq)); + negate_Xsig(&accumulator); + polynomial_Xsig(&accumulator, &XSIG_LL(argSqSq), oddnegterms, HIPOWERon-1); + negate_Xsig(&accumulator); + add_two_Xsig(&accumulator, &fixedpterm, &dummy_exp); + + mul64_Xsig(&accumulatore, &denomterm); + shr_Xsig(&accumulatore, 1 + 2*(-1-exponent)); + accumulatore.msw |= 0x80000000; + + div_Xsig(&accumulator, &accumulatore, &accumulator); + + mul_Xsig_Xsig(&accumulator, &argSignif); + mul_Xsig_Xsig(&accumulator, &argSq); + + shr_Xsig(&accumulator, 3); + negate_Xsig(&accumulator); + add_Xsig_Xsig(&accumulator, &argSignif); + + if ( transformed ) + { + /* compute pi/4 - accumulator */ + shr_Xsig(&accumulator, -1-exponent); + negate_Xsig(&accumulator); + add_Xsig_Xsig(&accumulator, &pi_signif); + exponent = -1; + } + + if ( inverted ) + { + /* compute pi/2 - accumulator */ + shr_Xsig(&accumulator, -exponent); + negate_Xsig(&accumulator); + add_Xsig_Xsig(&accumulator, &pi_signif); + exponent = 0; + } + + if ( sign1 ) + { + /* compute pi - accumulator */ + shr_Xsig(&accumulator, 1 - exponent); + negate_Xsig(&accumulator); + add_Xsig_Xsig(&accumulator, &pi_signif); + exponent = 1; + } + + exponent += round_Xsig(&accumulator); + + significand(st1_ptr) = XSIG_LL(accumulator); + setexponent16(st1_ptr, exponent); + + tag = FPU_round(st1_ptr, 1, 0, FULL_PRECISION, sign2); + FPU_settagi(1, tag); + + set_precision_flag_up(); /* We do not really know if up or down, + use this as the default. */ + +} diff --git a/src/wraith/math-emu/poly_l2.c b/src/wraith/math-emu/poly_l2.c new file mode 100644 index 000000000..dd00e1d5b --- /dev/null +++ b/src/wraith/math-emu/poly_l2.c @@ -0,0 +1,272 @@ +/*---------------------------------------------------------------------------+ + | poly_l2.c | + | | + | Compute the base 2 log of a FPU_REG, using a polynomial approximation. | + | | + | Copyright (C) 1992,1993,1994,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + + +#include "exception.h" +#include "reg_constant.h" +#include "fpu_emu.h" +#include "fpu_system.h" +#include "control_w.h" +#include "poly.h" + + +static void log2_kernel(FPU_REG const *arg, u_char argsign, + Xsig *accum_result, long int *expon); + + +/*--- poly_l2() -------------------------------------------------------------+ + | Base 2 logarithm by a polynomial approximation. | + +---------------------------------------------------------------------------*/ +void poly_l2(FPU_REG *st0_ptr, FPU_REG *st1_ptr, u_char st1_sign) +{ + long int exponent, expon, expon_expon; + Xsig accumulator, expon_accum, yaccum; + u_char sign, argsign; + FPU_REG x; + int tag; + + exponent = exponent16(st0_ptr); + + /* From st0_ptr, make a number > sqrt(2)/2 and < sqrt(2) */ + if ( st0_ptr->sigh > (unsigned)0xb504f334 ) + { + /* Treat as sqrt(2)/2 < st0_ptr < 1 */ + significand(&x) = - significand(st0_ptr); + setexponent16(&x, -1); + exponent++; + argsign = SIGN_NEG; + } + else + { + /* Treat as 1 <= st0_ptr < sqrt(2) */ + x.sigh = st0_ptr->sigh - 0x80000000; + x.sigl = st0_ptr->sigl; + setexponent16(&x, 0); + argsign = SIGN_POS; + } + tag = FPU_normalize_nuo(&x); + + if ( tag == TAG_Zero ) + { + expon = 0; + accumulator.msw = accumulator.midw = accumulator.lsw = 0; + } + else + { + log2_kernel(&x, argsign, &accumulator, &expon); + } + + if ( exponent < 0 ) + { + sign = SIGN_NEG; + exponent = -exponent; + } + else + sign = SIGN_POS; + expon_accum.msw = exponent; expon_accum.midw = expon_accum.lsw = 0; + if ( exponent ) + { + expon_expon = 31 + norm_Xsig(&expon_accum); + shr_Xsig(&accumulator, expon_expon - expon); + + if ( sign ^ argsign ) + negate_Xsig(&accumulator); + add_Xsig_Xsig(&accumulator, &expon_accum); + } + else + { + expon_expon = expon; + sign = argsign; + } + + yaccum.lsw = 0; XSIG_LL(yaccum) = significand(st1_ptr); + mul_Xsig_Xsig(&accumulator, &yaccum); + + expon_expon += round_Xsig(&accumulator); + + if ( accumulator.msw == 0 ) + { + FPU_copy_to_reg1(&CONST_Z, TAG_Zero); + return; + } + + significand(st1_ptr) = XSIG_LL(accumulator); + setexponent16(st1_ptr, expon_expon + exponent16(st1_ptr) + 1); + + tag = FPU_round(st1_ptr, 1, 0, FULL_PRECISION, sign ^ st1_sign); + FPU_settagi(1, tag); + + set_precision_flag_up(); /* 80486 appears to always do this */ + + return; + +} + + +/*--- poly_l2p1() -----------------------------------------------------------+ + | Base 2 logarithm by a polynomial approximation. | + | log2(x+1) | + +---------------------------------------------------------------------------*/ +int poly_l2p1(u_char sign0, u_char sign1, + FPU_REG *st0_ptr, FPU_REG *st1_ptr, FPU_REG *dest) +{ + u_char tag; + long int exponent; + Xsig accumulator, yaccum; + + if ( exponent16(st0_ptr) < 0 ) + { + log2_kernel(st0_ptr, sign0, &accumulator, &exponent); + + yaccum.lsw = 0; + XSIG_LL(yaccum) = significand(st1_ptr); + mul_Xsig_Xsig(&accumulator, &yaccum); + + exponent += round_Xsig(&accumulator); + + exponent += exponent16(st1_ptr) + 1; + if ( exponent < EXP_WAY_UNDER ) exponent = EXP_WAY_UNDER; + + significand(dest) = XSIG_LL(accumulator); + setexponent16(dest, exponent); + + tag = FPU_round(dest, 1, 0, FULL_PRECISION, sign0 ^ sign1); + FPU_settagi(1, tag); + + if ( tag == TAG_Valid ) + set_precision_flag_up(); /* 80486 appears to always do this */ + } + else + { + /* The magnitude of st0_ptr is far too large. */ + + if ( sign0 != SIGN_POS ) + { + /* Trying to get the log of a negative number. */ +#ifdef PECULIAR_486 /* Stupid 80486 doesn't worry about log(negative). */ + changesign(st1_ptr); +#else + if ( arith_invalid(1) < 0 ) + return 1; +#endif /* PECULIAR_486 */ + } + + /* 80486 appears to do this */ + if ( sign0 == SIGN_NEG ) + set_precision_flag_down(); + else + set_precision_flag_up(); + } + + if ( exponent(dest) <= EXP_UNDER ) + EXCEPTION(EX_Underflow); + + return 0; + +} + + + + +#undef HIPOWER +#define HIPOWER 10 +static const unsigned long long logterms[HIPOWER] = +{ + 0x2a8eca5705fc2ef0LL, + 0xf6384ee1d01febceLL, + 0x093bb62877cdf642LL, + 0x006985d8a9ec439bLL, + 0x0005212c4f55a9c8LL, + 0x00004326a16927f0LL, + 0x0000038d1d80a0e7LL, + 0x0000003141cc80c6LL, + 0x00000002b1668c9fLL, + 0x000000002c7a46aaLL +}; + +static const unsigned long leadterm = 0xb8000000; + + +/*--- log2_kernel() ---------------------------------------------------------+ + | Base 2 logarithm by a polynomial approximation. | + | log2(x+1) | + +---------------------------------------------------------------------------*/ +static void log2_kernel(FPU_REG const *arg, u_char argsign, Xsig *accum_result, + long int *expon) +{ + long int exponent, adj; + unsigned long long Xsq; + Xsig accumulator, Numer, Denom, argSignif, arg_signif; + + exponent = exponent16(arg); + Numer.lsw = Denom.lsw = 0; + XSIG_LL(Numer) = XSIG_LL(Denom) = significand(arg); + if ( argsign == SIGN_POS ) + { + shr_Xsig(&Denom, 2 - (1 + exponent)); + Denom.msw |= 0x80000000; + div_Xsig(&Numer, &Denom, &argSignif); + } + else + { + shr_Xsig(&Denom, 1 - (1 + exponent)); + negate_Xsig(&Denom); + if ( Denom.msw & 0x80000000 ) + { + div_Xsig(&Numer, &Denom, &argSignif); + exponent ++; + } + else + { + /* Denom must be 1.0 */ + argSignif.lsw = Numer.lsw; argSignif.midw = Numer.midw; + argSignif.msw = Numer.msw; + } + } + +#ifndef PECULIAR_486 + /* Should check here that |local_arg| is within the valid range */ + if ( exponent >= -2 ) + { + if ( (exponent > -2) || + (argSignif.msw > (unsigned)0xafb0ccc0) ) + { + /* The argument is too large */ + } + } +#endif /* PECULIAR_486 */ + + arg_signif.lsw = argSignif.lsw; XSIG_LL(arg_signif) = XSIG_LL(argSignif); + adj = norm_Xsig(&argSignif); + accumulator.lsw = argSignif.lsw; XSIG_LL(accumulator) = XSIG_LL(argSignif); + mul_Xsig_Xsig(&accumulator, &accumulator); + shr_Xsig(&accumulator, 2*(-1 - (1 + exponent + adj))); + Xsq = XSIG_LL(accumulator); + if ( accumulator.lsw & 0x80000000 ) + Xsq++; + + accumulator.msw = accumulator.midw = accumulator.lsw = 0; + /* Do the basic fixed point polynomial evaluation */ + polynomial_Xsig(&accumulator, &Xsq, logterms, HIPOWER-1); + + mul_Xsig_Xsig(&accumulator, &argSignif); + shr_Xsig(&accumulator, 6 - adj); + + mul32_Xsig(&arg_signif, leadterm); + add_two_Xsig(&accumulator, &arg_signif, &exponent); + + *expon = exponent + 1; + accum_result->lsw = accumulator.lsw; + accum_result->midw = accumulator.midw; + accum_result->msw = accumulator.msw; + +} diff --git a/src/wraith/math-emu/poly_sin.c b/src/wraith/math-emu/poly_sin.c new file mode 100644 index 000000000..a36313fb0 --- /dev/null +++ b/src/wraith/math-emu/poly_sin.c @@ -0,0 +1,397 @@ +/*---------------------------------------------------------------------------+ + | poly_sin.c | + | | + | Computation of an approximation of the sin function and the cosine | + | function by a polynomial. | + | | + | Copyright (C) 1992,1993,1994,1997,1999 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@melbpc.org.au | + | | + | | + +---------------------------------------------------------------------------*/ + + +#include "exception.h" +#include "reg_constant.h" +#include "fpu_emu.h" +#include "fpu_system.h" +#include "control_w.h" +#include "poly.h" + + +#define N_COEFF_P 4 +#define N_COEFF_N 4 + +static const unsigned long long pos_terms_l[N_COEFF_P] = +{ + 0xaaaaaaaaaaaaaaabLL, + 0x00d00d00d00cf906LL, + 0x000006b99159a8bbLL, + 0x000000000d7392e6LL +}; + +static const unsigned long long neg_terms_l[N_COEFF_N] = +{ + 0x2222222222222167LL, + 0x0002e3bc74aab624LL, + 0x0000000b09229062LL, + 0x00000000000c7973LL +}; + + + +#define N_COEFF_PH 4 +#define N_COEFF_NH 4 +static const unsigned long long pos_terms_h[N_COEFF_PH] = +{ + 0x0000000000000000LL, + 0x05b05b05b05b0406LL, + 0x000049f93edd91a9LL, + 0x00000000c9c9ed62LL +}; + +static const unsigned long long neg_terms_h[N_COEFF_NH] = +{ + 0xaaaaaaaaaaaaaa98LL, + 0x001a01a01a019064LL, + 0x0000008f76c68a77LL, + 0x0000000000d58f5eLL +}; + + +/*--- poly_sine() -----------------------------------------------------------+ + | | + +---------------------------------------------------------------------------*/ +void poly_sine(FPU_REG *st0_ptr) +{ + int exponent, echange; + Xsig accumulator, argSqrd, argTo4; + unsigned long fix_up, adj; + unsigned long long fixed_arg; + FPU_REG result; + + exponent = exponent(st0_ptr); + + accumulator.lsw = accumulator.midw = accumulator.msw = 0; + + /* Split into two ranges, for arguments below and above 1.0 */ + /* The boundary between upper and lower is approx 0.88309101259 */ + if ( (exponent < -1) || ((exponent == -1) && (st0_ptr->sigh <= 0xe21240aa)) ) + { + /* The argument is <= 0.88309101259 */ + + argSqrd.msw = st0_ptr->sigh; argSqrd.midw = st0_ptr->sigl; argSqrd.lsw = 0; + mul64_Xsig(&argSqrd, &significand(st0_ptr)); + shr_Xsig(&argSqrd, 2*(-1-exponent)); + argTo4.msw = argSqrd.msw; argTo4.midw = argSqrd.midw; + argTo4.lsw = argSqrd.lsw; + mul_Xsig_Xsig(&argTo4, &argTo4); + + polynomial_Xsig(&accumulator, &XSIG_LL(argTo4), neg_terms_l, + N_COEFF_N-1); + mul_Xsig_Xsig(&accumulator, &argSqrd); + negate_Xsig(&accumulator); + + polynomial_Xsig(&accumulator, &XSIG_LL(argTo4), pos_terms_l, + N_COEFF_P-1); + + shr_Xsig(&accumulator, 2); /* Divide by four */ + accumulator.msw |= 0x80000000; /* Add 1.0 */ + + mul64_Xsig(&accumulator, &significand(st0_ptr)); + mul64_Xsig(&accumulator, &significand(st0_ptr)); + mul64_Xsig(&accumulator, &significand(st0_ptr)); + + /* Divide by four, FPU_REG compatible, etc */ + exponent = 3*exponent; + + /* The minimum exponent difference is 3 */ + shr_Xsig(&accumulator, exponent(st0_ptr) - exponent); + + negate_Xsig(&accumulator); + XSIG_LL(accumulator) += significand(st0_ptr); + + echange = round_Xsig(&accumulator); + + setexponentpos(&result, exponent(st0_ptr) + echange); + } + else + { + /* The argument is > 0.88309101259 */ + /* We use sin(st(0)) = cos(pi/2-st(0)) */ + + fixed_arg = significand(st0_ptr); + + if ( exponent == 0 ) + { + /* The argument is >= 1.0 */ + + /* Put the binary point at the left. */ + fixed_arg <<= 1; + } + /* pi/2 in hex is: 1.921fb54442d18469 898CC51701B839A2 52049C1 */ + fixed_arg = 0x921fb54442d18469LL - fixed_arg; + /* There is a special case which arises due to rounding, to fix here. */ + if ( fixed_arg == 0xffffffffffffffffLL ) + fixed_arg = 0; + + XSIG_LL(argSqrd) = fixed_arg; argSqrd.lsw = 0; + mul64_Xsig(&argSqrd, &fixed_arg); + + XSIG_LL(argTo4) = XSIG_LL(argSqrd); argTo4.lsw = argSqrd.lsw; + mul_Xsig_Xsig(&argTo4, &argTo4); + + polynomial_Xsig(&accumulator, &XSIG_LL(argTo4), neg_terms_h, + N_COEFF_NH-1); + mul_Xsig_Xsig(&accumulator, &argSqrd); + negate_Xsig(&accumulator); + + polynomial_Xsig(&accumulator, &XSIG_LL(argTo4), pos_terms_h, + N_COEFF_PH-1); + negate_Xsig(&accumulator); + + mul64_Xsig(&accumulator, &fixed_arg); + mul64_Xsig(&accumulator, &fixed_arg); + + shr_Xsig(&accumulator, 3); + negate_Xsig(&accumulator); + + add_Xsig_Xsig(&accumulator, &argSqrd); + + shr_Xsig(&accumulator, 1); + + accumulator.lsw |= 1; /* A zero accumulator here would cause problems */ + negate_Xsig(&accumulator); + + /* The basic computation is complete. Now fix the answer to + compensate for the error due to the approximation used for + pi/2 + */ + + /* This has an exponent of -65 */ + fix_up = 0x898cc517; + /* The fix-up needs to be improved for larger args */ + if ( argSqrd.msw & 0xffc00000 ) + { + /* Get about 32 bit precision in these: */ + fix_up -= mul_32_32(0x898cc517, argSqrd.msw) / 6; + } + fix_up = mul_32_32(fix_up, LL_MSW(fixed_arg)); + + adj = accumulator.lsw; /* temp save */ + accumulator.lsw -= fix_up; + if ( accumulator.lsw > adj ) + XSIG_LL(accumulator) --; + + echange = round_Xsig(&accumulator); + + setexponentpos(&result, echange - 1); + } + + significand(&result) = XSIG_LL(accumulator); + setsign(&result, getsign(st0_ptr)); + FPU_copy_to_reg0(&result, TAG_Valid); + +#ifdef PARANOID + if ( (exponent(&result) >= 0) + && (significand(&result) > 0x8000000000000000LL) ) + { + EXCEPTION(EX_INTERNAL|0x150); + } +#endif /* PARANOID */ + +} + + + +/*--- poly_cos() ------------------------------------------------------------+ + | | + +---------------------------------------------------------------------------*/ +void poly_cos(FPU_REG *st0_ptr) +{ + FPU_REG result; + long int exponent, exp2, echange; + Xsig accumulator, argSqrd, fix_up, argTo4; + unsigned long long fixed_arg; + +#ifdef PARANOID + if ( (exponent(st0_ptr) > 0) + || ((exponent(st0_ptr) == 0) + && (significand(st0_ptr) > 0xc90fdaa22168c234LL)) ) + { + EXCEPTION(EX_Invalid); + FPU_copy_to_reg0(&CONST_QNaN, TAG_Special); + return; + } +#endif /* PARANOID */ + + exponent = exponent(st0_ptr); + + accumulator.lsw = accumulator.midw = accumulator.msw = 0; + + if ( (exponent < -1) || ((exponent == -1) && (st0_ptr->sigh <= 0xb00d6f54)) ) + { + /* arg is < 0.687705 */ + + argSqrd.msw = st0_ptr->sigh; argSqrd.midw = st0_ptr->sigl; + argSqrd.lsw = 0; + mul64_Xsig(&argSqrd, &significand(st0_ptr)); + + if ( exponent < -1 ) + { + /* shift the argument right by the required places */ + shr_Xsig(&argSqrd, 2*(-1-exponent)); + } + + argTo4.msw = argSqrd.msw; argTo4.midw = argSqrd.midw; + argTo4.lsw = argSqrd.lsw; + mul_Xsig_Xsig(&argTo4, &argTo4); + + polynomial_Xsig(&accumulator, &XSIG_LL(argTo4), neg_terms_h, + N_COEFF_NH-1); + mul_Xsig_Xsig(&accumulator, &argSqrd); + negate_Xsig(&accumulator); + + polynomial_Xsig(&accumulator, &XSIG_LL(argTo4), pos_terms_h, + N_COEFF_PH-1); + negate_Xsig(&accumulator); + + mul64_Xsig(&accumulator, &significand(st0_ptr)); + mul64_Xsig(&accumulator, &significand(st0_ptr)); + shr_Xsig(&accumulator, -2*(1+exponent)); + + shr_Xsig(&accumulator, 3); + negate_Xsig(&accumulator); + + add_Xsig_Xsig(&accumulator, &argSqrd); + + shr_Xsig(&accumulator, 1); + + /* It doesn't matter if accumulator is all zero here, the + following code will work ok */ + negate_Xsig(&accumulator); + + if ( accumulator.lsw & 0x80000000 ) + XSIG_LL(accumulator) ++; + if ( accumulator.msw == 0 ) + { + /* The result is 1.0 */ + FPU_copy_to_reg0(&CONST_1, TAG_Valid); + return; + } + else + { + significand(&result) = XSIG_LL(accumulator); + + /* will be a valid positive nr with expon = -1 */ + setexponentpos(&result, -1); + } + } + else + { + fixed_arg = significand(st0_ptr); + + if ( exponent == 0 ) + { + /* The argument is >= 1.0 */ + + /* Put the binary point at the left. */ + fixed_arg <<= 1; + } + /* pi/2 in hex is: 1.921fb54442d18469 898CC51701B839A2 52049C1 */ + fixed_arg = 0x921fb54442d18469LL - fixed_arg; + /* There is a special case which arises due to rounding, to fix here. */ + if ( fixed_arg == 0xffffffffffffffffLL ) + fixed_arg = 0; + + exponent = -1; + exp2 = -1; + + /* A shift is needed here only for a narrow range of arguments, + i.e. for fixed_arg approx 2^-32, but we pick up more... */ + if ( !(LL_MSW(fixed_arg) & 0xffff0000) ) + { + fixed_arg <<= 16; + exponent -= 16; + exp2 -= 16; + } + + XSIG_LL(argSqrd) = fixed_arg; argSqrd.lsw = 0; + mul64_Xsig(&argSqrd, &fixed_arg); + + if ( exponent < -1 ) + { + /* shift the argument right by the required places */ + shr_Xsig(&argSqrd, 2*(-1-exponent)); + } + + argTo4.msw = argSqrd.msw; argTo4.midw = argSqrd.midw; + argTo4.lsw = argSqrd.lsw; + mul_Xsig_Xsig(&argTo4, &argTo4); + + polynomial_Xsig(&accumulator, &XSIG_LL(argTo4), neg_terms_l, + N_COEFF_N-1); + mul_Xsig_Xsig(&accumulator, &argSqrd); + negate_Xsig(&accumulator); + + polynomial_Xsig(&accumulator, &XSIG_LL(argTo4), pos_terms_l, + N_COEFF_P-1); + + shr_Xsig(&accumulator, 2); /* Divide by four */ + accumulator.msw |= 0x80000000; /* Add 1.0 */ + + mul64_Xsig(&accumulator, &fixed_arg); + mul64_Xsig(&accumulator, &fixed_arg); + mul64_Xsig(&accumulator, &fixed_arg); + + /* Divide by four, FPU_REG compatible, etc */ + exponent = 3*exponent; + + /* The minimum exponent difference is 3 */ + shr_Xsig(&accumulator, exp2 - exponent); + + negate_Xsig(&accumulator); + XSIG_LL(accumulator) += fixed_arg; + + /* The basic computation is complete. Now fix the answer to + compensate for the error due to the approximation used for + pi/2 + */ + + /* This has an exponent of -65 */ + XSIG_LL(fix_up) = 0x898cc51701b839a2ll; + fix_up.lsw = 0; + + /* The fix-up needs to be improved for larger args */ + if ( argSqrd.msw & 0xffc00000 ) + { + /* Get about 32 bit precision in these: */ + fix_up.msw -= mul_32_32(0x898cc517, argSqrd.msw) / 2; + fix_up.msw += mul_32_32(0x898cc517, argTo4.msw) / 24; + } + + exp2 += norm_Xsig(&accumulator); + shr_Xsig(&accumulator, 1); /* Prevent overflow */ + exp2++; + shr_Xsig(&fix_up, 65 + exp2); + + add_Xsig_Xsig(&accumulator, &fix_up); + + echange = round_Xsig(&accumulator); + + setexponentpos(&result, exp2 + echange); + significand(&result) = XSIG_LL(accumulator); + } + + FPU_copy_to_reg0(&result, TAG_Valid); + +#ifdef PARANOID + if ( (exponent(&result) >= 0) + && (significand(&result) > 0x8000000000000000LL) ) + { + EXCEPTION(EX_INTERNAL|0x151); + } +#endif /* PARANOID */ + +} diff --git a/src/wraith/math-emu/poly_tan.c b/src/wraith/math-emu/poly_tan.c new file mode 100644 index 000000000..8df3e03b6 --- /dev/null +++ b/src/wraith/math-emu/poly_tan.c @@ -0,0 +1,222 @@ +/*---------------------------------------------------------------------------+ + | poly_tan.c | + | | + | Compute the tan of a FPU_REG, using a polynomial approximation. | + | | + | Copyright (C) 1992,1993,1994,1997,1999 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@melbpc.org.au | + | | + | | + +---------------------------------------------------------------------------*/ + +#include "exception.h" +#include "reg_constant.h" +#include "fpu_emu.h" +#include "fpu_system.h" +#include "control_w.h" +#include "poly.h" + + +#define HiPOWERop 3 /* odd poly, positive terms */ +static const unsigned long long oddplterm[HiPOWERop] = +{ + 0x0000000000000000LL, + 0x0051a1cf08fca228LL, + 0x0000000071284ff7LL +}; + +#define HiPOWERon 2 /* odd poly, negative terms */ +static const unsigned long long oddnegterm[HiPOWERon] = +{ + 0x1291a9a184244e80LL, + 0x0000583245819c21LL +}; + +#define HiPOWERep 2 /* even poly, positive terms */ +static const unsigned long long evenplterm[HiPOWERep] = +{ + 0x0e848884b539e888LL, + 0x00003c7f18b887daLL +}; + +#define HiPOWERen 2 /* even poly, negative terms */ +static const unsigned long long evennegterm[HiPOWERen] = +{ + 0xf1f0200fd51569ccLL, + 0x003afb46105c4432LL +}; + +static const unsigned long long twothirds = 0xaaaaaaaaaaaaaaabLL; + + +/*--- poly_tan() ------------------------------------------------------------+ + | | + +---------------------------------------------------------------------------*/ +void poly_tan(FPU_REG *st0_ptr) +{ + long int exponent; + int invert; + Xsig argSq, argSqSq, accumulatoro, accumulatore, accum, + argSignif, fix_up; + unsigned long adj; + + exponent = exponent(st0_ptr); + +#ifdef PARANOID + if ( signnegative(st0_ptr) ) /* Can't hack a number < 0.0 */ + { arith_invalid(0); return; } /* Need a positive number */ +#endif /* PARANOID */ + + /* Split the problem into two domains, smaller and larger than pi/4 */ + if ( (exponent == 0) || ((exponent == -1) && (st0_ptr->sigh > 0xc90fdaa2)) ) + { + /* The argument is greater than (approx) pi/4 */ + invert = 1; + accum.lsw = 0; + XSIG_LL(accum) = significand(st0_ptr); + + if ( exponent == 0 ) + { + /* The argument is >= 1.0 */ + /* Put the binary point at the left. */ + XSIG_LL(accum) <<= 1; + } + /* pi/2 in hex is: 1.921fb54442d18469 898CC51701B839A2 52049C1 */ + XSIG_LL(accum) = 0x921fb54442d18469LL - XSIG_LL(accum); + /* This is a special case which arises due to rounding. */ + if ( XSIG_LL(accum) == 0xffffffffffffffffLL ) + { + FPU_settag0(TAG_Valid); + significand(st0_ptr) = 0x8a51e04daabda360LL; + setexponent16(st0_ptr, (0x41 + EXTENDED_Ebias) | SIGN_Negative); + return; + } + + argSignif.lsw = accum.lsw; + XSIG_LL(argSignif) = XSIG_LL(accum); + exponent = -1 + norm_Xsig(&argSignif); + } + else + { + invert = 0; + argSignif.lsw = 0; + XSIG_LL(accum) = XSIG_LL(argSignif) = significand(st0_ptr); + + if ( exponent < -1 ) + { + /* shift the argument right by the required places */ + if ( FPU_shrx(&XSIG_LL(accum), -1-exponent) >= 0x80000000U ) + XSIG_LL(accum) ++; /* round up */ + } + } + + XSIG_LL(argSq) = XSIG_LL(accum); argSq.lsw = accum.lsw; + mul_Xsig_Xsig(&argSq, &argSq); + XSIG_LL(argSqSq) = XSIG_LL(argSq); argSqSq.lsw = argSq.lsw; + mul_Xsig_Xsig(&argSqSq, &argSqSq); + + /* Compute the negative terms for the numerator polynomial */ + accumulatoro.msw = accumulatoro.midw = accumulatoro.lsw = 0; + polynomial_Xsig(&accumulatoro, &XSIG_LL(argSqSq), oddnegterm, HiPOWERon-1); + mul_Xsig_Xsig(&accumulatoro, &argSq); + negate_Xsig(&accumulatoro); + /* Add the positive terms */ + polynomial_Xsig(&accumulatoro, &XSIG_LL(argSqSq), oddplterm, HiPOWERop-1); + + + /* Compute the positive terms for the denominator polynomial */ + accumulatore.msw = accumulatore.midw = accumulatore.lsw = 0; + polynomial_Xsig(&accumulatore, &XSIG_LL(argSqSq), evenplterm, HiPOWERep-1); + mul_Xsig_Xsig(&accumulatore, &argSq); + negate_Xsig(&accumulatore); + /* Add the negative terms */ + polynomial_Xsig(&accumulatore, &XSIG_LL(argSqSq), evennegterm, HiPOWERen-1); + /* Multiply by arg^2 */ + mul64_Xsig(&accumulatore, &XSIG_LL(argSignif)); + mul64_Xsig(&accumulatore, &XSIG_LL(argSignif)); + /* de-normalize and divide by 2 */ + shr_Xsig(&accumulatore, -2*(1+exponent) + 1); + negate_Xsig(&accumulatore); /* This does 1 - accumulator */ + + /* Now find the ratio. */ + if ( accumulatore.msw == 0 ) + { + /* accumulatoro must contain 1.0 here, (actually, 0) but it + really doesn't matter what value we use because it will + have negligible effect in later calculations + */ + XSIG_LL(accum) = 0x8000000000000000LL; + accum.lsw = 0; + } + else + { + div_Xsig(&accumulatoro, &accumulatore, &accum); + } + + /* Multiply by 1/3 * arg^3 */ + mul64_Xsig(&accum, &XSIG_LL(argSignif)); + mul64_Xsig(&accum, &XSIG_LL(argSignif)); + mul64_Xsig(&accum, &XSIG_LL(argSignif)); + mul64_Xsig(&accum, &twothirds); + shr_Xsig(&accum, -2*(exponent+1)); + + /* tan(arg) = arg + accum */ + add_two_Xsig(&accum, &argSignif, &exponent); + + if ( invert ) + { + /* We now have the value of tan(pi_2 - arg) where pi_2 is an + approximation for pi/2 + */ + /* The next step is to fix the answer to compensate for the + error due to the approximation used for pi/2 + */ + + /* This is (approx) delta, the error in our approx for pi/2 + (see above). It has an exponent of -65 + */ + XSIG_LL(fix_up) = 0x898cc51701b839a2LL; + fix_up.lsw = 0; + + if ( exponent == 0 ) + adj = 0xffffffff; /* We want approx 1.0 here, but + this is close enough. */ + else if ( exponent > -30 ) + { + adj = accum.msw >> -(exponent+1); /* tan */ + adj = mul_32_32(adj, adj); /* tan^2 */ + } + else + adj = 0; + adj = mul_32_32(0x898cc517, adj); /* delta * tan^2 */ + + fix_up.msw += adj; + if ( !(fix_up.msw & 0x80000000) ) /* did fix_up overflow ? */ + { + /* Yes, we need to add an msb */ + shr_Xsig(&fix_up, 1); + fix_up.msw |= 0x80000000; + shr_Xsig(&fix_up, 64 + exponent); + } + else + shr_Xsig(&fix_up, 65 + exponent); + + add_two_Xsig(&accum, &fix_up, &exponent); + + /* accum now contains tan(pi/2 - arg). + Use tan(arg) = 1.0 / tan(pi/2 - arg) + */ + accumulatoro.lsw = accumulatoro.midw = 0; + accumulatoro.msw = 0x80000000; + div_Xsig(&accumulatoro, &accum, &accum); + exponent = - exponent - 1; + } + + /* Transfer the result */ + round_Xsig(&accum); + FPU_settag0(TAG_Valid); + significand(st0_ptr) = XSIG_LL(accum); + setexponent16(st0_ptr, exponent + EXTENDED_Ebias); /* Result is positive. */ + +} diff --git a/src/wraith/math-emu/polynom_Xsig.S b/src/wraith/math-emu/polynom_Xsig.S new file mode 100644 index 000000000..17315c89f --- /dev/null +++ b/src/wraith/math-emu/polynom_Xsig.S @@ -0,0 +1,135 @@ +/*---------------------------------------------------------------------------+ + | polynomial_Xsig.S | + | | + | Fixed point arithmetic polynomial evaluation. | + | | + | Copyright (C) 1992,1993,1994,1995 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@jacobi.maths.monash.edu.au | + | | + | Call from C as: | + | void polynomial_Xsig(Xsig *accum, unsigned long long x, | + | unsigned long long terms[], int n) | + | | + | Computes: | + | terms[0] + (terms[1] + (terms[2] + ... + (terms[n-1]*x)*x)*x)*x) ... )*x | + | and adds the result to the 12 byte Xsig. | + | The terms[] are each 8 bytes, but all computation is performed to 12 byte | + | precision. | + | | + | This function must be used carefully: most overflow of intermediate | + | results is controlled, but overflow of the result is not. | + | | + +---------------------------------------------------------------------------*/ + .file "polynomial_Xsig.S" + +#include "fpu_emu.h" + + +#define TERM_SIZE $8 +#define SUM_MS -20(%ebp) /* sum ms long */ +#define SUM_MIDDLE -24(%ebp) /* sum middle long */ +#define SUM_LS -28(%ebp) /* sum ls long */ +#define ACCUM_MS -4(%ebp) /* accum ms long */ +#define ACCUM_MIDDLE -8(%ebp) /* accum middle long */ +#define ACCUM_LS -12(%ebp) /* accum ls long */ +#define OVERFLOWED -16(%ebp) /* addition overflow flag */ + +.text +ENTRY(polynomial_Xsig) + pushl %ebp + movl %esp,%ebp + subl $32,%esp + pushl %esi + pushl %edi + pushl %ebx + + movl PARAM2,%esi /* x */ + movl PARAM3,%edi /* terms */ + + movl TERM_SIZE,%eax + mull PARAM4 /* n */ + addl %eax,%edi + + movl 4(%edi),%edx /* terms[n] */ + movl %edx,SUM_MS + movl (%edi),%edx /* terms[n] */ + movl %edx,SUM_MIDDLE + xor %eax,%eax + movl %eax,SUM_LS + movb %al,OVERFLOWED + + subl TERM_SIZE,%edi + decl PARAM4 + js L_accum_done + +L_accum_loop: + xor %eax,%eax + movl %eax,ACCUM_MS + movl %eax,ACCUM_MIDDLE + + movl SUM_MIDDLE,%eax + mull (%esi) /* x ls long */ + movl %edx,ACCUM_LS + + movl SUM_MIDDLE,%eax + mull 4(%esi) /* x ms long */ + addl %eax,ACCUM_LS + adcl %edx,ACCUM_MIDDLE + adcl $0,ACCUM_MS + + movl SUM_MS,%eax + mull (%esi) /* x ls long */ + addl %eax,ACCUM_LS + adcl %edx,ACCUM_MIDDLE + adcl $0,ACCUM_MS + + movl SUM_MS,%eax + mull 4(%esi) /* x ms long */ + addl %eax,ACCUM_MIDDLE + adcl %edx,ACCUM_MS + + testb $0xff,OVERFLOWED + jz L_no_overflow + + movl (%esi),%eax + addl %eax,ACCUM_MIDDLE + movl 4(%esi),%eax + adcl %eax,ACCUM_MS /* This could overflow too */ + +L_no_overflow: + +/* + * Now put the sum of next term and the accumulator + * into the sum register + */ + movl ACCUM_LS,%eax + addl (%edi),%eax /* term ls long */ + movl %eax,SUM_LS + movl ACCUM_MIDDLE,%eax + adcl (%edi),%eax /* term ls long */ + movl %eax,SUM_MIDDLE + movl ACCUM_MS,%eax + adcl 4(%edi),%eax /* term ms long */ + movl %eax,SUM_MS + sbbb %al,%al + movb %al,OVERFLOWED /* Used in the next iteration */ + + subl TERM_SIZE,%edi + decl PARAM4 + jns L_accum_loop + +L_accum_done: + movl PARAM1,%edi /* accum */ + movl SUM_LS,%eax + addl %eax,(%edi) + movl SUM_MIDDLE,%eax + adcl %eax,4(%edi) + movl SUM_MS,%eax + adcl %eax,8(%edi) + + popl %ebx + popl %edi + popl %esi + leave + ret diff --git a/src/wraith/math-emu/reg_add_sub.c b/src/wraith/math-emu/reg_add_sub.c new file mode 100644 index 000000000..7cd3b37ac --- /dev/null +++ b/src/wraith/math-emu/reg_add_sub.c @@ -0,0 +1,374 @@ +/*---------------------------------------------------------------------------+ + | reg_add_sub.c | + | | + | Functions to add or subtract two registers and put the result in a third. | + | | + | Copyright (C) 1992,1993,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | For each function, the destination may be any FPU_REG, including one of | + | the source FPU_REGs. | + | Each function returns 0 if the answer is o.k., otherwise a non-zero | + | value is returned, indicating either an exception condition or an | + | internal error. | + +---------------------------------------------------------------------------*/ + +#include "exception.h" +#include "reg_constant.h" +#include "fpu_emu.h" +#include "control_w.h" +#include "fpu_system.h" + +static +int add_sub_specials(FPU_REG const *a, u_char taga, u_char signa, + FPU_REG const *b, u_char tagb, u_char signb, + FPU_REG *dest, int deststnr, int control_w); + +/* + Operates on st(0) and st(n), or on st(0) and temporary data. + The destination must be one of the source st(x). + */ +int FPU_add(FPU_REG const *b, u_char tagb, int deststnr, int control_w) +{ + FPU_REG *a = &st(0); + FPU_REG *dest = &st(deststnr); + u_char signb = getsign(b); + u_char taga = FPU_gettag0(); + u_char signa = getsign(a); + u_char saved_sign = getsign(dest); + int diff, tag, expa, expb; + + if ( !(taga | tagb) ) + { + expa = exponent(a); + expb = exponent(b); + + valid_add: + /* Both registers are valid */ + if (!(signa ^ signb)) + { + /* signs are the same */ + tag = FPU_u_add(a, b, dest, control_w, signa, expa, expb); + } + else + { + /* The signs are different, so do a subtraction */ + diff = expa - expb; + if (!diff) + { + diff = a->sigh - b->sigh; /* This works only if the ms bits + are identical. */ + if (!diff) + { + diff = a->sigl > b->sigl; + if (!diff) + diff = -(a->sigl < b->sigl); + } + } + + if (diff > 0) + { + tag = FPU_u_sub(a, b, dest, control_w, signa, expa, expb); + } + else if ( diff < 0 ) + { + tag = FPU_u_sub(b, a, dest, control_w, signb, expb, expa); + } + else + { + FPU_copy_to_regi(&CONST_Z, TAG_Zero, deststnr); + /* sign depends upon rounding mode */ + setsign(dest, ((control_w & CW_RC) != RC_DOWN) + ? SIGN_POS : SIGN_NEG); + return TAG_Zero; + } + } + + if ( tag < 0 ) + { + setsign(dest, saved_sign); + return tag; + } + FPU_settagi(deststnr, tag); + return tag; + } + + if ( taga == TAG_Special ) + taga = FPU_Special(a); + if ( tagb == TAG_Special ) + tagb = FPU_Special(b); + + if ( ((taga == TAG_Valid) && (tagb == TW_Denormal)) + || ((taga == TW_Denormal) && (tagb == TAG_Valid)) + || ((taga == TW_Denormal) && (tagb == TW_Denormal)) ) + { + FPU_REG x, y; + + if ( denormal_operand() < 0 ) + return FPU_Exception; + + FPU_to_exp16(a, &x); + FPU_to_exp16(b, &y); + a = &x; + b = &y; + expa = exponent16(a); + expb = exponent16(b); + goto valid_add; + } + + if ( (taga == TW_NaN) || (tagb == TW_NaN) ) + { + if ( deststnr == 0 ) + return real_2op_NaN(b, tagb, deststnr, a); + else + return real_2op_NaN(a, taga, deststnr, a); + } + + return add_sub_specials(a, taga, signa, b, tagb, signb, + dest, deststnr, control_w); +} + + +/* Subtract b from a. (a-b) -> dest */ +int FPU_sub(int flags, int rm, int control_w) +{ + FPU_REG const *a, *b; + FPU_REG *dest; + u_char taga, tagb, signa, signb, saved_sign, sign; + int diff, tag = 0, expa, expb, deststnr; + + a = &st(0); + taga = FPU_gettag0(); + + deststnr = 0; + if ( flags & LOADED ) + { + b = (FPU_REG *)rm; + tagb = flags & 0x0f; + } + else + { + b = &st(rm); + tagb = FPU_gettagi(rm); + + if ( flags & DEST_RM ) + deststnr = rm; + } + + signa = getsign(a); + signb = getsign(b); + + if ( flags & REV ) + { + signa ^= SIGN_NEG; + signb ^= SIGN_NEG; + } + + dest = &st(deststnr); + saved_sign = getsign(dest); + + if ( !(taga | tagb) ) + { + expa = exponent(a); + expb = exponent(b); + + valid_subtract: + /* Both registers are valid */ + + diff = expa - expb; + + if (!diff) + { + diff = a->sigh - b->sigh; /* Works only if ms bits are identical */ + if (!diff) + { + diff = a->sigl > b->sigl; + if (!diff) + diff = -(a->sigl < b->sigl); + } + } + + switch ( (((int)signa)*2 + signb) / SIGN_NEG ) + { + case 0: /* P - P */ + case 3: /* N - N */ + if (diff > 0) + { + /* |a| > |b| */ + tag = FPU_u_sub(a, b, dest, control_w, signa, expa, expb); + } + else if ( diff == 0 ) + { + FPU_copy_to_regi(&CONST_Z, TAG_Zero, deststnr); + + /* sign depends upon rounding mode */ + setsign(dest, ((control_w & CW_RC) != RC_DOWN) + ? SIGN_POS : SIGN_NEG); + return TAG_Zero; + } + else + { + sign = signa ^ SIGN_NEG; + tag = FPU_u_sub(b, a, dest, control_w, sign, expb, expa); + } + break; + case 1: /* P - N */ + tag = FPU_u_add(a, b, dest, control_w, SIGN_POS, expa, expb); + break; + case 2: /* N - P */ + tag = FPU_u_add(a, b, dest, control_w, SIGN_NEG, expa, expb); + break; +#ifdef PARANOID + default: + EXCEPTION(EX_INTERNAL|0x111); + return -1; +#endif + } + if ( tag < 0 ) + { + setsign(dest, saved_sign); + return tag; + } + FPU_settagi(deststnr, tag); + return tag; + } + + if ( taga == TAG_Special ) + taga = FPU_Special(a); + if ( tagb == TAG_Special ) + tagb = FPU_Special(b); + + if ( ((taga == TAG_Valid) && (tagb == TW_Denormal)) + || ((taga == TW_Denormal) && (tagb == TAG_Valid)) + || ((taga == TW_Denormal) && (tagb == TW_Denormal)) ) + { + FPU_REG x, y; + + if ( denormal_operand() < 0 ) + return FPU_Exception; + + FPU_to_exp16(a, &x); + FPU_to_exp16(b, &y); + a = &x; + b = &y; + expa = exponent16(a); + expb = exponent16(b); + + goto valid_subtract; + } + + if ( (taga == TW_NaN) || (tagb == TW_NaN) ) + { + FPU_REG const *d1, *d2; + if ( flags & REV ) + { + d1 = b; + d2 = a; + } + else + { + d1 = a; + d2 = b; + } + if ( flags & LOADED ) + return real_2op_NaN(b, tagb, deststnr, d1); + if ( flags & DEST_RM ) + return real_2op_NaN(a, taga, deststnr, d2); + else + return real_2op_NaN(b, tagb, deststnr, d2); + } + + return add_sub_specials(a, taga, signa, b, tagb, signb ^ SIGN_NEG, + dest, deststnr, control_w); +} + + +static +int add_sub_specials(FPU_REG const *a, u_char taga, u_char signa, + FPU_REG const *b, u_char tagb, u_char signb, + FPU_REG *dest, int deststnr, int control_w) +{ + if ( ((taga == TW_Denormal) || (tagb == TW_Denormal)) + && (denormal_operand() < 0) ) + return FPU_Exception; + + if (taga == TAG_Zero) + { + if (tagb == TAG_Zero) + { + /* Both are zero, result will be zero. */ + u_char different_signs = signa ^ signb; + + FPU_copy_to_regi(a, TAG_Zero, deststnr); + if ( different_signs ) + { + /* Signs are different. */ + /* Sign of answer depends upon rounding mode. */ + setsign(dest, ((control_w & CW_RC) != RC_DOWN) + ? SIGN_POS : SIGN_NEG); + } + else + setsign(dest, signa); /* signa may differ from the sign of a. */ + return TAG_Zero; + } + else + { + reg_copy(b, dest); + if ( (tagb == TW_Denormal) && (b->sigh & 0x80000000) ) + { + /* A pseudoDenormal, convert it. */ + addexponent(dest, 1); + tagb = TAG_Valid; + } + else if ( tagb > TAG_Empty ) + tagb = TAG_Special; + setsign(dest, signb); /* signb may differ from the sign of b. */ + FPU_settagi(deststnr, tagb); + return tagb; + } + } + else if (tagb == TAG_Zero) + { + reg_copy(a, dest); + if ( (taga == TW_Denormal) && (a->sigh & 0x80000000) ) + { + /* A pseudoDenormal */ + addexponent(dest, 1); + taga = TAG_Valid; + } + else if ( taga > TAG_Empty ) + taga = TAG_Special; + setsign(dest, signa); /* signa may differ from the sign of a. */ + FPU_settagi(deststnr, taga); + return taga; + } + else if (taga == TW_Infinity) + { + if ( (tagb != TW_Infinity) || (signa == signb) ) + { + FPU_copy_to_regi(a, TAG_Special, deststnr); + setsign(dest, signa); /* signa may differ from the sign of a. */ + return taga; + } + /* Infinity-Infinity is undefined. */ + return arith_invalid(deststnr); + } + else if (tagb == TW_Infinity) + { + FPU_copy_to_regi(b, TAG_Special, deststnr); + setsign(dest, signb); /* signb may differ from the sign of b. */ + return tagb; + } + +#ifdef PARANOID + EXCEPTION(EX_INTERNAL|0x101); +#endif + + return FPU_Exception; +} + diff --git a/src/wraith/math-emu/reg_compare.c b/src/wraith/math-emu/reg_compare.c new file mode 100644 index 000000000..f37c5b5a3 --- /dev/null +++ b/src/wraith/math-emu/reg_compare.c @@ -0,0 +1,381 @@ +/*---------------------------------------------------------------------------+ + | reg_compare.c | + | | + | Compare two floating point registers | + | | + | Copyright (C) 1992,1993,1994,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | compare() is the core FPU_REG comparison function | + +---------------------------------------------------------------------------*/ + +#include "fpu_system.h" +#include "exception.h" +#include "fpu_emu.h" +#include "control_w.h" +#include "status_w.h" + + +static int compare(FPU_REG const *b, int tagb) +{ + int diff, exp0, expb; + u_char st0_tag; + FPU_REG *st0_ptr; + FPU_REG x, y; + u_char st0_sign, signb = getsign(b); + + st0_ptr = &st(0); + st0_tag = FPU_gettag0(); + st0_sign = getsign(st0_ptr); + + if ( tagb == TAG_Special ) + tagb = FPU_Special(b); + if ( st0_tag == TAG_Special ) + st0_tag = FPU_Special(st0_ptr); + + if ( ((st0_tag != TAG_Valid) && (st0_tag != TW_Denormal)) + || ((tagb != TAG_Valid) && (tagb != TW_Denormal)) ) + { + if ( st0_tag == TAG_Zero ) + { + if ( tagb == TAG_Zero ) return COMP_A_eq_B; + if ( tagb == TAG_Valid ) + return ((signb == SIGN_POS) ? COMP_A_lt_B : COMP_A_gt_B); + if ( tagb == TW_Denormal ) + return ((signb == SIGN_POS) ? COMP_A_lt_B : COMP_A_gt_B) + | COMP_Denormal; + } + else if ( tagb == TAG_Zero ) + { + if ( st0_tag == TAG_Valid ) + return ((st0_sign == SIGN_POS) ? COMP_A_gt_B : COMP_A_lt_B); + if ( st0_tag == TW_Denormal ) + return ((st0_sign == SIGN_POS) ? COMP_A_gt_B : COMP_A_lt_B) + | COMP_Denormal; + } + + if ( st0_tag == TW_Infinity ) + { + if ( (tagb == TAG_Valid) || (tagb == TAG_Zero) ) + return ((st0_sign == SIGN_POS) ? COMP_A_gt_B : COMP_A_lt_B); + else if ( tagb == TW_Denormal ) + return ((st0_sign == SIGN_POS) ? COMP_A_gt_B : COMP_A_lt_B) + | COMP_Denormal; + else if ( tagb == TW_Infinity ) + { + /* The 80486 book says that infinities can be equal! */ + return (st0_sign == signb) ? COMP_A_eq_B : + ((st0_sign == SIGN_POS) ? COMP_A_gt_B : COMP_A_lt_B); + } + /* Fall through to the NaN code */ + } + else if ( tagb == TW_Infinity ) + { + if ( (st0_tag == TAG_Valid) || (st0_tag == TAG_Zero) ) + return ((signb == SIGN_POS) ? COMP_A_lt_B : COMP_A_gt_B); + if ( st0_tag == TW_Denormal ) + return ((signb == SIGN_POS) ? COMP_A_lt_B : COMP_A_gt_B) + | COMP_Denormal; + /* Fall through to the NaN code */ + } + + /* The only possibility now should be that one of the arguments + is a NaN */ + if ( (st0_tag == TW_NaN) || (tagb == TW_NaN) ) + { + int signalling = 0, unsupported = 0; + if ( st0_tag == TW_NaN ) + { + signalling = (st0_ptr->sigh & 0xc0000000) == 0x80000000; + unsupported = !((exponent(st0_ptr) == EXP_OVER) + && (st0_ptr->sigh & 0x80000000)); + } + if ( tagb == TW_NaN ) + { + signalling |= (b->sigh & 0xc0000000) == 0x80000000; + unsupported |= !((exponent(b) == EXP_OVER) + && (b->sigh & 0x80000000)); + } + if ( signalling || unsupported ) + return COMP_No_Comp | COMP_SNaN | COMP_NaN; + else + /* Neither is a signaling NaN */ + return COMP_No_Comp | COMP_NaN; + } + + EXCEPTION(EX_Invalid); + } + + if (st0_sign != signb) + { + return ((st0_sign == SIGN_POS) ? COMP_A_gt_B : COMP_A_lt_B) + | ( ((st0_tag == TW_Denormal) || (tagb == TW_Denormal)) ? + COMP_Denormal : 0); + } + + if ( (st0_tag == TW_Denormal) || (tagb == TW_Denormal) ) + { + FPU_to_exp16(st0_ptr, &x); + FPU_to_exp16(b, &y); + st0_ptr = &x; + b = &y; + exp0 = exponent16(st0_ptr); + expb = exponent16(b); + } + else + { + exp0 = exponent(st0_ptr); + expb = exponent(b); + } + +#ifdef PARANOID + if (!(st0_ptr->sigh & 0x80000000)) EXCEPTION(EX_Invalid); + if (!(b->sigh & 0x80000000)) EXCEPTION(EX_Invalid); +#endif /* PARANOID */ + + diff = exp0 - expb; + if ( diff == 0 ) + { + diff = st0_ptr->sigh - b->sigh; /* Works only if ms bits are + identical */ + if ( diff == 0 ) + { + diff = st0_ptr->sigl > b->sigl; + if ( diff == 0 ) + diff = -(st0_ptr->sigl < b->sigl); + } + } + + if ( diff > 0 ) + { + return ((st0_sign == SIGN_POS) ? COMP_A_gt_B : COMP_A_lt_B) + | ( ((st0_tag == TW_Denormal) || (tagb == TW_Denormal)) ? + COMP_Denormal : 0); + } + if ( diff < 0 ) + { + return ((st0_sign == SIGN_POS) ? COMP_A_lt_B : COMP_A_gt_B) + | ( ((st0_tag == TW_Denormal) || (tagb == TW_Denormal)) ? + COMP_Denormal : 0); + } + + return COMP_A_eq_B + | ( ((st0_tag == TW_Denormal) || (tagb == TW_Denormal)) ? + COMP_Denormal : 0); + +} + + +/* This function requires that st(0) is not empty */ +int FPU_compare_st_data(FPU_REG const *loaded_data, u_char loaded_tag) +{ + int f = 0, c; + + c = compare(loaded_data, loaded_tag); + + if (c & COMP_NaN) + { + EXCEPTION(EX_Invalid); + f = SW_C3 | SW_C2 | SW_C0; + } + else + switch (c & 7) + { + case COMP_A_lt_B: + f = SW_C0; + break; + case COMP_A_eq_B: + f = SW_C3; + break; + case COMP_A_gt_B: + f = 0; + break; + case COMP_No_Comp: + f = SW_C3 | SW_C2 | SW_C0; + break; +#ifdef PARANOID + default: + EXCEPTION(EX_INTERNAL|0x121); + f = SW_C3 | SW_C2 | SW_C0; + break; +#endif /* PARANOID */ + } + setcc(f); + if (c & COMP_Denormal) + { + return denormal_operand() < 0; + } + return 0; +} + + +static int compare_st_st(int nr) +{ + int f = 0, c; + FPU_REG *st_ptr; + + if ( !NOT_EMPTY(0) || !NOT_EMPTY(nr) ) + { + setcc(SW_C3 | SW_C2 | SW_C0); + /* Stack fault */ + EXCEPTION(EX_StackUnder); + return !(control_word & CW_Invalid); + } + + st_ptr = &st(nr); + c = compare(st_ptr, FPU_gettagi(nr)); + if (c & COMP_NaN) + { + setcc(SW_C3 | SW_C2 | SW_C0); + EXCEPTION(EX_Invalid); + return !(control_word & CW_Invalid); + } + else + switch (c & 7) + { + case COMP_A_lt_B: + f = SW_C0; + break; + case COMP_A_eq_B: + f = SW_C3; + break; + case COMP_A_gt_B: + f = 0; + break; + case COMP_No_Comp: + f = SW_C3 | SW_C2 | SW_C0; + break; +#ifdef PARANOID + default: + EXCEPTION(EX_INTERNAL|0x122); + f = SW_C3 | SW_C2 | SW_C0; + break; +#endif /* PARANOID */ + } + setcc(f); + if (c & COMP_Denormal) + { + return denormal_operand() < 0; + } + return 0; +} + + +static int compare_u_st_st(int nr) +{ + int f = 0, c; + FPU_REG *st_ptr; + + if ( !NOT_EMPTY(0) || !NOT_EMPTY(nr) ) + { + setcc(SW_C3 | SW_C2 | SW_C0); + /* Stack fault */ + EXCEPTION(EX_StackUnder); + return !(control_word & CW_Invalid); + } + + st_ptr = &st(nr); + c = compare(st_ptr, FPU_gettagi(nr)); + if (c & COMP_NaN) + { + setcc(SW_C3 | SW_C2 | SW_C0); + if (c & COMP_SNaN) /* This is the only difference between + un-ordered and ordinary comparisons */ + { + EXCEPTION(EX_Invalid); + return !(control_word & CW_Invalid); + } + return 0; + } + else + switch (c & 7) + { + case COMP_A_lt_B: + f = SW_C0; + break; + case COMP_A_eq_B: + f = SW_C3; + break; + case COMP_A_gt_B: + f = 0; + break; + case COMP_No_Comp: + f = SW_C3 | SW_C2 | SW_C0; + break; +#ifdef PARANOID + default: + EXCEPTION(EX_INTERNAL|0x123); + f = SW_C3 | SW_C2 | SW_C0; + break; +#endif /* PARANOID */ + } + setcc(f); + if (c & COMP_Denormal) + { + return denormal_operand() < 0; + } + return 0; +} + +/*---------------------------------------------------------------------------*/ + +void fcom_st(void) +{ + /* fcom st(i) */ + compare_st_st(FPU_rm); +} + + +void fcompst(void) +{ + /* fcomp st(i) */ + if ( !compare_st_st(FPU_rm) ) + FPU_pop(); +} + + +void fcompp(void) +{ + /* fcompp */ + if (FPU_rm != 1) + { + FPU_illegal(); + return; + } + if ( !compare_st_st(1) ) + poppop(); +} + + +void fucom_(void) +{ + /* fucom st(i) */ + compare_u_st_st(FPU_rm); + +} + + +void fucomp(void) +{ + /* fucomp st(i) */ + if ( !compare_u_st_st(FPU_rm) ) + FPU_pop(); +} + + +void fucompp(void) +{ + /* fucompp */ + if (FPU_rm == 1) + { + if ( !compare_u_st_st(1) ) + poppop(); + } + else + FPU_illegal(); +} diff --git a/src/wraith/math-emu/reg_constant.c b/src/wraith/math-emu/reg_constant.c new file mode 100644 index 000000000..ffbfebd51 --- /dev/null +++ b/src/wraith/math-emu/reg_constant.c @@ -0,0 +1,118 @@ +/*---------------------------------------------------------------------------+ + | reg_constant.c | + | | + | All of the constant FPU_REGs | + | | + | Copyright (C) 1992,1993,1994,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +#include "fpu_system.h" +#include "fpu_emu.h" +#include "status_w.h" +#include "reg_constant.h" +#include "control_w.h" + + +#define MAKE_REG(s,e,l,h) { l, h, \ + ((EXTENDED_Ebias+(e)) | ((SIGN_##s != 0)*0x8000)) } + +FPU_REG const CONST_1 = MAKE_REG(POS, 0, 0x00000000, 0x80000000); +FPU_REG const CONST_2 = MAKE_REG(POS, 1, 0x00000000, 0x80000000); +FPU_REG const CONST_HALF = MAKE_REG(POS, -1, 0x00000000, 0x80000000); +FPU_REG const CONST_L2T = MAKE_REG(POS, 1, 0xcd1b8afe, 0xd49a784b); +FPU_REG const CONST_L2E = MAKE_REG(POS, 0, 0x5c17f0bc, 0xb8aa3b29); +FPU_REG const CONST_PI = MAKE_REG(POS, 1, 0x2168c235, 0xc90fdaa2); +FPU_REG const CONST_PI2 = MAKE_REG(POS, 0, 0x2168c235, 0xc90fdaa2); +FPU_REG const CONST_PI4 = MAKE_REG(POS, -1, 0x2168c235, 0xc90fdaa2); +FPU_REG const CONST_LG2 = MAKE_REG(POS, -2, 0xfbcff799, 0x9a209a84); +FPU_REG const CONST_LN2 = MAKE_REG(POS, -1, 0xd1cf79ac, 0xb17217f7); + +/* Extra bits to take pi/2 to more than 128 bits precision. */ +FPU_REG const CONST_PI2extra = MAKE_REG(NEG, -66, + 0xfc8f8cbb, 0xece675d1); + +/* Only the sign (and tag) is used in internal zeroes */ +FPU_REG const CONST_Z = MAKE_REG(POS, EXP_UNDER, 0x0, 0x0); + +/* Only the sign and significand (and tag) are used in internal NaNs */ +/* The 80486 never generates one of these +FPU_REG const CONST_SNAN = MAKE_REG(POS, EXP_OVER, 0x00000001, 0x80000000); + */ +/* This is the real indefinite QNaN */ +FPU_REG const CONST_QNaN = MAKE_REG(NEG, EXP_OVER, 0x00000000, 0xC0000000); + +/* Only the sign (and tag) is used in internal infinities */ +FPU_REG const CONST_INF = MAKE_REG(POS, EXP_OVER, 0x00000000, 0x80000000); + + +static void fld_const(FPU_REG const *c, int adj, u_char tag) +{ + FPU_REG *st_new_ptr; + + if ( STACK_OVERFLOW ) + { + FPU_stack_overflow(); + return; + } + push(); + reg_copy(c, st_new_ptr); + st_new_ptr->sigl += adj; /* For all our fldxxx constants, we don't need to + borrow or carry. */ + FPU_settag0(tag); + clear_C1(); +} + +/* A fast way to find out whether x is one of RC_DOWN or RC_CHOP + (and not one of RC_RND or RC_UP). + */ +#define DOWN_OR_CHOP(x) (x & RC_DOWN) + +static void fld1(int rc) +{ + fld_const(&CONST_1, 0, TAG_Valid); +} + +static void fldl2t(int rc) +{ + fld_const(&CONST_L2T, (rc == RC_UP) ? 1 : 0, TAG_Valid); +} + +static void fldl2e(int rc) +{ + fld_const(&CONST_L2E, DOWN_OR_CHOP(rc) ? -1 : 0, TAG_Valid); +} + +static void fldpi(int rc) +{ + fld_const(&CONST_PI, DOWN_OR_CHOP(rc) ? -1 : 0, TAG_Valid); +} + +static void fldlg2(int rc) +{ + fld_const(&CONST_LG2, DOWN_OR_CHOP(rc) ? -1 : 0, TAG_Valid); +} + +static void fldln2(int rc) +{ + fld_const(&CONST_LN2, DOWN_OR_CHOP(rc) ? -1 : 0, TAG_Valid); +} + +static void fldz(int rc) +{ + fld_const(&CONST_Z, 0, TAG_Zero); +} + +typedef void (*FUNC_RC)(int); + +static FUNC_RC constants_table[] = { + fld1, fldl2t, fldl2e, fldpi, fldlg2, fldln2, fldz, (FUNC_RC)FPU_illegal +}; + +void fconst(void) +{ + (constants_table[FPU_rm])(control_word & CW_RC); +} diff --git a/src/wraith/math-emu/reg_constant.h b/src/wraith/math-emu/reg_constant.h new file mode 100644 index 000000000..09f13f777 --- /dev/null +++ b/src/wraith/math-emu/reg_constant.h @@ -0,0 +1,31 @@ +/*---------------------------------------------------------------------------+ + | reg_constant.h | + | | + | Copyright (C) 1992 W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@vaxc.cc.monash.edu.au | + | | + +---------------------------------------------------------------------------*/ + +#ifndef _REG_CONSTANT_H_ +#define _REG_CONSTANT_H_ + +#include "fpu_emu.h" + +extern FPU_REG const CONST_1; +extern FPU_REG const CONST_2; +extern FPU_REG const CONST_HALF; +extern FPU_REG const CONST_L2T; +extern FPU_REG const CONST_L2E; +extern FPU_REG const CONST_PI; +extern FPU_REG const CONST_PI2; +extern FPU_REG const CONST_PI2extra; +extern FPU_REG const CONST_PI4; +extern FPU_REG const CONST_LG2; +extern FPU_REG const CONST_LN2; +extern FPU_REG const CONST_Z; +extern FPU_REG const CONST_PINF; +extern FPU_REG const CONST_INF; +extern FPU_REG const CONST_MINF; +extern FPU_REG const CONST_QNaN; + +#endif /* _REG_CONSTANT_H_ */ diff --git a/src/wraith/math-emu/reg_convert.c b/src/wraith/math-emu/reg_convert.c new file mode 100644 index 000000000..45a258752 --- /dev/null +++ b/src/wraith/math-emu/reg_convert.c @@ -0,0 +1,53 @@ +/*---------------------------------------------------------------------------+ + | reg_convert.c | + | | + | Convert register representation. | + | | + | Copyright (C) 1992,1993,1994,1996,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +#include "exception.h" +#include "fpu_emu.h" + + +int FPU_to_exp16(FPU_REG const *a, FPU_REG *x) +{ + int sign = getsign(a); + + *(long long *)&(x->sigl) = *(const long long *)&(a->sigl); + + /* Set up the exponent as a 16 bit quantity. */ + setexponent16(x, exponent(a)); + + if ( exponent16(x) == EXP_UNDER ) + { + /* The number is a de-normal or pseudodenormal. */ + /* We only deal with the significand and exponent. */ + + if (x->sigh & 0x80000000) + { + /* Is a pseudodenormal. */ + /* This is non-80486 behaviour because the number + loses its 'denormal' identity. */ + addexponent(x, 1); + } + else + { + /* Is a denormal. */ + addexponent(x, 1); + FPU_normalize_nuo(x); + } + } + + if ( !(x->sigh & 0x80000000) ) + { + EXCEPTION(EX_INTERNAL | 0x180); + } + + return sign; +} + diff --git a/src/wraith/math-emu/reg_divide.c b/src/wraith/math-emu/reg_divide.c new file mode 100644 index 000000000..5cee7ff92 --- /dev/null +++ b/src/wraith/math-emu/reg_divide.c @@ -0,0 +1,207 @@ +/*---------------------------------------------------------------------------+ + | reg_divide.c | + | | + | Divide one FPU_REG by another and put the result in a destination FPU_REG.| + | | + | Copyright (C) 1996 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@jacobi.maths.monash.edu.au | + | | + | Return value is the tag of the answer, or-ed with FPU_Exception if | + | one was raised, or -1 on internal error. | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | The destination may be any FPU_REG, including one of the source FPU_REGs. | + +---------------------------------------------------------------------------*/ + +#include "exception.h" +#include "reg_constant.h" +#include "fpu_emu.h" +#include "fpu_system.h" + +/* + Divide one register by another and put the result into a third register. + */ +int FPU_div(int flags, int rm, int control_w) +{ + FPU_REG x, y; + FPU_REG const *a, *b, *st0_ptr, *st_ptr; + FPU_REG *dest; + u_char taga, tagb, signa, signb, sign, saved_sign; + int tag, deststnr; + + if ( flags & DEST_RM ) + deststnr = rm; + else + deststnr = 0; + + if ( flags & REV ) + { + b = &st(0); + st0_ptr = b; + tagb = FPU_gettag0(); + if ( flags & LOADED ) + { + a = (FPU_REG *)rm; + taga = flags & 0x0f; + } + else + { + a = &st(rm); + st_ptr = a; + taga = FPU_gettagi(rm); + } + } + else + { + a = &st(0); + st0_ptr = a; + taga = FPU_gettag0(); + if ( flags & LOADED ) + { + b = (FPU_REG *)rm; + tagb = flags & 0x0f; + } + else + { + b = &st(rm); + st_ptr = b; + tagb = FPU_gettagi(rm); + } + } + + signa = getsign(a); + signb = getsign(b); + + sign = signa ^ signb; + + dest = &st(deststnr); + saved_sign = getsign(dest); + + if ( !(taga | tagb) ) + { + /* Both regs Valid, this should be the most common case. */ + reg_copy(a, &x); + reg_copy(b, &y); + setpositive(&x); + setpositive(&y); + tag = FPU_u_div(&x, &y, dest, control_w, sign); + + if ( tag < 0 ) + return tag; + + FPU_settagi(deststnr, tag); + return tag; + } + + if ( taga == TAG_Special ) + taga = FPU_Special(a); + if ( tagb == TAG_Special ) + tagb = FPU_Special(b); + + if ( ((taga == TAG_Valid) && (tagb == TW_Denormal)) + || ((taga == TW_Denormal) && (tagb == TAG_Valid)) + || ((taga == TW_Denormal) && (tagb == TW_Denormal)) ) + { + if ( denormal_operand() < 0 ) + return FPU_Exception; + + FPU_to_exp16(a, &x); + FPU_to_exp16(b, &y); + tag = FPU_u_div(&x, &y, dest, control_w, sign); + if ( tag < 0 ) + return tag; + + FPU_settagi(deststnr, tag); + return tag; + } + else if ( (taga <= TW_Denormal) && (tagb <= TW_Denormal) ) + { + if ( tagb != TAG_Zero ) + { + /* Want to find Zero/Valid */ + if ( tagb == TW_Denormal ) + { + if ( denormal_operand() < 0 ) + return FPU_Exception; + } + + /* The result is zero. */ + FPU_copy_to_regi(&CONST_Z, TAG_Zero, deststnr); + setsign(dest, sign); + return TAG_Zero; + } + /* We have an exception condition, either 0/0 or Valid/Zero. */ + if ( taga == TAG_Zero ) + { + /* 0/0 */ + return arith_invalid(deststnr); + } + /* Valid/Zero */ + return FPU_divide_by_zero(deststnr, sign); + } + /* Must have infinities, NaNs, etc */ + else if ( (taga == TW_NaN) || (tagb == TW_NaN) ) + { + if ( flags & LOADED ) + return real_2op_NaN((FPU_REG *)rm, flags & 0x0f, 0, st0_ptr); + + if ( flags & DEST_RM ) + { + int tag; + tag = FPU_gettag0(); + if ( tag == TAG_Special ) + tag = FPU_Special(st0_ptr); + return real_2op_NaN(st0_ptr, tag, rm, (flags & REV) ? st0_ptr : &st(rm)); + } + else + { + int tag; + tag = FPU_gettagi(rm); + if ( tag == TAG_Special ) + tag = FPU_Special(&st(rm)); + return real_2op_NaN(&st(rm), tag, 0, (flags & REV) ? st0_ptr : &st(rm)); + } + } + else if (taga == TW_Infinity) + { + if (tagb == TW_Infinity) + { + /* infinity/infinity */ + return arith_invalid(deststnr); + } + else + { + /* tagb must be Valid or Zero */ + if ( (tagb == TW_Denormal) && (denormal_operand() < 0) ) + return FPU_Exception; + + /* Infinity divided by Zero or Valid does + not raise and exception, but returns Infinity */ + FPU_copy_to_regi(a, TAG_Special, deststnr); + setsign(dest, sign); + return taga; + } + } + else if (tagb == TW_Infinity) + { + if ( (taga == TW_Denormal) && (denormal_operand() < 0) ) + return FPU_Exception; + + /* The result is zero. */ + FPU_copy_to_regi(&CONST_Z, TAG_Zero, deststnr); + setsign(dest, sign); + return TAG_Zero; + } +#ifdef PARANOID + else + { + EXCEPTION(EX_INTERNAL|0x102); + return FPU_Exception; + } +#endif /* PARANOID */ + + return 0; +} diff --git a/src/wraith/math-emu/reg_ld_str.c b/src/wraith/math-emu/reg_ld_str.c new file mode 100644 index 000000000..699fe331c --- /dev/null +++ b/src/wraith/math-emu/reg_ld_str.c @@ -0,0 +1,1370 @@ +/*---------------------------------------------------------------------------+ + | reg_ld_str.c | + | | + | All of the functions which transfer data between user memory and FPU_REGs.| + | | + | Copyright (C) 1992,1993,1994,1996,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | Note: | + | The file contains code which accesses user memory. | + | Emulator static data may change when user memory is accessed, due to | + | other processes using the emulator while swapping is in progress. | + +---------------------------------------------------------------------------*/ + +#include "fpu_emu.h" + +#include + +#include "fpu_system.h" +#include "exception.h" +#include "reg_constant.h" +#include "control_w.h" +#include "status_w.h" + + +#define DOUBLE_Emax 1023 /* largest valid exponent */ +#define DOUBLE_Ebias 1023 +#define DOUBLE_Emin (-1022) /* smallest valid exponent */ + +#define SINGLE_Emax 127 /* largest valid exponent */ +#define SINGLE_Ebias 127 +#define SINGLE_Emin (-126) /* smallest valid exponent */ + + +static u_char normalize_no_excep(FPU_REG *r, int exp, int sign) +{ + u_char tag; + + setexponent16(r, exp); + + tag = FPU_normalize_nuo(r); + stdexp(r); + if ( sign ) + setnegative(r); + + return tag; +} + + +int FPU_tagof(FPU_REG *ptr) +{ + int exp; + + exp = exponent16(ptr) & 0x7fff; + if ( exp == 0 ) + { + if ( !(ptr->sigh | ptr->sigl) ) + { + return TAG_Zero; + } + /* The number is a de-normal or pseudodenormal. */ + return TAG_Special; + } + + if ( exp == 0x7fff ) + { + /* Is an Infinity, a NaN, or an unsupported data type. */ + return TAG_Special; + } + + if ( !(ptr->sigh & 0x80000000) ) + { + /* Unsupported data type. */ + /* Valid numbers have the ms bit set to 1. */ + /* Unnormal. */ + return TAG_Special; + } + + return TAG_Valid; +} + + +/* Get a long double from user memory */ +int FPU_load_extended(long double __user *s, int stnr) +{ + FPU_REG *sti_ptr = &st(stnr); + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ, s, 10); + __copy_from_user(sti_ptr, s, 10); + RE_ENTRANT_CHECK_ON; + + return FPU_tagof(sti_ptr); +} + + +/* Get a double from user memory */ +int FPU_load_double(double __user *dfloat, FPU_REG *loaded_data) +{ + int exp, tag, negative; + unsigned m64, l64; + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ, dfloat, 8); + FPU_get_user(m64, 1 + (unsigned long __user *) dfloat); + FPU_get_user(l64, (unsigned long __user *) dfloat); + RE_ENTRANT_CHECK_ON; + + negative = (m64 & 0x80000000) ? SIGN_Negative : SIGN_Positive; + exp = ((m64 & 0x7ff00000) >> 20) - DOUBLE_Ebias + EXTENDED_Ebias; + m64 &= 0xfffff; + if ( exp > DOUBLE_Emax + EXTENDED_Ebias ) + { + /* Infinity or NaN */ + if ((m64 == 0) && (l64 == 0)) + { + /* +- infinity */ + loaded_data->sigh = 0x80000000; + loaded_data->sigl = 0x00000000; + exp = EXP_Infinity + EXTENDED_Ebias; + tag = TAG_Special; + } + else + { + /* Must be a signaling or quiet NaN */ + exp = EXP_NaN + EXTENDED_Ebias; + loaded_data->sigh = (m64 << 11) | 0x80000000; + loaded_data->sigh |= l64 >> 21; + loaded_data->sigl = l64 << 11; + tag = TAG_Special; /* The calling function must look for NaNs */ + } + } + else if ( exp < DOUBLE_Emin + EXTENDED_Ebias ) + { + /* Zero or de-normal */ + if ((m64 == 0) && (l64 == 0)) + { + /* Zero */ + reg_copy(&CONST_Z, loaded_data); + exp = 0; + tag = TAG_Zero; + } + else + { + /* De-normal */ + loaded_data->sigh = m64 << 11; + loaded_data->sigh |= l64 >> 21; + loaded_data->sigl = l64 << 11; + + return normalize_no_excep(loaded_data, DOUBLE_Emin, negative) + | (denormal_operand() < 0 ? FPU_Exception : 0); + } + } + else + { + loaded_data->sigh = (m64 << 11) | 0x80000000; + loaded_data->sigh |= l64 >> 21; + loaded_data->sigl = l64 << 11; + + tag = TAG_Valid; + } + + setexponent16(loaded_data, exp | negative); + + return tag; +} + + +/* Get a float from user memory */ +int FPU_load_single(float __user *single, FPU_REG *loaded_data) +{ + unsigned m32; + int exp, tag, negative; + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ, single, 4); + FPU_get_user(m32, (unsigned long __user *) single); + RE_ENTRANT_CHECK_ON; + + negative = (m32 & 0x80000000) ? SIGN_Negative : SIGN_Positive; + + if (!(m32 & 0x7fffffff)) + { + /* Zero */ + reg_copy(&CONST_Z, loaded_data); + addexponent(loaded_data, negative); + return TAG_Zero; + } + exp = ((m32 & 0x7f800000) >> 23) - SINGLE_Ebias + EXTENDED_Ebias; + m32 = (m32 & 0x7fffff) << 8; + if ( exp < SINGLE_Emin + EXTENDED_Ebias ) + { + /* De-normals */ + loaded_data->sigh = m32; + loaded_data->sigl = 0; + + return normalize_no_excep(loaded_data, SINGLE_Emin, negative) + | (denormal_operand() < 0 ? FPU_Exception : 0); + } + else if ( exp > SINGLE_Emax + EXTENDED_Ebias ) + { + /* Infinity or NaN */ + if ( m32 == 0 ) + { + /* +- infinity */ + loaded_data->sigh = 0x80000000; + loaded_data->sigl = 0x00000000; + exp = EXP_Infinity + EXTENDED_Ebias; + tag = TAG_Special; + } + else + { + /* Must be a signaling or quiet NaN */ + exp = EXP_NaN + EXTENDED_Ebias; + loaded_data->sigh = m32 | 0x80000000; + loaded_data->sigl = 0; + tag = TAG_Special; /* The calling function must look for NaNs */ + } + } + else + { + loaded_data->sigh = m32 | 0x80000000; + loaded_data->sigl = 0; + tag = TAG_Valid; + } + + setexponent16(loaded_data, exp | negative); /* Set the sign. */ + + return tag; +} + + +/* Get a long long from user memory */ +int FPU_load_int64(long long __user *_s) +{ + long long s; + int sign; + FPU_REG *st0_ptr = &st(0); + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ, _s, 8); + copy_from_user(&s,_s,8); + RE_ENTRANT_CHECK_ON; + + if (s == 0) + { + reg_copy(&CONST_Z, st0_ptr); + return TAG_Zero; + } + + if (s > 0) + sign = SIGN_Positive; + else + { + s = -s; + sign = SIGN_Negative; + } + + significand(st0_ptr) = s; + + return normalize_no_excep(st0_ptr, 63, sign); +} + + +/* Get a long from user memory */ +int FPU_load_int32(long __user *_s, FPU_REG *loaded_data) +{ + long s; + int negative; + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ, _s, 4); + FPU_get_user(s, _s); + RE_ENTRANT_CHECK_ON; + + if (s == 0) + { reg_copy(&CONST_Z, loaded_data); return TAG_Zero; } + + if (s > 0) + negative = SIGN_Positive; + else + { + s = -s; + negative = SIGN_Negative; + } + + loaded_data->sigh = s; + loaded_data->sigl = 0; + + return normalize_no_excep(loaded_data, 31, negative); +} + + +/* Get a short from user memory */ +int FPU_load_int16(short __user *_s, FPU_REG *loaded_data) +{ + int s, negative; + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ, _s, 2); + /* Cast as short to get the sign extended. */ + FPU_get_user(s, _s); + RE_ENTRANT_CHECK_ON; + + if (s == 0) + { reg_copy(&CONST_Z, loaded_data); return TAG_Zero; } + + if (s > 0) + negative = SIGN_Positive; + else + { + s = -s; + negative = SIGN_Negative; + } + + loaded_data->sigh = s << 16; + loaded_data->sigl = 0; + + return normalize_no_excep(loaded_data, 15, negative); +} + + +/* Get a packed bcd array from user memory */ +int FPU_load_bcd(u_char __user *s) +{ + FPU_REG *st0_ptr = &st(0); + int pos; + u_char bcd; + long long l=0; + int sign; + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ, s, 10); + RE_ENTRANT_CHECK_ON; + for ( pos = 8; pos >= 0; pos--) + { + l *= 10; + RE_ENTRANT_CHECK_OFF; + FPU_get_user(bcd, s+pos); + RE_ENTRANT_CHECK_ON; + l += bcd >> 4; + l *= 10; + l += bcd & 0x0f; + } + + RE_ENTRANT_CHECK_OFF; + FPU_get_user(sign, s+9); + sign = sign & 0x80 ? SIGN_Negative : SIGN_Positive; + RE_ENTRANT_CHECK_ON; + + if ( l == 0 ) + { + reg_copy(&CONST_Z, st0_ptr); + addexponent(st0_ptr, sign); /* Set the sign. */ + return TAG_Zero; + } + else + { + significand(st0_ptr) = l; + return normalize_no_excep(st0_ptr, 63, sign); + } +} + +/*===========================================================================*/ + +/* Put a long double into user memory */ +int FPU_store_extended(FPU_REG *st0_ptr, u_char st0_tag, long double __user *d) +{ + /* + The only exception raised by an attempt to store to an + extended format is the Invalid Stack exception, i.e. + attempting to store from an empty register. + */ + + if ( st0_tag != TAG_Empty ) + { + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE, d, 10); + + FPU_put_user(st0_ptr->sigl, (unsigned long __user *) d); + FPU_put_user(st0_ptr->sigh, (unsigned long __user *) ((u_char __user *)d + 4)); + FPU_put_user(exponent16(st0_ptr), (unsigned short __user *) ((u_char __user *)d + 8)); + RE_ENTRANT_CHECK_ON; + + return 1; + } + + /* Empty register (stack underflow) */ + EXCEPTION(EX_StackUnder); + if ( control_word & CW_Invalid ) + { + /* The masked response */ + /* Put out the QNaN indefinite */ + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,d,10); + FPU_put_user(0, (unsigned long __user *) d); + FPU_put_user(0xc0000000, 1 + (unsigned long __user *) d); + FPU_put_user(0xffff, 4 + (short __user *) d); + RE_ENTRANT_CHECK_ON; + return 1; + } + else + return 0; + +} + + +/* Put a double into user memory */ +int FPU_store_double(FPU_REG *st0_ptr, u_char st0_tag, double __user *dfloat) +{ + unsigned long l[2]; + unsigned long increment = 0; /* avoid gcc warnings */ + int precision_loss; + int exp; + FPU_REG tmp; + + if ( st0_tag == TAG_Valid ) + { + reg_copy(st0_ptr, &tmp); + exp = exponent(&tmp); + + if ( exp < DOUBLE_Emin ) /* It may be a denormal */ + { + addexponent(&tmp, -DOUBLE_Emin + 52); /* largest exp to be 51 */ + + denormal_arg: + + if ( (precision_loss = FPU_round_to_int(&tmp, st0_tag)) ) + { +#ifdef PECULIAR_486 + /* Did it round to a non-denormal ? */ + /* This behaviour might be regarded as peculiar, it appears + that the 80486 rounds to the dest precision, then + converts to decide underflow. */ + if ( !((tmp.sigh == 0x00100000) && (tmp.sigl == 0) && + (st0_ptr->sigl & 0x000007ff)) ) +#endif /* PECULIAR_486 */ + { + EXCEPTION(EX_Underflow); + /* This is a special case: see sec 16.2.5.1 of + the 80486 book */ + if ( !(control_word & CW_Underflow) ) + return 0; + } + EXCEPTION(precision_loss); + if ( !(control_word & CW_Precision) ) + return 0; + } + l[0] = tmp.sigl; + l[1] = tmp.sigh; + } + else + { + if ( tmp.sigl & 0x000007ff ) + { + precision_loss = 1; + switch (control_word & CW_RC) + { + case RC_RND: + /* Rounding can get a little messy.. */ + increment = ((tmp.sigl & 0x7ff) > 0x400) | /* nearest */ + ((tmp.sigl & 0xc00) == 0xc00); /* odd -> even */ + break; + case RC_DOWN: /* towards -infinity */ + increment = signpositive(&tmp) ? 0 : tmp.sigl & 0x7ff; + break; + case RC_UP: /* towards +infinity */ + increment = signpositive(&tmp) ? tmp.sigl & 0x7ff : 0; + break; + case RC_CHOP: + increment = 0; + break; + } + + /* Truncate the mantissa */ + tmp.sigl &= 0xfffff800; + + if ( increment ) + { + if ( tmp.sigl >= 0xfffff800 ) + { + /* the sigl part overflows */ + if ( tmp.sigh == 0xffffffff ) + { + /* The sigh part overflows */ + tmp.sigh = 0x80000000; + exp++; + if (exp >= EXP_OVER) + goto overflow; + } + else + { + tmp.sigh ++; + } + tmp.sigl = 0x00000000; + } + else + { + /* We only need to increment sigl */ + tmp.sigl += 0x00000800; + } + } + } + else + precision_loss = 0; + + l[0] = (tmp.sigl >> 11) | (tmp.sigh << 21); + l[1] = ((tmp.sigh >> 11) & 0xfffff); + + if ( exp > DOUBLE_Emax ) + { + overflow: + EXCEPTION(EX_Overflow); + if ( !(control_word & CW_Overflow) ) + return 0; + set_precision_flag_up(); + if ( !(control_word & CW_Precision) ) + return 0; + + /* This is a special case: see sec 16.2.5.1 of the 80486 book */ + /* Overflow to infinity */ + l[0] = 0x00000000; /* Set to */ + l[1] = 0x7ff00000; /* + INF */ + } + else + { + if ( precision_loss ) + { + if ( increment ) + set_precision_flag_up(); + else + set_precision_flag_down(); + } + /* Add the exponent */ + l[1] |= (((exp+DOUBLE_Ebias) & 0x7ff) << 20); + } + } + } + else if (st0_tag == TAG_Zero) + { + /* Number is zero */ + l[0] = 0; + l[1] = 0; + } + else if ( st0_tag == TAG_Special ) + { + st0_tag = FPU_Special(st0_ptr); + if ( st0_tag == TW_Denormal ) + { + /* A denormal will always underflow. */ +#ifndef PECULIAR_486 + /* An 80486 is supposed to be able to generate + a denormal exception here, but... */ + /* Underflow has priority. */ + if ( control_word & CW_Underflow ) + denormal_operand(); +#endif /* PECULIAR_486 */ + reg_copy(st0_ptr, &tmp); + goto denormal_arg; + } + else if (st0_tag == TW_Infinity) + { + l[0] = 0; + l[1] = 0x7ff00000; + } + else if (st0_tag == TW_NaN) + { + /* Is it really a NaN ? */ + if ( (exponent(st0_ptr) == EXP_OVER) + && (st0_ptr->sigh & 0x80000000) ) + { + /* See if we can get a valid NaN from the FPU_REG */ + l[0] = (st0_ptr->sigl >> 11) | (st0_ptr->sigh << 21); + l[1] = ((st0_ptr->sigh >> 11) & 0xfffff); + if ( !(st0_ptr->sigh & 0x40000000) ) + { + /* It is a signalling NaN */ + EXCEPTION(EX_Invalid); + if ( !(control_word & CW_Invalid) ) + return 0; + l[1] |= (0x40000000 >> 11); + } + l[1] |= 0x7ff00000; + } + else + { + /* It is an unsupported data type */ + EXCEPTION(EX_Invalid); + if ( !(control_word & CW_Invalid) ) + return 0; + l[0] = 0; + l[1] = 0xfff80000; + } + } + } + else if ( st0_tag == TAG_Empty ) + { + /* Empty register (stack underflow) */ + EXCEPTION(EX_StackUnder); + if ( control_word & CW_Invalid ) + { + /* The masked response */ + /* Put out the QNaN indefinite */ + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,dfloat,8); + FPU_put_user(0, (unsigned long __user *) dfloat); + FPU_put_user(0xfff80000, 1 + (unsigned long __user *) dfloat); + RE_ENTRANT_CHECK_ON; + return 1; + } + else + return 0; + } + if ( getsign(st0_ptr) ) + l[1] |= 0x80000000; + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,dfloat,8); + FPU_put_user(l[0], (unsigned long __user *)dfloat); + FPU_put_user(l[1], 1 + (unsigned long __user *)dfloat); + RE_ENTRANT_CHECK_ON; + + return 1; +} + + +/* Put a float into user memory */ +int FPU_store_single(FPU_REG *st0_ptr, u_char st0_tag, float __user *single) +{ + long templ = 0; + unsigned long increment = 0; /* avoid gcc warnings */ + int precision_loss; + int exp; + FPU_REG tmp; + + if ( st0_tag == TAG_Valid ) + { + + reg_copy(st0_ptr, &tmp); + exp = exponent(&tmp); + + if ( exp < SINGLE_Emin ) + { + addexponent(&tmp, -SINGLE_Emin + 23); /* largest exp to be 22 */ + + denormal_arg: + + if ( (precision_loss = FPU_round_to_int(&tmp, st0_tag)) ) + { +#ifdef PECULIAR_486 + /* Did it round to a non-denormal ? */ + /* This behaviour might be regarded as peculiar, it appears + that the 80486 rounds to the dest precision, then + converts to decide underflow. */ + if ( !((tmp.sigl == 0x00800000) && + ((st0_ptr->sigh & 0x000000ff) || st0_ptr->sigl)) ) +#endif /* PECULIAR_486 */ + { + EXCEPTION(EX_Underflow); + /* This is a special case: see sec 16.2.5.1 of + the 80486 book */ + if ( !(control_word & CW_Underflow) ) + return 0; + } + EXCEPTION(precision_loss); + if ( !(control_word & CW_Precision) ) + return 0; + } + templ = tmp.sigl; + } + else + { + if ( tmp.sigl | (tmp.sigh & 0x000000ff) ) + { + unsigned long sigh = tmp.sigh; + unsigned long sigl = tmp.sigl; + + precision_loss = 1; + switch (control_word & CW_RC) + { + case RC_RND: + increment = ((sigh & 0xff) > 0x80) /* more than half */ + || (((sigh & 0xff) == 0x80) && sigl) /* more than half */ + || ((sigh & 0x180) == 0x180); /* round to even */ + break; + case RC_DOWN: /* towards -infinity */ + increment = signpositive(&tmp) + ? 0 : (sigl | (sigh & 0xff)); + break; + case RC_UP: /* towards +infinity */ + increment = signpositive(&tmp) + ? (sigl | (sigh & 0xff)) : 0; + break; + case RC_CHOP: + increment = 0; + break; + } + + /* Truncate part of the mantissa */ + tmp.sigl = 0; + + if (increment) + { + if ( sigh >= 0xffffff00 ) + { + /* The sigh part overflows */ + tmp.sigh = 0x80000000; + exp++; + if ( exp >= EXP_OVER ) + goto overflow; + } + else + { + tmp.sigh &= 0xffffff00; + tmp.sigh += 0x100; + } + } + else + { + tmp.sigh &= 0xffffff00; /* Finish the truncation */ + } + } + else + precision_loss = 0; + + templ = (tmp.sigh >> 8) & 0x007fffff; + + if ( exp > SINGLE_Emax ) + { + overflow: + EXCEPTION(EX_Overflow); + if ( !(control_word & CW_Overflow) ) + return 0; + set_precision_flag_up(); + if ( !(control_word & CW_Precision) ) + return 0; + + /* This is a special case: see sec 16.2.5.1 of the 80486 book. */ + /* Masked response is overflow to infinity. */ + templ = 0x7f800000; + } + else + { + if ( precision_loss ) + { + if ( increment ) + set_precision_flag_up(); + else + set_precision_flag_down(); + } + /* Add the exponent */ + templ |= ((exp+SINGLE_Ebias) & 0xff) << 23; + } + } + } + else if (st0_tag == TAG_Zero) + { + templ = 0; + } + else if ( st0_tag == TAG_Special ) + { + st0_tag = FPU_Special(st0_ptr); + if (st0_tag == TW_Denormal) + { + reg_copy(st0_ptr, &tmp); + + /* A denormal will always underflow. */ +#ifndef PECULIAR_486 + /* An 80486 is supposed to be able to generate + a denormal exception here, but... */ + /* Underflow has priority. */ + if ( control_word & CW_Underflow ) + denormal_operand(); +#endif /* PECULIAR_486 */ + goto denormal_arg; + } + else if (st0_tag == TW_Infinity) + { + templ = 0x7f800000; + } + else if (st0_tag == TW_NaN) + { + /* Is it really a NaN ? */ + if ( (exponent(st0_ptr) == EXP_OVER) && (st0_ptr->sigh & 0x80000000) ) + { + /* See if we can get a valid NaN from the FPU_REG */ + templ = st0_ptr->sigh >> 8; + if ( !(st0_ptr->sigh & 0x40000000) ) + { + /* It is a signalling NaN */ + EXCEPTION(EX_Invalid); + if ( !(control_word & CW_Invalid) ) + return 0; + templ |= (0x40000000 >> 8); + } + templ |= 0x7f800000; + } + else + { + /* It is an unsupported data type */ + EXCEPTION(EX_Invalid); + if ( !(control_word & CW_Invalid) ) + return 0; + templ = 0xffc00000; + } + } +#ifdef PARANOID + else + { + EXCEPTION(EX_INTERNAL|0x164); + return 0; + } +#endif + } + else if ( st0_tag == TAG_Empty ) + { + /* Empty register (stack underflow) */ + EXCEPTION(EX_StackUnder); + if ( control_word & EX_Invalid ) + { + /* The masked response */ + /* Put out the QNaN indefinite */ + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,single,4); + FPU_put_user(0xffc00000, (unsigned long __user *) single); + RE_ENTRANT_CHECK_ON; + return 1; + } + else + return 0; + } +#ifdef PARANOID + else + { + EXCEPTION(EX_INTERNAL|0x163); + return 0; + } +#endif + if ( getsign(st0_ptr) ) + templ |= 0x80000000; + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,single,4); + FPU_put_user(templ,(unsigned long __user *) single); + RE_ENTRANT_CHECK_ON; + + return 1; +} + + +/* Put a long long into user memory */ +int FPU_store_int64(FPU_REG *st0_ptr, u_char st0_tag, long long __user *d) +{ + FPU_REG t; + long long tll; + int precision_loss; + + if ( st0_tag == TAG_Empty ) + { + /* Empty register (stack underflow) */ + EXCEPTION(EX_StackUnder); + goto invalid_operand; + } + else if ( st0_tag == TAG_Special ) + { + st0_tag = FPU_Special(st0_ptr); + if ( (st0_tag == TW_Infinity) || + (st0_tag == TW_NaN) ) + { + EXCEPTION(EX_Invalid); + goto invalid_operand; + } + } + + reg_copy(st0_ptr, &t); + precision_loss = FPU_round_to_int(&t, st0_tag); + ((long *)&tll)[0] = t.sigl; + ((long *)&tll)[1] = t.sigh; + if ( (precision_loss == 1) || + ((t.sigh & 0x80000000) && + !((t.sigh == 0x80000000) && (t.sigl == 0) && + signnegative(&t))) ) + { + EXCEPTION(EX_Invalid); + /* This is a special case: see sec 16.2.5.1 of the 80486 book */ + invalid_operand: + if ( control_word & EX_Invalid ) + { + /* Produce something like QNaN "indefinite" */ + tll = 0x8000000000000000LL; + } + else + return 0; + } + else + { + if ( precision_loss ) + set_precision_flag(precision_loss); + if ( signnegative(&t) ) + tll = - tll; + } + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,d,8); + copy_to_user(d, &tll, 8); + RE_ENTRANT_CHECK_ON; + + return 1; +} + + +/* Put a long into user memory */ +int FPU_store_int32(FPU_REG *st0_ptr, u_char st0_tag, long __user *d) +{ + FPU_REG t; + int precision_loss; + + if ( st0_tag == TAG_Empty ) + { + /* Empty register (stack underflow) */ + EXCEPTION(EX_StackUnder); + goto invalid_operand; + } + else if ( st0_tag == TAG_Special ) + { + st0_tag = FPU_Special(st0_ptr); + if ( (st0_tag == TW_Infinity) || + (st0_tag == TW_NaN) ) + { + EXCEPTION(EX_Invalid); + goto invalid_operand; + } + } + + reg_copy(st0_ptr, &t); + precision_loss = FPU_round_to_int(&t, st0_tag); + if (t.sigh || + ((t.sigl & 0x80000000) && + !((t.sigl == 0x80000000) && signnegative(&t))) ) + { + EXCEPTION(EX_Invalid); + /* This is a special case: see sec 16.2.5.1 of the 80486 book */ + invalid_operand: + if ( control_word & EX_Invalid ) + { + /* Produce something like QNaN "indefinite" */ + t.sigl = 0x80000000; + } + else + return 0; + } + else + { + if ( precision_loss ) + set_precision_flag(precision_loss); + if ( signnegative(&t) ) + t.sigl = -(long)t.sigl; + } + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,d,4); + FPU_put_user(t.sigl, (unsigned long __user *) d); + RE_ENTRANT_CHECK_ON; + + return 1; +} + + +/* Put a short into user memory */ +int FPU_store_int16(FPU_REG *st0_ptr, u_char st0_tag, short __user *d) +{ + FPU_REG t; + int precision_loss; + + if ( st0_tag == TAG_Empty ) + { + /* Empty register (stack underflow) */ + EXCEPTION(EX_StackUnder); + goto invalid_operand; + } + else if ( st0_tag == TAG_Special ) + { + st0_tag = FPU_Special(st0_ptr); + if ( (st0_tag == TW_Infinity) || + (st0_tag == TW_NaN) ) + { + EXCEPTION(EX_Invalid); + goto invalid_operand; + } + } + + reg_copy(st0_ptr, &t); + precision_loss = FPU_round_to_int(&t, st0_tag); + if (t.sigh || + ((t.sigl & 0xffff8000) && + !((t.sigl == 0x8000) && signnegative(&t))) ) + { + EXCEPTION(EX_Invalid); + /* This is a special case: see sec 16.2.5.1 of the 80486 book */ + invalid_operand: + if ( control_word & EX_Invalid ) + { + /* Produce something like QNaN "indefinite" */ + t.sigl = 0x8000; + } + else + return 0; + } + else + { + if ( precision_loss ) + set_precision_flag(precision_loss); + if ( signnegative(&t) ) + t.sigl = -t.sigl; + } + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,d,2); + FPU_put_user((short)t.sigl, d); + RE_ENTRANT_CHECK_ON; + + return 1; +} + + +/* Put a packed bcd array into user memory */ +int FPU_store_bcd(FPU_REG *st0_ptr, u_char st0_tag, u_char __user *d) +{ + FPU_REG t; + unsigned long long ll; + u_char b; + int i, precision_loss; + u_char sign = (getsign(st0_ptr) == SIGN_NEG) ? 0x80 : 0; + + if ( st0_tag == TAG_Empty ) + { + /* Empty register (stack underflow) */ + EXCEPTION(EX_StackUnder); + goto invalid_operand; + } + else if ( st0_tag == TAG_Special ) + { + st0_tag = FPU_Special(st0_ptr); + if ( (st0_tag == TW_Infinity) || + (st0_tag == TW_NaN) ) + { + EXCEPTION(EX_Invalid); + goto invalid_operand; + } + } + + reg_copy(st0_ptr, &t); + precision_loss = FPU_round_to_int(&t, st0_tag); + ll = significand(&t); + + /* Check for overflow, by comparing with 999999999999999999 decimal. */ + if ( (t.sigh > 0x0de0b6b3) || + ((t.sigh == 0x0de0b6b3) && (t.sigl > 0xa763ffff)) ) + { + EXCEPTION(EX_Invalid); + /* This is a special case: see sec 16.2.5.1 of the 80486 book */ + invalid_operand: + if ( control_word & CW_Invalid ) + { + /* Produce the QNaN "indefinite" */ + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,d,10); + for ( i = 0; i < 7; i++) + FPU_put_user(0, d+i); /* These bytes "undefined" */ + FPU_put_user(0xc0, d+7); /* This byte "undefined" */ + FPU_put_user(0xff, d+8); + FPU_put_user(0xff, d+9); + RE_ENTRANT_CHECK_ON; + return 1; + } + else + return 0; + } + else if ( precision_loss ) + { + /* Precision loss doesn't stop the data transfer */ + set_precision_flag(precision_loss); + } + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,d,10); + RE_ENTRANT_CHECK_ON; + for ( i = 0; i < 9; i++) + { + b = FPU_div_small(&ll, 10); + b |= (FPU_div_small(&ll, 10)) << 4; + RE_ENTRANT_CHECK_OFF; + FPU_put_user(b, d+i); + RE_ENTRANT_CHECK_ON; + } + RE_ENTRANT_CHECK_OFF; + FPU_put_user(sign, d+9); + RE_ENTRANT_CHECK_ON; + + return 1; +} + +/*===========================================================================*/ + +/* r gets mangled such that sig is int, sign: + it is NOT normalized */ +/* The return value (in eax) is zero if the result is exact, + if bits are changed due to rounding, truncation, etc, then + a non-zero value is returned */ +/* Overflow is signalled by a non-zero return value (in eax). + In the case of overflow, the returned significand always has the + largest possible value */ +int FPU_round_to_int(FPU_REG *r, u_char tag) +{ + u_char very_big; + unsigned eax; + + if (tag == TAG_Zero) + { + /* Make sure that zero is returned */ + significand(r) = 0; + return 0; /* o.k. */ + } + + if (exponent(r) > 63) + { + r->sigl = r->sigh = ~0; /* The largest representable number */ + return 1; /* overflow */ + } + + eax = FPU_shrxs(&r->sigl, 63 - exponent(r)); + very_big = !(~(r->sigh) | ~(r->sigl)); /* test for 0xfff...fff */ +#define half_or_more (eax & 0x80000000) +#define frac_part (eax) +#define more_than_half ((eax & 0x80000001) == 0x80000001) + switch (control_word & CW_RC) + { + case RC_RND: + if ( more_than_half /* nearest */ + || (half_or_more && (r->sigl & 1)) ) /* odd -> even */ + { + if ( very_big ) return 1; /* overflow */ + significand(r) ++; + return PRECISION_LOST_UP; + } + break; + case RC_DOWN: + if (frac_part && getsign(r)) + { + if ( very_big ) return 1; /* overflow */ + significand(r) ++; + return PRECISION_LOST_UP; + } + break; + case RC_UP: + if (frac_part && !getsign(r)) + { + if ( very_big ) return 1; /* overflow */ + significand(r) ++; + return PRECISION_LOST_UP; + } + break; + case RC_CHOP: + break; + } + + return eax ? PRECISION_LOST_DOWN : 0; + +} + +/*===========================================================================*/ + +u_char __user *fldenv(fpu_addr_modes addr_modes, u_char __user *s) +{ + unsigned short tag_word = 0; + u_char tag; + int i; + + if ( (addr_modes.default_mode == VM86) || + ((addr_modes.default_mode == PM16) + ^ (addr_modes.override.operand_size == OP_SIZE_PREFIX)) ) + { + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ, s, 0x0e); + FPU_get_user(control_word, (unsigned short __user *) s); + FPU_get_user(partial_status, (unsigned short __user *) (s+2)); + FPU_get_user(tag_word, (unsigned short __user *) (s+4)); + FPU_get_user(instruction_address.offset, (unsigned short __user *) (s+6)); + FPU_get_user(instruction_address.selector, (unsigned short __user *) (s+8)); + FPU_get_user(operand_address.offset, (unsigned short __user *) (s+0x0a)); + FPU_get_user(operand_address.selector, (unsigned short __user *) (s+0x0c)); + RE_ENTRANT_CHECK_ON; + s += 0x0e; + if ( addr_modes.default_mode == VM86 ) + { + instruction_address.offset + += (instruction_address.selector & 0xf000) << 4; + operand_address.offset += (operand_address.selector & 0xf000) << 4; + } + } + else + { + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ, s, 0x1c); + FPU_get_user(control_word, (unsigned short __user *) s); + FPU_get_user(partial_status, (unsigned short __user *) (s+4)); + FPU_get_user(tag_word, (unsigned short __user *) (s+8)); + FPU_get_user(instruction_address.offset, (unsigned long __user *) (s+0x0c)); + FPU_get_user(instruction_address.selector, (unsigned short __user *) (s+0x10)); + FPU_get_user(instruction_address.opcode, (unsigned short __user *) (s+0x12)); + FPU_get_user(operand_address.offset, (unsigned long __user *) (s+0x14)); + FPU_get_user(operand_address.selector, (unsigned long __user *) (s+0x18)); + RE_ENTRANT_CHECK_ON; + s += 0x1c; + } + +#ifdef PECULIAR_486 + control_word &= ~0xe080; +#endif /* PECULIAR_486 */ + + top = (partial_status >> SW_Top_Shift) & 7; + + if ( partial_status & ~control_word & CW_Exceptions ) + partial_status |= (SW_Summary | SW_Backward); + else + partial_status &= ~(SW_Summary | SW_Backward); + + for ( i = 0; i < 8; i++ ) + { + tag = tag_word & 3; + tag_word >>= 2; + + if ( tag == TAG_Empty ) + /* New tag is empty. Accept it */ + FPU_settag(i, TAG_Empty); + else if ( FPU_gettag(i) == TAG_Empty ) + { + /* Old tag is empty and new tag is not empty. New tag is determined + by old reg contents */ + if ( exponent(&fpu_register(i)) == - EXTENDED_Ebias ) + { + if ( !(fpu_register(i).sigl | fpu_register(i).sigh) ) + FPU_settag(i, TAG_Zero); + else + FPU_settag(i, TAG_Special); + } + else if ( exponent(&fpu_register(i)) == 0x7fff - EXTENDED_Ebias ) + { + FPU_settag(i, TAG_Special); + } + else if ( fpu_register(i).sigh & 0x80000000 ) + FPU_settag(i, TAG_Valid); + else + FPU_settag(i, TAG_Special); /* An Un-normal */ + } + /* Else old tag is not empty and new tag is not empty. Old tag + remains correct */ + } + + return s; +} + + +void frstor(fpu_addr_modes addr_modes, u_char __user *data_address) +{ + int i, regnr; + u_char __user *s = fldenv(addr_modes, data_address); + int offset = (top & 7) * 10, other = 80 - offset; + + /* Copy all registers in stack order. */ + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_READ,s,80); + __copy_from_user(register_base+offset, s, other); + if ( offset ) + __copy_from_user(register_base, s+other, offset); + RE_ENTRANT_CHECK_ON; + + for ( i = 0; i < 8; i++ ) + { + regnr = (i+top) & 7; + if ( FPU_gettag(regnr) != TAG_Empty ) + /* The loaded data over-rides all other cases. */ + FPU_settag(regnr, FPU_tagof(&st(i))); + } + +} + + +u_char __user *fstenv(fpu_addr_modes addr_modes, u_char __user *d) +{ + if ( (addr_modes.default_mode == VM86) || + ((addr_modes.default_mode == PM16) + ^ (addr_modes.override.operand_size == OP_SIZE_PREFIX)) ) + { + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,d,14); +#ifdef PECULIAR_486 + FPU_put_user(control_word & ~0xe080, (unsigned long __user *) d); +#else + FPU_put_user(control_word, (unsigned short __user *) d); +#endif /* PECULIAR_486 */ + FPU_put_user(status_word(), (unsigned short __user *) (d+2)); + FPU_put_user(fpu_tag_word, (unsigned short __user *) (d+4)); + FPU_put_user(instruction_address.offset, (unsigned short __user *) (d+6)); + FPU_put_user(operand_address.offset, (unsigned short __user *) (d+0x0a)); + if ( addr_modes.default_mode == VM86 ) + { + FPU_put_user((instruction_address.offset & 0xf0000) >> 4, + (unsigned short __user *) (d+8)); + FPU_put_user((operand_address.offset & 0xf0000) >> 4, + (unsigned short __user *) (d+0x0c)); + } + else + { + FPU_put_user(instruction_address.selector, (unsigned short __user *) (d+8)); + FPU_put_user(operand_address.selector, (unsigned short __user *) (d+0x0c)); + } + RE_ENTRANT_CHECK_ON; + d += 0x0e; + } + else + { + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE, d, 7*4); +#ifdef PECULIAR_486 + control_word &= ~0xe080; + /* An 80486 sets nearly all of the reserved bits to 1. */ + control_word |= 0xffff0040; + partial_status = status_word() | 0xffff0000; + fpu_tag_word |= 0xffff0000; + I387.soft.fcs &= ~0xf8000000; + I387.soft.fos |= 0xffff0000; +#endif /* PECULIAR_486 */ + __copy_to_user(d, &control_word, 7*4); + RE_ENTRANT_CHECK_ON; + d += 0x1c; + } + + control_word |= CW_Exceptions; + partial_status &= ~(SW_Summary | SW_Backward); + + return d; +} + + +void fsave(fpu_addr_modes addr_modes, u_char __user *data_address) +{ + u_char __user *d; + int offset = (top & 7) * 10, other = 80 - offset; + + d = fstenv(addr_modes, data_address); + + RE_ENTRANT_CHECK_OFF; + FPU_verify_area(VERIFY_WRITE,d,80); + + /* Copy all registers in stack order. */ + __copy_to_user(d, register_base+offset, other); + if ( offset ) + __copy_to_user(d+other, register_base, offset); + RE_ENTRANT_CHECK_ON; + + finit(); +} + +/*===========================================================================*/ diff --git a/src/wraith/math-emu/reg_mul.c b/src/wraith/math-emu/reg_mul.c new file mode 100644 index 000000000..40f50b61b --- /dev/null +++ b/src/wraith/math-emu/reg_mul.c @@ -0,0 +1,132 @@ +/*---------------------------------------------------------------------------+ + | reg_mul.c | + | | + | Multiply one FPU_REG by another, put the result in a destination FPU_REG. | + | | + | Copyright (C) 1992,1993,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | Returns the tag of the result if no exceptions or errors occurred. | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | The destination may be any FPU_REG, including one of the source FPU_REGs. | + +---------------------------------------------------------------------------*/ + +#include "fpu_emu.h" +#include "exception.h" +#include "reg_constant.h" +#include "fpu_system.h" + + +/* + Multiply two registers to give a register result. + The sources are st(deststnr) and (b,tagb,signb). + The destination is st(deststnr). + */ +/* This routine must be called with non-empty source registers */ +int FPU_mul(FPU_REG const *b, u_char tagb, int deststnr, int control_w) +{ + FPU_REG *a = &st(deststnr); + FPU_REG *dest = a; + u_char taga = FPU_gettagi(deststnr); + u_char saved_sign = getsign(dest); + u_char sign = (getsign(a) ^ getsign(b)); + int tag; + + + if ( !(taga | tagb) ) + { + /* Both regs Valid, this should be the most common case. */ + + tag = FPU_u_mul(a, b, dest, control_w, sign, exponent(a) + exponent(b)); + if ( tag < 0 ) + { + setsign(dest, saved_sign); + return tag; + } + FPU_settagi(deststnr, tag); + return tag; + } + + if ( taga == TAG_Special ) + taga = FPU_Special(a); + if ( tagb == TAG_Special ) + tagb = FPU_Special(b); + + if ( ((taga == TAG_Valid) && (tagb == TW_Denormal)) + || ((taga == TW_Denormal) && (tagb == TAG_Valid)) + || ((taga == TW_Denormal) && (tagb == TW_Denormal)) ) + { + FPU_REG x, y; + if ( denormal_operand() < 0 ) + return FPU_Exception; + + FPU_to_exp16(a, &x); + FPU_to_exp16(b, &y); + tag = FPU_u_mul(&x, &y, dest, control_w, sign, + exponent16(&x) + exponent16(&y)); + if ( tag < 0 ) + { + setsign(dest, saved_sign); + return tag; + } + FPU_settagi(deststnr, tag); + return tag; + } + else if ( (taga <= TW_Denormal) && (tagb <= TW_Denormal) ) + { + if ( ((tagb == TW_Denormal) || (taga == TW_Denormal)) + && (denormal_operand() < 0) ) + return FPU_Exception; + + /* Must have either both arguments == zero, or + one valid and the other zero. + The result is therefore zero. */ + FPU_copy_to_regi(&CONST_Z, TAG_Zero, deststnr); + /* The 80486 book says that the answer is +0, but a real + 80486 behaves this way. + IEEE-754 apparently says it should be this way. */ + setsign(dest, sign); + return TAG_Zero; + } + /* Must have infinities, NaNs, etc */ + else if ( (taga == TW_NaN) || (tagb == TW_NaN) ) + { + return real_2op_NaN(b, tagb, deststnr, &st(0)); + } + else if ( ((taga == TW_Infinity) && (tagb == TAG_Zero)) + || ((tagb == TW_Infinity) && (taga == TAG_Zero)) ) + { + return arith_invalid(deststnr); /* Zero*Infinity is invalid */ + } + else if ( ((taga == TW_Denormal) || (tagb == TW_Denormal)) + && (denormal_operand() < 0) ) + { + return FPU_Exception; + } + else if (taga == TW_Infinity) + { + FPU_copy_to_regi(a, TAG_Special, deststnr); + setsign(dest, sign); + return TAG_Special; + } + else if (tagb == TW_Infinity) + { + FPU_copy_to_regi(b, TAG_Special, deststnr); + setsign(dest, sign); + return TAG_Special; + } + +#ifdef PARANOID + else + { + EXCEPTION(EX_INTERNAL|0x102); + return FPU_Exception; + } +#endif /* PARANOID */ + + return 0; +} diff --git a/src/wraith/math-emu/reg_norm.S b/src/wraith/math-emu/reg_norm.S new file mode 100644 index 000000000..8b6352efc --- /dev/null +++ b/src/wraith/math-emu/reg_norm.S @@ -0,0 +1,147 @@ +/*---------------------------------------------------------------------------+ + | reg_norm.S | + | | + | Copyright (C) 1992,1993,1994,1995,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@suburbia.net | + | | + | Normalize the value in a FPU_REG. | + | | + | Call from C as: | + | int FPU_normalize(FPU_REG *n) | + | | + | int FPU_normalize_nuo(FPU_REG *n) | + | | + | Return value is the tag of the answer, or-ed with FPU_Exception if | + | one was raised, or -1 on internal error. | + | | + +---------------------------------------------------------------------------*/ + +#include "fpu_emu.h" + + +.text +ENTRY(FPU_normalize) + pushl %ebp + movl %esp,%ebp + pushl %ebx + + movl PARAM1,%ebx + + movl SIGH(%ebx),%edx + movl SIGL(%ebx),%eax + + orl %edx,%edx /* ms bits */ + js L_done /* Already normalized */ + jnz L_shift_1 /* Shift left 1 - 31 bits */ + + orl %eax,%eax + jz L_zero /* The contents are zero */ + + movl %eax,%edx + xorl %eax,%eax + subw $32,EXP(%ebx) /* This can cause an underflow */ + +/* We need to shift left by 1 - 31 bits */ +L_shift_1: + bsrl %edx,%ecx /* get the required shift in %ecx */ + subl $31,%ecx + negl %ecx + shld %cl,%eax,%edx + shl %cl,%eax + subw %cx,EXP(%ebx) /* This can cause an underflow */ + + movl %edx,SIGH(%ebx) + movl %eax,SIGL(%ebx) + +L_done: + cmpw EXP_OVER,EXP(%ebx) + jge L_overflow + + cmpw EXP_UNDER,EXP(%ebx) + jle L_underflow + +L_exit_valid: + movl TAG_Valid,%eax + + /* Convert the exponent to 80x87 form. */ + addw EXTENDED_Ebias,EXP(%ebx) + andw $0x7fff,EXP(%ebx) + +L_exit: + popl %ebx + leave + ret + + +L_zero: + movw $0,EXP(%ebx) + movl TAG_Zero,%eax + jmp L_exit + +L_underflow: + /* Convert the exponent to 80x87 form. */ + addw EXTENDED_Ebias,EXP(%ebx) + push %ebx + call arith_underflow + pop %ebx + jmp L_exit + +L_overflow: + /* Convert the exponent to 80x87 form. */ + addw EXTENDED_Ebias,EXP(%ebx) + push %ebx + call arith_overflow + pop %ebx + jmp L_exit + + + +/* Normalise without reporting underflow or overflow */ +ENTRY(FPU_normalize_nuo) + pushl %ebp + movl %esp,%ebp + pushl %ebx + + movl PARAM1,%ebx + + movl SIGH(%ebx),%edx + movl SIGL(%ebx),%eax + + orl %edx,%edx /* ms bits */ + js L_exit_nuo_valid /* Already normalized */ + jnz L_nuo_shift_1 /* Shift left 1 - 31 bits */ + + orl %eax,%eax + jz L_exit_nuo_zero /* The contents are zero */ + + movl %eax,%edx + xorl %eax,%eax + subw $32,EXP(%ebx) /* This can cause an underflow */ + +/* We need to shift left by 1 - 31 bits */ +L_nuo_shift_1: + bsrl %edx,%ecx /* get the required shift in %ecx */ + subl $31,%ecx + negl %ecx + shld %cl,%eax,%edx + shl %cl,%eax + subw %cx,EXP(%ebx) /* This can cause an underflow */ + + movl %edx,SIGH(%ebx) + movl %eax,SIGL(%ebx) + +L_exit_nuo_valid: + movl TAG_Valid,%eax + + popl %ebx + leave + ret + +L_exit_nuo_zero: + movl TAG_Zero,%eax + movw EXP_UNDER,EXP(%ebx) + + popl %ebx + leave + ret diff --git a/src/wraith/math-emu/reg_round.S b/src/wraith/math-emu/reg_round.S new file mode 100644 index 000000000..d1d4e48b4 --- /dev/null +++ b/src/wraith/math-emu/reg_round.S @@ -0,0 +1,708 @@ + .file "reg_round.S" +/*---------------------------------------------------------------------------+ + | reg_round.S | + | | + | Rounding/truncation/etc for FPU basic arithmetic functions. | + | | + | Copyright (C) 1993,1995,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@suburbia.net | + | | + | This code has four possible entry points. | + | The following must be entered by a jmp instruction: | + | fpu_reg_round, fpu_reg_round_sqrt, and fpu_Arith_exit. | + | | + | The FPU_round entry point is intended to be used by C code. | + | From C, call as: | + | int FPU_round(FPU_REG *arg, unsigned int extent, unsigned int control_w) | + | | + | Return value is the tag of the answer, or-ed with FPU_Exception if | + | one was raised, or -1 on internal error. | + | | + | For correct "up" and "down" rounding, the argument must have the correct | + | sign. | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | Four entry points. | + | | + | Needed by both the fpu_reg_round and fpu_reg_round_sqrt entry points: | + | %eax:%ebx 64 bit significand | + | %edx 32 bit extension of the significand | + | %edi pointer to an FPU_REG for the result to be stored | + | stack calling function must have set up a C stack frame and | + | pushed %esi, %edi, and %ebx | + | | + | Needed just for the fpu_reg_round_sqrt entry point: | + | %cx A control word in the same format as the FPU control word. | + | Otherwise, PARAM4 must give such a value. | + | | + | | + | The significand and its extension are assumed to be exact in the | + | following sense: | + | If the significand by itself is the exact result then the significand | + | extension (%edx) must contain 0, otherwise the significand extension | + | must be non-zero. | + | If the significand extension is non-zero then the significand is | + | smaller than the magnitude of the correct exact result by an amount | + | greater than zero and less than one ls bit of the significand. | + | The significand extension is only required to have three possible | + | non-zero values: | + | less than 0x80000000 <=> the significand is less than 1/2 an ls | + | bit smaller than the magnitude of the | + | true exact result. | + | exactly 0x80000000 <=> the significand is exactly 1/2 an ls bit | + | smaller than the magnitude of the true | + | exact result. | + | greater than 0x80000000 <=> the significand is more than 1/2 an ls | + | bit smaller than the magnitude of the | + | true exact result. | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | The code in this module has become quite complex, but it should handle | + | all of the FPU flags which are set at this stage of the basic arithmetic | + | computations. | + | There are a few rare cases where the results are not set identically to | + | a real FPU. These require a bit more thought because at this stage the | + | results of the code here appear to be more consistent... | + | This may be changed in a future version. | + +---------------------------------------------------------------------------*/ + + +#include "fpu_emu.h" +#include "exception.h" +#include "control_w.h" + +/* Flags for FPU_bits_lost */ +#define LOST_DOWN $1 +#define LOST_UP $2 + +/* Flags for FPU_denormal */ +#define DENORMAL $1 +#define UNMASKED_UNDERFLOW $2 + + +#ifndef NON_REENTRANT_FPU +/* Make the code re-entrant by putting + local storage on the stack: */ +#define FPU_bits_lost (%esp) +#define FPU_denormal 1(%esp) + +#else +/* Not re-entrant, so we can gain speed by putting + local storage in a static area: */ +.data + .align 4,0 +FPU_bits_lost: + .byte 0 +FPU_denormal: + .byte 0 +#endif /* NON_REENTRANT_FPU */ + + +.text +.globl fpu_reg_round +.globl fpu_Arith_exit + +/* Entry point when called from C */ +ENTRY(FPU_round) + pushl %ebp + movl %esp,%ebp + pushl %esi + pushl %edi + pushl %ebx + + movl PARAM1,%edi + movl SIGH(%edi),%eax + movl SIGL(%edi),%ebx + movl PARAM2,%edx + +fpu_reg_round: /* Normal entry point */ + movl PARAM4,%ecx + +#ifndef NON_REENTRANT_FPU + pushl %ebx /* adjust the stack pointer */ +#endif /* NON_REENTRANT_FPU */ + +#ifdef PARANOID +/* Cannot use this here yet */ +/* orl %eax,%eax */ +/* jns L_entry_bugged */ +#endif /* PARANOID */ + + cmpw EXP_UNDER,EXP(%edi) + jle L_Make_denorm /* The number is a de-normal */ + + movb $0,FPU_denormal /* 0 -> not a de-normal */ + +Denorm_done: + movb $0,FPU_bits_lost /* No bits yet lost in rounding */ + + movl %ecx,%esi + andl CW_PC,%ecx + cmpl PR_64_BITS,%ecx + je LRound_To_64 + + cmpl PR_53_BITS,%ecx + je LRound_To_53 + + cmpl PR_24_BITS,%ecx + je LRound_To_24 + +#ifdef PECULIAR_486 +/* With the precision control bits set to 01 "(reserved)", a real 80486 + behaves as if the precision control bits were set to 11 "64 bits" */ + cmpl PR_RESERVED_BITS,%ecx + je LRound_To_64 +#ifdef PARANOID + jmp L_bugged_denorm_486 +#endif /* PARANOID */ +#else +#ifdef PARANOID + jmp L_bugged_denorm /* There is no bug, just a bad control word */ +#endif /* PARANOID */ +#endif /* PECULIAR_486 */ + + +/* Round etc to 24 bit precision */ +LRound_To_24: + movl %esi,%ecx + andl CW_RC,%ecx + cmpl RC_RND,%ecx + je LRound_nearest_24 + + cmpl RC_CHOP,%ecx + je LCheck_truncate_24 + + cmpl RC_UP,%ecx /* Towards +infinity */ + je LUp_24 + + cmpl RC_DOWN,%ecx /* Towards -infinity */ + je LDown_24 + +#ifdef PARANOID + jmp L_bugged_round24 +#endif /* PARANOID */ + +LUp_24: + cmpb SIGN_POS,PARAM5 + jne LCheck_truncate_24 /* If negative then up==truncate */ + + jmp LCheck_24_round_up + +LDown_24: + cmpb SIGN_POS,PARAM5 + je LCheck_truncate_24 /* If positive then down==truncate */ + +LCheck_24_round_up: + movl %eax,%ecx + andl $0x000000ff,%ecx + orl %ebx,%ecx + orl %edx,%ecx + jnz LDo_24_round_up + jmp L_Re_normalise + +LRound_nearest_24: + /* Do rounding of the 24th bit if needed (nearest or even) */ + movl %eax,%ecx + andl $0x000000ff,%ecx + cmpl $0x00000080,%ecx + jc LCheck_truncate_24 /* less than half, no increment needed */ + + jne LGreater_Half_24 /* greater than half, increment needed */ + + /* Possibly half, we need to check the ls bits */ + orl %ebx,%ebx + jnz LGreater_Half_24 /* greater than half, increment needed */ + + orl %edx,%edx + jnz LGreater_Half_24 /* greater than half, increment needed */ + + /* Exactly half, increment only if 24th bit is 1 (round to even) */ + testl $0x00000100,%eax + jz LDo_truncate_24 + +LGreater_Half_24: /* Rounding: increment at the 24th bit */ +LDo_24_round_up: + andl $0xffffff00,%eax /* Truncate to 24 bits */ + xorl %ebx,%ebx + movb LOST_UP,FPU_bits_lost + addl $0x00000100,%eax + jmp LCheck_Round_Overflow + +LCheck_truncate_24: + movl %eax,%ecx + andl $0x000000ff,%ecx + orl %ebx,%ecx + orl %edx,%ecx + jz L_Re_normalise /* No truncation needed */ + +LDo_truncate_24: + andl $0xffffff00,%eax /* Truncate to 24 bits */ + xorl %ebx,%ebx + movb LOST_DOWN,FPU_bits_lost + jmp L_Re_normalise + + +/* Round etc to 53 bit precision */ +LRound_To_53: + movl %esi,%ecx + andl CW_RC,%ecx + cmpl RC_RND,%ecx + je LRound_nearest_53 + + cmpl RC_CHOP,%ecx + je LCheck_truncate_53 + + cmpl RC_UP,%ecx /* Towards +infinity */ + je LUp_53 + + cmpl RC_DOWN,%ecx /* Towards -infinity */ + je LDown_53 + +#ifdef PARANOID + jmp L_bugged_round53 +#endif /* PARANOID */ + +LUp_53: + cmpb SIGN_POS,PARAM5 + jne LCheck_truncate_53 /* If negative then up==truncate */ + + jmp LCheck_53_round_up + +LDown_53: + cmpb SIGN_POS,PARAM5 + je LCheck_truncate_53 /* If positive then down==truncate */ + +LCheck_53_round_up: + movl %ebx,%ecx + andl $0x000007ff,%ecx + orl %edx,%ecx + jnz LDo_53_round_up + jmp L_Re_normalise + +LRound_nearest_53: + /* Do rounding of the 53rd bit if needed (nearest or even) */ + movl %ebx,%ecx + andl $0x000007ff,%ecx + cmpl $0x00000400,%ecx + jc LCheck_truncate_53 /* less than half, no increment needed */ + + jnz LGreater_Half_53 /* greater than half, increment needed */ + + /* Possibly half, we need to check the ls bits */ + orl %edx,%edx + jnz LGreater_Half_53 /* greater than half, increment needed */ + + /* Exactly half, increment only if 53rd bit is 1 (round to even) */ + testl $0x00000800,%ebx + jz LTruncate_53 + +LGreater_Half_53: /* Rounding: increment at the 53rd bit */ +LDo_53_round_up: + movb LOST_UP,FPU_bits_lost + andl $0xfffff800,%ebx /* Truncate to 53 bits */ + addl $0x00000800,%ebx + adcl $0,%eax + jmp LCheck_Round_Overflow + +LCheck_truncate_53: + movl %ebx,%ecx + andl $0x000007ff,%ecx + orl %edx,%ecx + jz L_Re_normalise + +LTruncate_53: + movb LOST_DOWN,FPU_bits_lost + andl $0xfffff800,%ebx /* Truncate to 53 bits */ + jmp L_Re_normalise + + +/* Round etc to 64 bit precision */ +LRound_To_64: + movl %esi,%ecx + andl CW_RC,%ecx + cmpl RC_RND,%ecx + je LRound_nearest_64 + + cmpl RC_CHOP,%ecx + je LCheck_truncate_64 + + cmpl RC_UP,%ecx /* Towards +infinity */ + je LUp_64 + + cmpl RC_DOWN,%ecx /* Towards -infinity */ + je LDown_64 + +#ifdef PARANOID + jmp L_bugged_round64 +#endif /* PARANOID */ + +LUp_64: + cmpb SIGN_POS,PARAM5 + jne LCheck_truncate_64 /* If negative then up==truncate */ + + orl %edx,%edx + jnz LDo_64_round_up + jmp L_Re_normalise + +LDown_64: + cmpb SIGN_POS,PARAM5 + je LCheck_truncate_64 /* If positive then down==truncate */ + + orl %edx,%edx + jnz LDo_64_round_up + jmp L_Re_normalise + +LRound_nearest_64: + cmpl $0x80000000,%edx + jc LCheck_truncate_64 + + jne LDo_64_round_up + + /* Now test for round-to-even */ + testb $1,%bl + jz LCheck_truncate_64 + +LDo_64_round_up: + movb LOST_UP,FPU_bits_lost + addl $1,%ebx + adcl $0,%eax + +LCheck_Round_Overflow: + jnc L_Re_normalise + + /* Overflow, adjust the result (significand to 1.0) */ + rcrl $1,%eax + rcrl $1,%ebx + incw EXP(%edi) + jmp L_Re_normalise + +LCheck_truncate_64: + orl %edx,%edx + jz L_Re_normalise + +LTruncate_64: + movb LOST_DOWN,FPU_bits_lost + +L_Re_normalise: + testb $0xff,FPU_denormal + jnz Normalise_result + +L_Normalised: + movl TAG_Valid,%edx + +L_deNormalised: + cmpb LOST_UP,FPU_bits_lost + je L_precision_lost_up + + cmpb LOST_DOWN,FPU_bits_lost + je L_precision_lost_down + +L_no_precision_loss: + /* store the result */ + +L_Store_significand: + movl %eax,SIGH(%edi) + movl %ebx,SIGL(%edi) + + cmpw EXP_OVER,EXP(%edi) + jge L_overflow + + movl %edx,%eax + + /* Convert the exponent to 80x87 form. */ + addw EXTENDED_Ebias,EXP(%edi) + andw $0x7fff,EXP(%edi) + +fpu_reg_round_signed_special_exit: + + cmpb SIGN_POS,PARAM5 + je fpu_reg_round_special_exit + + orw $0x8000,EXP(%edi) /* Negative sign for the result. */ + +fpu_reg_round_special_exit: + +#ifndef NON_REENTRANT_FPU + popl %ebx /* adjust the stack pointer */ +#endif /* NON_REENTRANT_FPU */ + +fpu_Arith_exit: + popl %ebx + popl %edi + popl %esi + leave + ret + + +/* + * Set the FPU status flags to represent precision loss due to + * round-up. + */ +L_precision_lost_up: + push %edx + push %eax + call set_precision_flag_up + popl %eax + popl %edx + jmp L_no_precision_loss + +/* + * Set the FPU status flags to represent precision loss due to + * truncation. + */ +L_precision_lost_down: + push %edx + push %eax + call set_precision_flag_down + popl %eax + popl %edx + jmp L_no_precision_loss + + +/* + * The number is a denormal (which might get rounded up to a normal) + * Shift the number right the required number of bits, which will + * have to be undone later... + */ +L_Make_denorm: + /* The action to be taken depends upon whether the underflow + exception is masked */ + testb CW_Underflow,%cl /* Underflow mask. */ + jz Unmasked_underflow /* Do not make a denormal. */ + + movb DENORMAL,FPU_denormal + + pushl %ecx /* Save */ + movw EXP_UNDER+1,%cx + subw EXP(%edi),%cx + + cmpw $64,%cx /* shrd only works for 0..31 bits */ + jnc Denorm_shift_more_than_63 + + cmpw $32,%cx /* shrd only works for 0..31 bits */ + jnc Denorm_shift_more_than_32 + +/* + * We got here without jumps by assuming that the most common requirement + * is for a small de-normalising shift. + * Shift by [1..31] bits + */ + addw %cx,EXP(%edi) + orl %edx,%edx /* extension */ + setne %ch /* Save whether %edx is non-zero */ + xorl %edx,%edx + shrd %cl,%ebx,%edx + shrd %cl,%eax,%ebx + shr %cl,%eax + orb %ch,%dl + popl %ecx + jmp Denorm_done + +/* Shift by [32..63] bits */ +Denorm_shift_more_than_32: + addw %cx,EXP(%edi) + subb $32,%cl + orl %edx,%edx + setne %ch + orb %ch,%bl + xorl %edx,%edx + shrd %cl,%ebx,%edx + shrd %cl,%eax,%ebx + shr %cl,%eax + orl %edx,%edx /* test these 32 bits */ + setne %cl + orb %ch,%bl + orb %cl,%bl + movl %ebx,%edx + movl %eax,%ebx + xorl %eax,%eax + popl %ecx + jmp Denorm_done + +/* Shift by [64..) bits */ +Denorm_shift_more_than_63: + cmpw $64,%cx + jne Denorm_shift_more_than_64 + +/* Exactly 64 bit shift */ + addw %cx,EXP(%edi) + xorl %ecx,%ecx + orl %edx,%edx + setne %cl + orl %ebx,%ebx + setne %ch + orb %ch,%cl + orb %cl,%al + movl %eax,%edx + xorl %eax,%eax + xorl %ebx,%ebx + popl %ecx + jmp Denorm_done + +Denorm_shift_more_than_64: + movw EXP_UNDER+1,EXP(%edi) +/* This is easy, %eax must be non-zero, so.. */ + movl $1,%edx + xorl %eax,%eax + xorl %ebx,%ebx + popl %ecx + jmp Denorm_done + + +Unmasked_underflow: + movb UNMASKED_UNDERFLOW,FPU_denormal + jmp Denorm_done + + +/* Undo the de-normalisation. */ +Normalise_result: + cmpb UNMASKED_UNDERFLOW,FPU_denormal + je Signal_underflow + +/* The number must be a denormal if we got here. */ +#ifdef PARANOID + /* But check it... just in case. */ + cmpw EXP_UNDER+1,EXP(%edi) + jne L_norm_bugged +#endif /* PARANOID */ + +#ifdef PECULIAR_486 + /* + * This implements a special feature of 80486 behaviour. + * Underflow will be signalled even if the number is + * not a denormal after rounding. + * This difference occurs only for masked underflow, and not + * in the unmasked case. + * Actual 80486 behaviour differs from this in some circumstances. + */ + orl %eax,%eax /* ms bits */ + js LPseudoDenormal /* Will be masked underflow */ +#else + orl %eax,%eax /* ms bits */ + js L_Normalised /* No longer a denormal */ +#endif /* PECULIAR_486 */ + + jnz LDenormal_adj_exponent + + orl %ebx,%ebx + jz L_underflow_to_zero /* The contents are zero */ + +LDenormal_adj_exponent: + decw EXP(%edi) + +LPseudoDenormal: + testb $0xff,FPU_bits_lost /* bits lost == underflow */ + movl TAG_Special,%edx + jz L_deNormalised + + /* There must be a masked underflow */ + push %eax + pushl EX_Underflow + call EXCEPTION + popl %eax + popl %eax + movl TAG_Special,%edx + jmp L_deNormalised + + +/* + * The operations resulted in a number too small to represent. + * Masked response. + */ +L_underflow_to_zero: + push %eax + call set_precision_flag_down + popl %eax + + push %eax + pushl EX_Underflow + call EXCEPTION + popl %eax + popl %eax + +/* Reduce the exponent to EXP_UNDER */ + movw EXP_UNDER,EXP(%edi) + movl TAG_Zero,%edx + jmp L_Store_significand + + +/* The operations resulted in a number too large to represent. */ +L_overflow: + addw EXTENDED_Ebias,EXP(%edi) /* Set for unmasked response. */ + push %edi + call arith_overflow + pop %edi + jmp fpu_reg_round_signed_special_exit + + +Signal_underflow: + /* The number may have been changed to a non-denormal */ + /* by the rounding operations. */ + cmpw EXP_UNDER,EXP(%edi) + jle Do_unmasked_underflow + + jmp L_Normalised + +Do_unmasked_underflow: + /* Increase the exponent by the magic number */ + addw $(3*(1<<13)),EXP(%edi) + push %eax + pushl EX_Underflow + call EXCEPTION + popl %eax + popl %eax + jmp L_Normalised + + +#ifdef PARANOID +#ifdef PECULIAR_486 +L_bugged_denorm_486: + pushl EX_INTERNAL|0x236 + call EXCEPTION + popl %ebx + jmp L_exception_exit +#else +L_bugged_denorm: + pushl EX_INTERNAL|0x230 + call EXCEPTION + popl %ebx + jmp L_exception_exit +#endif /* PECULIAR_486 */ + +L_bugged_round24: + pushl EX_INTERNAL|0x231 + call EXCEPTION + popl %ebx + jmp L_exception_exit + +L_bugged_round53: + pushl EX_INTERNAL|0x232 + call EXCEPTION + popl %ebx + jmp L_exception_exit + +L_bugged_round64: + pushl EX_INTERNAL|0x233 + call EXCEPTION + popl %ebx + jmp L_exception_exit + +L_norm_bugged: + pushl EX_INTERNAL|0x234 + call EXCEPTION + popl %ebx + jmp L_exception_exit + +L_entry_bugged: + pushl EX_INTERNAL|0x235 + call EXCEPTION + popl %ebx +L_exception_exit: + mov $-1,%eax + jmp fpu_reg_round_special_exit +#endif /* PARANOID */ diff --git a/src/wraith/math-emu/reg_u_add.S b/src/wraith/math-emu/reg_u_add.S new file mode 100644 index 000000000..47c4c2434 --- /dev/null +++ b/src/wraith/math-emu/reg_u_add.S @@ -0,0 +1,167 @@ + .file "reg_u_add.S" +/*---------------------------------------------------------------------------+ + | reg_u_add.S | + | | + | Add two valid (TAG_Valid) FPU_REG numbers, of the same sign, and put the | + | result in a destination FPU_REG. | + | | + | Copyright (C) 1992,1993,1995,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | Call from C as: | + | int FPU_u_add(FPU_REG *arg1, FPU_REG *arg2, FPU_REG *answ, | + | int control_w) | + | Return value is the tag of the answer, or-ed with FPU_Exception if | + | one was raised, or -1 on internal error. | + | | + +---------------------------------------------------------------------------*/ + +/* + | Kernel addition routine FPU_u_add(reg *arg1, reg *arg2, reg *answ). + | Takes two valid reg f.p. numbers (TAG_Valid), which are + | treated as unsigned numbers, + | and returns their sum as a TAG_Valid or TAG_Special f.p. number. + | The returned number is normalized. + | Basic checks are performed if PARANOID is defined. + */ + +#include "exception.h" +#include "fpu_emu.h" +#include "control_w.h" + +.text +ENTRY(FPU_u_add) + pushl %ebp + movl %esp,%ebp + pushl %esi + pushl %edi + pushl %ebx + + movl PARAM1,%esi /* source 1 */ + movl PARAM2,%edi /* source 2 */ + + movl PARAM6,%ecx + movl %ecx,%edx + subl PARAM7,%ecx /* exp1 - exp2 */ + jge L_arg1_larger + + /* num1 is smaller */ + movl SIGL(%esi),%ebx + movl SIGH(%esi),%eax + + movl %edi,%esi + movl PARAM7,%edx + negw %cx + jmp L_accum_loaded + +L_arg1_larger: + /* num1 has larger or equal exponent */ + movl SIGL(%edi),%ebx + movl SIGH(%edi),%eax + +L_accum_loaded: + movl PARAM3,%edi /* destination */ + movw %dx,EXP(%edi) /* Copy exponent to destination */ + + xorl %edx,%edx /* clear the extension */ + +#ifdef PARANOID + testl $0x80000000,%eax + je L_bugged + + testl $0x80000000,SIGH(%esi) + je L_bugged +#endif /* PARANOID */ + +/* The number to be shifted is in %eax:%ebx:%edx */ + cmpw $32,%cx /* shrd only works for 0..31 bits */ + jnc L_more_than_31 + +/* less than 32 bits */ + shrd %cl,%ebx,%edx + shrd %cl,%eax,%ebx + shr %cl,%eax + jmp L_shift_done + +L_more_than_31: + cmpw $64,%cx + jnc L_more_than_63 + + subb $32,%cl + jz L_exactly_32 + + shrd %cl,%eax,%edx + shr %cl,%eax + orl %ebx,%ebx + jz L_more_31_no_low /* none of the lowest bits is set */ + + orl $1,%edx /* record the fact in the extension */ + +L_more_31_no_low: + movl %eax,%ebx + xorl %eax,%eax + jmp L_shift_done + +L_exactly_32: + movl %ebx,%edx + movl %eax,%ebx + xorl %eax,%eax + jmp L_shift_done + +L_more_than_63: + cmpw $65,%cx + jnc L_more_than_64 + + movl %eax,%edx + orl %ebx,%ebx + jz L_more_63_no_low + + orl $1,%edx + jmp L_more_63_no_low + +L_more_than_64: + movl $1,%edx /* The shifted nr always at least one '1' */ + +L_more_63_no_low: + xorl %ebx,%ebx + xorl %eax,%eax + +L_shift_done: + /* Now do the addition */ + addl SIGL(%esi),%ebx + adcl SIGH(%esi),%eax + jnc L_round_the_result + + /* Overflow, adjust the result */ + rcrl $1,%eax + rcrl $1,%ebx + rcrl $1,%edx + jnc L_no_bit_lost + + orl $1,%edx + +L_no_bit_lost: + incw EXP(%edi) + +L_round_the_result: + jmp fpu_reg_round /* Round the result */ + + + +#ifdef PARANOID +/* If we ever get here then we have problems! */ +L_bugged: + pushl EX_INTERNAL|0x201 + call EXCEPTION + pop %ebx + movl $-1,%eax + jmp L_exit + +L_exit: + popl %ebx + popl %edi + popl %esi + leave + ret +#endif /* PARANOID */ diff --git a/src/wraith/math-emu/reg_u_div.S b/src/wraith/math-emu/reg_u_div.S new file mode 100644 index 000000000..cc00654b6 --- /dev/null +++ b/src/wraith/math-emu/reg_u_div.S @@ -0,0 +1,471 @@ + .file "reg_u_div.S" +/*---------------------------------------------------------------------------+ + | reg_u_div.S | + | | + | Divide one FPU_REG by another and put the result in a destination FPU_REG.| + | | + | Copyright (C) 1992,1993,1995,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | Call from C as: | + | int FPU_u_div(FPU_REG *a, FPU_REG *b, FPU_REG *dest, | + | unsigned int control_word, char *sign) | + | | + | Does not compute the destination exponent, but does adjust it. | + | | + | Return value is the tag of the answer, or-ed with FPU_Exception if | + | one was raised, or -1 on internal error. | + +---------------------------------------------------------------------------*/ + +#include "exception.h" +#include "fpu_emu.h" +#include "control_w.h" + + +/* #define dSIGL(x) (x) */ +/* #define dSIGH(x) 4(x) */ + + +#ifndef NON_REENTRANT_FPU +/* + Local storage on the stack: + Result: FPU_accum_3:FPU_accum_2:FPU_accum_1:FPU_accum_0 + Overflow flag: ovfl_flag + */ +#define FPU_accum_3 -4(%ebp) +#define FPU_accum_2 -8(%ebp) +#define FPU_accum_1 -12(%ebp) +#define FPU_accum_0 -16(%ebp) +#define FPU_result_1 -20(%ebp) +#define FPU_result_2 -24(%ebp) +#define FPU_ovfl_flag -28(%ebp) + +#else +.data +/* + Local storage in a static area: + Result: FPU_accum_3:FPU_accum_2:FPU_accum_1:FPU_accum_0 + Overflow flag: ovfl_flag + */ + .align 4,0 +FPU_accum_3: + .long 0 +FPU_accum_2: + .long 0 +FPU_accum_1: + .long 0 +FPU_accum_0: + .long 0 +FPU_result_1: + .long 0 +FPU_result_2: + .long 0 +FPU_ovfl_flag: + .byte 0 +#endif /* NON_REENTRANT_FPU */ + +#define REGA PARAM1 +#define REGB PARAM2 +#define DEST PARAM3 + +.text +ENTRY(FPU_u_div) + pushl %ebp + movl %esp,%ebp +#ifndef NON_REENTRANT_FPU + subl $28,%esp +#endif /* NON_REENTRANT_FPU */ + + pushl %esi + pushl %edi + pushl %ebx + + movl REGA,%esi + movl REGB,%ebx + movl DEST,%edi + + movswl EXP(%esi),%edx + movswl EXP(%ebx),%eax + subl %eax,%edx + addl EXP_BIAS,%edx + + /* A denormal and a large number can cause an exponent underflow */ + cmpl EXP_WAY_UNDER,%edx + jg xExp_not_underflow + + /* Set to a really low value allow correct handling */ + movl EXP_WAY_UNDER,%edx + +xExp_not_underflow: + + movw %dx,EXP(%edi) + +#ifdef PARANOID +/* testl $0x80000000, SIGH(%esi) // Dividend */ +/* je L_bugged */ + testl $0x80000000, SIGH(%ebx) /* Divisor */ + je L_bugged +#endif /* PARANOID */ + +/* Check if the divisor can be treated as having just 32 bits */ + cmpl $0,SIGL(%ebx) + jnz L_Full_Division /* Can't do a quick divide */ + +/* We should be able to zip through the division here */ + movl SIGH(%ebx),%ecx /* The divisor */ + movl SIGH(%esi),%edx /* Dividend */ + movl SIGL(%esi),%eax /* Dividend */ + + cmpl %ecx,%edx + setaeb FPU_ovfl_flag /* Keep a record */ + jb L_no_adjust + + subl %ecx,%edx /* Prevent the overflow */ + +L_no_adjust: + /* Divide the 64 bit number by the 32 bit denominator */ + divl %ecx + movl %eax,FPU_result_2 + + /* Work on the remainder of the first division */ + xorl %eax,%eax + divl %ecx + movl %eax,FPU_result_1 + + /* Work on the remainder of the 64 bit division */ + xorl %eax,%eax + divl %ecx + + testb $255,FPU_ovfl_flag /* was the num > denom ? */ + je L_no_overflow + + /* Do the shifting here */ + /* increase the exponent */ + incw EXP(%edi) + + /* shift the mantissa right one bit */ + stc /* To set the ms bit */ + rcrl FPU_result_2 + rcrl FPU_result_1 + rcrl %eax + +L_no_overflow: + jmp LRound_precision /* Do the rounding as required */ + + +/*---------------------------------------------------------------------------+ + | Divide: Return arg1/arg2 to arg3. | + | | + | This routine does not use the exponents of arg1 and arg2, but does | + | adjust the exponent of arg3. | + | | + | The maximum returned value is (ignoring exponents) | + | .ffffffff ffffffff | + | ------------------ = 1.ffffffff fffffffe | + | .80000000 00000000 | + | and the minimum is | + | .80000000 00000000 | + | ------------------ = .80000000 00000001 (rounded) | + | .ffffffff ffffffff | + | | + +---------------------------------------------------------------------------*/ + + +L_Full_Division: + /* Save extended dividend in local register */ + movl SIGL(%esi),%eax + movl %eax,FPU_accum_2 + movl SIGH(%esi),%eax + movl %eax,FPU_accum_3 + xorl %eax,%eax + movl %eax,FPU_accum_1 /* zero the extension */ + movl %eax,FPU_accum_0 /* zero the extension */ + + movl SIGL(%esi),%eax /* Get the current num */ + movl SIGH(%esi),%edx + +/*----------------------------------------------------------------------*/ +/* Initialization done. + Do the first 32 bits. */ + + movb $0,FPU_ovfl_flag + cmpl SIGH(%ebx),%edx /* Test for imminent overflow */ + jb LLess_than_1 + ja LGreater_than_1 + + cmpl SIGL(%ebx),%eax + jb LLess_than_1 + +LGreater_than_1: +/* The dividend is greater or equal, would cause overflow */ + setaeb FPU_ovfl_flag /* Keep a record */ + + subl SIGL(%ebx),%eax + sbbl SIGH(%ebx),%edx /* Prevent the overflow */ + movl %eax,FPU_accum_2 + movl %edx,FPU_accum_3 + +LLess_than_1: +/* At this point, we have a dividend < divisor, with a record of + adjustment in FPU_ovfl_flag */ + + /* We will divide by a number which is too large */ + movl SIGH(%ebx),%ecx + addl $1,%ecx + jnc LFirst_div_not_1 + + /* here we need to divide by 100000000h, + i.e., no division at all.. */ + mov %edx,%eax + jmp LFirst_div_done + +LFirst_div_not_1: + divl %ecx /* Divide the numerator by the augmented + denom ms dw */ + +LFirst_div_done: + movl %eax,FPU_result_2 /* Put the result in the answer */ + + mull SIGH(%ebx) /* mul by the ms dw of the denom */ + + subl %eax,FPU_accum_2 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_3 + + movl FPU_result_2,%eax /* Get the result back */ + mull SIGL(%ebx) /* now mul the ls dw of the denom */ + + subl %eax,FPU_accum_1 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_2 + sbbl $0,FPU_accum_3 + je LDo_2nd_32_bits /* Must check for non-zero result here */ + +#ifdef PARANOID + jb L_bugged_1 +#endif /* PARANOID */ + + /* need to subtract another once of the denom */ + incl FPU_result_2 /* Correct the answer */ + + movl SIGL(%ebx),%eax + movl SIGH(%ebx),%edx + subl %eax,FPU_accum_1 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_2 + +#ifdef PARANOID + sbbl $0,FPU_accum_3 + jne L_bugged_1 /* Must check for non-zero result here */ +#endif /* PARANOID */ + +/*----------------------------------------------------------------------*/ +/* Half of the main problem is done, there is just a reduced numerator + to handle now. + Work with the second 32 bits, FPU_accum_0 not used from now on */ +LDo_2nd_32_bits: + movl FPU_accum_2,%edx /* get the reduced num */ + movl FPU_accum_1,%eax + + /* need to check for possible subsequent overflow */ + cmpl SIGH(%ebx),%edx + jb LDo_2nd_div + ja LPrevent_2nd_overflow + + cmpl SIGL(%ebx),%eax + jb LDo_2nd_div + +LPrevent_2nd_overflow: +/* The numerator is greater or equal, would cause overflow */ + /* prevent overflow */ + subl SIGL(%ebx),%eax + sbbl SIGH(%ebx),%edx + movl %edx,FPU_accum_2 + movl %eax,FPU_accum_1 + + incl FPU_result_2 /* Reflect the subtraction in the answer */ + +#ifdef PARANOID + je L_bugged_2 /* Can't bump the result to 1.0 */ +#endif /* PARANOID */ + +LDo_2nd_div: + cmpl $0,%ecx /* augmented denom msw */ + jnz LSecond_div_not_1 + + /* %ecx == 0, we are dividing by 1.0 */ + mov %edx,%eax + jmp LSecond_div_done + +LSecond_div_not_1: + divl %ecx /* Divide the numerator by the denom ms dw */ + +LSecond_div_done: + movl %eax,FPU_result_1 /* Put the result in the answer */ + + mull SIGH(%ebx) /* mul by the ms dw of the denom */ + + subl %eax,FPU_accum_1 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_2 + +#ifdef PARANOID + jc L_bugged_2 +#endif /* PARANOID */ + + movl FPU_result_1,%eax /* Get the result back */ + mull SIGL(%ebx) /* now mul the ls dw of the denom */ + + subl %eax,FPU_accum_0 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_1 /* Subtract from the num local reg */ + sbbl $0,FPU_accum_2 + +#ifdef PARANOID + jc L_bugged_2 +#endif /* PARANOID */ + + jz LDo_3rd_32_bits + +#ifdef PARANOID + cmpl $1,FPU_accum_2 + jne L_bugged_2 +#endif /* PARANOID */ + + /* need to subtract another once of the denom */ + movl SIGL(%ebx),%eax + movl SIGH(%ebx),%edx + subl %eax,FPU_accum_0 /* Subtract from the num local reg */ + sbbl %edx,FPU_accum_1 + sbbl $0,FPU_accum_2 + +#ifdef PARANOID + jc L_bugged_2 + jne L_bugged_2 +#endif /* PARANOID */ + + addl $1,FPU_result_1 /* Correct the answer */ + adcl $0,FPU_result_2 + +#ifdef PARANOID + jc L_bugged_2 /* Must check for non-zero result here */ +#endif /* PARANOID */ + +/*----------------------------------------------------------------------*/ +/* The division is essentially finished here, we just need to perform + tidying operations. + Deal with the 3rd 32 bits */ +LDo_3rd_32_bits: + movl FPU_accum_1,%edx /* get the reduced num */ + movl FPU_accum_0,%eax + + /* need to check for possible subsequent overflow */ + cmpl SIGH(%ebx),%edx /* denom */ + jb LRound_prep + ja LPrevent_3rd_overflow + + cmpl SIGL(%ebx),%eax /* denom */ + jb LRound_prep + +LPrevent_3rd_overflow: + /* prevent overflow */ + subl SIGL(%ebx),%eax + sbbl SIGH(%ebx),%edx + movl %edx,FPU_accum_1 + movl %eax,FPU_accum_0 + + addl $1,FPU_result_1 /* Reflect the subtraction in the answer */ + adcl $0,FPU_result_2 + jne LRound_prep + jnc LRound_prep + + /* This is a tricky spot, there is an overflow of the answer */ + movb $255,FPU_ovfl_flag /* Overflow -> 1.000 */ + +LRound_prep: +/* + * Prepare for rounding. + * To test for rounding, we just need to compare 2*accum with the + * denom. + */ + movl FPU_accum_0,%ecx + movl FPU_accum_1,%edx + movl %ecx,%eax + orl %edx,%eax + jz LRound_ovfl /* The accumulator contains zero. */ + + /* Multiply by 2 */ + clc + rcll $1,%ecx + rcll $1,%edx + jc LRound_large /* No need to compare, denom smaller */ + + subl SIGL(%ebx),%ecx + sbbl SIGH(%ebx),%edx + jnc LRound_not_small + + movl $0x70000000,%eax /* Denom was larger */ + jmp LRound_ovfl + +LRound_not_small: + jnz LRound_large + + movl $0x80000000,%eax /* Remainder was exactly 1/2 denom */ + jmp LRound_ovfl + +LRound_large: + movl $0xff000000,%eax /* Denom was smaller */ + +LRound_ovfl: +/* We are now ready to deal with rounding, but first we must get + the bits properly aligned */ + testb $255,FPU_ovfl_flag /* was the num > denom ? */ + je LRound_precision + + incw EXP(%edi) + + /* shift the mantissa right one bit */ + stc /* Will set the ms bit */ + rcrl FPU_result_2 + rcrl FPU_result_1 + rcrl %eax + +/* Round the result as required */ +LRound_precision: + decw EXP(%edi) /* binary point between 1st & 2nd bits */ + + movl %eax,%edx + movl FPU_result_1,%ebx + movl FPU_result_2,%eax + jmp fpu_reg_round + + +#ifdef PARANOID +/* The logic is wrong if we got here */ +L_bugged: + pushl EX_INTERNAL|0x202 + call EXCEPTION + pop %ebx + jmp L_exit + +L_bugged_1: + pushl EX_INTERNAL|0x203 + call EXCEPTION + pop %ebx + jmp L_exit + +L_bugged_2: + pushl EX_INTERNAL|0x204 + call EXCEPTION + pop %ebx + jmp L_exit + +L_exit: + movl $-1,%eax + popl %ebx + popl %edi + popl %esi + + leave + ret +#endif /* PARANOID */ diff --git a/src/wraith/math-emu/reg_u_mul.S b/src/wraith/math-emu/reg_u_mul.S new file mode 100644 index 000000000..973f12af9 --- /dev/null +++ b/src/wraith/math-emu/reg_u_mul.S @@ -0,0 +1,148 @@ + .file "reg_u_mul.S" +/*---------------------------------------------------------------------------+ + | reg_u_mul.S | + | | + | Core multiplication routine | + | | + | Copyright (C) 1992,1993,1995,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | Basic multiplication routine. | + | Does not check the resulting exponent for overflow/underflow | + | | + | FPU_u_mul(FPU_REG *a, FPU_REG *b, FPU_REG *c, unsigned int cw); | + | | + | Internal working is at approx 128 bits. | + | Result is rounded to nearest 53 or 64 bits, using "nearest or even". | + +---------------------------------------------------------------------------*/ + +#include "exception.h" +#include "fpu_emu.h" +#include "control_w.h" + + + +#ifndef NON_REENTRANT_FPU +/* Local storage on the stack: */ +#define FPU_accum_0 -4(%ebp) /* ms word */ +#define FPU_accum_1 -8(%ebp) + +#else +/* Local storage in a static area: */ +.data + .align 4,0 +FPU_accum_0: + .long 0 +FPU_accum_1: + .long 0 +#endif /* NON_REENTRANT_FPU */ + + +.text +ENTRY(FPU_u_mul) + pushl %ebp + movl %esp,%ebp +#ifndef NON_REENTRANT_FPU + subl $8,%esp +#endif /* NON_REENTRANT_FPU */ + + pushl %esi + pushl %edi + pushl %ebx + + movl PARAM1,%esi + movl PARAM2,%edi + +#ifdef PARANOID + testl $0x80000000,SIGH(%esi) + jz L_bugged + testl $0x80000000,SIGH(%edi) + jz L_bugged +#endif /* PARANOID */ + + xorl %ecx,%ecx + xorl %ebx,%ebx + + movl SIGL(%esi),%eax + mull SIGL(%edi) + movl %eax,FPU_accum_0 + movl %edx,FPU_accum_1 + + movl SIGL(%esi),%eax + mull SIGH(%edi) + addl %eax,FPU_accum_1 + adcl %edx,%ebx +/* adcl $0,%ecx // overflow here is not possible */ + + movl SIGH(%esi),%eax + mull SIGL(%edi) + addl %eax,FPU_accum_1 + adcl %edx,%ebx + adcl $0,%ecx + + movl SIGH(%esi),%eax + mull SIGH(%edi) + addl %eax,%ebx + adcl %edx,%ecx + + /* Get the sum of the exponents. */ + movl PARAM6,%eax + subl EXP_BIAS-1,%eax + + /* Two denormals can cause an exponent underflow */ + cmpl EXP_WAY_UNDER,%eax + jg Exp_not_underflow + + /* Set to a really low value allow correct handling */ + movl EXP_WAY_UNDER,%eax + +Exp_not_underflow: + +/* Have now finished with the sources */ + movl PARAM3,%edi /* Point to the destination */ + movw %ax,EXP(%edi) + +/* Now make sure that the result is normalized */ + testl $0x80000000,%ecx + jnz LResult_Normalised + + /* Normalize by shifting left one bit */ + shll $1,FPU_accum_0 + rcll $1,FPU_accum_1 + rcll $1,%ebx + rcll $1,%ecx + decw EXP(%edi) + +LResult_Normalised: + movl FPU_accum_0,%eax + movl FPU_accum_1,%edx + orl %eax,%eax + jz L_extent_zero + + orl $1,%edx + +L_extent_zero: + movl %ecx,%eax + jmp fpu_reg_round + + +#ifdef PARANOID +L_bugged: + pushl EX_INTERNAL|0x205 + call EXCEPTION + pop %ebx + jmp L_exit + +L_exit: + popl %ebx + popl %edi + popl %esi + leave + ret +#endif /* PARANOID */ + diff --git a/src/wraith/math-emu/reg_u_sub.S b/src/wraith/math-emu/reg_u_sub.S new file mode 100644 index 000000000..1b6c24801 --- /dev/null +++ b/src/wraith/math-emu/reg_u_sub.S @@ -0,0 +1,272 @@ + .file "reg_u_sub.S" +/*---------------------------------------------------------------------------+ + | reg_u_sub.S | + | | + | Core floating point subtraction routine. | + | | + | Copyright (C) 1992,1993,1995,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@suburbia.net | + | | + | Call from C as: | + | int FPU_u_sub(FPU_REG *arg1, FPU_REG *arg2, FPU_REG *answ, | + | int control_w) | + | Return value is the tag of the answer, or-ed with FPU_Exception if | + | one was raised, or -1 on internal error. | + | | + +---------------------------------------------------------------------------*/ + +/* + | Kernel subtraction routine FPU_u_sub(reg *arg1, reg *arg2, reg *answ). + | Takes two valid reg f.p. numbers (TAG_Valid), which are + | treated as unsigned numbers, + | and returns their difference as a TAG_Valid or TAG_Zero f.p. + | number. + | The first number (arg1) must be the larger. + | The returned number is normalized. + | Basic checks are performed if PARANOID is defined. + */ + +#include "exception.h" +#include "fpu_emu.h" +#include "control_w.h" + +.text +ENTRY(FPU_u_sub) + pushl %ebp + movl %esp,%ebp + pushl %esi + pushl %edi + pushl %ebx + + movl PARAM1,%esi /* source 1 */ + movl PARAM2,%edi /* source 2 */ + + movl PARAM6,%ecx + subl PARAM7,%ecx /* exp1 - exp2 */ + +#ifdef PARANOID + /* source 2 is always smaller than source 1 */ + js L_bugged_1 + + testl $0x80000000,SIGH(%edi) /* The args are assumed to be be normalized */ + je L_bugged_2 + + testl $0x80000000,SIGH(%esi) + je L_bugged_2 +#endif /* PARANOID */ + +/*--------------------------------------+ + | Form a register holding the | + | smaller number | + +--------------------------------------*/ + movl SIGH(%edi),%eax /* register ms word */ + movl SIGL(%edi),%ebx /* register ls word */ + + movl PARAM3,%edi /* destination */ + movl PARAM6,%edx + movw %dx,EXP(%edi) /* Copy exponent to destination */ + + xorl %edx,%edx /* register extension */ + +/*--------------------------------------+ + | Shift the temporary register | + | right the required number of | + | places. | + +--------------------------------------*/ + + cmpw $32,%cx /* shrd only works for 0..31 bits */ + jnc L_more_than_31 + +/* less than 32 bits */ + shrd %cl,%ebx,%edx + shrd %cl,%eax,%ebx + shr %cl,%eax + jmp L_shift_done + +L_more_than_31: + cmpw $64,%cx + jnc L_more_than_63 + + subb $32,%cl + jz L_exactly_32 + + shrd %cl,%eax,%edx + shr %cl,%eax + orl %ebx,%ebx + jz L_more_31_no_low /* none of the lowest bits is set */ + + orl $1,%edx /* record the fact in the extension */ + +L_more_31_no_low: + movl %eax,%ebx + xorl %eax,%eax + jmp L_shift_done + +L_exactly_32: + movl %ebx,%edx + movl %eax,%ebx + xorl %eax,%eax + jmp L_shift_done + +L_more_than_63: + cmpw $65,%cx + jnc L_more_than_64 + + /* Shift right by 64 bits */ + movl %eax,%edx + orl %ebx,%ebx + jz L_more_63_no_low + + orl $1,%edx + jmp L_more_63_no_low + +L_more_than_64: + jne L_more_than_65 + + /* Shift right by 65 bits */ + /* Carry is clear if we get here */ + movl %eax,%edx + rcrl %edx + jnc L_shift_65_nc + + orl $1,%edx + jmp L_more_63_no_low + +L_shift_65_nc: + orl %ebx,%ebx + jz L_more_63_no_low + + orl $1,%edx + jmp L_more_63_no_low + +L_more_than_65: + movl $1,%edx /* The shifted nr always at least one '1' */ + +L_more_63_no_low: + xorl %ebx,%ebx + xorl %eax,%eax + +L_shift_done: +L_subtr: +/*------------------------------+ + | Do the subtraction | + +------------------------------*/ + xorl %ecx,%ecx + subl %edx,%ecx + movl %ecx,%edx + movl SIGL(%esi),%ecx + sbbl %ebx,%ecx + movl %ecx,%ebx + movl SIGH(%esi),%ecx + sbbl %eax,%ecx + movl %ecx,%eax + +#ifdef PARANOID + /* We can never get a borrow */ + jc L_bugged +#endif /* PARANOID */ + +/*--------------------------------------+ + | Normalize the result | + +--------------------------------------*/ + testl $0x80000000,%eax + jnz L_round /* no shifting needed */ + + orl %eax,%eax + jnz L_shift_1 /* shift left 1 - 31 bits */ + + orl %ebx,%ebx + jnz L_shift_32 /* shift left 32 - 63 bits */ + +/* + * A rare case, the only one which is non-zero if we got here + * is: 1000000 .... 0000 + * -0111111 .... 1111 1 + * -------------------- + * 0000000 .... 0000 1 + */ + + cmpl $0x80000000,%edx + jnz L_must_be_zero + + /* Shift left 64 bits */ + subw $64,EXP(%edi) + xchg %edx,%eax + jmp fpu_reg_round + +L_must_be_zero: +#ifdef PARANOID + orl %edx,%edx + jnz L_bugged_3 +#endif /* PARANOID */ + + /* The result is zero */ + movw $0,EXP(%edi) /* exponent */ + movl $0,SIGL(%edi) + movl $0,SIGH(%edi) + movl TAG_Zero,%eax + jmp L_exit + +L_shift_32: + movl %ebx,%eax + movl %edx,%ebx + movl $0,%edx + subw $32,EXP(%edi) /* Can get underflow here */ + +/* We need to shift left by 1 - 31 bits */ +L_shift_1: + bsrl %eax,%ecx /* get the required shift in %ecx */ + subl $31,%ecx + negl %ecx + shld %cl,%ebx,%eax + shld %cl,%edx,%ebx + shl %cl,%edx + subw %cx,EXP(%edi) /* Can get underflow here */ + +L_round: + jmp fpu_reg_round /* Round the result */ + + +#ifdef PARANOID +L_bugged_1: + pushl EX_INTERNAL|0x206 + call EXCEPTION + pop %ebx + jmp L_error_exit + +L_bugged_2: + pushl EX_INTERNAL|0x209 + call EXCEPTION + pop %ebx + jmp L_error_exit + +L_bugged_3: + pushl EX_INTERNAL|0x210 + call EXCEPTION + pop %ebx + jmp L_error_exit + +L_bugged_4: + pushl EX_INTERNAL|0x211 + call EXCEPTION + pop %ebx + jmp L_error_exit + +L_bugged: + pushl EX_INTERNAL|0x212 + call EXCEPTION + pop %ebx + jmp L_error_exit + +L_error_exit: + movl $-1,%eax + +#endif /* PARANOID */ + +L_exit: + popl %ebx + popl %edi + popl %esi + leave + ret diff --git a/src/wraith/math-emu/round_Xsig.S b/src/wraith/math-emu/round_Xsig.S new file mode 100644 index 000000000..bbe0e8771 --- /dev/null +++ b/src/wraith/math-emu/round_Xsig.S @@ -0,0 +1,141 @@ +/*---------------------------------------------------------------------------+ + | round_Xsig.S | + | | + | Copyright (C) 1992,1993,1994,1995 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@jacobi.maths.monash.edu.au | + | | + | Normalize and round a 12 byte quantity. | + | Call from C as: | + | int round_Xsig(Xsig *n) | + | | + | Normalize a 12 byte quantity. | + | Call from C as: | + | int norm_Xsig(Xsig *n) | + | | + | Each function returns the size of the shift (nr of bits). | + | | + +---------------------------------------------------------------------------*/ + .file "round_Xsig.S" + +#include "fpu_emu.h" + + +.text +ENTRY(round_Xsig) + pushl %ebp + movl %esp,%ebp + pushl %ebx /* Reserve some space */ + pushl %ebx + pushl %esi + + movl PARAM1,%esi + + movl 8(%esi),%edx + movl 4(%esi),%ebx + movl (%esi),%eax + + movl $0,-4(%ebp) + + orl %edx,%edx /* ms bits */ + js L_round /* Already normalized */ + jnz L_shift_1 /* Shift left 1 - 31 bits */ + + movl %ebx,%edx + movl %eax,%ebx + xorl %eax,%eax + movl $-32,-4(%ebp) + +/* We need to shift left by 1 - 31 bits */ +L_shift_1: + bsrl %edx,%ecx /* get the required shift in %ecx */ + subl $31,%ecx + negl %ecx + subl %ecx,-4(%ebp) + shld %cl,%ebx,%edx + shld %cl,%eax,%ebx + shl %cl,%eax + +L_round: + testl $0x80000000,%eax + jz L_exit + + addl $1,%ebx + adcl $0,%edx + jnz L_exit + + movl $0x80000000,%edx + incl -4(%ebp) + +L_exit: + movl %edx,8(%esi) + movl %ebx,4(%esi) + movl %eax,(%esi) + + movl -4(%ebp),%eax + + popl %esi + popl %ebx + leave + ret + + + + +ENTRY(norm_Xsig) + pushl %ebp + movl %esp,%ebp + pushl %ebx /* Reserve some space */ + pushl %ebx + pushl %esi + + movl PARAM1,%esi + + movl 8(%esi),%edx + movl 4(%esi),%ebx + movl (%esi),%eax + + movl $0,-4(%ebp) + + orl %edx,%edx /* ms bits */ + js L_n_exit /* Already normalized */ + jnz L_n_shift_1 /* Shift left 1 - 31 bits */ + + movl %ebx,%edx + movl %eax,%ebx + xorl %eax,%eax + movl $-32,-4(%ebp) + + orl %edx,%edx /* ms bits */ + js L_n_exit /* Normalized now */ + jnz L_n_shift_1 /* Shift left 1 - 31 bits */ + + movl %ebx,%edx + movl %eax,%ebx + xorl %eax,%eax + addl $-32,-4(%ebp) + jmp L_n_exit /* Might not be normalized, + but shift no more. */ + +/* We need to shift left by 1 - 31 bits */ +L_n_shift_1: + bsrl %edx,%ecx /* get the required shift in %ecx */ + subl $31,%ecx + negl %ecx + subl %ecx,-4(%ebp) + shld %cl,%ebx,%edx + shld %cl,%eax,%ebx + shl %cl,%eax + +L_n_exit: + movl %edx,8(%esi) + movl %ebx,4(%esi) + movl %eax,(%esi) + + movl -4(%ebp),%eax + + popl %esi + popl %ebx + leave + ret + diff --git a/src/wraith/math-emu/shr_Xsig.S b/src/wraith/math-emu/shr_Xsig.S new file mode 100644 index 000000000..31cdd118e --- /dev/null +++ b/src/wraith/math-emu/shr_Xsig.S @@ -0,0 +1,87 @@ + .file "shr_Xsig.S" +/*---------------------------------------------------------------------------+ + | shr_Xsig.S | + | | + | 12 byte right shift function | + | | + | Copyright (C) 1992,1994,1995 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@jacobi.maths.monash.edu.au | + | | + | Call from C as: | + | void shr_Xsig(Xsig *arg, unsigned nr) | + | | + | Extended shift right function. | + | Fastest for small shifts. | + | Shifts the 12 byte quantity pointed to by the first arg (arg) | + | right by the number of bits specified by the second arg (nr). | + | | + +---------------------------------------------------------------------------*/ + +#include "fpu_emu.h" + +.text +ENTRY(shr_Xsig) + push %ebp + movl %esp,%ebp + pushl %esi + movl PARAM2,%ecx + movl PARAM1,%esi + cmpl $32,%ecx /* shrd only works for 0..31 bits */ + jnc L_more_than_31 + +/* less than 32 bits */ + pushl %ebx + movl (%esi),%eax /* lsl */ + movl 4(%esi),%ebx /* midl */ + movl 8(%esi),%edx /* msl */ + shrd %cl,%ebx,%eax + shrd %cl,%edx,%ebx + shr %cl,%edx + movl %eax,(%esi) + movl %ebx,4(%esi) + movl %edx,8(%esi) + popl %ebx + popl %esi + leave + ret + +L_more_than_31: + cmpl $64,%ecx + jnc L_more_than_63 + + subb $32,%cl + movl 4(%esi),%eax /* midl */ + movl 8(%esi),%edx /* msl */ + shrd %cl,%edx,%eax + shr %cl,%edx + movl %eax,(%esi) + movl %edx,4(%esi) + movl $0,8(%esi) + popl %esi + leave + ret + +L_more_than_63: + cmpl $96,%ecx + jnc L_more_than_95 + + subb $64,%cl + movl 8(%esi),%eax /* msl */ + shr %cl,%eax + xorl %edx,%edx + movl %eax,(%esi) + movl %edx,4(%esi) + movl %edx,8(%esi) + popl %esi + leave + ret + +L_more_than_95: + xorl %eax,%eax + movl %eax,(%esi) + movl %eax,4(%esi) + movl %eax,8(%esi) + popl %esi + leave + ret diff --git a/src/wraith/math-emu/status_w.h b/src/wraith/math-emu/status_w.h new file mode 100644 index 000000000..78d7b7689 --- /dev/null +++ b/src/wraith/math-emu/status_w.h @@ -0,0 +1,65 @@ +/*---------------------------------------------------------------------------+ + | status_w.h | + | | + | Copyright (C) 1992,1993 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@vaxc.cc.monash.edu.au | + | | + +---------------------------------------------------------------------------*/ + +#ifndef _STATUS_H_ +#define _STATUS_H_ + +#include "fpu_emu.h" /* for definition of PECULIAR_486 */ + +#ifdef __ASSEMBLY__ +#define Const__(x) $##x +#else +#define Const__(x) x +#endif + +#define SW_Backward Const__(0x8000) /* backward compatibility */ +#define SW_C3 Const__(0x4000) /* condition bit 3 */ +#define SW_Top Const__(0x3800) /* top of stack */ +#define SW_Top_Shift Const__(11) /* shift for top of stack bits */ +#define SW_C2 Const__(0x0400) /* condition bit 2 */ +#define SW_C1 Const__(0x0200) /* condition bit 1 */ +#define SW_C0 Const__(0x0100) /* condition bit 0 */ +#define SW_Summary Const__(0x0080) /* exception summary */ +#define SW_Stack_Fault Const__(0x0040) /* stack fault */ +#define SW_Precision Const__(0x0020) /* loss of precision */ +#define SW_Underflow Const__(0x0010) /* underflow */ +#define SW_Overflow Const__(0x0008) /* overflow */ +#define SW_Zero_Div Const__(0x0004) /* divide by zero */ +#define SW_Denorm_Op Const__(0x0002) /* denormalized operand */ +#define SW_Invalid Const__(0x0001) /* invalid operation */ + +#define SW_Exc_Mask Const__(0x27f) /* Status word exception bit mask */ + +#ifndef __ASSEMBLY__ + +#define COMP_A_gt_B 1 +#define COMP_A_eq_B 2 +#define COMP_A_lt_B 3 +#define COMP_No_Comp 4 +#define COMP_Denormal 0x20 +#define COMP_NaN 0x40 +#define COMP_SNaN 0x80 + +#define status_word() \ + ((partial_status & ~SW_Top & 0xffff) | ((top << SW_Top_Shift) & SW_Top)) +#define setcc(cc) ({ \ + partial_status &= ~(SW_C0|SW_C1|SW_C2|SW_C3); \ + partial_status |= (cc) & (SW_C0|SW_C1|SW_C2|SW_C3); }) + +#ifdef PECULIAR_486 + /* Default, this conveys no information, but an 80486 does it. */ + /* Clear the SW_C1 bit, "other bits undefined". */ +# define clear_C1() { partial_status &= ~SW_C1; } +# else +# define clear_C1() +#endif /* PECULIAR_486 */ + +#endif /* __ASSEMBLY__ */ + +#endif /* _STATUS_H_ */ diff --git a/src/wraith/math-emu/version.h b/src/wraith/math-emu/version.h new file mode 100644 index 000000000..a0d73a1d2 --- /dev/null +++ b/src/wraith/math-emu/version.h @@ -0,0 +1,12 @@ +/*---------------------------------------------------------------------------+ + | version.h | + | | + | | + | Copyright (C) 1992,1993,1994,1996,1997,1999 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | + | E-mail billm@melbpc.org.au | + | | + | | + +---------------------------------------------------------------------------*/ + +#define FPU_VERSION "wm-FPU-emu version 2.01" diff --git a/src/wraith/math-emu/wm_shrx.S b/src/wraith/math-emu/wm_shrx.S new file mode 100644 index 000000000..518428317 --- /dev/null +++ b/src/wraith/math-emu/wm_shrx.S @@ -0,0 +1,204 @@ + .file "wm_shrx.S" +/*---------------------------------------------------------------------------+ + | wm_shrx.S | + | | + | 64 bit right shift functions | + | | + | Copyright (C) 1992,1995 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@jacobi.maths.monash.edu.au | + | | + | Call from C as: | + | unsigned FPU_shrx(void *arg1, unsigned arg2) | + | and | + | unsigned FPU_shrxs(void *arg1, unsigned arg2) | + | | + +---------------------------------------------------------------------------*/ + +#include "fpu_emu.h" + +.text +/*---------------------------------------------------------------------------+ + | unsigned FPU_shrx(void *arg1, unsigned arg2) | + | | + | Extended shift right function. | + | Fastest for small shifts. | + | Shifts the 64 bit quantity pointed to by the first arg (arg1) | + | right by the number of bits specified by the second arg (arg2). | + | Forms a 96 bit quantity from the 64 bit arg and eax: | + | [ 64 bit arg ][ eax ] | + | shift right ---------> | + | The eax register is initialized to 0 before the shifting. | + | Results returned in the 64 bit arg and eax. | + +---------------------------------------------------------------------------*/ + +ENTRY(FPU_shrx) + push %ebp + movl %esp,%ebp + pushl %esi + movl PARAM2,%ecx + movl PARAM1,%esi + cmpl $32,%ecx /* shrd only works for 0..31 bits */ + jnc L_more_than_31 + +/* less than 32 bits */ + pushl %ebx + movl (%esi),%ebx /* lsl */ + movl 4(%esi),%edx /* msl */ + xorl %eax,%eax /* extension */ + shrd %cl,%ebx,%eax + shrd %cl,%edx,%ebx + shr %cl,%edx + movl %ebx,(%esi) + movl %edx,4(%esi) + popl %ebx + popl %esi + leave + ret + +L_more_than_31: + cmpl $64,%ecx + jnc L_more_than_63 + + subb $32,%cl + movl (%esi),%eax /* lsl */ + movl 4(%esi),%edx /* msl */ + shrd %cl,%edx,%eax + shr %cl,%edx + movl %edx,(%esi) + movl $0,4(%esi) + popl %esi + leave + ret + +L_more_than_63: + cmpl $96,%ecx + jnc L_more_than_95 + + subb $64,%cl + movl 4(%esi),%eax /* msl */ + shr %cl,%eax + xorl %edx,%edx + movl %edx,(%esi) + movl %edx,4(%esi) + popl %esi + leave + ret + +L_more_than_95: + xorl %eax,%eax + movl %eax,(%esi) + movl %eax,4(%esi) + popl %esi + leave + ret + + +/*---------------------------------------------------------------------------+ + | unsigned FPU_shrxs(void *arg1, unsigned arg2) | + | | + | Extended shift right function (optimized for small floating point | + | integers). | + | Shifts the 64 bit quantity pointed to by the first arg (arg1) | + | right by the number of bits specified by the second arg (arg2). | + | Forms a 96 bit quantity from the 64 bit arg and eax: | + | [ 64 bit arg ][ eax ] | + | shift right ---------> | + | The eax register is initialized to 0 before the shifting. | + | The lower 8 bits of eax are lost and replaced by a flag which is | + | set (to 0x01) if any bit, apart from the first one, is set in the | + | part which has been shifted out of the arg. | + | Results returned in the 64 bit arg and eax. | + +---------------------------------------------------------------------------*/ +ENTRY(FPU_shrxs) + push %ebp + movl %esp,%ebp + pushl %esi + pushl %ebx + movl PARAM2,%ecx + movl PARAM1,%esi + cmpl $64,%ecx /* shrd only works for 0..31 bits */ + jnc Ls_more_than_63 + + cmpl $32,%ecx /* shrd only works for 0..31 bits */ + jc Ls_less_than_32 + +/* We got here without jumps by assuming that the most common requirement + is for small integers */ +/* Shift by [32..63] bits */ + subb $32,%cl + movl (%esi),%eax /* lsl */ + movl 4(%esi),%edx /* msl */ + xorl %ebx,%ebx + shrd %cl,%eax,%ebx + shrd %cl,%edx,%eax + shr %cl,%edx + orl %ebx,%ebx /* test these 32 bits */ + setne %bl + test $0x7fffffff,%eax /* and 31 bits here */ + setne %bh + orw %bx,%bx /* Any of the 63 bit set ? */ + setne %al + movl %edx,(%esi) + movl $0,4(%esi) + popl %ebx + popl %esi + leave + ret + +/* Shift by [0..31] bits */ +Ls_less_than_32: + movl (%esi),%ebx /* lsl */ + movl 4(%esi),%edx /* msl */ + xorl %eax,%eax /* extension */ + shrd %cl,%ebx,%eax + shrd %cl,%edx,%ebx + shr %cl,%edx + test $0x7fffffff,%eax /* only need to look at eax here */ + setne %al + movl %ebx,(%esi) + movl %edx,4(%esi) + popl %ebx + popl %esi + leave + ret + +/* Shift by [64..95] bits */ +Ls_more_than_63: + cmpl $96,%ecx + jnc Ls_more_than_95 + + subb $64,%cl + movl (%esi),%ebx /* lsl */ + movl 4(%esi),%eax /* msl */ + xorl %edx,%edx /* extension */ + shrd %cl,%ebx,%edx + shrd %cl,%eax,%ebx + shr %cl,%eax + orl %ebx,%edx + setne %bl + test $0x7fffffff,%eax /* only need to look at eax here */ + setne %bh + orw %bx,%bx + setne %al + xorl %edx,%edx + movl %edx,(%esi) /* set to zero */ + movl %edx,4(%esi) /* set to zero */ + popl %ebx + popl %esi + leave + ret + +Ls_more_than_95: +/* Shift by [96..inf) bits */ + xorl %eax,%eax + movl (%esi),%ebx + orl 4(%esi),%ebx + setne %al + xorl %ebx,%ebx + movl %ebx,(%esi) + movl %ebx,4(%esi) + popl %ebx + popl %esi + leave + ret diff --git a/src/wraith/math-emu/wm_sqrt.S b/src/wraith/math-emu/wm_sqrt.S new file mode 100644 index 000000000..d258f5956 --- /dev/null +++ b/src/wraith/math-emu/wm_sqrt.S @@ -0,0 +1,470 @@ + .file "wm_sqrt.S" +/*---------------------------------------------------------------------------+ + | wm_sqrt.S | + | | + | Fixed point arithmetic square root evaluation. | + | | + | Copyright (C) 1992,1993,1995,1997 | + | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | + | Australia. E-mail billm@suburbia.net | + | | + | Call from C as: | + | int wm_sqrt(FPU_REG *n, unsigned int control_word) | + | | + +---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------+ + | wm_sqrt(FPU_REG *n, unsigned int control_word) | + | returns the square root of n in n. | + | | + | Use Newton's method to compute the square root of a number, which must | + | be in the range [1.0 .. 4.0), to 64 bits accuracy. | + | Does not check the sign or tag of the argument. | + | Sets the exponent, but not the sign or tag of the result. | + | | + | The guess is kept in %esi:%edi | + +---------------------------------------------------------------------------*/ + +#include "exception.h" +#include "fpu_emu.h" + + +#ifndef NON_REENTRANT_FPU +/* Local storage on the stack: */ +#define FPU_accum_3 -4(%ebp) /* ms word */ +#define FPU_accum_2 -8(%ebp) +#define FPU_accum_1 -12(%ebp) +#define FPU_accum_0 -16(%ebp) + +/* + * The de-normalised argument: + * sq_2 sq_1 sq_0 + * b b b b b b b ... b b b b b b .... b b b b 0 0 0 ... 0 + * ^ binary point here + */ +#define FPU_fsqrt_arg_2 -20(%ebp) /* ms word */ +#define FPU_fsqrt_arg_1 -24(%ebp) +#define FPU_fsqrt_arg_0 -28(%ebp) /* ls word, at most the ms bit is set */ + +#else +/* Local storage in a static area: */ +.data + .align 4,0 +FPU_accum_3: + .long 0 /* ms word */ +FPU_accum_2: + .long 0 +FPU_accum_1: + .long 0 +FPU_accum_0: + .long 0 + +/* The de-normalised argument: + sq_2 sq_1 sq_0 + b b b b b b b ... b b b b b b .... b b b b 0 0 0 ... 0 + ^ binary point here + */ +FPU_fsqrt_arg_2: + .long 0 /* ms word */ +FPU_fsqrt_arg_1: + .long 0 +FPU_fsqrt_arg_0: + .long 0 /* ls word, at most the ms bit is set */ +#endif /* NON_REENTRANT_FPU */ + + +.text +ENTRY(wm_sqrt) + pushl %ebp + movl %esp,%ebp +#ifndef NON_REENTRANT_FPU + subl $28,%esp +#endif /* NON_REENTRANT_FPU */ + pushl %esi + pushl %edi + pushl %ebx + + movl PARAM1,%esi + + movl SIGH(%esi),%eax + movl SIGL(%esi),%ecx + xorl %edx,%edx + +/* We use a rough linear estimate for the first guess.. */ + + cmpw EXP_BIAS,EXP(%esi) + jnz sqrt_arg_ge_2 + + shrl $1,%eax /* arg is in the range [1.0 .. 2.0) */ + rcrl $1,%ecx + rcrl $1,%edx + +sqrt_arg_ge_2: +/* From here on, n is never accessed directly again until it is + replaced by the answer. */ + + movl %eax,FPU_fsqrt_arg_2 /* ms word of n */ + movl %ecx,FPU_fsqrt_arg_1 + movl %edx,FPU_fsqrt_arg_0 + +/* Make a linear first estimate */ + shrl $1,%eax + addl $0x40000000,%eax + movl $0xaaaaaaaa,%ecx + mull %ecx + shll %edx /* max result was 7fff... */ + testl $0x80000000,%edx /* but min was 3fff... */ + jnz sqrt_prelim_no_adjust + + movl $0x80000000,%edx /* round up */ + +sqrt_prelim_no_adjust: + movl %edx,%esi /* Our first guess */ + +/* We have now computed (approx) (2 + x) / 3, which forms the basis + for a few iterations of Newton's method */ + + movl FPU_fsqrt_arg_2,%ecx /* ms word */ + +/* + * From our initial estimate, three iterations are enough to get us + * to 30 bits or so. This will then allow two iterations at better + * precision to complete the process. + */ + +/* Compute (g + n/g)/2 at each iteration (g is the guess). */ + shrl %ecx /* Doing this first will prevent a divide */ + /* overflow later. */ + + movl %ecx,%edx /* msw of the arg / 2 */ + divl %esi /* current estimate */ + shrl %esi /* divide by 2 */ + addl %eax,%esi /* the new estimate */ + + movl %ecx,%edx + divl %esi + shrl %esi + addl %eax,%esi + + movl %ecx,%edx + divl %esi + shrl %esi + addl %eax,%esi + +/* + * Now that an estimate accurate to about 30 bits has been obtained (in %esi), + * we improve it to 60 bits or so. + * + * The strategy from now on is to compute new estimates from + * guess := guess + (n - guess^2) / (2 * guess) + */ + +/* First, find the square of the guess */ + movl %esi,%eax + mull %esi +/* guess^2 now in %edx:%eax */ + + movl FPU_fsqrt_arg_1,%ecx + subl %ecx,%eax + movl FPU_fsqrt_arg_2,%ecx /* ms word of normalized n */ + sbbl %ecx,%edx + jnc sqrt_stage_2_positive + +/* Subtraction gives a negative result, + negate the result before division. */ + notl %edx + notl %eax + addl $1,%eax + adcl $0,%edx + + divl %esi + movl %eax,%ecx + + movl %edx,%eax + divl %esi + jmp sqrt_stage_2_finish + +sqrt_stage_2_positive: + divl %esi + movl %eax,%ecx + + movl %edx,%eax + divl %esi + + notl %ecx + notl %eax + addl $1,%eax + adcl $0,%ecx + +sqrt_stage_2_finish: + sarl $1,%ecx /* divide by 2 */ + rcrl $1,%eax + + /* Form the new estimate in %esi:%edi */ + movl %eax,%edi + addl %ecx,%esi + + jnz sqrt_stage_2_done /* result should be [1..2) */ + +#ifdef PARANOID +/* It should be possible to get here only if the arg is ffff....ffff */ + cmp $0xffffffff,FPU_fsqrt_arg_1 + jnz sqrt_stage_2_error +#endif /* PARANOID */ + +/* The best rounded result. */ + xorl %eax,%eax + decl %eax + movl %eax,%edi + movl %eax,%esi + movl $0x7fffffff,%eax + jmp sqrt_round_result + +#ifdef PARANOID +sqrt_stage_2_error: + pushl EX_INTERNAL|0x213 + call EXCEPTION +#endif /* PARANOID */ + +sqrt_stage_2_done: + +/* Now the square root has been computed to better than 60 bits. */ + +/* Find the square of the guess. */ + movl %edi,%eax /* ls word of guess */ + mull %edi + movl %edx,FPU_accum_1 + + movl %esi,%eax + mull %esi + movl %edx,FPU_accum_3 + movl %eax,FPU_accum_2 + + movl %edi,%eax + mull %esi + addl %eax,FPU_accum_1 + adcl %edx,FPU_accum_2 + adcl $0,FPU_accum_3 + +/* movl %esi,%eax */ +/* mull %edi */ + addl %eax,FPU_accum_1 + adcl %edx,FPU_accum_2 + adcl $0,FPU_accum_3 + +/* guess^2 now in FPU_accum_3:FPU_accum_2:FPU_accum_1 */ + + movl FPU_fsqrt_arg_0,%eax /* get normalized n */ + subl %eax,FPU_accum_1 + movl FPU_fsqrt_arg_1,%eax + sbbl %eax,FPU_accum_2 + movl FPU_fsqrt_arg_2,%eax /* ms word of normalized n */ + sbbl %eax,FPU_accum_3 + jnc sqrt_stage_3_positive + +/* Subtraction gives a negative result, + negate the result before division */ + notl FPU_accum_1 + notl FPU_accum_2 + notl FPU_accum_3 + addl $1,FPU_accum_1 + adcl $0,FPU_accum_2 + +#ifdef PARANOID + adcl $0,FPU_accum_3 /* This must be zero */ + jz sqrt_stage_3_no_error + +sqrt_stage_3_error: + pushl EX_INTERNAL|0x207 + call EXCEPTION + +sqrt_stage_3_no_error: +#endif /* PARANOID */ + + movl FPU_accum_2,%edx + movl FPU_accum_1,%eax + divl %esi + movl %eax,%ecx + + movl %edx,%eax + divl %esi + + sarl $1,%ecx /* divide by 2 */ + rcrl $1,%eax + + /* prepare to round the result */ + + addl %ecx,%edi + adcl $0,%esi + + jmp sqrt_stage_3_finished + +sqrt_stage_3_positive: + movl FPU_accum_2,%edx + movl FPU_accum_1,%eax + divl %esi + movl %eax,%ecx + + movl %edx,%eax + divl %esi + + sarl $1,%ecx /* divide by 2 */ + rcrl $1,%eax + + /* prepare to round the result */ + + notl %eax /* Negate the correction term */ + notl %ecx + addl $1,%eax + adcl $0,%ecx /* carry here ==> correction == 0 */ + adcl $0xffffffff,%esi + + addl %ecx,%edi + adcl $0,%esi + +sqrt_stage_3_finished: + +/* + * The result in %esi:%edi:%esi should be good to about 90 bits here, + * and the rounding information here does not have sufficient accuracy + * in a few rare cases. + */ + cmpl $0xffffffe0,%eax + ja sqrt_near_exact_x + + cmpl $0x00000020,%eax + jb sqrt_near_exact + + cmpl $0x7fffffe0,%eax + jb sqrt_round_result + + cmpl $0x80000020,%eax + jb sqrt_get_more_precision + +sqrt_round_result: +/* Set up for rounding operations */ + movl %eax,%edx + movl %esi,%eax + movl %edi,%ebx + movl PARAM1,%edi + movw EXP_BIAS,EXP(%edi) /* Result is in [1.0 .. 2.0) */ + jmp fpu_reg_round + + +sqrt_near_exact_x: +/* First, the estimate must be rounded up. */ + addl $1,%edi + adcl $0,%esi + +sqrt_near_exact: +/* + * This is an easy case because x^1/2 is monotonic. + * We need just find the square of our estimate, compare it + * with the argument, and deduce whether our estimate is + * above, below, or exact. We use the fact that the estimate + * is known to be accurate to about 90 bits. + */ + movl %edi,%eax /* ls word of guess */ + mull %edi + movl %edx,%ebx /* 2nd ls word of square */ + movl %eax,%ecx /* ls word of square */ + + movl %edi,%eax + mull %esi + addl %eax,%ebx + addl %eax,%ebx + +#ifdef PARANOID + cmp $0xffffffb0,%ebx + jb sqrt_near_exact_ok + + cmp $0x00000050,%ebx + ja sqrt_near_exact_ok + + pushl EX_INTERNAL|0x214 + call EXCEPTION + +sqrt_near_exact_ok: +#endif /* PARANOID */ + + or %ebx,%ebx + js sqrt_near_exact_small + + jnz sqrt_near_exact_large + + or %ebx,%edx + jnz sqrt_near_exact_large + +/* Our estimate is exactly the right answer */ + xorl %eax,%eax + jmp sqrt_round_result + +sqrt_near_exact_small: +/* Our estimate is too small */ + movl $0x000000ff,%eax + jmp sqrt_round_result + +sqrt_near_exact_large: +/* Our estimate is too large, we need to decrement it */ + subl $1,%edi + sbbl $0,%esi + movl $0xffffff00,%eax + jmp sqrt_round_result + + +sqrt_get_more_precision: +/* This case is almost the same as the above, except we start + with an extra bit of precision in the estimate. */ + stc /* The extra bit. */ + rcll $1,%edi /* Shift the estimate left one bit */ + rcll $1,%esi + + movl %edi,%eax /* ls word of guess */ + mull %edi + movl %edx,%ebx /* 2nd ls word of square */ + movl %eax,%ecx /* ls word of square */ + + movl %edi,%eax + mull %esi + addl %eax,%ebx + addl %eax,%ebx + +/* Put our estimate back to its original value */ + stc /* The ms bit. */ + rcrl $1,%esi /* Shift the estimate left one bit */ + rcrl $1,%edi + +#ifdef PARANOID + cmp $0xffffff60,%ebx + jb sqrt_more_prec_ok + + cmp $0x000000a0,%ebx + ja sqrt_more_prec_ok + + pushl EX_INTERNAL|0x215 + call EXCEPTION + +sqrt_more_prec_ok: +#endif /* PARANOID */ + + or %ebx,%ebx + js sqrt_more_prec_small + + jnz sqrt_more_prec_large + + or %ebx,%ecx + jnz sqrt_more_prec_large + +/* Our estimate is exactly the right answer */ + movl $0x80000000,%eax + jmp sqrt_round_result + +sqrt_more_prec_small: +/* Our estimate is too small */ + movl $0x800000ff,%eax + jmp sqrt_round_result + +sqrt_more_prec_large: +/* Our estimate is too large */ + movl $0x7fffff00,%eax + jmp sqrt_round_result diff --git a/src/wraith/mm/boot_ioremap.c b/src/wraith/mm/boot_ioremap.c new file mode 100644 index 000000000..d879c1aa9 --- /dev/null +++ b/src/wraith/mm/boot_ioremap.c @@ -0,0 +1,97 @@ +/* + * arch/i386/mm/boot_ioremap.c + * + * Re-map functions for early boot-time before paging_init() when the + * boot-time pagetables are still in use + * + * Written by Dave Hansen + */ + + +/* + * We need to use the 2-level pagetable functions, but CONFIG_X86_PAE + * keeps that from happenning. If anyone has a better way, I'm listening. + * + * boot_pte_t is defined only if this all works correctly + */ + +#include +#undef CONFIG_X86_PAE +#include +#include +#include +#include +#include + +/* + * I'm cheating here. It is known that the two boot PTE pages are + * allocated next to each other. I'm pretending that they're just + * one big array. + */ + +#define BOOT_PTE_PTRS (PTRS_PER_PTE*2) +#define boot_pte_index(address) \ + (((address) >> PAGE_SHIFT) & (BOOT_PTE_PTRS - 1)) + +static inline boot_pte_t* boot_vaddr_to_pte(void *address) +{ + boot_pte_t* boot_pg = (boot_pte_t*)pg0; + return &boot_pg[boot_pte_index((unsigned long)address)]; +} + +/* + * This is only for a caller who is clever enough to page-align + * phys_addr and virtual_source, and who also has a preference + * about which virtual address from which to steal ptes + */ +static void __boot_ioremap(unsigned long phys_addr, unsigned long nrpages, + void* virtual_source) +{ + boot_pte_t* pte; + int i; + char *vaddr = virtual_source; + + pte = boot_vaddr_to_pte(virtual_source); + for (i=0; i < nrpages; i++, phys_addr += PAGE_SIZE, pte++) { + set_pte(pte, pfn_pte(phys_addr>>PAGE_SHIFT, PAGE_KERNEL)); + __flush_tlb_one(&vaddr[i*PAGE_SIZE]); + } +} + +/* the virtual space we're going to remap comes from this array */ +#define BOOT_IOREMAP_PAGES 4 +#define BOOT_IOREMAP_SIZE (BOOT_IOREMAP_PAGES*PAGE_SIZE) +__initdata char boot_ioremap_space[BOOT_IOREMAP_SIZE] + __attribute__ ((aligned (PAGE_SIZE))); + +/* + * This only applies to things which need to ioremap before paging_init() + * bt_ioremap() and plain ioremap() are both useless at this point. + * + * When used, we're still using the boot-time pagetables, which only + * have 2 PTE pages mapping the first 8MB + * + * There is no unmap. The boot-time PTE pages aren't used after boot. + * If you really want the space back, just remap it yourself. + * boot_ioremap(&ioremap_space-PAGE_OFFSET, BOOT_IOREMAP_SIZE) + */ +__init void* boot_ioremap(unsigned long phys_addr, unsigned long size) +{ + unsigned long last_addr, offset; + unsigned int nrpages; + + last_addr = phys_addr + size - 1; + + /* page align the requested address */ + offset = phys_addr & ~PAGE_MASK; + phys_addr &= PAGE_MASK; + size = PAGE_ALIGN(last_addr) - phys_addr; + + nrpages = size >> PAGE_SHIFT; + if (nrpages > BOOT_IOREMAP_PAGES) + return NULL; + + __boot_ioremap(phys_addr, nrpages, boot_ioremap_space); + + return &boot_ioremap_space[offset]; +} diff --git a/src/wraith/mm/discontig.c b/src/wraith/mm/discontig.c new file mode 100644 index 000000000..33b81da92 --- /dev/null +++ b/src/wraith/mm/discontig.c @@ -0,0 +1,476 @@ +/* + * Written by: Patricia Gaughen , IBM Corporation + * August 2002: added remote node KVA remap - Martin J. Bligh + * + * Copyright (C) 2002, IBM Corp. + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or + * NON INFRINGEMENT. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct pglist_data *node_data[MAX_NUMNODES]; +bootmem_data_t node0_bdata; + +/* + * numa interface - we expect the numa architecture specfic code to have + * populated the following initialisation. + * + * 1) numnodes - the total number of nodes configured in the system + * 2) physnode_map - the mapping between a pfn and owning node + * 3) node_start_pfn - the starting page frame number for a node + * 3) node_end_pfn - the ending page fram number for a node + */ + +/* + * physnode_map keeps track of the physical memory layout of a generic + * numa node on a 256Mb break (each element of the array will + * represent 256Mb of memory and will be marked by the node id. so, + * if the first gig is on node 0, and the second gig is on node 1 + * physnode_map will contain: + * + * physnode_map[0-3] = 0; + * physnode_map[4-7] = 1; + * physnode_map[8- ] = -1; + */ +s8 physnode_map[MAX_ELEMENTS] = { [0 ... (MAX_ELEMENTS - 1)] = -1}; + +unsigned long node_start_pfn[MAX_NUMNODES]; +unsigned long node_end_pfn[MAX_NUMNODES]; + +extern unsigned long find_max_low_pfn(void); +extern void find_max_pfn(void); +extern void one_highpage_init(struct page *, int, int); + +extern struct e820map e820; +extern unsigned long init_pg_tables_end; +extern unsigned long highend_pfn, highstart_pfn; +extern unsigned long max_low_pfn; +extern unsigned long totalram_pages; +extern unsigned long totalhigh_pages; + +#define LARGE_PAGE_BYTES (PTRS_PER_PTE * PAGE_SIZE) + +unsigned long node_remap_start_pfn[MAX_NUMNODES]; +unsigned long node_remap_size[MAX_NUMNODES]; +unsigned long node_remap_offset[MAX_NUMNODES]; +void *node_remap_start_vaddr[MAX_NUMNODES]; +void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags); + +/* + * FLAT - support for basic PC memory model with discontig enabled, essentially + * a single node with all available processors in it with a flat + * memory map. + */ +int __init get_memcfg_numa_flat(void) +{ + printk("NUMA - single node, flat memory mode\n"); + + /* Run the memory configuration and find the top of memory. */ + find_max_pfn(); + node_start_pfn[0] = 0; + node_end_pfn[0] = max_pfn; + + /* Indicate there is one node available. */ + node_set_online(0); + numnodes = 1; + return 1; +} + +/* + * Find the highest page frame number we have available for the node + */ +static void __init find_max_pfn_node(int nid) +{ + if (node_end_pfn[nid] > max_pfn) + node_end_pfn[nid] = max_pfn; + /* + * if a user has given mem=XXXX, then we need to make sure + * that the node _starts_ before that, too, not just ends + */ + if (node_start_pfn[nid] > max_pfn) + node_start_pfn[nid] = max_pfn; + if (node_start_pfn[nid] > node_end_pfn[nid]) + BUG(); +} + +/* + * Allocate memory for the pg_data_t for this node via a crude pre-bootmem + * method. For node zero take this from the bottom of memory, for + * subsequent nodes place them at node_remap_start_vaddr which contains + * node local data in physically node local memory. See setup_memory() + * for details. + */ +static void __init allocate_pgdat(int nid) +{ + if (nid) + NODE_DATA(nid) = (pg_data_t *)node_remap_start_vaddr[nid]; + else { + NODE_DATA(nid) = (pg_data_t *)(__va(min_low_pfn << PAGE_SHIFT)); + min_low_pfn += PFN_UP(sizeof(pg_data_t)); + memset(NODE_DATA(nid), 0, sizeof(pg_data_t)); + } +} + +/* + * Register fully available low RAM pages with the bootmem allocator. + */ +static void __init register_bootmem_low_pages(unsigned long system_max_low_pfn) +{ + int i; + + for (i = 0; i < e820.nr_map; i++) { + unsigned long curr_pfn, last_pfn, size; + /* + * Reserve usable low memory + */ + if (e820.map[i].type != E820_RAM) + continue; + /* + * We are rounding up the start address of usable memory: + */ + curr_pfn = PFN_UP(e820.map[i].addr); + if (curr_pfn >= system_max_low_pfn) + continue; + /* + * ... and at the end of the usable range downwards: + */ + last_pfn = PFN_DOWN(e820.map[i].addr + e820.map[i].size); + + if (last_pfn > system_max_low_pfn) + last_pfn = system_max_low_pfn; + + /* + * .. finally, did all the rounding and playing + * around just make the area go away? + */ + if (last_pfn <= curr_pfn) + continue; + + size = last_pfn - curr_pfn; + free_bootmem_node(NODE_DATA(0), PFN_PHYS(curr_pfn), PFN_PHYS(size)); + } +} + +void __init remap_numa_kva(void) +{ + void *vaddr; + unsigned long pfn; + int node; + + for (node = 1; node < numnodes; ++node) { + for (pfn=0; pfn < node_remap_size[node]; pfn += PTRS_PER_PTE) { + vaddr = node_remap_start_vaddr[node]+(pfn< system_max_low_pfn) + highstart_pfn = system_max_low_pfn; + printk(KERN_NOTICE "%ldMB HIGHMEM available.\n", + pages_to_mb(highend_pfn - highstart_pfn)); +#endif + printk(KERN_NOTICE "%ldMB LOWMEM available.\n", + pages_to_mb(system_max_low_pfn)); + printk("min_low_pfn = %ld, max_low_pfn = %ld, highstart_pfn = %ld\n", + min_low_pfn, max_low_pfn, highstart_pfn); + + printk("Low memory ends at vaddr %08lx\n", + (ulong) pfn_to_kaddr(max_low_pfn)); + for (nid = 0; nid < numnodes; nid++) { + node_remap_start_vaddr[nid] = pfn_to_kaddr( + (highstart_pfn + reserve_pages) - node_remap_offset[nid]); + allocate_pgdat(nid); + printk ("node %d will remap to vaddr %08lx - %08lx\n", nid, + (ulong) node_remap_start_vaddr[nid], + (ulong) pfn_to_kaddr(highstart_pfn + reserve_pages + - node_remap_offset[nid] + node_remap_size[nid])); + } + printk("High memory starts at vaddr %08lx\n", + (ulong) pfn_to_kaddr(highstart_pfn)); + vmalloc_earlyreserve = reserve_pages * PAGE_SIZE; + for (nid = 0; nid < numnodes; nid++) + find_max_pfn_node(nid); + + NODE_DATA(0)->bdata = &node0_bdata; + + /* + * Initialize the boot-time allocator (with low memory only): + */ + bootmap_size = init_bootmem_node(NODE_DATA(0), min_low_pfn, 0, system_max_low_pfn); + + register_bootmem_low_pages(system_max_low_pfn); + + /* + * Reserve the bootmem bitmap itself as well. We do this in two + * steps (first step was init_bootmem()) because this catches + * the (very unlikely) case of us accidentally initializing the + * bootmem allocator with an invalid RAM area. + */ + reserve_bootmem_node(NODE_DATA(0), HIGH_MEMORY, (PFN_PHYS(min_low_pfn) + + bootmap_size + PAGE_SIZE-1) - (HIGH_MEMORY)); + + /* + * reserve physical page 0 - it's a special BIOS page on many boxes, + * enabling clean reboots, SMP operation, laptop functions. + */ + reserve_bootmem_node(NODE_DATA(0), 0, PAGE_SIZE); + + /* + * But first pinch a few for the stack/trampoline stuff + * FIXME: Don't need the extra page at 4K, but need to fix + * trampoline before removing it. (see the GDT stuff) + */ + reserve_bootmem_node(NODE_DATA(0), PAGE_SIZE, PAGE_SIZE); + + /* reserve EBDA region, it's a 4K region */ + reserve_ebda_region_node(); + +#ifdef CONFIG_ACPI_SLEEP + /* + * Reserve low memory region for sleep support. + */ + acpi_reserve_bootmem(); +#endif + + /* + * Find and reserve possible boot-time SMP configuration: + */ + find_smp_config(); + +#ifdef CONFIG_BLK_DEV_INITRD + if (LOADER_TYPE && INITRD_START) { + if (INITRD_START + INITRD_SIZE <= (system_max_low_pfn << PAGE_SHIFT)) { + reserve_bootmem_node(NODE_DATA(0), INITRD_START, INITRD_SIZE); + initrd_start = + INITRD_START ? INITRD_START + PAGE_OFFSET : 0; + initrd_end = initrd_start+INITRD_SIZE; + } + else { + printk(KERN_ERR "initrd extends beyond end of memory " + "(0x%08lx > 0x%08lx)\ndisabling initrd\n", + INITRD_START + INITRD_SIZE, + system_max_low_pfn << PAGE_SHIFT); + initrd_start = 0; + } + } +#endif + return system_max_low_pfn; +} + +void __init zone_sizes_init(void) +{ + int nid; + + /* + * Insert nodes into pgdat_list backward so they appear in order. + * Clobber node 0's links and NULL out pgdat_list before starting. + */ + pgdat_list = NULL; + for (nid = numnodes - 1; nid >= 0; nid--) { + if (nid) + memset(NODE_DATA(nid), 0, sizeof(pg_data_t)); + NODE_DATA(nid)->pgdat_next = pgdat_list; + pgdat_list = NODE_DATA(nid); + } + + for (nid = 0; nid < numnodes; nid++) { + unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0}; + unsigned long *zholes_size; + unsigned int max_dma; + + unsigned long low = max_low_pfn; + unsigned long start = node_start_pfn[nid]; + unsigned long high = node_end_pfn[nid]; + + max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; + + if (start > low) { +#ifdef CONFIG_HIGHMEM + BUG_ON(start > high); + zones_size[ZONE_HIGHMEM] = high - start; +#endif + } else { + if (low < max_dma) + zones_size[ZONE_DMA] = low; + else { + BUG_ON(max_dma > low); + BUG_ON(low > high); + zones_size[ZONE_DMA] = max_dma; + zones_size[ZONE_NORMAL] = low - max_dma; +#ifdef CONFIG_HIGHMEM + zones_size[ZONE_HIGHMEM] = high - low; +#endif + } + } + zholes_size = get_zholes_size(nid); + /* + * We let the lmem_map for node 0 be allocated from the + * normal bootmem allocator, but other nodes come from the + * remapped KVA area - mbligh + */ + if (!nid) + free_area_init_node(nid, NODE_DATA(nid), + zones_size, start, zholes_size); + else { + unsigned long lmem_map; + lmem_map = (unsigned long)node_remap_start_vaddr[nid]; + lmem_map += sizeof(pg_data_t) + PAGE_SIZE - 1; + lmem_map &= PAGE_MASK; + NODE_DATA(nid)->node_mem_map = (struct page *)lmem_map; + free_area_init_node(nid, NODE_DATA(nid), zones_size, + start, zholes_size); + } + } + return; +} + +void __init set_highmem_pages_init(int bad_ppro) +{ +#ifdef CONFIG_HIGHMEM + struct zone *zone; + + for_each_zone(zone) { + unsigned long node_pfn, node_high_size, zone_start_pfn; + struct page * zone_mem_map; + + if (!is_highmem(zone)) + continue; + + printk("Initializing %s for node %d\n", zone->name, + zone->zone_pgdat->node_id); + + node_high_size = zone->spanned_pages; + zone_mem_map = zone->zone_mem_map; + zone_start_pfn = zone->zone_start_pfn; + + for (node_pfn = 0; node_pfn < node_high_size; node_pfn++) { + one_highpage_init((struct page *)(zone_mem_map + node_pfn), + zone_start_pfn + node_pfn, bad_ppro); + } + } + totalram_pages += totalhigh_pages; +#endif +} + +void __init set_max_mapnr_init(void) +{ +#ifdef CONFIG_HIGHMEM + struct zone *high0 = &NODE_DATA(0)->node_zones[ZONE_HIGHMEM]; + if (high0->spanned_pages > 0) + highmem_start_page = high0->zone_mem_map; + else + highmem_start_page = pfn_to_page(max_low_pfn - 1) + 1; + num_physpages = highend_pfn; +#else + num_physpages = max_low_pfn; +#endif +} diff --git a/src/wraith/mm/extable.c b/src/wraith/mm/extable.c new file mode 100644 index 000000000..f70644931 --- /dev/null +++ b/src/wraith/mm/extable.c @@ -0,0 +1,36 @@ +/* + * linux/arch/i386/mm/extable.c + */ + +#include +#include +#include +#include + +int fixup_exception(struct pt_regs *regs) +{ + const struct exception_table_entry *fixup; + +#ifdef CONFIG_PNPBIOS + if (unlikely((regs->xcs & ~15) == (GDT_ENTRY_PNPBIOS_BASE << 3))) + { + extern u32 pnp_bios_fault_eip, pnp_bios_fault_esp; + extern u32 pnp_bios_is_utter_crap; + pnp_bios_is_utter_crap = 1; + printk(KERN_CRIT "PNPBIOS fault.. attempting recovery.\n"); + __asm__ volatile( + "movl %0, %%esp\n\t" + "jmp *%1\n\t" + : : "g" (pnp_bios_fault_esp), "g" (pnp_bios_fault_eip)); + panic("do_trap: can't hit this"); + } +#endif + + fixup = search_exception_tables(regs->eip); + if (fixup) { + regs->eip = fixup->fixup; + return 1; + } + + return 0; +} diff --git a/src/wraith/mm/fault.c b/src/wraith/mm/fault.c new file mode 100644 index 000000000..f714896ff --- /dev/null +++ b/src/wraith/mm/fault.c @@ -0,0 +1,547 @@ +/* + * linux/arch/i386/mm/fault.c + * + * Copyright (C) 1995 Linus Torvalds + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* For unblank_screen() */ +#include +#include + +#include +#include +#include +#include + +extern void die(const char *,struct pt_regs *,long); + +/* + * Unlock any spinlocks which will prevent us from getting the + * message out + */ +void bust_spinlocks(int yes) +{ + int loglevel_save = console_loglevel; + + if (yes) { + oops_in_progress = 1; + return; + } +#ifdef CONFIG_VT + unblank_screen(); +#endif + oops_in_progress = 0; + /* + * OK, the message is on the console. Now we call printk() + * without oops_in_progress set so that printk will give klogd + * a poke. Hold onto your hats... + */ + console_loglevel = 15; /* NMI oopser may have shut the console up */ + printk(" "); + console_loglevel = loglevel_save; +} + +/* + * Return EIP plus the CS segment base. The segment limit is also + * adjusted, clamped to the kernel/user address space (whichever is + * appropriate), and returned in *eip_limit. + * + * The segment is checked, because it might have been changed by another + * task between the original faulting instruction and here. + * + * If CS is no longer a valid code segment, or if EIP is beyond the + * limit, or if it is a kernel address when CS is not a kernel segment, + * then the returned value will be greater than *eip_limit. + * + * This is slow, but is very rarely executed. + */ +static inline unsigned long get_segment_eip(struct pt_regs *regs, + unsigned long *eip_limit) +{ + unsigned long eip = regs->eip; + unsigned seg = regs->xcs & 0xffff; + u32 seg_ar, seg_limit, base, *desc; + + /* The standard kernel/user address space limit. */ + *eip_limit = (seg & 3) ? USER_DS.seg : KERNEL_DS.seg; + + /* Unlikely, but must come before segment checks. */ + if (unlikely((regs->eflags & VM_MASK) != 0)) + return eip + (seg << 4); + + /* By far the most common cases. */ + if (likely(seg == __USER_CS || seg == __KERNEL_CS)) + return eip; + + /* Check the segment exists, is within the current LDT/GDT size, + that kernel/user (ring 0..3) has the appropriate privilege, + that it's a code segment, and get the limit. */ + __asm__ ("larl %3,%0; lsll %3,%1" + : "=&r" (seg_ar), "=r" (seg_limit) : "0" (0), "rm" (seg)); + if ((~seg_ar & 0x9800) || eip > seg_limit) { + *eip_limit = 0; + return 1; /* So that returned eip > *eip_limit. */ + } + + /* Get the GDT/LDT descriptor base. + When you look for races in this code remember that + LDT and other horrors are only used in user space. */ + if (seg & (1<<2)) { + /* Must lock the LDT while reading it. */ + down(¤t->mm->context.sem); + desc = current->mm->context.ldt; + desc = (void *)desc + (seg & ~7); + } else { + /* Must disable preemption while reading the GDT. */ + desc = (u32 *)&per_cpu(cpu_gdt_table, get_cpu()); + desc = (void *)desc + (seg & ~7); + } + + /* Decode the code segment base from the descriptor */ + base = (desc[0] >> 16) | + ((desc[1] & 0xff) << 16) | + (desc[1] & 0xff000000); + + if (seg & (1<<2)) { + up(¤t->mm->context.sem); + } else + put_cpu(); + + /* Adjust EIP and segment limit, and clamp at the kernel limit. + It's legitimate for segments to wrap at 0xffffffff. */ + seg_limit += base; + if (seg_limit < *eip_limit && seg_limit >= base) + *eip_limit = seg_limit; + return eip + base; +} + +/* + * Sometimes AMD Athlon/Opteron CPUs report invalid exceptions on prefetch. + * Check that here and ignore it. + */ +static int __is_prefetch(struct pt_regs *regs, unsigned long addr) +{ + unsigned long limit; + unsigned long instr = get_segment_eip (regs, &limit); + int scan_more = 1; + int prefetch = 0; + int i; + + for (i = 0; scan_more && i < 15; i++) { + unsigned char opcode; + unsigned char instr_hi; + unsigned char instr_lo; + + if (instr > limit) + break; + if (__get_user(opcode, (unsigned char *) instr)) + break; + + instr_hi = opcode & 0xf0; + instr_lo = opcode & 0x0f; + instr++; + + switch (instr_hi) { + case 0x20: + case 0x30: + /* Values 0x26,0x2E,0x36,0x3E are valid x86 prefixes. */ + scan_more = ((instr_lo & 7) == 0x6); + break; + + case 0x60: + /* 0x64 thru 0x67 are valid prefixes in all modes. */ + scan_more = (instr_lo & 0xC) == 0x4; + break; + case 0xF0: + /* 0xF0, 0xF2, and 0xF3 are valid prefixes */ + scan_more = !instr_lo || (instr_lo>>1) == 1; + break; + case 0x00: + /* Prefetch instruction is 0x0F0D or 0x0F18 */ + scan_more = 0; + if (instr > limit) + break; + if (__get_user(opcode, (unsigned char *) instr)) + break; + prefetch = (instr_lo == 0xF) && + (opcode == 0x0D || opcode == 0x18); + break; + default: + scan_more = 0; + break; + } + } + return prefetch; +} + +static inline int is_prefetch(struct pt_regs *regs, unsigned long addr, + unsigned long error_code) +{ + if (unlikely(boot_cpu_data.x86_vendor == X86_VENDOR_AMD && + boot_cpu_data.x86 >= 6)) { + /* Catch an obscure case of prefetch inside an NX page. */ + if (nx_enabled && (error_code & 16)) + return 0; + return __is_prefetch(regs, addr); + } + return 0; +} + +fastcall void do_invalid_op(struct pt_regs *, unsigned long); + +/* + * This routine handles page faults. It determines the address, + * and the problem, and then passes it off to one of the appropriate + * routines. + * + * error_code: + * bit 0 == 0 means no page found, 1 means protection fault + * bit 1 == 0 means read, 1 means write + * bit 2 == 0 means kernel, 1 means user-mode + */ +fastcall void do_page_fault(struct pt_regs *regs, unsigned long error_code) +{ + struct task_struct *tsk; + struct mm_struct *mm; + struct vm_area_struct * vma; + unsigned long address; + unsigned long page; + int write; + siginfo_t info; + + /* get the address */ + __asm__("movl %%cr2,%0":"=r" (address)); + + if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, + SIGSEGV) == NOTIFY_STOP) + return; + /* It's safe to allow irq's after cr2 has been saved */ + if (regs->eflags & (X86_EFLAGS_IF|VM_MASK)) + local_irq_enable(); + + tsk = current; + + info.si_code = SEGV_MAPERR; + + /* + * We fault-in kernel-space virtual memory on-demand. The + * 'reference' page table is init_mm.pgd. + * + * NOTE! We MUST NOT take any locks for this case. We may + * be in an interrupt or a critical region, and should + * only copy the information from the master page table, + * nothing more. + * + * This verifies that the fault happens in kernel space + * (error_code & 4) == 0, and that the fault was not a + * protection error (error_code & 1) == 0. + */ + if (unlikely(address >= TASK_SIZE)) { + if (!(error_code & 5)) + goto vmalloc_fault; + /* + * Don't take the mm semaphore here. If we fixup a prefetch + * fault we could otherwise deadlock. + */ + goto bad_area_nosemaphore; + } + + mm = tsk->mm; + + /* + * If we're in an interrupt, have no user context or are running in an + * atomic region then we must not take the fault.. + */ + if (in_atomic() || !mm) + goto bad_area_nosemaphore; + + /* When running in the kernel we expect faults to occur only to + * addresses in user space. All other faults represent errors in the + * kernel and should generate an OOPS. Unfortunatly, in the case of an + * erroneous fault occuring in a code path which already holds mmap_sem + * we will deadlock attempting to validate the fault against the + * address space. Luckily the kernel only validly references user + * space from well defined areas of code, which are listed in the + * exceptions table. + * + * As the vast majority of faults will be valid we will only perform + * the source reference check when there is a possibilty of a deadlock. + * Attempt to lock the address space, if we cannot we then validate the + * source. If this is invalid we can skip the address space check, + * thus avoiding the deadlock. + */ + if (!down_read_trylock(&mm->mmap_sem)) { + if ((error_code & 4) == 0 && + !search_exception_tables(regs->eip)) + goto bad_area_nosemaphore; + down_read(&mm->mmap_sem); + } + + vma = find_vma(mm, address); + if (!vma) + goto bad_area; + if (vma->vm_start <= address) + goto good_area; + if (!(vma->vm_flags & VM_GROWSDOWN)) + goto bad_area; + if (error_code & 4) { + /* + * accessing the stack below %esp is always a bug. + * The "+ 32" is there due to some instructions (like + * pusha) doing post-decrement on the stack and that + * doesn't show up until later.. + */ + if (address + 32 < regs->esp) + goto bad_area; + } + if (expand_stack(vma, address)) + goto bad_area; +/* + * Ok, we have a good vm_area for this memory access, so + * we can handle it.. + */ +good_area: + info.si_code = SEGV_ACCERR; + write = 0; + switch (error_code & 3) { + default: /* 3: write, present */ +#ifdef TEST_VERIFY_AREA + if (regs->cs == KERNEL_CS) + printk("WP fault at %08lx\n", regs->eip); +#endif + /* fall through */ + case 2: /* write, not present */ + if (!(vma->vm_flags & VM_WRITE)) + goto bad_area; + write++; + break; + case 1: /* read, present */ + goto bad_area; + case 0: /* read, not present */ + if (!(vma->vm_flags & (VM_READ | VM_EXEC))) + goto bad_area; + } + + survive: + /* + * If for any reason at all we couldn't handle the fault, + * make sure we exit gracefully rather than endlessly redo + * the fault. + */ + switch (handle_mm_fault(mm, vma, address, write)) { + case VM_FAULT_MINOR: + tsk->min_flt++; + break; + case VM_FAULT_MAJOR: + tsk->maj_flt++; + break; + case VM_FAULT_SIGBUS: + goto do_sigbus; + case VM_FAULT_OOM: + goto out_of_memory; + default: + BUG(); + } + + /* + * Did it hit the DOS screen memory VA from vm86 mode? + */ + if (regs->eflags & VM_MASK) { + unsigned long bit = (address - 0xA0000) >> PAGE_SHIFT; + if (bit < 32) + tsk->thread.screen_bitmap |= 1 << bit; + } + up_read(&mm->mmap_sem); + return; + +/* + * Something tried to access memory that isn't in our memory map.. + * Fix it, but check if it's kernel or user first.. + */ +bad_area: + up_read(&mm->mmap_sem); + +bad_area_nosemaphore: + /* User mode accesses just cause a SIGSEGV */ + if (error_code & 4) { + /* + * Valid to do another page fault here because this one came + * from user space. + */ + if (is_prefetch(regs, address, error_code)) + return; + + tsk->thread.cr2 = address; + /* Kernel addresses are always protection faults */ + tsk->thread.error_code = error_code | (address >= TASK_SIZE); + tsk->thread.trap_no = 14; + info.si_signo = SIGSEGV; + info.si_errno = 0; + /* info.si_code has been set above */ + info.si_addr = (void __user *)address; + force_sig_info(SIGSEGV, &info, tsk); + return; + } + +#ifdef CONFIG_X86_F00F_BUG + /* + * Pentium F0 0F C7 C8 bug workaround. + */ + if (boot_cpu_data.f00f_bug) { + unsigned long nr; + + nr = (address - idt_descr.address) >> 3; + + if (nr == 6) { + do_invalid_op(regs, 0); + return; + } + } +#endif + +no_context: + /* Are we prepared to handle this kernel fault? */ + if (fixup_exception(regs)) + return; + + /* + * Valid to do another page fault here, because if this fault + * had been triggered by is_prefetch fixup_exception would have + * handled it. + */ + if (is_prefetch(regs, address, error_code)) + return; + +/* + * Oops. The kernel tried to access some bad page. We'll have to + * terminate things with extreme prejudice. + */ + + bust_spinlocks(1); + +#ifdef CONFIG_X86_PAE + if (error_code & 16) { + pte_t *pte = lookup_address(address); + + if (pte && pte_present(*pte) && !pte_exec_kernel(*pte)) + printk(KERN_CRIT "kernel tried to execute NX-protected page - exploit attempt? (uid: %d)\n", current->uid); + } +#endif + if (address < PAGE_SIZE) + printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference"); + else + printk(KERN_ALERT "Unable to handle kernel paging request"); + printk(" at virtual address %08lx\n",address); + printk(KERN_ALERT " printing eip:\n"); + printk("%08lx\n", regs->eip); + asm("movl %%cr3,%0":"=r" (page)); + page = ((unsigned long *) __va(page))[address >> 22]; + printk(KERN_ALERT "*pde = %08lx\n", page); + /* + * We must not directly access the pte in the highpte + * case, the page table might be allocated in highmem. + * And lets rather not kmap-atomic the pte, just in case + * it's allocated already. + */ +#ifndef CONFIG_HIGHPTE + if (page & 1) { + page &= PAGE_MASK; + address &= 0x003ff000; + page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT]; + printk(KERN_ALERT "*pte = %08lx\n", page); + } +#endif + die("Oops", regs, error_code); + bust_spinlocks(0); + do_exit(SIGKILL); + +/* + * We ran out of memory, or some other thing happened to us that made + * us unable to handle the page fault gracefully. + */ +out_of_memory: + up_read(&mm->mmap_sem); + if (tsk->pid == 1) { + yield(); + down_read(&mm->mmap_sem); + goto survive; + } + printk("VM: killing process %s\n", tsk->comm); + if (error_code & 4) + do_exit(SIGKILL); + goto no_context; + +do_sigbus: + up_read(&mm->mmap_sem); + + /* Kernel mode? Handle exceptions or die */ + if (!(error_code & 4)) + goto no_context; + + /* User space => ok to do another page fault */ + if (is_prefetch(regs, address, error_code)) + return; + + tsk->thread.cr2 = address; + tsk->thread.error_code = error_code; + tsk->thread.trap_no = 14; + info.si_signo = SIGBUS; + info.si_errno = 0; + info.si_code = BUS_ADRERR; + info.si_addr = (void __user *)address; + force_sig_info(SIGBUS, &info, tsk); + return; + +vmalloc_fault: + { + /* + * Synchronize this task's top level page-table + * with the 'reference' page table. + * + * Do _not_ use "tsk" here. We might be inside + * an interrupt in the middle of a task switch.. + */ + int index = pgd_index(address); + unsigned long pgd_paddr; + pgd_t *pgd, *pgd_k; + pmd_t *pmd, *pmd_k; + pte_t *pte_k; + + asm("movl %%cr3,%0":"=r" (pgd_paddr)); + pgd = index + (pgd_t *)__va(pgd_paddr); + pgd_k = init_mm.pgd + index; + + if (!pgd_present(*pgd_k)) + goto no_context; + + /* + * set_pgd(pgd, *pgd_k); here would be useless on PAE + * and redundant with the set_pmd() on non-PAE. + */ + + pmd = pmd_offset(pgd, address); + pmd_k = pmd_offset(pgd_k, address); + if (!pmd_present(*pmd_k)) + goto no_context; + set_pmd(pmd, *pmd_k); + + pte_k = pte_offset_kernel(pmd_k, address); + if (!pte_present(*pte_k)) + goto no_context; + return; + } +} diff --git a/src/wraith/mm/highmem.c b/src/wraith/mm/highmem.c new file mode 100644 index 000000000..581753285 --- /dev/null +++ b/src/wraith/mm/highmem.c @@ -0,0 +1,89 @@ +#include + +void *kmap(struct page *page) +{ + might_sleep(); + if (page < highmem_start_page) + return page_address(page); + return kmap_high(page); +} + +void kunmap(struct page *page) +{ + if (in_interrupt()) + BUG(); + if (page < highmem_start_page) + return; + kunmap_high(page); +} + +/* + * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because + * no global lock is needed and because the kmap code must perform a global TLB + * invalidation when the kmap pool wraps. + * + * However when holding an atomic kmap is is not legal to sleep, so atomic + * kmaps are appropriate for short, tight code paths only. + */ +void *kmap_atomic(struct page *page, enum km_type type) +{ + enum fixed_addresses idx; + unsigned long vaddr; + + /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ + inc_preempt_count(); + if (page < highmem_start_page) + return page_address(page); + + idx = type + KM_TYPE_NR*smp_processor_id(); + vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +#ifdef CONFIG_DEBUG_HIGHMEM + if (!pte_none(*(kmap_pte-idx))) + BUG(); +#endif + set_pte(kmap_pte-idx, mk_pte(page, kmap_prot)); + __flush_tlb_one(vaddr); + + return (void*) vaddr; +} + +void kunmap_atomic(void *kvaddr, enum km_type type) +{ +#ifdef CONFIG_DEBUG_HIGHMEM + unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; + enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id(); + + if (vaddr < FIXADDR_START) { // FIXME + dec_preempt_count(); + preempt_check_resched(); + return; + } + + if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx)) + BUG(); + + /* + * force other mappings to Oops if they'll try to access + * this pte without first remap it + */ + pte_clear(kmap_pte-idx); + __flush_tlb_one(vaddr); +#endif + + dec_preempt_count(); + preempt_check_resched(); +} + +struct page *kmap_atomic_to_page(void *ptr) +{ + unsigned long idx, vaddr = (unsigned long)ptr; + pte_t *pte; + + if (vaddr < FIXADDR_START) + return virt_to_page(ptr); + + idx = virt_to_fix(vaddr); + pte = kmap_pte - (idx - FIX_KMAP_BEGIN); + return pte_page(*pte); +} + diff --git a/src/wraith/mm/hugetlbpage.c b/src/wraith/mm/hugetlbpage.c new file mode 100644 index 000000000..c0d07dbe8 --- /dev/null +++ b/src/wraith/mm/hugetlbpage.c @@ -0,0 +1,424 @@ +/* + * IA-32 Huge TLB Page Support for Kernel. + * + * Copyright (C) 2002, Rohit Seth + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr) +{ + pgd_t *pgd; + pmd_t *pmd = NULL; + + pgd = pgd_offset(mm, addr); + pmd = pmd_alloc(mm, pgd, addr); + return (pte_t *) pmd; +} + +static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) +{ + pgd_t *pgd; + pmd_t *pmd = NULL; + + pgd = pgd_offset(mm, addr); + pmd = pmd_offset(pgd, addr); + return (pte_t *) pmd; +} + +static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma, struct page *page, pte_t * page_table, int write_access) +{ + pte_t entry; + + mm->rss += (HPAGE_SIZE / PAGE_SIZE); + if (write_access) { + entry = + pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot))); + } else + entry = pte_wrprotect(mk_pte(page, vma->vm_page_prot)); + entry = pte_mkyoung(entry); + mk_pte_huge(entry); + set_pte(page_table, entry); +} + +/* + * This function checks for proper alignment of input addr and len parameters. + */ +int is_aligned_hugepage_range(unsigned long addr, unsigned long len) +{ + if (len & ~HPAGE_MASK) + return -EINVAL; + if (addr & ~HPAGE_MASK) + return -EINVAL; + return 0; +} + +int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, + struct vm_area_struct *vma) +{ + pte_t *src_pte, *dst_pte, entry; + struct page *ptepage; + unsigned long addr = vma->vm_start; + unsigned long end = vma->vm_end; + + while (addr < end) { + dst_pte = huge_pte_alloc(dst, addr); + if (!dst_pte) + goto nomem; + src_pte = huge_pte_offset(src, addr); + entry = *src_pte; + ptepage = pte_page(entry); + get_page(ptepage); + set_pte(dst_pte, entry); + dst->rss += (HPAGE_SIZE / PAGE_SIZE); + addr += HPAGE_SIZE; + } + return 0; + +nomem: + return -ENOMEM; +} + +int +follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma, + struct page **pages, struct vm_area_struct **vmas, + unsigned long *position, int *length, int i) +{ + unsigned long vpfn, vaddr = *position; + int remainder = *length; + + WARN_ON(!is_vm_hugetlb_page(vma)); + + vpfn = vaddr/PAGE_SIZE; + while (vaddr < vma->vm_end && remainder) { + + if (pages) { + pte_t *pte; + struct page *page; + + pte = huge_pte_offset(mm, vaddr); + + /* hugetlb should be locked, and hence, prefaulted */ + WARN_ON(!pte || pte_none(*pte)); + + page = &pte_page(*pte)[vpfn % (HPAGE_SIZE/PAGE_SIZE)]; + + WARN_ON(!PageCompound(page)); + + get_page(page); + pages[i] = page; + } + + if (vmas) + vmas[i] = vma; + + vaddr += PAGE_SIZE; + ++vpfn; + --remainder; + ++i; + } + + *length = remainder; + *position = vaddr; + + return i; +} + +#if 0 /* This is just for testing */ +struct page * +follow_huge_addr(struct mm_struct *mm, unsigned long address, int write) +{ + unsigned long start = address; + int length = 1; + int nr; + struct page *page; + struct vm_area_struct *vma; + + vma = find_vma(mm, addr); + if (!vma || !is_vm_hugetlb_page(vma)) + return ERR_PTR(-EINVAL); + + pte = huge_pte_offset(mm, address); + + /* hugetlb should be locked, and hence, prefaulted */ + WARN_ON(!pte || pte_none(*pte)); + + page = &pte_page(*pte)[vpfn % (HPAGE_SIZE/PAGE_SIZE)]; + + WARN_ON(!PageCompound(page)); + + return page; +} + +int pmd_huge(pmd_t pmd) +{ + return 0; +} + +struct page * +follow_huge_pmd(struct mm_struct *mm, unsigned long address, + pmd_t *pmd, int write) +{ + return NULL; +} + +#else + +struct page * +follow_huge_addr(struct mm_struct *mm, unsigned long address, int write) +{ + return ERR_PTR(-EINVAL); +} + +int pmd_huge(pmd_t pmd) +{ + return !!(pmd_val(pmd) & _PAGE_PSE); +} + +struct page * +follow_huge_pmd(struct mm_struct *mm, unsigned long address, + pmd_t *pmd, int write) +{ + struct page *page; + + page = pte_page(*(pte_t *)pmd); + if (page) + page += ((address & ~HPAGE_MASK) >> PAGE_SHIFT); + return page; +} +#endif + +void unmap_hugepage_range(struct vm_area_struct *vma, + unsigned long start, unsigned long end) +{ + struct mm_struct *mm = vma->vm_mm; + unsigned long address; + pte_t pte; + struct page *page; + + BUG_ON(start & (HPAGE_SIZE - 1)); + BUG_ON(end & (HPAGE_SIZE - 1)); + + for (address = start; address < end; address += HPAGE_SIZE) { + pte = ptep_get_and_clear(huge_pte_offset(mm, address)); + if (pte_none(pte)) + continue; + page = pte_page(pte); + put_page(page); + } + mm->rss -= (end - start) >> PAGE_SHIFT; + flush_tlb_range(vma, start, end); +} + +int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma) +{ + struct mm_struct *mm = current->mm; + unsigned long addr; + int ret = 0; + + BUG_ON(vma->vm_start & ~HPAGE_MASK); + BUG_ON(vma->vm_end & ~HPAGE_MASK); + + spin_lock(&mm->page_table_lock); + for (addr = vma->vm_start; addr < vma->vm_end; addr += HPAGE_SIZE) { + unsigned long idx; + pte_t *pte = huge_pte_alloc(mm, addr); + struct page *page; + + if (!pte) { + ret = -ENOMEM; + goto out; + } + + if (!pte_none(*pte)) { + pmd_t *pmd = (pmd_t *) pte; + + page = pmd_page(*pmd); + pmd_clear(pmd); + mm->nr_ptes--; + dec_page_state(nr_page_table_pages); + page_cache_release(page); + } + + idx = ((addr - vma->vm_start) >> HPAGE_SHIFT) + + (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT)); + page = find_get_page(mapping, idx); + if (!page) { + /* charge the fs quota first */ + if (hugetlb_get_quota(mapping)) { + ret = -ENOMEM; + goto out; + } + page = alloc_huge_page(); + if (!page) { + hugetlb_put_quota(mapping); + ret = -ENOMEM; + goto out; + } + ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC); + if (! ret) { + unlock_page(page); + } else { + hugetlb_put_quota(mapping); + free_huge_page(page); + goto out; + } + } + set_huge_pte(mm, vma, page, pte, vma->vm_flags & VM_WRITE); + } +out: + spin_unlock(&mm->page_table_lock); + return ret; +} + +/* x86_64 also uses this file */ + +#ifdef HAVE_ARCH_HUGETLB_UNMAPPED_AREA +static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, + unsigned long addr, unsigned long len, + unsigned long pgoff, unsigned long flags) +{ + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; + unsigned long start_addr; + + start_addr = mm->free_area_cache; + +full_search: + addr = ALIGN(start_addr, HPAGE_SIZE); + + for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { + /* At this point: (!vma || addr < vma->vm_end). */ + if (TASK_SIZE - len < addr) { + /* + * Start a new search - just in case we missed + * some holes. + */ + if (start_addr != TASK_UNMAPPED_BASE) { + start_addr = TASK_UNMAPPED_BASE; + goto full_search; + } + return -ENOMEM; + } + if (!vma || addr + len <= vma->vm_start) { + mm->free_area_cache = addr + len; + return addr; + } + addr = ALIGN(vma->vm_end, HPAGE_SIZE); + } +} + +static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, + unsigned long addr0, unsigned long len, + unsigned long pgoff, unsigned long flags) +{ + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma, *prev_vma; + unsigned long base = mm->mmap_base, addr = addr0; + int first_time = 1; + + /* don't allow allocations above current base */ + if (mm->free_area_cache > base) + mm->free_area_cache = base; + +try_again: + /* make sure it can fit in the remaining address space */ + if (mm->free_area_cache < len) + goto fail; + + /* either no address requested or cant fit in requested address hole */ + addr = (mm->free_area_cache - len) & HPAGE_MASK; + do { + /* + * Lookup failure means no vma is above this address, + * i.e. return with success: + */ + if (!(vma = find_vma_prev(mm, addr, &prev_vma))) + return addr; + + /* + * new region fits between prev_vma->vm_end and + * vma->vm_start, use it: + */ + if (addr + len <= vma->vm_start && + (!prev_vma || (addr >= prev_vma->vm_end))) + /* remember the address as a hint for next time */ + return (mm->free_area_cache = addr); + else + /* pull free_area_cache down to the first hole */ + if (mm->free_area_cache == vma->vm_end) + mm->free_area_cache = vma->vm_start; + + /* try just below the current vma->vm_start */ + addr = (vma->vm_start - len) & HPAGE_MASK; + } while (len <= vma->vm_start); + +fail: + /* + * if hint left us with no space for the requested + * mapping then try again: + */ + if (first_time) { + mm->free_area_cache = base; + first_time = 0; + goto try_again; + } + /* + * A failed mmap() very likely causes application failure, + * so fall back to the bottom-up function here. This scenario + * can happen with large stack limits and large mmap() + * allocations. + */ + mm->free_area_cache = TASK_UNMAPPED_BASE; + addr = hugetlb_get_unmapped_area_bottomup(file, addr0, + len, pgoff, flags); + + /* + * Restore the topdown base: + */ + mm->free_area_cache = base; + + return addr; +} + +unsigned long +hugetlb_get_unmapped_area(struct file *file, unsigned long addr, + unsigned long len, unsigned long pgoff, unsigned long flags) +{ + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; + + if (len & ~HPAGE_MASK) + return -EINVAL; + if (len > TASK_SIZE) + return -ENOMEM; + + if (addr) { + addr = ALIGN(addr, HPAGE_SIZE); + vma = find_vma(mm, addr); + if (TASK_SIZE - len >= addr && + (!vma || addr + len <= vma->vm_start)) + return addr; + } + if (mm->get_unmapped_area == arch_get_unmapped_area) + return hugetlb_get_unmapped_area_bottomup(file, addr, len, + pgoff, flags); + else + return hugetlb_get_unmapped_area_topdown(file, addr, len, + pgoff, flags); +} + +#endif /*HAVE_ARCH_HUGETLB_UNMAPPED_AREA*/ + diff --git a/src/wraith/mm/init.c b/src/wraith/mm/init.c new file mode 100644 index 000000000..73bed3db4 --- /dev/null +++ b/src/wraith/mm/init.c @@ -0,0 +1,726 @@ +/* + * linux/arch/i386/mm/init.c + * + * Copyright (C) 1995 Linus Torvalds + * + * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +unsigned int __VMALLOC_RESERVE = 128 << 20; + +DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); +unsigned long highstart_pfn, highend_pfn; + +static int noinline do_test_wp_bit(void); + +/* + * Creates a middle page table and puts a pointer to it in the + * given global directory entry. This only returns the gd entry + * in non-PAE compilation mode, since the middle layer is folded. + */ +static pmd_t * __init one_md_table_init(pgd_t *pgd) +{ + pmd_t *pmd_table; + +#ifdef CONFIG_X86_PAE + pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE); + set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT)); + if (pmd_table != pmd_offset(pgd, 0)) + BUG(); +#else + pmd_table = pmd_offset(pgd, 0); +#endif + + return pmd_table; +} + +/* + * Create a page table and place a pointer to it in a middle page + * directory entry. + */ +static pte_t * __init one_page_table_init(pmd_t *pmd) +{ + if (pmd_none(*pmd)) { + pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); + set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE)); + if (page_table != pte_offset_kernel(pmd, 0)) + BUG(); + + return page_table; + } + + return pte_offset_kernel(pmd, 0); +} + +/* + * This function initializes a certain range of kernel virtual memory + * with new bootmem page tables, everywhere page tables are missing in + * the given range. + */ + +/* + * NOTE: The pagetables are allocated contiguous on the physical space + * so we can cache the place of the first one and move around without + * checking the pgd every time. + */ +static void __init page_table_range_init (unsigned long start, unsigned long end, pgd_t *pgd_base) +{ + pgd_t *pgd; + pmd_t *pmd; + int pgd_idx, pmd_idx; + unsigned long vaddr; + + vaddr = start; + pgd_idx = pgd_index(vaddr); + pmd_idx = pmd_index(vaddr); + pgd = pgd_base + pgd_idx; + + for ( ; (pgd_idx < PTRS_PER_PGD) && (vaddr != end); pgd++, pgd_idx++) { + if (pgd_none(*pgd)) + one_md_table_init(pgd); + + pmd = pmd_offset(pgd, vaddr); + for (; (pmd_idx < PTRS_PER_PMD) && (vaddr != end); pmd++, pmd_idx++) { + if (pmd_none(*pmd)) + one_page_table_init(pmd); + + vaddr += PMD_SIZE; + } + pmd_idx = 0; + } +} + +static inline int is_kernel_text(unsigned long addr) +{ + if (addr >= (unsigned long)_stext && addr <= (unsigned long)__init_end) + return 1; + return 0; +} + +/* + * This maps the physical memory to kernel virtual address space, a total + * of max_low_pfn pages, by creating page tables starting from address + * PAGE_OFFSET. + */ +static void __init kernel_physical_mapping_init(pgd_t *pgd_base) +{ + unsigned long pfn; + pgd_t *pgd; + pmd_t *pmd; + pte_t *pte; + int pgd_idx, pmd_idx, pte_ofs; + + pgd_idx = pgd_index(PAGE_OFFSET); + pgd = pgd_base + pgd_idx; + pfn = 0; + + for (; pgd_idx < PTRS_PER_PGD; pgd++, pgd_idx++) { + pmd = one_md_table_init(pgd); + if (pfn >= max_low_pfn) + continue; + for (pmd_idx = 0; pmd_idx < PTRS_PER_PMD && pfn < max_low_pfn; pmd++, pmd_idx++) { + unsigned int address = pfn * PAGE_SIZE + PAGE_OFFSET; + + /* Map with big pages if possible, otherwise create normal page tables. */ + if (cpu_has_pse) { + unsigned int address2 = (pfn + PTRS_PER_PTE - 1) * PAGE_SIZE + PAGE_OFFSET + PAGE_SIZE-1; + + if (is_kernel_text(address) || is_kernel_text(address2)) + set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE_EXEC)); + else + set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE)); + pfn += PTRS_PER_PTE; + } else { + pte = one_page_table_init(pmd); + + for (pte_ofs = 0; pte_ofs < PTRS_PER_PTE && pfn < max_low_pfn; pte++, pfn++, pte_ofs++) { + if (is_kernel_text(address)) + set_pte(pte, pfn_pte(pfn, PAGE_KERNEL_EXEC)); + else + set_pte(pte, pfn_pte(pfn, PAGE_KERNEL)); + } + } + } + } +} + +static inline int page_kills_ppro(unsigned long pagenr) +{ + if (pagenr >= 0x70000 && pagenr <= 0x7003F) + return 1; + return 0; +} + +extern int is_available_memory(efi_memory_desc_t *); + +static inline int page_is_ram(unsigned long pagenr) +{ + int i; + unsigned long addr, end; + + if (efi_enabled) { + efi_memory_desc_t *md; + + for (i = 0; i < memmap.nr_map; i++) { + md = &memmap.map[i]; + if (!is_available_memory(md)) + continue; + addr = (md->phys_addr+PAGE_SIZE-1) >> PAGE_SHIFT; + end = (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >> PAGE_SHIFT; + + if ((pagenr >= addr) && (pagenr < end)) + return 1; + } + return 0; + } + + for (i = 0; i < e820.nr_map; i++) { + + if (e820.map[i].type != E820_RAM) /* not usable memory */ + continue; + /* + * !!!FIXME!!! Some BIOSen report areas as RAM that + * are not. Notably the 640->1Mb area. We need a sanity + * check here. + */ + addr = (e820.map[i].addr+PAGE_SIZE-1) >> PAGE_SHIFT; + end = (e820.map[i].addr+e820.map[i].size) >> PAGE_SHIFT; + if ((pagenr >= addr) && (pagenr < end)) + return 1; + } + return 0; +} + +#ifdef CONFIG_HIGHMEM +pte_t *kmap_pte; +pgprot_t kmap_prot; + +EXPORT_SYMBOL(kmap_prot); +EXPORT_SYMBOL(kmap_pte); + +#define kmap_get_fixmap_pte(vaddr) \ + pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)) + +void __init kmap_init(void) +{ + unsigned long kmap_vstart; + + /* cache the first kmap pte */ + kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN); + kmap_pte = kmap_get_fixmap_pte(kmap_vstart); + + kmap_prot = PAGE_KERNEL; +} + +void __init permanent_kmaps_init(pgd_t *pgd_base) +{ + pgd_t *pgd; + pmd_t *pmd; + pte_t *pte; + unsigned long vaddr; + + vaddr = PKMAP_BASE; + page_table_range_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base); + + pgd = swapper_pg_dir + pgd_index(vaddr); + pmd = pmd_offset(pgd, vaddr); + pte = pte_offset_kernel(pmd, vaddr); + pkmap_page_table = pte; +} + +void __init one_highpage_init(struct page *page, int pfn, int bad_ppro) +{ + if (page_is_ram(pfn) && !(bad_ppro && page_kills_ppro(pfn))) { + ClearPageReserved(page); + set_bit(PG_highmem, &page->flags); + set_page_count(page, 1); + __free_page(page); + totalhigh_pages++; + } else + SetPageReserved(page); +} + +#ifndef CONFIG_DISCONTIGMEM +void __init set_highmem_pages_init(int bad_ppro) +{ + int pfn; + for (pfn = highstart_pfn; pfn < highend_pfn; pfn++) + one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro); + totalram_pages += totalhigh_pages; +} +#else +extern void set_highmem_pages_init(int); +#endif /* !CONFIG_DISCONTIGMEM */ + +#else +#define kmap_init() do { } while (0) +#define permanent_kmaps_init(pgd_base) do { } while (0) +#define set_highmem_pages_init(bad_ppro) do { } while (0) +#endif /* CONFIG_HIGHMEM */ + +unsigned long long __PAGE_KERNEL = _PAGE_KERNEL; +unsigned long long __PAGE_KERNEL_EXEC = _PAGE_KERNEL_EXEC; + +#ifndef CONFIG_DISCONTIGMEM +#define remap_numa_kva() do {} while (0) +#else +extern void __init remap_numa_kva(void); +#endif + +static void __init pagetable_init (void) +{ + unsigned long vaddr; + pgd_t *pgd_base = swapper_pg_dir; + +#ifdef CONFIG_X86_PAE + int i; + /* Init entries of the first-level page table to the zero page */ + for (i = 0; i < PTRS_PER_PGD; i++) + set_pgd(pgd_base + i, __pgd(__pa(empty_zero_page) | _PAGE_PRESENT)); +#endif + + /* Enable PSE if available */ + if (cpu_has_pse) { + set_in_cr4(X86_CR4_PSE); + } + + /* Enable PGE if available */ + if (cpu_has_pge) { + set_in_cr4(X86_CR4_PGE); + __PAGE_KERNEL |= _PAGE_GLOBAL; + __PAGE_KERNEL_EXEC |= _PAGE_GLOBAL; + } + + kernel_physical_mapping_init(pgd_base); + remap_numa_kva(); + + /* + * Fixed mappings, only the page table structure has to be + * created - mappings will be set by set_fixmap(): + */ + vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; + page_table_range_init(vaddr, 0, pgd_base); + + permanent_kmaps_init(pgd_base); + +#ifdef CONFIG_X86_PAE + /* + * Add low memory identity-mappings - SMP needs it when + * starting up on an AP from real-mode. In the non-PAE + * case we already have these mappings through head.S. + * All user-space mappings are explicitly cleared after + * SMP startup. + */ + pgd_base[0] = pgd_base[USER_PTRS_PER_PGD]; +#endif +} + +#if defined(CONFIG_PM_DISK) || defined(CONFIG_SOFTWARE_SUSPEND) +/* + * Swap suspend & friends need this for resume because things like the intel-agp + * driver might have split up a kernel 4MB mapping. + */ +char __nosavedata swsusp_pg_dir[PAGE_SIZE] + __attribute__ ((aligned (PAGE_SIZE))); + +static inline void save_pg_dir(void) +{ + memcpy(swsusp_pg_dir, swapper_pg_dir, PAGE_SIZE); +} +#else +static inline void save_pg_dir(void) +{ +} +#endif + +void zap_low_mappings (void) +{ + int i; + + save_pg_dir(); + + /* + * Zap initial low-memory mappings. + * + * Note that "pgd_clear()" doesn't do it for + * us, because pgd_clear() is a no-op on i386. + */ + for (i = 0; i < USER_PTRS_PER_PGD; i++) +#ifdef CONFIG_X86_PAE + set_pgd(swapper_pg_dir+i, __pgd(1 + __pa(empty_zero_page))); +#else + set_pgd(swapper_pg_dir+i, __pgd(0)); +#endif + flush_tlb_all(); +} + +#ifndef CONFIG_DISCONTIGMEM +void __init zone_sizes_init(void) +{ + unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0}; + unsigned int max_dma, high, low; + + max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; + low = max_low_pfn; + high = highend_pfn; + + if (low < max_dma) + zones_size[ZONE_DMA] = low; + else { + zones_size[ZONE_DMA] = max_dma; + zones_size[ZONE_NORMAL] = low - max_dma; +#ifdef CONFIG_HIGHMEM + zones_size[ZONE_HIGHMEM] = high - low; +#endif + } + free_area_init(zones_size); +} +#else +extern void zone_sizes_init(void); +#endif /* !CONFIG_DISCONTIGMEM */ + +static int disable_nx __initdata = 0; +u64 __supported_pte_mask = ~_PAGE_NX; + +/* + * noexec = on|off + * + * Control non executable mappings. + * + * on Enable + * off Disable + */ +static int __init noexec_setup(char *str) +{ + if (!strncmp(str, "on",2) && cpu_has_nx) { + __supported_pte_mask |= _PAGE_NX; + disable_nx = 0; + } else if (!strncmp(str,"off",3)) { + disable_nx = 1; + __supported_pte_mask &= ~_PAGE_NX; + } + return 1; +} + +__setup("noexec=", noexec_setup); + +int nx_enabled = 0; +#ifdef CONFIG_X86_PAE + +static void __init set_nx(void) +{ + unsigned int v[4], l, h; + + if (cpu_has_pae && (cpuid_eax(0x80000000) > 0x80000001)) { + cpuid(0x80000001, &v[0], &v[1], &v[2], &v[3]); + if ((v[3] & (1 << 20)) && !disable_nx) { + rdmsr(MSR_EFER, l, h); + l |= EFER_NX; + wrmsr(MSR_EFER, l, h); + nx_enabled = 1; + __supported_pte_mask |= _PAGE_NX; + } + } +} + +/* + * Enables/disables executability of a given kernel page and + * returns the previous setting. + */ +int __init set_kernel_exec(unsigned long vaddr, int enable) +{ + pte_t *pte; + int ret = 1; + + if (!nx_enabled) + goto out; + + pte = lookup_address(vaddr); + BUG_ON(!pte); + + if (!pte_exec_kernel(*pte)) + ret = 0; + + if (enable) + pte->pte_high &= ~(1 << (_PAGE_BIT_NX - 32)); + else + pte->pte_high |= 1 << (_PAGE_BIT_NX - 32); + __flush_tlb_all(); +out: + return ret; +} + +#endif + +/* + * paging_init() sets up the page tables - note that the first 8MB are + * already mapped by head.S. + * + * This routines also unmaps the page at virtual kernel address 0, so + * that we can trap those pesky NULL-reference errors in the kernel. + */ +void __init paging_init(void) +{ +#ifdef CONFIG_X86_PAE + set_nx(); + if (nx_enabled) + printk("NX (Execute Disable) protection: active\n"); +#endif + + pagetable_init(); + + load_cr3(swapper_pg_dir); + +#ifdef CONFIG_X86_PAE + /* + * We will bail out later - printk doesn't work right now so + * the user would just see a hanging kernel. + */ + if (cpu_has_pae) + set_in_cr4(X86_CR4_PAE); +#endif + __flush_tlb_all(); + + kmap_init(); + zone_sizes_init(); +} + +/* + * Test if the WP bit works in supervisor mode. It isn't supported on 386's + * and also on some strange 486's (NexGen etc.). All 586+'s are OK. This + * used to involve black magic jumps to work around some nasty CPU bugs, + * but fortunately the switch to using exceptions got rid of all that. + */ + +void __init test_wp_bit(void) +{ + printk("Checking if this processor honours the WP bit even in supervisor mode... "); + + /* Any page-aligned address will do, the test is non-destructive */ + __set_fixmap(FIX_WP_TEST, __pa(&swapper_pg_dir), PAGE_READONLY); + boot_cpu_data.wp_works_ok = do_test_wp_bit(); + clear_fixmap(FIX_WP_TEST); + + if (!boot_cpu_data.wp_works_ok) { + printk("No.\n"); +#ifdef CONFIG_X86_WP_WORKS_OK + panic("This kernel doesn't support CPU's with broken WP. Recompile it for a 386!"); +#endif + } else { + printk("Ok.\n"); + } +} + +#ifndef CONFIG_DISCONTIGMEM +static void __init set_max_mapnr_init(void) +{ +#ifdef CONFIG_HIGHMEM + highmem_start_page = pfn_to_page(highstart_pfn); + max_mapnr = num_physpages = highend_pfn; +#else + max_mapnr = num_physpages = max_low_pfn; +#endif +} +#define __free_all_bootmem() free_all_bootmem() +#else +#define __free_all_bootmem() free_all_bootmem_node(NODE_DATA(0)) +extern void set_max_mapnr_init(void); +#endif /* !CONFIG_DISCONTIGMEM */ + +static struct kcore_list kcore_mem, kcore_vmalloc; + +void __init mem_init(void) +{ + extern int ppro_with_ram_bug(void); + int codesize, reservedpages, datasize, initsize; + int tmp; + int bad_ppro; + +#ifndef CONFIG_DISCONTIGMEM + if (!mem_map) + BUG(); +#endif + + bad_ppro = ppro_with_ram_bug(); + +#ifdef CONFIG_HIGHMEM + /* check that fixmap and pkmap do not overlap */ + if (PKMAP_BASE+LAST_PKMAP*PAGE_SIZE >= FIXADDR_START) { + printk(KERN_ERR "fixmap and kmap areas overlap - this will crash\n"); + printk(KERN_ERR "pkstart: %lxh pkend: %lxh fixstart %lxh\n", + PKMAP_BASE, PKMAP_BASE+LAST_PKMAP*PAGE_SIZE, FIXADDR_START); + BUG(); + } +#endif + + set_max_mapnr_init(); + +#ifdef CONFIG_HIGHMEM + high_memory = (void *) __va(highstart_pfn * PAGE_SIZE); +#else + high_memory = (void *) __va(max_low_pfn * PAGE_SIZE); +#endif + + /* this will put all low memory onto the freelists */ + totalram_pages += __free_all_bootmem(); + + reservedpages = 0; + for (tmp = 0; tmp < max_low_pfn; tmp++) + /* + * Only count reserved RAM pages + */ + if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp))) + reservedpages++; + + set_highmem_pages_init(bad_ppro); + + codesize = (unsigned long) &_etext - (unsigned long) &_text; + datasize = (unsigned long) &_edata - (unsigned long) &_etext; + initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; + + kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT); + kclist_add(&kcore_vmalloc, (void *)VMALLOC_START, + VMALLOC_END-VMALLOC_START); + + printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init, %ldk highmem)\n", + (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), + num_physpages << (PAGE_SHIFT-10), + codesize >> 10, + reservedpages << (PAGE_SHIFT-10), + datasize >> 10, + initsize >> 10, + (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10)) + ); + +#ifdef CONFIG_X86_PAE + if (!cpu_has_pae) + panic("cannot execute a PAE-enabled kernel on a PAE-less CPU!"); +#endif + if (boot_cpu_data.wp_works_ok < 0) + test_wp_bit(); + + /* + * Subtle. SMP is doing it's boot stuff late (because it has to + * fork idle threads) - but it also needs low mappings for the + * protected-mode entry to work. We zap these entries only after + * the WP-bit has been tested. + */ +#ifndef CONFIG_SMP + zap_low_mappings(); +#endif +} + +kmem_cache_t *pgd_cache; +kmem_cache_t *pmd_cache; + +void __init pgtable_cache_init(void) +{ + if (PTRS_PER_PMD > 1) { + pmd_cache = kmem_cache_create("pmd", + PTRS_PER_PMD*sizeof(pmd_t), + PTRS_PER_PMD*sizeof(pmd_t), + 0, + pmd_ctor, + NULL); + if (!pmd_cache) + panic("pgtable_cache_init(): cannot create pmd cache"); + } + pgd_cache = kmem_cache_create("pgd", + PTRS_PER_PGD*sizeof(pgd_t), + PTRS_PER_PGD*sizeof(pgd_t), + 0, + pgd_ctor, + PTRS_PER_PMD == 1 ? pgd_dtor : NULL); + if (!pgd_cache) + panic("pgtable_cache_init(): Cannot create pgd cache"); +} + +/* + * This function cannot be __init, since exceptions don't work in that + * section. Put this after the callers, so that it cannot be inlined. + */ +static int noinline do_test_wp_bit(void) +{ + char tmp_reg; + int flag; + + __asm__ __volatile__( + " movb %0,%1 \n" + "1: movb %1,%0 \n" + " xorl %2,%2 \n" + "2: \n" + ".section __ex_table,\"a\"\n" + " .align 4 \n" + " .long 1b,2b \n" + ".previous \n" + :"=m" (*(char *)fix_to_virt(FIX_WP_TEST)), + "=q" (tmp_reg), + "=r" (flag) + :"2" (1) + :"memory"); + + return flag; +} + +void free_initmem(void) +{ + unsigned long addr; + + addr = (unsigned long)(&__init_begin); + for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { + ClearPageReserved(virt_to_page(addr)); + set_page_count(virt_to_page(addr), 1); + memset((void *)addr, 0xcc, PAGE_SIZE); + free_page(addr); + totalram_pages++; + } + printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", (__init_end - __init_begin) >> 10); +} + +#ifdef CONFIG_BLK_DEV_INITRD +void free_initrd_mem(unsigned long start, unsigned long end) +{ + if (start < end) + printk (KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10); + for (; start < end; start += PAGE_SIZE) { + ClearPageReserved(virt_to_page(start)); + set_page_count(virt_to_page(start), 1); + free_page(start); + totalram_pages++; + } +} +#endif diff --git a/src/wraith/mm/ioremap.c b/src/wraith/mm/ioremap.c new file mode 100644 index 000000000..aee0bb1f4 --- /dev/null +++ b/src/wraith/mm/ioremap.c @@ -0,0 +1,307 @@ +/* + * arch/i386/mm/ioremap.c + * + * Re-map IO memory to kernel address space so that we can access it. + * This is needed for high PCI addresses that aren't mapped in the + * 640k-1MB IO memory area on PC's + * + * (C) Copyright 1995 1996 Linus Torvalds + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +static inline void remap_area_pte(pte_t * pte, unsigned long address, unsigned long size, + unsigned long phys_addr, unsigned long flags) +{ + unsigned long end; + unsigned long pfn; + + address &= ~PMD_MASK; + end = address + size; + if (end > PMD_SIZE) + end = PMD_SIZE; + if (address >= end) + BUG(); + pfn = phys_addr >> PAGE_SHIFT; + do { + if (!pte_none(*pte)) { + printk("remap_area_pte: page already exists\n"); + BUG(); + } + set_pte(pte, pfn_pte(pfn, __pgprot(_PAGE_PRESENT | _PAGE_RW | + _PAGE_DIRTY | _PAGE_ACCESSED | flags))); + address += PAGE_SIZE; + pfn++; + pte++; + } while (address && (address < end)); +} + +static inline int remap_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size, + unsigned long phys_addr, unsigned long flags) +{ + unsigned long end; + + address &= ~PGDIR_MASK; + end = address + size; + if (end > PGDIR_SIZE) + end = PGDIR_SIZE; + phys_addr -= address; + if (address >= end) + BUG(); + do { + pte_t * pte = pte_alloc_kernel(&init_mm, pmd, address); + if (!pte) + return -ENOMEM; + remap_area_pte(pte, address, end - address, address + phys_addr, flags); + address = (address + PMD_SIZE) & PMD_MASK; + pmd++; + } while (address && (address < end)); + return 0; +} + +static int remap_area_pages(unsigned long address, unsigned long phys_addr, + unsigned long size, unsigned long flags) +{ + int error; + pgd_t * dir; + unsigned long end = address + size; + + phys_addr -= address; + dir = pgd_offset(&init_mm, address); + flush_cache_all(); + if (address >= end) + BUG(); + spin_lock(&init_mm.page_table_lock); + do { + pmd_t *pmd; + pmd = pmd_alloc(&init_mm, dir, address); + error = -ENOMEM; + if (!pmd) + break; + if (remap_area_pmd(pmd, address, end - address, + phys_addr + address, flags)) + break; + error = 0; + address = (address + PGDIR_SIZE) & PGDIR_MASK; + dir++; + } while (address && (address < end)); + spin_unlock(&init_mm.page_table_lock); + flush_tlb_all(); + return error; +} + +/* + * Generic mapping function (not visible outside): + */ + +/* + * Remap an arbitrary physical address space into the kernel virtual + * address space. Needed when the kernel wants to access high addresses + * directly. + * + * NOTE! We need to allow non-page-aligned mappings too: we will obviously + * have to convert them into an offset in a page-aligned mapping, but the + * caller shouldn't need to know that small detail. + */ +void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) +{ + void __iomem * addr; + struct vm_struct * area; + unsigned long offset, last_addr; + + /* Don't allow wraparound or zero size */ + last_addr = phys_addr + size - 1; + if (!size || last_addr < phys_addr) + return NULL; + + /* + * Don't remap the low PCI/ISA area, it's always mapped.. + */ + if (phys_addr >= 0xA0000 && last_addr < 0x100000) + return (void __iomem *) phys_to_virt(phys_addr); + + /* + * Don't allow anybody to remap normal RAM that we're using.. + */ + if (phys_addr < virt_to_phys(high_memory)) { + char *t_addr, *t_end; + struct page *page; + + t_addr = __va(phys_addr); + t_end = t_addr + (size - 1); + + for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++) + if(!PageReserved(page)) + return NULL; + } + + /* + * Mappings have to be page-aligned + */ + offset = phys_addr & ~PAGE_MASK; + phys_addr &= PAGE_MASK; + size = PAGE_ALIGN(last_addr+1) - phys_addr; + + /* + * Ok, go for it.. + */ + area = get_vm_area(size, VM_IOREMAP); + if (!area) + return NULL; + area->phys_addr = phys_addr; + addr = (void __iomem *) area->addr; + if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) { + vunmap((void __force *) addr); + return NULL; + } + return (void __iomem *) (offset + (char __iomem *)addr); +} + + +/** + * ioremap_nocache - map bus memory into CPU space + * @offset: bus address of the memory + * @size: size of the resource to map + * + * ioremap_nocache performs a platform specific sequence of operations to + * make bus memory CPU accessible via the readb/readw/readl/writeb/ + * writew/writel functions and the other mmio helpers. The returned + * address is not guaranteed to be usable directly as a virtual + * address. + * + * This version of ioremap ensures that the memory is marked uncachable + * on the CPU as well as honouring existing caching rules from things like + * the PCI bus. Note that there are other caches and buffers on many + * busses. In particular driver authors should read up on PCI writes + * + * It's useful if some control registers are in such an area and + * write combining or read caching is not desirable: + * + * Must be freed with iounmap. + */ + +void __iomem *ioremap_nocache (unsigned long phys_addr, unsigned long size) +{ + unsigned long last_addr; + void __iomem *p = __ioremap(phys_addr, size, _PAGE_PCD); + if (!p) + return p; + + /* Guaranteed to be > phys_addr, as per __ioremap() */ + last_addr = phys_addr + size - 1; + + if (last_addr < virt_to_phys(high_memory)) { + struct page *ppage = virt_to_page(__va(phys_addr)); + unsigned long npages; + + phys_addr &= PAGE_MASK; + + /* This might overflow and become zero.. */ + last_addr = PAGE_ALIGN(last_addr); + + /* .. but that's ok, because modulo-2**n arithmetic will make + * the page-aligned "last - first" come out right. + */ + npages = (last_addr - phys_addr) >> PAGE_SHIFT; + + if (change_page_attr(ppage, npages, PAGE_KERNEL_NOCACHE) < 0) { + iounmap(p); + p = NULL; + } + global_flush_tlb(); + } + + return p; +} + +void iounmap(volatile void __iomem *addr) +{ + struct vm_struct *p; + if ((void __force *) addr <= high_memory) + return; + p = remove_vm_area((void *) (PAGE_MASK & (unsigned long __force) addr)); + if (!p) { + printk("__iounmap: bad address %p\n", addr); + return; + } + + if (p->flags && p->phys_addr < virt_to_phys(high_memory)) { + change_page_attr(virt_to_page(__va(p->phys_addr)), + p->size >> PAGE_SHIFT, + PAGE_KERNEL); + global_flush_tlb(); + } + kfree(p); +} + +void __init *bt_ioremap(unsigned long phys_addr, unsigned long size) +{ + unsigned long offset, last_addr; + unsigned int nrpages; + enum fixed_addresses idx; + + /* Don't allow wraparound or zero size */ + last_addr = phys_addr + size - 1; + if (!size || last_addr < phys_addr) + return NULL; + + /* + * Don't remap the low PCI/ISA area, it's always mapped.. + */ + if (phys_addr >= 0xA0000 && last_addr < 0x100000) + return phys_to_virt(phys_addr); + + /* + * Mappings have to be page-aligned + */ + offset = phys_addr & ~PAGE_MASK; + phys_addr &= PAGE_MASK; + size = PAGE_ALIGN(last_addr) - phys_addr; + + /* + * Mappings have to fit in the FIX_BTMAP area. + */ + nrpages = size >> PAGE_SHIFT; + if (nrpages > NR_FIX_BTMAPS) + return NULL; + + /* + * Ok, go for it.. + */ + idx = FIX_BTMAP_BEGIN; + while (nrpages > 0) { + set_fixmap(idx, phys_addr); + phys_addr += PAGE_SIZE; + --idx; + --nrpages; + } + return (void*) (offset + fix_to_virt(FIX_BTMAP_BEGIN)); +} + +void __init bt_iounmap(void *addr, unsigned long size) +{ + unsigned long virt_addr; + unsigned long offset; + unsigned int nrpages; + enum fixed_addresses idx; + + virt_addr = (unsigned long)addr; + if (virt_addr < fix_to_virt(FIX_BTMAP_BEGIN)) + return; + offset = virt_addr & ~PAGE_MASK; + nrpages = PAGE_ALIGN(offset + size - 1) >> PAGE_SHIFT; + + idx = FIX_BTMAP_BEGIN; + while (nrpages > 0) { + clear_fixmap(idx); + --idx; + --nrpages; + } +} diff --git a/src/wraith/mm/mmap.c b/src/wraith/mm/mmap.c new file mode 100644 index 000000000..c5e0d0119 --- /dev/null +++ b/src/wraith/mm/mmap.c @@ -0,0 +1,71 @@ +/* + * linux/arch/i386/mm/mmap.c + * + * flexible mmap layout support + * + * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * Started by Ingo Molnar + */ + +#include +#include + +/* + * Top of mmap area (just below the process stack). + * + * Leave an at least ~128 MB hole. + */ +#define MIN_GAP (128*1024*1024) +#define MAX_GAP (TASK_SIZE/6*5) + +static inline unsigned long mmap_base(struct mm_struct *mm) +{ + unsigned long gap = current->signal->rlim[RLIMIT_STACK].rlim_cur; + + if (gap < MIN_GAP) + gap = MIN_GAP; + else if (gap > MAX_GAP) + gap = MAX_GAP; + + return TASK_SIZE - (gap & PAGE_MASK); +} + +/* + * This function, called very early during the creation of a new + * process VM image, sets up which VM layout function to use: + */ +void arch_pick_mmap_layout(struct mm_struct *mm) +{ + /* + * Fall back to the standard layout if the personality + * bit is set, or if the expected stack growth is unlimited: + */ + if (sysctl_legacy_va_layout || + (current->personality & ADDR_COMPAT_LAYOUT) || + current->signal->rlim[RLIMIT_STACK].rlim_cur == RLIM_INFINITY) { + mm->mmap_base = TASK_UNMAPPED_BASE; + mm->get_unmapped_area = arch_get_unmapped_area; + mm->unmap_area = arch_unmap_area; + } else { + mm->mmap_base = mmap_base(mm); + mm->get_unmapped_area = arch_get_unmapped_area_topdown; + mm->unmap_area = arch_unmap_area_topdown; + } +} diff --git a/src/wraith/mm/pageattr.c b/src/wraith/mm/pageattr.c new file mode 100644 index 000000000..33bbf2baa --- /dev/null +++ b/src/wraith/mm/pageattr.c @@ -0,0 +1,214 @@ +/* + * Copyright 2002 Andi Kleen, SuSE Labs. + * Thanks to Ben LaHaise for precious feedback. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static spinlock_t cpa_lock = SPIN_LOCK_UNLOCKED; +static struct list_head df_list = LIST_HEAD_INIT(df_list); + + +pte_t *lookup_address(unsigned long address) +{ + pgd_t *pgd = pgd_offset_k(address); + pmd_t *pmd; + if (pgd_none(*pgd)) + return NULL; + pmd = pmd_offset(pgd, address); + if (pmd_none(*pmd)) + return NULL; + if (pmd_large(*pmd)) + return (pte_t *)pmd; + return pte_offset_kernel(pmd, address); +} + +static struct page *split_large_page(unsigned long address, pgprot_t prot) +{ + int i; + unsigned long addr; + struct page *base; + pte_t *pbase; + + spin_unlock_irq(&cpa_lock); + base = alloc_pages(GFP_KERNEL, 0); + spin_lock_irq(&cpa_lock); + if (!base) + return NULL; + + address = __pa(address); + addr = address & LARGE_PAGE_MASK; + pbase = (pte_t *)page_address(base); + for (i = 0; i < PTRS_PER_PTE; i++, addr += PAGE_SIZE) { + pbase[i] = pfn_pte(addr >> PAGE_SHIFT, + addr == address ? prot : PAGE_KERNEL); + } + return base; +} + +static void flush_kernel_map(void *dummy) +{ + /* Could use CLFLUSH here if the CPU supports it (Hammer,P4) */ + if (boot_cpu_data.x86_model >= 4) + asm volatile("wbinvd":::"memory"); + /* Flush all to work around Errata in early athlons regarding + * large page flushing. + */ + __flush_tlb_all(); +} + +static void set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte) +{ + struct page *page; + unsigned long flags; + + set_pte_atomic(kpte, pte); /* change init_mm */ + if (PTRS_PER_PMD > 1) + return; + + spin_lock_irqsave(&pgd_lock, flags); + for (page = pgd_list; page; page = (struct page *)page->index) { + pgd_t *pgd; + pmd_t *pmd; + pgd = (pgd_t *)page_address(page) + pgd_index(address); + pmd = pmd_offset(pgd, address); + set_pte_atomic((pte_t *)pmd, pte); + } + spin_unlock_irqrestore(&pgd_lock, flags); +} + +/* + * No more special protections in this 2/4MB area - revert to a + * large page again. + */ +static inline void revert_page(struct page *kpte_page, unsigned long address) +{ + pte_t *linear = (pte_t *) + pmd_offset(pgd_offset(&init_mm, address), address); + set_pmd_pte(linear, address, + pfn_pte((__pa(address) & LARGE_PAGE_MASK) >> PAGE_SHIFT, + PAGE_KERNEL_LARGE)); +} + +static int +__change_page_attr(struct page *page, pgprot_t prot) +{ + pte_t *kpte; + unsigned long address; + struct page *kpte_page; + +#ifdef CONFIG_HIGHMEM + if (page >= highmem_start_page) + BUG(); +#endif + address = (unsigned long)page_address(page); + + kpte = lookup_address(address); + if (!kpte) + return -EINVAL; + kpte_page = virt_to_page(kpte); + if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL)) { + if ((pte_val(*kpte) & _PAGE_PSE) == 0) { + pte_t old = *kpte; + pte_t standard = mk_pte(page, PAGE_KERNEL); + set_pte_atomic(kpte, mk_pte(page, prot)); + if (pte_same(old,standard)) + get_page(kpte_page); + } else { + struct page *split = split_large_page(address, prot); + if (!split) + return -ENOMEM; + get_page(kpte_page); + set_pmd_pte(kpte,address,mk_pte(split, PAGE_KERNEL)); + } + } else if ((pte_val(*kpte) & _PAGE_PSE) == 0) { + set_pte_atomic(kpte, mk_pte(page, PAGE_KERNEL)); + __put_page(kpte_page); + } + + if (cpu_has_pse && (page_count(kpte_page) == 1)) { + list_add(&kpte_page->lru, &df_list); + revert_page(kpte_page, address); + } + return 0; +} + +static inline void flush_map(void) +{ + on_each_cpu(flush_kernel_map, NULL, 1, 1); +} + +/* + * Change the page attributes of an page in the linear mapping. + * + * This should be used when a page is mapped with a different caching policy + * than write-back somewhere - some CPUs do not like it when mappings with + * different caching policies exist. This changes the page attributes of the + * in kernel linear mapping too. + * + * The caller needs to ensure that there are no conflicting mappings elsewhere. + * This function only deals with the kernel linear map. + * + * Caller must call global_flush_tlb() after this. + */ +int change_page_attr(struct page *page, int numpages, pgprot_t prot) +{ + int err = 0; + int i; + unsigned long flags; + + spin_lock_irqsave(&cpa_lock, flags); + for (i = 0; i < numpages; i++, page++) { + err = __change_page_attr(page, prot); + if (err) + break; + } + spin_unlock_irqrestore(&cpa_lock, flags); + return err; +} + +void global_flush_tlb(void) +{ + LIST_HEAD(l); + struct list_head* n; + + BUG_ON(irqs_disabled()); + + spin_lock_irq(&cpa_lock); + list_splice_init(&df_list, &l); + spin_unlock_irq(&cpa_lock); + flush_map(); + n = l.next; + while (n != &l) { + struct page *pg = list_entry(n, struct page, lru); + n = n->next; + __free_page(pg); + } +} + +#ifdef CONFIG_DEBUG_PAGEALLOC +void kernel_map_pages(struct page *page, int numpages, int enable) +{ + if (PageHighMem(page)) + return; + /* the return value is ignored - the calls cannot fail, + * large pages are disabled at boot time. + */ + change_page_attr(page, numpages, enable ? PAGE_KERNEL : __pgprot(0)); + /* we should perform an IPI and flush all tlbs, + * but that can deadlock->flush only current cpu. + */ + __flush_tlb_all(); +} +#endif + +EXPORT_SYMBOL(change_page_attr); +EXPORT_SYMBOL(global_flush_tlb); diff --git a/src/wraith/mm/pgtable.c b/src/wraith/mm/pgtable.c new file mode 100644 index 000000000..0cac3b6bf --- /dev/null +++ b/src/wraith/mm/pgtable.c @@ -0,0 +1,257 @@ +/* + * linux/arch/i386/mm/pgtable.c + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +void show_mem(void) +{ + int total = 0, reserved = 0; + int shared = 0, cached = 0; + int highmem = 0; + struct page *page; + pg_data_t *pgdat; + unsigned long i; + + printk("Mem-info:\n"); + show_free_areas(); + printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); + for_each_pgdat(pgdat) { + for (i = 0; i < pgdat->node_spanned_pages; ++i) { + page = pgdat->node_mem_map + i; + total++; + if (PageHighMem(page)) + highmem++; + if (PageReserved(page)) + reserved++; + else if (PageSwapCache(page)) + cached++; + else if (page_count(page)) + shared += page_count(page) - 1; + } + } + printk("%d pages of RAM\n", total); + printk("%d pages of HIGHMEM\n",highmem); + printk("%d reserved pages\n",reserved); + printk("%d pages shared\n",shared); + printk("%d pages swap cached\n",cached); +} + +/* + * Associate a virtual page frame with a given physical page frame + * and protection flags for that frame. + */ +static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags) +{ + pgd_t *pgd; + pmd_t *pmd; + pte_t *pte; + + pgd = swapper_pg_dir + pgd_index(vaddr); + if (pgd_none(*pgd)) { + BUG(); + return; + } + pmd = pmd_offset(pgd, vaddr); + if (pmd_none(*pmd)) { + BUG(); + return; + } + pte = pte_offset_kernel(pmd, vaddr); + /* stored as-is, to permit clearing entries */ + set_pte(pte, pfn_pte(pfn, flags)); + + /* + * It's enough to flush this one mapping. + * (PGE mappings get flushed as well) + */ + __flush_tlb_one(vaddr); +} + +/* + * Associate a large virtual page frame with a given physical page frame + * and protection flags for that frame. pfn is for the base of the page, + * vaddr is what the page gets mapped to - both must be properly aligned. + * The pmd must already be instantiated. Assumes PAE mode. + */ +void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags) +{ + pgd_t *pgd; + pmd_t *pmd; + + if (vaddr & (PMD_SIZE-1)) { /* vaddr is misaligned */ + printk ("set_pmd_pfn: vaddr misaligned\n"); + return; /* BUG(); */ + } + if (pfn & (PTRS_PER_PTE-1)) { /* pfn is misaligned */ + printk ("set_pmd_pfn: pfn misaligned\n"); + return; /* BUG(); */ + } + pgd = swapper_pg_dir + pgd_index(vaddr); + if (pgd_none(*pgd)) { + printk ("set_pmd_pfn: pgd_none\n"); + return; /* BUG(); */ + } + pmd = pmd_offset(pgd, vaddr); + set_pmd(pmd, pfn_pmd(pfn, flags)); + /* + * It's enough to flush this one mapping. + * (PGE mappings get flushed as well) + */ + __flush_tlb_one(vaddr); +} + +void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags) +{ + unsigned long address = __fix_to_virt(idx); + + if (idx >= __end_of_fixed_addresses) { + BUG(); + return; + } + set_pte_pfn(address, phys >> PAGE_SHIFT, flags); +} + +pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) +{ + pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT); + if (pte) + clear_page(pte); + return pte; +} + +struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) +{ + struct page *pte; + +#ifdef CONFIG_HIGHPTE + pte = alloc_pages(GFP_KERNEL|__GFP_HIGHMEM|__GFP_REPEAT, 0); +#else + pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT, 0); +#endif + if (pte) + clear_highpage(pte); + return pte; +} + +void pmd_ctor(void *pmd, kmem_cache_t *cache, unsigned long flags) +{ + memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t)); +} + +/* + * List of all pgd's needed for non-PAE so it can invalidate entries + * in both cached and uncached pgd's; not needed for PAE since the + * kernel pmd is shared. If PAE were not to share the pmd a similar + * tactic would be needed. This is essentially codepath-based locking + * against pageattr.c; it is the unique case in which a valid change + * of kernel pagetables can't be lazily synchronized by vmalloc faults. + * vmalloc faults work because attached pagetables are never freed. + * The locking scheme was chosen on the basis of manfred's + * recommendations and having no core impact whatsoever. + * -- wli + */ +spinlock_t pgd_lock = SPIN_LOCK_UNLOCKED; +struct page *pgd_list; + +static inline void pgd_list_add(pgd_t *pgd) +{ + struct page *page = virt_to_page(pgd); + page->index = (unsigned long)pgd_list; + if (pgd_list) + pgd_list->private = (unsigned long)&page->index; + pgd_list = page; + page->private = (unsigned long)&pgd_list; +} + +static inline void pgd_list_del(pgd_t *pgd) +{ + struct page *next, **pprev, *page = virt_to_page(pgd); + next = (struct page *)page->index; + pprev = (struct page **)page->private; + *pprev = next; + if (next) + next->private = (unsigned long)pprev; +} + +void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused) +{ + unsigned long flags; + + if (PTRS_PER_PMD == 1) + spin_lock_irqsave(&pgd_lock, flags); + + memcpy((pgd_t *)pgd + USER_PTRS_PER_PGD, + swapper_pg_dir + USER_PTRS_PER_PGD, + (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); + + if (PTRS_PER_PMD > 1) + return; + + pgd_list_add(pgd); + spin_unlock_irqrestore(&pgd_lock, flags); + memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t)); +} + +/* never called when PTRS_PER_PMD > 1 */ +void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused) +{ + unsigned long flags; /* can be called from interrupt context */ + + spin_lock_irqsave(&pgd_lock, flags); + pgd_list_del(pgd); + spin_unlock_irqrestore(&pgd_lock, flags); +} + +pgd_t *pgd_alloc(struct mm_struct *mm) +{ + int i; + pgd_t *pgd = kmem_cache_alloc(pgd_cache, GFP_KERNEL); + + if (PTRS_PER_PMD == 1 || !pgd) + return pgd; + + for (i = 0; i < USER_PTRS_PER_PGD; ++i) { + pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL); + if (!pmd) + goto out_oom; + set_pgd(&pgd[i], __pgd(1 + __pa(pmd))); + } + return pgd; + +out_oom: + for (i--; i >= 0; i--) + kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1)); + kmem_cache_free(pgd_cache, pgd); + return NULL; +} + +void pgd_free(pgd_t *pgd) +{ + int i; + + /* in the PAE case user pgd entries are overwritten before usage */ + if (PTRS_PER_PMD > 1) + for (i = 0; i < USER_PTRS_PER_PGD; ++i) + kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1)); + /* in the non-PAE case, clear_page_tables() clears user pgd entries */ + kmem_cache_free(pgd_cache, pgd); +} diff --git a/src/wraith/oprofile/Kconfig b/src/wraith/oprofile/Kconfig new file mode 100644 index 000000000..5ade19801 --- /dev/null +++ b/src/wraith/oprofile/Kconfig @@ -0,0 +1,23 @@ + +menu "Profiling support" + depends on EXPERIMENTAL + +config PROFILING + bool "Profiling support (EXPERIMENTAL)" + help + Say Y here to enable the extended profiling support mechanisms used + by profilers such as OProfile. + + +config OPROFILE + tristate "OProfile system profiling (EXPERIMENTAL)" + depends on PROFILING + help + OProfile is a profiling system capable of profiling the + whole system, include the kernel, kernel modules, libraries, + and applications. + + If unsure, say N. + +endmenu + diff --git a/src/wraith/oprofile/init.c b/src/wraith/oprofile/init.c new file mode 100644 index 000000000..1b7747ca7 --- /dev/null +++ b/src/wraith/oprofile/init.c @@ -0,0 +1,42 @@ +/** + * @file init.c + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author John Levon + */ + +#include +#include +#include + +/* We support CPUs that have performance counters like the Pentium Pro + * with the NMI mode driver. + */ + +extern int nmi_init(struct oprofile_operations ** ops); +extern int nmi_timer_init(struct oprofile_operations **ops); +extern void nmi_exit(void); + +int __init oprofile_arch_init(struct oprofile_operations ** ops) +{ + int ret = -ENODEV; +#ifdef CONFIG_X86_LOCAL_APIC + ret = nmi_init(ops); +#endif + +#ifdef CONFIG_X86_IO_APIC + if (ret < 0) + ret = nmi_timer_init(ops); +#endif + return ret; +} + + +void oprofile_arch_exit(void) +{ +#ifdef CONFIG_X86_LOCAL_APIC + nmi_exit(); +#endif +} diff --git a/src/wraith/oprofile/nmi_int.c b/src/wraith/oprofile/nmi_int.c new file mode 100644 index 000000000..d3450dcc5 --- /dev/null +++ b/src/wraith/oprofile/nmi_int.c @@ -0,0 +1,430 @@ +/** + * @file nmi_int.c + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author John Levon + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "op_counter.h" +#include "op_x86_model.h" + +static struct op_x86_model_spec const * model; +static struct op_msrs cpu_msrs[NR_CPUS]; +static unsigned long saved_lvtpc[NR_CPUS]; + +static int nmi_start(void); +static void nmi_stop(void); + +/* 0 == registered but off, 1 == registered and on */ +static int nmi_enabled = 0; + +#ifdef CONFIG_PM + +static int nmi_suspend(struct sys_device *dev, u32 state) +{ + if (nmi_enabled == 1) + nmi_stop(); + return 0; +} + + +static int nmi_resume(struct sys_device *dev) +{ + if (nmi_enabled == 1) + nmi_start(); + return 0; +} + + +static struct sysdev_class oprofile_sysclass = { + set_kset_name("oprofile"), + .resume = nmi_resume, + .suspend = nmi_suspend, +}; + + +static struct sys_device device_oprofile = { + .id = 0, + .cls = &oprofile_sysclass, +}; + + +static int __init init_driverfs(void) +{ + int error; + if (!(error = sysdev_class_register(&oprofile_sysclass))) + error = sysdev_register(&device_oprofile); + return error; +} + + +static void __exit exit_driverfs(void) +{ + sysdev_unregister(&device_oprofile); + sysdev_class_unregister(&oprofile_sysclass); +} + +#else +#define init_driverfs() do { } while (0) +#define exit_driverfs() do { } while (0) +#endif /* CONFIG_PM */ + + +static int nmi_callback(struct pt_regs * regs, int cpu) +{ + return model->check_ctrs(cpu, &cpu_msrs[cpu], regs); +} + + +static void nmi_cpu_save_registers(struct op_msrs * msrs) +{ + unsigned int const nr_ctrs = model->num_counters; + unsigned int const nr_ctrls = model->num_controls; + struct op_msr * counters = msrs->counters; + struct op_msr * controls = msrs->controls; + unsigned int i; + + for (i = 0; i < nr_ctrs; ++i) { + rdmsr(counters[i].addr, + counters[i].saved.low, + counters[i].saved.high); + } + + for (i = 0; i < nr_ctrls; ++i) { + rdmsr(controls[i].addr, + controls[i].saved.low, + controls[i].saved.high); + } +} + + +static void nmi_save_registers(void * dummy) +{ + int cpu = smp_processor_id(); + struct op_msrs * msrs = &cpu_msrs[cpu]; + model->fill_in_addresses(msrs); + nmi_cpu_save_registers(msrs); +} + + +static void free_msrs(void) +{ + int i; + for (i = 0; i < NR_CPUS; ++i) { + kfree(cpu_msrs[i].counters); + cpu_msrs[i].counters = NULL; + kfree(cpu_msrs[i].controls); + cpu_msrs[i].controls = NULL; + } +} + + +static int allocate_msrs(void) +{ + int success = 1; + size_t controls_size = sizeof(struct op_msr) * model->num_controls; + size_t counters_size = sizeof(struct op_msr) * model->num_counters; + + int i; + for (i = 0; i < NR_CPUS; ++i) { + if (!cpu_online(i)) + continue; + + cpu_msrs[i].counters = kmalloc(counters_size, GFP_KERNEL); + if (!cpu_msrs[i].counters) { + success = 0; + break; + } + cpu_msrs[i].controls = kmalloc(controls_size, GFP_KERNEL); + if (!cpu_msrs[i].controls) { + success = 0; + break; + } + } + + if (!success) + free_msrs(); + + return success; +} + + +static void nmi_cpu_setup(void * dummy) +{ + int cpu = smp_processor_id(); + struct op_msrs * msrs = &cpu_msrs[cpu]; + spin_lock(&oprofilefs_lock); + model->setup_ctrs(msrs); + spin_unlock(&oprofilefs_lock); + saved_lvtpc[cpu] = apic_read(APIC_LVTPC); + apic_write(APIC_LVTPC, APIC_DM_NMI); +} + + +static int nmi_setup(void) +{ + if (!allocate_msrs()) + return -ENOMEM; + + /* We walk a thin line between law and rape here. + * We need to be careful to install our NMI handler + * without actually triggering any NMIs as this will + * break the core code horrifically. + */ + if (reserve_lapic_nmi() < 0) { + free_msrs(); + return -EBUSY; + } + /* We need to serialize save and setup for HT because the subset + * of msrs are distinct for save and setup operations + */ + on_each_cpu(nmi_save_registers, NULL, 0, 1); + on_each_cpu(nmi_cpu_setup, NULL, 0, 1); + set_nmi_callback(nmi_callback); + nmi_enabled = 1; + return 0; +} + + +static void nmi_restore_registers(struct op_msrs * msrs) +{ + unsigned int const nr_ctrs = model->num_counters; + unsigned int const nr_ctrls = model->num_controls; + struct op_msr * counters = msrs->counters; + struct op_msr * controls = msrs->controls; + unsigned int i; + + for (i = 0; i < nr_ctrls; ++i) { + wrmsr(controls[i].addr, + controls[i].saved.low, + controls[i].saved.high); + } + + for (i = 0; i < nr_ctrs; ++i) { + wrmsr(counters[i].addr, + counters[i].saved.low, + counters[i].saved.high); + } +} + + +static void nmi_cpu_shutdown(void * dummy) +{ + unsigned int v; + int cpu = smp_processor_id(); + struct op_msrs * msrs = &cpu_msrs[cpu]; + + /* restoring APIC_LVTPC can trigger an apic error because the delivery + * mode and vector nr combination can be illegal. That's by design: on + * power on apic lvt contain a zero vector nr which are legal only for + * NMI delivery mode. So inhibit apic err before restoring lvtpc + */ + v = apic_read(APIC_LVTERR); + apic_write(APIC_LVTERR, v | APIC_LVT_MASKED); + apic_write(APIC_LVTPC, saved_lvtpc[cpu]); + apic_write(APIC_LVTERR, v); + nmi_restore_registers(msrs); +} + + +static void nmi_shutdown(void) +{ + nmi_enabled = 0; + on_each_cpu(nmi_cpu_shutdown, NULL, 0, 1); + unset_nmi_callback(); + release_lapic_nmi(); + free_msrs(); +} + + +static void nmi_cpu_start(void * dummy) +{ + struct op_msrs const * msrs = &cpu_msrs[smp_processor_id()]; + model->start(msrs); +} + + +static int nmi_start(void) +{ + on_each_cpu(nmi_cpu_start, NULL, 0, 1); + return 0; +} + + +static void nmi_cpu_stop(void * dummy) +{ + struct op_msrs const * msrs = &cpu_msrs[smp_processor_id()]; + model->stop(msrs); +} + + +static void nmi_stop(void) +{ + on_each_cpu(nmi_cpu_stop, NULL, 0, 1); +} + + +struct op_counter_config counter_config[OP_MAX_COUNTER]; + +static int nmi_create_files(struct super_block * sb, struct dentry * root) +{ + unsigned int i; + + for (i = 0; i < model->num_counters; ++i) { + struct dentry * dir; + char buf[2]; + + snprintf(buf, 2, "%d", i); + dir = oprofilefs_mkdir(sb, root, buf); + oprofilefs_create_ulong(sb, dir, "enabled", &counter_config[i].enabled); + oprofilefs_create_ulong(sb, dir, "event", &counter_config[i].event); + oprofilefs_create_ulong(sb, dir, "count", &counter_config[i].count); + oprofilefs_create_ulong(sb, dir, "unit_mask", &counter_config[i].unit_mask); + oprofilefs_create_ulong(sb, dir, "kernel", &counter_config[i].kernel); + oprofilefs_create_ulong(sb, dir, "user", &counter_config[i].user); + } + + return 0; +} + + +struct oprofile_operations nmi_ops = { + .create_files = nmi_create_files, + .setup = nmi_setup, + .shutdown = nmi_shutdown, + .start = nmi_start, + .stop = nmi_stop +}; + + +static int __init p4_init(void) +{ + __u8 cpu_model = current_cpu_data.x86_model; + + if (cpu_model > 3) + return 0; + +#ifndef CONFIG_SMP + nmi_ops.cpu_type = "i386/p4"; + model = &op_p4_spec; + return 1; +#else + switch (smp_num_siblings) { + case 1: + nmi_ops.cpu_type = "i386/p4"; + model = &op_p4_spec; + return 1; + + case 2: + nmi_ops.cpu_type = "i386/p4-ht"; + model = &op_p4_ht2_spec; + return 1; + } +#endif + + printk(KERN_INFO "oprofile: P4 HyperThreading detected with > 2 threads\n"); + printk(KERN_INFO "oprofile: Reverting to timer mode.\n"); + return 0; +} + + +static int __init ppro_init(void) +{ + __u8 cpu_model = current_cpu_data.x86_model; + + if (cpu_model > 0xd) + return 0; + + if (cpu_model == 9) { + nmi_ops.cpu_type = "i386/p6_mobile"; + } else if (cpu_model > 5) { + nmi_ops.cpu_type = "i386/piii"; + } else if (cpu_model > 2) { + nmi_ops.cpu_type = "i386/pii"; + } else { + nmi_ops.cpu_type = "i386/ppro"; + } + + model = &op_ppro_spec; + return 1; +} + +/* in order to get driverfs right */ +static int using_nmi; + +int __init nmi_init(struct oprofile_operations ** ops) +{ + __u8 vendor = current_cpu_data.x86_vendor; + __u8 family = current_cpu_data.x86; + + if (!cpu_has_apic) + return -ENODEV; + + switch (vendor) { + case X86_VENDOR_AMD: + /* Needs to be at least an Athlon (or hammer in 32bit mode) */ + + switch (family) { + default: + return -ENODEV; + case 6: + model = &op_athlon_spec; + nmi_ops.cpu_type = "i386/athlon"; + break; + case 0xf: + model = &op_athlon_spec; + /* Actually it could be i386/hammer too, but give + user space an consistent name. */ + nmi_ops.cpu_type = "x86-64/hammer"; + break; + } + break; + + case X86_VENDOR_INTEL: + switch (family) { + /* Pentium IV */ + case 0xf: + if (!p4_init()) + return -ENODEV; + break; + + /* A P6-class processor */ + case 6: + if (!ppro_init()) + return -ENODEV; + break; + + default: + return -ENODEV; + } + break; + + default: + return -ENODEV; + } + + init_driverfs(); + using_nmi = 1; + *ops = &nmi_ops; + printk(KERN_INFO "oprofile: using NMI interrupt.\n"); + return 0; +} + + +void __exit nmi_exit(void) +{ + if (using_nmi) + exit_driverfs(); +} diff --git a/src/wraith/oprofile/nmi_timer_int.c b/src/wraith/oprofile/nmi_timer_int.c new file mode 100644 index 000000000..c3351b824 --- /dev/null +++ b/src/wraith/oprofile/nmi_timer_int.c @@ -0,0 +1,61 @@ +/** + * @file nmi_timer_int.c + * + * @remark Copyright 2003 OProfile authors + * @remark Read the file COPYING + * + * @author Zwane Mwaikambo + */ + +#include +#include +#include +#include +#include + + +#include +#include +#include + +static int nmi_timer_callback(struct pt_regs * regs, int cpu) +{ + unsigned long eip = instruction_pointer(regs); + + oprofile_add_sample(eip, !user_mode(regs), 0, cpu); + return 1; +} + +static int timer_start(void) +{ + disable_timer_nmi_watchdog(); + set_nmi_callback(nmi_timer_callback); + return 0; +} + + +static void timer_stop(void) +{ + enable_timer_nmi_watchdog(); + unset_nmi_callback(); + synchronize_kernel(); +} + + +static struct oprofile_operations nmi_timer_ops = { + .start = timer_start, + .stop = timer_stop, + .cpu_type = "timer" +}; + +int __init nmi_timer_init(struct oprofile_operations ** ops) +{ + extern int nmi_active; + + if (nmi_active <= 0) + return -ENODEV; + + *ops = &nmi_timer_ops; + printk(KERN_INFO "oprofile: using NMI timer interrupt.\n"); + return 0; +} diff --git a/src/wraith/oprofile/op_counter.h b/src/wraith/oprofile/op_counter.h new file mode 100644 index 000000000..2880b15c4 --- /dev/null +++ b/src/wraith/oprofile/op_counter.h @@ -0,0 +1,29 @@ +/** + * @file op_counter.h + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author John Levon + */ + +#ifndef OP_COUNTER_H +#define OP_COUNTER_H + +#define OP_MAX_COUNTER 8 + +/* Per-perfctr configuration as set via + * oprofilefs. + */ +struct op_counter_config { + unsigned long count; + unsigned long enabled; + unsigned long event; + unsigned long kernel; + unsigned long user; + unsigned long unit_mask; +}; + +extern struct op_counter_config counter_config[]; + +#endif /* OP_COUNTER_H */ diff --git a/src/wraith/oprofile/op_model_athlon.c b/src/wraith/oprofile/op_model_athlon.c new file mode 100644 index 000000000..0d4e00f42 --- /dev/null +++ b/src/wraith/oprofile/op_model_athlon.c @@ -0,0 +1,152 @@ +/** + * @file op_model_athlon.h + * athlon / K7 model-specific MSR operations + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author John Levon + * @author Philippe Elie + * @author Graydon Hoare + */ + +#include +#include +#include + +#include "op_x86_model.h" +#include "op_counter.h" + +#define NUM_COUNTERS 4 +#define NUM_CONTROLS 4 + +#define CTR_READ(l,h,msrs,c) do {rdmsr(msrs->counters[(c)].addr, (l), (h));} while (0) +#define CTR_WRITE(l,msrs,c) do {wrmsr(msrs->counters[(c)].addr, -(unsigned int)(l), -1);} while (0) +#define CTR_OVERFLOWED(n) (!((n) & (1U<<31))) + +#define CTRL_READ(l,h,msrs,c) do {rdmsr(msrs->controls[(c)].addr, (l), (h));} while (0) +#define CTRL_WRITE(l,h,msrs,c) do {wrmsr(msrs->controls[(c)].addr, (l), (h));} while (0) +#define CTRL_SET_ACTIVE(n) (n |= (1<<22)) +#define CTRL_SET_INACTIVE(n) (n &= ~(1<<22)) +#define CTRL_CLEAR(x) (x &= (1<<21)) +#define CTRL_SET_ENABLE(val) (val |= 1<<20) +#define CTRL_SET_USR(val,u) (val |= ((u & 1) << 16)) +#define CTRL_SET_KERN(val,k) (val |= ((k & 1) << 17)) +#define CTRL_SET_UM(val, m) (val |= (m << 8)) +#define CTRL_SET_EVENT(val, e) (val |= e) + +static unsigned long reset_value[NUM_COUNTERS]; + +static void athlon_fill_in_addresses(struct op_msrs * const msrs) +{ + msrs->counters[0].addr = MSR_K7_PERFCTR0; + msrs->counters[1].addr = MSR_K7_PERFCTR1; + msrs->counters[2].addr = MSR_K7_PERFCTR2; + msrs->counters[3].addr = MSR_K7_PERFCTR3; + + msrs->controls[0].addr = MSR_K7_EVNTSEL0; + msrs->controls[1].addr = MSR_K7_EVNTSEL1; + msrs->controls[2].addr = MSR_K7_EVNTSEL2; + msrs->controls[3].addr = MSR_K7_EVNTSEL3; +} + + +static void athlon_setup_ctrs(struct op_msrs const * const msrs) +{ + unsigned int low, high; + int i; + + /* clear all counters */ + for (i = 0 ; i < NUM_CONTROLS; ++i) { + CTRL_READ(low, high, msrs, i); + CTRL_CLEAR(low); + CTRL_WRITE(low, high, msrs, i); + } + + /* avoid a false detection of ctr overflows in NMI handler */ + for (i = 0; i < NUM_COUNTERS; ++i) { + CTR_WRITE(1, msrs, i); + } + + /* enable active counters */ + for (i = 0; i < NUM_COUNTERS; ++i) { + if (counter_config[i].enabled) { + reset_value[i] = counter_config[i].count; + + CTR_WRITE(counter_config[i].count, msrs, i); + + CTRL_READ(low, high, msrs, i); + CTRL_CLEAR(low); + CTRL_SET_ENABLE(low); + CTRL_SET_USR(low, counter_config[i].user); + CTRL_SET_KERN(low, counter_config[i].kernel); + CTRL_SET_UM(low, counter_config[i].unit_mask); + CTRL_SET_EVENT(low, counter_config[i].event); + CTRL_WRITE(low, high, msrs, i); + } else { + reset_value[i] = 0; + } + } +} + + +static int athlon_check_ctrs(unsigned int const cpu, + struct op_msrs const * const msrs, + struct pt_regs * const regs) +{ + unsigned int low, high; + int i; + unsigned long eip = profile_pc(regs); + int is_kernel = !user_mode(regs); + + for (i = 0 ; i < NUM_COUNTERS; ++i) { + CTR_READ(low, high, msrs, i); + if (CTR_OVERFLOWED(low)) { + oprofile_add_sample(eip, is_kernel, i, cpu); + CTR_WRITE(reset_value[i], msrs, i); + } + } + + /* See op_model_ppro.c */ + return 1; +} + + +static void athlon_start(struct op_msrs const * const msrs) +{ + unsigned int low, high; + int i; + for (i = 0 ; i < NUM_COUNTERS ; ++i) { + if (reset_value[i]) { + CTRL_READ(low, high, msrs, i); + CTRL_SET_ACTIVE(low); + CTRL_WRITE(low, high, msrs, i); + } + } +} + + +static void athlon_stop(struct op_msrs const * const msrs) +{ + unsigned int low,high; + int i; + + /* Subtle: stop on all counters to avoid race with + * setting our pm callback */ + for (i = 0 ; i < NUM_COUNTERS ; ++i) { + CTRL_READ(low, high, msrs, i); + CTRL_SET_INACTIVE(low); + CTRL_WRITE(low, high, msrs, i); + } +} + + +struct op_x86_model_spec const op_athlon_spec = { + .num_counters = NUM_COUNTERS, + .num_controls = NUM_CONTROLS, + .fill_in_addresses = &athlon_fill_in_addresses, + .setup_ctrs = &athlon_setup_ctrs, + .check_ctrs = &athlon_check_ctrs, + .start = &athlon_start, + .stop = &athlon_stop +}; diff --git a/src/wraith/oprofile/op_model_p4.c b/src/wraith/oprofile/op_model_p4.c new file mode 100644 index 000000000..1b3626df5 --- /dev/null +++ b/src/wraith/oprofile/op_model_p4.c @@ -0,0 +1,728 @@ +/** + * @file op_model_p4.c + * P4 model-specific MSR operations + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author Graydon Hoare + */ + +#include +#include +#include +#include +#include +#include + +#include "op_x86_model.h" +#include "op_counter.h" + +#define NUM_EVENTS 39 + +#define NUM_COUNTERS_NON_HT 8 +#define NUM_ESCRS_NON_HT 45 +#define NUM_CCCRS_NON_HT 18 +#define NUM_CONTROLS_NON_HT (NUM_ESCRS_NON_HT + NUM_CCCRS_NON_HT) + +#define NUM_COUNTERS_HT2 4 +#define NUM_ESCRS_HT2 23 +#define NUM_CCCRS_HT2 9 +#define NUM_CONTROLS_HT2 (NUM_ESCRS_HT2 + NUM_CCCRS_HT2) + +static unsigned int num_counters = NUM_COUNTERS_NON_HT; + + +/* this has to be checked dynamically since the + hyper-threadedness of a chip is discovered at + kernel boot-time. */ +static inline void setup_num_counters(void) +{ +#ifdef CONFIG_SMP + if (smp_num_siblings == 2) + num_counters = NUM_COUNTERS_HT2; +#endif +} + +static int inline addr_increment(void) +{ +#ifdef CONFIG_SMP + return smp_num_siblings == 2 ? 2 : 1; +#else + return 1; +#endif +} + + +/* tables to simulate simplified hardware view of p4 registers */ +struct p4_counter_binding { + int virt_counter; + int counter_address; + int cccr_address; +}; + +struct p4_event_binding { + int escr_select; /* value to put in CCCR */ + int event_select; /* value to put in ESCR */ + struct { + int virt_counter; /* for this counter... */ + int escr_address; /* use this ESCR */ + } bindings[2]; +}; + +/* nb: these CTR_* defines are a duplicate of defines in + event/i386.p4*events. */ + + +#define CTR_BPU_0 (1 << 0) +#define CTR_MS_0 (1 << 1) +#define CTR_FLAME_0 (1 << 2) +#define CTR_IQ_4 (1 << 3) +#define CTR_BPU_2 (1 << 4) +#define CTR_MS_2 (1 << 5) +#define CTR_FLAME_2 (1 << 6) +#define CTR_IQ_5 (1 << 7) + +static struct p4_counter_binding p4_counters [NUM_COUNTERS_NON_HT] = { + { CTR_BPU_0, MSR_P4_BPU_PERFCTR0, MSR_P4_BPU_CCCR0 }, + { CTR_MS_0, MSR_P4_MS_PERFCTR0, MSR_P4_MS_CCCR0 }, + { CTR_FLAME_0, MSR_P4_FLAME_PERFCTR0, MSR_P4_FLAME_CCCR0 }, + { CTR_IQ_4, MSR_P4_IQ_PERFCTR4, MSR_P4_IQ_CCCR4 }, + { CTR_BPU_2, MSR_P4_BPU_PERFCTR2, MSR_P4_BPU_CCCR2 }, + { CTR_MS_2, MSR_P4_MS_PERFCTR2, MSR_P4_MS_CCCR2 }, + { CTR_FLAME_2, MSR_P4_FLAME_PERFCTR2, MSR_P4_FLAME_CCCR2 }, + { CTR_IQ_5, MSR_P4_IQ_PERFCTR5, MSR_P4_IQ_CCCR5 } +}; + +#define NUM_UNUSED_CCCRS NUM_CCCRS_NON_HT - NUM_COUNTERS_NON_HT + +/* All cccr we don't use. */ +static int p4_unused_cccr[NUM_UNUSED_CCCRS] = { + MSR_P4_BPU_CCCR1, MSR_P4_BPU_CCCR3, + MSR_P4_MS_CCCR1, MSR_P4_MS_CCCR3, + MSR_P4_FLAME_CCCR1, MSR_P4_FLAME_CCCR3, + MSR_P4_IQ_CCCR0, MSR_P4_IQ_CCCR1, + MSR_P4_IQ_CCCR2, MSR_P4_IQ_CCCR3 +}; + +/* p4 event codes in libop/op_event.h are indices into this table. */ + +static struct p4_event_binding p4_events[NUM_EVENTS] = { + + { /* BRANCH_RETIRED */ + 0x05, 0x06, + { {CTR_IQ_4, MSR_P4_CRU_ESCR2}, + {CTR_IQ_5, MSR_P4_CRU_ESCR3} } + }, + + { /* MISPRED_BRANCH_RETIRED */ + 0x04, 0x03, + { { CTR_IQ_4, MSR_P4_CRU_ESCR0}, + { CTR_IQ_5, MSR_P4_CRU_ESCR1} } + }, + + { /* TC_DELIVER_MODE */ + 0x01, 0x01, + { { CTR_MS_0, MSR_P4_TC_ESCR0}, + { CTR_MS_2, MSR_P4_TC_ESCR1} } + }, + + { /* BPU_FETCH_REQUEST */ + 0x00, 0x03, + { { CTR_BPU_0, MSR_P4_BPU_ESCR0}, + { CTR_BPU_2, MSR_P4_BPU_ESCR1} } + }, + + { /* ITLB_REFERENCE */ + 0x03, 0x18, + { { CTR_BPU_0, MSR_P4_ITLB_ESCR0}, + { CTR_BPU_2, MSR_P4_ITLB_ESCR1} } + }, + + { /* MEMORY_CANCEL */ + 0x05, 0x02, + { { CTR_FLAME_0, MSR_P4_DAC_ESCR0}, + { CTR_FLAME_2, MSR_P4_DAC_ESCR1} } + }, + + { /* MEMORY_COMPLETE */ + 0x02, 0x08, + { { CTR_FLAME_0, MSR_P4_SAAT_ESCR0}, + { CTR_FLAME_2, MSR_P4_SAAT_ESCR1} } + }, + + { /* LOAD_PORT_REPLAY */ + 0x02, 0x04, + { { CTR_FLAME_0, MSR_P4_SAAT_ESCR0}, + { CTR_FLAME_2, MSR_P4_SAAT_ESCR1} } + }, + + { /* STORE_PORT_REPLAY */ + 0x02, 0x05, + { { CTR_FLAME_0, MSR_P4_SAAT_ESCR0}, + { CTR_FLAME_2, MSR_P4_SAAT_ESCR1} } + }, + + { /* MOB_LOAD_REPLAY */ + 0x02, 0x03, + { { CTR_BPU_0, MSR_P4_MOB_ESCR0}, + { CTR_BPU_2, MSR_P4_MOB_ESCR1} } + }, + + { /* PAGE_WALK_TYPE */ + 0x04, 0x01, + { { CTR_BPU_0, MSR_P4_PMH_ESCR0}, + { CTR_BPU_2, MSR_P4_PMH_ESCR1} } + }, + + { /* BSQ_CACHE_REFERENCE */ + 0x07, 0x0c, + { { CTR_BPU_0, MSR_P4_BSU_ESCR0}, + { CTR_BPU_2, MSR_P4_BSU_ESCR1} } + }, + + { /* IOQ_ALLOCATION */ + 0x06, 0x03, + { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, + { 0, 0 } } + }, + + { /* IOQ_ACTIVE_ENTRIES */ + 0x06, 0x1a, + { { CTR_BPU_2, MSR_P4_FSB_ESCR1}, + { 0, 0 } } + }, + + { /* FSB_DATA_ACTIVITY */ + 0x06, 0x17, + { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, + { CTR_BPU_2, MSR_P4_FSB_ESCR1} } + }, + + { /* BSQ_ALLOCATION */ + 0x07, 0x05, + { { CTR_BPU_0, MSR_P4_BSU_ESCR0}, + { 0, 0 } } + }, + + { /* BSQ_ACTIVE_ENTRIES */ + 0x07, 0x06, + { { CTR_BPU_2, MSR_P4_BSU_ESCR1 /* guess */}, + { 0, 0 } } + }, + + { /* X87_ASSIST */ + 0x05, 0x03, + { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, + { CTR_IQ_5, MSR_P4_CRU_ESCR3} } + }, + + { /* SSE_INPUT_ASSIST */ + 0x01, 0x34, + { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, + { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } + }, + + { /* PACKED_SP_UOP */ + 0x01, 0x08, + { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, + { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } + }, + + { /* PACKED_DP_UOP */ + 0x01, 0x0c, + { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, + { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } + }, + + { /* SCALAR_SP_UOP */ + 0x01, 0x0a, + { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, + { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } + }, + + { /* SCALAR_DP_UOP */ + 0x01, 0x0e, + { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, + { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } + }, + + { /* 64BIT_MMX_UOP */ + 0x01, 0x02, + { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, + { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } + }, + + { /* 128BIT_MMX_UOP */ + 0x01, 0x1a, + { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, + { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } + }, + + { /* X87_FP_UOP */ + 0x01, 0x04, + { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, + { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } + }, + + { /* X87_SIMD_MOVES_UOP */ + 0x01, 0x2e, + { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, + { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } + }, + + { /* MACHINE_CLEAR */ + 0x05, 0x02, + { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, + { CTR_IQ_5, MSR_P4_CRU_ESCR3} } + }, + + { /* GLOBAL_POWER_EVENTS */ + 0x06, 0x13 /* older manual says 0x05, newer 0x13 */, + { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, + { CTR_BPU_2, MSR_P4_FSB_ESCR1} } + }, + + { /* TC_MS_XFER */ + 0x00, 0x05, + { { CTR_MS_0, MSR_P4_MS_ESCR0}, + { CTR_MS_2, MSR_P4_MS_ESCR1} } + }, + + { /* UOP_QUEUE_WRITES */ + 0x00, 0x09, + { { CTR_MS_0, MSR_P4_MS_ESCR0}, + { CTR_MS_2, MSR_P4_MS_ESCR1} } + }, + + { /* FRONT_END_EVENT */ + 0x05, 0x08, + { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, + { CTR_IQ_5, MSR_P4_CRU_ESCR3} } + }, + + { /* EXECUTION_EVENT */ + 0x05, 0x0c, + { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, + { CTR_IQ_5, MSR_P4_CRU_ESCR3} } + }, + + { /* REPLAY_EVENT */ + 0x05, 0x09, + { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, + { CTR_IQ_5, MSR_P4_CRU_ESCR3} } + }, + + { /* INSTR_RETIRED */ + 0x04, 0x02, + { { CTR_IQ_4, MSR_P4_CRU_ESCR0}, + { CTR_IQ_5, MSR_P4_CRU_ESCR1} } + }, + + { /* UOPS_RETIRED */ + 0x04, 0x01, + { { CTR_IQ_4, MSR_P4_CRU_ESCR0}, + { CTR_IQ_5, MSR_P4_CRU_ESCR1} } + }, + + { /* UOP_TYPE */ + 0x02, 0x02, + { { CTR_IQ_4, MSR_P4_RAT_ESCR0}, + { CTR_IQ_5, MSR_P4_RAT_ESCR1} } + }, + + { /* RETIRED_MISPRED_BRANCH_TYPE */ + 0x02, 0x05, + { { CTR_MS_0, MSR_P4_TBPU_ESCR0}, + { CTR_MS_2, MSR_P4_TBPU_ESCR1} } + }, + + { /* RETIRED_BRANCH_TYPE */ + 0x02, 0x04, + { { CTR_MS_0, MSR_P4_TBPU_ESCR0}, + { CTR_MS_2, MSR_P4_TBPU_ESCR1} } + } +}; + + +#define MISC_PMC_ENABLED_P(x) ((x) & 1 << 7) + +#define ESCR_RESERVED_BITS 0x80000003 +#define ESCR_CLEAR(escr) ((escr) &= ESCR_RESERVED_BITS) +#define ESCR_SET_USR_0(escr, usr) ((escr) |= (((usr) & 1) << 2)) +#define ESCR_SET_OS_0(escr, os) ((escr) |= (((os) & 1) << 3)) +#define ESCR_SET_USR_1(escr, usr) ((escr) |= (((usr) & 1))) +#define ESCR_SET_OS_1(escr, os) ((escr) |= (((os) & 1) << 1)) +#define ESCR_SET_EVENT_SELECT(escr, sel) ((escr) |= (((sel) & 0x3f) << 25)) +#define ESCR_SET_EVENT_MASK(escr, mask) ((escr) |= (((mask) & 0xffff) << 9)) +#define ESCR_READ(escr,high,ev,i) do {rdmsr(ev->bindings[(i)].escr_address, (escr), (high));} while (0) +#define ESCR_WRITE(escr,high,ev,i) do {wrmsr(ev->bindings[(i)].escr_address, (escr), (high));} while (0) + +#define CCCR_RESERVED_BITS 0x38030FFF +#define CCCR_CLEAR(cccr) ((cccr) &= CCCR_RESERVED_BITS) +#define CCCR_SET_REQUIRED_BITS(cccr) ((cccr) |= 0x00030000) +#define CCCR_SET_ESCR_SELECT(cccr, sel) ((cccr) |= (((sel) & 0x07) << 13)) +#define CCCR_SET_PMI_OVF_0(cccr) ((cccr) |= (1<<26)) +#define CCCR_SET_PMI_OVF_1(cccr) ((cccr) |= (1<<27)) +#define CCCR_SET_ENABLE(cccr) ((cccr) |= (1<<12)) +#define CCCR_SET_DISABLE(cccr) ((cccr) &= ~(1<<12)) +#define CCCR_READ(low, high, i) do {rdmsr(p4_counters[(i)].cccr_address, (low), (high));} while (0) +#define CCCR_WRITE(low, high, i) do {wrmsr(p4_counters[(i)].cccr_address, (low), (high));} while (0) +#define CCCR_OVF_P(cccr) ((cccr) & (1U<<31)) +#define CCCR_CLEAR_OVF(cccr) ((cccr) &= (~(1U<<31))) + +#define CTR_READ(l,h,i) do {rdmsr(p4_counters[(i)].counter_address, (l), (h));} while (0) +#define CTR_WRITE(l,i) do {wrmsr(p4_counters[(i)].counter_address, -(u32)(l), -1);} while (0) +#define CTR_OVERFLOW_P(ctr) (!((ctr) & 0x80000000)) + + +/* this assigns a "stagger" to the current CPU, which is used throughout + the code in this module as an extra array offset, to select the "even" + or "odd" part of all the divided resources. */ +static unsigned int get_stagger(void) +{ +#ifdef CONFIG_SMP + int cpu = smp_processor_id(); + return (cpu != first_cpu(cpu_sibling_map[cpu])); +#endif + return 0; +} + + +/* finally, mediate access to a real hardware counter + by passing a "virtual" counter numer to this macro, + along with your stagger setting. */ +#define VIRT_CTR(stagger, i) ((i) + ((num_counters) * (stagger))) + +static unsigned long reset_value[NUM_COUNTERS_NON_HT]; + + +static void p4_fill_in_addresses(struct op_msrs * const msrs) +{ + unsigned int i; + unsigned int addr, stag; + + setup_num_counters(); + stag = get_stagger(); + + /* the counter registers we pay attention to */ + for (i = 0; i < num_counters; ++i) { + msrs->counters[i].addr = + p4_counters[VIRT_CTR(stag, i)].counter_address; + } + + /* FIXME: bad feeling, we don't save the 10 counters we don't use. */ + + /* 18 CCCR registers */ + for (i = 0, addr = MSR_P4_BPU_CCCR0 + stag; + addr <= MSR_P4_IQ_CCCR5; ++i, addr += addr_increment()) { + msrs->controls[i].addr = addr; + } + + /* 43 ESCR registers in three or four discontiguous group */ + for (addr = MSR_P4_BSU_ESCR0 + stag; + addr < MSR_P4_IQ_ESCR0; ++i, addr += addr_increment()) { + msrs->controls[i].addr = addr; + } + + /* no IQ_ESCR0/1 on some models, we save a seconde time BSU_ESCR0/1 + * to avoid special case in nmi_{save|restore}_registers() */ + if (boot_cpu_data.x86_model >= 0x3) { + for (addr = MSR_P4_BSU_ESCR0 + stag; + addr <= MSR_P4_BSU_ESCR1; ++i, addr += addr_increment()) { + msrs->controls[i].addr = addr; + } + } else { + for (addr = MSR_P4_IQ_ESCR0 + stag; + addr <= MSR_P4_IQ_ESCR1; ++i, addr += addr_increment()) { + msrs->controls[i].addr = addr; + } + } + + for (addr = MSR_P4_RAT_ESCR0 + stag; + addr <= MSR_P4_SSU_ESCR0; ++i, addr += addr_increment()) { + msrs->controls[i].addr = addr; + } + + for (addr = MSR_P4_MS_ESCR0 + stag; + addr <= MSR_P4_TC_ESCR1; ++i, addr += addr_increment()) { + msrs->controls[i].addr = addr; + } + + for (addr = MSR_P4_IX_ESCR0 + stag; + addr <= MSR_P4_CRU_ESCR3; ++i, addr += addr_increment()) { + msrs->controls[i].addr = addr; + } + + /* there are 2 remaining non-contiguously located ESCRs */ + + if (num_counters == NUM_COUNTERS_NON_HT) { + /* standard non-HT CPUs handle both remaining ESCRs*/ + msrs->controls[i++].addr = MSR_P4_CRU_ESCR5; + msrs->controls[i++].addr = MSR_P4_CRU_ESCR4; + + } else if (stag == 0) { + /* HT CPUs give the first remainder to the even thread, as + the 32nd control register */ + msrs->controls[i++].addr = MSR_P4_CRU_ESCR4; + + } else { + /* and two copies of the second to the odd thread, + for the 22st and 23nd control registers */ + msrs->controls[i++].addr = MSR_P4_CRU_ESCR5; + msrs->controls[i++].addr = MSR_P4_CRU_ESCR5; + } +} + + +static void pmc_setup_one_p4_counter(unsigned int ctr) +{ + int i; + int const maxbind = 2; + unsigned int cccr = 0; + unsigned int escr = 0; + unsigned int high = 0; + unsigned int counter_bit; + struct p4_event_binding *ev = NULL; + unsigned int stag; + + stag = get_stagger(); + + /* convert from counter *number* to counter *bit* */ + counter_bit = 1 << VIRT_CTR(stag, ctr); + + /* find our event binding structure. */ + if (counter_config[ctr].event <= 0 || counter_config[ctr].event > NUM_EVENTS) { + printk(KERN_ERR + "oprofile: P4 event code 0x%lx out of range\n", + counter_config[ctr].event); + return; + } + + ev = &(p4_events[counter_config[ctr].event - 1]); + + for (i = 0; i < maxbind; i++) { + if (ev->bindings[i].virt_counter & counter_bit) { + + /* modify ESCR */ + ESCR_READ(escr, high, ev, i); + ESCR_CLEAR(escr); + if (stag == 0) { + ESCR_SET_USR_0(escr, counter_config[ctr].user); + ESCR_SET_OS_0(escr, counter_config[ctr].kernel); + } else { + ESCR_SET_USR_1(escr, counter_config[ctr].user); + ESCR_SET_OS_1(escr, counter_config[ctr].kernel); + } + ESCR_SET_EVENT_SELECT(escr, ev->event_select); + ESCR_SET_EVENT_MASK(escr, counter_config[ctr].unit_mask); + ESCR_WRITE(escr, high, ev, i); + + /* modify CCCR */ + CCCR_READ(cccr, high, VIRT_CTR(stag, ctr)); + CCCR_CLEAR(cccr); + CCCR_SET_REQUIRED_BITS(cccr); + CCCR_SET_ESCR_SELECT(cccr, ev->escr_select); + if (stag == 0) { + CCCR_SET_PMI_OVF_0(cccr); + } else { + CCCR_SET_PMI_OVF_1(cccr); + } + CCCR_WRITE(cccr, high, VIRT_CTR(stag, ctr)); + return; + } + } + + printk(KERN_ERR + "oprofile: P4 event code 0x%lx no binding, stag %d ctr %d\n", + counter_config[ctr].event, stag, ctr); +} + + +static void p4_setup_ctrs(struct op_msrs const * const msrs) +{ + unsigned int i; + unsigned int low, high; + unsigned int addr; + unsigned int stag; + + stag = get_stagger(); + + rdmsr(MSR_IA32_MISC_ENABLE, low, high); + if (! MISC_PMC_ENABLED_P(low)) { + printk(KERN_ERR "oprofile: P4 PMC not available\n"); + return; + } + + /* clear the cccrs we will use */ + for (i = 0 ; i < num_counters ; i++) { + rdmsr(p4_counters[VIRT_CTR(stag, i)].cccr_address, low, high); + CCCR_CLEAR(low); + CCCR_SET_REQUIRED_BITS(low); + wrmsr(p4_counters[VIRT_CTR(stag, i)].cccr_address, low, high); + } + + /* clear cccrs outside our concern */ + for (i = stag ; i < NUM_UNUSED_CCCRS ; i += addr_increment()) { + rdmsr(p4_unused_cccr[i], low, high); + CCCR_CLEAR(low); + CCCR_SET_REQUIRED_BITS(low); + wrmsr(p4_unused_cccr[i], low, high); + } + + /* clear all escrs (including those outside our concern) */ + for (addr = MSR_P4_BSU_ESCR0 + stag; + addr < MSR_P4_IQ_ESCR0; addr += addr_increment()) { + wrmsr(addr, 0, 0); + } + + /* On older models clear also MSR_P4_IQ_ESCR0/1 */ + if (boot_cpu_data.x86_model < 0x3) { + wrmsr(MSR_P4_IQ_ESCR0, 0, 0); + wrmsr(MSR_P4_IQ_ESCR1, 0, 0); + } + + for (addr = MSR_P4_RAT_ESCR0 + stag; + addr <= MSR_P4_SSU_ESCR0; ++i, addr += addr_increment()) { + wrmsr(addr, 0, 0); + } + + for (addr = MSR_P4_MS_ESCR0 + stag; + addr <= MSR_P4_TC_ESCR1; addr += addr_increment()){ + wrmsr(addr, 0, 0); + } + + for (addr = MSR_P4_IX_ESCR0 + stag; + addr <= MSR_P4_CRU_ESCR3; addr += addr_increment()){ + wrmsr(addr, 0, 0); + } + + if (num_counters == NUM_COUNTERS_NON_HT) { + wrmsr(MSR_P4_CRU_ESCR4, 0, 0); + wrmsr(MSR_P4_CRU_ESCR5, 0, 0); + } else if (stag == 0) { + wrmsr(MSR_P4_CRU_ESCR4, 0, 0); + } else { + wrmsr(MSR_P4_CRU_ESCR5, 0, 0); + } + + /* setup all counters */ + for (i = 0 ; i < num_counters ; ++i) { + if (counter_config[i].enabled) { + reset_value[i] = counter_config[i].count; + pmc_setup_one_p4_counter(i); + CTR_WRITE(counter_config[i].count, VIRT_CTR(stag, i)); + } else { + reset_value[i] = 0; + } + } +} + + +static int p4_check_ctrs(unsigned int const cpu, + struct op_msrs const * const msrs, + struct pt_regs * const regs) +{ + unsigned long ctr, low, high, stag, real; + int i; + unsigned long eip = profile_pc(regs); + int is_kernel = !user_mode(regs); + + stag = get_stagger(); + + for (i = 0; i < num_counters; ++i) { + + if (!reset_value[i]) + continue; + + /* + * there is some eccentricity in the hardware which + * requires that we perform 2 extra corrections: + * + * - check both the CCCR:OVF flag for overflow and the + * counter high bit for un-flagged overflows. + * + * - write the counter back twice to ensure it gets + * updated properly. + * + * the former seems to be related to extra NMIs happening + * during the current NMI; the latter is reported as errata + * N15 in intel doc 249199-029, pentium 4 specification + * update, though their suggested work-around does not + * appear to solve the problem. + */ + + real = VIRT_CTR(stag, i); + + CCCR_READ(low, high, real); + CTR_READ(ctr, high, real); + if (CCCR_OVF_P(low) || CTR_OVERFLOW_P(ctr)) { + oprofile_add_sample(eip, is_kernel, i, cpu); + CTR_WRITE(reset_value[i], real); + CCCR_CLEAR_OVF(low); + CCCR_WRITE(low, high, real); + CTR_WRITE(reset_value[i], real); + } + } + + /* P4 quirk: you have to re-unmask the apic vector */ + apic_write(APIC_LVTPC, apic_read(APIC_LVTPC) & ~APIC_LVT_MASKED); + + /* See op_model_ppro.c */ + return 1; +} + + +static void p4_start(struct op_msrs const * const msrs) +{ + unsigned int low, high, stag; + int i; + + stag = get_stagger(); + + for (i = 0; i < num_counters; ++i) { + if (!reset_value[i]) + continue; + CCCR_READ(low, high, VIRT_CTR(stag, i)); + CCCR_SET_ENABLE(low); + CCCR_WRITE(low, high, VIRT_CTR(stag, i)); + } +} + + +static void p4_stop(struct op_msrs const * const msrs) +{ + unsigned int low, high, stag; + int i; + + stag = get_stagger(); + + for (i = 0; i < num_counters; ++i) { + CCCR_READ(low, high, VIRT_CTR(stag, i)); + CCCR_SET_DISABLE(low); + CCCR_WRITE(low, high, VIRT_CTR(stag, i)); + } +} + + +#ifdef CONFIG_SMP +struct op_x86_model_spec const op_p4_ht2_spec = { + .num_counters = NUM_COUNTERS_HT2, + .num_controls = NUM_CONTROLS_HT2, + .fill_in_addresses = &p4_fill_in_addresses, + .setup_ctrs = &p4_setup_ctrs, + .check_ctrs = &p4_check_ctrs, + .start = &p4_start, + .stop = &p4_stop +}; +#endif + +struct op_x86_model_spec const op_p4_spec = { + .num_counters = NUM_COUNTERS_NON_HT, + .num_controls = NUM_CONTROLS_NON_HT, + .fill_in_addresses = &p4_fill_in_addresses, + .setup_ctrs = &p4_setup_ctrs, + .check_ctrs = &p4_check_ctrs, + .start = &p4_start, + .stop = &p4_stop +}; diff --git a/src/wraith/oprofile/op_model_ppro.c b/src/wraith/oprofile/op_model_ppro.c new file mode 100644 index 000000000..0cc80654d --- /dev/null +++ b/src/wraith/oprofile/op_model_ppro.c @@ -0,0 +1,146 @@ +/** + * @file op_model_ppro.h + * pentium pro / P6 model-specific MSR operations + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author John Levon + * @author Philippe Elie + * @author Graydon Hoare + */ + +#include +#include +#include +#include + +#include "op_x86_model.h" +#include "op_counter.h" + +#define NUM_COUNTERS 2 +#define NUM_CONTROLS 2 + +#define CTR_READ(l,h,msrs,c) do {rdmsr(msrs->counters[(c)].addr, (l), (h));} while (0) +#define CTR_WRITE(l,msrs,c) do {wrmsr(msrs->counters[(c)].addr, -(u32)(l), -1);} while (0) +#define CTR_OVERFLOWED(n) (!((n) & (1U<<31))) + +#define CTRL_READ(l,h,msrs,c) do {rdmsr((msrs->controls[(c)].addr), (l), (h));} while (0) +#define CTRL_WRITE(l,h,msrs,c) do {wrmsr((msrs->controls[(c)].addr), (l), (h));} while (0) +#define CTRL_SET_ACTIVE(n) (n |= (1<<22)) +#define CTRL_SET_INACTIVE(n) (n &= ~(1<<22)) +#define CTRL_CLEAR(x) (x &= (1<<21)) +#define CTRL_SET_ENABLE(val) (val |= 1<<20) +#define CTRL_SET_USR(val,u) (val |= ((u & 1) << 16)) +#define CTRL_SET_KERN(val,k) (val |= ((k & 1) << 17)) +#define CTRL_SET_UM(val, m) (val |= (m << 8)) +#define CTRL_SET_EVENT(val, e) (val |= e) + +static unsigned long reset_value[NUM_COUNTERS]; + +static void ppro_fill_in_addresses(struct op_msrs * const msrs) +{ + msrs->counters[0].addr = MSR_P6_PERFCTR0; + msrs->counters[1].addr = MSR_P6_PERFCTR1; + + msrs->controls[0].addr = MSR_P6_EVNTSEL0; + msrs->controls[1].addr = MSR_P6_EVNTSEL1; +} + + +static void ppro_setup_ctrs(struct op_msrs const * const msrs) +{ + unsigned int low, high; + int i; + + /* clear all counters */ + for (i = 0 ; i < NUM_CONTROLS; ++i) { + CTRL_READ(low, high, msrs, i); + CTRL_CLEAR(low); + CTRL_WRITE(low, high, msrs, i); + } + + /* avoid a false detection of ctr overflows in NMI handler */ + for (i = 0; i < NUM_COUNTERS; ++i) { + CTR_WRITE(1, msrs, i); + } + + /* enable active counters */ + for (i = 0; i < NUM_COUNTERS; ++i) { + if (counter_config[i].enabled) { + reset_value[i] = counter_config[i].count; + + CTR_WRITE(counter_config[i].count, msrs, i); + + CTRL_READ(low, high, msrs, i); + CTRL_CLEAR(low); + CTRL_SET_ENABLE(low); + CTRL_SET_USR(low, counter_config[i].user); + CTRL_SET_KERN(low, counter_config[i].kernel); + CTRL_SET_UM(low, counter_config[i].unit_mask); + CTRL_SET_EVENT(low, counter_config[i].event); + CTRL_WRITE(low, high, msrs, i); + } + } +} + + +static int ppro_check_ctrs(unsigned int const cpu, + struct op_msrs const * const msrs, + struct pt_regs * const regs) +{ + unsigned int low, high; + int i; + unsigned long eip = profile_pc(regs); + int is_kernel = !user_mode(regs); + + for (i = 0 ; i < NUM_COUNTERS; ++i) { + CTR_READ(low, high, msrs, i); + if (CTR_OVERFLOWED(low)) { + oprofile_add_sample(eip, is_kernel, i, cpu); + CTR_WRITE(reset_value[i], msrs, i); + } + } + + /* Only P6 based Pentium M need to re-unmask the apic vector but it + * doesn't hurt other P6 variant */ + apic_write(APIC_LVTPC, apic_read(APIC_LVTPC) & ~APIC_LVT_MASKED); + + /* We can't work out if we really handled an interrupt. We + * might have caught a *second* counter just after overflowing + * the interrupt for this counter then arrives + * and we don't find a counter that's overflowed, so we + * would return 0 and get dazed + confused. Instead we always + * assume we found an overflow. This sucks. + */ + return 1; +} + + +static void ppro_start(struct op_msrs const * const msrs) +{ + unsigned int low,high; + CTRL_READ(low, high, msrs, 0); + CTRL_SET_ACTIVE(low); + CTRL_WRITE(low, high, msrs, 0); +} + + +static void ppro_stop(struct op_msrs const * const msrs) +{ + unsigned int low,high; + CTRL_READ(low, high, msrs, 0); + CTRL_SET_INACTIVE(low); + CTRL_WRITE(low, high, msrs, 0); +} + + +struct op_x86_model_spec const op_ppro_spec = { + .num_counters = NUM_COUNTERS, + .num_controls = NUM_CONTROLS, + .fill_in_addresses = &ppro_fill_in_addresses, + .setup_ctrs = &ppro_setup_ctrs, + .check_ctrs = &ppro_check_ctrs, + .start = &ppro_start, + .stop = &ppro_stop +}; diff --git a/src/wraith/oprofile/op_x86_model.h b/src/wraith/oprofile/op_x86_model.h new file mode 100644 index 000000000..5cc251467 --- /dev/null +++ b/src/wraith/oprofile/op_x86_model.h @@ -0,0 +1,51 @@ +/** + * @file op_x86_model.h + * interface to x86 model-specific MSR operations + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author Graydon Hoare + */ + +#ifndef OP_X86_MODEL_H +#define OP_X86_MODEL_H + +struct op_saved_msr { + unsigned int high; + unsigned int low; +}; + +struct op_msr { + unsigned long addr; + struct op_saved_msr saved; +}; + +struct op_msrs { + struct op_msr * counters; + struct op_msr * controls; +}; + +struct pt_regs; + +/* The model vtable abstracts the differences between + * various x86 CPU model's perfctr support. + */ +struct op_x86_model_spec { + unsigned int const num_counters; + unsigned int const num_controls; + void (*fill_in_addresses)(struct op_msrs * const msrs); + void (*setup_ctrs)(struct op_msrs const * const msrs); + int (*check_ctrs)(unsigned int const cpu, + struct op_msrs const * const msrs, + struct pt_regs * const regs); + void (*start)(struct op_msrs const * const msrs); + void (*stop)(struct op_msrs const * const msrs); +}; + +extern struct op_x86_model_spec const op_ppro_spec; +extern struct op_x86_model_spec const op_p4_spec; +extern struct op_x86_model_spec const op_p4_ht2_spec; +extern struct op_x86_model_spec const op_athlon_spec; + +#endif /* OP_X86_MODEL_H */ diff --git a/src/wraith/pci/acpi.c b/src/wraith/pci/acpi.c new file mode 100644 index 000000000..0c0a16972 --- /dev/null +++ b/src/wraith/pci/acpi.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +#include "pci.h" + +struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int domain, int busnum) +{ + if (domain != 0) { + printk(KERN_WARNING "PCI: Multiple domains not supported\n"); + return NULL; + } + + return pcibios_scan_root(busnum); +} + +extern int pci_routeirq; +static int __init pci_acpi_init(void) +{ + struct pci_dev *dev = NULL; + + if (pcibios_scanned) + return 0; + + if (acpi_noirq) + return 0; + + printk(KERN_INFO "PCI: Using ACPI for IRQ routing\n"); + acpi_irq_penalty_init(); + pcibios_scanned++; + pcibios_enable_irq = acpi_pci_irq_enable; + + if (pci_routeirq) { + /* + * PCI IRQ routing is set up by pci_enable_device(), but we + * also do it here in case there are still broken drivers that + * don't use pci_enable_device(). + */ + printk(KERN_INFO "** Routing PCI interrupts for all devices because \"pci=routeirq\"\n"); + printk(KERN_INFO "** was specified. If this was required to make a driver work,\n"); + printk(KERN_INFO "** please email the output of \"lspci\" to bjorn.helgaas@hp.com\n"); + printk(KERN_INFO "** so I can fix the driver.\n"); + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) + acpi_pci_irq_enable(dev); + } else { + printk(KERN_INFO "** PCI interrupts are no longer routed automatically. If this\n"); + printk(KERN_INFO "** causes a device to stop working, it is probably because the\n"); + printk(KERN_INFO "** driver failed to call pci_enable_device(). As a temporary\n"); + printk(KERN_INFO "** workaround, the \"pci=routeirq\" argument restores the old\n"); + printk(KERN_INFO "** behavior. If this argument makes the device work again,\n"); + printk(KERN_INFO "** please email the output of \"lspci\" to bjorn.helgaas@hp.com\n"); + printk(KERN_INFO "** so I can fix the driver.\n"); + } +#ifdef CONFIG_X86_IO_APIC + if (acpi_ioapic) + print_IO_APIC(); +#endif + + return 0; +} +subsys_initcall(pci_acpi_init); diff --git a/src/wraith/pci/common.c b/src/wraith/pci/common.c new file mode 100644 index 000000000..4008b6c9a --- /dev/null +++ b/src/wraith/pci/common.c @@ -0,0 +1,251 @@ +/* + * Low-Level PCI Support for PC + * + * (c) 1999--2000 Martin Mares + */ + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "pci.h" + +#ifdef CONFIG_PCI_BIOS +extern void pcibios_sort(void); +#endif + +unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2 | + PCI_PROBE_MMCONF; + +int pci_routeirq; +int pcibios_last_bus = -1; +struct pci_bus *pci_root_bus = NULL; +struct pci_raw_ops *raw_pci_ops; + +static int pci_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) +{ + return raw_pci_ops->read(0, bus->number, devfn, where, size, value); +} + +static int pci_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) +{ + return raw_pci_ops->write(0, bus->number, devfn, where, size, value); +} + +struct pci_ops pci_root_ops = { + .read = pci_read, + .write = pci_write, +}; + +/* + * legacy, numa, and acpi all want to call pcibios_scan_root + * from their initcalls. This flag prevents that. + */ +int pcibios_scanned; + +/* + * This interrupt-safe spinlock protects all accesses to PCI + * configuration space. + */ +spinlock_t pci_config_lock = SPIN_LOCK_UNLOCKED; + +/* + * Several buggy motherboards address only 16 devices and mirror + * them to next 16 IDs. We try to detect this `feature' on all + * primary buses (those containing host bridges as they are + * expected to be unique) and remove the ghost devices. + */ + +static void __devinit pcibios_fixup_ghosts(struct pci_bus *b) +{ + struct list_head *ln, *mn; + struct pci_dev *d, *e; + int mirror = PCI_DEVFN(16,0); + int seen_host_bridge = 0; + int i; + + DBG("PCI: Scanning for ghost devices on bus %d\n", b->number); + list_for_each(ln, &b->devices) { + d = pci_dev_b(ln); + if ((d->class >> 8) == PCI_CLASS_BRIDGE_HOST) + seen_host_bridge++; + for (mn=ln->next; mn != &b->devices; mn=mn->next) { + e = pci_dev_b(mn); + if (e->devfn != d->devfn + mirror || + e->vendor != d->vendor || + e->device != d->device || + e->class != d->class) + continue; + for(i=0; iresource[i].start != d->resource[i].start || + e->resource[i].end != d->resource[i].end || + e->resource[i].flags != d->resource[i].flags) + continue; + break; + } + if (mn == &b->devices) + return; + } + if (!seen_host_bridge) + return; + printk(KERN_WARNING "PCI: Ignoring ghost devices on bus %02x\n", b->number); + + ln = &b->devices; + while (ln->next != &b->devices) { + d = pci_dev_b(ln->next); + if (d->devfn >= mirror) { + list_del(&d->global_list); + list_del(&d->bus_list); + kfree(d); + } else + ln = ln->next; + } +} + +/* + * Called after each bus is probed, but before its children + * are examined. + */ + +void __devinit pcibios_fixup_bus(struct pci_bus *b) +{ + pcibios_fixup_ghosts(b); + pci_read_bridge_bases(b); +} + + +struct pci_bus * __devinit pcibios_scan_root(int busnum) +{ + struct pci_bus *bus = NULL; + + while ((bus = pci_find_next_bus(bus)) != NULL) { + if (bus->number == busnum) { + /* Already scanned */ + return bus; + } + } + + printk("PCI: Probing PCI hardware (bus %02x)\n", busnum); + + return pci_scan_bus(busnum, &pci_root_ops, NULL); +} + +extern u8 pci_cache_line_size; + +static int __init pcibios_init(void) +{ + struct cpuinfo_x86 *c = &boot_cpu_data; + + if (!raw_pci_ops) { + printk("PCI: System does not support PCI\n"); + return 0; + } + + /* + * Assume PCI cacheline size of 32 bytes for all x86s except K7/K8 + * and P4. It's also good for 386/486s (which actually have 16) + * as quite a few PCI devices do not support smaller values. + */ + pci_cache_line_size = 32 >> 2; + if (c->x86 >= 6 && c->x86_vendor == X86_VENDOR_AMD) + pci_cache_line_size = 64 >> 2; /* K7 & K8 */ + else if (c->x86 > 6 && c->x86_vendor == X86_VENDOR_INTEL) + pci_cache_line_size = 128 >> 2; /* P4 */ + + pcibios_resource_survey(); + +#ifdef CONFIG_PCI_BIOS + if ((pci_probe & PCI_BIOS_SORT) && !(pci_probe & PCI_NO_SORT)) + pcibios_sort(); +#endif + return 0; +} + +subsys_initcall(pcibios_init); + +char * __devinit pcibios_setup(char *str) +{ + if (!strcmp(str, "off")) { + pci_probe = 0; + return NULL; + } +#ifdef CONFIG_PCI_BIOS + else if (!strcmp(str, "bios")) { + pci_probe = PCI_PROBE_BIOS; + return NULL; + } else if (!strcmp(str, "nobios")) { + pci_probe &= ~PCI_PROBE_BIOS; + return NULL; + } else if (!strcmp(str, "nosort")) { + pci_probe |= PCI_NO_SORT; + return NULL; + } else if (!strcmp(str, "biosirq")) { + pci_probe |= PCI_BIOS_IRQ_SCAN; + return NULL; + } +#endif +#ifdef CONFIG_PCI_DIRECT + else if (!strcmp(str, "conf1")) { + pci_probe = PCI_PROBE_CONF1 | PCI_NO_CHECKS; + return NULL; + } + else if (!strcmp(str, "conf2")) { + pci_probe = PCI_PROBE_CONF2 | PCI_NO_CHECKS; + return NULL; + } +#endif +#ifdef CONFIG_PCI_MMCONFIG + else if (!strcmp(str, "nommconf")) { + pci_probe &= ~PCI_PROBE_MMCONF; + return NULL; + } +#endif + else if (!strcmp(str, "noacpi")) { + acpi_noirq_set(); + return NULL; + } +#ifndef CONFIG_X86_VISWS + else if (!strcmp(str, "usepirqmask")) { + pci_probe |= PCI_USE_PIRQ_MASK; + return NULL; + } else if (!strncmp(str, "irqmask=", 8)) { + pcibios_irq_mask = simple_strtol(str+8, NULL, 0); + return NULL; + } else if (!strncmp(str, "lastbus=", 8)) { + pcibios_last_bus = simple_strtol(str+8, NULL, 0); + return NULL; + } +#endif + else if (!strcmp(str, "rom")) { + pci_probe |= PCI_ASSIGN_ROMS; + return NULL; + } else if (!strcmp(str, "assign-busses")) { + pci_probe |= PCI_ASSIGN_ALL_BUSSES; + return NULL; + } else if (!strcmp(str, "routeirq")) { + pci_routeirq = 1; + return NULL; + } + return str; +} + +unsigned int pcibios_assign_all_busses(void) +{ + return (pci_probe & PCI_ASSIGN_ALL_BUSSES) ? 1 : 0; +} + +int pcibios_enable_device(struct pci_dev *dev, int mask) +{ + int err; + + if ((err = pcibios_enable_resources(dev, mask)) < 0) + return err; + + return pcibios_enable_irq(dev); +} diff --git a/src/wraith/pci/direct.c b/src/wraith/pci/direct.c new file mode 100644 index 000000000..3decbc498 --- /dev/null +++ b/src/wraith/pci/direct.c @@ -0,0 +1,285 @@ +/* + * direct.c - Low-level direct PCI config space access + */ + +#include +#include +#include "pci.h" + +/* + * Functions for accessing PCI configuration space with type 1 accesses + */ + +#define PCI_CONF1_ADDRESS(bus, devfn, reg) \ + (0x80000000 | (bus << 16) | (devfn << 8) | (reg & ~3)) + +static int pci_conf1_read (int seg, int bus, int devfn, int reg, int len, u32 *value) +{ + unsigned long flags; + + if (!value || (bus > 255) || (devfn > 255) || (reg > 255)) + return -EINVAL; + + spin_lock_irqsave(&pci_config_lock, flags); + + outl(PCI_CONF1_ADDRESS(bus, devfn, reg), 0xCF8); + + switch (len) { + case 1: + *value = inb(0xCFC + (reg & 3)); + break; + case 2: + *value = inw(0xCFC + (reg & 2)); + break; + case 4: + *value = inl(0xCFC); + break; + } + + spin_unlock_irqrestore(&pci_config_lock, flags); + + return 0; +} + +static int pci_conf1_write (int seg, int bus, int devfn, int reg, int len, u32 value) +{ + unsigned long flags; + + if ((bus > 255) || (devfn > 255) || (reg > 255)) + return -EINVAL; + + spin_lock_irqsave(&pci_config_lock, flags); + + outl(PCI_CONF1_ADDRESS(bus, devfn, reg), 0xCF8); + + switch (len) { + case 1: + outb((u8)value, 0xCFC + (reg & 3)); + break; + case 2: + outw((u16)value, 0xCFC + (reg & 2)); + break; + case 4: + outl((u32)value, 0xCFC); + break; + } + + spin_unlock_irqrestore(&pci_config_lock, flags); + + return 0; +} + +#undef PCI_CONF1_ADDRESS + +struct pci_raw_ops pci_direct_conf1 = { + .read = pci_conf1_read, + .write = pci_conf1_write, +}; + + +/* + * Functions for accessing PCI configuration space with type 2 accesses + */ + +#define PCI_CONF2_ADDRESS(dev, reg) (u16)(0xC000 | (dev << 8) | reg) + +static int pci_conf2_read(int seg, int bus, int devfn, int reg, int len, u32 *value) +{ + unsigned long flags; + int dev, fn; + + if (!value || (bus > 255) || (devfn > 255) || (reg > 255)) + return -EINVAL; + + dev = PCI_SLOT(devfn); + fn = PCI_FUNC(devfn); + + if (dev & 0x10) + return PCIBIOS_DEVICE_NOT_FOUND; + + spin_lock_irqsave(&pci_config_lock, flags); + + outb((u8)(0xF0 | (fn << 1)), 0xCF8); + outb((u8)bus, 0xCFA); + + switch (len) { + case 1: + *value = inb(PCI_CONF2_ADDRESS(dev, reg)); + break; + case 2: + *value = inw(PCI_CONF2_ADDRESS(dev, reg)); + break; + case 4: + *value = inl(PCI_CONF2_ADDRESS(dev, reg)); + break; + } + + outb(0, 0xCF8); + + spin_unlock_irqrestore(&pci_config_lock, flags); + + return 0; +} + +static int pci_conf2_write (int seg, int bus, int devfn, int reg, int len, u32 value) +{ + unsigned long flags; + int dev, fn; + + if ((bus > 255) || (devfn > 255) || (reg > 255)) + return -EINVAL; + + dev = PCI_SLOT(devfn); + fn = PCI_FUNC(devfn); + + if (dev & 0x10) + return PCIBIOS_DEVICE_NOT_FOUND; + + spin_lock_irqsave(&pci_config_lock, flags); + + outb((u8)(0xF0 | (fn << 1)), 0xCF8); + outb((u8)bus, 0xCFA); + + switch (len) { + case 1: + outb((u8)value, PCI_CONF2_ADDRESS(dev, reg)); + break; + case 2: + outw((u16)value, PCI_CONF2_ADDRESS(dev, reg)); + break; + case 4: + outl((u32)value, PCI_CONF2_ADDRESS(dev, reg)); + break; + } + + outb(0, 0xCF8); + + spin_unlock_irqrestore(&pci_config_lock, flags); + + return 0; +} + +#undef PCI_CONF2_ADDRESS + +static struct pci_raw_ops pci_direct_conf2 = { + .read = pci_conf2_read, + .write = pci_conf2_write, +}; + + +/* + * Before we decide to use direct hardware access mechanisms, we try to do some + * trivial checks to ensure it at least _seems_ to be working -- we just test + * whether bus 00 contains a host bridge (this is similar to checking + * techniques used in XFree86, but ours should be more reliable since we + * attempt to make use of direct access hints provided by the PCI BIOS). + * + * This should be close to trivial, but it isn't, because there are buggy + * chipsets (yes, you guessed it, by Intel and Compaq) that have no class ID. + */ +static int __init pci_sanity_check(struct pci_raw_ops *o) +{ + u32 x = 0; + int devfn; + + if (pci_probe & PCI_NO_CHECKS) + return 1; + + for (devfn = 0; devfn < 0x100; devfn++) { + if (o->read(0, 0, devfn, PCI_CLASS_DEVICE, 2, &x)) + continue; + if (x == PCI_CLASS_BRIDGE_HOST || x == PCI_CLASS_DISPLAY_VGA) + return 1; + + if (o->read(0, 0, devfn, PCI_VENDOR_ID, 2, &x)) + continue; + if (x == PCI_VENDOR_ID_INTEL || x == PCI_VENDOR_ID_COMPAQ) + return 1; + } + + DBG("PCI: Sanity check failed\n"); + return 0; +} + +static int __init pci_check_type1(void) +{ + unsigned long flags; + unsigned int tmp; + int works = 0; + + local_irq_save(flags); + + outb(0x01, 0xCFB); + tmp = inl(0xCF8); + outl(0x80000000, 0xCF8); + if (inl(0xCF8) == 0x80000000 && pci_sanity_check(&pci_direct_conf1)) { + works = 1; + } + outl(tmp, 0xCF8); + local_irq_restore(flags); + + return works; +} + +static int __init pci_check_type2(void) +{ + unsigned long flags; + int works = 0; + + local_irq_save(flags); + + outb(0x00, 0xCFB); + outb(0x00, 0xCF8); + outb(0x00, 0xCFA); + if (inb(0xCF8) == 0x00 && inb(0xCFA) == 0x00 && + pci_sanity_check(&pci_direct_conf2)) { + works = 1; + } + + local_irq_restore(flags); + + return works; +} + +static int __init pci_direct_init(void) +{ + struct resource *region, *region2; + + if ((pci_probe & PCI_PROBE_CONF1) == 0) + goto type2; + region = request_region(0xCF8, 8, "PCI conf1"); + if (!region) + goto type2; + + if (pci_check_type1()) { + printk(KERN_INFO "PCI: Using configuration type 1\n"); + raw_pci_ops = &pci_direct_conf1; + return 0; + } + release_resource(region); + + type2: + if ((pci_probe & PCI_PROBE_CONF2) == 0) + goto out; + region = request_region(0xCF8, 4, "PCI conf2"); + if (!region) + goto out; + region2 = request_region(0xC000, 0x1000, "PCI conf2"); + if (!region2) + goto fail2; + + if (pci_check_type2()) { + printk(KERN_INFO "PCI: Using configuration type 2\n"); + raw_pci_ops = &pci_direct_conf2; + return 0; + } + + release_resource(region2); + fail2: + release_resource(region); + + out: + return 0; +} + +arch_initcall(pci_direct_init); diff --git a/src/wraith/pci/fixup.c b/src/wraith/pci/fixup.c new file mode 100644 index 000000000..f5a345118 --- /dev/null +++ b/src/wraith/pci/fixup.c @@ -0,0 +1,386 @@ +/* + * Exceptions for specific devices. Usually work-arounds for fatal design flaws. + */ + +#include +#include +#include "pci.h" + + +static void __devinit pci_fixup_i450nx(struct pci_dev *d) +{ + /* + * i450NX -- Find and scan all secondary buses on all PXB's. + */ + int pxb, reg; + u8 busno, suba, subb; + + printk(KERN_WARNING "PCI: Searching for i450NX host bridges on %s\n", pci_name(d)); + reg = 0xd0; + for(pxb=0; pxb<2; pxb++) { + pci_read_config_byte(d, reg++, &busno); + pci_read_config_byte(d, reg++, &suba); + pci_read_config_byte(d, reg++, &subb); + DBG("i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, suba, subb); + if (busno) + pci_scan_bus(busno, &pci_root_ops, NULL); /* Bus A */ + if (suba < subb) + pci_scan_bus(suba+1, &pci_root_ops, NULL); /* Bus B */ + } + pcibios_last_bus = -1; +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx); + +static void __devinit pci_fixup_i450gx(struct pci_dev *d) +{ + /* + * i450GX and i450KX -- Find and scan all secondary buses. + * (called separately for each PCI bridge found) + */ + u8 busno; + pci_read_config_byte(d, 0x4a, &busno); + printk(KERN_INFO "PCI: i440KX/GX host bridge %s: secondary bus %02x\n", pci_name(d), busno); + pci_scan_bus(busno, &pci_root_ops, NULL); + pcibios_last_bus = -1; +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454GX, pci_fixup_i450gx); + +static void __devinit pci_fixup_umc_ide(struct pci_dev *d) +{ + /* + * UM8886BF IDE controller sets region type bits incorrectly, + * therefore they look like memory despite of them being I/O. + */ + int i; + + printk(KERN_WARNING "PCI: Fixing base address flags for device %s\n", pci_name(d)); + for(i=0; i<4; i++) + d->resource[i].flags |= PCI_BASE_ADDRESS_SPACE_IO; +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8886BF, pci_fixup_umc_ide); + +static void __devinit pci_fixup_ncr53c810(struct pci_dev *d) +{ + /* + * NCR 53C810 returns class code 0 (at least on some systems). + * Fix class to be PCI_CLASS_STORAGE_SCSI + */ + if (!d->class) { + printk(KERN_WARNING "PCI: fixing NCR 53C810 class code for %s\n", pci_name(d)); + d->class = PCI_CLASS_STORAGE_SCSI << 8; + } +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, pci_fixup_ncr53c810); + +static void __devinit pci_fixup_ide_bases(struct pci_dev *d) +{ + int i; + + /* + * PCI IDE controllers use non-standard I/O port decoding, respect it. + */ + if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE) + return; + DBG("PCI: IDE base address fixup for %s\n", pci_name(d)); + for(i=0; i<4; i++) { + struct resource *r = &d->resource[i]; + if ((r->start & ~0x80) == 0x374) { + r->start |= 2; + r->end = r->start; + } + } +} +DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases); + +static void __devinit pci_fixup_ide_trash(struct pci_dev *d) +{ + int i; + + /* + * Runs the fixup only for the first IDE controller + * (Shai Fultheim - shai@ftcon.com) + */ + static int called = 0; + if (called) + return; + called = 1; + + /* + * There exist PCI IDE controllers which have utter garbage + * in first four base registers. Ignore that. + */ + DBG("PCI: IDE base address trash cleared for %s\n", pci_name(d)); + for(i=0; i<4; i++) + d->resource[i].start = d->resource[i].end = d->resource[i].flags = 0; +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5513, pci_fixup_ide_trash); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_10, pci_fixup_ide_trash); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_11, pci_fixup_ide_trash); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_9, pci_fixup_ide_trash); + +static void __devinit pci_fixup_latency(struct pci_dev *d) +{ + /* + * SiS 5597 and 5598 chipsets require latency timer set to + * at most 32 to avoid lockups. + */ + DBG("PCI: Setting max latency to 32\n"); + pcibios_max_latency = 32; +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, pci_fixup_latency); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5598, pci_fixup_latency); + +static void __devinit pci_fixup_piix4_acpi(struct pci_dev *d) +{ + /* + * PIIX4 ACPI device: hardwired IRQ9 + */ + d->irq = 9; +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, pci_fixup_piix4_acpi); + +/* + * Addresses issues with problems in the memory write queue timer in + * certain VIA Northbridges. This bugfix is per VIA's specifications, + * except for the KL133/KM133: clearing bit 5 on those Northbridges seems + * to trigger a bug in its integrated ProSavage video card, which + * causes screen corruption. We only clear bits 6 and 7 for that chipset, + * until VIA can provide us with definitive information on why screen + * corruption occurs, and what exactly those bits do. + * + * VIA 8363,8622,8361 Northbridges: + * - bits 5, 6, 7 at offset 0x55 need to be turned off + * VIA 8367 (KT266x) Northbridges: + * - bits 5, 6, 7 at offset 0x95 need to be turned off + * VIA 8363 rev 0x81/0x84 (KL133/KM133) Northbridges: + * - bits 6, 7 at offset 0x55 need to be turned off + */ + +#define VIA_8363_KL133_REVISION_ID 0x81 +#define VIA_8363_KM133_REVISION_ID 0x84 + +static void __devinit pci_fixup_via_northbridge_bug(struct pci_dev *d) +{ + u8 v; + u8 revision; + int where = 0x55; + int mask = 0x1f; /* clear bits 5, 6, 7 by default */ + + pci_read_config_byte(d, PCI_REVISION_ID, &revision); + + if (d->device == PCI_DEVICE_ID_VIA_8367_0) { + /* fix pci bus latency issues resulted by NB bios error + it appears on bug free^Wreduced kt266x's bios forces + NB latency to zero */ + pci_write_config_byte(d, PCI_LATENCY_TIMER, 0); + + where = 0x95; /* the memory write queue timer register is + different for the KT266x's: 0x95 not 0x55 */ + } else if (d->device == PCI_DEVICE_ID_VIA_8363_0 && + (revision == VIA_8363_KL133_REVISION_ID || + revision == VIA_8363_KM133_REVISION_ID)) { + mask = 0x3f; /* clear only bits 6 and 7; clearing bit 5 + causes screen corruption on the KL133/KM133 */ + } + + pci_read_config_byte(d, where, &v); + if (v & ~mask) { + printk(KERN_WARNING "Disabling VIA memory write queue (PCI ID %04x, rev %02x): [%02x] %02x & %02x -> %02x\n", \ + d->device, revision, where, v, mask, v & mask); + v &= mask; + pci_write_config_byte(d, where, v); + } +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8363_0, pci_fixup_via_northbridge_bug); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8622, pci_fixup_via_northbridge_bug); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8361, pci_fixup_via_northbridge_bug); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8367_0, pci_fixup_via_northbridge_bug); + +/* + * For some reasons Intel decided that certain parts of their + * 815, 845 and some other chipsets must look like PCI-to-PCI bridges + * while they are obviously not. The 82801 family (AA, AB, BAM/CAM, + * BA/CA/DB and E) PCI bridges are actually HUB-to-PCI ones, according + * to Intel terminology. These devices do forward all addresses from + * system to PCI bus no matter what are their window settings, so they are + * "transparent" (or subtractive decoding) from programmers point of view. + */ +static void __devinit pci_fixup_transparent_bridge(struct pci_dev *dev) +{ + if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI && + (dev->device & 0xff00) == 0x2400) + dev->transparent = 1; +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_fixup_transparent_bridge); + +/* + * Fixup for C1 Halt Disconnect problem on nForce2 systems. + * + * From information provided by "Allen Martin" : + * + * A hang is caused when the CPU generates a very fast CONNECT/HALT cycle + * sequence. Workaround is to set the SYSTEM_IDLE_TIMEOUT to 80 ns. + * This allows the state-machine and timer to return to a proper state within + * 80 ns of the CONNECT and probe appearing together. Since the CPU will not + * issue another HALT within 80 ns of the initial HALT, the failure condition + * is avoided. + */ +static void __init pci_fixup_nforce2(struct pci_dev *dev) +{ + u32 val, fixed_val; + u8 rev; + + pci_read_config_byte(dev, PCI_REVISION_ID, &rev); + + /* + * Chip Old value New value + * C17 0x1F0FFF01 0x1F01FF01 + * C18D 0x9F0FFF01 0x9F01FF01 + * + * Northbridge chip version may be determined by + * reading the PCI revision ID (0xC1 or greater is C18D). + */ + fixed_val = rev < 0xC1 ? 0x1F01FF01 : 0x9F01FF01; + + pci_read_config_dword(dev, 0x6c, &val); + + /* + * Apply fixup only if C1 Halt Disconnect is enabled + * (bit28) because it is not supported on some boards. + */ + if ((val & (1 << 28)) && val != fixed_val) { + printk(KERN_WARNING "PCI: nForce2 C1 Halt Disconnect fixup\n"); + pci_write_config_dword(dev, 0x6c, fixed_val); + } +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2, pci_fixup_nforce2); + +/* Max PCI Express root ports */ +#define MAX_PCIEROOT 6 +static int quirk_aspm_offset[MAX_PCIEROOT << 3]; + +#define GET_INDEX(a, b) (((a - PCI_DEVICE_ID_INTEL_MCH_PA) << 3) + b) + +static int quirk_pcie_aspm_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) +{ + return raw_pci_ops->read(0, bus->number, devfn, where, size, value); +} + +/* + * Replace the original pci bus ops for write with a new one that will filter + * the request to insure ASPM cannot be enabled. + */ +static int quirk_pcie_aspm_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) +{ + u8 offset; + + offset = quirk_aspm_offset[GET_INDEX(bus->self->device, devfn)]; + + if ((offset) && (where == offset)) + value = value & 0xfffffffc; + + return raw_pci_ops->write(0, bus->number, devfn, where, size, value); +} + +struct pci_ops quirk_pcie_aspm_ops = { + .read = quirk_pcie_aspm_read, + .write = quirk_pcie_aspm_write, +}; + +/* + * Prevents PCI Express ASPM (Active State Power Management) being enabled. + * + * Save the register offset, where the ASPM control bits are located, + * for each PCI Express device that is in the device list of + * the root port in an array for fast indexing. Replace the bus ops + * with the modified one. + */ +void pcie_rootport_aspm_quirk(struct pci_dev *pdev) +{ + int cap_base, i; + struct pci_bus *pbus; + struct pci_dev *dev; + + if ((pbus = pdev->subordinate) == NULL) + return; + + /* + * Check if the DID of pdev matches one of the six root ports. This + * check is needed in the case this function is called directly by the + * hot-plug driver. + */ + if ((pdev->device < PCI_DEVICE_ID_INTEL_MCH_PA) || + (pdev->device > PCI_DEVICE_ID_INTEL_MCH_PC1)) + return; + + if (list_empty(&pbus->devices)) { + /* + * If no device is attached to the root port at power-up or + * after hot-remove, the pbus->devices is empty and this code + * will set the offsets to zero and the bus ops to parent's bus + * ops, which is unmodified. + */ + for (i= GET_INDEX(pdev->device, 0); i <= GET_INDEX(pdev->device, 7); ++i) + quirk_aspm_offset[i] = 0; + + pbus->ops = pbus->parent->ops; + } else { + /* + * If devices are attached to the root port at power-up or + * after hot-add, the code loops through the device list of + * each root port to save the register offsets and replace the + * bus ops. + */ + list_for_each_entry(dev, &pbus->devices, bus_list) { + /* There are 0 to 8 devices attached to this bus */ + cap_base = pci_find_capability(dev, PCI_CAP_ID_EXP); + quirk_aspm_offset[GET_INDEX(pdev->device, dev->devfn)]= cap_base + 0x10; + } + pbus->ops = &quirk_pcie_aspm_ops; + } +} +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PA, pcie_rootport_aspm_quirk ); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PA1, pcie_rootport_aspm_quirk ); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PB, pcie_rootport_aspm_quirk ); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PB1, pcie_rootport_aspm_quirk ); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC, pcie_rootport_aspm_quirk ); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC1, pcie_rootport_aspm_quirk ); + +/* + * Fixup to mark boot BIOS video selected by BIOS before it changes + * + * From information provided by "Jon Smirl" + * + * The standard boot ROM sequence for an x86 machine uses the BIOS + * to select an initial video card for boot display. This boot video + * card will have it's BIOS copied to C0000 in system RAM. + * IORESOURCE_ROM_SHADOW is used to associate the boot video + * card with this copy. On laptops this copy has to be used since + * the main ROM may be compressed or combined with another image. + * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW + * is marked here since the boot video device will be the only enabled + * video device at this point. + * + */static void __devinit pci_fixup_video(struct pci_dev *pdev) +{ + struct pci_dev *bridge; + struct pci_bus *bus; + u16 l; + + if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA) + return; + + /* Is VGA routed to us? */ + bus = pdev->bus; + while (bus) { + bridge = bus->self; + if (bridge) { + pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, &l); + if (!(l & PCI_BRIDGE_CTL_VGA)) + return; + } + bus = bus->parent; + } + pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; +} +DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video); diff --git a/src/wraith/pci/i386.c b/src/wraith/pci/i386.c new file mode 100644 index 000000000..7a7b35a37 --- /dev/null +++ b/src/wraith/pci/i386.c @@ -0,0 +1,304 @@ +/* + * Low-Level PCI Access for i386 machines + * + * Copyright 1993, 1994 Drew Eckhardt + * Visionary Computing + * (Unix and Linux consulting and custom programming) + * Drew@Colorado.EDU + * +1 (303) 786-7975 + * + * Drew's work was sponsored by: + * iX Multiuser Multitasking Magazine + * Hannover, Germany + * hm@ix.de + * + * Copyright 1997--2000 Martin Mares + * + * For more information, please consult the following manuals (look at + * http://www.pcisig.com/ for how to get them): + * + * PCI BIOS Specification + * PCI Local Bus Specification + * PCI to PCI Bridge Specification + * PCI System Design Guide + * + */ + +#include +#include +#include +#include +#include +#include + +#include "pci.h" + +/* + * We need to avoid collisions with `mirrored' VGA ports + * and other strange ISA hardware, so we always want the + * addresses to be allocated in the 0x000-0x0ff region + * modulo 0x400. + * + * Why? Because some silly external IO cards only decode + * the low 10 bits of the IO address. The 0x00-0xff region + * is reserved for motherboard devices that decode all 16 + * bits, so it's ok to allocate at, say, 0x2800-0x28ff, + * but we want to try to avoid allocating at 0x2900-0x2bff + * which might have be mirrored at 0x0100-0x03ff.. + */ +void +pcibios_align_resource(void *data, struct resource *res, + unsigned long size, unsigned long align) +{ + if (res->flags & IORESOURCE_IO) { + unsigned long start = res->start; + + if (start & 0x300) { + start = (start + 0x3ff) & ~0x3ff; + res->start = start; + } + } +} + + +/* + * Handle resources of PCI devices. If the world were perfect, we could + * just allocate all the resource regions and do nothing more. It isn't. + * On the other hand, we cannot just re-allocate all devices, as it would + * require us to know lots of host bridge internals. So we attempt to + * keep as much of the original configuration as possible, but tweak it + * when it's found to be wrong. + * + * Known BIOS problems we have to work around: + * - I/O or memory regions not configured + * - regions configured, but not enabled in the command register + * - bogus I/O addresses above 64K used + * - expansion ROMs left enabled (this may sound harmless, but given + * the fact the PCI specs explicitly allow address decoders to be + * shared between expansion ROMs and other resource regions, it's + * at least dangerous) + * + * Our solution: + * (1) Allocate resources for all buses behind PCI-to-PCI bridges. + * This gives us fixed barriers on where we can allocate. + * (2) Allocate resources for all enabled devices. If there is + * a collision, just mark the resource as unallocated. Also + * disable expansion ROMs during this step. + * (3) Try to allocate resources for disabled devices. If the + * resources were assigned correctly, everything goes well, + * if they weren't, they won't disturb allocation of other + * resources. + * (4) Assign new addresses to resources which were either + * not configured at all or misconfigured. If explicitly + * requested by the user, configure expansion ROM address + * as well. + */ + +static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) +{ + struct pci_bus *bus; + struct pci_dev *dev; + int idx; + struct resource *r, *pr; + + /* Depth-First Search on bus tree */ + list_for_each_entry(bus, bus_list, node) { + if ((dev = bus->self)) { + for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) { + r = &dev->resource[idx]; + if (!r->start) + continue; + pr = pci_find_parent_resource(dev, r); + if (!pr || request_resource(pr, r) < 0) + printk(KERN_ERR "PCI: Cannot allocate resource region %d of bridge %s\n", idx, pci_name(dev)); + } + } + pcibios_allocate_bus_resources(&bus->children); + } +} + +static void __init pcibios_allocate_resources(int pass) +{ + struct pci_dev *dev = NULL; + int idx, disabled; + u16 command; + struct resource *r, *pr; + + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + pci_read_config_word(dev, PCI_COMMAND, &command); + for(idx = 0; idx < 6; idx++) { + r = &dev->resource[idx]; + if (r->parent) /* Already allocated */ + continue; + if (!r->start) /* Address not assigned at all */ + continue; + if (r->flags & IORESOURCE_IO) + disabled = !(command & PCI_COMMAND_IO); + else + disabled = !(command & PCI_COMMAND_MEMORY); + if (pass == disabled) { + DBG("PCI: Resource %08lx-%08lx (f=%lx, d=%d, p=%d)\n", + r->start, r->end, r->flags, disabled, pass); + pr = pci_find_parent_resource(dev, r); + if (!pr || request_resource(pr, r) < 0) { + printk(KERN_ERR "PCI: Cannot allocate resource region %d of device %s\n", idx, pci_name(dev)); + /* We'll assign a new address later */ + r->end -= r->start; + r->start = 0; + } + } + } + if (!pass) { + r = &dev->resource[PCI_ROM_RESOURCE]; + if (r->flags & PCI_ROM_ADDRESS_ENABLE) { + /* Turn the ROM off, leave the resource region, but keep it unregistered. */ + u32 reg; + DBG("PCI: Switching off ROM of %s\n", pci_name(dev)); + r->flags &= ~PCI_ROM_ADDRESS_ENABLE; + pci_read_config_dword(dev, dev->rom_base_reg, ®); + pci_write_config_dword(dev, dev->rom_base_reg, reg & ~PCI_ROM_ADDRESS_ENABLE); + } + } + } +} + +static int __init pcibios_assign_resources(void) +{ + struct pci_dev *dev = NULL; + int idx; + struct resource *r; + + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + int class = dev->class >> 8; + + /* Don't touch classless devices and host bridges */ + if (!class || class == PCI_CLASS_BRIDGE_HOST) + continue; + + for(idx=0; idx<6; idx++) { + r = &dev->resource[idx]; + + /* + * Don't touch IDE controllers and I/O ports of video cards! + */ + if ((class == PCI_CLASS_STORAGE_IDE && idx < 4) || + (class == PCI_CLASS_DISPLAY_VGA && (r->flags & IORESOURCE_IO))) + continue; + + /* + * We shall assign a new address to this resource, either because + * the BIOS forgot to do so or because we have decided the old + * address was unusable for some reason. + */ + if (!r->start && r->end) + pci_assign_resource(dev, idx); + } + + if (pci_probe & PCI_ASSIGN_ROMS) { + r = &dev->resource[PCI_ROM_RESOURCE]; + r->end -= r->start; + r->start = 0; + if (r->end) + pci_assign_resource(dev, PCI_ROM_RESOURCE); + } + } + return 0; +} + +void __init pcibios_resource_survey(void) +{ + DBG("PCI: Allocating resources\n"); + pcibios_allocate_bus_resources(&pci_root_buses); + pcibios_allocate_resources(0); + pcibios_allocate_resources(1); +} + +/** + * called in fs_initcall (one below subsys_initcall), + * give a chance for motherboard reserve resources + */ +fs_initcall(pcibios_assign_resources); + +int pcibios_enable_resources(struct pci_dev *dev, int mask) +{ + u16 cmd, old_cmd; + int idx; + struct resource *r; + + pci_read_config_word(dev, PCI_COMMAND, &cmd); + old_cmd = cmd; + for(idx=0; idx<6; idx++) { + /* Only set up the requested stuff */ + if (!(mask & (1<resource[idx]; + if (!r->start && r->end) { + printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev)); + return -EINVAL; + } + if (r->flags & IORESOURCE_IO) + cmd |= PCI_COMMAND_IO; + if (r->flags & IORESOURCE_MEM) + cmd |= PCI_COMMAND_MEMORY; + } + if (dev->resource[PCI_ROM_RESOURCE].start) + cmd |= PCI_COMMAND_MEMORY; + if (cmd != old_cmd) { + printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd); + pci_write_config_word(dev, PCI_COMMAND, cmd); + } + return 0; +} + +/* + * If we set up a device for bus mastering, we need to check the latency + * timer as certain crappy BIOSes forget to set it properly. + */ +unsigned int pcibios_max_latency = 255; + +void pcibios_set_master(struct pci_dev *dev) +{ + u8 lat; + pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat); + if (lat < 16) + lat = (64 <= pcibios_max_latency) ? 64 : pcibios_max_latency; + else if (lat > pcibios_max_latency) + lat = pcibios_max_latency; + else + return; + printk(KERN_DEBUG "PCI: Setting latency timer of device %s to %d\n", pci_name(dev), lat); + pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); +} + +int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, + enum pci_mmap_state mmap_state, int write_combine) +{ + unsigned long prot; + + /* I/O space cannot be accessed via normal processor loads and + * stores on this platform. + */ + if (mmap_state == pci_mmap_io) + return -EINVAL; + + /* Leave vm_pgoff as-is, the PCI space address is the physical + * address on this platform. + */ + vma->vm_flags |= (VM_SHM | VM_LOCKED | VM_IO); + + prot = pgprot_val(vma->vm_page_prot); + if (boot_cpu_data.x86 > 3) + prot |= _PAGE_PCD | _PAGE_PWT; + vma->vm_page_prot = __pgprot(prot); + + /* Write-combine setting is ignored, it is changed via the mtrr + * interfaces on this platform. + */ + if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, + vma->vm_end - vma->vm_start, + vma->vm_page_prot)) + return -EAGAIN; + + return 0; +} diff --git a/src/wraith/pci/irq.c b/src/wraith/pci/irq.c new file mode 100644 index 000000000..18a394c0f --- /dev/null +++ b/src/wraith/pci/irq.c @@ -0,0 +1,1116 @@ +/* + * Low-Level PCI Support for PC -- Routing of Interrupts + * + * (c) 1999--2000 Martin Mares + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pci.h" + +#define PIRQ_SIGNATURE (('$' << 0) + ('P' << 8) + ('I' << 16) + ('R' << 24)) +#define PIRQ_VERSION 0x0100 + +static int broken_hp_bios_irq9; +static int acer_tm360_irqrouting; + +static struct irq_routing_table *pirq_table; + +/* + * Never use: 0, 1, 2 (timer, keyboard, and cascade) + * Avoid using: 13, 14 and 15 (FP error and IDE). + * Penalize: 3, 4, 6, 7, 12 (known ISA uses: serial, floppy, parallel and mouse) + */ +unsigned int pcibios_irq_mask = 0xfff8; + +static int pirq_penalty[16] = { + 1000000, 1000000, 1000000, 1000, 1000, 0, 1000, 1000, + 0, 0, 0, 0, 1000, 100000, 100000, 100000 +}; + +struct irq_router { + char *name; + u16 vendor, device; + int (*get)(struct pci_dev *router, struct pci_dev *dev, int pirq); + int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq, int new); +}; + +struct irq_router_handler { + u16 vendor; + int (*probe)(struct irq_router *r, struct pci_dev *router, u16 device); +}; + +int (*pcibios_enable_irq)(struct pci_dev *dev) = NULL; + +/* + * Search 0xf0000 -- 0xfffff for the PCI IRQ Routing Table. + */ + +static struct irq_routing_table * __init pirq_find_routing_table(void) +{ + u8 *addr; + struct irq_routing_table *rt; + int i; + u8 sum; + + for(addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000); addr += 16) { + rt = (struct irq_routing_table *) addr; + if (rt->signature != PIRQ_SIGNATURE || + rt->version != PIRQ_VERSION || + rt->size % 16 || + rt->size < sizeof(struct irq_routing_table)) + continue; + sum = 0; + for(i=0; isize; i++) + sum += addr[i]; + if (!sum) { + DBG("PCI: Interrupt Routing Table found at 0x%p\n", rt); + return rt; + } + } + return NULL; +} + +/* + * If we have a IRQ routing table, use it to search for peer host + * bridges. It's a gross hack, but since there are no other known + * ways how to get a list of buses, we have to go this way. + */ + +static void __init pirq_peer_trick(void) +{ + struct irq_routing_table *rt = pirq_table; + u8 busmap[256]; + int i; + struct irq_info *e; + + memset(busmap, 0, sizeof(busmap)); + for(i=0; i < (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); i++) { + e = &rt->slots[i]; +#ifdef DEBUG + { + int j; + DBG("%02x:%02x slot=%02x", e->bus, e->devfn/8, e->slot); + for(j=0; j<4; j++) + DBG(" %d:%02x/%04x", j, e->irq[j].link, e->irq[j].bitmap); + DBG("\n"); + } +#endif + busmap[e->bus] = 1; + } + for(i = 1; i < 256; i++) { + if (!busmap[i] || pci_find_bus(0, i)) + continue; + if (pci_scan_bus(i, &pci_root_ops, NULL)) + printk(KERN_INFO "PCI: Discovered primary peer bus %02x [IRQ]\n", i); + } + pcibios_last_bus = -1; +} + +/* + * Code for querying and setting of IRQ routes on various interrupt routers. + */ + +void eisa_set_level_irq(unsigned int irq) +{ + unsigned char mask = 1 << (irq & 7); + unsigned int port = 0x4d0 + (irq >> 3); + unsigned char val; + static u16 eisa_irq_mask; + + if (irq >= 16 || (1 << irq) & eisa_irq_mask) + return; + + eisa_irq_mask |= (1 << irq); + printk("PCI: setting IRQ %u as level-triggered\n", irq); + val = inb(port); + if (!(val & mask)) { + DBG(" -> edge"); + outb(val | mask, port); + } +} + +/* + * Common IRQ routing practice: nybbles in config space, + * offset by some magic constant. + */ +static unsigned int read_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr) +{ + u8 x; + unsigned reg = offset + (nr >> 1); + + pci_read_config_byte(router, reg, &x); + return (nr & 1) ? (x >> 4) : (x & 0xf); +} + +static void write_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr, unsigned int val) +{ + u8 x; + unsigned reg = offset + (nr >> 1); + + pci_read_config_byte(router, reg, &x); + x = (nr & 1) ? ((x & 0x0f) | (val << 4)) : ((x & 0xf0) | val); + pci_write_config_byte(router, reg, x); +} + +/* + * ALI pirq entries are damn ugly, and completely undocumented. + * This has been figured out from pirq tables, and it's not a pretty + * picture. + */ +static int pirq_ali_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +{ + static unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 }; + + return irqmap[read_config_nybble(router, 0x48, pirq-1)]; +} + +static int pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + static unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, 3, 9, 11, 0, 13, 15 }; + unsigned int val = irqmap[irq]; + + if (val) { + write_config_nybble(router, 0x48, pirq-1, val); + return 1; + } + return 0; +} + +/* + * The Intel PIIX4 pirq rules are fairly simple: "pirq" is + * just a pointer to the config space. + */ +static int pirq_piix_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +{ + u8 x; + + pci_read_config_byte(router, pirq, &x); + return (x < 16) ? x : 0; +} + +static int pirq_piix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + pci_write_config_byte(router, pirq, irq); + return 1; +} + +/* + * The VIA pirq rules are nibble-based, like ALI, + * but without the ugly irq number munging. + * However, PIRQD is in the upper instead of lower 4 bits. + */ +static int pirq_via_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +{ + return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq); +} + +static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq); + return 1; +} + +/* + * ITE 8330G pirq rules are nibble-based + * FIXME: pirqmap may be { 1, 0, 3, 2 }, + * 2+3 are both mapped to irq 9 on my system + */ +static int pirq_ite_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +{ + static unsigned char pirqmap[4] = { 1, 0, 2, 3 }; + return read_config_nybble(router,0x43, pirqmap[pirq-1]); +} + +static int pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + static unsigned char pirqmap[4] = { 1, 0, 2, 3 }; + write_config_nybble(router, 0x43, pirqmap[pirq-1], irq); + return 1; +} + +/* + * OPTI: high four bits are nibble pointer.. + * I wonder what the low bits do? + */ +static int pirq_opti_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +{ + return read_config_nybble(router, 0xb8, pirq >> 4); +} + +static int pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + write_config_nybble(router, 0xb8, pirq >> 4, irq); + return 1; +} + +/* + * Cyrix: nibble offset 0x5C + * 0x5C bits 7:4 is INTB bits 3:0 is INTA + * 0x5D bits 7:4 is INTD bits 3:0 is INTC + */ +static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +{ + return read_config_nybble(router, 0x5C, (pirq-1)^1); +} + +static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + write_config_nybble(router, 0x5C, (pirq-1)^1, irq); + return 1; +} + +/* + * PIRQ routing for SiS 85C503 router used in several SiS chipsets. + * We have to deal with the following issues here: + * - vendors have different ideas about the meaning of link values + * - some onboard devices (integrated in the chipset) have special + * links and are thus routed differently (i.e. not via PCI INTA-INTD) + * - different revision of the router have a different layout for + * the routing registers, particularly for the onchip devices + * + * For all routing registers the common thing is we have one byte + * per routeable link which is defined as: + * bit 7 IRQ mapping enabled (0) or disabled (1) + * bits [6:4] reserved (sometimes used for onchip devices) + * bits [3:0] IRQ to map to + * allowed: 3-7, 9-12, 14-15 + * reserved: 0, 1, 2, 8, 13 + * + * The config-space registers located at 0x41/0x42/0x43/0x44 are + * always used to route the normal PCI INT A/B/C/D respectively. + * Apparently there are systems implementing PCI routing table using + * link values 0x01-0x04 and others using 0x41-0x44 for PCI INTA..D. + * We try our best to handle both link mappings. + * + * Currently (2003-05-21) it appears most SiS chipsets follow the + * definition of routing registers from the SiS-5595 southbridge. + * According to the SiS 5595 datasheets the revision id's of the + * router (ISA-bridge) should be 0x01 or 0xb0. + * + * Furthermore we've also seen lspci dumps with revision 0x00 and 0xb1. + * Looks like these are used in a number of SiS 5xx/6xx/7xx chipsets. + * They seem to work with the current routing code. However there is + * some concern because of the two USB-OHCI HCs (original SiS 5595 + * had only one). YMMV. + * + * Onchip routing for router rev-id 0x01/0xb0 and probably 0x00/0xb1: + * + * 0x61: IDEIRQ: + * bits [6:5] must be written 01 + * bit 4 channel-select primary (0), secondary (1) + * + * 0x62: USBIRQ: + * bit 6 OHCI function disabled (0), enabled (1) + * + * 0x6a: ACPI/SCI IRQ: bits 4-6 reserved + * + * 0x7e: Data Acq. Module IRQ - bits 4-6 reserved + * + * We support USBIRQ (in addition to INTA-INTD) and keep the + * IDE, ACPI and DAQ routing untouched as set by the BIOS. + * + * Currently the only reported exception is the new SiS 65x chipset + * which includes the SiS 69x southbridge. Here we have the 85C503 + * router revision 0x04 and there are changes in the register layout + * mostly related to the different USB HCs with USB 2.0 support. + * + * Onchip routing for router rev-id 0x04 (try-and-error observation) + * + * 0x60/0x61/0x62/0x63: 1xEHCI and 3xOHCI (companion) USB-HCs + * bit 6-4 are probably unused, not like 5595 + */ + +#define PIRQ_SIS_IRQ_MASK 0x0f +#define PIRQ_SIS_IRQ_DISABLE 0x80 +#define PIRQ_SIS_USB_ENABLE 0x40 + +static int pirq_sis_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +{ + u8 x; + int reg; + + reg = pirq; + if (reg >= 0x01 && reg <= 0x04) + reg += 0x40; + pci_read_config_byte(router, reg, &x); + return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK); +} + +static int pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + u8 x; + int reg; + + reg = pirq; + if (reg >= 0x01 && reg <= 0x04) + reg += 0x40; + pci_read_config_byte(router, reg, &x); + x &= ~(PIRQ_SIS_IRQ_MASK | PIRQ_SIS_IRQ_DISABLE); + x |= irq ? irq: PIRQ_SIS_IRQ_DISABLE; + pci_write_config_byte(router, reg, x); + return 1; +} + + +/* + * VLSI: nibble offset 0x74 - educated guess due to routing table and + * config space of VLSI 82C534 PCI-bridge/router (1004:0102) + * Tested on HP OmniBook 800 covering PIRQ 1, 2, 4, 8 for onboard + * devices, PIRQ 3 for non-pci(!) soundchip and (untested) PIRQ 6 + * for the busbridge to the docking station. + */ + +static int pirq_vlsi_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +{ + if (pirq > 8) { + printk(KERN_INFO "VLSI router pirq escape (%d)\n", pirq); + return 0; + } + return read_config_nybble(router, 0x74, pirq-1); +} + +static int pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + if (pirq > 8) { + printk(KERN_INFO "VLSI router pirq escape (%d)\n", pirq); + return 0; + } + write_config_nybble(router, 0x74, pirq-1, irq); + return 1; +} + +/* + * ServerWorks: PCI interrupts mapped to system IRQ lines through Index + * and Redirect I/O registers (0x0c00 and 0x0c01). The Index register + * format is (PCIIRQ## | 0x10), e.g.: PCIIRQ10=0x1a. The Redirect + * register is a straight binary coding of desired PIC IRQ (low nibble). + * + * The 'link' value in the PIRQ table is already in the correct format + * for the Index register. There are some special index values: + * 0x00 for ACPI (SCI), 0x01 for USB, 0x02 for IDE0, 0x04 for IDE1, + * and 0x03 for SMBus. + */ +static int pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +{ + outb_p(pirq, 0xc00); + return inb(0xc01) & 0xf; +} + +static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + outb_p(pirq, 0xc00); + outb_p(irq, 0xc01); + return 1; +} + +/* Support for AMD756 PCI IRQ Routing + * Jhon H. Caicedo + * Jun/21/2001 0.2.0 Release, fixed to use "nybble" functions... (jhcaiced) + * Jun/19/2001 Alpha Release 0.1.0 (jhcaiced) + * The AMD756 pirq rules are nibble-based + * offset 0x56 0-3 PIRQA 4-7 PIRQB + * offset 0x57 0-3 PIRQC 4-7 PIRQD + */ +static int pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +{ + u8 irq; + irq = 0; + if (pirq <= 4) + { + irq = read_config_nybble(router, 0x56, pirq - 1); + } + printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d get irq : %2d\n", + dev->vendor, dev->device, pirq, irq); + return irq; +} + +static int pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d SET irq : %2d\n", + dev->vendor, dev->device, pirq, irq); + if (pirq <= 4) + { + write_config_nybble(router, 0x56, pirq - 1, irq); + } + return 1; +} + +#ifdef CONFIG_PCI_BIOS + +static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + struct pci_dev *bridge; + int pin = pci_get_interrupt_pin(dev, &bridge); + return pcibios_set_irq_routing(bridge, pin, irq); +} + +#endif + +static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + static struct pci_device_id pirq_440gx[] = { + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_2) }, + { }, + }; + + /* 440GX has a proprietary PIRQ router -- don't use it */ + if (pci_dev_present(pirq_440gx)) + return 0; + + switch(device) + { + case PCI_DEVICE_ID_INTEL_82371FB_0: + case PCI_DEVICE_ID_INTEL_82371SB_0: + case PCI_DEVICE_ID_INTEL_82371AB_0: + case PCI_DEVICE_ID_INTEL_82371MX: + case PCI_DEVICE_ID_INTEL_82443MX_0: + case PCI_DEVICE_ID_INTEL_82801AA_0: + case PCI_DEVICE_ID_INTEL_82801AB_0: + case PCI_DEVICE_ID_INTEL_82801BA_0: + case PCI_DEVICE_ID_INTEL_82801BA_10: + case PCI_DEVICE_ID_INTEL_82801CA_0: + case PCI_DEVICE_ID_INTEL_82801CA_12: + case PCI_DEVICE_ID_INTEL_82801DB_0: + case PCI_DEVICE_ID_INTEL_82801E_0: + case PCI_DEVICE_ID_INTEL_82801EB_0: + case PCI_DEVICE_ID_INTEL_ESB_1: + case PCI_DEVICE_ID_INTEL_ICH6_0: + case PCI_DEVICE_ID_INTEL_ICH6_1: + r->name = "PIIX/ICH"; + r->get = pirq_piix_get; + r->set = pirq_piix_set; + return 1; + } + return 0; +} + +static __init int via_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + /* FIXME: We should move some of the quirk fixup stuff here */ + switch(device) + { + case PCI_DEVICE_ID_VIA_82C586_0: + case PCI_DEVICE_ID_VIA_82C596: + case PCI_DEVICE_ID_VIA_82C686: + case PCI_DEVICE_ID_VIA_8231: + /* FIXME: add new ones for 8233/5 */ + r->name = "VIA"; + r->get = pirq_via_get; + r->set = pirq_via_set; + return 1; + } + return 0; +} + +static __init int vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_VLSI_82C534: + r->name = "VLSI 82C534"; + r->get = pirq_vlsi_get; + r->set = pirq_vlsi_set; + return 1; + } + return 0; +} + + +static __init int serverworks_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_SERVERWORKS_OSB4: + case PCI_DEVICE_ID_SERVERWORKS_CSB5: + r->name = "ServerWorks"; + r->get = pirq_serverworks_get; + r->set = pirq_serverworks_set; + return 1; + } + return 0; +} + +static __init int sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + if (device != PCI_DEVICE_ID_SI_503) + return 0; + + r->name = "SIS"; + r->get = pirq_sis_get; + r->set = pirq_sis_set; + return 1; +} + +static __init int cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_CYRIX_5520: + r->name = "NatSemi"; + r->get = pirq_cyrix_get; + r->set = pirq_cyrix_set; + return 1; + } + return 0; +} + +static __init int opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_OPTI_82C700: + r->name = "OPTI"; + r->get = pirq_opti_get; + r->set = pirq_opti_set; + return 1; + } + return 0; +} + +static __init int ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_ITE_IT8330G_0: + r->name = "ITE"; + r->get = pirq_ite_get; + r->set = pirq_ite_set; + return 1; + } + return 0; +} + +static __init int ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_AL_M1533: + case PCI_DEVICE_ID_AL_M1563: + printk("PCI: Using ALI IRQ Router\n"); + r->name = "ALI"; + r->get = pirq_ali_get; + r->set = pirq_ali_set; + return 1; + } + return 0; +} + +static __init int amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_AMD_VIPER_740B: + r->name = "AMD756"; + break; + case PCI_DEVICE_ID_AMD_VIPER_7413: + r->name = "AMD766"; + break; + case PCI_DEVICE_ID_AMD_VIPER_7443: + r->name = "AMD768"; + break; + default: + return 0; + } + r->get = pirq_amd756_get; + r->set = pirq_amd756_set; + return 1; +} + +static __initdata struct irq_router_handler pirq_routers[] = { + { PCI_VENDOR_ID_INTEL, intel_router_probe }, + { PCI_VENDOR_ID_AL, ali_router_probe }, + { PCI_VENDOR_ID_ITE, ite_router_probe }, + { PCI_VENDOR_ID_VIA, via_router_probe }, + { PCI_VENDOR_ID_OPTI, opti_router_probe }, + { PCI_VENDOR_ID_SI, sis_router_probe }, + { PCI_VENDOR_ID_CYRIX, cyrix_router_probe }, + { PCI_VENDOR_ID_VLSI, vlsi_router_probe }, + { PCI_VENDOR_ID_SERVERWORKS, serverworks_router_probe }, + { PCI_VENDOR_ID_AMD, amd_router_probe }, + /* Someone with docs needs to add the ATI Radeon IGP */ + { 0, NULL } +}; +static struct irq_router pirq_router; +static struct pci_dev *pirq_router_dev; + + +/* + * FIXME: should we have an option to say "generic for + * chipset" ? + */ + +static void __init pirq_find_router(struct irq_router *r) +{ + struct irq_routing_table *rt = pirq_table; + struct irq_router_handler *h; + +#ifdef CONFIG_PCI_BIOS + if (!rt->signature) { + printk(KERN_INFO "PCI: Using BIOS for IRQ routing\n"); + r->set = pirq_bios_set; + r->name = "BIOS"; + return; + } +#endif + + /* Default unless a driver reloads it */ + r->name = "default"; + r->get = NULL; + r->set = NULL; + + DBG("PCI: Attempting to find IRQ router for %04x:%04x\n", + rt->rtr_vendor, rt->rtr_device); + + pirq_router_dev = pci_find_slot(rt->rtr_bus, rt->rtr_devfn); + if (!pirq_router_dev) { + DBG("PCI: Interrupt router not found at %02x:%02x\n", rt->rtr_bus, rt->rtr_devfn); + return; + } + + for( h = pirq_routers; h->vendor; h++) { + /* First look for a router match */ + if (rt->rtr_vendor == h->vendor && h->probe(r, pirq_router_dev, rt->rtr_device)) + break; + /* Fall back to a device match */ + if (pirq_router_dev->vendor == h->vendor && h->probe(r, pirq_router_dev, pirq_router_dev->device)) + break; + } + printk(KERN_INFO "PCI: Using IRQ router %s [%04x/%04x] at %s\n", + pirq_router.name, + pirq_router_dev->vendor, + pirq_router_dev->device, + pci_name(pirq_router_dev)); +} + +static struct irq_info *pirq_get_info(struct pci_dev *dev) +{ + struct irq_routing_table *rt = pirq_table; + int entries = (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); + struct irq_info *info; + + for (info = rt->slots; entries--; info++) + if (info->bus == dev->bus->number && PCI_SLOT(info->devfn) == PCI_SLOT(dev->devfn)) + return info; + return NULL; +} + +static int pcibios_lookup_irq(struct pci_dev *dev, int assign) +{ + u8 pin; + struct irq_info *info; + int i, pirq, newirq; + int irq = 0; + u32 mask; + struct irq_router *r = &pirq_router; + struct pci_dev *dev2 = NULL; + char *msg = NULL; + + /* Find IRQ pin */ + pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); + if (!pin) { + DBG(" -> no interrupt pin\n"); + return 0; + } + pin = pin - 1; + + /* Find IRQ routing entry */ + + if (!pirq_table) + return 0; + + DBG("IRQ for %s:%d", pci_name(dev), pin); + info = pirq_get_info(dev); + if (!info) { + DBG(" -> not found in routing table\n"); + return 0; + } + pirq = info->irq[pin].link; + mask = info->irq[pin].bitmap; + if (!pirq) { + DBG(" -> not routed\n"); + return 0; + } + DBG(" -> PIRQ %02x, mask %04x, excl %04x", pirq, mask, pirq_table->exclusive_irqs); + mask &= pcibios_irq_mask; + + /* Work around broken HP Pavilion Notebooks which assign USB to + IRQ 9 even though it is actually wired to IRQ 11 */ + + if (broken_hp_bios_irq9 && pirq == 0x59 && dev->irq == 9) { + dev->irq = 11; + pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 11); + r->set(pirq_router_dev, dev, pirq, 11); + } + + /* same for Acer Travelmate 360, but with CB and irq 11 -> 10 */ + if (acer_tm360_irqrouting && dev->irq == 11 && dev->vendor == PCI_VENDOR_ID_O2) { + pirq = 0x68; + mask = 0x400; + dev->irq = r->get(pirq_router_dev, dev, pirq); + pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); + } + + /* + * Find the best IRQ to assign: use the one + * reported by the device if possible. + */ + newirq = dev->irq; + if (!((1 << newirq) & mask)) { + if ( pci_probe & PCI_USE_PIRQ_MASK) newirq = 0; + else printk(KERN_WARNING "PCI: IRQ %i for device %s doesn't match PIRQ mask - try pci=usepirqmask\n", newirq, pci_name(dev)); + } + if (!newirq && assign) { + for (i = 0; i < 16; i++) { + if (!(mask & (1 << i))) + continue; + if (pirq_penalty[i] < pirq_penalty[newirq] && can_request_irq(i, SA_SHIRQ)) + newirq = i; + } + } + DBG(" -> newirq=%d", newirq); + + /* Check if it is hardcoded */ + if ((pirq & 0xf0) == 0xf0) { + irq = pirq & 0xf; + DBG(" -> hardcoded IRQ %d\n", irq); + msg = "Hardcoded"; + } else if ( r->get && (irq = r->get(pirq_router_dev, dev, pirq)) && \ + ((!(pci_probe & PCI_USE_PIRQ_MASK)) || ((1 << irq) & mask)) ) { + DBG(" -> got IRQ %d\n", irq); + msg = "Found"; + } else if (newirq && r->set && (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) { + DBG(" -> assigning IRQ %d", newirq); + if (r->set(pirq_router_dev, dev, pirq, newirq)) { + eisa_set_level_irq(newirq); + DBG(" ... OK\n"); + msg = "Assigned"; + irq = newirq; + } + } + + if (!irq) { + DBG(" ... failed\n"); + if (newirq && mask == (1 << newirq)) { + msg = "Guessed"; + irq = newirq; + } else + return 0; + } + printk(KERN_INFO "PCI: %s IRQ %d for device %s\n", msg, irq, pci_name(dev)); + + /* Update IRQ for all devices with the same pirq value */ + while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) { + pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin); + if (!pin) + continue; + pin--; + info = pirq_get_info(dev2); + if (!info) + continue; + if (info->irq[pin].link == pirq) { + /* We refuse to override the dev->irq information. Give a warning! */ + if ( dev2->irq && dev2->irq != irq && \ + (!(pci_probe & PCI_USE_PIRQ_MASK) || \ + ((1 << dev2->irq) & mask)) ) { +#ifndef CONFIG_PCI_MSI + printk(KERN_INFO "IRQ routing conflict for %s, have irq %d, want irq %d\n", + pci_name(dev2), dev2->irq, irq); +#endif + continue; + } + dev2->irq = irq; + pirq_penalty[irq]++; + if (dev != dev2) + printk(KERN_INFO "PCI: Sharing IRQ %d with %s\n", irq, pci_name(dev2)); + } + } + return 1; +} + +static void __init pcibios_fixup_irqs(void) +{ + struct pci_dev *dev = NULL; + u8 pin; + + DBG("PCI: IRQ fixup\n"); + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + /* + * If the BIOS has set an out of range IRQ number, just ignore it. + * Also keep track of which IRQ's are already in use. + */ + if (dev->irq >= 16) { + DBG("%s: ignoring bogus IRQ %d\n", pci_name(dev), dev->irq); + dev->irq = 0; + } + /* If the IRQ is already assigned to a PCI device, ignore its ISA use penalty */ + if (pirq_penalty[dev->irq] >= 100 && pirq_penalty[dev->irq] < 100000) + pirq_penalty[dev->irq] = 0; + pirq_penalty[dev->irq]++; + } + + dev = NULL; + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); +#ifdef CONFIG_X86_IO_APIC + /* + * Recalculate IRQ numbers if we use the I/O APIC. + */ + if (io_apic_assign_pci_irqs) + { + int irq; + + if (pin) { + pin--; /* interrupt pins are numbered starting from 1 */ + irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin); + /* + * Busses behind bridges are typically not listed in the MP-table. + * In this case we have to look up the IRQ based on the parent bus, + * parent slot, and pin number. The SMP code detects such bridged + * busses itself so we should get into this branch reliably. + */ + if (irq < 0 && dev->bus->parent) { /* go back to the bridge */ + struct pci_dev * bridge = dev->bus->self; + + pin = (pin + PCI_SLOT(dev->devfn)) % 4; + irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, + PCI_SLOT(bridge->devfn), pin); + if (irq >= 0) + printk(KERN_WARNING "PCI: using PPB(B%d,I%d,P%d) to get irq %d\n", + bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq); + } + if (irq >= 0) { + if (use_pci_vector() && + !platform_legacy_irq(irq)) + irq = IO_APIC_VECTOR(irq); + + printk(KERN_INFO "PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n", + dev->bus->number, PCI_SLOT(dev->devfn), pin, irq); + dev->irq = irq; + } + } + } +#endif + /* + * Still no IRQ? Try to lookup one... + */ + if (pin && !dev->irq) + pcibios_lookup_irq(dev, 0); + } +} + +/* + * Work around broken HP Pavilion Notebooks which assign USB to + * IRQ 9 even though it is actually wired to IRQ 11 + */ +static int __init fix_broken_hp_bios_irq9(struct dmi_system_id *d) +{ + if (!broken_hp_bios_irq9) { + broken_hp_bios_irq9 = 1; + printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident); + } + return 0; +} + +/* + * Work around broken Acer TravelMate 360 Notebooks which assign + * Cardbus to IRQ 11 even though it is actually wired to IRQ 10 + */ +static int __init fix_acer_tm360_irqrouting(struct dmi_system_id *d) +{ + if (!acer_tm360_irqrouting) { + acer_tm360_irqrouting = 1; + printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident); + } + return 0; +} + +static struct dmi_system_id __initdata pciirq_dmi_table[] = { + { + .callback = fix_broken_hp_bios_irq9, + .ident = "HP Pavilion N5400 Series Laptop", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_BIOS_VERSION, "GE.M1.03"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GE"), + DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"), + }, + }, + { + .callback = fix_acer_tm360_irqrouting, + .ident = "Acer TravelMate 36x Laptop", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), + }, + }, + { } +}; + +static int __init pcibios_irq_init(void) +{ + DBG("PCI: IRQ init\n"); + + if (pcibios_enable_irq || raw_pci_ops == NULL) + return 0; + + dmi_check_system(pciirq_dmi_table); + + pirq_table = pirq_find_routing_table(); + +#ifdef CONFIG_PCI_BIOS + if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN)) + pirq_table = pcibios_get_irq_routing_table(); +#endif + if (pirq_table) { + pirq_peer_trick(); + pirq_find_router(&pirq_router); + if (pirq_table->exclusive_irqs) { + int i; + for (i=0; i<16; i++) + if (!(pirq_table->exclusive_irqs & (1 << i))) + pirq_penalty[i] += 100; + } + /* If we're using the I/O APIC, avoid using the PCI IRQ routing table */ + if (io_apic_assign_pci_irqs) + pirq_table = NULL; + } + + pcibios_enable_irq = pirq_enable_irq; + + pcibios_fixup_irqs(); + return 0; +} + +subsys_initcall(pcibios_irq_init); + + +static void pirq_penalize_isa_irq(int irq) +{ + /* + * If any ISAPnP device reports an IRQ in its list of possible + * IRQ's, we try to avoid assigning it to PCI devices. + */ + if (irq < 16) + pirq_penalty[irq] += 100; +} + +void pcibios_penalize_isa_irq(int irq) +{ +#ifdef CONFIG_ACPI_PCI + if (!acpi_noirq) + acpi_penalize_isa_irq(irq); + else +#endif + pirq_penalize_isa_irq(irq); +} + +int pirq_enable_irq(struct pci_dev *dev) +{ + u8 pin; + extern int interrupt_line_quirk; + struct pci_dev *temp_dev; + + pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); + if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) { + char *msg; + msg = ""; + if (io_apic_assign_pci_irqs) { + int irq; + + if (pin) { + pin--; /* interrupt pins are numbered starting from 1 */ + irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin); + /* + * Busses behind bridges are typically not listed in the MP-table. + * In this case we have to look up the IRQ based on the parent bus, + * parent slot, and pin number. The SMP code detects such bridged + * busses itself so we should get into this branch reliably. + */ + temp_dev = dev; + while (irq < 0 && dev->bus->parent) { /* go back to the bridge */ + struct pci_dev * bridge = dev->bus->self; + + pin = (pin + PCI_SLOT(dev->devfn)) % 4; + irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, + PCI_SLOT(bridge->devfn), pin); + if (irq >= 0) + printk(KERN_WARNING "PCI: using PPB(B%d,I%d,P%d) to get irq %d\n", + bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq); + dev = bridge; + } + dev = temp_dev; + if (irq >= 0) { +#ifdef CONFIG_PCI_MSI + if (!platform_legacy_irq(irq)) + irq = IO_APIC_VECTOR(irq); +#endif + printk(KERN_INFO "PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n", + dev->bus->number, PCI_SLOT(dev->devfn), pin, irq); + dev->irq = irq; + return 0; + } else + msg = " Probably buggy MP table."; + } + } else if (pci_probe & PCI_BIOS_IRQ_SCAN) + msg = ""; + else + msg = " Please try using pci=biosirq."; + + /* With IDE legacy devices the IRQ lookup failure is not a problem.. */ + if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && !(dev->class & 0x5)) + return 0; + + printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n", + 'A' + pin - 1, pci_name(dev), msg); + } + /* VIA bridges use interrupt line for apic/pci steering across + the V-Link */ + else if (interrupt_line_quirk) + pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq & 15); + return 0; +} + +int pci_vector_resources(int last, int nr_released) +{ + int count = nr_released; + + int next = last; + int offset = (last % 8); + + while (next < FIRST_SYSTEM_VECTOR) { + next += 8; +#ifdef CONFIG_X86_64 + if (next == IA32_SYSCALL_VECTOR) + continue; +#else + if (next == SYSCALL_VECTOR) + continue; +#endif + count++; + if (next >= FIRST_SYSTEM_VECTOR) { + if (offset%8) { + next = FIRST_DEVICE_VECTOR + offset; + offset++; + continue; + } + count--; + } + } + + return count; +} diff --git a/src/wraith/pci/legacy.c b/src/wraith/pci/legacy.c new file mode 100644 index 000000000..1492e3753 --- /dev/null +++ b/src/wraith/pci/legacy.c @@ -0,0 +1,54 @@ +/* + * legacy.c - traditional, old school PCI bus probing + */ +#include +#include +#include "pci.h" + +/* + * Discover remaining PCI buses in case there are peer host bridges. + * We use the number of last PCI bus provided by the PCI BIOS. + */ +static void __devinit pcibios_fixup_peer_bridges(void) +{ + int n, devfn; + + if (pcibios_last_bus <= 0 || pcibios_last_bus >= 0xff) + return; + DBG("PCI: Peer bridge fixup\n"); + + for (n=0; n <= pcibios_last_bus; n++) { + u32 l; + if (pci_find_bus(0, n)) + continue; + for (devfn = 0; devfn < 256; devfn += 8) { + if (!raw_pci_ops->read(0, n, devfn, PCI_VENDOR_ID, 2, &l) && + l != 0x0000 && l != 0xffff) { + DBG("Found device at %02x:%02x [%04x]\n", n, devfn, l); + printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n); + pci_scan_bus(n, &pci_root_ops, NULL); + break; + } + } + } +} + +static int __init pci_legacy_init(void) +{ + if (!raw_pci_ops) { + printk("PCI: System does not support PCI\n"); + return 0; + } + + if (pcibios_scanned++) + return 0; + + printk("PCI: Probing PCI hardware\n"); + pci_root_bus = pcibios_scan_root(0); + + pcibios_fixup_peer_bridges(); + + return 0; +} + +subsys_initcall(pci_legacy_init); diff --git a/src/wraith/pci/mmconfig.c b/src/wraith/pci/mmconfig.c new file mode 100644 index 000000000..504fb18fe --- /dev/null +++ b/src/wraith/pci/mmconfig.c @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2004 Matthew Wilcox + * Copyright (C) 2004 Intel Corp. + * + * This code is released under the GNU General Public License version 2. + */ + +/* + * mmconfig.c - Low-level direct PCI config space access via MMCONFIG + */ + +#include +#include +#include "pci.h" + +/* The physical address of the MMCONFIG aperture. Set from ACPI tables. */ +u32 pci_mmcfg_base_addr; + +#define mmcfg_virt_addr ((void __iomem *) fix_to_virt(FIX_PCIE_MCFG)) + +/* The base address of the last MMCONFIG device accessed */ +static u32 mmcfg_last_accessed_device; + +/* + * Functions for accessing PCI configuration space with MMCONFIG accesses + */ + +static inline void pci_exp_set_dev_base(int bus, int devfn) +{ + u32 dev_base = pci_mmcfg_base_addr | (bus << 20) | (devfn << 12); + if (dev_base != mmcfg_last_accessed_device) { + mmcfg_last_accessed_device = dev_base; + set_fixmap_nocache(FIX_PCIE_MCFG, dev_base); + } +} + +static int pci_mmcfg_read(int seg, int bus, int devfn, int reg, int len, u32 *value) +{ + unsigned long flags; + + if (!value || (bus > 255) || (devfn > 255) || (reg > 4095)) + return -EINVAL; + + spin_lock_irqsave(&pci_config_lock, flags); + + pci_exp_set_dev_base(bus, devfn); + + switch (len) { + case 1: + *value = readb(mmcfg_virt_addr + reg); + break; + case 2: + *value = readw(mmcfg_virt_addr + reg); + break; + case 4: + *value = readl(mmcfg_virt_addr + reg); + break; + } + + spin_unlock_irqrestore(&pci_config_lock, flags); + + return 0; +} + +static int pci_mmcfg_write(int seg, int bus, int devfn, int reg, int len, u32 value) +{ + unsigned long flags; + + if ((bus > 255) || (devfn > 255) || (reg > 4095)) + return -EINVAL; + + spin_lock_irqsave(&pci_config_lock, flags); + + pci_exp_set_dev_base(bus, devfn); + + switch (len) { + case 1: + writeb(value, mmcfg_virt_addr + reg); + break; + case 2: + writew(value, mmcfg_virt_addr + reg); + break; + case 4: + writel(value, mmcfg_virt_addr + reg); + break; + } + + spin_unlock_irqrestore(&pci_config_lock, flags); + + return 0; +} + +static struct pci_raw_ops pci_mmcfg = { + .read = pci_mmcfg_read, + .write = pci_mmcfg_write, +}; + +static int __init pci_mmcfg_init(void) +{ + if ((pci_probe & PCI_PROBE_MMCONF) == 0) + goto out; + if (!pci_mmcfg_base_addr) + goto out; + + /* Kludge for now. Don't use mmconfig on AMD systems because + those have some busses where mmconfig doesn't work, + and we don't parse ACPI MCFG well enough to handle that. + Remove when proper handling is added. */ + if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) + goto out; + + printk(KERN_INFO "PCI: Using MMCONFIG\n"); + raw_pci_ops = &pci_mmcfg; + pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; + + out: + return 0; +} + +arch_initcall(pci_mmcfg_init); diff --git a/src/wraith/pci/numa.c b/src/wraith/pci/numa.c new file mode 100644 index 000000000..c8046737b --- /dev/null +++ b/src/wraith/pci/numa.c @@ -0,0 +1,126 @@ +/* + * numa.c - Low-level PCI access for NUMA-Q machines + */ + +#include +#include +#include "pci.h" + +#define BUS2QUAD(global) (mp_bus_id_to_node[global]) +#define BUS2LOCAL(global) (mp_bus_id_to_local[global]) +#define QUADLOCAL2BUS(quad,local) (quad_local_to_mp_bus_id[quad][local]) + +#define PCI_CONF1_MQ_ADDRESS(bus, devfn, reg) \ + (0x80000000 | (BUS2LOCAL(bus) << 16) | (devfn << 8) | (reg & ~3)) + +static int pci_conf1_mq_read (int seg, int bus, int devfn, int reg, int len, u32 *value) +{ + unsigned long flags; + + if (!value || (bus > MAX_MP_BUSSES) || (devfn > 255) || (reg > 255)) + return -EINVAL; + + spin_lock_irqsave(&pci_config_lock, flags); + + outl_quad(PCI_CONF1_MQ_ADDRESS(bus, devfn, reg), 0xCF8, BUS2QUAD(bus)); + + switch (len) { + case 1: + *value = inb_quad(0xCFC + (reg & 3), BUS2QUAD(bus)); + break; + case 2: + *value = inw_quad(0xCFC + (reg & 2), BUS2QUAD(bus)); + break; + case 4: + *value = inl_quad(0xCFC, BUS2QUAD(bus)); + break; + } + + spin_unlock_irqrestore(&pci_config_lock, flags); + + return 0; +} + +static int pci_conf1_mq_write (int seg, int bus, int devfn, int reg, int len, u32 value) +{ + unsigned long flags; + + if ((bus > MAX_MP_BUSSES) || (devfn > 255) || (reg > 255)) + return -EINVAL; + + spin_lock_irqsave(&pci_config_lock, flags); + + outl_quad(PCI_CONF1_MQ_ADDRESS(bus, devfn, reg), 0xCF8, BUS2QUAD(bus)); + + switch (len) { + case 1: + outb_quad((u8)value, 0xCFC + (reg & 3), BUS2QUAD(bus)); + break; + case 2: + outw_quad((u16)value, 0xCFC + (reg & 2), BUS2QUAD(bus)); + break; + case 4: + outl_quad((u32)value, 0xCFC, BUS2QUAD(bus)); + break; + } + + spin_unlock_irqrestore(&pci_config_lock, flags); + + return 0; +} + +#undef PCI_CONF1_MQ_ADDRESS + +static struct pci_raw_ops pci_direct_conf1_mq = { + .read = pci_conf1_mq_read, + .write = pci_conf1_mq_write +}; + + +static void __devinit pci_fixup_i450nx(struct pci_dev *d) +{ + /* + * i450NX -- Find and scan all secondary buses on all PXB's. + */ + int pxb, reg; + u8 busno, suba, subb; + int quad = BUS2QUAD(d->bus->number); + + printk("PCI: Searching for i450NX host bridges on %s\n", pci_name(d)); + reg = 0xd0; + for(pxb=0; pxb<2; pxb++) { + pci_read_config_byte(d, reg++, &busno); + pci_read_config_byte(d, reg++, &suba); + pci_read_config_byte(d, reg++, &subb); + DBG("i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, suba, subb); + if (busno) + pci_scan_bus(QUADLOCAL2BUS(quad,busno), &pci_root_ops, NULL); /* Bus A */ + if (suba < subb) + pci_scan_bus(QUADLOCAL2BUS(quad,suba+1), &pci_root_ops, NULL); /* Bus B */ + } + pcibios_last_bus = -1; +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx); + +static int __init pci_numa_init(void) +{ + int quad; + + raw_pci_ops = &pci_direct_conf1_mq; + + if (pcibios_scanned++) + return 0; + + pci_root_bus = pcibios_scan_root(0); + if (numnodes > 1) { + for (quad = 1; quad < numnodes; ++quad) { + printk("Scanning PCI bus %d for quad %d\n", + QUADLOCAL2BUS(quad,0), quad); + pci_scan_bus(QUADLOCAL2BUS(quad,0), + &pci_root_ops, NULL); + } + } + return 0; +} + +subsys_initcall(pci_numa_init); diff --git a/src/wraith/pci/pcbios.c b/src/wraith/pci/pcbios.c new file mode 100644 index 000000000..50fc1f31e --- /dev/null +++ b/src/wraith/pci/pcbios.c @@ -0,0 +1,485 @@ +/* + * BIOS32 and PCI BIOS handling. + */ + +#include +#include +#include "pci.h" +#include "pci-functions.h" + + +/* BIOS32 signature: "_32_" */ +#define BIOS32_SIGNATURE (('_' << 0) + ('3' << 8) + ('2' << 16) + ('_' << 24)) + +/* PCI signature: "PCI " */ +#define PCI_SIGNATURE (('P' << 0) + ('C' << 8) + ('I' << 16) + (' ' << 24)) + +/* PCI service signature: "$PCI" */ +#define PCI_SERVICE (('$' << 0) + ('P' << 8) + ('C' << 16) + ('I' << 24)) + +/* PCI BIOS hardware mechanism flags */ +#define PCIBIOS_HW_TYPE1 0x01 +#define PCIBIOS_HW_TYPE2 0x02 +#define PCIBIOS_HW_TYPE1_SPEC 0x10 +#define PCIBIOS_HW_TYPE2_SPEC 0x20 + +/* + * This is the standard structure used to identify the entry point + * to the BIOS32 Service Directory, as documented in + * Standard BIOS 32-bit Service Directory Proposal + * Revision 0.4 May 24, 1993 + * Phoenix Technologies Ltd. + * Norwood, MA + * and the PCI BIOS specification. + */ + +union bios32 { + struct { + unsigned long signature; /* _32_ */ + unsigned long entry; /* 32 bit physical address */ + unsigned char revision; /* Revision level, 0 */ + unsigned char length; /* Length in paragraphs should be 01 */ + unsigned char checksum; /* All bytes must add up to zero */ + unsigned char reserved[5]; /* Must be zero */ + } fields; + char chars[16]; +}; + +/* + * Physical address of the service directory. I don't know if we're + * allowed to have more than one of these or not, so just in case + * we'll make pcibios_present() take a memory start parameter and store + * the array there. + */ + +static struct { + unsigned long address; + unsigned short segment; +} bios32_indirect = { 0, __KERNEL_CS }; + +/* + * Returns the entry point for the given service, NULL on error + */ + +static unsigned long bios32_service(unsigned long service) +{ + unsigned char return_code; /* %al */ + unsigned long address; /* %ebx */ + unsigned long length; /* %ecx */ + unsigned long entry; /* %edx */ + unsigned long flags; + + local_irq_save(flags); + __asm__("lcall *(%%edi); cld" + : "=a" (return_code), + "=b" (address), + "=c" (length), + "=d" (entry) + : "0" (service), + "1" (0), + "D" (&bios32_indirect)); + local_irq_restore(flags); + + switch (return_code) { + case 0: + return address + entry; + case 0x80: /* Not present */ + printk(KERN_WARNING "bios32_service(0x%lx): not present\n", service); + return 0; + default: /* Shouldn't happen */ + printk(KERN_WARNING "bios32_service(0x%lx): returned 0x%x -- BIOS bug!\n", + service, return_code); + return 0; + } +} + +static struct { + unsigned long address; + unsigned short segment; +} pci_indirect = { 0, __KERNEL_CS }; + +static int pci_bios_present; + +static int __devinit check_pcibios(void) +{ + u32 signature, eax, ebx, ecx; + u8 status, major_ver, minor_ver, hw_mech; + unsigned long flags, pcibios_entry; + + if ((pcibios_entry = bios32_service(PCI_SERVICE))) { + pci_indirect.address = pcibios_entry + PAGE_OFFSET; + + local_irq_save(flags); + __asm__( + "lcall *(%%edi); cld\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" + : "=d" (signature), + "=a" (eax), + "=b" (ebx), + "=c" (ecx) + : "1" (PCIBIOS_PCI_BIOS_PRESENT), + "D" (&pci_indirect) + : "memory"); + local_irq_restore(flags); + + status = (eax >> 8) & 0xff; + hw_mech = eax & 0xff; + major_ver = (ebx >> 8) & 0xff; + minor_ver = ebx & 0xff; + if (pcibios_last_bus < 0) + pcibios_last_bus = ecx & 0xff; + DBG("PCI: BIOS probe returned s=%02x hw=%02x ver=%02x.%02x l=%02x\n", + status, hw_mech, major_ver, minor_ver, pcibios_last_bus); + if (status || signature != PCI_SIGNATURE) { + printk (KERN_ERR "PCI: BIOS BUG #%x[%08x] found\n", + status, signature); + return 0; + } + printk(KERN_INFO "PCI: PCI BIOS revision %x.%02x entry at 0x%lx, last bus=%d\n", + major_ver, minor_ver, pcibios_entry, pcibios_last_bus); +#ifdef CONFIG_PCI_DIRECT + if (!(hw_mech & PCIBIOS_HW_TYPE1)) + pci_probe &= ~PCI_PROBE_CONF1; + if (!(hw_mech & PCIBIOS_HW_TYPE2)) + pci_probe &= ~PCI_PROBE_CONF2; +#endif + return 1; + } + return 0; +} + +static int __devinit pci_bios_find_device (unsigned short vendor, unsigned short device_id, + unsigned short index, unsigned char *bus, unsigned char *device_fn) +{ + unsigned short bx; + unsigned short ret; + + __asm__("lcall *(%%edi); cld\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" + : "=b" (bx), + "=a" (ret) + : "1" (PCIBIOS_FIND_PCI_DEVICE), + "c" (device_id), + "d" (vendor), + "S" ((int) index), + "D" (&pci_indirect)); + *bus = (bx >> 8) & 0xff; + *device_fn = bx & 0xff; + return (int) (ret & 0xff00) >> 8; +} + +static int pci_bios_read (int seg, int bus, int devfn, int reg, int len, u32 *value) +{ + unsigned long result = 0; + unsigned long flags; + unsigned long bx = (bus << 8) | devfn; + + if (!value || (bus > 255) || (devfn > 255) || (reg > 255)) + return -EINVAL; + + spin_lock_irqsave(&pci_config_lock, flags); + + switch (len) { + case 1: + __asm__("lcall *(%%esi); cld\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" + : "=c" (*value), + "=a" (result) + : "1" (PCIBIOS_READ_CONFIG_BYTE), + "b" (bx), + "D" ((long)reg), + "S" (&pci_indirect)); + break; + case 2: + __asm__("lcall *(%%esi); cld\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" + : "=c" (*value), + "=a" (result) + : "1" (PCIBIOS_READ_CONFIG_WORD), + "b" (bx), + "D" ((long)reg), + "S" (&pci_indirect)); + break; + case 4: + __asm__("lcall *(%%esi); cld\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" + : "=c" (*value), + "=a" (result) + : "1" (PCIBIOS_READ_CONFIG_DWORD), + "b" (bx), + "D" ((long)reg), + "S" (&pci_indirect)); + break; + } + + spin_unlock_irqrestore(&pci_config_lock, flags); + + return (int)((result & 0xff00) >> 8); +} + +static int pci_bios_write (int seg, int bus, int devfn, int reg, int len, u32 value) +{ + unsigned long result = 0; + unsigned long flags; + unsigned long bx = (bus << 8) | devfn; + + if ((bus > 255) || (devfn > 255) || (reg > 255)) + return -EINVAL; + + spin_lock_irqsave(&pci_config_lock, flags); + + switch (len) { + case 1: + __asm__("lcall *(%%esi); cld\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" + : "=a" (result) + : "0" (PCIBIOS_WRITE_CONFIG_BYTE), + "c" (value), + "b" (bx), + "D" ((long)reg), + "S" (&pci_indirect)); + break; + case 2: + __asm__("lcall *(%%esi); cld\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" + : "=a" (result) + : "0" (PCIBIOS_WRITE_CONFIG_WORD), + "c" (value), + "b" (bx), + "D" ((long)reg), + "S" (&pci_indirect)); + break; + case 4: + __asm__("lcall *(%%esi); cld\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" + : "=a" (result) + : "0" (PCIBIOS_WRITE_CONFIG_DWORD), + "c" (value), + "b" (bx), + "D" ((long)reg), + "S" (&pci_indirect)); + break; + } + + spin_unlock_irqrestore(&pci_config_lock, flags); + + return (int)((result & 0xff00) >> 8); +} + + +/* + * Function table for BIOS32 access + */ + +static struct pci_raw_ops pci_bios_access = { + .read = pci_bios_read, + .write = pci_bios_write +}; + +/* + * Try to find PCI BIOS. + */ + +static struct pci_raw_ops * __devinit pci_find_bios(void) +{ + union bios32 *check; + unsigned char sum; + int i, length; + + /* + * Follow the standard procedure for locating the BIOS32 Service + * directory by scanning the permissible address range from + * 0xe0000 through 0xfffff for a valid BIOS32 structure. + */ + + for (check = (union bios32 *) __va(0xe0000); + check <= (union bios32 *) __va(0xffff0); + ++check) { + if (check->fields.signature != BIOS32_SIGNATURE) + continue; + length = check->fields.length * 16; + if (!length) + continue; + sum = 0; + for (i = 0; i < length ; ++i) + sum += check->chars[i]; + if (sum != 0) + continue; + if (check->fields.revision != 0) { + printk("PCI: unsupported BIOS32 revision %d at 0x%p\n", + check->fields.revision, check); + continue; + } + DBG("PCI: BIOS32 Service Directory structure at 0x%p\n", check); + if (check->fields.entry >= 0x100000) { + printk("PCI: BIOS32 entry (0x%p) in high memory, cannot use.\n", check); + return NULL; + } else { + unsigned long bios32_entry = check->fields.entry; + DBG("PCI: BIOS32 Service Directory entry at 0x%lx\n", bios32_entry); + bios32_indirect.address = bios32_entry + PAGE_OFFSET; + if (check_pcibios()) + return &pci_bios_access; + } + break; /* Hopefully more than one BIOS32 cannot happen... */ + } + + return NULL; +} + +/* + * Sort the device list according to PCI BIOS. Nasty hack, but since some + * fool forgot to define the `correct' device order in the PCI BIOS specs + * and we want to be (possibly bug-to-bug ;-]) compatible with older kernels + * which used BIOS ordering, we are bound to do this... + */ + +void __devinit pcibios_sort(void) +{ + LIST_HEAD(sorted_devices); + struct list_head *ln; + struct pci_dev *dev, *d; + int idx, found; + unsigned char bus, devfn; + + DBG("PCI: Sorting device list...\n"); + while (!list_empty(&pci_devices)) { + ln = pci_devices.next; + dev = pci_dev_g(ln); + idx = found = 0; + while (pci_bios_find_device(dev->vendor, dev->device, idx, &bus, &devfn) == PCIBIOS_SUCCESSFUL) { + idx++; + list_for_each(ln, &pci_devices) { + d = pci_dev_g(ln); + if (d->bus->number == bus && d->devfn == devfn) { + list_del(&d->global_list); + list_add_tail(&d->global_list, &sorted_devices); + if (d == dev) + found = 1; + break; + } + } + if (ln == &pci_devices) { + printk(KERN_WARNING "PCI: BIOS reporting unknown device %02x:%02x\n", bus, devfn); + /* + * We must not continue scanning as several buggy BIOSes + * return garbage after the last device. Grr. + */ + break; + } + } + if (!found) { + printk(KERN_WARNING "PCI: Device %02x:%02x not found by BIOS\n", + dev->bus->number, dev->devfn); + list_del(&dev->global_list); + list_add_tail(&dev->global_list, &sorted_devices); + } + } + list_splice(&sorted_devices, &pci_devices); +} + +/* + * BIOS Functions for IRQ Routing + */ + +struct irq_routing_options { + u16 size; + struct irq_info *table; + u16 segment; +} __attribute__((packed)); + +struct irq_routing_table * __devinit pcibios_get_irq_routing_table(void) +{ + struct irq_routing_options opt; + struct irq_routing_table *rt = NULL; + int ret, map; + unsigned long page; + + if (!pci_bios_present) + return NULL; + page = __get_free_page(GFP_KERNEL); + if (!page) + return NULL; + opt.table = (struct irq_info *) page; + opt.size = PAGE_SIZE; + opt.segment = __KERNEL_DS; + + DBG("PCI: Fetching IRQ routing table... "); + __asm__("push %%es\n\t" + "push %%ds\n\t" + "pop %%es\n\t" + "lcall *(%%esi); cld\n\t" + "pop %%es\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" + : "=a" (ret), + "=b" (map), + "=m" (opt) + : "0" (PCIBIOS_GET_ROUTING_OPTIONS), + "1" (0), + "D" ((long) &opt), + "S" (&pci_indirect), + "m" (opt) + : "memory"); + DBG("OK ret=%d, size=%d, map=%x\n", ret, opt.size, map); + if (ret & 0xff00) + printk(KERN_ERR "PCI: Error %02x when fetching IRQ routing table.\n", (ret >> 8) & 0xff); + else if (opt.size) { + rt = kmalloc(sizeof(struct irq_routing_table) + opt.size, GFP_KERNEL); + if (rt) { + memset(rt, 0, sizeof(struct irq_routing_table)); + rt->size = opt.size + sizeof(struct irq_routing_table); + rt->exclusive_irqs = map; + memcpy(rt->slots, (void *) page, opt.size); + printk(KERN_INFO "PCI: Using BIOS Interrupt Routing Table\n"); + } + } + free_page(page); + return rt; +} + + +int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq) +{ + int ret; + + __asm__("lcall *(%%esi); cld\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" + : "=a" (ret) + : "0" (PCIBIOS_SET_PCI_HW_INT), + "b" ((dev->bus->number << 8) | dev->devfn), + "c" ((irq << 8) | (pin + 10)), + "S" (&pci_indirect)); + return !(ret & 0xff00); +} + +static int __init pci_pcbios_init(void) +{ + if ((pci_probe & PCI_PROBE_BIOS) + && ((raw_pci_ops = pci_find_bios()))) { + pci_probe |= PCI_BIOS_SORT; + pci_bios_present = 1; + } + return 0; +} + +arch_initcall(pci_pcbios_init); diff --git a/src/wraith/pci/pci.h b/src/wraith/pci/pci.h new file mode 100644 index 000000000..13684e1cc --- /dev/null +++ b/src/wraith/pci/pci.h @@ -0,0 +1,76 @@ +/* + * Low-Level PCI Access for i386 machines. + * + * (c) 1999 Martin Mares + */ + +#undef DEBUG + +#ifdef DEBUG +#define DBG(x...) printk(x) +#else +#define DBG(x...) +#endif + +#define PCI_PROBE_BIOS 0x0001 +#define PCI_PROBE_CONF1 0x0002 +#define PCI_PROBE_CONF2 0x0004 +#define PCI_PROBE_MMCONF 0x0008 +#define PCI_PROBE_MASK 0x000f + +#define PCI_NO_SORT 0x0100 +#define PCI_BIOS_SORT 0x0200 +#define PCI_NO_CHECKS 0x0400 +#define PCI_USE_PIRQ_MASK 0x0800 +#define PCI_ASSIGN_ROMS 0x1000 +#define PCI_BIOS_IRQ_SCAN 0x2000 +#define PCI_ASSIGN_ALL_BUSSES 0x4000 + +extern unsigned int pci_probe; + +/* pci-i386.c */ + +extern unsigned int pcibios_max_latency; + +void pcibios_resource_survey(void); +int pcibios_enable_resources(struct pci_dev *, int); + +/* pci-pc.c */ + +extern int pcibios_last_bus; +extern struct pci_bus *pci_root_bus; +extern struct pci_ops pci_root_ops; + +/* pci-irq.c */ + +struct irq_info { + u8 bus, devfn; /* Bus, device and function */ + struct { + u8 link; /* IRQ line ID, chipset dependent, 0=not routed */ + u16 bitmap; /* Available IRQs */ + } __attribute__((packed)) irq[4]; + u8 slot; /* Slot number, 0=onboard */ + u8 rfu; +} __attribute__((packed)); + +struct irq_routing_table { + u32 signature; /* PIRQ_SIGNATURE should be here */ + u16 version; /* PIRQ_VERSION */ + u16 size; /* Table size in bytes */ + u8 rtr_bus, rtr_devfn; /* Where the interrupt router lies */ + u16 exclusive_irqs; /* IRQs devoted exclusively to PCI usage */ + u16 rtr_vendor, rtr_device; /* Vendor and device ID of interrupt router */ + u32 miniport_data; /* Crap */ + u8 rfu[11]; + u8 checksum; /* Modulo 256 checksum must give zero */ + struct irq_info slots[0]; +} __attribute__((packed)); + +extern unsigned int pcibios_irq_mask; + +extern int pcibios_scanned; +extern spinlock_t pci_config_lock; + +int pirq_enable_irq(struct pci_dev *dev); + +extern int (*pcibios_enable_irq)(struct pci_dev *dev); diff --git a/src/wraith/pci/visws.c b/src/wraith/pci/visws.c new file mode 100644 index 000000000..6a9248784 --- /dev/null +++ b/src/wraith/pci/visws.c @@ -0,0 +1,110 @@ +/* + * Low-Level PCI Support for SGI Visual Workstation + * + * (c) 1999--2000 Martin Mares + */ + +#include +#include +#include +#include + +#include "cobalt.h" +#include "lithium.h" + +#include "pci.h" + + +extern struct pci_raw_ops pci_direct_conf1; + +static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; } + +int (*pcibios_enable_irq)(struct pci_dev *dev) = &pci_visws_enable_irq; + +void __init pcibios_penalize_isa_irq(int irq) {} + + +unsigned int pci_bus0, pci_bus1; + +static inline u8 bridge_swizzle(u8 pin, u8 slot) +{ + return (((pin - 1) + slot) % 4) + 1; +} + +static u8 __init visws_swizzle(struct pci_dev *dev, u8 *pinp) +{ + u8 pin = *pinp; + + while (dev->bus->self) { /* Move up the chain of bridges. */ + pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); + dev = dev->bus->self; + } + *pinp = pin; + + return PCI_SLOT(dev->devfn); +} + +static int __init visws_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +{ + int irq, bus = dev->bus->number; + + pin--; + + /* Nothing useful at PIIX4 pin 1 */ + if (bus == pci_bus0 && slot == 4 && pin == 0) + return -1; + + /* PIIX4 USB is on Bus 0, Slot 4, Line 3 */ + if (bus == pci_bus0 && slot == 4 && pin == 3) { + irq = CO_IRQ(CO_APIC_PIIX4_USB); + goto out; + } + + /* First pin spread down 1 APIC entry per slot */ + if (pin == 0) { + irq = CO_IRQ((bus == pci_bus0 ? CO_APIC_PCIB_BASE0 : + CO_APIC_PCIA_BASE0) + slot); + goto out; + } + + /* lines 1,2,3 from any slot is shared in this twirly pattern */ + if (bus == pci_bus1) { + /* lines 1-3 from devices 0 1 rotate over 2 apic entries */ + irq = CO_IRQ(CO_APIC_PCIA_BASE123 + ((slot + (pin - 1)) % 2)); + } else { /* bus == pci_bus0 */ + /* lines 1-3 from devices 0-3 rotate over 3 apic entries */ + if (slot == 0) + slot = 3; /* same pattern */ + irq = CO_IRQ(CO_APIC_PCIA_BASE123 + ((3 - slot) + (pin - 1) % 3)); + } +out: + printk(KERN_DEBUG "PCI: Bus %d Slot %d Line %d -> IRQ %d\n", bus, slot, pin, irq); + return irq; +} + +void __init pcibios_update_irq(struct pci_dev *dev, int irq) +{ + pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); +} + +static int __init pcibios_init(void) +{ + /* The VISWS supports configuration access type 1 only */ + pci_probe = (pci_probe | PCI_PROBE_CONF1) & + ~(PCI_PROBE_BIOS | PCI_PROBE_CONF2); + + pci_bus0 = li_pcib_read16(LI_PCI_BUSNUM) & 0xff; + pci_bus1 = li_pcia_read16(LI_PCI_BUSNUM) & 0xff; + + printk(KERN_INFO "PCI: Lithium bridge A bus: %u, " + "bridge B (PIIX4) bus: %u\n", pci_bus1, pci_bus0); + + raw_pci_ops = &pci_direct_conf1; + pci_scan_bus(pci_bus0, &pci_root_ops, NULL); + pci_scan_bus(pci_bus1, &pci_root_ops, NULL); + pci_fixup_irqs(visws_swizzle, visws_map_irq); + pcibios_resource_survey(); + return 0; +} + +subsys_initcall(pcibios_init); diff --git a/src/wraith/power/cpu.c b/src/wraith/power/cpu.c new file mode 100644 index 000000000..adb50ba2a --- /dev/null +++ b/src/wraith/power/cpu.c @@ -0,0 +1,153 @@ +/* + * Suspend support specific for i386. + * + * Distribute under GPLv2 + * + * Copyright (c) 2002 Pavel Machek + * Copyright (c) 2001 Patrick Mochel + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static struct saved_context saved_context; + +unsigned long saved_context_eax, saved_context_ebx; +unsigned long saved_context_ecx, saved_context_edx; +unsigned long saved_context_esp, saved_context_ebp; +unsigned long saved_context_esi, saved_context_edi; +unsigned long saved_context_eflags; + +extern void enable_sep_cpu(void *); + +void __save_processor_state(struct saved_context *ctxt) +{ + kernel_fpu_begin(); + + /* + * descriptor tables + */ + asm volatile ("sgdt %0" : "=m" (ctxt->gdt_limit)); + asm volatile ("sidt %0" : "=m" (ctxt->idt_limit)); + asm volatile ("sldt %0" : "=m" (ctxt->ldt)); + asm volatile ("str %0" : "=m" (ctxt->tr)); + + /* + * segment registers + */ + asm volatile ("movw %%es, %0" : "=m" (ctxt->es)); + asm volatile ("movw %%fs, %0" : "=m" (ctxt->fs)); + asm volatile ("movw %%gs, %0" : "=m" (ctxt->gs)); + asm volatile ("movw %%ss, %0" : "=m" (ctxt->ss)); + + /* + * control registers + */ + asm volatile ("movl %%cr0, %0" : "=r" (ctxt->cr0)); + asm volatile ("movl %%cr2, %0" : "=r" (ctxt->cr2)); + asm volatile ("movl %%cr3, %0" : "=r" (ctxt->cr3)); + asm volatile ("movl %%cr4, %0" : "=r" (ctxt->cr4)); +} + +void save_processor_state(void) +{ + __save_processor_state(&saved_context); +} + +static void +do_fpu_end(void) +{ + /* restore FPU regs if necessary */ + /* Do it out of line so that gcc does not move cr0 load to some stupid place */ + kernel_fpu_end(); + mxcsr_feature_mask_init(); +} + + +static void fix_processor_context(void) +{ + int cpu = smp_processor_id(); + struct tss_struct * t = &per_cpu(init_tss, cpu); + + set_tss_desc(cpu,t); /* This just modifies memory; should not be necessary. But... This is necessary, because 386 hardware has concept of busy TSS or some similar stupidity. */ + per_cpu(cpu_gdt_table, cpu)[GDT_ENTRY_TSS].b &= 0xfffffdff; + + load_TR_desc(); /* This does ltr */ + load_LDT(¤t->active_mm->context); /* This does lldt */ + + /* + * Now maybe reload the debug registers + */ + if (current->thread.debugreg[7]){ + loaddebug(¤t->thread, 0); + loaddebug(¤t->thread, 1); + loaddebug(¤t->thread, 2); + loaddebug(¤t->thread, 3); + /* no 4 and 5 */ + loaddebug(¤t->thread, 6); + loaddebug(¤t->thread, 7); + } + +} + +void __restore_processor_state(struct saved_context *ctxt) +{ + + /* + * control registers + */ + asm volatile ("movl %0, %%cr4" :: "r" (ctxt->cr4)); + asm volatile ("movl %0, %%cr3" :: "r" (ctxt->cr3)); + asm volatile ("movl %0, %%cr2" :: "r" (ctxt->cr2)); + asm volatile ("movl %0, %%cr0" :: "r" (ctxt->cr0)); + + /* + * segment registers + */ + asm volatile ("movw %0, %%es" :: "r" (ctxt->es)); + asm volatile ("movw %0, %%fs" :: "r" (ctxt->fs)); + asm volatile ("movw %0, %%gs" :: "r" (ctxt->gs)); + asm volatile ("movw %0, %%ss" :: "r" (ctxt->ss)); + + /* + * now restore the descriptor tables to their proper values + * ltr is done i fix_processor_context(). + */ + asm volatile ("lgdt %0" :: "m" (ctxt->gdt_limit)); + asm volatile ("lidt %0" :: "m" (ctxt->idt_limit)); + asm volatile ("lldt %0" :: "m" (ctxt->ldt)); + + /* + * sysenter MSRs + */ + if (boot_cpu_has(X86_FEATURE_SEP)) + enable_sep_cpu(NULL); + + fix_processor_context(); + do_fpu_end(); +} + +void restore_processor_state(void) +{ + __restore_processor_state(&saved_context); +} + +/* Needed by apm.c */ +EXPORT_SYMBOL(save_processor_state); +EXPORT_SYMBOL(restore_processor_state); diff --git a/src/wraith/power/swsusp.S b/src/wraith/power/swsusp.S new file mode 100644 index 000000000..6e6335f89 --- /dev/null +++ b/src/wraith/power/swsusp.S @@ -0,0 +1,61 @@ +.text + +/* Originally gcc generated, modified by hand + * + * This may not use any stack, nor any variable that is not "NoSave": + * + * Its rewriting one kernel image with another. What is stack in "old" + * image could very well be data page in "new" image, and overwriting + * your own stack under you is bad idea. + */ + +#include +#include +#include + + .text + +ENTRY(swsusp_arch_suspend) + + movl %esp, saved_context_esp + movl %ebx, saved_context_ebx + movl %ebp, saved_context_ebp + movl %esi, saved_context_esi + movl %edi, saved_context_edi + pushfl ; popl saved_context_eflags + + call swsusp_save + ret + +ENTRY(swsusp_arch_resume) + movl $swsusp_pg_dir-__PAGE_OFFSET,%ecx + movl %ecx,%cr3 + + movl pagedir_nosave, %ebx + xorl %eax, %eax + xorl %edx, %edx + .p2align 4,,7 + +copy_loop: + movl 4(%ebx,%edx),%edi + movl (%ebx,%edx),%esi + + movl $1024, %ecx + rep + movsl + + incl %eax + addl $16, %edx + cmpl nr_copy_pages,%eax + jb copy_loop + .p2align 4,,7 + + movl saved_context_esp, %esp + movl saved_context_ebp, %ebp + movl saved_context_ebx, %ebx + movl saved_context_esi, %esi + movl saved_context_edi, %edi + + pushl saved_context_eflags ; popfl + call swsusp_restore + ret diff --git a/src/wraith/scripts/README b/src/wraith/scripts/README new file mode 100644 index 000000000..02faabe06 --- /dev/null +++ b/src/wraith/scripts/README @@ -0,0 +1,63 @@ +The scripts directory holds tools for use in building, generating, testing, +and maintaining the Tor source code. It is mainly for use by developers. + +Code maintenance scripts +------------------------ + +maint/checkLogs.pl -- Verify that Tor log statements are unique. + +maint/check_config_macros.pl -- Look for autoconf tests whose results are +never used. + +maint/checkOptionDocs.pl -- Make sure that Tor options are documented in the +manpage, and that the manpage only documents real Tor options. + +maint/checkSpaces.pl -- Style checker for the Tor source code. Mainly checks +whitespace. + +maint/findMergedChanges.pl -- Find a set of changes/* files that have been +merged into an upstream version. + +maint/format_changelog.py -- Flow the changelog into the proper format. + +maint/redox.py -- Find places that should have DOCDOC comments to indicate a +need for doxygen comments, and put those comments there. + +maint/updateVersions.pl -- Update the version number in the .nsi and windows +orconfig.h files. + + +Testing scripts +--------------- + +test/cov-blame -- Mash up the results of gcov with git blame. Mainly useful +to find out who has been writing untested code. + +test/cov-diff -- Compare two directories of gcov files to identify changed +lines without coverage. + +test/coverage -- Generates a directory full of gcov files. You need to use +this script instead of calling gcov directly because of our confusingly named +object files. + +test/scan-build.sh -- Example script for invoking clang's scan-build +static analysis tools. + + +Code generation scripts +----------------------- + +codegen/gen_linux_syscalls.pl -- Generate a table mapping linux syscall +numbers to their names. + +codegen/gen_server_ciphers.py -- Generate a sorted list of TLS ciphersuites +for servers to choose from. + +codegen/get_mozilla_ciphers.py -- Generate a list of TLS ciphersuites for +clients to use in order to look like Firefox. + +Code transformation scripts +--------------------------- + +coccinelle/calloc.cocci -- Transform code to replace variants of +malloc(a*b) with calloc(a,b) diff --git a/src/wraith/scripts/coccinelle/calloc.cocci b/src/wraith/scripts/coccinelle/calloc.cocci new file mode 100644 index 000000000..fbda88e53 --- /dev/null +++ b/src/wraith/scripts/coccinelle/calloc.cocci @@ -0,0 +1,23 @@ +// Use calloc or realloc as appropriate instead of multiply-and-alloc + +@malloc_to_calloc@ +identifier f =~ "(tor_malloc|tor_malloc_zero)"; +expression a; +constant b; +@@ +- f(a * b) ++ tor_calloc(a, b) + +@calloc_arg_order@ +expression a; +type t; +@@ +- tor_calloc(sizeof(t), a) ++ tor_calloc(a, sizeof(t)) + +@realloc_to_reallocarray@ +expression a, b; +expression p; +@@ +- tor_realloc(p, a * b) ++ tor_reallocarray(p, a, b) diff --git a/src/wraith/scripts/coccinelle/ceil_div.cocci b/src/wraith/scripts/coccinelle/ceil_div.cocci new file mode 100644 index 000000000..00843e82c --- /dev/null +++ b/src/wraith/scripts/coccinelle/ceil_div.cocci @@ -0,0 +1,6 @@ +@@ +expression n, d; +@@ + +- (((n) + (d) - 1) / (d)) ++ CEIL_DIV(n, d) diff --git a/src/wraith/scripts/coccinelle/malloc_cast.cocci b/src/wraith/scripts/coccinelle/malloc_cast.cocci new file mode 100644 index 000000000..20321d4fd --- /dev/null +++ b/src/wraith/scripts/coccinelle/malloc_cast.cocci @@ -0,0 +1,38 @@ +@cast_malloc@ +expression e; +type T; +@@ +- (T *)tor_malloc(e) ++ tor_malloc(e) + +@cast_malloc_zero@ +expression e; +type T; +identifier func; +@@ +- (T *)tor_malloc_zero(e) ++ tor_malloc_zero(e) + +@cast_calloc@ +expression a, b; +type T; +identifier func; +@@ +- (T *)tor_calloc(a, b) ++ tor_calloc(a, b) + +@cast_realloc@ +expression e; +expression p; +type T; +@@ +- (T *)tor_realloc(p, e) ++ tor_realloc(p, e) + +@cast_reallocarray@ +expression a,b; +expression p; +type T; +@@ +- (T *)tor_reallocarray(p, a, b) ++ tor_reallocarray(p, a, b) diff --git a/src/wraith/scripts/coccinelle/test-operator-cleanup b/src/wraith/scripts/coccinelle/test-operator-cleanup new file mode 100644 index 000000000..e7822542a --- /dev/null +++ b/src/wraith/scripts/coccinelle/test-operator-cleanup @@ -0,0 +1,11 @@ +#!/usr/bin/perl -w -p -i + +next if m#^ */\*# or m#^ *\* #; + +s/<([,)])/OP_LT$1/; +s/(?<=[\s,])>([,)])/OP_GT$1/; +#s/>([,)])/OP_GT$1/; +s/==([,)])/OP_EQ$1/; +s/>=([,)])/OP_GE$1/; +s/<=([,)])/OP_LE$1/; +s/!=([,)])/OP_NE$1/; diff --git a/src/wraith/scripts/coccinelle/test_assert_int.cocci b/src/wraith/scripts/coccinelle/test_assert_int.cocci new file mode 100644 index 000000000..80e86b4f3 --- /dev/null +++ b/src/wraith/scripts/coccinelle/test_assert_int.cocci @@ -0,0 +1,49 @@ +@@ +int e; +constant c; +@@ + +( +- tt_assert(e == c) ++ tt_int_op(e, OP_EQ, c) +| +- tt_assert(e != c) ++ tt_int_op(e, OP_NE, c) +| +- tt_assert(e < c) ++ tt_int_op(e, OP_LT, c) +| +- tt_assert(e <= c) ++ tt_int_op(e, OP_LE, c) +| +- tt_assert(e > c) ++ tt_int_op(e, OP_GT, c) +| +- tt_assert(e >= c) ++ tt_int_op(e, OP_GE, c) +) + +@@ +unsigned int e; +constant c; +@@ + +( +- tt_assert(e == c) ++ tt_uint_op(e, OP_EQ, c) +| +- tt_assert(e != c) ++ tt_uint_op(e, OP_NE, c) +| +- tt_assert(e < c) ++ tt_uint_op(e, OP_LT, c) +| +- tt_assert(e <= c) ++ tt_uint_op(e, OP_LE, c) +| +- tt_assert(e > c) ++ tt_uint_op(e, OP_GT, c) +| +- tt_assert(e >= c) ++ tt_uint_op(e, OP_GE, c) +) diff --git a/src/wraith/scripts/coccinelle/test_assert_null.cocci b/src/wraith/scripts/coccinelle/test_assert_null.cocci new file mode 100644 index 000000000..3d66e1ee0 --- /dev/null +++ b/src/wraith/scripts/coccinelle/test_assert_null.cocci @@ -0,0 +1,11 @@ +@@ +expression * e; +@@ + +( +- tt_assert(e != NULL) ++ tt_ptr_op(e, OP_NE, NULL) +| +- tt_assert(e == NULL) ++ tt_ptr_op(e, OP_EQ, NULL) +) diff --git a/src/wraith/scripts/coccinelle/test_assert_zero.cocci b/src/wraith/scripts/coccinelle/test_assert_zero.cocci new file mode 100644 index 000000000..09feaa5fb --- /dev/null +++ b/src/wraith/scripts/coccinelle/test_assert_zero.cocci @@ -0,0 +1,5 @@ +@@ +@@ + +- tt_assert(0) ++ tt_abort() diff --git a/src/wraith/scripts/coccinelle/uncalloc.cocci b/src/wraith/scripts/coccinelle/uncalloc.cocci new file mode 100644 index 000000000..bf3f74165 --- /dev/null +++ b/src/wraith/scripts/coccinelle/uncalloc.cocci @@ -0,0 +1,13 @@ + +@@ +expression a; +@@ +- tor_calloc(1, a) ++ tor_malloc_zero(a) + +@@ +expression a; +@@ +- tor_calloc(a, 1) ++ tor_malloc_zero(a) + diff --git a/src/wraith/scripts/codegen/fuzzing_include_am.py b/src/wraith/scripts/codegen/fuzzing_include_am.py new file mode 100644 index 000000000..fda57d2ae --- /dev/null +++ b/src/wraith/scripts/codegen/fuzzing_include_am.py @@ -0,0 +1,160 @@ +#!/usr/bin/python + +FUZZERS = """ + consensus + descriptor + diff + diff-apply + extrainfo + hsdescv2 + hsdescv3 + http + http-connect + iptsv2 + microdesc + vrs +""" + + +PREAMBLE = r""" +FUZZING_CPPFLAGS = \ + $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) +FUZZING_CFLAGS = \ + $(AM_CFLAGS) $(TEST_CFLAGS) +FUZZING_LDFLAG = \ + @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@ +FUZZING_LIBS = \ + src/or/libtor-testing.a \ + src/common/libor-crypto-testing.a \ + $(LIBKECCAK_TINY) \ + $(LIBDONNA) \ + src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + src/common/libor-event-testing.a \ + src/trunnel/libor-trunnel-testing.a \ + $(rust_ldadd) \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ + @TOR_LIBEVENT_LIBS@ \ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ + @CURVE25519_LIBS@ \ + @TOR_SYSTEMD_LIBS@ \ + @TOR_LZMA_LIBS@ \ + @TOR_ZSTD_LIBS@ + +oss-fuzz-prereqs: \ + src/or/libtor-testing.a \ + src/common/libor-crypto-testing.a \ + $(LIBKECCAK_TINY) \ + $(LIBDONNA) \ + src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + src/common/libor-event-testing.a \ + src/trunnel/libor-trunnel-testing.a + +noinst_HEADERS += \ + src/test/fuzz/fuzzing.h + +LIBFUZZER = -lFuzzer +LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ +LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS) +LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG) +LIBFUZZER_LIBS = $(FUZZING_LIBS) $(LIBFUZZER) -lstdc++ + +LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ +LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS) +""" + +POSTAMBLE = r""" +noinst_PROGRAMS += $(FUZZERS) $(LIBFUZZER_FUZZERS) +noinst_LIBRARIES += $(OSS_FUZZ_FUZZERS) +oss-fuzz-fuzzers: oss-fuzz-prereqs $(OSS_FUZZ_FUZZERS) +fuzzers: $(FUZZERS) $(LIBFUZZER_FUZZERS) + +test-fuzz-corpora: $(FUZZERS) + $(top_srcdir)/src/test/fuzz_static_testcases.sh +""" + +########### No user serviceable parts will follow. + +PREAMBLE = PREAMBLE.strip() +POSTAMBLE = POSTAMBLE.strip() # If I use it, it's a word! +FUZZERS = FUZZERS.split() +FUZZERS.sort() + +WARNING = """ +# This file was generated by fuzzing_include_am.py; do not hand-edit unless +# you enjoy having your changes erased. +""".strip() + +print(WARNING) + +print(PREAMBLE) + +print("\n# ===== AFL fuzzers") + +def get_id_name(s): + return s.replace("-", "_") + +for fuzzer in FUZZERS: + idname = get_id_name(fuzzer) + print("""\ +src_test_fuzz_fuzz_{name}_SOURCES = \\ + src/test/fuzz/fuzzing_common.c \\ + src/test/fuzz/fuzz_{name}.c +src_test_fuzz_fuzz_{name}_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_{name}_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_{name}_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_{name}_LDADD = $(FUZZING_LIBS) +""".format(name=idname)) + +print("FUZZERS = \\") +print(" \\\n".join("\tsrc/test/fuzz/fuzz-{name}".format(name=fuzzer) + for fuzzer in FUZZERS)) + +print("\n# ===== libfuzzer") +print("\nif LIBFUZZER_ENABLED") + +for fuzzer in FUZZERS: + idname = get_id_name(fuzzer) + print("""\ +src_test_fuzz_lf_fuzz_{name}_SOURCES = \\ + $(src_test_fuzz_fuzz_{name}_SOURCES) +src_test_fuzz_lf_fuzz_{name}_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_{name}_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_{name}_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_{name}_LDADD = $(LIBFUZZER_LIBS) +""".format(name=idname)) + +print("LIBFUZZER_FUZZERS = \\") +print(" \\\n".join("\tsrc/test/fuzz/lf-fuzz-{name}".format(name=fuzzer) + for fuzzer in FUZZERS)) + +print(""" +else +LIBFUZZER_FUZZERS = +endif""") + +print("\n# ===== oss-fuzz\n") +print("if OSS_FUZZ_ENABLED") + +for fuzzer in FUZZERS: + idname = get_id_name(fuzzer) + print("""\ +src_test_fuzz_liboss_fuzz_{name}_a_SOURCES = \\ + $(src_test_fuzz_fuzz_{name}_SOURCES) +src_test_fuzz_liboss_fuzz_{name}_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_{name}_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) +""".format(name=idname)) + +print("OSS_FUZZ_FUZZERS = \\") +print(" \\\n".join("\tsrc/test/fuzz/liboss-fuzz-{name}.a".format(name=fuzzer) + for fuzzer in FUZZERS)) + +print(""" +else +OSS_FUZZ_FUZZERS = +endif""") + +print("") + +print(POSTAMBLE) diff --git a/src/wraith/scripts/codegen/gen_linux_syscalls.pl b/src/wraith/scripts/codegen/gen_linux_syscalls.pl new file mode 100644 index 000000000..f985bad6c --- /dev/null +++ b/src/wraith/scripts/codegen/gen_linux_syscalls.pl @@ -0,0 +1,37 @@ +#!/usr/bin/perl -w + +use strict; +my %syscalls = (); + +while (<>) { + if (/^#define (__NR_\w+) /) { + $syscalls{$1} = 1; + } +} + +print <>sys.stderr, "Syntax: get_mozilla_ciphers.py " + sys.exit(1) + +ff_root = sys.argv[1] +ossl_root = sys.argv[2] + +def ff(s): + return os.path.join(ff_root, s) +def ossl(s): + return os.path.join(ossl_root, s) + +##### +# Read the cpp file to understand what Ciphers map to what name : +# Make "ciphers" a map from name used in the javascript to a cipher macro name +fileA = open(ff('security/manager/ssl/nsNSSComponent.cpp'),'r') + +# The input format is a file containing exactly one section of the form: +# static CipherPref CipherPrefs[] = { +# {"name", MACRO_NAME}, // comment +# ... +# {NULL, 0} +# } + +inCipherSection = False +cipherLines = [] +for line in fileA: + if line.startswith('static const CipherPref sCipherPrefs[]'): + # Get the starting boundary of the Cipher Preferences + inCipherSection = True + elif inCipherSection: + line = line.strip() + if line.startswith('{ nullptr, 0}'): + # At the ending boundary of the Cipher Prefs + break + else: + cipherLines.append(line) +fileA.close() + +# Parse the lines and put them into a dict +ciphers = {} +cipher_pref = {} +key_pending = None +for line in cipherLines: + m = re.search(r'^{\s*\"([^\"]+)\",\s*(\S+)\s*(?:,\s*(true|false))?\s*}', line) + if m: + assert not key_pending + key,value,enabled = m.groups() + if enabled == 'true': + ciphers[key] = value + cipher_pref[value] = key + continue + m = re.search(r'^{\s*\"([^\"]+)\",', line) + if m: + assert not key_pending + key_pending = m.group(1) + continue + m = re.search(r'^\s*(\S+)(?:,\s*(true|false))+\s*}', line) + if m: + assert key_pending + key = key_pending + value,enabled = m.groups() + key_pending = None + if enabled == 'true': + ciphers[key] = value + cipher_pref[value] = key + +#### +# Now find the correct order for the ciphers +fileC = open(ff('security/nss/lib/ssl/ssl3con.c'), 'r') +firefox_ciphers = [] +inEnum=False +for line in fileC: + if not inEnum: + if "ssl3CipherSuiteCfg cipherSuites[" in line: + inEnum = True + continue + + if line.startswith("};"): + break + + m = re.match(r'^\s*\{\s*([A-Z_0-9]+),', line) + if m: + firefox_ciphers.append(m.group(1)) + +fileC.close() + +##### +# Read the JS file to understand what ciphers are enabled. The format is +# pref("name", true/false); +# Build a map enabled_ciphers from javascript name to "true" or "false", +# and an (unordered!) list of the macro names for those ciphers that are +# enabled. +fileB = open(ff('netwerk/base/security-prefs.js'), 'r') + +enabled_ciphers = {} +for line in fileB: + m = re.match(r'pref\(\"([^\"]+)\"\s*,\s*(\S*)\s*\)', line) + if not m: + continue + key, val = m.groups() + if key.startswith("security.ssl3"): + enabled_ciphers[key] = val +fileB.close() + +used_ciphers = [] +for k, v in enabled_ciphers.items(): + if v == "true": + used_ciphers.append(ciphers[k]) + +#oSSLinclude = ('/usr/include/openssl/ssl3.h', '/usr/include/openssl/ssl.h', +# '/usr/include/openssl/ssl2.h', '/usr/include/openssl/ssl23.h', +# '/usr/include/openssl/tls1.h') +oSSLinclude = ['ssl3.h', 'ssl.h' + 'ssl2.h', 'ssl23.h', + 'tls1.h'] + +##### +# This reads the hex code for the ciphers that are used by firefox. +# sslProtoD is set to a map from macro name to macro value in sslproto.h; +# cipher_codes is set to an (unordered!) list of these hex values. +sslProto = open(ff('security/nss/lib/ssl/sslproto.h'), 'r') +sslProtoD = {} + +for line in sslProto: + m = re.match('#define\s+(\S+)\s+(\S+)', line) + if m: + key, value = m.groups() + sslProtoD[key] = value +sslProto.close() + +cipher_codes = [] +for x in used_ciphers: + cipher_codes.append(sslProtoD[x].lower()) + +#### +# Now read through all the openssl include files, and try to find the openssl +# macro names for those files. +openssl_macro_by_hex = {} +all_openssl_macros = {} +for fl in oSSLinclude: + fname = ossl("include/openssl/"+fl) + if not os.path.exists(fname): + continue + fp = open(fname, 'r') + for line in fp.readlines(): + m = re.match('# *define\s+(\S+)\s+(\S+)', line) + if m: + value,key = m.groups() + if key.startswith('0x') and "_CK_" in value: + key = key.replace('0x0300','0x').lower() + #print "%s %s" % (key, value) + openssl_macro_by_hex[key] = value + all_openssl_macros[value]=key + fp.close() + +# Now generate the output. +print """\ +/* This is an include file used to define the list of ciphers clients should + * advertise. Before including it, you should define the CIPHER and XCIPHER + * macros. + * + * This file was automatically generated by get_mozilla_ciphers.py. + */""" +# Go in order by the order in CipherPrefs +for firefox_macro in firefox_ciphers: + + try: + js_cipher_name = cipher_pref[firefox_macro] + except KeyError: + # This one has no javascript preference. + continue + + # The cipher needs to be enabled in security-prefs.js + if enabled_ciphers.get(js_cipher_name, 'false') != 'true': + continue + + hexval = sslProtoD[firefox_macro].lower() + + try: + openssl_macro = openssl_macro_by_hex[hexval.lower()] + openssl_macro = openssl_macro.replace("_CK_", "_TXT_") + if openssl_macro not in all_openssl_macros: + raise KeyError() + format = {'hex':hexval, 'macro':openssl_macro, 'note':""} + except KeyError: + # openssl doesn't have a macro for this. + format = {'hex':hexval, 'macro':firefox_macro, + 'note':"/* No openssl macro found for "+hexval+" */\n"} + + res = """\ +%(note)s#ifdef %(macro)s + CIPHER(%(hex)s, %(macro)s) +#else + XCIPHER(%(hex)s, %(macro)s) +#endif""" % format + print res diff --git a/src/wraith/scripts/codegen/makedesc.py b/src/wraith/scripts/codegen/makedesc.py new file mode 100644 index 000000000..8d9d4edaa --- /dev/null +++ b/src/wraith/scripts/codegen/makedesc.py @@ -0,0 +1,351 @@ +#!/usr/bin/python +# Copyright 2014-2017, The Tor Project, Inc. +# See LICENSE for license information + +# This is a kludgey python script that uses ctypes and openssl to sign +# router descriptors and extrainfo documents and put all the keys in +# the right places. There are examples at the end of the file. + +# I've used this to make inputs for unit tests. I wouldn't suggest +# using it for anything else. + +import base64 +import binascii +import ctypes +import ctypes.util +import hashlib +import optparse +import os +import re +import struct +import time +import UserDict + +import slow_ed25519 +import slownacl_curve25519 +import ed25519_exts_ref + +# Pull in the openssl stuff we need. + +crypt = ctypes.CDLL(ctypes.util.find_library('crypto')) +BIO_s_mem = crypt.BIO_s_mem +BIO_s_mem.argtypes = [] +BIO_s_mem.restype = ctypes.c_void_p + +BIO_new = crypt.BIO_new +BIO_new.argtypes = [ctypes.c_void_p] +BIO_new.restype = ctypes.c_void_p + +crypt.BIO_free.argtypes = [ctypes.c_void_p] +crypt.BIO_free.restype = ctypes.c_int + +crypt.BIO_ctrl.argtypes = [ctypes.c_void_p, ctypes.c_int, ctypes.c_long, ctypes.c_void_p ] +crypt.BIO_ctrl.restype = ctypes.c_long + +crypt.PEM_write_bio_RSAPublicKey.argtypes = [ ctypes.c_void_p, ctypes.c_void_p ] +crypt.PEM_write_bio_RSAPublicKey.restype = ctypes.c_int + +RSA_generate_key = crypt.RSA_generate_key +RSA_generate_key.argtypes = [ctypes.c_int, ctypes.c_ulong, ctypes.c_void_p, ctypes.c_void_p] +RSA_generate_key.restype = ctypes.c_void_p + +RSA_private_encrypt = crypt.RSA_private_encrypt +RSA_private_encrypt.argtypes = [ + ctypes.c_int, ctypes.c_char_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int ] +RSA_private_encrypt.restype = ctypes.c_int + +i2d_RSAPublicKey = crypt.i2d_RSAPublicKey +i2d_RSAPublicKey.argtypes = [ + ctypes.c_void_p, ctypes.POINTER(ctypes.c_char_p) +] +i2d_RSAPublicKey.restype = ctypes.c_int + + +def rsa_sign(msg, rsa): + buf = ctypes.create_string_buffer(1024) + n = RSA_private_encrypt(len(msg), msg, buf, rsa, 1) + if n <= 0: + raise Exception() + return buf.raw[:n] + +def b64(x): + x = base64.b64encode(x) + res = [] + for i in xrange(0, len(x), 64): + res.append(x[i:i+64]+"\n") + return "".join(res) + +def bio_extract(bio): + buf = ctypes.c_char_p() + length = crypt.BIO_ctrl(bio, 3, 0, ctypes.byref(buf)) + return ctypes.string_at(buf, length) + +def make_rsa_key(e=65537): + rsa = crypt.RSA_generate_key(1024, e, None, None) + bio = BIO_new(BIO_s_mem()) + crypt.PEM_write_bio_RSAPublicKey(bio, rsa) + pem = bio_extract(bio).rstrip() + crypt.BIO_free(bio) + buf = ctypes.create_string_buffer(1024) + pBuf = ctypes.c_char_p(ctypes.addressof(buf)) + n = crypt.i2d_RSAPublicKey(rsa, ctypes.byref(pBuf)) + s = buf.raw[:n] + digest = hashlib.sha1(s).digest() + return (rsa,pem,digest) + +def makeEdSigningKeyCert(sk_master, pk_master, pk_signing, date, + includeSigning=False, certType=1): + assert len(pk_signing) == len(pk_master) == 32 + expiration = struct.pack("!L", date//3600) + if includeSigning: + extensions = "\x01\x00\x20\x04\x00%s"%(pk_master) + else: + extensions = "\x00" + signed = "\x01%s%s\x01%s%s" % ( + chr(certType), expiration, pk_signing, extensions) + signature = ed25519_exts_ref.signatureWithESK(signed, sk_master, pk_master) + assert len(signature) == 64 + return signed+signature + +def objwrap(identifier, body): + return ("-----BEGIN {0}-----\n" + "{1}" + "-----END {0}-----").format(identifier, body) + +MAGIC1 = "<<<<<>>>>>" +MAGIC2 = "<<<<>>>>" + +class OnDemandKeys(object): + def __init__(self, certDate=None): + if certDate is None: + certDate = time.time() + 86400 + self.certDate = certDate + self.rsa_id = None + self.rsa_onion_key = None + self.ed_id_sk = None + self.ntor_sk = None + self.ntor_crosscert = None + self.rsa_crosscert_ed = None + self.rsa_crosscert_noed = None + + @property + def RSA_IDENTITY(self): + if self.rsa_id is None: + self.rsa_id, self.rsa_ident_pem, self.rsa_id_digest = make_rsa_key() + + return self.rsa_ident_pem + + @property + def RSA_ID_DIGEST(self): + self.RSA_IDENTITY + return self.rsa_id_digest + + @property + def RSA_FINGERPRINT_NOSPACE(self): + return binascii.b2a_hex(self.RSA_ID_DIGEST).upper() + + @property + def RSA_ONION_KEY(self): + if self.rsa_onion_key is None: + self.rsa_onion_key, self.rsa_onion_pem, _ = make_rsa_key() + + return self.rsa_onion_pem + + @property + def RSA_FINGERPRINT(self): + hexdigest = self.RSA_FINGERPRINT_NOSPACEK + return " ".join(hexdigest[i:i+4] for i in range(0,len(hexdigest),4)) + + @property + def RSA_SIGNATURE(self): + return MAGIC1 + + @property + def ED_SIGNATURE(self): + return MAGIC2 + + @property + def NTOR_ONION_KEY(self): + if self.ntor_sk is None: + self.ntor_sk = slownacl_curve25519.Private() + self.ntor_pk = self.ntor_sk.get_public() + return base64.b64encode(self.ntor_pk.serialize()) + + @property + def ED_CERT(self): + if self.ed_id_sk is None: + self.ed_id_sk = ed25519_exts_ref.expandSK(os.urandom(32)) + self.ed_signing_sk = ed25519_exts_ref.expandSK(os.urandom(32)) + self.ed_id_pk = ed25519_exts_ref.publickeyFromESK(self.ed_id_sk) + self.ed_signing_pk = ed25519_exts_ref.publickeyFromESK(self.ed_signing_sk) + self.ed_cert = makeEdSigningKeyCert(self.ed_id_sk, self.ed_id_pk, self.ed_signing_pk, self.certDate, includeSigning=True, certType=4) + + return objwrap('ED25519 CERT', b64(self.ed_cert)) + + @property + def NTOR_CROSSCERT(self): + if self.ntor_crosscert is None: + self.ED_CERT + self.NTOR_ONION_KEY + + ed_privkey = self.ntor_sk.serialize() + os.urandom(32) + ed_pub0 = ed25519_exts_ref.publickeyFromESK(ed_privkey) + sign = (ord(ed_pub0[31]) & 255) >> 7 + + self.ntor_crosscert = makeEdSigningKeyCert(self.ntor_sk.serialize() + os.urandom(32), ed_pub0, self.ed_id_pk, self.certDate, certType=10) + self.ntor_crosscert_sign = sign + + return objwrap('ED25519 CERT', b64(self.ntor_crosscert)) + + @property + def NTOR_CROSSCERT_SIGN(self): + self.NTOR_CROSSCERT + return self.ntor_crosscert_sign + + @property + def RSA_CROSSCERT_NOED(self): + if self.rsa_crosscert_noed is None: + self.RSA_ONION_KEY + signed = self.RSA_ID_DIGEST + self.rsa_crosscert_noed = rsa_sign(signed, self.rsa_onion_key) + return objwrap("CROSSCERT",b64(self.rsa_crosscert_noed)) + + @property + def RSA_CROSSCERT_ED(self): + if self.rsa_crosscert_ed is None: + self.RSA_ONION_KEY + self.ED_CERT + signed = self.RSA_ID_DIGEST + self.ed_id_pk + self.rsa_crosscert_ed = rsa_sign(signed, self.rsa_onion_key) + return objwrap("CROSSCERT",b64(self.rsa_crosscert_ed)) + + def sign_desc(self, body): + idx = body.rfind("\nrouter-sig-ed25519 ") + if idx >= 0: + self.ED_CERT + signed_part = body[:idx+len("\nrouter-sig-ed25519 ")] + signed_part = "Tor router descriptor signature v1" + signed_part + digest = hashlib.sha256(signed_part).digest() + ed_sig = ed25519_exts_ref.signatureWithESK(digest, + self.ed_signing_sk, self.ed_signing_pk) + + body = body.replace(MAGIC2, base64.b64encode(ed_sig).replace("=","")) + + idx = body.rindex("\nrouter-signature") + end_of_sig = body.index("\n", idx+1) + + signed_part = body[:end_of_sig+1] + + digest = hashlib.sha1(signed_part).digest() + assert len(digest) == 20 + + rsasig = rsa_sign(digest, self.rsa_id) + + body = body.replace(MAGIC1, objwrap("SIGNATURE", b64(rsasig))) + + return body + + +def signdesc(body, args_out=None): + rsa, ident_pem, id_digest = make_key() + _, onion_pem, _ = make_key() + + need_ed = '{ED25519-CERT}' in body or '{ED25519-SIGNATURE}' in body + if need_ed: + sk_master = os.urandom(32) + sk_signing = os.urandom(32) + pk_master = slow_ed25519.pubkey(sk_master) + pk_signing = slow_ed25519.pubkey(sk_signing) + + hexdigest = binascii.b2a_hex(id_digest).upper() + fingerprint = " ".join(hexdigest[i:i+4] for i in range(0,len(hexdigest),4)) + + MAGIC = "<<<<<>>>>>" + MORE_MAGIC = "<<<<>>>>" + args = { + "RSA-IDENTITY" : ident_pem, + "ONION-KEY" : onion_pem, + "FINGERPRINT" : fingerprint, + "FINGERPRINT-NOSPACE" : hexdigest, + "RSA-SIGNATURE" : MAGIC + } + if need_ed: + args['ED25519-CERT'] = makeEdSigningKeyCert( + sk_master, pk_master, pk_signing) + args['ED25519-SIGNATURE'] = MORE_MAGIC + + if args_out: + args_out.update(args) + body = body.format(**args) + + idx = body.rindex("\nrouter-signature") + end_of_sig = body.index("\n", idx+1) + + signed_part = body[:end_of_sig+1] + + digest = hashlib.sha1(signed_part).digest() + assert len(digest) == 20 + + buf = ctypes.create_string_buffer(1024) + n = RSA_private_encrypt(20, digest, buf, rsa, 1) + sig = buf.raw[:n] + + sig = """-----BEGIN SIGNATURE----- +%s +-----END SIGNATURE-----""" % b64(sig).rstrip() + body = body.replace(MAGIC, sig) + + return body.rstrip() + +def print_c_string(ident, body): + print "static const char %s[] =" % ident + for line in body.split("\n"): + print ' "%s\\n"' %(line) + print " ;" + +def emit_ri(name, body): + info = OnDemandKeys() + body = body.format(d=info) + body = info.sign_desc(body) + print_c_string("EX_RI_%s"%name.upper(), body) + +def emit_ei(name, body): + info = OnDemandKeys() + body = body.format(d=info) + body = info.sign_desc(body) + print_c_string("EX_EI_%s"%name.upper(), body) + + print 'const char EX_EI_{NAME}_FP[] = "{d.RSA_FINGERPRINT_NOSPACE}";'.format( + d=info, NAME=name.upper()) + print_c_string("EX_EI_%s_KEY"%name.upper(), info.RSA_IDENTITY) + +def analyze(s): + fields = {} + while s.startswith(":::"): + first,s=s.split("\n", 1) + m = re.match(r'^:::(\w+)=(.*)',first) + if not m: + raise ValueError(first) + k,v = m.groups() + fields[k] = v + return fields, s + +def process_file(s): + fields, s = analyze(s) + try: + name = fields['name'] + tp = fields['type'] + except KeyError: + raise ValueError("missing required field") + + if tp == 'ei': + emit_ei(name, s) + elif tp == 'ri': + emit_ri(name, s) + else: + raise ValueError("unrecognized type") + +if __name__ == '__main__': + import sys + for fn in sys.argv[1:]: + process_file(open(fn).read()) diff --git a/src/wraith/scripts/codegen/run_trunnel.sh b/src/wraith/scripts/codegen/run_trunnel.sh new file mode 100644 index 000000000..428804342 --- /dev/null +++ b/src/wraith/scripts/codegen/run_trunnel.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +if test "x$TRUNNEL_PATH" != "x"; then + PYTHONPATH="${TRUNNEL_PATH}:${PYTHONPATH}" + export PYTHONPATH +fi + +OPTIONS="--require-version=1.5.1" + +# Get all .trunnel files recursively from that directory so we can support +# multiple sub-directories. +for file in `find ./src/trunnel/ -name '*.trunnel'`; do + python -m trunnel ${OPTIONS} $file +done + +python -m trunnel ${OPTIONS} --write-c-files --target-dir=./src/ext/trunnel/ + diff --git a/src/wraith/scripts/maint/annotate_ifdef_directives b/src/wraith/scripts/maint/annotate_ifdef_directives new file mode 100644 index 000000000..368d842e2 --- /dev/null +++ b/src/wraith/scripts/maint/annotate_ifdef_directives @@ -0,0 +1,74 @@ +#!/usr/bin/python +# Copyright (c) 2017, The Tor Project, Inc. +# See LICENSE for licensing information + +import re + +LINE_OBVIOUSNESS_LIMIT = 4 + +class Problem(Exception): + pass + +def uncomment(s): + s = re.sub(r'//.*','',s) + s = re.sub(r'/\*.*','',s) + return s.strip() + +def translate(f_in, f_out): + whole_file = [] + stack = [] + cur_level = whole_file + lineno = 0 + for line in f_in: + lineno += 1 + m = re.match(r'\s*#\s*(if|ifdef|ifndef|else|endif|elif)\b\s*(.*)', + line) + if not m: + f_out.write(line) + continue + command,rest = m.groups() + if command in ("if", "ifdef", "ifndef"): + # The #if directive pushes us one level lower on the stack. + if command == 'ifdef': + rest = "defined(%s)"%uncomment(rest) + elif command == 'ifndef': + rest = "!defined(%s)"%uncomment(rest) + elif rest.endswith("\\"): + rest = rest[:-1]+"..." + + rest = uncomment(rest) + + new_level = [ (command, rest, lineno) ] + stack.append(cur_level) + cur_level = new_level + f_out.write(line) + elif command in ("else", "elif"): + if len(cur_level) == 0 or cur_level[-1][0] == 'else': + raise Problem("Unexpected #%s on %d"% (command,lineno)) + if (len(cur_level) == 1 and command == 'else' and + lineno > cur_level[0][2] + LINE_OBVIOUSNESS_LIMIT): + f_out.write("#else /* !(%s) */\n"%cur_level[0][1]) + else: + f_out.write(line) + cur_level.append((command, rest, lineno)) + else: + assert command == 'endif' + if len(stack) == 0: + raise Problem("Unmatched #%s on %s"% (command,lineno)) + if lineno <= cur_level[0][2] + LINE_OBVIOUSNESS_LIMIT: + f_out.write(line) + elif len(cur_level) == 1 or ( + len(cur_level) == 2 and cur_level[1][0] == 'else'): + f_out.write("#endif /* %s */\n"%cur_level[0][1]) + else: + f_out.write("#endif /* %s || ... */\n"%cur_level[0][1]) + cur_level = stack.pop() + if len(stack) or cur_level != whole_file: + raise Problem("Missing #endif") + +import sys,os +for fn in sys.argv[1:]: + with open(fn+"_OUT", 'w') as output_file: + translate(open(fn, 'r'), output_file) + os.rename(fn+"_OUT", fn) + diff --git a/src/wraith/scripts/maint/checkLogs.pl b/src/wraith/scripts/maint/checkLogs.pl new file mode 100644 index 000000000..b00503e9a --- /dev/null +++ b/src/wraith/scripts/maint/checkLogs.pl @@ -0,0 +1,51 @@ +#!/usr/bin/perl -w + +use strict; + +my %count = (); +my $more = 0; +my $last = ""; + +while (<>) { + if ($more) { + if (/LD_BUG/) { + $more = 0; + next; + } + if (/\"((?:[^\"\\]+|\\.*)+)\"(.*)/) { + $last .= $1; + if ($2 !~ /[,\)]/) { + $more = 1; + } else { + $count{lc $last}++; + $more = 0; + } + } elsif (/[,\)]/) { + $count{lc $last}++; + $more = 0; + } elsif ($more == 2) { + print "SKIPPED more\n"; + } + } elsif (/log_(?:warn|err|notice)\(\s*(LD_[A-Z_]*)\s*,\s*\"((?:[^\"\\]+|\\.)*)\"(.*)/) { + next if ($1 eq 'LD_BUG'); + my $s = $2; + if ($3 =~ /[,\)]/ ) { + $count{lc $s}++; + } else { + $more = 1; + $last = $s; + } + } elsif (/log_(?:warn|err|notice)\(\s*((?:LD_[A-Z_]*)?)(.*)/) { + next if ($1 eq 'LD_BUG'); + my $extra = $2; + chomp $extra; + $last = ""; + $more = 2 if ($extra eq ''); + } +} + +while ((my $phrase, my $count) = each %count) { + if ($count > 1) { + print "$count\t$phrase\n"; + } +} diff --git a/src/wraith/scripts/maint/checkOptionDocs.pl.in b/src/wraith/scripts/maint/checkOptionDocs.pl.in new file mode 100644 index 000000000..1f53adf09 --- /dev/null +++ b/src/wraith/scripts/maint/checkOptionDocs.pl.in @@ -0,0 +1,69 @@ +#!/usr/bin/perl -w +use strict; + +my %options = (); +my %descOptions = (); +my %torrcSampleOptions = (); +my %manPageOptions = (); + +# Load the canonical list as actually accepted by Tor. +open(F, "@abs_top_builddir@/src/or/tor --list-torrc-options |") or die; +while () { + next if m!\[notice\] Tor v0\.!; + if (m!^([A-Za-z0-9_]+)!) { + $options{$1} = 1; + } else { + print "Unrecognized output> "; + print; + } +} +close F; + +# Load the contents of torrc.sample +sub loadTorrc { + my ($fname, $options) = @_; + local *F; + open(F, "$fname") or die; + while () { + next if (m!##+!); + if (m!#([A-Za-z0-9_]+)!) { + $options->{$1} = 1; + } + } + close F; + 0; +} + +loadTorrc("@abs_top_srcdir@/src/config/torrc.sample.in", \%torrcSampleOptions); + +# Try to figure out what's in the man page. + +my $considerNextLine = 0; +open(F, "@abs_top_srcdir@/doc/tor.1.txt") or die; +while () { + if (m!^(?:\[\[([A-za-z0-9_]+)\]\] *)?\*\*([A-Za-z0-9_]+)\*\*!) { + $manPageOptions{$2} = 1; + print "Missing an anchor: $2\n" unless (defined $1 or $2 eq 'tor'); + } +} +close F; + +# Now, display differences: + +sub subtractHashes { + my ($s, $a, $b) = @_; + my @lst = (); + for my $k (keys %$a) { + push @lst, $k unless (exists $b->{$k}); + } + print "$s: ", join(' ', sort @lst), "\n\n"; + 0; +} + +# subtractHashes("No online docs", \%options, \%descOptions); +# subtractHashes("Orphaned online docs", \%descOptions, \%options); + +subtractHashes("Orphaned in torrc.sample.in", \%torrcSampleOptions, \%options); + +subtractHashes("Not in man page", \%options, \%manPageOptions); +subtractHashes("Orphaned in man page", \%manPageOptions, \%options); diff --git a/src/wraith/scripts/maint/checkSpace.pl b/src/wraith/scripts/maint/checkSpace.pl new file mode 100644 index 000000000..9929932cc --- /dev/null +++ b/src/wraith/scripts/maint/checkSpace.pl @@ -0,0 +1,203 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +my $found = 0; +sub msg { + $found = 1; + print "$_[0]"; +} + +my $C = 0; + +if ($ARGV[0] =~ /^-/) { + my $lang = shift @ARGV; + $C = ($lang eq '-C'); +} + +for my $fn (@ARGV) { + open(F, "$fn"); + my $lastnil = 0; + my $lastline = ""; + my $incomment = 0; + my $in_func_head = 0; + while () { + ## Warn about windows-style newlines. + # (We insist on lines that end with a single LF character, not + # CR LF.) + if (/\r/) { + msg " CR:$fn:$.\n"; + } + ## Warn about tabs. + # (We only use spaces) + if (/\t/) { + msg " TAB:$fn:$.\n"; + } + ## Warn about labels that don't have a space in front of them + # (We indent every label at least one space) + if (/^[a-zA-Z_][a-zA-Z_0-9]*:/) { + msg "nosplabel:$fn:$.\n"; + } + ## Warn about trailing whitespace. + # (We don't allow whitespace at the end of the line; make your + # editor highlight it for you so you can stop adding it in.) + if (/ +$/) { + msg "Space\@EOL:$fn:$.\n"; + } + ## Warn about control keywords without following space. + # (We put a space after every 'if', 'while', 'for', 'switch', etc) + if ($C && /\s(?:if|while|for|switch)\(/) { + msg " KW(:$fn:$.\n"; + } + ## Warn about #else #if instead of #elif. + # (We only allow #elif) + if (($lastline =~ /^\# *else/) and ($_ =~ /^\# *if/)) { + msg " #else#if:$fn:$.\n"; + } + ## Warn about some K&R violations + # (We use K&R-style C, where open braces go on the same line as + # the statement that introduces them. In other words: + # if (a) { + # stuff; + # } else { + # other stuff; + # } + if (/^\s+\{/ and $lastline =~ /^\s*(if|while|for|else if)/ and + $lastline !~ /\{$/) { + msg "non-K&R {:$fn:$.\n"; + } + if (/^\s*else/ and $lastline =~ /\}$/) { + msg " }\\nelse:$fn:$.\n"; + } + $lastline = $_; + ## Warn about unnecessary empty lines. + # (Don't put an empty line before a line that contains nothing + # but a closing brace.) + if ($lastnil && /^\s*}\n/) { + msg " UnnecNL:$fn:$.\n"; + } + ## Warn about multiple empty lines. + # (At most one blank line in a row.) + if ($lastnil && /^$/) { + msg " DoubleNL:$fn:$.\n"; + } elsif (/^$/) { + $lastnil = 1; + } else { + $lastnil = 0; + } + ## Terminals are still 80 columns wide in my world. I refuse to + ## accept double-line lines. + # (Don't make lines wider than 80 characters, including newline.) + if (/^.{80}/) { + msg " Wide:$fn:$.\n"; + } + ### Juju to skip over comments and strings, since the tests + ### we're about to do are okay there. + if ($C) { + if ($incomment) { + if (m!\*/!) { + s!.*?\*/!!; + $incomment = 0; + } else { + next; + } + } + if (m!/\*.*?\*/!) { + s!\s*/\*.*?\*/!!; + } elsif (m!/\*!) { + s!\s*/\*!!; + $incomment = 1; + next; + } + s!"(?:[^\"]+|\\.)*"!"X"!g; + next if /^\#/; + ## Warn about C++-style comments. + # (Use C style comments only.) + if (m!//!) { + # msg " //:$fn:$.\n"; + s!//.*!!; + } + ## Warn about unquoted braces preceded by non-space. + # (No character except a space should come before a {) + if (/([^\s'])\{/) { + msg " $1\{:$fn:$.\n"; + } + ## Warn about double semi-colons at the end of a line. + if (/;;$/) { + msg " double semi-colons at the end of $. in $fn\n" + } + ## Warn about multiple internal spaces. + #if (/[^\s,:]\s{2,}[^\s\\=]/) { + # msg " X X:$fn:$.\n"; + #} + ## Warn about { with stuff after. + #s/\s+$//; + #if (/\{[^\}\\]+$/) { + # msg " {X:$fn:$.\n"; + #} + ## Warn about function calls with space before parens. + # (Don't put a space between the name of a function and its + # arguments.) + if (/(\w+)\s\(([A-Z]*)/) { + if ($1 ne "if" and $1 ne "while" and $1 ne "for" and + $1 ne "switch" and $1 ne "return" and $1 ne "int" and + $1 ne "elsif" and $1 ne "WINAPI" and $2 ne "WINAPI" and + $1 ne "void" and $1 ne "__attribute__" and $1 ne "op" and + $1 ne "size_t" and $1 ne "double" and $1 ne "uint64_t" and + $1 ne "workqueue_reply_t") { + msg " fn ():$fn:$.\n"; + } + } + ## Warn about functions not declared at start of line. + # (When you're declaring functions, put "static" and "const" + # and the return type on one line, and the function name at + # the start of a new line.) + if ($in_func_head || + ($fn !~ /\.h$/ && /^[a-zA-Z0-9_]/ && + ! /^(?:const |static )*(?:typedef|struct|union)[^\(]*$/ && + ! /= *\{$/ && ! /;$/)) { + if (/.\{$/){ + msg "fn() {:$fn:$.\n"; + $in_func_head = 0; + } elsif (/^\S[^\(]* +\**[a-zA-Z0-9_]+\(/) { + $in_func_head = -1; # started with tp fn + } elsif (/;$/) { + $in_func_head = 0; + } elsif (/\{/) { + if ($in_func_head == -1) { + msg "tp fn():$fn:$.\n"; + } + $in_func_head = 0; + } + } + + ## Check for forbidden functions except when they are + # explicitly permitted + if (/\bassert\(/ && not /assert OK/) { + msg "assert :$fn:$. (use tor_assert)\n"; + } + if (/\bmemcmp\(/ && not /memcmp OK/) { + msg "memcmp :$fn:$. (use {tor,fast}_mem{eq,neq,cmp}\n"; + } + # always forbidden. + if (not /\ OVERRIDE\ /) { + if (/\bstrcat\(/ or /\bstrcpy\(/ or /\bsprintf\(/) { + msg "$& :$fn:$.\n"; + } + if (/\bmalloc\(/ or /\bfree\(/ or /\brealloc\(/ or + /\bstrdup\(/ or /\bstrndup\(/ or /\bcalloc\(/) { + msg "$& :$fn:$. (use tor_malloc, tor_free, etc)\n"; + } + } + } + } + ## Warn if the file doesn't end with a blank line. + # (End each file with a single blank line.) + if (! $lastnil) { + msg " EOL\@EOF:$fn:$.\n"; + } + close(F); +} + +exit $found; diff --git a/src/wraith/scripts/maint/check_config_macros.pl b/src/wraith/scripts/maint/check_config_macros.pl new file mode 100644 index 000000000..bcde2becc --- /dev/null +++ b/src/wraith/scripts/maint/check_config_macros.pl @@ -0,0 +1,20 @@ +#!/usr/bin/perl -w + +use strict; + +my @macros = (); + +open(F, 'orconfig.h.in'); +while() { + if (/^#undef +([A-Za-z0-9_]*)/) { + push @macros, $1; + } +} +close F; + +for my $m (@macros) { + my $s = `git grep '$m' src`; + if ($s eq '') { + print "Unused: $m\n"; + } +} diff --git a/src/wraith/scripts/maint/fallback.blacklist b/src/wraith/scripts/maint/fallback.blacklist new file mode 100644 index 000000000..1417a13a9 --- /dev/null +++ b/src/wraith/scripts/maint/fallback.blacklist @@ -0,0 +1,274 @@ +# updateFallbackDirs.py directory mirror blacklist +# +# Format: +# [ IPv4[:DirPort] ] [ orport= ] [ id= ] ... +# [ ipv6=[:] ] +# +# If a sufficiently specific group of attributes matches, the directory mirror +# will be excluded: (each group is listed on its own line) +# , +# , +# +# , +# , +# If DirPort and ORPort are not present, the entire IP address is blacklisted. +# (The blacklist overrides the whitelist.) + +# If a relay operator doesn't want their relay to be a FallbackDir, +# enter the following information here: +# : orport= id= ipv6=: + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008364.html +87.181.248.227:9030 orport=443 id=8827944C4BDCBDAC9079803F47823403C11A9B7A + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008368.html +149.18.2.82:9030 orport=9001 id=953DB709F2A2DECC8D7560661F934E64411444F7 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008384.html +80.82.215.199:80 orport=443 id=3BEFAB76461B6B99DCF34C285E933562F5712AE4 ipv6=[2001:4ba0:cafe:a18::1]:443 + +# Email sent directly to teor, verified using relay contact info +5.34.183.168:80 orport=443 id=601C92108A568742A7A6D9473FE3A414F7149070 +217.12.199.208:8080 orport=22 id=BCFB0933367D626715DA32A147F417194A5D48D6 + +# https://lists.torproject.org/pipermail/tor-relays/2016-January/008555.html +62.210.207.124:9030 orport=9001 id=58938B1A5C4029B4415D38A4F36B7724273F4755 ipv6=[2001:bc8:31eb:100::1]:9001 +62.210.207.124:9130 orport=9101 id=338D0AB6DBAB7B529B9C91B2FD770658000693C4 ipv6=[2001:bc8:31eb:100::1]:9101 + +# these fallback candidates fail the consensus download test in a way that +# causes stem to hang (and not respond to ^C, at least on OS X) +# (Is something sending weird responses to DirPort traffic?) +#217.23.14.190:1194 +#151.80.164.147:80 +#148.251.255.92:80 +#78.142.19.59:80 + +# Email sent directly to teor, verified using relay contact info +216.17.99.183:80 orport=443 id=D52CD431CEF28E01B11F545A84347EE45524BCA7 +216.17.99.183:8080 orport=9001 id=EE21F83AB6F76E3B3FFCBA5C2496F789CB84E7C6 +65.19.167.130:80 orport=443 id=890E2EA65455FBF0FAAB4159FAC4412BDCB24295 +65.19.167.131:80 orport=443 id=0DA9BD201766EDB19F57F49F1A013A8A5432C008 +65.19.167.132:80 orport=443 id=12B80ABF019354A9D25EE8BE85EB3C0AD8F7DFC1 +65.19.167.133:80 orport=443 id=C170AE5A886C5A09D6D1CF5CF284653632EEF25D + +# Email sent directly to teor, verified using relay contact info +213.136.83.225:80 orport=443 id=B411027C926A9BFFCF7DA91E3CAF1856A321EFFD +195.154.126.78:80 orport=443 id=F6556156E2B3837248E03FDB770441CF64DBBFBE + +# Email sent directly to teor, verified using relay contact info +178.63.198.113:80 orport=443 id=872B18761953254914F77C71846E8A2623C52591 + +# Email sent directly to teor, verified using relay contact info +63.141.226.34:80 orport=9001 id=5EF131C0C82270F40B756987FDB5D54D9C966238 +185.75.56.103:80 orport=9001 id=3763CE5C3F574670D4296573744F821C0FFFB98E + +# Email sent directly to teor, verified using relay contact info +81.7.14.227:9030 orport=9001 id=BCA197C43A44B7B9D14509637F96A45B13C233D0 + +# Email sent directly to teor, verified using relay contact info +84.245.32.195:9030 orport=9001 id=4CD4DFFEF3971C902A22100D911CAC639BE2EF5C + +# Email sent directly to teor, verified using relay contact info +185.21.217.10:9030 orport=9001 id=41537E1D3DD3CAE86F5A3F0882F1C647FE8FC0A0 + +# Email sent directly to teor, verified using relay contact info +185.21.216.140:9030 orport=9001 id=921DA852C95141F8964B359F774B35502E489869 + +# Email sent directly to teor, verified using relay contact info +62.210.82.44:143 orport=21 id=1C90D3AEADFF3BCD079810632C8B85637924A58E ipv6=[2001:bc8:3d7c::]:21 + +# Email sent directly to teor, verified using relay contact info +46.101.220.161:80 orport=443 id=7DDFE5B2C306B19A79832FBE581EAA245BAE90C6 ipv6=[2a03:b0c0:3:d0::8b:3001]:443 + +# Email sent directly to teor, verified using relay contact info +195.154.107.23:80 orport=443 id=A1F89F26E82209169E4037B035AE7B6C94A49AEB ipv6=[2001:bc8:3829:300::1]:443 +195.154.92.70:80 orport=443 id=E7FF4ECEEFCFE3A40A6D3594898A4A3DE018BBF5 ipv6=[2001:bc8:3829:500::1]:443 +195.154.113.200:80 orport=443 id=D1A4763FA0BD71978901B1951FEE1DC29777F95A ipv6=[2001:bc8:3829:600::1]:443 +195.154.92.155:110 orport=993 id=4477D3466FE136B7FE6F7FF8EBD0D6E2FFE3288B ipv6=[2001:bc8:3829:100::1]:993 +195.154.117.182:110 orport=993 id=B1A0F1143789466AADD5FAE5948C8138548EECEC ipv6=[2001:bc8:3829:400::1]:993 +195.154.97.163:80 orport=443 id=8A2994A63B20813B7724817A8FB8C444D10BA2E2 + +# Email sent directly to teor, verified using relay contact info +5.135.154.206:9030 orport=9001 id=7D67B342DC1158F4CFFEE8BC530A2448848026E3 + +# Email sent directly to teor, verified using relay contact info +85.24.215.117:9030 orport=9001 id=5989521A85C94EE101E88B8DB2E68321673F9405 ipv6=[2001:9b0:20:2106:21a:4aff:fea5:ad05]:9001 + +# Email sent directly to teor, verified using relay contact info +62.210.137.230:8888 orport=8843 id=CD6B850159CFF4C068A8D0F1BA5296AE4EDCAB39 ipv6=[2001:bc8:31d3:100::1]:3443 +62.210.137.230:8080 orport=8443 id=F596E1B1EF98E1DDBBDC934DB722AF54069868F6 ipv6=[2001:bc8:31d3:100::1]:8443 + +# Email sent directly to teor, verified using relay contact info +195.154.99.80:80 orport=443 id=6E7CB6E783C1B67B79D0EBBE7D48BC09BD441201 +195.154.127.60:80 orport=443 id=D74ABE34845190E242EC74BA28B8C89B0A480D4B + +# Email sent directly to teor, verified using relay contact info +212.51.143.20:80 orport=443 id=62DA0256BBC28992D41CBAFB549FFD7C9B846A99 + +# Email sent directly to teor, verified using relay contact info +195.154.90.122:80 orport=443 id=3A0D88024A30152E6F6372CFDF8F9B725F984362 + +# Email sent directly to teor, verified using relay contact info +188.166.118.215:9030 orport=443 id=FB5FF60F5EBA010F8A45AC6ED31A4393718A2C31 ipv6=[2a03:b0c0:2:d0::72:9001]:443 + +# Email sent directly to teor, verified using relay contact info +185.87.185.245:40001 orport=40000 id=2A499AEEA95FB10F07544383D562368E49BE32CA + +# Email sent directly to teor, verified using relay contact info +82.161.109.71:9030 orport=9001 id=BD9CE352648B940E788A8E45393C5400CC3E87E7 + +# Email sent directly to teor, verified using relay contact info +212.83.40.239:9030 orport=9001 id=6DC5616BD3FC463329DCE87DD7AAAEA112C264B5 + +# Email sent directly to teor, verified using relay contact info +178.32.53.53:80 orport=443 id=10582C360E972EE76B0DB1C246F4E892A6BF5465 + +# Email sent directly to teor, verified using relay contact info +85.114.135.20:9030 orport=9001 id=ED8A9291A3139E34BBD35037B082081EC6C26C80 ipv6=[2001:4ba0:fff5:2d::8]:9001 +148.251.128.156:9030 orport=9001 id=E382042E06A0A68AFC533E5AD5FB6867A12DF9FF ipv6=[2a01:4f8:210:238a::8]:9001 +62.210.115.147:9030 orport=9001 id=7F1D94E2C36F8CC595C2AB00022A5AE38171D50B ipv6=[2001:bc8:3182:101::8]:9001 + +# Email sent directly to teor, verified using relay contact info +74.208.220.222:60000 orport=59999 id=4AA22235F0E9B3795A33930343CBB3EDAC60C5B0 + +# Email sent directly to teor, verified using relay contact info +89.163.140.168:9030 orport=9001 id=839C1212DB15723263BE96C83DA7E1B24FA395E8 + +# Email sent directly to teor, verified using relay contact info +212.47.246.211:9030 orport=9001 id=AA34219475E41282095DD3C088009EE562AF14E5 + +# Email sent directly to teor, verified using relay contact info +85.195.235.148:9030 orport=9001 id=103336165A0D2EFCAD3605339843A0A7710B8B92 +85.195.235.148:19030 orport=19001 id=713235638AB6C64715EAFD1B4772685E38AFD52A + +# Email sent directly to teor, verified using relay contact info +163.172.7.30:9030 orport=9001 id=E2EACD4752B2583202F374A34CACC844A3AECAC4 + +# Email sent directly to teor, verified using relay contact info +178.62.90.111:22 orport=25 id=3254D1DC1F1531D9C07C535E4991F38EE99B99E1 + +# Email sent directly to teor, verified using relay contact info +213.200.106.131:9030 orport=4443 id=B07CE79FD215129C381F6645B16E76DCA0845CAB + +# Email sent directly to teor, verified using relay contact info +198.51.75.165:80 orport=9001 id=DABCB84A524A22FDDD3AFCB090E3090CC12D9770 + +# Email sent directly to teor, verified using relay contact info +204.194.29.4:80 orport=9001 id=78C7C299DB4C4BD119A22B87B57D5AF5F3741A79 + +# Email sent directly to teor, verified using relay contact info +104.207.132.109:9030 orport=9001 id=12D5737383C23E756A7AA1A90BB24413BA428DA7 ipv6=[2001:19f0:300:2261::1]:9001 + +# Email sent directly to teor, verified using relay contact info +46.252.25.249:9030 orport=443 id=80DCBB6EF4E86A7CD4FBCBDEE64979645509A610 + +# Email sent directly to teor, verified using relay contact info +176.10.99.200:8080 orport=443 id=2B44FD1742D26E4F28D4CACF1F0CF8A686270E45 +176.10.99.200:8000 orport=22 id=EB79F07792A065D3C534063773E83268E069F5EB +176.10.99.201:667 orport=666 id=3EAAAB35932610411E24FA4317603CB5780B80BC +176.10.99.201:990 orport=989 id=7C3A4CFF09C1981D41173CDE2A2ADD4A5CA109FD +176.10.99.202:992 orport=991 id=615EBC4B48F03858FA50A3E23E5AF569D0D2308A +176.10.99.202:994 orport=993 id=E34E25D958D46DDE5092385B14117C9B301DC0E9 +176.10.99.203:1194 orport=995 id=AD368442E9FF33C08C7407DF2DA7DB958F406CE2 +176.10.99.203:43 orport=53 id=79CF377F0ACEC5F0002D85335E4192B34202A269 +176.10.99.204:1755 orport=1723 id=69DF3CDA1CDA460C17ECAD9D6F0C117A42384FA0 +176.10.99.204:1293 orport=4321 id=3F061400B6FB1F55E7F19BB3C713884D677E55B7 +176.10.99.205:426 orport=425 id=C30B284784BF11D0D58C6A250240EE58D2084AD0 +176.10.99.205:109 orport=110 id=12D17D9F9E30FA901DE68806950A0EA278716CED +176.10.99.206:24 orport=23 id=2C804AAB0C02F971A4386B3A1F2AC00F9E080679 +176.10.99.206:20 orport=21 id=237588726AB6BEA37FF23CA00F5BD178586CA68E +176.10.99.207:3390 orport=3389 id=A838D5B8890B10172429ECE92EB5677DF93DC4DD +176.10.99.207:1415 orport=1414 id=377E5E817A84FAE0F4DC3427805DB2E8A6CBBFC0 +176.10.99.208:390 orport=389 id=7C288587BA0D99CC6B8537CDC2C4639FA827B907 +176.10.99.208:3307 orport=3306 id=1F0D2A44C56F42816DED2022EFD631878C29905B +176.10.99.209:1434 orport=1433 id=BDA7A91FF3806DE5109FDAE74CFEFB3BABB9E10F +176.10.99.209:220 orport=219 id=B8C2030001D832066A648269CFBA94171951D34B + +# Email sent directly to teor, verified using relay contact info +78.193.40.205:8080 orport=8443 id=C91450840E75AC1B654A3096744338A573A239C6 + +# Email sent directly to teor, verified using relay contact info +37.187.22.172:9030 orport=9035 id=335E4117BD9A4966403C2AFA31CFDD1BC13BD46A + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008367.html +# Email sent directly to teor to opt-out +88.198.38.226:22 orport=443 id=4B9E2C56FB42B891794FE2CD2FCAD08A320CC3BB ipv6=[2a01:4f8:a0:1351::2]:80 +213.239.210.204:22 orport=443 id=5BFDECCE9B4A23AE14EC767C5A2C1E10558B00B9 ipv6=[2a01:4f8:a0:9474::2]:80 +213.239.220.25:22 orport=443 id=BEE2317AE127EB681C5AE1551C1EA0630580638A ipv6=[2a01:4f8:a0:710c::2]:80 +85.10.201.38:22 orport=443 id=F6279A203C1950ACF592322A235647A05BFBCF91 ipv6=[2a01:4f8:a0:43cc::2]:80 + +# Email sent directly to teor, verified using relay contact info +88.190.208.4:30555 orport=30556 id=030A6EB24725C05D8E0FCE21923CBA5223E75E0E + +# Fallback was on 0.2.8.2-alpha list, but changed fingerprint before 0.2.8.5 +46.101.102.71:80 orport=443 id=9504CB22EEB25D344DE63CB7A6F2C46F895C3686 ipv6=[2a03:b0c0:3:d0::2ed:7001]:9050 +# Also blacklist anything with the new fingerprint +id=9C8A123081EFBE022EF795630F447839DDFDDDEC + +# Fallbacks were on 0.2.8.2-alpha list, but downloads were slow before 0.2.8.5 +185.96.88.29:80 orport=443 id=86C281AD135058238D7A337D546C902BE8505DDE +178.62.36.64:9030 orport=9001 id=B87C84E38DAECFFFFDE98E5AEE5786AFDC748F2C + +# Fallback was on 0.2.8.2-alpha list, but changed address before 0.2.8.5 +84.219.173.60:9030 orport=443 id=855BC2DABE24C861CD887DB9B2E950424B49FC34 +# Also blacklist anything with the new address +84.216.235.55:9030 orport=443 + +# Fallbacks were on 0.2.8.2-alpha list, but disappeared before 0.2.8.5 +81.7.17.171:80 orport=443 id=CFECDDCA990E3EF7B7EC958B22441386B6B8D820 ipv6=[2a02:180:1:1::517:11ab]:443 +51.254.215.121:80 orport=443 id=262B66AD25C79588AD1FC8ED0E966395B47E5C1D +185.100.85.138:80 orport=46356 id=5C4DF16A0029CC4F67D3E127356E68F219269859 + +# Fallback was on 0.2.8.2-alpha list, but opted-out before 0.2.8.6 +37.187.1.149:9030 orport=9001 id=08DC0F3C6E3D9C527C1FC8745D35DD1B0DE1875D ipv6=[2001:41d0:a:195::1]:9001 + +# Email sent directly to teor, verified using relay contact info +195.154.15.227:9030 orport=9001 id=6C3E3AB2F5F03CD71B637D433BAD924A1ECC5796 + +# Fallback was on 0.2.8.6 list, but changed IPv4 before 0.2.9 +195.154.8.111:80 orport=443 id=FCB6695F8F2DC240E974510A4B3A0F2B12AB5B64 +# Same operator, not on 0.2.8.6 list, also changed IPv4 +51.255.235.246:80 orport=443 id=9B99C72B02AF8E3E5BE3596964F9CACD0090D132 + +# Fallback was on 0.2.8.6 list, but changed IPv4 before 0.2.9 +5.175.233.86:80 orport=443 id=5525D0429BFE5DC4F1B0E9DE47A4CFA169661E33 + +# Fallbacks were on 0.2.8.6 list, but went down before 0.2.9 +194.150.168.79:11112 orport=11111 id=29F1020B94BE25E6BE1AD13E93CE19D2131B487C +94.126.23.174:9030 orport=9001 id=6FC6F08270D565BE89B7C819DD8E2D487397C073 +195.191.233.221:80 orport=443 id=DE134FC8E5CC4EC8A5DE66934E70AC9D70267197 +176.31.180.157:143 orport=22 id=E781F4EC69671B3F1864AE2753E0890351506329 ipv6=[2001:41d0:8:eb9d::1]:22 + +# Fallback was on 0.2.8.6 list, but opted-out before 0.2.9 +144.76.73.140:9030 orport=9001 id=6A640018EABF3DA9BAD9321AA37C2C87BBE1F907 + +# https://lists.torproject.org/pipermail/tor-relays/2016-December/011114.html +# no dirport +86.107.110.34:0 orport=9001 id=A0E3D30A660DB70CA0B6D081BA54D094DED6F28D +94.242.59.147:80 orport=9001 id=674DCBB0D9C1C4C4DBFB4A9AE024AF59FE4E7F46 ipv6=[2a00:1838:35:42::b648]:9001 + +# Email sent directly to teor, verified using relay contact info +167.114.152.100:9030 orport=443 id=0EF5E5FFC5D1EABCBDA1AFF6F6D6325C5756B0B2 ipv6=[2607:5300:100:200::1608]:443 + +# Email sent directly to teor, verified using relay contact info +163.172.35.245:80 orport=443 id=B771AA877687F88E6F1CA5354756DF6C8A7B6B24 + +# Email sent directly to teor, verified using relay contact info +104.243.35.196:9030 orport=9001 id=FA3415659444AE006E7E9E5375E82F29700CFDFD + +# Relay changed IPv4 address, operator uncontactable +138.201.130.32:9030 orport=9001 id=52AEA31188331F421B2EDB494DB65CD181E5B257 + +# Emails sent directly to teor, verified using relay contact info +217.12.199.208:80 orport=443 id=DF3AED4322B1824BF5539AE54B2D1B38E080FF05 ipv6=[2a02:27a8:0:2::7e]:443 + +# Emails sent directly to teor, verified using relay contact info +195.154.75.84:9030 orport=9001 id=F80FDE27EFCB3F6A7B4E2CC517133DBFFA78BA2D +195.154.127.246:9030 orport=9001 id=4FEE77AFFD157BBCF2D896AE417FBF647860466C + +# Email sent directly to teor, verified using relay contact info +5.35.251.247:9030 orport=9001 id=9B1F5187DFBA89DC24B37EA7BF896C12B43A27AE + +#​https://lists.torproject.org/pipermail/tor-relays/2017-May/012281.html +62.210.124.124:9030 orport=9001 id=86E78DD3720C78DA8673182EF96C54B162CD660C ipv6=[2001:bc8:3f23:100::1]:9001 +62.210.124.124:9130 orport=9101 id=2EBD117806EE43C3CC885A8F1E4DC60F207E7D3E ipv6=[2001:bc8:3f23:100::1]:9101 diff --git a/src/wraith/scripts/maint/fallback.whitelist b/src/wraith/scripts/maint/fallback.whitelist new file mode 100644 index 000000000..0620d6b5f --- /dev/null +++ b/src/wraith/scripts/maint/fallback.whitelist @@ -0,0 +1,829 @@ +# updateFallbackDirs.py directory mirror whitelist +# +# Format: +# IPv4:DirPort orport= id= [ ipv6=: ] +# +# All attributes must match for the directory mirror to be included. +# If the fallback has an ipv6 key, the whitelist line must also have +# it, and vice versa, otherwise they don't match. +# (The blacklist overrides the whitelist.) + +# To replace this list with the hard-coded fallback list (for testing), use +# a command similar to: +# cat src/or/fallback_dirs.inc | grep \" | grep -v weight | tr -d '\n' | \ +# sed 's/"" / /g' | sed 's/""/"/g' | tr \" '\n' | grep -v '^$' \ +# > scripts/maint/fallback.whitelist +# +# When testing before a release, exclusions due to changed details will result +# in a warning, unless the IPv4 address or port change happened recently. +# Then it is only logged at info level, as part of the eligibility check. +# Exclusions due to stability also are only shown at info level. +# +# Add the number of selected, slow, and excluded relays, and compare that to +# the number of hard-coded relays. If it's less, use info-level logs to find +# out why each of the missing relays was excluded. + +# If a relay operator wants their relay to be a FallbackDir, +# enter the following information here: +# : orport= id= [ ipv6=: ] + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008362.html +78.47.18.110:443 orport=80 id=F8D27B163B9247B232A2EEE68DD8B698695C28DE +131.188.40.188:443 orport=80 id=EBE718E1A49EE229071702964F8DB1F318075FF8 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008366.html +5.39.88.19:9030 orport=9001 id=7CB8C31432A796731EA7B6BF4025548DFEB25E0C ipv6=[2001:41d0:8:9a13::1]:9050 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008370.html +# https://lists.torproject.org/pipermail/tor-relays/2016-January/008517.html +# https://lists.torproject.org/pipermail/tor-relays/2016-January/008555.html +212.47.237.95:9030 orport=9001 id=3F5D8A879C58961BB45A3D26AC41B543B40236D6 +212.47.237.95:9130 orport=9101 id=6FB38EB22E57EF7ED5EF00238F6A48E553735D88 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008372.html +# IPv6 tunnel available on request (is this a good idea?) +108.53.208.157:80 orport=443 id=4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008373.html +167.114.35.28:9030 orport=9001 id=E65D300F11E1DB12C534B0146BDAB6972F1A8A48 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008378.html +144.76.14.145:110 orport=143 id=14419131033443AE6E21DA82B0D307F7CAE42BDB ipv6=[2a01:4f8:190:9490::dead]:443 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008379.html +# Email sent directly to teor, verified using relay contact info +91.121.84.137:4951 orport=4051 id=6DE61A6F72C1E5418A66BFED80DFB63E4C77668F ipv6=[2001:41d0:1:8989::1]:4051 +91.121.84.137:4952 orport=4052 id=9FBEB75E8BC142565F12CBBE078D63310236A334 ipv6=[2001:41d0:1:8989::1]:4052 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008381.html +# Sent additional email to teor with more relays +178.254.44.135:9030 orport=9001 id=8FA37B93397015B2BC5A525C908485260BE9F422 +178.254.20.134:80 orport=443 id=9F5068310818ED7C70B0BC4087AB55CB12CB4377 +178.254.20.134:9030 orport=9001 id=2CE96A8A1DA032664C90F574AFFBECE18A6E8DFC +178.254.44.135:80 orport=443 id=AE6A8C18E7499B586CD36246AC4BCAFFBBF93AB2 +178.254.13.126:80 orport=443 id=F9246DEF2B653807236DA134F2AEAB103D58ABFE +178.254.13.126:9030 orport=9001 id=0C475BA4D3AA3C289B716F95954CAD616E50C4E5 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008382.html +51.255.33.237:9091 orport=9001 id=A360C21FA87FFA2046D92C17086A6B47E5C68109 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008383.html +81.7.14.246:80 orport=443 id=CE75BF0972ADD52AF8807602374E495C815DB304 ipv6=[2a02:180:a:51::dead]:443 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008384.html +# Sent additional email to teor with fingerprint change +149.202.98.161:80 orport=443 id=FC64CD763F8C1A319BFBBF62551684F4E1E42332 ipv6=[2001:41d0:8:4528::161]:443 +193.111.136.162:80 orport=443 id=C79552275DFCD486B942510EF663ED36ACA1A84B ipv6=[2001:4ba0:cafe:10d0::1]:443 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008416.html +185.100.84.212:80 orport=443 id=330CD3DB6AD266DC70CDB512B036957D03D9BC59 ipv6=[2a06:1700:0:7::1]:443 + +# https://lists.torproject.org/pipermail/tor-relays/2015-December/008417.html +178.16.208.56:80 orport=443 id=2CDCFED0142B28B002E89D305CBA2E26063FADE2 ipv6=[2a00:1c20:4089:1234:cd49:b58a:9ebe:67ec]:443 +178.16.208.57:80 orport=443 id=92CFD9565B24646CAC2D172D3DB503D69E777B8A ipv6=[2a00:1c20:4089:1234:7825:2c5d:1ecd:c66f]:443 + +# https://lists.torproject.org/pipermail/tor-relays/2016-January/008513.html +178.62.173.203:9030 orport=9001 id=DD85503F2D1F52EF9EAD621E942298F46CD2FC10 ipv6=[2a03:b0c0:0:1010::a4:b001]:9001 + +# https://lists.torproject.org/pipermail/tor-relays/2016-January/008534.html +5.9.110.236:9030 orport=9001 id=0756B7CD4DFC8182BE23143FAC0642F515182CEB ipv6=[2a01:4f8:162:51e2::2]:9001 + +# https://lists.torproject.org/pipermail/tor-relays/2016-January/008542.html +178.62.199.226:80 orport=443 id=CBEFF7BA4A4062045133C053F2D70524D8BBE5BE ipv6=[2a03:b0c0:2:d0::b7:5001]:443 + +# Email sent directly to teor, verified using relay contact info +94.23.204.175:9030 orport=9001 id=5665A3904C89E22E971305EE8C1997BCA4123C69 + +# Email sent directly to teor, verified using relay contact info +171.25.193.77:80 orport=443 id=A10C4F666D27364036B562823E5830BC448E046A ipv6=[2001:67c:289c:3::77]:443 +171.25.193.78:80 orport=443 id=A478E421F83194C114F41E94F95999672AED51FE ipv6=[2001:67c:289c:3::78]:443 +171.25.193.131:80 orport=443 id=79861CF8522FC637EF046F7688F5289E49D94576 +171.25.193.20:80 orport=443 id=DD8BD7307017407FCC36F8D04A688F74A0774C02 ipv6=[2001:67c:289c::20]:443 +# OK, but same machine as 79861CF8522FC637EF046F7688F5289E49D94576 +#171.25.193.132:80 orport=443 id=01C67E0CA8F97111E652C7564CB3204361FFFAB8 +# OK, but same machine as DD8BD7307017407FCC36F8D04A688F74A0774C02 +#171.25.193.25:80 orport=443 id=185663B7C12777F052B2C2D23D7A239D8DA88A0F ipv6=[2001:67c:289c::25]:443 + +# Email sent directly to teor, verified using relay contact info +212.47.229.2:9030 orport=9001 id=20462CBA5DA4C2D963567D17D0B7249718114A68 ipv6=[2001:bc8:4400:2100::f03]:9001 +93.115.97.242:9030 orport=9001 id=B5212DB685A2A0FCFBAE425738E478D12361710D +46.28.109.231:9030 orport=9001 id=F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610 ipv6=[2a02:2b88:2:1::4205:1]:9001 + +# Email sent directly to teor, verified using relay contact info +85.235.250.88:80 orport=443 id=72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE +185.96.180.29:80 orport=443 id=F93D8F37E35C390BCAD9F9069E13085B745EC216 + +# Email sent directly to teor, verified using relay contact info +185.11.180.67:80 orport=9001 id=794D8EA8343A4E820320265D05D4FA83AB6D1778 + +# Email sent directly to teor, verified using relay contact info +178.16.208.62:80 orport=443 id=5CF8AFA5E4B0BB88942A44A3F3AAE08C3BDFD60B ipv6=[2a00:1c20:4089:1234:a6a4:2926:d0af:dfee]:443 +46.165.221.166:80 orport=443 id=EE5F897C752D46BCFF531641B853FC6BC78DD4A7 +178.16.208.60:80 orport=443 id=B44FBE5366AD98B46D829754FA4AC599BAE41A6A ipv6=[2a00:1c20:4089:1234:67bc:79f3:61c0:6e49]:443 +178.16.208.55:80 orport=443 id=C4AEA05CF380BAD2230F193E083B8869B4A29937 ipv6=[2a00:1c20:4089:1234:7b2c:11c5:5221:903e]:443 +178.16.208.61:80 orport=443 id=3B52392E2256C35CDCF7801FF898FC88CE6D431A ipv6=[2a00:1c20:4089:1234:2712:a3d0:666b:88a6]:443 +81.89.96.88:80 orport=443 id=55ED4BB49F6D3F36D8D9499BE43500E017A5EF82 ipv6=[2a02:180:1:1:14c5:b0b7:2d7d:5f3a]:443 +209.222.8.196:80 orport=443 id=C86D2F3DEFE287A0EEB28D4887AF14E35C172733 ipv6=[2001:19f0:1620:41c1:426c:5adf:2ed5:4e88]:443 +81.89.96.89:80 orport=443 id=28651F419F5A1CF74511BB500C58112192DD4943 ipv6=[2a02:180:1:1:2ced:24e:32ea:a03b]:443 +46.165.221.166:9030 orport=9001 id=8C7106C880FE8AA1319DD71B59623FCB8914C9F1 +178.16.208.62:80 orport=443 id=5CF8AFA5E4B0BB88942A44A3F3AAE08C3BDFD60B ipv6=[2a00:1c20:4089:1234:a6a4:2926:d0af:dfee]:443" +46.165.221.166:80 orport=443 id=EE5F897C752D46BCFF531641B853FC6BC78DD4A7 +178.16.208.60:80 orport=443 id=B44FBE5366AD98B46D829754FA4AC599BAE41A6A ipv6=[2a00:1c20:4089:1234:67bc:79f3:61c0:6e49]:443 +178.16.208.55:80 orport=443 id=C4AEA05CF380BAD2230F193E083B8869B4A29937 ipv6=[2a00:1c20:4089:1234:7b2c:11c5:5221:903e]:443 +178.16.208.61:80 orport=443 id=3B52392E2256C35CDCF7801FF898FC88CE6D431A ipv6=[2a00:1c20:4089:1234:2712:a3d0:666b:88a6]:443 +81.89.96.88:80 orport=443 id=55ED4BB49F6D3F36D8D9499BE43500E017A5EF82 ipv6=[2a02:180:1:1:14c5:b0b7:2d7d:5f3a]:443 +209.222.8.196:80 orport=443 id=C86D2F3DEFE287A0EEB28D4887AF14E35C172733 ipv6=[2001:19f0:1620:41c1:426c:5adf:2ed5:4e88]:443 +81.89.96.89:80 orport=443 id=28651F419F5A1CF74511BB500C58112192DD4943 ipv6=[2a02:180:1:1:2ced:24e:32ea:a03b]:443 +46.165.221.166:9030 orport=9001 id=8C7106C880FE8AA1319DD71B59623FCB8914C9F1 +178.16.208.56:80 orport=443 id=2CDCFED0142B28B002E89D305CBA2E26063FADE2 ipv6=[2a00:1c20:4089:1234:cd49:b58a:9ebe:67ec]:443 +178.16.208.58:80 orport=443 id=A4C98CEA3F34E05299417E9F885A642C88EF6029 ipv6=[2a00:1c20:4089:1234:cdae:1b3e:cc38:3d45]:443 +178.16.208.57:80 orport=443 id=92CFD9565B24646CAC2D172D3DB503D69E777B8A ipv6=[2a00:1c20:4089:1234:7825:2c5d:1ecd:c66f]:443 +178.16.208.59:80 orport=443 id=136F9299A5009A4E0E96494E723BDB556FB0A26B ipv6=[2a00:1c20:4089:1234:bff6:e1bb:1ce3:8dc6]:443 + +# Email sent directly to teor, verified using relay contact info +5.39.76.158:80 orport=443 id=C41F60F8B00E7FEF5CCC5BC6BB514CA1B8AAB651 + +# Email sent directly to teor, verified using relay contact info +109.163.234.2:80 orport=443 id=14F92FF956105932E9DEC5B82A7778A0B1BD9A52 +109.163.234.4:80 orport=443 id=4888770464F0E900EFEF1BA181EA873D13F7713C +109.163.234.5:80 orport=443 id=5EB8D862E70981B8690DEDEF546789E26AB2BD24 +109.163.234.7:80 orport=443 id=23038A7F2845EBA2234ECD6651BD4A7762F51B18 +109.163.234.8:80 orport=443 id=0818DAE0E2DDF795AEDEAC60B15E71901084F281 +109.163.234.9:80 orport=443 id=ABF7FBF389C9A747938B639B20E80620B460B2A9 +62.102.148.67:80 orport=443 id=4A0C3E177AF684581EF780981AEAF51A98A6B5CF +77.247.181.162:80 orport=443 id=7BB160A8F54BD74F3DA5F2CE701E8772B841859D +77.247.181.164:80 orport=443 id=10E13E340651D0EF66B4DEBF610B3C0981168107 +77.247.181.166:80 orport=443 id=06E123865C590189B3181114F23F0F13A7BC0E69 + +# https://twitter.com/biotimylated/status/718994247500718080 +212.47.252.149:9030 orport=9001 id=2CAC39BAA996791CEFAADC9D4754D65AF5EB77C0 + +# Email sent directly to teor, verified using relay contact info +46.165.230.5:80 orport=443 id=A0F06C2FADF88D3A39AA3072B406F09D7095AC9E + +# Email sent directly to teor, verified using relay contact info +94.242.246.24:23 orport=8080 id=EC116BCB80565A408CE67F8EC3FE3B0B02C3A065 ipv6=[2a01:608:ffff:ff07::1:24]:9004 +176.126.252.11:443 orport=9001 id=B0279A521375F3CB2AE210BDBFC645FDD2E1973A ipv6=[2a02:59e0:0:7::11]:9003 +176.126.252.12:21 orport=8080 id=379FB450010D17078B3766C2273303C358C3A442 ipv6=[2a02:59e0:0:7::12]:81 +94.242.246.23:443 orport=9001 id=F65E0196C94DFFF48AFBF2F5F9E3E19AAE583FD0 ipv6=[2a01:608:ffff:ff07::1:23]:9003 +85.248.227.164:444 orport=9002 id=B84F248233FEA90CAD439F292556A3139F6E1B82 ipv6=[2a00:1298:8011:212::164]:9004 +85.248.227.163:443 orport=9001 id=C793AB88565DDD3C9E4C6F15CCB9D8C7EF964CE9 ipv6=[2a00:1298:8011:212::163]:9003 + +# Email sent directly to teor, verified using relay contact info +148.251.190.229:9030 orport=9010 id=BF0FB582E37F738CD33C3651125F2772705BB8E8 ipv6=[2a01:4f8:211:c68::2]:9010 + +# Email sent directly to teor, verified using relay contact info +5.79.68.161:81 orport=443 id=9030DCF419F6E2FBF84F63CBACBA0097B06F557E ipv6=[2001:1af8:4700:a012:1::1]:443 +5.79.68.161:9030 orport=9001 id=B7EC0C02D7D9F1E31B0C251A6B058880778A0CD1 ipv6=[2001:1af8:4700:a012:1::1]:9001 + +# Email sent directly to teor, verified using relay contact info +62.210.92.11:9030 orport=9001 id=0266B0660F3F20A7D1F3D8335931C95EF50F6C6B ipv6=[2001:bc8:338c::1]:9001 +62.210.92.11:9130 orport=9101 id=387B065A38E4DAA16D9D41C2964ECBC4B31D30FF ipv6=[2001:bc8:338c::1]:9101 + +# Email sent directly to teor, verified using relay contact info +188.165.194.195:9030 orport=9001 id=49E7AD01BB96F6FE3AB8C3B15BD2470B150354DF + +# Message sent directly to teor, verified using relay contact info +95.215.44.110:80 orport=443 id=D56AA4A1AA71961F5279FB70A6DCF7AD7B993EB5 +95.215.44.122:80 orport=443 id=998D8FE06B867AA3F8D257A7D28FFF16964D53E2 +95.215.44.111:80 orport=443 id=A7C7FD510B20BC8BE8F2A1D911364E1A23FBD09F + +# Email sent directly to teor, verified using relay contact info +86.59.119.88:80 orport=443 id=ACD889D86E02EDDAB1AFD81F598C0936238DC6D0 +86.59.119.83:80 orport=443 id=FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B + +# Email sent directly to teor, verified using relay contact info +193.11.164.243:9030 orport=9001 id=FFA72BD683BC2FCF988356E6BEC1E490F313FB07 ipv6=[2001:6b0:7:125::243]:9001 +109.105.109.162:52860 orport=60784 id=32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F ipv6=[2001:948:7:2::163]:5001 + +# Email sent directly to teor, verified using relay contact info +146.0.32.144:9030 orport=9001 id=35E8B344F661F4F2E68B17648F35798B44672D7E + +# Email sent directly to teor, verified using relay contact info +46.252.26.2:45212 orport=49991 id=E589316576A399C511A9781A73DA4545640B479D + +# Email sent directly to teor, verified using relay contact info +89.187.142.208:80 orport=443 id=64186650FFE4469EBBE52B644AE543864D32F43C + +# Email sent directly to teor, verified using relay contact info +212.51.134.123:9030 orport=9001 id=50586E25BE067FD1F739998550EDDCB1A14CA5B2 ipv6=[2a02:168:6e00:0:3a60:77ff:fe9c:8bd1]:9001 + +# Email sent directly to teor, verified using relay contact info +46.101.143.173:80 orport=443 id=F960DF50F0FD4075AC9B505C1D4FFC8384C490FB + +# Email sent directly to teor, verified using relay contact info +217.79.190.25:9030 orport=9090 id=361D33C96D0F161275EE67E2C91EE10B276E778B + +# Email sent directly to teor, verified using relay contact info +193.171.202.146:9030 orport=9001 id=01A9258A46E97FF8B2CAC7910577862C14F2C524 + +# Email sent directly to teor, verified using relay contact info +197.231.221.211:9030 orport=9001 id=BC630CBBB518BE7E9F4E09712AB0269E9DC7D626 + +# Email sent directly to teor, verified using relay contact info +185.61.138.18:8080 orport=4443 id=2541759BEC04D37811C2209A88E863320271EC9C + +# Email sent directly to teor, verified using relay contact info +193.11.114.45:9031 orport=9002 id=80AAF8D5956A43C197104CEF2550CD42D165C6FB +193.11.114.43:9030 orport=9001 id=12AD30E5D25AA67F519780E2111E611A455FDC89 ipv6=[2001:6b0:30:1000::99]:9050 +193.11.114.46:9032 orport=9003 id=B83DC1558F0D34353BB992EF93AFEAFDB226A73E + +# Email sent directly to teor, verified using relay contact info +144.76.26.175:9012 orport=9011 id=2BA2C8E96B2590E1072AECE2BDB5C48921BF8510 + +# Email sent directly to teor, verified using relay contact info +37.221.162.226:9030 orport=9001 id=D64366987CB39F61AD21DBCF8142FA0577B92811 + +# Email sent directly to teor, verified using relay contact info +91.219.237.244:80 orport=443 id=92ECC9E0E2AF81BB954719B189AC362E254AD4A5 + +# Email sent directly to teor, verified using relay contact info +185.21.100.50:9030 orport=9001 id=58ED9C9C35E433EE58764D62892B4FFD518A3CD0 ipv6=[2a00:1158:2:cd00:0:74:6f:72]:443 + +# Email sent directly to teor, verified using relay contact info +193.35.52.53:9030 orport=9001 id=DAA39FC00B196B353C2A271459C305C429AF09E4 + +# Email sent directly to teor, verified using relay contact info +134.119.3.164:9030 orport=9001 id=D1B8AAA98C65F3DF7D8BB3AF881CAEB84A33D8EE + +# Email sent directly to teor, verified using relay contact info +81.7.10.93:31336 orport=31337 id=99E246DB480B313A3012BC3363093CC26CD209C7 + +# Email sent directly to teor, verified using relay contact info +178.62.22.36:80 orport=443 id=A0766C0D3A667A3232C7D569DE94A28F9922FCB1 ipv6=[2a03:b0c0:1:d0::174:1]:9050 +188.166.23.127:80 orport=443 id=8672E8A01B4D3FA4C0BBE21C740D4506302EA487 ipv6=[2a03:b0c0:2:d0::27b:7001]:9050 +198.199.64.217:80 orport=443 id=B1D81825CFD7209BD1B4520B040EF5653C204A23 ipv6=[2604:a880:400:d0::1a9:b001]:9050 +159.203.32.149:80 orport=443 id=55C7554AFCEC1062DCBAC93E67B2E03C6F330EFC ipv6=[2604:a880:cad:d0::105:f001]:9050 + +# Email sent directly to teor, verified using relay contact info +5.196.31.80:9030 orport=9900 id=DFB2EB472643FAFCD5E73D2E37D51DB67203A695 ipv6=[2001:41d0:52:400::a65]:9900 + +# Email sent directly to teor, verified using relay contact info +188.138.112.60:1433 orport=1521 id=C414F28FD2BEC1553024299B31D4E726BEB8E788 + +# Email sent directly to teor, verified using relay contact info +213.61.66.118:9031 orport=9001 id=30648BC64CEDB3020F4A405E4AB2A6347FB8FA22 +213.61.66.117:9032 orport=9002 id=6E44A52E3D1FF7683FE5C399C3FB5E912DE1C6B4 +213.61.66.115:9034 orport=9004 id=480CCC94CEA04D2DEABC0D7373868E245D4C2AE2 +213.61.66.116:9033 orport=9003 id=A9DEB920B42B4EC1DE6249034039B06D61F38690 + +# Email sent directly to teor, verified using relay contact info +136.243.187.165:9030 orport=443 id=1AC65257D7BFDE7341046625470809693A8ED83E + +# Email sent directly to teor, verified using relay contact info +212.47.230.49:9030 orport=9001 id=3D6D0771E54056AEFC28BB1DE816951F11826E97 + +# Email sent directly to teor, verified using relay contact info +192.99.55.69:80 orport=443 id=0682DE15222A4A4A0D67DBA72A8132161992C023 +192.99.59.140:80 orport=443 id=3C9148DA49F20654730FAC83FFF693A4D49D0244 +51.254.215.13:80 orport=443 id=73C30C8ABDD6D9346C822966DE73B9F82CB6178A +51.254.215.129:80 orport=443 id=7B4491D05144B20AE8519AE784B94F0525A8BB79 +192.99.59.139:80 orport=443 id=82EC878ADA7C205146B9F5193A7310867FAA0D7B +51.254.215.124:80 orport=443 id=98999EBE89B5FA9AA0C58421F0B46C3D0AF51CBA +51.254.214.208:80 orport=443 id=C3F0D1417848EAFC41277A73DEB4A9F2AEC23DDF +192.99.59.141:80 orport=443 id=F45426551795B9DA78BEDB05CD5F2EACED8132E4 +192.99.59.14:80 orport=443 id=161A1B29A37EBF096D2F8A9B1E176D6487FE42AE + +# Email sent directly to teor, verified using relay contact info +151.80.42.103:9030 orport=9001 id=9007C1D8E4F03D506A4A011B907A9E8D04E3C605 ipv6=[2001:41d0:e:f67::114]:9001 + +# Email sent directly to teor, verified using relay contact info +5.39.92.199:80 orport=443 id=0BEA4A88D069753218EAAAD6D22EA87B9A1319D6 ipv6=[2001:41d0:8:b1c7::1]:443 + +# Email sent directly to teor, verified using relay contact info +176.31.159.231:80 orport=443 id=D5DBCC0B4F029F80C7B8D33F20CF7D97F0423BB1 +176.31.159.230:80 orport=443 id=631748AFB41104D77ADBB7E5CD4F8E8AE876E683 +195.154.79.128:80 orport=443 id=C697612CA5AED06B8D829FCC6065B9287212CB2F +195.154.9.161:80 orport=443 id=B6295A9960F89BD0C743EEBC5670450EA6A34685 +46.148.18.74:8080 orport=443 id=6CACF0B5F03C779672F3C5C295F37C8D234CA3F7 + +# Email sent directly to teor, verified using relay contact info +37.187.102.108:9090 orport=5550 id=F4263275CF54A6836EE7BD527B1328836A6F06E1 +212.47.241.21:80 orport=443 id=892F941915F6A0C6E0958E52E0A9685C190CF45C + +# Email sent directly to teor, verified using relay contact info +212.129.38.254:9030 orport=9001 id=FDF845FC159C0020E2BDDA120C30C5C5038F74B4 + +# Email sent directly to teor, verified using relay contact info +37.157.195.87:8030 orport=443 id=12FD624EE73CEF37137C90D38B2406A66F68FAA2 + +# Email sent directly to teor, verified using relay contact info +37.187.7.74:80 orport=443 id=AEA43CB1E47BE5F8051711B2BF01683DB1568E05 ipv6=[2001:41d0:a:74a::1]:443 + +# Email sent directly to teor, verified using relay contact info +185.66.250.141:9030 orport=9001 id=B1726B94885CE3AC3910CA8B60622B97B98E2529 + +# Email sent directly to teor, verified using relay contact info +185.104.120.7:9030 orport=443 id=445F1C853966624FB3CF1E12442570DC553CC2EC ipv6=[2a06:3000::120:7]:443 +185.104.120.2:9030 orport=21 id=518FF8708698E1DA09C823C36D35DF89A2CAD956 +185.104.120.4:9030 orport=9001 id=F92B3CB9BBE0CB22409843FB1AE4DBCD5EFAC835 +185.104.120.3:9030 orport=21 id=707C1B61AC72227B34487B56D04BAA3BA1179CE8 ipv6=[2a06:3000::120:3]:21 + +# Email sent directly to teor, verified using relay contact info +37.187.102.186:9030 orport=9001 id=489D94333DF66D57FFE34D9D59CC2D97E2CB0053 ipv6=[2001:41d0:a:26ba::1]:9001 + +# Email sent directly to teor, verified using relay contact info +198.96.155.3:8080 orport=5001 id=BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E + +# Email sent directly to teor, verified using relay contact info +212.83.154.33:8888 orport=443 id=3C79699D4FBC37DE1A212D5033B56DAE079AC0EF +212.83.154.33:8080 orport=8443 id=322C6E3A973BC10FC36DE3037AD27BC89F14723B + +# Email sent directly to teor, verified using relay contact info +51.255.41.65:9030 orport=9001 id=9231DF741915AA1630031A93026D88726877E93A + +# Email sent directly to teor, verified using relay contact info +78.142.142.246:80 orport=443 id=5A5E03355C1908EBF424CAF1F3ED70782C0D2F74 + +# Email sent directly to teor, verified using relay contact info +195.154.97.91:80 orport=443 id=BD33C50D50DCA2A46AAED54CA319A1EFEBF5D714 + +# Email sent directly to teor, verified using relay contact info +62.210.129.246:80 orport=443 id=79E169B25E4C7CE99584F6ED06F379478F23E2B8 + +# Email sent directly to teor, verified using relay contact info +5.196.74.215:9030 orport=9001 id=5818055DFBAF0FA7F67E8125FD63E3E7F88E28F6 + +# Email sent directly to teor, verified using relay contact info +212.47.233.86:9030 orport=9001 id=B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20 + +# Email sent directly to teor, verified using relay contact info +85.214.206.219:9030 orport=9001 id=98F8D5F359949E41DE8DF3DBB1975A86E96A84A0 + +# Email sent directly to teor, verified using relay contact info +46.166.170.4:80 orport=443 id=19F42DB047B72C7507F939F5AEA5CD1FA4656205 +46.166.170.5:80 orport=443 id=DA705AD4591E7B4708FA2CAC3D53E81962F3E6F6 + +# Email sent directly to teor, verified using relay contact info +5.189.157.56:80 orport=443 id=77F6D6A6B6EAFB8F5DADDC07A918BBF378ED6725 + +# Email sent directly to teor, verified using relay contact info +46.28.110.244:80 orport=443 id=9F7D6E6420183C2B76D3CE99624EBC98A21A967E +185.13.39.197:80 orport=443 id=001524DD403D729F08F7E5D77813EF12756CFA8D +95.130.12.119:80 orport=443 id=587E0A9552E4274B251F29B5B2673D38442EE4BF + +# Email sent directly to teor, verified using relay contact info +212.129.62.232:80 orport=443 id=B143D439B72D239A419F8DCE07B8A8EB1B486FA7 + +# Email sent directly to teor, verified using relay contact info +91.219.237.229:80 orport=443 id=1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7 + +# Email sent directly to teor, verified using relay contact info +212.47.240.10:82 orport=443 id=2A4C448784F5A83AFE6C78DA357D5E31F7989DEB +# Ok, but on the same machine as 2A4C448784F5A83AFE6C78DA357D5E31F7989DEB +#212.47.240.10:81 orport=993 id=72527E3242CB15AADE28374AE0D35833FC083F60 +163.172.131.88:80 orport=443 id=AD253B49E303C6AB1E048B014392AC569E8A7DAE ipv6=[2001:bc8:4400:2100::2:1009]:443 +# Ok, but on the same machine as AD253B49E303C6AB1E048B014392AC569E8A7DAE +#163.172.131.88:81 orport=993 id=D5F3FB17504744FB7ECEF46F4B1D155258A6D942 ipv6=[2001:bc8:4400:2100::2:1009]:993 + +# Email sent directly to teor, verified using relay contact info +46.101.151.222:80 orport=443 id=1DBAED235E3957DE1ABD25B4206BE71406FB61F8 +178.62.60.37:80 orport=443 id=175921396C7C426309AB03775A9930B6F611F794 + +# Email sent directly to teor, verified using relay contact info +178.62.197.82:80 orport=443 id=0D3EBA17E1C78F1E9900BABDB23861D46FCAF163 + +# Email sent directly to teor, verified using relay contact info +82.223.21.74:9030 orport=9001 id=7A32C9519D80CA458FC8B034A28F5F6815649A98 ipv6=[2001:470:53e0::cafe]:9050 + +# Email sent directly to teor, verified using relay contact info +146.185.177.103:80 orport=9030 id=9EC5E097663862DF861A18C32B37C5F82284B27D + +# Email sent directly to teor, verified using relay contact info +37.187.22.87:9030 orport=9001 id=36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400 ipv6=[2001:41d0:a:1657::1]:9001 + +# Email sent directly to teor, verified using relay contact info +37.59.46.159:9030 orport=9001 id=CBD0D1BD110EC52963082D839AC6A89D0AE243E7 + +# Email sent directly to teor, verified using relay contact info +212.47.250.243:9030 orport=9001 id=5B33EDBAEA92F446768B3753549F3B813836D477 +# Confirm with operator before adding these +#163.172.133.36:9030 orport=9001 id=D8C2BD36F01FA86F4401848A0928C4CB7E5FDFF9 +#158.69.216.70:9030 orport=9001 id=0ACE25A978D4422C742D6BC6345896719BF6A7EB + +# Email sent directly to teor, verified using relay contact info +5.199.142.236:9030 orport=9001 id=F4C0EDAA0BF0F7EC138746F8FEF1CE26C7860265 + +# Email sent directly to teor, verified using relay contact info +188.166.133.133:9030 orport=9001 id=774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7 ipv6=[2a03:b0c0:2:d0::5:f001]:9001 + +# Email sent directly to teor, verified using relay contact info +46.8.249.10:80 orport=443 id=31670150090A7C3513CB7914B9610E786391A95D + +# Email sent directly to teor, verified using relay contact info +144.76.163.93:9030 orport=9001 id=22F08CF09764C4E8982640D77F71ED72FF26A9AC + +# Email sent directly to teor, verified using relay contact info +46.4.24.161:9030 orport=9001 id=DB4C76A3AD7E234DA0F00D6F1405D8AFDF4D8DED +46.4.24.161:9031 orport=9002 id=7460F3D12EBE861E4EE073F6233047AACFE46AB4 +46.38.51.132:9030 orport=9001 id=810DEFA7E90B6C6C383C063028EC397A71D7214A +163.172.194.53:9030 orport=9001 id=8C00FA7369A7A308F6A137600F0FA07990D9D451 ipv6=[2001:bc8:225f:142:6c69:7461:7669:73]:9001 + +# Email sent directly to teor, verified using relay contact info +176.10.107.180:9030 orport=9001 id=3D7E274A87D9A89AF064C13D1EE4CA1F184F2600 + +# Email sent directly to teor, verified using relay contact info +46.28.207.19:80 orport=443 id=5B92FA5C8A49D46D235735504C72DBB3472BA321 +46.28.207.141:80 orport=443 id=F69BED36177ED727706512BA6A97755025EEA0FB +46.28.205.170:80 orport=443 id=AF322D83A4D2048B22F7F1AF5F38AFF4D09D0B76 +95.183.48.12:80 orport=443 id=7187CED1A3871F837D0E60AC98F374AC541CB0DA + +# Email sent directly to teor, verified using relay contact info +93.180.156.84:9030 orport=9001 id=8844D87E9B038BE3270938F05AF797E1D3C74C0F + +# Email sent directly to teor, verified using relay contact info +37.187.115.157:9030 orport=9001 id=D5039E1EBFD96D9A3F9846BF99EC9F75EDDE902A + +# Email sent directly to teor, verified using relay contact info +5.34.183.205:80 orport=443 id=DDD7871C1B7FA32CB55061E08869A236E61BDDF8 + +# Email sent directly to teor, verified using relay contact info +51.254.246.203:9030 orport=9001 id=47B596B81C9E6277B98623A84B7629798A16E8D5 + +# Email sent directly to teor, verified using relay contact info +5.9.146.203:80 orport=443 id=1F45542A24A61BF9408F1C05E0DCE4E29F2CBA11 + +# Email sent directly to teor, verified using relay contact info +# Updated details from atlas based on ticket #20010 +163.172.176.167:80 orport=443 id=230A8B2A8BA861210D9B4BA97745AEC217A94207 +163.172.149.155:80 orport=443 id=0B85617241252517E8ECF2CFC7F4C1A32DCD153F +163.172.149.122:80 orport=443 id=A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2 + +# Email sent directly to teor, verified using relay contact info +204.11.50.131:9030 orport=9001 id=185F2A57B0C4620582602761097D17DB81654F70 + +# Email sent directly to teor, verified using relay contact info +151.236.222.217:44607 orport=9001 id=94D58704C2589C130C9C39ED148BD8EA468DBA54 + +# Email sent directly to teor, verified using relay contact info +185.35.202.221:9030 orport=9001 id=C13B91384CDD52A871E3ECECE4EF74A7AC7DCB08 ipv6=[2a02:ed06::221]:9001 + +# Email sent directly to teor, verified using relay contact info +5.9.151.241:9030 orport=4223 id=9BF04559224F0F1C3C953D641F1744AF0192543A ipv6=[2a01:4f8:190:34f0::2]:4223 + +# Email sent directly to teor, verified using relay contact info +89.40.71.149:8081 orport=8080 id=EC639EDAA5121B47DBDF3D6B01A22E48A8CB6CC7 + +# Email sent directly to teor, verified using relay contact info +92.222.20.130:80 orport=443 id=0639612FF149AA19DF3BCEA147E5B8FED6F3C87C + +# Email sent directly to teor, verified using relay contact info +80.112.155.100:9030 orport=9001 id=53B000310984CD86AF47E5F3CD0BFF184E34B383 ipv6=[2001:470:7b02::38]:9001 + +# Email sent directly to teor, verified using relay contact info +83.212.99.68:80 orport=443 id=DDBB2A38252ADDA53E4492DDF982CA6CC6E10EC0 ipv6=[2001:648:2ffc:1225:a800:bff:fe3d:67b5]:443 + +# Email sent directly to teor, verified using relay contact info +95.130.11.147:9030 orport=443 id=6B697F3FF04C26123466A5C0E5D1F8D91925967A + +# Email sent directly to teor, verified using relay contact info +176.31.191.26:80 orport=443 id=7350AB9ED7568F22745198359373C04AC783C37C + +# Email sent directly to teor, verified using relay contact info +128.199.55.207:9030 orport=9001 id=BCEF908195805E03E92CCFE669C48738E556B9C5 ipv6=[2a03:b0c0:2:d0::158:3001]:9001 + +# Email sent directly to teor, verified using relay contact info +178.32.216.146:9030 orport=9001 id=17898F9A2EBC7D69DAF87C00A1BD2FABF3C9E1D2 + +# Email sent directly to teor, verified using relay contact info +212.83.40.238:9030 orport=9001 id=F409FA7902FD89270E8DE0D7977EA23BC38E5887 + +# Email sent directly to teor, verified using relay contact info +204.8.156.142:80 orport=443 id=94C4B7B8C50C86A92B6A20107539EE2678CF9A28 + +# Email sent directly to teor, verified using relay contact info +80.240.139.111:80 orport=443 id=DD3BE7382C221F31723C7B294310EF9282B9111B + +# Email sent directly to teor, verified using relay contact info +185.97.32.18:9030 orport=9001 id=04250C3835019B26AA6764E85D836088BE441088 + +# Email sent directly to teor, verified using relay contact info +149.56.45.200:9030 orport=9001 id=FE296180018833AF03A8EACD5894A614623D3F76 + +# Email sent directly to teor, verified using relay contact info +81.2.209.10:443 orport=80 id=B6904ADD4C0D10CDA7179E051962350A69A63243 ipv6=[2001:15e8:201:1::d10a]:80 + +# Email sent directly to teor, verified using relay contact info +# IPv6 address unreliable +195.154.164.243:80 orport=443 id=AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C #ipv6=[2001:bc8:399f:f000::1]:993 +138.201.26.2:80 orport=443 id=6D3A3ED5671E4E3F58D4951438B10AE552A5FA0F +81.7.16.182:80 orport=443 id=51E1CF613FD6F9F11FE24743C91D6F9981807D82 ipv6=[2a02:180:1:1::517:10b6]:993 +134.119.36.135:80 orport=443 id=763C9556602BD6207771A7A3D958091D44C43228 ipv6=[2a00:1158:3::2a8]:993 +46.228.199.19:80 orport=443 id=E26AFC5F718E21AC502899B20C653AEFF688B0D2 ipv6=[2001:4ba0:cafe:4a::1]:993 +37.200.98.5:80 orport=443 id=231C2B9C8C31C295C472D031E06964834B745996 ipv6=[2a00:1158:3::11a]:993 +46.23.70.195:80 orport=443 id=C9933B3725239B6FAB5227BA33B30BE7B48BB485 +185.15.244.124:80 orport=443 id=935BABE2564F82016C19AEF63C0C40B5753BA3D2 ipv6=[2001:4ba0:cafe:e35::1]:993 +195.154.116.232:80 orport=443 id=B35C5739C8C5AB72094EB2B05738FD1F8EEF6EBD ipv6=[2001:bc8:399f:200::1]:993 +195.154.121.198:80 orport=443 id=0C77421C890D16B6D201283A2244F43DF5BC89DD ipv6=[2001:bc8:399f:100::1]:993 +37.187.20.59:80 orport=443 id=91D23D8A539B83D2FB56AA67ECD4D75CC093AC55 ipv6=[2001:41d0:a:143b::1]:993 +217.12.208.117:80 orport=443 id=E6E18151300F90C235D3809F90B31330737CEB43 ipv6=[2a00:1ca8:a7::1bb]:993 +81.7.10.251:80 orport=443 id=8073670F8F852971298F8AF2C5B23AE012645901 ipv6=[2a02:180:1:1::517:afb]:993 +46.36.39.50:80 orport=443 id=ED4B0DBA79AEF5521564FA0231455DCFDDE73BB6 ipv6=[2a02:25b0:aaaa:aaaa:8d49:b692:4852:0]:995 +91.194.90.103:80 orport=443 id=75C4495F4D80522CA6F6A3FB349F1B009563F4B7 ipv6=[2a02:c205:3000:5449::1]:993 +163.172.25.118:80 orport=22 id=0CF8F3E6590F45D50B70F2F7DA6605ECA6CD408F +188.138.88.42:80 orport=443 id=70C55A114C0EF3DC5784A4FAEE64388434A3398F +81.7.13.84:80 orport=443 id=0C1E7DD9ED0676C788933F68A9985ED853CA5812 ipv6=[2a02:180:1:1::5b8f:538c]:993 +213.246.56.95:80 orport=443 id=27E6E8E19C46751E7312420723C6162FF3356A4C ipv6=[2a00:c70:1:213:246:56:95:1]:993 +94.198.100.18:80 orport=443 id=BAACCB29197DB833F107E410E2BFAE5009EE7583 +217.12.203.46:80 orport=443 id=6A29FD8C00D573E6C1D47852345B0E5275BA3307 +212.117.180.107:80 orport=443 id=0B454C7EBA58657B91133A587C1BDAEDC6E23142 +217.12.199.190:80 orport=443 id=A37C47B03FF31CA6937D3D68366B157997FE7BCD ipv6=[2a02:27a8:0:2::486]:993 +216.230.230.247:80 orport=443 id=4C7BF55B1BFF47993DFF995A2926C89C81E4F04A +69.30.215.42:80 orport=443 id=510176C07005D47B23E6796F02C93241A29AA0E9 ipv6=[2604:4300:a:2e::2]:993 +89.46.100.162:80 orport=443 id=6B7191639E179965FD694612C9B2C8FB4267B27D +107.181.174.22:80 orport=443 id=5A551BF2E46BF26CC50A983F7435CB749C752553 ipv6=[2607:f7a0:3:4::4e]:993 + +# Email sent directly to teor, verified using relay contact info +212.238.208.48:9030 orport=9001 id=F406219CDD339026D160E53FCA0EF6857C70F109 ipv6=[2001:984:a8fb:1:ba27:ebff:feac:c109]:9001 + +# Email sent directly to teor, verified using relay contact info +176.158.132.12:9030 orport=9001 id=DC163DDEF4B6F0C6BC226F9F6656A5A30C5C5686 + +# Email sent directly to teor, verified using relay contact info +91.229.20.27:9030 orport=9001 id=9A0D54D3A6D2E0767596BF1515E6162A75B3293F + +# Email sent directly to teor, verified using relay contact info +80.127.137.19:80 orport=443 id=6EF897645B79B6CB35E853B32506375014DE3621 ipv6=[2001:981:47c1:1::6]:443 + +# Email sent directly to teor, verified using relay contact info +163.172.138.22:80 orport=443 id=8664DC892540F3C789DB37008236C096C871734D ipv6=[2001:bc8:4400:2100::1:3]:443 + +# Email sent directly to teor, verified using relay contact info +97.74.237.196:9030 orport=9001 id=2F0F32AB1E5B943CA7D062C03F18960C86E70D94 + +# Email sent directly to teor, verified using relay contact info +192.187.124.98:9030 orport=9001 id=FD1871854BFC06D7B02F10742073069F0528B5CC + +# Email sent directly to teor, verified using relay contact info +178.62.98.160:9030 orport=9001 id=8B92044763E880996A988831B15B2B0E5AD1544A + +# Email sent directly to teor, verified using relay contact info +163.172.217.50:9030 orport=9001 id=02ECD99ECD596013A8134D46531560816ECC4BE6 + +# Email sent directly to teor, verified using relay contact info +185.100.86.100:80 orport=443 id=0E8C0C8315B66DB5F703804B3889A1DD66C67CE0 +185.100.84.82:80 orport=443 id=7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E + +# Email sent directly to teor, verified using relay contact info +164.132.77.175:9030 orport=9001 id=3B33F6FCA645AD4E91428A3AF7DC736AD9FB727B +78.24.75.53:9030 orport=9001 id=DEB73705B2929AE9BE87091607388939332EF123 + +# Email sent directly to teor, verified using relay contact info +46.101.237.246:9030 orport=9001 id=75F1992FD3F403E9C082A5815EB5D12934CDF46C ipv6=[2a03:b0c0:3:d0::208:5001]:9050 +178.62.86.96:9030 orport=9001 id=439D0447772CB107B886F7782DBC201FA26B92D1 ipv6=[2a03:b0c0:1:d0::3cf:7001]:9050 + +# Email sent directly to teor, verified using relay contact info +# Very low bandwidth, stale consensues, excluded to cut down on warnings +#91.233.106.121:80 orport=443 id=896364B7996F5DFBA0E15D1A2E06D0B98B555DD6 + +# Email sent directly to teor, verified using relay contact info +167.114.113.48:9030 orport=403 id=2EC0C66EA700C44670444280AABAB1EC78B722A0 + +# Email sent directly to teor, verified using relay contact info +79.120.16.42:9030 orport=9001 id=BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6 + +# Email sent directly to teor, verified using relay contact info +95.128.43.164:80 orport=443 id=616081EC829593AF4232550DE6FFAA1D75B37A90 ipv6=[2a02:ec0:209:10::4]:443 + +# Email sent directly to teor, verified using relay contact info +166.82.21.200:9030 orport=9029 id=D5C33F3E203728EDF8361EA868B2939CCC43FAFB + +# Email sent directly to teor, verified using relay contact info +91.121.54.8:9030 orport=9001 id=CBEE0F3303C8C50462A12107CA2AE061831931BC + +# Email sent directly to teor, verified using relay contact info +178.217.184.32:8080 orport=443 id=8B7F47AE1A5D954A3E58ACDE0865D09DBA5B738D + +# Email sent directly to teor, verified using relay contact info +85.10.201.47:9030 orport=9001 id=D8B7A3A6542AA54D0946B9DC0257C53B6C376679 ipv6=[2a01:4f8:a0:43eb::beef]:9001 + +# Email sent directly to teor, verified using relay contact info +120.29.217.46:80 orport=443 id=5E853C94AB1F655E9C908924370A0A6707508C62 + +# Email sent directly to teor, verified using relay contact info +37.153.1.10:9030 orport=9001 id=9772EFB535397C942C3AB8804FB35CFFAD012438 + +# Email sent directly to teor, verified using relay contact info +92.222.4.102:9030 orport=9001 id=1A6B8B8272632D8AD38442027F822A367128405C + +# Email sent directly to teor, verified using relay contact info +31.31.78.49:80 orport=443 id=46791D156C9B6C255C2665D4D8393EC7DBAA7798 + +# Email sent directly to teor, verified using relay contact info +96.47.231.214:9030 orport=8080 id=F843CB5729575D76FF1FFBB2179BDCF52C0C6387 +192.99.246.48:9030 orport=9001 id=CD6B149BED1BB254EF6DFF9D75DDB11E7F8A38A4 ipv6=[2607:5300:100:200::de3]:9002 +192.160.102.164:80 orport=9001 id=823AA81E277F366505545522CEDC2F529CE4DC3F ipv6=[2605:e200:d00c:c01d::1111]:9002 + +# Email sent directly to teor, verified using relay contact info +136.243.214.137:80 orport=443 id=B291D30517D23299AD7CEE3E60DFE60D0E3A4664 + +# Email sent directly to teor, verified using relay contact info +192.87.28.28:9030 orport=9001 id=ED2338CAC2711B3E331392E1ED2831219B794024 +192.87.28.82:9030 orport=9001 id=844AE9CAD04325E955E2BE1521563B79FE7094B7 + +# Email sent directly to teor, verified using relay contact info +192.87.28.28:9030 orport=9001 id=ED2338CAC2711B3E331392E1ED2831219B794024 +# OK, but same machine as ED2338CAC2711B3E331392E1ED2831219B794024 +#192.87.28.82:9030 orport=9001 id=844AE9CAD04325E955E2BE1521563B79FE7094B7 + +# https://twitter.com/kosjoli/status/719507270904758272 +85.10.202.87:9030 orport=9001 id=971AFB23C168DCD8EDA17473C1C452B359DE3A5A +176.9.5.116:9030 orport=9001 id=A1EB8D8F1EE28DB98BBB1EAA3B4BEDD303BAB911 +46.4.111.124:9030 orport=9001 id=D9065F9E57899B3D272AA212317AF61A9B14D204 + +# Email sent directly to teor, verified using relay contact info +185.100.85.61:80 orport=443 id=025B66CEBC070FCB0519D206CF0CF4965C20C96E + +# Email sent directly to teor, verified using relay contact info +108.166.168.158:80 orport=443 id=CDAB3AE06A8C9C6BF817B3B0F1877A4B91465699 + +# Email sent directly to teor, verified using relay contact info +91.219.236.222:80 orport=443 id=20704E7DD51501DC303FA51B738D7B7E61397CF6 + +# Email sent directly to teor, verified using relay contact info +185.14.185.240:9030 orport=443 id=D62FB817B0288085FAC38A6DC8B36DCD85B70260 +192.34.63.137:9030 orport=443 id=ABCB4965F1FEE193602B50A365425105C889D3F8 +128.199.197.16:9030 orport=443 id=DEE5298B3BA18CDE651421CD2DCB34A4A69F224D + +# Email sent directly to teor, verified using relay contact info +185.13.38.75:9030 orport=9001 id=D2A1703758A0FBBA026988B92C2F88BAB59F9361 + +# Email sent directly to teor, verified using relay contact info +128.204.39.106:9030 orport=9001 id=6F0F3C09AF9580F7606B34A7678238B3AF7A57B7 + +# Email sent directly to teor, verified using relay contact info +198.50.191.95:80 orport=443 id=39F096961ED2576975C866D450373A9913AFDC92 + +# Email sent directly to teor, verified using relay contact info +167.114.66.61:9696 orport=443 id=DE6CD5F09DF26076F26321B0BDFBE78ACD935C65 ipv6=[2607:5300:100::78d]:443 + +# Email sent directly to teor, verified using relay contact info +66.111.2.20:9030 orport=9001 id=9A68B85A02318F4E7E87F2828039FBD5D75B0142 +66.111.2.16:9030 orport=9001 id=3F092986E9B87D3FDA09B71FA3A602378285C77A + +# Email sent directly to teor, verified using relay contact info +92.222.38.67:80 orport=443 id=DED6892FF89DBD737BA689698A171B2392EB3E82 + +# Email sent directly to teor, verified using relay contact info +212.47.228.115:9030 orport=443 id=BCA017ACDA48330D02BB70716639ED565493E36E + +# Email sent directly to teor, verified using relay contact info +185.100.84.175:80 orport=443 id=39B59AF4FE54FAD8C5085FA9C15FDF23087250DB + +# Email sent directly to teor, verified using relay contact info +166.70.207.2:9030 orport=9001 id=E3DB2E354B883B59E8DC56B3E7A353DDFD457812 + +# Emails sent directly to teor, verified using relay contact info +69.162.139.9:9030 orport=9001 id=4791FC0692EAB60DF2BCCAFF940B95B74E7654F6 ipv6=[2607:f128:40:1212::45a2:8b09]:9001 + +# Email sent directly to teor, verified using relay contact info +213.239.217.18:1338 orport=1337 id=C37BC191AC389179674578C3E6944E925FE186C2 ipv6=[2a01:4f8:a0:746a:101:1:1:1]:1337 + +# Email sent directly to teor, verified using relay contact info +188.40.128.246:9030 orport=9001 id=AD19490C7DBB26D3A68EFC824F67E69B0A96E601 + +# Email sent directly to teor, verified using relay contact info +88.198.253.13:9030 orport=9001 id=DF924196D69AAE3C00C115A9CCDF7BB62A175310 ipv6=[2a01:4f8:11a:b1f::2]:9001 + +# Email sent directly to teor, verified using relay contact info +185.100.86.128:9030 orport=9001 id=9B31F1F1C1554F9FFB3455911F82E818EF7C7883 +46.36.36.127:9030 orport=9001 id=C80DF89B21FF932DEC0D7821F679B6C79E1449C3 + +# Email sent directly to teor, verified using relay contact info +176.10.104.240:80 orport=443 id=0111BA9B604669E636FFD5B503F382A4B7AD6E80 +176.10.104.240:8080 orport=8443 id=AD86CD1A49573D52A7B6F4A35750F161AAD89C88 +176.10.104.243:80 orport=443 id=88487BDD980BF6E72092EE690E8C51C0AA4A538C +176.10.104.243:8080 orport=8443 id=95DA61AEF23A6C851028C1AA88AD8593F659E60F + +# Email sent directly to teor, verified using relay contact info +107.170.101.39:9030 orport=443 id=30973217E70AF00EBE51797FF6D9AA720A902EAA + +# Email sent directly to teor, verified using relay contact info +192.99.212.139:80 orport=443 id=F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC + +# Email sent directly to teor, verified using relay contact info +163.172.35.249:80 orport=443 id=C08DE49658E5B3CFC6F2A952B453C4B608C9A16A +163.172.35.247:80 orport=443 id=71AB4726D830FAE776D74AEF790CF04D8E0151B4 + +# Email sent directly to teor, verified using relay contact info +64.113.32.29:9030 orport=9001 id=30C19B81981F450C402306E2E7CFB6C3F79CB6B2 + +# Email sent directly to teor, verified using relay contact info +212.51.156.193:995 orport=110 id=32E7AAF1F602814D699BEF6761AD03E387758D49 ipv6=[2a02:168:4a01::49]:110 + +# Emails sent directly to teor, verified using relay contact info +51.254.101.242:9002 orport=9001 id=4CC9CC9195EC38645B699A33307058624F660CCF + +# Emails sent directly to teor, verified using relay contact info +85.214.62.48:80 orport=443 id=6A7551EEE18F78A9813096E82BF84F740D32B911 + +# Email sent directly to teor, verified using relay contact info +173.255.245.116:9030 orport=9001 id=91E4015E1F82DAF0121D62267E54A1F661AB6DC7 + +# Email sent directly to teor, verified using relay contact info +62.216.5.120:9030 orport=9001 id=D032D4D617140D6B828FC7C4334860E45E414FBE + +# Email sent directly to teor, verified using relay contact info +51.254.136.195:80 orport=443 id=7BB70F8585DFC27E75D692970C0EEB0F22983A63 + +# Email sent directly to teor, verified using relay contact info +163.172.13.165:9030 orport=9001 id=33DA0CAB7C27812EFF2E22C9705630A54D101FEB ipv6=[2001:bc8:38cb:201::8]:9001 + +# Email sent directly to teor, verified using relay contact info +5.196.88.122:9030 orport=9001 id=0C2C599AFCB26F5CFC2C7592435924C1D63D9484 ipv6=[2001:41d0:a:fb7a::1]:9001 + +# Email sent directly to teor, verified using relay contact info +5.9.158.75:80 orport=443 id=1AF72E8906E6C49481A791A6F8F84F8DFEBBB2BA ipv6=[2a01:4f8:190:514a::2]:443 + +# Email sent directly to teor, verified using relay contact info +46.101.169.151:9030 orport=9001 id=D760C5B436E42F93D77EF2D969157EEA14F9B39C ipv6=[2a03:b0c0:3:d0::74f:a001]:9001 + +# Email sent directly to teor, verified using relay contact info +199.249.223.81:80 orport=443 id=F7447E99EB5CBD4D5EB913EE0E35AC642B5C1EF3 +199.249.223.79:80 orport=443 id=D33292FEDE24DD40F2385283E55C87F85C0943B6 +199.249.223.78:80 orport=443 id=EC15DB62D9101481F364DE52EB8313C838BDDC29 +199.249.223.77:80 orport=443 id=CC4A3AE960E3617F49BF9887B79186C14CBA6813 +199.249.223.76:80 orport=443 id=43209F6D50C657A56FE79AF01CA69F9EF19BD338 +199.249.223.75:80 orport=443 id=60D3667F56AEC5C69CF7E8F557DB21DDF6C36060 +199.249.223.74:80 orport=443 id=5F4CD12099AF20FAF9ADFDCEC65316A376D0201C +199.249.223.73:80 orport=443 id=5649CB2158DA94FB747415F26628BEC07FA57616 +199.249.223.72:80 orport=443 id=B028707969D8ED84E6DEA597A884F78AAD471971 +199.249.223.71:80 orport=443 id=B6320E44A230302C7BF9319E67597A9B87882241 +199.249.223.60:80 orport=443 id=B7047FBDE9C53C39011CA84E5CB2A8E3543066D0 +199.249.223.61:80 orport=443 id=40E7D6CE5085E4CDDA31D51A29D1457EB53F12AD +199.249.223.62:80 orport=443 id=0077BCBA7244DB3E6A5ED2746E86170066684887 +199.249.223.63:80 orport=443 id=1DB25DF59DAA01B5BE3D3CEB8AFED115940EBE8B +199.249.223.64:80 orport=443 id=9F2856F6D2B89AD4EF6D5723FAB167DB5A53519A +199.249.223.65:80 orport=443 id=9D21F034C3BFF4E7737D08CF775DC1745706801F +199.249.223.66:80 orport=443 id=C5A53BCC174EF8FD0DCB223E4AA929FA557DEDB2 +199.249.223.67:80 orport=443 id=155D6F57425F16C0624D77777641E4EB1B47C6F0 +199.249.223.68:80 orport=443 id=DF20497E487A979995D851A5BCEC313DF7E5BC51 +199.249.223.69:80 orport=443 id=7FA8E7E44F1392A4E40FFC3B69DB3B00091B7FD3 + +# https://lists.torproject.org/pipermail/tor-relays/2016-December/011114.html +86.105.212.130:9030 orport=443 id=9C900A7F6F5DD034CFFD192DAEC9CCAA813DB022 + +# Email sent directly to teor, verified using relay contact info +178.33.183.251:80 orport=443 id=DD823AFB415380A802DCAEB9461AE637604107FB ipv6=[2001:41d0:2:a683::251]:443 + +# Email sent directly to teor, verified using relay contact info +#31.185.104.19:80 orport=443 id=9EAD5B2D3DBD96DBC80DCE423B0C345E920A758D +# OK, but on same machine as 9EAD5B2D3DBD96DBC80DCE423B0C345E920A758D +31.185.104.20:80 orport=443 id=ADB2C26629643DBB9F8FE0096E7D16F9414B4F8D +#31.185.104.21:80 orport=443 id=C2AAB088555850FC434E68943F551072042B85F1 +#31.185.104.22:80 orport=443 id=5BA3A52760A0EABF7E7C3ED3048A77328FF0F148 + +# Email sent directly to teor, verified using relay contact info +185.34.60.114:80 orport=443 id=7F7A695DF6F2B8640A70B6ADD01105BC2EBC5135 + +# Email sent directly to teor, verified using relay contact info +94.142.242.84:80 orport=443 id=AA0D167E03E298F9A8CD50F448B81FBD7FA80D56 ipv6=[2a02:898:24:84::1]:443 + +# Email sent directly to teor, verified using relay contact info +185.129.62.62:9030 orport=9001 id=ACDD9E85A05B127BA010466C13C8C47212E8A38F ipv6=[2a06:d380:0:3700::62]:9001 + +# Email sent directly to teor, verified using relay contact info +# The e84 part of the IPv6 address does not have a leading 0 in the consensus +81.30.158.213:9030 orport=9001 id=789EA6C9AE9ADDD8760903171CFA9AC5741B0C70 ipv6=[2001:4ba0:cafe:e84::1]:9001 + +# https://lists.torproject.org/pipermail/tor-relays/2016-December/011209.html +5.9.159.14:9030 orport=9001 id=0F100F60C7A63BED90216052324D29B08CFCF797 + +# Email sent directly to teor, verified using relay contact info +45.62.255.25:80 orport=443 id=3473ED788D9E63361D1572B7E82EC54338953D2A + +# Email sent directly to teor, verified using relay contact info +217.79.179.177:9030 orport=9001 id=3E53D3979DB07EFD736661C934A1DED14127B684 ipv6=[2001:4ba0:fff9:131:6c4f::90d3]:9001 + +# Email sent directly to teor, verified using relay contact info +212.47.244.38:8080 orport=443 id=E81EF60A73B3809F8964F73766B01BAA0A171E20 +163.172.157.213:8080 orport=443 id=4623A9EC53BFD83155929E56D6F7B55B5E718C24 +163.172.139.104:8080 orport=443 id=68F175CCABE727AA2D2309BCD8789499CEE36ED7 + +# Email sent directly to teor, verified using relay contact info +163.172.223.200:80 orport=443 id=998BF3ED7F70E33D1C307247B9626D9E7573C438 +195.154.122.54:80 orport=443 id=64E99CB34C595A02A3165484BD1215E7389322C6 + +# Email sent directly to teor, verified using relay contact info +185.100.86.128:9030 orport=9001 id=9B31F1F1C1554F9FFB3455911F82E818EF7C7883 +185.100.85.101:9030 orport=9001 id=4061C553CA88021B8302F0814365070AAE617270 +31.171.155.108:9030 orport=9001 id=D3E5EDDBE5159388704D6785BE51930AAFACEC6F + +# Email sent directly to teor, verified using relay contact info +89.163.247.43:9030 orport=9001 id=BC7ACFAC04854C77167C7D66B7E471314ED8C410 ipv6=[2001:4ba0:fff7:25::5]:9001 + +# Email sent directly to teor, verified using relay contact info +95.85.8.226:80 orport=443 id=1211AC1BBB8A1AF7CBA86BCE8689AA3146B86423 + +# Email sent directly to teor, verified using relay contact info +85.214.151.72:9030 orport=9001 id=722D365140C8C52DBB3C9FF6986E3CEFFE2BA812 + +# Email sent directly to teor, verified using relay contact info +72.52.75.27:9030 orport=9001 id=1220F0F20E80D348244C5F3B6D126DAA0A446DFD + +# Email sent directly to teor, verified using relay contact info +5.9.146.203:80 orport=443 id=1F45542A24A61BF9408F1C05E0DCE4E29F2CBA11 +5.9.159.14:9030 orport=9001 id=0F100F60C7A63BED90216052324D29B08CFCF797 + +# Email sent directly to teor, verified using relay contact info +5.9.147.226:9030 orport=9001 id=B0553175AADB0501E5A61FC61CEA3970BE130FF2 diff --git a/src/wraith/scripts/maint/findMergedChanges.pl b/src/wraith/scripts/maint/findMergedChanges.pl new file mode 100644 index 000000000..d6c4105b7 --- /dev/null +++ b/src/wraith/scripts/maint/findMergedChanges.pl @@ -0,0 +1,73 @@ +#!/usr/bin/perl + +use warnings; +use strict; + +sub nChanges { + my ($branches, $fname) = @_; + local *F; + # requires perl 5.8. Avoids shell issues if we ever get a changes + # file named by the parents of Little Johnny Tables. + open F, "-|", "git", "log", "--no-merges", "--pretty=format:%H", $branches, "--", $fname + or die "$!"; + my @changes = ; + return scalar @changes +} + +my $look_for_type = "merged"; + +if (! @ARGV) { + print <] changes/* + +A change is "merged" if it has ever been merged to release-0.2.4 and it has had +no subsequent changes in master. + +A change is "unmerged" if it has never been merged to release-0.2.4 and it +has had changes in master. + +A change is "weird" if it has been merged to release-0.2.4 and it *has* had +subsequent changes in master. + +Suggested application: + findMergedChanges.pl --merged changes/* | xargs -n 1 git rm + +EOF +} + +my $target_branch = "origin/release-0.2.4"; +my $head = "origin/master"; + +while (@ARGV and $ARGV[0] =~ /^--/) { + my $flag = shift @ARGV; + if ($flag =~ /^--(weird|merged|unmerged|list)/) { + $look_for_type = $1; + } elsif ($flag =~ /^--branch=(\S+)/) { + $target_branch = $1; + } elsif ($flag =~ /^--head=(\S+)/) { + $head = $1; + } else { + die "Unrecognized flag $flag"; + } +} + +for my $changefile (@ARGV) { + my $n_merged = nChanges($target_branch, $changefile); + my $n_postmerged = nChanges("${target_branch}..${head}", $changefile); + my $type; + + if ($n_merged != 0 and $n_postmerged == 0) { + $type = "merged"; + } elsif ($n_merged == 0 and $n_postmerged != 0) { + $type = "unmerged"; + } else { + $type = "weird"; + } + + if ($type eq $look_for_type) { + print "$changefile\n"; + } elsif ($look_for_type eq 'list') { + printf "% 8s: %s\n", $type, $changefile; + } +} diff --git a/src/wraith/scripts/maint/format_changelog.py b/src/wraith/scripts/maint/format_changelog.py new file mode 100644 index 000000000..c5a0cfc81 --- /dev/null +++ b/src/wraith/scripts/maint/format_changelog.py @@ -0,0 +1,569 @@ +#!/usr/bin/python +# Copyright (c) 2014-2017, The Tor Project, Inc. +# See LICENSE for licensing information +# +# This script reformats a section of the changelog to wrap everything to +# the right width and put blank lines in the right places. Eventually, +# it might include a linter. +# +# To run it, pipe a section of the changelog (starting with "Changes +# in Tor 0.x.y.z-alpha" through the script.) + +import os +import re +import sys +import optparse + +# ============================== +# Oh, look! It's a cruddy approximation to Knuth's elegant text wrapping +# algorithm, with totally ad hoc parameters! +# +# We're trying to minimize: +# The total of the cubes of ragged space on underflowed intermediate lines, +# PLUS +# 100 * the fourth power of overflowed characters +# PLUS +# .1 * a bit more than the cube of ragged space on the last line. +# PLUS +# OPENPAREN_PENALTY for each line that starts with ( +# +# We use an obvious dynamic programming algorithm to sorta approximate this. +# It's not coded right or optimally, but it's fast enough for changelogs +# +# (Code found in an old directory of mine, lightly cleaned. -NM) + +NO_HYPHENATE=set(""" +pf-divert +tor-resolve +tor-gencert +""".split()) + +LASTLINE_UNDERFLOW_EXPONENT = 1 +LASTLINE_UNDERFLOW_PENALTY = 1 + +UNDERFLOW_EXPONENT = 3 +UNDERFLOW_PENALTY = 1 + +OVERFLOW_EXPONENT = 4 +OVERFLOW_PENALTY = 2000 + +ORPHAN_PENALTY = 10000 + +OPENPAREN_PENALTY = 200 + +def generate_wrapping(words, divisions): + lines = [] + last = 0 + for i in divisions: + w = words[last:i] + last = i + line = " ".join(w).replace("\xff ","-").replace("\xff","-") + lines.append(line.strip()) + return lines + +def wrapping_quality(words, divisions, width1, width2): + total = 0.0 + + lines = generate_wrapping(words, divisions) + for line in lines: + length = len(line) + if line is lines[0]: + width = width1 + else: + width = width2 + + if line[0:1] == '(': + total += OPENPAREN_PENALTY + + if length > width: + total += OVERFLOW_PENALTY * ( + (length - width) ** OVERFLOW_EXPONENT ) + else: + if line is lines[-1]: + e,p = (LASTLINE_UNDERFLOW_EXPONENT, LASTLINE_UNDERFLOW_PENALTY) + if " " not in line: + total += ORPHAN_PENALTY + else: + e,p = (UNDERFLOW_EXPONENT, UNDERFLOW_PENALTY) + + total += p * ((width - length) ** e) + + return total + +def wrap_graf(words, prefix_len1=0, prefix_len2=0, width=72): + wrapping_after = [ (0,), ] + + w1 = width - prefix_len1 + w2 = width - prefix_len2 + + for i in range(1, len(words)+1): + best_so_far = None + best_score = 1e300 + for j in range(i): + t = wrapping_after[j] + t1 = t[:-1] + (i,) + t2 = t + (i,) + wq1 = wrapping_quality(words, t1, w1, w2) + wq2 = wrapping_quality(words, t2, w1, w2) + + if wq1 < best_score: + best_so_far = t1 + best_score = wq1 + if wq2 < best_score: + best_so_far = t2 + best_score = wq2 + wrapping_after.append( best_so_far ) + + lines = generate_wrapping(words, wrapping_after[-1]) + + return lines + +def hyphenatable(word): + if "--" in word: + return False + + if re.match(r'^[^\d\-]\D*-', word): + stripped = re.sub(r'^\W+','',word) + stripped = re.sub(r'\W+$','',word) + return stripped not in NO_HYPHENATE + else: + return False + +def split_paragraph(s): + "Split paragraph into words; tuned for Tor." + + r = [] + for word in s.split(): + if hyphenatable(word): + while "-" in word: + a,word = word.split("-",1) + r.append(a+"\xff") + r.append(word) + return r + +def fill(text, width, initial_indent, subsequent_indent): + words = split_paragraph(text) + lines = wrap_graf(words, len(initial_indent), len(subsequent_indent), + width) + res = [ initial_indent, lines[0], "\n" ] + for line in lines[1:]: + res.append(subsequent_indent) + res.append(line) + res.append("\n") + return "".join(res) + +# ============================== + + +TP_MAINHEAD = 0 +TP_HEADTEXT = 1 +TP_BLANK = 2 +TP_SECHEAD = 3 +TP_ITEMFIRST = 4 +TP_ITEMBODY = 5 +TP_END = 6 +TP_PREHEAD = 7 + +def head_parser(line): + if re.match(r'^Changes in', line): + return TP_MAINHEAD + elif re.match(r'^[A-Za-z]', line): + return TP_PREHEAD + elif re.match(r'^ o ', line): + return TP_SECHEAD + elif re.match(r'^\s*$', line): + return TP_BLANK + else: + return TP_HEADTEXT + +def body_parser(line): + if re.match(r'^ o ', line): + return TP_SECHEAD + elif re.match(r'^ -',line): + return TP_ITEMFIRST + elif re.match(r'^ \S', line): + return TP_ITEMBODY + elif re.match(r'^\s*$', line): + return TP_BLANK + elif re.match(r'^Changes in', line): + return TP_END + elif re.match(r'^\s+\S', line): + return TP_HEADTEXT + else: + print "Weird line %r"%line + +def clean_head(head): + return head + +def head_score(s): + m = re.match(r'^ +o (.*)', s) + if not m: + print >>sys.stderr, "Can't score %r"%s + return 99999 + lw = m.group(1).lower() + if lw.startswith("security") and "feature" not in lw: + score = -300 + elif lw.startswith("deprecated version"): + score = -200 + elif lw.startswith("directory auth"): + score = -150 + elif (('new' in lw and 'requirement' in lw) or + ('new' in lw and 'dependenc' in lw) or + ('build' in lw and 'requirement' in lw) or + ('removed' in lw and 'platform' in lw)): + score = -100 + elif lw.startswith("major feature"): + score = 00 + elif lw.startswith("major bug"): + score = 50 + elif lw.startswith("major"): + score = 70 + elif lw.startswith("minor feature"): + score = 200 + elif lw.startswith("minor bug"): + score = 250 + elif lw.startswith("minor"): + score = 270 + else: + score = 1000 + + if 'secur' in lw: + score -= 2 + + if "(other)" in lw: + score += 2 + + if '(' not in lw: + score -= 1 + + return score + +class ChangeLog(object): + def __init__(self, wrapText=True, blogOrder=True, drupalBreak=False): + self.prehead = [] + self.mainhead = None + self.headtext = [] + self.curgraf = None + self.sections = [] + self.cursection = None + self.lineno = 0 + self.wrapText = wrapText + self.blogOrder = blogOrder + self.drupalBreak = drupalBreak + + def addLine(self, tp, line): + self.lineno += 1 + + if tp == TP_MAINHEAD: + assert not self.mainhead + self.mainhead = line + + elif tp == TP_PREHEAD: + self.prehead.append(line) + + elif tp == TP_HEADTEXT: + if self.curgraf is None: + self.curgraf = [] + self.headtext.append(self.curgraf) + self.curgraf.append(line) + + elif tp == TP_BLANK: + self.curgraf = None + + elif tp == TP_SECHEAD: + self.cursection = [ self.lineno, line, [] ] + self.sections.append(self.cursection) + + elif tp == TP_ITEMFIRST: + item = ( self.lineno, [ [line] ]) + self.curgraf = item[1][0] + self.cursection[2].append(item) + + elif tp == TP_ITEMBODY: + if self.curgraf is None: + self.curgraf = [] + self.cursection[2][-1][1].append(self.curgraf) + self.curgraf.append(line) + + else: + assert "This" is "unreachable" + + def lint_head(self, line, head): + m = re.match(r'^ *o ([^\(]+)((?:\([^\)]+\))?):', head) + if not m: + print >>sys.stderr, "Weird header format on line %s"%line + + def lint_item(self, line, grafs, head_type): + pass + + def lint(self): + self.head_lines = {} + for sec_line, sec_head, items in self.sections: + head_type = self.lint_head(sec_line, sec_head) + for item_line, grafs in items: + self.lint_item(item_line, grafs, head_type) + + def dumpGraf(self,par,indent1,indent2=-1): + if not self.wrapText: + for line in par: + print line + return + + if indent2 == -1: + indent2 = indent1 + text = " ".join(re.sub(r'\s+', ' ', line.strip()) for line in par) + + sys.stdout.write(fill(text, + width=72, + initial_indent=" "*indent1, + subsequent_indent=" "*indent2)) + + def dumpPreheader(self, graf): + self.dumpGraf(graf, 0) + print + + def dumpMainhead(self, head): + print head + + def dumpHeadGraf(self, graf): + self.dumpGraf(graf, 2) + print + + def dumpSectionHeader(self, header): + print header + + def dumpStartOfSections(self): + pass + + def dumpEndOfSections(self): + pass + + def dumpEndOfSection(self): + print + + def dumpEndOfChangelog(self): + print + + def dumpDrupalBreak(self): + pass + + def dumpItem(self, grafs): + self.dumpGraf(grafs[0],4,6) + for par in grafs[1:]: + print + self.dumpGraf(par,6,6) + + def collateAndSortSections(self): + heads = [] + sectionsByHead = { } + for _, head, items in self.sections: + head = clean_head(head) + try: + s = sectionsByHead[head] + except KeyError: + s = sectionsByHead[head] = [] + heads.append( (head_score(head), head.lower(), head, s) ) + + s.extend(items) + + heads.sort() + self.sections = [ (0, head, items) for _1,_2,head,items in heads ] + + def dump(self): + if self.prehead: + self.dumpPreheader(self.prehead) + + if not self.blogOrder: + self.dumpMainhead(self.mainhead) + + for par in self.headtext: + self.dumpHeadGraf(par) + + if self.blogOrder: + self.dumpMainhead(self.mainhead) + + drupalBreakAfter = None + if self.drupalBreak and len(self.sections) > 4: + drupalBreakAfter = self.sections[1][2] + + self.dumpStartOfSections() + for _,head,items in self.sections: + if not head.endswith(':'): + print >>sys.stderr, "adding : to %r"%head + head = head + ":" + self.dumpSectionHeader(head) + for _,grafs in items: + self.dumpItem(grafs) + self.dumpEndOfSection() + if items is drupalBreakAfter: + self.dumpDrupalBreak() + self.dumpEndOfSections() + self.dumpEndOfChangelog() + +# Let's turn bugs to html. +BUG_PAT = re.compile('(bug|ticket|feature)\s+(\d{4,5})', re.I) +def bug_html(m): + return "%s %s" % (m.group(1), m.group(2), m.group(2)) + +class HTMLChangeLog(ChangeLog): + def __init__(self, *args, **kwargs): + ChangeLog.__init__(self, *args, **kwargs) + + def htmlText(self, graf): + output = [] + for line in graf: + line = line.rstrip().replace("&","&") + line = line.rstrip().replace("<","<").replace(">",">") + output.append(line.strip()) + output = " ".join(output) + output = BUG_PAT.sub(bug_html, output) + sys.stdout.write(output) + + def htmlPar(self, graf): + sys.stdout.write("

") + self.htmlText(graf) + sys.stdout.write("

\n") + + def dumpPreheader(self, graf): + self.htmlPar(graf) + + def dumpMainhead(self, head): + sys.stdout.write("

%s

"%head) + + def dumpHeadGraf(self, graf): + self.htmlPar(graf) + + def dumpSectionHeader(self, header): + header = header.replace(" o ", "", 1).lstrip() + sys.stdout.write("
  • %s\n"%header) + sys.stdout.write("
      \n") + + def dumpEndOfSection(self): + sys.stdout.write("
    \n\n") + + def dumpEndOfChangelog(self): + pass + + def dumpStartOfSections(self): + print "
      \n" + + def dumpEndOfSections(self): + print "
    \n" + + def dumpDrupalBreak(self): + print "\n\n" + print "

     

    " + print "\n\n\n" + print "
      " + + def dumpItem(self, grafs): + grafs[0][0] = grafs[0][0].replace(" - ", "", 1).lstrip() + sys.stdout.write("
    • ") + if len(grafs) > 1: + for par in grafs: + self.htmlPar(par) + else: + self.htmlText(grafs[0]) + print + +op = optparse.OptionParser(usage="usage: %prog [options] [filename]") +op.add_option('-W', '--no-wrap', action='store_false', + dest='wrapText', default=True, + help='Do not re-wrap paragraphs') +op.add_option('-S', '--no-sort', action='store_false', + dest='sort', default=True, + help='Do not sort or collate sections') +op.add_option('-o', '--output', dest='output', + default='-', metavar='FILE', help="write output to FILE") +op.add_option('-H', '--html', action='store_true', + dest='html', default=False, + help="generate an HTML fragment") +op.add_option('-1', '--first', action='store_true', + dest='firstOnly', default=False, + help="write only the first section") +op.add_option('-b', '--blog-header', action='store_true', + dest='blogOrder', default=False, + help="Write the header in blog order") +op.add_option('-B', '--blog', action='store_true', + dest='blogFormat', default=False, + help="Set all other options as appropriate for a blog post") +op.add_option('--inplace', action='store_true', + dest='inplace', default=False, + help="Alter the ChangeLog in place") +op.add_option('--drupal-break', action='store_true', + dest='drupalBreak', default=False, + help='Insert a drupal-friendly as needed') + +options,args = op.parse_args() + +if options.blogFormat: + options.blogOrder = True + options.html = True + options.sort = False + options.wrapText = False + options.firstOnly = True + options.drupalBreak = True + +if len(args) > 1: + op.error("Too many arguments") +elif len(args) == 0: + fname = 'ChangeLog' +else: + fname = args[0] + +if options.inplace: + assert options.output == '-' + options.output = fname + +if fname != '-': + sys.stdin = open(fname, 'r') + +nextline = None + +if options.html: + ChangeLogClass = HTMLChangeLog +else: + ChangeLogClass = ChangeLog + +CL = ChangeLogClass(wrapText=options.wrapText, + blogOrder=options.blogOrder, + drupalBreak=options.drupalBreak) +parser = head_parser + +for line in sys.stdin: + line = line.rstrip() + tp = parser(line) + + if tp == TP_SECHEAD: + parser = body_parser + elif tp == TP_END: + nextline = line + break + + CL.addLine(tp,line) + +CL.lint() + +if options.output != '-': + fname_new = options.output+".new" + fname_out = options.output + sys.stdout = open(fname_new, 'w') +else: + fname_new = fname_out = None + +if options.sort: + CL.collateAndSortSections() + +CL.dump() + +if options.firstOnly: + sys.exit(0) + +if nextline is not None: + print nextline + +for line in sys.stdin: + sys.stdout.write(line) + +if fname_new is not None: + os.rename(fname_new, fname_out) diff --git a/src/wraith/scripts/maint/lintChanges.py b/src/wraith/scripts/maint/lintChanges.py new file mode 100644 index 000000000..d5b8fcae5 --- /dev/null +++ b/src/wraith/scripts/maint/lintChanges.py @@ -0,0 +1,117 @@ +#!/usr/bin/python + +from __future__ import print_function +from __future__ import with_statement +import sys +import re +import os + + +KNOWN_GROUPS = set([ + "Minor bugfix", + "Minor bugfixes", + "Major bugfix", + "Major bugfixes", + "Minor feature", + "Minor features", + "Major feature", + "Major features", + "New system requirements", + "Testing", + "Documentation", + "Code simplification and refactoring", + "Removed features", + "Deprecated features", + "Directory authority changes"]) + +NEEDS_SUBCATEGORIES = set([ + "Minor bugfix", + "Minor bugfixes", + "Major bugfix", + "Major bugfixes", + "Minor feature", + "Minor features", + "Major feature", + "Major features", + ]) + +def lintfile(fname): + have_warned = [] + + def warn(s): + if not have_warned: + have_warned.append(1) + print("{}:".format(fname)) + print("\t{}".format(s)) + + m = re.search(r'(\d{3,})', os.path.basename(fname)) + if m: + bugnum = m.group(1) + else: + bugnum = None + + with open(fname) as f: + contents = f.read() + + if bugnum and bugnum not in contents: + warn("bug number {} does not appear".format(bugnum)) + + m = re.match(r'^[ ]{2}o ([^\(:]*)([^:]*):', contents) + if not m: + warn("Header not in format expected. (' o Foo:' or ' o Foo (Bar):')") + elif m.group(1).strip() not in KNOWN_GROUPS: + warn("Unrecognized header: %r" % m.group(1)) + elif (m.group(1) in NEEDS_SUBCATEGORIES and '(' not in m.group(2)): + warn("Missing subcategory on %r" % m.group(1)) + + if m: + isBug = ("bug" in m.group(1).lower() or "fix" in m.group(1).lower()) + else: + isBug = False + + contents = " ".join(contents.split()) + + if re.search(r'\#\d{2,}', contents): + warn("Don't use a # before ticket numbers. ('bug 1234' not '#1234')") + + if isBug and not re.search(r'(\d+)', contents): + warn("Ticket marked as bugfix, but does not mention a number.") + elif isBug and not re.search(r'Fixes ([a-z ]*)bugs? (\d+)', contents): + warn("Ticket marked as bugfix, but does not say 'Fixes bug XXX'") + + if re.search(r'[bB]ug (\d+)', contents): + if not re.search(r'[Bb]ugfix on ', contents): + warn("Bugfix does not say 'bugfix on X.Y.Z'") + elif not re.search('[fF]ixes ([a-z ]*)bugs? (\d+)((, \d+)* and \d+)?; bugfix on ', + contents): + warn("Bugfix does not say 'Fixes bug X; bugfix on Y'") + elif re.search('tor-([0-9]+)', contents): + warn("Do not prefix versions with 'tor-'. ('0.1.2', not 'tor-0.1.2'.)") + + return have_warned != [] + +def files(args): + """Walk through the arguments: for directories, yield their contents; + for files, just yield the files. Only search one level deep, because + that's how the changes directory is laid out.""" + for f in args: + if os.path.isdir(f): + for item in os.listdir(f): + if item.startswith("."): #ignore dotfiles + continue + yield os.path.join(f, item) + else: + yield f + +if __name__ == '__main__': + problems = 0 + for fname in files(sys.argv[1:]): + if fname.endswith("~"): + continue + if lintfile(fname): + problems += 1 + + if problems: + sys.exit(1) + else: + sys.exit(0) diff --git a/src/wraith/scripts/maint/locatemissingdoxygen.py b/src/wraith/scripts/maint/locatemissingdoxygen.py new file mode 100644 index 000000000..797bf8176 --- /dev/null +++ b/src/wraith/scripts/maint/locatemissingdoxygen.py @@ -0,0 +1,74 @@ +#!/usr/bin/python + +""" + This script parses the stderr output of doxygen and looks for undocumented + stuff. By default, it just counts the undocumented things per file. But with + the -A option, it rewrites the files to stick in /*DOCDOC*/ comments + to highlight the undocumented stuff. +""" + +import os +import re +import shutil +import sys + +warning_pattern = re.compile(r'^([^:]+):(\d+): warning: (.*) is not documented') + +def readDoxygenOutput(f): + " yields (cfilename, lineno, thingname) " + for line in f: + m = warning_pattern.match(line) + if m: + yield m.groups() + +warnings = {} + +def buildWarnings(): + for fn, lineno, what in list(readDoxygenOutput(sys.stdin)): + warnings.setdefault(fn, []).append( (int(lineno), what) ) + +def count(fn): + if os.path.abspath(fn) not in warnings: + print "0\t%s"%fn + else: + n = len(warnings[os.path.abspath(fn)]) + print "%d\t%s"%(n,fn) + +def getIndentation(line): + s = line.lstrip() + return line[:len(line)-len(s)] + +def annotate(filename): + if os.path.abspath(filename) not in warnings: + return + with open(filename) as f: + lines = f.readlines() + w = warnings[os.path.abspath(filename)][:] + w.sort() + w.reverse() + + for lineno, what in w: + lineno -= 1 # list is 0-indexed. + if 'DOCDOC' in lines[lineno]: + continue + ind = getIndentation(lines[lineno]) + lines.insert(lineno, "%s/* DOCDOC %s */\n"%(ind,what)) + + shutil.copy(filename, filename+".orig") + with open(filename, 'w') as f: + for l in lines: + f.write(l) + + +if __name__ == '__main__': + if len(sys.argv) == 1: + print "Usage: locatemissingdoxygen.py [-A] filename... doxygen.stderr' ... +# ...and run ./scripts/maint/redox.py < doxygen.stderr ! +# I'll make a bunch of new files by adding missing DOCDOC comments to your +# source. Those files will have names like ./src/common/util.c.newdoc. +# You will want to look over the changes by hand before checking them in. +# +# So, here's your workflow: +# +# 0. Make sure you're running a bourne shell for the redirects below. +# 1. make doxygen 1>doxygen.stdout 2>doxygen.stderr. +# 2. grep Warning doxygen.stderr | grep -v 'is not documented' | less +# [This will tell you about all the bogus doxygen output you have] +# 3. python ./scripts/maint/redox.py callgraph/$calculation +done + +echo < callgraph/README +This directory holds output from calltool, as run on Tor. For more +information about each of these files, see the NOTES and README files in +the calltool distribution. + +You can find calltool at + https://gitweb.torproject.org/user/nickm/calltool.git +EOF + diff --git a/src/wraith/scripts/maint/sortChanges.py b/src/wraith/scripts/maint/sortChanges.py new file mode 100644 index 000000000..22e40fd36 --- /dev/null +++ b/src/wraith/scripts/maint/sortChanges.py @@ -0,0 +1,108 @@ +#!/usr/bin/python +# Copyright (c) 2014-2017, The Tor Project, Inc. +# See LICENSE for licensing information + +"""This script sorts a bunch of changes files listed on its command + line into roughly the order in which they should appear in the + changelog. +""" + +import re +import sys + +def fetch(fn): + with open(fn) as f: + s = f.read() + s = "%s\n" % s.rstrip() + return s + +CSR='Code simplification and refactoring' + +REPLACEMENTS = { + # plurals + 'Minor bugfix' : 'Minor bugfixes', + 'Major bugfix' : 'Major bugfixes', + 'Minor feature' : 'Minor features', + 'Major feature' : 'Major features', + 'Removed feature' : 'Removed features', + 'Code simplification and refactorings' : CSR, + 'Code simplifications and refactoring' : CSR, + 'Code simplifications and refactorings' : CSR, + + # wrong words + 'Minor fix' : 'Minor bugfixes', + 'Major fix' : 'Major bugfixes', + 'Minor fixes' : 'Minor bugfixes', + 'Major fixes' : 'Major bugfixes', + 'Minor enhancement' : 'Minor features', + 'Minor enhancements' : 'Minor features', + 'Major enhancement' : 'Major features', + 'Major enhancements' : 'Major features', +} + +def score(s,fname=None): + m = re.match(r'^ +o ([^\n]*)\n(.*)', s, re.M|re.S) + if not m: + print >>sys.stderr, "Can't score %r from %s"%(s,fname) + heading = m.group(1) + heading = REPLACEMENTS.get(heading, heading) + lw = m.group(1).lower() + if lw.startswith("major feature"): + score = 0 + elif lw.startswith("major bug"): + score = 1 + elif lw.startswith("major"): + score = 2 + elif lw.startswith("minor feature"): + score = 10 + elif lw.startswith("minor bug"): + score = 11 + elif lw.startswith("minor"): + score = 12 + else: + score = 100 + + return (score, lw, heading, m.group(2)) + +def splitChanges(s): + this_entry = [] + for line in s.split("\n"): + if line.strip() == "": + continue + if re.match(r" +o ", line): + if len(this_entry) > 2: + yield "".join(this_entry) + curHeader = line + this_entry = [ curHeader, "\n" ] + continue + elif re.match(r" +- ", line): + if len(this_entry) > 2: + yield "".join(this_entry) + this_entry = [ curHeader, "\n" ] + + this_entry.append(line) + this_entry.append("\n") + + if len(this_entry) > 2: + yield "".join(this_entry) + + +changes = [] + +for fn in sys.argv[1:]: + if fn.endswith('~'): + continue + for change in splitChanges(fetch(fn)): + changes.append(score(change,fn)) + +changes.sort() + +last_lw = "this is not a header" +for _, lw, header, rest in changes: + if lw == last_lw: + print rest, + else: + print + print " o",header + print rest, + last_lw = lw diff --git a/src/wraith/scripts/maint/updateCopyright.pl b/src/wraith/scripts/maint/updateCopyright.pl new file mode 100644 index 000000000..beb0b8f26 --- /dev/null +++ b/src/wraith/scripts/maint/updateCopyright.pl @@ -0,0 +1,7 @@ +#!/usr/bin/perl -i -w -p + +$NEWYEAR=2017; + +s/Copyright(.*) (201[^7]), The Tor Project/Copyright$1 $2-${NEWYEAR}, The Tor Project/; + +s/Copyright(.*)-(20..), The Tor Project/Copyright$1-${NEWYEAR}, The Tor Project/; diff --git a/src/wraith/scripts/maint/updateFallbackDirs.py b/src/wraith/scripts/maint/updateFallbackDirs.py new file mode 100644 index 000000000..3efd408ec --- /dev/null +++ b/src/wraith/scripts/maint/updateFallbackDirs.py @@ -0,0 +1,2226 @@ +#!/usr/bin/python + +# Usage: +# +# Regenerate the list: +# scripts/maint/updateFallbackDirs.py > src/or/fallback_dirs.inc 2> fallback_dirs.log +# +# Check the existing list: +# scripts/maint/updateFallbackDirs.py check_existing > fallback_dirs.inc.ok 2> fallback_dirs.log +# mv fallback_dirs.inc.ok src/or/fallback_dirs.inc +# +# This script should be run from a stable, reliable network connection, +# with no other network activity (and not over tor). +# If this is not possible, please disable: +# PERFORM_IPV4_DIRPORT_CHECKS and PERFORM_IPV6_DIRPORT_CHECKS +# +# Needs dateutil (and potentially other python packages) +# Needs stem available in your PYTHONPATH, or just ln -s ../stem/stem . +# Optionally uses ipaddress (python 3 builtin) or py2-ipaddress (package) +# for netblock analysis, in PYTHONPATH, or just +# ln -s ../py2-ipaddress-3.4.1/ipaddress.py . +# +# Then read the logs to make sure the fallbacks aren't dominated by a single +# netblock or port + +# Script by weasel, April 2015 +# Portions by gsathya & karsten, 2013 +# https://trac.torproject.org/projects/tor/attachment/ticket/8374/dir_list.2.py +# Modifications by teor, 2015 + +import StringIO +import string +import re +import datetime +import gzip +import os.path +import json +import math +import sys +import urllib +import urllib2 +import hashlib +import dateutil.parser +# bson_lazy provides bson +#from bson import json_util +import copy +import re + +from stem.descriptor import DocumentHandler +from stem.descriptor.remote import get_consensus + +import logging +logging.root.name = '' + +HAVE_IPADDRESS = False +try: + # python 3 builtin, or install package py2-ipaddress + # there are several ipaddress implementations for python 2 + # with slightly different semantics with str typed text + # fortunately, all our IP addresses are in unicode + import ipaddress + HAVE_IPADDRESS = True +except ImportError: + # if this happens, we avoid doing netblock analysis + logging.warning('Unable to import ipaddress, please install py2-ipaddress.' + + ' A fallback list will be created, but optional netblock' + + ' analysis will not be performed.') + +## Top-Level Configuration + +# Output all candidate fallbacks, or only output selected fallbacks? +OUTPUT_CANDIDATES = False + +# Perform DirPort checks over IPv4? +# Change this to False if IPv4 doesn't work for you, or if you don't want to +# download a consensus for each fallback +# Don't check ~1000 candidates when OUTPUT_CANDIDATES is True +PERFORM_IPV4_DIRPORT_CHECKS = False if OUTPUT_CANDIDATES else True + +# Perform DirPort checks over IPv6? +# If you know IPv6 works for you, set this to True +# This will exclude IPv6 relays without an IPv6 DirPort configured +# So it's best left at False until #18394 is implemented +# Don't check ~1000 candidates when OUTPUT_CANDIDATES is True +PERFORM_IPV6_DIRPORT_CHECKS = False if OUTPUT_CANDIDATES else False + +# Must relays be running now? +MUST_BE_RUNNING_NOW = (PERFORM_IPV4_DIRPORT_CHECKS + or PERFORM_IPV6_DIRPORT_CHECKS) + +# Clients have been using microdesc consensuses by default for a while now +DOWNLOAD_MICRODESC_CONSENSUS = True + +# If a relay delivers an expired consensus, if it expired less than this many +# seconds ago, we still allow the relay. This should never be less than -90, +# as all directory mirrors should have downloaded a consensus 90 minutes +# before it expires. It should never be more than 24 hours, because clients +# reject consensuses that are older than REASONABLY_LIVE_TIME. +# For the consensus expiry check to be accurate, the machine running this +# script needs an accurate clock. +# We use 24 hours to compensate for #20909, where relays on 0.2.9.5-alpha and +# 0.3.0.0-alpha-dev and later deliver stale consensuses, but typically recover +# after ~12 hours. +# We should make this lower when #20909 is fixed, see #20942. +CONSENSUS_EXPIRY_TOLERANCE = 24*60*60 + +# Output fallback name, flags, bandwidth, and ContactInfo in a C comment? +OUTPUT_COMMENTS = True if OUTPUT_CANDIDATES else False + +# Output matching ContactInfo in fallbacks list or the blacklist? +# Useful if you're trying to contact operators +CONTACT_COUNT = True if OUTPUT_CANDIDATES else False +CONTACT_BLACKLIST_COUNT = True if OUTPUT_CANDIDATES else False + +# How the list should be sorted: +# fingerprint: is useful for stable diffs of fallback lists +# measured_bandwidth: is useful when pruning the list based on bandwidth +# contact: is useful for contacting operators once the list has been pruned +OUTPUT_SORT_FIELD = 'contact' if OUTPUT_CANDIDATES else 'fingerprint' + +## OnionOO Settings + +ONIONOO = 'https://onionoo.torproject.org/' +#ONIONOO = 'https://onionoo.thecthulhu.com/' + +# Don't bother going out to the Internet, just use the files available locally, +# even if they're very old +LOCAL_FILES_ONLY = False + +## Whitelist / Blacklist Filter Settings + +# The whitelist contains entries that are included if all attributes match +# (IPv4, dirport, orport, id, and optionally IPv6 and IPv6 orport) +# The blacklist contains (partial) entries that are excluded if any +# sufficiently specific group of attributes matches: +# IPv4 & DirPort +# IPv4 & ORPort +# ID +# IPv6 & DirPort +# IPv6 & IPv6 ORPort +# If neither port is included in the blacklist, the entire IP address is +# blacklisted. + +# What happens to entries in neither list? +# When True, they are included, when False, they are excluded +INCLUDE_UNLISTED_ENTRIES = True if OUTPUT_CANDIDATES else False + +# If an entry is in both lists, what happens? +# When True, it is excluded, when False, it is included +BLACKLIST_EXCLUDES_WHITELIST_ENTRIES = True + +WHITELIST_FILE_NAME = 'scripts/maint/fallback.whitelist' +BLACKLIST_FILE_NAME = 'scripts/maint/fallback.blacklist' +FALLBACK_FILE_NAME = 'src/or/fallback_dirs.inc' + +# The number of bytes we'll read from a filter file before giving up +MAX_LIST_FILE_SIZE = 1024 * 1024 + +## Eligibility Settings + +# Require fallbacks to have the same address and port for a set amount of time +# We used to have this at 1 week, but that caused many fallback failures, which +# meant that we had to rebuild the list more often. +# +# There was a bug in Tor 0.2.8.1-alpha and earlier where a relay temporarily +# submits a 0 DirPort when restarted. +# This causes OnionOO to (correctly) reset its stability timer. +# Affected relays should upgrade to Tor 0.2.8.7 or later, which has a fix +# for this issue. +ADDRESS_AND_PORT_STABLE_DAYS = 30 +# We ignore relays that have been down for more than this period +MAX_DOWNTIME_DAYS = 0 if MUST_BE_RUNNING_NOW else 7 +# What time-weighted-fraction of these flags must FallbackDirs +# Equal or Exceed? +CUTOFF_RUNNING = .90 +CUTOFF_V2DIR = .90 +# Tolerate lower guard flag averages, as guard flags are removed for some time +# after a relay restarts +CUTOFF_GUARD = .80 +# What time-weighted-fraction of these flags must FallbackDirs +# Equal or Fall Under? +# .00 means no bad exits +PERMITTED_BADEXIT = .00 + +# older entries' weights are adjusted with ALPHA^(age in days) +AGE_ALPHA = 0.99 + +# this factor is used to scale OnionOO entries to [0,1] +ONIONOO_SCALE_ONE = 999. + +## Fallback Count Limits + +# The target for these parameters is 20% of the guards in the network +# This is around 200 as of October 2015 +_FB_POG = 0.2 +FALLBACK_PROPORTION_OF_GUARDS = None if OUTPUT_CANDIDATES else _FB_POG + +# Limit the number of fallbacks (eliminating lowest by advertised bandwidth) +MAX_FALLBACK_COUNT = None if OUTPUT_CANDIDATES else 200 +# Emit a C #error if the number of fallbacks is less than expected +MIN_FALLBACK_COUNT = 0 if OUTPUT_CANDIDATES else MAX_FALLBACK_COUNT*0.5 + +# The maximum number of fallbacks on the same address, contact, or family +# With 200 fallbacks, this means each operator can see 1% of client bootstraps +# (The directory authorities used to see ~12% of client bootstraps each.) +MAX_FALLBACKS_PER_IP = 1 +MAX_FALLBACKS_PER_IPV4 = MAX_FALLBACKS_PER_IP +MAX_FALLBACKS_PER_IPV6 = MAX_FALLBACKS_PER_IP +MAX_FALLBACKS_PER_CONTACT = 3 +MAX_FALLBACKS_PER_FAMILY = 3 + +## Fallback Bandwidth Requirements + +# Any fallback with the Exit flag has its bandwidth multipled by this fraction +# to make sure we aren't further overloading exits +# (Set to 1.0, because we asked that only lightly loaded exits opt-in, +# and the extra load really isn't that much for large relays.) +EXIT_BANDWIDTH_FRACTION = 1.0 + +# If a single fallback's bandwidth is too low, it's pointless adding it +# We expect fallbacks to handle an extra 10 kilobytes per second of traffic +# Make sure they can support a hundred times the expected extra load +# (Use 102.4 to make it come out nicely in MByte/s) +# We convert this to a consensus weight before applying the filter, +# because all the bandwidth amounts are specified by the relay +MIN_BANDWIDTH = 102.4 * 10.0 * 1024.0 + +# Clients will time out after 30 seconds trying to download a consensus +# So allow fallback directories half that to deliver a consensus +# The exact download times might change based on the network connection +# running this script, but only by a few seconds +# There is also about a second of python overhead +CONSENSUS_DOWNLOAD_SPEED_MAX = 15.0 +# If the relay fails a consensus check, retry the download +# This avoids delisting a relay due to transient network conditions +CONSENSUS_DOWNLOAD_RETRY = True + +## Fallback Weights for Client Selection + +# All fallback weights are equal, and set to the value below +# Authorities are weighted 1.0 by default +# Clients use these weights to select fallbacks and authorities at random +# If there are 100 fallbacks and 9 authorities: +# - each fallback is chosen with probability 10.0/(10.0*100 + 1.0*9) ~= 0.99% +# - each authority is chosen with probability 1.0/(10.0*100 + 1.0*9) ~= 0.09% +# A client choosing a bootstrap directory server will choose a fallback for +# 10.0/(10.0*100 + 1.0*9) * 100 = 99.1% of attempts, and an authority for +# 1.0/(10.0*100 + 1.0*9) * 9 = 0.9% of attempts. +# (This disregards the bootstrap schedules, where clients start by choosing +# from fallbacks & authoritites, then later choose from only authorities.) +FALLBACK_OUTPUT_WEIGHT = 10.0 + +## Parsing Functions + +def parse_ts(t): + return datetime.datetime.strptime(t, "%Y-%m-%d %H:%M:%S") + +def remove_bad_chars(raw_string, bad_char_list): + # Remove each character in the bad_char_list + cleansed_string = raw_string + for c in bad_char_list: + cleansed_string = cleansed_string.replace(c, '') + return cleansed_string + +def cleanse_unprintable(raw_string): + # Remove all unprintable characters + cleansed_string = '' + for c in raw_string: + if c in string.printable: + cleansed_string += c + return cleansed_string + +def cleanse_whitespace(raw_string): + # Replace all whitespace characters with a space + cleansed_string = raw_string + for c in string.whitespace: + cleansed_string = cleansed_string.replace(c, ' ') + return cleansed_string + +def cleanse_c_multiline_comment(raw_string): + cleansed_string = raw_string + # Embedded newlines should be removed by tor/onionoo, but let's be paranoid + cleansed_string = cleanse_whitespace(cleansed_string) + # ContactInfo and Version can be arbitrary binary data + cleansed_string = cleanse_unprintable(cleansed_string) + # Prevent a malicious / unanticipated string from breaking out + # of a C-style multiline comment + # This removes '/*' and '*/' and '//' + bad_char_list = '*/' + # Prevent a malicious string from using C nulls + bad_char_list += '\0' + # Be safer by removing bad characters entirely + cleansed_string = remove_bad_chars(cleansed_string, bad_char_list) + # Some compilers may further process the content of comments + # There isn't much we can do to cover every possible case + # But comment-based directives are typically only advisory + return cleansed_string + +def cleanse_c_string(raw_string): + cleansed_string = raw_string + # Embedded newlines should be removed by tor/onionoo, but let's be paranoid + cleansed_string = cleanse_whitespace(cleansed_string) + # ContactInfo and Version can be arbitrary binary data + cleansed_string = cleanse_unprintable(cleansed_string) + # Prevent a malicious address/fingerprint string from breaking out + # of a C-style string + bad_char_list = '"' + # Prevent a malicious string from using escapes + bad_char_list += '\\' + # Prevent a malicious string from using C nulls + bad_char_list += '\0' + # Be safer by removing bad characters entirely + cleansed_string = remove_bad_chars(cleansed_string, bad_char_list) + # Some compilers may further process the content of strings + # There isn't much we can do to cover every possible case + # But this typically only results in changes to the string data + return cleansed_string + +## OnionOO Source Functions + +# a dictionary of source metadata for each onionoo query we've made +fetch_source = {} + +# register source metadata for 'what' +# assumes we only retrieve one document for each 'what' +def register_fetch_source(what, url, relays_published, version): + fetch_source[what] = {} + fetch_source[what]['url'] = url + fetch_source[what]['relays_published'] = relays_published + fetch_source[what]['version'] = version + +# list each registered source's 'what' +def fetch_source_list(): + return sorted(fetch_source.keys()) + +# given 'what', provide a multiline C comment describing the source +def describe_fetch_source(what): + desc = '/*' + desc += '\n' + desc += 'Onionoo Source: ' + desc += cleanse_c_multiline_comment(what) + desc += ' Date: ' + desc += cleanse_c_multiline_comment(fetch_source[what]['relays_published']) + desc += ' Version: ' + desc += cleanse_c_multiline_comment(fetch_source[what]['version']) + desc += '\n' + desc += 'URL: ' + desc += cleanse_c_multiline_comment(fetch_source[what]['url']) + desc += '\n' + desc += '*/' + return desc + +## File Processing Functions + +def write_to_file(str, file_name, max_len): + try: + with open(file_name, 'w') as f: + f.write(str[0:max_len]) + except EnvironmentError, error: + logging.error('Writing file %s failed: %d: %s'% + (file_name, + error.errno, + error.strerror) + ) + +def read_from_file(file_name, max_len): + try: + if os.path.isfile(file_name): + with open(file_name, 'r') as f: + return f.read(max_len) + except EnvironmentError, error: + logging.info('Loading file %s failed: %d: %s'% + (file_name, + error.errno, + error.strerror) + ) + return None + +def parse_fallback_file(file_name): + file_data = read_from_file(file_name, MAX_LIST_FILE_SIZE) + file_data = cleanse_unprintable(file_data) + file_data = remove_bad_chars(file_data, '\n"\0') + file_data = re.sub('/\*.*?\*/', '', file_data) + file_data = file_data.replace(',', '\n') + file_data = file_data.replace(' weight=10', '') + return file_data + +def load_possibly_compressed_response_json(response): + if response.info().get('Content-Encoding') == 'gzip': + buf = StringIO.StringIO( response.read() ) + f = gzip.GzipFile(fileobj=buf) + return json.load(f) + else: + return json.load(response) + +def load_json_from_file(json_file_name): + # An exception here may be resolved by deleting the .last_modified + # and .json files, and re-running the script + try: + with open(json_file_name, 'r') as f: + return json.load(f) + except EnvironmentError, error: + raise Exception('Reading not-modified json file %s failed: %d: %s'% + (json_file_name, + error.errno, + error.strerror) + ) + +## OnionOO Functions + +def datestr_to_datetime(datestr): + # Parse datetimes like: Fri, 02 Oct 2015 13:34:14 GMT + if datestr is not None: + dt = dateutil.parser.parse(datestr) + else: + # Never modified - use start of epoch + dt = datetime.datetime.utcfromtimestamp(0) + # strip any timezone out (in case they're supported in future) + dt = dt.replace(tzinfo=None) + return dt + +def onionoo_fetch(what, **kwargs): + params = kwargs + params['type'] = 'relay' + #params['limit'] = 10 + params['first_seen_days'] = '%d-'%(ADDRESS_AND_PORT_STABLE_DAYS) + params['last_seen_days'] = '-%d'%(MAX_DOWNTIME_DAYS) + params['flag'] = 'V2Dir' + url = ONIONOO + what + '?' + urllib.urlencode(params) + + # Unfortunately, the URL is too long for some OS filenames, + # but we still don't want to get files from different URLs mixed up + base_file_name = what + '-' + hashlib.sha1(url).hexdigest() + + full_url_file_name = base_file_name + '.full_url' + MAX_FULL_URL_LENGTH = 1024 + + last_modified_file_name = base_file_name + '.last_modified' + MAX_LAST_MODIFIED_LENGTH = 64 + + json_file_name = base_file_name + '.json' + + if LOCAL_FILES_ONLY: + # Read from the local file, don't write to anything + response_json = load_json_from_file(json_file_name) + else: + # store the full URL to a file for debugging + # no need to compare as long as you trust SHA-1 + write_to_file(url, full_url_file_name, MAX_FULL_URL_LENGTH) + + request = urllib2.Request(url) + request.add_header('Accept-encoding', 'gzip') + + # load the last modified date from the file, if it exists + last_mod_date = read_from_file(last_modified_file_name, + MAX_LAST_MODIFIED_LENGTH) + if last_mod_date is not None: + request.add_header('If-modified-since', last_mod_date) + + # Parse last modified date + last_mod = datestr_to_datetime(last_mod_date) + + # Not Modified and still recent enough to be useful + # Onionoo / Globe used to use 6 hours, but we can afford a day + required_freshness = datetime.datetime.utcnow() + # strip any timezone out (to match dateutil.parser) + required_freshness = required_freshness.replace(tzinfo=None) + required_freshness -= datetime.timedelta(hours=24) + + # Make the OnionOO request + response_code = 0 + try: + response = urllib2.urlopen(request) + response_code = response.getcode() + except urllib2.HTTPError, error: + response_code = error.code + if response_code == 304: # not modified + pass + else: + raise Exception("Could not get " + url + ": " + + str(error.code) + ": " + error.reason) + + if response_code == 200: # OK + last_mod = datestr_to_datetime(response.info().get('Last-Modified')) + + # Check for freshness + if last_mod < required_freshness: + if last_mod_date is not None: + # This check sometimes fails transiently, retry the script if it does + date_message = "Outdated data: last updated " + last_mod_date + else: + date_message = "No data: never downloaded " + raise Exception(date_message + " from " + url) + + # Process the data + if response_code == 200: # OK + + response_json = load_possibly_compressed_response_json(response) + + with open(json_file_name, 'w') as f: + # use the most compact json representation to save space + json.dump(response_json, f, separators=(',',':')) + + # store the last modified date in its own file + if response.info().get('Last-modified') is not None: + write_to_file(response.info().get('Last-Modified'), + last_modified_file_name, + MAX_LAST_MODIFIED_LENGTH) + + elif response_code == 304: # Not Modified + + response_json = load_json_from_file(json_file_name) + + else: # Unexpected HTTP response code not covered in the HTTPError above + raise Exception("Unexpected HTTP response code to " + url + ": " + + str(response_code)) + + register_fetch_source(what, + url, + response_json['relays_published'], + response_json['version']) + + return response_json + +def fetch(what, **kwargs): + #x = onionoo_fetch(what, **kwargs) + # don't use sort_keys, as the order of or_addresses is significant + #print json.dumps(x, indent=4, separators=(',', ': ')) + #sys.exit(0) + + return onionoo_fetch(what, **kwargs) + +## Fallback Candidate Class + +class Candidate(object): + CUTOFF_ADDRESS_AND_PORT_STABLE = (datetime.datetime.utcnow() + - datetime.timedelta(ADDRESS_AND_PORT_STABLE_DAYS)) + + def __init__(self, details): + for f in ['fingerprint', 'nickname', 'last_changed_address_or_port', + 'consensus_weight', 'or_addresses', 'dir_address']: + if not f in details: raise Exception("Document has no %s field."%(f,)) + + if not 'contact' in details: + details['contact'] = None + if not 'flags' in details or details['flags'] is None: + details['flags'] = [] + if (not 'advertised_bandwidth' in details + or details['advertised_bandwidth'] is None): + # relays without advertised bandwdith have it calculated from their + # consensus weight + details['advertised_bandwidth'] = 0 + if (not 'effective_family' in details + or details['effective_family'] is None): + details['effective_family'] = [] + if not 'platform' in details: + details['platform'] = None + details['last_changed_address_or_port'] = parse_ts( + details['last_changed_address_or_port']) + self._data = details + self._stable_sort_or_addresses() + + self._fpr = self._data['fingerprint'] + self._running = self._guard = self._v2dir = 0. + self._split_dirport() + self._compute_orport() + if self.orport is None: + raise Exception("Failed to get an orport for %s."%(self._fpr,)) + self._compute_ipv6addr() + if not self.has_ipv6(): + logging.debug("Failed to get an ipv6 address for %s."%(self._fpr,)) + self._compute_version() + + def _stable_sort_or_addresses(self): + # replace self._data['or_addresses'] with a stable ordering, + # sorting the secondary addresses in string order + # leave the received order in self._data['or_addresses_raw'] + self._data['or_addresses_raw'] = self._data['or_addresses'] + or_address_primary = self._data['or_addresses'][:1] + # subsequent entries in the or_addresses array are in an arbitrary order + # so we stabilise the addresses by sorting them in string order + or_addresses_secondaries_stable = sorted(self._data['or_addresses'][1:]) + or_addresses_stable = or_address_primary + or_addresses_secondaries_stable + self._data['or_addresses'] = or_addresses_stable + + def get_fingerprint(self): + return self._fpr + + # is_valid_ipv[46]_address by gsathya, karsten, 2013 + @staticmethod + def is_valid_ipv4_address(address): + if not isinstance(address, (str, unicode)): + return False + + # check if there are four period separated values + if address.count(".") != 3: + return False + + # checks that each value in the octet are decimal values between 0-255 + for entry in address.split("."): + if not entry.isdigit() or int(entry) < 0 or int(entry) > 255: + return False + elif entry[0] == "0" and len(entry) > 1: + return False # leading zeros, for instance in "1.2.3.001" + + return True + + @staticmethod + def is_valid_ipv6_address(address): + if not isinstance(address, (str, unicode)): + return False + + # remove brackets + address = address[1:-1] + + # addresses are made up of eight colon separated groups of four hex digits + # with leading zeros being optional + # https://en.wikipedia.org/wiki/IPv6#Address_format + + colon_count = address.count(":") + + if colon_count > 7: + return False # too many groups + elif colon_count != 7 and not "::" in address: + return False # not enough groups and none are collapsed + elif address.count("::") > 1 or ":::" in address: + return False # multiple groupings of zeros can't be collapsed + + found_ipv4_on_previous_entry = False + for entry in address.split(":"): + # If an IPv6 address has an embedded IPv4 address, + # it must be the last entry + if found_ipv4_on_previous_entry: + return False + if not re.match("^[0-9a-fA-f]{0,4}$", entry): + if not Candidate.is_valid_ipv4_address(entry): + return False + else: + found_ipv4_on_previous_entry = True + + return True + + def _split_dirport(self): + # Split the dir_address into dirip and dirport + (self.dirip, _dirport) = self._data['dir_address'].split(':', 2) + self.dirport = int(_dirport) + + def _compute_orport(self): + # Choose the first ORPort that's on the same IPv4 address as the DirPort. + # In rare circumstances, this might not be the primary ORPort address. + # However, _stable_sort_or_addresses() ensures we choose the same one + # every time, even if onionoo changes the order of the secondaries. + self._split_dirport() + self.orport = None + for i in self._data['or_addresses']: + if i != self._data['or_addresses'][0]: + logging.debug('Secondary IPv4 Address Used for %s: %s'%(self._fpr, i)) + (ipaddr, port) = i.rsplit(':', 1) + if (ipaddr == self.dirip) and Candidate.is_valid_ipv4_address(ipaddr): + self.orport = int(port) + return + + def _compute_ipv6addr(self): + # Choose the first IPv6 address that uses the same port as the ORPort + # Or, choose the first IPv6 address in the list + # _stable_sort_or_addresses() ensures we choose the same IPv6 address + # every time, even if onionoo changes the order of the secondaries. + self.ipv6addr = None + self.ipv6orport = None + # Choose the first IPv6 address that uses the same port as the ORPort + for i in self._data['or_addresses']: + (ipaddr, port) = i.rsplit(':', 1) + if (port == self.orport) and Candidate.is_valid_ipv6_address(ipaddr): + self.ipv6addr = ipaddr + self.ipv6orport = int(port) + return + # Choose the first IPv6 address in the list + for i in self._data['or_addresses']: + (ipaddr, port) = i.rsplit(':', 1) + if Candidate.is_valid_ipv6_address(ipaddr): + self.ipv6addr = ipaddr + self.ipv6orport = int(port) + return + + def _compute_version(self): + # parse the version out of the platform string + # The platform looks like: "Tor 0.2.7.6 on Linux" + self._data['version'] = None + if self._data['platform'] is None: + return + # be tolerant of weird whitespacing, use a whitespace split + tokens = self._data['platform'].split() + for token in tokens: + vnums = token.split('.') + # if it's at least a.b.c.d, with potentially an -alpha-dev, -alpha, -rc + if (len(vnums) >= 4 and vnums[0].isdigit() and vnums[1].isdigit() and + vnums[2].isdigit()): + self._data['version'] = token + return + + # From #20509 + # bug #20499 affects versions from 0.2.9.1-alpha-dev to 0.2.9.4-alpha-dev + # and version 0.3.0.0-alpha-dev + # Exhaustive lists are hard to get wrong + STALE_CONSENSUS_VERSIONS = ['0.2.9.1-alpha-dev', + '0.2.9.2-alpha', + '0.2.9.2-alpha-dev', + '0.2.9.3-alpha', + '0.2.9.3-alpha-dev', + '0.2.9.4-alpha', + '0.2.9.4-alpha-dev', + '0.3.0.0-alpha-dev' + ] + + def is_valid_version(self): + # call _compute_version before calling this + # is the version of the relay a version we want as a fallback? + # checks both recommended versions and bug #20499 / #20509 + # + # if the relay doesn't have a recommended version field, exclude the relay + if not self._data.has_key('recommended_version'): + log_excluded('%s not a candidate: no recommended_version field', + self._fpr) + return False + if not self._data['recommended_version']: + log_excluded('%s not a candidate: version not recommended', self._fpr) + return False + # if the relay doesn't have version field, exclude the relay + if not self._data.has_key('version'): + log_excluded('%s not a candidate: no version field', self._fpr) + return False + if self._data['version'] in Candidate.STALE_CONSENSUS_VERSIONS: + logging.warning('%s not a candidate: version delivers stale consensuses', + self._fpr) + return False + return True + + @staticmethod + def _extract_generic_history(history, which='unknown'): + # given a tree like this: + # { + # "1_month": { + # "count": 187, + # "factor": 0.001001001001001001, + # "first": "2015-02-27 06:00:00", + # "interval": 14400, + # "last": "2015-03-30 06:00:00", + # "values": [ + # 999, + # 999 + # ] + # }, + # "1_week": { + # "count": 169, + # "factor": 0.001001001001001001, + # "first": "2015-03-23 07:30:00", + # "interval": 3600, + # "last": "2015-03-30 07:30:00", + # "values": [ ...] + # }, + # "1_year": { + # "count": 177, + # "factor": 0.001001001001001001, + # "first": "2014-04-11 00:00:00", + # "interval": 172800, + # "last": "2015-03-29 00:00:00", + # "values": [ ...] + # }, + # "3_months": { + # "count": 185, + # "factor": 0.001001001001001001, + # "first": "2014-12-28 06:00:00", + # "interval": 43200, + # "last": "2015-03-30 06:00:00", + # "values": [ ...] + # } + # }, + # extract exactly one piece of data per time interval, + # using smaller intervals where available. + # + # returns list of (age, length, value) dictionaries. + + generic_history = [] + + periods = history.keys() + periods.sort(key = lambda x: history[x]['interval']) + now = datetime.datetime.utcnow() + newest = now + for p in periods: + h = history[p] + interval = datetime.timedelta(seconds = h['interval']) + this_ts = parse_ts(h['last']) + + if (len(h['values']) != h['count']): + logging.warning('Inconsistent value count in %s document for %s' + %(p, which)) + for v in reversed(h['values']): + if (this_ts <= newest): + agt1 = now - this_ts + agt2 = interval + agetmp1 = (agt1.microseconds + (agt1.seconds + agt1.days * 24 * 3600) + * 10**6) / 10**6 + agetmp2 = (agt2.microseconds + (agt2.seconds + agt2.days * 24 * 3600) + * 10**6) / 10**6 + generic_history.append( + { 'age': agetmp1, + 'length': agetmp2, + 'value': v + }) + newest = this_ts + this_ts -= interval + + if (this_ts + interval != parse_ts(h['first'])): + logging.warning('Inconsistent time information in %s document for %s' + %(p, which)) + + #print json.dumps(generic_history, sort_keys=True, + # indent=4, separators=(',', ': ')) + return generic_history + + @staticmethod + def _avg_generic_history(generic_history): + a = [] + for i in generic_history: + if i['age'] > (ADDRESS_AND_PORT_STABLE_DAYS * 24 * 3600): + continue + if (i['length'] is not None + and i['age'] is not None + and i['value'] is not None): + w = i['length'] * math.pow(AGE_ALPHA, i['age']/(3600*24)) + a.append( (i['value'] * w, w) ) + + sv = math.fsum(map(lambda x: x[0], a)) + sw = math.fsum(map(lambda x: x[1], a)) + + if sw == 0.0: + svw = 0.0 + else: + svw = sv/sw + return svw + + def _add_generic_history(self, history): + periods = r['read_history'].keys() + periods.sort(key = lambda x: r['read_history'][x]['interval'] ) + + print periods + + def add_running_history(self, history): + pass + + def add_uptime(self, uptime): + logging.debug('Adding uptime %s.'%(self._fpr,)) + + # flags we care about: Running, V2Dir, Guard + if not 'flags' in uptime: + logging.debug('No flags in document for %s.'%(self._fpr,)) + return + + for f in ['Running', 'Guard', 'V2Dir']: + if not f in uptime['flags']: + logging.debug('No %s in flags for %s.'%(f, self._fpr,)) + return + + running = self._extract_generic_history(uptime['flags']['Running'], + '%s-Running'%(self._fpr)) + guard = self._extract_generic_history(uptime['flags']['Guard'], + '%s-Guard'%(self._fpr)) + v2dir = self._extract_generic_history(uptime['flags']['V2Dir'], + '%s-V2Dir'%(self._fpr)) + if 'BadExit' in uptime['flags']: + badexit = self._extract_generic_history(uptime['flags']['BadExit'], + '%s-BadExit'%(self._fpr)) + + self._running = self._avg_generic_history(running) / ONIONOO_SCALE_ONE + self._guard = self._avg_generic_history(guard) / ONIONOO_SCALE_ONE + self._v2dir = self._avg_generic_history(v2dir) / ONIONOO_SCALE_ONE + self._badexit = None + if 'BadExit' in uptime['flags']: + self._badexit = self._avg_generic_history(badexit) / ONIONOO_SCALE_ONE + + def is_candidate(self): + try: + if (MUST_BE_RUNNING_NOW and not self.is_running()): + log_excluded('%s not a candidate: not running now, unable to check ' + + 'DirPort consensus download', self._fpr) + return False + if (self._data['last_changed_address_or_port'] > + self.CUTOFF_ADDRESS_AND_PORT_STABLE): + log_excluded('%s not a candidate: changed address/port recently (%s)', + self._fpr, self._data['last_changed_address_or_port']) + return False + if self._running < CUTOFF_RUNNING: + log_excluded('%s not a candidate: running avg too low (%lf)', + self._fpr, self._running) + return False + if self._v2dir < CUTOFF_V2DIR: + log_excluded('%s not a candidate: v2dir avg too low (%lf)', + self._fpr, self._v2dir) + return False + if self._badexit is not None and self._badexit > PERMITTED_BADEXIT: + log_excluded('%s not a candidate: badexit avg too high (%lf)', + self._fpr, self._badexit) + return False + # this function logs a message depending on which check fails + if not self.is_valid_version(): + return False + if self._guard < CUTOFF_GUARD: + log_excluded('%s not a candidate: guard avg too low (%lf)', + self._fpr, self._guard) + return False + if (not self._data.has_key('consensus_weight') + or self._data['consensus_weight'] < 1): + log_excluded('%s not a candidate: consensus weight invalid', self._fpr) + return False + except BaseException as e: + logging.warning("Exception %s when checking if fallback is a candidate", + str(e)) + return False + return True + + def is_in_whitelist(self, relaylist): + """ A fallback matches if each key in the whitelist line matches: + ipv4 + dirport + orport + id + ipv6 address and port (if present) + If the fallback has an ipv6 key, the whitelist line must also have + it, and vice versa, otherwise they don't match. """ + ipv6 = None + if self.has_ipv6(): + ipv6 = '%s:%d'%(self.ipv6addr, self.ipv6orport) + for entry in relaylist: + if entry['id'] != self._fpr: + # can't log here unless we match an IP and port, because every relay's + # fingerprint is compared to every entry's fingerprint + if entry['ipv4'] == self.dirip and int(entry['orport']) == self.orport: + logging.warning('%s excluded: has OR %s:%d changed fingerprint to ' + + '%s?', entry['id'], self.dirip, self.orport, + self._fpr) + if self.has_ipv6() and entry.has_key('ipv6') and entry['ipv6'] == ipv6: + logging.warning('%s excluded: has OR %s changed fingerprint to ' + + '%s?', entry['id'], ipv6, self._fpr) + continue + if entry['ipv4'] != self.dirip: + logging.warning('%s excluded: has it changed IPv4 from %s to %s?', + self._fpr, entry['ipv4'], self.dirip) + continue + if int(entry['dirport']) != self.dirport: + logging.warning('%s excluded: has it changed DirPort from %s:%d to ' + + '%s:%d?', self._fpr, self.dirip, int(entry['dirport']), + self.dirip, self.dirport) + continue + if int(entry['orport']) != self.orport: + logging.warning('%s excluded: has it changed ORPort from %s:%d to ' + + '%s:%d?', self._fpr, self.dirip, int(entry['orport']), + self.dirip, self.orport) + continue + if entry.has_key('ipv6') and self.has_ipv6(): + # if both entry and fallback have an ipv6 address, compare them + if entry['ipv6'] != ipv6: + logging.warning('%s excluded: has it changed IPv6 ORPort from %s ' + + 'to %s?', self._fpr, entry['ipv6'], ipv6) + continue + # if the fallback has an IPv6 address but the whitelist entry + # doesn't, or vice versa, the whitelist entry doesn't match + elif entry.has_key('ipv6') and not self.has_ipv6(): + logging.warning('%s excluded: has it lost its former IPv6 address %s?', + self._fpr, entry['ipv6']) + continue + elif not entry.has_key('ipv6') and self.has_ipv6(): + logging.warning('%s excluded: has it gained an IPv6 address %s?', + self._fpr, ipv6) + continue + return True + return False + + def is_in_blacklist(self, relaylist): + """ A fallback matches a blacklist line if a sufficiently specific group + of attributes matches: + ipv4 & dirport + ipv4 & orport + id + ipv6 & dirport + ipv6 & ipv6 orport + If the fallback and the blacklist line both have an ipv6 key, + their values will be compared, otherwise, they will be ignored. + If there is no dirport and no orport, the entry matches all relays on + that ip. """ + for entry in relaylist: + for key in entry: + value = entry[key] + if key == 'id' and value == self._fpr: + log_excluded('%s is in the blacklist: fingerprint matches', + self._fpr) + return True + if key == 'ipv4' and value == self.dirip: + # if the dirport is present, check it too + if entry.has_key('dirport'): + if int(entry['dirport']) == self.dirport: + log_excluded('%s is in the blacklist: IPv4 (%s) and ' + + 'DirPort (%d) match', self._fpr, self.dirip, + self.dirport) + return True + # if the orport is present, check it too + elif entry.has_key('orport'): + if int(entry['orport']) == self.orport: + log_excluded('%s is in the blacklist: IPv4 (%s) and ' + + 'ORPort (%d) match', self._fpr, self.dirip, + self.orport) + return True + else: + log_excluded('%s is in the blacklist: IPv4 (%s) matches, and ' + + 'entry has no DirPort or ORPort', self._fpr, + self.dirip) + return True + ipv6 = None + if self.has_ipv6(): + ipv6 = '%s:%d'%(self.ipv6addr, self.ipv6orport) + if (key == 'ipv6' and self.has_ipv6()): + # if both entry and fallback have an ipv6 address, compare them, + # otherwise, disregard ipv6 addresses + if value == ipv6: + # if the dirport is present, check it too + if entry.has_key('dirport'): + if int(entry['dirport']) == self.dirport: + log_excluded('%s is in the blacklist: IPv6 (%s) and ' + + 'DirPort (%d) match', self._fpr, ipv6, + self.dirport) + return True + # we've already checked the ORPort, it's part of entry['ipv6'] + else: + log_excluded('%s is in the blacklist: IPv6 (%s) matches, and' + + 'entry has no DirPort', self._fpr, ipv6) + return True + elif (key == 'ipv6' or self.has_ipv6()): + # only log if the fingerprint matches but the IPv6 doesn't + if entry.has_key('id') and entry['id'] == self._fpr: + log_excluded('%s skipping IPv6 blacklist comparison: relay ' + + 'has%s IPv6%s, but entry has%s IPv6%s', self._fpr, + '' if self.has_ipv6() else ' no', + (' (' + ipv6 + ')') if self.has_ipv6() else '', + '' if key == 'ipv6' else ' no', + (' (' + value + ')') if key == 'ipv6' else '') + logging.warning('Has %s %s IPv6 address %s?', self._fpr, + 'gained an' if self.has_ipv6() else 'lost its former', + ipv6 if self.has_ipv6() else value) + return False + + def cw_to_bw_factor(self): + # any relays with a missing or zero consensus weight are not candidates + # any relays with a missing advertised bandwidth have it set to zero + return self._data['advertised_bandwidth'] / self._data['consensus_weight'] + + # since advertised_bandwidth is reported by the relay, it can be gamed + # to avoid this, use the median consensus weight to bandwidth factor to + # estimate this relay's measured bandwidth, and make that the upper limit + def measured_bandwidth(self, median_cw_to_bw_factor): + cw_to_bw= median_cw_to_bw_factor + # Reduce exit bandwidth to make sure we're not overloading them + if self.is_exit(): + cw_to_bw *= EXIT_BANDWIDTH_FRACTION + measured_bandwidth = self._data['consensus_weight'] * cw_to_bw + if self._data['advertised_bandwidth'] != 0: + # limit advertised bandwidth (if available) to measured bandwidth + return min(measured_bandwidth, self._data['advertised_bandwidth']) + else: + return measured_bandwidth + + def set_measured_bandwidth(self, median_cw_to_bw_factor): + self._data['measured_bandwidth'] = self.measured_bandwidth( + median_cw_to_bw_factor) + + def is_exit(self): + return 'Exit' in self._data['flags'] + + def is_guard(self): + return 'Guard' in self._data['flags'] + + def is_running(self): + return 'Running' in self._data['flags'] + + # does this fallback have an IPv6 address and orport? + def has_ipv6(self): + return self.ipv6addr is not None and self.ipv6orport is not None + + # strip leading and trailing brackets from an IPv6 address + # safe to use on non-bracketed IPv6 and on IPv4 addresses + # also convert to unicode, and make None appear as '' + @staticmethod + def strip_ipv6_brackets(ip): + if ip is None: + return unicode('') + if len(ip) < 2: + return unicode(ip) + if ip[0] == '[' and ip[-1] == ']': + return unicode(ip[1:-1]) + return unicode(ip) + + # are ip_a and ip_b in the same netblock? + # mask_bits is the size of the netblock + # takes both IPv4 and IPv6 addresses + # the versions of ip_a and ip_b must be the same + # the mask must be valid for the IP version + @staticmethod + def netblocks_equal(ip_a, ip_b, mask_bits): + if ip_a is None or ip_b is None: + return False + ip_a = Candidate.strip_ipv6_brackets(ip_a) + ip_b = Candidate.strip_ipv6_brackets(ip_b) + a = ipaddress.ip_address(ip_a) + b = ipaddress.ip_address(ip_b) + if a.version != b.version: + raise Exception('Mismatching IP versions in %s and %s'%(ip_a, ip_b)) + if mask_bits > a.max_prefixlen: + logging.error('Bad IP mask %d for %s and %s'%(mask_bits, ip_a, ip_b)) + mask_bits = a.max_prefixlen + if mask_bits < 0: + logging.error('Bad IP mask %d for %s and %s'%(mask_bits, ip_a, ip_b)) + mask_bits = 0 + a_net = ipaddress.ip_network('%s/%d'%(ip_a, mask_bits), strict=False) + return b in a_net + + # is this fallback's IPv4 address (dirip) in the same netblock as other's + # IPv4 address? + # mask_bits is the size of the netblock + def ipv4_netblocks_equal(self, other, mask_bits): + return Candidate.netblocks_equal(self.dirip, other.dirip, mask_bits) + + # is this fallback's IPv6 address (ipv6addr) in the same netblock as + # other's IPv6 address? + # Returns False if either fallback has no IPv6 address + # mask_bits is the size of the netblock + def ipv6_netblocks_equal(self, other, mask_bits): + if not self.has_ipv6() or not other.has_ipv6(): + return False + return Candidate.netblocks_equal(self.ipv6addr, other.ipv6addr, mask_bits) + + # is this fallback's IPv4 DirPort the same as other's IPv4 DirPort? + def dirport_equal(self, other): + return self.dirport == other.dirport + + # is this fallback's IPv4 ORPort the same as other's IPv4 ORPort? + def ipv4_orport_equal(self, other): + return self.orport == other.orport + + # is this fallback's IPv6 ORPort the same as other's IPv6 ORPort? + # Returns False if either fallback has no IPv6 address + def ipv6_orport_equal(self, other): + if not self.has_ipv6() or not other.has_ipv6(): + return False + return self.ipv6orport == other.ipv6orport + + # does this fallback have the same DirPort, IPv4 ORPort, or + # IPv6 ORPort as other? + # Ignores IPv6 ORPort if either fallback has no IPv6 address + def port_equal(self, other): + return (self.dirport_equal(other) or self.ipv4_orport_equal(other) + or self.ipv6_orport_equal(other)) + + # return a list containing IPv4 ORPort, DirPort, and IPv6 ORPort (if present) + def port_list(self): + ports = [self.dirport, self.orport] + if self.has_ipv6() and not self.ipv6orport in ports: + ports.append(self.ipv6orport) + return ports + + # does this fallback share a port with other, regardless of whether the + # port types match? + # For example, if self's IPv4 ORPort is 80 and other's DirPort is 80, + # return True + def port_shared(self, other): + for p in self.port_list(): + if p in other.port_list(): + return True + return False + + # log how long it takes to download a consensus from dirip:dirport + # returns True if the download failed, False if it succeeded within max_time + @staticmethod + def fallback_consensus_download_speed(dirip, dirport, nickname, fingerprint, + max_time): + download_failed = False + # some directory mirrors respond to requests in ways that hang python + # sockets, which is why we log this line here + logging.info('Initiating %sconsensus download from %s (%s:%d) %s.', + 'microdesc ' if DOWNLOAD_MICRODESC_CONSENSUS else '', + nickname, dirip, dirport, fingerprint) + # there appears to be about 1 second of overhead when comparing stem's + # internal trace time and the elapsed time calculated here + TIMEOUT_SLOP = 1.0 + start = datetime.datetime.utcnow() + try: + consensus = get_consensus( + endpoints = [(dirip, dirport)], + timeout = (max_time + TIMEOUT_SLOP), + validate = True, + retries = 0, + fall_back_to_authority = False, + document_handler = DocumentHandler.BARE_DOCUMENT, + microdescriptor = DOWNLOAD_MICRODESC_CONSENSUS + ).run()[0] + end = datetime.datetime.utcnow() + time_since_expiry = (end - consensus.valid_until).total_seconds() + except Exception, stem_error: + end = datetime.datetime.utcnow() + log_excluded('Unable to retrieve a consensus from %s: %s', nickname, + stem_error) + status = 'error: "%s"' % (stem_error) + level = logging.WARNING + download_failed = True + elapsed = (end - start).total_seconds() + if download_failed: + # keep the error failure status, and avoid using the variables + pass + elif elapsed > max_time: + status = 'too slow' + level = logging.WARNING + download_failed = True + elif (time_since_expiry > 0): + status = 'outdated consensus, expired %ds ago'%(int(time_since_expiry)) + if time_since_expiry <= CONSENSUS_EXPIRY_TOLERANCE: + status += ', tolerating up to %ds'%(CONSENSUS_EXPIRY_TOLERANCE) + level = logging.INFO + else: + status += ', invalid' + level = logging.WARNING + download_failed = True + else: + status = 'ok' + level = logging.DEBUG + logging.log(level, 'Consensus download: %0.1fs %s from %s (%s:%d) %s, ' + + 'max download time %0.1fs.', elapsed, status, nickname, + dirip, dirport, fingerprint, max_time) + return download_failed + + # does this fallback download the consensus fast enough? + def check_fallback_download_consensus(self): + # include the relay if we're not doing a check, or we can't check (IPv6) + ipv4_failed = False + ipv6_failed = False + if PERFORM_IPV4_DIRPORT_CHECKS: + ipv4_failed = Candidate.fallback_consensus_download_speed(self.dirip, + self.dirport, + self._data['nickname'], + self._fpr, + CONSENSUS_DOWNLOAD_SPEED_MAX) + if self.has_ipv6() and PERFORM_IPV6_DIRPORT_CHECKS: + # Clients assume the IPv6 DirPort is the same as the IPv4 DirPort + ipv6_failed = Candidate.fallback_consensus_download_speed(self.ipv6addr, + self.dirport, + self._data['nickname'], + self._fpr, + CONSENSUS_DOWNLOAD_SPEED_MAX) + return ((not ipv4_failed) and (not ipv6_failed)) + + # if this fallback has not passed a download check, try it again, + # and record the result, available in get_fallback_download_consensus + def try_fallback_download_consensus(self): + if not self.get_fallback_download_consensus(): + self._data['download_check'] = self.check_fallback_download_consensus() + + # did this fallback pass the download check? + def get_fallback_download_consensus(self): + # if we're not performing checks, return True + if not PERFORM_IPV4_DIRPORT_CHECKS and not PERFORM_IPV6_DIRPORT_CHECKS: + return True + # if we are performing checks, but haven't done one, return False + if not self._data.has_key('download_check'): + return False + return self._data['download_check'] + + # output an optional header comment and info for this fallback + # try_fallback_download_consensus before calling this + def fallbackdir_line(self, fallbacks, prefilter_fallbacks): + s = '' + if OUTPUT_COMMENTS: + s += self.fallbackdir_comment(fallbacks, prefilter_fallbacks) + # if the download speed is ok, output a C string + # if it's not, but we OUTPUT_COMMENTS, output a commented-out C string + if self.get_fallback_download_consensus() or OUTPUT_COMMENTS: + s += self.fallbackdir_info(self.get_fallback_download_consensus()) + return s + + # output a header comment for this fallback + def fallbackdir_comment(self, fallbacks, prefilter_fallbacks): + # /* + # nickname + # flags + # adjusted bandwidth, consensus weight + # [contact] + # [identical contact counts] + # */ + # Multiline C comment + s = '/*' + s += '\n' + s += cleanse_c_multiline_comment(self._data['nickname']) + s += '\n' + s += 'Flags: ' + s += cleanse_c_multiline_comment(' '.join(sorted(self._data['flags']))) + s += '\n' + # this is an adjusted bandwidth, see calculate_measured_bandwidth() + bandwidth = self._data['measured_bandwidth'] + weight = self._data['consensus_weight'] + s += 'Bandwidth: %.1f MByte/s, Consensus Weight: %d'%( + bandwidth/(1024.0*1024.0), + weight) + s += '\n' + if self._data['contact'] is not None: + s += cleanse_c_multiline_comment(self._data['contact']) + if CONTACT_COUNT or CONTACT_BLACKLIST_COUNT: + fallback_count = len([f for f in fallbacks + if f._data['contact'] == self._data['contact']]) + if fallback_count > 1: + s += '\n' + s += '%d identical contacts listed' % (fallback_count) + if CONTACT_BLACKLIST_COUNT: + prefilter_count = len([f for f in prefilter_fallbacks + if f._data['contact'] == self._data['contact']]) + filter_count = prefilter_count - fallback_count + if filter_count > 0: + if fallback_count > 1: + s += ' ' + else: + s += '\n' + s += '%d blacklisted' % (filter_count) + s += '\n' + s += '*/' + s += '\n' + return s + + # output the fallback info C string for this fallback + # this is the text that would go after FallbackDir in a torrc + # if this relay failed the download test and we OUTPUT_COMMENTS, + # comment-out the returned string + def fallbackdir_info(self, dl_speed_ok): + # "address:dirport orport=port id=fingerprint" + # "[ipv6=addr:orport]" + # "weight=FALLBACK_OUTPUT_WEIGHT", + # + # Do we want a C string, or a commented-out string? + c_string = dl_speed_ok + comment_string = not dl_speed_ok and OUTPUT_COMMENTS + # If we don't want either kind of string, bail + if not c_string and not comment_string: + return '' + s = '' + # Comment out the fallback directory entry if it's too slow + # See the debug output for which address and port is failing + if comment_string: + s += '/* Consensus download failed or was too slow:\n' + # Multi-Line C string with trailing comma (part of a string list) + # This makes it easier to diff the file, and remove IPv6 lines using grep + # Integers don't need escaping + s += '"%s orport=%d id=%s"'%( + cleanse_c_string(self._data['dir_address']), + self.orport, + cleanse_c_string(self._fpr)) + s += '\n' + if self.has_ipv6(): + s += '" ipv6=%s:%d"'%(cleanse_c_string(self.ipv6addr), self.ipv6orport) + s += '\n' + s += '" weight=%d",'%(FALLBACK_OUTPUT_WEIGHT) + if comment_string: + s += '\n' + s += '*/' + return s + +## Fallback Candidate List Class + +class CandidateList(dict): + def __init__(self): + pass + + def _add_relay(self, details): + if not 'dir_address' in details: return + c = Candidate(details) + self[ c.get_fingerprint() ] = c + + def _add_uptime(self, uptime): + try: + fpr = uptime['fingerprint'] + except KeyError: + raise Exception("Document has no fingerprint field.") + + try: + c = self[fpr] + except KeyError: + logging.debug('Got unknown relay %s in uptime document.'%(fpr,)) + return + + c.add_uptime(uptime) + + def _add_details(self): + logging.debug('Loading details document.') + d = fetch('details', + fields=('fingerprint,nickname,contact,last_changed_address_or_port,' + + 'consensus_weight,advertised_bandwidth,or_addresses,' + + 'dir_address,recommended_version,flags,effective_family,' + + 'platform')) + logging.debug('Loading details document done.') + + if not 'relays' in d: raise Exception("No relays found in document.") + + for r in d['relays']: self._add_relay(r) + + def _add_uptimes(self): + logging.debug('Loading uptime document.') + d = fetch('uptime') + logging.debug('Loading uptime document done.') + + if not 'relays' in d: raise Exception("No relays found in document.") + for r in d['relays']: self._add_uptime(r) + + def add_relays(self): + self._add_details() + self._add_uptimes() + + def count_guards(self): + guard_count = 0 + for fpr in self.keys(): + if self[fpr].is_guard(): + guard_count += 1 + return guard_count + + # Find fallbacks that fit the uptime, stability, and flags criteria, + # and make an array of them in self.fallbacks + def compute_fallbacks(self): + self.fallbacks = map(lambda x: self[x], + filter(lambda x: self[x].is_candidate(), + self.keys())) + + # sort fallbacks by their consensus weight to advertised bandwidth factor, + # lowest to highest + # used to find the median cw_to_bw_factor() + def sort_fallbacks_by_cw_to_bw_factor(self): + self.fallbacks.sort(key=lambda f: f.cw_to_bw_factor()) + + # sort fallbacks by their measured bandwidth, highest to lowest + # calculate_measured_bandwidth before calling this + # this is useful for reviewing candidates in priority order + def sort_fallbacks_by_measured_bandwidth(self): + self.fallbacks.sort(key=lambda f: f._data['measured_bandwidth'], + reverse=True) + + # sort fallbacks by the data field data_field, lowest to highest + def sort_fallbacks_by(self, data_field): + self.fallbacks.sort(key=lambda f: f._data[data_field]) + + @staticmethod + def load_relaylist(file_obj): + """ Read each line in the file, and parse it like a FallbackDir line: + an IPv4 address and optional port: + : + which are parsed into dictionary entries: + ipv4= + dirport= + followed by a series of key=value entries: + orport= + id= + ipv6=: + each line's key/value pairs are placed in a dictonary, + (of string -> string key/value pairs), + and these dictionaries are placed in an array. + comments start with # and are ignored """ + file_data = file_obj['data'] + file_name = file_obj['name'] + relaylist = [] + if file_data is None: + return relaylist + for line in file_data.split('\n'): + relay_entry = {} + # ignore comments + line_comment_split = line.split('#') + line = line_comment_split[0] + # cleanup whitespace + line = cleanse_whitespace(line) + line = line.strip() + if len(line) == 0: + continue + for item in line.split(' '): + item = item.strip() + if len(item) == 0: + continue + key_value_split = item.split('=') + kvl = len(key_value_split) + if kvl < 1 or kvl > 2: + print '#error Bad %s item: %s, format is key=value.'%( + file_name, item) + if kvl == 1: + # assume that entries without a key are the ipv4 address, + # perhaps with a dirport + ipv4_maybe_dirport = key_value_split[0] + ipv4_maybe_dirport_split = ipv4_maybe_dirport.split(':') + dirl = len(ipv4_maybe_dirport_split) + if dirl < 1 or dirl > 2: + print '#error Bad %s IPv4 item: %s, format is ipv4:port.'%( + file_name, item) + if dirl >= 1: + relay_entry['ipv4'] = ipv4_maybe_dirport_split[0] + if dirl == 2: + relay_entry['dirport'] = ipv4_maybe_dirport_split[1] + elif kvl == 2: + relay_entry[key_value_split[0]] = key_value_split[1] + relaylist.append(relay_entry) + return relaylist + + # apply the fallback whitelist and blacklist + def apply_filter_lists(self, whitelist_obj, blacklist_obj): + excluded_count = 0 + logging.debug('Applying whitelist and blacklist.') + # parse the whitelist and blacklist + whitelist = self.load_relaylist(whitelist_obj) + blacklist = self.load_relaylist(blacklist_obj) + filtered_fallbacks = [] + for f in self.fallbacks: + in_whitelist = f.is_in_whitelist(whitelist) + in_blacklist = f.is_in_blacklist(blacklist) + if in_whitelist and in_blacklist: + if BLACKLIST_EXCLUDES_WHITELIST_ENTRIES: + # exclude + excluded_count += 1 + logging.warning('Excluding %s: in both blacklist and whitelist.', + f._fpr) + else: + # include + filtered_fallbacks.append(f) + elif in_whitelist: + # include + filtered_fallbacks.append(f) + elif in_blacklist: + # exclude + excluded_count += 1 + log_excluded('Excluding %s: in blacklist.', f._fpr) + else: + if INCLUDE_UNLISTED_ENTRIES: + # include + filtered_fallbacks.append(f) + else: + # exclude + excluded_count += 1 + log_excluded('Excluding %s: in neither blacklist nor whitelist.', + f._fpr) + self.fallbacks = filtered_fallbacks + return excluded_count + + @staticmethod + def summarise_filters(initial_count, excluded_count): + return '/* Whitelist & blacklist excluded %d of %d candidates. */'%( + excluded_count, initial_count) + + # calculate each fallback's measured bandwidth based on the median + # consensus weight to advertised bandwdith ratio + def calculate_measured_bandwidth(self): + self.sort_fallbacks_by_cw_to_bw_factor() + median_fallback = self.fallback_median(True) + if median_fallback is not None: + median_cw_to_bw_factor = median_fallback.cw_to_bw_factor() + else: + # this will never be used, because there are no fallbacks + median_cw_to_bw_factor = None + for f in self.fallbacks: + f.set_measured_bandwidth(median_cw_to_bw_factor) + + # remove relays with low measured bandwidth from the fallback list + # calculate_measured_bandwidth for each relay before calling this + def remove_low_bandwidth_relays(self): + if MIN_BANDWIDTH is None: + return + above_min_bw_fallbacks = [] + for f in self.fallbacks: + if f._data['measured_bandwidth'] >= MIN_BANDWIDTH: + above_min_bw_fallbacks.append(f) + else: + # the bandwidth we log here is limited by the relay's consensus weight + # as well as its adverttised bandwidth. See set_measured_bandwidth + # for details + log_excluded('%s not a candidate: bandwidth %.1fMByte/s too low, ' + + 'must be at least %.1fMByte/s', f._fpr, + f._data['measured_bandwidth']/(1024.0*1024.0), + MIN_BANDWIDTH/(1024.0*1024.0)) + self.fallbacks = above_min_bw_fallbacks + + # the minimum fallback in the list + # call one of the sort_fallbacks_* functions before calling this + def fallback_min(self): + if len(self.fallbacks) > 0: + return self.fallbacks[-1] + else: + return None + + # the median fallback in the list + # call one of the sort_fallbacks_* functions before calling this + def fallback_median(self, require_advertised_bandwidth): + # use the low-median when there are an evan number of fallbacks, + # for consistency with the bandwidth authorities + if len(self.fallbacks) > 0: + median_position = (len(self.fallbacks) - 1) / 2 + if not require_advertised_bandwidth: + return self.fallbacks[median_position] + # if we need advertised_bandwidth but this relay doesn't have it, + # move to a fallback with greater consensus weight until we find one + while not self.fallbacks[median_position]._data['advertised_bandwidth']: + median_position += 1 + if median_position >= len(self.fallbacks): + return None + return self.fallbacks[median_position] + else: + return None + + # the maximum fallback in the list + # call one of the sort_fallbacks_* functions before calling this + def fallback_max(self): + if len(self.fallbacks) > 0: + return self.fallbacks[0] + else: + return None + + # return a new bag suitable for storing attributes + @staticmethod + def attribute_new(): + return dict() + + # get the count of attribute in attribute_bag + # if attribute is None or the empty string, return 0 + @staticmethod + def attribute_count(attribute, attribute_bag): + if attribute is None or attribute == '': + return 0 + if attribute not in attribute_bag: + return 0 + return attribute_bag[attribute] + + # does attribute_bag contain more than max_count instances of attribute? + # if so, return False + # if not, return True + # if attribute is None or the empty string, or max_count is invalid, + # always return True + @staticmethod + def attribute_allow(attribute, attribute_bag, max_count=1): + if attribute is None or attribute == '' or max_count <= 0: + return True + elif CandidateList.attribute_count(attribute, attribute_bag) >= max_count: + return False + else: + return True + + # add attribute to attribute_bag, incrementing the count if it is already + # present + # if attribute is None or the empty string, or count is invalid, + # do nothing + @staticmethod + def attribute_add(attribute, attribute_bag, count=1): + if attribute is None or attribute == '' or count <= 0: + pass + attribute_bag.setdefault(attribute, 0) + attribute_bag[attribute] += count + + # make sure there are only MAX_FALLBACKS_PER_IP fallbacks per IPv4 address, + # and per IPv6 address + # there is only one IPv4 address on each fallback: the IPv4 DirPort address + # (we choose the IPv4 ORPort which is on the same IPv4 as the DirPort) + # there is at most one IPv6 address on each fallback: the IPv6 ORPort address + # we try to match the IPv4 ORPort, but will use any IPv6 address if needed + # (clients only use the IPv6 ORPort) + # if there is no IPv6 address, only the IPv4 address is checked + # return the number of candidates we excluded + def limit_fallbacks_same_ip(self): + ip_limit_fallbacks = [] + ip_list = CandidateList.attribute_new() + for f in self.fallbacks: + if (CandidateList.attribute_allow(f.dirip, ip_list, + MAX_FALLBACKS_PER_IPV4) + and CandidateList.attribute_allow(f.ipv6addr, ip_list, + MAX_FALLBACKS_PER_IPV6)): + ip_limit_fallbacks.append(f) + CandidateList.attribute_add(f.dirip, ip_list) + if f.has_ipv6(): + CandidateList.attribute_add(f.ipv6addr, ip_list) + elif not CandidateList.attribute_allow(f.dirip, ip_list, + MAX_FALLBACKS_PER_IPV4): + log_excluded('Eliminated %s: already have %d fallback(s) on IPv4 %s' + %(f._fpr, CandidateList.attribute_count(f.dirip, ip_list), + f.dirip)) + elif (f.has_ipv6() and + not CandidateList.attribute_allow(f.ipv6addr, ip_list, + MAX_FALLBACKS_PER_IPV6)): + log_excluded('Eliminated %s: already have %d fallback(s) on IPv6 %s' + %(f._fpr, CandidateList.attribute_count(f.ipv6addr, + ip_list), + f.ipv6addr)) + original_count = len(self.fallbacks) + self.fallbacks = ip_limit_fallbacks + return original_count - len(self.fallbacks) + + # make sure there are only MAX_FALLBACKS_PER_CONTACT fallbacks for each + # ContactInfo + # if there is no ContactInfo, allow the fallback + # this check can be gamed by providing no ContactInfo, or by setting the + # ContactInfo to match another fallback + # However, given the likelihood that relays with the same ContactInfo will + # go down at similar times, its usefulness outweighs the risk + def limit_fallbacks_same_contact(self): + contact_limit_fallbacks = [] + contact_list = CandidateList.attribute_new() + for f in self.fallbacks: + if CandidateList.attribute_allow(f._data['contact'], contact_list, + MAX_FALLBACKS_PER_CONTACT): + contact_limit_fallbacks.append(f) + CandidateList.attribute_add(f._data['contact'], contact_list) + else: + log_excluded( + 'Eliminated %s: already have %d fallback(s) on ContactInfo %s' + %(f._fpr, CandidateList.attribute_count(f._data['contact'], + contact_list), + f._data['contact'])) + original_count = len(self.fallbacks) + self.fallbacks = contact_limit_fallbacks + return original_count - len(self.fallbacks) + + # make sure there are only MAX_FALLBACKS_PER_FAMILY fallbacks per effective + # family + # if there is no family, allow the fallback + # we use effective family, which ensures mutual family declarations + # but the check can be gamed by not declaring a family at all + # if any indirect families exist, the result depends on the order in which + # fallbacks are sorted in the list + def limit_fallbacks_same_family(self): + family_limit_fallbacks = [] + fingerprint_list = CandidateList.attribute_new() + for f in self.fallbacks: + if CandidateList.attribute_allow(f._fpr, fingerprint_list, + MAX_FALLBACKS_PER_FAMILY): + family_limit_fallbacks.append(f) + CandidateList.attribute_add(f._fpr, fingerprint_list) + for family_fingerprint in f._data['effective_family']: + CandidateList.attribute_add(family_fingerprint, fingerprint_list) + else: + # we already have a fallback with this fallback in its effective + # family + log_excluded( + 'Eliminated %s: already have %d fallback(s) in effective family' + %(f._fpr, CandidateList.attribute_count(f._fpr, fingerprint_list))) + original_count = len(self.fallbacks) + self.fallbacks = family_limit_fallbacks + return original_count - len(self.fallbacks) + + # try a download check on each fallback candidate in order + # stop after max_count successful downloads + # but don't remove any candidates from the array + def try_download_consensus_checks(self, max_count): + dl_ok_count = 0 + for f in self.fallbacks: + f.try_fallback_download_consensus() + if f.get_fallback_download_consensus(): + # this fallback downloaded a consensus ok + dl_ok_count += 1 + if dl_ok_count >= max_count: + # we have enough fallbacks + return + + # put max_count successful candidates in the fallbacks array: + # - perform download checks on each fallback candidate + # - retry failed candidates if CONSENSUS_DOWNLOAD_RETRY is set + # - eliminate failed candidates + # - if there are more than max_count candidates, eliminate lowest bandwidth + # - if there are fewer than max_count candidates, leave only successful + # Return the number of fallbacks that failed the consensus check + def perform_download_consensus_checks(self, max_count): + self.sort_fallbacks_by_measured_bandwidth() + self.try_download_consensus_checks(max_count) + if CONSENSUS_DOWNLOAD_RETRY: + # try unsuccessful candidates again + # we could end up with more than max_count successful candidates here + self.try_download_consensus_checks(max_count) + # now we have at least max_count successful candidates, + # or we've tried them all + original_count = len(self.fallbacks) + self.fallbacks = filter(lambda x: x.get_fallback_download_consensus(), + self.fallbacks) + # some of these failed the check, others skipped the check, + # if we already had enough successful downloads + failed_count = original_count - len(self.fallbacks) + self.fallbacks = self.fallbacks[:max_count] + return failed_count + + # return a string that describes a/b as a percentage + @staticmethod + def describe_percentage(a, b): + if b != 0: + return '%d/%d = %.0f%%'%(a, b, (a*100.0)/b) + else: + # technically, 0/0 is undefined, but 0.0% is a sensible result + return '%d/%d = %.0f%%'%(a, b, 0.0) + + # return a dictionary of lists of fallbacks by IPv4 netblock + # the dictionary is keyed by the fingerprint of an arbitrary fallback + # in each netblock + # mask_bits is the size of the netblock + def fallbacks_by_ipv4_netblock(self, mask_bits): + netblocks = {} + for f in self.fallbacks: + found_netblock = False + for b in netblocks.keys(): + # we found an existing netblock containing this fallback + if f.ipv4_netblocks_equal(self[b], mask_bits): + # add it to the list + netblocks[b].append(f) + found_netblock = True + break + # make a new netblock based on this fallback's fingerprint + if not found_netblock: + netblocks[f._fpr] = [f] + return netblocks + + # return a dictionary of lists of fallbacks by IPv6 netblock + # where mask_bits is the size of the netblock + def fallbacks_by_ipv6_netblock(self, mask_bits): + netblocks = {} + for f in self.fallbacks: + # skip fallbacks without IPv6 addresses + if not f.has_ipv6(): + continue + found_netblock = False + for b in netblocks.keys(): + # we found an existing netblock containing this fallback + if f.ipv6_netblocks_equal(self[b], mask_bits): + # add it to the list + netblocks[b].append(f) + found_netblock = True + break + # make a new netblock based on this fallback's fingerprint + if not found_netblock: + netblocks[f._fpr] = [f] + return netblocks + + # log a message about the proportion of fallbacks in each IPv4 netblock, + # where mask_bits is the size of the netblock + def describe_fallback_ipv4_netblock_mask(self, mask_bits): + fallback_count = len(self.fallbacks) + shared_netblock_fallback_count = 0 + most_frequent_netblock = None + netblocks = self.fallbacks_by_ipv4_netblock(mask_bits) + for b in netblocks.keys(): + if len(netblocks[b]) > 1: + # how many fallbacks are in a netblock with other fallbacks? + shared_netblock_fallback_count += len(netblocks[b]) + # what's the netblock with the most fallbacks? + if (most_frequent_netblock is None + or len(netblocks[b]) > len(netblocks[most_frequent_netblock])): + most_frequent_netblock = b + logging.debug('Fallback IPv4 addresses in the same /%d:'%(mask_bits)) + for f in netblocks[b]: + logging.debug('%s - %s', f.dirip, f._fpr) + if most_frequent_netblock is not None: + logging.warning('There are %s fallbacks in the IPv4 /%d containing %s'%( + CandidateList.describe_percentage( + len(netblocks[most_frequent_netblock]), + fallback_count), + mask_bits, + self[most_frequent_netblock].dirip)) + if shared_netblock_fallback_count > 0: + logging.warning(('%s of fallbacks are in an IPv4 /%d with other ' + + 'fallbacks')%(CandidateList.describe_percentage( + shared_netblock_fallback_count, + fallback_count), + mask_bits)) + + # log a message about the proportion of fallbacks in each IPv6 netblock, + # where mask_bits is the size of the netblock + def describe_fallback_ipv6_netblock_mask(self, mask_bits): + fallback_count = len(self.fallbacks_with_ipv6()) + shared_netblock_fallback_count = 0 + most_frequent_netblock = None + netblocks = self.fallbacks_by_ipv6_netblock(mask_bits) + for b in netblocks.keys(): + if len(netblocks[b]) > 1: + # how many fallbacks are in a netblock with other fallbacks? + shared_netblock_fallback_count += len(netblocks[b]) + # what's the netblock with the most fallbacks? + if (most_frequent_netblock is None + or len(netblocks[b]) > len(netblocks[most_frequent_netblock])): + most_frequent_netblock = b + logging.debug('Fallback IPv6 addresses in the same /%d:'%(mask_bits)) + for f in netblocks[b]: + logging.debug('%s - %s', f.ipv6addr, f._fpr) + if most_frequent_netblock is not None: + logging.warning('There are %s fallbacks in the IPv6 /%d containing %s'%( + CandidateList.describe_percentage( + len(netblocks[most_frequent_netblock]), + fallback_count), + mask_bits, + self[most_frequent_netblock].ipv6addr)) + if shared_netblock_fallback_count > 0: + logging.warning(('%s of fallbacks are in an IPv6 /%d with other ' + + 'fallbacks')%(CandidateList.describe_percentage( + shared_netblock_fallback_count, + fallback_count), + mask_bits)) + + # log a message about the proportion of fallbacks in each IPv4 /8, /16, + # and /24 + def describe_fallback_ipv4_netblocks(self): + # this doesn't actually tell us anything useful + #self.describe_fallback_ipv4_netblock_mask(8) + self.describe_fallback_ipv4_netblock_mask(16) + self.describe_fallback_ipv4_netblock_mask(24) + + # log a message about the proportion of fallbacks in each IPv6 /12 (RIR), + # /23 (smaller RIR blocks), /32 (LIR), /48 (Customer), and /64 (Host) + # https://www.iana.org/assignments/ipv6-unicast-address-assignments/ + def describe_fallback_ipv6_netblocks(self): + # these don't actually tell us anything useful + #self.describe_fallback_ipv6_netblock_mask(12) + #self.describe_fallback_ipv6_netblock_mask(23) + self.describe_fallback_ipv6_netblock_mask(32) + self.describe_fallback_ipv6_netblock_mask(48) + self.describe_fallback_ipv6_netblock_mask(64) + + # log a message about the proportion of fallbacks in each IPv4 and IPv6 + # netblock + def describe_fallback_netblocks(self): + self.describe_fallback_ipv4_netblocks() + self.describe_fallback_ipv6_netblocks() + + # return a list of fallbacks which are on the IPv4 ORPort port + def fallbacks_on_ipv4_orport(self, port): + return filter(lambda x: x.orport == port, self.fallbacks) + + # return a list of fallbacks which are on the IPv6 ORPort port + def fallbacks_on_ipv6_orport(self, port): + return filter(lambda x: x.ipv6orport == port, self.fallbacks_with_ipv6()) + + # return a list of fallbacks which are on the DirPort port + def fallbacks_on_dirport(self, port): + return filter(lambda x: x.dirport == port, self.fallbacks) + + # log a message about the proportion of fallbacks on IPv4 ORPort port + # and return that count + def describe_fallback_ipv4_orport(self, port): + port_count = len(self.fallbacks_on_ipv4_orport(port)) + fallback_count = len(self.fallbacks) + logging.warning('%s of fallbacks are on IPv4 ORPort %d'%( + CandidateList.describe_percentage(port_count, + fallback_count), + port)) + return port_count + + # log a message about the proportion of IPv6 fallbacks on IPv6 ORPort port + # and return that count + def describe_fallback_ipv6_orport(self, port): + port_count = len(self.fallbacks_on_ipv6_orport(port)) + fallback_count = len(self.fallbacks_with_ipv6()) + logging.warning('%s of IPv6 fallbacks are on IPv6 ORPort %d'%( + CandidateList.describe_percentage(port_count, + fallback_count), + port)) + return port_count + + # log a message about the proportion of fallbacks on DirPort port + # and return that count + def describe_fallback_dirport(self, port): + port_count = len(self.fallbacks_on_dirport(port)) + fallback_count = len(self.fallbacks) + logging.warning('%s of fallbacks are on DirPort %d'%( + CandidateList.describe_percentage(port_count, + fallback_count), + port)) + return port_count + + # log a message about the proportion of fallbacks on each dirport, + # each IPv4 orport, and each IPv6 orport + def describe_fallback_ports(self): + fallback_count = len(self.fallbacks) + ipv4_or_count = fallback_count + ipv4_or_count -= self.describe_fallback_ipv4_orport(443) + ipv4_or_count -= self.describe_fallback_ipv4_orport(9001) + logging.warning('%s of fallbacks are on other IPv4 ORPorts'%( + CandidateList.describe_percentage(ipv4_or_count, + fallback_count))) + ipv6_fallback_count = len(self.fallbacks_with_ipv6()) + ipv6_or_count = ipv6_fallback_count + ipv6_or_count -= self.describe_fallback_ipv6_orport(443) + ipv6_or_count -= self.describe_fallback_ipv6_orport(9001) + logging.warning('%s of IPv6 fallbacks are on other IPv6 ORPorts'%( + CandidateList.describe_percentage(ipv6_or_count, + ipv6_fallback_count))) + dir_count = fallback_count + dir_count -= self.describe_fallback_dirport(80) + dir_count -= self.describe_fallback_dirport(9030) + logging.warning('%s of fallbacks are on other DirPorts'%( + CandidateList.describe_percentage(dir_count, + fallback_count))) + + # return a list of fallbacks which have the Exit flag + def fallbacks_with_exit(self): + return filter(lambda x: x.is_exit(), self.fallbacks) + + # log a message about the proportion of fallbacks with an Exit flag + def describe_fallback_exit_flag(self): + exit_falback_count = len(self.fallbacks_with_exit()) + fallback_count = len(self.fallbacks) + logging.warning('%s of fallbacks have the Exit flag'%( + CandidateList.describe_percentage(exit_falback_count, + fallback_count))) + + # return a list of fallbacks which have an IPv6 address + def fallbacks_with_ipv6(self): + return filter(lambda x: x.has_ipv6(), self.fallbacks) + + # log a message about the proportion of fallbacks on IPv6 + def describe_fallback_ip_family(self): + ipv6_falback_count = len(self.fallbacks_with_ipv6()) + fallback_count = len(self.fallbacks) + logging.warning('%s of fallbacks are on IPv6'%( + CandidateList.describe_percentage(ipv6_falback_count, + fallback_count))) + + def summarise_fallbacks(self, eligible_count, operator_count, failed_count, + guard_count, target_count): + s = '' + s += '/* To comment-out entries in this file, use C comments, and add *' + s += ' to the start of each line. (stem finds fallback entries using "' + s += ' at the start of a line.) */' + s += '\n' + # Report: + # whether we checked consensus download times + # the number of fallback directories (and limits/exclusions, if relevant) + # min & max fallback bandwidths + # #error if below minimum count + if PERFORM_IPV4_DIRPORT_CHECKS or PERFORM_IPV6_DIRPORT_CHECKS: + s += '/* Checked %s%s%s DirPorts served a consensus within %.1fs. */'%( + 'IPv4' if PERFORM_IPV4_DIRPORT_CHECKS else '', + ' and ' if (PERFORM_IPV4_DIRPORT_CHECKS + and PERFORM_IPV6_DIRPORT_CHECKS) else '', + 'IPv6' if PERFORM_IPV6_DIRPORT_CHECKS else '', + CONSENSUS_DOWNLOAD_SPEED_MAX) + else: + s += '/* Did not check IPv4 or IPv6 DirPort consensus downloads. */' + s += '\n' + # Multiline C comment with #error if things go bad + s += '/*' + s += '\n' + # Integers don't need escaping in C comments + fallback_count = len(self.fallbacks) + if FALLBACK_PROPORTION_OF_GUARDS is None: + fallback_proportion = '' + else: + fallback_proportion = ', Target %d (%d * %.2f)'%(target_count, + guard_count, + FALLBACK_PROPORTION_OF_GUARDS) + s += 'Final Count: %d (Eligible %d%s'%(fallback_count, eligible_count, + fallback_proportion) + if MAX_FALLBACK_COUNT is not None: + s += ', Max %d'%(MAX_FALLBACK_COUNT) + s += ')\n' + if eligible_count != fallback_count: + removed_count = eligible_count - fallback_count + excess_to_target_or_max = (eligible_count - operator_count - failed_count + - fallback_count) + # some 'Failed' failed the check, others 'Skipped' the check, + # if we already had enough successful downloads + s += ('Excluded: %d (Same Operator %d, Failed/Skipped Download %d, ' + + 'Excess %d)')%(removed_count, operator_count, failed_count, + excess_to_target_or_max) + s += '\n' + min_fb = self.fallback_min() + min_bw = min_fb._data['measured_bandwidth'] + max_fb = self.fallback_max() + max_bw = max_fb._data['measured_bandwidth'] + s += 'Bandwidth Range: %.1f - %.1f MByte/s'%(min_bw/(1024.0*1024.0), + max_bw/(1024.0*1024.0)) + s += '\n' + s += '*/' + if fallback_count < MIN_FALLBACK_COUNT: + # We must have a minimum number of fallbacks so they are always + # reachable, and are in diverse locations + s += '\n' + s += '#error Fallback Count %d is too low. '%(fallback_count) + s += 'Must be at least %d for diversity. '%(MIN_FALLBACK_COUNT) + s += 'Try adding entries to the whitelist, ' + s += 'or setting INCLUDE_UNLISTED_ENTRIES = True.' + return s + +def process_existing(): + logging.basicConfig(level=logging.INFO) + logging.getLogger('stem').setLevel(logging.INFO) + whitelist = {'data': parse_fallback_file(FALLBACK_FILE_NAME), + 'name': FALLBACK_FILE_NAME} + blacklist = {'data': read_from_file(BLACKLIST_FILE_NAME, MAX_LIST_FILE_SIZE), + 'name': BLACKLIST_FILE_NAME} + list_fallbacks(whitelist, blacklist) + +def process_default(): + logging.basicConfig(level=logging.WARNING) + logging.getLogger('stem').setLevel(logging.WARNING) + whitelist = {'data': read_from_file(WHITELIST_FILE_NAME, MAX_LIST_FILE_SIZE), + 'name': WHITELIST_FILE_NAME} + blacklist = {'data': read_from_file(BLACKLIST_FILE_NAME, MAX_LIST_FILE_SIZE), + 'name': BLACKLIST_FILE_NAME} + list_fallbacks(whitelist, blacklist) + +## Main Function +def main(): + if get_command() == 'check_existing': + process_existing() + else: + process_default() + +def get_command(): + if len(sys.argv) == 2: + return sys.argv[1] + else: + return None + +def log_excluded(msg, *args): + if get_command() == 'check_existing': + logging.warning(msg, *args) + else: + logging.info(msg, *args) + +def list_fallbacks(whitelist, blacklist): + """ Fetches required onionoo documents and evaluates the + fallback directory criteria for each of the relays """ + + logging.warning('Downloading and parsing Onionoo data. ' + + 'This may take some time.') + # find relays that could be fallbacks + candidates = CandidateList() + candidates.add_relays() + + # work out how many fallbacks we want + guard_count = candidates.count_guards() + if FALLBACK_PROPORTION_OF_GUARDS is None: + target_count = guard_count + else: + target_count = int(guard_count * FALLBACK_PROPORTION_OF_GUARDS) + # the maximum number of fallbacks is the least of: + # - the target fallback count (FALLBACK_PROPORTION_OF_GUARDS * guard count) + # - the maximum fallback count (MAX_FALLBACK_COUNT) + if MAX_FALLBACK_COUNT is None: + max_count = target_count + else: + max_count = min(target_count, MAX_FALLBACK_COUNT) + + candidates.compute_fallbacks() + prefilter_fallbacks = copy.copy(candidates.fallbacks) + + # filter with the whitelist and blacklist + # if a relay has changed IPv4 address or ports recently, it will be excluded + # as ineligible before we call apply_filter_lists, and so there will be no + # warning that the details have changed from those in the whitelist. + # instead, there will be an info-level log during the eligibility check. + initial_count = len(candidates.fallbacks) + excluded_count = candidates.apply_filter_lists(whitelist, blacklist) + print candidates.summarise_filters(initial_count, excluded_count) + eligible_count = len(candidates.fallbacks) + + # calculate the measured bandwidth of each relay, + # then remove low-bandwidth relays + candidates.calculate_measured_bandwidth() + candidates.remove_low_bandwidth_relays() + + # print the raw fallback list + #for x in candidates.fallbacks: + # print x.fallbackdir_line(True) + # print json.dumps(candidates[x]._data, sort_keys=True, indent=4, + # separators=(',', ': '), default=json_util.default) + + # impose mandatory conditions here, like one per contact, family, IP + # in measured bandwidth order + candidates.sort_fallbacks_by_measured_bandwidth() + operator_count = 0 + # only impose these limits on the final list - operators can nominate + # multiple candidate fallbacks, and then we choose the best set + if not OUTPUT_CANDIDATES: + operator_count += candidates.limit_fallbacks_same_ip() + operator_count += candidates.limit_fallbacks_same_contact() + operator_count += candidates.limit_fallbacks_same_family() + + # check if each candidate can serve a consensus + # there's a small risk we've eliminated relays from the same operator that + # can serve a consensus, in favour of one that can't + # but given it takes up to 15 seconds to check each consensus download, + # the risk is worth it + if PERFORM_IPV4_DIRPORT_CHECKS or PERFORM_IPV6_DIRPORT_CHECKS: + logging.warning('Checking consensus download speeds. ' + + 'This may take some time.') + failed_count = candidates.perform_download_consensus_checks(max_count) + + # analyse and log interesting diversity metrics + # like netblock, ports, exit, IPv4-only + # (we can't easily analyse AS, and it's hard to accurately analyse country) + candidates.describe_fallback_ip_family() + # if we can't import the ipaddress module, we can't do netblock analysis + if HAVE_IPADDRESS: + candidates.describe_fallback_netblocks() + candidates.describe_fallback_ports() + candidates.describe_fallback_exit_flag() + + # output C comments summarising the fallback selection process + if len(candidates.fallbacks) > 0: + print candidates.summarise_fallbacks(eligible_count, operator_count, + failed_count, guard_count, + target_count) + else: + print '/* No Fallbacks met criteria */' + + # output C comments specifying the OnionOO data used to create the list + for s in fetch_source_list(): + print describe_fetch_source(s) + + # sort the list differently depending on why we've created it: + # if we're outputting the final fallback list, sort by fingerprint + # this makes diffs much more stable + # otherwise, if we're trying to find a bandwidth cutoff, or we want to + # contact operators in priority order, sort by bandwidth (not yet + # implemented) + # otherwise, if we're contacting operators, sort by contact + candidates.sort_fallbacks_by(OUTPUT_SORT_FIELD) + + for x in candidates.fallbacks: + print x.fallbackdir_line(candidates.fallbacks, prefilter_fallbacks) + +if __name__ == "__main__": + main() diff --git a/src/wraith/scripts/maint/updateVersions.pl.in b/src/wraith/scripts/maint/updateVersions.pl.in new file mode 100644 index 000000000..65c51a1f2 --- /dev/null +++ b/src/wraith/scripts/maint/updateVersions.pl.in @@ -0,0 +1,59 @@ +#!/usr/bin/perl -w + +$CONFIGURE_IN = '@abs_top_srcdir@/configure.ac'; +$ORCONFIG_H = '@abs_top_srcdir@/src/win32/orconfig.h'; +$TOR_NSI = '@abs_top_srcdir@/contrib/win32build/tor-mingw.nsi.in'; + +$quiet = 1; + +sub demand { + my $fn = shift; + die "Missing file $fn" unless (-f $fn); +} + +demand($CONFIGURE_IN); +demand($ORCONFIG_H); +demand($TOR_NSI); + +# extract version from configure.ac + +open(F, $CONFIGURE_IN) or die "$!"; +$version = undef; +while () { + if (/AC_INIT\(\[tor\],\s*\[([^\]]*)\]\)/) { + $version = $1; + last; + } +} +die "No version found" unless $version; +print "Tor version is $version\n" unless $quiet; +close F; + +sub correctversion { + my ($fn, $defchar) = @_; + undef $/; + open(F, $fn) or die "$!"; + my $s = ; + close F; + if ($s =~ /^$defchar(?:)define\s+VERSION\s+\"([^\"]+)\"/m) { + $oldver = $1; + if ($oldver ne $version) { + print "Version mismatch in $fn: It thinks that the version is $oldver. I think it's $version. Fixing.\n"; + $line = $defchar . "define VERSION \"$version\""; + open(F, ">$fn.bak"); + print F $s; + close F; + $s =~ s/^$defchar(?:)define\s+VERSION.*?$/$line/m; + open(F, ">$fn"); + print F $s; + close F; + } else { + print "$fn has the correct version. Good.\n" unless $quiet; + } + } else { + print "Didn't find a version line in $fn -- uh oh.\n"; + } +} + +correctversion($TOR_NSI, "!"); +correctversion($ORCONFIG_H, "#"); diff --git a/src/wraith/scripts/test/cov-blame b/src/wraith/scripts/test/cov-blame new file mode 100644 index 000000000..601f21195 --- /dev/null +++ b/src/wraith/scripts/test/cov-blame @@ -0,0 +1,48 @@ +#!/usr/bin/python + +import os +import re +import subprocess +import sys + +def handle_file(source_fname, cov_fname): + + lines_blm = subprocess.Popen(["git", "blame", source_fname], stdout=subprocess.PIPE).stdout.readlines() + lines_cov = open(cov_fname).readlines() + + # XXXX expensive! + while re.match(r'\s*-:\s*0:', lines_cov[0]): + del lines_cov[0] + + if len(lines_blm) != len(lines_cov): + print >>sys.stderr, "MISMATCH IN NUMBER OF LINES in",source_fname + + for b,c in zip(lines_blm, lines_cov): + m = re.match(r'\s*([^\s:]+):', c) + if not m: + print >>sys.stderr, "CONFUSING LINE %r"% c + cov = 'X' + elif m.group(1) == '-': + cov = '-' + elif m.group(1)[0] == '#': + cov = '#' + elif m.group(1)[0].isdigit(): + cov = '1' + else: + print >>sys.stderr, "CONFUSING LINE %r"% c + cov = 'X' + + print cov, b, + +COV_DIR = sys.argv[1] +SOURCES = sys.argv[2:] + +for fn in SOURCES: + _, base = os.path.split(fn) + cfn = os.path.join(COV_DIR, base) + cfn += ".gcov" + if os.path.exists(cfn): + handle_file(fn, cfn) + else: + print >>sys.stderr, "NO FILE EXISTS CALLED ",cfn + diff --git a/src/wraith/scripts/test/cov-diff b/src/wraith/scripts/test/cov-diff new file mode 100644 index 000000000..ed8874d2d --- /dev/null +++ b/src/wraith/scripts/test/cov-diff @@ -0,0 +1,21 @@ +#!/bin/sh +# Copyright 2013 The Tor Project, Inc. +# See LICENSE for licensing information. + +# cov-diff -- compare two directories full of gcov files. + +DIRA="$1" +DIRB="$2" + +for B in $DIRB/*; do + A=$DIRA/`basename $B` + if [ -f $A ]; then + perl -pe 's/^\s*\!*\d+:/ 1:/; s/^([^:]+:)[\d\s]+:/$1/; s/^ *-:(Runs|Programs):.*//;' "$A" > "$A.tmp" + else + cat /dev/null > "$A.tmp" + fi + perl -pe 's/^\s*\!*\d+:/ 1:/; s/^([^:]+:)[\d\s]+:/$1/; s/^ *-:(Runs|Programs):.*//;' "$B" > "$B.tmp" + diff -u "$A.tmp" "$B.tmp" + rm "$A.tmp" "$B.tmp" +done + diff --git a/src/wraith/scripts/test/cov-display b/src/wraith/scripts/test/cov-display new file mode 100644 index 000000000..4628cd589 --- /dev/null +++ b/src/wraith/scripts/test/cov-display @@ -0,0 +1,81 @@ +#!/usr/bin/python +import sys, re, os + +none0, some0 = 0,0 +branchTaken0, branchNot0 = 0,0 + +BRANCH = False +FUNC = False + +if sys.argv[1] == '-b': + BRANCH = True + del sys.argv[1] + +if sys.argv[1] == '-f': + FUNC = True + del sys.argv[1] + +def show(name, none, some): + if some+none == 0: + none = 1 + print name, none, some, "%.02f"%(100*(float(some)/(some+none))) + + +file_args = sys.argv[1:] +files = [] +for fn in file_args: + if os.path.isdir(fn): + files.extend(os.path.join(fn, f) for f in os.listdir(fn)) + else: + files.append(fn) + +for fn in files: + none = some = branchTaken = branchNot = 0 + inFunc = "" + for line in open(fn, 'r'): + m = re.match(r'^[^:]*:([^:]*):(.*)', line) + if m: + body = m.group(2).rstrip() + lineno = m.group(1).strip() + else: + body = "" + lineno = "?" + m = re.match(r'^([A-Za-z_][A-Za-z0-9_]*)(?:, *)?\(', body) + if m: + inFunc = "%s:%s %s" %(fn,lineno,m.group(1)) + elif body == "}": + if FUNC and inFunc: + show(inFunc, none, some) + none = some = 0 + inFunc = None + if re.match(r'^ *###', line): + none += 1 + elif re.match(r'^ *\d', line): + some += 1 + else: + m = re.match(r'^branch.*taken (\d+)%', line) + if m: + if int(m.group(1)) == 0: + branchNot += 1 + else: + branchTaken += 1 + + none0 += none + some0 += some + branchTaken0 += branchTaken + branchNot0 += branchNot + if FUNC: + pass + elif BRANCH: + if branchTaken or branchNot: + show(fn, branchNot, branchTaken) + else: + if some or none: + show(fn, none, some) + +if BRANCH: + if branchTaken0 or branchNot0: + show("TOTAL", branchNot0, branchTaken0) +else: + if some0 or none0: + show("TOTAL", none0, some0) diff --git a/src/wraith/scripts/test/cov-exclude b/src/wraith/scripts/test/cov-exclude new file mode 100644 index 000000000..5cb9b1282 --- /dev/null +++ b/src/wraith/scripts/test/cov-exclude @@ -0,0 +1,34 @@ +#!/usr/bin/perl -p -i + +use warnings; +use strict; +our $excluding; + +# This script is meant to post-process a .gcov file for an input source +# that was annotated with LCOV_EXCL_START, LCOV_EXCL_STOP, and LCOV_EXCL_LINE +# entries. It doesn't understand the LCOV_EXCL_BR* variations. +# +# It replaces unreached reached lines with x:, and reached excluded lines +# with !!!num:. + +BEGIN { our $excluding = 0; } + +if (m/LCOV_EXCL_START/) { + $excluding = 1; +} +if ($excluding and m/LCOV_EXCL_STOP/) { + $excluding = 0; +} + +my $exclude_this = (m/LCOV_EXCL_LINE/); + +if ($excluding or $exclude_this) { + s{^\s*\#\#+:}{ x:}; + s{^ (\s*)(\d+):}{$1!!!$2:}; +} + +if (eof and $excluding) { + warn "Runaway LCOV_EXCL_START in $ARGV"; + $excluding = 0; +} + diff --git a/src/wraith/scripts/test/coverage b/src/wraith/scripts/test/coverage new file mode 100644 index 000000000..f10c5afaa --- /dev/null +++ b/src/wraith/scripts/test/coverage @@ -0,0 +1,46 @@ +#!/bin/sh +# Copyright 2013 The Tor Project, Inc. +# See LICENSE for licensing information. + +# coverage -- run gcov on the appropriate set of object files to extract +# coverage information. + +dst=$1 + +for fn in src/or/*.c src/common/*.c; do + BN=`basename $fn` + DN=`dirname $fn` + F=`echo $BN | sed -e 's/\.c$//;'` + GC="${BN}.gcov" + # Figure out the object file names + ONS=`echo ${DN}/src_*-${F}.o` + ONS_WILDCARD_LITERAL="${DN}/src_*-${F}.o" + # If the wildcard didn't expand, no files + if [ "$ONS" != "${ONS_WILDCARD_LITERAL}" ] + then + for on in $ONS; do + # We should have a gcno file + GCNO=`echo $on | sed -e 's/\.o$/\.gcno/;'` + if [ -e $GCNO ] + then + # No need to test for gcda, since gcov assumes no execution + # if it's absent + rm -f $GC + gcov -o $on $fn + if [ -e $GC ] + then + if [ -d "$dst" ] + then + mv $GC $dst/$GC + fi + else + echo "gcov -o $on $fn didn't make a .gcov file" + fi + else + echo "Couldn't find gcno file for $on" + fi + done + else + echo "No object file found matching source file $fn" + fi +done diff --git a/src/wraith/scripts/test/scan-build.sh b/src/wraith/scripts/test/scan-build.sh new file mode 100644 index 000000000..793adf87e --- /dev/null +++ b/src/wraith/scripts/test/scan-build.sh @@ -0,0 +1,80 @@ +#!/bin/sh +# Copyright 2014 The Tor Project, Inc +# See LICENSE for licensing information +# +# This script is used for running a bunch of clang scan-build checkers +# on Tor. + +# These don't seem to cause false positives in our code, so let's turn +# them on. +CHECKERS="\ + -enable-checker alpha.core.CallAndMessageUnInitRefArg \ + -enable-checker alpha.core.CastToStruct \ + -enable-checker alpha.core.Conversion \ + -enable-checker alpha.core.FixedAddr \ + -enable-checker alpha.core.IdenticalExpr \ + -enable-checker alpha.core.PointerArithm \ + -enable-checker alpha.core.SizeofPtr \ + -enable-checker alpha.core.TestAfterDivZero \ + -enable-checker alpha.security.MallocOverflow \ + -enable-checker alpha.security.ReturnPtrRange \ + -enable-checker alpha.unix.BlockInCriticalSection \ + -enable-checker alpha.unix.Chroot \ + -enable-checker alpha.unix.PthreadLock \ + -enable-checker alpha.unix.PthreadLock \ + -enable-checker alpha.unix.SimpleStream \ + -enable-checker alpha.unix.Stream \ + -enable-checker alpha.unix.cstring.BufferOverlap \ + -enable-checker alpha.unix.cstring.NotNullTerminated \ + -enable-checker alpha.valist.CopyToSelf \ + -enable-checker alpha.valist.Uninitialized \ + -enable-checker alpha.valist.Unterminated \ + -enable-checker security.FloatLoopCounter \ + -enable-checker security.insecureAPI.strcpy \ +" + +# These have high false-positive rates. +EXTRA_CHECKERS="\ + -enable-checker alpha.security.ArrayBoundV2 \ + -enable-checker alpha.unix.cstring.OutOfBounds \ + -enable-checker alpha.core.CastSize \ +" + +# These don't seem to generate anything useful +NOISY_CHECKERS="\ + -enable-checker alpha.clone.CloneChecker \ + -enable-checker alpha.deadcode.UnreachableCode \ +" + +if test "x$SCAN_BUILD_OUTPUT" != "x"; then + OUTPUTARG="-o $SCAN_BUILD_OUTPUT" +else + OUTPUTARG="" +fi + +scan-build \ + $CHECKERS \ + ./configure + +scan-build \ + make clean + +# Make this not get scanned for dead assignments, since it has lots of +# dead assignments we don't care about. +scan-build \ + $CHECKERS \ + -disable-checker deadcode.DeadStores \ + make -j5 -k ./src/ext/ed25519/ref10/libed25519_ref10.a + +scan-build \ + $CHECKERS $OUTPUTARG \ + make -j5 -k + +CHECKERS="\ +" + +# This one gives a false positive on every strcmp. +# -enable-checker alpha.core.PointerSub + +# Needs work +# -enable-checker alpha.unix.MallocWithAnnotations diff --git a/src/wraith/src/config/README b/src/wraith/src/config/README new file mode 100644 index 000000000..cb2debb88 --- /dev/null +++ b/src/wraith/src/config/README @@ -0,0 +1,35 @@ +This directory has configuration files that ship with Tor. They include: + +geoip +geoip6 + + Geoip files for IPv4 and IPv6 + +torrc.minimal, torrc.sample: + + generated from torrc.minimal.in and torrc.sample.in by autoconf. + +torrc.minimal.in: + + A very small torrc, suitable for installation by default in + /etc/tor/torrc. + + We try to change torrc.minimal.in as infrequently as possible, + since doing so makes the users of many packages have to re-build + their torrc files. + + +torrc.minimal.in-staging + + This is where we stage changes to torrc.minimal.in over time so + that when we have a change large enough to warrant a new + torrc.minimal.in, we can copy all the other changes over + wholesale. + +torrc.sample.in: + + A verbose, discursive, batteries-included torrc. Suitable for + letting people know how to set up various options, including those + most people shouldn't mess with. + + diff --git a/src/wraith/src/config/geoip b/src/wraith/src/config/geoip new file mode 100644 index 000000000..84bd94d97 --- /dev/null +++ b/src/wraith/src/config/geoip @@ -0,0 +1,161213 @@ +# Last updated based on December 6 2017 Maxmind GeoLite2 Country +# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz +# gunzip GeoLite2-Country.mmdb.gz +# python mmdb-convert.py GeoLite2-Country.mmdb +16777216,16777471,AU +16777472,16778239,CN +16778240,16779263,AU +16779264,16781311,CN +16781312,16785407,JP +16785408,16793599,CN +16793600,16809983,JP +16809984,16842751,TH +16842752,16843007,CN +16843008,16843263,AU +16843264,16859135,CN +16859136,16875519,JP +16875520,16908287,TH +16908288,16909055,CN +16909056,16909311,US +16909312,16941055,CN +16941056,16973823,TH +16973824,17039359,CN +17039360,17039615,AU +17039616,17072127,CN +17072128,17104895,TH +17104896,17170431,JP +17170432,17301503,IN +17301504,17367039,CN +17367040,17432575,MY +17432576,17435135,CN +17435136,17435391,AU +17435392,17465343,CN +17465344,17498111,TH +17498112,17563647,KR +17563648,17825791,CN +17825792,18087935,KR +18087936,18153471,TH +18153472,18219007,JP +18219008,18350079,IN +18350080,18874367,CN +18874368,18907135,MY +18907136,18923519,SG +18923520,18924031,HK +18924032,18924287,TW +18924288,18924799,HK +18924800,18925055,TW +18925056,18925567,HK +18925568,18926079,SG +18926080,18926207,TW +18926208,18926335,SG +18926336,18926463,TW +18926464,18926591,SG +18926592,18926719,TW +18926720,18927615,SG +18927616,18929663,TW +18929664,18931711,KR +18931712,18933759,JP +18933760,18939903,SG +18939904,19005439,JP +19005440,19005440,CN +19005441,19136511,TW +19136512,19202047,HK +19202048,19267583,PH +19267584,19398655,IN +19398656,19726335,AU +19726336,19791871,CN +19791872,19807232,TH +19807233,19807233,CN +19807234,19922943,TH +19922944,20185087,CN +20185088,20447231,VN +20447232,20971519,CN +20971520,21102591,HK +21102592,21233663,JP +21233664,21495807,CN +21495808,22020095,JP +22020096,23068671,CN +23068672,24117247,KR +24117248,24379391,JP +24379392,24641535,CN +24641536,27262975,AU +27262976,28311551,TW +28311552,28442623,KR +28442624,28540927,AU +28540928,28573695,TH +28573696,28966911,CN +28966912,29097983,IN +29097984,29884415,CN +29884416,29949951,TW +29949952,30015487,KR +30015488,30408703,CN +30408704,33554431,KR +33554432,34603007,FR +34604544,34605055,DE +34612224,34612479,AU +34612480,34612735,IL +34620416,34620927,SE +34620928,34621439,IT +34621952,34622463,NL +34636800,34637311,DE +34646528,34647551,DE +34648576,34649087,GR +34659328,34660351,GR +34673664,34674687,DE +34733056,34734079,DE +34754560,34758655,GR +34796032,34796543,NL +34803712,34807807,IT +34861056,34865151,DE +34866176,34867199,IT +34880512,34881535,DE +34910976,34911231,ES +34911232,34911743,DE +34911744,34911999,AT +34912000,34912255,GB +34912256,34912511,DE +34912512,34912767,ES +34912768,34913279,DE +34928384,34928639,DE +34930688,34938879,DE +34938880,34947071,FR +34953216,34954751,AT +34954752,34955263,NL +34955264,34959359,AT +34959360,34963455,NL +34992128,34993151,NL +34993152,34993663,FR +34993664,34993919,AT +34993920,34994175,DE +34994176,34995711,FR +34995968,34996223,NL +34999296,35001343,GB +35008512,35009023,FR +35010304,35010559,BE +35010560,35011583,FR +35011584,35012607,SE +35020800,35037183,GB +35037184,35054335,FR +35054336,35054591,GB +35055104,35055359,ES +35055872,35056127,NL +35059200,35059711,GB +35060736,35061247,GB +35061248,35061759,FR +35090432,35094527,GR +35127296,35651583,GB +35651584,36700159,IT +36700160,36962303,AE +36962304,37224447,IL +37486592,37748735,RU +37748736,38273023,SE +38273024,38797311,KZ +38797312,39059455,PT +39059456,39321599,GR +39321600,39583743,SA +39583744,39845887,RU +39845888,40159231,GB +40159232,40159232,IN +40159233,40370175,GB +40370176,40894463,DK +40894464,41418751,IT +41418752,41943039,GB +41943040,42205183,DK +42205184,42467327,KZ +42467328,42991615,ES +42991616,43253759,IR +43253760,43515903,NO +43515904,43778047,ES +43778048,44040191,IT +44040192,45088767,DE +45088768,46137343,IR +46137344,46661631,IT +46661632,47710207,DE +47710208,48234495,GB +48234496,49283071,IT +49283072,49807359,DE +49807360,50331647,SE +50331648,68169727,US +68169728,68171775,CA +68171776,68194815,US +68194816,68194879,CA +68194880,68305407,US +68305408,68305919,MX +68305920,68978687,US +68978688,68980735,CA +68980736,69109759,US +69109760,69111807,CA +69111808,71670208,US +71670209,71670209,NL +71670210,83886079,US +83886080,83951615,SY +83951616,83959807,UA +83959808,83961855,ES +83961856,83962111,KW +83962112,83962367,SA +83962368,83962623,BH +83962624,83962879,LB +83962880,83963135,AE +83963136,83963391,QA +83963392,83963647,OM +83963648,83963903,JO +83963904,83965951,RU +83965952,83967999,CZ +83968000,83969023,DE +83969024,83969535,GB +83969536,83972863,DE +83972864,83973119,GB +83973120,83974143,DE +83974144,83974399,GB +83974400,83976191,DE +83976192,83978239,CH +83978240,83980287,IQ +83980288,83982335,CH +83982336,84017151,DE +84017152,84021247,IT +84021248,84023295,GB +84023296,84025343,ES +84025344,84033535,RU +84033536,84037631,NL +84037632,84039679,TR +84039680,84041727,ES +84041728,84049919,GB +84049920,84082687,RO +84082688,84148223,RU +84148224,84410367,DE +84410368,84416511,RU +84416512,84417535,GB +84417536,84418559,RU +84418560,84418815,UA +84418816,84419071,NL +84419072,84419327,UA +84419328,84419583,NL +84419584,84420607,RU +84420608,84421631,GB +84421632,84421759,MX +84421760,84421887,PA +84421888,84422015,BR +84422016,84422143,CL +84422144,84422271,AR +84422272,84422399,CO +84422400,84422527,PL +84422528,84422655,IT +84422656,84426495,RU +84426496,84426751,US +84426752,84427775,RU +84427776,84428799,GB +84428800,84432895,RU +84432896,84433919,NL +84433920,84434943,RU +84434944,84443135,IT +84443136,84451327,LB +84451328,84457471,RU +84457472,84459519,ES +84459520,84471807,RU +84471808,84473855,IQ +84475904,84498681,DE +84498682,84498682,NL +84498683,84517997,DE +84517998,84517998,NL +84517999,84545535,DE +84545536,84549631,GB +84549632,84551679,GE +84551680,84557823,DE +84557824,84566015,NL +84566016,84574207,GB +84574208,84576255,FR +84576256,84582399,GB +84582400,84590591,DE +84590592,84591103,NL +84591104,84592639,CN +84592640,84594687,ES +84594688,84598783,DE +84598784,84600831,IQ +84600832,84602879,GB +84602880,84606975,AZ +84606976,84609023,AT +84609024,84615167,GB +84615168,84617215,IT +84617216,84619263,PS +84619264,84621311,DE +84621312,84623359,GR +84623360,84627455,RU +84627456,84629503,NL +84629504,84631551,GB +84631552,84639743,IT +84639744,84672511,TR +84672512,84934655,RO +84934656,85196799,RU +85196800,85262335,LT +85262336,85326911,OM +85326912,85327103,AE +85327104,85327871,OM +85327872,85360639,IR +85360640,85362687,IL +85362688,85364735,GB +85364736,85366783,DE +85366784,85367039,CZ +85367040,85367295,RU +85367296,85367551,SK +85367552,85367807,RU +85367808,85368831,UA +85368832,85377023,RS +85377024,85385215,IR +85385216,85387263,GB +85387264,85389311,SE +85389312,85391359,DE +85391360,85393407,NL +85394432,85394439,IT +85394944,85395199,HU +85395456,85395711,TR +85395968,85396223,LU +85396480,85397503,ES +85398016,85398047,NO +85398528,85399039,SA +85399040,85399047,CH +85399552,85400063,FR +85400576,85400583,ES +85401600,85403647,IT +85403648,85405695,FR +85405696,85407743,RU +85407744,85409791,FI +85409792,85417983,IS +85417984,85422079,RU +85422080,85424127,IR +85424128,85426175,TR +85426176,85458943,BE +85458944,85721087,TR +85721088,85723135,HU +85723136,85725183,IT +85725184,85729279,RU +85729280,85731327,IR +85731328,85733375,DE +85733376,85737471,GB +85737472,85753855,DE +85753856,85770239,IL +85770240,85786623,IR +85786624,85852159,IL +85852160,86015999,AE +86016000,86018047,BG +86018048,86020095,SI +86020096,86022143,RU +86022144,86024191,GB +86024192,86026239,DE +86026240,86028287,MD +86028288,86030335,MK +86030336,86032383,DE +86032384,86048767,OM +86048768,86114303,DK +86114304,86147071,KZ +86147072,86155263,ES +86155264,86157311,PS +86157312,86159359,IL +86159360,86160383,UA +86160384,86160895,NL +86160896,86161407,UA +86161408,86163455,IT +86163456,86171647,IR +86171648,86173695,DE +86173696,86175743,NL +86175744,86177535,SE +86177536,86177791,IE +86177792,86179839,LI +86179840,86220799,RU +86220800,86222607,JE +86222608,86222615,GB +86222616,86222847,JE +86222848,86226943,NL +86226944,86228991,SE +86228992,86231039,US +86231040,86233087,ES +86233088,86235135,RO +86235136,86237183,ES +86237184,86245375,DE +86245376,86376447,OM +86376448,86409215,AE +86409216,86441983,HU +86441984,86442239,FR +86442240,86442243,GB +86442244,86442291,FR +86442292,86442295,GB +86442296,86442495,FR +86442496,86442499,ES +86442500,86442507,FR +86442508,86442511,ES +86442512,86442687,FR +86442688,86442691,ES +86442692,86442695,FR +86442696,86442700,ES +86442701,86442701,CH +86442702,86442703,ES +86442704,86442719,FR +86442720,86442723,PT +86442724,86442724,PL +86442725,86442739,FR +86442740,86442743,ES +86442744,86442747,IE +86442748,86443007,GB +86443008,86443047,FR +86443048,86443051,ES +86443052,86443311,FR +86443312,86443319,ES +86443320,86443451,FR +86443452,86443455,ES +86443456,86443519,FR +86443520,86443535,PL +86443536,86443539,ES +86443540,86443583,FR +86443584,86443647,GB +86443648,86443883,FR +86443884,86443887,ES +86443888,86443991,FR +86443992,86443995,ES +86443996,86444023,FR +86444024,86444031,FI +86444032,86444119,FR +86444120,86444123,ES +86444124,86444311,FR +86444312,86444315,PL +86444316,86444323,ES +86444324,86444331,FR +86444332,86444335,ES +86444336,86444519,FR +86444520,86444523,ES +86444524,86444575,FR +86444576,86444579,ES +86444580,86444655,FR +86444656,86444663,ES +86444664,86444687,FR +86444688,86444691,ES +86444692,86444743,FR +86444744,86444751,GB +86444752,86444783,FR +86444784,86444791,GB +86444792,86444839,FR +86444840,86444843,ES +86444844,86444983,FR +86444984,86444991,ES +86444992,86445311,FR +86445312,86445319,NL +86445320,86445375,FR +86445376,86445407,ES +86445408,86445551,FR +86445552,86445555,ES +86445556,86445563,FR +86445564,86445567,ES +86445568,86445831,FR +86445832,86445839,ES +86445840,86446407,FR +86446408,86446408,DE +86446409,86446411,FR +86446412,86446412,DE +86446413,86446427,FR +86446428,86446431,DE +86446432,86446591,FR +86446592,86446599,ES +86446600,86446619,FR +86446620,86446620,DE +86446621,86446655,FR +86446656,86446663,ES +86446664,86446679,FR +86446680,86446683,ES +86446684,86446715,FR +86446716,86446719,DE +86446720,86446727,FR +86446728,86446731,DE +86446732,86446767,FR +86446768,86446771,GB +86446772,86446931,FR +86446932,86446935,CZ +86446936,86447095,FR +86447096,86447103,ES +86447104,86447279,FR +86447280,86447280,DE +86447281,86447287,FR +86447288,86447291,DE +86447292,86447335,FR +86447336,86447339,ES +86447340,86447351,FR +86447352,86447355,GB +86447356,86448559,FR +86448560,86448575,GB +86448576,86448803,FR +86448804,86448807,FI +86448808,86448835,FR +86448836,86448839,GB +86448840,86448851,FR +86448852,86448855,IT +86448856,86448859,PT +86448860,86448951,FR +86448952,86448955,DE +86448956,86449039,FR +86449040,86449055,ES +86449056,86449119,FR +86449120,86449151,PT +86449152,86449311,FR +86449312,86449343,ES +86449344,86449363,FR +86449364,86449367,DE +86449368,86449379,FR +86449380,86449383,FI +86449384,86449387,FR +86449388,86449391,FI +86449392,86449499,FR +86449500,86449503,ES +86449504,86449675,FR +86449676,86449679,PT +86449680,86449759,FR +86449760,86449791,IE +86449792,86449883,FR +86449884,86449884,DE +86449885,86449983,FR +86449984,86450015,LT +86450016,86450087,FR +86450088,86450091,PL +86450092,86450163,FR +86450164,86450167,GB +86450168,86450335,FR +86450336,86450339,GB +86450340,86450471,FR +86450472,86450479,ES +86450480,86450775,FR +86450776,86450779,PL +86450780,86450847,FR +86450848,86450863,ES +86450864,86450867,PT +86450868,86450875,FR +86450876,86450879,GB +86450880,86451531,FR +86451532,86451535,FI +86451536,86452059,FR +86452060,86452063,ES +86452064,86452067,FR +86452068,86452071,ES +86452072,86452347,FR +86452348,86452351,ES +86452352,86452367,FR +86452368,86452383,GB +86452384,86452399,ES +86452400,86452543,FR +86452544,86452575,GB +86452576,86452615,FR +86452616,86452623,ES +86452624,86452671,FR +86452672,86452735,GB +86452736,86452943,FR +86452944,86452959,GB +86452960,86453199,FR +86453200,86453203,ES +86453204,86453231,FR +86453232,86453247,ES +86453248,86453311,FR +86453312,86453319,ES +86453320,86453327,FR +86453328,86453339,ES +86453340,86453343,PT +86453344,86453435,FR +86453436,86453439,ES +86453440,86453836,FR +86453837,86453838,PT +86453839,86453843,FR +86453844,86453847,GB +86453848,86453947,FR +86453948,86453951,IE +86453952,86454207,FR +86454208,86454271,ES +86454272,86454279,FR +86454280,86454287,ES +86454288,86454299,FR +86454300,86454303,DE +86454304,86454335,FR +86454336,86454343,DE +86454344,86454463,FR +86454464,86454527,DE +86454528,86454559,FR +86454560,86454591,CZ +86454592,86454607,FR +86454608,86454611,DE +86454612,86454615,FR +86454616,86454619,ES +86454620,86454751,FR +86454752,86454783,CZ +86454784,86454823,FR +86454824,86454831,ES +86454832,86454839,FR +86454840,86454847,GB +86454848,86454855,DE +86454856,86454899,FR +86454900,86454903,GB +86454904,86455003,FR +86455004,86455007,ES +86455008,86455591,FR +86455592,86455595,NL +86455596,86455623,FR +86455624,86455624,DE +86455625,86455631,FR +86455632,86455647,CZ +86455648,86455767,FR +86455768,86455771,GB +86455772,86456039,FR +86456040,86456043,FI +86456044,86456195,FR +86456196,86456211,DE +86456212,86456351,FR +86456352,86456367,CH +86456368,86456371,FR +86456372,86456375,ES +86456376,86456655,FR +86456656,86456671,IE +86456672,86456943,FR +86456944,86456947,GR +86456948,86456999,FR +86457000,86457007,ES +86457008,86457059,FR +86457060,86457060,DE +86457061,86457087,FR +86457088,86457091,DE +86457092,86457111,FR +86457112,86457112,DE +86457113,86457187,FR +86457188,86457199,ES +86457200,86457263,FR +86457264,86457279,ES +86457280,86457403,FR +86457404,86457407,ES +86457408,86457455,FR +86457456,86457456,DE +86457457,86457471,FR +86457472,86457519,ES +86457520,86457703,FR +86457704,86457707,ES +86457708,86457759,FR +86457760,86457791,PL +86457792,86457799,FR +86457800,86457803,ES +86457804,86458183,FR +86458184,86458187,DE +86458188,86458295,FR +86458296,86458299,CZ +86458300,86466639,FR +86466640,86466647,ES +86466648,86467207,FR +86467208,86467211,IE +86467212,86467279,FR +86467280,86467283,DE +86467284,86467320,FR +86467321,86467321,FI +86467322,86467871,FR +86467872,86467903,BE +86467904,86467999,FR +86468000,86468003,PL +86468004,86468055,FR +86468056,86468056,DE +86468057,86468103,FR +86468104,86468111,IT +86468112,86468199,FR +86468200,86468200,ES +86468201,86468407,FR +86468408,86468415,CH +86468416,86468447,FR +86468448,86468479,CZ +86468480,86468571,FR +86468572,86468575,ES +86468576,86468587,FR +86468588,86468591,ES +86468592,86468671,FR +86468672,86468675,ES +86468676,86468799,FR +86468800,86468831,PL +86468832,86468883,FR +86468884,86468887,PL +86468888,86469183,FR +86469184,86469247,GB +86469248,86469691,FR +86469692,86469695,DE +86469696,86469791,FR +86469792,86469795,GB +86469796,86469915,FR +86469916,86469919,ES +86469920,86469951,FR +86469952,86470047,ES +86470048,86470359,FR +86470360,86470363,PT +86470364,86470727,FR +86470728,86470731,ES +86470732,86470735,FR +86470736,86470751,GB +86470752,86470767,PT +86470768,86470951,FR +86470952,86470959,GB +86470960,86471007,FR +86471008,86471023,IT +86471024,86471063,FR +86471064,86471071,PL +86471072,86471083,FR +86471084,86471087,DE +86471088,86471123,FR +86471124,86471127,GB +86471128,86471135,FR +86471136,86471167,FI +86471168,86471179,FR +86471180,86471180,DE +86471181,86471231,FR +86471232,86471263,FI +86471264,86471295,FR +86471296,86471327,GB +86471328,86471839,FR +86471840,86471871,PT +86471872,86471943,FR +86471944,86471947,ES +86471948,86472063,FR +86472064,86472095,IT +86472096,86472775,FR +86472776,86472779,GB +86472780,86472951,FR +86472952,86472955,PL +86472956,86473087,FR +86473088,86473151,PT +86473152,86473347,FR +86473348,86473359,ES +86473360,86473807,FR +86473808,86473823,GB +86473824,86473839,FR +86473840,86473855,PT +86473856,86474163,FR +86474164,86474167,GB +86474168,86474307,FR +86474308,86474311,DE +86474312,86474391,FR +86474392,86474395,ES +86474396,86474467,FR +86474468,86474475,GB +86474476,86474479,DE +86474480,86474527,FR +86474528,86474531,DE +86474532,86474743,FR +86474744,86474747,LT +86474748,86474751,FR +86474752,86482943,HR +86482944,86484991,RU +86484992,86487039,NL +86487040,86489087,GB +86489088,86491135,NL +86491136,86493183,PL +86493184,86495231,RU +86495232,86497279,ES +86497280,86499327,NL +86499328,86503423,FR +86503424,86505471,DE +86505472,86507519,GB +86507520,86573055,ES +86573056,86638591,SA +86638592,86671359,RU +86671360,86673407,JE +86673408,86675455,DE +86675456,86677503,IT +86677504,86687743,FR +86687744,86695935,IQ +86695936,86704127,SA +86704128,86720511,PT +86720512,86736895,BA +86736896,86745087,RU +86745088,86753279,HR +86753280,86761471,PS +86761472,86763519,CZ +86763520,86765567,IT +86765568,86767615,RU +86767616,86769663,IT +86769664,86773759,RU +86773760,86777855,GB +86777856,86779903,AZ +86779904,86781183,RU +86781184,86781439,NL +86781440,86786047,RU +86786048,86788095,NO +86788096,86790143,NL +86790144,86794239,TR +86794240,86795775,DE +86795776,86796287,NL +86796288,86797311,US +86797312,86797343,PY +86797344,86798335,DE +86798336,86802431,CH +86802432,86804479,GE +86804480,86806527,DK +86806528,86810623,TR +86810624,86812671,FR +86812672,86814719,RU +86814720,86816767,SE +86816768,86818815,EE +86818816,86822911,SE +86822912,86824959,AT +86824960,86827007,LV +86827008,86831103,GB +86831104,86833151,FI +86833152,86835199,GB +86835200,86837247,DE +86837248,86839295,ES +86839296,86840319,GB +86840320,86843391,NL +86847488,86849535,GB +86849536,86850559,CZ +86850560,86851327,NL +86851328,86851583,CZ +86851584,86855679,NL +86855680,86856703,RU +86856704,86858751,NL +86858752,86859775,RU +86859776,86863871,DE +86863872,86867967,EE +86867968,86872063,JO +86872064,86874111,GB +86874112,86876159,NO +86876160,86880255,ES +86880256,86882303,DE +86882304,86884351,LB +86884352,86900735,RU +86900736,87031807,TR +87031808,87293951,FR +87293952,87359487,IR +87359488,87360543,ES +87360544,87360575,NL +87360576,87361535,ES +87361536,87363583,CZ +87363584,87367679,RU +87367680,87375871,IR +87375872,87384063,GB +87384064,87386111,AE +87386112,87388159,CH +87388160,87390207,UA +87390208,87392255,RU +87392256,87425023,BG +87425024,87556095,GR +87556096,87558143,ES +87558144,87560191,IT +87560192,87562239,DE +87562240,87564287,UA +87564288,87566335,HU +87566336,87568383,FR +87568384,87570431,GB +87570432,87572479,ES +87572480,87588863,MD +87588864,87590143,IR +87590144,87590655,GB +87590656,87590911,IR +87590912,87592959,RU +87592960,87597055,DK +87597056,87599103,ES +87599104,87601151,GB +87601152,87621631,DE +87621632,87623679,LB +87623680,87625727,KG +87625728,87626751,NL +87626752,87627007,GB +87627008,87627775,NL +87627776,87629823,ES +87629824,87631871,IR +87631872,87633919,DE +87633920,87635967,DK +87635968,87638015,GB +87638016,87640063,UA +87640064,87642111,RS +87642112,87646207,GB +87646208,87646463,RE +87646464,87647231,FR +87647232,87647487,RE +87647488,87648255,FR +87648256,87648767,RE +87648768,87650047,FR +87650048,87650303,RE +87650304,87654399,FR +87654400,87670783,PL +87670784,87672831,DE +87672832,87674879,CH +87674880,87676927,AE +87676928,87678975,RU +87678976,87679999,ES +87680000,87681023,NL +87681024,87683071,RU +87683072,87685119,SE +87685120,87687167,NL +87687168,87752703,UA +87752704,87754751,RU +87754752,87755263,CZ +87755264,87755519,SK +87755520,87755775,KG +87755776,87756799,RU +87756800,87758847,ES +87758848,87761407,RU +87761408,87761663,CZ +87761664,87761919,RU +87761920,87762431,FR +87762432,87762943,UA +87762944,87763967,KZ +87763968,87766527,RU +87766528,87766783,UA +87766784,87768063,RU +87768064,87777279,ES +87777280,87777535,TJ +87777536,87778303,CZ +87778304,87779327,RU +87779328,87785471,CZ +87785472,87793663,RU +87793664,87818239,CZ +87818240,87883775,PL +87883776,87885823,IT +87885824,87889919,RU +87889920,87890687,IR +87890688,87890943,US +87890944,87891199,NL +87891200,87891967,IR +87891968,87902207,DE +87902208,87904255,IR +87904256,87906303,DE +87906304,87908351,FI +87908352,87912447,BG +87912448,87914495,IE +87914496,87916543,GB +87916544,87932927,DE +87932928,87934975,GB +87934976,87939071,ES +87939072,87941119,IT +87941120,87943167,CH +87943168,87945215,RU +87945216,87947263,HU +87947264,87949311,NL +87949312,87954431,GB +87954432,87954687,BE +87954688,87957503,GB +87957504,87957759,ES +87957760,87958015,IN +87958016,87958023,SG +87958024,87958031,IN +87958032,87958039,ID +87958040,87958047,US +87958048,87958055,GB +87958056,87958063,CN +87958064,87958279,SG +87958280,87958287,CN +87958288,87958295,US +87958296,87958303,GB +87958304,87958311,KR +87958312,87958527,SG +87958528,87959039,CZ +87959040,87959519,NL +87959520,87959527,BE +87959528,87959535,US +87959536,87959547,BE +87959548,87959551,NL +87959552,87959817,DE +87959818,87959818,NL +87959819,87959835,DE +87959836,87959836,BE +87959837,87960063,DE +87960064,87960321,GB +87960322,87960322,NL +87960323,87960575,GB +87960576,87961583,US +87961584,87961591,CA +87961592,87963651,US +87963652,87963655,AS +87963656,87963659,AI +87963660,87963663,AG +87963664,87963667,AR +87963668,87963671,AW +87963672,87963675,BS +87963676,87963679,BB +87963680,87963683,BZ +87963684,87963687,BM +87963688,87963691,BO +87963692,87963695,VG +87963696,87963699,KY +87963700,87963703,CL +87963704,87963707,CN +87963708,87963711,CO +87963712,87963715,CK +87963716,87963719,CR +87963720,87963723,CU +87963724,87963727,DM +87963728,87963731,DO +87963732,87963735,EC +87963736,87963739,SV +87963740,87963743,FK +87963744,87963747,FJ +87963748,87963751,GD +87963752,87963755,GP +87963756,87963759,GU +87963760,87963763,GT +87963764,87963767,GY +87963768,87963771,HT +87963772,87963775,HN +87963776,87963779,JM +87963780,87963783,KI +87963784,87963787,MS +87963788,87963791,NR +87963792,87963795,NC +87963796,87963799,NI +87963800,87963803,NU +87963804,87963807,NF +87963808,87963810,US +87963811,87963811,KP +87963812,87963815,PW +87963816,87963819,PA +87963820,87963823,PG +87963824,87963827,PY +87963828,87963831,PE +87963832,87963835,PH +87963836,87963839,PN +87963840,87963843,PR +87963844,87963847,KN +87963848,87963851,LC +87963852,87963855,VC +87963856,87963859,WS +87963860,87963863,SB +87963864,87963867,SR +87963868,87963871,SZ +87963872,87963875,TK +87963876,87963879,TO +87963880,87963883,TT +87963884,87963887,TC +87963888,87963891,TV +87963892,87963895,UY +87963896,87963911,US +87963912,87963915,DE +87963916,87963955,US +87963956,87963959,CA +87963960,87963963,GB +87963964,87963999,US +87964000,87964003,VU +87964004,87964007,VE +87964008,87964015,US +87964016,87964019,IN +87964020,87964163,US +87964164,87964167,AS +87964168,87964171,AI +87964172,87964175,AG +87964176,87964179,AR +87964180,87964183,AW +87964184,87964187,BS +87964188,87964191,BB +87964192,87964195,BZ +87964196,87964199,BM +87964200,87964203,BO +87964204,87964207,VG +87964208,87964211,KY +87964212,87964215,CL +87964216,87964219,CO +87964220,87964223,CK +87964224,87964227,CR +87964228,87964231,CU +87964232,87964235,DM +87964236,87964239,DO +87964240,87964243,EC +87964244,87964247,SV +87964248,87964251,FK +87964252,87964255,FJ +87964256,87964259,GD +87964260,87964263,GP +87964264,87964267,GT +87964268,87964271,GY +87964272,87964275,HT +87964276,87964279,HN +87964280,87964283,JM +87964284,87964287,KI +87964288,87964291,MS +87964292,87964295,NR +87964296,87964299,NC +87964300,87964303,NI +87964304,87964307,NU +87964308,87964311,NF +87964312,87964315,PA +87964316,87964319,PY +87964320,87964323,PE +87964324,87964327,PN +87964328,87964331,PR +87964332,87964335,KN +87964336,87964339,LC +87964340,87964343,PM +87964344,87964347,VC +87964348,87964351,WS +87964352,87964355,SB +87964356,87964359,SR +87964360,87964363,SZ +87964364,87964367,TK +87964368,87964371,TO +87964372,87964375,TT +87964376,87964379,TC +87964380,87964383,TV +87964384,87964387,UY +87964388,87964403,US +87964404,87964407,DE +87964408,87964447,US +87964448,87964451,CA +87964452,87964455,GB +87964456,87964491,US +87964492,87964495,VU +87964496,87964499,VE +87964500,87964671,US +87964672,87964675,CZ +87964676,87964679,AD +87964680,87964683,AO +87964684,87964687,AM +87964688,87964691,AZ +87964692,87964695,BH +87964696,87964699,BD +87964700,87964703,BY +87964704,87964707,BJ +87964708,87964711,BT +87964712,87964715,BA +87964716,87964719,BW +87964720,87964723,BN +87964724,87964727,BG +87964728,87964731,BF +87964732,87964735,BI +87964736,87964739,KH +87964740,87964743,CM +87964744,87964747,CV +87964748,87964751,CF +87964752,87964755,TD +87964756,87964759,CN +87964760,87964763,CX +87964764,87964767,CC +87964768,87964771,KM +87964772,87964775,CD +87964776,87964779,CI +87964780,87964783,CY +87964784,87964787,EG +87964788,87964791,GQ +87964792,87964795,ER +87964796,87964799,EE +87964800,87964803,ET +87964804,87964807,FO +87964808,87964811,GA +87964812,87964815,GM +87964816,87964819,GE +87964820,87964823,GH +87964824,87964827,GI +87964828,87964831,GR +87964832,87964835,GL +87964836,87964839,GU +87964840,87964843,GW +87964844,87964847,GN +87964848,87964851,IR +87964852,87964855,IQ +87964856,87964859,IE +87964860,87964863,JO +87964864,87964867,KZ +87964868,87964871,KE +87964872,87964875,KW +87964876,87964879,KG +87964880,87964883,LA +87964884,87964887,LV +87964888,87964891,LB +87964892,87964895,LS +87964896,87964899,LR +87964900,87964903,LY +87964904,87964907,LI +87964908,87964911,LT +87964912,87964915,MO +87964916,87964919,MK +87964920,87964923,MG +87964924,87964927,MW +87964928,87964931,MV +87964932,87964935,ML +87964936,87964936,MN +87964937,87964939,MT +87964940,87964943,MR +87964944,87964947,MU +87964948,87964951,MD +87964952,87964955,MC +87964956,87964959,MN +87964960,87964963,ME +87964964,87964967,MA +87964968,87964971,MZ +87964972,87964975,MM +87964976,87964979,NA +87964980,87964983,NP +87964984,87964987,NE +87964988,87964991,NG +87964992,87964995,CZ +87964996,87964999,OM +87965000,87965003,PK +87965004,87965007,PW +87965008,87965011,PS +87965012,87965015,PG +87965016,87965019,PH +87965020,87965023,QA +87965024,87965027,DJ +87965028,87965031,CG +87965032,87965035,RO +87965036,87965039,RW +87965040,87965043,SH +87965044,87965047,SM +87965048,87965051,ST +87965052,87965055,SA +87965056,87965059,SN +87965060,87965063,RS +87965064,87965067,SL +87965068,87965071,SK +87965072,87965075,SI +87965076,87965079,SO +87965080,87965083,LK +87965084,87965087,SD +87965088,87965091,SJ +87965092,87965095,SY +87965096,87965099,TJ +87965100,87965103,TZ +87965104,87965107,TH +87965108,87965111,TG +87965112,87965115,TN +87965116,87965119,TM +87965120,87965123,UG +87965124,87965127,UA +87965128,87965131,AE +87965132,87965135,UZ +87965136,87965139,VA +87965140,87965143,VN +87965144,87965147,YE +87965148,87965151,ZM +87965152,87965155,ZW +87965156,87965159,HR +87965160,87965160,MN +87965161,87965163,IL +87965164,87965167,AF +87965168,87965171,AL +87965172,87965175,DZ +87965176,87965179,AX +87965180,87965183,MN +87965184,87965187,GB +87965188,87965191,AD +87965192,87965195,AO +87965196,87965199,AM +87965200,87965203,AZ +87965204,87965207,BH +87965208,87965211,BD +87965212,87965215,BY +87965216,87965219,BJ +87965220,87965223,BT +87965224,87965227,BA +87965228,87965231,BW +87965232,87965235,BN +87965236,87965239,BG +87965240,87965243,BF +87965244,87965247,BI +87965248,87965251,KH +87965252,87965255,CM +87965256,87965259,CV +87965260,87965263,CF +87965264,87965267,TD +87965268,87965271,CX +87965272,87965275,CC +87965276,87965279,KM +87965280,87965283,CD +87965284,87965287,CI +87965288,87965291,CY +87965292,87965295,EG +87965296,87965299,GQ +87965300,87965303,ER +87965304,87965307,EE +87965308,87965311,ET +87965312,87965315,FO +87965316,87965319,GA +87965320,87965323,GM +87965324,87965327,GE +87965328,87965331,GH +87965332,87965335,GI +87965336,87965339,GR +87965340,87965343,GL +87965344,87965347,GW +87965348,87965351,GN +87965352,87965355,IR +87965356,87965359,IQ +87965360,87965363,IE +87965364,87965367,JO +87965368,87965371,KZ +87965372,87965375,KE +87965376,87965379,KW +87965380,87965383,KG +87965384,87965387,LA +87965388,87965391,LV +87965392,87965395,LB +87965396,87965399,LS +87965400,87965403,LR +87965404,87965407,LY +87965408,87965411,LI +87965412,87965415,LT +87965416,87965419,MO +87965420,87965423,MK +87965424,87965427,MG +87965428,87965431,MW +87965432,87965435,MV +87965436,87965439,ML +87965440,87965443,MT +87965444,87965447,MR +87965448,87965451,MU +87965452,87965455,MD +87965456,87965459,MC +87965460,87965463,MN +87965464,87965467,ME +87965468,87965471,MA +87965472,87965475,MZ +87965476,87965479,MM +87965480,87965483,NA +87965484,87965487,NP +87965488,87965491,NE +87965492,87965495,NG +87965496,87965499,OM +87965500,87965503,PK +87965504,87965507,PS +87965508,87965511,QA +87965512,87965515,DJ +87965516,87965519,CG +87965520,87965523,RO +87965524,87965527,RW +87965528,87965531,SH +87965532,87965535,PM +87965536,87965539,SM +87965540,87965543,ST +87965544,87965547,SA +87965548,87965551,SN +87965552,87965555,RS +87965556,87965559,SL +87965560,87965563,SK +87965564,87965567,SI +87965568,87965571,SO +87965572,87965575,LK +87965576,87965579,SD +87965580,87965583,SJ +87965584,87965587,SY +87965588,87965591,TJ +87965592,87965595,TZ +87965596,87965599,TH +87965600,87965603,TG +87965604,87965607,TN +87965608,87965611,TM +87965612,87965615,UG +87965616,87965619,PT +87965620,87965623,US +87965624,87965627,UA +87965628,87965631,AE +87965632,87965635,UZ +87965636,87965639,VA +87965640,87965643,VN +87965644,87965647,YE +87965648,87965651,ZM +87965652,87965655,ZW +87965656,87965659,PT +87965660,87965663,US +87965664,87965667,HR +87965668,87965671,IL +87965672,87965675,AF +87965676,87965679,AL +87965680,87965683,DZ +87965684,87965687,AX +87965688,87965691,IN +87965692,87965695,GB +87965696,87967743,DE +87967744,87969791,IT +87969792,87970815,IM +87970816,87971071,GG +87971072,87971839,IM +87971840,87972863,IE +87972864,87973375,GI +87973376,87973887,IM +87973888,87981567,DE +87981568,87982079,TR +87982080,87988223,IQ +87988224,87988479,RU +87988480,87988735,US +87988736,87988863,LV +87988864,87989247,RU +87989248,87989503,US +87989504,87989759,FR +87989760,87990015,US +87990016,87990271,DE +87990272,88014847,IR +88014848,88016895,LY +88016896,88018943,IR +88018944,88020991,GB +88020992,88023039,FR +88023040,88031231,TR +88031232,88047615,KZ +88047616,88049663,RU +88049664,88051711,IT +88051712,88053759,GB +88053760,88055807,RU +88055808,88057855,AM +88057856,88059903,IT +88059904,88061951,DE +88061952,88063999,PL +88064000,88080383,HU +88080384,88604671,GB +88604672,88866815,IR +88866816,88932351,KZ +88932352,88940543,RU +88940544,88948735,GB +88948736,88965119,IT +88965120,88997887,AM +88997888,89063423,IR +89063424,89079807,GB +89079808,89096191,NL +89096192,89128959,RU +89128960,89260031,GB +89260032,89325567,SA +89325568,89327615,NL +89327616,89329663,GB +89329664,89331711,UA +89331712,89333759,DK +89333760,89337855,RO +89337856,89339903,ES +89339904,89341951,FI +89341952,89350143,ES +89350144,89352191,GB +89352192,89354239,IT +89354240,89356287,AE +89356288,89358335,IT +89358336,89374719,DE +89374720,89382911,GB +89382912,89384959,NO +89384960,89387007,FR +89387008,89391103,IE +89391104,90439679,IT +90439680,90456063,DE +90456064,90472447,RU +90472448,90476543,DE +90476544,90478591,FR +90478592,90480639,VG +90480640,90482687,YE +90482688,90484735,GB +90484736,90488831,NO +90488832,90497023,BY +90497024,90499071,NL +90499072,90501119,IT +90503168,90505215,IL +90505216,90516479,RU +90516480,90516735,DE +90516736,90516991,RO +90516992,90517503,FR +90517504,90518527,US +90518528,90520575,KZ +90520576,90528767,RU +90528768,90533887,NL +90533888,90537983,EE +90537984,90540031,RU +90540032,90544127,GB +90544128,90546175,RU +90546176,90548223,DE +90548224,90550271,GB +90550272,90554367,EE +90554368,90558463,RU +90558464,90560511,UA +90560512,90560767,RU +90560768,90560895,UZ +90560896,90561023,BG +90561024,90561151,RU +90561152,90561279,NI +90561280,90561407,TH +90561408,90561535,GR +90561536,90561663,GE +90561664,90561791,LV +90561792,90561919,CY +90561920,90562047,CU +90562048,90562175,AM +90562176,90562303,QA +90562304,90570751,RU +90570752,90578943,IT +90583040,90587135,CZ +90587136,90589183,PL +90589184,90591231,FR +90591232,90595327,GB +90595328,90603519,PS +90603520,90605567,ES +90605568,90607615,NL +90607616,90609663,CH +90609664,90611711,RU +90611712,90613759,DE +90613760,90615807,GB +90615808,90617855,BA +90617856,90619903,GB +90619904,90636287,IL +90636288,90701823,DK +90701824,90705919,TR +90705920,90707967,CZ +90707968,90710015,IT +90710016,90718207,UA +90718208,90718719,DE +90718720,90719231,FR +90719232,90719487,AT +90719488,90719999,SE +90720000,90720255,GB +90722304,90724351,FI +90724352,90726399,CH +90726400,90728447,FR +90728448,90730495,DE +90730496,90734591,NL +90734592,90736639,SY +90736640,90738687,NL +90738688,90742271,DE +90742272,90742783,RO +90742784,90750975,BG +90750976,90753023,FR +90753024,90755071,RU +90755072,90757119,IR +90757120,90759167,AT +90759168,90761215,NL +90761216,90763263,KZ +90763264,90763519,IL +90763520,90763775,US +90763776,90764287,IL +90764288,90764799,US +90764800,90765311,IL +90765312,90767359,PL +90767360,90832895,UA +90832896,90898431,IR +90898432,90963967,AE +90963968,91226111,SA +91226112,92274687,IR +92274688,92536831,RU +92536832,92569599,NL +92569600,92569855,SI +92569856,92570111,FR +92570112,92570367,DE +92570368,92570623,GB +92570624,92570879,IE +92570880,92571135,GB +92571136,92571391,SK +92571392,92571647,BG +92571648,92571903,DE +92571904,92572159,AT +92572160,92572415,IT +92572416,92572927,RU +92572928,92573183,CH +92573184,92573439,CZ +92573440,92573695,IT +92573696,92573951,AT +92573952,92574207,ES +92574208,92574463,PL +92574464,92574719,PT +92574720,92574975,UA +92574976,92575231,LU +92575232,92575487,HU +92575488,92575999,TR +92576000,92576255,RS +92576256,92576511,AE +92576512,92576767,DE +92576768,92577023,CH +92577024,92577535,DE +92577536,92585983,AT +92585984,92602367,SA +92602368,92604415,BA +92604416,92606463,PL +92606464,92608511,GB +92608512,92610559,PS +92610560,92612607,CH +92612608,92614655,GB +92614656,92618751,IT +92635136,92643327,BA +92643328,92645375,GE +92645376,92651519,GB +92651520,92654591,SE +92654592,92654623,US +92654624,92654847,SE +92654848,92654879,US +92654880,92655039,SE +92655040,92655071,NL +92655072,92655103,SE +92655104,92655135,US +92655136,92655295,SE +92655296,92655327,NL +92655328,92655359,SE +92655360,92655391,US +92655392,92655615,SE +92655616,92655647,US +92655648,92655727,SE +92655728,92655743,NL +92655744,92655871,SE +92655872,92655903,US +92655904,92655999,SE +92656000,92656015,NL +92656016,92656127,SE +92656128,92656159,US +92656160,92656223,SE +92656224,92656239,NL +92656240,92656383,SE +92656384,92656415,US +92656416,92656591,SE +92656592,92656607,NL +92656608,92656639,SE +92656640,92656671,US +92656672,92656783,SE +92656784,92656799,NL +92656800,92656895,SE +92656896,92656927,US +92656928,92657103,SE +92657104,92657119,NL +92657120,92657151,SE +92657152,92657183,US +92657184,92657279,SE +92657280,92657295,NL +92657296,92657407,SE +92657408,92657439,US +92657440,92657631,SE +92657632,92657663,NL +92657664,92657695,US +92657696,92657775,SE +92657776,92657823,NL +92657824,92657919,SE +92657920,92657951,US +92657952,92658111,SE +92658112,92658127,NL +92658128,92658175,SE +92658176,92658207,US +92658208,92658303,SE +92658304,92658319,NL +92658320,92658431,SE +92658432,92658463,US +92658464,92658575,SE +92658576,92658591,NL +92658592,92658687,SE +92658688,92658719,US +92658720,92658847,SE +92658848,92658879,NL +92658880,92658943,SE +92658944,92658975,US +92658976,92659055,SE +92659056,92659103,NL +92659104,92659199,SE +92659200,92659231,US +92659232,92659295,SE +92659296,92659311,NL +92659312,92659455,SE +92659456,92659471,US +92659472,92659631,SE +92659632,92659647,NL +92659648,92659711,SE +92659712,92663807,AZ +92663808,92665855,GB +92665856,92667903,PL +92667904,92669951,BE +92669952,92671999,GB +92672000,92674047,DE +92674048,92676095,CH +92676096,92680191,ES +92680192,92684287,AZ +92684288,92688383,PL +92688384,92690431,AM +92690432,92692479,IE +92692480,92694527,FR +92694528,92696575,RS +92696576,92698623,ES +92698624,92700671,IT +92700672,92719103,IR +92719104,92721151,SY +92721152,92723199,PL +92723200,92725247,RU +92725248,92733439,SY +92733440,92733931,FR +92733932,92733935,ES +92733936,92734639,FR +92734640,92734655,ES +92734656,92734735,FR +92734736,92734739,DE +92734740,92734831,FR +92734832,92734847,ES +92734848,92735103,FR +92735104,92735119,GB +92735120,92735347,FR +92735348,92735351,GB +92735352,92735615,FR +92735616,92735616,DE +92735617,92735619,FR +92735620,92735623,ES +92735624,92735823,FR +92735824,92735827,ES +92735828,92735875,FR +92735876,92735876,DE +92735877,92735999,FR +92736000,92736255,GB +92736256,92736479,FR +92736480,92736480,DE +92736481,92736487,FR +92736488,92736491,ES +92736492,92736607,FR +92736608,92736639,PT +92736640,92737151,FR +92737152,92737183,NL +92737184,92737199,FR +92737200,92737215,PL +92737216,92737611,FR +92737612,92737615,GB +92737616,92737887,FR +92737888,92737903,IT +92737904,92738071,FR +92738072,92738075,DE +92738076,92738239,FR +92738240,92738271,GB +92738272,92738659,FR +92738660,92738679,ES +92738680,92738783,FR +92738784,92738815,GB +92738816,92739199,FR +92739200,92739215,DE +92739216,92739351,FR +92739352,92739355,PL +92739356,92739403,FR +92739404,92739407,IE +92739408,92740415,FR +92740416,92740431,NL +92740432,92740611,FR +92740612,92740615,CZ +92740616,92740639,FR +92740640,92740671,ES +92740672,92740915,FR +92740916,92740923,DE +92740924,92741331,FR +92741332,92741335,ES +92741336,92742419,FR +92742420,92742423,ES +92742424,92742607,FR +92742608,92742623,BE +92742624,92742771,FR +92742772,92742775,ES +92742776,92742815,FR +92742816,92742819,ES +92742820,92743343,FR +92743344,92743351,GB +92743352,92743679,FR +92743680,92743935,ES +92743936,92744103,FR +92744104,92744111,ES +92744112,92744123,FR +92744124,92744127,GB +92744128,92744319,FR +92744320,92744323,GB +92744324,92744551,FR +92744552,92744555,ES +92744556,92744951,FR +92744952,92744959,ES +92744960,92745071,FR +92745072,92745087,ES +92745088,92745207,FR +92745208,92745215,ES +92745216,92745395,FR +92745396,92745399,GB +92745400,92745663,FR +92745664,92745695,PL +92745696,92746415,FR +92746416,92746431,ES +92746432,92746559,FR +92746560,92746623,IT +92746624,92747043,FR +92747044,92747047,CH +92747048,92747231,FR +92747232,92747247,PL +92747248,92747547,FR +92747548,92747567,ES +92747568,92747711,FR +92747712,92747775,GB +92747776,92748516,FR +92748517,92748517,BE +92748518,92748543,FR +92748544,92748799,PT +92748800,92748843,FR +92748844,92748847,GB +92748848,92748863,FR +92748864,92748879,ES +92748880,92748983,FR +92748984,92748991,GB +92748992,92748999,ES +92749000,92749007,PT +92749008,92749011,FR +92749012,92749015,ES +92749016,92749023,FR +92749024,92749039,FI +92749040,92749055,IE +92749056,92749067,FR +92749068,92749071,GB +92749072,92749135,FR +92749136,92749151,FI +92749152,92749471,FR +92749472,92749487,PL +92749488,92749747,FR +92749748,92749751,ES +92749752,92750639,FR +92750640,92750643,ES +92750644,92750911,FR +92750912,92750943,PT +92750944,92751243,FR +92751244,92751247,ES +92751248,92751383,FR +92751384,92751391,ES +92751392,92751487,FR +92751488,92751615,IE +92751616,92751711,FR +92751712,92751712,DE +92751713,92751807,FR +92751808,92751871,NL +92751872,92752031,FR +92752032,92752063,FI +92752064,92753079,FR +92753080,92753087,ES +92753088,92753215,FR +92753216,92753279,PT +92753280,92753647,FR +92753648,92753663,ES +92753664,92754031,FR +92754032,92754047,PT +92754048,92754367,FR +92754368,92754431,GB +92754432,92754447,FR +92754448,92754463,GB +92754464,92754551,FR +92754552,92754555,DE +92754556,92754579,FR +92754580,92754583,ES +92754584,92755135,FR +92755136,92755199,PT +92755200,92755439,FR +92755440,92755455,GB +92755456,92755743,FR +92755744,92755775,FI +92755776,92755839,GB +92755840,92757311,FR +92757312,92757375,ES +92757376,92758207,FR +92758208,92758223,ES +92758224,92758367,FR +92758368,92758383,ES +92758384,92758915,FR +92758916,92758919,GB +92758920,92759263,FR +92759264,92759279,ES +92759280,92759287,FR +92759288,92759295,ES +92759296,92760159,FR +92760160,92760191,DE +92760192,92760255,CZ +92760256,92760323,FR +92760324,92760327,DE +92760328,92760607,FR +92760608,92760639,GB +92760640,92760671,LT +92760672,92761151,FR +92761152,92761215,PT +92761216,92761375,FR +92761376,92761391,FI +92761392,92762055,FR +92762056,92762059,GB +92762060,92762127,FR +92762128,92762135,ES +92762136,92762279,FR +92762280,92762283,GB +92762284,92762383,FR +92762384,92762391,ES +92762392,92762719,FR +92762720,92762751,PT +92762752,92762783,BE +92762784,92762863,FR +92762864,92762879,IT +92762880,92763103,FR +92763104,92763119,CZ +92763120,92763127,FR +92763128,92763135,ES +92763136,92763391,FR +92763392,92763519,IE +92763520,92764223,FR +92764224,92764287,ES +92764288,92764687,FR +92764688,92764703,ES +92764704,92764863,FR +92764864,92764879,ES +92764880,92764911,FR +92764912,92764927,GB +92764928,92765423,FR +92765424,92765427,GB +92765428,92766015,FR +92766016,92766047,ES +92766048,92776671,FR +92776672,92776703,PL +92776704,92776895,FR +92776896,92776959,NL +92776960,92777055,FR +92777056,92777087,DE +92777088,92777855,FR +92777856,92777983,GB +92777984,92778431,FR +92778432,92778495,ES +92778496,92782335,FR +92782336,92782457,RU +92782458,92782458,FR +92782459,92782528,RU +92782529,92782529,FR +92782530,92782591,RU +92782592,92782623,FR +92782624,92782655,PL +92782656,92782687,FR +92782688,92782719,ES +92782720,92782815,FR +92782816,92782847,CZ +92782848,92782879,NL +92782880,92783155,FR +92783156,92783159,GB +92783160,92783291,FR +92783292,92783295,DE +92783296,92783359,FR +92783360,92783423,ES +92783424,92783543,FR +92783544,92783547,ES +92783548,92783871,FR +92783872,92783887,PL +92783888,92784239,FR +92784240,92784243,DE +92784244,92784255,FR +92784256,92784263,NL +92784264,92784319,FR +92784320,92784351,NL +92784352,92784667,FR +92784668,92784671,IE +92784672,92784687,LT +92784688,92784703,FI +92784704,92784895,FR +92784896,92784959,ES +92784960,92785183,FR +92785184,92785199,ES +92785200,92785363,FR +92785364,92785367,PT +92785368,92785407,FR +92785408,92785439,ES +92785440,92785455,DE +92785456,92785611,FR +92785612,92785615,ES +92785616,92785735,FR +92785736,92785739,DE +92785740,92785791,FR +92785792,92785823,CZ +92785824,92786175,FR +92786176,92786179,GB +92786180,92786239,FR +92786240,92786255,FI +92786256,92786295,FR +92786296,92786299,GB +92786300,92786415,FR +92786416,92786419,GB +92786420,92786527,FR +92786528,92786535,ES +92786536,92786827,FR +92786828,92786831,IT +92786832,92786911,FR +92786912,92786927,ES +92786928,92787199,FR +92787200,92787203,FI +92787204,92787251,FR +92787252,92787255,ES +92787256,92787567,FR +92787568,92787583,IT +92787584,92787707,FR +92787708,92787711,FI +92787712,92788095,FR +92788096,92788127,DE +92788128,92788131,FI +92788132,92788399,FR +92788400,92788415,FI +92788416,92788447,FR +92788448,92788479,BE +92788480,92788495,FI +92788496,92789119,FR +92789120,92789183,ES +92789184,92789255,FR +92789256,92789259,GB +92789260,92789463,FR +92789464,92789471,IT +92789472,92789703,FR +92789704,92789707,DE +92789708,92790271,FR +92790272,92790275,DE +92790276,92790279,FR +92790280,92790283,IE +92790284,92790671,FR +92790672,92790679,ES +92790680,92791903,FR +92791904,92791935,PT +92791936,92792415,FR +92792416,92792431,ES +92792432,92792671,FR +92792672,92792675,GB +92792676,92792679,NL +92792680,92793023,FR +92793024,92793055,DE +92793056,92793087,ES +92793088,92793327,FR +92793328,92793331,PL +92793332,92794227,FR +92794228,92794231,PT +92794232,92794239,ES +92794240,92794335,FR +92794336,92794367,NL +92794368,92794691,FR +92794692,92794695,ES +92794696,92795195,FR +92795196,92795199,BE +92795200,92795631,FR +92795632,92795639,CZ +92795640,92796499,FR +92796500,92796503,PL +92796504,92796575,FR +92796576,92796579,GB +92796580,92796687,FR +92796688,92796691,DE +92796692,92796879,FR +92796880,92796895,FI +92796896,92796911,GB +92796912,92797163,FR +92797164,92797167,PT +92797168,92797355,FR +92797356,92797359,DE +92797360,92797567,FR +92797568,92797599,PT +92797600,92797679,FR +92797680,92797695,FI +92797696,92798211,FR +92798212,92798215,PL +92798216,92798255,FR +92798256,92798271,LT +92798272,92798591,FR +92798592,92798623,PT +92798624,92798975,FR +92798976,93323263,RU +93323264,93335551,CH +93335552,93339647,IL +93339648,93343743,RU +93343744,93347839,GB +93347840,93356031,RU +93356032,93358079,IR +93358080,93360127,FR +93360128,93362175,ES +93362176,93364223,GB +93364224,93368319,IT +93368320,93370367,GB +93370368,93372415,IT +93372416,93388799,GR +93388800,93415423,CH +93415424,93417471,CZ +93417472,93419519,IR +93419520,93421567,IT +93421568,93425663,DE +93425664,93426183,SE +93426184,93426687,US +93426688,93427711,DE +93427712,93429759,NO +93429760,93431807,RU +93431808,93433855,ES +93433856,93437951,DE +93437952,93454335,RU +93454336,93585407,DE +93585408,93626367,GB +93626368,93634559,CH +93634560,93650943,HU +93650944,93652991,CH +93652992,93655039,GB +93655040,93667327,CH +93667328,93675519,BA +93675520,93679615,IQ +93679616,93681663,LU +93681664,93683711,UA +93683712,93685759,AT +93685760,93687807,BE +93687808,93691903,RU +93691904,93693951,PL +93693952,93695999,IE +93696000,93700095,FR +93700096,93702143,PL +93702144,93704191,RU +93704192,93708287,UA +93708288,93712383,DE +93712384,93714431,HU +93714432,93714943,NL +93714944,93715455,GB +93715456,93715967,CA +93715968,93716479,NL +93716480,93749247,GB +93749248,93753343,IT +93753344,93756415,GB +93756416,93757439,FR +93757440,93765631,GB +93765632,93774847,SE +93774848,93775871,NO +93775872,93782015,SE +93782016,93836287,GB +93836288,93836799,NL +93836800,93842351,GB +93842352,93842359,NL +93842360,93847551,GB +93847552,93880319,GE +93880320,93888511,IT +93888512,93890559,PL +93890560,93892607,ES +93892608,93892863,GB +93892864,93893119,HK +93893120,93893375,NL +93893376,93893631,US +93893632,93893887,AU +93893888,93896703,US +93896704,93904895,GB +93904896,93906943,LV +93906944,93908991,BA +93908992,93911039,IT +93911040,93913087,AE +93913088,93929471,NL +93929472,93939711,GB +93939712,93941759,NO +93941760,93945855,CH +93945856,93962239,UA +93962240,93972479,GB +93972480,93973247,SE +93973248,93973503,GB +93973504,93973759,SE +93973760,93974015,PL +93974016,93974527,SE +93974528,93976575,CH +93976576,93978623,GB +93978624,94011391,ES +94011392,94015487,GB +94015488,94021631,DE +94021632,94022143,BA +94022144,94027263,RO +94027264,94027775,MD +94027776,94035967,IT +94035968,94036991,RO +94036992,94037503,BA +94037504,94041087,RO +94041088,94042111,SE +94042112,94043135,BA +94043136,94044159,RO +94044160,94109695,SY +94109696,94175231,SA +94175232,94175487,SE +94175488,94175743,CZ +94175744,94177535,SE +94177536,94177791,IT +94177792,94178047,DK +94178048,94178303,SE +94178304,94178559,IE +94178560,94180351,SE +94180352,94180607,PT +94180608,94181631,SE +94181632,94181887,CZ +94181888,94182399,SE +94182400,94182655,GB +94182656,94183423,SE +94183424,94183597,RU +94183598,94183598,IL +94183599,94183935,RU +94183936,94184191,SE +94184192,94184447,RU +94184448,94186239,SE +94186240,94186495,IT +94186496,94186751,SE +94186752,94187263,GB +94187264,94187775,SE +94187776,94188031,NO +94188032,94188287,SE +94188288,94188543,FR +94188544,94189311,SE +94189312,94189567,IE +94189568,94191615,SE +94191616,94193663,GB +94193664,94195711,SI +94195712,94199807,NL +94199808,94207999,IT +94208000,94240767,RO +94240768,94257151,PT +94257152,94261247,IT +94261248,94263295,ES +94263296,94265343,GB +94265344,94273535,RU +94273536,94289919,DE +94289920,94291967,NO +94291968,94294015,FR +94294016,94296063,GB +94296064,94298111,ES +94298112,94300159,GB +94300160,94302207,RU +94302208,94306303,FR +94306304,94308351,AT +94308352,94310399,ES +94310400,94312447,GE +94312448,94314495,DE +94314496,94316543,NL +94316544,94318591,IE +94318592,94320639,IR +94320640,94330879,DE +94330880,94337023,RU +94337024,94339071,GB +94339072,94355455,ES +94355456,94357503,NL +94357504,94361599,GB +94361600,94363647,LU +94363648,94365695,GB +94365696,94367743,HU +94367744,94369791,ES +94369792,94371839,TR +94371840,94502911,IR +94502912,94568447,OM +94568448,94633983,SA +94633984,94896127,RU +94896128,94931351,IT +94931352,94931352,SM +94931353,95158271,IT +95158272,95166463,RU +95166464,95168511,RS +95168512,95170559,NL +95170560,95174655,GB +95174656,95191039,IT +95191040,95195135,CH +95195136,95197183,SE +95197184,95203327,GB +95205376,95207423,PL +95207424,95211519,GR +95211520,95213567,IT +95213568,95215615,NL +95215616,95354879,PL +95354880,95363071,DE +95363072,95365119,IT +95365120,95367167,ES +95367168,95369215,IT +95369216,95371263,GB +95371264,95374591,IT +95375360,95377407,NL +95377408,95387647,RU +95387648,95387903,GB +95387904,95388927,DE +95388928,95389183,AU +95389184,95389695,DE +95389696,95389951,GB +95389952,95390207,US +95390208,95391231,DE +95391232,95391487,AE +95391488,95391999,RU +95392000,95393023,DE +95393024,95393151,GB +95393152,95393279,RS +95393280,95393407,GB +95393408,95393535,AE +95393536,95393663,DE +95393664,95393791,QA +95393792,95394047,GB +95394048,95394175,AU +95394176,95394303,DE +95394304,95395327,AU +95395328,95395455,GB +95395456,95395583,DE +95395584,95395839,GB +95395840,95398399,DE +95398400,95398655,GB +95398656,95398911,US +95398912,95399423,DE +95399424,95399679,US +95399680,95399695,DE +95399696,95399807,US +95399808,95399951,DE +95399952,95400063,CA +95400064,95400207,DE +95400208,95400319,US +95400320,95400447,DE +95400448,95400703,GB +95400704,95400719,DE +95400720,95400831,US +95400832,95400975,DE +95400976,95401087,US +95401088,95401471,DE +95401472,95401727,GB +95401728,95401855,US +95401856,95401903,DE +95401904,95401911,AT +95401912,95401983,DE +95401984,95402111,GB +95402112,95402239,KW +95402240,95402495,DE +95402496,95402623,GB +95402624,95402695,US +95402696,95402703,HR +95402704,95402719,DE +95402720,95402751,US +95402752,95403007,DE +95403008,95403135,US +95403136,95403183,DE +95403184,95403191,BE +95403192,95403263,DE +95403264,95403391,US +95403392,95403519,DE +95403520,95403775,GB +95403776,95404031,US +95404032,95404799,DE +95404800,95405055,GB +95405056,95405311,DE +95405312,95405439,US +95405440,95405567,DE +95405568,95405823,GB +95405824,95405951,US +95405952,95406335,DE +95406336,95407103,GB +95407104,95407359,DE +95407360,95407871,US +95407872,95407999,DE +95408000,95408127,US +95408128,95408255,DE +95408256,95408383,US +95408384,95408511,DE +95408512,95408639,US +95408640,95409151,GB +95409152,95409279,DE +95409280,95409407,US +95409408,95410175,DE +95410176,95410431,US +95410432,95410447,CH +95410448,95410559,DE +95410560,95410943,GB +95410944,95411199,DE +95411200,95411215,NL +95411216,95416831,DE +95416832,95417087,GB +95417088,95420173,DE +95420174,95420174,US +95420175,95420415,DE +95420416,95551487,TR +95551488,95555583,AZ +95555584,95557631,GB +95557632,95559679,RU +95559680,95561727,NL +95561728,95563007,IT +95563008,95563263,GB +95563264,95563775,IT +95563776,95567871,SK +95567872,95569919,NL +95569920,95571967,SE +95571968,95574015,RU +95574016,95576063,IT +95576064,95578624,GB +95578625,95578879,US +95578880,95580159,GB +95580160,95582207,NL +95582208,95584255,IT +95584256,95604735,GE +95604736,95608831,RU +95608832,95617023,GE +95617024,95625215,LV +95625216,95635455,IE +95635456,95637503,GB +95637504,95641599,DK +95641600,95645695,GB +95645696,95647743,SE +95647744,95649791,FR +95649792,95666175,IT +95666176,95668223,FR +95668224,95682559,DE +95944704,96075775,PL +96075776,96141311,DK +96141312,96143359,DE +96143360,96145407,GE +96145408,96149503,GB +96149504,96151551,ES +96151552,96153599,RU +96153600,96155647,PL +96155648,96157695,CH +96157696,96165887,RU +96165888,96174079,GP +96174080,96206847,HU +96206848,96209407,RU +96209408,96209919,HR +96209920,96210943,NL +96210944,96214015,EE +96214016,96222463,RU +96222464,96222719,UA +96222720,96223231,RU +96223232,96224255,KZ +96224256,96228863,RU +96228864,96229119,IE +96229120,96229375,RU +96229376,96230399,NL +96230400,96235519,RU +96235520,96236543,GB +96236544,96241663,RU +96241664,96241919,UA +96241920,96245759,RU +96245760,96246783,KZ +96246784,96247807,RU +96247808,96248831,NL +96248832,96250879,RU +96250880,96251903,UA +96251904,96252159,DE +96252160,96252415,ES +96252416,96252671,FR +96252672,96252927,NL +96252928,96255999,RU +96256000,96257023,US +96257024,96259327,RU +96259328,96259583,RO +96259584,96259839,US +96259840,96262143,RU +96262144,96262399,NL +96262400,96264191,RU +96264192,96265215,NL +96265216,96266239,RU +96266240,96266495,NL +96266496,96266751,RU +96266752,96267007,NL +96267008,96268287,RU +96268288,96272383,KZ +96272384,96305151,RU +96305152,96321535,DE +96321536,96323583,RU +96323584,96323711,ZA +96323712,96323839,KR +96323840,96323967,EG +96323968,96324095,ID +96324096,96324223,PK +96324224,96324351,VN +96324352,96324479,SG +96324480,96324607,US +96324608,96324735,IR +96324736,96324863,US +96324864,96324991,CA +96324992,96325119,FR +96325120,96325247,US +96325248,96325375,FI +96325376,96325503,US +96325504,96325631,SE +96325632,96327679,RU +96327680,96327935,NL +96327936,96328191,RO +96328192,96328447,US +96328448,96328703,DE +96328704,96329727,UA +96329728,96333823,GB +96333824,96336895,RU +96336896,96337151,CZ +96337152,96337663,NL +96337664,96337919,US +96337920,96403455,IR +96403456,96468991,AZ +96468992,96731135,AE +96731136,96736399,FR +96736400,96736400,ES +96736401,96739479,FR +96739480,96739483,DE +96739484,96739583,FR +96739584,96739587,PT +96739588,96739807,FR +96739808,96739839,NL +96739840,96740302,FR +96740303,96740303,IT +96740304,96740431,FR +96740432,96740447,PL +96740448,96741039,FR +96741040,96741043,PT +96741044,96741351,FR +96741352,96741359,LT +96741360,96741375,FR +96741376,96741391,GB +96741392,96741839,FR +96741840,96741843,DE +96741844,96742815,FR +96742816,96742831,NL +96742832,96743951,FR +96743952,96743967,GB +96743968,96744015,FR +96744016,96744031,BE +96744032,96744319,FR +96744320,96744335,PT +96744336,96744467,FR +96744468,96744471,DE +96744472,96744559,FR +96744560,96744567,ES +96744568,96745071,FR +96745072,96745087,GB +96745088,96745231,FR +96745232,96745247,GB +96745248,96746867,FR +96746868,96746871,PL +96746872,96747291,FR +96747292,96747295,PT +96747296,96747323,FR +96747324,96747327,PL +96747328,96747343,FR +96747344,96747359,DE +96747360,96747407,FR +96747408,96747423,DE +96747424,96747487,FR +96747488,96747519,ES +96747520,96755815,FR +96755816,96755819,PT +96755820,96755967,FR +96755968,96755999,PT +96756000,96756071,FR +96756072,96756079,ES +96756080,96756095,GB +96756096,96756427,FR +96756428,96756431,ES +96756432,96756543,FR +96756544,96756551,ES +96756552,96757375,FR +96757376,96757379,DE +96757380,96757403,FR +96757404,96757407,NL +96757408,96757639,FR +96757640,96757643,CH +96757644,96757647,SE +96757648,96757663,FR +96757664,96757667,SE +96757668,96757883,FR +96757884,96757887,ES +96757888,96758247,FR +96758248,96758251,DE +96758252,96759735,FR +96759736,96759739,ES +96759740,96761855,FR +96761856,96761871,BE +96761872,96762799,FR +96762800,96762815,BE +96762816,96762943,FR +96762944,96763007,ES +96763008,96763163,FR +96763164,96763167,PT +96763168,96763495,FR +96763496,96763503,IT +96763504,96763551,FR +96763552,96763555,GB +96763556,96763575,FR +96763576,96763579,ES +96763580,96763935,FR +96763936,96763967,IT +96763968,96764207,FR +96764208,96764223,LT +96764224,96764239,FR +96764240,96764255,DE +96764256,96764303,FR +96764304,96764319,DE +96764320,96764383,FR +96764384,96764399,FI +96764400,96764415,CZ +96764416,96764859,FR +96764860,96764863,CZ +96764864,96765327,FR +96765328,96765335,NL +96765336,96766063,FR +96766064,96766079,ES +96766080,96766259,FR +96766260,96766263,ES +96766264,96766267,FR +96766268,96766271,ES +96766272,96767031,FR +96767032,96767035,GB +96767036,96767243,FR +96767244,96767247,DE +96767248,96767823,FR +96767824,96767839,BE +96767840,96767903,FR +96767904,96767935,PL +96767936,96768143,FR +96768144,96768151,PT +96768152,96768155,FI +96768156,96768559,FR +96768560,96768563,PL +96768564,96768603,FR +96768604,96768607,DE +96768608,96769279,FR +96769280,96769295,ES +96769296,96770159,FR +96770160,96770175,ES +96770176,96770651,FR +96770652,96770655,PL +96770656,96771239,FR +96771240,96771247,ES +96771248,96771487,FR +96771488,96771503,IE +96771504,96771615,FR +96771616,96771647,FI +96771648,96772215,FR +96772216,96772223,PT +96772224,96772407,FR +96772408,96772408,GB +96772409,96773119,FR +96773120,96773375,ES +96773376,96774631,FR +96774632,96774635,BE +96774636,96774719,FR +96774720,96774751,ES +96774752,96774911,FR +96774912,96775039,GB +96775040,96775183,FR +96775184,96775199,PT +96775200,96775231,FR +96775232,96775295,DE +96775296,96775491,FR +96775492,96775495,ES +96775496,96775551,FR +96775552,96775567,GB +96775568,96775631,FR +96775632,96775639,ES +96775640,96775975,FR +96775976,96775983,ES +96775984,96775999,FR +96776000,96776063,GB +96776064,96776127,FR +96776128,96776191,ES +96776192,96776319,FR +96776320,96776323,ES +96776324,96776511,FR +96776512,96776543,ES +96776544,96776891,FR +96776892,96776895,DE +96776896,96777023,FR +96777024,96777087,ES +96777088,96777951,FR +96777952,96777983,PL +96777984,96778015,FR +96778016,96778031,ES +96778032,96778103,FR +96778104,96778107,BE +96778108,96778167,FR +96778168,96778171,LU +96778172,96778175,PT +96778176,96778239,FR +96778240,96778243,NL +96778244,96778255,FR +96778256,96778259,NL +96778260,96778263,PL +96778264,96778859,FR +96778860,96778863,NL +96778864,96778867,CZ +96778868,96778871,BE +96778872,96779007,FR +96779008,96779011,PT +96779012,96779015,FR +96779016,96779023,ES +96779024,96779167,FR +96779168,96779199,PT +96779200,96779247,FR +96779248,96779255,CZ +96779256,96780355,FR +96780356,96780359,BE +96780360,96780815,FR +96780816,96780823,ES +96780824,96780847,FR +96780848,96780855,CZ +96780856,96781407,FR +96781408,96781423,FI +96781424,96781647,FR +96781648,96781663,IT +96781664,96781751,FR +96781752,96781759,ES +96781760,96782167,FR +96782168,96782175,ES +96782176,96782199,FR +96782200,96782207,CZ +96782208,96782911,FR +96782912,96782915,LT +96782916,96783119,FR +96783120,96783135,PT +96783136,96783299,FR +96783300,96783303,ES +96783304,96783519,FR +96783520,96783551,ES +96783552,96783771,FR +96783772,96783775,DE +96783776,96783887,FR +96783888,96783903,DE +96783904,96784031,FR +96784032,96784039,ES +96784040,96784495,FR +96784496,96784511,FI +96784512,96784719,FR +96784720,96784723,NL +96784724,96784807,FR +96784808,96784811,PL +96784812,96784827,FR +96784828,96784831,PL +96784832,96785135,FR +96785136,96785151,NL +96785152,96785183,FR +96785184,96785199,ES +96785200,96785407,FR +96785408,96785411,NL +96785412,96785415,FR +96785416,96785423,NL +96785424,96785603,FR +96785604,96785607,PT +96785608,96786431,FR +96786432,96786495,GB +96786496,96787743,FR +96787744,96787751,ES +96787752,96787999,FR +96788000,96788031,LT +96788032,96788143,FR +96788144,96788159,ES +96788160,96792283,FR +96792284,96792287,DE +96792288,96792319,FR +96792320,96792383,ES +96792384,96792447,NL +96792448,96792511,FR +96792512,96792575,IT +96792576,96792751,FR +96792752,96792767,DE +96792768,96792923,FR +96792924,96792927,PL +96792928,96793039,FR +96793040,96793047,IT +96793048,96793583,FR +96793584,96793599,DE +96793600,96793687,FR +96793688,96793688,ES +96793689,96793715,FR +96793716,96793716,ES +96793717,96794159,FR +96794160,96794175,ES +96794176,96794271,FR +96794272,96794303,PT +96794304,96794471,FR +96794472,96794479,ES +96794480,96794623,FR +96794624,96794687,CZ +96794688,96796671,FR +96796672,96862207,AZ +96862208,96894975,GB +96894976,96897023,CZ +96897024,96899071,GB +96899072,96903167,AT +96903168,96911359,IR +96911360,96919551,FR +96919552,96923647,IT +96923648,96925695,JO +96925696,96960511,GB +96960512,96964607,DE +96964608,96968703,NL +96968704,96972799,LT +96972800,96974847,DE +96976896,96985087,RU +96985088,96987135,ES +96987136,96989183,UA +96989184,96993279,DE +96993280,97001471,NL +97001472,97009663,RU +97009664,97058815,IR +97058816,97091583,PL +97091584,97189887,IR +97189888,97255423,GR +97255424,97320959,HU +97320960,97386495,ES +97386496,97419263,RU +97419264,97435647,HU +97435648,97437695,DK +97437696,97439743,AT +97439744,97444863,NL +97444864,97445887,PT +97445888,97447935,RS +97447936,97452031,PL +97452032,97517567,UA +97517568,98566143,IR +98566144,98697215,ES +98697216,98701311,FR +98701312,98705407,ES +98705408,98707455,SE +98707456,98709503,NL +98709504,98711551,IR +98711552,98713599,GB +98713600,98732031,PL +98732032,98734079,GB +98734080,98736127,CH +98736128,98738175,RU +98738176,98740223,NO +98740224,98740479,ES +98740480,98740735,US +98740736,98741247,DE +98741248,98741503,ES +98741504,98741759,US +98741760,98742271,DE +98742272,98744319,GB +98744320,98746367,ES +98746368,98762751,TR +98762752,98893823,RU +98893824,98959359,TR +98959360,98959615,DE +98959616,98959679,US +98959680,98960639,DE +98960640,98960799,US +98960800,98961407,DE +98961408,98961919,FR +98961920,98992383,DE +98992384,98992423,US +98992424,98992431,DE +98992432,98992639,US +98992640,98993151,DE +98993152,98993175,US +98993176,98993407,DE +98993408,98993663,GB +98993664,98997759,DE +98997760,98998271,FR +98998272,98998527,DE +98998528,98998783,GB +98998784,98999551,DE +98999552,99000319,GB +99000320,99001855,DE +99001856,99001871,SG +99001872,99024895,DE +99024896,99025167,GB +99025168,99025279,DE +99025280,99025407,US +99025408,99025919,DE +99025920,99025935,FI +99025936,99026047,DE +99026048,99026175,US +99026176,99026303,DE +99026304,99026431,US +99026432,99026559,DE +99026560,99026687,US +99026688,99026943,DE +99026944,99027199,GB +99027200,99027215,HR +99027216,99027455,CA +99027456,99027711,PL +99027712,99027967,DE +99027968,99027983,ES +99027984,99028095,DE +99028096,99028223,US +99028224,99028239,GB +99028240,99028351,DE +99028352,99028735,US +99028736,99028751,SE +99028752,99028863,DE +99028864,99028991,US +99028992,99029503,GB +99029504,99029519,IE +99029520,99029887,DE +99029888,99030015,US +99030016,99030143,DE +99030144,99030271,US +99030272,99030399,DE +99030400,99030527,US +99030528,99030815,DE +99030816,99030895,US +99030896,99030911,DE +99030912,99031039,US +99031040,99031295,DE +99031296,99031551,GB +99031552,99031807,CZ +99031808,99031823,GB +99031824,99031935,DE +99031936,99032063,US +99032064,99032319,DE +99032320,99032575,ES +99032576,99033343,DE +99033344,99033599,IT +99033600,99043839,DE +99043840,99043847,AT +99043848,99044111,DE +99044112,99044223,US +99044224,99044351,DE +99044352,99044359,BE +99044360,99044607,DE +99044608,99044615,HR +99044616,99044863,DE +99044864,99045119,GB +99045120,99045375,NL +99045376,99049471,DE +99049472,99049983,GB +99049984,99053055,DE +99053056,99053567,GB +99053568,99085567,DE +99085568,99085823,GB +99085824,99090431,DE +99090432,99614719,IR +99614720,99876863,SE +99876864,100139007,SA +100139008,100204543,UA +100204544,100237311,PT +100237312,100245503,IT +100245504,100246015,SE +100246016,100246271,GB +100246272,100246527,NL +100246528,100246783,DE +100246784,100247039,FR +100247040,100247551,SE +100247552,100249599,CH +100249600,100253695,SI +100253696,100261887,RU +100261888,100270079,NO +100270080,100302847,IR +100302848,100311039,KZ +100311040,100313087,FI +100313088,100315135,RU +100315136,100319231,GB +100319232,100327423,AZ +100327424,100329471,SE +100329472,100331519,RU +100331520,100335615,TR +100335616,100401151,KZ +100532224,100547839,RO +100547840,100548095,DE +100548096,100548607,US +100548608,100548872,RO +100548873,100548873,TR +100548874,100550143,RO +100550144,100550399,NL +100550400,100550655,DE +100550656,100550911,RO +100550912,100551167,NL +100551168,100551423,US +100551424,100551679,RO +100551680,100552191,US +100552192,100552447,GB +100552448,100552703,US +100552704,100552959,AT +100552960,100553215,US +100553216,100553471,DE +100553472,100553727,AT +100553728,100553983,US +100553984,100554495,DE +100554496,100554751,US +100554752,100555263,DE +100555264,100555519,US +100555520,100558847,RO +100558848,100559255,DE +100559256,100559263,EG +100559264,100559359,DE +100559360,100559871,GB +100559872,100560895,US +100560896,100561151,GB +100561152,100561407,RO +100561408,100561919,US +100561920,100562943,RO +100562944,100564223,DE +100564224,100564479,RO +100564480,100564991,US +100564992,100573183,SE +100573184,100575231,GB +100575232,100577279,DK +100577280,100579327,RU +100579328,100581375,AT +100581376,100589567,SE +100589568,100597759,RU +100597760,100598783,TR +100598784,100612095,US +100612096,100630527,NL +100630528,100632575,BE +100632576,100634623,GB +100634624,100635199,ES +100635200,100635247,BE +100635248,100635263,CH +100635264,100636671,ES +100636672,100638719,NL +100638720,100646911,UA +100646912,100647679,RU +100647680,100647711,TR +100647712,100661759,RU +100661760,100662015,US +100662016,100662143,DE +100662144,100662271,TR +100662272,100663295,RU +100663296,121195295,US +121195296,121195327,IT +121195328,134221823,US +134221824,134222079,DE +134222080,134222335,US +134222336,134222379,DE +134222380,134222380,US +134222381,134222404,DE +134222405,134222405,US +134222406,134222452,DE +134222453,134222453,US +134222454,134222476,DE +134222477,134222477,US +134222478,134222523,DE +134222524,134222524,US +134222525,134222526,DE +134222527,134222527,US +134222528,134222538,DE +134222539,134222539,US +134222540,134222556,DE +134222557,134222557,US +134222558,134222591,DE +134222592,134223871,US +134223872,134224127,GB +134224128,134224383,US +134224384,134224639,GB +134224640,134227967,US +134227968,134228223,SG +134228224,134228479,JP +134228480,134247423,US +134247424,134247424,DE +134247425,134443007,US +134443008,134445055,MP +134445056,134445823,US +134445824,134446079,GU +134446080,134738943,US +134738944,134739199,CA +134739200,135192575,US +135192576,135200767,MX +135200768,135430143,US +135430144,135430399,CA +135430400,135432191,US +135432192,135434239,CA +135434240,135441407,US +135441408,135441663,CA +135441664,135556607,US +135556608,135556863,CA +135556864,135557375,US +135557376,135557631,CA +135557632,135558399,US +135558400,135558655,NL +135558656,135603199,US +135603200,135604223,CA +135604224,135604479,US +135604480,135604735,CA +135604736,135607039,US +135607040,135607295,CA +135607296,135792639,US +135792640,135794687,CA +135794688,135925759,US +135925760,135926783,VI +135926784,135941631,US +135941632,135942143,CA +135942144,135945727,US +135945728,135945983,CA +135945984,136054015,US +136054016,136054271,GB +136054272,136175615,US +136175616,136175871,CA +136175872,136237055,US +136237056,136239103,CA +136239104,136404991,US +136404992,136407039,CA +136407040,136413183,US +136413184,136415665,CA +136415666,136415666,FR +136415667,136415743,CA +136415744,136702290,US +136702291,136702291,UM +136702292,139954241,US +139954242,139954242,ES +139954243,151521029,US +151521030,151521030,FR +151521031,151587080,US +151587081,151587081,FR +151587082,152305663,US +152305664,152338431,GB +152338432,167772159,US +184549376,185405200,US +185405201,185405201,CZ +185405202,185999659,US +185999660,185999660,FR +185999661,202182143,US +202182144,202182399,GB +202182400,204047871,US +204047872,204047999,PR +204048000,204048031,US +204048032,204048047,PR +204048048,209472767,US +209472768,209472768,IN +209472769,212791831,US +212791832,212791839,VI +212791840,213981695,US +213981696,213982207,CA +213982208,214698239,US +214698240,214698255,VI +214698256,214698303,US +214698304,214698311,VI +214698312,214777855,US +214777856,214786303,PR +214786304,214787071,US +214787072,214788095,PR +214788096,217809407,US +217809408,217809663,GB +217809664,219512063,US +219512064,219512319,GB +219512320,221642751,US +221642752,221773823,AU +221773824,222494719,US +222494720,222527487,SG +222527488,222625791,US +222625792,222658559,NL +222658560,222691327,IE +222691328,222707711,HK +222707712,222740479,AU +222740480,222756863,IE +222756864,222789631,IN +222789632,222797823,JP +222797824,222806015,CA +222806016,222871551,US +222871552,222879743,HK +222879744,222887935,AU +222887936,222896127,JP +222896128,222912511,US +222912512,222920703,AU +222920704,222937087,NL +222937088,222941183,AU +222941184,222945279,US +222945280,222947327,NL +222947328,222949375,JP +222949376,222953471,US +222953472,223019007,IE +223019008,223051775,HK +223051776,223084543,AU +223084544,223150079,SG +223150080,223166463,AU +223166464,223215615,US +223215616,223248383,JP +223248384,223281151,US +223281152,223346687,IE +223346688,223477759,NL +223477760,223805439,US +223805440,223838207,GB +223838208,223922175,US +223922176,223924223,NL +223924224,223928319,HK +223928320,223936511,CA +223936512,224198655,US +224198656,224231423,NL +224231424,224264191,US +224264192,224280575,HK +224280576,224296959,IE +224296960,224395263,NL +224395264,225050623,US +225050624,225051647,IN +225051648,225052159,SG +225052160,225052671,JP +225052672,225053183,CA +225053184,225055231,GB +225055232,225055743,JP +225055744,225060863,US +225060864,225061375,JP +225061376,225061887,CA +225061888,225062399,HK +225062400,225062911,IN +225062912,225063423,CA +225063424,225065471,US +225065472,225066495,AU +225066496,225067007,US +225067008,225068031,NL +225068032,225068543,US +225068544,225069055,IE +225069056,225070079,US +225070080,225070591,NL +225070592,225070599,PR +225070600,225070623,US +225070624,225070655,PR +225070656,225070847,US +225070848,225071103,PR +225071104,225073151,US +225073152,225073663,IE +225073664,225074687,KR +225074688,225076735,US +225076736,225077247,NL +225077248,225077759,IE +225077760,225078783,US +225078784,225079295,IE +225079296,225079807,HK +225079808,225080319,PR +225080320,225080831,US +225080832,225080895,JP +225080896,225081855,US +225081856,225082367,AU +225082368,225082879,GB +225082880,225084415,US +225084416,225085439,FR +225085440,225085951,NL +225085952,225086463,FR +225086464,225086975,NL +225086976,225087487,FR +225087488,225088511,US +225088512,225089023,SG +225089024,225089535,IE +225089536,225093631,US +225093632,225094143,SG +225094144,225094655,JP +225094656,225095167,US +225095168,225095679,IE +225095680,225096191,AU +225096192,225096703,HK +225096704,225097215,IE +225097216,225097727,JP +225097728,225098239,AU +225098240,225098751,US +225098752,225099263,JP +225099264,225099775,US +225099776,225100287,SG +225100288,225100799,AU +225100800,225101823,US +225101824,225102335,AU +225102336,225443839,US +225443840,225705983,JP +225705984,226230271,US +226230272,226361343,KR +226361344,226492415,IN +226492416,231800831,US +231800832,231866367,KR +231866368,231997439,AU +231997440,233046015,US +233046016,233177087,SG +233177088,233308159,JP +233308160,233570303,IN +233570304,233832447,AU +233832448,234487807,US +234487808,234618879,SG +234618880,234881023,US +234881024,234883071,CN +234883072,234884095,JP +234884096,234885119,CN +234885120,234889215,VN +234889216,234893311,JP +234893312,234893567,MY +234893568,234893823,KR +234893824,234894079,IN +234894080,234894335,KR +234894336,234894847,HK +234894848,234895359,SG +234895360,234895615,TW +234895616,234895871,MY +234895872,234896127,TH +234896128,234896383,MN +234896384,234896639,IN +234896640,234896895,AE +234896896,234897151,PH +234897152,234897407,IN +234897408,234913791,KR +234913792,234946559,HK +234946560,234947583,CN +234947584,234950655,JP +234950656,234951679,AU +234951680,234952703,HK +234952704,234953727,CN +234953728,234954751,US +234954752,234971135,NZ +234971136,234972159,CN +234972160,234973183,BD +234973184,234974207,PK +234974208,234975231,CN +234975232,234976255,SG +234976256,234979327,IN +234979328,235012095,MY +235012096,235077631,AU +235077632,235143167,JP +235143168,235405311,KR +235405312,235929599,JP +235929600,236978175,CN +236978176,241172479,KR +241172480,241434623,IN +241434624,241500159,SG +241500160,241565695,JP +241565696,241598463,IN +241598464,241599487,CN +241599488,241600511,JP +241600512,241602559,AU +241602560,241604607,MY +241604608,241605631,ID +241605632,241606655,CN +241606656,241607679,IN +241607680,241608703,JP +241608704,241609727,PH +241609728,241610751,US +241610752,241611775,JP +241611776,241612799,CN +241612800,241613823,HK +241613824,241614847,IN +241614848,241623039,JP +241623040,241627135,IN +241627136,241631231,HK +241631232,243269631,CN +243269632,243270655,JP +243270656,243271679,NZ +243271680,243272703,TH +243273728,243277823,JP +243277824,243286015,AU +243286016,243302399,JP +243302400,243400703,KR +243400704,243531775,CN +243531776,243662847,JP +243662848,243793919,CN +243793920,243859455,HK +243859456,243916799,AU +243916800,243924991,JP +243924992,243990527,KR +243990528,244071319,IN +244071320,244071327,LK +244071328,244318207,IN +244318208,245366783,CN +245366784,247463935,VN +247463936,247464959,IN +247464960,247467007,HK +247467008,247469055,IN +247469056,247470079,HK +247470080,247472127,IN +247472128,247476223,JP +247477248,247478271,IN +247479296,247480319,CN +247480320,247482367,MY +247482368,247483391,PG +247483392,247484415,CN +247484416,247488511,KR +247488512,247496703,JP +247496704,247504895,PK +247504896,247513087,AU +247513088,247529471,MY +247529472,247595007,JP +247595008,247726079,IN +247726080,247857151,CN +247857152,247988223,HK +247988224,248250367,AU +248250368,248381439,CN +248381440,248446975,KR +248446976,248512511,TH +248512512,249561087,CN +249561088,251658239,VN +251658240,257532415,US +257532416,257532423,SG +257532424,257532431,US +257532432,257532671,SG +257532672,265003519,US +265003520,265003547,HU +265003548,265003548,FR +265003549,265003775,HU +265003776,265025791,US +265025792,265026047,GB +265026048,265527295,US +265527296,265529599,JP +265529600,265529855,US +265529856,265535487,JP +265535488,266062079,US +266062080,266062335,GB +266062336,266067967,US +266067968,266076159,AU +266076160,266598655,US +266598656,266598911,BR +266598912,288151551,US +288151552,288157695,CA +288157696,288167423,US +288167424,288167935,CA +288167936,288169471,US +288169472,288169983,CA +288169984,288176127,US +288176128,288178175,MX +288178176,288180223,CA +288180224,288196607,US +288196608,288197119,CA +288197120,288197631,US +288197632,288198143,CA +288198144,288198655,CL +288198656,288199679,US +288199680,288200703,CO +288200704,288205422,US +288205423,288205423,CO +288205424,288205424,BR +288205425,288205425,MX +288205426,288205426,CL +288205427,288212991,US +288212992,288215039,CA +288215040,288223231,US +288223232,288227327,CA +288227328,288293887,US +288293888,288294143,BR +288294144,288358399,US +288358400,288366591,BR +288366592,289406975,US +289406976,289554431,IE +289554432,289610751,US +289610752,289611775,SE +289611776,289615871,GB +289615872,289619967,FR +289619968,289624063,US +289624064,289628159,CH +289628160,289630207,US +289630208,289632255,SE +289632256,289652735,US +289652736,289653759,NL +289653760,289654271,DE +289654272,289654783,US +289654784,289655807,CZ +289655808,289656831,DE +289656832,289657855,BE +289657856,289658879,AE +289658880,289659903,GB +289659904,289660927,US +289660928,289665023,ES +289665024,289667071,US +289667072,289668095,GB +289668096,289669119,DE +289669120,289746943,US +289746944,289751039,GB +289751040,289767423,US +289767424,289769471,GB +289769472,289779711,US +289779712,289783807,RU +289783808,289787903,GB +289787904,289789951,DE +289789952,289791999,US +289792000,289794047,AE +289794048,289796095,GB +289796096,289798143,TR +289798144,289800191,SA +289800192,289948927,US +289948928,289949055,AT +289949056,289949183,US +289949184,289949695,RU +289949696,289950207,NL +289950208,289950463,PL +289950464,289950719,PT +289950720,289950975,CZ +289950976,289951231,US +289951232,289951487,RU +289951488,289951743,US +289951744,289952255,DE +289952256,289953791,GB +289953792,289954303,US +289954304,289954559,ES +289954560,289955839,US +289955840,289955967,NL +289955968,289956095,US +289956096,289956223,NO +289956224,289956351,US +289956352,289956479,DK +289956480,289956607,US +289956608,289956735,NL +289956736,289956863,IN +289956864,289957119,ES +289957120,289957375,US +289957376,289957631,SE +289957632,289957887,US +289957888,289958143,LU +289958144,289958399,US +289958400,289958655,IN +289958656,289958911,US +289958912,289959423,IT +289959424,289959935,DK +289959936,289960447,DE +289960448,289960959,IN +289960960,289961471,BE +289961472,289963007,US +289963008,289964031,FR +289964032,289980415,IE +289980416,290193407,US +290193408,290258943,IN +290258944,290265087,US +290265088,290267135,RU +290267136,290269183,US +290269184,290270207,PL +290270208,290271231,PT +290271232,290277375,US +290277376,290279423,GB +290279424,290295295,US +290295296,290295807,IN +290295808,290299903,US +290299904,290300927,LU +290300928,290301951,TR +290301952,290302463,IN +290302464,290302591,DE +290302592,290302975,US +290302976,290303999,DE +290304000,290306047,US +290306048,290308095,DK +290308096,290310143,US +290310144,290312191,IN +290312192,290340863,US +290340864,290373631,IL +290373632,290374911,US +290374912,290375167,GB +290375168,290377727,US +290377728,290379775,GB +290379776,290383103,US +290383104,290383359,NL +290383360,290390015,US +290390016,290394111,IL +290394112,290423807,US +290423808,290424831,SE +290424832,290455551,US +290455552,290586623,CN +290586624,290652159,SG +290652160,290717695,JP +290717696,290737919,US +290737920,290738175,SG +290738176,290791423,US +290791424,290795519,CN +290795520,290799615,US +290799616,290801663,CN +290801664,290815999,US +290816000,290848767,CN +290848768,290914303,AU +290914304,291045375,CN +291045376,291201023,US +291201024,291203071,JP +291203072,300646399,US +300646400,300650495,JP +300650496,300654591,SG +300654592,300658687,US +300658688,300662783,AU +300662784,300666879,GB +300666880,300670975,NL +300670976,300675071,IE +300675072,300679167,IL +300679168,301801983,US +301801984,301802239,GB +301802240,301802495,US +301802496,301802751,GB +301802752,301803007,US +301803008,301803263,SE +301803264,301805567,US +301805568,301805823,DE +301805824,301806591,US +301806592,301806847,NL +301806848,301807103,US +301807104,301807359,DE +301807360,301807615,US +301807616,301807871,DE +301807872,301810175,US +301810176,301810431,AU +301810432,301810687,US +301810688,301810943,JP +301810944,301811199,US +301811200,301811455,JP +301811456,301812223,US +301812224,301812479,JP +301812480,301812735,US +301812736,301812991,GB +301812992,301813247,US +301813248,301813503,DE +301813504,301814271,US +301814272,301814527,SG +301814528,301814783,US +301814784,301815039,HK +301815040,301815295,US +301815296,301815551,HK +301815552,301987839,US +301987840,301987847,GB +301987848,301987863,US +301987864,301988111,GB +301988112,301988119,US +301988120,301988151,GB +301988152,301988167,US +301988168,301988191,GB +301988192,301989023,US +301989024,301989031,MO +301989032,301989119,US +301989120,301989183,AU +301989184,301989375,US +301989376,301989631,SG +301989632,301989711,US +301989712,301989719,JP +301989720,314703871,US +314703872,314966015,DE +314966016,315097087,US +315097088,315162623,IE +315162624,317128703,US +317128704,317194239,BR +317194240,322058771,US +322058772,322058772,CL +322058773,323243895,US +323243896,323243903,FR +323243904,332132119,US +332132120,332132127,IL +332132128,344262655,US +344262656,344262911,GB +344262912,344592895,US +344592896,344592945,GB +344592946,344592946,US +344592947,344593151,GB +344593152,344662783,US +344662784,344663039,MY +344663040,344670719,US +344670720,344671231,IN +344671232,344711167,US +344711168,344719359,AU +344719360,344881151,US +344881152,344881407,IN +344881408,344977407,US +344977408,344977663,IN +344977664,347602943,US +347602944,347619327,SG +347619328,347815935,US +347815936,347832319,HK +347832320,347865087,US +347865088,347873279,JP +347873280,347881471,FR +347881472,347889663,US +347889664,347897855,SG +347897856,347930623,AU +347930624,347947007,US +347947008,347963391,HK +347963392,347979775,US +347979776,347996159,JP +347996160,348012543,US +348012544,348020735,SG +348020736,348029183,US +348029184,348029439,IE +348029440,348031231,US +348031232,348031487,NL +348031488,348031743,US +348031744,348031999,CA +348032000,348032127,SG +348032128,348032255,HK +348032256,348032511,JP +348032512,348032767,AU +348032768,348033023,GB +348033024,348033151,US +348033152,348033279,KR +348033280,348033407,BR +348033408,348033791,IN +348033792,348034047,FR +348034048,348034303,KR +348034304,348061695,US +348061696,348078079,IE +348078080,353769239,US +353769240,353769240,FR +353769241,355993887,US +355993888,355993895,IT +355993896,368674047,US +368674048,368674303,ES +368674304,372398271,US +372398272,372398303,AU +372398304,385884159,US +385884160,385888255,NL +385888256,385917183,US +385917184,385917439,NL +385917440,385920511,US +385920512,385920767,NL +385920768,385930239,US +385930240,385931263,NL +385931264,385939967,US +385939968,385940479,NL +385940480,385942527,US +385942528,385943551,NL +385943552,385957887,US +385957888,385961983,NL +385961984,386003199,US +386003200,386003967,NL +386003968,386012159,US +386012160,386012671,NL +386012672,386013183,US +386013184,386013695,NL +386013696,386015231,US +386015232,386015487,NL +386015488,386020351,US +386020352,386021375,NL +386021376,386035711,US +386035712,386039807,NL +386039808,386060287,US +386060288,386068479,NL +386068480,386073343,US +386073344,386073599,NL +386073600,386076415,US +386076416,386076671,NL +386076672,386095615,US +386095616,386096127,NL +386096128,386191359,US +386191360,386195455,NL +386195456,386201599,US +386201600,386203135,NL +386203136,386215935,US +386215936,386220031,NL +386220032,386228223,US +386228224,386232319,NL +386232320,386244607,US +386244608,386244863,NL +386244864,386245119,US +386245120,386245631,NL +386245632,386247679,US +386247680,386248703,NL +386248704,386297855,US +386297856,386298879,NL +386298880,386300415,US +386300416,386301951,NL +386301952,386383871,US +386383872,386387967,NL +386387968,386398207,US +386398208,386398719,NL +386398720,386398975,US +386398976,386399231,NL +386399232,386400255,US +386400256,386404351,NL +386404352,386465791,US +386465792,386469887,NL +386469888,386498559,US +386498560,386502655,NL +386502656,386519039,US +386519040,386523135,NL +386523136,386593279,US +386593280,386594815,NL +386594816,386595071,US +386595072,386595327,NL +386595328,386595583,US +386595584,386596095,NL +386596096,386656255,US +386656256,386656511,NL +386656512,386662399,US +386662400,386666495,NL +386666496,386682879,US +386682880,386691071,NL +386691072,386736127,US +386736128,386740223,NL +386740224,386774527,US +386774528,386775039,NL +386775040,386783231,US +386783232,386783743,NL +386783744,386789375,US +386789376,386797567,NL +386797568,386816511,US +386816512,386818047,NL +386818048,386826751,US +386826752,386827263,NL +386827264,386828287,US +386828288,386829311,NL +386829312,386862079,US +386862080,386862335,JP +386862336,386862591,KR +386862592,386868735,US +386868736,386868991,NL +386868992,386875391,US +386875392,386879487,NL +386879488,386892799,US +386892800,386893311,NL +386893312,386923519,US +386923520,386924543,NL +386924544,387055615,CA +387055616,387121151,PR +387121152,387648767,US +387648768,387649023,DE +387649024,387707903,US +387707904,387708159,CH +387708160,387825663,US +387825664,387833855,CA +387833856,387975167,US +387975168,387976191,NL +387976192,387977215,US +387977216,387978239,NL +387978240,387979263,US +387979264,387980287,NL +387980288,387994623,US +387994624,387996159,NL +387996160,387997695,US +387997696,388005887,NL +388005888,388029439,US +388029440,388030463,NL +388030464,388035071,US +388035072,388036607,NL +388036608,388038655,US +388038656,388042751,NL +388042752,388050943,US +388050944,388051967,NL +388051968,388055039,US +388055040,388059135,NL +388059136,388091903,US +388091904,388095999,NL +388096000,388100095,US +388100096,388101119,NL +388101120,388139519,US +388139520,388140031,NL +388140032,388149247,US +388149248,388153343,NL +388153344,388194303,US +388194304,388202495,NL +388202496,388206591,US +388206592,388207103,NL +388207104,388207871,US +388207872,388208127,NL +388208128,388223999,US +388224000,388225023,NL +388225024,388272127,US +388272128,388280319,NL +388280320,388288511,US +388288512,388293631,NL +388293632,388294143,US +388294144,388296703,NL +388296704,388308991,US +388308992,388317183,NL +388317184,388325375,US +388325376,388329471,NL +388329472,388341759,US +388341760,388345855,NL +388345856,388366335,US +388366336,388392447,NL +388392448,388397055,US +388397056,388398079,NL +388398080,388419583,US +388419584,388423679,NL +388423680,388440063,US +388440064,388444159,NL +388444160,388448255,US +388448256,388464639,NL +388464640,388472831,US +388472832,388476927,NL +388476928,388481023,US +388481024,388485119,NL +388485120,388493311,US +388493312,388501503,NL +388501504,388521983,US +388521984,388523007,NL +388523008,388526079,US +388526080,388530175,NL +388530176,388538367,US +388538368,388542463,NL +388542464,388550655,US +388550656,388554751,NL +388554752,388558847,US +388558848,388562943,NL +388562944,388567039,US +388567040,388571135,NL +388571136,388617215,US +388617216,388620287,NL +388620288,388632575,US +388632576,388636671,NL +388636672,388665343,US +388665344,388668415,NL +388668416,388677631,US +388677632,388681727,NL +388681728,388698111,US +388698112,388703231,NL +388703232,388710399,US +388710400,388714495,NL +388714496,388722687,US +388722688,388730879,NL +388730880,388784895,US +388784896,388792319,NL +388792320,388825087,US +388825088,388826111,NL +388826112,388828159,US +388828160,388829183,NL +388829184,388843519,US +388843520,388844543,NL +388844544,388849663,US +388849664,388853759,NL +388853760,388856831,US +388856832,388857343,NL +388857344,388862975,US +388862976,388865023,NL +388865024,388866047,US +388866048,388870143,NL +388870144,388885503,US +388885504,388890623,NL +388890624,388893695,US +388893696,388894719,NL +388894720,388896767,US +388896768,388897279,NL +388897280,388897791,US +388897792,388898815,NL +388898816,388919295,US +388919296,388923391,NL +388923392,388943871,US +388943872,388944127,NL +388944128,388944895,US +388944896,388945919,NL +388945920,388956159,US +388956160,388960255,NL +388960256,388964351,US +388964352,388973567,NL +388973568,388996095,US +388996096,388997119,NL +388997120,389044223,US +389044224,389045247,NL +389045248,389060607,US +389060608,389061631,NL +389061632,389076479,US +389076480,389078015,NL +389078016,389102079,US +389102080,389102591,NL +389102592,389136383,US +389136384,389140479,NL +389140480,389153791,US +389153792,389154815,NL +389154816,389165055,US +389165056,389169151,NL +389169152,389177343,US +389177344,389181439,NL +389181440,389185535,US +389185536,389201919,NL +389201920,389242879,US +389242880,389251071,NL +389251072,389273599,US +389273600,389283839,NL +389283840,389286911,US +389286912,389293055,NL +389293056,389296127,US +389296128,389300223,NL +389300224,389319167,US +389319168,389319679,NL +389319680,389320191,US +389320192,389320447,NL +389320448,389327359,US +389327360,389327615,NL +389327616,389350143,US +389350144,389350399,NL +389350400,389350655,US +389350656,389351423,NL +389351424,389351935,US +389351936,389352959,NL +389352960,389353215,US +389353216,389365759,NL +389365760,389391359,US +389391360,389394431,NL +389394432,389414911,US +389414912,389419007,NL +389419008,389435391,US +389435392,389445119,NL +389445120,389447679,US +389447680,389451775,NL +389451776,389495295,US +389495296,389495807,NL +389495808,389509119,US +389509120,389513215,NL +389513216,389515263,US +389515264,389521407,NL +389521408,389554175,US +389554176,389562367,NL +389562368,389570559,US +389570560,389571071,NL +389571072,389571583,US +389571584,389571839,NL +389571840,389572095,US +389572096,389572607,NL +389572608,389572863,US +389572864,389573119,NL +389573120,389573887,US +389573888,389574143,NL +389574144,389591039,US +389591040,389592063,NL +389592064,389593087,US +389593088,389594111,NL +389594112,389612543,US +389612544,389613567,NL +389613568,389615615,US +389615616,389619711,NL +389619712,389631999,US +389632000,389635071,NL +389635072,389636095,US +389636096,389640191,NL +389640192,389700863,US +389700864,389701119,NL +389701120,389732351,US +389732352,389733375,NL +389733376,389733887,US +389733888,389734399,NL +389734400,389758975,US +389758976,389761023,NL +389761024,389764095,US +389764096,389765631,NL +389765632,389767167,US +389767168,389775359,NL +389775360,389812223,US +389812224,389816319,NL +389816320,389825791,US +389825792,389826047,NL +389826048,389852671,US +389852672,389853183,NL +389853184,389857279,US +389857280,389873663,NL +389873664,389874687,US +389874688,389875711,NL +389875712,389931007,US +389931008,389936127,NL +389936128,389937407,US +389937408,389937663,NL +389937664,389939711,US +389939712,389940223,NL +389940224,389941503,US +389941504,389941759,NL +389941760,389954815,US +389954816,389955071,NL +389955072,389964287,US +389964288,389965055,NL +389965056,389965311,US +389965312,389966335,NL +389966336,389967871,US +389967872,389977087,NL +389977088,389977599,US +389977600,389978111,NL +389978112,389979156,US +389979157,389979157,AU +389979158,389979189,US +389979190,389979190,AU +389979191,389988351,US +389988352,389992447,NL +389992448,389996543,US +389996544,389996799,NL +389996800,389996800,SG +389996801,390026751,US +390026752,390029311,NL +390029312,390030335,US +390030336,390030847,NL +390030848,390033407,US +390033408,390043135,NL +390043136,390063615,US +390063616,390066175,NL +390066176,390074111,US +390074112,390082559,NL +390082560,390085631,US +390085632,390086655,NL +390086656,390103039,US +390103040,390103551,NL +390103552,390106623,US +390106624,390107135,NL +390107136,390123519,US +390123520,390131711,NL +390131712,390141439,US +390141440,390141695,NL +390141696,390143231,US +390143232,390143999,NL +390144000,390165503,US +390165504,390166527,NL +390166528,390184959,US +390184960,390189055,NL +390189056,390205439,US +390205440,390209535,NL +390209536,390261247,US +390261248,390261759,NL +390261760,390276863,US +390276864,390277375,NL +390277376,390277631,US +390277632,390278143,NL +390278144,390278911,US +390278912,390279167,NL +390279168,390281727,US +390281728,390281983,NL +390281984,390286847,US +390286848,390287359,NL +390287360,390299647,US +390299648,390304767,NL +390304768,390332159,US +390332160,390332415,NL +390332416,390731775,US +390731776,390732031,NL +390732032,390972927,US +390972928,390973951,NL +390973952,390975487,US +390975488,390976511,NL +390976512,390995967,US +390995968,391020543,NL +391020544,391110655,US +391110656,391110911,IL +391110912,391111167,GB +391111168,391111679,NL +391111680,391111935,US +391111936,391112063,AU +391112064,391112703,US +391112704,391113471,NL +391113472,391116543,US +391116544,391116799,NL +391116800,391331839,US +391331840,391333887,NL +391333888,391344127,US +391344128,391348223,NL +391348224,391368703,US +391368704,391372799,CA +391372800,391865855,US +391865856,391866879,HK +391866880,391867391,US +391867392,391867647,VN +391867648,391872511,US +391872512,391888895,CA +391888896,391897087,US +391897088,391905279,CA +391905280,391937535,US +391937536,391937791,CA +391937792,391938047,IE +391938048,391946239,CA +391946240,391960335,US +391960336,391960351,GB +391960352,392044351,US +392044352,392044359,CA +392044360,392054271,US +392054272,392054527,CA +392054528,392055943,US +392055944,392055951,GB +392055952,392073319,US +392073320,392073327,CA +392073328,392103471,US +392103472,392103479,GB +392103480,392112815,US +392112816,392112823,GB +392112824,392114895,US +392114896,392114903,TH +392114904,392245247,US +392245248,392249343,SG +392249344,392257535,HK +392257536,392265727,BR +392265728,392298495,NL +392298496,392306687,US +392306688,392310015,HK +392310016,392310271,US +392310272,392310527,NL +392310528,392312831,US +392312832,392313343,JP +392313344,392314879,US +392314880,392331263,SG +392331264,392388607,US +392388608,392396799,HK +392396800,392429567,US +392429568,392433663,NL +392433664,392441855,US +392441856,392445951,IE +392445952,392452095,US +392452096,392454143,HK +392454144,392458239,JP +392458240,392460287,SG +392460288,392462335,US +392462336,392478719,IE +392478720,392495103,US +392495104,392499199,HK +392499200,392503295,SG +392503296,392507391,US +392507392,392511487,IE +392511488,392515583,NL +392515584,392548351,US +392548352,392560639,AU +392560640,392577023,IE +392577024,392585215,JP +392585216,392611839,US +392611840,392612351,HK +392612352,392617983,US +392617984,392626175,HK +392626176,392658943,US +392658944,392659199,JP +392659200,392659455,AU +392659456,392659583,JP +392659584,392659711,AU +392659712,392659807,US +392659808,392659823,IE +392659824,392659871,SG +392659872,392659903,NL +392659904,392660351,US +392660352,392660383,IE +392660384,392660415,FI +392660416,392660447,AT +392660448,392660607,US +392660608,392660671,GB +392660672,392661887,US +392661888,392661951,JP +392661952,392662143,US +392662144,392662207,IN +392662208,392662399,US +392662400,392662463,KR +392662464,392663039,US +392663040,392663071,FI +392663072,392663103,US +392663104,392663135,IE +392663136,392663167,US +392663168,392663199,NL +392663200,392663359,US +392663360,392663391,IE +392663392,392663487,US +392663488,392663519,IE +392663520,392665855,US +392665856,392665887,HK +392665888,392665983,US +392665984,392666015,HK +392666016,392666047,SG +392666048,392666367,US +392666368,392666431,CA +392666432,392667135,US +392667136,392671231,JP +392671232,392672767,US +392672768,392672895,IE +392672896,392672959,NL +392672960,392673087,SG +392673088,392674559,US +392674560,392674591,SG +392674592,392674815,US +392674816,392674879,SG +392674880,392674911,US +392674912,392674943,SG +392674944,392674975,US +392674976,392675023,IE +392675024,392675039,US +392675040,392675071,SG +392675072,392684479,US +392684480,392684511,IE +392684512,392684543,NL +392684544,392684575,IE +392684576,392684607,NL +392684608,392684639,IE +392684640,392684655,NL +392684656,392684671,US +392684672,392684703,IE +392684704,392684719,NL +392684720,392684735,US +392684736,392684767,IE +392684768,392684783,NL +392684784,392684799,US +392684800,392684831,IE +392684832,392684847,NL +392684848,392684863,US +392684864,392684895,IE +392684896,392684911,NL +392684912,392684927,US +392684928,392684959,IE +392684960,392684975,NL +392684976,392684991,US +392684992,392685023,IE +392685024,392685039,NL +392685040,392685055,US +392685056,392685087,IE +392685088,392685103,NL +392685104,392685119,US +392685120,392685151,IE +392685152,392686607,US +392686608,392686623,AT +392686624,392686639,FI +392686640,392686655,IE +392686656,392686671,US +392686672,392686687,AT +392686688,392686703,FI +392686704,392686719,IE +392686720,392686735,US +392686736,392686751,AT +392686752,392686767,FI +392686768,392686783,IE +392686784,392686799,US +392686800,392686815,AT +392686816,392686831,FI +392686832,392686847,IE +392686848,392686863,US +392686864,392686879,AT +392686880,392686895,FI +392686896,392686911,IE +392686912,392686927,US +392686928,392686943,IE +392686944,392686959,FI +392686960,392686975,AT +392686976,392686991,US +392686992,392687007,IE +392687008,392687023,FI +392687024,392687039,AT +392687040,392687055,US +392687056,392687071,IE +392687072,392687087,FI +392687088,392687103,AT +392687104,392687119,US +392687120,392687135,IE +392687136,392687151,FI +392687152,392687167,AT +392687168,392687183,US +392687184,392687199,IE +392687200,392687215,FI +392687216,392687231,AT +392687232,392687311,US +392687312,392687327,NL +392687328,392687375,US +392687376,392687391,NL +392687392,392687439,US +392687440,392687455,NL +392687456,392687503,US +392687504,392687519,NL +392687520,392687567,US +392687568,392687583,NL +392687584,392687631,US +392687632,392687647,NL +392687648,392687695,US +392687696,392687711,NL +392687712,392687759,US +392687760,392687775,NL +392687776,392687823,US +392687824,392687839,NL +392687840,392687887,US +392687888,392687903,NL +392687904,392689295,US +392689296,392689311,NL +392689312,392689327,AT +392689328,392689343,IE +392689344,392689359,US +392689360,392689375,NL +392689376,392689391,AT +392689392,392689407,IE +392689408,392689423,US +392689424,392689439,NL +392689440,392689455,AT +392689456,392689471,IE +392689472,392689487,US +392689488,392689503,NL +392689504,392689519,AT +392689520,392689535,IE +392689536,392689551,US +392689552,392689567,NL +392689568,392689583,AT +392689584,392689599,IE +392689600,392689615,US +392689616,392689631,NL +392689632,392689647,AT +392689648,392689663,IE +392689664,392689679,US +392689680,392689695,NL +392689696,392689711,AT +392689712,392689727,IE +392689728,392689743,US +392689744,392689759,NL +392689760,392689775,AT +392689776,392689791,IE +392689792,392689807,US +392689808,392689823,NL +392689824,392689839,AT +392689840,392689855,IE +392689856,392689871,US +392689872,392689887,NL +392689888,392689903,AT +392689904,392689919,IE +392689920,392689983,US +392689984,392689999,SG +392690000,392690015,HK +392690016,392690031,KR +392690032,392690047,MY +392690048,392690079,US +392690080,392690095,KR +392690096,392690111,MY +392690112,392690431,US +392690432,392690687,NL +392690688,392690703,SG +392690704,392690719,HK +392690720,392690879,NL +392690880,392690943,US +392690944,392690975,HK +392690976,392691007,SG +392691008,392691023,HK +392691024,392691039,SG +392691040,392691055,KR +392691056,392691071,MY +392691072,392691327,US +392691328,392691343,NL +392691344,392691359,IE +392691360,392691375,FI +392691376,392691391,AT +392691392,392691407,NL +392691408,392691423,IE +392691424,392691439,FI +392691440,392691455,AT +392691456,392765439,US +392765440,392765695,GB +392765696,392814591,US +392814592,392822783,RU +392822784,392849663,US +392849664,392849919,NL +392849920,392850687,US +392850688,392850943,NL +392850944,392851455,US +392851456,392852479,NL +392852480,392852735,US +392852736,392852991,NL +392852992,392853503,US +392853504,392855551,SG +392855552,393007103,US +393007104,393008639,NL +393008640,393008895,US +393008896,393011199,NL +393011200,393019391,US +393019392,393042015,NL +393042016,393042023,US +393042024,393042087,NL +393042088,393042095,US +393042096,393042143,NL +393042144,393042151,US +393042152,393042719,NL +393042720,393042727,US +393042728,393084927,NL +393084928,393150463,US +393150464,393152511,NL +393152512,393153535,US +393153536,393154559,SG +393154560,393158655,NL +393158656,393166847,RU +393166848,393170943,CA +393170944,393175039,NL +393175040,393183231,RU +393183232,393199615,US +393199616,393207807,RU +393207808,393213951,NL +393213952,394264575,US +394264576,394264831,CA +394270720,394271231,NL +394280960,394281215,US +394296320,394296831,NL +394297344,394559743,US +394575872,394576127,CA +394592256,394593279,US +394608640,394608895,CA +394625024,394756351,US +394772480,394772735,CA +394788864,394854399,US +394854400,394854655,CA +394870784,394871039,US +394887168,394887423,US +394903552,394903807,CA +394919936,394920191,US +394936320,394936575,CA +394952704,394953215,CA +394969088,394969343,US +394985472,395018239,US +395018240,395018495,CA +395034624,395034879,US +395051008,395051263,CA +395067392,395067647,US +395083776,395084031,US +395100160,395100415,US +395116544,395116799,US +395132928,395133183,US +395149312,395149567,CA +395165696,395165951,US +395182080,395182335,CA +395198464,395198719,US +395214848,395215103,US +395231232,395231487,US +395247616,395313407,US +395329536,395329791,US +395345920,395346175,CA +395362304,395362559,US +395378688,395493375,US +395493376,395493631,CA +395493632,395576319,US +395591680,395591935,US +395608064,395640831,CA +395657216,395657471,US +395673600,395673855,CA +395689984,395690239,US +395706368,395706623,CA +395722752,395723007,US +395739136,395771903,US +395771904,395788287,CA +395788288,395788543,US +395788544,395837439,CA +395837440,395903231,US +395919360,395919615,CA +395935744,395935999,CA +395952128,395952383,US +395968512,395984895,CA +395984896,395985151,US +395985152,396034047,CA +396034048,396034303,US +396050432,396050687,CA +396066816,396067071,CA +396083200,396083455,US +396099584,396263423,US +396263424,396263679,CA +396279808,396280063,US +396296192,396754943,US +396754944,396755199,CA +396787712,396787967,US +396820480,397082879,US +397115392,397115647,CA +397148160,397345023,US +397377536,397377791,CA +397410304,397410559,CA +397443072,397443327,US +397475840,397541375,US +397541376,397541887,CA +397574144,397574399,US +397606912,397607423,CA +397639680,397639935,US +397672448,397738239,US +397770752,397771007,CA +397803520,397869055,CA +397869056,398065663,US +398065664,398065919,CA +398098432,398098687,US +398131200,398196735,US +398196736,398196991,KY +398229504,398229759,US +398262272,398327807,US +398327808,398328063,PR +398360576,398360831,CA +398393344,398393599,US +398426112,398426367,CA +398458880,398500351,US +398500352,398500863,NL +398500864,398532607,US +398532608,398536703,NL +398536704,398566911,US +398566912,398567423,NL +398567424,398640127,US +398640128,398641151,NL +398641152,398642175,US +398642176,398643199,NL +398643200,398684159,US +398684160,398692351,NL +398692352,398779903,US +398779904,398781439,NL +398781440,398782463,US +398782464,398790655,NL +398790656,398851071,US +398851072,398852095,NL +398852096,398854143,US +398854144,398854399,NL +398854400,398856191,US +398856192,398860287,NL +398860288,398868479,US +398868480,398877183,NL +398877184,398940159,US +398940160,398941183,NL +398941184,398970879,US +398970880,398974975,NL +398974976,399004671,US +399004672,399006207,FR +399006208,399007743,US +399007744,399011839,NL +399011840,399016959,US +399016960,399017983,NL +399017984,399020031,US +399020032,399028223,NL +399028224,399032319,US +399032320,399036415,NL +399036416,399055871,US +399055872,399056639,NL +399056640,399076095,US +399076096,399076863,NL +399076864,399087615,US +399087616,399088639,NL +399088640,399089663,US +399089664,399114239,NL +399114240,399125759,US +399125760,399126015,NL +399126016,399143935,US +399143936,399145471,NL +399145472,399147007,US +399147008,399155199,NL +399155200,399172863,US +399172864,399173119,NL +399173120,399175679,US +399175680,399179775,NL +399179776,399280127,US +399280128,399280639,NL +399280640,399280895,US +399280896,399281151,NL +399281152,399331327,US +399331328,399339519,NL +399339520,399353855,US +399353856,399354879,NL +399354880,399355391,US +399355392,399359999,NL +399360000,399367167,US +399367168,399367679,NL +399367680,399368191,US +399368192,399378943,NL +399378944,399380479,US +399380480,399388671,NL +399388672,399396863,US +399396864,399407103,NL +399407104,399458303,US +399458304,399466495,NL +399466496,399484927,US +399484928,399485183,NL +399485184,399486975,US +399486976,399491071,NL +399491072,399495167,US +399495168,399503359,NL +399503360,399590399,US +399590400,399591935,NL +399591936,399594495,US +399594496,399595519,NL +399595520,399598591,US +399598592,399599615,NL +399599616,399622143,US +399622144,399630335,NL +399630336,399642623,US +399642624,399643647,NL +399643648,399644671,US +399644672,399647231,NL +399647232,399648767,US +399648768,399650815,NL +399650816,399688191,US +399688192,399689727,NL +399689728,399702015,US +399702016,399707135,NL +399707136,399734527,US +399734528,399735807,NL +399735808,399738879,US +399738880,399739135,NL +399739136,399739391,US +399739392,399739647,NL +399739648,399740927,US +399740928,399749119,NL +399749120,399769855,US +399769856,399770111,NL +399770112,399782911,US +399782912,399783167,NL +399783168,399797247,US +399797248,399797759,NL +399797760,399826943,US +399826944,399830015,NL +399830016,399849471,US +399849472,399850495,NL +399850496,399870975,US +399870976,399871999,NL +399872000,399908863,US +399908864,399919615,NL +399919616,399921151,US +399921152,399951359,NL +399951360,399951615,US +399951616,399952895,NL +399952896,399953919,US +399953920,399958015,NL +399958016,399968511,US +399968512,399968767,NL +399968768,399969279,US +399969280,399969535,NL +399969536,399970303,US +399970304,399980031,NL +399980032,399981567,US +399981568,399982079,NL +399982080,399998975,US +399998976,399999487,NL +399999488,400021247,US +400021248,400021503,NL +400021504,400056319,US +400056320,400064511,NL +400064512,400083455,US +400083456,400084991,NL +400084992,400093183,US +400093184,400097279,NL +400097280,400098303,US +400098304,400100351,NL +400100352,400111103,US +400111104,400111615,NL +400111616,400112639,US +400112640,400113663,NL +400113664,400121855,US +400121856,400122367,NL +400122368,400124927,US +400124928,400130047,NL +400130048,400130559,US +400130560,400131071,NL +400131072,400131583,US +400131584,400132095,NL +400132096,400144383,US +400144384,400145407,NL +400145408,400154623,US +400154624,400162815,NL +400162816,400201215,US +400201216,400202751,NL +400202752,400203775,US +400203776,400211967,NL +400211968,400222719,US +400222720,400223231,NL +400223232,400249855,US +400249856,400250879,NL +400250880,400251647,US +400251648,400251903,NL +400251904,400261119,US +400261120,400261887,NL +400261888,400263167,US +400263168,400263679,NL +400263680,400264703,US +400264704,400265215,NL +400265216,400267263,US +400267264,400268287,NL +400268288,400400383,US +400400384,400430079,NL +400430080,400432639,US +400432640,400442367,NL +400442368,400482303,US +400482304,400486399,NL +400486400,400494591,US +400494592,400527359,NL +400527360,400543743,US +400543744,400551935,NL +400551936,400740351,US +400740352,400740607,MX +400740608,400760831,US +400760832,400769023,CA +400769024,400794111,US +400794112,400794239,IT +400794240,400795903,US +400795904,400796159,IT +400796160,400796927,US +400796928,400796991,IT +400796992,400797863,US +400797864,400797871,IT +400797872,400805887,US +400805888,400809983,CA +400809984,400883711,US +400883712,400883759,CA +400883760,400883767,US +400883768,400883799,CA +400883800,400883807,US +400883808,400883823,CA +400883824,400883831,US +400883832,400883855,CA +400883856,400883871,US +400883872,400883887,CA +400883888,400883895,BG +400883896,400883919,CA +400883920,400883927,GB +400883928,400884231,CA +400884232,400884239,US +400884240,400884255,CA +400884256,400884287,US +400884288,400884319,CA +400884320,400884359,US +400884360,400884455,CA +400884456,400884463,US +400884464,400884471,CA +400884472,400884479,US +400884480,400884735,TR +400884736,400884991,GB +400884992,400885007,US +400885008,400885095,CA +400885096,400885103,US +400885104,400885111,GB +400885112,400885119,US +400885120,400885223,CA +400885224,400885227,US +400885228,400885279,CA +400885280,400885311,US +400885312,400885407,CA +400885408,400885439,US +400885440,400885783,CA +400885784,400885791,US +400885792,400885903,CA +400885904,400885919,US +400885920,400886031,CA +400886032,400886047,US +400886048,400886095,CA +400886096,400886111,US +400886112,400886119,CA +400886120,400886135,US +400886136,400886151,CA +400886152,400886159,US +400886160,400886175,CA +400886176,400886183,US +400886184,400886191,CA +400886192,400886199,US +400886200,400886303,CA +400886304,400886335,US +400886336,400886351,CA +400886352,400886383,US +400886384,400886407,CA +400886408,400886415,US +400886416,400886463,CA +400886464,400886527,US +400886528,400886583,CA +400886584,400886591,US +400886592,400886695,CA +400886696,400886703,FI +400886704,400886719,CA +400886720,400886767,US +400886768,400887039,CA +400887040,400887135,US +400887136,400887151,CA +400887152,400887175,US +400887176,400887231,CA +400887232,400887263,US +400887264,400887335,CA +400887336,400887343,US +400887344,400887351,SE +400887352,400887503,CA +400887504,400887543,US +400887544,400887551,CA +400887552,400887807,GB +400887808,400887831,CA +400887832,400887839,US +400887840,400887895,CA +400887896,400887911,US +400887912,400887935,CA +400887936,400887959,US +400887960,400887975,CA +400887976,400887983,US +400887984,400888031,CA +400888032,400888039,US +400888040,400888063,CA +400888064,400888319,US +400888320,400888575,CA +400888576,400888831,GB +400888832,400889359,CA +400889360,400889367,US +400889368,400889439,CA +400889440,400889503,US +400889504,400889511,CA +400889512,400889599,US +400889600,400889647,CA +400889648,400889663,US +400889664,400889711,CA +400889712,400889727,US +400889728,400889775,CA +400889776,400889791,US +400889792,400889855,CA +400889856,400890111,US +400890112,400890143,CA +400890144,400890151,US +400890152,400890159,CA +400890160,400890207,US +400890208,400890263,CA +400890264,400890271,US +400890272,400890335,CA +400890336,400890367,US +400890368,400890383,CA +400890384,400890391,US +400890392,400890399,CA +400890400,400890407,US +400890408,400890527,CA +400890528,400890543,US +400890544,400890591,CA +400890592,400890623,US +400890624,400890639,CA +400890640,400890655,US +400890656,400890783,CA +400890784,400890831,US +400890832,400891263,CA +400891264,400891343,US +400891344,400891383,CA +400891384,400891407,US +400891408,400891415,CA +400891416,400891455,US +400891456,400891471,CA +400891472,400891487,US +400891488,400891551,CA +400891552,400891583,US +400891584,400891615,CA +400891616,400891631,US +400891632,400891695,CA +400891696,400891703,US +400891704,400891791,CA +400891792,400891807,US +400891808,400891887,CA +400891888,400892159,US +400892160,400892479,CA +400892480,400892543,US +400892544,400892567,CA +400892568,400892575,US +400892576,400892591,CA +400892592,400892607,US +400892608,400892671,CA +400892672,400892767,US +400892768,400892863,CA +400892864,400892895,US +400892896,400893055,CA +400893056,400893087,US +400893088,400893095,CA +400893096,400893311,US +400893312,400893695,CA +400893696,400893983,US +400893984,400893991,CA +400893992,400894047,US +400894048,400894079,CA +400894080,400894335,US +400894336,400894463,CA +400894464,400894719,US +400894720,400894783,CA +400894784,400894815,US +400894816,400894903,CA +400894904,400894911,US +400894912,400895231,CA +400895232,400895295,US +400895296,400895359,CA +400895360,400895407,US +400895408,400895455,CA +400895456,400895551,US +400895552,400895615,GB +400895616,400895663,CA +400895664,400895679,US +400895680,400895711,CA +400895712,400896511,US +400896512,400896591,CA +400896592,400896599,US +400896600,400896767,CA +400896768,400896775,US +400896776,400896823,CA +400896824,400896831,US +400896832,400896911,CA +400896912,400896919,US +400896920,400896927,CA +400896928,400896935,US +400896936,400896951,CA +400896952,400896959,US +400896960,400897023,CA +400897024,400897279,US +400897280,400897423,CA +400897424,400897439,US +400897440,400897503,CA +400897504,400897519,US +400897520,400897535,CA +400897536,400897791,US +400897792,400897847,CA +400897848,400897855,US +400897856,400897887,CA +400897888,400897903,US +400897904,400897935,CA +400897936,400897967,US +400897968,400897983,CA +400897984,400898047,US +400898048,400898063,CA +400898064,400898079,US +400898080,400898175,CA +400898176,400898303,US +400898304,400898311,CA +400898312,400898319,US +400898320,400898463,CA +400898464,400898495,US +400898496,400898703,CA +400898704,400898735,US +400898736,400898751,CA +400898752,400898783,US +400898784,400898807,CA +400898808,400898815,US +400898816,400898911,CA +400898912,400898927,US +400898928,400898943,CA +400898944,400899039,US +400899040,400899047,CA +400899048,400899055,US +400899056,400899071,CA +400899072,400899327,US +400899328,400899591,CA +400899592,400899599,US +400899600,400899623,CA +400899624,400899631,US +400899632,400899711,CA +400899712,400899743,US +400899744,400899759,CA +400899760,400899807,US +400899808,400899815,CA +400899816,400899823,US +400899824,400899847,CA +400899848,400899855,US +400899856,400899967,CA +400899968,400899999,US +400900000,400900031,CA +400900032,400900255,US +400900256,400900263,CA +400900264,400900271,US +400900272,400900287,CA +400900288,400900319,US +400900320,400900391,CA +400900392,400900399,US +400900400,400900447,CA +400900448,400900479,US +400900480,400900487,CA +400900488,400900495,US +400900496,400900559,CA +400900560,400900575,US +400900576,400900607,CA +400900608,400901119,US +400901120,400901487,CA +400901488,400901495,US +400901496,400901567,CA +400901568,400901583,US +400901584,400901615,CA +400901616,400901631,US +400901632,400901759,CA +400901760,400901807,US +400901808,400901823,CA +400901824,400901887,US +400901888,400902143,CA +400902144,400902399,US +400902400,400902431,CA +400902432,400902479,US +400902480,400902527,CA +400902528,400902623,US +400902624,400902639,CA +400902640,400902655,US +400902656,400902663,CA +400902664,400902671,US +400902672,400902719,CA +400902720,400902783,US +400902784,400902911,CA +400902912,400902943,US +400902944,400903271,CA +400903272,400903279,US +400903280,400903935,CA +400903936,400904479,US +400904480,400904487,CA +400904488,400904591,US +400904592,400904599,CA +400904600,400904607,US +400904608,400904623,CA +400904624,400904671,US +400904672,400905271,CA +400905272,400905279,US +400905280,400905335,CA +400905336,400905343,US +400905344,400905359,CA +400905360,400905367,US +400905368,400905399,CA +400905400,400905407,US +400905408,400905455,CA +400905456,400905463,FI +400905464,400906111,CA +400906112,400906143,US +400906144,400906175,CA +400906176,400906207,US +400906208,400906215,CA +400906216,400906223,US +400906224,400906231,CA +400906232,400906239,US +400906240,400906255,CA +400906256,400906263,US +400906264,400906399,CA +400906400,400906463,US +400906464,400906471,CA +400906472,400906815,US +400906816,400906831,CA +400906832,400906879,US +400906880,400907263,CA +400907264,400907519,US +400907520,400907775,CA +400907776,400908031,US +400908032,400908287,CA +400908288,400911103,US +400911104,400911359,PA +400911360,400911583,AU +400911584,400911615,US +400911616,400911871,CR +400911872,400912191,US +400912192,400912255,SG +400912256,401114367,US +401114368,401114623,DE +401114624,401115903,US +401115904,401116159,GB +401116160,401120255,US +401120256,401120767,HK +401120768,401125119,US +401125120,401125375,DE +401125376,401129727,US +401129728,401129983,FR +401129984,401130495,US +401130496,401130751,DE +401130752,401137151,US +401137152,401137663,GB +401137664,401142783,US +401142784,401143039,PE +401143040,401143295,BZ +401143296,401143551,NG +401143552,401143807,IM +401143808,401144063,SA +401144064,401144319,VE +401144320,401144575,BS +401144576,401144831,MA +401144832,401145087,OM +401145088,401145343,CO +401145344,401145599,GB +401145600,401145855,YE +401145856,401211391,CA +401211392,401229767,US +401229768,401229775,GB +401229776,401230527,US +401230528,401230559,GB +401230560,401230943,US +401230944,401230951,GB +401230952,401232375,US +401232376,401232383,GB +401232384,401234415,US +401234416,401234423,AU +401234424,401234959,US +401234960,401234967,GB +401234968,401236447,US +401236448,401236479,GB +401236480,401237191,US +401237192,401237199,GB +401237200,401240207,US +401240208,401240215,AU +401240216,401241631,US +401241632,401241663,AU +401241664,401287423,US +401287424,401287679,AU +401287680,401287935,US +401287936,401288191,NL +401288192,401288447,US +401288448,401288703,SE +401288704,401293311,US +401293312,401297407,CA +401297408,401342463,US +401342464,401346559,BB +401346560,401360639,US +401360640,401360895,HK +401360896,401361151,US +401361152,401361663,HK +401361664,401367039,US +401367040,401367295,GB +401367296,401367551,US +401367552,401367807,JP +401367808,401368831,US +401368832,401369343,TW +401369344,401369599,US +401369600,401369855,DE +401369856,401370623,US +401370624,401370879,DE +401370880,401372671,US +401372672,401372927,SG +401372928,401375487,US +401375488,401375511,CA +401375512,401375519,US +401375520,401375535,CA +401375536,401375543,US +401375544,401375743,CA +401375744,401376095,US +401376096,401376103,SE +401376104,401376111,CA +401376112,401376143,US +401376144,401376175,CA +401376176,401376191,US +401376192,401376223,CA +401376224,401376255,US +401376256,401376327,CA +401376328,401376335,US +401376336,401376351,CA +401376352,401376367,US +401376368,401376447,CA +401376448,401376479,US +401376480,401376495,CA +401376496,401376511,US +401376512,401377791,CA +401377792,401378303,US +401378304,401378559,EG +401378560,401378687,US +401378688,401378815,CA +401378816,401379071,US +401379072,401380367,CA +401380368,401380383,US +401380384,401380431,CA +401380432,401380447,US +401380448,401380479,CA +401380480,401380503,US +401380504,401380527,CA +401380528,401380543,US +401380544,401380607,CA +401380608,401380863,US +401380864,401381119,CA +401381120,401381247,US +401381248,401381375,CA +401381376,401381407,US +401381408,401381423,CA +401381424,401381887,US +401381888,401382015,CA +401382016,401382023,US +401382024,401382063,CA +401382064,401382087,US +401382088,401382479,CA +401382480,401382527,US +401382528,401382543,CA +401382544,401382575,US +401382576,401382623,CA +401382624,401382655,US +401382656,401384423,CA +401384424,401384431,US +401384432,401384799,CA +401384800,401384831,US +401384832,401384959,CA +401384960,401385215,US +401385216,401385295,CA +401385296,401385375,US +401385376,401385391,CA +401385392,401385407,US +401385408,401385423,CA +401385424,401385439,US +401385440,401385455,CA +401385456,401385983,US +401385984,401386303,CA +401386304,401386399,US +401386400,401386415,CA +401386416,401386463,US +401386464,401386471,CA +401386472,401386495,US +401386496,401387007,SE +401387008,401387263,US +401387264,401387519,CA +401387520,401387775,US +401387776,401388543,CA +401388544,401388559,US +401388560,401388575,CA +401388576,401388583,US +401388584,401388615,CA +401388616,401388631,US +401388632,401388671,CA +401388672,401388687,US +401388688,401389567,CA +401389568,401390079,US +401390080,401390591,CA +401390592,401390847,US +401390848,401393151,CA +401393152,401393407,US +401393408,401395455,CA +401395456,401395711,US +401395712,401396351,CA +401396352,401396383,US +401396384,401396391,CA +401396392,401396399,US +401396400,401396415,CA +401396416,401396447,US +401396448,401397247,CA +401397248,401397311,US +401397312,401397327,CA +401397328,401397359,US +401397360,401397407,CA +401397408,401397439,US +401397440,401397487,CA +401397488,401397503,US +401397504,401399063,CA +401399064,401399071,US +401399072,401399103,CA +401399104,401399135,US +401399136,401399167,CA +401399168,401399199,US +401399200,401399215,CA +401399216,401399263,US +401399264,401399279,CA +401399280,401399295,US +401399296,401399583,CA +401399584,401399599,US +401399600,401399607,CA +401399608,401399647,US +401399648,401399663,CA +401399664,401399679,US +401399680,401399711,CA +401399712,401399743,US +401399744,401399759,CA +401399760,401399775,US +401399776,401400063,CA +401400064,401400319,US +401400320,401400655,CA +401400656,401400671,US +401400672,401400703,CA +401400704,401400735,US +401400736,401400751,CA +401400752,401400783,US +401400784,401400815,CA +401400816,401400863,US +401400864,401400871,CA +401400872,401400879,NO +401400880,401400895,US +401400896,401400975,CA +401400976,401400991,US +401400992,401401039,CA +401401040,401401055,US +401401056,401401111,CA +401401112,401401135,US +401401136,401401151,CA +401401152,401401215,US +401401216,401401247,CA +401401248,401401279,US +401401280,401401359,CA +401401360,401401375,US +401401376,401401391,CA +401401392,401401439,US +401401440,401401455,CA +401401456,401401463,US +401401464,401401471,CA +401401472,401401503,US +401401504,401401511,CA +401401512,401401519,US +401401520,401401535,CA +401401536,401401567,US +401401568,401401615,CA +401401616,401401623,US +401401624,401401663,CA +401401664,401401679,US +401401680,401401687,CA +401401688,401401695,US +401401696,401401727,CA +401401728,401401855,US +401401856,401401935,CA +401401936,401401983,US +401401984,401402031,CA +401402032,401402047,US +401402048,401402079,CA +401402080,401402095,US +401402096,401402111,CA +401402112,401402207,US +401402208,401402223,CA +401402224,401402239,US +401402240,401402287,CA +401402288,401402303,US +401402304,401402335,CA +401402336,401402343,US +401402344,401402623,CA +401402624,401402879,US +401402880,401403455,CA +401403456,401403503,US +401403504,401403583,CA +401403584,401403615,US +401403616,401403663,CA +401403664,401403679,US +401403680,401403695,CA +401403696,401403743,US +401403744,401403807,CA +401403808,401403839,US +401403840,401403903,CA +401403904,401419775,US +401419776,401420031,CA +401420032,401420287,US +401420288,401420543,CA +401420544,401547263,US +401547264,401555455,CA +401555456,402096639,US +402096640,402096895,FR +402096896,402097407,US +402097408,402097663,KE +402097664,402097919,SY +402097920,402098175,MX +402098176,402098431,BN +402098432,402098687,BH +402098688,402098943,AW +402098944,402099711,US +402099712,402099967,GB +402099968,402105087,US +402105088,402105343,GB +402105344,402107391,US +402107392,402107647,IT +402107648,402108159,US +402108160,402108415,FR +402108416,402108927,US +402108928,402109183,CA +402109184,402110975,US +402110976,402111231,FR +402111232,402111487,US +402111488,402111743,CA +402111744,402113023,US +402113024,402113279,CA +402113280,402113535,FR +402113536,402114047,US +402114048,402114303,HK +402114304,402114559,US +402114560,402114815,CA +402114816,402115583,US +402115584,402115839,FR +402115840,402116607,US +402116608,402116863,CA +402116864,402118143,US +402118144,402118399,FR +402118400,402118911,US +402118912,402119167,CA +402119168,402120959,US +402120960,402121215,FR +402121216,402121727,US +402121728,402121983,CA +402121984,402122751,US +402122752,402123007,SE +402123008,402124287,US +402124288,402124543,TR +402124544,402124799,US +402124800,402125567,AU +402125568,402125823,FR +402125824,402126079,US +402126080,402126335,CA +402126336,402128127,US +402128128,402128383,FR +402128384,402128895,US +402128896,402169855,CA +402169856,402170111,KR +402170112,402170879,US +402170880,402171135,JP +402171136,402173695,US +402173696,402174463,SG +402174464,402175743,US +402175744,402175999,ES +402176000,402176255,AE +402176256,402223103,US +402223104,402227199,CA +402227200,402231295,PR +402235392,402239301,US +402239302,402239302,CA +402239303,402239473,US +402239474,402239474,CA +402239475,402243583,US +402243584,402247679,CA +402247680,402249215,US +402249216,402249727,GB +402249728,402259967,US +402259968,402260031,CA +402260032,402260039,FI +402260040,402260159,CA +402260160,402260167,US +402260168,402260199,CA +402260200,402260231,US +402260232,402260271,CA +402260272,402260279,GB +402260280,402260295,CA +402260296,402260303,US +402260304,402260431,CA +402260432,402260439,US +402260440,402260479,CA +402260480,402260511,US +402260512,402260575,CA +402260576,402260655,US +402260656,402260767,CA +402260768,402260831,US +402260832,402260863,CA +402260864,402260895,US +402260896,402260911,CA +402260912,402260959,US +402260960,402260967,CA +402260968,402260991,US +402260992,402260999,CA +402261000,402261087,US +402261088,402261119,CA +402261120,402261151,US +402261152,402261183,CA +402261184,402261215,US +402261216,402262015,CA +402262016,402262271,US +402262272,402262351,CA +402262352,402262359,US +402262360,402262455,CA +402262456,402262463,FI +402262464,402262519,CA +402262520,402262527,US +402262528,402262591,CA +402262592,402262599,US +402262600,402262663,CA +402262664,402262671,US +402262672,402262695,CA +402262696,402262703,US +402262704,402262751,CA +402262752,402262759,US +402262760,402262847,CA +402262848,402262855,US +402262856,402262927,CA +402262928,402262935,US +402262936,402262943,CA +402262944,402262951,US +402262952,402262975,CA +402262976,402262983,US +402262984,402263295,CA +402263296,402263311,US +402263312,402263335,CA +402263336,402263343,US +402263344,402263359,CA +402263360,402263391,US +402263392,402263423,CA +402263424,402263455,US +402263456,402263471,CA +402263472,402263487,US +402263488,402263807,CA +402263808,402264063,US +402264064,402264079,CA +402264080,402264095,US +402264096,402264111,CA +402264112,402264127,US +402264128,402264175,CA +402264176,402264319,US +402264320,402264447,CA +402264448,402264559,US +402264560,402265471,CA +402265472,402265535,US +402265536,402265551,CA +402265552,402265583,US +402265584,402265615,CA +402265616,402265631,US +402265632,402265663,CA +402265664,402265690,US +402265691,402265691,BD +402265692,402265791,US +402265792,402265879,CA +402265880,402265887,US +402265888,402265919,CA +402265920,402265951,US +402265952,402265967,CA +402265968,402266143,US +402266144,402266175,CA +402266176,402266215,US +402266216,402266287,CA +402266288,402266303,US +402266304,402266311,CA +402266312,402266319,US +402266320,402266335,CA +402266336,402266343,US +402266344,402266351,CA +402266352,402266359,US +402266360,402266367,CA +402266368,402266655,US +402266656,402266671,CA +402266672,402266703,US +402266704,402266727,CA +402266728,402266735,NO +402266736,402266751,US +402266752,402266831,CA +402266832,402266847,US +402266848,402267391,CA +402267392,402267423,US +402267424,402267439,CA +402267440,402267455,US +402267456,402267471,CA +402267472,402267487,US +402267488,402267519,CA +402267520,402267647,US +402267648,402269199,CA +402269200,402269207,US +402269208,402269215,CA +402269216,402269223,US +402269224,402269263,CA +402269264,402269455,US +402269456,402269519,CA +402269520,402269535,US +402269536,402269551,CA +402269552,402269567,US +402269568,402269583,CA +402269584,402269591,US +402269592,402269631,CA +402269632,402269647,US +402269648,402269983,CA +402269984,402270031,US +402270032,402270047,CA +402270048,402270207,US +402270208,402270335,CA +402270336,402270463,US +402270464,402270719,CA +402270720,402270783,US +402270784,402270879,CA +402270880,402270895,US +402270896,402270911,CA +402270912,402270927,US +402270928,402270975,CA +402270976,402271103,US +402271104,402271119,CA +402271120,402271135,US +402271136,402271167,CA +402271168,402271199,US +402271200,402271231,CA +402271232,402271423,US +402271424,402271439,CA +402271440,402271455,US +402271456,402271487,CA +402271488,402271615,US +402271616,402271631,CA +402271632,402271735,US +402271736,402271999,CA +402272000,402272127,US +402272128,402272255,CA +402272256,402272639,US +402272640,402272663,CA +402272664,402272671,US +402272672,402272703,CA +402272704,402272895,US +402272896,402273279,CA +402273280,402273327,US +402273328,402273375,CA +402273376,402273391,US +402273392,402273471,CA +402273472,402273503,US +402273504,402273519,CA +402273520,402273535,US +402273536,402273543,CA +402273544,402273551,FI +402273552,402273599,CA +402273600,402273791,US +402273792,402273927,CA +402273928,402273951,US +402273952,402273983,CA +402273984,402273999,US +402274000,402274015,CA +402274016,402274047,US +402274048,402274239,CA +402274240,402274287,US +402274288,402274295,CA +402274296,402274463,US +402274464,402274479,CA +402274480,402274543,US +402274544,402275351,CA +402275352,402275359,US +402275360,402275407,CA +402275408,402275839,US +402275840,402276095,CA +402276096,402276223,US +402276224,402277375,CA +402277376,402277631,US +402277632,402278015,CA +402278016,402278127,US +402278128,402278399,CA +402278400,402278655,US +402278656,402279959,CA +402279960,402279967,US +402279968,402280063,CA +402280064,402280191,US +402280192,402280207,CA +402280208,402280223,US +402280224,402280319,CA +402280320,402280383,US +402280384,402280399,CA +402280400,402280415,US +402280416,402280959,CA +402280960,402281087,US +402281088,402281199,CA +402281200,402281471,US +402281472,402281603,CA +402281604,402281607,US +402281608,402281687,CA +402281688,402281691,US +402281692,402281727,CA +402281728,402281823,US +402281824,402281991,CA +402281992,402281999,US +402282000,402282111,CA +402282112,402282239,US +402282240,402282815,CA +402282816,402282847,US +402282848,402282879,CA +402282880,402282911,US +402282912,402282927,CA +402282928,402282943,US +402282944,402282959,CA +402282960,402282975,US +402282976,402283263,CA +402283264,402283519,US +402283520,402284039,CA +402284040,402284047,US +402284048,402284159,CA +402284160,402284287,US +402284288,402284799,CA +402284800,402285055,US +402285056,402285327,CA +402285328,402285343,US +402285344,402285407,CA +402285408,402285439,US +402285440,402285567,CA +402285568,402285823,US +402285824,402286335,CA +402286336,402286847,US +402286848,402286863,CA +402286864,402286895,US +402286896,402286911,CA +402286912,402286927,US +402286928,402286935,CA +402286936,402286975,US +402286976,402286983,CA +402286984,402286991,US +402286992,402287207,CA +402287208,402287215,US +402287216,402287263,CA +402287264,402287279,US +402287280,402287343,CA +402287344,402287391,US +402287392,402287423,CA +402287424,402287487,US +402287488,402287551,CA +402287552,402287583,US +402287584,402287743,CA +402287744,402287799,US +402287800,402287823,CA +402287824,402287839,US +402287840,402287887,CA +402287888,402287903,US +402287904,402288007,CA +402288008,402288015,US +402288016,402288031,CA +402288032,402288063,US +402288064,402288135,CA +402288136,402288143,US +402288144,402288159,CA +402288160,402288175,US +402288176,402288223,CA +402288224,402288255,US +402288256,402288271,CA +402288272,402288287,US +402288288,402288319,CA +402288320,402288383,US +402288384,402288391,CA +402288392,402288399,US +402288400,402288431,CA +402288432,402288447,US +402288448,402288511,CA +402288512,402288591,US +402288592,402288607,CA +402288608,402288623,US +402288624,402288631,CA +402288632,402288895,US +402288896,402289119,CA +402289120,402289151,US +402289152,402289407,CA +402289408,402289471,US +402289472,402289535,CA +402289536,402289663,US +402289664,402289679,CA +402289680,402289695,US +402289696,402289711,CA +402289712,402289719,US +402289720,402289743,CA +402289744,402289759,US +402289760,402289775,CA +402289776,402289791,US +402289792,402289983,CA +402289984,402290047,US +402290048,402290239,CA +402290240,402290255,US +402290256,402290271,CA +402290272,402290287,US +402290288,402290399,CA +402290400,402290407,US +402290408,402290479,CA +402290480,402290511,US +402290512,402290639,CA +402290640,402290655,US +402290656,402290687,CA +402290688,402290815,US +402290816,402290823,CA +402290824,402290847,US +402290848,402290879,CA +402290880,402290919,US +402290920,402290975,CA +402290976,402291007,US +402291008,402291041,CA +402291042,402291042,US +402291043,402291087,CA +402291088,402291119,US +402291120,402291135,CA +402291136,402291199,US +402291200,402291231,CA +402291232,402291263,US +402291264,402291327,CA +402291328,402291359,US +402291360,402291391,CA +402291392,402291423,US +402291424,402291711,CA +402291712,402291999,US +402292000,402292143,CA +402292144,402292151,US +402292152,402292351,CA +402292352,402353663,US +402353664,402353919,JP +402353920,402354175,ID +402354176,402354431,DE +402354432,402354943,US +402354944,402355199,ES +402355200,402356223,US +402356224,402356479,SG +402356480,402356735,HK +402356736,402356991,MY +402356992,402357247,US +402357248,402357503,KR +402357504,402357759,JP +402357760,402358015,US +402358016,402358271,ID +402358272,402366463,US +402366464,402374655,CA +402374656,402399231,US +402399232,402403327,CA +402403328,402407935,US +402407936,402408191,TR +402408192,402408447,US +402408448,402408703,TR +402408704,402409470,US +402409471,402409727,TR +402409728,402410239,US +402410240,402410751,TR +402410752,402522111,US +402522112,402522175,CA +402522176,402522183,US +402522184,402522223,CA +402522224,402522231,US +402522232,402522271,CA +402522272,402522287,US +402522288,402522327,CA +402522328,402522335,US +402522336,402522399,CA +402522400,402522407,US +402522408,402522479,CA +402522480,402522559,US +402522560,402522591,CA +402522592,402522607,US +402522608,402522623,CA +402522624,402522655,US +402522656,402522679,CA +402522680,402522911,US +402522912,402522943,CA +402522944,402522975,US +402522976,402522991,CA +402522992,402523007,US +402523008,402523023,CA +402523024,402523039,US +402523040,402523071,CA +402523072,402523103,US +402523104,402523111,CA +402523112,402523135,US +402523136,402523167,CA +402523168,402523391,US +402523392,402523423,CA +402523424,402523447,US +402523448,402523455,CA +402523456,402523487,US +402523488,402523503,CA +402523504,402523647,US +402523648,402523679,CA +402523680,402523711,US +402523712,402523743,CA +402523744,402524159,US +402524160,402524191,CA +402524192,402524255,US +402524256,402524263,CA +402524264,402524271,FI +402524272,402524279,CA +402524280,402524351,US +402524352,402524383,CA +402524384,402524415,US +402524416,402524431,CA +402524432,402524447,US +402524448,402524479,CA +402524480,402524575,US +402524576,402524591,CA +402524592,402524607,US +402524608,402524639,CA +402524640,402524663,US +402524664,402524671,CA +402524672,402524799,US +402524800,402524831,CA +402524832,402524895,US +402524896,402524927,CA +402524928,402524959,US +402524960,402524991,CA +402524992,402525007,US +402525008,402525023,CA +402525024,402525055,US +402525056,402525087,CA +402525088,402525103,US +402525104,402525119,CA +402525120,402525167,US +402525168,402525183,CA +402525184,402525279,US +402525280,402525295,CA +402525296,402525375,US +402525376,402525415,CA +402525416,402525423,NO +402525424,402525439,CA +402525440,402525695,US +402525696,402525951,CA +402525952,402526079,US +402526080,402526207,CA +402526208,402526527,US +402526528,402526655,CA +402526656,402526671,US +402526672,402526687,CA +402526688,402526719,US +402526720,402526975,CA +402526976,402527359,US +402527360,402527391,CA +402527392,402527615,US +402527616,402528255,CA +402528256,402528383,US +402528384,402528767,CA +402528768,402529023,US +402529024,402529279,CA +402529280,402529535,US +402529536,402529791,CA +402529792,402530047,US +402530048,402530303,CA +402530304,402530559,US +402530560,402531583,CA +402531584,402531839,US +402531840,402531935,CA +402531936,402532031,US +402532032,402532159,CA +402532160,402532231,US +402532232,402532247,CA +402532248,402532255,US +402532256,402532351,CA +402532352,402532607,US +402532608,402532887,CA +402532888,402532895,US +402532896,402532967,CA +402532968,402532975,US +402532976,402532983,CA +402532984,402532991,US +402532992,402533015,CA +402533016,402533023,US +402533024,402533039,CA +402533040,402533055,US +402533056,402533111,CA +402533112,402533279,US +402533280,402533295,CA +402533296,402533311,US +402533312,402533327,CA +402533328,402533343,US +402533344,402533631,CA +402533632,402533759,US +402533760,402533791,CA +402533792,402533887,US +402533888,402533903,CA +402533904,402533919,US +402533920,402533935,CA +402533936,402534015,US +402534016,402534079,CA +402534080,402534095,US +402534096,402534111,CA +402534112,402534143,US +402534144,402534175,CA +402534176,402534255,US +402534256,402534271,CA +402534272,402534319,US +402534320,402534399,CA +402534400,402534479,US +402534480,402534487,CA +402534488,402534655,US +402534656,402535935,CA +402535936,402536191,US +402536192,402536255,CA +402536256,402536287,US +402536288,402536303,CA +402536304,402536351,US +402536352,402536367,CA +402536368,402536383,US +402536384,402536391,CA +402536392,402536399,US +402536400,402536455,CA +402536456,402536463,US +402536464,402536479,CA +402536480,402536527,US +402536528,402536543,CA +402536544,402536575,US +402536576,402536639,CA +402536640,402536703,US +402536704,402536959,CA +402536960,402537215,US +402537216,402537279,CA +402537280,402537367,US +402537368,402538511,CA +402538512,402538687,US +402538688,402538727,CA +402538728,402538751,US +402538752,402538759,CA +402538760,402538767,US +402538768,402538815,CA +402538816,402538863,US +402538864,402538879,CA +402538880,402538895,US +402538896,402538911,CA +402538912,402538927,US +402538928,402538959,CA +402538960,402538975,US +402538976,402539071,CA +402539072,402539087,US +402539088,402539135,CA +402539136,402539199,US +402539200,402539327,CA +402539328,402539455,US +402539456,402539775,CA +402539776,402540031,US +402540032,402541119,CA +402541120,402541247,US +402541248,402541311,CA +402541312,402541567,US +402541568,402541823,CA +402541824,402542079,US +402542080,402542335,CA +402542336,402542591,US +402542592,402542847,CA +402542848,402543135,US +402543136,402543167,CA +402543168,402543295,US +402543296,402543303,CA +402543304,402543311,US +402543312,402543327,CA +402543328,402543343,US +402543344,402543367,CA +402543368,402543375,US +402543376,402543391,CA +402543392,402543487,US +402543488,402543551,CA +402543552,402543583,US +402543584,402543607,CA +402543608,402544415,US +402544416,402544423,CA +402544424,402544479,US +402544480,402544495,CA +402544496,402544511,US +402544512,402544551,CA +402544552,402544591,US +402544592,402544607,CA +402544608,402546687,US +402546688,402546943,CA +402546944,402547455,US +402547456,402547967,CA +402547968,402549247,US +402549248,402550271,CA +402550272,402550527,US +402550528,402550783,GB +402550784,402551039,CA +402551040,402552063,US +402552064,402554879,CA +402554880,402591663,US +402591664,402591671,AU +402591672,402593535,US +402593536,402593543,AU +402593544,402594255,US +402594256,402594263,GB +402594264,402594551,US +402594552,402594559,GB +402594560,402595599,US +402595600,402595607,GB +402595608,402595775,US +402595776,402595783,GB +402595784,402597695,US +402597696,402597703,GB +402597704,402603303,US +402603304,402603311,GB +402603312,402606279,US +402606280,402606287,AU +402606288,402608183,US +402608184,402608191,GB +402608192,402611295,US +402611296,402611303,GB +402611304,402613767,US +402613768,402613775,AU +402613776,402614087,US +402614088,402614095,GB +402614096,402614303,US +402614304,402614311,AU +402614312,402615055,US +402615056,402615063,GB +402615064,405012479,US +405012480,405143551,CA +405143552,405180415,US +405180416,405184511,CA +405184512,405364735,US +405364736,405372927,CA +405372928,405422079,PR +405422080,405798911,US +405798912,405831679,CA +405831680,405843967,US +405843968,405848063,CA +405848064,405864447,PR +405864448,405921791,US +405921792,405929983,CA +405929984,405938175,US +405938176,405962751,CA +405962752,405970943,US +405970944,405979135,CA +405979136,405995519,PR +405995520,406003711,CA +406003712,406011903,US +406011904,406028287,BS +406028288,406052863,US +406052864,406061055,CA +406061056,406110207,US +406110208,406142975,CA +406142976,406147071,US +406147072,406159359,CA +406159360,406175743,US +406175744,406183935,JP +406183936,406216703,CA +406216704,406241279,US +406241280,406257663,PR +406257664,406274047,US +406274048,406290431,PR +406290432,406298623,US +406298624,406306815,PR +406306816,406323199,CA +406323200,406388735,US +406388736,406454271,CA +406454272,406847487,US +406847488,407408639,CA +407408640,407613439,US +407613440,407617535,CA +407617536,407633919,US +407633920,408420351,CA +408420352,408502271,US +408502272,408518655,CA +408518656,408535039,US +408535040,408551423,CA +408551424,408719359,US +408719360,408723455,LC +408723456,409255935,US +409255936,409272319,CA +409272320,409337855,US +409337856,409354239,CA +409354240,409509887,US +409509888,409518079,CA +409518080,409550847,US +409550848,409567231,CA +409567232,409731071,US +409731072,409862143,CA +409862144,410124287,US +410124288,410189823,CA +410189824,410648575,US +410648576,410714111,CA +410714112,411156479,US +411156480,411160575,CA +411160576,411164671,US +411164672,411168767,CA +411168768,411303935,US +411303936,411369471,NL +411369472,411435007,TR +411435008,411500543,DE +411500544,411509759,RS +411509760,411510783,XK +411510784,411566079,RS +411566080,411639807,US +411639808,411664383,CA +411664384,411680767,US +411680768,411688959,CA +411688960,411697151,PR +411697152,411746303,CA +411746304,411762687,PR +411762688,411770879,CA +411770880,411779071,US +411779072,411828223,PR +411828224,411885567,US +411885568,411975679,CA +411975680,411979775,US +411979776,411983871,CA +411983872,411988991,US +411988992,411989247,GB +411989248,412057599,US +412057600,412073983,CA +412073984,412221439,US +412221440,412254207,CA +412254208,412483583,US +412483584,412549119,CA +412549120,412614655,US +412647424,412680191,US +412680192,412688383,CA +412688384,412704767,US +412704768,412708863,CA +412708864,412909567,US +412909568,412942335,CA +412942336,412946431,US +412946432,412950527,PR +412950528,412958719,US +412958720,413007871,CA +413007872,413908991,US +413908992,413925375,PR +413925376,415760383,US +415760384,416022527,CA +416022528,416059391,US +416059392,416088063,CA +416088064,416153599,US +416153600,416161791,BS +416161792,416219135,US +416219136,416251903,CA +416251904,416546815,US +416546816,416612351,CA +416612352,416628735,US +416628736,416636927,CA +416636928,416743423,US +416743424,416776191,CA +416776192,417202175,US +417202176,417267711,CA +417267712,417366015,US +417366016,417398783,CA +417398784,417431551,US +417431552,417529855,CA +417529856,417538047,PR +417538048,417726463,US +417726464,417734655,HK +417734656,417775615,US +417775616,417796095,CA +417796096,417800191,US +417800192,417808383,BS +417808384,417820671,CA +417820672,417857535,US +417857536,417923071,AR +417923072,418060287,US +418060288,418062335,HK +418062336,418070527,CA +418070528,418078719,US +418078720,418119679,CA +418119680,418164095,US +418164096,418164223,AS +418164224,418316287,US +418316288,418320383,CA +418320384,418643967,US +418643968,418668543,CA +418668544,418672639,US +418672640,418676735,CA +418676736,418693119,BS +418693120,418709503,CA +418709504,418766847,US +418766848,418770943,CA +418770944,418775039,US +418775040,418799615,CA +418799616,419430399,US +419430400,426470229,GB +426470230,426470230,IT +426470231,436207615,GB +436207616,452984831,US +452984832,452985855,JP +452985856,452986879,MY +452986880,452987143,SG +452987144,452987147,BD +452987148,452987399,SG +452987400,452987403,BD +452987404,452987903,SG +452987904,452988927,VN +452988928,452997119,JP +452997120,453001215,IN +453001216,453009407,AU +453009408,453017599,BD +453017600,453019647,CN +453019648,453023743,IN +453023744,453024767,TW +453024768,453025791,HK +453025792,453027839,CN +453027840,453031935,IN +453031936,453032959,PK +453032960,453033983,CN +453033984,453035007,HK +453035008,453036031,ID +453036032,453037055,IN +453037056,453040127,CN +453040128,453044223,IN +453044224,453044479,HK +453044480,453044735,AT +453044736,453044991,JP +453044992,453045247,IN +453045248,453046271,KR +453046272,453047295,VN +453047296,453050367,IN +453050368,453115903,KR +453115904,453246975,VN +453246976,453509119,IN +453509120,455081983,CN +455081984,455213055,AU +455213056,455245823,NP +455245824,455258111,JP +455258112,455258623,SG +455258624,455258688,KH +455258689,455260671,SG +455260672,455260674,KH +455260675,455260927,SG +455260928,455260960,KH +455260961,455262207,SG +455262208,455270399,JP +455270400,455272447,AU +455272448,455274495,CN +455274496,455278591,IN +455278592,455344127,KR +455344128,456130559,CN +456130560,456261631,IN +456261632,456262655,PH +456262656,456263679,IN +456263680,456264703,AU +456264704,456265727,JP +456265728,456269823,ID +456269824,456271871,HK +456271872,456273919,CN +456273920,456278015,HK +456278016,456286207,AU +456286208,456294399,JP +456294400,456327167,CN +456327168,456523775,TW +456523776,456540159,SG +456540160,456542207,AU +456542208,456544255,CN +456544256,456548351,AU +456548352,456553471,JP +456553472,456554495,ID +456554496,456555519,PK +456555520,456556543,JP +456556544,456560639,AU +456560640,456562687,BD +456562688,456564735,CN +456564736,456572927,IN +456572928,456589311,CN +456589312,456654847,TH +456654848,457179135,IN +457179136,458227711,VN +458227712,459282431,JP +459282432,459284479,TK +459284480,459292671,JP +459292672,459293695,NZ +459293696,459297791,JP +459297792,459299839,IN +459299840,459300863,PK +459300864,459309055,SG +459309056,459325439,KR +459325440,459333631,AU +459333632,459341823,TW +459341824,459407359,IN +459407360,459456511,JP +459456512,459460607,HK +459460608,459472895,CN +459472896,459505663,AU +459505664,459538431,CN +459538432,459539455,AU +459540480,459541503,JP +459541504,459542527,IN +459542528,459543295,HK +459543296,459543551,TW +459543552,459544319,MO +459544320,459544575,SG +459544576,459545599,IN +459545600,459547647,JP +459547648,459548159,AU +459548160,459548415,HK +459548416,459548671,AU +459548672,459550719,TH +459550720,459554815,JP +459554816,459571199,TW +459571200,459735039,KR +459735040,459800575,CN +459800576,459866111,SG +459866112,459931647,TW +459931648,459964415,IN +459964416,459980799,CN +459980800,459983871,AU +459983872,459984895,CN +459984896,459986943,JP +459986944,459988991,PH +459988992,459997183,JP +459997184,460062719,IN +460062720,460128255,PH +460128256,460136447,IN +460136448,460144639,CN +460144640,460152831,PH +460152832,460154879,JP +460154880,460155903,SG +460155904,460156927,AU +460156928,460158975,KH +460158976,460159999,JP +460160000,460161023,CN +460161024,460193791,MO +460193792,460210175,JP +460210176,460214271,HK +460214272,460218367,MY +460218368,460224511,JP +460224512,460226559,NZ +460226560,460259327,PH +460259328,460261375,AU +460261376,460262399,KH +460262400,460262655,US +460262656,460262911,AU +460262912,460263167,NZ +460263168,460263423,GB +460263424,460267519,NP +460267520,460275711,ID +460275712,460277759,AU +460277760,460278783,IN +460278784,460279807,JP +460279808,460283903,AU +460283904,460292095,KR +460292096,460300287,JP +460300288,460312575,HK +460312576,460320767,SG +460320768,460324863,AU +460324864,460341247,CN +460341248,460343295,ID +460343296,460344319,AU +460344320,460345343,ID +460345344,460349439,CN +460349440,460350463,HK +460350464,460351487,AU +460351488,460353535,JP +460353536,460355583,CN +460355584,460356607,IN +460356608,460357631,JP +460357632,460423167,KR +460423168,460439551,CN +460439552,460451839,JP +460451840,460453887,AU +460453888,460454911,JP +460454912,460455935,IN +460455936,460488703,JP +460488704,460505087,MV +460505088,460521471,SG +460521472,460554239,CN +460554240,460587007,KR +460587008,460591103,JP +460591104,460593151,IN +460593152,460595199,JP +460595200,460595711,SG +460595712,460596223,JP +460596224,460597247,AU +460597248,460598271,IN +460598272,460599295,CN +460599296,460601343,IN +460601344,460602367,AF +460602368,460603391,KH +460603392,460718079,KR +460718080,460722175,JP +460722176,460726271,VN +460726272,460734463,IN +460734464,460865535,KR +460865536,460931071,JP +460931072,460933119,AU +460933120,460935167,CN +460935168,460937215,ID +460937216,460938239,AU +460938240,460939263,JP +460939264,460940287,NZ +460940288,460941311,IN +460941312,460942335,AU +460942336,460943359,MY +460943360,460945407,AU +460945408,460947455,CN +460947456,460980223,JP +460980224,460981247,NC +460981248,460983295,JP +460983296,460984319,HK +460984320,460988415,PG +460988416,460994559,JP +460994560,460995071,HK +460995072,460995583,SG +460995584,460996607,IN +460996608,461008895,JP +461008896,461012991,AU +461012992,461045759,KR +461045760,461047807,ID +461047808,461049855,JP +461049856,461050111,TH +461050112,461050367,SG +461050368,461050879,TH +461050880,461051903,NZ +461051904,461054975,AU +461054976,461055999,HK +461056000,461058047,AU +461058048,461062143,HK +461062144,461078527,IN +461078528,461094911,FJ +461094912,461096959,HK +461096960,461099007,TW +461099008,461100031,JP +461100032,461101055,MN +461101056,461102079,IN +461102080,461103103,ID +461103104,461104127,AU +461104128,461104383,CN +461104384,461104639,HK +461104640,461105151,JP +461105152,461106175,CN +461106176,461107199,JP +461107200,461108223,IN +461108224,461109247,BD +461109248,461110271,IN +461110272,461111295,BD +461111296,461127679,IN +461127680,461131775,PH +461131776,461135871,ID +461135872,461143329,AU +461143330,461143331,US +461143332,461144063,AU +461144064,461209599,KR +461209600,461225983,SG +461225984,461227007,WF +461227008,461228031,SG +461228032,461229055,IN +461229056,461230079,JP +461230080,461234175,AU +461234176,461242367,MY +461242368,461258751,KR +461258752,461279231,JP +461279232,461281279,AU +461281280,461282303,PH +461282304,461283327,MY +461283328,461287423,JP +461287424,461294591,HK +461294592,461298687,US +461298688,461301759,HK +461301760,461302527,US +461302528,461307903,HK +461307904,461357055,JP +461357056,461369343,AU +461369344,461373439,JP +461373440,461504511,CN +461504512,461570047,TH +461570048,461572095,ID +461572096,461573119,JP +461573120,461574143,BD +461574144,461578239,JP +461578240,461586431,MY +461586432,461602815,AU +461602816,461619199,TH +461619200,461623295,JP +461623296,461625343,IN +461625344,461626367,AU +461626368,461627391,CN +461627392,461633535,JP +461633536,461635583,ID +461635584,462422015,JP +462422016,462487551,CN +462487552,462553087,TH +462553088,462618623,MY +462618624,462635007,TW +462635008,462651391,JP +462651392,462684159,BD +462684160,463470591,CN +463470592,465043455,KR +465043456,467927039,CN +467927040,468189183,JP +468189184,468713471,KR +468713472,469237759,TW +469237760,469499903,IN +469499904,469565439,NZ +469565440,469598207,AU +469598208,469630975,JP +469630976,469696511,TH +469696512,469712895,PK +469712896,469729279,KR +469729280,469762047,IN +469762048,520093695,US +520093696,520257535,PL +520257536,520290303,IR +520290304,520292351,TR +520292352,520294399,NL +520294400,520296447,RU +520296448,520298495,UA +520298496,520306687,SK +520306688,520308735,GB +520308736,520310783,DK +520310784,520312831,DE +520312832,520314879,MK +520314880,520318975,NL +520318976,520323071,ES +520323072,520325119,CH +520325120,520327167,FR +520327168,520329215,DE +520329216,520330239,SE +520330240,520330751,NL +520330752,520331263,SE +520331264,520339455,IT +520339456,520343551,UA +520343552,520355839,GB +520355840,520421375,ES +520421376,520486911,RO +520486912,520488959,NL +520488960,520489215,UA +520489216,520489471,CH +520489472,520489727,EG +520489728,520489983,GR +520489984,520490020,RU +520490021,520490021,NL +520490022,520490495,RU +520490496,520490751,RO +520490752,520491007,RU +520491008,520491263,LI +520491264,520491391,IS +520491392,520491647,AE +520491648,520491775,IS +520491776,520492031,IE +520492032,520492799,IT +520492800,520493055,LV +520493056,520493311,BE +520493312,520493567,SK +520493568,520493695,DE +520493696,520493823,PT +520493824,520494079,FI +520494080,520494335,FR +520494336,520494591,CZ +520494592,520494847,CH +520494848,520495103,DK +520495104,520495359,SE +520495360,520495615,BE +520495616,520495871,SE +520495872,520496383,DE +520496384,520496639,TR +520496640,520496767,CZ +520496768,520496895,TR +520496896,520497151,ES +520497152,520497407,FR +520497408,520497919,CH +520497920,520498175,FR +520498176,520498431,CH +520498432,520498687,SE +520498688,520499711,FR +520499712,520500223,DK +520500224,520500479,LU +520500480,520500735,DE +520500736,520500991,LT +520500992,520501247,AT +520501248,520501503,LU +520501504,520501759,NO +520501760,520502015,PK +520502016,520502271,SI +520502272,520502527,IE +520502528,520502783,BG +520502784,520503295,GB +520503296,520505343,PL +520505344,520507391,GB +520507392,520511487,TR +520511488,520519679,UA +520519680,520552447,PL +520552448,520554495,NL +520554496,520556543,GB +520556544,520560639,FI +520560640,520562687,TR +520562688,520564735,PL +520564736,520566783,IE +520566784,520568831,CH +520568832,520589311,IR +520589312,520593407,IT +520593408,520595455,AM +520595456,520597503,MK +520597504,520601599,DE +520601600,520609791,SI +520609792,520613887,RU +520613888,520615935,CZ +520615936,520617983,FR +520617984,520683519,RU +520683520,520749055,SY +520749056,520753151,RU +520753152,520757247,LI +520757248,520761343,GB +520761344,520763391,IT +520763392,520765439,CZ +520765440,520781823,RU +520781824,520822783,CH +520822784,520824831,IT +520824832,520826879,US +520826880,520828927,QA +520828928,520830975,NL +520830976,520847359,MK +520847360,520880127,PL +520880128,520882175,AT +520882176,520884223,IT +520884224,520888319,MK +520888320,520896511,DE +520896512,520898303,BE +520898304,520898559,US +520900608,520902655,GB +520902656,520902784,NL +520902785,520912895,GB +520912896,520945663,UA +520945664,520947711,GB +520947712,520949759,SE +520949760,520951807,RU +520951808,520953855,IE +520953856,520962047,RU +520962048,520962310,IE +520962311,520962311,US +520962312,520963327,IE +520963328,520963839,US +520963840,520964354,IE +520964355,520964355,US +520964356,520965119,IE +520965120,520965631,US +520965632,520978431,IE +520978432,520980479,RU +520980480,520982527,IT +520982528,520984575,RU +520984576,520984641,GB +520984642,520984643,US +520984644,520986623,GB +520986624,520988671,PS +520988672,520990719,DE +520990720,520992767,RU +520994816,521006079,BG +521006080,521007103,DE +521007104,521011199,BG +521011200,521013247,FR +521013248,521014015,RO +521014016,521014271,NL +521014272,521018367,RO +521018368,521018623,IT +521018624,521019135,RO +521019136,521019391,GB +521019392,521019647,NL +521019648,521019903,BG +521019904,521022463,RO +521022464,521022719,NL +521022720,521022975,RO +521022976,521023487,DE +521023488,521023743,NL +521023744,521023999,RO +521024000,521024511,BE +521024512,521024767,TR +521024768,521026559,RO +521026560,521027583,ES +521027584,521027839,RO +521027840,521028607,GB +521028608,521028863,RU +521028864,521029119,RO +521029120,521029375,ES +521029376,521029631,US +521029632,521030655,GB +521030656,521031679,PL +521031680,521035775,IR +521035776,521037567,RO +521037568,521037823,TH +521037824,521039871,RO +521039872,521043967,IR +521043968,521048063,IT +521048064,521052159,IR +521052160,521053183,RO +521053184,521054207,SY +521054208,521056255,GR +521056256,521057279,LT +521057280,521058303,MD +521058304,521060351,IT +521060352,521062399,RO +521062400,521064447,ES +521064448,521066495,GR +521066496,521072639,RO +521072640,521074687,GR +521074688,521074943,EG +521074944,521075199,RO +521075200,521075327,FR +521075328,521075455,RO +521075456,521075711,EG +521075712,521076479,RO +521076480,521076735,IN +521076736,521078783,ES +521078784,521080831,CZ +521080832,521082879,RU +521082880,521084927,FR +521084928,521093119,SE +521093120,521095167,DE +521095168,521097215,IT +521097216,521101311,RU +521101312,521103359,IT +521103360,521105407,GB +521105408,521107455,IS +521107456,521109503,FI +521109504,521142271,SI +521142272,521404415,DE +521404416,521535487,NL +521535488,521537535,GB +521539584,521541631,BE +521541632,521543679,DE +521543680,521545727,RU +521545728,521547775,GB +521547776,521551871,AL +521551872,521553919,DE +521553920,521555967,GB +521555968,521558015,NL +521558016,521560063,CY +521560064,521562111,PL +521562112,521563135,GB +521563136,521564159,NL +521564160,521565183,GR +521565184,521565439,GB +521565440,521566207,GR +521566208,521568255,LU +521568256,521601023,PT +521601024,521666559,RU +521666560,521668607,GB +521668608,521670655,CH +521670656,521670911,HU +521670912,521671935,DE +521671936,521672703,HU +521672704,521674751,RU +521674752,521676799,GB +521676800,521678847,ES +521678848,521680895,NL +521680896,521682943,EE +521682944,521683679,SE +521683680,521683695,FI +521683696,521683711,NO +521683712,521687039,SE +521687040,521689087,GB +521689088,521691135,BY +521691136,521693183,DE +521693184,521695231,GB +521695232,521697279,BE +521697280,521699327,ES +521699328,521701375,NO +521701376,521703423,IT +521703424,521705471,DE +521705472,521707519,ES +521707520,521709567,NL +521709568,521711615,DE +521711616,521713663,SK +521713664,521715711,HU +521715712,521717759,LV +521717760,521718783,IQ +521718784,521719807,IR +521719808,521721855,UA +521721856,521724159,GB +521724160,521724415,AU +521724416,521724671,GB +521724672,521724927,NL +521724928,521725951,GB +521725952,521727999,IR +521728000,521732095,FR +521732096,521736191,GB +521736192,521738239,DK +521738240,521740287,RU +521740288,521742335,IT +521742336,521746431,DE +521746432,521748479,GB +521748480,521750527,SE +521750528,521752575,PS +521752576,521754623,IE +521754624,521756671,IR +521756672,521758719,NL +521758720,521760767,IR +521760768,521762815,IL +521762816,521764863,CH +521764864,521766911,IR +521766912,521768959,IQ +521768960,521771007,FI +521771008,521773055,DE +521773056,521775103,GB +521775104,521777151,TR +521777152,521779199,ES +521779200,521783295,GB +521783296,521785343,RU +521785344,521787391,GB +521787392,521789439,NO +521789440,521791487,RU +521791488,521793535,IR +521793536,521795583,RU +521795584,521797631,PL +521797632,521928703,IT +521928704,521929087,RU +521929088,521929151,UA +521929152,521945087,RU +521945088,521953279,GB +521953280,521961471,RU +521961472,521969663,CZ +521969664,521977855,UA +521977856,521986047,RU +521986048,521994239,UA +521994240,522002431,KG +522002432,522010623,IR +522010624,522018815,AE +522018816,522027007,FR +522027008,522059775,RU +522059776,522125311,CZ +522125312,522133503,MD +522133504,522135551,NL +522135552,522137599,IT +522137600,522141695,CH +522141696,522143743,RU +522143744,522145791,CZ +522145792,522147839,DK +522147840,522149887,ES +522149888,522158079,UA +522158080,522166271,BE +522166272,522168319,SE +522168320,522170367,PL +522170368,522174463,YE +522174464,522178559,RU +522178560,522180607,DE +522180608,522182655,KZ +522182656,522190847,CZ +522190848,522715135,FR +522715136,522717183,IR +522717184,522719231,RU +522719232,522721279,UA +522721280,522723327,UZ +522723328,522741759,RU +522741760,522743807,UA +522743808,522747903,RU +522747904,522758143,UA +522758144,522759167,RU +522759168,522764287,UA +522780672,522782719,RU +522782720,522784767,UA +522784768,522786815,BG +522786816,522788863,PL +522788864,522792959,RU +522792960,522795007,UA +522795008,522797055,RU +522797056,522801151,UA +522801152,522803199,PL +522803200,522805247,UA +522805248,522807295,RU +522807296,522811391,UA +522811392,522813439,RU +522813440,522815487,UA +522815488,522819583,PL +522819584,522821631,KG +522821632,522823679,RU +522823680,522827775,PL +522827776,522831871,RU +522831872,522833919,CZ +522833920,522835967,PL +522835968,522838015,UA +522838016,522840063,RU +522840064,522842111,PL +522842112,522846207,RU +522846208,522854399,PL +522854400,522858495,RU +522858496,522866687,UA +522866688,522870783,LV +522870784,522874879,RU +522874880,522878975,UA +522878976,522887167,RO +522887168,522895359,UA +522895360,522911743,RU +522911744,522960895,UA +522960896,522969087,RU +522969088,522977279,UA +522977280,522981375,RU +522981376,522985471,IT +522985472,522989567,CH +522989568,522993663,RU +522993664,522997759,AL +522997760,523001855,RU +523001856,523003903,LT +523003904,523004159,IL +523004160,523004415,AE +523004416,523004671,TR +523004672,523004927,ES +523004928,523005183,BE +523005184,523005951,CH +523005952,523010047,IT +523010048,523014143,IL +523014144,523018239,ES +523018240,523022335,IT +523022336,523024895,RU +523024896,523025407,DE +523025408,523025663,UA +523025664,523025919,CH +523025920,523026175,UA +523026176,523026431,GB +523026432,523030527,TR +523030528,523034623,FR +523034624,523038719,SE +523038720,523042815,RU +523042816,523075583,NO +523075584,523108351,HR +523108352,523173887,HU +523173888,523182079,BA +523182080,523190271,IR +523190272,523192319,FI +523192320,523194367,ES +523194368,523196415,DE +523196416,523198463,AE +523198464,523202559,CZ +523202560,523223039,RU +523223040,523225087,AM +523225088,523227135,SE +523227136,523229183,RO +523229184,523231231,GB +523231232,523239423,DE +523239424,523763711,GB +523763712,524025855,IR +524025856,524287999,PL +524288000,528482303,GB +528482304,528490495,PL +528490496,528498687,RU +528498688,528515071,UA +528515072,528523263,RU +528523264,528531455,UA +528531456,528539647,RU +528539648,528547839,UA +528547840,528564223,RU +528564224,528572415,UA +528572416,528588799,RU +528588800,528596991,UA +528596992,528605183,RU +528605184,528613375,UA +528613376,528637951,RU +528637952,528642047,PL +528642048,528654335,RU +528654336,528656383,SK +528656384,528658431,CZ +528658432,528662527,IR +528662528,528664575,RU +528664576,528666623,BY +528666624,528668671,RU +528668672,528670719,PL +528670720,528674815,SG +528674816,528676863,RO +528676864,528678911,RU +528678912,528680959,MD +528680960,528683007,RO +528683008,528684031,UA +528684032,528684543,NL +528684544,528685823,UA +528685824,528687103,US +528687104,528689151,UA +528689152,528691199,RO +528691200,528695295,PL +528695296,528703487,RU +528703488,528715775,UA +528715776,528719871,RU +528719872,528721919,RO +528721920,528723967,PL +528723968,528726015,ES +528726016,528736255,RU +528736256,528740351,SK +528740352,528742399,IT +528742400,528744447,RU +528744448,528746495,GB +528748544,528752639,CZ +528760832,528762879,PL +528762880,528764927,AM +528764928,528769023,KZ +528769024,528793599,RU +528793600,528795647,RO +528795648,528797695,NL +528797696,528809983,RU +528809984,528812031,PL +528812032,528814079,CZ +528814080,528816127,PL +528816128,528818175,RO +528818176,528834559,UA +528836608,528838655,RU +528838656,528840703,UA +528840704,528842751,RU +528842752,528859135,SG +528859136,528861183,RO +528861184,528863231,RU +528863232,528867327,KZ +528867328,528887807,RU +528887808,528891903,PL +528891904,528900095,UA +528900096,528902143,SK +528902144,528908287,UA +528908288,528926719,RU +528926720,528928767,NL +528928768,528930815,UA +528930816,528932863,CZ +528932864,528941055,RU +528941056,528943103,RO +528943104,528945151,RU +528945152,528949247,PL +528949248,528965631,RU +528965632,528982015,UA +528982016,528986111,PL +528986112,528988159,UA +528988160,528990207,RU +528990208,528994303,PL +528994304,528996351,UZ +528996352,528998399,LT +528998400,529006591,RU +529006592,529268735,NL +529268736,529530879,TR +529530880,529596415,UA +529596416,529661951,TR +529661952,529727487,GE +529727488,529793023,HR +529793024,529793279,CZ +529793280,529798655,RU +529798656,529798911,KZ +529798912,529799167,UA +529799168,529799423,RU +529799424,529799679,UA +529799680,529800191,RU +529800192,529800703,UA +529800704,529800959,CZ +529800960,529806079,RU +529806080,529809407,UA +529809408,529817855,RU +529817856,529818367,CZ +529818368,529826303,RU +529826304,529826815,CZ +529826816,529827327,MD +529827328,529827839,UA +529827840,529828863,RU +529828864,529829887,KZ +529829888,529830911,UZ +529830912,529831935,RU +529831936,529833983,SY +529833984,529838079,RU +529838080,529842175,UA +529842176,529843199,ES +529843200,529843711,RU +529843712,529844223,BY +529844224,529844735,CZ +529844736,529845503,RU +529845504,529846271,UA +529846272,529847295,UZ +529847296,529848319,GB +529848320,529848575,NL +529848576,529848831,CZ +529848832,529849087,UA +529849088,529849599,NL +529849600,529849855,UA +529849856,529850111,CZ +529850112,529850367,RU +529850368,529855487,ES +529855488,529856511,RU +529856512,529856530,BY +529856531,529856531,RU +529856532,529857535,BY +529857536,529858559,UA +529858560,529924095,NL +529924096,529989631,DE +529989632,530055167,NL +530055168,530120703,GR +530120704,530186239,CY +530186240,530251775,IL +530251776,530317311,TR +530317312,530579455,IT +530579456,530648143,NL +530648144,530648151,GB +530648152,530710527,NL +530710528,530841599,RU +530841600,530972671,CH +530972672,531103743,SA +531103744,531169279,IL +531169280,531177471,KZ +531177472,531179519,GB +531179520,531181567,FR +531181568,531183615,NO +531183616,531185663,NL +531185664,531193855,TR +531193856,531195903,IE +531195904,531197951,IT +531197952,531199999,GB +531202048,531234815,CZ +531234816,531236863,IE +531236864,531238911,FR +531238912,531240959,LV +531240960,531243007,SE +531243008,531245055,RU +531245056,531247103,IT +531247104,531251199,IR +531251200,531259391,SK +531261440,531263487,DE +531263488,531265535,RU +531265536,531267583,GB +531267584,531275775,UA +531275776,531276799,US +531276800,531277311,GB +531277312,531277823,US +531277824,531279871,RU +531279872,531281919,CZ +531281920,531283967,RU +531283968,531292159,DE +531292160,531333119,AZ +531333120,531334143,NL +531334144,531334399,US +531334400,531334527,NL +531334528,531335167,US +531335168,531337215,IT +531337216,531339263,CH +531339264,531341311,AL +531341312,531349503,KZ +531349504,531351551,RU +531351552,531355647,NL +531355648,531357695,IR +531357696,531361791,HU +531361792,531367935,CH +531367936,531369983,DE +531369984,531372031,CH +531372032,531372287,DE +531372288,531372543,CH +531372544,531372799,DE +531372800,531373055,CH +531373056,531374144,DE +531374145,531376127,CH +531376128,531377151,DE +531377152,531382271,CH +531382272,531390463,DE +531390464,531392511,CH +531392512,531398655,DE +531398656,531400703,RU +531400704,531402751,UA +531402752,531404799,LU +531404800,531406847,FI +531406848,531408895,FR +531410944,531415039,PL +531415040,531423231,RU +531425280,531427327,FR +531427328,531427503,GB +531427504,531427511,IT +531427512,531427967,GB +531427968,531427983,IT +531427984,531428191,GB +531428192,531428199,IT +531428200,531428263,GB +531428264,531428271,IT +531428272,531428279,GB +531428280,531428287,IT +531428288,531428351,GB +531428352,531428359,IT +531428360,531428487,GB +531428488,531428495,IT +531428496,531428599,GB +531428600,531428607,IT +531428608,531430319,GB +531430320,531430327,IT +531430328,531430407,GB +531430408,531430415,IT +531430416,531430823,GB +531430824,531430831,IT +531430832,531430911,GB +531430912,531430919,IT +531430920,531431423,GB +531431424,531496959,RU +531496960,531628031,PL +531628032,531660799,TR +531660800,531693567,BA +531693568,531695615,RU +531695616,531697663,LT +531697664,531699711,GB +531699712,531701759,CZ +531701760,531703807,NL +531703808,531705855,IT +531705856,531707903,ES +531707904,531709951,GR +531709952,531718143,RU +531718144,531720191,ES +531720192,531722239,RU +531722240,531724287,IT +531724288,531726335,DE +531726336,531759103,TR +531759104,531890175,PL +531890176,532021247,RU +532021248,532152319,PL +532152320,532168703,DE +532168704,532185087,NL +532185088,532201471,IR +532201472,532209663,RU +532209664,532210687,DE +532210688,532212223,RU +532212224,532212479,ME +532212480,532213759,RU +532213760,532214015,GB +532214016,532214783,RU +532214784,532215807,UA +532215808,532221951,RU +532221952,532223999,IT +532224000,532226047,NO +532226048,532234239,GB +532234240,532242431,DK +532242432,532244479,IT +532244480,532246527,DE +532246528,532250623,BA +532250624,532283391,GB +532283392,532291583,TR +532291584,532293631,IE +532293632,532295679,IT +532295680,532297727,KG +532297728,532303871,RU +532303872,532305919,PL +532305920,532307967,NO +532307968,532310015,RU +532310016,532312063,GR +532312064,532312983,JE +532312984,532312991,GB +532312992,532314111,JE +532314112,532316159,DE +532316160,532324351,RU +532324352,532328447,NL +532328448,532330495,PS +532330496,532332543,CZ +532332544,532340735,SK +532340736,532341503,GB +532341504,532341759,DE +532341760,532343967,GB +532343968,532343983,US +532343984,532344319,GB +532344320,532344371,FR +532344372,532344372,GB +532344373,532344575,FR +532344576,532346367,GB +532346368,532346623,NL +532346624,532347391,GB +532347392,532347903,DE +532347904,532348927,GB +532348928,532365311,IE +532365312,532365567,NL +532365568,532365631,AE +532365632,532365695,PK +532365696,532365759,SA +532365760,532365823,TW +532365824,532366079,DE +532366080,532366207,NL +532366208,532366239,AR +532366240,532366271,PA +532366272,532366847,DE +532366848,532367359,GB +532367360,532368383,US +532368384,532368639,NL +532368640,532370431,DE +532370432,532371455,FI +532371456,532372479,DE +532372480,532372735,NL +532372736,532372767,GB +532372768,532372783,CA +532372784,532372799,BR +532372800,532372815,MX +532372816,532372831,PL +532372832,532372863,FR +532372864,532372895,IT +532372896,532372959,SE +532372960,532372991,RU +532372992,532373247,NL +532373248,532373343,DE +532373344,532373503,NL +532373504,532375551,RU +532375552,532377599,IT +532377600,532381695,DE +532381696,532414463,NL +532414464,532676607,IT +532676608,532684799,GE +532684800,532689919,RU +532689920,532690943,GE +532690944,532692991,RU +532692992,532701153,CZ +532701154,532701154,SK +532701155,532701183,CZ +532701184,532703231,GB +532703232,532704511,RU +532704512,532705023,NL +532705024,532705279,RU +532705280,532709375,NL +532709376,532725759,RU +532725760,532729855,SE +532729856,532731903,TR +532731904,532733951,PL +532733952,532735999,SE +532736000,532738047,RU +532738048,532740095,GB +532740096,532742143,KG +532742144,532746239,GB +532746240,532750335,IT +532750336,532751359,SM +532751360,532752383,IT +532752384,532754431,BE +532754432,532756479,FR +532756480,532758527,IT +532758528,532762623,SY +532762624,532766719,UA +532766720,532768767,PL +532768768,532770815,NL +532770816,532772863,IR +532772864,532774911,RU +532774912,532779007,GB +532779008,532783103,IR +532783104,532785151,AT +532785152,532787199,GB +532787200,532789247,BE +532789248,532791295,DK +532791296,532793343,LT +532793344,532795391,SE +532795392,532797439,CH +532797440,532799231,IE +532799232,532799487,GB +532799488,532801535,ES +532801536,532803583,DK +532803584,532805631,FR +532805632,532807679,SE +532807680,533200895,IT +533200896,533233663,TR +533233664,533250047,IE +533250048,533254143,RU +533254144,533256191,NL +533256192,533262335,RU +533262336,533264383,ES +533264384,533266431,RU +533266432,533331967,NL +533331968,533397503,UA +533397504,533463039,KW +533463040,533479423,RU +533479424,533479519,DE +533479520,533479551,FI +533479552,533479743,DE +533479744,533479775,FI +533479776,533480031,DE +533480032,533480063,FI +533480064,533481471,DE +533481472,533483519,NO +533483520,533485567,FR +533485568,533487615,LU +533487616,533491711,RU +533491712,533495807,DE +533495808,533500159,NL +533500160,533500415,JP +533500416,533503999,NL +533504000,533512191,RU +533512192,533528575,ME +533528576,533594111,GB +533594112,533659647,TR +533659648,533667839,US +533667840,533669887,FR +533669888,533670911,GB +533670912,533673983,NL +533673984,533675007,US +533675008,533676031,NL +533676032,533680127,RU +533680128,533682175,TR +533682176,533684223,ES +533684224,533692415,IT +533692416,533725183,RU +533725184,533734393,SE +533734394,533734394,DK +533734395,533807103,SE +533807104,533811199,LT +533811200,533815295,DE +533815296,533815296,TR +533815297,533816319,CY +533816320,533816320,TR +533816321,533817343,CY +533817344,533817344,TR +533817345,533819391,CY +533819392,533823487,DE +533823488,533825535,BE +533825536,533831679,IS +533831680,533835775,DE +533835776,533837823,SE +533837824,533839871,DE +533839872,533856255,IS +533856256,533858303,FR +533858304,533858751,TR +533858752,533858815,AT +533858816,533858895,TR +533858896,533858903,AT +533858904,533859071,TR +533859072,533859087,AT +533859088,533859647,TR +533859648,533859663,AT +533859664,533860351,TR +533862400,533864447,GB +533864448,533889023,TR +533889024,533891071,GB +533891072,533893119,RU +533895168,533897215,TR +533897216,533899263,DE +533899264,533901311,RU +533901312,533905407,IL +533905408,533913599,RU +533913600,533915647,ES +533915648,533919743,GB +533919744,533921791,SE +533921792,533954559,RU +533954560,533962751,BG +533962752,533964799,GB +533964800,533966847,NO +533966848,533968895,DE +533968896,533970943,ES +533970944,533987327,SE +533987328,534118399,DE +534118400,534151167,KW +534151168,534151423,US +534151424,534151679,TR +534151680,534152191,DE +534152192,534152703,IR +534152704,534153471,DE +534153472,534153983,PL +534153984,534154239,ES +534154240,534154495,PL +534154496,534155519,DE +534155520,534155775,PL +534155776,534156287,IR +534156288,534157311,DE +534157312,534157567,TR +534157568,534157823,IT +534157824,534158079,IR +534158080,534158591,ES +534158592,534158847,NL +534158848,534161407,DE +534161408,534163455,IR +534163456,534167551,ES +534167552,534169599,DE +534169600,534170111,IR +534170112,534176767,DE +534176768,534177791,IR +534177792,534181887,DE +534181888,534183935,IR +534183936,534249471,AE +534249472,534253567,GB +534253568,534254607,FR +534254608,534254623,US +534254624,534257663,FR +534257664,534259711,SE +534259712,534261759,CH +534261760,534263807,GB +534263808,534265855,PL +534265856,534282239,CY +534284288,534286335,SE +534286336,534288383,LU +534288384,534290431,IT +534290432,534296575,RU +534296576,534298623,BA +534298624,534306815,HR +534306816,534308863,SE +534308864,534310911,IE +534310912,534315007,IT +534315008,534347775,HR +534347776,534348031,US +534348032,534348287,GB +534348288,534348543,US +534348544,534348831,GB +534348832,534348847,CA +534348848,534349071,GB +534349072,534349079,US +534349080,534355967,GB +534355968,534364159,GR +534364160,534366207,FI +534366208,534368255,IT +534368256,534370303,IR +534370304,534372351,AT +534372352,534374399,KW +534374400,534376447,FR +534376448,534378495,IE +534380544,534511615,AE +534511616,534511871,NL +534511872,534512639,BZ +534512640,534512895,NL +534512896,534513151,SE +534513152,534513215,BS +534513216,534513279,VG +534513280,534513407,NL +534513408,534513663,SE +534513664,534514687,US +534514688,534515199,DE +534515200,534515455,US +534515456,534515711,SE +534515712,534515967,GB +534515968,534516735,US +534516736,534516991,GB +534516992,534517759,US +534517760,534518783,NL +534518784,534518847,ES +534518848,534518911,FI +534518912,534518975,FR +534518976,534519039,AU +534519040,534519167,AL +534519168,534519199,GB +534519200,534519231,VA +534519232,534519263,AQ +534519264,534519295,IT +534519296,534519327,NL +534519328,534519359,PK +534519360,534519391,PE +534519392,534519423,PK +534519424,534519455,FJ +534519456,534519487,BR +534519488,534519519,MX +534519520,534519551,CN +534519552,534519807,NL +534519808,534521855,US +534521856,534522367,DE +534522368,534523391,NL +534523392,534530047,US +534530048,534538239,ES +534538240,534538751,US +534538752,534539007,GB +534539008,534540287,US +534540288,534544383,DE +534544384,534546431,RO +534546432,534548479,DE +534548480,534550527,PL +534550528,534560767,RU +534560768,534573823,GB +534573824,534574079,NL +534574080,534597887,GB +534597888,534598095,US +534598096,534598111,GB +534598112,534598143,US +534598144,534609919,GB +534609920,534642687,ES +534642688,534645759,CZ +534645760,534646271,PL +534646272,534646783,CZ +534646784,534648831,PL +534648832,534650879,CH +534650880,534652927,RU +534652928,534654975,AL +534654976,534663167,GB +534663168,534675455,ES +534675456,534691839,GB +534691840,534693887,FR +534693888,534695935,NL +534695936,534700031,GB +534700032,534708223,JO +534708224,534740991,TR +534740992,534749183,BA +534749184,534753279,NL +534753280,534757375,PS +534757376,534761471,KZ +534761472,534765567,BA +534765568,534767615,UA +534767616,534769663,HU +534769664,534773759,IT +534773760,536870911,DE +536870912,539623423,US +539623424,539627519,AU +539627520,539629455,GB +539629456,539629463,BE +539629464,539629975,GB +539629976,539629983,DE +539629984,539630975,GB +539630976,539630983,PT +539630984,539630991,FI +539630992,539630999,NO +539631000,539631007,CZ +539631008,539631015,DK +539631016,539631023,FR +539631024,539631031,ES +539631032,539631039,IE +539631040,539631047,IT +539631048,539631615,GB +539631616,539635711,NL +539635712,539656191,US +539656192,539660287,IN +539660288,539666431,HK +539666432,539668479,JP +539668480,539668819,AU +539668820,539668823,NZ +539668824,539670527,AU +539670528,539672575,JP +539672576,540725247,US +540725248,540727295,FR +540727296,540729343,DE +540729344,540731391,US +540731392,540733439,GB +540733440,540737535,NL +540737536,540803071,BR +540803072,540811263,US +540811264,540813639,SG +540813640,540813647,US +540813648,540814084,SG +540814085,540814086,TH +540814087,540814327,SG +540814328,540814328,IN +540814329,540817055,SG +540817056,540817071,US +540817072,540819455,SG +540819456,540820959,US +540820960,540820975,CA +540820976,540825347,US +540825348,540825348,CA +540825349,540826383,US +540826384,540826399,CA +540826400,540832575,US +540832576,540832591,CA +540832592,543524607,US +543524608,543524863,CA +543524864,543526143,US +543526144,543526399,CA +543526400,543590143,US +543590144,543590399,CA +543590400,543690751,US +543690752,543691007,AR +543691008,543817727,US +543817728,543818239,DE +543818240,543819263,US +543819264,543820287,DE +543820288,543821311,US +543821312,543821567,DE +543821568,543821823,NL +543821824,543822847,DE +543822848,543823615,US +543823616,543823871,DE +543823872,543825663,US +543825664,543827199,DE +543827200,543830015,US +543830016,543830527,GB +543830528,543830783,NL +543830784,543831551,US +543831552,543832063,GB +543832064,543836159,US +543836160,543836671,FR +543836672,543837183,US +543837184,543837695,FR +543837696,543842559,US +543842560,543843071,GB +543843072,543843583,AT +543843584,543844351,US +543844352,543845119,CH +543845120,543847423,US +543847424,543848447,NO +543848448,543849471,US +543849472,543850751,ES +543850752,543851263,TR +543851264,543855615,US +543855616,543855871,FI +543855872,543856639,IT +543856640,543857663,US +543857664,543857919,NO +543857920,543859967,US +543859968,543860223,NO +543860224,543860479,GR +543860480,543864319,US +543864320,543864575,IE +543864576,543866623,US +543866624,543870975,NL +543870976,543872511,US +543872512,543872767,BE +543872768,543873023,NL +543873024,543875071,US +543875072,543875839,BE +543875840,544250495,US +544250496,544250499,GB +544250500,544250527,US +544250528,544250531,GB +544250532,544436771,US +544436772,544436775,CA +544436776,586153983,US +586153984,586975999,IE +586976000,586976255,US +586976256,587006719,IE +587006720,587006975,GB +587006976,587202559,IE +587202560,597295103,US +597295104,597360639,IN +597360640,597426175,US +597426176,597688319,DE +597688320,598736895,US +598736896,598999039,GB +598999040,599261183,CA +599261184,599608829,US +599608830,599608830,GB +599608831,599609659,US +599609660,599609660,GB +599609661,599615125,US +599615126,599615126,GB +599615127,603979775,US +603979776,603980799,CN +603980800,603981823,NP +603981824,604110847,CN +604110848,604241919,JP +604241920,604504063,CN +604504064,605028351,JP +605028352,606412799,CN +606412800,606413823,HK +606413824,606414335,CN +606414336,606414591,AU +606414592,606420991,CN +606420992,606437375,ID +606437376,606470143,KH +606470144,606601215,KR +606601216,607387647,CN +607387648,607649791,JP +607649792,608174079,CN +608174080,610271231,ID +610271232,618659839,CN +618659840,619708415,TW +619708416,620232703,JP +620232704,620494847,CN +620494848,620625919,NP +620625920,620691455,CN +620691456,620699647,IN +620699648,620700671,PK +620700672,620701311,JP +620701312,620701439,HK +620701440,620701695,JP +620701696,620703743,PK +620703744,620704767,NZ +620704768,620705791,BD +620705792,620706815,HK +620707840,620708863,IN +620708864,620709887,HK +620709888,620711935,AU +620711936,620712959,HK +620712960,620715007,IN +620715008,620716031,AU +620716032,620716287,TW +620716288,620716543,PH +620716544,620716799,BE +620716800,620717055,LU +620717056,620718079,PK +620718080,620720127,IN +620720128,620721151,AU +620721152,620722175,CN +620722176,620723199,JP +620723200,620724223,SG +620724224,620725247,CN +620725248,620726271,IN +620726272,620727295,TH +620727296,620728319,MY +620728320,620729343,KH +620729344,620731391,SG +620731392,620732415,IN +620732416,620733439,JP +620733440,620734463,CN +620734464,620735487,IN +620735488,620737535,CN +620737536,620739583,IN +620739584,620740607,BD +620740608,620741631,HK +620741632,620743679,IN +620743680,620743935,SG +620743936,620744191,AU +620744192,620744703,JP +620744704,620745727,IN +620745728,620746751,PK +620746752,620747775,JP +620747776,620748799,CN +620748800,620751871,IN +620751872,620752895,JP +620752896,620753919,IN +620753920,620754943,PH +620755968,620756991,IN +620756992,620759039,IE +620759040,620763135,NL +620763136,620765183,EE +620765184,620773375,CH +620773376,620775423,ME +620775424,620777471,FR +620777472,620781567,NL +620781568,620783615,GB +620783616,620785663,ES +620785664,620786687,DE +620786688,620787199,IE +620787200,620787711,DE +620787712,620789503,RU +620789504,620789631,KZ +620789632,620789759,RU +620789760,620810239,HR +620810240,620822527,LT +620822528,620845055,RU +620845056,620845191,GB +620845192,620845199,DE +620845200,620845503,GB +620845504,620845567,SI +620845568,620849151,GB +620849152,620851199,NL +620851200,620855295,DE +620855296,620859391,RU +620859392,620861439,NL +620861440,620863487,GB +620863488,620865535,DE +620865536,620867583,FR +620867584,620869631,ES +620869632,620871679,FI +620871680,620873727,DE +620873728,620875775,NL +620875776,620877823,US +620877824,620879871,DE +620879872,620881919,GB +620881920,620888063,FR +620888064,621019135,SE +621019136,621150207,DE +621150208,621215743,GR +621215744,621281279,PL +621281280,621314047,PS +621314048,621318143,BA +621318144,621322239,RU +621322240,621330431,FR +621330432,621346815,PL +621346816,621358079,RU +621358080,621358591,US +621358592,621361151,RU +621361152,621363199,GB +621363200,621381631,RU +621381632,621383679,FR +621383680,621387775,RU +621387776,621389823,NL +621389824,621391871,SK +621391872,621392127,IT +621392128,621392383,CY +621392384,621392639,GE +621392640,621392895,CY +621392896,621393151,IT +621393152,621393919,CY +621393920,621395967,DE +621395968,621398015,CZ +621398016,621400063,TR +621400064,621402111,HU +621402112,621404159,NL +621404160,621408255,IT +621408256,621410303,RU +621410304,621412351,IR +621412352,621414399,NL +621414400,621414655,HK +621414656,621416447,NL +621416448,621416703,GB +621416704,621417471,NL +621417472,621417727,DE +621417728,621418495,NL +621418496,621418752,US +621418753,621428735,NL +621428736,621429759,IR +621429760,621430271,DE +621430272,621430527,ES +621430528,621430783,GB +621430784,621432831,ES +621432832,621436927,IT +621436928,621439999,DE +621440000,621440255,ES +621440256,621440511,IR +621440512,621441279,DE +621441280,621441791,GB +621441792,621442047,DE +621442048,621442303,ES +621442304,621442559,IR +621442560,621444095,DE +621444096,621444351,US +621444352,621445119,DE +621445120,621805567,ES +621805568,621813759,NL +621813760,621821951,SA +621821952,621823999,DE +621824000,621826047,FR +621826048,621828095,RU +621830144,621838335,FI +621838336,621871103,SA +621871104,621903871,BY +621903872,621912063,IQ +621912064,621916159,HU +621916160,621918207,KZ +621918208,621920255,GB +621920256,621924351,JO +621924352,621928447,NL +621928448,621932543,DE +621932544,621934591,UA +621934592,621936639,SE +621936640,621938687,RU +621938688,621939458,GE +621939459,621939459,RU +621939460,621939711,GE +621939712,621969407,RU +621971456,621973503,IM +621973504,621975551,IE +621975552,621977599,RU +621977600,621981695,FR +621981696,621982719,CH +621982720,621983743,US +621983744,621985791,GB +621985792,621987839,US +621987840,621989887,DE +621989888,621992959,SE +621992960,621993983,DK +621993984,621998079,SI +621998080,622000127,ES +622000128,622004223,RU +622004224,622006271,BE +622006272,622008319,FI +622008320,622010367,GB +622010368,622018559,RU +622018560,622020607,SI +622020608,622022655,RU +622022656,622026751,IR +622026752,622028799,IE +622028800,622030847,RS +622030848,622034943,IL +622034944,622067711,UA +622067712,622329855,RU +622329856,622395391,DE +622395392,622405631,UA +622405632,622406655,ES +622406656,622407679,GB +622407680,622409727,DE +622409728,622411775,FR +622411776,622413823,DE +622413824,622415871,FR +622415872,622417919,MK +622417920,622419967,IM +622419968,622428159,UA +622428160,622430207,DE +622430208,622432255,IE +622432256,622434303,IT +622434304,622436351,DE +622436352,622438399,IE +622438400,622439423,IT +622439424,622444543,DE +622444544,622449663,IE +622449664,622451711,ES +622451712,622452735,DE +622452736,622454783,IT +622454784,622456831,DE +622456832,622458879,IT +622458880,622459903,ES +622459904,622460927,IE +622460928,622477311,AZ +622477312,622479359,AL +622479360,622481407,GB +622481408,622483455,AL +622483456,622485503,GB +622485504,622487551,MK +622487552,622489599,GB +622489600,622493695,IL +622493696,622497791,MD +622497792,622499839,IL +622499840,622501887,SE +622501888,622503935,PL +622503936,622505983,AM +622505984,622510079,FR +622510080,622512127,PL +622512128,622514175,DE +622514176,622518271,NO +622518272,622518783,GB +622518784,622519039,DE +622519040,622519281,NL +622519282,622519282,GB +622519283,622519295,NL +622519296,622519551,FR +622519552,622520319,NL +622520320,622522367,RU +622522368,622524415,FR +622524416,622526463,ES +622526464,622591999,IR +622592000,622624767,OM +622624768,622626815,NO +622626816,622630911,DK +622630912,622632959,PL +622632960,622641151,RU +622641152,622657535,PT +622657536,622690303,RU +622690304,622723071,ES +622723072,622854143,PL +622854144,622866431,IR +622866432,622868479,NO +622868480,622870527,FR +622870528,622874623,AZ +622874624,622878719,IT +622880768,622882815,IT +622882816,622886911,IR +622886912,622919679,GR +622919680,622985215,FI +622985216,622993407,TR +622993408,622997503,IT +622997504,623001599,NL +623001600,623003647,ES +623003648,623005695,IT +623005696,623009791,PS +623009792,623017983,MD +623017984,623050751,KW +623050752,623052799,FR +623052800,623054847,XK +623054848,623058943,FI +623058944,623067135,RO +623067136,623069183,AL +623069184,623071231,GB +623071232,623073279,FI +623073280,623075327,GB +623075328,623077375,DK +623077376,623077783,CH +623077784,623077791,NL +623077792,623077807,CH +623077808,623077815,BE +623077816,623077819,SE +623077820,623077827,CH +623077828,623077831,US +623077832,623077833,PT +623077834,623077835,ES +623077836,623077837,CR +623077838,623077839,KN +623077840,623077843,BR +623077844,623077849,HK +623077850,623077851,ZA +623077852,623077855,SG +623077856,623077857,WS +623077858,623077861,NZ +623077862,623083519,CH +623083520,623097737,ES +623097738,623097738,RO +623097739,623116287,ES +623116288,623191332,KW +623191333,623191333,SA +623191334,623378431,KW +623378432,623509503,OM +623509504,623575807,SA +623575808,623576063,RO +623576064,623640575,SA +623640576,623642623,DE +623642624,623644671,NL +623644672,623648767,CZ +623648768,623650815,JO +623650816,623652863,RU +623652864,623654911,FI +623654912,623656959,IR +623656960,623673343,BY +623673344,623689727,NO +623689728,623706111,RU +623706112,623771647,BY +623771648,623773695,GB +623775744,623777791,IE +623777792,623779839,GB +623779840,623783935,IL +623783936,623788031,RU +623788032,623790079,HU +623790080,623792127,ES +623792128,623794175,CZ +623794176,623796223,ES +623796224,623798271,GB +623798272,623800319,GE +623800320,623800575,SE +623800576,623800831,LU +623800832,623801087,BG +623801088,623802367,NL +623802368,623802879,SE +623802880,623804415,NL +623804416,623806463,RU +623806464,623808511,NL +623810560,623812607,ES +623812608,623820799,SE +623820800,623821823,NL +623821824,623822335,US +623822336,623822591,NL +623822592,623822847,DE +623822848,623824895,GB +623824896,623826943,CZ +623826944,623827967,UA +623827968,623828991,BG +623828992,623837183,UA +623837184,623902719,PL +623902720,623919103,CZ +623919104,623935487,NL +623935488,623960063,SY +623960064,623962111,GB +623962112,623964159,HR +623964160,623966207,GB +623966208,623968255,RU +623968256,624001023,DE +624001024,624005119,DK +624005120,624007167,IR +624007168,624009215,DE +624009216,624025599,RU +624025600,624027647,NL +624027648,624029695,FR +624029696,624033791,SE +624033792,624164863,DE +624164864,624427007,UA +624427008,624492543,SA +624492544,624558079,UA +624558080,624562175,SK +624562176,624564223,TR +624564224,624566271,GB +624566272,624568319,RU +624568320,624570367,BE +624570368,624574463,DE +624574464,624590847,NL +624590848,624625848,FR +624625849,624625849,CA +624625850,624640187,FR +624640188,624640191,GB +624640192,624640255,FR +624640256,624640259,GB +624640260,624640527,FR +624640528,624640543,GB +624640544,624640615,FR +624640616,624640619,IE +624640620,624640639,FR +624640640,624640703,ES +624640704,624640751,FR +624640752,624640755,GB +624640756,624640783,FR +624640784,624640787,ES +624640788,624640811,FR +624640812,624640815,GB +624640816,624640823,FR +624640824,624640827,GB +624640828,624640931,FR +624640932,624640935,ES +624640936,624640951,FR +624640952,624640959,PT +624640960,624641187,FR +624641188,624641191,ES +624641192,624641375,FR +624641376,624641407,LT +624641408,624641535,FR +624641536,624641551,IE +624641552,624641855,FR +624641856,624641887,GB +624641888,624641983,FR +624641984,624642015,ES +624642016,624642035,FR +624642036,624642039,ES +624642040,624642079,FR +624642080,624642095,GB +624642096,624642299,FR +624642300,624642303,ES +624642304,624642479,FR +624642480,624642483,GB +624642484,624642815,FR +624642816,624642831,LT +624642832,624643091,FR +624643092,624643095,FI +624643096,624643107,FR +624643108,624643111,GB +624643112,624643211,FR +624643212,624643215,CH +624643216,624643231,FR +624643232,624643235,DE +624643236,624643243,FR +624643244,624643247,ES +624643248,624643263,FR +624643264,624643295,DE +624643296,624643343,FR +624643344,624643351,ES +624643352,624643423,FR +624643424,624643459,ES +624643460,624643811,FR +624643812,624643815,CH +624643816,624644031,FR +624644032,624644063,FI +624644064,624644095,ES +624644096,624644115,FR +624644116,624644119,GB +624644120,624644283,FR +624644284,624644287,ES +624644288,624644303,FR +624644304,624644307,IE +624644308,624644667,FR +624644668,624644671,DK +624644672,624644939,FR +624644940,624644943,ES +624644944,624645183,FR +624645184,624645215,ES +624645216,624645479,FR +624645480,624645487,CZ +624645488,624645583,FR +624645584,624645591,GB +624645592,624645663,FR +624645664,624645695,PT +624645696,624646235,FR +624646236,624646239,IT +624646240,624646255,DE +624646256,624646267,FR +624646268,624646271,PL +624646272,624646347,FR +624646348,624646351,IE +624646352,624646643,FR +624646644,624646647,ES +624646648,624646651,FR +624646652,624646655,PT +624646656,624646671,FR +624646672,624646687,GB +624646688,624646719,FR +624646720,624646735,ES +624646736,624646791,FR +624646792,624646795,IE +624646796,624646911,FR +624646912,624646927,LT +624646928,624647171,FR +624647172,624647183,ES +624647184,624647459,FR +624647460,624647463,GB +624647464,624647647,FR +624647648,624647663,GB +624647664,624647675,FR +624647676,624647679,ES +624647680,624648139,FR +624648140,624648143,ES +624648144,624656727,FR +624656728,624656731,PT +624656732,624656751,FR +624656752,624656755,GB +624656756,624656863,FR +624656864,624656867,CZ +624656868,624656975,FR +624656976,624656979,PT +624656980,624657023,FR +624657024,624657055,FI +624657056,624657327,FR +624657328,624657331,ES +624657332,624657359,FR +624657360,624657363,GB +624657364,624657543,FR +624657544,624657547,ES +624657548,624657615,FR +624657616,624657631,GB +624657632,624657711,FR +624657712,624657715,ES +624657716,624657719,PL +624657720,624657759,FR +624657760,624657767,ES +624657768,624657831,FR +624657832,624657839,ES +624657840,624657883,FR +624657884,624657887,ES +624657888,624657923,FR +624657924,624657927,DE +624657928,624658187,FR +624658188,624658191,ES +624658192,624658271,FR +624658272,624658279,PT +624658280,624658323,FR +624658324,624658327,IE +624658328,624658479,FR +624658480,624658483,DE +624658484,624658487,ES +624658488,624658535,FR +624658536,624658539,ES +624658540,624658559,FR +624658560,624658591,LT +624658592,624658863,FR +624658864,624658879,ES +624658880,624659071,FR +624659072,624659135,ES +624659136,624659599,FR +624659600,624659607,ES +624659608,624659611,FR +624659612,624659615,PL +624659616,624659975,FR +624659976,624659983,LT +624659984,624660103,FR +624660104,624660107,PT +624660108,624660127,FR +624660128,624660131,IE +624660132,624660607,FR +624660608,624660639,IE +624660640,624660703,FR +624660704,624660719,PL +624660720,624660827,FR +624660828,624660839,ES +624660840,624660927,FR +624660928,624660991,GB +624660992,624661175,FR +624661176,624661183,ES +624661184,624661247,FR +624661248,624661251,ES +624661252,624661787,FR +624661788,624661788,RO +624661789,624661863,FR +624661864,624661871,ES +624661872,624661887,FR +624661888,624661903,ES +624661904,624661955,FR +624661956,624661959,PL +624661960,624662315,FR +624662316,624662319,ES +624662320,624662327,FR +624662328,624662331,PT +624662332,624662895,FR +624662896,624662911,ES +624662912,624663407,FR +624663408,624663423,FI +624663424,624663503,FR +624663504,624663519,ES +624663520,624663567,FR +624663568,624663583,ES +624663584,624663687,FR +624663688,624663695,GB +624663696,624663759,FR +624663760,624663767,ES +624663768,624663787,FR +624663788,624663791,ES +624663792,624663863,FR +624663864,624663867,DE +624663868,624663951,FR +624663952,624663955,ES +624663956,624664047,FR +624664048,624664063,IE +624664064,624664067,FR +624664068,624664071,ES +624664072,624664351,FR +624664352,624664367,ES +624664368,624664495,FR +624664496,624664511,ES +624664512,624664527,FR +624664528,624664531,ES +624664532,624664599,FR +624664600,624664603,GB +624664604,624664607,IE +624664608,624664623,FR +624664624,624664627,ES +624664628,624664671,FR +624664672,624664703,IE +624664704,624664767,FR +624664768,624664775,GB +624664776,624665587,FR +624665588,624665591,DE +624665592,624665611,FR +624665612,624665615,ES +624665616,624665663,FR +624665664,624665695,ES +624665696,624665887,FR +624665888,624665903,PL +624665904,624665919,FI +624665920,624665999,FR +624666000,624666015,GB +624666016,624666167,FR +624666168,624666175,GB +624666176,624666219,FR +624666220,624666223,DE +624666224,624666375,FR +624666376,624666379,GB +624666380,624666591,FR +624666592,624666607,ES +624666608,624666691,FR +624666692,624666695,ES +624666696,624666703,DE +624666704,624666791,FR +624666792,624666795,ES +624666796,624666799,GB +624666800,624666975,FR +624666976,624666991,ES +624666992,624667111,FR +624667112,624667115,ES +624667116,624667263,FR +624667264,624667279,IE +624667280,624667711,FR +624667712,624667775,ES +624667776,624667951,FR +624667952,624667967,GB +624667968,624668055,FR +624668056,624668063,IE +624668064,624668079,BE +624668080,624668111,FR +624668112,624668127,GB +624668128,624668207,FR +624668208,624668211,CZ +624668212,624668643,FR +624668644,624668647,IE +624668648,624668667,FR +624668668,624668671,PT +624668672,624668927,FR +624668928,624668931,GB +624668932,624669459,FR +624669460,624669463,FI +624669464,624669711,FR +624669712,624669727,ES +624669728,624669795,FR +624669796,624669799,ES +624669800,624669959,FR +624669960,624669963,ES +624669964,624669987,FR +624669988,624669991,ES +624669992,624670171,FR +624670172,624670175,ES +624670176,624670315,FR +624670316,624670319,ES +624670320,624670659,FR +624670660,624670663,IE +624670664,624670871,FR +624670872,624670875,BE +624670876,624670915,FR +624670916,624670919,ES +624670920,624670935,FR +624670936,624670939,GB +624670940,624671287,FR +624671288,624671291,ES +624671292,624671295,PL +624671296,624671455,FR +624671456,624671471,ES +624671472,624672127,FR +624672128,624672131,GB +624672132,624672547,FR +624672548,624672551,ES +624672552,624672951,FR +624672952,624672959,ES +624672960,624673287,FR +624673288,624673295,DE +624673296,624673451,FR +624673452,624673455,ES +624673456,624673535,FR +624673536,624673791,ES +624673792,624673803,FR +624673804,624673807,NL +624673808,624673903,FR +624673904,624673919,ES +624673920,624673931,FR +624673932,624673935,GB +624673936,624674411,FR +624674412,624674415,ES +624674416,624674447,FR +624674448,624674451,GB +624674452,624674463,FR +624674464,624674479,ES +624674480,624675019,FR +624675020,624675023,DE +624675024,624675027,BE +624675028,624675047,FR +624675048,624675055,ES +624675056,624675647,FR +624675648,624675651,FI +624675652,624675655,ES +624675656,624675683,FR +624675684,624675687,PT +624675688,624675691,FR +624675692,624675695,ES +624675696,624675775,FR +624675776,624675779,ES +624675780,624676003,FR +624676004,624676007,DE +624676008,624676015,FR +624676016,624676019,GB +624676020,624676071,FR +624676072,624676075,ES +624676076,624676087,FR +624676088,624676091,DE +624676092,624676115,FR +624676116,624676119,IT +624676120,624676627,FR +624676628,624676631,GB +624676632,624676715,FR +624676716,624676719,ES +624676720,624677463,FR +624677464,624677467,ES +624677468,624677471,GB +624677472,624677583,FR +624677584,624677587,ES +624677588,624677687,FR +624677688,624677695,GB +624677696,624677769,FR +624677770,624677770,NL +624677771,624677855,FR +624677856,624677887,BE +624677888,624677891,PL +624677892,624678015,FR +624678016,624678023,ES +624678024,624678199,FR +624678200,624678239,ES +624678240,624678263,FR +624678264,624678279,ES +624678280,624678483,FR +624678484,624678487,ES +624678488,624678671,FR +624678672,624678679,ES +624678680,624678847,FR +624678848,624678855,GB +624678856,624678863,FR +624678864,624678879,PT +624678880,624678899,FR +624678900,624678903,GB +624678904,624679199,FR +624679200,624679203,ES +624679204,624679259,FR +624679260,624679263,ES +624679264,624679327,FR +624679328,624679335,ES +624679336,624679843,FR +624679844,624679847,ES +624679848,624680063,FR +624680064,624680191,ES +624680192,624680455,FR +624680456,624680463,ES +624680464,624680747,FR +624680748,624680751,NL +624680752,624680783,FR +624680784,624680799,GB +624680800,624680895,FR +624680896,624680927,ES +624680928,624681023,FR +624681024,624681055,ES +624681056,624681083,FR +624681084,624681087,ES +624681088,624681095,FR +624681096,624681103,NL +624681104,624681535,FR +624681536,624681599,ES +624681600,624681807,FR +624681808,624681823,BE +624681824,624682263,FR +624682264,624682267,ES +624682268,624682319,FR +624682320,624682323,ES +624682324,624682367,FR +624682368,624682383,LT +624682384,624682495,FR +624682496,624682527,ES +624682528,624682623,FR +624682624,624682639,ES +624682640,624683007,FR +624683008,624683011,GB +624683012,624683015,FR +624683016,624683023,ES +624683024,624683031,FR +624683032,624683039,GB +624683040,624683135,FR +624683136,624683151,PL +624683152,624683295,FR +624683296,624683311,DE +624683312,624683339,FR +624683340,624683343,ES +624683344,624683631,FR +624683632,624683647,ES +624683648,624683775,FR +624683776,624683779,DE +624683780,624683783,FR +624683784,624683787,DE +624683788,624683807,FR +624683808,624683811,ES +624683812,624683875,FR +624683876,624683879,PL +624683880,624683975,FR +624683976,624683983,GB +624683984,624684043,FR +624684044,624684047,PT +624684048,624684051,FR +624684052,624684055,ES +624684056,624684063,FR +624684064,624684071,PT +624684072,624684191,FR +624684192,624684195,CH +624684196,624684339,FR +624684340,624684343,NL +624684344,624684479,FR +624684480,624684511,FI +624684512,624684639,FR +624684640,624684655,ES +624684656,624684799,FR +624684800,624684803,DE +624684804,624684907,FR +624684908,624684911,ES +624684912,624685375,FR +624685376,624685439,ES +624685440,624685535,FR +624685536,624685539,PT +624685540,624685683,FR +624685684,624685687,FI +624685688,624685711,FR +624685712,624685715,ES +624685716,624685799,FR +624685800,624685803,ES +624685804,624685815,FR +624685816,624685823,GB +624685824,624685919,FR +624685920,624685923,ES +624685924,624686627,FR +624686628,624686631,ES +624686632,624686667,FR +624686668,624686671,ES +624686672,624686711,FR +624686712,624686719,ES +624686720,624686783,FR +624686784,624686815,ES +624686816,624686895,FR +624686896,624686911,IE +624686912,624687343,FR +624687344,624687346,CZ +624687347,624687347,ES +624687348,624687783,FR +624687784,624687791,PT +624687792,624687827,FR +624687828,624687831,ES +624687832,624687923,FR +624687924,624687927,ES +624687928,624688007,FR +624688008,624688015,ES +624688016,624688031,GB +624688032,624688307,FR +624688308,624688311,ES +624688312,624688315,FR +624688316,624688319,GB +624688320,624688435,FR +624688436,624688439,IE +624688440,624688443,ES +624688444,624688487,FR +624688488,624688491,ES +624688492,624688495,GB +624688496,624688639,FR +624688640,624688643,ES +624688644,624688663,FR +624688664,624688671,ES +624688672,624688691,FR +624688692,624688695,ES +624688696,624688775,FR +624688776,624688779,PL +624688780,624688783,ES +624688784,624688791,FR +624688792,624688795,ES +624688796,624688831,FR +624688832,624688835,ES +624688836,624689063,FR +624689064,624689067,ES +624689068,624689071,FR +624689072,624689075,ES +624689076,624689076,FR +624689077,624689078,BE +624689079,624689151,FR +624689152,624691199,DE +624691200,624693247,FR +624693248,624695295,RU +624695296,624697343,PL +624697344,624699391,IT +624699392,624701439,IL +624701440,624705535,FR +624705536,624721919,GB +624721920,624723967,HR +624723968,624726015,BG +624726016,624728063,PS +624728064,624730111,FR +624730112,624731135,DK +624731136,624732159,US +624732160,624734207,DE +624734208,624736255,RU +624736256,624738303,FR +624738304,624740351,NL +624740352,624742399,DE +624742400,624746495,RU +624746496,624748182,US +624748183,624748183,NL +624748184,624750236,US +624750237,624750237,NL +624750238,624750241,US +624750242,624750242,NL +624750243,624754687,US +624754688,624787455,AZ +624787456,624791551,DE +624791552,624795647,ES +624795648,624799743,SK +624799744,624801791,RU +624801792,624803839,AT +624803840,624812031,DE +624812032,624813055,US +624813056,624814079,IL +624814080,624816127,GB +624816128,624818175,FR +624818176,624820223,ES +624820224,624885759,BE +624885760,624918527,BG +624918528,624951295,IR +624951296,625475583,FR +625475584,625483775,ES +625483776,625485823,IT +625485824,625487871,UA +625487872,625491967,TR +625491968,625500159,RU +625500160,625504255,NL +625504256,625506303,GB +625506304,625508351,PL +625508352,625512447,AZ +625512448,625514495,DE +625514496,625516543,GG +625516544,625518591,BE +625518592,625518847,NL +625518848,625519103,US +625519104,625520135,NL +625520136,625520479,US +625520480,625520495,NL +625520496,625520511,US +625520512,625520639,NL +625520640,625522687,RU +625522688,625523455,SE +625523456,625523711,NO +625523712,625523967,SE +625523968,625524223,GR +625524224,625524735,SE +625524736,625541119,FR +625541120,625606655,UA +625606656,625616127,NL +625616128,625616383,GB +625616384,625672191,NL +625672192,625674239,RU +625674240,625676287,TR +625676288,625680383,MD +625680384,625688575,MT +625688576,625704959,MD +625704960,625707007,GE +625707008,625709055,AT +625709056,625711103,JO +625711104,625713151,NL +625713152,625721343,DK +625721344,625725439,RU +625725440,625727487,PS +625727488,625729535,UA +625729536,625731583,NL +625731584,625733631,GB +625733632,625735679,IR +625735680,625737727,RU +625737728,625770495,HU +625770496,625786879,RU +625786880,625795071,PS +625795072,625803263,SA +625803264,625811455,TR +625811456,625815551,FR +625815552,625817599,IQ +625817600,625817911,NL +625817912,625817915,GB +625817916,625819647,NL +625819648,625823743,IQ +625823744,625827839,BG +625827840,625829887,IT +625829888,625831935,RU +625831936,625836031,IT +625836032,625838079,RU +625838080,625840127,IT +625842176,625844223,PL +625844224,625846271,IT +625846272,625848319,RS +625848320,625854463,GB +625854464,625856511,DE +625856512,625860607,IT +625860608,625868799,CZ +625868800,625999871,RU +625999872,627048447,DE +627048448,627130367,DK +627130368,627142655,FR +627142656,627145727,RO +627145728,627146751,ES +627146752,627179519,NL +627179520,627212287,IR +627212288,627216383,FI +627216384,627218431,GB +627218432,627220479,TJ +627220480,627228671,RU +627228672,627230719,GR +627230720,627232767,IR +627232768,627236863,PL +627236864,627238911,IQ +627240192,627240447,US +627240704,627240959,US +627240960,627245055,RU +627245056,627277823,KZ +627277824,627294207,SA +627294208,627296255,GR +627296256,627298303,DE +627298304,627300351,IT +627300352,627302399,RU +627302400,627572735,IT +627572736,627834879,SA +627834880,627965951,PL +627965952,628006911,RU +628006912,628015103,GE +628015104,628017151,FR +628017152,628019199,CH +628019200,628021247,UZ +628021248,628023039,IE +628023040,628023295,GB +628023296,628029439,RU +628029440,628031487,GB +628031488,628064255,MM +628064256,628080639,PK +628080640,628097023,BD +628097024,628230143,RU +628230144,628232191,IT +628232192,628236287,RU +628236288,628244479,DE +628244480,628246527,FR +628246528,628248575,MT +628248576,628250367,FI +628250368,628250623,LV +628250624,628252671,NL +628252672,628260863,DE +628260864,628277247,AZ +628277248,628293631,IR +628293632,628359167,UA +628359168,628621311,IT +628621312,628654079,DE +628654080,628662271,RO +628662272,628670463,DE +628670464,628685823,RO +628685824,628686335,FO +628686336,628686847,RO +628686848,628752383,SA +628752384,628785151,RU +628785152,628787199,CH +628787200,628789247,TR +628789248,628791295,SE +628791296,628793343,IL +628793344,628801535,ME +628801536,628803583,GB +628803584,628805631,FR +628805632,628807679,GB +628809728,628813823,TR +628813824,628815871,DK +628815872,628817919,GB +628817920,628834303,TR +628834304,628842495,JO +628842496,628844543,TR +628844544,628846847,DE +628846848,628847359,GB +628847360,628847615,FR +628847616,628848639,GB +628848640,628850687,DE +628850688,628852723,NO +628852724,628852727,SE +628852728,628852735,NO +628852736,628867071,SE +628867072,628869119,IR +628869120,628871167,PL +628871168,628873215,US +628873216,628875263,RU +628875264,628877311,SE +628877312,628879359,BE +628879360,628881407,IT +628881408,628883455,GB +628883456,629082095,SA +629082096,629082103,US +629082104,629145599,SA +629145600,629178367,PL +629178368,629180415,GB +629180416,629182463,IT +629182464,629184511,NL +629184512,629188607,PL +629188608,629190655,ES +629190656,629192703,CH +629192704,629194751,GB +629194752,629196799,IE +629196800,629198847,AZ +629198848,629202943,DK +629202944,629207039,RO +629207040,629276671,IR +629276672,629293055,PL +629293056,629309439,TR +629309440,629313535,DE +629313536,629315583,ES +629315584,629317631,IT +629317632,629325823,FI +629325824,629327359,RU +629327360,629327615,GB +629327616,629327871,RU +629327872,629329919,IR +629329920,629331967,ES +629331968,629334015,IT +629334016,629334271,NL +629334272,629338111,GB +629338112,629340159,BG +629340160,629342207,GB +629342208,629374975,BH +629374976,629387263,PL +629387264,629389311,DE +629389312,629391359,CH +629391360,629399551,RU +629399552,629401599,GE +629401600,629405695,DE +629405696,629407743,TR +629407744,629669887,ES +629669888,629735423,FI +629735424,629800959,IR +629800960,629866495,DE +629866496,629874687,NL +629874688,629879807,RU +629879808,629880063,DE +629880064,629882879,RU +629882880,629883135,GB +629883136,629883391,AU +629883904,629884159,AU +629884160,629884415,US +629884416,629884671,CL +629884672,629884927,AU +629884928,629886975,PL +629886976,629889023,RU +629889024,629891071,IT +629891072,629895167,UA +629895168,629897215,AL +629897216,629899263,ES +629901312,629903359,NL +629903360,629905407,PL +629905408,629907455,SE +629907456,629915647,UA +629915648,629970943,RU +629970944,629971071,ID +629971072,629971199,GB +629971200,629971327,BR +629971328,629971455,DE +629971456,629971583,ES +629971584,629971711,IT +629971712,629971839,MX +629971840,629971967,FR +629971968,629972095,ID +629972096,629972223,GB +629972224,629972351,BR +629972352,629972479,DE +629972480,629972607,ES +629972608,629972735,IT +629972736,629972863,MX +629972864,629972991,FR +629972992,629983231,RU +629983232,629985279,FR +629985280,629987327,TR +629989376,629991423,FR +629991424,629993471,NL +629993472,629997567,JO +629997568,630063103,SA +630063104,630073479,IL +630073480,630073487,FR +630073488,630128639,IL +630128640,630130687,BE +630130688,630136831,RU +630136832,630138879,NL +630138880,630140927,DE +630145024,630147071,EE +630147072,630149119,HU +630149120,630151167,NL +630151168,630153215,UA +630153216,630157311,RU +630157312,630159359,CZ +630159360,630161407,ES +630163456,630165503,GB +630165504,630167551,IR +630167552,630169599,GE +630169600,630173695,RO +630173696,630177791,AT +630177792,630194175,BG +630194176,630456319,RU +630456320,630489087,IR +630489088,630491135,NL +630491136,630493183,DE +630493184,630495231,NO +630495232,630497279,DE +630497280,630499327,NL +630499328,630501375,LV +630501376,630503423,BE +630503424,630503679,NL +630503680,630504447,IT +630504448,630509567,NL +630509568,630511615,TR +630511616,630513663,GB +630513664,630515711,IT +630515712,630517759,DE +630517760,630519807,GB +630521856,630587391,CY +630587392,630718463,KZ +630718464,630720511,JO +630720512,630722559,NL +630722560,630726655,PL +630726656,630732799,GB +630732800,630734079,SE +630734080,630734847,US +630734848,630736895,IS +630736896,630738943,TR +630738944,630743039,ES +630743040,630751231,SK +630751232,630759423,ES +630759424,630767615,IR +630767616,630783999,GB +630784000,630802431,RU +630802432,630804479,GB +630804480,630806527,CH +630806528,630808575,ES +630808576,630810623,NL +630810624,630816767,CH +630816768,630817791,IR +630817792,630818047,GB +630818048,630818303,RO +630818304,630818431,CN +630818432,630818559,KR +630818560,630819327,RO +630819328,630819839,SE +630819840,630820095,GR +630820096,630820351,RO +630820352,630820607,ES +630820608,630820863,US +630820864,630822911,GR +630822912,630824959,RO +630824960,630827007,GR +630827008,630828031,NL +630828032,630828543,SE +630828544,630829055,BG +630829056,630833151,IR +630833152,630849535,NL +630849536,630980607,TR +630980608,630981631,IR +630981632,630982143,RO +630982144,630982271,CN +630982272,630982399,KR +630982400,630982655,RO +630982656,630988799,IR +630988800,630990335,RO +630990336,630990847,JE +630990848,630992895,RO +630992896,630996991,IR +630996992,630997503,GB +630997504,630997759,FR +630997760,630998271,RO +630998272,630998783,MD +630998784,630999039,RO +630999040,630999295,CN +630999296,630999551,RO +630999552,630999679,GB +630999680,631000063,RO +631000064,631001087,ES +631001088,631005183,DE +631005184,631006207,IT +631006208,631007231,IR +631007232,631007487,KR +631007488,631007743,RO +631007744,631007871,GB +631007872,631008255,RO +631008256,631009279,ES +631009280,631018495,IR +631018496,631019519,IT +631019520,631023615,IR +631023616,631024639,IT +631024640,631024895,RO +631024896,631025151,GB +631025152,631025663,RO +631025664,631026687,IR +631026688,631027711,RO +631027712,631027967,KR +631027968,631028223,RO +631028224,631028351,GB +631028352,631028735,RO +631028736,631029759,ES +631029760,631033855,SE +631033856,631034879,IT +631034880,631035903,IR +631035904,631036159,JP +631036160,631036415,RO +631036416,631036543,GB +631036544,631037951,RO +631037952,631038207,BG +631038208,631038975,RO +631038976,631039999,NL +631040000,631043071,IR +631043072,631043583,RO +631043584,631043839,TR +631043840,631044095,NL +631044096,631045119,IR +631045120,631046143,NL +631046144,631048191,DK +631048192,631050239,FR +631050240,631054335,RU +631054336,631056383,GB +631056384,631058431,DE +631058432,631060479,GB +631060480,631062527,FR +631062528,631078911,EE +631078912,631080959,FR +631080960,631083007,BG +631083008,631085055,LT +631085056,631087103,LU +631087104,631095295,BG +631095296,631097343,CZ +631097344,631099391,PL +631099392,631103487,AM +631103488,631105535,FR +631105536,631107583,RU +631107584,631109631,GB +631109632,631111679,DE +631111680,631177215,ES +631177216,631242751,IT +631242752,631408581,FR +631408582,631408582,RE +631408583,632291327,FR +632291328,632815615,IT +632815616,632946687,BE +632946688,632954879,AT +632954880,632963071,QA +632963072,632979455,AM +632979456,633012223,IT +633012224,633059983,FR +633059984,633059987,GB +633059988,633060359,FR +633060360,633060367,ES +633060368,633061247,FR +633061248,633061311,NL +633061312,633062463,FR +633062464,633062527,BE +633062528,633063679,FR +633063680,633063935,PL +633063936,633064191,FR +633064192,633064447,GB +633064448,633064471,FR +633064472,633064475,DE +633064476,633065315,FR +633065316,633065323,FI +633065324,633065471,FR +633065472,633065727,GB +633065728,633065983,DE +633065984,633066239,FR +633066240,633066751,ES +633066752,633067007,IT +633067008,633067455,FR +633067456,633067471,ES +633067472,633068695,FR +633068696,633068703,ES +633068704,633068735,FR +633068736,633068799,BE +633068800,633069251,FR +633069252,633069255,ES +633069256,633069263,FR +633069264,633069271,ES +633069272,633074760,FR +633074761,633074761,ES +633074762,633077759,FR +633077760,633094143,RU +633094144,633098239,NL +633098240,633100287,HU +633100288,633102335,FR +633102336,633110527,GB +633110528,633143295,CZ +633143296,633208831,PT +633208832,633241599,RU +633241600,633274367,PL +633274368,633290751,HU +633290752,633298943,IR +633298944,633307135,GB +633307136,633339903,NO +633339904,633602047,RU +633602048,633864191,SE +633864192,633880575,NO +633880576,633888767,RU +633888768,633890815,DE +633890816,633892863,FR +633892864,633894911,GB +633894912,633896959,RU +633896960,633929727,OM +633929728,633997311,DE +633997312,633999359,RU +633999360,634001407,IT +634001408,634003455,NO +634003456,634007551,PL +634007552,634009599,TR +634009600,634011647,NO +634011648,634028031,JO +634028032,634060799,IR +634060800,634068991,UA +634068992,634069503,DE +634069504,634071039,LV +634071040,634073087,GB +634073088,634075135,IE +634075136,634077183,NL +634077184,634093567,BA +634093568,634109951,GB +634109952,634111999,IE +634112000,634114047,RU +634114048,634114303,FR +634114304,634114559,SE +634114560,634114815,FR +634114816,634115071,FI +634115072,634115839,SE +634115840,634116095,IT +634116096,634118143,NL +634118144,634122239,IT +634122240,634124287,RU +634124288,634126335,CH +634126336,634191871,RU +634191872,634193919,TR +634193920,634195967,CZ +634195968,634198015,RU +634198016,634200063,BA +634200064,634202111,IS +634202112,634204159,FR +634204160,634206207,RU +634206208,634208255,GB +634208256,634216447,RU +634216448,634220543,HR +634220544,634222591,IQ +634222592,634224639,DK +634224640,634388479,IT +634388480,634396671,SE +634396672,634398719,BA +634398720,634400767,KZ +634400768,634402815,FR +634402816,634404863,BE +634404864,634408959,RU +634408960,634411007,GB +634411008,634413055,BE +634413056,634415103,RU +634415104,634417151,DE +634417152,634419199,NL +634419200,634421247,RU +634421248,634454015,QA +634454016,634486783,DE +634486784,634494975,PL +634494976,634497023,LV +634497024,634499071,BG +634499072,634503167,CH +634503168,634505215,GB +634505216,634507263,IT +634507264,634511359,GB +634511360,634517503,RU +634517504,634519551,LB +634519552,634639103,QA +634639104,634639359,AE +634639360,634650623,QA +634650624,634912767,BY +634912768,635043839,SA +635043840,635076607,ES +635076608,635092991,KG +635092992,635097087,CY +635097088,635101183,PS +635101184,635103231,AE +635103232,635105279,HU +635105280,635107327,NL +635107328,635109375,DE +635109376,635174911,FI +635174912,635183103,GB +635183104,635185151,NL +635185152,635187199,IT +635187200,635191295,FR +635191296,635195391,RS +635195392,635197439,RU +635197440,635199775,GB +635199776,635199783,IT +635199784,635200167,GB +635200168,635200175,IT +635200176,635200335,GB +635200336,635200343,IT +635200344,635200631,GB +635200632,635200639,IT +635200640,635200727,GB +635200728,635200735,IT +635200736,635200847,GB +635200848,635200855,IT +635200856,635201159,GB +635201160,635201167,IT +635201168,635201295,GB +635201296,635201303,IT +635201304,635203583,GB +635203584,635207679,JO +635207680,635211775,HU +635211776,635213823,NL +635213824,635217919,RU +635217920,635219967,NL +635219968,635224063,RU +635224064,635240447,HU +635240448,635256831,IR +635273216,635281407,UA +635281408,635283455,RO +635283456,635283967,DE +635283968,635284479,RO +635284480,635285503,US +635285504,635287551,ME +635287552,635289599,RU +635289600,635291647,DE +635291648,635293695,RU +635293696,635295743,HU +635295744,635297791,GB +635297792,635299839,SE +635299840,635301887,ES +635301888,635305983,CZ +635305984,635437055,ES +635437056,635502591,SA +635502592,635568127,PL +635568128,635699199,IT +635699200,635715583,PL +635715584,635717631,KZ +635717632,635719679,NL +635719680,635723775,RU +635723776,635725823,ES +635725824,635727871,US +635727872,635729919,RU +635729920,635731967,DE +635731968,635732479,SC +635732480,635732735,DE +635732736,635732991,IR +635732992,635733209,DE +635733210,635733210,PT +635733211,635733247,DE +635733248,635733503,IR +635733504,635733759,DE +635733760,635735039,IR +635735040,635748351,DE +635748352,635764735,IE +635764736,635830271,UA +635830272,635842559,DE +635842560,635846655,GB +635846656,635854847,ES +635854848,635856895,NL +635856896,635858943,TR +635858944,635860479,RU +635860480,635860991,NL +635860992,635863039,BE +635863040,635863551,GB +635863552,635864063,NL +635864064,635864319,IQ +635864320,635864575,RU +635864576,635864831,LB +635864832,635865087,ES +635865088,635865855,RU +635865856,635866111,US +635866112,635871487,RU +635871488,635871743,UA +635871744,635873279,RU +635873280,635873791,LU +635873792,635874303,SE +635874304,635874815,SG +635874816,635875327,FR +635875328,635875839,IT +635875840,635876351,CH +635876352,635876863,DK +635876864,635877119,MY +635877120,635877375,BN +635877376,635877631,NO +635877632,635877887,JP +635877888,635878143,ES +635878144,635878399,BO +635878400,635878655,RU +635878656,635878911,AM +635878912,635879167,FI +635879168,635879423,AT +635879424,635882495,RU +635882496,635882751,GE +635882752,635891967,RU +635891968,635892223,GB +635892224,635894527,RU +635894528,635894783,KZ +635894784,635895807,RU +635895808,635961343,KW +635961344,635994111,GE +635994112,636026879,RU +636026880,636043263,MD +636043264,636047359,SE +636047360,636049407,RU +636049408,636051455,FI +636051456,636055551,PL +636055552,636057599,RU +636057600,636059647,CH +636059648,636092415,GE +636092416,636157951,HU +636157952,636159999,AT +636160000,636162047,NL +636162048,636166143,IR +636166144,636168191,ES +636168192,636170239,GB +636170240,636170495,PL +636170496,636170751,IS +636170752,636171263,CH +636171264,636171519,CL +636171520,636171775,ES +636171776,636172031,GB +636172032,636172287,IM +636172288,636174335,AT +636174336,636176383,RU +636176384,636178431,TR +636178432,636180479,NL +636180480,636182527,FR +636182528,636185087,CZ +636185088,636185343,SE +636185344,636186111,US +636186112,636186367,FR +636186368,636186623,ES +636186624,636188671,NL +636188672,636190719,GB +636190720,636223487,RU +636223488,636485631,IQ +636485632,636747775,SA +636747776,636753407,FR +636753408,636753919,US +636753920,636753938,NL +636753939,636753941,DE +636753942,636754072,NL +636754073,636754075,DE +636754076,636754175,NL +636754176,636764159,FR +636764160,636780543,GB +636780544,636813311,HR +636813312,636878847,AE +636878848,636944383,MD +636944384,636952575,SE +636952576,636956671,NL +636956672,636958719,IT +636958720,636960767,PL +636960768,636965631,DE +636965632,636965887,BE +636965888,636966655,DE +636966656,636966911,IT +636966912,636967167,DE +636967168,636967935,FR +636967936,636968455,DE +636968456,636968456,BE +636968457,636968959,DE +636968960,636974079,TR +636974080,636974591,GB +636974592,636975103,TR +636975104,636977151,ES +636977152,637140991,PL +637140992,637206527,SE +637206528,637239295,NL +637239296,637272063,RO +637272064,637272831,RU +637272832,637275135,DE +637275136,637275391,RU +637275392,637276159,NL +637276160,637278207,RU +637278208,637288447,GB +637288448,637296639,AM +637296640,637298687,ES +637298688,637300735,DE +637300736,637302783,NO +637302784,637304831,NL +637304832,637313023,CH +637317120,637319167,ES +637319168,637321215,AT +637321216,637323263,GB +637323264,637325311,FR +637325312,637325823,US +637325824,637326079,GB +637326080,637326335,DE +637326336,637326591,HK +637326592,637326847,AU +637326848,637327103,JP +637327104,637327359,NO +637329408,637329663,SI +637329664,637330175,FR +637330176,637330431,DE +637330432,637330943,JP +637330944,637331199,GB +637331200,637331455,IE +637331456,637331711,GB +637331712,637331967,AT +637331968,637332223,DE +637332224,637332991,AT +637332992,637333503,BR +637333504,637333759,AU +637333760,637334271,AT +637334272,637334527,TW +637334528,637334783,KR +637334784,637335039,AE +637335040,637335295,SK +637335296,637335551,BG +637335552,637335807,DE +637335808,637336063,HK +637336064,637336319,AT +637336320,637336575,CL +637336576,637336831,AT +637336832,637337087,IT +637337088,637337599,RU +637337600,637403135,NO +637403136,637534207,IR +637534208,638730239,US +638730240,638738431,CA +638738432,638754815,US +638754816,638763007,CA +638763008,639242239,US +639242240,639246335,CA +639246336,639320063,US +639320064,639328255,CA +639328256,639442943,US +639442944,639451135,CA +639451136,641738239,US +641738240,641738495,CA +641738496,641761535,US +641761536,641761791,CA +641761792,641763327,US +641763328,641764351,CA +641764352,641765375,US +641765376,641767423,CA +641767424,641769471,US +641769472,641769727,CA +641769728,641770495,US +641770496,641772031,CA +641772032,641772287,US +641772288,641772543,CA +641772544,641773055,US +641773056,641773567,CA +641773568,641774079,US +641774080,641774641,CA +641774642,641774642,US +641774643,641776639,CA +641776640,641777663,US +641777664,641777919,CA +641777920,641778175,US +641778176,641778687,CA +641778688,641779199,US +641779200,641779327,CA +641779328,641779711,US +641779712,641781759,CA +641781760,641789951,US +641789952,641790975,CA +641790976,641791999,US +641792000,641793023,CA +641793024,641828863,US +641828864,641829375,MX +641829376,641829887,US +641829888,641832959,MX +641832960,642093055,US +642093056,642095103,CA +642095104,642096127,US +642096128,642096639,CA +642096640,642097151,US +642097152,642105343,CA +642105344,642113535,US +642113536,642115583,AU +642115584,642385919,US +642385920,642400255,CA +642400256,642793471,US +642793472,642794495,CA +642794496,642799615,US +642799616,642801663,CA +642801664,643219519,US +643219520,643219523,CA +643219524,643219526,US +643219527,643219527,CA +643219528,643235839,US +643235840,643244031,CA +643244032,643293439,US +643293440,643293695,GB +643293696,643293951,US +643293952,643294207,SG +643294208,643294719,US +643294720,643294975,RU +643294976,643295231,DE +643295232,643295487,PR +643295488,643295743,US +643295744,643296767,PR +643296768,643299583,US +643299584,643299839,HK +643299840,643302911,US +643302912,643303423,CA +643303424,643317759,US +643317760,643330047,CA +643330048,643346431,US +643346432,643346943,CA +643346944,644051967,US +644051968,644052479,MF +644052480,644052735,GP +644052736,644052991,MF +644052992,644055039,US +644055040,644057599,CA +644057600,644058111,US +644058112,644059647,CA +644059648,644060159,US +644060160,644061631,CA +644061632,644061663,US +644061664,644062975,CA +644062976,644063231,US +644063232,644065023,CA +644065024,644065055,US +644065056,644065279,CA +644065280,644066303,US +644066304,644066815,CA +644066816,644067072,US +644067073,644067073,CA +644067074,644067327,US +644067328,644071423,CA +644071424,644084479,US +644084480,644084607,GU +644084608,644210431,US +644210432,644210687,MX +644210688,644239615,US +644239616,644239871,CA +644239872,644247551,US +644247552,644249599,CA +644249600,644268031,US +644268032,644268569,CA +644268570,644268570,US +644268571,644268613,CA +644268614,644268614,US +644268615,644268799,CA +644268800,644321279,US +644321280,644325375,CA +644325376,644388863,US +644388864,644390911,CA +644390912,644399103,US +644399104,644399359,CA +644399360,644403199,US +644403200,644403455,CA +644403456,644413439,US +644413440,644413951,MX +644413952,644414463,CA +644414464,644422911,US +644422912,644423423,JP +644423424,644569087,US +644569088,644570111,PR +644570112,644570367,US +644570368,644570623,PR +644570624,644582399,US +644582400,644582655,CA +644582656,644628799,US +644628800,644628807,CA +644628808,644629759,US +644629760,644630015,CA +644630016,644630527,US +644630528,644631551,CA +644631552,644635647,US +644635648,644636671,CA +644636672,644718719,US +644718720,644718783,CA +644718784,644718847,US +644718848,644718943,CA +644718944,644720127,US +644720128,644720639,CA +644720640,644759551,US +644759552,644761599,CA +644761600,644763647,US +644763648,644765695,CA +644765696,644767878,US +644767879,644767879,CA +644767880,644773887,US +644773888,644775935,CA +644775936,644833279,US +644833280,644834815,CA +644834816,644835071,US +644835072,644835327,CA +644835328,644838143,US +644838144,644839679,CA +644839680,644840447,US +644840448,644841471,CA +644841472,644845839,US +644845840,644845840,RU +644845841,644845841,US +644845842,644845855,RU +644845856,644845863,US +644845864,644846079,RU +644846080,644874751,US +644874752,644875263,CA +644875264,644877311,US +644877312,644877439,CA +644877440,644896767,US +644896768,644902911,CA +644902912,644981759,US +644981760,644982399,CA +644982400,644982527,US +644982528,644982783,CA +644982784,644986111,US +644986112,644986367,CA +644986368,644987135,US +644987136,644987903,CA +644987904,645185535,US +645185536,645185791,CA +645185792,645186559,US +645186560,645187583,CA +645187584,645221375,US +645221376,645222399,CA +645222400,645224959,US +645224960,645225215,CA +645225216,645225471,US +645225472,645225983,CA +645225984,645228031,US +645228032,645228287,CA +645228288,645480447,US +645480448,645481471,CA +645481472,645481727,US +645481728,645481983,CA +645481984,645482239,US +645482240,645482495,AU +645482496,645483775,US +645483776,645484031,CA +645484032,645484543,US +645484544,645488639,CA +645488640,645525503,US +645525504,645529599,CA +645529600,645539839,US +645539840,645540863,CA +645540864,645547007,US +645547008,645548031,CA +645548032,645576703,US +645576704,645576997,CA +645576998,645576998,US +645576999,645577215,CA +645577216,645611519,US +645611520,645615615,MX +645615616,645644351,US +645644352,645644415,MX +645644416,645644927,US +645644928,645645055,MX +645645056,645646335,US +645646336,645646847,MX +645646848,645647615,US +645647616,645647871,MX +645647872,645703679,US +645703680,645705727,MX +645705728,645709823,US +645709824,645718015,MX +645718016,645873663,US +645873664,645877759,CA +645877760,645980159,US +645980160,645982719,CA +645982720,645984255,US +645984256,645988351,CA +645988352,645989450,US +645989451,645989451,CA +645989452,646082559,US +646082560,646083583,CA +646083584,646084095,US +646084096,646084351,CA +646084352,646084607,US +646084608,646086655,CA +646086656,646160383,US +646160384,646164479,CA +646164480,646166527,US +646166528,646168575,CA +646168576,646194175,US +646194176,646194943,CA +646194944,646195560,US +646195561,646195561,CA +646195562,646197247,US +646197248,646198783,CA +646198784,646199384,US +646199385,646199385,CA +646199386,646250495,US +646250496,646258687,CA +646258688,646262783,US +646262784,646264831,CA +646264832,646711807,US +646711808,646712319,CA +646712320,646734847,US +646734848,646735359,CA +646735360,646765567,US +646765568,646765887,CA +646765888,646766079,US +646766080,646766591,CA +646766592,646840319,US +646840320,646841343,CA +646841344,654311423,US +654311424,654311679,CN +654311680,654311935,AU +654311936,654376959,CN +654376960,654442495,TW +654442496,654573567,JP +654573568,654835711,KR +654835712,654999551,TW +654999552,655001599,CN +655001600,655359999,TW +655360000,656408575,KR +656408576,658505727,PK +658505728,661454847,CN +661454848,661487615,HK +661487616,661520383,SG +661520384,661651455,JP +661651456,662700031,KR +662700032,666894335,CN +666894336,671088639,ID +671088640,675381247,US +675381248,675397631,SG +675397632,675422207,US +675422208,675430399,FR +675430400,675447167,US +675447168,675447295,HK +675447296,675447423,US +675447424,675447551,BR +675447552,675448575,US +675448576,675449087,GB +675449088,675449151,US +675449152,675449215,BR +675449216,675449471,US +675449472,675449599,IE +675449600,675449727,AT +675449728,675449855,FI +675449856,675449983,US +675449984,675450495,FR +675450496,675450623,NL +675450624,675450751,MY +675450752,675450879,US +675450880,675451007,JP +675451008,675451391,FR +675451392,675451519,US +675451520,675451647,AU +675451648,675451775,NL +675451776,675451903,US +675451904,675452159,HK +675452160,675452927,US +675452928,675453055,IE +675453056,675453439,US +675453440,675453503,BR +675453504,675453567,IN +675453568,675453695,AU +675453696,675453759,KR +675453760,675453951,GB +675453952,675454015,JP +675454016,675454079,CA +675454080,675454207,IE +675454208,675454271,SG +675454272,675454335,MY +675454336,675454399,KR +675454400,675454463,AU +675454464,675454719,NL +675454720,675454847,AT +675454848,675463167,US +675463168,675463295,KR +675463296,675463423,US +675463424,675463807,KR +675463808,675528703,US +675528704,675536895,NL +675536896,675545087,IE +675545088,675610623,NL +675610624,675635199,IE +675635200,675643391,CA +675643392,675659775,US +675659776,675667967,IE +675667968,675807231,US +675807232,675938303,CN +675938304,675954687,NL +675954688,675975167,JP +675975168,676168959,US +676168960,676169215,IE +676169216,676169471,HK +676169472,676169743,US +676169744,676169759,HK +676169760,676169775,IE +676169776,676169807,US +676169808,676169823,IE +676169824,676175903,US +676175904,676176191,HK +676176192,676176255,US +676176256,676176383,HK +676176384,676176639,IE +676176640,676179455,US +676179456,676179711,IE +676179712,676179839,US +676179840,676179871,HK +676179872,676179903,IE +676179904,676181599,US +676181600,676181631,IE +676181632,676192767,US +676192768,676192895,HK +676192896,676193023,IE +676193024,676193535,US +676193536,676193791,IE +676193792,676194943,US +676194944,676194975,HK +676194976,676195007,IE +676195008,676195327,US +676195328,676195359,IE +676195360,676249599,US +676249600,676251647,IN +676251648,676253731,US +676253732,676254207,AU +676254208,676254463,NL +676254464,676254719,IE +676254720,676254975,FI +676254976,676255231,AT +676255232,676255487,US +676255488,676255743,AU +676255744,676257535,US +676257536,676257791,SG +676257792,676259839,US +676259840,676261887,SG +676261888,676298751,US +676298752,676304895,FR +676304896,676306943,US +676306944,676311039,AU +676311040,676313087,FR +676313088,676317183,JP +676317184,676317439,MY +676317440,676317951,GB +676317952,676319231,IE +676319232,676319743,JP +676319744,676319999,HK +676320000,676320511,AU +676320512,676321023,IN +676321024,676321279,GB +676321280,676321791,CA +676321792,676322047,GB +676322048,676322303,IN +676322304,676322815,KR +676322816,676323327,FR +676323328,676331519,IE +676331520,676332543,GB +676332544,676333567,FI +676333568,676334591,MY +676334592,676336639,GB +676336640,676338687,FR +676338688,676339711,AT +676339712,676341759,KR +676341760,676343807,CA +676343808,676347903,NL +676347904,676368383,JP +676368384,676388863,US +676388864,676392959,KR +676392960,676397055,CA +676397056,676401151,US +676401152,676405247,HK +676405248,676409343,US +676409344,676413439,AU +676413440,676421631,IN +676421632,676442111,GB +676442112,676454399,JP +676454400,676462591,IN +676462592,676463103,US +676463104,676463615,NL +676463616,676464639,US +676464640,676495359,NL +676495360,676503551,KR +676503552,676511743,CA +676511744,676519935,AU +676519936,676524031,FR +676524032,676528127,NL +676528128,676544511,US +676544512,676560895,HK +676560896,676659199,US +676659200,676696063,IE +676696064,676708351,US +676708352,676724735,CA +676724736,676773887,US +676773888,676790271,CA +676790272,676823039,US +676823040,676831231,IE +676831232,676837375,US +676837376,676838399,NL +676838400,676839423,IE +676839424,676840447,HK +676840448,676841471,SG +676841472,676843519,JP +676843520,676845567,AU +676845568,676848639,IN +676848640,676849663,GB +676849664,676921343,US +676921344,676929535,CA +676929536,676954111,US +676954112,676970495,FR +676970496,676978687,KR +676978688,677020095,US +677020096,677020127,IE +677020128,677020159,US +677020160,677020191,NL +677020192,677020351,US +677020352,677020367,CA +677020368,677020383,AU +677020384,677020399,IN +677020400,677020479,US +677020480,677020543,GB +677020544,677020607,KR +677020608,677020927,US +677020928,677020959,NL +677020960,677020991,BR +677020992,677021023,IE +677021024,677021055,US +677021056,677021087,SG +677021088,677021951,US +677021952,677021983,JP +677021984,677022015,US +677022016,677022047,SG +677022048,677022079,US +677022080,677022143,IN +677022144,677022175,IE +677022176,677022207,US +677022208,677022239,NL +677022240,677022303,CA +677022304,677022335,SG +677022336,677022367,AU +677022368,677022431,US +677022432,677022463,IN +677022464,677022527,US +677022528,677022591,GB +677022592,677022655,KR +677022656,677022719,US +677022720,677022751,CA +677022752,677022783,AU +677022784,677022815,IN +677022816,677023007,US +677023008,677023039,NL +677023040,677023071,BR +677023072,677023135,IE +677023136,677023167,NL +677023168,677023199,US +677023200,677023231,SG +677023232,677023935,US +677023936,677023967,NL +677023968,677023999,BR +677024000,677024031,IE +677024032,677024127,US +677024128,677024159,SG +677024160,677024191,US +677024192,677024223,NL +677024224,677024255,IE +677024256,677024383,US +677024384,677024415,NL +677024416,677024447,SG +677024448,677024479,US +677024480,677024511,SG +677024512,677024543,US +677024544,677024575,CA +677024576,677024607,AU +677024608,677024639,IN +677024640,677027839,US +677027840,677036031,SG +677036032,677054463,US +677054464,677054719,PR +677054720,677057535,US +677057536,677058559,IE +677058560,677101567,US +677101568,677117951,NL +677117952,677134335,US +677134336,677134591,IE +677134592,677134847,FI +677134848,677135103,AT +677135104,677135359,NL +677135360,677135615,FI +677135616,677135871,AT +677135872,677136127,NL +677136128,677136383,IE +677136384,677136639,AT +677136640,677182975,US +677182976,677183231,KR +677183232,677199871,US +677199872,677200127,IE +677200128,677200383,FI +677200384,677200639,AT +677200640,677200895,NL +677200896,677201151,FI +677201152,677201407,AT +677201408,677201663,NL +677201664,677201919,IE +677201920,677202175,AT +677202176,677248511,US +677248512,677248767,KR +677248768,677380095,US +677380096,677380127,AU +677380128,677380159,IE +677380160,677380191,NL +677380192,677380543,US +677380544,677380583,SG +677380584,677380591,US +677380592,677380719,SG +677380720,677380759,KR +677380760,677380767,US +677380768,677380895,KR +677380896,677380927,AU +677380928,677380943,IN +677380944,677380959,FI +677380960,677380991,AU +677380992,677381055,US +677381056,677381071,FI +677381072,677381111,HK +677381112,677381119,US +677381120,677381247,HK +677381248,677381375,US +677381376,677381407,AT +677381408,677381423,NL +677381424,677381599,US +677381600,677381631,NL +677381632,677381711,US +677381712,677381759,IE +677381760,677381943,US +677381944,677381951,FI +677381952,677382015,US +677382016,677382047,NL +677382048,677382063,KR +677382064,677382479,US +677382480,677382487,FI +677382488,677382495,US +677382496,677382527,NL +677382528,677382543,CA +677382544,677382559,IE +677382560,677382575,US +677382576,677382591,AU +677382592,677382623,IE +677382624,677382639,CA +677382640,677382719,US +677382720,677382727,IE +677382728,677382751,FI +677382752,677382815,CA +677382816,677382831,NL +677382832,677382839,FI +677382840,677383191,BR +677383192,677383391,US +677383392,677383567,NL +677383568,677383583,MY +677383584,677383615,US +677383616,677383631,MY +677383632,677383695,US +677383696,677383711,MY +677383712,677383775,US +677383776,677383791,CL +677383792,677383823,MY +677383824,677383983,CL +677383984,677383999,MY +677384000,677384127,SG +677384128,677384143,US +677384144,677384159,IE +677384160,677384191,US +677384192,677384367,NL +677384368,677384399,MY +677384400,677384431,AT +677384432,677384463,US +677384464,677384495,FI +677384496,677384511,MY +677384512,677384623,KR +677384624,677384639,HK +677384640,677384671,FI +677384672,677384719,NL +677384720,677384831,US +677384832,677384991,HK +677384992,677385167,CA +677385168,677385343,FI +677385344,677385471,US +677385472,677385519,FI +677385520,677385695,AT +677385696,677385871,NL +677385872,677385919,US +677385920,677385935,CA +677385936,677385967,US +677385968,677385983,SG +677385984,677385999,FI +677386000,677386015,US +677386016,677386047,IN +677386048,677386063,HK +677386064,677386095,US +677386096,677386111,BR +677386112,677386127,CA +677386128,677386159,US +677386160,677386175,BR +677386176,677386207,CA +677386208,677386239,AU +677386240,677386359,BR +677386360,677386367,MY +677386368,677386375,AU +677386376,677386399,AT +677386400,677386415,CL +677386416,677386423,FI +677386424,677386431,AU +677386432,677386439,FI +677386440,677386495,CL +677386496,677386527,IE +677386528,677386543,AT +677386544,677386559,HK +677386560,677386575,FI +677386576,677386615,MY +677386616,677386623,IE +677386624,677386639,JP +677386640,677386655,US +677386656,677386671,AU +677386672,677386735,US +677386736,677386751,HK +677386752,677386767,US +677386768,677386799,CA +677386800,677386967,IE +677386968,677387319,US +677387320,677387327,FI +677387328,677387455,AT +677387456,677387487,FI +677387488,677387663,US +677387664,677387839,HK +677387840,677387863,AT +677387864,677387967,US +677387968,677388007,FI +677388008,677388183,US +677388184,677388223,FI +677388224,677388351,US +677388352,677388527,MY +677388528,677388703,US +677388704,677388879,FI +677388880,677389055,NL +677389056,677389231,AT +677389232,677389263,US +677389264,677389439,CA +677389440,677389615,US +677389616,677389791,IE +677389792,677389823,CA +677389824,677389999,US +677390000,677390063,CA +677390064,677390239,US +677390240,677390247,FI +677390248,677390271,AT +677390272,677390983,US +677390984,677391399,GB +677391400,677391575,US +677391576,677391959,GB +677391960,677392135,US +677392136,677392143,KR +677392144,677392159,US +677392160,677392327,KR +677392328,677392503,MY +677392504,677392679,HK +677392680,677392855,SG +677392856,677393031,NL +677393032,677393207,US +677393208,677393215,FI +677393216,677393375,AT +677393376,677393383,FI +677393384,677393391,US +677393392,677393407,FI +677393408,677393535,US +677393536,677393559,FI +677393560,677393575,NL +677393576,677393735,US +677393736,677393743,FI +677393744,677393759,NL +677393760,677393855,US +677393856,677393863,FI +677393864,677393927,US +677393928,677394279,JP +677394280,677394287,FI +677394288,677394303,AU +677394304,677394431,US +677394432,677394447,AU +677394448,677394455,FI +677394456,677394527,JP +677394528,677394559,CL +677394560,677394591,US +677394592,677394759,JP +677394760,677394767,FI +677394768,677394799,US +677394800,677394967,FI +677394968,677395319,AT +677395320,677395495,NL +677395496,677395671,IE +677395672,677395863,US +677395864,677395871,FI +677395872,677395903,IE +677395904,677396071,FI +677396072,677396079,NL +677396080,677396095,IN +677396096,677396247,NL +677396248,677396599,IE +677396600,677396623,FI +677396624,677396639,IE +677396640,677396791,FI +677396792,677396823,US +677396824,677396831,FI +677396832,677642239,US +677642240,677645311,HK +677645312,677646335,US +677646336,677647359,MY +677647360,677648383,KR +677648384,677651455,SG +677651456,677652479,JP +677652480,677653503,HK +677653504,677655551,KR +677655552,677655655,JP +677655656,677655663,US +677655664,677655919,JP +677655920,677656063,US +677656064,677656319,HK +677656320,677656575,SG +677656576,677657087,HK +677657088,677677055,US +677677056,677678591,IN +677678592,677679103,US +677679104,677679999,AU +677680000,677680127,US +677680128,677681151,AU +677681152,677683199,JP +677683200,677685247,CA +677685248,677687295,GB +677687296,677707775,US +677707776,677708799,NL +677708800,677709823,AT +677709824,677713919,NL +677713920,677714943,US +677714944,677715967,FI +677715968,677720063,IE +677720064,677721087,FI +677721088,677722111,AT +677722112,677723135,US +677723136,677724159,NL +677724160,677725183,FI +677725184,677726207,AT +677726208,677727231,IE +677727232,677728255,AT +677728256,677729279,NL +677729280,677730303,FI +677730304,677731327,NL +677731328,677732351,FR +677732352,677734399,IE +677734400,677735423,NL +677735424,677738495,US +677738496,677739775,NL +677739776,677740031,IE +677740032,677740543,FI +677740544,677742591,CA +677742592,677744639,FR +677744640,677748735,JP +677748736,677774335,US +677774336,677776383,BR +677776384,677781503,US +677781504,677783551,CL +677783552,677784575,ZA +677784576,677785599,PR +677785600,677838847,US +677838848,677838863,NL +677838864,677838879,IE +677838880,677838895,FI +677838896,677838911,AT +677838912,677838927,NL +677838928,677838943,IE +677838944,677838959,FI +677838960,677838975,AT +677838976,677838991,NL +677838992,677839007,IE +677839008,677839023,FI +677839024,677839039,AT +677839040,677839055,NL +677839056,677839071,IE +677839072,677839087,FI +677839088,677839103,AT +677839104,677839119,NL +677839120,677839135,IE +677839136,677839151,FI +677839152,677839167,AT +677839168,677839183,NL +677839184,677839199,IE +677839200,677839215,FI +677839216,677839231,AT +677839232,677839247,NL +677839248,677839263,IE +677839264,677839279,FI +677839280,677839295,AT +677839296,677839311,NL +677839312,677839327,IE +677839328,677839343,FI +677839344,677839359,AT +677839360,677840319,US +677840320,677840335,NL +677840336,677840367,IE +677840368,677840383,AT +677840384,677840399,NL +677840400,677840431,IE +677840432,677840447,AT +677840448,677840463,NL +677840464,677840495,IE +677840496,677840511,AT +677840512,677840543,NL +677840544,677840559,IE +677840560,677840575,AT +677840576,677840591,NL +677840592,677840623,IE +677840624,677840639,AT +677840640,677841919,US +677841920,677841935,FI +677841936,677841951,IE +677841952,677841967,AT +677841968,677841983,NL +677841984,677841999,FI +677842000,677842015,IE +677842016,677842031,AT +677842032,677842047,NL +677842048,677842063,FI +677842064,677842079,IE +677842080,677842095,AT +677842096,677842111,NL +677842112,677842127,FI +677842128,677842143,IE +677842144,677842159,AT +677842160,677842175,NL +677842176,677842191,FI +677842192,677842207,IE +677842208,677842223,AT +677842224,677842239,NL +677842240,677842255,FI +677842256,677842271,IE +677842272,677842287,AT +677842288,677842303,NL +677842304,677842319,FI +677842320,677842335,US +677842336,677842351,AT +677842352,677842367,NL +677842368,677842383,FI +677842384,677842399,IE +677842400,677842415,AT +677842416,677842431,NL +677842432,677842447,FI +677842448,677842463,IE +677842464,677842479,AT +677842480,677842495,NL +677842496,677842511,FI +677842512,677842527,IE +677842528,677842543,AT +677842544,677842559,NL +677842560,677844479,US +677844480,677844495,NL +677844496,677844511,AT +677844512,677844527,FI +677844528,677844543,IE +677844544,677844559,NL +677844560,677844575,AT +677844576,677844591,FI +677844592,677844607,IE +677844608,677844623,NL +677844624,677844639,AT +677844640,677844655,FI +677844656,677844671,IE +677844672,677844687,NL +677844688,677844703,AT +677844704,677844719,FI +677844720,677844735,IE +677844736,677844751,NL +677844752,677844767,AT +677844768,677844783,FI +677844784,677844799,IE +677844800,677846079,US +677846080,677846095,KR +677846096,677846111,SG +677846112,677846127,HK +677846128,677846143,MY +677846144,677846159,KR +677846160,677846175,SG +677846176,677846191,HK +677846192,677846207,MY +677846208,677846223,KR +677846224,677846239,SG +677846240,677846255,HK +677846256,677846271,MY +677846272,677846287,KR +677846288,677846303,SG +677846304,677846319,HK +677846320,677846335,MY +677846336,677846975,US +677846976,677846991,IE +677846992,677847007,AT +677847008,677847023,NL +677847024,677847039,FI +677847040,677847055,IE +677847056,677847071,AT +677847072,677847087,NL +677847088,677847103,FI +677847104,677847119,IE +677847120,677847135,AT +677847136,677847151,NL +677847152,677847167,FI +677847168,677847183,IE +677847184,677847199,AT +677847200,677847215,NL +677847216,677847231,FI +677847232,677847247,IE +677847248,677847263,AT +677847264,677847279,NL +677847280,677847295,FI +677847296,677847311,IE +677847312,677847327,AT +677847328,677847343,NL +677847344,677847359,FI +677847360,677847375,IE +677847376,677847391,AT +677847392,677847407,NL +677847408,677847423,FI +677847424,677847439,IE +677847440,677847455,AT +677847456,677847471,NL +677847472,677847487,FI +677847488,677847503,IE +677847504,677847519,AT +677847520,677847535,NL +677847536,677847551,FI +677847552,677847567,IE +677847568,677847583,AT +677847584,677847599,NL +677847600,677847615,FI +677847616,677848319,US +677848320,677848335,FI +677848336,677848351,US +677848352,677848367,IE +677848368,677848399,US +677848400,677848415,NL +677848416,677848431,IE +677848432,677848447,AT +677848448,677848463,FI +677848464,677848479,NL +677848480,677848495,IE +677848496,677848511,AT +677848512,677848527,FI +677848528,677848543,NL +677848544,677848559,IE +677848560,677848575,AT +677848576,677848591,FI +677848592,677848607,US +677848608,677848623,IE +677848624,677848639,US +677848640,677848655,FI +677848656,677848671,NL +677848672,677848687,IE +677848688,677848703,AT +677848704,677848719,FI +677848720,677848735,NL +677848736,677848751,IE +677848752,677848767,AT +677848768,677848783,FI +677848784,677848799,NL +677848800,677848815,IE +677848816,677848831,AT +677848832,677848847,FI +677848848,677848863,NL +677848864,677848879,IE +677848880,677848895,AT +677848896,677848911,FI +677848912,677848927,NL +677848928,677848943,IE +677848944,677848959,AT +677848960,677850239,US +677850240,677850255,AT +677850256,677850271,IE +677850272,677850287,FI +677850288,677850303,NL +677850304,677850319,AT +677850320,677850335,IE +677850336,677850351,FI +677850352,677850367,NL +677850368,677850383,AT +677850384,677850399,IE +677850400,677850415,FI +677850416,677850431,NL +677850432,677850447,AT +677850448,677850463,IE +677850464,677850479,FI +677850480,677850495,NL +677850496,677850511,AT +677850512,677850527,IE +677850528,677850543,FI +677850544,677850559,NL +677850560,677850575,AT +677850576,677850591,IE +677850592,677850607,FI +677850608,677850623,NL +677850624,677850639,AT +677850640,677850655,IE +677850656,677850671,FI +677850672,677850687,NL +677850688,677850703,AT +677850704,677850719,IE +677850720,677850735,FI +677850736,677850751,NL +677850752,677850767,AT +677850768,677850783,IE +677850784,677850799,FI +677850800,677850815,NL +677850816,677850831,AT +677850832,677850847,IE +677850848,677850863,FI +677850864,677850879,NL +677850880,677853695,US +677853696,677853711,AT +677853712,677853727,IE +677853728,677853743,FI +677853744,677853759,NL +677853760,677853775,AT +677853776,677853791,MY +677853792,677853807,FI +677853808,677853823,NL +677853824,677853839,AT +677853840,677853855,IE +677853856,677853871,FI +677853872,677853887,US +677853888,677853903,AT +677853904,677853919,IE +677853920,677853935,FI +677853936,677853951,NL +677853952,677853967,AT +677853968,677853983,IE +677853984,677853999,FI +677854000,677854031,NL +677854032,677854047,FI +677854048,677854063,IE +677854064,677854079,AT +677854080,677854095,NL +677854096,677854111,FI +677854112,677854127,IE +677854128,677854143,AT +677854144,677854159,NL +677854160,677854175,FI +677854176,677854191,IE +677854192,677854207,AT +677854208,677854223,NL +677854224,677854239,FI +677854240,677854255,IE +677854256,677854271,AT +677854272,677854287,NL +677854288,677854303,FI +677854304,677854319,IE +677854320,677854335,AT +677854336,677854975,US +677854976,677854991,KR +677854992,677855007,HK +677855008,677855023,SG +677855024,677855039,MY +677855040,677855055,KR +677855056,677855071,HK +677855072,677855087,SG +677855088,677855103,MY +677855104,677855119,KR +677855120,677855135,HK +677855136,677855151,SG +677855152,677855167,MY +677855168,678117887,US +678117888,678118399,CA +678118400,678150143,US +678150144,678150399,FI +678150400,678150655,IE +678150656,678150911,FI +678150912,678151167,US +678151168,678151295,NL +678151296,678152447,US +678152448,678152703,AT +678152704,678153215,NL +678153216,678158591,US +678158592,678158847,KR +678158848,678170623,US +678170624,678170815,IE +678170816,678171007,NL +678171008,678171391,IE +678171392,678171775,NL +678171776,678200831,US +678200832,678201087,BR +678201088,678202111,US +678202112,678202367,NL +678202368,678203135,IE +678203136,678203391,NL +678203392,678205183,US +678205184,678205695,NL +678205696,678205951,KR +678205952,678206463,CA +678206464,678206719,KR +678206720,678206975,IE +678206976,678207487,AU +678207488,678207999,IE +678208000,678208255,US +678208256,678208511,GB +678208512,678209023,IE +678209024,678209279,GB +678209280,678209791,IE +678209792,678211583,US +678211584,678212607,NL +678212608,678212863,GB +678212864,678214143,US +678214144,678214399,AU +678214400,678214655,US +678214656,678214911,GB +678214912,678215167,CA +678215168,678215423,US +678215424,678216191,NL +678216192,678216447,US +678216448,678216703,NL +678216704,678216959,US +678216960,678217215,AU +678217216,678217471,JP +678217472,678217983,IE +678217984,678220543,US +678220544,678221055,NL +678221056,678221567,US +678221568,678221823,CA +678221824,678222079,GB +678222080,678222335,SG +678222336,678222591,GB +678222592,678223103,FR +678223104,678223615,AU +678223616,678224127,US +678224128,678224639,IE +678224640,678224895,JP +678224896,678225407,US +678225408,678225663,NL +678225664,678225919,IE +678225920,678226175,GB +678226176,678226943,US +678226944,678227199,SG +678227200,678227455,JP +678227456,678227711,HK +678227712,678227967,JP +678227968,678228223,US +678228224,678228479,NL +678228480,678228735,IE +678228736,678428671,US +678428672,678436863,IE +678436864,678437887,US +678437888,678438015,IE +678438016,678438207,NL +678438208,678438271,IE +678438272,678438399,AU +678438400,678438591,US +678438592,678438655,NL +678438656,678438847,IN +678438848,678445055,US +678445056,678453247,IE +678453248,678461439,NL +678461440,678494207,US +678494208,678518783,IE +678518784,678543359,NL +678543360,678592511,US +678592512,678623193,NL +678623194,678623194,US +678623195,678641663,NL +678641664,678649855,AU +678649856,678658047,IE +678658048,678690815,JP +678690816,678821887,US +678821888,678854655,NL +678854656,679313407,US +679313408,679346175,CN +679346176,679346431,US +679346432,679346687,IE +679346688,679348479,US +679348480,679348735,NL +679348736,679348991,US +679348992,679349247,CA +679349248,679349375,SG +679349376,679349503,HK +679349504,679349759,JP +679349760,679350015,AU +679350016,679350271,GB +679350272,679350399,US +679350400,679350527,KR +679350528,679350655,BR +679350656,679351039,IN +679351040,679351295,FR +679351296,679351551,KR +679351552,679362559,US +679362560,679378943,CN +679378944,679403519,US +679403520,679411711,AU +679411712,679428095,US +679428096,679436287,AU +679436288,679440383,IE +679440384,679444479,US +679444480,679477247,IE +679477248,687865855,US +687865856,689963007,ZA +689963008,691011583,EG +691011584,691617791,ZA +691617792,691621887,ZW +691621888,691625983,LR +691625984,691630079,KE +691630080,691631103,ZA +691631104,691632127,GH +691632128,691633151,NG +691633152,691634175,ZW +691634176,691650559,ZA +691650560,691666943,GH +691666944,691732479,NG +691732480,691798015,TZ +691798016,691806207,ZM +691806208,691830783,ZW +691830784,691832319,ZM +691832320,691832831,ZA +691832832,691857407,ZM +691857408,691857919,KE +691857920,691858175,MU +691858176,691858431,KE +691858432,691859455,MU +691859456,691863551,ZM +691863552,691866623,ZA +691866624,691866879,CI +691866880,691929087,ZA +691994624,692011007,ZM +692011008,692027391,ZA +692027392,692035583,MG +692035584,692043775,AO +692043776,692060159,NA +692060160,692191231,EG +692191232,692207615,CI +692207616,692240383,ZA +692240384,692256767,GH +692256768,692273151,SD +692273152,692289535,EG +692289536,692305919,NG +692305920,692322303,CM +692322304,692453375,EG +692453376,692486143,MW +692486144,692518911,AO +692518912,692551679,ZA +692551680,692584447,NG +692584448,692600831,AO +692600832,692608255,EG +692608256,692608767,AO +692608768,692609023,EG +692609024,692617215,ZM +692617216,692625407,ZA +692625408,692626687,KE +692626688,692626943,AO +692626944,692633599,KE +692633600,692637135,MU +692637136,692637139,KE +692637140,692637903,MU +692637904,692637911,KE +692637912,692641791,MU +692641792,692649983,GA +692649984,692658175,NG +692658176,692666367,ZA +692666368,692674559,TZ +692674560,692682751,ML +692682752,692690943,NG +692690944,692707327,TZ +692707328,692715519,NG +692715520,692719615,BJ +692719616,692723711,MG +692723712,692727807,TD +692727808,692731903,BW +692731904,692735999,LY +692736000,692740095,GH +692740656,692740671,ZA +692744192,692748287,TZ +692748288,692752383,CV +692752384,692756479,ZA +692756480,692760575,RW +692760576,692768767,ZA +692768768,692772863,MG +692772864,692776959,ZA +692776960,692781055,AO +692781056,692785151,BW +692789248,692793343,KE +692793344,692797439,GH +692797440,692801535,CG +692801536,692805631,NG +692805632,692809727,ZA +692809728,692813823,MW +692813824,692817919,ZA +692817920,692822015,KE +692822016,692826111,UG +692826112,692830207,KE +692830208,692834303,NG +692834304,692838399,TZ +692838400,692842495,ZA +692842496,692846591,ZM +692846592,692848639,MZ +692848640,692850687,GM +692850688,692852735,LS +692852736,692854783,GH +692854784,692856831,ZA +692856832,692858879,MU +692858880,692860927,UG +692860928,692862975,ZA +692862976,692869119,NG +692869120,692871167,TZ +692871168,692877311,ZA +692877312,692879359,GA +692879360,692881407,ZA +692881408,692883455,CG +692883456,692885503,MZ +692885504,692887551,NG +692889600,692891647,KE +692891648,692893695,ZA +692893696,692895743,KE +692895744,692897791,NG +692897792,692905983,ZA +692908032,692910079,BW +692910080,692912127,NG +692912128,692914175,ZM +692914176,692916223,MW +692916224,692918271,MG +692918272,692920319,ZA +692920320,692922367,MZ +692922368,692924415,NG +692924416,692928511,ZA +692928512,692930559,GH +692930560,692932607,UG +692932608,692934655,CM +692934656,692936703,BW +692936704,692940799,ZA +692940800,692941311,MA +692941312,692941567,CA +692941568,692942847,MA +692942848,692944895,GA +692944896,692946943,MZ +692946944,692948991,EG +692948992,692951039,MU +692951040,692953087,ZA +692955136,692957183,NG +692957184,692959231,DZ +692959232,692961279,GN +692961280,692963327,TZ +692963328,692965375,ZA +692965376,692967423,CM +692968448,692969471,CD +692969472,692971519,TZ +692971520,692973567,SZ +692973568,692975615,MZ +692977664,692978687,TZ +692978688,692979711,ZA +692979712,692980735,NG +692981760,692982783,AO +692982784,692983807,EG +692983808,692984831,KE +692984832,692987903,ZA +692987904,692988927,GH +692989952,692991999,BF +692992000,692993023,MW +692993024,692994047,EG +692994048,692995071,TZ +692996096,692997119,SO +692997120,692998143,ZW +692998144,692999167,NG +692999168,693000191,SL +693000192,693001215,NG +693001216,693002239,BW +693002240,693002505,GA +693002506,693002506,CM +693002507,693003263,GA +693003264,693004287,NG +693004288,693005311,CD +693005312,693006335,SD +693006336,693007359,ZM +693007360,693008383,NE +693008384,693009407,CF +693009408,693010431,GH +693010432,693011455,ZA +693012480,693013503,TG +693013504,693014527,ZA +693014528,693015551,GH +693015552,693016575,EG +693016576,693017599,GA +693017600,693018623,NG +693019648,693020671,ZA +693020672,693021695,TZ +693021696,693022719,NG +693022720,693023743,KE +693024768,693026815,ZA +693026816,693028863,CD +693028864,693029887,ZA +693029888,693030911,CM +693030912,693031935,NG +693031936,693032959,ZA +693032960,693033983,MW +693033984,693035007,ZA +693035008,693036031,NG +693036032,693038079,ZA +693039104,693040127,GA +693040128,693041151,ZA +693041152,693042175,MW +693042176,693043199,NG +693044224,693045247,NG +693045248,693046271,KE +693046272,693047295,ZW +693047296,693049343,ZA +693049344,693050367,SS +693050368,693051391,ZW +693051392,693052415,BW +693052416,693054463,ZA +693054464,693055487,BI +693055488,693056511,GQ +693056512,693057535,NA +693057536,693058559,ZW +693058560,693059583,SC +693059584,693060607,NG +693060608,693061631,TZ +693061632,693064703,ZA +693065728,693066751,MW +693066752,693067775,ZA +693067776,693068799,GH +693068800,693069823,TZ +693069824,693071871,ZA +693071872,693072895,ZW +693072896,693073919,NG +693073920,693074943,SS +693074944,693075967,CV +693075968,693076991,CM +693076992,693078015,MU +693078016,693079039,BW +693080064,693081087,NG +693081088,693082111,ZA +693082112,693083135,NG +693083136,693086207,ZA +693086208,693087231,KE +693087232,693088255,ZA +693088256,693089279,NG +693089280,693090303,ZA +693090304,693091327,TZ +693091328,693092351,ZW +693092352,693093375,ZA +693093376,693094399,SO +693094400,693095423,GN +693095424,693096447,NG +693096448,693097471,EG +693097472,693098495,ZA +693098496,693099519,BJ +693099520,693100543,ZA +693100544,693101567,BI +693101568,693102591,KE +693102592,693103615,CD +693103616,693104639,GN +693104640,693105663,ZA +693105664,693106687,MZ +693106688,693106951,TZ +693106952,693106959,ZA +693106960,693107711,TZ +693107712,693239807,KE +693239808,693370879,SN +693370880,693403647,ZA +693403648,693411583,KE +693411584,693411839,MU +693411840,693420031,NG +693420032,693423103,UG +693423104,693424127,KE +693424128,693428223,UG +693428224,693436415,SZ +693436416,693477375,ZA +693477376,693485567,BJ +693485568,693493759,ZW +693493760,693501951,ZA +693501952,693510143,LR +693510144,693511167,SC +693511168,693511423,RU +693511424,693518335,SC +693518336,693534719,ZA +693534720,693542911,NG +693542912,693551103,TZ +693551104,693559295,ZA +693559296,693567487,BJ +693567488,693575679,MW +693583872,693592063,NG +693592064,693600255,MU +693600256,693608447,MA +693608448,693616639,BW +693616640,693633023,ZA +693633024,693698559,EG +693698560,693829631,KE +693829632,693895167,EG +693895168,693927935,MA +693927936,693960703,CM +693960704,693993471,TZ +693993472,694026239,GH +694026240,694091775,MZ +694091776,694157311,SD +694157312,695205887,DZ +695205888,696254463,ZA +696254464,696516607,EG +696516608,696778751,ZA +696778752,696844287,MU +696844288,696909823,MA +696909824,696918015,UG +696918016,696926207,NE +696926208,696928255,ZA +696928256,696930303,BW +696930304,696932351,RW +696932352,696933375,BJ +696933376,696934399,ZA +696934400,696942591,BF +696942592,696950783,MR +696950784,696958975,NG +696958976,696963071,TZ +696963072,696967167,UG +696967168,696971263,MZ +696971264,696974335,KE +696974336,696975359,LU +696975360,696991743,GH +696991744,697008127,NG +697008128,697040895,KE +697040896,697303039,MA +697303040,697827327,ZA +697827328,697958399,EG +697958400,698023935,ZA +698023936,698056703,NG +698056704,698089471,EG +698089472,698220543,ZA +698220544,698351615,GA +698351616,699334655,ZA +699334656,699342847,ZM +699342848,699359231,ZA +699359232,699367423,ZW +699367424,699400191,ZA +699400192,699465727,EG +699465728,699531263,ZA +699531264,699662335,EG +699662336,699793407,ZA +699793408,699858943,NA +699858944,699924479,ZA +699924480,699990015,NG +699990016,700055551,ZA +700055552,700121087,RW +700121088,700186623,EG +700186624,700203007,MG +700203008,700219391,MR +700219392,700235775,TZ +700235776,700252159,ZA +700252160,700260351,NG +700260352,700268543,CI +700268544,700276735,ZA +700293120,700301311,GH +700301312,700309503,CD +700309504,700317695,DJ +700317696,700325887,NG +700325888,700334079,ZW +700334080,700335103,BJ +700335104,700336127,GH +700336128,700337151,CG +700337152,700338175,UG +700338176,700339199,CD +700339200,700340223,NA +700340224,700341247,GH +700341248,700342271,MW +700342272,700350463,NA +700350464,700351487,MU +700351488,700352511,UG +700352512,700358655,MU +700358656,700366847,MZ +700366848,700375039,UG +700375040,700376063,CM +700376064,700377087,NE +700377088,700378111,CD +700378112,700379135,MG +700380160,700381183,BW +700381184,700382207,EG +700382208,700383231,KE +700383232,700399615,EG +700399616,700400639,BW +700400640,700401663,CI +700401664,700402687,MZ +700402688,700403711,UG +700403712,700404735,EG +700404736,700405759,BJ +700405760,700406783,ZA +700407808,700408831,GH +700408832,700409855,CM +700409856,700410879,LR +700412928,700413951,ZM +700413952,700414975,SC +700414976,700432383,ZA +700432384,700434431,KE +700434432,700436479,LS +700436480,700437503,NG +700437504,700438527,MU +700438528,700439551,BW +700439552,700440575,GN +700440576,700442623,MU +700442624,700444671,ZW +700444672,700446719,GH +700446720,700447743,SL +700447744,700448767,DZ +700448768,700587007,ZA +700587008,700587263,ZM +700587264,700588287,ZA +700588288,700588543,KM +700588544,700593151,ZA +700593152,700594175,NG +700594176,700595199,ZA +700595200,700596223,CD +700596224,700598783,ZA +700598784,700599039,CG +700599040,700710911,ZA +700710912,700776447,EG +700776448,700841983,RW +700841984,700844031,GB +700844032,700846079,ZA +700846080,700858367,NA +700858368,700862463,ZA +700862464,700866559,ZM +700866560,700866815,NG +700866816,700867327,NA +700867328,700867583,NG +700867584,700870655,NA +700870656,700874751,GB +700874752,700907519,ZA +700907520,700973055,EG +700973056,701104127,DZ +701104128,701112319,GH +701112320,701120511,ZA +701120512,701145087,CI +701145088,701153279,SD +701153280,701161471,CM +701161472,701169663,UG +701169664,701186047,ZA +701186048,701202431,NG +701202432,701210623,NE +701210624,701214719,ZA +701214720,701218815,LS +701218816,701222911,ML +701222912,701227007,KE +701227008,701231103,BF +701231104,701235199,SC +701235200,701243391,SZ +701243392,701251583,GH +701251584,701259775,CM +701259776,701267967,MG +701267968,701276159,TZ +701276160,701284351,KE +701284352,701292543,ZA +701292544,701300735,NG +701300736,701308927,CM +701308928,701317119,AO +701317120,701325311,CM +701325312,701333503,EG +701333504,701341695,NA +701341696,701349887,NG +701349888,701358079,MA +701358080,701366271,SL +701366272,701374463,NG +701374464,701382655,KE +701382656,701390847,CI +701390848,701391871,MU +701391872,701392127,KE +701392128,701392383,MU +701392384,701392639,ZA +701392640,701399039,MU +701399040,701407231,EG +701407232,701423615,ZA +701431808,701439999,CI +701440000,701448191,MG +701448192,701462783,KE +701462784,701463039,CG +701463040,701463807,KE +701463808,701464063,CG +701464064,701464575,KE +701464576,701472767,MU +701472768,701480959,TG +701480960,701489151,CI +701490176,701491199,AO +701491200,701492223,MU +701492224,701493247,ZA +701493248,701495295,TZ +701495296,701496319,NG +701496320,701497343,GH +701497344,701513727,ZA +701513728,701530111,LY +701530112,701546495,SN +701546496,701562879,ZA +701562880,701579263,KE +701579264,701595647,SD +701612032,701628415,EG +701628416,701644799,GH +701644800,701661183,DZ +701661184,701677567,UG +701677568,701693951,AO +701693952,701702143,GH +701702144,701710335,SZ +701710336,701718527,MU +701718528,701726719,CM +701726720,701743103,GA +701743104,701759487,NG +701759488,701792255,KE +701792256,701825023,MU +701825024,701857791,ZA +701857792,701890559,RE +701890560,701923327,SN +701923328,701956095,MA +701956096,701992959,KE +701992960,701997055,SZ +701997056,702001151,GH +702001152,702005247,ZM +702005248,702009343,KE +702009344,702013439,CV +702013440,702015487,KE +702015488,702017535,ZA +702017536,702018559,EG +702018560,702019583,NG +702019584,702020607,MU +702020608,702021631,CD +702021632,702029823,ZM +702029824,702038015,BJ +702038016,702046207,ZM +702046208,702053375,RW +702053376,702054399,ZW +702054400,702058495,ZA +702058496,702062591,BF +702062592,702066687,NG +702066688,702066943,PL +702066944,702067199,NL +702067200,702067711,PL +702067712,702068735,NL +702068736,702069759,ZA +702069760,702070271,US +702070272,702070783,RU +702070784,702074879,ZA +702074880,702076927,BW +702076928,702078975,TZ +702078976,702079999,MA +702080000,702081023,MW +702081024,702082047,CM +702082048,702083071,AO +702087168,702119935,NG +702119936,702128127,CM +702128128,702136319,EG +702136320,702137343,ZA +702138368,702139391,TZ +702139392,702140415,NG +702140416,702141439,MZ +702141440,702142463,MU +702142464,702143487,MW +702143488,702144511,KE +702144512,702146559,EG +702146560,702148607,UG +702148608,702150655,ZA +702152704,702169087,SD +702169088,702181375,NA +702181376,702185471,AO +702185472,702201855,EG +702201856,702218239,GH +702218240,702234623,SN +702234624,702251007,NA +702251008,702283775,NG +702283776,702287871,UG +702287872,702291967,ZW +702291968,702296063,MZ +702296064,702300159,GH +702300160,702308351,NG +702308352,702312447,SC +702312448,702316543,KE +702316544,702320639,TZ +702320640,702324735,DZ +702324736,702328831,MZ +702328832,702332927,TZ +702332928,702337023,MZ +702337024,702341119,UG +702341120,702342111,MU +702342112,702342127,KE +702342128,702343039,MU +702343040,702343103,KE +702343104,702344199,MU +702344200,702344971,KE +702344972,702345215,MU +702345216,702349311,KE +702349312,702353407,ZA +702353408,702357503,DZ +702357504,702365695,TZ +702365696,702369791,MZ +702369792,702373887,UG +702373888,702377983,MW +702382080,702386175,EG +702386176,702390271,ZW +702390272,702394367,NG +702394368,702398463,ML +702398464,702402559,CV +702402560,702407167,ZA +702407168,702407423,BJ +702407424,702410751,ZA +702410752,702414847,AO +702414848,702416895,MU +702416896,702418943,KE +702418944,702420991,ZM +702420992,702423039,TZ +702423040,702425087,ZA +702425088,702427135,NG +702427136,702429183,ZA +702429184,702431231,TZ +702431232,702433279,NG +702433280,702434303,SS +702434304,702435327,NG +702437376,702439423,TZ +702439424,702441471,MU +702441472,702443519,ZA +702443520,702445567,GQ +702445568,702447615,ZA +702447616,702449663,EG +702449664,702451711,ZA +702451712,702453759,NG +702453760,702457855,ZA +702457856,702459903,EG +702459904,702461951,TZ +702461952,702463999,MW +702464000,702465023,BJ +702465024,702466047,CD +702466048,702467071,AO +702467072,702468095,SC +702468096,702469119,NG +702469120,702470143,ZA +702470144,702471167,CD +702471168,702474239,ZA +702474240,702475263,GH +702475264,702476287,AO +702476288,702477311,ZM +702477312,702478335,RW +702478336,702480383,AO +702481408,702482431,TZ +702482432,702483455,ZA +702484480,702485503,TZ +702485504,702486527,EG +702486528,702487551,ZA +702487552,702488575,CM +702488576,702490623,ZA +702490624,702491647,AO +702491648,702492671,NG +702492672,702493695,GN +702493696,702493962,EG +702493963,702493963,PH +702493964,702494719,EG +702494720,702495743,KE +702495744,702496767,ZA +702496768,702497791,NG +702498816,702499839,BW +702499840,702500863,MU +702500864,702501887,NA +702501888,702502911,UG +702502912,702503935,CG +702503936,702504959,CM +702504960,702505983,MR +702505984,702507007,AO +702507008,702508031,CD +702508032,702509055,SO +702509056,702509391,KE +702509392,702509399,AO +702509400,702509471,KE +702509472,702509479,CD +702509480,702509911,KE +702509912,702509919,AO +702509920,702510079,KE +702510080,702511103,ZM +702511104,702512127,ZA +702512128,702513151,MZ +702513152,702514175,NG +702514176,702515199,SL +702515200,702516223,NG +702516224,702517247,BW +702517248,702518271,NG +702518272,702519295,KE +702519296,702520319,MZ +702520320,702521343,AO +702521344,702522367,SD +702522368,702523391,AO +702523392,702524415,GA +702524416,702525439,ZA +702525440,702526463,DZ +702526464,702527487,TZ +702527488,702528511,CF +702528512,702529535,CG +702529536,702530559,BW +702530560,702531583,EG +702531584,702532607,SD +702532608,702533631,SC +702534656,702535679,GM +702535680,702536703,SC +702536704,702538751,MU +702538752,702539775,TZ +702539776,702540799,BF +702540800,702541823,DZ +702541824,702542847,EG +702542848,702543871,ZA +702543872,702544895,BJ +702544896,702545919,ZA +702545920,703070207,TN +703070208,703071999,EG +703072000,703072255,CD +703072256,703594495,EG +703594496,703725567,SD +703725568,703727615,KE +703727616,703728639,TZ +703728640,703733759,LY +703733760,703735807,CI +703735808,703737855,ZA +703737856,703746047,NG +703746048,703747071,ZA +703747072,703748095,CD +703748096,703749119,GN +703749120,703750143,NG +703750144,703754239,MG +703754240,703755263,GH +703755264,703756287,YT +703756288,703757311,ZA +703757312,703758335,RE +703758336,703759359,CD +703760384,703761407,GH +703761408,703762431,RW +703762432,703764479,MU +703766528,703770623,ZA +703770624,703774719,BJ +703774720,703791103,ZA +703791104,703856639,CD +703856640,703922175,CM +703954944,703987711,NG +703987712,704118783,ZA +704118784,704380927,MA +704380928,704643071,LY +704643072,704644095,CN +704644096,704645119,BD +704645120,704650239,CN +704650240,704651263,MY +704651264,704659455,CN +704659456,704675839,TW +704675840,704723967,CN +704723968,704724991,MY +704724992,704741375,VN +704741376,704774143,CN +704774144,704905215,HK +704905216,705167359,CN +705167360,707788799,KR +707788800,708575231,CN +708575232,708706303,SG +708706304,708751359,CN +708751360,708752383,ID +708752384,708755455,CN +708755456,708771839,AU +708771840,708837375,CN +708837376,709885951,TW +709885952,710017023,CN +710017024,710082559,KR +710082560,710098943,JP +710098944,710104063,CN +710104064,710105087,PK +710105088,710934527,CN +710934528,710950911,VN +710950912,710961151,CN +710961152,710962175,TH +710962176,711065599,CN +711065600,711131135,HK +711131136,711160831,CN +711160832,711161855,HK +711161856,711163903,CN +711163904,711164727,JP +711164728,711164735,HK +711164736,711166463,JP +711166464,711166591,HK +711166592,711169311,JP +711169312,711169327,IN +711169328,711173247,JP +711173248,711173375,SG +711173376,711196671,JP +711196672,711458815,CN +711458816,711983103,IN +711983104,712179711,VN +712179712,712212479,KH +712212480,712507391,VN +712507392,712712191,CN +712712192,712713215,JP +712713216,712769535,CN +712769536,713031679,JP +713031680,714080255,CN +714080256,714604543,JP +714604544,714866687,MY +714866688,714874879,CN +714874880,714875903,MY +714875904,716930047,CN +716930048,716931071,JP +716931072,716963839,CN +716963840,717225983,MY +717225984,717750271,CN +717750272,717815807,HK +717815808,717848575,CN +717848576,717881343,PK +717881344,720437247,CN +720437248,720502783,AU +720502784,721420287,CN +721420288,728883199,JP +728883200,728883327,CZ +728883328,728883455,BG +728883456,728883583,HU +728883584,728883711,RS +728883712,728883839,SI +728883840,728883967,BA +728883968,728884095,HR +728884096,728884223,SK +728884224,733944831,JP +733944832,733945855,US +733945856,736100351,JP +736100352,736101375,IN +736101376,736102399,HK +736102400,736103423,IN +736103424,736104447,CN +736104448,736105471,ID +736105472,736106495,TW +736106496,736107519,CN +736107520,736108543,HK +736108544,736109567,JP +736109568,736110591,LA +736110592,736111615,MM +736111616,736112639,CN +736112640,736113663,HK +736113664,736115711,CN +736115712,736116735,AU +736116736,736119807,CN +736119808,736120831,AU +736120832,736121855,CN +736121856,736122879,MM +736122880,736123903,MO +736123904,736124927,HK +736124928,736125951,IN +736125952,736126975,CN +736126976,736127999,KR +736128000,736131071,BD +736131072,736132095,NZ +736132096,736133119,LK +736133120,736136191,IN +736136192,736137215,JP +736137216,736138239,CN +736138240,736139263,HK +736139264,736140287,SG +736140288,736141311,IN +736141312,736142335,CN +736142336,736143359,IN +736143360,736144383,ID +736144384,736145407,IN +736145408,736146431,CN +736146432,736147455,IN +736147456,736148479,CN +736148480,736149503,NZ +736149504,736150527,NC +736150528,736151551,HK +736151552,736156671,CN +736156672,736157695,IN +736157696,736158719,CN +736158720,736160767,HK +736160768,736161791,PK +736161792,736162815,CN +736162816,736163839,HK +736163840,736164351,TW +736164352,736164863,NZ +736164864,736166911,IN +736166912,736167935,SG +736167936,736168959,HK +736168960,736169983,AU +736169984,736173055,IN +736173056,736174079,HK +736174080,736175103,AU +736175104,736176127,HK +736176128,736177151,BN +736177152,736178175,HK +736178176,736178431,AU +736178432,736178432,NZ +736178433,736179199,AU +736179200,736180223,AE +736180224,736181247,HK +736181248,736182271,AU +736182272,736183295,ID +736183296,736185343,IN +736185344,736186367,CN +736186368,736187391,IN +736187392,736188415,CN +736188416,736189439,JP +736189440,736190463,IN +736190464,736191487,PK +736191488,736193535,HK +736193536,736194559,MY +736194560,736195583,NZ +736195584,736196607,IN +736196608,736198655,CN +736198656,736199679,AU +736199680,736200703,HK +736200704,736201727,BN +736201728,736202751,CN +736202752,736203775,AU +736203776,736204799,BD +736204800,736205823,SG +736205824,736206847,HK +736206848,736209919,IN +736209920,736210943,CN +736210944,736211967,AU +736211968,736212991,CN +736212992,736214015,ID +736214016,736216063,IN +736216064,736217087,HK +736217088,736218111,NZ +736218112,736219135,BD +736219136,736220159,CN +736220160,736221183,IN +736221184,736229375,CN +736229376,736230399,IN +736230400,736231423,CN +736231424,736231935,AU +736231936,736232447,IN +736232448,736233471,PH +736233472,736234495,NZ +736234496,736235519,KH +736235520,736237567,HK +736237568,736239615,IN +736239616,736263167,CN +736263168,736264191,HK +736264192,736286719,CN +736286720,736287743,NZ +736287744,736288767,MV +736288768,736289791,MY +736289792,736289919,KR +736289920,736290047,JP +736290048,736290303,AU +736290304,736290559,MY +736290560,736290815,KR +736290816,736291839,TW +736291840,736300031,CN +736300032,736301055,HK +736301056,736303103,IN +736303104,736304127,TW +736304128,736305151,HK +736305152,736324607,CN +736324608,736325631,AU +736325632,736326655,HK +736326656,736328703,KR +736328704,736329727,AU +736329728,736331775,IN +736331776,736334847,CN +736334848,736335871,ID +736335872,736354303,CN +736354304,736355327,IN +736355328,736356351,SG +736356352,736357375,CN +736357376,736358399,HK +736358400,736359423,SG +736359424,736360447,IN +736360448,736380927,CN +736380928,736381951,IN +736381952,736382975,CN +736382976,736383999,TH +736384000,736385023,LA +736385024,736386047,HK +736386048,736388095,IN +736388096,736389119,CN +736389120,736390143,JP +736390144,736391167,LK +736391168,736392191,IN +736392192,736394239,CN +736394240,736395007,SG +736395008,736395263,HK +736395264,736396287,MN +736396288,736398335,CN +736398336,736399359,IN +736400384,736402431,CN +736402432,736402687,NZ +736402688,736402943,SG +736402944,736403071,MY +736403072,736403199,BN +736403200,736403327,AU +736403328,736403455,PK +736403456,736404479,KR +736405504,736406527,IN +736407552,736408575,IN +736408576,736409599,HK +736409600,736410623,US +736410624,736411647,CN +736411648,736412671,NP +736412672,736413695,TH +736413696,736414719,MY +736414720,736415743,HK +736415744,736416767,BD +736416768,736417791,SG +736417792,736418815,HK +736418816,736421887,IN +736421888,736422911,SG +736422912,736423935,IN +736423936,736424959,HK +736424960,736428031,MY +736428032,736429055,IN +736429056,736430079,HK +736430080,736431103,IN +736431104,736432127,BD +736432128,736433151,CN +736433152,736434175,ID +736434176,736435199,IN +736435200,736436223,HK +736436224,736437247,JP +736437248,736438271,HK +736438272,736439295,CN +736439296,736440319,TH +736440320,736441343,CN +736441344,736442367,HK +736442368,736443391,CN +736443392,736445439,AU +736445440,736446463,TH +736446464,736447487,IN +736447488,736448511,TH +736448512,736449535,IN +736449536,736450559,SG +736450560,736452607,IN +736452608,736453631,CN +736453632,736455679,IN +736455680,736458751,HK +736458752,736459775,CN +736459776,736460799,BT +736460800,736461823,SG +736461824,736462847,TH +736462848,736465919,CN +736465920,736466943,TH +736466944,736467967,HK +736467968,736468991,SG +736468992,736470015,IN +736470016,736471039,PK +736471040,736479231,CN +736479232,736480255,IN +736480256,736481279,ID +736481280,736482303,BD +736482304,736483327,HK +736483328,736485375,CN +736485376,736486399,IN +736487424,736489471,CN +736489472,736491519,JP +736491520,736493567,ID +736493568,736494591,KR +736494592,736495103,ID +736495104,736495359,NR +736495360,736495615,ID +736495616,736498687,HK +736498688,736499711,CN +736499712,736500479,SG +736500480,736500735,TH +736500736,736501759,ID +736501760,736502783,CN +736502784,736505855,IN +736505856,736506879,AU +736506880,736508927,JP +736508928,736509951,KH +736509952,736510975,AU +736510976,736513023,CN +736513024,736515071,KR +736515072,736516095,CN +736516096,736517119,HK +736517120,736518143,PK +736518144,736519167,HK +736519168,736520191,AU +736520192,736521215,IN +736521216,736521747,AU +736521748,736521748,US +736521749,736522239,AU +736522240,736524287,HK +736524288,736525311,BD +736525312,736526335,CN +736526336,736527359,ID +736527360,736528383,IN +736528384,736529407,CN +736529408,736531455,HK +736531456,736532479,IN +736532480,736533503,ID +736533504,736535551,IN +736535552,736536575,HK +736536576,736537599,CN +736537600,736538623,IN +736538624,736539647,AU +736539648,736540671,SG +736540672,736541695,IN +736541696,736542719,HK +736542720,736543743,KH +736543744,736545791,IN +736545792,736546815,HK +736546816,736547071,BT +736547072,736547327,AF +736547328,736547839,BD +736547840,736548863,IN +736548864,736549887,KR +736549888,736559103,CN +736559104,736560127,HK +736560128,736561151,MY +736561152,736562175,HK +736562176,736563199,SG +736563200,736564223,HK +736564224,736565247,BD +736565248,736566271,AU +736566272,736567295,MV +736567296,736571391,CN +736571392,736574463,IN +736574464,736575487,PK +736575488,736576511,KH +736576512,736577535,AU +736577536,736578559,MY +736578560,736579583,BD +736579584,736587775,CN +736587776,736588799,MN +736588800,736591871,IN +736591872,736592383,ID +736592384,736592639,SG +736592640,736592895,AF +736592896,736593919,IN +736593920,736606207,CN +736606208,736607231,HK +736607232,736608255,JP +736608256,736609279,NZ +736609280,736610303,CN +736610304,736611327,AU +736611328,736612351,IN +736612352,736613375,NP +736613376,736615423,IN +736615424,736616447,JP +736616448,736617471,MY +736617472,736618495,PH +736618496,736621567,IN +736621568,736622591,JP +736622592,736624639,IN +736624640,736886783,JP +736886784,737096703,CN +737096704,737099775,IN +737099776,737100799,HK +737100800,737101823,IN +737101824,737102847,BD +737102848,737104895,IN +737104896,737105919,HK +737105920,737106943,IN +737106944,737108991,NZ +737108992,737109503,SG +737109504,737109759,AU +737109760,737110015,SG +737110016,737111039,JP +737111040,737113087,IN +737113088,737115135,CN +737115136,737118207,IN +737118208,737119231,HK +737119232,737119999,NL +737120000,737121279,IN +737121280,737122303,VN +737122304,737123327,IN +737123328,737126399,HK +737126400,737127423,IN +737127424,737129471,CN +737129472,737130495,NZ +737130496,737132543,VN +737132544,737139711,IN +737139712,737141759,VN +737141760,737142783,IN +737142784,737143039,HK +737143040,737143807,MY +737143808,737146879,IN +737146880,737147391,US +737147392,737147903,NZ +737147904,737148927,MY +737148928,737149951,CN +737149952,737151999,IN +737152000,737154047,HK +737154048,737155071,MY +737155072,737156095,TW +737156096,737157119,HK +737157120,737158143,NZ +737158144,737159167,HK +737159168,737160191,AU +737160192,737161215,TW +737161216,737162239,CN +737162240,737163263,BD +737163264,737165311,CN +737165312,737166335,IN +737166336,737169407,CN +737169408,737170431,ID +737170432,737171455,CN +737171456,737172479,GU +737172480,737173503,HK +737173504,737174527,AU +737174528,737175551,BD +737175552,737177599,TW +737177600,737178623,AU +737178624,737179647,HK +737179648,737180671,AU +737180672,737184767,CN +737184768,737185791,VU +737185792,737186815,HK +737186816,737187839,ID +737187840,737188863,TW +737188864,737206271,CN +737206272,737208319,ID +737208320,737209343,AU +737209344,737220607,CN +737220608,737222655,IN +737222656,737223679,TW +737223680,737224703,IN +737224704,737224959,MY +737224960,737224971,AU +737224972,737225215,IN +737225216,737225223,AU +737225224,737225727,IN +737225728,737225983,KR +737225984,737226751,HK +737226752,737227775,CN +737227776,737228799,AU +737228800,737229823,TH +737229824,737232895,IN +737232896,737233919,HK +737233920,737239039,CN +737239040,737240063,MY +737240064,737241087,HK +737241088,737243135,KR +737243136,737244159,CN +737244160,737249279,IN +737249280,737250303,BT +737250304,737252351,IN +737252352,737253375,ID +737253376,737255423,HK +737255424,737256447,TW +737256448,737257471,WS +737257472,737262591,CN +737262592,737263615,AU +737263616,737264639,IN +737264640,737265663,CN +737265664,737266687,AU +737266688,737267711,HK +737267712,737276927,CN +737276928,737277951,IN +737277952,737279999,CN +737280000,737281023,KR +737281024,737282047,SG +737282048,737288191,CN +737288192,737289215,HK +737289216,737290239,IN +737290240,737291263,AU +737291264,737297407,CN +737297408,737298431,AU +737298432,737305599,CN +737305600,737306623,PK +737306624,737307647,IN +737307648,737308671,MY +737308672,737309695,KR +737309696,737312767,IN +737312768,737313791,HK +737313792,737314303,ID +737314304,737314815,MM +737314816,737315839,JP +737315840,737316863,HK +737316864,737324031,CN +737324032,737325055,HK +737325056,737326079,PK +737326080,737327103,CN +737327104,737328127,SG +737328128,737331199,CN +737331200,737332223,HK +737332224,737333247,CN +737333248,737335295,IN +737335296,737337343,CN +737337344,737339391,IN +737339392,737341439,HK +737341440,737342463,MN +737342464,737343487,IN +737343488,737344511,AU +737344512,737345535,CN +737345536,737346559,AU +737346560,737350655,CN +737350656,737350911,AU +737350912,737351679,NZ +737351680,737352703,CN +737352704,737354751,HK +737354752,737355775,IN +737355776,737356287,HK +737356288,737356799,GB +737356800,737359871,HK +737359872,737361919,NZ +737361920,737364991,HK +737364992,737367039,IN +737367040,737367807,GB +737367808,737368063,DE +737368064,737369087,CN +737369088,737370111,HK +737370112,737371135,NP +737371136,737375231,HK +737375232,737375743,AU +737375744,737375999,SG +737376000,737376255,AU +737376256,737377279,HK +737377280,737378303,PH +737378304,737379327,CN +737379328,737380351,BD +737380352,737381375,CN +737381376,737382399,ID +737382400,737384447,CN +737384448,737385471,ID +737385472,737386495,CN +737386496,737387519,MN +737387520,737388543,HK +737388544,737389567,CN +737389568,737390591,IN +737390592,737391615,HK +737391616,737392639,CN +737392640,737393663,ID +737393664,737394687,CN +737394688,737395711,HK +737395712,737396735,NZ +737396736,737397759,AU +737397760,737398783,BD +737398784,737399807,HK +737399808,737400831,IN +737400832,737401855,KR +737401856,737403903,HK +737403904,737405951,CN +737405952,737406975,AU +737406976,737407999,HK +737408000,737409023,CN +737409024,737410047,HK +737410048,737411071,TW +737411072,737476607,JP +737476608,737478655,IN +737478656,737479679,PK +737479680,737480703,IN +737480704,737481727,SG +737481728,737482751,IN +737482752,737484799,AU +737484800,737485823,KH +737485824,737487871,AU +737487872,737488895,MM +737488896,737489151,AU +737489152,737489407,SG +737489408,737489919,HK +737489920,737490943,NZ +737490944,737491967,FJ +737491968,737492447,SG +737492448,737492479,MY +737492480,737492735,SG +737492736,737492991,HK +737492992,737497087,AU +737497088,737498111,NZ +737498112,737499135,NP +737499136,737500159,IN +737500160,737501183,NP +737501184,737502207,SG +737502208,737503231,IN +737503232,737505279,SG +737505280,737506303,AU +737506304,737508351,BD +737508352,737509375,MY +737509376,737510399,PK +737510400,737511423,AU +737511424,737512447,IN +737512448,737513471,BD +737513472,737514495,TH +737514496,737515519,IN +737515520,737516543,AU +737516544,737517567,IN +737517568,737519615,AU +737519616,737519871,HK +737519872,737520127,SG +737520128,737520639,AU +737520640,737521663,NZ +737521664,737522687,AU +737522688,737525759,ID +737525760,737526783,BD +737526784,737527295,US +737527296,737527551,SG +737527552,737527807,ID +737527808,737528831,KH +737528832,737529855,PK +737529856,737530879,IN +737530880,737531903,NC +737531904,737532927,KH +737532928,737533183,HK +737533184,737533184,PH +737533185,737533439,MY +737533440,737533695,VN +737533696,737533951,TW +737533952,737534975,AU +737534976,737535999,SG +737536000,737537023,BD +737537024,737538047,NP +737538048,737539071,NZ +737539072,737540095,BD +737540096,737541119,ID +737541120,737542143,SG +737542144,737567743,CN +737567744,737570815,IN +737570816,737571839,CN +737571840,737572863,HK +737572864,737574911,IN +737574912,737575935,JP +737575936,737576959,HK +737576960,737581055,IN +737581056,737582079,KR +737582080,737584127,IN +737584128,737585151,MY +737585152,737587199,HK +737587200,737588223,MY +737588224,737589247,KR +737589248,737590271,TH +737590272,737591295,TW +737591296,737593343,JP +737593344,737594367,BD +737594368,737596415,HK +737596416,737597439,CN +737597440,737598463,TW +737598464,737600511,PK +737600512,737601535,CN +737601536,737602559,AU +737602560,737607679,IN +737607680,737608703,HK +737608704,737610751,CN +737610752,737611775,ID +737611776,737612799,PH +737612800,737613823,ID +737613824,737614847,MO +737614848,737615871,IN +737615872,737617919,ID +737617920,737618943,IN +737618944,737620991,CN +737620992,737622015,IN +737622016,737623039,TH +737623040,737624063,GU +737624064,737625087,AU +737625088,737626111,CN +737626112,737627135,CA +737627136,737628159,CN +737628160,737629183,AU +737629184,737634303,CN +737634304,737635327,KR +737635328,737637375,CN +737637376,737638399,AU +737638400,737639423,PK +737639424,737641471,AU +737641472,737642495,HK +737642496,737645567,IN +737645568,737647615,CN +737647616,737649663,IN +737649664,737650687,HK +737650688,737651711,JP +737651712,737652735,NZ +737652736,737656831,CN +737656832,737657855,KR +737657856,737675263,CN +737675264,737676287,HK +737676288,737677311,PK +737677312,737678335,TW +737678336,737679359,CN +737679360,737680383,ID +737680384,737681407,CN +737681408,737683455,IN +737683456,737684479,JP +737684480,737685503,AU +737685504,737686527,CN +737686528,737687551,AU +737688576,737690623,HK +737690624,737692671,IN +737692672,737712127,CN +737712128,737713151,IN +737713152,737714175,FM +737714176,737715199,JP +737715200,737718271,HK +737718272,737727487,CN +737727488,737728511,ID +737728512,737729535,JP +737729536,737730559,IN +737730560,737731583,HK +737731584,737733631,CN +737733632,737735679,IN +737735680,737736703,CN +737736704,737737727,HK +737737728,737738751,IN +737738752,737741823,CN +737741824,737742847,SG +737742848,737744895,HK +737744896,737745919,CN +737745920,737746943,HK +737746944,737747967,TH +737747968,737748479,HK +737748480,737748991,SG +737748992,737750015,AF +737750016,737751039,JP +737751040,737753087,IN +737753088,737757183,TH +737757184,737757439,JP +737757440,737757695,HK +737757696,737757951,AU +737757952,737758207,SG +737758208,737760255,HK +737760256,737761279,IN +737761280,737762303,HK +737762304,737763327,JP +737763328,737765375,HK +737765376,737768447,TH +737768448,737769471,AU +737769472,737770495,CN +737770496,737771519,HK +737771520,737771647,KR +737771648,737771775,JP +737771776,737771903,KR +737771904,737772159,JP +737772160,737772287,KR +737772288,737772415,JP +737772416,737772543,KR +737772544,737774591,CN +737774592,737775615,ID +737775616,737782783,CN +737782784,737783807,HK +737783808,737784831,PF +737784832,737787903,IN +737787904,737788927,CN +737788928,737790975,NZ +737790976,737791999,HK +737792000,737793023,ID +737793024,737794047,SG +737794048,737795071,IN +737795072,737796095,HK +737796096,737799167,IN +737799168,737800191,CN +737800192,737802239,JP +737802240,737803263,SG +737803264,737804287,HK +737804288,737805311,SG +737805312,737806335,CN +737806336,737807359,HK +737807360,737810431,CN +737810432,737811455,AU +737811456,737814527,CN +737814528,737815551,IN +737815552,737816575,TW +737816576,737817599,HK +737817600,737818623,AU +737818624,737821695,HK +737821696,737822719,AU +737822720,737823743,CN +737823744,737824767,ID +737824768,737825791,BD +737825792,737826815,PK +737826816,737827839,JP +737827840,737828863,AU +737828864,737835007,CN +737835008,737836031,IN +737836032,737837055,MN +737837056,737838079,CN +737838080,737839103,IN +737839104,737840127,AF +737840128,737841151,AU +737841152,737843199,CN +737843200,737844223,KR +737844224,737845247,IN +737845248,737846271,CN +737846272,737847295,IN +737847296,737850367,CN +737851392,737853439,HK +737853440,737854463,SG +737854464,737855487,JP +737855488,737856511,CN +737856512,737857535,AU +737857536,737858559,IN +737858560,737861631,CN +737861632,737862655,PH +737862656,737863679,JP +737863680,737864447,AU +737864448,737864703,HK +737864704,737865727,CN +737865728,737866751,LK +737866752,737867775,CN +737867776,737868031,AU +737868032,737868287,US +737868288,737868799,AU +737868800,737870847,IN +737870848,737873919,CN +737873920,737874431,HK +737874432,737874943,IN +737875968,737876991,HK +737876992,737878015,KR +737878016,737878271,HK +737878272,737878783,JP +737878784,737879039,HK +737879040,737880063,CN +737880064,737881087,AU +737881088,737882111,HK +737882112,737883135,JP +737883136,737884159,AU +737884160,737886207,TW +737886208,737887231,PH +737887232,737888255,KR +737888256,737889279,IN +737889280,737890303,HK +737890304,737894399,IN +737894400,737895423,ID +737895424,737896447,CN +737896448,737897471,HK +737897472,737898495,AU +737898496,737899519,MY +737899520,737900543,CN +737900544,737901567,KR +737901568,737902591,IN +737902592,737903615,BN +737903616,737904639,HK +737904640,737905663,MY +737905664,737906687,HK +737906688,737908735,IN +737908736,737909759,AU +737909760,737910783,HK +737910784,737911807,DE +737911808,737912319,SG +737912320,737912575,AU +737912576,737912703,SG +737912704,737912831,MY +737912832,737915903,IN +737915904,737916927,US +737916928,737917951,JP +737917952,737918975,IN +737918976,737919999,CN +737920000,737921023,HK +737921024,737922047,AU +737922048,737923071,NZ +737923072,737924095,MY +737924096,737927167,IN +737927168,737929215,HK +737929216,737931263,CN +737931264,737932287,AU +737932288,737933311,CN +737933312,737934335,HK +737934336,737935359,TH +737935360,737936383,AU +737936384,737937407,IN +737937408,737938431,ID +737938432,737939455,LK +737939456,737940479,KH +737940480,737941503,AU +737941504,737944575,IN +737944576,737945599,MY +737945600,737946623,HK +737946624,737947647,MY +737947648,737948671,CN +737948672,737949695,HK +737949696,737950719,CN +737950720,737951743,IN +737951744,737953791,NZ +737953792,737954815,ID +737954816,737955839,AU +737955840,737956351,US +737956352,737956479,CH +737956480,737956607,AT +737956608,737956735,BE +737956736,737956863,NL +737956864,737957887,HK +737957888,737959935,IN +737959936,737960959,AU +737960960,737961983,IN +737961984,737963007,ID +737963008,737965055,AU +737965056,737966079,IN +737966080,737967103,TH +737967104,737969151,AU +737969152,737970175,HK +737970176,737971199,ID +737971200,737972223,IN +737972224,737973247,ID +737973248,737974271,HK +737974272,737975295,IN +737975296,737976319,ID +737976320,737981439,HK +737981440,737981695,US +737981696,737981823,IT +737981824,737981951,PT +737981952,737982207,ES +737982208,737982463,PL +737982464,737983487,ID +737983488,737986559,IN +737986560,737987583,HK +737987584,737988607,IN +737988608,737989631,HK +737989632,737991679,MY +737991680,737992191,IN +737992192,737992703,ID +737992704,737993727,CN +737993728,737994751,HK +737994752,737995775,MY +737995776,737996799,ID +737996800,737997823,IN +737997824,737998847,LA +737998848,737999871,IN +737999872,738000895,AU +738000896,738066431,JP +738066432,738069503,CN +738069504,738070527,PK +738070528,738071551,TW +738071552,738072575,NZ +738072576,738073599,CN +738073600,738075647,IN +738075648,738076671,CN +738076672,738077695,IN +738077696,738078719,CN +738078720,738079743,IN +738079744,738080767,CN +738080768,738081791,TL +738081792,738082815,TW +738082816,738083839,CN +738083840,738084863,ID +738084864,738085887,CN +738085888,738086911,MY +738086912,738087935,ID +738087936,738091007,CN +738091008,738092031,BD +738092032,738094079,CN +738094080,738095103,IN +738095104,738097151,CN +738097152,738098175,MY +738098176,738099199,ID +738099200,738100223,CN +738100224,738101247,TH +738101248,738107391,CN +738107392,738108415,IN +738108416,738109439,HK +738109440,738111487,CN +738111488,738112511,IN +738112512,738118655,CN +738118656,738119679,IN +738119680,738120703,CN +738120704,738121727,IN +738121728,738122751,HK +738122752,738128895,CN +738128896,738129919,KR +738129920,738135039,CN +738135040,738136063,TW +738136064,738137087,CN +738137088,738138111,BD +738138112,738138623,US +738138624,738139135,NZ +738139136,738140159,HK +738140160,738141183,AU +738141184,738142207,HK +738142208,738143231,JP +738143232,738144255,AU +738144256,738145279,CN +738145280,738146303,HK +738146304,738147327,IN +738147328,738148095,TH +738148096,738148351,AU +738148352,738152447,CN +738152448,738152703,JP +738152704,738152959,MY +738152960,738153215,JP +738153216,738153471,AU +738153472,738154495,CN +738154496,738156543,TW +738156544,738157567,CN +738157568,738158591,SG +738158592,738159615,HK +738159616,738160639,CN +738160640,738161663,KH +738161664,738163711,HK +738163712,738164735,SG +738164736,738165759,AU +738165760,738166783,IN +738166784,738167807,AU +738167808,738168831,IN +738168832,738169855,CN +738169856,738170879,TO +738170880,738171903,SG +738171904,738172927,HK +738172928,738173951,NZ +738173952,738174975,IN +738174976,738175999,CN +738176000,738177023,MY +738177024,738178047,CN +738178048,738179071,TW +738179072,738180095,CN +738180096,738180607,HK +738180608,738180863,US +738180864,738181119,HK +738181120,738182143,CN +738182144,738183167,ID +738183168,738187263,CN +738187264,738188287,PH +738188288,738189311,IN +738189312,738192383,CN +738192384,738193407,NC +738193408,738194431,TH +738194432,738195455,CN +738195456,738197503,KR +738197504,746786303,US +746786304,746786559,GB +746786560,746973439,US +746973440,746973695,ES +746973696,747175935,US +747175936,747241471,NL +747241472,747372543,US +747372544,747438079,SE +747438080,747671807,US +747671808,747672063,GB +747672064,755105791,US +755105792,755179519,CA +755179520,755236863,US +755236864,755237673,CL +755237674,755237674,US +755237675,755237887,CL +755237888,755258367,BR +755258368,755259391,HN +755259392,755260415,EC +755260416,755261439,AR +755261440,755261695,BR +755261696,755261951,AR +755261952,755262463,BO +755262464,755263487,AR +755263488,755269631,BR +755269632,755270655,HN +755270656,755271679,BR +755271680,755272703,HN +755272704,755277823,BR +755277824,755279871,AR +755279872,755280895,CL +755280896,755281919,HN +755281920,755287039,BR +755287040,755288063,HN +755288064,755289087,EC +755289088,755290111,HN +755290112,755292159,BR +755292160,755293183,AR +755293184,755301375,BR +755301376,755303423,AR +755303424,755304447,BR +755304448,755305471,DO +755305472,755305727,SV +755305728,755305983,BO +755305984,755306239,BR +755306240,755306495,AR +755306496,755307519,BR +755307520,755309567,AR +755309568,755310591,HN +755310592,755315711,BR +755315712,755316735,MX +755316736,755317759,PE +755317760,755318783,CR +755318784,755319807,HN +755319808,755320831,PE +755320832,755321855,BR +755321856,755322879,HN +755322880,755325951,BR +755325952,755326975,MX +755326976,755332095,BR +755332096,755333119,GT +755333120,755335167,CL +755335168,755340287,BR +755340288,755342335,AR +755342336,755343359,BR +755343360,755345407,CO +755345408,755346431,BR +755346432,755347455,CO +755347456,755348479,BR +755348480,755351551,CO +755351552,755357695,BR +755357696,755358719,NI +755358720,755368959,BR +755368960,755371007,AR +755371008,755378175,BR +755378176,755379199,DO +755379200,755381247,HN +755381248,755383295,BR +755383296,755384319,MX +755384320,755385343,BR +755385344,755386367,AR +755386368,755394559,BR +755394560,755395583,AR +755395584,755401727,BR +755401728,755402751,AR +755402752,755403775,BR +755403776,755404799,MX +755404800,755419135,BR +755419136,755420159,US +755420160,755422207,BR +755422208,755423231,AR +755423232,755425279,BR +755425280,755426303,EC +755426304,755431423,BR +755431424,755433471,UY +755433472,755440639,BR +755440640,755441663,MX +755441664,755444735,BR +755444736,755445759,MX +755445760,755454975,BR +755454976,755457023,AR +755457024,755458047,CL +755458048,755459071,AR +755459072,755465215,BR +755465216,755466239,AR +755466240,755467263,BR +755467264,755468287,CO +755468288,755469311,MX +755469312,755470335,CR +755470336,755486719,BR +755486720,755487743,AR +755487744,755491839,BR +755491840,755492863,CL +755492864,755493887,BR +755493888,755494911,HN +755494912,755499007,AR +756023296,757071871,US +757071872,757071911,NL +757071912,757071919,US +757071920,757071951,NL +757071952,757071975,US +757071976,757071991,NL +757071992,757071999,US +757072000,757072063,NL +757072064,757072103,US +757072104,757072127,NL +757072128,757072383,US +757072384,757072639,NL +757072640,757072703,US +757072704,757072711,NL +757072712,757072727,US +757072728,757072775,NL +757072776,757072791,US +757072792,757072895,NL +757072896,757072903,US +757072904,757072911,NL +757072912,757072919,US +757072920,757073007,NL +757073008,757073023,US +757073024,757073047,NL +757073048,757073055,US +757073056,757073103,NL +757073104,757073127,US +757073128,757073151,NL +757073152,757073919,US +757073920,757079615,JP +757079616,757079679,NL +757079680,757088255,JP +757088256,757096447,US +757096448,757104639,SG +757104640,757108223,US +757108224,757108415,NL +757108416,757108671,US +757108672,757108735,NL +757108736,757110523,FR +757110524,757110524,TF +757110525,757110783,FR +757110784,757112831,DE +757112832,757116927,US +757116928,757118975,GB +757118976,757119999,NL +757120000,757121023,AU +757121024,757125119,US +757125120,757125151,NL +757125152,757125215,US +757125216,757125247,NL +757125248,757125503,US +757125504,757125631,NL +757125632,757131263,US +757131264,757133311,NL +757133312,757135359,AU +757135360,757137407,JP +757137408,757176319,US +757176320,757176575,FR +757176576,757186559,US +757186560,757190655,CA +757190656,757600255,US +757600256,757604351,CA +757604352,757612543,US +757612544,757616639,CA +757616640,757645311,US +757645312,757645567,NZ +757645568,757661695,CN +757661696,757661951,NZ +757661952,757662719,US +757662720,757662975,IN +757662976,757686271,US +757686272,757694463,CA +757694464,757696255,US +757696256,757696511,JP +757696512,757697535,DE +757697536,757711871,US +757711872,757712127,AU +757712128,757714175,US +757714176,757714431,JP +757714432,757716735,US +757716736,757716991,NZ +757716992,757721599,US +757721600,757721855,PH +757721856,757727231,US +757727232,757728255,VI +757728256,757729279,US +757729280,757731327,CA +757731328,757733375,US +757733376,757734399,CA +757734400,757736447,US +757736448,757737471,CA +757737472,757745663,US +757745664,757747711,CA +757747712,757751807,US +757751808,757759999,CA +757760000,757760255,US +757760256,757760511,ML +757760512,757761535,US +757761536,757761791,MW +757761792,757762047,US +757762048,757762303,MV +757762304,757762559,JP +757762560,757762815,PH +757762816,757763071,CD +757763072,757763327,US +757763328,757763583,PA +757763584,757763839,MN +757763840,757764095,VA +757764096,757764351,ZW +757764352,757765375,US +757765376,757765631,SD +757765632,757766655,US +757766656,757766911,BI +757766912,757767167,US +757767168,757767423,CC +757767424,757767935,US +757767936,757768191,MU +757768192,757768447,US +757768448,757768703,AD +757768704,757769215,US +757769216,757769471,SL +757769472,757769727,US +757769728,757769983,NZ +757769984,757770239,GU +757770240,757770495,US +757770496,757770751,TG +757770752,757771007,US +757771008,757771263,FJ +757771264,757771519,CW +757771520,757771775,SB +757771776,757772031,ER +757772032,757772287,US +757772288,757772543,NR +757772544,757773055,US +757773056,757773311,MR +757773312,757774335,US +757774336,757774591,LR +757774592,757774847,US +757774848,757775103,MC +757775104,757776639,US +757776640,757776767,GQ +757776768,757777919,US +757777920,757778047,LS +757778048,757779199,US +757779200,757779327,CV +757779328,757780479,US +757780480,757780607,CF +757780608,757780991,US +757780992,757781247,SM +757781248,757781503,US +757781504,757781759,TO +757781760,757781887,GW +757781888,757783039,US +757783040,757783167,GM +757783168,757783551,US +757783552,757783807,TV +757783808,757784319,US +757784320,757784447,KM +757784448,757784575,US +757784576,757784831,SZ +757784832,757785087,CG +757785088,757785599,US +757785600,757785727,ST +757785728,757786111,US +757786112,757786367,AR +757786368,757786879,US +757786880,757787007,SO +757787008,757788159,US +757788160,757788287,LK +757788288,757789439,US +757789440,757789567,NP +757789568,757790975,US +757790976,757791231,WS +757791232,757809151,US +757809152,757809407,CA +757809408,757809663,RO +757809664,757809919,GB +757817344,757858303,US +757858304,757956607,CA +757956608,757956863,HK +757956864,757957119,DE +757957120,757957631,US +757957632,757957887,JP +757957888,757958143,GB +757958144,757958399,US +757958400,757958655,DE +757958656,757959679,US +757959680,757959935,IT +757959936,757960191,GB +757960192,757961471,US +757961472,757961727,HK +757961728,757962239,US +757962240,757962495,GB +757962496,757964031,US +757964032,757964287,GB +757964288,757965311,US +757965312,757965567,IN +757965568,757967103,US +757967104,757967359,FR +757967360,757968127,US +757968128,757968383,FR +757968384,757969151,US +757969152,757969407,FR +757969408,757971199,US +757971200,757971455,FR +757971456,758682111,US +758682112,758682367,PH +758682368,758683647,US +758683648,758683903,HK +758683904,758684159,SG +758684160,758684671,US +758684672,758684927,BR +758684928,758685183,IN +758685184,758685439,AU +758685440,758685695,JP +758685696,758691839,US +758691840,758693887,DE +758693888,758700031,US +758700032,758702079,CA +758702080,758704127,GR +758704128,758706175,NL +758706176,758710271,GR +758710272,758743039,US +758743040,758744679,CA +758744680,758744687,US +758744688,758744751,CA +758744752,758744767,US +758744768,758744879,CA +758744880,758744887,US +758744888,758745087,CA +758745088,758745727,US +758745728,758745791,CA +758745792,758745823,US +758745824,758745831,CA +758745832,758745855,US +758745856,758747135,CA +758747136,758747199,US +758747200,758747215,CA +758747216,758747231,US +758747232,758747327,CA +758747328,758747375,US +758747376,758747903,CA +758747904,758747935,US +758747936,758747951,CA +758747952,758747999,US +758748000,758748031,CA +758748032,758748159,US +758748160,758748415,CA +758748416,758748927,US +758748928,758749439,CA +758749440,758749519,US +758749520,758749535,CA +758749536,758749567,US +758749568,758749695,CA +758749696,758749951,US +758749952,758750207,CA +758750208,758750463,US +758750464,758750719,CA +758750720,758750975,US +758750976,758751039,CA +758751040,758751055,US +758751056,758751071,CA +758751072,758751167,US +758751168,758751487,CA +758751488,758751999,US +758752000,758752127,CA +758752128,758752191,US +758752192,758752199,CA +758752200,758752207,FI +758752208,758752223,US +758752224,758752239,CA +758752240,758752255,US +758752256,758752511,CA +758752512,758752671,US +758752672,758752687,CA +758752688,758752735,US +758752736,758752831,CA +758752832,758752895,US +758752896,758752927,CA +758752928,758752959,US +758752960,758753279,CA +758753280,758753535,US +758753536,758754047,CA +758754048,758754431,US +758754432,758755327,CA +758755328,758755839,US +758755840,758756351,CA +758756352,758756863,US +758756864,758756927,CA +758756928,758757055,US +758757056,758757183,CA +758757184,758757311,US +758757312,758757375,CA +758757376,758757631,US +758757632,758757887,CA +758757888,758758143,US +758758144,758759487,CA +758759488,758759615,US +758759616,758759743,CA +758759744,758759807,US +758759808,758759839,CA +758759840,758759871,US +758759872,758759935,CA +758759936,758760191,US +758760192,758760447,SC +758760448,758760703,US +758760704,758760799,CA +758760800,758760895,US +758760896,758761727,CA +758761728,758762239,US +758762240,758762495,CA +758762496,758762751,US +758762752,758764031,CA +758764032,758764287,US +758764288,758764679,CA +758764680,758764703,US +758764704,758764719,CA +758764720,758764759,US +758764760,758764767,CA +758764768,758764799,US +758764800,758764863,CA +758764864,758764927,US +758764928,758765183,CA +758765184,758765247,US +758765248,758765375,CA +758765376,758765439,US +758765440,758765631,CA +758765632,758765647,US +758765648,758765663,CA +758765664,758765695,US +758765696,758765951,CA +758765952,758765975,US +758765976,758765983,CA +758765984,758766015,US +758766016,758766103,CA +758766104,758766111,US +758766112,758766143,CA +758766144,758766303,US +758766304,758766319,CA +758766320,758766335,US +758766336,758766431,CA +758766432,758766495,US +758766496,758766527,CA +758766528,758766575,US +758766576,758766583,CA +758766584,758766847,US +758766848,758769279,CA +758769280,758769359,US +758769360,758769367,CA +758769368,758769375,US +758769376,758769663,CA +758769664,758769751,US +758769752,758769791,CA +758769792,758769855,US +758769856,758769919,CA +758769920,758770175,US +758770176,758770271,CA +758770272,758770303,US +758770304,758770431,CA +758770432,758770687,US +758770688,758770751,CA +758770752,758770847,US +758770848,758770863,CA +758770864,758771199,US +758771200,758771711,CA +758771712,758772991,US +758772992,758773759,CA +758773760,758774271,US +758774272,758775807,CA +758775808,758779903,US +758779904,758783999,CA +758784000,758785023,US +758785024,758785535,CA +758785536,758796287,US +758796288,758804479,CA +758804480,758811135,US +758811136,758811391,NL +758811392,758824959,US +758824960,758841343,CA +758841344,758847487,US +758847488,758847743,NL +758847744,758847999,US +758848000,758848255,CA +758848256,758859775,US +758859776,758861823,CA +758861824,758874367,US +758874368,758874623,AM +758874624,758875391,US +758875392,758875647,AO +758875648,758875903,BT +758875904,758876159,AZ +758876160,758876415,AU +758876416,758876671,US +758876672,758876927,SD +758876928,758877183,MH +758877184,758877439,US +758877440,758877695,KZ +758877696,758877951,IR +758877952,758878207,PG +758878208,758878463,ET +758878464,758878719,TO +758878720,758878975,KH +758878976,758879231,KG +758879232,758879487,US +758879488,758879743,GG +758879744,758879999,CD +758880000,758880255,SJ +758880256,758880511,AS +758880512,758880767,UZ +758880768,758881023,GN +758881024,758881535,US +758881536,758881791,PH +758881792,758882047,CG +758882048,758882303,TM +758882304,758882559,HM +758882560,758882815,CV +758882816,758883071,ZM +758883072,758883583,US +758883584,758883839,TJ +758883840,758884095,LI +758884096,758884351,MQ +758884352,758884607,MZ +758884608,758884863,GP +758884864,758885119,RE +758885120,758885375,CN +758885376,758885631,WF +758885632,758885887,KM +758885888,758886143,SN +758886144,758886399,TF +758886400,758886655,PA +758886656,758886911,DZ +758886912,758887167,NE +758887168,758887423,GI +758887424,758887679,TD +758887680,758888191,US +758888192,758888447,LY +758888448,758888703,US +758888704,758888959,TZ +758888960,758889215,US +758889216,758889471,MG +758889472,758889727,LA +758889728,758889983,TN +758889984,758972415,US +758972416,758976511,CA +758976512,758981247,US +758981248,758981375,GM +758981376,758981887,US +758981888,758982015,ML +758982016,758982143,TV +758982144,758982271,US +758982272,758982399,KM +758982400,758982527,CD +758982528,758982655,ST +758982656,758982783,MV +758982784,758982911,AR +758982912,758983551,US +758983552,758983679,MN +758983680,758983807,US +758983808,758983935,VA +758983936,758984063,ZW +758984064,758984191,SO +758984192,758984703,US +758984704,758988799,CA +758988800,758994943,US +758994944,758996991,IN +758996992,758998015,DE +758998016,759001087,US +759001088,759005183,CN +759005184,759047423,US +759047424,759047679,IN +759047680,759048191,US +759048192,759048447,PK +759048448,759050495,US +759050496,759050751,IN +759050752,759051519,US +759051520,759051775,PK +759051776,759053055,US +759053056,759053311,IN +759053312,759053823,US +759053824,759054079,PK +759054080,759054335,US +759054336,759062527,CA +759062528,759068671,US +759068672,759069695,NL +759069696,759086079,US +759086080,759086591,HK +759086592,759086847,SG +759086848,759087103,US +759087104,759100278,CA +759100279,759100279,NL +759100280,759103487,CA +759103488,759109631,US +759109632,759111679,AU +759111680,759113727,US +759113728,759114751,NL +759114752,759128063,US +759128064,759128672,GB +759128673,759128673,LB +759128674,759130111,GB +759130112,759132159,US +759132160,759133183,FR +759133184,759134207,DE +759134208,759136255,JP +759136256,759169023,US +759169024,759171071,ID +759171072,759174143,IN +759174144,759175167,MO +759175168,759176191,PK +759176192,759178239,TW +759178240,759179263,AU +759179264,759180287,SG +759180288,759181311,ID +759181312,759182335,NZ +759182336,759183359,HK +759183360,759184383,AU +759184384,759185407,NZ +759185408,759186431,HK +759186432,759187455,AU +759187456,759187967,SG +759187968,759188479,TW +759188480,759189503,TH +759189504,759190527,PH +759190528,759193599,IN +759193600,759193855,ID +759193856,759194111,SG +759194112,759195647,ID +759195648,759196671,IN +759196672,759198207,HK +759198208,759198335,SI +759198336,759198463,CZ +759198464,759198719,PL +759198720,759199743,NZ +759199744,759200767,PH +759200768,759201791,KH +759201792,759202815,SG +759202816,759204863,BD +759204864,759206911,KR +759206912,759207935,AU +759207936,759208959,KR +759208960,759209983,IN +759209984,759211007,NP +759211008,759212031,BD +759212032,759213055,MY +759213056,759214079,KR +759214080,759215103,IN +759215104,759216127,PK +759216128,759217151,TH +759217152,759220223,IN +759220224,759221247,NZ +759221248,759227391,IN +759227392,759229439,TW +759229440,759230463,IN +759230464,759232511,HK +759232512,759233535,BT +759233536,759234559,ID +759234560,759235583,SG +759235584,759236607,NZ +759236608,759237631,IN +759237632,759238655,AU +759238656,759242751,CN +759242752,759243775,HK +759243776,759245823,IN +759245824,759246847,US +759246848,759249407,IN +759249408,759249919,AF +759249920,759250943,AU +759267328,759269375,BR +759269376,759270399,CO +759270400,759272447,BR +759272448,759273471,AR +759273472,759274495,MX +759274496,759275519,BR +759275520,759276543,CL +759276544,759282687,BR +759282688,759283711,HN +759283712,759285759,BR +759285760,759286015,CO +759286016,759286271,BR +759286272,759286527,AR +759286528,759286783,EC +759286784,759291903,BR +759291904,759292927,AR +759292928,759293951,BR +759293952,759294975,CO +759294976,759295999,BR +759296000,759297023,CL +759297024,759298047,DO +759298048,759299071,PE +759299072,759299327,AR +759299328,759299583,BR +759299584,759300095,PA +759496704,759504895,GB +759562240,759564287,BR +759564288,759565311,AR +759565312,759566335,EC +759566336,759576575,BR +759576576,759577599,EC +759577600,759584767,BR +759584768,759585791,AR +759585792,759591935,BR +759591936,759592959,AR +759592960,759601151,BR +759601152,759602175,AR +759602176,759605247,BR +759605248,759606271,CO +759606272,759608319,BR +759608320,759609343,BO +759609344,759610367,AR +759610368,759612415,BR +759612416,759614463,EC +759614464,759618559,BR +759618560,759619583,AR +759619584,759620607,BR +759620608,759621631,BZ +759621632,759622655,BR +759622656,759623679,EC +759623680,759624703,BZ +759624704,759627775,BR +759627776,759628799,EC +759628800,759629055,BR +759629056,759629311,AR +759629312,759629567,BR +759629568,759629823,CO +759629824,759630847,CL +759630848,759631871,BR +759631872,759632895,HN +759632896,759635967,BR +759635968,759636991,PE +759636992,759638015,EC +759638016,759639039,BR +759639040,759640063,CL +759640064,759641087,BR +759641088,759642111,HN +759642112,759643135,AR +759643136,759654911,BR +759654912,759655167,AR +759655168,759656447,BR +759656448,759657471,EC +759657472,759666687,BR +759666688,759667711,AR +759667712,759668735,CW +759668736,759673855,BR +759673856,759674879,CO +759674880,759675903,EC +759675904,759677951,BR +759677952,759678975,AR +759678976,759679999,EC +759680000,759681023,AR +759681024,759692287,BR +759692288,759693311,EC +759693312,759693439,CA +759693440,759693455,US +759693456,759693471,CA +759693472,759693519,US +759693520,759693527,CA +759693528,759693567,US +759693568,759693959,CA +759693960,759693975,GR +759693976,759694207,CA +759694208,759694303,US +759694304,759694319,CA +759694320,759695231,US +759695232,759696263,CA +759696264,759696335,US +759696336,759696351,CA +759696352,759696463,US +759696464,759696479,CA +759696480,759696575,US +759696576,759696599,CA +759696600,759696607,US +759696608,759699263,CA +759699264,759699279,US +759699280,759699287,CA +759699288,759699423,US +759699424,759699439,CA +759699440,759699455,US +759699456,759699967,CA +759699968,759699983,US +759699984,759699991,CA +759699992,759700047,US +759700048,759700063,CA +759700064,759700223,US +759700224,759700479,CA +759700480,759700607,US +759700608,759700735,CA +759700736,759700863,US +759700864,759701759,CA +759701760,759702015,US +759702016,759702399,CA +759702400,759702431,US +759702432,759702447,CA +759702448,759702479,US +759702480,759702495,CA +759702496,759702527,US +759702528,759708287,CA +759708288,759708415,US +759708416,759708927,CA +759708928,759709183,US +759709184,759710463,CA +759710464,759710495,US +759710496,759710511,CA +759710512,759710559,US +759710560,759710591,CA +759710592,759710719,US +759710720,759710975,CA +759710976,759711263,US +759711264,759711279,CA +759711280,759711359,US +759711360,759711615,CA +759711616,759711647,US +759711648,759711655,CA +759711656,759711679,US +759711680,759711695,CA +759711696,759711711,US +759711712,759711743,CA +759711744,759711807,CN +759711808,759711839,CA +759711840,759711855,US +759711856,759711871,CA +759711872,759712015,US +759712016,759712031,CA +759712032,759712095,US +759712096,759712111,CA +759712112,759712127,US +759712128,759712255,CA +759712256,759712351,US +759712352,759712383,CA +759712384,759712511,US +759712512,759712895,CA +759712896,759713023,US +759713024,759721215,CA +759721216,759721231,US +759721232,759721279,CA +759721280,759721343,US +759721344,759791615,CA +759791616,759802367,US +759802368,759803391,CA +759803392,759803903,US +759803904,759804927,GB +759804928,759824639,US +759824640,759824895,SA +759824896,759825151,CR +759825152,759825407,US +759825408,759825663,DE +759825664,759828735,US +759828736,759828863,GT +759828864,759828991,SV +759828992,759829119,HN +759829120,759829247,NI +759829248,759829375,BO +759829376,759829503,PY +759829504,759829631,SR +759829632,759829759,GY +759829760,759829887,TT +759829888,759830015,GD +759830016,759830143,DM +759830144,759830271,BB +759830272,759830399,LC +759830400,759830527,DO +759830528,759830655,HT +759830656,759830783,TC +759830784,759830911,CV +759830912,759831039,KY +759831040,759831167,BM +759831168,759831295,MS +759831296,759831423,AG +759831424,759831551,BY +759831552,759831679,CM +759831680,759831807,CF +759831808,759831935,US +759831936,759832063,ZW +759832064,759832191,ZM +759832192,759832319,GA +759832320,759832447,RW +759832448,759832575,BW +759832576,759832703,MZ +759832704,759832831,SZ +759832832,759832959,MW +759832960,759833087,BI +759833088,759833215,ER +759833216,759833343,LS +759833344,759834623,US +759834624,759834879,GB +759834880,759835391,US +759835392,759835647,AU +759835648,759835903,SE +759835904,759836159,US +759836160,759836415,SE +759836416,759839999,US +759840000,759840255,CA +759840256,759840511,GB +759840512,759840767,US +759840768,759844863,CA +759844864,759848959,US +759848960,759889919,CA +759889920,759922687,JP +759922688,759955455,GB +759955456,759963647,US +759963648,759965983,NL +759965984,759966207,US +759966208,759966719,NL +759966720,759966915,FR +759966916,759966916,TF +759966917,759967743,FR +759967744,759969791,JP +759969792,759975935,US +759975936,759980031,DE +759980032,759983119,JP +759983120,759983135,US +759983136,759984127,JP +759984128,759988223,AU +759988224,759992319,GB +759992320,759997439,SG +759997440,760000511,US +760000512,760004607,SG +760004608,760006911,JP +760006912,760007039,US +760007040,760012799,JP +760012800,760023039,US +760023040,760026367,JP +760026368,760026623,HK +760026624,760029183,JP +760029184,760033279,SG +760033280,760034303,AU +760034304,760035327,DE +760035328,760036351,GB +760036352,760037375,FR +760037376,760038399,DE +760038400,760043519,US +760043520,760044543,GB +760044544,760053759,US +760053760,760055807,JP +760055808,760056831,NL +760056832,760057855,DE +760057856,760063999,US +760064000,760066047,SG +760066048,760068095,JP +760068096,760078335,US +760078336,760079359,GB +760079360,760080383,US +760080384,760081407,AU +760081408,760082431,US +760082432,760084479,SG +760084480,760111103,US +760111104,760119295,CA +760119296,760127487,US +760127488,760152063,CA +760152064,760217599,US +761266176,761316351,EG +761316352,761316607,RU +761316608,762314751,EG +762314752,762315775,IN +762315776,762316799,US +762316800,762320895,IN +762320896,762321919,HK +762321920,762323967,IN +762323968,762324991,SG +762324992,762330111,IN +762330112,762331135,NZ +762331136,762332159,TH +762332160,762333183,IN +762333184,762334207,BD +762334208,762335743,SG +762335744,762336255,PH +762336256,762337279,ID +762337280,762345471,KR +762345472,762346495,SG +762346496,762347519,ID +762347520,762348543,JP +762348544,762349567,CN +762349568,762350591,IN +762350592,762351615,TH +762351616,762353663,IN +762353664,762358783,KR +762358784,762359807,IN +762359808,762360831,MM +762360832,762361855,NP +762361856,762362879,IN +762362880,762363903,CN +762363904,762364927,IN +762364928,762365951,MY +762365952,762366975,IN +762366976,762367999,HK +762368000,762372095,CN +762372096,762373119,FJ +762373120,762376191,CN +762376192,762377215,HK +762377216,762378239,AU +762378240,762380287,IN +762380288,762381311,HK +762381312,762382335,JP +762382336,762383359,NZ +762383360,762388479,CN +762388480,762389503,HK +762389504,762390527,AU +762390528,762391551,CN +762391552,762393599,KR +762393600,762395647,CN +762395648,762396159,TH +762396160,762397695,IN +762397696,762398719,HK +762398720,762399743,CN +762399744,762400767,IN +762400768,762401023,HK +762401024,762401279,US +762401280,762401791,KR +762401792,762402815,TH +762402816,762403839,IN +762403840,762404863,AU +762404864,762407935,IN +762407936,762408959,CN +762408960,762409983,HK +762409984,762411007,JP +762411008,762411519,HK +762411520,762411775,IN +762411776,762412031,HK +762412032,762413055,PK +762413056,762414079,HK +762414080,762415103,BD +762415104,762416127,IN +762416128,762417151,HK +762417152,762419199,CN +762419200,762420223,IN +762420224,762421247,TW +762421248,762423295,HK +762423296,762424319,CN +762424320,762425343,JP +762425344,762426367,CN +762426368,762427391,IN +762427392,762428415,CN +762428416,762429439,IN +762429440,762430463,HK +762430464,762431487,AU +762431488,762437631,CN +762437632,762438655,IN +762438656,762439679,CN +762439680,762440703,AU +762440704,762441727,BD +762441728,762442751,CN +762442752,762443775,AU +762443776,762444799,IN +762444800,762446847,CN +762446848,762447871,SG +762447872,762448895,HK +762448896,762449919,CN +762449920,762450943,JP +762450944,762451967,PH +762451968,762452991,HK +762452992,762454015,MY +762454016,762455039,CN +762455040,762456063,IN +762456064,762457087,CN +762457088,762458111,HK +762458112,762459135,IN +762459136,762460159,CN +762460160,762467327,IN +762467328,762469375,BD +762469376,762470399,HK +762470400,762471423,CN +762471424,762472447,MY +762472448,762474495,CN +762474496,762475519,JP +762475520,762475775,AU +762475776,762476031,SG +762476032,762476287,ID +762476288,762476543,SG +762476544,762477567,SE +762477568,762478591,CN +762478592,762479615,KR +762479616,762480639,PH +762480640,762481663,CN +762481664,762486783,IN +762486784,762487807,KH +762487808,762490879,HK +762490880,762491903,IN +762491904,762492927,BD +762492928,762493951,JP +762493952,762494975,AU +762494976,762495999,IN +762496000,762498047,CN +762498048,762499071,AU +762499072,762500095,JP +762500096,762502143,IN +762502144,762503167,AU +762503168,762504191,IN +762504192,762505215,CN +762505216,762506239,BD +762506240,762507263,CN +762507264,762510335,IN +762510336,762511359,CN +762511360,762514431,IN +762514432,762515455,BD +762515456,762516479,IN +762516480,762517503,AU +762517504,762517759,TH +762517760,762518015,KR +762518016,762518271,AO +762518272,762518527,HK +762518528,762519551,IN +762519552,762520575,JP +762520576,762522623,HK +762522624,762523647,CN +762523648,762523903,AU +762523904,762524159,PK +762524160,762524671,TH +762524672,762527743,IN +762527744,762528767,ID +762528768,762529791,AU +762529792,762530815,TL +762530816,762532863,IN +762532864,762533887,PK +762533888,762536959,IN +762536960,762537983,CN +762537984,762540031,IN +762540032,762541055,BD +762541056,762541567,AU +762541568,762541823,TH +762541824,762542079,IN +762542080,762543103,CN +762543104,762544127,HK +762544128,762545151,AU +762545152,762546175,CN +762546176,762547199,ID +762547200,762548223,IN +762548224,762549247,CN +762549248,762550271,IN +762550272,762551295,KR +762551296,762552319,CN +762552320,762553343,HK +762553344,762554367,CN +762554368,762560511,IN +762560512,762561535,JP +762562560,762563583,CN +762563584,762564607,AU +762564608,762565631,IN +762565632,762567679,CN +762567680,762568703,IN +762568704,762569727,BD +762569728,762570751,CN +762570752,762571775,AU +762571776,762572799,CN +762572800,762573823,HK +762573824,762575871,CN +762575872,762578943,IN +762578944,762580479,HK +762580480,762580991,JP +762580992,762584063,CN +762584064,762585087,IN +762585088,762587135,CN +762587136,762588159,HK +762588160,762589183,IN +762589184,762590207,AU +762590208,762591231,CN +762591232,762592255,IN +762592256,762594303,HK +762594304,762595327,IN +762595328,762596351,JP +762596352,762598399,HK +762598400,762599423,IN +762599424,762600447,SG +762600448,762601471,JP +762601472,762603519,CN +762603520,762604543,IN +762604544,762605567,AU +762605568,762609663,IN +762609664,762610175,AF +762610176,762610431,HK +762610432,762610687,AU +762610688,762611711,JP +762611712,762612735,SG +762612736,762613759,CN +762613760,762614783,HK +762614784,762615807,IN +762615808,762616831,CN +762616832,762617855,ID +762617856,762619903,IN +762619904,762620927,HK +762620928,762622975,MY +762622976,762630143,IN +762630144,762631167,CN +762631168,762632191,HK +762632192,762633215,TH +762633216,762634239,AU +762634240,762635263,JP +762635264,762636287,IN +762636288,762637311,PK +762637312,762640383,MY +762640384,762641407,BD +762641408,762644479,IN +762644480,762645503,CN +762645504,762646527,KR +762646528,762647551,JP +762647552,762648575,CN +762648576,762649599,AU +762649600,762650623,IN +762650624,762651647,MN +762651648,762652671,NZ +762652672,762653695,HK +762653696,762656767,IN +762656768,762658815,BD +762658816,762659839,IN +762659840,762660863,CN +762660864,762661887,IN +762661888,762663935,VN +762663936,762664959,AU +762664960,762665983,PK +762665984,762667007,IN +762667008,762669055,HK +762669056,762670079,PK +762670080,762673151,IN +762673152,762674175,MY +762674176,762675199,CN +762675200,762678271,IN +762678272,762679295,JP +762679296,762680319,HK +762680320,762681343,IN +762681344,762682367,NP +762682368,762688511,VN +762688512,762690559,IN +762690560,762691583,SG +762691584,762692607,HK +762692608,762693631,MP +762693632,762700799,IN +762700800,762701823,MY +762701824,762702847,IN +762702848,762703871,MY +762703872,762705919,FJ +762705920,762706943,IN +762706944,762707967,CN +762707968,762717183,IN +762717184,762718207,PH +762718208,762719231,JP +762719232,762723327,IN +762723328,762724351,BD +762724352,762725375,AU +762725376,762726399,BD +762726400,762736639,IN +762736640,762737663,ID +762737664,762739711,IN +762739712,762740735,HK +762740736,762741759,IN +762741760,762742783,SG +762742784,762746879,VN +762746880,762754047,IN +762754048,762755071,SG +762755072,762756095,AU +762756096,762757119,NZ +762757120,762770431,IN +762770432,762771455,BD +762771456,762775551,HK +762775552,762783743,IN +762783744,762784767,KR +762784768,762786815,IN +762786816,762787839,CN +762787840,762788863,IN +762788864,762792959,CN +762792960,762796031,VN +762796032,762797055,IN +762797056,762799103,HK +762799104,762800127,NZ +762800128,762801151,CN +762801152,762802175,VN +762802176,762803199,IN +762803200,762804223,CN +762804224,762805247,BD +762805248,762806271,HK +762806272,762810367,IN +762810368,762811391,KR +762811392,762812415,IN +762812416,762814463,SG +762814464,762815487,MY +762815488,762816511,JP +762816512,762824703,IN +762824704,762824959,JP +762824960,762825727,SG +762825728,762826751,JP +762826752,762827775,US +762827776,762829823,VN +762829824,762830847,AU +762830848,762832895,IN +762832896,762833919,CN +762833920,762834943,IN +762834944,762835967,VN +762835968,762838015,IN +762838016,762841087,HK +762841088,762846207,IN +762846208,762847231,HK +762847232,762848255,IN +762848256,762848511,AU +762848512,762848767,IN +762848768,762849279,BD +762849280,762850303,IN +762850304,762851327,HK +762852352,762853375,HK +762853376,762855423,IN +762855424,762857471,KR +762857472,762858495,IN +762858496,762860543,HK +762860544,762861567,MM +762861568,762863615,IN +762863616,762864639,BD +762864640,762865663,CN +762865664,762866687,AU +762866688,762867711,PH +762867712,762868735,BD +762868736,762869759,NZ +762869760,762871807,IN +762871808,762872831,MY +762872832,762873855,JP +762873856,762874879,IN +762874880,762875903,CN +762875904,762876927,IN +762876928,762877951,SG +762877952,762879231,HK +762879232,762879487,JP +762879488,762879743,HK +762879744,762879999,JP +762880000,762881023,IN +762881024,762882047,CN +762882048,762883071,HK +762883072,762884095,IN +762884096,762885119,JP +762885120,762887167,HK +762887168,762888191,IN +762888192,762889215,JP +762890240,762890495,KR +762890496,762890751,TW +762890752,762891007,HK +762891008,762891263,MY +762891264,762893311,HK +762893312,762894335,IN +762894336,762895359,HK +762895360,762896383,CN +762896384,762898431,VN +762898432,762900479,IN +762900480,762901503,CN +762901504,762902527,ID +762902528,762909695,IN +762909696,762910719,HK +762910720,762911743,VN +762911744,762912767,IN +762912768,762913791,HK +762913792,762914815,MY +762914816,762915839,ID +762915840,762916863,IN +762916864,762917887,TW +762917888,762918911,CN +762918912,762919935,HK +762919936,762920959,TH +762920960,762924031,CN +762924032,762925055,IN +762925056,762926079,HK +762926080,762927103,SG +762927104,762928127,LK +762928128,762930175,CN +762930176,762931199,IN +762931200,762932223,CN +762932224,762938367,IN +762938368,762939391,AU +762939392,762941439,HK +762941440,762942463,MY +762942464,762943487,JP +762943488,762944511,VN +762944512,762945535,IN +762945536,762946559,VN +762946560,762947583,KR +762947584,762948607,IN +762948608,762950655,CN +762950656,762951679,AU +762951680,762952191,SG +762952192,762952703,JP +762952704,762953727,IN +762953728,762957823,HK +762957824,762958847,AU +762958848,762959871,CN +762959872,762960895,ID +762960896,762964991,IN +762964992,762966015,KH +762966016,762981375,CN +762981376,762982399,IN +762982400,762983423,TH +762983424,762985471,ID +762985472,763000831,CN +763000832,763003903,IN +763003904,763005951,HK +763005952,763010047,IN +763010048,763011071,HK +763011072,763026431,CN +763026432,763027455,VN +763027456,763028479,JP +763028480,763029503,AU +763029504,763035647,VN +763035648,763040767,IN +763040768,763041791,HK +763041792,763042815,IN +763042816,763045887,CN +763045888,763046911,BD +763046912,763059199,CN +763059200,763060223,IN +763060224,763061247,VN +763061248,763062271,MY +763062272,763063295,AU +763063296,763064319,IN +763064320,763065343,HK +763065344,763066367,TR +763066368,763067391,CN +763067392,763068415,MY +763068416,763071487,CN +763071488,763073535,IN +763073536,763076607,CN +763076608,763077631,IN +763077632,763083775,CN +763083776,763084287,HK +763084288,763084543,LT +763084544,763086847,HK +763086848,763087871,MO +763087872,763088895,CN +763088896,763089919,JP +763089920,763090943,CN +763090944,763091967,IN +763091968,763092991,NP +763092992,763102207,CN +763102208,763103231,IN +763103232,763104255,HK +763104256,763105279,BD +763105280,763106303,PH +763106304,763107327,CN +763107328,763108351,HK +763108352,763111423,CN +763111424,763112447,AU +763112448,763113471,CN +763113472,763114495,IN +763114496,763115519,AU +763115520,763116543,PH +763116544,763117567,JP +763117568,763118591,HK +763118592,763119615,CN +763119616,763120639,HK +763120640,763122687,CN +763122688,763125759,VN +763125760,763126783,IN +763126784,763127807,CN +763127808,763129343,IN +763129344,763129855,AU +763129856,763130879,HK +763130880,763132927,IN +763132928,763133951,CN +763133952,763134975,IN +763134976,763135999,HK +763136000,763137023,JP +763137024,763142143,IN +763142144,763143167,HK +763143168,763143423,AU +763143680,763144191,AU +763144192,763145215,BD +763145216,763147263,CN +763147264,763152383,IN +763152384,763153407,AU +763153408,763154431,JP +763154432,763155455,CN +763155456,763156479,AU +763156480,763158527,JP +763158528,763164671,IN +763164672,763165695,CN +763165696,763165951,HK +763165952,763166207,US +763166208,763166463,DE +763166464,763166719,RU +763166720,763169791,HK +763169792,763171839,CN +763171840,763172863,SG +763172864,763175935,CN +763175936,763177983,IN +763177984,763179007,CN +763179008,763180031,HK +763180032,763182079,CN +763182080,763183103,IN +763183104,763183615,HK +763183616,763183871,LT +763183872,763184127,JP +763184128,763185151,IN +763185152,763186175,ID +763186176,763194367,CN +763194368,763196415,HK +763196416,763197439,IN +763197440,763199487,AU +763199488,763199743,DE +763200512,763201535,IN +763201536,763202559,CN +763202560,763207679,IN +763207680,763208703,HK +763208704,763208959,US +763208960,763209727,HK +763209728,763210751,NZ +763210752,763214847,IN +763214848,763215871,JP +763215872,763217919,SG +763217920,763220991,VN +763220992,763222015,IN +763222016,763223039,HK +763223040,763224063,BD +763224064,763225087,AF +763225088,763226111,TH +763226112,763227135,KR +763227136,763228159,VN +763228160,763229183,JP +763229184,763229439,NZ +763229440,763229695,AU +763229696,763229951,IN +763229952,763230207,AU +763230208,763231231,PH +763231232,763232255,IN +763232256,763234303,HK +763234304,763235327,IN +763235328,763236351,HK +763236352,763238399,IN +763238400,763239423,AU +763239424,763243519,IN +763243520,763244543,AU +763244544,763246591,CN +763246592,763247615,ID +763247616,763248639,SG +763248640,763250687,IN +763250688,763251711,US +763251712,763252735,HK +763252736,763253759,ID +763253760,763254783,PH +763254784,763255807,MY +763255808,763257855,VN +763257856,763258879,CN +763258880,763259903,IN +763259904,763263999,CN +763264000,763264511,HK +763264512,763265023,AU +763265024,763266047,NZ +763266048,763267071,ID +763267072,763268095,IN +763268096,763269119,BN +763269120,763270143,IN +763270144,763271167,KR +763271168,763272191,ID +763272192,763273215,JP +763273216,763274239,IN +763274240,763275263,SG +763275264,763278335,IN +763278336,763279359,HK +763279360,763280383,ID +763280384,763281407,IN +763281408,763282431,AU +763282432,763285503,IN +763285504,763285759,US +763285760,763286015,SG +763286016,763286527,US +763286528,763287551,CN +763287552,763288575,HK +763288576,763289599,CN +763289600,763290623,TH +763290624,763291647,HK +763291648,763293695,IN +763293696,763294719,HK +763294720,763297023,IN +763297024,763297279,AF +763297280,763297791,IN +763297792,763298815,HK +763298816,763299839,MY +763299840,763301887,CN +763301888,763304959,IN +763304960,763305983,JP +763305984,763307007,SG +763307008,763308031,CN +763308032,763310079,IN +763310080,763311103,BD +763311104,763313151,IN +763313152,763313279,PH +763313280,763313407,HK +763313408,763313535,ID +763313536,763313663,KR +763313664,763313791,TH +763313792,763313919,VN +763313920,763314047,BG +763314048,763314175,HR +763314176,763321343,IN +763321344,763322367,HK +763322368,763323391,CN +763323392,763326463,IN +763326464,763327487,US +763327488,763328511,CN +763328512,763329535,IN +763329536,763331583,CN +763331584,763332607,ID +763332608,763333631,IN +763333632,763334655,AU +763334656,763336703,CN +763336704,763337727,KH +763337728,763338751,CN +763338752,763339775,HK +763339776,763340799,PH +763340800,763341823,SG +763341824,763342847,AU +763342848,763343871,HK +763343872,763344895,AU +763344896,763345919,HK +763345920,763350015,IN +763350016,763351039,ID +763351040,763353087,IN +763353088,763353343,HK +763353344,763353599,CN +763353600,763353855,TW +763353856,763354111,CN +763354112,763360255,IN +763360256,763362303,BD +763362304,763363327,VN +767557632,767623167,ZA +767623168,767688703,HK +767688704,767754239,ZA +767754240,767819775,HK +767819776,768016383,ZA +768016384,768081919,US +768081920,768606207,ZA +768606208,768868351,GH +768868352,769130495,ZM +769130496,769392639,MA +769392640,769404927,ZA +769404928,769405183,TZ +769405184,769405439,ZA +769405440,769405951,CI +769405952,769406975,GH +769406976,769409023,ZA +769409024,769425407,SC +769425408,769458175,ZA +769458176,769459199,MU +769459200,769460223,CD +769460224,769461247,UG +769461248,769462271,ZA +769462272,769463295,MU +769463296,769464319,AO +769464320,769464575,GH +769464576,769464831,MW +769464832,769465087,ZA +769465344,769466367,CI +769466368,769474815,ZA +769474816,769475583,NG +769475584,769476607,ZA +769476608,769478655,UG +769478656,769507327,ZA +769507328,769509375,TZ +769509376,769515519,ZA +769515520,769523711,BJ +769523712,769535999,ZA +769536000,769540095,GH +769540096,769548287,ZA +769548288,769550335,NG +769550336,769556479,ZA +769556480,769589247,GH +769589248,769654783,US +769654784,769656831,BR +769656832,769657855,AR +769657856,769659903,BR +769659904,769660927,EC +769660928,769661951,BR +769661952,769662975,AR +769662976,769668095,BR +769668096,769669119,AR +769669120,769679359,BR +769679360,769680383,EC +769680384,769682431,AR +769682432,769684479,BR +769684480,769685503,EC +769685504,769686527,CL +769686528,769687551,AR +769687552,769690623,BR +769690624,769691647,AR +769691648,769692671,PE +769692672,769694719,EC +769694720,769695743,AR +769695744,769701887,BR +769701888,769702143,AR +769702400,769702655,CO +769702656,769702911,BR +769702912,769703935,AR +769703936,769706495,BR +769706752,769707007,AR +769707008,769713151,BR +769713152,769714175,HN +769714176,769719295,BR +769719296,769720319,HN +769720320,769721343,AR +769721344,769727487,BR +769727488,769728511,AR +769728512,769730559,BR +769730560,769731071,AR +769731072,769731327,BZ +769731328,769731583,CL +769731584,769732607,EC +769732608,769737727,BR +769738240,769738751,PA +769738752,769739263,BR +769739264,769739519,PA +769739776,769741823,CL +769741824,769742847,BR +769742848,769743871,EC +769743872,769744895,CL +769744896,769745919,AR +769745920,769746943,BR +769746944,769747967,EC +769747968,769748991,BR +769748992,769750015,CL +769750016,769754111,BR +769754112,769754623,CL +769754624,769754879,AR +769754880,769755135,PA +769755136,769759231,BR +769759744,769760255,BR +769760256,769761279,AR +769761280,769767423,BR +769767424,769768447,CL +769768448,769771519,BR +769772544,769773567,CL +769773568,769774591,BR +769774592,769777663,AR +769777664,769778687,CO +769778688,769787903,BR +769787904,769788927,AR +769788928,769793023,BR +769793024,769794047,AR +769794048,769795071,BO +769795072,769800191,BR +769800704,769800959,AR +769801216,769802239,BR +769802240,769803263,CR +769803264,769804287,PE +769804288,769811455,BR +769811456,769812479,AR +769812480,769814527,BR +769814528,769815551,CO +769815552,769822719,BR +769822720,769823743,AR +769823744,769826815,BR +769828864,769829887,CL +769829888,769830911,AR +769830912,769831935,GT +769831936,769832959,PY +769832960,769833471,AR +769833984,769838079,BR +769838080,769839103,EC +769840128,769843199,BR +769843200,769845247,AR +769845248,769853439,BR +769853440,769855487,AR +769855488,769856511,PE +769856512,769858559,BR +769859584,769861631,AR +769863680,769864703,AR +769864704,769866751,BR +769867008,769867263,BO +769867264,769868799,CL +769868800,769869823,AR +769869824,769870847,BR +769872896,769873919,BR +769873920,769874943,CO +769874944,769875967,AR +769876992,769878015,AR +769878016,769884159,BR +769886208,769887231,BR +769888256,769890303,BR +769890304,769891327,AR +769891328,769892351,BR +769892352,769894399,AR +769894400,769895423,BR +769896448,769897471,CL +769897472,769899519,BR +769903616,769905663,BR +769906688,769907711,AR +769908736,769909759,AR +769910784,769911807,BR +769913856,769914879,AR +769914880,769915903,BR +769915904,769916927,PA +769917952,769918975,BR +770703360,771227647,EG +771227648,771229695,IN +771229696,771230719,CN +771230720,771237375,IN +771237376,771237887,MY +771237888,771238911,IN +771238912,771239935,US +771239936,771241983,AU +771241984,771245055,IN +771245056,771246079,HK +771246080,771247103,KR +771247104,771248127,AU +771248128,771251199,CN +771251200,771252223,IN +771252224,771256319,CN +771256320,771260415,IN +771260416,771262463,CN +771262464,771263487,IN +771263488,771264511,AU +771264512,771267583,BD +771267584,771277823,IN +771277824,771278847,AU +771278848,771279871,HK +771279872,771295231,CN +771295232,771296255,PK +771296256,771303423,CN +771303424,771308543,IN +771308544,771309567,HK +771309568,771310591,KR +771310592,771315711,IN +771315712,771316223,US +771316224,771316479,KR +771316480,771316735,HK +771316736,771317759,CN +771317760,771318783,HK +771318784,771319295,SG +771319296,771319807,BD +771319808,771320063,SG +771320064,771320319,TW +771320320,771320831,AU +771320832,771321855,IN +771321856,771322879,CN +771322880,771323135,TW +771323904,771334143,IN +771334144,771335167,KR +771335168,771339263,IN +771339264,771340287,CN +771340288,771341311,BD +771341312,771348479,CN +771348480,771348991,ID +771348992,771349503,IN +771349504,771350271,ID +771350272,771350527,US +771350528,771355647,IN +771355648,771356671,HK +771356672,771361791,IN +771361792,771363839,CN +771363840,771364863,BD +771364864,771365887,GB +771365888,771369983,CN +771369984,771374079,IN +771374080,771375103,HK +771375104,771377151,IN +771377152,771378175,US +771378176,771384319,CN +771384320,771385343,ID +771385344,771398655,CN +771398656,771399679,PH +771399680,771400703,SG +771400704,771401727,CN +771401728,771402751,IN +771402752,771403775,HK +771403776,771404799,TH +771404800,771408895,CN +771408896,771409919,HK +771409920,771410943,MM +771410944,771412991,KR +771412992,771415039,IN +771415040,771416063,KR +771416064,771417087,IN +771417088,771418111,BD +771418112,771419135,IN +771419136,771420159,NL +771420160,771421183,MM +771421184,771423231,IN +771423232,771424255,BD +771424256,771425279,CN +771425280,771426303,ID +771426304,771427327,CN +771427328,771428351,IN +771428352,771430399,CN +771430400,771431423,PH +771431424,771435519,IN +771435520,771436543,US +771436544,771437567,IN +771437568,771438591,CN +771438592,771439615,BD +771439616,771440639,IN +771440640,771441663,HK +771441664,771442687,IN +771442688,771443711,ID +771443712,771445759,IN +771445760,771450879,CN +771450880,771452927,HK +771452928,771453951,VN +771453952,771454975,IN +771454976,771457023,CN +771457024,771458047,BD +771458048,771459071,JP +771459072,771482623,CN +771482624,771483647,BD +771483648,771489791,IN +771489792,771503103,CN +771503104,771504127,BD +771504128,771505151,US +771505152,771506175,HK +771506176,771507199,TH +771507200,771511295,IN +771511296,771535871,CN +771535872,771536895,IN +771536896,771537919,US +771537920,771538943,IN +771538944,771550207,CN +771550208,771551231,AU +771551232,771554303,VN +771554304,771555327,AU +771555328,771577855,CN +771577856,771578879,PH +771578880,771587071,CN +771587072,771588095,NZ +771588096,771588607,AU +771589120,771629055,CN +771629056,771630079,VN +771630080,771631103,SG +771631104,771632127,CN +771632128,771633151,MM +771633152,771680255,CN +771680256,771681279,HK +771681280,771683327,CN +771683328,771683583,US +771683584,771683839,PH +771683840,771684095,MV +771684096,771684351,MH +771684352,771685375,CN +771685376,771685631,KR +771685632,771685887,JP +771685888,771686143,NZ +771686144,771686399,TW +771686400,771718399,CN +771718400,771718655,ID +771718656,771719167,CN +771719168,771719423,IN +771719424,771720191,US +771720192,771720447,NL +771720448,771720703,CN +771720704,771720959,NL +771720960,771750911,CN +771750912,771751935,MY +771751936,771817471,RU +771817472,771948543,TR +771948544,772014079,RU +772014080,772145151,DE +772145152,772210687,ES +772210688,772276223,IE +772276224,772278271,RU +772278272,772278783,CZ +772278784,772282623,RU +772282624,772282879,KZ +772282880,772283391,RU +772283392,772283647,ES +772283648,772284927,RU +772284928,772285183,UA +772285184,772285439,UZ +772285440,772285695,RU +772285696,772285951,GR +772285952,772287771,RU +772287772,772287772,NL +772287773,772339967,RU +772339968,772340223,NL +772340224,772340735,RU +772340736,772341247,KZ +772341248,772341759,RU +772341760,772407295,NO +772407296,772472831,BG +772472832,772538367,MT +772538368,772603903,GR +772603904,772669439,CZ +772669440,772734975,CH +772734976,772800511,NO +772800512,772802559,GB +772802560,772804607,RU +772804608,772806655,GL +772806656,772808703,RU +772808704,772810751,GB +772810752,772812799,FR +772812800,772814847,NO +772814848,772816895,ES +772816896,772818943,RU +772818944,772820991,DE +772820992,772823039,GB +772823040,772825087,IT +772825088,772827135,RU +772827136,772829183,RS +772829184,772831231,EE +772831232,772833279,CZ +772835328,772837375,CY +772837376,772839423,KZ +772839424,772841471,CH +772841472,772843519,GB +772843520,772845567,IT +772845568,772847615,RU +772847616,772849663,NL +772849664,772851711,BG +772851712,772853759,CH +772853760,772855807,GB +772855808,772857855,DE +772857856,772859903,RU +772859904,772861951,SE +772861952,772863743,BE +772863744,772863999,ES +772864000,772870143,NL +772870144,772872191,NO +772872192,772874239,NL +772874240,772876287,IE +772876288,772880383,RU +772880384,772882431,GB +772882432,772884479,FR +772884480,772886527,LB +772886528,772888575,FR +772888576,772890623,GB +772890624,772892033,NL +772892034,772892041,RU +772892042,772892671,NL +772892672,772894719,GB +772894720,772896767,PL +772896768,772898815,RS +772898816,772900863,TR +772900864,772902911,ES +772902912,772904959,RS +772904960,772907007,IT +772907008,772909055,GB +772911104,772913151,GB +772913152,772915199,SE +772915200,772917247,FI +772917248,772919295,RU +772919296,772923391,GB +772923392,772925439,AT +772925440,772925695,ZW +772925696,772926463,GB +772926464,772926719,ZW +772926720,772927487,GB +772927488,772929535,UA +772929536,772931583,RU +772931584,772933631,UA +772933632,772935679,GB +772935680,772937727,PS +772937728,772939775,IT +772939776,772941823,BE +772941824,772943871,ES +772943872,772945919,GB +772945920,772947967,DE +772947968,772950015,AZ +772950016,772952063,ES +772952064,772952319,US +772952320,772954111,GB +772954112,772958207,FR +772958208,772962303,GB +772962304,772966399,FR +772966400,772968447,IT +772968448,772970495,SK +772970496,772972543,GB +772972544,772974591,SA +772974592,772978687,GB +772978688,772980735,DE +772980736,772982783,FR +772982784,772984831,RU +772984832,772986879,FR +772986880,772988927,GB +772988928,772990975,FR +772990976,772993023,IT +772993024,772995071,DE +772995072,772997119,IR +772997120,772999167,BE +772999168,773001215,SI +773001216,773003263,NO +773003264,773005311,FR +773005312,773007359,NL +773007360,773009407,KZ +773009408,773011455,IT +773011456,773013503,DE +773013504,773015551,RU +773015552,773017599,AE +773017600,773019647,IL +773019648,773021695,DE +773021696,773023743,AM +773023744,773025791,US +773025792,773027839,RU +773027840,773031935,FR +773031936,773033983,CH +773033984,773036031,LV +773036032,773038079,DE +773038080,773040127,GB +773040128,773042175,NL +773042176,773044223,FR +773044224,773046271,RU +773046272,773048319,LB +773048320,773050367,LV +773050368,773052415,IE +773052416,773054463,NL +773054464,773055871,AL +773055872,773055999,RS +773056000,773056511,AL +773056512,773058559,IT +773058560,773060607,BE +773060608,773062655,DK +773062656,773066751,TR +773066752,773070847,AT +773070848,773074943,DE +773074944,773079039,PL +773079040,773083135,RU +773083136,773087231,IT +773087232,773091327,LB +773091328,773095423,GB +773095424,773099519,RO +773099520,773103615,TR +773103616,773107711,FR +773107712,773111807,RU +773111808,773115903,TJ +773115904,773119999,PS +773120000,773124095,GB +773124096,773125247,CH +773125248,773125375,GB +773125376,773125503,CH +773125504,773125567,GB +773125568,773125855,CH +773125856,773125887,RU +773125888,773126143,FR +773126144,773128191,CH +773128192,773132287,DE +773132288,773136383,CH +773136384,773140479,DK +773140480,773144575,CY +773144576,773148671,RU +773148672,773152767,IR +773152768,773153791,SE +773153792,773154303,US +773154304,773156863,SE +773156864,773165055,FR +773165056,773166463,NL +773166464,773166591,PL +773166592,773167199,US +773167200,773167215,NL +773167216,773167655,US +773167656,773167663,NL +773167664,773168127,US +773168128,773168415,NL +773168416,773168639,US +773168640,773168895,NL +773168896,773169151,US +773169152,773173247,NL +773173248,773177343,IT +773177344,773177407,ES +773177408,773181439,FR +773181440,773185535,PL +773185536,773189631,NL +773189632,773192191,RU +773192192,773192447,UA +773192448,773192703,IQ +773192704,773197823,RU +773197824,773201919,CH +773201920,773206015,DE +773206016,773210111,RU +773210112,773210623,US +773210624,773211135,ES +773211136,773211391,FR +773211392,773211647,US +773211648,773211903,NL +773211904,773212159,SG +773212160,773212671,NL +773212672,773213183,GB +773213184,773214207,US +773214208,773218303,FR +773218304,773222399,IS +773222400,773226495,SE +773226496,773230591,IE +773230592,773234687,RS +773234688,773238783,PL +773238784,773242879,NL +773242880,773246975,FR +773246976,773251071,EE +773251072,773255167,AZ +773255168,773259263,RU +773259264,773263359,SI +773263360,773267455,BH +773267456,773271551,LV +773271552,773275647,CZ +773275648,773277695,GB +773277696,773283839,NL +773283840,773287935,AZ +773287936,773292031,JO +773292032,773296127,CZ +773296128,773300223,RU +773300224,773304319,FI +773304320,773308415,RU +773308416,773312511,IT +773312512,773316607,DE +773316608,773318655,GB +773318656,773320703,DE +773320704,773324799,FR +773324800,773586943,ES +773586944,773588991,IT +773588992,773591039,PL +773591040,773593087,RU +773593088,773595135,IT +773595136,773597183,DE +773597184,773599231,BE +773599232,773601279,GB +773601280,773603327,LV +773603328,773605375,UA +773605376,773607423,IR +773607424,773609471,DE +773609472,773611519,RU +773611520,773613567,BY +773613568,773615615,CZ +773615616,773617663,DE +773617664,773619711,IT +773619712,773621759,RU +773621760,773623807,PS +773623808,773625855,SE +773625856,773627903,IS +773627904,773629951,ES +773629952,773631999,FR +773632000,773634047,CY +773634048,773636095,DE +773636096,773638143,UA +773638144,773640191,CH +773640192,773642239,ES +773642240,773644287,HU +773644288,773646335,RU +773646336,773648383,TR +773648384,773650431,PL +773650432,773652479,GB +773652480,773653503,SK +773653504,773654527,CZ +773654528,773656575,RU +773656576,773658623,PL +773660672,773662719,AT +773662720,773664767,DE +773664768,773666815,ES +773666816,773668863,GB +773668864,773670911,DE +773670912,773672959,RU +773672960,773675007,SA +773675008,773677055,GB +773677056,773679103,DE +773679104,773681151,IT +773681152,773683199,RU +773683200,773685247,FR +773685248,773687295,UA +773687296,773689343,HU +773689344,773691391,PL +773691392,773695487,RU +773695488,773697535,MK +773697536,773699583,LU +773699584,773701631,CZ +773701632,773703679,RU +773703680,773705727,IT +773705728,773707775,RU +773707776,773709823,NO +773709824,773711871,CZ +773711872,773713919,RU +773713920,773715967,NL +773715968,773718015,SE +773718016,773720063,DE +773720064,773722111,GB +773722112,773724159,ES +773724160,773726207,DE +773726208,773730303,RU +773730304,773732351,GB +773732352,773734399,DE +773734400,773736447,CZ +773736448,773740543,DE +773740544,773742591,CZ +773742592,773744639,GB +773744640,773746175,ES +773746176,773746687,US +773746688,773748735,DE +773748736,773750783,DK +773750784,773752831,FI +773752832,773754879,GB +773754880,773756927,CZ +773756928,773758975,RU +773758976,773761023,UA +773761024,773763071,IT +773763072,773765119,TR +773767168,773769215,GB +773769216,773771263,FR +773771264,773773311,DK +773773312,773775359,IT +773775360,773777407,IQ +773777408,773779455,CZ +773779456,773783551,IT +773783552,773785599,RU +773785600,773787647,NL +773787648,773789695,DK +773789696,773791743,RU +773791744,773793791,PL +773793792,773795839,FR +773795840,773797887,NL +773797888,773799935,ES +773799936,773800703,CY +773800704,773800959,GB +773800960,773801215,SG +773801216,773801471,US +773801472,773801983,CY +773804032,773806079,GB +773806080,773808127,BE +773808128,773810175,IL +773810176,773812223,IT +773812224,773814271,TR +773814272,773816319,DE +773816320,773818367,IT +773818368,773820415,HR +773820416,773822463,TR +773822464,773824511,RU +773824512,773826559,FR +773826560,773828607,GB +773828608,773830655,HU +773830656,773831679,NO +773831680,773832703,NL +773832704,773834751,FR +773834752,773836799,IM +773836800,773838847,FR +773838848,773840895,DE +773840896,773842943,GB +773844992,773845247,GB +773845248,773845503,GG +773845504,773846015,GB +773846016,773847039,GG +773847040,773849087,IT +773849088,773857279,IR +773857280,773865471,DK +773865472,773873663,RU +773873664,773881855,JO +773881856,773890047,DK +773890048,773898239,AZ +773898240,773906431,PS +773906432,773922815,GB +773922816,773931007,UA +773931008,773934591,DE +773934592,773935352,FR +773935353,773935353,US +773935354,773935728,FR +773935729,773935729,GB +773935730,773936145,FR +773936146,773936146,US +773936147,773936199,FR +773936200,773936203,DE +773936204,773936419,FR +773936420,773936423,GB +773936424,773937663,FR +773937664,773937664,DE +773937665,773937673,FR +773937674,773937674,IE +773937675,773938231,FR +773938232,773938239,GB +773938240,773939199,FR +773939200,773947391,CZ +773947392,773955583,GB +773955584,773963775,FR +773963776,773968895,ME +773968896,773969407,RU +773969408,773971967,ME +773971968,773980159,UA +773980160,773988351,GB +773988352,773996543,ES +773996544,773996799,TR +773996800,773997823,ES +773997824,773998079,NL +773998080,774000671,ES +774000672,774000687,NL +774000688,774000823,ES +774000824,774000824,GB +774000825,774001663,ES +774001664,774002687,NL +774002688,774002815,ES +774002816,774002842,NL +774002843,774002843,ES +774002844,774002943,NL +774002944,774003199,ES +774003200,774003711,TR +774003712,774004735,ES +774004736,774012927,IR +774012928,774021119,RU +774021120,774029311,IR +774029312,774037503,KZ +774037504,774045695,SK +774045696,774053887,FR +774053888,774062079,DE +774062080,774070271,YE +774070272,774078463,ES +774078464,774086655,BA +774086656,774094847,BG +774094848,774103039,HU +774103040,774111231,UA +774111232,774119423,RU +774119424,774127615,CZ +774127616,774135807,LT +774135808,774143999,IR +774144000,774152191,KZ +774152192,774160383,BA +774160384,774162431,GB +774162432,774162432,VA +774162433,774162442,GB +774162443,774162452,BA +774162453,774162462,BO +774162463,774162472,SR +774162473,774162482,IT +774162483,774162492,CK +774162493,774162502,IT +774162503,774162512,NU +774162513,774162522,BO +774162523,774162532,DE +774162533,774162542,TF +774162543,774162552,GG +774162553,774162562,MX +774162563,774162572,MQ +774162573,774162582,YT +774162583,774162592,NC +774162593,774162602,CA +774162603,774162622,US +774162623,774162627,MX +774162628,774162637,GB +774162638,774162642,NF +774162643,774162647,VN +774162648,774162652,AO +774162653,774162657,GM +774162658,774162662,US +774162663,774162667,BW +774162668,774162672,US +774162673,774162677,KG +774162678,774162682,MG +774162683,774162687,US +774162688,774162688,VA +774162689,774162693,US +774162694,774162698,MZ +774162699,774162703,NP +774162704,774162738,US +774162739,774162743,UA +774162744,774162778,US +774162779,774162784,CA +774162785,774162787,UA +774162788,774162788,VA +774162789,774162798,CA +774162799,774162803,BN +774162804,774162808,TM +774162809,774162813,US +774162814,774162818,IT +774162819,774162823,KZ +774162824,774162828,US +774162829,774162833,PN +774162834,774162838,SM +774162839,774162848,GB +774162849,774162853,AU +774162854,774162858,NL +774162859,774162863,IE +774162864,774162888,US +774162889,774162893,CA +774162894,774162903,MX +774162904,774162908,GB +774162909,774162913,AX +774162914,774162917,FO +774162918,774162923,SJ +774162924,774162928,CC +774162929,774162933,NR +774162934,774162938,GS +774162939,774162942,UM +774162943,774162944,VA +774162945,774162964,IT +774162965,774162966,MX +774162967,774162967,LI +774162968,774162969,MX +774162970,774162970,BY +774162971,774162974,MX +774162975,774162975,MY +774162976,774162979,LB +774162980,774162980,IN +774162981,774162983,BO +774162984,774162987,SX +774162988,774162991,MX +774162992,774162994,VA +774162995,774162999,IR +774163000,774163000,PK +774163001,774163009,BO +774163010,774163010,VE +774163011,774163014,BO +774163015,774163024,RU +774163025,774163034,UA +774163035,774163039,AE +774163040,774163071,VA +774163072,774163074,GW +774163075,774163124,IT +774163125,774163134,TJ +774163135,774163139,ET +774163140,774163144,DK +774163145,774163149,AF +774163150,774163154,SY +774163155,774163174,UA +774163175,774163179,US +774163180,774163200,VA +774163201,774163203,US +774163204,774163210,AU +774163211,774163215,TD +774163216,774163220,CD +774163221,774163225,DJ +774163226,774163230,CF +774163231,774163235,US +774163236,774163240,MF +774163241,774163245,VC +774163246,774163250,PM +774163251,774163255,BL +774163256,774163260,DM +774163261,774163265,KM +774163266,774163270,TZ +774163271,774163275,ST +774163276,774163280,GB +774163281,774163283,NL +774163284,774163290,FK +774163291,774163330,IT +774163331,774163335,UG +774163336,774163339,MP +774163340,774163343,TL +774163344,774163347,WF +774163348,774163351,SD +774163352,774163359,SS +774163360,774163367,BQ +774163368,774163375,CW +774163376,774163383,IT +774163384,774163399,GE +774163400,774163415,US +774163416,774163455,VA +774163456,774166527,DK +774166528,774168575,EE +774168576,774176767,PL +774176768,774184959,IT +774184960,774193151,GB +774193152,774209535,ES +774209536,774217727,RU +774217728,774225919,GB +774225920,774234111,UA +774234112,774242303,IT +774242304,774258687,RU +774258688,774266879,SA +774266880,774275071,RU +774275072,774279167,IR +774279168,774281215,UA +774281216,774283263,IR +774283264,774291455,GB +774291456,774299647,NL +774299648,774307839,DE +774307840,774324223,RU +774324224,774332415,UA +774332416,774340607,SE +774340608,774348799,EE +774348800,774356991,CZ +774356992,774365183,ES +774365184,774373375,RU +774373376,774383359,RS +774383360,774383615,XK +774383616,774389759,RS +774389760,774406143,BG +774406144,774422527,SY +774422528,774438911,OM +774438912,774455295,DE +774455296,774471679,RU +774471680,774488063,PL +774488064,774504447,IR +774504448,774520831,RU +774520832,774537215,BH +774537216,774553599,RU +774553600,774569983,KZ +774569984,774586367,GB +774586368,774602751,PS +774602752,774619135,GB +774619136,774651903,RU +774651904,774668287,SA +774668288,774684671,NL +774684672,774701055,IT +774701056,774717439,RU +774717440,774733823,PL +774733824,774750207,TR +774750208,774782975,RU +774782976,774799359,UA +774799360,774815743,RU +774815744,774832127,NO +774832128,774848511,RU +774848512,774864895,BG +774864896,774881279,CZ +774881280,774963199,RU +774963200,774995967,GE +774995968,775028735,SA +775028736,775061503,PT +775061504,775094271,RU +775094272,775111877,RO +775111878,775111878,IR +775111879,775127039,RO +775127040,775147519,IE +775147520,775149567,NL +775149568,775151615,SG +775151616,775159807,JP +775159808,775192575,SA +775192576,775225343,RU +775225344,775258111,SY +775258112,775290879,BY +775290880,775323647,MT +775323648,775356415,SI +775356416,775389183,MD +775389184,775421951,BG +775421952,775487487,BY +775487488,775520255,AT +775520256,775553023,SY +775557120,775557375,CH +775569408,775569663,US +775585792,775618559,SY +775618560,775645951,SE +775645952,775646207,NO +775646208,775651327,SE +775651328,775684095,DE +775684096,775716863,PS +775716864,775749631,GB +775749632,775847935,RU +775847936,775880703,IR +775880704,775913471,UA +775913472,775946239,RU +775946240,776077311,GB +776077312,776208383,NO +776208384,776339455,GB +776339456,776470527,AM +776470528,776601599,RU +776601600,776732671,AT +776732672,776863743,PL +776863744,778043391,DE +778043392,778108927,UA +778108928,778174463,RO +778174464,778239999,UA +778240000,778304305,AL +778304306,778304306,SI +778304307,778305535,AL +778305536,778371071,IR +778371072,778388479,GB +778388480,778389503,DE +778389504,778395647,GB +778395648,778436607,DE +778436608,778461183,RO +778461184,778461439,TR +778461440,778462207,RO +778462208,778462463,TR +778462464,778462719,US +778462720,778462975,RO +778462976,778463231,EE +778463232,778463999,RO +778464000,778464255,RU +778464256,778465279,RO +778465280,778466303,IT +778466304,778467327,RO +778467328,778473471,IR +778473472,778474495,RO +778474496,778475519,US +778475520,778475775,CH +778475776,778476031,RO +778476032,778476287,IE +778476288,778477567,RO +778477568,778477695,NL +778477696,778479615,ES +778479616,778480639,RO +778480640,778480895,FR +778480896,778481151,RO +778481152,778481407,GB +778481408,778481663,RO +778481664,778481919,ES +778481920,778482943,GB +778482944,778483199,IE +778483200,778483711,RO +778483712,778484735,IR +778484736,778485247,IT +778485248,778485759,RO +778485760,778493951,GB +778493952,778495999,NL +778496000,778497791,RO +778497792,778500095,NL +778500096,778500351,GB +778500352,778500863,RO +778500864,778500991,CN +778500992,778501119,HK +778501120,778501631,GB +778501632,778502143,RO +778502144,778567679,GR +778567680,778633215,TR +778633216,778638335,FR +778638336,778638591,ES +778638592,778639231,FR +778639232,778639359,FI +778639360,778639615,ES +778639616,778640127,FR +778640128,778640383,GB +778640384,778640639,FR +778640640,778640895,PT +778640896,778641151,FR +778641152,778641407,IE +778641408,778650655,FR +778650656,778650687,LT +778650688,778653855,FR +778653856,778653871,BE +778653872,778653887,FR +778653888,778653903,IE +778653904,778653935,FR +778653936,778653951,GB +778653952,778654031,FR +778654032,778654039,ES +778654040,778654903,FR +778654904,778654907,GB +778654908,778654927,FR +778654928,778654935,ES +778654936,778654959,FR +778654960,778654975,BE +778654976,778655039,FR +778655040,778655103,ES +778655104,778655191,FR +778655192,778655199,LT +778655200,778655223,FR +778655224,778655231,PT +778655232,778655583,FR +778655584,778655615,ES +778655616,778655679,IT +778655680,778655807,FR +778655808,778655871,NL +778655872,778655935,FR +778655936,778655999,IE +778656000,778656223,FR +778656224,778656255,PT +778656256,778656383,FR +778656384,778656447,GB +778656448,778656575,FR +778656576,778656607,PT +778656608,778656639,FR +778656640,778656671,BE +778656672,778656703,IT +778656704,778657399,FR +778657400,778657403,PT +778657404,778657463,FR +778657464,778657471,CZ +778657472,778657535,GB +778657536,778662028,FR +778662029,778662029,ES +778662030,778666063,FR +778666064,778666079,IE +778666080,778666095,ES +778666096,778666259,FR +778666260,778666263,ES +778666264,778666303,FR +778666304,778666367,ES +778666368,778666375,FR +778666376,778666379,GB +778666380,778666479,FR +778666480,778666495,DE +778666496,778666591,FR +778666592,778666607,LT +778666608,778666687,FR +778666688,778666719,ES +778666720,778666847,FR +778666848,778666863,PT +778666864,778666879,FR +778666880,778666943,GB +778666944,778666975,FR +778666976,778667007,PL +778667008,778667175,FR +778667176,778667179,ES +778667180,778667347,FR +778667348,778667351,GB +778667352,778667499,FR +778667500,778667503,GB +778667504,778667999,FR +778668000,778668003,GB +778668004,778668271,FR +778668272,778668279,ES +778668280,778668391,FR +778668392,778668395,FI +778668396,778668399,ES +778668400,778668479,FR +778668480,778668495,ES +778668496,778668607,FR +778668608,778668615,IE +778668616,778668627,FR +778668628,778668631,ES +778668632,778668719,FR +778668720,778668723,PT +778668724,778668731,FR +778668732,778668735,GB +778668736,778668799,FR +778668800,778668831,FI +778668832,778668863,FR +778668864,778668895,DE +778668896,778669055,FR +778669056,778669087,ES +778669088,778669211,FR +778669212,778669215,ES +778669216,778669223,FR +778669224,778669231,GB +778669232,778669451,FR +778669452,778669455,ES +778669456,778669663,FR +778669664,778669695,FI +778669696,778669823,FR +778669824,778669855,ES +778669856,778669935,FR +778669936,778669951,ES +778669952,778669967,FR +778669968,778669975,IE +778669976,778669979,PT +778669980,778669983,IE +778669984,778670047,FR +778670048,778670079,GB +778670080,778670175,FR +778670176,778670207,GB +778670208,778670751,FR +778670752,778670755,DE +778670756,778670975,FR +778670976,778670976,DE +778670977,778671201,FR +778671202,778671202,ES +778671203,778671915,FR +778671916,778671919,GB +778671920,778672063,FR +778672064,778672067,GB +778672068,778672071,FR +778672072,778672079,GB +778672080,778672095,FR +778672096,778672111,IE +778672112,778672119,FR +778672120,778672123,ES +778672124,778672383,FR +778672384,778672447,NL +778672448,778672479,FR +778672480,778672511,ES +778672512,778672639,FR +778672640,778672703,PT +778672704,778673187,FR +778673188,778673191,ES +778673192,778673207,FR +778673208,778673211,ES +778673212,778673279,FR +778673280,778673283,GB +778673284,778673751,FR +778673752,778673759,DE +778673760,778673883,FR +778673884,778673887,ES +778673888,778674303,FR +778674304,778674367,DE +778674368,778674535,FR +778674536,778674539,ES +778674540,778674768,FR +778674769,778674769,BE +778674770,778674783,FR +778674784,778674799,GB +778674800,778674991,FR +778674992,778674995,GB +778674996,778674999,FR +778675000,778675003,FI +778675004,778675007,PL +778675008,778675199,FR +778675200,778675207,ES +778675208,778675631,FR +778675632,778675639,ES +778675640,778675695,FR +778675696,778675711,BE +778675712,778675767,FR +778675768,778675775,ES +778675776,778675795,FR +778675796,778675799,ES +778675800,778675819,FR +778675820,778675823,GB +778675824,778675827,ES +778675828,778675891,FR +778675892,778675895,ES +778675896,778676127,FR +778676128,778676131,ES +778676132,778676143,FR +778676144,778676159,ES +778676160,778676367,FR +778676368,778676383,GB +778676384,778676555,FR +778676556,778676559,ES +778676560,778676623,FR +778676624,778676627,GB +778676628,778676631,ES +778676632,778676639,FR +778676640,778676655,ES +778676656,778676719,FR +778676720,778676723,GB +778676724,778677095,FR +778677096,778677099,PL +778677100,778677183,FR +778677184,778677215,ES +778677216,778677255,FR +778677256,778677259,ES +778677260,778677375,FR +778677376,778677391,GB +778677392,778677399,FR +778677400,778677403,PT +778677404,778677503,FR +778677504,778677505,GB +778677506,778677506,ES +778677507,778677507,GB +778677508,778677759,ES +778677760,778678859,FR +778678860,778678863,GB +778678864,778678919,FR +778678920,778678927,ES +778678928,778679212,FR +778679213,778679214,FI +778679215,778679279,FR +778679280,778679295,ES +778679296,778679491,FR +778679492,778679495,ES +778679496,778680147,FR +778680148,778680151,GB +778680152,778680175,FR +778680176,778680183,ES +778680184,778680227,FR +778680228,778680231,IE +778680232,778680575,FR +778680576,778680639,DE +778680640,778680643,FR +778680644,778680647,PT +778680648,778680651,FR +778680652,778680655,ES +778680656,778680683,FR +778680684,778680687,ES +778680688,778681023,FR +778681024,778681087,FI +778681088,778681359,FR +778681360,778681367,ES +778681368,778681423,FR +778681424,778681431,FI +778681432,778681463,FR +778681464,778681471,ES +778681472,778681503,FR +778681504,778681507,DE +778681508,778681519,FR +778681520,778681523,ES +778681524,778681615,FR +778681616,778681619,ES +778681620,778681707,FR +778681708,778681711,ES +778681712,778681775,FR +778681776,778681779,GB +778681780,778681983,FR +778681984,778681999,PT +778682000,778682079,FR +778682080,778682095,PT +778682096,778686543,FR +778686544,778686559,LT +778686560,778687431,FR +778687432,778687439,IT +778687440,778688447,FR +778688448,778688451,CZ +778688452,778689007,FR +778689008,778689015,FI +778689016,778689151,FR +778689152,778689183,CZ +778689184,778689923,FR +778689924,778689927,DE +778689928,778690655,FR +778690656,778690687,ES +778690688,778690735,FR +778690736,778690751,PT +778690752,778691763,FR +778691764,778691767,DE +778691768,778691887,FR +778691888,778691895,PT +778691896,778691975,FR +778691976,778691983,ES +778691984,778692143,FR +778692144,778692159,DE +778692160,778692191,FR +778692192,778692195,ES +778692196,778692199,FR +778692200,778692207,ES +778692208,778692499,FR +778692500,778692503,ES +778692504,778692527,FR +778692528,778692535,BE +778692536,778692551,FR +778692552,778692555,ES +778692556,778692619,FR +778692620,778692623,ES +778692624,778692743,FR +778692744,778692747,ES +778692748,778692767,FR +778692768,778692783,ES +778692784,778692827,FR +778692828,778692831,GB +778692832,778692891,FR +778692892,778692895,GB +778692896,778693095,FR +778693096,778693103,ES +778693104,778693159,FR +778693160,778693163,ES +778693164,778693175,FR +778693176,778693179,ES +778693180,778693427,FR +778693428,778693431,ES +778693432,778693439,FR +778693440,778693455,GB +778693456,778693471,FR +778693472,778693503,NL +778693504,778693663,FR +778693664,778693679,ES +778693680,778693759,FR +778693760,778693763,ES +778693764,778693855,FR +778693856,778693887,BE +778693888,778693967,FR +778693968,778693971,ES +778693972,778694659,FR +778694660,778694663,NL +778694664,778695087,FR +778695088,778695103,PT +778695104,778695119,FR +778695120,778695135,LT +778695136,778695203,FR +778695204,778695207,ES +778695208,778695375,FR +778695376,778695391,FI +778695392,778695471,FR +778695472,778695475,ES +778695476,778695535,FR +778695536,778695551,ES +778695552,778695767,FR +778695768,778695775,ES +778695776,778695795,FR +778695796,778695799,ES +778695800,778695823,FR +778695824,778695839,FI +778695840,778695991,FR +778695992,778695999,IT +778696000,778696219,FR +778696220,778696223,GB +778696224,778696271,FR +778696272,778696287,ES +778696288,778696435,FR +778696436,778696439,GB +778696440,778696495,FR +778696496,778696499,ES +778696500,778696811,FR +778696812,778696815,DE +778696816,778696847,FR +778696848,778696851,ES +778696852,778696983,FR +778696984,778696987,ES +778696988,778696991,FR +778696992,778696995,ES +778696996,778697055,FR +778697056,778697063,ES +778697064,778697067,FR +778697068,778697071,ES +778697072,778697175,FR +778697176,778697179,ES +778697180,778697279,FR +778697280,778697287,IE +778697288,778697311,FR +778697312,778697343,ES +778697344,778697435,FR +778697436,778697439,GB +778697440,778697471,FR +778697472,778697479,CZ +778697480,778697727,FR +778697728,778697791,ES +778697792,778697815,FR +778697816,778697819,ES +778697820,778697955,FR +778697956,778697959,ES +778697960,778698243,FR +778698244,778698247,GB +778698248,778698295,FR +778698296,778698303,IE +778698304,778698447,FR +778698448,778698451,ES +778698452,778698511,FR +778698512,778698519,FI +778698520,778698591,FR +778698592,778698595,BE +778698596,778698627,FR +778698628,778698631,ES +778698632,778698643,FR +778698644,778698647,ES +778698648,778698703,FR +778698704,778698707,ES +778698708,778698751,FR +778698752,778764287,TR +778764288,778822655,HU +778822656,778823423,UA +778823424,778829823,HU +778829824,778862591,RO +778862592,778895359,GB +778895360,778960895,LV +778960896,779026431,DE +779026432,779091967,RU +779091968,779223039,PL +779223040,779354111,DE +779354112,779485183,IL +779485184,779616255,UA +779616256,779747327,IL +779747328,779878399,SI +779878400,780009471,AT +780009472,780140543,CH +780140544,780206079,DE +780206080,780271615,NL +780271616,780337151,AM +780337152,780402687,EE +780402688,780468223,FI +780468224,780533759,UA +780533760,780599295,PL +780599296,780664831,CZ +780664832,780730367,ES +780730368,780779519,IE +780779520,780795903,SG +780795904,780861439,RU +780861440,780926975,HU +780926976,780992511,CH +780992512,781058047,IT +781058048,781123583,DE +781123584,781189119,IR +781189120,781320191,NL +781320192,781451263,RU +781451264,781455359,PL +781455360,781459455,UA +781459456,781463551,IR +781463552,781467647,RU +781467648,781475839,PL +781475840,781479935,RU +781479936,781480191,UA +781480192,781480447,RO +781480448,781480703,BE +781480704,781484031,UA +781484032,781488127,RU +781488128,781496319,PL +781496320,781497343,RU +781497344,781498367,UA +781498368,781516799,RU +781516800,781520895,SA +781520896,781524991,IS +781524992,781529087,RU +781529088,781533183,UA +781533184,781537279,RU +781537280,781541375,UA +781545472,781549567,CZ +781549568,781553663,RU +781553664,781557759,PL +781557760,781565951,UA +781565952,781570047,IT +781570048,781574143,PL +781574144,781578239,RU +781578240,781582335,PL +781582336,781590527,UA +781590528,781598719,SI +781598720,781615103,UA +781615104,781631487,RU +781631488,781639679,SK +781639680,781651967,RU +781651968,781654015,PL +781654016,781656063,RU +781656064,781658111,RO +781658112,781660159,UA +781660160,781662207,RU +781662208,781664255,SK +781664256,781666303,RU +781666304,781668351,PL +781668352,781670399,UA +781670400,781672447,RU +781672448,781674495,BE +781674496,781676543,RU +781676544,781678591,PL +781678592,781682687,RS +781682688,781684735,PL +781684736,781686783,UA +781686784,781688831,RU +781688832,781690879,RO +781690880,781692927,RU +781692928,781694975,UA +781694976,781697023,PL +781697024,781699071,UA +781699072,781701119,AT +781701120,781703167,SA +781703168,781705215,PL +781705216,781707263,RO +781707264,781709311,SI +781709312,781711359,RU +781711360,781713407,UA +781713408,781844479,SA +781844480,781975551,TR +781975552,782106623,NO +782106624,782254079,RU +782254080,782270463,UA +782270464,782311167,RU +782311168,782311423,MD +782311424,782313471,RU +782313472,782313727,UA +782313728,782316543,RU +782316544,782317567,DE +782317568,782317695,IN +782317696,782317823,CN +782317824,782317951,TR +782317952,782318079,JP +782318080,782318207,SA +782318208,782318335,IL +782318336,782318463,AU +782318464,782318591,RU +782318592,782318719,ES +782318720,782318847,RU +782318848,782318975,IS +782318976,782319103,BE +782319104,782319231,KZ +782319232,782319359,RU +782319360,782319487,MD +782319488,782319615,RU +782319616,782335999,ME +782336000,782352383,RU +782352384,782368767,SY +782368768,782385151,UA +782385152,782401535,SE +782401536,782417919,FR +782417920,782434303,AM +782434304,782434815,HR +782434816,782446591,SI +782446592,782447359,BA +782447360,782447615,HR +782447616,782447871,SI +782447872,782448127,HR +782448128,782449151,SI +782449152,782449407,HR +782449408,782449471,RS +782449472,782449663,SI +782449664,782450687,BA +782450688,782467071,DE +782467072,782483455,RU +782483456,782499839,FI +782499840,782516223,SI +782516224,782532607,IR +782532608,782548991,UA +782548992,782581759,RU +782581760,782598143,FR +782598144,782616643,DE +782616644,782616644,RU +782616645,782630911,DE +782630912,782647295,MD +782647296,782663679,RU +782663680,782671871,NL +782671872,782672655,LT +782672656,782672663,VG +782672664,782673935,LT +782673936,782673943,EE +782673944,782674439,LT +782674440,782674447,CA +782674448,782674471,LT +782674472,782674479,CA +782674480,782674959,LT +782674960,782674975,CR +782674976,782675967,LT +782675968,782680063,NL +782680064,782696447,RU +782696448,782712831,DE +782712832,782729215,RU +782729216,782737407,IR +782737408,782745599,DE +782745600,782761983,CZ +782761984,783024127,PL +783024128,783040511,RU +783040512,783048703,UA +783048704,783056895,RU +783056896,783065087,UA +783065088,783073279,RU +783073280,783081471,UA +783081472,783089663,AD +783089664,783114239,RU +783114240,783134719,UA +783134720,783138815,RU +783138816,783142911,CZ +783142912,783147007,RU +783147008,783151103,FI +783151104,783155199,RO +783155200,783157247,PL +783157248,783159295,RU +783159296,783161343,CZ +783161344,783163391,PL +783163392,783165439,CZ +783165440,783169535,RU +783169536,783171583,CZ +783171584,783173631,UA +783173632,783175679,PL +783175680,783179775,RU +783179776,783181823,RS +783181824,783185919,RU +783185920,783187967,UA +783187968,783190015,NL +783190016,783194111,RO +783194112,783196159,CZ +783196160,783198207,UA +783198208,783202303,PL +783204352,783206399,RU +783206400,783208447,RO +783208448,783210495,PL +783210496,783212543,UA +783212544,783216639,PL +783216640,783218687,UA +783218688,783220735,RU +783220736,783222783,SK +783222784,783223807,CH +783223808,783224063,RU +783224064,783224319,GB +783224320,783224831,PL +783224832,783226879,UA +783226880,783230975,RU +783230976,783233023,PL +783233024,783235071,GB +783235072,783237119,DE +783237120,783243263,UA +783243264,783245311,CZ +783245312,783247359,RU +783247360,783251455,PL +783251456,783255551,RU +783255552,783259647,UA +783261696,783263743,UA +783263744,783265791,BY +783265792,783267839,CZ +783267840,783269887,UA +783269888,783278079,RU +783278080,783282175,PL +783282176,783286271,UA +783286272,783417343,GR +783417344,783548415,BE +783548416,783679487,RU +783679488,783681535,FR +783681536,783683583,IE +783683584,783685631,DE +783685632,783687679,RU +783687680,783688447,IR +783688448,783688703,ES +783688704,783689727,IR +783689728,783691775,FR +783691776,783693823,BY +783693824,783694367,GB +783694368,783694399,DE +783694400,783695871,GB +783695872,783697919,TR +783697920,783699967,FR +783699968,783702015,UA +783702016,783704063,IT +783704064,783706111,PL +783706112,783708159,NL +783708160,783710207,FI +783710208,783712255,NL +783712256,783714303,RU +783714304,783718399,DE +783718400,783720447,IT +783720448,783722495,FI +783722496,783724543,AM +783724544,783726591,NL +783726592,783728639,IS +783728640,783730687,BE +783730688,783732735,SE +783732736,783734783,FR +783734784,783736831,NL +783736832,783738879,SI +783738880,783740927,IT +783740928,783745023,DE +783745024,783747071,RU +783747072,783749119,GB +783749120,783751167,GR +783751168,783753215,SE +783753216,783755263,FR +783755264,783757311,DE +783757312,783759359,FR +783759360,783763455,CZ +783763456,783765503,FI +783765504,783767551,RU +783767552,783769599,IL +783769600,783771647,DE +783771648,783773695,FR +783773696,783775743,ES +783775744,783777791,AL +783777792,783779839,RU +783779840,783781887,DK +783781888,783782143,NL +783782144,783782399,US +783782400,783783935,NL +783783936,783785983,DE +783785984,783788031,RU +783788032,783790079,NO +783790080,783792127,RU +783794176,783798271,GB +783798272,783800319,PL +783800320,783802367,LV +783802368,783804415,FR +783804416,783806463,IT +783806464,783810559,NL +783810560,783843327,SA +783843328,783876095,BH +783876096,783908863,UA +783908864,783941631,JO +783941632,783974399,PL +783974400,784007167,KW +784007168,784039935,RU +784039936,784072703,PL +784072704,784105471,RU +784105472,784138239,HR +784138240,784145617,DE +784145618,784145618,BE +784145619,784155483,DE +784155484,784155487,CH +784155488,784155491,NL +784155492,784155495,BE +784155496,784155503,AT +784155504,784155511,GB +784155512,784155519,CZ +784155520,784155611,DE +784155612,784155615,CH +784155616,784155619,NL +784155620,784155623,BE +784155624,784155631,AT +784155632,784155639,GB +784155640,784155640,CZ +784155641,784169215,DE +784169216,784169231,AL +784169232,784169247,BG +784169248,784169263,CZ +784169264,784169279,MK +784169280,784169343,AT +784169344,784169407,HU +784169408,784169471,SE +784169472,784171007,DE +784171008,784203775,PT +784203776,784236543,GR +784236544,784237567,IT +784237568,784238591,ES +784238592,784238847,GB +784238848,784239103,US +784239104,784240895,GB +784240896,784241151,SG +784241152,784268799,GB +784268800,784269055,US +784269056,784269311,GB +784269312,784302079,BY +784302080,784334847,RU +784334848,784457727,FR +784457728,784461823,GB +784461824,784463359,FR +784463360,784464383,GB +784464384,784465919,FR +784465920,784596991,SE +784596992,784728063,TR +784728064,784793599,GR +784793600,784859135,CY +784859136,785121279,UA +785121280,785252351,PL +785252352,785383423,AT +785383424,785448959,GB +785448960,785514495,IR +785514496,785580031,IL +785580032,785609020,UA +785609021,785609021,US +785609022,785645567,UA +785645568,785711103,NO +785711104,785776639,SY +785776640,785842175,RO +785842176,785907711,PL +785907712,785973247,BY +785973248,786038783,MK +786038784,786046463,FR +786046464,786046975,GB +786046976,786104319,FR +786104320,786169855,UA +786169856,786235391,AT +786235392,786300927,TR +786300928,786366463,ES +786366464,786431999,DE +786432000,786563071,IR +786563072,786565119,GB +786565120,786567167,NO +786567168,786569215,CZ +786569216,786571263,NO +786571264,786575359,ES +786575360,786576098,GB +786576099,786576099,SE +786576100,786576102,GB +786576103,786576103,BE +786576104,786577407,GB +786577408,786579455,NL +786579456,786581503,RU +786581504,786583551,GB +786583552,786585599,DE +786585600,786587647,NL +786587648,786589695,RU +786589696,786590719,FR +786590720,786591743,LU +786591744,786593791,DE +786593792,786595839,GB +786595840,786597887,FR +786597888,786599935,EE +786599936,786601983,ES +786601984,786603007,SE +786603008,786603519,NL +786603520,786604031,SE +786604032,786606079,RU +786606080,786608127,GB +786608128,786610175,IT +786610176,786612223,IM +786612224,786614271,GR +786614272,786616319,IT +786616320,786618367,KG +786618368,786620415,GB +786620416,786622463,RU +786622464,786624511,NL +786624512,786626559,RU +786626560,786628607,GB +786628608,786630655,IT +786630656,786632703,CZ +786632704,786634751,FR +786634752,786636799,RU +786636800,786638847,PL +786638848,786642943,GB +786642944,786644991,GR +786644992,786649087,SE +786649088,786651135,FR +786651136,786655231,DE +786655232,786657279,PL +786657280,786659327,FO +786659328,786661375,UZ +786661376,786663423,DE +786663424,786665471,UA +786665472,786667519,GB +786667520,786669567,IT +786669568,786671615,RU +786671616,786673663,CZ +786673664,786675711,SK +786675712,786677759,KZ +786677760,786679807,NO +786679808,786681855,GB +786681856,786683903,RU +786683904,786685951,DE +786685952,786687999,CH +786688000,786690047,NL +786690048,786692095,PL +786692096,786694143,LB +786694144,786698239,RU +786698240,786702335,CZ +786702336,786706431,GB +786706432,786710527,NO +786710528,786714623,RU +786714624,786718719,PL +786718720,786726911,RU +786726912,786731007,FI +786731008,786735103,IL +786735104,786739199,GB +786739200,786743295,AZ +786743296,786747391,DE +786747392,786751487,SK +786751488,786755583,PL +786755584,786759679,IT +786759680,786771967,DE +786771968,786776063,UA +786776064,786780159,RU +786780160,786784255,IT +786784256,786788351,RU +786788352,786792447,CZ +786792448,786796543,RU +786796544,786800639,PL +786800640,786804735,US +786804736,786808831,RU +786808832,786812927,BG +786812928,786817023,RU +786817024,786821119,SK +786821120,786824703,HR +786824704,786825215,CN +786825216,786857983,SA +786857984,786868223,NO +786868224,786890751,SE +786890752,786892799,ES +786892800,786894847,GB +786894848,786896895,NL +786896896,786900991,IT +786900992,786903039,NL +786905088,786907135,PL +786907136,786909183,GB +786909184,786911231,CZ +786911232,786913279,NL +786913280,786915327,DE +786915328,786917375,SK +786917376,786919423,US +786919424,786919639,GB +786919640,786919655,IT +786919656,786919687,GB +786919688,786919695,IT +786919696,786920191,GB +786920192,786920199,IT +786920200,786920615,GB +786920616,786920623,IT +786920624,786920999,GB +786921000,786921007,IT +786921008,786921087,GB +786921088,786921095,IT +786921096,786921471,GB +786921472,786923519,ES +786923520,786925567,FR +786925568,786927615,DE +786927616,786929663,FR +786929664,786931711,PL +786931712,786933759,GB +786933760,786935807,RU +786935808,786937855,DE +786937856,786939903,GB +786939904,786941951,FI +786941952,786943999,CH +786944000,786946047,RU +786946048,786948095,FR +786948096,786950143,UA +786950144,786952191,DE +786952192,786952703,NE +786952704,786952959,US +786952960,786953215,NE +786953216,786954239,US +786954240,786956287,NL +786956288,786989055,RU +786989056,786991103,PL +786991104,786995199,IT +786995200,786997247,BG +786997248,786999295,RU +786999296,787001343,ES +787001344,787003391,CH +787003392,787005439,DE +787005440,787007487,GB +787007488,787009535,RU +787011584,787013631,RU +787013632,787015679,DE +787015680,787017727,UA +787017728,787019775,RU +787021824,787038207,BG +787038208,787038463,GB +787038464,787038719,IE +787038720,787038975,DE +787038976,787039231,FR +787039232,787039247,AR +787039248,787039263,PE +787039264,787039279,VE +787039280,787039295,GB +787039296,787039423,AT +787039424,787039551,NL +787039552,787039679,ES +787039680,787039807,BE +787039808,787039935,PT +787039936,787040255,GB +787040256,787040383,IT +787040384,787040511,DK +787040512,787054591,GB +787054592,787070975,IT +787070976,787087359,RU +787087360,787095551,TR +787095680,787095711,CH +787096576,787097855,CH +787098112,787098879,CH +787099392,787100671,CH +787101696,787102719,CH +787103744,787111935,HR +787111936,787116287,CZ +787116288,787116543,US +787116544,787120127,CZ +787120128,787128319,ES +787128320,787136511,CZ +787136512,787152895,IT +787152896,787154943,GB +787154944,787156991,TR +787156992,787159039,FR +787159040,787161087,DE +787161088,787163135,GB +787163136,787165183,NL +787165184,787167231,RU +787167232,787169279,CH +787169280,787171327,RU +787171328,787172863,KG +787172864,787173375,RU +787173376,787175423,KZ +787175424,787177471,SA +787177472,787179519,RS +787179520,787183615,DE +787183616,787185663,PL +787185664,787187711,GG +787187712,787189759,IT +787189760,787191807,CH +787191808,787192063,GB +787192064,787192319,FR +787192320,787192575,DE +787192576,787192831,SE +787192832,787193087,AE +787193088,787193343,FI +787193344,787193599,DE +787193600,787193855,IT +787193856,787195903,RU +787195904,787197951,GB +787197952,787199999,FR +787200000,787202047,RU +787202048,787206143,DE +787206144,787208191,BH +787208192,787210239,RU +787210240,787212287,GB +787212288,787214335,SE +787214336,787216383,DE +787216384,787218431,RU +787218432,787234815,GB +787234816,787236559,SE +787236560,787236575,NO +787236576,787251199,SE +787251200,787267583,RU +787267584,787283967,DE +787283968,787300351,RU +787300352,787316735,BG +787316736,787333119,GB +787333120,787349503,DE +787349504,787365887,BG +787365888,787382271,PL +787382272,787398655,GP +787398656,787415039,PL +787415040,787431423,BA +787431424,787447807,SE +787447808,787464191,PL +787464192,787480575,IS +787480576,787513343,SA +787513344,787546111,RS +787546112,787578879,RU +787578880,787582975,AM +787582976,787587071,RU +787587072,787611647,AM +787611648,787644415,RU +787644416,787677183,PL +787677184,787679231,GB +787679232,787681279,RU +787681280,787683327,IQ +787683328,787685375,NL +787685376,787687423,IT +787687424,787689471,NL +787689472,787691519,CZ +787693568,787695615,SK +787695616,787697663,RU +787697664,787701759,DE +787701760,787703807,NL +787703808,787705855,AT +787705856,787707903,RO +787707904,787709951,DE +787709952,787711487,IE +787711488,787711999,GB +787712000,787712255,MT +787712256,787712511,MA +787712512,787713023,DE +787713024,787713279,BE +787713280,787713535,SE +787713536,787713791,BG +787713792,787714047,GR +787714048,787714303,IM +787714304,787714559,SY +787714560,787714815,LB +787714816,787715071,QA +787715072,787715327,OM +787715328,787715583,YE +787715584,787715839,BH +787715840,787716095,GL +787716096,787718143,NL +787718144,787718911,RU +787718912,787719167,NL +787719168,787719679,RU +787719680,787719935,NL +787719936,787722239,RU +787722240,787722751,NL +787722752,787725311,RU +787725312,787728639,NL +787728640,787728895,RU +787728896,787729407,NL +787729408,787730431,US +787730432,787731199,SE +787731200,787731967,CA +787731968,787732479,LU +787732480,787732735,CH +787732736,787733247,BE +787733248,787733759,RU +787733760,787734015,AT +787734016,787734271,IE +787734272,787734527,RO +787734528,787736575,US +787736576,787737599,GB +787737600,787738367,DE +787738368,787739135,NL +787739136,787739903,CA +787739904,787740671,AU +787740672,787741183,BE +787741184,787741695,HK +787741696,787741951,RU +787741952,787742207,NL +787742208,787742719,RU +787742720,787747327,NL +787747328,787747583,IE +787747584,787749887,NL +787749888,787750143,US +787750144,787750159,BD +787750160,787750175,BT +787750176,787750191,BN +787750192,787750192,CN +787750193,787750207,NL +787750208,787750223,FJ +787750224,787750239,ID +787750240,787750255,LA +787750256,787750271,MO +787750272,787750287,MY +787750288,787750303,MV +787750304,787750319,MM +787750320,787750335,NP +787750336,787750351,PK +787750352,787750367,PG +787750368,787750383,LK +787750384,787750399,NL +787750400,787750655,US +787750656,787750911,NL +787750912,787755007,GB +787755008,787759103,NL +787759104,787767295,PS +787767296,787768319,IT +787768320,787771135,NL +787771136,787771391,IT +787771392,787772159,NL +787772160,787772415,FR +787772416,787773439,US +787773440,787775487,NL +787775488,787808255,DE +787808256,787841023,IR +787841024,787843071,RU +787843072,787845119,GR +787845120,787847167,CH +787847168,787849215,SE +787849216,787851263,TR +787851264,787853311,RU +787853312,787855359,DE +787855360,787857407,CH +787857408,787859455,PL +787859456,787861503,AT +787861504,787863551,IE +787863552,787865599,DE +787865600,787869695,FR +787869696,787873791,GB +787873792,787881745,SE +787881746,787881747,FR +787881748,787890175,SE +787890176,787890431,NL +787890432,787891247,SE +787891248,787891251,ES +787891252,787900415,SE +787900416,787900671,DE +787900672,787900927,SE +787900928,787901183,DK +787901184,787906559,SE +787906560,787939327,GR +787939328,787972095,GB +787972096,788004863,UA +788004864,788005375,GB +788005376,788006399,BE +788006400,788006911,IT +788006912,788007423,FR +788007424,788007935,DE +788007936,788008447,US +788008448,788008959,SG +788008960,788009471,IN +788009472,788009983,ES +788009984,788010495,HK +788010496,788011007,AU +788011008,788011519,CN +788011520,788012031,AR +788012032,788012543,CA +788012544,788013055,RU +788013056,788021247,IR +788021248,788029439,SI +788029440,788045823,GB +788045824,788054015,PL +788054016,788062207,JO +788062208,788070399,GB +788070400,788078591,RU +788078592,788086783,NL +788086784,788094975,BG +788094976,788095231,IR +788095232,788095487,DE +788095488,788103167,IR +788103168,788111359,HU +788111360,788119551,LT +788119552,788127743,GB +788127744,788135935,NO +788135936,788144127,UA +788144128,788160511,RU +788160512,788168703,UA +788168704,788176895,RU +788176896,788185087,PL +788185088,788193279,NO +788193280,788201471,GB +788201472,788209663,HU +788209664,788217855,LT +788217856,788226047,RU +788226048,788234239,CY +788234240,788242431,SA +788242432,788250623,IR +788250624,788258815,KG +788258816,788259071,IR +788259072,788259327,DE +788259328,788259583,IR +788259584,788261375,DE +788261376,788261631,GB +788261632,788262143,DE +788262144,788262399,IR +788262400,788265215,DE +788265216,788265727,ES +788265728,788265983,DE +788265984,788267007,ES +788267008,788271103,SE +788271104,788275199,DE +788275200,788279295,AL +788279296,788283391,BG +788283392,788291583,GB +788291584,788295679,TR +788295680,788299775,RU +788299776,788303871,DE +788303872,788307967,IT +788307968,788312063,RU +788312064,788316159,FR +788316160,788320255,NL +788320256,788324351,UA +788324352,788328447,CZ +788328448,788332543,RU +788332544,788336639,BG +788336640,788340735,DE +788340736,788344831,ES +788344832,788353023,DE +788353024,788357119,PS +788357120,788361215,CZ +788361216,788365311,DE +788365312,788369407,IQ +788369408,788373503,DE +788373504,788377599,BE +788377600,788381695,CH +788381696,788385791,SE +788385792,788389887,PL +788389888,788393983,ES +788393984,788398079,DE +788398080,788400127,SI +788400128,788402175,SE +788402176,788406271,RU +788406272,788410367,IT +788410368,788412415,TR +788412416,788414463,SI +788414464,788416511,CZ +788416512,788418559,PL +788418560,788422655,RU +788422656,788424703,FI +788424704,788426751,IT +788426752,788428799,GB +788428800,788430847,DE +788430848,788432895,BG +788432896,788434943,DE +788434944,788436991,SI +788436992,788439039,IT +788439040,788441087,RU +788441088,788443135,NL +788443136,788445183,IT +788445184,788451327,GB +788451328,788453375,FI +788453376,788455423,RU +788455424,788457471,FR +788457472,788459519,IT +788459520,788461567,RU +788461568,788463615,JE +788463616,788465663,GB +788465664,788467711,CZ +788467712,788469759,NO +788469760,788471807,NL +788471808,788473855,UA +788473856,788474111,DE +788474112,788475903,GB +788475904,788477951,FR +788477952,788479999,OM +788480000,788482047,UZ +788482048,788484095,GB +788484096,788486143,IT +788486144,788488191,NL +788488192,788490239,RU +788490240,788492287,NL +788492288,788494335,GB +788494336,788494591,US +788494592,788495103,CY +788495104,788495615,US +788495616,788495871,GB +788495872,788496383,CY +788496384,788498431,FR +788498432,788500479,RU +788500480,788502527,AL +788502528,788504575,IE +788504576,788506623,FR +788506624,788508671,CH +788508672,788509439,AT +788509440,788509711,FR +788509712,788509951,AT +788509952,788509983,FR +788509984,788510191,AT +788510192,788510207,FR +788510208,788510719,AT +788510720,788512320,ES +788512321,788512383,NO +788512384,788512767,ES +788512768,788514815,FI +788514816,788516863,FR +788516864,788518911,LT +788518912,788520959,IR +788520960,788523007,CZ +788523008,788525055,KZ +788525056,788527103,IT +788527104,788529151,GB +788529152,789053439,CA +789053440,789184511,IN +789184512,789250047,CA +789250048,789315583,IN +789315584,789512191,CA +789512192,789577727,IN +789577728,790102015,US +790102016,790429695,CA +790429696,790626303,IN +790626304,791937023,US +791937024,792002559,HK +792002560,792068095,IT +792068096,792199167,CA +792199168,792338431,US +792338432,792371199,ES +792371200,792387583,US +792387584,792723455,ES +792723456,793247743,DE +793247744,793313279,NZ +793313280,793378815,DE +793378816,793395199,JP +793395200,793411583,AU +793411584,793444351,SG +793444352,794329087,US +794329088,794361855,SG +794361856,794369288,HK +794369289,794369289,CN +794369290,794378239,HK +794378240,794390527,US +794390528,794391807,IN +794391808,794392575,ID +794392576,794392831,TH +794392832,794393087,ID +794393088,794427391,US +794427392,794460159,HK +794460160,794492927,US +794492928,794501119,JP +794501120,794509311,AU +794509312,794517503,DE +794517504,794525695,AE +794525696,794558463,HK +794558464,796917759,CN +796917760,797442047,CA +797442048,800522240,US +800522241,800522241,CA +800522242,803209215,US +803209216,803930111,CA +803930112,804716543,US +804716544,804782079,IN +804782080,804913151,CA +804913152,805208063,US +805208064,805224447,DE +805224448,805240831,US +805240832,805306367,CA +805306368,822083583,US +822083584,822084607,ID +822084608,822085631,BD +822085632,822087679,AU +822087680,822089727,JP +822089728,822090751,ID +822090752,822091775,NZ +822091776,822099967,BD +822099968,822116351,TH +822116352,822149119,MN +822149120,822214655,KR +822214656,822345727,AU +822345728,822607871,CN +822607872,822870015,KR +822870016,823132159,IN +823132160,824180735,KR +824180736,825229311,IN +825229312,825360383,TH +825360384,825361407,KR +825361408,825363455,ID +825363456,825364479,MY +825364480,825376767,KR +825376768,825393151,IN +825393152,825409535,KR +825409536,825419775,NZ +825419776,825420799,TH +825420800,825421823,MY +825421824,825425919,NZ +825425920,825753599,CN +825753600,826277887,KR +826277888,828375039,CN +828375040,829423615,JP +829423616,830210047,CN +830210048,830341119,MY +830341120,830406655,NP +830406656,830472191,AU +830472192,830474239,CN +830474240,830475263,SG +830475264,830476287,AU +830476288,830480383,JP +830480384,830488575,SG +830488576,830496767,HK +830496768,830498815,JP +830498816,830499839,GU +830499840,830500863,IN +830500864,830504959,TW +830504960,830513151,JP +830513152,830517247,IN +830517248,830521343,ID +830521344,830529535,KR +830529536,830537727,AU +830537728,830603263,JP +830603264,830734335,HK +830734336,830996479,JP +830996480,831258623,IN +831258624,831389695,CN +831389696,831512575,KR +831512576,831513599,AU +831513600,831514623,NZ +831514624,831514975,HK +831514976,831515007,AU +831515008,831515135,HK +831515136,831515143,AU +831515144,831515647,HK +831515648,831516671,AU +831516672,831518719,JP +831518720,831519743,AU +831519744,831520767,IN +831520768,831666800,PH +831666801,831666801,HK +831666802,832045055,PH +832045056,832307199,CN +832307200,832308223,KH +832308224,832311295,JP +832311296,832312319,AU +832312320,832313343,ID +832313344,832315391,AU +832315392,832319487,KH +832319488,832320511,NU +832320512,832321535,VN +832321536,832323583,ID +832323584,832348159,IN +832348160,832372735,JP +832372736,832438271,PH +832438272,832569343,TW +832569344,833617919,KR +833617920,835190783,AU +835190784,835715071,IN +835715072,835977215,CN +835977216,836042751,JP +836042752,836046847,HK +836046848,836048895,SG +836048896,836049919,HK +836049920,836050431,SG +836050432,836050943,HK +836050944,836059135,IN +836059136,836075519,VN +836075520,836501503,TW +836501504,836763647,CN +836763648,837025791,NZ +837025792,837287935,TH +837287936,837550079,CN +837550080,837566463,IN +837566464,837599231,KR +837599232,837603327,MY +837603328,837604351,VN +837604352,837605375,NP +837605376,837607423,ID +837607424,837611519,JP +837611520,837615615,AU +837615616,837681151,TH +837681152,837689343,JP +837689344,837697535,IN +837697536,837746687,KR +837746688,837763071,CN +837763072,837779455,JP +837779456,837795839,KR +837795840,837812223,CN +837812224,838074367,JP +838074368,838139903,NP +838139904,838205439,SG +838205440,838238207,KR +838238208,838262783,VN +838262784,838270975,CN +838270976,838336511,KR +838336512,838467583,IN +838467584,838729727,JP +838729728,838795263,KR +838795264,838860799,AU +838860800,838991871,US +838991872,839008511,DE +839008512,839008767,US +839008768,839016959,DE +839016960,839017087,US +839017088,839041023,DE +839041024,839042047,US +839042048,839046271,DE +839046272,839046303,US +839046304,839081471,DE +839081472,839081727,US +839081728,839116543,DE +839116544,839116799,US +839116800,839122943,DE +839122944,839340031,US +839340032,839341055,ES +839341056,839343103,DE +839343104,839344127,NL +839344128,839348223,US +839348224,839348479,DE +839348480,839348735,AT +839348736,839348991,GB +839348992,839349247,AT +839349248,839349759,DE +839349760,839350271,US +839350272,839351295,NL +839351296,839352063,DE +839352064,839357439,NL +839357440,839358463,FR +839358464,839359335,GB +839359336,839359343,US +839359344,839359351,GB +839359352,839359359,IT +839359360,839359367,IE +839359368,839359375,FR +839359376,839359383,TH +839359384,839359487,GB +839359488,839360511,DE +839360512,839366655,NL +839366656,839366911,AT +839366912,839367167,CZ +839367168,839368703,NL +839368704,839385087,CZ +839385088,840269823,US +840269824,840273919,CA +840273920,840278015,US +840278016,840282111,CA +840282112,840294399,US +840294400,840298495,CA +840298496,840836121,US +840836122,840836124,BZ +840836125,840865791,US +840865792,840866047,CA +840866048,840953855,US +840953856,840954367,JP +840954368,840956927,US +840956928,840957951,JP +840957952,843055103,US +843055104,843644927,CA +843644928,844462879,US +844462880,844462880,CL +844462881,844890111,US +844890112,844988415,CA +844988416,845222689,US +845222690,845222690,HK +845222691,845283327,US +845283328,845545471,CA +845545472,846442495,US +846442496,846446591,CA +846446592,846561279,US +846561280,846594047,CA +846594048,846631253,US +846631254,846631254,CA +846631255,846644755,US +846644756,846644756,PT +846644757,846646527,US +846646528,846646783,CN +846646784,846648063,US +846648064,846648575,CN +846648576,846649343,US +846649344,846649599,CN +846649600,846650367,US +846650368,846650879,CN +846650880,846659583,US +846659584,846725119,SA +846725120,853622019,US +853622020,853622020,DE +853622021,853622096,US +853622097,853622098,GB +853622099,853622099,US +853622100,853622100,FR +853622101,853622101,BG +853622102,853622102,ES +853622103,853622103,IT +853622104,853622104,US +853622105,853622105,SE +853622106,853622109,US +853622110,853622110,DE +853622111,855638015,US +855638016,855900159,GB +855900160,856031231,DE +856031232,856162303,GB +856162304,856227839,DE +856227840,856621055,GB +856621056,856637439,NL +856637440,856686591,FR +856686592,857997311,GB +857997312,858062847,SA +858062848,858128383,IE +858128384,858193919,GB +858193920,858259455,SA +858259456,859059509,GB +859059510,859059510,FR +859059511,860905167,GB +860905168,860905171,FR +860905172,864550911,GB +864550912,864649215,NL +864649216,864919551,GB +864919552,864927743,US +864927744,865009663,GB +865009664,865042431,US +865042432,865075199,GB +865075200,865140735,NL +865140736,865173503,GB +865173504,865206271,NL +865206272,866844671,GB +866844672,866910207,IE +866910208,867041279,GB +867041280,867172351,NO +867172352,867368959,GB +867368960,867401727,IT +867401728,869466111,GB +869466112,869531647,SA +869531648,869924863,GB +869924864,869990399,SA +869990400,870252543,GB +870252544,870318079,SA +870318080,871038975,GB +871038976,871104511,SA +871104512,872153087,GB +872153088,872284159,SA +872284160,872285339,FR +872285340,872285343,PL +872285344,872285375,FR +872285376,872285439,DE +872285440,872285567,ES +872285568,872286271,FR +872286272,872286335,ES +872286336,872286871,FR +872286872,872286875,CZ +872286876,872287743,FR +872287744,872287807,BE +872287808,872288159,FR +872288160,872288191,ES +872288192,872288255,FR +872288256,872288319,ES +872288320,872288383,DE +872288384,872288511,GB +872288512,872288871,FR +872288872,872288875,DE +872288876,872289071,FR +872289072,872289087,PL +872289088,872289247,FR +872289248,872289279,IT +872289280,872290111,FR +872290112,872290143,ES +872290144,872290415,FR +872290416,872290431,BE +872290432,872290463,FR +872290464,872290495,BE +872290496,872290523,FR +872290524,872290527,PL +872290528,872290671,FR +872290672,872290687,CZ +872290688,872290751,FR +872290752,872290815,DE +872290816,872291151,FR +872291152,872291167,FI +872291168,872291519,FR +872291520,872291583,IE +872291584,872291871,FR +872291872,872291903,ES +872291904,872292071,FR +872292072,872292079,BE +872292080,872292223,FR +872292224,872292351,GB +872292352,872296479,FR +872296480,872296511,IT +872296512,872296575,NL +872296576,872297039,FR +872297040,872297055,ES +872297056,872297087,CZ +872297088,872297215,FR +872297216,872297231,GB +872297232,872297823,FR +872297824,872297855,ES +872297856,872298383,FR +872298384,872298391,LT +872298392,872298463,FR +872298464,872298495,DE +872298496,872299103,FR +872299104,872299135,PT +872299136,872299239,FR +872299240,872299247,ES +872299248,872299839,FR +872299840,872299903,DE +872299904,872299967,FR +872299968,872299983,ES +872299984,872300031,FR +872300032,872300063,ES +872300064,872300127,FR +872300128,872300159,NL +872300160,872300543,FR +872300544,872300559,GB +872300560,872300639,FR +872300640,872300671,PT +872300672,872300735,FR +872300736,872300751,PL +872300752,872300767,FR +872300768,872300799,NL +872300800,872301087,FR +872301088,872301095,ES +872301096,872301503,FR +872301504,872301567,PL +872301568,872302687,FR +872302688,872302719,NL +872302720,872302783,FR +872302784,872302847,GB +872302848,872303007,FR +872303008,872303039,IT +872303040,872303103,FR +872303104,872303359,GB +872303360,872303679,FR +872303680,872303743,IT +872303744,872304063,FR +872304064,872304079,GB +872304080,872304239,FR +872304240,872304255,IT +872304256,872304311,FR +872304312,872304319,BE +872304320,872304383,IE +872304384,872304395,FR +872304396,872304399,CZ +872304400,872304447,FR +872304448,872304511,ES +872304512,872304831,FR +872304832,872304895,ES +872304896,872305655,FR +872305656,872305663,GB +872305664,872306183,FR +872306184,872306191,US +872306192,872306223,FR +872306224,872306239,NL +872306240,872306367,FR +872306368,872306399,GB +872306400,872307263,FR +872307264,872307327,ES +872307328,872307743,FR +872307744,872307759,IT +872307760,872308351,FR +872308352,872308371,GB +872308372,872308372,US +872308373,872308455,GB +872308456,872308456,FR +872308457,872308479,GB +872308480,872308703,FR +872308704,872308735,ES +872308736,872309883,FR +872309884,872309884,PT +872309885,872310799,FR +872310800,872310815,ES +872310816,872310911,FR +872310912,872311039,DE +872311040,872311167,IE +872311168,872311231,FR +872311232,872311295,BE +872311296,872311903,FR +872311904,872311935,DE +872311936,872311983,FR +872311984,872311999,FI +872312000,872312063,NL +872312064,872312159,FR +872312160,872312191,CZ +872312192,872312255,ES +872312256,872312383,FR +872312384,872312447,IT +872312448,872312511,FR +872312512,872312575,IE +872312576,872312703,FR +872312704,872312767,ES +872312768,872316797,FR +872316798,872316798,PT +872316799,872321183,FR +872321184,872321215,FI +872321216,872321279,ES +872321280,872321379,FR +872321380,872321383,GB +872321384,872321599,FR +872321600,872321663,IT +872321664,872321711,FR +872321712,872321727,CZ +872321728,872322623,FR +872322624,872322655,GB +872322656,872322943,FR +872322944,872323071,GB +872323072,872323135,FR +872323136,872323199,ES +872323200,872323327,GB +872323328,872323407,FR +872323408,872323423,FI +872323424,872323471,FR +872323472,872323487,ES +872323488,872323551,FR +872323552,872323583,GB +872323584,872323647,FR +872323648,872323711,NL +872323712,872323775,FR +872323776,872323839,ES +872323840,872323936,FR +872323937,872323937,DE +872323938,872324239,FR +872324240,872324255,LT +872324256,872324719,FR +872324720,872324723,PL +872324724,872324831,FR +872324832,872324863,CZ +872324864,872324927,FR +872324928,872324991,IT +872324992,872325567,FR +872325568,872325583,FI +872325584,872325707,FR +872325708,872325711,ES +872325712,872325823,FR +872325824,872325887,DE +872325888,872326151,FR +872326152,872326155,CZ +872326156,872326175,FR +872326176,872326207,PT +872326208,872326271,FR +872326272,872326275,FI +872326276,872326303,FR +872326304,872326311,LT +872326312,872326399,FR +872326400,872326431,CZ +872326432,872326495,FR +872326496,872326511,BE +872326512,872327615,FR +872327616,872327679,ES +872327680,872327807,FR +872327808,872327811,FI +872327812,872327815,IE +872327816,872327831,FR +872327832,872327835,IT +872327836,872327887,FR +872327888,872327903,ES +872327904,872328351,FR +872328352,872328383,IT +872328384,872328447,PL +872328448,872328575,FR +872328576,872328591,DE +872328592,872328671,FR +872328672,872328703,NL +872328704,872329151,FR +872329152,872329215,DE +872329216,872329263,FR +872329264,872329271,ES +872329272,872329407,FR +872329408,872329471,ES +872329472,872329599,GB +872329600,872329951,FR +872329952,872329983,GB +872329984,872330279,FR +872330280,872330283,GB +872330284,872330527,FR +872330528,872330559,CZ +872330560,872331271,FR +872331272,872331275,PL +872331276,872332287,FR +872332288,872332295,PT +872332296,872332383,FR +872332384,872332415,DE +872332416,872332607,FR +872332608,872332671,BE +872332672,872332735,FR +872332736,872332799,ES +872332800,872332831,IE +872332832,872338880,FR +872338881,872338881,BE +872338882,872341887,FR +872341888,872341903,ES +872341904,872342335,FR +872342336,872342367,ES +872342368,872342623,FR +872342624,872342655,DE +872342656,872343191,FR +872343192,872343199,ES +872343200,872343351,FR +872343352,872343355,GB +872343356,872344423,FR +872344424,872344431,ES +872344432,872344603,FR +872344604,872344607,GB +872344608,872344639,IT +872344640,872344895,FR +872344896,872344959,NL +872344960,872345151,FR +872345152,872345215,CZ +872345216,872345343,GB +872345344,872346095,FR +872346096,872346111,DE +872346112,872346223,FR +872346224,872346239,ES +872346240,872346319,FR +872346320,872346335,CZ +872346336,872346351,FR +872346352,872346367,FI +872346368,872346799,FR +872346800,872346815,DE +872346816,872346879,ES +872346880,872346943,FR +872346944,872347007,DE +872347008,872347039,FR +872347040,872347055,GB +872347056,872347063,FR +872347064,872347067,PT +872347068,872347263,FR +872347264,872347271,CZ +872347272,872347511,FR +872347512,872347519,ES +872347520,872348095,FR +872348096,872348159,IT +872348160,872348799,FR +872348800,872348863,BE +872348864,872348959,FR +872348960,872348991,GB +872348992,872349039,FR +872349040,872349055,IT +872349056,872349983,FR +872349984,872350015,GB +872350016,872350271,FR +872350272,872350335,BE +872350336,872350351,NL +872350352,872350399,FR +872350400,872350463,NL +872350464,872350815,FR +872350816,872350847,IT +872350848,872351327,FR +872351328,872351359,ES +872351360,872351575,FR +872351576,872351583,FI +872351584,872351679,FR +872351680,872351743,DE +872351744,872351879,FR +872351880,872351883,PL +872351884,872352443,FR +872352444,872352447,DE +872352448,872353119,FR +872353120,872353151,PT +872353152,872353343,FR +872353344,872353407,IE +872353408,872353471,FR +872353472,872353535,ES +872353536,872353663,FR +872353664,872353791,GB +872353792,872354079,FR +872354080,872354111,CZ +872354112,872354263,FR +872354264,872354271,ES +872354272,872354367,FR +872354368,872354399,PT +872354400,872354751,FR +872354752,872354815,BE +872354816,872355071,FR +872355072,872355103,ES +872355104,872355679,FR +872355680,872355711,PT +872355712,872356375,FR +872356376,872356383,FI +872356384,872356399,FR +872356400,872356415,ES +872356416,872356479,DE +872356480,872356671,FR +872356672,872356735,IT +872356736,872357423,FR +872357424,872357439,PT +872357440,872357503,ES +872357504,872357671,FR +872357672,872357679,IT +872357680,872357695,FR +872357696,872357759,NL +872357760,872363071,FR +872363072,872363103,ES +872363104,872363135,FR +872363136,872363199,PL +872363200,872363423,FR +872363424,872363455,CZ +872363456,872363871,FR +872363872,872363903,PT +872363904,872364671,FR +872364672,872364703,LT +872364704,872364847,FR +872364848,872364855,DE +872364856,872364863,FR +872364864,872364898,NL +872364899,872364899,FR +872364900,872364927,NL +872364928,872365019,FR +872365020,872365023,CZ +872365024,872365311,FR +872365312,872365319,PT +872365320,872374459,FR +872374460,872374463,GB +872374464,872374543,FR +872374544,872374559,LT +872374560,872374591,FR +872374592,872374655,ES +872374656,872375007,FR +872375008,872375039,PT +872375040,872375295,FR +872375296,872375423,NL +872375424,872375807,FR +872375808,872375871,GB +872375872,872376191,FR +872376192,872376319,GB +872376320,872376687,FR +872376688,872376691,CZ +872376692,872376895,FR +872376896,872376959,BE +872376960,872377279,FR +872377280,872377343,ES +872377344,872377919,FR +872377920,872377983,BE +872377984,872378047,IE +872378048,872378207,FR +872378208,872378239,IT +872378240,872378447,FR +872378448,872378463,CZ +872378464,872379103,FR +872379104,872379135,PL +872379136,872379199,FR +872379200,872379263,DE +872379264,872379375,FR +872379376,872379391,GB +872379392,872379967,FR +872379968,872380031,NL +872380032,872380143,FR +872380144,872380147,DE +872380148,872380247,FR +872380248,872380248,ES +872380249,872380607,FR +872380608,872380671,ES +872380672,872380783,FR +872380784,872380799,IE +872380800,872381063,FR +872381064,872381071,CZ +872381072,872381151,FR +872381152,872381183,CZ +872381184,872381343,FR +872381344,872381375,PL +872381376,872382143,FR +872382144,872382207,ES +872382208,872382335,FR +872382336,872382463,GB +872382464,872382655,FR +872382656,872382719,DE +872382720,872382779,FR +872382780,872382783,ES +872382784,872383327,FR +872383328,872383359,PL +872383360,872383519,FR +872383520,872383551,ES +872383552,872383583,GB +872383584,872383743,FR +872383744,872383759,DE +872383760,872383807,FR +872383808,872383871,IT +872383872,872383967,FR +872383968,872383999,CZ +872384000,872384003,PL +872384004,872384095,FR +872384096,872384127,ES +872384128,872384287,FR +872384288,872384319,FI +872384320,872384383,ES +872384384,872385103,FR +872385104,872385119,PL +872385120,872385151,FR +872385152,872385167,LT +872385168,872385183,FR +872385184,872385215,DE +872385216,872385279,BE +872385280,872385535,FR +872385536,872385543,PT +872385544,872385615,FR +872385616,872385631,NL +872385632,872385671,FR +872385672,872385679,PL +872385680,872385695,FR +872385696,872385727,PT +872385728,872386175,FR +872386176,872386303,GB +872386304,872386335,FR +872386336,872386367,FI +872386368,872386399,FR +872386400,872386431,IT +872386432,872386591,FR +872386592,872386607,LT +872386608,872386623,FR +872386624,872386687,IT +872386688,872386719,FR +872386720,872386751,PL +872386752,872387007,FR +872387008,872387071,IE +872387072,872387263,FR +872387264,872387279,PT +872387280,872387295,PL +872387296,872387775,FR +872387776,872387839,IT +872387840,872388191,FR +872388192,872388223,DE +872388224,872388255,FR +872388256,872388287,CZ +872388288,872388351,ES +872388352,872388407,FR +872388408,872388415,PT +872388416,872388447,ES +872388448,872388511,FR +872388512,872388543,PL +872388544,872388591,FR +872388592,872388607,ES +872388608,872388671,DE +872388672,872388799,FR +872388800,872388863,DE +872388864,872389247,FR +872389248,872389311,DE +872389312,872389535,FR +872389536,872389567,GB +872389568,872389983,FR +872389984,872390015,NL +872390016,872390495,FR +872390496,872390527,PL +872390528,872390591,FR +872390592,872390655,ES +872390656,872391230,FR +872391231,872391231,BE +872391232,872393204,FR +872393205,872393205,BE +872393206,872403023,FR +872403024,872403039,LT +872403040,872403071,NL +872403072,872403159,FR +872403160,872403167,PT +872403168,872403183,FR +872403184,872403199,PL +872403200,872403567,FR +872403568,872403583,LT +872403584,872403599,FR +872403600,872403615,PT +872403616,872403647,PL +872403648,872403711,IT +872403712,872403743,FR +872403744,872403775,PT +872403776,872403839,DE +872403840,872404071,FR +872404072,872404079,PL +872404080,872404511,FR +872404512,872404543,IT +872404544,872404639,FR +872404640,872404671,PL +872404672,872405567,FR +872405568,872405631,BE +872405632,872405791,FR +872405792,872405823,FI +872405824,872405887,NL +872405888,872405935,FR +872405936,872405951,CZ +872405952,872406047,FR +872406048,872406079,PL +872406080,872406207,FR +872406208,872406271,ES +872406272,872406431,FR +872406432,872406439,ES +872406440,872406591,FR +872406592,872406655,DE +872406656,872406815,FR +872406816,872406847,FI +872406848,872406879,FR +872406880,872406911,ES +872406912,872407167,FR +872407168,872407171,FI +872407172,872407231,FR +872407232,872407295,IT +872407296,872408255,FR +872408256,872408319,NL +872408320,872408383,FR +872408384,872408447,IE +872408448,872408591,FR +872408592,872408607,LT +872408608,872408839,FR +872408840,872408847,ES +872408848,872409151,FR +872409152,872409215,DE +872409216,872409343,GB +872409344,872409631,FR +872409632,872409663,IT +872409664,872409679,FR +872409680,872409683,ES +872409684,872410175,FR +872410176,872410239,DE +872410240,872410759,FR +872410760,872410767,IT +872410768,872410847,FR +872410848,872410879,IT +872410880,872415231,FR +872415232,873463807,US +873463808,873646466,IE +873646467,873646467,US +873646468,873664545,IE +873664546,873664546,US +873664547,873725951,IE +873725952,874250239,US +874250240,874381311,DE +874381312,874512383,IE +874512384,875446271,US +875446272,875454463,FR +875454464,875473919,US +875473920,875474943,BR +875474944,875495423,US +875495424,875560959,FR +875560960,875823103,IE +875823104,876085247,US +876085248,876150783,GB +876150784,876347391,DE +876347392,876412927,CA +876412928,876478463,US +876478464,876740607,AU +876740608,876806143,IN +876806144,876871679,BR +876871680,877002751,JP +877002752,877264895,US +877264896,877330431,SG +877330432,877395967,US +877395968,877527039,SG +877527040,877658111,KR +877658112,877920255,CN +877920256,878444543,US +878444544,878448639,KR +878448640,878454527,US +878454528,878454783,BR +878454784,878456831,IE +878456832,878457855,US +878457856,878458879,AU +878458880,878459903,SG +878459904,878460927,JP +878460928,878461951,BR +878461952,878462975,DE +878462976,878463999,BR +878464000,878465023,US +878465024,878466047,JP +878466048,878467071,CA +878467072,878468095,GB +878468096,878508031,US +878508032,878509055,IN +878509056,878510079,US +878510080,878510335,IE +878510336,878510591,US +878510592,878510847,IE +878510848,878511359,US +878511360,878511615,CA +878511616,878512127,US +878512128,878513151,SG +878513152,878514175,US +878514176,878514431,IE +878514432,878576895,US +878576896,878577151,IE +878577152,878577407,KR +878577408,878577663,BR +878577664,878577919,JP +878577920,878578431,US +878578432,878578687,SG +878578688,878578943,US +878578944,878579199,AU +878579200,878579455,CA +878579456,878579711,GB +878579712,878579967,FR +878579968,878580223,DE +878580224,878580735,US +878580736,878580991,IN +878580992,878581759,US +878581760,878582783,IE +878582784,878583807,US +878583808,878591999,GB +878592000,878593023,CA +878593024,878593279,US +878593280,878593535,DE +878593536,878596095,US +878596096,878604287,CA +878604288,878605311,GB +878605312,878625791,US +878625792,878626047,IE +878626048,878626319,US +878626320,878626335,BR +878626336,878626351,US +878626352,878626367,DE +878626368,878626383,KR +878626384,878626399,IN +878626400,878626415,SG +878626416,878626431,AU +878626432,878626447,CA +878626448,878626463,GB +878626464,878626815,US +878626816,878627071,JP +878627072,878627839,US +878627840,878628351,DE +878628352,878628863,BR +878628864,878630911,US +878630912,878632959,IE +878632960,878639119,US +878639120,878639135,IE +878639136,878639151,SG +878639152,878639167,BR +878639168,878639183,AU +878639184,878639199,JP +878639200,878639215,US +878639216,878639231,DE +878639232,878639247,US +878639248,878639263,IN +878639264,878639279,US +878639280,878639295,KR +878639296,878639311,GB +878639312,878639327,CA +878639328,878639359,US +878639360,878639391,CN +878639392,878639407,FR +878639408,878648831,US +878648832,878649343,JP +878649344,878649855,US +878649856,878650111,JP +878650112,878650367,SG +878650368,878651391,AU +878651392,878655487,US +878655488,878656511,JP +878656512,878657023,IE +878657024,878657535,US +878657536,878666751,IN +878666752,878667775,US +878667776,878668799,IE +878668800,878669567,US +878669568,878669823,KR +878669824,878673919,IE +878673920,878675967,AU +878675968,878676735,BR +878676736,878678271,US +878678272,878679039,CA +878679040,878679807,GB +878679808,878680575,US +878680576,878681343,FR +878681344,878682879,US +878682880,878683647,BR +878683648,878690303,US +878690304,878694399,KR +878694400,878695423,US +878695424,878696447,SG +878696448,878702591,US +878702592,878702847,BR +878702848,878703103,AU +878703104,878703359,SG +878703360,878703615,JP +878703616,878703871,IE +878703872,878704639,US +878704640,878704895,DE +878704896,878705151,IN +878705152,878705407,CA +878705408,878705663,US +878705664,878705919,KR +878705920,878706175,GB +878706176,878706431,FR +878706432,878706447,BR +878706448,878706463,AU +878706464,878706479,SG +878706480,878706495,JP +878706496,878706511,IE +878706512,878706559,US +878706560,878706575,DE +878706576,878706591,CN +878706592,878804991,US +878804992,878805247,AT +878805248,878837759,US +878837760,878837775,AU +878837776,878952447,US +878952448,878952463,BR +878952464,879499263,US +879499264,879501311,NL +879501312,879502335,HK +879502336,879503359,BR +879503360,879503871,AU +879503872,879504383,CA +879504384,879504895,IN +879504896,879505407,JP +879505408,879505919,KR +879505920,879506431,GB +879506432,879506943,FR +879506944,879549951,US +879549952,879550463,FR +879550464,879550975,GB +879550976,879551487,KR +879551488,879551999,JP +879552000,879552511,IN +879552512,879553023,CA +879553024,879553535,AU +879553536,879554559,SG +879554560,879556607,IE +879556608,879565823,US +879565824,879569919,GB +879569920,879571967,KR +879571968,879572991,JP +879572992,879576063,IN +879576064,879578111,FR +879578112,879579135,IE +879579136,879580159,FI +879580160,879581183,AT +879581184,879582207,NL +879582208,879584255,CA +879584256,879585279,US +879585280,879587327,BR +879587328,879589375,AU +879589376,879590399,HK +879590400,879591423,SG +879591424,879592447,MY +879592448,879593471,JP +879593472,879757055,US +879757056,879757311,CA +879757312,879763583,US +879763584,879763711,CA +879763712,879772543,US +879772544,879772671,CA +879772672,879788031,US +879788032,879788159,NL +879788160,879788287,IE +879788288,879788543,GB +879788544,879788671,NL +879788672,879788799,IE +879788800,879788927,NL +879788928,879789183,IE +879789184,879789439,NL +879789440,879796223,US +879796224,879796479,GB +879796480,879796735,NL +879796736,879796991,IE +879796992,879804415,US +879804416,879804479,NL +879804480,879804543,IE +879804544,879804671,GB +879804672,879804735,NL +879804736,879804799,IE +879804800,879804863,NL +879804864,879804991,IE +879804992,879805119,NL +879805120,879808511,US +879808512,879808639,GB +879808640,879808767,NL +879808768,879808895,IE +879808896,879820799,US +879820800,879820927,KR +879820928,879821055,HK +879821056,879821311,SG +879821312,879821439,KR +879821440,879821567,HK +879821568,879821695,SG +879821696,879821823,KR +879821824,879822079,JP +879822080,879822335,AU +879822336,879822591,IN +879822592,879822623,HK +879822624,879822655,SG +879822656,879822719,US +879822720,879822847,HK +879822848,879822975,SG +879822976,879829119,US +879829120,879829247,SG +879829248,879829375,JP +879829376,879829503,HK +879829504,879829759,US +879829760,879829887,AU +879829888,879830015,IN +879830016,879830271,KR +879830272,879837183,US +879837184,879837247,KR +879837248,879837311,HK +879837312,879837439,SG +879837440,879837503,KR +879837504,879837567,HK +879837568,879837631,SG +879837632,879837695,KR +879837696,879837823,JP +879837824,879837951,AU +879837952,879838079,IN +879838080,879838111,HK +879838112,879838143,SG +879838144,879841343,US +879841344,879841407,SG +879841408,879841471,JP +879841472,879841535,HK +879841536,879841663,US +879841664,879841727,AU +879841728,879841791,IN +879841792,879841919,KR +879841920,879886335,US +879886336,879888383,HK +879888384,879890431,SG +879890432,879892479,AU +879892480,879894527,IN +879894528,879896575,JP +879896576,879897599,IN +879897600,879899647,US +879899648,879900159,HK +879900160,879900671,US +879900672,879901183,SG +879901184,879902719,US +879902720,879905791,NL +879905792,879906815,IE +879906816,879910911,GB +879910912,879912959,IE +879912960,879916031,US +879916032,879917055,NL +879917056,879918079,IE +879918080,879927295,US +879927296,879929343,CA +879929344,879951871,US +879951872,879954943,NL +879954944,879955967,US +879955968,879959039,IE +879959040,879960063,US +879960064,879961599,SG +879961600,879962111,US +879962112,879963647,HK +879963648,880216831,US +880216832,880217087,CA +880217088,880261119,US +880261120,880262143,SG +880262144,880263167,DE +880263168,880264191,IE +880264192,880266495,US +880266496,880266751,SG +880266752,880267775,US +880267776,880268287,AU +880268288,880269311,US +880269312,880271359,JP +880271360,880275455,US +880275456,880277503,IE +880277504,880293356,US +880293357,880293357,CL +880293358,880543743,US +880543744,880545791,CA +880545792,880553983,US +880553984,880556031,CA +880556032,880557567,US +880557568,880557823,CA +880557824,880558079,US +880558080,880574463,CA +880574464,880807935,US +880807936,880808191,CA +880808192,880861183,US +880861184,880869375,HK +880869376,880872191,US +880872192,880872447,CA +880872448,880874751,US +880874752,880875007,CA +880875008,880876543,US +880876544,880877567,CA +880877568,880878079,US +880878080,880878591,CA +880878592,880881663,US +880881664,880885759,PR +880885760,880934911,US +880934912,881065983,SG +881065984,881332223,US +881332224,881332735,IN +881332736,881333759,GB +881333760,881334271,CA +881334272,881334527,IN +881334528,881334783,AU +881334784,881335039,SG +881335040,881335295,US +881335296,881335551,FR +881335552,881336319,US +881336320,881344511,IN +881344512,881360895,US +881360896,881377279,FR +881377280,881410047,NL +881410048,881459199,US +881459200,881475583,CA +881475584,881491967,US +881491968,881524735,IE +881524736,881557503,CA +881557504,881573887,HK +881573888,881590271,SG +881590272,881639423,IN +881639424,881655807,JP +881655808,881672191,KR +881672192,881737727,US +881737728,881754111,IE +881754112,881770495,GB +881770496,881803263,NL +881803264,881819647,US +881819648,881836031,FR +881836032,881836543,US +881836544,881836799,NL +881836800,881837055,IE +881837056,881837311,SG +881837312,881840127,US +881840128,881840383,NL +881840384,881840639,IE +881840640,881840895,SG +881840896,881841919,US +881841920,881842687,FR +881842688,881859327,US +881859328,881859583,CA +881859584,881868799,US +881868800,881876991,IT +881876992,882016255,US +882016256,882049023,IE +882049024,882065407,AU +882065408,882073599,JP +882073600,882081791,KR +882081792,882130943,US +882130944,882147327,SG +882147328,882163711,US +882163712,882180095,NL +882180096,882196479,US +882196480,882212863,NL +882212864,882327551,US +882327552,882343935,GB +882343936,882573311,US +882573312,882581503,CA +882581504,882589695,US +882589696,882597887,IE +882597888,882606079,JP +882606080,882638847,IE +882638848,882647039,CA +882647040,882655231,JP +882655232,882679807,US +882679808,882687999,AU +882688000,882704383,IE +882704384,882720767,US +882720768,882769919,NL +882769920,882802687,IE +882802688,882810879,AU +882810880,882851839,US +882851840,882851942,IN +882851943,882851943,US +882851944,882860031,IN +882860032,883097599,US +883097600,883163135,SG +883163136,883228671,IE +883228672,883294207,US +883294208,883359743,NL +883359744,883490815,US +883490816,883556351,IE +883556352,883687423,US +883687424,883752959,IN +883752960,883818495,US +883818496,883884031,NL +883884032,883916799,HK +883916800,883933183,JP +883933184,884080639,US +884080640,884113407,NL +884113408,884146175,IE +884146176,884441087,US +884441088,884457471,IN +884457472,884473855,US +884473856,884506623,HK +884506624,884572159,US +884572160,884588543,JP +884588544,884670463,US +884670464,884719615,SG +884719616,884735999,AU +884736000,884850687,US +884850688,884867071,AU +884867072,884998143,US +884998144,885129215,JP +885129216,885260287,US +885260288,885522431,JP +885522432,886046719,US +886046720,886571007,IE +886571008,886702079,US +886702080,886734847,IE +886734848,886767615,US +886767616,886772735,JP +886772736,886775807,US +886775808,886778879,SG +886778880,886779903,DE +886779904,886781951,US +886781952,886783487,KR +886783488,886785023,IN +886785024,886786047,JP +886786048,886787071,DE +886787072,886788095,SG +886788096,886833151,US +886833152,886964223,SG +886964224,887078911,US +887078912,887083007,NL +887083008,887085055,BR +887085056,887357439,US +887357440,887390207,CA +887390208,887439359,US +887439360,887455743,CA +887455744,887488511,HK +887488512,887521279,SG +887521280,887554047,US +887554048,887619583,KR +887619584,887652351,NL +887652352,887654399,CA +887654400,887656447,AU +887656448,887656959,KR +887656960,887657215,US +887657216,887657471,NL +887657472,887657727,IE +887657728,887658751,US +887658752,887659007,HK +887659008,887659263,AU +887659264,887659519,JP +887659520,887660031,US +887660032,887660287,JP +887660288,887685119,US +887685120,887701503,CA +887701504,887717887,US +887717888,887750655,NL +887750656,887816191,US +887816192,887832575,CA +887832576,887881727,US +887881728,887914495,IE +887914496,887947263,NL +887947264,887963647,CA +887963648,887980031,SG +887980032,887996415,US +887996416,888012799,AU +888012800,888111103,US +888111104,888111359,HK +888111360,888111615,SG +888111616,888112639,AU +888112640,888112959,FR +888112960,888113151,IN +888113152,888114175,IE +888114176,888115199,NL +888115200,888116223,JP +888116224,888116255,KR +888116256,888116287,US +888116288,888116351,CA +888116352,888120447,US +888120448,888120511,CA +888120512,888120735,US +888120736,888120767,KR +888120768,888126207,US +888126208,888126335,GB +888126336,888126719,IN +888126720,888127103,CA +888127104,888127231,KR +888127232,888127999,US +888128000,888128255,FR +888128256,888128511,US +888128512,888128767,FR +888128768,888129023,SG +888129024,888130047,US +888130048,888130303,IN +888130304,888132607,US +888132608,888133119,NL +888133120,888274943,US +888274944,888291327,CA +888291328,888348671,US +888348672,888356863,JP +888356864,888373247,AU +888373248,888475647,US +888475648,888477695,AU +888477696,888478719,US +888478720,888480767,CA +888480768,888481791,JP +888481792,888482815,IE +888482816,888483839,US +888483840,888484863,NL +888484864,888485887,US +888485888,888486911,HK +888486912,888487935,US +888487936,888488959,GB +888488960,888491007,US +888491008,888492031,IN +888492032,888493055,SG +888493056,888494079,IN +888494080,888495103,IE +888495104,888496127,JP +888496128,888497151,IN +888497152,888498175,KR +888498176,888500223,US +888500224,888501247,KR +888501248,888503295,FR +888503296,888504319,NL +888504320,888569855,US +888569856,888573951,HK +888573952,888578047,US +888578048,888586239,JP +888586240,888750079,US +888750080,888758271,IN +888758272,889016319,US +889016320,889020415,SG +889020416,889028607,JP +889028608,889036799,US +889036800,889039871,IN +889039872,889041919,JP +889041920,889042943,NL +889042944,889043967,IE +889043968,889046015,KR +889046016,889048063,CA +889048064,889050111,AU +889050112,889051135,SG +889051136,889052159,HK +889052160,889135103,US +889135104,889143295,AU +889143296,889192447,US +889192448,905969663,DE +905969664,908328959,US +908328960,908329215,FR +908329216,908329247,PT +908329248,908329279,FR +908329280,908329311,PT +908329312,908329755,FR +908329756,908329759,DE +908329760,908329855,FR +908329856,908329983,IT +908329984,908330111,ES +908330112,908330239,NL +908330240,908330367,DE +908330368,908330663,FR +908330664,908330671,ES +908330672,908331775,FR +908331776,908331903,IT +908331904,908332847,FR +908332848,908332863,LT +908332864,908332991,FR +908332992,908333023,GB +908333024,908333823,FR +908333824,908333951,DE +908333952,908334079,GB +908334080,908334271,FR +908334272,908334303,PT +908334304,908334919,FR +908334920,908334927,ES +908334928,908334951,FR +908334952,908334959,ES +908334960,908335871,FR +908335872,908335999,ES +908336000,908336167,FR +908336168,908336183,ES +908336184,908336295,FR +908336296,908336303,ES +908336304,908336535,FR +908336536,908336543,ES +908336544,908336639,FR +908336640,908336767,NL +908336768,908336831,FR +908336832,908336839,ES +908336840,908336991,FR +908336992,908337023,PT +908337024,908337151,IE +908337152,908337383,FR +908337384,908337391,ES +908337392,908337407,FR +908337408,908337535,NL +908337536,908338367,FR +908338368,908338375,ES +908338376,908339295,FR +908339296,908339303,ES +908339304,908339327,FR +908339328,908339455,DE +908339456,908339583,NL +908339584,908339975,FR +908339976,908339983,ES +908339984,908340079,FR +908340080,908340095,LT +908340096,908340223,GB +908340224,908340607,FR +908340608,908340735,ES +908340736,908340863,GB +908340864,908341207,FR +908341208,908341215,ES +908341216,908345343,FR +908345344,908345359,ES +908345360,908345447,FR +908345448,908345455,ES +908345456,908345527,FR +908345528,908345535,ES +908345536,908345543,FR +908345544,908345547,ES +908345548,908345583,FR +908345584,908345599,LT +908345600,908345727,DE +908345728,908345855,ES +908345856,908345951,FR +908345952,908345959,ES +908345960,908346271,FR +908346272,908346279,ES +908346280,908346287,FR +908346288,908346303,LT +908346304,908346647,FR +908346648,908346655,ES +908346656,908347455,FR +908347456,908347471,ES +908347472,908347919,FR +908347920,908347927,ES +908347928,908347935,FR +908347936,908347943,ES +908347944,908347951,FR +908347952,908347959,ES +908347960,908348143,FR +908348144,908348159,LT +908348160,908348415,FR +908348416,908348543,IT +908348544,908348671,FR +908348672,908348799,ES +908348800,908348855,FR +908348856,908348863,ES +908348864,908349455,FR +908349456,908349463,ES +908349464,908349503,FR +908349504,908349519,LT +908349520,908349647,FR +908349648,908349655,ES +908349656,908349711,FR +908349712,908349727,ES +908349728,908349767,FR +908349768,908349775,ES +908349776,908349823,FR +908349824,908349951,GB +908349952,908350679,FR +908350680,908350687,ES +908350688,908350719,PT +908350720,908350751,FR +908350752,908350759,ES +908350760,908350815,FR +908350816,908350847,PT +908350848,908350975,DE +908350976,908351007,FI +908351008,908351039,FR +908351040,908351071,GB +908351072,908351127,FR +908351128,908351135,ES +908351136,908351327,FR +908351328,908351335,ES +908351336,908351423,FR +908351424,908351455,CZ +908351456,908351487,FR +908351488,908351615,IT +908351616,908351743,ES +908351744,908351871,NL +908351872,908351999,DE +908352000,908352095,FR +908352096,908352127,PL +908352128,908352511,FR +908352512,908352767,GB +908352768,908353023,FR +908353024,908353151,BE +908353152,908353279,GB +908353280,908356607,FR +908356608,908359679,DE +908359680,908361815,FR +908361816,908361823,ES +908361824,908361855,PT +908361856,908362623,FR +908362624,908362751,DE +908362752,908362943,FR +908362944,908362951,ES +908362952,908362959,FR +908362960,908362975,CH +908362976,908362999,FR +908363000,908363007,ES +908363008,908363103,FR +908363104,908363119,DE +908363120,908363375,FR +908363376,908363391,ES +908363392,908363471,FR +908363472,908363479,ES +908363480,908363487,FR +908363488,908363519,FI +908363520,908363647,NL +908363648,908363775,DE +908363776,908363887,FR +908363888,908363903,LT +908363904,908363919,FR +908363920,908363927,ES +908363928,908364063,FR +908364064,908364095,FI +908364096,908364215,FR +908364216,908364223,ES +908364224,908364287,FR +908364288,908364415,ES +908364416,908364431,FR +908364432,908364439,ES +908364440,908364799,FR +908364800,908364927,IT +908364928,908364935,FR +908364936,908364943,ES +908364944,908364959,FR +908364960,908364967,ES +908364968,908365215,FR +908365216,908365231,ES +908365232,908366199,FR +908366200,908366335,ES +908366336,908366631,FR +908366632,908366639,ES +908366640,908366839,FR +908366840,908366847,ES +908366848,908368015,FR +908368016,908368031,LT +908368032,908368167,FR +908368168,908368175,ES +908368176,908368391,FR +908368392,908368399,ES +908368400,908368479,FR +908368480,908368511,ES +908368512,908368639,FR +908368640,908368767,IT +908368768,908369023,FR +908369024,908369055,CZ +908369056,908369239,FR +908369240,908369247,ES +908369248,908369543,FR +908369544,908369551,ES +908369552,908369743,FR +908369744,908369775,LT +908369776,908369919,FR +908369920,908371967,GB +908371968,908374015,PL +908374016,908376127,FR +908376128,908376255,PL +908376256,908376767,FR +908376768,908376895,PL +908376896,908378271,FR +908378272,908378279,ES +908378280,908378383,FR +908378384,908378399,LT +908378400,908378463,FR +908378464,908378495,PT +908378496,908378503,FR +908378504,908378511,ES +908378512,908378575,FR +908378576,908378591,GB +908378592,908378783,FR +908378784,908378799,LT +908378800,908378863,FR +908378864,908378871,GB +908378872,908378879,ES +908378880,908378983,FR +908378984,908378991,ES +908378992,908379039,FR +908379040,908379071,CZ +908379072,908379903,FR +908379904,908379911,ES +908379912,908379951,FR +908379952,908379967,LT +908379968,908380223,FR +908380224,908380239,ES +908380240,908380319,FR +908380320,908380327,ES +908380328,908380351,FR +908380352,908380383,PL +908380384,908380415,PT +908380416,908380543,ES +908380544,908380959,FR +908380960,908380991,PT +908380992,908381055,FR +908381056,908381183,GB +908381184,908381311,IE +908381312,908381327,FR +908381328,908381335,ES +908381336,908381751,FR +908381752,908381759,ES +908381760,908382719,FR +908382720,908382751,PL +908382752,908382823,FR +908382824,908382831,ES +908382832,908383015,FR +908383016,908383023,ES +908383024,908384511,FR +908384512,908384639,BE +908384640,908385063,FR +908385064,908385071,ES +908385072,908385407,FR +908385408,908385423,LT +908385424,908385535,FR +908385536,908385663,IT +908385664,908386007,FR +908386008,908386015,ES +908386016,908386431,FR +908386432,908386447,GB +908386448,908387071,FR +908387072,908387135,GB +908387136,908387151,FR +908387152,908387167,GB +908387168,908387903,FR +908387904,908387967,GB +908387968,908388399,FR +908388400,908388415,DE +908388416,908388431,FR +908388432,908388447,DE +908388448,908388879,FR +908388880,908388887,DE +908388888,908389055,FR +908389056,908389375,DE +908389376,908389759,FR +908389760,908389823,DE +908389824,908391159,FR +908391160,908391295,ES +908391296,908391423,GB +908391424,908392759,FR +908392760,908392767,ES +908392768,908392863,FR +908392864,908392879,LT +908392880,908394495,FR +908394496,908396543,GB +908396544,908403343,FR +908403344,908403351,ES +908403352,908403655,FR +908403656,908403663,ES +908403664,908403735,FR +908403736,908403743,ES +908403744,908403775,FR +908403776,908403807,CZ +908403808,908403839,FR +908403840,908403967,NL +908403968,908405247,FR +908405248,908405375,IT +908405376,908405455,FR +908405456,908405463,ES +908405464,908405599,FR +908405600,908405607,ES +908405608,908405647,FR +908405648,908405655,ES +908405656,908406039,FR +908406040,908406047,ES +908406048,908406083,FR +908406084,908406087,IT +908406088,908406159,FR +908406160,908406167,ES +908406168,908406551,FR +908406552,908406559,ES +908406560,908407151,FR +908407152,908407159,ES +908407160,908408295,FR +908408296,908408303,ES +908408304,908408799,FR +908408800,908408815,LT +908408816,908409279,FR +908409280,908409287,ES +908409288,908409487,FR +908409488,908409495,ES +908409496,908409975,FR +908409976,908409983,ES +908409984,908410111,DE +908410112,908410495,FR +908410496,908410503,ES +908410504,908410711,FR +908410712,908410719,ES +908410720,908410863,FR +908410864,908410879,LT +908410880,908412927,FR +908412928,908414975,DE +908414976,908417023,FR +908417024,908417599,DE +908417600,908417791,FR +908417792,908417919,DE +908417920,908418751,FR +908418752,908418815,DE +908418816,908419327,FR +908419328,908419455,ES +908419456,908419495,FR +908419496,908419503,ES +908419504,908419711,FR +908419712,908419719,ES +908419720,908419767,FR +908419768,908419775,ES +908419776,908419999,FR +908420000,908420015,LT +908420016,908420071,FR +908420072,908420079,ES +908420080,908420351,FR +908420352,908420479,GB +908420480,908420791,FR +908420792,908420799,ES +908420800,908421127,FR +908421128,908421135,ES +908421136,908421951,FR +908421952,908421967,ES +908421968,908422047,FR +908422048,908422063,GB +908422064,908422079,FI +908422080,908422255,FR +908422256,908422263,ES +908422264,908422911,FR +908422912,908422919,ES +908422920,908423039,FR +908423040,908423071,PT +908423072,908423095,FR +908423096,908423103,ES +908423104,908423319,FR +908423320,908423327,ES +908423328,908423823,FR +908423824,908423831,ES +908423832,908423895,FR +908423896,908423903,ES +908423904,908424263,FR +908424264,908424271,ES +908424272,908424319,FR +908424320,908424447,DE +908424448,908424511,FR +908424512,908424527,LT +908424528,908424535,ES +908424536,908425055,FR +908425056,908425087,PT +908425088,908425151,FR +908425152,908425183,FI +908425184,908425463,FR +908425464,908425471,ES +908425472,908425855,FR +908425856,908425983,ES +908425984,908426287,FR +908426288,908426295,ES +908426296,908426391,FR +908426392,908426399,ES +908426400,908426431,FR +908426432,908426447,LT +908426448,908426479,FR +908426480,908426495,GB +908426496,908426703,FR +908426704,908426711,ES +908426712,908427119,FR +908427120,908427127,ES +908427128,908427143,FR +908427144,908427151,ES +908427152,908427247,FR +908427248,908427263,ES +908427264,908428351,FR +908428352,908428415,PL +908428416,908428671,FR +908428672,908428735,PL +908428736,908428799,FR +908428800,908428863,PL +908428864,908429311,FR +908429312,908430335,PL +908430336,908430847,FR +908430848,908430911,PL +908430912,908431167,FR +908431168,908431231,PL +908431232,908435495,FR +908435496,908435503,ES +908435504,908435647,FR +908435648,908435663,ES +908435664,908435839,FR +908435840,908435967,GB +908435968,908436223,FR +908436224,908436351,ES +908436352,908436479,NL +908436480,908436503,FR +908436504,908436511,ES +908436512,908436535,FR +908436536,908436543,ES +908436544,908436607,FR +908436608,908436735,DE +908436736,908437335,FR +908437336,908437343,ES +908437344,908438023,FR +908438024,908438031,ES +908438032,908438087,FR +908438088,908438095,ES +908438096,908438111,LT +908438112,908438399,FR +908438400,908438407,ES +908438408,908438527,FR +908438528,908438655,IE +908438656,908438783,ES +908438784,908438911,DE +908438912,908439087,FR +908439088,908439103,ES +908439104,908439295,FR +908439296,908439423,BE +908439424,908439679,FR +908439680,908439807,NL +908439808,908439871,FR +908439872,908439903,PL +908439904,908439967,FR +908439968,908439999,PT +908440000,908440031,PL +908440032,908440063,FR +908440064,908440191,GB +908440192,908440223,FI +908440224,908440255,FR +908440256,908440287,PT +908440288,908440319,CZ +908440320,908440447,IT +908440448,908441023,FR +908441024,908441055,FI +908441056,908441311,FR +908441312,908441343,CZ +908441344,908443263,FR +908443264,908443391,BE +908443392,908443487,FR +908443488,908443519,GB +908443520,908444159,FR +908444160,908444223,DE +908444224,908448927,FR +908448928,908448935,IT +908448936,908448995,FR +908448996,908448999,IT +908449000,908453887,FR +908453888,908454911,PL +908454912,908525567,FR +908525568,908591103,CA +908591104,910163967,US +910163968,910197237,JP +910197238,910197238,US +910197239,910295039,JP +910295040,910360575,AU +910360576,910688255,US +910688256,911147007,IE +911147008,911212543,AU +911212544,911998975,US +911998976,912031743,JP +912031744,912064511,US +912064512,912130047,DE +912130048,912195583,BR +912195584,912261119,JP +912261120,915800063,US +915800064,915865599,JP +915865600,915898367,US +915898368,915931135,SG +915931136,916029439,US +916029440,916062207,AU +916062208,916191009,IE +916191010,916191010,GB +916191011,916193279,IE +916193280,916979711,US +916979712,917045247,JP +917045248,917089018,SG +917089019,917089019,IN +917089020,917110783,SG +917110784,917241855,IE +917241856,917635071,US +917635072,917700607,JP +917700608,917766143,SG +917766144,918683647,US +918683648,918814719,IE +918814720,919011327,US +919011328,919076863,JP +919076864,919470079,US +919470080,919535615,AU +919535616,919601151,BR +919601152,920125439,US +920125440,920256511,IE +920256512,920387583,US +920387584,920453119,IE +920453120,920518655,US +920518656,920649727,CN +920649728,920911871,US +920911872,921042943,IE +921042944,921141247,US +921141248,921149439,IE +921149440,921157631,US +921157632,921161727,DE +921161728,921165823,US +921165824,921167871,JP +921167872,921169919,US +921169920,921170943,SG +921170944,921171967,US +921171968,921173247,AU +921173248,921173503,BR +921173504,921174015,US +921174016,921305087,BR +921305088,921567231,US +921567232,921632767,JP +921632768,921632815,US +921632816,921632831,IE +921632832,921632847,BR +921632848,921632863,JP +921632864,921632879,SG +921632880,921632895,AU +921632896,921632911,US +921632912,921632927,CN +921632928,921632943,DE +921632944,921632959,CN +921632960,921632975,KR +921632976,921632991,IN +921632992,921633007,US +921633008,921633023,GB +921633024,921633039,CA +921633040,921633055,FR +921633056,921633791,US +921633792,921634815,DE +921634816,921640959,US +921640960,921643007,IE +921643008,921646079,US +921646080,921646591,JP +921646592,921649151,DE +921649152,921657343,US +921657344,921657599,JP +921657600,921658111,US +921658112,921658879,IE +921658880,921662463,US +921662464,921665535,KR +921665536,921747455,US +921747456,921748479,AU +921748480,921748735,US +921748736,921748991,IE +921748992,921749247,US +921749248,921749503,SG +921749504,921749759,JP +921749760,921750271,US +921750272,921751551,AU +921751552,921754623,US +921754624,921755647,IE +921755648,921755903,US +921755904,921756159,JP +921756160,921756671,SG +921756672,921760767,US +921760768,921761791,BR +921761792,922091519,US +922091520,922189311,IE +922189312,922189567,US +922189568,922205775,IE +922205776,922205776,DE +922205777,922222591,IE +922222592,922419199,JP +922419200,922427633,SG +922427634,922427634,US +922427635,922427703,SG +922427704,922427704,US +922427705,922484735,SG +922484736,922615807,AU +922615808,922746879,SG +922746880,956301311,US +956301312,959447039,BE +959447040,959512575,US +959512576,960495615,BE +960495616,960626687,FR +960626688,960659455,GB +960659456,960662783,DE +960662784,960663039,FR +960663040,960676607,DE +960676608,960676863,PL +960676864,960692223,DE +960692224,960699935,FR +960699936,960699967,IT +960699968,960724991,FR +960724992,960726783,NL +960726784,960727039,ZA +960727040,960727295,US +960727296,960729343,NL +960729344,960729599,ZA +960729600,960733183,NL +960733184,960741375,BE +960741376,960749567,NL +960749568,960757759,LU +960757760,960888831,US +960888832,960921599,AU +960921600,960929791,NZ +960929792,960933887,KI +960933888,960937983,MH +960937984,960942079,FM +960942080,960946175,NR +960946176,960950271,FJ +960950272,960954367,PW +960954368,960958463,PG +960958464,960962559,WS +960962560,960966655,SB +960966656,960970751,TO +960970752,960974847,TV +960974848,960978943,VU +960978944,960983039,NC +960983040,961019903,FR +961019904,961022079,HK +961022080,961022095,SG +961022096,961052671,HK +961052672,961085439,JP +961085440,961092095,SG +961092096,961092351,IN +961092352,961118207,SG +961118208,961126399,MY +961126400,961134591,TW +961134592,961142783,KR +961142784,961150975,FR +961150976,961183743,BR +961183744,961191935,AR +961191936,961200127,CL +961200128,961208319,CO +961208320,961216511,VE +961216512,961224703,PE +961224704,961228799,EC +961228800,961232895,BO +961232896,961236991,PY +961236992,961237011,FR +961237012,961241087,UY +961241088,961245183,GF +961245184,961247231,GY +961247232,961249279,SR +961249280,961253375,GT +961253376,961257471,BZ +961257472,961261567,HN +961261568,961265663,NI +961265664,961269759,SV +961269760,961273855,PA +961273856,961277951,CR +961277952,961282047,FR +961282048,961314815,MX +961314816,961380351,US +961380352,961413119,CA +961413120,961445887,IT +961445888,961478655,ES +961478656,961511423,CH +961511424,961519615,PT +961519616,961523711,SE +961523712,961527807,LI +961527808,961531903,MC +961531904,961533951,SM +961533952,961540095,VA +961540096,961542143,AD +961542144,961544191,MC +961544192,961675263,US +961675264,961683455,ZA +961683456,961687551,DZ +961687552,961691647,AO +961691648,961695743,BJ +961695744,961699839,BW +961699840,961703935,BF +961703936,961708031,BI +961708032,961712127,CM +961712128,961716223,CV +961716224,961720319,CF +961720320,961724415,TD +961724416,961740799,ZA +961740800,961744895,EG +961744896,961748991,GQ +961748992,961753087,ER +961753088,961757183,ET +961757184,961761279,GA +961761280,961765375,GH +961765376,961769471,GN +961769472,961773567,GW +961773568,961777663,CI +961777664,961781759,KE +961781760,961785855,LS +961785856,961789951,LR +961789952,961794047,LY +961794048,961798143,MG +961798144,961800191,MW +961800192,961802239,ML +961802240,961810431,MR +961810432,961814527,MU +961814528,961818623,MA +961818624,961822719,MZ +961822720,961826815,NA +961826816,961830911,NE +961830912,961835007,NG +961835008,961839103,RW +961839104,961843199,ST +961843200,961847295,SN +961847296,961851391,SC +961851392,961855487,SL +961855488,961859583,SO +961859584,961863679,SD +961863680,961867775,SZ +961867776,961871871,TZ +961871872,961875967,GM +961875968,961880063,TG +961880064,961884159,TN +961884160,961888255,UG +961888256,961892351,ZM +961892352,961896447,ZW +961896448,961900543,NG +961900544,961937407,FR +961937408,961945599,IS +961945600,961953791,FI +961953792,961961983,DK +961961984,961970175,NO +961970176,962002943,SE +962002944,962035711,RU +962035712,962039807,EE +962039808,962043903,LV +962043904,962047999,LT +962048000,962052095,FR +962052096,962056191,UA +962056192,962060287,BY +962060288,962068479,FR +962068480,962072575,AM +962072576,962076671,AZ +962076672,962080767,BH +962080768,962084863,EG +962084864,962088959,GE +962088960,962093055,IR +962093056,962097151,IQ +962097152,962101247,IL +962101248,962105343,JO +962105344,962109439,KW +962109440,962113535,LB +962113536,962117631,OM +962117632,962121727,QA +962121728,962125823,SA +962125824,962129919,SY +962129920,962134015,TM +962134016,962138111,AE +962138112,962142207,YE +962142208,962199551,FR +962199552,962203647,AL +962203648,962211839,AT +962211840,962215935,BG +962215936,962217983,HR +962217984,962220031,BA +962220032,962224127,CZ +962224128,962228223,GR +962228224,962232319,HU +962232320,962236415,MK +962236416,962240511,MD +962240512,962244607,PL +962244608,962248703,RO +962248704,962250751,RS +962250752,962252799,ME +962252800,962256895,SK +962256896,962260991,SI +962260992,962265087,TR +962265088,962269183,AG +962269184,962273279,BB +962273280,962277375,CU +962277376,962281471,DM +962281472,962285567,DO +962285568,962289663,GD +962289664,962293759,HT +962293760,962297855,JM +962297856,962301951,KN +962301952,962306047,LC +962306048,962310143,VC +962310144,962314239,BS +962314240,962318335,TT +962318336,962322431,PR +962322432,962324479,AW +962324480,962330623,FR +962330624,962334719,AF +962334720,962338815,BD +962338816,962342911,BT +962342912,962347007,BN +962347008,962351103,MM +962351104,962355199,KH +962355200,962359295,CN +962359296,962363391,IN +962363392,962367487,ID +962367488,962371583,KZ +962371584,962375679,KG +962375680,962379775,LA +962379776,962383871,MV +962383872,962387967,MN +962387968,962392063,NP +962392064,962396159,PK +962396160,962400255,PH +962400256,962404351,LK +962404352,962408447,TJ +962408448,962412543,TH +962412544,962416639,UZ +962416640,962420735,VN +962420736,962461695,FR +962461696,962469887,IE +962469888,962527231,TR +962527232,962592767,FR +962592768,962594815,IN +962594816,962596863,FR +962596864,962598911,SG +962598912,962600959,FR +962600960,962609151,HK +962609152,962613247,JP +962613248,962617343,FR +962617344,962621439,AU +962621440,962674687,FR +962674688,962676735,BR +962676736,962678783,CL +962678784,962680831,FR +962680832,962689023,US +962689024,962723839,FR +962723840,962732031,GB +962732032,962740223,DE +962740224,962744319,SE +962744320,962746367,FR +962746368,962748415,NL +962748416,962752511,BH +962752512,962756607,ZA +962756608,962854911,FR +962854912,962856959,SG +962856960,964689919,FR +964689920,968753151,BE +968753152,968757247,NL +968757248,968818687,CH +968818688,968819711,DE +968819712,968851455,BE +968851456,968852479,US +968852480,973078527,BE +973078528,973209599,JP +973209600,973275135,IN +973275136,973471743,JP +973471744,973602815,AU +973602816,973864959,TH +973864960,973996031,JP +973996032,974782463,CN +974782464,974880767,MY +974880768,974913535,PK +974913536,974979071,NZ +974979072,975044607,KR +975044608,977272831,CN +977272832,977305599,TH +977305600,977338367,HK +977338368,977346559,SG +977346560,977354751,JP +977354752,977371135,KR +977371136,977395711,PK +977395712,977397759,BD +977397760,977399807,CN +977399808,977401855,ID +977401856,977403903,AU +977403904,977534975,CN +977534976,977567743,IN +977567744,977600511,CN +977600512,977666047,PH +977666048,977731583,JP +977731584,977764351,PH +977764352,977797119,MY +977797120,978321407,KR +978321408,978452479,JP +978452480,978485247,CN +978485248,978501631,TH +978501632,978518015,HK +978518016,978583551,CN +978583552,978584575,VN +978584576,978585599,HK +978585600,978586623,US +978586624,978587647,IN +978587648,978588671,MY +978588672,978590719,IN +978590720,978591743,PK +978591744,978592767,BD +978592768,978593023,US +978593024,978593279,NZ +978593280,978593535,AU +978593536,978593791,AE +978593792,978594815,MY +978594816,978595839,KR +978595840,978596863,NZ +978596864,978597887,HK +978597888,978599935,IN +978599936,978640895,AU +978640896,978644991,NZ +978644992,978714623,JP +978714624,978780159,TW +978780160,978784255,AU +978784256,978788351,JP +978788352,978796543,KR +978796544,978812927,CN +978812928,979369983,JP +979369984,979410943,AU +979410944,979419135,HK +979419136,979435519,SG +979435520,979468287,TH +979468288,979501055,BD +979501056,979566591,JP +979566592,979599359,TW +979599360,979763199,CN +979763200,979894271,KR +979894272,980418559,AU +980418560,980549631,JP +980549632,980680703,TW +980680704,980942847,CN +980942848,981467135,KR +981467136,981991423,CN +981991424,982122495,TH +982122496,982171647,JP +982171648,982188031,KR +982188032,982253567,MY +982253568,982515711,KR +982515712,982581247,CN +982581248,982614015,KR +982614016,982622207,AU +982622208,982624255,JP +982624256,982626303,ID +982626304,982628351,JP +982628352,982630399,BD +982630400,982639103,JP +982639104,982639615,SG +982639616,982639871,JP +982639872,982641151,SG +982641152,982641407,JP +982641408,982642687,SG +982642688,982671359,JP +982671360,982679551,IN +982679552,982695935,SG +982695936,982712319,KR +982712320,982745087,TH +982745088,982753279,AF +982753280,982755327,JP +982755328,982757375,BD +982757376,982759423,KR +982759424,982761471,ID +982761472,982777855,JP +982777856,983039999,KR +983040000,983171071,HK +983171072,983302143,CN +983302144,983564287,JP +983564288,984612863,AU +984612864,984743935,HK +984743936,984875007,AU +984875008,984956927,KR +984956928,984965119,AU +984965120,984973311,PK +984973312,985006079,TH +985006080,985071615,SG +985071616,985137151,JP +985137152,985202687,KR +985202688,985268223,SG +985268224,985399295,VN +985399296,985661439,JP +985661440,987758591,CN +987758592,988807167,KR +988807168,989855743,CN +989855744,991952895,KR +991952896,995360767,CN +995360768,995532799,JP +995532800,995540991,AU +995540992,995557375,KR +995557376,995622911,JP +995622912,996409343,IN +996409344,996573183,AU +996573184,996605951,TW +996605952,996671487,PK +996671488,996802559,TW +996802560,996868095,JP +996868096,997195775,CN +997195776,998244351,TW +998244352,999292927,JP +999292928,999423999,IN +999424000,999555071,JP +999555072,999686143,HK +999686144,999751679,KR +999751680,999784447,CN +999784448,999800831,US +999800832,999817215,KR +999817216,999821311,BD +999821312,999827455,CN +999827456,999828479,IN +999828480,999828735,HK +999828736,999828991,PH +999828992,999829311,MY +999829312,999829343,CN +999829344,999829375,MM +999829376,999829383,TH +999829384,999829407,HK +999829408,999829439,KR +999829440,999829471,VN +999829472,999829503,ID +999829504,999830527,HK +999830528,999832575,IN +999832576,999833599,BD +999833600,999837695,CN +999837696,999838719,IN +999838720,999838975,FR +999838976,999839231,IT +999839232,999839487,ES +999839488,999839743,AU +999839744,999845887,BD +999845888,999847935,CN +999847936,999848959,IN +999848960,999849983,US +999849984,999866367,KR +999866368,999882751,HK +999882752,999883775,IN +999883776,999884799,CN +999884800,999885823,AU +999885824,999886847,IN +999886848,999887871,BD +999887872,999888895,NZ +999888896,999889407,ID +999889408,999889919,MY +999889920,999890943,BD +999890944,999891967,CN +999891968,999892991,IN +999892992,999895039,JP +999895040,999898111,HK +999898112,999902207,CN +999902208,999903231,SG +999903232,999904255,ID +999904256,999905279,MN +999905280,999906303,MM +999906304,999907327,CN +999907328,999908351,IN +999908352,999909375,BD +999909376,999910399,SG +999910400,999911423,MM +999911424,999912447,MN +999912448,999913471,CN +999913472,999914495,IN +999914496,999915519,AF +999915520,999916543,ID +999916544,999917567,TL +999917568,999918591,CN +999918592,999919615,JP +999919616,999921663,HK +999921664,999923711,CN +999923712,999924735,HK +999924736,999932927,CN +999932928,999933951,HK +999933952,999934975,BD +999934976,999935999,JP +999936000,999937023,TH +999937024,999948287,VN +999948288,1000013823,AU +1000013824,1000079359,CN +1000079360,1000341503,JP +1000341504,1000734719,IN +1000734720,1000800255,JP +1000800256,1000865791,AU +1000865792,1001127935,JP +1001127936,1001390079,CN +1001390080,1002045439,IN +1002045440,1002176511,KR +1002176512,1002242047,HK +1002242048,1002307583,SG +1002307584,1002373119,JP +1002373120,1002405887,CN +1002405888,1002422271,JP +1002422272,1002434559,AU +1002434560,1002438399,CN +1002438400,1002438655,HK +1002438656,1008730111,CN +1008730112,1009778687,JP +1009778688,1010237439,MY +1010237440,1010302975,CN +1010302976,1010761727,JP +1010761728,1010827263,CN +1010827264,1017118719,JP +1017118720,1019215871,CN +1019215872,1019346943,JP +1019346944,1019478015,CN +1019478016,1019609087,KR +1019609088,1019740159,TW +1019740160,1021313023,CN +1021313024,1021837311,AU +1021837312,1021968383,CN +1021968384,1022033919,NZ +1022033920,1022099455,CN +1022099456,1022361599,JP +1022361600,1022558207,AU +1022558208,1022623743,IN +1022623744,1022722047,TW +1022722048,1022754815,CN +1022754816,1022820351,MO +1022820352,1022885887,CN +1022885888,1023148031,TW +1023148032,1023213567,CN +1023213568,1023238143,KR +1023238144,1023246335,ID +1023246336,1023279103,CN +1023279104,1023311871,IN +1023311872,1023317503,US +1023317504,1023317759,IN +1023317760,1023323429,US +1023323430,1023323430,CN +1023323431,1023328255,US +1023328256,1023344639,JP +1023344640,1023410175,CN +1023410176,1023672319,IN +1023672320,1023688703,HK +1023688704,1023692799,MM +1023692800,1023696895,CN +1023696896,1023705087,MY +1023705088,1023717375,JP +1023717376,1023721471,CN +1023721472,1023737855,KR +1023737856,1023770623,ID +1023770624,1023778815,PK +1023778816,1023787007,KR +1023787008,1023791103,AF +1023791104,1023795199,NC +1023795200,1023803391,JP +1023803392,1023852543,MY +1023852544,1023868927,BN +1023868928,1023901695,JP +1023901696,1023934463,TH +1023934464,1023942719,AU +1023942720,1023942751,MY +1023942752,1023943535,AU +1023943536,1023943551,JP +1023943552,1023946879,AU +1023946880,1023946911,SG +1023946912,1023950847,AU +1023950848,1023954943,ID +1023954944,1023959039,JP +1023959040,1023967231,AU +1023967232,1023975423,IN +1023975424,1023979519,CN +1023979520,1023983615,AU +1023983616,1023999999,SG +1024000000,1024032767,PH +1024032768,1024065535,AU +1024065536,1024131071,HK +1024131072,1024163839,IN +1024163840,1024184319,JP +1024184320,1024188415,MY +1024188416,1024196607,VN +1024196608,1024229375,IN +1024229376,1024262143,JP +1024262144,1024327679,SG +1024327680,1024327935,US +1024327936,1024328191,AU +1024328192,1024328447,HK +1024328448,1024328703,US +1024328704,1024329727,CN +1024329728,1024330751,JP +1024330752,1024331775,AU +1024331776,1024335871,US +1024335872,1024339967,AU +1024339968,1024340991,ZA +1024340992,1024344063,US +1024344064,1024352255,SG +1024352256,1024360447,AU +1024360448,1024361135,JP +1024361136,1024361151,HK +1024361152,1024361167,JP +1024361168,1024361183,HK +1024361184,1024364063,JP +1024364064,1024364079,AU +1024364080,1024365727,JP +1024365728,1024365759,SG +1024365760,1024368895,JP +1024368896,1024368896,HK +1024368897,1024370175,JP +1024370176,1024370687,AU +1024370688,1024371199,JP +1024371200,1024371455,PH +1024371456,1024372543,JP +1024372544,1024372639,HK +1024372640,1024373263,JP +1024373264,1024373279,HK +1024373280,1024376831,JP +1024376832,1024378879,PH +1024378880,1024380927,IN +1024380928,1024381951,KR +1024381952,1024385023,CN +1024385024,1024386047,US +1024386048,1024387071,IN +1024387072,1024389119,VN +1024389120,1024391167,CN +1024391168,1024392191,ID +1024392192,1024458751,HK +1024458752,1024491519,SG +1024491520,1024589823,IN +1024589824,1024655359,HK +1024655360,1024720895,TH +1024720896,1024786431,TW +1024786432,1025245183,JP +1025245184,1025277951,CN +1025277952,1025294335,PH +1025294336,1025294591,AU +1025294592,1025294847,SG +1025294848,1025295615,AU +1025295616,1025295871,PH +1025295872,1025296127,AU +1025296128,1025296639,FR +1025296640,1025299199,AU +1025299200,1025299263,IN +1025299264,1025299455,AU +1025299456,1025299711,CN +1025299712,1025300735,AU +1025300736,1025300991,US +1025300992,1025301055,AU +1025301056,1025301247,US +1025301248,1025301503,GB +1025301504,1025302271,AU +1025302272,1025302527,GB +1025302528,1025310719,VN +1025310720,1025343487,AU +1025343488,1025376255,CN +1025376256,1025507327,TW +1025507328,1026293759,KR +1026293760,1026392063,JP +1026392064,1026408447,CN +1026408448,1026416639,JP +1026416640,1026420735,CN +1026420736,1026422783,JP +1026422784,1026423039,AU +1026423040,1026423295,SG +1026423296,1026424831,AU +1026424832,1026490623,JP +1026490624,1026491135,SG +1026491136,1026491903,JP +1026491904,1026494207,SG +1026494208,1026494463,JP +1026494464,1026494719,SG +1026494720,1026494975,JP +1026494976,1026495743,SG +1026495744,1026496255,JP +1026496256,1026496511,SG +1026496512,1026496767,JP +1026496768,1026497279,SG +1026497280,1026497535,JP +1026497536,1026497791,SG +1026497792,1026498047,JP +1026498048,1026501631,SG +1026501632,1026502399,JP +1026502400,1026502911,SG +1026502912,1026503679,JP +1026503680,1026503935,SG +1026503936,1026504959,JP +1026504960,1026506751,SG +1026506752,1026507519,JP +1026507520,1026508799,SG +1026508800,1026510847,JP +1026510848,1026512895,SG +1026512896,1026514943,JP +1026514944,1026515455,SG +1026515456,1026515967,JP +1026515968,1026516479,SG +1026516480,1026516991,JP +1026516992,1026518015,SG +1026518016,1026519039,JP +1026519040,1026523135,SG +1026523136,1026539519,CN +1026539520,1026555903,KR +1026555904,1027080191,CN +1027080192,1027866623,TW +1027866624,1027997695,AU +1027997696,1028128767,TW +1028128768,1029046271,KR +1029046272,1029122817,JP +1029122818,1029122818,FR +1029122819,1029148671,JP +1029148672,1029152767,HK +1029152768,1029156863,SG +1029156864,1029160959,AU +1029160960,1029177343,CN +1029177344,1029242879,AU +1029242880,1029308415,JP +1029308416,1029439487,TH +1029439488,1029570559,HK +1029570560,1029636095,ID +1029636096,1029668863,AU +1029668864,1029701631,IN +1029701632,1030674431,KR +1030674432,1030676479,JP +1030676480,1030750207,KR +1030750208,1031798783,JP +1031798784,1033172184,CN +1033172185,1033172185,US +1033172186,1035993087,CN +1035993088,1037565951,JP +1037565952,1038614527,TW +1038614528,1039007743,CN +1039007744,1039138815,HK +1039138816,1039400959,CN +1039400960,1039466495,HK +1039466496,1039499263,JP +1039499264,1039507455,AU +1039507456,1039511551,LK +1039511552,1039515647,KR +1039515648,1039523839,JP +1039523840,1039532031,KR +1039532032,1039597567,IN +1039597568,1039613951,ID +1039613952,1039638527,KR +1039638528,1039642623,TW +1039642624,1039646719,BD +1039646720,1039654911,KR +1039654912,1039663103,IN +1039663104,1040187391,KR +1040187392,1040252927,IL +1040252928,1040318463,GR +1040318464,1040383999,CH +1040384000,1040392191,SA +1040392192,1040392447,GB +1040392448,1040400383,SA +1040400384,1040416767,GB +1040416768,1040424959,SE +1040424960,1040433151,PL +1040433152,1040449535,GB +1040449536,1040457727,FR +1040457728,1040465919,ME +1040465920,1040466175,DE +1040473344,1040473599,DE +1040474112,1040477183,CZ +1040477184,1040477184,KG +1040477185,1040482303,CZ +1040482304,1040515071,BE +1040515072,1040547839,GB +1040547840,1040580607,RU +1040580608,1040711679,GB +1040711680,1040719871,FR +1040719872,1040728063,DE +1040728064,1040736255,KE +1040736256,1040744447,GB +1040744448,1040777215,DE +1040777216,1040842751,IE +1040842752,1040973823,IT +1040973824,1040982015,NL +1040982016,1040982527,DK +1040982528,1040982783,FI +1040982784,1040983551,DK +1040983552,1040983807,FO +1040983808,1040990207,DK +1040990208,1040998399,CY +1040998400,1041002495,SD +1041002496,1041004543,KE +1041006592,1041039359,CH +1041039360,1041072127,SE +1041072128,1041080319,GB +1041080320,1041088511,IT +1041088512,1041093631,AT +1041093632,1041094143,US +1041094144,1041096703,AT +1041096704,1041235967,ES +1041235968,1041244159,UA +1041244160,1041252351,RU +1041252352,1041256447,PS +1041256448,1041260543,SY +1041260544,1041268735,RU +1041268736,1041283839,NO +1041283840,1041284095,SJ +1041284096,1041294847,NO +1041294848,1041295103,SJ +1041295104,1041301503,NO +1041301504,1041367039,IE +1041367040,1041498111,IT +1041498112,1041563647,SE +1041563648,1041596415,PL +1041596416,1041629183,NL +1041629184,1041694719,ES +1041694720,1041724807,FR +1041724808,1041724815,AT +1041724816,1041728551,FR +1041728552,1041728559,IT +1041728560,1041728655,FR +1041728656,1041728671,IT +1041728672,1041741567,FR +1041741568,1041741823,ES +1041741824,1041748823,FR +1041748824,1041748831,DE +1041748832,1041750351,FR +1041750352,1041750367,DE +1041750368,1041752319,FR +1041752320,1041752575,AT +1041752576,1041760255,FR +1041760256,1041768447,DE +1041768448,1041776639,NO +1041776640,1041784831,CZ +1041784832,1041793023,KE +1041793024,1041825791,GB +1041825792,1041842175,NL +1041842176,1041858559,GB +1041858560,1041862655,HK +1041862656,1041866751,SG +1041866752,1041870847,JP +1041870848,1041874943,AU +1041874944,1041890047,GB +1041890048,1041891327,HK +1041891328,1042022399,DE +1042022400,1042087935,PT +1042087936,1042120703,TR +1042120704,1042153471,PL +1042153472,1042284543,GB +1042284544,1042292735,CH +1042292736,1042294527,NL +1042294528,1042294783,GB +1042294784,1042295551,NL +1042295552,1042296575,GE +1042296576,1042300903,NL +1042300904,1042300911,UA +1042300912,1042300927,NL +1042300928,1042309119,RU +1042309120,1042317311,GB +1042317312,1042350079,ES +1042350080,1042415615,RU +1042415616,1042546687,FR +1042546688,1042677759,ES +1042677760,1042743295,GR +1042743296,1042808831,FR +1042808832,1042817023,DE +1042817024,1042825215,IE +1042825216,1042833407,CZ +1042833408,1042834025,GB +1042834026,1042834026,PT +1042834027,1042840673,GB +1042840674,1042840674,PT +1042840675,1042841599,GB +1042841600,1042874367,AT +1042874368,1042875135,NL +1042875136,1042875391,FR +1042875392,1042879999,NL +1042880000,1042880007,GB +1042880008,1042881023,NL +1042881024,1042881535,DE +1042881536,1042939903,NL +1042939904,1043070975,ES +1043070976,1043079167,CZ +1043079168,1043087359,DE +1043087360,1043095551,GB +1043095552,1043103743,BG +1043103744,1043120127,DK +1043120128,1043136511,FI +1043136512,1043202047,NL +1043202048,1043333119,AT +1043333120,1043341311,CH +1043341312,1043349503,IT +1043349504,1043357695,DE +1043357696,1043365887,CH +1043365888,1043398655,PT +1043398656,1043465839,GB +1043465840,1043465847,NL +1043465848,1043475871,GB +1043475872,1043475887,DE +1043475888,1043476111,GB +1043476112,1043476127,DE +1043476128,1043476383,GB +1043476384,1043476399,DE +1043476400,1043476431,GB +1043476432,1043476447,DE +1043476448,1043483391,GB +1043483392,1043483423,CH +1043483424,1043488767,GB +1043488768,1043496959,DE +1043496960,1043505151,GB +1043505152,1043513343,NO +1043513344,1043529727,GB +1043529728,1043595263,NL +1043595264,1043661567,DE +1043661568,1043661823,GB +1043661824,1043857407,DE +1043857408,1043897343,GB +1043897344,1043897855,NG +1043897856,1043899391,GB +1043899392,1043899647,CG +1043899648,1043902463,GB +1043902464,1043908607,US +1043908608,1043910655,DE +1043910656,1043919442,GB +1043919443,1043919443,SS +1043919444,1043920895,GB +1043920896,1043921919,UG +1043921920,1043922943,IL +1043922944,1043988479,ES +1043988480,1044118295,NL +1044118296,1044118303,BE +1044118304,1044118423,NL +1044118424,1044118431,BE +1044118432,1044118439,NL +1044118440,1044118447,BE +1044118448,1044118511,NL +1044118512,1044118519,BE +1044118520,1044119551,NL +1044119552,1044152319,GB +1044152320,1044185087,IR +1044185088,1044193279,RU +1044193280,1044201471,PL +1044201472,1044217855,FI +1044217856,1044226047,DK +1044226048,1044234239,OM +1044234240,1044250623,RE +1044283392,1044316159,FR +1044316160,1044332543,NO +1044332544,1044348927,RU +1044348928,1044365311,LV +1044365312,1044381695,SE +1044381696,1044389887,RU +1044389888,1044398079,FR +1044398080,1044414463,UA +1044414464,1044447231,GB +1044447232,1044453233,SE +1044453234,1044453234,NO +1044453235,1044455168,SE +1044455169,1044455169,NO +1044455170,1044455423,SE +1044455424,1044463615,EE +1044463616,1044479999,SE +1044480000,1044488191,CH +1044488192,1044496383,SK +1044496384,1044512767,EE +1044512768,1044578303,DK +1044578304,1044578623,GB +1044578624,1044578639,DE +1044578640,1044589055,GB +1044589056,1044589311,DE +1044589312,1044590689,GB +1044590690,1044590690,FR +1044590691,1044594303,GB +1044594304,1044594431,DE +1044594432,1044625631,GB +1044625632,1044625647,RS +1044625648,1044627391,GB +1044627392,1044627455,ES +1044627456,1044636671,GB +1044636672,1044637695,DE +1044637696,1044638463,GB +1044638464,1044638719,DE +1044638720,1044640767,GB +1044640768,1044642815,DE +1044642816,1044643839,GB +1044643840,1044652031,DE +1044652032,1044660223,LY +1044660224,1044668415,GR +1044668416,1044676607,BA +1044676608,1044684799,RU +1044684800,1044685158,GG +1044685159,1044685159,JE +1044685160,1044692422,GG +1044692423,1044692423,IM +1044692424,1044692991,GG +1044692992,1044697087,AT +1044697088,1044697343,DE +1044697344,1044698111,AT +1044698112,1044698367,DE +1044698368,1044698623,AT +1044698624,1044699135,DE +1044699136,1044701183,AT +1044701184,1044709375,EG +1044709376,1044717567,RU +1044717568,1044742143,GB +1044742144,1044744191,IT +1044744192,1044746239,GB +1044746240,1044748287,DE +1044748288,1044750335,DK +1044750336,1044758527,NL +1044758528,1044774911,PL +1044774912,1044840447,NO +1044840448,1044905983,FI +1044905984,1044908031,GB +1044908032,1044909055,US +1044909056,1044910847,GB +1044910848,1044911103,DE +1044911104,1044913951,GB +1044913952,1044913967,DE +1044913968,1044913983,GB +1044913984,1044914015,DE +1044914016,1044914047,GB +1044914048,1044914111,DE +1044914112,1044916735,GB +1044916736,1044917247,DE +1044917248,1044917279,GB +1044917280,1044917295,US +1044917296,1044917311,DE +1044917312,1044917343,GB +1044917344,1044917359,DE +1044917360,1044917503,GB +1044917504,1044917759,DE +1044917760,1044917823,GB +1044917824,1044918271,DE +1044918272,1044918287,GB +1044918288,1044919295,DE +1044919296,1044920191,GB +1044920192,1044920319,DE +1044920320,1044921343,GB +1044921344,1044922367,US +1044922368,1044930559,DE +1044930560,1044931231,GB +1044931232,1044931239,BE +1044931240,1044932303,GB +1044932304,1044932311,BE +1044932312,1044933499,GB +1044933500,1044933503,BE +1044933504,1044935119,GB +1044935120,1044935135,BE +1044935136,1044935183,GB +1044935184,1044935191,BE +1044935192,1044936115,GB +1044936116,1044936119,BE +1044936120,1044936487,GB +1044936488,1044936495,BE +1044936496,1044936735,GB +1044936736,1044936743,BE +1044936744,1044937247,GB +1044937248,1044937255,BE +1044937256,1044938503,GB +1044938504,1044938511,LU +1044938512,1044938679,GB +1044938680,1044938687,LU +1044938688,1044946943,GB +1044946944,1044955135,UA +1044955136,1044963327,NL +1044963328,1044971519,FI +1044971520,1044973567,FR +1044973568,1044974079,GB +1044974080,1044979711,FR +1044979712,1044987903,FI +1044987904,1045004287,BG +1045004288,1045018787,GB +1045018788,1045018799,ES +1045018800,1045020671,GB +1045020672,1045037055,NO +1045037056,1045119231,GR +1045119232,1045119743,AL +1045119744,1045135359,GR +1045135360,1045162147,FR +1045162148,1045162151,DE +1045162152,1045168127,FR +1045168128,1045171199,RU +1045171200,1045171455,UA +1045171456,1045233663,RU +1045233664,1045241855,GB +1045241856,1045250047,IT +1045250048,1045266431,CZ +1045266432,1045268479,HU +1045268480,1045270527,MK +1045270528,1045274623,HU +1045274624,1045282815,IE +1045282816,1045299199,HU +1045299200,1045307391,US +1045307392,1045315583,RU +1045315584,1045319679,DE +1045319680,1045323775,RU +1045323776,1045364735,FI +1045364736,1045430271,DK +1045430272,1045446655,DE +1045446656,1045453823,HU +1045453824,1045454847,SK +1045460992,1045461503,FR +1045461632,1045461695,FR +1045462016,1045463039,DE +1045463040,1045471231,FI +1045471232,1045479423,UA +1045479424,1045487615,SE +1045487616,1045495807,LT +1045495808,1045692415,ES +1045692416,1045700607,LV +1045700608,1045708799,KZ +1045708800,1045716991,LB +1045716992,1045725183,RU +1045725184,1045733375,CZ +1045733376,1045745420,GB +1045745421,1045745421,SE +1045745422,1045748319,GB +1045748320,1045748351,SE +1045748352,1045749759,GB +1045749760,1045753855,SI +1045753856,1045755903,NL +1045755904,1045757951,UA +1045757952,1045790719,LV +1045790720,1045798911,FR +1045798912,1045889023,IT +1045889024,1045921791,ES +1045921792,1045954559,PL +1045954560,1045987327,BE +1045987328,1046020095,SE +1046020096,1046028287,AM +1046028288,1046036479,NO +1046036480,1046052863,PL +1046052864,1046061055,GB +1046061056,1046069247,DE +1046069248,1046075391,RU +1046075392,1046077439,KZ +1046077440,1046085631,RU +1046085632,1046151167,IL +1046151168,1046216703,DE +1046216704,1046225647,NO +1046225648,1046225655,SE +1046225656,1046282239,NO +1046282240,1046290431,DE +1046290432,1046298623,PL +1046298624,1046315007,AT +1046315008,1046315519,FR +1046315520,1046316031,IT +1046316032,1046316543,FR +1046316544,1046317055,DK +1046317056,1046317567,GB +1046317568,1046318079,NL +1046318080,1046319103,GB +1046319104,1046320127,NL +1046320128,1046321151,GB +1046321152,1046323199,NL +1046323200,1046331391,ES +1046347776,1046413311,IT +1046413312,1046446079,SE +1046446080,1046478879,DE +1046478880,1046479839,GB +1046479840,1046479871,DE +1046479872,1046481919,GB +1046481920,1046481927,DE +1046481928,1046482951,GB +1046482952,1046482952,DE +1046482953,1046483199,GB +1046483200,1046483231,DE +1046483232,1046484607,GB +1046484608,1046484615,DE +1046484616,1046484711,GB +1046484712,1046484719,DE +1046484720,1046485303,GB +1046485304,1046485311,DE +1046485312,1046485903,GB +1046485904,1046485911,DE +1046485912,1046487289,GB +1046487290,1046487290,DE +1046487291,1046488913,GB +1046488914,1046488914,DE +1046488915,1046489087,GB +1046489088,1046489119,DE +1046489120,1046489311,GB +1046489312,1046489327,ES +1046489328,1046489391,GB +1046489392,1046489407,IT +1046489408,1046489471,GB +1046489472,1046489487,ES +1046489488,1046489503,GB +1046489504,1046489519,DE +1046489520,1046489975,GB +1046489976,1046489983,DE +1046489984,1046489999,GB +1046490000,1046490007,DE +1046490008,1046492471,GB +1046492472,1046492479,DE +1046492480,1046492719,GB +1046492720,1046492727,DE +1046492728,1046493015,GB +1046493016,1046493023,DE +1046493024,1046493039,GB +1046493040,1046493047,DE +1046493048,1046493063,GB +1046493064,1046493071,DE +1046493072,1046493983,GB +1046493984,1046493999,DE +1046494000,1046494191,GB +1046494192,1046494199,DE +1046494200,1046495127,GB +1046495128,1046495135,DE +1046495136,1046495415,GB +1046495416,1046495423,DE +1046495424,1046495607,GB +1046495608,1046495615,DE +1046495616,1046495719,GB +1046495720,1046495727,DE +1046495728,1046495767,GB +1046495768,1046495775,DE +1046495776,1046495911,GB +1046495912,1046495919,DE +1046495920,1046495983,GB +1046495984,1046495991,DE +1046495992,1046497807,GB +1046497808,1046497815,DE +1046497816,1046498135,GB +1046498136,1046498143,DE +1046498144,1046498215,GB +1046498216,1046498223,DE +1046498224,1046498303,GB +1046498304,1046498319,DE +1046498320,1046498687,GB +1046498688,1046498695,DE +1046498696,1046498799,GB +1046498800,1046498807,DE +1046498808,1046500735,GB +1046500736,1046500743,DE +1046500744,1046502106,GB +1046502107,1046502108,DE +1046502109,1046503095,GB +1046503096,1046503103,DE +1046503104,1046504447,GB +1046504448,1046508543,DE +1046508544,1046511815,GB +1046511816,1046511823,DE +1046511824,1046512583,GB +1046512584,1046512599,DE +1046512600,1046514687,GB +1046514688,1046515711,DE +1046515712,1046518359,GB +1046518360,1046518367,DE +1046518368,1046518911,GB +1046518912,1046518975,DE +1046518976,1046524215,GB +1046524216,1046524223,DE +1046524224,1046524487,GB +1046524488,1046524495,DE +1046524496,1046524615,GB +1046524616,1046524623,DE +1046524624,1046524647,GB +1046524648,1046524655,DE +1046524656,1046525351,GB +1046525352,1046525359,DE +1046525360,1046525439,GB +1046525440,1046525695,DE +1046525696,1046528335,GB +1046528336,1046528391,DE +1046528392,1046528505,GB +1046528506,1046528506,DE +1046528507,1046528535,GB +1046528536,1046528543,DE +1046528544,1046529023,GB +1046529024,1046530047,DE +1046530048,1046530973,GB +1046530974,1046530974,DE +1046530975,1046531839,GB +1046531840,1046532095,DE +1046532096,1046533375,GB +1046533376,1046533383,DE +1046533384,1046533537,GB +1046533538,1046533538,DE +1046533539,1046533615,GB +1046533616,1046533631,DE +1046533632,1046535447,GB +1046535448,1046535448,DE +1046535449,1046535623,GB +1046535624,1046535631,DE +1046535632,1046535665,GB +1046535666,1046535666,DE +1046535667,1046535967,GB +1046535968,1046535999,DE +1046536000,1046536063,GB +1046536064,1046536095,DE +1046536096,1046536511,GB +1046536512,1046536543,DE +1046536544,1046536631,GB +1046536632,1046536639,DE +1046536640,1046537023,GB +1046537024,1046537039,DE +1046537040,1046539615,GB +1046539616,1046539623,DE +1046539624,1046539887,GB +1046539888,1046539895,DE +1046539896,1046540527,GB +1046540528,1046540543,SE +1046540544,1046542807,GB +1046542808,1046542815,DE +1046542816,1046542831,GB +1046542832,1046542847,DE +1046542848,1046543209,GB +1046543210,1046543210,DE +1046543211,1046543343,GB +1046543344,1046543359,DE +1046543360,1046544383,GB +1046544384,1046560767,IT +1046560768,1046585343,ES +1046585344,1046609919,NO +1046609920,1046675455,IT +1046675456,1046708223,ES +1046708224,1046740991,AT +1046740992,1046757375,NL +1046757376,1046765567,IT +1046765568,1046773759,ES +1046773760,1046781951,FR +1046781952,1046791167,GB +1046791168,1046792191,IT +1046792192,1046792192,IN +1046792193,1046792447,US +1046792448,1046792448,IN +1046792449,1046793215,US +1046793216,1046794239,GB +1046794240,1046794495,MX +1046794496,1046795007,US +1046795008,1046796287,GB +1046796288,1046797311,US +1046797312,1046798335,GB +1046798336,1046806527,HU +1046806528,1046814719,IT +1046814720,1046822911,SE +1046822912,1046839295,IT +1046839296,1046847487,BA +1046847488,1046855679,ES +1046855680,1046872063,NO +1046896640,1046904831,GB +1046904832,1046908927,IR +1046908928,1046910975,SE +1046910976,1046913023,IT +1046913024,1046921215,NO +1046921216,1046929407,DE +1046929408,1046937599,FR +1046937600,1047003135,GR +1047003136,1047068671,DE +1047068672,1047085055,RU +1047085056,1047101439,GB +1047101440,1047109631,RU +1047109632,1047117823,GB +1047117824,1047134207,NL +1047134208,1047150591,FI +1047150592,1047158783,FR +1047158784,1047166975,RU +1047166976,1047199743,FR +1047199744,1047265279,DK +1047265280,1047273471,NL +1047273472,1047281663,DE +1047281664,1047289855,TR +1047289856,1047298047,RS +1047298048,1047300095,CH +1047300096,1047301119,GB +1047301120,1047306239,CH +1047306240,1047314431,PL +1047314432,1047322623,SE +1047322624,1047330815,IT +1047330816,1047339007,RU +1047339008,1047340863,SE +1047340864,1047340927,NO +1047340928,1047342879,SE +1047342880,1047342887,FI +1047342888,1047346431,SE +1047346432,1047346687,FI +1047346688,1047347199,SE +1047347200,1047363583,DE +1047363584,1047371775,CZ +1047371776,1047373559,RU +1047373560,1047373567,FI +1047373568,1047379967,RU +1047379968,1047396351,NL +1047396352,1047461887,IT +1047461888,1047494655,DE +1047494656,1047527423,PL +1047527424,1047529471,US +1047529472,1047530495,NL +1047530496,1047531007,GB +1047531008,1047533567,BE +1047533568,1047534847,DE +1047534848,1047535103,BE +1047535104,1047535359,US +1047535360,1047535615,BE +1047535616,1047551999,DE +1047552000,1047560191,RU +1047560192,1047563431,DE +1047563432,1047563435,CH +1047563436,1047565279,DE +1047565280,1047565311,CH +1047565312,1047565343,DE +1047565344,1047565359,CH +1047565360,1047565839,DE +1047565840,1047565887,CH +1047565888,1047566435,DE +1047566436,1047566439,CH +1047566440,1047566451,DE +1047566452,1047566459,CH +1047566460,1047566519,DE +1047566520,1047566527,CH +1047566528,1047566531,DE +1047566532,1047566535,CH +1047566536,1047566543,DE +1047566544,1047566547,CH +1047566548,1047566967,DE +1047566968,1047566971,CH +1047566972,1047567015,DE +1047567016,1047567019,CH +1047567020,1047567027,DE +1047567028,1047567031,CH +1047567032,1047567143,DE +1047567144,1047567147,CH +1047567148,1047567151,DE +1047567152,1047567159,CH +1047567160,1047567359,DE +1047567360,1047567375,CH +1047567376,1047567467,DE +1047567468,1047567471,CH +1047567472,1047567475,DE +1047567476,1047567483,CH +1047567484,1047567823,DE +1047567824,1047567839,CH +1047567840,1047567903,DE +1047567904,1047567935,CH +1047567936,1047568383,DE +1047568384,1047576575,NL +1047576576,1047584767,HU +1047584768,1047592959,NL +1047592960,1047601151,BA +1047601152,1047625727,RU +1047625728,1047633919,NO +1047633920,1047642111,FI +1047642112,1047658495,DE +1047658496,1047724031,EG +1047728128,1047732223,SE +1047735770,1047735770,DE +1047736552,1047736553,US +1047740544,1047740671,DE +1047758911,1047758911,CZ +1047759119,1047759119,AT +1047759125,1047759125,AT +1047759754,1047759754,FR +1047759834,1047759834,CZ +1047763266,1047763267,SE +1047781856,1047781871,DE +1047782690,1047782690,GB +1047787520,1047787775,ES +1047788288,1047788543,NL +1047789568,1047822335,AT +1047822336,1047838719,DE +1047838720,1047846911,DK +1047846912,1047855103,SE +1047855104,1047863295,DE +1047863296,1047871487,EG +1047871488,1047887871,RU +1047887872,1047920639,ES +1047920640,1047986175,RU +1047986176,1048051711,SE +1048051712,1048117247,SA +1048117248,1048125439,GB +1048125440,1048133631,FI +1048133632,1048150015,RO +1048150016,1048158207,PL +1048158208,1048166399,DK +1048166400,1048182783,CH +1048182784,1048184831,UA +1048184832,1048186879,FR +1048186880,1048188927,LV +1048193024,1048195071,US +1048195072,1048197119,RU +1048197120,1048201215,UA +1048203264,1048205311,DE +1048205312,1048209407,RU +1048209408,1048211455,UA +1048211456,1048215551,PL +1048215552,1048221695,RU +1048221696,1048223743,UA +1048223744,1048225791,DK +1048225792,1048227839,CZ +1048227840,1048233983,RU +1048233984,1048236031,UA +1048236032,1048238079,RU +1048242176,1048244223,PL +1048244224,1048246271,RU +1048246272,1048248319,NO +1048248320,1048313855,IT +1048313856,1048338431,GB +1048338432,1048346623,US +1048346624,1048510463,GB +1048510464,1048575999,SE +1048576000,1048584191,DE +1048584192,1048592383,IL +1048592384,1048600575,IT +1048600576,1048601599,UA +1048601600,1048602111,RU +1048602112,1048602623,PL +1048602624,1048603135,RU +1048603136,1048603391,UA +1048603392,1048603647,LV +1048603648,1048604944,UA +1048604945,1048604945,LT +1048604946,1048608767,UA +1048608768,1048616959,GB +1048616960,1048619007,US +1048619008,1048621055,GB +1048621056,1048621056,DE +1048621057,1048625151,US +1048625152,1048633343,GB +1048633344,1048641535,NO +1048641536,1048649727,FR +1048649728,1048657919,CZ +1048657920,1048674303,GB +1048674304,1048682495,NL +1048682496,1048690687,FR +1048690688,1048707071,PL +1048707072,1048772607,GB +1048772608,1048903679,NL +1048903680,1048911871,GB +1048920064,1048936447,NL +1048936448,1048944639,PL +1048944640,1048952831,RU +1048952832,1048969215,NL +1048979712,1048980223,DE +1048982888,1048982943,DE +1048987480,1048987487,DE +1048991960,1048991967,DE +1048992528,1048992535,DE +1048992608,1048992623,DE +1048992640,1048992703,DE +1049006080,1049006335,DE +1049008128,1049009151,DE +1049016320,1049022463,DE +1049026816,1049029375,DE +1049030656,1049031679,DE +1049031744,1049031871,DE +1049032094,1049032094,DE +1049034752,1049067519,EG +1049067520,1049100287,DK +1049100288,1049231359,GB +1049231360,1049235144,DE +1049235145,1049235145,FR +1049235146,1049266175,DE +1049266176,1049268223,ES +1049268224,1049296895,DE +1049296896,1049362431,EG +1049362432,1049366527,GB +1049366528,1049368575,DE +1049368576,1049368656,GB +1049368657,1049368657,DE +1049368658,1049369983,GB +1049369984,1049370047,DE +1049370048,1049370623,GB +1049370624,1049378815,AT +1049378816,1049395199,EG +1049395200,1049411583,NL +1049411584,1049419775,GB +1049419776,1049423615,RU +1049423616,1049423856,UA +1049423857,1049423857,RU +1049423858,1049423871,UA +1049423872,1049427967,RU +1049427968,1049436159,CZ +1049436160,1049444351,DE +1049444352,1049460735,RU +1049460736,1049468927,NO +1049468928,1049477119,DE +1049477120,1049493503,PL +1049493504,1049559039,FI +1049559040,1049698303,DE +1049698304,1049700351,NL +1049700352,1049702399,DE +1049702400,1049706495,NL +1049706496,1049722879,GB +1049722880,1049731071,IS +1049731072,1049739263,FI +1049739264,1049755647,NL +1049755648,1049794559,DE +1049794560,1049795583,CH +1049795584,1049821183,DE +1049821184,1049886719,FR +1049886720,1049894911,RU +1049894912,1049903103,NO +1049903104,1049911295,PL +1049911296,1049919487,FI +1049919488,1049927679,RU +1049927680,1049935871,NL +1049935872,1049944063,FI +1049944064,1049952255,RU +1049952256,1049960447,UA +1049960448,1049968639,GB +1049968640,1049985023,SA +1049985024,1050017791,IT +1050017792,1050083327,KW +1050083328,1050128383,ES +1050128384,1050130431,US +1050130432,1050148863,ES +1050148864,1050157055,CY +1050157056,1050173439,RU +1050173440,1050181631,IT +1050181632,1050189823,PL +1050189824,1050198015,DE +1050198016,1050206207,RU +1050206208,1050214399,SK +1050214400,1050470911,DE +1050470912,1050471031,GB +1050471032,1050471039,DE +1050471040,1050471167,GB +1050471168,1050673151,DE +1050673152,1050804223,FR +1050804224,1050869759,MK +1050869760,1050935295,NL +1050938112,1050938623,ES +1050938880,1050939135,ES +1050939136,1050939647,BR +1050939648,1050940159,MX +1050940160,1050940671,GB +1050940672,1050940927,HK +1050941696,1050941951,DE +1050941952,1050942207,US +1050942464,1050942719,US +1050942720,1050942975,BR +1050943232,1050943487,ES +1050945536,1050945791,ES +1050948608,1050948863,ES +1050959872,1050961919,ES +1050961920,1050962943,MX +1050962944,1050963967,GB +1050963968,1050964991,ES +1050968064,1051000831,GB +1051000832,1051017215,RU +1051017216,1051033599,NL +1051033600,1051049983,FI +1051049984,1051066367,HU +1051066368,1051115519,NL +1051115520,1051117055,BE +1051117056,1051117567,NL +1051117568,1051123711,BE +1051123712,1051125471,NL +1051125472,1051125479,BE +1051125480,1051131903,NL +1051131904,1051197439,CH +1051197440,1051213823,CZ +1051213824,1051230207,SK +1051230208,1051238399,SE +1051238400,1051246591,GE +1051246592,1051254783,DE +1051254784,1051262975,RU +1051262976,1051271167,DE +1051271168,1051279359,IT +1051279360,1051295743,PT +1051295744,1051303935,GB +1051303936,1051312127,SK +1051312128,1051328511,GR +1051328512,1051394047,IT +1051394048,1051525119,GB +1051525120,1051533311,MT +1051533312,1051541503,NG +1051541504,1051557887,GB +1051557888,1051566079,RU +1051566080,1051574271,IT +1051574272,1051590655,GB +1051590656,1051721727,ES +1051721728,1051729919,RU +1051729920,1051738111,FI +1051738112,1051754495,BG +1051754496,1051762687,DE +1051762688,1051770879,SK +1051770880,1051779071,NO +1051779072,1051787263,DE +1051787264,1051795455,IT +1051795456,1051803647,RU +1051803648,1051820031,CZ +1051820032,1051852799,NL +1051852800,1051918335,AT +1051918336,1051922431,PL +1051922432,1051924479,CH +1051924480,1051948031,NL +1051948032,1051949055,CH +1051949056,1051983871,NL +1051984664,1051984671,DE +1051984752,1051984767,DE +1051990016,1051991039,DE +1052001280,1052002303,DE +1052011264,1052012287,DE +1052017536,1052017567,DE +1052041216,1052041471,DE +1052043216,1052043231,DE +1052045312,1052046079,DE +1052049408,1052057599,PL +1052057600,1052065791,RU +1052065792,1052082175,SE +1052082176,1052090367,DE +1052090368,1052098559,PL +1052098560,1052116991,SE +1052116992,1052119039,RU +1052119040,1052121087,GB +1052121088,1052125183,RU +1052127232,1052129279,RU +1052129280,1052131327,BE +1052131328,1052133375,UA +1052133376,1052135423,RU +1052135424,1052137471,UA +1052137472,1052139519,RU +1052141056,1052141567,DE +1052141568,1052143615,PL +1052143616,1052145663,BG +1052145664,1052147711,UA +1052147712,1052151807,RU +1052151808,1052153855,PL +1052155904,1052157951,UA +1052157952,1052159999,DK +1052160000,1052162047,LU +1052162048,1052164095,CH +1052164096,1052168191,RU +1052168192,1052170239,PL +1052170240,1052172287,SE +1052172288,1052174335,PL +1052174336,1052176383,CZ +1052176384,1052178943,NL +1052178944,1052180479,DK +1052180480,1052213247,RU +1052213248,1052246015,FI +1052246016,1052247039,DE +1052247040,1052247295,FR +1052247296,1052247359,DE +1052247360,1052247391,FR +1052247392,1052247407,DE +1052247408,1052247415,GB +1052247416,1052247423,NL +1052247424,1052247551,GB +1052247552,1052248095,DE +1052248096,1052248127,ZA +1052248128,1052248135,FR +1052248136,1052248143,DE +1052248144,1052248159,BE +1052248160,1052249375,DE +1052249376,1052249407,IT +1052249408,1052249471,DE +1052249472,1052249503,ZA +1052249504,1052250655,DE +1052250656,1052250687,GB +1052250688,1052250719,IL +1052250720,1052250735,IT +1052250736,1052250751,NL +1052250752,1052252863,DE +1052252864,1052252879,GB +1052252880,1052252895,ZA +1052252896,1052252927,IT +1052252928,1052254207,DE +1052254208,1052255255,NL +1052255256,1052255263,GB +1052255264,1052255871,NL +1052255872,1052255935,GB +1052255936,1052257279,NL +1052257280,1052257791,FR +1052257792,1052258303,AT +1052258304,1052260623,FR +1052260624,1052260631,ZA +1052260632,1052260639,AT +1052260640,1052260735,FR +1052260736,1052260863,NL +1052260864,1052260895,TR +1052260896,1052261055,FR +1052261056,1052261119,NL +1052261120,1052262399,FR +1052262400,1052263423,DK +1052263424,1052263935,DE +1052263936,1052264447,DK +1052264448,1052264639,SE +1052264640,1052264703,IT +1052264704,1052265471,SE +1052265472,1052265519,IT +1052265520,1052265535,GB +1052265536,1052265599,DE +1052265600,1052265983,IT +1052265984,1052266239,DE +1052266240,1052266495,GB +1052266496,1052268543,BE +1052268544,1052268607,ZA +1052268608,1052268671,BE +1052268672,1052268703,IT +1052268704,1052268719,ZA +1052268720,1052268735,NL +1052268736,1052268799,DE +1052268800,1052270591,ZA +1052270592,1052271871,FR +1052271872,1052272127,BE +1052272128,1052272543,FR +1052272544,1052272575,AT +1052272576,1052272639,SE +1052272640,1052274175,FR +1052274176,1052274687,ZA +1052274688,1052274943,ES +1052274944,1052275199,IT +1052275200,1052275711,AT +1052275712,1052276735,GB +1052276736,1052278207,IT +1052278208,1052278271,GB +1052278272,1052278783,IT +1052278784,1052278823,CH +1052278824,1052278831,GB +1052278832,1052278847,AT +1052278848,1052278863,ZA +1052278864,1052278879,NL +1052278880,1052284607,GB +1052284672,1052286975,GB +1052286976,1052287487,CH +1052287488,1052288255,SE +1052288288,1052288295,IL +1052288296,1052288303,BE +1052288304,1052288319,AT +1052288384,1052288511,FR +1052288512,1052289023,AT +1052289024,1052289151,GB +1052289152,1052289183,CH +1052289184,1052289215,DE +1052289216,1052289279,GB +1052289536,1052290047,GB +1052290048,1052290063,CH +1052290064,1052290303,GB +1052290368,1052290399,CH +1052290400,1052290431,ZA +1052290432,1052290559,FR +1052290560,1052290575,GB +1052290576,1052290591,BE +1052290592,1052290639,GB +1052290640,1052290655,ZA +1052290656,1052290687,DE +1052290688,1052290815,GB +1052290816,1052290831,CH +1052290832,1052291327,GB +1052291328,1052291583,CH +1052291584,1052291679,FI +1052291680,1052291687,TR +1052291688,1052291695,GB +1052291696,1052291711,CH +1052291712,1052292095,FR +1052292096,1052299263,GB +1052299776,1052303359,GB +1052303360,1052307455,DE +1052307456,1052309247,CH +1052309248,1052309503,NO +1052309504,1052310527,CH +1052310528,1052310783,FR +1052310784,1052311039,AT +1052311040,1052311551,GB +1052311552,1052311615,DE +1052311616,1052311679,BE +1052311680,1052311871,DE +1052311872,1052311895,BE +1052311896,1052311903,NL +1052311904,1052311935,IT +1052311936,1052311967,GB +1052311968,1052311999,DE +1052312000,1052312063,CH +1052312064,1052312767,DE +1052312832,1052312895,DE +1052312896,1052312903,CH +1052312904,1052312911,ES +1052312912,1052312927,CH +1052312928,1052313087,GB +1052313088,1052314751,DE +1052314752,1052314815,ES +1052314816,1052314823,GB +1052314824,1052314831,ES +1052314832,1052314847,IT +1052314848,1052315071,DE +1052315072,1052315103,IT +1052315104,1052315135,AT +1052315136,1052315551,DE +1052315552,1052315583,ES +1052315584,1052315647,GB +1052315648,1052316319,DE +1052316320,1052316335,NL +1052316336,1052316767,DE +1052316768,1052316799,IT +1052316800,1052316927,DE +1052317184,1052317599,DE +1052317600,1052317607,BE +1052317608,1052317615,DE +1052317616,1052317631,GB +1052317632,1052317663,IT +1052317664,1052318047,DE +1052318048,1052318079,ES +1052318080,1052318207,SE +1052318208,1052318719,DE +1052319232,1052319743,DE +1052320000,1052320079,GB +1052320080,1052320087,CZ +1052320088,1052320095,GB +1052320096,1052320127,ZA +1052320128,1052320255,BE +1052320256,1052322239,GB +1052322240,1052322303,CH +1052322304,1052323871,GB +1052323872,1052323903,CH +1052323904,1052324927,GB +1052324928,1052324943,ZA +1052324944,1052324959,NL +1052324960,1052324991,ES +1052324992,1052325191,GB +1052325192,1052325199,DE +1052325200,1052325215,AT +1052325216,1052325247,ZA +1052325248,1052325311,GB +1052325312,1052325375,NL +1052325376,1052325567,GB +1052325568,1052325631,ZA +1052325632,1052327935,GB +1052327936,1052328223,CH +1052328224,1052328255,IT +1052328256,1052328319,ES +1052328320,1052328447,DE +1052328448,1052328639,CH +1052328640,1052328671,ZA +1052328672,1052328703,ES +1052328704,1052329983,CH +1052329984,1052330239,DE +1052330240,1052331167,CH +1052331168,1052331183,GB +1052331184,1052331199,CH +1052331200,1052331263,GB +1052331264,1052331615,CH +1052331616,1052331647,AT +1052331648,1052331711,CH +1052331712,1052331743,GB +1052331744,1052332031,CH +1052332032,1052333103,IT +1052333104,1052333119,CH +1052333120,1052333183,FR +1052333184,1052333311,ZA +1052333568,1052334751,IT +1052334752,1052334759,NL +1052334760,1052334767,ZA +1052334768,1052334815,GB +1052334816,1052334847,ZA +1052334848,1052335423,IT +1052335424,1052335455,NL +1052335456,1052335519,ES +1052335520,1052335535,ZA +1052335536,1052335551,DE +1052335552,1052335615,AT +1052335616,1052336127,BE +1052336128,1052336255,FR +1052336256,1052336383,GB +1052336384,1052337343,FR +1052337344,1052337375,DE +1052337376,1052337759,FR +1052337760,1052337887,GB +1052337888,1052337903,ZA +1052337904,1052337911,NL +1052337912,1052337919,ZA +1052337920,1052340111,FR +1052340112,1052340127,ES +1052340128,1052340135,NL +1052340136,1052340223,FR +1052340224,1052340527,AT +1052340528,1052340543,BE +1052340544,1052340575,IT +1052340576,1052340607,NL +1052340608,1052340671,HU +1052340672,1052340703,GB +1052340704,1052340719,ZA +1052340720,1052340735,GB +1052340736,1052340767,AT +1052340768,1052340799,DE +1052340800,1052340863,GB +1052340864,1052341247,AT +1052341248,1052341503,DE +1052341504,1052342271,AT +1052342272,1052342303,SE +1052342304,1052342335,CH +1052342336,1052342463,SE +1052342464,1052342471,ZA +1052342472,1052342479,GB +1052342480,1052342495,ZA +1052342496,1052342527,FR +1052342528,1052343647,CH +1052343648,1052343655,NL +1052343656,1052343663,GB +1052343664,1052343679,DE +1052343680,1052344319,CH +1052344320,1052344863,NL +1052344864,1052344895,ES +1052344896,1052344959,IT +1052344960,1052345087,CH +1052345088,1052345135,NL +1052345136,1052345151,GB +1052345152,1052345247,FR +1052345248,1052345279,IT +1052345280,1052345343,DE +1052345344,1052345471,NL +1052345488,1052345503,NL +1052345504,1052345535,ZA +1052345536,1052345551,AT +1052345552,1052345567,GB +1052345568,1052345631,NL +1052345632,1052345663,IT +1052345664,1052345695,HU +1052345696,1052345727,PT +1052345728,1052345855,AT +1052345856,1052346903,NL +1052346904,1052346911,BE +1052346912,1052346943,ZA +1052346944,1052347007,ES +1052347008,1052347135,DE +1052347136,1052347391,NL +1052347392,1052348415,CH +1052348416,1052348799,GB +1052348800,1052348831,DE +1052348832,1052348863,CH +1052348864,1052348879,DE +1052348880,1052348895,GB +1052348896,1052348927,DE +1052348928,1052349055,GB +1052349120,1052349151,BE +1052349152,1052349343,GB +1052349344,1052349375,DE +1052349376,1052349407,GB +1052349408,1052349439,ZA +1052349440,1052352559,GB +1052352560,1052352591,ZA +1052352592,1052352607,GB +1052352640,1052352703,GB +1052352704,1052352767,DE +1052352768,1052352927,GB +1052352928,1052352959,IT +1052352960,1052352991,ES +1052352992,1052353023,BE +1052353024,1052353279,IT +1052353280,1052353407,DE +1052353536,1052354111,DE +1052354112,1052354175,TR +1052354176,1052354559,DE +1052354560,1052356607,GB +1052356608,1052356703,ZA +1052356704,1052356735,ES +1052356736,1052356799,RU +1052356800,1052356863,IE +1052356864,1052358479,ZA +1052358480,1052358495,GB +1052358496,1052358511,AT +1052358512,1052358527,ZA +1052358528,1052358655,DE +1052358656,1052359839,ZA +1052359840,1052359871,IE +1052359872,1052359935,IT +1052359936,1052360735,ZA +1052360736,1052360743,GB +1052360744,1052360767,ZA +1052360768,1052360783,DE +1052360784,1052360831,IT +1052360832,1052360959,GB +1052360960,1052360991,FR +1052360992,1052361023,BE +1052361024,1052361039,ZA +1052361040,1052361055,NL +1052361056,1052361087,DE +1052361088,1052361151,ES +1052361152,1052361215,GB +1052361216,1052361471,ZA +1052361472,1052361647,BE +1052361648,1052361655,GB +1052361656,1052361663,DE +1052361664,1052361695,BE +1052361696,1052361727,CH +1052361728,1052361919,IT +1052361920,1052361951,ZA +1052361952,1052361967,IT +1052361968,1052361983,ZA +1052361984,1052362239,IT +1052362240,1052362751,DK +1052362752,1052362783,ES +1052362784,1052362815,GB +1052362816,1052362879,CH +1052362880,1052363039,ES +1052363072,1052363135,GB +1052363136,1052363263,ES +1052363264,1052364543,DE +1052364544,1052364671,BE +1052364672,1052364687,DE +1052364688,1052364695,GB +1052364696,1052364703,NL +1052364704,1052364799,GB +1052364800,1052366207,BE +1052366208,1052366271,IE +1052366272,1052366335,GB +1052366336,1052366655,BE +1052366656,1052366719,DE +1052366720,1052367871,BE +1052367872,1052368895,DK +1052368896,1052369023,IE +1052369024,1052369039,IT +1052369040,1052369055,DE +1052369056,1052369087,ZA +1052369088,1052369151,IT +1052369152,1052369407,IE +1052369408,1052369663,HU +1052369664,1052369855,CZ +1052369888,1052369919,CZ +1052369920,1052370175,NO +1052370176,1052370431,DK +1052370432,1052370559,SE +1052370560,1052370623,DE +1052370624,1052370687,IT +1052370688,1052370943,DK +1052370944,1052372255,GB +1052372256,1052372287,ZA +1052372288,1052372351,FI +1052372352,1052374015,GB +1052374016,1052375039,CH +1052375040,1052375551,DE +1052375680,1052375711,DE +1052375712,1052375807,FR +1052375808,1052376063,DE +1052376320,1052376831,DE +1052376832,1052377087,ES +1052377088,1052377535,DE +1052377536,1052377599,NO +1052377600,1052377743,FR +1052377744,1052377759,NL +1052377760,1052377791,ZA +1052377792,1052377855,GB +1052377856,1052377871,DE +1052377872,1052377887,CH +1052377920,1052377951,DE +1052377952,1052377983,FR +1052377984,1052378047,GB +1052378048,1052378079,FR +1052378080,1052378111,NL +1052378112,1052378983,DE +1052378984,1052378991,NO +1052378992,1052379031,GB +1052379032,1052379039,DE +1052379040,1052379103,GB +1052379104,1052379135,SE +1052379392,1052379791,DE +1052379792,1052379799,GB +1052379800,1052379807,NL +1052379808,1052379839,DE +1052379840,1052379903,ZA +1052379904,1052380063,GB +1052380064,1052380127,DE +1052380128,1052380159,NL +1052380160,1052381183,DE +1052381440,1052382623,DE +1052382656,1052382719,ES +1052382720,1052382975,DE +1052382976,1052383999,GB +1052384000,1052384255,NL +1052384256,1052385279,GB +1052385280,1052385535,DE +1052385536,1052385615,GB +1052385616,1052385631,ZA +1052385632,1052385695,GB +1052385696,1052385791,FR +1052385792,1052388863,GB +1052388864,1052389119,NL +1052389120,1052390431,GB +1052390432,1052390447,ZA +1052390448,1052390455,GB +1052390456,1052390463,IT +1052390464,1052393471,GB +1052393472,1052393599,CH +1052393600,1052393695,FR +1052393696,1052394271,CH +1052394272,1052394303,ZA +1052394304,1052394367,GB +1052394368,1052395263,CH +1052395264,1052395679,GB +1052395680,1052395743,DE +1052395744,1052395775,ES +1052395776,1052396031,NL +1052396032,1052396543,CH +1052396544,1052396607,SE +1052396608,1052396671,BE +1052396672,1052396799,SE +1052396800,1052396863,TR +1052396864,1052396927,RO +1052396928,1052397439,HU +1052397568,1052399039,IT +1052399040,1052399103,NO +1052399104,1052399903,IT +1052399904,1052399919,DE +1052399920,1052399927,NL +1052399928,1052399935,FR +1052399936,1052399999,IT +1052400000,1052400127,BE +1052400128,1052401151,IT +1052401152,1052401279,BE +1052401280,1052401311,IT +1052401312,1052401343,AT +1052401344,1052401407,ZA +1052401408,1052401599,BE +1052401600,1052401631,GB +1052401632,1052401663,RU +1052401664,1052402047,FR +1052402048,1052402175,NL +1052402176,1052402271,FR +1052402272,1052402303,IT +1052402304,1052402367,GB +1052402368,1052403359,FR +1052403360,1052403391,DE +1052403392,1052403407,IT +1052403408,1052403415,GB +1052403416,1052403423,NL +1052403424,1052403455,RO +1052403456,1052403727,FR +1052403728,1052403743,NL +1052403744,1052403775,FR +1052403776,1052403807,ZA +1052403840,1052403967,CH +1052403968,1052404383,FR +1052404384,1052404399,ZA +1052404400,1052404447,FR +1052404448,1052404479,GB +1052404480,1052404767,FR +1052404768,1052404783,ZA +1052404784,1052404799,GB +1052404800,1052404863,FR +1052404864,1052404991,GB +1052404992,1052405759,FR +1052405760,1052407519,AT +1052407520,1052407535,FR +1052407536,1052407551,SE +1052407552,1052407839,AT +1052407840,1052407871,ZA +1052407872,1052407887,DE +1052407888,1052407903,ZA +1052407904,1052407935,DE +1052407936,1052408159,AT +1052408160,1052408383,GB +1052408384,1052408447,BE +1052408448,1052408511,FR +1052408512,1052408575,GB +1052408576,1052408831,AT +1052408832,1052409855,GB +1052409856,1052409863,NL +1052409864,1052409871,DE +1052409872,1052409951,NL +1052409952,1052409983,BE +1052409984,1052410047,GB +1052410048,1052410111,BE +1052411136,1052412327,NL +1052412336,1052412343,NL +1052412344,1052412351,GB +1052412352,1052412415,CH +1052412672,1052412831,NL +1052412832,1052412863,DE +1052412864,1052413951,NL +1052413952,1052414335,CZ +1052414464,1052414975,IE +1052414976,1052415999,BE +1052416000,1052416575,DE +1052416576,1052416639,ZA +1052416640,1052416671,GB +1052416672,1052416703,DE +1052416704,1052416735,IT +1052416736,1052416767,DE +1052416768,1052417071,NO +1052417072,1052417087,DE +1052417088,1052417119,AT +1052417120,1052417151,IT +1052417152,1052417279,GB +1052417280,1052417359,NO +1052417368,1052417535,NO +1052417536,1052418047,ZA +1052418048,1052419583,BE +1052419584,1052420031,IT +1052420064,1052420095,IT +1052420096,1052420735,GB +1052420736,1052420767,DE +1052420768,1052420783,GB +1052420784,1052420799,ZA +1052420800,1052420863,DE +1052420864,1052422143,GB +1052422144,1052422847,ZA +1052422848,1052422863,SE +1052422864,1052422879,FR +1052422880,1052423199,ZA +1052423200,1052423231,CH +1052423232,1052423295,ZA +1052423304,1052423311,CH +1052423360,1052423423,NL +1052423424,1052423967,ZA +1052424000,1052424799,ZA +1052424800,1052424815,GB +1052424816,1052424823,ES +1052424824,1052424831,BE +1052424832,1052424959,GB +1052424960,1052425151,ZA +1052425152,1052425215,BE +1052425216,1052426239,ZA +1052426240,1052426319,PT +1052426328,1052426495,PT +1052426512,1052426527,FR +1052426752,1052427263,NL +1052427264,1052427839,CH +1052427840,1052427855,GB +1052427856,1052427871,IT +1052427872,1052427903,AT +1052427904,1052427967,DE +1052427968,1052428031,GB +1052428032,1052428287,CH +1052428288,1052428479,ES +1052428480,1052428543,BE +1052428544,1052429407,ES +1052429408,1052429439,FR +1052429440,1052429567,BE +1052429568,1052429759,ES +1052429760,1052429823,DE +1052429824,1052430335,ES +1052430336,1052430407,BE +1052430408,1052430415,ZA +1052430416,1052430431,FR +1052430432,1052430463,DE +1052430464,1052430527,BE +1052430528,1052430591,DE +1052430592,1052433407,BE +1052433408,1052433719,DK +1052433720,1052433727,FR +1052433728,1052433919,DK +1052433920,1052434431,ZA +1052434432,1052434751,GB +1052434752,1052434783,NO +1052434784,1052435455,GB +1052435456,1052435647,NL +1052435680,1052436479,NL +1052436480,1052437023,DE +1052437024,1052437055,ZA +1052437056,1052437119,DE +1052437120,1052437135,ZA +1052437136,1052437151,DE +1052437152,1052437183,GB +1052437184,1052437247,ZA +1052437248,1052437759,DE +1052437760,1052438015,CH +1052438016,1052438399,BE +1052438528,1052439503,AT +1052439520,1052439551,AT +1052439552,1052440575,FR +1052440576,1052441343,DE +1052441600,1052442623,GB +1052442624,1052443647,DE +1052446208,1052446719,DE +1052446720,1052447743,CZ +1052447744,1052447871,PL +1052448000,1052448127,PL +1052448256,1052450815,ZA +1052450816,1052451839,DE +1052451840,1052452159,NO +1052452224,1052452351,NO +1052452352,1052452831,ES +1052452832,1052452847,GB +1052452848,1052452863,FR +1052452992,1052452999,SK +1052453120,1052453375,FR +1052453376,1052453887,AT +1052453888,1052454911,GB +1052454912,1052454943,FR +1052454944,1052454959,NL +1052454976,1052455359,NL +1052455424,1052455935,GB +1052455936,1052456447,NL +1052456448,1052456959,CH +1052456960,1052457983,NL +1052457984,1052458367,AT +1052458432,1052458495,AT +1052458496,1052458847,NL +1052458848,1052458863,FR +1052458864,1052458871,NL +1052458872,1052458879,FR +1052458880,1052460031,GB +1052460032,1052460127,NO +1052460224,1052460287,FR +1052460544,1052460799,NO +1052460800,1052461055,DE +1052461056,1052461295,FR +1052461296,1052461311,BE +1052461312,1052461951,FR +1052461968,1052463103,FR +1052463104,1052463615,ES +1052463616,1052464639,GB +1052464640,1052464927,ES +1052464960,1052465087,ES +1052465152,1052465375,ZA +1052465408,1052465663,ZA +1052466432,1052468223,FR +1052468224,1052469247,GB +1052469248,1052470271,FR +1052470272,1052470783,ZA +1052470784,1052471007,FR +1052471040,1052471295,BE +1052471296,1052472319,GB +1052472448,1052472511,GB +1052472576,1052475231,GB +1052475240,1052475255,GB +1052475264,1052475391,GB +1052475392,1052476383,FR +1052476416,1052479487,FR +1052479488,1052479743,NL +1052479744,1052479999,DE +1052480000,1052483583,NL +1052483584,1052483999,IT +1052484032,1052485279,IT +1052485312,1052485631,IT +1052485632,1052486655,GB +1052486656,1052486911,CH +1052486912,1052486975,DE +1052486976,1052487039,FR +1052487040,1052487167,DE +1052487168,1052487423,GB +1052487424,1052487679,AT +1052487680,1052488703,CH +1052488704,1052489727,GB +1052489728,1052490239,IE +1052490240,1052490751,SE +1052490752,1052491679,AT +1052491688,1052491775,AT +1052491776,1052493567,BE +1052493696,1052494335,BE +1052494336,1052494591,NL +1052494592,1052495439,BE +1052495440,1052495487,FR +1052495488,1052495551,BE +1052495552,1052495583,GB +1052495584,1052495871,BE +1052495872,1052495879,UA +1052496128,1052497407,DE +1052497664,1052497919,DE +1052497920,1052498431,ES +1052498432,1052498495,RO +1052498944,1052499455,GB +1052499968,1052500191,DK +1052500208,1052500319,DK +1052500480,1052500991,GB +1052500992,1052501023,FI +1052501032,1052501039,FI +1052501120,1052501247,FI +1052501504,1052502015,CH +1052502016,1052502783,IE +1052502816,1052502847,IE +1052503040,1052504319,GB +1052504320,1052504351,BY +1052504384,1052507583,GB +1052507648,1052507775,GB +1052507904,1052704767,GB +1052704768,1052712959,NL +1052712960,1052770303,GB +1052770304,1052778495,CH +1052778496,1052786687,RU +1052786688,1052789759,GR +1052789760,1052803071,NL +1052803072,1052806655,DE +1052806656,1052807167,MW +1052807168,1052811263,DE +1052811264,1052819455,RU +1052819456,1052827647,DE +1052827648,1052835839,RU +1052835840,1052844031,IR +1052844032,1052852223,FR +1052852224,1052868607,EG +1052868608,1052876799,RS +1052884992,1052901375,FR +1052901376,1053032447,NL +1053032448,1053097983,IT +1053097984,1053106175,DE +1053106176,1053114367,GB +1053114368,1053130751,BE +1053130752,1053138943,NL +1053138944,1053147135,FI +1053147136,1053163519,SK +1053163520,1053294591,DK +1053294616,1053294623,AT +1053294656,1053294679,AT +1053295104,1053296639,AT +1053296896,1053297023,IT +1053297152,1053297663,IT +1053301056,1053301071,FR +1053302780,1053302783,FR +1053302784,1053303807,GB +1053310144,1053310207,SK +1053312872,1053312887,DK +1053312912,1053312927,DK +1053318912,1053318943,FI +1053325824,1053326335,DE +1053326504,1053326527,BE +1053326544,1053326551,BE +1053326556,1053326559,BE +1053329440,1053329471,ES +1053329516,1053329535,ES +1053332992,1053334015,BE +1053335552,1053336575,ZA +1053349376,1053349631,NL +1053349952,1053349967,IE +1053350408,1053350415,BE +1053350492,1053350495,BE +1053350500,1053350503,BE +1053350508,1053350515,BE +1053353408,1053353423,GB +1053360128,1053364223,ES +1053364224,1053368319,CZ +1053368320,1053376511,SE +1053376512,1053392895,HU +1053392896,1053401087,FR +1053401088,1053409279,DE +1053409280,1053425663,IQ +1053425664,1053556735,CH +1053556736,1053564927,FI +1053564928,1053573119,GB +1053573120,1053581311,NL +1053581312,1053589503,CH +1053589504,1053597695,BG +1053597696,1053605887,DE +1053605888,1053614079,ES +1053614080,1053622271,CZ +1053622272,1053630463,IT +1053630464,1053638655,GR +1053638656,1053655039,BE +1053655040,1053663231,UA +1053663232,1053671423,RU +1053671424,1053687807,LV +1053687808,1053753343,DE +1053753344,1053818879,NL +1053818880,1053819391,DE +1053819424,1053819439,DE +1053819520,1053819563,DE +1053819584,1053819647,DE +1053820160,1053820927,DE +1053821440,1053821447,GB +1053821568,1053821695,GB +1053824000,1053824007,DE +1053824016,1053824023,DE +1053824064,1053824095,DE +1053824128,1053824255,NL +1053825024,1053825791,ES +1053825792,1053825919,GB +1053825920,1053826047,ES +1053826816,1053827327,DE +1053827328,1053827583,BE +1053828096,1053829119,GB +1053831168,1053831423,DE +1053834944,1053834975,DE +1053835264,1053835775,DE +1053837440,1053837455,GB +1053837568,1053838335,GB +1053838336,1053838591,DE +1053839360,1053840383,DE +1053840400,1053840415,DE +1053840448,1053840511,DE +1053843200,1053843231,DK +1053843232,1053843455,GB +1053843712,1053843967,DE +1053843968,1053844223,GB +1053844224,1053844479,DE +1053844992,1053845503,DE +1053845728,1053845735,DE +1053846016,1053846527,DE +1053846784,1053847551,DE +1053847552,1053849599,GB +1053849600,1053850367,DE +1053851136,1053851647,DE +1053851904,1053851919,FR +1053852032,1053852047,IT +1053852112,1053852127,GB +1053852128,1053852159,DE +1053855744,1053859839,GB +1053859840,1053860863,DE +1053862848,1053862879,DE +1053863424,1053864959,DE +1053865216,1053865727,DE +1053865728,1053865759,US +1053865984,1053866239,DE +1053866240,1053866495,ES +1053866496,1053866823,DE +1053866832,1053866847,DE +1053867520,1053867775,DE +1053867976,1053867999,DE +1053868008,1053868015,DE +1053868032,1053868383,ES +1053868416,1053868447,ES +1053868448,1053868455,GB +1053868456,1053868479,ES +1053868480,1053868543,FR +1053868800,1053869567,DE +1053870080,1053870335,DE +1053870336,1053870591,GB +1053870848,1053871359,DE +1053871616,1053871871,DE +1053872384,1053872447,DE +1053872512,1053872639,FR +1053872896,1053873663,DE +1053876224,1053876479,DE +1053876480,1053876735,GB +1053876736,1053876991,DE +1053877248,1053878271,DE +1053878272,1053878783,GB +1053878784,1053879047,DE +1053879056,1053879071,DE +1053879104,1053879167,GB +1053879296,1053882111,DE +1053882368,1053882879,DE +1053882880,1053883391,GB +1053883392,1053884415,DE +1053884416,1053892607,BH +1053892608,1053900799,DE +1053900800,1053917183,NO +1053917184,1053925375,UZ +1053925376,1053927159,SE +1053927160,1053927199,FI +1053927200,1053933567,SE +1053933568,1053949951,CZ +1053949952,1053968188,FR +1053968189,1053968189,PT +1053968190,1053985279,FR +1053985280,1053985390,GB +1053985391,1053985391,FR +1053985392,1053985535,GB +1053985536,1054015487,FR +1054015488,1054089215,IT +1054089216,1054097407,GE +1054097408,1054105599,NL +1054105600,1054113791,FR +1054113792,1054121983,NL +1054121984,1054130175,AT +1054130176,1054138367,LT +1054138368,1054146559,AZ +1054146560,1054179327,RU +1054179328,1054180351,GB +1054180352,1054181120,DE +1054181121,1054181375,GB +1054181376,1054185216,DE +1054185217,1054185471,GB +1054185472,1054186240,DE +1054186241,1054186495,GB +1054186496,1054187264,DE +1054187265,1054187519,GB +1054187520,1054195711,FR +1054195712,1054212095,BE +1054212096,1054277631,DE +1054277632,1054343167,KW +1054343168,1054351359,NL +1054351360,1054359551,UA +1054359552,1054367743,RO +1054367744,1054375935,FI +1054375936,1054381571,GB +1054381572,1054381572,SG +1054381573,1054381587,GB +1054381588,1054381588,HK +1054381589,1054381619,GB +1054381620,1054381620,US +1054381621,1054384127,GB +1054384128,1054400511,DE +1054400512,1054408703,GB +1054408704,1054416895,FR +1054416896,1054425087,DE +1054425088,1054441471,GR +1054441472,1054449663,AZ +1054449664,1054457855,RU +1054457856,1054474239,RO +1054474240,1054539775,AT +1054539776,1054605311,IL +1054605312,1054613503,DE +1054613504,1054621695,RU +1054621696,1054629887,IT +1054629888,1054638079,IR +1054638080,1054646271,CH +1054646272,1054654463,SE +1054654464,1054662655,MK +1054662656,1054670847,FI +1054670848,1054671103,GB +1054671168,1054671231,IE +1054671372,1054671375,IE +1054671416,1054671423,IE +1054671432,1054671439,IE +1054672160,1054672175,IE +1054672256,1054672271,IE +1054672320,1054672335,US +1054672336,1054672367,IE +1054672384,1054672447,IE +1054672720,1054672727,IE +1054672744,1054672767,IE +1054672776,1054672783,IE +1054672792,1054672807,IE +1054673664,1054673727,IE +1054673856,1054673919,IE +1054673952,1054674047,IE +1054674080,1054674111,IE +1054674456,1054674471,IE +1054674480,1054674495,IE +1054674504,1054674511,IE +1054674520,1054674527,GB +1054674688,1054675199,IE +1054675456,1054675711,IE +1054675968,1054676223,US +1054679040,1054687231,UA +1054687232,1054703615,MD +1054703616,1054711807,BG +1054711808,1054719999,IT +1054720000,1054728191,NL +1054728192,1054728447,ES +1054728448,1054728703,IE +1054728704,1054728959,FR +1054728960,1054729215,IE +1054729216,1054729471,ES +1054729472,1054867455,NL +1054867456,1055129599,DE +1055129600,1055195135,CY +1055195136,1055203327,CH +1055211520,1055219711,PT +1055219712,1055223807,NL +1055223808,1055225855,LU +1055225856,1055227903,ES +1055232000,1055236095,NL +1055252480,1055256575,ES +1055260672,1055264767,SE +1055326208,1055334399,RU +1055334400,1055342591,IE +1055342592,1055358975,RO +1055358976,1055367167,GB +1055367168,1055375359,RU +1055375360,1055391743,OM +1055391744,1055457279,GB +1055457280,1055465471,BE +1055465472,1055473663,FR +1055473664,1055490047,GB +1055490048,1055522815,PL +1055522816,1055588351,CN +1055588352,1055653887,BE +1055653888,1055784959,FI +1055784960,1055850495,NL +1055850496,1055916031,GB +1055916032,1055924223,RS +1055924224,1055932415,LY +1055932416,1055940607,FI +1055940608,1055948799,EG +1055948800,1055956991,DE +1055956992,1055965183,CZ +1055965184,1055973375,CH +1055973376,1055981567,FR +1055981568,1055989759,IT +1055989760,1055997951,DE +1055997952,1056014335,FR +1056014336,1056022527,EG +1056022528,1056030719,GB +1056030720,1056047103,FI +1056047104,1056178175,DK +1056178176,1056194559,UA +1056194560,1056210943,FR +1056210944,1056219135,PL +1056219136,1056227327,GB +1056227328,1056243711,TR +1056243712,1056251903,CH +1056251904,1056260095,RU +1056260096,1056276479,CZ +1056276480,1056374783,DE +1056374784,1056440319,SE +1056440320,1056473087,TR +1056473088,1056505855,FI +1056505856,1056514047,PT +1056514048,1056522239,IT +1056522240,1056538623,AT +1056538624,1056546815,RU +1056546816,1056555007,NO +1056555008,1056571391,GB +1056571392,1056669695,NL +1056669696,1056702463,MA +1056702464,1056874751,GB +1056874752,1056874943,IE +1056874944,1056874975,GB +1056874976,1056875007,IE +1056875008,1056964607,GB +1056964608,1061227263,US +1061227264,1061227519,BO +1061227520,1061558271,US +1061558272,1061559295,PK +1061559296,1061588735,US +1061588736,1061588991,GU +1061588992,1061853695,US +1061853696,1061854207,GB +1061854208,1061939711,US +1061939712,1061940223,JM +1061940224,1062069247,US +1062069248,1062070271,PR +1062070272,1062219519,US +1062219520,1062219775,IN +1062219776,1062262783,US +1062262784,1062263039,PH +1062263040,1062486271,US +1062486272,1062486527,MX +1062486528,1062530047,US +1062530048,1062531071,EC +1062531072,1062545919,US +1062545920,1062546431,BM +1062546432,1062597375,US +1062597376,1062597631,PR +1062597632,1062723583,US +1062723584,1062727679,GB +1062727680,1062871551,US +1062871552,1062872063,PR +1062872064,1063057432,US +1063057433,1063057433,CA +1063057434,1063568895,US +1063568896,1063569151,TZ +1063569152,1063748607,US +1063748608,1063749119,GH +1063749120,1063749631,US +1063749632,1063749887,LR +1063749888,1063750143,SA +1063750144,1063750399,NG +1063750400,1063750655,US +1063750656,1063751679,NG +1063751680,1063895039,US +1063895040,1063899135,KR +1063899136,1064124927,US +1064124928,1064125695,EC +1064125696,1064125951,US +1064125952,1064126207,PE +1064126208,1064126719,US +1064126720,1064126975,EC +1064126976,1064127487,US +1064127488,1064127999,EC +1064128000,1064171263,US +1064171264,1064171519,NG +1064171520,1064204287,US +1064204288,1064205311,MX +1064205312,1064221951,US +1064221952,1064222207,MX +1064222208,1064445183,US +1064445184,1064445439,PK +1064445440,1065371647,US +1065371648,1065372959,PR +1065372960,1065372991,US +1065372992,1065373695,PR +1065373696,1065493759,US +1065493760,1065494015,GB +1065494016,1065506047,US +1065506048,1065506559,GB +1065506560,1065519247,US +1065519248,1065519263,IN +1065519264,1065519303,US +1065519304,1065519311,IN +1065519312,1065519871,US +1065519872,1065520127,GB +1065520128,1065521407,US +1065521408,1065525247,GB +1065525248,1065525791,US +1065525792,1065525807,IN +1065525808,1065526015,US +1065526016,1065526271,GB +1065526272,1065529343,US +1065529344,1065537535,GB +1065537536,1065539583,US +1065539584,1065539839,GB +1065539840,1065611263,US +1065611264,1065615359,PR +1065615360,1065811967,US +1065811968,1065820159,CA +1065820160,1065873407,US +1065873408,1065877503,PR +1065877504,1065906175,US +1065906176,1065908223,KY +1065908224,1066139647,US +1066139648,1066143743,HK +1066143744,1066213887,US +1066213888,1066214911,NL +1066214912,1066254975,US +1066254976,1066255103,GB +1066255104,1066270719,US +1066270720,1066274815,DE +1066274816,1066311679,US +1066311680,1066311954,CA +1066311955,1066311955,US +1066311956,1066315775,CA +1066315776,1066352639,US +1066352640,1066355711,JM +1066355712,1066355967,BB +1066355968,1066358271,JM +1066358272,1066358527,AG +1066358528,1066369023,JM +1066369024,1066830303,US +1066830304,1066830311,SG +1066830312,1066831071,US +1066831072,1066831079,JP +1066831080,1066831183,US +1066831184,1066831191,JP +1066831192,1066831199,US +1066831200,1066831215,KR +1066831216,1066831335,US +1066831336,1066831343,JP +1066831344,1067237887,US +1067237888,1067238399,JP +1067238400,1067294719,US +1067294720,1067294975,CA +1067294976,1067450879,US +1067450880,1067450880,AL +1067450881,1067471689,US +1067471690,1067471690,SV +1067471691,1067473649,US +1067473650,1067473650,IT +1067473651,1067481855,US +1067481856,1067482111,CA +1067482112,1067530633,US +1067530634,1067530634,NL +1067530635,1067532287,US +1067532288,1067532799,HN +1067532800,1067537927,US +1067537928,1067537928,HU +1067537929,1067550244,US +1067550245,1067550245,IL +1067550246,1067575295,US +1067575296,1067577343,HN +1067577344,1067617791,US +1067617792,1067618047,CN +1067618048,1067621667,US +1067621668,1067621668,CN +1067621669,1067647048,US +1067647049,1067647049,CZ +1067647050,1067693055,US +1067693056,1067693567,CO +1067693568,1067715631,US +1067715632,1067715632,SA +1067715633,1067726847,US +1067726848,1067727359,EC +1067727360,1067736831,US +1067736832,1067737087,PR +1067737088,1067740159,US +1067740160,1067741183,HN +1067741184,1067810188,US +1067810189,1067810189,GH +1067810190,1067823171,US +1067823172,1067823172,TZ +1067823173,1067826283,US +1067826284,1067826284,SE +1067826285,1067831584,US +1067831585,1067831585,BE +1067831586,1067839328,US +1067839329,1067839329,CH +1067839330,1067868455,US +1067868456,1067868456,SG +1067868457,1067969987,US +1067969988,1067969988,SI +1067969989,1067971327,US +1067971328,1067971328,RO +1067971329,1067986307,US +1067986308,1067986308,ZM +1067986309,1067993091,US +1067993092,1067993092,UA +1067993093,1067998463,US +1067998464,1067998719,CO +1067998720,1068004351,US +1068004352,1068004607,CA +1068004608,1068017663,US +1068017664,1068018175,YE +1068018176,1068069919,US +1068069920,1068069920,RU +1068069921,1068080677,US +1068080678,1068080678,RS +1068080679,1068123135,US +1068123136,1068123647,BB +1068123648,1068157839,US +1068157840,1068157840,HR +1068157841,1068157847,US +1068157848,1068157851,CA +1068157852,1068169679,US +1068169680,1068169680,GR +1068169681,1068171799,US +1068171800,1068171800,BA +1068171801,1068175871,US +1068175872,1068176383,YE +1068176384,1068199935,US +1068199936,1068204031,CA +1068204032,1068230655,US +1068230656,1068230911,CO +1068230912,1068249114,US +1068249115,1068249115,BG +1068249116,1068346367,US +1068346368,1068346879,YE +1068346880,1068419071,US +1068419072,1068421119,CO +1068421120,1068425983,US +1068425984,1068426239,EC +1068426240,1068427158,US +1068427159,1068427159,AR +1068427160,1068473343,US +1068473344,1068474367,BB +1068474368,1068481023,US +1068481024,1068481535,PR +1068481536,1068491263,US +1068491264,1068491519,HN +1068491520,1070729471,US +1070729472,1070729727,CA +1070729728,1071100927,US +1071100928,1071101951,PR +1071101952,1071106559,US +1071106560,1071106815,NL +1071106816,1071141557,US +1071141558,1071141558,HK +1071141559,1071141873,US +1071141874,1071141874,HK +1071141875,1071144959,US +1071144960,1071153151,LB +1071153152,1071170815,US +1071170816,1071171071,PH +1071171072,1071206911,US +1071206912,1071207167,HK +1071207168,1071255525,US +1071255526,1071255526,DE +1071255527,1071255839,US +1071255840,1071255847,TW +1071255848,1071278959,US +1071278960,1071278963,SG +1071278964,1071318783,US +1071318784,1071319039,IN +1071319040,1071382975,US +1071382976,1071383039,HK +1071383040,1071477247,US +1071477248,1071480831,CA +1071480832,1071522817,US +1071522818,1071522818,MW +1071522819,1071726951,US +1071726952,1071726955,IE +1071726956,1071727023,US +1071727024,1071727027,GB +1071727028,1071954327,US +1071954328,1071954335,ES +1071954336,1071954391,US +1071954392,1071954399,GB +1071954400,1071954415,US +1071954416,1071954423,GB +1071954424,1071998999,US +1071999000,1071999003,GB +1071999004,1072099327,US +1072099328,1072099519,DE +1072099520,1072099527,FR +1072099528,1072099535,NL +1072099536,1072099583,DE +1072099584,1072157503,US +1072157504,1072157511,GR +1072157512,1072157631,US +1072157632,1072157663,DE +1072157664,1072228863,US +1072228864,1072229375,CA +1072229376,1072361471,US +1072361472,1072361727,GB +1072361728,1072707327,US +1072707328,1072707583,IN +1072707584,1072923135,US +1072923136,1072923391,CA +1072923392,1072924159,US +1072924160,1072924671,HT +1072924672,1072925183,US +1072925184,1072925695,GB +1072925696,1072926207,CA +1072926208,1072926719,US +1072926720,1072926975,PH +1072926976,1072927487,CA +1072927488,1072928511,US +1072928512,1072928767,CA +1072928768,1072929023,US +1072929024,1072929535,CA +1072929536,1072930303,US +1072930304,1072930559,CA +1072930560,1072930815,US +1072930816,1072931071,CA +1072931072,1072931327,US +1072931328,1072931583,CA +1072931584,1072931839,SY +1072931840,1072932095,CA +1072932096,1072932351,US +1072932352,1072932607,CA +1072932608,1072932863,NG +1072932864,1072933887,US +1072933888,1072934399,CA +1072934400,1072934775,US +1072934776,1072934783,FR +1072934784,1072935423,US +1072935424,1072935679,CA +1072935680,1072936191,US +1072936192,1072936447,CA +1072936448,1072936703,PH +1072936704,1072937215,US +1072937216,1072937471,IR +1072937472,1072937727,US +1072937728,1072938239,CA +1072938240,1072938495,VG +1072938496,1072939007,US +1072939008,1072939263,CA +1072939264,1072941055,US +1072941056,1072942079,CA +1072942080,1072943103,US +1072943104,1072945151,CA +1072945152,1072953599,US +1072953600,1072953607,IE +1072953608,1073022975,US +1073022976,1073025791,HN +1073025792,1073026047,NI +1073026048,1073026303,US +1073026304,1073026559,DO +1073026560,1073027071,PR +1073027072,1073028351,NI +1073028352,1073028607,US +1073028608,1073029119,GD +1073029120,1073035263,US +1073035264,1073036287,GD +1073036288,1073036543,US +1073036544,1073037055,MX +1073037056,1073037311,CW +1073037312,1073037823,CO +1073037824,1073038335,GD +1073038336,1073039359,US +1073039360,1073041407,GT +1073041408,1073043455,CO +1073043456,1073043967,PR +1073043968,1073044735,US +1073044736,1073044991,PR +1073044992,1073045247,US +1073045248,1073045503,PR +1073045504,1073047551,CO +1073047552,1073049064,US +1073049065,1073049065,CW +1073049066,1073049599,US +1073049600,1073052671,BS +1073052672,1073075199,US +1073075200,1073075455,CA +1073075456,1073116159,US +1073116160,1073117183,GB +1073117184,1073118207,US +1073118208,1073118719,NL +1073118720,1073119231,DE +1073119232,1073373183,US +1073373184,1073381375,CA +1073381376,1073454591,US +1073454592,1073454847,KY +1073454848,1074009727,US +1074009728,1074009855,IE +1074009856,1074012671,US +1074012672,1074013183,FI +1074013184,1074016895,US +1074016896,1074017023,IE +1074017024,1074020351,US +1074020352,1074028543,CA +1074028544,1074118655,US +1074118656,1074120703,CA +1074120704,1074120719,US +1074120720,1074120959,CA +1074120960,1074121215,US +1074121216,1074122415,CA +1074122416,1074122431,US +1074122432,1074125055,CA +1074125056,1074125311,US +1074125312,1074126847,CA +1074126848,1074127359,US +1074127360,1074128511,CA +1074128512,1074128575,US +1074128576,1074130943,CA +1074130944,1074131199,US +1074131200,1074135039,CA +1074135040,1074184191,US +1074184192,1074188287,CA +1074188288,1074233343,US +1074233344,1074241535,CA +1074241536,1074397439,US +1074397440,1074398975,CA +1074398976,1074399231,US +1074399232,1074406655,CA +1074406656,1074407167,US +1074407168,1074408191,CA +1074408192,1074408447,US +1074408448,1074409471,CA +1074409472,1074409727,US +1074409728,1074410495,CA +1074410496,1074411007,US +1074411008,1074413567,CA +1074413568,1074413823,US +1074413824,1074417407,CA +1074417408,1074418431,US +1074418432,1074419967,CA +1074419968,1074420223,US +1074420224,1074421247,CA +1074421248,1074421503,US +1074421504,1074426623,CA +1074426624,1074427135,US +1074427136,1074428671,CA +1074428672,1074428927,US +1074428928,1074430207,CA +1074430208,1074430463,US +1074430464,1074433535,CA +1074433536,1074433791,US +1074433792,1074437119,CA +1074437120,1074437375,US +1074437376,1074438911,CA +1074438912,1074439167,US +1074439168,1074441727,CA +1074441728,1074441983,US +1074441984,1074444031,CA +1074444032,1074444287,US +1074444288,1074445311,CA +1074445312,1074445567,US +1074445568,1074446079,CA +1074446080,1074446335,US +1074446336,1074453247,CA +1074453248,1074453503,US +1074453504,1074455039,CA +1074455040,1074455295,US +1074455296,1074456319,CA +1074456320,1074456575,US +1074456576,1074459135,CA +1074459136,1074459391,US +1074459392,1074462207,CA +1074462208,1074463743,US +1074463744,1074465535,CA +1074465536,1074465791,US +1074465792,1074466815,CA +1074466816,1074467071,US +1074467072,1074469887,CA +1074469888,1074470143,US +1074470144,1074472191,CA +1074472192,1074472447,US +1074472448,1074474751,CA +1074474752,1074475263,US +1074475264,1074479871,CA +1074479872,1074480127,US +1074480128,1074482175,CA +1074482176,1074482431,US +1074482432,1074484479,CA +1074484480,1074484735,US +1074484736,1074488319,CA +1074488320,1074488831,US +1074488832,1074493695,CA +1074493696,1074494207,US +1074494208,1074494719,CA +1074494720,1074495743,US +1074495744,1074497023,CA +1074497024,1074497279,US +1074497280,1074498815,CA +1074498816,1074499071,US +1074499072,1074501375,CA +1074501376,1074501631,US +1074501632,1074503935,CA +1074503936,1074504191,US +1074504192,1074505215,CA +1074505216,1074505471,US +1074505472,1074508031,CA +1074508032,1074508287,US +1074508288,1074509823,CA +1074509824,1074510079,US +1074510080,1074513151,CA +1074513152,1074703615,US +1074703616,1074703871,GB +1074703872,1074704383,US +1074704384,1074704639,GB +1074704640,1074707967,US +1074707968,1074708223,GB +1074708224,1074708991,US +1074708992,1074709247,PH +1074709248,1074733055,US +1074733056,1074737151,AU +1074737152,1074745343,CA +1074745344,1074757631,US +1074757632,1074765823,CA +1074765824,1074777343,US +1074777344,1074777599,AU +1074777600,1074937855,US +1074937856,1074946047,CA +1074946048,1074954239,US +1074954240,1074962431,PL +1074962432,1074970623,CA +1074970624,1074976703,US +1074976704,1074976735,GB +1074976736,1075265535,US +1075265536,1075269631,KR +1075269632,1075421183,US +1075421184,1075429375,CA +1075429376,1075478527,US +1075478528,1075494911,CA +1075494912,1075576831,US +1075576832,1075576895,NO +1075576896,1075576896,SE +1075576897,1075585023,NO +1075585024,1075609599,US +1075609600,1075613695,TT +1075613696,1075646463,US +1075646464,1075650559,CA +1075650560,1075855359,US +1075855360,1075871743,DO +1075871744,1075904511,US +1075904512,1075920895,JP +1075920896,1075970047,US +1075970048,1075972095,CA +1075972096,1075972351,GB +1075972352,1075973375,CA +1075973376,1075973631,US +1075973632,1075980031,CA +1075980032,1075980543,US +1075980544,1075981567,CA +1075981568,1075982079,US +1075982080,1075985151,CA +1075985152,1075985407,US +1075985408,1075990783,CA +1075990784,1075991039,US +1075991040,1075991807,CA +1075991808,1075992063,US +1075992064,1075992575,CA +1075992576,1075992831,US +1075992832,1075992895,CA +1075992896,1075992959,US +1075992960,1075994111,CA +1075994112,1075994367,US +1075994368,1075999231,CA +1075999232,1075999487,US +1075999488,1075999743,CA +1075999744,1075999999,US +1076000000,1076000255,CA +1076000256,1076000767,US +1076000768,1076002047,CA +1076002048,1076002815,US +1076002816,1076011007,CA +1076011008,1076015103,US +1076015104,1076018098,CA +1076018099,1076018099,US +1076018100,1076018431,CA +1076018432,1076018687,US +1076018688,1076018765,CA +1076018766,1076018766,US +1076018767,1076018943,CA +1076018944,1076022783,US +1076022784,1076023295,CA +1076023296,1076025855,US +1076025856,1076025951,CA +1076025952,1076025999,US +1076026000,1076026023,CA +1076026024,1076026031,US +1076026032,1076026175,CA +1076026176,1076026207,US +1076026208,1076028671,CA +1076028672,1076028927,US +1076028928,1076029183,BZ +1076029184,1076032511,CA +1076032512,1076033543,US +1076033544,1076033887,CA +1076033888,1076033903,US +1076033904,1076033983,CA +1076033984,1076034015,US +1076034016,1076034111,CA +1076034112,1076034175,US +1076034176,1076034303,CA +1076034304,1076034334,US +1076034335,1076034340,CA +1076034341,1076034367,US +1076034368,1076034815,CA +1076034816,1076035071,US +1076035072,1076035135,CA +1076035136,1076035199,US +1076035200,1076035519,CA +1076035520,1076035583,IN +1076035584,1076046847,US +1076046848,1076047103,CA +1076047104,1076049151,US +1076049152,1076049407,DE +1076049408,1076049919,US +1076049920,1076050175,IL +1076050176,1076174847,US +1076174848,1076178943,BM +1076178944,1076183807,US +1076183808,1076184063,CA +1076184064,1076191743,US +1076191744,1076191999,CN +1076192000,1076193375,US +1076193376,1076193383,PG +1076193384,1076194559,US +1076194560,1076194815,CA +1076194816,1076195071,US +1076195072,1076195327,IN +1076195328,1076196095,US +1076196096,1076196351,CA +1076196352,1076198655,US +1076198656,1076198911,AE +1076198912,1076307967,US +1076307968,1076308223,DE +1076308224,1076310015,US +1076310016,1076310271,DE +1076310272,1076323839,US +1076323840,1076324095,CH +1076324096,1076338687,US +1076338688,1076346879,CA +1076346880,1076387839,US +1076387840,1076393727,CA +1076393728,1076394239,US +1076394240,1076396031,CA +1076396032,1076400127,US +1076400128,1076404223,DE +1076404224,1076408319,US +1076408320,1076412415,CA +1076412416,1076424703,US +1076424704,1076428799,CA +1076428800,1076543487,US +1076543488,1076559871,CA +1076559872,1076695039,US +1076695040,1076699135,CA +1076699136,1076703231,US +1076703232,1076706559,CA +1076706560,1076706815,US +1076706816,1076707327,CA +1076707328,1076756479,US +1076756480,1076772863,CA +1076772864,1076823009,US +1076823010,1076823011,CR +1076823012,1076850687,US +1076850688,1076851711,CA +1076851712,1076855044,US +1076855045,1076855045,MX +1076855046,1076879505,US +1076879506,1076879507,CA +1076879508,1076880383,US +1076880384,1076880639,CH +1076880640,1076880895,GB +1076880896,1077055487,US +1077055488,1077059583,CA +1077059584,1077444607,US +1077444608,1077452799,CA +1077452800,1077460991,JP +1077460992,1077465855,US +1077465856,1077466111,CA +1077466112,1077469183,US +1077469184,1077477375,CA +1077477376,1077506047,US +1077506048,1077510143,LS +1077510144,1077511167,US +1077511168,1077511423,UY +1077511424,1077512191,US +1077512192,1077514239,SE +1077514240,1077641215,US +1077641216,1077657599,CA +1077657600,1077841151,US +1077841152,1077841407,GB +1077841408,1077857279,US +1077857280,1077857280,FR +1077857281,1077857281,MF +1077857282,1077857283,FR +1077857284,1077857284,MF +1077857285,1077857304,FR +1077857305,1077857305,MF +1077857306,1077857307,FR +1077857308,1077857308,MF +1077857309,1077857379,FR +1077857380,1077857380,MF +1077857381,1077857535,FR +1077857536,1077865983,US +1077865984,1077866239,CA +1077866240,1077886975,US +1077886976,1077903359,JP +1077903360,1077961347,US +1077961348,1077961350,MX +1077961351,1077963775,US +1077963776,1077964031,JP +1077964032,1077967103,US +1077967104,1077967359,CA +1077967360,1077967615,US +1077967616,1077968127,GB +1077968128,1077968765,US +1077968766,1077968768,MX +1077968769,1077977087,US +1077977088,1077985279,CA +1077985280,1077993471,US +1077993472,1078018047,CA +1078018048,1078067199,US +1078067200,1078071295,BS +1078071296,1078075391,CA +1078075392,1078124543,US +1078124544,1078128639,CA +1078128640,1078247423,US +1078247424,1078251519,CA +1078251520,1078280191,US +1078280192,1078285008,CA +1078285009,1078285011,US +1078285012,1078288383,CA +1078288384,1078429695,US +1078429696,1078429951,GR +1078429952,1078438399,US +1078438400,1078438655,CA +1078438656,1078438911,US +1078438912,1078438929,CN +1078438930,1078438930,US +1078438931,1078439167,CN +1078439168,1078439679,US +1078439680,1078439935,NL +1078439936,1078453935,US +1078453936,1078453951,AT +1078453952,1078454703,US +1078454704,1078454719,AT +1078454720,1078455343,US +1078455344,1078455359,AT +1078455360,1078456319,US +1078456320,1078460415,CA +1078460416,1078517759,US +1078517760,1078525951,CA +1078525952,1078575359,US +1078575360,1078575615,CA +1078575616,1078594815,US +1078594816,1078594943,HK +1078594944,1078722559,US +1078722560,1078734847,AR +1078734848,1078737919,CO +1078737920,1078738943,EC +1078738944,1078739455,VE +1078739456,1078739967,US +1078739968,1078743039,PE +1078743040,1078746111,CO +1078746112,1078747135,PE +1078747136,1078749183,CL +1078749184,1078751231,PE +1078751232,1078753279,CO +1078753280,1078755327,AR +1078755328,1078757375,PE +1078757376,1078767615,CL +1078767616,1078768639,CO +1078768640,1078769663,CL +1078769664,1078771711,CO +1078771712,1078773759,EC +1078773760,1078775807,PE +1078775808,1078777855,CO +1078777856,1078780927,EC +1078780928,1078782463,US +1078782464,1078782719,PA +1078782720,1078788095,US +1078788096,1078790911,CA +1078790912,1078791167,US +1078791168,1078793727,CA +1078793728,1078793983,US +1078793984,1078795263,CA +1078795264,1078795519,US +1078795520,1078796287,CA +1078796288,1078797311,US +1078797312,1078801167,CA +1078801168,1078801183,US +1078801184,1078801407,CA +1078801408,1078803199,US +1078803200,1078804479,CA +1078804480,1078805503,US +1078805504,1078807391,CA +1078807392,1078807407,US +1078807408,1078807807,CA +1078807808,1078808831,US +1078808832,1078809855,CA +1078809856,1078811391,US +1078811392,1078812415,CA +1078812416,1078813439,US +1078813440,1078813959,CA +1078813960,1078813967,US +1078813968,1078814031,CA +1078814032,1078814039,US +1078814040,1078814071,CA +1078814072,1078814079,US +1078814080,1078814719,CA +1078814720,1078815999,US +1078816000,1078816511,CA +1078816512,1078817791,US +1078817792,1078819327,CA +1078819328,1078820095,US +1078820096,1078820863,CA +1078820864,1078895103,US +1078895104,1078895359,CN +1078895360,1079319295,US +1079319296,1079319551,CN +1079319552,1079320575,US +1079320576,1079322831,CA +1079322832,1079322839,US +1079322840,1079328767,CA +1079328768,1079379199,US +1079379200,1079379455,CA +1079379456,1079383039,US +1079383040,1079383295,VG +1079383296,1079383807,US +1079383808,1079384063,MH +1079384064,1079384319,LR +1079384320,1079384575,CA +1079384576,1079385087,ZW +1079385088,1079385599,US +1079385600,1079386623,CA +1079386624,1079386879,SG +1079386880,1079387135,EG +1079387136,1079387903,US +1079387904,1079388159,PH +1079388160,1079389183,CA +1079389184,1079389951,US +1079389952,1079390207,CA +1079390208,1079392255,US +1079392256,1079393791,CA +1079393792,1079394303,US +1079394304,1079395327,EC +1079395328,1079396095,US +1079396096,1079396351,CA +1079396352,1079397375,MP +1079397376,1079397631,MH +1079397632,1079400959,US +1079400960,1079401215,CA +1079401216,1079402495,US +1079402496,1079403263,CA +1079403264,1079403519,US +1079403520,1079403775,CA +1079403776,1079405567,US +1079405568,1079406111,CA +1079406112,1079408895,US +1079408896,1079409407,PK +1079409408,1079409919,US +1079409920,1079410175,CA +1079410176,1079411455,US +1079411456,1079411711,PK +1079411712,1079413759,US +1079413760,1079414271,CA +1079414272,1079415039,US +1079415040,1079415295,HN +1079415296,1079418887,US +1079418888,1079418895,CA +1079418896,1079422975,US +1079422976,1079423999,CA +1079424000,1079424255,US +1079424256,1079424259,MX +1079424260,1079425791,US +1079425792,1079426047,CA +1079426048,1079427327,US +1079427328,1079427583,CA +1079427584,1079429295,US +1079429296,1079429311,FR +1079429312,1079431679,US +1079431680,1079432191,ZM +1079432192,1079432959,US +1079432960,1079433215,CA +1079433216,1079435263,CR +1079435264,1079435775,CO +1079435776,1079436031,CA +1079436032,1079439359,US +1079439360,1079439407,CA +1079439408,1079439615,US +1079439616,1079439871,CA +1079439872,1079440191,US +1079440192,1079440207,CA +1079440208,1079459839,US +1079459840,1079508991,CA +1079508992,1079566847,US +1079566848,1079567103,GB +1079567104,1079567359,US +1079567360,1079567615,AU +1079567616,1079574527,US +1079574528,1079578623,PR +1079578624,1079623679,US +1079623680,1079627775,PR +1079627776,1079664639,US +1079664640,1079668735,CA +1079668736,1079669247,US +1079669248,1079669759,NL +1079669760,1079861247,US +1079861248,1079865343,CA +1079865344,1079917055,US +1079917056,1079917311,KY +1079917312,1079962879,US +1079962880,1079963135,GB +1079963136,1079992319,US +1079992320,1079993343,NL +1079993344,1080015871,US +1080015872,1080016383,GB +1080016384,1080016639,US +1080016640,1080016895,GB +1080016896,1080033279,US +1080033280,1080164351,KY +1080164352,1080165375,US +1080165376,1080168447,CA +1080168448,1080172543,US +1080172544,1080176639,CA +1080176640,1080197119,US +1080197120,1080213503,CA +1080213504,1080229887,US +1080229888,1080233983,CA +1080233984,1080238079,US +1080238080,1080258559,CA +1080258560,1080262655,US +1080262656,1080279039,CA +1080279040,1080492031,US +1080492032,1080498664,NL +1080498665,1080498665,US +1080498666,1080501380,NL +1080501381,1080501381,US +1080501382,1080501503,NL +1080501504,1080501759,US +1080501760,1080524799,NL +1080524800,1080557567,IN +1080557568,1080573951,JP +1080573952,1080581887,SG +1080581888,1080582143,US +1080582144,1080590335,HK +1080590336,1080598527,IN +1080598528,1080606719,HK +1080606720,1080623103,AU +1080623104,1080957951,US +1080957952,1080958207,DE +1080958208,1080958463,BH +1080958464,1080958719,DE +1080958720,1080958975,BH +1080958976,1080960255,DE +1080960256,1080960511,BH +1080960512,1080963839,DE +1080963840,1080967167,US +1080967168,1080968191,DE +1080968192,1080968447,BH +1080968448,1080969471,DE +1080969472,1080969727,BH +1080969728,1080983551,DE +1080983552,1080987647,US +1080987648,1080988671,DE +1080988672,1080989951,US +1080989952,1080990207,DE +1080990208,1080999935,US +1080999936,1081016319,CA +1081016320,1081037311,US +1081037312,1081037567,CA +1081037568,1081038335,US +1081038336,1081040895,CA +1081040896,1081129983,US +1081129984,1081130495,CA +1081130496,1081212927,US +1081212928,1081278463,CA +1081278464,1081369599,US +1081369600,1081370111,CO +1081370112,1081377663,US +1081377664,1081377791,VE +1081377792,1081378495,US +1081378496,1081378559,VE +1081378560,1081379327,US +1081379328,1081379839,VE +1081379840,1081385215,US +1081385216,1081385471,PA +1081385472,1081387519,US +1081387520,1081387775,PA +1081387776,1081391103,US +1081391104,1081393151,PA +1081393152,1081393407,US +1081393408,1081393663,CL +1081393664,1081393919,US +1081393920,1081397247,CL +1081397248,1081397759,US +1081397760,1081398783,CL +1081398784,1081399295,US +1081399296,1081401343,CL +1081401344,1081403135,US +1081403136,1081403391,AR +1081403392,1081409791,US +1081409792,1081410047,PR +1081410048,1081410559,US +1081410560,1081411583,PR +1081411584,1081416191,US +1081416192,1081416447,PR +1081416448,1081419775,US +1081419776,1081420287,PR +1081420288,1081421311,US +1081421312,1081421567,MF +1081421568,1081443327,US +1081443328,1081444351,CL +1081444352,1081445375,US +1081445376,1081446399,CL +1081446400,1081460735,US +1081460736,1081462783,PA +1081462784,1081462856,US +1081462857,1081462857,BR +1081462858,1081479167,US +1081479168,1081483247,CA +1081483248,1081483255,US +1081483256,1081483263,CA +1081483264,1081565183,US +1081565184,1081573375,CA +1081573376,1081589759,US +1081589760,1081593855,BB +1081593856,1081597951,CA +1081597952,1081634303,US +1081634304,1081637375,SG +1081637376,1081978623,US +1081978624,1081978631,CH +1081978632,1082091263,US +1082091264,1082091271,CN +1082091272,1082091999,US +1082092000,1082092007,CA +1082092008,1082093679,US +1082093680,1082093695,AU +1082093696,1082097055,US +1082097056,1082097071,CA +1082097072,1082314751,US +1082314752,1082318847,CA +1082318848,1082683391,US +1082683392,1082687487,CA +1082687488,1082753023,US +1082753024,1082785791,CA +1082785792,1082788655,US +1082788656,1082788663,SG +1082788664,1082791167,US +1082791168,1082791423,IN +1082791424,1082945535,US +1082945536,1082949631,CA +1082949632,1082982399,US +1082982400,1083015167,CA +1083015168,1083142399,US +1083142400,1083142655,IN +1083142656,1083267583,US +1083267584,1083268095,JP +1083268096,1083396095,US +1083396096,1083400191,BM +1083400192,1083417727,US +1083417728,1083417791,CA +1083417792,1083437055,US +1083437056,1083441151,CA +1083441152,1083621375,US +1083621376,1083637759,BS +1083637760,1083686911,US +1083686912,1083703295,CA +1083703296,1083738111,US +1083738112,1083740159,PR +1083740160,1084067583,US +1084067584,1084067839,CA +1084067840,1084153599,US +1084153600,1084153855,NL +1084153856,1085439999,US +1085440000,1085448191,CA +1085448192,1085456383,US +1085456384,1085464575,PR +1085464576,1085526015,US +1085526016,1085530111,CA +1085530112,1085538303,US +1085538304,1085603839,CA +1085603840,1085849599,US +1085849600,1085857791,CA +1085857792,1085915135,US +1085915136,1085923327,PR +1085923328,1085997055,US +1085997056,1086013439,CA +1086013440,1086027263,US +1086027264,1086027519,CA +1086027520,1086028031,US +1086028032,1086028287,CA +1086028288,1086042111,US +1086042112,1086046207,CA +1086046208,1086050815,US +1086050816,1086051327,CA +1086051328,1086267391,US +1086267392,1086271487,CA +1086271488,1086421503,US +1086421504,1086422015,MP +1086422016,1086922751,US +1086922752,1086930943,CA +1086930944,1086955519,US +1086955520,1086971903,CA +1086971904,1087016959,US +1087016960,1087021055,CA +1087021056,1087062015,US +1087062016,1087070207,CA +1087070208,1087405407,US +1087405408,1087405423,MX +1087405424,1087413879,US +1087413880,1087413883,ES +1087413884,1087413895,US +1087413896,1087413903,DE +1087413904,1087416985,US +1087416986,1087416986,GB +1087416987,1087418367,US +1087418368,1087419391,GB +1087419392,1087430191,US +1087430192,1087430195,FR +1087430196,1087436799,US +1087436800,1087438847,FR +1087438848,1087440895,US +1087440896,1087442943,PR +1087442944,1087466751,US +1087466752,1087467007,GB +1087467008,1087501471,US +1087501472,1087501479,HK +1087501480,1087501535,US +1087501536,1087501695,HK +1087501696,1087501775,US +1087501776,1087501799,HK +1087501800,1087508161,US +1087508162,1087508162,JP +1087508163,1087509967,US +1087509968,1087509971,FI +1087509972,1087514623,US +1087514624,1087516671,BB +1087516672,1087575807,US +1087575808,1087575815,MX +1087575816,1087586967,US +1087586968,1087586971,NL +1087586972,1087586999,US +1087587000,1087587003,DE +1087587004,1087589119,US +1087589120,1087589247,GB +1087589248,1087591237,US +1087591238,1087591238,FR +1087591239,1087613115,US +1087613116,1087613119,FR +1087613120,1087626111,US +1087626112,1087626239,VI +1087626240,1087686655,US +1087686656,1087686911,PR +1087686912,1087693151,US +1087693152,1087693155,GB +1087693156,1087714335,US +1087714336,1087714367,NL +1087714368,1087715327,US +1087715328,1087717375,PA +1087717376,1087726015,US +1087726016,1087726047,FR +1087726048,1087743569,US +1087743570,1087743570,GB +1087743571,1087758335,US +1087758336,1087766527,PR +1087766528,1087795199,US +1087795200,1087797247,CN +1087797248,1087798943,US +1087798944,1087798975,CA +1087798976,1087821567,US +1087821568,1087821823,GB +1087821824,1087837359,US +1087837360,1087837367,BR +1087837368,1087837695,US +1087837696,1087837951,BR +1087837952,1087860735,US +1087860736,1087860991,GB +1087860992,1087862783,US +1087862784,1087864831,PA +1087864832,1087873023,US +1087873024,1087873535,CA +1087873536,1087879403,US +1087879404,1087879407,GB +1087879408,1087883263,US +1087883264,1087883519,AR +1087883520,1087918511,US +1087918512,1087918519,PR +1087918520,1087950111,US +1087950112,1087950119,PR +1087950120,1088012767,US +1088012768,1088012775,PR +1088012776,1088421887,US +1088421888,1088422143,CA +1088422144,1088422911,US +1088422912,1088423167,CA +1088423168,1088423679,US +1088423680,1088424959,CA +1088424960,1088425983,US +1088425984,1088427263,CA +1088427264,1088433663,US +1088433664,1088433919,CA +1088433920,1088435455,US +1088435456,1088435711,CA +1088435712,1088437247,US +1088437248,1088438527,CA +1088438528,1088440063,US +1088440064,1088440575,CA +1088440576,1088440831,US +1088440832,1088441343,CA +1088441344,1088442623,US +1088442624,1088442879,CA +1088442880,1088446975,US +1088446976,1088447231,CA +1088447232,1088447487,US +1088447488,1088449023,CA +1088449024,1088449279,US +1088449280,1088450047,CA +1088450048,1088450303,US +1088450304,1088462847,CA +1088462848,1088467711,US +1088467712,1088467967,CA +1088467968,1088471039,US +1088471040,1088471807,CA +1088471808,1088472063,US +1088472064,1088473455,CA +1088473456,1088473487,US +1088473488,1088473855,CA +1088473856,1088474111,US +1088474112,1088475135,CA +1088475136,1088475903,US +1088475904,1088476159,CA +1088476160,1088476927,US +1088476928,1088477439,CA +1088477440,1088477695,US +1088477696,1088478207,CA +1088478208,1088478719,US +1088478720,1088479231,CA +1088479232,1088481023,US +1088481024,1088483327,CA +1088483328,1088484095,US +1088484096,1088484351,CA +1088484352,1088485375,US +1088485376,1088486911,CA +1088486912,1088487423,US +1088487424,1088495615,CA +1088495616,1088514047,US +1088514048,1088514559,CA +1088514560,1088516095,US +1088516096,1088538623,CA +1088538624,1088543487,US +1088543488,1088546815,CA +1088546816,1088548863,US +1088548864,1088550399,CA +1088550400,1088550655,US +1088550656,1088551167,CA +1088551168,1088551423,US +1088551424,1088551935,CA +1088551936,1088552191,US +1088552192,1088552703,CA +1088552704,1088552959,US +1088552960,1088553727,CA +1088553728,1088553983,US +1088553984,1088554239,CA +1088554240,1088558335,US +1088558336,1088558591,CA +1088558592,1088559103,US +1088559104,1088560383,CA +1088560384,1088564223,US +1088564224,1088565247,CA +1088565248,1088566271,US +1088566272,1088566783,CA +1088566784,1088580095,US +1088580096,1088584703,CA +1088584704,1088591871,US +1088591872,1088596479,CA +1088596480,1088599039,US +1088599040,1088599551,CA +1088599552,1088607999,US +1088608000,1088608255,CA +1088608256,1088609279,US +1088609280,1088609791,CA +1088609792,1088610815,US +1088610816,1088611071,CA +1088611072,1088614399,US +1088614400,1088616447,CA +1088616448,1088617471,US +1088617472,1088618495,CA +1088618496,1088636927,US +1088636928,1088639999,CA +1088640000,1088641023,US +1088641024,1088642047,CA +1088642048,1088660735,US +1088660736,1088661503,CA +1088661504,1088663551,US +1088663552,1088665599,CA +1088665600,1088666111,US +1088666112,1088666623,CA +1088666624,1088668671,US +1088668672,1088669695,CA +1088669696,1088673279,US +1088673280,1088676863,CA +1088676864,1088677887,US +1088677888,1088678911,CA +1088678912,1088679423,US +1088679424,1088679935,CA +1088679936,1088680959,US +1088680960,1088946175,CA +1088946176,1089056058,US +1089056059,1089056059,IN +1089056060,1089151231,US +1089151232,1089151487,NL +1089151488,1089152255,US +1089152256,1089152511,NL +1089152512,1089153279,US +1089153280,1089153535,SG +1089153536,1089154303,US +1089154304,1089154559,SG +1089154560,1089167359,US +1089167360,1089171455,CA +1089171456,1089183231,US +1089183232,1089183487,GB +1089183488,1089191935,US +1089191936,1089200127,CA +1089200128,1089210623,US +1089210624,1089210879,GB +1089210880,1089211391,BR +1089211392,1089219839,US +1089219840,1089220095,JP +1089220096,1089233919,US +1089233920,1089234175,JP +1089234176,1089235455,US +1089235456,1089235967,GB +1089235968,1089249279,US +1089249280,1089249535,IE +1089249536,1089263615,US +1089263616,1089263871,GB +1089263872,1089264127,US +1089264128,1089264639,FR +1089264640,1089265663,US +1089265664,1089265919,GB +1089265920,1089266431,US +1089266432,1089266943,GB +1089266944,1089306623,US +1089306624,1089339391,PR +1089339392,1089404927,US +1089404928,1089437695,CA +1089437696,1089462271,US +1089462272,1089462394,CA +1089462395,1089462395,US +1089462396,1089462411,CA +1089462412,1089462412,US +1089462413,1089462436,CA +1089462437,1089462437,US +1089462438,1089462527,CA +1089462528,1089462783,US +1089462784,1089463039,CA +1089463040,1089463295,US +1089463296,1089465343,CA +1089465344,1089881599,US +1089881600,1089882111,GB +1089882112,1089882623,US +1089882624,1089883135,GB +1089883136,1089887231,US +1089887232,1089887743,GB +1089887744,1089961983,US +1089961984,1089970175,CA +1089970176,1089974271,PR +1089974272,1090146303,US +1090146304,1090150399,CA +1090150400,1090207743,US +1090207744,1090215935,CA +1090215936,1090330623,US +1090330624,1090338815,GB +1090338816,1090355199,US +1090355200,1090363391,CA +1090363392,1090387967,US +1090387968,1090395391,CA +1090395392,1090418565,US +1090418566,1090418566,DE +1090418567,1090427391,US +1090427392,1090427647,CA +1090427648,1090445311,US +1090445312,1090453503,CA +1090453504,1090497903,US +1090497904,1090497919,AU +1090497920,1091803135,US +1091803136,1091803391,CN +1091803392,1091807231,US +1091807232,1091807487,CA +1091807488,1091807999,US +1091808000,1091808255,CA +1091808256,1091809535,US +1091809536,1091809791,CA +1091809792,1091960831,US +1091960832,1092026367,CA +1092026368,1092075519,US +1092075520,1092091903,PR +1092091904,1093017599,US +1093017600,1093021695,CA +1093021696,1093025791,US +1093025792,1093033983,CA +1093033984,1093058559,US +1093058560,1093066751,PR +1093066752,1093074943,US +1093074944,1093091327,CA +1093091328,1093099519,FR +1093099520,1093107711,US +1093107712,1093109952,CA +1093109953,1093109955,US +1093109956,1093110840,CA +1093110841,1093110843,US +1093110844,1093113783,CA +1093113784,1093113791,US +1093113792,1093120511,CA +1093120512,1093120767,GB +1093120768,1093127270,CA +1093127271,1093127271,US +1093127272,1093127423,CA +1093127424,1093127679,US +1093127680,1093127935,CA +1093127936,1093128191,US +1093128192,1093131775,CA +1093131776,1093132287,US +1093132288,1093134335,CA +1093134336,1093135359,US +1093135360,1093140479,CA +1093140480,1093697535,US +1093697536,1093699071,BB +1093699072,1093700607,GD +1093700608,1093701631,VC +1093701632,1093708287,BB +1093708288,1093709311,LC +1093709312,1093716479,BB +1093716480,1093717759,GD +1093717760,1093719807,BB +1093719808,1093720575,LC +1093720576,1093721343,VG +1093721344,1093723391,BB +1093723392,1093723647,VC +1093723648,1093724415,BB +1093724416,1093725183,VC +1093725184,1093730303,BB +1093730304,1093732537,US +1093732538,1093732538,CA +1093732539,1093734053,US +1093734054,1093734054,PH +1093734055,1093764095,US +1093764096,1093765119,CA +1093765120,1093767167,US +1093767168,1093767679,HK +1093767680,1093768703,US +1093768704,1093769215,HK +1093769216,1093787647,US +1093787648,1093791743,CA +1093791744,1093943295,US +1093943296,1093947391,IE +1093947392,1093959679,US +1093959680,1093967871,NL +1093967872,1093976063,HK +1093976064,1093984255,US +1093984256,1093986303,IE +1093986304,1094061971,US +1094061972,1094061975,NL +1094061976,1094061979,IE +1094061980,1094064127,US +1094064128,1094064575,IE +1094064576,1094064639,US +1094064640,1094064799,IE +1094064800,1094064831,US +1094064832,1094064863,IE +1094064864,1094064871,US +1094064872,1094064887,IE +1094064888,1094065087,US +1094065088,1094065119,IE +1094065120,1094066175,US +1094066176,1094066407,IE +1094066408,1094066415,US +1094066416,1094066431,IE +1094066432,1094066671,US +1094066672,1094066679,IE +1094066680,1094066683,US +1094066684,1094066687,IE +1094066688,1094066911,US +1094066912,1094066975,IE +1094066976,1094074879,US +1094074880,1094075167,BR +1094075168,1094075171,US +1094075172,1094075195,BR +1094075196,1094075223,US +1094075224,1094075235,BR +1094075236,1094079743,US +1094079744,1094079999,BR +1094080000,1094081023,US +1094081024,1094081535,JP +1094081536,1094088703,US +1094088704,1094088751,PR +1094088752,1094088863,US +1094088864,1094089103,PR +1094089104,1094089119,US +1094089120,1094089279,PR +1094089280,1094089503,US +1094089504,1094089535,PR +1094089536,1094099551,US +1094099552,1094099567,IE +1094099568,1094100719,US +1094100720,1094100735,GB +1094100736,1094106239,US +1094106240,1094106255,GB +1094106256,1094124543,US +1094124544,1094124799,IE +1094124800,1094139039,US +1094139040,1094139051,IE +1094139052,1094139063,US +1094139064,1094139067,CN +1094139068,1094146047,US +1094146048,1094146079,KR +1094146080,1094146111,HK +1094146112,1094146143,SG +1094146144,1094146175,MY +1094146176,1094146239,AU +1094146240,1094146271,HK +1094146272,1094146303,SG +1094146304,1094150751,US +1094150752,1094150783,SG +1094150784,1094177663,US +1094177664,1094177727,IE +1094177728,1094178303,US +1094178304,1094178559,SG +1094178560,1094178815,US +1094178816,1094179071,IE +1094179072,1094565887,US +1094565888,1094582271,CA +1094582272,1095450623,US +1095450624,1095467007,BS +1095467008,1095627775,US +1095627776,1095628287,CA +1095628288,1096278015,US +1096278016,1096286207,CA +1096286208,1096548351,US +1096548352,1096810495,CA +1096810496,1096884223,US +1096884224,1096888319,CA +1096888320,1096890879,US +1096890880,1096891135,GB +1096891136,1096925183,US +1096925184,1096941567,CA +1096941568,1097007103,US +1097007104,1097031679,JP +1097031680,1097039871,US +1097039872,1097056255,SE +1097056256,1097076123,US +1097076124,1097076127,DE +1097076128,1097727999,US +1097728000,1097736191,CA +1097736192,1097768959,US +1097768960,1097785343,CA +1097785344,1097830399,US +1097830400,1097834495,CA +1097834496,1097896191,US +1097896192,1097897215,VI +1097897216,1097947135,US +1097947136,1097949183,VI +1097949184,1097951231,US +1097951232,1097953279,VI +1097953280,1098070271,US +1098070272,1098070279,GR +1098070280,1098070295,US +1098070296,1098070303,BE +1098070304,1098096287,US +1098096288,1098096295,BR +1098096296,1098178383,US +1098178384,1098178391,CA +1098178392,1098891623,US +1098891624,1098891631,AU +1098891632,1098892255,US +1098892256,1098892263,AU +1098892264,1100450825,US +1100450826,1100450829,DE +1100450830,1100505127,US +1100505128,1100505135,CA +1100505136,1100560647,US +1100560648,1100560655,TR +1100560656,1101116083,US +1101116084,1101116084,KR +1101116085,1101182975,US +1101182976,1101183487,YE +1101183488,1101253203,US +1101253204,1101253204,JP +1101253205,1101263103,US +1101263104,1101263359,CW +1101263360,1101267711,US +1101267712,1101267967,CA +1101267968,1101291072,US +1101291073,1101291073,DE +1101291074,1101294079,US +1101294080,1101294080,PE +1101294081,1101304831,US +1101304832,1101305855,HN +1101305856,1101352959,US +1101352960,1101355007,HN +1101355008,1101361039,US +1101361040,1101361040,PA +1101361041,1101402031,US +1101402032,1101402047,PR +1101402048,1101459455,US +1101459456,1101461503,BB +1101461504,1101475839,US +1101475840,1101479935,CO +1101479936,1101484031,US +1101484032,1101488127,CO +1101488128,1101542399,US +1101542400,1101542911,CO +1101542912,1101551213,US +1101551214,1101551214,AU +1101551215,1101564519,US +1101564520,1101564520,PL +1101564521,1101592425,US +1101592426,1101592426,FR +1101592427,1101598895,US +1101598896,1101598896,KE +1101598897,1101635327,US +1101635328,1101635583,HN +1101635584,1101650276,US +1101650277,1101650277,TN +1101650278,1101650431,US +1101650432,1101650943,HN +1101650944,1101669655,US +1101669656,1101669656,NZ +1101669657,1101673579,US +1101673580,1101673580,KW +1101673581,1101681407,US +1101681408,1101681663,NL +1101681664,1101729355,US +1101729356,1101729356,LB +1101729357,1101750783,US +1101750784,1101751295,BM +1101751296,1101767679,US +1101767680,1101768191,CW +1101768192,1101803519,US +1101803520,1101804543,HN +1101804544,1101857247,US +1101857248,1101857248,MA +1101857249,1101871103,US +1101871104,1101873151,BO +1101873152,1101992063,US +1101992064,1101992191,NL +1101992192,1102004735,US +1102004736,1102004991,IN +1102004992,1102005503,US +1102005504,1102005759,PK +1102005760,1102006271,US +1102006272,1102006527,CA +1102006528,1102389247,US +1102389248,1102393343,CA +1102393344,1102446591,US +1102446592,1102448383,HN +1102448384,1102449151,US +1102449152,1102449407,SV +1102449408,1102454527,CR +1102454528,1102454783,HN +1102454784,1102512127,US +1102512128,1102516223,JM +1102516224,1103244799,US +1103244800,1103245055,EC +1103245056,1103548415,US +1103548416,1103550463,BS +1103550464,1103603711,US +1103603712,1103605759,EC +1103605760,1103623167,US +1103623168,1103623679,CO +1103623680,1103930879,US +1103930880,1103931135,MX +1103931136,1103987967,US +1103987968,1103988223,BR +1103988224,1103992319,US +1103992320,1103992575,FI +1103992576,1104166911,US +1104166912,1104168959,CO +1104168960,1104265215,US +1104265216,1104265727,PH +1104265728,1104842751,US +1104842752,1104844799,PR +1104844800,1105099519,US +1105099520,1105099775,EC +1105099776,1105719295,US +1105719296,1105723391,IN +1105723392,1106469887,US +1106469888,1106470911,BS +1106470912,1106475007,US +1106475008,1106475519,CO +1106475520,1106758655,US +1106758656,1106759167,EC +1106759168,1106759679,CO +1106759680,1106767871,US +1106767872,1106768383,CO +1106768384,1106768895,EC +1106768896,1106769919,CO +1106769920,1107240191,US +1107240192,1107240959,CN +1107240960,1107242495,US +1107242496,1107243007,DE +1107243008,1107247103,TC +1107247104,1107275775,US +1107275776,1107279871,CA +1107279872,1107288063,US +1107288064,1107292159,CA +1107292160,1107701759,US +1107701760,1107705855,CA +1107705856,1107820543,US +1107820544,1107853311,ZA +1107853312,1107895039,US +1107895040,1107895807,GB +1107895808,1107898367,US +1107898368,1107899903,GB +1107899904,1107906559,US +1107906560,1107907071,GB +1107907072,1107907839,US +1107907840,1107908095,GB +1107908096,1107909375,US +1107909376,1107909631,GB +1107909632,1107927039,US +1107927040,1107927551,GB +1107927552,1107935743,US +1107935744,1107936767,GB +1107936768,1107947775,US +1107947776,1107948031,GB +1107948032,1107948543,US +1107948544,1107948799,GB +1107948800,1108025343,US +1108025344,1108029439,CA +1108029440,1108033535,US +1108033536,1108041727,CA +1108041728,1108054015,US +1108054016,1108066303,CA +1108066304,1108492287,US +1108492288,1108500479,ZA +1108500480,1108525055,US +1108525056,1108541439,CA +1108541440,1109458943,US +1109458944,1109491711,CA +1109491712,1109688319,US +1109688320,1109696511,CA +1109696512,1109705727,US +1109705728,1109705983,CG +1109705984,1109707519,US +1109707520,1109707775,MW +1109707776,1109819391,US +1109819392,1109848831,CA +1109848832,1109849087,US +1109849088,1109852159,CA +1109852160,1109918463,US +1109918464,1109918719,GB +1109918720,1109919487,CA +1109919488,1109919743,US +1109919744,1109919999,GB +1109920000,1109920255,US +1109920256,1109920767,CA +1109920768,1109921023,US +1109921024,1109921279,CA +1109921280,1109921791,US +1109921792,1109926143,CA +1109926144,1109926655,US +1109926656,1109927167,CA +1109927168,1109927423,AU +1109927424,1109927679,CA +1109927680,1109928959,US +1109928960,1109929983,CA +1109929984,1109930751,US +1109930752,1109931007,CA +1109931008,1109931263,US +1109931264,1109931775,CA +1109931776,1109932287,US +1109932288,1109932543,CA +1109932544,1109932799,US +1109932800,1109934591,CA +1109934592,1109934847,GB +1109934848,1109936127,CA +1109936128,1109936383,US +1109936384,1109936639,CA +1109936640,1109937151,US +1109937152,1109937663,CA +1109937664,1109950463,US +1109950464,1109969407,CA +1109969408,1109970431,US +1109970432,1109970687,CA +1109970688,1109979135,US +1109979136,1109983231,CA +1109983232,1110126591,US +1110126592,1110130687,CA +1110130688,1110248623,US +1110248624,1110248631,CA +1110248632,1110270207,US +1110270208,1110270335,CA +1110270336,1110310911,US +1110310912,1110376447,CA +1110376448,1110443535,US +1110443536,1110443543,CA +1110443544,1110444287,US +1110444288,1110444799,CA +1110444800,1110445055,US +1110445056,1110446591,CA +1110446592,1110447359,US +1110447360,1110448383,CA +1110448384,1110448639,US +1110448640,1110448895,CA +1110448896,1110449151,US +1110449152,1110449663,CA +1110449664,1110450431,US +1110450432,1110450943,CA +1110450944,1110451455,US +1110451456,1110451711,CA +1110451712,1110451967,US +1110451968,1110453247,CA +1110453248,1110462143,US +1110462144,1110462207,CA +1110462208,1110462271,US +1110462272,1110462335,CA +1110462336,1110462847,US +1110462848,1110463103,CA +1110463104,1110463999,US +1110464000,1110464767,CA +1110464768,1110465023,US +1110465024,1110465535,CA +1110465536,1110466047,US +1110466048,1110466303,CA +1110466304,1110472447,US +1110472448,1110473727,CA +1110473728,1110473983,US +1110473984,1110474239,CA +1110474240,1110540287,US +1110540288,1110573055,CA +1110573056,1110579967,PR +1110579968,1110580223,US +1110580224,1110587903,PR +1110587904,1110593023,US +1110593024,1110593279,PR +1110593280,1110595776,US +1110595777,1110638591,PR +1110638592,1110642687,US +1110642688,1110644735,CA +1110644736,1110654463,US +1110654464,1110654719,HT +1110654720,1110663167,US +1110663168,1110675455,CA +1110675456,1110679551,US +1110679552,1110683647,CA +1110683648,1110700031,US +1110700032,1110704127,CA +1110704128,1110853631,US +1110853632,1110854655,GB +1110854656,1110857215,US +1110857216,1110857471,DE +1110857472,1110859007,US +1110859008,1110859263,AU +1110859264,1110863871,US +1110863872,1110865919,JM +1110865920,1110867455,KY +1110867456,1110867967,JM +1110867968,1110887423,US +1110887424,1110887679,IE +1110887680,1110929407,US +1110929408,1110933503,BM +1110933504,1111195647,US +1111195648,1111212031,CA +1111212032,1111228415,US +1111228416,1111244799,AR +1111244800,1111916543,US +1111916544,1111949311,CA +1111949312,1111982079,US +1111982080,1111998463,IT +1111998464,1112412671,US +1112412672,1112413183,NL +1112413184,1112413695,CH +1112413696,1112414207,CA +1112414208,1112416255,US +1112416256,1112418303,CN +1112418304,1112418815,US +1112418816,1112419071,IT +1112419072,1112419327,FR +1112419328,1112419839,GB +1112419840,1112420095,US +1112420096,1112420351,GB +1112420352,1112422399,CN +1112422400,1112422655,US +1112422656,1112422911,FR +1112422912,1112423167,GB +1112423168,1112424447,US +1112424448,1112440831,CA +1112440832,1112498175,US +1112498176,1112506367,IR +1112506368,1112530943,US +1112530944,1112539135,CA +1112539136,1112653823,US +1112653824,1112657919,VG +1112657920,1112867327,US +1112867328,1112867583,BS +1112867584,1112869887,US +1112869888,1112870143,CA +1112870144,1112873983,US +1112873984,1112875007,CA +1112875008,1112875519,US +1112875520,1112875775,CA +1112875776,1112889855,US +1112889856,1112890367,CA +1112890368,1112907775,US +1112907776,1112907783,CA +1112907784,1112931327,US +1112931328,1112931839,CA +1112931840,1113033727,US +1113033728,1113033983,PR +1113033984,1113591807,US +1113591808,1113595903,CA +1113595904,1113596415,CL +1113596416,1113596927,GT +1113596928,1113597183,PE +1113597184,1113597439,US +1113597440,1113597695,PE +1113597696,1113598463,PA +1113598464,1113599487,US +1113599488,1113599999,VE +1113600000,1113600255,US +1113600256,1113603071,VE +1113603072,1113603327,US +1113603328,1113603583,GT +1113603584,1113603839,US +1113603840,1113604095,CA +1113604096,1113636863,US +1113636864,1113645055,SG +1113645056,1113653247,ID +1113653248,1113657343,US +1113657344,1113661439,CA +1113661440,1113669631,US +1113669632,1113677823,CA +1113677824,1113681919,US +1113686016,1113695231,US +1113695232,1113695487,CA +1113695488,1113697279,US +1113697280,1113697791,BM +1113697792,1113699327,US +1113699328,1113700351,CA +1113700352,1113718783,US +1113718784,1113743359,DO +1113743360,1113854207,US +1113854208,1113854463,CA +1113854464,1113854975,US +1113854976,1113855487,CA +1113855488,1113983249,US +1113983250,1113983250,RU +1113983251,1113983251,KG +1113983252,1113983364,US +1113983365,1113983365,LT +1113983366,1113984643,US +1113984644,1113984645,DE +1113984646,1113997311,US +1113997312,1114005503,CA +1114005504,1114054655,US +1114054656,1114062847,CA +1114062848,1114095615,US +1114095616,1114103807,CA +1114103808,1114505215,US +1114505216,1114506239,CA +1114506240,1114506751,US +1114506752,1114507263,CA +1114507264,1114509567,US +1114509568,1114509571,MX +1114509572,1114511871,US +1114511872,1114512127,CA +1114512128,1114515463,US +1114515464,1114515471,CA +1114515472,1114517503,US +1114517504,1114518015,CA +1114518016,1114520063,US +1114520064,1114520319,PH +1114520320,1114520575,US +1114520576,1114520831,PH +1114520832,1114523971,US +1114523972,1114523975,BM +1114523976,1114523999,US +1114524000,1114524007,BM +1114524008,1114524031,US +1114524032,1114524415,JM +1114524416,1114533375,US +1114533376,1114533887,ZA +1114533888,1114537983,AO +1114537984,1114550271,CA +1114550272,1114588671,US +1114588672,1114589695,CA +1114589696,1114590975,US +1114590976,1114595327,CA +1114595328,1114681343,US +1114681344,1114685439,CA +1114685440,1114730495,US +1114730496,1114734591,CA +1114734592,1114782271,US +1114782272,1114782330,HK +1114782331,1115112575,US +1115112576,1115112607,IN +1115112608,1115113471,US +1115113472,1115114495,HN +1115114496,1115114751,MX +1115114752,1115115007,GT +1115115008,1115115519,US +1115115520,1115116543,HN +1115116544,1115117567,US +1115117568,1115118591,HN +1115118592,1115119615,SV +1115119616,1115127807,US +1115127808,1115131903,CA +1115131904,1115132095,US +1115132096,1115132159,HK +1115132160,1115132671,US +1115132672,1115132927,SG +1115132928,1115133183,US +1115133184,1115133439,CN +1115133440,1115133503,US +1115133504,1115133567,NL +1115133568,1115133951,US +1115133952,1115134079,SG +1115134080,1115134207,US +1115134208,1115134463,IE +1115134464,1115134719,SG +1115134720,1115134975,IE +1115134976,1115135359,HK +1115135360,1115135375,NL +1115135376,1115135391,US +1115135392,1115135647,SG +1115135648,1115135999,US +1115136000,1115144191,CA +1115144192,1115693055,US +1115693056,1115697151,AR +1115697152,1115705343,US +1115705344,1115709439,CA +1115709440,1115783167,US +1115783168,1115791359,CA +1115791360,1115795455,PR +1115795456,1115799551,CA +1115799552,1115815935,US +1115815936,1115947007,CA +1115947008,1115979775,US +1115979776,1116012543,CA +1116012544,1116014079,US +1116014080,1116014335,DE +1116014336,1116014591,US +1116014592,1116014847,DE +1116014848,1116015871,US +1116015872,1116016127,DE +1116016128,1116024063,US +1116024064,1116024319,PG +1116024320,1116027135,US +1116027136,1116027903,DE +1116027904,1116031743,US +1116031744,1116031999,GB +1116032000,1116032255,US +1116032256,1116032511,NL +1116032512,1116032767,US +1116032768,1116033023,GB +1116033024,1116037119,HK +1116037120,1116168191,US +1116168192,1116176383,CA +1116176384,1116198575,US +1116198576,1116198576,DE +1116198577,1116897279,US +1116897280,1116905471,CA +1116905472,1116997119,US +1116997120,1116999423,CA +1116999424,1117000703,US +1117000704,1117002751,CA +1117002752,1117004031,US +1117004032,1117005823,CA +1117005824,1117006847,US +1117006848,1117007871,CA +1117007872,1117009919,US +1117009920,1117010943,CA +1117010944,1117011455,US +1117011456,1117011711,CA +1117011712,1117137919,US +1117137920,1117138175,CA +1117138176,1117142271,US +1117142272,1117142527,CA +1117142528,1117274111,US +1117274112,1117282303,CA +1117282304,1117413375,US +1117413376,1117415423,CA +1117415424,1117416703,US +1117416704,1117417471,CA +1117417472,1117417983,US +1117417984,1117418495,CA +1117418496,1117419007,US +1117419008,1117419519,CA +1117419520,1117454335,US +1117454336,1117454591,CA +1117454592,1117454847,US +1117454848,1117455619,CA +1117455620,1117455620,DE +1117455621,1117456895,CA +1117456896,1117457151,US +1117457152,1117458751,CA +1117458752,1117458815,GB +1117458816,1117458911,CA +1117458912,1117458943,GB +1117458944,1117460223,CA +1117460224,1117460351,GB +1117460352,1117460991,CA +1117460992,1117461247,GB +1117461248,1117469183,CA +1117469184,1117469439,US +1117469440,1117476735,CA +1117476736,1117476799,US +1117476800,1117478519,CA +1117478520,1117478520,DE +1117478521,1117478561,CA +1117478562,1117478562,DE +1117478563,1117478603,CA +1117478604,1117478604,DE +1117478605,1117478610,CA +1117478611,1117478611,DE +1117478612,1117481471,CA +1117481472,1117481727,US +1117481728,1117487103,CA +1117487104,1117683711,US +1117683712,1117691903,CA +1117691904,1117724671,US +1117724672,1117728767,CA +1117728768,1117744127,US +1117744128,1117749247,CA +1117749248,1117823231,US +1117823232,1117823487,CA +1117823488,1117823999,US +1117824000,1117824511,CA +1117824512,1117829375,US +1117829376,1117829631,GR +1117829632,1117978623,US +1117978624,1117986815,CA +1117986816,1117995007,US +1117995008,1117999103,CA +1117999104,1118027775,US +1118027776,1118031871,CA +1118031872,1118126335,US +1118126336,1118126591,CA +1118126592,1118130687,US +1118130688,1118131199,CA +1118131200,1118131967,US +1118131968,1118132479,CA +1118132480,1118132991,US +1118132992,1118133247,CA +1118133248,1118139903,US +1118139904,1118140159,CA +1118140160,1118157567,US +1118157568,1118157583,SV +1118157584,1118158847,US +1118158848,1118167039,CA +1118167040,1118474239,US +1118474240,1118478335,CA +1118478336,1118483455,US +1118483456,1118484479,CA +1118484480,1118515199,US +1118515200,1118519295,CA +1118519296,1118527487,US +1118527488,1118531583,CA +1118531584,1118535679,US +1118535680,1118539775,CA +1118539776,1118543871,US +1118543872,1118547967,CA +1118547968,1118790655,US +1118790656,1118790911,IL +1118790912,1118796543,US +1118796544,1118796799,GB +1118796800,1118962943,US +1118962944,1118963199,AS +1118963200,1118965247,US +1118965248,1118965503,AS +1118965504,1118966015,US +1118966016,1118966271,BR +1118966272,1118969855,US +1118969856,1118970111,LB +1118970112,1118970367,US +1118970368,1118970623,GB +1118970624,1118971647,US +1118971648,1118971903,GY +1118971904,1118972159,US +1118972160,1118972415,VE +1118972416,1118972671,GB +1118972672,1118973183,US +1118973184,1118973439,VE +1118973440,1118975487,US +1118975488,1118975743,KE +1118975744,1118975999,US +1118976000,1118976255,GB +1118976256,1118983423,US +1118983424,1118983679,NI +1118983680,1118984447,US +1118984448,1118984703,SA +1118984704,1118986239,US +1118986240,1118987007,GB +1118987008,1118988287,US +1118988288,1118988543,CA +1118988544,1118988799,US +1118988800,1118989055,VE +1118989056,1118989311,US +1118989312,1118989823,KE +1118989824,1118994175,US +1118994176,1118994431,LR +1118994432,1119072255,US +1119072256,1119074303,CA +1119074304,1119110143,US +1119110144,1119111167,CA +1119111168,1119199231,US +1119199232,1119207169,MN +1119207170,1119207170,US +1119207171,1119207423,MN +1119207424,1119211519,US +1119211520,1119215615,CA +1119215616,1119289343,US +1119289344,1119354879,CA +1119354880,1119428607,US +1119428608,1119432703,VI +1119432704,1119436799,CA +1119436800,1119440895,US +1119440896,1119444991,CA +1119444992,1119469567,US +1119469568,1119477759,CA +1119477760,1119486783,US +1119486784,1119486847,BR +1119486848,1119502335,US +1119502336,1119510527,CA +1119510528,1119558143,US +1119558144,1119558655,PR +1119558656,1119571967,US +1119571968,1119576063,CA +1119576064,1119580159,US +1119580160,1119584255,CA +1119584256,1119611903,US +1119611904,1119612159,BR +1119612160,1120149503,US +1120149504,1120153599,CA +1120153600,1120274943,US +1120274944,1120274991,CA +1120274992,1120282367,US +1120282368,1120282623,SY +1120282624,1120282879,US +1120282880,1120283135,SY +1120283136,1120283647,US +1120283648,1120284671,EC +1120284672,1120286719,CA +1120286720,1120292863,US +1120292864,1120293119,CA +1120293120,1120294911,US +1120294912,1120297215,CA +1120297216,1120306687,US +1120306688,1120306943,PH +1120306944,1120307199,US +1120307200,1120307967,EC +1120307968,1120308223,PH +1120308224,1120310271,US +1120310272,1120310783,PH +1120310784,1120312575,US +1120312576,1120312831,PH +1120312832,1120315391,US +1120315392,1120317439,SG +1120317440,1120346111,US +1120346112,1120350207,CA +1120350208,1120370687,US +1120370688,1120371711,CA +1120371712,1120371967,US +1120371968,1120372479,CA +1120372480,1120372735,US +1120372736,1120378367,CA +1120378368,1120378623,US +1120378624,1120382975,CA +1120382976,1120383231,US +1120383232,1120383487,CA +1120383488,1120383743,US +1120383744,1120385535,CA +1120385536,1120385791,US +1120385792,1120387071,CA +1120387072,1120486655,US +1120486656,1120486911,CA +1120486912,1120487423,US +1120487424,1120487679,CA +1120487680,1120489471,US +1120489472,1120489727,CA +1120489728,1120491519,US +1120491520,1120491775,CA +1120491776,1120492543,US +1120492544,1120493055,CA +1120493056,1120497407,US +1120497408,1120497663,CA +1120497664,1120498943,US +1120498944,1120499199,CA +1120499200,1120509951,US +1120509952,1120516095,SV +1120516096,1120517119,US +1120517120,1120517375,CN +1120517376,1120517631,AR +1120517632,1120517887,US +1120517888,1120518143,CL +1120518144,1120534527,CA +1120534528,1120641023,US +1120641024,1120657407,CA +1120657408,1120737023,US +1120737024,1120737279,BS +1120737280,1120740351,US +1120740352,1120741375,TT +1120741376,1120741631,US +1120741632,1120741887,KN +1120741888,1120743423,US +1120743424,1120743679,KN +1120743680,1120744447,US +1120744448,1120744703,KN +1120744704,1120854015,US +1120854016,1120862207,CA +1120862208,1120875007,US +1120875008,1120875263,AS +1120875264,1120886783,US +1120886784,1120894975,CA +1120894976,1120911359,US +1120911360,1120919551,CA +1120919552,1121005567,US +1121005568,1121009663,CA +1121009664,1121038335,US +1121038336,1121042431,CA +1121042432,1121203199,US +1121203200,1121204223,JM +1121204224,1121205247,US +1121205248,1121205759,PR +1121205760,1121206271,LC +1121206272,1121230847,US +1121230848,1121239039,CA +1121239040,1121250303,US +1121250304,1121250815,BZ +1121250816,1121251039,US +1121251040,1121251047,CA +1121251048,1121252863,US +1121252864,1121253119,BZ +1121253120,1121254159,US +1121254160,1121254167,CA +1121254168,1121763327,US +1121763328,1121767423,CA +1121767424,1121878015,US +1121878016,1121910783,CA +1121910784,1122074623,US +1122074624,1122091007,CA +1122091008,1122092799,US +1122092800,1122093055,CA +1122093056,1122140159,US +1122140160,1122148351,CA +1122148352,1122156543,BS +1122156544,1122203135,US +1122203136,1122203391,GB +1122203392,1122412287,US +1122412288,1122412543,AU +1122412544,1122414335,US +1122414336,1122414591,AU +1122414592,1122416383,US +1122416384,1122416639,DM +1122416640,1122417919,US +1122417920,1122418175,AU +1122418176,1122433023,US +1122433024,1122434047,PR +1122434048,1122451455,US +1122451456,1122455551,CO +1122455552,1122476031,US +1122476032,1122480127,PR +1122480128,1122493439,US +1122493440,1122493951,PR +1122493952,1122495487,US +1122495488,1122495999,PR +1122496000,1122497327,US +1122497328,1122497343,BR +1122497344,1122533375,US +1122533376,1122535423,GB +1122535424,1122538495,KR +1122538496,1122635775,US +1122635776,1122639871,CA +1122639872,1122672639,US +1122672640,1122676735,AU +1122676736,1123123199,US +1123123200,1123127295,CA +1123127296,1123180543,US +1123180544,1123184639,CA +1123184640,1123336191,US +1123336192,1123352575,CA +1123352576,1123394807,US +1123394808,1123394815,CA +1123394816,1123395455,US +1123395456,1123395471,CA +1123395472,1123395615,US +1123395616,1123395616,CA +1123395617,1123395807,US +1123395808,1123395839,CA +1123395840,1123534847,US +1123534848,1123536895,AW +1123536896,1123589631,US +1123589632,1123589887,DE +1123589888,1123590143,US +1123590144,1123598335,VI +1123598336,1123598591,CA +1123598592,1123635626,US +1123635627,1123635627,PL +1123635628,1123635639,US +1123635640,1123635640,RU +1123635641,1123635660,US +1123635661,1123635661,RU +1123635662,1123635670,US +1123635671,1123635671,RU +1123635672,1123635865,US +1123635866,1123635866,IN +1123635867,1123635887,US +1123635888,1123635888,AU +1123635889,1123635909,US +1123635910,1123635910,TW +1123635911,1123635928,US +1123635929,1123635929,PH +1123635930,1123638539,US +1123638540,1123638540,PK +1123638541,1123638573,US +1123638574,1123638574,FR +1123638575,1123638614,US +1123638615,1123638615,RE +1123638616,1123638730,US +1123638731,1123638731,RE +1123638732,1123651583,US +1123651584,1123651839,JM +1123651840,1123652095,BB +1123652096,1123653119,JM +1123653120,1123653375,BB +1123653376,1123653631,JM +1123653632,1123654655,KY +1123654656,1123655679,JM +1123655680,1123663871,US +1123663872,1123667967,SV +1123667968,1123670015,PR +1123670016,1123671039,US +1123671040,1123672063,PY +1123672064,1123694591,US +1123694592,1123694709,CA +1123694710,1123694710,US +1123694711,1123694783,CA +1123694784,1123694787,US +1123694788,1123694847,CA +1123694848,1123778559,US +1123778560,1123794943,ZA +1123794944,1123795199,DO +1123795200,1123801087,US +1123801088,1123801343,RU +1123801344,1123848191,US +1123848192,1123852287,CA +1123852288,1123950591,US +1123950592,1123958783,CA +1123958784,1124853798,US +1124853799,1124853799,JP +1124853800,1125147624,US +1125147625,1125147625,GB +1125147626,1125156304,US +1125156305,1125156305,DE +1125156306,1125228647,US +1125228648,1125228651,FI +1125228652,1125237277,US +1125237278,1125237278,GB +1125237279,1125237919,US +1125237920,1125237923,GB +1125237924,1125474303,US +1125474304,1125478399,CA +1125478400,1125481215,US +1125481216,1125481727,CA +1125481728,1125486591,US +1125486592,1125490687,CA +1125490688,1125498879,US +1125498880,1125508095,CA +1125508096,1125508351,PA +1125508352,1125514239,CA +1125514240,1125514495,CY +1125514496,1125514751,US +1125514752,1125515263,CA +1125515264,1125523455,US +1125523456,1125530623,NL +1125530624,1125531647,US +1125531648,1125543887,CA +1125543888,1125543903,US +1125543904,1125543935,CA +1125543936,1125545983,US +1125545984,1125550079,CA +1125550080,1125550335,US +1125550336,1125552127,CA +1125552128,1125572607,US +1125572608,1125576703,CA +1125576704,1126924287,US +1126924288,1126928383,CA +1126928384,1126948863,US +1126948864,1126952959,CA +1126952960,1127677951,US +1127677952,1127694335,CA +1127694336,1127923711,US +1127923712,1127931903,CA +1127931904,1128529919,US +1128529920,1128641023,CA +1128641024,1128641535,US +1128641536,1128792063,CA +1128792064,1128817407,US +1128817408,1128817663,NL +1128817664,1130535935,US +1130535936,1130536191,FR +1130536192,1130537626,US +1130537627,1130537627,GU +1130537628,1130537727,US +1130537728,1130537983,GU +1130537984,1130538751,US +1130538752,1130539007,GU +1130539008,1133461247,US +1133461248,1133461503,CA +1133461504,1133785351,US +1133785352,1133785359,IE +1133785360,1133785439,US +1133785440,1133785471,GB +1133785472,1133785487,US +1133785488,1133785495,IE +1133785496,1133785519,US +1133785520,1133785535,GB +1133785536,1133789887,US +1133789888,1133789895,NL +1133789896,1133789903,IE +1133789904,1134444543,US +1134444544,1134448639,CA +1134448640,1134545919,US +1134545920,1134545951,BH +1134545952,1134546175,US +1134546176,1134546207,BH +1134546208,1134546943,US +1134546944,1134551039,CA +1134551040,1136721919,US +1136721920,1136787455,CA +1136787456,1137195519,US +1137195520,1137195775,JP +1137195776,1137278975,US +1137278976,1137295359,CA +1137295360,1137369855,US +1137369856,1137370111,CA +1137370112,1137426431,US +1137426432,1137442815,PR +1137442816,1137491967,US +1137491968,1137508351,CA +1137508352,1137524735,US +1137524736,1137541119,CA +1137541120,1137623039,US +1137623040,1137639423,PR +1137639424,1137656831,US +1137656832,1137657855,GB +1137657856,1137659903,DE +1137659904,1137681583,US +1137681584,1137681599,AR +1137681600,1137688063,US +1137688064,1137688319,FR +1137688320,1137704959,US +1137704960,1137712383,CA +1137712384,1137712639,US +1137712640,1137713151,CA +1137713152,1137717247,US +1137721344,1137836031,US +1137840128,1137840383,CA +1137840384,1137840895,US +1137840896,1137841151,DE +1137841152,1137868799,US +1137868800,1137872895,CA +1137872896,1137876991,US +1137876992,1137881087,CA +1137881088,1137889279,US +1137889280,1137893375,CA +1137893376,1137917951,US +1137917952,1137922047,CA +1137922048,1137926655,US +1137926656,1137926911,CA +1137926912,1137929727,US +1137929728,1137929983,IE +1137929984,1137930239,US +1137930240,1137934335,CA +1137934336,1137950719,US +1137950720,1137954815,CA +1137954816,1137963007,US +1137963008,1137967103,VI +1137967104,1137983487,US +1137983488,1137991679,CA +1137991680,1138049023,US +1138049024,1138061311,CA +1138061312,1138068479,US +1138068480,1138069247,AU +1138069248,1138069503,US +1138069504,1138073599,JM +1138073600,1138163711,US +1138163712,1138166935,CA +1138166936,1138166943,SA +1138166944,1138167807,CA +1138167808,1138175999,US +1138176000,1138180095,CA +1138180096,1138184191,US +1138184192,1138184447,SG +1138184448,1138184703,US +1138184704,1138184714,CN +1138184715,1138184715,HK +1138184716,1138184959,CN +1138184960,1138185215,AU +1138185216,1138185727,CA +1138185728,1138185983,ZA +1138185984,1138188287,US +1138188288,1138192383,PR +1138192384,1138196479,NZ +1138196480,1138204671,CA +1138204672,1138212863,US +1138212864,1138216959,CA +1138216960,1138237439,US +1138237440,1138245631,CA +1138245632,1138372607,US +1138372608,1138376703,AS +1138376704,1138415871,US +1138415872,1138416127,CA +1138416128,1138417407,US +1138417408,1138417663,CA +1138417664,1138419711,US +1138419712,1138419967,DE +1138419968,1138451767,US +1138451768,1138451775,IN +1138451776,1138474239,US +1138474240,1138474751,CA +1138474752,1138499583,US +1138499584,1138503679,CA +1138503680,1138507775,US +1138507776,1138508575,CA +1138508576,1138508591,IT +1138508592,1138509823,CA +1138509824,1138510847,IN +1138510848,1138515967,CA +1138515968,1138528255,US +1138528256,1138528511,CA +1138528512,1138544895,US +1138544896,1138545151,GB +1138545152,1138552319,US +1138552320,1138552575,CA +1138552576,1138555135,US +1138555136,1138555391,NL +1138555392,1138556159,US +1138556160,1138556671,NL +1138556672,1138569215,US +1138569216,1138573311,CA +1138573312,1138593791,US +1138593792,1138597887,CA +1138597888,1138704383,US +1138704384,1138716671,CA +1138716672,1138720767,US +1138720768,1138728959,CA +1138728960,1138774015,US +1138774016,1138778111,CA +1138778112,1138780671,US +1138780672,1138780679,CA +1138780680,1138786303,US +1138786304,1138819071,PR +1138819072,1138851839,CA +1138851840,1138917375,US +1138917376,1138937855,CA +1138937856,1138940415,US +1138940416,1138940671,CA +1138940672,1138941951,US +1138941952,1138950143,CA +1138950144,1138951679,US +1138951680,1138951935,GB +1138951936,1138956799,US +1138956800,1138957311,CA +1138957312,1138957823,US +1138957824,1138958079,NL +1138958080,1138958335,CA +1138958336,1138970111,US +1138970112,1138970367,IN +1138970368,1138974719,US +1138974720,1138974975,MX +1138974976,1138975231,US +1138975232,1138976767,MX +1138976768,1138977791,US +1138977792,1138978047,FR +1138978048,1138978303,IT +1138978304,1138978815,HK +1138978816,1138980863,DE +1138980864,1138982911,CN +1138982912,1139146751,US +1139146752,1139154943,GT +1139154944,1139167231,JM +1139167232,1139167743,US +1139167744,1139168255,PR +1139168256,1139169279,US +1139169280,1139169791,PR +1139169792,1139179519,US +1139179520,1139195903,CA +1139195904,1139216383,US +1139216384,1139220479,CA +1139220480,1139265535,US +1139265536,1139269631,CA +1139269632,1145099519,US +1145099520,1145099551,SA +1145099552,1145099567,US +1145099568,1145099697,SA +1145099698,1145099699,US +1145099700,1145099775,SA +1145099776,1145188351,US +1145188352,1145192447,CA +1145192448,1145242111,US +1145242112,1145242367,NO +1145242368,1145244159,US +1145244160,1145244415,NO +1145244416,1145249791,US +1145249792,1145257983,CA +1145257984,1145259247,US +1145259248,1145259251,AE +1145259252,1145286655,US +1145286656,1145287167,SG +1145287168,1145287679,US +1145287680,1145287935,SG +1145287936,1145288191,US +1145288192,1145288447,SG +1145288448,1145307135,US +1145307136,1145311231,CA +1145311232,1145376767,US +1145376768,1145380863,CA +1145380864,1145405439,US +1145405440,1145413631,CA +1145413632,1145421823,US +1145421824,1145430015,CA +1145430016,1145475071,US +1145475072,1145479167,CA +1145479168,1145503743,US +1145503744,1145520127,CA +1145520128,1150287871,US +1150287872,1150812159,CA +1150812160,1151867903,US +1151867904,1151868927,CA +1151868928,1151889407,US +1151889408,1151892703,CA +1151892704,1151892711,DZ +1151892712,1151897599,CA +1151897600,1152073727,US +1152073728,1152077823,CA +1152077824,1152085152,US +1152085153,1152085168,KN +1152085169,1152114687,US +1152114688,1152117759,CA +1152117760,1152117952,IL +1152117953,1152117953,CA +1152117954,1152118015,IL +1152118016,1152122879,CA +1152122880,1152581631,US +1152581632,1152614399,CA +1152614400,1152778239,US +1152778240,1152843775,CA +1152843776,1156071423,US +1156071424,1156079615,CA +1156079616,1156243455,US +1156243456,1156245503,CA +1156245504,1156249599,US +1156249600,1156250623,CA +1156250624,1156296703,US +1156296704,1156300799,CA +1156300800,1157660671,US +1157660672,1157664767,CA +1157664768,1157666815,US +1157666816,1157693439,CA +1157693440,1157753087,US +1157753088,1157753343,GB +1157753344,1157755247,US +1157755248,1157755263,GR +1157755264,1157758207,US +1157758208,1157758463,RU +1157758464,1157910527,US +1157910528,1157910543,CA +1157910544,1157910551,US +1157910552,1157910575,CA +1157910576,1157910591,US +1157910592,1157910615,CA +1157910616,1157910623,US +1157910624,1157910639,CA +1157910640,1157910655,US +1157910656,1157910831,CA +1157910832,1157910847,US +1157910848,1157910863,CA +1157910864,1157910879,US +1157910880,1157911071,CA +1157911072,1157911103,US +1157911104,1157911343,CA +1157911344,1157911351,US +1157911352,1157911775,CA +1157911776,1157911791,US +1157911792,1157911927,CA +1157911928,1157911935,US +1157911936,1157911951,CA +1157911952,1157911983,US +1157911984,1157912015,CA +1157912016,1157912031,US +1157912032,1157912347,CA +1157912348,1157912348,US +1157912349,1157912391,CA +1157912392,1157912399,US +1157912400,1157912447,CA +1157912448,1157912463,US +1157912464,1157912647,CA +1157912648,1157912671,US +1157912672,1157912703,CA +1157912704,1157912735,US +1157912736,1157912743,CA +1157912744,1157912751,US +1157912752,1157912815,CA +1157912816,1157912823,US +1157912824,1157912831,CA +1157912832,1157912839,US +1157912840,1157912895,CA +1157912896,1157912911,US +1157912912,1157913039,CA +1157913040,1157913047,FI +1157913048,1157913087,CA +1157913088,1157913119,US +1157913120,1157913231,CA +1157913232,1157913247,US +1157913248,1157913279,CA +1157913280,1157913295,US +1157913296,1157913439,CA +1157913440,1157913455,US +1157913456,1157913471,CA +1157913472,1157913487,US +1157913488,1157913495,CA +1157913496,1157913503,US +1157913504,1157913583,CA +1157913584,1157913599,US +1157913600,1157913631,CA +1157913632,1157913647,US +1157913648,1157913663,CA +1157913664,1157913679,US +1157913680,1157913759,CA +1157913760,1157913775,US +1157913776,1157913919,CA +1157913920,1157913943,US +1157913944,1157914031,CA +1157914032,1157914047,US +1157914048,1157914079,CA +1157914080,1157914095,US +1157914096,1157914143,CA +1157914144,1157914175,US +1157914176,1157914183,CA +1157914184,1157914191,US +1157914192,1157914194,CA +1157914195,1157914202,IN +1157914203,1157914207,CA +1157914208,1157914223,US +1157914224,1157914239,CA +1157914240,1157914255,US +1157914256,1157914303,CA +1157914304,1157914335,US +1157914336,1157914351,CA +1157914352,1157914367,US +1157914368,1157914623,CA +1157914624,1157931007,US +1157931008,1157935103,BS +1157935104,1157943295,US +1157943296,1157947391,CA +1157947392,1158120959,US +1158120960,1158121215,GB +1158121216,1158148095,US +1158148096,1158152191,CA +1158152192,1158183467,US +1158183468,1158183468,GB +1158183469,1158234111,US +1158234112,1158250495,CA +1158250496,1158295807,US +1158295808,1158296063,GB +1158296064,1158316031,US +1158316032,1158324223,CA +1158324224,1158340607,US +1158340608,1158344703,CA +1158344704,1158348799,US +1158348800,1158381567,CA +1158381568,1158422527,US +1158422528,1158423551,CA +1158423552,1158427647,US +1158427648,1158428159,CA +1158428160,1158440959,US +1158440960,1158441215,CA +1158441216,1158441471,US +1158441472,1158441983,CA +1158441984,1158443007,DM +1158443008,1158774783,US +1158774784,1158784703,CA +1158784704,1158784767,US +1158784768,1158791167,CA +1158791168,1158799359,BM +1158799360,1158807551,CA +1158807552,1158995967,US +1158995968,1159004159,CA +1159004160,1159213055,US +1159213056,1159217151,CA +1159217152,1159249919,US +1159249920,1159254015,PR +1159254016,1159262475,US +1159262476,1159262479,SA +1159262480,1159262487,US +1159262488,1159262491,SA +1159262492,1159269119,US +1159269120,1159269375,AR +1159269376,1159274495,US +1159274496,1159274751,GB +1159274752,1159281919,US +1159281920,1159282175,GB +1159282176,1159300607,US +1159300608,1159300863,SE +1159300864,1159341103,US +1159341104,1159341111,BR +1159341112,1159348223,US +1159348224,1159356415,CA +1159356416,1159421951,US +1159421952,1159430143,CA +1159430144,1159477247,US +1159477248,1159477248,AM +1159477249,1159477503,HK +1159477504,1159480063,US +1159480064,1159480319,CA +1159480320,1159483903,US +1159483904,1159484415,CA +1159484416,1159512063,US +1159512064,1159516271,CA +1159516272,1159516287,US +1159516288,1159516415,CA +1159516416,1159516671,US +1159516672,1159518767,CA +1159518768,1159518775,US +1159518776,1159518975,CA +1159518976,1159519231,US +1159519232,1159520383,CA +1159520384,1159520511,US +1159520512,1159523327,CA +1159523328,1159523583,US +1159523584,1159525119,CA +1159525120,1159525375,US +1159525376,1159526399,CA +1159526400,1159526655,US +1159526656,1159527167,CA +1159527168,1159527423,US +1159527424,1159528191,CA +1159528192,1159668479,US +1159668480,1159668735,CA +1159668736,1159685377,US +1159685378,1159685379,NL +1159685380,1159694591,US +1159694592,1159694847,CA +1159694848,1159700479,US +1159700480,1159725055,CA +1159725056,1160011775,US +1160011776,1160019967,CA +1160019968,1160364031,US +1160364032,1160368127,CA +1160368128,1160392703,US +1160392704,1160392959,CA +1160392960,1160393727,US +1160393728,1160396799,CA +1160396800,1160405759,US +1160405760,1160406015,DO +1160406016,1160406319,US +1160406320,1160406335,DO +1160406336,1160409423,US +1160409424,1160409439,PT +1160409440,1160409599,US +1160409600,1160410111,CO +1160410112,1160410511,US +1160410512,1160410519,EC +1160410520,1160410551,US +1160410552,1160410559,EC +1160410560,1160425471,US +1160425472,1160429567,CA +1160429568,1160547839,US +1160547840,1160548351,MX +1160548352,1160563199,US +1160563200,1160563711,MP +1160563712,1160609791,US +1160609792,1160610815,MX +1160610816,1160662015,US +1160662016,1160662271,CN +1160662272,1160665599,US +1160665600,1160665855,CH +1160665856,1160667135,US +1160667136,1160675327,CA +1160675328,1160683519,US +1160683520,1160691711,CA +1160691712,1160847359,US +1160847360,1160855551,CA +1160855552,1160863999,US +1160864000,1160864255,CA +1160864256,1160921087,US +1160921088,1160925183,AG +1160925184,1160945663,US +1160945664,1160953855,CA +1160953856,1161019391,US +1161019392,1161035775,CA +1161035776,1161052671,US +1161052672,1161052927,GB +1161052928,1161053439,US +1161053440,1161053695,GB +1161053696,1161163263,US +1161163264,1161163519,NL +1161163520,1161293823,US +1161293824,1161297919,CA +1161297920,1161363455,US +1161363456,1161367551,CA +1161367552,1161416703,US +1161416704,1161420799,CA +1161420800,1161421311,AG +1161421312,1161421823,AI +1161421824,1161422079,AG +1161422080,1161422335,VG +1161422336,1161422591,LC +1161422592,1161422847,AG +1161422848,1161424127,LC +1161424128,1161424383,AI +1161424384,1161424895,KN +1161424896,1161425151,VG +1161425152,1161425407,DM +1161425408,1161425663,AG +1161425664,1161425919,AI +1161425920,1161426943,AG +1161426944,1161427199,AI +1161427200,1161427455,VG +1161427456,1161428223,AG +1161428224,1161428991,KN +1161428992,1161429031,CA +1161429032,1161429039,SE +1161429040,1161429111,CA +1161429112,1161429135,US +1161429136,1161429175,CA +1161429176,1161429199,US +1161429200,1161429215,CA +1161429216,1161429255,US +1161429256,1161429295,CA +1161429296,1161429327,US +1161429328,1161429335,CA +1161429336,1161429351,US +1161429352,1161429375,CA +1161429376,1161429407,US +1161429408,1161429431,CA +1161429432,1161429439,US +1161429440,1161429535,CA +1161429536,1161429543,US +1161429544,1161429551,CA +1161429552,1161429583,US +1161429584,1161429647,CA +1161429648,1161429663,US +1161429664,1161429695,CA +1161429696,1161429711,US +1161429712,1161429719,FI +1161429720,1161429727,US +1161429728,1161429759,CA +1161429760,1161429775,US +1161429776,1161429855,CA +1161429856,1161429863,US +1161429864,1161429887,CA +1161429888,1161429903,US +1161429904,1161429999,CA +1161430000,1161430015,US +1161430016,1161430023,FI +1161430024,1161430111,CA +1161430112,1161430159,US +1161430160,1161430191,CA +1161430192,1161430207,US +1161430208,1161430431,CA +1161430432,1161430447,US +1161430448,1161430455,CA +1161430456,1161430463,US +1161430464,1161430527,CA +1161430528,1161430543,US +1161430544,1161430559,CA +1161430560,1161430567,US +1161430568,1161430575,CA +1161430576,1161430591,US +1161430592,1161430727,CA +1161430728,1161430735,FI +1161430736,1161430799,CA +1161430800,1161430815,US +1161430816,1161430847,CA +1161430848,1161430911,US +1161430912,1161430943,CA +1161430944,1161430975,US +1161430976,1161430991,CA +1161430992,1161431007,US +1161431008,1161431039,CA +1161431040,1161431295,CN +1161431296,1161432063,US +1161432064,1161432831,CA +1161432832,1161433087,US +1161433088,1161437183,CA +1161437184,1161453567,US +1161453568,1161457663,CA +1161457664,1161576447,US +1161576448,1161580543,CA +1161580544,1161617407,US +1161617408,1161625599,CA +1161625600,1161631623,US +1161631624,1161631631,KW +1161631632,1161631839,US +1161631840,1161631871,AT +1161631872,1161632071,US +1161632072,1161632075,AT +1161632076,1161649407,US +1161649408,1161649663,AR +1161649664,1161764863,US +1161764864,1161773055,CA +1161773056,1161777151,SZ +1161777152,1161818111,US +1161818112,1161822207,CA +1161822208,1161830852,US +1161830853,1161830853,BZ +1161830854,1161835230,US +1161835231,1161835231,PH +1161835232,1161835948,US +1161835949,1161835949,BZ +1161835950,1161837567,US +1161837568,1161837823,JP +1161837824,1161884927,US +1161884928,1161884959,DE +1161884960,1161885183,US +1161885184,1161885199,JP +1161885200,1161885215,US +1161885216,1161885255,JP +1161885256,1161885695,US +1161885696,1161886207,JP +1161886208,1161887023,US +1161887024,1161887055,NO +1161887056,1161887231,US +1161887232,1161887743,AU +1161887744,1161925631,US +1161925632,1161925887,EC +1161925888,1161926399,US +1161926400,1161926655,EC +1161926656,1162018815,US +1162018816,1162022911,CA +1162022912,1162027007,US +1162027008,1162031103,ZA +1162031104,1162032287,US +1162032288,1162032303,BE +1162032304,1162059775,US +1162059776,1162067967,CA +1162067968,1162215423,US +1162215424,1162280959,CA +1162280960,1162297343,US +1162297344,1162305535,CA +1162305536,1162461183,US +1162461184,1162461695,BB +1162461696,1162462207,GD +1162462208,1162462975,BB +1162462976,1162463999,VC +1162464000,1162465279,BB +1162465280,1162465535,GD +1162465536,1162470911,BB +1162470912,1162471423,GD +1162471424,1162472703,BB +1162472704,1162473471,VC +1162473472,1162475007,GD +1162475008,1162477567,BB +1162477568,1162715135,US +1162715136,1162723327,CA +1162723328,1162806527,US +1162806528,1162806783,PR +1162806784,1162807295,US +1162807296,1162808063,PR +1162808064,1162808319,LC +1162808320,1162809343,PR +1162809344,1162811391,US +1162811392,1162811647,CW +1162811648,1162812159,US +1162812160,1162812415,DO +1162812416,1162813439,BS +1162813440,1162823679,US +1162823680,1162825727,GT +1162825728,1162831871,US +1162831872,1162833919,PR +1162833920,1162835967,GT +1162835968,1162836223,BS +1162836224,1162836735,CW +1162836736,1162836991,US +1162836992,1162838015,BS +1162838016,1162840063,PR +1162840064,1162853375,US +1162853376,1162854399,PR +1162854400,1162858495,JM +1162858496,1162870783,US +1162870784,1162871295,BB +1162871296,1162878975,LC +1162878976,1162882559,DM +1162882560,1162883839,GD +1162883840,1162884863,BB +1162884864,1162885887,VC +1162885888,1162887167,BB +1162887168,1162925983,US +1162925984,1162926015,AU +1162926016,1162926071,US +1162926072,1162926079,AU +1162926080,1163386367,US +1163386368,1163386879,CA +1163386880,1163399167,US +1163399168,1163399423,WS +1163399424,1163400959,US +1163400960,1163401215,BD +1163401216,1163401471,US +1163401472,1163401727,ID +1163401728,1163407359,US +1163407360,1163411455,CA +1163411456,1163468799,US +1163468800,1163469055,PR +1163469056,1163469311,US +1163469312,1163472895,PR +1163472896,1163479295,US +1163479296,1163479551,CA +1163479552,1163526143,US +1163526144,1163529215,CA +1163529216,1163529727,US +1163529728,1163529983,CA +1163529984,1163530239,US +1163530240,1163534335,CA +1163534336,1163534591,US +1163534592,1163555839,CA +1163555840,1163556095,US +1163556096,1163556863,CA +1163556864,1163557119,US +1163557120,1163558911,CA +1163558912,1163561215,US +1163561216,1163561471,CA +1163561472,1163563007,US +1163563008,1163563999,CA +1163564000,1163564031,US +1163564032,1163565567,CA +1163565568,1163565823,US +1163565824,1163566335,CA +1163566336,1163567103,US +1163567104,1163569407,CA +1163569408,1163569919,US +1163569920,1163570943,CA +1163570944,1163571199,US +1163571200,1163573343,CA +1163573344,1163573375,US +1163573376,1163573439,CA +1163573440,1163573503,IN +1163573504,1163573775,CA +1163573776,1163573791,US +1163573792,1163574015,CA +1163574016,1163574031,US +1163574032,1163574143,CA +1163574144,1163574159,US +1163574160,1163574207,CA +1163574208,1163574356,US +1163574357,1163574359,CA +1163574360,1163574527,US +1163574528,1163574879,CA +1163574880,1163574895,US +1163574896,1163575007,CA +1163575008,1163575039,US +1163575040,1163575295,IN +1163575296,1163577599,CA +1163577600,1163577855,US +1163577856,1163579391,CA +1163579392,1163579455,US +1163579456,1163579463,CA +1163579464,1163579471,US +1163579472,1163579487,CA +1163579488,1163579519,US +1163579520,1163579647,CA +1163579648,1163579663,US +1163579664,1163579683,CA +1163579684,1163579710,US +1163579711,1163579727,CA +1163579728,1163579735,US +1163579736,1163579807,CA +1163579808,1163579839,US +1163579840,1163580415,CA +1163580416,1163580543,US +1163580544,1163580819,CA +1163580820,1163580830,US +1163580831,1163581375,CA +1163581376,1163581399,US +1163581400,1163581407,CA +1163581408,1163581423,US +1163581424,1163583487,CA +1163583488,1163584255,US +1163584256,1163584511,CA +1163584512,1163584767,US +1163584768,1163586303,CA +1163586304,1163586559,US +1163586560,1163587327,CA +1163587328,1163587583,US +1163587584,1163589631,CA +1163589632,1163590655,US +1163590656,1163590751,CA +1163590752,1163590783,US +1163590784,1163591679,CA +1163591680,1163808767,US +1163808768,1163812863,MV +1163812864,1167851519,US +1167851520,1168113663,CA +1168113664,1168121855,MM +1168121856,1168138239,US +1168138240,1168146431,JM +1168146432,1168211967,US +1168211968,1168220159,CA +1168220160,1168228863,US +1168228864,1168229119,AU +1168229120,1168229375,HK +1168229376,1168229631,JP +1168229632,1168269887,US +1168269888,1168269951,GB +1168269952,1168279295,US +1168279296,1168279359,CA +1168279360,1168420863,US +1168420864,1168424959,CA +1168424960,1168461823,US +1168461824,1168465919,CA +1168465920,1168474111,US +1168474112,1168486399,CA +1168486400,1168486911,US +1168486912,1168487167,CA +1168487168,1168488447,US +1168488448,1168488703,CA +1168488704,1168490495,US +1168490496,1168506879,CA +1168506880,1168510975,US +1168510976,1168515071,CA +1168515072,1168535551,US +1168535552,1168539647,CA +1168539648,1168593151,US +1168593152,1168593279,CA +1168593280,1168670719,US +1168670720,1168687103,CA +1168687104,1168697599,US +1168697600,1168697855,GB +1168697856,1168698111,NL +1168698112,1168698367,GB +1168698368,1168727551,US +1168727552,1168727807,ES +1168727808,1168850943,US +1168850944,1168851967,HK +1168851968,1168855039,CA +1168855040,1168859135,US +1168859136,1168863231,CA +1168863232,1168867327,US +1168867328,1168875519,CA +1168882548,1168882548,US +1168883712,1168916479,US +1168916480,1168924671,HK +1168924672,1168932863,IT +1168932864,1168936959,US +1168936960,1168951295,CA +1168951296,1168951807,US +1168951808,1168953599,CA +1168953600,1168954047,US +1168954048,1168954079,CA +1168954080,1168954367,US +1168954368,1168954623,CA +1168954624,1168954687,US +1168954688,1168954751,CA +1168954752,1168955076,US +1168955077,1168955093,CA +1168955094,1168955647,US +1168955648,1168956927,CA +1168956928,1168957183,US +1168957184,1168957311,IN +1168957312,1168958495,CA +1168958496,1168958527,US +1168958528,1168958559,IN +1168958560,1168958719,CA +1168958720,1168958847,US +1168958848,1168958975,CA +1168958976,1168959231,US +1168959232,1168959359,CA +1168959360,1168959481,US +1168959482,1168959487,CA +1168959488,1168960511,US +1168960512,1168962567,CA +1168962568,1168962575,US +1168962576,1168965631,CA +1168965632,1168973823,US +1168973824,1168982015,CA +1168982016,1169031167,US +1169031168,1169035263,CA +1169035264,1169203199,US +1169203200,1169211391,CA +1169211392,1170190335,US +1170190336,1170190847,GB +1170190848,1170191103,JP +1170191104,1170191359,US +1170191360,1170191871,DE +1170191872,1170192383,HK +1170192384,1170227199,US +1170227200,1170231295,NL +1170231296,1170350079,US +1170350080,1170355199,CA +1170355200,1170357247,US +1170357248,1170358271,CA +1170358272,1170374655,AE +1170374656,1170382847,US +1170382848,1170386943,HK +1170386944,1170461135,US +1170461136,1170461151,SV +1170461152,1170461183,US +1170461184,1170461695,CO +1170461696,1170467839,US +1170467840,1170468351,DO +1170468352,1170470911,US +1170470912,1170470946,ES +1170470947,1170470947,US +1170470948,1170471167,ES +1170471168,1170472959,US +1170472960,1170481151,CA +1170481152,1170489343,US +1170489344,1170497535,CA +1170497536,1170505727,US +1170505728,1170522111,CA +1170522112,1175977983,US +1175977984,1176068167,CA +1176068168,1176068175,US +1176068176,1176068191,CA +1176068192,1176068207,US +1176068208,1176502271,CA +1176502272,1176616959,US +1176616960,1176627775,CA +1176627776,1176628223,US +1176628224,1176631551,CA +1176631552,1176632063,US +1176632064,1176632319,CA +1176632320,1176632575,US +1176632576,1176632831,GB +1176632832,1176643583,US +1176643584,1176645631,NL +1176645632,1176731647,US +1176731648,1176735743,PR +1176735744,1176736767,US +1176736768,1176737023,CR +1176737024,1176738303,US +1176738304,1176739071,CO +1176739072,1176739583,US +1176739584,1176739839,CO +1176739840,1176743935,CA +1176743936,1176752127,US +1176752128,1176756223,CA +1176756224,1176764415,US +1176764416,1176768511,PM +1176768512,1176771583,US +1176771584,1176771839,GB +1176771840,1176776703,US +1176776704,1176780799,CA +1176780800,1176864255,US +1176864256,1176864319,JP +1176864320,1176864767,US +1176864768,1176865535,PR +1176865536,1176868095,US +1176868096,1176868351,AU +1176868352,1176868863,BR +1176868864,1176895487,US +1176895488,1176897047,CA +1176897048,1176897055,US +1176897056,1176900735,CA +1176900736,1176900743,US +1176900744,1176904871,CA +1176904872,1176904879,US +1176904880,1176907927,CA +1176907928,1176907935,GB +1176907936,1176910343,CA +1176910344,1176910351,CR +1176910352,1176917831,CA +1176917832,1176917839,AU +1176917840,1176925007,CA +1176925008,1176925015,NG +1176925016,1176928255,CA +1176928256,1177000703,US +1177000704,1177000711,CA +1177000712,1177000719,US +1177000720,1177000735,CA +1177000736,1177000751,US +1177000752,1177000759,CA +1177000760,1177022975,US +1177022976,1177023231,GB +1177023232,1177030655,US +1177030656,1177033727,AG +1177033728,1177059327,US +1177059328,1177061375,CA +1177061376,1177062143,US +1177062144,1177075455,CA +1177075456,1177164415,US +1177164416,1177164543,CA +1177164544,1177164863,US +1177164864,1177164895,CA +1177164896,1177165055,US +1177165056,1177165087,CA +1177165088,1177354239,US +1177354240,1177359615,PR +1177359616,1177359871,US +1177359872,1177419775,PR +1177419776,1177550847,US +1177550848,1178075135,CA +1178075136,1178599423,US +1178599424,1179910143,CA +1179910144,1191673855,US +1191673856,1191706623,CA +1191706624,1192232127,US +1192232128,1192232159,PA +1192232160,1192296447,US +1192296448,1192361983,CA +1192361984,1192427519,US +1192427520,1192460287,CA +1192460288,1192468479,US +1192468480,1192476671,CA +1192476672,1192488959,US +1192488960,1192493055,CA +1192493056,1207975935,US +1207975936,1207980031,CA +1207980032,1208008703,US +1208008704,1208016895,CA +1208016896,1208020991,US +1208020992,1208025087,CA +1208025088,1208050943,US +1208050944,1208051199,CA +1208051200,1208074239,US +1208074240,1208082431,CA +1208082432,1208090623,US +1208090624,1208107007,CA +1208107008,1208590335,US +1208590336,1208598527,CA +1208598528,1208647679,US +1208647680,1208659967,CA +1208659968,1208721407,US +1208721408,1208729599,CA +1208729600,1208770559,US +1208770560,1208774655,CA +1208774656,1208778751,US +1208778752,1208795135,CA +1208795136,1208852479,US +1208852480,1208860671,CA +1208860672,1208918015,US +1208918016,1208922111,CA +1208922112,1208935935,US +1208935936,1208935943,AU +1208935944,1208935951,IN +1208935952,1208935959,SG +1208935960,1208935967,HK +1208935968,1208935975,KR +1208935976,1208935983,TW +1208935984,1208935991,IN +1208935992,1208935999,JP +1208936000,1208936003,HK +1208936004,1208936007,US +1208936008,1208936015,ID +1208936016,1208936023,US +1208936024,1208936039,IN +1208936040,1208936047,JP +1208936048,1208936191,US +1208936192,1208936199,AU +1208936200,1208936207,SG +1208936208,1208936215,HK +1208936216,1208936223,IN +1208936224,1208936231,KR +1208936232,1208936239,TW +1208936240,1208936247,JP +1208936248,1208936255,IN +1208936256,1208936263,MY +1208936264,1208936295,US +1208936296,1208936299,HK +1208936300,1208936311,US +1208936312,1208936313,ID +1208936314,1208954879,US +1208954880,1208958975,CA +1208958976,1208975359,US +1208975360,1208983551,CA +1208983552,1209358591,US +1209358592,1209358847,DE +1209358848,1209359103,GB +1209359104,1209434111,US +1209434112,1209436671,BB +1209436672,1209437183,VC +1209437184,1209440767,BB +1209440768,1209441279,GD +1209441280,1209442303,BB +1209442304,1209647103,US +1209647104,1209663487,CA +1209663488,1209718783,US +1209718784,1209719807,NL +1209719808,1209720831,SG +1209720832,1209729023,US +1209729024,1209786367,JM +1209786368,1209810943,US +1209810944,1209819135,CA +1209819136,1209823487,US +1209823488,1209823519,GB +1209823520,1209823543,US +1209823544,1209823551,GB +1209823552,1209824447,US +1209824448,1209824511,GB +1209824512,1209862143,US +1209862144,1209862399,CA +1209862400,1209863423,US +1209863424,1209863679,IN +1209863680,1209884679,US +1209884680,1209884687,ES +1209884688,1209917439,US +1209917440,1209925631,CA +1209925632,1210254935,US +1210254936,1210254943,CA +1210254944,1210257407,US +1210257408,1210261503,CA +1210261504,1210314751,US +1210314752,1210315007,GB +1210315008,1210315775,US +1210315776,1210316031,GB +1210316032,1210316287,US +1210316288,1210316543,NL +1210316544,1210316799,US +1210316800,1210317823,ID +1210317824,1210318335,HK +1210318336,1210420223,US +1210420224,1210420479,IT +1210420480,1210421503,US +1210421504,1210421551,CA +1210421552,1210449919,US +1210449920,1210580991,CA +1210580992,1210847231,US +1210847232,1210851327,BR +1210851328,1210865262,US +1210865263,1210865270,MY +1210865271,1210925055,US +1210925056,1210941439,CA +1210941440,1210994687,US +1210994688,1210997759,CA +1210997760,1211032271,US +1211032272,1211032287,DO +1211032288,1211033087,US +1211033088,1211033599,CO +1211033600,1211236351,US +1211236352,1211269119,PR +1211269120,1211301887,US +1211301888,1211303167,CA +1211303168,1211303423,US +1211303424,1211304959,CA +1211304960,1211305983,US +1211305984,1211306655,CA +1211306656,1211306687,US +1211306688,1211307007,CA +1211307008,1211308031,US +1211308032,1211312522,CA +1211312523,1211312523,US +1211312524,1211315199,CA +1211315200,1211315455,US +1211315456,1211315615,CA +1211315616,1211315647,US +1211315648,1211315663,CA +1211315664,1211315679,US +1211315680,1211317759,CA +1211317760,1211318015,US +1211318016,1211318271,CA +1211318272,1211321343,BB +1211321344,1211322367,VC +1211322368,1211322623,BB +1211322624,1211324415,GD +1211324416,1211324927,VC +1211324928,1211333119,BB +1211333120,1211333631,VC +1211333632,1211333887,GD +1211333888,1211334655,VG +1211334656,1211367935,US +1211367936,1211368191,CA +1211368192,1211368447,EE +1211368448,1211390981,US +1211390982,1211390982,DE +1211390983,1211390989,US +1211390990,1211390990,DE +1211390991,1211391216,US +1211391217,1211391217,IT +1211391218,1211432959,US +1211432960,1211473919,CA +1211473920,1211596799,US +1211596800,1211605999,CA +1211606000,1211606003,US +1211606004,1211613183,CA +1211613184,1216872447,US +1216872448,1217396735,CA +1217396736,1218674687,US +1218674688,1218699263,IN +1218699264,1218705407,HK +1218705408,1218706431,CN +1218706432,1218707455,HK +1218707456,1218987263,US +1218987264,1218987519,CA +1218987520,1219256319,US +1219256320,1219264511,CA +1219264512,1219272703,US +1219272704,1219276799,CA +1219276800,1219290623,US +1219290624,1219290751,AU +1219290752,1219295295,US +1219295296,1219295359,GR +1219295360,1224094463,US +1224094464,1224094719,NL +1224094720,1224104959,US +1224104960,1224105471,NL +1224105472,1224118271,US +1224118272,1224119807,NL +1224119808,1224124415,US +1224124416,1224126463,NL +1224126464,1224138751,US +1224138752,1224140799,NL +1224140800,1224157695,US +1224157696,1224158207,NL +1224158208,1224167935,US +1224167936,1224169471,NL +1224169472,1224169983,US +1224169984,1224171519,NL +1224171520,1224190975,US +1224190976,1224193023,NL +1224193024,1224193535,US +1224193536,1224193791,NL +1224193792,1224194047,US +1224194048,1224194559,NL +1224194560,1224196095,US +1224196096,1224196607,NL +1224196608,1224197119,US +1224197120,1224198143,NL +1224198144,1224200191,US +1224200192,1224200959,NL +1224200960,1224201215,US +1224201216,1224202239,NL +1224202240,1224327167,US +1224327168,1224327295,NL +1224327296,1224327935,US +1224327936,1224327943,CA +1224327944,1224328063,US +1224328064,1224328191,NL +1224328192,1224329215,US +1224329216,1224329471,CA +1224329472,1224331263,US +1224331264,1224333311,PR +1224333312,1224470527,US +1224470528,1224471567,NL +1224471568,1224471568,RU +1224471569,1224473599,NL +1224473600,1224474623,US +1224474624,1224475647,GT +1224475648,1224476671,US +1224476672,1224478719,SX +1224478720,1224480767,US +1224480768,1224484863,JM +1224484864,1224493055,GT +1224493056,1224497151,US +1224497152,1224501247,GT +1224501248,1224523520,JM +1224523521,1224523558,US +1224523559,1224523559,JM +1224523560,1224523775,US +1224523776,1224540159,JM +1224540160,1224671231,US +1224671232,1224687615,PK +1224687616,1224728575,US +1224728576,1224736767,HK +1224736768,1241743359,US +1241743360,1241759743,CA +1241759744,1242300415,US +1242300416,1242562559,CA +1242562560,1244659711,US +1244659712,1244790783,CA +1244790784,1244831743,US +1244831744,1244839935,CA +1244839936,1244844031,US +1244844032,1244846079,MM +1244846080,1244848127,US +1244848128,1244852223,CA +1244852224,1244864511,US +1244864512,1244872703,CA +1244872704,1245183999,US +1245184000,1245446143,CA +1245446144,1246890431,US +1246890432,1246890463,CA +1246890464,1246890464,US +1246890465,1246890495,CA +1246890496,1246895103,US +1246895104,1246895615,NL +1246895616,1246902783,US +1246902784,1246903039,NL +1246903040,1246904575,US +1246904576,1246905343,CA +1246905344,1246905599,US +1246905600,1246912511,CA +1246912512,1246923519,US +1246923520,1246923775,AU +1246923776,1246937087,US +1246937088,1246945279,CA +1246945280,1247101439,US +1247101440,1247101695,CA +1247101696,1247123967,US +1247123968,1247124223,CA +1247124224,1247124479,US +1247124480,1247124991,PR +1247124992,1247129599,US +1247129600,1247133695,NL +1247133696,1247498239,US +1247498240,1247502335,CA +1247502336,1248864255,US +1248864256,1248866303,CA +1248866304,1248877311,US +1248877312,1248877567,CA +1248877568,1248885759,US +1248885760,1248886783,CA +1248886784,1248899071,US +1248899072,1248900095,CA +1248900096,1248902143,US +1248902144,1248902655,CA +1248902656,1248913407,US +1248913408,1248915455,MF +1248915456,1248919551,US +1248919552,1248920575,CA +1248920576,1248922623,US +1248922624,1248923647,CA +1248923648,1248924671,US +1248924672,1248925695,CA +1248925696,1248936959,US +1248936960,1248939007,CA +1248939008,1248946175,US +1248946176,1248947199,VG +1248947200,1248964607,US +1248964608,1248966655,CA +1248966656,1248971007,US +1248971008,1248971263,CA +1248971264,1248979711,US +1248979712,1248979967,IE +1248979968,1248997375,US +1248997376,1248998399,ID +1248998400,1249003519,US +1249003520,1249005567,CA +1249005568,1249010687,US +1249010688,1249011711,CA +1249011712,1249019903,US +1249019904,1249020927,CA +1249020928,1249023999,US +1249024000,1249025023,CA +1249025024,1249029119,US +1249029120,1249030143,CA +1249030144,1249036287,US +1249036288,1249037311,TC +1249037312,1249038335,US +1249038336,1249040383,CA +1249040384,1249046527,US +1249046528,1249047551,BM +1249047552,1249059327,US +1249059328,1249059839,CA +1249059840,1249099775,US +1249099776,1249101823,CA +1249101824,1249102847,PR +1249102848,1249103103,US +1249103104,1249103871,CA +1249103872,1249106943,US +1249106944,1249107967,CA +1249107968,1249130495,US +1249130496,1249131519,JM +1249131520,1249139711,US +1249139712,1249140268,MF +1249140269,1249140269,FR +1249140270,1249140735,MF +1249140736,1249142015,US +1249142016,1249142271,GB +1249142272,1249146879,US +1249146880,1249147903,CA +1249147904,1249160703,US +1249160704,1249161215,GB +1249161216,1249163263,US +1249163264,1249165311,CA +1249165312,1249171455,US +1249171456,1249173503,CA +1249173504,1249191935,US +1249191936,1249193983,CA +1249193984,1249195007,US +1249195008,1249196031,CA +1249196032,1249203199,US +1249203200,1249204223,GD +1249204224,1249210367,US +1249210368,1249212415,KY +1249212416,1249217535,US +1249217536,1249218559,CA +1249218560,1249227263,US +1249227264,1249227519,VG +1249227520,1249234687,US +1249234688,1249234943,GB +1249234944,1249236991,US +1249236992,1249239039,KY +1249239040,1249245183,US +1249245184,1249247231,CA +1249247232,1249256447,US +1249256448,1249257471,CA +1249257472,1249260543,US +1249260544,1249261567,CA +1249261568,1249267711,US +1249267712,1249268735,AF +1249268736,1249272831,US +1249272832,1249273855,CA +1249273856,1249310719,US +1249310720,1249311743,CA +1249311744,1249312767,US +1249312768,1249313791,CA +1249313792,1249335295,US +1249335296,1249337343,CA +1249337344,1249359871,US +1249359872,1249361919,CA +1249361920,1249379327,US +1249379328,1249380351,CA +1249380352,1249384447,US +1249384448,1249386495,PR +1249386496,1249391615,US +1249391616,1249392639,CA +1249392640,1249396735,US +1249396736,1249398783,CA +1249398784,1249409023,US +1249409024,1249410047,CA +1249410048,1249434623,US +1249434624,1249435647,CA +1249435648,1249452031,US +1249452032,1249453055,CA +1249453056,1249474559,US +1249474560,1249475583,CA +1249475584,1249479167,US +1249479168,1249479423,FR +1249479424,1249479679,US +1249479680,1249479935,CH +1249479936,1249480191,HK +1249480192,1249484799,US +1249484800,1249486847,CA +1249486848,1249506303,US +1249506304,1249507327,CA +1249507328,1249522687,US +1249522688,1249523711,CA +1249523712,1249531903,US +1249531904,1249533951,GD +1249533952,1249542143,US +1249542144,1249544191,CA +1249544192,1249545215,US +1249546240,1249562623,US +1249562624,1249564671,CA +1249564672,1249571839,US +1249571840,1249572863,CA +1249572864,1249576959,US +1249576960,1249577983,CA +1249577984,1249587199,US +1249587200,1249588223,PR +1249588224,1249592319,US +1249592320,1249593343,CA +1249593344,1249598463,US +1249598464,1249599487,CA +1249599488,1249710143,US +1249710144,1249710207,CN +1249710208,1249710271,NL +1249710272,1249710591,BE +1249710592,1249716479,US +1249716480,1249716735,TW +1249716736,1249717759,US +1249717760,1249718015,FI +1249718016,1249718271,BE +1249718272,1249720319,US +1249720320,1249720351,AU +1249720352,1249720367,JP +1249720368,1249720511,AU +1249720512,1249720527,IN +1249720528,1249720575,AU +1249720576,1249720591,FR +1249720592,1249720599,AU +1249720600,1249720607,DE +1249720608,1249720663,AU +1249720664,1249720671,SE +1249720672,1249720703,AU +1249720704,1249720707,GB +1249720708,1249720711,AU +1249720712,1249720719,NL +1249720720,1249720751,AU +1249720752,1249720767,GB +1249720768,1249720831,AU +1249720832,1249721343,US +1249721344,1249721351,AT +1249721352,1249721359,BE +1249721360,1249721367,CH +1249721368,1249721375,CZ +1249721376,1249721407,DE +1249721408,1249721415,ES +1249721416,1249721423,FI +1249721424,1249721431,FR +1249721432,1249721439,HU +1249721440,1249721447,IE +1249721448,1249721455,IT +1249721456,1249721463,NL +1249721464,1249721471,NO +1249721472,1249721479,PL +1249721480,1249721487,PT +1249721488,1249721495,SE +1249721496,1249721503,GB +1249721504,1249721511,KE +1249721512,1249721519,TR +1249721520,1249721527,ZA +1249721528,1249721535,DK +1249721536,1249721539,PL +1249721540,1249721543,US +1249721544,1249721551,GB +1249721552,1249721599,US +1249721600,1249721607,AT +1249721608,1249721615,BE +1249721616,1249721623,CH +1249721624,1249721631,CZ +1249721632,1249721647,DE +1249721648,1249721655,DK +1249721656,1249721663,ES +1249721664,1249721671,FI +1249721672,1249721679,FR +1249721680,1249721687,HU +1249721688,1249721695,IE +1249721696,1249721703,IT +1249721704,1249721711,NL +1249721712,1249721719,NO +1249721720,1249721727,PL +1249721728,1249721735,PT +1249721736,1249721743,SE +1249721744,1249721751,GB +1249721752,1249721759,DE +1249721760,1249721767,FR +1249721768,1249721775,IE +1249721776,1249721783,RU +1249721784,1249721791,GB +1249721792,1249721799,KE +1249721800,1249721807,TR +1249721808,1249721815,ZA +1249721816,1249721825,US +1249721826,1249721827,IL +1249721828,1249721833,US +1249721834,1249721835,GB +1249721836,1249722111,US +1249722112,1249722367,IN +1249722368,1249724671,US +1249724672,1249724694,BE +1249724695,1249724695,US +1249724696,1249724927,BE +1249724928,1249725183,FI +1249725184,1249726207,US +1249726208,1249726463,FI +1249726464,1249726719,US +1249726720,1249726975,IE +1249726976,1249734655,US +1249734656,1249734911,FI +1249734912,1249752319,US +1249752320,1249752575,BE +1249752576,1249754111,US +1249754112,1249754367,IE +1249754368,1249754390,US +1249754391,1249754391,DE +1249754392,1249754623,US +1249754624,1249754879,SG +1249754880,1249796095,US +1249796096,1249804287,CA +1249804288,1249851903,US +1249851904,1249852159,FR +1249852160,1249886207,US +1249886208,1249902591,CA +1249902592,1254490111,US +1254490112,1254555647,CA +1254555648,1254621183,US +1254621184,1254629375,CA +1254629376,1254653439,US +1254653440,1254653695,CA +1254653696,1254978751,US +1254978752,1254978767,LB +1254978768,1254989823,US +1254989824,1254998015,CA +1254998016,1255002111,US +1255002112,1255006207,CA +1255006208,1255011583,US +1255011584,1255011839,CA +1255011840,1255047167,US +1255047168,1255055359,CA +1255055360,1255210495,US +1255210496,1255210751,DE +1255210752,1255264511,US +1255264512,1255264767,SG +1255264768,1255274495,US +1255274496,1255274751,SG +1255274752,1255276543,US +1255276544,1255342079,CA +1255342080,1255367167,US +1255367168,1255367423,DE +1255367424,1255489535,US +1255489536,1255505919,PR +1255505920,1255514111,US +1255514112,1255522303,CA +1255522304,1255571455,US +1255571456,1255579647,CA +1255579648,1255588351,US +1255588352,1255588607,NL +1255588608,1255669759,US +1255669760,1255735295,CA +1255735296,1255770367,US +1255770368,1255770623,CA +1255770624,1255792127,US +1255792128,1255792383,IL +1255792384,1255972863,US +1255972864,1255981055,CA +1255981056,1256001535,US +1256001536,1256005631,CA +1256005632,1256030207,US +1256030208,1256034303,CA +1256034304,1256054399,US +1256054400,1256054783,CZ +1256054784,1256079359,US +1256079360,1256087551,KY +1256087552,1263525887,US +1263525888,1263534079,CA +1263534080,1264717823,US +1264717824,1264718079,CA +1264718080,1264718719,US +1264718720,1264718847,CA +1264718848,1264719103,US +1264719104,1264719871,CA +1264719872,1264746495,US +1264746496,1264750591,CA +1264750592,1264762879,US +1264762880,1264766975,CA +1264766976,1264991311,US +1264991312,1264991319,JP +1264991320,1265073535,US +1265073536,1265073551,KN +1265073552,1266147327,US +1266147328,1266155519,CA +1266155520,1268252671,US +1268252672,1268776959,CA +1268776960,1274692607,US +1274692608,1274692863,IN +1274692864,1275600895,US +1275600896,1275604991,BM +1275604992,1275621375,US +1275621376,1275625471,CA +1275625472,1275658239,US +1275658240,1275658495,GB +1275658496,1275659007,US +1275659008,1275659263,GB +1275659264,1275665151,US +1275665152,1275665407,UA +1275665408,1275666431,US +1275666432,1275674623,CA +1275674624,1275707391,US +1275707392,1275711487,CA +1275711488,1275712511,US +1275712512,1275715583,CA +1275715584,1275756543,US +1275756544,1275772927,CA +1275772928,1275789311,US +1275789312,1275822079,CA +1275822080,1275912759,US +1275912760,1275912783,CA +1275912784,1279262719,US +1279262720,1279787007,CA +1279787008,1279848447,US +1279848448,1279852543,PR +1279852544,1279950847,US +1279950848,1279956319,CA +1279956320,1279956335,US +1279956336,1279956367,CA +1279956368,1279956383,US +1279956384,1279956991,CA +1279956992,1279959551,US +1279959552,1279959807,CA +1279959808,1279960063,US +1279960064,1279960575,CA +1279960576,1279961855,US +1279961856,1279961967,CA +1279961968,1279961975,US +1279961976,1279962215,CA +1279962216,1279962223,US +1279962224,1279962335,CA +1279962336,1279962367,US +1279962368,1279963135,CA +1279963136,1279963391,US +1279963392,1279963455,CA +1279963456,1279963519,US +1279963520,1279963647,CA +1279963648,1279963775,US +1279963776,1279963999,CA +1279964000,1279964095,US +1279964096,1279964415,CA +1279964416,1279964671,US +1279964672,1279966207,CA +1279966208,1279967231,US +1279967232,1279968767,CA +1279968768,1279969279,US +1279969280,1279971327,CA +1279971328,1279971583,US +1279971584,1279972095,CA +1279972096,1279973375,US +1279973376,1279973887,CA +1279973888,1279973951,US +1279973952,1279973983,CA +1279973984,1279974015,IN +1279974016,1279974143,US +1279974144,1279974399,CA +1279974400,1279974479,US +1279974480,1279974511,CA +1279974512,1279974655,US +1279974656,1279975343,CA +1279975344,1279975359,US +1279975360,1279981567,CA +1279981568,1279999999,US +1280000000,1280032767,CA +1280032768,1280040959,US +1280040960,1280049151,CA +1280049152,1280073727,US +1280073728,1280081919,CA +1280081920,1280090111,US +1280090112,1280091135,AG +1280091136,1280092159,VG +1280092160,1280093183,KN +1280093184,1280094207,VG +1280094208,1280095231,AI +1280095232,1280095487,KN +1280095488,1280097279,AG +1280097280,1280097791,LC +1280097792,1280098303,AG +1280098304,1280102399,PR +1280102400,1280126975,US +1280126976,1280131071,JP +1280131072,1280139263,CA +1280139264,1280242175,US +1280242176,1280243199,CA +1280243200,1291845631,US +1291845632,1292894207,DE +1292894208,1293156351,NO +1293156352,1293549567,DE +1293549568,1293680639,ES +1293680640,1293811711,MK +1293811712,1293942783,SA +1293942784,1294000127,PL +1294000128,1294004223,CH +1294004224,1294073855,PL +1294073856,1294204927,RU +1294204928,1294237695,RO +1294237696,1294270463,IR +1294270464,1294299135,DE +1294299136,1294303231,IR +1294303232,1294335999,RU +1294336000,1294368767,SI +1294368768,1294401535,LV +1294401536,1294434303,RU +1294434304,1294467071,IT +1294467072,1294499839,RU +1294499840,1294532607,NO +1294532608,1294598143,RU +1294598144,1294630911,IR +1294630912,1294663679,LB +1294663680,1294696447,IT +1294696448,1294729215,RU +1294729216,1294761983,GB +1294761984,1294794751,SY +1294794752,1294827519,PL +1294827520,1294860287,RU +1294860288,1294893055,PL +1294893056,1294925823,RS +1294925824,1294958591,DE +1294958592,1294991359,UA +1294991360,1295024639,CZ +1295024640,1295025151,SK +1295025152,1295047679,CZ +1295047680,1295048191,SK +1295048192,1295056895,CZ +1295056896,1295122431,GR +1295122432,1295253503,RU +1295253504,1295319039,UA +1295319040,1295384575,SE +1295384576,1295450111,PT +1295450112,1295515647,PL +1295515648,1295777791,CH +1295777792,1296039935,NL +1296039936,1296072703,SA +1296072704,1296105471,DE +1296105472,1296171007,PL +1296171008,1296203775,DK +1296203776,1296236543,RU +1296236544,1296236671,FR +1296236672,1296236799,US +1296236800,1296237055,IE +1296237056,1296237311,FR +1296237312,1296237439,IE +1296237440,1296237567,IT +1296237568,1296237823,IE +1296237824,1296237824,GB +1296237825,1296237825,IE +1296237826,1296237826,GB +1296237827,1296237878,IE +1296237879,1296237879,GB +1296237880,1296238591,IE +1296238592,1296239103,NL +1296239104,1296239231,IE +1296239232,1296239359,NL +1296239360,1296240383,DE +1296240384,1296241791,IE +1296241792,1296241919,NL +1296241920,1296242303,IE +1296242304,1296242431,NL +1296242432,1296242927,IE +1296242928,1296242943,GB +1296242944,1296242975,IE +1296242976,1296243007,ES +1296243008,1296243111,IE +1296243112,1296243119,GB +1296243120,1296243455,IE +1296243456,1296243711,DE +1296243712,1296244223,US +1296244224,1296244479,NL +1296244480,1296244991,IE +1296244992,1296245247,CH +1296245248,1296245503,IE +1296245504,1296245759,NL +1296245760,1296246783,IE +1296246784,1296247295,NL +1296247296,1296247807,DE +1296247808,1296247999,IE +1296248000,1296248015,ES +1296248016,1296248447,IE +1296248448,1296248575,DE +1296248576,1296248703,IE +1296248704,1296248831,FR +1296248832,1296249023,IE +1296249024,1296249087,GB +1296249088,1296249279,IE +1296249280,1296249343,DE +1296249344,1296249407,IE +1296249408,1296249423,GB +1296249424,1296249439,IE +1296249440,1296249455,GB +1296249456,1296249463,IT +1296249464,1296249471,GB +1296249472,1296249567,IE +1296249568,1296249599,NO +1296249600,1296249615,GB +1296249616,1296249747,IE +1296249748,1296249751,GB +1296249752,1296249823,IE +1296249824,1296249855,FR +1296249856,1296250239,IE +1296250240,1296250271,FR +1296250272,1296250367,IE +1296250368,1296250399,CZ +1296250400,1296250431,DE +1296250432,1296250463,PL +1296250464,1296250495,RO +1296250496,1296250527,IE +1296250528,1296250559,DK +1296250560,1296250847,IE +1296250848,1296250879,GB +1296250880,1296251199,IE +1296251200,1296251231,NL +1296251232,1296251391,IE +1296251392,1296251775,NL +1296251776,1296252479,IE +1296252480,1296252487,ES +1296252488,1296252503,IE +1296252504,1296252507,DE +1296252508,1296252535,IE +1296252536,1296252543,IT +1296252544,1296252551,FR +1296252552,1296252571,IE +1296252572,1296252575,DE +1296252576,1296252591,IE +1296252592,1296252595,GB +1296252596,1296252599,IE +1296252600,1296252607,GB +1296252608,1296252615,NL +1296252616,1296252623,ES +1296252624,1296252647,IE +1296252648,1296252655,GB +1296252656,1296252667,IE +1296252668,1296252671,GB +1296252672,1296252871,IE +1296252872,1296252879,DE +1296252880,1296254207,IE +1296254208,1296254463,US +1296254464,1296256839,IE +1296256840,1296256847,US +1296256848,1296258303,IE +1296258304,1296258559,NL +1296258560,1296258815,US +1296258816,1296259071,NL +1296259072,1296259839,IE +1296259840,1296260095,NL +1296260096,1296260351,US +1296260352,1296261119,IE +1296261120,1296261631,DE +1296261632,1296262383,IE +1296262384,1296262399,IN +1296262400,1296262655,US +1296262656,1296263431,IE +1296263432,1296263439,FR +1296263440,1296263523,IE +1296263524,1296263527,CH +1296263528,1296263679,IE +1296263680,1296263935,US +1296263936,1296264263,IE +1296264264,1296264271,GB +1296264272,1296264287,IE +1296264288,1296264303,US +1296264304,1296265175,IE +1296265176,1296265183,RS +1296265184,1296267263,IE +1296267264,1296267341,DE +1296267342,1296267342,GB +1296267343,1296268287,DE +1296268288,1296268389,IE +1296268390,1296268391,GB +1296268392,1296268799,IE +1296268800,1296269055,FR +1296269056,1296269311,US +1296269312,1296302079,BY +1296302080,1296334847,GB +1296334848,1296367615,DK +1296367616,1296400383,GR +1296400384,1296433151,BH +1296433152,1296465919,BG +1296465920,1296467535,LU +1296467536,1296467543,CD +1296467544,1296469759,LU +1296469760,1296478207,FR +1296478208,1296482077,US +1296482078,1296482078,NO +1296482079,1296482303,US +1296482304,1296483071,GB +1296483072,1296498175,US +1296498176,1296498687,FR +1296498688,1296531455,BG +1296531456,1296564223,MT +1296564224,1296566271,GB +1296566272,1296568319,DE +1296568320,1296570367,RU +1296570368,1296574463,IT +1296574464,1296576511,FR +1296576512,1296578559,DK +1296578560,1296580607,FI +1296580608,1296582655,CH +1296582656,1296584703,IE +1296584704,1296585215,RU +1296585216,1296585983,GB +1296585984,1296586239,BG +1296586240,1296586751,RU +1296586752,1296588799,FR +1296588800,1296590847,SE +1296590848,1296592895,ES +1296592896,1296594943,NL +1296594944,1296596991,RU +1296596992,1296599039,DE +1296599040,1296601087,RU +1296601088,1296605183,NL +1296605184,1296607231,AT +1296607232,1296609279,NL +1296609280,1296611327,CH +1296611328,1296613375,TR +1296613376,1296615423,IT +1296615424,1296617471,GB +1296617472,1296619519,ES +1296619520,1296621567,DE +1296621568,1296623615,SE +1296623616,1296625663,BE +1296625664,1296629759,RU +1296629760,1296633855,GB +1296635904,1296637951,RU +1296640000,1296642047,ES +1296642048,1296644095,RU +1296644096,1296646143,IT +1296646144,1296648191,RU +1296648192,1296650239,GB +1296650240,1296652287,ES +1296652288,1296654335,RU +1296654336,1296656383,BE +1296656384,1296658431,RU +1296658432,1296662527,GB +1296662528,1296664575,KZ +1296664576,1296666623,RU +1296666624,1296670719,GB +1296670720,1296672767,ES +1296672768,1296674815,GB +1296674816,1296676863,BE +1296676864,1296677295,JE +1296677296,1296677303,NG +1296677304,1296677639,JE +1296677640,1296677647,NG +1296677648,1296677727,JE +1296677728,1296677735,NG +1296677736,1296678791,JE +1296678792,1296678799,NG +1296678800,1296678903,JE +1296678904,1296678911,NG +1296678912,1296680959,SA +1296680960,1296683007,ES +1296683008,1296685055,IE +1296685056,1296687103,TR +1296687104,1296689151,NL +1296689152,1296691199,RU +1296691200,1296693247,CH +1296693248,1296695295,DE +1296695296,1296697343,CH +1296697344,1296699391,RU +1296699392,1296701439,IT +1296701440,1296703487,RU +1296703488,1296705535,BY +1296705536,1296707583,GE +1296707584,1296709631,NL +1296709632,1296709887,CY +1296709888,1296711679,CH +1296711680,1296713727,KZ +1296713728,1296715775,RU +1296715776,1296717823,CH +1296717824,1296719871,BE +1296719872,1296721919,CH +1296721920,1296723967,GB +1296723968,1296726015,AT +1296726016,1296728063,GB +1296728064,1296730111,SE +1296730112,1296732159,DE +1296732160,1296734207,IT +1296734208,1296736255,US +1296736256,1296738303,NO +1296738304,1296738815,CH +1296738816,1296739327,FI +1296739328,1296740351,CH +1296740352,1296744447,RU +1296744448,1296746495,GB +1296748544,1296750591,FR +1296750592,1296752639,NO +1296752640,1296754687,BA +1296754688,1296756735,DE +1296756736,1296758783,FR +1296758784,1296760831,RS +1296760832,1296764927,RU +1296764928,1296769023,AT +1296769024,1296771071,TR +1296771072,1296773119,LT +1296775168,1296779263,FR +1296779264,1296781311,CZ +1296781312,1296783359,DK +1296783360,1296785407,LB +1296785408,1296787455,IE +1296787456,1296789503,GB +1296789504,1296791551,CH +1296791552,1296793599,GB +1296793600,1296795647,RU +1296795648,1296797695,GB +1296797696,1296799743,UA +1296799744,1296801791,RU +1296801792,1296803839,DK +1296803840,1296805887,RU +1296805888,1296807935,ES +1296807936,1296812031,GB +1296812032,1296814079,DE +1296814080,1296816127,NO +1296816128,1296818175,TR +1296818176,1296820223,ES +1296820224,1296822271,GB +1296822272,1296824319,IE +1296824320,1296826367,DE +1296826368,1296842751,BG +1296842752,1296859135,GB +1296859136,1296875519,BG +1296875520,1296891903,DE +1296891904,1296908287,BG +1296908288,1296924671,IR +1296924672,1296941055,BG +1296941056,1296957439,BA +1296957440,1296973823,BG +1296973824,1296990207,CZ +1296990208,1296995839,BG +1296995840,1296996095,GB +1296996096,1296998399,BG +1296998400,1297006591,DE +1297006592,1297022975,BA +1297022976,1297039359,LT +1297039360,1297055743,TR +1297055744,1297072127,RU +1297072128,1297088511,PL +1297088512,1297121279,AT +1297121280,1297154047,SE +1297154048,1297154303,RO +1297154304,1297154559,US +1297154560,1297154815,RO +1297154816,1297155071,FR +1297155072,1297155583,RO +1297155584,1297156095,SE +1297156096,1297162239,RO +1297162240,1297166335,IR +1297166336,1297168383,RO +1297168384,1297170431,AZ +1297170432,1297170943,RO +1297170944,1297171455,GB +1297171456,1297172479,RO +1297172480,1297172991,GB +1297172992,1297173503,RO +1297173504,1297175551,IR +1297175552,1297176319,GB +1297176320,1297176831,RO +1297176832,1297177599,GB +1297177600,1297177855,QA +1297177856,1297178111,US +1297178112,1297178367,QA +1297178368,1297178623,RO +1297178624,1297178879,NL +1297178880,1297181439,RO +1297181440,1297181695,GB +1297181696,1297181951,RO +1297181952,1297182207,DE +1297182208,1297182463,NL +1297182464,1297182719,RO +1297182720,1297184767,ES +1297184768,1297185279,BZ +1297185280,1297185791,RO +1297185792,1297185919,NL +1297185920,1297186815,US +1297186816,1297188863,IR +1297188864,1297190143,RO +1297190144,1297190399,ES +1297190400,1297190655,RO +1297190656,1297190911,IT +1297190912,1297195007,IR +1297195008,1297195135,NL +1297195136,1297196031,US +1297196032,1297196799,RO +1297196800,1297197055,CN +1297197056,1297199103,ES +1297199104,1297202175,RO +1297202176,1297202687,SE +1297202688,1297202943,RO +1297202944,1297203199,GB +1297203200,1297211391,IR +1297211392,1297215487,IT +1297215488,1297217535,NL +1297217536,1297219583,AZ +1297219584,1297285119,RU +1297350656,1297416191,FR +1297416192,1297481727,BG +1297481728,1297514495,GB +1297514496,1297547263,FI +1297547264,1297549311,PL +1297549312,1297551359,LT +1297551360,1297553407,SA +1297553408,1297555455,IE +1297555456,1297559551,UA +1297559552,1297561599,DE +1297561600,1297563647,NL +1297563648,1297565695,RU +1297565696,1297567743,PL +1297567744,1297569791,RU +1297569792,1297571839,RO +1297571840,1297573887,RU +1297573888,1297575935,FR +1297575936,1297577983,RU +1297577984,1297580031,PL +1297580032,1297582079,CH +1297582080,1297584127,PL +1297584128,1297588223,UA +1297588224,1297590271,NL +1297590272,1297592319,RU +1297592320,1297594367,GB +1297594368,1297596415,DE +1297596416,1297598463,UA +1297598464,1297602559,RU +1297602560,1297604607,PL +1297604608,1297606655,DE +1297606656,1297610751,CZ +1297610752,1297612799,DE +1297612800,1297615231,RU +1297615232,1297615359,DE +1297615360,1297624831,RU +1297624832,1297625087,US +1297625088,1297629183,RU +1297629184,1297645567,NO +1297645568,1297661951,PL +1297661952,1297670143,UA +1297670144,1297674239,GB +1297674240,1297678335,UA +1297678336,1297694719,IT +1297694720,1297711103,PL +1297711104,1297727487,GB +1297727488,1297743871,MD +1297743872,1297760255,DE +1297760256,1297776639,LT +1297776640,1297782783,DE +1297782784,1297793023,PT +1297793024,1297809407,UA +1297809408,1297825791,PL +1297825792,1297838079,RU +1297838080,1297838335,LU +1297838336,1297842175,RU +1297842176,1297858559,UA +1297858560,1297860607,RU +1297860608,1297862655,PT +1297862656,1297864703,FI +1297864704,1297866751,SE +1297866752,1297868799,RU +1297868800,1297870847,DE +1297870848,1297872895,FR +1297872896,1297874943,GB +1297874944,1297879039,CY +1297879040,1297880063,TR +1297880064,1297883135,CY +1297883136,1297891327,PL +1297891328,1297899519,GB +1297899520,1297915903,TR +1297915904,1297924095,BH +1297924096,1297932287,CZ +1297932288,1297940479,GE +1297940480,1297948671,LV +1297948672,1297956863,UA +1297956864,1297965055,NL +1297965056,1297973247,RU +1297973248,1297981439,GB +1297981440,1297989631,RO +1297989632,1297997823,CZ +1297997824,1298006015,IT +1298006016,1298006783,RU +1298006784,1298014207,KZ +1298014208,1298017279,LT +1298017280,1298018303,BY +1298018304,1298020351,LT +1298020352,1298022399,BY +1298022400,1298030591,IT +1298030592,1298038783,RU +1298038784,1298046975,SI +1298046976,1298063359,RU +1298063360,1298065407,FR +1298065408,1298067455,NO +1298067456,1298071551,NL +1298071552,1298073599,TJ +1298073600,1298075647,RU +1298075648,1298077695,CY +1298077696,1298079743,NL +1298079744,1298081791,GB +1298081792,1298083839,CZ +1298083840,1298085887,PL +1298085888,1298087935,KG +1298087936,1298089983,FR +1298089984,1298092031,NO +1298092032,1298094079,GB +1298094080,1298096127,RU +1298096128,1298098175,NL +1298098176,1298100223,SE +1298100224,1298102271,GB +1298102272,1298104319,CH +1298104320,1298106367,RU +1298106368,1298108415,IT +1298108416,1298110463,FI +1298110464,1298112511,ES +1298112512,1298114559,IE +1298114560,1298116607,IT +1298116608,1298118655,GB +1298118656,1298120703,AM +1298120704,1298122751,CZ +1298122752,1298124799,RU +1298124800,1298126847,IT +1298126848,1298127871,SA +1298127872,1298128127,IR +1298128128,1298128895,SA +1298128896,1298130943,NL +1298130944,1298131455,BG +1298131456,1298132991,PL +1298132992,1298135039,FI +1298135040,1298137087,NL +1298137088,1298661375,GB +1298661376,1298677759,FR +1298677760,1298694143,IR +1298694144,1298708223,US +1298708224,1298708479,NL +1298708480,1298708735,US +1298708736,1298708991,SG +1298708992,1298710527,US +1298710528,1298726911,CZ +1298726912,1298743295,RS +1298743296,1298757631,FI +1298757632,1298759679,FJ +1298759680,1298776063,RU +1298776064,1298792447,SE +1298792448,1298825215,RU +1298825216,1298841599,NO +1298841600,1298857983,RU +1298857984,1298874367,SE +1298874368,1298907135,GB +1298907136,1298923519,IE +1298923520,1298939903,IT +1298939904,1298956287,RU +1298956288,1298972671,GB +1298972672,1298989055,RU +1298989056,1299005439,UA +1299005440,1299008767,NL +1299008768,1299009023,BE +1299009024,1299010047,NL +1299010048,1299011583,BE +1299011584,1299013631,NL +1299013632,1299015679,BE +1299015680,1299017727,NL +1299017728,1299019775,BE +1299019776,1299020031,NL +1299020032,1299021055,BE +1299021056,1299021823,NL +1299021824,1299025148,CH +1299025149,1299025149,DE +1299025150,1299026111,CH +1299026112,1299026127,ES +1299026128,1299038207,CH +1299038208,1299054591,FI +1299054592,1299070975,SE +1299070976,1299087359,SA +1299087360,1299103743,HU +1299103744,1299104255,NO +1299104256,1299104511,SJ +1299104512,1299120127,NO +1299120128,1299136511,SI +1299136512,1299169279,HU +1299169280,1299171327,GB +1299171328,1299172351,US +1299172352,1299173375,GB +1299173376,1299174399,FR +1299174400,1299178495,GB +1299178496,1299180543,CH +1299180544,1299181567,GB +1299181568,1299182591,DK +1299182592,1299183103,SE +1299183104,1299183359,NO +1299183360,1299183615,SE +1299183616,1299185663,FR +1299185664,1299447807,PL +1299447808,1299709951,AT +1299709952,1299724287,UA +1299724288,1299725311,RU +1299725312,1299779071,UA +1299779072,1299779327,RU +1299779328,1299783679,UA +1299783680,1299791871,RU +1299791872,1299935231,UA +1299935232,1299937279,BG +1299937280,1299959807,UA +1299959808,1299963903,RU +1299963904,1299971071,UA +1299971072,1299972095,RU +1299972096,1300234239,IL +1300234240,1300824063,FR +1300824064,1300874239,IL +1300874240,1300889599,FR +1300889600,1301020671,IL +1301020672,1301774847,FR +1301774848,1301774975,GP +1301774976,1302331391,FR +1302331392,1303379967,NL +1303379968,1304428543,DE +1304428544,1305477119,FR +1305477120,1305739263,ES +1305739264,1306001407,DK +1306001408,1306132479,HR +1306132480,1306140671,SE +1306140672,1306148863,EE +1306148864,1306198015,SE +1306198016,1306206207,LV +1306206208,1306214399,HR +1306214400,1306222591,LT +1306222592,1306230783,HR +1306230784,1306263551,LT +1306263552,1306271743,KE +1306271744,1306279935,RU +1306279936,1306288127,IT +1306288128,1306296319,AT +1306296320,1306312703,RU +1306312704,1306315775,UZ +1306315776,1306316031,KG +1306316032,1306316287,RU +1306316288,1306316799,KZ +1306316800,1306317823,RU +1306317824,1306318847,NL +1306318848,1306320895,RU +1306320896,1306329087,DE +1306329088,1306337279,BA +1306337280,1306345471,HU +1306345472,1306353663,LT +1306353664,1306361855,SA +1306361856,1306370047,RU +1306370048,1306378239,GB +1306378240,1306386431,RU +1306386432,1306394623,DK +1306394624,1306402815,ME +1306402816,1306411007,RU +1306411008,1306419199,NL +1306419200,1306427391,RU +1306427392,1306435583,UA +1306435584,1306451967,NO +1306451968,1306460159,PL +1306460160,1306468351,IT +1306468352,1306476543,FI +1306476544,1306492927,RU +1306492928,1306501119,TR +1306501120,1306509311,NO +1306509312,1306525695,PL +1306525696,1307049983,ES +1307049984,1307066367,RU +1307068870,1307068870,CH +1307074560,1307082751,SA +1307082752,1307092991,RU +1307092992,1307095039,GB +1307095040,1307097087,SA +1307097088,1307099135,RU +1307099136,1307107327,RO +1307107328,1307115519,DE +1307115520,1307123711,RU +1307123712,1307131903,NL +1307131904,1307140095,EE +1307140096,1307148287,FR +1307148288,1307156479,GB +1307156480,1307172863,RU +1307172864,1307181055,DK +1307181056,1307189247,RU +1307189248,1307191295,DE +1307191296,1307191551,CZ +1307191552,1307192063,US +1307192064,1307192319,GB +1307192320,1307192575,US +1307192576,1307192755,DE +1307192756,1307192756,AF +1307192757,1307192831,DE +1307192832,1307193343,US +1307193344,1307195391,NO +1307195392,1307197439,CH +1307197440,1307205631,HU +1307205632,1307213823,FI +1307213824,1307222015,SI +1307222016,1307230207,DK +1307230208,1307238399,RU +1307238400,1307246591,SK +1307246592,1307254783,KG +1307254784,1307262975,NL +1307262976,1307271167,AT +1307271168,1307279359,MD +1307279360,1307287551,LB +1307287552,1307295743,DE +1307295744,1307303935,RU +1307303936,1307312127,SE +1307312128,1307320319,PL +1307320320,1307336703,RU +1307336704,1307344895,DE +1307344896,1307353087,RU +1307353088,1307361279,BG +1307361280,1307369471,CZ +1307369472,1307377663,RU +1307377664,1307385855,PL +1307385856,1307394047,AT +1307394048,1307402239,IR +1307402240,1307410431,HR +1307410432,1307418623,CZ +1307418624,1307426815,IR +1307426816,1307435007,CH +1307435008,1307435263,DE +1307435264,1307435327,AL +1307435328,1307435391,ME +1307435392,1307435519,SK +1307435520,1307435647,RU +1307435648,1307435775,LT +1307435776,1307436543,DE +1307436544,1307436799,AU +1307436800,1307437055,US +1307437056,1307441151,ES +1307441152,1307442175,NL +1307442176,1307443199,DE +1307443200,1307451391,IT +1307451392,1307459583,SE +1307459584,1307467775,BG +1307467776,1307469823,RU +1307469824,1307475967,IR +1307475968,1307484159,RU +1307484160,1307492351,GB +1307492352,1307500543,BA +1307500544,1307508735,RU +1307508736,1307516927,BA +1307516928,1307525119,CH +1307525120,1307533311,BA +1307533312,1307535871,GB +1307535872,1307536127,US +1307536128,1307541503,GB +1307541504,1307549695,IT +1307549696,1307557887,UA +1307557888,1307574271,RU +1307574272,1307578367,GB +1307578368,1307582463,FI +1307582464,1307586559,KZ +1307586560,1307590655,GB +1307590656,1307594751,SE +1307594752,1307598847,SA +1307598848,1307602943,CZ +1307602944,1307607039,ES +1307607040,1307611135,SA +1307611136,1307619327,RU +1307619328,1307623423,CZ +1307623424,1307627519,FR +1307627520,1307631615,SE +1307631616,1307635711,IT +1307635712,1307636735,EE +1307636736,1307637759,LV +1307637760,1307639807,LT +1307639808,1307643903,IT +1307643904,1307652095,RU +1307652096,1307656191,ES +1307656192,1307660287,JO +1307660288,1307662335,BE +1307662336,1307662351,NL +1307662352,1307662359,GB +1307662360,1307662367,FR +1307662368,1307664383,BE +1307664384,1307668479,NO +1307668480,1307672575,ES +1307672576,1307676671,DK +1307676672,1307680767,RU +1307680768,1307684863,LV +1307684864,1307688959,GB +1307688960,1307693055,LT +1307693056,1307697151,IT +1307697152,1307701247,NL +1307701248,1307709439,RU +1307709440,1307713535,AL +1307713536,1307717631,IT +1307717632,1307721727,GE +1307721728,1307725823,AT +1307725824,1307729919,CZ +1307729920,1307734015,RU +1307734016,1307738111,NL +1307738112,1307742207,IT +1307742208,1307746303,HU +1307746304,1307750399,UA +1307750400,1307754495,IT +1307754496,1307758591,GB +1307758592,1307758847,SM +1307758848,1307761931,IT +1307761932,1307761932,SM +1307761933,1307762687,IT +1307762688,1307766783,PL +1307766784,1307770879,GB +1307770880,1307774975,RU +1307774976,1307779071,RS +1307779072,1307787263,DK +1307787264,1307791359,MT +1307795456,1307803647,RU +1307803648,1307807743,DK +1307807744,1307811839,SE +1307811840,1307815935,NL +1307816192,1307816703,GB +1307816960,1307817215,NL +1307817216,1307817219,DE +1307817220,1307817223,CZ +1307817224,1307817231,DE +1307817232,1307817251,CZ +1307817252,1307817255,HU +1307817256,1307817259,CZ +1307817260,1307817447,DE +1307817448,1307817455,PT +1307817456,1307817471,DE +1307817728,1307817935,DE +1307817936,1307817943,GR +1307817944,1307817983,DE +1307817984,1307818048,GB +1307818049,1307818049,BE +1307818050,1307818239,GB +1307818496,1307818503,IT +1307818752,1307819263,GB +1307819264,1307819287,NL +1307819288,1307819331,DE +1307819332,1307819343,NL +1307819344,1307819355,DE +1307819356,1307819395,NL +1307819396,1307819399,DE +1307819400,1307819407,NL +1307819408,1307819431,DE +1307819432,1307819439,FI +1307819440,1307819447,LU +1307819448,1307819519,NL +1307819520,1307819775,GB +1307819776,1307820031,BE +1307820032,1307824127,ES +1307824128,1307828223,HU +1307828224,1307832319,NL +1307832320,1307836415,RU +1307836416,1307840511,SE +1307840512,1307844607,RU +1307844608,1307848703,UA +1307848704,1307852799,CH +1307852800,1307856895,RU +1307856896,1307860991,IT +1307860992,1307865087,DE +1307865088,1307869183,AZ +1307869184,1307873279,GB +1307873280,1307877375,TJ +1307877376,1307881471,RU +1307881472,1307885567,IT +1307885568,1307889663,BG +1307889664,1307893759,RU +1307893760,1307897855,SE +1307897856,1307901951,AT +1307901952,1307906047,JO +1307906048,1307910143,CH +1307910144,1307914239,DE +1307914240,1307914495,NL +1307914496,1307914527,GB +1307914528,1307918335,NL +1307918336,1307922431,GB +1307922432,1307926527,NL +1307926528,1307930623,KZ +1307930624,1307934719,RU +1307934720,1307938815,FR +1307938816,1307941242,CY +1307941243,1307941243,TR +1307941244,1307942911,CY +1307942912,1307947007,RU +1307947008,1307951103,CH +1307951104,1307959295,RU +1307959296,1307963391,IR +1307963392,1307967487,PL +1307967488,1307971583,IT +1307971584,1307979775,GB +1307979776,1307981823,ZW +1307981824,1307983871,GB +1307983872,1307987967,LB +1307987968,1307992063,FR +1307992064,1307996159,RU +1307996160,1308000255,DE +1308000256,1308004351,CH +1308004352,1308006399,RU +1308006400,1308007423,DE +1308007424,1308008447,RU +1308008448,1308012543,GB +1308012544,1308016639,ES +1308016640,1308020735,FI +1308020736,1308024831,BG +1308024832,1308030975,RU +1308030976,1308033023,UA +1308033024,1308033685,DE +1308033686,1308033686,GB +1308033687,1308035427,DE +1308035428,1308035428,GB +1308035429,1308035839,DE +1308035840,1308036095,GB +1308036096,1308037119,DE +1308037120,1308041215,UA +1308041216,1308049407,RU +1308049408,1308053503,DK +1308053504,1308055551,DE +1308055552,1308057599,AL +1308065792,1308069887,RU +1308069888,1308073983,NO +1308073984,1308078079,RU +1308078080,1308080127,NL +1308080128,1308082175,RU +1308082176,1308084223,GB +1308084224,1308086271,RS +1308086272,1308088319,RU +1308088320,1308090367,UA +1308090368,1308092415,SK +1308092416,1308096511,RU +1308096512,1308096767,AL +1308096768,1308097535,RS +1308097536,1308098303,AL +1308098304,1308098559,RS +1308098560,1308360703,NL +1308360704,1308622847,PL +1308622848,1308884991,HR +1308884992,1309147135,IT +1309147136,1309409279,PL +1309409280,1309671423,IT +1309671424,1309933567,IE +1309933568,1310195711,BE +1310195712,1310197759,RU +1310197760,1310199807,CZ +1310199808,1310201855,IE +1310201856,1310203903,RU +1310203904,1310205951,FR +1310205952,1310207999,RU +1310208000,1310210047,MD +1310210048,1310212095,RU +1310212096,1310214143,HU +1310214144,1310214399,UA +1310214400,1310214911,GR +1310214912,1310215423,UA +1310215424,1310215679,DE +1310215680,1310216191,UA +1310216192,1310218239,IT +1310222336,1310224383,RS +1310224384,1310226431,GB +1310226432,1310228479,BE +1310228480,1310230527,FR +1310230528,1310232575,ES +1310232576,1310234623,NO +1310234624,1310236671,RU +1310236672,1310238719,PL +1310238720,1310240767,BE +1310240768,1310242815,RU +1310242816,1310244863,HU +1310244864,1310246911,EE +1310246912,1310248959,ZA +1310248960,1310251007,IM +1310251008,1310255103,RU +1310255104,1310257151,CZ +1310257152,1310259199,FR +1310259200,1310261247,GB +1310261248,1310277631,UA +1310277632,1310310399,RU +1310310400,1310326783,GB +1310326784,1310343167,NO +1310343168,1310358783,IT +1310358784,1310359039,US +1310359040,1310359551,IT +1310359552,1310392319,UA +1310392320,1310408703,NL +1310408704,1310425087,FI +1310425088,1310457855,UA +1310457856,1310474239,PL +1310474240,1310490623,EE +1310490624,1310507007,BA +1310507008,1310523391,LV +1310523392,1310556159,RU +1310556160,1310572543,PT +1310572544,1310588927,BE +1310588928,1310605311,ES +1310605312,1310621695,PL +1310621696,1310638079,RS +1310638080,1310654463,UA +1310654464,1310656511,RU +1310656512,1310657535,GB +1310657536,1310658559,SE +1310658560,1310660607,RU +1310660608,1310662655,CZ +1310662656,1310664703,DK +1310664704,1310666751,FR +1310666752,1310668799,NL +1310668800,1310670847,RO +1310670848,1310672895,DE +1310672896,1310674943,RU +1310674944,1310676991,NO +1310676992,1310679039,PL +1310679040,1310681087,RU +1310681088,1310683135,GB +1310683136,1310685183,NL +1310685184,1310687231,PL +1310687232,1310689279,RO +1310689280,1310695423,PL +1310695424,1310695935,RU +1310695936,1310696447,PL +1310696448,1310696703,RO +1310696704,1310696959,SE +1310696960,1310697471,PL +1310697472,1310699519,DE +1310699520,1310701567,UA +1310701568,1310703615,LT +1310705664,1310707711,RU +1310707712,1310707967,GB +1310707968,1310708223,PL +1310708224,1310708479,RU +1310708480,1310708735,GB +1310708736,1310708927,IE +1310708928,1310708943,GB +1310708944,1310709199,IE +1310709200,1310709215,DE +1310709216,1310709231,NL +1310709232,1310709247,IE +1310709248,1310709759,PL +1310709760,1310711807,RU +1310711808,1310713855,LT +1310715904,1310717951,RU +1310720000,1310851071,GB +1310851072,1310921103,DE +1310921104,1310921119,ES +1310921120,1310982143,DE +1310982144,1311113215,RU +1311113216,1311244287,IR +1311244288,1311246335,MK +1311248384,1311250431,GB +1311250432,1311252479,RU +1311252480,1311253479,GB +1311253480,1311253487,IT +1311253488,1311254007,GB +1311254008,1311254015,IT +1311254016,1311254319,GB +1311254320,1311254327,IT +1311254328,1311254527,GB +1311254528,1311256575,SE +1311256576,1311258623,FR +1311258624,1311260671,GB +1311260672,1311262719,NL +1311262720,1311262735,CH +1311262736,1311262767,FR +1311262768,1311264767,CH +1311264768,1311266815,RU +1311266816,1311268863,FR +1311268864,1311270911,BE +1311271936,1311272447,KZ +1311272448,1311272703,NL +1311272704,1311272959,IE +1311275008,1311277055,FR +1311277056,1311279103,IT +1311279104,1311280127,BG +1311280128,1311280383,MK +1311280384,1311281151,BG +1311281152,1311285247,GB +1311285248,1311289343,IT +1311289344,1311291391,LB +1311291392,1311293439,RU +1311293440,1311295487,NL +1311295488,1311297535,IT +1311297536,1311299583,AT +1311299584,1311301631,RU +1311301632,1311303679,TR +1311303680,1311307775,GB +1311307776,1311309823,IS +1311309824,1311311871,GG +1311311872,1311315967,CZ +1311315968,1311318015,PL +1311318016,1311320063,RU +1311320064,1311322111,FR +1311324160,1311326207,LB +1311326208,1311328255,BE +1311328256,1311330303,NL +1311332352,1311338495,RU +1311338496,1311340543,AT +1311340544,1311342591,NO +1311342592,1311344639,FR +1311344640,1311346687,NO +1311346688,1311348735,AT +1311348736,1311350783,GB +1311350784,1311352831,FR +1311352832,1311354879,SK +1311354880,1311356927,RU +1311356928,1311358975,FR +1311358976,1311361023,RU +1311361024,1311363071,NL +1311363072,1311365119,GB +1311365120,1311367167,DE +1311367168,1311369215,GB +1311369216,1311371263,FR +1311371264,1311373311,SE +1311373312,1311375359,FR +1311375360,1311506431,DE +1311506432,1311593431,CZ +1311593432,1311593432,US +1311593433,1311637503,CZ +1311637504,1312292863,DE +1312292864,1312817151,LT +1312817152,1313035071,SE +1313035072,1313035135,DK +1313035136,1313865727,SE +1313865728,1313931263,CZ +1313931264,1313996799,RU +1313996800,1314062335,SE +1314062336,1314127871,BG +1314127872,1314193407,LV +1314193408,1314258943,RU +1314258944,1314324479,GB +1314324480,1314390015,GR +1314390016,1314455551,PL +1314455552,1314521087,KW +1314521088,1314586623,BG +1314586624,1314652159,NO +1314652160,1314717695,HU +1314717696,1314783231,SA +1314783232,1314797978,DE +1314797979,1314797979,FR +1314797980,1314848767,DE +1314848768,1314914303,SA +1314914304,1315045375,RO +1315045376,1315176447,SK +1315176448,1315307519,QA +1315307520,1315438591,CZ +1315438592,1315504127,AT +1315504128,1315569663,GB +1315569664,1315700735,RU +1315700736,1315704831,SE +1315704832,1315708927,HU +1315708928,1315713023,GR +1315713024,1315717119,SE +1315717120,1315725311,RU +1315725312,1315729407,CZ +1315729408,1315729663,IE +1315730176,1315730431,NL +1315731712,1315731967,DE +1315731968,1315732223,IE +1315732224,1315732991,DE +1315732992,1315733247,NL +1315733504,1315737599,NL +1315737600,1315741695,CZ +1315741696,1315745791,LB +1315745792,1315749887,CZ +1315749888,1315753983,RU +1315758080,1315762175,FR +1315762176,1315766271,BG +1315766272,1315770367,NL +1315770368,1315774463,UA +1315774464,1315778559,RU +1315778560,1315780607,AZ +1315780608,1315782655,DE +1315782656,1315786751,AM +1315786752,1315790847,FR +1315790848,1315794943,RS +1315794944,1315803135,RU +1315803136,1315807231,KZ +1315807232,1315815423,GB +1315815424,1315819519,IR +1315819520,1315823615,DK +1315823616,1315827711,IQ +1315827712,1315831807,FR +1315831808,1315835903,SA +1315835904,1315839999,MT +1315840000,1315844095,EE +1315844096,1315848191,RU +1315848192,1315852287,BH +1315852288,1315856383,SE +1315856384,1315860479,SY +1315860480,1315864575,IR +1315864576,1315868671,CH +1315868672,1315872767,RU +1315872768,1315876863,GB +1315876864,1315880959,IT +1315880960,1315885055,BE +1315885056,1315889151,CZ +1315889152,1315893247,DE +1315893248,1315897343,RU +1315897344,1315901439,IR +1315901440,1315905535,UA +1315905536,1315906089,OM +1315906090,1315906090,BA +1315906091,1315906228,OM +1315906229,1315906229,BA +1315906230,1315909631,OM +1315909632,1315913727,AZ +1315913728,1315917823,DE +1315917824,1315921919,RU +1315921920,1315926015,TR +1315926016,1315930111,CZ +1315930112,1315934207,DE +1315934208,1315938303,RU +1315938304,1315942399,DK +1315942400,1315945030,UA +1315945031,1315945031,RU +1315945032,1315946495,UA +1315946496,1315946687,GB +1315946688,1315946727,GG +1315946728,1315946751,GB +1315946752,1315950591,GG +1315950592,1315954687,UA +1315954688,1315958783,DE +1315958784,1315962879,RU +1315962880,1317011455,FR +1317011456,1317044223,BG +1317044224,1317076991,CZ +1317076992,1317109759,BE +1317109760,1317126399,GB +1317126400,1317126655,US +1317126656,1317142527,GB +1317142528,1317175295,PT +1317175296,1317208063,BG +1317208064,1317240831,HU +1317240832,1317273599,PL +1317273600,1317306367,AT +1317306368,1317339135,RU +1317339136,1317371903,MT +1317371904,1317404671,PL +1317404672,1317437439,IT +1317437440,1317470207,HR +1317470208,1317470463,CY +1317470464,1317471231,TR +1317471232,1317472255,CY +1317472256,1317474303,TR +1317474304,1317478399,CY +1317478400,1317502975,TR +1317502976,1317535743,IE +1317535744,1317552127,GB +1317552128,1317568511,ES +1317568512,1317584895,CZ +1317584896,1317601279,RU +1317601280,1317617663,UA +1317617664,1317625855,YE +1317625856,1317627903,DE +1317627904,1317629951,RU +1317629952,1317636095,GB +1317636096,1317637119,IE +1317637120,1317642239,GB +1317642240,1317642495,IE +1317642496,1317643316,GB +1317643317,1317643317,IE +1317643318,1317645615,GB +1317645616,1317645623,IE +1317645624,1317646551,GB +1317646552,1317646559,IE +1317646560,1317647015,GB +1317647016,1317647023,IE +1317647024,1317647026,GB +1317647027,1317647027,IE +1317647028,1317650130,GB +1317650131,1317650131,IE +1317650132,1317650431,GB +1317650432,1317666815,PT +1317666816,1317667791,GB +1317667792,1317667799,NG +1317667800,1317668223,GB +1317668224,1317668231,NG +1317668232,1317669087,GB +1317669088,1317669095,CD +1317669096,1317673575,GB +1317673576,1317673583,CD +1317673584,1317676599,GB +1317676600,1317676607,AO +1317676608,1317677143,GB +1317677144,1317677151,CD +1317677152,1317678271,GB +1317678272,1317678279,CD +1317678280,1317678335,GB +1317678336,1317678343,AO +1317678344,1317678519,GB +1317678520,1317678527,GN +1317678528,1317679319,GB +1317679320,1317679327,NG +1317679328,1317679671,GB +1317679672,1317679679,AO +1317679680,1317679703,GB +1317679704,1317679711,TD +1317679712,1317679911,GB +1317679912,1317679919,CD +1317679920,1317679943,GB +1317679944,1317679951,CD +1317679952,1317679959,GB +1317679960,1317679967,GN +1317679968,1317679991,GB +1317679992,1317679999,CD +1317680000,1317680063,GB +1317680064,1317680071,AO +1317680072,1317683199,GB +1317683200,1317685247,DE +1317685248,1317686271,BE +1317686272,1317687295,NL +1317687296,1317699583,DE +1317699584,1317715967,RU +1317715968,1317732351,SA +1317732352,1317748735,HU +1317748736,1317765119,RU +1317765120,1317781503,GE +1317781504,1317814271,RU +1317814272,1317816335,DE +1317816336,1317816351,JP +1317816352,1317830655,DE +1317830656,1317847039,NL +1317847040,1317863423,RU +1317863424,1317879807,GB +1317879808,1317896191,SK +1317896192,1317912575,LU +1317912576,1317928959,GB +1317928960,1317945343,BG +1317945344,1317978111,AT +1317978112,1317994495,RU +1317994496,1318010879,DE +1318010880,1318027263,DK +1318027264,1318043647,IE +1318043648,1318051839,GB +1318051840,1318055935,PS +1318055936,1318584319,GB +1318584320,1318592511,PL +1318592512,1318593983,NL +1318593984,1318593991,GB +1318593992,1318594007,NL +1318594008,1318594015,GB +1318594016,1318594335,NL +1318594336,1318594343,US +1318594344,1318596543,NL +1318596544,1318596559,SE +1318596560,1318597343,NL +1318597344,1318597359,US +1318597360,1318599679,NL +1318599680,1318599687,IE +1318599688,1318600703,NL +1318600704,1318608895,AT +1318608896,1318617087,IT +1318617088,1318625279,FR +1318625280,1318633471,UA +1318633472,1318649855,IE +1318649856,1318658047,RU +1318658048,1318666239,SI +1318666240,1318674431,DE +1318674432,1318682623,HU +1318682624,1318690815,RU +1318690816,1318699007,DK +1318699008,1318707199,IE +1318707200,1318715391,FR +1318715392,1318723583,BG +1318723584,1318731775,IR +1318731776,1318739967,PL +1318739968,1318748159,GB +1318748160,1318756351,LV +1318756352,1318764543,UA +1318764544,1318780927,KW +1318780928,1318789119,CH +1318789120,1318797311,ME +1318797312,1318805503,SY +1318805504,1318813695,PL +1318813696,1318821887,FR +1318821888,1318838271,RU +1318838272,1318841078,IE +1318841079,1318841079,GB +1318841080,1318846463,IE +1318846464,1318854655,NO +1318854656,1318862847,CZ +1318862848,1318871039,GB +1318871040,1318879231,DK +1318879232,1318887423,CZ +1318887424,1318895615,PL +1318895616,1318897663,SE +1318897664,1318903807,DK +1318903808,1318911999,RU +1318912000,1318920191,MK +1318920192,1318928383,IR +1318928384,1318936383,LT +1318936384,1318936447,BR +1318936448,1318936575,LT +1318936576,1318944767,DK +1318944768,1318958079,CZ +1318958080,1318960127,PL +1318960128,1318961151,CZ +1318961152,1318969343,GB +1318969344,1318977535,RU +1318977536,1318985727,LT +1318985728,1319000063,GB +1319000064,1319002111,US +1319002112,1319010303,IE +1319010304,1319018495,CY +1319018496,1319026687,IR +1319026688,1319034879,UA +1319034880,1319035903,NO +1319035904,1319036927,DK +1319036928,1319038975,SE +1319038976,1319043071,NO +1319043072,1319051263,FR +1319051264,1319059455,UA +1319059456,1319067647,PL +1319067648,1319070271,DE +1319070272,1319070335,PT +1319070336,1319070975,DE +1319070976,1319071103,PL +1319071104,1319071231,DE +1319071232,1319071487,PL +1319071488,1319074815,DE +1319074816,1319074943,PL +1319074944,1319075071,DE +1319075072,1319075199,PL +1319075200,1319075839,DE +1319075840,1319084031,BG +1319084032,1319092223,KW +1319092224,1319100415,IT +1319100416,1319108607,RU +1319108608,1319530036,TR +1319530037,1319530037,GR +1319530038,1321205759,TR +1321205760,1325400063,FR +1325400064,1329594367,IT +1329594368,1330642943,GB +1330642944,1331691519,FR +1331691520,1331757055,PL +1331757056,1331822591,IE +1331822592,1331824639,IT +1331824640,1331826687,RU +1331826688,1331828735,FR +1331828736,1331830783,LT +1331830784,1331832831,GB +1331832832,1331834879,IT +1331834880,1331836927,BY +1331836928,1331838975,FR +1331838976,1331841023,ES +1331841024,1331843071,CZ +1331843072,1331845119,GB +1331845120,1331847167,RU +1331847168,1331849215,FR +1331849216,1331851263,BG +1331851264,1331853311,AL +1331853312,1331855359,AE +1331855360,1331857407,TR +1331857408,1331859455,RU +1331859456,1331861503,PL +1331861504,1331863551,CZ +1331863552,1331865599,GB +1331865600,1331869695,NL +1331871744,1331873791,DK +1331873792,1331877887,RU +1331877888,1331879935,ES +1331879936,1331881983,DE +1331881984,1331886079,GB +1331886080,1331888127,RU +1331888128,1331890175,SE +1331890176,1331892223,IT +1331892224,1331894271,RU +1331894272,1331896319,NL +1331896320,1331898367,FR +1331898368,1331900415,GB +1331900416,1331902463,RU +1331902464,1331904511,MK +1331904512,1331908607,GB +1331908608,1331910655,DE +1331912704,1331914751,DE +1331914752,1331916799,RU +1331916800,1331918847,IT +1331918848,1331920895,BE +1331920896,1331922943,NL +1331922944,1331924991,DE +1331924992,1331927039,GB +1331927040,1331929087,FI +1331929088,1331931135,FR +1331931136,1331933183,SE +1331933184,1331935231,TR +1331935232,1331937279,NL +1331937280,1331939327,GB +1331939328,1331941375,BE +1331941376,1331943423,ES +1331943424,1331945471,RU +1331945472,1331947519,SE +1331947520,1331949567,DE +1331949568,1331951615,RU +1331951616,1331953663,GE +1331953664,1332019199,BG +1332019200,1332084735,RS +1332084736,1332150271,SE +1332150272,1332215807,GR +1332215808,1332346879,RU +1332346880,1332412415,AL +1332412416,1332477951,GR +1332477952,1332609023,ES +1332609024,1332613119,PL +1332613120,1332613375,ES +1332613376,1332614143,UA +1332614144,1332614399,BY +1332614400,1332614655,NL +1332614656,1332614783,UA +1332614784,1332614911,KZ +1332614912,1332615167,RO +1332615168,1332615423,DE +1332615424,1332615679,UA +1332615680,1332616191,RO +1332616192,1332616319,GB +1332616320,1332616447,US +1332616448,1332616703,CZ +1332616704,1332616959,DE +1332616960,1332617087,RU +1332617088,1332617215,CA +1332617216,1332621311,CZ +1332625408,1332629503,RU +1332629504,1332633599,DE +1332633600,1332637695,UA +1332637696,1332641791,BG +1332641792,1332645887,UA +1332645888,1332649983,RS +1332654080,1332658175,RU +1332658176,1332662271,PL +1332662272,1332670463,UA +1332670464,1332740095,RU +1332740096,1333264383,RO +1333264384,1333297151,RU +1333297152,1333362687,HU +1333362688,1333395455,GB +1333395456,1333428223,HU +1333428224,1333460991,RU +1333460992,1333493759,GB +1333493760,1333526527,TR +1333526528,1333526783,BG +1333526784,1333527039,GB +1333527040,1333528575,BG +1333528576,1333528831,GB +1333528832,1333551103,BG +1333551104,1333559295,PL +1333559296,1333592063,UA +1333592064,1333624831,IE +1333624832,1333657599,MK +1333657600,1333690367,RU +1333690368,1333723135,MK +1333723136,1333755903,IR +1333755904,1333788671,CZ +1333788672,1334050815,GR +1334050816,1334059007,BG +1334059008,1334067199,FR +1334067200,1334075391,LV +1334075392,1334083583,RU +1334083584,1334091775,DE +1334091776,1334099967,LT +1334099968,1334108159,IR +1334108160,1334116351,BE +1334116352,1334124543,AX +1334124544,1334125055,AT +1334125056,1334127359,DE +1334127360,1334127615,AT +1334127616,1334132735,DE +1334132736,1334165503,RU +1334165504,1334173695,PL +1334173696,1334181887,LT +1334181888,1334190079,RU +1334190080,1334194175,KZ +1334194176,1334198271,BG +1334198272,1334206463,RU +1334206464,1334214655,FI +1334214656,1334222847,JO +1334222848,1334231039,BG +1334231040,1334239231,RU +1334239232,1334242303,CH +1334242304,1334242559,IS +1334242560,1334243327,CH +1334243328,1334247423,IS +1334247424,1334255615,NO +1334255616,1334263807,IT +1334263808,1334271999,RU +1334272000,1334280191,GB +1334280192,1334288383,LV +1334288384,1334296575,PL +1334296576,1334304767,UA +1334304768,1334312959,RU +1334312960,1334345727,SE +1334345728,1334378495,RU +1334378496,1334378751,FR +1334378752,1334378879,ES +1334378880,1334378887,FR +1334378888,1334378895,ES +1334378896,1334379023,FR +1334379024,1334379039,FI +1334379040,1334379071,FR +1334379072,1334379135,PL +1334379136,1334379263,FR +1334379264,1334379519,PL +1334379520,1334379971,FR +1334379972,1334379975,DE +1334379976,1334380031,FR +1334380032,1334380287,PL +1334380288,1334380447,FR +1334380448,1334380463,LT +1334380464,1334381823,FR +1334381824,1334381839,IT +1334381840,1334381887,FR +1334381888,1334381919,IT +1334381920,1334381983,FR +1334381984,1334382015,FI +1334382016,1334382975,FR +1334382976,1334383103,GB +1334383104,1334383615,FR +1334383616,1334383679,DE +1334383680,1334383743,ES +1334383744,1334383807,IT +1334383808,1334383871,NL +1334383872,1334383935,BE +1334383936,1334383967,IE +1334383968,1334383999,PT +1334384000,1334384031,CZ +1334384032,1334384063,FI +1334384064,1334384095,LT +1334384096,1334384335,FR +1334384336,1334384343,ES +1334384344,1334384735,FR +1334384736,1334384767,BE +1334384768,1334384799,PL +1334384800,1334384831,ES +1334384832,1334384863,DE +1334384864,1334385007,FR +1334385008,1334385023,BE +1334385024,1334385055,IT +1334385056,1334385695,FR +1334385696,1334385727,BE +1334385728,1334386111,FR +1334386112,1334386143,BE +1334386144,1334386175,IT +1334386176,1334389759,FR +1334389760,1334389791,BE +1334389792,1334389823,FR +1334389824,1334389887,ES +1334389888,1334390015,FR +1334390016,1334390271,ES +1334390272,1334390399,FR +1334390400,1334390415,FI +1334390416,1334390431,DE +1334390432,1334390439,LT +1334390440,1334390463,FR +1334390464,1334390527,IE +1334390528,1334390975,FR +1334390976,1334390991,FI +1334390992,1334391359,FR +1334391360,1334391423,IT +1334391424,1334391551,FR +1334391552,1334391615,ES +1334391616,1334391711,FR +1334391712,1334391727,LT +1334391728,1334391871,FR +1334391872,1334391903,DE +1334391904,1334391935,NL +1334391936,1334392063,FR +1334392064,1334392067,CZ +1334392068,1334392095,FR +1334392096,1334392111,PT +1334392112,1334392223,FR +1334392224,1334392255,ES +1334392256,1334392639,FR +1334392640,1334392655,DE +1334392656,1334392847,FR +1334392848,1334392863,FI +1334392864,1334392895,DE +1334392896,1334392959,GB +1334392960,1334392991,NL +1334392992,1334393007,PL +1334393008,1334393023,CZ +1334393024,1334393055,IT +1334393056,1334394383,FR +1334394384,1334394399,GB +1334394400,1334395903,FR +1334395904,1334396927,PL +1334396928,1334402623,FR +1334402624,1334402687,BE +1334402688,1334402751,FR +1334402752,1334402815,DE +1334402816,1334402879,NL +1334402880,1334403071,FR +1334403072,1334403135,IE +1334403136,1334404991,FR +1334404992,1334405119,GB +1334405120,1334405311,FR +1334405312,1334405327,GB +1334405328,1334405759,FR +1334405760,1334405791,FI +1334405792,1334405919,FR +1334405920,1334405951,PL +1334405952,1334406015,DE +1334406016,1334406527,FR +1334406528,1334406543,DE +1334406544,1334406559,FR +1334406560,1334406575,NL +1334406576,1334407071,FR +1334407072,1334407103,GB +1334407104,1334407167,FR +1334407168,1334407231,IE +1334407232,1334407295,BE +1334407296,1334407359,IT +1334407360,1334408191,FR +1334408192,1334408255,ES +1334408256,1334408279,FR +1334408280,1334408287,ES +1334408288,1334408319,FR +1334408320,1334408351,FI +1334408352,1334408367,LT +1334408368,1334408383,FR +1334408384,1334408447,DE +1334408448,1334408823,FR +1334408824,1334408831,ES +1334408832,1334409535,FR +1334409536,1334409567,PL +1334409568,1334409599,FR +1334409600,1334409607,DE +1334409608,1334410735,FR +1334410736,1334410751,GB +1334410752,1334411263,FR +1334411264,1334444031,RU +1334444032,1334509567,SE +1334509568,1334542335,PL +1334542336,1334575103,RU +1334575104,1334579199,UA +1334579200,1334583295,RU +1334583296,1334591487,DE +1334591488,1334595583,RU +1334595584,1334599039,IT +1334599040,1334599167,FR +1334599168,1334599679,IT +1334599680,1334603775,RU +1334603776,1334607871,DE +1334607872,1334611967,IE +1334611968,1334616063,ME +1334616064,1334620159,MD +1334620160,1334624255,DE +1334624256,1334628351,GB +1334628352,1334632447,IE +1334632448,1334636543,KZ +1334636544,1334640639,RU +1334640640,1334644735,FR +1334644736,1334647039,DE +1334647040,1334647807,IQ +1334647808,1334648831,DE +1334648832,1334652927,GB +1334652928,1334661119,RU +1334661120,1334665215,CH +1334665216,1334669311,NO +1334669312,1334673407,MK +1334673408,1334677503,GB +1334677504,1334681599,FI +1334681600,1334681855,PL +1334681856,1334682111,NL +1334682112,1334682367,IE +1334682368,1334682623,NL +1334682624,1334682879,NO +1334682880,1334682900,GB +1334682901,1334682901,DK +1334682902,1334683135,GB +1334683136,1334683391,CZ +1334683392,1334683647,CH +1334683648,1334683903,NL +1334683904,1334684031,DE +1334684032,1334684159,NL +1334684160,1334684415,SE +1334684416,1334684479,NL +1334684480,1334684511,DE +1334684512,1334684671,NL +1334684672,1334684927,FI +1334684928,1334685183,NL +1334685184,1334685695,DE +1334685696,1334689791,IT +1334689792,1334693887,FR +1334693888,1334697983,RU +1334697984,1334702079,SY +1334702080,1334706175,CZ +1334706176,1334706431,BA +1334706432,1334706687,AT +1334706688,1334710271,BA +1334710272,1334714367,RU +1334714368,1334718463,DE +1334718464,1334722559,KZ +1334722560,1334723839,NL +1334723840,1334724095,DK +1334724096,1334724351,BG +1334724352,1334724607,SE +1334724608,1334724863,US +1334724864,1334725631,NL +1334725632,1334726143,SE +1334726144,1334726399,LU +1334726400,1334726655,SE +1334726656,1334729983,RU +1334729984,1334730495,KZ +1334730496,1334734847,RU +1334734848,1334738943,LT +1334738944,1334743039,CH +1334743040,1334747135,CZ +1334747136,1334751231,RU +1334755328,1334759423,UA +1334759424,1334763519,SE +1334763520,1334767615,DK +1334767616,1334771711,SE +1334771712,1334779903,RU +1334779904,1334783999,UA +1334784000,1334784255,GB +1334784256,1334784511,RO +1334784512,1334788095,GB +1334788096,1334792191,RU +1334792192,1334793320,GB +1334793321,1334793321,IR +1334793322,1334793471,GB +1334793472,1334793983,IR +1334793984,1334794239,GB +1334794240,1334796287,ES +1334796288,1334800383,ME +1334800384,1334804479,IT +1334804480,1334808575,FR +1334808576,1334812671,GB +1334812672,1334816767,BA +1334816768,1334820863,DE +1334820864,1334824959,IE +1334824960,1334829055,NL +1334829056,1334833151,RU +1334833152,1334837247,FR +1334837248,1335885823,ES +1335885824,1336016895,NO +1336016896,1336049663,PL +1336049664,1336066047,ES +1336066048,1336147967,PL +1336147968,1336279039,RU +1336279040,1336410111,GR +1336410112,1336541183,PT +1336541184,1336543231,SA +1336543232,1336545279,ES +1336545280,1336547327,SE +1336547328,1336549375,RU +1336549376,1336551423,IM +1336551424,1336553471,GB +1336553472,1336555519,SA +1336555520,1336557567,BE +1336557568,1336559615,ES +1336559616,1336561663,GB +1336561664,1336563711,NO +1336563712,1336567807,NL +1336567808,1336569855,BY +1336571904,1336573951,PL +1336573952,1336575999,DK +1336576000,1336578047,RU +1336580096,1336584191,RU +1336584192,1336586239,TR +1336586240,1336588287,GB +1336588288,1336590335,TJ +1336590336,1336592383,GB +1336592384,1336594431,AM +1336594432,1336596479,AT +1336596480,1336598527,FR +1336598528,1336600575,MD +1336600576,1336602623,FR +1336602624,1336604671,IE +1336604672,1336606719,CZ +1336606720,1336608767,PL +1336608768,1336610815,RU +1336610816,1336612863,TR +1336612864,1336614911,ES +1336614912,1336616959,GB +1336616960,1336619007,ES +1336619008,1336621055,AL +1336621056,1336623103,DE +1336623104,1336625151,BE +1336625152,1336627199,IE +1336627200,1336629247,NO +1336629248,1336631295,DE +1336631296,1336633343,IS +1336633344,1336635391,ES +1336635392,1336637439,RU +1336637440,1336639487,UA +1336639488,1336643583,HU +1336643584,1336644887,DK +1336644888,1336644895,NO +1336644896,1336645631,DK +1336645632,1336647679,GB +1336647680,1336649727,IT +1336649728,1336651775,RU +1336651776,1336653823,DE +1336653824,1336655871,CZ +1336655872,1336657919,NL +1336657920,1336659967,DE +1336659968,1336662015,RU +1336662016,1336664063,ES +1336664064,1336668159,FI +1336668160,1336670207,BH +1336670208,1336672255,SE +1336672256,1336705023,RU +1336705024,1336721407,SA +1336721408,1336737791,HU +1336737792,1336754175,PL +1336754176,1336770559,RU +1336770560,1336786943,GB +1336786944,1336803327,JO +1336811520,1336827903,RU +1336827904,1336836095,AT +1336836096,1336837119,BE +1336837120,1336837151,NL +1336837152,1336837183,BE +1336837184,1336837191,FR +1336837192,1336837199,NL +1336837200,1336837207,GB +1336837208,1336838143,BE +1336838144,1336842239,DE +1336842240,1336844287,DK +1336844288,1336846335,IR +1336846336,1336848383,GB +1336848384,1336850431,NO +1336850432,1336852479,RU +1336852480,1336868863,FR +1336868864,1336885247,RU +1336885248,1336901631,RS +1336901632,1336918015,IR +1336918016,1336934399,PL +1336934400,1337241562,IL +1337241563,1337241563,RO +1337241564,1337458687,IL +1337458688,1337982975,PL +1337982976,1342177279,DE +1342177280,1342701567,GB +1342701568,1342750719,RE +1342750720,1342750975,YT +1342750976,1342751743,FR +1342751744,1342752511,YT +1342752512,1342752767,FR +1342752768,1342753023,YT +1342753024,1342753535,FR +1342753536,1342753791,YT +1342753792,1342754047,FR +1342754048,1342754303,YT +1342754304,1342754559,FR +1342754560,1342755327,YT +1342755328,1342755583,FR +1342755584,1342755839,YT +1342755840,1342756351,FR +1342756352,1342756607,YT +1342756608,1342757375,FR +1342757376,1342758655,YT +1342758656,1342758911,FR +1342758912,1342759423,YT +1342759424,1342759679,FR +1342759680,1342759935,YT +1342759936,1342761215,FR +1342761216,1342761471,YT +1342761472,1342761727,FR +1342761728,1342761983,YT +1342761984,1342762239,FR +1342762240,1342762495,YT +1342762496,1342765311,FR +1342765312,1342765567,YT +1342765568,1342766335,FR +1342766336,1342766847,YT +1342766848,1342834687,FR +1342834688,1342842879,JO +1342842880,1342844927,FR +1342844928,1342853119,JO +1342853120,1342860799,FR +1342860800,1342861055,RE +1342861056,1342869503,FR +1342869504,1342871551,JO +1342871552,1342875647,FR +1342875648,1342877695,JO +1342877696,1342959049,FR +1342959050,1342959050,RE +1342959051,1342988287,FR +1342988288,1342989055,US +1342989056,1342996479,FR +1342996480,1342996735,GF +1342996736,1342996991,FR +1342996992,1342997247,GF +1342997248,1342997503,FR +1342997504,1342998527,GF +1342998528,1342999039,FR +1342999040,1343000319,GF +1343000320,1343000575,FR +1343000576,1343000831,GF +1343000832,1343001087,FR +1343001088,1343001855,GF +1343001856,1343002111,FR +1343002112,1343002623,GF +1343002624,1343002879,FR +1343002880,1343003903,GF +1343003904,1343004159,FR +1343004160,1343005695,GF +1343005696,1343005951,FR +1343005952,1343007743,GF +1343007744,1343007999,FR +1343008000,1343009023,GF +1343009024,1343009279,FR +1343009280,1343009791,GF +1343009792,1343010047,FR +1343010048,1343010559,GF +1343010560,1343011071,FR +1343011072,1343011327,GF +1343011328,1343011839,FR +1343011840,1343012863,GF +1343012864,1343018239,FR +1343018240,1343018495,RE +1343018496,1343027711,FR +1343027712,1343027967,RE +1343027968,1343218687,FR +1343218688,1343219711,DE +1343219712,1343220479,FR +1343220480,1343220671,DE +1343220672,1343220735,FR +1343220736,1343220863,GB +1343220864,1343221055,FR +1343221056,1343221119,GB +1343221120,1343221247,DE +1343221248,1343221759,FR +1343221760,1343222399,GB +1343222400,1343222911,FR +1343222912,1343223039,US +1343223040,1343223679,FR +1343223680,1343223687,LB +1343223688,1343224255,FR +1343224256,1343224303,US +1343224304,1343225855,FR +1343225856,1343750143,IT +1343750144,1344798719,ES +1344798720,1345323007,GB +1345323008,1345404927,PL +1345404928,1345421311,ES +1345421312,1345601535,PL +1345601536,1345617919,ES +1345617920,1345847295,PL +1345847296,1345978367,NL +1345978368,1346109439,ES +1346109440,1346240511,NL +1346240512,1346371583,DK +1346371584,1346375679,FI +1346375680,1346379775,RU +1346379776,1346383871,ES +1346383872,1346387967,GB +1346387968,1346392063,HU +1346392064,1346396159,UA +1346396160,1346398335,RU +1346398336,1346398367,DE +1346398368,1346398687,RU +1346398688,1346398719,DE +1346398720,1346400255,RU +1346400256,1346404351,IT +1346404352,1346407423,AT +1346407424,1346408447,DE +1346408448,1346412543,LU +1346412544,1346416639,RU +1346416640,1346420735,DE +1346420736,1346424831,NO +1346428928,1346433023,FR +1346433024,1346439167,NL +1346439168,1346441215,ES +1346441216,1346445311,RU +1346445312,1346449407,DE +1346449408,1346453503,NO +1346453504,1346461695,BA +1346461696,1346469887,NL +1346469888,1346473983,BE +1346473984,1346478079,IT +1346478080,1346482175,BA +1346482176,1346486271,CZ +1346486272,1346490367,SE +1346494464,1346498559,FR +1346498560,1346502655,IM +1346502656,1346510847,DE +1346510848,1346519039,AT +1346519040,1346527231,RU +1346527232,1346531327,DE +1346531328,1346535423,ES +1346535424,1346539519,BE +1346539520,1346543615,RU +1346543616,1346547711,FI +1346547712,1346551807,IR +1346555904,1346559999,IT +1346560000,1346564095,LI +1346564096,1346568191,EE +1346568192,1346569815,SE +1346569816,1346569819,ES +1346569820,1346569983,SE +1346569984,1346570239,NO +1346570240,1346572287,SE +1346572288,1346576383,DE +1346580480,1346584575,RU +1346584576,1346588159,US +1346588160,1346588671,KR +1346588928,1346589439,US +1346589440,1346589695,DE +1346589696,1346592767,US +1346592768,1346596863,ES +1346596864,1346600959,IT +1346600960,1346605055,MU +1346605056,1346609151,CH +1346609152,1346614527,FR +1346614528,1346614783,BE +1346614784,1346617343,FR +1346617344,1346621439,SE +1346621440,1346625535,RU +1346625536,1346629631,DE +1346629632,1346637823,RU +1346637824,1346650111,GB +1346650112,1346654207,RU +1346654208,1346658303,GB +1346658304,1346666495,SE +1346666496,1346670591,ES +1346670592,1346674687,IT +1346674688,1346678783,DE +1346678784,1346686975,IT +1346686976,1346691071,GB +1346691072,1346695167,PL +1346695168,1346699263,RU +1346699264,1346707455,GB +1346707456,1346711551,DE +1346711552,1346715647,AZ +1346715648,1346723839,NL +1346723840,1346732031,DE +1346732032,1346736127,GB +1346736128,1346740223,RU +1346740224,1346744319,FI +1346744320,1346748415,RU +1346748416,1346752511,DE +1346752512,1346756607,FR +1346756608,1346760703,SE +1346760704,1346764799,IR +1346764800,1346768895,DK +1346768896,1346772991,LV +1346772992,1346777087,FR +1346777088,1346781183,GB +1346781184,1346789375,UA +1346789376,1346793471,RU +1346793472,1346795519,IT +1346795520,1346797567,SY +1346797568,1346801663,IL +1346801664,1346805759,SE +1346805760,1346806031,DE +1346806032,1346806047,CH +1346806048,1346818047,DE +1346818048,1346822143,FR +1346822144,1346826239,RU +1346826240,1346830335,RS +1346830336,1346838527,GB +1346838528,1346842623,RU +1346842624,1346846719,MT +1346846720,1346854911,DK +1346854912,1346859007,MT +1346859008,1346863103,IR +1346863104,1346867199,DK +1346867200,1346871295,BA +1346871296,1346879487,RU +1346879488,1346883583,FI +1346883584,1346887679,RU +1346887680,1346891775,IT +1346891776,1346895871,RU +1346895872,1346899967,SE +1346899968,1346904063,RU +1346904064,1346908159,PL +1346908160,1346912255,LI +1346912256,1346920447,BG +1346920448,1346924543,KE +1346924544,1346928639,RU +1346928640,1346932735,DE +1346932736,1346936831,DK +1346936832,1346940927,IT +1346940928,1346945023,KG +1346945024,1346949119,PL +1346949120,1346957311,RU +1346957312,1346961407,DE +1346961408,1346965503,UA +1346965504,1346969599,RU +1346969600,1346973695,DE +1346973696,1346977791,SE +1346977792,1346985983,RU +1346985984,1346994175,DE +1346994176,1346998271,NL +1346998272,1347002367,ES +1347002368,1347006463,RU +1347006464,1347010559,SE +1347010560,1347014655,RU +1347014656,1347018751,GG +1347018752,1347022847,IT +1347022848,1347024895,AT +1347024896,1347035135,GB +1347035136,1347039231,CZ +1347039232,1347043327,RO +1347043328,1347047423,FR +1347047424,1347051519,SA +1347051520,1347059711,IL +1347059712,1347067903,CH +1347067904,1347071999,RS +1347072000,1347076095,IT +1347076096,1347084287,FI +1347084288,1347092479,GB +1347092480,1347096575,IR +1347096576,1347100671,SE +1347100672,1347108863,AT +1347108864,1347112959,GB +1347112960,1347117055,RU +1347117056,1347121151,FI +1347121152,1347125247,CH +1347125248,1347129343,RU +1347129344,1347133439,FR +1347133440,1347141631,EG +1347141632,1347145727,CH +1347145728,1347146239,IN +1347146240,1347146751,DE +1347146752,1347147007,IN +1347147008,1347147263,DE +1347147264,1347147775,GB +1347147776,1347148287,DE +1347148288,1347148543,GB +1347148544,1347148799,IN +1347148800,1347149055,NO +1347149056,1347149311,GB +1347149312,1347149567,DE +1347149568,1347149823,IN +1347149824,1347151423,HU +1347151424,1347158015,AT +1347158016,1347159935,CH +1347159936,1347160063,AT +1347160064,1347162111,CH +1347162112,1347166207,IT +1347174400,1347182591,IT +1347182592,1347186687,RU +1347186688,1347190783,GB +1347190784,1347194879,RU +1347194880,1347198975,SE +1347198976,1347200511,QA +1347200512,1347200601,US +1347200602,1347200602,QA +1347200603,1347200767,US +1347200768,1347203071,QA +1347203072,1347207167,RU +1347207168,1347215359,GB +1347215360,1347223551,RU +1347223552,1347225599,GB +1347225600,1347226623,PK +1347226624,1347227647,GB +1347227648,1347229895,DE +1347229896,1347229903,GR +1347229904,1347231743,DE +1347231744,1347235839,UA +1347235840,1347239935,GE +1347239936,1347244031,DK +1347244032,1347248127,GB +1347248128,1347252223,SE +1347252224,1347256319,HU +1347256320,1347260415,FO +1347260416,1347264511,MK +1347264512,1347268607,RU +1347268608,1347272703,LB +1347272704,1347276799,MT +1347276800,1347280895,DE +1347280896,1347284991,FR +1347284992,1347289087,GB +1347289088,1347293183,FR +1347293184,1347293311,SE +1347293312,1347293315,DJ +1347293316,1347293319,LR +1347293320,1347293327,GA +1347293328,1347293335,NG +1347293336,1347293351,SE +1347293352,1347293375,NG +1347293376,1347293391,SE +1347293392,1347293399,NG +1347293400,1347293407,US +1347293408,1347293415,NG +1347293416,1347293423,TZ +1347293424,1347293439,GN +1347293440,1347293447,US +1347293448,1347293455,GA +1347293456,1347293463,NG +1347293464,1347293471,SE +1347293472,1347293479,IQ +1347293480,1347293487,LR +1347293488,1347293495,TD +1347293496,1347293511,NG +1347293512,1347293519,GN +1347293520,1347293527,PS +1347293528,1347293535,NG +1347293536,1347293543,GH +1347293544,1347293551,NG +1347293552,1347293559,SE +1347293560,1347293567,GN +1347293568,1347293575,NG +1347293576,1347293583,GN +1347293584,1347293591,NG +1347293592,1347293599,US +1347293600,1347293615,NG +1347293616,1347293623,US +1347293624,1347293631,GH +1347293632,1347293639,LR +1347293640,1347293655,NG +1347293656,1347293672,GN +1347293673,1347293679,SE +1347293680,1347293687,US +1347293688,1347293719,NG +1347293720,1347293723,SE +1347293724,1347293724,US +1347293725,1347293727,SE +1347293728,1347293751,GN +1347293752,1347293767,NG +1347293768,1347293775,CM +1347293776,1347293799,NG +1347293800,1347293807,US +1347293808,1347293815,NG +1347293816,1347293823,GN +1347293824,1347293831,CM +1347293832,1347293839,NG +1347293840,1347293847,CG +1347293848,1347293855,NG +1347293856,1347293863,GN +1347293864,1347293871,ZM +1347293872,1347293879,GN +1347293880,1347293887,NG +1347293888,1347293903,GQ +1347293904,1347293911,GN +1347293912,1347293919,US +1347293920,1347293927,CM +1347293928,1347293935,TZ +1347293936,1347293943,NG +1347293944,1347293951,US +1347293952,1347293975,NG +1347293976,1347293983,CM +1347293984,1347293991,US +1347293992,1347293999,NG +1347294000,1347294007,TZ +1347294008,1347294015,SE +1347294016,1347294023,US +1347294024,1347294039,GN +1347294040,1347294047,NG +1347294048,1347294055,GN +1347294056,1347294071,US +1347294072,1347294079,NG +1347294080,1347294087,SE +1347294088,1347294095,US +1347294096,1347294111,NG +1347294112,1347294119,GN +1347294120,1347294135,NG +1347294136,1347294143,LR +1347294144,1347294151,NG +1347294152,1347294159,NE +1347294160,1347294167,GN +1347294168,1347294175,NG +1347294176,1347294183,US +1347294184,1347294191,SE +1347294192,1347294207,NG +1347294208,1347294215,SE +1347294216,1347294223,IQ +1347294224,1347294231,CM +1347294232,1347294239,US +1347294240,1347294247,LR +1347294248,1347294255,NG +1347294256,1347294263,LR +1347294264,1347294267,LS +1347294268,1347294271,LR +1347294272,1347294279,BR +1347294280,1347294287,CM +1347294288,1347294303,UG +1347294304,1347294311,NG +1347294312,1347294319,KZ +1347294320,1347294327,NG +1347294328,1347294335,GA +1347294336,1347294343,NG +1347294344,1347294351,CM +1347294352,1347294367,US +1347294368,1347294371,LS +1347294372,1347294375,IQ +1347294376,1347294399,NG +1347294400,1347294407,CM +1347294408,1347294415,GN +1347294416,1347294423,NG +1347294424,1347294431,US +1347294432,1347294439,SE +1347294440,1347294447,SO +1347294448,1347294495,US +1347294496,1347294975,SE +1347294976,1347294991,CG +1347294992,1347295007,US +1347295008,1347295015,LR +1347295016,1347295031,SE +1347295032,1347295055,NG +1347295056,1347295063,SE +1347295064,1347295071,LS +1347295072,1347295079,AF +1347295080,1347295103,NG +1347295104,1347295111,LY +1347295112,1347295119,ZA +1347295120,1347295127,NG +1347295128,1347295131,GN +1347295132,1347295135,SE +1347295136,1347295143,FR +1347295144,1347295151,NG +1347295152,1347295159,SE +1347295160,1347295167,GN +1347295168,1347295183,LS +1347295184,1347295191,SO +1347295192,1347295199,SE +1347295200,1347295215,ZM +1347295216,1347295223,US +1347295224,1347295231,NG +1347295232,1347295744,SE +1347295745,1347295745,US +1347295746,1347295747,SE +1347295748,1347295751,US +1347295752,1347295755,BW +1347295756,1347295759,SE +1347295760,1347295775,BW +1347295776,1347295783,HU +1347295784,1347295791,LB +1347295792,1347295815,SE +1347295816,1347295823,OM +1347295824,1347295831,GH +1347295832,1347295839,FR +1347295840,1347295847,NG +1347295848,1347295851,LS +1347295852,1347295855,SE +1347295856,1347295863,NG +1347295864,1347295927,SE +1347295928,1347295935,NG +1347295936,1347295975,US +1347295976,1347295983,LS +1347295984,1347295991,US +1347295992,1347295999,SE +1347296000,1347296031,US +1347296032,1347296039,SE +1347296040,1347296043,US +1347296044,1347296055,SE +1347296056,1347296079,US +1347296080,1347296103,SE +1347296104,1347296111,US +1347296112,1347296127,ZM +1347296128,1347296135,SE +1347296136,1347296143,US +1347296144,1347296159,SE +1347296160,1347296167,US +1347296168,1347296175,SE +1347296176,1347296183,US +1347296184,1347296191,SE +1347296192,1347296199,US +1347296200,1347296223,SE +1347296224,1347296231,US +1347296232,1347296239,JO +1347296240,1347296263,SE +1347296264,1347296271,US +1347296272,1347297279,SE +1347297280,1347305471,UA +1347305472,1347309567,AL +1347309568,1347313663,DE +1347313664,1347321855,RU +1347325952,1347330047,CZ +1347330048,1347338239,DE +1347338240,1347342335,RU +1347342336,1347346431,SE +1347346432,1347350527,BG +1347350528,1347354623,RU +1347358720,1347362815,CZ +1347362816,1347366911,NL +1347366912,1347371007,IT +1347371008,1347375103,RU +1347375104,1347379199,GB +1347379200,1347383295,NL +1347383296,1347387391,EE +1347387392,1347391487,GB +1347391488,1347393535,IQ +1347393536,1347395583,LB +1347395584,1347399679,SE +1347399680,1347403775,RU +1347403776,1347407871,NL +1347407872,1347411967,GB +1347411968,1347416063,DE +1347416064,1347420159,RU +1347420160,1347428351,DK +1347428352,1347432447,BA +1347432448,1347436543,HR +1347436544,1347440639,SE +1347440640,1347441151,NL +1347441152,1347444735,ES +1347444736,1347452927,RU +1347452928,1347461119,BG +1347461120,1347465215,AL +1347465216,1347469311,GB +1347469312,1347473407,RU +1347473408,1347477503,UZ +1347477504,1347481599,CH +1347481600,1347485695,AT +1347485696,1347493887,DE +1347493888,1347502079,LV +1347502080,1347504639,ES +1347504640,1347504671,SG +1347504672,1347504703,FR +1347504704,1347504735,DE +1347504736,1347504767,ES +1347504768,1347504803,GB +1347504804,1347504807,FR +1347504808,1347504811,DE +1347504812,1347504815,SG +1347504816,1347504831,GB +1347504832,1347505159,ES +1347505160,1347505167,GB +1347505168,1347505215,ES +1347505216,1347505247,GB +1347505248,1347518463,ES +1347518464,1347522559,NL +1347522560,1347526655,LB +1347526656,1347534847,FI +1347534848,1347538943,DE +1347538944,1347543039,RU +1347543040,1347547135,SK +1347547136,1347551167,DE +1347551168,1347551231,PL +1347551232,1347555327,IT +1347555328,1347559423,PL +1347559424,1347567615,RU +1347567616,1347567888,SC +1347567889,1347567889,NL +1347567890,1347569125,SC +1347569126,1347569126,NL +1347569127,1347569314,SC +1347569315,1347569315,NL +1347569316,1347569663,SC +1347569664,1347570687,NL +1347570688,1347570955,SC +1347570956,1347570956,NL +1347570957,1347571538,SC +1347571539,1347571539,NL +1347571540,1347571711,SC +1347571712,1347575807,RU +1347575808,1347579903,DK +1347579904,1347588095,GB +1347588096,1347592191,CZ +1347592192,1347600383,RU +1347600384,1347601919,CZ +1347601920,1347602431,UA +1347602432,1347608575,DE +1347608576,1347612671,FR +1347612672,1347616767,GB +1347616768,1347620863,FI +1347620864,1347624959,LB +1347624960,1347633151,CH +1347633152,1347637247,CZ +1347637248,1347641343,SE +1347641344,1347649535,DE +1347649536,1347653631,GE +1347653632,1347657727,GB +1347657728,1347661823,IT +1347661824,1347665919,DE +1347665920,1347670015,RU +1347670016,1347674111,SE +1347674112,1347682303,RU +1347682304,1347686399,DE +1347690496,1347694591,SE +1347694592,1347696375,GB +1347696376,1347696383,US +1347696384,1347706879,GB +1347706880,1347710975,IT +1347710976,1347715071,RU +1347715072,1347717375,ES +1347717376,1347717631,BG +1347717632,1347718143,ES +1347718144,1347718399,US +1347718400,1347723263,ES +1347723264,1347727359,GB +1347727360,1347731455,UA +1347731456,1347739647,DE +1347739648,1347747839,NL +1347747840,1347751935,DE +1347751936,1347754903,CY +1347754904,1347754911,GR +1347754912,1347755015,CY +1347755016,1347755023,GR +1347755024,1347755135,CY +1347755136,1347755151,GR +1347755152,1347755159,CY +1347755160,1347755175,GR +1347755176,1347756031,CY +1347756032,1347760127,NL +1347760128,1347764223,HU +1347764224,1347772415,GB +1347772416,1347776511,MT +1347776512,1347780607,SE +1347780608,1347784703,NL +1347784704,1347788799,RU +1347788800,1347792895,NL +1347792896,1347796991,RU +1347796992,1347801087,DE +1347801088,1347805183,GB +1347805184,1347809279,PL +1347809280,1347813375,RU +1347813376,1347817471,DE +1347817472,1347821567,US +1347821568,1347825663,GB +1347825664,1347829759,IT +1347829760,1347833855,SE +1347833856,1347837951,DE +1347837952,1347846143,RO +1347846144,1347850239,NO +1347850240,1347854335,IT +1347854336,1347854591,DE +1347854600,1347854607,DE +1347857408,1347858431,DE +1347858752,1347858815,DE +1347860992,1347861247,DE +1347862090,1347862090,DE +1347862272,1347862527,DE +1347862528,1347866623,CH +1347866624,1347870719,NO +1347870720,1347874815,AM +1347874816,1347878911,SK +1347878912,1347887103,GB +1347887104,1347891199,PL +1347891200,1347895295,SE +1347895296,1347903487,GH +1347903488,1347907583,RU +1347907584,1347911679,DE +1347911680,1347915775,GB +1347915776,1347919871,RU +1347919872,1347923967,DE +1347923968,1347928063,CZ +1347928064,1347931391,RU +1347931392,1347931647,BZ +1347931648,1347931903,RU +1347931904,1347932159,BZ +1347932160,1347936255,SK +1347936256,1347940351,FR +1347940352,1347944447,BA +1347944448,1347944959,ZA +1347944960,1347945215,UG +1347945216,1347945471,ZM +1347945472,1347945983,KE +1347945984,1347946239,MU +1347946240,1347946751,NG +1347946752,1347947007,AO +1347947008,1347947263,NG +1347947264,1347947519,ZA +1347947520,1347948543,DZ +1347948544,1347952639,DE +1347952640,1347956735,BE +1347956736,1347960831,RU +1347960832,1347964927,DE +1347964928,1347969023,IT +1347969024,1347977215,SE +1347977216,1347985407,DK +1347985408,1347989503,IT +1347989504,1347993599,FI +1347993600,1348001791,GB +1348001792,1348005887,ES +1348005888,1348009983,BH +1348009984,1348014079,RU +1348014080,1348018175,DK +1348018176,1348026367,NO +1348026368,1348028415,DE +1348028416,1348030463,LV +1348030464,1348034559,GB +1348034560,1348038655,AT +1348038656,1348042751,FR +1348042752,1348050943,RU +1348050944,1348055039,SE +1348055040,1348059135,LB +1348059136,1348063231,RU +1348063232,1348067327,CH +1348067328,1348070399,NL +1348070400,1348070911,DE +1348070912,1348071423,NL +1348071424,1348075519,DE +1348075520,1348076287,LV +1348076288,1348076543,RU +1348076544,1348082687,LV +1348082688,1348082943,RU +1348082944,1348083711,LV +1348083712,1348091903,LU +1348091904,1348095999,RU +1348096000,1348100095,AL +1348100096,1348104191,DE +1348104192,1348108287,RU +1348108288,1348112383,CZ +1348112384,1348116479,DE +1348116480,1348120575,JO +1348120576,1348124671,RU +1348124672,1348128767,GB +1348128768,1348129791,BE +1348129792,1348131071,SI +1348131072,1348132863,BE +1348132864,1348136959,UA +1348136960,1348141055,RU +1348141056,1348145151,DK +1348145152,1348149247,RU +1348149248,1348153343,NO +1348153344,1348157439,IT +1348157440,1348165631,ES +1348165632,1348169727,DE +1348169728,1348173823,AL +1348173824,1348177919,DK +1348177920,1348182015,BE +1348182016,1348190207,UA +1348190208,1348194303,RU +1348194304,1348198399,GR +1348198400,1348202495,NO +1348205258,1348205258,DE +1348206592,1348218879,RU +1348218880,1348222975,DE +1348222976,1348231167,LU +1348231168,1348235263,RU +1348235264,1348239359,AT +1348239360,1348241407,SE +1348241408,1348242431,GB +1348242432,1348243455,SE +1348243456,1348247551,GB +1348247552,1348251647,RU +1348251648,1348255743,GE +1348255744,1348263935,RU +1348263936,1348268031,UA +1348268032,1348272127,CZ +1348272128,1348280319,IE +1348280320,1348284415,AT +1348284416,1348288511,RU +1348288512,1348292607,IT +1348292608,1348296703,FR +1348296704,1348300799,RU +1348300800,1348304895,UA +1348304896,1348308991,IT +1348308992,1348313087,MT +1348313088,1348317183,GB +1348317184,1348321279,RU +1348321280,1348325375,GB +1348325376,1348329471,TR +1348329472,1348333599,RS +1348333600,1348333607,XK +1348333608,1348333631,RS +1348333632,1348333807,XK +1348333808,1348333823,RS +1348333824,1348334079,XK +1348334080,1348336191,RS +1348336192,1348336383,XK +1348336384,1348337471,RS +1348337472,1348337663,XK +1348337664,1348341759,ES +1348341760,1348345855,PL +1348345856,1348349951,GB +1348349952,1348354047,SK +1348354048,1348355267,NL +1348355268,1348355269,IE +1348355270,1348358143,NL +1348358144,1348362239,DE +1348362240,1348366335,MC +1348366336,1348370431,IT +1348370432,1348374527,DE +1348374528,1348378623,CH +1348378624,1348382719,BY +1348382720,1348386815,FR +1348386816,1348390911,GB +1348390912,1348395007,SE +1348395008,1348399103,BY +1348399104,1348403199,MD +1348403200,1348407295,ZA +1348407296,1348411391,BG +1348411392,1348415487,RU +1348415488,1348419583,GB +1348419584,1348427775,HU +1348427776,1348435967,CZ +1348435968,1348440063,FI +1348440064,1348444159,DE +1348444160,1348448255,NL +1348448256,1348456447,GB +1348456448,1348460543,BH +1348460544,1348464639,SI +1348464640,1348468735,CZ +1348468736,1348548607,RO +1348548608,1348549631,MD +1348549632,1348599807,RO +1348599808,1348730879,HU +1348730880,1348861951,NL +1348861952,1348993023,ES +1348993024,1349124095,IT +1349124096,1349255167,GR +1349255168,1349451775,AT +1349451776,1349517311,IE +1349517312,1349763071,NL +1349763072,1349771263,RU +1349771264,1349779455,NL +1349779456,1349910527,IT +1349910528,1350041599,FR +1350041600,1350215679,AT +1350215680,1350215935,IQ +1350215936,1350216959,AT +1350216960,1350217215,IQ +1350217216,1350217471,AT +1350217472,1350217727,IQ +1350217728,1350303743,AT +1350303744,1350434815,FR +1350434816,1350565887,NL +1350565888,1350763083,DE +1350763084,1350763084,JP +1350763085,1352299775,DE +1352299776,1352300031,US +1352300032,1352412159,DE +1352412160,1352412415,FR +1352412416,1352417279,DE +1352417280,1352418303,SK +1352418304,1352488959,DE +1352488960,1352491007,FR +1352491008,1352663039,DE +1352663040,1353187327,DK +1353187328,1353259263,GB +1353259264,1353259519,US +1353259520,1353262295,GB +1353262296,1353262303,US +1353262304,1353271317,GB +1353271318,1353271318,AT +1353271319,1353271567,GB +1353271568,1353271575,AT +1353271576,1353271683,GB +1353271684,1353271684,AT +1353271685,1353271711,GB +1353271712,1353271719,AT +1353271720,1353271727,GB +1353271728,1353271743,AT +1353271744,1353271775,GB +1353271776,1353271807,AT +1353271808,1353272983,GB +1353272984,1353272991,ES +1353272992,1353273407,GB +1353273408,1353273423,BE +1353273424,1353275247,GB +1353275248,1353275255,ES +1353275256,1353277439,GB +1353277440,1353279487,CH +1353279488,1353280511,IT +1353280512,1353287959,GB +1353287960,1353287967,IE +1353287968,1353298783,GB +1353298784,1353298815,SE +1353298816,1353298895,GB +1353298896,1353298911,SE +1353298912,1353298943,GB +1353298944,1353299455,SE +1353299456,1353300063,GB +1353300064,1353300071,SE +1353300072,1353300079,GB +1353300080,1353300095,SE +1353300096,1353308159,GB +1353308160,1353309183,FR +1353309184,1353312447,GB +1353312448,1353312479,CH +1353312480,1353312511,GB +1353312512,1353312767,CH +1353312768,1353313167,GB +1353313168,1353313183,IT +1353313184,1353315327,GB +1353315328,1353316351,ES +1353316352,1353318399,GB +1353318400,1353383935,SE +1353383936,1353449471,DE +1353449472,1353515007,PT +1353515008,1353646079,ES +1353646080,1353842687,GB +1353842688,1353973759,IL +1353973760,1354235903,IT +1354235904,1354301439,KW +1354301440,1354366975,FR +1354366976,1354432511,FI +1354432512,1354498047,DE +1354498048,1354563583,CZ +1354563584,1354629119,GB +1354629120,1354658495,DE +1354658496,1354658511,AT +1354658512,1354662159,DE +1354662160,1354662167,AT +1354662168,1354665215,DE +1354665216,1354665223,AT +1354665224,1354694655,DE +1354694656,1354760191,IR +1354760192,1355022335,GB +1355022336,1355083555,DK +1355083556,1355083559,US +1355083560,1355284479,DK +1355284480,1355415551,BE +1355415552,1355546623,NO +1355546624,1355808767,IT +1355808768,1355841535,DK +1355841536,1355857919,CH +1355857920,1355862015,LU +1355862016,1355864063,DE +1355864064,1355866111,GB +1355866112,1355868159,LT +1355868160,1355870207,DE +1355870208,1355872255,FI +1355872256,1355873279,IT +1355873280,1355873791,GB +1355874048,1355874303,DE +1355874304,1355907071,DK +1355907072,1355923455,GB +1355923456,1355931647,DE +1355931648,1355935743,LT +1355935744,1355936767,NL +1355936768,1355937791,DE +1355937792,1355938815,PL +1355938816,1355939327,NL +1355939584,1355939839,ES +1355939840,1355956223,IR +1355956224,1355964415,DK +1355964416,1355972607,IT +1355972608,1356005375,IR +1356005376,1356054527,IT +1356054528,1356062719,CZ +1356062720,1356068863,IT +1356068864,1356070911,PL +1356070912,1356201983,NO +1356201984,1356333055,FR +1356333056,1356464127,SE +1356464128,1356513497,CH +1356513498,1356513498,US +1356513499,1356595199,CH +1356595200,1356789759,FI +1356789760,1356790271,AX +1356790272,1356857343,FI +1356857344,1356922879,ES +1356922880,1356988415,GB +1356988416,1357053951,DE +1357053952,1357119487,AE +1357119488,1357185023,DE +1357185024,1357250559,GB +1357250560,1357316095,IL +1357317120,1357317375,GB +1357318152,1357318159,GR +1357318160,1357318207,GB +1357318208,1357318215,IT +1357318272,1357318279,CH +1357318288,1357318303,FR +1357318348,1357318351,NL +1357318356,1357318356,DE +1357318372,1357318375,BE +1357318378,1357318378,FR +1357318379,1357318379,PL +1357318384,1357318387,PL +1357318388,1357318391,FR +1357318396,1357318399,DE +1357318400,1357318655,FR +1357318912,1357319167,DE +1357319168,1357319171,PL +1357319172,1357319178,GB +1357319180,1357319187,GB +1357321024,1357321087,KE +1357321984,1357322239,GB +1357322240,1357322255,DE +1357322752,1357323007,GB +1357323008,1357323015,CG +1357323776,1357323791,FI +1357323808,1357323839,NO +1357324288,1357324295,RU +1357324296,1357324327,PL +1357326336,1357326337,ES +1357326338,1357326339,SL +1357326352,1357326367,GB +1357326592,1357326847,GB +1357327360,1357327615,FR +1357328384,1357328671,GB +1357328688,1357328695,ES +1357328696,1357328703,IT +1357328704,1357328711,IE +1357328896,1357329163,NL +1357329168,1357329183,NL +1357329408,1357329415,BE +1357330944,1357331207,GB +1357335808,1357336063,IT +1357337600,1357337647,NL +1357337664,1357337727,NL +1357340672,1357341695,GB +1357342976,1357343231,GB +1357343488,1357343503,GB +1357344260,1357344271,FR +1357344512,1357344767,FR +1357346816,1357346835,FR +1357346848,1357346863,FR +1357347336,1357347375,FR +1357347456,1357347583,FR +1357347616,1357347659,FR +1357347664,1357347671,FR +1357347680,1357347727,FR +1357347744,1357347775,FR +1357347840,1357348095,PL +1357348352,1357348359,ES +1357348384,1357348415,ES +1357348480,1357348607,ES +1357350400,1357350647,GB +1357350656,1357350847,GB +1357351168,1357351423,PL +1357359104,1357363199,GB +1357363200,1357363455,DE +1357363456,1357364223,QA +1357364224,1357365247,ES +1357366880,1357366911,GB +1357366960,1357366967,BE +1357366976,1357367039,GB +1357368352,1357368383,NL +1357368576,1357368831,NL +1357369344,1357369599,RO +1357370368,1357370623,SA +1357372416,1357372927,GB +1357373468,1357373471,GB +1357373480,1357373519,GB +1357373520,1357373535,FI +1357373536,1357373539,ES +1357373540,1357373543,PT +1357373544,1357375215,GB +1357375216,1357375223,ES +1357375224,1357375423,GB +1357375424,1357375487,IE +1357375504,1357375551,GB +1357375560,1357375567,GB +1357375576,1357375583,FR +1357375584,1357375591,GB +1357375600,1357375615,GB +1357377536,1357377679,FR +1357377696,1357378647,FR +1357378656,1357378687,FR +1357378816,1357379071,FR +1357381632,1357414399,NO +1357414400,1357447167,LV +1357447168,1357479935,IE +1357479936,1357512703,LV +1357512704,1357545471,RU +1357545472,1357578239,GB +1357578240,1357611007,EE +1357611008,1357643775,GB +1357643776,1357676543,FR +1357676544,1357709311,BE +1357709312,1357742079,RU +1357742080,1357774847,DE +1357774848,1357791231,GB +1357791232,1357807615,PL +1357807616,1357840383,CH +1357840384,1357873151,NO +1357875296,1357875327,IE +1357875456,1357875711,NL +1357876448,1357876479,DE +1357878272,1357878335,CH +1357878336,1357878399,CZ +1357878400,1357878463,NL +1357878464,1357878527,NO +1357878528,1357878591,AT +1357878592,1357878655,PL +1357878656,1357878719,DE +1357879296,1357879423,DE +1357883744,1357883759,AT +1357883852,1357883852,SE +1357885120,1357885183,DE +1357885200,1357885215,AT +1357885952,1357886207,SE +1357889280,1357889535,SE +1357890828,1357890831,NL +1357891072,1357891327,NL +1357891584,1357891647,SE +1357891712,1357891839,SE +1357892224,1357892351,FR +1357892608,1357892735,NL +1357892864,1357893119,NL +1357894912,1357895423,FR +1357895936,1357896191,SE +1357896192,1357896447,DE +1357897376,1357897407,PL +1357897624,1357897631,GB +1357899712,1357899775,GB +1357900312,1357900315,GB +1357900416,1357900543,SE +1357900800,1357901055,PL +1357901056,1357901311,SE +1357902366,1357902366,NO +1357903616,1357903743,CH +1357903744,1357903871,DK +1357904896,1357905407,GB +1357905408,1357905663,SE +1357905664,1357905919,NL +1357905920,1357910015,LT +1357910016,1357914111,GR +1357914112,1357922303,RU +1357922304,1357926399,SA +1357926400,1357930495,GB +1357930496,1357932287,RU +1357932288,1357932543,GB +1357932544,1357933055,RU +1357933056,1357933567,ES +1357933568,1357934079,GB +1357934080,1357934335,RU +1357934336,1357934591,GB +1357934592,1357938687,RU +1357938688,1357942783,NL +1357942784,1357946879,RS +1357946880,1357955071,PL +1357955072,1357959167,KE +1357959168,1357963263,RU +1357963264,1357967359,AT +1357967360,1357971455,RU +1357971456,1357975551,KZ +1357975552,1357979647,AT +1357979648,1357983743,KZ +1357983744,1357984103,GB +1357984104,1357984111,IT +1357984112,1357984167,GB +1357984168,1357984175,IT +1357984176,1357984367,GB +1357984368,1357984375,IT +1357984376,1357984511,GB +1357984512,1357984519,IT +1357984520,1357984527,GB +1357984528,1357984535,IT +1357984536,1357984839,GB +1357984840,1357984847,IT +1357984848,1357985575,GB +1357985576,1357985583,IT +1357985584,1357985791,GB +1357985792,1357987839,DE +1357987840,1357991935,GB +1357991936,1357996031,NO +1357996032,1358000127,CH +1358000128,1358004223,LI +1358004224,1358006271,PL +1358008320,1358012415,BH +1358012416,1358016511,IT +1358016512,1358020607,GE +1358020608,1358028799,DE +1358028800,1358032895,IT +1358032896,1358036991,GE +1358036992,1358041087,IR +1358041088,1358045183,FI +1358045184,1358049279,SK +1358049280,1358064639,RU +1358064640,1358065663,UA +1358065664,1358069759,BA +1358069760,1358086143,DE +1358086144,1358090239,CH +1358090240,1358094335,KZ +1358094336,1358102527,NL +1358102528,1358106623,RU +1358106624,1358110719,LT +1358110720,1358118911,DE +1358118912,1358123007,RU +1358123008,1358127103,PT +1358127104,1358131199,CZ +1358131200,1358132735,DK +1358132736,1358133247,GB +1358133248,1358135295,DK +1358135296,1358139391,RU +1358139392,1358143487,UA +1358143488,1358147583,AT +1358147584,1358151679,GB +1358151680,1358155775,DE +1358155776,1358159871,CH +1358163968,1358166015,MQ +1358166016,1358168063,GP +1358168064,1358172159,GB +1358172160,1358176255,CY +1358176256,1358180351,RU +1358180352,1358184447,ES +1358184448,1358187775,SE +1358187776,1358187839,NO +1358187840,1358192639,SE +1358192640,1358196735,HU +1358196736,1358200831,IT +1358200832,1358209023,PL +1358209024,1358213119,IL +1358213120,1358217215,GB +1358217216,1358221311,SE +1358221312,1358225407,DE +1358225408,1358229503,RU +1358229504,1358233599,DE +1358233600,1358237695,ES +1358237696,1358249983,FR +1358249984,1358254079,DE +1358254080,1358258175,MD +1358262272,1358266367,RU +1358266368,1358274559,DE +1358274560,1358278655,GR +1358278656,1358282751,PL +1358282752,1358286847,AT +1358286848,1358290943,MT +1358290944,1358295039,SE +1358295040,1358299135,RU +1358299136,1358303231,DZ +1358303232,1358306303,RU +1358306304,1358306815,GB +1358306816,1358307071,PT +1358307072,1358307327,GB +1358307328,1358315519,DE +1358315520,1358323711,RU +1358323712,1358327807,LU +1358327808,1358328671,DE +1358328672,1358328727,AT +1358328728,1358331903,DE +1358331904,1358335999,IL +1358336000,1358344191,FI +1358344192,1358352383,NL +1358352384,1358356479,RU +1358356480,1358360575,SI +1358360576,1358364671,RU +1358364672,1358372863,GB +1358372864,1358376959,RU +1358376960,1358381055,GB +1358381056,1358385151,IT +1358385152,1358389247,GB +1358389248,1358397439,RU +1358397440,1358401279,GB +1358401280,1358401535,KE +1358401536,1358402303,GB +1358402304,1358402559,TZ +1358402560,1358405631,GB +1358405632,1358409727,NL +1358409728,1358413823,RU +1358413824,1358422015,NL +1358422016,1358426111,FR +1358426112,1358430207,FI +1358430208,1358434303,NG +1358434304,1358438399,IS +1358438400,1358442495,NL +1358442496,1358446591,RU +1358446592,1358450687,TG +1358450688,1358454783,RU +1358454784,1358462975,FI +1358462976,1358467071,SE +1358467072,1358471167,RU +1358471168,1358475263,FI +1358475264,1358479359,GB +1358479360,1358479615,CH +1358479616,1358483455,LI +1358483456,1358487551,FR +1358487552,1358491647,SE +1358491648,1358495743,FI +1358495744,1358499839,PL +1358499840,1358503935,KZ +1358503936,1358508031,IT +1358508032,1358512127,GB +1358512128,1358516223,DZ +1358516224,1358520319,BY +1358520320,1358524415,GB +1358528512,1358530815,RU +1358530816,1358532607,KZ +1358532608,1358534655,RU +1358534656,1358536703,KZ +1358536704,1358540799,HU +1358540800,1358548991,RU +1358548992,1358551039,NL +1358551040,1358553087,GB +1358553088,1358557183,UA +1358557184,1358561279,IE +1358561280,1358569471,CZ +1358569472,1358573567,MA +1358573568,1358577663,LV +1358577664,1358585855,RU +1358585856,1358589951,GB +1358589952,1358594047,EE +1358594048,1358598143,DE +1358598144,1358602239,IL +1358602240,1358610431,RU +1358610432,1358614527,IR +1358614528,1358622719,RU +1358622720,1358626815,SK +1358626816,1358635007,GB +1358635008,1358639103,TR +1358639104,1358643199,RU +1358643200,1358647295,ES +1358647296,1358651391,DE +1358651392,1358655487,FR +1358655488,1358667775,RU +1358667776,1358668159,GB +1358668160,1358668167,PT +1358668168,1358668447,GB +1358668448,1358668455,PT +1358668456,1358668623,GB +1358668624,1358668631,PT +1358668632,1358670975,GB +1358670976,1358670991,PT +1358670992,1358671001,GB +1358671002,1358671002,PT +1358671003,1358671935,GB +1358671936,1358671943,PT +1358671944,1358675967,GB +1358675968,1358676991,SE +1358676992,1358678015,DK +1358678016,1358679295,SE +1358679296,1358680063,DK +1358680064,1358688255,RU +1358688256,1358692351,CZ +1358692352,1358696447,PL +1358696448,1358700543,RU +1358700544,1358704639,AT +1358704640,1358708735,HU +1358708736,1358712831,GB +1358712832,1358715135,NL +1358715136,1358715143,GB +1358715144,1358716927,NL +1358716928,1358721023,DE +1358721024,1358725119,GB +1358725120,1358733311,RU +1358733312,1358741503,SE +1358741504,1358745599,IT +1358745600,1358749695,SE +1358749696,1358753791,IT +1358753792,1358757887,UA +1358757888,1358766079,RU +1358766080,1358770175,IT +1358770176,1358774271,BG +1358774272,1358778367,ES +1358778368,1358782463,CH +1358782464,1358784039,GB +1358784040,1358784047,DE +1358784048,1358787327,GB +1358787328,1358787583,IE +1358787584,1358790655,GB +1358790656,1358798847,IR +1358798848,1358807039,HU +1358807040,1358811135,ES +1358811136,1358815231,DE +1358815232,1358819327,RU +1358819328,1358823423,TR +1358823424,1358827519,UA +1358827520,1358831615,RU +1358831616,1358835711,NO +1358835712,1358839807,RU +1358839808,1358843903,CH +1358843904,1358847999,MT +1358848000,1358856191,RU +1358856192,1358860287,DE +1358860288,1358861361,GB +1358861362,1358861363,DE +1358861364,1358861449,GB +1358861450,1358861450,DE +1358861451,1358861473,GB +1358861474,1358861474,DE +1358861475,1358861567,GB +1358861568,1358861823,DE +1358861824,1358861895,GB +1358861896,1358861903,FR +1358861904,1358862079,GB +1358862080,1358862335,FR +1358862336,1358862847,US +1358862848,1358862911,DK +1358862912,1358862914,GB +1358862915,1358862915,DK +1358862916,1358862975,GB +1358862976,1358863103,DK +1358863104,1358863359,CH +1358863360,1358863871,US +1358863872,1358864383,GB +1358864384,1358872575,CH +1358872576,1358876671,IT +1358876672,1358880767,LV +1358884864,1358888959,SE +1358888960,1358890399,DE +1358890400,1358890431,SE +1358890432,1358890479,DE +1358890480,1358890487,US +1358890488,1358892159,DE +1358892160,1358892175,CH +1358892176,1358893055,DE +1358893056,1358897151,RU +1358897152,1358899711,GB +1358899712,1358899967,US +1358899968,1358900223,KE +1358900224,1358905343,GB +1358905344,1358909439,UA +1358909440,1358913535,RU +1358913536,1358917631,CH +1358917632,1358921727,ES +1358921728,1358929919,RU +1358929920,1358934015,LU +1358934016,1358938111,RU +1358938112,1358946303,GB +1358946304,1358950399,LV +1358950400,1358954495,NL +1358954496,1358970879,ES +1358970880,1358987263,HU +1358987264,1359003647,NO +1359003648,1359020031,CZ +1359020032,1359036415,FR +1359036416,1359052799,GB +1359052800,1359101951,RU +1359101952,1359118335,GB +1359118336,1359118655,DE +1359118656,1359118719,GR +1359118720,1359118847,DE +1359118848,1359119103,IT +1359119104,1359119199,ES +1359119200,1359119231,NL +1359119232,1359119359,ES +1359119360,1359120383,IT +1359120384,1359121407,DE +1359121408,1359122431,ES +1359122432,1359123711,DE +1359123712,1359124479,ES +1359124480,1359132671,GB +1359132672,1359133191,DE +1359133192,1359133199,NL +1359133200,1359134463,DE +1359134464,1359134719,GR +1359134720,1359147960,CZ +1359147961,1359147961,PT +1359147962,1359151103,CZ +1359151104,1359161369,DE +1359161370,1359161370,CL +1359161371,1359167487,DE +1359167488,1359183871,GB +1359183872,1359200255,RU +1359200256,1359216639,AT +1359216640,1359233023,ZA +1359233024,1359249407,NL +1359249408,1359265791,CY +1359265792,1359282175,RU +1359282176,1359298559,IL +1359298560,1359314943,RU +1359314944,1359331327,GB +1359331328,1359347711,AT +1359347712,1359364095,CH +1359364096,1359380479,TR +1359380480,1359396863,PL +1359396864,1359413247,GB +1359413248,1359429631,DE +1359429632,1359446015,LT +1359446016,1359462399,DK +1359462400,1359468607,DE +1359468608,1359468623,SG +1359468624,1359470591,DE +1359470592,1359478783,CH +1359478784,1359511551,TR +1359511552,1359544319,SE +1359544320,1359577087,RU +1359577088,1359609855,ES +1359609856,1359642623,EG +1359642624,1359675391,AT +1359675392,1359708159,DE +1359708160,1359740927,BE +1359740928,1359773695,IR +1359773696,1359806463,RO +1359806464,1359839231,RU +1359839232,1359871999,CH +1359872000,1359904767,FR +1359904768,1359937535,DE +1359937536,1359970303,IS +1359970304,1360003071,PL +1360003072,1360007167,AM +1360011264,1360015359,AT +1360015360,1360019455,DE +1360019456,1360023551,FI +1360023552,1360027647,RU +1360027648,1360031743,AT +1360031744,1360035839,IR +1360039936,1360044031,AT +1360044032,1360048127,SE +1360048128,1360052223,DE +1360052224,1360056319,HU +1360060416,1360064511,LT +1360064512,1360068607,GE +1360068608,1360072703,RU +1360072704,1360076799,CH +1360076800,1360084991,NL +1360084992,1360089087,GB +1360089088,1360093183,AZ +1360093184,1360101375,DE +1360101376,1360105471,UA +1360105472,1360109567,RU +1360109568,1360113663,KZ +1360113664,1360117759,HU +1360117760,1360121855,FI +1360121856,1360125951,DE +1360125952,1360127487,SI +1360127488,1360127999,RS +1360128000,1360128511,MK +1360128512,1360129023,ME +1360129024,1360129535,BA +1360129536,1360130047,SI +1360130048,1360134143,IE +1360134144,1360138239,NL +1360138240,1360142335,CH +1360142336,1360146431,KZ +1360146432,1360150527,RS +1360150528,1360158719,RO +1360158720,1360162815,DE +1360162816,1360175103,RU +1360175104,1360179199,NL +1360179200,1360183295,FR +1360183296,1360191487,PL +1360191488,1360195583,FO +1360195584,1360199679,NL +1360199680,1360203775,CZ +1360203776,1360207871,FR +1360207872,1360211967,CZ +1360211968,1360216063,GB +1360216064,1360224255,RU +1360224256,1360224767,ES +1360224768,1360224895,FR +1360224896,1360227841,ES +1360227842,1360227842,SE +1360227843,1360228351,ES +1360228352,1360232447,FI +1360232448,1360236543,RU +1360236544,1360240639,AT +1360240640,1360244735,ES +1360244736,1360250623,GB +1360250624,1360251391,NL +1360251392,1360252415,DE +1360252416,1360252671,CH +1360252672,1360257023,GB +1360257024,1360265215,DK +1360265216,1360265503,NL +1360265504,1360265511,DE +1360265512,1360265983,NL +1360265984,1360265991,PT +1360265992,1360266567,GB +1360266568,1360266575,RU +1360266576,1360266759,GB +1360266760,1360266767,FR +1360266768,1360266791,GB +1360266792,1360266815,ES +1360266816,1360266847,GB +1360266848,1360266863,BE +1360266864,1360266871,FR +1360266872,1360266879,ES +1360266880,1360266991,GB +1360266992,1360266999,BE +1360267000,1360267007,GB +1360267008,1360268031,SE +1360268032,1360268199,FR +1360268200,1360268207,ES +1360268208,1360268287,FR +1360268288,1360269311,GB +1360269312,1360273407,KG +1360273408,1360281599,GB +1360281600,1360281727,NL +1360281728,1360281855,ES +1360281856,1360282111,NL +1360282112,1360282239,ES +1360282240,1360282495,NL +1360282496,1360282623,DE +1360282624,1360284671,NL +1360284672,1360284927,DK +1360284928,1360285183,NL +1360285184,1360285247,ES +1360285248,1360285695,NL +1360285696,1360289791,DE +1360289792,1360293887,RU +1360293888,1360302079,DE +1360302080,1360306175,EE +1360306176,1360310271,RU +1360310272,1360314367,JE +1360314368,1360318463,RU +1360318464,1360322559,FR +1360322560,1360326655,FI +1360326656,1360330751,PT +1360330752,1360334847,UA +1360334848,1360338943,IT +1360338944,1360343039,CY +1360343040,1360347135,SA +1360347136,1360351231,GB +1360351232,1360355327,AZ +1360355328,1360359423,EG +1360359424,1360363519,AT +1360363520,1360365567,IT +1360365568,1360367615,NL +1360367616,1360367771,IE +1360367772,1360367772,DE +1360367773,1360371711,IE +1360371712,1360375807,TR +1360375808,1360379903,NL +1360379904,1360383999,PL +1360384000,1360388095,SE +1360388096,1360392191,RU +1360392192,1360396287,EE +1360396288,1360400383,RU +1360400384,1360404479,BH +1360408576,1360412671,RU +1360420864,1360424959,TR +1360424960,1360425215,NL +1360425216,1360429055,RU +1360429056,1360433151,UA +1360433152,1360437247,RO +1360437248,1360441343,FI +1360441344,1360445439,HU +1360445440,1360453631,RU +1360453632,1360457727,DE +1360457728,1360461823,FI +1360461824,1360465919,RU +1360465920,1360470015,UA +1360470016,1360474111,FR +1360474112,1360478207,GB +1360478208,1360482303,CH +1360482304,1360486399,IT +1360486400,1360494591,RU +1360494592,1360498687,DK +1360498688,1360515071,RU +1360515072,1360519167,JP +1360519168,1360524031,NL +1360524032,1360524287,US +1360524288,1360531455,NL +1360531456,1360535551,RO +1360535552,1360539647,DE +1360539648,1360543743,NL +1360543744,1360547839,DE +1360547840,1360551935,RU +1360551936,1360556031,NL +1360556032,1360564223,RU +1360564224,1360568319,AT +1360568320,1360572415,ES +1360572416,1360576511,RU +1360576512,1360580607,GB +1360580608,1360584703,UA +1360584704,1360588799,IT +1360588800,1360590847,RS +1360590848,1360592895,IE +1360592896,1360596991,RU +1360596992,1360601087,CZ +1360601088,1360605183,BY +1360605184,1360609279,RU +1360613376,1360617471,SE +1360617472,1360621567,IT +1360621568,1360625663,ES +1360625664,1360629759,DE +1360629760,1360633855,SE +1360633856,1360637951,RU +1360637952,1360642047,FO +1360642048,1360644735,FR +1360644736,1360644863,IT +1360644864,1360645887,FR +1360645888,1360646143,GB +1360646144,1360650239,AT +1360650240,1360654335,UA +1360654336,1360658431,EE +1360658432,1360666623,PL +1360666624,1360674815,NO +1360674816,1360676863,NG +1360676864,1360678911,ZA +1360678912,1360683007,RU +1360683008,1360691199,GB +1360691200,1360698367,RU +1360698368,1360698623,RO +1360698624,1360698879,RU +1360698880,1360699391,RO +1360699392,1360703487,DE +1360703488,1360707583,RU +1360707584,1360709631,IT +1360709632,1360711679,AL +1360711680,1360715775,NL +1360715776,1360728063,SE +1360728064,1360732159,FR +1360732160,1360736255,NO +1360736256,1360740351,RU +1360740352,1360748543,GB +1360748544,1360749567,IM +1360749568,1360752639,GB +1360752640,1360756735,DE +1360756736,1360760831,IT +1360760832,1360764927,RU +1360764928,1360769023,DE +1360769024,1360773119,IT +1360773120,1360777215,CZ +1360777216,1360781311,DK +1360781312,1360785407,DE +1360785408,1360793599,RU +1360793600,1360797695,CZ +1360797696,1360805887,IR +1360805888,1360809983,DE +1360809984,1360814079,NL +1360814080,1360818175,FR +1360818176,1360822271,JO +1360822272,1360826367,AT +1360826368,1360830463,GB +1360830464,1360838655,RU +1360838656,1360842751,FR +1360842752,1360846847,RU +1360846848,1360850943,DE +1360855040,1360859135,NL +1360859136,1360863231,LT +1360863232,1360867327,NO +1360867328,1360879615,GB +1360879616,1360883711,EG +1360883712,1360891903,RU +1360891904,1360895999,CH +1360896000,1360900095,QA +1360900096,1360916479,IT +1360916480,1360920575,IR +1360920576,1360928767,IT +1360928768,1360932863,NL +1360932864,1360936959,RU +1360936960,1360941055,NL +1360941056,1360945151,BY +1360945152,1360949247,DE +1360949248,1360953343,RU +1360953344,1360957439,PL +1360957440,1360961535,DE +1360961536,1360965631,UA +1360965632,1360977919,RU +1360977920,1360986111,CZ +1360986112,1360986269,GB +1360986270,1360986270,US +1360986271,1360986299,GB +1360986300,1360986300,US +1360986301,1360986356,GB +1360986357,1360986358,US +1360986359,1360986367,GB +1360986368,1360986399,US +1360986400,1360986431,GB +1360986432,1360986447,US +1360986448,1360986631,GB +1360986632,1360986635,US +1360986636,1360986755,GB +1360986756,1360986763,US +1360986764,1360989439,GB +1360989440,1360989695,FR +1360989696,1360989929,GB +1360989930,1360989930,FR +1360989931,1360989935,GB +1360989936,1360989943,FR +1360989944,1360991743,GB +1360991744,1360991871,US +1360991872,1360992255,GB +1360992256,1360992511,DE +1360992512,1360993095,GB +1360993096,1360993099,DE +1360993100,1360994303,GB +1360994304,1360998399,CZ +1360998400,1361002495,FI +1361002496,1361006591,GB +1361006592,1361010687,DK +1361010688,1361018879,GB +1361018880,1361022975,AT +1361022976,1361027071,IT +1361027072,1361035263,IR +1361035628,1361035631,DZ +1361039360,1361041407,IE +1361041408,1361043455,NL +1361043456,1361051647,IR +1361051648,1362100223,ES +1362100224,1362395647,FR +1362395648,1362396031,US +1362396032,1362396415,FR +1362396416,1362396927,US +1362396928,1362397439,FR +1362397440,1362397695,US +1362397696,1362398463,FR +1362398464,1362398719,DE +1362398720,1362403583,FR +1362403584,1362404351,DZ +1362404352,1362404607,FR +1362404608,1362405887,DZ +1362405888,1362406143,FR +1362406144,1362407167,SV +1362407168,1362407679,FR +1362407680,1362407743,US +1362407744,1362407839,FR +1362407840,1362407871,US +1362407872,1362407887,HK +1362407888,1362407903,US +1362407904,1362407919,HK +1362407920,1362407935,US +1362407936,1362411519,FR +1362411520,1362413273,MQ +1362413274,1362414847,FR +1362414848,1362415103,GB +1362415104,1362415359,FR +1362415360,1362415615,DE +1362415616,1362417663,GP +1362417664,1362419711,SG +1362419712,1362423807,FR +1362423808,1362425855,SG +1362425856,1362426879,FR +1362426880,1362427815,MQ +1362427816,1362755583,FR +1362755584,1362886655,NL +1362886656,1363017727,ES +1363017728,1363148799,CH +1363148800,1363410943,FR +1363410944,1363673087,NL +1363673088,1363935231,IT +1363935232,1364197375,GB +1364197376,1364262911,FR +1364262912,1364328447,IT +1364328448,1364459519,BE +1364459520,1364525055,PT +1364525056,1364526591,NL +1364526592,1364528639,GB +1364528640,1364529663,NL +1364529664,1364530175,GB +1364530176,1364541439,NL +1364541440,1364545535,SE +1364545536,1364581375,NL +1364581376,1364582399,LY +1364582400,1364585727,NL +1364585728,1364585983,CA +1364585984,1364590591,NL +1364590592,1364721663,GB +1364721664,1364725759,SE +1364725760,1364733951,DE +1364733952,1364738047,IT +1364738048,1364742143,NO +1364742144,1364746239,RU +1364746240,1364750335,FR +1364750336,1364754431,RU +1364754432,1364758527,SK +1364758528,1364762623,KZ +1364762624,1364766719,GB +1364766720,1364770815,CH +1364770816,1364774911,KG +1364774912,1364779007,RU +1364779008,1364787199,IT +1364787200,1364795391,RO +1364795392,1364799487,ES +1364799488,1364803583,SK +1364803584,1364809727,RU +1364809728,1364815871,DE +1364815872,1364819967,RU +1364819968,1364824063,GB +1364824064,1364828159,SE +1364828160,1364829439,GB +1364829440,1364829487,FR +1364829488,1364829503,GB +1364829504,1364829527,FR +1364829528,1364832255,GB +1364832256,1364836351,RU +1364836352,1364840447,DE +1364840448,1364844543,AM +1364844544,1364852735,DE +1364852736,1364856831,RU +1364856832,1364860927,IQ +1364860928,1364865023,DE +1364865024,1364869119,PT +1364869120,1364873215,FI +1364873216,1364877311,GB +1364877312,1364881407,ES +1364881408,1364885503,EE +1364885504,1364889599,GB +1364889600,1364893695,IR +1364893696,1364897791,CZ +1364901888,1364905983,DE +1364905984,1364910079,RU +1364910080,1364914175,UA +1364914176,1364918271,CZ +1364918272,1364922367,SE +1364922368,1364924415,DE +1364924416,1364926463,YE +1364926464,1364934655,RU +1364934656,1364938751,FR +1364938752,1364942847,CZ +1364942848,1364946943,GB +1364946944,1364951039,TR +1364951040,1364959231,IR +1364959232,1364963327,DE +1364963328,1364967423,RU +1364967424,1364971519,GB +1364971520,1364975615,CZ +1364975616,1364979711,BJ +1364979712,1364983807,GB +1364983808,1364988351,DE +1364988352,1364988359,AT +1364988360,1364988367,NL +1364988368,1364988375,BE +1364988376,1364988383,FR +1364988384,1364988391,PL +1364988392,1364988399,ES +1364988400,1364988407,CH +1364988408,1364988415,IT +1364988416,1364990719,DE +1364990720,1364990911,SE +1364990912,1364990943,NO +1364990944,1364990951,DK +1364990952,1364990959,FI +1364990960,1364990967,LT +1364990968,1364990975,LV +1364990976,1364991999,DE +1364992000,1364996095,IT +1364996096,1365000191,GR +1365000192,1365004287,SE +1365004288,1365008383,FR +1365008384,1365012479,CH +1365012480,1365015903,US +1365015904,1365015919,GB +1365015920,1365016575,US +1365016576,1365020671,ES +1365020672,1365024767,CZ +1365024768,1365025151,DE +1365025152,1365025215,AT +1365025216,1365028863,DE +1365028864,1365032959,NL +1365032960,1365033471,US +1365033472,1365033599,PT +1365033600,1365033983,GB +1365033984,1365035007,SE +1365035008,1365039103,GB +1365039104,1365039135,FI +1365039136,1365039359,PT +1365039360,1365039615,GB +1365039616,1365039871,BE +1365039872,1365040127,US +1365040128,1365041151,SE +1365041152,1365044735,FR +1365044736,1365044799,LU +1365044800,1365044927,FR +1365044928,1365044935,GR +1365044936,1365044943,LU +1365044944,1365045247,FR +1365045248,1365047295,AT +1365047296,1365049343,SK +1365049344,1365057535,FR +1365057536,1365061631,IT +1365061632,1365065727,NL +1365065728,1365073919,BA +1365073920,1365078015,NO +1365078016,1365082111,DE +1365082112,1365090303,SE +1365090304,1365094399,NO +1365094400,1365098495,FR +1365098496,1365102591,HU +1365102592,1365102655,FR +1365102656,1365106687,ES +1365106688,1365110783,GB +1365110784,1365114879,FR +1365114880,1365118975,BA +1365118976,1365127167,RU +1365127168,1365131263,AT +1365131264,1365139455,SE +1365139456,1365147647,CH +1365147648,1365155839,RU +1365155840,1365159935,SE +1365159936,1365164031,HU +1365164032,1365171967,GB +1365171968,1365172223,ML +1365172224,1365176319,LV +1365176320,1365180415,HU +1365180416,1365182335,DE +1365182336,1365182351,GB +1365182352,1365182367,NL +1365182368,1365182391,DE +1365182392,1365182399,CH +1365182400,1365182431,SE +1365182432,1365184511,DE +1365184512,1365192703,RU +1365192704,1365196799,GB +1365196800,1365200895,ES +1365200896,1365204991,IQ +1365204992,1365209087,CZ +1365209088,1365213183,BE +1365213184,1365217279,RU +1365217280,1365219167,NL +1365219168,1365219168,GB +1365219169,1365221375,NL +1365221376,1365225471,GE +1365225472,1365229567,UA +1365229568,1365233663,PL +1365233664,1365237759,RU +1365237760,1365241855,UZ +1365241856,1365245951,DK +1365245952,1366294527,GB +1366294528,1366456994,IT +1366456995,1366456995,BO +1366456996,1367343103,IT +1367343104,1369440255,GB +1369440256,1369473023,DE +1369473024,1369505791,HU +1369505792,1369509887,RO +1369509888,1369518079,RU +1369518080,1369520127,RO +1369520128,1369520639,LI +1369520640,1369520895,FR +1369520896,1369521151,RO +1369521152,1369521663,SK +1369521664,1369521919,PL +1369521920,1369522175,RU +1369522176,1369530367,CZ +1369530368,1369530879,DK +1369530880,1369531391,RU +1369531392,1369534975,PL +1369534976,1369535231,RU +1369535232,1369535487,AT +1369535488,1369538559,RU +1369538560,1369554943,DK +1369554944,1369559039,PL +1369559040,1369563135,RU +1369567232,1369571327,BG +1369571328,1369585663,RU +1369585664,1369591807,UA +1369591808,1369595903,SK +1369595904,1369604095,UA +1369604096,1369620479,MD +1369620480,1369624575,CZ +1369624576,1369626623,PL +1369626624,1369636863,UA +1369636864,1369638911,IR +1369638912,1369640959,PL +1369640960,1369655295,RU +1369655296,1369657343,LV +1369657344,1369659391,RU +1369659392,1369661439,UA +1369661440,1369665535,RU +1369665536,1369677823,UA +1369677824,1369686015,RU +1369688064,1369690111,PL +1369690112,1369694207,UA +1369694208,1369702399,RU +1369702400,1369833471,BE +1369833472,1369964543,NO +1369964544,1369997311,GB +1369997312,1370030079,PL +1370030080,1370062847,BE +1370062848,1370095615,DE +1370095616,1370128383,GB +1370128384,1370161151,SE +1370161152,1370174207,NL +1370174208,1370174463,DE +1370174464,1370174495,BE +1370174496,1370174527,FR +1370174528,1370174559,CH +1370174560,1370174591,HU +1370174592,1370174623,CZ +1370174624,1370174655,PL +1370174656,1370174687,DE +1370174688,1370174719,SE +1370174720,1370174751,DK +1370174752,1370174752,NL +1370174753,1370174783,ES +1370174784,1370174815,CH +1370174816,1370175999,NL +1370176000,1370176255,DE +1370176256,1370176511,GB +1370176512,1370176767,NL +1370176768,1370177023,SE +1370177024,1370178559,NL +1370178560,1370179071,ES +1370179072,1370179583,SE +1370179584,1370180095,NL +1370180096,1370180351,GB +1370180352,1370180607,DE +1370180608,1370182911,NL +1370182912,1370183167,DE +1370183168,1370185983,NL +1370185984,1370186239,GB +1370186240,1370188543,NL +1370188544,1370188799,FR +1370188800,1370189055,AU +1370189056,1370189311,NL +1370189312,1370189567,US +1370189568,1370190847,NL +1370190848,1370192127,DE +1370192128,1370193919,NL +1370193920,1370226687,GB +1370226688,1370259455,ES +1370259456,1370292223,SE +1370292224,1370296319,NL +1370296320,1370300415,GB +1370300416,1370302463,NL +1370302464,1370302975,ES +1370302976,1370303487,NO +1370303488,1370312703,NL +1370312704,1370316799,CH +1370316800,1370317823,NL +1370317824,1370318847,IT +1370318848,1370320895,ES +1370320896,1370321919,DE +1370321920,1370324991,NL +1370324992,1370357759,DE +1370357760,1370390527,IT +1370390528,1370423295,GB +1370423296,1370439679,NO +1370439680,1370456063,NL +1370456064,1370488831,FI +1370488832,1370619903,RU +1370619904,1370750975,GB +1370750976,1370767359,RO +1370767360,1370771455,MD +1370771456,1370772479,RO +1370772480,1370772991,MD +1370772992,1370882047,RO +1370882048,1371013119,HU +1371013120,1371078655,ES +1371078656,1371144191,FR +1371144192,1371201535,GR +1371201536,1371205631,PL +1371205632,1371209727,SE +1371209728,1371275263,GB +1371275264,1371340799,BE +1371340800,1371406335,AT +1371406336,1371471871,PL +1371471872,1371537407,NO +1371537408,1371602943,MA +1371602944,1371668479,PT +1371668480,1371734015,FR +1371734016,1371799551,RU +1371799552,1371865087,RO +1371865088,1371930623,FI +1371930624,1371979007,LV +1371979008,1371979263,LT +1371979264,1371996159,LV +1371996160,1371996671,GB +1371996672,1371996927,GA +1371996928,1372000255,GB +1372000256,1372001279,UG +1372001280,1372012543,GB +1372012544,1372016639,DE +1372016640,1372017583,GB +1372017584,1372017599,CD +1372017600,1372020223,GB +1372020224,1372020224,CD +1372020225,1372020479,GB +1372020480,1372020480,CD +1372020481,1372020735,GB +1372020736,1372022783,CD +1372022784,1372023807,GB +1372023808,1372024831,IL +1372024832,1372025087,ZM +1372025088,1372026623,GB +1372026624,1372026879,KE +1372026880,1372027903,IL +1372027904,1372043519,GB +1372043520,1372043775,NG +1372043776,1372045567,GB +1372045568,1372045823,ZM +1372045824,1372047231,GB +1372047232,1372047295,NG +1372047296,1372060671,GB +1372060672,1372061695,IL +1372061696,1372069887,RU +1372069888,1372073983,FR +1372073984,1372078079,CZ +1372078080,1372082175,GB +1372082176,1372086271,RU +1372086272,1372090367,DE +1372090368,1372094463,RU +1372094464,1372098559,IT +1372098560,1372102655,RU +1372102656,1372106751,SE +1372106752,1372110847,FR +1372110848,1372114943,DE +1372114944,1372119039,RU +1372119040,1372123135,IT +1372123136,1372127231,RU +1372127232,1372131327,IT +1372131328,1372135423,RU +1372135424,1372139519,DE +1372139520,1372143615,CZ +1372143616,1372147711,RU +1372147712,1372151807,BE +1372151808,1372153343,DE +1372153344,1372153855,GB +1372153856,1372154367,DE +1372154368,1372154879,GB +1372154880,1372156927,DE +1372156928,1372157439,GB +1372157440,1372159999,DE +1372160000,1372164095,GB +1372164096,1372168191,DE +1372168192,1372172287,GB +1372172288,1372176383,FR +1372176384,1372180479,CH +1372180480,1372184575,SE +1372184576,1372188671,DE +1372188672,1372192767,RU +1372192768,1372323839,ES +1372323840,1372585983,NL +1372585984,1372618751,IT +1372618752,1372651519,GB +1372651520,1372684287,FI +1372684544,1372684799,DE +1372685664,1372685679,DE +1372688384,1372689407,DE +1372689920,1372690175,DE +1372693504,1372694015,DE +1372697344,1372697599,DE +1372698880,1372699647,DE +1372699904,1372700159,DE +1372702720,1372703231,DE +1372703616,1372703743,DE +1372704768,1372713983,DE +1372715008,1372717055,DE +1372717056,1372749823,PL +1372749824,1372782591,DE +1372782592,1372815359,RU +1372815360,1372848127,KZ +1372848128,1373110271,TR +1373110272,1373175807,SE +1373175808,1373241343,AT +1373241344,1373306879,IL +1373306880,1373372415,PL +1373372416,1373437951,FR +1373437952,1373503487,CH +1373503488,1373569023,RU +1373569024,1373634559,AT +1373634560,1373802623,SE +1373802624,1373802751,DK +1373802752,1374683135,SE +1374683136,1375207423,BE +1375207424,1375207679,FR +1375207680,1375208191,MQ +1375208192,1375208703,FR +1375208704,1375210239,MQ +1375210240,1375211007,FR +1375211008,1375211263,MQ +1375211264,1375211519,FR +1375211520,1375212287,GP +1375212288,1375212543,FR +1375212544,1375213311,GP +1375213312,1375213823,FR +1375213824,1375215359,GP +1375215360,1375215615,FR +1375215616,1375215871,GF +1375215872,1375216127,FR +1375216128,1375216383,GF +1375216384,1375216639,FR +1375216640,1375217407,GF +1375217408,1375217663,FR +1375217664,1375217919,GF +1375217920,1375218175,FR +1375218176,1375220735,GF +1375220736,1375224831,FR +1375224832,1375225087,MQ +1375225088,1375225855,FR +1375225856,1375226111,MQ +1375226112,1375226367,FR +1375226368,1375226623,MQ +1375226624,1375227135,FR +1375227136,1375229695,MQ +1375229696,1375229951,FR +1375229952,1375230463,MQ +1375230464,1375230719,FR +1375230720,1375231999,MQ +1375232000,1375235071,FR +1375235072,1375235583,MQ +1375235584,1375236095,FR +1375236096,1375237631,MQ +1375237632,1375237887,FR +1375237888,1375240191,MQ +1375240192,1375256575,GP +1375256576,1375272959,RE +1375272960,1375731711,FR +1375731712,1378877439,GB +1378877440,1379926015,IT +1379926016,1380188159,FR +1380188160,1380450303,GB +1380450304,1380712447,NL +1380712448,1380974591,RO +1380974592,1381105663,IL +1381105664,1381236735,DE +1381236736,1381367807,IT +1381367808,1381498879,ES +1381498880,1381761023,IT +1381761024,1382023167,NL +1382023168,1382027327,SE +1382027328,1382027343,DK +1382027344,1382039551,SE +1382039552,1382055935,DE +1382055936,1382072319,FR +1382072320,1382088703,RU +1382088704,1382105087,FR +1382105088,1382137855,DE +1382137856,1382138367,GB +1382138368,1382138879,RU +1382138880,1382139391,GB +1382139392,1382139647,RU +1382139648,1382140159,GB +1382140160,1382141951,RU +1382141952,1382146047,SY +1382146048,1382154239,IR +1382154240,1382170623,FR +1382170624,1382187007,DE +1382187008,1382203391,ES +1382203392,1382205439,GB +1382213632,1382219775,GB +1382219776,1382219959,SE +1382219960,1382219967,FI +1382219968,1382222807,SE +1382222808,1382222815,FI +1382222816,1382222847,SE +1382222848,1382222911,FI +1382222912,1382230207,SE +1382230208,1382230215,NO +1382230216,1382232775,SE +1382232776,1382232783,FI +1382232784,1382252543,SE +1382252544,1382268927,CZ +1382268928,1382285311,IR +1382285312,1382301695,CZ +1382301696,1382318079,SE +1382318080,1382334463,SY +1382334464,1382350847,DE +1382350848,1382367231,FR +1382367232,1382383615,BG +1382383616,1382399999,NG +1382400000,1382416383,NL +1382416384,1382417407,SE +1382417408,1382417663,PT +1382417664,1382418175,SE +1382418176,1382418431,PT +1382418432,1382420479,GB +1382420480,1382420735,DE +1382420736,1382420991,ES +1382420992,1382421247,FR +1382421248,1382421503,BE +1382421504,1382421759,DK +1382421760,1382422015,IT +1382422016,1382422271,NO +1382422272,1382422527,BG +1382422528,1382422783,CH +1382422784,1382423039,SG +1382423040,1382423167,IT +1382423168,1382423295,ES +1382423296,1382423551,NO +1382423552,1382423807,JP +1382423808,1382423935,US +1382423936,1382424063,GB +1382424064,1382424575,US +1382424576,1382449151,CY +1382449152,1382465535,IL +1382465536,1382481919,PS +1382481920,1382498303,AT +1382498304,1382514687,BG +1382514688,1382518783,DK +1382518784,1382522879,DE +1382522880,1382531071,DK +1382531072,1382547455,FI +1382547456,1382809599,IT +1382809600,1383071743,GB +1383071744,1383088127,RU +1383088128,1383096319,IS +1383096320,1383098879,GB +1383098880,1383099135,DE +1383099136,1383099163,GB +1383099164,1383099164,NL +1383099165,1383104511,GB +1383104512,1383112703,JE +1383112704,1383114751,LB +1383114752,1383116799,GB +1383116800,1383120895,RU +1383120896,1383129087,IT +1383129088,1383137279,GB +1383137280,1383145471,MC +1383145472,1383153663,CZ +1383153664,1383161855,GB +1383161856,1383170047,DE +1383170048,1383186431,GB +1383186432,1383194623,IT +1383194624,1383202815,GB +1383202816,1383211007,RU +1383211008,1383219199,CY +1383219200,1383225983,AL +1383225984,1383226007,RS +1383226008,1383226207,AL +1383226208,1383226239,RS +1383226240,1383227391,AL +1383227392,1383243775,RU +1383243776,1383251967,YE +1383251968,1383260159,CZ +1383260160,1383268351,RU +1383268352,1383268607,IR +1383268608,1383269375,NL +1383269376,1383272191,IR +1383272192,1383272447,NL +1383272448,1383276543,IR +1383276544,1383284735,KZ +1383284736,1383292927,PL +1383292928,1383301119,DE +1383301120,1383309311,SE +1383309312,1383317503,IT +1383317504,1383321599,SE +1383325696,1383333887,GB +1383333888,1383350271,RU +1383350272,1383358463,NO +1383358464,1383366911,DE +1383366912,1383367167,SY +1383367168,1383367679,DE +1383367680,1383368703,GB +1383368704,1383369727,DE +1383369728,1383369983,SA +1383369984,1383372031,DE +1383372032,1383374591,KW +1383374592,1383374847,US +1383374848,1383383039,ES +1383383040,1383391231,CY +1383391232,1383399423,FI +1383399424,1383407615,LI +1383407616,1383415807,NO +1383415808,1383423999,RU +1383424000,1383432191,SE +1383432192,1383440383,CZ +1383440384,1383448575,RU +1383448576,1383456767,RS +1383456768,1383464959,UA +1383464960,1383469055,BA +1383469056,1383471103,UA +1383471104,1383473151,SE +1383473152,1383481343,DE +1383481344,1383481599,GB +1383481600,1383481615,US +1383481616,1383481663,GB +1383481664,1383481695,US +1383481696,1383482623,GB +1383482624,1383482879,NL +1383482880,1383497727,GB +1383497728,1383505919,RU +1383505920,1383514111,SA +1383514112,1383522303,FI +1383522304,1383523839,BG +1383523840,1383524095,GB +1383524096,1383524863,BG +1383524864,1383525119,GB +1383525120,1383530495,BG +1383530496,1383538687,DE +1383538688,1383546879,IT +1383546880,1383555071,BG +1383555072,1383563263,SK +1383563264,1383571455,RU +1383571456,1383579647,DE +1383579648,1383587839,IT +1383587840,1383591935,SK +1383591936,1383596031,CZ +1383596032,1384120319,FR +1384120320,1384153087,NG +1384153088,1384185855,FI +1384187136,1384187391,DE +1384188160,1384188415,ES +1384198144,1384202239,GB +1384206336,1384218623,GB +1384218624,1384251391,EG +1384251392,1384267775,FI +1384267776,1384284159,CH +1384284160,1384316927,ES +1384316928,1384349695,EE +1384349696,1384382463,HU +1384382464,1384415231,HR +1384415232,1384480767,GB +1384480768,1384513535,FI +1384513536,1384546303,NO +1384546304,1384579071,NL +1384579072,1384611839,DE +1384611840,1384644607,LT +1384644608,1384660991,GB +1384660992,1384677375,CH +1384677376,1384693759,SE +1384693760,1384710143,NL +1384710144,1384726527,RO +1384726528,1384742911,BG +1384742912,1384759295,RU +1384759296,1384775679,SY +1384775680,1384792063,RU +1384792064,1384808447,FR +1384808448,1384808479,BE +1384808736,1384808799,BE +1384808800,1384808831,FR +1384808832,1384808959,FI +1384808960,1384808967,BE +1384808976,1384808991,DE +1384808992,1384809015,BE +1384809016,1384809023,GB +1384809024,1384809039,FR +1384809040,1384809047,BE +1384809056,1384809071,BE +1384809072,1384809087,FR +1384809088,1384809103,BE +1384809112,1384809119,GE +1384809120,1384809175,BE +1384809184,1384809199,BE +1384809208,1384809215,BE +1384809216,1384809407,BR +1384809408,1384809439,FR +1384809440,1384809471,DE +1384809472,1384809983,US +1384809984,1384810239,PT +1384810240,1384811007,US +1384811008,1384811519,GB +1384811520,1384811647,IR +1384811712,1384811743,ES +1384811744,1384811775,BE +1384811776,1384812031,FR +1384812032,1384812159,PR +1384812160,1384812287,PT +1384812288,1384812543,ES +1384812544,1384813567,GB +1384813568,1384814079,ES +1384814080,1384814591,GB +1384814592,1384815103,BE +1384815104,1384815615,FR +1384815616,1384816127,BE +1384816256,1384816383,ES +1384824832,1384841215,GB +1384841216,1384857599,PL +1384857600,1384873983,NL +1384873984,1384890367,PL +1384890368,1384923135,DE +1384923136,1384939519,RU +1384939520,1384955903,LT +1384955904,1384972287,RU +1384972288,1384988671,DE +1384988672,1385005055,FI +1385005056,1385021439,HU +1385021440,1385037823,IE +1385037824,1385054207,FR +1385054208,1385070591,CZ +1385070592,1385086975,RU +1385086976,1385103359,GB +1385103360,1385119743,IT +1385119744,1385136127,BE +1385136128,1385152511,PL +1385152512,1385168895,DK +1385168896,1385177087,ES +1385177088,1385185279,DE +1385185280,1385193471,RU +1385193472,1385201663,ES +1385201664,1385209855,CZ +1385209856,1385218047,HU +1385218048,1385226239,UA +1385226240,1385234431,GB +1385234432,1385242623,DE +1385242624,1385250815,GB +1385250816,1385259007,PL +1385259008,1385267199,IT +1385267200,1385275391,SE +1385275392,1385283583,IT +1385283584,1385286143,DE +1385286144,1385290288,GB +1385290289,1385290289,RE +1385290290,1385290631,GB +1385290632,1385290632,IS +1385290633,1385291343,GB +1385291344,1385291344,IS +1385291345,1385291775,GB +1385291776,1385299967,TR +1385299968,1385303039,BG +1385303040,1385303295,HU +1385303296,1385303551,JP +1385303552,1385304063,BG +1385304064,1385304319,KR +1385304320,1385304575,AE +1385304576,1385304831,GR +1385304832,1385308159,BG +1385308160,1385316351,RU +1385316352,1385324543,NO +1385324544,1385332735,BE +1385332736,1385340927,GB +1385340928,1385349119,LB +1385349120,1385357311,CH +1385357312,1385365503,PL +1385365504,1385373695,GB +1385373696,1385381887,NO +1385381888,1385398271,RU +1385398272,1385406463,BG +1385406464,1385414655,EE +1385414656,1385422847,SA +1385422848,1385431039,DK +1385431040,1385439231,RU +1385439232,1385447423,GB +1385447424,1385455615,IS +1385455616,1385463807,QA +1385463808,1385480191,NO +1385480192,1385488383,NL +1385488384,1385496575,GB +1385496576,1385504767,SI +1385504768,1385512959,IT +1385512960,1385521151,DE +1385521152,1385529343,AT +1385529344,1385537535,RU +1385537536,1385545727,DE +1385545728,1385553919,RU +1385553920,1385562111,DE +1385566432,1385566447,FR +1385566720,1385566975,GB +1385567000,1385567007,FR +1385567232,1385568255,IE +1385569024,1385569279,FR +1385570112,1385570119,FR +1385570144,1385570151,FR +1385570304,1385578495,HU +1385578496,1385586687,TR +1385586688,1385588991,GB +1385588992,1385589247,HK +1385589248,1385589503,JP +1385589504,1385589759,GB +1385589760,1385590015,JP +1385590016,1385590783,GB +1385590784,1385591295,US +1385591296,1385591807,HK +1385591808,1385592063,SG +1385592064,1385594879,GB +1385594880,1385603071,NL +1385603072,1385611263,CZ +1385611264,1385619455,AT +1385619456,1385625599,DE +1385625600,1385635839,FR +1385635840,1385644031,NL +1385644032,1385652223,MR +1385652224,1385660415,RU +1385660416,1385668607,TR +1385668608,1385676799,NL +1385676800,1385684991,RU +1385684992,1385824255,GB +1385824256,1385955327,PT +1385955328,1386086399,NL +1386086400,1386217471,ES +1386217472,1386283007,PL +1386283008,1386348543,NL +1386348544,1386414079,RU +1386414080,1386422271,GB +1386422272,1386423295,IT +1386423296,1386424319,FR +1386424320,1386426367,NL +1386426368,1386426623,US +1386426624,1386427391,IL +1386427392,1386432511,PS +1386432512,1386433023,GB +1386433024,1386433279,NL +1386433280,1386434751,GB +1386434752,1386434767,BE +1386434768,1386434783,IE +1386434784,1386434799,PT +1386434800,1386438143,GB +1386438144,1386438399,ES +1386438400,1386438655,FR +1386438656,1386442751,PS +1386442752,1386444799,GB +1386444800,1386445823,DK +1386445824,1386447871,GB +1386447872,1386448895,DK +1386448896,1386449151,IL +1386449152,1386449343,NL +1386449344,1386449347,GB +1386449348,1386449359,NL +1386449360,1386449363,GB +1386449364,1386449367,BE +1386449368,1386449371,AU +1386449372,1386449375,AT +1386449376,1386449379,NL +1386449380,1386449383,CH +1386449384,1386449387,FR +1386449388,1386449391,NL +1386449392,1386449395,ES +1386449396,1386449399,PT +1386449400,1386449403,RU +1386449404,1386449407,DE +1386449408,1386449663,GB +1386449664,1386449919,HK +1386449920,1386449920,US +1386449921,1386450175,IL +1386450176,1386450431,US +1386450432,1386450943,IL +1386450944,1386455039,GB +1386455040,1386456063,DK +1386456064,1386457087,GB +1386457088,1386459135,PS +1386459136,1386471423,GB +1386471424,1386473471,PS +1386473472,1386477567,GB +1386477568,1386477823,US +1386477824,1386478079,IL +1386478080,1386478335,US +1386478336,1386478591,IL +1386478592,1386479615,GB +1386479616,1386545151,NO +1386545152,1386552319,DE +1386552320,1386553087,GB +1386553088,1386610687,DE +1386610688,1386676223,IL +1386676224,1386741759,SA +1386741760,1387249663,NL +1387249664,1387250687,BE +1387250688,1387331583,NL +1387331584,1387397119,PL +1387397120,1387462655,OM +1387462656,1387528191,RU +1387528192,1387593727,DK +1387593728,1387659263,FI +1387659264,1387790335,SE +1387790336,1388314623,IT +1388314624,1388315135,AT +1388315136,1388315647,GR +1388315648,1388322815,AT +1388322816,1388331007,SI +1388331008,1388339199,NL +1388339200,1388339711,GB +1388339712,1388340223,DE +1388340224,1388347391,GB +1388347392,1388363775,DK +1388363776,1388371967,DE +1388371968,1388380159,CH +1388380160,1388396543,IT +1388396544,1388404735,LV +1388404736,1388412927,UA +1388412928,1388421119,RU +1388421120,1388429311,SE +1388429312,1388437503,HR +1388437504,1388445695,DE +1388445696,1388453887,AZ +1388453888,1388462079,BH +1388462080,1388470271,ES +1388470272,1388478463,DE +1388478464,1388486655,AT +1388486656,1388494847,RU +1388494848,1388503039,NO +1388503040,1388519423,RU +1388519424,1388527615,NL +1388527616,1388535807,DE +1388535808,1388543999,GB +1388544000,1388552191,IE +1388552192,1388553664,GB +1388553665,1388553665,EC +1388553666,1388553666,SV +1388553667,1388553667,GT +1388553668,1388554463,GB +1388554464,1388554464,ZM +1388554465,1388554465,IL +1388554466,1388555760,GB +1388555761,1388555761,AR +1388555762,1388555762,BO +1388555763,1388555763,BR +1388555764,1388555764,CL +1388555765,1388555765,CO +1388555766,1388555766,CR +1388555767,1388555767,DO +1388555768,1388557551,GB +1388557552,1388557552,MX +1388557553,1388557553,PA +1388557554,1388557554,PE +1388557555,1388557555,PR +1388557556,1388557556,VE +1388557557,1388557557,IN +1388557558,1388557558,PK +1388557559,1388557559,AL +1388557560,1388559119,GB +1388559120,1388559120,BA +1388559121,1388559121,BG +1388559122,1388559122,BH +1388559123,1388559123,CH +1388559124,1388559124,CZ +1388559125,1388559125,DZ +1388559126,1388559126,EG +1388559127,1388559127,GH +1388559128,1388560383,GB +1388560384,1388568575,FI +1388568576,1388576767,CH +1388576768,1388580863,NL +1388580864,1388581119,GB +1388581120,1388583167,FR +1388583168,1388583423,DZ +1388583424,1388584959,FR +1388587456,1388587471,GB +1388589056,1388589823,GB +1388591104,1388591359,AU +1388593152,1388601343,RU +1388601344,1388609535,SE +1388609536,1388617727,RU +1388617728,1388625919,SE +1388625920,1388634111,NO +1388634112,1388642303,GB +1388642304,1388650495,FI +1388650496,1388658687,PL +1388658688,1388666879,GB +1388666880,1388666956,FR +1388666957,1388666957,RE +1388666958,1388669696,FR +1388669697,1388669697,RE +1388669698,1388671097,FR +1388671098,1388671098,RE +1388671099,1388671763,FR +1388671764,1388671764,RE +1388671765,1388672244,FR +1388672245,1388672245,RE +1388672246,1388673079,FR +1388673080,1388673080,RE +1388673081,1388673769,FR +1388673770,1388673770,RE +1388673771,1388675071,FR +1388675584,1388676095,DE +1388677632,1388677887,NL +1388678144,1388679167,DE +1388679168,1388679423,FR +1388681216,1388683263,DE +1388683264,1388683903,CH +1388683904,1388683919,DE +1388683920,1388684080,CH +1388684081,1388684081,AT +1388684082,1388685599,CH +1388685600,1388685631,GB +1388685632,1388688127,CH +1388688128,1388688159,NL +1388688160,1388691455,CH +1388691456,1388699647,NL +1388699648,1388707839,SE +1388707840,1388708727,LT +1388708728,1388708743,US +1388708744,1388708859,LT +1388708860,1388708863,US +1388708864,1388711176,LT +1388711177,1388711177,RU +1388711178,1388714239,LT +1388714240,1388714495,LB +1388714496,1388716031,LT +1388716032,1388724223,ES +1388724224,1388732415,DE +1388732416,1388740607,ES +1388740608,1388741791,GB +1388741792,1388741795,IE +1388741796,1388743015,GB +1388743016,1388743023,IE +1388743024,1388743047,GB +1388743048,1388743055,IE +1388743056,1388743423,GB +1388743424,1388743435,IE +1388743436,1388743679,GB +1388743680,1388743919,IE +1388743920,1388744391,GB +1388744392,1388744395,IE +1388744396,1388744759,GB +1388744760,1388744767,IE +1388744768,1388744831,GB +1388744832,1388744847,IE +1388744848,1388745971,GB +1388745972,1388745975,IE +1388745976,1388746207,GB +1388746208,1388746223,IE +1388746224,1388746495,GB +1388746496,1388746559,IE +1388746560,1388746911,GB +1388746912,1388746927,IE +1388746928,1388748799,GB +1388748800,1388756991,RU +1388756992,1388765183,DE +1388765184,1388773375,GB +1388773376,1388781567,NO +1388781568,1388789759,ES +1388789760,1388789823,NL +1388789824,1388789831,GB +1388789832,1388789839,NL +1388789840,1388789847,GB +1388789848,1388794943,NL +1388794944,1388794959,GB +1388794960,1388795967,NL +1388795968,1388796031,GB +1388796032,1388796679,NL +1388796680,1388796687,GB +1388796688,1388797951,NL +1388797952,1388806143,RU +1388806144,1388806399,CH +1388806400,1388806655,DE +1388806656,1388806783,CH +1388806784,1388806911,GB +1388806912,1388807551,CH +1388807552,1388807615,DE +1388807616,1388807871,CH +1388807872,1388807935,DE +1388807936,1388811775,CH +1388811776,1388812031,DE +1388812032,1388813247,CH +1388813248,1388813311,DE +1388813312,1388814335,CH +1388814336,1388816383,FI +1388816384,1388822527,AX +1388822528,1388830719,AM +1388830720,1388838911,FI +1388838912,1388871679,RU +1388871680,1388904447,KZ +1388904448,1388937215,NL +1388937216,1388969983,EG +1388969984,1389002751,CZ +1389002752,1389035519,RU +1389035520,1389068287,GB +1389068288,1389101055,FI +1389101056,1389133823,NL +1389133824,1389166591,RU +1389166592,1389199359,PS +1389199360,1389199871,AE +1389199872,1389200159,US +1389200160,1389218815,AE +1389218816,1389219839,AF +1389219840,1389228415,AE +1389228416,1389228479,LB +1389228480,1389232127,AE +1389232128,1389264895,DE +1389264896,1389265151,TZ +1389265152,1389266943,GB +1389266944,1389267199,KE +1389267200,1389268863,GB +1389268864,1389268871,KE +1389268872,1389275647,GB +1389275648,1389275903,ZA +1389275904,1389289471,GB +1389289472,1389290495,NO +1389290496,1389297663,GB +1389297664,1389330431,UA +1389330432,1389363199,DE +1389363200,1389373498,CZ +1389373499,1389373499,ES +1389373500,1389379583,CZ +1389379584,1389395967,RU +1389395968,1389412351,RO +1389412352,1389428735,RS +1389428736,1389445119,CZ +1389445120,1389461503,RU +1389461504,1389477887,SE +1389477888,1389494271,BY +1389494272,1389494527,RO +1389494528,1389510655,DE +1389510656,1389527039,NL +1389527040,1389543423,RO +1389543424,1389548991,DE +1389548992,1389549055,BE +1389549056,1389576191,DE +1389576192,1389592575,GB +1389592576,1389598719,GE +1389598720,1389598956,RU +1389598957,1389598957,GE +1389598958,1389598975,RU +1389598976,1389604863,GE +1389604864,1389605119,RU +1389605120,1389608959,GE +1389608960,1389625343,DK +1389625344,1389641727,DE +1389641728,1389658111,JO +1389658112,1389674495,BE +1389674496,1389690879,DE +1389690880,1389707263,PS +1389707264,1389723647,IT +1389723648,1389756415,ES +1389756416,1389772799,SE +1389772800,1389778431,SI +1389778432,1389780991,RS +1389780992,1389783039,HR +1389783040,1389785087,BA +1389785088,1389787135,MK +1389787136,1389788671,SI +1389788672,1389789183,RS +1389789184,1389805567,PL +1389805568,1389806591,US +1389806592,1389806847,SA +1389806848,1389814271,US +1389814272,1389814527,DE +1389814528,1389815295,US +1389815296,1389815551,DE +1389815552,1389817603,US +1389817604,1389817604,NO +1389817605,1389817855,US +1389817856,1389819007,GB +1389819008,1389819023,DE +1389819024,1389819039,FR +1389819040,1389819055,IT +1389819056,1389819071,TR +1389819072,1389819903,GB +1389819904,1389821951,US +1389821952,1389838335,NL +1389838336,1389854719,UZ +1389854720,1389871103,IT +1389871104,1389887487,FI +1389887488,1389953023,FR +1389953024,1390018559,NL +1390018560,1390084095,AT +1390084096,1390149631,GB +1390149632,1390215167,CH +1390215168,1390280703,IS +1390280704,1390346239,TR +1390346240,1390411775,ES +1390411776,1392508927,FR +1392508928,1393623705,PL +1393623706,1393623706,GB +1393623707,1394606079,PL +1394606080,1396703231,ES +1396703232,1396834303,AT +1396834304,1396899839,TR +1396899840,1396965375,GB +1396965376,1396973567,NL +1396973568,1396981759,RU +1396981760,1396989951,PL +1396989952,1396998143,FR +1396998144,1397006335,AT +1397006336,1397014527,KW +1397014528,1397022719,CH +1397022720,1397030911,SE +1397030912,1397039103,RU +1397039104,1397047295,CZ +1397047296,1397063679,RU +1397063680,1397071871,UZ +1397071872,1397096447,RU +1397096448,1397227519,IE +1397227520,1397489663,DK +1397489664,1397751807,CH +1397751808,1398276095,NL +1398276096,1398800383,DK +1398800384,1398833151,KW +1398833152,1398865919,NL +1398865920,1398867967,RU +1398867968,1398870015,NL +1398872064,1398874111,BG +1398874112,1398876159,GB +1398876160,1398880255,DE +1398880256,1398882303,FR +1398882304,1398884351,BG +1398884352,1398886399,DE +1398886400,1398888447,CH +1398888448,1398890495,GB +1398890496,1398892543,DK +1398892544,1398894591,RU +1398896640,1398898687,CH +1398898688,1398931455,ES +1398931456,1398964223,GB +1398964224,1398996991,NL +1398996992,1399029759,LU +1399029760,1399062527,LV +1399062528,1399095295,FI +1399095296,1399128063,GB +1399128064,1399160831,BE +1399160832,1399193599,SA +1399193600,1399226367,FI +1399226368,1399259135,RU +1399259136,1399291903,IT +1399291904,1399324671,RO +1399324672,1399586815,GB +1399586816,1399717887,NO +1399717888,1399848959,AE +1399848960,1400111103,FR +1400111104,1400274943,NL +1400274944,1400291327,NO +1400291328,1400299519,FR +1400299520,1400373247,NL +1400373248,1400635391,IR +1400700928,1400768511,DE +1400897536,1400963071,NL +1400963072,1401028607,DE +1401028608,1401094143,IL +1401094144,1401159679,HR +1401159680,1401225215,PT +1401225216,1401241599,DE +1401242632,1401242632,DE +1401271296,1401274367,DE +1401278464,1401283583,DE +1401286656,1401290751,DE +1401290752,1401356287,BE +1401356288,1401421823,DE +1401421824,1401423871,GB +1401423872,1401425919,AE +1401425920,1401427967,NL +1401427968,1401430015,RU +1401430016,1401432063,AT +1401432064,1401434111,IE +1401436160,1401438207,BH +1401438208,1401440255,GB +1401440256,1401444351,DE +1401444352,1401446399,DK +1401446400,1401448447,DE +1401448448,1401450495,IT +1401450496,1401452543,RU +1401452544,1401454591,GB +1401454592,1401456639,DE +1401456640,1401458687,LV +1401460736,1401462783,PL +1401462784,1401464831,FR +1401464832,1401466879,IE +1401466880,1401468927,RS +1401468928,1401470975,ES +1401470976,1401473023,NL +1401473024,1401475071,CZ +1401475072,1401477119,FR +1401479168,1401481215,PL +1401481216,1401485311,RU +1401485312,1401487834,GB +1401487835,1401487835,BE +1401487836,1401489407,GB +1401489408,1401491455,SE +1401491456,1401493503,NL +1401493504,1401495551,CH +1401495552,1401497599,DE +1401497600,1401499647,AT +1401499648,1401501695,RU +1401501696,1401503487,IT +1401503488,1401503743,AL +1401503744,1401505791,DE +1401505792,1401509887,CH +1401509888,1401511935,UA +1401511936,1401513983,DE +1401513984,1401516031,IT +1401516032,1401518079,AT +1401518080,1401520127,DK +1401520128,1401522175,GB +1401522176,1401526271,NL +1401526272,1401528319,HU +1401528320,1401530367,IT +1401530368,1401532415,DE +1401532416,1401534463,GB +1401534464,1401536511,DE +1401536512,1401538559,NL +1401538560,1401540607,NO +1401540608,1401542655,GB +1401542656,1401544703,RU +1401544704,1401546751,GB +1401546752,1401548799,IT +1401548800,1401550847,FR +1401550848,1401551615,GB +1401551616,1401552383,JE +1401552384,1401552767,GB +1401552768,1401552895,JE +1401552896,1401554943,NL +1401554944,1401556991,IE +1401556992,1401563135,GB +1401563136,1401565183,ES +1401565184,1401567231,RU +1401567232,1401569279,GB +1401569280,1401585663,DE +1401585664,1401602047,GB +1401602048,1401618431,ES +1401618432,1401634815,AM +1401634816,1401651199,HR +1401651200,1401667583,RU +1401667584,1401683967,IT +1401683968,1401708287,SE +1401708288,1401708543,DE +1401708544,1401712895,SE +1401712896,1401713151,DE +1401713152,1401718111,SE +1401718112,1401718112,DK +1401718113,1401727743,SE +1401727744,1401727999,GB +1401728000,1401740543,SE +1401740544,1401740799,DE +1401740800,1401747711,SE +1401747712,1401747967,FR +1401747968,1401749503,SE +1401749504,1401765887,DE +1401765888,1401782271,IE +1401782272,1401815039,FR +1401815040,1401817087,SE +1401817088,1401819135,RU +1401819136,1401821183,BG +1401821184,1401825279,GB +1401825280,1401827327,PL +1401829376,1401831423,PL +1401831424,1401833471,GB +1401833472,1401835519,FI +1401835520,1401837567,DE +1401837568,1401839615,CH +1401839616,1401841663,NO +1401841664,1401843711,UA +1401843712,1401847807,PL +1401847808,1401849855,DE +1401849856,1401851903,PL +1401851904,1401853951,FR +1401853952,1401855999,PL +1401856000,1401858047,RU +1401858048,1401868287,PL +1401868288,1401870335,UA +1401870336,1401872383,PL +1401872384,1401874431,GB +1401874432,1401876479,UA +1401876480,1401878527,ES +1401878528,1401880575,MT +1401880576,1401882623,DE +1401882624,1401884671,NG +1401884672,1401886719,FR +1401886720,1401888767,BW +1401888768,1401890815,RU +1401890816,1401892863,PL +1401892864,1401894911,RU +1401894912,1401896959,FI +1401896960,1401897983,RU +1401897984,1401899007,MD +1401901056,1401903103,NO +1401903104,1401905151,FI +1401905152,1401907199,PL +1401911296,1401913343,DK +1401913344,1401917439,PL +1401917440,1401919487,BG +1401919488,1401921535,RU +1401921536,1401923583,PL +1401923584,1401925631,GG +1401925632,1401927679,BG +1401927680,1401929727,NL +1401929728,1401933823,RU +1401933824,1401935871,DE +1401935872,1401937919,FI +1401937920,1401939967,GB +1401939968,1401942015,UA +1401942016,1401942047,CZ +1401942048,1401942063,GB +1401942064,1401942071,HU +1401942072,1401943295,GB +1401943296,1401943551,DE +1401943552,1401944063,GB +1401944064,1401946111,BG +1401946112,1401962495,FR +1401962496,1401978879,PL +1401978880,1401995263,PT +1401995264,1402011647,CH +1402011648,1402015743,SE +1402015744,1402017791,FI +1402017792,1402018815,SE +1402018816,1402019839,FI +1402019840,1402027263,SE +1402027264,1402027519,NO +1402027520,1402028031,SE +1402028032,1402044415,FR +1402044416,1402060799,PL +1402060800,1402077183,FI +1402077184,1402093567,GB +1402093568,1402109951,RU +1402109952,1402142719,FI +1402142720,1402159103,ES +1402159104,1402175487,IT +1402175488,1402191871,IE +1402191872,1402208255,IR +1402208256,1402224639,CZ +1402224640,1402241023,BG +1402241024,1402257407,GB +1402257408,1402273791,FI +1402273792,1402277631,RU +1402277632,1402277887,TJ +1402277888,1402290175,RU +1402290176,1402306204,NL +1402306205,1402306205,DE +1402306206,1402306559,NL +1402306560,1402322943,IT +1402322944,1402339327,RU +1402339328,1402355711,CH +1402355712,1402372095,FI +1402372096,1402388479,SE +1402404864,1402408959,RU +1402408960,1402413055,DE +1402413056,1402417151,PL +1402417152,1402421247,DE +1402421248,1402421375,NL +1402421376,1402421735,FR +1402421736,1402421743,NL +1402421744,1402422119,FR +1402422120,1402422127,PT +1402422128,1402422159,FR +1402422160,1402422167,AT +1402422168,1402422783,FR +1402422784,1402423039,LU +1402423040,1402423295,FR +1402423296,1402423399,BE +1402423400,1402423407,LU +1402423408,1402423807,BE +1402423808,1402423839,FR +1402423840,1402423847,ES +1402423848,1402423919,FR +1402423920,1402423927,ES +1402423928,1402424319,FR +1402424320,1402424575,BE +1402424576,1402424831,FR +1402424832,1402425343,GB +1402425344,1402425599,DE +1402425600,1402425855,LU +1402425856,1402425871,BE +1402425872,1402425935,FR +1402425936,1402425943,NL +1402425944,1402425999,FR +1402426000,1402426015,CH +1402426016,1402426271,FR +1402426272,1402426279,PT +1402426280,1402426367,FR +1402426368,1402426623,DE +1402426624,1402427135,CH +1402427136,1402427239,GB +1402427240,1402427247,FR +1402427248,1402427335,GB +1402427336,1402427343,FR +1402427344,1402427535,GB +1402427536,1402427551,BE +1402427552,1402427655,GB +1402427656,1402427663,FR +1402427664,1402427671,GB +1402427672,1402427679,NL +1402427680,1402427903,GB +1402427904,1402427935,FR +1402427936,1402427951,GB +1402427952,1402427959,FR +1402427960,1402428023,GB +1402428024,1402428031,AT +1402428032,1402428095,GB +1402428096,1402428103,BE +1402428104,1402428111,GB +1402428112,1402428119,BE +1402428120,1402428255,GB +1402428256,1402428271,AT +1402428272,1402428279,FR +1402428280,1402428295,GB +1402428296,1402428311,BE +1402428312,1402428319,NL +1402428320,1402428335,FR +1402428336,1402428351,BE +1402428352,1402429439,GB +1402429440,1402431487,US +1402431488,1402433600,GB +1402433601,1402433601,FR +1402433602,1402435071,GB +1402435072,1402435103,LU +1402435104,1402437631,GB +1402437632,1402454015,DK +1402454016,1402455469,GB +1402455470,1402455470,DK +1402455471,1402455551,GB +1402455552,1402455807,US +1402455808,1402470399,GB +1402470400,1402994687,FR +1402994688,1403256831,NL +1403256832,1403322367,AT +1403322368,1403387903,ES +1403387904,1403396095,SE +1403396096,1403404287,EE +1403404288,1403412479,GB +1403412480,1403420671,RU +1403420672,1403428863,CH +1403428864,1403437055,GB +1403437056,1403445247,RO +1403445248,1403447295,RU +1403447296,1403448575,MD +1403448576,1403461631,RU +1403461632,1403469823,FR +1403469824,1403486207,RU +1403486208,1403494399,FR +1403494400,1403502591,GB +1403502592,1403510783,NL +1403510784,1403518975,CZ +1403518976,1403535359,CY +1403535360,1403551743,PL +1403551744,1403568127,SK +1403568128,1403573247,SE +1403573248,1403573503,ES +1403573504,1403574783,SE +1403574784,1403575039,IT +1403575040,1403576063,SE +1403576064,1403576319,DE +1403576320,1403578879,SE +1403578880,1403579135,DK +1403579136,1403581951,SE +1403581952,1403582207,US +1403582208,1403584511,SE +1403584512,1403600895,DE +1403600896,1403601519,FR +1403601520,1403601535,MC +1403601536,1403617279,FR +1403617280,1403633663,DE +1403633664,1403650047,RU +1403650048,1403666431,DE +1403666432,1403699199,GB +1403699200,1403715583,UA +1403715584,1403731967,LT +1403731968,1403748351,RU +1403748352,1403764735,DE +1403781120,1403797503,RU +1403797504,1403813887,SE +1403813888,1403830271,NL +1403830272,1403846655,CH +1403846656,1403863039,IS +1403863040,1403879423,FR +1403879424,1403895807,ES +1403895808,1403912191,CH +1403912192,1403928575,PT +1403928576,1403944959,SE +1403944960,1403953151,GR +1403953152,1403961343,IE +1403961344,1403977727,RU +1403977728,1403994111,IT +1403994112,1404010495,AT +1404010496,1404026879,PL +1404026880,1404043263,ES +1404043264,1404051455,EE +1404051456,1404076031,HR +1404076032,1404076543,SE +1404076544,1404077055,LV +1404077056,1404081151,SE +1404081152,1404084223,LV +1404084224,1404099327,LT +1404099328,1404099583,SE +1404099584,1404103167,LT +1404103168,1404103679,SE +1404103680,1404108799,LT +1404108800,1404116991,HR +1404116992,1404125183,LT +1404125184,1404141567,HR +1404141568,1404149759,LV +1404149760,1404151807,LT +1404151808,1404153855,LV +1404153856,1404153856,LT +1404153857,1404157090,LV +1404157091,1404157091,LT +1404157092,1404157951,LV +1404157952,1404157952,LT +1404157953,1404166143,LV +1404166144,1404174335,LT +1404174336,1404182527,EE +1404182528,1404187519,SE +1404187520,1404187535,LV +1404187536,1404187551,NL +1404187552,1404189183,SE +1404189184,1404190719,EE +1404190720,1404194815,SE +1404194816,1404198911,LT +1404198912,1404200959,SE +1404200960,1404207103,HR +1404207104,1404220415,SE +1404220416,1404221439,EE +1404221440,1404222463,SE +1404222464,1404222975,LV +1404222976,1404227071,SE +1404227072,1404230655,LV +1404230656,1404232703,SE +1404232704,1404233215,LV +1404233216,1404234239,SE +1404234240,1404239871,HR +1404239872,1404239872,LT +1404239873,1404242687,EE +1404242688,1404242751,SE +1404242752,1404249572,EE +1404249573,1404249573,LT +1404249574,1404251450,EE +1404251451,1404251451,LT +1404251452,1404257995,EE +1404257996,1404257996,LT +1404257997,1404258945,EE +1404258946,1404258946,LT +1404258947,1404263186,EE +1404263187,1404263187,LT +1404263188,1404265888,EE +1404265889,1404265889,LT +1404265890,1404313599,EE +1404313600,1404321791,HR +1404321792,1404338175,EE +1404338176,1404340223,SE +1404340224,1404342271,HR +1404342272,1404362751,SE +1404362752,1404376288,LT +1404376289,1404376289,SE +1404376290,1404379135,LT +1404379136,1404383231,AT +1404383232,1404385279,HR +1404385280,1404386047,LT +1404386048,1404386303,SE +1404386304,1404420095,LT +1404420096,1404426502,HR +1404426503,1404426503,SE +1404426504,1404436479,HR +1404436480,1404444671,SE +1404444672,1404452863,LT +1404452864,1404510207,SE +1404510208,1404518399,HR +1404518400,1404522495,SE +1404522496,1404526591,LV +1404526592,1404567551,SE +1404567552,1404600319,HR +1404600320,1404633087,SE +1404633088,1404641279,HR +1404641280,1404678143,SE +1404678144,1404680191,HR +1404680192,1404731391,SE +1404731392,1404764159,HR +1404764160,1404768255,NL +1404768256,1404772351,SE +1404772352,1404780543,NL +1404780544,1404788735,SE +1404788736,1404796927,LT +1404796928,1404801023,EE +1404801024,1404803071,SE +1404803072,1404805119,LV +1404805120,1404813311,AT +1404813312,1404815871,EE +1404815872,1404816383,LT +1404816384,1404817407,SE +1404817408,1404821503,EE +1404821504,1404862463,LT +1404862464,1404870655,HR +1404870656,1404872703,LT +1404872704,1404875775,SE +1404875776,1404876799,LT +1404876800,1404887039,SE +1404887040,1404895231,LT +1404895232,1404911615,SE +1404911616,1404921855,NL +1404921856,1404927999,LT +1404928000,1404944383,SE +1404944384,1404960767,LT +1404960768,1404977151,SE +1404977152,1404993535,LT +1404993536,1405009919,SE +1405009920,1405042687,LT +1405042688,1405050879,HR +1405050880,1405059071,AT +1405059072,1405063167,SE +1405063168,1405091839,EE +1405091840,1405812991,FR +1405812992,1405813247,MQ +1405813248,1405814015,FR +1405814016,1405814783,MQ +1405814784,1405815039,FR +1405815040,1405815807,MQ +1405815808,1405816063,FR +1405816064,1405816575,MQ +1405816576,1405816831,FR +1405816832,1405817855,MQ +1405817856,1405818111,FR +1405818112,1405818879,MQ +1405818880,1405822719,FR +1405822720,1405824255,MQ +1405824256,1405824767,FR +1405824768,1405825023,MQ +1405825024,1405825279,FR +1405825280,1405826815,MQ +1405826816,1405830655,FR +1405830656,1405831167,MQ +1405831168,1405832447,FR +1405832448,1405832703,MQ +1405832704,1405832959,FR +1405832960,1405833727,MQ +1405833728,1405833983,FR +1405833984,1405834239,MQ +1405834240,1405834751,FR +1405834752,1405835263,MQ +1405835264,1405835775,FR +1405835776,1405836287,MQ +1405836288,1405836799,FR +1405836800,1405837567,MQ +1405837568,1405837823,FR +1405837824,1405838079,MQ +1405838080,1405838591,FR +1405838592,1405838847,MQ +1405838848,1405839359,FR +1405839360,1405839615,MQ +1405839616,1405839871,FR +1405839872,1405840127,MQ +1405840128,1405840383,FR +1405840384,1405841919,MQ +1405841920,1405842175,FR +1405842176,1405843711,MQ +1405843712,1405843967,FR +1405843968,1405845503,MQ +1405845504,1405845759,FR +1405845760,1405846271,MQ +1405846272,1405846527,FR +1405846528,1405846783,MQ +1405846784,1405847295,FR +1405847296,1405848063,MQ +1405848064,1405848319,FR +1405848320,1405849087,MQ +1405849088,1405849599,FR +1405849600,1405850111,MQ +1405850112,1405850623,FR +1405850624,1405851135,MQ +1405851136,1405851647,FR +1405851648,1405851903,MQ +1405851904,1405855999,FR +1405856000,1405856255,MQ +1405856256,1405856767,FR +1405856768,1405857279,MQ +1405857280,1405857535,FR +1405857536,1405857791,MQ +1405857792,1405858815,FR +1405858816,1405859839,MQ +1405859840,1405861119,FR +1405861120,1405861631,MQ +1405861632,1405863167,FR +1405863168,1405863935,MQ +1405863936,1405865727,FR +1405865728,1405869567,MQ +1405869568,1405869823,FR +1405869824,1405870079,MQ +1405870080,1405870591,FR +1405870592,1405870847,MQ +1405870848,1405871615,FR +1405871616,1405872383,MQ +1405872384,1405873151,FR +1405873152,1405873663,MQ +1405873664,1405874175,FR +1405874176,1405876223,MQ +1405876224,1405876735,FR +1405876736,1405878015,MQ +1405878016,1406140415,FR +1406140416,1406205951,CZ +1406205952,1406210175,SE +1406210176,1406210559,NO +1406210560,1406271487,SE +1406271488,1406337023,IE +1406337024,1406402559,IT +1406402560,1406468095,GR +1406468096,1406533631,ES +1406533632,1406599167,FR +1406599168,1406664703,AT +1406664704,1406672895,FI +1406672896,1406681087,HU +1406681088,1406689279,GB +1406689280,1406697471,SE +1406697472,1406705663,GB +1406705664,1406713855,IT +1406713856,1406721023,AT +1406721024,1406721279,DE +1406721280,1406722047,AT +1406722048,1406730239,DE +1406730240,1406746623,RU +1406746624,1406754559,BE +1406754560,1406754815,FR +1406754816,1406763007,GB +1406763008,1406771199,LU +1406771200,1406779391,GB +1406779392,1406787583,RU +1406787584,1406788095,ES +1406788096,1406788351,NL +1406788352,1406791159,ES +1406791160,1406791295,GB +1406791296,1406793087,ES +1406793088,1406793088,FR +1406793089,1406793843,ES +1406793844,1406793847,GB +1406793848,1406794751,ES +1406794752,1406795775,NL +1406795776,1406797823,IM +1406797824,1406803967,GB +1406803968,1406812159,DE +1406812160,1406820351,SE +1406820352,1406828543,PL +1406828544,1406836735,GB +1406836736,1406844927,AT +1406844928,1406853119,MD +1406853120,1406861311,UA +1406861312,1406869503,RU +1406869504,1406877695,GB +1406877696,1406885887,NL +1406887936,1406889983,DE +1406889984,1406894079,CH +1406894080,1406902271,RU +1406902272,1406910463,AT +1406910464,1406918655,SE +1406918656,1406926847,RU +1406926848,1406935039,IT +1406935040,1406951423,RU +1406951424,1406959615,PL +1406959616,1406964223,DE +1406964224,1406964735,NL +1406964736,1406967807,DE +1406967808,1406975999,RU +1406976000,1406984191,IE +1406984192,1407000575,RU +1407000576,1407016959,DE +1407016960,1407025151,IT +1407025152,1407033343,DK +1407033344,1407041535,UZ +1407041536,1407049727,RU +1407049728,1407057919,DE +1407057920,1407066111,RU +1407066112,1407074303,LU +1407074304,1407089663,RU +1407089664,1407090559,US +1407090560,1407090687,RU +1407090688,1407098879,CH +1407098880,1407107071,BG +1407107072,1407115263,RU +1407115264,1407123455,GB +1407123456,1407131647,SE +1407131648,1407139839,NL +1407139840,1407148031,DE +1407148032,1407156223,GB +1407156224,1407164415,LV +1407164416,1407172607,PT +1407172608,1407180799,GB +1407180800,1407188991,PT +1407188992,1407320063,IT +1407320064,1407451135,SE +1407451136,1407483903,BG +1407483904,1407516671,CH +1407516672,1407516919,GB +1407516920,1407516927,NG +1407516928,1407518831,GB +1407518832,1407518847,NG +1407518848,1407520535,GB +1407520536,1407520543,NG +1407520544,1407520575,GB +1407520576,1407520583,NG +1407520584,1407520623,GB +1407520624,1407520631,NG +1407520632,1407521127,GB +1407521128,1407521135,CD +1407521136,1407521359,GB +1407521360,1407521367,CD +1407521368,1407522375,GB +1407522376,1407522383,CD +1407522384,1407522471,GB +1407522472,1407522479,CD +1407522480,1407523263,GB +1407523264,1407523271,CD +1407523272,1407523959,GB +1407523960,1407523967,CD +1407523968,1407524207,GB +1407524208,1407524215,CD +1407524216,1407525127,GB +1407525128,1407525135,CD +1407525136,1407525599,GB +1407525600,1407525607,CD +1407525608,1407526231,GB +1407526232,1407526239,CD +1407526240,1407527447,GB +1407527448,1407527455,CD +1407527456,1407531215,GB +1407531216,1407531223,CD +1407531224,1407531263,GB +1407531264,1407531519,AU +1407531520,1407533143,GB +1407533144,1407533151,CD +1407533152,1407537087,GB +1407537088,1407537095,GH +1407537096,1407538327,GB +1407538328,1407538335,CD +1407538336,1407538343,GB +1407538344,1407538351,CD +1407538352,1407539967,GB +1407539968,1407539975,CD +1407539976,1407540159,GB +1407540160,1407540167,CD +1407540168,1407540207,GB +1407540208,1407540215,CD +1407540216,1407542687,GB +1407542688,1407542695,CD +1407542696,1407543935,GB +1407543936,1407543943,NG +1407543944,1407544015,GB +1407544016,1407544023,NG +1407544024,1407544791,GB +1407544792,1407544799,NG +1407544800,1407545311,GB +1407545312,1407545319,CD +1407545320,1407545327,GB +1407545328,1407545343,CD +1407545344,1407545863,GB +1407545864,1407545871,CD +1407545872,1407549439,GB +1407549440,1407582207,RU +1407582208,1407614975,PL +1407614976,1407680511,ES +1407680512,1407681023,GB +1407681024,1407681087,ES +1407681088,1407686119,GB +1407686120,1407686123,CH +1407686124,1407686127,DE +1407686128,1407686131,FR +1407686132,1407686135,BE +1407686136,1407686139,GB +1407686140,1407686143,ES +1407686144,1407686147,SE +1407686148,1407695679,GB +1407695680,1407695683,IT +1407695684,1407695763,GB +1407695764,1407695767,DK +1407695768,1407695771,GB +1407695772,1407695775,DK +1407695776,1407695807,GB +1407695808,1407695811,SE +1407695812,1407702271,GB +1407702272,1407702527,DE +1407702528,1407711239,GB +1407711240,1407711247,FR +1407711248,1407713279,GB +1407713280,1407778815,NL +1407778816,1407844351,SE +1407844352,1407909887,RU +1407909888,1407975423,GR +1407975424,1408040959,DE +1408040960,1408106495,RU +1408106496,1408172031,PL +1408172032,1408237567,RU +1408237568,1408270335,CZ +1408270336,1408303103,PT +1408303104,1408335871,LV +1408335872,1408368639,SE +1408368640,1408376831,NO +1408376832,1408385023,DE +1408385024,1408393215,PL +1408393216,1408397311,UA +1408397312,1408401407,PL +1408401408,1408434175,RU +1408434176,1408436223,DE +1408436224,1408438271,LU +1408438272,1408440319,FR +1408440320,1408442367,SE +1408442368,1408444415,PL +1408444416,1408450559,DE +1408450560,1408454655,RU +1408454656,1408456703,DE +1408456704,1408458751,LV +1408458752,1408460799,GB +1408460800,1408462847,PL +1408462848,1408464895,DE +1408466944,1408499711,NO +1408499712,1408532479,PS +1408532480,1408567919,GB +1408567920,1408567927,IE +1408567928,1408579583,GB +1408579584,1408579839,IE +1408579840,1408597503,GB +1408597504,1408598015,IE +1408598016,1408630783,FI +1408630784,1408634879,RO +1408634880,1408663551,DE +1408663552,1408696319,RU +1408696320,1408729087,NL +1408729088,1408761855,ES +1408761856,1409286143,SE +1409286144,1409362431,HU +1409362432,1409363967,BG +1409363968,1409377791,HU +1409377792,1409378047,RO +1409378048,1409378679,HU +1409378680,1409378687,RO +1409378688,1409391103,HU +1409391104,1409391359,BG +1409391360,1409413119,HU +1409413120,1409415167,BG +1409415168,1409436159,HU +1409436160,1409436415,BG +1409436416,1409548287,HU +1409548288,1409810431,FR +1409810432,1409941503,GB +1409941504,1410007039,PL +1410007040,1410009855,DE +1410009856,1410010111,US +1410010112,1410072575,DE +1410072576,1410203647,GB +1410203648,1410212863,FR +1410212864,1410213119,GB +1410213120,1410220959,FR +1410220960,1410220967,AT +1410220968,1410221033,FR +1410221034,1410221034,AT +1410221035,1410221047,FR +1410221048,1410221055,AT +1410221056,1410262055,FR +1410262056,1410262063,ES +1410262064,1410269183,FR +1410269184,1410303999,LT +1410304000,1410306047,LV +1410306048,1410318335,LT +1410318336,1410319359,LV +1410319360,1410322431,LT +1410322432,1410326527,LV +1410326528,1410334719,LT +1410334720,1410338319,ES +1410338320,1410338327,GB +1410338328,1410342399,ES +1410342400,1410342655,DE +1410342656,1410342911,ES +1410342912,1410351103,SK +1410351104,1410359295,CH +1410359296,1410367487,CZ +1410367488,1410375679,RU +1410375680,1410378015,DK +1410378016,1410378031,NO +1410378032,1410383871,DK +1410383872,1410392063,NO +1410392064,1410400255,DE +1410400256,1410408447,RU +1410408448,1410416639,IT +1410416640,1410424831,TR +1410424832,1410433023,DE +1410433024,1410441215,BE +1410441216,1410449407,DE +1410449408,1410457599,SE +1410457600,1410465791,RU +1410465792,1410473983,ES +1410473984,1410490367,JO +1410490368,1410498559,RU +1410498560,1410506751,IT +1410506752,1410514943,IE +1410514944,1410523135,GB +1410523136,1410531327,PT +1410531328,1410539519,DE +1410539520,1410547711,GB +1410547712,1410555903,CZ +1410555904,1410564095,GB +1410564096,1410567313,SE +1410567314,1410567314,CH +1410567315,1410567320,SE +1410567321,1410567321,NO +1410567322,1410567322,FI +1410567323,1410567323,EE +1410567324,1410567324,IT +1410567325,1410568357,SE +1410568358,1410568358,NO +1410568359,1410568501,SE +1410568502,1410568502,DK +1410568503,1410568991,SE +1410568992,1410569007,NO +1410569008,1410572287,SE +1410572288,1410588671,DE +1410588672,1410596863,GB +1410596864,1410605055,ES +1410605056,1410613247,CH +1410613248,1410621439,AL +1410621440,1410629631,NO +1410629632,1410637823,FI +1410637824,1410646015,AT +1410646016,1410654207,GB +1410654208,1410662399,SI +1410662400,1410670591,HU +1410670592,1410675967,DE +1410675968,1410676223,US +1410676224,1410678783,DE +1410678784,1410686975,RU +1410686976,1410695167,CZ +1410695168,1410703359,GB +1410711552,1410719743,BG +1410719744,1410727935,RU +1410727936,1410736127,BG +1410736128,1410739455,RS +1410739456,1410739711,XK +1410739712,1410744319,RS +1410744320,1410752511,FR +1410752512,1410760703,NL +1410760704,1410768895,RU +1410768896,1410777087,GB +1410777088,1410785279,RU +1410785280,1410793471,SA +1410793472,1410801663,GB +1410801664,1410809855,RU +1410809856,1410818047,DE +1410818048,1410826239,SA +1410826240,1410834431,SE +1410834432,1410842623,PL +1410842624,1410850815,PT +1410850816,1410859007,DE +1410859008,1411383295,NL +1411383296,1411448831,LT +1411448832,1411449727,IT +1411449728,1411449791,DE +1411449792,1411450303,IT +1411450304,1411450367,DE +1411450368,1411514367,IT +1411514368,1411579903,FI +1411579904,1411645439,NL +1411645440,1411710975,EG +1411710976,1411776511,FR +1411776512,1411777535,RU +1411777536,1411778559,HK +1411778560,1411780607,NO +1411780608,1411784703,PL +1411784704,1411788799,GB +1411788800,1411792895,IT +1411792896,1411796991,DE +1411796992,1411805183,PL +1411805184,1411809279,AT +1411809280,1411811327,NL +1411811328,1411813375,LV +1411813376,1411817471,NO +1411817472,1411821567,PL +1411821568,1411825663,RU +1411825664,1411829759,DE +1411829760,1411833855,PL +1411833856,1411837951,NL +1411837952,1411842047,BG +1411842048,1411850239,NL +1411850240,1411858431,FR +1411858432,1411870719,DE +1411870720,1411871743,CH +1411871744,1411871771,GB +1411871772,1411871775,FR +1411871776,1411871999,GB +1411872000,1411872056,CH +1411872057,1411872057,GB +1411872058,1411872767,CH +1411872768,1411874815,NL +1411874816,1411876863,RU +1411878912,1411880959,CH +1411880960,1411881215,DE +1411881216,1411881471,GB +1411883008,1411887103,PL +1411887104,1411889151,IR +1411889152,1411891199,IT +1411895296,1411899391,SI +1411899392,1411901439,ES +1411901440,1411903487,IE +1411903488,1411907583,RU +1411907584,1411911679,GB +1411911680,1411915775,US +1411915776,1411919871,GB +1411921920,1411922175,GB +1411922176,1411922431,DE +1411922432,1411923967,GB +1411923968,1411940351,BG +1411940352,1411961611,PL +1411961612,1411961612,IE +1411961613,1411973119,PL +1411973120,1411999743,SI +1411999744,1412001279,BA +1412001280,1412002815,SI +1412002816,1412003839,BA +1412003840,1412005887,SI +1412005888,1412038655,NL +1412038656,1412071423,RU +1412071424,1412104191,CZ +1412104192,1412136959,GB +1412136960,1412169727,BG +1412169728,1412202495,TR +1412202496,1412235263,DE +1412235264,1412300799,GB +1412300800,1412333567,DE +1412333568,1412366335,LT +1412366336,1412399103,SK +1412399104,1412400127,RU +1412400128,1412400639,RO +1412400640,1412403711,RU +1412403712,1412403967,RO +1412403968,1412405759,RU +1412405760,1412406271,PL +1412406272,1412408831,RU +1412408832,1412409343,RO +1412409344,1412412159,RU +1412412160,1412412415,UA +1412412416,1412412671,GB +1412412672,1412413439,RU +1412413440,1412413951,RO +1412413952,1412414719,RU +1412414720,1412414975,RO +1412414976,1412415487,RU +1412415488,1412431871,IR +1412431872,1412562943,NO +1412562944,1412628479,EE +1412628480,1412644863,TR +1412644864,1412661247,RU +1412661248,1412677631,GB +1412677632,1412685823,RU +1412685824,1412694015,IE +1412694016,1412710399,EE +1412710400,1412726783,RU +1412726784,1412743167,SI +1412743168,1412775935,NO +1412775936,1412792319,NL +1412792320,1412793343,US +1412793856,1412795903,US +1412796928,1412800511,US +1412801536,1412804607,US +1412804864,1412805631,US +1412806656,1412808703,US +1412808704,1412825087,RU +1412832768,1412833023,SL +1412841472,1412857855,UZ +1412857856,1412874239,BG +1412874240,1412890623,RU +1412890624,1412907007,LT +1412907008,1412923391,SE +1412923392,1412939775,FR +1412939776,1412956159,CH +1412956160,1413455940,DE +1413455941,1413455941,US +1413455942,1413480447,DE +1413480448,1414004735,IN +1414004736,1414069218,CH +1414069219,1414069219,AT +1414069220,1414266879,CH +1414266880,1414529023,ES +1414529024,1415053311,NL +1415053312,1415184383,ES +1415184384,1415315455,PT +1415315456,1415446527,GB +1415446528,1415577599,IL +1415577600,1416101887,FR +1416101888,1416364031,NL +1416364032,1416626175,IL +1416626176,1416941567,AT +1416941568,1416943615,CH +1416943616,1416944639,AT +1416944640,1416945663,CZ +1416945664,1416953855,AT +1416953856,1417019391,RO +1417019392,1417150463,DE +1417150464,1417674751,ES +1417674752,1421869055,DE +1421869056,1422393343,BE +1422393344,1422413567,DE +1422413568,1422413695,AT +1422413696,1422463231,DE +1422463232,1422463743,NL +1422463744,1422491647,DE +1422491648,1422495615,RU +1422495616,1422495679,NL +1422495680,1422508031,RU +1422508032,1422512127,BG +1422512128,1422516223,PL +1422516224,1422520319,BY +1422520320,1422524415,RU +1422524416,1422589951,NO +1422589952,1422655487,IE +1422655488,1422721023,RU +1422721024,1422729215,PL +1422729216,1422737407,NO +1422745600,1422753791,EG +1422753792,1422761983,FR +1422761984,1422770175,PL +1422770176,1422786559,GR +1422786560,1422852095,HU +1422857088,1422857151,FR +1422903296,1422905343,GB +1422905344,1422907391,IE +1422907392,1422911487,NL +1422911488,1422915583,GB +1422916608,1422916863,GB +1422917344,1422917375,NL +1422917632,1423441919,NO +1423441920,1423704063,SE +1423704064,1423966207,IT +1423966208,1424097279,HU +1424097280,1424228351,CH +1424228352,1424359423,IL +1424359424,1424490495,FI +1424490496,1424503711,ES +1424503712,1424503715,PT +1424503716,1424523263,ES +1424523264,1424556031,RO +1424556032,1424588799,EG +1424588800,1424595726,GB +1424595727,1424595727,IT +1424595728,1424595743,GB +1424595744,1424595751,IT +1424595752,1424597069,GB +1424597070,1424597070,CZ +1424597071,1424600705,GB +1424600706,1424600706,FR +1424600707,1424601471,GB +1424601472,1424601535,ES +1424601536,1424601887,GB +1424601888,1424601903,NL +1424601904,1424603023,GB +1424603024,1424603039,US +1424603040,1424604975,GB +1424604976,1424604991,NL +1424604992,1424607743,GB +1424607744,1424607775,DE +1424607776,1424608083,GB +1424608084,1424608087,FR +1424608088,1424608579,GB +1424608580,1424608580,ES +1424608581,1424608671,GB +1424608672,1424608687,ES +1424608688,1424608743,GB +1424608744,1424608751,ES +1424608752,1424609543,GB +1424609544,1424609551,CH +1424609552,1424610643,GB +1424610644,1424610644,PL +1424610645,1424610992,GB +1424610993,1424610993,FR +1424610994,1424611002,GB +1424611003,1424611003,FR +1424611004,1424611005,GB +1424611006,1424611006,FR +1424611007,1424611295,GB +1424611296,1424611311,BE +1424611312,1424613855,GB +1424613856,1424613859,IT +1424613860,1424616319,GB +1424616320,1424616351,IT +1424616352,1424618464,GB +1424618465,1424618465,NL +1424618466,1424618479,GB +1424618480,1424618495,NL +1424618496,1424619343,GB +1424619344,1424619351,IT +1424619352,1424619855,GB +1424619856,1424619863,BE +1424619864,1424621567,GB +1424621568,1424625663,PL +1424625664,1424629759,US +1424629760,1424633855,PL +1424633856,1424637951,MD +1424637952,1424642047,FI +1424642048,1424646143,DK +1424646144,1424647167,UA +1424647168,1424648191,IT +1424648192,1424650239,UA +1424650240,1424654335,PL +1424654336,1424687103,NO +1424687104,1424711679,SA +1424711680,1424713727,BH +1424713728,1424719871,SA +1424719872,1424752639,DE +1424752640,1424785407,HU +1424785408,1424818175,ES +1424818176,1424850943,RU +1424850944,1424883711,LV +1424883712,1424916479,DK +1424916480,1424917503,BG +1424917504,1424918015,IE +1424918016,1424924671,BG +1424924672,1424925183,BE +1424925184,1424925695,RU +1424925696,1424928767,BG +1424928768,1424929279,AT +1424929280,1424949247,BG +1424949248,1424965631,RO +1424965632,1424982015,FR +1424982016,1425014783,FI +1425014784,1425015295,LT +1425015296,1425015551,RU +1425015552,1425031167,LT +1425031168,1425047551,FI +1425047552,1425063935,IT +1425063936,1425080319,KZ +1425080320,1425096703,IR +1425096704,1425113087,CH +1425113088,1425145855,NL +1425145856,1425162239,RU +1425162240,1425178623,CZ +1425178624,1425195007,BG +1425195008,1425211391,RU +1425211392,1425227775,SE +1425227776,1425244159,RO +1425244160,1425260543,NO +1425260544,1425276927,NL +1425276928,1425293311,RU +1425293312,1425309695,CZ +1425309696,1425326079,NL +1425326080,1425342463,SE +1425342464,1425358847,NL +1425358848,1425375231,SK +1425375232,1425391615,DE +1425391616,1425407999,LV +1425408000,1425424383,NL +1425424384,1425426431,DE +1425426432,1425428479,KW +1425428480,1425430527,GB +1425430528,1425432575,SE +1425432576,1425434623,HR +1425434624,1425436671,FR +1425436672,1425438463,GB +1425438464,1425438719,IN +1425438720,1425440767,DE +1425440768,1425442815,SE +1425442816,1425444863,GB +1425444864,1425446911,IT +1425446912,1425448959,GB +1425448960,1425451007,CZ +1425451008,1425459199,GB +1425459200,1425461247,IM +1425461248,1425463295,ES +1425463296,1425467135,FR +1425467136,1425467391,ES +1425467392,1425469439,CH +1425469440,1425471487,DK +1425471488,1425473535,DE +1425473536,1425474559,RO +1425474560,1425475583,US +1425475584,1425478143,RO +1425478144,1425478655,ES +1425478656,1425478911,GB +1425478912,1425479679,RO +1425479680,1425479935,ES +1425479936,1425480191,NL +1425480192,1425480447,FR +1425480448,1425480703,IE +1425480704,1425481727,RO +1425481728,1425482751,US +1425482752,1425483775,RO +1425483776,1425484799,US +1425484800,1425485311,MD +1425485312,1425485823,BG +1425485824,1425486847,RO +1425486848,1425487103,FR +1425487104,1425487359,IE +1425487360,1425488639,RO +1425488640,1425488895,US +1425488896,1425489407,RO +1425489408,1425489663,NL +1425489664,1425506303,RO +1425506304,1425509887,NO +1425509888,1425510143,SE +1425510144,1425522687,NO +1425522688,1425539071,IT +1425539072,1425801215,FI +1425801216,1425817599,BG +1425833984,1425850367,RU +1425850368,1425866751,GB +1425866752,1425883135,CH +1425883136,1425899519,RU +1425899520,1425915903,IT +1425915904,1425932287,FI +1425932288,1425948671,GR +1425948672,1425952767,DE +1425952768,1425960959,CH +1425960960,1425965055,DE +1425967872,1425968127,GB +1425973248,1425975807,GB +1425975808,1425976063,FR +1425976064,1425977343,GB +1425977344,1425980415,FR +1425980416,1425980671,IQ +1425981440,1425997823,RU +1425997824,1426014207,MT +1426014208,1426030591,DK +1426030592,1426046975,BH +1426046976,1426063359,SI +1426063360,1426587647,CH +1426587648,1426604031,SE +1426604032,1426620415,DE +1426636800,1426653183,GB +1426653184,1426669567,RO +1426669568,1426685951,IR +1426685952,1426702335,TJ +1426702336,1426716159,LV +1426716160,1426716415,RU +1426716416,1426718719,LV +1426718720,1426731007,SI +1426731008,1426735103,HR +1426735104,1426743295,BE +1426743296,1426751487,LU +1426751488,1426767871,FR +1426767872,1426784255,DE +1426784256,1426800639,SE +1426800640,1426817023,PL +1426817024,1426833407,BG +1426833408,1426849791,SE +1426849792,1426866175,NL +1426866176,1426882559,GB +1426882560,1426898943,FR +1426898944,1426915327,RU +1426915328,1426931711,AT +1426931712,1426948095,CZ +1426948096,1426964479,DE +1426964480,1426980863,GB +1426980864,1426997247,BG +1426997248,1427013631,PL +1427013632,1427030015,FR +1427030016,1427033247,DE +1427033248,1427033263,TW +1427033264,1427046399,DE +1427046400,1427062783,IR +1427062784,1427095551,RU +1427095552,1427111935,LV +1427111936,1427177471,DE +1427177472,1427243007,NL +1427243008,1427308543,IT +1427308544,1427374079,NO +1427374080,1427439615,IT +1427439616,1427505151,RU +1427505152,1427570687,DE +1427570688,1427636223,FI +1427636224,1427668991,DK +1427668992,1427701759,SE +1427701760,1427740810,DE +1427740811,1427740811,FR +1427740812,1427741372,DE +1427741373,1427741373,AT +1427741374,1427767295,DE +1427767296,1427800063,BE +1427800064,1427832831,RU +1427832832,1427865599,BE +1427865600,1427898367,DK +1427898368,1427914751,RU +1427914752,1427930965,BE +1427930966,1427930966,LU +1427930967,1427931135,BE +1427931136,1427947519,PL +1427947520,1427963903,RU +1427963904,1427980287,TR +1427980288,1427996671,FI +1427996672,1428013055,KZ +1428013056,1428029439,EE +1428029440,1428045823,SE +1428045824,1428062207,MK +1428062208,1428078591,SE +1428078592,1428094975,RU +1428094976,1428103167,AT +1428111360,1428119551,GB +1428119552,1428121599,LV +1428121600,1428123647,FR +1428123648,1428127743,RU +1428127744,1428129791,ES +1428129792,1428131839,GB +1428131840,1428133887,FR +1428133888,1428135935,LI +1428135936,1428137983,IT +1428140032,1428142079,RU +1428142080,1428144127,DE +1428144128,1428152319,FR +1428152320,1428160511,PL +1428160512,1428260863,IT +1428260864,1428261119,GB +1428261120,1429209087,IT +1429209088,1430257663,ES +1430257664,1430388735,IL +1430388736,1430519807,HU +1430519808,1430650879,FR +1430650880,1430781951,CZ +1430781952,1431044095,GR +1431044096,1431306239,FI +1431306240,1431568383,DK +1431568384,1431830527,ES +1431830528,1431838719,DE +1431838720,1431846911,BE +1431846912,1431855103,NO +1431855104,1431863295,NL +1431863296,1431871487,PT +1431871488,1431879679,RU +1431879680,1431887871,IT +1431887872,1431896063,GB +1431896064,1431904255,NO +1431904256,1431912447,EE +1431912448,1431920639,SE +1431920640,1431928831,RU +1431928832,1431937023,IT +1431937024,1431945215,PL +1431945216,1431953407,NO +1431953408,1431961599,DK +1431961600,1431969791,CH +1431969792,1431977983,GB +1431977984,1431980719,NL +1431980720,1431980727,SA +1431980728,1431986175,NL +1431986176,1431994367,RU +1431994368,1432002559,AT +1432002560,1432010751,HU +1432010752,1432018943,UA +1432018944,1432024063,GB +1432024064,1432025087,DE +1432025088,1432027135,GB +1432027136,1432035327,IE +1432035328,1432038399,GB +1432038400,1432039423,NL +1432039424,1432043519,GB +1432043520,1432051711,ES +1432051712,1432054015,RU +1432054016,1432054271,RO +1432054272,1432056831,RU +1432056832,1432057343,RO +1432057344,1432059903,RU +1432059904,1432068095,BG +1432068096,1432076287,BE +1432076288,1432084479,RU +1432084480,1432092671,GB +1432092672,1432100863,RU +1432100864,1432109055,CZ +1432109056,1432117247,GB +1432125440,1432130703,NL +1432130704,1432130711,GB +1432130712,1432131583,NL +1432131584,1432133631,US +1432133632,1432150015,GB +1432150016,1432158207,BA +1432158208,1432158463,RO +1432158464,1432158719,DE +1432158720,1432158975,LB +1432158976,1432159487,DE +1432159488,1432159743,AE +1432159744,1432163327,DE +1432163328,1432163583,PL +1432163584,1432166399,DE +1432166400,1432174591,RU +1432174592,1432182783,DE +1432182784,1432190975,CZ +1432190976,1432199167,RU +1432199168,1432207359,CZ +1432207360,1432215551,LU +1432215552,1432223743,NO +1432223744,1432240127,RU +1432240128,1432248319,HR +1432248320,1432256511,ME +1432256512,1432264703,BA +1432264704,1432272895,AD +1432272896,1432273407,IT +1432273408,1432273535,DE +1432273536,1432281087,IT +1432281088,1432289279,LU +1432289280,1432297471,GB +1432297472,1432305663,NO +1432305664,1432313855,BG +1432313856,1432322047,GB +1432322048,1432338431,RU +1432338432,1432346623,FR +1432346624,1433353473,TR +1433353474,1433353474,GE +1433353475,1433403391,TR +1433403392,1433408831,ES +1433408832,1433408895,NL +1433408896,1433409023,ES +1433409024,1433410047,NL +1433410048,1433411071,ES +1433411072,1433411327,TR +1433411328,1433411343,ES +1433411344,1433411375,TR +1433411376,1433411407,US +1433411408,1433411423,TR +1433411424,1433411439,ES +1433411440,1433411455,TR +1433411456,1433411551,ES +1433411552,1433411567,TR +1433411568,1433411583,ES +1433411584,1433419775,RU +1433419776,1433427967,LB +1433427968,1433436159,RU +1433436160,1433444351,NO +1433444352,1433452543,SE +1433452544,1433460735,PL +1433460736,1433468927,DE +1433468928,1433477119,KG +1433477120,1433485311,RU +1433485312,1433493503,GB +1433493504,1433501695,PS +1433501696,1433509887,RU +1433509888,1433518079,NO +1433518080,1433526271,RU +1433526272,1433534463,NL +1433534464,1433542655,RU +1433542656,1433550847,HR +1433550848,1433559039,RU +1433559040,1433567231,PS +1433567232,1433575423,DE +1433575424,1433583615,RU +1433583616,1433591807,UA +1433591808,1433599999,GE +1433600000,1433608191,DE +1433608192,1433608447,TR +1433608448,1433608703,NL +1433608704,1433608959,GB +1433608960,1433609215,PL +1433609216,1433609471,GB +1433609472,1433609727,NO +1433609728,1433610239,GB +1433610240,1433611263,US +1433611264,1433611775,ES +1433611776,1433614335,GB +1433614336,1433614847,DE +1433614848,1433615027,HU +1433615028,1433615028,DE +1433615029,1433615103,HU +1433615104,1433615359,DE +1433615360,1433615871,FR +1433615872,1433616383,GB +1433616384,1433624575,AE +1433624576,1433632767,LV +1433632768,1433637375,GI +1433637376,1433637631,FR +1433637632,1433640959,GI +1433640960,1433649151,RU +1433657344,1433665535,RU +1433665536,1433669375,GB +1433669376,1433669631,IE +1433669632,1433673727,GB +1433673728,1433681919,FR +1433681920,1433690111,IS +1433690112,1433698303,RU +1433698304,1433706495,IT +1433706496,1433714687,GB +1433714688,1433722879,DE +1433722880,1433731071,IT +1433731072,1433739263,PL +1433739264,1433747299,GE +1433747300,1433747300,IL +1433747301,1433747455,GE +1433747456,1433755647,RU +1433755648,1433763839,KZ +1433763840,1433772031,FR +1433772032,1433788415,SE +1433796608,1433804799,GB +1433804800,1433812273,FR +1433812274,1433812274,GB +1433812275,1433812991,FR +1433812992,1433821183,BG +1433821184,1433829375,GE +1433829376,1433831423,CZ +1433831424,1433833471,RU +1433833472,1433835519,IT +1433835520,1433837567,GB +1433837568,1433839615,DE +1433839616,1433841663,GB +1433841664,1433843711,RU +1433843712,1433845759,AT +1433845760,1433847807,BG +1433847808,1433849855,SE +1433849856,1433851903,BE +1433851904,1433853951,CH +1433853952,1433855999,RU +1433856000,1433858047,GB +1433858048,1433860095,ES +1433860096,1433862143,DE +1433862144,1433864191,CH +1433864192,1433866239,HU +1433866240,1433867521,NL +1433867522,1433867522,GB +1433867523,1433868287,NL +1433868288,1433870335,GB +1433870336,1433872383,TR +1433872384,1433874431,IT +1433874432,1433876479,NL +1433876480,1433878527,GB +1433878528,1433880575,TR +1433880576,1433882623,RU +1433882624,1433884671,GB +1433884672,1433886719,CZ +1433886720,1433888767,GB +1433888768,1433890815,NL +1433890816,1433892863,GB +1433892864,1433894911,MT +1433894912,1433896959,SE +1433896960,1433899007,NO +1433899008,1433901055,RU +1433901056,1433905151,DE +1433905152,1433907199,FR +1433907200,1433909247,IT +1433909248,1433911295,BE +1433911296,1433913343,ES +1433913344,1433917439,DE +1433917440,1433919487,BE +1433919488,1433921535,GB +1433921536,1433923583,CH +1433923584,1433925631,BE +1433925632,1433927679,GB +1433927680,1433971711,RO +1433971712,1433972223,LU +1433972224,1434189823,RO +1434189824,1434451967,AT +1434451968,1434517503,PL +1434517504,1434550271,DK +1434550272,1434583039,SA +1434583040,1434615807,BG +1434615808,1434648575,IL +1434648576,1434681343,FI +1434681344,1434714111,DE +1434714112,1434746879,AZ +1434746880,1434779647,CZ +1434779648,1434812415,GB +1434812416,1434845183,IR +1434845184,1434877951,FI +1434877952,1434910719,IE +1434910720,1434943487,CZ +1434943488,1434976255,SK +1434976256,1435107327,ES +1435107328,1435238399,PT +1435238400,1435500543,RU +1435500544,1436024831,NL +1436024832,1436090367,ES +1436090368,1436155903,TR +1436155904,1436221439,OM +1436221440,1436286975,ES +1436286976,1436418047,FI +1436418048,1436420095,DE +1436422144,1436424191,FR +1436424192,1436426239,CH +1436426240,1436428287,BA +1436428288,1436430335,GB +1436430336,1436432383,RU +1436432384,1436436479,GB +1436436480,1436438527,LV +1436438528,1436440575,IT +1436440576,1436442623,RU +1436442624,1436444671,TR +1436444672,1436446719,BE +1436446720,1436450815,FR +1436450816,1436452863,BH +1436452864,1436453375,GB +1436453376,1436453391,DE +1436453392,1436453399,GB +1436453400,1436453631,DE +1436453632,1436454911,GB +1436454912,1436456959,AZ +1436456960,1436459007,GB +1436459008,1436461055,NL +1436461056,1436463103,ES +1436463104,1436464383,DE +1436464384,1436464639,AT +1436464640,1436465151,DE +1436465152,1436467199,RU +1436467200,1436469247,DE +1436469248,1436471295,NL +1436471296,1436473343,BE +1436473344,1436475391,RO +1436475392,1436477439,AT +1436477440,1436479487,CH +1436479488,1436481535,RU +1436481536,1436483583,NL +1436483584,1436485631,UA +1436485632,1436487679,DE +1436487680,1436489727,IE +1436489728,1436491775,KZ +1436491776,1436495871,RU +1436495872,1436497919,HU +1436497920,1436499967,GB +1436499968,1436504063,TR +1436504064,1436508159,GB +1436508160,1436510207,NL +1436510208,1436512255,SK +1436512256,1436514303,NL +1436514304,1436516351,GI +1436516352,1436520447,GB +1436520448,1436522495,IT +1436522496,1436524543,GB +1436524544,1436526591,IL +1436526592,1436528639,GB +1436528640,1436530687,IT +1436530688,1436532735,GB +1436532736,1436536831,IT +1436536832,1436538879,GB +1436538880,1436540927,JO +1436540928,1436542975,RU +1436542976,1436545023,NL +1436545024,1436547071,DE +1436547072,1436549119,GB +1436549120,1436811263,CZ +1436811264,1437073407,NO +1437073408,1437335551,FR +1437335552,1437597695,RU +1437597696,1438121983,DE +1438121984,1438125055,NL +1438125056,1438125311,ES +1438125312,1438125567,NL +1438125568,1438125823,FR +1438125824,1438126079,IE +1438126080,1438130175,CZ +1438130176,1438138367,PS +1438138368,1438146559,FR +1438146560,1438147583,MT +1438147584,1438147839,SE +1438147840,1438148095,BE +1438148096,1438148351,GB +1438148352,1438154751,MT +1438154752,1438171135,DK +1438171136,1438173183,GB +1438173184,1438179327,IM +1438179328,1438180351,ES +1438180352,1438181375,NL +1438181376,1438183423,SA +1438183424,1438184447,PS +1438184448,1438185471,CH +1438185472,1438186495,DE +1438186496,1438187519,CH +1438187520,1438253055,IR +1438253056,1438318591,RO +1438318592,1438320127,BG +1438320128,1438320383,NL +1438320384,1438351359,BG +1438351360,1438359551,US +1438359552,1438384127,BG +1438384128,1438400511,FI +1438400512,1438433279,SE +1438433280,1438515199,GB +1438515200,1438531583,DE +1438531584,1438539775,FR +1438539776,1438547967,NL +1438547968,1438553343,DE +1438553344,1438553599,GB +1438553600,1438553855,DE +1438553856,1438554111,BR +1438554112,1438554623,US +1438554624,1438555135,DE +1438555136,1438556159,US +1438556160,1438560255,DE +1438560256,1438562303,US +1438562304,1438572543,DE +1438572544,1438572671,RU +1438572672,1438572799,TR +1438572800,1438572863,BE +1438572864,1438572927,NL +1438572928,1438573055,LU +1438573056,1438573119,TW +1438573120,1438573183,KR +1438573184,1438573247,SG +1438573248,1438573311,JP +1438573312,1438573375,CA +1438573376,1438573439,KR +1438573440,1438573503,PT +1438573504,1438573567,DK +1438573568,1438573823,US +1438573824,1438574079,DE +1438574080,1438574335,GB +1438574336,1438574591,US +1438574592,1438578687,PL +1438578688,1438579967,DE +1438579968,1438580095,NZ +1438580096,1438580223,AU +1438580224,1438580479,US +1438580480,1438580735,DE +1438580736,1438646271,DK +1438646272,1438662655,RU +1438662656,1438679039,ES +1438679040,1438695423,RU +1438695424,1438711807,FR +1438711808,1438728191,CZ +1438728192,1438744575,RU +1438744576,1438748671,AT +1438748672,1438752767,GB +1438752768,1438760959,AT +1438760960,1438777343,PL +1438777344,1438793727,SE +1438793728,1438810111,SA +1438810112,1438826495,SE +1438826496,1438827519,FI +1438827520,1438828543,IQ +1438828544,1438829567,EE +1438829568,1438836991,FI +1438836992,1438837247,DK +1438837248,1438838783,FI +1438838784,1438840831,PL +1438840832,1438841855,IQ +1438841856,1438842367,DE +1438842368,1438842879,DK +1438842880,1438859263,SE +1438859264,1438875647,DE +1438875648,1438876927,LT +1438876928,1438877183,IQ +1438877184,1438877951,LT +1438877952,1438878207,LB +1438878208,1438891007,LT +1438891008,1438892031,RU +1438892032,1438908415,CH +1438908416,1438924799,GR +1438924800,1438941183,NO +1438941184,1438957567,BG +1438957568,1438973951,EE +1438973952,1439000575,DE +1439000576,1439000831,NL +1439000832,1439002367,DE +1439002368,1439002623,NL +1439002624,1439006719,DE +1439006720,1439023103,SE +1439023104,1439039487,IS +1439039488,1439055871,IR +1439055872,1439072255,RU +1439072256,1439088639,UA +1439088640,1439105023,PL +1439105024,1439121407,AT +1439121408,1439154175,DE +1439154176,1439170559,GB +1439170560,1439236095,NO +1439236096,1439301631,BE +1439301632,1439305727,RU +1439305728,1439309823,DK +1439309824,1439318015,PL +1439318016,1439322111,DK +1439326208,1439330303,PL +1439330304,1439334399,RS +1439334400,1439338495,RU +1439338496,1439342591,PL +1439346688,1439350783,RU +1439354880,1439358975,PL +1439358976,1439367167,RU +1439367168,1439369215,NL +1439369216,1439369471,AE +1439369472,1439369727,ES +1439369728,1439370495,NL +1439370496,1439370751,FR +1439370752,1439371007,NL +1439371008,1439371263,DE +1439371264,1439371519,CZ +1439371520,1439371775,FR +1439371776,1439372031,SE +1439372032,1439372287,TR +1439372288,1439372543,IT +1439372544,1439372799,JP +1439372800,1439372815,MT +1439372816,1439372831,AD +1439372832,1439372847,CY +1439372848,1439372863,AM +1439372864,1439372879,BY +1439372880,1439372895,IM +1439372896,1439372911,BA +1439372912,1439372959,IM +1439372960,1439372975,JE +1439372976,1439372991,LI +1439372992,1439373007,MK +1439373008,1439373023,MC +1439373024,1439373039,ME +1439373040,1439373040,SC +1439373041,1439373055,IM +1439373056,1439373311,US +1439373312,1439373567,AE +1439373568,1439373823,KW +1439373824,1439374079,OM +1439374080,1439374335,MX +1439374336,1439375359,IT +1439375360,1439375615,MX +1439375616,1439375871,KW +1439375872,1439376127,OM +1439376128,1439376383,SA +1439376384,1439376639,US +1439376640,1439376895,NL +1439376896,1439377407,CN +1439377408,1439378431,IT +1439378432,1439378687,NL +1439378688,1439378943,CA +1439378944,1439379199,GB +1439379200,1439379455,HK +1439379456,1439380479,US +1439380480,1439380991,IN +1439380992,1439381503,US +1439381504,1439382527,MX +1439382528,1439383551,US +1439383552,1439399935,FR +1439399936,1439432703,DK +1439432704,1439437823,RO +1439437824,1439438335,FR +1439438336,1439438847,RO +1439438848,1439439359,FR +1439439360,1439439615,RO +1439439616,1439439871,PL +1439439872,1439440383,RO +1439440384,1439440895,IR +1439440896,1439441919,RO +1439441920,1439442943,ES +1439442944,1439446527,RO +1439446528,1439447039,DE +1439447040,1439449087,RO +1439449088,1439450111,GR +1439450112,1439450879,RO +1439450880,1439451135,IT +1439451136,1439451647,RO +1439451648,1439451903,LT +1439451904,1439452159,RO +1439452160,1439452671,IR +1439452672,1439453183,RO +1439453184,1439457279,IR +1439457280,1439457791,DE +1439457792,1439459327,RO +1439459328,1439459839,IR +1439459840,1439460607,RO +1439460608,1439460863,MD +1439460864,1439461375,RO +1439461376,1439462399,IT +1439462400,1439462655,RO +1439462656,1439462911,NL +1439462912,1439463167,RO +1439463168,1439463423,IT +1439463424,1439463935,DK +1439463936,1439465471,RO +1439465472,1439466495,IR +1439466496,1439467007,DK +1439467008,1439467263,RO +1439467264,1439467519,FR +1439467520,1439468031,DK +1439468032,1439468543,RO +1439468544,1439469567,ES +1439469568,1439469823,DE +1439469824,1439470335,RO +1439470336,1439470591,IT +1439470592,1439471615,US +1439471616,1439473663,ES +1439473664,1439474687,US +1439474688,1439475711,RO +1439475712,1439475967,IN +1439475968,1439476735,RO +1439476736,1439477759,IN +1439477760,1439479807,MD +1439479808,1439482367,RO +1439482368,1439482879,DK +1439482880,1439483903,RO +1439483904,1439485951,ES +1439485952,1439490047,IR +1439490048,1439495423,RO +1439495424,1439495679,GB +1439495680,1439496959,RO +1439496960,1439497215,GB +1439497216,1439498239,RO +1439498240,1439513599,DE +1439513600,1439514623,GB +1439514624,1439516671,IT +1439516672,1439518207,DE +1439518208,1439518719,IT +1439518720,1439527935,DE +1439527936,1439528959,GB +1439528960,1439529599,DE +1439529600,1439529983,GB +1439529984,1439530239,EG +1439530240,1439534079,DE +1439534080,1439535103,GB +1439535104,1439536127,IT +1439536128,1439537151,DE +1439537152,1439538175,IT +1439538176,1439538687,GB +1439538688,1439539199,IT +1439539200,1439549439,DE +1439549440,1439551487,IT +1439551488,1439556095,DE +1439556096,1439556607,IT +1439556608,1439558143,DE +1439558144,1439558911,IT +1439558912,1439560191,DE +1439560192,1439560447,IT +1439560448,1439560703,DE +1439560704,1439561215,IT +1439561216,1439561727,DE +1439561728,1439562239,GB +1439562240,1439562751,IE +1439562752,1439563007,DE +1439563008,1439563263,GB +1439563264,1439563775,DE +1439563776,1439629311,LT +1439629312,1439694847,CZ +1439825920,1439956991,GB +1439956992,1440251903,DE +1440251904,1440284671,SK +1440284672,1440317439,FI +1440317440,1440322559,BG +1440322560,1440322815,DE +1440322816,1440325631,BG +1440325632,1440326655,DE +1440326656,1440328703,BG +1440328704,1440329727,DE +1440329728,1440331775,BG +1440331776,1440333823,DE +1440333824,1440350207,BG +1440350208,1440382975,CH +1440382976,1440415743,DK +1440415744,1440448511,ES +1440448512,1440481279,PL +1440481280,1440514047,IS +1440514048,1440546815,DE +1440546816,1440579583,NO +1440579584,1440645119,PL +1440645120,1440653311,GB +1440653312,1440661503,RS +1440661504,1440663551,NL +1440663552,1440665599,FR +1440665600,1440669695,DE +1440669696,1440671743,NL +1440671744,1440672767,EE +1440672768,1440710655,NL +1440710656,1440743423,UA +1440743424,1441267711,SE +1441267712,1441275903,DE +1441275904,1441284095,GB +1441284096,1441292287,AT +1441292288,1441300479,RU +1441300480,1441308671,LT +1441308672,1441316863,HR +1441316864,1441325055,MT +1441325056,1441333247,PL +1441333248,1441349631,DE +1441349632,1441357823,RU +1441357824,1441366015,AT +1441366016,1441374207,RU +1441374208,1441382399,GB +1441382400,1441390591,FR +1441390592,1441398783,DK +1441398784,1441403903,RU +1441403904,1441404159,US +1441404160,1441415167,RU +1441415168,1441423359,GB +1441423360,1441431551,RU +1441431552,1441439743,GB +1441439744,1441447935,LV +1441447936,1441456127,BE +1441456128,1441460735,NL +1441460736,1441462271,EE +1441462272,1441464319,PL +1441464320,1441472511,SE +1441472512,1441480703,RU +1441488896,1441497087,GB +1441497088,1441505279,IT +1441505280,1441521663,RU +1441521664,1441529855,DK +1441529856,1441538047,RU +1441538048,1441546239,DE +1441546240,1441554431,DK +1441554432,1441556479,GB +1441556480,1441556991,DE +1441556992,1441557503,SE +1441557504,1441558015,NL +1441558016,1441564671,GB +1441564672,1441566719,NL +1441566720,1441568767,GB +1441568768,1441570815,FR +1441570816,1441579007,RU +1441579008,1441587199,DE +1441587200,1441603583,AT +1441603584,1441611775,RU +1441611776,1441619967,DE +1441619968,1441628159,FR +1441628160,1441636351,SA +1441636352,1441644543,PL +1441644544,1441651455,GB +1441651456,1441651711,CA +1441651712,1441652735,GB +1441652736,1441660927,SK +1441660928,1441669119,ES +1441669120,1441677311,GE +1441677312,1441685503,HU +1441685504,1441693695,UA +1441693696,1441694719,BR +1441694720,1441696767,DE +1441696768,1441697791,SG +1441697792,1441698815,US +1441698816,1441701887,DE +1441701888,1441710079,AT +1441710080,1441718271,SE +1441718272,1441726463,DE +1441726464,1441734655,KW +1441734656,1441742847,RU +1441742848,1441751039,CZ +1441751040,1441759231,DE +1441759232,1441767423,BG +1441767424,1441775615,IT +1441775616,1441783807,IR +1441783808,1441791999,CZ +1441792000,1442316287,PT +1442316288,1442381823,SK +1442381824,1442447359,RU +1442447360,1442512895,IL +1442512896,1442578431,ES +1442578432,1442643967,NO +1442643968,1442709503,EE +1442709504,1442775039,LV +1442775040,1442779135,CZ +1442779136,1442783231,DE +1442783232,1442787327,NO +1442787328,1442791423,LT +1442791424,1442795519,LV +1442799616,1442803711,LT +1442803712,1442807807,RO +1442807808,1442811903,BG +1442811904,1442815999,AT +1442816000,1442820095,BG +1442820096,1442822143,UA +1442822144,1442824191,RU +1442824192,1442828287,BE +1442828288,1442832383,NL +1442832384,1442836479,GB +1442836480,1442840575,PL +1442840576,1444937727,GB +1444937728,1445068799,AT +1445068800,1445199871,RO +1445199872,1445330943,QA +1445330944,1445396479,LT +1445396480,1445462015,BE +1445462016,1445986303,IE +1445986304,1446051839,DK +1446051840,1446117375,CZ +1446117376,1446182911,FI +1446182912,1446248447,SA +1446248448,1446313983,DK +1446313984,1446445055,GB +1446445056,1446510591,IR +1446510592,1446543359,DE +1446543360,1446576127,AT +1446576128,1446608895,IR +1446608896,1446641663,BY +1446641664,1446674431,SI +1446674432,1446704127,DK +1446704128,1446705151,ES +1446705152,1446707199,DK +1446707200,1446739967,AT +1446739968,1446772735,HU +1446772736,1446805503,SA +1446805504,1446838271,FI +1446838272,1446871039,SI +1446871040,1446903807,CZ +1446906880,1446907135,IQ +1446910720,1446911231,IQ +1446920192,1446936575,RU +1446936576,1446952959,NO +1446952960,1446969343,QA +1446969344,1446985727,GB +1446985728,1447010303,PL +1447010304,1447018495,LV +1447018496,1447026687,CZ +1447026688,1448083455,FR +1448083456,1449132031,NL +1449132032,1449394175,AE +1449394176,1449459711,LT +1449459712,1449525247,HU +1449525248,1449590783,RU +1449590784,1449656319,DE +1449656320,1449657087,GB +1449657088,1449659903,RO +1449659904,1449660159,NL +1449660160,1449660415,BG +1449660416,1449661439,RO +1449661440,1449662463,US +1449662464,1449663487,ES +1449663488,1449663999,GB +1449664000,1449664511,RO +1449664512,1449668607,IR +1449668608,1449672703,SE +1449672704,1449673727,RO +1449673728,1449674751,GR +1449674752,1449675775,RO +1449675776,1449676799,US +1449676800,1449684991,IR +1449684992,1449687039,ES +1449687040,1449688063,GR +1449688064,1449688575,RO +1449688576,1449688831,GB +1449688832,1449690623,RO +1449690624,1449690879,IE +1449690880,1449695231,RO +1449695232,1449697279,SE +1449697280,1449699327,PS +1449699328,1449701375,ES +1449701376,1449702655,RO +1449702656,1449702911,GB +1449702912,1449706495,RO +1449706496,1449707519,MD +1449707520,1449709567,SE +1449709568,1449709823,GB +1449709824,1449710079,US +1449710080,1449710591,RO +1449710592,1449711103,GB +1449711104,1449713151,RO +1449713152,1449714175,GB +1449714176,1449715711,RO +1449715712,1449719807,IR +1449719808,1449720831,US +1449720832,1449721343,FR +1449721344,1449722111,RO +1449722112,1449722367,IT +1449722368,1449722623,GB +1449722624,1449723135,RO +1449723136,1449723391,DE +1449723392,1449723903,GB +1449723904,1449724159,IT +1449724160,1449724415,RO +1449724416,1449724927,RU +1449724928,1449725439,GB +1449725440,1449726463,RO +1449726464,1449726719,NL +1449726720,1449726975,RO +1449726976,1449727999,NO +1449728000,1449728255,MD +1449728256,1449729023,RO +1449729024,1449730047,ES +1449730048,1449732095,RO +1449732096,1449734143,IR +1449734144,1449736191,DE +1449736192,1449738239,MD +1449738240,1449742335,RO +1449742336,1449744383,MD +1449744384,1449748479,RO +1449748480,1449749503,US +1449749504,1449750527,RO +1449750528,1449752575,SE +1449752576,1449754623,RO +1449754624,1449758719,IR +1449758720,1449759743,RO +1449759744,1449759999,NL +1449760000,1449760255,ES +1449760256,1449760511,IE +1449760512,1449761791,RO +1449761792,1449762815,ES +1449762816,1449763839,AU +1449763840,1449764863,RO +1449764864,1449765119,FR +1449765120,1449765887,RO +1449765888,1449766911,MD +1449766912,1449767167,GB +1449767168,1449767423,IT +1449767424,1449767679,GB +1449767680,1449767935,IT +1449767936,1449768959,RO +1449768960,1449769471,GB +1449769472,1449769983,RO +1449769984,1449771007,GR +1449771008,1449772031,RO +1449772032,1449772287,GB +1449772288,1449773055,RO +1449773056,1449774079,GR +1449774080,1449775103,RO +1449775104,1449776127,MD +1449776128,1449776639,FR +1449776640,1449778431,RO +1449778432,1449778687,NL +1449778688,1449779455,RO +1449779456,1449779711,GB +1449779712,1449779967,RO +1449779968,1449780223,RU +1449780224,1449780479,RO +1449780480,1449780991,GB +1449780992,1449781247,RO +1449781248,1449781503,MD +1449781504,1449782015,RO +1449782016,1449782271,GB +1449782272,1449783295,IT +1449783296,1449783551,DE +1449783552,1449783807,RO +1449783808,1449784319,GB +1449784320,1449785343,RO +1449785344,1449786367,GR +1449786368,1449786879,RO +1449786880,1449787391,FR +1449787392,1449789439,ES +1449789440,1449790207,GB +1449790208,1449790719,RO +1449790720,1449791487,GB +1449791488,1449791743,ES +1449791744,1449793279,RO +1449793280,1449793535,NL +1449793536,1449794047,IR +1449794048,1449794303,PH +1449794304,1449803775,RO +1449803776,1449805823,ES +1449805824,1449806591,RO +1449806592,1449807103,IE +1449807104,1449808639,RO +1449808640,1449808895,UA +1449808896,1449810687,RO +1449810688,1449810943,PL +1449810944,1449811199,FR +1449811200,1449811455,BG +1449811456,1449811967,GB +1449811968,1449812223,DK +1449812224,1449812991,RO +1449812992,1449813503,GB +1449813504,1449813759,RU +1449813760,1449814271,RO +1449814272,1449815039,GB +1449815040,1449815295,RO +1449815296,1449816063,GB +1449816064,1449816575,RO +1449816576,1449817855,GB +1449817856,1449818111,RO +1449818112,1449818367,DE +1449818368,1449818623,RO +1449818624,1449819135,TR +1449819136,1449820927,RO +1449820928,1449821183,DE +1449821184,1449822719,RO +1449822720,1449823743,GB +1449823744,1449823999,BG +1449824000,1449824255,RO +1449824256,1449826303,MD +1449826304,1449827327,US +1449827328,1449828351,RO +1449828352,1449830399,SE +1449830400,1449831935,RO +1449831936,1449832447,GB +1449832448,1449834495,RO +1449834496,1449835519,ES +1449835520,1449836543,RO +1449836544,1449838591,IR +1449838592,1449840639,RO +1449840640,1449852927,MD +1449852928,1449857023,IR +1449857024,1449858047,SY +1449858048,1449859583,RO +1449859584,1449860607,GB +1449860608,1449863679,RO +1449863680,1449863935,GB +1449863936,1449865215,RO +1449865216,1449865727,SE +1449865728,1449869311,RO +1449869312,1449870335,MD +1449870336,1449870847,RO +1449870848,1449871615,GB +1449871616,1449871871,RO +1449871872,1449872383,GB +1449872384,1449873407,RO +1449873408,1449877503,IR +1449877504,1449878527,IT +1449878528,1449879039,RO +1449879040,1449879167,PH +1449879168,1449879295,TH +1449879296,1449880319,RO +1449880320,1449880575,ES +1449880576,1449881087,US +1449881088,1449883647,RO +1449883648,1449885695,BE +1449885696,1449886463,KZ +1449886464,1449886719,RO +1449886720,1449889791,KZ +1449889792,1449893887,IR +1449893888,1449895935,MD +1449895936,1449896447,RO +1449896448,1449896959,GB +1449896960,1449897983,IR +1449897984,1449900543,RO +1449900544,1449901055,MD +1449901056,1449901311,RO +1449901312,1449901823,FR +1449901824,1449902079,DE +1449902080,1449902335,RO +1449902336,1449903103,GB +1449903104,1449903359,ES +1449903360,1449904127,RO +1449904128,1449906175,NL +1449906176,1449910271,IR +1449910272,1449914879,RO +1449914880,1449915135,DE +1449915136,1449915391,SE +1449915392,1449918463,RO +1449918464,1449951231,JO +1449951232,1449983999,TR +1449984000,1449992191,NL +1449992192,1450000383,IR +1450000384,1450008575,HU +1450008576,1450016767,ES +1450016768,1450024959,IT +1450024960,1450033151,ES +1450033152,1450041343,RU +1450041344,1450049535,DE +1450049536,1450057727,RU +1450057728,1450065919,EE +1450065920,1450067135,DE +1450067136,1450067199,AT +1450067200,1450074111,DE +1450074112,1450082303,RU +1450082304,1450090495,IT +1450090496,1450106879,RU +1450106880,1450115071,SK +1450115072,1450123263,RU +1450123264,1450131455,AT +1450131456,1450139647,UA +1450139648,1450147839,PL +1450147840,1450151935,CH +1450151936,1450153983,IQ +1450153984,1450156031,DE +1450156032,1450164199,GB +1450164200,1450164200,US +1450164201,1450164221,GB +1450164222,1450164222,US +1450164223,1450164223,GB +1450164224,1450166271,SA +1450166272,1450168319,PL +1450170368,1450172415,GB +1450172416,1450174463,UA +1450174464,1450176511,DE +1450176512,1450178559,PL +1450178560,1450180607,DE +1450180608,1450311679,GB +1450311680,1450442751,FI +1450442752,1450704895,CH +1450704896,1451229183,RO +1451229184,1451415166,GB +1451415167,1451415167,US +1451415168,1455423487,GB +1455423488,1459617791,FR +1459617792,1461714943,IT +1461714944,1462763519,IE +1462763520,1463812095,DK +1463812096,1464074239,BE +1464074240,1464336383,IL +1464336384,1464467455,DK +1464467456,1464598527,GB +1464598528,1464602623,RU +1464602624,1464606719,GB +1464606720,1464614911,KZ +1464614912,1464664063,UA +1464664064,1464860671,DE +1464860672,1465384959,GB +1465384960,1465647103,FR +1465647104,1465909247,FI +1465909248,1465942015,PL +1465942016,1465974783,SE +1465974784,1466007551,HU +1466007552,1466040319,BG +1466040320,1466073087,EE +1466073088,1466086016,FR +1466086017,1466086017,ES +1466086018,1466097919,FR +1466097920,1466099711,ES +1466099712,1466101759,PL +1466101760,1466101951,FR +1466101952,1466102015,DE +1466102016,1466102271,FR +1466102272,1466102527,DE +1466102528,1466102783,FR +1466102784,1466103807,DE +1466103808,1466104575,GB +1466104576,1466104942,FR +1466104943,1466104943,BE +1466104944,1466105173,FR +1466105174,1466105174,BE +1466105175,1466105343,FR +1466105344,1466105855,GB +1466105856,1466122239,PL +1466122240,1466130431,LV +1466130432,1466138623,PL +1466138624,1466171391,SE +1466171392,1466204159,FR +1466204160,1466236927,FI +1466236928,1466241023,NL +1466241024,1466249215,PL +1466249216,1466253311,GR +1466253312,1466257407,PL +1466261504,1466265599,GB +1466265600,1466269695,HU +1466269696,1466302463,SA +1466302464,1466335231,GB +1466335232,1466367999,CH +1466368000,1466400767,PT +1466400768,1466433535,RU +1466433536,1466499071,DK +1466499072,1466564607,PL +1466564608,1466571894,DE +1466571895,1466571895,AE +1466571896,1466588785,DE +1466588786,1466588786,FR +1466588787,1466589183,DE +1466589184,1466590207,FR +1466590208,1466591999,GB +1466592000,1466613759,DE +1466613760,1466615807,ES +1466615808,1466616575,GB +1466616576,1466630143,DE +1466630144,1466695679,IR +1466695680,1466761215,FI +1466761216,1466826751,SA +1466826752,1466886399,LV +1466886400,1466886655,LT +1466886656,1466892287,LV +1466892288,1466957823,ES +1466957824,1467219967,GB +1467219968,1467236351,DK +1467236352,1467252735,BG +1467252736,1467269119,RS +1467269120,1467285503,PL +1467285504,1467301887,RU +1467301888,1467303423,GB +1467303424,1467303935,CH +1467303936,1467310079,GB +1467310080,1467314175,ES +1467314176,1467316223,GB +1467316224,1467318271,CH +1467318272,1467334655,RU +1467334656,1467351039,GB +1467351040,1467367423,NO +1467367424,1467383807,DE +1467383808,1467400191,BG +1467400192,1467416575,RU +1467416576,1467432959,PL +1467432960,1467449343,BG +1467449344,1467457535,SI +1467457536,1467465727,EE +1467465728,1467466751,NL +1467466752,1467472895,DE +1467472896,1467473919,NL +1467473920,1467482111,RU +1467482112,1467484927,BG +1467484928,1467485183,IL +1467485184,1467502591,BG +1467502592,1467503615,DE +1467503616,1467525119,BG +1467525120,1467527167,DE +1467527168,1467535359,BG +1467535360,1467537407,DE +1467537408,1467543551,BG +1467543552,1467544575,DE +1467544576,1467545599,BG +1467545600,1467546623,DE +1467546624,1467566079,BG +1467566080,1467567103,DE +1467567104,1467571199,BG +1467571200,1467572223,DE +1467572224,1467579903,BG +1467579904,1467580415,IL +1467580416,1467582463,BG +1467582464,1467584511,DE +1467584512,1467593727,BG +1467593728,1467597823,DE +1467597824,1467604991,BG +1467604992,1467611135,DE +1467611136,1467613183,BG +1467613184,1467744255,DE +1467744256,1467777023,GB +1467777024,1467875327,ES +1467875328,1467940863,BG +1467940864,1468006399,GB +1468006400,1472200703,DE +1472200704,1472259071,IE +1472259072,1472259327,GB +1472259328,1472266239,IE +1472266240,1472331775,DE +1472331776,1472397311,GB +1472397312,1472462847,NL +1472462848,1472528383,PT +1472528384,1472593919,SK +1472593920,1472659455,IE +1472659456,1472724991,PL +1472724992,1472856063,AE +1472856064,1472987135,GR +1472987136,1473249279,PL +1473249280,1473773567,NL +1473773568,1474297855,ES +1474297856,1474330623,GB +1474330624,1474396159,RU +1474396160,1474428927,DE +1474428928,1474461695,LV +1474461696,1474494463,RU +1474494464,1474527231,SE +1474527232,1474559999,BG +1474560000,1474592767,RU +1474592768,1474625535,CY +1474625536,1474658303,HU +1474658304,1474691071,RU +1474691072,1474723839,DE +1474723840,1474756607,SA +1474756608,1474822143,FR +1474822144,1474887679,IE +1474887680,1474953215,NL +1474953216,1475018751,DE +1475018752,1475084287,ES +1475084288,1475086335,NL +1475086336,1475092479,RU +1475092480,1475094527,CY +1475094528,1475096575,RU +1475096576,1475098623,BH +1475098624,1475102719,GB +1475102720,1475104767,FR +1475104768,1475106815,RU +1475106816,1475108863,SE +1475108864,1475110911,NL +1475110912,1475112959,DE +1475112960,1475115007,AT +1475115008,1475117055,KW +1475117056,1475119103,GB +1475119104,1475121151,BH +1475121152,1475123199,GB +1475123200,1475125247,FI +1475125248,1475127295,IT +1475127296,1475129343,FI +1475129344,1475131391,BE +1475131392,1475133439,RU +1475133440,1475135487,CZ +1475135488,1475137535,CH +1475137536,1475138815,GB +1475138816,1475139327,IR +1475139328,1475139583,LT +1475139584,1475141631,ES +1475141632,1475143679,FI +1475143680,1475145727,JO +1475145728,1475147775,ES +1475147776,1475149823,GB +1475149824,1475151871,NL +1475151872,1475153919,BE +1475153920,1475155967,GB +1475155968,1475158015,NL +1475158016,1475160063,IS +1475160064,1475162111,RU +1475162112,1475170303,GB +1475170304,1475172351,ES +1475172352,1475174399,DE +1475174400,1475175047,NL +1475175048,1475175055,US +1475175056,1475176447,NL +1475176448,1475178495,RO +1475178496,1475180543,RU +1475180544,1475184639,DE +1475184640,1475186687,RU +1475186688,1475188735,GB +1475188736,1475190783,SE +1475192832,1475194879,CH +1475194880,1475196927,DE +1475196928,1475198975,FR +1475198976,1475201023,BH +1475201024,1475203071,RS +1475203072,1475205119,SE +1475205120,1475205887,DE +1475205888,1475206143,US +1475206144,1475207167,DE +1475207168,1475207423,AE +1475207424,1475207679,GR +1475207680,1475209215,AE +1475209216,1475211263,UZ +1475211264,1475213311,DE +1475213312,1475215359,FR +1475215360,1475223551,IT +1475223552,1475233791,NO +1475233792,1475235839,GB +1475235840,1475237887,IE +1475237888,1475239935,ES +1475239936,1475241983,RU +1475241984,1475244031,FR +1475244032,1475245823,DE +1475245824,1475246079,RU +1475246080,1475248127,CH +1475248128,1475250175,JO +1475250176,1475252223,DE +1475252224,1475254271,FR +1475254272,1475256319,UA +1475256320,1475258367,BE +1475258368,1475260415,NL +1475260416,1475262463,FR +1475262464,1475266559,DE +1475266560,1475268607,GB +1475268608,1475269375,XK +1475269376,1475270655,RS +1475270656,1475272703,GB +1475272704,1475274751,BE +1475274752,1475276799,RU +1475276800,1475278847,ES +1475278848,1475280895,DK +1475280896,1475282943,RU +1475282944,1475284991,NL +1475284992,1475287039,GB +1475287040,1475291135,RU +1475291136,1475293183,PL +1475295232,1475297279,SK +1475297280,1475299327,DK +1475299328,1475301375,PL +1475301376,1475303423,LT +1475303424,1475305471,PL +1475305472,1475307519,NL +1475307520,1475309567,RU +1475309568,1475311615,LT +1475311616,1475313663,FI +1475313664,1475315711,DE +1475315712,1475317759,US +1475317760,1475319807,RU +1475319808,1475321855,BG +1475321856,1475323903,RO +1475323904,1475327999,PL +1475328000,1475330047,NL +1475330048,1475332095,PL +1475332096,1475336191,CH +1475336192,1475338239,PL +1475338240,1475340287,RO +1475340288,1475342335,GR +1475342336,1475344383,PL +1475344384,1475344639,GR +1475344640,1475344895,RO +1475344896,1475345151,SE +1475345152,1475345919,NL +1475345920,1475346175,ES +1475346176,1475346431,IL +1475346432,1475362815,RU +1475362816,1475379199,FR +1475379200,1475395583,RU +1475395584,1475411967,LU +1475411968,1475428351,IT +1475428352,1475444735,SE +1475444736,1475461119,AM +1475461120,1475477503,RU +1475477504,1475493887,HU +1475493888,1475510271,RU +1475510272,1475543039,GB +1475543040,1475545087,RO +1475545088,1475559423,KZ +1475559424,1475575807,BG +1475575808,1475592191,AT +1475592192,1475608575,GB +1475608576,1475624959,RU +1475624960,1475634991,JE +1475634992,1475634995,GB +1475634996,1475635043,JE +1475635044,1475635047,GB +1475635048,1475635075,JE +1475635076,1475635079,GB +1475635080,1475635159,JE +1475635160,1475635167,GB +1475635168,1475636287,JE +1475636288,1475636351,GB +1475636352,1475637303,JE +1475637304,1475637311,GB +1475637312,1475637471,JE +1475637472,1475637479,GB +1475637480,1475638783,JE +1475638784,1475639039,GB +1475639040,1475639391,JE +1475639392,1475639399,GB +1475639400,1475639479,JE +1475639480,1475639487,GB +1475639488,1475639559,JE +1475639560,1475639567,GB +1475639568,1475639583,JE +1475639584,1475639591,GB +1475639592,1475639695,JE +1475639696,1475639703,GB +1475639704,1475641343,JE +1475641344,1475657727,UA +1475657728,1475674111,SK +1475674112,1475690495,DE +1475690496,1475706879,CH +1475706880,1475727359,RU +1475727360,1475727391,FI +1475727392,1475727775,GB +1475727776,1475727871,FI +1475727872,1475728639,GB +1475728640,1475728767,PL +1475728768,1475728895,GB +1475728896,1475729151,DE +1475729152,1475729247,AT +1475729248,1475729407,GB +1475729408,1475729535,UA +1475729536,1475729663,GB +1475729664,1475729671,UA +1475729672,1475729791,GB +1475729792,1475729855,UA +1475729856,1475730751,GB +1475730752,1475730815,UA +1475730816,1475731007,GB +1475731008,1475731071,UA +1475731072,1475731135,GB +1475731136,1475731167,UA +1475731168,1475735485,GB +1475735486,1475735486,RU +1475735487,1475738111,GB +1475738112,1475738879,RU +1475738880,1475739647,GB +1475739648,1475749887,BG +1475749888,1475750911,IQ +1475750912,1475756031,BG +1475756032,1475772415,GB +1475772416,1475788799,LV +1475788800,1475805183,PL +1475805184,1475821567,KZ +1475821568,1475837951,LT +1475837952,1475846143,GB +1475846144,1475854335,IR +1475854336,1475862527,AT +1475862528,1475864575,FR +1475864576,1475866623,IT +1475866624,1475868671,GB +1475868672,1475870719,BG +1475870720,1475878911,NO +1475878912,1475887103,IT +1475887104,1475895295,PL +1475895296,1475901439,GB +1475901440,1475903487,CH +1475903488,1475911679,IR +1475911680,1475919871,MD +1475919872,1475928063,IT +1475928064,1475952639,RU +1475952640,1475954175,GB +1475954176,1475954687,NO +1475954688,1475955247,GB +1475955248,1475955255,NG +1475955256,1475958527,GB +1475958528,1475958783,NO +1475958784,1475960831,GB +1475960832,1475969023,NL +1475969024,1475977215,CZ +1475977216,1475985407,SE +1475985408,1476009983,RU +1476009984,1476010047,RS +1476010048,1476010111,XK +1476010112,1476011327,RS +1476011328,1476011775,XK +1476011776,1476012095,RS +1476012096,1476012176,XK +1476012177,1476012177,RS +1476012178,1476012221,XK +1476012222,1476012222,RS +1476012223,1476012238,XK +1476012239,1476012239,RS +1476012240,1476012250,XK +1476012251,1476012251,RS +1476012252,1476012278,XK +1476012279,1476012279,RS +1476012280,1476012287,XK +1476012288,1476014079,RS +1476014080,1476014127,XK +1476014128,1476014135,RS +1476014136,1476014591,XK +1476014592,1476015871,RS +1476015872,1476016127,XK +1476016128,1476018175,RS +1476018176,1476026367,IT +1476026368,1476034559,BA +1476034560,1476042751,NL +1476042752,1476050943,PL +1476050944,1476064255,RU +1476064256,1476064383,DE +1476064384,1476064511,TR +1476064512,1476067327,RU +1476067328,1476075519,TR +1476075520,1476083711,NL +1476083712,1476100095,RU +1476100096,1476108287,IR +1476108288,1476116479,RU +1476116480,1476124671,SE +1476124672,1476132863,PL +1476132864,1476141055,FR +1476141056,1476149247,GB +1476149248,1476157439,NO +1476157440,1476165631,BH +1476165632,1476173823,HR +1476173824,1476182015,BG +1476182016,1476186367,GB +1476186368,1476186383,IE +1476186384,1476189382,GB +1476189383,1476189383,IE +1476189384,1476190207,GB +1476190208,1476198399,BY +1476198400,1476206591,RU +1476206592,1476214783,GE +1476214784,1476222975,SE +1476222976,1476231167,IT +1476231168,1476239359,NL +1476239360,1476247551,DE +1476247552,1476255743,RU +1476255744,1476257791,ES +1476257792,1476259839,FR +1476259840,1476263935,DE +1476263936,1476272127,GB +1476272128,1476280319,NO +1476280320,1476288511,IM +1476288512,1476296703,LU +1476296704,1476304895,RU +1476304896,1476313087,BG +1476313088,1476315135,DE +1476315136,1476316159,US +1476316160,1476317183,FI +1476317184,1476321151,DE +1476321152,1476321279,FI +1476321280,1476329471,MC +1476329472,1476337663,RU +1476337664,1476345855,NL +1476345856,1476354047,MD +1476354048,1476362239,KE +1476362240,1476370431,FR +1476370432,1476378623,SE +1476378624,1476386815,KZ +1476386816,1476395007,RU +1476395008,1478492159,ES +1478492160,1480589311,IT +1480589312,1481637887,DE +1481637888,1481646079,SE +1481646080,1481654271,RU +1481654272,1481662463,IT +1481662464,1481678847,BG +1481678848,1481680663,SE +1481680664,1481680671,GB +1481680672,1481684991,SE +1481684992,1481687039,GB +1481687040,1481695231,DE +1481695232,1481703423,SK +1481703424,1481711615,SA +1481711616,1481719807,RU +1481719808,1481727999,CZ +1481728000,1481736191,IE +1481736192,1481741055,GG +1481741056,1481744127,GB +1481744128,1481744383,GG +1481744384,1481752575,IT +1481752576,1481760767,RU +1481760768,1481768959,UA +1481768960,1481777151,GB +1481777152,1481785343,BE +1481785344,1481793535,RU +1481793536,1481801727,LI +1481801728,1481809919,GB +1481809920,1481818111,RU +1481818112,1481826303,ES +1481826304,1481834495,DE +1481834496,1481842687,GL +1481842688,1481843007,SE +1481843008,1481843039,NO +1481843040,1481844959,SE +1481844960,1481844991,NO +1481844992,1481850879,SE +1481850880,1481859071,DK +1481859072,1481867263,GB +1481867264,1481875455,SE +1481875456,1481883647,CZ +1481883648,1481891839,RU +1481891840,1481900031,CZ +1481900032,1481908223,CH +1481908224,1481916415,NO +1481916416,1481924607,ES +1481924608,1481932799,SA +1481932800,1481936959,GB +1481936960,1481936975,FR +1481936976,1481937183,GB +1481937184,1481937199,NL +1481937200,1481937207,GB +1481937208,1481937215,FR +1481937216,1481940991,GB +1481940992,1481949183,NO +1481949184,1481957375,RU +1481957376,1481965567,SE +1481965568,1481973759,CH +1481973760,1481981951,FO +1481981952,1481990143,NL +1481990144,1481998335,MK +1481998336,1482006527,FI +1482006528,1482022911,RU +1482022912,1482031103,SA +1482031104,1482039295,SY +1482039296,1482047487,SE +1482047488,1482055679,RU +1482055680,1482063871,CZ +1482063872,1482072063,FI +1482072064,1482080255,IT +1482080256,1482088447,RU +1482088448,1482096639,FR +1482096640,1482104831,BG +1482104832,1482113023,NO +1482113024,1482121215,RU +1482121216,1482129407,IT +1482129408,1482137599,ES +1482137600,1482145791,IE +1482145792,1482153983,ES +1482153984,1482162175,HU +1482162176,1482686463,NO +1482686464,1482842111,GB +1482842112,1482850303,ES +1482850304,1482860695,GB +1482860696,1482860703,NL +1482860704,1482883071,GB +1482883072,1482948607,DE +1482948608,1483210751,CZ +1483210752,1483735039,GB +1483735040,1483997183,FI +1483997184,1484128255,AT +1484128256,1484259327,LT +1484259328,1484783615,FR +1484783616,1484849151,DE +1484849152,1484914687,SE +1484914688,1484980223,DE +1484980224,1485045759,SE +1485045760,1485111295,HU +1485111296,1485242367,DE +1485242368,1485246463,RU +1485246464,1485250559,LT +1485250560,1485254655,IR +1485254656,1485259007,RU +1485262848,1485266943,UA +1485266944,1485271039,US +1485271040,1485275135,UA +1485275136,1485283327,LV +1485283328,1485291519,PL +1485291520,1485307903,UA +1485307904,1485832191,FR +1485832192,1485963263,GB +1485963264,1486028799,CZ +1486028800,1486061567,IT +1486061568,1486094335,RU +1486094336,1486127103,ES +1486127104,1486159871,FI +1486159872,1486192639,IS +1486192640,1486225407,IT +1486225408,1486258175,DE +1486258176,1486292991,GB +1486292992,1486295039,RU +1486295040,1486297087,ES +1486297088,1486299135,IE +1486299136,1486301183,NL +1486301184,1486303231,GB +1486303232,1486305279,IS +1486305280,1486307327,HU +1486307328,1486309375,DE +1486309376,1486311423,AT +1486311424,1486313471,IE +1486313472,1486315519,RU +1486315520,1486317567,HU +1486317568,1486321663,RU +1486321664,1486323711,NL +1486323712,1486325759,GB +1486325760,1486327807,PL +1486327808,1486329855,CH +1486329856,1486331903,GB +1486331904,1486333951,NO +1486333952,1486335999,SE +1486336000,1486338047,KZ +1486338048,1486340095,RU +1486340096,1486342143,AZ +1486342144,1486344191,RU +1486344192,1486346239,ES +1486346240,1486348287,GB +1486348288,1486349311,NL +1486349312,1486350335,US +1486350336,1486352383,FR +1486352384,1486354431,BE +1486354432,1486356479,RU +1486356480,1486487551,DE +1486487552,1486618623,UA +1486618624,1486684159,PL +1486684160,1486749695,PT +1486749696,1486815231,RO +1486815232,1486880767,NL +1486880768,1488977919,FR +1488977920,1489240063,FI +1489240064,1489305599,EE +1489305600,1489338367,GR +1489338368,1489371135,BE +1489371136,1489436671,DE +1489436672,1489502207,PL +1489502208,1489534975,SI +1489534976,1489567743,RU +1489567744,1489600511,BH +1489600512,1489633279,RU +1489633280,1489634303,FR +1489634304,1489635327,IT +1489635328,1489639423,FR +1489639680,1489640959,FR +1489641216,1489641471,FR +1489641472,1489641599,PT +1489641600,1489641727,GR +1489641728,1489642495,FR +1489642752,1489644031,FR +1489644288,1489644543,FR +1489644544,1489645055,IT +1489645824,1489646079,IT +1489647616,1489648383,FR +1489648384,1489648639,GR +1489649664,1489650687,ZA +1489651200,1489653247,FR +1489655296,1489655551,GR +1489657856,1489658879,CM +1489658880,1489659647,KE +1489659648,1489661951,FR +1489661952,1489662975,NG +1489662976,1489663487,IT +1489664256,1489664511,GB +1489664512,1489664767,LY +1489664768,1489665023,TN +1489665792,1489674239,GB +1489674240,1489676287,NL +1489676288,1489678591,GB +1489678592,1489678847,NL +1489678848,1489678943,GB +1489678944,1489678959,US +1489678960,1489688575,GB +1489688576,1489688831,IL +1489688832,1489689087,GB +1489689088,1489689343,IL +1489689344,1489689599,GB +1489689600,1489689855,IL +1489689856,1489690367,NL +1489690368,1489690623,IL +1489690624,1489692415,GB +1489692416,1489692422,AU +1489692423,1489692423,GB +1489692424,1489692430,AU +1489692431,1489692447,GB +1489692448,1489692463,AU +1489692464,1489693695,GB +1489693696,1489694719,FR +1489694720,1489698815,GB +1489698816,1489731583,MT +1489731584,1489764351,BG +1489764352,1489797119,RU +1489797120,1489829887,KZ +1489829888,1489855555,DE +1489855556,1489855559,US +1489855560,1489855807,DE +1489855808,1489855839,US +1489855840,1489856527,DE +1489856528,1489856543,US +1489856544,1489862655,DE +1489862656,1489928191,RU +1489928192,1489960959,SE +1489960960,1489993727,HR +1489993728,1490026495,LU +1490026496,1490028543,NL +1490028544,1490028671,GB +1490028672,1490028799,DE +1490028800,1490042879,NL +1490042880,1490053375,CZ +1490053376,1490054143,PL +1490054144,1490059263,CZ +1490059264,1490075647,DE +1490075648,1490092031,GB +1490092032,1490108415,DE +1490108416,1490124799,MC +1490124800,1490141183,SA +1490141184,1490153471,HU +1490153472,1490155519,GB +1490155520,1490157567,HU +1490157568,1490173951,RU +1490173952,1490190335,PT +1490190336,1490193616,GB +1490193617,1490193617,DE +1490193618,1490196991,GB +1490196992,1490197247,IE +1490197248,1490206719,GB +1490206720,1490223103,GE +1490223104,1490255871,GB +1490255872,1490272255,NL +1490272256,1490288639,GB +1490288640,1490305023,SK +1490305024,1490321407,DK +1490321408,1490325503,GB +1490325504,1490328575,FR +1490328576,1490336767,GB +1490336768,1490337023,ES +1490337024,1490337279,GB +1490337280,1490337535,ES +1490337536,1490337791,GB +1490337792,1490354175,RU +1490354176,1490386943,SA +1490386944,1490403327,CH +1490403328,1490411519,BG +1490411520,1490419711,FR +1490419712,1490420735,DE +1490420736,1490421759,IR +1490421760,1490436095,DE +1490436096,1490452479,UA +1490452480,1490468863,PT +1490468864,1490473983,GB +1490473984,1490474239,US +1490474240,1490478591,GB +1490478592,1490478847,RU +1490478848,1490480127,GB +1490480128,1490480639,RU +1490480640,1490501631,GB +1490501632,1490518015,DE +1490518016,1490534399,RU +1490534400,1490550783,DE +1490550784,1490616319,LT +1490616320,1490681855,DE +1490681856,1490747391,ES +1490747392,1490812927,FR +1490812928,1490878463,PL +1490878464,1490879487,DE +1490879488,1490880511,US +1490880512,1490881535,FR +1490885632,1490886655,US +1490904064,1490905087,US +1490909184,1490910207,US +1490913280,1490915327,US +1490915328,1490917375,IT +1490917376,1490919423,IL +1490927616,1490929663,FR +1490931712,1490931967,DE +1490931968,1490932223,PL +1490932224,1490933759,DE +1490934528,1490934783,IL +1490944000,1491075071,LT +1491075072,1493172223,TR +1493172224,1493303295,DE +1493303296,1493431622,FR +1493431623,1493431623,GP +1493431624,1493434367,FR +1493434368,1493565439,SA +1493565440,1493696511,ES +1493696512,1493958655,NO +1493958656,1494220799,DE +1494220800,1494221823,MQ +1494221824,1494222079,FR +1494222080,1494222335,MQ +1494222336,1494228991,FR +1494228992,1494237183,RU +1494237184,1494245375,IE +1494245376,1494253567,RU +1494253568,1494261759,DE +1494261760,1494269951,GB +1494269952,1494278143,AT +1494278144,1494286335,GB +1494286336,1494294527,HR +1494294528,1494302719,RU +1494302720,1494310911,FI +1494310912,1494319103,LB +1494319104,1494327295,IS +1494327296,1494335487,IT +1494335488,1494343679,ES +1494343680,1494351871,PL +1494351872,1494360063,RO +1494360064,1494368255,HR +1494368256,1494376447,IE +1494376448,1494384639,SE +1494384640,1494392831,RU +1494392832,1494401023,NL +1494401024,1494409215,LV +1494409216,1494417407,FI +1494417408,1494425599,TR +1494433792,1494441983,IE +1494441984,1494450175,UA +1494450176,1494458367,DK +1494458368,1494474751,RU +1494474752,1494482943,DE +1494482944,1494499327,RU +1494499328,1494507519,NL +1494507520,1494523903,RU +1494523904,1494532095,NL +1494532096,1494540287,GB +1494540288,1494548479,NO +1494548480,1494556671,GB +1494556672,1494564863,DE +1494564864,1494573055,UA +1494573056,1494581247,RO +1494581248,1494589439,RU +1494589440,1494597631,US +1494597632,1494605823,IT +1494605824,1494614015,GB +1494614016,1494615551,RU +1494615552,1494616063,UA +1494616064,1494618111,ES +1494618112,1494622207,RU +1494622208,1494624255,PL +1494624256,1494626303,UA +1494626304,1494626559,CZ +1494626560,1494626815,RO +1494626816,1494627071,RU +1494627072,1494627327,IE +1494627328,1494630399,RU +1494630400,1494638591,CZ +1494638592,1494646783,DE +1494646784,1494663167,RU +1494663168,1494665215,PL +1494665216,1494667263,UA +1494667264,1494669311,PL +1494669312,1494675455,RU +1494675456,1494679551,UA +1494679552,1494695935,RU +1494695936,1494704127,RS +1494704128,1494736895,RU +1494736896,1494745087,DK +1494745088,1494810623,CZ +1494810624,1494843391,BG +1494843392,1494876159,PL +1494876160,1494908927,AT +1494908928,1494941695,PT +1494941696,1494974463,FI +1494974464,1495007231,DE +1495007232,1495039999,MD +1495040000,1495042047,KZ +1495042048,1495044095,DE +1495044096,1495046143,FR +1495046144,1495048191,CH +1495048192,1495050239,RU +1495050240,1495052287,GB +1495052288,1495054335,IE +1495054336,1495056383,GB +1495056384,1495058431,RU +1495058432,1495060479,UA +1495060480,1495062527,GB +1495062528,1495064575,JO +1495064576,1495066623,PL +1495066624,1495068671,GB +1495068672,1495070719,DE +1495070720,1495072767,RU +1495072768,1495105535,CZ +1495105536,1495138303,ES +1495138304,1495139327,FR +1495139344,1495139347,GB +1495140352,1495142399,FR +1495146752,1495147007,US +1495148544,1495150591,FR +1495150848,1495151103,GB +1495151616,1495153663,FR +1495158784,1495159295,GB +1495160240,1495160255,FR +1495160256,1495160263,GB +1495160320,1495160575,FR +1495160576,1495160831,CN +1495161856,1495161983,AE +1495162112,1495162367,DE +1495162496,1495162499,DE +1495162608,1495162623,GB +1495162624,1495162879,FR +1495163400,1495163403,GB +1495163408,1495163411,ES +1495163412,1495163415,IT +1495163552,1495163567,FR +1495165192,1495165195,NL +1495165408,1495165439,FR +1495165696,1495165951,ES +1495167488,1495167503,GB +1495167552,1495167567,DE +1495167568,1495167583,PL +1495167584,1495167599,ES +1495168384,1495168415,FR +1495168640,1495168655,FR +1495169024,1495169279,FR +1495170128,1495170143,FR +1495170760,1495170763,DE +1495170816,1495171071,FR +1495171072,1495203839,NL +1495203840,1495205887,DE +1495205888,1495207935,CZ +1495207936,1495209983,RU +1495212032,1495214079,RU +1495214080,1495216127,CZ +1495216128,1495218175,IT +1495218176,1495220223,NL +1495220224,1495222271,PL +1495222272,1495224319,IT +1495224320,1495228415,RU +1495228416,1495230463,NL +1495230464,1495234559,RU +1495238656,1495240703,DE +1495240704,1495242751,FR +1495242752,1495244799,MK +1495244800,1495246847,CZ +1495246848,1495248895,IE +1495248896,1495250943,GR +1495250944,1495252991,RU +1495252992,1495255039,BH +1495255040,1495257087,IT +1495257088,1495259135,GB +1495259136,1495261183,BE +1495261184,1495263231,PT +1495263232,1495265279,GB +1495265280,1495267327,US +1495267328,1495269375,SE +1495269376,1495277567,IR +1495277568,1495279615,SE +1495279616,1495279871,DE +1495279872,1495283711,RO +1495283712,1495285759,MD +1495285760,1495287807,US +1495287808,1495289855,SE +1495289856,1495291903,ES +1495291904,1495293951,RO +1495293952,1495298047,IR +1495298048,1495300095,ES +1495300096,1495300351,SE +1495300352,1495300607,US +1495300608,1495300863,SE +1495300864,1495303167,RO +1495303168,1495304191,US +1495304192,1495306239,MD +1495306240,1495306573,GB +1495306574,1495306574,RO +1495306575,1495308287,GB +1495308288,1495308799,IT +1495308800,1495309311,RO +1495309312,1495310335,IT +1495310336,1495312383,ES +1495312384,1495312895,IT +1495312896,1495313151,GB +1495313152,1495314431,MD +1495314432,1495316479,RO +1495316480,1495316735,GB +1495316736,1495316991,RO +1495316992,1495317503,IT +1495317504,1495317759,NL +1495317760,1495318015,RO +1495318016,1495318271,ES +1495318272,1495318527,RO +1495318528,1495319039,NO +1495319040,1495319167,FR +1495319168,1495319295,RO +1495319296,1495319551,SE +1495319552,1495320063,IR +1495320064,1495321343,RO +1495321344,1495321599,GB +1495321600,1495322623,RO +1495322624,1495324671,GR +1495324672,1495326719,RO +1495326720,1495332863,MD +1495332864,1495333375,RO +1495333376,1495333631,CH +1495333632,1495333887,RO +1495333888,1495334911,MD +1495334912,1495335167,FR +1495335168,1495335423,IE +1495335424,1495335679,NL +1495335680,1495335935,FR +1495335936,1495336447,RO +1495336448,1495336959,GB +1495336960,1495339007,RO +1495339008,1495339263,DE +1495339264,1495339519,MD +1495339520,1495340031,IR +1495340032,1495342591,RO +1495342592,1495342847,MD +1495342848,1495345151,RO +1495345152,1495345407,FI +1495345408,1495345663,US +1495345664,1495345919,FI +1495345920,1495346687,RO +1495346688,1495347199,GB +1495347200,1495349247,RO +1495349248,1495351295,SY +1495351296,1495351551,GB +1495351552,1495351807,MD +1495351808,1495352319,IQ +1495352320,1495352447,FR +1495352448,1495352831,RO +1495352832,1495353087,FI +1495353088,1495360511,RO +1495360512,1495361535,IR +1495361536,1495362559,RO +1495362560,1495363583,ES +1495363584,1495364607,KZ +1495364608,1495364863,GB +1495364864,1495365119,PT +1495365120,1495365375,SE +1495365376,1495367679,RO +1495367680,1495368191,IR +1495368192,1495368959,RO +1495368960,1495369215,IT +1495369216,1495369471,GB +1495369472,1495369727,RO +1495369728,1495371775,SE +1495371776,1495376383,RO +1495376384,1495376639,GB +1495376640,1495376895,RO +1495376896,1495377407,GB +1495377408,1495382015,RO +1495382016,1495384063,ES +1495384064,1495385599,RO +1495385600,1495386623,GB +1495386624,1495387135,RO +1495387136,1495387647,IR +1495387648,1495388159,GB +1495388160,1495392255,KZ +1495392256,1495394303,SY +1495394304,1495394815,RO +1495394816,1495395327,IR +1495395328,1495396351,RO +1495396352,1495396863,IR +1495396864,1495397895,RO +1495397896,1495397903,HU +1495397904,1495398911,RO +1495398912,1495399423,GB +1495399424,1495399935,RO +1495399936,1495400447,GB +1495400448,1495404543,RO +1495404544,1495405567,NL +1495405568,1495406079,IR +1495406080,1495407615,RO +1495407616,1495408639,ES +1495408640,1495416831,IR +1495416832,1495418879,MD +1495418880,1495420159,RO +1495420160,1495420415,NL +1495420416,1495422975,RO +1495422976,1495423487,IR +1495423488,1495424511,RO +1495424512,1495425023,IR +1495425024,1495425468,GB +1495425469,1495425469,PT +1495425470,1495425533,GB +1495425534,1495425534,PT +1495425535,1495426047,GB +1495426048,1495426559,RO +1495426560,1495426815,GB +1495426816,1495427071,RO +1495427072,1495427583,GB +1495427584,1495428095,RO +1495428096,1495428351,GB +1495428352,1495428863,RO +1495428864,1495429119,DE +1495429120,1495431167,MD +1495431168,1495432191,ES +1495432192,1495432703,GB +1495432704,1495433215,RO +1495433216,1495441407,IR +1495441408,1495441663,RO +1495441664,1495441919,IT +1495441920,1495442431,SY +1495442432,1495442559,FR +1495442560,1495442943,RO +1495442944,1495443199,AE +1495443200,1495443455,RO +1495443456,1495443967,IR +1495443968,1495444223,RO +1495444224,1495444479,GB +1495444480,1495444607,KR +1495444608,1495444735,IN +1495444736,1495445503,RO +1495445504,1495446015,IR +1495446016,1495446271,RO +1495446272,1495446527,ES +1495446528,1495447551,RO +1495447552,1495449599,SE +1495449600,1495451647,MD +1495451648,1495452159,IR +1495452160,1495452671,RO +1495452672,1495453695,MD +1495453696,1495455743,RO +1495455744,1495455999,ES +1495456000,1495456255,NL +1495456256,1495459839,RO +1495459840,1495460863,MD +1495460864,1495461887,RO +1495461888,1495463935,SE +1495463936,1495465983,IR +1495465984,1495466495,RO +1495466496,1495467007,DE +1495467008,1495468031,RO +1495468032,1495470079,MD +1495470080,1495472127,NL +1495472128,1495473151,RO +1495473152,1495474175,GB +1495474176,1495474431,ES +1495474432,1495474687,RO +1495474688,1495474943,MD +1495474944,1495476223,RO +1495476224,1495478271,MD +1495478272,1495479295,RO +1495479296,1495479551,TR +1495479552,1495480319,RO +1495480320,1495480831,NL +1495480832,1495481343,IR +1495481344,1495482367,RO +1495482368,1495484415,IR +1495484416,1495485439,RO +1495485440,1495485695,MD +1495485696,1495485951,RO +1495485952,1495486463,PL +1495486464,1495487231,RO +1495487232,1495487487,IT +1495487488,1495488767,MD +1495488768,1495489279,GB +1495489280,1495489535,MD +1495489536,1495493119,RO +1495493120,1495493375,US +1495493376,1495493631,RO +1495493632,1495494655,AE +1495494656,1495495167,RO +1495495168,1495495423,ES +1495495424,1495496703,RO +1495496704,1495497727,IR +1495497728,1495498239,RO +1495498240,1495498367,IN +1495498368,1495498495,BD +1495498496,1495499775,RO +1495499776,1495500287,IR +1495500288,1495500799,RO +1495500800,1495502847,ES +1495502848,1495503871,PL +1495503872,1495504895,ES +1495504896,1495505151,RO +1495505152,1495505407,GB +1495505408,1495505919,RO +1495505920,1495506431,IR +1495506432,1495507711,RO +1495507712,1495507967,MD +1495507968,1495508991,US +1495508992,1495510015,IT +1495510016,1495510527,RO +1495510528,1495511039,DE +1495511040,1495511551,IR +1495511552,1495511807,LT +1495511808,1495512063,FR +1495512064,1495513087,IR +1495513088,1495515647,RO +1495515648,1495516159,IR +1495516160,1495516287,FR +1495516288,1495516671,RO +1495516672,1495516927,GR +1495516928,1495517183,RO +1495517184,1495518207,MD +1495518208,1495529471,RO +1495529472,1495529727,MD +1495529728,1495530495,RO +1495530496,1495531519,KZ +1495531520,1495533567,ES +1495533568,1495535615,RO +1495535616,1495536127,IR +1495536128,1495537663,RO +1495539712,1495540735,US +1495540736,1495540991,GB +1495540992,1495541247,RO +1495541248,1495541759,GB +1495541760,1495543807,ES +1495543808,1495547903,IR +1495547904,1495548159,US +1495548160,1495548671,RO +1495548672,1495548703,RU +1495548704,1495548735,RO +1495548736,1495548927,RU +1495548928,1495549695,RO +1495549696,1495549951,RU +1495549952,1495550463,RO +1495550464,1495550975,BE +1495550976,1495551999,RO +1495552000,1495554047,ES +1495554048,1495554559,RO +1495554560,1495554815,US +1495554816,1495555071,SE +1495555072,1495556095,RO +1495556096,1495560191,IR +1495560192,1495566335,RO +1495566336,1495566591,GB +1495566592,1495566847,RO +1495566848,1495567359,GB +1495567360,1495567615,RO +1495567616,1495567871,GB +1495567872,1495568127,IE +1495568128,1495571455,RO +1495571456,1495572479,MD +1495572480,1495573503,RO +1495573504,1495574527,KZ +1495574528,1495575039,RO +1495575040,1495575551,CH +1495575552,1495575807,NL +1495575808,1495576575,RO +1495576576,1495580671,IR +1495580672,1495581183,RO +1495581184,1495581695,IR +1495581696,1495582719,RO +1495582720,1495583743,KZ +1495583744,1495585791,IT +1495585792,1495586815,FR +1495586816,1495587839,DE +1495587840,1495588863,GB +1495588864,1495589119,RO +1495589120,1495589375,FI +1495589376,1495589887,IR +1495589888,1495590143,IT +1495590144,1495590655,RO +1495590656,1495592959,US +1495592960,1495596031,RO +1495596032,1495596543,IR +1495596544,1495596799,RO +1495596800,1495597055,MD +1495597056,1495601151,IR +1495601152,1495603199,AZ +1495603200,1495604223,KZ +1495604224,1495604479,DE +1495604480,1495604735,RO +1495604736,1495605247,IR +1495605248,1495607295,AZ +1495607296,1495607551,MD +1495607552,1495607807,RO +1495607808,1495608319,IR +1495608320,1495609343,MD +1495609344,1495613439,RO +1495613440,1495614463,GB +1495614464,1495615487,RO +1495615488,1495618559,ES +1495618560,1495619583,BE +1495619584,1495620607,AT +1495620608,1495621375,GB +1495621376,1495621631,RO +1495621632,1495621887,GB +1495621888,1495622143,BG +1495622144,1495623167,RO +1495623168,1495623679,IR +1495623680,1495623935,MD +1495623936,1495624191,NL +1495624192,1495624447,US +1495624448,1495629823,RO +1495629824,1495631615,GB +1495631616,1495632127,RO +1495632128,1495632383,ES +1495632384,1495632639,IE +1495632640,1495632895,RO +1495632896,1495633151,ES +1495633152,1495633919,RO +1495633920,1495636991,IR +1495636992,1495640063,RO +1495640064,1495641087,IR +1495641088,1495642111,RO +1495642112,1495644159,SE +1495644160,1495645183,RO +1495645184,1495646207,US +1495646208,1495647743,RO +1495647744,1495648255,IR +1495648256,1495650303,LU +1495650304,1495651327,IR +1495651328,1495652351,RO +1495652352,1495652863,US +1495652864,1495653375,IR +1495653376,1495654399,KZ +1495654400,1495654911,RO +1495654912,1495655167,ES +1495655168,1495655423,BG +1495655424,1495656447,US +1495656448,1495656959,RO +1495656960,1495657215,GB +1495657216,1495657471,RO +1495657472,1495658495,US +1495658496,1495662591,IR +1495662592,1495666687,RO +1495666688,1495668735,ES +1495668736,1495669247,IR +1495669248,1495669503,GB +1495669504,1495669759,RO +1495669760,1495670783,IL +1495670784,1495671807,MD +1495671808,1495672319,RO +1495672320,1495672575,GB +1495672576,1495672831,NL +1495672832,1495674879,ES +1495674880,1495677951,RO +1495677952,1495678975,US +1495678976,1495679999,MD +1495680000,1495682047,RO +1495682048,1495683071,MD +1495683072,1495687167,IR +1495687168,1495688191,NL +1495688192,1495688703,RO +1495688704,1495689215,IR +1495689216,1495689727,RO +1495689728,1495690239,DE +1495690240,1495691263,RO +1495691264,1495693311,DE +1495693312,1495695359,GB +1495695360,1495699455,RO +1495699456,1495700479,GB +1495700480,1495701503,FR +1495701504,1495703551,RO +1495703552,1495704575,NL +1495704576,1495705599,KZ +1495705600,1495707647,RO +1495707648,1495709695,ES +1495709696,1495713791,IR +1495713792,1495715839,ES +1495715840,1495716863,RO +1495716864,1495717887,IR +1495717888,1495719935,ES +1495719936,1495723519,RO +1495723520,1495724031,FR +1495724032,1495724287,GB +1495724288,1495724543,RO +1495724544,1495726079,IR +1495726080,1495730175,RO +1495730176,1495731199,IR +1495731200,1495732223,RO +1495732224,1495744511,ES +1495744512,1495745791,RO +1495745792,1495746047,GB +1495746048,1495747583,RO +1495747584,1495748607,MD +1495748608,1495748863,RO +1495748864,1495749119,GB +1495749120,1495749631,RO +1495749632,1495750655,MD +1495750656,1495752703,RO +1495752704,1495754751,MD +1495754752,1495755775,NL +1495755776,1495756031,PL +1495756032,1495756799,RO +1495756800,1495758847,MD +1495758848,1495759359,RO +1495759360,1495759487,TH +1495759488,1495759615,ID +1495759616,1495759871,RO +1495759872,1495760127,ES +1495760128,1495760895,RO +1495760896,1495762943,DE +1495762944,1495763967,GB +1495763968,1495764735,RO +1495764736,1495764991,AU +1495764992,1495765503,BG +1495765504,1495765759,GB +1495765760,1495766015,NL +1495766016,1495766527,RO +1495766528,1495766783,DE +1495766784,1495767039,RO +1495767040,1495769087,ES +1495769088,1495769599,RO +1495769600,1495769855,NL +1495769856,1495770623,IT +1495770624,1495771135,RO +1495771136,1495772159,PL +1495772160,1495772671,US +1495772672,1495774207,RO +1495774208,1495775231,ES +1495775232,1495775743,RO +1495775744,1495776255,IR +1495776256,1495781375,RO +1495781376,1495781631,IR +1495781632,1495781887,RO +1495781888,1495782911,GB +1495782912,1495783167,RO +1495783168,1495783423,GB +1495783424,1495785471,ES +1495785472,1495789567,IT +1495789568,1495789823,PL +1495789824,1495790079,GB +1495790080,1495790335,MD +1495790336,1495790847,GB +1495790848,1495791359,RO +1495791360,1495791615,GB +1495791616,1495793663,RO +1495793664,1495794687,DE +1495794688,1495795199,RO +1495795200,1495795327,FR +1495795328,1495795455,RO +1495795456,1495795711,RU +1495795712,1495803391,RO +1495803392,1495803903,IR +1495803904,1495804671,RO +1495804672,1495805439,GB +1495805440,1495805951,RO +1495805952,1495810047,KZ +1495810048,1495813631,RO +1495813632,1495814143,IR +1495814144,1495815167,RO +1495815168,1495816191,ES +1495816192,1495816703,RO +1495816704,1495817215,IR +1495817216,1495817471,HK +1495817472,1495820799,RO +1495820800,1495821311,IR +1495821312,1495821823,DE +1495821824,1495822335,IR +1495822336,1495823359,FR +1495823360,1495824383,DE +1495824384,1495825407,GB +1495825408,1495826431,DE +1495826432,1495826943,IR +1495826944,1495827967,RO +1495827968,1495828479,DE +1495828480,1495829247,RO +1495829248,1495829503,PL +1495829504,1495830015,GB +1495830016,1495830527,RO +1495830528,1495831551,PL +1495831552,1495832575,RO +1495832576,1495834623,IR +1495834624,1495836159,RO +1495836160,1495836415,GB +1495836416,1495837695,RO +1495837696,1495838719,IT +1495838720,1495839743,US +1495839744,1495839999,FR +1495840000,1495842815,RO +1495842816,1495843839,KZ +1495843840,1495845631,RO +1495845632,1495845887,GB +1495845888,1495846655,RO +1495846656,1495847423,GB +1495847424,1495848191,RO +1495848192,1495848447,PL +1495848448,1495848959,RO +1495848960,1495849471,SE +1495849472,1495849983,RO +1495849984,1495850495,US +1495850496,1495852031,RO +1495852032,1495853055,MD +1495853056,1495853567,RO +1495853568,1495854079,IT +1495854080,1495855103,RO +1495855104,1495859199,IR +1495859200,1495860223,ES +1495860224,1495861247,AZ +1495861248,1495865343,IR +1495865344,1495865599,GB +1495865600,1495866111,RO +1495866112,1495866879,GB +1495866880,1495867391,RO +1495867392,1495867903,IR +1495867904,1495868415,DE +1495868416,1495869439,RO +1495869440,1495870463,IR +1495870464,1495871487,BE +1495871488,1495871743,ES +1495871744,1495872511,GB +1495872512,1495873535,BE +1495873536,1495874047,RO +1495874048,1495874559,IR +1495874560,1495875071,GB +1495875072,1495875583,RO +1495875584,1495891967,MD +1495891968,1495894015,AT +1495894016,1495894527,RO +1495894528,1495896063,SY +1495896064,1495900159,RO +1495900160,1495902207,SE +1495902208,1495906303,RO +1495906304,1495907327,IR +1495907328,1495907583,RO +1495907584,1495908351,GB +1495908352,1495922687,IR +1495922688,1495924735,LU +1495924736,1495926783,IT +1495926784,1495927039,SG +1495927040,1495927295,RO +1495927296,1495927551,GB +1495927552,1495931135,RO +1495931136,1495931391,IT +1495931392,1495931647,RO +1495931648,1495931903,SE +1495931904,1495932159,RO +1495932160,1495932415,US +1495932416,1495932671,RO +1495932672,1495932927,GB +1495932928,1495933439,IR +1495933440,1495934975,RO +1495934976,1495935231,GB +1495935232,1495935743,RO +1495935744,1495935999,ES +1495936000,1495937023,IR +1495937024,1495937535,DE +1495937536,1495938559,RO +1495938560,1495939071,BE +1495939072,1495939583,IR +1495939584,1495940095,RO +1495940096,1495941119,KZ +1495941120,1495942143,MD +1495942144,1495942655,IR +1495942656,1495943167,RO +1495943168,1495945215,MD +1495945216,1495949311,RO +1495949312,1495951359,IR +1495951360,1495952383,MD +1495952384,1495953919,RO +1495953920,1495954175,GB +1495954176,1495955455,RO +1495955456,1495957503,ES +1495957504,1495958527,MD +1495958528,1495959551,RO +1495959552,1495960575,IR +1495960576,1495960831,US +1495960832,1495961087,SE +1495961088,1495961599,RO +1495961600,1495962623,US +1495962624,1495963135,RO +1495963136,1495963647,IR +1495963648,1495964415,GB +1495964672,1495965695,RO +1495965696,1495966719,PL +1495966720,1495967743,ES +1495967744,1495968767,NL +1495968768,1495969279,RO +1495969280,1495969791,FR +1495969792,1495970815,RO +1495970816,1495971839,MD +1495971840,1495973887,IR +1495973888,1495974911,RO +1495974912,1495975935,IR +1495975936,1495976959,RO +1495976960,1495977983,KZ +1495977984,1495979007,IR +1495979008,1495979263,NL +1495979264,1495979519,US +1495979520,1495979775,RO +1495979776,1495980031,GB +1495980032,1495982079,RO +1495982080,1495983103,MD +1495983104,1495983615,IR +1495983616,1495983871,IT +1495983872,1495985663,RO +1495985664,1495985791,FR +1495985792,1495985919,RO +1495985920,1495986175,JP +1495986176,1495990271,RO +1495990272,1495994367,IR +1495994368,1495995391,RO +1495995392,1495996415,KZ +1495996416,1495997439,RO +1495997440,1495998463,TR +1495998464,1495998719,SG +1495998720,1495999487,RO +1495999488,1495999999,IR +1496000000,1496003327,RO +1496003328,1496003583,DE +1496003584,1496004607,RO +1496004608,1496005631,GR +1496005632,1496005887,GB +1496005888,1496006655,RO +1496006656,1496007679,TR +1496007680,1496008191,DE +1496008192,1496008703,IR +1496008704,1496009215,RO +1496009216,1496010239,ES +1496010240,1496010495,TR +1496010496,1496011775,RO +1496011776,1496012799,ES +1496012800,1496016895,IR +1496016896,1496018943,RO +1496018944,1496019967,FR +1496019968,1496020735,RO +1496020736,1496020991,AU +1496020992,1496023039,DE +1496023040,1496024063,MD +1496024064,1496025087,TR +1496025088,1496027135,RO +1496027136,1496029183,IR +1496029184,1496032255,RO +1496032256,1496033279,KZ +1496033280,1496034303,MD +1496034304,1496034815,DE +1496034816,1496036863,RO +1496036864,1496037375,IR +1496037376,1496038399,GR +1496038400,1496038911,IR +1496038912,1496040447,RO +1496040448,1496040959,ES +1496040960,1496041983,RO +1496041984,1496042495,GB +1496042496,1496043007,IR +1496043008,1496045567,RO +1496045568,1496049663,IR +1496049664,1496051711,SE +1496051712,1496055807,RO +1496055808,1496057855,SE +1496057856,1496058111,DE +1496058112,1496058879,RO +1496058880,1496059903,KZ +1496059904,1496063999,ES +1496064000,1496066815,RO +1496066816,1496067071,QA +1496067072,1496068095,RO +1496068096,1496074239,ES +1496074240,1496075263,GR +1496075264,1496079359,RO +1496079360,1496081407,GR +1496081408,1496082175,RO +1496082176,1496082431,GB +1496082432,1496083967,RO +1496083968,1496084479,FR +1496084480,1496084991,IR +1496084992,1496085247,IE +1496085248,1496086015,RO +1496086016,1496086527,IR +1496086528,1496088063,RO +1496088064,1496088319,NL +1496088320,1496088575,ES +1496088576,1496090623,IR +1496090624,1496093183,RO +1496093184,1496093695,IR +1496093696,1496094719,RO +1496094720,1496095743,MD +1496095744,1496096767,GR +1496096768,1496098303,RO +1496098304,1496098815,BE +1496098816,1496100863,LU +1496100864,1496102911,IR +1496102912,1496103935,ES +1496103936,1496104447,RO +1496104448,1496104959,IR +1496104960,1496107519,RO +1496107520,1496108031,IR +1496108032,1496108543,RO +1496108544,1496108799,IT +1496108800,1496109567,RO +1496109568,1496109823,US +1496109824,1496110335,RO +1496110336,1496110591,GB +1496110592,1496111103,RO +1496111104,1496113151,GR +1496113152,1496117247,RO +1496117248,1496118271,IR +1496118272,1496119295,RO +1496119296,1496121343,SE +1496121344,1496122367,MD +1496122368,1496123391,RO +1496123392,1496123647,IE +1496123648,1496124927,RO +1496124928,1496125183,FR +1496125184,1496127487,RO +1496127488,1496127743,IT +1496127744,1496127999,RO +1496128000,1496129535,IT +1496129536,1496130559,RO +1496130560,1496131583,ES +1496131584,1496132607,MD +1496132608,1496133631,RO +1496133632,1496137727,IR +1496137728,1496138495,RO +1496138496,1496138751,BG +1496138752,1496139263,IR +1496139264,1496141823,RO +1496141824,1496142335,IR +1496142336,1496142591,GB +1496142592,1496142847,RO +1496142848,1496143871,CH +1496143872,1496144895,RO +1496144896,1496145151,US +1496145152,1496145407,RO +1496145408,1496145663,TR +1496145664,1496145919,IT +1496145920,1496150015,RO +1496150016,1496152063,IR +1496152064,1496153087,GR +1496153088,1496153599,RO +1496153600,1496154111,IR +1496154112,1496158207,SY +1496158208,1496160255,RO +1496160256,1496162303,IR +1496162304,1496175615,RO +1496175616,1496177663,IT +1496177664,1496178687,ES +1496178688,1496178943,RO +1496178944,1496179199,BG +1496179200,1496179711,SE +1496179712,1496180223,RO +1496180224,1496180735,IR +1496180736,1496182783,SE +1496182784,1496183039,ES +1496183040,1496183551,US +1496183552,1496184063,ES +1496184064,1496184740,US +1496184741,1496184741,ES +1496184742,1496184831,US +1496184832,1496188927,RO +1496188928,1496189951,ES +1496189952,1496190975,RO +1496190976,1496193023,SE +1496193024,1496197119,RO +1496197120,1496197631,MD +1496197632,1496198143,RO +1496198144,1496198655,IR +1496198656,1496199167,GB +1496199168,1496202239,RO +1496202240,1496202751,IR +1496202752,1496203263,RO +1496203264,1496207359,IT +1496207360,1496207615,DE +1496207616,1496208383,SE +1496208384,1496208895,AE +1496208896,1496209151,SE +1496209152,1496209407,AE +1496209408,1496210431,ES +1496210432,1496210943,RO +1496210944,1496211455,IR +1496211456,1496213503,RO +1496213504,1496215551,IT +1496215552,1496216319,RO +1496216320,1496216575,ES +1496216576,1496218879,RO +1496218880,1496219135,DE +1496219136,1496220671,RO +1496220672,1496221695,US +1496221696,1496223743,ES +1496223744,1496225791,PL +1496225792,1496228863,RO +1496228864,1496229887,MD +1496229888,1496231935,RO +1496231936,1496233983,PS +1496233984,1496236031,IR +1496236032,1496238079,IT +1496238080,1496240127,IQ +1496240128,1496242175,RO +1496242176,1496243199,IR +1496243200,1496248575,RO +1496248576,1496248831,MD +1496248832,1496250367,RO +1496250368,1496251391,US +1496251392,1496252415,GR +1496252416,1496252671,RO +1496252672,1496252927,NL +1496252928,1496253439,RO +1496253440,1496254463,ES +1496254464,1496256255,RO +1496256256,1496256511,HK +1496256512,1496260607,ES +1496260608,1496261119,IT +1496261120,1496262655,RO +1496262656,1496263167,BG +1496263168,1496263679,RO +1496263680,1496264703,GR +1496264704,1496268543,RO +1496268544,1496268799,GB +1496268800,1496272895,IR +1496272896,1496274943,SY +1496274944,1496275455,RO +1496275456,1496275711,ES +1496275712,1496276735,RO +1496276736,1496276991,ES +1496276992,1496285183,RO +1496285184,1496293375,IR +1496293376,1496295423,RO +1496295424,1496297471,PL +1496297472,1496297727,MD +1496297728,1496297983,BG +1496297984,1496298239,MD +1496298240,1496298495,RO +1496298496,1496298751,BG +1496298752,1496299263,MD +1496299264,1496299519,IE +1496299520,1496301567,SE +1496301568,1496302591,RO +1496302592,1496304639,IR +1496304640,1496312831,RO +1496312832,1496313855,ES +1496313856,1496315647,RO +1496315648,1496315903,GB +1496315904,1496316159,RO +1496316160,1496316415,GB +1496316416,1496317951,RO +1496317952,1497366527,DE +1497366528,1498415103,PL +1498415104,1499463679,FR +1499463680,1499594751,IT +1499594752,1499725823,NL +1499725824,1499856895,IE +1499856896,1499987967,CZ +1499987968,1499996159,AT +1499996160,1500004351,GB +1500004352,1500020735,RU +1500020736,1500028927,IS +1500028928,1500037119,NL +1500037120,1500045311,DK +1500045312,1500061695,GB +1500061696,1500069887,NO +1500069888,1500078079,IT +1500078080,1500086271,GB +1500086272,1500094463,RU +1500094464,1500102655,AT +1500102656,1500110847,NL +1500110848,1500119039,UA +1500119040,1500127231,TR +1500127232,1500135423,FI +1500135424,1500143615,DE +1500143616,1500151807,BG +1500151808,1500153855,GB +1500153856,1500155903,IE +1500155904,1500157951,GB +1500157952,1500159999,DE +1500160000,1500162047,NL +1500162048,1500164095,RU +1500164096,1500166143,GB +1500166144,1500168191,DE +1500168192,1500170239,RU +1500170240,1500172287,LU +1500172288,1500174335,AT +1500174336,1500176383,DE +1500176384,1500178431,GB +1500178432,1500180479,KZ +1500180480,1500182527,BE +1500182528,1500184575,RU +1500184576,1500186623,IM +1500186624,1500188671,KW +1500188672,1500188735,FR +1500188736,1500188799,GB +1500188800,1500190719,FR +1500192768,1500194815,RU +1500194816,1500196863,GB +1500196864,1500198911,ES +1500198912,1500200959,GB +1500200960,1500203007,DE +1500203008,1500205055,GB +1500205056,1500207103,RU +1500207104,1500209151,IT +1500209152,1500211199,KZ +1500211200,1500213247,IT +1500213248,1500217343,RU +1500217344,1500219391,DE +1500219392,1500221439,RU +1500221440,1500223487,SK +1500223488,1500225535,PL +1500225536,1500227583,DE +1500227584,1500229631,FR +1500229632,1500231679,ES +1500231680,1500233727,DE +1500233728,1500237823,RU +1500237824,1500241919,SE +1500241920,1500243967,TR +1500243968,1500246015,GB +1500246016,1500248063,ES +1500248064,1500250111,HU +1500250112,1500266495,SA +1500266496,1500282879,RU +1500282880,1500299263,LB +1500299264,1500315647,PL +1500315648,1500332031,RU +1500332032,1500348415,PT +1500348416,1500413951,RU +1500413952,1500430335,DE +1500430336,1500446719,RS +1500446720,1500459007,LV +1500459008,1500461055,RU +1500461056,1500463103,LV +1500463104,1500479487,CZ +1500479488,1500495871,RU +1500495872,1500512255,BA +1500512256,1500643327,RU +1500643328,1500774399,PT +1500774400,1500905471,LT +1500905472,1501036543,IT +1501036544,1501298687,RO +1501298688,1501560831,IE +1501560832,1501822975,ES +1501822976,1502085119,HU +1502085120,1502216191,RO +1502216192,1502347263,IL +1502347264,1502478335,ES +1502478336,1502605311,SI +1502605312,1502606335,HR +1502606336,1502609407,SI +1502609408,1502625791,DE +1502625792,1502642175,SA +1502642176,1502658559,IR +1502658560,1502674943,AT +1502674944,1502691327,DE +1502691328,1502707711,GB +1502707712,1502715903,RU +1502715904,1502716927,DE +1502716928,1502717951,CH +1502717952,1502719999,GB +1502720000,1502722047,FR +1502722048,1502724095,TR +1502724096,1502740479,GB +1502740480,1502756863,NL +1502756864,1502773247,UZ +1502773248,1502789631,BA +1502789632,1502806015,DE +1502806016,1502822399,SA +1502822400,1502838783,HU +1502838784,1502855167,SE +1502855168,1502871551,AZ +1502871552,1502887935,BH +1502887936,1502904319,HU +1502904320,1502920703,IT +1502920704,1502937087,RU +1502937088,1502953471,RO +1502953472,1502969855,MD +1502969856,1502972927,IE +1502972928,1502973951,DE +1502973952,1502975231,IE +1502975232,1502975247,GB +1502975248,1502975327,IE +1502975328,1502975359,GB +1502975360,1502975999,IE +1502976000,1502977023,DE +1502977024,1502978047,IE +1502978048,1502979071,US +1502979072,1502979135,IE +1502979136,1502979199,GB +1502979200,1502979215,IE +1502979216,1502979231,CZ +1502979232,1502979311,IE +1502979312,1502979327,FR +1502979328,1502980095,IE +1502980096,1502980223,DE +1502980224,1502980351,IE +1502980352,1502980607,US +1502980608,1502986239,IE +1502986240,1503002623,NL +1503002624,1503006719,GE +1503006720,1503010815,GB +1503010816,1503019007,IT +1503019008,1503051775,DK +1503051776,1503068159,SE +1503068160,1503084543,PL +1503084544,1503100927,GB +1503100928,1503117311,RU +1503117312,1503133695,NO +1503133696,1503370138,PT +1503370139,1503370139,GB +1503370140,1503395839,PT +1503395840,1503491082,FR +1503491083,1503491083,GP +1503491084,1503657983,FR +1503657984,1503690751,SE +1503690752,1503723519,IS +1503723520,1503789055,PL +1503789056,1503821823,NO +1503821824,1503854591,UA +1503854592,1503887359,RU +1503887360,1503895567,DE +1503895568,1503895571,IT +1503895572,1503895679,DE +1503895680,1503895687,IT +1503895688,1503896411,DE +1503896412,1503896415,AT +1503896416,1503897367,DE +1503897368,1503897375,BE +1503897376,1503898175,DE +1503898176,1503898183,IT +1503898184,1503898239,DE +1503898240,1503898303,RO +1503898304,1503898335,DE +1503898336,1503898343,MX +1503898344,1503898351,DE +1503898352,1503898359,CH +1503898360,1503898791,DE +1503898792,1503898799,AT +1503898800,1503898911,DE +1503898912,1503898919,LT +1503898920,1503898935,DE +1503898936,1503898943,IT +1503898944,1503898959,DE +1503898960,1503898967,IT +1503898968,1503899071,DE +1503899072,1503899079,AT +1503899080,1503899687,DE +1503899688,1503899695,IT +1503899696,1503899703,BE +1503899704,1503899927,DE +1503899928,1503899935,IT +1503899936,1503900679,DE +1503900680,1503900687,BE +1503900688,1503900719,DE +1503900720,1503900727,TW +1503900728,1503901567,DE +1503901568,1503901695,TW +1503901696,1503902215,DE +1503902216,1503902223,US +1503902224,1503906343,DE +1503906344,1503906351,AT +1503906352,1503906407,DE +1503906408,1503906415,MX +1503906416,1503920127,DE +1503920128,1503985663,HR +1503985664,1504018431,IR +1504018432,1504051199,RO +1504051200,1504083967,FI +1504083968,1504116735,DE +1504116736,1504149503,PL +1504149504,1504149691,GB +1504149692,1504149693,US +1504149694,1504149694,IE +1504149695,1504149695,US +1504149696,1504149759,GB +1504149760,1504150015,ES +1504150016,1504150271,GB +1504150272,1504150527,DE +1504150528,1504151039,GB +1504151040,1504151295,FR +1504151296,1504154623,GB +1504154624,1504155647,IE +1504155648,1504247807,GB +1504247808,1504313343,RU +1504313344,1504378879,FR +1504378880,1504444415,PL +1504444416,1504509951,HR +1504509952,1504575487,SK +1504575488,1504641023,PL +1504641024,1504706559,RU +1504706560,1504837631,CZ +1504837632,1504968703,RU +1504968704,1505099775,PT +1505099776,1505230847,DE +1505230848,1505239039,RU +1505239040,1505247231,IE +1505247232,1505255423,UA +1505255424,1505263615,IT +1505263616,1505271807,DK +1505271808,1505279999,NL +1505280000,1505288191,IR +1505288192,1505296383,RU +1505296384,1505304575,UA +1505304576,1505312767,FR +1505312768,1505320959,RU +1505320960,1505329151,AT +1505329152,1505337343,IE +1505337344,1505345535,FR +1505345536,1505353727,MK +1505353728,1505361919,CZ +1505361920,1505370111,PL +1505370112,1505378303,SM +1505378304,1505386495,IT +1505386496,1505394687,HU +1505394688,1505402879,DE +1505402880,1505411071,DK +1505411072,1505413119,CH +1505413120,1505415167,BG +1505415168,1505417215,CH +1505417216,1505419263,AT +1505419264,1505427455,RU +1505427456,1505435647,UA +1505435648,1505443839,MD +1505443840,1505460223,GB +1505460224,1505478655,CZ +1505478656,1505482751,DE +1505482752,1505484799,LB +1505484800,1505492991,PL +1505492992,1505501183,NL +1505501184,1505509375,ME +1505509376,1505511423,AT +1505511424,1505517567,DK +1505517568,1505525759,RU +1505525760,1505533951,IT +1505533952,1505542143,RU +1505542144,1505550335,PL +1505550336,1505566719,RU +1505566720,1505574911,IT +1505574912,1505583103,YE +1505583104,1505607679,RU +1505607680,1505615871,SE +1505615872,1505624063,SA +1505624064,1505632255,FI +1505632256,1505644799,CZ +1505644800,1505645055,PL +1505645056,1505646847,CZ +1505646848,1505647103,PL +1505647104,1505648639,CZ +1505648640,1505656831,LT +1505665024,1505666611,IT +1505666612,1505666615,AT +1505666616,1505673215,IT +1505673216,1505681407,BG +1505681408,1505689599,RU +1505689600,1505697791,NO +1505697792,1505705983,IE +1505705984,1505714175,DE +1505714176,1505722367,LV +1505722368,1505738751,PL +1505738752,1505745159,GB +1505745160,1505745160,GR +1505745161,1505745161,HR +1505745162,1505745162,HU +1505745163,1505745163,AE +1505745164,1505745164,JO +1505745165,1505745165,KE +1505745166,1505745166,KW +1505745167,1505745167,KZ +1505745168,1505745343,GB +1505745344,1505745344,US +1505745345,1505745346,GB +1505745347,1505745347,CA +1505745348,1505746943,GB +1505746944,1505748991,RU +1505748992,1505751039,DE +1505751040,1505755135,RU +1505755136,1506017279,GB +1506017280,1506082815,IR +1506082816,1506148351,GB +1506148352,1506279423,IR +1506279424,1506312191,NL +1506312192,1506316287,GB +1506316288,1506322431,PL +1506322432,1506324479,DE +1506324480,1506328575,RU +1506328576,1506330623,FI +1506330624,1506332671,NL +1506332672,1506334719,PL +1506334720,1506336767,GB +1506336768,1506338815,PL +1506338816,1506340863,UA +1506340864,1506342911,RO +1506342912,1506344959,UA +1506344960,1506377727,LV +1506377728,1506410495,HR +1506410496,1506422063,DE +1506422064,1506422079,GB +1506422080,1506443263,DE +1506443264,1506444397,GB +1506444398,1506444398,DE +1506444399,1506444757,GB +1506444758,1506444758,DE +1506444759,1506445103,GB +1506445104,1506445119,DE +1506445120,1506445135,GB +1506445136,1506445151,DE +1506445152,1506445167,GB +1506445168,1506445183,DE +1506445184,1506445199,GB +1506445200,1506445215,DE +1506445216,1506446143,GB +1506446144,1506446151,FR +1506446152,1506446823,GB +1506446824,1506446831,NL +1506446832,1506448319,GB +1506448320,1506448383,IT +1506448384,1506449263,GB +1506449264,1506449279,BE +1506449280,1506449935,GB +1506449936,1506449943,CH +1506449944,1506450047,GB +1506450048,1506450111,CH +1506450112,1506451071,GB +1506451072,1506451135,DK +1506451136,1506451839,GB +1506451840,1506451871,ES +1506451872,1506452095,GB +1506452096,1506452127,PT +1506452128,1506453311,GB +1506453312,1506453319,SE +1506453320,1506455507,GB +1506455508,1506455511,IT +1506455512,1506456533,GB +1506456534,1506456534,IT +1506456535,1506456771,GB +1506456772,1506456775,IE +1506456776,1506456815,GB +1506456816,1506456819,IE +1506456820,1506456959,GB +1506456960,1506456975,IT +1506456976,1506458244,GB +1506458245,1506458245,CH +1506458246,1506458359,GB +1506458360,1506458367,CH +1506458368,1506459207,GB +1506459208,1506459247,BE +1506459248,1506459295,GB +1506459296,1506459327,BE +1506459328,1506459763,GB +1506459764,1506459767,FR +1506459768,1506459968,GB +1506459969,1506459969,FR +1506459970,1506460151,GB +1506460152,1506460159,FR +1506460160,1506460679,GB +1506460680,1506460683,IT +1506460684,1506462511,GB +1506462512,1506462527,FR +1506462528,1506462719,GB +1506462720,1506462975,IT +1506462976,1506463035,GB +1506463036,1506463039,IT +1506463040,1506463551,GB +1506463552,1506463615,DE +1506463616,1506463679,GB +1506463680,1506463695,DE +1506463696,1506463719,GB +1506463720,1506463727,DE +1506463728,1506464999,GB +1506465000,1506465007,NL +1506465008,1506465187,GB +1506465188,1506465188,NL +1506465189,1506466383,GB +1506466384,1506466391,DE +1506466392,1506466431,GB +1506466432,1506466559,DE +1506466560,1506469663,GB +1506469664,1506469695,IT +1506469696,1506469759,GB +1506469760,1506469775,IT +1506469776,1506471423,GB +1506471424,1506471679,IT +1506471680,1506471871,GB +1506471872,1506471903,IT +1506471904,1506475873,GB +1506475874,1506475874,DE +1506475875,1506476031,GB +1506476032,1506508799,KW +1506508800,1506541567,CZ +1506541568,1506574335,RU +1506574336,1506582527,DE +1506582528,1506607103,IE +1506607104,1506639871,MK +1506639872,1506672639,NL +1506672640,1506689023,PL +1506689024,1506705407,CH +1506705408,1506727935,GB +1506727936,1506728959,FR +1506728960,1506740223,GB +1506742272,1506744319,SE +1506744320,1506746367,NL +1506746368,1506750463,RU +1506750464,1506752511,GB +1506752512,1506754559,IE +1506754560,1506758655,RU +1506758656,1506760703,IT +1506760704,1506764799,RU +1506764800,1506766847,IT +1506766848,1506768895,NO +1506768896,1506770943,AT +1506770944,1506772991,NL +1506772992,1506775039,GB +1506775040,1506777087,AT +1506777088,1506783231,GB +1506785280,1506787327,BE +1506787328,1506789375,ME +1506789376,1506791423,DE +1506791424,1506793471,GB +1506793472,1506795519,RU +1506795520,1506799615,CH +1506799616,1506801663,LV +1506801664,1506803711,DE +1506803712,1506869247,RU +1506869248,1506934783,UA +1506934784,1507000319,GR +1507000320,1507065855,QA +1507065856,1507131391,SI +1507131392,1507196927,GB +1507196928,1507262463,PT +1507262464,1507327999,BG +1507328000,1507393535,RS +1507393536,1507459071,CH +1507459072,1507524607,KZ +1507524608,1507525631,EE +1507525632,1507533823,KZ +1507533824,1507540991,AZ +1507540992,1507557375,IR +1507557376,1507558399,EE +1507558400,1507558911,AZ +1507558912,1507564287,EE +1507564288,1507565823,AZ +1507565824,1507566335,EE +1507566336,1507567615,AZ +1507567616,1507567871,EE +1507567872,1507573759,AZ +1507573760,1507590143,IR +1507590144,1507655679,NL +1507655680,1507659775,DE +1507659776,1507663871,RU +1507663872,1507665791,IT +1507665792,1507665919,GR +1507665920,1507667967,IT +1507667968,1507672063,RU +1507672064,1507676159,EE +1507676160,1507680255,IR +1507680256,1507684351,NO +1507684352,1507688447,LV +1507688448,1507696639,IT +1507696640,1507700735,DK +1507700736,1507704831,NL +1507704832,1507708927,RU +1507708928,1507713023,CZ +1507713024,1507717119,RU +1507717120,1507717631,SE +1507717632,1507718911,NO +1507718912,1507721215,SE +1507721216,1507753983,GB +1507753984,1507819519,RU +1507819520,1507852287,HU +1507852288,1508114431,FR +1508114432,1508376575,PL +1508376576,1508392959,GE +1508392960,1508442111,RU +1508442112,1508458495,DK +1508458496,1508466687,DE +1508466688,1508468735,NO +1508468736,1508470783,NL +1508470784,1508474879,SI +1508474880,1508491263,CZ +1508491264,1508507647,SE +1508507648,1508524031,GB +1508524032,1508540415,IE +1508540416,1508546047,FR +1508546048,1508546303,CI +1508546304,1508556799,FR +1508556800,1508573183,PL +1508573184,1508589567,CZ +1508589568,1508605951,IR +1508605952,1508622335,RU +1508622336,1508638719,EE +1508638720,1508642175,SE +1508642176,1508642303,DK +1508642304,1508647691,SE +1508647692,1508647692,DK +1508647693,1508655103,SE +1508655104,1508671487,FI +1508671488,1508687871,CH +1508687872,1508704255,UZ +1508704256,1508720639,RU +1508720640,1508737023,IL +1508737024,1508753407,SA +1508753408,1508769791,KG +1508769792,1508786175,PL +1508786176,1508802559,DE +1508802560,1508807231,GB +1508807232,1508807247,CZ +1508807248,1508811191,GB +1508811192,1508811195,NL +1508811196,1508812519,GB +1508812520,1508812527,CZ +1508812528,1508815103,GB +1508815104,1508815359,NL +1508815360,1508815615,ES +1508815616,1508817151,GB +1508817152,1508817407,NL +1508817408,1508817663,CZ +1508817664,1508818735,GB +1508818736,1508818743,IE +1508818744,1508818943,GB +1508818944,1508830719,RO +1508830720,1508831487,SK +1508831488,1508835327,RO +1508835328,1508843519,CZ +1508843520,1508847615,PS +1508847616,1508851711,US +1508851712,1508868095,PL +1508868096,1508884479,RU +1508884480,1508900863,DK +1508900864,1509163007,GB +1509163008,1509425151,DE +1509425152,1509429247,NO +1509429248,1509433343,GB +1509433344,1509437439,CH +1509437440,1509443583,GB +1509443584,1509445631,FR +1509445632,1509449727,LV +1509449728,1509453823,ES +1509453824,1509457919,RU +1509457920,1509462015,NL +1509462016,1509466111,LI +1509466112,1509469749,SC +1509469750,1509469750,NL +1509469751,1509470207,SC +1509470208,1509478399,RU +1509478400,1509482495,FR +1509482496,1509486591,RU +1509486592,1509490687,CZ +1509490688,1509494783,DK +1509494784,1509498879,RU +1509498880,1509502463,DE +1509502464,1509502719,CH +1509502720,1509502975,DE +1509502976,1509507071,RU +1509507072,1509507199,GB +1509507200,1509507583,DE +1509507584,1509509375,GB +1509509376,1509509503,DE +1509509504,1509509631,BE +1509509632,1509511167,GB +1509511168,1509515263,LT +1509515264,1509519359,HR +1509519360,1509535743,RU +1509535744,1509537791,IT +1509537792,1509539839,AT +1509539840,1509543935,AM +1509543936,1509548031,LB +1509548032,1509564415,RU +1509564416,1509568511,GB +1509568512,1509572607,FI +1509572608,1509576703,NL +1509576704,1509580799,KZ +1509580800,1509584895,CZ +1509584896,1509588991,NO +1509588992,1509593087,DE +1509593088,1509601279,RU +1509601280,1509605375,NL +1509605376,1509609471,PL +1509609472,1509617663,RU +1509617664,1509621759,CZ +1509621760,1509625855,US +1509625856,1509629951,UA +1509629952,1509634047,HU +1509634048,1509638143,FR +1509638144,1509642239,RU +1509642240,1509646335,KW +1509646336,1509650431,RU +1509650432,1509654527,GB +1509654528,1509658623,DE +1509658624,1509666815,RU +1509666816,1509670911,IT +1509670912,1509679103,GB +1509679104,1509683199,ES +1509683200,1509687295,CH +1509687296,1509703679,UA +1509703680,1509720063,RU +1509720064,1509736447,TR +1509736448,1509752831,BG +1509752832,1509769215,RU +1509769216,1509785599,SE +1509785600,1509801983,BG +1509801984,1509818367,RU +1509818368,1509851135,NO +1509851136,1509867519,LV +1509867520,1509883903,RU +1509883904,1509900287,NL +1509900288,1509916671,RU +1509916672,1509933055,GB +1509933056,1509935103,CH +1509935104,1509941247,NL +1509941248,1509947391,SE +1509947392,1509947647,NL +1509947648,1509947903,US +1509947904,1509948159,DE +1509948160,1509948415,US +1509948416,1509948671,ES +1509948672,1509949439,NL +1509949440,1510604799,FR +1510604800,1510605311,RE +1510605312,1510605823,FR +1510605824,1510606079,RE +1510606080,1510607103,FR +1510607104,1510609663,RE +1510609664,1510610175,FR +1510610176,1510610431,RE +1510610432,1510611199,FR +1510611200,1510611711,RE +1510611712,1510611967,FR +1510611968,1510612223,RE +1510612224,1510613247,FR +1510613248,1510614015,RE +1510614016,1510614271,FR +1510614272,1510614783,RE +1510614784,1510615295,FR +1510615296,1510615551,RE +1510615552,1510615807,FR +1510615808,1510616063,RE +1510616064,1510616575,FR +1510616576,1510616831,RE +1510616832,1510617087,FR +1510617088,1510617343,RE +1510617344,1510617599,FR +1510617600,1510618367,RE +1510618368,1510618879,FR +1510618880,1510619135,RE +1510619136,1510619391,FR +1510619392,1510620415,RE +1510620416,1510620671,FR +1510620672,1510620927,RE +1510620928,1510621183,FR +1510621184,1510621439,RE +1510621440,1510621951,FR +1510621952,1510622975,RE +1510622976,1510623999,FR +1510624000,1510624255,RE +1510624256,1510624511,FR +1510624512,1510625279,RE +1510625280,1510625535,FR +1510625536,1510625791,RE +1510625792,1510626047,FR +1510626048,1510626559,RE +1510626560,1510627071,FR +1510627072,1510627327,RE +1510627328,1510627839,FR +1510627840,1510628351,RE +1510628352,1510628863,FR +1510628864,1510630399,RE +1510630400,1510630655,FR +1510630656,1510630911,RE +1510630912,1510631679,FR +1510631680,1510632703,RE +1510632704,1510632959,FR +1510632960,1510635263,RE +1510635264,1510635519,FR +1510635520,1510636031,RE +1510636032,1510636287,FR +1510636288,1510637311,RE +1510637312,1510637567,FR +1510637568,1510637823,RE +1510637824,1510638335,FR +1510638336,1510638591,RE +1510638592,1510638847,FR +1510638848,1510639103,RE +1510639104,1510639871,FR +1510639872,1510640639,RE +1510640640,1510640895,FR +1510640896,1510641151,RE +1510641152,1510641407,FR +1510641408,1510641663,RE +1510641664,1510641919,FR +1510641920,1510642431,RE +1510642432,1510642687,FR +1510642688,1510643455,RE +1510643456,1510644735,FR +1510644736,1510645247,RE +1510645248,1510645503,FR +1510645504,1510648319,RE +1510648320,1510648831,FR +1510648832,1510649087,RE +1510649088,1510649599,FR +1510649600,1510649855,RE +1510649856,1510650111,FR +1510650112,1510650367,RE +1510650368,1510650623,FR +1510650624,1510653183,RE +1510653184,1510653695,FR +1510653696,1510654463,RE +1510654464,1510654719,FR +1510654720,1510655231,RE +1510655232,1510655487,FR +1510655488,1510655743,RE +1510655744,1510655999,FR +1510656000,1510656255,RE +1510656256,1510657279,FR +1510657280,1510657535,RE +1510657536,1510658047,FR +1510658048,1510658303,RE +1510658304,1510658559,FR +1510658560,1510659583,RE +1510659584,1510660095,FR +1510660096,1510661119,RE +1510661120,1510661375,FR +1510661376,1510661887,RE +1510661888,1510662143,FR +1510662144,1510662655,RE +1510662656,1510662911,FR +1510662912,1510663423,RE +1510663424,1510663935,FR +1510663936,1510664191,RE +1510664192,1510664447,FR +1510664448,1510664703,RE +1510664704,1510664959,FR +1510664960,1510665727,RE +1510665728,1510666239,FR +1510666240,1510666495,RE +1510666496,1510667263,FR +1510667264,1510668031,RE +1510668032,1510668403,FR +1510668404,1510668404,RE +1510668405,1510668543,FR +1510668544,1510669311,RE +1510669312,1510669567,FR +1510669568,1510670079,RE +1510670080,1511981311,FR +1511981312,1511984127,GP +1511984128,1511984383,FR +1511984384,1511985919,GP +1511985920,1511986175,FR +1511986176,1511986431,GP +1511986432,1511986943,FR +1511986944,1511987455,GP +1511987456,1511987967,FR +1511987968,1511989759,GP +1511989760,1511990015,FR +1511990016,1511991295,GP +1511991296,1511991807,FR +1511991808,1511993343,GP +1511993344,1511993599,FR +1511993600,1511994623,GP +1511994624,1511994879,FR +1511994880,1511995391,GP +1511995392,1511995647,FR +1511995648,1511996415,GP +1511996416,1511996671,FR +1511996672,1511996927,GP +1511996928,1511997439,FR +1511997440,1511997695,MF +1511997696,1511998719,FR +1511998720,1511998975,MF +1511998976,1511999231,BL +1511999232,1511999743,FR +1511999744,1511999999,BL +1512000000,1512000767,FR +1512000768,1512001023,MF +1512001024,1512001535,FR +1512001536,1512001791,MF +1512001792,1512002559,FR +1512002560,1512002815,MF +1512002816,1512003327,FR +1512003328,1512003583,MF +1512003584,1512004095,FR +1512004096,1512004351,MF +1512004352,1512004607,BL +1512004608,1512004863,FR +1512004864,1512005375,BL +1512005376,1512006143,MF +1512006144,1512006911,BL +1512006912,1512008959,FR +1512008960,1512009215,MF +1512009216,1512012031,FR +1512012032,1512012287,BL +1512012288,1512013823,FR +1512013824,1512015359,GF +1512015360,1512015615,FR +1512015616,1512018431,GF +1512018432,1512018687,FR +1512018688,1512018943,GF +1512018944,1512019711,FR +1512019712,1512021759,GF +1512021760,1512022015,FR +1512022016,1512026623,GF +1512026624,1512026879,FR +1512026880,1512027135,GF +1512027136,1512027391,FR +1512027392,1512027647,GF +1512027648,1512027903,FR +1512027904,1512028671,GF +1512028672,1512028927,FR +1512028928,1512029951,GF +1512029952,1512030207,FR +1512030208,1512046591,MQ +1512046592,1512308735,FR +1512308736,1512309759,GP +1512309760,1512310015,FR +1512310016,1512310271,GP +1512310272,1512310527,FR +1512310528,1512311039,GP +1512311040,1512311295,FR +1512311296,1512312575,GP +1512312576,1512313087,FR +1512313088,1512313343,GP +1512313344,1512313599,FR +1512313600,1512313855,GP +1512313856,1512315135,FR +1512315136,1512315903,GP +1512315904,1512316415,FR +1512316416,1512317695,GP +1512317696,1512317951,FR +1512317952,1512318719,GP +1512318720,1512319231,FR +1512319232,1512319487,GP +1512319488,1512319743,FR +1512319744,1512320511,GP +1512320512,1512321279,FR +1512321280,1512321535,GP +1512321536,1512321791,FR +1512321792,1512322047,GP +1512322048,1512322303,FR +1512322304,1512322559,GP +1512322560,1512322815,FR +1512322816,1512323071,GP +1512323072,1512324095,FR +1512324096,1512324607,GP +1512324608,1512325631,FR +1512325632,1512326143,GP +1512326144,1512329215,FR +1512329216,1512329471,GP +1512329472,1512329983,FR +1512329984,1512330495,GP +1512330496,1512330751,FR +1512330752,1512331263,GP +1512331264,1512331519,FR +1512331520,1512331775,GP +1512331776,1512332031,FR +1512332032,1512332543,GP +1512332544,1512332799,FR +1512332800,1512333055,GP +1512333056,1512337407,FR +1512337408,1512338175,GP +1512338176,1512338431,FR +1512338432,1512338687,GP +1512338688,1512338943,FR +1512338944,1512339967,GP +1512339968,1512340735,FR +1512340736,1512341247,GP +1512341248,1512342015,FR +1512342016,1512343039,GP +1512343040,1512344319,FR +1512344320,1512345855,GP +1512345856,1512346111,FR +1512346112,1512346367,GP +1512346368,1512347391,FR +1512347392,1512348671,GP +1512348672,1512348927,FR +1512348928,1512349951,GP +1512349952,1512350463,FR +1512350464,1512350719,GP +1512350720,1512350975,FR +1512350976,1512353791,GP +1512353792,1512354047,FR +1512354048,1512354559,GP +1512354560,1512355071,FR +1512355072,1512355583,GP +1512355584,1512356095,FR +1512356096,1512356607,GP +1512356608,1512357119,FR +1512357120,1512357887,GP +1512357888,1512358655,FR +1512358656,1512358911,GP +1512358912,1512362239,FR +1512362240,1512362495,GP +1512362496,1512362751,FR +1512362752,1512363263,GP +1512363264,1512363519,FR +1512363520,1512364031,GP +1512364032,1512364287,FR +1512364288,1512365055,GP +1512365056,1512365311,FR +1512365312,1512365567,GP +1512365568,1512365823,FR +1512365824,1512366335,GP +1512366336,1512369151,FR +1512369152,1512370441,GP +1512370442,1512370442,FR +1512370443,1512370943,GP +1512370944,1512371199,FR +1512371200,1512372735,GP +1512372736,1512373247,FR +1512373248,1512374015,GP +1512374016,1513892207,FR +1513892208,1513892208,ES +1513892209,1514143743,FR +1514143744,1514176511,SK +1514176512,1514405887,FR +1514405888,1514536959,ES +1514536960,1514602495,FR +1514602496,1514668031,ES +1514668032,1514799103,FR +1514799104,1514930175,ES +1514930176,1514995711,FR +1514995712,1515061247,ES +1515061248,1515467007,FR +1515467008,1515467263,ES +1515467264,1515467519,FR +1515467520,1515468031,US +1515468032,1515468287,ES +1515468288,1515468543,NL +1515468544,1515468799,DE +1515468800,1515469823,FR +1515469824,1515470079,DE +1515470080,1515470335,FR +1515470336,1515470847,US +1515470848,1515488511,FR +1515488512,1515489023,US +1515489024,1515489039,DE +1515489040,1515489055,FR +1515489056,1515489087,DE +1515489088,1515489151,FR +1515489152,1515489167,ES +1515489168,1515489535,FR +1515489536,1515489791,US +1515489792,1515491007,NL +1515491008,1515511807,FR +1515511808,1515515903,RO +1515515904,1516109823,FR +1516109824,1516175359,ES +1516175360,1516240895,RO +1516240896,1516896255,FR +1516896256,1516961791,ES +1516961792,1518338047,FR +1518338048,1518370815,LV +1518370816,1518419967,NL +1518419968,1518436351,SE +1518436352,1518446874,NL +1518446875,1518446875,NO +1518446876,1518452735,NL +1518452736,1518460927,AT +1518460928,1518469119,LV +1518469120,1518472191,SE +1518472192,1518475263,LT +1518475264,1518476287,SE +1518476288,1518476799,EE +1518476800,1518477311,SE +1518477312,1518481407,EE +1518481408,1518493695,SE +1518493696,1518501887,LV +1518501888,1518503935,EE +1518503936,1518510079,LT +1518510080,1518540543,SE +1518540544,1518540799,LT +1518540800,1518541479,SE +1518541480,1518541480,DE +1518541481,1518542847,SE +1518542848,1518565375,LT +1518565376,1518567423,SE +1518567424,1518575615,LV +1518575616,1518583807,LT +1518583808,1518600191,HR +1518600192,1518641151,SE +1518641152,1518649343,HR +1518649344,1518665727,SE +1518665728,1518698495,LV +1518698496,1518698496,LT +1518698497,1518698960,LV +1518698961,1518698961,LT +1518698962,1518700749,LV +1518700750,1518700750,LT +1518700751,1518706687,LV +1518706688,1518706688,LT +1518706689,1518708837,LV +1518708838,1518708838,LT +1518708839,1518709552,LV +1518709553,1518709553,LT +1518709554,1518723071,LV +1518723072,1518727167,EE +1518727168,1518731263,SE +1518731264,1518780415,LT +1518780416,1518796799,HR +1518796800,1518862335,LT +1518862336,1518927871,SE +1518927872,1518961663,LT +1518961664,1518962175,EE +1518962176,1518962687,LV +1518962688,1518966783,HR +1518966784,1518967807,SE +1518967808,1518977023,HR +1518977024,1518985215,LT +1518985216,1518989311,SE +1518989312,1519058943,LT +1519058944,1519083519,LV +1519083520,1519084879,SE +1519084880,1519084895,EE +1519084896,1519091711,SE +1519091712,1519124479,LV +1519124480,1519198207,LT +1519198208,1519200255,SE +1519200256,1519206399,EE +1519206400,1519208703,SE +1519208704,1519209471,LV +1519209472,1519210495,SE +1519210496,1519222783,LT +1519222784,1519271935,SE +1519271936,1519288319,NL +1519288320,1519292415,SE +1519292416,1519294463,LT +1519294464,1519296511,SE +1519296512,1519304703,LT +1519304704,1519308799,NL +1519308800,1519321087,LT +1519321088,1519337471,KZ +1519337472,1519352822,LT +1519352823,1519352823,KZ +1519352824,1519353855,LT +1519353856,1519370239,KZ +1519370240,1519394815,SE +1519394816,1519398911,HR +1519398912,1519403007,SE +1519403008,1519411199,LT +1519411200,1519419391,NL +1519419392,1519452159,SE +1519452160,1519517695,NL +1519517696,1519583231,AT +1519583232,1519648767,IT +1519648768,1519714303,SA +1519714304,1519779839,NO +1519779840,1519910911,RU +1519910912,1519936191,GB +1519936192,1519936255,DK +1519936256,1519943679,GB +1519943680,1519976447,AT +1519976448,1520009215,DE +1520009216,1520017407,LB +1520017408,1520041983,SY +1520041984,1520074751,RU +1520074752,1520107519,BG +1520107520,1520140287,GB +1520140288,1520173055,RU +1520173056,1520205823,PL +1520205824,1520230399,RU +1520230400,1520234495,NL +1520234496,1520271359,RU +1520271360,1520304127,SI +1520304128,1520435199,TR +1520435200,1521483775,ES +1521483776,1521491967,SK +1521491968,1522008063,CZ +1522008064,1522139135,DK +1522139136,1522270207,DE +1522270208,1522401279,RU +1522401280,1522532351,EE +1522532352,1524629503,GB +1524629504,1525678079,SE +1525678080,1526726655,GB +1526726656,1531183103,DE +1531183104,1531445247,FR +1531445248,1531707391,AE +1531707392,1531969535,RU +1531969536,1532100607,IT +1532100608,1532199935,HU +1532199936,1532200959,RS +1532200960,1532231679,HU +1532231680,1532362751,GB +1532362752,1532493823,BE +1532493824,1532559359,FR +1532559360,1532624895,DE +1532624896,1532626943,ES +1532626944,1532631039,UA +1532631040,1532633087,SE +1532633088,1532635135,RU +1532635136,1532637183,NO +1532637184,1532639231,FI +1532639232,1532641279,PL +1532641280,1532643327,NO +1532643328,1532645375,PL +1532647424,1532649471,PL +1532649472,1532651519,FR +1532651520,1532653567,NO +1532653568,1532655615,PL +1532655616,1532657663,RO +1532657664,1532661759,IL +1532661760,1532665855,DE +1532665856,1532674047,PL +1532674048,1532675071,NL +1532675072,1532682239,UA +1532682240,1532690431,LV +1532690432,1532755967,FR +1532755968,1532756223,GR +1532756224,1532756479,RO +1532756480,1532756735,UA +1532756736,1532756991,BG +1532756992,1532757503,DE +1532757504,1532760319,BG +1532760320,1532761343,DE +1532761344,1532761599,BG +1532761600,1532762111,DE +1532762112,1532774143,BG +1532774144,1532774399,CH +1532774400,1532782591,BG +1532782592,1532782847,IR +1532782848,1532784639,BG +1532784640,1532785151,NL +1532785152,1532785407,IR +1532785408,1532785663,BG +1532785664,1532786687,IT +1532786688,1532786943,BG +1532786944,1532788735,IR +1532788736,1532788991,BG +1532788992,1532790783,IR +1532790784,1532793087,BG +1532793088,1532794879,IR +1532794880,1532795903,BG +1532795904,1532796927,IR +1532796928,1532797951,BG +1532797952,1532798975,IR +1532798976,1532799999,BG +1532800000,1532801023,IR +1532801024,1532801535,SA +1532801536,1532802047,DE +1532802048,1532805631,IR +1532805632,1532808191,BG +1532808192,1532811263,IR +1532811264,1532812031,BG +1532812032,1532812287,RO +1532812288,1532813311,IR +1532813312,1532814335,DE +1532814336,1532814847,IR +1532814848,1532815103,BG +1532815104,1532815359,IR +1532815360,1532816383,BG +1532816384,1532817407,IR +1532817408,1532821503,BG +1532821504,1532887039,TR +1532887040,1532952575,PL +1532952576,1533018111,SE +1533018112,1533149183,DE +1533149184,1533280255,IR +1533280256,1533411327,DK +1533411328,1533413375,GB +1533413376,1533415423,DE +1533415424,1533417471,SA +1533417472,1533419519,NO +1533419520,1533421567,KW +1533421568,1533423615,NL +1533423616,1533425663,IT +1533425664,1533429759,GB +1533429760,1533431807,RU +1533431808,1533433855,IE +1533433856,1533435903,DK +1533435904,1533437951,CZ +1533437952,1533442047,PL +1533442048,1533444095,AE +1533444096,1533446143,IT +1533446144,1533448191,DE +1533448192,1533450239,KW +1533450240,1533452287,RU +1533452288,1533454335,TR +1533454336,1533456383,RS +1533456384,1533458431,UA +1533458432,1533460479,GB +1533460480,1533462527,CH +1533462528,1533464575,RU +1533464576,1533466623,NL +1533466624,1533468671,RU +1533468672,1533470719,RS +1533470720,1533472767,KW +1533472768,1533474815,ES +1533474816,1533476863,FR +1533476864,1533478911,IE +1533480960,1533481983,NL +1533481984,1533482495,GB +1533482496,1533482751,NL +1533482752,1533483007,GB +1533483008,1533485055,AM +1533485056,1533485823,GB +1533485824,1533486335,DE +1533486336,1533486719,NO +1533486720,1533486783,DK +1533486784,1533487103,FI +1533487104,1533488639,FR +1533488640,1533488895,US +1533488896,1533489151,FR +1533489152,1533491199,ES +1533491200,1533493247,AM +1533493248,1533497343,RU +1533499392,1533501439,MT +1533501440,1533503487,LT +1533503488,1533505535,RU +1533505536,1533507583,DE +1533507584,1533509631,UA +1533509632,1533511679,GB +1533511680,1533513727,FR +1533515776,1533517823,RU +1533517824,1533519871,CZ +1533519872,1533526015,GB +1533526016,1533532159,RU +1533532160,1533534207,GB +1533534208,1533536255,RU +1533536256,1533538303,FR +1533538304,1533540351,DE +1533542400,1533607935,HU +1533607936,1533640703,LV +1533640704,1533659135,RU +1533659136,1533660159,LV +1533660160,1533661183,UA +1533661184,1533663231,SE +1533663232,1533665279,NL +1533665280,1533667327,GB +1533667328,1533669375,RU +1533669376,1533671423,DE +1533671424,1533673471,FI +1533673472,1533677567,DE +1533677568,1533679615,ES +1533679616,1533680127,PL +1533680128,1533680383,ES +1533680384,1533681663,PL +1533681664,1533689855,IQ +1533689856,1533698047,IR +1533698048,1533702143,JO +1533702144,1533704191,RU +1533704192,1533722623,DE +1533722624,1533724671,SE +1533724672,1533726719,RU +1533726720,1533728767,CY +1533730816,1533732863,NL +1533732864,1533734911,RU +1533734912,1533739007,CZ +1533739008,1533739263,IR +1533739264,1533757439,RU +1533757440,1533759487,NL +1533759488,1533761535,RU +1533761536,1533763583,NL +1533763584,1533768703,RU +1533768704,1533768959,GB +1533768960,1533769727,RU +1533769728,1533770751,GB +1533770752,1533771519,RU +1533771520,1533771775,GB +1533771776,1533804543,IR +1533804544,1533805567,RU +1533805568,1533807615,NL +1533807616,1533808639,US +1533808640,1533816831,RU +1533816832,1533818879,GB +1533818880,1533819903,NL +1533819904,1533820927,RU +1533820928,1533829119,DE +1533829120,1533833215,NO +1533833216,1533845503,IR +1533845504,1533847551,GB +1533847552,1533849599,RU +1533849600,1533851135,SE +1533851136,1533851391,PL +1533851392,1533851647,SE +1533851648,1533851807,CH +1533851808,1533851839,HK +1533851840,1533851871,CH +1533851872,1533851887,AU +1533851888,1533851903,CH +1533851904,1533851919,DE +1533851920,1533851923,FR +1533851924,1533851935,CH +1533851936,1533851939,GB +1533851940,1533851951,CH +1533851952,1533851955,IT +1533851956,1533851967,CH +1533851968,1533851971,PL +1533851972,1533851983,CH +1533851984,1533851987,BR +1533851988,1533852191,CH +1533852192,1533852195,IN +1533852196,1533852223,CH +1533852224,1533852239,RU +1533852240,1533852675,CH +1533852676,1533852687,ES +1533852688,1533852711,FR +1533852712,1533852719,CH +1533852720,1533852731,AR +1533852732,1533852739,NL +1533852740,1533852757,FR +1533852758,1533852767,GB +1533852768,1533852783,BR +1533852784,1533852829,GB +1533852830,1533852849,ZA +1533852850,1533852864,BE +1533852865,1533852869,CH +1533852870,1533852889,AU +1533852890,1533852909,SG +1533852910,1533852917,ES +1533852918,1533852925,AR +1533852926,1533853695,CH +1533853696,1533854207,GB +1533854208,1533855231,IR +1533855232,1533857791,GB +1533857792,1533859839,IR +1533859840,1533864959,IQ +1533864960,1533874175,GB +1533874176,1533878271,DE +1533878272,1533880319,CZ +1533880320,1533882367,GB +1533882368,1533886463,IT +1533886464,1533894655,RU +1533894656,1533896703,ES +1533896704,1533898751,IR +1533898752,1533899775,PT +1533899776,1533900031,GB +1533900032,1533900799,PT +1533900800,1533902847,FR +1533902848,1533911039,RU +1533911040,1533913087,ES +1533913088,1533915135,IT +1533915136,1533919231,NL +1533919232,1533921279,IT +1533921280,1533923327,RU +1533923328,1533925375,TR +1533925376,1533927423,AF +1533927424,1533929471,RU +1533929472,1533932799,GB +1533932800,1533933055,DE +1533933056,1534066687,GB +1534066688,1534328831,AT +1534328832,1534459903,ES +1534459904,1534590975,AT +1534590976,1534656511,HU +1534656512,1534711807,FR +1534711808,1534712831,BE +1534712832,1534713855,FR +1534713856,1534713887,PT +1534713888,1534714111,FR +1534714112,1534714115,ES +1534714116,1534714119,FR +1534714120,1534714123,FI +1534714124,1534714143,FR +1534714144,1534714159,GB +1534714160,1534714415,FR +1534714416,1534714431,ES +1534714432,1534714639,FR +1534714640,1534714655,IE +1534714656,1534714687,ES +1534714688,1534714691,FR +1534714692,1534714695,GB +1534714696,1534714751,FR +1534714752,1534714767,DE +1534714768,1534714871,FR +1534714872,1534714875,ES +1534714876,1534715207,FR +1534715208,1534715211,GB +1534715212,1534715215,FR +1534715216,1534715231,GB +1534715232,1534715551,FR +1534715552,1534715567,PT +1534715568,1534715583,FR +1534715584,1534715599,GB +1534715600,1534715871,FR +1534715872,1534715875,ES +1534715876,1534716063,FR +1534716064,1534716095,PT +1534716096,1534716099,DE +1534716100,1534716111,FR +1534716112,1534716115,DE +1534716116,1534716239,FR +1534716240,1534716255,GB +1534716256,1534716319,FR +1534716320,1534716351,GB +1534716352,1534716375,FR +1534716376,1534716379,ES +1534716380,1534716391,FR +1534716392,1534716395,ES +1534716396,1534716399,GB +1534716400,1534716495,FR +1534716496,1534716511,ES +1534716512,1534716655,FR +1534716656,1534716663,IE +1534716664,1534717191,FR +1534717192,1534717199,FI +1534717200,1534717215,GB +1534717216,1534717247,FR +1534717248,1534717251,ES +1534717252,1534717263,FR +1534717264,1534717267,ES +1534717268,1534717343,FR +1534717344,1534717359,GB +1534717360,1534717739,FR +1534717740,1534717743,GB +1534717744,1534717963,FR +1534717964,1534717967,PL +1534717968,1534717995,FR +1534717996,1534717999,GB +1534718000,1534718031,FR +1534718032,1534718047,ES +1534718048,1534718087,FR +1534718088,1534718091,ES +1534718092,1534718103,FR +1534718104,1534718111,ES +1534718112,1534718127,FR +1534718128,1534718143,ES +1534718144,1534718415,FR +1534718416,1534718419,ES +1534718420,1534718423,GB +1534718424,1534718719,FR +1534718720,1534718735,GB +1534718736,1534718763,FR +1534718764,1534718767,ES +1534718768,1534718783,FR +1534718784,1534718807,ES +1534718808,1534719071,FR +1534719072,1534719075,FI +1534719076,1534719339,FR +1534719340,1534719343,ES +1534719344,1534719679,FR +1534719680,1534719695,GB +1534719696,1534719703,FR +1534719704,1534719711,GB +1534719712,1534719739,FR +1534719740,1534719743,ES +1534719744,1534719747,FR +1534719748,1534719751,ES +1534719752,1534719783,FR +1534719784,1534719787,ES +1534719788,1534720011,FR +1534720012,1534720015,IE +1534720016,1534720023,FR +1534720024,1534720027,PL +1534720028,1534720079,FR +1534720080,1534720095,ES +1534720096,1534720175,FR +1534720176,1534720179,NL +1534720180,1534720183,ES +1534720184,1534720367,FR +1534720368,1534720375,ES +1534720376,1534720387,FR +1534720388,1534720391,FI +1534720392,1534720655,FR +1534720656,1534720663,ES +1534720664,1534720767,FR +1534720768,1534720783,ES +1534720784,1534720831,FR +1534720832,1534720863,GB +1534720864,1534721807,FR +1534721808,1534721823,GB +1534721824,1534721975,FR +1534721976,1534721979,FI +1534721980,1534722047,FR +1534722048,1534787583,RU +1534787584,1534791679,RO +1534791680,1534795775,RU +1534795776,1534803967,NO +1534803968,1534808063,LV +1534808064,1534812159,RU +1534812160,1534816255,CH +1534816256,1534820351,FR +1534820352,1534824447,FI +1534824448,1534828543,UA +1534828544,1534836735,PL +1534836736,1534840831,SE +1534840832,1534844927,PL +1534844928,1534849023,IE +1534849024,1534853119,NL +1534853120,1534918655,UA +1534918656,1534984191,GB +1534984192,1534988287,NO +1534988288,1535049727,ES +1535049728,1535115263,SK +1535115264,1535116287,AT +1535116288,1535123455,SE +1535123456,1535148031,HR +1535148032,1535197183,AT +1535197184,1535203359,EE +1535203360,1535205375,SE +1535205376,1535213567,EE +1535213568,1535246335,SE +1535246336,1535311871,AT +1535311872,1535344639,EE +1535344640,1535350783,SE +1535350784,1535352831,HR +1535352832,1535377407,EE +1535442944,1535451135,RU +1535451136,1535459327,DK +1535459328,1535475711,AT +1535475712,1535508479,IR +1535508480,1535509151,FR +1535509152,1535509183,IT +1535509184,1535509247,DE +1535509248,1535509279,FR +1535509280,1535509311,ES +1535509312,1535509487,FR +1535509488,1535509503,PT +1535509504,1535511615,FR +1535511616,1535511679,DE +1535511680,1535511871,FR +1535511872,1535511935,ES +1535511936,1535511999,FR +1535512000,1535512015,GB +1535512016,1535512095,FR +1535512096,1535512127,PL +1535512128,1535512779,FR +1535512780,1535512783,PL +1535512784,1535512799,FR +1535512800,1535512831,DE +1535512832,1535514767,FR +1535514768,1535514783,LT +1535514784,1535514895,FR +1535514896,1535514911,NL +1535514912,1535514943,FI +1535514944,1535515007,IE +1535515008,1535515055,FR +1535515056,1535515071,IT +1535515072,1535515231,FR +1535515232,1535515263,CZ +1535515264,1535515331,FR +1535515332,1535515335,ES +1535515336,1535515423,FR +1535515424,1535515455,IT +1535515456,1535515519,PL +1535515520,1535515647,GB +1535515648,1535515727,FR +1535515728,1535515735,NL +1535515736,1535515743,FR +1535515744,1535515775,PT +1535515776,1535515935,FR +1535515936,1535515967,LT +1535515968,1535521407,FR +1535521408,1535521535,NL +1535521536,1535537343,FR +1535537344,1535537407,DE +1535537408,1535537535,FR +1535537536,1535537663,ES +1535537664,1535537819,FR +1535537820,1535537823,PL +1535537824,1535537855,FR +1535537856,1535537919,IT +1535537920,1535538111,FR +1535538112,1535538175,FI +1535538176,1535538815,FR +1535538816,1535538879,IE +1535538880,1535540159,FR +1535540160,1535540223,CZ +1535540224,1535540799,FR +1535540800,1535540863,PL +1535540864,1535540991,BE +1535540992,1535542079,FR +1535542080,1535542143,FI +1535542144,1535542640,FR +1535542641,1535542641,BE +1535542642,1535545551,FR +1535545552,1535545567,PT +1535545568,1535545599,DE +1535545600,1535545855,GB +1535545856,1535545983,FR +1535545984,1535546111,IE +1535546112,1535546239,FR +1535546240,1535546367,IT +1535546368,1535546695,FR +1535546696,1535546703,ES +1535546704,1535547158,FR +1535547159,1535547159,IT +1535547160,1535547167,FR +1535547168,1535547183,IT +1535547184,1535547199,FR +1535547200,1535547207,ES +1535547208,1535547407,FR +1535547408,1535547423,DE +1535547424,1535547471,FR +1535547472,1535547487,LT +1535547488,1535548091,FR +1535548092,1535548095,PL +1535548096,1535548159,IT +1535548160,1535548223,FR +1535548224,1535548415,ES +1535548416,1535548463,FR +1535548464,1535548479,LT +1535548480,1535548991,FR +1535548992,1535549055,PT +1535549056,1535549151,FR +1535549152,1535549183,PL +1535549184,1535549279,FR +1535549280,1535549295,CZ +1535549296,1535549311,FR +1535549312,1535549439,NL +1535549440,1535549631,FR +1535549632,1535549695,PL +1535549696,1535550015,FR +1535550016,1535550079,IT +1535550080,1535550519,FR +1535550520,1535550523,DE +1535550524,1535550547,FR +1535550548,1535550551,DE +1535550552,1535550911,FR +1535550912,1535550927,BE +1535550928,1535551087,FR +1535551088,1535551103,ES +1535551104,1535551679,FR +1535551680,1535551695,GB +1535551696,1535551771,FR +1535551772,1535551772,CZ +1535551773,1535551807,FR +1535551808,1535551823,LT +1535551824,1535551843,FR +1535551844,1535551844,FI +1535551845,1535551903,FR +1535551904,1535551919,NL +1535551920,1535551999,FR +1535552000,1535552127,IT +1535552128,1535552215,FR +1535552216,1535552223,ES +1535552224,1535552463,FR +1535552464,1535552479,NL +1535552480,1535552895,FR +1535552896,1535553023,DE +1535553024,1535553343,FR +1535553344,1535553407,PL +1535553408,1535553471,FR +1535553472,1535553535,ES +1535553536,1535553727,FR +1535553728,1535553791,IT +1535553792,1535553983,FR +1535553984,1535554047,GB +1535554048,1535554287,FR +1535554288,1535554303,PL +1535554304,1535554367,FR +1535554368,1535554431,ES +1535554432,1535554559,DE +1535554560,1535554687,FR +1535554688,1535554815,IT +1535554816,1535554847,FR +1535554848,1535554863,PT +1535554864,1535555103,FR +1535555104,1535555135,LT +1535555136,1535555679,FR +1535555680,1535555711,PL +1535555712,1535555935,FR +1535555936,1535555951,ES +1535555952,1535556095,FR +1535556096,1535556159,ES +1535556160,1535556271,FR +1535556272,1535556287,GB +1535556288,1535556479,FR +1535556480,1535556607,NL +1535556608,1535556863,FR +1535556864,1535557119,GB +1535557120,1535557311,FR +1535557312,1535557375,PL +1535557376,1535558015,FR +1535558016,1535558143,ES +1535558144,1535558591,FR +1535558592,1535558655,DE +1535558656,1535558847,FR +1535558848,1535558911,PL +1535558912,1535559191,FR +1535559192,1535559199,ES +1535559200,1535559695,FR +1535559696,1535559711,IT +1535559712,1535559743,LT +1535559744,1535559807,FR +1535559808,1535559871,FI +1535559872,1535559935,FR +1535559936,1535560191,GB +1535560192,1535560287,FR +1535560288,1535560319,FI +1535560320,1535560511,FR +1535560512,1535560575,PT +1535560576,1535560703,DE +1535560704,1535560915,FR +1535560916,1535560919,PL +1535560920,1535561407,FR +1535561408,1535561471,CZ +1535561472,1535561567,FR +1535561568,1535561599,PL +1535561600,1535561695,FR +1535561696,1535561727,ES +1535561728,1535562303,FR +1535562304,1535562367,PL +1535562368,1535562403,FR +1535562404,1535562407,GB +1535562408,1535562591,FR +1535562592,1535562623,FI +1535562624,1535562699,FR +1535562700,1535562703,PT +1535562704,1535562719,FR +1535562720,1535562751,IT +1535562752,1535562879,FR +1535562880,1535563007,ES +1535563008,1535563371,FR +1535563372,1535563375,FI +1535563376,1535563407,FR +1535563408,1535563411,PL +1535563412,1535563455,FR +1535563456,1535563519,IE +1535563520,1535563711,FR +1535563712,1535563775,IT +1535563776,1535563903,FR +1535563904,1535564031,NL +1535564032,1535564351,FR +1535564352,1535564415,IE +1535564416,1535564543,BE +1535564544,1535564767,FR +1535564768,1535564799,PL +1535564800,1535565503,FR +1535565504,1535565567,IT +1535565568,1535565615,FR +1535565616,1535565623,ES +1535565624,1535565759,FR +1535565760,1535565823,CZ +1535565824,1535566143,FR +1535566144,1535566159,ES +1535566160,1535566655,FR +1535566656,1535566719,PL +1535566720,1535567551,FR +1535567552,1535567615,ES +1535567616,1535567871,GB +1535567872,1535567999,FR +1535568000,1535568127,DE +1535568128,1535568351,FR +1535568352,1535568383,LT +1535568384,1535569023,FR +1535569024,1535569151,ES +1535569152,1535569343,FR +1535569344,1535569407,PL +1535569408,1535570991,FR +1535570992,1535571007,LT +1535571008,1535571015,ES +1535571016,1535571071,FR +1535571072,1535571199,GB +1535571200,1535571263,BE +1535571264,1535571519,FR +1535571520,1535571583,ES +1535571584,1535571711,FR +1535571712,1535571743,PL +1535571744,1535571903,FR +1535571904,1535571967,NL +1535571968,1535572799,FR +1535572800,1535572831,IE +1535572832,1535573203,FR +1535573204,1535573207,FI +1535573208,1535573211,FR +1535573212,1535573215,GB +1535573216,1535573231,FR +1535573232,1535573247,PL +1535573248,1535573307,FR +1535573308,1535573311,NL +1535573312,1535573391,FR +1535573392,1535573407,ES +1535573408,1535573423,FR +1535573424,1535573439,CZ +1535573440,1535573503,PL +1535573504,1535573543,FR +1535573544,1535573547,LT +1535573548,1535574015,FR +1535574016,1535578111,GB +1535578112,1535582207,LV +1535582208,1535590399,NO +1535590400,1535591423,CH +1535591424,1535591679,NL +1535591680,1535593471,CH +1535593472,1535593727,HK +1535593728,1535594495,CH +1535594496,1535598591,LV +1535598592,1535602687,IL +1535602688,1535606783,HU +1535606784,1535610879,NO +1535610880,1535614975,RU +1535614976,1535619071,AT +1535619072,1535623167,FR +1535623168,1535627263,KZ +1535627264,1535631359,RU +1535631360,1535635455,GB +1535635456,1535639551,AZ +1535639552,1535672319,GB +1535672320,1535737855,DE +1535737856,1535770623,HU +1535770624,1535803391,CH +1535803392,1535836159,GR +1535836160,1535868927,CZ +1535868928,1535901695,BG +1535901696,1535934463,GR +1535934464,1535967231,KW +1535967232,1535999999,AT +1536000000,1536032767,NL +1536032768,1536036863,LV +1536036864,1536040959,AT +1536040960,1536045055,GB +1536045056,1536049151,DE +1536049152,1536051199,IT +1536051200,1536057343,RU +1536057344,1536061439,IE +1536061440,1536065535,SE +1536065536,1536065791,GB +1536065792,1536066303,LU +1536066304,1536066815,NL +1536067072,1536067327,GB +1536067328,1536067583,RU +1536067584,1536067839,DK +1536067840,1536068095,PL +1536068096,1536068351,RU +1536068352,1536068607,HR +1536068864,1536069119,RU +1536069120,1536069375,TR +1536069376,1536069631,IT +1536069632,1536073727,RU +1536073728,1536077823,UA +1536077824,1536081919,SE +1536081920,1536086015,PL +1536086016,1536090111,ES +1536090112,1536094207,IE +1536094208,1536098303,NL +1536098304,1536114687,RU +1536114688,1536118783,GB +1536118784,1536122879,DE +1536122880,1536126975,AT +1536126976,1536131071,DK +1536131072,1536143359,RU +1536143360,1536147455,GB +1536147456,1536151551,IT +1536151552,1536152575,RS +1536152576,1536152607,XK +1536152608,1536155135,RS +1536155136,1536155647,XK +1536155648,1536159743,IL +1536159744,1536163839,DE +1536163840,1536180223,SY +1536180224,1536196607,HU +1536196608,1536212991,RU +1536212992,1536229375,DK +1536229376,1536245759,SE +1536245760,1536262143,FI +1536262144,1536278527,PL +1536278528,1536294911,UA +1536294912,1536311295,RU +1536311296,1536319487,EE +1536319488,1536321535,ES +1536321536,1536325631,GB +1536325632,1536327679,CZ +1536327680,1536344063,HU +1536344064,1536360447,PL +1536360448,1536376831,RU +1536376832,1536380927,IR +1536380928,1536393215,KZ +1536393216,1536409599,SA +1536409600,1536425983,HU +1536425984,1536442367,SK +1536442368,1536444927,RS +1536444928,1536448906,XK +1536448907,1536448907,RS +1536448908,1536450230,XK +1536450231,1536450231,RS +1536450232,1536450494,XK +1536450495,1536450495,RS +1536450496,1536450559,XK +1536450560,1536453375,RS +1536453376,1536453631,XK +1536453632,1536453887,RS +1536453888,1536453903,XK +1536453904,1536456191,RS +1536456192,1536456447,XK +1536456448,1536458751,RS +1536458752,1536475135,BG +1536475136,1536476159,NL +1536476160,1536476671,GB +1536476672,1536479231,NL +1536479232,1536483327,GB +1536483328,1536491519,NL +1536491520,1536499711,NO +1536499712,1536503807,SE +1536503808,1536507903,NO +1536507904,1536524287,RU +1536524288,1536540671,BY +1536540672,1536557055,PL +1536557056,1536573439,FI +1536573440,1536574463,RS +1536574464,1536574719,XK +1536574720,1536574975,RS +1536574976,1536575615,XK +1536575616,1536579071,RS +1536579072,1536579327,XK +1536579328,1536579583,RS +1536579584,1536579839,XK +1536579840,1536580351,RS +1536580352,1536580607,XK +1536580608,1536589823,RS +1536589824,1536614399,PL +1536614400,1536622591,DK +1536622592,1536626687,GB +1536626688,1536626943,DE +1536626944,1536627072,AT +1536627073,1536630783,DE +1536630784,1536634879,RU +1536634880,1536643071,FR +1536643072,1536647167,TR +1536647168,1536651263,ES +1536651264,1536655359,FR +1536655360,1536659455,GE +1536659456,1536659711,ZA +1536659712,1536663551,DE +1536663552,1536667647,SA +1536667648,1536675839,RU +1536675840,1536679935,GB +1536679936,1536684031,LB +1536684032,1536688127,GB +1536688128,1537212415,FI +1537212416,1538260991,FR +1538260992,1538785279,BE +1538785280,1538793471,NL +1538793472,1538797567,DE +1538797568,1538801663,NL +1538801664,1538809855,IR +1538809856,1538818047,GE +1538818048,1538826239,NO +1538826240,1538834431,DE +1538834432,1538842623,CY +1538842624,1538850815,RU +1538850816,1538859007,KZ +1538859008,1538875391,RU +1538875392,1538883583,RS +1538883584,1538891775,IR +1538891776,1538897919,GB +1538897920,1538899967,PL +1538899968,1538904031,SI +1538904032,1538904039,BH +1538904040,1538908159,SI +1538908160,1538916351,RU +1538916352,1538924543,GB +1538924544,1538932735,DE +1538932736,1538940927,NO +1538940928,1538949119,RU +1538949120,1538957311,AT +1538957312,1538964991,DE +1538964992,1538965503,GB +1538965504,1538973695,IR +1538973696,1538981887,JO +1538981888,1538990079,BY +1538990080,1538998271,CZ +1538998272,1539006463,AD +1539006464,1539014655,AL +1539014656,1539019775,XK +1539019776,1539020031,RS +1539020032,1539022847,XK +1539022848,1539031039,LT +1539031040,1539039231,IT +1539039232,1539047423,PL +1539047424,1539055615,IT +1539055616,1539063807,LV +1539063808,1539071999,FR +1539072000,1539080191,PL +1539080192,1539088383,UZ +1539088384,1539096575,RU +1539112960,1539115007,PL +1539115008,1539117055,AE +1539117056,1539123199,PL +1539123200,1539125247,SE +1539125248,1539127295,RU +1539127296,1539129343,PL +1539129344,1539131391,IE +1539131392,1539133439,PL +1539133440,1539135487,RU +1539135488,1539136255,GB +1539136256,1539136511,US +1539136512,1539137535,GB +1539137536,1539139583,NL +1539139584,1539141631,FR +1539141632,1539143679,RU +1539143680,1539145727,NO +1539145728,1539147775,UA +1539147776,1539149823,PL +1539149824,1539151871,GB +1539151872,1539153919,UA +1539153920,1539155967,RU +1539155968,1539160063,NO +1539162112,1539164159,DE +1539164160,1539166207,DK +1539168256,1539170303,PL +1539170304,1539172351,NL +1539172352,1539176447,RU +1539176448,1539178495,PL +1539178496,1539186687,CH +1539186688,1539194879,LV +1539194880,1539201023,RU +1539201024,1539203071,IR +1539203072,1539204095,NL +1539204096,1539204096,IN +1539204097,1539205119,US +1539205120,1539206143,NL +1539206144,1539207167,GB +1539207168,1539211263,RU +1539211264,1539213311,CZ +1539213312,1539215359,SE +1539215360,1539219455,DE +1539219456,1539221503,GG +1539221504,1539223551,FR +1539223552,1539225599,RU +1539225600,1539227647,HU +1539227648,1539229695,FI +1539229696,1539231743,DE +1539231744,1539233791,BE +1539233792,1539235839,LU +1539235840,1539237887,DE +1539237888,1539239935,RU +1539239936,1539241983,DE +1539244032,1539260415,BA +1539260416,1539276799,SK +1539276800,1539280895,SE +1539280896,1539282687,FR +1539282688,1539282751,ES +1539282752,1539284543,FR +1539284544,1539284607,ES +1539284608,1539284991,FR +1539284992,1539289087,TR +1539289088,1539290623,RU +1539290624,1539291135,CH +1539291136,1539291391,NL +1539291392,1539291647,CZ +1539291648,1539293183,RU +1539293184,1539297279,AZ +1539297280,1539301375,BG +1539301376,1539309567,RU +1539309568,1539310591,PL +1539312640,1539313663,DE +1539313664,1539314687,GB +1539314688,1539315711,RU +1539316736,1539317759,SE +1539317760,1539318783,CZ +1539318784,1539319807,NL +1539319808,1539320831,DE +1539320832,1539321855,UA +1539321856,1539322879,EG +1539322880,1539323903,DK +1539323904,1539324927,PL +1539324928,1539325951,RU +1539325952,1539326975,KG +1539326976,1539329023,RU +1539329024,1539330047,PL +1539330048,1539330303,RU +1539330304,1539330559,DE +1539330560,1539331071,RU +1539332096,1539333119,PL +1539333120,1539335167,RU +1539335168,1539336191,CH +1539336192,1539336703,UA +1539337216,1539338239,ES +1539338240,1539339263,SE +1539339264,1539340287,NL +1539340288,1539341311,PL +1539341312,1539342335,IT +1539342336,1539345407,UA +1539345408,1539346431,RO +1539346432,1539347455,PL +1539347456,1539348479,RU +1539348480,1539351551,UA +1539351552,1539352575,PL +1539352576,1539354623,RU +1539355648,1539357695,UA +1539357696,1539358719,RU +1539358720,1539359743,GB +1539359744,1539360767,PL +1539360768,1539361279,UA +1539361280,1539361791,DE +1539361792,1539362815,PL +1539362816,1539363839,GB +1539363840,1539364863,DK +1539364864,1539365887,UA +1539365888,1539366911,NO +1539366912,1539368959,PL +1539368960,1539369983,GB +1539369984,1539371007,BG +1539371008,1539373055,RU +1539373056,1539374079,PL +1539374080,1539375103,SE +1539375104,1539376127,NO +1539377152,1539378175,UA +1539378176,1539379199,PL +1539380224,1539381247,CH +1539381248,1539382271,RS +1539382272,1539383295,RO +1539383296,1539384319,UA +1539384320,1539385343,RU +1539385344,1539385855,PL +1539385856,1539386367,BE +1539386368,1539387391,IT +1539387392,1539388415,IL +1539388416,1539389439,PL +1539389440,1539389951,FR +1539389952,1539390463,RU +1539391488,1539392511,LV +1539392512,1539393535,UA +1539393536,1539393791,DE +1539393792,1539394047,PL +1539394048,1539394303,GI +1539394304,1539394559,RS +1539394560,1539396607,UA +1539396608,1539397631,PL +1539397632,1539398143,RU +1539398144,1539398655,PL +1539398656,1539399679,ES +1539399680,1539400703,PL +1539401728,1539402239,GB +1539402240,1539402751,FR +1539402752,1539403263,GB +1539403264,1539403775,RU +1539405824,1539406847,PL +1539406848,1539408895,UA +1539408896,1539409919,CZ +1539409920,1539410943,DK +1539410944,1539411967,RU +1539411968,1539412991,PL +1539412992,1539414015,RU +1539415040,1539416063,BG +1539416064,1539417087,PL +1539417088,1539418111,UA +1539418112,1539419135,RU +1539419136,1539420159,UA +1539420160,1539421183,RU +1539422208,1539423231,PL +1539423232,1539424255,IE +1539425280,1539426303,PL +1539426304,1539427327,BG +1539427328,1539428351,UA +1539428352,1539429375,PL +1539429376,1539434495,RU +1539434496,1539435519,GB +1539435520,1539437567,RU +1539437568,1539438591,GB +1539439616,1539440639,UA +1539441152,1539441663,RU +1539441664,1539442175,IL +1539442176,1539442687,DE +1539442688,1539443199,NL +1539443200,1539444223,RU +1539444736,1539445247,RU +1539445248,1539445759,PL +1539445760,1539446271,FI +1539446272,1539446783,SE +1539447296,1539447807,SE +1539447808,1539448831,RO +1539448832,1539449343,AT +1539449344,1539449855,UA +1539449856,1539450367,DK +1539450368,1539450879,SE +1539450880,1539451391,UA +1539451392,1539451903,GB +1539451904,1539452415,RO +1539452416,1539452927,GB +1539452928,1539453439,CH +1539453440,1539453951,UA +1539454976,1539455487,UA +1539455488,1539455999,RU +1539456000,1539456511,FR +1539456512,1539457023,ES +1539457024,1539457535,RU +1539457536,1539458047,SE +1539458048,1539459071,GB +1539459072,1539459583,UA +1539459584,1539460607,GB +1539460608,1539461631,UA +1539461632,1539462143,RS +1539462144,1539462655,DE +1539462656,1539463167,BE +1539463168,1539463679,UA +1539463680,1539464191,DE +1539464192,1539464703,RO +1539464704,1539465215,DK +1539465216,1539466751,FR +1539466752,1539467263,KW +1539467776,1539468287,PL +1539468288,1539468799,DE +1539468800,1539469823,RU +1539469824,1539470335,IL +1539470336,1539470847,GB +1539471360,1539471871,RU +1539471872,1539472383,PL +1539472896,1539473407,GB +1539473408,1539473919,FR +1539473920,1539474431,KW +1539474432,1539474943,DE +1539474944,1539475455,UA +1539475456,1539475967,NL +1539475968,1539476479,PL +1539476992,1539477503,IT +1539477504,1539478015,PL +1539478016,1539478527,CH +1539478528,1539479039,RO +1539479040,1539480063,GB +1539480064,1539480575,DK +1539480576,1539481087,PL +1539481088,1539481599,GB +1539481600,1539482111,RU +1539482112,1539482623,UA +1539482624,1539483135,RU +1539483648,1539484159,UA +1539484672,1539485695,RU +1539485696,1539485951,LV +1539485952,1539486207,RO +1539486208,1539486719,FR +1539486720,1539487231,DE +1539487744,1539488255,RU +1539488256,1539488767,SE +1539488768,1539489279,PL +1539489280,1539489791,RU +1539490816,1539491327,CH +1539491328,1539491839,PL +1539491840,1539492351,RU +1539492352,1539492863,BE +1539492864,1539493375,NL +1539493376,1539493887,RU +1539493888,1539494399,FR +1539494400,1539494911,PL +1539494912,1539495423,RU +1539495936,1539496447,RS +1539496448,1539496959,NL +1539496960,1539497471,GB +1539497472,1539497983,DE +1539497984,1539498495,NL +1539498496,1539499007,RU +1539499008,1539499519,PL +1539499520,1539500543,DE +1539500544,1539501055,RO +1539501056,1539501567,BE +1539501568,1539502079,UA +1539502592,1539503103,HR +1539503104,1539504127,RU +1539504128,1539504639,AT +1539504640,1539505151,UA +1539505152,1539505663,RU +1539505664,1539506175,AT +1539506176,1539506687,NL +1539506688,1539507199,UA +1539507200,1539508223,RO +1539508224,1539508735,NO +1539508736,1539509247,UA +1539509248,1539509759,PL +1539509760,1539510271,RO +1539510272,1539510783,RU +1539510784,1539511295,LU +1539511296,1539511807,UA +1539511808,1539512319,RU +1539512320,1539512831,BG +1539512832,1539513343,PL +1539513344,1539513855,RO +1539513856,1539514367,RU +1539514368,1539514879,SE +1539514880,1539515391,ES +1539515392,1539515903,FR +1539515904,1539516415,RS +1539516416,1539516927,AT +1539516928,1539517439,PL +1539517440,1539517951,RO +1539517952,1539518463,PL +1539518464,1539518975,DE +1539519488,1539519999,UA +1539520000,1539520511,DE +1539520512,1539521023,PL +1539521024,1539521535,DK +1539521536,1539522047,RU +1539522048,1539522559,RO +1539523584,1539524095,UA +1539524096,1539524607,GB +1539524608,1539525119,FR +1539525120,1539525631,UA +1539525632,1539526143,SE +1539526144,1539526655,DE +1539526656,1539527167,NL +1539527168,1539527679,GB +1539527680,1539528191,RO +1539528192,1539528703,RU +1539528704,1539529215,SA +1539529216,1539529727,UA +1539529728,1539530239,PL +1539530240,1539530751,AT +1539530752,1539531263,UA +1539531264,1539531775,RO +1539531776,1539532543,RU +1539532544,1539532799,CZ +1539532800,1539533311,DE +1539533312,1539533823,CZ +1539533824,1539534335,PL +1539534336,1539534847,RU +1539534848,1539535359,GB +1539535360,1539535871,RU +1539535872,1539536383,AT +1539536384,1539536895,NL +1539536896,1539537407,UA +1539537408,1539537919,GB +1539537920,1539540479,RU +1539540480,1539540991,PL +1539540992,1539541503,RU +1539541504,1539542015,TR +1539542016,1539542527,DE +1539542528,1539543039,CH +1539543040,1539543551,RO +1539543552,1539544063,SI +1539544064,1539544575,RU +1539544576,1539545087,DE +1539545088,1539545599,GR +1539545600,1539546111,SE +1539546112,1539546623,UA +1539546624,1539547135,PL +1539547136,1539547647,NL +1539547648,1539548159,IL +1539548160,1539548671,FR +1539549184,1539549695,GB +1539549696,1539550207,RU +1539550208,1539550719,UA +1539551232,1539551743,RS +1539551744,1539552255,RU +1539552256,1539552767,RO +1539552768,1539553279,GB +1539553280,1539553791,UA +1539553792,1539554303,GB +1539554304,1539554815,CH +1539554816,1539555327,PL +1539555328,1539555839,GB +1539555840,1539556863,RO +1539556864,1539557375,AT +1539557376,1539557887,NL +1539557888,1539558399,CZ +1539558400,1539558911,RU +1539558912,1539559423,FR +1539559424,1539560447,RU +1539560960,1539561471,UA +1539561472,1539561983,RO +1539561984,1539563007,DE +1539563520,1539564031,SE +1539564032,1539564543,KZ +1539564544,1539565055,GB +1539565056,1539565567,UA +1539565568,1539566079,PL +1539566080,1539567103,NL +1539567104,1539567615,CH +1539567616,1539568127,DE +1539568128,1539568639,NL +1539568640,1539569151,UA +1539569152,1539569663,EE +1539569664,1539570175,UA +1539570176,1539570687,PL +1539570688,1539571199,RU +1539571712,1539572735,UA +1539572736,1539573759,RU +1539573760,1539575807,PL +1539576832,1539577855,GB +1539579904,1539580927,RU +1539580928,1539581951,AM +1539582976,1539583999,RO +1539584000,1539585023,PL +1539585024,1539586047,UA +1539586048,1539587071,PL +1539587072,1539588095,UA +1539590144,1539591167,RU +1539591168,1539592191,UZ +1539592192,1539593215,UA +1539593216,1539594239,RU +1539594240,1539598335,UA +1539598336,1539599359,NL +1539599360,1539600383,PL +1539600384,1539601407,HU +1539601408,1539602431,GB +1539602432,1539603455,UA +1539603456,1539604479,BG +1539604480,1539605503,ES +1539605504,1539606527,DE +1539606528,1539607551,GB +1539607552,1539609599,DE +1539609600,1539610623,UA +1539610624,1539611647,RU +1539611648,1539614719,UA +1539614720,1539615743,NL +1539615744,1539616767,DK +1539616768,1539617791,UA +1539618816,1539619839,GB +1539619840,1539620863,RU +1539620864,1539622911,UA +1539623936,1539624959,DE +1539625984,1539627007,PL +1539629056,1539630079,BG +1539630080,1539631103,UA +1539632128,1539633151,RU +1539633152,1539634175,SE +1539634176,1539637247,RU +1539638272,1539639295,UA +1539639296,1539640319,RU +1539640320,1539641343,PL +1539641344,1539642367,UA +1539642368,1539643391,RU +1539643392,1539644415,UA +1539644416,1539645439,DE +1539645440,1539646463,GB +1539648512,1539649023,CY +1539649024,1539649535,LB +1539649536,1539650559,UA +1539650560,1539651583,RU +1539651584,1539651839,UA +1539651840,1539652095,RU +1539652096,1539652607,UA +1539652608,1539653631,IL +1539653632,1539654655,RU +1539655680,1539656703,NL +1539656704,1539657727,RU +1539657728,1539658751,UA +1539658752,1539659775,FI +1539659776,1539660799,PL +1539660800,1539661823,GB +1539661824,1539662847,RU +1539662848,1539663871,IL +1539663872,1539664895,RU +1539664896,1539665919,BE +1539665920,1539666943,RU +1539666944,1539667967,CZ +1539668992,1539670015,RU +1539670016,1539672063,UA +1539672064,1539673087,FR +1539673088,1539674111,GB +1539674112,1539675135,UA +1539675136,1539677183,PL +1539677184,1539679231,RU +1539679232,1539680255,FR +1539680256,1539681279,UA +1539681280,1539684351,RU +1539684352,1539685375,UA +1539685376,1539690495,RU +1539690496,1539691519,FI +1539691520,1539692543,RU +1539692544,1539694591,UA +1539694592,1539695615,PL +1539695616,1539696639,GB +1539696640,1539697663,CZ +1539697664,1539698687,UA +1539699712,1539700735,RO +1539700736,1539701759,DK +1539701760,1539702783,UA +1539702784,1539703039,SI +1539703040,1539703295,UA +1539703296,1539703551,DE +1539703552,1539703807,GB +1539703808,1539704063,UA +1539704064,1539704319,IL +1539704320,1539704575,CH +1539704576,1539704831,HU +1539704832,1539705087,CH +1539705088,1539705343,GB +1539705344,1539705599,UA +1539705600,1539706111,CH +1539706112,1539706367,GB +1539706368,1539706623,RU +1539706624,1539707135,PL +1539707136,1539707391,LT +1539707392,1539707647,GB +1539707648,1539707903,AE +1539707904,1539708159,PL +1539708160,1539708415,DE +1539708416,1539708671,GB +1539708672,1539708927,RO +1539708928,1539709183,IE +1539709184,1539709439,AT +1539709440,1539709695,BE +1539709696,1539709951,NL +1539710208,1539710463,GB +1539710464,1539710719,FR +1539710720,1539710975,UA +1539710976,1539711231,DE +1539711232,1539711487,RU +1539711488,1539711743,UA +1539711744,1539711999,DE +1539712000,1539712255,UA +1539712512,1539713023,RU +1539713024,1539713279,UA +1539713536,1539713791,DK +1539713792,1539714047,DE +1539714048,1539714303,FR +1539714304,1539714559,AT +1539714560,1539714815,RU +1539714816,1539715071,PT +1539715328,1539715583,TR +1539715584,1539715839,UA +1539715840,1539716095,RU +1539716096,1539716351,SI +1539716352,1539716607,PL +1539716608,1539716863,RU +1539716864,1539717375,PL +1539717376,1539717631,DE +1539717632,1539717887,CH +1539717888,1539718143,MK +1539718144,1539718399,DE +1539718400,1539718655,TR +1539718656,1539718911,SA +1539718912,1539719167,KZ +1539719168,1539719423,IE +1539719424,1539719679,PL +1539719680,1539720191,DE +1539720192,1539720703,RU +1539720704,1539720959,IL +1539720960,1539721215,RU +1539721216,1539721727,CH +1539721728,1539721983,PL +1539721984,1539722239,RU +1539722240,1539722495,PL +1539722752,1539723007,DE +1539723008,1539723263,CH +1539723264,1539723519,PL +1539723520,1539723775,GB +1539723776,1539724031,DE +1539724032,1539724287,UA +1539724288,1539724543,IT +1539724544,1539724799,RU +1539724800,1539725055,DE +1539725056,1539725311,NL +1539725312,1539725567,FR +1539725568,1539725823,PL +1539725824,1539726079,PT +1539726080,1539726335,LV +1539726336,1539726591,SE +1539726592,1539726847,AT +1539726848,1539727103,PL +1539727104,1539727359,SE +1539727360,1539727615,SI +1539727616,1539727871,PL +1539727872,1539728127,RU +1539728128,1539728383,GB +1539728384,1539728639,PL +1539728640,1539728895,UA +1539728896,1539729151,SA +1539729152,1539729407,NL +1539729408,1539729663,RU +1539729664,1539729919,FR +1539729920,1539730175,NL +1539730176,1539730431,GB +1539730944,1539731455,PL +1539731456,1539731711,SI +1539731712,1539732223,DE +1539732480,1539732735,UA +1539732736,1539732991,DK +1539732992,1539733247,PL +1539733248,1539733503,BG +1539733504,1539733759,FI +1539733760,1539734015,PL +1539734016,1539734271,FR +1539734528,1539734783,TR +1539734784,1539735039,FR +1539735040,1539735295,BE +1539735296,1539735551,RU +1539735552,1539735807,AT +1539735808,1539736063,IL +1539736064,1539736319,RU +1539736320,1539736575,HU +1539736576,1539736831,BG +1539736832,1539737087,UA +1539737088,1539737343,KW +1539737344,1539737599,SE +1539737600,1539737855,RO +1539737856,1539738111,DE +1539738112,1539738367,DK +1539738368,1539738623,DE +1539738624,1539738879,UA +1539739136,1539739391,AT +1539739392,1539739647,UA +1539739648,1539739903,DK +1539739904,1539740415,PL +1539740672,1539740927,AT +1539740928,1539741183,RU +1539741184,1539741439,PL +1539741440,1539741695,NL +1539741696,1539741951,DE +1539741952,1539742207,UA +1539742208,1539742463,CH +1539742464,1539742719,RU +1539742720,1539742975,LV +1539742976,1539743231,DE +1539743488,1539743743,FR +1539743744,1539743999,RO +1539744000,1539744255,PL +1539744256,1539744511,RO +1539744512,1539744767,DE +1539744768,1539745023,SE +1539745024,1539745279,GB +1539745280,1539745535,GI +1539745792,1539746303,DK +1539747072,1539747327,CH +1539747328,1539747583,NL +1539747584,1539747839,UA +1539747840,1539748095,NO +1539748096,1539748351,PL +1539748352,1539748607,NL +1539748608,1539748863,PL +1539748864,1539749119,GB +1539749120,1539749375,BG +1539749376,1539749631,PT +1539749632,1539749887,GR +1539749888,1539750143,RU +1539750400,1539750655,PL +1539750656,1539750911,DE +1539750912,1539751167,UA +1539751168,1539751423,DE +1539751424,1539751679,SI +1539751680,1539751935,FR +1539752192,1539752447,SE +1539752448,1539752703,PL +1539752704,1539752959,AT +1539753216,1539753471,DE +1539753472,1539753727,HU +1539753728,1539754239,FR +1539754240,1539754495,NO +1539754496,1539754751,SE +1539754752,1539755007,BE +1539755008,1539755263,DK +1539755264,1539755519,IL +1539755520,1539755775,EE +1539755776,1539756031,MT +1539756288,1539756543,PL +1539756800,1539757055,BE +1539757056,1539757567,RU +1539757568,1539757823,SI +1539758080,1539758335,HR +1539758336,1539758591,PL +1539758848,1539759103,BA +1539759360,1539759615,RU +1539759616,1539759871,PL +1539759872,1539760127,SE +1539760128,1539760383,DE +1539760384,1539760639,RU +1539760640,1539760895,PL +1539760896,1539761151,DK +1539761152,1539761407,DE +1539761408,1539761663,CH +1539761920,1539762175,RU +1539762176,1539762431,PL +1539762432,1539762687,UA +1539762688,1539762943,NL +1539762944,1539763199,UA +1539763200,1539763455,MD +1539763456,1539763711,DK +1539763712,1539763967,DE +1539763968,1539764223,PT +1539764224,1539764479,AT +1539764480,1539764735,GB +1539764736,1539764991,RO +1539764992,1539765247,BE +1539765248,1539765503,GB +1539765504,1539766015,PL +1539766016,1539766271,UA +1539766272,1539766527,PL +1539766528,1539766783,UA +1539766784,1539767039,DE +1539767040,1539767295,SA +1539767296,1539767551,DK +1539767552,1539767807,DE +1539768064,1539768319,GB +1539768320,1539768575,FR +1539768576,1539768831,GB +1539768832,1539769087,IT +1539769088,1539769343,BE +1539769344,1539769599,RU +1539769600,1539769855,AT +1539769856,1539770111,FR +1539770112,1539770367,GR +1539770368,1539770623,DE +1539770880,1539771135,RU +1539771136,1539771391,FR +1539771392,1539771647,PL +1539771648,1539771903,UA +1539771904,1539772159,RU +1539772160,1539772415,BE +1539772416,1539772671,RU +1539772672,1539772927,RS +1539773184,1539773439,GB +1539773440,1539773695,KZ +1539773696,1539773951,DE +1539773952,1539774207,PL +1539774208,1539774463,SI +1539774464,1539774719,GB +1539774720,1539774975,PL +1539774976,1539775231,RU +1539775488,1539775743,UA +1539775744,1539775999,NL +1539776256,1539776511,SK +1539776768,1539777023,UA +1539777024,1539777279,RU +1539777280,1539777535,UA +1539777536,1539777791,BG +1539777792,1539778047,UA +1539778048,1539778303,AM +1539778304,1539778559,LB +1539778560,1539778815,RU +1539778816,1539779071,RO +1539779328,1539779583,FR +1539779840,1539780095,NL +1539780096,1539780351,RU +1539780608,1539780863,PL +1539780864,1539781375,RO +1539781376,1539781631,PL +1539781632,1539781887,HU +1539781888,1539782143,IL +1539782144,1539782399,UA +1539782400,1539782655,LT +1539782656,1539782911,GI +1539782912,1539783167,PL +1539783168,1539783679,NL +1539783680,1539783935,DE +1539783936,1539784191,SI +1539784192,1539784447,RU +1539784448,1539784703,NO +1539784704,1539784959,SE +1539784960,1539785215,DE +1539785216,1539785471,CH +1539785472,1539785727,RU +1539785728,1539785983,SE +1539785984,1539786239,IL +1539786240,1539786495,AT +1539786496,1539786751,GB +1539786752,1539787007,HU +1539787008,1539787263,TR +1539787264,1539787519,IE +1539787520,1539787775,DE +1539787776,1539788031,CH +1539788032,1539788287,HR +1539788288,1539788543,GB +1539788544,1539788799,HR +1539788800,1539789055,RU +1539789568,1539789823,DE +1539790080,1539790335,CH +1539790336,1539790591,LV +1539790848,1539791103,DE +1539791104,1539791359,PL +1539791616,1539792383,UA +1539792384,1539792639,IL +1539792640,1539792895,PL +1539792896,1539793151,GR +1539793152,1539793407,PL +1539793408,1539793663,CH +1539793664,1539794175,IL +1539794176,1539794431,PL +1539794688,1539794943,FR +1539794944,1539795199,RO +1539795200,1539795455,PL +1539795456,1539795711,UA +1539795712,1539795967,SA +1539796224,1539796479,MC +1539796480,1539796735,GB +1539796736,1539796991,TR +1539796992,1539797247,UA +1539797248,1539797503,DK +1539797504,1539797759,RU +1539797760,1539798015,UA +1539798016,1539798271,HU +1539798272,1539798527,PL +1539798528,1539798783,GB +1539798784,1539799039,IL +1539799040,1539799295,ES +1539799296,1539799551,DK +1539799552,1539799807,ES +1539800064,1539800319,SI +1539800320,1539800575,GB +1539800576,1539800831,LV +1539800832,1539801087,PL +1539801088,1539801343,BG +1539801344,1539801855,GB +1539801856,1539802111,SI +1539802112,1539802367,PL +1539802368,1539802623,RO +1539802624,1539802879,IS +1539802880,1539803135,NL +1539803136,1539803391,GB +1539803648,1539804159,UA +1539804160,1539804671,PL +1539804672,1539804927,SI +1539804928,1539805183,RU +1539805184,1539805439,UA +1539805440,1539805695,AT +1539805696,1539805951,CH +1539806208,1539806463,FI +1539806464,1539806719,RU +1539806720,1539806975,BG +1539806976,1539807231,GB +1539807232,1539807487,FR +1539807488,1539807743,RU +1539807744,1539807999,GB +1539808000,1539808255,HU +1539808256,1539808511,RU +1539808512,1539808767,GB +1539808768,1539809023,DE +1539809024,1539809279,GB +1539809536,1539809791,SI +1539809792,1539810047,DE +1539810304,1539810559,CZ +1539810560,1539810815,DE +1539810816,1539811071,TR +1539811072,1539811327,NL +1539811584,1539811839,DE +1539811840,1539812095,IT +1539812096,1539812351,RU +1539812608,1539812863,IT +1539812864,1539813119,RU +1539813120,1539813375,AT +1539813376,1539813631,PL +1539813632,1539813887,NL +1539813888,1539814143,RU +1539814400,1539815423,GB +1539815936,1539816191,CH +1539816192,1539816447,SA +1539816448,1539816703,UA +1539816704,1539816959,RU +1539816960,1539817215,DK +1539817216,1539817471,TR +1539817472,1539817727,DE +1539817984,1539818239,UA +1539818240,1539818495,NO +1539818496,1539819007,RU +1539819008,1539819263,CH +1539819264,1539819519,RO +1539819520,1539819775,AT +1539819776,1539820031,SI +1539820032,1539820287,VG +1539820288,1539820543,PL +1539820544,1539820799,ES +1539820800,1539821055,RU +1539821056,1539821311,UA +1539821312,1539821567,CZ +1539821568,1539821823,DK +1539822080,1539822335,RO +1539822592,1539822847,GB +1539822848,1539823103,IE +1539823104,1539823359,DE +1539823360,1539823615,NL +1539823616,1539823871,RO +1539823872,1539824127,DK +1539824128,1539824383,CH +1539824384,1539824639,NL +1539824640,1539824895,HU +1539824896,1539825151,RU +1539825152,1539825407,UA +1539825408,1539825919,RU +1539825920,1539826175,DE +1539826176,1539826431,AM +1539826432,1539826687,NL +1539826688,1539826943,CH +1539826944,1539827199,RU +1539827200,1539827455,ES +1539827456,1539827711,MK +1539827712,1539827967,RU +1539827968,1539828479,FR +1539828480,1539828735,SI +1539828736,1539828991,NL +1539828992,1539829247,BG +1539829248,1539829503,SE +1539829504,1539829759,DE +1539829760,1539830015,PL +1539830016,1539830271,DE +1539830272,1539830527,FR +1539830528,1539830783,RO +1539830784,1539831039,RU +1539831040,1539831295,UA +1539831296,1539831551,PL +1539831552,1539831807,DE +1539832064,1539832319,GB +1539832320,1539832575,PL +1539832576,1539832831,RU +1539832832,1539833087,GB +1539833088,1539833343,RU +1539833344,1539833855,FR +1539833856,1539837951,UA +1539837952,1539838975,NL +1539838976,1539839999,GR +1539840000,1539841023,PL +1539841024,1539842047,RU +1539842048,1539844095,PL +1539844096,1539846143,UA +1539846144,1539847167,NL +1539847168,1539849471,UA +1539849472,1539849727,GB +1539849728,1539850239,RU +1539850240,1539851263,LV +1539851264,1539852287,PL +1539852288,1539853311,UA +1539853312,1539854335,PL +1539854336,1539855103,UA +1539855104,1539855231,US +1539855232,1539855359,UA +1539855360,1539856383,RU +1539857408,1539858431,PL +1539858432,1539859455,RO +1539860480,1539861503,PL +1539861504,1539862527,DE +1539862528,1539863551,UA +1539863552,1539864575,ES +1539864576,1539865599,RO +1539865600,1539866623,UA +1539866624,1539867647,IT +1539867648,1539868671,RO +1539868672,1539869695,RU +1539869696,1539870719,ES +1539870720,1539871743,IL +1539872768,1539873791,SE +1539873792,1539875839,UA +1539875840,1539876863,RU +1539876864,1539877887,ES +1539877888,1539878911,PL +1539879936,1539880959,UA +1539880960,1539881983,PL +1539883008,1539884031,RS +1539884032,1539885055,MT +1539885056,1539886079,UA +1539886080,1539887103,FR +1539887104,1539888127,IT +1539888128,1539889151,UA +1539889152,1539890175,RU +1539890176,1539891199,UA +1539891200,1539893247,RU +1539893248,1539894271,UA +1539894272,1539895295,PL +1539897344,1539898367,UA +1539899392,1539900415,RU +1539901440,1539902463,RU +1539902464,1539903487,LV +1539903488,1539904511,PL +1539904512,1539905535,CZ +1539905536,1539905791,RU +1539905792,1539906047,UA +1539906048,1539906559,RU +1539908608,1539909631,UA +1539909632,1539910655,RU +1539910656,1539911679,PL +1539911680,1539913727,RU +1539913728,1539914751,CH +1539914752,1539915775,SE +1539916800,1539917823,UA +1539917824,1539918847,RU +1539918848,1539920895,RO +1539920896,1539921919,UA +1539921920,1539922943,PL +1539922944,1539923967,SE +1539924992,1539926015,DE +1539927040,1539928063,UA +1539928064,1539930111,RU +1539930112,1539931135,PL +1539932160,1539933183,DE +1539933184,1539934207,ES +1539934208,1539935231,RS +1539936256,1539937279,UA +1539937280,1539938303,CH +1539938304,1539939327,PL +1539939328,1539940351,UA +1539940352,1539941375,GB +1539941376,1539942399,NL +1539942400,1539943423,UA +1539943424,1539944447,BG +1539944448,1539946495,UA +1539946496,1539947519,RU +1539947520,1539948543,UA +1539948544,1539949567,RO +1539950592,1539950847,GB +1539950848,1539951103,RU +1539951104,1539951615,UA +1539951616,1539953663,RU +1539953664,1539954175,CH +1539954176,1539955711,KZ +1539955712,1539956735,RO +1539956736,1539957759,UA +1539957760,1539958783,RU +1539958784,1539959807,UA +1539959808,1539960831,RU +1539960832,1539962879,UA +1539962880,1539964927,RU +1539964928,1539965951,UA +1539965952,1539966975,RU +1539966976,1539967999,UA +1539968000,1539973119,RU +1539974144,1539975167,RU +1539975168,1539976191,DE +1539976192,1539977215,RU +1539977216,1539978239,DE +1539978240,1539979263,CZ +1539979264,1539980287,UA +1539980288,1539981311,VG +1539981312,1539982335,SI +1539982336,1539983359,RU +1539983360,1539984383,UA +1539984384,1539985407,RU +1539985408,1539986431,NO +1539986432,1539987455,RU +1539987456,1539988479,RO +1539988480,1539990527,RU +1539990528,1539991551,PL +1539991552,1539993599,UA +1539993600,1539994623,FI +1539994624,1539995647,AT +1539995648,1539996671,CH +1539996672,1539997695,PL +1539997696,1539999743,UA +1539999744,1540000767,GB +1540000768,1540001791,RU +1540001792,1540002815,UA +1540002816,1540003839,RU +1540003840,1540004863,PL +1540004864,1540005887,SE +1540005888,1540006911,UA +1540006912,1540007935,RU +1540007936,1540008959,IL +1540008960,1540011007,PL +1540011008,1540014079,RU +1540014080,1540015103,PL +1540015104,1540016127,RU +1540016128,1540016135,DE +1540016136,1540016383,BE +1540016384,1540016639,IE +1540016640,1540016895,RO +1540016896,1540017151,PT +1540017152,1540018175,RU +1540018176,1540020223,UA +1540020224,1540022271,RU +1540022272,1540023295,GB +1540023296,1540024319,PL +1540024320,1540025343,RU +1540025344,1540026367,GB +1540026368,1540027391,UA +1540029440,1540031487,RU +1540031488,1540032511,UA +1540032512,1540033535,RU +1540033536,1540034559,UA +1540034560,1540035583,PL +1540035584,1540036607,KZ +1540036608,1540037631,UA +1540037632,1540038655,EE +1540038656,1540039679,FR +1540039680,1540040703,RU +1540040704,1540041727,SE +1540041728,1540042751,RU +1540042752,1540043775,UA +1540043776,1540044799,PL +1540044800,1540045823,GB +1540045824,1540046847,UA +1540046848,1540047871,RU +1540047872,1540048895,LV +1540048896,1540049919,GB +1540050944,1540052991,RU +1540052992,1540054015,UA +1540055040,1540056063,NO +1540057088,1540057343,PL +1540057344,1540057599,RU +1540057600,1540057855,US +1540057856,1540058111,UA +1540058112,1540059135,DE +1540059136,1540060159,UA +1540060160,1540061183,NO +1540062208,1540063231,RU +1540063232,1540064255,DE +1540064256,1540065279,PL +1540065280,1540068351,UA +1540068352,1540069375,FR +1540069376,1540070399,RU +1540070400,1540071423,PL +1540071424,1540072447,SE +1540072448,1540073471,UA +1540073472,1540074495,RU +1540074496,1540075519,UZ +1540075520,1540077567,RU +1540077568,1540078591,FR +1540078592,1540081663,RU +1540081664,1540082687,DE +1540082688,1540083711,NO +1540083712,1540084735,RU +1540084736,1540085759,NL +1540085760,1540087807,PL +1540087808,1540088575,RU +1540088576,1540088831,KZ +1540088832,1540092927,RU +1540092928,1540094975,PL +1540094976,1540095999,RU +1540096000,1540097023,SE +1540097024,1540099071,DE +1540099072,1540099327,UA +1540099328,1540099583,BY +1540099584,1540099711,US +1540099712,1540099839,DE +1540099840,1540103167,RU +1540103168,1540105215,DE +1540105216,1540106239,UA +1540110336,1540111359,RU +1540111360,1540112383,UA +1540112384,1540113407,LV +1540113408,1540115455,RU +1540115456,1540116479,UA +1540116480,1540117503,CH +1540117504,1540118527,UA +1540118528,1540119551,PL +1540119552,1540120575,UA +1540120576,1540124671,RU +1540124672,1540125695,UA +1540125696,1540126719,FR +1540126720,1540127743,UA +1540128768,1540129791,RU +1540129792,1540130815,UA +1540130816,1540131839,RU +1540131840,1540132863,PL +1540132864,1540134911,RU +1540134912,1540135935,PL +1540135936,1540136959,BG +1540136960,1540137983,PL +1540137984,1540139007,RU +1540139008,1540140031,DE +1540140032,1540141055,GB +1540141056,1540142079,RU +1540142080,1540143103,UA +1540143104,1540144127,RU +1540144128,1540145151,AM +1540145152,1540146175,AT +1540146176,1540147199,UA +1540147200,1540148223,RU +1540148224,1540149247,PL +1540149248,1540150271,GB +1540150272,1540151295,UA +1540151296,1540152319,AT +1540154368,1540156415,RU +1540156416,1540157439,UZ +1540157440,1540159487,RU +1540160512,1540162559,RU +1540162560,1540163583,UA +1540163584,1540164607,RU +1540164608,1540165631,DE +1540165632,1540166655,UA +1540166656,1540167679,PL +1540167680,1540168703,RU +1540168704,1540169727,DE +1540169728,1540170751,NL +1540170752,1540171775,DE +1540171776,1540172799,GB +1540172800,1540173823,RU +1540173824,1540174847,KG +1540174848,1540175871,RU +1540175872,1540176895,DE +1540176896,1540177919,SE +1540177920,1540178943,UA +1540178944,1540179967,BA +1540179968,1540180991,PL +1540180992,1540182015,DE +1540182016,1540183039,IT +1540183040,1540184063,RU +1540184064,1540185087,PL +1540186112,1540187135,NL +1540187136,1540188159,US +1540190208,1540191231,PT +1540191232,1540192255,FR +1540192256,1540195327,RU +1540195328,1540198399,AM +1540198400,1540199423,RU +1540199424,1540200447,CH +1540200448,1540201471,IL +1540201472,1540202495,UA +1540202496,1540203519,RU +1540203520,1540204543,UA +1540204544,1540205567,RU +1540205568,1540206591,DE +1540206592,1540208639,RU +1540208640,1540209663,NO +1540210688,1540211455,NL +1540211456,1540211711,CZ +1540212736,1540213759,RU +1540213760,1540214783,UA +1540214784,1540215807,RU +1540215808,1540216831,NL +1540216832,1540217855,UA +1540217856,1540218879,GB +1540218880,1540219903,RU +1540219904,1540220927,PL +1540220928,1540220991,US +1540220992,1540221439,NL +1540221440,1540221567,US +1540221568,1540221951,NL +1540221952,1540223999,RU +1540224000,1540225023,PL +1540225024,1540226047,GB +1540226048,1540227071,RU +1540227072,1540227583,GB +1540227584,1540228095,RU +1540228096,1540228607,UA +1540228608,1540229119,PL +1540229120,1540229631,AT +1540229632,1540230143,NL +1540230144,1540232191,RU +1540232192,1540232703,LU +1540232704,1540233215,RU +1540233216,1540233727,CH +1540233728,1540234239,PL +1540234240,1540234751,DE +1540234752,1540235775,UA +1540235776,1540236287,NO +1540236288,1540236799,RO +1540236800,1540237311,PL +1540237312,1540238847,RO +1540238848,1540239359,DE +1540239360,1540239871,UA +1540239872,1540240383,FR +1540240384,1540240895,CH +1540240896,1540242431,RU +1540242432,1540242943,DE +1540242944,1540243455,RU +1540243968,1540244479,RU +1540244992,1540245503,DE +1540245504,1540246015,RU +1540246016,1540246527,IT +1540246528,1540247551,RO +1540247552,1540248063,NL +1540248064,1540248575,RO +1540248576,1540249087,GB +1540249088,1540249599,PL +1540249600,1540250111,KZ +1540250112,1540250367,PL +1540250368,1540250623,CZ +1540251136,1540251647,GB +1540251648,1540252159,PL +1540252160,1540252671,DE +1540252672,1540253183,RU +1540253184,1540253695,AT +1540253696,1540254207,CH +1540254208,1540254719,RU +1540254720,1540255231,PL +1540255232,1540255743,UA +1540255744,1540256255,AT +1540256256,1540256767,PL +1540256768,1540257279,RU +1540257280,1540257791,GB +1540257792,1540258303,RU +1540258304,1540258815,IR +1540258816,1540259327,UA +1540259328,1540259839,RU +1540259840,1540260351,IT +1540260352,1540260863,RU +1540260864,1540261375,LT +1540261376,1540261887,SA +1540261888,1540262399,NL +1540262400,1540262911,BG +1540263424,1540263935,DE +1540263936,1540264447,GB +1540264448,1540265983,RU +1540265984,1540266495,DE +1540266496,1540267007,PL +1540267008,1540267519,FR +1540267520,1540268543,RO +1540268544,1540269055,RU +1540269056,1540269567,DK +1540269568,1540270079,UA +1540270080,1540270591,GB +1540270592,1540271103,IL +1540271104,1540271615,PL +1540271616,1540272127,SE +1540272128,1540272639,GB +1540272640,1540273663,PL +1540273664,1540274175,GB +1540274176,1540274687,DE +1540274688,1540275199,UA +1540275200,1540275711,DE +1540275712,1540276223,GR +1540276224,1540276735,AT +1540276736,1540277247,RO +1540277248,1540277759,RU +1540277760,1540278271,FR +1540278272,1540278783,UA +1540278784,1540279807,RU +1540279808,1540280319,RO +1540280320,1540280831,MD +1540280832,1540281343,PL +1540281344,1540281855,UA +1540281856,1540282367,DE +1540282368,1540282879,RU +1540282880,1540283391,UA +1540283392,1540284415,RU +1540284416,1540284927,AT +1540284928,1540285439,UA +1540285440,1540285951,DE +1540285952,1540286463,RU +1540286464,1540286975,NL +1540286976,1540287487,GB +1540287488,1540288511,AT +1540288512,1540289535,RU +1540289536,1540290047,PL +1540290048,1540290559,NL +1540290560,1540291071,RU +1540291072,1540291583,BE +1540291584,1540292095,UA +1540292096,1540292607,RU +1540293120,1540293631,DK +1540293632,1540296703,PL +1540296704,1540297215,DE +1540297216,1540298239,FR +1540298240,1540298751,HR +1540298752,1540299263,RU +1540299264,1540299775,UA +1540299776,1540300287,KG +1540300288,1540300799,RU +1540300800,1540301311,DK +1540301312,1540301823,IL +1540301824,1540302847,GB +1540302848,1540303871,RU +1540303872,1540304895,UA +1540304896,1540305407,PL +1540305408,1540305919,GB +1540305920,1540306431,PL +1540306432,1540306943,UA +1540306944,1540307199,GB +1540307200,1540307455,BE +1540307456,1540307967,RU +1540307968,1540308479,UA +1540308480,1540308991,RS +1540308992,1540309503,PL +1540309504,1540310015,UA +1540310016,1540310527,PL +1540311040,1540313087,RU +1540313088,1540313599,SE +1540313600,1540315135,RU +1540315136,1540315647,UA +1540315648,1540316159,IL +1540316160,1540316671,DE +1540316672,1540317183,RO +1540317696,1540318207,UA +1540318208,1540318719,RU +1540318720,1540319231,RO +1540319232,1540319743,UA +1540319744,1540320255,RU +1540320768,1540321279,GB +1540321280,1540321791,SE +1540321792,1540322303,RU +1540322304,1540322815,UA +1540322816,1540323327,DE +1540323328,1540323839,RO +1540323840,1540324351,UA +1540324352,1540324863,RO +1540324864,1540325375,PL +1540325376,1540325887,DE +1540325888,1540326399,LI +1540326400,1540326911,RU +1540326912,1540327423,AT +1540327424,1540327935,RU +1540327936,1540328447,IR +1540328448,1540329983,RU +1540329984,1540330495,UA +1540330496,1540331007,PL +1540331008,1540331519,IT +1540331520,1540332031,GB +1540332544,1540333055,PL +1540333056,1540333567,NO +1540333568,1540334079,RO +1540334080,1540334591,DE +1540334592,1540335103,RU +1540335104,1540336127,PL +1540336128,1540336639,RU +1540337664,1540338175,FR +1540338688,1540339199,RU +1540339200,1540339711,UA +1540339712,1540340735,PL +1540340736,1540341247,CZ +1540341248,1540341759,BG +1540341760,1540342271,GB +1540342272,1540342783,UA +1540343296,1540343807,GB +1540343808,1540344831,PL +1540344832,1540345343,UA +1540345344,1540345855,IL +1540345856,1540346367,FR +1540346368,1540346879,UA +1540346880,1540347391,GB +1540347392,1540347903,DK +1540347904,1540348415,RO +1540348416,1540348927,UA +1540348928,1540349439,GB +1540349952,1540350463,UA +1540350464,1540350975,NO +1540350976,1540351487,DK +1540352000,1540352511,NL +1540353024,1540353535,GR +1540353536,1540354047,RU +1540354048,1540354559,IL +1540354560,1540355071,PL +1540355072,1540355583,UA +1540355584,1540356351,RU +1540356352,1540356607,UA +1540356608,1540357119,DE +1540357120,1540357631,RU +1540357632,1540358143,FR +1540358400,1540358655,GB +1540358656,1540358911,SE +1540358912,1540359167,GB +1540359168,1540359423,SA +1540359424,1540359679,DE +1540359680,1540359935,GB +1540359936,1540360191,AT +1540360192,1540360447,NO +1540360448,1540360703,FR +1540360704,1540360959,PL +1540360960,1540361215,GB +1540361216,1540361471,BE +1540361472,1540361727,DE +1540361728,1540361983,IT +1540361984,1540362239,EE +1540362240,1540363263,DE +1540363264,1540363519,RU +1540363776,1540364031,IS +1540364032,1540364287,RU +1540364288,1540364543,NO +1540364544,1540364799,UA +1540364800,1540365055,EE +1540365056,1540365311,SI +1540365312,1540365567,GB +1540365568,1540365823,RU +1540365824,1540366079,CH +1540366336,1540366591,PL +1540366592,1540366847,RU +1540366848,1540367103,AT +1540367104,1540367359,RU +1540367360,1540367615,HU +1540367616,1540367871,BE +1540367872,1540368127,DE +1540368128,1540368383,RU +1540368384,1540368639,FR +1540368640,1540368895,SK +1540368896,1540369407,RU +1540369408,1540369663,PL +1540369664,1540369919,DE +1540370176,1540370431,DE +1540370432,1540370687,LB +1540370688,1540370943,NL +1540370944,1540371199,PL +1540371200,1540371455,BE +1540371456,1540371711,UA +1540371712,1540371967,GB +1540371968,1540372223,NO +1540372224,1540372479,PL +1540372736,1540372991,GR +1540372992,1540373247,DE +1540373248,1540373503,UA +1540373504,1540373759,NL +1540373760,1540374015,TR +1540374016,1540374271,NL +1540374272,1540374527,BG +1540374528,1540374783,RU +1540374784,1540375039,UA +1540375040,1540375551,GB +1540375552,1540375807,DE +1540376064,1540376319,TR +1540376320,1540376575,DK +1540376576,1540376831,PL +1540376832,1540377087,RU +1540377088,1540377343,DE +1540377344,1540377599,RO +1540377600,1540377855,AM +1540377856,1540378111,ES +1540378112,1540378367,PL +1540378368,1540378623,CH +1540378624,1540378879,AT +1540378880,1540379135,SE +1540379136,1540379391,CH +1540379392,1540379647,DE +1540379648,1540379903,RU +1540380160,1540380415,IL +1540380416,1540380671,NL +1540380672,1540380927,SI +1540380928,1540381183,RS +1540381184,1540381439,RO +1540381440,1540381695,AT +1540381696,1540381951,RO +1540381952,1540382207,PL +1540382208,1540382463,UA +1540382464,1540382719,GB +1540382720,1540382975,LB +1540382976,1540383231,UA +1540383232,1540383487,AT +1540383488,1540383743,GB +1540383744,1540383999,RO +1540384000,1540384255,SI +1540384256,1540384511,FR +1540384512,1540384767,SE +1540385024,1540385279,GB +1540385280,1540385535,PL +1540385536,1540385791,DE +1540385792,1540386303,FR +1540386304,1540386559,NL +1540386560,1540386815,GB +1540386816,1540387071,NL +1540387328,1540387583,GB +1540387584,1540388095,UA +1540388096,1540388351,GB +1540388352,1540388607,IL +1540388608,1540388863,RU +1540388864,1540389119,RO +1540389120,1540389375,RU +1540389376,1540389631,GB +1540389632,1540389887,RO +1540389888,1540390143,GB +1540390144,1540390399,SI +1540390400,1540390655,RU +1540390656,1540390911,UA +1540391168,1540391423,IL +1540391424,1540391679,CH +1540391680,1540391935,NL +1540391936,1540392191,RU +1540392192,1540392447,PL +1540392448,1540392703,RU +1540392704,1540392959,PL +1540392960,1540393215,GB +1540393472,1540393727,UA +1540393728,1540394239,IL +1540394240,1540394495,GB +1540394496,1540394751,RO +1540394752,1540395007,DK +1540395008,1540395263,GE +1540395264,1540395519,UA +1540395520,1540395775,GB +1540395776,1540396031,IL +1540396032,1540396287,NO +1540396288,1540396543,RU +1540396544,1540396799,PL +1540397056,1540397311,IT +1540397312,1540397823,UA +1540397824,1540398079,DE +1540398080,1540398335,SA +1540398336,1540398591,DK +1540398592,1540399359,DE +1540399360,1540399615,RU +1540399872,1540400127,GB +1540400128,1540400383,NL +1540400384,1540400639,IR +1540400640,1540400895,RU +1540400896,1540401151,NL +1540401152,1540401407,SI +1540401408,1540401663,AT +1540401664,1540401919,GB +1540401920,1540402175,RU +1540402176,1540402431,FR +1540402432,1540402687,CH +1540402688,1540402943,SE +1540402944,1540403199,NL +1540403200,1540403455,AT +1540403712,1540404223,RO +1540404224,1540404479,CH +1540404480,1540404735,FR +1540404736,1540404991,PL +1540404992,1540405247,RU +1540405248,1540405503,GB +1540405504,1540405759,RU +1540405760,1540406015,PL +1540406016,1540406271,RU +1540406272,1540406527,SE +1540406528,1540407039,PL +1540407040,1540407807,DE +1540407808,1540408063,UA +1540408064,1540408319,IT +1540408320,1540408575,NL +1540408832,1540409087,UA +1540409088,1540409343,TR +1540409344,1540409599,SI +1540409600,1540409855,AT +1540409856,1540410111,DE +1540410112,1540410367,KW +1540410368,1540410623,CH +1540410624,1540410879,RU +1540411136,1540411391,NL +1540411648,1540411903,FR +1540411904,1540412159,RU +1540412160,1540412415,BE +1540412416,1540412671,DE +1540412672,1540412927,RO +1540412928,1540413183,FR +1540413184,1540413439,RO +1540413440,1540413695,RU +1540413696,1540413951,AT +1540413952,1540414207,IL +1540414208,1540414463,GB +1540414464,1540414719,BE +1540414720,1540414975,SE +1540414976,1540415231,FR +1540415232,1540415487,RO +1540415488,1540415743,FR +1540415744,1540415999,SI +1540416000,1540416255,FR +1540416256,1540416511,CH +1540416768,1540417023,NL +1540417280,1540417535,UA +1540417536,1540417791,RU +1540417792,1540418047,HR +1540418048,1540418559,RO +1540418816,1540419071,FR +1540419072,1540419327,RU +1540419328,1540419583,GB +1540419840,1540420095,NL +1540420096,1540420607,GB +1540420608,1540420863,DE +1540420864,1540421119,GB +1540421376,1540421631,PL +1540421632,1540422143,RU +1540422144,1540422399,PL +1540422656,1540422911,GB +1540422912,1540423423,RU +1540423424,1540423679,BA +1540423680,1540423935,SE +1540423936,1540424191,CZ +1540424192,1540424447,AT +1540424448,1540424703,ES +1540424704,1540424959,PL +1540424960,1540425215,RO +1540425216,1540425471,US +1540425472,1540425727,NL +1540425728,1540425983,BG +1540425984,1540426239,RU +1540426240,1540426495,IE +1540426496,1540426751,UA +1540426752,1540427263,NL +1540427520,1540427775,FR +1540427776,1540428287,RU +1540428288,1540428543,SI +1540428544,1540428799,FR +1540428800,1540429055,PL +1540429568,1540429823,RO +1540429824,1540430079,UA +1540430080,1540430335,FR +1540430336,1540430591,DE +1540430592,1540430847,PL +1540430848,1540431103,CH +1540431104,1540431359,FI +1540431360,1540431615,NO +1540431616,1540431871,GB +1540431872,1540432127,HR +1540432128,1540432383,AT +1540432384,1540432639,GB +1540432640,1540432895,FR +1540432896,1540433151,UA +1540433152,1540433407,GB +1540433408,1540433663,AM +1540433664,1540433919,DK +1540434176,1540434431,CH +1540434432,1540434687,DE +1540434688,1540434943,GB +1540434944,1540435199,FR +1540435200,1540435455,RO +1540435456,1540435967,GR +1540436224,1540436479,SI +1540436736,1540436991,UA +1540436992,1540437247,DE +1540437248,1540437503,CH +1540437504,1540437759,RU +1540437760,1540438015,UA +1540438016,1540438271,PL +1540438272,1540438527,US +1540438784,1540439039,RU +1540439040,1540439295,GB +1540439296,1540439551,RO +1540440064,1540440319,UA +1540440320,1540440575,RU +1540440576,1540440831,MD +1540440832,1540441087,RU +1540441344,1540441855,RU +1540441856,1540442111,GB +1540442112,1540442367,RU +1540442368,1540442623,GB +1540442624,1540442879,IE +1540442880,1540443135,AT +1540443136,1540443391,RU +1540443392,1540443647,CZ +1540443648,1540443903,FR +1540443904,1540444159,GB +1540444160,1540444415,RU +1540444416,1540444671,DE +1540444672,1540445183,GB +1540445184,1540445439,CH +1540445440,1540445695,RU +1540445696,1540445951,GB +1540445952,1540446207,DE +1540446208,1540446463,NO +1540446464,1540446719,AT +1540446720,1540446975,UA +1540446976,1540447231,RU +1540447232,1540447487,DE +1540447488,1540447743,PL +1540447744,1540447999,RU +1540448000,1540448255,PL +1540448256,1540448511,UA +1540448512,1540448767,IT +1540448768,1540449023,CH +1540449536,1540449791,CZ +1540449792,1540450047,RO +1540450048,1540450303,FR +1540450304,1540450559,GB +1540450816,1540451071,IE +1540451072,1540451327,FR +1540451328,1540451583,ES +1540451584,1540451839,RO +1540451840,1540452095,NL +1540452096,1540452351,CH +1540452352,1540452607,AT +1540452608,1540452863,IL +1540452864,1540453119,HU +1540453376,1540453631,PL +1540453632,1540453887,FR +1540453888,1540454143,UA +1540454144,1540454399,RU +1540454400,1540454911,DE +1540454912,1540455167,RU +1540455168,1540455423,RO +1540455424,1540455679,RU +1540455680,1540455935,GB +1540455936,1540456191,UA +1540456192,1540457215,RU +1540457216,1540457471,GE +1540457472,1540457727,SI +1540457728,1540457983,BE +1540457984,1540458239,DE +1540458240,1540458495,ES +1540458496,1540458751,HR +1540458752,1540459007,NL +1540459008,1540459519,UA +1540459520,1540459775,GB +1540459776,1540460031,PL +1540460032,1540460287,GB +1540460288,1540460543,NL +1540460544,1540460799,GB +1540460800,1540461055,SI +1540461056,1540461311,BG +1540461312,1540461823,RU +1540462080,1540462335,SI +1540462592,1540463103,PL +1540463104,1540463359,FR +1540463360,1540463615,PL +1540463616,1540463871,DK +1540463872,1540464127,UA +1540464128,1540464383,CH +1540464384,1540464895,DE +1540464896,1540465407,GB +1540465664,1540465919,NL +1540465920,1540466175,UA +1540466176,1540466431,DK +1540466432,1540466687,RU +1540466688,1540466943,NL +1540466944,1540467455,CH +1540467456,1540467711,RO +1540467712,1540467967,KW +1540467968,1540468223,GR +1540468224,1540468735,FR +1540468736,1540468991,UA +1540468992,1540469247,PL +1540469248,1540469503,GB +1540469760,1540470015,PL +1540470016,1540470271,SI +1540470272,1540470527,IL +1540471040,1540471295,DE +1540471552,1540471807,GB +1540471808,1540472063,SI +1540472064,1540472319,RO +1540472320,1540472575,DK +1540472576,1540472831,FR +1540472832,1540473087,NL +1540473088,1540473343,UA +1540473344,1540473599,IT +1540473600,1540473855,RO +1540473856,1540474367,GB +1540474368,1540474623,RO +1540474624,1540474879,PL +1540474880,1540475135,GB +1540475136,1540475903,UA +1540475904,1540476159,CH +1540476160,1540476415,DE +1540476416,1540476671,UA +1540476672,1540476927,SI +1540476928,1540477183,NL +1540477440,1540477695,UA +1540477696,1540477951,DE +1540477952,1540478207,NO +1540478208,1540478463,NL +1540478464,1540478719,UA +1540478976,1540479231,HR +1540479232,1540479487,GB +1540479488,1540479743,RU +1540479744,1540479999,AT +1540480000,1540480255,GB +1540480256,1540480767,PL +1540480768,1540481023,GB +1540481280,1540481535,GB +1540481536,1540481791,UA +1540482048,1540482303,DK +1540482304,1540482559,FR +1540482816,1540483071,DE +1540483072,1540483327,SE +1540483328,1540483839,RU +1540483840,1540484095,UA +1540484096,1540484351,DK +1540484352,1540484607,SI +1540484608,1540484863,GB +1540484864,1540485119,UA +1540485120,1540485375,SE +1540485376,1540485631,RO +1540485632,1540485887,IR +1540485888,1540486143,ES +1540486144,1540486399,GB +1540486400,1540486655,FR +1540486656,1540486911,GB +1540486912,1540487167,SK +1540487168,1540487423,PS +1540487424,1540487679,UA +1540487680,1540487935,DE +1540487936,1540488191,SI +1540488192,1540488447,GB +1540488448,1540488703,SA +1540488704,1540488959,DE +1540488960,1540489215,RO +1540489216,1540491263,RU +1540491264,1540492287,UA +1540492288,1540493311,PL +1540493312,1540494335,CZ +1540494336,1540495359,UA +1540495360,1540496383,RU +1540496384,1540499455,UA +1540499456,1540500479,AM +1540500480,1540501503,RU +1540501504,1540502527,PL +1540502528,1540503551,RU +1540504576,1540505599,SE +1540506624,1540507647,GB +1540507648,1540508671,RU +1540509696,1540510719,RO +1540510720,1540511743,RU +1540511744,1540512767,BG +1540512768,1540514815,RU +1540515840,1540516863,RU +1540516864,1540517887,UA +1540517888,1540518911,RU +1540518912,1540519935,UA +1540519936,1540521983,RU +1540521984,1540523007,PL +1540523008,1540524031,RU +1540524032,1540525055,AL +1540525056,1540526079,AT +1540526080,1540527359,UA +1540527360,1540529151,RU +1540529152,1540530175,UA +1540530176,1540531199,RU +1540531200,1540532223,UA +1540532224,1540533247,RU +1540533248,1540534271,KZ +1540534272,1540535295,UA +1540535296,1540536319,SK +1540536320,1540537343,RU +1540537344,1540538367,UA +1540538368,1540542463,RU +1540542464,1540543487,PL +1540543488,1540544511,DE +1540544512,1540545535,RU +1540545536,1540546559,AT +1540546560,1540548607,RU +1540548608,1540549631,IE +1540549632,1540552703,PL +1540552704,1540553727,UA +1540553728,1540554751,RU +1540554752,1540555775,SE +1540555776,1540556799,UZ +1540556800,1540557823,DE +1540557824,1540558848,UA +1540558849,1540562943,RU +1540562944,1540563967,AT +1540563968,1540564991,RU +1540564992,1540566015,DE +1540566016,1540567039,RU +1540567040,1540568063,MD +1540568064,1540571135,RU +1540572160,1540573183,UA +1540573184,1540574207,NL +1540574208,1540576255,RU +1540576256,1540577279,PL +1540578304,1540579327,RU +1540579328,1540580351,IE +1540580352,1540581375,PL +1540581376,1540582399,RU +1540582400,1540583423,BG +1540583424,1540584447,DE +1540584448,1540586495,UA +1540586496,1540588543,RU +1540588544,1540589567,UA +1540589568,1540593663,RU +1540594688,1540595711,IT +1540596736,1540597759,FR +1540597760,1540598783,SE +1540598784,1540600831,UA +1540600832,1540602879,RU +1540602880,1540603903,BG +1540603904,1540604927,RU +1540605952,1540606975,MD +1540606976,1540607999,UA +1540608000,1540609023,RU +1540609024,1540610047,UA +1540610048,1540611071,RU +1540611072,1540612095,PL +1540613120,1540614143,RU +1540614144,1540615167,BG +1540615168,1540616191,RU +1540616192,1540617215,AT +1540617216,1540618239,LT +1540619264,1540620287,PL +1540620288,1540620543,NL +1540620544,1540620799,LB +1540620800,1540621055,PL +1540621056,1540621311,DE +1540621312,1540621567,BA +1540621568,1540621823,PL +1540621824,1540622335,RU +1540622336,1540622591,KW +1540622592,1540622847,PL +1540622848,1540623103,RU +1540623360,1540623615,GB +1540623616,1540623871,BG +1540624128,1540624383,RS +1540624384,1540624639,IR +1540624640,1540624895,BG +1540624896,1540625151,GB +1540625664,1540625919,FR +1540625920,1540626175,UA +1540626176,1540626431,RO +1540626432,1540626687,SI +1540626688,1540626943,PL +1540626944,1540627199,FR +1540627456,1540627711,DK +1540627712,1540627967,CH +1540627968,1540628223,PL +1540628224,1540628479,HR +1540628480,1540628735,KW +1540628736,1540628991,PL +1540628992,1540629247,UA +1540629248,1540629503,RO +1540629504,1540629759,DK +1540629760,1540630015,BG +1540630272,1540630527,RO +1540631040,1540631295,NL +1540631296,1540631551,CH +1540631552,1540631807,HR +1540632064,1540632319,AT +1540632320,1540632575,RU +1540632576,1540632831,DK +1540633088,1540633343,RU +1540633600,1540633855,IE +1540633856,1540634111,AE +1540634624,1540634879,UA +1540634880,1540635135,RU +1540635136,1540635391,FR +1540635392,1540635647,RO +1540635648,1540636159,RU +1540636160,1540636415,RO +1540636416,1540636671,LV +1540636672,1540636927,RU +1540637184,1540637439,RO +1540637440,1540637695,SA +1540637696,1540637951,RU +1540637952,1540638207,RS +1540638208,1540638463,RO +1540638464,1540638719,AM +1540639232,1540639487,RO +1540639488,1540639743,CH +1540639744,1540639999,IL +1540640000,1540640255,CH +1540640256,1540640511,FR +1540640512,1540640767,ES +1540640768,1540641023,UA +1540641024,1540641535,RU +1540641536,1540641791,DE +1540641792,1540642047,PL +1540642048,1540642303,DE +1540642304,1540642559,PL +1540642560,1540642815,DE +1540642816,1540643071,IE +1540643072,1540643327,UZ +1540643328,1540643583,GB +1540643584,1540643839,CH +1540643840,1540644095,NO +1540644096,1540644607,GB +1540644608,1540644863,DE +1540644864,1540645119,NL +1540645120,1540645375,RU +1540645376,1540645631,BE +1540645632,1540645887,NL +1540646144,1540646399,RO +1540646400,1540646655,PS +1540646656,1540646911,SE +1540646912,1540647167,RU +1540647168,1540647423,GB +1540647424,1540647679,RU +1540647936,1540648191,GB +1540648192,1540648447,CH +1540648448,1540648959,RO +1540648960,1540649215,SK +1540649216,1540649471,DE +1540649472,1540649727,IL +1540649728,1540649983,GB +1540649984,1540650239,FR +1540650240,1540650495,CH +1540650496,1540650751,RU +1540650752,1540651007,FR +1540651264,1540651519,CH +1540651520,1540651775,MK +1540652032,1540652543,UA +1540652544,1540652799,TR +1540652800,1540653055,PL +1540653056,1540653311,FR +1540653312,1540653567,DK +1540653568,1540653823,DE +1540653824,1540654079,GB +1540654336,1540654591,RU +1540654592,1540654847,SI +1540655104,1540655359,AT +1540655360,1540655615,RU +1540655616,1540655871,GB +1540655872,1540656383,NL +1540656896,1540657151,RO +1540657152,1540657407,DE +1540657408,1540657663,CY +1540657664,1540657919,RU +1540657920,1540658175,FR +1540658176,1540658431,RO +1540658688,1540659199,RU +1540659200,1540659455,FR +1540659712,1540659967,UA +1540659968,1540660223,PL +1540660224,1540660479,RU +1540660480,1540660735,FR +1540660736,1540660991,RU +1540661760,1540662015,RO +1540662272,1540662527,RO +1540662528,1540662783,PL +1540662784,1540663039,GB +1540663040,1540663295,IT +1540663296,1540663551,RU +1540663552,1540664063,PL +1540664064,1540664319,RU +1540664320,1540664575,PL +1540664576,1540665087,UA +1540665088,1540665343,ES +1540665344,1540665599,NL +1540665600,1540665855,UA +1540665856,1540666111,TR +1540666112,1540666367,RU +1540666368,1540666623,UZ +1540666624,1540666879,DE +1540666880,1540667135,GB +1540667136,1540667647,NL +1540667648,1540668159,BE +1540668160,1540668415,AT +1540668416,1540668671,SE +1540668672,1540668927,IL +1540668928,1540669695,RO +1540669696,1540669951,KZ +1540669952,1540670207,UA +1540670208,1540670463,RU +1540670464,1540670719,CH +1540670720,1540670975,RU +1540671232,1540671487,SI +1540671488,1540671743,CH +1540672000,1540672255,FR +1540672256,1540672511,UA +1540672512,1540672767,DE +1540672768,1540673023,FR +1540673024,1540673279,DE +1540673280,1540673535,SE +1540673536,1540673791,SI +1540673792,1540674047,SE +1540674048,1540674303,NL +1540674304,1540674559,FR +1540674560,1540674815,GB +1540674816,1540675071,GE +1540675072,1540675327,UA +1540675328,1540675583,NL +1540675584,1540675839,GB +1540675840,1540676351,RU +1540676352,1540676607,IT +1540676864,1540677119,RU +1540677120,1540677375,GB +1540677376,1540677631,PL +1540677632,1540677887,DK +1540677888,1540678143,GE +1540678400,1540678655,RO +1540678656,1540678911,SE +1540678912,1540679111,RU +1540679112,1540679159,NL +1540679160,1540679162,RU +1540679163,1540679167,NL +1540679168,1540679423,RU +1540679680,1540679935,LT +1540679936,1540680191,BG +1540680192,1540680447,CH +1540680448,1540680703,BG +1540680704,1540680959,FR +1540680960,1540681215,NL +1540681216,1540681471,FR +1540681472,1540681727,RU +1540681984,1540682239,IT +1540682240,1540682495,PL +1540682496,1540682751,DE +1540682752,1540683007,EE +1540683008,1540683263,DE +1540683520,1540683775,HR +1540683776,1540684031,UA +1540684032,1540684287,IT +1540684288,1540684543,HU +1540684544,1540684799,SI +1540684800,1540685055,IR +1540685056,1540685311,UA +1540685312,1540685567,RO +1540685568,1540685823,FR +1540685824,1540686079,SE +1540686080,1540686335,TR +1540686336,1540686591,CH +1540686592,1540686847,GB +1540686848,1540687103,CH +1540687104,1540687359,RU +1540687360,1540687615,AT +1540687616,1540687871,IT +1540687872,1540688127,UA +1540688128,1540688383,HU +1540688384,1540688639,CZ +1540688640,1540688895,RO +1540688896,1540689151,BG +1540689152,1540689407,NL +1540689408,1540689663,RU +1540689664,1540689919,FR +1540689920,1540690175,RO +1540690176,1540690431,DK +1540690432,1540690687,SA +1540690688,1540690943,RO +1540690944,1540691711,DE +1540691712,1540691967,RU +1540691968,1540692223,CH +1540692224,1540692735,FR +1540692736,1540692991,DE +1540692992,1540693247,GB +1540693504,1540693759,ES +1540693760,1540694015,UZ +1540694016,1540694271,CH +1540694272,1540694527,UA +1540694528,1540694783,RO +1540695040,1540695295,DE +1540695296,1540695551,NL +1540695552,1540695807,PL +1540695808,1540696063,RU +1540696064,1540696319,HU +1540696320,1540696575,FR +1540696576,1540696831,GB +1540696832,1540697087,EE +1540697088,1540697343,RU +1540697344,1540697599,GB +1540697600,1540697855,ES +1540697856,1540698111,NO +1540698112,1540698367,DE +1540698880,1540699135,RU +1540699136,1540699391,GR +1540699392,1540699647,NL +1540699648,1540699903,AT +1540699904,1540700159,RO +1540700160,1540700415,DE +1540700416,1540700671,RO +1540700672,1540700927,PL +1540700928,1540701183,UA +1540701184,1540701695,DE +1540701696,1540701951,UA +1540701952,1540702207,GB +1540702208,1540702463,PL +1540702464,1540702719,PT +1540702720,1540702975,DK +1540702976,1540703231,RU +1540703232,1540703487,GB +1540703488,1540703743,NL +1540703744,1540703999,DK +1540704000,1540704255,PL +1540704512,1540704767,IE +1540705280,1540705535,RO +1540705536,1540705791,AT +1540705792,1540706047,NL +1540706048,1540706303,FR +1540706304,1540706559,SI +1540706560,1540706815,GB +1540706816,1540707071,FR +1540707072,1540707327,AT +1540707328,1540707583,HR +1540707584,1540707839,NL +1540707840,1540708095,MD +1540708096,1540708351,RU +1540708352,1540708607,PL +1540708608,1540708863,SI +1540708864,1540709119,FR +1540709120,1540709375,DE +1540709376,1540709631,UA +1540710144,1540710399,NL +1540710400,1540710655,PL +1540710656,1540710911,FI +1540710912,1540711423,DE +1540711424,1540711679,CH +1540711680,1540711935,RO +1540711936,1540712191,FR +1540712192,1540712447,DE +1540712448,1540712703,RU +1540712704,1540713215,LV +1540713216,1540713727,PL +1540713728,1540713983,RU +1540713984,1540714239,GB +1540714496,1540714751,NL +1540714752,1540715263,RU +1540715264,1540715519,NL +1540715520,1540715775,DE +1540716032,1540716287,PL +1540716288,1540716543,UA +1540717056,1540717311,CZ +1540717312,1540717823,PL +1540717824,1540718079,UA +1540718080,1540718335,RU +1540718336,1540718591,NO +1540718592,1540718847,CH +1540718848,1540719103,IT +1540719104,1540719359,RU +1540719360,1540719615,SI +1540719616,1540719871,AT +1540719872,1540720127,CH +1540720128,1540720383,NL +1540720384,1540720639,RO +1540720640,1540720895,CH +1540720896,1540721151,PL +1540721408,1540721663,RU +1540721664,1540721919,GB +1540721920,1540722431,RU +1540722432,1540722687,CZ +1540722688,1540722943,RU +1540722944,1540723455,FR +1540723456,1540723711,SI +1540723968,1540724223,UA +1540724224,1540724479,HU +1540724736,1540724991,CH +1540724992,1540725247,IT +1540725248,1540725503,UA +1540725504,1540725759,SE +1540725760,1540726015,PL +1540726272,1540726527,RU +1540726528,1540726783,CH +1540726784,1540727039,CZ +1540727040,1540727295,FI +1540727296,1540727551,PL +1540727552,1540727807,RU +1540727808,1540728063,GB +1540728064,1540728319,NL +1540728320,1540728575,RU +1540728832,1540729343,RU +1540729344,1540729599,PL +1540729600,1540729855,CH +1540729856,1540730111,RU +1540730112,1540730367,GB +1540730624,1540730879,UA +1540730880,1540731135,IL +1540731136,1540731391,DE +1540731392,1540731647,NL +1540731648,1540731903,SE +1540731904,1540732159,FR +1540732160,1540732415,MD +1540732416,1540732671,UA +1540732672,1540732927,GB +1540732928,1540733183,RU +1540733184,1540733439,UA +1540733440,1540733695,RU +1540733696,1540733951,UA +1540733952,1540734207,GB +1540734464,1540734719,NL +1540734720,1540734975,IQ +1540734976,1540735231,UA +1540735232,1540735487,PL +1540735488,1540735743,CH +1540735744,1540735999,NL +1540736000,1540736255,RU +1540736256,1540736511,IT +1540736512,1540736767,DE +1540736768,1540737791,GB +1540737792,1540738047,NO +1540738048,1540738303,AT +1540738304,1540738559,SA +1540738560,1540738815,PL +1540738816,1540739071,DE +1540739328,1540739583,UA +1540739584,1540739839,IT +1540739840,1540740095,CZ +1540740096,1540740351,GB +1540740352,1540740607,SA +1540740608,1540740863,NL +1540740864,1540741119,ES +1540741120,1540741375,GB +1540741632,1540742143,NL +1540742400,1540742655,DE +1540742656,1540742911,AT +1540743168,1540743423,NO +1540743424,1540743679,GB +1540743680,1540743935,PL +1540743936,1540744191,CH +1540744192,1540744447,GR +1540744448,1540744703,FR +1540744704,1540744959,GB +1540744960,1540745215,UA +1540745216,1540745471,DE +1540745472,1540745727,KG +1540745728,1540746239,AT +1540746240,1540746495,FR +1540746496,1540747263,PL +1540747264,1540747519,RU +1540747520,1540747775,SI +1540747776,1540748031,FR +1540748032,1540748287,RU +1540748288,1540748543,CZ +1540748544,1540748799,TR +1540748800,1540749055,SE +1540749056,1540749311,RU +1540749312,1540749567,UZ +1540749568,1540749823,RU +1540749824,1540750079,SE +1540750080,1540750335,BE +1540750336,1540750591,DE +1540750592,1540751103,TR +1540751104,1540752383,PL +1540752384,1540753407,GB +1540753408,1540754431,DE +1540754432,1540755455,RO +1540755456,1540756479,UA +1540756480,1540757503,DK +1540757504,1540758527,PL +1540758528,1540759551,UA +1540760576,1540761599,PL +1540761600,1540762623,EE +1540762624,1540763647,LU +1540763648,1540764671,UA +1540764672,1540765695,PL +1540765696,1540766719,RU +1540766720,1540767743,IT +1540768768,1540769791,RU +1540769792,1540770815,IT +1540770816,1540771839,RU +1540771840,1540773887,UA +1540773888,1540774911,SE +1540775936,1540776959,RU +1540776960,1540777983,IL +1540777984,1540779007,HR +1540779008,1540780031,NL +1540780032,1540781055,UA +1540781056,1540783103,RU +1540783104,1540787199,UA +1540787200,1540789247,RU +1540790272,1540791295,KW +1540791296,1540792319,CZ +1540792320,1540793343,UA +1540793344,1540794367,FI +1540794368,1540795391,CH +1540795392,1540795647,RU +1540795648,1540795903,IE +1540795904,1540796159,KZ +1540796160,1540796415,RU +1540796416,1540798463,UA +1540798464,1540799487,RU +1540799488,1540800511,RO +1540800512,1540801535,CZ +1540801536,1540802559,RU +1540802560,1540803583,MD +1540803584,1540804607,RU +1540804608,1540805631,UA +1540805632,1540806655,RU +1540807680,1540809727,RU +1540809728,1540810751,GB +1540810752,1540811775,UA +1540811776,1540812799,PL +1540812800,1540813823,RU +1540813824,1540815871,UA +1540815872,1540816895,DE +1540816896,1540817919,PL +1540817920,1540818943,NL +1540818944,1540819967,UA +1540819968,1540820991,CZ +1540820992,1540823039,RU +1540823040,1540824063,UA +1540824064,1540825087,RU +1540825088,1540826111,PL +1540826112,1540828159,RU +1540828160,1540829183,PL +1540829184,1540830207,RU +1540830208,1540833279,UA +1540833280,1540834303,ES +1540834304,1540835327,UA +1540835328,1540836351,DE +1540836352,1540837375,RU +1540837376,1540838399,PL +1540838400,1540840447,RU +1540840448,1540841471,SE +1540841472,1540842495,KZ +1540842496,1540843519,DE +1540843520,1540844543,PL +1540844544,1540846591,RU +1540846592,1540847615,DE +1540847616,1540848639,RU +1540848640,1540849663,UA +1540849664,1540850687,RU +1540850688,1540851711,FI +1540851712,1540852239,KZ +1540852240,1540852240,RU +1540852241,1540852735,KZ +1540852736,1540853759,RU +1540853760,1540854783,UA +1540854784,1540855807,NL +1540855808,1540856831,BG +1540856832,1540857855,NL +1540857856,1540858879,DK +1540858880,1540859903,GB +1540859904,1540861951,RU +1540861952,1540862975,BY +1540862976,1540865023,GB +1540865024,1540872191,RU +1540872192,1540873215,BG +1540873216,1540875263,RU +1540875264,1540876287,PL +1540876288,1540877311,RU +1540877312,1540878335,PL +1540878336,1540879359,AT +1540879360,1540880383,RU +1540880384,1540881407,UA +1540881408,1540882431,RU +1540882432,1540882687,SE +1540882688,1540883199,LV +1540883200,1540883455,RU +1540883456,1540883711,IR +1540883712,1540883967,PL +1540883968,1540884223,IE +1540884224,1540884479,SE +1540884480,1540884735,RO +1540884736,1540884991,GB +1540884992,1540885247,BE +1540885504,1540885759,ES +1540885760,1540886015,DE +1540886016,1540886271,DK +1540886272,1540886527,UA +1540886528,1540886783,PL +1540886784,1540887039,IT +1540887040,1540887295,GB +1540887296,1540887551,FR +1540887552,1540887807,BE +1540887808,1540888063,MD +1540888064,1540888319,UA +1540888320,1540888575,DE +1540888576,1540888831,SE +1540888832,1540889087,PL +1540889088,1540889343,FR +1540889344,1540889599,RO +1540889600,1540889855,UA +1540889856,1540890111,FR +1540890112,1540890367,PL +1540890368,1540890623,IL +1540890624,1540890879,SE +1540890880,1540891135,DE +1540891136,1540891391,NL +1540891392,1540891647,DE +1540891648,1540891903,CH +1540891904,1540892159,GB +1540892160,1540892415,IT +1540892672,1540892927,GB +1540892928,1540893183,BE +1540893184,1540893439,GB +1540893440,1540893695,FR +1540893696,1540893951,HU +1540893952,1540894207,DE +1540894208,1540894463,RU +1540894464,1540894719,MD +1540894720,1540895487,RU +1540895488,1540895743,PL +1540895744,1540895999,RO +1540896000,1540896255,RU +1540896256,1540896511,SI +1540896512,1540896767,GB +1540897024,1540897279,GB +1540897280,1540897535,FR +1540897536,1540897791,SC +1540897792,1540898047,HU +1540898048,1540898303,UA +1540898304,1540898559,SE +1540898560,1540898815,ES +1540898816,1540899071,PL +1540899072,1540899327,SE +1540899328,1540899583,RU +1540899584,1540899839,FR +1540899840,1540900351,RU +1540900352,1540900607,HU +1540900608,1540900863,BG +1540900864,1540901119,RU +1540901376,1540901631,SI +1540901632,1540901887,RO +1540901888,1540902143,GR +1540902400,1540902655,RO +1540902656,1540902911,CH +1540902912,1540903167,RO +1540903168,1540903423,RU +1540903424,1540903679,GB +1540903680,1540904447,FR +1540904448,1540904703,EE +1540904704,1540904959,SI +1540904960,1540905471,GB +1540905472,1540905727,DE +1540905728,1540905983,TR +1540905984,1540906239,AT +1540906240,1540906495,GB +1540906496,1540906751,UA +1540906752,1540907007,BG +1540907008,1540907263,RU +1540907264,1540907519,MD +1540907520,1540907775,TR +1540907776,1540908031,PL +1540908032,1540908287,NL +1540908288,1540908543,DK +1540908544,1540908799,IT +1540908800,1540909055,DK +1540909056,1540909311,NL +1540909312,1540909567,GB +1540909568,1540909823,UA +1540909824,1540910079,FR +1540910080,1540910335,DE +1540910336,1540910591,SI +1540910592,1540910847,FR +1540910848,1540911103,SE +1540911104,1540911359,GB +1540911360,1540911615,NL +1540911616,1540911871,RU +1540911872,1540912127,PL +1540912128,1540912383,GB +1540912384,1540912639,PT +1540912640,1540912895,DK +1540912896,1540913151,TR +1540913152,1540913407,AT +1540913408,1540913663,RU +1540913920,1540914175,RU +1540914176,1540914687,PL +1540914688,1540914943,RU +1540914944,1540915199,IT +1540915200,1540915455,DE +1540915456,1540915967,RU +1540915968,1540916479,NL +1540916480,1540916735,UA +1540916736,1540916991,PL +1540916992,1540917247,UA +1540917248,1540917503,FI +1540917504,1540917759,GB +1540917760,1540918015,RO +1540918016,1540918527,FR +1540918528,1540919039,NL +1540919040,1540919295,GB +1540919296,1540919551,RO +1540919552,1540919807,BE +1540919808,1540920063,GB +1540920064,1540920319,RU +1540920320,1540920575,TR +1540920576,1540920831,PL +1540920832,1540921087,HU +1540921088,1540921599,RO +1540921600,1540922111,MT +1540922112,1540922367,ES +1540922368,1540922879,RO +1540922880,1540923135,DE +1540923136,1540923391,GB +1540923392,1540923647,PL +1540923648,1540923903,UA +1540923904,1540924159,NL +1540924160,1540924415,LT +1540924416,1540924671,RU +1540924672,1540924927,UA +1540924928,1540925183,MD +1540925184,1540925439,RU +1540925440,1540925695,CZ +1540925952,1540926207,TR +1540926208,1540926463,FR +1540926464,1540926719,SI +1540926720,1540926975,UA +1540926976,1540927231,BG +1540927232,1540927487,RU +1540927488,1540927743,GE +1540927744,1540927999,RO +1540928000,1540928255,KZ +1540928256,1540928511,CZ +1540928512,1540928767,GR +1540928768,1540929023,GB +1540929024,1540929279,DK +1540929280,1540929535,GB +1540929536,1540929791,NL +1540929792,1540930047,CZ +1540930048,1540930303,FR +1540930304,1540930559,RU +1540930560,1540930815,KW +1540930816,1540931071,KZ +1540931328,1540931839,PL +1540931840,1540932095,GB +1540932096,1540932351,PL +1540932352,1540932607,FR +1540932608,1540932863,UA +1540932864,1540933119,GB +1540933120,1540933375,RU +1540933376,1540933631,RO +1540933632,1540933887,NL +1540933888,1540934143,TR +1540934144,1540934399,PL +1540934400,1540934655,FR +1540934656,1540934911,PL +1540934912,1540935167,RU +1540935168,1540935423,GR +1540935424,1540935679,NL +1540935680,1540935935,RU +1540935936,1540936191,FR +1540936192,1540936447,CY +1540936448,1540936959,RU +1540936960,1540937471,PL +1540937728,1540937983,DE +1540937984,1540938239,RU +1540938240,1540938751,ES +1540938752,1540939007,KZ +1540939008,1540939263,FR +1540939264,1540939519,IL +1540939520,1540939775,TR +1540939776,1540940031,PL +1540940032,1540940287,RO +1540940288,1540940543,DK +1540940544,1540940799,RO +1540940800,1540941055,FR +1540941056,1540941311,CH +1540941312,1540941567,AT +1540941568,1540942079,UA +1540942080,1540942335,RO +1540942336,1540942591,FR +1540942592,1540942847,DE +1540942848,1540943103,IE +1540943104,1540943359,UA +1540943360,1540943615,BE +1540943616,1540943871,PL +1540943872,1540944127,UA +1540944128,1540944383,IE +1540944384,1540944639,AT +1540944640,1540944895,DE +1540944896,1540945151,UA +1540945152,1540945407,DE +1540945408,1540945663,GB +1540945664,1540945919,AT +1540945920,1540946175,DE +1540946176,1540946431,AT +1540946432,1540946943,UA +1540946944,1540947199,IL +1540947200,1540947455,BG +1540947456,1540947711,PL +1540947712,1540947967,IS +1540947968,1540948479,PL +1540948480,1540948991,RU +1540948992,1540949503,UA +1540950016,1540950527,RU +1540950528,1540951551,UA +1540951552,1540952063,RS +1540952064,1540952575,RU +1540952576,1540953087,PL +1540953088,1540953599,RU +1540953600,1540954623,PL +1540954624,1540955135,DE +1540955136,1540955647,RO +1540955648,1540956159,NL +1540956160,1540956671,SK +1540956672,1540957183,RU +1540957184,1540957695,DE +1540957696,1540958207,AT +1540958208,1540958719,PL +1540958720,1540959231,RU +1540959232,1540959743,FR +1540959744,1540960255,RU +1540960256,1540960767,PL +1540960768,1540961279,RU +1540961280,1540961791,CZ +1540961792,1540962303,AT +1540962304,1540962815,NL +1540962816,1540963839,UA +1540963840,1540964351,RU +1540964352,1540964863,IR +1540964864,1540965887,UA +1540965888,1540966399,RU +1540966400,1540966911,GB +1540966912,1540967935,RU +1540967936,1540968447,UA +1540968960,1540969471,RO +1540969472,1540969983,GB +1540969984,1540970495,DE +1540970496,1540971007,IE +1540971008,1540971519,UA +1540971520,1540972031,SI +1540972032,1540972543,FR +1540972544,1540973055,CZ +1540973056,1540973567,PL +1540973568,1540974079,UA +1540974080,1540974591,RU +1540974592,1540975103,PL +1540975104,1540975615,UA +1540975616,1540976639,RU +1540976640,1540977151,UA +1540977152,1540977663,PL +1540977664,1540978175,FI +1540978176,1540978687,AT +1540979200,1540979711,SI +1540979712,1540980223,RU +1540980224,1540980735,SI +1540980736,1540980991,CH +1540980992,1540981247,RU +1540981248,1540981503,RO +1540981504,1540981759,DE +1540981760,1540982015,PL +1540982016,1540982271,DK +1540982272,1540982527,GB +1540982784,1540983295,RU +1540983296,1540983551,ME +1540983808,1540984063,FR +1540984064,1540984319,DE +1540984320,1540984575,PL +1540984576,1540984831,RU +1540984832,1540985087,UA +1540985088,1540985343,DE +1540985344,1540985599,NL +1540985600,1540985855,TR +1540985856,1540986111,BG +1540986112,1540986367,AT +1540986368,1540986623,PL +1540986624,1540986879,FR +1540986880,1540987135,PL +1540987136,1540987391,LV +1540987392,1540987647,FR +1540987648,1540987903,GR +1540987904,1540988159,RU +1540988160,1540988415,AM +1540988416,1540988671,PL +1540988672,1540988927,RU +1540988928,1540989183,GB +1540989184,1540989439,PL +1540989696,1540989951,PL +1540989952,1540990207,FR +1540990208,1540990463,DE +1540990464,1540990719,UA +1540990976,1540991231,FR +1540991232,1540991487,HU +1540991488,1540991743,CH +1540991744,1540991999,PL +1540992000,1540992255,FR +1540992256,1540992511,AT +1540992512,1540993279,DE +1540993280,1540993535,LB +1540993536,1540993791,RU +1540993792,1540994047,UA +1540994048,1540994303,RU +1540994304,1540994559,SE +1540994560,1540994815,PL +1540994816,1540995071,UA +1540995072,1540995327,RU +1540995328,1540995583,IQ +1540995584,1540995839,SE +1540995840,1540996095,RO +1540996096,1540996351,DE +1540996352,1540996607,SE +1540996608,1540996863,RU +1540996864,1540997119,NL +1540997120,1540997375,RU +1540997376,1540997631,TR +1540997632,1540997887,RU +1540998144,1540998399,RU +1540998400,1540998655,UA +1540998656,1540998911,PL +1540998912,1540999167,DE +1540999424,1540999679,DK +1540999680,1540999935,RU +1540999936,1541000191,RO +1541000192,1541000447,PL +1541000448,1541000703,BG +1541000704,1541000959,DE +1541001216,1541001471,PL +1541001472,1541001727,SE +1541001728,1541001983,NL +1541001984,1541002239,FI +1541002240,1541002495,RU +1541002496,1541002751,AT +1541002752,1541003007,DE +1541003008,1541003263,BG +1541003264,1541003519,GB +1541003520,1541004031,PL +1541004032,1541004287,IL +1541004288,1541004543,RU +1541004544,1541004799,PL +1541004800,1541005055,SI +1541005312,1541005567,PL +1541005568,1541006079,AT +1541006080,1541006335,RU +1541006336,1541006591,PL +1541006592,1541006847,AT +1541006848,1541007103,DE +1541007104,1541007359,GB +1541007360,1541007615,DE +1541007616,1541007871,RU +1541007872,1541008127,FR +1541008128,1541008383,NL +1541008384,1541008639,RU +1541008640,1541008895,GB +1541008896,1541009151,TR +1541009408,1541009663,UA +1541009664,1541009919,CH +1541009920,1541010175,PL +1541010176,1541010431,GR +1541010432,1541010687,UA +1541010688,1541010943,GB +1541010944,1541011199,CY +1541011200,1541011455,CH +1541011456,1541011711,FI +1541012224,1541012479,DE +1541012480,1541012735,FI +1541012992,1541013247,UA +1541013248,1541013503,SI +1541013504,1541014527,RO +1541014528,1541015551,AM +1541015552,1541016575,RU +1541016576,1541018623,UA +1541019648,1541020671,RU +1541020672,1541022719,UA +1541023418,1541023418,UA +1541023744,1541024767,RU +1541024768,1541026815,UA +1541026816,1541027839,LV +1541028864,1541029887,PL +1541030912,1541031935,PL +1541031936,1541032959,UA +1541032960,1541033983,PL +1541033984,1541035007,BG +1541035008,1541036031,RU +1541036032,1541037055,UA +1541037056,1541038079,RU +1541038080,1541039103,UA +1541039104,1541040127,RU +1541040128,1541041151,UA +1541041152,1541044223,RU +1541044224,1541045247,US +1541045248,1541046271,NL +1541046272,1541051391,RU +1541051392,1541052415,NL +1541052416,1541053439,RO +1541053440,1541054463,PL +1541054464,1541055487,TJ +1541055488,1541056511,PL +1541056512,1541057535,TJ +1541057536,1541058559,RS +1541058560,1541059583,RU +1541059584,1541060607,AM +1541060608,1541061631,NO +1541061632,1541062655,CZ +1541062656,1541063679,UA +1541063680,1541065727,PL +1541065728,1541066751,NL +1541066752,1541067775,PL +1541067776,1541068799,UA +1541068800,1541069823,PL +1541069824,1541070847,RU +1541070848,1541071871,IT +1541071872,1541072895,RU +1541072896,1541073919,CZ +1541073920,1541074943,GB +1541074944,1541075967,PL +1541075968,1541078015,RU +1541078016,1541079039,RO +1541079040,1541080063,PL +1541080064,1541081087,RU +1541081088,1541082111,DE +1541082112,1541083135,RU +1541083136,1541084159,RO +1541084160,1541086207,RU +1541086208,1541086463,NL +1541086464,1541086975,UA +1541086976,1541087231,RU +1541087232,1541088255,UA +1541088256,1541089279,RU +1541089280,1541090303,GB +1541090304,1541091327,CZ +1541091328,1541092351,RU +1541092352,1541093375,UA +1541093376,1541094399,RU +1541094400,1541095423,UA +1541095424,1541096447,RU +1541096448,1541097471,AT +1541097472,1541098495,RU +1541098496,1541099519,NL +1541099520,1541100543,UA +1541100544,1541101567,HU +1541101568,1541102591,RU +1541102592,1541103615,SA +1541103616,1541105663,RU +1541105664,1541106687,PL +1541106688,1541107711,NL +1541107712,1541108735,PL +1541108736,1541109759,ES +1541109760,1541110783,PL +1541110784,1541111807,RU +1541111808,1541112831,PL +1541112832,1541113855,SK +1541113856,1541114879,RU +1541114880,1541116927,UA +1541116928,1541117951,RU +1541117952,1541118975,DK +1541118976,1541122047,RU +1541122048,1541123071,UA +1541123072,1541124095,FI +1541124096,1541126143,RU +1541126144,1541127167,PL +1541127168,1541129215,RU +1541129216,1541130239,UA +1541130240,1541132287,RU +1541132288,1541133311,PL +1541133312,1541134335,RO +1541134336,1541135359,SE +1541135360,1541136383,UA +1541136384,1541139455,RU +1541139456,1541140479,HU +1541140480,1541142527,CZ +1541142528,1541143551,RU +1541143552,1541144575,UA +1541144576,1541144831,PL +1541144832,1541145087,RU +1541145088,1541145343,AT +1541145344,1541145599,UA +1541145600,1541145855,IT +1541145856,1541146111,RU +1541146112,1541146367,UA +1541146368,1541146623,DK +1541146624,1541146879,AT +1541146880,1541147135,IL +1541147136,1541147391,PL +1541147392,1541147903,RU +1541147904,1541148415,RO +1541148416,1541148671,US +1541148672,1541148927,RU +1541148928,1541149439,PL +1541149440,1541149695,SE +1541149696,1541149951,LT +1541149952,1541150207,NL +1541150208,1541150463,IL +1541150464,1541150719,CH +1541150720,1541151231,GB +1541151232,1541151487,RO +1541151488,1541151743,FR +1541152000,1541152255,HU +1541152256,1541152511,NL +1541152512,1541152767,RU +1541152768,1541153023,PL +1541153024,1541153279,RU +1541153280,1541153535,DE +1541153792,1541154047,DE +1541154048,1541154303,NL +1541154304,1541154559,RU +1541154560,1541154815,PL +1541154816,1541155071,CH +1541155072,1541155327,CY +1541155328,1541155583,GB +1541155584,1541155839,LV +1541155840,1541156095,PL +1541156096,1541156351,IE +1541156352,1541156607,RU +1541156608,1541156863,SE +1541156864,1541157119,RO +1541157120,1541157375,DE +1541157376,1541157631,TR +1541157632,1541157887,KZ +1541157888,1541158143,GB +1541158144,1541158399,NL +1541158400,1541158655,PL +1541158656,1541158911,SI +1541158912,1541159167,DE +1541159168,1541159423,RU +1541159424,1541159679,SE +1541159680,1541159935,LT +1541159936,1541160447,UA +1541160448,1541160703,RU +1541160704,1541160959,RO +1541160960,1541161215,CH +1541161216,1541161471,TR +1541161472,1541161727,ES +1541161728,1541161983,DE +1541161984,1541162239,BE +1541162240,1541162495,RU +1541162496,1541162751,GB +1541163008,1541163263,RO +1541163264,1541163519,PL +1541163520,1541163775,DE +1541163776,1541164031,RO +1541164032,1541164287,RU +1541164288,1541164543,CH +1541164544,1541164799,SI +1541164800,1541165055,IR +1541165056,1541165311,UA +1541165312,1541165567,RU +1541165568,1541165823,NL +1541165824,1541166079,GB +1541166336,1541166591,FR +1541166592,1541166847,RO +1541166848,1541167103,RU +1541167104,1541167359,NL +1541167360,1541167615,AT +1541167872,1541168127,UA +1541168128,1541168639,RU +1541168640,1541168895,MD +1541168896,1541169151,MK +1541169152,1541169407,RO +1541169408,1541169663,PL +1541169664,1541169919,SE +1541169920,1541170431,CH +1541170432,1541170687,NL +1541170688,1541170943,BE +1541170944,1541171199,PL +1541171200,1541171455,UA +1541171456,1541171711,PL +1541171712,1541171967,UA +1541171968,1541172223,SI +1541172224,1541172479,GR +1541172480,1541172735,RU +1541172736,1541172991,IS +1541172992,1541173247,BE +1541173248,1541173503,RU +1541173504,1541173759,UA +1541173760,1541174015,LT +1541174016,1541174271,DE +1541174272,1541174527,FR +1541174528,1541174783,SE +1541174784,1541175039,GB +1541175040,1541175295,SI +1541175296,1541175551,RU +1541175552,1541175807,RO +1541175808,1541176063,CZ +1541176064,1541176319,NL +1541176320,1541176575,AM +1541176576,1541176831,DE +1541177088,1541177343,GB +1541177344,1541177599,CH +1541177600,1541177855,DE +1541177856,1541178111,RO +1541178368,1541178623,GB +1541178624,1541178879,RU +1541178880,1541179135,DE +1541179136,1541179391,RU +1541179392,1541179647,BE +1541179648,1541179903,RU +1541179904,1541180159,IS +1541180160,1541180415,MT +1541180416,1541180671,UA +1541180672,1541180927,GB +1541180928,1541181183,IT +1541181184,1541181439,NO +1541181440,1541181695,MD +1541181696,1541182207,RU +1541182208,1541182463,NL +1541182464,1541182719,DE +1541182720,1541182975,RO +1541182976,1541183231,SE +1541183232,1541183487,UA +1541183488,1541183743,RU +1541183744,1541183999,DE +1541184000,1541184255,BE +1541184256,1541184511,RU +1541184512,1541184767,SI +1541184768,1541185023,DE +1541185024,1541185279,ES +1541185280,1541185535,DE +1541185536,1541185791,GB +1541185792,1541186047,UA +1541186048,1541186303,CH +1541186304,1541186559,UA +1541186560,1541186815,PL +1541186816,1541187071,NO +1541187072,1541187327,RU +1541187328,1541187583,RO +1541187584,1541187839,IT +1541187840,1541188351,RU +1541188608,1541188863,HU +1541188864,1541189119,RU +1541189120,1541189375,UA +1541189376,1541189631,GB +1541189888,1541190143,PL +1541190144,1541190399,GB +1541190400,1541190655,AT +1541190656,1541190911,GB +1541190912,1541191167,RU +1541191168,1541191423,TR +1541191424,1541191679,RO +1541191680,1541192191,NL +1541192448,1541192703,ME +1541192704,1541192959,RU +1541192960,1541193215,BG +1541193216,1541193471,UA +1541193472,1541193727,BE +1541193728,1541193983,SE +1541193984,1541194239,IL +1541194240,1541194495,SI +1541194496,1541194751,JO +1541194752,1541195007,NO +1541195008,1541195263,FR +1541195264,1541195519,UA +1541195520,1541195775,GB +1541195776,1541196031,FR +1541196032,1541196287,CZ +1541196800,1541197055,UA +1541197056,1541197311,PL +1541197312,1541197567,RU +1541197568,1541197823,MD +1541197824,1541198079,GR +1541198080,1541198335,LT +1541198336,1541198591,AT +1541198592,1541198847,RU +1541198848,1541199103,GB +1541199104,1541199359,SI +1541199360,1541199615,GB +1541199616,1541199871,RU +1541199872,1541200127,GB +1541200128,1541200383,NO +1541200384,1541201151,RU +1541201152,1541201407,SI +1541201408,1541201663,PL +1541201920,1541202175,IE +1541202176,1541202431,PL +1541202432,1541202687,ES +1541202688,1541202943,SE +1541202944,1541203199,DE +1541203456,1541203711,UA +1541203712,1541203967,GB +1541203968,1541204223,RO +1541204224,1541204479,RU +1541204480,1541204735,GB +1541204736,1541204991,UA +1541204992,1541205247,GR +1541205248,1541205503,SK +1541205504,1541205759,PL +1541205760,1541206015,AT +1541206016,1541206271,SI +1541206272,1541206527,FI +1541206528,1541206783,TR +1541206784,1541207039,NO +1541207040,1541207295,DE +1541207296,1541207807,FR +1541207808,1541208063,HU +1541208064,1541208319,FR +1541208320,1541208575,NL +1541208576,1541208831,BY +1541208832,1541209087,HU +1541209088,1541209599,UA +1541209600,1541209855,SE +1541209856,1541210111,UA +1541210112,1541210623,RU +1541210624,1541211135,CZ +1541211136,1541211647,SK +1541211648,1541212159,UA +1541212160,1541212671,DE +1541212672,1541213183,MT +1541213184,1541213695,DE +1541213696,1541214207,UA +1541214208,1541215231,RU +1541215232,1541215743,LV +1541215744,1541216255,SA +1541216256,1541216767,RU +1541216768,1541217279,PL +1541217280,1541218303,RU +1541218304,1541218815,IT +1541218816,1541219839,RU +1541219840,1541220351,CZ +1541220352,1541221375,RU +1541221376,1541221887,PL +1541221888,1541222399,CZ +1541222400,1541222911,RU +1541222912,1541223423,DK +1541223424,1541223935,RU +1541223936,1541224447,GB +1541224448,1541224959,RU +1541224960,1541225471,DE +1541225472,1541225983,RU +1541225984,1541226495,LV +1541226496,1541227007,UA +1541227008,1541227519,FI +1541227520,1541227775,RU +1541227776,1541228031,NL +1541228032,1541228543,RU +1541228544,1541229055,CZ +1541229056,1541229567,UA +1541230080,1541230591,RO +1541230592,1541231103,RU +1541231104,1541231615,GB +1541231616,1541232127,UA +1541232128,1541232639,RU +1541232640,1541233151,PL +1541233152,1541233663,RU +1541234176,1541234687,RO +1541234688,1541235199,NL +1541235200,1541235455,RU +1541235456,1541235711,NL +1541235712,1541236223,AT +1541236224,1541236735,RU +1541236736,1541237247,DE +1541237445,1541237445,RU +1541237760,1541238271,RU +1541238272,1541239295,SK +1541239296,1541239807,PL +1541240320,1541240831,CH +1541240832,1541241343,DE +1541241344,1541241855,PL +1541241856,1541242367,UA +1541242368,1541242879,PL +1541242880,1541243391,KW +1541243392,1541243903,NO +1541243904,1541244415,UA +1541244416,1541244927,RS +1541244928,1541245439,UA +1541245440,1541245951,AT +1541245952,1541246463,RU +1541246464,1541246975,DK +1541246976,1541247487,PL +1541247488,1541247999,FR +1541248000,1541248511,CZ +1541248512,1541249023,NL +1541249024,1541249535,GB +1541249536,1541250047,UA +1541250048,1541250559,RU +1541250560,1541251071,PL +1541251072,1541251583,NL +1541251584,1541252607,RU +1541252608,1541253119,UA +1541253120,1541253631,GB +1541253632,1541254143,SI +1541254144,1541254655,PL +1541254656,1541255679,RU +1541255680,1541256191,UA +1541256192,1541256703,RU +1541256704,1541257215,DE +1541257216,1541257727,SA +1541257728,1541258239,EE +1541258240,1541258751,RU +1541258752,1541259263,UA +1541259264,1541259775,CH +1541259776,1541260287,RU +1541260288,1541260799,DK +1541260800,1541261823,RU +1541261824,1541262335,SA +1541262336,1541262847,DE +1541262848,1541263359,DK +1541263360,1541263871,NL +1541263872,1541264383,UA +1541264384,1541264895,CZ +1541264896,1541265407,PL +1541265408,1541265919,RS +1541265920,1541266431,UA +1541266432,1541266943,KW +1541266944,1541267455,CY +1541267456,1541267967,FR +1541267968,1541268479,DE +1541268480,1541268991,AM +1541268992,1541269503,NL +1541269504,1541270015,RU +1541270016,1541270527,UA +1541270528,1541271039,IT +1541271040,1541271551,FI +1541271552,1541272063,RO +1541272064,1541272575,RU +1541272576,1541273087,FR +1541273088,1541274623,RU +1541274624,1541275135,UA +1541275136,1541275647,FR +1541275648,1541276671,UA +1541276672,1541277695,RS +1541277696,1541278719,GB +1541278720,1541280767,UA +1541280768,1541281791,BG +1541281792,1541282815,PL +1541282816,1541283839,RU +1541283840,1541285887,UA +1541285888,1541286911,CZ +1541286912,1541287935,DE +1541287936,1541288959,RU +1541288960,1541289983,CZ +1541289984,1541291007,PL +1541291008,1541293055,UA +1541293056,1541295103,PL +1541295104,1541297151,UA +1541297152,1541298175,CH +1541298176,1541299199,KZ +1541299200,1541300223,AT +1541300224,1541301247,DE +1541301248,1541302271,PL +1541302272,1541303295,SK +1541303296,1541304319,PL +1541304320,1541305343,UA +1541305344,1541306367,PL +1541306368,1541307391,RU +1541307392,1541308415,PL +1541308416,1541309439,RU +1541309440,1541310463,CH +1541310464,1541311487,UA +1541311488,1541314559,PL +1541314560,1541315583,UA +1541315584,1541316607,RU +1541316608,1541317631,PL +1541317632,1541318655,RU +1541318656,1541319679,UA +1541319680,1541320703,CZ +1541320704,1541321727,DE +1541321728,1541322751,UA +1541322752,1541323775,PL +1541323776,1541324799,FI +1541324800,1541325823,PL +1541325824,1541326847,IR +1541326848,1541327871,SA +1541327872,1541328895,IR +1541328896,1541329919,RU +1541329920,1541330943,PL +1541330944,1541331967,RU +1541331968,1541332991,UA +1541332992,1541334015,PL +1541334016,1541335039,RU +1541335040,1541336063,DE +1541336064,1541338111,RU +1541338112,1541341183,UA +1541341184,1541341439,TR +1541341440,1541341695,RU +1541341696,1541341951,DE +1541341952,1541342463,PL +1541342464,1541342719,FR +1541342720,1541342975,PL +1541342976,1541343231,RU +1541343232,1541343487,TR +1541343488,1541343743,IE +1541343744,1541343999,GB +1541344000,1541344255,IL +1541344256,1541344511,IT +1541344512,1541345023,PL +1541345024,1541345279,RU +1541345280,1541345535,GB +1541345536,1541345791,CH +1541345792,1541346047,DE +1541346048,1541346303,UA +1541346304,1541346559,DE +1541346560,1541346815,BE +1541346816,1541347071,FR +1541347072,1541347327,PL +1541347328,1541347583,HR +1541347584,1541347839,RU +1541347840,1541348095,SI +1541348096,1541348351,UA +1541348608,1541348863,HR +1541348864,1541349119,UA +1541349120,1541349375,PL +1541349376,1541349631,RU +1541349632,1541349887,PL +1541349888,1541350143,RU +1541350144,1541350399,FR +1541350400,1541350655,NO +1541350656,1541350911,RU +1541350912,1541351167,AT +1541351168,1541351423,SI +1541351424,1541351679,FR +1541351680,1541351935,DE +1541351936,1541352191,GR +1541352192,1541352447,SI +1541352448,1541352703,RU +1541352704,1541352959,RO +1541352960,1541353215,GB +1541353216,1541353471,SE +1541353472,1541353727,UA +1541353728,1541353983,SI +1541353984,1541354239,RO +1541354240,1541354495,SE +1541354496,1541354751,PL +1541354752,1541355007,UA +1541355008,1541355263,IL +1541355264,1541355519,PL +1541355520,1541355775,NL +1541355776,1541356031,PL +1541356032,1541356287,GB +1541356288,1541356543,UA +1541356544,1541356799,RU +1541356800,1541357055,ES +1541357056,1541357311,FR +1541357312,1541357567,RU +1541357568,1541357823,PL +1541357824,1541358079,HR +1541358080,1541358335,BG +1541358336,1541358591,GB +1541358592,1541358847,PL +1541358848,1541359103,SK +1541359360,1541359615,FR +1541359616,1541359871,PL +1541359872,1541360127,FR +1541360128,1541360383,CZ +1541360640,1541360895,FR +1541360896,1541361151,UA +1541361152,1541361407,PL +1541361408,1541361663,CH +1541361664,1541361919,SI +1541361920,1541362175,PL +1541362176,1541362431,NL +1541362432,1541362687,PL +1541362688,1541362943,FR +1541362944,1541363199,DK +1541363200,1541363455,UA +1541363456,1541363711,IE +1541363712,1541363967,UA +1541364224,1541364479,RU +1541364480,1541364735,AT +1541364736,1541364991,SE +1541364992,1541365247,RU +1541365248,1541365503,GB +1541365504,1541365759,NL +1541365760,1541366015,DE +1541366016,1541366271,UA +1541366272,1541366527,RU +1541366784,1541367039,NO +1541367040,1541367295,AT +1541367296,1541367551,UA +1541367552,1541367807,RU +1541367808,1541368063,GR +1541368064,1541368319,RU +1541368320,1541368575,IL +1541368576,1541368831,FI +1541368832,1541369343,RU +1541369344,1541369599,UA +1541369600,1541369855,GB +1541369856,1541370111,UA +1541370112,1541370367,SI +1541370368,1541370623,DE +1541370624,1541370879,SI +1541370880,1541371135,FI +1541371136,1541371391,RO +1541371392,1541371647,RU +1541371648,1541371903,PL +1541371904,1541372159,RU +1541372160,1541372415,CH +1541372416,1541372671,UA +1541372672,1541373183,NL +1541373184,1541373439,FR +1541373696,1541373951,UA +1541373952,1541374207,RU +1541374208,1541374463,DE +1541374464,1541374719,PL +1541374720,1541374975,NL +1541374976,1541375231,GR +1541375232,1541375487,UA +1541375488,1541375999,PL +1541376000,1541376255,UA +1541376256,1541376767,RU +1541376768,1541377023,FR +1541377024,1541377279,NL +1541377280,1541377535,DE +1541377536,1541377791,PL +1541377792,1541378047,ES +1541378048,1541378303,RU +1541378304,1541378559,DE +1541378560,1541378815,GB +1541378816,1541379071,AT +1541379072,1541379327,RO +1541379328,1541379583,UA +1541379584,1541379839,FR +1541379840,1541380095,DE +1541380096,1541380351,UA +1541380352,1541380607,RU +1541380608,1541380863,CH +1541380864,1541381119,IT +1541381120,1541381375,RO +1541381376,1541381631,TR +1541381632,1541381887,RO +1541381888,1541382143,FR +1541382144,1541382399,PL +1541382400,1541382655,SE +1541382656,1541382911,RS +1541383168,1541383423,CY +1541383424,1541383679,LV +1541383680,1541383935,SI +1541383936,1541384447,PL +1541384704,1541384959,RU +1541384960,1541385215,PL +1541385216,1541385471,NL +1541385472,1541385727,SK +1541385728,1541385983,SI +1541385984,1541386239,PL +1541386240,1541386495,RU +1541386496,1541386751,UA +1541386752,1541387007,RU +1541387008,1541387263,CH +1541387264,1541387519,UA +1541387520,1541387775,RU +1541387776,1541388031,SI +1541388032,1541388287,RO +1541388288,1541388543,PL +1541388544,1541388799,RO +1541388800,1541389055,CH +1541389056,1541389311,NL +1541389312,1541389567,RU +1541389568,1541389823,SI +1541389824,1541390079,RO +1541390080,1541390335,NL +1541390336,1541390591,DK +1541390592,1541390847,SI +1541390848,1541391103,RU +1541391104,1541391359,BE +1541391360,1541391615,PL +1541391616,1541391871,SI +1541391872,1541392127,DE +1541392128,1541392383,RU +1541392384,1541392639,RO +1541392640,1541392895,AT +1541392896,1541393151,DE +1541393152,1541393407,GB +1541393408,1541393663,DE +1541393664,1541393919,UA +1541393920,1541394175,ES +1541394176,1541394431,FR +1541394432,1541394687,CY +1541394688,1541394943,SK +1541394944,1541395199,SA +1541395200,1541395455,DE +1541395456,1541395711,PL +1541395712,1541395967,NO +1541395968,1541396223,UA +1541396224,1541396479,LB +1541396480,1541396735,UA +1541396736,1541396991,RU +1541396992,1541397247,GB +1541397248,1541397503,SE +1541397504,1541397759,SM +1541397760,1541398015,PL +1541398016,1541398271,HU +1541398272,1541398527,UA +1541398528,1541398783,RU +1541398784,1541399039,PL +1541399040,1541399295,RU +1541399296,1541399551,UA +1541399552,1541399807,DE +1541399808,1541400063,RU +1541400064,1541400319,SI +1541400320,1541400831,SE +1541400832,1541401087,NL +1541401088,1541401343,UA +1541401344,1541401599,DK +1541401856,1541402111,HR +1541402112,1541402367,SI +1541402368,1541402623,RU +1541402624,1541402879,FR +1541402880,1541403135,PL +1541403136,1541403391,RU +1541403392,1541403647,EE +1541403648,1541403903,RU +1541403904,1541404159,GE +1541404160,1541404415,RU +1541404416,1541404671,DE +1541404672,1541404927,AT +1541404928,1541405183,HR +1541405184,1541405439,PL +1541405440,1541405951,RU +1541405952,1541406207,FR +1541406208,1541406463,RU +1541406464,1541406719,GB +1541406720,1541407231,LV +1541407232,1541407743,UA +1541407744,1541408255,FI +1541408256,1541408767,FR +1541408768,1541409791,UA +1541409792,1541410303,LV +1541410304,1541410815,RU +1541410816,1541411327,UA +1541411328,1541412863,RU +1541412864,1541413375,UA +1541413376,1541413887,GB +1541413888,1541414399,PL +1541414400,1541414655,UA +1541414656,1541415935,RU +1541415936,1541416447,SE +1541416448,1541416959,PL +1541416960,1541417471,RO +1541417472,1541417983,SK +1541417984,1541418495,UA +1541418496,1541419007,PL +1541419008,1541419519,CZ +1541419520,1541420031,RO +1541420032,1541420543,RU +1541420544,1541421055,NL +1541421056,1541421567,PL +1541421568,1541422079,CZ +1541422080,1541422591,PL +1541422592,1541423103,RU +1541423616,1541424127,AT +1541424128,1541424639,UA +1541424640,1541425151,AT +1541425152,1541425663,IT +1541425664,1541426175,UA +1541426176,1541426687,RU +1541426688,1541427199,UA +1541427200,1541428223,RU +1541428224,1541428735,UA +1541428736,1541429247,RU +1541429248,1541429759,FI +1541429760,1541430271,CZ +1541430272,1541430783,LT +1541430784,1541431295,CH +1541431296,1541431807,UA +1541431808,1541432319,RU +1541432832,1541433343,RU +1541433344,1541433855,PL +1541433856,1541434367,RU +1541434368,1541434879,GB +1541434880,1541435391,IR +1541435392,1541435903,UA +1541435904,1541436415,RU +1541436416,1541437951,PL +1541437952,1541438463,NL +1541438464,1541439487,RU +1541439488,1541439999,PL +1541440000,1541441023,RU +1541441024,1541441535,LT +1541441536,1541442559,RU +1541442560,1541443071,NL +1541443072,1541444607,PL +1541444608,1541445119,FR +1541445120,1541445631,ES +1541445632,1541446143,GB +1541446144,1541446655,RU +1541446656,1541447167,UA +1541447168,1541447679,DE +1541447680,1541448191,NL +1541448192,1541448703,FR +1541448704,1541449215,NL +1541449216,1541449727,RU +1541449728,1541450239,UA +1541450240,1541450751,RU +1541450752,1541451263,SI +1541451264,1541451775,DK +1541451776,1541452287,IR +1541452288,1541452799,UA +1541452800,1541453311,PL +1541453312,1541453823,RU +1541453824,1541454335,PL +1541454336,1541454847,GB +1541454848,1541455359,EE +1541455360,1541455871,GB +1541455872,1541456383,PL +1541456384,1541456895,RU +1541456896,1541457919,PL +1541457920,1541458943,UA +1541458944,1541460479,RU +1541460480,1541460991,DK +1541460992,1541461503,RO +1541461504,1541462527,PL +1541462528,1541463039,RU +1541463040,1541463551,PL +1541463552,1541464063,UA +1541464064,1541464575,PL +1541464576,1541465087,DE +1541465600,1541466111,FR +1541466112,1541467135,RU +1541467136,1541467647,PL +1541467648,1541468159,SI +1541468160,1541468671,ES +1541468672,1541469183,NL +1541469184,1541469695,SE +1541470208,1541470719,NL +1541470720,1541471231,RS +1541471232,1541472255,UA +1541472256,1541473279,GB +1541473280,1541474303,UA +1541474304,1541475327,PL +1541475328,1541476351,RO +1541476352,1541477375,GB +1541477376,1541479423,RU +1541479424,1541480447,PL +1541480448,1541480959,US +1541480960,1541481471,RO +1541481472,1541485567,UA +1541485568,1541486591,IR +1541486592,1541487615,UA +1541487616,1541488639,NO +1541488640,1541489663,PL +1541489664,1541490687,FI +1541490688,1541491711,UA +1541491712,1541492735,RU +1541492736,1541493759,UA +1541493760,1541494783,CZ +1541494784,1541496831,UA +1541496832,1541497855,SI +1541497856,1541498879,RU +1541498880,1541499903,LT +1541499904,1541500927,UA +1541500928,1541501951,RU +1541501952,1541503999,UA +1541504000,1541506047,RU +1541506048,1541507071,PL +1541507072,1541510143,UA +1541510144,1541512191,RU +1541512192,1541513215,PL +1541513216,1541517311,UA +1541517312,1541518335,PL +1541518336,1541519359,IT +1541519360,1541521407,PL +1541521408,1541522431,RU +1541522432,1541524479,UA +1541524480,1541525503,SA +1541525504,1541527551,RU +1541527552,1541528575,SC +1541528576,1541530623,UA +1541530624,1541531647,RU +1541531648,1541532671,UA +1541532672,1541533695,RU +1541533696,1541534719,PL +1541534720,1541535743,IT +1541535744,1541536767,IE +1541536768,1541537791,RU +1541537792,1541538303,GB +1541538304,1541538815,RO +1541538816,1541539327,UA +1541539328,1541539839,PL +1541539840,1541540351,HR +1541540352,1541541375,RU +1541541376,1541541887,UA +1541541888,1541542399,PL +1541542400,1541542911,FR +1541542912,1541543423,MK +1541543424,1541543935,PL +1541543936,1541544447,GB +1541544448,1541544959,PL +1541544960,1541545471,FR +1541545472,1541545983,RU +1541545984,1541546495,LV +1541546496,1541547007,UA +1541547008,1541547519,SE +1541547520,1541548543,PL +1541548544,1541549055,UA +1541549056,1541549567,PL +1541549568,1541550079,DE +1541550080,1541550591,RU +1541550592,1541551103,PL +1541551104,1541552127,RO +1541552128,1541553151,UA +1541553152,1541555199,RU +1541555200,1541556223,PL +1541556480,1541556735,RU +1541556736,1541557247,IT +1541557504,1541557759,SI +1541558016,1541558271,HU +1541558272,1541559295,RU +1541560320,1541561343,DE +1541561344,1541562367,RU +1541562624,1541562879,UA +1541562880,1541563135,FR +1541563136,1541563391,NL +1541563392,1541564415,PL +1541564416,1541565439,RU +1541565440,1541565951,IT +1541565952,1541566463,PL +1541566464,1541567487,SK +1541567488,1541567743,RU +1541567744,1541567999,PL +1541568000,1541568511,SE +1541568512,1541569535,RU +1541569536,1541570559,NL +1541570560,1541573119,RU +1541573120,1541573631,UA +1541573632,1541574655,RU +1541574656,1541575167,SE +1541575168,1541575423,PL +1541575424,1541575679,IT +1541575680,1541577727,RU +1541577728,1541578751,AT +1541579008,1541579263,RU +1541579264,1541579775,DE +1541579776,1541580799,RU +1541580800,1541581311,KZ +1541581312,1541581567,HR +1541581568,1541582847,RU +1541582848,1541583359,ES +1541583360,1541583615,RU +1541583616,1541583871,GE +1541583872,1541584127,SE +1541584128,1541584383,GB +1541584384,1541584895,NL +1541585152,1541585663,RU +1541585664,1541585919,UA +1541585920,1541586431,RU +1541586432,1541587199,UA +1541587200,1541587455,FR +1541587456,1541588991,PL +1541588992,1541589247,RU +1541589248,1541589503,UA +1541589504,1541590015,CH +1541590016,1541590527,RU +1541590528,1541590783,GB +1541590784,1541591039,UA +1541591040,1541592063,RU +1541592064,1541592575,UA +1541592576,1541593087,FR +1541593088,1541594111,CZ +1541594112,1541594367,AL +1541594624,1541595135,RU +1541595136,1541595647,IR +1541595648,1541596159,BG +1541596160,1541597695,PL +1541597696,1541597951,RU +1541597952,1541598207,AM +1541598208,1541599231,PL +1541599232,1541600255,RS +1541600256,1541600511,HR +1541600512,1541600767,IL +1541600768,1541601023,SI +1541601024,1541601279,RU +1541601280,1541601791,DE +1541601792,1541602047,RU +1541602048,1541602303,PL +1541602304,1541603327,UA +1541603328,1541604351,PL +1541604352,1541605119,TR +1541605120,1541605375,CZ +1541605376,1541606911,RU +1541606912,1541607423,UZ +1541607424,1541608447,RU +1541608448,1541608703,DE +1541608704,1541608959,PL +1541608960,1541609215,SA +1541609216,1541609471,RU +1541609472,1541609983,SA +1541609984,1541610239,GB +1541610240,1541610495,NL +1541610496,1541611775,RU +1541611776,1541612031,RO +1541612032,1541612543,RU +1541612544,1541614079,PL +1541614080,1541614335,UA +1541614336,1541614591,SI +1541614592,1541615615,RU +1541615616,1541615871,CH +1541615872,1541616127,SE +1541616128,1541617663,RU +1541617664,1541619199,PL +1541619200,1541619455,GB +1541619456,1541620735,PL +1541620736,1541620991,RU +1541620992,1541621247,UA +1541621248,1541621759,IL +1541621760,1541622271,RO +1541622272,1541622527,RU +1541622528,1541622783,NL +1541622784,1541623295,PL +1541623296,1541623551,GB +1541623552,1541623807,RU +1541623808,1541624831,PL +1541624832,1541625855,IR +1541625856,1541626367,PL +1541626368,1541626623,RO +1541626624,1541627903,RU +1541627904,1541628415,CZ +1541628416,1541628927,DE +1541628928,1541629183,PT +1541629184,1541629439,LV +1541629440,1541630975,PL +1541630976,1541631231,GR +1541631232,1541631487,IT +1541631488,1541631999,SI +1541632000,1541632511,RU +1541632512,1541632767,NL +1541632768,1541634303,PL +1541634304,1541634559,MD +1541634560,1541635071,PL +1541635072,1541636095,GB +1541636096,1541636863,AT +1541636864,1541637119,RO +1541637632,1541638143,CZ +1541638144,1541638399,RU +1541638656,1541639167,HU +1541639168,1541640191,RU +1541640192,1541641215,KZ +1541641216,1541641727,RU +1541641728,1541642239,UA +1541642240,1541643263,RU +1541643264,1541644287,PL +1541644288,1541645311,RU +1541645312,1541645823,IL +1541645824,1541646079,RO +1541646080,1541646335,PL +1541646336,1541648383,RU +1541648384,1541648639,PL +1541648640,1541648895,DK +1541648896,1541649151,GB +1541649152,1541649407,NL +1541649408,1541650431,UA +1541650432,1541650687,RU +1541650688,1541650943,MD +1541650944,1541651199,SE +1541651200,1541651455,FI +1541651456,1541652479,RU +1541652480,1541652991,FI +1541652992,1541653247,FR +1541653248,1541653503,CZ +1541653504,1541654015,PL +1541654016,1541654271,RU +1541654272,1541655551,PL +1541655552,1541656063,AT +1541656064,1541656575,UA +1541656576,1541656831,SE +1541656832,1541657087,BE +1541657088,1541657599,RU +1541657600,1541659647,PL +1541659648,1541660671,GB +1541660672,1541661695,SK +1541661696,1541661951,RU +1541661952,1541662207,NL +1541662208,1541662719,AT +1541662720,1541663743,CZ +1541663744,1541664767,AT +1541664768,1541665279,GB +1541665280,1541666047,RU +1541666048,1541666303,GB +1541666816,1541667839,NO +1541667840,1541668095,CH +1541668352,1541668607,UA +1541668608,1541668863,GE +1541668864,1541670911,GB +1541670912,1541671423,PL +1541671424,1541671679,RU +1541671680,1541671935,PL +1541671936,1541672959,UA +1541672960,1541674495,RS +1541674496,1541675007,KG +1541675008,1541675519,IE +1541675520,1541676031,RU +1541676032,1541676287,PL +1541676288,1541676543,RO +1541676544,1541677055,RU +1541677056,1541678079,PL +1541678080,1541678591,RO +1541678592,1541678847,BG +1541678848,1541679103,KZ +1541679104,1541679615,RU +1541679616,1541680127,PL +1541680128,1541681151,CZ +1541681152,1541682175,RU +1541682176,1541682687,DE +1541682688,1541683199,RU +1541683200,1541683455,PL +1541683456,1541683711,RU +1541683712,1541684223,UA +1541684224,1541684735,CH +1541684736,1541686271,RU +1541686272,1541687295,UA +1541687296,1541688319,GB +1541688320,1541688831,RU +1541688832,1541689343,GB +1541689344,1541690367,PL +1541690368,1541691391,LT +1541691392,1541691903,PL +1541691904,1541692159,SE +1541692160,1541692415,ES +1541692416,1541693439,PL +1541693440,1541694463,RU +1541694464,1541694719,CZ +1541694720,1541694975,DE +1541694976,1541695487,RU +1541695488,1541696511,DE +1541696512,1541697535,MD +1541697536,1541698047,PL +1541698048,1541698303,DK +1541698304,1541698559,GB +1541698560,1541699327,RU +1541699328,1541699583,RO +1541699584,1541700095,RU +1541700096,1541700607,UA +1541700608,1541700863,RU +1541700864,1541701119,PL +1541701120,1541701631,IL +1541701632,1541702655,SA +1541703424,1541703679,RU +1541703680,1541704703,PL +1541704704,1541705727,RO +1541705728,1541705983,DE +1541705984,1541706239,RO +1541706240,1541706751,UA +1541706752,1541707263,RU +1541707264,1541707519,DE +1541707520,1541707775,NL +1541707776,1541708799,DE +1541708800,1541709823,PL +1541710080,1541710335,RU +1541710336,1541710847,IL +1541710848,1541711871,SK +1541711872,1541712127,FR +1541712128,1541712383,TR +1541712384,1541712895,DE +1541713920,1541714175,NL +1541714176,1541716223,RU +1541716224,1541716479,PL +1541716480,1541716991,GB +1541716992,1541717247,FR +1541717248,1541717503,IR +1541717504,1541718015,DE +1541718016,1541718271,KZ +1541718272,1541719039,NO +1541719040,1541720063,PL +1541720064,1541721087,RU +1541721088,1541721343,PL +1541721344,1541721599,RU +1541721600,1541721855,GB +1541721856,1541722111,SI +1541722112,1541723135,RU +1541723136,1541723647,HU +1541723648,1541723903,NO +1541723904,1541724159,BE +1541724160,1541725183,UA +1541725184,1541727487,RU +1541727488,1541727743,UA +1541727744,1541727999,RU +1541728256,1541729023,GB +1541729024,1541729279,DE +1541729280,1541729535,UA +1541729536,1541729791,PL +1541729792,1541730303,RU +1541730304,1541730815,ES +1541730816,1541731071,GB +1541731072,1541731327,DE +1541731328,1541731839,SK +1541731840,1541732351,RU +1541732352,1541732607,IL +1541732608,1541732863,RO +1541732864,1541733119,RU +1541733376,1541734143,RS +1541734144,1541734399,TR +1541734400,1541734911,RO +1541734912,1541735167,RU +1541735168,1541735423,DE +1541735424,1541735679,GB +1541735936,1541736447,RO +1541736448,1541737471,RU +1541737472,1541739519,RO +1541739520,1541739775,FR +1541739776,1541740031,NO +1541740032,1541740287,PL +1541740288,1541740543,NL +1541740544,1541740799,CZ +1541741056,1541741567,PL +1541741568,1541742079,SK +1541742080,1541742591,RO +1541742592,1541743103,SA +1541743104,1541743615,TR +1541743616,1541744639,SK +1541744640,1541745663,PL +1541745664,1541746175,TR +1541746688,1541746943,RU +1541746944,1541747199,NL +1541747200,1541747711,RU +1541747712,1541748735,UA +1541748992,1541749247,AT +1541749248,1541749503,ES +1541749504,1541749759,RU +1541749760,1541750783,NL +1541750784,1541751295,AE +1541751296,1541751807,UA +1541751808,1541752831,PL +1541752832,1541753087,SI +1541753088,1541753343,GB +1541753344,1541753855,RU +1541753856,1541754879,UA +1541754880,1541757439,PL +1541757952,1541758207,GB +1541758208,1541758463,HU +1541758464,1541758719,BY +1541758720,1541758975,FR +1541758976,1541760255,RU +1541760256,1541760511,UA +1541760512,1541761023,CH +1541761024,1541761535,KG +1541761536,1541762047,PL +1541762048,1541763583,RU +1541763584,1541763839,SE +1541763840,1541764095,UA +1541764096,1541765119,RU +1541765120,1541766143,UA +1541766144,1541767167,GB +1541767168,1541767679,UA +1541767680,1541768191,FR +1541769216,1541769471,FR +1541769472,1541770239,FI +1541770240,1541770495,CH +1541770496,1541770751,SE +1541770752,1541771263,NO +1541771264,1541771775,NL +1541771776,1541772031,RU +1541772032,1541772287,RO +1541772288,1541773311,KZ +1541773312,1541773823,NL +1541773824,1541774079,RU +1541774080,1541774335,TR +1541774336,1541775359,RO +1541775360,1541776895,UZ +1541776896,1541777151,GB +1541777152,1541777407,UA +1541777408,1541778431,DE +1541778432,1541778687,FR +1541778688,1541779455,GB +1541779456,1541779967,RU +1541779968,1541780479,DE +1541780480,1541780735,ES +1541780736,1541780991,GB +1541781248,1541781503,RO +1541781504,1541781759,TR +1541781760,1541782015,RU +1541782016,1541782271,RO +1541782272,1541782527,GB +1541782528,1541783551,RU +1541783552,1541783807,IE +1541783808,1541784063,PL +1541784064,1541784575,DE +1541784576,1541785855,RU +1541785856,1541786111,GB +1541786112,1541786623,RU +1541786624,1541787647,UA +1541787648,1541788671,RU +1541788672,1541789183,PL +1541789184,1541789695,IR +1541789696,1541790719,UA +1541790720,1541790975,SA +1541790976,1541791231,RU +1541791232,1541791743,GB +1541791744,1541792255,KG +1541792256,1541792511,UA +1541792512,1541792767,FR +1541792768,1541793023,RO +1541793280,1541793791,FR +1541793792,1541794047,NL +1541794048,1541794815,RU +1541794816,1541795071,CH +1541795072,1541795327,RU +1541795328,1541795583,PL +1541795584,1541795839,ES +1541795840,1541796863,UA +1541796864,1541797375,RU +1541797376,1541797887,GB +1541797888,1541798911,PL +1541798912,1541799935,CZ +1541799936,1541800447,FR +1541800448,1541800959,AT +1541800960,1541801471,FI +1541801472,1541801983,BG +1541801984,1541802495,PL +1541802496,1541803007,RU +1541803008,1541804031,LT +1541804032,1541804287,GB +1541804288,1541804543,PL +1541804544,1541805567,RU +1541805568,1541805823,DE +1541805824,1541806079,RU +1541806080,1541806335,PL +1541806336,1541806591,UA +1541806592,1541806847,RU +1541807104,1541808127,UA +1541808128,1541808383,IR +1541808384,1541809151,NL +1541809152,1541809663,PL +1541809664,1541810175,GB +1541810176,1541810431,PT +1541810432,1541810687,AE +1541810688,1541811199,PL +1541811200,1541811711,SK +1541811712,1541811967,NL +1541811968,1541812991,RU +1541812992,1541813247,NL +1541813248,1541813759,LT +1541813760,1541814015,RU +1541814016,1541814783,ES +1541814784,1541815295,PL +1541815296,1541816319,RU +1541816320,1541816575,BE +1541816576,1541816831,RU +1541816832,1541817343,FR +1541817344,1541818367,DK +1541818368,1541818623,RU +1541818624,1541818879,TR +1541818880,1541819903,PL +1541819904,1541820159,SE +1541820160,1541820415,IL +1541820416,1541820671,MD +1541820672,1541820927,TR +1541820928,1541821183,RU +1541821184,1541821439,DE +1541821440,1541821695,RU +1541821696,1541821951,TR +1541821952,1541822975,PL +1541822976,1541823231,SI +1541823232,1541823487,RU +1541823488,1541823999,UA +1541824000,1541824511,RU +1541824512,1541824767,IT +1541824768,1541825023,GB +1541825024,1541825535,PL +1541825536,1541826047,RU +1541826048,1541826559,IT +1541826560,1541827071,ES +1541827072,1541827327,LV +1541827328,1541827583,RU +1541827584,1541828095,SE +1541828608,1541830911,PL +1541830912,1541831167,UA +1541831168,1541831423,PL +1541831424,1541831679,RO +1541831680,1541832191,SA +1541832192,1541833983,SE +1541833984,1541834239,RU +1541834496,1541834751,RU +1541835776,1541836287,CH +1541836288,1541836543,AT +1541836800,1541837055,CZ +1541837056,1541837311,IT +1541837312,1541837567,RU +1541837824,1541838079,PL +1541838080,1541839871,RU +1541839872,1541840383,PL +1541840384,1541840639,RU +1541840640,1541840895,PL +1541840896,1541841407,DE +1541841408,1541842943,PL +1541842944,1541843199,GB +1541843200,1541843455,FR +1541843456,1541843967,BE +1541843968,1541844991,DE +1541844992,1541846015,BE +1541846016,1541846271,PL +1541846272,1541846527,GB +1541847040,1541848063,RU +1541848064,1541848319,HU +1541848320,1541848575,GB +1541848576,1541849087,RU +1541849088,1541850111,BG +1541850112,1541850623,RU +1541850624,1541851135,UA +1541851136,1541852671,PL +1541852672,1541853183,RO +1541853184,1541854207,RU +1541854208,1541854463,FR +1541854464,1541854719,KW +1541854720,1541854975,MD +1541854976,1541855999,RU +1541856000,1541856255,MK +1541856256,1541856511,UA +1541856512,1541857279,PL +1541857280,1541857535,RU +1541857536,1541857791,KW +1541857792,1541858303,RU +1541858816,1541859327,BG +1541859328,1541859583,RO +1541859584,1541859839,PL +1541859840,1541860095,RO +1541860096,1541860351,FR +1541860352,1541860607,IL +1541860608,1541860863,NL +1541860864,1541861119,SI +1541861120,1541861375,DK +1541861376,1541861887,RO +1541861888,1541862143,AT +1541862144,1541862399,GB +1541862400,1541862911,NL +1541862912,1541863167,GB +1541863168,1541863423,RU +1541863424,1541863679,RO +1541863680,1541863935,CH +1541863936,1541864191,ES +1541864192,1541864447,GB +1541864448,1541864959,RU +1541864960,1541865471,AL +1541865472,1541865727,RO +1541865728,1541865983,UA +1541865984,1541866239,PL +1541866240,1541866495,FR +1541866496,1541867263,NL +1541867264,1541867519,RO +1541867520,1541867775,RU +1541867776,1541868031,PL +1541868032,1541868287,MT +1541868288,1541868543,AE +1541868544,1541869567,PL +1541869568,1541870079,RU +1541870080,1541871103,PL +1541871104,1541871359,AT +1541871360,1541872639,PL +1541872640,1541873663,CZ +1541873664,1541874175,PL +1541874176,1541874687,RU +1541874688,1541875711,PL +1541875712,1541876735,UA +1541876736,1541877247,PL +1541877248,1541877503,GB +1541877760,1541878783,SA +1541878784,1541879295,PL +1541879296,1541879807,UA +1541879808,1541880831,UZ +1541880832,1541881343,PL +1541881344,1541881599,IT +1541881600,1541881855,SE +1541881856,1541882879,RU +1541882880,1541883135,LV +1541883136,1541883391,UA +1541883392,1541884927,PL +1541884928,1541885951,LT +1541885952,1541886975,PL +1541886976,1541887999,UA +1541888000,1541888255,RS +1541888512,1541889023,GB +1541889024,1541889535,PL +1541889536,1541890303,RU +1541890304,1541890559,DE +1541890560,1541891071,UA +1541891072,1541893119,PL +1541893120,1541893631,BE +1541893632,1541894143,PL +1541894144,1541895167,RU +1541895168,1541897727,PL +1541897984,1541898239,UA +1541898240,1541900799,RU +1541900800,1541901055,RO +1541901056,1541901311,FR +1541901312,1541901567,PL +1541901568,1541901823,RU +1541901824,1541902335,UA +1541902336,1541902847,GB +1541902848,1541903103,RU +1541903104,1541903359,DK +1541903360,1541904383,UA +1541904384,1541904639,PL +1541904640,1541904895,SE +1541904896,1541905407,GB +1541905664,1541905919,PL +1541905920,1541906431,RS +1541906432,1541906687,UA +1541906688,1541907455,RU +1541907456,1541908479,IT +1541908480,1541908991,PL +1541908992,1541909247,UA +1541909248,1541909503,CZ +1541909504,1541910015,NL +1541910016,1541910527,FR +1541910528,1541911039,RU +1541911040,1541911295,PL +1541911296,1541911551,IT +1541911552,1541912575,RU +1541912576,1541912831,NL +1541912832,1541913087,UA +1541913088,1541914623,RU +1541914624,1541915647,IL +1541915648,1541916671,RU +1541917696,1541917951,CH +1541917952,1541918207,PL +1541918208,1541918463,UA +1541918464,1541919743,RO +1541919744,1541919999,DK +1541920000,1541920767,RU +1541920768,1541921279,PT +1541921280,1541921791,RU +1541921792,1541922047,DE +1541922048,1541922303,PL +1541922304,1541922559,RU +1541922560,1541923839,RO +1541923840,1541924095,FR +1541924096,1541924351,UA +1541924352,1541924863,PL +1541924864,1541925119,RO +1541925120,1541926911,RU +1541926912,1541927167,UA +1541927168,1541927679,PL +1541927680,1541927935,DE +1541927936,1541929983,PL +1541929984,1541931007,RU +1541931008,1541932031,UA +1541932032,1541932543,PL +1541932544,1541935103,RU +1541935104,1541936383,RO +1541936384,1541936639,UA +1541936640,1541936895,DE +1541936896,1541937151,FR +1541937152,1541937663,NL +1541937664,1541937919,GE +1541937920,1541938175,PL +1541938176,1541939199,UA +1541939200,1541939967,RU +1541939968,1541940223,ES +1541940224,1541940479,GB +1541940480,1541940735,CH +1541940736,1541940991,PL +1541940992,1541941247,RU +1541941248,1541942271,FR +1541942272,1541944831,PL +1541944832,1541945087,DE +1541945088,1541945855,RO +1541945856,1541946111,PL +1541946112,1541946879,SE +1541946880,1541947391,PL +1541947392,1541948927,IR +1541948928,1541949183,RU +1541949184,1541949439,ES +1541949440,1541950463,IR +1541950464,1541951487,ES +1541951488,1541951743,RU +1541951744,1541951999,ES +1541952000,1541952255,CZ +1541952256,1541952511,NO +1541952512,1541953535,CZ +1541953536,1541954047,LU +1541954048,1541954559,PL +1541954560,1541955583,RU +1541955584,1541956095,DE +1541956096,1541956351,RO +1541956608,1541957119,LB +1541957120,1541957375,PL +1541957376,1541957631,UA +1541957632,1541957887,GB +1541957888,1541958143,NL +1541958144,1541958655,RS +1541958656,1541959679,RU +1541959680,1541959935,PL +1541959936,1541960191,RU +1541960192,1541960703,NL +1541960704,1541962751,RU +1541962752,1541963263,GB +1541963264,1541963519,RU +1541963520,1541963775,PL +1541963776,1541964031,UA +1541964288,1541964543,NL +1541964544,1541965823,RU +1541965824,1541966847,US +1541966848,1541967871,PL +1541967872,1541968895,RU +1541968896,1541969919,GB +1541969920,1541970175,RO +1541970176,1541970431,GB +1541970432,1541971199,FI +1541971200,1541971967,UA +1541971968,1541972479,PL +1541972480,1541972735,RU +1541972736,1541972991,AT +1541972992,1541974015,PL +1541974016,1541975551,RU +1541975552,1541975807,TR +1541975808,1541976319,PL +1541976320,1541977087,UA +1541977088,1541977343,IT +1541977344,1541977599,GB +1541977600,1541977855,RO +1541977856,1541978111,PL +1541978112,1541978879,RO +1541978880,1541979135,FR +1541979136,1541979647,RU +1541979648,1541981183,PL +1541981184,1541981951,RU +1541981952,1541982207,UA +1541982208,1541982719,RS +1541982720,1541984255,RU +1541984512,1541984767,BG +1541984768,1541985279,RO +1541985280,1541986303,CZ +1541986304,1541986815,RU +1541986816,1541988351,SK +1541988352,1541988607,FR +1541988608,1541988863,RU +1541988864,1541989631,RO +1541989632,1541989887,LI +1541989888,1541990399,RU +1541990400,1541990911,AT +1541990912,1541991167,SI +1541991424,1541991935,RS +1541991936,1541992191,UA +1541992192,1541992447,SI +1541992448,1541992959,UA +1541992960,1541993215,FR +1541993216,1541994239,RU +1541994240,1541994495,CZ +1541994496,1541995519,PL +1541995520,1541996031,RU +1541996032,1541996287,RO +1541996544,1541997567,RO +1541997568,1541997823,RU +1541997824,1541998079,GB +1541998080,1541998335,NL +1541998336,1541998591,AT +1541998592,1541999615,DE +1541999616,1542000127,AT +1542000128,1542000383,NO +1542000384,1542000639,GE +1542000640,1542000895,GB +1542000896,1542001151,UA +1542001152,1542001663,PL +1542001920,1542002175,HU +1542002176,1542002687,NL +1542002688,1542002943,RS +1542002944,1542003199,PL +1542003200,1542003711,RO +1542003712,1542004735,RU +1542004736,1542004991,BG +1542004992,1542005247,GB +1542005248,1542005503,PL +1542005504,1542005759,DE +1542005760,1542006271,HR +1542006272,1542008831,RU +1542008832,1542009343,UA +1542009344,1542009599,SE +1542009600,1542009855,FR +1542009856,1542010367,NL +1542010368,1542010879,RU +1542010880,1542011903,IR +1542011904,1542012159,PL +1542012160,1542012415,RU +1542012416,1542012671,GB +1542012672,1542013951,RU +1542013952,1542014207,FR +1542014208,1542017023,PL +1542017024,1542017279,TR +1542017280,1542017535,GB +1542017536,1542017791,RU +1542017792,1542018047,GB +1542018048,1542019071,DE +1542019072,1542019327,RU +1542019584,1542020095,UA +1542020096,1542021119,RU +1542021120,1542023167,UA +1542023168,1542023423,PL +1542023424,1542023679,NL +1542023680,1542023935,RO +1542023936,1542024191,PL +1542024192,1542025215,UA +1542025216,1542026239,PL +1542026240,1542026751,FI +1542026752,1542027007,BE +1542027008,1542027263,FR +1542027776,1542028031,FR +1542028032,1542028287,UA +1542028288,1542028543,GB +1542028544,1542028799,FI +1542028800,1542029055,CH +1542029056,1542029311,UA +1542029312,1542029823,GB +1542030336,1542031359,RU +1542031360,1542032383,PL +1542032384,1542032639,UA +1542032640,1542032895,SA +1542032896,1542033407,DK +1542033408,1542035199,RU +1542035200,1542035455,UA +1542035456,1542036479,GB +1542036480,1542038271,PL +1542038272,1542038527,SI +1542038528,1542040575,RU +1542040576,1542041087,UA +1542041088,1542041343,SA +1542041344,1542041599,RU +1542041600,1542042623,LT +1542042624,1542043135,IT +1542043136,1542043391,CH +1542043392,1542043647,GB +1542043648,1542044671,PL +1542044672,1542045183,RU +1542045184,1542045439,RO +1542045440,1542045695,AT +1542045696,1542046719,RO +1542046720,1542047743,PL +1542047744,1542048767,RO +1542048768,1542049279,PL +1542049280,1542049791,BE +1542049792,1542050815,CZ +1542050816,1542051327,RU +1542051328,1542051839,LV +1542051840,1542053887,RU +1542053888,1542054399,NL +1542054400,1542054655,RU +1542054656,1542054911,AT +1542054912,1542055423,PL +1542055424,1542055935,RU +1542055936,1542057471,PL +1542057472,1542060031,RU +1542060032,1542060287,SK +1542060288,1542060543,RO +1542060544,1542061055,PL +1542061056,1542062079,IT +1542062080,1542064127,UA +1542064128,1542064383,PL +1542064384,1542064639,FR +1542064640,1542065151,RU +1542065152,1542066175,PL +1542066176,1542066431,RU +1542066432,1542066687,NL +1542066688,1542066943,GB +1542066944,1542067199,BG +1542067456,1542067711,BG +1542067712,1542067967,US +1542067968,1542068223,GB +1542068224,1542069759,UA +1542069760,1542070015,DE +1542070016,1542071295,UA +1542071296,1542071551,CN +1542071552,1542071807,UA +1542071808,1542072319,DE +1542072320,1542073343,UA +1542073344,1542073855,PL +1542073856,1542074111,HR +1542074112,1542074367,UA +1542074368,1542074623,GB +1542074624,1542074879,PL +1542074880,1542075391,NL +1542075392,1542075647,CH +1542075648,1542075903,RU +1542075904,1542076159,IE +1542076160,1542076415,DE +1542076416,1542077439,RO +1542077440,1542078975,RU +1542078976,1542079487,PL +1542079488,1542080511,RU +1542080512,1542082559,UA +1542082560,1542083583,RU +1542083584,1542085631,UA +1542085632,1542086655,BG +1542086656,1542087423,RU +1542087424,1542087679,NL +1542087680,1542088703,PL +1542088704,1542089727,FR +1542089728,1542090751,RU +1542090752,1542091775,PL +1542091776,1542092799,RU +1542092800,1542093823,RO +1542093824,1542095871,PL +1542095872,1542096895,RS +1542096896,1542098431,UA +1542098432,1542099199,PL +1542099200,1542099455,RU +1542099456,1542099711,PL +1542099712,1542099967,RU +1542099968,1542100223,NL +1542100224,1542100479,DK +1542100480,1542100991,RO +1542100992,1542102015,RU +1542102016,1542103039,RO +1542103040,1542103295,CH +1542103296,1542103551,RU +1542103552,1542104063,CZ +1542104064,1542105087,RU +1542105088,1542105599,RO +1542105600,1542105855,RU +1542105856,1542106111,DE +1542106112,1542107135,RU +1542107136,1542107391,PL +1542107392,1542107903,RU +1542107904,1542108159,AT +1542108160,1542109183,RU +1542109184,1542109695,GB +1542109696,1542110207,PL +1542110208,1542110463,RU +1542110464,1542110719,CH +1542110720,1542111231,RS +1542111232,1542111487,SE +1542111488,1542111743,NL +1542111744,1542112255,FR +1542112256,1542113279,UA +1542113280,1542113535,LT +1542113536,1542113791,GB +1542113792,1542114047,RU +1542114048,1542114303,BE +1542114304,1542114815,FI +1542114816,1542115071,NL +1542115072,1542115327,PL +1542115328,1542116351,UA +1542116352,1542116607,RO +1542116608,1542116863,DE +1542116864,1542117119,GB +1542117120,1542117631,DE +1542117632,1542117887,PL +1542117888,1542118399,UZ +1542118400,1542119423,RO +1542119424,1542119935,RU +1542119936,1542120447,UA +1542120448,1542120703,GE +1542120704,1542120959,AT +1542120960,1542121471,BE +1542121472,1542121727,PL +1542121728,1542123519,FR +1542123520,1542123775,SE +1542123776,1542124543,RO +1542124544,1542124799,DE +1542124800,1542125567,PL +1542125568,1542126591,CZ +1542126592,1542127103,PL +1542127104,1542127359,GB +1542127616,1542128127,PL +1542128128,1542128383,RU +1542128384,1542129151,RO +1542129152,1542129407,IS +1542129408,1542129663,RU +1542129664,1542130687,DE +1542130688,1542131711,UA +1542131712,1542134271,PL +1542134272,1542136319,RU +1542136320,1542136831,DE +1542136832,1542137855,RU +1542137856,1542138367,ES +1542138368,1542138623,RU +1542138624,1542138879,RO +1542138880,1542139135,GB +1542139136,1542139391,DE +1542139392,1542139647,UA +1542139648,1542139903,DE +1542139904,1542140927,ES +1542140928,1542141951,SK +1542141952,1542142975,GB +1542142976,1542143999,NO +1542144000,1542144255,TR +1542144256,1542144511,GB +1542144512,1542144767,RU +1542144768,1542146047,UA +1542146048,1542147583,RU +1542147584,1542148095,FR +1542148096,1542148607,RU +1542148608,1542148863,SI +1542148864,1542149119,NL +1542149120,1542150143,UA +1542150144,1542152191,RU +1542152192,1542153215,IE +1542153216,1542153471,DK +1542153472,1542153727,RU +1542153728,1542153983,UA +1542153984,1542154239,RU +1542154240,1542154751,TR +1542154752,1542155007,RU +1542155008,1542155263,IL +1542155264,1542156287,ES +1542156288,1542156543,RU +1542156544,1542156799,RO +1542156800,1542157311,DE +1542157312,1542157567,RO +1542157568,1542157823,IE +1542157824,1542158079,AZ +1542158080,1542158335,RU +1542158336,1542158847,IT +1542158848,1542159359,RO +1542159360,1542160127,PL +1542160128,1542160383,RU +1542160384,1542160639,UA +1542160640,1542160726,NL +1542160727,1542160727,UA +1542160728,1542160847,NL +1542160848,1542160848,UA +1542160849,1542160895,NL +1542160896,1542161407,GB +1542161408,1542162431,NL +1542162432,1542162943,RU +1542162944,1542163199,FR +1542163200,1542163455,DK +1542163456,1542163711,GB +1542163712,1542163967,FR +1542163968,1542164479,UA +1542164480,1542165503,RU +1542165760,1542166015,PL +1542166016,1542166527,IL +1542166528,1542167551,PL +1542167552,1542168319,RU +1542168320,1542168575,AE +1542168576,1542169599,PL +1542169600,1542169855,BG +1542169856,1542170623,RO +1542170624,1542170879,SE +1542170880,1542171135,RU +1542171136,1542171647,HR +1542171648,1542172159,GB +1542172160,1542172415,NL +1542172416,1542172671,RU +1542172672,1542173695,KZ +1542173696,1542174207,RU +1542174208,1542174719,CZ +1542174720,1542176767,RU +1542176768,1542177791,PL +1542177792,1542178815,UA +1542178816,1542179327,CZ +1542179328,1542179583,PL +1542179584,1542179839,RU +1542179840,1542180863,PL +1542180864,1542181887,DE +1542181888,1542182143,CH +1542182144,1542182399,RU +1542182400,1542182655,GB +1542182656,1542182911,FR +1542182912,1542183935,PL +1542183936,1542184191,GB +1542184192,1542184447,RU +1542184448,1542184959,PL +1542184960,1542185983,UA +1542185984,1542187007,PL +1542187008,1542187263,DK +1542187264,1542187519,RU +1542187520,1542188031,GB +1542188032,1542188287,DE +1542188288,1542188543,NL +1542188544,1542189055,PL +1542189056,1542189311,DE +1542189568,1542189823,SI +1542189824,1542190079,DE +1542190080,1542191103,RU +1542191104,1542192127,BG +1542192128,1542193407,PL +1542193408,1542193663,SI +1542193664,1542194175,RU +1542194176,1542195711,PL +1542195712,1542196479,RU +1542196480,1542196735,PL +1542196736,1542197247,RU +1542197248,1542197503,DK +1542197504,1542198015,GB +1542198016,1542198271,NL +1542198272,1542198783,PL +1542198784,1542199551,RU +1542199552,1542199807,FR +1542199808,1542200319,GB +1542200320,1542200575,DK +1542200576,1542200831,US +1542200832,1542201343,RU +1542201344,1542202367,PL +1542202368,1542202623,UA +1542202624,1542202879,HR +1542202880,1542203391,EE +1542203392,1542204415,CZ +1542204416,1542204671,EE +1542204672,1542204927,CH +1542204928,1542205439,RO +1542205440,1542206463,RU +1542206464,1542207487,PL +1542207488,1542207743,GB +1542207744,1542207999,PL +1542208000,1542208255,RO +1542208256,1542208511,ES +1542208512,1542209535,RU +1542209536,1542211583,SK +1542211584,1542212607,PL +1542212608,1542213119,RO +1542213120,1542213375,CH +1542213376,1542213631,RO +1542213632,1542214143,RU +1542214144,1542214399,SK +1542214400,1542214655,NL +1542214656,1542215679,PL +1542215680,1542216703,RO +1542216704,1542217727,RU +1542217728,1542218751,UA +1542218752,1542220031,RU +1542220032,1542220287,PL +1542220288,1542220799,DE +1542220800,1542222847,RU +1542222848,1542223103,SE +1542223104,1542223359,GB +1542223360,1542223871,UA +1542224384,1542224639,DE +1542224640,1542224895,DK +1542224896,1542225151,RU +1542225152,1542225407,PL +1542225408,1542225919,UA +1542225920,1542227455,PL +1542227456,1542227967,UA +1542227968,1542228223,RU +1542228224,1542228479,PL +1542228480,1542228991,UA +1542228992,1542230015,RU +1542230016,1542231039,BG +1542231040,1542232063,RU +1542232064,1542232319,GB +1542232320,1542232575,FR +1542232576,1542233087,RU +1542233088,1542234111,UA +1542234112,1542234367,AT +1542234368,1542234623,FR +1542234624,1542234879,AE +1542234880,1542235135,PL +1542235136,1542236159,RU +1542236160,1542236671,IR +1542236672,1542236927,RO +1542236928,1542237183,UA +1542237184,1542238207,PL +1542238208,1542239743,RU +1542239744,1542239999,HU +1542240000,1542240255,RU +1542240256,1542240767,UA +1542240768,1542241023,DK +1542241024,1542241279,GB +1542241280,1542241535,LV +1542241536,1542241791,NL +1542241792,1542242303,GB +1542242304,1542243071,NL +1542243072,1542244863,RU +1542244864,1542245375,NL +1542245376,1542245887,RU +1542245888,1542246143,GB +1542246144,1542246911,SE +1542246912,1542247423,DK +1542247424,1542247679,SE +1542247936,1542248447,NL +1542248448,1542249471,RO +1542249472,1542249727,RU +1542249728,1542249983,UA +1542249984,1542250239,EE +1542250240,1542250495,RO +1542250496,1542251519,UA +1542251520,1542251775,RO +1542251776,1542252031,PL +1542252032,1542252543,RO +1542252544,1542253055,PL +1542253056,1542253567,RU +1542253568,1542253823,LB +1542253824,1542254079,RO +1542254080,1542254335,RU +1542254336,1542254591,FR +1542254592,1542255615,RO +1542255616,1542256127,BE +1542256128,1542256639,RU +1542256640,1542257663,UA +1542257664,1542258175,RU +1542258176,1542258687,FR +1542258688,1542262783,UA +1542262784,1542263295,IT +1542263296,1542263807,PL +1542263808,1542264063,RU +1542264064,1542264831,SA +1542264832,1542265855,UA +1542265856,1542266879,SA +1542266880,1542267135,RU +1542267136,1542267391,SI +1542267392,1542267903,NO +1542267904,1542268159,PL +1542268160,1542268415,RU +1542268416,1542268927,FR +1542268928,1542269439,UA +1542269440,1542269695,LV +1542269696,1542269951,NL +1542269952,1542271487,RO +1542271488,1542271743,PS +1542271744,1542271999,CZ +1542272000,1542272255,PL +1542272512,1542273023,RU +1542273024,1542274047,BG +1542274048,1542275071,PL +1542275072,1542275327,UA +1542275328,1542275583,AT +1542275584,1542276095,SE +1542276096,1542277631,PL +1542277632,1542278143,GB +1542278144,1542278399,RU +1542278400,1542278655,PL +1542278656,1542278911,NL +1542278912,1542279679,PL +1542279680,1542280191,RU +1542280192,1542280959,PL +1542280960,1542281215,GB +1542281216,1542281727,DE +1542281728,1542281983,SE +1542281984,1542282751,RO +1542282752,1542283007,RU +1542283008,1542283263,SE +1542283264,1542283519,AT +1542283520,1542283775,RU +1542283776,1542284287,LV +1542284288,1542284799,DE +1542284800,1542285311,BG +1542285312,1542285823,RU +1542285824,1542286079,SE +1542286080,1542287359,UA +1542287360,1542287871,PL +1542287872,1542288639,UA +1542288640,1542288895,DE +1542288896,1542289151,PL +1542289152,1542291967,UA +1542291968,1542292479,RO +1542292480,1542293503,SI +1542293504,1542294527,PL +1542294528,1542295039,SE +1542295040,1542295295,UA +1542295296,1542295551,AT +1542295552,1542296831,RU +1542296832,1542297087,PL +1542297088,1542297343,RU +1542297344,1542297599,FI +1542297600,1542297855,UA +1542298112,1542300159,PL +1542300160,1542300671,RU +1542300672,1542301695,UA +1542301696,1542302463,SK +1542302464,1542303231,PL +1542303232,1542303999,GB +1542304000,1542304255,FR +1542304256,1542305279,RU +1542305280,1542305791,UA +1542305792,1542306047,FR +1542306048,1542306303,GB +1542306304,1542307327,RU +1542307328,1542307583,PL +1542307584,1542307839,SE +1542307840,1542308095,RU +1542308096,1542308863,RO +1542308864,1542309119,PL +1542309120,1542309375,GB +1542309632,1542310911,RU +1542310912,1542312191,UA +1542312192,1542312447,RU +1542312448,1542312959,GB +1542312960,1542313215,FR +1542313216,1542313471,RU +1542313472,1542313727,DE +1542313984,1542314495,TR +1542314496,1542314751,CH +1542314752,1542315007,PL +1542315008,1542316031,RU +1542316032,1542317567,PL +1542317568,1542317823,RU +1542317824,1542318079,GB +1542318080,1542319103,UA +1542319104,1542320127,CZ +1542320128,1542322175,UA +1542322176,1542322431,RO +1542322432,1542322687,RU +1542322944,1542323199,IL +1542323200,1542323711,RU +1542323712,1542324479,IR +1542324736,1542325247,RU +1542325248,1542325759,UA +1542325760,1542326271,RS +1542326272,1542326527,CH +1542326528,1542326783,UA +1542326784,1542327295,RU +1542327296,1542328319,MD +1542328320,1542328831,UA +1542329088,1542329343,AT +1542329344,1542329855,NL +1542329856,1542330111,GB +1542330112,1542330367,UA +1542330368,1542331903,RU +1542331904,1542332671,BE +1542332928,1542333439,RU +1542333440,1542333695,PL +1542333696,1542335487,RO +1542335488,1542337023,RU +1542337024,1542337279,RO +1542337280,1542337535,SE +1542337536,1542339839,PL +1542339840,1542340095,RS +1542340096,1542340607,PL +1542340608,1542342143,RU +1542342144,1542342655,RO +1542342656,1542343167,FR +1542343168,1542343679,UA +1542343680,1542344447,PL +1542344448,1542345727,RU +1542345984,1542346239,PL +1542346240,1542347775,RU +1542348288,1542348799,MD +1542348800,1542349823,RU +1542349824,1542350847,UA +1542350848,1542351359,CZ +1542351360,1542351615,BG +1542351616,1542351871,PL +1542351872,1542353151,RU +1542353152,1542353407,SA +1542353664,1542353919,RU +1542353920,1542354943,IT +1542354944,1542355711,RU +1542355712,1542355967,GB +1542355968,1542356479,PL +1542356480,1542356735,ES +1542356736,1542357503,RU +1542357504,1542357759,GB +1542357760,1542358015,FR +1542358016,1542358271,UA +1542358272,1542358527,RU +1542358528,1542359039,PL +1542359040,1542360319,RU +1542360320,1542360575,NL +1542360576,1542361087,PL +1542361088,1542361343,CH +1542361344,1542361599,PL +1542361600,1542362111,UA +1542362112,1542362623,RO +1542362624,1542363135,FR +1542363136,1542363647,DK +1542363648,1542364159,NL +1542364160,1542365183,RU +1542365184,1542366719,GB +1542366720,1542367231,PL +1542367232,1542368255,RU +1542368256,1542369279,PL +1542369280,1542369791,NL +1542369792,1542370303,PL +1542370304,1542370815,DE +1542370816,1542371839,RU +1542371840,1542372351,RO +1542372352,1542373375,RU +1542373376,1542374399,UA +1542374400,1542375167,GB +1542375168,1542375423,BG +1542375424,1542376447,RU +1542376448,1542376959,BG +1542376960,1542377215,DK +1542377472,1542377983,GB +1542377984,1542378495,RU +1542378496,1542378751,DK +1542379008,1542379519,GB +1542379520,1542379775,PL +1542380032,1542380287,RO +1542380288,1542380543,BE +1542380544,1542380799,FR +1542380800,1542381055,GB +1542381056,1542381823,RU +1542381824,1542382079,AT +1542382080,1542382335,BE +1542382336,1542383615,RU +1542383616,1542384639,PL +1542384640,1542384895,DE +1542384896,1542385151,RU +1542385152,1542385663,CH +1542385664,1542386687,PL +1542386688,1542387199,RU +1542387200,1542387711,PL +1542387712,1542388223,RU +1542388224,1542388479,IT +1542388480,1542388735,BG +1542388736,1542389247,RU +1542389248,1542389503,PL +1542389504,1542389759,BG +1542389760,1542390783,RO +1542390784,1542391295,RU +1542391296,1542391807,FR +1542391808,1542392831,MD +1542392832,1542393087,RO +1542393088,1542393343,BG +1542393344,1542393599,IR +1542393856,1542394879,RU +1542394880,1542395135,DE +1542395136,1542395391,ES +1542395392,1542395647,RU +1542395648,1542395903,AT +1542395904,1542396159,GR +1542396160,1542396415,NO +1542396416,1542396927,RU +1542396928,1542397951,PL +1542397952,1542398463,NL +1542398464,1542398975,DE +1542398976,1542399231,PL +1542399488,1542399999,DK +1542400000,1542401535,RU +1542401536,1542401791,GB +1542401792,1542402047,BG +1542402048,1542403071,UA +1542403072,1542403327,CH +1542403328,1542403583,RU +1542403584,1542404095,IR +1542404096,1542405375,RU +1542405376,1542405631,PL +1542405632,1542405887,GB +1542405888,1542406143,RU +1542406144,1542406655,NL +1542406656,1542407167,PL +1542407168,1542408191,RU +1542408192,1542408703,GB +1542408704,1542408959,UA +1542408960,1542409215,CH +1542409216,1542411263,UA +1542411264,1542411519,DE +1542411520,1542411775,RU +1542411776,1542412031,LT +1542412032,1542412287,GB +1542412288,1542412799,RU +1542412800,1542413055,PL +1542413056,1542413311,GB +1542413312,1542413823,DE +1542413824,1542414079,RU +1542414080,1542414335,UA +1542414336,1542414847,SI +1542414848,1542415359,RU +1542415360,1542415615,DK +1542415616,1542415871,KZ +1542415872,1542416383,RU +1542416384,1542417407,UA +1542417408,1542418431,IR +1542418432,1542418687,RU +1542418688,1542420735,PL +1542420736,1542420991,RU +1542420992,1542421247,DK +1542421248,1542421503,RO +1542421504,1542422015,GB +1542422016,1542422527,RU +1542422528,1542422783,RO +1542422784,1542423039,PL +1542423296,1542424575,RU +1542424576,1542425599,UA +1542425600,1542426623,RU +1542426624,1542426879,PL +1542426880,1542427135,GB +1542427136,1542427391,PT +1542427392,1542427647,IE +1542428160,1542428415,UA +1542428416,1542428671,RS +1542428672,1542429695,PL +1542429696,1542429951,GB +1542430208,1542430719,RU +1542430720,1542431743,UA +1542431744,1542432767,RO +1542432768,1542433791,PL +1542433792,1542434047,RU +1542434048,1542434303,RO +1542434304,1542434815,NL +1542434816,1542435071,RU +1542435072,1542435327,DE +1542435328,1542435839,RO +1542435840,1542436863,PL +1542436864,1542437119,RU +1542437120,1542437375,PL +1542437376,1542437631,NL +1542437632,1542437887,UA +1542437888,1542438399,SE +1542438400,1542438655,UA +1542438656,1542438911,RU +1542438912,1542439167,KZ +1542439168,1542439423,SI +1542439424,1542439679,RO +1542439680,1542439935,CY +1542439936,1542440959,PL +1542440960,1542441983,CZ +1542441984,1542442239,TR +1542442240,1542442495,PL +1542442496,1542443007,GE +1542443008,1542444031,GB +1542444032,1542444543,NL +1542444544,1542444799,IR +1542444800,1542445055,RU +1542445056,1542445567,SE +1542445568,1542446079,IL +1542446080,1542447871,RO +1542447872,1542448639,RU +1542448640,1542448895,RO +1542448896,1542449151,AT +1542449152,1542450175,UA +1542450176,1542450687,CZ +1542450944,1542451199,RU +1542451200,1542451455,BG +1542451456,1542451711,UA +1542451712,1542451967,TR +1542451968,1542452223,AU +1542452224,1542454271,PL +1542454272,1542454783,NO +1542454784,1542455039,PL +1542455040,1542455295,SE +1542455296,1542455551,US +1542455552,1542455807,RO +1542455808,1542456319,GB +1542456320,1542456831,RO +1542456832,1542457343,RS +1542457344,1542458367,RO +1542458368,1542459391,UZ +1542459392,1542459647,RU +1542459648,1542459903,GB +1542459904,1542460415,UA +1542460416,1542461439,LT +1542461440,1542461695,GB +1542461696,1542461951,RU +1542461952,1542462207,TR +1542462208,1542462463,GE +1542462464,1542463487,PL +1542463488,1542463743,FR +1542464000,1542464255,DE +1542464256,1542464511,CZ +1542464512,1542464767,RU +1542464768,1542465023,TR +1542465024,1542465535,RU +1542465536,1542466559,RS +1542466560,1542466815,PL +1542466816,1542467071,RU +1542467072,1542467583,PL +1542467584,1542468607,UA +1542468608,1542469631,SI +1542469632,1542470655,ES +1542470656,1542471679,IR +1542471680,1542472703,SE +1542472704,1542472959,PL +1542472960,1542473215,LB +1542473216,1542473471,PL +1542473472,1542473727,GB +1542473728,1542473983,FR +1542473984,1542474239,AE +1542474240,1542474751,RU +1542474752,1542475007,PL +1542475008,1542475263,DE +1542475264,1542475775,FR +1542475776,1542476799,LB +1542476800,1542477823,RU +1542477824,1542478079,DK +1542478336,1542479103,RU +1542479104,1542479359,PL +1542479360,1542479615,RO +1542479616,1542479871,RU +1542479872,1542480895,UA +1542480896,1542481407,PL +1542481408,1542481919,RU +1542481920,1542482431,CH +1542482432,1542482943,PL +1542482944,1542483199,TR +1542483200,1542483455,FR +1542483456,1542484991,RU +1542484992,1542486015,NL +1542486016,1542488063,RU +1542488320,1542488575,DE +1542488576,1542491135,PL +1542491136,1542492159,UA +1542492160,1542492415,RU +1542492416,1542492671,CZ +1542492672,1542493183,IL +1542493184,1542493439,PS +1542493440,1542494207,RO +1542494208,1542494719,PL +1542494720,1542494975,RO +1542494976,1542495231,RU +1542495232,1542496255,RO +1542496256,1542496767,DE +1542496768,1542497023,RU +1542497280,1542497535,DE +1542497536,1542497791,NL +1542497792,1542498303,IT +1542498304,1542499583,RU +1542499584,1542499839,ES +1542499840,1542500095,GB +1542500352,1542500607,GB +1542500608,1542500863,RO +1542500864,1542501119,GB +1542501120,1542501375,RU +1542501376,1542502399,IR +1542502400,1542502655,RO +1542502656,1542503423,DK +1542503424,1542503679,RO +1542503680,1542503935,DK +1542503936,1542504447,UA +1542504448,1542504703,GB +1542504704,1542504959,PL +1542504960,1542505215,SE +1542505216,1542505471,NO +1542505472,1542506495,PL +1542506496,1542507007,NL +1542507008,1542507263,RU +1542507264,1542507519,CY +1542507520,1542508543,NO +1542508544,1542509567,RU +1542509568,1542510079,CY +1542510592,1542510847,SI +1542510848,1542511103,DE +1542511104,1542511871,RU +1542511872,1542512127,GB +1542512128,1542512383,RU +1542512384,1542512639,PL +1542512640,1542512895,GB +1542512896,1542513151,RU +1542513152,1542513663,GB +1542513664,1542513919,FR +1542513920,1542514175,GB +1542514176,1542514687,IT +1542514688,1542515199,RU +1542515200,1542515711,IL +1542515712,1542516223,RO +1542516224,1542516735,PL +1542516736,1542516991,NL +1542516992,1542517247,FR +1542517248,1542517759,RU +1542517760,1542518015,UA +1542518016,1542518271,SK +1542518272,1542518783,LV +1542518784,1542519807,PL +1542519808,1542520319,SE +1542520320,1542520575,PL +1542520576,1542520831,BG +1542520832,1542521343,GB +1542521344,1542521599,PL +1542521600,1542521855,PT +1542521856,1542522111,RU +1542522112,1542522367,PL +1542522368,1542522879,NL +1542522880,1542523903,CZ +1542523904,1542524415,RU +1542524928,1542525951,RU +1542525952,1542526463,IR +1542526464,1542526719,RU +1542526720,1542526975,CZ +1542526976,1542527999,PL +1542528000,1542528255,LU +1542528256,1542528511,NL +1542528512,1542528767,BE +1542528768,1542531583,PL +1542531584,1542531839,FR +1542531840,1542532095,RU +1542532096,1542532351,DE +1542532352,1542533119,RU +1542534144,1542534399,DE +1542534400,1542534655,HR +1542534656,1542535167,DE +1542535168,1542535423,GB +1542535424,1542535679,FR +1542535680,1542536191,RU +1542536192,1542537215,PL +1542537216,1542538239,LV +1542538240,1542538751,RU +1542538752,1542539007,GB +1542539008,1542539263,UA +1542539264,1542540287,DE +1542540288,1542540799,IT +1542540800,1542541055,GB +1542541056,1542541311,BE +1542541312,1542542335,UA +1542542336,1542542847,RU +1542542848,1542543359,IT +1542543360,1542544383,RU +1542544384,1542544639,IR +1542544896,1542545407,GR +1542545408,1542563839,UA +1542563840,1542565887,RU +1542565888,1542586367,UA +1542586368,1542594559,AZ +1542594560,1542597631,RU +1542597632,1542598143,IR +1542598144,1542599679,RO +1542599680,1542600703,UA +1542600704,1542602751,PL +1542602752,1542619135,MD +1542619136,1542619391,GB +1542619392,1542627327,ES +1542627328,1542627583,NL +1542627584,1542627839,RU +1542627840,1542628095,FR +1542628096,1542630399,RU +1542630400,1542630655,GB +1542630656,1542630911,DE +1542630912,1542631423,PL +1542631424,1542635519,RU +1542635520,1542637567,UA +1542637568,1542639615,NO +1542639616,1542640639,UA +1542640640,1542640895,DE +1542640896,1542641151,RU +1542641152,1542641663,DE +1542641664,1542641919,RO +1542642176,1542642431,PL +1542642688,1542643199,PL +1542643200,1542643455,UA +1542643456,1542643711,NL +1542643712,1542660095,UA +1542660096,1542661119,RU +1542661120,1542662143,UA +1542662144,1542668287,RU +1542668288,1542668799,NL +1542668800,1542669311,PL +1542669312,1542669567,RU +1542669568,1542669823,NO +1542669824,1542670079,DE +1542670080,1542670335,CH +1542670336,1542670591,US +1542670592,1542670847,ES +1542670848,1542671359,NL +1542671360,1542671871,FR +1542671872,1542672383,AT +1542672384,1542674431,NL +1542674432,1542674687,RU +1542674688,1542674943,US +1542674944,1542675455,RU +1542675456,1542675711,US +1542675712,1542675967,RU +1542675968,1542676223,US +1542676224,1542681087,RU +1542681088,1542681343,GB +1542681600,1542683135,RU +1542683136,1542683391,SK +1542683392,1542683647,RS +1542683648,1542684159,RU +1542684160,1542684671,IR +1542684672,1542685695,LT +1542685696,1542685951,RU +1542685952,1542686719,LT +1542686720,1542687743,US +1542687744,1542688767,LT +1542688768,1542689791,FR +1542689792,1542690815,LT +1542690816,1542691327,ES +1542691328,1542691839,PT +1542691840,1542692863,LT +1542692864,1542696959,IR +1542701056,1542709247,UA +1542709248,1542717439,RU +1542717440,1542733823,UA +1542733824,1542734847,RU +1542734848,1542735103,GB +1542735104,1542735359,UA +1542735360,1542735871,PL +1542735872,1542742015,RU +1542742016,1542746111,RO +1542746112,1542747135,RU +1542747136,1542747391,TR +1542747392,1542747647,GB +1542747648,1542748159,UA +1542748160,1542749183,IR +1542749184,1542749439,UA +1542749440,1542749695,DE +1542749696,1542749951,GB +1542749952,1542758399,UA +1542758400,1542763519,RU +1542763520,1542763775,DE +1542763776,1542764031,BG +1542764288,1542764543,RU +1542764544,1542766591,PL +1542770688,1542774783,PL +1542774784,1542775039,NL +1542775040,1542775295,PL +1542775296,1542775807,TR +1542775808,1542776063,RU +1542776064,1542776319,GB +1542776320,1542776831,PL +1542776832,1542777855,UA +1542777856,1542778367,GB +1542778368,1542778623,FR +1542778624,1542778879,GB +1542778880,1542780159,RU +1542780160,1542780927,GB +1542780928,1542781951,PL +1542781952,1542782975,RU +1542782976,1542791167,CZ +1542791168,1542801407,RU +1542801408,1542803455,UA +1542803456,1542805503,PL +1542805504,1542807551,RO +1542807552,1542815743,UA +1542815744,1542823935,RU +1542823936,1542832127,RO +1542832128,1542832383,BG +1542832384,1542832639,SI +1542832640,1542832895,LV +1542832896,1542833151,GR +1542833152,1542834175,RO +1542834176,1542836223,ES +1542836224,1542836735,RO +1542836736,1542837247,RU +1542837248,1542837503,GB +1542837504,1542837759,UA +1542837760,1542838015,RS +1542838016,1542838271,DE +1542838272,1542838783,GB +1542838784,1542839039,DK +1542839040,1542839295,PL +1542839296,1542839551,DE +1542839808,1542840063,CY +1542840064,1542840319,UA +1542848512,1542849535,RU +1542849536,1542850559,UA +1542850560,1542851583,GB +1542851584,1542851839,BG +1542852096,1542852351,KW +1542852352,1542852607,PL +1542852608,1542855167,RU +1542855168,1542856191,GB +1542856192,1542856703,RU +1542856704,1542864895,UA +1542864896,1542868991,PL +1542868992,1542875135,RU +1542875136,1542877183,PL +1542877184,1542881279,RU +1542881280,1542889471,UA +1542889472,1542891519,RU +1542891520,1542892543,PL +1542892544,1542900223,RO +1542900224,1542900479,DE +1542900480,1542901759,RO +1542901760,1542903807,PL +1542903808,1542904319,RO +1542904320,1542904575,IL +1542904576,1542904831,RU +1542904832,1542914047,UA +1542914048,1542923263,RU +1542923264,1542923775,BG +1542923776,1542929407,UA +1542929408,1542930431,KG +1542930432,1542930943,CZ +1542930944,1542931455,IR +1542931456,1542932479,RU +1542932480,1542932735,LV +1542932736,1542932991,GB +1542932992,1542933247,NO +1542933248,1542933503,FR +1542933504,1542938623,UA +1542938624,1542942719,RU +1542942720,1542944767,UA +1542944768,1542950911,RU +1542950912,1542951423,DE +1542951424,1542951679,RO +1542951680,1542951935,PL +1542951936,1542955007,RU +1542955008,1542963199,UA +1542963200,1542970623,RU +1542970624,1542970879,UA +1542970880,1542971391,RU +1542971392,1542972415,UA +1542972416,1542973439,NO +1542973440,1542975487,RU +1542975488,1542977535,RO +1542977536,1542978559,RU +1542978560,1542978815,PL +1542978816,1542979071,CH +1542979072,1542979583,RU +1542979584,1543110655,DE +1543110656,1543127039,UA +1543127040,1543143423,DE +1543143424,1543159807,ES +1543159808,1543167999,SE +1543168000,1543172095,IR +1543172096,1543173119,RO +1543173120,1543173375,GB +1543173376,1543173631,MD +1543173632,1543176191,RO +1543176192,1543241727,IR +1543241728,1543503871,IT +1543503872,1545601023,GB +1545601024,1545674495,SE +1545674496,1545674751,FI +1545674752,1545863167,SE +1545863168,1545895935,RU +1545895936,1545928703,BA +1545928704,1545961471,SI +1545961472,1545995519,RU +1545995520,1545996287,CZ +1545996288,1545998335,RU +1545998336,1545999359,MD +1545999360,1546000383,CZ +1546000384,1546001407,UZ +1546001408,1546002943,RU +1546002944,1546003199,UA +1546003200,1546003967,RU +1546003968,1546004479,CZ +1546004480,1546004735,UA +1546004736,1546004795,CZ +1546004796,1546004796,UA +1546004797,1546004991,CZ +1546004992,1546006527,RU +1546006528,1546007551,UA +1546007552,1546008575,UZ +1546008576,1546014719,BY +1546014720,1546015487,RU +1546015488,1546015743,GB +1546015744,1546015999,CZ +1546016000,1546016255,DE +1546016256,1546017279,RU +1546017280,1546017791,CZ +1546017792,1546017969,RU +1546017970,1546017970,CZ +1546017971,1546018303,RU +1546018304,1546018815,FR +1546018816,1546027007,UA +1546027008,1546028543,RU +1546028544,1546028799,KR +1546028800,1546035711,RU +1546035712,1546036223,LU +1546036224,1546059775,RU +1546059776,1546063871,SE +1546063872,1546067967,DE +1546067968,1546072063,SE +1546072064,1546076159,MD +1546076160,1546080255,RU +1546080256,1546084351,AZ +1546084352,1546088447,RU +1546088448,1546088959,BR +1546088960,1546089471,GB +1546089472,1546089727,BR +1546089728,1546092543,GB +1546092544,1546096639,RU +1546096640,1546100735,IT +1546100736,1546104314,AT +1546104315,1546104315,DE +1546104316,1546104831,AT +1546104832,1546108927,IE +1546108928,1546113023,IM +1546113024,1546121215,RU +1546121216,1546121727,ES +1546121728,1546121983,IT +1546121984,1546122463,ES +1546122464,1546122479,DZ +1546122480,1546122633,ES +1546122634,1546122641,GB +1546122642,1546122642,DE +1546122643,1546122649,ES +1546122650,1546122650,PT +1546122651,1546124191,ES +1546124192,1546124223,DZ +1546124224,1546125311,ES +1546125312,1546256383,GB +1546256384,1546264575,RU +1546264576,1546266623,TR +1546268672,1546270719,IR +1546270720,1546272767,GB +1546272768,1546274815,NO +1546274816,1546276863,SE +1546276864,1546278911,IT +1546278912,1546280959,RU +1546280960,1546283007,IT +1546283008,1546283463,DE +1546283464,1546283471,FR +1546283472,1546283521,DE +1546283522,1546283523,FR +1546283524,1546283827,DE +1546283828,1546283835,FR +1546283836,1546284287,DE +1546284288,1546284291,FR +1546284292,1546285055,DE +1546285056,1546287103,PL +1546287104,1546289151,GB +1546289152,1546291199,RU +1546291200,1546292279,AT +1546292280,1546292287,US +1546292288,1546293247,AT +1546293248,1546295295,GB +1546295296,1546297343,SE +1546297344,1546299391,RU +1546299392,1546301439,GB +1546301440,1546303487,LU +1546303488,1546305535,CH +1546305536,1546307583,DE +1546307584,1546311679,RU +1546311680,1546313727,FR +1546313728,1546315775,DE +1546315776,1546317823,NL +1546317824,1546319871,CH +1546319872,1546321919,RS +1546321920,1546323967,RU +1546323968,1546326015,NO +1546326016,1546328063,GB +1546328064,1546330111,CZ +1546330112,1546332159,SE +1546332160,1546334207,GB +1546334208,1546336255,DE +1546336256,1546338303,CZ +1546338304,1546340351,GB +1546340352,1546342399,DK +1546344448,1546346495,DK +1546346496,1546348543,AT +1546348544,1546348607,DE +1546348608,1546348623,CH +1546348624,1546350591,DE +1546350592,1546352639,PL +1546352640,1546354687,DK +1546354688,1546356735,FR +1546356736,1546358783,AM +1546358784,1546360831,PL +1546360832,1546363903,RU +1546363904,1546364415,MD +1546364416,1546364927,RU +1546364928,1546366975,SA +1546366976,1546369023,DK +1546369024,1546371071,RU +1546371072,1546373119,IS +1546373120,1546375167,HU +1546375168,1546377215,GB +1546377216,1546379263,CH +1546379264,1546381311,ES +1546381312,1546383359,DK +1546383360,1546385407,IT +1546385408,1546387455,FR +1546387456,1546518527,TR +1546518528,1546649599,KZ +1546649600,1546665983,SA +1546665984,1546682367,GB +1546682368,1546698751,BE +1546698752,1546715135,NL +1546715136,1546731519,LV +1546731520,1546732543,FR +1546732544,1546733567,MQ +1546733568,1546735615,GP +1546735616,1546737663,MQ +1546737664,1546741759,GP +1546741760,1546743807,FR +1546743808,1546747903,MQ +1546747904,1546764287,RU +1546764288,1546780671,KZ +1546780672,1546797055,IR +1546797056,1546813439,DE +1546813440,1546860543,RU +1546860544,1546862591,MD +1546862592,1546874879,GE +1546874880,1546875135,RU +1546875136,1546876927,GE +1546876928,1546878975,RU +1546878976,1546895359,DE +1546895360,1546911743,IE +1546911744,1546928127,SK +1546928128,1546944511,GB +1546944512,1546960895,UA +1546960896,1546977279,HU +1546977280,1546993663,MK +1546993664,1547010047,RU +1547010048,1547026431,SI +1547026432,1547034623,ES +1547034624,1547036671,RU +1547036672,1547038719,SE +1547038720,1547040767,GB +1547040768,1547042815,NL +1547042816,1547059199,ES +1547059200,1547075583,RU +1547075584,1547091967,GB +1547091968,1547108351,GE +1547108352,1547124735,RU +1547124736,1547141119,MK +1547141120,1547149311,RO +1547149312,1547157503,KZ +1547157504,1547173887,PL +1547173888,1547436031,ES +1547436032,1547440127,AT +1547440128,1547444223,AL +1547448320,1547452415,SK +1547452416,1547456511,IT +1547456512,1547460607,RU +1547460608,1547468799,GB +1547468800,1547472895,PL +1547472896,1547476991,DK +1547476992,1547481087,ES +1547481088,1547485183,UA +1547485184,1547489279,IE +1547489280,1547493375,DE +1547493376,1547497471,RS +1547497472,1547498495,NL +1547498496,1547501567,GB +1547501568,1547505663,TR +1547505664,1547509759,RU +1547509760,1547513855,LT +1547513856,1547517951,AT +1547517952,1547522047,RU +1547522048,1547526143,CZ +1547526144,1547534335,HU +1547534336,1547538431,FR +1547542528,1547546623,FR +1547546624,1547550719,IR +1547550720,1547554815,IE +1547554816,1547558911,AT +1547558912,1547563007,IL +1547563008,1547564031,NL +1547564032,1547564287,GB +1547564288,1547567103,NL +1547567104,1547571199,GB +1547571200,1547575295,AT +1547575296,1547579391,NO +1547579392,1547583487,RU +1547583488,1547587583,KG +1547587584,1547591679,IT +1547591680,1547595775,EE +1547599872,1547603967,LT +1547603968,1547608063,RU +1547608064,1547612159,LB +1547612160,1547616255,IR +1547616256,1547620351,DK +1547620352,1547620375,JE +1547620376,1547620383,NG +1547620384,1547620399,JE +1547620400,1547620407,NG +1547620408,1547620599,JE +1547620600,1547620607,NG +1547620608,1547620919,JE +1547620920,1547620927,NG +1547620928,1547621015,JE +1547621016,1547621023,NG +1547621024,1547621047,JE +1547621048,1547621055,NG +1547621056,1547621183,JE +1547621184,1547621191,NG +1547621192,1547621215,JE +1547621216,1547621223,NG +1547621224,1547621231,JE +1547621232,1547621239,NG +1547621240,1547621255,JE +1547621256,1547621263,NG +1547621264,1547621271,JE +1547621272,1547621279,NG +1547621280,1547621447,JE +1547621448,1547621455,NG +1547621456,1547621463,JE +1547621464,1547621471,NG +1547621472,1547622919,JE +1547622920,1547622935,NG +1547622936,1547623167,JE +1547623168,1547623423,NG +1547623424,1547623479,JE +1547623480,1547623487,NG +1547623488,1547624447,JE +1547624448,1547628543,CZ +1547628544,1547632639,BG +1547632640,1547636735,TR +1547636736,1547640831,SI +1547640832,1547644927,PL +1547644928,1547649023,CZ +1547649024,1547653119,RU +1547653120,1547657215,LV +1547657216,1547661311,RU +1547661312,1547665407,ES +1547665408,1547669503,GB +1547669504,1547673599,AT +1547673600,1547677695,NL +1547677696,1547683839,RU +1547683840,1547683967,PL +1547683968,1547684031,EE +1547684032,1547684095,LV +1547684096,1547685887,RU +1547685888,1547689983,AT +1547689984,1547694079,IT +1547694080,1547698175,HU +1547698176,1548158599,NL +1548158600,1548158607,GB +1548158608,1548159231,NL +1548159232,1548159235,ES +1548159236,1548159487,NL +1548159488,1548159999,GB +1548160000,1548160567,NL +1548160568,1548160575,DE +1548160576,1548160607,NL +1548160608,1548160639,GB +1548160640,1548161375,NL +1548161376,1548161407,GB +1548161408,1548161727,NL +1548161728,1548161791,GB +1548161792,1548162463,NL +1548162464,1548162495,FR +1548162496,1548169215,NL +1548169216,1548171263,DE +1548171264,1548172287,FR +1548172288,1548173311,GB +1548173312,1548174335,BE +1548174336,1548174847,LU +1548174848,1548175359,IE +1548175360,1548175871,ES +1548175872,1548176383,PT +1548176384,1548176895,IT +1548176896,1548177407,CH +1548177408,1548177919,AT +1548177920,1548178431,PL +1548178432,1548178943,DK +1548178944,1548179455,NO +1548179456,1548179967,SE +1548179968,1548180479,FI +1548180480,1548180991,SK +1548180992,1548181503,TR +1548181504,1548182015,US +1548182016,1548182527,HK +1548182528,1548222463,NL +1548222464,1548746751,DE +1548746752,1549271039,RO +1549271040,1549795327,FR +1549795328,1550057471,AE +1550057472,1550188543,RU +1550188544,1550319615,FR +1550319616,1550581759,CH +1550581760,1550843903,NL +1550843904,1550974975,UA +1550974976,1550975231,NL +1550975232,1550975999,RO +1550976000,1550976255,EG +1550976256,1550976767,RO +1550976768,1550977023,US +1550977024,1550979071,RO +1550979072,1550983167,IR +1550983168,1550983935,RO +1550983936,1550984191,GB +1550984192,1550984447,KR +1550984448,1550984703,RO +1550984704,1550984959,BG +1550984960,1550985215,RO +1550985216,1550987263,PS +1550987264,1550988287,IR +1550988288,1550988543,RO +1550988544,1550988799,JP +1550988800,1550990335,RO +1550990336,1550991359,AU +1550991360,1550995455,IR +1550995456,1550995967,RO +1550995968,1550996223,BG +1550996224,1550996479,AU +1550996480,1550998527,RO +1550998528,1550998783,IT +1550998784,1551000575,RO +1551000576,1551001599,NL +1551001600,1551007743,RO +1551007744,1551106047,MD +1551106048,1551237119,DE +1551237120,1551302655,GR +1551368192,1551450111,NL +1551450112,1551452159,SG +1551452160,1551454207,NL +1551454208,1551456255,US +1551456256,1551499263,NL +1551503360,1551504383,GB +1551504384,1551505407,FR +1551516672,1551517695,IT +1551517696,1551518719,ES +1551528960,1551529983,FR +1551544320,1551547391,DE +1551548416,1551551487,DE +1551556608,1551558655,FR +1551560704,1551561727,DE +1551561728,1551562751,FR +1551564800,1551572991,FR +1551577088,1551580159,NL +1551580350,1551580350,US +1551604480,1551604735,SE +1551630336,1551892479,RU +1551892480,1554514250,FR +1554514251,1554514251,RE +1554514252,1554971045,FR +1554971046,1554971046,ES +1554971047,1555038207,FR +1555038208,1555169279,ES +1555169280,1555628031,FR +1555628032,1555824639,ES +1555824640,1555890175,FR +1555890176,1556086783,ES +1556086784,1557069823,DE +1557069824,1557135359,GB +1557135360,1557313279,DE +1557313280,1557313535,US +1557313536,1557921791,DE +1557921792,1558052863,NO +1558052864,1558053760,FR +1558053761,1558053761,PT +1558053762,1558054351,FR +1558054352,1558054352,PT +1558054353,1558054399,FR +1558054400,1558054655,DE +1558054656,1558056102,FR +1558056103,1558056103,ES +1558056104,1558079407,FR +1558079408,1558079415,PL +1558079416,1558079423,GB +1558079424,1558079871,FR +1558079872,1558079887,GB +1558079888,1558081175,FR +1558081176,1558081183,BE +1558081184,1558082139,FR +1558082140,1558082143,ES +1558082144,1558082943,FR +1558082944,1558082959,PL +1558082960,1558083775,FR +1558083776,1558083791,DE +1558083792,1558083959,FR +1558083960,1558083963,CZ +1558083964,1558084208,FR +1558084209,1558084209,ES +1558084210,1558084649,FR +1558084650,1558084650,IT +1558084651,1558084655,FR +1558084656,1558084659,BE +1558084660,1558085055,FR +1558085056,1558085071,GB +1558085072,1558088319,FR +1558088320,1558088323,ES +1558088324,1558091351,FR +1558091352,1558091352,ES +1558091353,1558093531,FR +1558093532,1558093532,HR +1558093533,1558093609,FR +1558093610,1558093610,ES +1558093611,1558097919,FR +1558097920,1558098175,GB +1558098176,1558102501,FR +1558102502,1558102502,DE +1558102503,1558102507,FR +1558102508,1558102508,DE +1558102509,1558103159,FR +1558103160,1558103167,GB +1558103168,1558103967,FR +1558103968,1558103999,ES +1558104000,1558106901,FR +1558106902,1558106902,DE +1558106903,1558107391,FR +1558107392,1558107455,NL +1558107456,1558112095,FR +1558112096,1558112127,ES +1558112128,1558112191,FR +1558112192,1558112192,ES +1558112193,1558112198,FR +1558112199,1558112199,ES +1558112200,1558112207,FR +1558112208,1558112208,ES +1558112209,1558112209,FR +1558112210,1558112211,ES +1558112212,1558115327,FR +1558115328,1558115455,NL +1558115456,1558118399,FR +1558118400,1558119423,DE +1558119424,1558122495,RU +1558122496,1558123007,SG +1558123008,1558123519,RU +1558123520,1558125567,LU +1558125568,1558126079,SG +1558126080,1558126335,DE +1558126336,1558126591,LU +1558126592,1558128639,RU +1558128640,1558128895,US +1558128896,1558129151,LU +1558129152,1558129407,RU +1558129408,1558129663,LU +1558129664,1558130687,US +1558130688,1558132735,LU +1558132736,1558133247,US +1558133248,1558133759,LU +1558133760,1558134015,RU +1558134016,1558134271,KR +1558134272,1558134783,JP +1558134784,1558135039,RU +1558135040,1558135295,LU +1558135296,1558135551,US +1558135552,1558135552,RU +1558135553,1558135807,LU +1558135808,1558136319,US +1558136320,1558136575,LU +1558136576,1558136831,DE +1558136832,1558137087,RU +1558137088,1558137343,KR +1558137344,1558137855,CZ +1558137856,1558138879,LU +1558138880,1558139135,RU +1558139136,1558139391,NL +1558139392,1558139647,US +1558139648,1558139903,LU +1558139904,1558140159,DE +1558140160,1558140415,RU +1558140416,1558141183,LU +1558141184,1558141184,CY +1558141185,1558141439,LU +1558141440,1558141695,CY +1558141696,1558141951,LU +1558141952,1558142463,PL +1558142464,1558142719,US +1558142720,1558142975,SG +1558142976,1558143231,US +1558143232,1558143743,LU +1558143744,1558143999,RU +1558144000,1558144255,LU +1558144256,1558145023,RU +1558145024,1558145535,LU +1558145536,1558145791,RU +1558145792,1558146047,US +1558146048,1558146815,RU +1558146816,1558147583,LU +1558147584,1558147839,RU +1558147840,1558148095,LU +1558148096,1558148607,SG +1558148608,1558149631,US +1558149632,1558150143,RU +1558150144,1558150655,DE +1558150656,1558151167,NL +1558151168,1558172927,IT +1558172928,1558173099,US +1558173100,1558173100,IT +1558173101,1558173183,US +1558173184,1558179871,IT +1558179872,1558179955,NL +1558179956,1558179959,IT +1558179960,1558180023,NL +1558180024,1558180039,IT +1558180040,1558180071,NL +1558180072,1558180079,IT +1558180080,1558180095,NL +1558180096,1558180111,IT +1558180112,1558180287,NL +1558180288,1558180367,IT +1558180368,1558180863,NL +1558180864,1558183935,IT +1558183936,1558708223,DE +1558708224,1558904831,GB +1558904832,1558921215,IE +1558921216,1558937599,HU +1558937600,1558970367,NL +1558970368,1559236607,GB +1559236608,1559240703,IL +1559240704,1559248895,BA +1559248896,1559257087,LV +1559257088,1559265279,UA +1559265280,1559269375,RU +1559269376,1559270399,NL +1559270400,1559271423,US +1559271424,1559273471,FI +1559273472,1559281663,CZ +1559281664,1559289855,RU +1559289856,1559298047,SK +1559298048,1559306239,RU +1559306240,1559314431,JO +1559314432,1559322623,GE +1559322624,1559330815,RU +1559330816,1559339007,BA +1559339008,1559347199,RU +1559347200,1559355391,DK +1559355392,1559379455,RU +1559379456,1559379711,US +1559379712,1559388159,RU +1559388160,1559396351,UA +1559396352,1559404543,GB +1559412736,1559420927,IR +1559420928,1559429119,HR +1559429120,1559437311,FR +1559437312,1559445503,AT +1559445504,1559461887,RU +1559461888,1559470079,IT +1559470080,1559478271,RU +1559478272,1559486463,CZ +1559486464,1559494655,DK +1559494656,1559502847,SE +1559502848,1559511039,PL +1559511040,1559519231,SI +1559519232,1559527423,UA +1559527424,1559535615,RS +1559535616,1559543807,GB +1559543808,1559551999,SE +1559552000,1559560191,RU +1559560192,1559568383,SK +1559568384,1559576575,RU +1559576576,1559584767,HU +1559584768,1559592959,KG +1559592960,1559601151,FR +1559601152,1559609343,IT +1559609344,1559617535,SK +1559617536,1559625727,GB +1559625728,1559633919,DK +1559633920,1559642111,IT +1559650304,1559658495,IT +1559658496,1559662591,RU +1559662592,1559663615,IR +1559663616,1559665663,RU +1559665664,1559666687,IR +1559666688,1559683071,RU +1559683072,1559691263,IE +1559691264,1559756799,BG +1559756800,1559789567,AT +1559789568,1559822335,RU +1559838720,1559855103,UA +1559855104,1559887871,HU +1559887872,1559920639,PT +1559920640,1559921407,LU +1559921408,1559921663,FR +1559921664,1559923711,LU +1559923712,1559924735,FR +1559924736,1559932159,LU +1559932160,1559932415,FR +1559932416,1559932927,LU +1559932928,1559934975,DE +1559934976,1559937023,LU +1559937024,1559941631,DE +1559941632,1559941887,LU +1559941888,1559943167,DE +1559943168,1559944191,LU +1559944192,1559945215,FR +1559945216,1559945727,LU +1559945728,1559946751,GB +1559946752,1559947519,DE +1559947520,1559948287,LU +1559948288,1559948288,GB +1559948289,1559949311,LU +1559949312,1559950335,DE +1559950336,1559951359,LU +1559951360,1559952383,DE +1559952384,1559953407,LU +1559953408,1559986175,MT +1559986176,1560018943,IE +1560018944,1560051711,DE +1560051712,1560084479,RU +1560084480,1560117247,JO +1560117248,1560125439,CZ +1560125440,1560135679,RU +1560135680,1560135807,UA +1560135808,1560136447,IR +1560136448,1560138239,GB +1560138240,1560139775,RU +1560139776,1560140287,CZ +1560140288,1560140799,RU +1560140800,1560141823,CZ +1560141824,1560143871,SY +1560143872,1560144895,CZ +1560144896,1560150015,UA +1560150016,1560182783,NL +1560182784,1560215551,SE +1560215552,1560281087,RU +1560281088,1562378239,FR +1562378240,1564999679,IT +1564999680,1565222911,UA +1565222912,1565229055,BG +1565229056,1565299711,UA +1565299712,1565300735,PT +1565300736,1565372415,UA +1565372416,1565374463,RU +1565374464,1565523967,UA +1565523968,1565655039,RU +1565655040,1565786111,AT +1565786112,1565917183,BY +1565917184,1565960191,RS +1565960192,1565960703,XK +1565960704,1565974527,RS +1565974528,1565975551,XK +1565975552,1566019583,RS +1566019584,1566020607,XK +1566020608,1566048255,RS +1566048256,1566052351,RU +1566056448,1566060543,IT +1566060544,1566064639,UA +1566064640,1566067199,IR +1566067200,1566067711,NL +1566067712,1566068735,RU +1566068736,1566072831,AZ +1566072832,1566081023,IT +1566081024,1566085119,RU +1566085120,1566089215,NL +1566089216,1566097407,RU +1566097408,1566101503,HU +1566101504,1566105599,RU +1566105600,1566109695,DE +1566109696,1566113791,CH +1566113792,1566117887,DE +1566117888,1566121983,TR +1566121984,1566126079,NO +1566126080,1566130175,IT +1566130176,1566134271,TR +1566134272,1566138367,GB +1566138368,1566142463,CZ +1566142464,1566146559,NO +1566146560,1566150655,GB +1566150656,1566154751,CZ +1566154752,1566158847,HU +1566158848,1566162943,RU +1566162944,1566167039,PL +1566167040,1566171135,UA +1566171136,1566175231,CY +1566175232,1566179327,IE +1566179328,1566183423,DK +1566183424,1566187519,ES +1566187520,1566191615,RU +1566191616,1566195711,FI +1566199808,1566207999,RU +1566208000,1566212095,DK +1566212096,1566216191,DE +1566216192,1566220287,SE +1566220288,1566224383,CZ +1566224384,1566232575,DE +1566232576,1566248959,RU +1566248960,1566257151,GB +1566257152,1566261247,CZ +1566261248,1566265343,TR +1566265344,1566265599,US +1566265600,1566269407,DE +1566269408,1566269439,US +1566269440,1566271487,NO +1566271488,1566271999,FI +1566272000,1566272511,SE +1566272512,1566273535,NO +1566273536,1566277631,RU +1566277632,1566281727,IT +1566281728,1566285823,CZ +1566285824,1566289919,RU +1566289920,1566294015,FI +1566294016,1566298111,IQ +1566298112,1566302207,PL +1566302208,1566306303,RU +1566306304,1566310399,CZ +1566310400,1566312447,SE +1566312448,1566314495,IE +1566314496,1566316543,BE +1566316544,1566318591,NL +1566318592,1566320639,RU +1566320640,1566322687,DE +1566322688,1566324735,CZ +1566324736,1566326783,HU +1566326784,1566328831,RU +1566328832,1566330879,IT +1566330880,1566334975,RU +1566334976,1566337023,NL +1566337024,1566339071,FR +1566339072,1566341119,RU +1566341120,1566343167,GB +1566343168,1566345215,DE +1566345216,1566347263,RU +1566347264,1566349311,DE +1566349312,1566351359,IT +1566351360,1566353407,AT +1566353408,1566355455,ES +1566355456,1566357503,RU +1566357504,1566359551,IT +1566359552,1566363647,RU +1566363648,1566365695,GB +1566365696,1566367743,RU +1566369792,1566371839,ES +1566371840,1566373887,IT +1566373888,1566375935,RS +1566375936,1566377983,DE +1566377984,1566380031,BG +1566380032,1566382079,IT +1566382080,1566384127,TR +1566384128,1566386175,CZ +1566386176,1566388223,FR +1566388224,1566388479,HK +1566388480,1566390015,LU +1566390016,1566390271,US +1566390272,1566392319,LT +1566392320,1566394367,ES +1566394368,1566394528,NO +1566394529,1566394529,FR +1566394530,1566394530,NO +1566394531,1566394531,DE +1566394532,1566394532,PL +1566394533,1566394533,NL +1566394534,1566394534,SE +1566394535,1566394535,PT +1566394536,1566394536,GB +1566394537,1566394538,NO +1566394539,1566394539,RU +1566394540,1566396415,NO +1566396416,1566398463,GB +1566398464,1566400511,RU +1566400512,1566400607,NO +1566400608,1566400639,GB +1566400640,1566400671,NO +1566400672,1566400703,DE +1566400704,1566400735,NL +1566400736,1566401023,NO +1566401024,1566401087,US +1566401088,1566401151,NO +1566401152,1566401279,US +1566401280,1566401599,NO +1566401600,1566401631,HK +1566401632,1566401663,NO +1566401664,1566401695,SG +1566401696,1566401727,NO +1566401728,1566401759,AU +1566401760,1566402303,NO +1566402304,1566402559,SG +1566404608,1566406655,ES +1566406656,1566408703,NL +1566408704,1566410751,GB +1566410752,1566412799,RU +1566412800,1566414847,JO +1566414848,1566416895,FR +1566416896,1566418943,IT +1566420992,1566423039,ES +1566423040,1566425087,FR +1566425088,1566427135,RS +1566427136,1566429183,IT +1566429184,1566437375,GB +1566439424,1566443519,DE +1566443520,1566445567,NO +1566445568,1566447615,PL +1566447616,1566451711,IT +1566451712,1566452032,IL +1566452033,1566452033,IT +1566452034,1566452034,FR +1566452035,1566452035,DE +1566452036,1566452036,BE +1566452037,1566452037,ES +1566452038,1566452038,IL +1566452039,1566452039,AT +1566452040,1566452042,IL +1566452043,1566452043,NL +1566452044,1566452045,GB +1566452046,1566452046,SE +1566452047,1566452047,CH +1566452048,1566452049,DK +1566452050,1566452050,IL +1566452051,1566452051,IE +1566452052,1566452052,CH +1566452053,1566452053,GB +1566452054,1566452057,UA +1566452058,1566452479,IL +1566452480,1566452735,IE +1566452736,1566453759,IL +1566453760,1566455807,IQ +1566455808,1566457855,PT +1566457856,1566459903,CH +1566459904,1566461951,GB +1566461952,1566463999,DE +1566464000,1566466047,IT +1566466048,1566468095,ES +1566468096,1566470143,BE +1566470144,1566471007,GB +1566471008,1566471011,IE +1566471012,1566471143,GB +1566471144,1566471147,IE +1566471148,1566474239,GB +1566474240,1566476287,DE +1566476288,1566478335,BG +1566478336,1566482431,RU +1566482432,1566484479,FR +1566484480,1566486527,SE +1566486528,1566488575,RU +1566488576,1566490623,PL +1566490624,1566492671,TR +1566492672,1566494719,NL +1566494720,1566496767,SE +1566496768,1566498815,AM +1566498816,1566500863,NL +1566500864,1566502911,RU +1566502912,1566504959,CH +1566504960,1566507007,TR +1566507008,1566509055,NL +1566509056,1566511103,GB +1566511104,1566513151,GG +1566513152,1566515199,BH +1566515200,1566517247,CZ +1566517248,1566519295,RU +1566519296,1566521343,BE +1566521344,1566523391,FR +1566523392,1566525439,MK +1566525440,1566527487,IS +1566527488,1566529535,IE +1566529536,1566531583,PL +1566531584,1566533631,RU +1566533632,1566535679,GB +1566535680,1566537727,NL +1566537728,1566539775,GB +1566539776,1566541823,DE +1566541824,1566543871,RU +1566543872,1566545919,NL +1566545920,1566552063,RU +1566552064,1566554111,TR +1566554112,1566556159,UA +1566556160,1566558207,RU +1566558208,1566560255,JO +1566560256,1566564351,IT +1566564352,1566566399,IS +1566566400,1566568447,FR +1566568448,1566570495,KZ +1566570496,1566572543,NL +1566572544,1566703615,GB +1566703616,1566769151,SA +1566769152,1566834687,CZ +1566834688,1566900223,RU +1566900224,1566965759,IT +1566965760,1567031295,PT +1567031296,1567096831,SI +1567096832,1567162367,DE +1567162368,1567227903,PL +1567227904,1567293439,FI +1567293440,1567358975,IE +1567358976,1567424511,PT +1567424512,1567490047,CY +1567490048,1567531007,IR +1567531008,1567532031,GB +1567532032,1567535103,IR +1567535104,1567539199,GB +1567539200,1567555583,IR +1567555584,1567621119,AT +1567621120,1567686655,SA +1567686656,1567690751,RO +1567690752,1567692799,ES +1567692800,1567693311,RO +1567693312,1567693823,ES +1567693824,1567696383,RO +1567696384,1567696639,FR +1567696640,1567696895,ES +1567696896,1567698175,RO +1567698176,1567698431,SE +1567698432,1567698943,RO +1567698944,1567699967,ES +1567699968,1567702015,RO +1567702016,1567703039,TR +1567703040,1567705087,MD +1567705088,1567707135,BG +1567707136,1567709183,MD +1567709184,1567709439,RO +1567709440,1567709695,IT +1567709696,1567710207,RO +1567710208,1567711231,MD +1567711232,1567711487,TR +1567711488,1567711743,PL +1567711744,1567712511,RO +1567712512,1567712767,PL +1567712768,1567713023,GB +1567713024,1567714815,RO +1567714816,1567715327,GB +1567715328,1567717375,MD +1567717376,1567718399,GR +1567718400,1567719167,RO +1567719168,1567719423,GB +1567719424,1567720191,RO +1567720192,1567720447,NO +1567720448,1567721471,RO +1567721472,1567723519,ES +1567723520,1567727359,RO +1567727360,1567727615,GB +1567727616,1567728639,RO +1567728640,1567729663,SY +1567729664,1567733759,RO +1567733760,1567735807,US +1567735808,1567739391,RO +1567739392,1567739903,FR +1567739904,1567740927,DE +1567740928,1567741951,RO +1567741952,1567742975,GR +1567742976,1567743231,IE +1567743232,1567743487,ES +1567743488,1567743999,RO +1567744000,1567748095,IR +1567748096,1567749119,RO +1567749120,1567750143,MD +1567750144,1567750655,RO +1567750656,1567751167,BG +1567751168,1567752191,RO +1567752192,1567756287,MD +1567756288,1567760383,IR +1567760384,1567765247,RO +1567765248,1567766271,GB +1567766272,1567767039,RO +1567767040,1567767551,GB +1567767552,1567768575,ES +1567768576,1567769343,RO +1567769344,1567769599,NL +1567769600,1567769855,RO +1567769856,1567770111,GB +1567770112,1567773951,RO +1567773952,1567774207,ES +1567774208,1567774719,GB +1567774720,1567775743,RO +1567775744,1567776767,AU +1567776768,1567778815,RO +1567778816,1567780863,IR +1567780864,1567785471,RO +1567785472,1567785727,TR +1567785728,1567785983,ES +1567785984,1567786239,FR +1567786240,1567789055,RO +1567789056,1567793151,ES +1567793152,1567795455,RO +1567795456,1567795711,GB +1567795712,1567799295,RO +1567799296,1567799467,GB +1567799468,1567799468,RO +1567799469,1567799807,GB +1567799808,1567802367,RO +1567802368,1567803391,GR +1567803392,1567805439,ES +1567805440,1567807487,SY +1567807488,1567809535,RO +1567809536,1567811583,ES +1567811584,1567812095,RO +1567812096,1567812607,GB +1567812608,1567813631,US +1567813632,1567814655,ES +1567814656,1567816703,RO +1567816704,1567817727,ES +1567817728,1567819775,RO +1567819776,1567820031,GB +1567820032,1567820287,RO +1567820288,1567820543,TR +1567820544,1567820799,LT +1567820800,1567823871,RO +1567823872,1567825919,LT +1567825920,1567826175,RO +1567826176,1567826431,DE +1567826432,1567827455,RO +1567827456,1567827711,BG +1567827712,1567830015,RO +1567830016,1567831039,US +1567831040,1567832831,RO +1567832832,1567833087,GB +1567833088,1567833599,NL +1567833600,1567834111,IT +1567834112,1567837183,RO +1567837184,1567838207,TR +1567838208,1567842303,RO +1567842304,1567842815,FR +1567842816,1567843839,RO +1567843840,1567844351,DE +1567844352,1567846143,RO +1567846144,1567846399,GB +1567846400,1567848447,RO +1567848448,1567850495,IR +1567850496,1567852543,ES +1567852544,1567854591,MD +1567854592,1567856639,IR +1567856640,1567857407,RO +1567857408,1567857663,US +1567857664,1567858687,ES +1567858688,1567860735,SE +1567860736,1567861247,BE +1567861248,1567861759,IT +1567861760,1567862783,RO +1567862784,1567866879,GB +1567866880,1567867135,IN +1567867136,1567867391,RO +1567867392,1567867519,GB +1567867520,1567867903,RO +1567867904,1567868927,ES +1567868928,1567869183,RO +1567869184,1567869439,GB +1567869440,1567869951,RO +1567869952,1567870975,ES +1567870976,1567871999,RO +1567872000,1567873023,ES +1567873024,1567879167,IR +1567879168,1567880191,RO +1567880192,1567880703,BG +1567880704,1567883263,RO +1567883264,1567948799,MD +1567948800,1567961087,IR +1567961088,1567965183,MD +1567965184,1567966207,RO +1567966208,1567969279,MD +1567969280,1567973375,ES +1567973376,1567981567,IR +1567981568,1567983615,MD +1567983616,1567983871,ES +1567983872,1567984127,GB +1567984128,1567984639,RO +1567984640,1567987711,MD +1567987712,1567988223,IT +1567988224,1567988735,RO +1567988736,1567992831,MD +1567992832,1567993343,IT +1567993344,1567993599,GB +1567993600,1567993855,RO +1567993856,1567997951,IR +1567997952,1568014335,NL +1568014336,1568022527,DE +1568022528,1568023551,FR +1568023552,1568023807,RO +1568023808,1568024063,IT +1568024064,1568024319,SG +1568024320,1568024575,RO +1568024576,1568025599,US +1568025600,1568026623,RO +1568026624,1568030719,SY +1568030720,1568034815,ES +1568034816,1568038911,RO +1568038912,1568059391,IR +1568059392,1568060415,MD +1568060416,1568062463,IR +1568062464,1568063487,MD +1568063488,1568083967,RO +1568083968,1568084223,CN +1568084224,1568084991,RO +1568084992,1568086015,CN +1568086016,1568087039,RO +1568087040,1568088063,ES +1568088064,1568104447,IR +1568104448,1568106495,MD +1568106496,1568107519,RO +1568107520,1568108543,MD +1568108544,1568109055,GB +1568109056,1568110079,RO +1568110080,1568111103,GB +1568111104,1568111359,RO +1568111360,1568111615,NL +1568111616,1568112127,GB +1568112128,1568112639,RO +1568112640,1568114687,MD +1568114688,1568115711,RO +1568115712,1568118783,MD +1568118784,1568119807,RO +1568119808,1568120831,ES +1568120832,1568122879,MD +1568122880,1568130047,RO +1568130048,1568133119,MD +1568133120,1568137215,IR +1568137216,1568138239,RO +1568138240,1568141311,MD +1568141312,1568145407,DE +1568145408,1568178175,RO +1568178176,1568210943,RU +1568210944,1568243711,GB +1568243712,1568276479,GP +1568276480,1568309247,DE +1568309248,1568342015,RO +1568342016,1568369043,BG +1568369044,1568369044,DE +1568369045,1568369049,BG +1568369050,1568369050,DE +1568369051,1568369062,BG +1568369063,1568369063,DE +1568369064,1568369076,BG +1568369077,1568369077,DE +1568369078,1568374783,BG +1568374784,1568440319,RU +1568440320,1568473087,NO +1568473088,1568505855,BY +1568505856,1568538623,NL +1568538624,1568555007,IR +1568555008,1568571391,UA +1568571392,1568604159,LB +1568604160,1568636927,UA +1568636928,1568661503,DE +1568661504,1568669695,US +1568669696,1569193983,DE +1569193984,1569718271,HR +1569718272,1570242559,IT +1570242560,1570275327,GB +1570275328,1570308095,BG +1570308096,1570340863,CZ +1570340864,1570373631,RU +1570373632,1570406399,NL +1570406400,1570439167,PL +1570439168,1570471935,TR +1570471936,1570504703,BG +1570504704,1570570239,ES +1570570240,1570572287,NL +1570572288,1570574335,UA +1570574336,1570576383,RU +1570576384,1570578431,UA +1570578432,1570580479,CH +1570580480,1570582527,RU +1570582528,1570584575,DE +1570584576,1570586623,RU +1570586624,1570590719,PL +1570590720,1570592767,IL +1570592768,1570596863,PL +1570598912,1570600959,PL +1570600960,1570603007,RU +1570603008,1570605055,CZ +1570605056,1570607103,NL +1570607104,1570609151,RU +1570609152,1570611199,PL +1570611200,1570619391,RU +1570619392,1570621439,BA +1570621440,1570625535,RU +1570625536,1570627583,GB +1570627584,1570629631,KG +1570629632,1570635775,RU +1570635776,1570644991,FR +1570644992,1570645247,GB +1570645248,1570652159,FR +1570652160,1570660863,SE +1570660864,1570661375,NO +1570661376,1570661631,GB +1570661632,1570662143,SE +1570662144,1570662399,DE +1570662400,1570668543,SE +1570668544,1570686975,RU +1570686976,1570693119,NL +1570693120,1570695167,RU +1570695168,1570696191,PL +1570696192,1570697215,NL +1570697216,1570701311,RU +1570701312,1570717695,PL +1570717696,1570725887,HR +1570725888,1570734079,DE +1570734080,1570750463,PL +1570750464,1570752511,AL +1570752512,1570754559,GB +1570754560,1570756607,ES +1570756608,1570764799,RU +1570764800,1570766847,DE +1570766848,1571291135,DK +1571291136,1571422207,SA +1571422208,1571422463,CZ +1571422464,1571422719,UA +1571422720,1571423231,RU +1571423232,1571423487,UA +1571423488,1571424255,RU +1571424256,1571424511,KG +1571424512,1571424767,AM +1571424768,1571425023,CZ +1571425024,1571425024,RU +1571425025,1571425148,CZ +1571425149,1571425149,RU +1571425150,1571425231,CZ +1571425232,1571425232,RU +1571425233,1571425279,CZ +1571425280,1571425535,RU +1571425536,1571425791,NL +1571425792,1571425871,CZ +1571425872,1571425872,RU +1571425873,1571426047,CZ +1571426048,1571426303,UA +1571426304,1571428351,RU +1571428352,1571429375,UA +1571429376,1571430399,BY +1571430400,1571430911,UA +1571430912,1571431167,BY +1571431168,1571431423,UA +1571431424,1571432447,KZ +1571432448,1571434495,RU +1571434496,1571435519,UA +1571435520,1571436031,RU +1571436032,1571436543,UA +1571436544,1571438591,BA +1571438592,1571440639,UA +1571440640,1571440895,RU +1571440896,1571441151,CZ +1571441152,1571441407,RU +1571441408,1571441663,UA +1571441664,1571441919,RU +1571441920,1571442175,CZ +1571442176,1571442687,NL +1571442688,1571443199,UA +1571443200,1571443711,RU +1571443712,1571444991,CZ +1571444992,1571445247,UA +1571445248,1571446271,NL +1571446272,1571446783,RU +1571446784,1571447039,GB +1571447040,1571447295,UA +1571447296,1571447807,RU +1571447808,1571448063,CZ +1571448064,1571448339,RU +1571448340,1571448340,US +1571448341,1571448831,RU +1571448832,1571449343,NL +1571449344,1571449855,CZ +1571449856,1571451391,RU +1571451392,1571452927,UA +1571452928,1571455999,RU +1571456000,1571456511,UA +1571456512,1571456767,CZ +1571456768,1571457023,UA +1571457024,1571457535,CZ +1571457536,1571458559,RU +1571458560,1571458815,CZ +1571458816,1571459071,BY +1571459072,1571463167,UA +1571463168,1571464191,UZ +1571464192,1571465215,BY +1571465216,1571466239,CZ +1571466240,1571467007,RU +1571467008,1571467263,UA +1571467264,1571467775,RU +1571467776,1571468287,CZ +1571468288,1571469311,RU +1571469312,1571469823,BY +1571469824,1571470079,CZ +1571470080,1571470335,LT +1571470336,1571470847,UA +1571470848,1571475455,RU +1571475456,1571475967,UA +1571475968,1571476479,UZ +1571476480,1571477503,RU +1571477504,1571477506,CZ +1571477507,1571477507,RU +1571477508,1571478015,CZ +1571478016,1571478271,RU +1571478272,1571478527,UA +1571478528,1571479551,RU +1571479552,1571483647,CZ +1571483648,1571484159,RU +1571484160,1571484671,CZ +1571484672,1571486719,RU +1571486720,1571486975,BY +1571486976,1571487231,NL +1571487232,1571488767,RU +1571488768,1571489023,CZ +1571489024,1571489279,UA +1571489280,1571489535,BY +1571489536,1571491071,RU +1571491072,1571491327,CZ +1571491328,1571495935,UA +1571495936,1571496447,RU +1571496448,1571497983,BY +1571497984,1571500031,RU +1571500032,1571504127,BY +1571504128,1571508223,UA +1571508224,1571514367,RU +1571514368,1571520511,BY +1571520512,1571521535,UA +1571521536,1571521894,GB +1571521895,1571521895,RU +1571521896,1571522047,GB +1571522048,1571522815,RU +1571522816,1571523583,CZ +1571523584,1571525631,RU +1571525632,1571526655,UZ +1571526656,1571526911,UA +1571526912,1571527167,KZ +1571527168,1571527423,UA +1571527424,1571527679,SK +1571527680,1571528191,RU +1571528192,1571528703,UA +1571528704,1571529215,BY +1571529216,1571529471,CZ +1571529472,1571529727,UA +1571529728,1571531007,RU +1571531008,1571531263,CZ +1571531264,1571532031,UA +1571532032,1571532287,RU +1571532288,1571532543,CZ +1571532544,1571532799,RU +1571532800,1571534079,CZ +1571534080,1571534847,RU +1571534848,1571535103,LV +1571535104,1571535359,UA +1571535360,1571535617,CZ +1571535618,1571535618,RU +1571535619,1571535871,CZ +1571535872,1571540479,RU +1571540480,1571540693,CZ +1571540694,1571540695,RU +1571540696,1571540696,CZ +1571540697,1571540697,RU +1571540698,1571540991,CZ +1571540992,1571541247,RU +1571541248,1571541503,UA +1571541504,1571542015,CZ +1571542016,1571542527,RU +1571542528,1571542783,SK +1571542784,1571543039,CZ +1571543040,1571543551,NL +1571543552,1571543807,UA +1571543808,1571545343,RU +1571545344,1571545599,UA +1571545600,1571545855,CZ +1571545856,1571546111,RU +1571546112,1571546623,UZ +1571546624,1571546879,NL +1571546880,1571547135,RU +1571547136,1571548159,UA +1571548160,1571549183,RU +1571549184,1571550207,UA +1571550208,1571550463,RU +1571550464,1571553279,UA +1571553280,1571684351,IL +1571684352,1571686399,ES +1571686400,1571688447,GB +1571688448,1571690495,CH +1571690496,1571692543,PL +1571692544,1571694591,FR +1571694592,1571696639,LU +1571696640,1571700735,RU +1571700736,1571702783,IT +1571702784,1571704831,RU +1571704832,1571706879,GB +1571706880,1571708179,SC +1571708180,1571708180,NL +1571708181,1571708338,SC +1571708339,1571708339,NL +1571708340,1571708677,SC +1571708678,1571708679,NL +1571708680,1571708927,SC +1571708928,1571709439,GB +1571709440,1571709567,DE +1571709568,1571709695,GB +1571709696,1571709823,FR +1571709824,1571709951,GB +1571709952,1571710079,NL +1571710080,1571710207,GB +1571710208,1571710335,ES +1571710336,1571710463,GB +1571710464,1571710591,IT +1571710592,1571710975,GB +1571710976,1571713023,NL +1571713024,1571715071,RU +1571715072,1571717119,GR +1571717120,1571719167,RU +1571719168,1571721215,GB +1571721216,1571723263,FR +1571723264,1571725311,GB +1571725312,1571727359,RO +1571727360,1571729407,IE +1571729408,1571731455,SK +1571731456,1571733503,CH +1571733504,1571735551,FI +1571735552,1571737599,NL +1571738112,1571738367,NL +1571739648,1571741695,GB +1571741696,1571743743,RU +1571743744,1571745791,GB +1571745792,1571747839,RU +1571747840,1571748095,GB +1571748096,1571748351,US +1571748352,1571748607,SG +1571748608,1571748863,GB +1571748864,1571749119,US +1571749120,1571749375,SG +1571749376,1571749887,US +1571749888,1571758079,RU +1571758080,1571766271,IL +1571766272,1571786751,PL +1571790848,1571794943,PL +1571794944,1571799039,NL +1571799040,1571815423,UA +1571815424,1571831807,FR +1571831808,1571848191,DK +1571848192,1571864575,ES +1571864576,1571880959,PL +1571880960,1571897343,RU +1571913728,1571930111,GE +1571930112,1571946495,LV +1571946496,1571962879,SA +1571962880,1571979263,RU +1571979264,1571995647,DK +1571995648,1572012031,UA +1572012032,1572020223,NO +1572020224,1572028415,SE +1572028416,1572028927,RU +1572028928,1572029183,UA +1572029184,1572034815,RU +1572034816,1572034943,BY +1572034944,1572035071,US +1572035072,1572035199,CZ +1572035200,1572035327,NG +1572035328,1572035455,US +1572035456,1572044799,RU +1572044800,1572061183,IT +1572061184,1572077567,PL +1572077568,1572093951,RU +1572093952,1572095999,NL +1572096000,1572098047,DE +1572098048,1572100095,DK +1572100096,1572102143,CH +1572102144,1572110335,BA +1572110336,1572110591,US +1572110592,1572112383,GB +1572112384,1572114431,RU +1572114432,1572116479,BA +1572116480,1572118527,DE +1572118528,1572126719,PL +1572126720,1572143103,UA +1572143104,1572159487,DE +1572159488,1572175871,CZ +1572175872,1572192255,PL +1572192256,1572225023,RU +1572225024,1572241407,TR +1572241408,1572257791,SE +1572257792,1572274175,FR +1572274176,1572276223,FI +1572276224,1572277247,US +1572277248,1572290559,SG +1572290560,1572306943,RU +1572306944,1572323327,BG +1572323328,1572339711,UA +1572339712,1572343807,PS +1572343808,1572347903,CH +1572347904,1572351999,FR +1572352000,1572356095,DE +1572356096,1572360191,SK +1572360192,1572362751,XK +1572362752,1572364287,RS +1572364288,1572368383,NL +1572368384,1572372479,NO +1572372480,1572376575,DE +1572376576,1572380671,TR +1572380672,1572384767,RU +1572384768,1572388863,DE +1572388864,1572392959,DK +1572392960,1572393471,NL +1572393472,1572393983,GB +1572393984,1572394495,DE +1572394496,1572394751,FR +1572394752,1572395263,US +1572395264,1572395519,NL +1572395520,1572397055,US +1572397056,1572401151,AZ +1572401152,1572405247,GB +1572405248,1572409343,CZ +1572409344,1572413439,RU +1572413440,1572417535,AM +1572417536,1572421631,CZ +1572421632,1572425727,KZ +1572425728,1572429823,LB +1572429824,1572433919,CZ +1572433920,1572438015,IT +1572438016,1572442111,AT +1572442112,1572446207,RU +1572450304,1572458495,RU +1572458496,1572462591,UA +1572462592,1572466687,LB +1572466688,1572470783,EE +1572470784,1572474879,DE +1572474880,1572475391,ZA +1572475392,1572483071,GB +1572483072,1572487167,RU +1572487168,1572491007,RS +1572491008,1572491263,LU +1572491264,1572495359,IT +1572495360,1572499455,RU +1572499456,1572503551,TR +1572503552,1572505983,IT +1572505984,1572506623,GR +1572506624,1572507199,IT +1572507200,1572507207,GB +1572507208,1572507647,IT +1572507648,1572511743,GB +1572511744,1572515839,DE +1572515840,1572519935,NL +1572519936,1572520447,DE +1572520448,1572520703,ES +1572520704,1572524031,DE +1572524032,1572528127,GE +1572528128,1572532223,RU +1572532224,1572536319,IT +1572536320,1572538367,GG +1572538368,1572540415,NL +1572540416,1572542463,GB +1572542464,1572544511,IT +1572544512,1572546559,IQ +1572546560,1572548607,FR +1572548608,1572550655,NL +1572550656,1572552703,DE +1572552704,1572554751,TR +1572554752,1572556799,RU +1572556800,1572558847,NO +1572558848,1572560895,IT +1572560896,1572562943,RU +1572562944,1572564991,CZ +1572564992,1572567039,DE +1572567040,1572569087,RU +1572571136,1572573183,US +1572573184,1572574207,GG +1572574208,1572575231,GB +1572575232,1572577279,RU +1572577280,1572579327,AM +1572579328,1572581375,GB +1572581376,1572585471,RU +1572585472,1572587519,CH +1572587520,1572589567,TR +1572589568,1572591615,CH +1572591616,1572593663,NL +1572593664,1572595711,GB +1572595712,1572597759,DE +1572597760,1572599807,RS +1572599808,1572601855,DE +1572601856,1572603903,SE +1572603904,1572605951,GE +1572605952,1572607999,RU +1572608000,1572610047,DE +1572610048,1572612095,UA +1572612096,1572614143,RU +1572614144,1572616191,ES +1572618240,1572620287,NL +1572620288,1572622335,CH +1572622336,1572624383,RU +1572624384,1572626431,NO +1572626432,1572628479,IT +1572628480,1572630527,DE +1572630528,1572632575,IT +1572632576,1572634623,RU +1572634624,1572634879,BE +1572634880,1572635135,PT +1572635136,1572635391,RO +1572635392,1572635647,FR +1572635648,1572635903,ES +1572635904,1572636159,DE +1572636160,1572636415,IT +1572636416,1572636671,NL +1572636672,1572638719,ES +1572638720,1572640767,FR +1572640768,1572642815,RU +1572642816,1572644863,US +1572644864,1572646911,FR +1572646912,1572648959,GB +1572648960,1572651007,RU +1572651008,1572653055,BH +1572653056,1572657151,RU +1572657152,1572659199,DE +1572659200,1572661247,IT +1572661248,1572663295,NO +1572663296,1572665343,DE +1572665344,1572667391,NL +1572667392,1572669439,GB +1572669440,1572673535,RU +1572673536,1572675583,AT +1572675584,1572677631,ES +1572677632,1572681727,RU +1572681728,1572682751,NL +1572682752,1572683007,DE +1572683008,1572683263,NL +1572683264,1572683519,DE +1572683520,1572683775,RU +1572683776,1572685823,CH +1572685824,1572689919,RU +1572689920,1572691967,ES +1572691968,1572694015,SA +1572694016,1572696063,GB +1572696064,1572698111,HU +1572700160,1572702207,NL +1572702208,1572704255,IT +1572704256,1572706303,RU +1572706304,1572708351,DE +1572708352,1572710399,GG +1572710400,1572712447,DE +1572712448,1572714495,ES +1572714496,1572716543,IT +1572716544,1572718591,SA +1572718592,1572720639,RU +1572720640,1572722687,IT +1572722688,1572724735,RU +1572724736,1572726783,BY +1572726784,1572728831,CH +1572728832,1572730879,SE +1572730880,1572732927,RU +1572732928,1572734975,HU +1572737024,1572739071,RU +1572739072,1572741119,IR +1572743168,1572745215,UA +1572745216,1572749311,CZ +1572749312,1572751359,DE +1572751360,1572753407,CH +1572753408,1572755455,NO +1572755456,1572757503,DE +1572757504,1572759551,FI +1572759552,1572761599,RU +1572761600,1572763647,GB +1572763648,1572765695,TR +1572765696,1572767743,CZ +1572767744,1572769791,NL +1572769792,1572771839,RO +1572771840,1572773887,ES +1572773888,1572775935,RS +1572775936,1572777983,GB +1572777984,1572780031,UA +1572780032,1572782079,NL +1572782080,1572784127,SE +1572784128,1572786175,RU +1572786176,1572788223,FR +1572788224,1572790271,TR +1572790272,1572792319,RU +1572792320,1572794367,DE +1572794368,1572796415,RU +1572796416,1572798463,DE +1572798464,1572800511,NL +1572800512,1572800738,RU +1572800739,1572800740,UA +1572800741,1572800741,RU +1572800742,1572800742,UA +1572800743,1572804607,RU +1572804608,1572808703,GB +1572808704,1572810751,FR +1572810752,1572812799,DE +1572812800,1572814847,RU +1572814848,1572816895,KW +1572816896,1572818943,RU +1572818944,1572820991,FR +1572820992,1572823039,CH +1572823040,1572825087,BY +1572825088,1572827135,RU +1572829184,1572831231,FI +1572831232,1572833279,NL +1572833280,1572835327,ES +1572835328,1572837375,IE +1572837376,1572839423,DK +1572839424,1572841471,DE +1572841728,1572841983,GB +1572842752,1572843007,NL +1572843520,1572845567,JO +1572845568,1572847615,FR +1572847616,1572849663,GI +1572849664,1572851711,JE +1572851712,1572853759,DE +1572853760,1572855807,BE +1572855808,1572857855,KZ +1572857856,1572859903,SE +1572859904,1572861951,IT +1572861952,1572863999,CH +1572864000,1577058303,DE +1577058304,1578106879,GB +1578106880,1578115071,DE +1578115072,1578123263,AT +1578123264,1578139647,DE +1578139648,1578172415,CH +1578172416,1578237951,MT +1578237952,1578303487,DK +1578303488,1578369023,RU +1578369024,1578434559,AZ +1578434560,1578500095,HU +1578500096,1578565631,FI +1578565632,1578579321,FR +1578579322,1578579322,HR +1578579323,1578582015,FR +1578582016,1578584063,IT +1578584064,1578584355,FR +1578584356,1578584356,IT +1578584357,1578584575,FR +1578584576,1578585299,PT +1578585300,1578585300,FR +1578585301,1578586111,PT +1578586112,1578588159,ES +1578588160,1578590207,PL +1578590208,1578590283,FR +1578590284,1578590287,GB +1578590288,1578590787,FR +1578590788,1578590791,ES +1578590792,1578590815,FR +1578590816,1578590831,GB +1578590832,1578590851,FR +1578590852,1578590855,ES +1578590856,1578590863,FR +1578590864,1578590879,BE +1578590880,1578590895,FR +1578590896,1578590911,FI +1578590912,1578590935,FR +1578590936,1578590943,ES +1578590944,1578591143,FR +1578591144,1578591151,GB +1578591152,1578591247,FR +1578591248,1578591263,GB +1578591264,1578591407,FR +1578591408,1578591411,ES +1578591412,1578591579,FR +1578591580,1578591583,ES +1578591584,1578591695,FR +1578591696,1578591699,ES +1578591700,1578591791,FR +1578591792,1578591795,ES +1578591796,1578591999,FR +1578592000,1578592031,DE +1578592032,1578592071,FR +1578592072,1578592079,ES +1578592080,1578592111,FR +1578592112,1578592127,ES +1578592128,1578592175,FR +1578592176,1578592183,CZ +1578592184,1578592191,PT +1578592192,1578592199,BE +1578592200,1578592207,CH +1578592208,1578592375,FR +1578592376,1578592379,GB +1578592380,1578592423,FR +1578592424,1578592431,IE +1578592432,1578592539,FR +1578592540,1578592543,ES +1578592544,1578592803,FR +1578592804,1578592807,PL +1578592808,1578593023,FR +1578593024,1578593279,DE +1578593280,1578593319,FR +1578593320,1578593323,PT +1578593324,1578593375,FR +1578593376,1578593407,GB +1578593408,1578593439,FR +1578593440,1578593443,ES +1578593444,1578593495,FR +1578593496,1578593499,PT +1578593500,1578593695,FR +1578593696,1578593703,GB +1578593704,1578593887,FR +1578593888,1578593895,ES +1578593896,1578593955,FR +1578593956,1578593959,ES +1578593960,1578594055,FR +1578594056,1578594059,ES +1578594060,1578594063,FR +1578594064,1578594079,PL +1578594080,1578594271,FR +1578594272,1578594303,BE +1578594304,1578594307,FR +1578594308,1578594311,FI +1578594312,1578594351,FR +1578594352,1578594355,GB +1578594356,1578594479,FR +1578594480,1578594495,ES +1578594496,1578594559,FR +1578594560,1578594815,ES +1578594816,1578594879,FR +1578594880,1578594895,DE +1578594896,1578595039,FR +1578595040,1578595055,GB +1578595056,1578595103,FR +1578595104,1578595119,GB +1578595120,1578595127,FR +1578595128,1578595131,PL +1578595132,1578595151,FR +1578595152,1578595167,ES +1578595168,1578595275,FR +1578595276,1578595279,ES +1578595280,1578595419,FR +1578595420,1578595423,GB +1578595424,1578595447,FR +1578595448,1578595455,ES +1578595456,1578595471,FR +1578595472,1578595479,ES +1578595480,1578595487,GB +1578595488,1578595535,FR +1578595536,1578595543,LT +1578595544,1578595643,FR +1578595644,1578595647,GB +1578595648,1578595711,FR +1578595712,1578595743,GB +1578595744,1578595763,FR +1578595764,1578595767,DE +1578595768,1578595807,FR +1578595808,1578595823,ES +1578595824,1578595987,FR +1578595988,1578595991,ES +1578595992,1578596107,FR +1578596108,1578596111,ES +1578596112,1578596123,FR +1578596124,1578596127,ES +1578596128,1578596175,FR +1578596176,1578596183,ES +1578596184,1578596255,FR +1578596256,1578596287,GB +1578596288,1578596319,FR +1578596320,1578596327,ES +1578596328,1578596351,FR +1578596352,1578596863,GB +1578596864,1578602495,FR +1578602496,1578604543,NL +1578604544,1578606591,GB +1578606592,1578608639,DE +1578608640,1578610687,CZ +1578610688,1578610695,FR +1578610696,1578610703,ES +1578610704,1578611039,FR +1578611040,1578611043,ES +1578611044,1578611167,FR +1578611168,1578611175,DE +1578611176,1578611183,FR +1578611184,1578611191,ES +1578611192,1578611423,FR +1578611424,1578611439,CZ +1578611440,1578611871,FR +1578611872,1578611887,GB +1578611888,1578611967,FR +1578611968,1578611971,DE +1578611972,1578611979,FR +1578611980,1578611983,DE +1578611984,1578611999,FR +1578612000,1578612007,ES +1578612008,1578612059,FR +1578612060,1578612063,ES +1578612064,1578612247,FR +1578612248,1578612255,ES +1578612256,1578612319,FR +1578612320,1578612351,IT +1578612352,1578612495,FR +1578612496,1578612499,DE +1578612500,1578612907,FR +1578612908,1578612911,ES +1578612912,1578613436,FR +1578613437,1578613437,ES +1578613438,1578613491,FR +1578613492,1578613495,IE +1578613496,1578613679,FR +1578613680,1578613695,ES +1578613696,1578613735,FR +1578613736,1578613739,ES +1578613740,1578614203,FR +1578614204,1578614271,GB +1578614272,1578614319,FR +1578614320,1578614323,RU +1578614324,1578614327,HU +1578614328,1578614399,FR +1578614400,1578614403,EE +1578614404,1578614423,FR +1578614424,1578614427,IS +1578614428,1578614431,LV +1578614432,1578614435,BG +1578614436,1578614459,FR +1578614460,1578614463,NO +1578614464,1578614471,FR +1578614472,1578614475,SI +1578614476,1578614479,UA +1578614480,1578614495,FR +1578614496,1578614511,DE +1578614512,1578614583,FR +1578614584,1578614591,GB +1578614592,1578615915,FR +1578615916,1578615916,GB +1578615917,1578631167,FR +1578631168,1578637311,IR +1578637312,1578638335,RO +1578638336,1578638591,PL +1578638592,1578638847,RO +1578638848,1578639359,US +1578639360,1578640383,ES +1578640384,1578640895,RO +1578640896,1578643455,ES +1578643456,1578645503,RO +1578645504,1578647551,AT +1578647552,1578649599,US +1578649600,1578651391,RO +1578651392,1578651647,PL +1578651648,1578657791,IR +1578657792,1578658815,ES +1578658816,1578659327,US +1578659328,1578659839,RO +1578659840,1578663935,ES +1578663936,1578762239,RU +1578762240,1578768383,BG +1578768384,1578768895,US +1578768896,1578778623,BG +1578778624,1578779135,US +1578779136,1578786047,BG +1578786048,1578786303,GI +1578786304,1578786559,BG +1578786560,1578786815,GI +1578786816,1578787071,BG +1578787072,1578787839,GI +1578787840,1578788095,BG +1578788096,1578788351,GI +1578788352,1578788607,BG +1578788608,1578788863,GI +1578788864,1578790143,BG +1578790144,1578790399,GI +1578790400,1578790911,US +1578790912,1578795007,PS +1578795008,1578827775,RU +1578827776,1578860543,UA +1578860544,1578893311,HU +1578893312,1578991615,RU +1578991616,1579024383,KW +1579024384,1579057151,GB +1579057152,1579089919,LV +1579089920,1579106303,GB +1579106304,1579122687,DE +1579122688,1579155455,RU +1579155456,1579679743,IT +1579679744,1579745279,PL +1579745280,1579810815,RU +1579810816,1579876351,PL +1579876352,1579941887,GE +1579941888,1580007423,HU +1580007424,1580015615,RU +1580015616,1580048383,UA +1580048384,1580064767,RU +1580064768,1580072959,GB +1580072960,1580075007,TR +1580075008,1580075199,SE +1580075200,1580075231,PT +1580075232,1580076031,SE +1580076032,1580077055,PT +1580077056,1580078079,ES +1580078080,1580081151,PT +1580081152,1580083199,TR +1580083200,1580087565,US +1580087566,1580087566,SE +1580087567,1580087807,US +1580087808,1580088063,BE +1580088064,1580089102,US +1580089103,1580089103,SE +1580089104,1580089343,US +1580089344,1580097535,DE +1580097536,1580098047,GB +1580098048,1580098303,US +1580098304,1580101955,GB +1580101956,1580101956,SE +1580101957,1580102718,GB +1580102719,1580102719,SE +1580102720,1580105007,GB +1580105008,1580105008,SE +1580105009,1580105727,GB +1580105728,1580107775,PT +1580107776,1580109055,SE +1580109056,1580109567,PT +1580109568,1580109823,SE +1580109824,1580113919,US +1580113920,1580120063,PT +1580120064,1580121087,GB +1580121088,1580122111,NL +1580122112,1580123135,GB +1580123136,1580125183,CY +1580125184,1580125695,NL +1580125696,1580125951,TR +1580125952,1580126207,GB +1580126208,1580128255,CY +1580128256,1580129279,NL +1580129280,1580130303,GB +1580130304,1580134399,CY +1580134400,1580135423,SE +1580135424,1580136447,GB +1580136448,1580137215,SE +1580137216,1580137471,PT +1580137472,1580138495,SE +1580138496,1580204031,SY +1580204032,1580335103,SA +1580335104,1580466175,RU +1580466176,1580597247,RO +1580597248,1580728319,TR +1580728320,1580990463,AE +1580990464,1581252607,PT +1581252608,1581776895,GR +1581776896,1581793279,RU +1581793280,1581809663,PL +1581809664,1581826047,BG +1581826048,1581842431,GB +1581842432,1581858815,BG +1581858816,1581875199,IT +1581875200,1581891583,TR +1581891584,1581907967,RU +1581907968,1581924351,IT +1581924352,1581940735,UA +1581940736,1581957119,IR +1581957120,1581973503,CZ +1581973504,1581989887,RU +1581989888,1582006271,PL +1582006272,1582022655,RU +1582022656,1582039039,NL +1582039040,1582055423,BH +1582055424,1582071807,UA +1582071808,1582088191,ES +1582088192,1582104575,GB +1582104576,1582153727,RU +1582153728,1582170111,SA +1582170112,1582186495,CH +1582186496,1582194271,TR +1582194272,1582194303,CY +1582194304,1582202879,TR +1582202880,1582219263,PL +1582219264,1582252031,RU +1582252032,1582268415,TR +1582268416,1582284799,DE +1582284800,1582301183,BH +1582301184,1583349759,IT +1583349760,1583611903,SA +1583611904,1583615999,LV +1583616000,1583617791,NL +1583617792,1583618047,US +1583618048,1583620095,NL +1583620096,1583624191,IT +1583624192,1583628287,RS +1583628288,1583632383,DE +1583632384,1583636479,RU +1583636480,1583640575,MK +1583640576,1583644671,NL +1583644672,1583648767,DE +1583648768,1583652863,CH +1583652864,1583656959,FR +1583656960,1583665151,RU +1583665152,1583669247,UA +1583669248,1583670271,GE +1583670272,1583670527,RU +1583670528,1583670655,GE +1583670656,1583671295,RU +1583671296,1583673343,GE +1583673344,1583677439,DE +1583677440,1583681535,FI +1583681536,1583685631,PL +1583685632,1583689727,DE +1583689728,1583693823,IT +1583693824,1583697919,RU +1583697920,1583702015,TR +1583702016,1583706111,RU +1583710208,1583714303,IR +1583714304,1583722495,GB +1583722496,1583726591,IR +1583726592,1583730687,BG +1583730688,1583734783,DK +1583734784,1583738879,LV +1583738880,1583742975,IR +1583742976,1583747071,TR +1583747072,1583751167,RU +1583751168,1583755263,NO +1583755264,1583756031,SC +1583756032,1583756287,NL +1583756288,1583759359,SC +1583759360,1583763455,TR +1583763456,1583765503,SY +1583765504,1583766015,RU +1583766016,1583766527,TR +1583766528,1583767551,SY +1583767552,1583771647,AT +1583771648,1583775743,RU +1583775744,1583779839,IT +1583779840,1583779847,GB +1583779848,1583779855,IT +1583779856,1583780423,GB +1583780424,1583780431,IT +1583780432,1583780743,GB +1583780744,1583780751,IT +1583780752,1583781343,GB +1583781344,1583781351,IT +1583781352,1583781359,GB +1583781360,1583781367,IT +1583781368,1583781671,GB +1583781672,1583781679,IT +1583781680,1583781863,GB +1583781864,1583781871,IT +1583781872,1583782415,GB +1583782416,1583782423,IT +1583782424,1583782431,GB +1583782432,1583782439,IT +1583782440,1583782975,GB +1583782976,1583782983,IT +1583782984,1583783935,GB +1583788032,1583792127,TM +1583792128,1583796223,IE +1583796224,1583800319,DE +1583800320,1583804415,ME +1583804416,1583808511,GB +1583808512,1583810559,MD +1583810560,1583810815,US +1583810816,1583811583,MD +1583811584,1583811839,RU +1583811840,1583812607,MD +1583812608,1583816351,NL +1583816352,1583816367,GB +1583816368,1583816703,NL +1583816704,1583817312,TR +1583817313,1583817344,GB +1583817345,1583820799,TR +1583820800,1583824895,LV +1583824896,1583828991,SI +1583828992,1583833087,RU +1583833088,1583837183,CH +1583841280,1583845375,FR +1583845376,1583849471,NL +1583849472,1583853567,DE +1583853568,1583857663,RU +1583857664,1583861759,SE +1583861760,1583865855,LU +1583865856,1583869951,RU +1583869952,1583874047,KZ +1583874048,1584398335,BE +1584398336,1584529407,CZ +1584529408,1584660479,DE +1584660480,1584857087,GB +1584857088,1584857855,DE +1584857856,1584857863,HR +1584857864,1584857871,GR +1584857872,1584857879,CZ +1584857880,1584857887,HU +1584857888,1584857895,PT +1584857896,1584857903,RS +1584857904,1584857911,GB +1584857912,1584857919,IE +1584857920,1584858111,DE +1584858112,1584859007,GB +1584859008,1584859135,NL +1584859136,1584922623,GB +1584922624,1585184767,TR +1585184768,1585190911,PL +1585190912,1585192959,ES +1585192960,1585195007,IT +1585195008,1585197055,CZ +1585197056,1585199103,IT +1585199104,1585201151,NL +1585201152,1585202687,GB +1585202688,1585202943,IT +1585202944,1585203199,GB +1585203200,1585205247,IT +1585205248,1585207295,FR +1585207296,1585209343,NL +1585211392,1585213439,CZ +1585215488,1585217535,NL +1585217536,1585219583,FR +1585219584,1585221631,NL +1585221632,1585223679,SK +1585223680,1585224447,FR +1585224448,1585224703,GP +1585224704,1585225727,FR +1585225728,1585227007,UA +1585227008,1585227263,RU +1585227264,1585227775,UA +1585227776,1585231871,RU +1585231872,1585233919,CZ +1585233920,1585238015,RU +1585238016,1585240063,DE +1585240064,1585241087,FR +1585241088,1585242111,MQ +1585242112,1585244159,RU +1585244160,1585246207,FR +1585246208,1585248255,RU +1585248256,1585249279,CZ +1585249280,1585249791,DE +1585249792,1585250303,CZ +1585250304,1585254399,RU +1585254400,1585256447,GB +1585256448,1585258495,DE +1585258496,1585260543,GB +1585260544,1585264639,RU +1585264640,1585265663,MT +1585265664,1585265967,IM +1585265968,1585265983,FR +1585265984,1585266687,IM +1585266688,1585270783,DE +1585270784,1585272831,IT +1585272832,1585274879,RU +1585276928,1585278975,FR +1585278976,1585281023,AL +1585281024,1585283071,UA +1585283072,1585285119,GB +1585285120,1585287167,ES +1585287168,1585289215,CY +1585289216,1585291263,DE +1585291264,1585295359,FR +1585295360,1585297407,HU +1585297408,1585299455,RU +1585299456,1585301503,GB +1585301504,1585303551,LU +1585303552,1585305599,DE +1585305600,1585307647,CZ +1585307648,1585309695,QA +1585309696,1585311743,IT +1585311744,1585313791,RU +1585313792,1585315839,HU +1585315840,1585317887,DK +1585317888,1585319935,IT +1585319936,1585321983,CH +1585321984,1585324031,RU +1585324032,1585324543,IE +1585324544,1585324799,FR +1585324800,1585326079,NL +1585326080,1585328127,GB +1585328128,1585330175,BE +1585330176,1585332223,IT +1585332224,1585334271,NL +1585334272,1585336319,DE +1585336320,1585338367,SE +1585338368,1585340415,RU +1585340416,1585342463,AT +1585342464,1585344511,GB +1585344512,1585346559,FR +1585346560,1585348607,GB +1585348608,1585350655,CH +1585350656,1585352703,IT +1585352704,1585354751,PT +1585354752,1585356799,RU +1585356800,1585358847,FI +1585358848,1585360895,PT +1585360896,1585362943,DK +1585362944,1585364991,IT +1585364992,1585367039,GB +1585367040,1585369087,RU +1585369088,1585371135,GB +1585371136,1585375231,SE +1585375232,1585377279,GB +1585377280,1585379327,ES +1585379328,1585381375,CH +1585381376,1585383423,RS +1585383424,1585385471,FR +1585385472,1585387519,DE +1585387520,1585389567,SI +1585389568,1585391615,SE +1585391616,1585393663,IT +1585393664,1585395711,DK +1585395712,1585397759,NO +1585397760,1585399807,RU +1585400832,1585401087,DE +1585401344,1585401599,DE +1585401600,1585401855,GB +1585401856,1585403903,IT +1585403904,1585405951,RU +1585405952,1585407999,GB +1585408000,1585410047,PL +1585410048,1585412095,GB +1585412096,1585414143,NO +1585414144,1585416191,CZ +1585416192,1585422335,RU +1585422336,1585424383,ES +1585424384,1585428479,RU +1585428480,1585432575,ES +1585432576,1585434623,RU +1585434624,1585436671,JO +1585436672,1585438719,RU +1585438720,1585440767,DE +1585440768,1585442815,IT +1585442816,1585446911,RU +1585446912,1585577983,KW +1585577984,1585643519,DE +1585643520,1585709055,UA +1585709056,1585840127,PT +1585840128,1585971199,DE +1585971200,1585979391,AT +1585979392,1585987583,GB +1585987584,1585995775,SE +1585995776,1586003967,AT +1586003968,1586012159,SK +1586012160,1586020351,DE +1586020352,1586028543,RU +1586028544,1586036735,GB +1586036736,1586061311,RU +1586061312,1586069503,SE +1586069504,1586073599,DK +1586073600,1586077695,DE +1586077696,1586085887,GE +1586085888,1586110463,RU +1586110464,1586118655,IT +1586118656,1586126847,DK +1586126848,1586135039,CZ +1586135040,1586143231,RU +1586143232,1586151423,IT +1586151424,1586159615,TR +1586159616,1586167807,MT +1586167808,1586175999,DE +1586176000,1586177023,FR +1586177024,1586184191,BE +1586184192,1586192383,NO +1586192384,1586200575,RU +1586200576,1586208767,MD +1586208768,1586216959,IR +1586216960,1586225151,BG +1586225152,1586233343,RU +1586233344,1586241535,FR +1586241536,1586249727,SE +1586249728,1586257919,SI +1586257920,1586263039,SE +1586263040,1586265087,LV +1586265088,1586266111,SE +1586266112,1586274303,RU +1586274304,1586282495,BE +1586282496,1586298879,RU +1586298880,1586307071,IT +1586307072,1586315263,RU +1586315264,1586323455,UZ +1586323456,1586331647,RU +1586331648,1586339839,PL +1586339840,1586348031,RU +1586348032,1586356223,SY +1586356224,1586372607,RU +1586372608,1586380799,JO +1586380800,1586388991,GB +1586388992,1586389503,ES +1586389504,1586389759,US +1586389760,1586392831,ES +1586392832,1586392895,NL +1586392896,1586393607,ES +1586393608,1586393615,GB +1586393616,1586393631,FR +1586393632,1586393663,NL +1586393664,1586397183,ES +1586399232,1586401279,RU +1586401280,1586403327,IT +1586403328,1586405375,IS +1586405376,1586407423,AT +1586407424,1586409471,GB +1586411520,1586413567,GB +1586413568,1586415615,IT +1586415616,1586417663,ES +1586417664,1586419711,NL +1586419712,1586421759,DE +1586421760,1586423807,SE +1586423808,1586425855,CZ +1586425856,1586427903,NL +1586427904,1586431999,CH +1586432000,1586434047,DK +1586434048,1586436095,FR +1586436096,1586438143,ES +1586438144,1586446335,RU +1586446336,1586448383,NO +1586448384,1586450431,ES +1586450432,1586452479,FR +1586452480,1586454527,CH +1586454528,1586456575,IT +1586456576,1586458623,GB +1586458624,1586458911,FR +1586458912,1586458943,BE +1586458944,1586458975,CH +1586458976,1586459007,DE +1586459008,1586459039,ES +1586459040,1586459071,GB +1586459072,1586459103,IT +1586459104,1586459135,NL +1586459136,1586460527,FR +1586460528,1586460543,ES +1586460544,1586460671,FR +1586462720,1586464767,RU +1586464768,1586466815,ES +1586466816,1586468863,RU +1586468864,1586470911,IT +1586472960,1586475007,CZ +1586475008,1586477055,GR +1586477056,1586479103,BE +1586479104,1586481151,KG +1586481152,1586483199,ES +1586483200,1586485247,NL +1586485248,1586487295,FR +1586487296,1586489343,SA +1586489344,1586491391,CZ +1586491392,1586493439,RU +1586493440,1586495487,GB +1586495488,1587019775,DK +1587019776,1587085311,PL +1587085312,1587150847,UA +1587150848,1587154943,RU +1587154944,1587159039,PL +1587159040,1587163135,UA +1587165184,1587167231,PL +1587167232,1587175423,RU +1587175424,1587177471,PL +1587177472,1587179519,RS +1587200000,1587216383,UA +1587216384,1587289087,BG +1587289088,1587290111,DE +1587290112,1587322367,BG +1587322368,1587322623,RS +1587322624,1587334143,BG +1587334144,1587335167,DE +1587335168,1587340287,BG +1587340288,1587341311,DE +1587341312,1587347455,BG +1587347456,1587412991,NL +1587412992,1587417087,RU +1587421184,1587425279,UA +1587425280,1587425535,RU +1587425536,1587425791,UZ +1587425792,1587427327,RU +1587427328,1587429375,UZ +1587429376,1587437567,UA +1587437568,1587445759,RU +1587445760,1587449855,PL +1587449856,1587453951,UA +1587453952,1587470335,RU +1587470336,1587474431,PL +1587478528,1587511295,RU +1587511296,1587544063,IL +1587544064,1588068351,IT +1588068352,1588396031,NL +1588396032,1588592639,GB +1588592640,1588593663,RO +1588593664,1588593919,IE +1588593920,1588594687,RO +1588594688,1588602879,IR +1588602880,1588603135,RO +1588603136,1588603391,FR +1588603392,1588603903,RO +1588603904,1588604927,IT +1588604928,1588609023,IR +1588609024,1588613119,MD +1588613120,1588617215,IR +1588617216,1588617727,RO +1588617728,1588618239,BE +1588618240,1588619775,RO +1588619776,1588620287,SG +1588620288,1588621311,RO +1588621312,1588625407,MD +1588625408,1588627455,RO +1588627456,1588629503,ES +1588629504,1588636671,RO +1588636672,1588637695,US +1588637696,1588638719,ES +1588638720,1588640767,RO +1588640768,1588641279,LT +1588641280,1588641535,RO +1588641536,1588641791,GB +1588641792,1588642303,BG +1588642304,1588642559,DE +1588642560,1588642815,NL +1588642816,1588643839,BG +1588643840,1588649983,RO +1588649984,1588652031,SE +1588652032,1588652159,NL +1588652160,1588654079,LT +1588654080,1588658175,DE +1588658176,1588659199,RO +1588659200,1588659711,GB +1588659712,1588661247,RO +1588661248,1588661503,NL +1588661504,1588662783,RO +1588662784,1588663295,IT +1588663296,1588663807,RO +1588663808,1588664063,GB +1588664064,1588664319,RO +1588664320,1588664575,TH +1588664576,1588664831,EE +1588664832,1588665087,RO +1588665088,1588665343,GB +1588665344,1588673535,RO +1588673536,1588673791,NL +1588673792,1588674047,FR +1588674048,1588674303,IE +1588674304,1588674559,NL +1588674560,1588674815,RO +1588674816,1588675071,US +1588675072,1588675583,RO +1588675584,1588676607,IT +1588676608,1588678655,IR +1588678656,1588680703,RO +1588680704,1588682751,LU +1588682752,1588684799,RO +1588684800,1588685055,TH +1588685056,1588685311,NL +1588685312,1588686847,RO +1588686848,1588687103,NO +1588687104,1588687359,GB +1588687360,1588688383,RO +1588688384,1588688639,GB +1588688640,1588689407,RO +1588689408,1588689663,GB +1588689664,1588689919,RU +1588689920,1588690687,GB +1588690688,1588690943,IT +1588690944,1588692991,PL +1588692992,1588697087,RO +1588697088,1588699135,ES +1588699136,1588715519,IT +1588715520,1588717567,DE +1588717568,1588720639,FR +1588720640,1588721663,DE +1588721664,1588723711,GB +1588723712,1588854783,UA +1588854784,1588985855,RU +1588985856,1589182463,IR +1589182464,1589198847,OM +1589198848,1589200895,FR +1589200896,1589202943,IT +1589202944,1589204991,SE +1589204992,1589207039,DE +1589207040,1589215231,IT +1589215232,1589224447,GB +1589224448,1589224703,BE +1589224704,1589247999,GB +1589248000,1589256191,EE +1589256192,1589258239,SE +1589258240,1589260287,LV +1589260288,1589261311,SE +1589261312,1589262335,LV +1589262336,1589264383,SE +1589264384,1589278719,LV +1589278720,1589280767,SE +1589280768,1589313535,DE +1589313536,1589346303,LB +1589346304,1589379071,KW +1589379072,1589411839,RU +1589411840,1589444607,IL +1589444608,1589477375,DK +1589477376,1589510143,RS +1589510144,1589542911,RU +1589542912,1589547007,BG +1589547008,1589551103,EE +1589551104,1589560319,BG +1589560320,1589561343,GI +1589561344,1589563391,NL +1589563392,1589571583,HK +1589571584,1589573631,GB +1589573632,1589574143,US +1589574144,1589574399,CA +1589574400,1589574655,US +1589574656,1589575679,BG +1589575680,1589608447,CN +1589608448,1589616639,SE +1589616640,1589624831,DK +1589624832,1589626879,SE +1589626880,1589641215,DK +1589641216,1590034431,GB +1590034432,1590036479,RU +1590036480,1590038527,GB +1590038528,1590040575,RU +1590040576,1590042623,NL +1590042624,1590044671,RU +1590046720,1590048767,RU +1590048768,1590050815,DE +1590050816,1590052863,SE +1590052864,1590054911,IT +1590054912,1590056959,GB +1590056960,1590059007,ES +1590059008,1590061055,IT +1590061056,1590063103,RU +1590063104,1590065151,CZ +1590065152,1590067199,IE +1590067200,1590069247,RU +1590069248,1590071295,AT +1590071296,1590073343,FR +1590073344,1590075391,NL +1590075392,1590077439,BE +1590077440,1590079487,GB +1590079488,1590079743,MQ +1590079744,1590080511,GP +1590080512,1590081535,MQ +1590081536,1590083583,GB +1590083584,1590085631,RU +1590085632,1590087679,FR +1590087680,1590089727,IT +1590089728,1590091775,RU +1590091776,1590093823,CZ +1590093824,1590095871,RU +1590095872,1590097919,CZ +1590097920,1590099967,CH +1590099968,1590102015,RU +1590102016,1590104063,IT +1590104064,1590106111,TJ +1590106112,1590108159,GB +1590108160,1590110207,TR +1590110208,1590112255,CZ +1590112256,1590114303,HU +1590114304,1590116351,FI +1590116352,1590120447,RU +1590120448,1590122495,IT +1590122496,1590124543,DE +1590126592,1590128639,RU +1590128640,1590130687,FI +1590130688,1590132735,FR +1590132736,1590134783,GB +1590136832,1590138879,GB +1590138880,1590140927,FR +1590140928,1590142975,UA +1590142976,1590145023,AT +1590145024,1590147071,HU +1590147072,1590149119,GB +1590149120,1590151167,CZ +1590151168,1590153215,TR +1590153216,1590155263,DE +1590155264,1590157311,RU +1590157312,1590161407,GB +1590161408,1590163455,DE +1590163456,1590165503,NL +1590165504,1590689791,AE +1590689792,1591214079,NL +1591214080,1591738367,DE +1591738368,1592000511,BE +1592000512,1592004607,ES +1592004608,1592008703,AM +1592008704,1592012799,GB +1592012800,1592016895,CH +1592016896,1592020991,GB +1592020992,1592025087,SK +1592025088,1592029183,DE +1592029184,1592033279,RU +1592033280,1592037375,NL +1592037376,1592041471,CH +1592041472,1592045567,RU +1592045568,1592045595,FR +1592045596,1592045599,GB +1592045600,1592046107,FR +1592046108,1592046111,GB +1592046112,1592049663,FR +1592049664,1592053759,RU +1592053760,1592057855,NL +1592057856,1592061951,RS +1592061952,1592066047,RU +1592066048,1592066559,CY +1592066560,1592067583,US +1592067584,1592070143,CY +1592070144,1592074239,RU +1592074240,1592078335,SK +1592078336,1592082431,NL +1592082432,1592086527,GB +1592086528,1592087551,CZ +1592087552,1592088063,PL +1592088064,1592088191,CZ +1592088192,1592088319,PL +1592088320,1592090623,CZ +1592090624,1592094719,RU +1592094720,1592098815,RS +1592098816,1592102911,GB +1592102912,1592107007,DE +1592107008,1592111103,GB +1592111104,1592115199,DE +1592115200,1592119295,ES +1592119296,1592123391,PL +1592123392,1592135679,RU +1592135680,1592139775,PL +1592139776,1592143871,RU +1592143872,1592147967,DE +1592147968,1592152063,IT +1592152064,1592156159,IL +1592156160,1592160255,IE +1592160256,1592168447,RU +1592168448,1592172543,CZ +1592172544,1592176639,RU +1592176640,1592180735,RS +1592180736,1592184831,UA +1592184832,1592188927,CH +1592188928,1592193023,UZ +1592193024,1592197119,RU +1592197120,1592201215,PL +1592201216,1592205311,RU +1592205312,1592209407,UA +1592209408,1592213503,PL +1592213504,1592217599,UA +1592217600,1592221695,CH +1592221696,1592225791,DK +1592225792,1592242175,RU +1592242176,1592246271,UA +1592246272,1592250367,RU +1592254464,1592258559,PL +1592258560,1592262655,NL +1592262656,1592268799,RU +1592268800,1592269823,UZ +1592269824,1592270335,VG +1592270336,1592270591,MD +1592270592,1592270847,RU +1592270848,1592272895,PL +1592272896,1592281087,RU +1592281088,1592283135,UA +1592283136,1592285183,GR +1592285184,1592287231,RU +1592287232,1592289279,RO +1592289280,1592291327,RU +1592291328,1592293375,SM +1592293376,1592295423,LT +1592295424,1592299519,RU +1592299520,1592303615,PL +1592303616,1592305663,NL +1592305664,1592307711,IR +1592307712,1592309759,UA +1592309760,1592311807,RU +1592311808,1592313855,DE +1592313856,1592315903,RU +1592315904,1592317951,UA +1592317952,1592319999,PL +1592320000,1592322047,LT +1592322048,1592324095,RU +1592328192,1592393727,RU +1592393728,1592459263,SE +1592459264,1592524799,TR +1592524800,1592557567,GB +1592557568,1592576511,BG +1592576512,1592577023,FR +1592577024,1592590335,BG +1592590336,1592594431,FI +1592594432,1592598527,DE +1592598528,1592600575,FI +1592600576,1592601599,NL +1592601600,1592606719,FI +1592606720,1592608767,SG +1592608768,1592610815,FI +1592610816,1592612863,DE +1592612864,1592623103,FI +1592623104,1592655871,RU +1592655872,1592786943,FR +1592786944,1592803327,PL +1592803328,1592819711,RU +1592819712,1592836095,UA +1592836096,1592840191,GE +1592840192,1592842239,RU +1592842240,1592852479,GE +1592852480,1592868863,RU +1592868864,1592885247,CZ +1592885248,1592901631,IR +1592901632,1592934399,RU +1592934400,1592950783,CZ +1592950784,1592967167,RU +1592967168,1592980223,LU +1592980224,1592980479,DE +1592980480,1592983551,LU +1592983552,1592999935,RU +1592999936,1593016319,MD +1593016320,1593049087,RU +1593049088,1593065471,UA +1593065472,1593081855,LT +1593081856,1593098239,UA +1593098240,1593114623,CH +1593114624,1593131007,SE +1593131008,1593131023,CH +1593131024,1593131039,SE +1593131040,1593131263,GB +1593131264,1593132031,CH +1593132032,1593132287,GB +1593132288,1593132543,AT +1593132544,1593132799,FR +1593132800,1593133055,GB +1593133056,1593133311,FR +1593133312,1593133567,GB +1593133568,1593133823,FR +1593133824,1593134591,AT +1593134592,1593135103,SE +1593135104,1593135359,GB +1593135360,1593135615,IE +1593135616,1593136639,GB +1593136640,1593139199,IE +1593139200,1593140223,NL +1593140224,1593147391,IE +1593147392,1593163775,RU +1593163776,1593180159,AT +1593180160,1593196543,NO +1593196544,1593203103,SE +1593203104,1593203135,FI +1593203136,1593206783,SE +1593206784,1593207039,FI +1593207040,1593212927,SE +1593212928,1593229311,PL +1593229312,1593245695,EE +1593245696,1593247743,NL +1593247744,1593249791,IT +1593249792,1593251839,RU +1593251840,1593253631,FR +1593253632,1593253887,ES +1593253888,1593255935,CZ +1593255936,1593257983,DE +1593257984,1593260031,IE +1593260032,1593262079,RU +1593262080,1593264127,KZ +1593264128,1593266175,NL +1593266176,1593267199,GB +1593267200,1593267711,BZ +1593267712,1593268223,GB +1593268224,1593270271,HU +1593270272,1593272319,GB +1593272320,1593274367,RU +1593274368,1593276415,DE +1593276416,1593278463,RU +1593278464,1593280511,KZ +1593282560,1593284607,AT +1593284608,1593286655,GB +1593286656,1593288703,FR +1593288704,1593290751,SE +1593290752,1593292799,FR +1593292800,1593294847,IT +1593294848,1593296895,NL +1593296896,1593298943,RS +1593298944,1593300991,RU +1593300992,1593303039,CH +1593303040,1593305087,UA +1593305088,1593307135,FR +1593307136,1593311231,RU +1593311232,1593327615,UA +1593327616,1593343999,ES +1593344000,1593376767,HU +1593376768,1593409535,JO +1593409536,1593412095,DE +1593412096,1593412351,GB +1593412352,1593420927,DE +1593420928,1593421055,US +1593421056,1593421311,GB +1593421312,1593421567,FR +1593421568,1593421823,GB +1593421824,1593422591,DE +1593422592,1593422847,GB +1593422848,1593423359,DE +1593423360,1593423423,US +1593423424,1593423439,DE +1593423440,1593423615,US +1593423616,1593431167,DE +1593431168,1593431295,GB +1593431296,1593438719,DE +1593438720,1593438847,US +1593438848,1593438863,DE +1593438864,1593438975,US +1593438976,1593442303,DE +1593442304,1593475071,BA +1593475072,1593491455,HR +1593491456,1593499647,DE +1593499648,1593503743,GB +1593503744,1593505791,CZ +1593505792,1593540607,RU +1593540608,1593573375,PL +1593573376,1593606143,LU +1593606144,1593638911,SY +1593638912,1593671679,RU +1593671680,1593704447,HR +1593704448,1593737215,SE +1593737216,1593769983,PL +1593769984,1593802751,RU +1593802752,1593835519,SE +1593835520,1594884095,TR +1594884096,1595408383,ES +1595408384,1595998207,RU +1595998208,1596063743,DE +1596063744,1596129279,NO +1596129280,1596194815,IL +1596194816,1596260351,NL +1596260352,1596325887,RU +1596325888,1596391423,IR +1596391424,1596456959,ES +1596456960,1596588031,PL +1596588032,1596719103,BG +1596719104,1596850175,IE +1596850176,1596850431,CZ +1596850432,1596850687,RU +1596850688,1596851199,UA +1596851200,1596851455,RU +1596851456,1596851711,CZ +1596851712,1596851967,UA +1596851968,1596852223,LV +1596852224,1596852479,UA +1596852480,1596852735,RU +1596852736,1596852991,UA +1596852992,1596853247,KZ +1596853248,1596854271,RU +1596854272,1596858367,BY +1596858368,1596858879,CZ +1596858880,1596859391,RU +1596859392,1596859903,CZ +1596859904,1596861439,RU +1596861440,1596861951,UA +1596861952,1596862207,CZ +1596862208,1596866559,RU +1596866560,1596868607,UZ +1596868608,1596869631,RU +1596869632,1596869887,UA +1596869888,1596873215,RU +1596873216,1596873471,UZ +1596873472,1596873727,RU +1596873728,1596873983,UZ +1596873984,1596874751,RU +1596874752,1596875007,UA +1596875008,1596875263,RU +1596875264,1596875775,UA +1596875776,1596876799,UZ +1596876800,1596877311,RU +1596877312,1596877596,CZ +1596877597,1596877597,UA +1596877598,1596877823,CZ +1596877824,1596878079,UA +1596878080,1596879615,RU +1596879616,1596879871,CZ +1596879872,1596880895,RU +1596880896,1596882175,UA +1596882176,1596882431,RU +1596882432,1596882687,UA +1596882688,1596882943,CZ +1596882944,1596886015,RU +1596886016,1596886527,UA +1596886528,1596887295,RU +1596887296,1596887551,KZ +1596887552,1596889599,RU +1596889600,1596889855,KG +1596889856,1596890111,UA +1596890112,1596890367,RU +1596890368,1596890619,UA +1596890620,1596890620,RU +1596890621,1596890623,UA +1596890624,1596890879,CZ +1596890880,1596891135,RU +1596891136,1596892159,UA +1596892160,1596893183,RU +1596893184,1596895231,UA +1596895232,1596900863,RU +1596900864,1596901375,NL +1596901376,1596907519,BY +1596907520,1596909567,RU +1596909568,1596911615,KZ +1596911616,1596912639,BY +1596912640,1596923903,RU +1596923904,1596924927,ES +1596924928,1596925951,RU +1596925952,1596927999,CZ +1596928000,1596930047,RU +1596930048,1596930303,UA +1596930304,1596930559,TM +1596930560,1596931071,CZ +1596931072,1596931583,BY +1596931584,1596931839,CZ +1596931840,1596940287,RU +1596940288,1596940543,CZ +1596940544,1596940799,RU +1596940800,1596941055,UA +1596941056,1596941311,BY +1596941312,1596942079,RU +1596942080,1596942335,PT +1596942336,1596945663,UA +1596945664,1596945919,CZ +1596945920,1596947455,RU +1596947456,1596948479,UA +1596948480,1596950527,BY +1596950528,1596951551,UA +1596951552,1596951807,RU +1596951808,1596952063,NL +1596952064,1596952831,UA +1596952832,1596953087,RU +1596953088,1596953599,CZ +1596953600,1596954623,UA +1596954624,1596955647,RU +1596955648,1596956159,CZ +1596956160,1596956671,RU +1596956672,1596956927,CZ +1596956928,1596957183,RU +1596957184,1596957951,UA +1596957952,1596958207,CZ +1596958208,1596958463,RU +1596958464,1596958719,UA +1596958720,1596961279,RU +1596961280,1596961791,SK +1596961792,1596962815,RU +1596962816,1596963327,AM +1596963328,1596963839,CZ +1596963840,1596964095,KZ +1596964096,1596964607,CZ +1596964608,1596967167,RU +1596967168,1596967423,CZ +1596967424,1596967935,RU +1596967936,1596968959,UA +1596968960,1596973055,BA +1596973056,1596975103,BY +1596975104,1596975359,CZ +1596975360,1596979199,RU +1596979200,1596979711,CZ +1596979712,1596980223,UA +1596980224,1596980479,RU +1596980480,1596980735,UA +1596980736,1596980991,CZ +1596980992,1596981247,UA +1596981248,1597243391,PL +1597243392,1597505535,RU +1597505536,1597767679,KZ +1597767680,1598029823,ES +1598029824,1598062591,RO +1598062592,1598095359,RU +1598095360,1598128127,MD +1598128128,1598160895,TR +1598160896,1598193663,KW +1598193664,1598226431,RU +1598226432,1598259199,UA +1598259200,1598291967,RU +1598291968,1598324735,LV +1598324736,1598357503,RU +1598357504,1598390271,PT +1598390272,1598423039,UA +1598423040,1598455807,RU +1598455808,1598488575,TR +1598488576,1598685183,RU +1598685184,1598816255,IT +1598816256,1598947327,RO +1598947328,1599078399,RU +1599078400,1599094783,SE +1599094784,1599111167,RU +1599111168,1599127551,IR +1599127552,1599143935,CZ +1599143936,1599160319,UA +1599160320,1599176703,IR +1599176704,1599188991,FR +1599188992,1599189503,DE +1599189504,1599190797,FR +1599190798,1599190798,DE +1599190799,1599190807,FR +1599190808,1599190815,DE +1599190816,1599193087,FR +1599193088,1599209471,RU +1599209472,1599237375,IR +1599237376,1599237631,GB +1599237632,1599242239,IR +1599242240,1599258623,CZ +1599258624,1599324159,RU +1599324160,1599340543,IE +1599340544,1599356927,RU +1599356928,1599373311,BH +1599373312,1599406079,RU +1599406080,1599422463,NL +1599422464,1599426559,RU +1599426560,1599426815,GB +1599426816,1599427071,US +1599427072,1599427327,RU +1599427328,1599427583,UA +1599427584,1599430655,RU +1599430656,1599438847,TM +1599438848,1599455231,RS +1599455232,1599471615,CZ +1599471616,1599487999,MK +1599488000,1599504383,IL +1599504384,1599520767,AZ +1599520768,1599537151,RU +1599537152,1599550719,BG +1599550720,1599550975,RS +1599550976,1599553535,BG +1599553536,1599561727,KG +1599561728,1599565823,GB +1599565824,1599567871,SY +1599567872,1599569919,IT +1599569920,1599586303,SI +1599586304,1599602687,BG +1599602688,1599864831,DE +1599864832,1600126975,PT +1600126976,1600389119,NL +1600397312,1600401407,DE +1600442368,1600446463,DE +1600453120,1600453631,IT +1600456704,1600457727,DE +1600520192,1600651263,SK +1600651264,1600684031,GE +1600684032,1600749567,RU +1600749568,1600782335,SK +1600782336,1600880639,RU +1600880640,1600913407,AL +1600913408,1600946175,PL +1600946176,1600978943,RU +1600978944,1601011711,SE +1601011712,1601044479,UA +1601044480,1601077247,RU +1601077248,1601110015,IT +1601110016,1601142783,BG +1601142784,1601175551,UA +1601175552,1601699839,DE +1601699840,1602224127,ES +1602224128,1602226175,NL +1602226176,1602228223,GB +1602228224,1602230270,FR +1602230271,1602230271,DE +1602230272,1602232319,DK +1602232320,1602234367,CH +1602234368,1602235903,FR +1602235904,1602236159,ES +1602236160,1602236415,FR +1602236416,1602238463,GB +1602238464,1602240511,TR +1602240512,1602242559,BY +1602242560,1602244607,FR +1602244608,1602246655,CH +1602246656,1602248703,NL +1602248704,1602250751,BE +1602250752,1602252799,NO +1602252800,1602254847,SE +1602254848,1602256895,LU +1602256896,1602258943,GB +1602258944,1602260991,RU +1602260992,1602263039,FR +1602263040,1602265087,ES +1602265088,1602267135,RU +1602267136,1602269183,RO +1602269184,1602271231,RU +1602271232,1602273279,MK +1602273280,1602273535,FR +1602273536,1602273791,GB +1602273792,1602274559,IN +1602274560,1602274815,IE +1602274816,1602275071,GB +1602275072,1602279423,DE +1602279424,1602281471,GB +1602281472,1602283519,RU +1602283520,1602285567,HR +1602285568,1602287615,RU +1602287616,1602289663,DE +1602289664,1602291711,LB +1602291712,1602293759,SA +1602293760,1602295807,GB +1602295808,1602297855,NL +1602297856,1602299903,IL +1602299904,1602301951,GR +1602301952,1602303999,DE +1602304000,1602306047,RU +1602306048,1602308095,GB +1602308096,1602310143,RU +1602310144,1602312191,NL +1602312192,1602314239,RU +1602314240,1602316287,CZ +1602316288,1602318335,GB +1602318336,1602320383,ES +1602320384,1602324479,NL +1602324480,1602328575,RU +1602328576,1602330623,ES +1602330624,1602336767,RU +1602336768,1602338815,GB +1602338816,1602340863,EE +1602340864,1602342911,AT +1602342912,1602344959,DE +1602344960,1602347007,ES +1602347008,1602349055,PL +1602349056,1602351103,RU +1602351104,1602353151,CZ +1602353152,1602355199,ES +1602357248,1602359295,FR +1602359296,1602361343,DE +1602361344,1602363391,FI +1602363392,1602365439,LV +1602365440,1602367487,BE +1602367488,1602369535,ES +1602369536,1602371583,IR +1602371584,1602373631,SE +1602373632,1602375679,GB +1602375680,1602377727,BY +1602377728,1602379775,PS +1602379776,1602383871,GB +1602383872,1602385919,DE +1602385920,1602387967,AT +1602387968,1602390015,RU +1602390016,1602392063,IT +1602392064,1602394111,GB +1602394112,1602396159,FR +1602396160,1602398207,DE +1602398208,1602400255,TR +1602400256,1602402303,RU +1602402304,1602404351,LU +1602404352,1602406399,GB +1602406400,1602408447,DE +1602408448,1602410495,DK +1602410496,1602412543,NO +1602414592,1602416639,NL +1602416640,1602418687,IR +1602418688,1602420735,DE +1602420736,1602424831,RU +1602424832,1602426879,FR +1602426880,1602428927,RU +1602428928,1602430975,PL +1602430976,1602433023,IT +1602433024,1602435071,HU +1602435072,1602437119,IT +1602437120,1602439167,GB +1602439168,1602441215,RU +1602441216,1602443263,GB +1602443264,1602445311,RU +1602445312,1602447359,DE +1602447360,1602449407,GB +1602449408,1602451455,LV +1602451456,1602453503,DE +1602453504,1602455551,SK +1602455552,1602457599,FR +1602457600,1602459647,RU +1602459648,1602461695,GB +1602461696,1602465791,ES +1602465792,1602467839,RU +1602467840,1602468095,GB +1602468096,1602469887,GI +1602469888,1602471935,AT +1602471936,1602473983,SE +1602473984,1602476031,RU +1602476032,1602478079,GB +1602478080,1602480127,RU +1602480128,1602482175,MT +1602482176,1602484223,FR +1602484224,1602486271,GB +1602486272,1602748415,UA +1602748416,1602781183,PT +1602781184,1602813951,FR +1602813952,1602846719,RU +1602846720,1602879487,GE +1602879488,1602896924,MQ +1602896925,1602896925,RE +1602896926,1602912255,MQ +1602912256,1602928639,GB +1602928640,1602930687,HU +1602930688,1602932735,GB +1602932736,1602936831,DK +1602936832,1603010559,RU +1603010560,1603014655,FR +1603014656,1603018751,RU +1603018752,1603022847,HU +1603022848,1603026943,GB +1603026944,1603031039,SE +1603031040,1603035135,RU +1603035136,1603039231,SY +1603039232,1603043327,RS +1603043328,1603047423,IT +1603047424,1603051519,RU +1603051520,1603055615,JO +1603055616,1603059711,SE +1603059712,1603063807,AM +1603063808,1603067903,BG +1603067904,1603071999,GB +1603072000,1603076095,CZ +1603076096,1603080191,RU +1603080192,1603080703,DE +1603080704,1603080831,US +1603080832,1603080959,SE +1603080960,1603081215,DE +1603081216,1603081247,GB +1603081248,1603081255,NO +1603081256,1603081263,FI +1603081264,1603081279,GB +1603081280,1603081295,US +1603081296,1603081407,DE +1603081408,1603081471,ES +1603081472,1603082495,DE +1603082496,1603082751,GT +1603082752,1603083007,ES +1603083008,1603083263,UA +1603083264,1603083535,DE +1603083536,1603083551,LU +1603083552,1603083554,NL +1603083555,1603083555,LU +1603083556,1603083560,NL +1603083561,1603083561,LU +1603083562,1603083567,NL +1603083568,1603083583,LU +1603083584,1603083615,DE +1603083616,1603083647,LU +1603083648,1603084031,DE +1603084032,1603088383,IT +1603088384,1603092479,LB +1603092480,1603100671,NO +1603100672,1603108863,FR +1603108864,1603112959,KZ +1603112960,1603121151,GB +1603121152,1603129343,RU +1603129344,1603133439,JO +1603133440,1603137535,RU +1603137536,1603141631,KW +1603141632,1603145727,ES +1603145728,1603146239,IL +1603146240,1603146751,US +1603146752,1603149311,IL +1603149312,1603149567,NL +1603149568,1603149823,IL +1603149824,1603153919,RU +1603153920,1603158015,NL +1603158016,1603162111,DE +1603162112,1603166207,TJ +1603166208,1603168159,NL +1603168160,1603168167,US +1603168168,1603168615,NL +1603168616,1603168623,US +1603168624,1603170303,NL +1603170304,1603174399,IE +1603174400,1603178495,TR +1603178496,1603182591,GB +1603182592,1603186687,FR +1603186688,1603190783,IT +1603190784,1603194879,RU +1603194880,1603198975,IT +1603198976,1603203071,IR +1603203072,1603207167,PL +1603207168,1603215359,RU +1603215360,1603219455,DE +1603219456,1603223551,CH +1603223552,1603226255,FR +1603226256,1603226263,DE +1603226264,1603226271,NL +1603226272,1603227647,FR +1603227648,1603231743,AT +1603231744,1603235839,IT +1603235840,1603239935,RU +1603239936,1603244031,CZ +1603244032,1603248127,SI +1603248128,1603252223,DE +1603252224,1603256319,RU +1603256320,1603260415,SE +1603260416,1603264511,RU +1603264512,1603268607,AT +1603268608,1603272703,PL +1603272704,1603796991,GB +1603796992,1603813375,RU +1603813376,1603829759,CH +1603829760,1603846143,NL +1603846144,1603862527,GB +1603862528,1603878911,EE +1603878912,1603895295,MD +1603895296,1603928063,RU +1603928064,1603944447,DK +1603944448,1603977215,RU +1603977216,1603993599,GB +1603993600,1604009983,ME +1604009984,1604026367,PL +1604026368,1604042751,NL +1604042752,1604059135,SE +1604059136,1604075519,MK +1604075520,1604091903,RU +1604091904,1604108287,BA +1604108288,1604111103,DE +1604111104,1604112383,ES +1604112384,1604114431,DE +1604114432,1604115455,IR +1604115456,1604115967,DE +1604115968,1604116479,IR +1604116480,1604118783,DE +1604118784,1604120063,IR +1604120064,1604120575,DE +1604120576,1604122623,PL +1604122624,1604123135,IR +1604123136,1604123647,DE +1604123648,1604124671,IR +1604124672,1604141055,DE +1604141056,1604157439,IT +1604157440,1604190207,FR +1604190208,1604206591,UA +1604206592,1604222975,PL +1604222976,1604239359,BG +1604239360,1604255743,RU +1604255744,1604272127,SY +1604272128,1604288511,IQ +1604288512,1604304895,RU +1604304896,1604321279,SI +1604321280,1604386815,PL +1604386816,1604433919,RU +1604433920,1604434943,KZ +1604434944,1604444159,RU +1604444160,1604444245,KZ +1604444246,1604444246,US +1604444247,1604445183,KZ +1604445184,1604452351,RU +1604452352,1604517887,IR +1604517888,1604583423,RU +1604583424,1604601727,UA +1604601728,1604601855,PL +1604601856,1604648959,UA +1604648960,1604714495,RU +1604714496,1604780031,DK +1604780032,1604845567,RU +1604845568,1604853759,FR +1604853760,1604870143,HU +1604870144,1604878335,HR +1604878336,1604886527,DE +1604886528,1604886783,NL +1604886784,1604887039,DE +1604887040,1604887295,NL +1604887296,1604888063,DE +1604888064,1604888831,NL +1604888832,1604889599,TR +1604889600,1604890111,DE +1604890112,1604890367,NL +1604890368,1604890879,TR +1604890880,1604891967,DE +1604891968,1604892159,NL +1604892160,1604892927,DE +1604892928,1604893183,HK +1604893184,1604893375,NL +1604893376,1604893951,DE +1604893952,1604894463,TR +1604894464,1604894719,DE +1604894720,1604902911,CZ +1604902912,1604911103,BG +1604911104,1604919295,UA +1604919296,1604927487,NO +1604927488,1604935679,IT +1604935680,1604952063,RU +1604952064,1604960255,DE +1604960256,1604968447,BG +1604968448,1604976639,ES +1604976640,1604993023,FR +1604993024,1605001215,NL +1605001216,1605025791,RU +1605025792,1605033983,IQ +1605033984,1605042175,SK +1605042176,1605050367,RU +1605050368,1605058559,IT +1605058560,1605066751,HU +1605066752,1605074943,PL +1605074944,1605083135,FR +1605083136,1605091327,BE +1605091328,1605099519,PL +1605099520,1605107711,RU +1605107712,1605109495,GB +1605109496,1605109503,IT +1605109504,1605110303,GB +1605110304,1605110311,IT +1605110312,1605110375,GB +1605110376,1605110383,IT +1605110384,1605111023,GB +1605111024,1605111031,IT +1605111032,1605111903,GB +1605111904,1605111911,IT +1605111912,1605113383,GB +1605113384,1605113391,IT +1605113392,1605113407,GB +1605113408,1605113415,IT +1605113416,1605113567,GB +1605113568,1605113583,IT +1605113584,1605114215,GB +1605114216,1605114223,IT +1605114224,1605114287,GB +1605114288,1605114295,IT +1605114296,1605114327,GB +1605114328,1605114335,IT +1605114336,1605115007,GB +1605115008,1605115015,IT +1605115016,1605115191,GB +1605115192,1605115199,IT +1605115200,1605115903,GB +1605115904,1605124095,RU +1605124096,1605125263,GB +1605125264,1605125275,DE +1605125276,1605125276,GB +1605125277,1605125279,DE +1605125280,1605125887,GB +1605125888,1605125919,DE +1605125920,1605126701,GB +1605126702,1605126702,US +1605126703,1605126911,GB +1605126912,1605127167,DE +1605127168,1605130239,GB +1605130240,1605130271,NL +1605130272,1605131263,GB +1605131264,1605131519,DE +1605131520,1605132287,GB +1605132288,1605148671,RU +1605148672,1605156863,PT +1605156864,1605165055,JO +1605165056,1605173247,GB +1605173248,1605181439,TR +1605181440,1605189631,LT +1605189632,1605197823,CZ +1605197824,1605206015,DE +1605206016,1605214207,RU +1605214208,1605222399,TR +1605222400,1605230591,CZ +1605230592,1605238783,TR +1605238784,1605246975,IT +1605246976,1605255167,PL +1605257216,1605259263,FR +1605259264,1605261311,DE +1605261312,1605271551,RU +1605271552,1605279743,DE +1605279744,1605287935,FR +1605287936,1605296127,RU +1605296128,1605304319,CH +1605304320,1605312511,PL +1605312512,1605320703,IL +1605320704,1605328895,KW +1605328896,1605337087,FI +1605337088,1605345279,GB +1605345280,1605353471,FR +1605353472,1605361663,GB +1605361664,1605369855,RU +1605369856,1605402623,FR +1605402624,1605435391,SI +1605435392,1605468159,GB +1605468160,1605500927,SA +1605500928,1605533695,PL +1605533696,1605566463,HR +1605566464,1605599231,RU +1605599232,1605631999,GR +1605632000,1605664767,RS +1605664768,1605697535,MK +1605697536,1605742591,RU +1605742592,1605742847,LV +1605742848,1605743103,PL +1605743104,1605744127,RU +1605744128,1605744383,UA +1605744384,1605753343,RU +1605753344,1605753471,US +1605753472,1605753855,RU +1605753856,1605754879,FR +1605754880,1605763071,RU +1605763072,1605769215,KZ +1605769216,1605771263,PL +1605771264,1605782527,RU +1605782528,1605782783,CZ +1605782784,1605795839,RU +1605795840,1605828607,BE +1605828608,1605828863,GB +1605828864,1605829631,US +1605829632,1605829887,GB +1605829888,1605830143,US +1605830144,1605830399,IL +1605830400,1605830655,US +1605830656,1605840895,RU +1605840896,1605844991,CH +1605844992,1605861375,RU +1605861376,1605894143,TR +1605894144,1606156287,SA +1606156288,1606418431,RU +1606418432,1607100682,SE +1607100683,1607100683,DE +1607100684,1607467007,SE +1607467008,1607532543,DE +1607532544,1607569407,SE +1607569408,1607573503,DK +1607573504,1607575551,SE +1607575552,1607577599,GB +1607577600,1607581695,SE +1607581696,1607598079,DK +1607598080,1607599103,GB +1607600384,1607600639,DE +1607600640,1607600895,AT +1607600896,1607601151,CH +1607601152,1607601919,IT +1607601920,1607602175,GB +1607602432,1607602687,SE +1607602688,1607602943,NO +1607602944,1607603199,DK +1607603200,1607603455,FI +1607604224,1607605247,NG +1607605248,1607606015,ZA +1607606016,1607606271,FR +1607606272,1607606783,DE +1607606784,1607607039,GB +1607607296,1607607551,PL +1607607552,1607608319,IT +1607608320,1607608575,HU +1607608576,1607608831,SK +1607610368,1607611391,GR +1607611392,1607612415,IE +1607614464,1607617535,GB +1607618560,1607621631,ES +1607621632,1607622655,IT +1607622656,1607624703,ES +1607624704,1607625727,IT +1607625728,1607625986,ES +1607625987,1607625987,PT +1607625988,1607626751,ES +1607626752,1607627519,FR +1607627520,1607627775,FI +1607627776,1607628543,IT +1607630848,1607631871,TZ +1607631872,1607632895,UG +1607634432,1607636479,IT +1607639040,1607640805,IT +1607640806,1607640806,CH +1607640807,1607642388,IT +1607642389,1607642389,NL +1607642390,1607647231,IT +1607647232,1607651327,DE +1607651328,1607655423,FR +1607655424,1607657471,GB +1607657472,1607663615,IT +1607663616,1607729151,NL +1607729152,1607745535,SY +1607745536,1607761919,EG +1607761920,1607770111,SY +1607770112,1607774207,EG +1607774208,1607786495,SY +1607786496,1607794687,EG +1607794688,1607860223,RU +1607925760,1607926783,RU +1607926784,1607927807,UA +1607927808,1607929855,RU +1607929856,1607930879,SE +1607930880,1607933951,PL +1607933952,1607934975,DE +1607934976,1607937023,UA +1607937024,1607938047,SE +1607938048,1607939071,UA +1607939072,1607940095,PL +1607940096,1607941119,RU +1607941120,1607942143,ES +1607942144,1607944191,RU +1607944192,1607945215,FR +1607945216,1607946239,PL +1607947264,1607948287,RU +1607948288,1607949311,GB +1607949312,1607950335,UA +1607950336,1607952383,RU +1607952384,1607953407,UA +1607953408,1607956479,RU +1607956480,1607957503,ES +1607957504,1607958527,UA +1607958528,1607959551,PS +1607959552,1607960575,EE +1607960576,1607961599,RU +1607962624,1607963647,UA +1607963648,1607965695,RU +1607965696,1607966719,UA +1607966720,1607967743,IR +1607967744,1607968767,UA +1607968768,1607969791,SE +1607969792,1607970047,RU +1607970048,1607970303,IR +1607970304,1607970815,GB +1607970816,1607972863,RU +1607972864,1607974911,NL +1607974912,1607976959,PL +1607976960,1607980031,RU +1607980032,1607981055,DE +1607981056,1607982079,UA +1607982080,1607982847,RO +1607982848,1607983103,UA +1607983104,1607984127,GB +1607984128,1607985151,RU +1607985152,1607986175,PL +1607986176,1607986431,FR +1607986432,1607986687,GB +1607986688,1607988223,RU +1607988224,1607989247,KG +1607989248,1607991295,RU +1607991296,1608122367,FI +1608122368,1608253439,SA +1608253440,1608384511,RU +1608384512,1608515583,DE +1608515584,1610612735,IT +1610612736,1610678271,US +1610678272,1610743807,CA +1610743808,1611006975,US +1611006976,1611007999,NL +1611008000,1611009023,US +1611009024,1611010047,NL +1611010048,1611036671,US +1611036672,1611037183,NL +1611037184,1611042815,US +1611042816,1611046911,NL +1611046912,1611084543,US +1611084544,1611085311,NL +1611085312,1611086335,US +1611086336,1611086847,NL +1611086848,1611087871,US +1611087872,1611091967,NL +1611091968,1611112447,US +1611112448,1611117567,NL +1611117568,1611218943,US +1611218944,1611227135,KH +1611227136,1611235327,CA +1611235328,1611243519,OM +1611243520,1611247615,MY +1611247616,1611247871,HK +1611247872,1611248127,AU +1611248128,1611251711,HK +1611251712,1611692543,US +1611692544,1611693567,NL +1611693568,1611764735,US +1611764736,1611764991,NL +1611764992,1611765759,US +1611765760,1611766015,NL +1611766016,1611777023,US +1611777024,1611777279,NL +1611777280,1611778047,US +1611778048,1611778559,NL +1611778560,1611923455,US +1611923456,1612185599,CA +1612185600,1612595199,US +1612595200,1612611327,TH +1612611328,1612636159,CA +1612636160,1613471743,US +1613471744,1613479935,JM +1613479936,1613480191,CA +1613480192,1613488127,US +1613488128,1613492223,CA +1613492224,1613504511,US +1613504512,1613529087,CA +1613529088,1613545471,US +1613545472,1613565951,CA +1613570048,1613584639,US +1613584640,1613584895,HK +1613584896,1613585407,US +1613585408,1613585663,DE +1613585664,1613585919,GB +1613585920,1613606911,US +1613606912,1613615103,CA +1613615104,1613635583,US +1613635584,1613640191,CA +1613640192,1613640319,US +1613640320,1613640447,CA +1613640448,1613640575,US +1613640576,1613643263,CA +1613643264,1613643391,US +1613643392,1613643775,CA +1613643776,1613676543,US +1613676544,1613680639,CA +1613680640,1613737983,US +1613737984,1613742079,CA +1613742080,1613758463,US +1613758464,1614282751,CA +1614282752,1614741503,US +1614741504,1614757887,CA +1614757888,1614774271,US +1614774272,1614786559,CA +1614786560,1618837503,US +1618837504,1618841599,CA +1618841600,1618845695,DE +1618845696,1618849791,US +1618849792,1618862079,CA +1618862080,1618866175,US +1618866176,1618870271,CA +1618870272,1618984959,US +1618984960,1619001343,CA +1619001344,1632305151,US +1632305152,1632321535,CA +1632321536,1632354303,US +1632354304,1632362495,CA +1632362496,1634414591,US +1634414592,1634418687,CA +1634418688,1634447359,US +1634447360,1634451455,CA +1634451456,1634455551,US +1634455552,1634459647,CA +1634459648,1634459903,US +1634459904,1634460671,CA +1634460672,1634467839,US +1634467840,1634729983,CA +1634729984,1652293631,US +1652293632,1652310015,CA +1652310016,1652481279,US +1652481280,1652481791,CN +1652481792,1653500927,US +1653500928,1653501103,FR +1653501104,1653501111,IN +1653501112,1653501175,FR +1653501176,1653534719,US +1653534720,1653538815,CA +1653538816,1653555199,US +1653555200,1653567487,CA +1653567488,1653571583,US +1653571584,1653575679,CA +1653575680,1653579775,US +1653583872,1653592063,US +1653592064,1653596159,CA +1653596160,1653600255,US +1653600256,1653604351,CA +1653604352,1654542335,US +1654542336,1654546431,CA +1654546432,1654550527,VG +1654550528,1654554623,US +1654554624,1654558719,CA +1654558720,1654582015,US +1654582016,1654582271,CN +1654582272,1654595583,US +1654595584,1654596095,CA +1654596096,1654648831,US +1654648832,1654652927,CA +1654652928,1666731329,US +1666731330,1666731330,FR +1666731331,1673527295,US +1673527296,1673560063,CA +1673560064,1673986047,US +1673986048,1674051583,CA +1674051584,1674575871,US +1674575872,1677721599,CA +1677721600,1677787392,US +1677787393,1677787405,CN +1677787406,1678377256,US +1678377257,1678377257,UG +1678377258,1678377258,US +1678377259,1678377259,UG +1678377260,1678377264,ZA +1678377265,1678377269,US +1678377270,1678377270,UG +1678377271,1678377271,ZA +1678377272,1678377278,US +1678377279,1678377282,UG +1678377283,1678377314,US +1678377315,1678377315,CZ +1678377316,1680479231,US +1680479232,1680480255,CA +1680480256,1680535551,US +1680535552,1680539647,CA +1680539648,1680564223,US +1680564224,1680572415,CA +1680572416,1681915903,US +1686110208,1694498815,US +1694498816,1694499839,CN +1694499840,1694500863,ID +1694500864,1694507007,JP +1694507008,1694515199,IN +1694515200,1694531583,AU +1694531584,1694564351,TW +1694564352,1694565375,CN +1694565376,1694566399,HK +1694566400,1694568447,KR +1694568448,1694572543,HK +1694572544,1694580735,KR +1694580736,1694629887,JP +1694629888,1694662655,IN +1694662656,1694670847,JP +1694670848,1694672895,BD +1694672896,1694673919,AU +1694673920,1694674943,CN +1694674944,1694679039,LK +1694679040,1694695423,AU +1694695424,1694760959,TW +1694760960,1695023103,CN +1695023104,1695547391,TW +1695547392,1697775615,CN +1697775616,1697776639,ID +1697776640,1697777663,JP +1697777664,1697779711,CN +1697779712,1697783807,ID +1697783808,1697789951,JP +1697789952,1697790975,CN +1697790976,1697791999,JP +1697792000,1697808383,PK +1697808384,1697841151,JP +1697841152,1697906687,TH +1697906688,1697972223,CN +1697972224,1697988607,VN +1697988608,1697996799,KR +1697996800,1697997823,JP +1697997824,1697998847,CN +1697998848,1698004991,JP +1698004992,1698013183,IN +1698013184,1698021375,US +1698021376,1698029567,NZ +1698029568,1698037759,PK +1698037760,1698103295,CN +1698103296,1698136063,KR +1698136064,1698160639,JP +1698160640,1698162687,CN +1698162688,1698168831,JP +1698168832,1698693119,IN +1698693120,1699611647,CN +1699611648,1699612671,JP +1699612672,1699614719,LA +1699614720,1699618815,MY +1699618816,1699627007,CN +1699627008,1699643391,SG +1699643392,1699676159,HK +1699676160,1699713023,KR +1699713024,1699713535,TW +1699713536,1699713791,MM +1699713792,1699714047,PH +1699714048,1699714815,AU +1699714816,1699715327,HK +1699715328,1699715583,KR +1699715584,1699715839,SG +1699715840,1699716351,TW +1699716352,1699716607,KR +1699716608,1699716863,AE +1699716864,1699717119,TW +1699717120,1699741695,KR +1699741696,1700793343,CN +1700793344,1700794367,VN +1700794368,1700798463,CN +1700798464,1700806655,JP +1700806656,1700823039,VN +1700823040,1700855807,CN +1700855808,1700921343,JP +1700921344,1700986879,NZ +1700986880,1701003263,VN +1701003264,1701011455,MY +1701011456,1701019647,CN +1701019648,1701052415,GU +1701052416,1701093375,NZ +1701093376,1701117951,SG +1701117952,1701134335,NC +1701134336,1701142527,CN +1701142528,1701143551,HK +1701143552,1701143807,CN +1701143808,1701144063,AU +1701144064,1701150719,CN +1701150720,1701183487,KR +1701183488,1701199871,JP +1701199872,1701208063,CN +1701208064,1701209087,JP +1701209088,1701209855,CN +1701209856,1701210111,AU +1701210112,1701216255,CN +1701216256,1701249023,JP +1701249024,1701314559,AU +1701314560,1701576703,CN +1701576704,1701707775,TH +1701707776,1701724159,JP +1701724160,1701736447,CN +1701736448,1701737471,NZ +1701737472,1701740543,CN +1701740544,1701838847,JP +1701838848,1702363135,AU +1702363136,1702821887,CN +1702821888,1702887423,SG +1702887424,1702888447,CN +1702888448,1702889471,AU +1702889472,1702903807,CN +1702903808,1702920191,ID +1702920192,1702952959,JP +1702952960,1703411711,CN +1703411712,1703673855,TW +1703673856,1703935999,JP +1703936000,1704984575,CN +1704984576,1705488383,AU +1705488384,1705489407,HK +1705489408,1705490431,SG +1705490432,1705491455,GB +1705491456,1705494527,HK +1705494528,1705497599,SG +1705497600,1705500671,GB +1705500672,1707081727,AU +1707081728,1707737087,CN +1707737088,1707802623,KR +1707802624,1707835391,JP +1707835392,1707845631,CN +1707845632,1707846655,ID +1707846656,1707851775,CN +1707851776,1707868159,JP +1707868160,1708130303,CN +1708130304,1709178879,IN +1709178880,1709834239,CN +1709834240,1709850623,SG +1709850624,1709852671,CN +1709852672,1709853695,AU +1709853696,1709867007,CN +1709867008,1709899775,AU +1709899776,1709965311,KR +1709965312,1710882815,CN +1710882816,1710948351,KR +1710948352,1710949375,CN +1710949376,1710950399,NP +1710950400,1710972671,CN +1710972672,1710972927,TW +1710972928,1711210495,CN +1711210496,1711276031,ID +1721761792,1722023935,MU +1722286080,1722810367,TN +1722896384,1722898431,TZ +1722899456,1722925055,ZA +1722925056,1722941439,ZW +1722941440,1723138047,BF +1723138048,1723195391,SD +1723195392,1723203583,CI +1723203584,1723269119,ZA +1723269120,1723334655,LR +1723334656,1723858943,EG +1724715556,1724715556,MU +1725956096,1727004671,MU +1727004672,1727266815,TN +1727266816,1727528959,CM +1727528960,1728053247,ZA +1728053248,1728120063,AU +1728120064,1728120319,SG +1728120320,1728120575,IN +1728120576,1728120831,AU +1728120832,1728121855,CN +1728121856,1728123903,HK +1728123904,1728125951,CN +1728125952,1728126975,LA +1728126976,1728132095,HK +1728132096,1728134399,AU +1728134400,1728134655,US +1728134656,1728135167,AU +1728135168,1728136191,HK +1728136192,1728137215,MY +1728137216,1728138239,CN +1728138240,1728139263,AU +1728139264,1728140287,IN +1728140288,1728141311,SG +1728141312,1728142335,CN +1728142336,1728143359,NP +1728143360,1728144383,MP +1728144384,1728145407,IN +1728145408,1728146431,MY +1728146432,1728147455,AU +1728147456,1728148479,IN +1728148480,1728149503,PH +1728149504,1728150527,JP +1728150528,1728152575,IN +1728152576,1728153599,MY +1728153600,1728154623,SG +1728154624,1728155647,JP +1728155648,1728157695,MY +1728157696,1728157951,HK +1728157952,1728158463,MY +1728158464,1728158719,NL +1728158720,1728159743,HK +1728159744,1728161791,TH +1728161792,1728162815,CN +1728162816,1728163839,SG +1728163840,1728164863,LK +1728164864,1728165887,FJ +1728165888,1728168959,AU +1728168960,1728169983,IN +1728169984,1728171007,VN +1728171008,1728172031,AU +1728172032,1728173055,VN +1728173056,1728175103,AU +1728175104,1728176127,TW +1728176128,1728177151,HK +1728177152,1728178175,AU +1728178176,1728179199,LA +1728179200,1728180223,VN +1728180224,1728181247,AU +1728181248,1728203775,JP +1728203776,1728204799,KR +1728204800,1728205823,IN +1728205824,1728206847,KR +1728206848,1728207871,SB +1728207872,1728208895,KR +1728208896,1728210943,JP +1728210944,1728211967,SG +1728211968,1728212991,CN +1728212992,1728214015,TH +1728214016,1728215039,AU +1728215040,1728216063,NZ +1728216064,1728218111,JP +1728218112,1728219135,IN +1728219136,1728220159,JP +1728220160,1728221183,NZ +1728221184,1728222207,ID +1728222208,1728224255,LK +1728224256,1728225279,CN +1728225280,1728226303,JP +1728226304,1728227327,CN +1728227328,1728230399,AU +1728230400,1728231423,SG +1728231424,1728232447,NC +1728232448,1728235519,AU +1728235520,1728239615,CN +1728239616,1728240639,TW +1728240640,1728243711,VN +1728243712,1728246783,IN +1728246784,1728254975,JP +1728254976,1728255999,MY +1728256000,1728257023,HK +1728257024,1728258047,JP +1728258048,1728259071,IN +1728259072,1728260095,KR +1728260096,1728261119,IN +1728261120,1728262143,ID +1728262144,1728264191,JP +1728264192,1728265215,ID +1728265216,1728266239,SG +1728266240,1728267263,TH +1728267264,1728268287,ID +1728268288,1728269311,MY +1728269312,1728270335,ID +1728270336,1728271359,PH +1728271360,1728286719,CN +1728286720,1728287743,AU +1728287744,1728290815,CN +1728290816,1728291839,AU +1728291840,1728292863,SG +1728292864,1728293887,PG +1728293888,1728294911,MY +1728294912,1728295935,TH +1728295936,1728299007,JP +1728299008,1728300031,TW +1728300032,1728301055,AU +1728301056,1728302079,SG +1728302080,1728303103,IN +1728303104,1728305151,ID +1728305152,1728306175,AU +1728306176,1728307199,ID +1728307200,1728308223,BD +1728308224,1728309247,IN +1728309248,1728310271,NZ +1728310272,1728310783,AU +1728310784,1728311295,US +1728311296,1728312319,MP +1728312320,1728315391,VN +1728315392,1728316415,ID +1728316416,1728317439,MY +1728317440,1728319487,JP +1728319488,1728320511,AU +1728320512,1728322559,HK +1728322560,1728323583,MY +1728323584,1728324607,JP +1728324608,1728325631,SG +1728325632,1728326655,JP +1728326656,1728327679,MY +1728327680,1728328703,KR +1728328704,1728329727,ID +1728329728,1728330751,CN +1728330752,1728331775,AU +1728331776,1728332799,BD +1728332800,1728333823,JP +1728333824,1728334847,PF +1728334848,1728335871,JP +1728336896,1728337919,AU +1728337920,1728338943,MY +1728338944,1728339967,PK +1728339968,1728340991,SG +1728340992,1728342015,AU +1728342016,1728343039,TW +1728343040,1728344063,SG +1728344064,1728344575,HK +1728344576,1728345087,SG +1728345088,1728346111,BD +1728346112,1728346367,AU +1728346368,1728346623,NZ +1728346624,1728347147,AU +1728347148,1728347148,SG +1728347149,1728347416,AU +1728347417,1728347417,SG +1728347418,1728347421,AU +1728347422,1728347422,SG +1728347423,1728348159,AU +1728348160,1728349183,VN +1728349184,1728350207,AU +1728350208,1728351231,NZ +1728351232,1728352255,MY +1728352256,1728353279,BD +1728353280,1728354303,KR +1728354304,1728355327,NZ +1728355328,1728356351,TH +1728356352,1728357375,AU +1728357376,1728358399,ID +1728358400,1728359423,CN +1728359424,1728359935,AU +1728359936,1728360447,ID +1728360448,1728362495,KR +1728362496,1728363519,CN +1728363520,1728364543,BN +1728364544,1728365567,AU +1728365568,1728366591,SG +1728366592,1728367615,JP +1728367616,1728367871,IN +1728367872,1728368127,AU +1728368128,1728368639,ID +1728368640,1728369663,IN +1728369664,1728370687,AU +1728370688,1728371711,TH +1728371712,1728372735,IN +1728372736,1728373759,CN +1728373760,1728374783,TH +1728374784,1728375039,SG +1728375040,1728375295,IN +1728375296,1728376831,AU +1728376832,1728377855,ID +1728377856,1728378623,HK +1728378624,1728378879,US +1728378880,1728380927,IN +1728380928,1728382975,PH +1728382976,1728383999,SG +1728384000,1728385023,HK +1728385024,1728386047,IN +1728386048,1728387071,JP +1728387072,1728388095,TH +1728388096,1728388351,NZ +1728388352,1728388607,AU +1728388608,1728389119,VN +1728389120,1728390143,TW +1728390144,1728391167,CN +1728391168,1728392191,JP +1728392192,1728393215,TW +1728393216,1728394239,ID +1728394240,1728396287,CN +1728396288,1728397311,PH +1728397312,1728398335,JP +1728398336,1728398847,AU +1728398848,1728399103,IN +1728399104,1728400383,NZ +1728400384,1728400895,AU +1728400896,1728401151,IN +1728401152,1728401407,HK +1728401408,1728402431,NZ +1728402432,1728403455,IN +1728403456,1728406527,AU +1728406528,1728407551,TW +1728407552,1728407807,AU +1728407808,1728408063,MY +1728408064,1728408319,AU +1728408320,1728408575,ID +1728408576,1728409599,NZ +1728409600,1728410623,IN +1728410624,1728411647,JP +1728411648,1728412671,TH +1728412672,1728413695,KH +1728413696,1728414719,KR +1728414720,1728415743,IN +1728415744,1728416767,PK +1728416768,1728417791,JP +1728417792,1728418815,KR +1728418816,1728419071,ID +1728419072,1728419327,HK +1728419328,1728419583,NP +1728419584,1728419839,SG +1728419840,1728420863,CN +1728420864,1728421887,NZ +1728421888,1728422911,JP +1728422912,1728423935,AU +1728423936,1728424959,CN +1728424960,1728425983,AF +1728425984,1728427007,JP +1728427008,1728428031,MY +1728428032,1728430079,IN +1728430080,1728431103,CN +1728431104,1728431615,AF +1728431616,1728431871,HK +1728431872,1728432127,SG +1728432128,1728433151,IN +1728433152,1728435199,VN +1728435200,1728435967,AU +1728435968,1728436223,ID +1728436224,1728437247,IN +1728437248,1728438271,HK +1728438272,1728439295,NZ +1728439296,1728439807,NP +1728439808,1728440319,KH +1728440320,1728441343,BD +1728441344,1728442367,MY +1728442368,1728443391,SG +1728443392,1728444415,IN +1728444416,1728444671,HK +1728444672,1728444927,JP +1728444928,1728445183,HK +1728445184,1728445439,JP +1728445440,1728446463,CN +1728446464,1728446975,ID +1728446976,1728447231,IN +1728447232,1728447487,AU +1728447488,1728448511,HK +1728448512,1728449535,KH +1728449536,1728450559,AU +1728450560,1728452607,JP +1728452608,1728453119,AU +1728453120,1728453631,IN +1728453632,1728454655,NZ +1728454656,1728455167,IN +1728455168,1728455423,ID +1728455424,1728455679,AU +1728455680,1728457727,ID +1728457728,1728458751,JP +1728458752,1728459775,HK +1728459776,1728460799,ID +1728460800,1728462847,JP +1728462848,1728463871,US +1728463872,1728464895,JP +1728464896,1728465919,KR +1728465920,1728466943,CN +1728466944,1728467967,KR +1728467968,1728468735,HK +1728468736,1728469247,IN +1728469248,1728469503,NZ +1728469504,1728470015,IN +1728470016,1728471039,JP +1728471040,1728472063,PH +1728472064,1728473087,KR +1728473088,1728473343,PH +1728473344,1728473599,AU +1728473600,1728474111,SG +1728474112,1728475135,CN +1728475136,1728476159,JP +1728476160,1728476415,AU +1728476416,1728476927,ID +1728476928,1728477183,IN +1728479232,1728480255,HK +1728480256,1728481279,IN +1728481280,1728483327,HK +1728483328,1728484351,NZ +1728484352,1728485375,SG +1728485376,1728486399,HK +1728486400,1728487423,IN +1728487424,1728487935,HK +1728487936,1728488191,TH +1728488192,1728488447,MY +1728488448,1728488703,IN +1728488704,1728488959,TH +1728489216,1728490495,IN +1728490496,1728491519,KR +1728491520,1728492543,HK +1728492544,1728492799,ID +1728492800,1728493055,PH +1728493056,1728493567,TH +1728493568,1728494591,IN +1728494592,1728495615,AU +1728495616,1728496639,HK +1728496640,1728497663,MY +1728497664,1728499711,ID +1728499712,1728500735,AU +1728500736,1728501247,NZ +1728501248,1728501503,ID +1728501504,1728502783,AU +1728502784,1728503807,CN +1728503808,1728504831,JP +1728504832,1728505855,CN +1728505856,1728506879,NL +1728506880,1728507903,MY +1728507904,1728508927,JP +1728508928,1728509951,MY +1728509952,1728510975,PH +1728510976,1728511999,AU +1728512000,1728512511,ID +1728512512,1728512767,SG +1728512768,1728513023,IN +1728513024,1728513279,CN +1728513280,1728514047,HK +1728514048,1728515071,SG +1728515072,1728516095,ID +1728516096,1728517119,TH +1728517120,1728518143,JP +1728518144,1728519167,KH +1728519168,1728520191,CN +1728520192,1728521215,KR +1728521216,1728523263,VN +1728523264,1728525311,AU +1728525312,1728525823,ID +1728525824,1728526335,HK +1728526336,1728527359,TH +1728527360,1728528383,PK +1728528384,1728529407,IN +1728529408,1728530431,MY +1728530432,1728531455,AU +1728531456,1728532479,PK +1728532480,1728533503,IN +1728533504,1728534527,ID +1728534528,1728535551,AU +1728535552,1728536575,JP +1728536576,1728537087,NZ +1728537088,1728537599,AU +1728537600,1728538623,GU +1728538624,1728539647,AF +1728539648,1728540671,IN +1728540672,1728541695,BD +1728541696,1728542719,JP +1728543744,1728544767,SG +1728544768,1728545791,IN +1728545792,1728546815,JP +1728546816,1728547839,AU +1728547840,1728548863,CN +1728548864,1728549119,KH +1728549120,1728549375,IN +1728549376,1728549631,PH +1728549632,1728549887,AU +1728549888,1728550911,IN +1728550912,1728551935,JP +1728551936,1728552959,SG +1728552960,1728553983,HK +1728553984,1728555007,AU +1728555008,1728556031,NZ +1728556032,1728556287,VN +1728556288,1728556543,ID +1728556544,1728557055,VN +1728557056,1728557311,ID +1728557312,1728557567,VN +1728557568,1728558079,ID +1728558080,1728559103,IN +1728559104,1728560127,ID +1728560128,1728560639,AU +1728560640,1728561151,KR +1728561152,1728562175,AU +1728562176,1728562431,VN +1728562432,1728562687,VU +1728562688,1728563199,JP +1728563200,1728564223,SG +1728564224,1728565247,IN +1728565248,1728566271,JP +1728566272,1728569343,CN +1728569344,1728569599,PH +1728569600,1728571391,ID +1728571392,1728572415,AU +1728572416,1728573439,JP +1728573440,1728574463,HK +1728574464,1728575487,KR +1728575488,1728576511,BD +1728576512,1728577535,BT +1728577536,1728580607,CN +1728580608,1728580863,ID +1728580864,1728581119,VN +1728581120,1728581631,PK +1728581632,1728582655,NZ +1728582656,1728583679,JP +1728583680,1728584703,MY +1728584704,1728585215,AU +1728585216,1728585727,SG +1728585728,1728586751,CN +1728586752,1728589823,IN +1728589824,1728590847,JP +1728590848,1728591871,CN +1728591872,1728592895,ID +1728592896,1728593151,MN +1728593152,1728593407,AU +1728593408,1728593663,IN +1728593664,1728593919,ID +1728594944,1728595967,CN +1728595968,1728596479,NZ +1728596480,1728598015,ID +1728598016,1728599039,NZ +1728599040,1728602111,JP +1728602112,1728603135,ID +1728603136,1728604159,KR +1728604160,1728605183,TW +1728605184,1728606207,CN +1728606208,1728607231,PK +1728607232,1728608255,IN +1728608256,1728608511,SG +1728608512,1728608767,BD +1728608768,1728609023,ID +1728609024,1728610303,IN +1728610304,1728611327,TH +1728611328,1728613375,AU +1728613376,1728614399,NZ +1728614400,1728615423,MY +1728615424,1728616447,IN +1728616448,1728617471,SG +1728617472,1728618495,CN +1728618496,1728619519,MY +1728619520,1728620543,IN +1728620544,1728622591,AU +1728622592,1728624639,JP +1728625664,1728626175,IN +1728626176,1728626431,JP +1728626432,1728626687,HK +1728626688,1728627711,IN +1728627712,1728628735,JP +1728628736,1728630783,CN +1728630784,1728631807,TH +1728631808,1728632319,SG +1728632320,1728632575,PK +1728632576,1728633855,IN +1728633856,1728634879,CN +1728634880,1728636159,ID +1728636160,1728636415,AU +1728636416,1728636671,KR +1728636672,1728636927,PK +1728636928,1728637951,NZ +1728637952,1728638463,AU +1728638464,1728638719,ID +1728638720,1728638975,AU +1728638976,1728639999,JP +1728640000,1728641023,ID +1728641024,1728642047,IN +1728642048,1728643071,NZ +1728643072,1728645119,VN +1728645120,1728646143,CN +1728646144,1728647167,IN +1728647168,1728648703,AU +1728648704,1728648959,ID +1728648960,1728649215,PK +1728649216,1728650239,CN +1728650240,1728651263,JP +1728651264,1728652287,KR +1728652288,1728653311,ID +1728653312,1728654335,NZ +1728654336,1728655359,ID +1728655360,1728655871,AU +1728655872,1728656127,SB +1728656128,1728656383,MY +1728656384,1728661503,AU +1728661504,1728662527,IN +1728662528,1728665599,VN +1728665600,1728666623,MN +1728666624,1728668671,JP +1728668672,1728669695,SG +1728669696,1728670207,BD +1728670208,1728670463,NZ +1728670464,1728670719,ID +1728670720,1728671743,CN +1728671744,1728672767,BD +1728672768,1728673791,TW +1728673792,1728674815,JP +1728674816,1728675839,ID +1728675840,1728676863,KR +1728676864,1728678911,BD +1728678912,1728679935,PG +1728679936,1728680959,ID +1728680960,1728681983,MY +1728681984,1728683007,CN +1728683008,1728684031,VN +1728684032,1728685055,AU +1728685056,1728686079,JP +1728686080,1728687103,AU +1728687104,1728688127,JP +1728688128,1728689151,KR +1728689152,1728689407,JP +1728689408,1728689663,BD +1728689664,1728689919,PK +1728689920,1728690175,ID +1728690176,1728691199,BD +1728691200,1728692223,KH +1728692224,1728693247,CN +1728693248,1728698367,VN +1728698368,1728699391,NZ +1728699392,1728699903,BD +1728699904,1728700415,IN +1728700416,1728700671,BD +1728700672,1728700927,IN +1728700928,1728701183,PG +1728701184,1728701439,ID +1728701440,1728702463,WS +1728702464,1728703487,IN +1728703488,1728704511,NZ +1728704512,1728705535,AU +1728705536,1728706559,HK +1728706560,1728709631,CN +1728709632,1728710655,TW +1728710656,1728710911,AU +1728710912,1728711167,IN +1728711424,1728711679,AU +1728711680,1728712703,HK +1728712704,1728713727,CN +1728713728,1728714751,MN +1728714752,1728715775,IN +1728715776,1728716799,NP +1728716800,1728717823,AU +1728717824,1728718847,JP +1728718848,1728719871,MY +1728719872,1728720895,VN +1728720896,1728721919,AU +1728721920,1728722943,BD +1728722944,1728723199,ID +1728723200,1728723455,AU +1728723456,1728726015,ID +1728727040,1728728063,AU +1728728064,1728729087,BD +1728729088,1728729599,ID +1728729600,1728730111,AU +1728730112,1728731135,CN +1728731136,1728732159,VN +1728732160,1728733183,KR +1728733184,1728734207,ID +1728734208,1728735231,SG +1728735232,1728736255,ID +1728736512,1728736767,IN +1728736768,1728737023,ID +1728737280,1728738303,JP +1728738304,1728739327,IN +1728739328,1728740351,ID +1728740352,1728740607,SG +1728740608,1728741119,AU +1728741120,1728741375,IN +1728741376,1728742399,ID +1728742400,1728743423,IN +1728743424,1728744447,ID +1728744448,1728745471,CN +1728745472,1728747519,ID +1728747520,1728748543,PH +1728748544,1728750591,MY +1728750592,1728751615,JP +1728751616,1728751871,IN +1728751872,1728752639,ID +1728752640,1728753663,HK +1728753664,1728754687,PH +1728754688,1728755711,IN +1728755712,1728756735,ID +1728756736,1728757759,IN +1728758784,1728759039,MY +1728759040,1728759807,HK +1728759808,1728760831,PH +1728760832,1728761855,TW +1728761856,1728762879,IN +1728762880,1728763903,VN +1728763904,1728764927,KR +1728764928,1728765439,SG +1728765440,1728765695,IN +1728765696,1728765951,ID +1728765952,1728766975,IN +1728766976,1728767999,TH +1728768000,1728768255,AU +1728768256,1728768511,NZ +1728768512,1728769023,IN +1728769024,1728770047,HK +1728770048,1728772095,JP +1728772096,1728773375,IN +1728773376,1728773631,ID +1728773632,1728774143,PH +1728774144,1728775167,PK +1728775168,1728776191,JP +1728776192,1728777215,AU +1728777216,1728778239,TH +1728778240,1728779263,CN +1728779264,1728779519,IN +1728779520,1728780287,ID +1728780288,1728781311,KR +1728781312,1728782335,ID +1728782336,1728783359,LK +1728783360,1728783615,HK +1728783616,1728783871,TW +1728783872,1728784383,HK +1728784384,1728785407,PH +1728785408,1728786431,KR +1728786432,1728787455,SG +1728787456,1728788479,AU +1728788480,1728789503,KR +1728789504,1728790527,PK +1728790528,1728791551,US +1728791552,1728792575,PK +1728792576,1728793087,HK +1728793088,1728793599,ID +1728793600,1728794623,AU +1728794624,1728796671,IN +1728796672,1728798719,HK +1728798720,1728799743,ID +1728799744,1728801279,HK +1728801280,1728801791,ID +1728801792,1728802815,HK +1728802816,1728803839,PH +1728803840,1728804863,IN +1728804864,1728805887,JP +1728805888,1728806911,NZ +1728806912,1728807935,KR +1728807936,1728808959,ID +1728808960,1728809983,BD +1728809984,1728810495,SG +1728810496,1728810751,AU +1728810752,1728811007,SG +1728811008,1728812031,AU +1728812032,1728812543,ID +1728812544,1728813055,SG +1728813056,1728814079,IN +1728814080,1728815103,JP +1728815104,1728815359,AU +1728815360,1728815871,PG +1728815872,1728816127,AU +1728816128,1728816383,SG +1728816384,1728817151,AU +1728817152,1728818175,CN +1728818176,1728819199,VN +1728819200,1728819711,ID +1728819712,1728819967,NZ +1728819968,1728820223,ID +1728820224,1728821247,CN +1728821248,1728821759,AU +1728821760,1728822271,ID +1728822272,1728823295,SG +1728823296,1728824319,MN +1728825344,1728826367,SG +1728826368,1728827391,AU +1728827392,1728828415,JP +1728828416,1728829439,AU +1728829440,1728830463,KH +1728830464,1728830719,PK +1728830720,1728830975,JP +1728830976,1728831487,ID +1728831488,1728832511,IN +1728832512,1728833535,HK +1728833536,1728834559,IN +1728834560,1728835583,JP +1728835584,1728836607,NZ +1728836608,1728837631,HK +1728837632,1728838655,KR +1728838656,1728839679,ID +1728839936,1728840191,IN +1728840192,1728840447,SG +1728840448,1728842751,AU +1728842752,1728843775,ID +1728843776,1728844799,JP +1728844800,1728845311,ID +1728845312,1728845567,AU +1728845568,1728845823,ID +1728845824,1728846847,IN +1728846848,1728847871,ID +1728847872,1728848895,CN +1728848896,1728849919,AU +1728849920,1728850943,PK +1728850944,1728851967,BD +1728851968,1728852991,HK +1728852992,1728854015,JP +1728854016,1728854527,AU +1728854528,1728854783,PK +1728854784,1728855039,AU +1728855040,1728855551,TH +1728855552,1728857087,MY +1728857088,1728858111,CN +1728858112,1728859135,BD +1728859136,1728860159,HK +1728860160,1728860671,ID +1728860672,1728861183,BD +1728861184,1728861439,ID +1728861440,1728862207,AU +1728862208,1728863231,PH +1728863232,1728864255,CN +1728864256,1728865279,AF +1728865280,1728866303,AU +1728866304,1728867327,VN +1728867328,1728868351,AU +1728868352,1728869375,ID +1728869376,1728870399,IN +1728870400,1728871423,PK +1728871424,1728872447,IN +1728872448,1728873471,AU +1728873472,1728874495,IN +1728874496,1728875519,CN +1728875520,1728877567,MY +1728877568,1728878591,HK +1728878592,1728879615,MY +1728879616,1728880127,IN +1728880128,1728880383,JP +1728880384,1728880639,AU +1728880640,1728881663,KH +1728881664,1728881919,ID +1728881920,1728882175,AU +1728882176,1728882431,BD +1728882432,1728882687,ID +1728882688,1728883711,IN +1728883712,1728885759,BD +1728886784,1728887807,CN +1728887808,1728888831,AU +1728888832,1728889855,IN +1728889856,1728890879,PK +1728890880,1728891903,AU +1728891904,1728892927,BD +1728892928,1728893439,BN +1728893440,1728893695,SG +1728893696,1728893951,IN +1728893952,1728894463,US +1728894464,1728894975,SG +1728894976,1728895999,HK +1728896000,1728897023,ID +1728898048,1728899071,BD +1728899072,1728900095,CN +1728900096,1728901119,BD +1728901120,1728901375,ID +1728901376,1728901631,AU +1728901632,1728902143,ID +1728902400,1728902911,IN +1728902912,1728903167,BD +1728903168,1728905215,KR +1728905216,1728905471,IN +1728905472,1728905727,PK +1728905728,1728906239,IN +1728906240,1728907263,MY +1728907264,1728908287,NZ +1728908288,1728909311,CN +1728909312,1728912383,JP +1728912384,1728913407,TH +1728913408,1728914431,MM +1728914432,1728915199,ID +1728915200,1728915455,NZ +1728915456,1728917503,JP +1728917504,1728918527,HK +1728918528,1728919551,KR +1728919552,1728920575,AU +1728920576,1728921599,JP +1728921600,1728922623,AF +1728922624,1728923647,AU +1728923648,1728924159,CN +1728924160,1728924671,MY +1728924672,1728925695,VN +1728925696,1728927743,AU +1728927744,1728928767,LA +1728928768,1728929791,JP +1728929792,1728930815,IN +1728930816,1728931839,AU +1728931840,1728933887,IN +1728933888,1728934911,US +1728934912,1728935935,NZ +1728935936,1728936959,MY +1728936960,1728937983,CN +1728937984,1728939007,SG +1728939008,1728939519,BD +1728939520,1728939775,PH +1728939776,1728940031,IN +1728941056,1728942079,JP +1728942080,1728943103,CN +1728943104,1728944127,BD +1728944128,1728945151,JP +1728945152,1728946175,BD +1728946176,1728947199,KR +1728948224,1728949247,JP +1728949248,1728950271,SG +1728950272,1728950783,HK +1728950784,1728951551,IN +1728951552,1728951807,ID +1728951808,1728952063,SG +1728952064,1728952319,IN +1728952320,1728952831,PH +1728952832,1728953343,AU +1728953344,1728954367,HK +1728955392,1728956415,CN +1728956416,1728957439,ID +1728958464,1728959487,JP +1728959488,1728960511,TH +1728960512,1728961279,AU +1728961280,1728961535,IN +1728961536,1728962559,CN +1728962560,1728963583,BD +1728963584,1728964607,TH +1728965632,1728966655,BD +1728966656,1728966911,HK +1728966912,1728967423,IN +1728967424,1728967679,HK +1728967680,1728968703,CN +1728968704,1728970751,JP +1728970752,1728971007,IN +1728971008,1728971263,AU +1728971264,1728971519,IN +1728971520,1728971775,NZ +1728971776,1728972799,AU +1728972800,1728973823,TH +1728973824,1728974847,JP +1728974848,1728976393,ID +1728976394,1728976394,AU +1728976395,1728976895,ID +1728976896,1728977151,TH +1728977152,1728977407,AU +1728977408,1728977919,BD +1728977920,1728978943,MY +1728978944,1728979967,CN +1728979968,1728980991,MN +1728980992,1728982015,AU +1728982016,1728982527,ID +1728982528,1728982783,IN +1728982784,1728985087,AU +1728986112,1728987135,PH +1728987136,1728987391,JP +1728987392,1728988159,AU +1728988160,1728988191,NZ +1728988192,1728988199,US +1728988200,1728989183,NZ +1728989184,1728989695,BD +1728989696,1728990207,ID +1728990208,1728990335,MY +1728990336,1728990463,ID +1728990464,1728990975,KR +1728990976,1728991231,SG +1728991232,1728992255,JP +1728992256,1728993279,CN +1728993280,1728994303,PG +1728994304,1728995327,AU +1728995328,1728996095,IN +1728996096,1728996351,SG +1728996352,1728997375,CN +1728997376,1728997887,DE +1728997888,1728998143,IE +1728998144,1728998399,IN +1728998400,1728998655,ID +1728998656,1728998911,BD +1728998912,1728999423,ID +1728999424,1729001471,HK +1729001472,1729003519,IN +1729003520,1729004543,BD +1729004544,1729006591,CN +1729006592,1729007615,NZ +1729007616,1729008639,HK +1729008640,1729010687,JP +1729010688,1729011711,CN +1729011712,1729012735,IN +1729012736,1729013759,TH +1729014784,1729015807,AU +1729015808,1729016831,JP +1729016832,1729017855,IN +1729017856,1729018111,MY +1729018112,1729018367,SG +1729018368,1729018879,AU +1729018880,1729019903,IN +1729019904,1729020159,ID +1729020160,1729020415,BD +1729020416,1729020671,PH +1729020672,1729020927,ID +1729020928,1729021951,IN +1729021952,1729022975,AU +1729022976,1729023999,BD +1729024000,1729025023,IN +1729025024,1729026047,SG +1729026048,1729027071,NZ +1729027072,1729027327,HK +1729027328,1729027583,AU +1729027584,1729027839,JP +1729027840,1729028095,HK +1729029120,1729029375,AU +1729029376,1729029631,ID +1729029632,1729029887,AU +1729029888,1729030143,PK +1729030144,1729031167,IN +1729031168,1729032191,SG +1729032192,1729033215,CN +1729033216,1729033727,SG +1729033728,1729034239,GB +1729034240,1729035263,KH +1729035264,1729036287,AU +1729036288,1729037311,JP +1729037312,1729039359,CN +1729040384,1729041407,CN +1729041408,1729042687,HK +1729042688,1729042943,SG +1729042944,1729044479,HK +1729044480,1729045503,JP +1729045504,1729046015,ID +1729046272,1729046527,JP +1729046528,1729047551,BD +1729047552,1729048575,AU +1729048576,1729049599,VN +1729049600,1729053695,IN +1729053696,1729054719,JP +1729054720,1729055231,AU +1729055232,1729055487,IN +1729055488,1729055743,NZ +1729055744,1729056767,JP +1729056768,1729057791,IN +1729057792,1729058815,HK +1729060864,1729061887,CN +1729061888,1729062911,SG +1729062912,1729063935,MY +1729063936,1729064959,JP +1729064960,1729065983,PG +1729065984,1729067007,JP +1729067008,1729068031,HK +1729068032,1729068287,IN +1729068288,1729068543,US +1729068544,1729069055,NZ +1729069056,1729070079,AU +1729070080,1729071103,HK +1729071104,1729072127,MY +1729072128,1729072895,BD +1729072896,1729073151,ID +1729073152,1729074175,TH +1729074176,1729075199,AU +1729075200,1729076223,NZ +1729076224,1729076735,AU +1729076736,1729076991,HK +1729076992,1729077247,IN +1729077248,1729078271,JP +1729078272,1729079295,BD +1729079296,1729080319,AU +1729080320,1729081343,ID +1729081344,1729081599,IN +1729081600,1729082111,AU +1729082112,1729082367,IN +1729082368,1729083391,HK +1729083392,1729085439,JP +1729085440,1729087487,HK +1729087488,1729088511,CN +1729088512,1729090559,AU +1729090560,1729091583,JP +1729091584,1729092607,HK +1729093632,1729094143,BD +1729094144,1729094399,ID +1729094656,1729095679,IN +1729095680,1729096703,SG +1729096704,1729097215,AU +1729097216,1729097727,AF +1729097728,1729098751,ID +1729098752,1729099775,BD +1729099776,1729100543,IN +1729100544,1729100799,ID +1729100800,1729101823,IN +1729101824,1729102847,VN +1729102848,1729103871,IN +1729103872,1729104895,JP +1729104896,1729105663,IN +1729105664,1729105919,VU +1729105920,1729106943,SG +1729106944,1729107967,NZ +1729107968,1729108479,BD +1729108480,1729108991,HK +1729108992,1729111039,IN +1729111040,1729112063,JP +1729112064,1729113087,MY +1729113088,1729114111,IN +1729114112,1729114623,ID +1729114624,1729114879,IN +1729114880,1729115135,AU +1729115136,1729116159,CN +1729116160,1729117183,IN +1729117184,1729118207,KH +1729118208,1729119231,AU +1729119232,1729120255,IN +1729120256,1729121279,BD +1729121280,1729121535,IN +1729121536,1729122303,ID +1729122304,1729125375,CN +1729125376,1729127423,AU +1729127424,1729127935,IN +1729127936,1729128447,SG +1729128448,1729129471,IN +1729129472,1729130495,CN +1729130496,1729131519,ID +1729132544,1729133567,BN +1729133568,1729134591,CN +1729134592,1729135615,AU +1729135616,1729136127,ID +1729136128,1729136639,AU +1729136640,1729137663,ID +1729137664,1729139711,IN +1729139712,1729140735,AU +1729140736,1729141759,BD +1729141760,1729142783,PG +1729142784,1729143807,JP +1729143808,1729144831,IN +1729144832,1729145855,PH +1729145856,1729146879,NZ +1729146880,1729147903,IN +1729147904,1729148415,NZ +1729148416,1729148927,MY +1729148928,1729149951,HK +1729149952,1729150975,ID +1729150976,1729151999,AU +1729152000,1729152255,IN +1729152256,1729153023,ID +1729153024,1729154047,IN +1729154048,1729155071,TH +1729155072,1729155583,IN +1729155584,1729156095,AU +1729157120,1729158143,HK +1729158144,1729158399,ID +1729158400,1729158911,IN +1729158912,1729159167,ID +1729159168,1729160191,JP +1729160192,1729161215,HK +1729161216,1729162239,ID +1729162240,1729163263,JP +1729163264,1729165311,TW +1729166336,1729166671,SG +1729166672,1729166687,PH +1729166688,1729166847,SG +1729166848,1729167359,HK +1729167360,1729168383,IN +1729169408,1729170431,TW +1729170432,1729170687,HK +1729170688,1729171199,CN +1729171200,1729171455,IN +1729171456,1729171967,AU +1729171968,1729172223,IN +1729172224,1729172479,MY +1729172480,1729173503,PH +1729173504,1729174527,BN +1729174528,1729175551,HK +1729176576,1729177599,BD +1729177600,1729178623,CN +1729178624,1729179647,NC +1729179648,1729180671,IN +1729180672,1729181695,ID +1729181696,1729182207,AU +1729182208,1729182463,ID +1729182464,1729182719,AU +1729182720,1729183743,AF +1729183744,1729184767,CN +1729184768,1729185791,BD +1729185792,1729186815,HK +1729186816,1729187327,ID +1729187328,1729187583,MY +1729187584,1729187839,ID +1729187840,1729189887,IN +1729189888,1729190911,VN +1729190912,1729191935,HK +1729191936,1729195007,IN +1729195008,1729195519,MN +1729195520,1729196031,IN +1729196032,1729197055,GU +1729197056,1729198079,HK +1729198080,1729199103,CN +1729199104,1729199615,MY +1729199616,1729199871,JP +1729199872,1729200127,TH +1729200128,1729201151,IN +1729201152,1729202175,AU +1729202176,1729203199,CN +1729203200,1729205247,SG +1729206272,1729207295,AU +1729207296,1729208319,IN +1729208320,1729209343,CN +1729209344,1729209599,ID +1729209600,1729210367,AF +1729210368,1729211391,MY +1729211392,1729212415,ID +1729212416,1729213439,JP +1729213440,1729213951,BD +1729213952,1729214463,ID +1729214464,1729216511,JP +1729216512,1729216767,ID +1729216768,1729217023,AU +1729217024,1729217535,IN +1729217536,1729217791,JP +1729217792,1729218047,VN +1729218048,1729218175,MY +1729218176,1729218303,SG +1729218304,1729218431,JP +1729218432,1729218559,KR +1729218560,1729219583,PK +1729219584,1729220607,CN +1729220608,1729221631,MY +1729221632,1729222655,KH +1729222656,1729225727,AU +1729225728,1729226751,CN +1729226752,1729227775,AU +1729227776,1729228799,VN +1729228800,1729229823,TW +1729229824,1729230847,ID +1729230848,1729231103,PH +1729231104,1729231359,TH +1729231360,1729232895,AU +1729232896,1729233919,MY +1729233920,1729234943,VN +1729234944,1729236991,PK +1729236992,1729238015,ID +1729238016,1729239039,PK +1729239040,1729240063,JP +1729240064,1729242111,ID +1729242112,1729244159,AU +1729245184,1729247231,AU +1729247232,1729247487,NZ +1729247488,1729247743,AU +1729247744,1729248255,NZ +1729248256,1729249279,JP +1729249280,1729252351,IN +1729252352,1729253375,ID +1729253376,1729254399,BD +1729254400,1729255423,AU +1729255424,1729257471,MY +1729257472,1729258495,ID +1729258496,1729259519,JP +1729259520,1729260543,IN +1729260544,1729261567,AU +1729261568,1729262591,JP +1729262592,1729262847,PK +1729262848,1729263103,ID +1729263104,1729263615,NZ +1729263616,1729264639,IN +1729264640,1729265663,AU +1729265664,1729266687,TW +1729266688,1729267711,ID +1729267712,1729268735,NZ +1729268736,1729269759,IN +1729269760,1729270783,ID +1729270784,1729271807,AU +1729271808,1729272063,IN +1729272064,1729272319,ID +1729272320,1729272831,AU +1729272832,1729273855,IN +1729273856,1729274879,AF +1729274880,1729276927,IN +1729276928,1729277951,BN +1729277952,1729278975,VN +1729278976,1729279231,BD +1729279232,1729279487,ID +1729279488,1729279999,HK +1729281024,1729281535,AU +1729281536,1729282047,ID +1729282048,1729283071,CN +1729283072,1729284095,AU +1729284096,1729285119,NZ +1729285120,1729286143,AU +1729286144,1729288191,CN +1729288192,1729289215,IN +1729289216,1729290239,ID +1729290240,1729291263,CN +1729291264,1729292287,PH +1729293312,1729294591,ID +1729294592,1729294847,AU +1729294848,1729295103,IN +1729295104,1729295359,PK +1729295360,1729296383,MY +1729296384,1729297407,IN +1729297408,1729298431,AU +1729298432,1729299455,JP +1729299456,1729299519,NZ +1729299520,1729299583,AU +1729299584,1729300479,NZ +1729300480,1729300991,SG +1729300992,1729301503,NZ +1729301504,1729302527,CN +1729302528,1729302783,PH +1729302784,1729303551,IN +1729303552,1729304575,SG +1729304576,1729305599,HK +1729306624,1729307647,PH +1729307648,1729307903,BD +1729307904,1729308159,ID +1729308160,1729308415,HK +1729308416,1729308671,IN +1729308672,1729310719,CN +1729311744,1729312767,IN +1729312768,1729313791,ID +1729313792,1729314815,AU +1729314816,1729317887,CN +1729317888,1729319423,ID +1729319424,1729319935,SG +1729319936,1729320959,US +1729320960,1729321983,IN +1729321984,1729323007,AU +1729323008,1729324031,VN +1729324032,1729325055,NZ +1729325056,1729326079,TH +1729326080,1729327103,ID +1729327104,1729328127,AU +1729328128,1729329151,JP +1729330176,1729331199,KR +1729331200,1729331711,IN +1729331712,1729332223,BD +1729332224,1729335295,IN +1729335296,1729336319,AU +1729336320,1729338367,IN +1729339392,1729340415,JP +1729340416,1729341439,VN +1729341440,1729341951,IN +1729341952,1729343487,AU +1729343488,1729346559,ID +1729346560,1729347583,HK +1729347584,1729348607,AU +1729348608,1729350655,IN +1729350656,1729352703,ID +1729352704,1729353471,IN +1729353472,1729353727,JP +1729353728,1729353983,AU +1729353984,1729354239,IN +1729354240,1729354495,AU +1729354496,1729354751,MY +1729354752,1729355775,VN +1729355776,1729356799,IN +1729356800,1729357823,ID +1729357824,1729358847,CN +1729358848,1729359871,HK +1729359872,1729360895,JP +1729360896,1729361919,AU +1729361920,1729362943,IN +1729362944,1729363967,BD +1729363968,1729364991,PK +1729364992,1729367039,JP +1729367040,1729368063,CN +1729368064,1729369343,AU +1729369344,1729369599,ID +1729369600,1729370111,AU +1729370112,1729371135,BN +1729371136,1729372159,IN +1729372160,1729373183,CN +1729373184,1729374207,JP +1729374208,1729375231,TW +1729375232,1729376255,CN +1729376256,1729376767,AU +1729376768,1729377023,SG +1729377024,1729377279,ID +1729377280,1729378303,BD +1729378304,1729378559,AU +1729378560,1729378815,IN +1729378816,1729379071,KR +1729379072,1729379327,SG +1729379328,1729380351,HK +1729380352,1729381375,IN +1729381376,1729382399,CN +1729382400,1729383423,JP +1729383424,1729384447,PG +1729384448,1729385471,KH +1729385472,1729386495,JP +1729386496,1729386751,NZ +1729386752,1729387007,BD +1729387008,1729387519,ID +1729387520,1729388543,SG +1729390592,1729391103,IN +1729391104,1729391615,ID +1729392640,1729393663,CN +1729393664,1729394687,KR +1729394688,1729395711,TH +1729395712,1729395967,NR +1729395968,1729396735,IN +1729396736,1729397759,CN +1729397760,1729398783,PK +1729398784,1729399807,NZ +1729399808,1729400831,BD +1729400832,1729402879,VN +1729402880,1729403903,MN +1729403904,1729404927,JP +1729404928,1729405951,CN +1729405952,1729406207,IN +1729406208,1729406463,HK +1729406464,1729406975,ID +1729406976,1729407999,SG +1729408000,1729409023,HK +1729409024,1729410047,TW +1729410048,1729411071,BD +1729411072,1729413119,ID +1729413120,1729414143,HK +1729414144,1729414655,ID +1729415168,1729416191,AU +1729416192,1729417215,TH +1729417216,1729418239,AU +1729418240,1729419263,IN +1729419264,1729419519,AU +1729419520,1729419775,SG +1729419776,1729420031,IN +1729420288,1729421311,HK +1729421312,1729422335,MY +1729423360,1729423871,VU +1729423872,1729424383,AU +1729424384,1729425407,HK +1729426432,1729427455,AU +1729427456,1729428479,CN +1729428480,1729430527,AU +1729431552,1729432575,HK +1729432576,1729433599,PH +1729433600,1729433855,IN +1729433856,1729434111,AU +1729434112,1729434623,IN +1729434624,1729435647,AU +1729435648,1729436671,TH +1729436672,1729437695,SG +1729437696,1729438719,MY +1729438720,1729439743,JP +1729439744,1729440767,BD +1729440768,1729441791,MY +1729441792,1729442815,AU +1729442816,1729443839,IN +1729443840,1729444351,AU +1729444352,1729444863,IN +1729444864,1729445887,TW +1729445888,1729446399,SG +1729446400,1729446911,IN +1729446912,1729447935,SG +1729447936,1729448959,BD +1729448960,1729449983,IN +1729449984,1729450495,SG +1729450496,1729451007,IN +1729451008,1729452031,ID +1729452032,1729453055,MY +1729453056,1729454079,ID +1729455104,1729457151,JP +1729457152,1729458175,AU +1729458176,1729460223,CN +1729460224,1729461247,VN +1729461248,1729462271,IN +1729462272,1729464319,AU +1729464320,1729466367,CN +1729466368,1729467391,AU +1729467392,1729468415,VN +1729468416,1729469439,MY +1729469440,1729470463,AU +1729470464,1729471487,IN +1729471488,1729472511,LK +1729472512,1729473535,PH +1729473536,1729474559,NZ +1729474560,1729475583,CN +1729475584,1729476607,MY +1729476608,1729477631,IN +1729478656,1729478911,BD +1729478912,1729479423,NZ +1729479680,1729480703,TW +1729480704,1729481727,KR +1729481728,1729482751,ID +1729482752,1729483775,CN +1729483776,1729485823,ID +1729486848,1729488383,ID +1729488384,1729488895,SB +1729488896,1729490943,IN +1729490944,1729491967,CN +1729491968,1729492223,US +1729492224,1729492479,AU +1729492480,1729492991,US +1729492992,1729494015,SB +1729494016,1729495039,MY +1729495040,1729527807,CN +1729527808,1729528831,SG +1729528832,1729530879,ID +1729530880,1729531903,IN +1729531904,1729532927,AU +1729532928,1729533951,MY +1729533952,1729534975,JP +1729534976,1729535999,TW +1729536000,1729537023,MY +1729537024,1729537791,ID +1729537792,1729538047,JP +1729538048,1729538559,ID +1729538560,1729538815,SG +1729538816,1729539071,ID +1729539072,1729540095,IN +1729540096,1729541119,AU +1729541120,1729542143,TH +1729542144,1729543167,AU +1729543168,1729544191,CN +1729544192,1729545215,IN +1729545216,1729546239,AU +1729546240,1729546495,JP +1729546496,1729546751,US +1729546752,1729547007,NZ +1729547008,1729547263,HK +1729547264,1729548287,ID +1729548288,1729549311,AU +1729549312,1729550335,TW +1729551360,1729552383,KR +1729552384,1729553407,AU +1729553408,1729554431,CN +1729554432,1729554943,ID +1729554944,1729555455,NZ +1729555456,1729556479,IN +1729556480,1729557503,ID +1729557504,1729558527,NZ +1729558528,1729559551,ID +1729559552,1729560575,CN +1729560576,1729561599,AU +1729561600,1729562623,JP +1729562624,1729563647,CN +1729563648,1729564671,JP +1729564672,1729565695,NZ +1729565696,1729566719,ID +1729566720,1729568255,IN +1729568256,1729568511,ID +1729568512,1729568767,BD +1729568768,1729569791,ID +1729569792,1729570815,AF +1729570816,1729571839,BD +1729571840,1729572863,MY +1729572864,1729573887,MN +1729573888,1729574911,NC +1729574912,1729575935,CN +1729575936,1729576959,BD +1729576960,1729577983,AU +1729577984,1729578495,HK +1729578496,1729578751,AU +1729578752,1729579007,NZ +1729579008,1729580031,JP +1729580032,1729581055,SG +1729581056,1729583103,KR +1729585152,1729586175,PH +1729586176,1729587199,ID +1729587200,1729588223,AU +1729588224,1729589247,TW +1729589248,1729590271,AU +1729590272,1729590783,ID +1729590784,1729591295,IN +1729591296,1729592319,TH +1729592320,1729593343,IN +1729593344,1729594367,JP +1729594368,1729596415,KH +1729596416,1729596671,IN +1729596672,1729596927,ID +1729596928,1729597439,NZ +1729597440,1729598463,VN +1729598464,1729599231,IN +1729599232,1729599487,ID +1729599488,1729600511,AU +1729600512,1729601535,VN +1729601536,1729603583,CN +1729603584,1729604607,HK +1729605120,1729605375,AU +1729605376,1729605631,ID +1729605632,1729606655,CN +1729606656,1729607679,ID +1729607680,1729609727,AU +1729609728,1729609983,PH +1729609984,1729609999,HK +1729610000,1729610003,JP +1729610004,1729610063,HK +1729610064,1729610071,SG +1729610072,1729610751,HK +1729611776,1729612799,ID +1729612800,1729613823,BD +1729613824,1729614847,SG +1729614848,1729615103,NZ +1729615104,1729615359,KH +1729615360,1729615615,IN +1729615616,1729615871,MY +1729615872,1729616895,AU +1729616896,1729617919,JP +1729617920,1729618943,ID +1729618944,1729619967,CN +1729619968,1729620991,ID +1729620992,1729622015,IN +1729622016,1729623295,ID +1729623296,1729623551,AU +1729623552,1729623807,TH +1729624064,1729625087,JP +1729626112,1729627135,HK +1729627136,1729628159,SG +1729628160,1729629183,KR +1729629184,1729629695,ID +1729629696,1729629951,AU +1729629952,1729630207,HK +1729630208,1729631231,PH +1729631232,1729632255,IN +1729632256,1729633279,CN +1729633280,1729634303,NZ +1729634304,1729635327,KH +1729635328,1729636351,IN +1729636352,1729637375,NZ +1729637376,1729637887,SG +1729637888,1729638143,IN +1729638144,1729638399,AU +1729638400,1729639423,ID +1729639424,1729640447,JP +1729640448,1729641471,ID +1729641472,1729642495,IN +1729642496,1729643519,AU +1729643520,1729644543,JP +1729644544,1729645823,ID +1729645824,1729646079,SG +1729646592,1729649663,IN +1729649664,1729650687,HK +1729650688,1729651711,PK +1729651712,1729652735,TW +1729652736,1729653759,ID +1729653760,1729654783,IN +1729654784,1729655807,NC +1729655808,1729656831,CN +1729656832,1729657855,AU +1729657856,1729658879,IN +1729658880,1729659903,CN +1729659904,1729660415,AU +1729660416,1729660671,MY +1729660672,1729660927,IN +1729660928,1729662975,NZ +1729662976,1729663999,CN +1729664000,1729665023,ID +1729665024,1729666047,HK +1729666048,1729667071,SG +1729667072,1729668095,JP +1729668096,1729669119,SG +1729669120,1729670143,JP +1729670144,1729671167,IN +1729671168,1729672191,CN +1729672192,1729673215,IN +1729673216,1729674239,CN +1729674240,1729675263,IN +1729675264,1729676287,JP +1729676288,1729677311,AU +1729677312,1729677439,IN +1729677440,1729677567,NL +1729677568,1729678079,IN +1729678080,1729678271,NL +1729678272,1729678335,IN +1729678336,1729679359,HK +1729679360,1729680383,AU +1729680384,1729681407,ID +1729681408,1729682431,HK +1729682432,1729683455,CN +1729683456,1729684479,HK +1729684480,1729685503,CN +1729685504,1729687551,IN +1729687552,1729688575,AU +1729688576,1729689599,VN +1729689600,1729691647,CN +1729691648,1729693695,IN +1729693696,1729694207,CN +1729694208,1729694719,IN +1729694720,1729695743,MM +1729695744,1729696767,KR +1729696768,1729702911,CN +1729702912,1729703935,IN +1729703936,1729704959,CN +1729704960,1729705215,SG +1729705216,1729705471,AU +1729705472,1729705983,ID +1729705984,1729707007,AU +1729707008,1729708031,HK +1729708032,1729710079,CN +1729710080,1729711103,HK +1729711104,1729712127,MM +1729712128,1729713151,BD +1729713152,1729714175,IN +1729714176,1729715199,JP +1729715200,1729716223,IN +1729716224,1729717247,TH +1729717248,1729718271,JP +1729718272,1729719295,HK +1729719296,1729720319,ID +1729720320,1729721343,AU +1729721344,1729722367,NZ +1729722368,1729723391,BD +1729723392,1729726463,IN +1729726464,1729727487,PK +1729727488,1729728511,KI +1729728512,1729729535,BD +1729729536,1729730559,CN +1729730560,1729731583,IN +1729731584,1729732607,CN +1729732608,1729733631,AU +1729733632,1729734655,ID +1729734656,1729736703,IN +1729736704,1729737727,PH +1729737728,1729738751,AU +1729738752,1729739775,BD +1729739776,1729740799,NZ +1729740800,1729742335,ID +1729742336,1729742847,PH +1729742848,1729743871,SG +1729743872,1729744895,IN +1729744896,1729745919,ID +1729745920,1729746943,AU +1729746944,1729747967,CN +1729748224,1729748479,AU +1729748480,1729748991,ID +1729748992,1729750015,IN +1729750016,1729750527,VU +1729750528,1729751039,IN +1729751040,1729753087,TW +1729753088,1729754111,TH +1729754112,1729755135,NZ +1729755136,1729756159,BD +1729756160,1729756671,HK +1729756672,1729757183,JP +1729757184,1729758207,CN +1729758208,1729759231,ID +1729759232,1729760255,IN +1729760256,1729761279,ID +1729761280,1729762303,NZ +1729762304,1729763327,TH +1729763328,1729764351,SG +1729765376,1729766399,JP +1729766400,1729767423,PH +1729767424,1729768447,SG +1729768448,1729769471,MY +1729769472,1729772543,IN +1729772544,1729773567,AU +1729773568,1729774591,CN +1729774592,1729775615,AU +1729775616,1729776127,IN +1729776128,1729776639,MY +1729776640,1729777663,CN +1729777664,1729779711,PK +1729779712,1729780735,AU +1729780736,1729780991,HK +1729780992,1729781247,ID +1729781248,1729781503,HK +1729781504,1729781759,TL +1729781760,1729782783,IN +1729782784,1729783551,ID +1729783552,1729783807,NZ +1729783808,1729785855,IN +1729785856,1729786879,BD +1729786880,1729787903,CN +1729787904,1729789951,HK +1729789952,1729790975,ID +1729790976,1729791999,CN +1729792000,1729793023,BD +1729793024,1729794047,IN +1729794048,1729795071,HK +1729795072,1729796095,MY +1729796096,1729797119,JP +1729797120,1729799167,CN +1729799168,1729800191,JP +1729800192,1729800703,IN +1729800704,1729801215,MY +1729801216,1729802239,AU +1729802240,1729803263,MY +1729803264,1729804287,TH +1729804288,1729805311,PK +1729806336,1729807359,MN +1729807360,1729808383,MY +1729808384,1729808895,IN +1729808896,1729809407,AU +1729809408,1729809663,IN +1729809664,1729809919,US +1729809920,1729810175,AU +1729810176,1729810431,IN +1729810432,1729812479,ID +1729812480,1729813503,IN +1729813504,1729814527,SG +1729814528,1729815551,IN +1729815552,1729816575,CN +1729816576,1729817599,IN +1729817600,1729818623,AU +1729818624,1729819647,CN +1729819648,1729820671,BD +1729820672,1729821695,MY +1729821696,1729822719,VN +1729822720,1729822975,HK +1729822976,1729823231,AU +1729823232,1729823487,IN +1729823488,1729823743,ID +1729823744,1729824767,CN +1729824768,1729825791,IN +1729825792,1729826815,CN +1729826816,1729827839,IN +1729827840,1729828863,PK +1729828864,1729829887,CN +1729829888,1729831935,AU +1729831936,1729832191,ID +1729832192,1729832447,NZ +1729832448,1729832959,AU +1729832960,1729833983,JP +1729833984,1729835007,SG +1729835008,1729836031,IN +1729836032,1729837055,NZ +1729837056,1729838079,CN +1729838080,1729840127,VN +1729840128,1729841151,JP +1729841152,1729842175,MY +1729842176,1729842334,HK +1729842335,1729842335,US +1729842336,1729843199,HK +1729843200,1729844223,JP +1729844224,1729845247,IN +1729845248,1729846271,NZ +1729846272,1729847295,AU +1729847296,1729848319,CN +1729848320,1729849343,TH +1729849344,1729850367,MY +1729850368,1729851391,HK +1729851392,1729852415,MY +1729852416,1729853439,MM +1729853440,1729853695,IN +1729853696,1729853951,NZ +1729853952,1729854463,PH +1729854464,1729855487,HK +1729855488,1729856511,KR +1729856512,1729857535,AU +1729857536,1729858559,JP +1729858560,1729859583,IN +1729859584,1729860607,PH +1729860608,1729861631,KR +1729861632,1729862655,AU +1729862656,1729863679,JP +1729863680,1729864703,AU +1729864704,1729866751,IN +1729866752,1729867775,AU +1729867776,1729869823,HK +1729869824,1729870847,JP +1729870848,1729871871,AU +1729872896,1729873919,AU +1729873920,1729874943,TH +1729874944,1729875455,MY +1729875456,1729875967,ID +1729875968,1729876991,CN +1729876992,1729878015,HK +1729878016,1729879039,NZ +1729879040,1729879295,AU +1729879296,1729879423,KR +1729879424,1729879551,JP +1729879552,1729879807,AU +1729879808,1729879935,JP +1729879936,1729880063,KR +1729880064,1729880831,AU +1729880832,1729881087,NZ +1729881088,1729881215,PH +1729881216,1729881343,TH +1729881344,1729881471,ID +1729881472,1729881599,VN +1729881600,1729881727,TH +1729881728,1729881855,PH +1729881856,1729881983,VN +1729881984,1729882111,ID +1729882112,1729883135,IN +1729883136,1729884159,VN +1729884160,1729885183,CN +1729885184,1729886207,JP +1729886208,1729887743,ID +1729887744,1729887999,JP +1729888000,1729888255,IN +1729888256,1729889279,KH +1729889280,1729891327,CN +1729891328,1729892351,ID +1729892352,1729893375,PH +1729893376,1729893631,AU +1729893632,1729894399,ID +1729894400,1729896447,JP +1729896448,1729898495,VN +1729898496,1729899519,AU +1729899520,1729900543,HK +1729900544,1729901567,AU +1729901568,1729902079,ID +1729902080,1729902591,SG +1729902592,1729903615,ID +1729903616,1729905663,KR +1729905664,1729906687,US +1729906688,1729906943,AU +1729906944,1729907199,JP +1729907200,1729907711,ID +1729907712,1729908735,HK +1729908736,1729909759,ID +1729909760,1729910783,NP +1729910784,1729911807,MY +1729911808,1729912063,AU +1729912064,1729912831,ID +1729912832,1729913855,JP +1729913856,1729914879,TH +1729914880,1729915135,ID +1729915136,1729915391,IN +1729915392,1729918975,ID +1729918976,1729919999,BD +1729920000,1729921023,TH +1729921024,1729922047,AU +1729922048,1729923071,AF +1729923072,1729924095,VN +1729924096,1729925119,IN +1729925120,1729926143,HK +1729926144,1729926655,ID +1729926656,1729928191,PK +1729928192,1729929215,IN +1729929216,1729929471,AU +1729929472,1729929727,ID +1729929728,1729929983,MY +1729929984,1729930239,ID +1729930240,1729932287,JP +1729932288,1729933311,VN +1729933312,1729934335,ID +1729934336,1729935359,IN +1729935360,1729936383,CN +1729936384,1729938431,ID +1729938432,1729939455,AU +1729939456,1729939967,TW +1729939968,1729940479,PH +1729940480,1729941503,CN +1729941504,1729942527,SG +1729942528,1729943551,CN +1729943552,1729944063,AU +1729944064,1729946623,ID +1729946624,1729949695,JP +1729949696,1729950207,IN +1729950208,1729950719,KH +1729950720,1729951743,IN +1729951744,1729951999,SG +1729952000,1729952255,JP +1729952256,1729952511,AU +1729952512,1729952767,NZ +1729952768,1729953791,IN +1729954816,1729955839,ID +1729956864,1729957887,HK +1729957888,1729958911,CN +1729958912,1729959935,PH +1729959936,1729960959,SG +1729960960,1729961215,IN +1729961472,1729961983,NZ +1729961984,1729964031,IN +1729964032,1729965055,AU +1729965056,1729966079,IN +1729966080,1729967103,JP +1729967104,1729968127,AU +1729968128,1729969151,MY +1729970176,1729971199,AU +1729971200,1729972223,JP +1729972224,1729973247,HK +1729973248,1729974271,AU +1729975296,1729976831,AU +1729976832,1729977343,MM +1729977344,1729978367,HK +1729978368,1729979391,IN +1729979392,1729980415,AU +1729980416,1729980927,BD +1729980928,1729982463,SG +1729982464,1729982719,AU +1729982720,1729982975,JP +1729982976,1729983231,SG +1729983232,1729983487,AU +1729983488,1729984511,IN +1729984512,1729985535,ID +1729985536,1729986559,BD +1729986560,1729989631,CN +1729989632,1729990655,HK +1729990656,1729991679,MN +1729991680,1729992703,ID +1729992704,1729993727,NC +1729993728,1729994751,IN +1729994752,1729995519,AU +1729995520,1729995775,PK +1729995776,1729996799,ID +1729996800,1729997311,AU +1729997312,1729997823,ID +1729997824,1729998847,AU +1729998848,1729999871,JP +1730000896,1730001919,ID +1730001920,1730002943,TH +1730002944,1730003967,AU +1730003968,1730004223,ID +1730004224,1730004479,IN +1730004480,1730004735,MY +1730004736,1730004991,MN +1730004992,1730007039,AU +1730007040,1730008063,IN +1730008064,1730009087,ID +1730009088,1730010111,AU +1730010112,1730011135,IN +1730011136,1730012159,BT +1730012160,1730013183,ID +1730013184,1730014207,IN +1730015232,1730016255,MY +1730016256,1730017279,NZ +1730017280,1730017791,IN +1730017792,1730019327,PH +1730019328,1730020351,ID +1730020352,1730021375,HK +1730022400,1730023423,IN +1730023424,1730024447,HK +1730024448,1730025471,CN +1730025472,1730026495,HK +1730026496,1730027519,BD +1730027520,1730028543,SG +1730028544,1730029567,VN +1730029568,1730030591,HK +1730030592,1730031615,TW +1730031616,1730032639,HK +1730032640,1730033663,JP +1730033664,1730034687,ID +1730035712,1730036735,IN +1730036736,1730037759,HK +1730037760,1730038783,JP +1730038784,1730039807,HK +1730039808,1730040831,IN +1730040832,1730043903,ID +1730043904,1730044927,CN +1730044928,1730045951,HK +1730046976,1730047999,KR +1730048000,1730049023,TL +1730049024,1730050047,IN +1730050048,1730050303,AU +1730050304,1730050559,SG +1730050560,1730051071,ID +1730051072,1730052095,TH +1730052096,1730054143,TW +1730054144,1730055167,AF +1730055168,1730056191,IN +1730056192,1730057215,ID +1730057216,1730058239,CN +1730058240,1730059263,IN +1730059264,1730061311,KR +1730061312,1730062335,JP +1730062336,1730062591,AU +1730062592,1730062847,BD +1730062848,1730064383,ID +1730064384,1730065407,IN +1730065408,1730066431,ID +1730066432,1730067455,AU +1730067456,1730068479,BD +1730068480,1730069503,IN +1730069504,1730070527,KH +1730070528,1730071551,CN +1730071552,1730072575,KR +1730072576,1730073343,SG +1730073344,1730073599,HK +1730073856,1730074111,MY +1730074112,1730074367,AU +1730074368,1730074623,SG +1730074624,1730075647,AU +1730075648,1730076671,ID +1730076672,1730077695,IN +1730077696,1730078719,CN +1730078720,1730079743,HK +1730079744,1730080767,CN +1730080768,1730081791,HK +1730081792,1730082815,ID +1730082816,1730083839,PW +1730083840,1730084863,IN +1730084864,1730085887,CN +1730085888,1730086399,TW +1730086400,1730086911,US +1730087936,1730088959,JP +1730088960,1730091007,HK +1730091008,1730091519,SG +1730091520,1730091775,AU +1730091776,1730092031,MY +1730092032,1730093055,AU +1730093056,1730093567,ID +1730093568,1730094079,MY +1730094080,1730095103,ID +1730096128,1730097151,ID +1730097152,1730103295,CN +1730103296,1730104319,HK +1730104320,1730105343,JP +1730105344,1730106367,PK +1730106368,1730107391,MV +1730107392,1730108415,AU +1730108416,1730109439,PK +1730109440,1730110463,HK +1730110464,1730112511,PK +1730112512,1730112767,BD +1730112768,1730113535,ID +1730113536,1730114559,AU +1730115584,1730117631,VN +1730117632,1730118655,KH +1730118656,1730119679,ID +1730119680,1730120703,HK +1730120704,1730121727,JP +1730121728,1730122751,IN +1730122752,1730123775,CN +1730123776,1730124799,BD +1730124800,1730125823,ID +1730125824,1730126847,CN +1730126848,1730127871,ID +1730127872,1730128895,CN +1730128896,1730129919,SG +1730129920,1730130943,BD +1730130944,1730131967,KR +1730131968,1730132799,HK +1730132800,1730132831,RO +1730132832,1730132991,HK +1730132992,1730134015,IN +1730134016,1730135039,JP +1730135040,1730136063,TW +1730136064,1730137087,CN +1730137088,1730138111,ID +1730138112,1730139135,BD +1730139136,1730140159,IN +1730140160,1730141183,JP +1730141184,1730142207,HK +1730142208,1730143231,ID +1730143232,1730144255,SG +1730144256,1730145279,ID +1730145280,1730146303,CN +1730146304,1730147327,HK +1730147328,1730148351,JP +1730148352,1730149375,ID +1730149376,1730150399,JP +1730150400,1730360319,CN +1730360320,1730361343,IN +1730361344,1730362367,SG +1730362368,1730363391,JP +1730363392,1730364415,VN +1730364416,1730365439,IN +1730365440,1730367487,HK +1730367488,1730368511,AU +1730368512,1730369535,HK +1730369536,1730370047,NZ +1730370048,1730370303,IN +1730370304,1730370559,JP +1730370560,1730371583,AU +1730371584,1730372607,TH +1730372608,1730373631,IN +1730373632,1730374655,CN +1730374656,1730375679,BD +1730375680,1730376191,AU +1730376704,1730377727,CN +1730377728,1730378239,IN +1730378240,1730378495,HK +1730378496,1730378751,IN +1730378752,1730379775,US +1730379776,1730380799,AU +1730380800,1730381823,IN +1730381824,1730382847,MY +1730382848,1730383359,ID +1730383360,1730383615,IN +1730383616,1730383871,MY +1730383872,1730385919,HK +1730385920,1730386943,AU +1730386944,1730387967,BD +1730387968,1730388479,CA +1730388480,1730388735,MX +1730388736,1730388991,DE +1730388992,1730389503,IN +1730389504,1730390015,AF +1730390016,1730391039,BD +1730391040,1730392063,HK +1730392064,1730393087,AU +1730393088,1730393599,SG +1730393600,1730394111,CN +1730394112,1730395135,HK +1730395136,1730396159,JP +1730396160,1730398207,IN +1730398208,1730399231,CN +1730399232,1730400255,TW +1730400256,1730402303,PK +1730402560,1730402815,IN +1730402816,1730403071,ID +1730403072,1730403327,AU +1730403328,1730404351,CN +1730404352,1730406399,AU +1730406400,1730407423,IN +1730407424,1730408447,ID +1730408448,1730410495,IN +1730410496,1730411519,SG +1730411520,1730412543,HK +1730412544,1730414591,AU +1730414592,1730415615,ID +1730415616,1730416127,AU +1730416128,1730416639,ID +1730416640,1730417663,PH +1730417664,1730418687,CN +1730418688,1730419711,BD +1730419712,1730420735,CN +1730420736,1730421759,ID +1730421760,1730422783,CN +1730422784,1730423807,ID +1730423808,1730425855,IN +1730425856,1730426879,HK +1730426880,1730429951,CN +1730429952,1730430207,ID +1730430208,1730430463,AU +1730430464,1730430719,HK +1730430720,1730430975,IN +1730430976,1730431999,CN +1730432000,1730435071,IN +1730435072,1730436095,HK +1730436096,1730437119,SG +1730437120,1730438143,CN +1730438144,1730439167,BD +1730439168,1730440191,IN +1730440192,1730441215,NL +1730441216,1730442239,HK +1730442240,1730443263,TW +1730443264,1730445311,IN +1730445312,1730445567,NZ +1730445568,1730446335,AU +1730446336,1730448383,CN +1730448384,1730449407,JP +1730449408,1730450431,VU +1730450432,1730450687,AU +1730450688,1730450943,IN +1730450944,1730451455,PH +1730451456,1730451711,AU +1730451712,1730452479,HK +1730452480,1730453503,ID +1730453504,1730476031,CN +1730476032,1730476543,AU +1730476544,1730476799,NZ +1730476800,1730477055,IN +1730477056,1730478079,AU +1730478080,1730479103,CN +1730480128,1730480639,AU +1730480640,1730481151,JP +1730481152,1730483199,CN +1730483200,1730483711,IN +1730484224,1730485247,CN +1730485248,1730487295,VN +1730487296,1730488319,TW +1730488320,1730489343,HK +1730489344,1730490367,CN +1730490368,1730491391,PH +1730491392,1730493439,CN +1730493440,1730494463,HK +1730494464,1730495487,JP +1730495488,1730496511,AU +1730496512,1730497535,CN +1730497536,1730499583,IN +1730499584,1730500607,HK +1730501632,1730502655,JP +1730503424,1730503679,AU +1730503680,1730505727,CN +1730505728,1730508799,JP +1730508800,1730509823,AU +1730509824,1730510591,CN +1730510592,1730510847,HK +1730510848,1730511871,AU +1730511872,1730512895,JP +1730512896,1730521087,CN +1730521088,1730522111,ID +1730522112,1730524159,CN +1730524160,1730525183,IN +1730526208,1730527231,CN +1730527232,1730528255,HK +1730528256,1730529279,SG +1730529280,1730529791,IN +1730530304,1730531327,NZ +1730531328,1730535423,CN +1730535424,1730536447,ID +1730536448,1730536703,AU +1730536704,1730537471,ID +1730537472,1730538495,HK +1730538496,1730540543,JP +1730540544,1730541567,ID +1730541568,1730544639,CN +1730544640,1730545919,IN +1730545920,1730546687,AU +1730546688,1730547711,IN +1730547712,1730548735,BD +1730548736,1730549247,MY +1730549248,1730549759,ID +1730549760,1730550783,KR +1730550784,1730551807,HK +1730551808,1730552831,CN +1730552832,1730553855,IN +1730553856,1730555903,CN +1730555904,1730556927,IN +1730557952,1730558975,CN +1730558976,1730559999,MY +1730560000,1730561023,HK +1730561024,1730562047,IN +1730562048,1730563071,SG +1730563072,1730564095,CN +1730564096,1730565119,HK +1730565120,1730566143,CN +1730566144,1730566655,IN +1730566656,1730567167,HK +1730567168,1730569215,CN +1730569216,1730570239,ID +1730570240,1730571263,HK +1730572288,1730573311,KH +1730573312,1730574335,CN +1730574336,1730575359,AU +1730575360,1730577407,IN +1730577408,1730578431,CN +1730578432,1730579455,VN +1730579456,1730580479,CN +1730580480,1730580735,HK +1730580736,1730580991,AU +1730580992,1730581503,TW +1730581504,1730582015,AU +1730582016,1730582271,IN +1730582272,1730582527,PH +1730582528,1730585599,HK +1730585600,1730586623,NZ +1730586624,1730587647,HK +1730587648,1730588671,PH +1730588672,1730589695,IN +1730590720,1730591743,SG +1730591744,1730591999,PH +1730592000,1730592767,IN +1730592768,1730593791,MY +1730593792,1730594815,NP +1730594816,1730596863,IN +1730597888,1730598911,PH +1730599424,1730599935,VU +1730599936,1730605055,CN +1730605056,1730607103,IN +1730608128,1730609151,CN +1730609152,1730610687,IN +1730610688,1730610943,MY +1730610944,1730611199,SG +1730611200,1730612223,IN +1730612224,1730613247,ID +1730613248,1730614271,CN +1730614272,1730615295,NZ +1730615296,1730616319,HK +1730616320,1730617343,IN +1730618368,1730619391,KR +1730619392,1730619903,TW +1730619904,1730620415,SG +1730620416,1730621439,NZ +1730621440,1730622719,ID +1730622720,1730622975,AU +1730622976,1730623231,IN +1730623232,1730623487,AU +1730623488,1730624511,HK +1730624512,1730625535,AU +1730625536,1730626559,CN +1730628608,1730629631,HK +1730629632,1730630655,PK +1730630656,1730631679,AU +1730631680,1730632703,CN +1730632704,1730634751,VN +1730634752,1730637823,CN +1730637824,1730638079,AU +1730638080,1730638335,JP +1730638336,1730638847,NZ +1730638848,1730639871,IN +1730640384,1730640895,MY +1730641920,1730643967,IN +1730643968,1730644735,AU +1730644736,1730644991,IN +1730644992,1730646015,MY +1730647040,1730649087,HK +1730649088,1730650111,IN +1730650112,1730658303,CN +1730658304,1730659327,JP +1730660352,1730669567,CN +1730669568,1730670079,IN +1730670080,1730670591,AU +1730670592,1730672639,IN +1730672640,1730673407,AU +1730673408,1730673663,IN +1730673664,1730674687,FM +1730674688,1730675711,AU +1730675712,1730677759,HK +1730677760,1730686975,CN +1730686976,1730687999,IN +1730688512,1730689023,ID +1730689024,1730692095,IN +1730692096,1730692607,ID +1730692608,1730693119,AU +1730693120,1730694143,IN +1730694144,1730695167,BD +1730695168,1730695423,IN +1730695424,1730695679,NZ +1730695680,1730696191,BD +1730696192,1730697215,HK +1730697216,1730698239,CN +1730698240,1730699263,ID +1730699264,1730700287,JP +1730700288,1730701311,CN +1730701312,1730702335,JP +1730702336,1730702591,ID +1730702592,1730702847,AU +1730702848,1730703359,HK +1730703360,1730704383,CN +1730704384,1730705407,TH +1730705408,1730706431,ID +1730706432,1730708479,JP +1730708480,1730713599,TH +1730713600,1730714623,HK +1730715648,1730716671,HK +1730716672,1730717183,PH +1730717696,1730718719,IN +1730718720,1730720767,HK +1730720768,1730723839,TH +1730723840,1730724863,CN +1730724864,1730727935,IN +1730727936,1730728959,HK +1730728960,1730729983,CN +1730729984,1730731007,JP +1730731008,1730732031,CN +1730732032,1730732287,AU +1730732288,1730732543,HK +1730732544,1730733055,BD +1730733056,1730741247,CN +1730741248,1730742271,HK +1730742272,1730742783,AF +1730742784,1730743295,IN +1730743296,1730744319,SG +1730744320,1730745343,CN +1730745344,1730752511,IN +1730752512,1730753535,HK +1730753536,1730754559,CN +1730754560,1730755071,IN +1730755072,1730755583,TH +1730755584,1730756607,JP +1730756608,1730757631,HK +1730757632,1730758655,SG +1730760704,1730761727,HK +1730761728,1730762751,TH +1730762752,1730766847,IN +1730766848,1730767871,HK +1730767872,1730768127,AU +1730768128,1730768639,ID +1730768640,1730768895,BD +1730769920,1730770943,HK +1730770944,1730771967,ID +1730771968,1730772991,HK +1730772992,1730774015,SG +1730774016,1730775039,HK +1730775040,1730776063,JP +1730776064,1730777087,CN +1730777088,1730778111,IN +1730778112,1730780159,CN +1730780160,1730781183,AU +1730781184,1730783231,CN +1730783232,1730783487,IN +1730783488,1730783743,ID +1730783744,1730783999,IN +1730784000,1730784255,ID +1730784256,1730785279,HK +1730785280,1730785535,NL +1730785536,1730786303,AU +1730786304,1730787583,HK +1730787584,1730788351,CN +1730788352,1730790399,ID +1730790400,1730791423,IN +1730791424,1730794495,ID +1730794496,1730795007,BD +1730795008,1730795519,IN +1730795520,1730796543,AU +1730796544,1730800639,CN +1730800640,1730801663,IN +1730801664,1730802687,JP +1730802688,1730803199,BD +1730803200,1730803711,ID +1730804736,1730805759,JP +1730805760,1730806783,AF +1730807808,1730808831,CN +1730808832,1730809855,HK +1730809856,1730810367,IN +1730810624,1730811903,AU +1730811904,1730814975,CN +1730814976,1730815999,HK +1730816000,1730817023,ID +1730817024,1730818047,JP +1730818048,1730818559,AU +1730818816,1730819071,IN +1730820096,1730821119,VN +1730822144,1730824191,CN +1730824192,1730825215,IN +1730825216,1730826239,CN +1730826240,1730827263,JP +1730827264,1730829311,IN +1730829312,1730831359,PH +1730831360,1730832383,HK +1730832384,1730833407,CN +1730833408,1730834431,AU +1730834432,1730834943,TW +1730834944,1730835455,IN +1730835456,1730837503,ID +1730837504,1730838527,IN +1730839552,1730840575,AU +1730840576,1730841599,PH +1730841600,1730842623,AU +1730842624,1730844671,TW +1730844672,1730845695,BD +1730845696,1730847743,IN +1730848768,1730849791,JP +1730849792,1730850815,IN +1730850816,1730851839,HK +1730851840,1730852863,CN +1730852864,1730853887,KR +1730853888,1730854143,IN +1730854144,1730854399,AU +1730854400,1730854655,NZ +1730854656,1730854911,HK +1730854912,1730856959,IN +1730857984,1730858239,AU +1730858240,1730858495,ID +1730858496,1730859007,IN +1730859008,1730860031,BN +1730860032,1730861055,HK +1730861056,1730862079,MM +1730863104,1730864127,AU +1730865152,1730866175,CN +1730866176,1730867199,AU +1730869248,1730870271,IN +1730870272,1730871807,ID +1730871808,1730873343,IN +1730873344,1730875391,HK +1730875392,1730876415,CN +1730876416,1730877439,HK +1730878464,1730879487,HK +1730879488,1730881023,IN +1730881024,1730881535,AU +1730881536,1730882559,IN +1730882560,1730883583,ID +1730883584,1730884607,TW +1730884608,1730885631,BD +1730885632,1730886655,AU +1730886656,1730887679,HK +1730887680,1730887935,KR +1730887936,1730888191,IN +1730888192,1730888703,ID +1730888704,1730889727,HK +1730889728,1730890751,AU +1730890752,1730891775,LA +1730891776,1730892799,IN +1730892800,1730893823,CN +1730893824,1730895103,AU +1730895104,1730895359,BD +1730895360,1730895871,NL +1730895872,1730898943,CN +1730898944,1730899967,MO +1730899968,1730900991,IN +1730900992,1730901247,AU +1730901248,1730901503,SG +1730901504,1730901759,DE +1730901760,1730902015,AU +1730902016,1730903039,KR +1730903040,1730904063,CN +1730904064,1730905087,ID +1730905088,1730906111,HK +1730906112,1730906367,TH +1730906368,1730907135,AU +1730907136,1730908159,JP +1730908160,1730909183,PG +1730909184,1730910207,BD +1730910208,1730911231,IN +1730911232,1730912255,NC +1730912256,1730913279,IN +1730914304,1730915327,NP +1730915328,1730916351,HK +1730916352,1730918399,AU +1730918400,1730919423,CN +1730919424,1730920447,SG +1730920448,1730922495,CN +1730922496,1730923519,IN +1730923520,1730924031,NF +1730924032,1730924543,NZ +1730924544,1730925567,CN +1730925568,1730926591,NZ +1730926592,1730927615,HK +1730927616,1730929663,CN +1730929664,1730929919,IN +1730929920,1730930175,TH +1730930176,1730930431,BD +1730930432,1730930687,IN +1730930688,1730931711,CN +1730931712,1730932735,HK +1730932736,1730933759,CN +1730933760,1730934783,HK +1730934784,1730936063,IN +1730936064,1730936831,AU +1730936832,1730937855,IN +1730937856,1730938879,SG +1730939904,1730940927,IN +1730940928,1730941439,JP +1730941440,1730941695,IN +1730941952,1730942975,HK +1730942976,1730943487,AU +1730943488,1730943999,ID +1730944000,1730945023,HK +1730945024,1730946047,AU +1730946048,1730947071,ID +1730947072,1730948095,AU +1730948096,1730948351,TH +1730948352,1730948607,NZ +1730948608,1730949119,AU +1730949120,1730951167,IN +1730951168,1730952191,CN +1730952192,1730954239,HK +1730954240,1730955263,SG +1730955264,1730956031,BD +1730956032,1730956287,NL +1730956288,1730957311,BD +1730957312,1730958335,CN +1730958336,1730959359,JP +1730959360,1730960383,CN +1730960384,1730961407,AU +1730961408,1730962431,IN +1730962432,1730962687,ID +1730962688,1730962943,AU +1730962944,1730963199,JP +1730963200,1730963455,HK +1730963456,1730964479,IN +1730964480,1730964735,MY +1730964736,1730964991,HK +1730964992,1730965503,NZ +1730965504,1730966527,SG +1730966528,1730967551,IN +1730967552,1730969599,CN +1730969600,1730970623,JP +1730970624,1730971647,CN +1730971648,1730973695,IN +1730973696,1730974719,CN +1730974720,1730974975,AU +1730974976,1730975231,ID +1730975232,1730975743,BD +1730976768,1730977791,IN +1730977792,1730978815,HK +1730978816,1730979839,NZ +1730979840,1730980863,CN +1730980864,1730981887,IN +1730981888,1730990079,CN +1730990080,1730992127,JP +1730992128,1730993151,TH +1730993152,1730993407,SG +1730993408,1730993663,IN +1730993664,1730993919,NZ +1730993920,1730994175,PK +1730994176,1730995199,CN +1730995200,1730996223,AU +1730996224,1730997247,PH +1730997248,1731018751,CN +1731018752,1731020799,HK +1731020800,1731060735,CN +1731060736,1731063807,VN +1731063808,1731064831,NZ +1731064832,1731065855,JP +1731065856,1731066879,CN +1731066880,1731067391,PH +1731067392,1731067903,AU +1731067904,1731103743,CN +1731103744,1731103871,TH +1731103872,1731103999,FR +1731104000,1731104127,KR +1731104128,1731104255,JP +1731104256,1731104511,CN +1731104512,1731104639,MY +1731104640,1731104767,SG +1731104768,1731105791,TW +1731105792,1731106815,BD +1731106816,1731115007,CN +1731115008,1731116031,HK +1731116032,1731117055,TW +1731117056,1731118847,IN +1731118848,1731119103,AU +1731119104,1731120127,IN +1731120128,1731121151,JP +1731121152,1731122175,AF +1731122176,1731123199,AU +1731123200,1731124223,PF +1731124224,1731125247,AU +1731125248,1731126271,HK +1731126272,1731127039,AU +1731127040,1731127295,NZ +1731127296,1731130367,IN +1731130368,1731132415,CN +1731132416,1731133951,AU +1731133952,1731134207,JP +1731134208,1731134463,NZ +1731134464,1731135487,CN +1731136512,1731138559,IN +1731138560,1731139583,CN +1731139584,1731140607,HK +1731140608,1731141631,SG +1731141632,1731142655,IN +1731142656,1731144703,CN +1731144704,1731145727,IN +1731145728,1731146751,CN +1731146752,1731148799,IN +1731148800,1731149055,ID +1731149056,1731149311,HK +1731149312,1731149823,US +1731149824,1731152895,IN +1731152896,1731153407,SG +1731153408,1731153919,IN +1731153920,1731154943,CN +1731154944,1731155967,TH +1731155968,1731156479,HK +1731156480,1731158015,IN +1731158016,1731159039,CN +1731159040,1731160063,JP +1731160064,1731161087,IN +1731161088,1731162111,CN +1731162112,1731163135,HK +1731163136,1731165183,CN +1731165184,1731166207,IN +1731167232,1731168255,ID +1731168256,1731170303,CN +1731170304,1731170559,AU +1731170560,1731170687,HK +1731170688,1731170815,MY +1731170816,1731171071,AU +1731171072,1731171327,HK +1731171328,1731172863,IN +1731172864,1731173119,MY +1731173120,1731173375,SG +1731173376,1731178495,IN +1731178496,1731179519,HK +1731179520,1731180543,JP +1731180544,1731181055,MM +1731181056,1731181311,IN +1731181312,1731181567,AU +1731181568,1731182591,KH +1731182592,1731183615,VN +1731183616,1731184639,IN +1731184640,1731185663,JP +1731185664,1731186687,US +1731186688,1731187711,SG +1731187712,1731188735,CN +1731188736,1731189759,IN +1731189760,1731190783,HK +1731190784,1731191807,SG +1731191808,1731192831,ID +1731192832,1731193087,SG +1731193088,1731193855,AU +1731193856,1731194879,IN +1731194880,1731196159,SG +1731196160,1731196927,AU +1731196928,1731197951,HK +1731197952,1731199999,MY +1731200000,1731201023,HK +1731201024,1731202047,NZ +1731202048,1731202303,TH +1731202304,1731202559,ID +1731202560,1731203071,AU +1731203072,1731204095,BD +1731204096,1731205119,CN +1731205120,1731205631,PK +1731205632,1731205887,HK +1731205888,1731206143,ID +1731206144,1731206655,HK +1731206656,1731206911,PH +1731206912,1731207167,JP +1731207168,1731208191,IN +1731208192,1731209215,JP +1731210240,1731211263,IN +1731211264,1731211775,HK +1731211776,1731212287,IN +1731212288,1731213311,CN +1731213312,1731218431,IN +1731218432,1731221503,VN +1731221504,1731221759,NP +1731221760,1731222015,AU +1731222016,1731222527,IN +1731222528,1731223551,CN +1731223552,1731228671,IN +1731228672,1731228927,MN +1731228928,1731229183,AU +1731229184,1731229439,NZ +1731229440,1731229695,BD +1731229696,1731230719,JP +1731230720,1731231743,IN +1731231744,1731232767,ID +1731232768,1731233791,HK +1731233792,1731234815,JP +1731234816,1731235839,HK +1731235840,1731239935,CN +1731240960,1731241983,JP +1731241984,1731243007,HK +1731243008,1731244031,SG +1731244032,1731245055,GB +1731245056,1731247103,IN +1731247104,1731249151,VN +1731249152,1731250175,IN +1731250432,1731250687,AU +1731250688,1731251199,CN +1731251200,1731252223,TH +1731252224,1731253247,AU +1731253248,1731253759,IN +1731253760,1731254271,AU +1731254272,1731262463,CN +1731262464,1731263487,JP +1731263488,1731264511,IN +1731264512,1731265535,JP +1731265536,1731266559,AU +1731266560,1731267583,HK +1731267584,1731268607,CN +1731268608,1731269631,AU +1731269632,1731270655,CN +1731270656,1731271679,MY +1731271680,1731272703,ID +1731272704,1731273727,SG +1731273728,1731273983,PH +1731273984,1731274239,ID +1731274240,1731274751,AU +1731274752,1731275775,KH +1731275776,1731276799,KR +1731276800,1731279871,IN +1731279872,1731280895,HK +1731280896,1731281919,TH +1731281920,1731282175,IN +1731282176,1731282431,PK +1731282432,1731282943,PH +1731282944,1731284991,CN +1731284992,1731286015,AU +1731286016,1731288063,JP +1731288064,1731290111,CN +1731290112,1731291135,PH +1731291136,1731291647,ID +1731291648,1731292159,AU +1731292160,1731293183,CN +1731293184,1731294207,SG +1731294208,1731296255,IN +1731296768,1731297023,HK +1731297024,1731297279,AU +1731297280,1731298303,CN +1731298304,1731299327,HK +1731299328,1731300351,PK +1731300352,1731301375,JP +1731301376,1731302143,AU +1731302144,1731302399,IN +1731302400,1731302911,TH +1731302912,1731303167,NZ +1731303168,1731303423,AU +1731303424,1731304447,IN +1731304448,1731306495,HK +1731306496,1731307519,SG +1731307520,1731308543,BD +1731308544,1731308799,NZ +1731308800,1731309567,NR +1731309568,1731311615,CN +1731311616,1731314687,ID +1731314688,1731315711,CN +1731315712,1731316735,BD +1731316736,1731316991,IN +1731316992,1731317247,NZ +1731317248,1731317503,IN +1731317504,1731317759,PG +1731317760,1731319807,HK +1731319808,1731320831,JP +1731320832,1731321855,ID +1731321856,1731322879,IN +1731322880,1731323903,ID +1731323904,1731324927,IN +1731325952,1731327487,IN +1731327488,1731327999,HK +1731328000,1731329023,CN +1731329024,1731330047,IN +1731330048,1731331071,SG +1731331072,1731332095,IN +1731332096,1731333119,HK +1731333120,1731333631,AU +1731333632,1731334143,SG +1731334144,1731335167,HK +1731336192,1731337215,ID +1731337216,1731338239,JP +1731338240,1731338751,IN +1731338752,1731339263,AU +1731339264,1731340287,CN +1731340288,1731341311,KR +1731341312,1731349503,CN +1731349504,1731351551,IN +1731351552,1731352575,JP +1731352576,1731353599,HK +1731353600,1731354623,SG +1731354624,1731355647,HK +1731355648,1731356671,AU +1731356672,1731357695,MV +1731357696,1731362815,CN +1731362816,1731363839,ID +1731363840,1731366911,CN +1731366912,1731369983,IN +1731369984,1731371007,PK +1731371008,1731372031,IN +1731372032,1731373055,MY +1731373056,1731374079,BD +1731374080,1731382271,CN +1731382272,1731383295,MN +1731383296,1731385343,IN +1731385344,1731386111,ID +1731386112,1731386367,IN +1731386368,1731394559,CN +1731394560,1731395583,HK +1731395584,1731396095,IN +1731396096,1731396607,BD +1731396608,1731397631,JP +1731397632,1731398143,IN +1731398144,1731398655,TH +1731398656,1731399679,CN +1731399680,1731400703,NP +1731400704,1731404799,IN +1731404800,1731405823,JP +1731405824,1731406079,AU +1731406080,1731406335,MY +1731406336,1731406591,AU +1731406592,1731406847,MY +1731406848,1731407871,ID +1731407872,1731408895,MY +1731408896,1731410943,IN +1731410944,1731411199,MN +1731411200,1731411455,AU +1731411456,1731411711,SG +1731411968,1731412991,TH +1731412992,1731414015,AU +1731414016,1731416063,IN +1731416064,1731417087,JP +1731418112,1731421183,IN +1731421184,1731421695,NZ +1731421696,1731421951,IN +1731421952,1731422207,ID +1731422208,1731424255,BD +1731424256,1731425279,AU +1731425280,1731426303,IN +1731427328,1731428351,KH +1731428352,1731428607,IN +1731428864,1731429119,AU +1731429120,1731429375,ID +1731429376,1731431423,IN +1731431424,1731431935,TR +1731431936,1731432191,HK +1731432192,1731432447,TR +1731432448,1731433471,HK +1731433472,1731435519,IN +1731435520,1731436031,NZ +1731436032,1731436287,ID +1731436288,1731436543,AU +1731436544,1731437567,SG +1731437568,1731438591,ID +1731438592,1731441663,KR +1731441664,1731442687,JP +1731442688,1731448831,KR +1731448832,1731449855,IN +1731449856,1731450879,JP +1731450880,1731451903,IN +1731451904,1731452159,PK +1731452160,1731452415,AU +1731452416,1731452927,IN +1731452928,1731453951,TH +1731453952,1731454975,BD +1731454976,1731457023,IN +1731457024,1731461119,KR +1731461120,1731461375,IN +1731461376,1731461631,AU +1731461632,1731462143,ID +1731462912,1731463167,ID +1731463168,1731464191,IN +1731464192,1731465215,MM +1731465216,1731466239,ID +1731466240,1731467263,JP +1731467264,1731469311,NP +1731469312,1731470335,SG +1731470336,1731471359,IN +1731471360,1731472383,CN +1731472384,1731473407,ID +1731473408,1731475455,IN +1731475456,1731476479,MY +1731476480,1731476991,ID +1731476992,1731477247,PH +1731477248,1731477503,AU +1731477504,1731479551,ID +1731479552,1731483647,CN +1731483648,1731484671,FJ +1731484672,1731485695,VN +1731485696,1731488767,CN +1731488768,1731489791,JP +1731489792,1731490559,HK +1731490560,1731490815,TW +1731490816,1731491839,AU +1731491840,1731492863,ID +1731492864,1731493887,IN +1731493888,1731495167,JP +1731495424,1731495935,BD +1731495936,1731496959,IN +1731496960,1731497983,BD +1731497984,1731499007,ID +1731499008,1731500031,JP +1731500032,1731501055,HK +1731501056,1731502079,NZ +1731502080,1731504127,CN +1731504128,1731504639,AU +1731504640,1731505151,ID +1731505152,1731507199,CN +1731507200,1731508223,IN +1731508224,1731509247,CN +1731509248,1731510271,HK +1731510272,1731510527,MY +1731510528,1731510783,AU +1731510784,1731511039,IN +1731511040,1731511295,US +1731511296,1731512319,CN +1731512320,1731513343,KR +1731513344,1731514367,NZ +1731514368,1731515391,IN +1731515392,1731515647,AU +1731515648,1731515903,ID +1731515904,1731516159,HK +1731516160,1731516415,US +1731516416,1731517439,HK +1731517440,1731519487,IN +1731519488,1731520511,MM +1731520512,1731523583,JP +1731523584,1731526655,IN +1731526656,1731527679,ID +1731527680,1731528703,CN +1731528704,1731529727,HK +1731529728,1731530751,JP +1731530752,1731531775,AF +1731531776,1731532031,ID +1731532032,1731532287,IN +1731532288,1731532799,NZ +1731532800,1731533823,AF +1731534848,1731535871,MY +1731535872,1731536895,BD +1731536896,1731537919,IN +1731537920,1731538943,PK +1731538944,1731539967,HK +1731539968,1731540991,IN +1731540992,1731542015,PH +1731542016,1731543039,IN +1731543040,1731545087,CN +1731545088,1731546111,IN +1731546112,1731547135,ID +1731547136,1731548159,IN +1731548160,1731548671,BD +1731548672,1731549183,IN +1731549184,1731550207,VN +1731550208,1731551231,CN +1731551232,1731552255,JP +1731552256,1731553279,CN +1731553280,1731555839,IN +1731555840,1731556095,KR +1731556096,1731557375,AU +1731557376,1731558399,JP +1731558400,1731564543,CN +1731564544,1731565567,NZ +1731565568,1731565600,HK +1731565601,1731565605,JP +1731565606,1731565611,HK +1731565612,1731565613,JP +1731565614,1731566079,HK +1731566080,1731566591,PH +1731567616,1731568639,CN +1731568640,1731569663,IN +1731569664,1731570687,VN +1731570688,1731571711,SG +1731571712,1731572735,PG +1731572736,1731573759,CN +1731573760,1731574271,ID +1731574272,1731574527,MY +1731574528,1731574783,AU +1731574784,1731576831,ID +1731576832,1731577087,AU +1731577088,1731577599,SG +1731577600,1731577855,HK +1731577856,1731578879,AU +1731578880,1731582975,CN +1731582976,1731583999,PH +1731584000,1731585023,HK +1731585024,1731586047,VN +1731586048,1731587071,IN +1731587072,1731588095,CN +1731588096,1731590143,IN +1731590144,1731591167,CN +1731591168,1731592191,VN +1731592192,1731593215,ID +1731593216,1731594239,HK +1731594240,1731595263,CN +1731595264,1731601407,IN +1731601408,1731603455,BD +1731603456,1731604479,HK +1731604480,1731605503,CN +1731605504,1731606527,MY +1731606528,1731607551,JP +1731607552,1731608575,CN +1731608576,1731609599,IN +1731609600,1731610623,AU +1731610624,1731611647,KR +1731613696,1731614719,PH +1731614720,1731615743,JP +1731615744,1731616767,ID +1731616768,1731620351,IN +1731620352,1731620607,MY +1731620608,1731620863,AU +1731620864,1731621887,KH +1731621888,1731625983,HK +1731625984,1731626495,AU +1731626496,1731626751,ID +1731626752,1731628543,IN +1731628544,1731628799,PH +1731628800,1731630079,IN +1731630080,1731631103,BD +1731631104,1731632127,SG +1731632128,1731633151,JP +1731633152,1731635199,CN +1731635200,1731636223,IN +1731636224,1731636479,ID +1731636480,1731637247,IN +1731638272,1731639295,IN +1731639296,1731640319,JP +1731640320,1731641343,IN +1731641344,1731642367,HK +1731642368,1731644415,IN +1731644416,1731646463,JP +1731646464,1731647487,CN +1731647488,1731648511,ID +1731648512,1731649535,IN +1731649536,1731649791,NZ +1731649792,1731650559,ID +1731650560,1731651583,CN +1731651584,1731652607,AU +1731652608,1731653119,IN +1731653120,1731653631,AU +1731653632,1731654655,CN +1731654656,1731655679,IN +1731655680,1731657727,VN +1731657728,1731658751,TH +1731658752,1731659775,JP +1731659776,1731660031,HK +1731660032,1731660287,ID +1731660288,1731660543,MY +1731660544,1731660799,SG +1731660800,1731661823,JP +1731661824,1731662847,AU +1731663872,1731665919,HK +1731665920,1731666175,AU +1731666176,1731666431,ID +1731666432,1731666687,AU +1731666688,1731666943,KR +1731666944,1731667967,ID +1731667968,1731668991,IN +1731668992,1731669786,AU +1731669787,1731669787,GS +1731669788,1731669927,AU +1731669928,1731669928,CC +1731669929,1731670015,AU +1731670016,1731671039,TL +1731671040,1731671551,AU +1731671552,1731672063,TH +1731672064,1731672575,ID +1731672576,1731672831,AU +1731672832,1731673087,TH +1731673088,1731675135,IN +1731675136,1731676159,PK +1731676160,1731677183,IN +1731677184,1731678207,AU +1731678208,1731679231,CN +1731679232,1731681279,IN +1731681280,1731682303,AU +1731682304,1731686399,IN +1731686400,1731686911,HK +1731686912,1731688447,AU +1731688448,1731689471,CN +1731689472,1731690495,SG +1731690496,1731691519,HK +1731691520,1731691775,AU +1731691776,1731692031,PK +1731692032,1731692543,AU +1731692544,1731693055,PK +1731693056,1731693311,SG +1731693312,1731693567,ID +1731693568,1731694591,TH +1731694592,1731695615,BD +1731695616,1731696639,AU +1731696640,1731697663,CN +1731697664,1731698687,JP +1731698688,1731698943,ID +1731698944,1731699199,PH +1731699200,1731699711,AU +1731699712,1731701759,IN +1731701760,1731702783,CN +1731702784,1731703295,AU +1731703552,1731703807,NZ +1731703808,1731705855,IN +1731705856,1731706879,KR +1731706880,1731708927,JP +1731708928,1731709951,HK +1731709952,1731711999,CN +1731712000,1731712255,AU +1731712256,1731713023,IN +1731713024,1731713279,ID +1731713280,1731713535,AU +1731713536,1731713791,HK +1731713792,1731714047,AU +1731714048,1731715071,ID +1731716096,1731717119,CN +1731717120,1731718143,AU +1731718144,1731720191,CN +1731720192,1731721215,IN +1731722240,1731723263,IN +1731723264,1731724287,AU +1731724288,1731725311,BD +1731725312,1731726335,CN +1731726336,1731727359,AU +1731727360,1731729407,CN +1731729408,1731730431,HK +1731730432,1731731199,IN +1731731200,1731731455,AU +1731731456,1731732479,CN +1731732480,1731734527,IN +1731734528,1731735551,HK +1731735552,1731736575,JP +1731736576,1731737599,HK +1731737600,1731739647,CN +1731739648,1731741183,IN +1731741184,1731741439,ID +1731741440,1731741695,AU +1731741696,1731743743,CN +1731743744,1731747839,IN +1731747840,1731748863,JP +1731748864,1731750911,HK +1731750912,1731751935,JP +1731751936,1731753983,HK +1731753984,1731755007,IN +1731755008,1731756031,SG +1731756032,1731757055,PH +1731757056,1731758079,JP +1731758080,1731759103,HK +1731759104,1731760127,CN +1731760128,1731761663,ID +1731761664,1731762175,AU +1731762176,1731763199,CN +1731763200,1731767295,VN +1731767296,1731767807,IN +1731767808,1731768063,KH +1731768064,1731770367,IN +1731770368,1731771391,CN +1731771392,1731772415,ID +1731772416,1731773439,HK +1731773440,1731774463,IN +1731774464,1731775487,CN +1731775488,1731776511,ID +1731776512,1731777023,BD +1731777024,1731777535,IN +1731777536,1731778559,JP +1731778560,1731779071,HK +1731779072,1731779583,JP +1731779584,1731782655,IN +1731782656,1731783679,ID +1731783680,1731788799,IN +1731788800,1731789823,AU +1731789824,1731790847,JP +1731790848,1731791871,ID +1731791872,1731792895,CN +1731792896,1731793919,IN +1731793920,1731794943,BD +1731794944,1731795967,HK +1731795968,1731796991,JP +1731796992,1731798015,AU +1731798016,1731799039,ID +1731799040,1731800063,BD +1731800064,1731802111,JP +1731802112,1731804159,CN +1731804160,1731805183,KR +1731806208,1731806463,AU +1731806464,1731807231,IN +1731807232,1731807743,SG +1731807744,1731807999,SE +1731808000,1731808255,DK +1731808256,1731809279,CN +1731809280,1731811583,IN +1731811584,1731811839,AU +1731811840,1731812095,HK +1731812096,1731812351,AU +1731812352,1731813375,MN +1731814400,1731815423,JP +1731815424,1731816447,VN +1731816448,1731817471,HK +1731817472,1731818495,VN +1731818496,1731820543,BD +1731820544,1731821567,IN +1731822592,1731823615,IN +1731823616,1731824639,CN +1731824640,1731825663,IN +1731825664,1731826687,JP +1731826688,1731827199,AU +1731827200,1731827455,IN +1731827456,1731827711,BD +1731827712,1731828735,PK +1731828736,1731829759,SG +1731829760,1731830783,IN +1731830784,1731831039,SG +1731831040,1731831807,AU +1731831808,1731832831,PK +1731832832,1731836927,IN +1731836928,1731837439,MY +1731837440,1731837951,SG +1731837952,1731838975,ID +1731838976,1731839999,CN +1731840000,1731841023,HK +1731841024,1731842047,NP +1731842048,1731843071,VN +1731843072,1731845119,IN +1731845120,1731846143,VN +1731846656,1731846911,IN +1731846912,1731847167,PH +1731847168,1731848191,HK +1731848192,1731849215,MP +1731849216,1731858431,IN +1731858432,1731859455,MY +1731859456,1731860479,FJ +1731860480,1731861503,CN +1731861504,1731862527,IN +1731862528,1731862783,AU +1731862784,1731863039,ID +1731863040,1731863551,AU +1731863552,1731871743,IN +1731871744,1731872767,JP +1731872768,1731873791,BD +1731873792,1731877887,IN +1731877888,1731878911,BD +1731878912,1731879935,IN +1731879936,1731881983,ID +1731881984,1731882495,BD +1731882496,1731882751,SG +1731882752,1731883007,ID +1731883008,1731883263,SG +1731883264,1731883519,MY +1731883520,1731891199,IN +1731891200,1731891711,NP +1731891712,1731892223,ID +1731892224,1731893247,TH +1731893248,1731895295,IN +1731895296,1731896319,ID +1731896320,1731899391,IN +1731899392,1731900415,HK +1731900416,1731900671,IN +1731900928,1731901439,CN +1731901440,1731903487,IN +1731903488,1731904511,AU +1731905536,1731908607,IN +1731908608,1731908863,AU +1731908864,1731909631,NZ +1731909632,1731911679,AU +1731911680,1731912703,KH +1731912704,1731913727,NZ +1731913728,1731913983,AU +1731913984,1731928063,IN +1731928064,1731929087,JP +1731929088,1731930111,BD +1731930112,1731933183,HK +1731933184,1731934207,LA +1731934208,1731939327,IN +1731939328,1731940351,CN +1731940352,1731942655,IN +1731942656,1731942911,JP +1731942912,1731943423,HK +1731943424,1731944258,KR +1731944259,1731944259,CH +1731944260,1731944302,KR +1731944303,1731944303,CH +1731944304,1731944447,KR +1731944448,1731945471,IN +1731945472,1731946495,CN +1731946496,1731947519,IN +1731947520,1731948543,AU +1731948544,1731953663,CN +1731953664,1731954687,IN +1731954688,1731955711,JP +1731955712,1731956735,IN +1731956736,1731957759,HK +1731957760,1731958783,CN +1731958784,1731959807,IN +1731959808,1731960831,KR +1731961856,1731962879,CN +1731962880,1731963903,BD +1731963904,1731964927,KH +1731964928,1731965951,BD +1731965952,1731966463,IN +1731966464,1731966975,AU +1731966976,1731975167,IN +1731976192,1731977215,TW +1731977216,1731979519,IN +1731979520,1731979775,BD +1731979776,1731980287,ID +1731980288,1731986431,IN +1731987456,1731987711,HK +1731987712,1731987967,ID +1731987968,1731988479,SG +1731988480,1731989503,US +1731989504,1731990527,VN +1731990528,1731990783,AU +1731990784,1731991039,IN +1731991040,1731991551,AU +1731991552,1731992575,MY +1731992576,1731993599,IN +1731993600,1731994623,CN +1731994624,1731995647,JP +1731995648,1731996671,IN +1731996672,1731997695,CN +1731997696,1731999743,IN +1731999744,1732000767,HK +1732000768,1732001791,SG +1732001792,1732002815,HK +1732002816,1732007935,IN +1732009984,1732010239,AU +1732010240,1732010495,MN +1732010496,1732010751,AU +1732010752,1732011007,NZ +1732011008,1732012287,IN +1732012288,1732013055,AU +1732013056,1732014079,HK +1732014080,1732016127,IN +1732016128,1732018175,KR +1732018176,1732019199,IN +1732019200,1732019967,AU +1732019968,1732022271,IN +1732022272,1732024319,HK +1732024320,1732025343,AU +1732025344,1732026367,IN +1732026368,1732027391,BD +1732027392,1732028415,CN +1732028416,1732029439,PH +1732029440,1732030463,BD +1732030464,1732031487,IN +1732031488,1732032511,ID +1732032512,1732032767,PH +1732032768,1732033023,TH +1732033024,1732033535,IN +1732034560,1732035583,KR +1732035584,1732036607,IN +1732036608,1732037631,AU +1732038656,1732040703,IN +1732040704,1732040959,AU +1732040960,1732041215,SG +1732041216,1732041727,IN +1732041728,1732042751,HK +1732042752,1732043775,JP +1732043776,1732044799,CN +1732044800,1732045823,HK +1732045824,1732046847,CN +1732047872,1732048895,IN +1732048896,1732049919,HK +1732049920,1732050943,PH +1732050944,1732051967,HK +1732052992,1732054015,MM +1732054016,1732055039,IN +1732056064,1732057087,HK +1732057088,1732058111,KH +1732058112,1732059135,HK +1732059136,1732060159,IN +1732060160,1732061183,HK +1732061440,1732061695,ID +1732061696,1732062207,AU +1732062208,1732064255,VN +1732064256,1732066303,IN +1732066304,1732067327,CN +1732067328,1732068607,IN +1732068608,1732068863,NZ +1732068864,1732069119,AU +1732069120,1732069375,ID +1732069376,1732074495,IN +1732074496,1732075519,KH +1732075520,1732076543,AU +1732076544,1732077567,IN +1732077568,1732078591,CN +1732078592,1732080639,IN +1732080640,1732081663,ID +1732081664,1732082687,HK +1732082688,1732083711,MY +1732083712,1732084735,AU +1732084736,1732085759,IN +1732085760,1732086783,TW +1732086784,1732087807,CN +1732087808,1732088831,HK +1732088832,1732089599,IN +1732089600,1732089855,JP +1732089856,1732092927,CN +1732092928,1732093951,IN +1732093952,1732094975,HK +1732094976,1732097023,CN +1732097024,1732098047,IN +1732098048,1732100095,CN +1732100096,1732100607,SG +1732100608,1732107263,IN +1732107264,1732108287,HK +1732108288,1732109823,AU +1732109824,1732110335,IN +1732111360,1732113407,HK +1732113408,1732114431,JP +1732114432,1732115455,ID +1732115456,1732116479,IN +1732116480,1732117503,JP +1732117504,1732118527,SG +1732118528,1732119551,VN +1732119552,1732122623,IN +1732122624,1732123647,CN +1732123648,1732124159,AU +1732124160,1732124671,PH +1732124672,1732124927,AU +1732124928,1732125183,JP +1732125184,1732125951,AU +1732125952,1732126207,SG +1732126208,1732126719,AU +1732126720,1732127743,IN +1732127744,1732128767,HK +1732128768,1732129023,SG +1732129024,1732129279,NZ +1732129280,1732129791,AU +1732129792,1732130815,CN +1732130816,1732134911,IN +1732134912,1732140031,CN +1732140032,1732141055,IN +1732141056,1732151295,CN +1732151296,1732152319,IN +1732152320,1732153855,BD +1732153856,1732154367,IN +1732155392,1732156415,PH +1732156416,1732166655,CN +1732166656,1732167167,ID +1732167168,1732167679,IN +1732167680,1732168191,AU +1732168192,1732168703,ID +1732168704,1732174847,CN +1732174848,1732175871,KR +1732175872,1732176895,PK +1732176896,1732177919,IN +1732177920,1732178943,SG +1732178944,1732179967,JP +1732179968,1732182015,IN +1732182016,1732184063,HK +1732184064,1732188671,IN +1732188672,1732188927,AU +1732188928,1732189183,WS +1732189184,1732190207,IN +1732190208,1732205567,CN +1732205568,1732206591,NZ +1732206592,1732207615,ID +1732207616,1732207871,AU +1732207872,1732208127,IN +1732208128,1732208383,PH +1732208384,1732208639,AU +1732208640,1732213759,VN +1732213760,1732215807,IN +1732215808,1732217855,HK +1732217856,1732219903,CN +1732219904,1732220927,IN +1732220928,1732221951,CN +1732221952,1732222975,BD +1732222976,1732230143,CN +1732230144,1732230399,NZ +1732230400,1732230655,AU +1732230656,1732230911,KH +1732230912,1732231167,AU +1732231168,1732236287,CN +1732236288,1732237311,VN +1732237312,1732238335,TH +1732238336,1732240383,JP +1732240384,1732241407,AU +1732241664,1732241919,ID +1732241920,1732242431,BD +1732242432,1732243455,HK +1732243456,1732249599,CN +1732249600,1732250623,SG +1732250624,1732250879,HK +1732250880,1732251135,MY +1732251136,1732251647,ID +1732251648,1732252671,SG +1732252672,1732253695,MM +1732253696,1732280319,CN +1732280320,1732281343,IN +1732281344,1732282367,JP +1732282368,1732283391,HK +1732283392,1732285439,CN +1732285440,1732286463,AU +1732286464,1732318207,CN +1732318208,1732318719,IN +1732318720,1732318975,AU +1732318976,1732322303,IN +1732322304,1732322559,SG +1732322560,1732324351,CN +1732324352,1732325375,JP +1732325376,1732337663,CN +1732337664,1732338175,ID +1732338176,1732338687,HK +1732338688,1732342783,CN +1732348928,1732349951,IN +1732349952,1732358143,CN +1732358144,1732359167,MY +1732359168,1732360191,HK +1732360192,1732361215,PH +1732361216,1732362239,MY +1732362240,1732364287,IN +1732364288,1732364799,NP +1732364800,1732365311,IN +1732365312,1732366335,GB +1732366336,1732367359,JP +1732367360,1732368383,ID +1732368384,1732369407,HK +1732369408,1732370431,BS +1732371456,1732372479,IN +1732372480,1732372991,AU +1732372992,1732373503,IN +1732373504,1732374271,ID +1732374272,1732374527,NZ +1732375552,1732376575,AU +1732376576,1732377599,US +1732377600,1732377855,AU +1732377856,1732378111,NZ +1732378112,1732378623,AU +1732378624,1732384767,IN +1732384768,1732385279,BD +1732385280,1732385791,AU +1732385792,1732386815,US +1732386816,1732387839,CN +1732387840,1732388095,HK +1732388096,1732388351,AU +1732388352,1732388607,IN +1732388608,1732388863,AU +1732388864,1732389887,CN +1732389888,1732390911,ID +1732390912,1732391935,IN +1732391936,1732392447,AU +1732392448,1732392703,IN +1732392704,1732392959,ID +1732392960,1732393983,HK +1732393984,1732395007,SG +1732395008,1732395135,CZ +1732395136,1732395263,BG +1732395264,1732395391,HU +1732395392,1732395519,RS +1732395520,1732395647,SI +1732395648,1732395775,BA +1732395776,1732395903,HR +1732395904,1732396031,SK +1732396032,1732397055,ID +1732397056,1732400639,IN +1732400640,1732400895,ID +1732400896,1732401151,IN +1732401152,1732402175,PH +1732402176,1732403199,CN +1732403200,1732404223,IN +1732404224,1732405247,HK +1732405248,1732406271,IN +1732406272,1732407295,CN +1732407296,1732410367,IN +1732410368,1732411391,NZ +1732411392,1732412415,TH +1732412416,1732413439,AU +1732413440,1732417535,IN +1732417536,1732418559,VN +1732418560,1732422143,IN +1732422144,1732422399,AU +1732422400,1732422655,JP +1732422656,1732423679,IN +1732423680,1732424703,BD +1732424704,1732424711,HK +1732424712,1732424719,CN +1732424720,1732424751,HK +1732424752,1732424755,CN +1732424756,1732424767,HK +1732424768,1732424831,CN +1732424832,1732424839,HK +1732424840,1732424847,CN +1732424848,1732424855,HK +1732424856,1732424879,CN +1732424880,1732424919,HK +1732424920,1732424927,CN +1732424928,1732424935,HK +1732424936,1732424943,CN +1732424944,1732424999,HK +1732425000,1732425015,CN +1732425016,1732425727,HK +1732425728,1732426751,KH +1732426752,1732428799,KR +1732428800,1732429823,ID +1732429824,1732430847,CN +1732430848,1732433919,IN +1732433920,1732434175,CN +1732434176,1732434943,HK +1732434944,1732435199,AU +1732435200,1732435455,IN +1732435456,1732435967,PH +1732435968,1732440063,IN +1732440064,1732447231,CN +1732447232,1732449279,IN +1732449280,1732450303,LA +1732450304,1732450815,AU +1732450816,1732451071,MV +1732451072,1732451327,IN +1732451328,1732452351,JP +1732452352,1732452863,US +1732452864,1732453375,IN +1732453376,1732454399,MY +1732468736,1732483071,CN +1732483072,1732483839,IN +1732483840,1732484095,AU +1732484096,1732485119,BD +1732486144,1732486399,AU +1732486400,1732486655,PH +1732486656,1732486911,SG +1732486912,1732487167,AU +1732487168,1732488191,SG +1732488192,1732489215,CN +1732489216,1732489471,ID +1732489472,1732489727,AU +1732489728,1732493311,IN +1732493312,1732494335,CN +1732494336,1732495359,BD +1732495360,1732495615,SG +1732495616,1732496383,US +1732496384,1732497407,TW +1732497408,1732498431,KH +1732498432,1732499455,CN +1732499456,1732499711,ID +1732499712,1732499967,IN +1732499968,1732500479,ID +1732500480,1732501503,JP +1732501504,1732502527,HK +1732502528,1732503551,PH +1732503552,1732504063,IN +1732504064,1732504575,AU +1732504576,1732505599,IN +1732505600,1732506623,ID +1732506624,1732507647,IN +1732507648,1732508671,AU +1732508672,1732509695,HK +1732509696,1732510719,ID +1732510720,1732511743,BD +1732511744,1732512767,IN +1732512768,1732513791,JP +1732513792,1732524543,IN +1732524544,1732525055,NZ +1732525056,1732527103,HK +1732527104,1732531199,VN +1732531200,1732532223,IN +1732532224,1732533247,CN +1732533248,1732533759,AU +1732533760,1732534015,SG +1732534016,1732534271,IN +1732534272,1732535295,KR +1732535296,1732536319,CN +1732536320,1732536575,BD +1732536576,1732536831,IN +1732536832,1732537087,AU +1732537088,1732537343,MN +1732537344,1732537799,AT +1732537800,1732537807,US +1732537808,1732537855,AT +1732537856,1732538111,BZ +1732538112,1732538367,LT +1732538368,1732539391,IN +1732539392,1732540415,BD +1732540416,1732541439,US +1732541440,1732541695,AU +1732541696,1732541951,SG +1732542464,1732543487,CN +1732543488,1732544511,SG +1732544512,1732545023,ID +1732545024,1732545279,TW +1732545536,1732546559,AU +1732546560,1732547583,JP +1732547584,1732549631,KR +1732549632,1732550655,PH +1732550656,1732552703,AU +1732552704,1732554751,HK +1732554752,1732555263,IN +1732555264,1732555775,AU +1732555776,1732556799,HK +1732556800,1732557823,IN +1732557824,1732558847,AU +1732558848,1732559871,CN +1732559872,1732560127,IN +1732560128,1732560639,NZ +1732560640,1732560895,IN +1732560896,1732561919,SG +1732561920,1732562431,AU +1732562432,1732562943,IN +1732562944,1732563967,AU +1732563968,1732564991,NZ +1732564992,1732566527,IN +1732566528,1732566783,AU +1732566784,1732567039,SG +1732567040,1732568063,MM +1732568064,1732569087,NZ +1732570112,1732571135,KH +1732571136,1732575231,VN +1732575232,1732575743,AU +1732575744,1732579327,IN +1732579328,1732580351,CN +1732580352,1732583167,IN +1732583168,1732583423,AU +1732583424,1732590591,IN +1732590592,1732591615,GB +1732591616,1732592639,SG +1732592640,1732593663,KH +1732593664,1732594687,AU +1732594688,1732602879,IN +1732602880,1732603135,PH +1732603136,1732603391,IN +1732603392,1732603903,PK +1732603904,1732604927,IN +1732604928,1732605951,CN +1732605952,1732606975,HK +1732606976,1732607999,NP +1732608000,1732608255,HK +1732608512,1732609023,SG +1732609024,1732610047,CN +1732610048,1732611071,HK +1732611072,1732612095,SG +1732612096,1732613119,IN +1732613120,1732614143,BD +1732614144,1732615167,CN +1732615168,1732615423,MX +1732615424,1732615551,SK +1732615552,1732615679,IE +1732615680,1732615807,FI +1732615808,1732615935,SE +1732615936,1732616191,NO +1732616192,1732617215,VG +1732617216,1732618239,AU +1732618240,1732619263,IN +1732619264,1732620287,MY +1732620288,1732621311,ID +1732621312,1732623359,IN +1732623360,1732625407,VN +1732625408,1732625663,IN +1732625664,1732625919,ID +1732625920,1732626175,AU +1732626176,1732626431,PH +1732626432,1732627455,IN +1732627456,1732628479,GB +1732628480,1732629503,MY +1732629504,1732630527,CN +1732630528,1732633599,IN +1732633600,1732634623,NZ +1732634624,1732634879,ID +1732634880,1732635135,AU +1732635136,1732635647,NZ +1732635648,1732638719,IN +1732638720,1732639743,MM +1732639744,1732640255,AU +1732640256,1732640511,PH +1732640512,1732640767,AU +1732640768,1732641791,SG +1732641792,1732642815,TH +1732642816,1732643839,CN +1732643840,1732644863,BD +1732644864,1732645887,ID +1732645888,1732646911,SG +1732646912,1732647935,NZ +1732647936,1732648959,VN +1732648960,1732653055,IN +1732653056,1732654079,US +1732654080,1732655103,TW +1732655104,1732655615,AU +1732655616,1732655871,IN +1732655872,1732656127,HK +1732656128,1732657151,IN +1732657152,1732658175,SG +1732658176,1732658431,ID +1732658432,1732658687,IN +1732658688,1732660223,AU +1732660224,1732660735,HK +1732660736,1732660991,IN +1732660992,1732661247,ID +1732661248,1732662271,IN +1732662272,1732663295,PK +1732663296,1732663807,NZ +1732663808,1732675583,IN +1732675584,1732676095,PK +1732676096,1732676351,NZ +1732676352,1732676607,IN +1732676608,1732677631,BD +1732677632,1732678655,IN +1732678656,1732679679,CN +1732679680,1732684287,IN +1732684288,1732684799,BD +1732684800,1732686847,AU +1732686848,1732687871,HK +1732687872,1732688895,CN +1732688896,1732689919,IN +1732689920,1732690943,AU +1732690944,1732695039,IN +1732695040,1732696063,HK +1732696064,1732697087,MM +1732697088,1732699135,CN +1732699136,1732700159,BD +1732700160,1732701183,AU +1732701184,1732702207,CN +1732702208,1732703231,JP +1732703232,1732704255,TH +1732704256,1732704511,IN +1732704512,1732704767,MM +1732704768,1732705279,PK +1732705280,1732707327,CN +1732707328,1732708351,AU +1732708352,1732709375,ID +1732709376,1732710143,HK +1732710144,1732710399,JP +1732710400,1732712447,IN +1732712448,1732712703,HK +1732712704,1732712959,AF +1732712960,1732713215,SG +1732713216,1732713471,AU +1732713472,1732714495,HK +1732714496,1732715519,CN +1732715520,1732716543,JP +1732716544,1732717567,BD +1732717568,1732718079,ID +1732718080,1732718591,BD +1732718592,1732719615,CN +1732719616,1732720639,IN +1732720640,1732720895,NL +1732720896,1732721151,MV +1732721152,1732721407,MY +1732721408,1732721663,AF +1732721664,1732723711,IN +1732723712,1732725759,CN +1732725760,1732726783,IN +1732726784,1732729855,CN +1732729856,1732730879,PH +1732730880,1732737023,IN +1732737024,1732740095,CN +1732740096,1732741119,SG +1732741120,1732742143,KR +1732742144,1732743167,TW +1732743168,1732744191,CN +1732744192,1732746239,HK +1732746240,1732747263,JP +1732747264,1732748287,ID +1732748288,1732750847,IN +1732750848,1732751359,NL +1732751360,1732752383,HK +1732752384,1732754431,VN +1732754432,1732754687,AU +1732754688,1732754943,IN +1732754944,1732755455,ID +1732755456,1732756479,IN +1732756480,1732758527,CN +1732758528,1732758783,FJ +1732758784,1732759039,IN +1732759040,1732759551,AU +1732759552,1732762623,IN +1732762624,1732763647,NZ +1732763648,1732764671,ID +1732764672,1732765695,HK +1732765696,1732766719,CN +1732766720,1732767743,HK +1732767744,1732768255,ID +1732768256,1732768767,NP +1732768768,1732769791,SG +1732769792,1732770815,MM +1732770816,1732771327,HK +1732771328,1732771583,SG +1732771584,1732771839,ID +1732771840,1732772863,PK +1732772864,1732773119,SG +1732773120,1732773375,HK +1732773376,1732774911,IN +1732774912,1732786175,CN +1732786176,1732791295,IN +1732791296,1732792319,BD +1732792320,1732793343,US +1732793344,1732794367,PK +1732794368,1732794623,AU +1732794624,1732794879,HK +1732794880,1732795391,VU +1732795392,1732796415,MY +1732796416,1732797439,VN +1732797440,1732799487,IN +1732799488,1732799743,AU +1732799744,1732799999,BD +1732800000,1732800511,ID +1732800512,1732806655,CN +1732806656,1732808703,IN +1732808704,1732809727,CN +1732809728,1732809983,US +1732809984,1732810751,CN +1732810752,1732811775,HK +1732811776,1732812799,IN +1732812800,1732813311,HK +1732813312,1732813823,MY +1732813824,1732814847,HK +1732814848,1732815871,IN +1732815872,1732816895,CN +1732816896,1732817919,IN +1732817920,1732818943,CN +1732818944,1732819967,AU +1732819968,1732820991,PH +1732820992,1732821247,SG +1732821248,1732823039,IN +1732823040,1732824063,AU +1732824064,1732825087,IN +1732825088,1732825599,NZ +1732825600,1732826111,AU +1732826112,1732829183,IN +1732829184,1732845567,CN +1732845568,1732846591,IN +1732846592,1732847615,BD +1732847616,1732848639,AU +1732848640,1732849663,BD +1732849664,1732850687,CN +1732850688,1732851967,BD +1732851968,1732852223,AU +1732852224,1732852479,PH +1732852480,1732852735,AU +1732852736,1732853759,ID +1732853760,1732854271,AU +1732854272,1732854783,HK +1732854784,1732855807,PH +1732855808,1732857855,ID +1732857856,1732858367,KI +1732858368,1732859903,AU +1732859904,1732860927,CN +1732860928,1732861951,IN +1732861952,1732862975,CN +1732862976,1732863999,PK +1732864000,1732865023,BD +1732865024,1732867071,AU +1732867072,1732869119,CN +1732869120,1732869375,AU +1732869376,1732869631,ID +1732869632,1732869887,AU +1732869888,1732870143,IN +1732870144,1732875263,CN +1732875264,1732877567,IN +1732877568,1732877823,US +1732877824,1732878335,IN +1732878336,1732879359,HK +1732879360,1732880383,KH +1732880384,1732881407,CN +1732881408,1732882431,IN +1732882432,1732883455,CN +1732883456,1732884479,IN +1732885504,1732887039,IN +1732887040,1732887551,HK +1732887552,1732888575,BD +1732888576,1732889599,AU +1732889600,1732891647,CN +1732891648,1732894719,IN +1732894720,1732895743,BD +1732895744,1732896767,NZ +1732896768,1732897279,SG +1732897280,1732897535,PK +1732897536,1732897791,ID +1732897792,1732898815,MM +1732898816,1732901887,CN +1732901888,1732902911,US +1732902912,1732903935,KR +1732903936,1732904191,IN +1732904192,1732904447,AU +1732904448,1732904959,ID +1732904960,1732905983,IN +1732905984,1732906495,ID +1732906496,1732907007,NP +1732907008,1732908031,IN +1732908032,1732909055,PK +1732909056,1732916223,CN +1732916224,1732916735,HK +1732916736,1732917247,IN +1732917248,1732919295,CN +1732919296,1732919807,IN +1732919808,1732920319,AU +1732920320,1732922367,IN +1732922368,1732923391,NL +1732923392,1732924415,CN +1732924416,1732925439,BD +1732925440,1732928511,IN +1732928512,1732930559,VN +1732930560,1732931583,IN +1732931584,1732934655,VN +1732934656,1732935679,CN +1732935680,1732936703,HK +1732936704,1732937727,BD +1732937728,1732939263,IN +1732939264,1732939519,AU +1732939520,1732939775,ID +1732939776,1732940799,IN +1732940800,1732943871,CN +1732943872,1732944895,JP +1732944896,1732945919,ID +1732945920,1732946175,AU +1732946176,1732946431,IN +1732946432,1732946687,ID +1732946688,1732946943,AU +1732946944,1732947967,HK +1732947968,1732948991,BD +1732948992,1732950015,IN +1732950016,1732952063,AU +1732952064,1732953087,HK +1732953088,1732954111,IN +1732954112,1732954367,PK +1732954368,1732954879,LT +1732954880,1732955135,NZ +1732955136,1732956159,CN +1732956160,1732957183,NZ +1732957184,1732957695,ID +1732957696,1732958207,IN +1732958208,1732959231,AU +1732959232,1732960511,IN +1732960768,1732961023,AU +1732961024,1732961279,IN +1732961280,1732962303,BD +1732962304,1732963327,CN +1732963328,1732964351,IN +1732964352,1732965375,AU +1732965376,1732966399,IN +1732966400,1732967423,HK +1732967424,1732968447,TH +1732968448,1732969471,HK +1732969472,1732970495,AU +1732970496,1732971519,IN +1732971520,1732972543,HK +1732972544,1732973567,CN +1732973568,1732974079,VU +1732974080,1732974335,PH +1732974336,1732974591,AU +1732974592,1732975615,ID +1732975616,1732979711,IN +1732979712,1732980735,HK +1732980736,1732981247,NP +1732981248,1732982783,ID +1732982784,1732989951,IN +1732989952,1732993023,CN +1732993024,1732995071,ID +1732995072,1732998143,CN +1732998144,1732998399,AU +1732998400,1732998655,HK +1732998656,1732998911,JP +1732998912,1732999167,NZ +1732999168,1733000191,CN +1733000192,1733001215,IN +1733001216,1733002239,CN +1733002240,1733003263,AU +1733003264,1733004287,PH +1733004288,1733005311,IN +1733005312,1733006335,CN +1733006336,1733006847,NP +1733006848,1733007103,ID +1733007104,1733007359,SG +1733007360,1733008383,CN +1733008384,1733011455,IN +1733011456,1733012479,ID +1733012480,1733013247,IN +1733013248,1733013503,SG +1733013504,1733016575,VN +1733016576,1733017599,MY +1733017600,1733019647,IN +1733019648,1733020159,TH +1733020160,1733020415,AU +1733020416,1733020671,IN +1733020672,1733021695,AU +1733021696,1733022719,ID +1733022720,1733023743,JP +1733023744,1733024767,SG +1733024768,1733025791,BD +1733025792,1733026815,IN +1733026816,1733027839,MY +1733027840,1733028863,ID +1733028864,1733029119,CN +1733029120,1733029375,ID +1733029376,1733029887,BD +1733029888,1733030911,HK +1733030912,1733031935,PK +1733031936,1733032959,IN +1733032960,1733033983,JP +1733033984,1733034495,IN +1733034496,1733034751,MV +1733034752,1733035007,PK +1733035008,1733037055,IN +1733037056,1733041151,ID +1733041152,1733041663,PK +1733041664,1733041919,SG +1733041920,1733042175,NC +1733042176,1733043199,HK +1733043200,1733044223,SG +1733044224,1733045247,AU +1733045248,1733046271,BD +1733046272,1733046783,AU +1733046784,1733047039,ID +1733047040,1733047295,AU +1733047296,1733049343,IN +1733049344,1733053439,CN +1733053440,1733055487,IN +1733055488,1733055999,HK +1733056000,1733056511,CN +1733056512,1733057023,MY +1733057024,1733057279,AU +1733057280,1733057535,IN +1733057536,1733058559,CN +1733058560,1733060607,IN +1733060608,1733061631,US +1733061632,1733062655,IN +1733062656,1733063679,HK +1733063680,1733064703,TH +1733064704,1733065727,IN +1733065728,1733065983,SG +1733065984,1733066751,AU +1733066752,1733067775,IN +1733067776,1733068799,ID +1733068800,1733070847,IN +1733070848,1733071871,NZ +1733071872,1733072895,ID +1733072896,1733073919,BD +1733073920,1733074175,AU +1733074176,1733074431,FJ +1733074432,1733074943,AU +1733074944,1733075455,PH +1733075456,1733076479,AU +1733076480,1733076991,IN +1733076992,1733079039,ID +1733079040,1733079807,AU +1733079808,1733080063,MM +1733080064,1733081087,TH +1733081088,1733081599,MM +1733081600,1733084159,IN +1733084160,1733085183,BD +1733085184,1733086463,ID +1733086464,1733086719,NZ +1733086720,1733089279,IN +1733089280,1733092351,CN +1733092352,1733094399,IN +1733094400,1733096447,BD +1733096448,1733097215,AU +1733097216,1733097471,NZ +1733097472,1733100543,IN +1733100544,1733101055,NZ +1733101056,1733101311,PH +1733101312,1733101567,AU +1733101568,1733102591,PK +1733102592,1733102847,NZ +1733102848,1733103103,AU +1733103104,1733103615,IN +1733103616,1733104639,BD +1733104640,1733105663,IN +1733105664,1733106175,PG +1733106176,1733106687,IN +1733106688,1733107711,CN +1733107712,1733111807,IN +1733111808,1733112831,ID +1733112832,1733114879,CN +1733114880,1733115903,BD +1733115904,1733116927,LK +1733116928,1733117951,AU +1733117952,1733118975,CN +1733118976,1733119999,ID +1733120000,1733120255,AU +1733120256,1733120511,IN +1733120512,1733121023,TH +1733121024,1733122047,KR +1733122048,1733124095,CN +1733124096,1733125119,IN +1733125120,1733126143,BD +1733126144,1733127167,ID +1733127168,1733128191,IN +1733128192,1733128447,SG +1733128448,1733128703,AU +1733128704,1733128959,IN +1733128960,1733129215,AU +1733129216,1733130239,TH +1733130240,1733131263,AU +1733131264,1733132287,IN +1733132288,1733132543,AU +1733132544,1733132799,PH +1733132800,1733133311,SG +1733133312,1733134335,CN +1733134336,1733135359,IN +1733135360,1733136383,SG +1733136384,1733137407,AU +1733137408,1733138431,CN +1733138432,1733139455,IN +1733139456,1733140479,ID +1733140480,1733143551,VN +1733143552,1733146623,IN +1733146624,1733146879,HK +1733146880,1733147135,ID +1733147136,1733147647,IN +1733147648,1733148671,BD +1733148672,1733149695,HK +1733149696,1733150207,IN +1733150208,1733150975,AU +1733150976,1733151231,MM +1733151232,1733151743,AU +1733151744,1733152767,ID +1733152768,1733155839,IN +1733155840,1733156863,CN +1733156864,1733157119,AU +1733157120,1733157375,FJ +1733157376,1733157887,ID +1733157888,1733158911,IN +1733158912,1733159935,AU +1733159936,1733163007,IN +1733163008,1733164031,ID +1733164032,1733164543,BD +1733164544,1733167103,IN +1733167104,1733168127,ID +1733168128,1733171199,IN +1733171200,1733172223,ID +1733172224,1733173247,IN +1733173248,1733174271,MY +1733174272,1733175295,ID +1733175296,1733176319,HK +1733176320,1733176831,ID +1733176832,1733177087,IN +1733177088,1733177855,MY +1733177856,1733178111,AU +1733178112,1733178367,US +1733178368,1733179391,BD +1733179392,1733183487,CN +1733183488,1733184511,ID +1733184512,1733185535,VN +1733185536,1733186559,ID +1733186560,1733189631,VN +1733189632,1733192447,ID +1733192448,1733192703,IN +1733192704,1733193215,AU +1733193216,1733193471,ID +1733193472,1733193727,BT +1733193728,1733194751,ID +1733194752,1733195263,BT +1733195264,1733195775,JP +1733195776,1733196799,US +1733196800,1733197823,CN +1733197824,1733198847,KH +1733198848,1733199359,KR +1733199360,1733199871,PK +1733199872,1733200127,AU +1733200128,1733200383,IN +1733200384,1733202943,ID +1733202944,1733204223,IN +1733204224,1733204479,AU +1733204480,1733204991,IN +1733204992,1733205503,AU +1733205504,1733205759,TH +1733205760,1733206015,IN +1733206016,1733207039,BD +1733207040,1733209087,IN +1733209088,1733211135,CN +1733211136,1733212415,IN +1733212416,1733212671,AU +1733212672,1733213183,IN +1733213184,1733214207,BD +1733214208,1733214719,ID +1733214720,1733214975,AU +1733214976,1733215231,ID +1733215232,1733216255,CN +1733216256,1733218303,IN +1733218304,1733221375,ID +1733221376,1733221631,AU +1733221632,1733221887,IN +1733221888,1733222399,PH +1733222400,1733223423,BD +1733223424,1733224447,CN +1733224448,1733225471,ID +1733225472,1733226751,IN +1733226752,1733227007,AU +1733227008,1733227519,MY +1733227520,1733228543,IN +1733228544,1733230591,BD +1733230592,1733231615,IN +1733231616,1733232639,AU +1733232640,1733233663,IN +1733233664,1733234687,JP +1733234688,1733235711,PK +1733235712,1733235967,AU +1733235968,1733236223,IN +1733236224,1733236479,AU +1733236480,1733236735,NZ +1733236736,1733238783,CN +1733238784,1733239807,IN +1733239808,1733242879,CN +1733242880,1733243903,JP +1733243904,1733249023,CN +1733249024,1733249279,AU +1733249280,1733249791,IN +1733249792,1733250047,AU +1733250048,1733251071,US +1733251072,1733253119,CN +1733253120,1733253631,AU +1733253632,1733254143,ID +1733254144,1733255167,SG +1733255168,1733255423,ID +1733255424,1733255679,IN +1733255680,1733256191,ID +1733256192,1733257215,IN +1733257216,1733258751,AU +1733258752,1733259263,PH +1733259264,1733260543,IN +1733260544,1733261055,BD +1733261056,1733261311,IN +1733261312,1733262335,CN +1733262336,1733263359,AU +1733263360,1733264383,TH +1733264384,1733265407,KR +1733265408,1733266431,CN +1733266432,1733268479,VN +1733268480,1733269503,SG +1733269504,1733270527,ID +1733270528,1733271295,IN +1733271296,1733271551,AU +1733271552,1733274623,IN +1733274624,1733275647,AU +1733275648,1733276671,HK +1733276672,1733277183,AU +1733277184,1733277695,BD +1733277696,1733278719,HK +1733278720,1733285887,CN +1733285888,1733286911,BD +1733286912,1733287935,IN +1733287936,1733288959,BD +1733288960,1733289471,IN +1733289472,1733289727,NZ +1733289728,1733289983,AU +1733289984,1733292031,IN +1733292032,1733293055,CN +1733293056,1733296127,IN +1733296128,1733297151,BD +1733297152,1733298175,JP +1733298176,1733299199,HK +1733299200,1733300223,IN +1733300224,1733301247,HK +1733301248,1733301759,AU +1733301760,1733302271,IN +1733302272,1733304319,CN +1733304320,1733305343,IN +1733305344,1733306367,MM +1733306368,1733307391,AU +1733307392,1733308415,CN +1733308416,1733309439,TH +1733309440,1733309695,IN +1733309696,1733309951,AU +1733309952,1733313791,IN +1733313792,1733314047,SG +1733314048,1733314559,BD +1733314560,1733315583,CN +1733315584,1733315839,NZ +1733315840,1733316095,ID +1733316096,1733316351,AU +1733316352,1733316607,IN +1733316608,1733317631,ID +1733317632,1733318655,ES +1733318656,1733321727,ID +1733321728,1733322239,TH +1733322240,1733322751,AU +1733322752,1733323775,JP +1733323776,1733324799,BT +1733324800,1733326847,IN +1733326848,1733327871,AU +1733327872,1733328895,HK +1733328896,1733329151,AU +1733329152,1733329407,TH +1733329408,1733329919,IN +1733329920,1733330943,HK +1733330944,1733331967,AU +1733331968,1733332991,PH +1733332992,1733334015,HK +1733334016,1733338111,IN +1733338112,1733338367,AU +1733338368,1733338623,ID +1733338624,1733339135,IN +1733339136,1733340159,HK +1733340160,1733341183,IN +1733341184,1733344255,CN +1733344256,1733345279,ID +1733345280,1733346303,CN +1733346304,1733347327,IN +1733347328,1733348351,CN +1733348352,1733349375,JP +1733349376,1733349631,NZ +1733349632,1733349887,AU +1733349888,1733350399,MN +1733350400,1733351423,CN +1733351424,1733352447,TH +1733352448,1733353471,HK +1733353472,1733354495,BD +1733354496,1733355519,AU +1733355520,1733356543,CN +1733356544,1733358591,ID +1733358592,1733359615,AU +1733359616,1733360383,IN +1733360384,1733360639,AU +1733360640,1733361151,HK +1733361152,1733361663,AU +1733361664,1733362687,IN +1733362688,1733364735,CN +1733364736,1733365759,IN +1733365760,1733367807,CN +1733367808,1733371903,IN +1733371904,1733372927,AU +1733372928,1733374975,CN +1733374976,1733375743,AU +1733375744,1733377023,IN +1733377024,1733379071,ID +1733379072,1733380095,BD +1733380096,1733381119,JP +1733381120,1733381375,AU +1733381376,1733382143,IN +1733382144,1733384191,VN +1733384192,1733386239,IN +1733386240,1733387263,CN +1733387264,1733387775,ID +1733387776,1733388031,AU +1733388032,1733388287,IN +1733388288,1733388799,BD +1733388800,1733390591,IN +1733390592,1733391359,MM +1733391360,1733392383,IN +1733392384,1733393407,CN +1733393408,1733394431,AU +1733394432,1733395455,SG +1733395456,1733396479,ID +1733396480,1733396735,NP +1733396736,1733396991,IN +1733396992,1733397247,ID +1733397248,1733397503,IN +1733397504,1733399551,JP +1733399552,1733400575,CN +1733400576,1733402879,IN +1733402880,1733403135,AU +1733403136,1733403391,MY +1733403392,1733403647,SG +1733403648,1733405695,CN +1733405696,1733406719,BD +1733406720,1733407743,JP +1733407744,1733407999,NZ +1733408000,1733408511,IN +1733408512,1733408767,CN +1733408768,1733409023,HK +1733409024,1733409279,TW +1733409280,1733409535,SG +1733409536,1733409791,CN +1733409792,1733411327,IN +1733411328,1733411839,ID +1733411840,1733412863,BD +1733412864,1733413887,CN +1733413888,1733414911,BD +1733414912,1733416959,IN +1733416960,1733417471,AU +1733417472,1733417727,ID +1733417728,1733417983,AU +1733417984,1733419007,ID +1733419008,1733420031,NZ +1733420032,1733420287,SG +1733420288,1733421055,IN +1733421056,1733422079,CN +1733422080,1733424127,IN +1733424128,1733424383,AU +1733424384,1733424639,IN +1733424640,1733424895,ID +1733424896,1733425151,US +1733425152,1733425663,ID +1733425664,1733427199,IN +1733427200,1733428223,GB +1733428224,1733428735,US +1733428736,1733429247,ID +1733429248,1733430271,BD +1733430272,1733431295,ID +1733431296,1733432319,HK +1733432320,1733437439,VN +1733437440,1733438975,IN +1733438976,1733439487,PH +1733439488,1733440511,IN +1733440512,1733441535,CN +1733441536,1733442559,LA +1733442560,1733443583,CN +1733443584,1733444095,GB +1733444096,1733444607,IN +1733444608,1733445631,CN +1733445632,1733448703,IN +1733448704,1733449727,CN +1733449728,1733450751,JP +1733450752,1733453823,IN +1733453824,1733454847,CN +1733454848,1733455871,AU +1733455872,1733456895,JP +1733456896,1733457919,PH +1733457920,1733458943,PK +1733458944,1733459199,AU +1733459200,1733459455,IN +1733459456,1733459967,ID +1733459968,1733460991,GB +1733460992,1733462015,VN +1733462016,1733463039,AU +1733463040,1733464063,HK +1733464064,1733466111,IN +1733466112,1733467135,AU +1733467136,1733469183,IN +1733469184,1733469439,ID +1733469440,1733469695,TH +1733469696,1733470207,ID +1733470208,1733471231,HK +1733471232,1733472255,BD +1733472256,1733473279,IN +1733473280,1733474303,ID +1733474304,1733476351,IN +1733476352,1733478399,VN +1733478400,1733479423,IN +1733479424,1733479935,VN +1733479936,1733481471,IN +1733481472,1733483519,HK +1733483520,1733484543,IN +1733484544,1733485567,CN +1733485568,1733486591,MY +1733486592,1733486847,MM +1733486848,1733487103,ID +1733487104,1733487615,US +1733487616,1733488639,CN +1733488640,1733490175,ID +1733490176,1733490431,NZ +1733490432,1733490687,PG +1733490688,1733491711,US +1733491712,1733492735,PK +1733492736,1733492991,HK +1733492992,1733493759,IN +1733493760,1733494783,ID +1733494784,1733496319,IN +1733496320,1733496575,AU +1733496576,1733496831,BD +1733496832,1733497343,HK +1733497344,1733497855,AF +1733497856,1733498879,PK +1733498880,1733499903,JP +1733499904,1733500927,IN +1733500928,1733501439,PG +1733501440,1733501951,MM +1733501952,1733502975,US +1733502976,1733503999,PH +1733504000,1733505023,CN +1733505024,1733506047,ID +1733506048,1733507071,CN +1733507072,1733507327,AU +1733507328,1733508095,IN +1733508096,1733510143,CN +1733510144,1733511167,IN +1733511168,1733512191,CN +1733512192,1733513727,IN +1733513728,1733514495,TH +1733514496,1733514751,AU +1733514752,1733515263,IN +1733515264,1733516287,US +1733516288,1733518847,ID +1733518848,1733519103,AU +1733519104,1733519359,SG +1733519360,1733521407,IN +1733521408,1733522431,CN +1733522432,1733523455,ID +1733523456,1733524479,CN +1733524480,1733525247,AU +1733525248,1733526527,IN +1733527552,1733528575,IN +1733528576,1733529599,ID +1733529600,1733532671,IN +1733532672,1733533951,SG +1733533952,1733534207,IN +1733534208,1733534719,AU +1733534720,1733535743,BD +1733535744,1733536767,MY +1733536768,1733538815,ID +1733538816,1733539839,CN +1733539840,1733540863,IN +1733540864,1733541887,MM +1733541888,1733542911,IN +1733542912,1733543167,BD +1733543168,1733543423,PG +1733543424,1733543679,ID +1733543680,1733543935,IN +1733543936,1733544959,TH +1733544960,1733545983,BD +1733545984,1733546495,AU +1733546496,1733550079,IN +1733550080,1733551103,PH +1733551104,1733551615,NP +1733551616,1733551871,AU +1733551872,1733552127,HK +1733552128,1733553151,BD +1733553152,1733554175,GB +1733554176,1733555199,BD +1733555200,1733558271,IN +1733558272,1733559295,CN +1733559296,1733561343,ID +1733561344,1733566463,CN +1733566464,1733567487,HK +1733567488,1733568511,BD +1733568512,1733569535,AU +1733569536,1733570559,HK +1733570560,1733571583,CN +1733571584,1733572607,PK +1733572608,1733573631,CN +1733573632,1733574655,IN +1733574656,1733575679,CN +1733575680,1733576703,IN +1733576704,1733577727,CN +1733577728,1733578751,VN +1733578752,1733579775,IN +1733579776,1733581823,HK +1733581824,1733582847,CN +1733582848,1733583103,IN +1733583104,1733583359,AF +1733583360,1733583871,AU +1733583872,1733584895,TH +1733584896,1733585919,MM +1733585920,1733586943,CN +1733586944,1733587967,GB +1733587968,1733588991,ID +1733588992,1733590015,IN +1733590016,1733591039,JP +1733591040,1733592063,IN +1733592064,1733592319,MV +1733592320,1733592575,BD +1733592576,1733592831,MV +1733592832,1733593087,AU +1733593088,1733594111,HK +1733594112,1733596159,ID +1733596160,1733597183,PK +1733597184,1733598207,US +1733598208,1733599231,BD +1733599232,1733600255,LK +1733600256,1733601023,IN +1733601024,1733602303,JP +1733602304,1733603327,BD +1733603328,1733603839,PH +1733603840,1733604351,IN +1733604352,1733605375,AU +1733605376,1733607423,IN +1733607424,1733608447,ID +1733608448,1733609471,JP +1733609472,1733609983,ID +1733609984,1733611519,IN +1733611520,1733612543,ID +1733612544,1733613567,IN +1733613568,1733614591,SG +1733614592,1733615615,HK +1733615616,1733616639,AU +1733616640,1733618687,ID +1733618688,1733620735,IN +1733620736,1733621759,BD +1733621760,1733622015,AU +1733622016,1733622271,ID +1733622272,1733622783,IN +1733622784,1733623807,BD +1733623808,1733624831,NZ +1733624832,1733625855,ID +1733625856,1733626879,IN +1733626880,1733627903,ID +1733627904,1733628927,IN +1733628928,1733630975,CN +1733630976,1733631999,NZ +1733632000,1733633023,BD +1733633024,1733634047,AU +1733634048,1733634559,IN +1733634560,1733635071,US +1733635072,1733639167,CN +1733639168,1733641215,ID +1733641216,1733642239,PH +1733642240,1733643263,HK +1733643264,1733644287,IN +1733644288,1733645311,KR +1733645312,1733646335,CN +1733646336,1733647871,IN +1733647872,1733648383,ID +1733648384,1733650431,IN +1733650432,1733651455,MM +1733651456,1733652479,MY +1733652480,1733653503,BD +1733653504,1733654015,ID +1733654016,1733654527,IN +1733654528,1733655551,ID +1733655552,1733656575,IN +1733656576,1733657599,PK +1733657600,1733657855,MN +1733657856,1733658111,IN +1733658112,1733658367,PH +1733658368,1733658623,AU +1733658624,1733659647,CN +1733659648,1733660671,IN +1733660672,1733661695,CN +1733661696,1733662719,ID +1733662720,1733663231,PK +1733663232,1733663487,IN +1733663488,1733663743,NZ +1733663744,1733665791,BD +1733665792,1733669887,CN +1733669888,1733670911,IN +1733670912,1733671423,SG +1733671424,1733671679,HK +1733671680,1733671935,US +1733671936,1733672959,HK +1733672960,1733675007,BD +1733675008,1733675263,DK +1733675264,1733675519,ES +1733675520,1733675775,CA +1733675776,1733676031,ES +1733676032,1733678079,IN +1733678080,1733678335,HK +1733678336,1733678591,SG +1733678592,1733679103,AU +1733679104,1733680127,BD +1733680128,1733681151,ID +1733681152,1733682175,CN +1733682176,1733683199,IN +1733683200,1733686271,BD +1733686272,1733687295,HK +1733687296,1733688319,AU +1733688320,1733689343,HK +1733689344,1733691391,IN +1733691392,1733692415,PK +1733692416,1733695487,IN +1733695488,1733695999,ID +1733696000,1733696255,IN +1733696256,1733696511,AU +1733696512,1733698559,CN +1733698560,1733699583,PK +1733699584,1733700607,IN +1733700608,1733701631,KR +1733701632,1733702655,TH +1733702656,1733703679,PK +1733703680,1733704191,NP +1733704192,1733704703,AU +1733704704,1733705727,CN +1733705728,1733706751,HK +1733706752,1733707007,JP +1733707008,1733707263,CN +1733707264,1733707775,US +1733707776,1733709823,HK +1733709824,1733712895,CN +1733712896,1733713407,AU +1733713408,1733713663,ID +1733713664,1733713919,IN +1733713920,1733714431,AU +1733714432,1733714687,JP +1733714688,1733714943,SG +1733714944,1733715455,ID +1733715456,1733715711,AU +1733715712,1733715967,ID +1733715968,1733716991,IN +1733716992,1733718015,BD +1733718016,1733719039,AU +1733719040,1733720063,IN +1733720064,1733721087,PH +1733721088,1733722111,AF +1733722112,1733722367,AU +1733722368,1733722623,CN +1733722624,1733723135,MY +1733723136,1733724159,PK +1733724160,1733724415,AU +1733724416,1733724671,IN +1733724672,1733731327,ID +1733731328,1733732351,IN +1733732352,1733733375,AU +1733733376,1733734911,IN +1733734912,1733735423,MY +1733735424,1733736447,IN +1733736448,1733737471,PH +1733737472,1733738495,AU +1733738496,1733741567,BD +1733741568,1733756927,CN +1733756928,1733757951,HK +1733757952,1733758975,LK +1733758976,1733759999,ID +1733760000,1733761023,CN +1733761024,1733763071,IN +1733763072,1733764095,CN +1733764096,1733764351,BD +1733764352,1733764607,ID +1733764608,1733765119,AU +1733765120,1733770239,IN +1733770240,1733771263,ID +1733771264,1733771775,IN +1733771776,1733772287,ID +1733772288,1733772543,AU +1733772544,1733772799,MN +1733772800,1733773311,ID +1733773312,1733774335,CN +1733774336,1733777407,ID +1733777408,1733777663,AF +1733777664,1733778175,IN +1733778176,1733778431,AU +1733778432,1733779455,IN +1733779456,1733780479,CN +1733780480,1733782527,IN +1733782528,1733782783,JP +1733782784,1733783551,US +1733783552,1733784575,BD +1733784576,1733785599,KR +1733785600,1733785855,IN +1733785856,1733786111,NZ +1733786112,1733786623,IN +1733786624,1733787647,LK +1733787648,1733788671,IN +1733788672,1733789695,CN +1733789696,1733790719,BD +1733790720,1733791743,IN +1733791744,1733792767,JP +1733793792,1733794815,ID +1733794816,1733795839,HK +1733795840,1733796351,ID +1733796352,1733796607,PK +1733796608,1733796863,AU +1733796864,1733799935,IN +1733799936,1733800959,JP +1733800960,1733801983,CN +1733801984,1733803007,ID +1733803008,1733803263,MV +1733803264,1733804031,SG +1733804032,1733805055,PK +1733805056,1733806079,ID +1733806080,1733806335,IN +1733806336,1733806591,ID +1733806592,1733806847,IN +1733806848,1733807103,AU +1733807104,1733808127,IN +1733808128,1733809151,AU +1733809152,1733810175,BD +1733810176,1733810431,AU +1733810432,1733810687,TH +1733810688,1733811199,AU +1733811200,1733812223,VN +1733812224,1733813247,CN +1733813248,1733814271,ID +1733814272,1733816063,BD +1733816064,1733816319,NZ +1733816320,1733817343,HK +1733817344,1733819391,BD +1733819392,1733819903,IN +1733819904,1733820159,AU +1733820160,1733820415,MN +1733820416,1733821439,IN +1733821440,1733826559,CN +1733826560,1733827583,BD +1733827584,1733828607,IN +1733828608,1733830655,CN +1733830656,1733831167,IN +1733831168,1733831423,PH +1733831424,1733831679,SG +1733831680,1733832703,JP +1733832704,1733833727,MM +1733833728,1733835775,IN +1733835776,1733837823,CN +1733837824,1733838847,PH +1733838848,1733839871,CN +1733839872,1733840383,IN +1733840384,1733840639,AU +1733840640,1733840895,SG +1733840896,1733843967,IN +1733843968,1733844991,HK +1733844992,1733847039,CN +1733847040,1733848063,NZ +1733848064,1733852159,VN +1733852160,1733855231,IN +1733855232,1733855743,BD +1733855744,1733855999,IN +1733856000,1733856255,CN +1733856256,1733857279,BD +1733857280,1733859327,AU +1733859328,1733859839,CN +1733859840,1733860095,AU +1733860096,1733860351,KH +1733860352,1733861887,IN +1733861888,1733862143,KH +1733862144,1733862399,AU +1733862400,1733863423,CN +1733863424,1733864447,ID +1733864448,1733865471,IN +1733865472,1733866495,CN +1733866496,1733867007,AU +1733867008,1733867263,IN +1733867264,1733867519,AU +1733867520,1733869567,CN +1733869568,1733870591,AF +1733870592,1733874687,ID +1733874688,1733875711,CN +1733875712,1733879039,IN +1733879040,1733879295,ID +1733879296,1733879807,NZ +1733879808,1733880831,BD +1733880832,1733882879,IN +1733882880,1733887999,ID +1733888000,1733888255,IN +1733888256,1733889023,AU +1733889024,1733890047,PH +1733890048,1733890559,IN +1733890560,1733891071,NZ +1733891072,1733892095,TW +1733892096,1733893119,BD +1733893120,1733894143,CN +1733894144,1733895167,ID +1733895168,1733895679,IN +1733895680,1733896191,AU +1733896192,1733897215,IN +1733897216,1733898239,KR +1733898240,1733899263,MM +1733899264,1733903359,IN +1733903360,1733904383,US +1733904384,1733904639,HK +1733904640,1733904895,AU +1733904896,1733905407,IN +1733905408,1733906431,ID +1733906432,1733907455,AU +1733907456,1733910527,VN +1733910528,1733916671,CN +1733916672,1733917695,VN +1733917696,1733918719,ID +1733918720,1733919743,HK +1733919744,1733920767,GB +1733920768,1733921023,IN +1733921024,1733921279,HK +1733921280,1733921791,ID +1733921792,1733922815,SG +1733922816,1733923839,HK +1733923840,1733924863,CN +1733924864,1733925375,AF +1733925376,1733925887,ID +1733925888,1733926911,NP +1733926912,1733928703,ID +1733928704,1733928959,AU +1733928960,1733929983,IN +1733929984,1733931007,CN +1733931008,1733933055,MM +1733933056,1733945343,CN +1733945344,1733946367,IN +1733946368,1733948415,PH +1733948416,1733949439,BD +1733949440,1733949695,ID +1733949696,1733949951,IN +1733949952,1733950463,ID +1733950464,1733951487,IN +1733951488,1733952255,BD +1733952256,1733952511,AU +1733952512,1733953279,IN +1733953280,1733953535,PK +1733953536,1733954559,ID +1733954560,1733955071,BD +1733955072,1733955327,NZ +1733955328,1733955583,AU +1733955584,1733956607,JP +1733956608,1733957631,AU +1733957632,1733958655,ID +1733958656,1733959679,JP +1733959680,1733961727,IN +1733961728,1733962751,TH +1733962752,1733963775,IN +1733963776,1733964543,AU +1733964544,1733964799,HK +1733964800,1733965823,CN +1733965824,1733966335,HK +1733966336,1733966847,AU +1733966848,1733967871,IN +1733967872,1733968127,ID +1733968128,1733968895,AU +1733968896,1733970943,IN +1733970944,1733971199,HK +1733971200,1733971455,AU +1733971456,1733971711,NZ +1733971712,1733971967,IN +1733971968,1733972991,HK +1733972992,1733974015,NP +1733974016,1733975039,AU +1733975040,1733976063,CN +1733976064,1733977087,IN +1733977088,1733986303,CN +1733986304,1733987327,HK +1733987328,1733988351,AU +1733988352,1733989375,NP +1733989376,1733990399,KH +1733990400,1733991423,CN +1733991424,1733993471,IN +1733993472,1733994495,JP +1733994496,1733995519,CN +1733995520,1733995775,HK +1733995776,1733996031,CN +1733996032,1733996543,NZ +1733996544,1733997567,CN +1733997568,1733998591,IN +1733998592,1733999103,NZ +1733999104,1733999615,IN +1733999616,1734001663,CN +1734001664,1734002687,ID +1734002688,1734003199,IN +1734003200,1734003455,PH +1734003456,1734003711,HK +1734003712,1734004735,IN +1734004736,1734004991,AU +1734004992,1734005247,KR +1734005248,1734005503,ID +1734005504,1734005759,AU +1734005760,1734006783,BD +1734006784,1734007807,AU +1734007808,1734011903,VN +1734011904,1734013951,IN +1734013952,1734014975,KR +1734014976,1734018047,ID +1734018048,1734019071,JP +1734019072,1734020095,HK +1734020096,1734021119,ID +1734021120,1734022143,IN +1734022144,1734026239,ID +1734026240,1734028287,CN +1734028288,1734029311,ID +1734029312,1734030335,IN +1734030336,1734031103,BD +1734031104,1734031359,PH +1734031360,1734032383,US +1734032384,1734032895,MM +1734032896,1734033407,IN +1734033408,1734034431,MY +1734034432,1734039295,IN +1734039296,1734039551,ID +1734039552,1734043647,IN +1734043648,1734044159,BD +1734044160,1734044191,PR +1734044192,1734044255,CN +1734044256,1734044287,KR +1734044288,1734044447,CN +1734044448,1734044479,US +1734044480,1734044511,CN +1734044512,1734044543,US +1734044544,1734045695,CN +1734045696,1734046207,PH +1734046208,1734046719,PG +1734046720,1734049023,IN +1734049024,1734049279,SG +1734049280,1734049535,HK +1734049536,1734049791,IN +1734049792,1734050815,BD +1734050816,1734052863,IN +1734052864,1734053887,PH +1734053888,1734054911,BD +1734054912,1734055935,AU +1734055936,1734056959,CN +1734056960,1734057983,HK +1734057984,1734059007,IN +1734059008,1734060031,AU +1734060032,1734061055,BD +1734061056,1734062079,NZ +1734062080,1734063103,CN +1734063104,1734064127,IN +1734064128,1734064383,JP +1734064384,1734064639,AU +1734064640,1734065151,IN +1734065152,1734066175,TH +1734066176,1734066687,AU +1734066688,1734066943,MY +1734066944,1734067199,BD +1734067200,1734068223,NZ +1734068224,1734069247,CN +1734069248,1734070271,TH +1734070272,1734072319,CN +1734072320,1734072575,AU +1734072576,1734072831,HK +1734072832,1734073087,IN +1734073088,1734073343,CN +1734073344,1734075391,IN +1734075392,1734077439,BD +1734077440,1734078463,CN +1734078464,1734079487,MY +1734079488,1734081535,IN +1734081536,1734086655,CN +1734086656,1734086911,NZ +1734086912,1734087167,AU +1734087168,1734087423,MY +1734087424,1734087679,IN +1734087680,1734088703,PK +1734088704,1734091775,VN +1734091776,1734092799,ID +1734092800,1734094847,IN +1734094848,1734104063,CN +1734104064,1734104575,BD +1734104576,1734104831,CN +1734104832,1734105087,AU +1734105088,1734106111,CN +1734106112,1734107135,AU +1734107136,1734108159,SG +1734108160,1734109183,IN +1734109184,1734109439,ID +1734109440,1734109695,TH +1734109696,1734110207,BD +1734110208,1734111231,CN +1734111232,1734114303,IN +1734114304,1734115583,CN +1734115584,1734115839,HK +1734115840,1734116095,VG +1734116096,1734116351,AU +1734116352,1734117375,CN +1734117376,1734118399,HK +1734118400,1734119423,AU +1734119424,1734120447,PH +1734120448,1734121471,MY +1734121472,1734122495,BD +1734122496,1734123519,CN +1734123520,1734124031,BD +1734124032,1734124543,IN +1734124544,1734132735,CN +1734132736,1734133759,SG +1734133760,1734134783,IN +1734134784,1734136063,BD +1734136064,1734136319,ID +1734136320,1734136831,US +1734136832,1734138879,BD +1734138880,1734139903,AU +1734139904,1734140927,ID +1734140928,1734141951,JP +1734141952,1734142463,ID +1734142464,1734142719,BD +1734142720,1734142975,IN +1734142976,1734150143,CN +1734150144,1734151167,IN +1734151168,1734152191,PK +1734152192,1734154239,IN +1734154240,1734155007,AU +1734155008,1734155263,IN +1734155264,1734156287,CN +1734156288,1734157311,NZ +1734157312,1734159871,IN +1734159872,1734160127,HK +1734160128,1734161407,IN +1734161408,1734163455,ID +1734163456,1734164479,JP +1734164480,1734165503,ID +1734165504,1734166527,AU +1734166528,1734167551,HK +1734167552,1734167807,JP +1734167808,1734168575,CN +1734168576,1734169343,AU +1734169344,1734169599,IN +1734169600,1734170623,CN +1734170624,1734171135,IN +1734171136,1734171391,BD +1734171392,1734171647,AU +1734171648,1734171903,AF +1734171904,1734172159,BD +1734172160,1734172415,IN +1734172416,1734172671,PK +1734172672,1734175743,IN +1734175744,1734176767,AU +1734176768,1734178815,IN +1734178816,1734179071,BD +1734179072,1734179327,CN +1734179328,1734179839,NP +1734179840,1734180863,HK +1734180864,1734182911,ID +1734182912,1734183423,IN +1734183424,1734183679,SG +1734183680,1734183935,AU +1734183936,1734184959,MY +1734184960,1734185983,NZ +1734185984,1734187007,AU +1734187008,1734188031,CN +1734188032,1734188543,AU +1734188544,1734190591,ID +1734190592,1734190847,TH +1734190848,1734191103,SG +1734191104,1734192127,AU +1734192128,1734194175,IN +1734194176,1734195199,CN +1734195200,1734197247,ID +1734197248,1734200319,IN +1734200320,1734201343,CN +1734201344,1734201599,PK +1734201600,1734201855,IN +1734201856,1734202367,ID +1734202368,1734203391,TH +1734203392,1734204415,PK +1734204416,1734205439,PH +1734205440,1734207487,ID +1734207488,1734208511,AU +1734208512,1734209279,ID +1734209280,1734209535,AU +1734209536,1734210559,IN +1734210560,1734211583,ID +1734211584,1734212607,IN +1734212608,1734213119,SG +1734213120,1734213375,AF +1734213376,1734213631,SG +1734213632,1734216703,ID +1734216704,1734217727,CN +1734217728,1734218751,VN +1734218752,1734219775,CN +1734219776,1734220287,AF +1734220288,1734220543,AU +1734220544,1734220799,IN +1734220800,1734225919,CN +1734225920,1734226943,AU +1734226944,1734227967,MM +1734227968,1734228991,IN +1734228992,1734230015,AU +1734230016,1734231039,IN +1734231040,1734232063,MM +1734232064,1734233087,CN +1734233088,1734234111,HK +1734234112,1734236159,IN +1734236160,1734237183,CN +1734237184,1734238207,NZ +1734238208,1734239231,ID +1734239232,1734239743,IN +1734239744,1734239999,PK +1734240000,1734240255,HK +1734240256,1734243327,IN +1734243328,1734244351,CN +1734244352,1734246399,ID +1734246400,1734247423,BD +1734247424,1734247935,ID +1734247936,1734248447,BD +1734248448,1734249471,IN +1734249472,1734250495,JP +1734250496,1734251519,MM +1734251520,1734252543,HK +1734252544,1734253823,AU +1734253824,1734254079,CA +1734254080,1734254591,NP +1734254592,1734255615,CN +1734255616,1734255871,ID +1734255872,1734256127,AU +1734256128,1734256639,IN +1734256640,1734257663,ID +1734257664,1734258687,IN +1734258688,1734259711,VN +1734259712,1734260735,CN +1734260736,1734260991,HK +1734260992,1734261247,US +1734261248,1734261503,PK +1734261504,1734261759,IN +1734261760,1734262783,ID +1734262784,1734263807,IN +1734263808,1734264831,BD +1734264832,1734265855,CN +1734265856,1734266623,IN +1734266624,1734267903,AU +1734267904,1734268415,ID +1734268416,1734268927,HK +1734268928,1734269951,BD +1734269952,1734270975,NP +1734270976,1734271999,SG +1734272000,1734273023,JP +1734273024,1734274047,HK +1734274048,1734274559,IN +1734274560,1734275071,ID +1734275072,1734276095,IN +1734276096,1734276607,PK +1734276608,1734277119,BD +1734277120,1734278143,AU +1734278144,1734279167,NP +1734279168,1734280191,AU +1734280192,1734280703,PK +1734280704,1734282239,ID +1734282240,1734283263,IN +1734283264,1734284287,NP +1734284288,1734285311,BD +1734285312,1734286335,LA +1734286336,1734287359,CN +1734287360,1734288383,MY +1734288384,1734288639,IN +1734288640,1734288895,MY +1734288896,1734289151,BD +1734289152,1734289407,AU +1734289408,1734290431,ID +1734290432,1734291455,TW +1734291456,1734291711,IN +1734291712,1734291967,ID +1734291968,1734292479,IN +1734292480,1734293503,CN +1734293504,1734294527,HK +1734294528,1734295551,NZ +1734295552,1734297599,CN +1734297600,1734298623,AU +1734298624,1734298879,SG +1734298880,1734299647,AU +1734299648,1734301695,IN +1734301696,1734303743,CN +1734303744,1734304767,BD +1734304768,1734305023,IN +1734305024,1734305279,ID +1734305280,1734305791,HK +1734305792,1734306815,JP +1734306816,1734307327,HK +1734307328,1734308863,AU +1734308864,1734309887,CN +1734309888,1734310911,IN +1734310912,1734311935,BD +1734311936,1734312959,CN +1734312960,1734313983,KH +1734313984,1734317055,CN +1734317056,1734318079,PH +1734318080,1734319103,CN +1734319104,1734320127,VN +1734320128,1734320895,ID +1734320896,1734321151,JP +1734321152,1734322175,IN +1734322176,1734323199,VN +1734323200,1734324223,IN +1734324224,1734325247,AU +1734325248,1734327295,JP +1734327296,1734328831,IN +1734328832,1734329343,AU +1734329344,1734330367,VN +1734330368,1734331391,IN +1734331392,1734331903,AU +1734331904,1734332159,JP +1734332160,1734332415,CN +1734332416,1734333439,BD +1734333440,1734333951,PH +1734333952,1734334207,AU +1734334208,1734334463,SG +1734334464,1734337535,CN +1734337536,1734338559,TH +1734338560,1734339071,PH +1734339072,1734339583,IN +1734339584,1734344703,CN +1734344704,1734345727,JP +1734345728,1734346751,AU +1734346752,1734347775,CN +1734347776,1734349823,IN +1734349824,1734352383,AU +1734352384,1734352895,IN +1734352896,1734353919,NP +1734353920,1734354943,BD +1734354944,1734359039,IN +1734359040,1734360063,AU +1734360064,1734361087,MO +1734361088,1734362111,JP +1734362112,1734363135,BD +1734363136,1734364159,HK +1734364160,1734365183,KH +1734365184,1734366207,CN +1734366208,1734367231,NZ +1734367232,1734368255,BD +1734368256,1734371327,IN +1734371328,1734372351,BD +1734372352,1734372863,SG +1734372864,1734373119,NZ +1734373120,1734373375,ID +1734373376,1734374399,JP +1734374400,1734374655,ID +1734374656,1734374911,NZ +1734374912,1734375423,ID +1734375424,1734375424,HK +1734375425,1734376446,JP +1734376447,1734376447,HK +1734376448,1734377471,CN +1734377472,1734378495,HK +1734378496,1734378751,AU +1734378752,1734379007,IN +1734379008,1734379519,PG +1734379520,1734380799,CN +1734380800,1734381055,AU +1734381056,1734381567,IN +1734381568,1734382591,AU +1734382592,1734401023,CN +1734401024,1734403327,IN +1734403328,1734403583,JP +1734403584,1734404351,MM +1734404352,1734404607,AF +1734404608,1734405119,BD +1734405120,1734406655,IN +1734406656,1734407167,MY +1734407168,1734408191,NP +1734408192,1734408447,MY +1734408448,1734408703,AU +1734408704,1734409215,IN +1734409216,1734410239,JP +1734410240,1734411263,HK +1734411264,1734412287,ID +1734412288,1734421503,CN +1734421504,1734422015,BD +1734422016,1734422527,IN +1734422528,1734423551,TW +1734423552,1734424575,AU +1734424576,1734429695,CN +1734429696,1734430719,ID +1734430720,1734431743,CN +1734431744,1734435839,IN +1734435840,1734436607,ID +1734436608,1734438399,IN +1734438400,1734438655,MM +1734438656,1734438911,ID +1734438912,1734440959,CN +1734440960,1734441983,BD +1734441984,1734443007,VN +1734443008,1734444031,CN +1734444032,1734445055,VN +1734445056,1734446079,IN +1734446080,1734446591,ID +1734446592,1734447103,MY +1734447104,1734449151,CN +1734449152,1734449407,MY +1734449408,1734449663,IN +1734449664,1734449919,PK +1734449920,1734450175,AU +1734450176,1734451199,TW +1734451200,1734452223,BD +1734452224,1734453247,IN +1734453248,1734453759,PK +1734453760,1734455039,AU +1734455040,1734456319,HK +1734456320,1734458367,IN +1734458368,1734460415,CN +1734460416,1734461439,IN +1734461440,1734461951,HK +1734461952,1734462207,ID +1734462208,1734462463,IN +1734462464,1734463487,BD +1734463488,1734463999,JP +1734464000,1734465791,IN +1734465792,1734467583,AU +1734467584,1734469119,CN +1734469120,1734469375,AU +1734469376,1734469631,IN +1734469632,1734471679,JP +1734471680,1734474239,IN +1734474240,1734474495,US +1734474496,1734474751,ID +1734474752,1734475775,AU +1734475776,1734476799,IN +1734476800,1734477823,TH +1734477824,1734478847,HK +1734478848,1734479359,AU +1734479360,1734480383,HK +1734480384,1734480639,JP +1734480640,1734480895,HK +1734480896,1734481919,IN +1734481920,1734482943,TH +1734482944,1734483455,CN +1734483456,1734483967,ID +1734483968,1734486015,IN +1734486016,1734489087,CN +1734489088,1734489343,PG +1734489344,1734489855,IN +1734489856,1734490111,SG +1734490112,1734491135,CN +1734491136,1734491391,IN +1734491392,1734491647,ID +1734491648,1734492159,IN +1734492160,1734493183,BD +1734493184,1734494207,MN +1734494208,1734495231,TW +1734495232,1734495743,HK +1734495744,1734496255,IN +1734496256,1734497279,CN +1734497280,1734497535,MY +1734497536,1734497791,IN +1734497792,1734498303,AU +1734498304,1734502399,CN +1734502400,1734502911,ID +1734502912,1734503423,BD +1734503424,1734504447,IN +1734504448,1734504703,HK +1734504704,1734504959,SG +1734504960,1734505471,HK +1734505472,1734507007,ID +1734507008,1734507263,MN +1734507264,1734507519,ID +1734507520,1734508543,CN +1734508544,1734509567,NP +1734509568,1734510335,SG +1734510336,1734510591,BD +1734510592,1734513663,CN +1734513664,1734515711,VN +1734515712,1734516735,IN +1734516736,1734517759,VN +1734517760,1734519807,CN +1734519808,1734520831,US +1734520832,1734521855,ID +1734521856,1734522879,CN +1734522880,1734523903,AU +1734523904,1734525951,IN +1734525952,1734526975,CN +1734526976,1734529023,BD +1734529024,1734529535,AU +1734529536,1734530047,IN +1734530048,1734531071,JP +1734531072,1734536191,CN +1734536192,1734536447,AU +1734536448,1734536703,MY +1734536704,1734536959,AU +1734536960,1734537215,ID +1734537216,1734541311,CN +1734541312,1734542335,VN +1734542336,1734543359,SG +1734543360,1734544127,IN +1734544128,1734544383,BD +1734544384,1734546431,IN +1734546432,1734547199,AU +1734547200,1734547455,HK +1734547456,1734547967,ID +1734547968,1734548223,TL +1734548480,1734549503,MM +1734549504,1734551551,IN +1734551552,1734552063,CN +1734552064,1734552319,IN +1734552320,1734552575,FJ +1734552576,1734553599,AU +1734553600,1734554111,MY +1734554112,1734554623,SG +1734554624,1734557695,CN +1734557696,1734558719,AU +1734558720,1734559743,IN +1734559744,1734560767,HK +1734560768,1734561791,CN +1734561792,1734562815,JP +1734562816,1734563327,ID +1734563328,1734563839,AU +1734563840,1734564863,TW +1734564864,1734565887,IN +1734565888,1734566911,SG +1734566912,1734567167,LK +1734567168,1734567679,IN +1734567680,1734567935,MN +1734567936,1734568959,CN +1734568960,1734569983,IN +1734569984,1734570495,ID +1734570496,1734570751,AU +1734570752,1734571007,US +1734571008,1734573055,CN +1734573056,1734574079,JP +1734574080,1734575103,BD +1734575104,1734579199,CN +1734579200,1734580223,IN +1734580224,1734581247,CN +1734581248,1734582271,IN +1734582272,1734583295,PH +1734583296,1734584319,TL +1734584320,1734585343,JP +1734585344,1734585855,IN +1734585856,1734586367,PG +1734586368,1734586879,BD +1734586880,1734587391,US +1734587392,1734588415,BD +1734588416,1734589183,IN +1734589184,1734589439,GB +1734589440,1734594559,IN +1734594560,1734595327,HK +1734595328,1734595583,AU +1734595584,1734596607,ID +1734596608,1734597631,IN +1734597632,1734598655,CN +1734598656,1734599679,AU +1734599680,1734599935,TW +1734599936,1734600703,VN +1734600704,1734602751,CN +1734602752,1734603775,AU +1734603776,1734604799,VN +1734604800,1734605823,BD +1734605824,1734606847,VN +1734606848,1734607871,CN +1734607872,1734609407,IN +1734609408,1734609663,VU +1734609664,1734609919,AU +1734609920,1734612991,IN +1734612992,1734613503,AU +1734613504,1734613759,NZ +1734613760,1734614015,ID +1734614016,1734615039,AU +1734615040,1734616063,CN +1734616064,1734617087,IN +1734617088,1734618111,CN +1734618112,1734618623,AU +1734618624,1734619135,MY +1734619136,1734625279,CN +1734625280,1734626303,JP +1734626304,1734628351,IN +1734628352,1734628863,ID +1734628864,1734629375,NZ +1734629376,1734630399,CN +1734630400,1734631423,BD +1734631424,1734632447,ID +1734632448,1734632959,PH +1734632960,1734633215,NZ +1734633216,1734633471,PK +1734633472,1734633983,NZ +1734633984,1734634239,IN +1734634240,1734634495,AU +1734634496,1734635519,PH +1734635520,1734636543,HK +1734636544,1734637567,CN +1734637568,1734638591,AU +1734638592,1734639615,TW +1734639616,1734641663,ID +1734641664,1734642175,PH +1734642176,1734642687,HK +1734642688,1734644735,CN +1734644736,1734645247,AU +1734645248,1734645759,IN +1734645760,1734647807,HK +1734647808,1734648831,VN +1734648832,1734649855,TW +1734649856,1734650879,IN +1734650880,1734651903,ID +1734651904,1734652927,AU +1734652928,1734653951,ID +1734653952,1734654975,NZ +1734654976,1734655231,PK +1734655232,1734655999,JP +1734656000,1734656255,HK +1734656256,1734656511,ID +1734656512,1734656767,AU +1734656768,1734657023,ID +1734657024,1734658047,AU +1734658048,1734658303,MY +1734658304,1734658559,IN +1734658560,1734659071,PK +1734659072,1734660095,MY +1734660096,1734661119,HK +1734661120,1734664191,IN +1734664192,1734665215,AU +1734665216,1734666239,VN +1734666240,1734667263,BD +1734667264,1734669311,CN +1734669312,1734669567,BD +1734669568,1734669823,IN +1734669824,1734670335,ID +1734670336,1734672383,CN +1734672384,1734673407,US +1734673408,1734676479,CN +1734676480,1734677503,MM +1734677504,1734678527,ID +1734678528,1734679551,IN +1734679552,1734680575,CN +1734680576,1734681599,VN +1734681600,1734682623,NP +1734682624,1734683135,AU +1734683136,1734683391,NZ +1734683392,1734683647,IN +1734683648,1734684671,PH +1734684672,1734685695,MY +1734685696,1734685951,ID +1734685952,1734686719,BD +1734686720,1734687743,IN +1734687744,1734688767,CN +1734688768,1734689023,IN +1734689024,1734689279,AU +1734689280,1734689791,ID +1734689792,1734690815,IN +1734690816,1734691839,JP +1734691840,1734692863,VN +1734692864,1734693887,KH +1734693888,1734694911,BD +1734694912,1734696447,IN +1734696448,1734696703,AU +1734696704,1734696959,ID +1734696960,1734697983,HK +1734697984,1734699007,IN +1734699008,1734700031,ID +1734700032,1734703103,IN +1734703104,1734705151,CN +1734705152,1734706175,AU +1734706176,1734706431,IN +1734706432,1734706687,AU +1734706688,1734706943,IN +1734706944,1734707199,AU +1734707200,1734708223,ID +1734708224,1734709247,IN +1734709248,1734711295,CN +1734711296,1734711551,SG +1734711552,1734711807,US +1734711808,1734712319,ID +1734712320,1734713343,KH +1734713344,1734714367,VN +1734714368,1734714879,AF +1734714880,1734716415,AU +1734716416,1734716671,IN +1734716672,1734716927,AU +1734716928,1734717439,IN +1734717440,1734718463,GB +1734718464,1734720511,CN +1734720512,1734720767,KR +1734720768,1734721535,HK +1734721536,1734721791,VU +1734721792,1734722047,AU +1734722048,1734722559,ID +1734722560,1734723583,BD +1734723584,1734724607,SG +1734724608,1734725631,HK +1734725632,1734726655,KH +1734726656,1734727167,IN +1734727168,1734727423,AU +1734727424,1734727679,HK +1734727680,1734728703,MN +1734728704,1734729727,JP +1734729728,1734731775,ID +1734731776,1734732031,PK +1734732032,1734732287,IN +1734732288,1734732799,AU +1734732800,1734733311,NP +1734733312,1734733567,SG +1734733568,1734733823,ID +1734733824,1734734847,FJ +1734734848,1734735871,MY +1734735872,1734736127,HK +1734736128,1734736895,BD +1734736896,1734737151,NP +1734737152,1734737407,BD +1734737408,1734737919,MY +1734737920,1734738431,ID +1734738432,1734738687,IN +1734738688,1734738943,JP +1734738944,1734739967,HK +1734739968,1734740991,AU +1734740992,1734742015,ID +1734742016,1734743039,US +1734743040,1734744063,VN +1734744064,1734744319,AU +1734744320,1734744831,IN +1734744832,1734745087,BD +1734745088,1734746111,IN +1734746112,1734747135,HK +1734747136,1734747647,NP +1734747648,1734747903,PK +1734747904,1734748159,AU +1734748160,1734748671,PK +1734748672,1734749183,BD +1734749184,1734749439,HK +1734749440,1734750207,GI +1734750208,1734750719,HK +1734750720,1734751487,NZ +1734751488,1734751743,AU +1734751744,1734753279,IN +1734753280,1734754303,ID +1734754304,1734757375,IN +1734757376,1734759423,CN +1734759424,1734764799,IN +1734764800,1734765055,AU +1734765056,1734765567,IN +1734765568,1734766591,NZ +1734766592,1734767615,ID +1734767616,1734768127,IN +1734768128,1734768383,AU +1734768384,1734769663,IN +1734769664,1734770687,PH +1734770688,1734771711,VN +1734771712,1734773759,BD +1734773760,1734774783,ID +1734774784,1734775295,IN +1734775296,1734775551,ID +1734775552,1734775807,IN +1734775808,1734777855,ID +1734777856,1734778879,PK +1734778880,1734779903,US +1734779904,1734780415,AU +1734780416,1734780671,US +1734780672,1734780927,ID +1734780928,1734782975,CN +1734782976,1734783487,ID +1734783488,1734783999,AU +1734784000,1734790143,CN +1734790144,1734791167,BD +1734791168,1734793215,CN +1734793216,1734794239,BD +1734794240,1734794751,AF +1734794752,1734797823,AU +1734797824,1734798079,IN +1734798080,1734798335,SG +1734798336,1734799359,BD +1734799360,1734800383,MY +1734800384,1734800639,IN +1734800640,1734800895,AU +1734800896,1734801407,BD +1734801408,1734802175,ID +1734802176,1734802431,IN +1734802432,1734803455,BD +1734803456,1734803711,PH +1734803712,1734803967,AU +1734803968,1734804991,IN +1734804992,1734805503,BD +1734805504,1734806527,IN +1734806528,1734808575,CN +1734808576,1734810623,ID +1734810624,1734811135,IN +1734811136,1734811647,ID +1734811648,1734812671,BD +1734812672,1734813695,CN +1734813696,1734814207,NZ +1734814208,1734814719,PK +1734814720,1734815743,NZ +1734815744,1734816767,US +1734816768,1734818815,IN +1734818816,1734819839,SG +1734819840,1734820351,HK +1734820352,1734820607,MV +1734820608,1734820863,TH +1734820864,1734822911,CN +1734822912,1734823935,AU +1734823936,1734824959,TW +1734824960,1734825983,AU +1734825984,1734826495,BD +1734826496,1734828031,IN +1734828032,1734828543,NZ +1734828544,1734830079,BD +1734830080,1734832127,AU +1734832128,1734832383,PK +1734832384,1734832639,IN +1734832640,1734832895,AU +1734832896,1734833151,CH +1734833152,1734834175,VN +1734834176,1734835199,IN +1734835200,1734836223,BD +1734836224,1734837247,TW +1734837248,1734838271,IN +1734838272,1734839295,ID +1734839296,1734839807,AU +1734839808,1734840319,IN +1734840320,1734841343,ID +1734841344,1734842367,AU +1734842368,1734843391,SG +1734843392,1734844415,MY +1734844416,1734845439,IN +1734845440,1734847487,JP +1734847488,1734848255,IN +1734848256,1734848511,ID +1734848512,1734849535,CN +1734849536,1734850047,ID +1734850048,1734850559,PG +1734850560,1734851583,AU +1734851584,1734852607,CN +1734852608,1734853119,ID +1734853120,1734853375,MM +1734853376,1734854655,IN +1734854656,1734856703,CN +1734856704,1734857215,IN +1734857216,1734857727,AU +1734857728,1734858751,IN +1734858752,1734859263,AU +1734859264,1734859519,NZ +1734859520,1734859775,IN +1734859776,1734863871,CN +1734863872,1734864383,IN +1734864384,1734864639,AU +1734864640,1734864895,BD +1734864896,1734865151,SG +1734865152,1734865407,HK +1734865408,1734865663,CN +1734865664,1734865919,SG +1734865920,1734866943,HK +1734866944,1734871039,CN +1734871040,1734871551,AU +1734871552,1734871807,ID +1734871808,1734872063,HK +1734872064,1734873087,ID +1734873088,1734874111,PH +1734874112,1734875135,JP +1734875136,1734876159,VN +1734876160,1734877183,NP +1734877184,1734877695,AU +1734877696,1734878207,ID +1734878208,1734880255,CN +1734880256,1734883583,IN +1734883584,1734883839,ID +1734883840,1734884351,IN +1734884352,1734885375,AU +1734885376,1734886399,CN +1734886400,1734886655,IN +1734886656,1734886911,MY +1734886912,1734889471,IN +1734889472,1734890495,AU +1734890496,1734891007,PK +1734891008,1734891263,BD +1734891264,1734891519,PK +1734891520,1734892543,JP +1734892544,1734893567,IN +1734893568,1734894079,PK +1734894080,1734894335,SG +1734894336,1734894591,ID +1734894592,1734895615,PH +1734895616,1734896639,CN +1734896640,1734898687,IN +1734898688,1734900735,VN +1734900736,1734902271,IN +1734902272,1734902527,ID +1734902528,1734902783,US +1734902784,1734904831,ID +1734904832,1734905855,BD +1734905856,1734906367,ID +1734906368,1734906879,AF +1734906880,1734907903,TW +1734907904,1734908927,CN +1734908928,1734909951,AU +1734909952,1734910975,PK +1734910976,1734911999,AU +1734912000,1734914047,CN +1734914304,1734914559,ID +1734914560,1734914815,HK +1734914816,1734915071,TH +1734915072,1734916095,IN +1734916096,1734917119,BD +1734917120,1734918143,CN +1734918144,1734919167,MY +1734919168,1734919423,SG +1734919424,1734919679,NP +1734919680,1734920191,CN +1734920192,1734920703,AU +1734920704,1734921215,IN +1734921216,1734922239,ID +1734922240,1734923263,IN +1734923264,1734924287,PK +1734924288,1734925311,BD +1734925312,1734925567,HK +1734925568,1734927359,IN +1734927360,1734927615,KH +1734927616,1734927871,SG +1734927872,1734928127,AU +1734928128,1734928383,IN +1734928384,1734929407,NP +1734929408,1734930943,AU +1734930944,1734931455,BD +1734931456,1734931967,HK +1734931968,1734932479,NL +1740636160,1740644351,CN +1740644352,1740645375,IN +1740645376,1740647423,HK +1740647424,1740648447,MO +1740648448,1740651519,CN +1740651520,1740653567,IN +1740653568,1740654591,JP +1740654592,1740655615,IN +1740655616,1740656639,NP +1740656640,1740656895,NZ +1740656896,1740657151,AF +1740657152,1740657663,AU +1740657664,1740665855,CN +1740665856,1740666879,IN +1740666880,1740667903,JP +1740667904,1740668927,PH +1740668928,1740674047,CN +1740674048,1740675071,JP +1740675072,1740676095,AU +1740676096,1740677119,BD +1740677120,1740678143,HK +1740678144,1740679167,CN +1740679168,1740680447,IN +1740680448,1740680703,AU +1740680704,1740680959,MM +1740680960,1740681215,AU +1740681216,1740682239,HK +1740682240,1740683263,KH +1740683264,1740684287,PH +1740684288,1740685311,CN +1740685312,1740686591,AU +1740686592,1740686847,NZ +1740686848,1740687359,IN +1740687360,1740688383,HK +1740688384,1740689407,IN +1740689408,1740692479,CN +1740692480,1740693503,IN +1740693504,1740694527,HK +1740694528,1740696575,JP +1740696576,1740697599,VN +1740697600,1740698623,NZ +1740698624,1740700671,IN +1740700672,1740701695,CN +1740701696,1740702719,IN +1740702720,1740703743,SG +1740703744,1740704255,NZ +1740704256,1740704767,AU +1740704768,1740705791,JP +1740705792,1740706047,NZ +1740706048,1740706303,AU +1740706304,1740706559,PK +1740706560,1740706815,ID +1740706816,1740709887,IN +1740709888,1740710911,HK +1740710912,1740711423,IN +1740711424,1740711935,NZ +1740711936,1740713983,CN +1740713984,1740719103,IN +1740719104,1740720127,HK +1740721152,1740721407,AU +1740721408,1740721663,IN +1740721664,1740721919,AU +1740721920,1740722175,IN +1740722176,1740723199,AU +1740723200,1740731391,IN +1740731392,1740732415,ID +1740732416,1740733439,CN +1740733440,1740733695,SG +1740733696,1740733951,HK +1740733952,1740734207,SG +1740734208,1740736511,HK +1740736512,1740737535,NZ +1740737536,1740740607,CN +1740740608,1740742655,IN +1740742656,1740743679,CN +1740743936,1740744191,PH +1740744192,1740744703,AU +1740744704,1740745727,BD +1740745728,1740746751,HK +1740747776,1740748799,KH +1740748800,1740749823,HK +1740749824,1740751871,CN +1740751872,1740753919,IN +1740753920,1740754943,KH +1740754944,1740755967,AU +1740755968,1740764159,CN +1740764160,1740766207,HK +1740766208,1740767231,IN +1740767232,1740769279,AU +1740769280,1740771327,IN +1740771328,1740772351,CN +1740772352,1740776447,IN +1740776448,1740777471,HK +1740777472,1740778239,JP +1740778240,1740778495,HK +1740778496,1740779519,IN +1740779520,1740780543,AU +1740780544,1740784639,IN +1740784640,1740784895,AU +1740784896,1740785663,IN +1740785664,1740786687,JP +1740786688,1740787711,SG +1740787712,1740788735,MY +1740788736,1740789759,KH +1740789760,1740790783,IN +1740790784,1740791807,PK +1740791808,1740792831,IN +1740792832,1740794879,HK +1740794880,1740795903,KR +1740795904,1740796159,NZ +1740796160,1740796415,AU +1740796416,1740796671,IN +1740796672,1740796927,AU +1740796928,1740798207,IN +1740798208,1740798463,AU +1740798464,1740798975,IN +1740798976,1740799999,AU +1740800000,1740800511,IN +1740800512,1740800767,ID +1740800768,1740805119,IN +1740805120,1740806143,HK +1740806144,1740809215,IN +1740809216,1740810239,JP +1740810240,1740811263,NL +1740811264,1740812287,ID +1740812288,1740813311,MN +1740813312,1740814335,IN +1740814336,1740815359,HK +1740815360,1740816383,VN +1740816384,1740821503,IN +1740821504,1740822015,HK +1740822016,1740822527,AU +1740822528,1740825599,IN +1740825856,1740826111,AU +1740826112,1740826623,SG +1740826624,1740827647,IN +1740827648,1740828671,HK +1740828672,1740829695,IN +1740829696,1740830719,HK +1740830720,1740831743,IN +1740831744,1740832767,KR +1740832768,1740833791,BD +1740833792,1740834815,HK +1740834816,1740835839,NZ +1740835840,1740836863,AU +1740836864,1740837119,IN +1740837376,1740837887,ID +1740837888,1740838911,MY +1740838912,1740839935,IN +1740839936,1740840959,ID +1740840960,1740841983,SG +1740841984,1740845055,IN +1740845056,1740846079,HK +1740846080,1740846591,AU +1740846592,1740847103,BD +1740847104,1740848127,ID +1740848128,1740849407,AU +1740849408,1740849663,ID +1740849664,1740850175,AU +1740850176,1740855295,IN +1740855296,1740856319,ID +1740856320,1740858367,IN +1740858368,1740859391,US +1740859392,1740860415,CN +1740860416,1740861439,HK +1740861440,1740862463,CN +1740862464,1740863487,HK +1740863488,1740865535,IN +1740865536,1740866559,AU +1740866560,1740867583,HK +1740867584,1740868607,CN +1740868608,1740869119,BD +1740869120,1740869375,ID +1740869376,1740869631,MY +1740869632,1740870655,JP +1740870656,1740872703,CN +1740872704,1740873727,ID +1740873728,1740874751,CN +1740874752,1740876287,ID +1740876288,1740876799,AU +1740876800,1740880639,IN +1740880640,1740880895,HK +1740880896,1740881919,SG +1740881920,1740882943,CN +1740882944,1740884991,IN +1740884992,1740885503,BD +1740885504,1740886015,AU +1740886016,1740893183,IN +1740893184,1740895231,VN +1740895232,1740901375,IN +1740901376,1740901887,TH +1740901888,1740902143,ID +1740902400,1740903423,VN +1740903424,1740904447,US +1740904448,1740904959,NZ +1740904960,1740907519,IN +1740907520,1740908543,US +1740908544,1740909055,PK +1740909056,1740910591,ID +1740910592,1740911615,CN +1740911616,1740912639,IN +1740912640,1740913663,PH +1740913664,1740915711,CN +1740915712,1740916735,AU +1740916736,1740917759,CN +1740917760,1740918783,IN +1740918784,1740920063,AU +1740920320,1740920831,HK +1740920832,1740923903,CN +1740923904,1740924927,HK +1740924928,1740925951,PH +1740925952,1740926463,NZ +1740926464,1740926719,IN +1740926720,1740926975,AU +1740926976,1740927999,SG +1740928000,1740928255,ID +1740928256,1740928511,IN +1740928512,1740929023,AU +1740929024,1740931071,HK +1740931072,1740932095,PH +1740932096,1740933119,IN +1740933120,1740934143,PH +1740934144,1740935167,SG +1740936192,1740937215,AU +1740938240,1740938495,AU +1740938496,1740938751,IN +1740938752,1740939263,TH +1740939264,1740940287,PK +1740941312,1740942335,CN +1740942336,1740943359,TW +1740944384,1740945407,US +1740946432,1740947967,IN +1740947968,1740948223,AU +1740948224,1740948479,MY +1740948480,1740950527,IN +1740950528,1740951551,CN +1740951552,1740957695,IN +1740957696,1740958719,BD +1740958720,1740959743,VN +1740959744,1740960767,NL +1740960768,1740962303,VN +1740962304,1740962559,TW +1740962560,1740962815,VN +1740962816,1740964863,SG +1740964864,1740965887,HK +1740965888,1740966399,IN +1740966400,1740966655,VN +1740966656,1740966911,HK +1740966912,1740967935,JP +1740967936,1740968959,IN +1740968960,1740969983,MY +1740969984,1740971007,HK +1740971008,1740975103,IN +1740975104,1740976127,PK +1740976128,1740976639,BD +1740976896,1740977151,IN +1740977152,1740977663,NZ +1740977664,1740977919,GB +1740977920,1740978175,NZ +1740978176,1740979199,MY +1740979200,1740980223,NZ +1740980224,1740981247,AU +1740981248,1740982271,HK +1740982272,1740985343,IN +1740985344,1740986367,PH +1740986368,1740986623,AU +1740986624,1740986879,ID +1740986880,1740987391,IN +1740987392,1740988415,ID +1740988416,1740989184,AU +1740989185,1740989439,SG +1740989440,1740990463,IN +1740990464,1740991487,KH +1740991488,1741000703,IN +1741000704,1741001727,AU +1741001728,1741002751,HK +1741002752,1741003775,BD +1741004800,1741005823,AU +1741005824,1741006847,MV +1741006848,1741007871,HK +1741007872,1741008895,TW +1741008896,1741009919,BT +1741009920,1741010943,CN +1741010944,1741011455,IN +1741011456,1741011967,AU +1741011968,1741012991,ID +1741012992,1741014015,HK +1741014016,1741015039,MM +1741015040,1741016063,PH +1741016064,1741017087,BD +1741017088,1741018111,JP +1741018112,1741019135,AU +1741019136,1741020159,HK +1741020160,1741022207,IN +1741022208,1741023231,CN +1741023232,1741025279,AU +1741025280,1741026303,IN +1741026304,1741027327,TH +1741027328,1741028351,BD +1741028352,1741028519,CN +1741028520,1741028520,HK +1741028521,1741028607,CN +1741029376,1741029631,SG +1741029632,1741029887,HK +1741029888,1741030399,BD +1741030400,1741031423,JP +1741031424,1741031935,NP +1741031936,1741032447,IN +1741032448,1741033471,JP +1741033472,1741033983,MY +1741033984,1741034495,HK +1741034496,1741035519,CN +1741035520,1741036031,AU +1741036544,1741037567,IN +1741037568,1741038079,AU +1741038080,1741038591,IN +1741038592,1741039615,JP +1741039616,1741040639,AU +1741040640,1741042687,HK +1741042688,1741043199,MY +1741043200,1741043711,AU +1741043712,1741044735,HK +1741044736,1741046783,CN +1741046784,1741047807,MY +1741047808,1741048831,CN +1741048832,1741049855,SG +1741049856,1741050367,IN +1741050368,1741050623,HK +1741050624,1741050879,IN +1741050880,1741051903,MY +1741051904,1741052927,PH +1741052928,1741053183,AU +1741053184,1741053439,ID +1741053952,1741055999,IN +1741056000,1741056511,NZ +1741056512,1741057023,AU +1741057024,1741058047,JP +1741058048,1741058559,AU +1741058560,1741061119,ID +1741061120,1741062143,CN +1741062144,1741062655,IN +1741062656,1741062911,AU +1741062912,1741063167,ID +1741063168,1741065215,BD +1741065216,1741067263,SG +1741067264,1741068287,MM +1741069312,1741070335,CN +1741070336,1741071359,JP +1741071360,1741072383,IN +1741072384,1741073407,BD +1741073408,1741074431,IN +1741074432,1741075455,TL +1741075456,1741076479,CN +1741076480,1741077247,NZ +1741077248,1741077503,IN +1741077504,1741079551,HK +1741079552,1741081599,CN +1741081600,1741082623,HK +1741082624,1741084671,JP +1741084672,1741092863,CN +1741092864,1741093887,HK +1741093888,1741094911,BD +1741094912,1741095423,NZ +1741095424,1741095935,ID +1741095936,1741115391,VN +1741115392,1741115647,AU +1741115648,1741115903,NZ +1741115904,1741116415,AU +1741116416,1741117439,BD +1741117440,1741119487,IN +1741119488,1741119743,AU +1741119744,1741120511,IN +1741120512,1741122559,HK +1741122560,1741123583,BD +1741123584,1741125119,IN +1741125120,1741125375,ID +1741125376,1741125631,AU +1741125632,1741128703,IN +1741128704,1741129727,JP +1741129728,1741130751,IN +1741131776,1741132799,IN +1741132800,1741133823,MY +1741133824,1741134847,BD +1741134848,1741136895,IN +1741136896,1741137919,CN +1741137920,1741138431,BD +1741138432,1741138943,TH +1741138944,1741145087,IN +1741145088,1741146111,CN +1741146112,1741150207,IN +1741150208,1741151231,MY +1741151232,1741152255,JP +1741152256,1741153279,IN +1741153280,1741154303,CN +1741154304,1741155327,BD +1741155328,1741156351,ID +1741156352,1741157375,IN +1741157376,1741158399,HK +1741158400,1741160447,CN +1741160448,1741161471,TW +1741161472,1741161727,SG +1741161728,1741162239,HK +1741162240,1741162495,ID +1741162496,1741164543,AU +1741164544,1741165567,ID +1741165568,1741167615,VN +1741167616,1741168639,HK +1741168640,1741169663,CN +1741169664,1741170687,BD +1741170688,1741173759,IN +1741173760,1741174783,CN +1741174784,1741175807,IN +1741175808,1741176831,VN +1741176832,1741178879,CN +1741178880,1741183999,IN +1741184000,1741185023,BD +1741185024,1741185279,HK +1741185280,1741185535,JP +1741185536,1741186047,HK +1741186048,1741188607,IN +1741188608,1741188863,US +1741188864,1741189119,IN +1741189120,1741191167,HK +1741191168,1741192191,VN +1741192192,1741193215,HK +1741193216,1741194239,ID +1741194240,1741195263,MM +1741195264,1741210623,CN +1741210624,1741211647,PK +1741211648,1741212415,TW +1741212416,1741212671,SG +1741213696,1741214719,SG +1741214720,1741215743,IN +1741215744,1741216767,SG +1741216768,1741232127,CN +1741232128,1741233151,HK +1741233152,1741243391,CN +1741243392,1741245439,HK +1741245440,1741257727,CN +1741257728,1741258751,IN +1741258752,1741259007,JP +1741259008,1741259263,HK +1741259264,1741259775,JP +1741259776,1741264895,IN +1741264896,1741303807,CN +1741303808,1741304831,HK +1741304832,1741305855,BD +1741305856,1741329407,CN +1741329408,1741330431,MH +1741330432,1741344767,CN +1741344768,1741345791,AU +1741345792,1741346815,CN +1741346816,1741347327,JP +1741347328,1741347583,PH +1741347584,1741347839,AU +1741347840,1741348863,BD +1741348864,1741349375,PH +1741349376,1741349631,IN +1741349632,1741349887,ID +1741349888,1741350911,CN +1741350912,1741351935,US +1741351936,1741366271,CN +1741366272,1741367295,IN +1741367296,1741368319,US +1741368320,1741369343,PK +1741369344,1741370367,HK +1741370368,1741372415,CN +1741372416,1741376511,IN +1741376512,1741377535,ID +1741377536,1741379583,IN +1741380352,1741380607,ID +1741380608,1741381631,BD +1741381632,1741390847,CN +1741390848,1741391871,MM +1741391872,1741392895,IN +1741392896,1741393919,CN +1741393920,1741394943,IN +1741394944,1741395967,HK +1741395968,1741396991,SG +1741396992,1741398015,JP +1741398016,1741398783,ID +1741398784,1741399039,AU +1741399040,1741401087,CN +1741401088,1741402111,IN +1741402112,1741403135,BD +1741403136,1741404159,HK +1741404160,1741405183,IN +1741405184,1741405439,NZ +1741405440,1741405695,ID +1741405696,1741406207,AU +1741406208,1741407231,CN +1741407232,1741408255,AU +1741408256,1741409279,CN +1741409280,1741411327,IN +1741411328,1741413375,CN +1741413376,1741413631,HK +1741413632,1741413887,SG +1741413888,1741414143,JP +1741414144,1741414399,HK +1741414400,1741423615,IN +1741423616,1741425663,MY +1741425664,1741425919,TH +1741425920,1741426175,JP +1741426176,1741426687,AU +1741426688,1741427711,MM +1741427712,1741428735,IN +1741428736,1741429759,CN +1741429760,1741436927,IN +1741436928,1741437951,JP +1741437952,1741438975,PH +1741438976,1741439999,JP +1741440000,1741440511,SG +1741440512,1741440767,IN +1741441024,1741442047,CN +1741442048,1741443071,HK +1741443072,1741445119,BD +1741445120,1741446143,CN +1741446144,1741446175,US +1741446176,1741447167,SG +1741447168,1741448191,HK +1741448192,1741449215,MM +1741449216,1741450239,AU +1741450240,1741451263,HK +1741451264,1741452287,CN +1741452544,1741452799,AU +1741452800,1741453055,ID +1741453056,1741455359,IN +1741455360,1741456383,BD +1741456384,1741457407,IN +1741457408,1741462527,CN +1741462528,1741466623,IN +1741466624,1741466879,JP +1741466880,1741467391,HK +1741467392,1741467647,JP +1741467648,1741469695,HK +1741469696,1741472767,IN +1741472768,1741473791,CN +1741473792,1741474815,BD +1741474816,1741475839,IN +1741475840,1741476863,BD +1741476864,1741477887,AU +1741477888,1741478655,IN +1741478656,1741478911,AU +1741478912,1741479935,NP +1741479936,1741480447,AU +1741480448,1741480959,NZ +1741480960,1741481471,AU +1741481472,1741481727,JP +1741481728,1741481983,IN +1741481984,1741484031,CN +1741484032,1741485055,AU +1741485056,1741486079,BD +1741486080,1741487103,NZ +1741487104,1741489151,HK +1741489152,1741490175,CN +1741490176,1741490687,HK +1741490688,1741490943,CN +1741490944,1741491199,HK +1741491200,1741492223,IN +1741492224,1741493247,LA +1741493248,1741494271,HK +1741494272,1741495295,KH +1741495296,1741497343,AU +1741497856,1741498111,NZ +1741498112,1741498367,IN +1741498368,1741500415,CN +1741500416,1741501439,JP +1741501440,1741502463,CN +1741502464,1741502975,ID +1741502976,1741503487,BD +1741503488,1741505535,IN +1741505536,1741506559,BD +1741506560,1741507583,JP +1741507584,1741508607,SG +1741508608,1741508863,AU +1741508864,1741509119,SG +1741509120,1741509375,ID +1741509376,1741509631,IN +1741509632,1741510655,US +1741510656,1741511679,JP +1741511680,1741512703,IN +1741512704,1741515775,VN +1741515776,1741516799,CN +1741516800,1741517823,IN +1741517824,1741519871,CN +1741519872,1741521919,IN +1741521920,1741522943,BD +1741522944,1741523967,CN +1741523968,1741528063,IN +1741528064,1741529087,PH +1741529088,1741529599,TH +1741529600,1741529855,CN +1741529856,1741530111,IN +1741530112,1741531135,HK +1741531136,1741532159,JP +1741532160,1741533183,IN +1741533184,1741534207,PK +1741534208,1741535231,BD +1741535232,1741535487,JP +1741535488,1741535743,IN +1741535744,1741536255,SG +1741536256,1741540351,CN +1741540352,1741541375,AU +1741541376,1741542399,MY +1741542400,1741546495,IN +1741546496,1741547519,AU +1741547520,1741548543,BD +1741548544,1741549567,CN +1741549568,1741550591,HK +1741550592,1741551103,IN +1741551104,1741551615,AU +1741551616,1741554687,CN +1741554688,1741557759,IN +1741557760,1741558783,CA +1741558784,1741559807,HK +1741559808,1741560831,SG +1741560832,1741561087,AU +1741561088,1741561855,SG +1741561856,1741562879,NZ +1741562880,1741563903,HK +1741563904,1741564927,SG +1741564928,1741565951,CN +1741565952,1741572607,IN +1741572608,1741573119,KR +1741573120,1741574143,JP +1741574144,1741575167,PH +1741575168,1741576191,US +1741576192,1741577215,JP +1741577216,1741578239,HK +1741578240,1741578751,IN +1741578752,1741579007,SG +1741579008,1741581311,IN +1741581312,1741582335,CN +1741582336,1741584383,IN +1741584384,1741586431,HK +1741586432,1741591551,IN +1741591552,1741592575,CN +1741592576,1741593087,MN +1741593600,1741594111,HK +1741594368,1741596671,IN +1741596672,1741597695,ID +1741597696,1741597951,IN +1741597952,1741598207,MM +1741598208,1741600767,IN +1741600768,1741601279,BD +1741601280,1741601535,ID +1741601536,1741601791,AU +1741601792,1741602815,HK +1741602816,1741603839,MN +1741603840,1741604863,JP +1741604864,1741605887,KH +1741605888,1741606911,TH +1741606912,1741607935,IN +1741607936,1741609983,VN +1741609984,1741612031,IN +1741612032,1741613055,BD +1741613056,1741614079,HK +1741614080,1741615103,AU +1741615104,1741617151,ID +1741617152,1741618175,IN +1741618176,1741619199,ID +1741619200,1741623295,IN +1741623296,1741623551,NZ +1741623552,1741623807,IN +1741623808,1741624063,AU +1741624064,1741624319,MY +1741624320,1741625343,JP +1741625344,1741626367,HK +1741626368,1741627391,AU +1741627392,1741629439,VN +1741629440,1741631487,IN +1741631488,1741632511,CN +1741632512,1741636607,IN +1741636608,1741637631,HK +1741637632,1741638655,MY +1741638656,1741639679,NZ +1741639680,1741640703,NP +1741640704,1741641727,PK +1741642752,1741643007,AU +1741643008,1741643263,HK +1741643264,1741643775,AU +1741643776,1741644799,ID +1741644800,1741645311,IN +1741645312,1741645567,AU +1741645568,1741645823,IN +1741645824,1741646847,CN +1741646848,1741647871,SG +1741647872,1741648895,KH +1741648896,1741649919,HK +1741649920,1741658111,IN +1741658112,1741658623,BD +1741658624,1741659135,AU +1741659136,1741659647,SG +1741659648,1741659903,PH +1741659904,1741660159,HK +1741660160,1741661183,US +1741661184,1741662207,CN +1741662208,1741666303,IN +1741666304,1741674495,CN +1741674496,1741675519,JP +1741675520,1741676543,CN +1741676544,1741677567,IN +1741677568,1741679615,CN +1741679616,1741680639,ID +1741680640,1741683711,IN +1741683712,1741684735,TW +1741684736,1741685247,HK +1741685248,1741685503,AU +1741685504,1741685759,SG +1741685760,1741686783,AU +1741686784,1741687807,HK +1741687808,1741689855,CN +1741689856,1741690367,IN +1741690368,1741690623,AU +1741690624,1741690879,ID +1741690880,1741691903,TH +1741691904,1741692927,CN +1741692928,1741693951,HK +1741693952,1741694975,TL +1741694976,1741698047,CN +1741698048,1741706239,IN +1741706240,1741706751,SG +1741706752,1741707263,NZ +1741707264,1741708287,IN +1741708288,1741708799,AU +1741708800,1741709311,ID +1741709312,1741710335,JP +1741710336,1741711359,ID +1741711360,1741718527,IN +1741718528,1741719551,BD +1741719552,1741720063,ID +1741720064,1741720575,TH +1741720576,1741721599,NZ +1741721600,1741722623,IN +1741722624,1741723647,CN +1741723648,1741724415,IN +1741724416,1741724671,AU +1741724672,1741725695,IN +1741725696,1741726719,ID +1741726720,1741726975,NZ +1741726976,1741727743,AU +1741727744,1741729791,IN +1741729792,1741730815,HK +1741730816,1741731839,BD +1741731840,1741733887,AU +1741733888,1741734911,HK +1741734912,1741735423,TW +1741735424,1741735679,IN +1741735680,1741735935,AU +1741735936,1741736959,IN +1741736960,1741737983,ID +1741737984,1741739007,IN +1741739008,1741740031,TH +1741740032,1741741055,AU +1741741056,1741742079,JP +1741742080,1741747358,IN +1741747359,1741747359,NL +1741747360,1741749247,IN +1741749248,1741750527,SG +1741750528,1741750783,ID +1741750784,1741751807,AU +1741751808,1741752831,ID +1741752832,1741753087,NZ +1741753088,1741753343,BD +1741753344,1741754367,NZ +1741754368,1741755391,IN +1741755392,1741756415,BD +1741756416,1741756927,AU +1741756928,1741757439,IN +1741757440,1741758463,HK +1741759488,1741760511,IN +1741760512,1741761535,HK +1741761536,1741762559,AU +1741762560,1741763583,TH +1741763584,1741764095,PK +1741764096,1741764351,PG +1741764352,1741764607,AU +1741764608,1741765631,PH +1741765632,1741766655,HK +1741766656,1741768703,IN +1741768704,1741769727,AU +1741769728,1741770239,GB +1741770240,1741770495,PK +1741770496,1741770751,PR +1741770752,1741771775,BD +1741771776,1741772799,PK +1741772800,1741774591,IN +1741774592,1741774847,ID +1741774848,1741775359,IN +1741775360,1741775615,ID +1741775616,1741775871,IN +1741775872,1741776895,HK +1741776896,1741777919,MY +1741778432,1741778943,IN +1741778944,1741779967,CN +1741779968,1741780991,JP +1741780992,1741782015,SG +1741782016,1741783039,AU +1741783040,1741783551,SG +1741783552,1741784063,ID +1741784064,1741785087,IN +1741785088,1741786111,CN +1741786112,1741788159,IN +1741788160,1741789183,JP +1741789184,1741789695,AU +1741790208,1741791231,MY +1741791232,1741792255,AU +1741792256,1741794303,SG +1741794304,1741795327,KR +1741795328,1741797375,IN +1741797376,1741798399,ID +1741798400,1741798911,AU +1741798912,1741799167,SG +1741799168,1741799423,AU +1741799424,1741800447,NZ +1741800448,1741801471,BD +1741801472,1741802495,CN +1741802496,1741803519,IN +1741803520,1741804543,CN +1741804544,1741805567,IN +1741805568,1741806591,CN +1741806592,1741807615,IN +1741807616,1741808639,NZ +1741808640,1741809663,BD +1741809664,1741810687,HK +1741810688,1741811711,JP +1741811712,1741812223,IN +1741812224,1741813759,AU +1741813760,1741814783,ID +1741814784,1741815807,JP +1741815808,1741816831,CN +1741816832,1741817855,PK +1741817856,1741818367,PH +1741818368,1741819902,AU +1741819903,1741819903,PK +1741819904,1741820927,BD +1741820928,1741821951,CN +1741821952,1741822975,AU +1741822976,1741824511,IN +1741824512,1741825023,ID +1741825024,1741830143,IN +1741830144,1741832191,BD +1741832192,1741833215,IN +1741834240,1741835263,IN +1741835264,1741836287,AU +1741836288,1741837311,IN +1741837312,1741838335,JP +1741838336,1741840383,IN +1741840384,1741841407,CN +1741841408,1741842687,IN +1741842688,1741842943,ID +1741842944,1741843455,IN +1741843456,1741844479,JP +1741844480,1741844991,IN +1741845504,1741847551,ID +1741847552,1741848063,AU +1741849600,1741850623,IN +1741850624,1741851647,AU +1741851648,1741853695,IN +1741853696,1741854719,AU +1741854720,1741855231,TH +1741855232,1741855743,AU +1741855744,1741864959,CN +1741864960,1741865215,AU +1741865216,1741865471,ID +1741865472,1741869055,IN +1741869056,1741869311,NZ +1741869312,1741869567,AU +1741869568,1741869823,DE +1741869824,1741870079,NZ +1741870080,1741871103,SG +1741871104,1741872127,CN +1741872128,1741872383,HK +1741872384,1741872639,IN +1741872640,1741872895,PH +1741872896,1741873151,AU +1741873152,1741874175,IN +1741874176,1741875199,ID +1741875200,1741879295,HK +1741879296,1741879807,AU +1741879808,1741880063,IN +1741880064,1741880319,AU +1741880320,1741881343,IN +1741881344,1741882367,US +1741882368,1741882879,IN +1741882880,1741883391,AU +1741883392,1741887487,IN +1741887488,1741887999,NZ +1741888000,1741888255,IN +1741888256,1741888511,US +1741888512,1741889535,BD +1741889536,1741890559,HK +1741890560,1741892607,IN +1741892608,1741893631,CN +1741893632,1741893887,AU +1741893888,1741894655,ID +1741894656,1741897727,IN +1741897728,1741898751,SG +1741898752,1741899775,HK +1741899776,1741900799,JP +1741900800,1741902335,IN +1741902336,1741902847,ID +1741902848,1741904895,IN +1741904896,1741905919,HK +1741905920,1741907967,CN +1741907968,1741911039,IN +1741911040,1741911551,JP +1741911552,1741912063,SG +1741912064,1741913087,NZ +1741913088,1741914111,HK +1741914112,1741917183,IN +1741917184,1741917951,AU +1741917952,1741918207,ID +1741918208,1741918463,IT +1741918464,1741918591,ES +1741918592,1741918719,PT +1741918720,1741918847,SI +1741918848,1741918975,GR +1741918976,1741919103,CZ +1741919104,1741919231,HU +1741919232,1741920255,NP +1741920256,1741921279,IN +1741921280,1741922303,CN +1741922304,1741923327,US +1741923328,1741923583,TH +1741923584,1741923839,CN +1741923840,1741924095,TH +1741924096,1741925375,CN +1741925376,1741925631,AU +1741925632,1741925887,HK +1741925888,1741926399,PH +1741926400,1741927423,IN +1741927424,1741928447,US +1741928448,1741928959,BD +1741928960,1741930495,IN +1741930496,1741931519,CN +1741931520,1741932031,IN +1741932032,1741932287,HK +1741932288,1741932543,AU +1741934592,1741935615,AU +1741935616,1741936639,VN +1741936640,1741937151,IN +1741937152,1741937663,SC +1741937664,1741940479,CN +1741940480,1741940735,HK +1741940736,1741941759,ID +1741941760,1741942271,HK +1741942272,1741942527,AU +1741942528,1741942783,MY +1741942784,1741943807,AU +1741943808,1741944831,HK +1741944832,1741945855,CN +1741945856,1741946879,US +1741946880,1741950975,CN +1741950976,1741953023,IN +1741953024,1741954047,GU +1741954048,1741955071,IN +1741955072,1741956095,HK +1741956096,1741957119,TH +1741957120,1741957375,PG +1741957376,1741957631,MY +1741957632,1741957887,AU +1741957888,1741958143,ID +1741958144,1741960191,CN +1741960192,1741961215,NZ +1741961216,1741961471,HK +1741961472,1741961727,JP +1741961728,1741962239,HK +1741962240,1741963263,SG +1741963264,1741963775,NP +1741963776,1741964287,AU +1741964288,1741965311,MY +1741965312,1741966335,HK +1741966336,1741967359,JP +1741967360,1741968383,BD +1741968384,1741969407,CN +1741969408,1741971455,IN +1741971456,1741972479,HK +1741972480,1741975551,CN +1741975552,1741976575,AU +1741976576,1741977599,MN +1741977600,1741978111,IN +1741978112,1741978367,AU +1741978368,1741978623,NZ +1741978624,1741979647,KR +1741979648,1741984767,IN +1741984768,1741985791,CN +1741985792,1741987839,IN +1741988864,1741989887,CN +1741989888,1741990143,GB +1741990144,1741990911,SG +1741991936,1741992191,MY +1741992192,1741992447,IN +1741992960,1741993983,TH +1741993984,1741995007,HK +1741995008,1741996031,JP +1741996032,1741996543,NZ +1741996544,1741997055,AU +1741997056,1741999103,CN +1741999104,1742000639,IN +1742000640,1742000895,AU +1742000896,1742001151,ID +1742001152,1742002175,IN +1742002176,1742003199,AU +1742003200,1742004223,KR +1742004224,1742004479,NZ +1742004480,1742004991,AU +1742004992,1742005247,NZ +1742005248,1742006271,CN +1742006272,1742007039,ID +1742007040,1742007295,IN +1742007296,1742008319,ID +1742008320,1742009343,AU +1742009344,1742011391,KR +1742011392,1742012415,CN +1742012416,1742019583,IN +1742019584,1742020095,BD +1742020096,1742020351,MM +1742020352,1742020607,NP +1742020608,1742022655,IN +1742022656,1742038015,CN +1742038016,1742039039,AU +1742039040,1742040063,AF +1742040064,1742042111,PK +1742042112,1742043135,ID +1742043136,1742043647,AU +1742043648,1742044159,VN +1742044160,1742045183,NP +1742045184,1742046207,ID +1742046208,1742061567,CN +1742061568,1742062591,IN +1742063616,1742063871,AU +1742063872,1742064639,IN +1742064640,1742065663,TH +1742065664,1742070783,IN +1742070784,1742071039,MM +1742071040,1742071295,JP +1742071296,1742071807,MM +1742072832,1742074879,BD +1742074880,1742076927,HK +1742076928,1742077951,CN +1742077952,1742078975,BD +1742078976,1742079999,NL +1742080000,1742081023,VN +1742081024,1742082047,PH +1742082048,1742083071,HK +1742083072,1742083327,AU +1742083328,1742084095,IN +1742084096,1742085119,KR +1742085120,1742086143,AU +1742086144,1742087167,CN +1742087168,1742088191,JP +1742088192,1742088447,IN +1742088448,1742088703,HK +1742088704,1742089215,AU +1742089216,1742089727,IN +1742089728,1742090239,GB +1742090240,1742091263,CN +1742091264,1742092287,ID +1742092288,1742093311,HK +1742093312,1742095359,IN +1742095360,1742095615,KR +1742095616,1742095871,US +1742095872,1742096127,LT +1742096128,1742096383,AU +1742096384,1742097407,JP +1742097408,1742098431,NP +1742098432,1742099455,BD +1742099456,1742100479,CN +1742100480,1742101503,KR +1742101504,1742101759,DE +1742101760,1742102015,PL +1742102016,1742102271,AT +1742102272,1742102527,CH +1742103040,1742103295,AU +1742103296,1742104575,ID +1742104576,1742105599,NZ +1742105600,1742106623,US +1742106624,1742107135,ID +1742107136,1742108671,IN +1742108672,1742109183,ID +1742109184,1742113791,IN +1742113792,1742115839,HK +1742115840,1742116863,KH +1742116864,1742117887,JP +1742117888,1742118911,BD +1742119936,1742120959,HK +1742120960,1742121983,CN +1742121984,1742123007,HK +1742123008,1742123263,AU +1742123264,1742124031,IN +1742124032,1742125055,SG +1742125056,1742126079,ID +1742126080,1742127103,IN +1742127104,1742128127,HK +1742128128,1742129151,MY +1742129152,1742130175,BD +1742130176,1742130687,NZ +1742130688,1742132223,AU +1742132224,1742133247,CN +1742133248,1742134271,BD +1742134272,1742135295,AU +1742135296,1742136319,CN +1742136320,1742136575,FR +1742136576,1742136831,ID +1742136832,1742138367,IN +1742138368,1742139391,ID +1742139392,1742141439,CN +1742141440,1742142463,HK +1742142464,1742143487,SG +1742143488,1742146559,HK +1742146560,1742146815,AU +1742146816,1742147071,ID +1742147072,1742147327,SG +1742147328,1742147583,AU +1742147584,1742148607,ID +1742148608,1742149631,AU +1742149632,1742150655,ID +1742150656,1742153727,CN +1742153728,1742154751,HK +1742154752,1742156799,CN +1742156800,1742157823,IN +1742157824,1742158847,JP +1742158848,1742159871,SG +1742159872,1742160895,AU +1742160896,1742162431,ID +1742162432,1742162687,AU +1742162688,1742162943,PK +1742162944,1742164991,HK +1742164992,1742166015,JP +1742166016,1742167039,AU +1742167040,1742169087,IN +1742169088,1742172159,CN +1742172160,1742173183,IN +1742173184,1742175231,CN +1742175232,1742176255,HK +1742176256,1742177791,AU +1742177792,1742178303,IN +1742178304,1742179327,MY +1742179328,1742180351,CN +1742180352,1742181375,KR +1742181376,1742182399,IN +1742182400,1742183423,KR +1742183424,1742184447,IN +1742184448,1742185471,AU +1742185472,1742187519,IN +1742187520,1742188543,JP +1742188544,1742189567,ID +1742189568,1742190591,CA +1742190592,1742191615,CN +1742191616,1742192639,HK +1742192640,1742193663,MM +1742193664,1742197247,IN +1742197248,1742197759,AF +1742197760,1742198783,HK +1742198784,1742199807,NL +1742199808,1742200831,IR +1742200832,1742201855,IN +1742201856,1742202879,HK +1742202880,1742207999,IN +1742208000,1742209023,JP +1742209024,1742210047,IN +1742210048,1742221311,CN +1742221312,1742222335,KH +1742222336,1742223359,IN +1742223360,1742224383,BD +1742224384,1742225407,IR +1742225408,1742226431,CN +1742226432,1742227455,IN +1742227456,1742228479,VN +1742228480,1742230527,IN +1742230528,1742231039,SG +1742231040,1742231295,IN +1742231296,1742231551,ID +1742231552,1742233599,IN +1742233600,1742234111,TH +1742234112,1742234623,IN +1742234624,1742235647,HK +1742235648,1742236671,PK +1742236672,1742237695,CN +1742237696,1742242815,VN +1742242816,1742243071,NZ +1742243072,1742243327,AU +1742243328,1742243583,HK +1742243584,1742243839,PK +1742243840,1742244863,CN +1742244864,1742247935,IN +1742247936,1742248959,CN +1742248960,1742249983,IN +1742249984,1742250239,AF +1742250240,1742257151,IN +1742257152,1742257407,ID +1742257408,1742257663,NZ +1742257664,1742258175,AU +1742258176,1742259199,US +1742259200,1742260223,AU +1742260224,1742260735,IN +1742260736,1742261247,KR +1742261248,1742264319,IN +1742264320,1742265343,HK +1742265344,1742266367,AU +1742266368,1742268415,CN +1742268416,1742270463,IN +1742270464,1742290943,CN +1742290944,1742293503,IN +1742293504,1742294015,AU +1742294016,1742298111,IN +1742298112,1742299135,MY +1742299136,1742299647,NZ +1742300160,1742301183,AU +1742301184,1742301695,BD +1742301696,1742302207,AU +1742302208,1742304255,BD +1742304256,1742314495,IN +1742314496,1742315519,MM +1742315520,1742316543,HK +1742316544,1742317567,AU +1742317568,1742318591,CN +1742318592,1742319103,ID +1742319104,1742319615,AU +1742319616,1742320639,PK +1742320640,1742327807,CN +1742327808,1742328831,ID +1742328832,1742329855,IN +1742329856,1742330879,ID +1742330880,1742331903,IN +1742331904,1742332927,HK +1742332928,1742338047,IN +1742338048,1742338303,AU +1742338304,1742338559,IN +1742338560,1742339071,AU +1742339072,1742339327,US +1742339328,1742339583,SG +1742339584,1742339839,AU +1742339840,1742340095,US +1742340096,1742341119,CN +1742341120,1742342143,HK +1742342144,1742346239,CN +1742346240,1742347263,BD +1742347264,1742364671,CN +1742364672,1742365695,PH +1742365696,1742366719,IN +1742367744,1742380031,IN +1742380032,1742382079,KR +1742382080,1742382335,BD +1742382336,1742383103,ID +1742383104,1742387199,IN +1742387200,1742388223,CN +1742388224,1742389247,BD +1742389248,1742396415,CN +1742396416,1742397439,SG +1742397440,1742401535,IN +1742401536,1742402559,HK +1742402560,1742407167,IN +1742407168,1742407423,ID +1742407424,1742407679,AU +1742407680,1742410751,IN +1742410752,1742411263,SG +1742411264,1742411775,GB +1742411776,1742415871,CN +1742415872,1742419967,IN +1742419968,1742420991,HK +1742420992,1742421503,IN +1742421504,1742422015,AU +1742422016,1742423039,CN +1742423040,1742424063,PH +1742424064,1742425343,ID +1742425344,1742425599,US +1742425600,1742426111,SG +1742426112,1742427135,HK +1742427136,1742432255,CN +1742432256,1742433279,HK +1742433280,1742434303,MM +1742434304,1742434559,ID +1742434560,1742434815,NZ +1742434816,1742435327,BD +1742435328,1742436351,MY +1742436352,1742437375,AU +1742437376,1742439423,KR +1742439424,1742442495,IN +1742442496,1742443263,AU +1742443264,1742443519,BD +1742443520,1742444543,IN +1742444544,1742445567,NL +1742445568,1742446591,MM +1742446592,1742447615,BD +1742447616,1742448639,IN +1742448640,1742449663,BD +1742449664,1742450687,HK +1742450688,1742451711,CN +1742451712,1742452735,VN +1742452736,1742453759,CN +1742453760,1742454783,PH +1742454784,1742455295,HK +1742455296,1742455551,US +1742455552,1742455807,HK +1742455808,1742456063,TH +1742456064,1742456831,ID +1742456832,1742460415,IN +1742460416,1742460671,AU +1742460672,1742461951,IN +1742461952,1742462975,US +1742464000,1742465023,IN +1742465024,1742466047,BD +1742466048,1742466559,MY +1742466560,1742467071,IN +1742467072,1742467583,AU +1742467584,1742469119,IN +1742469120,1742470399,ID +1742470400,1742470655,IN +1742470656,1742471167,ID +1742471168,1742472191,IN +1742472192,1742473215,MY +1742473216,1742474239,HK +1742474240,1742482431,IN +1742482432,1742482687,NZ +1742482688,1742483199,AU +1742483200,1742483455,ID +1742483456,1742488575,CN +1742488576,1742489599,VN +1742489600,1742491647,HK +1742491648,1742492671,IN +1742492672,1742493695,VN +1742493696,1742494719,IN +1742494720,1742499839,CN +1742499840,1742500863,ID +1742500864,1742511103,CN +1742511104,1742512127,IN +1742512128,1742523391,CN +1742523392,1742524415,BD +1742524416,1742528767,IN +1742528768,1742529279,AU +1742529280,1742532607,IN +1742532608,1742550015,CN +1742550016,1742551039,BD +1742551040,1742551295,NL +1742551296,1742551551,BE +1742551552,1742551807,DK +1742551808,1742552063,NO +1742552064,1742553087,MY +1742553088,1742554111,JP +1742554112,1742558207,IN +1742558208,1742558719,AU +1742558720,1742558975,VN +1742558976,1742559231,AU +1742559232,1742589951,CN +1742589952,1742590975,IN +1742590976,1742596095,VN +1742596096,1742597119,IN +1742597120,1742598143,AU +1742598144,1742599167,SG +1742599168,1742599423,IN +1742599424,1742599679,AU +1742599680,1742600191,PK +1742600192,1742601215,IN +1742601216,1742602239,BD +1742602240,1742607359,CN +1742607360,1742608383,BD +1742608384,1742662655,CN +1742662656,1742663167,MY +1742663168,1742663423,SG +1742663424,1742663679,ID +1742663680,1742665727,CN +1742665728,1742666751,TW +1742666752,1742667775,IN +1742667776,1742668799,ID +1742668800,1742669823,VN +1742669824,1742671871,IN +1742671872,1742702591,CN +1742702592,1742703615,AU +1742703616,1742714879,CN +1742714880,1742715903,AU +1742715904,1742734335,CN +1742734336,1742735359,IN +1742735360,1742736383,JP +1742736384,1742737407,PK +1742737408,1742738431,CN +1742738432,1742738687,HK +1742738688,1742738943,AU +1742738944,1742739455,AE +1742739456,1742740479,IN +1742740480,1742741503,KH +1742741504,1742743551,IN +1742743552,1742745599,CN +1742745600,1742745855,IN +1742745856,1742746111,AU +1742746112,1742746623,IN +1742746624,1742747135,AU +1742747136,1742747391,IN +1742747648,1742748671,HK +1742748672,1742749695,CN +1742749696,1742750719,ID +1742750720,1742751743,IN +1742751744,1742752767,HK +1742752768,1742753791,NZ +1742753792,1742754815,HK +1742754816,1742756863,AU +1742757888,1742758911,BN +1742758912,1742759935,ID +1742759936,1742760191,AU +1742760192,1742760447,IN +1742760448,1742760703,HK +1742760704,1742760959,NZ +1742760960,1742761983,IN +1742761984,1742763007,AU +1742763008,1742764031,SG +1742764032,1742764287,AU +1742764288,1742764543,SG +1742764544,1742765055,AU +1742765824,1742766079,AF +1742766080,1742767103,NZ +1742767104,1742768127,TW +1742768128,1742769663,ID +1742769664,1742769919,AU +1742769920,1742770175,JP +1742770176,1742774271,IN +1742774272,1742774527,AU +1742774528,1742774783,NZ +1742774784,1742775295,AU +1742775296,1742776319,SG +1742776320,1742777343,VN +1742778368,1742779647,ID +1742779648,1742779903,IN +1742779904,1742780415,AU +1742780416,1742782463,IN +1742782464,1742783487,TW +1742783488,1742784511,MY +1742784512,1742786559,TW +1742786560,1742788095,AU +1742788096,1742788607,AF +1742788608,1742789631,IN +1742789632,1742793727,CN +1742793728,1742796799,IN +1742796800,1742797823,HK +1742797824,1742798847,JP +1742798848,1742799871,TW +1742799872,1742800895,NZ +1742800896,1742801919,HK +1742801920,1742802943,IN +1742802944,1742804991,HK +1742804992,1742807039,IN +1742807040,1742808063,AU +1742808064,1742809087,PH +1742809088,1742810111,IN +1742810112,1742810623,AU +1742810624,1742811135,IN +1742811136,1742812159,PK +1742812160,1742813183,JP +1742813184,1742815231,IN +1742815232,1742815743,SG +1742815744,1742815999,ID +1742816000,1742817279,AU +1742817280,1742818815,IN +1742818816,1742819327,KH +1742819328,1742820351,JP +1742820352,1742821375,CN +1742821376,1742822399,ID +1742822400,1742823423,BD +1742823424,1742823679,AU +1742823680,1742823935,IN +1742823936,1742824191,ID +1742824192,1742826495,IN +1742826496,1742827519,HK +1742827520,1742828543,IN +1742828544,1742829567,BS +1742829568,1742830591,JP +1742830592,1742833663,IN +1742833664,1742834687,PH +1742834688,1742835711,AU +1742835712,1742836735,JP +1742836736,1742837759,ID +1742837760,1742838783,JP +1742838784,1742841855,AU +1742841856,1742842367,TH +1742842368,1742843391,ID +1742843392,1742843647,IN +1742843648,1742843903,ID +1742843904,1742845951,IN +1742845952,1742846463,ID +1742846464,1742846975,AU +1742846976,1742847999,IN +1742848000,1742849023,JP +1742849024,1742850047,HK +1742850048,1742851071,NL +1742851072,1742852095,IN +1742852096,1742852607,ID +1742852608,1742853119,NZ +1742853120,1742854143,HK +1742854144,1742855167,AF +1742855168,1742856191,PK +1742856192,1742857215,IN +1742857216,1742858239,BD +1742858240,1742859263,AU +1742859264,1742860287,VN +1742860288,1742860799,AU +1742860800,1742861055,ID +1742861312,1742862335,NP +1742862336,1742862847,IN +1742862848,1742863359,HK +1742864384,1742866431,IN +1742866432,1742867199,AU +1742867200,1742867455,IN +1742867456,1742868479,PH +1742868480,1742869503,CN +1742869504,1742870015,IN +1742870016,1742870527,VU +1742870528,1742872575,IN +1742872576,1742873343,NZ +1742873344,1742873599,AU +1742873600,1742873855,NZ +1742873856,1742874623,PH +1742874624,1742875647,CN +1742875648,1742876671,JP +1742876672,1742877695,ID +1742877696,1742877951,IN +1742877952,1742878207,AU +1742878208,1742878463,JP +1742878464,1742878719,ID +1742878720,1742880767,CN +1742880768,1742881791,NZ +1742881792,1742882815,AU +1742882816,1742884863,KR +1742884864,1742885887,CN +1742885888,1742887935,IN +1742887936,1742888959,HK +1742888960,1742889983,KR +1742889984,1742891007,TW +1742891008,1742892031,AU +1742892032,1742893055,VN +1742893056,1742894079,NZ +1742894080,1742895103,CN +1742895104,1742895615,SG +1742895616,1742895871,BD +1742895872,1742896127,AU +1742896128,1742897151,HK +1742897152,1742898175,AU +1742898176,1742899199,CN +1742899200,1742900223,ID +1742900224,1742903295,IN +1742903296,1742904319,HK +1742904320,1742905343,CN +1742905344,1742907391,AU +1742907392,1742908415,IN +1742908416,1742908927,SG +1742908928,1742909183,ID +1742909184,1742909439,IN +1742909440,1742910463,AU +1742910464,1742911487,CN +1742911488,1742914559,IN +1742914560,1742915583,CN +1742915584,1742918655,IN +1742918656,1742919679,TW +1742919680,1742920191,PK +1742920192,1742920447,ID +1742920448,1742921727,AU +1742921728,1742923775,IN +1742923776,1742924799,ID +1742924800,1742926847,IN +1742926848,1742927359,AU +1742927360,1742927615,SG +1742927616,1742927871,AU +1742927872,1742928895,VN +1742928896,1742929919,NZ +1742929920,1742930431,IN +1742930432,1742930943,PH +1742930944,1742931967,GB +1742931968,1742932991,JP +1742932992,1742933503,SG +1742933504,1742933759,ID +1742933760,1742934015,NZ +1742934016,1742935039,AF +1742935040,1742938111,AU +1742938112,1742939135,TW +1742939136,1742940159,IN +1742940160,1742941183,JP +1742941184,1742942207,PH +1742942208,1742943231,CN +1742943232,1742945279,IN +1742945280,1742945791,AU +1742945792,1742946047,IN +1742946048,1742947327,AU +1742947328,1742948351,IN +1742948352,1742951423,CN +1742951424,1742952703,HK +1742952704,1742952704,SG +1742952705,1742953471,HK +1742954496,1742955519,IN +1742955520,1742956543,CN +1742956544,1742957567,HK +1742957568,1742958591,AU +1742958592,1742959615,VN +1742959616,1742960639,IN +1742960640,1742961663,CN +1742961664,1742962687,IN +1742962688,1742963711,HK +1742963712,1742965759,CN +1742965760,1742966015,MY +1742966016,1742968319,ID +1742968320,1742970879,IN +1742970880,1742971903,JP +1742971904,1742972927,SG +1742972928,1742973439,AU +1742973440,1742973951,NZ +1742973952,1742974975,KH +1742974976,1742975999,SG +1742976000,1742977023,AU +1742978048,1742979071,JP +1742979072,1742980095,HK +1742980096,1742981119,CN +1742981120,1742982143,AU +1742982144,1742983167,CN +1742983168,1742984191,IN +1742984192,1742985215,CN +1742985216,1742986239,VN +1742986240,1742987263,ID +1742987264,1742988287,TW +1742988288,1742989311,CN +1742989312,1742989567,AU +1742989568,1742989823,PH +1742989824,1742990335,AU +1742990336,1742991359,IN +1742991360,1742992383,ID +1742992384,1742993407,LK +1742994432,1742995455,ID +1742995456,1742996479,BD +1742996480,1742997503,TH +1742997504,1742998527,US +1742998528,1742999551,CN +1742999552,1742999807,AU +1742999808,1743000063,ID +1743000320,1743000575,IN +1743000576,1743001599,VN +1743001600,1743002623,ID +1743002624,1743003647,CN +1743003648,1743007743,IN +1743008000,1743008255,BD +1743008256,1743008767,IN +1743008768,1743010815,MY +1743010816,1743011839,JP +1743011840,1743012863,HK +1743012864,1743013887,CN +1743013888,1743015935,IN +1743015936,1743016447,ID +1743016448,1743016703,HK +1743016704,1743017983,IN +1743017984,1743019007,CN +1743019008,1743020031,HK +1743020032,1743020287,KR +1743020288,1743020543,BE +1743020544,1743020799,AU +1743020800,1743021055,HK +1743021056,1743021311,SG +1743021312,1743021567,NZ +1743021568,1743021823,PH +1743021824,1743022079,IN +1743022080,1743023103,US +1743023104,1743024127,HK +1743024128,1743025151,IN +1743025152,1743026175,ID +1743026176,1743027199,BD +1743027200,1743028223,AU +1743028224,1743029247,CN +1743029248,1743029503,IN +1743029504,1743029759,AU +1743029760,1743030271,BD +1743030272,1743031295,CN +1743031296,1743035391,IN +1743035392,1743036415,PK +1743036416,1743037439,CN +1743037440,1743038463,AU +1743038464,1743039487,HK +1743039488,1743040511,IN +1743040512,1743041535,CN +1743041536,1743042559,HK +1743042560,1743043583,IN +1743043584,1743044607,AU +1743044608,1743045119,IN +1743045120,1743045631,AU +1743045632,1743046655,JP +1743046656,1743047679,BD +1743047680,1743049727,CN +1743049728,1743050751,AU +1743050752,1743051775,TW +1743051776,1743052799,IN +1743052800,1743053823,US +1743053824,1743055871,CN +1743055872,1743059199,ID +1743059200,1743059967,IN +1743059968,1743060991,LA +1743061248,1743061503,AU +1743061504,1743062015,IN +1743062016,1743062271,AU +1743062272,1743062527,IN +1743062528,1743063039,AU +1743063040,1743064063,SG +1743064064,1743064575,ID +1743065088,1743065599,TW +1743065600,1743066111,IN +1743066112,1743067135,CN +1743067136,1743068159,IN +1743068160,1743069183,HK +1743069184,1743070207,MY +1743070208,1743071231,US +1743071232,1743072255,VN +1743072256,1743073279,BD +1743073280,1743073791,AU +1743073792,1743074047,TW +1743074048,1743074303,IN +1743075328,1743076351,MY +1743076352,1743077375,CN +1743077376,1743078399,IN +1743078400,1743079423,HK +1743079424,1743080959,ID +1743080960,1743081471,IN +1743081472,1743083519,BD +1743083520,1743084543,SG +1743084544,1743085567,TH +1743085568,1743085823,SG +1743086080,1743086591,NZ +1743086592,1743087615,TW +1743087616,1743088639,PH +1743088640,1743089663,TH +1743089664,1743090687,MY +1743090688,1743091711,HK +1743091712,1743092735,MN +1743092736,1743093759,TW +1743093760,1743094015,SG +1743094016,1743094271,IN +1743094272,1743094527,NZ +1743094784,1743095807,TW +1743095808,1743096831,CN +1743096832,1743098879,HK +1743098880,1743099903,CN +1743099904,1743100927,AU +1743100928,1743101951,KR +1743101952,1743103999,ID +1743104000,1743105023,IN +1743105024,1743106047,CN +1743106048,1743107071,MN +1743107072,1743108095,HK +1743108096,1743108607,IN +1743108608,1743108863,SG +1743108864,1743109119,AU +1743110144,1743111167,VN +1743111168,1743111423,SG +1743111424,1743111679,MY +1743111680,1743111935,ID +1743111936,1743112191,HK +1743112192,1743113215,ID +1743113216,1743114239,SG +1743114240,1743115263,IN +1743115264,1743118335,CN +1743118336,1743119359,IN +1743119360,1743120383,CN +1743121408,1743123455,CN +1743123456,1743124479,IN +1743124480,1743124991,NZ +1743124992,1743125503,IN +1743125504,1743126527,JP +1743126528,1743127551,CN +1743127552,1743128575,BD +1743128576,1743129599,PH +1743129600,1743130367,HK +1743130368,1743130623,JP +1743130624,1743131647,BD +1743131648,1743132671,IN +1743132672,1743133695,JP +1743133696,1743134719,CN +1743134720,1743134975,HK +1743134976,1743135231,IN +1743135232,1743135743,HK +1743135744,1743136767,SG +1743136768,1743138815,CN +1743138816,1743139327,ID +1743139328,1743139839,SG +1743139840,1743140863,IN +1743140864,1743141887,MY +1743141888,1743142911,BD +1743142912,1743143935,BN +1743143936,1743144959,US +1743144960,1743145983,AU +1743145984,1743147007,NZ +1743147008,1743147263,AU +1743147264,1743147519,NZ +1743147776,1743148031,ID +1743148032,1743149055,IN +1743149056,1743150079,KR +1743151104,1743152127,CN +1743152128,1743152383,ID +1743152384,1743153151,IN +1743153152,1743154175,BD +1743154176,1743155199,HK +1743155200,1743156223,KR +1743156224,1743157247,PH +1743157248,1743158271,HK +1743158272,1743159295,MY +1743160320,1743161343,TH +1743161344,1743162367,HK +1743162368,1743162623,AU +1743162624,1743162879,AQ +1743162880,1743163135,KR +1743163136,1743163391,BZ +1743163392,1743166463,IN +1743166464,1743167487,AU +1743167488,1743168511,HK +1743168512,1743169535,IN +1743169536,1743170559,JP +1743170560,1743171583,AU +1743172608,1743173631,BD +1743173632,1743174655,AU +1743174656,1743175679,ID +1743175680,1743176703,HK +1743176704,1743179775,CN +1743179776,1743180799,BD +1743180800,1743181823,CN +1743181824,1743182847,HK +1743182848,1743184895,IN +1743184896,1743185919,HK +1743185920,1743186943,SG +1743186944,1743187967,CN +1743187968,1743188991,HK +1743190016,1743190111,SG +1743190112,1743190119,IE +1743190120,1743191039,SG +1743191040,1743192063,AF +1743192064,1743195135,IN +1743195136,1743196159,HK +1743196160,1743198207,CN +1743198720,1743198975,AU +1743198976,1743199231,US +1743199232,1743200255,HK +1743200256,1743201279,IN +1743201280,1743202303,PH +1743202304,1743204351,IN +1743204352,1743205375,TW +1743205376,1743206399,SG +1743206400,1743207423,HK +1743207424,1743208447,KH +1743208448,1743210495,CN +1743210496,1743211519,JP +1743211520,1743212543,IN +1743212544,1743213567,ID +1743213568,1743214591,HK +1743214592,1743215103,AU +1743215104,1743215359,NZ +1743215360,1743215615,AU +1743215616,1743216639,MM +1743216640,1743217151,SG +1743217152,1743217663,JP +1743217664,1743218687,IN +1743218688,1743219711,HK +1743219712,1743221759,ID +1743221760,1743222783,IN +1743222784,1743223807,ID +1743223808,1743224831,IN +1743224832,1743225855,KR +1743225856,1743226367,IN +1743226368,1743226623,PH +1743226624,1743226879,BD +1743226880,1743227903,IR +1743227904,1743228927,HK +1743228928,1743229951,CN +1743229952,1743230975,VN +1743230976,1743231999,HK +1743232000,1743232511,NZ +1743232512,1743233023,AU +1743233024,1743234047,BD +1743234048,1743235071,HK +1743235072,1743235583,AU +1743235584,1743236095,ID +1743236096,1743237119,US +1743237120,1743238143,BD +1743238144,1743240191,CN +1743240192,1743241215,SG +1743241216,1743242239,JP +1743242240,1743244287,ID +1743244288,1743244799,AU +1743244800,1743245311,AF +1743245312,1743248383,IN +1743248384,1743248895,SG +1743248896,1743249407,IN +1743249408,1743250431,MY +1743250432,1743251455,BD +1743251456,1743252479,IN +1743252480,1743253503,JP +1743253504,1743254527,PH +1743254528,1743255551,CN +1743255552,1743256063,SE +1743256064,1743256319,SG +1743256320,1743256575,MY +1743256576,1743258623,HK +1743258624,1743259647,CN +1743259648,1743260671,IN +1743260672,1743261703,JP +1743261704,1743261711,PH +1743261712,1743262719,HK +1743262720,1743264767,IN +1743264768,1743265279,MY +1743265280,1743265535,ID +1743265536,1743265791,AU +1743265792,1743266303,ID +1743266304,1743267839,HK +1743267840,1743268863,TH +1743268864,1743269887,SG +1743269888,1743270911,MY +1743270912,1743273983,VN +1743273984,1743275007,ID +1743275008,1743276031,HK +1743276032,1743277055,JP +1743277056,1743278079,AU +1743278080,1743279103,LA +1743279104,1743281151,HK +1743281152,1743283199,AU +1743283200,1743284223,BD +1743284224,1743286271,NZ +1743286272,1743287295,IN +1743287296,1743288319,AU +1743288320,1743289343,VN +1743289344,1743291391,IN +1743291392,1743292415,AU +1743292416,1743292543,ID +1743292544,1743292671,HK +1743292672,1743292927,US +1743292928,1743293055,TH +1743293056,1743293183,JP +1743293184,1743293311,CH +1743293312,1743293439,AT +1743293440,1743293951,AU +1743293952,1743294463,MY +1743294464,1743295487,CN +1743295488,1743296511,IN +1743296512,1743297535,NP +1743297536,1743298303,NZ +1743298304,1743299583,AU +1743300608,1743301631,AU +1743301632,1743303679,IN +1743303680,1743304703,NZ +1743304704,1743305727,IN +1743305728,1743306751,CN +1743306752,1743307775,KH +1743307776,1743308799,AU +1743308800,1743309823,JP +1743309824,1743310335,NZ +1743310336,1743310847,US +1743310848,1743311871,AU +1743311872,1743312895,CN +1743312896,1743313663,AU +1743313664,1743313919,MY +1743313920,1743314943,HK +1743314944,1743315199,IN +1743315200,1743315455,PK +1743315456,1743315967,NZ +1743315968,1743316991,NP +1743316992,1743319039,IN +1743319040,1743319295,ID +1743319296,1743319551,IN +1743319552,1743320063,ID +1743320064,1743321087,IN +1743321088,1743323135,AU +1743323136,1743324159,MY +1743324160,1743325183,CN +1743325184,1743326207,HK +1743326208,1743328255,AU +1743328256,1743329279,NZ +1743329280,1743330303,IN +1743330304,1743331327,AU +1743331328,1743333375,PH +1743333376,1743334399,JP +1743334400,1743335423,CN +1743335424,1743336447,VN +1743336448,1743337471,CN +1743337472,1743338495,NP +1743338496,1743339519,NZ +1743339520,1743340543,IN +1743340544,1743341567,TW +1743341568,1743341823,HK +1743341824,1743342079,IN +1743342080,1743342591,AU +1743342592,1743343615,IN +1743343616,1743344639,TH +1743344640,1743345663,IN +1743345664,1743346687,ID +1743346688,1743347711,IN +1743347712,1743348735,HK +1743348736,1743348991,ID +1743348992,1743349247,IN +1743349248,1743349759,ID +1743349760,1743350783,CN +1743350784,1743351807,ID +1743351808,1743354111,IN +1743354112,1743354367,BD +1743354368,1743355903,IN +1743355904,1743356927,CN +1743356928,1743357951,NZ +1743357952,1743358975,CN +1743358976,1743359487,IN +1743359488,1743361023,ID +1743361024,1743362047,AU +1743362048,1743364095,ID +1743364096,1743364607,IN +1743365120,1743366143,HK +1743366144,1743367167,IN +1743367168,1743368191,SG +1743368192,1743369215,TH +1743369216,1743369727,MY +1743369728,1743369983,NP +1743369984,1743370239,AF +1743370240,1743371263,HK +1743371264,1743372287,MO +1743372288,1743373311,TH +1743373312,1743374335,JP +1743374336,1743375359,TH +1743375360,1743376383,MM +1743376384,1743377407,AU +1743377408,1743378431,JP +1743378432,1743379455,IN +1743379456,1743380479,NZ +1743380480,1743381503,AU +1743381504,1743382527,CN +1743382528,1743383551,HK +1743383552,1743384575,AU +1743384576,1743385087,SG +1743385088,1743385343,AU +1743385344,1743386623,IN +1743386624,1743388671,HK +1743388672,1743389695,CN +1743389696,1743390719,KR +1743390720,1743391743,HK +1743391744,1743391999,PK +1743392000,1743392767,AU +1743392768,1743393791,HK +1743393792,1743394815,CN +1743394816,1743395839,BD +1743397888,1743398911,VN +1743398912,1743399935,TW +1743399936,1743400959,JP +1743400960,1743401983,PG +1743401984,1743403007,HK +1743403008,1743404031,CN +1743404032,1743405055,AU +1743405056,1743407103,IN +1743407104,1743408127,HK +1743408128,1743410175,TW +1743410176,1743411199,SG +1743411200,1743412223,VN +1743412224,1743412479,AU +1743412480,1743412991,IN +1743413248,1743414271,HK +1743414272,1743415295,MY +1743415296,1743416319,SG +1743416320,1743417855,AU +1743417856,1743418879,IN +1743418880,1743419391,AU +1743419392,1743420415,ID +1743420416,1743422463,CN +1743422464,1743423487,NZ +1743423488,1743424511,IN +1743424512,1743425535,HK +1743425536,1743426559,PK +1743426560,1743426815,SG +1743426816,1743430399,IN +1743430400,1743430655,AU +1743430656,1743431679,BD +1743431680,1743432703,SG +1743432704,1743433727,CN +1743433728,1743434751,JP +1743434752,1743435775,CN +1743435776,1743437823,IN +1743437824,1743438335,BD +1743438336,1743438591,AU +1743438592,1743438847,ID +1743438848,1743439871,JP +1743439872,1743440895,BD +1743440896,1743441919,TW +1743441920,1743442943,ID +1743442944,1743443967,IN +1743443968,1743444991,ID +1743444992,1743446015,HK +1743446016,1743448063,TW +1743448064,1743449087,AU +1743449088,1743451135,IN +1743451136,1743452159,CN +1743452160,1743453183,AU +1743453184,1743454207,ID +1743454208,1743455231,IN +1743455232,1743456255,HK +1743456256,1743457279,IN +1743457280,1743458303,JP +1743458304,1743459327,CN +1743459328,1743459583,AU +1743459584,1743459839,ID +1743459840,1743460095,AU +1743460096,1743460351,IN +1743460352,1743461375,KR +1743461376,1743462399,MY +1743462400,1743463423,ID +1743463424,1743464447,AU +1743464448,1743465471,JP +1743465472,1743466495,HK +1743466496,1743467519,CN +1743467520,1743468543,AU +1743468544,1743470591,CN +1743470592,1743470847,IN +1743470848,1743471103,AU +1743471104,1743471615,ID +1743471616,1743472639,IN +1743472640,1743473663,ID +1743473664,1743474687,PK +1743474688,1743476735,CN +1743476736,1743477759,TW +1743477760,1743479807,AU +1743479808,1743480831,HK +1743480832,1743481855,IN +1743481856,1743482111,AU +1743482112,1743482367,ID +1743482368,1743482879,WF +1743482880,1743483903,JP +1743483904,1743484927,AU +1743484928,1743485951,IN +1743485952,1743486975,JP +1743486976,1743493119,CN +1743493120,1743493631,ID +1743493632,1743493887,AU +1743493888,1743495167,IN +1743496192,1743497215,IN +1743497216,1743499263,HK +1743499264,1743500287,AF +1743500288,1743501311,JP +1743501312,1743502335,CN +1743502336,1743503359,AU +1743503360,1743504383,CN +1743504384,1743505407,NP +1743505408,1743506431,CN +1743506432,1743506943,SG +1743506944,1743507455,IN +1743507456,1743509503,VN +1743509504,1743510527,HK +1743510528,1743545343,CN +1743545344,1743546367,HK +1743546368,1743549951,IN +1743549952,1743550207,AU +1743550208,1743550463,SG +1743550464,1743551487,CN +1743551488,1743552511,IN +1743552512,1743553535,JP +1743553536,1743554559,PK +1743554560,1743555583,HK +1743555584,1743557631,JP +1743557632,1743557887,SG +1743557888,1743558143,US +1743558144,1743558655,ID +1743558656,1743560703,IN +1743560704,1743561215,ID +1743561216,1743561727,AU +1743561728,1743564799,IN +1743564800,1743565823,PH +1743565824,1743566847,JP +1743566848,1743567871,CN +1743567872,1743569151,ID +1743569152,1743569919,IN +1743569920,1743570943,SG +1743570944,1743571199,IN +1743571200,1743571455,ID +1743571456,1743571967,AU +1743571968,1743574015,IN +1743574528,1743574783,US +1743575040,1743576063,HK +1743576064,1743577087,CN +1743577088,1743578111,JP +1743578112,1743579135,MY +1743579136,1743580159,CN +1743580160,1743581183,IN +1743581184,1743589375,CN +1743589376,1743590399,AU +1743590400,1743591423,KR +1743591424,1743593471,CN +1743593472,1743594495,ID +1743594496,1743595519,BD +1743595520,1743596543,NZ +1743596544,1743597567,IN +1743598592,1743599103,KH +1743599104,1743599615,US +1743599616,1743600639,IN +1743600640,1743602687,VN +1743602688,1743603711,CN +1743603712,1743604735,HK +1743604736,1743605759,BD +1743605760,1743606015,SG +1743606016,1743606527,AU +1743606528,1743606783,AF +1743607808,1743608831,CN +1743608832,1743609855,AU +1743609856,1743610879,VN +1743610880,1743611903,MO +1743611904,1743613951,AU +1743613952,1743615999,IN +1743616000,1743617023,JP +1743617024,1743618047,MO +1743618048,1743619071,HK +1743619072,1743619583,SG +1743619584,1743619839,ID +1743619840,1743620095,IN +1743620096,1743621119,AU +1743621120,1743621631,ID +1743621632,1743622143,SG +1743622144,1743624191,VN +1743624192,1743625215,CN +1743625216,1743626239,IN +1743626240,1743627263,AU +1743627264,1743628287,NZ +1743628288,1743628799,SG +1743628800,1743629055,IN +1743629056,1743629311,AU +1743629312,1743630335,IN +1743630336,1743652863,CN +1743652864,1743654911,IN +1743654912,1743666175,CN +1743666176,1743666431,NZ +1743666432,1743666687,IN +1743666688,1743666943,AU +1743666944,1743667199,BD +1743667200,1743672319,VN +1743672320,1743673343,NZ +1743673344,1743676415,CN +1743676416,1743677439,US +1743677440,1743679487,IN +1743680512,1743681535,TL +1743681536,1743682559,AU +1743682560,1743683583,MY +1743683584,1743683839,JP +1743683840,1743684095,AU +1743684096,1743684351,JP +1743684352,1743684607,AU +1743684608,1743685631,CN +1743685632,1743686655,ID +1743686656,1743688703,CN +1743688704,1743689727,MY +1743689728,1743690751,IN +1743690752,1743691263,AS +1743691264,1743691775,IN +1743691776,1743699967,CN +1743699968,1743700479,IN +1743700480,1743700735,NZ +1743700736,1743700991,AU +1743700992,1743702015,CN +1743702016,1743703039,ID +1743703040,1743704063,CN +1743704064,1743706111,VN +1743707136,1743708159,IN +1743708160,1743709183,HK +1743709184,1743711231,IN +1743711232,1743712255,JP +1743712256,1743713279,IN +1743713280,1743714303,JP +1743714304,1743715327,KR +1743715328,1743717375,CN +1743717376,1743718399,BD +1743718400,1743719423,NZ +1743720448,1743721471,JP +1743722496,1743723519,AU +1743723520,1743724543,HK +1743724544,1743725567,VN +1743725568,1743726591,IN +1743727616,1743728639,CN +1743728640,1743729151,AU +1743729152,1743729407,IN +1743729408,1743729663,AU +1743729664,1743730687,KH +1743730688,1743731711,IN +1743731712,1743732735,TW +1743733760,1743734783,CN +1743734784,1743735807,HK +1743735808,1743736319,AU +1743736320,1743736575,IN +1743736576,1743736831,AU +1743736832,1743738879,IN +1743739904,1743740927,JP +1743740928,1743741951,CN +1743741952,1743742975,HK +1743742976,1743743487,NZ +1743743488,1743743999,AU +1743744000,1743745023,JP +1743745024,1743746047,KR +1743746048,1743748095,VN +1743748096,1743748607,IN +1743748608,1743748863,HK +1743748864,1743749119,MY +1743749120,1743751167,AU +1743751168,1743754239,IN +1743755264,1743757311,CN +1743757312,1743758335,TO +1743758336,1743758591,HK +1743758592,1743758847,ID +1743758848,1743759359,AU +1743759360,1743761407,IN +1743761408,1743764479,CN +1743764480,1743765503,ID +1743765504,1743767551,CN +1743767552,1743768575,PH +1743768576,1743770623,CN +1743770624,1743770879,AU +1743770880,1743771135,IN +1743771648,1743772671,JP +1743772672,1743773695,SG +1743773696,1743774719,CN +1743774720,1743775743,NZ +1743775744,1743776767,IN +1743776768,1743778815,KR +1743778816,1743779839,CN +1743779840,1743780863,MY +1743780864,1743781887,BD +1743783936,1743784959,IN +1743784960,1743785983,JP +1743785984,1743787007,CN +1743787008,1743788031,JP +1743789056,1743790079,KR +1743790080,1743791103,IN +1743791104,1743792127,CN +1743792128,1743793151,HK +1743793152,1743794175,BD +1743794176,1743795199,KR +1743795200,1743796223,NZ +1743797248,1743798271,TH +1743798272,1743799295,HK +1743800320,1743801343,CN +1743801344,1743802367,IN +1743802368,1743803391,HK +1743803392,1743804415,CN +1743804416,1743804671,AU +1743804672,1743805439,IN +1743805440,1743806463,HK +1743806464,1743809535,IN +1743809536,1743810559,ID +1743810560,1743811583,KH +1743811584,1743812607,JP +1743812608,1743813631,PH +1743813632,1743814655,CN +1743814656,1743815679,SG +1743815680,1743815935,AU +1743815936,1743816191,NZ +1743816192,1743816703,AU +1743816704,1743817727,IN +1743817728,1743818751,HK +1743818752,1743819775,IN +1743819776,1743820799,HK +1743820800,1743821823,NZ +1743821824,1743822847,CN +1743822848,1743825919,IN +1743825920,1743826943,CN +1743826944,1743827967,MY +1743827968,1743828991,HK +1743828992,1743830015,NZ +1743830016,1743831039,CN +1743831040,1743832063,IN +1743832064,1743834111,HK +1743834112,1743838207,IN +1743838208,1743838463,PK +1743838464,1743838719,US +1743838720,1743841279,AU +1743841280,1743843327,IN +1743843328,1743844351,LA +1743844352,1743845375,CN +1743845376,1743846399,BD +1743846400,1743847423,JP +1743847424,1743848447,AU +1743848448,1743848959,ID +1743848960,1743849471,AU +1743849472,1743850495,IN +1743850496,1743851519,CN +1743851520,1743852543,HK +1743852544,1743853567,IN +1743853568,1743853823,ID +1743853824,1743854079,IN +1743854080,1743854335,AU +1743854336,1743854591,LK +1743854592,1743856639,TH +1743856640,1743857663,NZ +1743858688,1743859711,IN +1743859712,1743860735,HK +1743860736,1743861759,IN +1743861760,1743862783,NZ +1743862784,1743863807,SG +1743863808,1743864831,JP +1743864832,1743865855,TW +1743865856,1743866879,CN +1743866880,1743867903,KR +1743867904,1743868927,IN +1743868928,1743870975,NZ +1743870976,1743873023,CN +1743873024,1743874047,AU +1743874048,1743874303,JP +1743874304,1743875071,SG +1743875072,1743876095,HK +1743876096,1743877119,IN +1743877120,1743878143,KR +1743878144,1743879167,NZ +1743879168,1743881215,JP +1743881216,1743885311,IN +1743885312,1743885823,AU +1743885824,1743886207,MY +1743886208,1743886335,SG +1743886336,1743887359,JP +1743887360,1743888383,AF +1743888384,1743889407,CN +1743889408,1743890431,HK +1743890432,1743891455,IN +1743892480,1743892991,AU +1743892992,1743893503,ID +1743893504,1743894527,IN +1743894528,1743896575,CN +1743897600,1743899647,AU +1743899648,1743900671,ID +1743900672,1743901695,JP +1743901696,1743901951,AU +1743901952,1743902207,US +1743902208,1743902463,AU +1743902464,1743902719,US +1743902720,1743903743,AU +1743903744,1743904767,CN +1743904768,1743905791,IN +1743905792,1743906815,HK +1743906816,1743908863,IN +1743908864,1743909375,AU +1743909376,1743910911,IN +1743910912,1743911935,VN +1743911936,1743912959,AU +1743912960,1743913983,HK +1743913984,1743915007,JP +1743915008,1743916031,CN +1743916032,1743917055,KH +1743917056,1743918079,MY +1743918080,1743919103,BD +1743919104,1743920127,NZ +1743920128,1743921151,JP +1743921152,1743922175,AU +1743922176,1743923199,NZ +1743923200,1743924223,KH +1743924224,1743925247,MN +1743925248,1743925503,NZ +1743925504,1743925759,AU +1743925760,1743926271,AF +1743926272,1743927295,VN +1743927296,1743928319,KH +1743928320,1743929343,IN +1743929344,1743930367,CN +1743930368,1743931391,NZ +1743931392,1743932415,HK +1743933440,1743934463,AU +1743934464,1743934975,ID +1743935232,1743935487,IN +1743935488,1743936511,SG +1743936512,1743937535,AU +1743937536,1743938559,MM +1743938560,1743939583,HK +1743939584,1743940607,ID +1743940608,1743941631,HK +1743941632,1743942655,JP +1743942656,1743944703,IN +1743944704,1743945215,ID +1743945216,1743945727,TO +1743945728,1743947775,CN +1743947776,1743948799,IN +1743948800,1743949823,HK +1743949824,1743950847,TH +1743950848,1743951359,HK +1743951360,1743951871,SG +1743951872,1743953919,IN +1743953920,1743954943,CN +1743954944,1743955967,PG +1743955968,1743959039,CN +1743959040,1743959551,ID +1743959552,1743960063,AU +1743960064,1743964159,IN +1743964160,1743965183,CN +1743965184,1743966719,ID +1743966720,1743967231,AU +1743967232,1743968255,CN +1743968256,1743969279,BD +1743969280,1743970303,CN +1743970304,1743971327,IN +1743971328,1743972351,NZ +1743972352,1743972607,IN +1743972608,1743972863,ID +1743973120,1743973375,AU +1743973376,1743974399,IN +1743974400,1743975423,CN +1743975424,1743976447,NZ +1743976448,1743977471,AU +1743977472,1743978495,JP +1743978496,1743979519,HK +1743979520,1743980543,IN +1743981568,1743981823,AU +1743981824,1743982079,SG +1743982080,1743982335,HK +1743982336,1743982591,SG +1743982592,1743983359,AU +1743983616,1743984639,KR +1743984640,1743985663,HK +1743985664,1743990783,IN +1743990784,1743991807,ID +1743991808,1743994879,IN +1743994880,1743995903,AU +1743995904,1743997951,IN +1743997952,1743999999,BD +1744000000,1744001023,AU +1744001024,1744001535,IN +1744001536,1744001791,NZ +1744001792,1744002047,AU +1744002048,1744003071,HK +1744003072,1744004095,NZ +1744004096,1744005119,HK +1744005120,1744006143,VN +1744006144,1744006655,ID +1744006656,1744006911,AU +1744006912,1744009215,IN +1744009216,1744010239,JP +1744010240,1744011263,IN +1744011264,1744012287,HK +1744012288,1744013311,IN +1744013312,1744014335,CN +1744014336,1744015359,BD +1744015360,1744016383,IN +1744016384,1744017407,AU +1744017408,1744018431,JP +1744018432,1744019455,MY +1744019456,1744020479,NZ +1744020480,1744021503,HK +1744022528,1744023551,SG +1744023808,1744024319,ID +1744024320,1744024575,AF +1744024576,1744025599,HK +1744025600,1744026623,IN +1744026624,1744027647,SG +1744027648,1744028671,MY +1744028672,1744029695,JP +1744029696,1744030719,KR +1744030720,1744031743,NZ +1744031744,1744032767,JP +1744032768,1744033791,MY +1744033792,1744034815,VN +1744034816,1744035839,SG +1744035840,1744039423,IN +1744039424,1744039679,PH +1744039680,1744039935,AU +1744039936,1744040959,JP +1744040960,1744041471,AU +1744041472,1744041983,ID +1744041984,1744043007,TW +1744043008,1744044031,CN +1744044032,1744045055,HK +1744045056,1744046079,IN +1744046080,1744047103,SG +1744047104,1744048127,BD +1744048128,1744049151,CN +1744051200,1744051711,PH +1744051712,1744051967,SA +1744051968,1744052223,PH +1744052224,1744053247,IN +1744053248,1744054271,ID +1744054272,1744055295,KR +1744055296,1744056319,JP +1744056320,1744056575,IN +1744056576,1744056831,MY +1744056832,1744057087,NZ +1744057088,1744057343,ID +1744057344,1744058879,HK +1744058880,1744066559,CN +1744066560,1744067583,HK +1744067584,1744068607,JP +1744068608,1744069631,ID +1744069632,1744070655,SG +1744070656,1744071679,JP +1744071680,1744072703,KR +1744072704,1744073727,HK +1744073728,1744074751,CN +1744074752,1744076799,IN +1744076800,1744077823,AU +1744077824,1744078847,PK +1744078848,1744079871,VN +1744079872,1744080895,BD +1744080896,1744081919,AF +1744081920,1744082943,HK +1744082944,1744083967,IN +1744083968,1744084991,HK +1744084992,1744085503,ID +1744085504,1744085759,BD +1744085760,1744086015,MY +1744086016,1744087039,CN +1744087040,1744088063,IN +1744088064,1744090111,PK +1744090112,1744091135,NZ +1744091136,1744092159,BD +1744092160,1744092671,MY +1744092672,1744092927,IN +1744092928,1744093183,MY +1744093184,1744094207,PH +1744094208,1744096255,AU +1744096256,1744097279,ID +1744097280,1744098303,JP +1744098304,1744099327,NZ +1744099328,1744101375,JP +1744102400,1744103423,FJ +1744103424,1744104447,CN +1744104448,1744105471,AU +1744105472,1744106751,IN +1744106752,1744107007,ID +1744107008,1744107519,SG +1744107520,1744108543,KH +1744108544,1744109567,CN +1744109568,1744110591,IN +1744110592,1744111615,JP +1744111616,1744113663,IN +1744113664,1744114687,ID +1744114688,1744115455,IN +1744115456,1744115711,CN +1744115712,1744116735,MY +1744116736,1744117759,HK +1744117760,1744118783,IN +1744118784,1744119807,SG +1744119808,1744120831,JP +1744120832,1744122879,IN +1744122880,1744123903,CN +1744123904,1744124927,JP +1744124928,1744125951,CN +1744125952,1744127999,IN +1744128000,1744128511,ID +1744128512,1744128767,IN +1744128768,1744129023,AU +1744129024,1744130047,KH +1744130048,1744131071,CN +1744131072,1744132095,AU +1744132096,1744133119,MY +1744133120,1744134143,SG +1744134144,1744135167,BD +1744135168,1744137215,IN +1744137216,1744138239,BD +1744138240,1744140287,IN +1744140288,1744140799,MY +1744140800,1744141311,ID +1744141312,1744143359,CN +1744143360,1744144383,PK +1744144384,1744145407,ID +1744145408,1744146431,BD +1744146432,1744146687,IN +1744146688,1744147199,AU +1744147200,1744147455,IN +1744147456,1744148479,VN +1744148480,1744149503,AU +1744149504,1744150527,IN +1744150528,1744151551,TO +1744151552,1744152319,LA +1744152320,1744152575,TH +1744153600,1744154623,NZ +1744154624,1744154879,SG +1744154880,1744155135,ID +1744155648,1744156671,ID +1744156672,1744158207,IN +1744158208,1744158719,HK +1744158720,1744159743,PK +1744159744,1744161791,IN +1744161792,1744162815,BD +1744162816,1744163839,HK +1744163840,1744166655,AU +1744166656,1744166911,AE +1744166912,1744167167,JP +1744167168,1744167679,ID +1744167680,1744167935,AU +1744167936,1744171007,JP +1744171008,1744172031,BT +1744172032,1744175103,VN +1744175104,1744176127,ID +1744176128,1744177151,AU +1744177152,1744179199,CN +1744179200,1744180223,TH +1744180224,1744181247,PH +1744181248,1744182271,TH +1744182272,1744184575,AU +1744184576,1744184831,SG +1744184832,1744185087,HK +1744185088,1744185343,JP +1744185344,1744187903,IN +1744187904,1744188159,TH +1744188160,1744188415,AU +1744188416,1744189439,NZ +1744189440,1744190463,KR +1744191488,1744192511,IN +1744192512,1744193535,JP +1744194560,1744194815,ID +1744194816,1744195071,HK +1744195072,1744195327,SG +1744195328,1744195583,HK +1744195584,1744196607,JP +1744196608,1744197631,IN +1744197632,1744198655,MY +1744198656,1744199679,SG +1744199680,1744201727,AU +1744201728,1744201983,VN +1744202240,1744202495,IN +1744202496,1744202751,ID +1744202752,1744203775,PK +1744203776,1744204799,HK +1744204800,1744205823,ID +1744205824,1744207871,CN +1744207872,1744208127,AU +1744208128,1744208383,ID +1744208384,1744208895,AU +1744208896,1744209919,CN +1744209920,1744210943,AU +1744210944,1744211199,JP +1744211200,1744211455,HK +1744211456,1744211967,SG +1744211968,1744212991,KH +1744212992,1744213503,SG +1744213504,1744214015,JP +1744214016,1744216063,CN +1744216064,1744217087,HK +1744217088,1744218111,JP +1744218368,1744218623,ID +1744218624,1744219135,IN +1744219136,1744220159,KR +1744220160,1744220927,HK +1744220928,1744221183,JP +1744221184,1744222207,NZ +1744222208,1744222719,ID +1744222720,1744222975,AU +1744222976,1744223231,IN +1744223232,1744224255,TH +1744224256,1744226303,IN +1744226304,1744227327,SG +1744227328,1744228351,MY +1744228352,1744229375,TW +1744229376,1744230399,IN +1744230400,1744230655,GB +1744230656,1744230911,MY +1744230912,1744231423,TW +1744231424,1744232447,VN +1744232448,1744233471,IN +1744233472,1744234495,KH +1744234496,1744234751,JP +1744234752,1744235519,AU +1744235520,1744236543,KR +1744236544,1744237567,IN +1744237568,1744238591,HK +1744238592,1744238847,US +1744238848,1744239615,NZ +1744239616,1744240639,JP +1744240640,1744241663,AU +1744241664,1744242687,IN +1744242688,1744245503,ID +1744245504,1744245759,IN +1744245760,1744247807,ID +1744247808,1744248831,IN +1744248832,1744249855,ID +1744249856,1744250367,US +1744250368,1744250879,PH +1744250880,1744251903,ID +1744251904,1744252927,BD +1744252928,1744253951,LK +1744253952,1744254975,IN +1744254976,1744255999,NZ +1744256000,1744257023,TH +1744257024,1744257535,AU +1744257536,1744257791,PK +1744257792,1744258047,AU +1744258048,1744259071,JP +1744259072,1744260095,NZ +1744260096,1744261119,AU +1744261120,1744262143,IN +1744262144,1744264191,JP +1744264192,1744265215,HK +1744265216,1744266239,IN +1744266240,1744267263,ID +1744267264,1744268287,IN +1744268288,1744269311,SG +1744269312,1744270335,TW +1744270336,1744270591,AU +1744270592,1744270847,ID +1744270848,1744271359,AU +1744271360,1744272383,ID +1744272384,1744272895,PK +1744272896,1744273407,ID +1744273408,1744274431,AU +1744274432,1744275455,SG +1744275456,1744276223,HK +1744276224,1744276479,NL +1744276480,1744278527,HK +1744278528,1744279551,IN +1744279552,1744280575,NZ +1744280576,1744283647,HK +1744283648,1744286719,CN +1744286720,1744286975,SG +1744286976,1744287231,JP +1744287232,1744287743,ID +1744287744,1744288767,AU +1744288768,1744289791,JP +1744289792,1744290815,NZ +1744290816,1744291327,ID +1744291328,1744291583,AF +1744291584,1744291839,SG +1744291840,1744292863,CN +1744292864,1744293887,SG +1744293888,1744294655,IN +1744294656,1744294911,ID +1744294912,1744295935,CN +1744295936,1744296959,ID +1744296960,1744297983,KR +1744297984,1744298495,AU +1744298496,1744299007,ID +1744299008,1744300031,HK +1744300032,1744301055,KR +1744301056,1744301567,AU +1744301568,1744302079,BD +1744303104,1744303615,ID +1744303616,1744303871,IN +1744303872,1744304127,NZ +1744304128,1744305151,AU +1744305152,1744306175,PH +1744306176,1744306687,CN +1744306688,1744308223,AU +1744309248,1744310271,BD +1744310272,1744312319,AU +1744312320,1744312575,IN +1744312576,1744312831,ID +1744312832,1744313343,AU +1744313344,1744315391,IN +1744315392,1744316415,HK +1744316416,1744317439,KH +1744317440,1744318463,AU +1744319488,1744320511,NL +1744320512,1744321535,ID +1744321536,1744322559,IN +1744322560,1744323583,CN +1744323584,1744324607,JP +1744324608,1744325631,IN +1744325632,1744326655,HK +1744326656,1744328703,IN +1744328704,1744329727,HK +1744329728,1744330751,IN +1744330752,1744331263,AU +1744331264,1744331775,SG +1744331776,1744332799,CN +1744332800,1744333823,KR +1744333824,1744334847,HK +1744334848,1744337919,IN +1744337920,1744338943,CN +1744338944,1744339967,AU +1744339968,1744340991,SG +1744340992,1744342015,HK +1744343040,1744343551,SG +1744343552,1744343807,ID +1744343808,1744344063,AU +1744344064,1744345087,JP +1744345088,1744346111,CN +1744346112,1744347135,IN +1744347136,1744349183,VN +1744349184,1744350207,CN +1744350208,1744351231,IN +1744351232,1744352255,NZ +1744352256,1744354303,HK +1744354304,1744355327,AU +1744355328,1744356351,CN +1744356352,1744357375,ID +1744357376,1744357631,NZ +1744357632,1744357887,AU +1744357888,1744358399,IN +1744358400,1744359423,BD +1744359424,1744360447,IN +1744360448,1744361471,CN +1744361472,1744362495,ID +1744362496,1744365567,CN +1744365568,1744366591,IN +1744366592,1744367615,BD +1744368640,1744369663,IN +1744369664,1744369919,ID +1744369920,1744370175,NL +1744370432,1744370687,JP +1744370688,1744371711,HK +1744371712,1744372735,BD +1744372736,1744373759,IN +1744373760,1744375807,CN +1744375808,1744376319,IN +1744376832,1744377855,VN +1744377856,1744378879,IN +1744378880,1744379903,KR +1744379904,1744383999,IN +1744384000,1744384000,AU +1744384001,1744384031,GU +1744384032,1744384039,AU +1744384040,1744384047,GU +1744384048,1744385023,AU +1744385024,1744386047,CN +1744386048,1744386303,BD +1744386304,1744386559,AU +1744386560,1744387071,ID +1744387072,1744388095,NZ +1744388096,1744388607,ID +1744388608,1744389631,AU +1744389632,1744390143,RO +1744390144,1744391167,HK +1744391168,1744393215,IN +1744393216,1744394239,MY +1744394240,1744395263,IN +1744395264,1744396287,MY +1744396288,1744397311,IN +1744397312,1744398335,VN +1744398336,1744399359,CN +1744399360,1744400383,HK +1744400384,1744401407,JP +1744402432,1744403455,IN +1744403456,1744404479,AU +1744404480,1744405503,CN +1744405504,1744406527,IN +1744406528,1744407551,CN +1744407552,1744408575,AU +1744408576,1744409599,CN +1744409600,1744410623,AU +1744410624,1744411647,PK +1744411648,1744412671,LA +1744412672,1744413695,TW +1744413696,1744417791,CN +1744417792,1744418559,IN +1744418560,1744418815,AU +1744418816,1744419839,JP +1744419840,1744421887,CN +1744421888,1744422911,HK +1744423936,1744424959,IN +1744424960,1744425471,MY +1744425472,1744425727,ID +1744425728,1744425983,IN +1744425984,1744428031,JP +1744428032,1744429567,AU +1744429568,1744429823,IN +1744429824,1744430079,ID +1744430080,1744431103,PK +1744431104,1744434175,IN +1744434176,1744435199,CN +1744435200,1744436223,IN +1744436224,1744437247,CN +1744437248,1744438271,KI +1744438272,1744439295,HK +1744439296,1744439807,AU +1744439808,1744440319,IN +1744440320,1744441343,HK +1744441344,1744442367,IN +1744442368,1744443391,AU +1744443392,1744444415,VN +1744444416,1744445439,IN +1744445440,1744446463,CN +1744446464,1744447487,IN +1744447744,1744447999,HK +1744448000,1744448511,BD +1744448512,1744449535,IN +1744449536,1744450559,NZ +1744450560,1744451583,HK +1744451584,1744452607,SG +1744452608,1744453119,AU +1744453120,1744453375,IN +1744453376,1744453631,AU +1744453632,1744454655,SG +1744454656,1744455679,BD +1744455680,1744456703,JP +1744456704,1744459775,IN +1744459776,1744460799,NZ +1744460800,1744461823,JP +1744463872,1744464895,CN +1744464896,1744465919,JP +1744465920,1744466943,IN +1744466944,1744467967,NZ +1744468992,1744470015,CN +1744470016,1744471039,TH +1744471040,1744472063,NP +1744472064,1744473087,IN +1744473088,1744473343,PH +1744473344,1744473599,VN +1744473600,1744473855,ID +1744473856,1744474111,TH +1744474112,1744481279,IN +1744481280,1744482303,JP +1744482304,1744483327,HK +1744483328,1744484351,CN +1744484352,1744486399,IN +1744486400,1744487423,CN +1744487936,1744488191,NZ +1744488192,1744488447,ID +1744488448,1744489471,JP +1744489472,1744490495,NZ +1744490496,1744491519,IN +1744491520,1744492543,AU +1744492544,1744493567,CN +1744494080,1744494591,PK +1744494592,1744495615,CN +1744495616,1744497663,NZ +1744497664,1744498687,CN +1744498688,1744500735,AU +1744500736,1744502783,CN +1744502784,1744503807,MY +1744503808,1744504831,AU +1744505856,1744506367,AU +1744506368,1744506623,ID +1744506624,1744506879,AU +1744506880,1744510975,IN +1744510976,1744511999,CN +1744512000,1744512767,HK +1744512768,1744513023,CN +1744513024,1744513535,ID +1744513536,1744513791,AU +1744513792,1744514047,IN +1744514048,1744514559,ID +1744514560,1744514815,IN +1744514816,1744515071,AU +1744515072,1744519167,IN +1744519168,1744520191,AU +1744520192,1744521215,TH +1744521216,1744523263,JP +1744523264,1744524287,IN +1744524288,1744525311,CN +1744525312,1744526335,HK +1744526336,1744527359,IN +1744527360,1744528383,CN +1744528384,1744529407,IN +1744529408,1744530431,KR +1744530432,1744530943,SG +1744530944,1744531455,AU +1744531456,1744532479,HK +1744532480,1744533503,JP +1744533504,1744534527,BD +1744534528,1744536575,CN +1744536576,1744537087,PW +1744537088,1744538623,AU +1744538624,1744539647,IN +1744539648,1744540671,AU +1744540672,1744541695,IN +1744541696,1744542719,ID +1744542720,1744543743,JP +1744543744,1744544767,CN +1744544768,1744545791,NL +1744545792,1744546047,NZ +1744546048,1744547839,AU +1744547840,1744548863,AF +1744548864,1744549887,ID +1744549888,1744551935,IN +1744551936,1744552959,CN +1744552960,1744553471,SG +1744553472,1744553983,HK +1744553984,1744555007,MY +1744555008,1744556031,CN +1744556032,1744562175,IN +1744562176,1744563199,BD +1744563200,1744564223,HK +1744564224,1744565247,CN +1744565248,1744566271,BD +1744566272,1744567295,IN +1744568320,1744569343,VN +1744569344,1744570367,IN +1744570368,1744571391,AU +1744571392,1744571903,ID +1744571904,1744572415,AU +1744572416,1744573439,HK +1744573440,1744574463,ID +1744574464,1744575487,IN +1744575488,1744576511,CN +1744576512,1744577535,PH +1744577536,1744578559,CN +1744578560,1744580607,IN +1744580864,1744581119,SG +1744581120,1744581631,ID +1744581632,1744582655,IN +1744582656,1744583679,AU +1744583680,1744584703,IN +1744584704,1744585727,CN +1744585728,1744586751,TW +1744586752,1744588799,HK +1744588800,1744589823,PK +1744589824,1744590079,BT +1744590080,1744590335,ID +1744590336,1744590591,IN +1744590592,1744590847,AU +1744590848,1744591871,DE +1744591872,1744592895,IN +1744592896,1744593919,CN +1744593920,1744594431,ID +1744594432,1744594943,AU +1744594944,1744595967,CN +1744595968,1744596991,IN +1744596992,1744597023,AU +1744597024,1744597123,SG +1744597124,1744597124,US +1744597125,1744597151,SG +1744597152,1744597183,IN +1744597184,1744597215,JP +1744597216,1744598015,SG +1744598016,1744599039,IN +1744600064,1744601087,JP +1744601088,1744602111,TW +1744602112,1744603135,HK +1744604160,1744607231,IN +1744607232,1744608255,AU +1744608256,1744609279,IN +1744609536,1744609791,IN +1744609792,1744610047,HK +1744610048,1744610303,ID +1744610304,1744612351,IN +1744612352,1744613375,CN +1744613376,1744614399,PH +1744615424,1744616447,IN +1744616448,1744616959,ID +1744616960,1744617471,AU +1744617472,1744618495,IN +1744618496,1744619519,TW +1744619520,1744620543,SG +1744620544,1744622591,CN +1744622592,1744624639,IN +1744624640,1744625663,NL +1744625664,1744626687,BD +1744626688,1744627711,KR +1744627712,1744628735,CN +1744628736,1744629759,IN +1744629760,1744630783,HK +1744630784,1744631039,TW +1744631040,1744631295,IN +1744631296,1744631551,AU +1744631552,1744631807,NZ +1744631808,1744632831,CN +1744632832,1744633855,VN +1744633856,1744634879,ID +1744634880,1744635903,CN +1744635904,1744636927,HK +1744636928,1744637951,MY +1744640000,1744641023,SG +1744641024,1744643583,IN +1744643584,1744644095,BD +1744644096,1744645119,HK +1744645120,1744646143,BD +1744646144,1744647167,NZ +1744647168,1744648191,IN +1744648192,1744649215,KR +1744649216,1744650239,CN +1744650240,1744651263,AU +1744651264,1744651775,ID +1744651776,1744652287,IN +1744652288,1744653311,TH +1744653312,1744655871,JP +1744655872,1744656383,ID +1744656384,1744657407,VN +1744657408,1744658431,AU +1744658432,1744659455,CA +1744659456,1744660479,JP +1744660480,1744660735,IN +1744660736,1744660991,MY +1744660992,1744661503,ID +1744661504,1744662527,MY +1744662528,1744663551,ID +1744663552,1744663807,NZ +1744663808,1744664063,TH +1744664064,1744664575,AU +1744664576,1744665599,HK +1744665600,1744665855,ID +1744665856,1744666111,IN +1744666112,1744666367,AU +1744666624,1744667647,IN +1744667648,1744668671,TH +1744668672,1744669695,NZ +1744669696,1744670719,HK +1744670720,1744671743,SG +1744671744,1744673791,IN +1744673792,1744674815,PK +1744674816,1744675839,BD +1744675840,1744676351,SG +1744676352,1744678911,IN +1744678912,1744679935,JP +1744679936,1744680959,KH +1744680960,1744681983,TW +1744681984,1744683007,JP +1744683008,1744685055,AU +1744685056,1744686079,IN +1744686080,1744687103,CN +1744687104,1744688127,IN +1744688128,1744689151,ID +1744689152,1744690175,JP +1744690176,1744692223,CN +1744693248,1744694271,CN +1744694272,1744695295,HK +1744695296,1744696319,KR +1744697344,1744698367,HK +1744698368,1744699391,KH +1744699392,1744700415,NZ +1744700416,1744701439,AU +1744701440,1744702463,CN +1744702464,1744704511,VN +1744704512,1744705535,CN +1744705536,1744705791,AU +1744705792,1744706047,ID +1744706048,1744706303,BD +1744706304,1744708607,IN +1744708608,1744709631,PH +1744709632,1744710655,VN +1744710656,1744711679,SG +1744711680,1744712191,ID +1744712192,1744712447,AU +1744712448,1744712703,ID +1744712704,1744714751,IN +1744714752,1744715775,JP +1744715776,1744719871,CN +1744719872,1744720895,IN +1744720896,1744721919,BD +1744721920,1744723455,AU +1744723456,1744723711,BD +1744723712,1744723967,ID +1744723968,1744726015,IN +1744726016,1744727039,ID +1744727040,1744728063,HK +1744728064,1744729087,CN +1744730112,1744731135,MN +1744731648,1744732159,ID +1744732160,1744733183,IN +1744733184,1744734207,NZ +1744734208,1744736255,AU +1744736256,1744737279,JP +1744737280,1744738303,HK +1744738304,1744739327,SG +1744739328,1744740351,NZ +1744740352,1744741375,IN +1744741376,1744741887,AU +1744741888,1744742143,AF +1744742144,1744742399,BD +1744742400,1744743423,ID +1744743424,1744744447,IN +1744744448,1744745471,CN +1744745472,1744747519,NP +1744747520,1744748543,CN +1744748544,1744749055,IN +1744749056,1744749567,NZ +1744749568,1744749823,CN +1744750080,1744750591,US +1744750592,1744752639,IN +1744752640,1744753663,HK +1744754688,1744755711,VN +1744755712,1744756735,HK +1744756736,1744757759,PF +1744757760,1744758271,NZ +1744758272,1744758527,IN +1744758528,1744758783,NZ +1744758784,1744759807,PF +1744759808,1744762879,IN +1744762880,1744763903,KR +1744763904,1744764927,SG +1744764928,1744765951,JP +1744765952,1744766975,PK +1744766976,1744767999,IN +1744768000,1744768255,ID +1744768256,1744768511,TH +1744768512,1744769023,ID +1744769024,1744770047,AU +1744770048,1744771071,JP +1744771072,1744772095,NZ +1744772352,1744772607,ID +1744772608,1744772863,BD +1744772864,1744773119,AU +1744773120,1744774143,SG +1744774144,1744775167,IN +1744776192,1744777215,HK +1744777216,1744778239,AU +1744778240,1744778751,ID +1744778752,1744779263,AU +1744779264,1744781311,HK +1744782336,1744783359,CN +1744783360,1744786431,IN +1744786432,1744787455,VN +1744787456,1744789503,CN +1744789504,1744794623,IN +1744794624,1744795647,KH +1744795648,1744797183,ID +1744797184,1744797439,NP +1744797440,1744797695,HK +1744797696,1744798719,PK +1744799744,1744801791,CN +1744801792,1744802815,IN +1744802816,1744803839,PK +1744803840,1744804863,PH +1744804864,1744805375,ID +1744805376,1744805887,IN +1744807936,1744808447,IN +1744808448,1744808959,MY +1744808960,1744809983,MM +1744809984,1744811007,HK +1744811008,1744812031,IN +1744812032,1744813055,CN +1744813056,1744814079,IN +1744816128,1744817151,CN +1744819200,1744820223,CN +1744820224,1744821247,IN +1744822272,1744823295,IN +1744823296,1744824319,CN +1744824320,1744825343,IN +1744825344,1744826367,VN +1744826368,1744827391,ID +1744827392,1744828415,JP +1744828416,1744828927,AU +1744828928,1744829183,SG +1744829184,1744829439,AU +1744829440,1744830463,HK +1744830464,1745410303,US +1745410304,1745410463,PL +1745410464,1745410471,US +1745410472,1745410559,PL +1745410560,1747191807,US +1747191808,1747193855,CA +1747193856,1747215359,US +1747215360,1747216383,CA +1747216384,1747219455,US +1747219456,1747220479,CA +1747220480,1747227647,US +1747227648,1747228671,CA +1747228672,1747235839,US +1747235840,1747236863,CA +1747236864,1747255807,US +1747255808,1747256063,PR +1747256064,1747256319,US +1747256320,1747256575,IE +1747256576,1747256831,AU +1747256832,1747257087,AE +1747257088,1747257343,IN +1747257344,1747260415,US +1747260416,1747261439,CA +1747261440,1747269887,US +1747269888,1747270143,AT +1747270144,1747270655,US +1747270656,1747272703,CA +1747272704,1747273727,US +1747273728,1747274751,CA +1747274752,1747275775,US +1747275776,1747276799,CA +1747276800,1747283967,US +1747283968,1747284991,CA +1747284992,1747293183,US +1747293184,1747294207,CA +1747294208,1747304447,US +1747304448,1747308543,CA +1747308544,1747316735,US +1747316736,1747317759,CA +1747317760,1747484671,US +1747484672,1747500223,NL +1747500224,1747500224,IE +1747500225,1747517439,NL +1747517440,1747533823,BR +1747533824,1747550207,IE +1747550208,1747558399,US +1747558400,1747566591,JP +1747566592,1747582975,IE +1747582976,1747648511,US +1747648512,1747681279,SG +1747681280,1747716671,US +1747716672,1747716683,NL +1747716684,1747734535,US +1747734536,1747734539,SE +1747734540,1747734543,US +1747734544,1747734547,SE +1747734548,1747734551,US +1747734552,1747734555,SE +1747734556,1747735679,US +1747735680,1747735743,SG +1747735744,1747736063,US +1747736064,1747736319,IE +1747736320,1747736575,HK +1747736576,1747736639,US +1747736640,1747736671,IE +1747736672,1747736767,US +1747736768,1747736799,HK +1747736800,1747736831,JP +1747736832,1747736863,US +1747736864,1747736895,SG +1747736896,1747736991,US +1747736992,1747737023,NL +1747737024,1747737055,US +1747737056,1747737119,GB +1747737120,1747737215,AU +1747737216,1747737247,SG +1747737248,1747737279,KR +1747737280,1747737311,NL +1747737312,1747737343,HK +1747737344,1747737407,US +1747737408,1747737439,IE +1747737440,1747737535,US +1747737536,1747737567,HK +1747737568,1747737631,JP +1747737632,1747737663,SG +1747737664,1747737727,US +1747737728,1747737791,IN +1747737792,1747737823,IE +1747737824,1747737855,US +1747737856,1747737887,NL +1747737888,1747737951,CA +1747737952,1747738015,AU +1747738016,1747738047,US +1747738048,1747738079,NL +1747738080,1747738111,IN +1747738112,1747738143,US +1747738144,1747738159,IE +1747738160,1747738207,US +1747738208,1747738223,HK +1747738224,1747738255,JP +1747738256,1747738271,SG +1747738272,1747738303,US +1747738304,1747738335,IN +1747738336,1747738367,KR +1747738368,1747738383,US +1747738384,1747738415,CA +1747738416,1747738447,AU +1747738448,1747738479,NL +1747738480,1747738495,IN +1747738496,1747738559,US +1747738560,1747738575,SG +1747738576,1747738591,US +1747738592,1747738607,SG +1747738608,1747738815,US +1747738816,1747739135,SG +1747739136,1747740159,US +1747740160,1747740671,AU +1747740672,1747741183,JP +1747741184,1747741215,US +1747741216,1747741311,IN +1747741312,1747741343,AT +1747741344,1747741375,IE +1747741376,1747741407,NL +1747741408,1747741439,BR +1747741440,1747741471,AU +1747741472,1747741503,SG +1747741504,1747741551,IN +1747741552,1747741823,US +1747741824,1747741887,IE +1747741888,1747741919,CL +1747741920,1747743487,US +1747743488,1747743743,NL +1747743744,1747743999,IE +1747744000,1747744255,SG +1747744256,1747744511,HK +1747744512,1747744767,US +1747744768,1747746815,SG +1747746816,1747763679,US +1747763680,1747763711,AU +1747763712,1747763839,HK +1747763840,1747765919,US +1747765920,1747765951,IE +1747765952,1747765983,SG +1747765984,1747766047,CA +1747766048,1747766151,US +1747766152,1747766159,IE +1747766160,1747766167,HK +1747766168,1747766207,US +1747766208,1747766271,HK +1747766272,1747767423,US +1747767424,1747767439,NL +1747767440,1747767455,US +1747767456,1747767487,HK +1747767488,1747767551,SG +1747767552,1747767615,HK +1747767616,1747767743,IN +1747767744,1747767759,US +1747767760,1747767807,NL +1747767808,1747767871,US +1747767872,1747767887,IE +1747767888,1747767903,AU +1747767904,1747767919,JP +1747767920,1747767935,AU +1747767936,1747767951,JP +1747767952,1747767983,US +1747767984,1747767999,NL +1747768000,1747768031,US +1747768032,1747768063,NL +1747768064,1747770239,US +1747770240,1747770367,IN +1747770368,1747770623,US +1747770624,1747770655,JP +1747770656,1747770687,SG +1747770688,1747770719,JP +1747770720,1747770751,IE +1747770752,1747770815,AT +1747770816,1747770943,US +1747770944,1747771007,SE +1747771008,1747771135,AU +1747771136,1747777679,US +1747777680,1747777743,CA +1747777744,1747777791,NL +1747777792,1747778047,US +1747778048,1747778175,NL +1747778176,1747778303,IE +1747778304,1747779071,US +1747779072,1747779135,IN +1747779136,1747779199,SG +1747779200,1747779455,NL +1747779456,1747779519,IE +1747779520,1747779583,US +1747779584,1747800063,NL +1747800064,1747812351,IE +1747812352,1747847167,US +1747847168,1747849215,IE +1747849216,1747851263,NL +1747851264,1747852287,HK +1747852288,1747853311,AU +1747853312,1747861503,NL +1747861504,1747869695,IE +1747869696,1747877887,US +1747877888,1747886079,SG +1747886080,1747894271,HK +1747894272,1747898367,US +1747898368,1747906559,JP +1747906560,1747910655,AU +1747910656,1747910911,FI +1747910912,1747911167,AT +1747911168,1747911423,IE +1747911424,1747911679,US +1747911680,1747911935,NL +1747911936,1747912191,FI +1747912192,1747912703,US +1747912704,1747912959,NL +1747912960,1747913215,AT +1747913216,1747913471,IE +1747913472,1747913727,US +1747913728,1747913983,IE +1747913984,1747914239,FI +1747914240,1747914495,AT +1747914496,1747915775,US +1747915776,1747916287,GB +1747916288,1747926015,US +1747926016,1747926527,CA +1747926528,1747934207,US +1747934208,1747934719,JP +1747934720,1747936255,US +1747936256,1747936767,IN +1747936768,1747938303,US +1747938304,1747938815,KR +1747938816,1747940351,US +1747940352,1747940607,AU +1747940608,1747941375,US +1747941376,1747941631,HK +1747941632,1747941887,SG +1747941888,1747942143,MY +1747942144,1747942655,US +1747942656,1747942911,SG +1747942912,1747943167,KR +1747943168,1747943423,US +1747943424,1747959807,NL +1747959808,1747964415,US +1747964416,1747965951,IN +1747965952,1747966015,US +1747966016,1747966079,NL +1747966080,1747966095,IE +1747966096,1747966463,US +1747966464,1747966975,IE +1747966976,1749061631,US +1749061632,1749069823,NL +1749069824,1749094399,US +1749094400,1749098495,NL +1749098496,1749172223,US +1749172224,1749188607,NL +1749188608,1749196799,US +1749196800,1749204991,NL +1749204992,1749221375,US +1749221376,1749229567,NL +1749229568,1749327871,US +1749327872,1749336063,NL +1749336064,1749340159,US +1749340160,1749344255,NL +1749344256,1749364735,US +1749364736,1749381119,NL +1749381120,1749397503,US +1749397504,1749406719,NL +1749406720,1749413887,US +1749413888,1749422079,NL +1749422080,1749449727,US +1749449728,1749450239,NL +1749450240,1749465087,US +1749465088,1749465599,NL +1749465600,1749497855,US +1749497856,1749499391,NL +1749499392,1749508095,US +1749508096,1749516287,NL +1749516288,1749516799,US +1749516800,1749517055,NL +1749517056,1749517311,US +1749517312,1749518335,NL +1749518336,1749537791,US +1749537792,1749539327,NL +1749539328,1749567121,US +1749567122,1749567122,AU +1749567123,1749567130,US +1749567131,1749567131,AU +1749567132,1749586943,US +1749586944,1749588479,NL +1749588480,1749590015,US +1749590016,1749598207,NL +1749598208,1749618175,US +1749618176,1749618687,NL +1749618688,1749635071,US +1749635072,1749636095,NL +1749636096,1749647359,US +1749647360,1749655551,NL +1749655552,1749686527,US +1749686528,1749686783,NL +1749686784,1749696511,US +1749696512,1749698047,NL +1749698048,1749698559,US +1749698560,1749718015,NL +1749718016,1749749247,US +1749749248,1749749759,NL +1749749760,1749757951,US +1749757952,1749767167,NL +1749767168,1749767679,US +1749767680,1749769215,NL +1749769216,1749770239,US +1749770240,1749778431,NL +1749778432,1749816831,US +1749816832,1749818367,NL +1749818368,1749819391,US +1749819392,1749827583,NL +1749827584,1749862143,US +1749862144,1749863167,NL +1749863168,1749863423,US +1749863424,1749864191,NL +1749864192,1749864447,US +1749864448,1749865727,NL +1749865728,1749865983,US +1749865984,1749866495,NL +1749866496,1749867263,US +1749867264,1749868287,NL +1749868288,1749901311,US +1749901312,1749901567,NL +1749901568,1749925887,US +1749925888,1749926143,NL +1749926144,1749931007,US +1749931008,1749932031,NL +1749932032,1749934079,US +1749934080,1749942271,NL +1749942272,1750079999,US +1750080000,1750080511,NL +1750080512,1750096383,US +1750096384,1750106111,NL +1750106112,1750123007,US +1750123008,1750126079,NL +1750126080,1750126591,US +1750126592,1750142975,NL +1750142976,1750147071,US +1750147072,1750151167,NL +1750151168,1750152191,US +1750152192,1750153727,NL +1750153728,1750154239,US +1750154240,1750159359,NL +1750159360,1750163455,US +1750163456,1750172671,NL +1750172672,1750174719,US +1750174720,1750175743,NL +1750175744,1750192127,US +1750192128,1750201855,NL +1750201856,1750221311,US +1750221312,1750224383,NL +1750224384,1750224895,US +1750224896,1750252543,NL +1750252544,1750253055,US +1750253056,1750294015,NL +1750294016,1750294527,US +1750294528,1750310911,NL +1750310912,1750315007,US +1750315008,1750320127,NL +1750320128,1750321151,US +1750321152,1750321663,NL +1750321664,1750323199,US +1750323200,1750327295,NL +1750327296,1750350847,US +1750350848,1750351871,NL +1750351872,1750372351,US +1750372352,1750373375,NL +1750373376,1750374399,US +1750374400,1750394367,NL +1750394368,1750395903,US +1750395904,1750396927,NL +1750396928,1750405119,US +1750405120,1750415359,NL +1750415360,1750417407,US +1750417408,1750425599,NL +1750425600,1750443519,US +1750443520,1750444031,NL +1750444032,1750463487,US +1750463488,1750482943,NL +1750482944,1750492159,US +1750492160,1750492671,NL +1750492672,1750493183,US +1750493184,1750494207,NL +1750494208,1750494719,US +1750494720,1750503423,NL +1750503424,1750515199,US +1750515200,1750515711,NL +1750515712,1750523903,US +1750523904,1750534655,NL +1750534656,1750536191,US +1750536192,1750544383,NL +1750544384,1750573055,US +1750573056,1750581247,NL +1750581248,1750585343,US +1750585344,1750593535,NL +1750593536,1750664191,US +1750664192,1750665727,NL +1750665728,1750667263,US +1750667264,1750675455,NL +1750675456,1750694911,US +1750694912,1750695423,NL +1750695424,1750705151,US +1750705152,1750706687,NL +1750706688,1750708223,US +1750708224,1750716415,NL +1750716416,1750754815,US +1750754816,1750757375,NL +1750757376,1750761471,US +1750761472,1750778367,NL +1750778368,1750781439,US +1750781440,1750781951,NL +1750781952,1750877695,US +1750877696,1750879231,NL +1750879232,1750880255,US +1750880256,1750888447,NL +1750888448,1750926335,US +1750926336,1750926847,NL +1750926848,1750946303,US +1750946304,1750946815,NL +1750946816,1750977535,US +1750977536,1750978559,NL +1750978560,1750986751,US +1750986752,1750996991,NL +1750996992,1750998527,US +1750998528,1751007231,NL +1751007232,1751015423,US +1751015424,1751016703,NL +1751016704,1751016959,US +1751016960,1751027711,NL +1751027712,1751031807,US +1751031808,1751040511,NL +1751040512,1751104511,US +1751104512,1751105023,NL +1751105024,1751121919,US +1751121920,1751124479,NL +1751124480,1751125503,US +1751125504,1751134207,NL +1751134208,1751144959,US +1751144960,1751146495,NL +1751146496,1751154687,US +1751154688,1751163391,NL +1751163392,1751253503,US +1751253504,1751253759,NL +1751253760,1751255551,US +1751255552,1751256063,NL +1751256064,1751285759,US +1751285760,1751289855,NL +1751289856,1751293951,US +1751293952,1751298047,NL +1751298048,1751490559,US +1751490560,1751498751,NL +1751498752,1751505919,US +1751505920,1751506175,IN +1751506176,1751506431,HK +1751506432,1751510015,US +1751510016,1751521279,NL +1751521280,1751523327,US +1751523328,1751531519,NL +1751531520,1751598847,US +1751598848,1751621631,NL +1751621632,1751625727,US +1751625728,1751640319,NL +1751640320,1751641087,US +1751641088,1751641599,NL +1751641600,1751642111,US +1751642112,1751650303,NL +1751650304,1751682047,US +1751682048,1751683071,NL +1751683072,1751691263,US +1751691264,1751699455,NL +1751699456,1751724031,US +1751724032,1751728127,NL +1751728128,1751798271,US +1751798272,1751800319,NL +1751800320,1751801855,US +1751801856,1751810047,NL +1751810048,1751834623,US +1751834624,1751838719,NL +1751838720,1751879679,US +1751879680,1751883775,NL +1751883776,1751884799,US +1751884800,1751885823,NL +1751885824,1751896063,US +1751896064,1751896831,NL +1751896832,1751897087,US +1751897088,1751928831,NL +1751928832,1751946239,US +1751946240,1751947263,NL +1751947264,1751949311,US +1751949312,1751957503,NL +1751957504,1751987711,US +1751987712,1752007167,NL +1752007168,1752037887,US +1752037888,1752038143,NL +1752038144,1752087807,US +1752087808,1752088063,NL +1752088064,1752159231,US +1752159232,1752161279,NL +1752161280,1752162303,US +1752162304,1752170495,NL +1752170496,1752300031,US +1752300032,1752300287,NL +1752300288,1752330239,US +1752330240,1752338431,NL +1752338432,1752458239,US +1752458240,1752458495,NL +1752458496,1752495103,US +1752495104,1752495359,NL +1752495360,1752563711,US +1752563712,1752564223,NL +1752564224,1752566783,US +1752566784,1752568831,NL +1752568832,1752570367,US +1752570368,1752570623,NL +1752570624,1752618495,US +1752618496,1752619007,NL +1752619008,1752619263,US +1752619264,1752619519,NL +1752619520,1752637951,US +1752637952,1752638463,NL +1752638464,1752675839,US +1752675840,1752676351,NL +1752676352,1752730111,US +1752730112,1752730367,NL +1752730368,1752750079,US +1752750080,1752751615,NL +1752751616,1752756223,US +1752756224,1752768511,NL +1752768512,1752776703,US +1752776704,1752778239,NL +1752778240,1752779775,US +1752779776,1752780799,NL +1752780800,1752788991,US +1752788992,1752798463,NL +1752798464,1752798719,US +1752798720,1752818687,NL +1752818688,1752834047,US +1752834048,1752838143,NL +1752838144,1752847359,US +1752847360,1752847871,NL +1752847872,1752875007,US +1752875008,1752879103,NL +1752879104,1752880127,US +1752880128,1752881151,NL +1752881152,1752882175,US +1752882176,1752882687,NL +1752882688,1752883199,US +1752883200,1752891391,NL +1752891392,1752895487,US +1752895488,1752903679,NL +1752903680,1752911871,US +1752911872,1752929279,NL +1752929280,1752931327,US +1752931328,1752932351,NL +1752932352,1752940543,US +1752940544,1752946175,NL +1752946176,1752948735,US +1752948736,1752952831,NL +1752952832,1752971007,US +1752971008,1752971263,NL +1752971264,1752982527,US +1752982528,1753005055,NL +1753005056,1753006079,US +1753006080,1753014271,NL +1753014272,1753022975,US +1753022976,1753026047,NL +1753026048,1753026559,US +1753026560,1753042943,NL +1753042944,1753046015,US +1753046016,1753046271,NL +1753046272,1753077247,US +1753077248,1753077503,NL +1753077504,1753097727,US +1753097728,1753117183,NL +1753117184,1753128959,US +1753128960,1753133055,NL +1753133056,1753157631,US +1753157632,1753169919,NL +1753169920,1753251839,US +1753251840,1753252095,MN +1753252096,1753252351,SY +1753252352,1753252607,BY +1753252608,1753252863,PK +1753252864,1753253119,SD +1753253120,1753253375,LK +1753253376,1753253631,ID +1753253632,1753253887,LB +1753253888,1753254143,OM +1753254144,1753254399,MT +1753254400,1753254655,MK +1753254656,1753254911,MY +1753254912,1753255167,AL +1753255168,1753255423,US +1753255424,1753255679,DZ +1753255680,1753255935,KZ +1753255936,1753260031,CA +1753260032,1753280511,US +1753280512,1753284607,CA +1753284608,1753309183,US +1753309184,1753317375,CA +1753317376,1753325055,US +1753325056,1753325567,CA +1753325568,1753330687,US +1753330688,1753331711,CA +1753331712,1753341951,US +1753341952,1753346047,CA +1753346048,1753481727,US +1753481728,1753481983,SG +1753481984,1753482751,US +1753482752,1753483007,PL +1753483008,1753483263,US +1753483264,1753483519,IE +1753483520,1753483775,IL +1753483776,1753484031,PH +1753484032,1753484607,US +1753484608,1753484655,BR +1753484656,1753485567,US +1753485568,1753485823,GH +1753485824,1753487359,US +1753487360,1753487615,CH +1753487616,1753487679,US +1753487680,1753487727,GB +1753487728,1753489407,US +1753489408,1753489663,GB +1753489664,1753489919,HK +1753489920,1753490175,US +1753490176,1753490431,AU +1753490432,1753490687,IL +1753490688,1753492799,US +1753492800,1753492847,GB +1753492848,1753494527,US +1753494528,1753494783,IL +1753494784,1753497407,US +1753497408,1753497455,PH +1753497456,1753497599,US +1753497600,1753498111,RU +1753498112,1753499391,US +1753499392,1753499647,PH +1753499648,1753499903,AE +1753499904,1753500159,US +1753500160,1753500415,SK +1753500416,1753500991,US +1753500992,1753501039,CA +1753501040,1753507391,US +1753507392,1753507439,KR +1753507440,1753512703,US +1753512704,1753512959,SG +1753512960,1753515007,US +1753515008,1753516031,AU +1753516032,1753516543,US +1753516544,1753516799,ES +1753516800,1753517567,US +1753517568,1753517823,NO +1753517824,1753518079,US +1753518080,1753519103,JP +1753519104,1753520447,US +1753520448,1753520495,GB +1753520496,1753522431,US +1753522432,1753522687,FR +1753522688,1753526015,US +1753526016,1753526271,DE +1753526272,1753527039,US +1753527040,1753527295,NL +1753527296,1753529087,US +1753529088,1753529343,NZ +1753529344,1753532415,US +1753532416,1753532671,JP +1753532672,1753538815,US +1753538816,1753539071,PH +1753539072,1753539327,US +1753539328,1753539583,IE +1753539584,1753539839,CH +1753539840,1753541631,US +1753541632,1753541887,DE +1753541888,1753735167,US +1753735168,1753743359,IE +1753743360,1754136575,US +1754136576,1754169343,CA +1754169344,1754206335,US +1754206336,1754206463,WS +1754206464,1754206719,US +1754206720,1754206975,GW +1754206976,1754207231,RW +1754207232,1754207487,GA +1754207488,1754207743,KI +1754207744,1754207999,MM +1754208000,1754208255,VU +1754208256,1754208326,NA +1754208327,1754208327,AO +1754208328,1754208353,NA +1754208354,1754208354,AO +1754208355,1754208511,NA +1754208512,1754208767,DJ +1754208768,1754209023,BF +1754209024,1754209279,BW +1754209280,1754209535,PW +1754209536,1754209791,BR +1754209792,1754210047,AR +1754210048,1754210303,BJ +1754210304,1754223615,US +1754223616,1754223623,MX +1754223624,1754223631,AU +1754223632,1754251519,US +1754251520,1754251775,LY +1754251776,1754252031,US +1754252032,1754252287,MR +1754252288,1754252543,US +1754252544,1754252799,MZ +1754252800,1754253055,US +1754253056,1754253311,GN +1754253312,1754253567,US +1754253568,1754253823,ML +1754253824,1754254079,US +1754254080,1754254335,SO +1754254336,1754254591,CD +1754254592,1754254847,US +1754254848,1754255103,VE +1754255104,1754255359,US +1754255360,1754255615,EC +1754255616,1754255871,US +1754255872,1754256127,PY +1754256128,1754256383,US +1754256384,1754256639,BO +1754256640,1754256895,US +1754256896,1754257151,UY +1754257152,1754257407,US +1754257408,1754257663,TZ +1754257664,1754257919,US +1754257920,1754258175,TD +1754258176,1754258431,US +1754258432,1754258687,MG +1754258688,1754258943,US +1754258944,1754259199,TN +1754259200,1754267647,US +1754267648,1754267719,CA +1754267720,1754267727,US +1754267728,1754267935,CA +1754267936,1754267943,US +1754267944,1754267951,CA +1754267952,1754267959,FI +1754267960,1754267991,US +1754267992,1754268007,CA +1754268008,1754268015,US +1754268016,1754268063,CA +1754268064,1754268079,US +1754268080,1754268095,CA +1754268096,1754268159,US +1754268160,1754269055,CA +1754269056,1754269087,US +1754269088,1754269103,CA +1754269104,1754269119,US +1754269120,1754269151,CA +1754269152,1754269183,US +1754269184,1754269247,CA +1754269248,1754269311,US +1754269312,1754269327,CA +1754269328,1754269343,US +1754269344,1754269375,CA +1754269376,1754269423,US +1754269424,1754269567,CA +1754269568,1754269599,US +1754269600,1754269615,CA +1754269616,1754269631,US +1754269632,1754269647,CA +1754269648,1754269663,US +1754269664,1754271135,CA +1754271136,1754271167,US +1754271168,1754271231,CA +1754271232,1754271743,US +1754271744,1754271999,CA +1754272000,1754272127,US +1754272128,1754272143,CA +1754272144,1754272159,US +1754272160,1754272191,CA +1754272192,1754272207,US +1754272208,1754272223,CA +1754272224,1754272255,US +1754272256,1754272383,CA +1754272384,1754272415,US +1754272416,1754272431,CA +1754272432,1754272479,US +1754272480,1754272495,CA +1754272496,1754272511,US +1754272512,1754272655,CA +1754272656,1754272671,US +1754272672,1754272703,CA +1754272704,1754272719,US +1754272720,1754272735,CA +1754272736,1754272895,US +1754272896,1754272927,CA +1754272928,1754272975,US +1754272976,1754272991,CA +1754272992,1754273023,US +1754273024,1754273151,CA +1754273152,1754273183,US +1754273184,1754273199,CA +1754273200,1754273247,US +1754273248,1754273263,CA +1754273264,1754273279,US +1754273280,1754273407,CA +1754273408,1754273439,US +1754273440,1754273455,CA +1754273456,1754273487,US +1754273488,1754273839,CA +1754273840,1754273871,US +1754273872,1754273887,CA +1754273888,1754274175,US +1754274176,1754274559,CA +1754274560,1754274815,US +1754274816,1754274959,CA +1754274960,1754274991,US +1754274992,1754275007,CA +1754275008,1754275023,US +1754275024,1754275039,CA +1754275040,1754275199,US +1754275200,1754276127,CA +1754276128,1754276159,US +1754276160,1754276223,CA +1754276224,1754276287,US +1754276288,1754276863,CA +1754276864,1754277119,US +1754277120,1754281223,CA +1754281224,1754281231,NO +1754281232,1754281279,CA +1754281280,1754281343,US +1754281344,1754281407,CA +1754281408,1754281455,US +1754281456,1754281535,CA +1754281536,1754281663,US +1754281664,1754281727,CA +1754281728,1754281983,US +1754281984,1754282495,CA +1754282496,1754282751,US +1754282752,1754282895,CA +1754282896,1754282927,US +1754282928,1754282943,CA +1754282944,1754282959,US +1754282960,1754282967,CA +1754282968,1754282975,SE +1754282976,1754283007,US +1754283008,1754283263,CA +1754283264,1754283519,US +1754283520,1754284607,CA +1754284608,1754284671,US +1754284672,1754284703,CA +1754284704,1754284735,US +1754284736,1754285151,CA +1754285152,1754285167,US +1754285168,1754285951,CA +1754285952,1754286015,US +1754286016,1754286591,CA +1754286592,1754286847,US +1754286848,1754288143,CA +1754288144,1754288159,US +1754288160,1754288191,CA +1754288192,1754288207,US +1754288208,1754288223,CA +1754288224,1754288239,US +1754288240,1754288255,CA +1754288256,1754288383,US +1754288384,1754288447,CA +1754288448,1754288575,US +1754288576,1754288911,CA +1754288912,1754288927,US +1754288928,1754288943,CA +1754288944,1754288991,US +1754288992,1754289007,CA +1754289008,1754289055,US +1754289056,1754289071,CA +1754289072,1754289087,US +1754289088,1754289471,CA +1754289472,1754289487,US +1754289488,1754289495,CA +1754289496,1754289503,NO +1754289504,1754289519,US +1754289520,1754289535,CA +1754289536,1754289663,US +1754289664,1754290431,CA +1754290432,1754290447,US +1754290448,1754290479,CA +1754290480,1754290511,US +1754290512,1754290527,CA +1754290528,1754290543,US +1754290544,1754290559,CA +1754290560,1754290591,US +1754290592,1754290607,CA +1754290608,1754290623,US +1754290624,1754290943,CA +1754290944,1754290975,US +1754290976,1754290991,CA +1754290992,1754291023,US +1754291024,1754291039,CA +1754291040,1754291103,US +1754291104,1754291119,CA +1754291120,1754291135,US +1754291136,1754291471,CA +1754291472,1754291503,US +1754291504,1754291519,CA +1754291520,1754291535,US +1754291536,1754291551,CA +1754291552,1754291711,US +1754291712,1754292031,CA +1754292032,1754292095,US +1754292096,1754292543,CA +1754292544,1754292607,US +1754292608,1754292639,CA +1754292640,1754292671,US +1754292672,1754293343,CA +1754293344,1754293439,US +1754293440,1754294015,CA +1754294016,1754294063,US +1754294064,1754294079,CA +1754294080,1754294095,US +1754294096,1754294111,CA +1754294112,1754294127,US +1754294128,1754294143,CA +1754294144,1754294271,US +1754294272,1754294527,CA +1754294528,1754294655,US +1754294656,1754294943,CA +1754294944,1754294959,US +1754294960,1754294967,CA +1754294968,1754294975,US +1754294976,1754295951,CA +1754295952,1754295983,US +1754295984,1754295999,CA +1754296000,1754296015,US +1754296016,1754296031,CA +1754296032,1754296063,US +1754296064,1754296383,CA +1754296384,1754296407,US +1754296408,1754296415,CA +1754296416,1754296527,US +1754296528,1754296543,CA +1754296544,1754296575,US +1754296576,1754297471,CA +1754297472,1754297487,US +1754297488,1754297503,CA +1754297504,1754297535,US +1754297536,1754297551,CA +1754297552,1754297583,US +1754297584,1754298623,CA +1754298624,1754299135,US +1754299136,1754299647,CA +1754299648,1754299695,US +1754299696,1754299775,CA +1754299776,1754299791,US +1754299792,1754299839,CA +1754299840,1754299903,US +1754299904,1754300543,CA +1754300544,1754300575,US +1754300576,1754300591,CA +1754300592,1754300639,US +1754300640,1754300671,CA +1754300672,1754300751,US +1754300752,1754300767,CA +1754300768,1754300783,US +1754300784,1754300799,CA +1754300800,1754300879,US +1754300880,1754300895,CA +1754300896,1754300927,US +1754300928,1754303231,CA +1754303232,1754303247,US +1754303248,1754303359,CA +1754303360,1754303375,US +1754303376,1754303391,CA +1754303392,1754303487,US +1754303488,1754303551,CA +1754303552,1754303567,US +1754303568,1754303575,CA +1754303576,1754303679,US +1754303680,1754304543,CA +1754304544,1754304551,US +1754304552,1754304767,CA +1754304768,1754304783,US +1754304784,1754304799,CA +1754304800,1754304895,US +1754304896,1754304911,CA +1754304912,1754304943,US +1754304944,1754304959,CA +1754304960,1754304991,US +1754304992,1754305663,CA +1754305664,1754305695,US +1754305696,1754305711,CA +1754305712,1754305743,US +1754305744,1754305767,CA +1754305768,1754305791,US +1754305792,1754306047,CA +1754306048,1754306559,US +1754306560,1754306975,CA +1754306976,1754307031,US +1754307032,1754307039,CA +1754307040,1754307071,US +1754307072,1754307327,CA +1754307328,1754307391,US +1754307392,1754307423,CA +1754307424,1754307439,US +1754307440,1754307455,CA +1754307456,1754307487,US +1754307488,1754307503,CA +1754307504,1754307583,US +1754307584,1754307895,CA +1754307896,1754307903,SE +1754307904,1754308015,US +1754308016,1754308103,CA +1754308104,1754308111,US +1754308112,1754308127,CA +1754308128,1754308143,US +1754308144,1754308159,CA +1754308160,1754308191,US +1754308192,1754308239,CA +1754308240,1754308255,US +1754308256,1754308271,CA +1754308272,1754308303,US +1754308304,1754308311,CA +1754308312,1754308319,US +1754308320,1754308351,CA +1754308352,1754308367,US +1754308368,1754308383,CA +1754308384,1754308415,US +1754308416,1754308431,CA +1754308432,1754308447,US +1754308448,1754308455,CA +1754308456,1754308463,US +1754308464,1754308479,CA +1754308480,1754308543,US +1754308544,1754308559,CA +1754308560,1754308575,US +1754308576,1754308863,CA +1754308864,1754308879,US +1754308880,1754308895,CA +1754308896,1754308943,US +1754308944,1754308951,CA +1754308952,1754308959,SE +1754308960,1754308975,CA +1754308976,1754308991,US +1754308992,1754309023,CA +1754309024,1754309055,US +1754309056,1754309439,CA +1754309440,1754309471,US +1754309472,1754309479,CA +1754309480,1754309487,US +1754309488,1754309503,CA +1754309504,1754309583,US +1754309584,1754309615,CA +1754309616,1754309631,US +1754309632,1754309887,CA +1754309888,1754309903,US +1754309904,1754309935,CA +1754309936,1754309951,US +1754309952,1754309983,CA +1754309984,1754309999,US +1754310000,1754310079,CA +1754310080,1754310111,US +1754310112,1754310127,CA +1754310128,1754310143,US +1754310144,1754310415,CA +1754310416,1754310431,US +1754310432,1754310463,CA +1754310464,1754310479,US +1754310480,1754310495,CA +1754310496,1754310527,US +1754310528,1754310911,CA +1754310912,1754310943,US +1754310944,1754310975,CA +1754310976,1754310991,US +1754310992,1754311055,CA +1754311056,1754311119,US +1754311120,1754311151,CA +1754311152,1754311167,US +1754311168,1754311423,CA +1754311424,1754311487,US +1754311488,1754311503,CA +1754311504,1754311519,US +1754311520,1754311615,CA +1754311616,1754311647,US +1754311648,1754311663,CA +1754311664,1754311679,US +1754311680,1754311695,CA +1754311696,1754311711,US +1754311712,1754311743,CA +1754311744,1754311759,US +1754311760,1754311791,CA +1754311792,1754311967,US +1754311968,1754311975,CA +1754311976,1754311983,US +1754311984,1754311999,CA +1754312000,1754312191,US +1754312192,1754312447,CA +1754312448,1754312463,US +1754312464,1754312495,CA +1754312496,1754312575,US +1754312576,1754312639,CA +1754312640,1754312655,US +1754312656,1754312671,CA +1754312672,1754312703,US +1754312704,1754312719,CA +1754312720,1754312735,US +1754312736,1754312767,CA +1754312768,1754312783,US +1754312784,1754312815,CA +1754312816,1754312831,US +1754312832,1754312847,CA +1754312848,1754312863,US +1754312864,1754312879,CA +1754312880,1754312959,US +1754312960,1754313023,CA +1754313024,1754313055,US +1754313056,1754313071,CA +1754313072,1754313119,US +1754313120,1754313135,CA +1754313136,1754313151,US +1754313152,1754313247,CA +1754313248,1754313327,US +1754313328,1754313343,CA +1754313344,1754313391,US +1754313392,1754313535,CA +1754313536,1754313583,US +1754313584,1754313599,CA +1754313600,1754313615,US +1754313616,1754313663,CA +1754313664,1754313679,US +1754313680,1754313791,CA +1754313792,1754313807,US +1754313808,1754313823,CA +1754313824,1754313839,US +1754313840,1754313847,CA +1754313848,1754313903,US +1754313904,1754314031,CA +1754314032,1754314079,US +1754314080,1754314127,CA +1754314128,1754314143,US +1754314144,1754314175,CA +1754314176,1754314191,US +1754314192,1754314207,CA +1754314208,1754314239,US +1754314240,1754314255,CA +1754314256,1754314415,US +1754314416,1754314431,CA +1754314432,1754314463,US +1754314464,1754314511,CA +1754314512,1754314527,US +1754314528,1754314559,CA +1754314560,1754314575,US +1754314576,1754314623,CA +1754314624,1754314719,US +1754314720,1754314735,CA +1754314736,1754314767,US +1754314768,1754314815,CA +1754314816,1754314847,US +1754314848,1754314863,CA +1754314864,1754314991,US +1754314992,1754315071,CA +1754315072,1754315087,US +1754315088,1754315103,CA +1754315104,1754315135,US +1754315136,1754315199,CA +1754315200,1754315215,US +1754315216,1754315223,CA +1754315224,1754315263,US +1754315264,1754315311,CA +1754315312,1754315343,US +1754315344,1754315407,CA +1754315408,1754315423,US +1754315424,1754315471,CA +1754315472,1754315519,US +1754315520,1754315535,CA +1754315536,1754315551,US +1754315552,1754315559,CA +1754315560,1754315615,US +1754315616,1754315623,CA +1754315624,1754315631,US +1754315632,1754315647,CA +1754315648,1754316287,US +1754316288,1754317839,CA +1754317840,1754317903,US +1754317904,1754317919,CA +1754317920,1754317935,US +1754317936,1754317943,CA +1754317944,1754318111,US +1754318112,1754318119,CA +1754318120,1754318143,US +1754318144,1754318159,CA +1754318160,1754318175,US +1754318176,1754318207,CA +1754318208,1754318335,US +1754318336,1754319103,CA +1754319104,1754319119,US +1754319120,1754319135,CA +1754319136,1754319167,US +1754319168,1754319207,CA +1754319208,1754319215,US +1754319216,1754319247,CA +1754319248,1754319263,US +1754319264,1754319295,CA +1754319296,1754319311,US +1754319312,1754319327,CA +1754319328,1754319391,US +1754319392,1754319479,CA +1754319480,1754319487,US +1754319488,1754319551,CA +1754319552,1754319567,US +1754319568,1754319599,CA +1754319600,1754319615,US +1754319616,1754319663,CA +1754319664,1754319727,US +1754319728,1754319935,CA +1754319936,1754319951,US +1754319952,1754319983,CA +1754319984,1754319999,US +1754320000,1754320063,CA +1754320064,1754320095,US +1754320096,1754320111,CA +1754320112,1754320127,US +1754320128,1754320167,CA +1754320168,1754320223,US +1754320224,1754320231,CA +1754320232,1754320255,US +1754320256,1754320319,CA +1754320320,1754320415,US +1754320416,1754320447,CA +1754320448,1754320479,US +1754320480,1754320495,CA +1754320496,1754320527,US +1754320528,1754320543,CA +1754320544,1754320559,US +1754320560,1754320623,CA +1754320624,1754320639,US +1754320640,1754320655,CA +1754320656,1754320671,US +1754320672,1754320703,CA +1754320704,1754320719,US +1754320720,1754320767,CA +1754320768,1754320799,US +1754320800,1754320815,CA +1754320816,1754320895,US +1754320896,1754320911,CA +1754320912,1754320927,US +1754320928,1754320951,CA +1754320952,1754320975,US +1754320976,1754321023,CA +1754321024,1754321055,US +1754321056,1754321103,CA +1754321104,1754321119,US +1754321120,1754321151,CA +1754321152,1754321167,US +1754321168,1754321199,CA +1754321200,1754321231,US +1754321232,1754321239,CA +1754321240,1754321439,US +1754321440,1754321447,CA +1754321448,1754321487,US +1754321488,1754321511,CA +1754321512,1754321519,US +1754321520,1754321535,CA +1754321536,1754321551,US +1754321552,1754321567,CA +1754321568,1754321615,US +1754321616,1754322695,CA +1754322696,1754322703,US +1754322704,1754322719,CA +1754322720,1754322767,US +1754322768,1754322783,CA +1754322784,1754322847,US +1754322848,1754322863,CA +1754322864,1754322879,US +1754322880,1754323207,CA +1754323208,1754323215,US +1754323216,1754323231,CA +1754323232,1754323247,US +1754323248,1754323263,CA +1754323264,1754323279,US +1754323280,1754323287,CA +1754323288,1754323327,US +1754323328,1754323391,CA +1754323392,1754323455,US +1754323456,1754324095,CA +1754324096,1754324735,US +1754324736,1754324999,CA +1754325000,1754325007,US +1754325008,1754325039,CA +1754325040,1754325071,US +1754325072,1754325079,CA +1754325080,1754325087,US +1754325088,1754325119,CA +1754325120,1754325247,US +1754325248,1754325279,CA +1754325280,1754325343,US +1754325344,1754325391,CA +1754325392,1754325407,US +1754325408,1754325439,CA +1754325440,1754325487,US +1754325488,1754325599,CA +1754325600,1754325631,US +1754325632,1754325695,CA +1754325696,1754325759,US +1754325760,1754325767,CA +1754325768,1754325775,US +1754325776,1754325839,CA +1754325840,1754325855,US +1754325856,1754325887,CA +1754325888,1754325919,US +1754325920,1754325927,CA +1754325928,1754325935,US +1754325936,1754326079,CA +1754326080,1754326127,US +1754326128,1754326207,CA +1754326208,1754326239,US +1754326240,1754326255,CA +1754326256,1754326271,US +1754326272,1754326335,CA +1754326336,1754326399,US +1754326400,1754326415,CA +1754326416,1754326431,US +1754326432,1754326463,CA +1754326464,1754326495,US +1754326496,1754326511,CA +1754326512,1754326527,US +1754326528,1754326535,CA +1754326536,1754326543,US +1754326544,1754326591,CA +1754326592,1754326655,US +1754326656,1754326719,CA +1754326720,1754326751,US +1754326752,1754326759,CA +1754326760,1754326783,US +1754326784,1754326799,CA +1754326800,1754326815,US +1754326816,1754326847,CA +1754326848,1754327039,US +1754327040,1754327103,CA +1754327104,1754327231,US +1754327232,1754327551,CA +1754327552,1754328063,US +1754328064,1754328079,CA +1754328080,1754328111,US +1754328112,1754328127,CA +1754328128,1754328143,US +1754328144,1754328151,CA +1754328152,1754328319,US +1754328320,1754328575,CA +1754328576,1754329087,US +1754329088,1754329151,CA +1754329152,1754329183,US +1754329184,1754329215,CA +1754329216,1754329247,US +1754329248,1754329279,CA +1754329280,1754329311,US +1754329312,1754329335,CA +1754329336,1754329343,US +1754329344,1754329407,CA +1754329408,1754329455,US +1754329456,1754329471,CA +1754329472,1754329599,US +1754329600,1754329607,CA +1754329608,1754329631,US +1754329632,1754329663,CA +1754329664,1754329679,US +1754329680,1754329695,CA +1754329696,1754329711,US +1754329712,1754329743,CA +1754329744,1754329759,US +1754329760,1754329791,CA +1754329792,1754329839,US +1754329840,1754329871,CA +1754329872,1754329887,US +1754329888,1754329919,CA +1754329920,1754329935,US +1754329936,1754329951,CA +1754329952,1754330111,US +1754330112,1754330879,CA +1754330880,1754331135,US +1754331136,1754331263,CA +1754331264,1754331295,US +1754331296,1754331303,CA +1754331304,1754331375,US +1754331376,1754331407,CA +1754331408,1754331423,US +1754331424,1754331455,CA +1754331456,1754331487,US +1754331488,1754331495,CA +1754331496,1754331647,US +1754331648,1754331791,CA +1754331792,1754331823,US +1754331824,1754331839,CA +1754331840,1754331855,US +1754331856,1754331871,CA +1754331872,1754332191,US +1754332192,1754332199,CA +1754332200,1754332223,US +1754332224,1754332239,CA +1754332240,1754332271,US +1754332272,1754332287,CA +1754332288,1754332671,US +1754332672,1754332687,CA +1754332688,1754332703,US +1754332704,1754332735,CA +1754332736,1754332751,US +1754332752,1754332767,CA +1754332768,1754332927,US +1754332928,1754337279,CA +1754337280,1754394367,US +1754394368,1754394623,CA +1754394624,1754402815,US +1754402816,1754402879,NL +1754402880,1754402943,IE +1754402944,1754403135,NL +1754403136,1754403327,IE +1754403328,1754403519,NL +1754403520,1754403711,IE +1754403712,1754403775,HK +1754403776,1754403839,SG +1754403840,1754404415,NL +1754404416,1754404863,IE +1754404864,1754405375,US +1754405376,1754405567,NL +1754405568,1754405759,HK +1754405760,1754405887,US +1754405888,1754405903,NL +1754405904,1754405919,IE +1754405920,1754405951,NL +1754405952,1754405967,IE +1754405968,1754405983,HK +1754405984,1754405999,SG +1754406000,1754406031,NL +1754406032,1754406063,IE +1754406064,1754406399,US +1754406400,1754406719,IE +1754406720,1754406911,SG +1754406912,1754407103,US +1754407104,1754407167,NL +1754407168,1754407231,IE +1754407232,1754407615,US +1754407616,1754407807,NL +1754407808,1754407999,IE +1754408000,1754408383,US +1754408384,1754408575,NL +1754408576,1754408767,IE +1754408768,1754408831,HK +1754408832,1754408895,SG +1754408896,1754409919,US +1754409920,1754410495,NL +1754410496,1754411071,IE +1754411072,1754413103,US +1754413104,1754413119,NL +1754413120,1754413127,IE +1754413128,1754413231,US +1754413232,1754413279,NL +1754413280,1754413327,IE +1754413328,1754413423,US +1754413424,1754413471,NL +1754413472,1754413519,IE +1754413520,1754413535,HK +1754413536,1754413551,SG +1754413552,1754413807,US +1754413808,1754413951,NL +1754413952,1754414095,IE +1754414096,1754415231,US +1754415232,1754415359,NL +1754415360,1754415487,IE +1754415488,1754415615,US +1754415616,1754415743,NL +1754415744,1754415999,US +1754416000,1754416127,NL +1754416128,1754416255,IE +1754416256,1754416383,HK +1754416384,1754416511,SG +1754416512,1754416895,US +1754416896,1754417151,NL +1754417152,1754417407,IE +1754417408,1754429455,US +1754429456,1754429471,NL +1754429472,1754429487,IE +1754429488,1754429503,US +1754429504,1754429519,NL +1754429520,1754429551,US +1754429552,1754429567,NL +1754429568,1754429583,IE +1754429584,1754429599,HK +1754429600,1754429615,SG +1754429616,1754429663,US +1754429664,1754429695,NL +1754429696,1754429727,IE +1754429728,1754431487,US +1754431488,1754433023,IE +1754433024,1754434047,US +1754434048,1754434559,HK +1754434560,1754435583,US +1754435584,1754436095,IE +1754436096,1754436607,US +1754436608,1754437119,NL +1754437120,1754437631,US +1754437632,1754438143,IE +1754438144,1754439679,US +1754439680,1754440703,NL +1754440704,1754441727,AU +1754441728,1754442751,US +1754442752,1754443775,IN +1754443776,1754444031,IE +1754444032,1754444287,JP +1754444288,1754444799,SG +1754444800,1754445055,HK +1754445056,1754445311,JP +1754445312,1754445567,NL +1754445568,1754445823,CA +1754445824,1754446079,US +1754446080,1754446335,IE +1754446336,1754447871,US +1754447872,1754448127,NL +1754448128,1754448383,CA +1754448384,1754448639,US +1754448640,1754448895,GB +1754448896,1754449407,JP +1754449408,1754449919,SG +1754449920,1754451199,NL +1754451200,1754453247,US +1754453248,1754453503,BR +1754453504,1754454271,IE +1754454272,1754455551,US +1754455552,1754456063,HK +1754456064,1754456319,US +1754456320,1754456575,IE +1754456576,1754456831,US +1754456832,1754457087,NL +1754457088,1754457343,SG +1754457344,1754457855,US +1754457856,1754458111,GB +1754458112,1754458623,US +1754458624,1754458879,NL +1754458880,1754459903,US +1754459904,1754460159,IE +1754460160,1754461183,US +1754461184,1754461951,NL +1754461952,1754462719,US +1754462720,1754463231,IE +1754463232,1754465791,US +1754465792,1754466303,NL +1754466304,1754466815,IE +1754466816,1754469887,US +1754469888,1754471423,NL +1754471424,1754472959,IE +1754472960,1754476031,US +1754476032,1754477567,NL +1754477568,1754479103,IE +1754479104,1754479615,HK +1754479616,1754480127,SG +1754480128,1754488319,US +1754488320,1754492927,NL +1754492928,1754497535,IE +1754497536,1754515711,US +1754515712,1754515967,IE +1754515968,1754521791,US +1754521792,1754521855,NL +1754521856,1754521919,IE +1754521920,1754522303,US +1754522304,1754522495,NL +1754522496,1754522687,IE +1754522688,1754523071,US +1754523072,1754523263,NL +1754523264,1754523455,IE +1754523456,1754523519,HK +1754523520,1754523583,SG +1754523584,1754524607,US +1754524608,1754525183,NL +1754525184,1754525951,IE +1754525952,1754526143,US +1754526144,1754526335,NL +1754526336,1754527295,US +1754527296,1754527487,HK +1754527488,1754527679,US +1754527680,1754527871,SG +1754527872,1754528063,IE +1754528064,1754528255,NL +1754528256,1754792959,US +1754792960,1754793983,CA +1754793984,1754799103,US +1754799104,1754800127,CA +1754800128,1754822655,US +1754822656,1754823679,CA +1754823680,1754830847,US +1754830848,1754831871,CA +1754831872,1754832895,US +1754832896,1754835967,CA +1754835968,1754845183,US +1754845184,1754846207,CA +1754846208,1754849279,US +1754849280,1754850303,CA +1754850304,1754852351,US +1754852352,1754853375,JM +1754853376,1754863615,US +1754863616,1754864639,CA +1754864640,1754869759,US +1754869760,1754870783,CA +1754870784,1754871807,US +1754871808,1754872831,CA +1754872832,1754890239,US +1754890240,1754892287,BB +1754892288,1754894335,CA +1754894336,1754899455,US +1754899456,1754900479,CA +1754900480,1754911743,US +1754911744,1754912767,CA +1754912768,1754920959,US +1754920960,1754921983,DM +1754921984,1755062271,US +1755062272,1755066367,CA +1755066368,1755070463,US +1755070464,1755074559,CA +1755074560,1755075071,US +1755075072,1755075327,BR +1755075328,1755076607,US +1755076608,1755077119,AU +1755077120,1755077887,US +1755077888,1755078143,FR +1755078144,1755078399,CA +1755078400,1755103487,US +1755103488,1755103743,MH +1755103744,1755103999,US +1755104000,1755104255,ZM +1755104256,1755104511,US +1755104512,1755104767,HT +1755104768,1755105023,US +1755105024,1755105279,BB +1755105280,1755106047,US +1755106048,1755106303,SR +1755106304,1755106559,US +1755106560,1755106815,BZ +1755106816,1755107071,US +1755107072,1755107327,MW +1755107328,1755107583,US +1755107584,1755107839,DM +1755107840,1755108095,US +1755108096,1755108351,NE +1755108352,1755108607,US +1755108608,1755108863,AG +1755108864,1755109119,US +1755109120,1755109375,TL +1755109376,1755109631,US +1755109632,1755109887,HN +1755109888,1755110143,US +1755110144,1755110399,SB +1755110400,1755110655,US +1755110656,1755110911,JO +1755110912,1755111167,US +1755111168,1755111423,SD +1755111424,1755113471,US +1755113472,1755113983,AU +1755113984,1755115007,US +1755115008,1755115519,JP +1755115520,1755119615,US +1755119616,1755283455,CA +1755283456,1755319807,US +1755319808,1755320319,DK +1755320320,1755320575,IE +1755320576,1755320831,US +1755320832,1755321343,EE +1755321344,1755321599,NO +1755321600,1755321855,DK +1755321856,1755322367,US +1755322368,1755322879,NZ +1755322880,1755356159,US +1755356160,1755356415,AU +1755356416,1755365375,US +1755365376,1755373567,CA +1755373568,1755374847,US +1755374848,1755375103,DE +1755375104,1755391231,US +1755391232,1755391487,BD +1755391488,1755405951,US +1755405952,1755406015,CN +1755406016,1755512831,US +1755512832,1755578367,CA +1755578368,1755717631,US +1755717632,1755721727,BS +1755721728,1755734271,US +1755734272,1755734527,LB +1755734528,1755734783,BS +1755734784,1755735295,US +1755735296,1755735551,KE +1755735552,1755735807,MA +1755735808,1755736063,CN +1755736064,1755736319,US +1755736320,1755736575,MX +1755736576,1755736831,AW +1755736832,1755737087,US +1755737088,1755737343,GH +1755737344,1755737599,IN +1755737600,1755737855,MO +1755737856,1755738111,MT +1755738112,1755738367,QA +1755738368,1755738623,YE +1755738624,1755738879,GR +1755738880,1755739135,US +1755739136,1755739391,BH +1755739392,1755739647,CO +1755739648,1755739903,OM +1755739904,1755740159,BN +1755740160,1755740415,SC +1755740416,1755740671,SY +1755740672,1755741183,US +1755741184,1755741439,PA +1755741440,1755741695,BZ +1755741696,1755741951,IM +1755741952,1755742207,NG +1755742208,1755799551,US +1755799552,1755807743,CA +1755807744,1755824127,US +1755824128,1755824383,TV +1755824384,1755824639,SY +1755824640,1755824895,ZW +1755824896,1755825151,US +1755825152,1755825407,GM +1755825408,1755825663,AO +1755825664,1755825919,LB +1755825920,1755826175,MW +1755826176,1755826431,CV +1755826432,1755826687,TZ +1755826688,1755826943,KM +1755826944,1755827199,MN +1755827200,1755827455,CG +1755827456,1755827711,FM +1755827712,1755827967,SB +1755827968,1755828223,BI +1755828224,1755828479,CD +1755828480,1755828735,NE +1755828736,1755828991,NP +1755828992,1755829247,PK +1755829248,1755829503,KZ +1755829504,1755829759,OM +1755829760,1755830015,GB +1755830016,1755830271,ST +1755830272,1755830527,LR +1755830528,1755830783,JP +1755830784,1755831039,SD +1755831040,1755831295,MU +1755831296,1755831551,GQ +1755831552,1755831807,MK +1755831808,1755832063,GB +1755832064,1755832319,ML +1755832320,1755832575,DZ +1755832576,1755832831,MM +1755832832,1755833087,NR +1755833088,1755833343,SA +1755833344,1755833599,IN +1755833600,1755833855,BY +1755833856,1755834111,SZ +1755834112,1755834367,CN +1755834368,1755834623,TN +1755834624,1755834879,AS +1755834880,1755835135,PG +1755835136,1755835391,GB +1755835392,1755835647,BA +1755835648,1755835903,US +1755835904,1755836159,GN +1755836160,1755836415,FJ +1755836416,1755836671,MH +1755836672,1755836927,SL +1755836928,1755837183,GB +1755837184,1755837439,MG +1755837440,1755837695,ME +1755837696,1755837951,MR +1755837952,1755838207,SO +1755838208,1755838463,UA +1755838464,1755838719,LY +1755838720,1755838975,TO +1755838976,1755839231,TD +1755839232,1755839487,MZ +1755839488,1755839743,ZM +1755839744,1755839999,ER +1755840000,1755840255,AL +1755840256,1755840511,RU +1755840512,1755846623,US +1755846624,1755846631,GB +1755846632,1755863327,US +1755863328,1755863335,GB +1755863336,1756049407,US +1756049408,1756053503,CA +1756053504,1756086271,US +1756086272,1756090367,CA +1756090368,1757417471,US +1757417472,1757419519,CA +1757419520,1757424639,US +1757424640,1757425663,CA +1757425664,1757426687,US +1757426688,1757427711,CA +1757427712,1757432831,US +1757432832,1757433855,CA +1757433856,1757441023,US +1757441024,1757441535,CN +1757441536,1757443071,US +1757443072,1757446143,CA +1757446144,1757447167,US +1757447168,1757447343,CA +1757447344,1757447344,US +1757447345,1757448191,CA +1757448192,1757450239,US +1757450240,1757451263,CA +1757451264,1757452287,US +1757452288,1757453311,CA +1757453312,1757457407,US +1757457408,1757458431,CA +1757458432,1757460479,US +1757460480,1757462527,VI +1757462528,1757466623,US +1757466624,1757468671,CA +1757468672,1757472767,US +1757472768,1757473791,CA +1757473792,1757487103,US +1757487104,1757489151,CA +1757489152,1757491199,US +1757491200,1757497343,CA +1757497344,1757501683,US +1757501684,1757501684,CN +1757501685,1757502463,US +1757502464,1757503487,CA +1757503488,1757505535,US +1757505536,1757506559,CA +1757506560,1757512703,US +1757512704,1757513727,CA +1757513728,1757522943,US +1757522944,1757523967,CA +1757523968,1757529087,US +1757529088,1757530111,AI +1757530112,1757532159,US +1757532160,1757533183,CA +1757533184,1757543295,US +1757543296,1757543327,AU +1757543328,1757552639,US +1757552640,1757560831,CA +1757560832,1757596415,US +1757596416,1757596671,AU +1757596672,1757642751,US +1757642752,1757675519,CA +1757675520,1757916815,US +1757916816,1757916816,AU +1757916817,1757937663,US +1757937664,1757941759,CA +1757941760,1757957631,US +1757957632,1757957887,NL +1757957888,1757958143,US +1757958144,1757962239,CA +1757962240,1757966335,BB +1757966336,1757996287,US +1757996288,1757996543,GB +1757996544,1758002431,US +1758002432,1758002687,GB +1758002688,1758199807,US +1758199808,1758330879,CA +1758330880,1758392319,US +1758392320,1758393343,NL +1758393344,1758412799,US +1758412800,1758413055,BG +1758413056,1758413311,SE +1758413312,1758413567,PS +1758413568,1758414335,US +1758414336,1758414591,LV +1758414592,1758414847,IN +1758414848,1758415103,US +1758415104,1758415359,GB +1758415360,1758415615,FR +1758415616,1758415871,CY +1758415872,1758416127,IT +1758416128,1758416383,US +1758416384,1758416639,CF +1758416640,1758416895,US +1758416896,1758417151,VC +1758417152,1758417407,ID +1758417408,1758417663,CL +1758417664,1758417919,HK +1758417920,1758418175,DE +1758418176,1758418431,US +1758418432,1758418687,CN +1758418688,1758418943,BL +1758418944,1758419199,US +1758419200,1758419455,CR +1758419456,1758420223,US +1758420224,1758420479,HU +1758420480,1758420735,CH +1758420736,1758420991,MM +1758420992,1758429695,US +1758429696,1758430207,DE +1758430208,1758478335,US +1758478336,1758494719,HK +1758494720,1758543871,US +1758543872,1758552063,AU +1758552064,1758609407,US +1758609408,1758625791,AU +1758625792,1758674943,US +1758674944,1758724095,IN +1758724096,1758887935,US +1758887936,1758896127,JP +1758896128,1758904319,HK +1758904320,1758920703,NL +1758920704,1758937087,JP +1758937088,1758953471,US +1758953472,1758986239,SG +1758986240,1759128575,US +1759128576,1759129599,CA +1759129600,1759131647,US +1759131648,1759133695,CA +1759133696,1759138815,US +1759138816,1759139839,CA +1759139840,1759140863,US +1759140864,1759141887,CA +1759141888,1759148031,US +1759148032,1759148543,NL +1759148544,1759149055,US +1759149056,1759150079,CA +1759150080,1759160319,US +1759160320,1759162367,BM +1759162368,1759163391,BB +1759163392,1759166463,US +1759166464,1759167511,CA +1759167512,1759172607,US +1759172608,1759173631,LC +1759173632,1759178751,US +1759178752,1759179775,PR +1759179776,1759184895,US +1759184896,1759186943,CA +1759186944,1759188991,US +1759188992,1759190015,VC +1759190016,1759191039,PR +1759191040,1759201279,US +1759201280,1759202303,VG +1759202304,1759208447,US +1759208448,1759209471,CA +1759209472,1759212543,US +1759212544,1759217663,CA +1759217664,1759222783,US +1759222784,1759223807,CA +1759223808,1759230975,US +1759230976,1759233023,CA +1759233024,1759234047,US +1759234048,1759236095,CA +1759236096,1759239167,US +1759239168,1759240191,CA +1759240192,1759313919,US +1759313920,1759346687,CA +1759346688,1759408127,US +1759408128,1759412223,CA +1759412224,1759412991,US +1759412992,1759413247,AU +1759413248,1759414271,US +1759414272,1759414527,SE +1759414528,1759415295,US +1759415296,1759415551,SG +1759415552,1759416575,US +1759416576,1759416831,HK +1759416832,1759417599,US +1759417600,1759417855,FR +1759417856,1759428607,US +1759428608,1759428863,LB +1759428864,1759429119,US +1759429120,1759429375,LK +1759429376,1759429631,MO +1759429632,1759429887,CN +1759429888,1759430143,DK +1759430144,1759430399,QA +1759430400,1759430655,BA +1759430656,1759430911,AR +1759430912,1759431167,MX +1759431168,1759431423,AW +1759431424,1759431679,BZ +1759431680,1759431935,BS +1759431936,1759432191,IN +1759432192,1759432447,HR +1759432448,1759432703,OM +1759432704,1759432959,PK +1759432960,1759433215,PS +1759433216,1759433471,SA +1759433472,1759433983,US +1759433984,1759434239,MA +1759434240,1759434495,DE +1759434496,1759434751,JP +1759434752,1759435007,SY +1759435008,1759435263,US +1759435264,1759435519,HK +1759435520,1759435775,IQ +1759435776,1759436031,KE +1759436032,1759436287,AE +1759436288,1759510527,US +1759510528,1759510783,VE +1759510784,1759511039,AG +1759511040,1759511295,GT +1759511296,1759511551,VC +1759511552,1759511807,PY +1759511808,1759512063,JM +1759512064,1759512319,MS +1759512320,1759512575,GD +1759512576,1759512831,LC +1759512832,1759513087,HT +1759513088,1759513343,EC +1759513344,1759513599,KN +1759513600,1759513855,SR +1759513856,1759514111,NI +1759514112,1759514367,BB +1759514368,1759514623,PE +1759514624,1759514879,KY +1759514880,1759515135,TT +1759515136,1759515391,GY +1759515392,1759515647,BO +1759515648,1759515903,CU +1759515904,1759516159,DM +1759516160,1759516415,SH +1759516416,1759516671,BM +1759516672,1759516927,FJ +1759516928,1759517183,HN +1759517184,1759517439,GL +1759517440,1759517695,MQ +1759517696,1759517951,GF +1759517952,1759518207,MF +1759518208,1759518463,BZ +1759518464,1759518719,GP +1759518720,1759518975,AW +1759518976,1759519231,AI +1759519232,1759519487,BL +1759519488,1759519743,CO +1759519744,1759519999,TC +1759520000,1759520255,VG +1759520256,1759520511,WF +1759520512,1759520767,US +1759520768,1759521023,SV +1759521024,1759521279,TK +1759521280,1759521535,SJ +1759521536,1759521791,PM +1759521792,1759522047,GS +1759522048,1759522303,DO +1759522304,1759522559,RE +1759522560,1759522815,PN +1759522816,1759523071,MP +1759523072,1759523327,NF +1759523328,1759523583,PR +1759523584,1759523839,NU +1759523840,1759524095,NC +1759524096,1759524351,NL +1759524352,1759524607,CX +1759524608,1759524863,BS +1759524864,1759525119,PF +1759525120,1759525375,CK +1759525376,1759525631,TF +1759525632,1759525887,FK +1759525888,1759526143,GG +1759526144,1759526399,CC +1759526400,1759526655,JE +1759526656,1759526911,FO +1759526912,1759531007,US +1759531008,1759533055,SG +1759533056,1759533311,US +1759533312,1759533567,GB +1759533568,1759533823,FR +1759533824,1759534079,SG +1759534080,1759534335,FR +1759534336,1759534591,GB +1759534592,1759535103,SG +1759535104,1759543295,CA +1759543296,1759547391,US +1759547392,1759548415,NL +1759548416,1759617023,US +1759617024,1759617279,MX +1759617280,1759707391,US +1759707392,1759707655,CA +1759707656,1759707663,US +1759707664,1759707679,CA +1759707680,1759707687,US +1759707688,1759707711,CA +1759707712,1759707719,US +1759707720,1759707727,CA +1759707728,1759707735,US +1759707736,1759707743,NO +1759707744,1759707759,CA +1759707760,1759707783,US +1759707784,1759707807,CA +1759707808,1759707823,US +1759707824,1759707855,CA +1759707856,1759707863,US +1759707864,1759707879,CA +1759707880,1759707887,US +1759707888,1759707911,CA +1759707912,1759707919,US +1759707920,1759707935,CA +1759707936,1759707943,US +1759707944,1759707975,CA +1759707976,1759707991,US +1759707992,1759708031,CA +1759708032,1759708159,US +1759708160,1759708351,CA +1759708352,1759708399,US +1759708400,1759708407,CA +1759708408,1759708751,US +1759708752,1759708759,CA +1759708760,1759709439,US +1759709440,1759710207,CA +1759710208,1759710463,US +1759710464,1759711231,CA +1759711232,1759711487,US +1759711488,1759711615,CA +1759711616,1759711703,US +1759711704,1759711711,CA +1759711712,1759711727,US +1759711728,1759711743,CA +1759711744,1759712255,US +1759712256,1759712271,CA +1759712272,1759712287,US +1759712288,1759712319,CA +1759712320,1759712335,US +1759712336,1759712351,CA +1759712352,1759712511,US +1759712512,1759712639,CA +1759712640,1759712767,US +1759712768,1759713279,CA +1759713280,1759713791,US +1759713792,1759714815,CA +1759714816,1759715071,US +1759715072,1759715327,CA +1759715328,1759715375,US +1759715376,1759715391,CA +1759715392,1759715407,US +1759715408,1759715439,CA +1759715440,1759715839,US +1759715840,1759715903,CA +1759715904,1759715967,US +1759715968,1759716159,CA +1759716160,1759716223,US +1759716224,1759716255,CA +1759716256,1759716287,US +1759716288,1759716991,CA +1759716992,1759717023,US +1759717024,1759717039,CA +1759717040,1759717055,US +1759717056,1759717071,CA +1759717072,1759717119,US +1759717120,1759718399,CA +1759718400,1759718655,US +1759718656,1759719519,CA +1759719520,1759719615,US +1759719616,1759719807,CA +1759719808,1759719839,US +1759719840,1759719855,CA +1759719856,1759719919,US +1759719920,1759719935,CA +1759719936,1759719967,US +1759719968,1759719999,CA +1759720000,1759720015,US +1759720016,1759720063,CA +1759720064,1759720095,US +1759720096,1759720127,CA +1759720128,1759720159,US +1759720160,1759720207,CA +1759720208,1759720223,US +1759720224,1759720255,CA +1759720256,1759720271,US +1759720272,1759720287,CA +1759720288,1759720319,US +1759720320,1759720383,CA +1759720384,1759720415,US +1759720416,1759720431,CA +1759720432,1759720543,US +1759720544,1759720575,CA +1759720576,1759720703,US +1759720704,1759720767,CA +1759720768,1759720783,US +1759720784,1759720791,CA +1759720792,1759720815,US +1759720816,1759720831,CA +1759720832,1759721183,US +1759721184,1759721215,CA +1759721216,1759721375,US +1759721376,1759721391,CA +1759721392,1759721423,US +1759721424,1759721439,CA +1759721440,1759721471,US +1759721472,1759721535,CA +1759721536,1759721647,US +1759721648,1759721663,CA +1759721664,1759721695,US +1759721696,1759721727,CA +1759721728,1759721743,US +1759721744,1759721759,CA +1759721760,1759721823,US +1759721824,1759721831,CA +1759721832,1759721839,NO +1759721840,1759722047,US +1759722048,1759722079,CA +1759722080,1759722271,US +1759722272,1759722367,CA +1759722368,1759722383,US +1759722384,1759722431,CA +1759722432,1759722479,US +1759722480,1759722495,CA +1759722496,1759722511,US +1759722512,1759722527,CA +1759722528,1759722559,US +1759722560,1759722607,CA +1759722608,1759722655,US +1759722656,1759722687,CA +1759722688,1759722895,US +1759722896,1759722911,CA +1759722912,1759722975,US +1759722976,1759722991,CA +1759722992,1759723007,US +1759723008,1759723071,CA +1759723072,1759723151,US +1759723152,1759723167,CA +1759723168,1759723199,US +1759723200,1759723231,CA +1759723232,1759723247,US +1759723248,1759723279,CA +1759723280,1759723295,US +1759723296,1759723327,CA +1759723328,1759723343,US +1759723344,1759723359,CA +1759723360,1759723551,US +1759723552,1759723583,CA +1759723584,1759723599,US +1759723600,1759723615,CA +1759723616,1759723631,US +1759723632,1759723647,CA +1759723648,1759723823,US +1759723824,1759723831,CA +1759723832,1759723839,US +1759723840,1759723887,CA +1759723888,1759723999,US +1759724000,1759724159,CA +1759724160,1759724223,US +1759724224,1759724239,CA +1759724240,1759724255,US +1759724256,1759725055,CA +1759725056,1759726079,US +1759726080,1759726975,CA +1759726976,1759727007,US +1759727008,1759727023,CA +1759727024,1759727087,US +1759727088,1759727095,CA +1759727096,1759727103,US +1759727104,1759727359,CA +1759727360,1759727615,US +1759727616,1759727679,CA +1759727680,1759727807,US +1759727808,1759727935,CA +1759727936,1759728063,US +1759728064,1759728383,CA +1759728384,1759728639,US +1759728640,1759728671,CA +1759728672,1759728703,US +1759728704,1759728767,CA +1759728768,1759728799,US +1759728800,1759728831,CA +1759728832,1759728895,US +1759728896,1759729151,CA +1759729152,1759729663,US +1759729664,1759729711,CA +1759729712,1759729743,US +1759729744,1759729751,CA +1759729752,1759729967,US +1759729968,1759730015,CA +1759730016,1759730175,US +1759730176,1759730191,CA +1759730192,1759730207,US +1759730208,1759730239,CA +1759730240,1759730303,US +1759730304,1759730367,CA +1759730368,1759730399,US +1759730400,1759730415,CA +1759730416,1759730463,US +1759730464,1759730495,CA +1759730496,1759730519,US +1759730520,1759730543,CA +1759730544,1759730559,US +1759730560,1759730623,CA +1759730624,1759730839,US +1759730840,1759730847,CA +1759730848,1759730879,US +1759730880,1759730895,CA +1759730896,1759730911,US +1759730912,1759730927,CA +1759730928,1759731711,US +1759731712,1759734079,CA +1759734080,1759734159,US +1759734160,1759734167,CA +1759734168,1759734207,US +1759734208,1759734271,CA +1759734272,1759734279,US +1759734280,1759734303,CA +1759734304,1759734351,US +1759734352,1759734367,CA +1759734368,1759734383,US +1759734384,1759734399,CA +1759734400,1759734431,US +1759734432,1759734463,CA +1759734464,1759734607,US +1759734608,1759734639,CA +1759734640,1759734735,US +1759734736,1759734751,CA +1759734752,1759734783,US +1759734784,1759735967,CA +1759735968,1759736015,US +1759736016,1759736031,CA +1759736032,1759736063,US +1759736064,1759736383,CA +1759736384,1759736447,US +1759736448,1759736575,CA +1759736576,1759737007,US +1759737008,1759737015,CA +1759737016,1759737071,US +1759737072,1759737087,CA +1759737088,1759737343,US +1759737344,1759737407,CA +1759737408,1759737423,US +1759737424,1759737431,CA +1759737432,1759737535,US +1759737536,1759738879,CA +1759738880,1759739023,US +1759739024,1759739055,CA +1759739056,1759739103,US +1759739104,1759739455,CA +1759739456,1759739519,US +1759739520,1759739551,CA +1759739552,1759739567,US +1759739568,1759739575,CA +1759739576,1759739583,US +1759739584,1759739999,CA +1759740000,1759740015,US +1759740016,1759740023,CA +1759740024,1759740031,US +1759740032,1759740287,CA +1759740288,1759740351,US +1759740352,1759743999,CA +1759744000,1759744255,US +1759744256,1759746047,CA +1759746048,1759746303,US +1759746304,1759747135,CA +1759747136,1759747151,US +1759747152,1759747159,CA +1759747160,1759747263,US +1759747264,1759747391,CA +1759747392,1759747407,US +1759747408,1759747415,CA +1759747416,1759747455,US +1759747456,1759747647,CA +1759747648,1759747663,US +1759747664,1759747671,CA +1759747672,1759747775,US +1759747776,1759747839,CA +1759747840,1759747927,US +1759747928,1759747935,CA +1759747936,1759748095,US +1759748096,1759748159,CA +1759748160,1759748175,US +1759748176,1759748183,CA +1759748184,1759748287,US +1759748288,1759748407,CA +1759748408,1759748431,US +1759748432,1759748439,CA +1759748440,1759748479,US +1759748480,1759748607,CA +1759748608,1759748647,US +1759748648,1759748655,SE +1759748656,1759748863,US +1759748864,1759749119,CA +1759749120,1759749631,US +1759749632,1759749903,CA +1759749904,1759749919,US +1759749920,1759749935,CA +1759749936,1759749975,US +1759749976,1759749983,CA +1759749984,1759750191,US +1759750192,1759750207,CA +1759750208,1759750223,US +1759750224,1759750239,CA +1759750240,1759750335,US +1759750336,1759750351,CA +1759750352,1759750367,US +1759750368,1759750399,CA +1759750400,1759750415,US +1759750416,1759750431,CA +1759750432,1759750463,US +1759750464,1759750479,CA +1759750480,1759750495,US +1759750496,1759750511,CA +1759750512,1759751167,US +1759751168,1759751823,CA +1759751824,1759751839,US +1759751840,1759752191,CA +1759752192,1759752447,US +1759752448,1759752543,CA +1759752544,1759752639,US +1759752640,1759753023,CA +1759753024,1759753047,US +1759753048,1759753055,CA +1759753056,1759753087,US +1759753088,1759753103,CA +1759753104,1759753135,US +1759753136,1759753151,CA +1759753152,1759753215,US +1759753216,1759754239,CA +1759754240,1759754495,US +1759754496,1759754639,CA +1759754640,1759754719,US +1759754720,1759754735,CA +1759754736,1759754751,US +1759754752,1759754879,CA +1759754880,1759755007,US +1759755008,1759755151,CA +1759755152,1759755167,US +1759755168,1759755199,CA +1759755200,1759755263,US +1759755264,1759755663,CA +1759755664,1759755775,US +1759755776,1759755903,CA +1759755904,1759755935,US +1759755936,1759755943,CA +1759755944,1759755967,US +1759755968,1759755983,CA +1759755984,1759755999,US +1759756000,1759756159,CA +1759756160,1759756239,US +1759756240,1759756247,CA +1759756248,1759764479,US +1759764480,1759768575,CA +1759768576,1759768831,US +1759768832,1759772671,CA +1759772672,1760034815,US +1760038912,1760047103,US +1760047104,1760051199,CA +1760051200,1760083967,US +1760083968,1760086015,SE +1760086016,1760088063,GB +1760088064,1760116735,US +1760116736,1760133119,CA +1760133120,1760165887,US +1760165888,1760231423,CA +1760231424,1760383743,US +1760383744,1760383999,MO +1760384000,1760384255,GB +1760384256,1760384511,BZ +1760384512,1760384767,US +1760384768,1760385023,KE +1760385024,1760385279,US +1760385280,1760385535,SG +1760385536,1760385791,US +1760385792,1760386047,HK +1760386048,1760386303,US +1760386304,1760386559,GB +1760386560,1760386815,US +1760386816,1760387071,HK +1760387072,1760440831,US +1760440832,1760441343,AU +1760441344,1760443391,US +1760443392,1760444415,DE +1760444416,1760465919,US +1760465920,1760466943,JP +1760466944,1760468479,US +1760468480,1760468991,DE +1760468992,1760469503,JP +1760469504,1760470527,US +1760470528,1760471039,DE +1760471040,1760473087,GB +1760473088,1760473599,DE +1760473600,1760475135,US +1760475136,1760476159,GB +1760476160,1760477183,FR +1760477184,1760657407,US +1760657408,1760673791,CA +1760673792,1760690175,US +1760690176,1760755711,CA +1760755712,1760776191,US +1760776192,1760784383,CA +1760784384,1760811007,US +1760811008,1760812031,NL +1760812032,1760812543,US +1760812544,1760813055,CA +1760813056,1760817151,US +1760817152,1760817407,MO +1760817408,1760817663,BZ +1760817664,1760817919,BS +1760817920,1760818175,PA +1760818176,1760818431,AR +1760818432,1760818687,MX +1760818688,1760818943,AW +1760818944,1760819199,US +1760819200,1760819455,RO +1760819456,1760819711,AM +1760819712,1760819967,MA +1760819968,1760820479,US +1760820480,1760820735,CA +1760820736,1760822271,US +1760823296,1760824319,PT +1760824320,1760837631,US +1760837632,1760839679,CA +1760839680,1760841727,LU +1760841728,1760867327,US +1760867328,1760868351,PR +1760868352,1760869375,US +1760869376,1760870399,CA +1760870400,1760871423,US +1760871424,1760872447,CA +1760872448,1760878591,US +1760878592,1760880639,JM +1760880640,1760883711,US +1760883712,1760884735,CA +1760884736,1760886783,US +1760886784,1760888831,CA +1760888832,1760889087,US +1760889088,1760889343,JP +1760889344,1760889599,GB +1760889600,1760890623,US +1760890624,1760890879,SG +1760890880,1760896255,US +1760896256,1760896511,CA +1760896512,1760899071,US +1760899072,1760900095,GD +1760900096,1760903167,US +1760903168,1760904191,CA +1760904192,1760909311,US +1760909312,1760910335,VG +1760910336,1760911359,GD +1760911360,1760915455,US +1760915456,1760917503,MQ +1760917504,1760923647,US +1760923648,1760924671,CA +1760924672,1760925695,US +1760925696,1760929791,CA +1760929792,1760937983,US +1760937984,1760939007,CA +1760939008,1760940031,DM +1760940032,1760944127,US +1760944128,1760945151,CA +1760945152,1760985087,US +1760985088,1761017855,CA +1761017856,1761019647,US +1761019648,1761019903,VE +1761019904,1761023231,US +1761023232,1761023487,JP +1761023488,1761035263,US +1761035264,1761035519,CA +1761035520,1761038335,US +1761038336,1761039871,CA +1761039872,1761043711,US +1761043712,1761043967,PH +1761043968,1761044479,US +1761044480,1761044735,AU +1761044736,1761046527,US +1761046528,1761046783,JP +1761046784,1761048063,US +1761048064,1761048319,IN +1761048320,1761075199,US +1761075200,1761083391,CA +1761083392,1761181695,US +1761181696,1761181951,MX +1761181952,1761182207,US +1761182208,1761182463,GB +1761182464,1761183487,US +1761183488,1761183743,GB +1761183744,1761183999,AU +1761184000,1761185023,US +1761185024,1761185279,RU +1761185280,1761185535,GB +1761185536,1761185791,AE +1761185792,1761186047,MX +1761186048,1761186303,US +1761186304,1761186559,DE +1761186560,1761186815,GB +1761186816,1761187071,MX +1761187072,1761187327,US +1761187328,1761187583,PK +1761187584,1761188095,US +1761188096,1761188351,RU +1761188352,1761188863,US +1761188864,1761189119,FR +1761189120,1761189631,US +1761189632,1761189887,DE +1761189888,1761190143,JP +1761190144,1761191679,US +1761191680,1761191935,MX +1761191936,1761192703,US +1761192704,1761192959,AU +1761192960,1761193727,US +1761193728,1761193983,DE +1761193984,1761194239,US +1761194240,1761194495,PH +1761194496,1761194751,HK +1761194752,1761195007,US +1761195008,1761195263,HK +1761195264,1761198079,US +1761198080,1761214463,CA +1761214464,1761221375,MF +1761221376,1761222655,GP +1761222656,1761230847,US +1761230848,1761239039,CA +1761239040,1761241343,US +1761241344,1761241599,ID +1761241600,1761241633,US +1761241634,1761241634,HK +1761241635,1761255423,US +1761255424,1761255679,IN +1761255680,1761255935,NZ +1761255936,1761256191,DK +1761256192,1761256447,HR +1761256448,1761256703,LI +1761256704,1761256959,ME +1761256960,1761257215,AM +1761257216,1761257471,GE +1761257472,1761257727,MC +1761257728,1761257983,BA +1761257984,1761258239,RS +1761258240,1761258495,SI +1761258496,1761258751,IT +1761258752,1761259007,LU +1761259008,1761259031,PT +1761259032,1761259032,US +1761259033,1761259263,PT +1761259264,1761259519,US +1761259520,1761259775,KH +1761259776,1761260031,AZ +1761260032,1761260287,ET +1761260288,1761260543,CU +1761260544,1761260799,EC +1761260800,1761261055,MU +1761261056,1761261311,JM +1761261312,1761261567,PR +1761261568,1761261823,VG +1761261824,1761262079,SG +1761262080,1761262335,US +1761262336,1761262591,PK +1761262592,1761273087,US +1761273088,1761273343,PH +1761273344,1761273599,US +1761273600,1761273855,AU +1761273856,1761275391,US +1761275392,1761275647,JP +1761275648,1761288191,US +1761288192,1761292287,CA +1761292288,1761302015,US +1761302016,1761302271,CA +1761302272,1761302527,US +1761302528,1761302783,CA +1761302784,1761304575,US +1761304576,1761308671,CA +1761308672,1761328639,US +1761328640,1761328895,AU +1761328896,1761341183,US +1761341184,1761341439,HK +1761341440,1761478655,US +1761478656,1761479679,CA +1761479680,1761484799,US +1761484800,1761485823,CA +1761485824,1761488895,US +1761488896,1761489919,CA +1761489920,1761499135,US +1761499136,1761501183,CA +1761501184,1761501695,VG +1761501696,1761505279,US +1761505280,1761507327,HK +1761507328,1761507615,US +1761507616,1761507711,GB +1761507712,1761508351,US +1761508352,1761509375,VG +1761509376,1761515519,US +1761515520,1761517567,CA +1761517568,1761519615,US +1761519616,1761521663,PR +1761521664,1761522687,US +1761522688,1761523711,CA +1761523712,1761526783,US +1761526784,1761527807,CA +1761527808,1761544191,US +1761544192,1761546239,CA +1761546240,1761554431,US +1761554432,1761555455,CA +1761555456,1761581055,US +1761581056,1761583103,CA +1761583104,1761587199,US +1761587200,1761588223,AI +1761588224,1761589247,PR +1761589248,1761595391,US +1761595392,1761596415,CA +1761596416,1761601535,US +1761601536,1761602559,VC +1761602560,1761606655,US +1761606656,1761607679,LC +1761607680,1762613861,ZA +1762613862,1762613862,US +1762613863,1762656255,ZA +1762656256,1762660351,MU +1762660352,1762661375,KE +1762661376,1762661887,MU +1762661888,1762662399,TZ +1762662400,1762662911,MZ +1762662912,1762664447,ZA +1762664448,1762664959,FR +1762664960,1762665471,GB +1762665472,1762680063,MU +1762680064,1762680575,NL +1762680576,1762681087,SE +1762681088,1762681599,DE +1762681600,1762684927,MU +1762684928,1762689023,KE +1762689024,1762691071,DJ +1762691072,1762693119,TZ +1762693120,1762695167,MZ +1762695168,1762701311,ZA +1762701312,1762703359,FR +1762703360,1762705407,GB +1762705408,1762764799,MU +1762764800,1762766847,NL +1762766848,1762768895,SE +1762768896,1762770943,DE +1762770944,1762783231,MU +1762783232,1762791423,KE +1762791424,1762795519,DJ +1762795520,1762799615,TZ +1762799616,1762803711,MZ +1762803712,1762820095,ZA +1762820096,1762824191,GB +1762824192,1762942975,MU +1762942976,1762947071,NL +1762947072,1762951167,SE +1762951168,1762955263,DE +1762955264,1762983935,MU +1762983936,1763000319,KE +1763000320,1763008511,UG +1763008512,1763016703,RW +1763016704,1763024895,DJ +1763024896,1763041279,TZ +1763041280,1763049471,MZ +1763049472,1763074047,ZA +1763074048,1763082239,FR +1763082240,1763090431,GB +1763090432,1763172351,MU +1763172352,1763180543,ZA +1763180544,1763270655,MU +1763270656,1763278847,US +1763278848,1763287039,ZA +1763287040,1763319807,MU +1763319808,1763327999,IN +1763328000,1763336191,NL +1763336192,1763344383,SE +1763344384,1763344895,UG +1763344896,1763352575,DE +1763352576,1763385343,MU +1763385344,1763393535,AE +1763393536,1763401727,GB +1763401728,1763402239,MU +1763402240,1763402751,KE +1763402752,1763405823,MU +1763405824,1763407871,ZA +1763407872,1763409919,MU +1763409920,1763429887,ZA +1763429888,1763438591,KE +1763438592,1763442687,UG +1763442688,1763446783,RW +1763446784,1763450879,DJ +1763450880,1763459071,TZ +1763459072,1763463167,MZ +1763463168,1763475455,ZA +1763475456,1763479551,FR +1763479552,1763483647,GB +1763483648,1763524607,MU +1763524608,1763532799,ZA +1763532800,1763573759,MU +1763573760,1763581951,ZA +1763581952,1763598335,MU +1763598336,1763602431,IN +1763602432,1763606527,NL +1763606528,1763610623,SE +1763610624,1763614719,DE +1763614720,1763631103,MU +1763631104,1763635199,AE +1763635200,1763639295,ZA +1763639296,1763657727,MU +1763657728,1763659775,ZA +1763659776,1763661823,MU +1763661824,1763663871,FR +1763663872,1763688447,MU +1763688448,1763696639,ZA +1763696640,1763704831,MU +1763704832,1764753407,EG +1764753408,1765801983,KE +1765801984,1766850559,MA +1766850560,1767899135,EG +1767899136,1768947711,DZ +1768947712,1769996287,NG +1769996288,1772093439,MA +1772093440,1772617727,KE +1772617728,1773142015,AO +1773142016,1773207551,LR +1773207552,1773273087,ZA +1773273088,1773404159,RW +1773404160,1773666303,EG +1773666304,1773928447,ZA +1773928448,1774190591,MA +1774190592,1775239167,EG +1775239168,1776680959,ZA +1776680960,1776812031,KE +1776812032,1776877567,NA +1776877568,1776943103,ZA +1776943104,1777008639,MW +1777008640,1777041407,CI +1777041408,1777045503,DZ +1777045504,1777049599,MU +1777049600,1777053695,ZA +1777053696,1777057791,BF +1777057792,1777061887,NG +1777061888,1777063935,SS +1777063936,1777065983,MZ +1777065984,1777070079,GQ +1777070080,1777074175,BW +1777074176,1777205247,ZA +1777205248,1777336319,SD +1777336320,1778384895,ZA +1778384896,1778385151,CN +1778385152,1778385407,AU +1778385408,1778393087,CN +1778393088,1778396159,IN +1778396160,1778397183,CN +1778397184,1778398207,ID +1778398208,1778399231,BD +1778399232,1778400255,IN +1778400256,1778401279,BD +1778401280,1778417663,CN +1778417664,1778450431,TH +1778450432,1778515967,TW +1778515968,1779040255,CN +1779040256,1779073023,KR +1779073024,1779105791,SG +1779105792,1781727231,CN +1781727232,1781792767,IN +1781792768,1782579199,CN +1782579200,1782710271,TW +1782710272,1782841343,IN +1782841344,1783103487,AU +1783103488,1783234559,JP +1783234560,1783365631,CN +1783365632,1783627775,IN +1783627776,1784676351,CN +1784676352,1785200639,KR +1785200640,1785462783,TW +1785462784,1786773503,CN +1786773504,1790967807,JP +1790967808,1793064959,IN +1793064960,1794113535,CN +1794113536,1795162111,KR +1795162112,1795555327,US +1795555328,1795555583,CA +1795555584,1795555839,US +1795555840,1795557375,CA +1795557376,1795557887,US +1795557888,1795558143,CA +1795558144,1795558911,US +1795558912,1795559423,CA +1795559424,1795559679,AR +1795559680,1795559743,CA +1795559744,1795559775,US +1795559776,1795559935,CA +1795559936,1795560191,US +1795560192,1795560959,CA +1795560960,1795561247,US +1795561248,1795563519,CA +1795563520,1795564031,US +1795564032,1795564799,CA +1795564800,1795565567,US +1795565568,1795566591,CA +1795566592,1795567359,US +1795567360,1795569551,CA +1795569552,1795569567,US +1795569568,1795570943,CA +1795570944,1795571087,US +1795571088,1795571103,CA +1795571104,1795571199,US +1795571200,1795571711,CA +1795571712,1795583999,US +1795584000,1795588095,SG +1795588096,1795591167,US +1795591168,1795592191,NL +1795592192,1795593727,US +1795593728,1795595775,NL +1795595776,1795596287,US +1795596288,1795603455,NL +1795603456,1804863743,US +1804863744,1804863999,CN +1804864000,1805000058,US +1805000059,1805000059,CA +1805000060,1805010175,US +1805010176,1805010431,CA +1805010432,1805010687,KR +1805010688,1805016319,US +1805016320,1805016575,RU +1805016576,1805016831,NZ +1805016832,1805017087,TR +1805017088,1805018111,CN +1805018112,1805021183,US +1805021184,1805021439,SG +1805021440,1805021695,KR +1805021696,1805021951,TW +1805021952,1805022207,TH +1805022208,1805022463,US +1805022464,1805022719,DE +1805022720,1805024767,US +1805024768,1805025279,KR +1805025280,1805033983,US +1805033984,1805035007,TR +1805035008,1805035519,US +1805035520,1805036031,TR +1805036032,1805037055,US +1805037056,1805037311,TR +1805037312,1805037567,US +1805037568,1805038591,TR +1805038592,1805046271,US +1805046272,1805046783,GB +1805046784,1805048831,US +1805048832,1805049343,NL +1805049344,1805049855,DE +1805049856,1805058047,CA +1805058048,1805144063,US +1805144064,1805148159,CA +1805148160,1805150463,US +1805150464,1805150719,GB +1805150720,1805156351,US +1805156352,1805156479,CA +1805156480,1805156487,FI +1805156488,1805156511,CA +1805156512,1805156519,US +1805156520,1805156599,CA +1805156600,1805156607,US +1805156608,1805156719,CA +1805156720,1805156815,US +1805156816,1805156823,CA +1805156824,1805156863,US +1805156864,1805156871,CA +1805156872,1805156879,US +1805156880,1805156911,CA +1805156912,1805156919,US +1805156920,1805156927,CA +1805156928,1805156935,US +1805156936,1805156951,CA +1805156952,1805156959,US +1805156960,1805156999,CA +1805157000,1805157015,US +1805157016,1805157079,CA +1805157080,1805157095,US +1805157096,1805157159,CA +1805157160,1805157279,US +1805157280,1805157311,CA +1805157312,1805157375,US +1805157376,1805157547,CA +1805157548,1805157551,US +1805157552,1805157951,CA +1805157952,1805158031,US +1805158032,1805158047,CA +1805158048,1805158079,US +1805158080,1805158399,CA +1805158400,1805158655,US +1805158656,1805158823,CA +1805158824,1805158831,US +1805158832,1805158895,CA +1805158896,1805158903,US +1805158904,1805158911,CA +1805158912,1805159039,US +1805159040,1805159055,CA +1805159056,1805159071,US +1805159072,1805159119,CA +1805159120,1805159127,US +1805159128,1805159167,CA +1805159168,1805159175,US +1805159176,1805159191,CA +1805159192,1805159199,US +1805159200,1805159247,CA +1805159248,1805159279,US +1805159280,1805159359,CA +1805159360,1805159423,US +1805159424,1805160191,CA +1805160192,1805160215,US +1805160216,1805160271,CA +1805160272,1805160279,US +1805160280,1805160295,CA +1805160296,1805160303,US +1805160304,1805160319,CA +1805160320,1805160335,US +1805160336,1805160343,CA +1805160344,1805160351,US +1805160352,1805160359,CA +1805160360,1805160367,US +1805160368,1805160407,CA +1805160408,1805160415,US +1805160416,1805160423,CA +1805160424,1805160439,US +1805160440,1805160447,CA +1805160448,1805160703,US +1805160704,1805160719,CA +1805160720,1805160735,US +1805160736,1805160767,CA +1805160768,1805160783,US +1805160784,1805160799,CA +1805160800,1805160895,US +1805160896,1805160911,CA +1805160912,1805160943,US +1805160944,1805162255,CA +1805162256,1805162495,US +1805162496,1805164111,CA +1805164112,1805164127,US +1805164128,1805164159,CA +1805164160,1805164223,US +1805164224,1805164239,CA +1805164240,1805164287,US +1805164288,1805164351,CA +1805164352,1805164367,US +1805164368,1805164383,CA +1805164384,1805164799,US +1805164800,1805164839,CA +1805164840,1805164847,FI +1805164848,1805164863,CA +1805164864,1805164879,US +1805164880,1805164895,CA +1805164896,1805164975,US +1805164976,1805164991,CA +1805164992,1805165055,US +1805165056,1805165311,CA +1805165312,1805165439,US +1805165440,1805165455,CA +1805165456,1805165823,US +1805165824,1805166079,CA +1805166080,1805166335,US +1805166336,1805166687,CA +1805166688,1805166703,US +1805166704,1805166751,CA +1805166752,1805166783,US +1805166784,1805167103,CA +1805167104,1805167359,FR +1805167360,1805167439,CA +1805167440,1805167455,US +1805167456,1805167551,CA +1805167552,1805167583,US +1805167584,1805167823,CA +1805167824,1805167839,US +1805167840,1805167887,CA +1805167888,1805167903,US +1805167904,1805167935,CA +1805167936,1805168223,US +1805168224,1805168255,CA +1805168256,1805168671,US +1805168672,1805168703,CA +1805168704,1805168751,US +1805168752,1805168783,CA +1805168784,1805168847,US +1805168848,1805168855,CA +1805168856,1805168863,SE +1805168864,1805169183,CA +1805169184,1805169199,US +1805169200,1805169215,CA +1805169216,1805169663,US +1805169664,1805170063,CA +1805170064,1805170079,US +1805170080,1805170303,CA +1805170304,1805170311,US +1805170312,1805170403,CA +1805170404,1805170407,US +1805170408,1805171231,CA +1805171232,1805171247,US +1805171248,1805171311,CA +1805171312,1805171327,US +1805171328,1805171343,CA +1805171344,1805171351,US +1805171352,1805171367,CA +1805171368,1805171375,US +1805171376,1805171383,CA +1805171384,1805171391,US +1805171392,1805171551,CA +1805171552,1805171559,US +1805171560,1805171583,CA +1805171584,1805171591,US +1805171592,1805171607,CA +1805171608,1805171615,US +1805171616,1805171655,CA +1805171656,1805171663,US +1805171664,1805171687,CA +1805171688,1805171703,US +1805171704,1805171711,CA +1805171712,1805171759,US +1805171760,1805171839,CA +1805171840,1805171887,US +1805171888,1805171903,CA +1805171904,1805171951,US +1805171952,1805171967,CA +1805171968,1805172047,US +1805172048,1805172095,CA +1805172096,1805172159,US +1805172160,1805172175,CA +1805172176,1805172191,US +1805172192,1805173007,CA +1805173008,1805173039,US +1805173040,1805173055,CA +1805173056,1805173079,US +1805173080,1805173087,CA +1805173088,1805173247,US +1805173248,1805173567,CA +1805173568,1805173599,US +1805173600,1805173615,CA +1805173616,1805173759,US +1805173760,1805173791,CA +1805173792,1805174271,US +1805174272,1805174287,CA +1805174288,1805174303,US +1805174304,1805174335,CA +1805174336,1805174527,US +1805174528,1805174783,CA +1805174784,1805174815,US +1805174816,1805174823,CA +1805174824,1805174831,US +1805174832,1805174863,CA +1805174864,1805174911,US +1805174912,1805174943,CA +1805174944,1805175103,US +1805175104,1805175119,CA +1805175120,1805175159,US +1805175160,1805175167,CA +1805175168,1805175807,US +1805175808,1805177343,CA +1805177344,1805177375,US +1805177376,1805177423,CA +1805177424,1805177439,US +1805177440,1805177455,CA +1805177456,1805177471,US +1805177472,1805177599,CA +1805177600,1805177855,US +1805177856,1805181951,CA +1805181952,1805182207,US +1805182208,1805182719,CA +1805182720,1805183039,US +1805183040,1805183071,CA +1805183072,1805183135,US +1805183136,1805183167,CA +1805183168,1805183199,US +1805183200,1805183231,CA +1805183232,1805183743,US +1805183744,1805184063,CA +1805184064,1805184127,US +1805184128,1805184159,CA +1805184160,1805184191,US +1805184192,1805184511,CA +1805184512,1805184527,US +1805184528,1805184535,CA +1805184536,1805184543,US +1805184544,1805184575,CA +1805184576,1805184607,US +1805184608,1805184639,CA +1805184640,1805184687,US +1805184688,1805184703,CA +1805184704,1805184735,US +1805184736,1805184783,CA +1805184784,1805184799,US +1805184800,1805184831,CA +1805184832,1805184863,US +1805184864,1805184895,CA +1805184896,1805184927,US +1805184928,1805184943,CA +1805184944,1805185023,US +1805185024,1805185071,CA +1805185072,1805185103,US +1805185104,1805185119,CA +1805185120,1805185151,US +1805185152,1805185159,CA +1805185160,1805185167,FI +1805185168,1805185215,CA +1805185216,1805185231,US +1805185232,1805185247,CA +1805185248,1805185279,US +1805185280,1805185343,CA +1805185344,1805185359,US +1805185360,1805185375,CA +1805185376,1805185407,US +1805185408,1805185423,CA +1805185424,1805185439,US +1805185440,1805185471,CA +1805185472,1805185519,US +1805185520,1805185535,CA +1805185536,1805185599,US +1805185600,1805185615,CA +1805185616,1805185647,US +1805185648,1805185655,CA +1805185656,1805185663,US +1805185664,1805185679,CA +1805185680,1805185759,US +1805185760,1805185775,CA +1805185776,1805185919,US +1805185920,1805185959,CA +1805185960,1805185967,NO +1805185968,1805185999,US +1805186000,1805186063,CA +1805186064,1805186095,US +1805186096,1805186127,CA +1805186128,1805186143,US +1805186144,1805186239,CA +1805186240,1805186287,US +1805186288,1805186319,CA +1805186320,1805186335,US +1805186336,1805186351,CA +1805186352,1805186495,US +1805186496,1805186511,CA +1805186512,1805186551,US +1805186552,1805186575,CA +1805186576,1805186687,US +1805186688,1805186719,CA +1805186720,1805186783,US +1805186784,1805186799,CA +1805186800,1805186879,US +1805186880,1805186911,CA +1805186912,1805186943,US +1805186944,1805186959,CA +1805186960,1805186975,US +1805186976,1805186991,CA +1805186992,1805186999,US +1805187000,1805187023,CA +1805187024,1805187071,US +1805187072,1805187111,CA +1805187112,1805187119,NO +1805187120,1805187127,CA +1805187128,1805187327,US +1805187328,1805187391,CA +1805187392,1805187455,US +1805187456,1805187503,CA +1805187504,1805187551,US +1805187552,1805187567,CA +1805187568,1805187871,US +1805187872,1805187887,CA +1805187888,1805188175,US +1805188176,1805188255,CA +1805188256,1805188287,US +1805188288,1805188295,CA +1805188296,1805188367,US +1805188368,1805188375,CA +1805188376,1805188383,FI +1805188384,1805188447,CA +1805188448,1805188479,US +1805188480,1805188511,CA +1805188512,1805188575,US +1805188576,1805188647,CA +1805188648,1805188671,US +1805188672,1805188735,CA +1805188736,1805188751,US +1805188752,1805188767,CA +1805188768,1805188863,US +1805188864,1805188879,CA +1805188880,1805188911,US +1805188912,1805188927,CA +1805188928,1805189039,US +1805189040,1805189055,CA +1805189056,1805189071,US +1805189072,1805189087,CA +1805189088,1805189103,US +1805189104,1805189119,CA +1805189120,1805190399,US +1805190400,1805190655,ES +1805190656,1805190911,DE +1805190912,1805194239,US +1805194240,1805194495,AU +1805194496,1805195263,US +1805195264,1805196031,JP +1805196032,1805196287,US +1805196288,1805196543,DE +1805196544,1805197823,US +1805197824,1805198079,DE +1805198080,1805198591,US +1805198592,1805199103,AU +1805199104,1805201151,US +1805201152,1805201407,NL +1805201408,1805202943,US +1805202944,1805203199,NL +1805203200,1805207039,US +1805207040,1805207551,BR +1805207552,1805209855,US +1805209856,1805210623,CA +1805210624,1805210879,EG +1805210880,1805212415,US +1805212416,1805213183,CN +1805213184,1805214975,US +1805214976,1805215743,AE +1805215744,1805217279,US +1805217280,1805217535,DE +1805217536,1805221375,US +1805221376,1805221631,DE +1805221632,1805226239,US +1805226240,1805226495,NL +1805226496,1805234175,US +1805234176,1805234431,NL +1805234432,1805251583,US +1805251584,1805251839,DE +1805251840,1805252095,GB +1805252096,1805252351,DE +1805252352,1805252607,GB +1805252608,1805252863,DE +1805252864,1805253119,GB +1805253120,1805253375,DE +1805253376,1805253631,GB +1805253632,1805253887,DE +1805253888,1805254143,US +1805254144,1805254399,DE +1805254400,1805254655,GB +1805254656,1805283327,US +1805283328,1805283583,GB +1805283584,1805284863,US +1805284864,1805285119,ES +1805285120,1805321727,US +1805321728,1805321983,VN +1805321984,1805322751,US +1805322752,1805323007,RU +1805323008,1805323263,JP +1805323264,1805324287,US +1805324288,1805324543,DE +1805324544,1805325055,US +1805325056,1805325311,ES +1805325312,1805325567,AE +1805325568,1805325823,ID +1805325824,1805326079,FR +1805326080,1805326335,US +1805326336,1805326591,SG +1805326592,1805326847,US +1805326848,1805327103,MY +1805327104,1805327359,TH +1805327360,1805327615,KR +1805327616,1805327871,JP +1805327872,1805328127,TW +1805328128,1805328383,US +1805328384,1805328639,TH +1805328640,1805328895,ID +1805328896,1805329663,US +1805329664,1805329919,SG +1805329920,1805330431,TH +1805330432,1805331199,US +1805331200,1805331455,KR +1805331456,1805331711,US +1805331712,1805331967,KR +1805331968,1805332479,US +1805332480,1805332735,DE +1805332736,1805332991,FR +1805332992,1805333247,TH +1805333248,1805333503,ES +1805333504,1805334271,US +1805334272,1805334783,SG +1805334784,1805335039,TW +1805335040,1805335295,MY +1805335296,1805335551,TH +1805335552,1805335807,AE +1805335808,1805337287,US +1805337288,1805337295,IT +1805337296,1805373439,US +1805373440,1805375487,HK +1805375488,1805582335,US +1805582336,1805647871,CA +1805647872,1805713407,US +1805713408,1805717503,CA +1805717504,1805721599,US +1805721600,1805725695,CA +1805725696,1805729791,US +1805729792,1805733887,CA +1805733888,1805737983,US +1805737984,1805742079,CA +1805742080,1805752575,US +1805752576,1805753087,CA +1805753088,1805754175,US +1805754176,1805754367,CA +1805754368,1805756415,US +1805756672,1806135130,US +1806135131,1806135132,IN +1806135133,1806168831,US +1806168832,1806169087,CA +1806169088,1806172159,US +1806172160,1806172415,DE +1806172416,1806172671,GB +1806172672,1806172927,DE +1806172928,1806173183,GB +1806173184,1806173695,CN +1806173696,1806174207,US +1806174208,1806174463,BR +1806174464,1806180351,US +1806180352,1806180607,AU +1806180608,1806182911,US +1806182912,1806183167,BR +1806183168,1806183679,US +1806183680,1806183935,NL +1806183936,1806184447,US +1806184448,1806184959,AU +1806184960,1806186239,US +1806186240,1806186751,GB +1806186752,1806190079,US +1806190080,1806190591,JP +1806190592,1806198271,US +1806198272,1806198527,JP +1806198528,1806203391,US +1806203392,1806203647,AU +1806203648,1806205183,US +1806205184,1806205439,CA +1806205440,1806235903,US +1806235904,1806236159,NL +1806236160,1806263551,US +1806263552,1806263807,KR +1806263808,1806401535,US +1806401536,1806434303,CA +1806434304,1806514463,US +1806514464,1806514495,GB +1806514496,1806515231,US +1806515232,1806515263,GB +1806515264,1806532927,US +1806532928,1806532959,GB +1806532960,1806925823,US +1806925824,1806958591,CA +1806958592,1806996479,US +1806996480,1806999551,CO +1806999552,1807044095,US +1807044096,1807044351,NL +1807044352,1807056895,US +1807056896,1807057151,AU +1807057664,1807057919,GB +1807057920,1807058431,US +1807058688,1807058943,US +1807058944,1807059199,GB +1807059200,1807059455,NL +1807062016,1807062271,US +1807063040,1807072255,US +1807072256,1807073023,CA +1807073024,1807548415,US +1807548416,1807548927,LU +1807548928,1807597567,US +1807597568,1807646719,CA +1807646720,1807655679,US +1807655680,1807655935,IE +1807655936,1807656447,US +1807656448,1807656703,NL +1807656704,1807657983,US +1807657984,1807658239,SG +1807658240,1807658495,GB +1807658496,1807658751,BS +1807658752,1807691263,US +1807691264,1807691775,FR +1807691776,1807692799,US +1807692800,1807693311,JP +1807693312,1807693823,US +1807693824,1807694079,AU +1807694080,1807694847,US +1807694848,1807695359,JP +1807695360,1807695871,FR +1807695872,1807706793,US +1807706794,1807706794,CN +1807706795,1807707311,US +1807707312,1807707312,JP +1807707313,1807732735,US +1807732736,1807736831,GP +1807736832,1815822335,US +1815822336,1815826431,CA +1815826432,1815871487,US +1815871488,1815879679,CA +1815879680,1815912447,US +1815912448,1815920639,CA +1815920640,1815928831,US +1815928832,1815937023,BS +1815937024,1815961599,US +1815961600,1815961855,AU +1815961856,1815962111,ES +1815962112,1815962623,NL +1815962624,1815963391,US +1815963392,1815963647,NL +1815963648,1815963903,US +1815963904,1815964159,FR +1815964160,1815964415,DK +1815964416,1815964671,PL +1815964672,1815965695,US +1815965696,1815966207,DE +1815966208,1815966719,US +1815966720,1815966975,GB +1815966976,1815967231,NL +1815967232,1815967487,CA +1815967488,1815968255,US +1815968256,1815968767,FR +1815968768,1815969279,US +1815969280,1815969791,JP +1815969792,1815977983,US +1815977984,1815979007,JP +1815979008,1815980031,NL +1815980032,1815980543,AU +1815980544,1815981055,DE +1815981056,1815982079,GB +1815982080,1815982591,FR +1815982592,1815983103,DE +1815983104,1815984127,JP +1815984128,1815984639,AU +1815984640,1815985151,JP +1815985152,1815985663,NL +1815985664,1815985919,DE +1815985920,1815987199,US +1815987200,1815987711,GB +1815987712,1815988223,NL +1815988224,1815988735,JP +1815988736,1815990271,US +1815990272,1815990503,FR +1815990504,1815990504,TF +1815990505,1815990783,FR +1815990784,1815991295,DE +1815991296,1815991807,AU +1815991808,1815993599,US +1815993600,1815993855,GB +1815993856,1815994111,US +1815994112,1815994367,JP +1815994368,1815994623,US +1815994624,1815994655,DE +1815994656,1815994879,GB +1815994880,1815995135,US +1815995136,1815995391,AU +1815995392,1815995903,US +1815995904,1815996159,GB +1815996160,1815996415,CA +1815996416,1815997695,US +1815997696,1815997951,FR +1815997952,1815999999,US +1816000000,1816000511,JP +1816000512,1816001023,US +1816001024,1816001279,JP +1816001280,1816001535,AU +1816001536,1816001791,US +1816001792,1816002559,NL +1816002560,1816068095,US +1816068096,1816133631,CA +1816133632,1819976622,US +1819976623,1819976623,RE +1819976624,1822429183,US +1822429184,1822433279,CA +1822433280,1822445567,US +1822445568,1822451199,CA +1822451200,1822451455,US +1822451456,1822451711,BB +1822451712,1822486527,US +1822486528,1822490623,CA +1822490624,1822498815,US +1822498816,1822502911,CA +1822502912,1822519295,US +1822519296,1822523391,CA +1822523392,1822531583,US +1822531584,1822535679,CA +1822535680,1822552575,US +1822552576,1822553087,AT +1822553088,1822553343,US +1822553344,1822553599,BR +1822553600,1822553855,US +1822553856,1822554111,HK +1822554112,1822572543,US +1822572544,1822605311,CA +1822605312,1822613247,US +1822613248,1822613503,HK +1822613504,1822614015,US +1822614016,1822614527,JP +1822614528,1822615039,FR +1822615040,1822617343,US +1822617344,1822618367,CA +1822618368,1822619391,US +1822619392,1822621183,AU +1822621184,1822621439,US +1822621440,1822621695,AU +1822621696,1822654463,US +1822654464,1822662143,CA +1822662144,1822662399,US +1822662400,1822670847,CA +1822670848,1822877695,US +1822877696,1822881791,HK +1822881792,1822882815,ID +1822882816,1822949375,US +1822949376,1822982143,CA +1822982144,1823113215,US +1823113216,1823129599,CA +1823129600,1823162367,US +1823162368,1823170559,CA +1823170560,1823178751,US +1823178752,1823179007,GB +1823179008,1823179167,DE +1823179168,1823179199,US +1823179200,1823179263,DE +1823179264,1823180287,US +1823180288,1823180543,AU +1823180544,1823181055,US +1823181056,1823181311,DK +1823181312,1823181567,BR +1823181568,1823181823,FR +1823181824,1823182079,CA +1823182080,1823182335,SG +1823182336,1823182591,JP +1823182592,1823182847,HK +1823182848,1823183103,US +1823183104,1823183359,ZA +1823183360,1823186687,US +1823186688,1823186943,IN +1823186944,1823211519,US +1823211520,1823342591,CA +1823342592,1823346687,US +1823346688,1823350783,CA +1823350784,1823355647,US +1823355648,1823355903,NL +1823355904,1823356159,US +1823356160,1823356415,NL +1823356416,1823356671,US +1823356672,1823356927,NL +1823356928,1823358799,US +1823358800,1823358807,GB +1823358808,1823361791,US +1823361792,1823362303,CA +1823362304,1823375359,US +1823375360,1823379455,CA +1823379456,1823383551,US +1823383552,1823387647,CA +1823387648,1823422463,US +1823422464,1823423487,LU +1823423488,1823428607,US +1823428608,1823432703,CA +1823432704,1823465471,US +1823465472,1823469567,CA +1823469568,1823735807,US +1823735808,1823866879,CA +1823866880,1824130623,US +1824130624,1824130655,CN +1824130656,1828716543,US +1828716544,1830813695,FR +1830813696,1831337983,NL +1831337984,1831862271,DE +1831862272,1832124415,PT +1832124416,1832386559,IT +1832386560,1832392191,DK +1832392192,1832392703,SE +1832392704,1832461567,DK +1832461568,1832461823,SE +1832461824,1832473599,DK +1832473600,1832473855,SE +1832473856,1832475391,DK +1832475392,1832475647,SE +1832475648,1832550399,DK +1832550400,1832558591,SE +1832558592,1832648703,DK +1832648704,1832681471,HR +1832681472,1832714239,RU +1832714240,1832747007,HU +1832747008,1832779775,RU +1832779776,1832780799,FR +1832780800,1832783871,MQ +1832783872,1832785919,GP +1832785920,1832787967,GF +1832787968,1832795391,FR +1832795392,1832795647,GF +1832795648,1832797439,FR +1832797440,1832797471,MQ +1832797472,1832797503,GP +1832797504,1832797567,GF +1832797568,1832797695,MQ +1832797696,1832798207,FR +1832798208,1832799231,GP +1832799232,1832800767,FR +1832800768,1832801023,MQ +1832801024,1832801279,FR +1832801280,1832802303,MQ +1832802304,1832804351,FR +1832804352,1832806399,MQ +1832806400,1832808447,GP +1832808448,1832812543,FR +1832812544,1832845311,RU +1832845312,1832878079,BH +1832878080,1832910847,RU +1832910848,1833172991,IL +1833172992,1833177087,GB +1833177088,1833179135,RU +1833179136,1833181183,IT +1833181184,1833183231,GB +1833183232,1833185279,UA +1833185280,1833187327,DE +1833187328,1833189375,NL +1833189376,1833191423,GB +1833191424,1833193471,RU +1833193472,1833195519,ES +1833195520,1833197567,NO +1833197568,1833199615,DE +1833199616,1833201663,AT +1833201664,1833203711,RU +1833203712,1833205759,AM +1833205760,1833207807,FI +1833207808,1833209855,RU +1833209856,1833211903,GR +1833211904,1833213951,IT +1833213952,1833215999,BE +1833216000,1833218047,RU +1833218048,1833220095,NO +1833220096,1833222143,RU +1833222144,1833223679,GB +1833223680,1833223743,GG +1833223744,1833223807,GB +1833223808,1833223935,GG +1833223936,1833224191,GB +1833224192,1833228287,RU +1833228288,1833232383,DE +1833232384,1833234431,TJ +1833234432,1833236479,GB +1833236480,1833238527,FI +1833238528,1833240575,AL +1833240576,1833242623,ES +1833242624,1833246719,RU +1833246720,1833248767,FI +1833248768,1833250815,MK +1833250816,1833252863,ES +1833252864,1833254911,GB +1833254912,1833256959,DE +1833256960,1833259007,RU +1833259008,1833261055,GB +1833261056,1833263103,PL +1833263104,1833265151,DE +1833265152,1833267199,GB +1833267200,1833269247,HU +1833269248,1833271295,FI +1833271296,1833273343,IT +1833275392,1833277439,IT +1833277440,1833279487,CH +1833279488,1833281535,AL +1833281536,1833283583,AT +1833283584,1833285631,RU +1833285632,1833289727,FR +1833289728,1833291775,IT +1833291776,1833293823,CZ +1833293824,1833295871,BE +1833295872,1833297919,NL +1833297920,1833299967,GB +1833299968,1833302015,LU +1833302016,1833304063,AT +1833304064,1833308159,NL +1833308160,1833310207,FR +1833310208,1833312255,RU +1833312256,1833314303,ES +1833314304,1833315963,IM +1833315964,1833315967,GB +1833315968,1833316351,IM +1833316352,1833318399,DK +1833318400,1833320447,GB +1833320448,1833321282,IQ +1833321283,1833321283,AE +1833321284,1833322495,IQ +1833322496,1833324543,IT +1833324544,1833326591,NO +1833326592,1833327103,GB +1833327104,1833328639,US +1833328640,1833330687,AT +1833330688,1833332735,UA +1833332736,1833334783,CH +1833334784,1833336831,IT +1833336832,1833338879,ES +1833338880,1833342975,GB +1833342976,1833345023,CH +1833345024,1833347071,FI +1833347072,1833349119,FR +1833349120,1833351167,FI +1833351168,1833353215,RU +1833353216,1833355263,DE +1833355264,1833357311,IT +1833357312,1833357587,GB +1833357588,1833357631,IE +1833357632,1833357823,GB +1833357824,1833357903,IE +1833357904,1833359359,GB +1833359360,1833361407,DE +1833361408,1833363455,GB +1833365504,1833367551,IT +1833367552,1833369599,RU +1833369600,1833370111,NL +1833370112,1833370367,BG +1833370368,1833370623,SE +1833370624,1833370879,CN +1833370880,1833371135,US +1833371136,1833371391,RU +1833371392,1833371647,BR +1833371648,1833373695,RU +1833373696,1833377791,DE +1833377792,1833379839,KZ +1833379840,1833381887,PT +1833381888,1833383935,NL +1833383936,1833385983,DK +1833385984,1833388031,SK +1833390080,1833392127,GB +1833392128,1833396223,CH +1833396224,1833398271,NL +1833398272,1833400319,DE +1833400320,1833402367,GB +1833402368,1833406463,FR +1833406464,1833408511,GB +1833410560,1833412607,LU +1833412608,1833414655,GB +1833414656,1833416703,RU +1833416704,1833418751,NL +1833418752,1833422847,RU +1833422848,1833424895,CZ +1833424896,1833426943,DE +1833426944,1833428991,KG +1833428992,1833431039,IT +1833431040,1833433087,RU +1833435136,1833439231,CZ +1833439232,1833443327,GB +1833443328,1833447423,NL +1833447424,1833451519,RS +1833451520,1833455615,RU +1833455616,1833459711,NL +1833459712,1833463807,ME +1833463808,1833467903,UA +1833467904,1833468671,RU +1833468672,1833471999,CH +1833472000,1833473023,NL +1833474048,1833475071,UA +1833476096,1833484287,NL +1833484288,1833488383,IR +1833488384,1833492479,GB +1833492480,1833504767,RU +1833504768,1833508863,DE +1833508864,1833512959,RU +1833512960,1833517055,DE +1833517056,1833521151,GB +1833521152,1833525247,IT +1833525248,1833529343,LV +1833529344,1833533439,GB +1833535488,1833537535,RU +1833537536,1833541631,AT +1833541632,1833541887,GB +1833541888,1833542143,IN +1833542144,1833542655,GB +1833542656,1833542911,IN +1833542912,1833543167,GB +1833543168,1833543423,IN +1833543424,1833544887,GB +1833544888,1833544888,AE +1833544889,1833544959,GB +1833544960,1833545001,IN +1833545002,1833545002,GB +1833545003,1833545087,IN +1833545088,1833545215,GB +1833545216,1833545471,NL +1833545472,1833545727,GB +1833545728,1833549823,IT +1833549824,1833553919,RU +1833553920,1833558015,CZ +1833558016,1833562111,US +1833562112,1833566207,PS +1833566208,1833570303,SE +1833574400,1833578495,YE +1833578496,1833582591,HU +1833582592,1833586687,TJ +1833586688,1833590783,FR +1833590784,1833594879,PL +1833594880,1833603071,RU +1833603072,1833607167,SK +1833607168,1833611263,RU +1833611264,1833615359,NO +1833615360,1833619455,GB +1833619456,1833623551,RU +1833623552,1833627647,IR +1833627648,1833631743,GB +1833631744,1833635839,CZ +1833635840,1833639935,DE +1833639936,1833640959,AM +1833640960,1833641215,RU +1833641216,1833644031,AM +1833644032,1833648127,TJ +1833648128,1833652223,LB +1833652224,1833660415,DE +1833660416,1833664511,IT +1833664512,1833668607,RU +1833668608,1833672703,CZ +1833672704,1833676799,GB +1833676800,1833680895,DE +1833680896,1833684991,UA +1833684992,1833689087,DE +1833689088,1833693183,FI +1833693184,1833697279,RU +1833697280,1833959423,IE +1833959424,1834090495,CZ +1834090496,1834221567,SA +1834221568,1834352639,DE +1834352640,1834483711,UA +1834483712,1834614783,BE +1834614784,1834745855,DE +1834745856,1834786815,RS +1834786816,1834787327,XK +1834787328,1834805247,RS +1834805248,1834806271,XK +1834806272,1834876927,RS +1834876928,1834885119,RU +1834885120,1834893311,FR +1834893312,1834901503,RU +1834901504,1834903551,RS +1834903552,1834904575,BA +1834904576,1834905087,RS +1834905088,1834905343,BG +1834905344,1834909695,RS +1834909696,1834913791,GB +1834913792,1834917887,US +1834917888,1834921983,UA +1834921984,1834930175,RU +1834934272,1834938367,RS +1834938368,1834944511,PL +1834944512,1834946559,RO +1834946560,1834948607,RU +1834948608,1834950655,PL +1834950656,1834956799,UA +1834956800,1834960895,IR +1834960896,1834964991,RU +1834964992,1834967039,PL +1834967040,1834971135,RU +1834971136,1834973183,PL +1834973184,1834974207,UA +1834975232,1834977279,IL +1834977280,1834983423,PL +1834983424,1834985471,RU +1834985472,1834989567,PL +1834989568,1834991615,GB +1834991616,1834993663,RU +1834993664,1834995711,PL +1834995712,1835001855,RU +1835001856,1835003903,PL +1835003904,1835005951,CH +1835005952,1835007999,RU +1835008000,1835532287,RO +1835532288,1835540479,SE +1835540480,1835548671,DE +1835548672,1835565055,GB +1835565056,1835573247,AL +1835573248,1835581439,UA +1835581440,1835589631,BG +1835589632,1835597823,IT +1835597824,1835606015,HU +1835606016,1835614207,CZ +1835614208,1835622399,RU +1835622400,1835627007,SE +1835627008,1835627263,DK +1835627264,1835630591,SE +1835630592,1835634687,RU +1835634688,1835638527,LU +1835638528,1835638783,AM +1835638784,1835646975,RU +1835646976,1835655167,BA +1835655168,1835663359,CY +1835663360,1835671551,UA +1835671552,1835679743,CH +1835679744,1835687935,FR +1835687936,1835696127,IE +1835696128,1835704319,RU +1835712512,1835720703,RU +1835720704,1835728895,RS +1835728896,1835737087,PL +1835737088,1835745279,GB +1835745280,1835753471,BG +1835753472,1835761663,ES +1835761664,1835769855,JO +1835769856,1835778047,RU +1835778048,1835786239,CZ +1835786240,1835794431,JO +1835794432,1835802623,FI +1835802624,1835810815,RU +1835810816,1835819007,UA +1835819008,1835827199,CZ +1835827200,1835835391,GB +1835835392,1835843583,IR +1835843584,1835851775,NO +1835851776,1835859967,UA +1835859968,1835868159,DE +1835868160,1835876351,IR +1835876352,1835884543,NO +1835884544,1835892735,NL +1835892736,1835909119,GB +1835909120,1835911167,RS +1835911168,1835913215,DE +1835913216,1835917311,RU +1835917312,1835917919,GB +1835917920,1835917927,IT +1835917928,1835918439,GB +1835918440,1835918447,IT +1835918448,1835918519,GB +1835918520,1835918527,IT +1835918528,1835918711,GB +1835918712,1835918719,IT +1835918720,1835918735,GB +1835918736,1835918743,IT +1835918744,1835919415,GB +1835919416,1835919423,IT +1835919424,1835921111,GB +1835921112,1835921127,IT +1835921128,1835922559,GB +1835922560,1835922567,IT +1835922568,1835922647,GB +1835922648,1835922655,IT +1835922656,1835922671,GB +1835922672,1835922679,IT +1835922680,1835923151,GB +1835923152,1835923159,IT +1835923160,1835923519,GB +1835923520,1835923527,IT +1835923528,1835923679,GB +1835923680,1835923687,IT +1835923688,1835923719,GB +1835923720,1835923727,IT +1835923728,1835924287,GB +1835924288,1835924295,IT +1835924296,1835924815,GB +1835924816,1835924823,IT +1835924824,1835925007,GB +1835925008,1835925015,IT +1835925016,1835925111,GB +1835925112,1835925119,IT +1835925120,1835925191,GB +1835925192,1835925199,IT +1835925200,1835925479,GB +1835925480,1835925487,IT +1835925488,1835925503,GB +1835925504,1835933695,LV +1835933696,1835941887,RU +1835941888,1835950079,UA +1835950080,1835958271,LB +1835958272,1835966463,HU +1835966464,1835974655,IR +1835974656,1835982847,HU +1835982848,1835991039,CY +1835991040,1835999231,RU +1835999232,1836007423,IR +1836007424,1836015615,RU +1836015616,1836017968,AD +1836017969,1836017969,ES +1836017970,1836023807,AD +1836023808,1836040191,RU +1836040192,1836048383,GB +1836048384,1836056575,RS +1836056576,1836450337,IT +1836450338,1836450338,CN +1836450339,1836450371,IT +1836450372,1836450372,CN +1836450373,1836450450,IT +1836450451,1836450451,CN +1836450452,1836450470,IT +1836450471,1836450471,CN +1836450472,1836450511,IT +1836450512,1836450512,CN +1836450513,1836450869,IT +1836450870,1836450870,CN +1836450871,1836450881,IT +1836450882,1836450882,CN +1836450883,1836450883,IT +1836450884,1836450884,CN +1836450885,1836450926,IT +1836450927,1836450927,CN +1836450928,1836450931,IT +1836450932,1836450932,CN +1836450933,1836450940,IT +1836450941,1836450941,CN +1836450942,1836450955,IT +1836450956,1836450956,CN +1836450957,1836451346,IT +1836451347,1836451348,CN +1836451349,1836451350,IT +1836451351,1836451351,CN +1836451352,1836451406,IT +1836451407,1836451407,CN +1836451408,1836451417,IT +1836451418,1836451418,CN +1836451419,1836451461,IT +1836451462,1836451462,CN +1836451463,1836451463,IT +1836451464,1836451464,CN +1836451465,1836451521,IT +1836451522,1836451522,CN +1836451523,1836452122,IT +1836452123,1836452123,CN +1836452124,1836452147,IT +1836452148,1836452148,CN +1836452149,1836452186,IT +1836452187,1836452187,CN +1836452188,1836452315,IT +1836452316,1836452316,CN +1836452317,1836452343,IT +1836452344,1836452345,CN +1836452346,1836452445,IT +1836452446,1836452446,CN +1836452447,1836452447,IT +1836452448,1836452448,CN +1836452449,1836452450,IT +1836452451,1836452451,CN +1836452452,1836452546,IT +1836452547,1836452547,CN +1836452548,1836452751,IT +1836452752,1836452752,CN +1836452753,1836452755,IT +1836452756,1836452757,CN +1836452758,1836453483,IT +1836453484,1836453484,CN +1836453485,1836453539,IT +1836453540,1836453540,CN +1836453541,1836453573,IT +1836453574,1836453574,CN +1836453575,1836454695,IT +1836454696,1836454696,CN +1836454697,1836454740,IT +1836454741,1836454741,CN +1836454742,1836454755,IT +1836454756,1836454756,CN +1836454757,1836455219,IT +1836455220,1836455220,CN +1836455221,1836455228,IT +1836455229,1836455229,CN +1836455230,1836455233,IT +1836455234,1836455234,CN +1836455235,1836455263,IT +1836455264,1836455264,CN +1836455265,1836455272,IT +1836455273,1836455274,CN +1836455275,1836455281,IT +1836455282,1836455282,CN +1836455283,1836455305,IT +1836455306,1836455306,CN +1836455307,1836455309,IT +1836455310,1836455310,CN +1836455311,1836455378,IT +1836455379,1836455379,CN +1836455380,1836455454,IT +1836455455,1836455455,CN +1836455456,1836455458,IT +1836455459,1836455460,CN +1836455461,1836455516,IT +1836455517,1836455517,CN +1836455518,1836455546,IT +1836455547,1836455547,CN +1836455548,1836455556,IT +1836455557,1836455557,CN +1836455558,1836455562,IT +1836455563,1836455563,CN +1836455564,1836455565,IT +1836455566,1836455566,CN +1836455567,1836455568,IT +1836455569,1836455570,CN +1836455571,1836455589,IT +1836455590,1836455590,CN +1836455591,1836455631,IT +1836455632,1836455632,CN +1836455633,1836455987,IT +1836455988,1836455988,CN +1836455989,1836455993,IT +1836455994,1836455995,CN +1836455996,1836455997,IT +1836455998,1836455998,CN +1836455999,1836456001,IT +1836456002,1836456002,CN +1836456003,1836456021,IT +1836456022,1836456022,CN +1836456023,1836456097,IT +1836456098,1836456098,CN +1836456099,1836456117,IT +1836456118,1836456118,CN +1836456119,1836456131,IT +1836456132,1836456135,CN +1836456136,1836456136,IT +1836456137,1836456137,CN +1836456138,1836458047,IT +1836458048,1836458048,CN +1836458049,1836459294,IT +1836459295,1836459295,CN +1836459296,1836459383,IT +1836459384,1836459384,CN +1836459385,1836459399,IT +1836459400,1836459400,CN +1836459401,1836466454,IT +1836466455,1836466455,CN +1836466456,1836466465,IT +1836466466,1836466466,CN +1836466467,1836466529,IT +1836466530,1836466530,CN +1836466531,1836466532,IT +1836466533,1836466533,CN +1836466534,1836466551,IT +1836466552,1836466552,CN +1836466553,1836580863,IT +1836580864,1836597247,RU +1836597248,1836598271,LU +1836598272,1836605439,FR +1836605440,1836606463,GB +1836606464,1836611583,LU +1836611584,1836613631,DE +1836613632,1836630015,RU +1836630016,1836646399,BG +1836646400,1836679167,RS +1836679168,1836680703,BG +1836680704,1836681215,MK +1836681216,1836687359,BG +1836687360,1836689151,MK +1836689152,1836711935,BG +1836711936,1836728319,UA +1836728320,1836744703,RS +1836744704,1836747263,FR +1836747264,1836747775,RE +1836747776,1836749823,FR +1836749824,1836750335,RE +1836750336,1836752895,FR +1836752896,1836756223,RE +1836756224,1836756479,FR +1836756480,1836756991,RE +1836756992,1836759039,FR +1836759040,1836760575,RE +1836760576,1836761087,FR +1836761088,1836777471,IR +1836777472,1836793855,SI +1836793856,1836794567,GB +1836794568,1836794587,FR +1836794588,1836794588,GB +1836794589,1836794592,FR +1836794593,1836794594,GB +1836794595,1836794595,FR +1836794596,1836797951,GB +1836797952,1836798207,DE +1836798208,1836807087,GB +1836807088,1836807088,CN +1836807089,1836810239,GB +1836810240,1836826623,RU +1836826624,1836843007,CZ +1836843008,1836875775,RU +1836875776,1836876863,SE +1836876864,1836876895,NO +1836876896,1836892159,SE +1836892160,1836908543,RU +1836908544,1836924927,IE +1836924928,1836941311,DE +1836941312,1836957695,IR +1836957696,1836974079,PL +1836974080,1836990463,RU +1836990464,1837006847,AT +1837006848,1837023231,BY +1837023232,1837039615,RU +1837039616,1837055999,AZ +1837056000,1837072383,IQ +1837072384,1837088767,RU +1837088768,1837105151,SI +1837105152,1837500953,BE +1837500954,1837500954,CN +1837500955,1837501019,BE +1837501020,1837501020,CN +1837501021,1837501040,BE +1837501041,1837501041,CN +1837501042,1837501584,BE +1837501585,1837501585,CN +1837501586,1837501588,BE +1837501589,1837501589,CN +1837501590,1837501623,BE +1837501624,1837501624,CN +1837501625,1837501643,BE +1837501644,1837501644,CN +1837501645,1837501998,BE +1837501999,1837501999,CN +1837502000,1837502022,BE +1837502023,1837502023,CN +1837502024,1837502041,BE +1837502042,1837502042,CN +1837502043,1837502052,BE +1837502053,1837502053,CN +1837502054,1837502126,BE +1837502127,1837502127,CN +1837502128,1837502164,BE +1837502165,1837502165,CN +1837502166,1837502539,BE +1837502540,1837502540,CN +1837502541,1837502574,BE +1837502575,1837502575,CN +1837502576,1837502606,BE +1837502607,1837502607,CN +1837502608,1837502610,BE +1837502611,1837502611,CN +1837502612,1837502639,BE +1837502640,1837502640,CN +1837502641,1837502702,BE +1837502703,1837502703,CN +1837502704,1837502818,BE +1837502819,1837502819,CN +1837502820,1837502913,BE +1837502914,1837502914,CN +1837502915,1837502931,BE +1837502932,1837502932,CN +1837502933,1837503116,BE +1837503117,1837503117,CN +1837503118,1837503125,BE +1837503126,1837503127,CN +1837503128,1837503129,BE +1837503130,1837503131,CN +1837503132,1837503136,BE +1837503137,1837503137,CN +1837503138,1837503153,BE +1837503154,1837503154,CN +1837503155,1837503156,BE +1837503157,1837503157,CN +1837503158,1837503163,BE +1837503164,1837503165,CN +1837503166,1837503166,BE +1837503167,1837503167,CN +1837503168,1837503175,BE +1837503176,1837503176,CN +1837503177,1837503184,BE +1837503185,1837503185,CN +1837503186,1837503186,BE +1837503187,1837503187,CN +1837503188,1837503188,BE +1837503189,1837503189,CN +1837503190,1838153727,BE +1838153728,1839202303,GB +1839202304,1839235071,BG +1839235072,1839267839,IL +1839267840,1839300607,RU +1839300608,1839333375,BH +1839333376,1839366143,UA +1839366144,1839398911,IR +1839398912,1839431679,NO +1839431680,1839448063,BA +1839448064,1839450111,KZ +1839450112,1839452159,NO +1839452160,1839454207,FI +1839454208,1839456255,RU +1839456256,1839459327,RO +1839459328,1839459599,DE +1839459600,1839459615,RO +1839459616,1839460031,DE +1839460032,1839460039,RO +1839460040,1839460351,DE +1839460352,1839462399,RU +1839462400,1839464447,FI +1839464448,1839497215,CZ +1839497216,1839529983,CH +1839529984,1839562751,RU +1839562752,1839595519,BA +1839595520,1839603711,SA +1839603712,1839609855,RO +1839609856,1839618047,KZ +1839618048,1839628287,SA +1839628288,1839661055,RO +1839661056,1839693823,ES +1839693824,1839726591,RU +1839726592,1839759359,IT +1839759360,1839792127,RU +1839792128,1839794847,GB +1839794848,1839794879,CH +1839794880,1839816703,GB +1839816704,1839824895,NO +1839824896,1839890431,RU +1839890432,1839923199,GB +1839923200,1839955967,RU +1839955968,1839988735,SA +1839988736,1840021503,RU +1840021504,1840054271,GE +1840054272,1840087039,RU +1840087040,1840119807,PL +1840119808,1840152575,RU +1840152576,1840185343,GB +1840185344,1840218111,BA +1840218112,1840232447,GB +1840232448,1840232703,NL +1840232704,1840247007,GB +1840247008,1840247023,NL +1840247024,1840316415,GB +1840316416,1840381951,AE +1840381952,1840447487,GR +1840447488,1840513023,NO +1840513024,1840644095,GB +1840644096,1840709631,SI +1840709632,1840775167,CZ +1840775168,1840840703,RU +1840840704,1840906239,MD +1840906240,1840971775,IL +1840971776,1841102847,RU +1841102848,1841168383,NO +1841168384,1841233418,FR +1841233419,1841233419,GB +1841233420,1841233919,FR +1841233920,1841299455,RU +1841299456,1841430527,DE +1841430528,1841561599,RU +1841561600,1841565695,PL +1841565696,1841569791,RU +1841569792,1841577983,PL +1841577984,1841582079,RU +1841582080,1841586175,PL +1841586176,1841590271,RU +1841590272,1841594367,PL +1841594368,1841598463,RU +1841598464,1841602559,PL +1841606656,1841610751,UA +1841610752,1841618943,RU +1841618944,1841627135,PL +1841627136,1841629183,SE +1841629184,1841635327,RU +1841635328,1841639423,PL +1841639424,1841641471,RU +1841641472,1841645567,PL +1841645568,1841647615,RU +1841647616,1841649663,RO +1841649664,1841651711,RU +1841651712,1841653759,PL +1841653760,1841655807,FR +1841655808,1841668095,RU +1841668096,1841668607,SE +1841668608,1841669119,RU +1841669120,1841669375,PL +1841669376,1841669631,BE +1841669632,1841670143,UA +1841670144,1841672191,PL +1841672192,1841674239,FR +1841674240,1841676287,PL +1841676288,1841680383,RU +1841680384,1841682431,LV +1841682432,1841684479,UA +1841684480,1841686527,RU +1841686528,1841688575,RO +1841688576,1841690623,FR +1841690624,1841692671,RU +1841692672,1841700863,RS +1841700864,1841709055,MD +1841709056,1841725439,RU +1841725440,1841733631,DK +1841733632,1841758207,RU +1841758208,1841766399,PL +1841766400,1841774591,HU +1841774592,1841782783,PL +1841782784,1841790975,US +1841790976,1841799167,BG +1841799168,1841807359,DE +1841807360,1841815551,NO +1841815552,1841823743,BG +1841823744,1841831935,GB +1841831936,1841840127,MT +1841840128,1841848319,PL +1841848320,1841856511,RU +1841856512,1841864703,UA +1841864704,1841872895,YE +1841872896,1841878015,NL +1841878016,1841879039,AU +1841879040,1841879807,NL +1841879808,1841880063,GB +1841880064,1841881087,JP +1841881088,1841889279,UA +1841889280,1841897471,IR +1841897472,1841905663,KZ +1841905664,1841922047,RU +1841922048,1841926099,NL +1841926100,1841926100,DE +1841926101,1841930239,NL +1841930240,1841938431,KG +1841938432,1841946623,RU +1841946624,1841946658,PT +1841946659,1841946659,UA +1841946660,1841948671,PT +1841948672,1841948927,UA +1841948928,1841954815,PT +1841954816,1841971199,RU +1841971200,1841979391,CZ +1841979392,1841982975,NL +1841982976,1841983103,BE +1841983104,1841983487,NL +1841983488,1841985535,IM +1841985536,1841987583,SI +1841987584,1841995775,DK +1841995776,1842003967,RU +1842003968,1842012159,CH +1842012160,1842017023,GB +1842017024,1842017279,BE +1842017280,1842020351,GB +1842020352,1842028543,NO +1842028544,1842036735,CH +1842036736,1842042879,FR +1842042880,1842044927,LU +1842044928,1842053119,GB +1842053120,1842069503,IR +1842069504,1842077695,RU +1842077696,1842079743,FR +1842079744,1842081791,GP +1842081792,1842082815,MQ +1842082816,1842083839,GP +1842083840,1842084351,MQ +1842084352,1842084863,GP +1842084864,1842085887,MQ +1842085888,1842118655,GB +1842118656,1842151423,FI +1842151424,1842153471,FR +1842153472,1842153983,NO +1842153984,1842154239,US +1842154240,1842154271,NO +1842154272,1842154303,HK +1842154304,1842154335,NO +1842154336,1842154343,SG +1842154344,1842154351,NO +1842154352,1842154367,SG +1842154368,1842154495,NO +1842154496,1842155007,US +1842155008,1842155263,AU +1842155264,1842155519,NL +1842155520,1842157567,IT +1842157568,1842159615,AE +1842159616,1842161663,BA +1842161664,1842163711,GE +1842163712,1842165759,PL +1842165760,1842167807,RU +1842167808,1842169855,FR +1842169856,1842171903,CZ +1842171904,1842173951,RU +1842173952,1842175999,RO +1842176000,1842178047,FI +1842178048,1842180095,IT +1842180096,1842182143,IQ +1842182144,1842184191,LV +1842184192,1842186239,DE +1842186240,1842188287,ES +1842188288,1842190335,RU +1842190336,1842192383,GB +1842192384,1842194431,AZ +1842194432,1842196479,CH +1842196480,1842198527,DE +1842198528,1842200575,GB +1842200576,1842202623,NL +1842202624,1842204671,CH +1842204672,1842206719,AZ +1842206720,1842208767,SE +1842208768,1842210815,GB +1842210816,1842212863,LT +1842212864,1842213375,CZ +1842213376,1842213631,RU +1842213632,1842213887,SK +1842213888,1842214911,CZ +1842214912,1842216959,RU +1842216960,1842225151,KZ +1842225152,1842233343,UA +1842233344,1842241535,SA +1842241536,1842249727,RS +1842249728,1842257919,RU +1842257920,1842266111,NL +1842266112,1842274303,PL +1842282496,1842286591,RU +1842286592,1842290687,GB +1842290688,1842294783,RS +1842294784,1842298879,PL +1842302976,1842307071,RU +1842307072,1842311167,PL +1842311168,1842315263,UA +1842315264,1842319359,RO +1842319360,1842323455,PL +1842323456,1842331647,RU +1842331648,1842335743,UA +1842335744,1842339839,RO +1842339840,1842343935,RU +1842343936,1842348031,UZ +1842348032,1843396607,FR +1843396608,1843412991,IQ +1843412992,1843429375,CZ +1843429376,1843462143,GB +1843462144,1843478527,RU +1843478528,1843494911,SE +1843494912,1843511295,IR +1843511296,1843527679,RU +1843527680,1843544063,IL +1843544064,1843560447,RU +1843560448,1843576831,DE +1843576832,1843593215,RU +1843593216,1843609599,HR +1843609600,1843625983,UA +1843625984,1843642367,ES +1843642368,1843658751,RU +1843658752,1843675135,GB +1843675136,1843679231,RU +1843679232,1843691519,ME +1843691520,1843707903,SE +1843707904,1843724287,TR +1843724288,1843732479,UA +1843732480,1843765247,RU +1843765248,1843773439,KZ +1843773440,1843781631,LV +1843781632,1843789823,RU +1843789824,1843806207,SK +1843806208,1843822591,IR +1843822592,1843838975,RU +1843838976,1843839487,IR +1843839488,1843839743,ES +1843839744,1843839999,DE +1843840000,1843840255,TR +1843840256,1843840767,DE +1843840768,1843841023,SE +1843841024,1843841279,IR +1843841280,1843841791,DE +1843841792,1843842047,GB +1843842048,1843843071,IR +1843843072,1843843327,DE +1843843328,1843843583,GB +1843843584,1843843839,AT +1843843840,1843844095,DE +1843844096,1843844351,IT +1843844352,1843844863,DE +1843844864,1843845119,GB +1843845120,1843845631,ES +1843845632,1843845887,GB +1843845888,1843846143,DE +1843846144,1843846399,GB +1843846400,1843846655,IR +1843846656,1843846911,ES +1843846912,1843847167,IR +1843847168,1843851775,DE +1843851776,1843852031,IR +1843852032,1843852799,DE +1843852800,1843853311,IR +1843853312,1843853823,DE +1843853824,1843854079,ES +1843854080,1843854335,IR +1843854336,1843855359,DE +1843855360,1843871743,PL +1843871744,1843888127,GB +1843888128,1843904511,CZ +1843904512,1843920895,GB +1843920896,1843922943,IR +1843922944,1843924991,NL +1843924992,1843927039,ES +1843927040,1843929087,PL +1843929088,1843931135,IT +1843931136,1843933183,NL +1843933184,1843935231,IT +1843935232,1843937279,GB +1843937280,1843939327,ES +1843939328,1843941375,DK +1843941376,1843943423,FI +1843943424,1843945471,CH +1843945472,1843947519,FR +1843947520,1843949567,RU +1843949568,1843951615,ES +1843951616,1843955711,DE +1843955712,1843957759,IT +1843957760,1843959807,CZ +1843959808,1843961855,GB +1843963904,1843965951,DE +1843965952,1843967487,GB +1843967488,1843967743,ZA +1843967744,1843967999,GB +1843968000,1843970047,RU +1843970048,1843972095,FR +1843972096,1843974143,HU +1843974144,1843976191,ES +1843976192,1843978239,TR +1843978240,1843980287,NL +1843980288,1843982335,FR +1843982336,1843984383,PL +1843984384,1843986431,RU +1843986432,1843988479,NO +1843988480,1843990527,GB +1843990528,1843992575,LB +1843992576,1843994623,AT +1843994624,1844000767,GB +1844000768,1844002815,NO +1844002816,1844006911,CZ +1844006912,1844008959,SM +1844008960,1844011007,PL +1844011008,1844013055,IT +1844015104,1844017151,GB +1844017152,1844021247,IT +1844021248,1844027391,DE +1844027392,1844029439,CZ +1844029440,1844031487,RU +1844033536,1844035583,RS +1844035584,1844037631,MD +1844037632,1844041727,RU +1844041728,1844043775,IT +1844043776,1844049919,RU +1844049920,1844051967,DE +1844051968,1844054015,FR +1844054016,1844056063,RU +1844056064,1844058111,IL +1844058112,1844062207,RU +1844062208,1844064255,CZ +1844064256,1844068351,IT +1844068352,1844070399,ES +1844070400,1844072447,LU +1844072448,1844076543,ES +1844076544,1844078591,IE +1844078592,1844080639,DE +1844080640,1844082687,GE +1844082688,1844084735,DE +1844084736,1844086783,RU +1844086784,1844088831,IT +1844088832,1844090879,AT +1844090880,1844092927,RU +1844092928,1844094975,FR +1844094976,1844099071,GB +1844099072,1844101119,DE +1844101120,1844105215,GB +1844105216,1844107263,ES +1844107264,1844109311,DE +1844109312,1844109567,US +1844109568,1844111359,GB +1844111360,1844113407,AL +1844113408,1844115455,FI +1844115456,1844117503,DE +1844117504,1844119551,CZ +1844119552,1844121599,UA +1844121600,1844123647,ES +1844123648,1844125695,RU +1844125696,1844127743,NL +1844127744,1844129791,DE +1844129792,1844131839,NL +1844131840,1844133887,DE +1844133888,1844135935,LT +1844135936,1844137983,NL +1844137984,1844140031,FR +1844140032,1844142079,RU +1844142080,1844144127,RS +1844144128,1844144383,IT +1844144384,1844144639,SM +1844144640,1844144895,IT +1844144896,1844145407,SM +1844145408,1844146175,IT +1844146176,1844148223,NO +1844148224,1844150271,GB +1844150272,1844152319,ES +1844152320,1844154367,DE +1844154368,1844156415,GB +1844156416,1844158463,IT +1844158464,1844160511,RU +1844160512,1844162559,SE +1844162560,1844164607,CZ +1844164608,1844166655,RU +1844166656,1844168703,AZ +1844168704,1844169471,SE +1844169472,1844169487,AF +1844169488,1844169519,US +1844169520,1844169567,SE +1844169568,1844169583,US +1844169584,1844169599,SE +1844169600,1844169647,US +1844169648,1844169655,AF +1844169656,1844169679,US +1844169680,1844169687,ZM +1844169688,1844169695,IQ +1844169696,1844169703,KZ +1844169704,1844169707,ZA +1844169708,1844169727,SE +1844169728,1844170751,DE +1844170752,1844174847,RU +1844174848,1844178943,DE +1844178944,1844180991,EE +1844180992,1844183039,TR +1844183040,1844185087,IT +1844185088,1844186111,IE +1844186112,1844191231,IT +1844191232,1844195327,AL +1844199424,1844203519,RU +1844203520,1844207615,NL +1844207616,1844211711,RU +1844211712,1844215807,SK +1844215808,1844219903,BE +1844219904,1844221951,US +1844221952,1844222975,DE +1844222976,1844223999,US +1844224000,1844228095,GB +1844228096,1844232191,DK +1844232192,1844236287,ES +1844236288,1844252671,RU +1844252672,1844256767,GB +1844256768,1844260863,BA +1844260864,1844264959,CH +1844264960,1844269055,NL +1844269056,1844273151,UA +1844273152,1844277247,RU +1844277248,1844281343,AZ +1844281344,1844285439,DE +1844285440,1844289535,RU +1844289536,1844293631,IT +1844293632,1844297727,DE +1844297728,1844301823,IQ +1844301824,1844305919,NL +1844305920,1844310015,RU +1844310016,1844318207,FR +1844318208,1844322303,IT +1844322304,1844326399,CZ +1844326400,1844330495,DK +1844330496,1844334591,GB +1844334592,1844342783,RU +1844342784,1844346879,IT +1844346880,1844350975,SE +1844350976,1844355071,SY +1844355072,1844359167,KZ +1844359168,1844363263,IR +1844363264,1844367359,RU +1844367360,1844371455,CZ +1844371456,1844375551,GE +1844375552,1844379647,RU +1844379648,1844383743,IR +1844383744,1844387839,AZ +1844387840,1844391935,KZ +1844391936,1844396031,DE +1844396032,1844400127,CZ +1844400128,1844408319,GB +1844408320,1844412415,FR +1844412416,1844414463,RU +1844414464,1844414719,NL +1844414720,1844414975,US +1844414976,1844416511,RU +1844416512,1844420607,FR +1844420608,1844424703,DE +1844424704,1844428799,SI +1844428800,1844432895,DE +1844432896,1844436991,RU +1844436992,1844441087,NO +1844441088,1844445183,IT +1844445184,1844464672,FI +1844464673,1844464673,ES +1844464674,1844510719,FI +1844510720,1844576255,PL +1844576256,1844641791,GR +1844641792,1844707327,PL +1844707328,1844772863,CN +1844772864,1844838399,RS +1844838400,1844903935,GB +1844903936,1844969471,NO +1844969472,1845006335,RU +1845006336,1845010431,KZ +1845010432,1845022719,RU +1845022720,1845023743,KZ +1845023744,1845024255,RU +1845024256,1845024767,GB +1845024768,1845025535,RU +1845025536,1845025791,KZ +1845025792,1845026303,UZ +1845026304,1845027583,RU +1845027584,1845027839,ES +1845027840,1845029887,RU +1845029888,1845030143,KZ +1845030144,1845035007,RU +1845035008,1845100543,GB +1845100544,1845166079,DE +1845166080,1845231615,UA +1845231616,1845297151,RU +1845297152,1845362687,IL +1845362688,1845428223,UA +1845428224,1845493759,IE +1845493760,1845755903,JP +1845755904,1845764095,HK +1845764096,1845766143,JP +1845766144,1845768191,MY +1845768192,1845772287,JP +1845772288,1845788671,KR +1845788672,1845837823,JP +1845837824,1845839871,PH +1845839872,1845841919,IN +1845841920,1845846015,AU +1845846016,1845850111,ID +1845850112,1845851135,WS +1845851136,1845852159,AU +1845852160,1845854207,JP +1845854208,1845886975,KR +1845886976,1846018047,CN +1846018048,1846542335,KR +1846542336,1846804479,CN +1846804480,1847066623,AU +1847066624,1847590911,TW +1847590912,1847721983,AU +1847721984,1847730175,NP +1847730176,1847732223,PK +1847732224,1847734271,CN +1847734272,1847735295,NZ +1847735296,1847736319,AU +1847736320,1847738367,JP +1847738368,1847754751,KR +1847754752,1847757823,TH +1847757824,1847758847,CN +1847758848,1847770111,TH +1847770112,1847771135,SG +1847771136,1847783423,TH +1847783424,1847787519,US +1847787520,1847803903,KR +1847803904,1847807999,VN +1847808000,1847810047,ID +1847810048,1847812095,FJ +1847812096,1847853055,KR +1847853056,1848115199,PK +1848115200,1848377343,CN +1848377344,1848378367,BD +1848378368,1848380415,IN +1848380416,1848381439,CN +1848381440,1848382463,NZ +1848382464,1848383487,JP +1848383488,1848385535,AU +1848385536,1848393727,KR +1848393728,1848401919,JP +1848401920,1848406015,PH +1848406016,1848410111,NP +1848410112,1848411135,JP +1848411136,1848411391,PH +1848411392,1848412415,JP +1848412416,1848412671,PH +1848412672,1848413439,JP +1848413440,1848413951,PH +1848413952,1848414207,JP +1848414208,1848418303,CN +1848418304,1848420351,AU +1848420352,1848422399,ID +1848422400,1848424447,JP +1848424448,1848426495,VN +1848426496,1848639487,KR +1848639488,1848705023,CN +1848705024,1848770559,TH +1848770560,1848774655,JP +1848774656,1848776703,AU +1848776704,1848778751,JP +1848778752,1848786943,IN +1848786944,1848791039,JP +1848791040,1848793087,ID +1848793088,1848803327,JP +1848803328,1848819711,TW +1848819712,1848827903,JP +1848827904,1848831999,PH +1848832000,1848836095,JP +1848836096,1849032703,CN +1849032704,1849065471,JP +1849065472,1849092607,PH +1849092608,1849092863,US +1849092864,1849163775,PH +1849163776,1849819135,CN +1849819136,1849950207,JP +1849950208,1850212351,KR +1850212352,1850343423,CN +1850343424,1850376191,JP +1850376192,1850392575,MY +1850392576,1850400767,KH +1850400768,1850408959,JP +1850408960,1850490879,CN +1850490880,1850507263,KR +1850507264,1850508287,BD +1850508288,1850509311,CN +1850509312,1850510335,AU +1850510336,1850511359,KR +1850511360,1850513407,ID +1850513408,1850514431,TH +1850514432,1850515455,CN +1850515456,1850519551,IN +1850519552,1850520575,AU +1850520576,1850521599,JP +1850521600,1850522623,CN +1850522624,1850523647,HK +1850523648,1850572799,CN +1850572800,1850671103,TH +1850671104,1850736639,HK +1850736640,1851523071,CN +1851523072,1851527167,JP +1851527168,1851528191,NZ +1851528192,1851529215,KR +1851529216,1851531263,PH +1851531264,1851539455,JP +1851539456,1851540479,HK +1851540480,1851541503,CN +1851541504,1851542527,ID +1851542528,1851543551,HK +1851543552,1851547647,JP +1851547648,1851555839,SG +1851555840,1851588607,KR +1851588608,1851590655,JP +1851590656,1851591679,AU +1851591680,1851592703,ID +1851592704,1851594751,AU +1851594752,1851596799,KR +1851596800,1851604991,CN +1851604992,1851613183,PH +1851613184,1851617279,JP +1851617280,1851637759,KR +1851637760,1851654143,PK +1851654144,1853882367,CN +1853882368,1854406655,JP +1854406656,1854668799,ID +1854668800,1855455231,AU +1855455232,1855848447,CN +1855848448,1855913983,JP +1855913984,1855979519,MY +1855979520,1856241663,JP +1856241664,1856307199,TH +1856307200,1856315391,KR +1856315392,1856323583,CN +1856323584,1856339967,KR +1856339968,1856372735,JP +1856372736,1856503807,CN +1856503808,1856765951,TH +1856765952,1856770047,JP +1856770048,1856774143,IN +1856774144,1856779263,JP +1856779264,1856780287,IN +1856780288,1856782335,JP +1856782336,1856798719,KR +1856798720,1856815103,IN +1856815104,1856843775,CN +1856843776,1856847871,HK +1856847872,1856864255,CN +1856864256,1856872447,AU +1856872448,1856876543,NZ +1856876544,1856880639,IN +1856880640,1856888831,CN +1856888832,1856892927,AU +1856892928,1856897023,JP +1856897024,1857028095,AU +1857028096,1860173823,CN +1860173824,1860435967,IN +1860435968,1860698111,CN +1860698112,1860706303,JP +1860706304,1860714495,CN +1860714496,1860722687,ID +1860722688,1860726783,KR +1860726784,1860728831,AU +1860728832,1860733951,JP +1860733952,1860734975,AU +1860734976,1860735999,NZ +1860736000,1860737023,AU +1860737024,1860743167,JP +1860743168,1860743423,HK +1860743424,1860743679,JP +1860743680,1860743935,US +1860743936,1860744191,AU +1860744192,1860745215,IN +1860745216,1860746239,AU +1860746240,1860747263,PK +1860747264,1860759551,JP +1860759552,1860761599,AU +1860761600,1860763647,IN +1860763648,1860829183,JP +1860829184,1860960255,IN +1860960256,1861091327,CN +1861091328,1861222399,AU +1861222400,1866465279,CN +1866465280,1866530815,JP +1866530816,1866563583,SG +1866563584,1866579967,KR +1866579968,1866588159,JP +1866588160,1866592255,NZ +1866592256,1866596351,VN +1866596352,1866661887,CN +1866661888,1866666656,AU +1866666657,1866666657,NZ +1866666658,1866670079,AU +1866670080,1866674175,MY +1866674176,1866678271,TW +1866678272,1866686463,ID +1866686464,1866690559,KH +1866690560,1866711039,JP +1866711040,1866715135,CN +1866715136,1866727423,KR +1866727424,1866731519,HK +1866731520,1866733567,JP +1866733568,1866735615,ID +1866735616,1866743807,PH +1866743808,1866751999,CN +1866752000,1866756095,PK +1866756096,1866760191,ID +1866760192,1866792959,JP +1866792960,1866858495,NZ +1866858496,1866989567,TW +1866989568,1867513855,CN +1867513856,1867775999,TW +1867776000,1867825151,TH +1867825152,1867826175,MM +1867826176,1867841535,TH +1867841536,1867907071,CN +1867907072,1868038143,JP +1868038144,1868103679,PK +1868103680,1868201983,JP +1868201984,1868210175,MY +1868210176,1868212223,JP +1868212224,1868214271,IN +1868214272,1868218367,KH +1868218368,1868234751,SG +1868234752,1868267519,IN +1868267520,1868283903,KR +1868283904,1868292095,CN +1868292096,1868294143,IN +1868294144,1868295167,VN +1868295168,1868296191,HK +1868296192,1868300287,JP +1868300288,1868333055,IN +1868333056,1868341247,PK +1868341248,1868345343,ID +1868345344,1868346367,GU +1868346368,1868347391,TH +1868347392,1868348415,HK +1868348416,1868349439,KR +1868349440,1868357631,SG +1868357632,1868361727,HK +1868361728,1868362751,KH +1868362752,1868363775,JP +1868363776,1868365823,CN +1868365824,1868431359,IN +1868431360,1868562431,ID +1868562432,1869611007,JP +1869611008,1869645422,CN +1869645423,1869645423,CZ +1869645424,1869645429,UG +1869645430,1869645430,CN +1869645431,1869645431,UG +1869645432,1869645433,CN +1869645434,1869645434,CZ +1869645435,1869645444,CN +1869645445,1869645445,CZ +1869645446,1869645511,CN +1869645512,1869645512,UG +1869645513,1869645520,CN +1869645521,1869645521,KR +1869645522,1869645522,CN +1869645523,1869645523,KR +1869645524,1869645544,CN +1869645545,1869645547,KR +1869645548,1870004223,CN +1870004224,1870036991,KR +1870036992,1870045183,KH +1870045184,1870049279,AU +1870049280,1870053375,IN +1870053376,1870055423,AU +1870055424,1870057471,CN +1870057472,1870058495,AU +1870058496,1870059519,IN +1870059520,1870065663,AU +1870065664,1870069759,IN +1870069760,1870077951,JP +1870077952,1870086143,NP +1870086144,1870110719,CN +1870110720,1870118911,PK +1870118912,1870135295,IN +1870135296,1870462975,CN +1870462976,1870479359,JP +1870479360,1870495743,PH +1870495744,1870497791,TW +1870497792,1870499839,IN +1870499840,1870501887,JP +1870501888,1870503935,AF +1870503936,1870512127,AU +1870512128,1870528511,IN +1870528512,1873281023,CN +1873281024,1873412095,JP +1873412096,1873477631,CN +1873477632,1873510399,KR +1873510400,1873543167,JP +1873543168,1874329599,CN +1874329600,1874460671,TW +1874460672,1874591743,CN +1874591744,1874853887,JP +1874853888,1876426751,CN +1876426752,1876557823,JP +1876557824,1876688895,KR +1876688896,1876754431,AU +1876754432,1876756479,BD +1876756480,1876760575,SG +1876760576,1876761199,JP +1876761200,1876761343,SG +1876761344,1876761599,JP +1876761600,1876761855,CN +1876761856,1876762623,HK +1876762624,1876764671,KR +1876764672,1876765695,ID +1876765696,1876766719,SG +1876766720,1876768767,MY +1876768768,1876769791,AU +1876769792,1876770815,JP +1876770816,1876772351,HK +1876772352,1876773887,SG +1876773888,1876774911,HK +1876774912,1876783103,SG +1876783104,1876784127,HK +1876784128,1876785151,SG +1876785152,1876786175,HK +1876786176,1876787199,SG +1876787200,1876885503,CN +1876885504,1876886527,IN +1876886528,1876890623,CN +1876890624,1876893695,IN +1876893696,1876901887,TH +1876901888,1876918271,SG +1876918272,1876934655,LK +1876934656,1876942847,JP +1876942848,1876946943,AU +1876946944,1876947967,CN +1876947968,1876948991,HK +1876948992,1876950015,CN +1876950016,1876951039,ID +1876951040,1877475327,CN +1877475328,1877688319,JP +1877688320,1877691391,IN +1877691392,1877692415,JP +1877692416,1877696511,PH +1877696512,1877704703,CN +1877704704,1877705727,AU +1877705728,1877706751,MY +1877706752,1877707775,SG +1877707776,1877709823,AU +1877709824,1877710847,IN +1877710848,1877711871,HK +1877711872,1877721087,CN +1877721088,1877737471,TW +1877737472,1877999615,JP +1877999616,1879048191,TW +1879048192,1883504639,CN +1883504640,1883766783,JP +1883766784,1883770879,MN +1883770880,1883783167,KR +1883783168,1883799551,VN +1883799552,1883832319,KR +1883832320,1884028927,CN +1884028928,1884159999,KR +1884160000,1884164095,VN +1884164096,1884168191,TW +1884168192,1884172287,ID +1884172288,1884176383,PH +1884176384,1884184575,TW +1884184576,1884186623,ID +1884186624,1884188671,TW +1884188672,1884192767,JP +1884192768,1884209151,ID +1884209152,1884217343,JP +1884217344,1884225535,SG +1884225536,1884291071,IN +1884291072,1885863935,CN +1885863936,1885995007,TW +1885995008,1886191615,KR +1886191616,1886195455,JP +1886195456,1886195711,PH +1886195712,1886197759,ID +1886197760,1886199807,JP +1886199808,1886207999,KR +1886208000,1886214143,NZ +1886214144,1886216191,VN +1886216192,1886224383,IN +1886224384,1886257151,CN +1886257152,1886322687,IN +1886322688,1886781439,CN +1886781440,1886978047,HK +1886978048,1886986239,KR +1886986240,1886990335,TW +1886990336,1886994431,IN +1886994432,1887010815,TW +1887010816,1887019007,TH +1887019008,1887027199,HK +1887027200,1887043583,KR +1887043584,1887764479,CN +1887764480,1887813631,KR +1887813632,1887830015,IN +1887830016,1887961087,LK +1887961088,1887993855,JP +1887993856,1888026623,KR +1888026624,1888030719,BD +1888030720,1888030975,HK +1888030976,1888031231,GB +1888031232,1888034815,HK +1888034816,1888038911,JP +1888038912,1888040959,CN +1888040960,1888059391,JP +1888059392,1888063487,VN +1888063488,1888067583,JP +1888067584,1888071679,MY +1888071680,1888073727,KR +1888073728,1888239615,JP +1888239616,1888255999,KR +1888256000,1888260095,JP +1888260096,1888264191,KR +1888264192,1888266239,ID +1888266240,1888268287,JP +1888268288,1888270335,AU +1888270336,1888271359,SG +1888271360,1888272383,IN +1888272384,1888288767,KR +1888288768,1888354303,AU +1888354304,1888485375,TH +1888485376,1891631103,KR +1891631104,1891893247,CN +1891893248,1891942399,IN +1891942400,1891950591,KR +1891950592,1891958783,PH +1891958784,1892024319,VN +1892024320,1892122623,PH +1892122624,1892155391,SG +1892155392,1892941823,PH +1892941824,1893015551,KR +1893015552,1893017599,AU +1893017600,1893019647,NZ +1893019648,1893023743,TW +1893023744,1893027839,HK +1893027840,1893031935,VN +1893031936,1893040127,HK +1893040128,1893072895,AU +1893072896,1893138431,KR +1893138432,1893203967,ID +1893203968,1893728255,KR +1893728256,1896480767,CN +1896480768,1896497151,KR +1896497152,1896513535,SG +1896513536,1896546303,HK +1896546304,1896579071,BD +1896579072,1896587263,ID +1896587264,1896591359,SG +1896591360,1896593407,ID +1896593408,1896594431,AU +1896594432,1896595455,MY +1896595456,1896603647,CN +1896603648,1896605695,IN +1896605696,1896606719,AU +1896606720,1896607743,MY +1896607744,1896609791,VU +1896609792,1896611839,SG +1896611840,1897070591,CN +1897070592,1897136127,IN +1897136128,1897140223,AU +1897140224,1897141247,IN +1897141248,1897142271,HK +1897142272,1897143295,AU +1897143296,1897144319,ID +1897144320,1897152511,NC +1897152512,1897160703,FJ +1897160704,1897168895,VN +1897168896,1897169919,AU +1897169920,1897170943,HK +1897170944,1897172991,ID +1897172992,1897175039,PH +1897175040,1897176063,JP +1897176064,1897176319,SG +1897176320,1897176575,HK +1897176576,1897176831,JP +1897176832,1897177087,SG +1897177088,1897201663,JP +1897201664,1897209855,KR +1897209856,1897213951,AU +1897213952,1897218047,JP +1897218048,1897222143,IN +1897222144,1897226239,TW +1897226240,1897234431,NC +1897234432,1897242623,SG +1897242624,1897250815,TW +1897250816,1897259007,HK +1897259008,1897260031,NZ +1897260032,1897261055,BD +1897261056,1897263103,CN +1897263104,1897265151,TH +1897265152,1897267199,JP +1897267200,1897365503,VN +1897365504,1897398271,MY +1897398272,1897660415,CN +1897660416,1897725951,HK +1897725952,1897729792,JP +1897729793,1897730047,US +1897730048,1897733888,AU +1897733889,1897734143,US +1897734144,1897734849,CN +1897734850,1897734850,HK +1897734851,1897735295,CN +1897735296,1897735423,HK +1897735424,1897735999,CN +1897736000,1897736031,HK +1897736032,1897736223,CN +1897736224,1897736255,US +1897736256,1897736351,CN +1897736352,1897736415,HK +1897736416,1897737984,CN +1897737985,1897742335,US +1897742336,1897743359,SI +1897743360,1897743871,SG +1897743872,1897744575,SI +1897744576,1897744607,SG +1897744608,1897746176,SI +1897746177,1897746431,US +1897746432,1897748511,CN +1897748512,1897748514,HK +1897748515,1897750527,CN +1897750528,1897758719,US +1897758720,1897779199,KR +1897779200,1897781247,AU +1897781248,1897783295,JP +1897783296,1897784319,SG +1897784320,1897784831,HK +1897784832,1897785343,KR +1897785344,1897787391,SG +1897787392,1897789439,AU +1897789440,1897790463,KH +1897790464,1897791487,HK +1897791488,1897824255,KR +1897824256,1897857023,IN +1897857024,1897922559,CN +1897922560,1898708991,JP +1898708992,1899233279,CN +1899233280,1899237375,AU +1899237376,1899241471,JP +1899241472,1899249663,VN +1899249664,1899266047,MO +1899266048,1899267071,AU +1899267072,1899268095,HK +1899268096,1899270143,KR +1899270144,1899271167,AU +1899271168,1899272191,ID +1899272192,1899273215,SG +1899273216,1899274239,JP +1899274240,1899282431,CN +1899282432,1899290623,KR +1899290624,1899291647,JP +1899291648,1899292671,CN +1899292672,1899294719,AU +1899294720,1899298815,JP +1899298816,1899364351,TH +1899364352,1899724799,CN +1899724800,1899741183,KR +1899741184,1899749375,LK +1899749376,1899750399,CN +1899750400,1899751423,JP +1899751424,1899753471,ID +1899753472,1899757567,HK +1899757568,1899831295,KR +1899831296,1899839487,PH +1899839488,1899849727,AU +1899849728,1899850751,KR +1899850752,1899851775,VN +1899851776,1899855871,JP +1899855872,1899888639,TW +1899888640,1904345087,CN +1904345088,1904361471,JP +1904361472,1904369663,KR +1904369664,1904375807,CN +1904375808,1904376831,NZ +1904376832,1904377855,KH +1904377856,1904476159,KR +1904476160,1905262591,CN +1905262592,1906311167,JP +1906311168,1908408319,VN +1908408320,1908424703,AU +1908424704,1908441087,KR +1908441088,1908473855,JP +1908473856,1908539391,IN +1908539392,1908670463,CN +1908670464,1908735999,TW +1908736000,1908740095,AU +1908740096,1908744191,JP +1908744192,1908746239,SG +1908746240,1908748287,JP +1908748288,1908750335,PK +1908750336,1908752383,JP +1908752384,1908753407,NZ +1908753408,1908754431,PF +1908754432,1908756479,PH +1908756480,1908760575,KR +1908760576,1908761599,NZ +1908761600,1908762623,CN +1908762624,1908762879,IN +1908762880,1908763135,US +1908763136,1908763391,AU +1908763392,1908763647,US +1908763648,1908764671,ID +1908764672,1908768767,AU +1908768768,1908801535,JP +1908801536,1908899839,KR +1908899840,1908932607,NP +1908932608,1909129215,CN +1909129216,1909161983,AE +1909161984,1909194751,PK +1909194752,1909456895,CN +1909456896,1909473279,JP +1909473280,1909474303,HK +1909474304,1909475327,PH +1909475328,1909479423,HK +1909479424,1909481471,SG +1909481472,1909587967,CN +1909587968,1909719039,MY +1909719040,1909735423,CN +1909743616,1909744639,AU +1909744640,1909745663,CN +1909745664,1909746687,JP +1909747712,1909751807,ID +1909751808,1909759999,JP +1909760000,1909762047,ID +1909762048,1909764095,AU +1909764096,1909766143,PH +1909766144,1909768191,CN +1909768192,1909784575,HK +1909784576,1909817343,CN +1909817344,1909850111,JP +1909850112,1909981183,CN +1909981184,1910112255,KR +1910112256,1912340479,CN +1912340480,1912602623,HK +1912602624,1913651199,ID +1913651200,1914109951,JP +1914109952,1914175487,NZ +1914175488,1914437631,TW +1914437632,1914503167,CN +1914503168,1914552319,KR +1914552320,1914560511,SG +1914560512,1914564607,IN +1914564608,1914566655,TW +1914566656,1914567679,IN +1914567680,1914568703,MY +1914568704,1914576895,KR +1914576896,1914580991,TW +1914580992,1914585087,KR +1914585088,1914587135,AU +1914587136,1914589183,IN +1914589184,1914593279,ID +1914593280,1914601471,AU +1914601472,1914634239,KR +1914634240,1914642431,BD +1914642432,1914650623,KR +1914650624,1914652671,CN +1914652672,1914654719,AU +1914654720,1914658815,JP +1914658816,1914660863,AU +1914660864,1914662911,JP +1914662912,1914667007,KR +1914667008,1914683391,IN +1914683392,1914687487,AU +1914687488,1914688511,US +1914688512,1914689535,NZ +1914689536,1914691583,JP +1914691584,1914695679,IN +1914695680,1914697727,ID +1914697728,1914699775,IN +1914699776,1915748351,TW +1915748352,1916010495,JP +1916010496,1916141567,KR +1916141568,1916272639,CN +1916272640,1916534783,ID +1916534784,1917124607,CN +1917124608,1917169663,JP +1917169664,1917181951,NC +1917181952,1917190143,IN +1917190144,1917321215,KR +1917321216,1917779967,AU +1917779968,1917796351,ID +1917796352,1917812735,CN +1917812736,1917845503,IN +1917845504,1919680511,CN +1919680512,1919729663,KR +1919729664,1919746047,PH +1919746048,1919811583,TH +1919811584,1919815679,CN +1919815680,1919817727,ID +1919817728,1919819775,KR +1919819776,1919820543,NZ +1919820544,1919820799,AU +1919820800,1919821823,NZ +1919821824,1919823871,ID +1919823872,1919827967,JP +1919827968,1919844351,CN +1919844352,1919877119,KR +1919877120,1919885311,CN +1919885312,1919893503,KR +1919893504,1919909887,JP +1919909888,1919918079,AU +1919918080,1919926271,CN +1919926272,1919942655,KR +1919942656,1919975935,CN +1919975936,1919976191,JP +1919976192,1919999999,CN +1920000000,1920002047,HK +1920002048,1920003071,CN +1920003072,1920008191,HK +1920008192,1920057343,CN +1920057344,1920058111,HK +1920058112,1920069631,CN +1920069632,1920071167,HK +1920071168,1920072703,CN +1920072704,1920073727,HK +1920073728,1920466943,CN +1920466944,1920991231,ID +1920991232,1921056767,TH +1921056768,1921058815,JP +1921058816,1921060863,BD +1921060864,1921062911,ID +1921062912,1921064959,LA +1921064960,1921069055,SG +1921069056,1921073151,JP +1921073152,1921089535,KR +1921089536,1921105919,AU +1921105920,1921122303,KR +1921122304,1921187839,BD +1921187840,1921253375,TH +1921253376,1921318911,CN +1921318912,1921384447,MY +1921384448,1921388543,NZ +1921388544,1921391615,IN +1921391616,1921400831,JP +1921400832,1921404927,ID +1921404928,1921406463,HK +1921406464,1921406719,GB +1921406720,1921406975,HK +1921406976,1921409023,BD +1921409024,1921425407,JP +1921425408,1921431551,NZ +1921431552,1921433599,KH +1921433600,1921449983,JP +1921449984,1921515519,CN +1921515520,1921646591,TW +1921646592,1921777663,CN +1921777664,1921843199,TW +1921843200,1921851391,KR +1921851392,1921853439,JP +1921853440,1921855487,KR +1921855488,1921859583,ID +1921859584,1921861631,CN +1921861632,1921863679,SG +1921863680,1921865727,CN +1921865728,1921867775,ID +1921867776,1921871871,AU +1921871872,1921872895,US +1921872896,1921873151,NZ +1921873152,1921873407,US +1921873408,1921874687,NZ +1921874688,1921875967,US +1921875968,1921892351,CN +1921892352,1921896447,AU +1921896448,1921898495,SG +1921898496,1921900543,PH +1921900544,1921908735,KR +1921908736,1921943551,JP +1921943552,1921945599,IN +1921945600,1921949695,HK +1921949696,1921950719,AU +1921950720,1921951743,IN +1921951744,1921953791,ID +1921953792,1921957887,JP +1921957888,1921974271,GU +1921974272,1922039807,IN +1922039808,1925447679,JP +1925447680,1925578751,CN +1925578752,1925611519,AU +1925611520,1925619711,PH +1925619712,1925627903,TW +1925627904,1925638143,JP +1925638144,1925640191,PK +1925640192,1925642239,ID +1925642240,1925644287,CN +1925644288,1925660671,KR +1925660672,1925662463,HK +1925662464,1925663743,TW +1925663744,1925664767,HK +1925664768,1925677055,ID +1925677056,1926234111,KR +1926234112,1929379839,CN +1929379840,1930952703,KR +1930952704,1931345919,CN +1931345920,1931354111,JP +1931354112,1931362303,AU +1931362304,1931378687,TW +1931378688,1931427839,JP +1931427840,1931431935,CN +1931431936,1931433983,JP +1931433984,1931436031,AU +1931436032,1931444223,KR +1931444224,1931449343,TH +1931449344,1931449855,RU +1931449856,1931460607,TH +1931460608,1931468799,JP +1931468800,1931476991,SG +1931476992,1931739135,CN +1931739136,1932001279,JP +1932001280,1932132351,KR +1932132352,1932140543,AU +1932140544,1932145663,IN +1932145664,1932146687,BD +1932146688,1932147711,CN +1932147712,1932148735,HK +1932148736,1932152831,PK +1932152832,1932156927,TW +1932156928,1932161023,JP +1932161024,1932163071,TW +1932163072,1932165119,PH +1932165120,1932197887,SG +1932197888,1932263423,TW +1932263424,1933574143,CN +1933574144,1933639679,AU +1933639680,1933705215,JP +1933705216,1933770751,SG +1933770752,1933836287,TH +1933836288,1933901823,KR +1933901824,1933918207,AU +1933918208,1933922303,CN +1933922304,1933926399,IN +1933926400,1933934591,KR +1933934592,1933942783,IN +1933942784,1933950975,NZ +1933950976,1933955071,JP +1933955072,1933957119,BD +1933957120,1933959167,ID +1933959168,1933963263,JP +1933963264,1933967359,IN +1933967360,1934032895,AU +1934032896,1934098431,KR +1934098432,1934622719,VN +1934622720,1934884863,TW +1934884864,1934901247,CN +1934901248,1934917631,LA +1934917632,1934925823,MV +1934925824,1934927871,KR +1934927872,1934929919,PH +1934929920,1934931967,VN +1934931968,1934934015,JP +1934934016,1934942207,CN +1934942208,1934966783,PH +1934966784,1934974975,ID +1934974976,1934983167,JP +1934983168,1934983423,MY +1934983424,1934984447,AU +1934984448,1934984671,US +1934984672,1934984959,AU +1934984960,1934985215,US +1934985216,1934987263,JP +1934987264,1934991359,TW +1934991360,1934999551,KR +1934999552,1935015935,CN +1935015936,1935081471,KR +1935081472,1935147007,TH +1935147008,1935671295,KR +1935671296,1935933439,IN +1935933440,1936457727,CN +1936457728,1937244159,IN +1937244160,1937506303,CN +1937506304,1937510399,AU +1937510400,1937514495,CN +1937514496,1937515519,AU +1937516544,1937518591,IN +1937518592,1937522687,JP +1937522688,1937530879,ID +1937530880,1937534463,IN +1937534464,1937534975,GB +1937534976,1937535999,IN +1937536000,1937536511,GB +1937536512,1937537023,US +1937537024,1937539071,IN +1937539072,1937637375,JP +1937637376,1937670143,HK +1937670144,1937672191,NZ +1937672192,1937678335,JP +1937678336,1937686527,NC +1937686528,1937702911,KR +1937702912,1937760255,BD +1937760256,1937768447,JP +1937768448,1938030591,AU +1938030592,1938292735,MY +1938292736,1938948095,KR +1938948096,1938964479,JP +1938964480,1938972671,AU +1938972672,1938976767,MY +1938976768,1938978815,SG +1938978816,1938980863,VN +1938980864,1939079167,PH +1939079168,1939865599,CN +1939865600,1939898367,KR +1939898368,1939914751,HK +1939914752,1939931135,IN +1939931136,1939996671,KR +1939996672,1940127743,JP +1940127744,1940193279,MY +1940193280,1940234239,JP +1940234240,1940236287,VN +1940236288,1940238335,AU +1940238336,1940240383,KR +1940240384,1940242431,JP +1940242432,1940258815,TW +1940258816,1940275199,AU +1940275200,1940283391,CN +1940283392,1940291583,ID +1940291584,1940295679,IN +1940295680,1940324351,JP +1940324352,1940357119,PK +1940357120,1940389887,JP +1940389888,1940914175,CN +1940914176,1941045247,JP +1941045248,1941045759,HK +1941045760,1941046783,JP +1941046784,1941048319,HK +1941048320,1941049343,SG +1941049344,1941051391,AU +1941051392,1941052415,KH +1941052416,1941053439,AU +1941053440,1941057535,KR +1941057536,1941059583,ID +1941059584,1941061631,TH +1941061632,1941069823,KR +1941069824,1941071871,IN +1941071872,1941073919,AU +1941073920,1941075967,JP +1941075968,1941110783,ID +1941110784,1941176319,JP +1941176320,1941438463,CN +1941438464,1941569535,IN +1941569536,1941618687,PK +1941618688,1941635071,AU +1941635072,1941639167,CN +1941639168,1941643263,NP +1941643264,1941651455,IN +1941651456,1941652167,JP +1941652168,1941652175,CA +1941652176,1941655551,JP +1941655552,1941657599,KR +1941657600,1941658623,MN +1941658624,1941659647,JP +1941659648,1941667839,NZ +1941667840,1941700607,AU +1941700608,1941831679,NZ +1941831680,1945108479,CN +1945108480,1946157055,IN +1946157056,1946159103,ID +1946159104,1946161151,CN +1946161152,1946163199,AU +1946163200,1946165247,CN +1946165248,1946173439,PK +1946173440,1946173567,PG +1946173568,1946173599,HK +1946173600,1946173695,PG +1946173696,1946174463,SG +1946174464,1946174727,TW +1946174728,1946175487,SG +1946175488,1946175615,HK +1946175616,1946175743,CN +1946175744,1946175759,SG +1946175760,1946175791,HK +1946175792,1946175999,SG +1946176000,1946176255,JP +1946176256,1946176511,SG +1946176512,1946176767,AU +1946176768,1946178047,SG +1946178048,1946178303,HK +1946178304,1946178335,SG +1946178336,1946178343,US +1946178344,1946179583,SG +1946179584,1946179839,AU +1946179840,1946181631,SG +1946181632,1946189823,MY +1946189824,1946222591,JP +1946222592,1946943487,CN +1946943488,1946951679,JP +1946951680,1946953727,BD +1946953728,1946955775,ID +1946955776,1946957823,SG +1946957824,1946959871,NZ +1946959872,1946976255,LK +1946976256,1947009023,SG +1947009024,1947074559,CN +1947074560,1947205631,SG +1947205632,1948254207,CN +1948254208,1949302783,KR +1949302784,1949433855,HK +1949433856,1949437951,CN +1949437952,1949439999,AU +1949440000,1949442047,ID +1949442048,1949446143,TW +1949446144,1949448191,JP +1949448192,1949448447,IN +1949448448,1949448703,HK +1949448704,1949448959,AU +1949448960,1949449215,IN +1949449216,1949449395,SG +1949449396,1949449396,IN +1949449397,1949449471,SG +1949449472,1949449727,JP +1949449728,1949466623,IN +1949466624,1949499391,PH +1949499392,1949564927,SG +1949564928,1949958143,CN +1949958144,1949990911,PK +1949990912,1949995007,CN +1949995008,1950007295,JP +1950007296,1950009343,ID +1950009344,1950011391,BD +1950011392,1950015487,CN +1950015488,1950023679,TH +1950023680,1950089215,TW +1950089216,1950351359,CN +1950351360,1950482431,JP +1950482432,1950515199,CN +1950515200,1950515455,US +1950515456,1950515967,IN +1950515968,1950516223,US +1950516224,1950516735,IN +1950516736,1950518271,US +1950518272,1950519295,IN +1950519296,1950520319,US +1950520320,1950521343,PH +1950521344,1950523391,IN +1950523392,1950527487,AU +1950527488,1950528511,CN +1950528512,1950530559,HK +1950530560,1950531583,IN +1950531584,1950533631,NP +1950533632,1950535679,ID +1950535680,1950539775,HK +1950539776,1950541823,AU +1950541824,1950543871,HK +1950543872,1950545919,NZ +1950545920,1950547967,PH +1950547968,1950580735,KR +1950580736,1950613503,JP +1950613504,1950621695,GU +1950621696,1950629887,KR +1950629888,1950646271,IN +1950646272,1950648319,VN +1950648320,1950650367,CN +1950650368,1950654463,TH +1950654464,1950658559,ID +1950658560,1950660607,CN +1950660608,1950662655,HK +1950662656,1950666751,BD +1950666752,1950668799,NP +1950668800,1950670847,JP +1950670848,1950672895,ID +1950672896,1950674943,KR +1950674944,1950676991,IN +1950676992,1950679039,ID +1950679040,1950777343,CN +1950777344,1950810111,JP +1950810112,1950875647,PK +1950875648,1951137791,IN +1951137792,1951399935,CN +1951399936,1951662079,JP +1951662080,1951727615,KR +1951727616,1951793151,CN +1951793152,1952022527,SG +1952022528,1952026623,TW +1952026624,1952030719,CN +1952030720,1952038911,KR +1952038912,1952047103,JP +1952047104,1952051199,NZ +1952051200,1952052223,CN +1952052224,1952053247,AU +1952053248,1952054271,HK +1952054272,1952055295,TH +1952055296,1952071679,AU +1952071680,1952073727,HK +1952073728,1952074751,AU +1952074752,1952075775,NZ +1952075776,1952079871,CN +1952079872,1952088063,PK +1952088064,1952092159,NZ +1952092160,1952096255,JP +1952096256,1952102399,ID +1952102400,1952104447,CN +1952104448,1952108543,JP +1952108544,1952110591,ID +1952110592,1952112639,KR +1952112640,1952116735,NP +1952116736,1952120831,IN +1952120832,1952186367,JP +1952186368,1952186623,HK +1952186624,1952186879,JP +1952186880,1952187135,HK +1952187136,1952188927,JP +1952188928,1952189183,HK +1952189184,1952189951,JP +1952189952,1952190207,HK +1952190208,1952190463,JP +1952190464,1952196607,HK +1952196608,1952219135,JP +1952219136,1952219903,HK +1952219904,1952220415,JP +1952220416,1952220671,HK +1952220672,1952233471,JP +1952233472,1952249855,HK +1952249856,1952251903,JP +1952251904,1952284671,PH +1952284672,1952288767,NZ +1952288768,1952292863,JP +1952292864,1952317439,KR +1952317440,1952382975,JP +1952382976,1952448511,CN +1952448512,1953497087,VN +1953497088,1953890303,CN +1953890304,1953923071,VN +1953923072,1953939455,TW +1953939456,1953951743,JP +1953951744,1953955839,AU +1953955840,1954021375,IN +1954021376,1954545663,KR +1954545664,1958805503,CN +1958805504,1958807551,SG +1958807552,1958809599,MO +1958809600,1958821887,CN +1958821888,1958825983,VN +1958825984,1958830079,KR +1958830080,1958838271,JP +1958838272,1958842367,IN +1958842368,1958844415,NZ +1958844416,1958845439,CN +1958845440,1958845951,MY +1958845952,1958846463,HK +1958846464,1958847487,IN +1958847488,1958848511,CN +1958848512,1958849535,HK +1958849536,1958850559,ID +1958850560,1958852607,CN +1958852608,1958853631,AU +1958853632,1958854655,ID +1958854656,1958860799,AU +1958860800,1958862847,BD +1958862848,1958871039,JP +1958871040,1959067647,CN +1959067648,1959100415,MY +1959100416,1959102463,ID +1959102464,1959104511,JP +1959104512,1959106559,AU +1959106560,1959107583,IN +1959107584,1959108607,NZ +1959108608,1959110655,CN +1959110656,1959112703,JP +1959112704,1959113215,HK +1959113216,1959113471,IN +1959113472,1959113727,HK +1959113728,1959113983,CN +1959113984,1959116799,HK +1959116800,1959133183,SG +1959133184,1959239679,CN +1959239680,1959241727,KR +1959241728,1959243775,IN +1959243776,1959247871,JP +1959247872,1959249919,ID +1959251968,1959256063,NZ +1959256064,1959260159,AU +1959260160,1959264255,JP +1959264256,1959395327,KR +1959395328,1959526399,IN +1959526400,1959657471,CN +1959657472,1959657727,US +1959657728,1959658495,HK +1959658496,1959661567,ID +1959661568,1959662591,IN +1959662592,1959663615,LK +1959663616,1959664639,SG +1959664640,1959668735,ID +1959668736,1959669759,BD +1959669760,1959670015,MX +1959670016,1959670143,CO +1959670144,1959670271,AR +1959670272,1959670399,TH +1959670400,1959670527,SG +1959670528,1959670655,FI +1959670656,1959670783,NO +1959670784,1959671807,HK +1959671808,1959673855,BD +1959673856,1959674879,PK +1959674880,1959675903,JP +1959675904,1959676927,TW +1959676928,1959677951,SG +1959677952,1959678975,AU +1959678976,1959679999,PK +1959680000,1959681023,BD +1959681024,1959681024,HK +1959681025,1959681279,CN +1959681280,1959681280,HK +1959681281,1959681535,CN +1959681536,1959681536,HK +1959681537,1959681791,CN +1959681792,1959681792,HK +1959681793,1959682047,CN +1959682048,1959683071,IN +1959683072,1959684095,US +1959684096,1959685119,SC +1959685120,1959686143,PH +1959686144,1959687167,TH +1959687168,1959688191,HK +1959688192,1959689215,JP +1959689216,1959690239,TH +1959690240,1959691263,AU +1959691264,1959692287,BD +1959692288,1959693311,MM +1959693312,1959694335,PK +1959694336,1959698431,IN +1959698432,1959699455,NZ +1959699456,1959700479,PK +1959700480,1959701503,SE +1959701504,1959702527,NZ +1959702528,1959703551,CN +1959703552,1959704575,LK +1959704576,1959705599,AU +1959705600,1959707647,BD +1959707648,1959708671,ID +1959708672,1959709695,IN +1959709696,1959710719,SG +1959710720,1959711743,HK +1959711744,1959712767,ID +1959712768,1959713791,AU +1959713792,1959714815,IN +1959714816,1959715839,PH +1959715840,1959716095,AU +1959716096,1959716351,NZ +1959716352,1959716863,AU +1959716864,1959719935,ID +1959719936,1959720959,LK +1959720960,1959721983,MY +1959721984,1959723007,BD +1959723008,1960050687,CN +1960050688,1960058879,KR +1960058880,1960067071,VN +1960067072,1960069119,AU +1960069120,1960071167,ID +1960071168,1960075263,TW +1960075264,1960077311,ID +1960077312,1960079359,BD +1960079360,1960083455,HK +1960083456,1960091647,KH +1960091648,1960095743,CN +1960095744,1960097791,IN +1960097792,1960099839,BD +1960099840,1960121343,AU +1960121344,1960122367,JP +1960122368,1960124415,ID +1960124416,1960125439,PK +1960125440,1960126463,HK +1960126464,1960128511,CN +1960128512,1960132607,ID +1960132608,1960181759,CN +1960181760,1960185855,TW +1960185856,1960187903,JP +1960187904,1960189951,KH +1960189952,1960202239,CN +1960202240,1960206335,JP +1960206336,1960210431,SG +1960210432,1960210943,TH +1960210944,1960211199,IN +1960211200,1960211455,SG +1960211456,1960211903,AU +1960211904,1960211967,SG +1960211968,1960212479,AU +1960212480,1960212991,IN +1960212992,1960214015,SG +1960214016,1960214271,IN +1960214272,1960214527,SG +1960214528,1960574975,CN +1960574976,1960837119,JP +1960837120,1961885695,CN +1961885696,1961951231,AU +1961951232,1962016767,TW +1962016768,1962541055,CN +1962541056,1962622975,AU +1962622976,1962639359,CN +1962639360,1962658815,NZ +1962658816,1962659839,HK +1962659840,1962663935,SG +1962663936,1962672127,HK +1962672128,1962803199,CN +1962803200,1962827775,JP +1962827776,1962829823,ID +1962829824,1962831871,CN +1962831872,1962835967,ID +1962835968,1962868735,CN +1962868736,1962885119,AU +1962885120,1962901503,KR +1962901504,1962934271,CN +1962934272,1963458559,VN +1963458560,1963982847,CN +1963982848,1964113919,KR +1964113920,1964118015,HK +1964118016,1964120063,ID +1964120064,1964122111,JP +1964122112,1964122367,SG +1964122368,1964122879,JP +1964122880,1964123135,HK +1964123136,1964123391,GB +1964123392,1964123647,US +1964123648,1964123903,CN +1964123904,1964126207,SG +1964126208,1964126463,HK +1964126464,1964129279,SG +1964129280,1964129535,HK +1964129536,1964130303,SG +1964130304,1964134399,HK +1964134400,1964136447,AU +1964136448,1964138495,JP +1964138496,1964146687,HK +1964146688,1964171263,JP +1964173312,1964173567,US +1964173568,1964173823,JP +1964173824,1964174079,US +1964174080,1964174335,AU +1964174336,1964174591,SG +1964174592,1964174620,US +1964174621,1964174621,TW +1964174622,1964175359,US +1964175360,1964176383,GB +1964176384,1964178431,PK +1964178432,1964179455,FR +1964179456,1964179456,AU +1964179457,1964244991,TW +1964244992,1964249087,AU +1964249088,1964253183,PK +1964253184,1964255231,WF +1964255232,1964257279,SG +1964257280,1964261375,ID +1964261376,1964263423,AU +1964263424,1964265471,JP +1964265472,1964269567,KR +1964269568,1964273663,JP +1964273664,1964275711,KH +1964275712,1964277759,GU +1964277760,1964294143,SG +1964294144,1964310527,KR +1964310528,1965948927,CN +1965948928,1966014463,JP +1966014464,1966079999,TH +1966080000,1966342143,CN +1966342144,1966407679,KR +1966407680,1966417919,JP +1966417920,1966418943,PK +1966418944,1966419967,ID +1966419968,1966424063,CN +1966424064,1966440447,KR +1966440448,1966444543,AU +1966444544,1966446591,ID +1966446592,1966447615,MY +1966447616,1966448639,NZ +1966448640,1966452735,AU +1966452736,1966456831,CN +1966456832,1966473215,KR +1966473216,1966538751,ID +1966538752,1966571519,JP +1966571520,1966587903,KR +1966587904,1966591999,AF +1966592000,1966596095,JP +1966596096,1966600191,AU +1966600192,1966602239,IN +1966602240,1966604287,KH +1966604288,1966669823,TW +1966669824,1966768127,CN +1966768128,1966772223,KR +1966772224,1966776319,JP +1966776320,1966784511,SG +1966784512,1966792703,PH +1966792704,1966796799,JP +1966796800,1966798847,BD +1966798848,1966800895,AU +1966800896,1967783935,CN +1967783936,1967800319,JP +1967800320,1967808511,CN +1967808512,1967812607,AU +1967812608,1967816703,ID +1967816704,1969225727,CN +1969225728,1969487871,IN +1969487872,1969618943,CN +1969618944,1969635327,PK +1969635328,1969651711,ID +1969651712,1969659903,AU +1969659904,1969661951,ID +1969661952,1969676287,JP +1969676288,1969688575,ID +1969688576,1969692671,CN +1969692672,1969694719,ID +1969694720,1969696767,CN +1969696768,1969702911,ID +1969702912,1969704959,CN +1969704960,1969707007,BD +1969707008,1969709055,MH +1969709056,1969713151,TW +1969713152,1969713663,AU +1969713664,1969714687,ID +1969714688,1969715199,AU +1969715200,1969716223,SG +1969716224,1969716735,HK +1969716736,1969717247,IN +1969717248,1969721343,CN +1969721344,1969725439,HK +1969725440,1969727487,JP +1969727488,1969729535,ID +1969729536,1969733631,JP +1969733632,1969750015,VN +1969750016,1969790975,JP +1969790976,1969793023,AU +1969793024,1969795071,CN +1969795072,1969797119,NZ +1969797120,1969797631,SG +1969797632,1969798143,BD +1969798144,1969798399,CN +1969798400,1969798655,HK +1969798656,1969798911,KR +1969798912,1969799167,HK +1969799168,1969807359,ID +1969807360,1969809407,AF +1969809408,1969811455,IN +1969811456,1969815551,PH +1969815552,1969881087,SG +1969881088,1970012159,CN +1970012160,1970143231,JP +1970143232,1970274303,KR +1970274304,1970798591,CN +1970798592,1970800639,SG +1970800640,1970802943,AU +1970802944,1970803199,SG +1970803200,1970803455,AU +1970803456,1970803711,IN +1970803712,1970803967,HK +1970803968,1970804223,SG +1970804224,1970804519,AU +1970804520,1970804520,SG +1970804521,1970804735,AU +1970804736,1970806783,KH +1970806784,1970808831,NZ +1970808832,1970810879,AU +1970810880,1970812927,JP +1970812928,1970813951,IN +1970813952,1970814975,HK +1970814976,1970915327,CN +1970915328,1970917375,ID +1970917376,1970921471,TH +1970921472,1970925567,NP +1970925568,1970925823,MY +1970925824,1970926079,SG +1970926080,1970926335,AU +1970926336,1970926591,US +1970926592,1970926847,SG +1970926848,1970927103,FR +1970927104,1970927359,SG +1970927360,1970927615,US +1970927616,1970929663,AU +1970929664,1970962431,VN +1970962432,1970995199,CN +1970995200,1971060735,KR +1971060736,1975517183,CN +1975517184,1979711487,IN +1979711488,1981284351,JP +1981284352,1981480959,CN +1981480960,1981546495,JP +1981546496,1981808639,CN +1981808640,1983905791,KR +1983905792,1984102399,CN +1984102400,1984118783,AU +1984118784,1984131071,JP +1984131072,1984135167,CN +1984135168,1984151551,KR +1984151552,1984153599,NZ +1984153600,1984155647,KH +1984155648,1984159743,BD +1984159744,1984167935,IN +1984167936,1984430079,VN +1984430080,1985085439,CN +1985085440,1985093631,ID +1985093632,1985097727,AU +1985097728,1985118207,JP +1985118208,1985150975,NZ +1985150976,1985216511,JP +1985216512,1985347583,CN +1985347584,1985478655,JP +1985478656,1985480703,IN +1985480704,1985482751,PH +1985482752,1985486847,AU +1985486848,1985609727,CN +1985609728,1985675263,NZ +1985675264,1985708031,KR +1985708032,1985712127,ID +1985712128,1985716223,KR +1985716224,1985720319,NP +1985720320,1985724415,IN +1985724416,1985732607,JP +1985732608,1985734655,ID +1985734656,1985736703,IN +1985736704,1985740799,CN +1985740800,1985871871,NZ +1985871872,1986002943,IN +1986002944,1986199551,ID +1986199552,1986202623,HK +1986202624,1986202879,TW +1986202880,1986215935,HK +1986215936,1986232319,ID +1986232320,1986265087,TW +1986265088,1986396159,MY +1986396160,1986398207,VN +1986398208,1986400255,HK +1986400256,1986406399,CN +1986406400,1986412543,JP +1986412544,1986428927,AU +1986428928,1986461695,IN +1986461696,1986496511,JP +1986496512,1986498559,BT +1986498560,1986502655,HK +1986502656,1986503679,IN +1986503680,1986507775,CN +1986507776,1986508799,SG +1986508800,1986509823,AU +1986509824,1986510847,JP +1986510848,1986519039,KR +1986519040,1986523135,PK +1986523136,1986525183,CN +1986525184,1986527231,BN +1986527232,1986723839,JP +1986723840,1986740223,AU +1986740224,1986756607,VN +1986756608,1986760703,PK +1986760704,1986762751,AU +1986762752,1986764799,JP +1986764800,1986768895,KR +1986768896,1986769151,SG +1986769152,1986769919,TW +1986769920,1986770943,HK +1986770944,1986772991,AU +1986772992,1986789375,MY +1986789376,1987051519,JP +1987051520,1988034559,CN +1988034560,1988067327,AU +1988067328,1988075519,CN +1988075520,1988083711,AU +1988083712,1988362239,KR +1988362240,1988624383,CN +1988624384,1988755455,ID +1988755456,1988861951,AU +1988861952,1988870143,SG +1988870144,1988886527,KR +1988886528,1989148671,HK +1989148672,1989410815,CN +1989410816,1989541887,NZ +1989541888,1989607423,TW +1989607424,1989660671,JP +1989660672,1989661695,IN +1989661696,1989662719,ID +1989662720,1989663743,AU +1989663744,1989664767,ID +1989664768,1990197247,JP +1990197248,1990983679,TW +1990983680,1991245823,TH +1991245824,1991311359,KR +1991311360,1991376895,JP +1991376896,1991442431,CN +1991442432,1991499775,BD +1991499776,1991507967,NC +1991507968,1991776255,CN +1991776256,1991776511,HK +1991776512,1991835647,CN +1991835648,1991901183,IN +1991901184,1992097791,CN +1992097792,1992163327,SG +1992163328,1992364031,CN +1992364032,1992368127,HK +1992368128,1992380415,CN +1992380416,1992384511,HK +1992384512,1992398967,CN +1992398968,1992398968,HK +1992398969,1992406228,CN +1992406229,1992406229,HK +1992406230,1992417279,CN +1992417280,1992417535,HK +1992417536,1992818687,CN +1992818688,1992949759,SG +1992949760,1993342975,CN +1993342976,1993605119,AU +1993605120,1993736191,CN +1993736192,1993850879,SG +1993850880,1993867263,CN +1993867264,1994391551,KR +1994391552,1994850303,CN +1994850304,1995046911,TW +1995046912,1995177983,KR +1995177984,1995374591,JP +1995374592,1995440127,CN +1995440128,1995571199,JP +1995571200,1995636735,CN +1995636736,1995702271,JP +1995702272,1996627967,CN +1996627968,1996630015,PH +1996630016,1996634111,ID +1996634112,1996636159,AU +1996636160,1996644351,ID +1996644352,1996652543,BT +1996652544,1997078527,CN +1997078528,1997094911,AU +1997094912,1997111295,HK +1997111296,1997127679,AU +1997127680,1997144063,HK +1997144064,1997176831,CN +1997176832,1997180927,AU +1997180928,1997185023,HK +1997185024,1997187071,JP +1997187072,1997188095,HK +1997188096,1997189119,BD +1997189120,1997191167,ID +1997191168,1997209599,JP +1997209600,1997242367,AU +1997242368,1997275135,ID +1997275136,1997406207,AU +1997406208,1997471743,TW +1997471744,1997479935,NZ +1997479936,1997488127,JP +1997488128,1997488383,AU +1997488384,1997488639,NZ +1997488640,1997492223,AU +1997492224,1997496319,KH +1997496320,1997500415,AU +1997500416,1997504511,JP +1997504512,1997506559,ID +1997506560,1997508607,CN +1997508608,1997510655,JP +1997510656,1997512703,BD +1997512704,1997520895,VN +1997520896,1997537279,TW +1997537280,1997602815,CN +1997602816,1997611007,KR +1997611008,1997619199,AU +1997619200,1997635583,KR +1997635584,1997651967,AU +1997651968,1997668351,VN +1997668352,1997680639,AU +1997680640,1997684735,IN +1997684736,1997701119,KR +1997701120,1997705215,VN +1997705216,1997707263,BD +1997707264,1997709311,ID +1997709312,1997715455,JP +1997715456,1997717503,VN +1997717504,1997723647,CN +1997723648,1997725695,JP +1997725696,1998061567,CN +1998061568,1998271271,JP +1998271272,1998271272,AU +1998271273,1998274047,JP +1998274048,1998274303,US +1998274304,1998274559,JP +1998274560,1998454783,CN +1998454784,1998456831,AU +1998456832,1998458879,JP +1998458880,1998462975,TW +1998462976,1998467071,BD +1998467072,1998471167,CN +1998471168,1998487551,PK +1998487552,1998503935,KR +1998503936,1998520319,JP +1998520320,1998553087,TH +1998553088,1998561279,JP +1998561280,1998562559,IN +1998562560,1998562815,CN +1998562816,1998562863,IN +1998562864,1998562864,HK +1998562865,1998565375,IN +1998565376,1998569471,TW +1998569472,1998577663,CN +1998577664,1998579711,AU +1998579712,1998581759,SG +1998581760,1998584063,KR +1998584064,1998584319,IN +1998584320,1998584575,OM +1998584576,1998584831,IN +1998584832,1998585087,ZA +1998585088,1998585343,SG +1998585344,1998585599,JP +1998585600,1998585855,KR +1998585856,1999130623,CN +1999130624,1999134719,BD +1999134720,1999136767,MN +1999136768,1999138815,AU +1999138816,1999142911,MY +1999142912,1999249407,CN +1999249408,1999250431,AU +1999250432,1999250943,BR +1999250944,1999251455,AR +1999251456,1999252479,VG +1999252480,1999253503,GB +1999253504,1999254527,MY +1999254528,1999255551,CN +1999255552,1999256575,IN +1999256576,1999257599,HK +1999257600,1999273983,TH +1999273984,1999278079,CN +1999278080,1999280127,HK +1999280128,1999282175,IN +1999282176,1999290367,KR +1999290368,1999298559,SG +1999298560,1999306751,CN +1999306752,1999372287,IN +1999372288,1999503359,CN +1999503360,1999568895,TH +1999568896,1999589375,JP +1999589376,1999591423,HK +1999591424,1999593471,ID +1999593472,1999597567,JP +1999597568,1999601663,NZ +1999601664,1999634431,JP +1999634432,2000158719,CN +2000158720,2000191487,SG +2000191488,2000224255,KR +2000224256,2000355327,CN +2000355328,2000371711,KR +2000371712,2000373759,JP +2000373760,2000375807,HK +2000375808,2000377855,AF +2000377856,2000379903,JP +2000379904,2000388095,TH +2000388096,2000617471,CN +2000617472,2000621567,PH +2000621568,2000625663,JP +2000625664,2000633855,CN +2000633856,2000642047,TH +2000642048,2000646143,HK +2000646144,2000650239,JP +2000650240,2000654335,PK +2000654336,2000668671,JP +2000668672,2000674815,AU +2000674816,2001207295,KR +2001207296,2001272831,JP +2001272832,2001305599,PK +2001305600,2001420287,SG +2001420288,2001453055,KR +2001453056,2001457151,SG +2001457152,2001461247,CN +2001461248,2001465343,JP +2001465344,2001469439,TW +2001469440,2001534975,TH +2001534976,2001559551,AU +2001559552,2001567743,KR +2001567744,2001600511,TW +2001600512,2001797119,CN +2001797120,2001798849,SG +2001798850,2001798850,KR +2001798851,2001817673,SG +2001817674,2001817674,US +2001817675,2001829887,SG +2001829888,2001841247,HK +2001841248,2001841248,SA +2001841249,2001846271,HK +2001846272,2001854463,SG +2001854464,2001862655,HK +2001862656,2001864703,AU +2001864704,2001870847,JP +2001870848,2001879039,KR +2001879040,2001895423,IN +2001895424,2001899519,VN +2001899520,2001901567,AU +2001901568,2001915903,JP +2001915904,2001919999,CN +2001920000,2001926143,ID +2001926144,2001928191,KH +2001928192,2001993727,JP +2001993728,2002518015,CN +2002518016,2002575325,PH +2002575326,2002575326,US +2002575327,2002780159,PH +2002780160,2003273727,CN +2003273728,2003273983,BT +2003273984,2003304447,CN +2003304448,2003566591,JP +2003566592,2003697663,CN +2003697664,2003714047,MY +2003714048,2003720191,ID +2003720192,2003722239,JP +2003722240,2003726335,MY +2003726336,2003730431,ID +2003730432,2003763199,MY +2003763200,2003828735,PH +2003828736,2006188031,CN +2006188032,2006204415,BD +2006204416,2006212607,AU +2006212608,2006214655,TH +2006214656,2006216703,JP +2006216704,2006228991,KR +2006228992,2006237183,CN +2006237184,2006253567,JP +2006253568,2006319103,KR +2006319104,2006384639,JP +2006384640,2006433791,IN +2006433792,2006450175,CN +2006450176,2007007231,PK +2007007232,2007023615,BN +2007023616,2007025663,IN +2007025664,2007027711,CN +2007027712,2007031807,TH +2007031808,2007033855,NZ +2007035904,2007039999,TW +2007040000,2007048191,KR +2007048192,2007064575,AU +2007064576,2007065599,IN +2007065600,2007066623,SG +2007066624,2007070719,JP +2007070720,2007498751,CN +2007498752,2007499008,JP +2007499009,2007499009,PH +2007499010,2008023039,JP +2008023040,2009071615,CN +2009071616,2011168767,KR +2011168768,2011205631,NZ +2011205632,2011209727,AU +2011209728,2011234303,JP +2011234304,2011299839,AU +2011299840,2011430911,IN +2011430912,2011693055,JP +2011693056,2011824127,CN +2011824128,2011889663,SG +2011889664,2011893759,LK +2011893760,2011897855,ID +2011897856,2011899903,NZ +2011899904,2011901951,HK +2011901952,2011906047,IN +2011906048,2011916287,FJ +2011916288,2011922431,JP +2011922432,2011938815,CN +2011938816,2011942911,KR +2011942912,2011947007,ID +2011947008,2011951103,JP +2011951104,2011953151,KR +2011953152,2011955199,ID +2011955200,2012086271,HK +2012086272,2012610559,JP +2012610560,2012741631,HK +2012741632,2013003775,CN +2013003776,2013011967,AU +2013011968,2013020159,JP +2013020160,2013028351,AU +2013028352,2013030399,CN +2013030400,2013032447,ID +2013032448,2013036543,FM +2013036544,2013038591,ID +2013038592,2013040639,HK +2013040640,2013044735,IN +2013044736,2013048831,ID +2013048832,2013052927,AU +2013052928,2013061119,IN +2013061120,2013065215,PG +2013065216,2014314495,CN +2014314496,2014838783,AU +2014838784,2015100927,CN +2015100928,2015166463,PH +2015166464,2015182847,AU +2015182848,2015199231,PH +2015199232,2015203327,KR +2015203328,2015205375,JP +2015205376,2015207423,ID +2015207424,2015215615,JP +2015215616,2015216383,IN +2015216384,2015216639,AU +2015216640,2015217663,IN +2015217664,2015219456,GU +2015219457,2015219967,IN +2015219968,2015220223,PH +2015220224,2015220479,IN +2015220480,2015220735,JP +2015220736,2015223807,IN +2015223808,2015225855,ID +2015225856,2015227903,IN +2015227904,2015231999,AU +2015232000,2016542719,CN +2016542720,2016550911,BD +2016550912,2016555007,SG +2016555008,2016559103,MY +2016559104,2016583679,KR +2016583680,2016587775,JP +2016587776,2016589823,BD +2016589824,2016591871,VN +2016591872,2016673791,JP +2016673792,2016935935,CN +2016935936,2017460223,IN +2017460224,2017984511,CN +2017984512,2017988607,JP +2017988608,2017992703,PH +2017992704,2018000895,CN +2018000896,2018004991,JP +2018004992,2018007039,VN +2018007040,2018009087,IN +2018009088,2018017279,VN +2018017280,2018050047,CN +2018050048,2018115583,KR +2018115584,2018246655,JP +2018246656,2019033087,CN +2019033088,2019035135,AU +2019035136,2019037183,CN +2019037184,2019041279,JP +2019041280,2019045375,IN +2019045376,2019049471,JP +2019049472,2019078143,AU +2019078144,2019082239,IN +2019082240,2019098623,HK +2019098624,2019115007,PH +2019117056,2019119103,IN +2019119104,2019121151,NZ +2019121152,2019123199,ID +2019123200,2019131391,NP +2019131392,2019164159,JP +2019164160,2019360767,CN +2019360768,2019426303,JP +2019426304,2019557375,CN +2019557376,2021654527,TW +2021654528,2022178815,CN +2022178816,2022180863,NZ +2022180864,2022182911,JP +2022182912,2022184959,CN +2022184960,2022187007,KH +2022187008,2022187951,HK +2022187952,2022187959,US +2022187960,2022188103,HK +2022188104,2022188111,US +2022188112,2022191103,HK +2022191104,2022194175,NZ +2022194176,2022194687,AU +2022194688,2022195199,NZ +2022195200,2022211583,KR +2022211584,2022227967,CN +2022227968,2022244351,JP +2022244352,2022277119,CN +2022277120,2022309887,JP +2022309888,2022313983,IN +2022313984,2022318079,NZ +2022318080,2022319135,AU +2022319136,2022319151,SG +2022319152,2022319359,AU +2022319360,2022319615,IN +2022319616,2022320127,AU +2022320128,2022320383,HK +2022320384,2022320675,AU +2022320676,2022320676,CN +2022320677,2022320677,ID +2022320678,2022320678,PH +2022320679,2022321151,AU +2022321152,2022321407,SG +2022321408,2022322175,AU +2022322176,2022322431,JP +2022322432,2022322695,AU +2022322696,2022322696,TW +2022322697,2022323199,AU +2022323200,2022323455,KR +2022323456,2022324223,AU +2022324224,2022324224,TH +2022324225,2022324483,AU +2022324484,2022324484,MY +2022324485,2022326271,AU +2022326272,2022330367,VN +2022330368,2022334463,MY +2022334464,2022342655,IN +2022342656,2022359039,JP +2022359040,2022375423,IN +2022375424,2022572031,MY +2022572032,2022637567,KR +2022637568,2022670335,JP +2022670336,2022678527,CN +2022678528,2022703103,KR +2022703104,2023751679,AU +2023751680,2025848831,ID +2025848832,2030043135,CN +2030043136,2030045183,AU +2030045184,2030051327,CN +2030051328,2030059519,JP +2030059520,2030108671,KR +2030108672,2030125055,PH +2030125056,2030141439,KR +2030141440,2030305279,JP +2030305280,2030436351,CN +2030436352,2030567423,SG +2030567424,2032926719,CN +2032926720,2033057791,AU +2033057792,2033074175,CN +2033074176,2033075199,PK +2033075200,2033076223,BD +2033077248,2033078271,CN +2033078272,2033079295,HK +2033079296,2033088511,IN +2033088512,2033089535,AU +2033089536,2033090559,US +2033090560,2033319935,CN +2033319936,2033321983,IN +2033321984,2033324031,CN +2033324032,2033328127,KR +2033328128,2033330175,ID +2033330176,2033336319,JP +2033336320,2033352703,KR +2033352704,2033356799,ID +2033356800,2033358847,TW +2033358848,2033362943,JP +2033362944,2033363967,HK +2033363968,2033364991,VN +2033364992,2033369087,TW +2033369088,2033377279,AU +2033377280,2033385471,KR +2033385472,2033451007,CN +2033451008,2033487871,ID +2033487872,2033491967,PK +2033491968,2033500159,CN +2033500160,2033502207,AU +2033502208,2033504255,SG +2033504256,2033516543,CN +2033516544,2033582079,KR +2033582080,2033614847,PH +2033614848,2033623039,AU +2033623040,2033624063,HK +2033624064,2033625087,MM +2033625088,2033627135,HK +2033627136,2033629183,CN +2033629184,2033630207,AU +2033630208,2033631231,CN +2033631232,2033647615,KR +2033647616,2033663999,CN +2033664000,2033696767,KR +2033696768,2033713151,GU +2033713152,2033876991,CN +2033876992,2033879039,JP +2033879040,2033887231,CN +2033887232,2033889279,IN +2033889280,2033891327,JP +2033891328,2033893375,ID +2033893376,2033909759,PH +2033909760,2034237439,CN +2034237440,2034499583,KR +2034499584,2034761727,CN +2034761728,2035023871,NZ +2035023872,2035154943,CN +2035154944,2035220479,KR +2035220480,2035253247,AU +2035253248,2035269631,CN +2035269632,2035286015,NZ +2035286016,2035810303,JP +2035810304,2035875839,KR +2035875840,2035941375,CN +2035941376,2036006911,NZ +2036006912,2036072447,AU +2036072448,2036334591,JP +2036334592,2036465663,PH +2036465664,2036596735,NZ +2036596736,2036598783,ID +2036598784,2036600831,JP +2036600832,2036604927,ID +2036604928,2036609023,SG +2036609024,2036611071,AF +2036611072,2036613119,JP +2036613120,2036629503,KR +2036629504,2036678655,CN +2036678656,2036695039,JP +2036695040,2036697087,ID +2036697088,2036699135,AU +2036699136,2036703231,IN +2036703232,2036705279,AU +2036705280,2036707327,HK +2036707328,2036709375,MN +2036709376,2036711423,ID +2036711424,2036715519,KR +2036715520,2036719615,CN +2036719616,2036727807,KR +2036727808,2037346158,JP +2037346159,2037346162,CZ +2037346163,2037346163,JP +2037346164,2037346164,CZ +2037346165,2037907455,JP +2037907456,2038169599,MY +2038169600,2038366207,KR +2038366208,2038374399,PH +2038374400,2038382591,AF +2038382592,2038415359,KR +2038415360,2038423551,AU +2038423552,2038431743,HK +2038431744,2042626047,KR +2042626048,2043150335,CN +2043150336,2043162623,AU +2043162624,2043165695,IN +2043165696,2043166719,BD +2043166720,2043183103,KR +2043183104,2043199487,JP +2043199488,2043201535,CN +2043201536,2043203583,JP +2043203584,2043205631,AU +2043205632,2043207679,JP +2043207680,2043211775,AU +2043211776,2043215871,SG +2043215872,2043281407,CN +2043281408,2043412479,HK +2043412480,2043674623,CN +2043674624,2044723199,AU +2044723200,2045771775,CN +2045771776,2046296063,IN +2046296064,2046558207,CN +2046558208,2046705663,KR +2046705664,2046722047,TW +2046722048,2046754815,KR +2046754816,2046820351,CN +2046820352,2046822399,TH +2046822400,2046824447,KR +2046824448,2046828543,MY +2046828544,2046836735,KR +2046836736,2046885887,CN +2046885888,2046951423,JP +2046951424,2047082495,PH +2047082496,2047344895,CN +2047344896,2047345151,PK +2047345152,2047346175,CN +2047346176,2047346687,PK +2047346688,2047347199,CN +2047347200,2047366143,PK +2047366144,2047366655,CN +2047366656,2047367423,PK +2047367424,2047367935,CN +2047367936,2047410175,PK +2047410176,2047492095,HK +2047492096,2047496191,KR +2047496192,2047506431,HK +2047506432,2047508479,US +2047508480,2047574015,CN +2047574016,2047606783,SG +2047606784,2047770879,CN +2047770880,2047773184,HK +2047773185,2047803391,CN +2047803392,2047868927,IN +2047868928,2048917503,JP +2048917504,2049966079,KR +2049966080,2050047999,CN +2050048000,2050064383,KR +2050064384,2050080767,AU +2050080768,2050082815,JP +2050082816,2050084863,AU +2050084864,2050088959,PH +2050088960,2050091007,ID +2050091008,2050097151,JP +2050097152,2050098175,PK +2050098176,2050099199,ID +2050099200,2050101247,SG +2050101248,2050129919,JP +2050129920,2050162687,IN +2050162688,2050228223,CN +2050228224,2050490367,PH +2050490368,2051014655,NZ +2051014656,2053242879,CN +2053242880,2053308415,IN +2053308416,2053324799,TW +2053324800,2053332991,AU +2053332992,2053335039,BD +2053335040,2053337087,JP +2053337088,2053340159,AU +2053340160,2053341183,IN +2053341184,2053373951,KR +2053373952,2053378047,AU +2053378048,2053382143,JP +2053382144,2053390335,KR +2053390336,2053406719,TW +2053406720,2053439487,MO +2053439488,2053505023,KR +2053505024,2053509119,CN +2053509120,2053511167,AU +2053511168,2053513215,IN +2053513216,2053515263,BD +2053515264,2053519359,ID +2053519360,2053521407,JP +2053521408,2053529599,CN +2053529600,2053532671,AU +2053532672,2053533183,NZ +2053533184,2053533695,AU +2053533696,2053534719,VN +2053534720,2053537791,IN +2053537792,2053636095,JP +2053636096,2054160383,AU +2054160384,2054376447,CN +2054376448,2054377471,HK +2054377472,2054422527,CN +2054422528,2054619135,TW +2054619136,2054684671,CN +2054684672,2055208959,TW +2055208960,2055213055,JP +2055213056,2055217151,ID +2055217152,2055229439,KR +2055229440,2055231487,TW +2055231488,2055233535,AU +2055233536,2055234047,JP +2055234048,2055234559,HK +2055234560,2055235583,CN +2055235584,2055237631,HK +2055237632,2055239679,JP +2055239680,2055241727,CN +2055241728,2055274495,KR +2055274496,2055290879,VN +2055290880,2055299071,PK +2055299072,2055305215,ID +2055305216,2055307263,MY +2055307264,2055315455,AU +2055315456,2055323647,JP +2055323648,2055327743,ID +2055327744,2055329791,KR +2055329792,2055331839,AU +2055331840,2055335935,JP +2055335936,2055340031,KR +2055340032,2055733247,JP +2055733248,2056257535,CN +2056257536,2056259583,ID +2056259584,2056261631,BD +2056261632,2056263679,IN +2056263680,2056265727,TH +2056265728,2056273919,TW +2056273920,2056290303,PH +2056290304,2056323071,CN +2056323072,2056388607,JP +2056388608,2056519679,TW +2056519680,2056781823,AU +2056781824,2056794111,JP +2056794112,2056796159,BD +2056796160,2056806399,JP +2056806400,2056814591,KR +2056814592,2056815215,JP +2056815216,2056815231,HK +2056815232,2056816863,JP +2056816864,2056816895,MY +2056816896,2056817335,JP +2056817336,2056817343,HK +2056817344,2056817727,JP +2056817728,2056817791,AU +2056817792,2056819087,JP +2056819088,2056819103,SG +2056819104,2056823849,JP +2056823850,2056823850,SG +2056823851,2056824831,JP +2056824832,2056824847,AU +2056824848,2056830975,JP +2056830976,2056847359,CN +2056847360,2056912895,KR +2056912896,2057043967,TH +2057043968,2057306111,CN +2057306112,2059141119,IN +2059141120,2059665407,CN +2059665408,2059796479,JP +2059796480,2059862015,CN +2059862016,2059878399,AU +2059878400,2059927551,KR +2059927552,2059931647,ID +2059931648,2059933695,IN +2059933696,2059935743,AU +2059935744,2059937791,JP +2059937792,2059939839,CN +2059939840,2059941887,ID +2059941888,2059943935,AU +2059943936,2059960319,CN +2059960320,2059961343,JP +2059961344,2059962367,HK +2059962368,2059964415,JP +2059964416,2059966463,ID +2059966464,2059968511,TW +2059968512,2059976703,AU +2059976704,2059990899,JP +2059990900,2059990900,PH +2059990901,2059995135,JP +2059995136,2059997183,VN +2059997184,2060001279,MN +2060001280,2060002559,HK +2060002560,2060002815,ID +2060002816,2060004399,HK +2060004400,2060004415,AF +2060004416,2060005375,HK +2060005376,2060009471,CN +2060009472,2060025855,AU +2060025856,2060058623,TW +2060058624,2060062719,AU +2060062720,2060066815,JP +2060066816,2060075007,KR +2060075008,2060083199,AU +2060083200,2060091391,JP +2060091392,2060189695,KR +2060189696,2060451839,CN +2060451840,2061500415,JP +2061500416,2063073279,CN +2063073280,2063077375,BD +2063077376,2063079423,HK +2063079424,2063081471,CN +2063081472,2063085567,ID +2063085568,2063089663,CN +2063089664,2063097855,JP +2063097856,2063106047,MM +2063106048,2063106559,SG +2063106560,2063107071,AU +2063107072,2063107655,SG +2063107656,2063107663,HK +2063107664,2063108095,SG +2063108096,2063110143,HK +2063110144,2063111167,JP +2063111168,2063114239,AU +2063114240,2063115263,IN +2063115264,2063116871,JP +2063116872,2063116879,KR +2063116880,2063118159,JP +2063118160,2063118191,PH +2063118192,2063118287,JP +2063118288,2063118303,PH +2063118304,2063118335,JP +2063118336,2063118591,IN +2063118592,2063120383,JP +2063120384,2063120863,AU +2063120864,2063120895,TW +2063120896,2063121407,AU +2063121408,2063122331,JP +2063122332,2063122335,IN +2063122336,2063122431,JP +2063122432,2063138815,SG +2063138816,2063335423,JP +2063335424,2063341567,AU +2063341568,2063343615,SG +2063343616,2063351807,US +2063351808,2063368191,KR +2063368192,2063370239,US +2063370240,2063372287,JP +2063372288,2063374335,AU +2063374336,2063376383,NZ +2063376384,2063380479,TW +2063380480,2063382527,KH +2063382528,2063384575,NZ +2063384576,2063392767,KR +2063392768,2063400959,IN +2063400960,2063466495,JP +2063466496,2063482879,TW +2063482880,2063483135,MN +2063483136,2063483391,JP +2063483392,2063484927,MN +2063484928,2063485183,JP +2063485184,2063485695,MN +2063485696,2063485951,JP +2063485952,2063486975,MN +2063486976,2063487231,JP +2063487232,2063492607,MN +2063492608,2063492863,JP +2063492864,2063494399,MN +2063494400,2063494655,JP +2063494656,2063499263,MN +2063499264,2063532031,KR +2063532032,2063548415,LK +2063548416,2063550463,CN +2063550464,2063551487,IN +2063551488,2063552511,JP +2063552512,2063556607,TW +2063556608,2063564799,MY +2063564800,2063597567,JP +2063597568,2063601663,KR +2063601664,2063605759,BD +2063605760,2063613951,TW +2063613952,2063630335,JP +2063630336,2063646719,CN +2063646720,2063663103,TW +2063663104,2063695871,JP +2063695872,2063728639,HK +2063728640,2063859711,AU +2063859712,2064646143,CN +2064646144,2065694719,VN +2065694720,2066743295,KR +2066743296,2066808831,JP +2066808832,2066825215,BD +2066825216,2066841599,SG +2066841600,2066874367,CN +2066874368,2066882559,JP +2066882560,2066890751,TW +2066890752,2066907135,PF +2066907136,2066915327,AU +2066915328,2066923519,CN +2066923520,2066939903,JP +2066939904,2066972671,AU +2066972672,2067005439,TW +2067005440,2067529727,CN +2067529728,2067595263,HK +2067595264,2067726335,CN +2067726336,2067791871,IN +2067791872,2070052863,CN +2070052864,2070056959,AU +2070056960,2070061055,JP +2070061056,2070077439,KR +2070077440,2070085631,JP +2070085632,2070102015,TW +2070102016,2070118399,KR +2070118400,2070159359,CN +2070159360,2070167551,AU +2070167552,2070183935,NZ +2070183936,2070192127,AU +2070192128,2070200319,KR +2070200320,2070208511,JP +2070208512,2070209279,MY +2070209280,2070209535,SG +2070209536,2070210559,AU +2070210560,2070210815,SG +2070210816,2070211071,AU +2070211072,2070216703,SG +2070216704,2070282239,CN +2070282240,2070347775,AU +2070347776,2070380543,CN +2070380544,2070396927,JP +2070396928,2070405119,AU +2070405120,2070409215,JP +2070409216,2070413311,HK +2070413312,2070677503,JP +2070677504,2070679551,ID +2070679552,2070683647,KR +2070683648,2070691839,IN +2070691840,2070692863,ID +2070692864,2070693887,AU +2070693888,2070695935,HK +2070700032,2070702079,ID +2070702080,2070703103,AU +2070703104,2070704127,HK +2070704128,2070708223,PH +2070708224,2070712319,CN +2070712320,2070714367,NZ +2070714368,2070716415,JP +2070716416,2070724607,KR +2070724608,2070726655,JP +2070726656,2070728703,IN +2070728704,2070732799,CN +2070732800,2070734847,IN +2070734848,2070736895,JP +2070736896,2070738943,BD +2070738944,2070740991,KH +2070740992,2070806527,KR +2070806528,2070872063,TW +2070872064,2070937599,KR +2070937600,2072510463,CN +2072510464,2072514559,HK +2072514560,2072516607,IN +2072516608,2072518655,BD +2072518656,2072526847,AU +2072526848,2072528895,SG +2072528896,2072530943,PH +2072530944,2072535039,CN +2072535040,2072543231,MY +2072543232,2072575999,IN +2072576000,2072772607,CN +2072772608,2073034751,KR +2073034752,2075131903,CN +2075131904,2075140095,MV +2075140096,2075144191,IN +2075144192,2075146239,JP +2075146240,2075147263,BD +2075147264,2075148287,CN +2075148288,2075150335,PH +2075150336,2075152383,WS +2075152384,2075156479,CN +2075156480,2075158527,HK +2075158528,2075160575,JP +2075160576,2075162623,AU +2075162624,2075164671,ID +2075164672,2075197439,JP +2075197440,2076180479,CN +2076180480,2076442623,TW +2076442624,2076573695,CN +2076573696,2076639231,JP +2076639232,2076671999,KR +2076672000,2076704767,CN +2076704768,2076712959,BD +2076712960,2076721151,JP +2076721152,2076737535,KR +2076737536,2076770303,AU +2076770304,2076835839,IN +2076835840,2076966911,HK +2076966912,2077097983,TW +2077097984,2077229055,CN +2077229056,2077491199,AU +2077491200,2077753343,KR +2077753344,2078539775,JP +2078539776,2078670847,KR +2078670848,2078736383,JP +2078736384,2078769151,LK +2078769152,2078801919,ID +2078801920,2079064063,CN +2079064064,2079326207,IN +2079326208,2079457279,TW +2079457280,2079490047,CN +2079490048,2079506431,TH +2079506432,2079508479,CN +2079508480,2079510527,PH +2079510528,2079514623,JP +2079514624,2079516671,HK +2079516672,2079518719,JP +2079518720,2079522815,IN +2079522816,2079588351,AU +2079588352,2079850495,CN +2079850496,2079916031,KR +2079916032,2079981567,CN +2079981568,2080112639,KR +2080112640,2080145407,TW +2080145408,2080178175,IN +2080243712,2080260095,JP +2080260096,2080268287,KR +2080268288,2080270335,CN +2080270336,2080272383,HK +2080272384,2080276479,AU +2080276480,2080309247,KR +2080309248,2080325631,NZ +2080325632,2080342015,HK +2080342016,2080360447,JP +2080360448,2080362495,ID +2080362496,2080366591,AU +2080366592,2080368639,TW +2080368640,2080372735,JP +2080372736,2080374783,IN +2080374784,2080636927,KR +2080636928,2080702463,IN +2080702464,2080767999,KR +2080768000,2080776191,TW +2080776192,2080777215,HK +2080777216,2080777471,GB +2080777472,2080777727,FR +2080777728,2080777983,NL +2080777984,2080778239,GB +2080778240,2080780287,US +2080780288,2080780799,ID +2080780800,2080781311,MY +2080781312,2080781823,JP +2080781824,2080784383,SG +2080784384,2080800767,CN +2080800768,2080817151,PH +2080817152,2080825343,NZ +2080825344,2080829439,BD +2080829440,2080833535,LK +2080833536,2080899071,IN +2080899072,2081226751,TW +2081226752,2081292287,MY +2081292288,2081554431,CN +2081554432,2081619967,JP +2081619968,2081652735,AU +2081652736,2081685503,PH +2081685504,2081947647,CN +2081947648,2082209791,JP +2082209792,2082258943,KR +2082258944,2082308095,CN +2082308096,2082324479,TW +2082324480,2082340863,PK +2082340864,2082406399,IN +2082406400,2082471935,CN +2082471936,2083024895,JP +2083024896,2083053567,CN +2083053568,2083057663,TH +2083057664,2083058687,CN +2083058688,2083059711,IN +2083059712,2083061759,ID +2083061760,2083110911,JP +2083110912,2083127295,NP +2083127296,2083192831,CN +2083192832,2083258367,LK +2083258368,2083389439,JP +2083389440,2083454975,KR +2083454976,2083471359,CN +2083471360,2083487743,JP +2083487744,2083491583,AU +2083491584,2083491839,US +2083491840,2083492863,AU +2083492864,2083493375,US +2083493376,2083504127,AU +2083504128,2083520511,JP +2083520512,2083966719,KR +2083966720,2083966975,JP +2083966976,2084569087,KR +2084569088,2084732927,CN +2084732928,2084741119,SG +2084741120,2084743167,ID +2084743168,2084745215,IN +2084745216,2084749311,KR +2084749312,2084753407,JP +2084753408,2084757503,KR +2084757504,2084765695,JP +2084765696,2085617663,CN +2085617664,2085683199,KR +2085683200,2085748735,ID +2085748736,2085814271,MY +2085814272,2085847039,PH +2085847040,2086141951,JP +2086141952,2086666239,CN +2086666240,2087190527,JP +2087190528,2087452671,PH +2087452672,2087453695,AU +2087453696,2087454719,KH +2087454720,2087456767,CN +2087456768,2087457791,IN +2087457792,2087458815,HK +2087458816,2087460863,FJ +2087460864,2087462911,JP +2087462912,2087464959,CN +2087464960,2087467007,KH +2087467008,2087471103,JP +2087471104,2087472127,SG +2087472128,2087472639,HK +2087472640,2087473151,SG +2087473152,2087474687,HK +2087474688,2087475199,JP +2087475200,2087476223,HK +2087476224,2087477247,TW +2087477248,2087477855,AU +2087477856,2087477887,NZ +2087477888,2087478271,AU +2087478272,2087485439,HK +2087485440,2087501823,TW +2087501824,2087518207,JP +2087518208,2087519231,TH +2087519232,2087520255,SG +2087520256,2087522303,FM +2087522304,2087523327,KH +2087523328,2087524351,ID +2087524352,2087526399,TH +2087526400,2087534591,PK +2087534592,2087542783,AU +2087542784,2087544831,CN +2087544832,2087545855,BD +2087545856,2087546879,JP +2087546880,2087550975,TW +2087550976,2087649279,JP +2087649280,2087714815,KR +2087714816,2088239103,CN +2088239104,2088435711,TH +2088435712,2088632319,IN +2088632320,2089287679,CN +2089287680,2089549823,KR +2089549824,2089943039,JP +2089943040,2089959423,KR +2089959424,2090041343,JP +2090041344,2090074111,CN +2090074112,2090237951,AU +2090237952,2090239999,TW +2090240256,2090240511,CN +2090240512,2090240767,AU +2090240768,2090241023,NZ +2090241024,2090242047,MY +2090242048,2090246143,JP +2090246144,2090250239,NZ +2090250240,2090270719,JP +2090270720,2090401791,CN +2090401792,2090418175,ID +2090418176,2090434559,IN +2090434560,2090467327,KR +2090467328,2090565631,JP +2090565632,2090582015,TW +2090582016,2090590207,SG +2090590208,2090594303,NZ +2090594304,2090598399,IN +2090598400,2090663935,CN +2090663936,2090680319,VN +2090680320,2090696703,NZ +2090696704,2090729471,TH +2090729472,2090733567,VN +2090733568,2090736639,AU +2090736640,2090737663,IN +2090737664,2090745855,PH +2090745856,2090762239,MN +2090762240,2090778623,ID +2090778624,2090786815,HK +2090786816,2090795007,MY +2090795008,2090860543,JP +2090860544,2091384831,CN +2091384832,2091646975,AU +2091646976,2091909119,CN +2091909120,2092957695,AU +2092957696,2093088767,CN +2093088768,2093154303,KR +2093154304,2093187071,ID +2093187072,2093191167,MY +2093191168,2093195263,JP +2093195264,2093203455,KR +2093203456,2093211647,MV +2093211648,2093219839,KR +2093219840,2093285375,CN +2093285376,2093301759,NZ +2093301760,2093318143,SG +2093318144,2093342719,KR +2093342720,2093350911,MY +2093350912,2093383679,KR +2093383680,2093416447,NZ +2093416448,2093432831,KR +2093432832,2093445119,TW +2093445120,2093449215,AF +2093449216,2093481983,KR +2093481984,2094006271,CN +2094006272,2094530559,JP +2094530560,2094596095,KR +2094596096,2094628863,PH +2094628864,2094645247,HK +2094645248,2094653439,KR +2094653440,2094656767,MY +2094656768,2094657535,SG +2094657536,2094661631,MY +2094661632,2094759935,TW +2094759936,2094792703,JP +2094792704,2096152575,CN +2096152576,2096160767,PG +2096160768,2096234495,JP +2096234496,2096300031,CN +2096300032,2096332799,KR +2096332800,2096349183,AU +2096349184,2096365567,CN +2096365568,2096431103,HK +2096431104,2096496639,JP +2096496640,2096513023,AU +2096513024,2096529407,SG +2096529408,2096611327,JP +2096611328,2096627711,IN +2096627712,2096660479,CN +2096660480,2096664575,NZ +2096664576,2096668671,JP +2096668672,2096676863,KH +2096676864,2096693247,HK +2096693248,2096889855,CN +2096889856,2096902143,BE +2096902144,2096955391,AU +2096955392,2097020927,IN +2097020928,2097037311,CN +2097037312,2097053695,AU +2097053696,2097086463,KR +2097086464,2097479679,JP +2097479680,2097545215,PH +2097545216,2097610751,JP +2097610752,2097643519,AU +2097643520,2097676287,KR +2097676288,2098200575,JP +2098200576,2098593791,IN +2098593792,2098594303,SG +2098594304,2098724863,IN +2098724864,2098987007,TH +2098987008,2099183615,JP +2099183616,2099199999,MO +2099200000,2099216383,JP +2099216384,2099232767,KR +2099232768,2100297727,CN +2100297728,2100854783,JP +2100854784,2100887551,US +2100887552,2100953087,KR +2100953088,2100969471,VN +2100969472,2100985855,JP +2100985856,2101018623,CN +2101018624,2101084159,HK +2101084160,2101116927,KR +2101116928,2101149695,PH +2101149696,2101182463,KR +2101182464,2101231615,CN +2101231616,2101232639,GB +2101232640,2101233663,HK +2101233664,2101234687,GB +2101234688,2101235711,AU +2101239808,2101270527,IN +2101270528,2101272575,KR +2101272576,2101276671,TW +2101276672,2101280767,JP +2101280768,2101288959,AU +2101288960,2101293055,JP +2101293056,2101297151,AU +2101297152,2101313535,IN +2101313536,2101346303,AU +2101346304,2103640063,CN +2103640064,2103705599,IN +2103705600,2103967743,JP +2103967744,2105540607,CN +2105540608,2107637759,KR +2107637760,2108162047,ID +2108162048,2108218879,AU +2108218880,2108219391,NZ +2108219392,2108227583,AU +2108227584,2108293119,CN +2108293120,2108358655,JP +2108358656,2108424191,CN +2108424192,2108686335,JP +2108686336,2109734911,KR +2109734912,2110783487,JP +2110783488,2110799871,CN +2110799872,2110816255,KR +2110816256,2110832639,ID +2110832640,2110865407,KR +2110865408,2110881791,PK +2110881792,2110898175,AU +2110898176,2110914559,KR +2110914560,2111045631,CN +2111045632,2111078399,PH +2111078400,2111111167,VN +2111111168,2111143935,CN +2111143936,2111152127,ID +2111152128,2111160319,AU +2111160320,2111168511,AF +2111168512,2111176703,TH +2111176704,2111193087,VN +2111193088,2111201279,AU +2111201280,2111209471,CN +2111209472,2111217663,JP +2111217664,2111225855,LK +2111225856,2111242239,HK +2111242240,2111258623,CN +2111258624,2111275007,JP +2111275008,2111307775,HK +2111307776,2111832063,CN +2111832064,2112487423,TW +2112487424,2112618495,VN +2112618496,2112880639,NZ +2112880640,2113560063,KR +2113560064,2113560319,SG +2113560320,2113683455,KR +2113683456,2113684607,JP +2113684608,2113684671,TW +2113684672,2113685663,JP +2113685664,2113685695,SG +2113685696,2113687999,JP +2113688000,2113688031,AU +2113688032,2113688959,JP +2113688960,2113688991,SG +2113688992,2113691135,JP +2113691136,2113691391,SG +2113691392,2113693599,JP +2113693600,2113693615,HK +2113693616,2113693879,JP +2113693880,2113693887,AU +2113693888,2113693951,JP +2113693952,2113694207,HK +2113694208,2113695279,JP +2113695280,2113695287,SG +2113695288,2113716223,JP +2113716224,2113724927,SG +2113724928,2113725183,IN +2113725184,2113728511,SG +2113728512,2113732607,JP +2113732608,2113761279,AU +2113761280,2113765375,VN +2113765376,2113798143,HK +2113798144,2113811455,AU +2113811456,2113812479,GB +2113812480,2113813503,JP +2113813504,2113830911,AU +2113830912,2113863679,CN +2113863680,2113929215,AU +2113929216,2130706431,JP +2147483648,2147483903,NL +2147483904,2147484671,RO +2147484672,2147485695,TR +2147485696,2147487743,DK +2147487744,2147489791,NO +2147489792,2147491839,RU +2147491840,2147494911,DE +2147494912,2147495167,RO +2147495168,2147495423,DE +2147495424,2147496959,RO +2147496960,2147497215,ES +2147497216,2147497471,RO +2147497472,2147497727,PL +2147497728,2147498239,DE +2147498240,2147498495,RO +2147498496,2147500031,DE +2147500032,2147501055,NL +2147501056,2147501311,SK +2147501312,2147501567,NL +2147501568,2147501823,GL +2147501824,2147502079,US +2147502080,2147504127,DK +2147504128,2147508223,RU +2147508224,2147510271,DE +2147510272,2147510783,UA +2147510784,2147511039,RU +2147511040,2147512319,CY +2147512320,2147514879,DE +2147514880,2147516415,IT +2147516416,2147520511,RU +2147520512,2147524607,DE +2147524608,2147526655,RU +2147526656,2147528703,UA +2147528704,2147532799,CZ +2147532800,2147534847,DE +2147534848,2147549183,CY +2147549184,2147557375,US +2147557376,2147557631,TW +2147557632,2147557887,SG +2147557888,2147558143,DE +2147558144,2147558399,TH +2147558400,2147558655,KR +2147558656,2147558911,TW +2147558912,2147559167,SG +2147559168,2147559423,TH +2147559424,2147559679,SG +2147559680,2147559935,US +2147559936,2147560191,DE +2147560192,2147560447,RU +2147560448,2147560703,TH +2147560704,2147560959,TW +2147560960,2147562239,US +2147562240,2147562495,RU +2147562496,2147563263,US +2147563264,2147563519,RU +2147563520,2147564287,US +2147564288,2147564543,AE +2147564544,2147564799,US +2147564800,2147565055,SG +2147565056,2147565311,HK +2147565312,2147566079,TW +2147566080,2147569407,US +2147569408,2147569663,TH +2147569664,2147570431,US +2147570432,2147570687,JP +2147570688,2147571455,US +2147571456,2147571711,SG +2147571712,2147573503,US +2147573504,2147573759,SG +2147573760,2147575039,US +2147575040,2147575551,TW +2147575552,2147575807,SG +2147575808,2147576831,US +2147576832,2147577087,TH +2147577088,2147577599,ID +2147577600,2147579647,US +2147579648,2147579903,ID +2147579904,2147580927,US +2147580928,2147581183,ID +2147581184,2147581439,TH +2147581440,2147592703,US +2147592704,2147592959,HK +2147592960,2147600127,US +2147600128,2147600383,SG +2147600384,2147942399,US +2147942400,2148007935,DE +2148007936,2148220515,US +2148220516,2148220535,AU +2148220536,2148229151,US +2148229152,2148229183,CA +2148229184,2148532223,US +2148532224,2148597759,GB +2148597760,2148925439,US +2148925440,2148990975,JP +2148990976,2149253119,US +2149253120,2149384191,JP +2149384192,2150039551,US +2150039552,2150105087,NO +2150105088,2150203391,GB +2150203392,2150236159,AF +2150236160,2150301695,US +2150301696,2150367231,CA +2150367232,2150432767,US +2150432768,2150498303,IT +2150498304,2150957055,US +2150957056,2151022591,JP +2151022592,2151743487,US +2151743488,2151759871,BY +2151759872,2151768063,US +2151768064,2151770111,GB +2151770112,2151772159,BA +2151772160,2151776255,IT +2151776256,2151778303,AT +2151778304,2151780351,RU +2151780352,2151782399,DE +2151782400,2151784447,ES +2151784448,2151792639,IR +2151792640,2151794687,CH +2151794688,2151796735,IT +2151796736,2151800831,DE +2151800832,2151809023,PT +2151809024,2151940095,IT +2151940096,2152464383,RU +2152464384,2152529919,DK +2152529920,2152562687,NO +2152562688,2152595455,DK +2152595456,2152726527,FR +2152726528,2153119743,US +2153119744,2153185279,GB +2153185280,2153250815,SE +2153250816,2153381887,US +2153381888,2153382143,JP +2153382144,2153383679,US +2153383680,2153383935,HK +2153383936,2153384447,US +2153384448,2153385471,GB +2153385472,2153385599,AT +2153385600,2153385663,CZ +2153385664,2153385727,FI +2153385728,2153385791,PL +2153385792,2153385855,PT +2153385856,2153385919,TR +2153385920,2153385983,US +2153385984,2153387007,GB +2153387008,2153387263,CH +2153387264,2153387519,IS +2153387520,2153387775,IE +2153387776,2153388031,CH +2153388032,2153388287,ES +2153388288,2153388543,PL +2153388544,2153391615,US +2153391616,2153391871,HK +2153391872,2153394431,US +2153394432,2153394943,SG +2153394944,2153395455,US +2153395456,2153395711,VN +2153395712,2153396991,US +2153396992,2153397247,IL +2153397248,2153397503,IN +2153397504,2153397759,SA +2153397760,2153398015,QA +2153398016,2153398271,BH +2153398272,2153398783,JP +2153398784,2153399551,US +2153399552,2153399807,KR +2153399808,2153400319,HK +2153400320,2153401087,TW +2153401088,2153401599,MO +2153401600,2153402111,VN +2153402112,2153402367,PH +2153402368,2153406463,US +2153406464,2153407487,JP +2153407488,2153407743,HK +2153407744,2153407999,AE +2153408000,2153408511,BR +2153408512,2153408767,AU +2153408768,2153409023,PA +2153409024,2153409279,AR +2153409280,2153409535,CR +2153409536,2153409791,CO +2153409792,2153410047,MX +2153410048,2153410303,CA +2153410304,2153410559,TW +2153410560,2153410815,PA +2153410816,2153411071,AR +2153411072,2153411327,CR +2153411328,2153411583,CO +2153411584,2153411839,MX +2153411840,2153412095,SV +2153412096,2153412351,TW +2153412352,2153412607,UY +2153412608,2153413119,AU +2153413120,2153413631,BR +2153413632,2153578495,US +2153578496,2153644031,FR +2153644032,2153906175,US +2153906176,2153971711,GB +2153971712,2154037247,US +2154037248,2154102783,CA +2154102784,2154430463,US +2154430464,2154495999,SG +2154496000,2154561535,US +2154561536,2154627071,CN +2154627072,2155610111,US +2155610112,2155675647,UA +2155675648,2155806719,US +2155806720,2155808767,IT +2155810816,2155812863,FR +2155812864,2155814911,GB +2155814912,2155819007,NL +2155819008,2155821055,DE +2155821056,2155823103,IT +2155823104,2155825151,DE +2155825152,2155827199,AE +2155827200,2155831295,PL +2155831296,2155833343,RU +2155833344,2155833855,SE +2155833856,2155834623,NL +2155834624,2155834879,LU +2155834880,2155835391,NL +2155835392,2155839487,RO +2155839488,2155843583,FR +2155843584,2155845631,RU +2155845632,2155847679,DE +2155847680,2155849727,ES +2155849728,2155851775,TR +2155853824,2155855871,SE +2155855872,2155872255,SA +2155872256,2156003327,US +2156003328,2156134399,AT +2156134400,2156265471,US +2156265472,2156331007,KR +2156331008,2156593151,US +2156593152,2156658687,IL +2156658688,2156691455,IR +2156691456,2156697599,FR +2156697600,2156699647,GR +2156699648,2156703743,RU +2156703744,2156707839,BG +2156707840,2156709887,RU +2156709888,2156711935,ES +2156711936,2156713983,DE +2156713984,2156716031,NL +2156716032,2156718079,RO +2156718080,2156720127,IS +2156720128,2156724223,BY +2156724224,2156855295,CH +2156855296,2156920831,US +2156920832,2156986367,CA +2156986368,2159017983,US +2159017984,2159083519,DE +2159083520,2159149055,US +2159149056,2159280127,CH +2159280128,2159542271,US +2159542272,2159607807,AU +2159607808,2159673343,IN +2159673344,2159869951,US +2159869952,2159935487,CA +2159935488,2160525311,US +2160525312,2160533503,SG +2160533504,2160541695,NL +2160541696,2160590847,SG +2160590848,2160656383,US +2160656384,2160657407,BR +2160657408,2160658431,HN +2160658432,2160661503,BR +2160661504,2160662527,AR +2160662528,2160664575,BR +2160664576,2160666623,CL +2160666624,2160676863,BR +2160676864,2160677887,AR +2160677888,2160678911,BR +2160678912,2160679935,GF +2160679936,2160684031,BR +2160684032,2160685055,AR +2160685056,2160686079,DO +2160686080,2160687103,CL +2160687104,2160690175,BR +2160690176,2160691199,AR +2160691200,2160693247,BR +2160693248,2160694271,CR +2160694272,2160697343,BR +2160697344,2160698367,EC +2160698368,2160699391,BR +2160699392,2160700415,AR +2160700416,2160713727,BR +2160713728,2160714751,CL +2160714752,2160716799,BR +2160716800,2160717823,AR +2160717824,2160721919,BR +2160721920,2160852991,US +2160852992,2160885759,RU +2160885760,2160893951,AT +2160893952,2160902143,RU +2160902144,2160906239,NL +2160906240,2160908287,FR +2160908288,2160910335,PL +2160910336,2160914431,NL +2160914432,2160918527,SA +2160918528,2161508351,US +2161508352,2161573887,FI +2161573888,2162687999,US +2162688000,2162753535,GB +2162753536,2162819071,CA +2162819072,2162884607,SA +2162884608,2163212287,US +2163212288,2163277823,GB +2163277824,2163408895,US +2163408896,2163474431,GB +2163474432,2163605503,US +2163605504,2163638271,DE +2163638272,2163638527,US +2163638528,2163671039,DE +2163671040,2163867647,US +2163867648,2163933183,AU +2163933184,2164260863,US +2164260864,2164326399,CM +2164326400,2164981759,US +2164981760,2165112831,GB +2165112832,2165178367,DE +2165178368,2165309439,US +2165309440,2165374975,SE +2165374976,2165440511,US +2165440512,2165506047,NG +2165506048,2165571583,US +2165571584,2165637119,FR +2165637120,2165964799,US +2165964800,2166030335,DE +2166030336,2166095871,AT +2166095872,2166161407,CN +2166161408,2166292479,US +2166292480,2166358015,GB +2166358016,2166562559,US +2166562560,2166562815,FI +2166562816,2166571007,US +2166571008,2166575103,GB +2166575104,2166594559,US +2166594560,2166594815,PL +2166594816,2166729471,US +2166729472,2166729727,CA +2166729728,2167209983,US +2167209984,2167242751,DZ +2167242752,2167275519,BF +2167275520,2167930879,US +2167930880,2167996415,NG +2167996416,2168193023,US +2168193024,2168258559,JP +2168258560,2168651775,US +2168651776,2168717311,GB +2168717312,2168782847,US +2168782848,2168913919,DE +2168913920,2169372671,US +2169372672,2169438207,AU +2169438208,2170028031,US +2170028032,2170093567,FR +2170093568,2170159103,US +2170159104,2170224639,VE +2170224640,2170421247,US +2170421248,2170486783,AU +2170486784,2170552319,US +2170552320,2170617855,AU +2170617856,2170683391,CA +2170683392,2170814463,US +2170814464,2170879999,CA +2170880000,2170945535,US +2170945536,2171011071,FR +2171011072,2171076607,DE +2171076608,2171142143,FR +2171142144,2172256255,US +2172256256,2172272639,GH +2172272640,2172274687,RE +2172274688,2172275711,FR +2172275712,2172275967,RE +2172275968,2172276735,FR +2172276736,2172289023,RE +2172289024,2172321791,AO +2172321792,2172452863,US +2172452864,2172518399,NL +2172518400,2172583935,SG +2172583936,2172649471,AU +2172649472,2172715007,CA +2172715008,2172780543,CH +2172780544,2172911615,US +2172911616,2172977151,CH +2172977152,2173173759,US +2173173760,2173239295,JP +2173239296,2173435903,US +2173435904,2173501439,MW +2173501440,2173566975,US +2173566976,2173632511,DK +2173632512,2173698047,DE +2173698048,2175336447,US +2175336448,2175401983,GB +2175401984,2175598591,US +2175598592,2175664127,CA +2175664128,2175729663,US +2175729664,2175795199,FR +2175795200,2175860735,US +2175860736,2175926271,NO +2175926272,2175991807,SE +2175991808,2176057343,US +2176057344,2176122879,AU +2176122880,2176425983,FR +2176425984,2176434175,DE +2176434176,2176450559,FR +2176450560,2176516095,US +2176516096,2176581631,DE +2176581632,2176862975,US +2176862976,2176863231,SG +2176863232,2176868607,US +2176868608,2176868863,IT +2176868864,2176897023,US +2176897024,2176897535,AU +2176897536,2176974847,US +2176974848,2177105919,CH +2177105920,2177302527,US +2177302528,2177368063,FR +2177368064,2177695743,US +2177695744,2177703935,UG +2177703936,2177720319,ZA +2177720320,2177728511,NG +2177728512,2177744895,ZA +2177744896,2177761279,BW +2177761280,2177826815,DE +2177826816,2177892351,US +2177892352,2177957887,SA +2177957888,2178285567,US +2178285568,2178351103,DE +2178351104,2178416639,GB +2178416640,2178482175,US +2178482176,2178547711,DE +2178547712,2179398399,US +2179398400,2179398655,GB +2179398656,2179465215,US +2179465216,2179497983,LS +2179497984,2179530751,ZA +2179530752,2179596287,DE +2179596288,2179661823,GB +2179661824,2179989503,US +2179989504,2180186111,NO +2180186112,2180448255,US +2180448256,2180513791,DE +2180513792,2180579327,US +2180579328,2180644863,JP +2180644864,2180645417,US +2180645418,2180645418,ES +2180645419,2180645769,US +2180645770,2180645770,DE +2180645771,2180645991,US +2180645992,2180645992,ES +2180645993,2180646024,US +2180646025,2180646025,GB +2180646026,2180646616,US +2180646617,2180646617,DE +2180646618,2180646952,US +2180646953,2180646953,ES +2180646954,2180649005,US +2180649006,2180649006,ES +2180649007,2180907007,US +2180907008,2180972543,KR +2180972544,2181038079,US +2181038080,2181040127,GB +2181040128,2181042175,AZ +2181042176,2181044223,DE +2181044224,2181046271,AL +2181046272,2181054463,UA +2181054464,2181056511,AT +2181056512,2181058559,DE +2181058560,2181060607,GB +2181060608,2181062655,BA +2181062656,2181070847,FR +2181070848,2181087231,IT +2181087232,2181089279,FR +2181089280,2181091327,SE +2181091328,2181093375,IT +2181093376,2181095423,RU +2181095424,2181097471,GB +2181097472,2181099519,UA +2181099520,2181103615,SY +2181103616,2181824511,US +2181824512,2181890047,CA +2181890048,2182021119,US +2182021120,2182086655,CA +2182086656,2182610943,US +2182610944,2182676479,GB +2182676480,2182742015,IT +2182742016,2182807551,IN +2182807552,2182873087,US +2182873088,2182938623,SE +2182938624,2183135231,US +2183135232,2183200767,GB +2183200768,2183266303,US +2183266304,2183331839,JP +2183331840,2183416575,US +2183416576,2183416831,GB +2183416832,2183462911,US +2183462912,2183528447,NL +2183528448,2183856127,US +2183856128,2183888895,GR +2183888896,2183905279,GB +2183905280,2183921663,HU +2183921664,2184577023,US +2184577024,2184642559,JP +2184642560,2184708095,US +2184708096,2184773631,AU +2184773632,2184803839,US +2184803840,2184804351,GB +2184804352,2184904703,US +2184904704,2185035775,CH +2185035776,2185166847,US +2185166848,2185232383,CA +2185232384,2185363455,US +2185363456,2185428991,FR +2185428992,2185494527,NO +2185494528,2185560063,US +2185560064,2185625599,JP +2185625600,2185822207,US +2185822208,2185887743,DE +2185887744,2185953279,US +2185953280,2186018815,DE +2186018816,2186149887,US +2186149888,2186215423,NL +2186215424,2186280959,FR +2186280960,2186412031,US +2186412032,2186477567,CH +2186477568,2186543103,DE +2186543104,2186608639,FR +2186608640,2186739711,US +2186739712,2186805247,JP +2186805248,2186870783,GB +2186870784,2186936319,NL +2186936320,2187067391,US +2187067392,2187132927,CH +2187132928,2187182079,FR +2187182080,2187198463,HU +2187198464,2187263999,US +2187264000,2187329535,AU +2187329536,2187331583,US +2187331584,2187332607,CA +2187332608,2187333631,US +2187333632,2187334143,DE +2187334144,2187334655,US +2187334656,2187335167,CA +2187335168,2187460607,US +2187460608,2187526143,FR +2187526144,2187591679,US +2187591680,2187657215,SE +2187657216,2187722751,US +2187722752,2187788287,AU +2187788288,2187853823,US +2187853824,2187919359,BE +2187919360,2187984895,PH +2187984896,2188378111,US +2188378112,2188443647,NL +2188443648,2188509183,CA +2188509184,2188574719,US +2188574720,2188640255,NL +2188640256,2188705791,AU +2188706154,2188706154,SI +2188717312,2188717567,FR +2188718162,2188718162,SI +2188718338,2188718338,AT +2188718474,2188718474,AT +2188719360,2188719615,NL +2188719616,2188719743,FR +2188719744,2188719871,DE +2188724464,2188724464,NL +2188736512,2188737535,GB +2188738307,2188738307,GB +2188738560,2188746751,GB +2188749568,2188749823,FR +2188754688,2188754943,BE +2188763136,2188769471,IT +2188769472,2188769503,DE +2188769504,2188769599,IT +2188769600,2188769631,DE +2188769632,2188769663,IT +2188769664,2188770175,DE +2188770176,2188771327,IT +2188771328,2188901753,US +2188901754,2188901754,GB +2188901755,2188902399,US +2188902400,2188967935,FR +2188967936,2189099007,US +2189099008,2189164543,NZ +2189164544,2189230079,US +2189230080,2189295615,CH +2189295616,2189557759,US +2189557760,2189623295,AU +2189623296,2189754367,US +2189754368,2189819903,DE +2189819904,2189950975,US +2189950976,2190016511,IT +2190016512,2190082047,US +2190082048,2190737407,NL +2190737408,2190802943,GB +2190802944,2190868479,DE +2190868480,2191065087,US +2191065088,2191130623,JP +2191130624,2191196159,US +2191196160,2191261695,AU +2191261696,2191392767,US +2191392768,2191458303,JP +2191458304,2191523839,GB +2191523840,2191589375,US +2191589376,2191654911,NL +2191654912,2192769023,US +2192769024,2192834559,CA +2192834560,2192867327,DE +2192867328,2192883711,SY +2192883712,2192885759,PL +2192885760,2192887807,GB +2192887808,2192891903,UA +2192891904,2192900095,RS +2192900096,2193031167,US +2193031168,2193096703,DE +2193096704,2193162239,US +2193162240,2193178623,UA +2193178624,2193180671,GB +2193180672,2193182719,IR +2193182720,2193184767,PT +2193184768,2193186815,ES +2193186816,2193188863,PL +2193188864,2193189119,DE +2193189120,2193189247,CZ +2193189248,2193189375,DE +2193189376,2193189631,CZ +2193189632,2193189919,DE +2193189920,2193189935,GB +2193189936,2193189951,DE +2193189952,2193189983,IT +2193189984,2193190015,DE +2193190016,2193190079,CZ +2193190080,2193190911,DE +2193195008,2193199103,DK +2193199104,2193201151,GB +2193201152,2193202687,SE +2193202688,2193202943,FI +2193202944,2193203199,SE +2193203200,2193205247,GB +2193205248,2193205759,FR +2193205760,2193206015,US +2193206016,2193206271,FR +2193206272,2193207295,MX +2193207296,2193208831,CZ +2193208832,2193209343,US +2193209344,2193211391,FR +2193211392,2193223423,BG +2193223424,2193223679,GB +2193223680,2193226495,BG +2193226496,2193226751,GB +2193226752,2193227775,BG +2193227776,2193293311,IT +2193293312,2193358847,US +2193358848,2193424383,FI +2193424384,2193489919,US +2193489920,2193555455,FR +2193555456,2193620991,US +2193620992,2193686527,IT +2193686528,2193688575,FR +2193688576,2193692671,CZ +2193692672,2193694719,FR +2193694720,2193704959,RU +2193704960,2193707007,IT +2193707008,2193707495,GB +2193707496,2193707503,IT +2193707504,2193707655,GB +2193707656,2193707663,IT +2193707664,2193707839,GB +2193707840,2193707847,IT +2193707848,2193708375,GB +2193708376,2193708383,IT +2193708384,2193709199,GB +2193709200,2193709215,IT +2193709216,2193711103,GB +2193711104,2193713151,DE +2193713152,2193715199,ES +2193715200,2193717247,DE +2193717248,2193719295,AM +2193719296,2193752063,IQ +2193752064,2193817599,AU +2193817600,2193883135,NZ +2193883136,2194031007,US +2194031008,2194031023,JP +2194031024,2194033887,US +2194033888,2194033903,CN +2194033904,2194407423,US +2194407424,2194472959,BG +2194472960,2194538495,US +2194538496,2194604031,ES +2194604032,2194669567,US +2194669568,2194735103,IS +2194735104,2194800639,GB +2194800640,2194879034,US +2194879035,2194879035,BE +2194879036,2194880213,US +2194880214,2194880214,BE +2194880215,2194888509,US +2194888510,2194888510,IE +2194888511,2194891198,US +2194891199,2194891199,BE +2194891200,2195095551,US +2195095552,2195128319,DE +2195128320,2195193855,US +2195193856,2195324927,NZ +2195324928,2195455999,US +2195456000,2195521535,AU +2195521536,2195652607,US +2195652608,2195718143,CH +2195718144,2195783679,US +2195783680,2196045823,DK +2196045824,2196111359,SE +2196111360,2196439039,FI +2196439040,2197094399,SE +2197094400,2197159935,US +2197159936,2197225471,GB +2197225472,2197487615,US +2197487616,2197553151,IT +2197553152,2197749759,US +2197749760,2197751807,IQ +2197751808,2197753855,RU +2197753856,2197754879,GB +2197754880,2197755135,DK +2197755136,2197756159,GB +2197756160,2197756175,PT +2197756176,2197757951,GB +2197757952,2197766143,RU +2197766144,2197768191,PS +2197768192,2197770239,DE +2197770240,2197772287,RU +2197772288,2197774335,IQ +2197774336,2197776383,IT +2197776384,2197778431,DE +2197778432,2197780479,IT +2197780480,2197782527,DE +2197782528,2197786623,UA +2197786624,2197788671,IT +2197788672,2197790719,PL +2197790720,2197792767,SE +2197792768,2197794815,IT +2197794816,2197796863,SA +2197796864,2197798911,DE +2197798912,2197815295,IR +2197815296,2197816319,BO +2197816320,2197828607,BR +2197828608,2197829631,CL +2197829632,2197833727,BR +2197833728,2197834751,CR +2197834752,2197841919,BR +2197841920,2197842943,AR +2197842944,2197843967,CL +2197843968,2197847039,BR +2197847040,2197848063,MX +2197848064,2197849087,AR +2197849088,2197850111,BR +2197850112,2197851135,CO +2197851136,2197858303,BR +2197858304,2197858431,CO +2197858432,2197858447,CW +2197858448,2197859327,CO +2197859328,2197860351,CL +2197860352,2197865471,BR +2197865472,2197866495,ES +2197866496,2197869567,BR +2197869568,2197870591,UY +2197870592,2197874687,BR +2197874688,2197875711,AR +2197875712,2197876735,MX +2197876736,2197880831,BR +2197880832,2197946367,IT +2197946368,2202533887,US +2202533888,2202534911,AR +2202534912,2202540031,BR +2202540032,2202541055,PY +2202541056,2202542079,AR +2202542080,2202552319,BR +2202552320,2202553343,AR +2202553344,2202554367,TT +2202554368,2202562559,BR +2202562560,2202563583,CW +2202563584,2202567679,BR +2202567680,2202568703,AR +2202568704,2202569727,NL +2202569728,2202573823,BR +2202573824,2202574847,AR +2202574848,2202576895,BR +2202576896,2202577919,VE +2202577920,2202586111,BR +2202586112,2202587135,AR +2202587136,2202587231,HN +2202587232,2202587239,NL +2202587240,2202587647,HN +2202587648,2202587903,US +2202587904,2202588159,HN +2202588160,2202589183,MX +2202589184,2202591231,BR +2202591232,2202592255,PA +2202592256,2202593279,MX +2202593280,2202595327,CL +2202595328,2202596351,AR +2202596352,2202599423,BR +2202599424,2204172287,US +2204172288,2204237823,SE +2204237824,2204303359,US +2204303360,2204368895,DE +2204368896,2204369407,PA +2204369408,2204369663,US +2204369664,2204369919,PA +2204370944,2204376063,BR +2204376064,2204377087,CL +2204377088,2204378111,BR +2204378112,2204379135,TT +2204379136,2204385279,BR +2204385280,2204386303,AR +2204386304,2204391423,BR +2204391424,2204392447,AR +2204392448,2204394495,BR +2204394496,2204395519,AR +2204395520,2204396543,BR +2204396544,2204397567,AR +2204397568,2204404735,BR +2204404736,2204405759,SV +2204405760,2204409855,BR +2204409856,2204410879,TT +2204410880,2204414975,BR +2204414976,2204415999,AR +2204416000,2204417023,PY +2204417024,2204420095,BR +2204420096,2204421119,BO +2204421120,2204434431,BR +2204434432,2204499967,US +2204499968,2204565503,CH +2204565504,2204631039,US +2204631040,2204696575,CA +2204696576,2204893183,US +2204893184,2204894207,AR +2204894208,2204895231,PA +2204895232,2204897279,BR +2204897280,2204897447,HN +2204897448,2204897455,CA +2204897456,2204898095,HN +2204898096,2204898111,CR +2204898112,2204898303,HN +2204898304,2204899327,PA +2204899328,2204902399,BR +2204902400,2204903423,CR +2204903424,2204904447,AR +2204904448,2204910591,BR +2204910592,2204911615,CL +2204911616,2204913663,BR +2204913664,2204914687,AR +2204914688,2204929023,BR +2204929024,2204930047,AR +2204930048,2204936191,BR +2204936192,2204937215,CO +2204937216,2204942335,BR +2204942336,2204943359,PY +2204943360,2204946431,BR +2204946432,2204947455,CL +2204947456,2204952575,BR +2204952576,2204952767,HN +2204952768,2204952775,US +2204952776,2204953599,HN +2204954624,2204958719,BR +2204958720,2205089791,US +2205089792,2205155327,GB +2205155328,2205286399,JP +2205286400,2205351935,IT +2205351936,2205483007,SE +2205483008,2205515775,CH +2205515776,2205519871,AZ +2205519872,2205523967,DE +2205523968,2205526015,YE +2205526016,2205528063,GB +2205528064,2205530111,SE +2205530112,2205532159,GB +2205532160,2205534207,CZ +2205534208,2205536255,FR +2205536256,2205538303,CZ +2205538304,2205540351,RU +2205540352,2205548543,IQ +2205548544,2206269439,US +2206269440,2206334975,JP +2206334976,2206400511,AT +2206400512,2206466047,US +2206466048,2207121407,CA +2207121408,2207449087,US +2207449088,2207514623,JP +2207514624,2207647487,CA +2207647488,2207647743,US +2207647744,2207648511,CA +2207648512,2207649791,US +2207649792,2207653631,CA +2207653632,2207653887,US +2207653888,2207659775,CA +2207659776,2207660031,US +2207660032,2207661567,CA +2207661568,2207661823,US +2207661824,2207666175,CA +2207666176,2207667199,US +2207667200,2207678975,CA +2207678976,2207679487,US +2207679488,2207682559,CA +2207682560,2207686655,US +2207686656,2207694335,CA +2207694336,2207694591,US +2207694592,2207711231,CA +2207711232,2207776767,US +2207776768,2207842303,CH +2207842304,2207846399,US +2207846400,2207848447,NL +2207848448,2207852543,US +2207852544,2207853055,RS +2207853056,2207854079,US +2207854080,2207855615,SG +2207855616,2207907839,US +2207907840,2207973375,IT +2207973376,2208038911,NL +2208038912,2208235519,US +2208235520,2208301055,DE +2208301056,2208366591,FI +2208366592,2208368639,BR +2208368640,2208369663,HK +2208369664,2208379903,BR +2208379904,2208380927,HN +2208380928,2208381951,CL +2208381952,2208387071,BR +2208387072,2208388095,HN +2208388096,2208389119,SX +2208389120,2208390143,AR +2208390144,2208392191,BR +2208392192,2208393215,PE +2208393216,2208404479,BR +2208404480,2208405503,BZ +2208405504,2208406527,AR +2208406528,2208413695,BR +2208413696,2208414719,AR +2208414720,2208417791,BR +2208417792,2208418815,CL +2208418816,2208425983,BR +2208425984,2208428031,AR +2208428032,2208429055,BR +2208429056,2208430079,MX +2208430080,2208431103,BR +2208431104,2208432127,PY +2208432128,2208563199,CA +2208563200,2208694271,DK +2208694272,2208759807,LU +2208759808,2208890879,US +2208890880,2208956415,DE +2208956416,2209021951,AU +2209021952,2209087487,US +2209087488,2209153023,AU +2209153024,2209218559,DE +2209218560,2209284095,NL +2209284096,2209349632,IT +2209349633,2209415167,US +2209415168,2209480703,FI +2209480704,2209546239,MX +2209546240,2209611775,US +2209611776,2209677311,NL +2209677312,2209742847,AU +2209742848,2209939455,US +2209939456,2210004991,AU +2210004992,2210136063,US +2210136064,2210201599,DE +2210201600,2210594815,US +2210594816,2210660351,CA +2210660352,2210661375,AR +2210661376,2210662399,BR +2210662400,2210664447,EC +2210664448,2210667519,BR +2210667520,2210668543,CL +2210668544,2210669567,CR +2210669568,2210670591,AR +2210670592,2210673663,BR +2210673664,2210674687,HN +2210674688,2210675711,BR +2210675712,2210676735,EC +2210676736,2210678783,BR +2210678784,2210679807,AR +2210679808,2210680831,BR +2210680832,2210681855,AR +2210681856,2210689023,BR +2210689024,2210690047,EC +2210690048,2210692095,BR +2210692096,2210693119,MX +2210693120,2210696191,BR +2210696192,2210697215,MX +2210697216,2210705407,BR +2210705408,2210706431,CL +2210706432,2210707455,AR +2210707456,2210708479,BR +2210708480,2210709503,AR +2210709504,2210710527,PY +2210710528,2210713599,BR +2210713600,2210715647,CO +2210715648,2210722815,BR +2210722816,2210725887,MX +2210725888,2211053567,US +2211053568,2211119103,CA +2211119104,2211184639,NZ +2211184640,2211250175,US +2211250176,2211315711,SE +2211315712,2211381247,JP +2211381248,2211446783,FI +2211446784,2211643391,US +2211643392,2211708927,NL +2211708928,2211774463,US +2211774464,2211839999,JP +2211840000,2212036607,US +2212036608,2212102143,AU +2212102144,2212233215,US +2212233216,2212298751,DE +2212298752,2212299775,AR +2212299776,2212300799,DO +2212300800,2212301823,HN +2212301824,2212302847,BR +2212302848,2212303871,AR +2212303872,2212304895,BR +2212304896,2212305919,PA +2212305920,2212306943,TT +2212306944,2212307967,CL +2212307968,2212308991,BR +2212308992,2212310015,CO +2212310016,2212315135,BR +2212315136,2212316159,AR +2212316160,2212327423,BR +2212327424,2212328447,VE +2212328448,2212335615,BR +2212335616,2212336639,CW +2212336640,2212337663,BR +2212337664,2212338687,PE +2212338688,2212340735,BR +2212340736,2212341759,CL +2212341760,2212364287,BR +2212364288,2212495359,US +2212495360,2212560895,NL +2212560896,2212691967,US +2212691968,2212757503,GB +2212757504,2212759551,FI +2212759552,2212760575,US +2212760576,2212761599,FI +2212761600,2212762623,GB +2212762624,2212764927,US +2212764928,2212765183,GB +2212765184,2212765695,US +2212765696,2212766719,DE +2212766720,2212767743,GB +2212767744,2212773887,US +2212773888,2212774911,IN +2212774912,2212775423,US +2212775424,2212775935,IN +2212775936,2212779519,US +2212779520,2212780031,FI +2212780032,2212788223,US +2212788224,2212796415,FI +2212796416,2212798463,NL +2212798464,2212804095,FI +2212804096,2212804351,NL +2212804352,2212806655,FI +2212806656,2212808703,US +2212808704,2212810751,FI +2212810752,2212814847,DE +2212814848,2212816383,FI +2212816384,2212816639,SG +2212816640,2212816895,IN +2212816896,2212817151,KR +2212817152,2212823039,FI +2212823040,2212954111,US +2212954112,2213019647,GB +2213019648,2213085183,CA +2213085184,2213150719,US +2213150720,2213216255,DE +2213216256,2213281791,CA +2213281792,2213347327,AU +2213347328,2213412863,NL +2213412864,2213675007,US +2213675008,2213740543,AU +2213740544,2213806079,US +2213806080,2213937151,AU +2213937152,2214002687,DE +2214002688,2214068223,US +2214068224,2214133759,JP +2214133760,2214264831,US +2214264832,2214330367,GB +2214330368,2214398975,US +2214398976,2214398983,CN +2214398984,2214399047,US +2214399048,2214399055,IE +2214399056,2214399071,CN +2214399072,2214399135,SG +2214399136,2214399215,US +2214399216,2214399223,CN +2214399224,2214399295,US +2214399296,2214399303,SG +2214399304,2214399331,US +2214399332,2214399339,HK +2214399340,2214399343,IE +2214399344,2214399887,US +2214399888,2214399903,IE +2214399904,2214404607,US +2214404608,2214404735,SG +2214404736,2214405055,US +2214405056,2214405119,HK +2214405120,2214405375,US +2214405376,2214405631,IE +2214405632,2214405735,US +2214405736,2214405743,IE +2214405744,2214405751,SG +2214405752,2214428671,US +2214428672,2214428927,IN +2214428928,2214429375,US +2214429376,2214429439,NL +2214429440,2214432767,US +2214432768,2214432895,HK +2214432896,2214433023,IE +2214433024,2214433919,US +2214433920,2214434175,CA +2214434176,2214434303,AU +2214434304,2214436863,US +2214436864,2214436991,IN +2214436992,2214438463,US +2214438464,2214438527,IE +2214438528,2214439039,US +2214439040,2214439103,CA +2214439104,2214439167,AU +2214439168,2214441759,US +2214441760,2214441791,IE +2214441792,2214441823,NL +2214441824,2214441983,US +2214441984,2214442047,IN +2214442048,2214453247,US +2214453248,2214453503,NL +2214453504,2214454015,US +2214454016,2214454079,NL +2214454080,2214454271,US +2214454272,2214454335,NL +2214454336,2214455295,US +2214455296,2214456031,NL +2214456032,2214456063,IE +2214456064,2214460415,US +2214460416,2214461439,NL +2214461440,2214526975,FR +2214528000,2214528333,AR +2214528334,2214528334,NL +2214528335,2214529023,AR +2214529024,2214530047,BR +2214530048,2214531071,AR +2214531072,2214537215,BR +2214537216,2214538239,BZ +2214538240,2214542335,BR +2214542336,2214543359,AR +2214543360,2214553599,BR +2214553600,2214554623,VE +2214554624,2214561791,BR +2214561792,2214562815,PE +2214562816,2214573055,BR +2214573056,2214574079,AR +2214574080,2214576127,BR +2214576128,2214577151,PE +2214577152,2214588415,BR +2214589440,2214590463,BR +2214590464,2214591487,AR +2214591488,2214592511,BR +2214592512,2214795597,US +2214795598,2214795599,DE +2214795600,2216231118,US +2216231119,2216231119,DE +2216231120,2218786815,US +2218786816,2219769855,IL +2219769856,2220613631,US +2220613632,2220621823,GU +2220621824,2224160767,US +2224160768,2224226303,GB +2224226304,2224242687,US +2224242688,2224259071,SG +2224259072,2224357375,US +2224357376,2224422911,FR +2224422912,2224488447,NO +2224488448,2224619519,US +2224619520,2224685055,GB +2224685056,2224750591,IN +2224750592,2224816127,FI +2224816128,2224881663,CA +2224881664,2224947199,PE +2224947200,2225340415,US +2225340416,2225733631,FR +2225733632,2225799167,US +2225799168,2225864703,FI +2225864704,2226126847,US +2226126848,2226192383,DE +2226192384,2226323455,US +2226323456,2226388991,JP +2226388992,2226454527,DE +2226454528,2226520063,NZ +2226520064,2226585599,JP +2226585600,2226651135,US +2226651136,2226716671,PE +2226716672,2226782207,GB +2226782208,2226847743,ZA +2226847744,2226913279,DE +2226913280,2227109887,US +2227109888,2227175423,PE +2227175424,2227372031,US +2227372032,2227437567,DE +2227437568,2227503103,SE +2227503104,2227634175,US +2227634176,2227699711,DE +2227699712,2227830783,US +2227830784,2229141503,CA +2229141504,2229207039,JP +2229207040,2229338111,US +2229338112,2229403647,CA +2229403648,2229469183,US +2229469184,2229534719,FR +2229534720,2229600255,US +2229600256,2229665791,NL +2229665792,2229796863,DE +2229796864,2229862399,CN +2229862400,2229927935,US +2229927936,2229993471,AU +2229993472,2230583295,US +2230583296,2230603775,GB +2230603776,2230607871,US +2230607872,2230637567,GB +2230637568,2230638591,SG +2230638592,2230648831,GB +2230648832,2230649695,US +2230649696,2230649727,IE +2230649728,2230653063,US +2230653064,2230653135,BR +2230653136,2230655559,US +2230655560,2230655575,IE +2230655576,2230655583,US +2230655584,2230655711,IE +2230655712,2230655775,US +2230655776,2230655791,IE +2230655792,2230656351,US +2230656352,2230656423,AT +2230656424,2230656431,US +2230656432,2230656495,FI +2230656496,2230656983,US +2230656984,2230656991,IE +2230656992,2230657007,US +2230657008,2230657023,IE +2230657024,2230657215,US +2230657216,2230657231,FI +2230657232,2230657239,US +2230657240,2230657343,FI +2230657344,2230657559,US +2230657560,2230657591,IE +2230657592,2230657599,US +2230657600,2230657727,IE +2230657728,2230657775,US +2230657776,2230657815,FI +2230657816,2230657879,US +2230657880,2230658047,AT +2230658048,2230658143,US +2230658144,2230658159,AT +2230658160,2230658175,IE +2230658176,2230658815,US +2230658816,2230658935,AT +2230658936,2230659199,US +2230659200,2230659327,IE +2230659328,2230659383,US +2230659384,2230659391,SG +2230659392,2230659423,US +2230659424,2230659583,SG +2230659584,2230659783,US +2230659784,2230659791,SG +2230659792,2230659823,US +2230659824,2230659919,SG +2230659920,2230659935,US +2230659936,2230660095,HK +2230660096,2230660215,US +2230660216,2230660223,NL +2230660224,2230660255,US +2230660256,2230660287,NL +2230660288,2230660863,US +2230660864,2230660903,NL +2230660904,2230661135,US +2230661136,2230661151,FI +2230661152,2230661167,AT +2230661168,2230661607,US +2230661608,2230661631,NL +2230661632,2230661695,US +2230661696,2230661759,NL +2230661760,2230661935,US +2230661936,2230662023,IE +2230662024,2230662903,US +2230662904,2230663079,AT +2230663080,2230663167,NL +2230663168,2230663263,US +2230663264,2230663311,IE +2230663312,2230663423,US +2230663424,2230663431,SG +2230663432,2230663607,FI +2230663608,2230663679,SG +2230663680,2230663695,HK +2230663696,2230663743,US +2230663744,2230663751,NL +2230663752,2230664103,US +2230664104,2230664191,IE +2230664192,2230664647,US +2230664648,2230664703,AT +2230664704,2230664727,US +2230664728,2230664735,IE +2230664736,2230664743,US +2230664744,2230664871,IE +2230664872,2230665087,US +2230665088,2230665183,AT +2230665184,2230665295,US +2230665296,2230665359,SG +2230665360,2230665679,US +2230665680,2230665775,SG +2230665776,2230665927,US +2230665928,2230666023,SG +2230666024,2230666031,US +2230666032,2230666063,SG +2230666064,2230666383,US +2230666384,2230666447,NL +2230666448,2230666479,US +2230666480,2230666495,NL +2230666496,2230666559,SG +2230666560,2230666647,NL +2230666648,2230666719,US +2230666720,2230666815,IN +2230666816,2230667527,US +2230667528,2230667583,AT +2230667584,2230667647,JP +2230667648,2230667695,AT +2230667696,2230667871,US +2230667872,2230668047,FI +2230668048,2230668495,US +2230668496,2230668543,FI +2230668544,2230668559,US +2230668560,2230668735,IE +2230668736,2230668799,US +2230668800,2230668927,FI +2230668928,2230669271,US +2230669272,2230669311,NL +2230669312,2230672407,US +2230672408,2230672415,IE +2230672416,2230672431,US +2230672432,2230672575,IE +2230672576,2230681599,US +2230681600,2230682247,HK +2230682248,2230682343,JP +2230682344,2230682351,US +2230682352,2230682543,JP +2230682544,2230685695,US +2230685696,2230685727,AT +2230685728,2230685855,JP +2230685856,2230685871,HK +2230685872,2230688255,US +2230688256,2230688767,SG +2230688768,2230688991,BR +2230688992,2230689039,US +2230689040,2230689071,BR +2230689072,2230689199,US +2230689200,2230689247,BR +2230689248,2230689959,US +2230689960,2230689991,SG +2230689992,2230689999,US +2230690000,2230690007,AU +2230690008,2230690463,US +2230690464,2230690639,AU +2230690640,2230690679,US +2230690680,2230690823,AU +2230690824,2230690831,US +2230690832,2230690863,AU +2230690864,2230690959,US +2230690960,2230690975,AU +2230690976,2230691007,SG +2230691008,2230691039,MY +2230691040,2230691071,AU +2230691072,2230691199,SG +2230691200,2230691215,AU +2230691216,2230693887,US +2230693888,2230693919,NL +2230693920,2230693951,US +2230693952,2230693967,IE +2230693968,2230694063,US +2230694064,2230694095,NL +2230694096,2230698903,US +2230698904,2230698999,FI +2230699000,2230699007,US +2230699008,2230699055,FI +2230699056,2230702079,US +2230702080,2230707199,IE +2230707200,2230707711,NL +2230707712,2230710303,US +2230710304,2230710439,NL +2230710440,2230710511,AT +2230710512,2230710559,US +2230710560,2230710671,JP +2230710672,2230710719,BR +2230710720,2230710735,US +2230710736,2230710751,BR +2230710752,2230710783,KR +2230710784,2230710799,US +2230710800,2230710831,BR +2230710832,2230710847,US +2230710848,2230710879,BR +2230710880,2230710895,US +2230710896,2230711071,IN +2230711072,2230711167,US +2230711168,2230711727,IN +2230711728,2230711903,US +2230711904,2230711935,IE +2230711936,2230712007,US +2230712008,2230712183,BR +2230712184,2230712191,US +2230712192,2230712239,IE +2230712240,2230713135,US +2230713136,2230713311,AT +2230713312,2230713487,NL +2230713488,2230713503,US +2230713504,2230713535,NL +2230713536,2230713647,CA +2230713648,2230713663,US +2230713664,2230713695,HK +2230713696,2230713887,US +2230713888,2230713919,IE +2230713920,2230713935,US +2230713936,2230713983,SG +2230713984,2230714047,KR +2230714048,2230714079,BR +2230714080,2230714119,MY +2230714120,2230714127,US +2230714128,2230714255,MY +2230714256,2230714287,BR +2230714288,2230714303,US +2230714304,2230714311,CL +2230714312,2230714367,BR +2230714368,2230779903,CA +2230779904,2230910975,MX +2230910976,2231042047,US +2231042048,2231099391,PE +2231099392,2231107583,BO +2231107584,2231173119,DE +2231173120,2231238655,US +2231238656,2231304191,MX +2231304192,2231305215,PE +2231305216,2231307263,AR +2231307264,2231309311,BR +2231309312,2231310335,CO +2231310336,2231321599,BR +2231321600,2231322623,CL +2231322624,2231332863,BR +2231332864,2231333887,AR +2231333888,2231335935,BR +2231335936,2231336959,MX +2231337984,2231338639,HN +2231338640,2231338647,US +2231338648,2231338695,HN +2231338696,2231338703,US +2231338704,2231339007,HN +2231339008,2231346175,BR +2231346176,2231347199,PY +2231347200,2231349765,BR +2231349766,2231349766,US +2231349767,2231355391,BR +2231355392,2231356415,AR +2231356416,2231357439,BR +2231357440,2231358463,SV +2231358464,2231361535,BR +2231361536,2231362559,AR +2231362560,2231364607,BR +2231364608,2231365631,CL +2231365632,2231369727,BR +2231369728,2239889407,JP +2239889408,2239890431,US +2239890432,2248146943,JP +2248146944,2248148991,IT +2248148992,2248151039,ES +2248151040,2248153087,GB +2248153088,2248155135,DE +2248155136,2248163327,AL +2248163328,2248163839,US +2248163840,2248165375,GB +2248165376,2248167423,US +2248167424,2248169471,IE +2248169472,2248171519,NL +2248171520,2248177663,RU +2248177664,2248179711,DE +2248179712,2248212479,OM +2248212480,2248409087,DE +2248409088,2248605695,US +2248605696,2248671231,AU +2248671232,2249261055,US +2249261056,2249326591,BY +2249326592,2249392127,AU +2249392128,2249424895,DE +2249424896,2249426943,RU +2249426944,2249428991,SK +2249428992,2249433087,RU +2249433088,2249435135,GB +2249435136,2249437183,IT +2249437184,2249441279,NL +2249441280,2249443327,FR +2249443328,2249445375,TR +2249445376,2249449471,AZ +2249449472,2249457663,GE +2249457664,2249523199,US +2249523200,2249588735,CH +2249588736,2249654271,CA +2249654272,2249724671,US +2249724672,2249724927,CA +2249724928,2249785343,US +2249785344,2249850879,SE +2249850880,2249916415,US +2249916416,2249981951,NL +2249981952,2250047487,DE +2250047488,2250113023,US +2250113024,2250178559,DE +2250178560,2250244095,CA +2250244096,2250282239,US +2250282240,2250282495,GB +2250282496,2250375167,US +2250375168,2250440703,DE +2250440704,2250506239,YE +2250506240,2250571775,GB +2250571776,2250637311,FI +2250637312,2250833919,US +2250833920,2250899455,CA +2250899456,2250956799,US +2250956800,2250957055,HK +2250957056,2250957311,SG +2250957312,2250957567,AU +2250957568,2250957823,JP +2250957824,2251227135,US +2251227136,2251292671,NO +2251292672,2251685887,US +2251685888,2251751423,BE +2251751424,2251948031,US +2251948032,2252013567,BE +2252013568,2252079103,FR +2252079104,2252210175,DE +2252210176,2253062143,US +2253062144,2253127679,KR +2253127680,2253193215,DE +2253193216,2253455359,US +2253455360,2253520895,DE +2253520896,2253586431,US +2253586432,2253651967,GB +2253651968,2253848575,US +2253848576,2253914111,CA +2253914112,2254045183,US +2254045184,2254077951,GE +2254077952,2254079999,BA +2254080000,2254082047,FR +2254082048,2254082559,NO +2254082560,2254082815,NL +2254082816,2254083071,NO +2254083072,2254083327,US +2254083328,2254083583,DK +2254083584,2254084095,NO +2254084096,2254094335,RU +2254094336,2254098431,GB +2254098432,2254100479,RU +2254100480,2254102527,CH +2254102528,2254110719,IT +2254110720,2254774271,DE +2254774272,2254798847,CH +2254798848,2255421439,DE +2255421440,2255683583,US +2255683584,2255749119,AU +2255749120,2255814655,US +2255814656,2255880191,CA +2255880192,2255945727,US +2255945728,2255990783,DE +2255990784,2256003071,FR +2256003072,2256006655,DE +2256006656,2256006911,FR +2256006912,2256011263,DE +2256011264,2256535551,US +2256535552,2256543743,GB +2256543744,2256551935,US +2256551936,2256601087,GB +2256601088,2256666623,US +2256666624,2256732159,DE +2256732160,2256815103,US +2256815104,2256815359,AU +2256815360,2257190911,US +2257190912,2257256447,SE +2257256448,2257453055,US +2257453056,2257518591,GB +2257518592,2257584127,NL +2257584128,2257649663,AU +2257649664,2257717503,NL +2257717504,2257717759,GB +2257717760,2257776639,NL +2257776640,2257776895,IN +2257776896,2257780735,NL +2257780736,2257846271,DE +2257846272,2257911807,AU +2257911808,2257977343,US +2257977344,2258042879,CA +2258042880,2258108415,GB +2258108416,2258173951,US +2258173952,2258239487,CA +2258239488,2258305023,US +2258305024,2258370559,DE +2258370560,2258436095,US +2258436096,2258567167,FR +2258567168,2258568191,AU +2258568192,2258568447,HK +2258568448,2258569215,AU +2258569216,2258570239,US +2258570240,2258571647,AU +2258571648,2258571711,US +2258571712,2258571719,AU +2258571720,2258571735,US +2258571736,2258571743,AU +2258571744,2258571751,US +2258571752,2258571763,AU +2258571764,2258571767,US +2258571768,2258579463,AU +2258579464,2258579467,US +2258579468,2258579967,AU +2258579968,2258580031,US +2258580032,2258582783,AU +2258582784,2258582791,GB +2258582792,2258583551,AU +2258583552,2258589695,GB +2258589696,2258589696,KR +2258589697,2258590975,GB +2258590976,2258591487,AU +2258591488,2258591743,GB +2258591744,2258591935,AU +2258591936,2258591967,HK +2258591968,2258591999,AU +2258592000,2258592255,HK +2258592256,2258592271,AU +2258592272,2258592279,JP +2258592280,2258592287,AU +2258592288,2258592291,JP +2258592292,2258592439,AU +2258592440,2258592447,JP +2258592448,2258592767,AU +2258592768,2258593023,HK +2258593024,2258593087,TW +2258593088,2258593279,AU +2258593280,2258593535,HK +2258593536,2258593983,AU +2258593984,2258593991,NZ +2258593992,2258594047,AU +2258594048,2258594111,HK +2258594112,2258594143,AU +2258594144,2258594175,HK +2258594176,2258594303,AU +2258594304,2258594607,HK +2258594608,2258594623,AU +2258594624,2258594751,HK +2258594752,2258595071,AU +2258595072,2258595087,TW +2258595088,2258595103,AU +2258595104,2258595167,TW +2258595168,2258595231,AU +2258595232,2258595263,TW +2258595264,2258595295,AU +2258595296,2258595327,TW +2258595328,2258595383,AU +2258595384,2258595391,KR +2258595392,2258595887,AU +2258595888,2258595895,NZ +2258595896,2258595967,AU +2258595968,2258595983,TW +2258595984,2258596095,AU +2258596096,2258597071,HK +2258597072,2258597079,TW +2258597080,2258597215,HK +2258597216,2258597263,AU +2258597264,2258597303,HK +2258597304,2258597311,AU +2258597312,2258597367,HK +2258597368,2258597371,AU +2258597372,2258597535,HK +2258597536,2258597567,AU +2258597568,2258597583,HK +2258597584,2258597599,AU +2258597600,2258597631,HK +2258597632,2258597903,AU +2258597904,2258597919,JP +2258597920,2258597927,AU +2258597928,2258597935,JP +2258597936,2258598079,AU +2258598080,2258598087,TW +2258598088,2258598095,AU +2258598096,2258598111,TW +2258598112,2258598143,JP +2258598144,2258598495,AU +2258598496,2258598511,NZ +2258598512,2258598519,AU +2258598520,2258598527,JP +2258598528,2258598623,AU +2258598624,2258598655,TW +2258598656,2258599183,AU +2258599184,2258599187,JP +2258599188,2258599675,AU +2258599676,2258599679,JP +2258599680,2258599935,AU +2258599936,2258599971,HK +2258599972,2258599975,AU +2258599976,2258600447,HK +2258600448,2258600515,AU +2258600516,2258600519,IN +2258600520,2258600523,AU +2258600524,2258600527,IN +2258600528,2258600959,AU +2258600960,2258601087,SG +2258601088,2258601167,AU +2258601168,2258601175,NZ +2258601176,2258601215,AU +2258601216,2258601343,TW +2258601344,2258601471,AU +2258601472,2258601983,JP +2258601984,2258602239,AU +2258602240,2258602495,HK +2258602496,2258602751,AU +2258602752,2258603071,HK +2258603072,2258603087,AU +2258603088,2258603103,HK +2258603104,2258603135,AU +2258603136,2258603139,HK +2258603140,2258603199,AU +2258603200,2258603207,HK +2258603208,2258603775,AU +2258603776,2258603839,HK +2258603840,2258603903,AU +2258603904,2258603943,HK +2258603944,2258603951,AU +2258603952,2258603967,HK +2258603968,2258604031,AU +2258604032,2258604543,HK +2258604544,2258604671,AU +2258604672,2258604735,SG +2258604736,2258604831,AU +2258604832,2258605039,HK +2258605040,2258605047,AU +2258605048,2258605311,HK +2258605312,2258605439,SG +2258605440,2258605567,HK +2258605568,2258606079,AU +2258606080,2258606367,HK +2258606368,2258606415,AU +2258606416,2258606423,HK +2258606424,2258606463,AU +2258606464,2258606471,HK +2258606472,2258606487,AU +2258606488,2258606535,HK +2258606536,2258606963,AU +2258606964,2258606967,NZ +2258606968,2258607091,AU +2258607092,2258607095,NZ +2258607096,2258607351,AU +2258607352,2258607359,NZ +2258607360,2258607615,AU +2258607616,2258607879,HK +2258607880,2258607903,AU +2258607904,2258607999,HK +2258608000,2258608063,AU +2258608064,2258608127,HK +2258608128,2258608183,AU +2258608184,2258608187,TW +2258608188,2258608255,AU +2258608256,2258608259,JP +2258608260,2258608279,AU +2258608280,2258608283,JP +2258608284,2258608383,AU +2258608384,2258608639,HK +2258608640,2258608655,AU +2258608656,2258608663,JP +2258608664,2258608671,AU +2258608672,2258608687,JP +2258608688,2258610179,AU +2258610180,2258610183,IN +2258610184,2258610239,AU +2258610240,2258610303,IN +2258610304,2258610687,AU +2258610688,2258610943,TW +2258610944,2258611071,AU +2258611072,2258611103,JP +2258611104,2258611119,AU +2258611120,2258611167,JP +2258611168,2258611215,AU +2258611216,2258611223,NZ +2258611224,2258611711,AU +2258611712,2258611967,NZ +2258611968,2258612223,HK +2258612224,2258614783,AU +2258614784,2258614815,IN +2258614816,2258615039,AU +2258615040,2258615055,IN +2258615056,2258620415,AU +2258620416,2258621951,HK +2258621952,2258622207,NZ +2258622208,2258622719,AU +2258622720,2258623231,NZ +2258623232,2258623487,KR +2258623488,2258632703,AU +2258632704,2258698239,JP +2258698240,2259222527,US +2259222528,2259288063,DE +2259288064,2259304447,US +2259304448,2259304959,NL +2259304960,2259304967,US +2259304968,2259304975,NL +2259304976,2259304991,US +2259304992,2259305407,NL +2259305408,2259305439,US +2259305440,2259306239,NL +2259306240,2259306367,US +2259306368,2259306431,NL +2259306432,2259308543,US +2259308544,2259312639,IE +2259312640,2259314687,NL +2259314688,2259321855,US +2259321856,2259322111,SG +2259322112,2259322879,US +2259322880,2259324927,HK +2259324928,2259331071,US +2259331072,2259333119,IE +2259333120,2259337215,US +2259337216,2259339263,HK +2259339264,2259340287,US +2259340288,2259340799,NL +2259340800,2259341311,IE +2259341312,2259342335,US +2259342336,2259342847,NL +2259342848,2259343359,IE +2259343360,2259343615,HK +2259343616,2259343871,BR +2259343872,2259352575,US +2259352576,2259353343,IE +2259353344,2259353599,US +2259353600,2259419135,DE +2259419136,2259615743,US +2259615744,2259681279,CN +2259681280,2259746815,DE +2259746816,2259812351,US +2259812352,2259877887,AU +2259877888,2259943423,US +2259943424,2260008959,JP +2260008960,2260140031,US +2260140032,2260205567,GB +2260205568,2260271103,BE +2260271104,2260467711,US +2260467712,2260533247,NL +2260533248,2260598783,US +2260598784,2260664319,CA +2260664320,2260723711,GB +2260723712,2260723967,IL +2260723968,2260729343,GB +2260729344,2260729599,IL +2260729600,2260729855,GB +2260729856,2260991999,US +2260992000,2261057535,TH +2261057536,2261188607,US +2261188608,2261254143,CA +2261254144,2261385215,US +2261385216,2261450751,PR +2261450752,2261516287,NL +2261516288,2261647359,US +2261647360,2261712895,FR +2261712896,2261778431,US +2261778432,2261843967,TW +2261843968,2261975039,US +2261975040,2262040575,AU +2262040576,2262106111,FR +2262106112,2262171647,GB +2262171648,2262237183,FR +2262237184,2262414335,US +2262414336,2262415359,IN +2262415360,2262499327,US +2262499328,2262630399,GB +2262630400,2262724071,NL +2262724072,2262724073,IE +2262724074,2262761471,NL +2262761472,2262892543,US +2262892544,2262958079,GB +2262958080,2263023615,IE +2263023616,2263089151,FR +2263089152,2263613439,US +2263613440,2263678975,TH +2263678976,2263744511,JP +2263744512,2263810047,US +2263810048,2263875583,SA +2263875584,2264203263,US +2264203264,2264268799,DE +2264268800,2264334335,FR +2264334336,2264399871,DE +2264399872,2264465407,US +2264465408,2264530943,UA +2264530944,2264858623,US +2264858624,2264891391,HU +2264891392,2264899583,RU +2264899584,2264905727,IT +2264905728,2264907775,ES +2264907776,2264908799,DE +2264908800,2264909311,IR +2264909312,2264909567,DE +2264909568,2264909823,TR +2264909824,2264911871,IR +2264911872,2264912383,DE +2264912384,2264912895,ES +2264912896,2264913663,DE +2264913664,2264913919,ES +2264913920,2264920319,DE +2264920320,2264920831,ES +2264920832,2264921087,GB +2264921088,2264921343,DE +2264921344,2264921855,IR +2264921856,2264922111,DE +2264922112,2264922623,IR +2264922624,2264922879,ES +2264922880,2264924159,DE +2264924160,2264989695,CA +2264989696,2265605887,US +2265605888,2265606143,GB +2265606144,2265710847,US +2265710848,2265776127,CA +2265776128,2266169343,US +2266169344,2266234879,CA +2266234880,2266431487,US +2266431488,2266497023,CA +2266497024,2266694655,US +2266694656,2266694911,SG +2266694912,2270442495,US +2270442496,2270443519,NL +2270443520,2270455807,US +2270455808,2270456831,CA +2270456832,2270463999,US +2270464000,2270465023,CA +2270465024,2270467071,US +2270467072,2270468095,NL +2270468096,2270474239,US +2270474240,2270476287,CA +2270476288,2270476543,US +2270476544,2270478335,CA +2270478336,2270482687,US +2270482688,2270482943,GB +2270482944,2270483967,US +2270483968,2270484223,GB +2270484224,2270488575,US +2270488576,2270490623,MO +2270490624,2270494719,IN +2270494720,2276786175,US +2276786176,2276851711,CA +2276851712,2277769215,US +2277769216,2277834751,GB +2277834752,2281007103,US +2281007104,2281007359,IN +2281007360,2281023487,US +2281023488,2281023743,IN +2281023744,2281024767,US +2281024768,2281025023,IN +2281025024,2281701375,US +2281701376,2281705471,CH +2281705472,2281709567,US +2281709568,2281725951,CN +2281725952,2281729023,US +2281729024,2281729535,CN +2281729536,2281733119,US +2281733120,2281733375,CN +2281733376,2281750527,US +2281750528,2281758719,CN +2281758720,2281760511,US +2281760512,2281760767,CH +2281760768,2282226175,US +2282226176,2282226243,CN +2282226244,2282226245,US +2282226246,2282226247,CN +2282226248,2282226248,AU +2282226249,2282226431,CN +2282226432,2282234111,US +2282234112,2282234367,GB +2282234368,2283151359,US +2283151360,2283159551,IN +2283159552,2291142655,US +2291142656,2291144191,CN +2291144192,2291144703,NL +2291144704,2291144959,ES +2291144960,2291145215,IE +2291145216,2291145471,FR +2291145472,2291145727,IE +2291145728,2291146751,NL +2291146752,2291147775,CN +2291147776,2291148799,CH +2291148800,2291150847,NL +2291150848,2291154943,US +2291154944,2291171327,GB +2291171328,2291204095,NL +2291204096,2291269631,PR +2291269632,2291281919,US +2291281920,2291286015,JP +2291286016,2291400703,US +2291400704,2291466239,GB +2291466240,2291728383,US +2291728384,2291859455,AU +2291859456,2291924991,SE +2291924992,2291990527,GB +2291990528,2292056063,US +2292056064,2292121599,NO +2292121600,2292187135,CA +2292187136,2292383743,US +2292383744,2292449279,SE +2292449280,2292514815,NO +2292514816,2292776959,US +2292776960,2292809727,LV +2292809728,2292842495,RU +2292842496,2292908031,GB +2292908032,2292973567,US +2292973568,2293039103,DE +2293080576,2293080831,BE +2293085184,2293085439,BE +2293104640,2293825535,US +2293825536,2293891071,IN +2293891072,2293956607,AU +2293956608,2294022143,JP +2294022144,2294677503,US +2294677504,2294743039,JP +2294743040,2294808575,DE +2294808576,2294874111,US +2294874112,2294939647,IE +2294939648,2295201791,US +2295201792,2295267327,IE +2295267328,2296446975,US +2296446976,2296512511,SE +2296512512,2296774655,US +2296774656,2296840191,DE +2296840192,2296905727,NL +2296905728,2297036799,IN +2297036800,2297167871,US +2297167872,2297233407,AU +2297233408,2297237503,US +2297237504,2297237759,BE +2297237760,2297298943,US +2297298944,2297364479,CH +2297364480,2297626623,US +2297626624,2297661437,DE +2297661438,2297661438,NL +2297661439,2297692159,DE +2297692160,2299461631,US +2299461632,2299527167,CA +2299527168,2299592703,US +2299592704,2299658239,NL +2299658240,2300641279,US +2300641280,2300706815,FI +2300706816,2300772351,CH +2300837888,2301296639,US +2301296640,2301362175,IE +2301362176,2301427711,GB +2301427712,2301558783,US +2301558784,2301624319,NO +2301624320,2301755391,US +2301755392,2301820927,GB +2301820928,2302083071,US +2302083072,2302214143,NL +2302214144,2302279679,US +2302279680,2302345215,SE +2302345216,2302346239,IN +2302346240,2302347263,BD +2302347264,2302348287,IN +2302348288,2302349311,ID +2302349312,2302351359,HK +2302351360,2302357503,VN +2302357504,2302358527,BD +2302358528,2302360319,IN +2302360320,2302360575,CN +2302360576,2302363647,IN +2302363648,2302364671,AU +2302364672,2302365695,IN +2302365696,2302365951,MY +2302365952,2302366719,ID +2302366720,2302367743,IN +2302367744,2302368767,CN +2302368768,2302370815,IN +2302370816,2302371839,HK +2302371840,2302372863,VN +2302372864,2302373887,MY +2302373888,2302374911,TH +2302374912,2302375935,VN +2302375936,2302376959,AF +2302376960,2302377983,ID +2302377984,2302382079,IN +2302382080,2302383103,PK +2302383104,2302384127,IN +2302384128,2302385151,BD +2302385152,2302386175,IN +2302386176,2302387199,ID +2302387200,2302388223,IN +2302388224,2302389247,AU +2302389248,2302391295,IN +2302391296,2302392319,BD +2302392320,2302393343,HK +2302393344,2302394367,AU +2302394368,2302395391,PK +2302395392,2302396415,AU +2302396416,2302398463,IN +2302398464,2302399487,HK +2302399488,2302400511,IN +2302400512,2302404607,PK +2302404608,2302405631,JP +2302405632,2302406655,HK +2302406656,2302408703,IN +2302408704,2302410751,AU +2302410752,2302541823,SE +2302541824,2302607359,CH +2302607360,2302625761,SC +2302625762,2302625762,CA +2302625763,2302640127,SC +2302640128,2302672895,UG +2302672896,2302738431,MW +2302738432,2302935039,US +2302935040,2303000575,KR +2303000576,2303262719,US +2303262720,2303328255,GB +2303328256,2303330303,PL +2303330304,2303330591,FR +2303330592,2303330623,GB +2303330624,2303330687,FR +2303330688,2303330815,DE +2303330816,2303331263,FR +2303331264,2303331327,FI +2303331328,2303331903,FR +2303331904,2303331967,ES +2303331968,2303332799,FR +2303332800,2303332831,GB +2303332832,2303333303,FR +2303333304,2303333311,ES +2303333312,2303333871,FR +2303333872,2303333887,CZ +2303333888,2303333951,FR +2303333952,2303334015,PL +2303334016,2303334143,IT +2303334144,2303334239,FR +2303334240,2303334271,LT +2303334272,2303334399,ES +2303334400,2303336543,FR +2303336544,2303336575,PL +2303336576,2303336943,FR +2303336944,2303336959,PL +2303336960,2303338111,FR +2303338112,2303338239,DE +2303338240,2303338247,FR +2303338248,2303338255,ES +2303338256,2303340639,FR +2303340640,2303340671,FI +2303340672,2303340799,IT +2303340800,2303341283,FR +2303341284,2303341287,FI +2303341288,2303341951,FR +2303341952,2303341967,ES +2303341968,2303342031,FR +2303342032,2303342039,ES +2303342040,2303342279,FR +2303342280,2303342287,ES +2303342288,2303342459,FR +2303342460,2303342463,DE +2303342464,2303342975,FR +2303342976,2303343007,CZ +2303343008,2303343039,FR +2303343040,2303343103,PT +2303343104,2303343183,FR +2303343184,2303343199,PL +2303343200,2303343231,LT +2303343232,2303343359,BE +2303343360,2303343435,FR +2303343436,2303343439,GB +2303343440,2303343487,FR +2303343488,2303343615,IE +2303343616,2303343675,FR +2303343676,2303343679,PL +2303343680,2303343827,FR +2303343828,2303343831,DE +2303343832,2303344127,FR +2303344128,2303344191,CZ +2303344192,2303344471,FR +2303344472,2303344479,IE +2303344480,2303344511,PL +2303344512,2303344559,FR +2303344560,2303344575,PL +2303344576,2303348863,FR +2303348864,2303348991,GB +2303348992,2303349119,FR +2303349120,2303349247,ES +2303349248,2303349383,FR +2303349384,2303349391,NL +2303349392,2303349431,FR +2303349432,2303349439,ES +2303349440,2303350079,FR +2303350080,2303350143,CZ +2303350144,2303350399,FR +2303350400,2303350527,IT +2303350528,2303350783,FR +2303350784,2303351039,ES +2303351040,2303351055,FR +2303351056,2303351071,GB +2303351072,2303351775,FR +2303351776,2303351807,CZ +2303351808,2303352523,FR +2303352524,2303352524,GB +2303352525,2303353183,FR +2303353184,2303353215,IT +2303353216,2303353343,GB +2303353344,2303353783,FR +2303353784,2303353787,GB +2303353788,2303354555,FR +2303354556,2303354559,FI +2303354560,2303355147,FR +2303355148,2303355151,DE +2303355152,2303356863,FR +2303356864,2303356927,DE +2303356928,2303361535,FR +2303361536,2303361599,GB +2303361600,2303362063,FR +2303362064,2303362079,DE +2303362080,2303362303,FR +2303362304,2303362559,DE +2303362560,2303363871,FR +2303363872,2303363903,PL +2303363904,2303365279,FR +2303365280,2303365295,GB +2303365296,2303365679,FR +2303365680,2303365695,NL +2303365696,2303367923,FR +2303367924,2303367927,DE +2303367928,2303368579,FR +2303368580,2303368583,ES +2303368584,2303368799,FR +2303368800,2303368831,PT +2303368832,2303373431,FR +2303373432,2303373439,ES +2303373440,2303374399,FR +2303374400,2303374463,NL +2303374464,2303374591,DE +2303374592,2303374745,FR +2303374746,2303374746,ES +2303374747,2303376783,FR +2303376784,2303376799,PT +2303376800,2303376807,FR +2303376808,2303376815,ES +2303376816,2303377311,FR +2303377312,2303377343,GB +2303377344,2303381631,FR +2303381632,2303381663,ES +2303381664,2303382879,FR +2303382880,2303382895,ES +2303382896,2303383151,FR +2303383152,2303383167,LT +2303383168,2303383503,FR +2303383504,2303383519,GB +2303383520,2303383807,FR +2303383808,2303383935,ES +2303383936,2303384959,FR +2303384960,2303384991,GB +2303384992,2303385087,FR +2303385088,2303385103,FI +2303385104,2303386879,FR +2303386880,2303387007,BE +2303387008,2303387535,FR +2303387536,2303387551,PT +2303387552,2303387567,FI +2303387568,2303387591,FR +2303387592,2303387599,ES +2303387600,2303387763,FR +2303387764,2303387767,PL +2303387768,2303387839,FR +2303387840,2303387871,LT +2303387872,2303388351,FR +2303388352,2303388415,CZ +2303388416,2303388543,ES +2303388544,2303390655,FR +2303390656,2303390719,PL +2303390720,2303391007,FR +2303391008,2303391039,IE +2303391040,2303391103,FR +2303391104,2303391231,GB +2303391232,2303392575,FR +2303392576,2303392607,PT +2303392608,2303392615,ES +2303392616,2303392695,FR +2303392696,2303392703,ES +2303392704,2303392843,FR +2303392844,2303392847,FI +2303392848,2303392895,FR +2303392896,2303392899,DE +2303392900,2303393247,FR +2303393248,2303393263,GB +2303393264,2303393535,FR +2303393536,2303393567,PT +2303393568,2303393791,FR +2303393792,2303459327,US +2303459328,2303524863,AU +2303524864,2303852543,US +2303852544,2303918079,CA +2303918080,2304507903,US +2304507904,2304573439,AU +2304573440,2304638975,NO +2304638976,2304704511,CA +2304704512,2304770047,US +2304770048,2304835583,FI +2304835584,2304901119,IN +2304901120,2304966655,CZ +2304966656,2305097727,US +2305097728,2305163263,ES +2305163264,2305359871,US +2305359872,2305425407,GB +2305425408,2305556479,US +2305556480,2305622015,GB +2305622016,2305687551,AU +2305687552,2305753087,US +2305753088,2305818623,AU +2305818624,2306015231,US +2306015232,2306080767,MW +2306080768,2306113535,US +2306113536,2306121727,SG +2306121728,2306125823,HK +2306125824,2306129919,US +2306129920,2306138111,NL +2306138112,2306146303,IE +2306146304,2306179071,US +2306179072,2306211839,NL +2306211840,2306342911,US +2306342912,2306408447,NL +2306408448,2306473983,FR +2306473984,2306539519,CA +2306539520,2306932735,US +2306932736,2306998271,FR +2306998272,2307129343,US +2307129344,2307194879,SG +2307194880,2307195903,BR +2307195904,2307196927,IT +2307196928,2307197951,FI +2307197952,2307198975,DE +2307198976,2307199999,SE +2307200000,2307260415,NO +2307260416,2307278847,US +2307278848,2307280895,AU +2307280896,2307358719,US +2307358720,2307391487,IE +2307391488,2307522559,US +2307522560,2307588095,CH +2307588096,2308112383,US +2308112384,2308177919,AU +2308177920,2308243455,US +2308243456,2308308991,CA +2308308992,2308505599,US +2308505600,2308571135,JP +2308571136,2308636671,AU +2308636672,2308702207,US +2308702208,2308767743,CH +2308767744,2308833279,AU +2308833280,2308898815,ZA +2308898816,2309160959,US +2309160960,2309226495,FI +2309226496,2309357567,US +2309357568,2309423103,AU +2309423104,2309685247,US +2309685248,2309750783,ZA +2309750784,2309816319,AU +2309816320,2309881855,US +2309881856,2309947391,NL +2309947392,2309948223,US +2309948224,2309948231,CN +2309948232,2309980159,US +2309980160,2310012927,CA +2310012928,2310668287,US +2310668288,2310733823,CA +2310733824,2310864895,US +2310864896,2310930431,HK +2310930432,2310995967,US +2310995968,2311061503,IE +2311061504,2311127039,US +2311127040,2311192575,DE +2311192576,2311258111,FR +2311258112,2311315455,GB +2311315456,2311319551,MY +2311319552,2311323647,GB +2311323648,2311389183,MW +2311389184,2311847935,US +2311847936,2311913471,IT +2311913472,2311979007,GB +2311979008,2312044543,US +2312044544,2312110079,CA +2312110080,2312175615,AT +2312175616,2312437759,US +2312437760,2312503295,GB +2312503296,2312634367,ZA +2312634368,2312699903,US +2312699904,2312765439,NO +2312765440,2312830975,GB +2312830976,2312896511,AU +2312896512,2312962047,US +2312962048,2312968191,GB +2312968192,2312970239,NO +2312970240,2312978431,DE +2312978432,2312994815,FR +2312994816,2313093119,GB +2313093120,2313158655,IE +2313158656,2313224191,NL +2313224192,2313289727,US +2313289728,2313355263,DE +2313355264,2314731519,US +2314731520,2314797055,DE +2314797056,2314862591,US +2314862592,2314993663,DE +2314993664,2315059199,US +2315059200,2315124735,GB +2315124736,2315190271,US +2315190272,2315255807,BJ +2315255808,2315257855,BR +2315257856,2315259135,AR +2315259136,2315259903,CL +2315259904,2315266047,BR +2315266048,2315267071,CO +2315267072,2315270143,BR +2315270144,2315271167,AR +2315271168,2315278335,BR +2315278336,2315279359,CO +2315279360,2315282431,BR +2315282432,2315283455,AR +2315283456,2315285503,BR +2315285504,2315286527,PA +2315286528,2315287551,CL +2315287552,2315294719,BR +2315294720,2315296255,AR +2315296256,2315296767,MX +2315296768,2315302911,BR +2315302912,2315303935,AR +2315303936,2315314175,BR +2315314176,2315315199,HN +2315315200,2315317247,BR +2315317248,2315318271,HN +2315318272,2315321343,BR +2315321344,2315452415,US +2315452416,2315517951,GB +2315517952,2315583487,ES +2315583488,2315649023,US +2315649024,2315714559,SE +2315714560,2315780095,AU +2315780096,2315911167,US +2315911168,2316042239,CA +2316042240,2316173311,US +2316173312,2316238847,SE +2316238848,2316500991,US +2316500992,2316566527,HK +2316566528,2316613887,US +2316613888,2316614143,GB +2316614144,2316632063,US +2316632064,2316697599,FR +2316697600,2316763135,AT +2316763136,2316828671,US +2316828672,2316959743,AU +2316959744,2317221887,US +2317221888,2317287423,JP +2317287424,2317357567,US +2317357568,2317357823,AU +2317357824,2317393919,US +2317393920,2317398015,NO +2317398016,2317398271,GB +2317398272,2317413375,US +2317413376,2317413631,ID +2317413632,2317414655,US +2317414656,2317414911,AU +2317414912,2317484031,US +2317484032,2317487359,CA +2317487360,2317487615,US +2317487616,2317549567,CA +2317549568,2317615103,US +2317615104,2317619199,BR +2317619200,2317620223,AR +2317620224,2317621247,BR +2317621248,2317622271,DO +2317622272,2317628415,BR +2317628416,2317629439,AR +2317629440,2317631487,BR +2317631488,2317632511,CO +2317632512,2317634559,BR +2317634560,2317635583,BO +2317635584,2317638655,BR +2317638656,2317638863,HN +2317638864,2317638871,BR +2317638872,2317639679,HN +2317639680,2317640703,AR +2317640704,2317649919,BR +2317649920,2317649991,HN +2317649992,2317649999,US +2317650000,2317650943,HN +2317650944,2317651967,BR +2317651968,2317652991,PE +2317652992,2317654015,AR +2317654016,2317655039,MX +2317655040,2317671423,BR +2317671424,2317672447,AR +2317672448,2317675519,BR +2317675520,2317676543,AR +2317676544,2317679615,BR +2317679616,2317680639,CL +2317680640,2317811711,GB +2317811712,2317877247,US +2317877248,2317942783,GB +2317942784,2318008319,IT +2318008320,2318139391,US +2318139392,2318204927,AU +2318204928,2318401535,US +2318401536,2318467071,BE +2318467072,2318598143,US +2318598144,2318663679,CA +2318663680,2319122431,US +2319122432,2319123455,AR +2319123456,2319123999,HN +2319124000,2319124007,US +2319124008,2319124479,HN +2319124480,2319125503,VE +2319125504,2319126527,UY +2319126528,2319127551,CR +2319127552,2319128575,BR +2319128576,2319129599,TT +2319129600,2319138815,BR +2319138816,2319139839,PE +2319139840,2319150079,BR +2319150080,2319151103,EC +2319151104,2319152127,BR +2319152128,2319153151,VE +2319153152,2319156223,BR +2319156224,2319157247,CR +2319157248,2319158271,BR +2319158272,2319159295,AR +2319159296,2319160319,BR +2319160320,2319161343,PA +2319162368,2319164415,BR +2319164416,2319165439,PY +2319165440,2319167487,AR +2319167488,2319168511,HN +2319169536,2319174655,BR +2319174656,2319175583,HN +2319175584,2319175591,BR +2319175592,2319175647,HN +2319175648,2319175663,BR +2319175664,2319175679,HN +2319175680,2319184895,BR +2319184896,2319185919,AR +2319185920,2319187967,BR +2319187968,2319319039,US +2319319040,2319384575,NO +2319384576,2319450111,FR +2319450112,2319581183,US +2319581184,2319646719,IT +2319646720,2319728639,US +2319728640,2319741951,DE +2319741952,2319742975,GB +2319742976,2319743999,NL +2319744000,2319745023,DE +2319745024,2319761407,GB +2319761408,2319764479,US +2319764480,2319765503,NL +2319765504,2319843327,US +2319843328,2319908863,IT +2319908864,2319974399,AU +2319974400,2320039935,US +2320039936,2320105471,CA +2320105472,2320171007,US +2320171008,2320236543,SG +2320236544,2320302079,US +2320302080,2320367615,AU +2320367616,2320433151,US +2320433152,2320564223,AU +2320564224,2320629759,CH +2320629760,2320695295,CA +2320695296,2321219583,US +2321219584,2321227775,JP +2321227776,2321231871,SG +2321231872,2321235967,IE +2321235968,2321416191,US +2321416192,2321417215,CO +2321417216,2321419263,BR +2321419264,2321420287,AR +2321420288,2321430527,BR +2321430528,2321431551,CR +2321431552,2321446911,BR +2321446912,2321447263,HN +2321447264,2321447279,NL +2321447280,2321447647,HN +2321447648,2321447679,NL +2321447680,2321447727,HN +2321447728,2321447743,NL +2321447744,2321447935,HN +2321447936,2321452031,BR +2321452032,2321453055,MX +2321453056,2321453359,HN +2321453360,2321453367,NL +2321453368,2321453487,HN +2321453488,2321453495,CA +2321453496,2321454079,HN +2321454080,2321467136,BR +2321467137,2321467137,US +2321467138,2321471487,BR +2321471488,2321472039,HN +2321472040,2321472047,CA +2321472048,2321472391,HN +2321472392,2321472399,UY +2321472400,2321472511,HN +2321472512,2321477631,BR +2321477632,2321478655,TT +2321478656,2321479679,SV +2321479680,2321480703,GY +2321480704,2321481727,GT +2321481728,2321547263,US +2321547264,2321612799,FR +2321612800,2321627135,BR +2321627136,2321628159,CO +2321628160,2321633279,BR +2321633280,2321634303,CO +2321634304,2321648639,BR +2321648640,2321649663,SV +2321649664,2321652735,BR +2321652736,2321653223,BZ +2321653224,2321653231,ES +2321653232,2321653759,BZ +2321653760,2321654783,NI +2321654784,2321655807,BR +2321655808,2321656831,MX +2321656832,2321657855,BR +2321657856,2321658879,AR +2321658880,2321663999,BR +2321664000,2321665023,AR +2321665024,2321673215,BR +2321673216,2321674239,AR +2321674240,2321676287,BR +2321676288,2321677311,DO +2321677312,2321678335,BR +2321678336,2321743871,US +2321743872,2321744895,SV +2321744896,2321745919,AR +2321745920,2321753087,BR +2321753088,2321753359,HN +2321753360,2321753375,NL +2321753376,2321753599,HN +2321753600,2321753607,NL +2321753608,2321753727,HN +2321753728,2321753735,NL +2321753736,2321753927,HN +2321753928,2321753935,NL +2321753936,2321754111,HN +2321754112,2321755135,BR +2321755136,2321756159,UY +2321756160,2321769471,BR +2321769472,2321770495,PY +2321770496,2321774719,BR +2321774720,2321774847,PE +2321774848,2321774975,AR +2321774976,2321775103,VE +2321775104,2321775231,PE +2321775232,2321775359,BR +2321775360,2321775487,EC +2321775488,2321775615,AR +2321775616,2321776639,VE +2321776640,2321777663,AR +2321777664,2321778687,BR +2321778688,2321779711,PA +2321779712,2321780735,BR +2321780736,2321780991,PA +2321780992,2321781247,BR +2321781248,2321781503,PA +2321781504,2321781759,BR +2321781760,2321782783,MX +2321782784,2321787903,BR +2321787904,2321788927,AR +2321788928,2321789951,CL +2321789952,2321790975,SV +2321790976,2321791999,AR +2321792000,2321797119,BR +2321797120,2321797375,NO +2321797376,2321797631,GR +2321797632,2321797887,SE +2321797888,2321798143,NL +2321798144,2321799167,CW +2321799168,2321800191,BZ +2321800192,2321801215,AR +2321801216,2321802239,CL +2321803264,2321804287,BR +2321804288,2321805311,DO +2321805312,2321809407,BR +2321809408,2321874943,ES +2321874944,2321940479,JP +2321940480,2322006015,FR +2322006016,2322010383,SE +2322010384,2322010399,US +2322010400,2322071551,SE +2322071552,2322129919,GB +2322129920,2322130175,IN +2322130176,2322130431,GB +2322130432,2322130687,SG +2322130688,2322137087,GB +2322137088,2322202623,US +2322202624,2322268159,SE +2322268160,2322333695,JP +2322333696,2322368511,US +2322368512,2322368767,MY +2322368768,2322923519,US +2322923520,2322924543,BR +2322924544,2322925567,NI +2322925568,2322929663,AR +2322929664,2322933759,BR +2322933760,2322934783,CO +2322934784,2322935807,VE +2322935808,2322936831,AR +2322936832,2322940927,BR +2322940928,2322941951,CL +2322941952,2322942975,BR +2322942976,2322943999,AR +2322944000,2322945023,BR +2322945024,2322946047,CO +2322946048,2322948095,BR +2322948096,2322949119,HN +2322949120,2322951167,BR +2322951168,2322952191,CO +2322952192,2322953215,AR +2322953216,2322956287,BR +2322956288,2322957311,AR +2322957312,2322958335,BR +2322958336,2322959359,CO +2322959360,2322960383,GT +2322960384,2322961407,BR +2322961408,2322962431,CL +2322962432,2322963455,BR +2322963456,2322964479,AR +2322964480,2322965503,PE +2322965504,2322974719,BR +2322974720,2322975743,AR +2322975744,2322980863,BR +2322989056,2322991103,BR +2322991104,2322992127,CL +2322992128,2322998271,BR +2322998272,2322999295,AR +2322999296,2323001343,BR +2323001344,2323002367,AR +2323002368,2323009535,BR +2323009536,2323010559,CR +2323010560,2323015679,BR +2323015680,2323016703,GT +2323016704,2323017727,BR +2323017728,2323018751,AR +2323018752,2323020799,BR +2323020800,2323021823,PA +2323021824,2323025919,BR +2323025920,2323026943,AR +2323026944,2323028991,BR +2323028992,2323030015,CR +2323030016,2323042303,BR +2323042304,2323045375,AR +2323045376,2323054591,BR +2323054592,2323120127,CA +2323120128,2323185663,US +2323185664,2323186687,BR +2323186688,2323187711,CO +2323187712,2323188735,BR +2323188736,2323189759,CO +2323189760,2323205119,BR +2323205120,2323209215,AR +2323209216,2323210239,BR +2323210240,2323211263,CL +2323211264,2323213311,AR +2323213312,2323214335,CL +2323214336,2323215359,AR +2323215360,2323217407,BR +2323217408,2323218431,AR +2323218432,2323221503,BR +2323221504,2323222527,CR +2323222528,2323225599,BR +2323225600,2323226623,CO +2323226624,2323227647,AR +2323227648,2323228671,BR +2323228672,2323229695,CL +2323229696,2323230719,BR +2323230720,2323231743,CL +2323231744,2323236863,BR +2323236864,2323237887,CO +2323237888,2323244031,BR +2323244032,2323245055,AR +2323245056,2323247103,BR +2323247104,2323248127,AR +2323248128,2323252223,BR +2323252224,2323253247,VE +2323253248,2323257343,BR +2323257344,2323258367,CR +2323258368,2323275775,BR +2323275776,2323276799,MX +2323276800,2323278847,BR +2323278848,2323279871,EC +2323279872,2323283967,BR +2323283968,2323284991,AR +2323284992,2323288063,BR +2323288064,2323289087,MX +2323289088,2323291135,BR +2323291136,2323292159,AR +2323292160,2323293183,PY +2323293184,2323298303,BR +2323298304,2323299327,PY +2323299328,2323300351,AR +2323300352,2323301375,HN +2323301376,2323302399,BR +2323302400,2323303423,CO +2323303424,2323308543,BR +2323308544,2323309567,CL +2323309568,2323310591,AR +2323310592,2323313663,BR +2323313664,2323314687,CR +2323314688,2323315711,BR +2323315712,2323316735,MX +2323316736,2323382271,US +2323382272,2323447807,NO +2323447808,2323644431,US +2323644432,2323644495,CA +2323644496,2323644511,US +2323644512,2323644543,CA +2323644544,2323644575,US +2323644576,2323644607,CA +2323644608,2323644631,US +2323644632,2323644639,CA +2323644640,2323644719,US +2323644720,2323644799,CA +2323644800,2323644895,US +2323644896,2323644927,CA +2323644928,2323645071,US +2323645072,2323645087,CA +2323645088,2323645119,US +2323645120,2323645135,CA +2323645136,2323645151,US +2323645152,2323645191,CA +2323645192,2323645199,SE +2323645200,2323645263,US +2323645264,2323645279,CA +2323645280,2323645471,US +2323645472,2323645503,CA +2323645504,2323645535,US +2323645536,2323645567,CA +2323645568,2323645663,US +2323645664,2323645695,CA +2323645696,2323645951,US +2323645952,2323645983,CA +2323645984,2323645999,US +2323646000,2323646015,CA +2323646016,2323646079,US +2323646080,2323646119,CA +2323646120,2323646127,FI +2323646128,2323646335,US +2323646336,2323646383,CA +2323646384,2323646415,US +2323646416,2323646431,CA +2323646432,2323646463,US +2323646464,2323646479,CA +2323646480,2323646495,US +2323646496,2323646527,CA +2323646528,2323646783,US +2323646784,2323646799,CA +2323646800,2323646815,US +2323646816,2323646831,CA +2323646832,2323646911,US +2323646912,2323646975,CA +2323646976,2323647119,US +2323647120,2323647135,CA +2323647136,2323647199,US +2323647200,2323647215,CA +2323647216,2323647311,US +2323647312,2323647407,CA +2323647408,2323647487,US +2323647488,2323647519,CA +2323647520,2323647535,US +2323647536,2323647583,CA +2323647584,2323647743,US +2323647744,2323647775,CA +2323647776,2323647791,US +2323647792,2323647807,CA +2323647808,2323647871,US +2323647872,2323647903,CA +2323647904,2323647999,US +2323648000,2323648007,CA +2323648008,2323648015,FI +2323648016,2323648031,US +2323648032,2323648063,CA +2323648064,2323648319,US +2323648320,2323648335,CA +2323648336,2323648351,US +2323648352,2323648367,CA +2323648368,2323648639,US +2323648640,2323648655,CA +2323648656,2323648671,US +2323648672,2323648703,CA +2323648704,2323648767,US +2323648768,2323648943,CA +2323648944,2323648951,US +2323648952,2323649023,CA +2323649024,2323649279,US +2323649280,2323649751,CA +2323649752,2323649759,US +2323649760,2323649775,CA +2323649776,2323649783,US +2323649784,2323649823,CA +2323649824,2323649831,NO +2323649832,2323649855,CA +2323649856,2323649863,US +2323649864,2323649919,CA +2323649920,2323649935,US +2323649936,2323649951,CA +2323649952,2323649959,US +2323649960,2323649999,CA +2323650000,2323650007,US +2323650008,2323650015,RO +2323650016,2323650023,CA +2323650024,2323650031,US +2323650032,2323650039,CA +2323650040,2323650047,US +2323650048,2323650087,CA +2323650088,2323650095,US +2323650096,2323650135,CA +2323650136,2323650151,US +2323650152,2323650167,CA +2323650168,2323650175,US +2323650176,2323650183,CA +2323650184,2323650191,FI +2323650192,2323650223,CA +2323650224,2323650231,US +2323650232,2323650239,CA +2323650240,2323650255,US +2323650256,2323650263,CA +2323650264,2323650271,US +2323650272,2323651327,CA +2323651328,2323651583,US +2323651584,2323652287,CA +2323652288,2323652335,US +2323652336,2323653119,CA +2323653120,2323653135,US +2323653136,2323653151,CA +2323653152,2323653375,US +2323653376,2323653631,CA +2323653632,2323653887,US +2323653888,2323655423,CA +2323655424,2323655503,US +2323655504,2323655511,CA +2323655512,2323655519,US +2323655520,2323655551,CA +2323655552,2323655823,US +2323655824,2323655871,CA +2323655872,2323655935,US +2323655936,2323655967,CA +2323655968,2323655983,US +2323655984,2323655991,CA +2323655992,2323655999,US +2323656000,2323656031,CA +2323656032,2323656207,US +2323656208,2323656255,CA +2323656256,2323656271,US +2323656272,2323656287,CA +2323656288,2323656447,US +2323656448,2323656607,CA +2323656608,2323656639,US +2323656640,2323656719,CA +2323656720,2323656735,US +2323656736,2323656767,CA +2323656768,2323656815,US +2323656816,2323656831,CA +2323656832,2323656895,US +2323656896,2323656927,CA +2323656928,2323656959,US +2323656960,2323657215,CA +2323657216,2323657263,US +2323657264,2323657279,CA +2323657280,2323657311,US +2323657312,2323657343,CA +2323657344,2323657535,US +2323657536,2323657551,CA +2323657552,2323657559,US +2323657560,2323657663,CA +2323657664,2323657695,US +2323657696,2323657711,CA +2323657712,2323657759,US +2323657760,2323657775,CA +2323657776,2323657839,US +2323657840,2323657919,CA +2323657920,2323658495,US +2323658496,2323658751,CA +2323658752,2323659263,US +2323659264,2323659775,CA +2323659776,2323660191,US +2323660192,2323661143,CA +2323661144,2323661151,US +2323661152,2323661199,CA +2323661200,2323661223,US +2323661224,2323661239,CA +2323661240,2323661271,US +2323661272,2323661311,CA +2323661312,2323661567,US +2323661568,2323661607,CA +2323661608,2323661615,FI +2323661616,2323661623,CA +2323661624,2323661823,US +2323661824,2323662399,CA +2323662400,2323662527,US +2323662528,2323662655,CA +2323662656,2323662719,US +2323662720,2323662751,CA +2323662752,2323662767,US +2323662768,2323662775,CA +2323662776,2323662783,US +2323662784,2323663103,CA +2323663104,2323663679,US +2323663680,2323663759,CA +2323663760,2323663767,US +2323663768,2323663791,CA +2323663792,2323663799,US +2323663800,2323663839,CA +2323663840,2323663871,US +2323663872,2323664959,CA +2323664960,2323665039,US +2323665040,2323665047,CA +2323665048,2323665087,US +2323665088,2323665919,CA +2323665920,2323666687,US +2323666688,2323668223,CA +2323668224,2323668991,US +2323668992,2323669759,CA +2323669760,2323670015,US +2323670016,2323670271,CA +2323670272,2323671039,US +2323671040,2323671295,CA +2323671296,2323671551,US +2323671552,2323672063,CA +2323672064,2323672127,US +2323672128,2323672191,CA +2323672192,2323672383,US +2323672384,2323672463,CA +2323672464,2323672479,US +2323672480,2323672511,CA +2323672512,2323672575,US +2323672576,2323672591,CA +2323672592,2323672607,US +2323672608,2323672639,CA +2323672640,2323672735,US +2323672736,2323672767,CA +2323672768,2323672831,US +2323672832,2323672847,CA +2323672848,2323672863,US +2323672864,2323672895,CA +2323672896,2323672959,US +2323672960,2323673055,CA +2323673056,2323673351,US +2323673352,2323673359,CA +2323673360,2323673375,US +2323673376,2323673391,CA +2323673392,2323673455,US +2323673456,2323673487,CA +2323673488,2323673503,US +2323673504,2323673983,CA +2323673984,2323674047,US +2323674048,2323674111,CA +2323674112,2323674175,US +2323674176,2323674575,CA +2323674576,2323674591,US +2323674592,2323674767,CA +2323674768,2323674775,US +2323674776,2323674799,CA +2323674800,2323674879,US +2323674880,2323675135,CA +2323675136,2323675519,US +2323675520,2323675647,CA +2323675648,2323675839,US +2323675840,2323675903,CA +2323675904,2323676927,US +2323676928,2323676991,CA +2323676992,2323690495,US +2323690496,2323690751,IN +2323690752,2323699711,US +2323699712,2323700735,NL +2323700736,2323701759,US +2323701760,2323703295,VG +2323703296,2323775487,US +2323775488,2323841023,AU +2323841024,2323906559,CH +2323906560,2323972095,IT +2323972096,2324021247,US +2324021248,2324021503,MY +2324021504,2324037631,US +2324037632,2324103167,IL +2324103168,2327379967,US +2327379968,2327380991,MX +2327380992,2327383039,BR +2327383040,2327384063,CL +2327384064,2327387135,BR +2327387136,2327388159,NI +2327388160,2327396351,BR +2327396352,2327398399,VE +2327398400,2327399423,BR +2327399424,2327400447,BZ +2327400448,2327401471,AR +2327401472,2327402495,BR +2327403520,2327406591,BR +2327406592,2327407615,NI +2327407616,2327408639,BR +2327408640,2327409663,AR +2327409664,2327410687,PE +2327410688,2327414783,BR +2327414784,2327415807,EC +2327415808,2327416831,AR +2327416832,2327432191,BR +2327432192,2327433215,AR +2327433216,2327434239,BQ +2327434240,2327437311,BR +2327437312,2327438335,MX +2327438336,2327443455,BR +2327443456,2327444479,CR +2327444480,2327446527,BR +2327446528,2327447551,VE +2327447552,2327448575,CL +2327448576,2327449599,PA +2327449600,2327450623,BR +2327450624,2327451647,CO +2327451648,2327452671,BR +2327452672,2327453695,MX +2327453696,2327460863,BR +2327460864,2327461887,PY +2327461888,2327462911,MX +2327462912,2327468031,BR +2327468032,2327469055,PA +2327469056,2327471103,BR +2327471104,2327472127,MX +2327472128,2327476223,BR +2327476224,2327477247,CL +2327477248,2327480319,BR +2327480320,2327481007,HN +2327481008,2327481023,US +2327481024,2327481055,HN +2327481056,2327481071,US +2327481072,2327481135,HN +2327481136,2327481143,US +2327481144,2327481343,HN +2327481344,2327481599,MX +2327481600,2327482367,AR +2327482368,2327483391,BR +2327483392,2327485439,AR +2327485440,2327486463,BR +2327486464,2327487487,AR +2327487488,2327490559,BR +2327490560,2327491583,VE +2327491584,2327493631,BR +2327493632,2327494655,CO +2327494656,2327496703,BR +2327496704,2327497727,MX +2327497728,2327498751,BR +2327498752,2327499055,HN +2327499056,2327499063,CL +2327499064,2327499343,HN +2327499344,2327499351,CL +2327499352,2327499623,HN +2327499624,2327499631,CL +2327499632,2327499639,HN +2327499640,2327499647,CL +2327499648,2327499655,HN +2327499656,2327499663,CL +2327499664,2327499775,HN +2327499776,2327501823,AR +2327501824,2327507967,BR +2327507968,2327508991,AR +2327508992,2327510015,SV +2327510016,2327511039,AR +2327511040,2327838719,CH +2327838720,2327969791,US +2327969792,2328035327,AU +2328035328,2328100863,FR +2328100864,2328199167,US +2328199168,2328211455,CA +2328211456,2328215551,DE +2328215552,2328227839,US +2328227840,2328230911,CA +2328230912,2328231935,US +2328231936,2328297471,GB +2328313856,2328317951,NL +2328342528,2328342783,DE +2328362752,2328485437,DE +2328485438,2328485438,NL +2328485439,2328494079,DE +2328494080,2328559615,US +2328559616,2328625151,BE +2328625152,2328627199,AR +2328627200,2328628223,BR +2328628224,2328629247,BZ +2328629248,2328635391,BR +2328635392,2328636415,AR +2328636416,2328652799,BR +2328652800,2328653823,PA +2328653824,2328664063,BR +2328664064,2328667135,AR +2328667136,2328668159,BR +2328668160,2328669183,MX +2328669184,2328671231,BR +2328671232,2328672255,HN +2328672256,2328677375,BR +2328677376,2328678399,MX +2328678400,2328680447,BR +2328680448,2328681471,AR +2328681472,2328683519,BR +2328683520,2328684543,CL +2328684544,2328686079,BR +2328686080,2328686591,CO +2328686592,2328687615,BR +2328687616,2328690687,AR +2328690688,2328756223,BE +2328756224,2328766591,CH +2328766592,2328766655,HK +2328766656,2328794239,CH +2328794240,2328794303,JP +2328794304,2328797183,CH +2328797184,2328805375,AU +2328805376,2328808063,CH +2328808064,2328808127,HK +2328808128,2328821759,CH +2328821760,2329083903,US +2329083904,2329149439,NZ +2329149440,2329214975,JP +2329280512,2329346047,CA +2329346048,2329411583,SE +2329411584,2329477119,FI +2329477120,2329542655,AU +2329542656,2329608191,CA +2329608192,2329610239,AR +2329610240,2329611263,PY +2329611264,2329612287,SV +2329612288,2329613311,AR +2329613312,2329617407,BR +2329617408,2329618431,MX +2329618432,2329619455,AR +2329619456,2329622527,BR +2329622528,2329623551,CL +2329623552,2329624575,AR +2329624576,2329626623,BR +2329626624,2329627647,HN +2329627648,2329628671,BR +2329628672,2329629695,AR +2329629696,2329638911,BR +2329638912,2329639071,HN +2329639072,2329639087,NL +2329639088,2329639935,HN +2329639936,2329644031,BR +2329644032,2329645055,CW +2329645056,2329648127,BR +2329648128,2329649151,SV +2329649152,2329650175,AR +2329650176,2329652223,BR +2329652224,2329652735,US +2329652736,2329653247,HN +2329653248,2329662463,BR +2329662464,2329664511,AR +2329664512,2329666559,BR +2329666560,2329667583,CL +2329667584,2329668607,AR +2329668608,2329671679,BR +2329671680,2329672703,AR +2329672704,2329673727,BR +2329673728,2329739263,US +2329739264,2329804799,SE +2329804800,2329870335,DE +2329870336,2329935871,CH +2329935872,2330001407,DE +2330001408,2330066943,CH +2330066944,2330132479,US +2330132480,2330198015,SE +2330198016,2330263551,CH +2330263552,2330267647,US +2330267648,2330271743,CA +2330271744,2330288127,US +2330288128,2330290175,CN +2330290176,2330394623,US +2330394624,2330460159,FR +2330460160,2330525695,AT +2330525696,2330591231,SE +2330591232,2330656767,US +2330656768,2330722303,NZ +2330722304,2330956287,US +2330956288,2330956543,GB +2330956544,2330956799,US +2330956800,2330957311,NZ +2330957312,2330968063,US +2330968064,2330968319,IN +2330968320,2331181055,US +2331181056,2331246591,JP +2331246592,2331443199,DE +2331443200,2331508735,US +2331508736,2331574271,GB +2331574272,2331639807,FI +2331639808,2331770879,GB +2331836416,2331901951,GB +2331901952,2331967487,US +2331967488,2331980799,BR +2331980800,2331981567,PA +2331981568,2331981823,US +2331981824,2331982847,BR +2331982848,2331983871,MX +2331983872,2331987967,BR +2331987968,2331988991,AR +2331988992,2331990015,BR +2331990016,2331991039,AR +2331991040,2331992063,BR +2331992064,2331992319,CO +2331992320,2331994111,CL +2331994112,2331997183,BR +2331997184,2331998207,MX +2331998208,2332006399,BR +2332006400,2332007423,SV +2332007424,2332010495,BR +2332010496,2332011519,AR +2332011520,2332030975,BR +2332030976,2332031999,DO +2332032000,2332033023,AW +2332033024,2332098559,ID +2332098560,2332360703,DE +2332360704,2332374015,IN +2332374016,2332375039,AU +2332375040,2332377087,CN +2332377088,2332378111,IN +2332378112,2332380159,NP +2332380160,2332381183,AU +2332381184,2332382207,CN +2332382208,2332383231,US +2332383232,2332384255,JP +2332384256,2332385279,CN +2332385280,2332387327,IN +2332387328,2332388351,BD +2332388352,2332388863,HK +2332388864,2332389375,CN +2332389376,2332393471,AU +2332393472,2332394495,CN +2332394496,2332395519,BD +2332395520,2332396543,GU +2332396544,2332397567,IN +2332397568,2332398591,TH +2332398592,2332400639,ID +2332400640,2332401663,LA +2332401664,2332402687,CN +2332402688,2332403711,NZ +2332403712,2332404735,JP +2332404736,2332405759,AU +2332405760,2332406783,MY +2332406784,2332407807,HK +2332407808,2332408575,US +2332408576,2332408831,GB +2332408832,2332409855,BD +2332409856,2332410879,CN +2332410880,2332411903,IN +2332411904,2332412927,HK +2332412928,2332415999,CN +2332416000,2332417023,MN +2332417024,2332418047,IN +2332418048,2332419071,KR +2332419072,2332423167,IN +2332423168,2332424191,CN +2332424192,2332426239,IN +2332426240,2332622847,DE +2332622848,2332688383,CN +2332688384,2332753919,NL +2332753920,2333736959,DE +2333736960,2333802495,RE +2333802496,2333868031,DE +2333933568,2334064639,DE +2334064640,2334916607,US +2334916608,2334982143,AU +2334982144,2335113215,US +2335113216,2335154175,ES +2335154176,2335178751,DE +2335178752,2335244287,CA +2335244288,2335309823,US +2335309824,2335375359,DE +2335375360,2335506431,US +2335506432,2335571967,ZA +2335571968,2335637503,FR +2335637504,2335768575,US +2335768576,2335834111,CA +2335834112,2335899647,SE +2335899648,2335924223,IN +2335924224,2335932415,SG +2335932416,2335940607,DE +2335940608,2335948799,GB +2335948800,2335949823,SG +2335949824,2335951871,GB +2335951872,2335954943,DE +2335954944,2335965183,SG +2335965184,2335970303,US +2335970304,2335971327,CA +2335971328,2335994879,US +2335994880,2335995903,CA +2335995904,2336008191,US +2336008192,2336009215,CA +2336009216,2336010239,US +2336010240,2336014335,PR +2336014336,2336161791,US +2336161792,2336227327,NL +2336227328,2336260095,CA +2336260096,2336358399,US +2336358400,2336411647,FI +2336411648,2336412671,SG +2336412672,2336423935,FI +2336423936,2336882687,US +2336882688,2336948223,FI +2336948224,2337013759,DE +2337013760,2337210367,US +2337210368,2337275903,CH +2337275904,2337341439,NZ +2337341440,2337406975,US +2337406976,2337472511,BR +2337472512,2337538047,PT +2337538048,2337669119,US +2337669120,2337734655,AU +2337734656,2337865727,US +2337865728,2337931263,DE +2337931264,2337996799,BE +2337996800,2338062335,GR +2338064384,2338066431,NL +2338066432,2338069247,GB +2338079488,2338079743,SE +2338083840,2338084095,TR +2338084352,2338084863,FR +2338086912,2338087423,DE +2338088960,2338089727,GB +2338091008,2338092031,SE +2338092288,2338092543,SE +2338093568,2338093823,IE +2338100224,2338100479,FI +2338104576,2338104831,DK +2338104832,2338105087,GR +2338108928,2338109183,FI +2338109184,2338109439,GB +2338113536,2338113791,FR +2338115072,2338115839,IL +2338120448,2338120959,DE +2338123008,2338123519,AT +2338123520,2338123775,IT +2338124800,2338125055,GB +2338125056,2338125311,FR +2338125312,2338125567,GB +2338127872,2338324479,US +2338324480,2338390015,SE +2338390016,2338455551,FI +2338455552,2338521087,NO +2338521088,2338553855,SG +2338553856,2338586623,AU +2338586624,2338652159,FR +2338652160,2338717695,JP +2338717696,2338783231,US +2338783232,2338848767,CA +2338848768,2338914303,US +2338914304,2339962879,NO +2339962880,2340028415,US +2340028416,2340093951,SE +2340093952,2340159487,FI +2340159488,2340225023,FR +2340225024,2340421631,US +2340421632,2340487167,IT +2340487168,2340552703,CN +2340552704,2340618239,AU +2340618240,2340683775,US +2340683776,2340749311,AU +2340749312,2340814847,GB +2340814848,2340880383,AU +2340880384,2341126143,US +2341126144,2341134335,CY +2341134336,2341134591,IN +2341134592,2341134847,US +2341134848,2341135103,AU +2341135104,2341135359,GB +2341135360,2341135615,SG +2341135616,2341135871,JP +2341135872,2341136127,CN +2341136128,2341273599,US +2341273600,2341339135,KW +2341339136,2341404671,CA +2341404672,2341470207,GB +2341470208,2341535743,US +2341535744,2341601279,NO +2341601280,2341732351,US +2341732352,2341797887,CN +2341797888,2341863423,GB +2341863424,2341928959,KR +2341928960,2341994495,US +2341994496,2342060031,JP +2342060032,2342125567,GB +2342125568,2342191103,JP +2342191104,2342256639,CN +2342256640,2342322175,NL +2342322176,2342387711,FI +2342387712,2342453247,FR +2342453248,2342518783,CN +2342518784,2342584319,FR +2342584320,2342649855,US +2342649856,2342666239,SG +2342666240,2342682623,JP +2342682624,2342699007,DE +2342699008,2342715391,GB +2342715392,2342780927,AU +2342780928,2342846463,NO +2342846464,2342911999,BE +2342912000,2342977535,GB +2342977536,2343043071,IN +2343043072,2343108607,AU +2343108608,2343174143,US +2343174144,2343239679,CN +2343239680,2343370751,US +2343370752,2343436287,CA +2343436288,2343501823,DE +2343501824,2343567359,TW +2343567360,2343632895,CN +2343632896,2343698431,US +2343698432,2343763967,NL +2343763968,2343829503,TR +2343829504,2343924735,US +2343924736,2343925759,IL +2343925760,2343934975,US +2343934976,2343935999,IL +2343936000,2344026111,US +2344026112,2344091647,CN +2344091648,2344157183,GB +2344157184,2344222719,US +2344222720,2344288255,CN +2344288256,2344353791,US +2344353792,2344419327,AU +2344419328,2344484863,CN +2344484864,2344550399,PK +2344615936,2344878079,ID +2344878080,2346188799,CN +2346188800,2346254335,AU +2346254336,2346319871,CN +2346319872,2346385407,AU +2346385408,2346582015,CN +2346582016,2346647551,GB +2346647552,2346713087,TW +2346713088,2346778623,CN +2346778624,2346844159,US +2346844160,2346975231,CN +2346975232,2347040767,ID +2347040768,2347106303,US +2347106304,2347171839,AU +2347171840,2348744703,US +2348744704,2348875775,ID +2348875776,2353725439,US +2353725440,2353790975,CN +2353790976,2353856511,US +2353856512,2353922047,FR +2353922048,2353987583,AT +2353987584,2354053119,AU +2354053120,2354118655,CA +2354184192,2354249727,US +2354249728,2354315263,AU +2354315264,2354446335,US +2354446336,2354511871,FR +2354511872,2354839551,US +2354839552,2354905087,TW +2354905088,2355036159,FR +2355036160,2355101695,US +2355101696,2355167231,TW +2355167232,2355232767,GB +2355232768,2355437551,US +2355437552,2355437567,GB +2355437568,2355470319,US +2355470320,2355470335,SG +2355470336,2355482607,US +2355482608,2355482623,HK +2355482624,2355491311,US +2355491312,2355491327,AU +2355491328,2355691519,US +2355691520,2355757055,IT +2355757056,2355953663,US +2355953664,2357919743,TW +2357919744,2358181887,US +2358181888,2358247423,CN +2358247424,2358509567,US +2358509568,2358575103,MX +2358575104,2358640639,TH +2358640640,2358706175,SE +2358706176,2358771711,FI +2358771712,2359230463,US +2359230464,2359295999,AU +2359296000,2359361535,US +2359361536,2359427071,CA +2359427072,2359558143,US +2359558144,2359623679,IT +2359623680,2359689215,US +2359689216,2359754751,SE +2359754752,2359820287,CA +2359820288,2359885823,AU +2359885824,2360672255,US +2360672256,2360737791,DE +2360737792,2360868863,US +2360868864,2360934399,CA +2360934400,2361327615,US +2361327616,2361393151,AR +2361393152,2361458687,US +2361458688,2361524223,CA +2361524224,2361917439,US +2361917440,2361982975,NZ +2361982976,2362114047,US +2362114048,2362179583,IE +2362179584,2362245119,US +2362245120,2362441727,CN +2362441728,2362572799,US +2362572800,2362638335,CN +2362638336,2362769407,US +2362769408,2362834943,ID +2362834944,2363490303,US +2363490304,2363555839,CN +2363555840,2363686911,US +2363686912,2363752447,JP +2363752448,2363883519,US +2363883520,2363949055,CA +2363949056,2364342271,US +2364342272,2364407807,CN +2364407808,2364538879,US +2364538880,2364604415,CN +2364604416,2364671487,US +2364671488,2364671743,HK +2364671744,2364675839,US +2364675840,2364676095,CA +2364676096,2364676863,US +2364676864,2364676867,GB +2364676868,2364725503,US +2364725504,2364725759,IN +2364725760,2364727807,US +2364727808,2364728063,DE +2364728064,2364735487,US +2364735488,2364801023,CN +2364801024,2364932095,US +2364932096,2364997631,CN +2364997632,2365128703,US +2365128704,2365259775,CN +2365259776,2365390847,US +2365390848,2365456383,AU +2365456384,2365521919,US +2365521920,2365587455,CN +2365587456,2365589503,JO +2365589504,2365590527,SG +2365590528,2365591039,ZA +2365591040,2365591551,US +2365591552,2365593599,DE +2365593600,2365595647,NL +2365595648,2365603839,GB +2365603840,2365624319,NO +2365624320,2365630463,GB +2365630464,2365632511,NL +2365632512,2365634559,RU +2365634560,2365636607,FR +2365636608,2365638655,GB +2365638656,2365640703,FR +2365640704,2365644799,GB +2365644800,2365652991,NO +2365652992,2366032895,DE +2366032896,2366033151,GB +2366033152,2366111743,DE +2366111744,2366144511,MT +2366144512,2366147967,RU +2366147968,2366148095,DE +2366148096,2366148351,RU +2366148352,2366148479,TR +2366148480,2366148607,US +2366148608,2366149375,RU +2366149376,2366149407,DE +2366149408,2366149423,PL +2366149424,2366149439,SK +2366149440,2366149455,PT +2366149456,2366149471,ES +2366149472,2366149487,FR +2366149488,2366149495,MD +2366149496,2366149503,LT +2366149504,2366149511,LV +2366149512,2366149519,EE +2366149520,2366149527,BG +2366149528,2366149535,RS +2366149536,2366149543,UA +2366149544,2366149551,BY +2366149552,2366149559,KZ +2366149560,2366160223,RU +2366160224,2366160255,DE +2366160256,2366162943,RU +2366162944,2366164991,AL +2366164992,2366167039,GE +2366167040,2366169087,GB +2366169088,2366171135,CH +2366171136,2366308351,DE +2366308352,2366373887,GB +2366373888,2367487999,DE +2367488000,2367553535,SI +2367553536,2370895871,DE +2370895872,2370961407,SE +2370961408,2371158015,DE +2371158016,2371223551,RO +2371223552,2371289087,US +2371289088,2371616767,DE +2371616768,2371682303,GB +2371682304,2371747839,NL +2371747840,2371813887,GB +2371813888,2371814143,US +2371814144,2371814144,CH +2371814145,2371878911,GB +2371878912,2371944447,BE +2371944448,2372009983,GB +2372075520,2372206591,DE +2372206592,2372214783,UA +2372214784,2372218879,DE +2372218880,2372221951,FR +2372221952,2372222975,CH +2372222976,2372223487,NL +2372223488,2372224511,FR +2372224512,2372225023,GB +2372225024,2372225791,US +2372225792,2372226559,NL +2372226560,2372227071,US +2372227072,2372227583,RU +2372227584,2372228607,KR +2372228608,2372229119,US +2372229120,2372229375,FR +2372229376,2372230655,US +2372230656,2372231679,CZ +2372231680,2372232191,GB +2372232192,2372233215,CL +2372233216,2372233727,NL +2372233728,2372234239,GB +2372234240,2372235263,CO +2372239360,2372239564,SK +2372239565,2372239580,IT +2372239581,2372240383,SK +2372240384,2372240511,NL +2372240512,2372240639,LU +2372240640,2372240895,NL +2372240896,2372241151,DE +2372241152,2372241407,PK +2372241408,2372243199,RU +2372243200,2372243455,RO +2372243456,2372243711,DK +2372243712,2372243967,AM +2372243968,2372244223,NO +2372244224,2372244479,BN +2372244480,2372251391,US +2372251392,2372258815,RU +2372258816,2372259327,TJ +2372259328,2372272127,RU +2372272128,2372337663,US +2372337664,2372403199,ID +2372403200,2372468735,US +2372468736,2372472831,NL +2372472832,2372474879,PL +2372474880,2372483071,RU +2372483072,2372485119,JO +2372485120,2372487167,RU +2372487168,2372489215,FR +2372489216,2372493311,LB +2372493312,2372497407,ES +2372497408,2372499455,IE +2372499456,2372501503,NL +2372501504,2372505599,UA +2372505600,2372507647,NL +2372507648,2372509695,IT +2372509696,2372510335,AE +2372510336,2372510336,ES +2372510337,2372511743,AE +2372511744,2372512815,OM +2372512816,2372512816,BA +2372512817,2372513791,OM +2372513792,2372534271,GB +2372534272,2372665343,US +2372665344,2372730879,IT +2372730880,2372796415,CA +2372796416,2372993023,US +2372993024,2373025791,DE +2373025792,2373026047,SG +2373026048,2373029887,DE +2373029888,2373033983,US +2373033984,2373036031,DE +2373036032,2373038079,US +2373038080,2373058559,DE +2373058560,2373124095,US +2373124096,2373189631,FR +2373189632,2373255167,US +2373255168,2373451775,CA +2373451776,2373517311,AU +2373517312,2373582847,US +2373582848,2373648383,CH +2373648384,2373911041,US +2373911042,2373911042,FI +2373911043,2374107135,US +2374107136,2374172671,DE +2374172672,2374238207,US +2374238208,2374303743,AU +2374303744,2374369279,US +2374369280,2374500351,BE +2374500352,2374502399,LV +2374502400,2374504447,MK +2374504448,2374508543,US +2374508544,2374512639,LT +2374512640,2374514687,SK +2374514688,2374516735,ES +2374516736,2374524927,AM +2374524928,2374525717,FR +2374525718,2374525718,BE +2374525719,2374528261,FR +2374528262,2374528262,PL +2374528263,2374529023,FR +2374529024,2374531071,RU +2374531072,2374533119,NL +2374533120,2374565887,HR +2374565888,2374631423,SE +2374631424,2374647807,HR +2374647808,2374651903,BE +2374651904,2374653951,IT +2374653952,2374655999,FR +2374656000,2374664191,UA +2374664192,2374666239,GB +2374666240,2374670335,NL +2374670336,2374672383,FR +2374672384,2374674431,PL +2374674432,2374676479,NL +2374676480,2374680575,LB +2374680576,2374684671,NL +2374684672,2374686719,GB +2374686720,2374688767,NL +2374688768,2374696959,GB +2374696960,2374959103,US +2374959104,2375008255,GB +2375008256,2375012351,NL +2375012352,2375024639,GB +2375024640,2375090175,DK +2375090176,2375102259,NO +2375102260,2375102260,GB +2375102261,2375155711,NO +2375155712,2375221247,US +2375221248,2375286783,SE +2375286784,2375352319,CH +2375352320,2376083199,US +2376083200,2376083455,CA +2376083456,2376083711,US +2376083712,2376083967,AU +2376083968,2376269823,US +2376269824,2376335359,GB +2376335360,2376597503,US +2376597504,2376663039,AU +2376663040,2376728575,DE +2376728576,2376761343,GB +2376761344,2376777727,CZ +2376777728,2376781823,BA +2376781824,2376782847,DZ +2376782848,2376785919,FR +2376785920,2376794111,UA +2376794112,2376859647,CH +2376859648,2376925183,FI +2376925184,2377056255,US +2377056256,2377121791,FR +2377121792,2377187327,NL +2377187328,2377252863,US +2377252864,2377318399,JP +2377318400,2377449471,US +2377449472,2377515007,FR +2377515008,2377842687,US +2377842688,2377908223,GB +2377908224,2378022911,US +2378022912,2378023423,HK +2378023424,2378025983,US +2378025984,2378026239,NL +2378026240,2378026495,US +2378026496,2378027007,FR +2378027008,2378170367,US +2378170368,2378203135,FI +2378203136,2378203647,NO +2378203648,2378210559,FI +2378210560,2378211071,NO +2378211072,2378235903,FI +2378235904,2378236415,CA +2378236416,2378238975,ES +2378238976,2378239487,CA +2378239488,2378240511,US +2378240512,2378242047,ES +2378242048,2378242559,US +2378242560,2378248191,ES +2378248192,2378250751,US +2378250752,2378301439,ES +2378301440,2378366975,FR +2378366976,2378432511,US +2378432512,2378498047,TR +2378498048,2378500607,US +2378500608,2378500863,GB +2378500864,2378694655,US +2378694656,2378760191,DE +2378760192,2378825727,AT +2378825728,2378891263,US +2378891264,2378956799,AT +2378956800,2379131391,US +2379131392,2379131647,IN +2379131648,2379218943,US +2379218944,2379284479,FI +2379284480,2380201983,US +2380201984,2380267519,KR +2380267520,2380398591,US +2380398592,2380420095,IL +2380420096,2380420863,GB +2380420864,2380423167,IL +2380423168,2380427263,US +2380427264,2380428799,GB +2380428800,2380430847,IL +2380430848,2380431103,GB +2380431104,2380431615,IL +2380431616,2380431871,US +2380431872,2380432127,TH +2380432128,2380432383,US +2380432384,2380433407,IL +2380433408,2380434175,US +2380434176,2380434431,IL +2380434432,2380435455,US +2380435456,2380455935,IL +2380455936,2380456447,US +2380456448,2380456959,IL +2380456960,2380457215,NL +2380457216,2380457727,US +2380457728,2380457983,HK +2380457984,2380464127,IL +2380464128,2380464639,FR +2380464640,2380465151,US +2380465152,2380465439,FR +2380465440,2380465443,SG +2380465444,2380529663,FR +2380529664,2380558335,GB +2380558336,2380562431,ZA +2380562432,2380595199,GB +2380660736,2380726271,US +2380726272,2380791807,GB +2380791808,2381119487,US +2381119488,2381185023,GR +2381185024,2381381631,US +2381381632,2381447167,GB +2381447168,2381512703,US +2381512704,2381578239,AU +2381578240,2381643775,AT +2381643776,2381709311,GB +2381709312,2381905919,US +2381905920,2381971455,CH +2381971456,2382036991,IT +2382036992,2382102527,US +2382102528,2382168063,NL +2382168064,2382233599,BE +2382233600,2382299135,US +2382299136,2382331903,GR +2382331904,2382335999,FR +2382336000,2382340095,NL +2382340096,2382342143,CH +2382342144,2382344191,AT +2382344192,2382346239,NL +2382346240,2382348287,SE +2382348288,2382364671,SI +2382364672,2382368767,US +2382368768,2382372863,CA +2382372864,2382381055,US +2382381056,2382383209,CA +2382383210,2382383210,AE +2382383211,2382385151,CA +2382385152,2382401535,US +2382401536,2382405631,CA +2382405632,2382422015,US +2382422016,2382426111,JM +2382426112,2382430207,US +2382430208,2382626815,CA +2382626816,2382654207,US +2382654208,2382654463,CN +2382654464,2382657023,US +2382657024,2382657535,CN +2382657536,2382657791,US +2382657792,2382658559,CN +2382658560,2382658815,CA +2382658816,2382675967,US +2382675968,2382676107,CA +2382676108,2382676111,US +2382676112,2382677987,CA +2382677988,2382677991,US +2382677992,2382678015,CA +2382678016,2382678527,US +2382678528,2382679150,CA +2382679151,2382679151,IO +2382679152,2382679342,CA +2382679343,2382679343,IO +2382679344,2382684159,CA +2382684160,2382692351,US +2382692352,2383085567,CA +2383085568,2383151103,US +2383151104,2385031167,CA +2385031168,2385032191,BR +2385032192,2385032703,CA +2385032704,2385035263,BR +2385035264,2385293087,CA +2385293088,2385293111,US +2385293112,2385307727,CA +2385307728,2385307735,US +2385307736,2385903615,CA +2385903616,2385908735,US +2385908736,2385909759,VG +2385909760,2385915903,US +2385915904,2385919999,CA +2385920000,2385952767,US +2385952768,2385954815,BM +2385954816,2385955839,US +2385955840,2385956863,TC +2385956864,2385969151,US +2385969152,2386624511,CA +2386624512,2386690047,US +2386690048,2386988287,CA +2386988288,2386988543,CH +2386988544,2386989055,CA +2386989056,2386989311,CH +2386989312,2387003391,CA +2387003392,2387003647,CH +2387003648,2387003903,CA +2387003904,2387004159,CH +2387004160,2387344127,CA +2387344128,2387344895,US +2387344896,2387345151,CA +2387345152,2387345407,US +2387345408,2387410943,CA +2387410944,2387476479,US +2387476480,2387542015,CA +2387542016,2387607551,US +2387607552,2388328447,CA +2388328448,2388330495,US +2388330496,2388332543,NL +2388332544,2388350207,US +2388350208,2388350463,LK +2388350464,2388359167,US +2388359168,2388361215,NL +2388361216,2388367359,US +2388367360,2388369407,NL +2388369408,2388393983,US +2388393984,2389245951,CA +2389245952,2389311487,US +2389311488,2389639167,CA +2389639168,2389671935,US +2389671936,2389688319,CN +2389688320,2389704703,US +2389704704,2390818815,CA +2390818816,2390884351,US +2390884352,2390995455,CA +2390995456,2391015423,US +2391015424,2391277567,CA +2391277568,2391343103,US +2391343104,2391998463,CA +2391998464,2392002303,US +2392002304,2392010751,CA +2392010752,2392011263,US +2392011264,2392011519,CA +2392011520,2392011775,US +2392011776,2392012543,CA +2392012544,2392014079,US +2392014080,2392014335,CA +2392015360,2392015871,CA +2392015872,2392017407,US +2392017408,2392017663,CA +2392017664,2392018431,US +2392018432,2392018687,CA +2392018688,2392018943,US +2392018944,2392019199,CA +2392019200,2392019455,US +2392019456,2392019711,CA +2392019712,2392021759,US +2392021760,2392022015,NL +2392022016,2392022271,FR +2392022272,2392022527,DE +2392022528,2392022783,GB +2392022784,2392024063,US +2392024064,2392024319,CA +2392024320,2392024575,US +2392024576,2392025087,VI +2392025088,2392063999,US +2392064000,2392096767,CA +2392096768,2392129535,US +2392129536,2392457215,CA +2392457216,2392489983,SA +2392489984,2392514559,US +2392514560,2394947583,CA +2394947584,2395013119,US +2395013120,2395209727,CA +2395209728,2395340799,US +2395340800,2395807743,CA +2395807744,2395815935,US +2395815936,2395841023,CA +2395841024,2395841535,GB +2395841536,2397700095,CA +2397700096,2397708287,US +2397708288,2397710335,NL +2397710336,2397765631,US +2397765632,2398748671,CA +2398748672,2398945279,US +2398945280,2399010815,CA +2399010816,2399109119,US +2399109120,2399141887,PR +2399141888,2399148031,BR +2399148032,2399149055,DO +2399149056,2399150079,BR +2399150080,2399151103,BQ +2399151104,2399158271,BR +2399158272,2399159295,AR +2399159296,2399161343,BR +2399161344,2399163391,AR +2399163392,2399165439,BR +2399165440,2399166463,CO +2399166464,2399167487,VE +2399167488,2399167743,AR +2399167744,2399167999,BO +2399168000,2399168511,CO +2399168512,2399169535,SV +2399169536,2399170559,CO +2399170560,2399182847,BR +2399182848,2399183871,CR +2399183872,2399184895,BR +2399184896,2399185919,AR +2399185920,2399186943,TT +2399186944,2399202303,BR +2399202304,2399202591,HN +2399202592,2399202623,NL +2399202624,2399203031,HN +2399203032,2399203039,UY +2399203040,2399203327,HN +2399203328,2399204351,CL +2399204352,2399205375,AR +2399205376,2399206399,PE +2399206400,2399207423,BR +2399207424,2401828863,US +2401828864,2401894399,GB +2401894400,2402222079,US +2402222080,2402287615,IE +2402287616,2402418687,US +2402418688,2402484223,AT +2402484224,2402549759,FI +2402549760,2402680831,GB +2402680832,2402746367,BR +2402746368,2402945023,US +2402945024,2402945279,GB +2402945280,2403401727,US +2403401728,2403467263,GB +2403467264,2404974591,US +2404974592,2405040127,HK +2405040128,2405105663,JP +2405105664,2405171199,US +2405171200,2405236735,AU +2405236736,2405302271,DE +2405302272,2405367807,JP +2405367808,2405433343,US +2405433344,2405498879,NZ +2405498880,2405564415,NO +2405564416,2405629951,US +2405629952,2405695487,CH +2405695488,2406088703,US +2406088704,2406285311,BR +2406285312,2406809599,US +2406809600,2406875135,GB +2406875136,2406940671,SE +2406940672,2407006207,AU +2407006208,2407071743,US +2407071744,2407137279,NL +2407137280,2407333887,US +2407333888,2407399423,JP +2407399424,2407464959,FR +2407464960,2407530495,US +2407530496,2407596031,ZA +2407596032,2407661567,BE +2407661568,2407727103,AT +2407727104,2408054783,US +2408054784,2408120319,JP +2408120320,2408125439,BR +2408125440,2408126463,AR +2408126464,2408127487,NI +2408127488,2408140799,BR +2408140800,2408141823,DO +2408141824,2408144895,BR +2408144896,2408145919,CO +2408145920,2408147967,BR +2408147968,2408148991,MX +2408148992,2408150015,BO +2408150016,2408157183,BR +2408157184,2408158207,PE +2408158208,2408159231,CR +2408159232,2408162303,BR +2408162304,2408164279,HN +2408164280,2408164287,IT +2408164288,2408164351,HN +2408165376,2408169471,BR +2408169472,2408170495,TT +2408170496,2408178687,BR +2408178688,2408178695,IT +2408178696,2408179375,HN +2408179376,2408179391,IT +2408179392,2408179423,HN +2408179424,2408179431,IT +2408179432,2408179711,HN +2408179712,2408182783,BR +2408182784,2408183807,AR +2408183808,2408185855,BR +2408185856,2409562111,US +2409562112,2409568255,GB +2409568256,2409569279,US +2409569280,2409599231,GB +2409599232,2409599487,US +2409599488,2409612799,GB +2409612800,2409613311,US +2409613312,2409617407,GB +2409617408,2409618431,US +2409618432,2409621503,GB +2409621504,2409622527,US +2409622528,2409623039,GB +2409623040,2409624575,US +2409624576,2409627647,GB +2409627648,2409693183,ZA +2409693184,2409758719,AT +2409758720,2409824255,US +2409824256,2409955327,DE +2409955328,2410086399,US +2410086400,2410151935,GB +2410151936,2410217471,US +2410217472,2410283007,BE +2410283008,2410348543,US +2410414080,2410545151,US +2410545152,2410610687,AU +2410610688,2410676223,US +2410676224,2410938367,NL +2410938368,2411003903,CH +2411003904,2411363583,US +2411363584,2411363839,GB +2411363840,2411462655,US +2411462656,2411528191,AU +2411528192,2411593727,JP +2411593728,2411749375,US +2411749376,2411753471,MY +2411753472,2411757567,SG +2411757568,2411986943,US +2411986944,2412052479,FR +2412052480,2412314623,US +2412380160,2412383231,BR +2412383232,2412384255,CL +2412384256,2412387327,AR +2412387328,2412388351,BR +2412388352,2412389375,AR +2412389376,2412399615,BR +2412399616,2412400639,MX +2412400640,2412402687,BR +2412402688,2412403711,AR +2412403712,2412404735,BR +2412404736,2412405759,AR +2412405760,2412414975,BR +2412414976,2412415999,AR +2412416000,2412417023,CL +2412417024,2412418047,AR +2412418048,2412419071,BR +2412419072,2412420095,PA +2412420096,2412421119,MX +2412421120,2412422143,CR +2412422144,2412429311,BR +2412429312,2412430335,AR +2412430336,2412431359,HN +2412431360,2412432383,AR +2412432384,2412433407,MX +2412433408,2412433663,PY +2412433664,2412433919,BR +2412433920,2412434431,PY +2412434432,2412444671,BR +2412444672,2412445695,NI +2412445696,2412576767,US +2412576768,2412642303,AT +2412642304,2412773375,US +2412773376,2412777471,BR +2412777472,2412778495,HN +2412778496,2412782591,BR +2412782592,2412783615,AR +2412783616,2412784639,BR +2412784640,2412786687,AR +2412786688,2412787711,CL +2412787712,2412788735,GT +2412788736,2412789759,BR +2412789760,2412790783,CO +2412790784,2412807167,BR +2412807168,2412808191,PE +2412808192,2412815359,BR +2412815360,2412816383,DO +2412816384,2412817407,CR +2412817408,2412819455,BR +2412819456,2412820479,GT +2412820480,2412838911,BR +2412838912,2412904447,US +2412904448,2412969983,GB +2412969984,2413297663,US +2413297664,2413363199,AU +2413363200,2413428735,SE +2413428736,2413494271,AU +2413494272,2413625343,US +2413625344,2413690879,JP +2413690880,2413758463,US +2413758464,2413758975,GB +2413758976,2413759487,US +2413759488,2413759743,GB +2413759744,2413821951,US +2413821952,2413887487,AT +2413887488,2413953023,IT +2413953024,2414411775,US +2414411776,2414477311,GR +2414477312,2414542847,GB +2414542848,2414673919,US +2414673920,2414739455,SE +2414739456,2414804991,AU +2414804992,2414870527,IE +2414870528,2415198207,US +2415198208,2415263743,AT +2415263744,2415394815,US +2415394816,2415460351,KR +2415460352,2415656959,US +2415656960,2415722495,GB +2415722496,2415788031,JP +2415788032,2415853567,US +2415853568,2415859711,BR +2415859712,2415860735,CL +2415860736,2415861759,CR +2415861760,2415862783,HN +2415862784,2415863807,AR +2415863808,2415864831,MX +2415864832,2415867903,BR +2415867904,2415868927,MX +2415868928,2415875071,BR +2415875072,2415876095,VE +2415876096,2415880191,BR +2415880192,2415881215,CL +2415881216,2415888383,BR +2415888384,2415889407,AR +2415889408,2415890431,PY +2415890432,2415892479,BR +2415892480,2415893503,AR +2415893504,2415894527,PA +2415894528,2415898623,BR +2415898624,2415899647,CL +2415899648,2415904767,BR +2415904768,2415905023,US +2415905024,2415917055,BR +2415917056,2415918079,EC +2415918080,2415919103,BR +2415919104,2415984639,CN +2416050176,2416058367,US +2416058368,2416066559,IE +2416066560,2416082943,CH +2416082944,2416083967,GB +2416083968,2416084223,US +2416084224,2416084991,GB +2416084992,2416085247,AU +2416085248,2416085503,GB +2416085504,2416085759,US +2416085760,2416086015,GB +2416086016,2416086271,SG +2416086272,2416087039,GB +2416087040,2416091135,US +2416091136,2416093183,ES +2416093184,2416095231,NL +2416095232,2416111615,US +2416111616,2416113663,IE +2416113664,2416114687,ES +2416114688,2416115711,NL +2416115712,2416181247,US +2416181248,2416246783,FI +2416246784,2416261993,US +2416261994,2416261994,TH +2416261995,2416312319,US +2416312320,2416377855,AU +2416377856,2416443391,CN +2416443392,2416705535,US +2416705536,2416771071,CN +2416771072,2416916479,US +2416916480,2416916991,SG +2416916992,2416967679,US +2416967680,2417033215,IN +2417033216,2417229823,US +2417229824,2417295359,ES +2417295360,2417360895,US +2417360896,2417491967,CR +2417491968,2417557503,GB +2417557504,2417688575,US +2417688576,2417754111,SE +2417754112,2418016255,US +2418016256,2418081791,GB +2418081792,2418278655,US +2418278656,2418278911,ZA +2418278912,2418279487,US +2418279488,2418279491,ES +2418279492,2418281151,US +2418281152,2418281215,IN +2418281216,2418281983,US +2418281984,2418282239,ES +2418282240,2418284543,US +2418284544,2418285055,CA +2418285056,2418285567,MX +2418285568,2418286335,US +2418286336,2418286591,MX +2418286592,2418287103,CA +2418287104,2418287295,US +2418287296,2418287359,GB +2418287360,2418291199,US +2418291200,2418292223,AR +2418292224,2418292735,PH +2418292736,2418294015,US +2418294016,2418294783,AR +2418294784,2418294911,US +2418294912,2418295039,GB +2418295040,2418295807,US +2418295808,2418295935,GB +2418295936,2418295947,US +2418295948,2418295951,GB +2418295952,2418296063,US +2418296064,2418296319,DE +2418296320,2418297343,IN +2418297344,2418297855,US +2418297856,2418298367,BR +2418298368,2418298623,ZA +2418298624,2418301439,US +2418301440,2418301695,PH +2418301696,2418302463,US +2418302464,2418302719,PH +2418302720,2418302975,US +2418302976,2418303231,IN +2418303232,2418303487,ZA +2418303488,2418303871,US +2418303872,2418303879,GB +2418303880,2418304511,US +2418304512,2418304671,GB +2418304672,2418304767,US +2418304768,2418304895,DE +2418304896,2418305151,US +2418305152,2418305279,IN +2418305280,2418305535,ES +2418305536,2418306303,US +2418306304,2418306559,GB +2418306560,2418307327,MU +2418307328,2418307455,US +2418307456,2418307583,PH +2418307584,2418308095,LV +2418308096,2418308351,PH +2418308352,2418308383,GB +2418308384,2418308607,US +2418308608,2418309119,RO +2418309120,2418309631,PL +2418309632,2418310143,US +2418310144,2418310655,PH +2418310656,2418311167,US +2418311168,2418311679,IN +2418311680,2418312703,CZ +2418312704,2418313215,IN +2418313216,2418314239,PH +2418314240,2418314751,IN +2418314752,2418315007,PH +2418315008,2418315135,IN +2418315136,2418315263,US +2418315264,2418315775,IN +2418315776,2418316287,CN +2418316288,2418316799,IN +2418316800,2418317055,AU +2418317056,2418317311,JP +2418317312,2418317823,PH +2418317824,2418318079,US +2418318080,2418318335,IN +2418318336,2418319871,PH +2418319872,2418320127,KR +2418320128,2418320191,US +2418320192,2418320255,AU +2418320256,2418320319,IN +2418320320,2418320383,PH +2418320384,2418321407,US +2418321408,2418322431,PH +2418322432,2418322687,US +2418322688,2418322847,IN +2418322848,2418323455,US +2418323456,2418323711,IN +2418323712,2418323967,US +2418323968,2418324479,IN +2418324480,2418324735,PH +2418324736,2418324799,IN +2418324800,2418324991,US +2418324992,2418326015,IN +2418326016,2418326527,PH +2418326528,2418327039,IN +2418327040,2418327423,US +2418327424,2418327487,PH +2418327488,2418328063,US +2418328064,2418328831,SK +2418328832,2418329599,US +2418329600,2418330367,SK +2418330368,2418331135,US +2418331136,2418331647,IN +2418331648,2418332159,US +2418332160,2418332671,IN +2418332672,2418333183,PH +2418333184,2418334207,IN +2418334208,2418334463,CN +2418334464,2418334719,PH +2418334720,2418339071,IN +2418339072,2418339839,MU +2418339840,2418340351,CN +2418340352,2418340863,US +2418340864,2418341375,IN +2418341376,2418341887,PH +2418341888,2418342911,IN +2418342912,2418343423,PH +2418343424,2418343935,IN +2418343936,2418606079,US +2418606080,2418671615,DE +2418671616,2418737151,US +2418737152,2418802687,NL +2418868224,2419064831,US +2419064832,2419065855,BD +2419065856,2419067903,HK +2419067904,2419068927,CN +2419068928,2419069951,NL +2419069952,2419071999,VN +2419072000,2419073023,PH +2419073024,2419074047,HK +2419074048,2419074303,AU +2419074304,2419074559,IN +2419074560,2419075071,AU +2419075072,2419077119,KR +2419077120,2419079167,IN +2419079168,2419080191,CN +2419080192,2419080703,GB +2419080704,2419081215,SG +2419081216,2419082239,CN +2419082240,2419083263,HK +2419083264,2419085311,IN +2419085312,2419086079,MM +2419086080,2419086335,AU +2419086336,2419087359,BD +2419087360,2419088383,CN +2419088384,2419089407,KR +2419089408,2419089919,AU +2419089920,2419090175,KR +2419090176,2419090431,JP +2419090432,2419091455,KR +2419091456,2419091711,US +2419091712,2419091967,SG +2419091968,2419092479,US +2419092480,2419094527,BD +2419095552,2419096575,PK +2419096576,2419097599,HK +2419097600,2419099647,PK +2419099648,2419100671,SG +2419100672,2419101695,HK +2419101696,2419102719,MY +2419102720,2419103743,BD +2419103744,2419104767,AU +2419104768,2419105791,CN +2419105792,2419106815,BD +2419106816,2419107839,AU +2419107840,2419108863,IN +2419108864,2419109887,CN +2419109888,2419110911,IN +2419110912,2419112959,CN +2419112960,2419116031,HK +2419116032,2419117055,PH +2419117056,2419120127,CN +2419120128,2419121151,HK +2419121152,2419122175,CN +2419122176,2419123199,IN +2419123200,2419124223,SG +2419124224,2419125247,AU +2419125248,2419127295,HK +2419127296,2419128319,AU +2419128320,2419129343,IN +2419129344,2419130367,CN +2419130368,2419326975,US +2419326976,2419392511,CN +2419392512,2419458047,AU +2419458048,2419523583,NL +2419523584,2419589119,AU +2419589120,2419654655,FR +2419654656,2419720191,SE +2419720192,2420047871,US +2420047872,2420113407,SE +2420113408,2420178943,PT +2420178944,2420244479,AT +2420244480,2420310015,NZ +2420310016,2420899839,US +2420899840,2420932299,DE +2420932300,2420932300,NL +2420932301,2420965375,DE +2420965376,2421096447,US +2421161984,2421293055,US +2421293056,2421358591,GB +2421358592,2421424127,US +2421424128,2421489663,NO +2421489664,2421555199,CH +2421555200,2421620735,US +2421620736,2421686271,GB +2421686272,2422145023,US +2422145024,2422154239,NL +2422154240,2422155263,US +2422155264,2422161407,NL +2422161408,2422163455,GB +2422163456,2422165503,US +2422165504,2422167551,HK +2422167552,2422210559,NL +2422210560,2422276095,US +2422276096,2422341631,AU +2422341632,2422407167,GB +2422407168,2423128063,US +2423128064,2423193599,AU +2423193600,2423717887,US +2423717888,2423783423,NL +2423783424,2423848959,FJ +2423848960,2423914495,US +2423914496,2423980031,TR +2423980032,2424045567,CN +2424045568,2424111103,GB +2424111104,2424242175,US +2424242176,2424307711,NO +2424307712,2424438783,US +2424438784,2424471551,AU +2424471552,2424475647,US +2424475648,2425159679,AU +2425159680,2425421823,US +2425421824,2425487359,DE +2425487360,2426667007,US +2426667008,2426732543,NO +2426732544,2426798079,FR +2426798080,2426942463,US +2426942464,2426943487,CA +2426943488,2426961919,US +2426961920,2426994687,CA +2426994688,2427224063,US +2427224064,2427256831,CA +2427256832,2427322367,GB +2427322368,2427453439,US +2427453440,2427536895,NO +2427536896,2427537151,US +2427537152,2427584511,NO +2427584512,2427584579,US +2427584580,2427584639,GB +2427584640,2427584677,US +2427584678,2427584679,GB +2427584680,2427584743,US +2427584744,2427584765,CA +2427584766,2427584767,GB +2427584768,2427584807,US +2427584808,2427584831,GB +2427584832,2427584851,US +2427584852,2427584895,GB +2427584896,2427584903,US +2427584904,2427585023,GB +2427585024,2427585097,US +2427585098,2427585151,GB +2427585152,2427585235,US +2427585236,2427585271,CA +2427585272,2427585275,BR +2427585276,2427585277,MX +2427585278,2427585279,GB +2427585280,2427585313,US +2427585314,2427585343,GB +2427585344,2427585377,US +2427585378,2427585407,GB +2427585408,2427585431,US +2427585432,2427585471,GB +2427585472,2427585527,US +2427585528,2427585631,GB +2427585632,2427585663,ES +2427585664,2427585679,SE +2427585680,2427585683,TR +2427585684,2427585695,GB +2427585696,2427585711,AE +2427585712,2427585791,GB +2427585792,2427585799,NL +2427585800,2427585863,IT +2427585864,2427585887,GB +2427585888,2427585917,DE +2427585918,2427585919,GB +2427585920,2427585959,FR +2427585960,2427585983,GB +2427585984,2427585989,NL +2427585990,2427585999,GB +2427586000,2427586007,CH +2427586008,2427586015,GB +2427586016,2427586017,BE +2427586018,2427586047,GB +2427586048,2427586057,JP +2427586058,2427586059,GB +2427586060,2427586061,JP +2427586062,2427586063,GB +2427586064,2427586065,JP +2427586066,2427586111,GB +2427586112,2427586123,HK +2427586124,2427586129,GB +2427586130,2427586131,SG +2427586132,2427586145,GB +2427586146,2427586147,TW +2427586148,2427586151,GB +2427586152,2427586153,MO +2427586154,2427586175,GB +2427586176,2427586217,AU +2427586218,2427586219,GB +2427586220,2427586221,AU +2427586222,2427586303,GB +2427586304,2427586309,AU +2427586310,2427586311,US +2427586312,2427586337,AU +2427586338,2427586339,US +2427586340,2427586341,AU +2427586342,2427586343,US +2427586344,2427586345,AU +2427586346,2427586347,GB +2427586348,2427586349,AU +2427586350,2427591679,GB +2427591680,2427591936,US +2427591937,2427591937,GB +2427591938,2427591945,US +2427591946,2427591946,AT +2427591947,2427591947,BE +2427591948,2427591948,CZ +2427591949,2427591949,DK +2427591950,2427591950,FI +2427591951,2427591951,FR +2427591952,2427591952,DE +2427591953,2427591953,HU +2427591954,2427591954,IT +2427591955,2427591955,NO +2427591956,2427591956,PL +2427591957,2427591957,PT +2427591958,2427591958,RU +2427591959,2427591959,SA +2427591960,2427591960,ES +2427591961,2427591961,SE +2427591962,2427591962,CH +2427591963,2427591963,NL +2427591964,2427591964,TR +2427591965,2427591965,AE +2427591966,2427591999,US +2427592000,2427592015,IE +2427592016,2427592031,IL +2427592032,2427592047,IN +2427592048,2427592191,US +2427592192,2427592207,SG +2427592208,2427592223,JP +2427592224,2427592239,AU +2427592240,2427592255,CN +2427592256,2427617279,GB +2427617280,2427633663,ES +2427633664,2427650047,GB +2427650048,2427846655,NO +2427846656,2428567551,US +2428567552,2428633087,NO +2428633088,2428698623,CA +2428698624,2428960767,US +2428960768,2429026303,MY +2429026304,2429091839,CH +2429091840,2429288447,US +2429288448,2429353983,FR +2429353984,2429419519,AU +2429419520,2429485055,RU +2429485056,2429550591,US +2429550592,2429566975,AT +2429566976,2429571071,US +2429571072,2429572095,CA +2429572096,2429573119,US +2429573120,2429573375,CA +2429573376,2429575167,US +2429575168,2429577215,CA +2429577216,2429579263,US +2429579264,2429580287,CA +2429580288,2429583359,US +2429583360,2429616127,AT +2429616128,2429643519,NL +2429643520,2429643775,RU +2429643776,2429681663,NL +2429681664,2429796607,US +2429796608,2429797375,GB +2429797376,2429878271,US +2429878272,2429943807,JP +2429943808,2430009343,HK +2430009344,2430140415,US +2430140416,2430152552,CA +2430152553,2430152553,US +2430152554,2430168575,CA +2430168576,2430168591,US +2430168592,2430205951,CA +2430271488,2430918655,US +2430918656,2430922751,BR +2430922752,2431845631,US +2431845632,2431845887,SG +2431845888,2431846143,US +2431846144,2431846399,GB +2431846400,2432172031,US +2432172032,2432237567,BE +2432237568,2432565247,US +2432565248,2432630783,NL +2432630784,2432696319,CN +2432696320,2432794623,NL +2432794624,2432827391,ES +2432827392,2433247231,NL +2433247232,2433247487,GB +2433247488,2433614847,NL +2433614848,2433617919,SI +2433617920,2433626111,EE +2433626112,2433628159,SI +2433628160,2433630207,NL +2433630208,2433638399,GB +2433638400,2433646591,SE +2433646592,2433647359,DE +2433647360,2433647615,US +2433647616,2433648639,CA +2433648640,2433650687,DE +2433650688,2433654783,US +2433654784,2433662975,IT +2433662976,2433667071,DE +2433667072,2433671167,CH +2433671168,2433675263,DE +2433675264,2433677311,PL +2433677312,2433679359,AT +2433679360,2433810431,NL +2433810432,2433875967,GB +2433875968,2435055615,NL +2435055616,2435121151,GB +2435121152,2436300799,NL +2436300800,2436366335,GB +2436366336,2436628479,NL +2436628480,2436630527,BE +2436630528,2436632575,NL +2436632576,2436634623,DK +2436634624,2436694015,BE +2436694016,2436759551,NL +2436759552,2436767743,GB +2436767744,2436767999,NL +2436768000,2436775935,GB +2436775936,2436784127,DE +2436784128,2436825087,GB +2436825088,2441196707,NL +2441196708,2441196708,BE +2441196709,2446983167,NL +2447048704,2447376383,NL +2447376384,2447441919,GB +2447441920,2447507455,DE +2447507456,2447572991,FR +2447572992,2447638527,GB +2447638528,2447704063,DE +2447704064,2447769599,GB +2447769600,2447835135,DE +2447835136,2447900671,FR +2447900672,2447966207,CH +2447966208,2448031743,GB +2448031744,2448097279,CH +2448097280,2448162815,SE +2448162816,2448183295,HU +2448183296,2448183551,BG +2448183552,2448228351,HU +2448228352,2448293887,PL +2448293888,2448359423,FR +2448359424,2448360447,DE +2448360448,2448361471,GB +2448361472,2448363583,FR +2448363584,2448363711,PL +2448363712,2448363839,FR +2448363840,2448363903,PL +2448363904,2448363967,FR +2448363968,2448364159,PL +2448364160,2448364231,FR +2448364232,2448364239,PL +2448364240,2448364287,FR +2448364288,2448364351,PL +2448364352,2448364415,FR +2448364416,2448364543,PL +2448364544,2448364607,FR +2448364608,2448364735,PL +2448364736,2448364863,FR +2448364864,2448364927,PL +2448364928,2448365047,FR +2448365048,2448365051,PL +2448365052,2448365183,FR +2448365184,2448365247,PL +2448365248,2448365311,FR +2448365312,2448365375,PL +2448365376,2448365439,FR +2448365440,2448365503,PL +2448365504,2448365631,FR +2448365632,2448365695,PL +2448365696,2448365759,FR +2448365760,2448365823,PL +2448365824,2448365951,FR +2448365952,2448366015,PL +2448366016,2448366143,FR +2448366144,2448366271,PL +2448366272,2448366591,FR +2448366592,2448367615,PL +2448367616,2448369507,FR +2448369508,2448369511,DE +2448369512,2448369887,FR +2448369888,2448369903,GB +2448369904,2448370015,FR +2448370016,2448370047,FI +2448370048,2448370719,FR +2448370720,2448370727,ES +2448370728,2448371031,FR +2448371032,2448371039,ES +2448371040,2448372031,FR +2448372032,2448372047,ES +2448372048,2448373087,FR +2448373088,2448373095,ES +2448373096,2448374335,FR +2448374336,2448374351,ES +2448374352,2448374399,FR +2448374400,2448374527,GB +2448374528,2448374747,FR +2448374748,2448374751,GB +2448374752,2448375759,FR +2448375760,2448375775,ES +2448375776,2448379903,FR +2448379904,2448383999,PL +2448384000,2448386047,FR +2448386048,2448386175,GB +2448386176,2448387199,FR +2448387200,2448387327,DE +2448387328,2448387359,FR +2448387360,2448387391,CZ +2448387392,2448387527,FR +2448387528,2448387535,ES +2448387536,2448388351,FR +2448388352,2448388479,ES +2448388480,2448389631,FR +2448389632,2448389759,NL +2448389760,2448389887,GB +2448389888,2448390399,FR +2448390400,2448390527,ES +2448390528,2448390655,DE +2448390656,2448390911,FR +2448390912,2448391039,IE +2448391040,2448391167,FR +2448391168,2448391175,ES +2448391176,2448393471,FR +2448393472,2448393983,PL +2448393984,2448394239,FR +2448394240,2448394303,DE +2448394304,2448394463,FR +2448394464,2448394479,DE +2448394480,2448394767,FR +2448394768,2448394771,DE +2448394772,2448394775,FR +2448394776,2448394783,DE +2448394784,2448394943,FR +2448394944,2448395007,DE +2448395008,2448395011,FR +2448395012,2448395015,DE +2448395016,2448395047,FR +2448395048,2448395051,DE +2448395052,2448397311,FR +2448397312,2448398335,DE +2448398336,2448401847,FR +2448401848,2448401855,GB +2448401856,2448401879,FR +2448401880,2448401887,ES +2448401888,2448402783,FR +2448402784,2448402799,ES +2448402800,2448402935,FR +2448402936,2448402943,ES +2448402944,2448403071,GB +2448403072,2448403199,FR +2448403200,2448403455,GB +2448403456,2448404183,FR +2448404184,2448404191,ES +2448404192,2448404415,FR +2448404416,2448404447,GB +2448404448,2448404479,FR +2448404480,2448404511,GB +2448404512,2448405359,FR +2448405360,2448405367,ES +2448405368,2448406623,FR +2448406624,2448406655,FI +2448406656,2448407511,FR +2448407512,2448407519,ES +2448407520,2448407807,FR +2448407808,2448407935,ES +2448407936,2448410623,FR +2448410624,2448410687,GB +2448410688,2448411003,FR +2448411004,2448411007,GB +2448411008,2448411183,FR +2448411184,2448411199,GB +2448411200,2448411439,FR +2448411440,2448411455,GB +2448411456,2448411647,FR +2448411648,2448412415,GB +2448412416,2448412671,FR +2448412672,2448412799,DE +2448412800,2448413855,FR +2448413856,2448413887,FI +2448413888,2448413919,FR +2448413920,2448413927,ES +2448413928,2448414375,FR +2448414376,2448414383,ES +2448414384,2448414591,FR +2448414592,2448414719,DE +2448414720,2448414751,FR +2448414752,2448414783,PL +2448414784,2448414893,FR +2448414894,2448414894,PL +2448414895,2448415487,FR +2448415488,2448415615,IT +2448415616,2448415983,FR +2448415984,2448415991,ES +2448415992,2448417311,FR +2448417312,2448417319,ES +2448417320,2448417967,FR +2448417968,2448417975,ES +2448417976,2448418559,FR +2448418560,2448418687,NL +2448418688,2448418783,FR +2448418784,2448418791,ES +2448418792,2448419087,FR +2448419088,2448419091,DE +2448419092,2448419263,FR +2448419264,2448419327,DE +2448419328,2448419767,FR +2448419768,2448419771,DE +2448419772,2448419799,FR +2448419800,2448419807,DE +2448419808,2448419839,FR +2448419840,2448419903,PL +2448419904,2448419975,FR +2448419976,2448419979,PL +2448419980,2448419987,FR +2448419988,2448419991,PL +2448419992,2448420031,FR +2448420032,2448420095,PL +2448420096,2448420159,FR +2448420160,2448420415,PL +2448420416,2448420543,FR +2448420544,2448420607,PL +2448420608,2448420671,FR +2448420672,2448420735,PL +2448420736,2448420783,FR +2448420784,2448420863,PL +2448420864,2448421887,FR +2448421888,2448422911,DE +2448422912,2448423167,FR +2448423168,2448423423,GB +2448423424,2448423679,FR +2448423680,2448424959,GB +2448424960,2448490495,FR +2448490496,2448556031,AT +2448556032,2448621567,FR +2448621568,2448687103,DE +2448687104,2448752639,AT +2448752640,2448818175,CH +2448818176,2448850943,GB +2448850944,2448851967,US +2448851968,2448883711,GB +2448883712,2448949247,FI +2448949248,2449014783,FR +2449014784,2449031167,IR +2449031168,2449039359,SY +2449039360,2449041407,RO +2449041408,2449042431,NL +2449042432,2449042687,GB +2449042944,2449043199,RO +2449043200,2449043455,FR +2449043456,2449043967,MD +2449043968,2449044223,GB +2449044224,2449044479,RU +2449044480,2449045503,GB +2449045504,2449080319,KZ +2449080320,2449145855,CH +2449145856,2449211391,SE +2449211392,2449276927,CH +2449276928,2449407999,DE +2449408000,2449420287,RU +2449420288,2449422335,DE +2449422336,2449424383,DK +2449424384,2449440767,OM +2449440768,2449442815,NL +2449442816,2449444863,RU +2449444864,2449448959,SK +2449448960,2449457151,KZ +2449457152,2449465343,BG +2449465344,2449467391,GB +2449467392,2449469439,RU +2449469440,2449471487,GB +2449471488,2449473535,RU +2449473536,2449477631,DE +2449477632,2449479679,AL +2449479680,2449481727,FR +2449481728,2449485567,DE +2449485568,2449485823,PL +2449485824,2449487871,IE +2449487872,2449488383,GB +2449488384,2449488895,LU +2449488896,2449489919,KZ +2449489920,2449490943,FR +2449490944,2449491199,DE +2449491200,2449491967,FR +2449491968,2449494015,NL +2449494016,2449496063,UA +2449496064,2449498111,FR +2449498112,2449506303,DE +2449506304,2449522687,LU +2449522688,2449526783,KZ +2449526784,2449527807,IT +2449527808,2449530879,LU +2449530880,2449539071,DE +2449539072,2449604607,US +2449604608,2449670143,NO +2449670144,2449735679,LU +2449735680,2449801215,CH +2449801216,2450194431,US +2450194432,2450259967,AU +2450259968,2450718719,US +2450718720,2450784255,FR +2450784256,2450849791,US +2450849792,2450915327,SE +2450915328,2451032063,US +2451032064,2451032575,AU +2451032576,2452619263,US +2452619264,2452684799,IT +2452684800,2452750335,US +2452750336,2452815871,NL +2452815872,2452881407,JP +2452881408,2452946943,DE +2452946944,2453143551,US +2453143552,2453192703,JP +2453192704,2453209087,CN +2453209088,2453274623,US +2453340160,2453405695,NO +2453405696,2453471231,DE +2453471232,2453536767,US +2453602304,2453667839,US +2453667840,2453733375,ZA +2453733376,2453798911,US +2453798912,2453800959,GB +2453800960,2453803007,RU +2453803008,2453805055,KZ +2453805056,2453807103,FI +2453807104,2453815295,GB +2453815296,2453831679,US +2453831680,2453833727,IR +2453833728,2453835775,ES +2453835776,2453837823,FR +2453837824,2453838591,LU +2453838592,2453838847,AT +2453838848,2453839359,SE +2453839360,2453839871,LU +2453839872,2453852159,RU +2453852160,2453856255,RO +2453856256,2453858303,DE +2453858304,2453860351,SE +2453860352,2453864447,ES +2453864448,2453929983,CH +2453929984,2454061055,US +2454061056,2454126591,GB +2454126592,2454149631,US +2454149632,2454150655,CA +2454150656,2454151167,AE +2454151168,2454192127,US +2454192128,2454257663,NO +2454257664,2454388735,US +2454388736,2454454271,SE +2454454272,2454519807,US +2454519808,2454585343,GB +2454585344,2454716415,US +2454716416,2454781951,GB +2454781952,2454847487,FI +2454847488,2454851583,US +2454851584,2454851839,DK +2454851840,2454853119,US +2454853120,2454853375,DK +2454853376,2454887423,US +2454887424,2454887679,DK +2454887680,2454905919,US +2454905920,2454905951,AR +2454905952,2454913023,US +2454913024,2454978559,CL +2454978560,2455175167,US +2455175168,2455240703,GB +2455240704,2455244799,US +2455244800,2455244943,AU +2455244944,2455244945,US +2455244946,2455245055,AU +2455245056,2455245311,US +2455245312,2455245567,AU +2455245568,2455245823,NL +2455245824,2455246847,AU +2455246848,2455247871,IN +2455247872,2455248127,AU +2455248128,2455248895,US +2455248896,2455257087,TH +2455257088,2455261183,PH +2455261184,2455262207,MY +2455262208,2455263231,KR +2455263232,2455265279,PH +2455265280,2455273471,US +2455273472,2455275519,AU +2455275520,2455277567,US +2455277568,2455278079,AU +2455278080,2455278591,NZ +2455278592,2455279615,US +2455279616,2455280127,MO +2455280128,2455280383,MY +2455280384,2455281663,MO +2455281664,2455285759,IN +2455285760,2455290879,US +2455290880,2455291903,MY +2455291904,2455293951,KH +2455293952,2455300095,US +2455300096,2455302143,FR +2455302144,2455371775,US +2455371776,2455437311,GB +2455437312,2455830527,US +2455830528,2455896063,GB +2455896064,2455961599,US +2455961600,2456027135,JP +2456027136,2456092671,IT +2456092672,2456158207,GB +2456158208,2456223743,CZ +2456223744,2456289279,BE +2456289280,2456354815,NL +2456354816,2456406015,GB +2456406016,2456408063,FR +2456408064,2456420351,GB +2456485888,2456551423,DE +2456551424,2456616959,AT +2456616960,2456682495,CH +2456682496,2456748031,HU +2456748032,2456813567,US +2456846336,2456846591,FR +2456846592,2456846847,CZ +2456862720,2456862975,NL +2456862976,2456863743,US +2456863744,2456863999,DE +2456864000,2456864255,HK +2456864256,2456864511,US +2456864512,2456864767,GB +2456864768,2456865791,US +2456865792,2456866047,AU +2456866048,2456866559,CA +2456866560,2456866815,ZA +2456866816,2456867071,JP +2456875264,2456875775,CA +2456875776,2456876031,JP +2456876032,2456876287,NL +2456876288,2456876543,US +2456876544,2456876799,ZA +2456876800,2456877311,US +2456877312,2456877567,AU +2456877568,2456877823,US +2456877824,2456878079,HK +2456879104,2457075711,US +2457075712,2457141247,AU +2457206784,2457272319,AU +2457272320,2457337855,FI +2457337856,2457339903,RU +2457339904,2457340927,BA +2457340928,2457341183,GB +2457341184,2457341951,BY +2457341952,2457342975,UZ +2457342976,2457343999,RU +2457344000,2457346047,UA +2457346048,2457348095,BY +2457348096,2457360383,RU +2457360384,2457360895,CZ +2457360896,2457361151,RU +2457361152,2457361407,CZ +2457361408,2457362175,RU +2457362176,2457362431,UA +2457362432,2457362687,GB +2457362688,2457362943,UA +2457362944,2457363455,RU +2457363456,2457363967,UA +2457363968,2457364479,GB +2457364480,2457365503,RU +2457365504,2457366015,CZ +2457366016,2457366527,RU +2457366528,2457367551,GB +2457367552,2457368575,RU +2457368576,2457370623,CZ +2457370624,2457376767,BY +2457376768,2457377791,DE +2457377792,2457378047,FR +2457378048,2457378815,DE +2457378816,2457380095,NL +2457380096,2457380863,RU +2457380864,2457381631,UA +2457381632,2457382399,RU +2457382400,2457382911,UA +2457382912,2457383935,RU +2457383936,2457384959,UA +2457384960,2457388543,RU +2457388544,2457388799,UA +2457388800,2457390591,CZ +2457390592,2457392127,RU +2457392128,2457392639,KG +2457392640,2457392895,PL +2457392896,2457393151,UA +2457393152,2457394175,RU +2457394176,2457394431,UA +2457394432,2457394687,RU +2457394688,2457394943,UA +2457394944,2457395455,RU +2457395456,2457395711,UA +2457395712,2457395967,CZ +2457395968,2457396223,RU +2457396224,2457397247,DE +2457397248,2457399295,RU +2457399296,2457399551,UA +2457399552,2457399807,RU +2457399808,2457400319,CZ +2457400320,2457400575,UA +2457400576,2457400831,CZ +2457400832,2457402367,RU +2457402368,2457403391,SY +2457403392,2457520895,US +2457520896,2457521151,BE +2457521152,2457599999,US +2457600000,2457665535,GR +2457665536,2458058751,US +2458058752,2458124287,CA +2458124288,2458189823,US +2458189824,2458255359,IT +2458255360,2458320895,BR +2458320896,2458386431,US +2458386432,2458451967,CH +2458451968,2458648575,US +2458648576,2458714111,DE +2458714112,2458779647,ZA +2458779648,2459631615,US +2459631616,2459697151,CL +2459697152,2459828223,US +2459828224,2459846655,RU +2459846656,2459847167,FR +2459847168,2459847679,UA +2459847680,2459848191,RU +2459848192,2459848703,FR +2459848704,2459860991,RU +2459860992,2459893759,ES +2459893760,2459959295,CH +2459959296,2460024831,JP +2460024832,2460090367,FI +2460090368,2460155903,GB +2460155904,2460221439,US +2460221440,2460286975,BR +2460286976,2460549119,US +2460549120,2460614655,GB +2460614656,2460680191,US +2460680192,2460745727,NZ +2460745728,2460811263,NO +2460811264,2460876799,SE +2460876800,2460942335,US +2460942336,2461007871,BE +2461007872,2461138943,GB +2461138944,2461204479,AU +2461204480,2461270015,GB +2461270016,2461401087,US +2461401088,2461466623,ZA +2461466624,2461597695,US +2461597696,2461599743,CH +2461599744,2461601791,SE +2461601792,2461605887,GB +2461605888,2461607935,LB +2461607936,2461609983,FR +2461609984,2461611007,BE +2461611008,2461611519,NL +2461611520,2461611775,BE +2461611776,2461612031,NL +2461612032,2461613567,IL +2461613568,2461613823,PS +2461613824,2461614079,IL +2461614080,2461622271,CH +2461622272,2461630463,DE +2461630464,2461646847,NL +2461646848,2461648895,RU +2461648896,2461649023,BY +2461649024,2461649919,RU +2461649920,2461650047,US +2461650048,2461650175,RS +2461650176,2461650303,PT +2461650304,2461650431,TW +2461650432,2461650559,MA +2461650560,2461650687,NZ +2461650688,2461659391,RU +2461659392,2461659647,UA +2461659648,2461662463,RU +2461662464,2461662719,NL +2461662720,2461663231,RU +2461663232,2461794303,US +2461794304,2461859839,GB +2461859840,2461990911,US +2461990912,2462056447,GB +2462056448,2462121983,NO +2462121984,2462187519,PT +2462187520,2462253055,GB +2462253056,2462326783,AU +2462326784,2462328831,IN +2462328832,2462329855,ID +2462329856,2462330879,IN +2462330880,2462331903,BD +2462331904,2462332927,HK +2462332928,2462333951,CN +2462333952,2462334975,IN +2462334976,2462335999,VN +2462336000,2462339071,CN +2462339072,2462342143,HK +2462342144,2462343167,CN +2462343168,2462344191,ID +2462344192,2462345215,US +2462345216,2462347263,ID +2462347264,2462349311,CN +2462349312,2462350335,IN +2462350336,2462351359,CN +2462351360,2462384127,GM +2462384128,2462449663,US +2462449664,2462455807,GB +2462455808,2462456831,US +2462456832,2462457343,GB +2462457344,2462457855,US +2462457856,2462458879,GB +2462458880,2462459391,US +2462459392,2462463999,GB +2462464000,2462464767,US +2462464768,2462467071,GB +2462467072,2462467327,US +2462467328,2462467583,GB +2462467584,2462468095,US +2462468096,2462469631,GB +2462469632,2462470143,US +2462470144,2462471423,GB +2462471424,2462472447,US +2462472448,2462489599,GB +2462489600,2462490111,US +2462490112,2462490367,GB +2462490368,2462490623,US +2462490624,2462519039,GB +2462519040,2462519295,US +2462519296,2462520319,GB +2462520320,2462521343,US +2462521344,2462526602,GB +2462526603,2462526603,US +2462526604,2462542847,GB +2462542848,2462544383,US +2462544384,2462547455,GB +2462547456,2462547967,US +2462547968,2462550015,GB +2462550016,2462552063,US +2462552064,2462553087,GB +2462553088,2462553599,US +2462553600,2462554111,GB +2462554112,2462554735,US +2462554736,2462554736,GB +2462554737,2462555135,US +2462555136,2462572543,GB +2462572544,2462576639,US +2462576640,2462578687,GB +2462578688,2462580735,US +2462580736,2462580736,GB +2462580737,2462597266,US +2462597267,2462597267,GB +2462597268,2462614527,US +2462614528,2462614783,GB +2462614784,2462616574,US +2462616575,2462616575,GB +2462616576,2463236095,US +2463236096,2463301631,AT +2463301632,2463367167,FI +2463367168,2463432703,SI +2463432704,2463498239,NO +2463498240,2463629311,US +2463629312,2463694847,CH +2463694848,2463825919,US +2463825920,2463891455,ES +2463891456,2463911935,LU +2463911936,2463916031,FR +2463916032,2463956991,LU +2463956992,2464022527,AU +2464022528,2464153599,US +2464153600,2464219135,NO +2464219136,2464284671,US +2464284672,2464350207,VI +2464350208,2464415743,GB +2464415744,2464481279,CH +2464481280,2464546815,US +2464546816,2464743423,ZA +2464743424,2464808959,US +2464808960,2464874495,DE +2464874496,2465267711,US +2465267712,2465333247,IT +2465333248,2465338879,US +2465338880,2465339135,SG +2465339136,2465660927,US +2465660928,2465662975,RU +2465662976,2465665023,CH +2465665024,2465667071,IT +2465667072,2465669119,SI +2465669120,2465671167,RU +2465671168,2465672703,IE +2465672704,2465672959,BG +2465672960,2465673215,IE +2465673216,2465677311,IM +2465677312,2465679359,IT +2465679360,2465681407,NL +2465681408,2465683455,SE +2465683456,2465685503,FR +2465685504,2465690367,DE +2465690368,2465693695,IT +2465693696,2465697791,NO +2465697792,2465718271,SE +2465718272,2465722367,NO +2465722368,2465726463,SE +2465726464,2465791999,CH +2465792000,2465857535,FR +2465857536,2465923071,US +2465923072,2465988607,SA +2465988608,2466054143,US +2466054144,2466185215,SE +2466185216,2466189311,GB +2466189312,2466189567,ES +2466189568,2466191103,NL +2466191104,2466191167,ES +2466191168,2466191359,NL +2466191360,2466193407,CZ +2466193408,2466199551,NL +2466199552,2466201599,AT +2466201600,2466209791,MK +2466209792,2466211839,ES +2466211840,2466213887,GB +2466215936,2466216703,US +2466216704,2466216959,DE +2466216960,2466217727,SG +2466217728,2466217983,DE +2466217984,2466226175,BA +2466226176,2466228223,IT +2466228224,2466230271,FR +2466230272,2466232319,EE +2466232320,2466234367,ES +2466234368,2466242559,RU +2466242560,2466250751,GE +2466250752,2466318335,US +2466318336,2466318591,SG +2466318592,2466323455,US +2466323456,2466323711,SG +2466323712,2466326015,US +2466326016,2466326271,SG +2466326272,2466336767,US +2466336768,2466337023,SG +2466337024,2466643967,US +2466643968,2466709503,KR +2466709504,2466775039,HU +2466775040,2466840575,HK +2466840576,2466906111,US +2466906112,2466971647,AU +2466971648,2467037183,US +2467037184,2467102719,NL +2467102720,2467233791,SE +2467233792,2468020223,US +2468020224,2468085759,GR +2468085760,2468151295,US +2468151296,2468216831,DK +2468216832,2468282367,KZ +2468282368,2468347903,US +2468347904,2468478975,CZ +2468478976,2468937727,US +2468937728,2469003263,AU +2469003264,2469068799,US +2469068800,2469134335,KR +2469134336,2469199871,SE +2469199872,2469265407,RU +2469265408,2469396479,KR +2469396480,2469527551,US +2469527552,2469593087,TH +2469593088,2469658623,US +2469658624,2469724159,GR +2469724160,2469789695,US +2469789696,2469855231,DE +2469855232,2470182911,US +2470182912,2470248447,CH +2470248448,2470510591,US +2470510592,2470576127,BR +2470576128,2470641663,AU +2470641664,2470649855,BE +2470649856,2470707199,LU +2470707200,2470772735,GB +2470772736,2470838271,AU +2470838272,2471194623,US +2471194624,2471198719,CO +2471198720,2471218175,US +2471218176,2471218687,NL +2471218688,2471219199,US +2471219200,2471219455,CA +2471219456,2471219711,GB +2471219712,2471223295,IL +2471223296,2471231487,US +2471231488,2471297023,AU +2471297024,2471362559,GB +2471428096,2471624703,US +2471624704,2471690239,SA +2471690240,2471821311,ES +2471821312,2471886847,US +2471886848,2472083455,CH +2472083456,2472148991,GB +2472148992,2472214527,US +2472214528,2472280063,RS +2472280064,2472296447,US +2472296448,2472300543,CA +2472300544,2472302591,PR +2472302592,2472312831,US +2472312832,2472345599,JP +2472345600,2472411135,BE +2472411136,2472476671,FR +2472476672,2472542207,GR +2472542208,2472607743,ES +2472607744,2472673279,US +2472673280,2472869887,FR +2472869888,2472935423,US +2472935424,2473000959,GR +2473000960,2473332735,US +2473332736,2473333247,AE +2473333248,2473336831,US +2473336832,2473338879,AU +2473338880,2473342975,US +2473342976,2473345023,GB +2473345024,2473345535,US +2473345536,2473346047,AE +2473346048,2473348095,US +2473348096,2473348607,SA +2473348608,2473379839,US +2473379840,2473381887,AU +2473381888,2473394175,US +2473394176,2473459711,AU +2473459712,2473525247,ZA +2473525248,2473656319,NO +2473656320,2473721855,US +2473721856,2473785708,GB +2473785709,2473785709,HK +2473785710,2473787391,GB +2473787392,2474049535,US +2474049536,2474115071,GB +2474115072,2474246143,US +2474246144,2474377215,IT +2474377216,2474442751,US +2474442752,2474508287,AT +2474508288,2474573823,US +2474573824,2474639359,FR +2474639360,2474901503,US +2474901504,2474967039,AU +2474967040,2475130879,US +2475130880,2475135487,FR +2475135488,2475135495,ES +2475135496,2475135719,FR +2475135720,2475135727,DE +2475135728,2475136391,FR +2475136392,2475136395,IT +2475136396,2475139391,FR +2475139392,2475139455,ES +2475139456,2475141935,FR +2475141936,2475141951,FI +2475141952,2475143295,FR +2475143296,2475143359,DE +2475143360,2475143423,IE +2475143424,2475143551,GB +2475143552,2475143615,BE +2475143616,2475143647,CZ +2475143648,2475143679,PT +2475143680,2475143743,DE +2475143744,2475143783,FR +2475143784,2475143791,ES +2475143792,2475143807,FR +2475143808,2475143935,DE +2475143936,2475143999,FR +2475144000,2475144063,IT +2475144064,2475145087,FR +2475145088,2475145151,BE +2475145152,2475145215,ES +2475145216,2475145343,DE +2475145344,2475145471,GB +2475145472,2475145615,FR +2475145616,2475145631,LT +2475145632,2475145727,FR +2475145728,2475145855,GB +2475145856,2475145919,DE +2475145920,2475146063,FR +2475146064,2475146079,LT +2475146080,2475146239,FR +2475146240,2475146303,IT +2475146304,2475146495,FR +2475146496,2475146559,NL +2475146560,2475146943,FR +2475146944,2475146975,PT +2475146976,2475148351,FR +2475148352,2475148415,PL +2475148416,2475148521,FR +2475148522,2475148522,PL +2475148523,2475148543,FR +2475148544,2475148607,PL +2475148608,2475148671,FR +2475148672,2475148735,PL +2475148736,2475148796,FR +2475148797,2475148797,PL +2475148798,2475149119,FR +2475149120,2475149247,PL +2475149248,2475149279,FR +2475149280,2475149311,PL +2475149312,2475149375,ES +2475149376,2475149567,FR +2475149568,2475149583,CH +2475149584,2475149599,LT +2475149600,2475149695,FR +2475149696,2475149823,IE +2475149824,2475149951,DE +2475149952,2475150207,FR +2475150208,2475150335,GB +2475150336,2475150495,FR +2475150496,2475150527,FI +2475150528,2475151231,FR +2475151232,2475151359,IT +2475151360,2475152383,PL +2475152384,2475153471,FR +2475153472,2475153535,GB +2475153536,2475153663,FR +2475153664,2475153919,GB +2475153920,2475155807,FR +2475155808,2475155839,GB +2475155840,2475156063,FR +2475156064,2475156095,FI +2475156096,2475156479,FR +2475156480,2475156607,ES +2475156608,2475157887,FR +2475157888,2475158015,BE +2475158016,2475158303,FR +2475158304,2475158335,PL +2475158336,2475159423,FR +2475159424,2475159551,DE +2475159552,2475159711,FR +2475159712,2475159743,ES +2475159744,2475160063,FR +2475160064,2475160079,GB +2475160080,2475160351,FR +2475160352,2475160383,PL +2475160384,2475160447,FR +2475160448,2475160575,NL +2475160576,2475160767,FR +2475160768,2475160799,FI +2475160800,2475161087,FR +2475161088,2475161215,ES +2475161216,2475161407,FR +2475161408,2475161439,FI +2475161440,2475161471,PL +2475161472,2475161983,FR +2475161984,2475161999,LT +2475162000,2475162351,FR +2475162352,2475162367,ES +2475162368,2475162495,DE +2475162496,2475162623,IT +2475162624,2475163647,FR +2475163648,2475556863,US +2475556864,2475622399,DE +2475622400,2475687935,GB +2475687936,2475884543,US +2475884544,2476277759,GB +2476277760,2476474367,US +2476474368,2476539903,ES +2476539904,2476605439,JP +2476605440,2476670975,MY +2476670976,2476802047,US +2476802048,2476867583,IL +2476867584,2476998655,IT +2476998656,2477195263,US +2477195264,2477260799,CH +2477260800,2477457407,US +2477457408,2477522943,FR +2477522944,2477588479,DE +2477588480,2477654015,FR +2477654016,2477719551,US +2477719552,2477785087,SK +2477785088,2477850623,JP +2477850624,2478047231,US +2478047232,2478112767,SE +2478112768,2478178303,NL +2478178304,2478309375,US +2478309376,2478374911,GB +2478374912,2478440447,US +2478440448,2478505983,SE +2478505984,2478571519,US +2478571520,2478655487,GB +2478655488,2478656511,FR +2478656512,2478702591,GB +2478702592,2478899199,US +2478899200,2478964735,GB +2478964736,2479030271,CA +2479030272,2479095807,US +2479095808,2479161343,FR +2479161344,2479226879,GB +2479226880,2479357951,US +2479357952,2479423487,AU +2479423488,2479489023,GB +2479489024,2479620095,US +2479620096,2479685631,DE +2479685632,2479947775,US +2479947776,2480013311,AU +2480013312,2480078847,FR +2480078848,2480144383,AU +2480209920,2480275455,SK +2480275456,2480340991,SE +2480340992,2480406527,FR +2480406528,2480668671,US +2480668672,2480734207,SE +2480734208,2481192959,US +2481192960,2481455103,CZ +2481455104,2481520639,SK +2481520640,2481586687,IL +2481586688,2481587199,GB +2481587200,2481848319,IL +2481848320,2482175999,US +2482176000,2482241535,GB +2482241536,2482634751,US +2482634752,2482700287,FR +2482700288,2482765823,CZ +2482765824,2482831359,IE +2482831360,2483027967,US +2483027968,2483093503,DO +2483093504,2483159039,US +2483159040,2483224575,SE +2483224576,2483290111,ES +2483290112,2483421183,US +2483421184,2483486719,HU +2483486720,2486566911,US +2486566912,2486632447,CH +2486632448,2486697983,US +2486697984,2486763519,ES +2486763520,2486927359,US +2486927360,2486928127,CA +2486928128,2486928895,US +2486928896,2486929151,CA +2486929152,2486929407,US +2486929408,2486929663,CA +2486929664,2486932735,US +2486932736,2486932991,CA +2486932992,2486940671,US +2486940672,2486941183,CA +2486941184,2486945279,US +2486945280,2486945791,CA +2486945792,2486946815,US +2486946816,2486947327,CA +2486947328,2486949887,US +2486949888,2486951423,CA +2486951424,2486952959,US +2486952960,2486953471,CA +2486953472,2486956543,US +2486956544,2486957055,CA +2486957056,2486960127,US +2486960128,2487025663,FR +2487025664,2487156735,US +2487156736,2487222271,PT +2487222272,2487222527,HK +2487222528,2487222783,JP +2487222784,2487223039,AU +2487223040,2487223295,SG +2487223296,2487224319,US +2487224320,2487224831,GB +2487224832,2487227391,US +2487227392,2487227647,MX +2487227648,2487236607,US +2487236608,2487237631,GB +2487237632,2487238143,MF +2487238144,2487238655,US +2487238656,2487246847,CA +2487246848,2487353343,US +2487353344,2487361535,HK +2487361536,2487363583,US +2487363584,2487365631,CA +2487365632,2487369727,HK +2487369728,2487386111,PF +2487386112,2487394303,SG +2487394304,2487418879,US +2487418880,2487549951,JP +2487549952,2487615487,PT +2487615488,2487681023,CN +2487681024,2487746559,PT +2487746560,2488066047,US +2488066048,2488074239,IL +2488074240,2488205311,US +2488205312,2488270847,GB +2488270848,2488336383,US +2488336384,2488401919,PL +2488401920,2488532991,NO +2488532992,2488795135,US +2488795136,2488860671,GB +2488860672,2489647103,US +2489647104,2489712639,DO +2489712640,2489745407,PE +2489745408,2489778175,HT +2489778176,2489843711,DO +2489843712,2490007551,US +2490007552,2490014011,GB +2490014012,2490014012,US +2490014013,2490015743,GB +2490015744,2490043391,US +2490043392,2490043647,GB +2490043648,2490236927,US +2490236928,2490302463,LU +2490302464,2490695679,US +2490695680,2490761215,CA +2490761216,2491154431,NO +2491154432,2491875327,US +2491875328,2492006399,SE +2492006400,2492071935,US +2492071936,2492137471,SE +2492137472,2492203007,US +2492203008,2492268543,NO +2492268544,2492399615,US +2492399616,2492465151,FR +2492465152,2492530687,US +2492530688,2492596223,AU +2492596224,2492727295,US +2492727296,2492792831,SE +2492792832,2492923903,US +2492923904,2492989439,OM +2492989440,2493513727,US +2493513728,2493579263,SE +2493579264,2493644799,JP +2493644800,2493740031,US +2493740032,2493740095,CN +2493740096,2493756415,US +2493756416,2493757439,CA +2493759488,2494103551,US +2494103552,2494169087,FR +2494169088,2494562303,US +2494562304,2494627839,GB +2494627840,2494676991,US +2494676992,2494683391,AU +2494683392,2494683647,US +2494683648,2494685183,AU +2494685184,2494689791,US +2494689792,2494690047,IN +2494690048,2494889983,US +2494889984,2494955519,GB +2494955520,2495021055,AU +2495021056,2495152127,US +2495217664,2495283199,US +2495283200,2495348735,CH +2495348736,2495807487,US +2495807488,2495873023,AU +2495873024,2495938559,CH +2495938560,2496004095,GB +2496004096,2496069631,AT +2496069632,2496135167,US +2496135168,2496200703,NL +2496200704,2497682431,MX +2497682432,2497683455,EC +2497683456,2498475007,MX +2498475008,2498476031,EC +2498476032,2499477503,MX +2499477504,2499543039,DE +2499543040,2499545087,GB +2499545088,2499547135,IE +2499547136,2499559423,GB +2499559424,2499575807,NO +2499575808,2499612671,GB +2499612672,2499616767,NL +2499616768,2499616801,US +2499616802,2499616830,ES +2499616831,2499617023,US +2499617024,2499617279,IE +2499617280,2499617535,NL +2499617536,2499624959,US +2499624960,2499641343,FR +2499641344,2499665919,GB +2499665920,2499667455,US +2499667456,2499668735,FR +2499668736,2499668991,US +2499668992,2499670527,GB +2499670528,2499739647,US +2499739648,2499805183,DO +2499805184,2499870719,TR +2499870720,2500001791,US +2500001792,2500034559,GE +2500034560,2500038655,GB +2500038656,2500040703,IT +2500040704,2500042751,LB +2500042752,2500046847,SA +2500046848,2500047615,IT +2500047616,2500047871,GR +2500047872,2500048895,IT +2500048896,2500050943,MD +2500050944,2500067327,KZ +2500067328,2500132991,US +2500132992,2500133023,NL +2500133024,2500135679,US +2500135680,2500135935,NL +2500135936,2500138367,US +2500138368,2500138399,BE +2500138400,2500141055,US +2500141056,2500141311,IE +2500141312,2500141823,US +2500141824,2500142847,IE +2500142848,2500143103,GB +2500143104,2500144127,IE +2500144128,2500144895,US +2500144896,2500145151,IE +2500145152,2500149247,US +2500149248,2500150271,GB +2500150272,2500150559,US +2500150560,2500150591,GB +2500150592,2500150655,US +2500150656,2500150719,GB +2500150720,2500154751,US +2500154752,2500154815,GB +2500154816,2500155199,US +2500155200,2500155391,GB +2500155392,2500155647,US +2500155648,2500155903,GB +2500155904,2500161023,US +2500161024,2500161535,GB +2500161536,2500161791,US +2500161792,2500162047,GB +2500162048,2500166207,US +2500166208,2500166223,GB +2500166224,2500170751,US +2500170752,2500170752,FI +2500170753,2500177935,US +2500177936,2500177943,PL +2500177944,2500180735,US +2500180736,2500181503,HR +2500181504,2500188223,US +2500188224,2500188287,CH +2500188288,2500188415,US +2500188416,2500188447,CH +2500188448,2500188679,US +2500188680,2500188687,CH +2500188688,2500188831,US +2500188832,2500188863,CH +2500188864,2500190207,US +2500190208,2500194303,FR +2500194304,2500194399,US +2500194400,2500194431,FI +2500194432,2500196351,US +2500196352,2500198399,FI +2500198400,2500199471,GB +2500199472,2500199475,IE +2500199476,2500202495,GB +2500202496,2500202879,US +2500202880,2500203007,ES +2500203008,2500203519,US +2500203520,2500204543,IT +2500204544,2500205567,US +2500205568,2500205823,PL +2500205824,2500211671,US +2500211672,2500211679,RO +2500211680,2500211728,US +2500211729,2500211730,SI +2500211731,2500212415,US +2500212416,2500212423,CH +2500212424,2500212991,US +2500212992,2500213247,ES +2500213248,2500213279,US +2500213280,2500213287,FI +2500213288,2500221455,US +2500221456,2500221459,FR +2500221460,2500222975,US +2500222976,2500225551,FR +2500225552,2500225559,ES +2500225560,2500226615,FR +2500226616,2500226623,NL +2500226624,2500230041,FR +2500230042,2500230042,GB +2500230043,2500231167,FR +2500231168,2500235775,DK +2500235776,2500236031,ES +2500236032,2500236837,DK +2500236838,2500236838,ES +2500236839,2500237791,DK +2500237792,2500237799,IT +2500237800,2500238047,DK +2500238048,2500238055,FR +2500238056,2500239359,DK +2500239360,2500243455,FR +2500243456,2500246271,US +2500246272,2500246527,GB +2500246528,2500247551,US +2500247552,2500248575,ES +2500248576,2500249599,US +2500249600,2500249855,ES +2500249856,2500251135,US +2500251136,2500251647,ES +2500251648,2500263935,US +2500263936,2500272127,ES +2500272128,2500272625,US +2500272626,2500272626,GB +2500272627,2500273663,US +2500273664,2500273919,GB +2500273920,2500275465,US +2500275466,2500275467,GB +2500275468,2500275711,US +2500275712,2500277503,GB +2500277504,2500278751,US +2500278752,2500278783,GB +2500278784,2500288511,US +2500288512,2500290815,FR +2500290816,2500291327,US +2500291328,2500291583,FR +2500291584,2500292607,US +2500292608,2500296703,DE +2500296704,2500313855,US +2500313856,2500314111,AT +2500314112,2500319231,US +2500319232,2500321279,ES +2500321280,2500321535,US +2500321536,2500321791,SK +2500321792,2500392959,US +2500392960,2500393215,IN +2500393216,2500393983,US +2500393984,2500394239,GB +2500394240,2500532749,US +2500532750,2500532750,GR +2500532751,2500535327,US +2500535328,2500535335,IE +2500535336,2500535371,US +2500535372,2500535375,IE +2500535376,2500535399,US +2500535400,2500535407,IE +2500535408,2500535807,US +2500535808,2500536319,NL +2500536320,2500538367,GB +2500538368,2500542751,US +2500542752,2500542755,NL +2500542756,2500544767,US +2500544768,2500545023,GR +2500545024,2500545703,US +2500545704,2500545711,SE +2500545712,2500546559,US +2500546560,2500549271,GB +2500549272,2500549279,ES +2500549280,2500552703,GB +2500552704,2500553727,US +2500553728,2500554239,GB +2500554240,2500554379,US +2500554380,2500554487,DE +2500554488,2500554751,US +2500554752,2500556295,FR +2500556296,2500556303,CZ +2500556304,2500558847,FR +2500558848,2500560895,US +2500560896,2500562943,GB +2500562944,2500563199,ES +2500563200,2500567039,US +2500567040,2500569687,GB +2500569688,2500569695,BE +2500569696,2500575231,GB +2500575232,2500591615,US +2500591616,2500596223,GB +2500596224,2500596735,CH +2500596736,2500599807,GB +2500599808,2500599935,US +2500599936,2500599951,DK +2500599952,2500616191,US +2500616192,2500624383,IT +2500624384,2500632575,US +2500632576,2500640767,GB +2500640768,2500644863,US +2500644864,2500646911,FR +2500646912,2500648959,ES +2500648960,2500653567,US +2500653568,2500654079,NL +2500654080,2500661247,US +2500661248,2500664319,ES +2500664320,2500665087,US +2500665088,2500665343,ES +2500665344,2500666463,US +2500666464,2500666471,LU +2500666472,2500674623,US +2500674624,2500674687,DE +2500674688,2500680447,US +2500680448,2500680703,SE +2500680704,2500681759,US +2500681760,2500681767,PL +2500681768,2500682495,US +2500682496,2500682751,PL +2500682752,2500687103,US +2500687104,2500687359,FR +2500687360,2500687871,US +2500687872,2500689919,FR +2500689920,2500694271,US +2500694272,2500697087,IT +2500697088,2500702463,US +2500702464,2500702471,GB +2500702472,2500702719,US +2500702720,2500702975,NL +2500702976,2500719103,US +2500719104,2500721151,IE +2500721152,2500723799,US +2500723800,2500723807,ES +2500723808,2500726783,US +2500726784,2500727807,GB +2500727808,2500728063,US +2500728064,2500728319,GB +2500728320,2500732063,US +2500732064,2500732071,GB +2500732072,2500739599,US +2500739600,2500739607,DE +2500739608,2500740417,US +2500740418,2500740418,DE +2500740419,2500743167,US +2500743168,2500744191,GB +2500744192,2500746239,US +2500746240,2500747263,GB +2500747264,2500748543,US +2500748544,2500748799,ES +2500748800,2500755455,US +2500755456,2500756647,GB +2500756648,2500756655,IT +2500756656,2500759159,GB +2500759160,2500759167,NL +2500759168,2500761631,GB +2500761632,2500761639,FR +2500761640,2500761879,GB +2500761880,2500761887,FR +2500761888,2500763647,GB +2500763648,2500777983,US +2500777984,2500777991,FR +2500777992,2500984831,US +2500984832,2500993023,GB +2500993024,2501000721,US +2501000722,2501000722,GB +2501000723,2501001215,US +2501001216,2501033983,GB +2501033984,2501321471,US +2501321472,2501321727,CZ +2501321728,2501574655,US +2501574656,2501640191,KZ +2501640192,2502033407,US +2502033408,2502037503,LU +2502037504,2502041599,US +2502041600,2502045695,ES +2502045696,2502047743,US +2502047744,2502049791,ES +2502049792,2502098943,US +2502098944,2502164479,IT +2502164480,2502166527,GB +2502166528,2502173695,US +2502173696,2502174207,DE +2502174208,2502180863,US +2502180864,2502181119,FI +2502181120,2502221823,US +2502221824,2502222591,ES +2502222592,2502222847,US +2502222848,2502223871,ES +2502223872,2502224895,US +2502224896,2502225151,ES +2502225152,2503016447,US +2503016448,2503147519,IL +2503147520,2503344127,US +2503344128,2503376895,AF +2503376896,2503409663,JP +2503409664,2503475199,US +2503475200,2503477487,CA +2503477488,2503477503,US +2503477504,2503486015,CA +2503486016,2503486023,US +2503486024,2503492479,CA +2503492480,2503492543,US +2503492544,2503518078,CA +2503518079,2503518079,US +2503518080,2503518080,CA +2503518081,2503518082,US +2503518083,2503525055,CA +2503525056,2503525119,US +2503525120,2503530911,CA +2503530912,2503530943,US +2503530944,2503533375,CA +2503533376,2503533376,US +2503533377,2503540735,CA +2503540736,2503671807,US +2503671808,2503737343,NL +2503737344,2503868415,US +2503868416,2503876607,RU +2503880704,2503882751,RU +2503882752,2503884799,DE +2503884800,2503901183,SI +2503901184,2503905279,IT +2503905280,2503907327,CZ +2503907328,2503909375,FR +2503909376,2503911423,RU +2503911424,2503915519,ES +2503915520,2503917567,IT +2503917568,2503933951,BG +2503933952,2504180735,US +2504180736,2504180991,ES +2504180992,2504468479,US +2504468480,2504470527,ES +2504470528,2504472575,IT +2504472576,2504472831,US +2504472832,2504473599,ES +2504473600,2504474623,US +2504474624,2504482815,HR +2504482816,2504486911,ES +2504486912,2504491007,US +2504491008,2504499199,IT +2504499200,2504499967,IE +2504499968,2504501385,US +2504501386,2504501386,ES +2504501387,2504501759,US +2504501760,2504502015,GB +2504502016,2504502271,US +2504502272,2504502527,ES +2504502528,2504502730,US +2504502731,2504502731,ES +2504502732,2504918642,US +2504918643,2504918643,IL +2504918644,2504919670,US +2504919671,2504919671,IL +2504919672,2504941293,US +2504941294,2504941294,IL +2504941295,2504945432,US +2504945433,2504945433,IL +2504945434,2504949759,US +2504949760,2504982527,IL +2504982528,2505457663,US +2505457664,2505459711,IE +2505459712,2505465855,US +2505465856,2505467903,GB +2505467904,2505469439,US +2505469440,2505469951,ES +2505469952,2505474047,NL +2505474048,2505482239,US +2505482240,2505484287,NL +2505484288,2505486335,US +2505486336,2505490431,FR +2505490432,2505498623,HR +2505498624,2505502719,US +2505502720,2505504767,UA +2505504768,2505506815,FI +2505506816,2505572351,US +2505572352,2505637887,IL +2505637888,2505703423,US +2505703424,2505768959,PT +2505768960,2505770495,US +2505770496,2505771007,ES +2505771008,2505772543,US +2505772544,2505772799,GB +2505772800,2505789439,US +2505789440,2505792511,FR +2505792512,2505793535,US +2505793536,2505803775,ES +2505803776,2506293247,US +2506293248,2506358783,CA +2506358784,2506359039,ES +2506359040,2506359295,GB +2506359296,2506361343,ES +2506361344,2506361855,US +2506361856,2506362879,ES +2506362880,2506363903,US +2506363904,2506364415,ES +2506364416,2506364671,US +2506364672,2506366975,ES +2506366976,2506399743,US +2506399744,2506401023,IT +2506401024,2506401279,US +2506401280,2506405887,IT +2506405888,2506498047,US +2506498048,2506499071,FR +2506499072,2506503167,US +2506503168,2506504191,ES +2506504192,2506506239,US +2506506240,2506514431,NO +2506514432,2506522623,ES +2506522624,2506526719,GB +2506526720,2506817535,US +2506817536,2506820351,ES +2506820352,2506821119,US +2506821120,2506821631,ES +2506821632,2507124735,US +2507124736,2507124991,IN +2507124992,2507145215,US +2507173888,2507174143,US +2507175936,2507177983,CA +2507183360,2507183615,US +2507210752,2507350015,US +2507350016,2507354111,CA +2507354112,2508062719,US +2508062720,2508064767,CH +2508064768,2508066815,ES +2508066816,2508068863,RU +2508068864,2508070911,HU +2508070912,2508075007,ES +2508075008,2508077055,CH +2508077056,2508079103,BE +2508079104,2508081151,DE +2508081152,2508081407,NL +2508081408,2508081445,IL +2508081446,2508081446,US +2508081447,2508081663,IL +2508081664,2508081919,GB +2508081920,2508081920,NL +2508081921,2508082431,GB +2508082432,2508082687,DE +2508082688,2508083199,GB +2508083200,2508085247,IS +2508085248,2508087295,PS +2508087296,2508089343,RU +2508089344,2508091391,GB +2508091392,2508095487,AZ +2508095488,2508103679,SI +2508103680,2508105727,ES +2508105728,2508107775,RU +2508107776,2508109823,FI +2508109824,2508111871,DE +2508111872,2508128255,RU +2508128256,2508259327,US +2508259328,2508263423,KR +2508263424,2508292095,SG +2508292096,2508308479,IN +2508308480,2508324863,ID +2508324864,2508455935,US +2508455936,2508521471,IT +2508521472,2508587007,CH +2508587008,2508652543,BE +2508652544,2508718079,AU +2508718080,2508914687,US +2508914688,2508980223,IT +2508980224,2509045759,TR +2509045760,2509242367,US +2509242368,2509307903,AU +2509307904,2509373439,US +2509373440,2509438975,NL +2509438976,2509504511,KW +2509504512,2509570047,AT +2509570048,2509832191,US +2509832192,2509897727,IE +2509897728,2509914111,US +2509914112,2509916159,RU +2509916160,2509918207,DE +2509918208,2509920255,FR +2509920256,2509922303,IT +2509922304,2509924351,AT +2509924352,2509928447,RU +2509928448,2509930495,FI +2509930496,2509934591,RU +2509934592,2509936639,DE +2509936640,2509937919,AT +2509937920,2509938175,IT +2509938176,2509938431,US +2509938432,2509938687,DE +2509938688,2509942783,GB +2509942784,2509946879,UA +2509946880,2509963263,BE +2509963264,2510028799,GB +2510028800,2510094335,PL +2510094336,2510159871,IE +2510159872,2510749695,US +2510749696,2510815231,AU +2510815232,2510946303,US +2510946304,2511011839,GB +2511011840,2511077375,AU +2511077376,2511142911,DE +2511142912,2511339519,US +2511339520,2511405055,AU +2511405056,2512715775,GB +2512715776,2512781311,FI +2512781312,2512872447,US +2512872448,2512872959,SG +2512872960,2512912383,US +2512912384,2512945151,HU +2512945152,2512977919,JO +2512977920,2513043455,DE +2513043456,2513043615,FR +2513043616,2513043647,GB +2513043648,2513044095,FR +2513044096,2513044223,DE +2513044224,2513044287,FR +2513044288,2513044351,IT +2513044352,2513044767,FR +2513044768,2513044799,ES +2513044800,2513045247,FR +2513045248,2513045255,CZ +2513045256,2513046591,FR +2513046592,2513046623,ES +2513046624,2513046911,FR +2513046912,2513047039,GB +2513047040,2513047695,FR +2513047696,2513047699,PL +2513047700,2513048047,FR +2513048048,2513048063,ES +2513048064,2513049551,FR +2513049552,2513049567,ES +2513049568,2513049919,FR +2513049920,2513049983,NL +2513049984,2513049987,PL +2513049988,2513050391,FR +2513050392,2513050399,PT +2513050400,2513051487,FR +2513051488,2513051519,GB +2513051520,2513052735,FR +2513052736,2513052751,ES +2513052752,2513057045,FR +2513057046,2513057046,PT +2513057047,2513068287,FR +2513068288,2513068351,ES +2513068352,2513068415,GB +2513068416,2513068448,FR +2513068449,2513068449,DE +2513068450,2513068631,FR +2513068632,2513068635,PT +2513068636,2513069375,FR +2513069376,2513069439,DE +2513069440,2513069631,FR +2513069632,2513069663,NL +2513069664,2513069823,FR +2513069824,2513069887,IT +2513069888,2513070559,FR +2513070560,2513070591,ES +2513070592,2513070623,FR +2513070624,2513070655,ES +2513070656,2513071435,FR +2513071436,2513071439,NL +2513071440,2513071583,FR +2513071584,2513071587,PL +2513071588,2513071595,FR +2513071596,2513071599,FI +2513071600,2513073375,FR +2513073376,2513073391,BE +2513073392,2513073791,FR +2513073792,2513073855,IT +2513073856,2513073951,FR +2513073952,2513073983,ES +2513073984,2513073999,FR +2513074000,2513074015,ES +2513074016,2513074319,FR +2513074320,2513074327,LT +2513074328,2513075247,FR +2513075248,2513075263,GB +2513075264,2513075455,FR +2513075456,2513075487,PL +2513075488,2513075791,FR +2513075792,2513075807,ES +2513075808,2513075871,FR +2513075872,2513075887,ES +2513075888,2513076175,FR +2513076176,2513076191,ES +2513076192,2513076239,FR +2513076240,2513076255,ES +2513076256,2513076335,FR +2513076336,2513076351,IE +2513076352,2513076479,ES +2513076480,2513077247,FR +2513077248,2513077311,DE +2513077312,2513078151,FR +2513078152,2513078159,NL +2513078160,2513078367,FR +2513078368,2513078371,GB +2513078372,2513078431,FR +2513078432,2513078463,PT +2513078464,2513078671,FR +2513078672,2513078687,IE +2513078688,2513078887,FR +2513078888,2513078891,GB +2513078892,2513078911,FR +2513078912,2513079039,GB +2513079040,2513079250,FR +2513079251,2513079254,ES +2513079255,2513079327,FR +2513079328,2513079343,IE +2513079344,2513080031,FR +2513080032,2513080063,IT +2513080064,2513080255,FR +2513080256,2513080319,DE +2513080320,2513080395,FR +2513080396,2513080399,GB +2513080400,2513080543,FR +2513080544,2513080575,NL +2513080576,2513081151,FR +2513081152,2513081215,IT +2513081216,2513081327,FR +2513081328,2513081343,ES +2513081344,2513081403,FR +2513081404,2513081407,PL +2513081408,2513081935,FR +2513081936,2513081939,DE +2513081940,2513082463,FR +2513082464,2513082495,NL +2513082496,2513082623,GB +2513082624,2513083199,FR +2513083200,2513083263,DE +2513083264,2513083279,FR +2513083280,2513083295,PT +2513083296,2513083327,FR +2513083328,2513083391,ES +2513083392,2513083455,FR +2513083456,2513083519,IE +2513083520,2513083743,FR +2513083744,2513083775,IT +2513083776,2513084215,FR +2513084216,2513084223,NL +2513084224,2513084399,FR +2513084400,2513084415,NL +2513084416,2513101919,FR +2513101920,2513101951,PT +2513101952,2513102047,FR +2513102048,2513102063,ES +2513102064,2513102899,FR +2513102900,2513102903,CZ +2513102904,2513103007,FR +2513103008,2513103039,DE +2513103040,2513103895,FR +2513103896,2513103935,PT +2513103936,2513103967,IE +2513103968,2513104223,FR +2513104224,2513104255,IT +2513104256,2513105311,FR +2513105312,2513105343,NL +2513105344,2513106239,FR +2513106240,2513106303,IE +2513106304,2513106367,FR +2513106368,2513106431,DE +2513106432,2513107079,FR +2513107080,2513107083,FI +2513107084,2513107087,ES +2513107088,2513107103,BE +2513107104,2513107135,FR +2513107136,2513107199,DE +2513107200,2513107231,FR +2513107232,2513107263,GB +2513107264,2513107279,ES +2513107280,2513107295,FR +2513107296,2513107311,PL +2513107312,2513107327,PT +2513107328,2513107391,FR +2513107392,2513107423,DE +2513107424,2513107455,FR +2513107456,2513107583,GB +2513107584,2513108991,FR +2513108992,2513502207,DE +2513502208,2513567743,NO +2513567744,2513600511,GR +2513600512,2513633279,NL +2513633280,2513698815,DE +2513698816,2513764351,DK +2513764352,2514419711,DE +2514419712,2514485247,GB +2514485248,2515140607,DE +2515140608,2515142655,US +2515142656,2515173375,DE +2515173376,2515189759,SG +2515189760,2515206143,US +2515206144,2515271679,GB +2515271680,2515599359,DE +2515599360,2515664895,GB +2515664896,2516037631,DE +2516037632,2516038143,DK +2516038144,2516058111,DE +2516058112,2516123647,CA +2516123648,2516254719,DE +2516254720,2516320255,FR +2516320256,2516451327,US +2516451328,2516516863,GB +2516516864,2516525055,RU +2516525056,2516525183,US +2516525184,2516525247,NL +2516525248,2516525391,US +2516525392,2516525407,NL +2516525408,2516525519,US +2516525520,2516525551,NL +2516525552,2516525727,US +2516525728,2516525823,NL +2516525824,2516526079,US +2516526080,2516526143,NL +2516526144,2516526335,US +2516526336,2516527103,NL +2516527104,2516529151,GB +2516529152,2516529279,CH +2516529280,2516529343,FR +2516529344,2516529375,BE +2516529376,2516531199,CH +2516531200,2516533247,GB +2516533248,2516541439,CZ +2516541440,2516545535,GB +2516545536,2516547583,RU +2516547584,2516549631,GB +2516549632,2516551679,RU +2516551680,2516553727,FR +2516553728,2516557823,AZ +2516557824,2516559871,RU +2516559872,2516561919,GB +2516561920,2516563967,LI +2516563968,2516566015,GB +2516566016,2516582399,IQ +2516582400,2516647935,CN +2516647936,2522812415,JP +2522812416,2522813439,VN +2522813440,2522814463,TH +2522814464,2522815487,SG +2522815488,2522816511,TH +2522816512,2522824703,JP +2522824704,2522834943,SG +2522834944,2522841087,VN +2522841088,2523201535,JP +2523201536,2523267071,AU +2523267072,2523463679,US +2523463680,2523529215,CA +2523529216,2523594751,NO +2523594752,2523595775,HK +2523595776,2523596799,KH +2523596800,2523597823,IN +2523597824,2523598847,TH +2523598848,2523601919,IN +2523601920,2523602943,TH +2523602944,2523603967,NZ +2523603968,2523604991,AU +2523604992,2523606015,IN +2523606016,2523607039,HK +2523607040,2523609087,BD +2523609088,2523612159,TW +2523612160,2523613183,KR +2523613184,2523614207,AU +2523614208,2523615231,MY +2523615232,2523617279,KR +2523617280,2523621375,IN +2523621376,2523621887,ID +2523621888,2523622399,US +2523622400,2523623423,ID +2523623424,2523626495,IN +2523626496,2523628543,SG +2523628544,2523631615,ID +2523631616,2523632639,IN +2523632640,2523633663,ID +2523633664,2523634687,SG +2523634688,2523635711,MY +2523635712,2523636735,NZ +2523636736,2523638783,IN +2523638784,2523639807,NZ +2523639808,2523645951,IN +2523645952,2523646975,NL +2523646976,2523647999,NP +2523648000,2523651071,IN +2523651072,2523652095,AU +2523652096,2523657215,IN +2523657216,2523659263,ID +2523659264,2523660287,IN +2523660288,2523725823,US +2523725824,2523791359,CN +2523791360,2524119039,US +2524119040,2524184575,CN +2524184576,2524315647,TW +2524315648,2524512255,US +2524512256,2524643327,CN +2524643328,2524963071,US +2524963072,2524963311,GB +2524963312,2524971007,US +2524971008,2525036543,ES +2525036544,2525037567,IN +2525037568,2525038591,PK +2525038592,2525039615,NL +2525039616,2525040639,AU +2525040640,2525041151,BD +2525041152,2525041407,ID +2525041408,2525041663,IN +2525041664,2525042687,KH +2525042688,2525044735,IN +2525044736,2525045759,HK +2525045760,2525046783,TW +2525046784,2525047807,HK +2525047808,2525050879,IN +2525050880,2525051903,ID +2525051904,2525053951,IN +2525053952,2525054975,MY +2525054976,2525055999,TW +2525056000,2525058047,HK +2525058048,2525059071,AU +2525059072,2525060095,IN +2525060096,2525061119,AU +2525061120,2525062143,TW +2525062144,2525071359,IN +2525071360,2525072383,CN +2525072384,2525073407,MN +2525073408,2525075455,IN +2525075456,2525076479,HK +2525076480,2525077503,IN +2525077504,2525078527,ID +2525078528,2525083647,IN +2525083648,2525084671,MY +2525084672,2525085695,ID +2525085696,2525086719,CN +2525086720,2525089791,IN +2525089792,2525090815,HK +2525090816,2525091839,IN +2525091840,2525092863,CN +2525092864,2525093887,BD +2525093888,2525094911,KR +2525094912,2525095935,TW +2525095936,2525101055,IN +2525101056,2525102079,CN +2525102080,2525118463,US +2525118464,2525122559,SG +2525122560,2525126655,US +2525126656,2525130751,GB +2525130752,2525131775,IL +2525131776,2525132799,HK +2525132800,2525233151,US +2525233152,2525298687,SE +2525298688,2525626367,US +2525626368,2525757439,CN +2525757440,2525822975,GR +2525822976,2525954047,US +2525954048,2526019583,GB +2526019584,2526085119,US +2526085120,2526216191,IT +2526216192,2526281727,JP +2526281728,2526412799,US +2526412800,2526478335,KR +2526478336,2526543871,AU +2526543872,2526937087,US +2526937088,2527002623,BE +2527002624,2527133695,US +2527133696,2527461375,BR +2527461376,2527920127,US +2527920128,2527985663,AU +2527985664,2528051199,US +2528051200,2528116735,FR +2528116736,2528247807,US +2528247808,2528313343,IT +2528313344,2528575487,US +2528575488,2528641023,KR +2528641024,2528706559,US +2528706560,2529034239,VE +2529034240,2529099775,US +2529099776,2529165311,AU +2529165312,2529492991,US +2529492992,2529558527,KR +2529558528,2529886207,US +2529886208,2529951743,AU +2529951744,2530017279,GB +2530017280,2530082815,CH +2530082816,2530148351,NZ +2530148352,2530213887,AU +2530213888,2530541567,US +2530541568,2530607103,CH +2530607104,2530672639,ES +2530672640,2530803711,US +2530803712,2530869247,IT +2530869248,2531196927,US +2531196928,2531262463,CN +2531262464,2531459071,US +2531459072,2531524607,SE +2531524608,2531590143,US +2531590144,2531655679,AU +2531655680,2532048895,US +2532048896,2532114431,SE +2532114432,2532179967,GB +2532179968,2532376575,US +2532376576,2532442111,ES +2532442112,2532445183,CN +2532445184,2532449279,IN +2532449280,2532450303,CN +2532450304,2532451327,AU +2532451328,2532452351,HK +2532452352,2532453375,NZ +2532453376,2532457471,CN +2532457472,2532461567,IN +2532461568,2532463615,CN +2532463616,2532465663,IN +2532465664,2532467711,CN +2532467712,2532468735,TW +2532468736,2532469759,BD +2532469760,2532470783,TL +2532470784,2532473855,CN +2532473856,2532474879,HK +2532474880,2532475903,NZ +2532475904,2532476927,KR +2532476928,2532477951,AU +2532477952,2532478463,IN +2532478464,2532478975,AE +2532478976,2532479999,KR +2532480000,2532481023,IN +2532481024,2532486143,CN +2532486144,2532488191,IN +2532488192,2532489215,MY +2532489216,2532492287,CN +2532492288,2532495359,IN +2532495360,2532496383,HK +2532496384,2532497407,CN +2532497408,2532498431,HK +2532498432,2532499455,US +2532499456,2532506623,CN +2532506624,2532507647,IN +2532507648,2532573183,US +2532573184,2532638719,ES +2532638720,2532704255,US +2532704256,2532769791,JP +2532769792,2532900863,US +2532900864,2532966399,JP +2532966400,2533031935,US +2533031936,2533032191,HK +2533032192,2533032447,SG +2533032448,2533032703,FR +2533032704,2533032959,US +2533032960,2533033215,BR +2533033216,2533033471,NL +2533033472,2533097471,BE +2533097472,2533228543,US +2533228544,2533294079,PL +2533294080,2533359615,CN +2533359616,2533375999,UA +2533376000,2533392383,HU +2533392384,2538602495,IT +2538602496,2538602687,FR +2538602688,2538602751,DE +2538602752,2538603519,FR +2538603520,2538603583,DE +2538603584,2538603711,FR +2538603712,2538603775,DE +2538603776,2538604327,FR +2538604328,2538604335,NL +2538604336,2538604967,FR +2538604968,2538604975,ES +2538604976,2538605271,FR +2538605272,2538605279,ES +2538605280,2538605375,FR +2538605376,2538605379,GB +2538605380,2538605471,FR +2538605472,2538605503,PT +2538605504,2538605567,DE +2538605568,2538605631,FR +2538605632,2538605647,LT +2538605648,2538605903,FR +2538605904,2538605919,ES +2538605920,2538606027,FR +2538606028,2538606031,DE +2538606032,2538606039,ES +2538606040,2538606043,FR +2538606044,2538606047,DE +2538606048,2538606343,FR +2538606344,2538606351,PL +2538606352,2538606403,FR +2538606404,2538606407,GB +2538606408,2538606847,FR +2538606848,2538606911,IT +2538606912,2538606943,CZ +2538606944,2538607007,PT +2538607008,2538607039,FR +2538607040,2538607103,ES +2538607104,2538613134,FR +2538613135,2538613135,NL +2538613136,2538616287,FR +2538616288,2538616319,NL +2538616320,2538616383,FR +2538616384,2538616447,ES +2538616448,2538616575,FR +2538616576,2538616639,IT +2538616640,2538618487,FR +2538618488,2538618495,ES +2538618496,2538619359,FR +2538619360,2538619375,ES +2538619376,2538619431,FR +2538619432,2538619435,DE +2538619436,2538619563,FR +2538619564,2538619567,ES +2538619568,2538619775,FR +2538619776,2538619807,LT +2538619808,2538619903,FR +2538619904,2538619911,ES +2538619912,2538620231,FR +2538620232,2538620239,ES +2538620240,2538620255,FR +2538620256,2538620287,NL +2538620288,2538620847,FR +2538620848,2538620863,CZ +2538620864,2538621007,FR +2538621008,2538621023,LT +2538621024,2538621167,FR +2538621168,2538621183,CZ +2538621184,2538621471,FR +2538621472,2538621503,BE +2538621504,2538622351,FR +2538622352,2538622367,LT +2538622368,2538622599,FR +2538622600,2538622607,IE +2538622608,2538622735,FR +2538622736,2538622751,FI +2538622752,2538623711,FR +2538623712,2538623727,NL +2538623728,2538624447,FR +2538624448,2538624511,ES +2538624512,2538624671,FR +2538624672,2538624703,PL +2538624704,2538625279,FR +2538625280,2538625311,GB +2538625312,2538625527,FR +2538625528,2538625535,DE +2538625536,2538625571,FR +2538625572,2538625575,PL +2538625576,2538625583,FR +2538625584,2538625599,PT +2538625600,2538626543,FR +2538626544,2538626559,LT +2538626560,2538626687,FR +2538626688,2538626703,ES +2538626704,2538629727,FR +2538629728,2538629759,ES +2538629760,2538631583,FR +2538631584,2538631615,FI +2538631616,2538633551,FR +2538633552,2538633567,IE +2538633568,2538633695,FR +2538633696,2538633727,CZ +2538633728,2538634227,FR +2538634228,2538634231,DE +2538634232,2538634331,FR +2538634332,2538634335,DE +2538634336,2538634559,FR +2538634560,2538634623,GB +2538634624,2538634687,FR +2538634688,2538634751,NL +2538634752,2538634879,FR +2538634880,2538635007,GB +2538635008,2538644015,FR +2538644016,2538644039,ES +2538644040,2538644927,FR +2538644928,2538644991,IE +2538644992,2538645607,FR +2538645608,2538645615,PL +2538645616,2538645695,FR +2538645696,2538645727,CZ +2538645728,2538645775,FR +2538645776,2538645783,ES +2538645784,2538645855,FR +2538645856,2538645871,ES +2538645872,2538646063,FR +2538646064,2538646079,PT +2538646080,2538646135,FR +2538646136,2538646139,DE +2538646140,2538646143,FR +2538646144,2538646155,DE +2538646156,2538646219,FR +2538646220,2538646227,DE +2538646228,2538646271,FR +2538646272,2538646399,BE +2538646400,2538646783,FR +2538646784,2538647039,CZ +2538647040,2538647823,FR +2538647824,2538647831,FI +2538647832,2538648015,FR +2538648016,2538648031,ES +2538648032,2538648591,FR +2538648592,2538648623,BE +2538648624,2538649767,FR +2538649768,2538649775,DE +2538649776,2538649991,FR +2538649992,2538649995,DE +2538649996,2538650059,FR +2538650060,2538650063,DE +2538650064,2538650103,FR +2538650104,2538650107,DE +2538650108,2538650199,FR +2538650200,2538650203,DE +2538650204,2538651135,FR +2538651136,2538651139,DE +2538651140,2538651183,FR +2538651184,2538651187,DE +2538651188,2538651255,FR +2538651256,2538651259,DE +2538651260,2538651279,FR +2538651280,2538651283,DE +2538651284,2538651967,FR +2538651968,2538651999,PT +2538652000,2538652727,FR +2538652728,2538652731,DE +2538652732,2538652991,FR +2538652992,2538653055,DE +2538653056,2538653327,FR +2538653328,2538653331,CZ +2538653332,2538653379,FR +2538653380,2538653383,DE +2538653384,2538653387,ES +2538653388,2538653927,FR +2538653928,2538653931,ES +2538653932,2538653935,FR +2538653936,2538653939,GB +2538653940,2538655071,FR +2538655072,2538655103,FI +2538655104,2538656959,FR +2538656960,2538656975,ES +2538656976,2538657135,FR +2538657136,2538657139,RO +2538657140,2538657439,FR +2538657440,2538657443,ES +2538657444,2538657855,FR +2538657856,2538657919,ES +2538657920,2538657935,FR +2538657936,2538657943,ES +2538657944,2538657967,FR +2538657968,2538657983,IE +2538657984,2538658347,FR +2538658348,2538658351,DE +2538658352,2538658495,FR +2538658496,2538658499,DE +2538658500,2538658623,FR +2538658624,2538658655,NL +2538658656,2538659071,FR +2538659072,2538659135,NL +2538659136,2538659331,FR +2538659332,2538659335,PL +2538659336,2538659711,FR +2538659712,2538659719,ES +2538659720,2538663299,FR +2538663300,2538663303,IT +2538663304,2538663455,FR +2538663456,2538663471,ES +2538663472,2538663551,FR +2538663552,2538663567,IT +2538663568,2538663791,FR +2538663792,2538663799,ES +2538663800,2538666111,FR +2538666112,2538666175,GB +2538666176,2538667775,FR +2538667776,2538667839,ES +2538667840,2538668031,FR +2538668032,2539978751,IT +2539978752,2539980799,US +2539980800,2539981823,SG +2539981824,2539982847,DE +2539982848,2539983871,GB +2539983872,2539985919,US +2539985920,2539986943,AU +2539986944,2539987967,US +2539987968,2539988991,NL +2539988992,2539994111,US +2539994112,2539995135,GB +2539995136,2539997183,US +2539997184,2539998207,JP +2539998208,2539999231,HK +2539999232,2540000255,AU +2540000256,2540001279,SE +2540001280,2540002303,JP +2540002304,2540003327,BR +2540003328,2540004351,AU +2540004352,2540005375,US +2540005376,2540006399,AU +2540006400,2540007423,IL +2540007424,2540008447,DE +2540008448,2540009471,US +2540009472,2540010495,FR +2540010496,2540011519,CA +2540011520,2540012543,US +2540012544,2540013567,ES +2540013568,2540014591,CA +2540014592,2540015615,AE +2540015616,2540017663,US +2540017664,2540019711,IN +2540019712,2540020735,US +2540020736,2540021759,NZ +2540021760,2540022783,US +2540022784,2540023807,ZA +2540023808,2540024831,BR +2540024832,2540033023,US +2540033024,2540034047,CA +2540034048,2540035071,AR +2540035072,2540036095,CL +2540036096,2540037119,ZA +2540037120,2540038143,JP +2540038144,2540240895,US +2540240896,2540306431,FI +2540306432,2540314623,FR +2540314624,2540339199,DE +2540339200,2540347391,GB +2540347392,2540355583,US +2540355584,2540363775,GB +2540363776,2540896255,US +2540896256,2540961791,FR +2540961792,2541223935,US +2541223936,2541289471,CH +2541289472,2541682687,US +2541682688,2541748223,FR +2541748224,2541813759,US +2541813760,2541879295,GB +2541879296,2541944831,AU +2541944832,2542075903,US +2542075904,2542141439,GB +2542141440,2542206975,US +2542206976,2542272511,TR +2542272512,2542338047,DE +2542338048,2543583231,US +2543583232,2543648767,SE +2543648768,2543714303,NO +2543779840,2544500735,US +2544500736,2544566271,GB +2544566272,2544631807,US +2544697344,2544730111,US +2544730112,2544762879,SA +2544762880,2544828415,US +2544893952,2544959487,GB +2544959488,2545025023,SE +2545025024,2545090559,AU +2545090560,2545156095,US +2545156096,2545221631,GB +2545221632,2545287167,US +2545287168,2545352703,ES +2545352704,2545418239,CH +2545418240,2545483775,NL +2545483776,2545614847,US +2545614848,2545680383,NO +2545680384,2545745919,US +2545745920,2545811455,DE +2545811456,2547154943,US +2547154944,2547187711,NZ +2547187712,2547318783,GB +2547318784,2547515391,US +2547515392,2547515903,RU +2547517440,2547524607,DE +2547524608,2547525631,IR +2547525632,2547535871,GB +2547548160,2547580927,NO +2547580928,2547646463,DE +2548039680,2548072320,GB +2548072321,2548072321,US +2548072322,2548563967,GB +2548563968,2548826111,IR +2548826112,2548829695,AT +2548829696,2548829951,NL +2548829952,2548830207,DE +2548830208,2548830463,US +2548830464,2548830719,DE +2548830720,2548830975,IT +2548830976,2548831231,GB +2548831232,2548831487,HK +2548831488,2548831743,FR +2548831744,2548831999,US +2548832000,2548832255,ES +2548832256,2548832511,IS +2548832512,2548832767,PL +2548832768,2548833279,CH +2548833280,2548833791,NL +2548833792,2548834303,AT +2548834304,2548842495,GB +2548842496,2548848639,RU +2548848640,2548848895,UA +2548848896,2548858879,RU +2548858880,2548867071,NL +2548867072,2548875263,IQ +2548875264,2548877311,KZ +2548877312,2548879359,SE +2548879360,2548883455,GB +2548883456,2548887551,SK +2548887552,2548891647,MK +2548891648,2548905983,BG +2548905984,2548907007,ES +2548907008,2548908031,BG +2548908032,2548908543,ES +2548908544,2548924927,BG +2548924928,2548926463,ES +2548926464,2548928511,BG +2548928512,2548932607,KZ +2548932608,2548934655,NL +2548934656,2548936703,RU +2548936704,2548938239,SE +2548938240,2548938495,GB +2548938496,2548938751,CH +2548938752,2548939519,SE +2548939520,2548939775,ES +2548939776,2548940799,SE +2548940800,2548948991,ES +2548948992,2548951039,CZ +2548951040,2548953087,GB +2548953088,2548955135,RU +2548955136,2548957183,DE +2548957184,2549612543,IR +2549612544,2549614447,SE +2549614448,2549614463,NL +2549614464,2549614591,SE +2549614592,2549616639,IT +2549616640,2549618687,BE +2549618688,2549620735,US +2549620736,2549624831,PL +2549624832,2549626879,BE +2549626880,2549628927,PL +2549628928,2549637119,RO +2549637120,2549641215,KW +2549641216,2549645311,RU +2549645312,2549678079,CH +2549678080,2549698559,GB +2549698560,2549700607,PL +2549700608,2549700863,FR +2549700864,2549701375,DE +2549701376,2549701631,SE +2549701632,2549701887,PL +2549701888,2549702143,FR +2549702144,2549702399,GB +2549702400,2549702655,FR +2549702656,2549704703,UA +2549704704,2549706751,CZ +2549706752,2549710847,NO +2549710848,2549743615,BY +2549743616,2549809151,TR +2549809152,2549874687,BG +2549874688,2549876735,GB +2549876736,2549878783,NO +2549878784,2549880831,DE +2549880832,2549881327,SE +2549881328,2549881343,NL +2549881344,2549882335,SE +2549882336,2549882351,FI +2549882352,2549882383,SE +2549882384,2549882399,FI +2549882400,2549882879,SE +2549882880,2549884927,CH +2549884928,2549886207,DE +2549886208,2549886463,CH +2549886464,2549891071,DE +2549891072,2549899263,RU +2549899264,2549901311,PS +2549901312,2549903359,RU +2549903360,2549905407,ES +2549905408,2549907455,GB +2549907456,2549923839,SE +2549923840,2549927935,BG +2549927936,2549929983,HR +2549929984,2549932031,DE +2549932032,2549940223,HR +2549940224,2550005759,AE +2550005760,2550136831,SA +2550136832,2550202367,DO +2550202368,2553544703,US +2553544704,2553610239,IN +2553610240,2553806847,US +2553806848,2554068991,IN +2554068992,2554227711,US +2554227712,2554227967,IE +2554227968,2554462207,US +2554462208,2554527743,HU +2554527744,2554789887,US +2554789888,2554855423,GB +2554855424,2554920959,US +2554920960,2554986495,DK +2554986496,2555052031,CL +2555052032,2555117567,US +2555117568,2555183103,AU +2555183104,2555248639,FR +2555248640,2555314175,GB +2555314176,2555445247,US +2555445248,2555510783,FR +2555510784,2555576319,US +2555576320,2555641855,AU +2555641856,2555707391,BR +2555707392,2555903999,US +2555904000,2555969535,CH +2556035072,2556100607,NO +2556100608,2556166143,AU +2556166144,2556231679,BR +2556231680,2556362751,NO +2556362752,2556428287,DK +2556428288,2556493823,CH +2556493824,2556559359,US +2556559360,2556624895,AU +2556624896,2556690431,KR +2556690432,2556755967,US +2556755968,2556757247,HK +2556757248,2556757503,TW +2556757504,2556757759,HK +2556757760,2556758015,SG +2556758016,2556761087,HK +2556761088,2556761343,JP +2556761344,2556762367,HK +2556762368,2556763135,TW +2556763136,2556763903,HK +2556763904,2556764159,SG +2556764160,2556764415,TW +2556764416,2556766207,HK +2556766208,2556766719,DE +2556766720,2556768767,HK +2556768768,2556769023,TW +2556769024,2556773887,HK +2556773888,2556774143,SG +2556774144,2556776703,HK +2556776704,2556776959,DE +2556776960,2556780031,HK +2556780032,2556780799,SG +2556780800,2556787967,HK +2556787968,2556788223,JP +2556788224,2556790783,HK +2556790784,2556791807,ZA +2556791808,2556800511,HK +2556800512,2556800767,TW +2556800768,2556807423,HK +2556807424,2556807679,JP +2556807680,2556821503,HK +2556821504,2556887039,SG +2556887040,2556985343,HK +2556985344,2557018111,CN +2557018112,2557083647,GB +2557083648,2557214719,ZA +2557214720,2557280255,SC +2557280256,2557542399,ZA +2557542400,2557607935,US +2557607936,2557673471,GB +2557673472,2557739007,DK +2557739008,2557870079,US +2557870080,2557935615,ID +2557935616,2558658499,US +2558658500,2558658500,PR +2558658501,2558918655,US +2558918656,2558984191,GB +2558984192,2559246335,US +2559246336,2559311871,CL +2559311872,2559508479,US +2559508480,2559574015,DE +2559574016,2559770623,US +2559770624,2559836159,AU +2559836160,2559901695,US +2559901696,2559967231,KR +2559967232,2560032767,GB +2560032768,2560098303,US +2560098304,2560163839,BE +2560229376,2560360447,US +2560360448,2560425983,UY +2560425984,2560950271,US +2560950272,2561015807,JP +2561015808,2561146879,DO +2561146880,2561409023,AR +2561409024,2561671167,CL +2561671168,2562867199,US +2562867200,2562868223,DE +2562868224,2563244031,US +2563244032,2563637247,CO +2563637248,2563768319,CU +2563768320,2564947967,US +2564947968,2565013503,SG +2565013504,2565210111,US +2565210112,2565275647,CL +2565275648,2565279743,HN +2565279744,2565281791,AR +2565281792,2565283839,CO +2565283840,2565287935,NI +2565287936,2565292031,AR +2565292032,2565308415,CL +2565308416,2565341183,CR +2565341184,2566914047,BR +2566914048,2566979583,CN +2566979584,2567045119,FI +2567045120,2567110655,US +2567110656,2567176191,CN +2567176192,2567241727,US +2567241728,2567307263,SI +2567307264,2567897087,US +2567897088,2567962623,NO +2567962624,2568028159,US +2568028160,2568093695,DE +2568093696,2568159231,US +2568159232,2568224767,PL +2568224768,2568290303,SG +2568290304,2569142271,US +2569142272,2569404415,CN +2569404416,2569797631,US +2569797632,2569863167,NO +2569863168,2569885183,US +2569885184,2569885439,CH +2569885440,2569928703,US +2569928704,2569936383,CH +2569936384,2569936895,US +2569936896,2569970175,CH +2569970176,2569970687,US +2569970688,2569994239,CH +2569994240,2570125311,US +2570125312,2570190847,BE +2570190848,2572681215,US +2572681216,2572746751,SE +2572746752,2572944127,US +2572944128,2572944383,LT +2572944384,2572945407,US +2572945408,2572947455,ID +2572947456,2572950271,PL +2572950272,2572950527,ES +2572950528,2572951551,DE +2572951552,2572953599,US +2572953600,2572953855,CA +2572953856,2572954111,DE +2572954112,2572954367,ES +2572954368,2572954623,HK +2572954624,2572954879,AU +2572954880,2572955135,HK +2572955136,2572955388,GB +2572955389,2572955390,HK +2572955391,2572955391,GB +2572955392,2572955647,DE +2572955648,2572959743,FR +2572959744,2572960255,DE +2572960256,2572960511,SE +2572960512,2572960767,BE +2572960768,2572961023,FR +2572961024,2572961279,CH +2572961280,2572961535,IT +2572961536,2572961791,ES +2572961792,2572967935,DE +2572967936,2572968447,FR +2572968448,2572968959,CZ +2572968960,2572972031,FR +2572972032,2572974079,AT +2572974080,2572975103,ES +2572975104,2572975615,DE +2572975616,2572975871,SE +2572975872,2572976127,NL +2572976128,2572984319,IS +2572984320,2572984575,DE +2572984576,2572984831,NL +2572984832,2572985087,AT +2572985088,2572985343,GB +2572985344,2572985599,KR +2572985600,2572985855,RU +2572985856,2572986111,CZ +2572986112,2572986367,IE +2572986368,2572986623,PL +2572986624,2572986879,PT +2572986880,2572987391,DE +2572987392,2572987647,NO +2572987648,2572987903,LU +2572987904,2572988159,DE +2572988160,2572988415,KR +2572988416,2572989439,IT +2572989440,2572989695,GR +2572989696,2572989823,PL +2572989824,2572989887,EE +2572989888,2572989951,LV +2572989952,2572991487,DE +2572991488,2572991615,IT +2572991616,2572991743,CH +2572991744,2572991871,PT +2572991872,2572991999,ES +2572992000,2572992127,BE +2572992128,2572992255,NL +2572992256,2572992383,HU +2572992384,2572992447,RS +2572992448,2572992511,UA +2572992512,2572996607,DE +2572996608,2572997631,GB +2572997632,2573000703,US +2573000704,2573008895,FR +2573008896,2573336575,DE +2573352960,2573361151,BE +2573369344,2573402111,DE +2573402112,2573467647,CN +2573467648,2573533183,DE +2573533184,2573598719,CN +2573598720,2573926399,US +2573926400,2573991935,AU +2573991936,2574123007,CH +2574123008,2574188543,NO +2574188544,2574254079,NZ +2574254080,2574306303,SE +2574306304,2574307327,BE +2574307328,2574311167,SE +2574311168,2574311423,US +2574311424,2574319615,SE +2574319616,2574647295,US +2574647296,2574778367,CN +2574778368,2583582207,JP +2583582208,2583582463,HK +2583582464,2583691263,JP +2583691264,2583695359,ZA +2583695360,2583697407,BW +2583697408,2583699455,CI +2583699456,2583707647,GA +2583707648,2583724031,AO +2583724032,2583728127,UG +2583728128,2583729919,NG +2583729920,2583732223,TZ +2583732224,2583736319,ZA +2583736320,2583740415,GA +2583740416,2583756799,NA +2583756800,2584018943,US +2584018944,2584084479,CA +2584084480,2584215551,US +2584215552,2584227839,GB +2584227840,2584231935,JP +2584231936,2584248319,GB +2584248320,2584281087,CN +2584281088,2584346623,US +2584346624,2584412159,KR +2584412160,2584477695,CA +2584477696,2584608767,US +2584608768,2584674303,CH +2584674304,2584739839,GB +2584739840,2584739903,AU +2584739904,2584739935,DE +2584739936,2584740095,ZA +2584740096,2584740351,US +2584740352,2584740415,AU +2584740416,2584740607,ZA +2584740608,2584740863,NL +2584740864,2584740927,AU +2584740928,2584741119,ZA +2584741120,2584741375,US +2584741376,2584741439,AU +2584741440,2584741503,ZA +2584741504,2584741519,IE +2584741520,2584741631,DE +2584741632,2584741887,GB +2584741888,2584741951,AU +2584741952,2584742143,ZA +2584742144,2584742399,US +2584742400,2584742463,AU +2584742464,2584742655,ZA +2584742656,2584742911,US +2584742912,2584742975,KR +2584742976,2584743167,ZA +2584743168,2584743423,US +2584743424,2584743487,KR +2584743488,2584743679,ZA +2584743680,2584743935,US +2584743936,2584743999,AU +2584744000,2584744191,ZA +2584744192,2584744447,NL +2584744448,2584744511,AU +2584744512,2584744703,ZA +2584744704,2584744959,US +2584744960,2584745023,AU +2584745024,2584745215,ZA +2584745216,2584745471,US +2584745472,2584745535,AU +2584745536,2584745727,ZA +2584745728,2584745983,US +2584745984,2584746047,AU +2584746048,2584746239,ZA +2584746240,2584746495,US +2584746496,2584746559,AU +2584746560,2584746751,ZA +2584746752,2584747007,US +2584747008,2584747071,MY +2584747072,2584747263,ZA +2584747264,2584747519,US +2584747520,2584747583,MY +2584747584,2584747775,ZA +2584747776,2584748031,US +2584748032,2584748095,MY +2584748096,2584748287,ZA +2584748288,2584748543,US +2584748544,2584748607,MY +2584748608,2584748799,ZA +2584748800,2584749055,US +2584749056,2584749119,MY +2584749120,2584749311,ZA +2584749312,2584749567,NL +2584749568,2584749631,MY +2584749632,2584749823,ZA +2584749824,2584750079,US +2584750080,2584750143,MY +2584750144,2584750335,ZA +2584750336,2584750591,US +2584750592,2584750655,MY +2584750656,2584750687,DE +2584750688,2584750719,ZA +2584750720,2584750847,DE +2584750848,2584751103,US +2584751104,2584751167,AE +2584751168,2584751231,ZA +2584751232,2584751359,DE +2584751360,2584751615,US +2584751616,2584751679,AE +2584751680,2584751743,ZA +2584751744,2584751871,DE +2584751872,2584752127,US +2584752128,2584752191,AE +2584752192,2584752207,SE +2584752208,2584752255,ZA +2584752256,2584752383,DE +2584752384,2584752639,US +2584752640,2584752703,AE +2584752704,2584752767,ZA +2584752768,2584752895,DE +2584752896,2584753151,US +2584753152,2584753215,AE +2584753216,2584753279,ZA +2584753280,2584753407,DE +2584753408,2584753663,US +2584753664,2584753727,AE +2584753728,2584753791,ZA +2584753792,2584753919,DE +2584753920,2584754175,US +2584754176,2584754303,ZA +2584754304,2584754431,DE +2584754432,2584754687,US +2584754688,2584754751,ZA +2584754752,2584754943,DE +2584754944,2584755199,US +2584755200,2584755263,AR +2584755264,2584755279,DE +2584755280,2584755327,ZA +2584755328,2584755455,DE +2584755456,2584755711,US +2584755712,2584755775,AR +2584755776,2584755839,ZA +2584755840,2584755967,DE +2584755968,2584756223,GB +2584756224,2584756351,ZA +2584756352,2584756479,DE +2584756480,2584756735,US +2584756736,2584756991,ZA +2584756992,2584757247,US +2584757248,2584757311,SG +2584757312,2584757503,ZA +2584757504,2584757759,US +2584757760,2584757823,HK +2584757824,2584758015,ZA +2584758016,2584758271,US +2584758272,2584758335,SG +2584758336,2584758527,ZA +2584758528,2584758783,US +2584758784,2584758847,HK +2584758848,2584759039,ZA +2584759040,2584759295,US +2584759296,2584759359,SG +2584759360,2584759551,ZA +2584759552,2584759807,US +2584759808,2584759871,HK +2584759872,2584760063,ZA +2584760064,2584760319,US +2584760320,2584760383,SG +2584760384,2584760575,ZA +2584760576,2584760831,US +2584760832,2584760895,HK +2584760896,2584761087,ZA +2584761088,2584761343,US +2584761344,2584761407,SG +2584761408,2584761599,ZA +2584761600,2584761855,US +2584761856,2584761919,HK +2584761920,2584762111,ZA +2584762112,2584762367,US +2584762368,2584762431,SG +2584762432,2584762623,ZA +2584762624,2584762879,US +2584762880,2584762943,HK +2584762944,2584763135,ZA +2584763136,2584763391,US +2584763392,2584763455,SG +2584763456,2584763903,ZA +2584763904,2584763967,HK +2584763968,2584763999,DE +2584764000,2584764415,ZA +2584764416,2584764671,MA +2584764672,2584764927,DZ +2584764928,2584766975,US +2584766976,2584767231,NL +2584767232,2584767487,TR +2584767488,2584768511,US +2584768512,2584770559,IL +2584770560,2584772448,US +2584772449,2584772449,GB +2584772450,2584773631,US +2584773632,2584773887,GB +2584773888,2584775423,US +2584775424,2584775679,KE +2584775680,2584776703,MA +2584776704,2584778751,US +2584778752,2584779775,DE +2584779776,2584780031,NL +2584780032,2584780287,US +2584780288,2584780543,ES +2584780544,2584782079,US +2584782080,2584782335,TR +2584782336,2584789759,US +2584789760,2584790015,NL +2584790016,2584790783,US +2584790784,2584791039,HK +2584791040,2584791295,US +2584791296,2584791551,FR +2584791552,2584791807,DE +2584791808,2584796159,US +2584796160,2584796415,RU +2584796416,2585001983,US +2585001984,2585067519,CA +2585067520,2585330440,US +2585330441,2585330442,SI +2585330443,2585330468,US +2585330469,2585330470,SI +2585330471,2585788415,US +2585788416,2585853951,GB +2585853952,2585985023,JP +2585985024,2586378239,US +2586378240,2586386431,UA +2586386432,2586480639,US +2586480640,2586484735,IL +2586484736,2586492927,GB +2586492928,2586509823,US +2586509824,2586510079,ES +2586510080,2586510335,US +2586510336,2586511359,ES +2586511360,2586517503,US +2586517504,2586525695,FR +2586525696,2586544127,US +2586544128,2586546175,SE +2586546176,2586566655,US +2586566656,2586566687,FR +2586566688,2586610175,US +2586610176,2586610431,GB +2586610432,2586610687,US +2586610688,2586611711,ES +2586611712,2586622463,US +2586622464,2586622975,ES +2586622976,2586640383,US +2586640384,2586640399,MC +2586640400,2586640895,US +2586640896,2586641407,FR +2586641408,2586650687,US +2586650688,2586650703,DE +2586650704,2586694655,US +2586694656,2586694911,FR +2586694912,2586714879,US +2586714880,2586715135,NL +2586715136,2586716159,US +2586716160,2586716671,ES +2586716672,2586717183,US +2586717184,2586718207,ES +2586718208,2586726655,US +2586726656,2586726911,GB +2586726912,2586733567,US +2586733568,2586733823,LT +2586733824,2586734591,US +2586734592,2586735615,LT +2586735616,2586758143,US +2586758144,2586758655,DE +2586758656,2586787839,US +2586787840,2586796031,GB +2586796032,2586804223,US +2586804224,2586804479,ES +2586804480,2586804735,US +2586804736,2586805247,ES +2586805248,2586805503,US +2586805504,2586805759,ES +2586805760,2586806271,US +2586806272,2586807295,ES +2586807296,2586814463,US +2586814464,2586816511,RO +2586816512,2586828799,US +2586828800,2586828863,CH +2586828864,2586829311,US +2586829312,2586829567,CH +2586829568,2586853887,US +2586853888,2586854143,ES +2586854144,2586854399,US +2586854400,2586855423,ES +2586855424,2586869759,US +2586869760,2586875903,ES +2586875904,2586876415,US +2586876416,2586876671,ES +2586876672,2586876927,US +2586876928,2586882559,ES +2586882560,2586884095,US +2586884096,2586884351,ES +2586884352,2586885119,US +2586885120,2586886143,ES +2586886144,2586887167,DE +2586887168,2586888191,US +2586888192,2586888447,DE +2586888448,2586890239,US +2586890240,2586890751,DE +2586890752,2586891263,US +2586891264,2586891519,GB +2586891520,2586927103,US +2586927104,2586935295,GB +2586935296,2586952191,US +2586952192,2586952447,FR +2586952448,2586952703,US +2586952704,2586953471,FR +2586953472,2586953727,ES +2586953728,2586953983,MX +2586953984,2586954239,PE +2586954240,2586956287,US +2586956288,2586957311,FR +2586957312,2586968127,US +2586968128,2586968319,FR +2586968320,2587018239,US +2587018240,2587020799,IE +2587020800,2587021823,US +2587021824,2587022847,IE +2587022848,2587049983,US +2587049984,2587058175,GB +2587058176,2587066367,US +2587066368,2587069439,GB +2587069440,2587070463,US +2587070464,2587082751,GB +2587082752,2587128522,US +2587128523,2587128523,TR +2587128524,2587131903,US +2587131904,2587132415,FR +2587132416,2587164671,US +2587164672,2587172863,CH +2587172864,2587197439,US +2587197440,2587197695,ES +2587197696,2587214847,US +2587214848,2587215871,GB +2587215872,2587217919,US +2587217920,2587218943,CG +2587218944,2587240389,US +2587240390,2587240390,FR +2587240391,2587249417,US +2587249418,2587249418,FR +2587249419,2587361791,US +2587361792,2587362047,MD +2587362048,2587377663,US +2587377664,2587385855,FR +2587385856,2587394047,US +2587394048,2587399423,ES +2587399424,2587399679,US +2587399680,2587402239,ES +2587402240,2587410431,US +2587410432,2587418623,IT +2587418624,2587427839,US +2587427840,2587429887,GR +2587429888,2587443199,US +2587443200,2587447295,CH +2587447296,2587476760,US +2587476761,2587476761,LB +2587476762,2587479119,US +2587479120,2587479120,LB +2587479121,2587481969,US +2587481970,2587481970,LB +2587481971,2587484159,US +2587484160,2587492351,GB +2587492352,2587497471,ES +2587497472,2587498495,US +2587498496,2587499007,ES +2587499008,2587504639,US +2587504640,2587508735,ES +2587508736,2587525119,GB +2587525120,2587542527,US +2587542528,2587544575,ES +2587544576,2587545599,US +2587545600,2587549695,ES +2587549696,2587582463,US +2587582464,2587587071,NL +2587587072,2587592703,US +2587592704,2587594751,GB +2587594752,2587596799,US +2587596800,2587598847,GB +2587598848,2587607295,US +2587607296,2587607551,DE +2587607552,2587623423,US +2587623424,2587631615,BG +2587631616,2587631871,US +2587631872,2587632127,ES +2587632128,2587639807,US +2587639808,2587647999,GB +2587648000,2587648511,US +2587648512,2587649023,ES +2587649024,2587650815,US +2587650816,2587651071,ES +2587651072,2587674623,US +2587674624,2587676671,IT +2587676672,2587680767,US +2587680768,2587684863,ES +2587684864,2587686911,US +2587686912,2587688959,ES +2587688960,2587697151,US +2587697152,2587697407,GB +2587697408,2587698175,US +2587698176,2587699199,GB +2587699200,2587700223,US +2587700224,2587700735,GB +2587700736,2587713535,US +2587713536,2587714559,ES +2587714560,2587717631,US +2587717632,2587721727,ES +2587721728,2587738111,US +2587738112,2587738623,RS +2587738624,2587740159,US +2587740160,2587742207,RS +2587742208,2587746303,US +2587746304,2587747327,ES +2587747328,2587926527,US +2587926528,2587930623,BG +2587930624,2587938815,US +2587938816,2587939327,PR +2587939328,2587941375,US +2587941376,2587941631,PR +2587941632,2587951103,US +2587951104,2587952127,ZA +2587952128,2587953151,NG +2587953152,2587954175,MU +2587954176,2587955199,ZA +2587955200,2587959295,KE +2587959296,2587961343,SN +2587961344,2587962367,ZA +2587962368,2587963391,SS +2587963392,2587963647,GS +2587963648,2587964415,SS +2587964416,2587965439,ZA +2587966464,2587967487,BF +2587967488,2587975679,ZA +2587975680,2587983871,GH +2587983872,2588016639,AO +2588016640,2588033023,NG +2588033024,2588037119,ZA +2588037120,2588038143,AO +2588038144,2588039167,GN +2588039168,2588041215,ZA +2588042240,2588043263,SS +2588043264,2588044287,AO +2588044288,2588045311,LS +2588045312,2588046335,ZA +2588046336,2588047359,TD +2588047360,2588049407,MW +2588049408,2588053503,BJ +2588053504,2588057599,ZA +2588057600,2588061695,BF +2588061696,2588070911,ZA +2588070912,2588071935,TZ +2588071936,2588072959,UG +2588072960,2588073983,NE +2588073984,2588075007,TZ +2588075008,2588076031,MU +2588076032,2588078079,GA +2588078080,2588078335,KE +2588078336,2588078591,ZA +2588078592,2588078847,FR +2588078848,2588079103,TZ +2588079104,2588079359,ZA +2588079360,2588079615,DJ +2588079616,2588079871,GB +2588079872,2588080127,MU +2588080128,2588082175,ZA +2588082176,2588147711,RE +2588147712,2588164095,CI +2588164096,2588180479,RW +2588180480,2588188671,TD +2588188672,2588196863,ZA +2588196864,2588213247,NG +2588213248,2588278783,ZA +2588278784,2588295167,KE +2588295168,2588299263,GH +2588299264,2588303359,TG +2588303360,2588311551,CM +2588311552,2588315647,ZA +2588315648,2588317695,BW +2588317696,2588318719,ZA +2588318720,2588319743,UG +2588319744,2588327935,SC +2588327936,2588328959,ML +2588328960,2588329983,BI +2588329984,2588332031,MA +2588332032,2588343039,ZA +2588343040,2588343295,BI +2588343296,2588344319,ZA +2588344320,2588409855,MU +2588409856,2588410879,KE +2588410880,2588412927,ZA +2588412928,2588413951,ST +2588413952,2588414975,UG +2588414976,2588415999,TZ +2588416000,2588417023,SO +2588417024,2588418047,KE +2588418048,2588420095,NG +2588420096,2588422143,ZA +2588422144,2588423167,SO +2588423168,2588424191,CD +2588424192,2588426239,ZA +2588426240,2588434431,TZ +2588434432,2588438527,ZA +2588438528,2588442623,BJ +2588442624,2588459007,CM +2588459008,2588467199,UG +2588467200,2588471295,TN +2588471296,2588477439,ZA +2588477440,2588478463,NG +2588478464,2588479487,UG +2588479488,2588480511,ZA +2588480512,2588481535,CD +2588481536,2588482559,SO +2588482560,2588483583,LY +2588483584,2588484607,ZA +2588484608,2588485631,BW +2588485632,2588486655,BI +2588486656,2588487679,SO +2588487680,2588487711,SC +2588487712,2588487743,FR +2588487744,2588487807,BF +2588487808,2588487839,NE +2588487840,2588487871,SC +2588487872,2588487935,MW +2588487936,2588488703,SC +2588488704,2588489727,LY +2588489728,2588490751,GQ +2588490752,2588491775,GW +2588491776,2588492799,TZ +2588492800,2588494847,ZA +2588494848,2588495871,SO +2588495872,2588496895,ZW +2588496896,2588497919,BW +2588497920,2588498943,SS +2588498944,2588499967,DZ +2588499968,2588500991,ZA +2588500992,2588502015,CI +2588502016,2588503039,BI +2588503040,2588504063,LY +2588504064,2588505087,TD +2588505088,2588505599,CG +2588505600,2588505855,US +2588505856,2588506111,CG +2588506112,2588507135,ZA +2588507136,2588508159,SO +2588508160,2588510207,LY +2588510208,2588512255,ZA +2588512256,2588514303,TZ +2588514304,2588516351,ZA +2588516352,2588518399,TD +2588518400,2588519423,TZ +2588519424,2588520447,SN +2588520448,2588521471,SL +2588521472,2588526591,ZA +2588526592,2588528639,CM +2588528640,2588534783,ZA +2588534784,2588535807,ZM +2588535808,2588536831,NG +2588536832,2588540927,ZA +2588540928,2588671999,TZ +2588672000,2588934143,KE +2588934144,2588999679,ZA +2588999680,2589234175,US +2589234176,2589234431,AT +2589234432,2589234687,BD +2589234688,2589234943,BR +2589234944,2589235199,CY +2589235200,2589235455,CZ +2589235456,2589235711,FI +2589235712,2589235967,GR +2589235968,2589236223,HU +2589236224,2589236479,IN +2589236480,2589236735,ID +2589236736,2589236991,IR +2589236992,2589237247,IQ +2589237248,2589237503,IE +2589237504,2589237759,JP +2589237760,2589238015,JO +2589238016,2589238271,KE +2589238272,2589238527,LU +2589238528,2589238783,MY +2589238784,2589239039,MX +2589239040,2589239295,PH +2589239296,2589239551,PL +2589239552,2589239807,PT +2589239808,2589240063,QA +2589240064,2589240319,RU +2589240320,2589240575,SA +2589240576,2589240831,SK +2589240832,2589241087,HK +2589241088,2589241343,SE +2589241344,2589241599,CH +2589241600,2589241855,BR +2589241856,2589242111,TW +2589242112,2589242367,TR +2589242368,2589242623,UA +2589242624,2589242879,VN +2589242880,2589523967,US +2589523968,2589589503,HK +2589589504,2589655039,US +2589655040,2589720575,HK +2589720576,2589982719,US +2589982720,2590507007,SD +2590507008,2591031295,TN +2591031296,2591096831,GA +2591096832,2591162367,NG +2591162368,2591195135,ZA +2591195136,2591227903,GH +2591227904,2591260671,ZA +2591260672,2591264767,SN +2591264768,2591268863,ZA +2591268864,2591277055,KE +2591277056,2591293439,SO +2591293440,2591326207,GA +2591326208,2591358975,AO +2591358976,2591375359,GH +2591375360,2591391743,NG +2591391744,2591408127,ZA +2591408128,2591424511,BI +2591424512,2591457279,NG +2591457280,2591473663,ML +2591473664,2591477759,AO +2591477760,2591481855,PT +2591481856,2591483903,TZ +2591483904,2591485951,KE +2591485952,2591486975,SO +2591486976,2591487999,ZA +2591488000,2591489023,GA +2591489024,2591490047,ZA +2591490048,2591498239,BI +2591498240,2591510527,ZA +2591510528,2591514623,ZW +2591514624,2591522815,SZ +2591522816,2591526911,LR +2591526912,2591539199,ZA +2591539200,2591547391,GA +2591547392,2591555583,ZA +2591555584,2591571967,GH +2591571968,2591588351,NG +2591588352,2591604735,MG +2591604736,2591605759,ZA +2591605760,2591606783,KE +2591606784,2591610879,MU +2591610880,2591612927,ZM +2591612928,2591621119,ZW +2591621120,2591686655,DZ +2591686656,2591817727,KE +2591817728,2591948799,SN +2591948800,2591981567,MG +2591981568,2591997951,CM +2591997952,2592006143,ZA +2592006144,2592022527,TZ +2592022528,2592026623,BJ +2592026624,2592026879,US +2592026880,2592027391,ZA +2592027392,2592027647,GB +2592027648,2592028671,US +2592028672,2592028799,NG +2592028800,2592028927,KE +2592028928,2592029183,ZA +2592029184,2592029311,CI +2592029312,2592030207,ZA +2592030208,2592030335,GH +2592030336,2592030463,CM +2592030464,2592030591,UG +2592030592,2592030719,ZA +2592030720,2592034815,LY +2592034816,2592038911,NE +2592038912,2592043007,DZ +2592043008,2592047103,ZA +2592047104,2592079871,AO +2592079872,2593128447,EG +2593128448,2593522687,MA +2593522688,2593522943,EH +2593522944,2593652735,MA +2593652736,2594177023,KE +2594177024,2595225599,GH +2595225600,2596274175,EG +2596274176,2597322751,ZA +2597322752,2598361599,US +2598361600,2598362111,CI +2598362112,2598371327,US +2598371328,2598895615,UG +2598895616,2599157759,CI +2599157760,2599419903,EG +2599419904,2599508735,DZ +2599508736,2599508991,EH +2599508992,2600468479,DZ +2600468480,2600534015,ZM +2600534016,2600665087,US +2600665088,2600730623,CA +2600730624,2600779775,SE +2600779776,2600780031,NO +2600780032,2600781311,SE +2600781312,2600781567,NO +2600781568,2600788735,SE +2600788736,2600788991,NO +2600788992,2600791807,SE +2600791808,2600792063,NO +2600792064,2600796159,SE +2600796160,2601123839,US +2601123840,2601189375,CA +2601189376,2601254911,EG +2601254912,2601287679,TZ +2601287680,2601304063,EG +2601304064,2601312255,CM +2601312256,2601320447,GH +2601320448,2601451519,US +2601451520,2601517055,CA +2601517056,2602565631,US +2602565632,2602631167,NZ +2602631168,2602762495,US +2602762496,2602762751,IN +2602762752,2602770943,US +2602770944,2602771455,IN +2602771456,2602774015,US +2602774016,2602774527,IN +2602774528,2602819583,US +2602819584,2602827775,AU +2602827776,2603417599,US +2603417600,2603483135,DE +2603483136,2604007423,US +2604007424,2604072959,ES +2604072960,2604138495,NO +2604138496,2604204031,DE +2604204032,2604335103,US +2604335104,2604400639,NZ +2604400640,2604466175,AU +2604466176,2604648447,US +2604648448,2604648959,NZ +2604648960,2604649983,US +2604649984,2604650495,CA +2604650496,2604793855,US +2604793856,2604859391,CH +2604859392,2604990463,US +2604990464,2605055999,SG +2605056000,2605121535,US +2605121536,2605187071,AU +2605187072,2605252607,US +2605252608,2605318143,AT +2605318144,2606301183,US +2606301184,2606366719,AO +2606366720,2606563327,US +2606563328,2606596095,NG +2606596096,2606628863,ZA +2606628864,2607349759,US +2607349760,2607415295,CH +2607415296,2609053695,US +2609053696,2609119231,GB +2609119232,2609184767,FR +2609184768,2609217535,PL +2609217536,2609219583,FR +2609219584,2609233919,PL +2609233920,2609234175,ES +2609234176,2609234431,PL +2609234432,2609234687,PT +2609234688,2609234943,PL +2609234944,2609235711,US +2609235712,2609235839,SI +2609235840,2609235967,HR +2609235968,2609242111,DE +2609242112,2609246207,PL +2609246208,2609246719,LU +2609246720,2609247231,SE +2609247232,2609247487,HK +2609247488,2609247743,JP +2609247744,2609248255,ES +2609248256,2609248511,NL +2609248512,2609248767,CL +2609248768,2609249279,PE +2609249280,2609249535,SE +2609249536,2609250303,PL +2609250304,2609381375,US +2609381376,2609446911,GB +2609446912,2609512447,DK +2609512448,2609643519,US +2609643520,2609708799,FR +2609708800,2609708839,HK +2609708840,2609708843,FR +2609708844,2609709055,HK +2609709056,2609840127,US +2609840128,2609971199,AU +2609971200,2610036735,GB +2610036736,2610823167,US +2610823168,2610888703,PL +2610888704,2610954239,ZA +2610954240,2611019775,JP +2611019776,2612592639,US +2612592640,2612658175,IT +2612658176,2612723711,US +2612723712,2612789247,AU +2612789248,2613051391,US +2613051392,2613116927,GB +2613116928,2613182463,US +2613182464,2613247999,CA +2613248000,2613313535,US +2613313536,2613379071,SD +2613379072,2613444607,US +2613444608,2613510143,GB +2613510144,2613706751,US +2613706752,2613772287,GB +2613772288,2613837823,US +2613837824,2613903359,NL +2613903360,2613968895,AU +2613968896,2614034431,US +2614034432,2614099967,GR +2614099968,2614165503,US +2614165504,2614231039,NO +2614231040,2614296575,ES +2614296576,2614362111,BR +2614362112,2615083007,US +2615083008,2615148543,TR +2615148544,2615345151,US +2615345152,2615410687,NO +2615410688,2615476223,CH +2615476224,2615541759,US +2615541760,2615607295,KR +2615607296,2615672831,GB +2615672832,2616262655,ZA +2616262656,2616524799,US +2616524800,2616590335,GB +2616590336,2616786943,US +2616786944,2616852479,GB +2616852480,2616918015,DE +2616918016,2616983551,GM +2616983552,2617049087,US +2617049088,2617114623,IT +2617114624,2617115135,US +2617115136,2617115647,CA +2617115648,2617123839,US +2617123840,2617124095,DE +2617124352,2617124607,US +2617124864,2617126911,NL +2617129984,2617130239,US +2617130496,2617130751,US +2617131008,2617139199,CA +2617139200,2617139455,PE +2617139456,2617139711,SZ +2617139712,2617139967,AU +2617139968,2617140223,PA +2617140224,2617140479,CO +2617140480,2617140735,SC +2617140736,2617140991,CA +2617140992,2617141247,LC +2617141248,2617141503,SV +2617141504,2617141759,US +2617141760,2617142015,ZW +2617142016,2617142271,KR +2617142272,2617142527,US +2617142528,2617142783,LU +2617142784,2617143039,US +2617143040,2617143295,UG +2617143296,2617143551,US +2617143552,2617143807,TT +2617143808,2617144063,US +2617144064,2617144319,ZA +2617144320,2617144575,US +2617144576,2617144831,FJ +2617144832,2617145343,US +2617145344,2617145599,NI +2617145600,2617145855,UA +2617145856,2617146111,US +2617146112,2617146367,CI +2617146368,2617146623,US +2617146624,2617146879,GY +2617146880,2617147135,DE +2617147136,2617149439,US +2617149440,2617151487,CA +2617151488,2617157119,US +2617157120,2617157631,RU +2617157632,2617158655,US +2617158656,2617159679,SE +2617159680,2617162751,US +2617162752,2617163263,SE +2617163264,2617163775,US +2617163776,2617164031,SK +2617164032,2617164287,MC +2617164288,2617164543,AZ +2617164544,2617164799,FI +2617164800,2617165055,CZ +2617165056,2617165311,UZ +2617165312,2617165567,BT +2617165568,2617165823,CN +2617165824,2617166079,ME +2617166080,2617166335,YE +2617166336,2617166591,KH +2617166592,2617166847,TJ +2617166848,2617167103,KG +2617167104,2617167359,IN +2617167360,2617167615,DK +2617167616,2617167871,IL +2617167872,2617168127,PL +2617168128,2617168383,LA +2617168384,2617168639,GH +2617168640,2617168895,BD +2617168896,2617169151,LI +2617169152,2617169407,ET +2617169408,2617169663,SM +2617169664,2617169919,BH +2617169920,2617170175,CY +2617170176,2617170431,NZ +2617170432,2617170687,PS +2617170688,2617170943,GI +2617170944,2617171199,RS +2617171200,2617171455,HK +2617171456,2617171711,HR +2617171712,2617171967,SN +2617171968,2617172223,MV +2617172224,2617172479,AF +2617172480,2617172735,JP +2617172736,2617172991,CM +2617172992,2617173247,VA +2617173248,2617173503,JP +2617173504,2617173759,TM +2617173760,2617174015,GE +2617174016,2617174271,TR +2617174272,2617174527,TW +2617174528,2617174783,KW +2617174784,2617175039,EE +2617175040,2617175295,CN +2617175296,2617175551,MA +2617175552,2617175807,BA +2617175808,2617176063,IQ +2617176064,2617176319,NO +2617176320,2617176575,AU +2617176576,2617176831,TH +2617176832,2617177087,VN +2617177088,2617177343,US +2617177344,2617177599,RU +2617177600,2617177855,IN +2617177856,2617178111,BE +2617178112,2617178367,IM +2617178368,2617178623,BN +2617178624,2617178879,US +2617178880,2617179135,LT +2617179136,2617179391,MD +2617179392,2617179647,SI +2617179648,2617179903,KE +2617179904,2617180159,NG +2617180160,2617245695,UG +2617245696,2617262079,LS +2617262080,2617266175,ZA +2617268224,2617269247,CD +2617270272,2617278463,ZA +2617278464,2617286655,GH +2617286656,2617296383,ZA +2617296384,2617296639,CD +2617296640,2617296895,AO +2617296896,2617299967,ZA +2617299968,2617300991,BJ +2617300992,2617305087,ZA +2617305088,2617305599,KE +2617305600,2617306111,GH +2617306112,2617307135,ZA +2617307136,2617308159,SZ +2617308160,2617309183,ZA +2617309184,2617310207,NG +2617310208,2617310719,ZA +2617310720,2617310975,AO +2617310976,2617311231,NG +2617311232,2617769983,US +2617769984,2617835519,ZA +2617835520,2617901055,US +2617901056,2617966591,FI +2617966592,2618028031,CA +2618028032,2618028543,IE +2618028544,2618029055,GB +2618029056,2618032127,CA +2618032128,2618097663,US +2618097664,2618115583,NZ +2618115584,2618116095,SG +2618116096,2618163199,NZ +2618163200,2618228735,IT +2618228736,2618294271,US +2618359808,2618425343,PL +2618425344,2618490879,FR +2618490880,2618687487,US +2618687488,2618753023,AU +2618753024,2618884095,US +2618884096,2618949631,CH +2618949632,2619080703,US +2619080704,2619146239,FR +2619146240,2619277311,US +2619277312,2619342847,BN +2619342848,2619473919,US +2619473920,2619539455,CA +2619539456,2619604991,ES +2619604992,2619736063,US +2619736064,2619737087,ZA +2619737088,2619738111,BW +2619738112,2619740159,RW +2619740160,2619744255,BW +2619744256,2619752447,LY +2619752448,2619760639,TG +2619760640,2619768831,GH +2619768832,2619801599,ZA +2619801600,2620063743,US +2620063744,2620078591,GB +2620078592,2620078847,US +2620078848,2620129279,GB +2620129280,2620194815,CA +2620194816,2620315039,US +2620315040,2620315063,DE +2620315064,2620391423,US +2620391424,2620456959,GB +2620456960,2620522495,SE +2620522496,2620588031,AU +2620588032,2620653567,SE +2620653568,2620719103,NO +2620719104,2620784639,US +2620784640,2620850175,IT +2620850176,2620981247,US +2620981248,2621046783,CA +2621046784,2621112319,AT +2621112320,2621177855,NZ +2621177856,2621243391,US +2621243392,2621308927,GB +2621308928,2621374463,NZ +2621374464,2621636863,US +2621636864,2621636991,CZ +2621636992,2621637055,MD +2621637056,2621637119,BG +2621637120,2621637631,US +2621637632,2621638159,DE +2621638160,2621638167,GB +2621638168,2621638655,DE +2621638656,2621639679,CH +2621639680,2621640191,DE +2621640192,2621640703,NL +2621640704,2621641727,DE +2621641728,2621642751,IT +2621642752,2621644799,DE +2621644800,2621645823,GB +2621645824,2621646335,DE +2621646336,2621646591,CH +2621646592,2621648895,DE +2621648896,2621649919,UA +2621649920,2621651967,DE +2621651968,2621652991,ES +2621652992,2621669375,PL +2621669376,2621685759,DE +2621685760,2621685887,NO +2621685888,2621686015,DK +2621686016,2621686271,GB +2621686272,2621686527,AU +2621686528,2621686783,GB +2621686784,2621687039,AU +2621687040,2621687295,GB +2621687296,2621687423,CZ +2621687424,2621687551,PL +2621687552,2621687807,GB +2621687808,2621687935,AT +2621687936,2621688063,IE +2621688064,2621688319,AU +2621688320,2621688575,MX +2621688576,2621688831,AU +2621688832,2621689087,GB +2621689088,2621689151,HU +2621689152,2621689215,SK +2621689216,2621689279,PL +2621689280,2621689343,CZ +2621689344,2621689599,AU +2621689600,2621689855,CA +2621689856,2621692927,SG +2621692928,2621693951,CY +2621693952,2621698047,DE +2621698048,2621702143,GB +2621702144,2621767679,US +2621767680,2621833215,NZ +2621833216,2621936895,US +2621936896,2621937151,SG +2621937152,2622685183,US +2622685184,2622750719,NL +2622750720,2623602687,US +2623602688,2623668223,CL +2623668224,2624192511,US +2624192512,2624258047,CH +2624258048,2624265727,US +2624265728,2624266239,SG +2624266240,2624269313,US +2624269314,2624269314,AU +2624269315,2624269317,US +2624269318,2624269318,AU +2624269319,2624269321,US +2624269322,2624269322,AU +2624269323,2624269345,US +2624269346,2624269346,AU +2624269347,2624269349,US +2624269350,2624269350,AU +2624269351,2624269353,US +2624269354,2624269354,AU +2624269355,2624269377,US +2624269378,2624269378,AU +2624269379,2624269381,US +2624269382,2624269382,AU +2624269383,2624269385,US +2624269386,2624269386,AU +2624269387,2624270335,US +2624270336,2624270847,AU +2624270848,2624277503,US +2624277504,2624278015,AU +2624278016,2624279039,US +2624279040,2624279071,IN +2624279072,2624279095,US +2624279096,2624279111,IN +2624279112,2624286719,US +2624286720,2624287231,IN +2624287232,2624291839,US +2624291840,2624292351,CN +2624292352,2624292863,US +2624292864,2624292883,SG +2624292884,2624292887,HK +2624292888,2624292891,SG +2624292892,2624292895,TW +2624292896,2624292899,KR +2624292900,2624292903,VN +2624292904,2624292907,JP +2624292908,2624292911,ID +2624292912,2624292915,MY +2624292916,2624292919,PH +2624292920,2624292923,TH +2624292924,2624293003,SG +2624293004,2624293007,HK +2624293008,2624293011,SG +2624293012,2624293015,TW +2624293016,2624293019,KR +2624293020,2624293023,VN +2624293024,2624293027,JP +2624293028,2624293031,ID +2624293032,2624293035,MY +2624293036,2624293039,PH +2624293040,2624293043,TH +2624293044,2624293139,SG +2624293140,2624293143,HK +2624293144,2624293147,SG +2624293148,2624293151,TW +2624293152,2624293155,KR +2624293156,2624293159,VN +2624293160,2624293163,JP +2624293164,2624293167,ID +2624293168,2624293171,MY +2624293172,2624293175,PH +2624293176,2624293179,TH +2624293180,2624293375,SG +2624293376,2624293385,US +2624293386,2624293386,SG +2624293387,2624297983,US +2624297984,2624297999,SG +2624298000,2624298003,CN +2624298004,2624298007,HK +2624298008,2624298011,SG +2624298012,2624298015,TW +2624298016,2624298019,KR +2624298020,2624298023,VN +2624298024,2624298027,JP +2624298028,2624298031,ID +2624298032,2624298035,MY +2624298036,2624298039,PH +2624298040,2624298043,TH +2624298044,2624298119,SG +2624298120,2624298123,CN +2624298124,2624298127,HK +2624298128,2624298131,SG +2624298132,2624298135,TW +2624298136,2624298139,KR +2624298140,2624298143,VN +2624298144,2624298147,JP +2624298148,2624298151,ID +2624298152,2624298155,MY +2624298156,2624298159,PH +2624298160,2624298163,TH +2624298164,2624298255,SG +2624298256,2624298259,CN +2624298260,2624298263,HK +2624298264,2624298267,SG +2624298268,2624298271,TW +2624298272,2624298275,KR +2624298276,2624298279,VN +2624298280,2624298283,JP +2624298284,2624298287,ID +2624298288,2624298291,MY +2624298292,2624298295,PH +2624298296,2624298299,TH +2624298300,2624298495,SG +2624298496,2624302081,US +2624302082,2624302082,AU +2624302083,2624302085,US +2624302086,2624302086,AU +2624302087,2624302089,US +2624302090,2624302090,AU +2624302091,2624302113,US +2624302114,2624302114,AU +2624302115,2624302117,US +2624302118,2624302118,AU +2624302119,2624302121,US +2624302122,2624302122,AU +2624302123,2624302149,US +2624302150,2624302150,AU +2624302151,2624302153,US +2624302154,2624302154,AU +2624302155,2624302591,US +2624302592,2624303103,AU +2624303104,2624303615,US +2624303616,2624304639,CN +2624304640,2624395263,US +2624395264,2624395775,GB +2624395776,2624716799,US +2624716800,2624782335,NL +2624782336,2624847871,CH +2624847872,2624913407,NO +2624913408,2624978943,US +2624978944,2625044479,FR +2625044480,2625134559,US +2625134560,2625134591,UA +2625134592,2625961983,US +2625961984,2626027519,LU +2626027520,2626093055,US +2626093056,2626158591,CH +2626158592,2626879487,US +2626879488,2626945023,KR +2626945024,2627010559,IT +2627010560,2627076095,NZ +2627076096,2627141631,NL +2627141632,2627354706,US +2627354707,2627354707,HK +2627354708,2627403775,US +2627403776,2627469311,ZA +2627469312,2627731455,TZ +2627731456,2631925759,EG +2631925760,2632450047,ZA +2632450048,2632974335,US +2632974336,2634022911,ZA +2634022912,2634088447,CN +2634088448,2635202559,JP +2635202560,2635268095,CN +2635268096,2635333631,JP +2635399168,2635530239,US +2635530240,2635595775,FR +2635595776,2635661311,FI +2635661312,2635726847,PL +2635726848,2635792383,CH +2635792384,2635988991,IT +2635988992,2636120063,US +2636120064,2637430783,IN +2637430784,2637438975,CA +2637438976,2637447679,US +2637447680,2637447935,CA +2637447936,2637448191,US +2637448192,2637448447,ZA +2637448448,2637448703,ES +2637448704,2637448959,NZ +2637448960,2637449215,SG +2637449216,2637449727,BR +2637449728,2637451519,US +2637451520,2637451775,HK +2637451776,2637452031,US +2637452032,2637452543,IN +2637452544,2637452799,CA +2637452800,2637453311,US +2637453312,2637453567,AR +2637453568,2637453823,CL +2637453824,2637454079,US +2637454080,2637454335,JP +2637454336,2637627391,US +2637627392,2637627551,IE +2637627552,2637627583,US +2637627584,2637628031,IE +2637628032,2637628095,US +2637628096,2637628927,IE +2637628928,2637628959,US +2637628960,2637629007,IE +2637629008,2637629023,US +2637629024,2637629311,IE +2637629312,2637629375,US +2637629376,2637629439,IE +2637629440,2637629599,NL +2637629600,2637629631,IE +2637629632,2637629663,NL +2637629664,2637629807,IE +2637629808,2637629823,US +2637629824,2637629951,IE +2637629952,2637630111,US +2637630112,2637630119,IE +2637630120,2637630127,US +2637630128,2637630143,IE +2637630144,2637630207,US +2637630208,2637630335,NL +2637630336,2637630479,US +2637630480,2637630495,IE +2637630496,2637630655,US +2637630656,2637630783,IE +2637630784,2637630847,US +2637630848,2637631487,IE +2637631488,2637637887,US +2637637888,2637638143,IE +2637638144,2637638399,US +2637638400,2637638463,IE +2637638464,2637638503,US +2637638504,2637638511,IE +2637638512,2637638671,US +2637638672,2637638815,IE +2637638816,2637638879,US +2637638880,2637638911,IE +2637638912,2637638943,US +2637638944,2637639039,IE +2637639040,2637639359,US +2637639360,2637639423,IE +2637639424,2637639551,US +2637639552,2637639679,IE +2637639680,2637641535,US +2637641536,2637641567,IE +2637641568,2637641663,US +2637641664,2637641671,IE +2637641672,2637654591,US +2637654592,2637654655,IE +2637654656,2637654783,US +2637654784,2637655039,IE +2637655040,2637679743,US +2637679744,2637679871,IE +2637679872,2637684735,US +2637684736,2637684991,IE +2637684992,2637685183,US +2637685184,2637685215,IE +2637685216,2637685247,US +2637685248,2637685631,IE +2637685632,2637685663,US +2637685664,2637685695,IE +2637685696,2637686271,US +2637686272,2637686463,IE +2637686464,2637686495,US +2637686496,2637686503,IE +2637686504,2637686511,NL +2637686512,2637686655,US +2637686656,2637686783,IE +2637686784,2637686855,US +2637686856,2637686975,IE +2637686976,2637687215,US +2637687216,2637687615,IE +2637687616,2637687679,US +2637687680,2637688319,IE +2637688320,2637688479,US +2637688480,2637688831,IE +2637688832,2637722143,US +2637722144,2637722175,IE +2637722176,2637722943,US +2637722944,2637722975,NL +2637722976,2637723647,US +2637723648,2637725695,IE +2637725696,2637733119,US +2637733120,2637733375,JP +2637733376,2637733631,SG +2637733632,2637742079,US +2637742080,2637744127,IE +2637744128,2637746175,US +2637746176,2637746183,FI +2637746184,2637746191,IE +2637746192,2637746199,NL +2637746200,2637746207,FI +2637746208,2637746215,IE +2637746216,2637746223,US +2637746224,2637746231,AT +2637746232,2637746247,US +2637746248,2637746255,FI +2637746256,2637746263,AT +2637746264,2637746279,NL +2637746280,2637746687,US +2637746688,2637746703,KR +2637746704,2637746743,US +2637746744,2637746751,HK +2637746752,2637746759,SG +2637746760,2637746767,KR +2637746768,2637756415,US +2637756416,2637757439,NL +2637757440,2637758463,IE +2637758464,2637997055,US +2637997056,2637997311,AU +2637997312,2637998591,US +2637998592,2637998847,AU +2637998848,2638000127,US +2638000128,2638000255,AU +2638000256,2638002175,US +2638002176,2638002687,AU +2638002688,2638020607,US +2638020608,2638086143,CN +2638086144,2638151679,US +2638151680,2638818303,JP +2638818304,2638818559,SO +2638818560,2638838783,JP +2638838784,2638839039,SO +2638839040,2639331327,JP +2639396864,2639462399,JP +2639462400,2639593471,GB +2639593472,2639659007,AU +2639659008,2639724543,BR +2639724544,2639790079,US +2639790080,2639855615,ES +2639855616,2640052223,US +2640052224,2640117759,AR +2640117760,2640183295,US +2640183296,2640248831,FI +2640248832,2640314367,US +2640314368,2640379903,GB +2640379904,2640388095,IS +2640388096,2640392191,DE +2640392192,2640396287,NL +2640396288,2640397311,ES +2640397312,2640398335,AT +2640398336,2640400383,DE +2640400384,2640404479,ES +2640404480,2640404735,NL +2640404736,2640404991,US +2640404992,2640405503,NL +2640405504,2640406527,US +2640406528,2640408575,DE +2640408576,2640410623,NL +2640410624,2640411135,US +2640411136,2640411391,MX +2640411392,2640412671,US +2640412672,2640413695,GB +2640413696,2640413951,NL +2640413952,2640414463,US +2640414464,2640414719,DE +2640414720,2640416767,FR +2640416768,2640417023,NL +2640417024,2640417279,CA +2640417280,2640417791,NL +2640417792,2640418815,CH +2640418816,2640420863,NO +2640420864,2640421631,IT +2640421632,2640421887,DE +2640421888,2640422911,SE +2640422912,2640423935,NL +2640423936,2640429055,ES +2640429056,2640445439,NL +2640445440,2640510975,US +2640510976,2640576511,FR +2640576512,2640642047,EC +2640642048,2641740287,JP +2641740288,2641740543,BI +2641740544,2641821695,JP +2641821696,2641822719,CN +2641822720,2641823743,JP +2641823744,2641826815,CN +2641826816,2641827839,HK +2641827840,2641828095,IN +2641828096,2641828351,US +2641828352,2641828863,IN +2641828864,2641829887,CN +2641829888,2641831935,KR +2641831936,2641833983,IN +2641833984,2641835007,BD +2641835008,2641836031,JP +2641836032,2641837055,ID +2641837056,2641838079,NZ +2641838080,2641839103,JP +2641839104,2641840127,CN +2641840128,2641841151,HK +2641841152,2641842175,MM +2641842176,2641845247,IN +2641845248,2641846271,HK +2641846272,2641847295,NL +2641847296,2641848319,IR +2641848320,2641850367,IN +2641850368,2641851391,HK +2641851392,2641854463,IN +2641854464,2641855487,JP +2641855488,2641864703,CN +2641864704,2641865727,IN +2641865728,2641866751,CN +2641866752,2641867775,IN +2641867776,2641868799,LA +2641868800,2641869823,BD +2641869824,2641870847,IR +2641870848,2641872895,CN +2641872896,2641878015,IN +2641878016,2641879039,ID +2641879040,2641881087,IN +2641881088,2641882111,HK +2641882112,2641883135,BD +2641883136,2641884159,CN +2641884160,2641886207,VN +2641886208,2641887231,CN +2641887232,2641928191,JP +2641928192,2641936383,SG +2641936384,2641944575,US +2641944576,2641946625,JP +2641946626,2641946626,HK +2641946627,2641952767,JP +2641952768,2642018303,US +2642018304,2642083839,CN +2642083840,2642149375,US +2642149376,2642214911,FI +2642214912,2642280447,GB +2642280448,2642411519,US +2642411520,2642477055,AU +2642477056,2642542591,FI +2642542592,2642739199,US +2642739200,2642743295,RU +2642743296,2642751487,US +2642751488,2642755583,CA +2642755584,2642757631,DE +2642757632,2642759679,US +2642759680,2642761727,AE +2642761728,2642763775,SA +2642763776,2642767871,AU +2642767872,2642771967,DE +2642771968,2642776063,NL +2642776064,2642780159,JP +2642780160,2642935807,US +2642935808,2643001343,FR +2643001344,2643066879,US +2643066880,2643132415,IT +2643132416,2643197951,US +2643197952,2643263487,GB +2643263488,2643460095,US +2643460096,2643525631,FI +2643525632,2643722239,US +2643722240,2643787775,CN +2643787776,2644180991,US +2644180992,2644246527,AU +2644246528,2644312063,CN +2644312064,2644377599,IS +2644377600,2644443135,PL +2644443136,2644508671,FR +2644508672,2644574207,US +2644574208,2644639743,CH +2644639744,2644770815,DE +2644770816,2644836351,BE +2644836352,2644967423,US +2645032960,2645098495,CH +2645098496,2645164031,FR +2645164032,2645229567,US +2645229568,2645295103,SE +2645295104,2645360639,FR +2645360640,2645426175,GB +2645426176,2645622783,US +2645622784,2645688319,AT +2645688320,2645753855,US +2645753856,2645819391,TH +2645819392,2645884927,SE +2645884928,2645950463,HU +2645950464,2646196223,US +2646196224,2646212607,JP +2646212608,2646278143,RU +2646278144,2646474751,US +2646474752,2646540287,IE +2646540288,2646546953,US +2646546954,2646546954,CA +2646546955,2646547013,US +2646547014,2646547014,MX +2646547015,2646547017,US +2646547018,2646547018,MX +2646547019,2646547021,US +2646547022,2646547022,CA +2646547023,2646547077,US +2646547078,2646547078,CA +2646547079,2646547081,US +2646547082,2646547082,CA +2646547083,2646547209,US +2646547210,2646547210,CA +2646547211,2646547269,US +2646547270,2646547270,MX +2646547271,2646547273,US +2646547274,2646547274,MX +2646547275,2646547277,US +2646547278,2646547278,CA +2646547279,2646547333,US +2646547334,2646547334,CA +2646547335,2646547337,US +2646547338,2646547338,CA +2646547339,2646551561,US +2646551562,2646551562,CA +2646551563,2646551621,US +2646551622,2646551622,MX +2646551623,2646551625,US +2646551626,2646551626,MX +2646551627,2646551629,US +2646551630,2646551630,CA +2646551631,2646551685,US +2646551686,2646551686,CA +2646551687,2646551689,US +2646551690,2646551690,CA +2646551691,2646551749,US +2646551750,2646551750,CO +2646551751,2646551751,US +2646551752,2646551753,CR +2646551754,2646551754,PA +2646551755,2646551755,CR +2646551756,2646551757,US +2646551758,2646551758,CR +2646551759,2646551761,US +2646551762,2646551764,CR +2646551765,2646551817,US +2646551818,2646551818,CA +2646551819,2646551877,US +2646551878,2646551878,MX +2646551879,2646551881,US +2646551882,2646551882,MX +2646551883,2646551885,US +2646551886,2646551886,CA +2646551887,2646551941,US +2646551942,2646551942,CA +2646551943,2646551945,US +2646551946,2646551946,CA +2646551947,2646552005,US +2646552006,2646552006,CO +2646552007,2646552007,US +2646552008,2646552009,CR +2646552010,2646552010,PA +2646552011,2646552011,CR +2646552012,2646552013,US +2646552014,2646552014,CR +2646552015,2646552017,US +2646552018,2646552020,CR +2646552021,2646561033,US +2646561034,2646561034,CA +2646561035,2646561093,US +2646561094,2646561094,MX +2646561095,2646561097,US +2646561098,2646561098,MX +2646561099,2646561101,US +2646561102,2646561102,CA +2646561103,2646561157,US +2646561158,2646561158,CA +2646561159,2646561161,US +2646561162,2646561162,CA +2646561163,2646561221,US +2646561222,2646561222,CO +2646561223,2646561223,US +2646561224,2646561225,CR +2646561226,2646561226,PA +2646561227,2646561227,CR +2646561228,2646561229,US +2646561230,2646561230,CR +2646561231,2646561233,US +2646561234,2646561236,CR +2646561237,2646565129,US +2646565130,2646565130,CA +2646565131,2646565189,US +2646565190,2646565190,MX +2646565191,2646565193,US +2646565194,2646565194,MX +2646565195,2646565197,US +2646565198,2646565198,CA +2646565199,2646565253,US +2646565254,2646565254,CA +2646565255,2646565257,US +2646565258,2646565258,CA +2646565259,2646585089,US +2646585090,2646585090,AR +2646585091,2646585093,US +2646585094,2646585094,PE +2646585095,2646585097,US +2646585098,2646585098,BR +2646585099,2646585101,US +2646585102,2646585102,CL +2646585103,2646585105,US +2646585106,2646585106,SV +2646585107,2646585109,US +2646585110,2646585110,BR +2646585111,2646585113,US +2646585114,2646585114,BR +2646585115,2646585117,US +2646585118,2646585118,CO +2646585119,2646585121,US +2646585122,2646585122,PA +2646585123,2646585125,US +2646585126,2646585126,CR +2646585127,2646585129,US +2646585130,2646585132,CR +2646585133,2646585135,US +2646585136,2646585139,CR +2646585140,2646585153,US +2646585154,2646585154,AR +2646585155,2646585157,US +2646585158,2646585158,PE +2646585159,2646585161,US +2646585162,2646585162,BR +2646585163,2646585165,US +2646585166,2646585166,CL +2646585167,2646585169,US +2646585170,2646585170,SV +2646585171,2646585173,US +2646585174,2646585174,BR +2646585175,2646585177,US +2646585178,2646585178,BR +2646585179,2646585181,US +2646585182,2646585182,CO +2646585183,2646585185,US +2646585186,2646585186,PA +2646585187,2646585189,US +2646585190,2646585190,CR +2646585191,2646585193,US +2646585194,2646585196,CR +2646585197,2646585199,US +2646585200,2646585203,CR +2646585204,2646585217,US +2646585218,2646585218,AR +2646585219,2646585221,US +2646585222,2646585222,PE +2646585223,2646585225,US +2646585226,2646585226,BR +2646585227,2646585229,US +2646585230,2646585230,CL +2646585231,2646585233,US +2646585234,2646585234,SV +2646585235,2646585237,US +2646585238,2646585238,BR +2646585239,2646585241,US +2646585242,2646585242,BR +2646585243,2646585245,US +2646585246,2646585246,CO +2646585247,2646585249,US +2646585250,2646585250,PA +2646585251,2646585253,US +2646585254,2646585254,CR +2646585255,2646585257,US +2646585258,2646585260,CR +2646585261,2646585263,US +2646585264,2646585267,CR +2646585268,2646602497,US +2646602498,2646602498,AR +2646602499,2646602501,US +2646602502,2646602502,PE +2646602503,2646602505,US +2646602506,2646602506,BR +2646602507,2646602509,US +2646602510,2646602510,CL +2646602511,2646602513,US +2646602514,2646602514,SV +2646602515,2646602521,US +2646602522,2646602522,BR +2646602523,2646602561,US +2646602562,2646602562,AR +2646602563,2646602565,US +2646602566,2646602566,PE +2646602567,2646602569,US +2646602570,2646602570,BR +2646602571,2646602573,US +2646602574,2646602574,CL +2646602575,2646602577,US +2646602578,2646602578,SV +2646602579,2646602581,US +2646602582,2646602582,BR +2646602583,2646602585,US +2646602586,2646602586,BR +2646602587,2646602625,US +2646602626,2646602626,AR +2646602627,2646602629,US +2646602630,2646602630,PE +2646602631,2646602633,US +2646602634,2646602634,BR +2646602635,2646602637,US +2646602638,2646602638,CL +2646602639,2646602641,US +2646602642,2646602642,SV +2646602643,2646602645,US +2646602646,2646602646,BR +2646602647,2646602649,US +2646602650,2646602650,BR +2646602651,2646605823,US +2646605824,2646671359,JP +2646671360,2646736895,BE +2646736896,2646933503,US +2646933504,2646999039,KR +2646999040,2647130111,US +2647130112,2647195647,FI +2647195648,2647326719,US +2647326720,2647392255,GB +2647392256,2647457791,US +2647457792,2647523327,JP +2647523328,2647605503,US +2647605504,2647605759,GB +2647605760,2647851007,US +2647851008,2647916543,AU +2647916544,2648899583,US +2648899584,2648965119,IN +2648965120,2649030655,GB +2649030656,2649489407,US +2649489408,2649554943,GB +2649554944,2649620479,NO +2649620480,2649948159,US +2649948160,2650013695,FR +2650013696,2650079231,CA +2650079232,2650210303,US +2650210304,2650275839,AT +2650275840,2650341375,US +2650341376,2650406911,NO +2650406912,2650423295,US +2650423296,2650472447,JP +2650472448,2650603519,US +2650603520,2650669055,CO +2650669056,2650734591,US +2650734592,2650800127,CN +2650800128,2652528639,US +2652528640,2652528895,AR +2652528896,2652541183,US +2652541184,2652541439,NL +2652541440,2653159423,US +2653159424,2653421567,NO +2653421568,2653487103,AU +2653487104,2653552639,GB +2653552640,2653618175,ES +2653618176,2653683711,GB +2653683712,2653749247,KR +2653749248,2653814783,AU +2653814784,2653847551,RU +2653847552,2653849599,IN +2653849600,2653851647,FR +2653851648,2653855743,GB +2653855744,2653856767,KR +2653856768,2653863935,TH +2653863936,2653872127,IN +2653872128,2653880319,RU +2653880320,2653945855,IT +2653945856,2654011391,US +2654011392,2654076927,ES +2654076928,2654085119,FR +2654085120,2654089215,HK +2654089216,2654093311,FR +2654093312,2654097407,US +2654097408,2654142463,FR +2654208000,2654339071,US +2654339072,2654404607,AU +2654404608,2654601215,US +2654601216,2654633983,IR +2654633984,2654636031,RU +2654636032,2654638079,IT +2654638080,2654640127,DE +2654640128,2654642175,NO +2654642176,2654644223,GB +2654644224,2654646271,IT +2654646272,2654648319,FR +2654648320,2654650367,IR +2654650368,2654666751,BG +2654666752,2654994431,US +2654994432,2655059967,LU +2655059968,2655125503,US +2655125504,2655191039,PL +2655256576,2655322111,US +2655322112,2655326287,CA +2655326288,2655326303,US +2655326304,2655326591,CA +2655326592,2655326595,US +2655326596,2655329371,CA +2655329372,2655329375,US +2655329376,2655332295,CA +2655332296,2655332303,US +2655332304,2655336703,CA +2655336704,2655336959,US +2655336960,2655349943,CA +2655349944,2655349951,US +2655349952,2655352517,CA +2655352518,2655352518,US +2655352519,2655358207,CA +2655358208,2655358463,US +2655358464,2655360143,CA +2655360144,2655360151,US +2655360152,2655369863,CA +2655369864,2655369871,US +2655369872,2655387647,CA +2655387648,2655715327,US +2655715328,2655780863,PL +2655780864,2656387071,US +2656387072,2656403455,CA +2656403456,2656632831,US +2656632832,2656698367,AU +2656698368,2656763903,FI +2656763904,2656829439,US +2656829440,2656894975,SE +2656894976,2656960511,US +2656960512,2657026047,GB +2657026048,2657157119,US +2657157120,2657222655,MX +2657222656,2657288191,US +2657288192,2657353727,ES +2657353728,2657484799,US +2657484800,2657550335,IT +2657550336,2657681407,US +2657681408,2657746943,SE +2657746944,2657763327,US +2657763328,2657779711,CA +2657779712,2657804287,US +2657804288,2657810431,CA +2657810432,2657878015,US +2657878016,2657943551,TH +2657943552,2658009087,ES +2658009088,2658074623,IT +2658074624,2658140159,US +2658140160,2658205695,NO +2658205696,2658454491,US +2658454492,2658454492,IN +2658454493,2658459355,US +2658459356,2658459356,IN +2658459357,2658459903,US +2658459904,2658460159,HU +2658460160,2658598911,US +2658598912,2658664447,GB +2658664448,2658926591,US +2658926592,2659057663,GB +2659057664,2659123199,SE +2659123200,2659180543,FI +2659180544,2659181823,NL +2659181824,2659182079,BE +2659182080,2659184639,NL +2659184640,2659188735,FI +2659188736,2659254271,CA +2659254272,2659319807,LT +2659319808,2659385343,US +2659385344,2659450879,FI +2659450880,2659516415,HK +2659516416,2659581951,CH +2659581952,2659979263,US +2659979264,2659983359,PS +2659983360,2659991551,US +2659991552,2660007935,PS +2660007936,2660016127,SG +2660016128,2660024319,ID +2660024320,2660032511,AU +2660032512,2660039679,NZ +2660039680,2660040703,AU +2660040704,2660106239,CA +2660106240,2660171775,US +2660171776,2660237311,GB +2660237312,2660302847,IN +2660302848,2660499455,US +2660499456,2660564991,IT +2660564992,2660696063,NO +2660696064,2660761599,US +2660761600,2660827135,GB +2660827136,2661023743,US +2661023744,2661089279,FR +2661089280,2661285887,US +2661285888,2661351423,VE +2661351424,2661416959,BN +2661416960,2661482495,PT +2661482496,2661548031,CA +2661548032,2661679103,US +2661679104,2661885951,LU +2661885952,2661886207,BE +2661886208,2661914111,LU +2661914112,2661914367,BE +2661914368,2661941247,LU +2661941248,2662006783,CL +2662006784,2662072319,US +2662072320,2662137855,ES +2662137856,2662203391,DK +2662203392,2662268927,SE +2662268928,2662287391,US +2662287392,2662287407,AF +2662287408,2662287519,US +2662287520,2662287551,AF +2662287552,2662300879,US +2662300880,2662300895,JP +2662300896,2662366271,US +2662366272,2662366287,IE +2662366288,2662366591,US +2662366592,2662366607,AF +2662366608,2662416463,US +2662416464,2662416471,SE +2662416472,2662417947,US +2662417948,2662417951,DE +2662417952,2662418815,US +2662418816,2662418819,DE +2662418820,2662420103,US +2662420104,2662420111,SE +2662420112,2662421647,US +2662421648,2662421655,IT +2662421656,2662421887,US +2662421888,2662422015,DE +2662422016,2662422543,US +2662422544,2662422559,HU +2662422560,2662423183,US +2662423184,2662423199,IT +2662423200,2662498303,US +2662498304,2662662143,GB +2662662144,2662670335,KG +2662670336,2662674431,AZ +2662674432,2662677087,DE +2662677088,2662677279,US +2662677280,2662677375,DE +2662677376,2662678527,US +2662678528,2662686719,DE +2662686720,2662694911,CH +2662694912,2662727679,KG +2662727680,2662793215,HK +2662793216,2663251967,US +2663251968,2663448575,FR +2663448576,2663514111,SK +2663514112,2663579647,CZ +2663579648,2663645183,SK +2663645184,2663710719,CZ +2663710720,2663776255,SK +2663776256,2664955903,JP +2664955904,2665021439,CH +2665021440,2665086975,JP +2665086976,2665152511,GB +2665152512,2665218047,US +2665218048,2665283583,CH +2665283584,2665359359,US +2665359360,2665359871,MF +2665359872,2665375743,US +2665375744,2665377791,CA +2665377792,2665414655,US +2665414656,2665480191,GB +2665480192,2665545727,US +2665545728,2665611263,DE +2665611264,2665676799,CH +2665676800,2665742335,ES +2665742336,2665873407,US +2665873408,2665938943,GB +2665938944,2666004479,FR +2666004480,2666070015,CH +2666070016,2666133880,SE +2666133881,2666133881,DK +2666133882,2666133882,SE +2666133883,2666133883,FI +2666133884,2666133884,NO +2666133885,2666133885,PL +2666133886,2666133886,DK +2666133887,2666133887,SE +2666133888,2666133888,FI +2666133889,2666133889,NO +2666133890,2666133890,PL +2666133891,2666135551,SE +2666135552,2666201087,GB +2666201088,2667053055,US +2667053056,2667085823,NO +2667085824,2667118591,DK +2667118592,2667184127,HU +2667184128,2667249663,RU +2667249664,2667315199,CL +2667315200,2667511807,US +2667511808,2667513855,RU +2667513856,2667515903,GB +2667515904,2667517951,CZ +2667517952,2667519999,SK +2667520000,2667522047,CZ +2667522048,2667524095,GB +2667524096,2667526143,RU +2667526144,2667528191,LV +2667528192,2667532287,FR +2667532288,2667534335,RU +2667534336,2667536383,PL +2667536384,2667536575,AT +2667536576,2667536583,FR +2667536584,2667536615,AT +2667536616,2667536623,FR +2667536624,2667537087,AT +2667537088,2667537119,FR +2667537120,2667537151,AT +2667537152,2667537215,FR +2667537216,2667537231,AT +2667537232,2667537239,FR +2667537240,2667537279,AT +2667537280,2667541503,FR +2667541504,2667542527,AT +2667542528,2667544575,FR +2667544576,2667560959,RU +2667560960,2667565055,IT +2667565056,2667565311,HK +2667565312,2667565421,AT +2667565422,2667565422,PT +2667565423,2667565423,ES +2667565424,2667565424,US +2667565425,2667565425,CR +2667565426,2667565426,KN +2667565427,2667565427,BR +2667565428,2667565428,FI +2667565429,2667565429,CH +2667565430,2667565430,GB +2667565431,2667566335,AT +2667566336,2667566591,US +2667566592,2667566847,DE +2667566848,2667567103,FR +2667567104,2667569151,SE +2667569152,2667571199,GB +2667571200,2667573247,ES +2667573248,2667575295,IT +2667575296,2667577343,SK +2667577344,2667642879,SA +2667642880,2667712511,US +2667712512,2667773951,CA +2667773952,2667970559,US +2667970560,2668036095,CA +2668036096,2668101631,SE +2668101632,2668118015,NL +2668118016,2668134399,FR +2668134400,2668150783,GB +2668150784,2668167167,NL +2668167168,2668363775,US +2668363776,2668412927,CH +2668412928,2668417023,SG +2668417024,2668429311,CH +2668429312,2668494847,AU +2668494848,2668560383,US +2668560384,2668625919,GB +2668625920,2668691455,MX +2668691456,2668756991,US +2668756992,2668822527,CA +2668822528,2668888063,US +2668888064,2668890111,DK +2668890112,2668892159,FR +2668892160,2668894207,BA +2668894208,2668896255,MT +2668896256,2668904447,GB +2668904448,2668912639,TR +2668912640,2668916735,IR +2668916736,2668918783,TR +2668918784,2668920831,ES +2668920832,2668953599,IT +2668953600,2668969983,US +2668969984,2668971007,GB +2668971008,2668987135,US +2668987136,2668987391,AU +2668987392,2668989951,US +2668989952,2668990463,NZ +2668990464,2668991487,IN +2668991488,2669019135,US +2669019136,2669084671,CH +2669084672,2669215743,US +2669215744,2669281279,DE +2669281280,2669428735,US +2669428736,2669477887,JP +2669477888,2669543423,CH +2669543424,2669608959,GB +2669608960,2669674495,FR +2669674496,2669805567,CA +2669805568,2669871103,GB +2669871104,2670067711,US +2670067712,2670133247,SE +2670133248,2670591999,US +2670592000,2670657535,NL +2670657536,2670854143,US +2670854144,2670919679,FR +2670919680,2670985215,DE +2670985216,2671050751,AU +2671050752,2671181823,US +2671181824,2671247359,CA +2671247360,2671378431,US +2671378432,2671443967,NO +2671443968,2671509503,US +2671509504,2671575039,NL +2671575040,2671711479,US +2671711480,2671711483,DE +2671711484,2671711573,US +2671711574,2671711574,GB +2671711575,2671712029,US +2671712030,2671712030,AR +2671712031,2671712147,US +2671712148,2671712151,GB +2671712152,2671718827,US +2671718828,2671718831,GB +2671718832,2671720289,US +2671720290,2671720290,GB +2671720291,2671749119,US +2671749120,2671750143,CA +2671750144,2672295935,US +2672295936,2672296959,ES +2672296960,2672361471,SE +2672361472,2672427007,AU +2672427008,2672820223,US +2672820224,2672885759,JP +2672885760,2672951295,NO +2672951296,2673082367,US +2673082368,2673147903,FR +2673147904,2673213439,US +2673213440,2673278975,GB +2673278976,2673410485,US +2673410486,2673410486,DE +2673410487,2673451007,US +2673451008,2673455103,IN +2673455104,2673463295,US +2673463296,2673464319,SG +2673464320,2673475583,US +2673475584,2673541119,VE +2673541120,2673606655,US +2673606656,2673672191,GB +2673672192,2673737727,RU +2673737728,2673803263,US +2673803264,2673868799,FR +2673868800,2674130943,US +2674130944,2674137087,DE +2674137088,2674138111,AT +2674138112,2674139135,DE +2674139136,2674143231,FR +2674143232,2674144255,CH +2674144256,2674144767,US +2674144768,2674145023,GB +2674145024,2674145791,US +2674145792,2674146047,GB +2674146048,2674146303,US +2674146304,2674147327,TR +2674147328,2674163711,NL +2674163712,2674164175,GB +2674164176,2674164191,FR +2674164192,2674171903,GB +2674171904,2674177286,US +2674177287,2674177287,GB +2674177288,2674192383,US +2674192384,2674196479,CH +2674196480,2674249727,GB +2674249728,2674251775,US +2674251776,2674262015,GB +2674262016,2674327551,US +2674327552,2674393087,CH +2674393088,2674589695,US +2674589696,2674655231,SE +2674655232,2674720767,US +2674720768,2674786303,BE +2674786304,2675048447,US +2675048448,2675113983,GB +2675113984,2675245055,US +2675245056,2675255295,NZ +2675255296,2675257343,PH +2675257344,2675261439,US +2675261440,2675269631,TW +2675269632,2675271679,PH +2675271680,2675278847,NZ +2675278848,2675279359,MY +2675279360,2675279871,TH +2675279872,2675281919,MY +2675281920,2675286015,IN +2675286016,2675294207,US +2675294208,2675294463,SG +2675294464,2675294719,NL +2675294720,2675294975,DE +2675294976,2675295231,US +2675295232,2675296255,NL +2675296256,2675296511,NZ +2675296512,2675296767,MY +2675296768,2675298303,NL +2675298304,2675301375,US +2675301376,2675302143,NZ +2675302144,2675302399,MY +2675302400,2675310591,HK +2675310592,2675574239,US +2675574240,2675574271,IT +2675574272,2675574895,US +2675574896,2675574903,NL +2675574904,2675575951,US +2675575952,2675575953,SA +2675575954,2675576703,US +2675576704,2675576711,JO +2675576712,2675589119,US +2675589120,2675605503,DE +2675605504,2675605791,US +2675605792,2675605799,IT +2675605800,2675605807,US +2675605808,2675605811,IT +2675605812,2675605951,US +2675605952,2675605961,CZ +2675605962,2675605962,DE +2675605963,2675605963,CZ +2675605964,2675605964,DE +2675605965,2675605967,CZ +2675605968,2675606271,US +2675606272,2675606527,IT +2675606528,2675606571,US +2675606572,2675606575,IT +2675606576,2675606975,US +2675606976,2675607039,IT +2675607040,2675608735,US +2675608736,2675608739,IT +2675608740,2675608751,US +2675608752,2675608767,HK +2675608768,2675608983,US +2675608984,2675608991,AU +2675608992,2675609011,US +2675609012,2675609015,JP +2675609016,2675609487,US +2675609488,2675609503,CN +2675609504,2675610191,US +2675610192,2675610207,IL +2675610208,2675611295,US +2675611296,2675611359,IT +2675611360,2675612715,US +2675612716,2675612719,IT +2675612720,2675612743,US +2675612744,2675612747,IT +2675612748,2675613119,US +2675613120,2675613151,IT +2675613152,2675613279,US +2675613280,2675613311,IT +2675613312,2675613463,US +2675613464,2675613471,IL +2675613472,2675613599,US +2675613600,2675613631,JP +2675613632,2675614975,US +2675614976,2675614991,NL +2675614992,2675615743,US +2675615744,2675615871,IT +2675615872,2675616419,US +2675616420,2675616422,IT +2675616423,2675616423,US +2675616424,2675616426,IT +2675616427,2675616427,US +2675616428,2675616430,IT +2675616431,2675616431,US +2675616432,2675616434,IT +2675616435,2675616435,US +2675616436,2675616438,IT +2675616439,2675616439,US +2675616440,2675616441,IT +2675616442,2675621301,US +2675621302,2675621302,IT +2675621303,2675626239,US +2675626240,2675626271,GB +2675626272,2675627791,US +2675627792,2675627807,GB +2675627808,2675628399,US +2675628400,2675628447,GB +2675628448,2675630095,US +2675630096,2675630111,GB +2675630112,2675631327,US +2675631328,2675631343,GB +2675631344,2675633183,US +2675633184,2675633215,GB +2675633216,2675636170,US +2675636171,2675636171,GB +2675636172,2675965951,US +2675965952,2676031487,CA +2676031488,2676097023,US +2676097024,2676162559,NO +2676162560,2676359167,US +2676359168,2676424703,IE +2676424704,2676457471,US +2676457472,2676465663,DE +2676465664,2676621311,US +2676621312,2676626431,HK +2676626432,2676686847,SG +2676686848,2677014527,US +2677014528,2677080063,CH +2677080064,2677145599,US +2677145600,2677178367,TR +2677178368,2677211135,UA +2677211136,2677276671,ES +2677276672,2677342207,LV +2677342208,2677407743,IT +2677407744,2677473279,US +2677473280,2677538815,FR +2677538816,2677604351,FI +2677604352,2677635071,US +2677635072,2677636095,CN +2677636096,2677640959,US +2677640960,2677641471,CA +2677641472,2677642239,US +2677642240,2677642495,ES +2677642496,2677642751,CA +2677642752,2677643007,SE +2677643008,2677643263,IE +2677643264,2677644287,US +2677644288,2677645311,GB +2677645312,2677648383,US +2677648384,2677649407,JP +2677649408,2677650431,GB +2677650432,2677650687,RO +2677650688,2677650943,DE +2677650944,2677651455,US +2677651456,2677652479,SG +2677652480,2677658367,US +2677658368,2677658623,AU +2677658624,2677659647,US +2677659648,2677659903,AU +2677659904,2677660159,IN +2677660160,2677669887,US +2677669888,2677735423,DE +2677735424,2677800959,US +2677800960,2677866495,CH +2677866496,2677924863,US +2677924864,2677925119,GB +2677925120,2677997567,US +2677997568,2678063103,CA +2678063104,2678128639,UA +2678128640,2678194175,US +2678194176,2678259711,NO +2678259712,2678521855,US +2678521856,2678587391,GB +2678587392,2678652927,CH +2678652928,2678718463,US +2678718464,2678783999,GB +2678784000,2678849535,NO +2678849536,2678851583,US +2678851584,2678851839,GB +2678851840,2678862847,US +2678862848,2678863103,BR +2678863104,2678865919,US +2678865920,2678866175,AU +2678866176,2678876159,US +2678876160,2678878207,FR +2678878208,2678885375,US +2678885376,2678885631,GB +2678885632,2678885887,US +2678885888,2678886143,DE +2678886144,2678886399,NL +2678886400,2678886655,GB +2678886656,2678893567,US +2678893568,2678893823,CL +2678893824,2678901759,US +2678901760,2678902015,NZ +2678902016,2678902271,SG +2678902272,2678911231,US +2678911232,2678911487,NL +2678911488,2678911743,AU +2678911744,2678915071,US +2678915072,2678980607,FR +2678980608,2679046143,US +2679046144,2679111679,CA +2679111680,2679177215,US +2679177216,2679242751,CA +2679242752,2679308287,US +2679308288,2679373823,CH +2679373824,2679374079,SI +2679374080,2679374335,HR +2679374336,2679374591,BA +2679374592,2679374847,RS +2679374848,2679375103,AL +2679375104,2679375359,ME +2679375360,2679375615,MK +2679375616,2679375871,BG +2679375872,2679376127,HU +2679376128,2679376383,MD +2679376384,2679376639,LU +2679376640,2679376895,RU +2679376896,2679377151,UY +2679377152,2679377407,NO +2679377408,2679377663,NL +2679377664,2679377919,GB +2679377920,2679378175,TR +2679378176,2679378431,SK +2679378432,2679378687,LV +2679378688,2679378943,EE +2679378944,2679379199,IL +2679379200,2679379455,CL +2679379456,2679379711,ES +2679379712,2679379967,DK +2679379968,2679380223,CZ +2679380224,2679380479,BE +2679380480,2679380735,VE +2679380736,2679380991,GB +2679380992,2679381247,AE +2679381248,2679381503,PK +2679381504,2679381759,SA +2679381760,2679382015,ZA +2679382016,2679382527,GB +2679382528,2679382783,JP +2679382784,2679383039,FR +2679383040,2679383295,GB +2679383296,2679383551,CH +2679383552,2679383807,CO +2679383808,2679384063,GB +2679384064,2679384319,GR +2679384320,2679384575,GB +2679384576,2679384831,PE +2679384832,2679385087,GB +2679385088,2679385343,UA +2679385344,2679385599,GB +2679385600,2679385855,BR +2679385856,2679386111,IT +2679386112,2679386367,PL +2679386368,2679386623,GB +2679386624,2679386879,PL +2679386880,2679387135,DE +2679387136,2679387391,RU +2679387392,2679387647,AU +2679387648,2679387903,GB +2679387904,2679388159,TW +2679388160,2679388415,GB +2679388416,2679388671,ES +2679388672,2679388927,AT +2679388928,2679389183,AU +2679389184,2679389439,MX +2679389440,2679389695,TH +2679389696,2679389951,AU +2679389952,2679390207,AR +2679390208,2679391231,US +2679391232,2679391487,NL +2679391488,2679391743,GB +2679391744,2679391999,FR +2679392000,2679394047,US +2679394048,2679394303,DE +2679394304,2679394559,GB +2679394560,2679398399,US +2679398400,2679406591,GB +2679406592,2679414783,US +2679414784,2679415307,PR +2679415308,2679415308,DE +2679415309,2679418879,PR +2679418880,2679420927,SG +2679420928,2679422975,PR +2679422976,2679431167,US +2679431168,2679439359,FR +2679439360,2679515391,US +2679515392,2679515903,GB +2679515904,2679523327,US +2679523328,2679525375,GB +2679525376,2679535615,US +2679535616,2679537663,GB +2679537664,2680029183,US +2680029184,2680094719,SE +2680094720,2680160255,US +2680160256,2680225791,TH +2680225792,2680356863,SE +2680356864,2680422399,DK +2680422400,2680487935,AU +2680487936,2680553471,GB +2680553472,2680684543,US +2680684544,2680750079,SE +2680750080,2680881151,US +2680881152,2680897535,CA +2680897536,2681012223,US +2681012224,2681077759,PL +2681077760,2681143295,CA +2681143296,2681208831,AU +2681208832,2681274367,CA +2681274368,2681339903,US +2681339904,2681405439,IT +2681405440,2681470975,JP +2681470976,2681536511,US +2681536512,2681602047,IT +2681602048,2681700863,US +2681700864,2681701119,HK +2681701120,2681703423,US +2681703424,2681703935,JP +2681703936,2681731071,US +2681731072,2681733119,FR +2681733120,2681798655,NO +2681798656,2681864191,FR +2681864192,2681929727,US +2681929728,2681995263,GB +2681995264,2681999467,US +2681999468,2681999468,SG +2681999469,2681999871,US +2681999872,2682000383,SG +2682000384,2682001407,US +2682001408,2682002431,GB +2682002432,2682008575,US +2682008576,2682008831,GB +2682008832,2682014207,US +2682014208,2682014719,GB +2682014720,2682014725,US +2682014726,2682014727,SG +2682014728,2682055167,US +2682055168,2682055423,SG +2682055424,2682118143,US +2682118144,2682126335,AU +2682126336,2682257407,US +2682257408,2682322943,UA +2682322944,2682388479,US +2682388480,2682454015,CN +2682454016,2682519551,US +2682585088,2682716159,US +2682716160,2682781695,CA +2682781696,2682847231,CH +2682847232,2683043839,US +2683043840,2683109375,GB +2683109376,2683174911,ES +2683174912,2683240447,US +2683240448,2683305983,GB +2683305984,2683371519,US +2683371520,2683437055,CH +2683437056,2683568127,US +2683568128,2683633663,GB +2683637760,2683641855,NL +2683641856,2683645951,US +2683645952,2683650047,SG +2683650048,2683658239,US +2683699200,2683830271,US +2683830272,2683895807,AU +2683895808,2684157951,US +2684157952,2684159999,NL +2684160000,2684162047,NO +2684162048,2684164095,EE +2684164096,2684165119,SE +2684165120,2684165375,GB +2684165376,2684166143,SE +2684166144,2684170239,TR +2684170240,2684178431,GB +2684178432,2684180479,TR +2684180480,2684182527,DK +2684182528,2684184575,IT +2684184576,2684186623,SK +2684186624,2684188671,DE +2684188672,2684189695,RU +2684189696,2684198911,NL +2684198912,2684200959,GB +2684200960,2684203007,RU +2684203008,2684205055,GB +2684205056,2684207103,IT +2684207104,2684213247,GB +2684213248,2684215295,SE +2684215296,2684217343,BE +2684217344,2684219391,CZ +2684219392,2684221439,PL +2684221440,2684223487,IL +2684223488,2684289023,GB +2684289024,2684297215,RU +2684297216,2684299263,IR +2684299264,2684301311,CY +2684301312,2684305407,PT +2684305408,2684321791,RU +2684321792,2684329983,IT +2684329984,2684332031,IQ +2684332032,2684334079,DE +2684334080,2684338175,PL +2684338176,2684340223,ES +2684340224,2684344319,GB +2684344320,2684346367,NL +2684346368,2684354559,FI +2684354560,2684387327,MU +2684387328,2684403711,SN +2684403712,2684411903,ZA +2684411904,2684420095,BJ +2684420096,2684616703,US +2684616704,2684682239,NZ +2684682240,2684747775,GB +2684747776,2684813311,IE +2684813312,2684878847,US +2684878848,2684944383,SE +2684944384,2685009919,GB +2685009920,2685075455,US +2685075456,2685599743,JP +2685599744,2685603839,US +2685604864,2685605887,PK +2685605888,2685607935,US +2685608960,2685609983,ZA +2685611008,2685612031,BR +2685612032,2685613055,HK +2685613056,2685614079,TW +2685615104,2685616127,NG +2685616128,2685617151,ID +2685624320,2685626367,LY +2685626368,2685627391,US +2685628416,2685636607,ZA +2685638656,2685639679,SL +2685640704,2685641727,US +2685642752,2685644799,BR +2685647872,2685648383,ZA +2685648384,2685648895,MZ +2685648896,2685649919,RW +2685649920,2685650943,ZA +2685650944,2685651967,CL +2685652992,2685656063,CN +2685656064,2685657087,IN +2685657088,2685658111,ID +2685659136,2685660159,ZA +2685660160,2685661183,CM +2685661184,2685665279,BR +2685665280,2685668351,IN +2685668352,2685669375,SG +2685670400,2685671423,BR +2685671424,2685673471,ZA +2685673472,2685674495,BR +2685675520,2685676543,PH +2685676544,2685677567,JP +2685677568,2685678591,CN +2685678592,2685681663,HK +2685681664,2685683711,BR +2685683712,2685684735,BD +2685685760,2685686783,AR +2685686784,2685688831,BR +2685688832,2685689855,CL +2685706240,2685707263,BR +2685707264,2685708287,EC +2685708288,2685709311,BR +2685709312,2685710335,CL +2685710336,2685713407,BR +2685713408,2685714431,CL +2685714432,2685718527,BR +2685718528,2685719551,US +2685722112,2685722623,ID +2685724672,2685726719,CA +2685729792,2685730815,ZA +2685730816,2685796351,JP +2685861888,2686320639,JP +2686386176,2686844927,US +2686844928,2686910463,GB +2686910464,2686975999,US +2686976000,2687041535,GR +2687041536,2687238143,US +2687238144,2687297215,DE +2687297216,2687297231,HU +2687297232,2687560191,DE +2687560192,2687560447,ZA +2687560448,2687762431,DE +2687762432,2687827967,AT +2687827968,2687893503,CH +2687893504,2688221183,DE +2688221184,2688286719,CH +2688286720,2688352255,DE +2688352256,2688420095,CH +2688420096,2688420351,US +2688420352,2688420607,CN +2688420608,2688548863,CH +2688548864,2688614399,AU +2688614400,2688679935,US +2688679936,2688745471,IT +2688745472,2688876543,NO +2688876544,2688942079,US +2688942080,2689007615,DE +2689007616,2689073151,FI +2689073152,2689204223,US +2689204224,2689269759,JP +2689269760,2689335295,TR +2689335296,2689400831,US +2689400832,2689466367,MA +2689466368,2689531903,IT +2689531904,2689535999,US +2689536000,2689536511,GB +2689536512,2689541631,US +2689541632,2689541887,GB +2689541888,2689545727,US +2689545728,2689546239,GB +2689546240,2689566207,US +2689566208,2689566719,GB +2689566720,2689568255,US +2689568256,2689568767,GB +2689568768,2689586687,US +2689586688,2689587199,GB +2689587200,2689593343,US +2689593344,2689593855,GB +2689593856,2689594111,US +2689594112,2689594879,GB +2689594880,2689597439,US +2689597440,2689662975,IT +2689662976,2689801904,US +2689801905,2689801905,DE +2689801906,2689802239,US +2689802240,2689802751,GB +2689802752,2689803263,TR +2689803264,2689810431,GB +2689810432,2689818879,US +2689818880,2689819135,IN +2689819136,2689835007,US +2689835008,2689835263,AU +2689835264,2689925119,US +2689925120,2689990655,CH +2689990656,2690056191,JP +2690056192,2690187263,US +2690187264,2690318335,MA +2690318336,2690383871,US +2690383872,2690449407,FR +2690449408,2690646015,US +2690646016,2690711551,SG +2690711552,2690777087,IT +2690777088,2690842623,CH +2690842624,2690908159,RS +2690908160,2690973695,GB +2690973696,2691104767,US +2691104768,2691170303,FR +2691170304,2691235839,GB +2691235840,2691301375,MA +2691301376,2691366911,CA +2691366912,2691760127,US +2691760128,2691825663,CG +2691825664,2691891199,HU +2691891200,2691956735,SA +2691956736,2692169727,ZA +2692169728,2692173823,SC +2692173824,2692175871,ZA +2692175872,2692177919,SC +2692177920,2692179967,ZA +2692179968,2692180991,GA +2692180992,2692182015,GH +2692182016,2692184063,MZ +2692184064,2692185087,ZA +2692185088,2692186111,NG +2692186112,2692188159,GN +2692188160,2692190207,ZA +2692190208,2692191231,BJ +2692191232,2692192255,UG +2692192256,2692193279,ZA +2692193280,2692194303,MZ +2692194304,2692202495,GA +2692202496,2692203519,ZA +2692203520,2692204543,NG +2692204544,2692205567,SC +2692205568,2692206591,GH +2692206592,2692207615,SZ +2692207616,2692208639,ZA +2692208640,2692209663,KE +2692209664,2692214783,ZA +2692214784,2692215807,AO +2692215808,2692216319,KE +2692216320,2692216831,NG +2692216832,2692218879,ZA +2692218880,2692284415,CI +2692284416,2692546559,ZA +2692546560,2694316031,US +2694316032,2694381567,NG +2694381568,2694447103,US +2694447104,2694578175,CI +2694578176,2694840319,TN +2694840320,2695920283,MA +2695920284,2695920284,EH +2695920285,2696151039,MA +2696151040,2696216575,IT +2696216576,2696282111,BG +2696282112,2696413183,GM +2696413184,2696478719,US +2696478720,2696609791,JP +2696675328,2697594879,JP +2697594880,2697596927,IN +2697601024,2697602047,KH +2697602048,2697603071,IN +2697603072,2697604095,ID +2697604096,2697605119,HK +2697605120,2697607167,IN +2697607168,2697608191,HK +2697608192,2697609215,CN +2697609216,2697625599,US +2697626624,2697627647,JP +2697627648,2697627903,US +2697627904,2697628671,SG +2697628672,2697629695,AU +2697629696,2697630719,BD +2697630720,2697632767,CN +2697632768,2697633791,IN +2697633792,2697634815,KR +2697634816,2697635583,US +2697635584,2697635839,NZ +2697635840,2697636863,CN +2697636864,2697638911,KR +2697638912,2697647103,IN +2697647104,2697658367,CN +2697658368,2697789439,JP +2697789440,2697854975,US +2697854976,2697887743,AU +2697887744,2697887999,ES +2697888000,2697889791,AU +2697889792,2697891839,US +2697891840,2697892095,GB +2697892096,2697892863,AU +2697892864,2697894399,US +2697894400,2697920511,AU +2697920512,2698117119,US +2698117120,2698182655,IS +2698182656,2698248191,DE +2698248192,2698313727,US +2698313728,2698379263,DE +2698379264,2698444799,ES +2698444800,2698510335,JP +2698510336,2698706943,CZ +2698706944,2698709503,CH +2698709504,2698709759,GB +2698709760,2698772479,CH +2698772480,2698838015,IT +2698838016,2698903551,BE +2698903552,2698969087,AU +2698969088,2699034623,CA +2699034624,2699165695,AO +2699165696,2699198463,NG +2699198464,2699211263,ZA +2699211264,2699211519,KE +2699211520,2699211775,GH +2699212800,2699213823,BF +2699213824,2699231231,ZA +2699231232,2699296767,US +2699296768,2699362303,FR +2699362304,2699526143,US +2699526144,2699542527,AU +2699542528,2699624447,US +2699624448,2699689983,JP +2699755520,2699821055,JP +2699886592,2699955199,JP +2699955200,2699956223,TH +2699956224,2699957247,BD +2699957248,2699957503,JP +2699957760,2699958271,US +2699959808,2699960063,JP +2699960320,2699960831,JP +2699960832,2699961343,HK +2699961344,2699962879,JP +2699962880,2699964415,US +2699964416,2699966975,JP +2699966976,2699967487,HK +2699967488,2699968511,JP +2699968512,2699969535,CN +2699969536,2699972607,IN +2699972608,2699973631,NZ +2699973632,2699974655,HK +2699974656,2699976703,IN +2699977728,2699977983,JP +2699978240,2699978751,US +2699978752,2699980799,BR +2699984896,2699986943,BR +2699986944,2699987967,BZ +2699987968,2699995135,BR +2699995136,2699996159,AR +2699996160,2699999231,BR +2699999232,2700000255,PY +2700000256,2700004351,BR +2700004352,2700005375,AR +2700005376,2700006399,BR +2700006400,2700007423,CL +2700007424,2700014591,BR +2700014592,2700015615,VE +2700015616,2700016639,BR +2700016640,2700017663,CL +2700017664,2700214271,JP +2700214272,2700247039,NA +2700247040,2700263423,UG +2700263424,2700279807,TG +2700279808,2700935167,JP +2700935168,2701066239,US +2701066240,2701131775,BG +2701131776,2701131807,HN +2701131808,2701131823,CA +2701131824,2701132159,HN +2701132160,2701132175,CR +2701132176,2701132391,HN +2701132392,2701132399,CR +2701132400,2701133631,HN +2701133632,2701133647,ES +2701133648,2701134447,HN +2701134448,2701134463,US +2701134464,2701135583,HN +2701135584,2701135599,US +2701135600,2701136095,HN +2701136096,2701136111,US +2701136112,2701137903,HN +2701137904,2701137911,BR +2701137912,2701138607,HN +2701138608,2701138615,UY +2701138616,2701139135,HN +2701139136,2701139151,UY +2701139152,2701139479,HN +2701139480,2701139487,NL +2701139488,2701139967,HN +2701139968,2701148159,NI +2701148160,2701149183,AR +2701149184,2701150207,HN +2701150208,2701152255,AR +2701152256,2701156351,BQ +2701156352,2701160447,CW +2701160448,2701162495,TT +2701162496,2701164543,UY +2701164544,2701170687,HT +2701170688,2701172735,TT +2701172736,2701176831,CL +2701176832,2701178879,AR +2701178880,2701180927,CL +2701180928,2701189119,HN +2701189120,2701197311,TT +2701197312,2701262847,US +2701262848,2701328383,GB +2701328384,2701393919,FR +2701393920,2701459455,NO +2701459456,2701524991,AT +2701524992,2701656063,US +2701656064,2701688831,RU +2701688832,2701721087,US +2701721088,2701721599,RU +2701721600,2701787135,TR +2701787136,2701852671,CO +2701852672,2701918207,US +2701918208,2701983743,GB +2701983744,2702245887,US +2702245888,2702311423,GB +2702311424,2702376959,CO +2702376960,2702442495,CA +2702442496,2702508031,CH +2702508032,2702573567,US +2702573568,2702581759,AR +2702581760,2702583807,VE +2702583808,2702585855,MX +2702585856,2702586111,PA +2702586112,2702587903,CW +2702587904,2702589951,BR +2702589952,2702606335,GF +2702606336,2702639103,BO +2702639104,2702704639,GB +2702704640,2702770175,BR +2702770176,2702835711,CL +2702835712,2702901247,US +2702901248,2702966783,IT +2702966784,2703032319,US +2703032320,2703097855,AU +2703097856,2703105023,GB +2703105024,2703105535,US +2703105536,2703127039,GB +2703127040,2703127295,US +2703127296,2703163391,GB +2703163392,2703359999,US +2703360000,2703425535,JP +2703425536,2703556607,US +2703556608,2703622143,ES +2703622144,2703818751,US +2703818752,2703884287,FI +2703884288,2703949823,DE +2703949824,2704015359,AU +2704015360,2704277503,US +2704277504,2704343039,FR +2704343040,2704408575,US +2704408576,2704474111,AU +2704474112,2704476159,US +2704476160,2704476415,GB +2704476416,2704476927,US +2704476928,2704477183,GB +2704477184,2704478207,US +2704478208,2704478463,SG +2704478464,2704484351,US +2704484352,2704485375,AU +2704485376,2704539647,US +2704539648,2704605183,SE +2704605184,2704670719,HR +2704670720,2704736255,SE +2704736256,2704801791,US +2704801792,2704867327,BO +2704867328,2704998399,US +2704998400,2705063935,BE +2705063936,2705195007,US +2705195008,2705260543,CH +2705260544,2705326079,US +2705326080,2705391615,MO +2705391616,2705399807,AU +2705399808,2705407999,NZ +2705408000,2705432575,AU +2705432576,2705440767,NZ +2705440768,2705457151,AU +2705457152,2705522687,NZ +2705522688,2705588223,ES +2705588224,2705596159,US +2705596160,2705596415,CA +2705596416,2705688319,US +2705688320,2705688575,DE +2705688576,2705691647,US +2705691648,2705692671,GB +2705692672,2705710079,US +2705710080,2705711103,IN +2705711104,2705850367,US +2705850368,2705915903,ES +2705915904,2706046975,GB +2706046976,2706112511,JP +2706112512,2706178047,GB +2706178048,2706243583,US +2706243584,2706309119,CH +2706309120,2706374655,BR +2706374656,2706571263,US +2706571264,2706694143,NL +2706694144,2706702335,US +2706702336,2706960383,NL +2706960384,2706964479,US +2706964480,2707226623,NL +2707226624,2707488767,JP +2707488768,2707947519,US +2707947520,2708144127,FR +2708144128,2708340735,US +2708340736,2708406271,AT +2708406272,2708471807,ES +2708471808,2708537343,GB +2708537344,2708733951,US +2708733952,2708799487,ES +2708799488,2708865023,SG +2708865024,2708930559,JP +2708930560,2709127167,US +2709127168,2709192703,KR +2709192704,2709225471,ZA +2709225472,2709225727,ES +2709225728,2709225983,ZA +2709225984,2709226239,ES +2709226240,2709226495,ZA +2709226496,2709226511,DE +2709226512,2709228767,ZA +2709228768,2709228783,DE +2709228784,2709229695,ZA +2709229696,2709229711,DE +2709229712,2709230799,ZA +2709230800,2709230815,DE +2709230816,2709231103,ZA +2709231104,2709231119,DE +2709231120,2709232127,ZA +2709232128,2709232383,DE +2709232384,2709232639,ZA +2709232640,2709232895,DE +2709232896,2709233151,ZA +2709233152,2709233407,DE +2709233408,2709235199,ZA +2709235200,2709235455,DE +2709235456,2709235711,ZA +2709235712,2709235967,DE +2709235968,2709236223,ZA +2709236224,2709236479,DE +2709236480,2709238271,ZA +2709238272,2709238527,DE +2709238528,2709238783,ZA +2709238784,2709239039,DE +2709239040,2709240319,ZA +2709240320,2709240575,DE +2709240576,2709240831,ZA +2709240832,2709241087,DE +2709241088,2709241343,ZA +2709241344,2709241599,DE +2709241600,2709241855,ZA +2709241856,2709242111,DE +2709242112,2709242367,US +2709242368,2709242623,DE +2709242624,2709242879,US +2709242880,2709243135,DE +2709243136,2709243391,US +2709243392,2709243647,DE +2709243648,2709243903,US +2709243904,2709244159,ZA +2709244160,2709244415,US +2709244416,2709244671,ZA +2709244672,2709244927,US +2709244928,2709245183,ZA +2709245184,2709245439,US +2709245440,2709245695,DE +2709245696,2709245951,US +2709245952,2709246207,ZA +2709246208,2709246463,US +2709246464,2709247231,ZA +2709247232,2709247487,MY +2709247488,2709247743,DE +2709247744,2709247999,US +2709248000,2709248255,ZA +2709248256,2709248511,US +2709248512,2709249535,ZA +2709249536,2709249791,DE +2709249792,2709250047,ZA +2709250048,2709250303,DE +2709250304,2709251071,ZA +2709251072,2709251327,DE +2709251328,2709251583,ZA +2709251584,2709251839,DE +2709251840,2709252095,ZA +2709252096,2709252351,DE +2709252352,2709256703,ZA +2709256704,2709256959,DE +2709256960,2709257215,ZA +2709257216,2709257471,DE +2709257472,2709258239,ZA +2709258240,2709389311,US +2709389312,2709454847,SG +2709454848,2709585919,US +2709651456,2709716991,US +2709716992,2709782527,CL +2709782528,2709848063,PE +2709848064,2710175743,US +2710175744,2710241279,BO +2710241280,2710306815,MY +2710306816,2710372351,VE +2710372352,2710437887,CA +2710437888,2710503423,MY +2710503424,2710568959,AU +2710568960,2710700031,US +2710700032,2710765567,AU +2710765568,2710831103,IT +2710831104,2710896639,BR +2710896640,2711093247,US +2711093248,2711158783,AU +2711158784,2711486463,US +2711486464,2711551999,NL +2711552000,2712535039,US +2712535040,2712535551,CA +2712535552,2713190399,US +2713190400,2713255935,CA +2713255936,2713387007,US +2713387008,2713452543,CA +2713452544,2713583615,US +2713583616,2713649151,AR +2713649152,2713946367,US +2713946368,2713946623,CA +2713946624,2713947395,US +2713947396,2713947396,DE +2713947397,2713976831,US +2713976832,2714042367,VE +2714042368,2714238975,US +2714238976,2714304511,TH +2714304512,2714370263,US +2714370264,2714370271,SG +2714370272,2714371679,US +2714371680,2714371711,CA +2714371712,2714372415,US +2714372416,2714372431,PH +2714372432,2714372967,US +2714372968,2714372971,IN +2714372972,2714373127,US +2714373128,2714373128,SG +2714373129,2714373743,US +2714373744,2714373759,IN +2714373760,2714374927,US +2714374928,2714374943,SG +2714374944,2714375039,US +2714375040,2714375055,ID +2714375056,2714376223,US +2714376224,2714376239,JP +2714376240,2714377103,US +2714377104,2714377119,IN +2714377120,2714377439,US +2714377440,2714377471,SG +2714377472,2714378463,US +2714378464,2714378495,HK +2714378496,2714379103,US +2714379104,2714379135,HK +2714379136,2714380031,US +2714380032,2714380287,HK +2714380288,2714381311,US +2714381312,2714381567,HK +2714381568,2714381951,US +2714381952,2714381983,HK +2714381984,2714382530,US +2714382531,2714382531,HK +2714382532,2714382580,US +2714382581,2714382581,HK +2714382582,2714384907,US +2714384908,2714384911,HK +2714384912,2714386431,US +2714386432,2714419743,JP +2714419744,2714419775,SG +2714419776,2714419871,JP +2714419872,2714419903,SG +2714419904,2714420479,JP +2714420480,2714420511,SG +2714420512,2714421439,JP +2714421440,2714421471,SG +2714421472,2714421567,JP +2714421568,2714421599,SG +2714421600,2714422879,JP +2714422880,2714422911,SG +2714422912,2714435583,JP +2714435584,2714697727,US +2714697728,2714763263,CN +2714763264,2715025407,US +2715025408,2715090943,VE +2715090944,2715287551,US +2715287552,2715353087,CA +2715353088,2715418623,US +2715418624,2715484159,DE +2715484160,2716139519,US +2716139520,2716205055,SG +2716205056,2716270591,PT +2716270592,2716336127,US +2716336128,2716401663,CA +2716401664,2716467199,US +2716467200,2716532735,VE +2716532736,2716729343,US +2716729344,2716794879,CL +2716794880,2717253631,US +2717253632,2717319167,TH +2717319168,2717384703,US +2717450240,2717581311,US +2717581312,2717646847,SA +2717646848,2717712383,KW +2717712384,2717843455,US +2717843456,2717908991,VE +2717908992,2717974527,CA +2717974528,2718629887,US +2718629888,2718695423,GB +2718695424,2718745599,US +2718745600,2718746623,AR +2718748672,2718749695,PK +2718749696,2718750719,BD +2718750720,2718750975,US +2718750976,2718751231,BL +2718751232,2718752767,US +2718752768,2718754815,PR +2718754816,2718756863,US +2718756864,2718758911,IN +2718758912,2718760959,US +2718760960,2718826495,GB +2718826496,2719285247,US +2719285248,2719350783,CH +2719350784,2719416319,US +2719416320,2719481855,CH +2719481856,2719547391,US +2719547392,2719612927,AT +2719612928,2719678463,CH +2719678464,2720399359,US +2720399360,2720464895,FR +2720464896,2720849919,US +2720849920,2720850175,GB +2720850176,2721382399,US +2721382400,2721447935,CA +2721447936,2721579007,US +2721579008,2721644543,IN +2721644544,2721972223,US +2721972224,2722037759,CN +2722037760,2722496511,US +2722496512,2722562047,CA +2722562048,2722693119,US +2722693120,2722758655,CA +2722758656,2723479551,US +2723479552,2723545087,CA +2723545088,2723610623,CH +2723610624,2723692735,US +2723692736,2723692767,HK +2723692768,2723693759,US +2723693760,2723693791,SG +2723693792,2723694783,US +2723694784,2723694815,AU +2723694816,2723695807,US +2723695808,2723695839,JP +2723695840,2723696831,US +2723696832,2723696863,IN +2723696864,2723697855,US +2723697856,2723697887,DE +2723697888,2723698879,US +2723698880,2723698911,GB +2723698912,2723699903,US +2723699904,2723699935,NL +2723699936,2723700927,US +2723700928,2723700959,PL +2723700960,2723707071,US +2723707072,2723707103,BR +2723707104,2723832575,US +2723832576,2723832831,GB +2723832832,2724268287,US +2724268288,2724268415,MX +2724268416,2724303947,US +2724303948,2724303951,GB +2724303952,2724303989,US +2724303990,2724303990,GB +2724303991,2724304013,US +2724304014,2724304014,GB +2724304015,2724304281,US +2724304282,2724304282,VE +2724304283,2724304707,US +2724304708,2724304711,DE +2724304712,2724790271,US +2724790272,2724855807,CN +2724855808,2724921343,CA +2724921344,2725249023,US +2725249024,2725314559,NZ +2725314560,2725904383,US +2725904384,2725969919,VE +2725969920,2726117375,US +2726117376,2726117631,GB +2726117632,2726117887,NL +2726117888,2726118143,DE +2726118144,2726121471,US +2726121472,2726121727,JP +2726121728,2726121983,SG +2726121984,2726122239,HK +2726122240,2727018495,US +2727018496,2727084031,CA +2727084032,2727411711,US +2727411712,2727608319,AU +2727608320,2728132607,US +2728132608,2728263679,CA +2728263680,2728264703,AU +2728264704,2728265727,JP +2728265728,2728266751,QA +2728266752,2728267775,KW +2728267776,2728268799,RO +2728268800,2728269823,FR +2728269824,2728270847,MY +2728270848,2728271871,OM +2728271872,2728272895,GB +2728272896,2728273919,IE +2728273920,2728274943,KE +2728274944,2728278015,IN +2728278016,2728284671,US +2728284672,2728288255,DE +2728288256,2728289279,AE +2728289280,2728290303,PL +2728290304,2728291327,US +2728291328,2728292351,NL +2728292352,2728293375,DE +2728293376,2728294399,JP +2728294400,2728295423,US +2728295424,2728296447,CA +2728296448,2728297471,EG +2728297472,2728298495,DK +2728298496,2728299519,PH +2728299520,2728300543,US +2728300544,2728301567,CA +2728301568,2728302591,CH +2728302592,2728304639,GB +2728304640,2728306687,SG +2728306688,2728308735,US +2728308736,2728309759,HK +2728309760,2728310783,SE +2728310784,2728311807,US +2728311808,2728312831,KR +2728312832,2728313087,FR +2728313088,2728313855,US +2728313856,2728314879,IT +2728314880,2728315903,DE +2728315904,2728316927,US +2728316928,2728317951,BG +2728317952,2728319999,US +2728320000,2728321023,NO +2728321024,2728322047,US +2728322048,2728323071,PH +2728323072,2728324095,BE +2728324096,2728325119,FI +2728325120,2728326143,TW +2728326144,2728327167,US +2728327168,2728328191,UA +2728328192,2728329215,US +2728394752,2731543551,US +2731543552,2731544575,CA +2731544576,2731549695,US +2731549696,2731550719,CA +2731550720,2731555839,US +2731555840,2731556863,CA +2731556864,2731560959,US +2731560960,2731561983,CA +2731561984,2731563007,US +2731563008,2731564031,CA +2731564032,2731566079,US +2731566080,2731567103,CA +2731567104,2731573247,US +2731573248,2731606015,CA +2731606016,2731667455,US +2731667456,2731671551,HK +2731671552,2731673599,US +2731673600,2731674623,CA +2731674624,2731679743,US +2731679744,2731680767,CA +2731680768,2731681791,US +2731681792,2731682815,PR +2731682816,2731685887,US +2731685888,2731686911,CA +2731686912,2731688959,US +2731688960,2731689471,VG +2731689472,2731711487,US +2731711488,2731712511,AG +2731712512,2731714559,CA +2731714560,2731717631,US +2731717632,2731718655,CA +2731718656,2731728895,US +2731728896,2731729919,CA +2731729920,2731739647,US +2731739648,2731740159,CA +2731740160,2731761663,US +2731761664,2731763711,CA +2731763712,2731765759,US +2731765760,2731767807,CA +2731767808,2731771903,US +2731771904,2731772927,KY +2731772928,2731784191,US +2731784192,2731785215,CA +2731785216,2731786239,US +2731786240,2731788287,CA +2731788288,2731790335,US +2731790336,2731792383,CA +2731792384,2731795455,US +2731795456,2731796479,DE +2731796480,2731797503,CA +2731797504,2731800575,US +2731800576,2731801599,CA +2731801600,2731804671,US +2731804672,2731805695,CA +2731805696,2731805951,TC +2731805952,2731806015,BB +2731806016,2731806079,VC +2731806080,2731806463,BB +2731806464,2731806719,VG +2731806720,2731807743,US +2731807744,2731808767,CA +2731808768,2731817727,US +2731817728,2731817751,AU +2731817752,2731819007,US +2731819008,2731821055,CA +2731821056,2731828223,US +2731828224,2731829247,CA +2731829248,2731831295,US +2731831296,2731832319,CA +2731832320,2731836927,US +2731836928,2731837183,IS +2731837184,2731843583,US +2731843584,2731845631,PR +2731845632,2731847679,FR +2731847680,2731853823,US +2731853824,2731855871,CA +2731855872,2731856383,LC +2731856384,2731856895,VC +2731856896,2731862015,US +2731862016,2731864063,CA +2731864064,2731870207,US +2731870208,2731871231,CA +2731871232,2731894783,US +2731894784,2731896831,CA +2731896832,2731900927,US +2731900928,2731901439,CA +2731901440,2731902975,US +2731902976,2731903999,CA +2731904000,2731908095,US +2731908096,2731909119,CA +2731909120,2731911167,US +2731911168,2731912191,DM +2731912192,2731917567,US +2731917568,2731917575,AU +2731917576,2731921663,US +2731921664,2731921727,BE +2731921728,2732086271,US +2732086272,2732087295,CA +2732087296,2732105727,US +2732105728,2732107775,JM +2732107776,2732109823,US +2732110848,2732111871,US +2732111872,2732113919,CA +2732113920,2732128767,US +2732128768,2732129023,NL +2732129024,2732131327,US +2732131328,2732132351,CA +2732132352,2732137215,US +2732137216,2732137471,DE +2732137472,2732138239,US +2732138240,2732138495,DE +2732138496,2732145663,US +2732145664,2732146687,CA +2732146688,2732189695,US +2732189696,2732192767,CA +2732192768,2732194559,US +2732194816,2732201983,US +2732201984,2732203007,VG +2732203008,2732204031,US +2732204032,2732206079,CA +2732206080,2732227583,US +2732227584,2732228607,CA +2732228608,2732261375,US +2732261376,2732265471,CA +2732265472,2732273663,US +2732273664,2732275711,CA +2732275712,2732278783,US +2732278784,2732279807,CA +2732279808,2732301311,US +2732301312,2732301823,CA +2732301824,2732302335,US +2732302336,2732303359,CA +2732303360,2732306431,US +2732306432,2732307455,CA +2732307456,2732308479,US +2732308480,2732310527,CA +2732310528,2732320767,US +2732320768,2732321023,AU +2732321024,2732321279,BM +2732321280,2732321535,CA +2732321536,2732321791,GB +2732321792,2732322047,US +2732322048,2732322815,CA +2732322816,2732336127,US +2732336128,2732337151,CA +2732337152,2732351487,US +2732351488,2732353535,PR +2732353536,2732361727,US +2732361728,2732363775,BB +2732363776,2732375039,US +2732375040,2732376063,CA +2732376064,2732379135,US +2732379136,2732380159,CA +2732380160,2732389375,US +2732389888,2732390143,IT +2732390144,2732390399,US +2732390400,2732391423,CA +2732391424,2732395519,US +2732395520,2732396543,CA +2732396544,2732423167,US +2732423168,2732425215,CA +2732425216,2732443647,US +2732443648,2732445695,CA +2732445696,2732446719,US +2732446720,2732447743,BM +2732447744,2732455935,US +2732455936,2732457983,CA +2732457984,2732472319,US +2732472320,2732474367,CA +2732474368,2732478463,US +2732478464,2732479487,CA +2732479488,2732480511,AG +2732480512,2732480767,TR +2732480768,2732481023,US +2732481024,2732481279,TR +2732481280,2732485631,US +2732485632,2732486655,PR +2732486656,2732488703,US +2732488704,2732490751,CA +2732492800,2732493823,CA +2732493824,2732494847,US +2732494848,2732495871,CA +2732495872,2732497919,US +2732497920,2732499967,CA +2732499968,2732500479,TW +2732500480,2732515327,US +2732515328,2732515583,VG +2732515584,2732523519,US +2732523520,2732525567,CA +2732525568,2732534783,US +2732534784,2732536831,CA +2732536832,2732549119,US +2732549120,2732550143,CA +2732550144,2732554239,US +2732554240,2732554495,CA +2732554496,2732555007,US +2732555008,2732555263,CA +2732555264,2732556031,US +2732556032,2732556287,CA +2732556288,2732580863,US +2732580864,2732582911,CA +2732582912,2733903871,US +2733903872,2733904895,PR +2733904896,2733907967,CA +2733907968,2733911039,US +2733911040,2733912063,CA +2733912064,2733920483,US +2733920484,2733920486,RO +2733920487,2733920488,US +2733920489,2733920491,RO +2733920492,2733920495,US +2733920496,2733920497,RO +2733920498,2733920498,US +2733920499,2733920506,RO +2733920507,2733920682,US +2733920683,2733920686,RO +2733920687,2733920688,US +2733920689,2733920690,RO +2733920691,2733920691,US +2733920692,2733920692,RO +2733920693,2733920744,US +2733920745,2733920750,RO +2733920751,2733920927,US +2733920928,2733920935,RO +2733920936,2733922303,US +2733922304,2733923327,CA +2733923328,2733930495,US +2733930496,2733931519,CA +2733931520,2733942783,US +2733942784,2733943807,PR +2733943808,2733953023,US +2733953024,2733954047,CA +2733954048,2733958143,US +2733958144,2733959167,CA +2733959168,2733960191,US +2733960192,2733961215,CA +2733961216,2733963263,US +2733963264,2733964287,CA +2733964288,2733979647,US +2733979648,2733980671,CA +2733980672,2733981695,US +2733983744,2733984767,US +2733984768,2733985791,LC +2733985792,2734002175,US +2734002176,2734003199,CA +2734003200,2734004223,US +2734004224,2734005247,GD +2734005248,2734018559,US +2734018560,2734020607,CA +2734020608,2734026751,US +2734026752,2734030847,CA +2734030848,2734031871,JM +2734031872,2734032895,US +2734032896,2734034943,CA +2734034944,2734044159,US +2734044160,2734045183,CA +2734045184,2734057471,US +2734057472,2734059519,BB +2734059520,2734063615,US +2734063616,2734064639,CA +2734064640,2734070783,US +2734070784,2734071807,CA +2734071808,2734074879,US +2734074880,2734075903,PR +2734075904,2734077951,US +2734077952,2734078207,GB +2734078208,2734099455,US +2734099456,2734102527,CA +2734102528,2734104575,VI +2734104576,2734105599,US +2734105600,2734106623,CA +2734106624,2734119935,US +2734119936,2734120959,CA +2734120960,2734125055,US +2734125056,2734129151,CA +2734129152,2734139391,US +2734139392,2734140415,CA +2734140416,2734152447,US +2734152448,2734152703,CA +2734152704,2734153727,KY +2734153728,2734155775,CA +2734155776,2734163967,US +2734163968,2734164991,CA +2734164992,2734170111,US +2734170112,2734172159,CA +2734172160,2734173183,US +2734173184,2734174207,PR +2734174208,2734192639,US +2734192640,2734194687,CA +2734194688,2734197759,US +2734197760,2734198783,CA +2734198784,2734200831,US +2734200832,2734205951,CA +2734205952,2734206975,US +2734206976,2734209023,CA +2734209024,2734218239,US +2734218240,2734218751,CA +2734218752,2734219263,US +2734221312,2734224415,US +2734224416,2734224431,GB +2734224432,2734229503,US +2734229504,2734230527,CA +2734230528,2734237695,US +2734237696,2734238719,CA +2734238720,2734249983,US +2734249984,2734252031,CA +2734252032,2734260223,US +2734260224,2734262271,KY +2734262272,2734268415,US +2734268416,2734269439,CA +2734269440,2734287871,US +2734287872,2734288895,CA +2734288896,2734296063,US +2734296064,2734297087,CA +2734297088,2734304255,US +2734304256,2734305279,CA +2734305280,2734330623,US +2734330624,2734330879,IT +2734330880,2734335999,US +2734336000,2734338047,CA +2734338048,2734341119,US +2734341120,2734344191,CA +2734344192,2734349311,US +2734349312,2734350335,CA +2734350336,2734362623,US +2734362624,2734363647,CA +2734363648,2734373887,US +2734373888,2734374911,CA +2734374912,2734376959,US +2734376960,2734379007,CA +2734379008,2734380799,US +2734380800,2734381055,VG +2734381056,2734398463,US +2734398464,2734399487,PR +2734399488,2734407679,US +2734407680,2734409727,CA +2734409728,2734413823,US +2734413824,2734413847,AR +2734413848,2734413855,TT +2734413856,2734413863,AR +2734413864,2734414078,US +2734414079,2734414079,MX +2734414080,2734414083,PA +2734414084,2734414087,MX +2734414088,2734414091,CR +2734414092,2734414095,PA +2734414096,2734414143,MX +2734414144,2734414159,PA +2734414160,2734414175,MX +2734414176,2734414183,PA +2734414184,2734414295,MX +2734414296,2734414299,US +2734414300,2734414319,MX +2734414320,2734414327,PA +2734414328,2734414328,US +2734414329,2734414329,MX +2734414330,2734414334,US +2734414335,2734414335,MX +2734414336,2734432255,US +2734433280,2734435327,US +2734435328,2734436351,CA +2734436352,2734447615,US +2734447616,2734448639,CA +2734448640,2734452735,US +2734452736,2734454783,CA +2734454784,2734457855,US +2734457856,2734458879,CA +2734458880,2734467327,US +2734467328,2734467583,CA +2734467584,2734467839,US +2734467840,2734468095,GB +2734468096,2734471167,US +2734471168,2734472191,CA +2734472192,2734473215,AG +2734473216,2734479359,US +2734479360,2734481407,CA +2734481408,2734485503,US +2734485504,2734486527,CA +2734486528,2734488575,US +2734488576,2734489599,CA +2734489600,2734491647,US +2734491648,2734492671,CA +2734492672,2734493695,US +2734493696,2734494719,MY +2734494720,2734502911,US +2734502912,2734503935,CA +2734503936,2734515199,US +2734515200,2734516223,DM +2734516224,2734522367,US +2734522368,2734523391,CA +2734523392,2734524415,US +2734524416,2734526463,CA +2734526464,2734532607,US +2734532608,2734533631,VI +2734533632,2734553087,US +2734553088,2734555135,CA +2734555136,2734565375,US +2734565376,2734566399,CA +2734566400,2734577151,US +2734577152,2734577167,LU +2734577168,2734588927,US +2734588928,2734589951,CA +2734589952,2734599167,US +2734599168,2734600191,CA +2734601216,2734605311,US +2734605312,2734605567,GB +2734605568,2734605823,DE +2734605824,2734606079,SE +2734606080,2734607179,US +2734607180,2734607181,KW +2734607182,2734608351,US +2734608352,2734608367,DE +2734608368,2734633983,US +2734633984,2734635007,CA +2734635008,2734649343,US +2734649344,2734650367,CA +2734650368,2734657535,US +2734657536,2734658559,VG +2734658560,2734659583,CA +2734659584,2734665727,US +2734665728,2734666751,CA +2734666752,2734672895,US +2734672896,2734675967,CA +2734675968,2734678015,BM +2734678016,2734679039,US +2734679040,2734680063,CA +2734680064,2734684159,US +2734684160,2734686207,CA +2734686208,2734751743,CN +2734751744,2734817279,GB +2734817280,2734882815,US +2734882816,2734948351,SE +2734948352,2735013887,US +2735013888,2735079423,FR +2735079424,2735144959,US +2735144960,2735210495,NZ +2735210496,2735276031,AU +2735276032,2735341567,FR +2735341568,2735407103,AR +2735407104,2735538175,US +2735538176,2736848895,TW +2736848896,2736914431,US +2736914432,2736979967,NO +2736979968,2737438719,US +2737438720,2737594367,JP +2737594368,2737602559,US +2737602560,2737610751,SG +2737610752,2737618943,JP +2737618944,2737619967,VN +2737619968,2737620991,TH +2737620992,2737621247,VN +2737621248,2737622015,SG +2737622016,2737623039,VN +2737623040,2737767423,JP +2737767424,2737768447,CN +2737768448,2737769471,SG +2737769472,2737770495,IN +2737770496,2737771263,AU +2737771264,2737771519,JP +2737771520,2737771775,AU +2737771776,2737772031,NZ +2737772288,2737774591,JP +2737774592,2737776639,BD +2737776640,2737777663,AU +2737777664,2737778175,HK +2737778432,2737781759,AU +2737781760,2737782783,US +2737782784,2737785855,AU +2737785856,2737788927,BD +2737788928,2737789951,MY +2737789952,2737793023,AU +2737793024,2737794047,NZ +2737794048,2737795071,AU +2737795072,2737796095,NZ +2737796096,2737799167,AU +2737799168,2737800191,NZ +2737800192,2737802239,AU +2737802240,2737803263,IN +2737803264,2737804287,BD +2737804288,2737805311,NP +2737805312,2737806335,IN +2737806336,2737807359,BD +2737807360,2737808383,AF +2737808384,2737809407,NZ +2737809408,2737810431,AU +2737810432,2737811455,KH +2737811456,2737811711,SG +2737811712,2737811967,HK +2737811968,2737812223,GB +2737812224,2737812479,US +2737812480,2737813503,AU +2737813504,2737815551,NZ +2737815552,2737816575,MY +2737816576,2737817599,AU +2737817600,2737818111,MY +2737818112,2737818367,AU +2737818368,2737818623,MY +2737818624,2737819647,NZ +2737819648,2737821695,IN +2737821696,2737822719,AU +2737822720,2737823743,NZ +2737823744,2737824767,NC +2737824768,2737829887,NZ +2737829888,2737830911,NC +2737830912,2737831935,AU +2737831936,2738094079,JP +2738159616,2738163711,CN +2738163712,2738164735,HK +2738164736,2738165759,AU +2738165760,2738166783,NP +2738166784,2738167807,KH +2738167808,2738168831,AU +2738168832,2738177023,CN +2738177024,2738178047,AU +2738178048,2738182143,IN +2738182144,2738195455,CN +2738195456,2738196479,BD +2738196480,2738197503,AU +2738197504,2738198527,BD +2738198528,2738199551,MY +2738199552,2738200575,KR +2738200576,2738204671,CN +2738204672,2738205695,IN +2738205696,2738206719,BD +2738206720,2738207743,ID +2738207744,2738208767,CN +2738208768,2738209791,ID +2738209792,2738210815,KH +2738210816,2738214911,IN +2738214912,2738215935,HK +2738215936,2738216959,CN +2738216960,2738217983,MY +2738217984,2738220031,AU +2738220032,2738222079,CN +2738222080,2738223103,MO +2738223104,2738224127,AU +2738224128,2738225151,IN +2738225152,2738683903,JP +2738749440,2741370879,FR +2741370880,2741436415,US +2741436416,2742353919,FR +2742353920,2742419455,ES +2742419456,2742484991,US +2742484992,2742550527,GB +2742550528,2742616063,US +2742616064,2742681599,EG +2742681600,2742747135,IN +2742747136,2742779903,CA +2742779904,2742878207,US +2742878208,2742943743,CN +2742943744,2743009279,US +2743140352,2743205887,US +2743205888,2743992319,JP +2743992320,2744057855,CN +2744057856,2744516607,JP +2744516608,2744647679,US +2744647680,2744713215,KR +2744713216,2744844287,US +2744844288,2744909823,CA +2744909824,2744975359,GB +2744975360,2744975871,DE +2744975872,2745040895,SE +2745040896,2745106431,NL +2745106432,2745171967,SI +2745171968,2745237503,GB +2745237504,2745303039,CH +2745303040,2745368575,IT +2745368576,2745434111,BE +2745434112,2745499647,GB +2745499648,2745548799,BE +2745548800,2745565183,DE +2745565184,2745696255,GB +2745696256,2745761791,CH +2745761792,2745909247,GB +2745909248,2745958399,US +2745958400,2746011647,FR +2746011648,2746015743,NL +2746015744,2746089471,FR +2746089472,2746155007,NO +2746155008,2746220543,NL +2746220544,2746286079,US +2746286080,2746351615,CN +2746351616,2746417151,CR +2746417152,2746482687,CN +2746482688,2746548223,KR +2746548224,2746662911,US +2746662912,2746679295,CA +2746679296,2747072511,US +2747072512,2747138047,AU +2747138048,2747465727,US +2747465728,2748055551,ZA +2748055552,2748121087,CN +2748121088,2748317695,US +2748317696,2748645375,JP +2748645376,2748710911,KR +2748710912,2749235199,JP +2749235200,2749300735,KR +2749366272,2749628415,JP +2749628416,2749693951,US +2749693952,2749759487,KR +2749759488,2749890559,US +2749890560,2750021631,AU +2750021632,2750349311,US +2750349312,2750414847,KR +2750414848,2750723071,US +2750723072,2750723327,IN +2750723328,2750723583,US +2750723584,2750723839,IN +2750723840,2750724607,US +2750724608,2750724863,IN +2750724864,2750739967,US +2750739968,2750740223,CN +2750740224,2750873599,US +2750873600,2750939135,CL +2750939136,2751070207,US +2751070208,2751135743,CL +2751135744,2751196929,US +2751196930,2751196930,JP +2751196931,2751397887,US +2751397888,2751463423,KR +2751463424,2751528959,KZ +2751528960,2751660031,FR +2751660032,2751716351,AT +2751716352,2751716607,US +2751716608,2751725567,AT +2751725568,2751791103,SE +2751791104,2751856639,FI +2751856640,2751922175,GB +2751922176,2751987711,FR +2751987712,2752053247,SI +2752053248,2752184319,SE +2752184320,2752315391,GB +2752315392,2752380927,FI +2752380928,2752446463,CH +2752446464,2752511999,BE +2752512000,2753757183,DE +2753757184,2753822719,BE +2753822720,2753888255,GB +2753888256,2753953791,SE +2753953792,2754084863,GB +2754084864,2754117631,KZ +2754117632,2754117823,NL +2754117824,2754125823,GB +2754125824,2754127871,DE +2754127872,2754129919,SK +2754129920,2754131967,SE +2754134016,2754138111,DE +2754138112,2754142207,GB +2754142208,2754144255,BA +2754144256,2754146303,DE +2754146304,2754148351,PL +2754148352,2754150399,MK +2754150400,2754215935,BR +2754215936,2754281471,PR +2754281472,2754347007,JP +2754347008,2754478079,US +2754478080,2754543615,JP +2754543616,2754609151,US +2754609152,2754674687,SE +2754674688,2754871295,US +2754871296,2754904063,HK +2754904064,2754920447,US +2754920448,2754928639,IN +2754928640,2754936831,US +2754936832,2755002367,AU +2755002368,2755330047,US +2755330048,2755526655,DE +2755526656,2755985407,US +2755985408,2756182015,JP +2756182016,2756247551,US +2756247552,2756313087,UY +2756313088,2756378623,US +2756378624,2756444159,AU +2756444160,2756509695,US +2756509696,2756556543,CL +2756556544,2756556799,PE +2756556800,2756575231,CL +2756575232,2756640767,SG +2756640768,2756706303,US +2756706304,2756771839,AU +2756771840,2756837375,FR +2756837376,2757033983,US +2757033984,2757099519,BR +2757099520,2757230591,US +2757230592,2757296127,ZA +2757296128,2757754879,US +2757754880,2757820415,CL +2757820416,2757885951,AU +2757885952,2757951487,CL +2757951488,2758017023,US +2758017024,2758082559,IN +2758082560,2758148095,US +2758148096,2758213631,CA +2758213632,2758541311,US +2758541312,2758606847,AU +2758606848,2758803455,US +2758803456,2758868991,AU +2758868992,2759000063,US +2759000064,2759065599,TH +2759065600,2759589887,US +2759589888,2759720959,KR +2759720960,2759852031,PL +2759852032,2759917567,CH +2759917568,2759983103,FR +2759983104,2760048639,IT +2760048640,2760114811,FR +2760114812,2760114815,PL +2760114816,2760114847,FI +2760114848,2760115007,FR +2760115008,2760115071,DE +2760115072,2760115327,FR +2760115328,2760115455,GB +2760115456,2760115711,FR +2760115712,2760115719,IE +2760115720,2760115775,FR +2760115776,2760115839,ES +2760115840,2760115903,FR +2760115904,2760115967,IT +2760115968,2760116063,FR +2760116064,2760116095,PL +2760116096,2760116207,FR +2760116208,2760116223,FI +2760116224,2760116507,FR +2760116508,2760116511,ES +2760116512,2760116759,FR +2760116760,2760116767,PT +2760116768,2760116799,PL +2760116800,2760116831,FR +2760116832,2760116847,GB +2760116848,2760116879,FR +2760116880,2760116895,IT +2760116896,2760117183,FR +2760117184,2760117247,NL +2760117248,2760117375,FR +2760117376,2760117503,GB +2760117504,2760117567,FR +2760117568,2760117631,DE +2760117632,2760117679,FR +2760117680,2760117695,FI +2760117696,2760117727,FR +2760117728,2760117759,FI +2760117760,2760117871,FR +2760117872,2760117887,LT +2760117888,2760117999,FR +2760118000,2760118015,IT +2760118016,2760118303,FR +2760118304,2760118335,PL +2760118336,2760118439,FR +2760118440,2760118463,LT +2760118464,2760118543,FR +2760118544,2760118559,GB +2760118560,2760118799,FR +2760118800,2760118815,ES +2760118816,2760118847,FI +2760118848,2760118911,BE +2760118912,2760118975,FR +2760118976,2760119039,ES +2760119040,2760119263,FR +2760119264,2760119295,PL +2760119296,2760119327,FR +2760119328,2760119359,IT +2760119360,2760119423,DE +2760119424,2760119495,FR +2760119496,2760119499,ES +2760119500,2760119967,FR +2760119968,2760119983,GB +2760119984,2760120543,FR +2760120544,2760120575,ES +2760120576,2760120751,FR +2760120752,2760120759,ES +2760120760,2760120839,FR +2760120840,2760120843,PT +2760120844,2760121663,FR +2760121664,2760121727,ES +2760121728,2760121827,FR +2760121828,2760121831,ES +2760121832,2760122047,FR +2760122048,2760122111,DE +2760122112,2760122303,FR +2760122304,2760122367,NL +2760122368,2760129887,FR +2760129888,2760129919,CZ +2760129920,2760129999,FR +2760130000,2760130015,ES +2760130016,2760130399,FR +2760130400,2760130431,ES +2760130432,2760130559,GB +2760130560,2760130975,FR +2760130976,2760131007,IT +2760131008,2760131071,BE +2760131072,2760131263,FR +2760131264,2760131327,IT +2760131328,2760132159,FR +2760132160,2760132223,ES +2760132224,2760132767,FR +2760132768,2760132783,DE +2760132784,2760132911,FR +2760132912,2760132927,PT +2760132928,2760132959,FR +2760132960,2760132991,DE +2760132992,2760133599,FR +2760133600,2760133631,PL +2760133632,2760134783,FR +2760134784,2760134799,ES +2760134800,2760134879,FR +2760134880,2760134887,ES +2760134888,2760134975,FR +2760134976,2760135039,ES +2760135040,2760135231,FR +2760135232,2760135295,IT +2760135296,2760135615,FR +2760135616,2760135679,DE +2760135680,2760135687,FR +2760135688,2760135695,CZ +2760135696,2760135935,FR +2760135936,2760136191,PT +2760136192,2760136767,FR +2760136768,2760136831,BE +2760136832,2760137215,FR +2760137216,2760137471,GB +2760137472,2760137535,FR +2760137536,2760137599,ES +2760137600,2760137647,FR +2760137648,2760137663,PL +2760137664,2760137935,FR +2760137936,2760137951,PL +2760137952,2760138271,FR +2760138272,2760138303,PL +2760138304,2760143039,FR +2760143040,2760143103,ES +2760143104,2760143295,FR +2760143296,2760143359,DE +2760143360,2760143615,FR +2760143616,2760143871,GB +2760143872,2760145215,FR +2760145216,2760145279,ES +2760145280,2760145327,FR +2760145328,2760145343,PL +2760145344,2760145599,FR +2760145600,2760145663,NL +2760145664,2760145855,FR +2760145856,2760145919,GB +2760145920,2760146111,FR +2760146112,2760146143,FI +2760146144,2760146159,FR +2760146160,2760146175,PL +2760146176,2760147423,FR +2760147424,2760147455,DE +2760147456,2760147463,FR +2760147464,2760147467,GB +2760147468,2760147647,FR +2760147648,2760147711,ES +2760147712,2760148551,FR +2760148552,2760148559,FI +2760148560,2760148895,FR +2760148896,2760148927,CZ +2760148928,2760148991,DE +2760148992,2760149039,FR +2760149040,2760149055,LT +2760149056,2760149215,FR +2760149216,2760149247,BE +2760149248,2760149263,FR +2760149264,2760149279,PT +2760149280,2760149327,FR +2760149328,2760149343,LT +2760149344,2760149375,FR +2760149376,2760149503,GB +2760149504,2760150087,FR +2760150088,2760150095,ES +2760150096,2760150111,FR +2760150112,2760150143,NL +2760150144,2760150207,BE +2760150208,2760150239,FR +2760150240,2760150271,PL +2760150272,2760150335,FR +2760150336,2760150399,BE +2760150400,2760150847,FR +2760150848,2760150911,DE +2760150912,2760151039,FR +2760151040,2760151055,GB +2760151056,2760151199,FR +2760151200,2760151231,CZ +2760151232,2760151247,FR +2760151248,2760151263,LT +2760151264,2760151295,NL +2760151296,2760151335,FR +2760151336,2760151339,GB +2760151340,2760151343,FR +2760151344,2760151359,GB +2760151360,2760151423,IT +2760151424,2760151679,FR +2760151680,2760151743,IT +2760151744,2760151903,FR +2760151904,2760151935,PT +2760151936,2760152591,FR +2760152592,2760152607,PL +2760152608,2760152639,FI +2760152640,2760152647,FR +2760152648,2760152655,LT +2760152656,2760152751,FR +2760152752,2760152767,LT +2760152768,2760153439,FR +2760153440,2760153471,ES +2760153472,2760153535,FR +2760153536,2760153599,DE +2760153600,2760154223,FR +2760154224,2760154239,DE +2760154240,2760154303,FR +2760154304,2760154367,NL +2760154368,2760154951,FR +2760154952,2760154955,GB +2760154956,2760154959,FR +2760154960,2760154975,IT +2760154976,2760155007,PL +2760155008,2760155135,GB +2760155136,2760159279,FR +2760159280,2760159295,LT +2760159296,2760159423,FR +2760159424,2760159487,DE +2760159488,2760159615,FR +2760159616,2760159743,GB +2760159744,2760159775,FR +2760159776,2760159807,IT +2760159808,2760159903,FR +2760159904,2760159935,CZ +2760159936,2760160831,FR +2760160832,2760160895,IT +2760160896,2760160959,FR +2760160960,2760161023,DE +2760161024,2760161983,FR +2760161984,2760162047,IE +2760162048,2760162399,FR +2760162400,2760162431,ES +2760162432,2760162495,FR +2760162496,2760162559,BE +2760162560,2760162671,FR +2760162672,2760162687,PL +2760162688,2760163135,FR +2760163136,2760163199,ES +2760163200,2760163263,FR +2760163264,2760163327,DE +2760163328,2760166682,FR +2760166683,2760166683,DE +2760166684,2760167583,FR +2760167584,2760167599,ES +2760167600,2760167647,FR +2760167648,2760167679,GB +2760167680,2760167951,FR +2760167952,2760167967,ES +2760167968,2760167999,FR +2760168000,2760168063,BE +2760168064,2760168095,FR +2760168096,2760168127,PL +2760168128,2760168191,IE +2760168192,2760168319,FR +2760168320,2760168447,GB +2760168448,2760169183,FR +2760169184,2760169215,ES +2760169216,2760169343,FR +2760169344,2760169471,IT +2760169472,2760169503,FI +2760169504,2760169679,FR +2760169680,2760169695,ES +2760169696,2760169983,FR +2760169984,2760170047,ES +2760170048,2760170111,FI +2760170112,2760170815,FR +2760170816,2760170847,PT +2760170848,2760170975,FR +2760170976,2760170991,IT +2760170992,2760171279,FR +2760171280,2760171295,PL +2760171296,2760171439,FR +2760171440,2760171455,CZ +2760171456,2760174591,FR +2760174592,2760174623,GB +2760174624,2760175007,FR +2760175008,2760175039,PL +2760175040,2760175295,FR +2760175296,2760175359,ES +2760175360,2760175423,FR +2760175424,2760175487,DE +2760175488,2760175615,GB +2760175616,2760178111,FR +2760178112,2760178175,ES +2760178176,2760178559,FR +2760178560,2760178687,IT +2760178688,2760178751,FR +2760178752,2760178767,GB +2760178768,2760179711,FR +2760179712,2760245247,DE +2760245248,2760310783,GB +2760310784,2760376319,SE +2760376320,2760507391,GB +2760507392,2760511487,RU +2760511488,2760513535,IR +2760513536,2760515583,NL +2760515584,2760517631,RU +2760517632,2760519679,KZ +2760519680,2760521727,IT +2760521728,2760523775,FR +2760523776,2760527871,CH +2760527872,2760529919,GB +2760529920,2760531967,RU +2760534016,2760536063,BE +2760536064,2760540159,IL +2760540160,2760556543,IR +2760556544,2760558591,DE +2760558592,2760562687,ES +2760562688,2760564735,BG +2760564736,2760566783,GB +2760566784,2760568831,IQ +2760568832,2760570879,FR +2760570880,2760572927,NL +2760572928,2760638463,DE +2760638464,2760703999,NL +2760704000,2760769535,FI +2760769536,2760835071,IT +2760835072,2760898559,GB +2760898560,2760899583,US +2760899584,2760900607,GB +2760900608,2761031679,US +2761031680,2761424895,ZA +2761424896,2761621503,US +2761621504,2761687039,ZA +2761687040,2761949183,US +2761949184,2761950207,TN +2761950208,2761951231,UG +2761951232,2761952255,LR +2761952256,2761953279,ZM +2761953280,2761954303,CG +2761954304,2761956351,ZA +2761956352,2761957375,TZ +2761957376,2761958399,CI +2761958400,2761959423,ZA +2761959424,2761960447,CI +2761960448,2761961471,ZA +2761961472,2761962495,CD +2761962496,2761963519,ZA +2761963520,2761964543,ZM +2761964544,2761965567,ZA +2761965568,2761966591,EG +2761966592,2761967615,RE +2761967616,2761970687,ZA +2761970688,2761971711,GQ +2761971712,2761973759,ZA +2761973760,2761974783,AO +2761974784,2761975807,RW +2761975808,2761976831,EG +2761976832,2761977855,NA +2761977856,2761978879,UG +2761978880,2761981951,ZA +2761981952,2761982975,NG +2761982976,2761983999,GH +2761984000,2761985023,KM +2761985024,2761986047,BJ +2761986048,2761987071,LY +2761987072,2761989119,ZA +2761989120,2761990143,CG +2761990144,2761992191,UG +2761992192,2761996287,ZA +2761996288,2761997311,ET +2761997312,2761998335,ZA +2761998336,2762000383,NG +2762000384,2762006527,ZA +2762006528,2762010623,RE +2762010624,2762014719,GH +2762014720,2762145791,JP +2762145792,2762147839,BR +2762147840,2762148863,PA +2762148864,2762156031,BR +2762156032,2762157055,AR +2762157056,2762158079,BR +2762158080,2762159103,EC +2762159104,2762160127,BR +2762160128,2762161151,AR +2762161152,2762164223,BR +2762164224,2762165247,HN +2762165248,2762166271,BR +2762166272,2762167295,CL +2762167296,2762168319,BR +2762168320,2762169343,CL +2762169344,2762176511,BR +2762176512,2762177535,AR +2762177536,2762178559,HN +2762178560,2762179583,AR +2762179584,2762180607,EC +2762180608,2762186751,BR +2762186752,2762187775,EC +2762187776,2762192895,BR +2762192896,2762193919,PY +2762193920,2762194943,MX +2762194944,2762201087,BR +2762201088,2762202111,AR +2762202112,2762207231,BR +2762207232,2762207487,AR +2762207488,2762207743,PE +2762207744,2762208255,BR +2762208256,2762209279,PA +2762209280,2762211327,BR +2762211328,2762276863,IN +2762276864,2762342399,US +2762342400,2762407935,CA +2762407936,2763063295,US +2763063296,2763096063,FR +2763096064,2763104255,GB +2763104256,2763108351,DE +2763108352,2763110399,RU +2763110400,2763112447,NL +2763112448,2763128831,BY +2763128832,2763194367,CA +2763194368,2765553663,US +2765553664,2765561855,CY +2765561856,2765563903,FI +2765563904,2765565951,IR +2765565952,2765567999,RU +2765568000,2765570047,IR +2765570048,2765578239,RU +2765578240,2765580287,AZ +2765580288,2765582335,GB +2765582336,2765586431,CZ +2765586432,2765619199,IR +2765619200,2768240639,US +2768240640,2768306175,ZA +2768306176,2768437247,US +2768437248,2768633855,ZA +2768633856,2768764927,US +2768764928,2769027071,ZA +2769027072,2769092607,AU +2769092608,2769158143,US +2769158144,2769223679,JP +2769289216,2769321983,LY +2769321984,2769338367,ZA +2769338368,2769340415,TZ +2769340416,2769342463,ZA +2769342464,2769346559,BF +2769346560,2769354751,ZA +2769485824,2769616895,US +2769616896,2769682431,SG +2769682432,2769747967,US +2769747968,2769813503,CA +2769813504,2769879039,US +2769879040,2769944575,ZA +2769944576,2770272255,US +2770272256,2770337791,AU +2770337792,2770993151,US +2770993152,2771124223,IN +2771124224,2771451903,US +2771451904,2771517439,ZA +2771517440,2771648511,TN +2771648512,2771910655,US +2771910656,2772434943,ZM +2772434944,2772762623,US +2772762624,2772828159,AU +2772828160,2772959231,US +2772959232,2773024767,CZ +2773024768,2773058559,ZA +2773058560,2773059583,SZ +2773059584,2773061631,ZA +2773061632,2773065727,CM +2773065728,2773073919,ZA +2773073920,2773082111,NG +2773082112,2773085183,ZA +2773085184,2773086207,SL +2773086208,2773090303,ZA +2773090304,2773221375,US +2773221376,2773286911,JP +2773286912,2773745663,US +2773745664,2773778431,NZ +2773778432,2773794815,HK +2773794816,2773798911,IN +2773798912,2773803007,US +2773803008,2773803263,GB +2773803264,2773804031,US +2773804032,2773804287,GB +2773804288,2773804799,US +2773804800,2773805055,GB +2773805056,2773807103,JP +2773807104,2773811199,IN +2773811200,2773876735,US +2773876736,2773942271,AU +2773942272,2774138879,US +2774138880,2774142719,KE +2774142720,2774143231,UG +2774143232,2774147071,KE +2774147072,2774155263,ZA +2774155264,2774163455,MZ +2774163456,2774171647,CV +2774171648,2774188031,RE +2774188032,2774192127,ZA +2774192128,2774196223,ML +2774196224,2774200319,ZA +2774200320,2774204415,NG +2774204416,2774335487,US +2774335488,2774401023,JP +2774401024,2774532095,US +2774532096,2774597631,JP +2774597632,2774663167,US +2774663168,2774728703,NI +2774794240,2774990847,JP +2774990848,2775318527,US +2775318528,2775384063,JP +2775384064,2775711743,US +2775711744,2775777279,NL +2775777280,2775842815,CA +2775842816,2775973887,US +2775973888,2776039423,AU +2776039424,2776104959,US +2776104960,2776170495,GB +2776170496,2776478975,US +2776478976,2776479231,AU +2776479232,2776891391,US +2776891392,2777022463,KR +2777022464,2777481215,US +2777481216,2777546751,KR +2777546752,2777612287,AU +2777612288,2778071039,ZA +2778071040,2778333183,US +2778333184,2778398719,CA +2778398720,2779054079,US +2779054080,2779119615,ZA +2779119616,2779316223,US +2779316224,2779381759,RE +2779381760,2779906047,US +2779906048,2779971583,CA +2779971584,2780037119,US +2780037120,2780039167,ZA +2780039168,2780043263,US +2780043264,2780073471,ZA +2780073472,2780073727,AU +2780073728,2780075007,ZA +2780075008,2780075519,US +2780075520,2780082175,ZA +2780082176,2780083455,CA +2780083456,2780083967,ZA +2780083968,2780084223,CA +2780084224,2780102655,ZA +2780102656,2780168191,US +2780168192,2780299263,CL +2780299264,2780364799,US +2780364800,2780430335,CA +2780430336,2780495871,KR +2780495872,2780561407,AU +2780561408,2780758015,US +2780758016,2780823551,AU +2780823552,2780925951,US +2780925952,2780926207,GB +2780926208,2780926975,US +2780926976,2780927487,GB +2780927488,2780927743,US +2780927744,2780927999,GB +2780928000,2780929023,US +2780929024,2780929279,GB +2780929280,2780929791,FR +2780929792,2780930047,US +2780930048,2780930559,GB +2780930560,2780931071,US +2780931072,2780932095,GB +2780932096,2780932607,US +2780932608,2780933119,GB +2780933120,2780933375,US +2780933376,2780933631,GB +2780933632,2780933887,US +2780933888,2780934143,GB +2780934144,2780934911,US +2780934912,2780935167,GB +2780935168,2780954623,US +2780954624,2781020159,KR +2781020160,2781206527,US +2781206528,2781207551,GB +2781207552,2781208575,DE +2781208576,2781478911,US +2781478912,2781544447,HK +2781544448,2781614591,US +2781614592,2781615103,MX +2781615104,2781623807,US +2781623808,2781624319,CA +2781624320,2781626367,US +2781626368,2781626879,NL +2781626880,2781627391,IT +2781627392,2781628415,US +2781628416,2781628927,DE +2781628928,2781630463,US +2781630464,2781631487,MY +2781631488,2781635583,US +2781635584,2781636095,JP +2781636096,2781643775,US +2781643776,2781644287,KR +2781644288,2781644799,TW +2781644800,2781645823,IN +2781645824,2781646335,SG +2781646336,2781675519,US +2781675520,2781741055,NZ +2781741056,2781937663,US +2781937664,2782003199,TH +2782003200,2782134271,CM +2782134272,2782199807,US +2782199808,2782265343,KR +2782265344,2782372863,US +2782372864,2782373887,GB +2782373888,2782658559,US +2782658560,2782724095,PH +2782724096,2782789631,US +2782789632,2782855167,CH +2782855168,2782990335,US +2782990336,2782990847,GB +2782990848,2782995455,US +2782995456,2782995519,CA +2782995520,2782995527,US +2782995528,2782995531,CA +2782995532,2782995535,US +2782995536,2782995587,CA +2782995588,2783002623,US +2783002624,2783002879,DK +2783002880,2783003135,US +2783003136,2783003647,RU +2783003648,2783003903,SE +2783003904,2783004159,US +2783004160,2783004671,CH +2783004672,2783004927,US +2783004928,2783005695,DE +2783005696,2783005951,FR +2783005952,2783006719,US +2783006720,2783007487,GB +2783007488,2783007743,US +2783007744,2783008255,PL +2783008256,2783008767,IT +2783008768,2783009279,BE +2783009280,2783010889,US +2783010890,2783010890,HK +2783010891,2783010943,US +2783010944,2783011071,HK +2783011072,2783011327,US +2783011328,2783011839,AU +2783011840,2783012351,JP +2783012352,2783012607,TW +2783012608,2783012863,US +2783012864,2783013887,IN +2783013888,2783125729,US +2783125730,2783125730,CA +2783125731,2783126051,US +2783126052,2783126052,CA +2783126053,2783126581,US +2783126582,2783126582,CA +2783126583,2783126603,US +2783126604,2783126604,CA +2783126605,2783126647,US +2783126648,2783126648,CA +2783126649,2783126649,US +2783126650,2783126650,CA +2783126651,2783126682,US +2783126683,2783126683,CA +2783126684,2783126684,US +2783126685,2783126685,CA +2783126686,2783126692,US +2783126693,2783126693,CA +2783126694,2783126701,US +2783126702,2783126702,CA +2783126703,2783126760,US +2783126761,2783126761,CA +2783126762,2783126771,US +2783126772,2783126772,CA +2783126773,2783127050,US +2783127051,2783127051,CA +2783127052,2783127578,US +2783127579,2783127579,CA +2783127580,2783128073,US +2783128074,2783128074,CA +2783128075,2783128142,US +2783128143,2783128143,CA +2783128144,2783128616,US +2783128617,2783128617,CA +2783128618,2783128622,US +2783128623,2783128623,CA +2783128624,2783128647,US +2783128648,2783128648,CA +2783128649,2783128728,US +2783128729,2783128729,CA +2783128730,2783150079,US +2783150080,2783158271,DE +2783158272,2783158802,US +2783158803,2783158803,DE +2783158804,2783159015,US +2783159016,2783159016,DE +2783159017,2783160412,US +2783160413,2783160413,DE +2783160414,2783162286,US +2783162287,2783162287,DE +2783162288,2783182847,US +2783182848,2783248383,AU +2783248384,2783313919,KR +2783313920,2783379455,US +2783379456,2783380991,SC +2783380992,2783381503,NZ +2783381504,2783383551,SC +2783383552,2783387647,CA +2783387648,2783391743,GB +2783391744,2783395839,US +2783395840,2783399935,DE +2783399936,2783404031,FR +2783404032,2783408127,NL +2783408128,2783412223,NO +2783412224,2783416319,SE +2783416320,2783420415,RU +2783420416,2783424511,EE +2783424512,2783428607,JP +2783428608,2783436799,US +2783436800,2783440895,IT +2783440896,2783444991,IN +2783444992,2783510527,US +2783510528,2783576063,ZA +2783576064,2783969279,US +2783969280,2784034815,AU +2784034816,2784165887,JP +2784165888,2784296959,KR +2784296960,2784362495,US +2784362496,2784428031,KR +2784428032,2784952063,US +2784952064,2784952319,NL +2784952320,2785017855,ZA +2785017856,2785804287,US +2785804288,2786066431,CH +2786066432,2788163583,US +2788163584,2788229119,CA +2788229120,2788261887,US +2788261888,2788294655,GB +2788294656,2789113855,US +2789113856,2789146623,CA +2789146624,2789212159,US +2789212160,2789277695,AU +2789277696,2789343231,NZ +2789343232,2789933055,US +2789933056,2789998591,CL +2789998592,2790195199,US +2790195200,2790260735,KR +2790260736,2790326271,US +2790326272,2790391807,HK +2790391808,2790457343,US +2790457344,2790522879,NZ +2790522880,2790588415,US +2790588416,2790653951,ZA +2790653952,2790719487,US +2790719488,2790785023,SA +2790785024,2790816511,US +2790816512,2790816767,DE +2790816768,2790834431,US +2790834432,2790834687,CH +2790834688,2791571455,US +2791571456,2791636991,JP +2791636992,2791768063,US +2791768064,2791899135,KR +2791899136,2791964671,US +2792030208,2792226815,US +2792226816,2792292351,CL +2792292352,2792357887,CN +2792357888,2792488959,US +2792488960,2792554495,BO +2792554496,2792751103,US +2792751104,2792882175,JP +2792882176,2792947711,AU +2792947712,2793013247,SG +2793013248,2793209855,US +2793209856,2793275391,KR +2793275392,2796806911,US +2796806912,2796807167,NZ +2796807168,2796807935,US +2796807936,2796808191,NZ +2796808192,2798838015,US +2798838016,2798838271,CO +2798838272,2801795071,US +2801795072,2801860607,CO +2801860608,2802515967,US +2802515968,2802581503,CA +2802581504,2802909183,US +2802909184,2802974719,CA +2802974720,2803630079,US +2803630080,2803695615,CL +2803695616,2803761151,US +2803761152,2803826687,AU +2803826688,2803892223,US +2803892224,2805465087,CA +2805465088,2805989375,UY +2805989376,2806012937,US +2806012938,2806012938,HK +2806012939,2806644735,US +2806644736,2806710271,CA +2806710272,2807103487,US +2807103488,2807169023,NL +2807169024,2807271679,US +2807271680,2807271935,AU +2807271936,2807496703,US +2807496704,2807562239,DE +2807562240,2807566335,US +2807566336,2807574527,CA +2807578624,2807587071,US +2807587072,2807587327,IT +2807587328,2807587583,QA +2807587584,2807587839,IN +2807587840,2807588095,AE +2807588096,2807588223,US +2807588224,2807588351,ES +2807588352,2807588863,CN +2807588864,2807589119,JP +2807589120,2807589375,RO +2807589376,2807589631,FR +2807589632,2807589887,PT +2807589888,2807590143,AT +2807590144,2807590399,MT +2807590400,2807590655,GR +2807590656,2807590911,SA +2807590912,2807595007,US +2807595008,2807599103,CA +2807599104,2807607295,US +2807607296,2807611391,CA +2807611392,2807824383,US +2807824384,2807889919,CA +2807889920,2808217599,US +2808217600,2808283135,GB +2808283136,2808545279,US +2808545280,2808610815,AU +2808610816,2808872959,US +2808872960,2808938495,UY +2808938496,2809069567,US +2809069568,2809135103,SA +2809135104,2809266175,US +2809266176,2809269025,CA +2809269026,2809269026,US +2809269027,2809274367,CA +2809274368,2809274623,US +2809274624,2809276083,CA +2809276084,2809276087,US +2809276088,2809277375,CA +2809277376,2809277407,FR +2809277408,2809281575,CA +2809281576,2809281583,US +2809281584,2809282652,CA +2809282653,2809282653,US +2809282654,2809286975,CA +2809286976,2809286991,US +2809286992,2809287979,CA +2809287980,2809287983,US +2809287984,2809291732,CA +2809291733,2809291733,US +2809291734,2809291823,CA +2809291824,2809291824,US +2809291825,2809291891,CA +2809291892,2809291892,US +2809291893,2809297711,CA +2809297712,2809297712,US +2809297713,2809297845,CA +2809297846,2809297846,US +2809297847,2809302815,CA +2809302816,2809302831,US +2809302832,2809308599,CA +2809308600,2809308607,US +2809308608,2809316607,CA +2809316608,2809316623,US +2809316624,2809321007,CA +2809321008,2809321015,US +2809321016,2809323519,CA +2809323520,2809327569,FR +2809327570,2809327570,RU +2809327571,2809331711,FR +2809331712,2809397247,US +2809397248,2809462783,UY +2809462784,2809855999,US +2809856000,2809921535,AU +2809921536,2809987071,US +2809987072,2810052607,CA +2810052608,2810249215,US +2810249216,2810314751,CA +2810314752,2810380287,AU +2810380288,2810576895,US +2810576896,2810642431,VE +2810642432,2810904575,US +2810904576,2810970111,CN +2810970112,2811428863,US +2811428864,2811494399,CA +2811494400,2811559935,US +2811559936,2811625471,CH +2811625472,2812084223,US +2812084224,2812149759,BO +2812149760,2812280831,US +2812280832,2812283391,NL +2812283392,2812283647,US +2812283648,2812283903,NL +2812283904,2812284159,US +2812284160,2812285695,NL +2812285696,2812285951,US +2812285952,2812286207,NL +2812286208,2812286463,US +2812286464,2812288511,NL +2812288512,2812291071,US +2812291072,2812292095,DE +2812292096,2812293119,US +2812293120,2812295167,IN +2812295168,2812297215,GB +2812297216,2812311295,US +2812311296,2812311551,RO +2812311552,2812411903,US +2812411904,2812477439,AU +2812477440,2812805119,US +2812805120,2812870655,CH +2812870656,2812936191,JP +2812936192,2813067263,US +2813067264,2813132799,GB +2813132800,2813263871,US +2813263872,2813329407,JP +2813329408,2813526015,US +2813526016,2813591551,NZ +2813591552,2814181375,US +2814181376,2814246911,CN +2814246912,2815082495,US +2815082496,2815090687,NL +2815090688,2815098879,US +2815098880,2815164415,GB +2815164416,2815229951,US +2815229952,2815295487,ID +2815295488,2815986943,US +2815986944,2815987199,GB +2815987200,2815988383,US +2815988384,2815988415,GB +2815988416,2815988863,US +2815988864,2815988895,GB +2815988896,2816159743,US +2816159744,2816163839,IN +2816163840,2816246783,US +2816246784,2816247807,IL +2816247808,2816262143,US +2816262144,2816263167,IE +2816263168,2816264191,GB +2816264192,2816264447,IE +2816264448,2816264703,GB +2816264704,2816264959,US +2816264960,2816264983,IE +2816264984,2816270335,US +2816270336,2816271615,SG +2816271616,2816271871,JP +2816271872,2816272127,IN +2816272128,2816272383,AU +2816272384,2816272415,JP +2816272416,2816272543,SG +2816272544,2816273407,JP +2816273408,2816274431,IN +2816274432,2816275455,AU +2816275456,2816276479,CN +2816276480,2816278527,SG +2816278528,2816671743,US +2816671744,2816737279,CA +2816737280,2817064959,US +2817064960,2817130495,DE +2817130496,2817277951,US +2817277952,2817294335,NL +2817294336,2817933055,US +2817933056,2817933311,CA +2817933312,2818002943,US +2818002944,2818003722,GB +2818003723,2818003723,US +2818003724,2818004991,GB +2818004992,2818113535,US +2818113536,2818115583,BR +2818115584,2818116607,PE +2818116608,2818118655,BR +2818118656,2818119679,SV +2818119680,2818121727,BR +2818121728,2818122751,VE +2818122752,2818123775,BR +2818123776,2818124799,CO +2818124800,2818125823,AR +2818125824,2818126847,BR +2818126848,2818127871,AR +2818127872,2818143231,BR +2818143232,2818144255,MX +2818144256,2818162687,BR +2818162688,2818164735,AR +2818164736,2818165759,BZ +2818165760,2818168831,BR +2818168832,2818169855,AR +2818169856,2818178047,BR +2818178048,2818179071,MX +2818179072,2818180095,BR +2818180096,2818181119,AR +2818181120,2818188287,BR +2818188288,2818189311,PY +2818189312,2818191359,BR +2818191360,2818192383,VE +2818192384,2818193407,CL +2818193408,2818198527,BR +2818198528,2818199551,MX +2818199552,2818206719,BR +2818206720,2818207743,HN +2818207744,2818208767,PA +2818208768,2818209791,AR +2818209792,2818210815,CO +2818210816,2818212863,BR +2818212864,2818213887,CL +2818213888,2818222079,BR +2818222080,2818223103,AR +2818223104,2818225151,BR +2818225152,2818226175,EC +2818226176,2818228223,BR +2818228224,2818229247,CR +2818229248,2818231295,BR +2818231296,2818232319,PE +2818232320,2818233343,AR +2818233344,2818233911,HN +2818233912,2818233919,IT +2818233920,2818234095,HN +2818234096,2818234111,IT +2818234112,2818234367,HN +2818234368,2818235391,BR +2818235392,2818236415,GT +2818236416,2818244607,BR +2818244608,2818310143,US +2818310144,2818375679,AR +2818375680,2818572287,US +2818572288,2818575359,BR +2818575360,2818576383,PE +2818576384,2818586623,BR +2818586624,2818587647,AR +2818587648,2818593791,BR +2818593792,2818594815,SX +2818594816,2818619391,BR +2818619392,2818620415,AR +2818620416,2818623487,BR +2818623488,2818625535,AR +2818625536,2818626559,BR +2818626560,2818626783,HN +2818626784,2818626799,BR +2818626800,2818627583,HN +2818627584,2818628607,BR +2818628608,2818629631,MX +2818629632,2818634751,BR +2818634752,2818635775,CO +2818635776,2818637823,BR +2818637824,2818670591,AU +2818670592,2818670633,US +2818670634,2818670639,AU +2818670640,2818670881,US +2818670882,2818670887,AU +2818670888,2818671423,US +2818671424,2818671439,AU +2818671440,2818671999,US +2818672000,2818672127,AU +2818672128,2818672191,US +2818672192,2818672207,AU +2818672208,2818687299,US +2818687300,2818687303,JP +2818687304,2818687952,US +2818687953,2818687959,AU +2818687960,2818688903,US +2818688904,2818688927,NL +2818688928,2818689479,US +2818689480,2818689487,AU +2818689488,2821932367,US +2821932368,2821932371,NO +2821932372,2822584319,US +2822584320,2822586367,NL +2822586368,2822590463,US +2822590464,2822591629,IE +2822591630,2822591630,US +2822591631,2822602751,IE +2822602752,2822701055,US +2822701056,2822709247,NL +2822709248,2822723583,IE +2822723584,2822724095,US +2822724096,2822724415,SG +2822724416,2822724607,US +2822724608,2822725631,IE +2822725632,2822731894,NL +2822731895,2822731895,GB +2822731896,2822732102,NL +2822732103,2822732103,IE +2822732104,2822733823,NL +2822733824,2822742015,HK +2822742016,2822750207,SG +2822750208,2822758399,HK +2822758400,2822766591,SG +2822766592,2823159807,US +2823159808,2823225343,HK +2823225344,2823553023,US +2823553024,2823618559,ZA +2823618560,2823684095,PA +2823684096,2823749631,KR +2823815168,2823888895,SC +2823888896,2823897087,ZA +2823897088,2823946239,SC +2823946240,2824011775,US +2824011776,2824077311,AR +2824077312,2824404991,US +2824404992,2824470527,ZA +2824470528,2824472575,BR +2824472576,2824473599,AR +2824473600,2824474623,CO +2824474624,2824487935,BR +2824487936,2824488959,MX +2824488960,2824489983,AR +2824489984,2824492031,BR +2824492032,2824493055,AR +2824493056,2824494079,BR +2824494080,2824495103,CO +2824495104,2824495215,HN +2824495216,2824495231,DE +2824495232,2824495263,HN +2824495264,2824495279,DE +2824495280,2824495943,HN +2824495944,2824495951,NL +2824495952,2824496087,HN +2824496088,2824496095,NL +2824496096,2824496127,HN +2824496128,2824498175,BR +2824498176,2824498303,HN +2824498304,2824498319,FR +2824498320,2824498527,HN +2824498528,2824498535,FR +2824498536,2824498895,HN +2824498896,2824498903,UY +2824498904,2824499119,HN +2824499120,2824499127,UY +2824499128,2824499199,HN +2824499200,2824503295,BR +2824503296,2824504319,AR +2824504320,2824510463,BR +2824510464,2824511487,CL +2824511488,2824512511,AR +2824512512,2824515583,BR +2824515584,2824516607,PY +2824516608,2824520703,BR +2824520704,2824521727,HN +2824521728,2824526847,BR +2824526848,2824527871,CL +2824527872,2824529919,BR +2824529920,2824530943,CL +2824530944,2824532991,BR +2824532992,2824533247,DK +2824533248,2824533503,BR +2824533504,2824533631,SE +2824533632,2824533759,NO +2824533760,2824534015,US +2824534016,2824535039,BR +2824535040,2824536063,AR +2824536064,2824798207,US +2824798208,2824863743,TW +2824863744,2824929279,AR +2824929280,2825191423,US +2825191424,2825256959,AR +2825256960,2825519103,US +2825519104,2825584639,HK +2825584640,2826108927,US +2826108928,2826174463,KR +2826174464,2826436607,US +2826436608,2826502143,TH +2826502144,2826510335,BR +2826510336,2826512383,AR +2826512384,2826513407,BR +2826513408,2826515455,PE +2826515456,2826516479,BR +2826516480,2826517503,AR +2826517504,2826518527,MX +2826518528,2826522623,BR +2826522624,2826523647,CL +2826523648,2826524671,SR +2826524672,2826531839,BR +2826531840,2826532863,AR +2826532864,2826534911,BR +2826534912,2826535935,PA +2826535936,2826549247,BR +2826549248,2826550271,UY +2826550272,2826555391,BR +2826555392,2826557439,AR +2826557440,2826558463,BR +2826558464,2826559487,PE +2826559488,2826562559,BR +2826562560,2826563583,PE +2826563584,2826565631,MX +2826565632,2826567679,BR +2826567680,2826633215,US +2826633216,2826698751,GU +2826698752,2826829823,US +2826829824,2826895359,KR +2826895360,2826962943,US +2826962944,2826964991,DE +2826964992,2826969087,US +2826969088,2826971135,AU +2826971136,2826973183,NL +2826973184,2826975231,AU +2826975232,2826977791,ZA +2826977792,2826978047,NL +2826978048,2826985471,ZA +2826985472,2826987519,NZ +2826987520,2826989567,GB +2826989568,2826991615,ZA +2826991616,2826993663,CA +2826993664,2827024895,ZA +2827024896,2827025407,US +2827025408,2827026431,ZA +2827026432,2827091967,US +2827091968,2827157503,AU +2827157504,2827223039,KR +2827223040,2827288575,AU +2827288576,2827354111,US +2827354112,2827419647,AU +2827419648,2827681791,US +2827681792,2827747327,TR +2827747328,2827812863,AU +2827812864,2827878399,US +2827878400,2827943935,ZA +2827943936,2828009471,US +2828009472,2828075007,CA +2828075008,2828533759,US +2828533760,2828599551,AU +2828599552,2828599807,IN +2828599808,2828626687,AU +2828626688,2828627711,US +2828627712,2828627967,AU +2828627968,2828628223,PH +2828628224,2828664831,AU +2828664832,2828730367,KR +2828730368,2828795903,ZA +2828795904,2829029375,US +2829029376,2829029631,CN +2829029632,2829041663,US +2829041664,2829045759,AU +2829045760,2829058047,US +2829058048,2829123583,CN +2829123584,2829148415,US +2829148416,2829148671,HK +2829148672,2829174783,US +2829174784,2829175807,GB +2829175808,2829184767,US +2829184768,2829185023,GB +2829185024,2829254655,US +2829254656,2829320191,CH +2829320192,2829385727,ZA +2829385728,2829451263,MX +2829451264,2829516799,US +2829516800,2829582335,BW +2829582336,2829593343,US +2829593344,2829593591,CH +2829593592,2829593595,US +2829593596,2829593599,CH +2829593600,2829844479,US +2829844480,2829910015,ZA +2829910016,2830106623,US +2830106624,2830172159,CO +2830172160,2830434303,US +2830434304,2830436351,BR +2830436352,2830437375,PE +2830437376,2830440447,BR +2830440448,2830441471,AR +2830441472,2830445567,BR +2830445568,2830446591,AR +2830446592,2830447615,BR +2830447616,2830447647,HN +2830447648,2830447655,US +2830447656,2830448639,HN +2830448640,2830452735,BR +2830452736,2830453759,AR +2830453760,2830454783,MX +2830454784,2830457855,BR +2830457856,2830458879,MX +2830458880,2830459903,BR +2830459904,2830460927,MX +2830460928,2830465023,BR +2830465024,2830466047,HN +2830466048,2830475263,BR +2830475264,2830476287,CR +2830476288,2830479359,BR +2830479360,2830480383,AR +2830480384,2830481407,BR +2830481408,2830482431,AR +2830482432,2830486527,BR +2830486528,2830488575,AR +2830488576,2830492671,BR +2830492672,2830492799,HN +2830492800,2830492815,UY +2830492816,2830492895,HN +2830492896,2830492927,UY +2830492928,2830492935,US +2830492936,2830493695,HN +2830493696,2830499839,BR +2830499840,2830761983,US +2830761984,2830827519,AU +2830827520,2830893055,KW +2830893056,2830958591,KR +2830958592,2831155575,US +2831155576,2831155576,SG +2831155577,2831286271,US +2831286272,2831287295,MX +2831287296,2831294463,BR +2831294464,2831295487,AR +2831295488,2831299583,BR +2831299584,2831300607,AR +2831300608,2831304703,BR +2831304704,2831305727,GT +2831305728,2831308799,BR +2831308800,2831309823,MX +2831309824,2831311871,BR +2831311872,2831312895,PE +2831312896,2831313919,BR +2831313920,2831314943,VE +2831314944,2831322111,BR +2831322112,2831323135,AR +2831323136,2831324159,BR +2831324160,2831325183,EC +2831325184,2831329279,BR +2831329280,2831330303,CL +2831330304,2831332351,BR +2831332352,2831333375,AR +2831333376,2831336447,BR +2831336448,2831337471,CL +2831337472,2831338495,BR +2831338496,2831339519,AR +2831339520,2831341567,BR +2831341568,2831342591,AR +2831342592,2831345663,BR +2831345664,2831346687,AR +2831346688,2831347711,BR +2831347712,2831348735,PY +2831348736,2831361023,BR +2831361024,2831362047,AR +2831362048,2831365119,BR +2831365120,2831367167,AR +2831367168,2831368191,CL +2831368192,2831371263,BR +2831371264,2831371999,BZ +2831372000,2831372015,GB +2831372016,2831372287,BZ +2831372288,2831379455,BR +2831379456,2831380479,AR +2831380480,2831381503,BR +2831381504,2831382527,AR +2831382528,2831383551,TT +2831383552,2831384575,CR +2831384576,2831385599,CL +2831385600,2831398911,BR +2831398912,2831399935,AR +2831399936,2831403007,BR +2831403008,2831405055,MX +2831405056,2831407103,BR +2831407104,2831408127,SR +2831408128,2831409151,BR +2831409152,2831410175,PY +2831410176,2831417343,BR +2831417344,2831418367,AR +2831418368,2831423487,BR +2831423488,2831424511,AR +2831424512,2831425535,BR +2831425536,2831426559,AR +2831426560,2831446015,BR +2831446016,2831447039,AR +2831447040,2831449087,BR +2831449088,2831450111,DO +2831450112,2831453183,BR +2831453184,2831454207,AR +2831454208,2831457279,BR +2831457280,2831458303,AR +2831458304,2831464447,BR +2831464448,2831465471,CL +2831465472,2831468543,BR +2831468544,2831469567,CL +2831469568,2831474687,BR +2831474688,2831475711,AR +2831475712,2831476735,CL +2831476736,2831477759,BR +2831477760,2831478167,HN +2831478168,2831478175,US +2831478176,2831479807,HN +2831479808,2831480831,AR +2831480832,2831481855,BR +2831481856,2831482879,AR +2831482880,2831493119,BR +2831493120,2831494143,MX +2831494144,2831496191,AR +2831496192,2831500287,BR +2831500288,2831501311,CO +2831501312,2831505407,BR +2831505408,2831506431,CL +2831506432,2831507455,BR +2831507456,2831508479,CR +2831508480,2831509503,HT +2831509504,2831510527,BR +2831510528,2831511551,SX +2831511552,2831513599,BR +2831513600,2831515647,MX +2831515648,2831516671,BR +2831516672,2831517695,CR +2831517696,2831524863,BR +2831524864,2831525887,AR +2831525888,2831526911,BR +2831526912,2831527935,HN +2831527936,2831528959,BR +2831528960,2831529983,CL +2831529984,2831531007,BR +2831531008,2831531135,EC +2831531136,2831531263,GT +2831531264,2831531519,EC +2831531520,2831531775,PA +2831531776,2831532031,EC +2831532032,2831533055,BR +2831533056,2831535103,AR +2831535104,2831536127,BR +2831536128,2831537151,BZ +2831537152,2831538175,BR +2831538176,2831539199,AR +2831539200,2831544319,BR +2831544320,2831545343,BO +2831545344,2831546367,BR +2831546368,2831547391,AR +2831547392,2831548415,BR +2831548416,2831613951,AU +2831613952,2831810559,US +2831810560,2831876095,IT +2831876096,2832007167,US +2832007168,2832008191,AR +2832008192,2832009215,BR +2832009216,2832010239,PA +2832010240,2832023551,BR +2832023552,2832024575,CR +2832024576,2832025599,BR +2832025600,2832025903,HN +2832025904,2832025919,DE +2832025920,2832026015,HN +2832026016,2832026031,DE +2832026032,2832026623,HN +2832026624,2832030719,BR +2832030720,2832031743,AR +2832031744,2832032767,BO +2832032768,2832036863,BR +2832036864,2832038911,AR +2832038912,2832040959,BR +2832040960,2832041983,PE +2832041984,2832048127,BR +2832048128,2832049151,HN +2832049152,2832054271,BR +2832054272,2832055295,AR +2832055296,2832059391,BR +2832059392,2832060415,CL +2832060416,2832072703,BR +2832072704,2832138239,ZA +2832138240,2832269311,US +2832269312,2832400383,ZA +2832400384,2832793599,US +2832793600,2832859135,AU +2832859136,2832924671,US +2832924672,2832990207,KR +2832990208,2833383423,US +2833383424,2833448959,AR +2833448960,2833449983,CO +2833449984,2833451007,AR +2833451008,2833454079,BR +2833454080,2833455103,SV +2833455104,2833456127,AR +2833456128,2833458175,BR +2833458176,2833459199,MX +2833459200,2833466367,BR +2833466368,2833467391,MX +2833467392,2833473535,BR +2833473536,2833474559,AR +2833474560,2833475583,BR +2833475584,2833476607,CO +2833476608,2833481727,BR +2833481728,2833482679,HN +2833482680,2833482687,CL +2833482688,2833482751,HN +2833482752,2833484799,BR +2833484800,2833485519,US +2833485520,2833485527,BE +2833485528,2833485823,US +2833485824,2833486847,AR +2833486848,2833501183,BR +2833501184,2833502207,AR +2833502208,2833511423,BR +2833511424,2833512447,CO +2833512448,2833513471,BR +2833513472,2833514495,AR +2833514496,2833525759,BR +2833525760,2833526639,HN +2833526640,2833526655,FR +2833526656,2833526783,HN +2833526784,2833527807,CR +2833527808,2833528831,MX +2833528832,2833529855,AR +2833529856,2833542143,BR +2833542144,2833543167,CO +2833543168,2833546239,BR +2833546240,2833547263,CO +2833547264,2833548287,BR +2833548288,2833549311,BO +2833549312,2833550335,BR +2833550336,2833552383,AR +2833552384,2833563647,BR +2833563648,2833564671,HN +2833564672,2833571839,BR +2833571840,2833572863,AR +2833572864,2833573887,BR +2833573888,2833574911,DO +2833574912,2833577983,BR +2833577984,2833579007,CL +2833579008,2833580031,BR +2833580032,2833707007,US +2833707008,2833707263,GB +2833707264,2833711103,US +2833711104,2833776639,CL +2833776640,2833783807,BR +2833783808,2833784831,CR +2833784832,2833785855,CL +2833785856,2833786879,SV +2833786880,2833788927,BR +2833788928,2833789951,SV +2833789952,2833796095,BR +2833796096,2833797119,GT +2833797120,2833799167,BR +2833799168,2833800191,AR +2833800192,2833801215,BR +2833801216,2833804287,AR +2833804288,2833805311,DO +2833805312,2833812479,BR +2833812480,2833813503,AR +2833813504,2833814527,GY +2833814528,2833818623,BR +2833818624,2833819647,CL +2833819648,2833820671,HN +2833820672,2833840127,BR +2833840128,2833841151,AR +2833841152,2833842175,BR +2833842176,2833907711,US +2833907712,2833973247,GT +2833973248,2833992901,US +2833992902,2833992902,MX +2833992903,2834010111,US +2834010112,2834014207,CA +2834014208,2834030591,US +2834030592,2834034687,CA +2834034688,2834497535,US +2834497536,2834563071,SV +2834563072,2834661887,US +2834661888,2834662399,CA +2834662400,2834668799,US +2834668800,2834669055,CA +2834669056,2834676735,US +2834676736,2834677759,SG +2834677760,2834678783,US +2834678784,2834679295,ES +2834679296,2834679807,CA +2834679808,2834681599,US +2834681600,2834681855,CA +2834681856,2834689535,US +2834689536,2834694143,CA +2834694144,2834825215,US +2834825216,2834956287,KR +2834956288,2835087359,US +2835087360,2835152895,AU +2835152896,2835161087,LR +2835161088,2835169279,ZW +2835169280,2835177471,ZA +2835177472,2835181567,DZ +2835181568,2835183615,NG +2835183616,2835185663,ZA +2835185664,2835196927,RE +2835196928,2835197695,YT +2835197696,2835202047,RE +2835202048,2835206143,ZA +2835206144,2835208191,NG +2835208192,2835210239,ZA +2835210240,2835218431,MW +2835218432,2835283967,US +2835283968,2835349503,MX +2835349504,2835415445,ZA +2835415446,2835415446,US +2835415447,2835480575,ZA +2835480576,2837446655,US +2837446656,2837839871,CH +2837839872,2837856255,US +2837856256,2837872639,IN +2837872640,2837905407,US +2837905408,2837970943,CH +2837970944,2838036479,US +2838036480,2838233087,CH +2838233088,2838237183,GB +2838237184,2838255167,US +2838255168,2838255199,JP +2838255200,2838260095,US +2838260096,2838260127,IE +2838260128,2838261759,US +2838261760,2838265855,GB +2838265856,2838276159,US +2838276160,2838276191,NL +2838276192,2838284303,US +2838284304,2838284319,IL +2838284320,2838298623,US +2838298624,2838298655,NL +2838298656,2838298687,US +2838298688,2838299439,NL +2838299440,2838299455,US +2838299456,2838299695,NL +2838299696,2838299775,US +2838299776,2838300335,NL +2838300336,2838300351,US +2838300352,2838300511,NL +2838300512,2838300543,US +2838300544,2838300671,NL +2838300672,2838300927,US +2838300928,2838301119,NL +2838301120,2838301183,US +2838301184,2838301191,NL +2838301192,2838301199,US +2838301200,2838301695,NL +2838301696,2838301951,US +2838301952,2838304127,NL +2838304128,2838304159,US +2838304160,2838304319,NL +2838304320,2838304383,US +2838304384,2838304479,NL +2838304480,2838304511,US +2838304512,2838304703,NL +2838304704,2838304767,US +2838304768,2838305119,NL +2838305120,2838305151,US +2838305152,2838305247,NL +2838305248,2838305279,US +2838305280,2838305647,NL +2838305648,2838305727,US +2838305728,2838307295,NL +2838307296,2838307303,US +2838307304,2838307311,NL +2838307312,2838307327,US +2838307328,2838307647,NL +2838307648,2838307679,US +2838307680,2838307903,NL +2838307904,2838307935,US +2838307936,2838308175,NL +2838308176,2838308183,US +2838308184,2838308191,NL +2838308192,2838308223,US +2838308224,2838308255,NL +2838308256,2838308271,US +2838308272,2838315007,NL +2838315008,2838331391,US +2838331392,2838331535,NL +2838331536,2838331551,US +2838331552,2838331567,NL +2838331568,2838331583,US +2838331584,2838331711,NL +2838331712,2838331727,US +2838331728,2838332879,NL +2838332880,2838332895,US +2838332896,2838333651,NL +2838333652,2838333654,US +2838333655,2838333655,NL +2838333656,2838333658,US +2838333659,2838333659,NL +2838333660,2838333661,US +2838333662,2838333903,NL +2838333904,2838333919,US +2838333920,2838334335,NL +2838334336,2838334351,US +2838334352,2838337279,NL +2838337280,2838337295,US +2838337296,2838337759,NL +2838337760,2838337761,IN +2838337762,2838337763,US +2838337764,2838338111,NL +2838338112,2838338127,US +2838338128,2838338271,NL +2838338272,2838338303,JP +2838338304,2838338567,NL +2838338568,2838338575,US +2838338576,2838338703,NL +2838338704,2838338719,IN +2838338720,2838338771,NL +2838338772,2838338773,IN +2838338774,2838338783,US +2838338784,2838338815,NL +2838338816,2838338823,US +2838338824,2838339743,NL +2838339744,2838339759,US +2838339760,2838339855,NL +2838339856,2838339871,US +2838339872,2838340015,NL +2838340016,2838340031,US +2838340032,2838340351,NL +2838340352,2838340383,US +2838340384,2838340431,NL +2838340432,2838340463,US +2838340464,2838340719,NL +2838340720,2838340735,US +2838340736,2838340959,NL +2838340960,2838340991,US +2838340992,2838341151,NL +2838341152,2838341167,US +2838341168,2838341903,NL +2838341904,2838341919,US +2838341920,2838341951,NL +2838341952,2838341967,US +2838341968,2838342303,NL +2838342304,2838342319,US +2838342320,2838342879,NL +2838342880,2838342895,US +2838342896,2838343071,NL +2838343072,2838343103,US +2838343104,2838344319,NL +2838344320,2838344335,US +2838344336,2838344451,NL +2838344452,2838344455,US +2838344456,2838344463,NL +2838344464,2838344479,US +2838344480,2838344917,NL +2838344918,2838344918,US +2838344919,2838344919,NL +2838344920,2838344927,US +2838344928,2838345215,NL +2838345216,2838345231,US +2838345232,2838345239,NL +2838345240,2838345247,US +2838345248,2838345743,NL +2838345744,2838345751,US +2838345752,2838345759,NL +2838345760,2838345775,US +2838345776,2838346559,NL +2838346560,2838346591,US +2838346592,2838346687,NL +2838346688,2838346719,US +2838346720,2838347031,NL +2838347032,2838347039,US +2838347040,2838347487,NL +2838347488,2838347519,US +2838347520,2838348031,NL +2838348032,2838396927,US +2838396928,2838397007,NL +2838397008,2838397023,US +2838397024,2838397071,NL +2838397072,2838397087,US +2838397088,2838397247,NL +2838397248,2838397279,JP +2838397280,2838397311,NL +2838397312,2838397343,US +2838397344,2838397935,NL +2838397936,2838397951,US +2838397952,2838398575,NL +2838398576,2838398591,US +2838398592,2838400191,NL +2838400192,2838400195,US +2838400196,2838400703,NL +2838400704,2838400735,US +2838400736,2838400895,NL +2838400896,2838400959,US +2838400960,2838401023,NL +2838401024,2838405119,GB +2838405120,2838405183,NL +2838405184,2838405215,US +2838405216,2838405767,NL +2838405768,2838405775,US +2838405776,2838405855,NL +2838405856,2838405887,US +2838405888,2838406087,NL +2838406088,2838406095,US +2838406096,2838406271,NL +2838406272,2838406279,US +2838406280,2838406577,NL +2838406578,2838406578,US +2838406579,2838406687,NL +2838406688,2838406703,US +2838406704,2838407103,NL +2838407104,2838407119,US +2838407120,2838407863,NL +2838407864,2838407871,US +2838407872,2838409439,NL +2838409440,2838409471,US +2838409472,2838409479,NL +2838409480,2838409503,US +2838409504,2838409599,NL +2838409600,2838409615,US +2838409616,2838409871,NL +2838409872,2838409879,US +2838409880,2838410367,NL +2838410368,2838410399,US +2838410400,2838410895,NL +2838410896,2838410911,US +2838410912,2838411327,NL +2838411328,2838411359,US +2838411360,2838414207,NL +2838414208,2838414271,US +2838414272,2838414783,NL +2838414784,2838414911,US +2838414912,2838415167,NL +2838415168,2838415183,US +2838415184,2838415391,NL +2838415392,2838415487,US +2838415488,2838415655,NL +2838415656,2838415663,US +2838415664,2838415839,NL +2838415840,2838415871,US +2838415872,2838416623,NL +2838416624,2838416639,AF +2838416640,2838417119,NL +2838417120,2838417151,US +2838417152,2838419455,NL +2838419456,2838420479,CA +2838420480,2838421503,NL +2838421504,2838421567,US +2838421568,2838422527,NL +2838422528,2838423551,CA +2838423552,2838429695,NL +2838429696,2838469631,US +2838469632,2838478975,NL +2838478976,2838479007,US +2838479008,2838479207,NL +2838479208,2838479215,US +2838479216,2838479431,NL +2838479432,2838479439,US +2838479440,2838479455,NL +2838479456,2838479487,US +2838479488,2838479807,NL +2838479808,2838479823,US +2838479824,2838480319,NL +2838480320,2838480323,IE +2838480324,2838481855,NL +2838481856,2838481887,US +2838481888,2838482305,NL +2838482306,2838482307,US +2838482308,2838482383,NL +2838482384,2838482399,US +2838482400,2838482547,NL +2838482548,2838482551,US +2838482552,2838482695,NL +2838482696,2838482703,US +2838482704,2838482959,NL +2838482960,2838482967,IE +2838482968,2838482975,US +2838482976,2838482991,NL +2838482992,2838483007,US +2838483008,2838483011,NL +2838483012,2838483015,IE +2838483016,2838483087,NL +2838483088,2838483103,US +2838483104,2838483135,NL +2838483136,2838483199,IE +2838483200,2838483327,NL +2838483328,2838483335,US +2838483336,2838483487,NL +2838483488,2838483519,US +2838483520,2838484839,NL +2838484840,2838484843,US +2838484844,2838485151,NL +2838485152,2838485183,US +2838485184,2838485695,NL +2838485696,2838485727,US +2838485728,2838486463,NL +2838486464,2838486495,US +2838486496,2838486567,NL +2838486568,2838486575,US +2838486576,2838486583,NL +2838486584,2838486591,US +2838486592,2838487327,NL +2838487328,2838487343,US +2838487344,2838487743,NL +2838487744,2838487807,US +2838487808,2838488663,NL +2838488664,2838488671,US +2838488672,2838488943,NL +2838488944,2838488959,US +2838488960,2838489999,NL +2838490000,2838490007,US +2838490008,2838491943,NL +2838491944,2838491951,US +2838491952,2838492479,NL +2838492480,2838492511,US +2838492512,2838492679,NL +2838492680,2838492687,US +2838492688,2838492959,NL +2838492960,2838492967,US +2838492968,2838493711,NL +2838493712,2838493727,US +2838493728,2838494655,NL +2838494656,2838494671,US +2838494672,2838511871,NL +2838511872,2838511903,US +2838511904,2838511935,NL +2838511936,2838511951,JP +2838511952,2838511983,NL +2838511984,2838511999,JP +2838512000,2838512047,NL +2838512048,2838512079,US +2838512080,2838512151,NL +2838512152,2838512159,US +2838512160,2838512255,NL +2838512256,2838512271,US +2838512272,2838512303,NL +2838512304,2838512319,US +2838512320,2838512351,NL +2838512352,2838512367,AF +2838512368,2838512527,NL +2838512528,2838512543,US +2838512544,2838512639,NL +2838512640,2838512675,US +2838512676,2838512703,NL +2838512704,2838512705,US +2838512706,2838512727,NL +2838512728,2838512735,US +2838512736,2838512751,NL +2838512752,2838512759,US +2838512760,2838512831,NL +2838512832,2838512847,US +2838512848,2838512879,NL +2838512880,2838512895,US +2838512896,2838513199,NL +2838513200,2838513215,US +2838513216,2838513295,NL +2838513296,2838513311,US +2838513312,2838513343,NL +2838513344,2838513347,US +2838513348,2838513487,NL +2838513488,2838513503,US +2838513504,2838513583,NL +2838513584,2838513599,US +2838513600,2838513807,NL +2838513808,2838513871,US +2838513872,2838513983,NL +2838513984,2838513999,US +2838514000,2838514071,NL +2838514072,2838514111,US +2838514112,2838514248,NL +2838514249,2838514251,US +2838514252,2838514287,NL +2838514288,2838514303,US +2838514304,2838514399,NL +2838514400,2838514431,JP +2838514432,2838514511,NL +2838514512,2838514527,US +2838514528,2838514767,NL +2838514768,2838514783,US +2838514784,2838515087,NL +2838515088,2838515103,BR +2838515104,2838515295,NL +2838515296,2838515327,US +2838515328,2838515391,NL +2838515392,2838515455,US +2838515456,2838515543,NL +2838515544,2838515551,US +2838515552,2838515647,NL +2838515648,2838515663,US +2838515664,2838519807,NL +2838519808,2838519823,US +2838519824,2838519935,NL +2838519936,2838520063,US +2838520064,2838520071,NL +2838520072,2838520079,US +2838520080,2838520805,NL +2838520806,2838520807,US +2838520808,2838520831,NL +2838520832,2838522879,US +2838522880,2838522895,NL +2838522896,2838522911,US +2838522912,2838523111,NL +2838523112,2838523119,US +2838523120,2838523391,NL +2838523392,2838523423,US +2838523424,2838523615,NL +2838523616,2838523663,US +2838523664,2838523679,NL +2838523680,2838523711,JP +2838523712,2838523967,NL +2838523968,2838524031,JP +2838524032,2838524191,NL +2838524192,2838524223,AF +2838524224,2838524431,NL +2838524432,2838524447,US +2838524448,2838524631,NL +2838524632,2838524655,US +2838524656,2838524735,NL +2838524736,2838524799,US +2838524800,2838525999,NL +2838526000,2838526015,US +2838526016,2838526151,NL +2838526152,2838526159,US +2838526160,2838526639,NL +2838526640,2838526655,US +2838526656,2838526983,NL +2838526984,2838526991,US +2838526992,2838527055,NL +2838527056,2838527071,US +2838527072,2838527223,NL +2838527224,2838527231,US +2838527232,2838527279,NL +2838527280,2838527295,US +2838527296,2838527391,NL +2838527392,2838527407,US +2838527408,2838527439,NL +2838527440,2838527455,US +2838527456,2838527535,NL +2838527536,2838527551,US +2838527552,2838527615,NL +2838527616,2838527631,US +2838527632,2838527695,NL +2838527696,2838527711,US +2838527712,2838528279,NL +2838528280,2838528287,US +2838528288,2838528319,NL +2838528320,2838528335,US +2838528336,2838530095,NL +2838530096,2838530111,US +2838530112,2838530271,NL +2838530272,2838530287,US +2838530288,2838530407,NL +2838530408,2838530415,US +2838530416,2838530527,NL +2838530528,2838530559,US +2838530560,2838531367,NL +2838531368,2838531375,US +2838531376,2838536207,NL +2838536208,2838536239,US +2838536240,2838537375,NL +2838537376,2838537407,US +2838537408,2838537863,NL +2838537864,2838537871,US +2838537872,2838538063,NL +2838538064,2838538079,US +2838538080,2838538319,NL +2838538320,2838538327,US +2838538328,2838538559,NL +2838538560,2838538591,US +2838538592,2838540111,NL +2838540112,2838540119,US +2838540120,2838540367,NL +2838540368,2838540383,US +2838540384,2838540551,NL +2838540552,2838540575,US +2838540576,2838540687,NL +2838540688,2838540703,US +2838540704,2838541807,NL +2838541808,2838541823,US +2838541824,2838542047,NL +2838542048,2838542063,US +2838542064,2838542095,NL +2838542096,2838542111,US +2838542112,2838542247,NL +2838542248,2838542255,US +2838542256,2838542271,NL +2838542272,2838542303,US +2838542304,2838542767,NL +2838542768,2838542783,US +2838542784,2838543223,NL +2838543224,2838543231,US +2838543232,2838543623,NL +2838543624,2838543631,US +2838543632,2838543759,NL +2838543760,2838543775,US +2838543776,2838543855,NL +2838543856,2838543871,US +2838543872,2838544575,NL +2838544576,2838544607,US +2838544608,2838544655,NL +2838544656,2838544671,US +2838544672,2838544703,NL +2838544704,2838544767,US +2838544768,2838544839,NL +2838544840,2838544847,US +2838544848,2838545279,NL +2838545280,2838545295,US +2838545296,2838545407,NL +2838545408,2838546431,US +2838546432,2838546815,NL +2838546816,2838546817,US +2838546818,2838546819,NL +2838546820,2838546823,US +2838546824,2838547231,NL +2838547232,2838547263,US +2838547264,2838547343,NL +2838547344,2838547359,US +2838547360,2838547743,NL +2838547744,2838547775,US +2838547776,2838547807,NL +2838547808,2838547823,US +2838547824,2838548359,NL +2838548360,2838548367,US +2838548368,2838549119,NL +2838549120,2838549135,US +2838549136,2838549407,NL +2838549408,2838549415,US +2838549416,2838549855,NL +2838549856,2838549887,US +2838549888,2838550111,NL +2838550112,2838550159,US +2838550160,2838550719,NL +2838550720,2838550799,US +2838550800,2838550855,NL +2838550856,2838550863,US +2838550864,2838560767,NL +2838560768,2838626303,CH +2838626304,2838626399,US +2838626400,2838626431,SA +2838626432,2838626575,US +2838626576,2838626591,CN +2838626592,2838627631,US +2838627632,2838627647,CN +2838627648,2838628319,US +2838628320,2838628351,DE +2838628352,2838631367,US +2838631368,2838631375,SA +2838631376,2838631423,US +2838631424,2838631431,CN +2838631432,2838631871,US +2838631872,2838631903,DE +2838631904,2838631935,SA +2838631936,2838631967,US +2838631968,2838631999,DE +2838632000,2838632095,US +2838632096,2838632127,DE +2838632128,2838633295,US +2838633296,2838633311,SA +2838633312,2838634047,US +2838634048,2838634111,DE +2838634112,2838636095,US +2838636096,2838636111,HU +2838636112,2838641351,US +2838641352,2838641359,SE +2838641360,2838641831,US +2838641832,2838641839,IT +2838641840,2838642239,US +2838642240,2838642303,DE +2838642304,2838642575,US +2838642576,2838642583,IT +2838642584,2838642623,US +2838642624,2838642639,CN +2838642640,2838642719,US +2838642720,2838642723,AE +2838642724,2838643407,US +2838643408,2838643408,GB +2838643409,2838643487,US +2838643488,2838643519,HK +2838643520,2838643696,US +2838643697,2838643697,GB +2838643698,2838644943,US +2838644944,2838644951,AE +2838644952,2838645839,US +2838645840,2838645871,GB +2838645872,2838646191,US +2838646192,2838646239,GB +2838646240,2838647103,US +2838647104,2838647111,AE +2838647112,2838647807,US +2838647808,2838647839,GB +2838647840,2838650527,US +2838650528,2838650559,GB +2838650560,2838653631,US +2838653632,2838653639,GB +2838653640,2838657295,US +2838657296,2838657299,AE +2838657300,2838658181,US +2838658182,2838658182,GB +2838658183,2838658607,US +2838658608,2838658623,NL +2838658624,2838659007,US +2838659008,2838659023,GB +2838659024,2838659431,US +2838659432,2838659439,GB +2838659440,2838661759,US +2838661760,2838661791,NL +2838661792,2838663167,US +2838663168,2838663175,NL +2838663176,2838664167,US +2838664168,2838664175,VN +2838664176,2838665759,US +2838665760,2838665791,JP +2838665792,2838669519,US +2838669520,2838669535,NL +2838669536,2838672007,US +2838672008,2838672015,RO +2838672016,2838683615,US +2838683616,2838683631,CN +2838683632,2838683887,US +2838683888,2838683903,GH +2838683904,2838700063,US +2838700064,2838700079,GR +2838700080,2838700751,US +2838700752,2838700767,RO +2838700768,2838708223,US +2838708224,2838724607,NO +2838724608,2838757375,US +2838757376,2838822911,CH +2838822912,2838840095,US +2838840096,2838840127,HK +2838840128,2838843295,US +2838843296,2838843327,HK +2838843328,2838859777,US +2838859778,2838859779,HK +2838859780,2838865007,US +2838865008,2838865015,CA +2838865016,2838865019,US +2838865020,2838865023,CA +2838865024,2838866247,US +2838866248,2838866255,CA +2838866256,2838867855,US +2838867856,2838867863,CA +2838867864,2838871295,US +2838871296,2838871311,CA +2838871312,2838871327,US +2838871328,2838871343,CA +2838871344,2838871503,US +2838871504,2838871511,CA +2838871512,2838881055,US +2838881056,2838881087,AT +2838881088,2838881407,US +2838881408,2838881423,IN +2838881424,2838887271,US +2838887272,2838887279,IN +2838887280,2838887871,US +2838887872,2838887887,EC +2838887888,2838904831,US +2838904832,2838921215,CA +2838921216,2838924687,US +2838924688,2838924703,HK +2838924704,2838930495,US +2838930496,2838930511,HK +2838930512,2838931007,US +2838931008,2838931012,CZ +2838931013,2838931013,US +2838931014,2838931015,CZ +2838931016,2838931016,US +2838931017,2838931023,CZ +2838931024,2838933919,US +2838933920,2838933951,NL +2838933952,2838937743,US +2838937744,2838937759,ZA +2838937760,2838938991,US +2838938992,2838939007,AU +2838939008,2838946431,US +2838946432,2838946447,KE +2838946448,2838946735,US +2838946736,2838946751,CA +2838946752,2838957535,US +2838957536,2838957551,HK +2838957552,2838960815,US +2838960816,2838960819,CZ +2838960820,2838960821,US +2838960822,2838960827,CZ +2838960828,2838960829,US +2838960830,2838960831,CZ +2838960832,2838968671,US +2838968672,2838968687,CN +2838968688,2838969167,US +2838969168,2838969183,AF +2838969184,2838969456,US +2838969457,2838969457,HK +2838969458,2838969535,US +2838969536,2838969536,IL +2838969537,2838969587,US +2838969588,2838969588,AF +2838969589,2838969591,US +2838969592,2838969592,HK +2838969593,2838969710,US +2838969711,2838969711,HK +2838969712,2838969737,US +2838969738,2838969738,ES +2838969739,2838969814,US +2838969815,2838969815,JP +2838969816,2838969828,US +2838969829,2838969829,NL +2838969830,2838969903,US +2838969904,2838969904,NL +2838969905,2838988639,US +2838988640,2838988671,CA +2838988672,2838988687,US +2838988688,2838988703,CA +2838988704,2838989671,US +2838989672,2838989679,CA +2838989680,2838989727,US +2838989728,2838989743,CA +2838989744,2838990719,US +2838990720,2838990751,CA +2838990752,2838991055,US +2838991056,2838991071,CA +2838991072,2838996063,US +2838996064,2838996095,HK +2838996096,2838999087,US +2838999088,2838999103,CA +2838999104,2838999407,US +2838999408,2838999423,AF +2838999424,2839001263,US +2839001264,2839001279,CA +2839001280,2839019687,US +2839019688,2839019695,JP +2839019696,2839021219,US +2839021220,2839021222,JP +2839021223,2839021223,US +2839021224,2839021226,JP +2839021227,2839021227,US +2839021228,2839021230,JP +2839021231,2839021231,US +2839021232,2839021234,JP +2839021235,2839021235,US +2839021236,2839021238,JP +2839021239,2839021239,US +2839021240,2839021242,JP +2839021243,2839035903,US +2839035904,2839052287,KR +2839052288,2839085055,US +2839085056,2839117823,MX +2839117824,2839150591,BR +2839150592,2839297023,US +2839297024,2839298047,CA +2839298048,2839300031,US +2839300032,2839300047,AF +2839300048,2839315471,US +2839315472,2839315487,JP +2839315488,2839363903,US +2839363904,2839363911,AU +2839363912,2840015359,US +2840015360,2840015615,GB +2840015616,2843803647,US +2843803648,2843869183,ZA +2843869184,2844524543,US +2844524544,2844590079,KR +2844590080,2844862975,US +2844862976,2844863231,CA +2844863232,2845114367,US +2845114368,2845179903,IN +2845179904,2845704191,US +2845704192,2845769727,CU +2845769728,2845786111,GA +2845786112,2845802495,NG +2845802496,2845822975,ZA +2845822976,2845827071,CD +2845827072,2845835263,ZA +2845835264,2848211967,US +2848211968,2848212223,HK +2848212224,2848212991,US +2848212992,2848215039,GB +2848215040,2848244735,US +2848244736,2848245759,GB +2848245760,2848522239,US +2848587776,2848653311,ZA +2848653312,2848980991,US +2848980992,2850029567,KR +2850029568,2851012607,US +2851012608,2851013631,TZ +2851013632,2851015679,ZA +2851015680,2851016703,CV +2851016704,2851017727,NG +2851017728,2851018751,SC +2851018752,2851019775,ZW +2851019776,2851020799,ZA +2851020800,2851021823,AO +2851021824,2851022847,EG +2851022848,2851023871,CM +2851023872,2851024895,ZA +2851024896,2851025919,NG +2851025920,2851026943,GH +2851026944,2851027967,NG +2851027968,2851028991,ZA +2851028992,2851030015,CI +2851030016,2851031039,ZA +2851031040,2851032063,CD +2851032064,2851033087,AO +2851033088,2851035135,ZA +2851035136,2851036159,UG +2851036160,2851037183,LY +2851037184,2851038207,CF +2851038208,2851039231,ML +2851039232,2851040255,MZ +2851040256,2851041279,AO +2851041280,2851042303,GQ +2851042304,2851043327,LY +2851043328,2851044351,TD +2851044352,2851046399,ZA +2851046400,2851047423,AO +2851047424,2851048447,SN +2851048448,2851049471,MU +2851049472,2851050495,MZ +2851050496,2851051519,GA +2851051520,2851052543,ZA +2851052544,2851053567,CD +2851053568,2851054591,KE +2851054592,2851055615,ZA +2851055616,2851057663,KE +2851057664,2851060735,ZA +2851060736,2851062783,NG +2851062784,2851063807,SL +2851063808,2851064319,FR +2851064320,2851064575,SC +2851064576,2851064831,FR +2851064832,2851065855,SC +2851065856,2851066879,ZA +2851066880,2851067903,CD +2851067904,2851071999,ZA +2851072000,2851074047,NG +2851074048,2851075071,ZA +2851075072,2851076095,SL +2851076096,2851077119,GH +2851077120,2851078143,KE +2851078144,2851995647,US +2852061184,2852062207,ZA +2852062208,2852063231,CM +2852063232,2852064255,KE +2852064256,2852065279,ZA +2852065280,2852066303,GH +2852066304,2852067327,ZA +2852067328,2852068351,SS +2852068352,2852071423,ZA +2852071424,2852072447,NG +2852072448,2852073471,ZA +2852073472,2852074495,TZ +2852074496,2852075519,MW +2852075520,2852075775,ZA +2852075776,2852076031,NG +2852076032,2852077567,ZA +2852077568,2852078591,CD +2852078592,2852079615,TN +2852079616,2852080639,CG +2852080640,2852081663,ZA +2852081664,2852082687,BW +2852082688,2852083711,EG +2852083712,2852084735,AO +2852084736,2852085759,TN +2852085760,2852086783,KE +2852086784,2852087807,SD +2852087808,2852088831,KE +2852088832,2852089855,LY +2852089856,2852090879,TZ +2852090880,2852091903,ZA +2852091904,2852092671,CD +2852092672,2852092927,CG +2852092928,2852093951,NG +2852093952,2852094975,ZA +2852094976,2852095999,MZ +2852096000,2852097023,SS +2852097024,2852098047,NG +2852098048,2852099071,ZA +2852099072,2852100095,GA +2852100096,2852101119,TD +2852101120,2852102143,LY +2852102144,2852103167,MU +2852103168,2852106239,ZA +2852106240,2852107263,MA +2852107264,2852108287,NG +2852108288,2852109311,TZ +2852109312,2852110335,CD +2852110336,2852111103,ZA +2852111104,2852111359,NG +2852111360,2852112383,ZA +2852112384,2852113407,KE +2852113408,2852114431,CD +2852114432,2852115455,NG +2852115456,2852116479,KE +2852116480,2852118527,ZA +2852118528,2852119551,NG +2852119552,2852121599,ZA +2852121600,2852122623,NG +2852122624,2852126719,ZA +2852126720,2852127743,BR +2852127744,2852127983,HN +2852127984,2852127991,NL +2852127992,2852128087,HN +2852128088,2852128095,NL +2852128096,2852128767,HN +2852128768,2852129791,AR +2852129792,2852130815,MX +2852130816,2852131839,SX +2852131840,2852147199,BR +2852147200,2852148223,PE +2852148224,2852149247,AR +2852149248,2852150271,BR +2852150272,2852151295,AR +2852151296,2852171775,BR +2852171776,2852172799,SV +2852172800,2852173823,BZ +2852173824,2852185087,BR +2852185088,2852186111,MX +2852186112,2852187135,PE +2852187136,2852189183,BR +2852189184,2852190207,TT +2852190208,2852192255,BR +2852192256,2852810751,US +2852810752,2852814847,DE +2852814848,2852839423,US +2852839424,2852847615,CA +2852847616,2853306367,US +2853306368,2853371903,CL +2853371904,2853765119,US +2853765120,2853830655,MX +2853830656,2854289407,US +2854289408,2854290431,CN +2854290432,2854293503,SG +2854293504,2854295551,US +2854295552,2854354943,SG +2854354944,2854617087,US +2854617088,2854682623,MY +2854748160,2855288831,US +2855288832,2855305215,GB +2855305216,2855309311,HK +2855309312,2855469055,US +2855469056,2855473151,PY +2855473152,2855481343,AR +2855481344,2855484415,PY +2855484416,2855484671,AR +2855484672,2855485183,PY +2855485184,2855489535,UY +2855489536,2855497727,AR +2855497728,2855499775,PY +2855499776,2855501823,UY +2855501824,2855518207,AR +2855518208,2855520255,UY +2855520256,2855534591,AR +2855534592,2855550975,US +2855550976,2855567359,CA +2855567360,2856058879,US +2856058880,2856124415,CH +2856124416,2856184831,US +2856184832,2856185855,GB +2856185856,2856438783,US +2856438784,2856439039,BR +2856439040,2856439295,US +2856439296,2856439551,BR +2856439552,2856452095,US +2856452096,2856517631,BR +2856517632,2856714239,US +2856714240,2856779775,MX +2856779776,2857082879,US +2857082880,2857086975,CA +2857086976,2857140223,US +2857140224,2857140735,CA +2857140736,2857152511,US +2857152512,2857152767,AU +2857152768,2857153023,NZ +2857153024,2857153279,AE +2857153280,2857153535,SA +2857153536,2857238527,US +2857238528,2857248767,BR +2857248768,2857249791,CO +2857249792,2857250815,AR +2857250816,2857252863,BR +2857252864,2857253887,CO +2857253888,2857256959,BR +2857256960,2857257471,AR +2857257472,2857257727,US +2857257728,2857257983,AR +2857257984,2857261055,BR +2857261056,2857262079,AR +2857262080,2857266175,BR +2857266176,2857267199,AR +2857267200,2857268223,CL +2857268224,2857270271,BR +2857270272,2857271295,AR +2857271296,2857273343,BR +2857273344,2857274367,AR +2857274368,2857285631,BR +2857285632,2857285887,AR +2857285888,2857286143,CO +2857286144,2857286655,BR +2857286656,2857287679,MX +2857287680,2857288703,AR +2857288704,2857289727,BR +2857289728,2857290751,AR +2857290752,2857294847,BR +2857294848,2857295871,AR +2857295872,2857303039,BR +2857303040,2857304063,CL +2857304064,2857308159,BR +2857308160,2857309183,AR +2857309184,2857313279,BR +2857313280,2857314303,PE +2857314304,2857315327,CL +2857315328,2857324031,BR +2857324032,2857324543,US +2857324544,2857326591,BR +2857326592,2857327615,CO +2857327616,2857329663,BR +2857329664,2857330687,CL +2857330688,2857331711,BR +2857331712,2857332735,PA +2857332736,2857335807,BR +2857335808,2857336831,MX +2857336832,2857340927,BR +2857340928,2857341951,DO +2857341952,2857350143,BR +2857350144,2857351167,AR +2857351168,2857363455,BR +2857363456,2857364479,CL +2857364480,2857368575,BR +2857368576,2857369599,AR +2857369600,2857371647,BR +2857371648,2857372671,CO +2857372672,2857373695,BR +2857373696,2857374719,NI +2857374720,2857374975,SV +2857374976,2857375743,GT +2857375744,2857376767,AR +2857376768,2857377791,MX +2857377792,2857388031,BR +2857388032,2857389055,CL +2857389056,2857392127,BR +2857392128,2857393151,CR +2857393152,2857394175,CL +2857394176,2857395199,CO +2857395200,2857397247,BR +2857397248,2857398271,AR +2857398272,2857399295,BR +2857399296,2857400319,AR +2857400320,2857404415,BR +2857404416,2857405439,AR +2857405440,2857406463,HN +2857406464,2857412607,BR +2857412608,2857414655,AR +2857414656,2857420799,BR +2857420800,2857421823,AR +2857421824,2857427967,BR +2857427968,2857428991,AR +2857428992,2857431039,BR +2857431040,2857432063,MX +2857432064,2857433087,BR +2857433088,2857434111,HT +2857434112,2857437183,BR +2857437184,2857438207,DO +2857438208,2857441279,BR +2857441280,2857442303,CO +2857442304,2857443327,CL +2857443328,2857444351,CR +2857444352,2857448447,BR +2857448448,2857449471,HN +2857449472,2857466879,BR +2857466880,2857467903,HN +2857467904,2857470719,BR +2857470720,2857470975,AR +2857470976,2857471999,MX +2857472000,2857473023,VE +2857473024,2857485311,BR +2857485312,2857486335,HN +2857486336,2857489407,BR +2857489408,2857490431,AR +2857490432,2857493503,BR +2857493504,2857494527,AR +2857494528,2857496575,BR +2857496576,2857497599,PE +2857497600,2857499647,BR +2857499648,2857500671,CO +2857500672,2857501183,HN +2857501184,2857501695,US +2857501696,2857506815,BR +2857506816,2857507839,DO +2857507840,2857509887,BR +2857509888,2857510911,HN +2857510912,2857511423,CO +2857511424,2857525247,BR +2857525248,2857526271,PE +2857526272,2857529343,BR +2857529344,2857530367,EC +2857530368,2857533439,BR +2857533440,2857534463,CL +2857534464,2857537535,BR +2857537536,2857538559,PY +2857538560,2857540607,BR +2857540608,2857541631,EC +2857541632,2857548799,BR +2857548800,2857549823,CL +2857549824,2857553919,BR +2857553920,2857554943,TT +2857554944,2857555967,BR +2857555968,2857556991,TT +2857556992,2857558015,BR +2857558016,2857559039,CL +2857559040,2857563135,BR +2857563136,2857563647,BO +2857563648,2857563903,BR +2857563904,2857564159,PA +2857564160,2857567231,BR +2857567232,2857568255,AR +2857568256,2857569279,CR +2857569280,2857574399,BR +2857574400,2857575423,AR +2857575424,2857579519,BR +2857579520,2857580543,AR +2857580544,2857581055,BR +2857581056,2857581311,AR +2857581312,2857581567,CO +2857581568,2857585663,BR +2857585664,2857586687,VE +2857586688,2857593855,BR +2857593856,2857594879,AR +2857594880,2857595903,BR +2857595904,2857596927,HN +2857596928,2857597951,BR +2857597952,2857598975,AR +2857598976,2857611263,BR +2857611264,2857612287,US +2857612288,2857615359,BR +2857615360,2857616383,HT +2857616384,2857621503,BR +2857621504,2857622527,EC +2857622528,2857623551,AR +2857623552,2857625599,BR +2857625600,2857627135,HN +2857627136,2857627647,US +2857627648,2857628671,PY +2857628672,2857633791,BR +2857633792,2857634815,TT +2857634816,2857643007,BR +2857643008,2857644031,AR +2857644032,2857659391,BR +2857659392,2857660415,CR +2857660416,2857663487,BR +2857663488,2857665535,AR +2857665536,2857666559,NI +2857666560,2857667583,VE +2857667584,2857674751,BR +2857674752,2857675775,AR +2857675776,2857676799,PY +2857676800,2857679871,BR +2857679872,2857680895,MX +2857680896,2857683967,BR +2857683968,2857684991,AR +2857684992,2857686015,CL +2857686016,2857687039,AR +2857687040,2857690111,BR +2857690112,2857691135,HN +2857691136,2857692159,AR +2857692160,2857696255,BR +2857696256,2857697279,AR +2857697280,2859007999,US +2859008000,2859073535,JP +2859073536,2859139071,CN +2859139072,2861842431,US +2861842432,2861843851,HK +2861843852,2861843853,US +2861843854,2861844479,HK +2861844480,2861858815,US +2861858816,2861859974,HK +2861859975,2861859976,US +2861859977,2861860863,HK +2861860864,2861957119,US +2861957120,2861959167,BR +2861959168,2861960191,AR +2861960192,2861961215,MX +2861961216,2861964287,BR +2861964288,2861965311,GT +2861965312,2861966335,AR +2861966336,2861968383,BR +2861968384,2861969407,AR +2861969408,2861971455,BR +2861971456,2861972479,CR +2861972480,2861974527,AR +2861974528,2861979647,BR +2861979648,2861980671,VE +2861980672,2861986815,BR +2861986816,2861987839,AR +2861987840,2861988863,CL +2861988864,2861992959,BR +2861992960,2861993983,CL +2861993984,2861996031,BR +2861996032,2861997055,AR +2861997056,2861998079,CL +2861998080,2861999103,MX +2861999104,2862003199,BR +2862003200,2862004223,HN +2862004224,2862007295,BR +2862007296,2862008319,AR +2862008320,2862022655,BR +2862022656,2862284799,US +2862284800,2862350335,AR +2862350336,2862415871,US +2862415872,2862481407,AU +2862481408,2863202303,US +2863202304,2863267839,MX +2863267840,2863595519,US +2863595520,2863661055,CA +2863661056,2863857663,US +2863857664,2863923199,CN +2863923200,2864844799,US +2864844800,2864845055,NL +2864845056,2864848895,US +2864848896,2864857087,GB +2864857088,2865252095,US +2865252096,2865252351,GB +2865252352,2865577983,US +2865577984,2865610751,BE +2865610752,2865889279,US +2865889280,2865954815,AR +2865954816,2867265535,US +2867265536,2867274751,BR +2867274752,2867275775,AR +2867275776,2867278847,BR +2867278848,2867279871,HN +2867279872,2867282943,BR +2867282944,2867283967,AR +2867283968,2867284991,BR +2867284992,2867286015,AR +2867286016,2867287039,PE +2867287040,2867297279,BR +2867297280,2867298303,AR +2867298304,2867300351,BR +2867300352,2867301375,AR +2867301376,2867306495,BR +2867306496,2867307519,AR +2867307520,2867308543,BR +2867308544,2867309567,PE +2867309568,2867310591,BR +2867310592,2867311615,AR +2867311616,2867317759,BR +2867317760,2867318783,AR +2867318784,2867323903,BR +2867323904,2867324927,MX +2867324928,2867325951,BR +2867325952,2867326975,PA +2867326976,2867329023,BR +2867329024,2867329295,HN +2867329296,2867329311,NL +2867329312,2867330047,HN +2867330048,2867331071,BR +2867331072,2867396607,US +2867396608,2867403775,BR +2867403776,2867404799,AR +2867404800,2867414015,BR +2867414016,2867415039,AR +2867415040,2867416063,GF +2867416064,2867420159,BR +2867420160,2867421183,AR +2867421184,2867426303,BR +2867426304,2867427327,AR +2867427328,2867428351,BR +2867428352,2867429375,AR +2867429376,2867433471,BR +2867433472,2867434495,PE +2867434496,2867435519,BR +2867435520,2867436543,CL +2867436544,2867441663,BR +2867441664,2867442687,AR +2867442688,2867445759,BR +2867445760,2867446783,CL +2867446784,2867449855,BR +2867449856,2867450879,AR +2867450880,2867451903,BR +2867451904,2867452927,PY +2867452928,2867455999,BR +2867456000,2867457023,AR +2867457024,2867462143,BR +2867462144,2867593215,US +2867593216,2867724287,CH +2867724288,2867725311,EC +2867725312,2867726335,BR +2867726336,2867727359,AR +2867727360,2867728383,BR +2867728384,2867729407,PY +2867729408,2867730431,AR +2867730432,2867731455,CL +2867731456,2867732479,BR +2867732480,2867733503,CL +2867733504,2867734527,BR +2867734528,2867735551,AR +2867735552,2867740671,BR +2867740672,2867741183,CO +2867741184,2867741695,AR +2867741696,2867751935,BR +2867751936,2867752959,HN +2867752960,2867756031,BR +2867756032,2867757055,AR +2867757056,2867767295,BR +2867767296,2867767807,CO +2867767808,2867768319,EC +2867768320,2867775487,BR +2867775488,2867776511,CL +2867776512,2867777535,AR +2867777536,2867780607,BR +2867780608,2867781631,MX +2867781632,2867782143,BR +2867782144,2867782655,CO +2867782656,2867784703,BR +2867784704,2867785727,CO +2867785728,2867787775,AR +2867787776,2867788799,BR +2867788800,2867789823,MX +2867789824,2867792895,BR +2867792896,2867793919,HT +2867793920,2867796991,BR +2867796992,2867799039,AR +2867799040,2867802111,BR +2867802112,2867803135,AR +2867803136,2867804159,BR +2867804160,2867805183,GT +2867805184,2867806207,BR +2867806208,2867807231,CL +2867807232,2867811327,BR +2867811328,2867812351,CL +2867812352,2867813375,AR +2867813376,2867815423,BR +2867815424,2867816447,PE +2867816448,2867820543,BR +2867820544,2867821567,BO +2867821568,2867822591,BR +2867822592,2867823615,AR +2867823616,2867827711,BR +2867827712,2867828735,MX +2867828736,2867829759,CL +2867829760,2867831807,BR +2867831808,2867832831,DO +2867832832,2867834879,AR +2867834880,2867835903,BR +2867835904,2867836927,AR +2867836928,2867837951,BR +2867837952,2867838975,CL +2867838976,2867842047,BR +2867842048,2867843071,EC +2867843072,2867850239,BR +2867850240,2867851263,SV +2867851264,2867852287,BR +2867852288,2867853311,AR +2867853312,2867855359,BR +2867855360,2868057087,US +2868057088,2868058111,BR +2868058112,2868117503,US +2868117504,2868127743,BR +2868127744,2868128767,HN +2868128768,2868129791,BR +2868129792,2868130815,AR +2868130816,2868131839,VE +2868131840,2868132863,AR +2868132864,2868137983,BR +2868137984,2868139007,DO +2868139008,2868140031,BR +2868140032,2868141055,VE +2868141056,2868142079,HN +2868142080,2868145151,BR +2868145152,2868146175,MX +2868146176,2868148223,BR +2868148224,2868150271,MX +2868150272,2868151295,AR +2868151296,2868154367,BR +2868154368,2868155391,HN +2868155392,2868157439,BR +2868157440,2868158463,HN +2868158464,2868160511,BR +2868160512,2868161535,CR +2868161536,2868164607,BR +2868164608,2868166655,AR +2868166656,2868170751,BR +2868170752,2868171775,EC +2868171776,2868178943,BR +2868178944,2868179967,HN +2868179968,2868183039,BR +2868183040,2868184063,CW +2868184064,2868191743,BR +2868191744,2868191999,VE +2868192000,2868192255,BO +2868192256,2868193279,BR +2868193280,2868194303,HN +2868194304,2868195327,BR +2868195328,2868195583,CL +2868195584,2868195839,GB +2868195840,2868196351,CL +2868196352,2868197375,BR +2868197376,2868198399,HN +2868198400,2868205567,BR +2868205568,2868206591,MX +2868206592,2868225023,BR +2868225024,2868226047,DO +2868226048,2868227071,AR +2868227072,2868230143,BR +2868230144,2868232191,MX +2868232192,2868236287,BR +2868236288,2868237311,AR +2868237312,2868242431,BR +2868242432,2868243455,AR +2868243456,2868244479,BR +2868244480,2868245503,CR +2868245504,2868253695,BR +2868253696,2868254719,AR +2868254720,2868257791,BR +2868257792,2868259839,AR +2868259840,2868260863,BR +2868260864,2868261887,AR +2868261888,2868263935,HN +2868263936,2868264959,BR +2868264960,2868265983,CL +2868265984,2868268031,BR +2868268032,2868268287,AR +2868268288,2868268543,VE +2868268544,2868268799,AR +2868268800,2868269055,VE +2868269056,2868270079,BR +2868270080,2868271103,EC +2868271104,2868272127,AR +2868272128,2868273151,VE +2868273152,2868274175,BR +2868274176,2868275199,CR +2868275200,2868277247,BR +2868277248,2868278271,CO +2868278272,2868286463,BR +2868286464,2868287487,CR +2868287488,2868288511,NI +2868288512,2868289535,CR +2868289536,2868290559,TT +2868290560,2868292607,BR +2868292608,2868293631,CL +2868293632,2868295679,AR +2868295680,2868304895,BR +2868304896,2868305919,PA +2868305920,2868311039,BR +2868311040,2868312063,AR +2868312064,2868314111,BR +2868314112,2868315135,CO +2868315136,2868328447,BR +2868328448,2868329471,AR +2868329472,2868333567,BR +2868333568,2868334591,AR +2868334592,2868335615,BR +2868335616,2868336639,HN +2868336640,2868337663,AR +2868337664,2868338687,CL +2868338688,2868339711,AR +2868339712,2868344831,BR +2868344832,2868345855,AR +2868345856,2868346879,BR +2868346880,2868348927,MX +2868348928,2868349951,CL +2868349952,2868350975,AR +2868350976,2868353023,BR +2868353024,2868354047,PA +2868354048,2868355071,BR +2868355072,2868356095,BO +2868356096,2868357119,CL +2868357120,2868358143,UY +2868358144,2868360191,MX +2868360192,2868361215,BR +2868361216,2868363263,MX +2868363264,2868366335,BR +2868366336,2868367359,CL +2868367360,2868368383,BR +2868368384,2868369407,VE +2868369408,2868370431,CL +2868370432,2868371455,BZ +2868371456,2868373503,MX +2868373504,2868379647,BR +2868379648,2868380159,IN +2868380160,2868380671,BR +2868380672,2868380927,US +2868380928,2868381055,MX +2868381056,2868381183,IN +2868381184,2868381695,MX +2868381696,2868382463,US +2868382464,2868382719,CL +2868382720,2868383231,IN +2868383232,2868383743,US +2868383744,2868384255,PH +2868384256,2868384767,BR +2868384768,2868390143,US +2868390144,2868390399,GB +2868390400,2868390911,IN +2868390912,2868391423,US +2868391424,2868391935,IN +2868391936,2868399615,US +2868399616,2868399871,BR +2868399872,2868400127,US +2868400128,2868400639,BR +2868400640,2868401151,US +2868401152,2868401663,BR +2868401664,2868401919,PH +2868401920,2868402175,AR +2868402176,2868410367,US +2868410368,2868410879,BR +2868410880,2868411391,AR +2868411392,2868411903,PL +2868411904,2868414719,US +2868414720,2868414975,MU +2868414976,2868415487,IN +2868415488,2868415999,US +2868416000,2868416255,AU +2868416256,2868416767,US +2868416768,2868417023,PL +2868417024,2868417535,JP +2868417536,2868418815,US +2868418816,2868419071,TR +2868419072,2868419327,PH +2868419328,2868419583,IN +2868419584,2868420607,PH +2868420608,2868423679,IN +2868423680,2868428287,US +2868428288,2868428799,IN +2868428800,2868432895,US +2868432896,2868433407,AR +2868433408,2868437503,US +2868437504,2868437759,BR +2868437760,2868578815,US +2868578816,2868579327,IN +2868579328,2868581375,US +2868581376,2868581887,IN +2868581888,2868586495,US +2868586496,2868588543,IN +2868588544,2868591615,US +2868591616,2868592127,IN +2868592128,2868599295,US +2868599296,2868599807,BR +2868599808,2868604415,US +2868604416,2868604927,IN +2868604928,2868612607,US +2868612608,2868613119,IN +2868613120,2868619775,US +2868619776,2868620287,IN +2868620288,2868620799,US +2868620800,2868621311,IN +2868621312,2868632575,US +2868632576,2868633087,BR +2868633088,2868674336,US +2868674337,2868674337,SE +2868674338,2868678655,US +2868678656,2868678911,JP +2868678912,2868731903,US +2868731904,2868740095,CA +2868740096,2868772863,US +2868772864,2868773887,CO +2868773888,2868776959,BR +2868776960,2868777983,BZ +2868777984,2868780031,BR +2868780032,2868781055,EC +2868781056,2868785151,BR +2868785152,2868786175,PA +2868786176,2868788223,BR +2868788224,2868789247,AR +2868789248,2868790271,DO +2868790272,2868796415,BR +2868796416,2868797439,AR +2868797440,2868803583,BR +2868803584,2868804607,AR +2868804608,2868805631,BR +2868805632,2868806655,AR +2868806656,2868812799,BR +2868812800,2868813823,AR +2868813824,2868814847,BR +2868814848,2868815871,AR +2868815872,2868816895,BR +2868816896,2868817919,VE +2868817920,2868818047,HN +2868818048,2868818063,FR +2868818064,2868818095,HN +2868818096,2868818111,FR +2868818112,2868818887,HN +2868818888,2868818895,IT +2868818896,2868818943,HN +2868818944,2868825087,BR +2868825088,2868826111,AR +2868826112,2868828159,BR +2868828160,2868829183,PY +2868829184,2868831231,BR +2868831232,2868832255,CO +2868832256,2868833279,PE +2868833280,2868838399,BR +2868838400,2868903935,BE +2868903936,2869035007,SG +2869035008,2869166079,JP +2869166080,2869428223,TH +2869428224,2869952511,CN +2869952512,2870018047,FR +2870018048,2870083583,DE +2870083584,2870089727,FR +2870089728,2870090751,BE +2870090752,2870091775,DE +2870091776,2870149119,FR +2870149120,2870214655,HU +2870214656,2870228223,DK +2870228224,2870228991,US +2870228992,2870280191,DK +2870280192,2870345727,NL +2870345728,2870411263,GB +2870411264,2870476799,NO +2870476800,2870542335,DE +2870542336,2870575103,CH +2870575104,2870583295,SE +2870583296,2870584319,NO +2870584320,2870585343,RU +2870585344,2870586367,UA +2870586368,2870587391,RU +2870587392,2870587647,CZ +2870587648,2870587903,RU +2870587904,2870588159,DE +2870588160,2870588415,NL +2870588416,2870588927,HU +2870588928,2870589439,PL +2870589440,2870591231,RU +2870591232,2870591487,IT +2870591488,2870591743,PL +2870591744,2870591999,SE +2870592000,2870592511,RU +2870592512,2870593535,PL +2870593536,2870594047,GB +2870594048,2870594559,RU +2870594560,2870595583,UA +2870595584,2870596607,FR +2870596608,2870597631,RU +2870597632,2870597887,PL +2870597888,2870598143,BE +2870598144,2870598655,LV +2870598656,2870599423,CZ +2870599424,2870599679,RO +2870599680,2870599935,KW +2870599936,2870600191,DE +2870600192,2870600703,PL +2870600704,2870600959,DK +2870600960,2870601215,BE +2870601216,2870601727,PL +2870601728,2870602751,RU +2870602752,2870603775,UA +2870603776,2870604031,LT +2870604032,2870604287,UA +2870604288,2870607871,RU +2870607872,2870673407,BE +2870673408,2870738943,CH +2870738944,2870935551,GB +2870935552,2871001087,HU +2871001088,2871066623,SE +2871066624,2871083007,CH +2871083008,2871099391,FR +2871099392,2871101439,NL +2871101440,2871103487,CZ +2871103488,2871104063,GB +2871104064,2871105535,NL +2871105536,2871107583,FR +2871107584,2871111679,GB +2871111680,2871115775,DE +2871115776,2871123967,GB +2871123968,2871126015,NL +2871126016,2871128063,ES +2871130112,2871132159,RU +2871132160,2872049663,CN +2872049664,2873098239,IN +2873098240,2873884671,US +2873884672,2874146815,IN +2874146816,2875195391,CN +2875195392,2875719679,TH +2875719680,2877292543,CN +2877292544,2882469887,US +2882469888,2882535423,SG +2882535424,2883583999,CN +2883584000,2885681151,VN +2885681152,2886729727,US +2887778304,2889522431,US +2889522432,2889522687,PR +2889522688,2889523071,US +2889523072,2889523199,PR +2889523200,2890137599,US +2890137600,2890138623,AU +2890138624,2890139647,TH +2890139648,2890141695,RU +2890141696,2890145791,BR +2890145792,2890147839,US +2890147840,2890148863,AO +2890148864,2890149887,US +2890149888,2890150911,AT +2890150912,2890152959,US +2890152960,2890153983,GR +2890153984,2890158079,US +2890158080,2890158847,AU +2890158848,2890159103,US +2890159104,2890160127,AU +2890160128,2890161151,US +2890161152,2890162175,ES +2890162176,2890163199,PA +2890163200,2890164223,PT +2890164224,2890165247,TH +2890165248,2890166271,DE +2890166272,2890167295,CL +2890167296,2890168319,AU +2890168320,2890169343,CW +2890169344,2890170367,AM +2890170368,2890171391,DJ +2890171392,2890172415,US +2890172416,2890173439,PL +2890173440,2890174463,US +2890174464,2890175231,SG +2890175232,2890176511,US +2890176512,2890177535,RS +2890177536,2890178559,US +2890178560,2890179583,IN +2890179584,2890182655,US +2890182656,2890183679,EC +2890183680,2890184703,SE +2890184704,2890185727,ZA +2890185728,2890187775,US +2890187776,2890188799,IT +2890188800,2890189823,LK +2890189824,2890191871,US +2890191872,2890192895,CZ +2890192896,2890193919,BR +2890193920,2890194943,HR +2890194944,2890195967,HU +2890195968,2890196991,US +2890196992,2890198015,TH +2890198016,2890199039,UA +2890199040,2890200063,TH +2890200064,2890201087,RU +2890201088,2890203135,HK +2890203136,2890204159,AT +2890204160,2890216447,US +2890216448,2890217471,NL +2890217472,2890218495,GR +2890218496,2890956799,US +2890956800,2890989567,AE +2890989568,2891017215,US +2891017216,2891017471,JP +2891017472,2891022847,US +2891022848,2891023103,GB +2891023104,2891034623,US +2891034624,2891036671,CA +2891036672,2891038719,US +2891038720,2891055103,CN +2891055104,2891056383,US +2891056384,2891056639,ES +2891056640,2891058943,US +2891058944,2891059199,FR +2891059200,2891120639,US +2891251712,2891272191,US +2891272192,2891274239,CA +2891274240,2891277823,US +2891277824,2891278079,GB +2891278080,2891279103,US +2891279104,2891279359,GB +2891279360,2891282431,US +2891282432,2891283455,PR +2891283456,2891284479,CA +2891284480,2891364351,US +2891364352,2891374591,CA +2891378688,2891380735,CA +2891380736,2891403263,US +2891403264,2891407359,CA +2891407360,2891780095,US +2891780096,2891786239,CA +2891786240,2891790335,US +2891790336,2891791359,CA +2891791360,2891796479,US +2891796480,2891800575,CA +2891800576,2891807231,US +2891807232,2891807487,GB +2891807488,2891807743,US +2891807744,2891808767,CA +2891808768,2891841535,US +2891841536,2891841791,SE +2891841792,2891842303,US +2891842304,2891842559,GB +2891842560,2891842815,BN +2891842816,2891843327,GB +2891843328,2891844095,US +2891844096,2891844351,GE +2891844352,2891845119,US +2891845120,2891845631,DE +2891845632,2891845887,US +2891845888,2891846399,DE +2891846400,2891846655,NL +2891846656,2891846911,US +2891846912,2891847167,NL +2891847168,2891848447,US +2891848448,2891848703,JP +2891848704,2891848959,US +2891848960,2891849215,BN +2891849216,2891850239,US +2891850240,2891850495,TH +2891850496,2891850751,AM +2891850752,2891851007,US +2891851008,2891851263,EE +2891851264,2891851519,AM +2891851520,2891853567,US +2891853568,2891853823,SG +2891853824,2891854079,US +2891854080,2891854335,TR +2891854336,2891854591,MY +2891854592,2891854847,PL +2891854848,2891855103,US +2891855104,2891855359,FR +2891855360,2891855615,BE +2891855616,2891855871,CH +2891855872,2891856127,JP +2891856128,2891856383,LU +2891856384,2891857663,US +2891857664,2891857919,DE +2891857920,2891858175,DZ +2891858176,2891858431,DK +2891858432,2891858687,CA +2891858688,2891859455,US +2891859456,2891859711,NO +2891859712,2891859967,AT +2891859968,2891860223,US +2891860224,2891860479,NL +2891860480,2891860735,CH +2891860736,2891860991,GB +2891860992,2891861247,BM +2891861248,2891861503,BO +2891861504,2891862527,US +2891862528,2891863039,KR +2891863040,2891863295,FR +2891863296,2891863551,AU +2891863552,2891863807,JP +2891863808,2891864063,FR +2891864064,2891864319,SG +2891864320,2891865087,US +2891865088,2891865343,NL +2891865344,2891865599,US +2891865600,2891865855,HK +2891865856,2891866111,US +2891866112,2891866367,AU +2891866368,2891866623,BB +2891866624,2891867391,AU +2891867392,2891867647,AT +2891867648,2891867903,US +2891867904,2891868159,AU +2891868160,2891868671,IT +2891868672,2891868927,AU +2891868928,2891869439,US +2891869440,2891869695,AT +2891869696,2891869951,US +2891869952,2891870207,DE +2891870208,2891870463,RU +2891870464,2891870719,KY +2891870720,2891870975,NO +2891870976,2891871231,US +2891871232,2891871487,CA +2891871488,2891874047,US +2891874048,2891874303,CA +2891874304,2891976535,US +2891976536,2891976543,CA +2891976544,2891982847,US +2891982848,2891984895,CA +2891984896,2891997695,US +2891997696,2891997951,IE +2891997952,2892015615,US +2892015616,2892016639,PR +2892016640,2892017663,US +2892017664,2892019711,CA +2892019712,2892019967,NL +2892019968,2892021759,CA +2892021760,2892040191,US +2892040192,2892042239,CA +2892042240,2892050431,US +2892050432,2892052479,CA +2892052480,2892053503,US +2892053504,2892054527,CA +2892054528,2892059775,US +2892059776,2892059903,BI +2892059904,2892060031,US +2892060032,2892060159,CC +2892060160,2892060799,US +2892060800,2892060927,WS +2892060928,2892061055,US +2892061056,2892061183,MU +2892061184,2892061311,AD +2892061312,2892061439,SL +2892061440,2892061567,US +2892061568,2892061695,PA +2892061696,2892062079,US +2892062080,2892062207,GU +2892062208,2892068863,US +2892068864,2892069887,CA +2892069888,2892070911,US +2892070912,2892103679,CA +2892103680,2892120575,US +2892120576,2892121087,CA +2892121088,2892122367,US +2892122368,2892122623,CA +2892122624,2892124927,US +2892124928,2892125183,NL +2892125184,2892126719,US +2892126720,2892126975,GB +2892126976,2892140543,US +2892140544,2892144895,CA +2892144896,2892145407,US +2892145408,2892145663,CA +2892145664,2892146943,US +2892146944,2892147199,NL +2892147200,2892149503,US +2892149504,2892149759,NL +2892149760,2892150271,US +2892150272,2892150783,CA +2892150784,2892154343,US +2892154344,2892154351,HN +2892154352,2892155903,US +2892155904,2892156927,CA +2892156928,2892171263,US +2892171264,2892172287,CA +2892172288,2892174335,US +2892174336,2892177407,CA +2892177408,2892369919,US +2892369920,2892374015,CA +2892374016,2892399103,US +2892399104,2892399231,TG +2892399232,2892399615,US +2892399616,2892399743,FJ +2892399744,2892399871,US +2892399872,2892399999,CW +2892400000,2892401023,US +2892401024,2892401151,ER +2892401152,2892401279,NR +2892401280,2892401407,US +2892401408,2892401535,MR +2892401536,2892401919,US +2892401920,2892402047,MF +2892402048,2892402175,US +2892402176,2892402303,MP +2892402304,2892414975,US +2892414976,2892415231,GB +2892415232,2892417791,US +2892417792,2892418047,GB +2892418048,2892420607,US +2892420608,2892420863,CA +2892420864,2892421631,US +2892421632,2892421887,CA +2892421888,2892423167,US +2892423168,2892424191,VI +2892424192,2892425215,CA +2892425216,2892443647,US +2892443648,2892447743,CA +2892447744,2892464127,US +2892464128,2892496895,CA +2892496896,2892505087,US +2892505088,2892513279,SG +2892513280,2892529663,JP +2892529664,2892537855,DE +2892537856,2892546047,SG +2892546048,2892906495,US +2892906496,2892910591,CA +2892910592,2892943743,US +2892943744,2892943871,LR +2892943872,2892943999,MC +2892944000,2892944127,SZ +2892944128,2892944255,US +2892944256,2892944383,BT +2892944384,2892944767,US +2892944768,2892944895,GQ +2892944896,2892945023,US +2892945024,2892945151,LS +2892945152,2892945279,US +2892945280,2892945407,LI +2892945408,2892945791,US +2892945792,2892945919,CV +2892945920,2892946047,US +2892946048,2892946175,LA +2892946176,2892946303,US +2892946304,2892946431,CF +2892946432,2892946815,US +2892946816,2892946943,SM +2892946944,2892947327,US +2892947328,2892947455,TO +2892947456,2892988415,US +2892988416,2892988671,SC +2892988672,2892988927,HU +2892988928,2892989183,RO +2892989184,2892989439,PE +2892989440,2892989695,CO +2892989696,2892989951,VE +2892989952,2892990207,US +2892990208,2892990463,CA +2892990464,2892990719,US +2892990720,2892990975,IT +2892990976,2892991231,GB +2892991232,2892991487,US +2892991488,2892991999,GB +2892992000,2892992511,HK +2892992512,2892993023,IT +2892993024,2892993279,JP +2892993280,2892993535,US +2892993536,2892993791,BE +2892993792,2892994047,PA +2892994048,2892994303,GB +2892994304,2892994559,US +2892994560,2892994815,JO +2892994816,2892995327,GB +2892995328,2892995839,AU +2892995840,2892996095,GB +2892996096,2892996607,US +2892996608,2892996863,CA +2892996864,2892996910,AU +2892996911,2892996911,GS +2892996912,2892997119,AU +2892997120,2892997375,CA +2892997376,2892997631,BG +2892997632,2892997887,AU +2892997888,2892998143,JP +2892998144,2892998399,US +2892998400,2892998655,GB +2892998656,2892998911,HK +2892998912,2892999167,MX +2892999168,2892999423,CR +2892999424,2892999935,US +2892999936,2893000191,IT +2893000192,2893000447,US +2893000448,2893000703,HK +2893000704,2893000959,US +2893000960,2893001215,CA +2893001216,2893001727,GB +2893001728,2893002239,IT +2893002240,2893002495,EE +2893002496,2893002751,PA +2893002752,2893003007,NZ +2893003008,2893003263,KR +2893003264,2893003775,GB +2893003776,2893004031,DE +2893004032,2893004287,JP +2893004288,2893004543,DK +2893004544,2893004799,US +2893004800,2893005311,HK +2893005312,2893005567,US +2893005568,2893005823,FR +2893005824,2893006079,NO +2893006080,2893006335,BE +2893006336,2893006591,US +2893006592,2893006847,BR +2893006848,2893007103,DE +2893007104,2893007359,US +2893007360,2893007615,IE +2893007616,2893007871,DE +2893007872,2893008639,GB +2893008640,2893008895,US +2893008896,2893009151,AF +2893009152,2893009663,US +2893009664,2893010175,GB +2893010176,2893010431,IT +2893010432,2893010687,DE +2893010688,2893010943,US +2893010944,2893011199,AT +2893011200,2893011455,US +2893011456,2893011711,SG +2893011712,2893011967,US +2893011968,2893012223,FR +2893012224,2893012479,ES +2893012480,2893012735,BE +2893012736,2893015039,US +2893015040,2893015295,CA +2893015296,2893015551,BS +2893015552,2893016575,US +2893016576,2893016831,SE +2893016832,2893017343,CA +2893017344,2893017599,SG +2893017600,2893017855,DE +2893017856,2893018111,FR +2893018112,2893018623,BE +2893018624,2893019135,SE +2893019136,2893019647,AU +2893019648,2893019903,DE +2893019904,2893020159,SG +2893020160,2893020415,NL +2893020416,2893020671,AT +2893020672,2893676543,US +2893676544,2893807615,JP +2893807616,2894921727,US +2894921728,2895118335,GB +2895118336,2895301887,US +2895301888,2895302143,AR +2895302144,2895642623,US +2895642624,2895708159,FR +2895708160,2896035839,US +2896035840,2896101375,DE +2896101376,2896166911,GB +2896166912,2896301499,US +2896301500,2896301500,DE +2896301501,2896429280,US +2896429281,2896429281,CA +2896429282,2897018879,US +2897018880,2897149951,DE +2897149952,2897215487,US +2897215488,2897739775,DE +2897739776,2898001919,FR +2898001920,2898132991,GB +2898132992,2898264063,US +2898264064,2898788351,AU +2898788352,2899050495,GB +2899050496,2899116031,FR +2899116032,2899148799,VN +2899148800,2899181567,AU +2899181568,2899312639,GB +2899312640,2899378175,FR +2899378176,2899443711,GB +2899443712,2899574783,FR +2899574784,2899902463,GB +2899902464,2899967999,US +2899968000,2900099071,CA +2900099072,2901475327,US +2901475328,2901477375,NL +2901477376,2901485567,US +2901485568,2901489663,NL +2901489664,2901491711,US +2901491712,2901493759,NL +2901493760,2901496831,US +2901496832,2901497855,NL +2901497856,2901538815,US +2901538816,2901540863,SG +2901540864,2901737983,US +2901737984,2901738239,CA +2901738240,2901740455,US +2901740456,2901740463,CA +2901740464,2901751295,US +2901751296,2901751551,GB +2901751552,2901876735,US +2901876736,2901877759,CN +2901877760,2901878271,DE +2901878272,2901878783,CN +2901878784,2902200319,US +2902200320,2902201855,CN +2902201856,2902202111,US +2902202112,2902203135,CN +2902203136,2902203391,US +2902203392,2902204159,CN +2902204160,2902208767,US +2902208768,2902211327,CN +2902211328,2902211583,US +2902211584,2902212607,CN +2902212608,2902228479,US +2902228480,2902228991,DE +2902228992,2902230015,CN +2902230016,2902230271,US +2902230272,2902231039,CN +2902231040,2902231295,US +2902231296,2902232319,CN +2902232320,2902232575,US +2902232576,2902232831,CN +2902232832,2902233087,US +2902233088,2902233343,CN +2902233344,2902233599,US +2902233600,2902235135,CN +2902235136,2902235391,US +2902235392,2902236415,CN +2902236416,2902236927,US +2902236928,2902237951,CN +2902237952,2902238207,US +2902238208,2902239999,CN +2902240000,2902240511,US +2902240512,2902241535,CN +2902241536,2902241791,US +2902241792,2902242047,CN +2902242048,2902242303,US +2902242304,2902243327,CN +2902243328,2902243583,US +2902243584,2902245375,CN +2902245376,2902246143,US +2902246144,2902246399,CN +2902246400,2902392831,US +2902392832,2902396927,NL +2902396928,2902405119,US +2902405120,2902407679,CA +2902407680,2902407935,US +2902407936,2902408191,CA +2902408192,2902409215,GB +2902409216,2902417407,US +2902417408,2902421503,NL +2902421504,2902427647,US +2902427648,2902429695,NL +2902429696,2902441983,US +2902441984,2902446079,NL +2902446080,2902450175,US +2902450176,2902454271,NL +2902454272,2902456319,US +2902456320,2902458367,NL +2902458368,2902476543,US +2902476544,2902476799,CW +2902476800,2902507519,US +2902507520,2902515711,CA +2902515712,2904555519,US +2904555520,2904817663,CA +2904817664,2904981503,US +2904981504,2905002152,NL +2905002153,2905002153,US +2905002154,2905014271,NL +2905014272,2905038847,IN +2905038848,2905047039,SG +2905047040,2905079807,HK +2905079808,2905345279,US +2905345280,2905345535,AU +2905345536,2905346815,US +2905346816,2905347071,JP +2905347072,2905348095,US +2905348096,2905348351,PH +2905348352,2905348863,US +2905348864,2905349119,NZ +2905349120,2905376207,US +2905376208,2905376223,GB +2905376224,2905390879,US +2905390880,2905390895,GB +2905390896,2905391599,US +2905391600,2905391615,GB +2905391616,2905402519,US +2905402520,2905402527,IN +2905402528,2905415679,US +2905415680,2905415935,GB +2905415936,2905473023,US +2905473024,2905481215,CA +2905481216,2905494783,US +2905494784,2905495039,DE +2905495040,2905510911,US +2905510912,2905511935,CA +2905511936,2905512959,US +2905512960,2905513471,CA +2905513472,2913992703,US +2913992704,2914516991,CA +2914516992,2915105791,US +2915105792,2915106047,NL +2915106048,2915106303,US +2915106304,2915106559,SG +2915106560,2915195647,US +2915195648,2915195903,CL +2915195904,2915196159,NL +2915196160,2915196415,TW +2915196416,2915196927,US +2915196928,2915197183,IE +2915197184,2915197439,US +2915197440,2915197695,FI +2915197696,2915215359,US +2915215360,2915215615,JP +2915215616,2915216127,NL +2915216128,2915216383,TW +2915216384,2915250175,US +2915250176,2915254271,CA +2915254272,2915516415,US +2915516416,2915516671,NL +2915516672,2915516927,CA +2915516928,2915517439,US +2915517440,2915518434,DK +2915518435,2915518435,FR +2915518436,2915518463,DK +2915518464,2915520511,GB +2915520512,2915520639,AU +2915520640,2915520647,US +2915520648,2915520671,AU +2915520672,2915520767,US +2915520768,2915521023,AU +2915521024,2915521279,JP +2915521280,2915521535,PL +2915521536,2915526911,US +2915526912,2915527167,DE +2915527168,2915527423,US +2915527424,2915527679,DE +2915527680,2915528703,NL +2915528704,2915528735,US +2915528736,2915528751,NL +2915528752,2915528783,US +2915528784,2915528791,NL +2915528792,2915528815,US +2915528816,2915528823,NL +2915528824,2915528863,US +2915528864,2915528879,NL +2915528880,2915528927,US +2915528928,2915528943,NL +2915528944,2915528959,US +2915528960,2915529023,NL +2915529024,2915529151,US +2915529152,2915529215,NL +2915529216,2915795013,US +2915795014,2915795014,MX +2915795015,2915894575,US +2915894576,2915894591,CA +2915894592,2915958783,US +2915958784,2916024319,CA +2916024320,2916163583,US +2916163584,2916168159,CA +2916168160,2916168167,US +2916168168,2916171775,CA +2916171776,2916184063,US +2916184064,2916196351,CA +2916196352,2916253695,US +2916253696,2916286463,CA +2916286464,2916287487,US +2916287488,2916287743,NL +2916287744,2916287999,CA +2916288000,2916290047,US +2916290048,2916290303,FR +2916290304,2916302847,US +2916302848,2916303359,CA +2916303360,2916303871,DE +2916303872,2916304383,CA +2916304384,2916304895,US +2916304896,2916305919,GB +2916305920,2916306943,US +2916306944,2916308991,ES +2916308992,2916310015,US +2916310016,2916310271,FR +2916310272,2916310527,US +2916310528,2916310783,GB +2916310784,2916311039,IT +2916311040,2916312063,US +2916312064,2916313087,IT +2916313088,2916314111,HK +2916314112,2916315135,DE +2916315136,2916316159,US +2916316160,2916317183,CN +2916317184,2916317439,US +2916317440,2916317695,CN +2916317696,2916317951,US +2916317952,2916318207,CN +2916318208,2916319231,GB +2916319232,2916335615,PR +2916335616,2916368383,US +2916368384,2916401151,CA +2916401152,2916417535,DE +2916417536,2916515839,US +2916515840,2916519935,CA +2916519936,2916581375,US +2916581376,2916599039,PR +2916599040,2916599295,US +2916599296,2916614143,PR +2916614144,2917031935,US +2917031936,2917032959,NL +2917032960,2917035007,US +2917035008,2917035519,NL +2917035520,2917040127,US +2917040128,2917041407,NL +2917041408,2917045503,US +2917045504,2917045759,NL +2917045760,2917058559,US +2917058560,2917059583,NL +2917059584,2917060607,US +2917060608,2917061631,NL +2917061632,2917068799,US +2917068800,2917069823,NL +2917069824,2917075455,US +2917075456,2917075967,NL +2917075968,2917078527,US +2917078528,2917079039,NL +2917079040,2917080063,US +2917080064,2917081087,NL +2917081088,2917099519,US +2917099520,2917100543,NL +2917100544,2917101567,US +2917101568,2917106175,NL +2917106176,2917112831,US +2917112832,2917113855,NL +2917113856,2917115903,US +2917115904,2917116927,NL +2917116928,2917167905,US +2917167906,2917167906,BZ +2917167907,2917171199,US +2917171200,2917175295,CA +2917175296,2917195775,US +2917195776,2917203967,CA +2917203968,2917257215,US +2917257216,2917261311,KY +2917261312,2917265407,US +2917265408,2917267775,JM +2917267776,2917267839,VG +2917267840,2917267967,AG +2917267968,2917268223,JM +2917268224,2917268479,BB +2917268480,2917269113,JM +2917269114,2917269114,TC +2917269115,2917269503,JM +2917269504,2917445887,US +2917445888,2917446143,DE +2917446144,2917449727,US +2917449728,2917457919,PR +2917457920,2917458943,US +2917458944,2917466111,PR +2917466112,2917572607,US +2917572608,2917580799,CA +2917580800,2917593295,US +2917593296,2917593303,CO +2917593304,2917597439,US +2917597440,2917597695,GB +2917597696,2917621759,US +2917621760,2917629951,CA +2917629952,2917646847,US +2917646848,2917647103,CN +2917647104,2917647359,US +2917647360,2917648383,CN +2917648384,2917648639,US +2917648640,2917648895,CN +2917648896,2917652223,US +2917652224,2917652479,AU +2917652480,2917653503,US +2917653504,2917654015,GB +2917654016,2917654271,US +2917654272,2917654527,CN +2917654528,2917654783,US +2917654784,2917655039,DE +2917655040,2917655551,US +2917655552,2917655807,CN +2917655808,2917656063,US +2917656064,2917656319,CN +2917656320,2917656831,US +2917656832,2917657087,CN +2917657088,2917660671,US +2917660672,2917661183,GB +2917661184,2917675263,US +2917675264,2917675519,CN +2917675520,2917676031,US +2917676032,2917676287,IN +2917676288,2917687295,US +2917687296,2917687551,RO +2917687552,2917688063,US +2917688064,2917688319,RO +2917688320,2917693951,US +2917693952,2917694207,CN +2917694208,2917699839,US +2917699840,2917700351,CA +2917700352,2917700959,US +2917700960,2917700967,CN +2917700968,2917704191,US +2917704192,2917704447,CA +2917704448,2917707519,US +2917707520,2917707775,CA +2917707776,2917710591,US +2917710592,2917710847,CA +2917710848,2917713919,US +2917713920,2917714175,CA +2917714176,2917826559,US +2917826560,2917828351,NL +2917828352,2917828479,IN +2917828480,2917828607,NL +2917828608,2917842175,US +2917842176,2917842431,CA +2917842432,2918014975,US +2918014976,2918023167,CA +2918023168,2918043647,US +2918043648,2918047743,CA +2918047744,2918051839,US +2918051840,2918121471,CA +2918121472,2918136831,US +2918136832,2918137087,CA +2918137088,2918154239,US +2918154240,2918170623,CA +2918170624,2918172790,US +2918172791,2918172793,MX +2918172794,2918172794,US +2918172795,2918172800,AR +2918172801,2918174463,US +2918174464,2918174719,MX +2918174720,2918180351,US +2918180352,2918180863,CA +2918180864,2918187007,US +2918187008,2918188031,CA +2918188032,2918232063,US +2918232064,2918236159,CA +2918236160,2918260735,US +2918260736,2918264831,CA +2918264832,2918277119,US +2918277120,2918281215,CA +2918281216,2918287359,US +2918287360,2918289407,GB +2918289408,2918314216,US +2918314217,2918314217,GB +2918314218,2918371327,US +2918371328,2918375423,CA +2918375424,2918391807,US +2918391808,2918395903,CA +2918395904,2918404095,US +2918404096,2918408191,PR +2918408192,2918432767,US +2918432768,2918436863,CA +2918436864,2918459391,US +2918459392,2918459647,CA +2918459648,2918463231,US +2918463232,2918463487,CA +2918463488,2918469631,US +2918469632,2918471423,CA +2918471424,2918471679,US +2918471680,2918472703,CA +2918472704,2918473215,US +2918473216,2918473727,CA +2918473728,2918477823,US +2918477824,2918481919,CA +2918481920,2918498431,US +2918498432,2918498435,JP +2918498436,2918498447,US +2918498448,2918498463,JP +2918498464,2918498499,US +2918498500,2918498501,JP +2918498502,2918498535,US +2918498536,2918498539,JP +2918498540,2918502911,US +2918502912,2918503167,SG +2918503168,2918514943,US +2918514944,2918515079,CA +2918515080,2918515199,US +2918515200,2918515327,CA +2918515328,2918527231,US +2918527232,2918527487,FR +2918527488,2918530559,US +2918530560,2918530815,HK +2918530816,2918536719,US +2918536720,2918536727,CA +2918536728,2918570239,US +2918570240,2918570495,JP +2918570496,2918580223,US +2918580224,2918588415,CA +2918588416,2918596607,US +2918596608,2918604287,CA +2918604288,2918612991,US +2918612992,2918621183,CA +2918621184,2918628351,US +2918628352,2918628607,DE +2918628608,2918653951,US +2918653952,2918662143,CA +2918662144,2918678527,US +2918678528,2918686719,CA +2918686720,2918699007,US +2918699008,2918703103,CA +2918703104,2918768639,US +2918768640,2918776831,HK +2918776832,2918793215,DE +2918793216,2918815999,US +2918816000,2918817023,GB +2918817024,2918817791,US +2918825984,2918828031,US +2918828032,2918828543,UA +2918828544,2918829055,ES +2918829056,2918829823,US +2918829824,2918830079,CN +2918830080,2918834175,CA +2918834176,2918842367,US +2918842368,2918875135,CA +2918875136,2918973439,US +2918973440,2918989823,CA +2918989824,2919021503,US +2919021504,2919021535,CA +2919021536,2919055359,US +2919055360,2919057407,CN +2919057408,2919059455,IN +2919059456,2919063551,CN +2919063552,2919064063,MX +2919064064,2919067647,CN +2919067648,2919068247,US +2919068248,2919068255,AU +2919068256,2919070983,US +2919070984,2919070991,GB +2919070992,2919174143,US +2919174144,2919178239,CA +2919178240,2919186431,US +2919186432,2919190527,CA +2919190528,2919204527,US +2919204528,2919204535,NL +2919204536,2919204543,US +2919204544,2919204551,NL +2919204552,2919204747,US +2919204748,2919204755,NL +2919204756,2919205027,US +2919205028,2919205031,NL +2919205032,2919206655,US +2919206656,2919206911,SG +2919206912,2919211007,CA +2919211008,2919235583,US +2919235584,2919759871,CA +2919759872,2921512703,US +2921512704,2921512959,CA +2921512960,2921530367,US +2921530368,2921530623,DE +2921530624,2921536561,US +2921536562,2921536569,CZ +2921536570,2921537434,US +2921537435,2921537435,CZ +2921537436,2921539583,US +2921539584,2921539839,PL +2921539840,2921540095,SE +2921540096,2921540351,DE +2921540352,2921541119,US +2921541120,2921541631,DE +2921541632,2921542143,US +2921542144,2921542399,CA +2921542400,2921542655,GB +2921542656,2921544959,US +2921544960,2921545727,DE +2921545728,2921545983,GB +2921545984,2921546239,IT +2921546240,2921546751,FR +2921546752,2921547007,GB +2921547008,2921547263,FR +2921547264,2921547519,US +2921547520,2921547775,DE +2921547776,2921549055,US +2921549056,2921549311,GB +2921549312,2921549823,NL +2921549824,2921550079,GB +2921550080,2921550335,DE +2921550336,2921550591,IT +2921550592,2921550847,US +2921550848,2921551103,IT +2921551104,2921551359,US +2921551360,2921551615,AR +2921551616,2921551871,BR +2921551872,2921552127,AR +2921552128,2921552383,US +2921552384,2921552639,MX +2921552640,2921552895,US +2921552896,2921553663,BR +2921553664,2921559039,US +2921559040,2921559295,NL +2921559296,2921559551,US +2921559552,2921559553,NL +2921559554,2921559557,GB +2921559558,2921559562,NL +2921559563,2921559802,GB +2921559803,2921559807,NL +2921559808,2921562111,US +2921562112,2921594879,CA +2921594880,2925002751,US +2925002752,2925527039,CA +2925527040,2926575615,US +2926575616,2927099903,CA +2927099904,2927577599,US +2927577600,2927577855,SG +2927577856,2927578623,US +2927578624,2927578879,SG +2927578880,2927581183,US +2927581184,2927581439,SG +2927581440,2927582863,US +2927582864,2927582879,SG +2927582880,2927582935,US +2927582936,2927582943,SG +2927582944,2927981567,US +2927981568,2927982591,SG +2927982592,2928175551,US +2928175552,2928175559,VN +2928175560,2928177151,US +2928177152,2928181247,CA +2928181248,2928200191,US +2928200192,2928200447,AU +2928200448,2928201983,US +2928201984,2928202239,JP +2928202240,2928204799,US +2928204800,2928205055,NZ +2928205056,2928206335,US +2928206336,2928206591,PH +2928206592,2928226303,US +2928226304,2928230399,CA +2928230400,2928261375,US +2928261376,2928261695,CA +2928261696,2928261711,NL +2928261712,2928261887,CA +2928261888,2928263167,US +2928263168,2928279551,CA +2928279552,2928283647,US +2928283648,2928287743,SG +2928287744,2928304127,US +2928304128,2928305151,NL +2928305152,2928306175,US +2928306176,2928307199,NL +2928307200,2928308223,US +2928308224,2928309247,CA +2928309248,2928312319,US +2928312320,2928316415,CA +2928316416,2928320511,HK +2928320512,2928328703,US +2928328704,2928336895,CA +2928336896,2928455679,US +2928455680,2928459775,CA +2928459776,2928474623,US +2928474624,2928474879,GB +2928474880,2928475135,FR +2928475136,2928541695,US +2928541696,2928553303,CA +2928553304,2928553311,HU +2928553312,2928555831,CA +2928555832,2928555839,SE +2928555840,2928558943,CA +2928558944,2928558951,PE +2928558952,2928564447,CA +2928564448,2928564455,MX +2928564456,2928570671,CA +2928570672,2928570687,FR +2928570688,2928579543,CA +2928579544,2928579551,HU +2928579552,2928583735,CA +2928583736,2928583743,SY +2928583744,2928583983,CA +2928583984,2928583991,SE +2928583992,2928588399,CA +2928588400,2928588407,AE +2928588408,2928595959,CA +2928595960,2928595967,US +2928595968,2928598919,CA +2928598920,2928598927,SA +2928598928,2928607231,CA +2928607232,2928633199,US +2928633200,2928633215,CA +2928633216,2936012799,US +2936012800,2937847807,CN +2937847808,2937848831,KH +2937848832,2937849855,JP +2937849856,2937850879,SG +2937850880,2937851903,MY +2937851904,2937855999,JP +2937856000,2937860095,KR +2937860096,2937864191,JP +2937864192,2937880575,SG +2937880576,2937913343,JP +2937913344,2937978879,BD +2937978880,2938109951,CN +2938109952,2938634239,AU +2938634240,2938699775,IN +2938699776,2938700031,PH +2938700032,2938700033,ID +2938700034,2938700043,TW +2938700044,2938700044,ID +2938700045,2938700046,TW +2938700047,2938700161,ID +2938700162,2938700173,TW +2938700174,2938700174,ID +2938700175,2938700183,TW +2938700184,2938700184,ID +2938700185,2938700190,TW +2938700191,2938700193,ID +2938700194,2938700222,TW +2938700223,2938700287,ID +2938700288,2938700543,AE +2938700544,2938700586,SG +2938700587,2938700589,HK +2938700590,2938700590,SG +2938700591,2938700592,HK +2938700593,2938700596,SG +2938700597,2938700597,HK +2938700598,2938700600,SG +2938700601,2938700601,HK +2938700602,2938700649,SG +2938700650,2938700670,HK +2938700671,2938701055,SG +2938701056,2938701311,IQ +2938701312,2938701567,HK +2938701568,2938702079,IN +2938702080,2938703103,HK +2938703104,2938703359,IL +2938703360,2938703615,EG +2938703616,2938703871,IN +2938703872,2938707967,HK +2938707968,2938710015,JP +2938710016,2938711039,AU +2938711040,2938712063,BD +2938712064,2938716159,TW +2938716160,2938732543,JP +2938732544,2938748927,SG +2938748928,2938765311,JP +2938765312,2938961919,CN +2938961920,2938978303,HK +2938978304,2938986495,AU +2938986496,2938986751,NZ +2938986752,2938988031,AU +2938988032,2938988287,NZ +2938988288,2938996735,AU +2938996736,2938998783,JP +2938998784,2939002879,AU +2939002880,2939004927,KR +2939004928,2939006975,JP +2939006976,2939007999,KP +2939008000,2939009023,IN +2939009024,2939011071,ID +2939011072,2939027455,KR +2939027456,2942304255,CN +2942304256,2942566399,TW +2942566400,2942599167,KH +2942599168,2942608383,IN +2942608384,2942608639,HK +2942608640,2942608895,US +2942608896,2942609407,HK +2942609408,2942615551,IN +2942615552,2942619647,HK +2942619648,2942631935,JP +2942631936,2942697471,IN +2942697472,2942763007,CN +2942763008,2942767103,JP +2942767104,2942771199,AU +2942771200,2942779391,ID +2942779392,2942795775,VN +2942795776,2942959615,JP +2942959616,2942960639,VN +2942960640,2942961663,AU +2942961664,2942965759,ID +2942965760,2942967807,AU +2942967808,2942975999,AF +2942976000,2942992383,KR +2942992384,2943025151,CN +2943025152,2943041535,PK +2943041536,2943057919,KR +2943057920,2943074303,AU +2943074304,2943090687,PK +2943090688,2943221759,JP +2943221760,2943291391,PK +2943291392,2943295487,KR +2943295488,2943303679,TW +2943303680,2943309823,JP +2943309824,2943310847,ID +2943310848,2943311871,JP +2943311872,2943312895,HK +2943312896,2943313919,NZ +2943313920,2943314943,SG +2943314944,2943315967,CN +2943315968,2943318015,ID +2943318016,2943320063,JP +2943320064,2943324159,IN +2943324160,2943332351,CN +2943332352,2943333375,AU +2943333376,2943334399,IN +2943334400,2943335423,CN +2943335424,2943336447,IN +2943336448,2943352831,TW +2943352832,2944401407,KR +2944401408,2944925695,JP +2944925696,2945581055,MY +2945581056,2946236415,CN +2946236416,2946301951,SG +2946301952,2946367487,LK +2946367488,2946375679,KR +2946375680,2946383871,ID +2946383872,2946392063,IN +2946392064,2946393087,CN +2946393088,2946394111,HK +2946394112,2946396159,AU +2946396160,2946400255,JP +2946400256,2946416639,NC +2946416640,2946433023,PH +2946433024,2946498559,HK +2946498560,2947547135,CN +2947547136,2947579903,PH +2947579904,2947583999,KR +2947584000,2947586047,TO +2947586048,2947587071,HK +2947587072,2947588095,CN +2947588096,2947590143,ID +2947590144,2947590655,JP +2947590656,2947590911,SG +2947590912,2947590927,HK +2947590928,2947591023,SG +2947591024,2947591031,HK +2947591032,2947591039,SG +2947591040,2947591071,HK +2947591072,2947591090,SG +2947591091,2947591091,HK +2947591092,2947591167,SG +2947591168,2947591183,HK +2947591184,2947591679,SG +2947591680,2947591695,JP +2947591696,2947592191,SG +2947592192,2947593215,CN +2947593216,2947594239,HK +2947594240,2947595263,IN +2947595264,2947596287,CN +2947597312,2947598335,JP +2947598336,2947602431,AU +2947602432,2947603455,NZ +2947603456,2947604479,TH +2947604480,2947609855,HK +2947609856,2947610111,AF +2947610112,2947612671,HK +2947612672,2947678207,JP +2947678208,2947743743,CN +2947743744,2947809279,JP +2947809280,2948071423,TW +2948071424,2948104191,JP +2948104192,2948120575,CN +2948120576,2948128767,AU +2948128768,2948132863,ID +2948132864,2948134911,TW +2948134912,2948135935,ID +2948135936,2948136959,IN +2948136960,2948595711,CN +2948595712,2952790015,KR +2952790016,2953314303,DE +2953314304,2953379839,UA +2953379840,2953445375,DE +2953445376,2953453567,IT +2953453568,2953455615,IS +2953455616,2953457663,SK +2953457664,2953459711,DE +2953459712,2953461759,IT +2953461760,2953465855,ES +2953465856,2953466127,GB +2953466368,2953466879,GB +2953466880,2953467135,RO +2953467392,2953467903,GB +2953467904,2953469951,BE +2953469952,2953478143,CH +2953478144,2953503551,SE +2953503552,2953503559,NO +2953503560,2953510911,SE +2953510912,2953576447,NO +2953576448,2953592831,BG +2953592832,2953596927,IR +2953596928,2953598975,ES +2953598976,2953601023,IT +2953601024,2953603071,RU +2953603072,2953605119,GB +2953605120,2953609215,CZ +2953609216,2953707519,IL +2953707520,2953838591,RU +2953838592,2954100735,SA +2954100736,2954362879,DK +2954362880,2954625023,GB +2954625024,2954641407,DE +2954641408,2954643455,RU +2954643456,2954645503,IQ +2954645504,2954647551,AZ +2954647552,2954657791,ES +2954657792,2954756095,JO +2954756096,2954821631,TR +2954821632,2954821947,FR +2954821948,2954821951,DE +2954821952,2954822079,FR +2954822080,2954822143,ES +2954822144,2954822279,FR +2954822280,2954822283,ES +2954822284,2954822323,FR +2954822324,2954822327,FI +2954822328,2954822447,FR +2954822448,2954822455,ES +2954822456,2954822591,FR +2954822592,2954822599,GB +2954822600,2954822927,FR +2954822928,2954822931,DE +2954822932,2954823259,FR +2954823260,2954823263,GB +2954823264,2954823687,FR +2954823688,2954823695,NL +2954823696,2954823887,FR +2954823888,2954823891,ES +2954823892,2954823999,FR +2954824000,2954824015,ES +2954824016,2954824095,FR +2954824096,2954824127,FI +2954824128,2954824255,FR +2954824256,2954824259,ES +2954824260,2954824287,FR +2954824288,2954824319,ES +2954824320,2954824351,DE +2954824352,2954824415,FR +2954824416,2954824431,GB +2954824432,2954824511,FR +2954824512,2954824527,FI +2954824528,2954824639,FR +2954824640,2954824655,GB +2954824656,2954824687,FR +2954824688,2954824703,FI +2954824704,2954824923,FR +2954824924,2954824927,ES +2954824928,2954824991,FR +2954824992,2954825007,ES +2954825008,2954825063,FR +2954825064,2954825067,ES +2954825068,2954825183,FR +2954825184,2954825191,ES +2954825192,2954825247,FR +2954825248,2954825263,GB +2954825264,2954825267,PL +2954825268,2954825311,FR +2954825312,2954825315,GB +2954825316,2954825319,ES +2954825320,2954825387,FR +2954825388,2954825391,ES +2954825392,2954825403,FR +2954825404,2954825407,ES +2954825408,2954825535,FR +2954825536,2954825539,ES +2954825540,2954825663,FR +2954825664,2954825727,GB +2954825728,2954826015,FR +2954826016,2954826019,PT +2954826020,2954826031,FR +2954826032,2954826035,ES +2954826036,2954826143,FR +2954826144,2954826147,CZ +2954826148,2954826159,FR +2954826160,2954826163,ES +2954826164,2954826471,FR +2954826472,2954826475,GB +2954826476,2954826759,FR +2954826760,2954826763,ES +2954826764,2954826775,FR +2954826776,2954826779,ES +2954826780,2954826815,FR +2954826816,2954826879,GB +2954826880,2954827007,FR +2954827008,2954827135,ES +2954827136,2954827599,FR +2954827600,2954827615,BE +2954827616,2954827647,NL +2954827648,2954827799,FR +2954827800,2954827807,DE +2954827808,2954827939,FR +2954827940,2954827943,PT +2954827944,2954828335,FR +2954828336,2954828339,ES +2954828340,2954828511,FR +2954828512,2954828543,CZ +2954828544,2954828847,FR +2954828848,2954828863,GB +2954828864,2954828975,FR +2954828976,2954828979,GB +2954828980,2954829007,FR +2954829008,2954829023,IE +2954829024,2954829407,FR +2954829408,2954829423,ES +2954829424,2954829623,FR +2954829624,2954829631,ES +2954829632,2954829647,GB +2954829648,2954829679,FR +2954829680,2954829695,NL +2954829696,2954829711,ES +2954829712,2954829739,FR +2954829740,2954829743,GB +2954829744,2954829751,FR +2954829752,2954829752,ES +2954829753,2954829759,FR +2954829760,2954829823,ES +2954829824,2954829843,FR +2954829844,2954829847,DE +2954829848,2954829855,FI +2954829856,2954830111,FR +2954830112,2954830127,IE +2954830128,2954830163,FR +2954830164,2954830167,PT +2954830168,2954830395,FR +2954830396,2954830399,ES +2954830400,2954830523,FR +2954830524,2954830527,DE +2954830528,2954831247,FR +2954831248,2954831251,ES +2954831252,2954831807,FR +2954831808,2954831823,ES +2954831824,2954832003,FR +2954832004,2954832007,BE +2954832008,2954832031,FR +2954832032,2954832063,PL +2954832064,2954832151,FR +2954832152,2954832155,DE +2954832156,2954832159,FR +2954832160,2954832167,PT +2954832168,2954832255,FR +2954832256,2954832287,GB +2954832288,2954832343,FR +2954832344,2954832347,CH +2954832348,2954832351,ES +2954832352,2954832399,FR +2954832400,2954832415,FI +2954832416,2954832447,FR +2954832448,2954832479,CZ +2954832480,2954832607,FR +2954832608,2954832639,PT +2954832640,2954832767,FR +2954832768,2954832771,DE +2954832772,2954832843,FR +2954832844,2954832847,GB +2954832848,2954832891,FR +2954832892,2954832895,ES +2954832896,2954833343,FR +2954833344,2954833375,GB +2954833376,2954833419,FR +2954833420,2954833423,PL +2954833424,2954833455,FR +2954833456,2954833471,ES +2954833472,2954833567,FR +2954833568,2954833571,ES +2954833572,2954833727,FR +2954833728,2954833731,ES +2954833732,2954833823,FR +2954833824,2954833855,GB +2954833856,2954833967,FR +2954833968,2954833983,ES +2954833984,2954834143,FR +2954834144,2954834151,GB +2954834152,2954834519,FR +2954834520,2954834523,ES +2954834524,2954834611,FR +2954834612,2954834615,ES +2954834616,2954834671,FR +2954834672,2954834675,ES +2954834676,2954834847,FR +2954834848,2954834863,ES +2954834864,2954835039,FR +2954835040,2954835043,DE +2954835044,2954835067,FR +2954835068,2954835071,FI +2954835072,2954835295,FR +2954835296,2954835299,ES +2954835300,2954835419,FR +2954835420,2954835423,GB +2954835424,2954835443,FR +2954835444,2954835447,ES +2954835448,2954835451,FR +2954835452,2954835455,ES +2954835456,2954835511,FR +2954835512,2954835519,ES +2954835520,2954835619,FR +2954835620,2954835620,ES +2954835621,2954835647,FR +2954835648,2954835655,ES +2954835656,2954836963,FR +2954836964,2954836967,IE +2954836968,2954836983,FR +2954836984,2954836991,PT +2954836992,2954837071,FR +2954837072,2954837075,ES +2954837076,2954837279,FR +2954837280,2954837295,DE +2954837296,2954837311,FR +2954837312,2954837319,FI +2954837320,2954837327,FR +2954837328,2954837335,GB +2954837336,2954837439,FR +2954837440,2954837471,GB +2954837472,2954837535,FR +2954837536,2954837543,PT +2954837544,2954837579,FR +2954837580,2954837583,GB +2954837584,2954837599,FR +2954837600,2954837607,GB +2954837608,2954837667,FR +2954837668,2954837671,ES +2954837672,2954837743,FR +2954837744,2954837751,CZ +2954837752,2954837759,BE +2954837760,2954837827,FR +2954837828,2954837831,DE +2954837832,2954837867,FR +2954837868,2954837871,ES +2954837872,2954838103,FR +2954838104,2954838107,DE +2954838108,2954838155,FR +2954838156,2954838159,BE +2954838160,2954838175,FR +2954838176,2954838179,GB +2954838180,2954838215,FR +2954838216,2954838219,GB +2954838220,2954838247,FR +2954838248,2954838255,ES +2954838256,2954838599,FR +2954838600,2954838607,GB +2954838608,2954838655,FR +2954838656,2954838687,BE +2954838688,2954838911,FR +2954838912,2954838915,DE +2954838916,2954838991,FR +2954838992,2954838995,DE +2954838996,2954839071,FR +2954839072,2954839087,LT +2954839088,2954839111,FR +2954839112,2954839119,ES +2954839120,2954839243,FR +2954839244,2954839247,ES +2954839248,2954839267,FR +2954839268,2954839271,ES +2954839272,2954839319,FR +2954839320,2954839327,GB +2954839328,2954839527,FR +2954839528,2954839535,GB +2954839536,2954839543,FR +2954839544,2954839547,NL +2954839548,2954840095,FR +2954840096,2954840103,ES +2954840104,2954840255,FR +2954840256,2954840447,GB +2954840448,2954840515,FR +2954840516,2954840519,NL +2954840520,2954840611,FR +2954840612,2954840615,GB +2954840616,2954840767,FR +2954840768,2954840775,GB +2954840776,2954840927,FR +2954840928,2954840931,DE +2954840932,2954841023,FR +2954841024,2954841087,ES +2954841088,2954841095,FR +2954841096,2954841103,GB +2954841104,2954841111,ES +2954841112,2954841259,FR +2954841260,2954841263,GB +2954841264,2954841583,FR +2954841584,2954841591,ES +2954841592,2954841707,FR +2954841708,2954841711,NL +2954841712,2954841851,FR +2954841852,2954841855,ES +2954841856,2954841999,FR +2954842000,2954842015,LT +2954842016,2954842075,FR +2954842076,2954842079,GB +2954842080,2954842111,FR +2954842112,2954842143,FI +2954842144,2954842175,FR +2954842176,2954842239,BE +2954842240,2954842243,ES +2954842244,2954842247,FR +2954842248,2954842251,ES +2954842252,2954842375,FR +2954842376,2954842383,ES +2954842384,2954842411,FR +2954842412,2954842415,GB +2954842416,2954842471,FR +2954842472,2954842479,GB +2954842480,2954843043,FR +2954843044,2954843047,GB +2954843048,2954843187,FR +2954843188,2954843191,GB +2954843192,2954843479,FR +2954843480,2954843487,NL +2954843488,2954843503,FR +2954843504,2954843507,ES +2954843508,2954843759,FR +2954843760,2954843771,ES +2954843772,2954844147,FR +2954844148,2954844151,DE +2954844152,2954844191,FR +2954844192,2954844223,NL +2954844224,2954844239,DE +2954844240,2954844263,FR +2954844264,2954844267,IE +2954844268,2954844275,FR +2954844276,2954844279,GB +2954844280,2954844943,FR +2954844944,2954844947,GB +2954844948,2954844999,FR +2954845000,2954845003,ES +2954845004,2954845055,FR +2954845056,2954845059,PT +2954845060,2954845087,FR +2954845088,2954845091,FI +2954845092,2954845283,FR +2954845284,2954845287,GB +2954845288,2954845291,PL +2954845292,2954845363,FR +2954845364,2954845367,ES +2954845368,2954845951,FR +2954845952,2954845967,ES +2954845968,2954846107,FR +2954846108,2954846111,ES +2954846112,2954846119,FR +2954846120,2954846123,IE +2954846124,2954846139,FR +2954846140,2954846143,ES +2954846144,2954854415,FR +2954854416,2954854431,GB +2954854432,2954854607,FR +2954854608,2954854615,ES +2954854616,2954854751,FR +2954854752,2954854783,PT +2954854784,2954855051,FR +2954855052,2954855055,ES +2954855056,2954855059,FR +2954855060,2954855063,ES +2954855064,2954855075,FR +2954855076,2954855079,ES +2954855080,2954855167,FR +2954855168,2954855183,ES +2954855184,2954855507,FR +2954855508,2954855511,DE +2954855512,2954855515,FR +2954855516,2954855519,ES +2954855520,2954855527,FR +2954855528,2954855535,ES +2954855536,2954855647,FR +2954855648,2954855651,CZ +2954855652,2954855663,FR +2954855664,2954855679,PT +2954855680,2954855743,FR +2954855744,2954855807,BE +2954855808,2954855871,DE +2954855872,2954855879,FR +2954855880,2954855887,ES +2954855888,2954856179,FR +2954856180,2954856183,ES +2954856184,2954856447,FR +2954856448,2954856511,ES +2954856512,2954856559,FR +2954856560,2954856563,ES +2954856564,2954856631,FR +2954856632,2954856635,GB +2954856636,2954857119,FR +2954857120,2954857135,PT +2954857136,2954857583,FR +2954857584,2954857599,ES +2954857600,2954857823,FR +2954857824,2954857855,ES +2954857856,2954857983,IE +2954857984,2954858031,FR +2954858032,2954858035,GB +2954858036,2954858043,FR +2954858044,2954858047,PT +2954858048,2954858079,FR +2954858080,2954858095,ES +2954858096,2954858431,FR +2954858432,2954858439,GB +2954858440,2954858495,FR +2954858496,2954858751,ES +2954858752,2954858827,FR +2954858828,2954858831,GB +2954858832,2954858911,FR +2954858912,2954858943,ES +2954858944,2954859027,FR +2954859028,2954859031,PT +2954859032,2954859043,FR +2954859044,2954859047,ES +2954859048,2954859315,FR +2954859316,2954859319,ES +2954859320,2954859323,FR +2954859324,2954859327,ES +2954859328,2954859455,FR +2954859456,2954859471,DE +2954859472,2954859871,FR +2954859872,2954859903,ES +2954859904,2954859959,FR +2954859960,2954859963,ES +2954859964,2954860459,FR +2954860460,2954860463,GB +2954860464,2954861651,FR +2954861652,2954861655,GB +2954861656,2954861763,FR +2954861764,2954861767,GB +2954861768,2954861867,FR +2954861868,2954861871,CZ +2954861872,2954861875,FR +2954861876,2954861879,CH +2954861880,2954861959,FR +2954861960,2954861967,GB +2954861968,2954861975,ES +2954861976,2954861987,FR +2954861988,2954861991,BE +2954861992,2954862079,FR +2954862080,2954862095,ES +2954862096,2954862287,FR +2954862288,2954862303,LT +2954862304,2954862415,FR +2954862416,2954862419,ES +2954862420,2954862479,FR +2954862480,2954862495,ES +2954862496,2954865663,FR +2954865664,2954865919,ES +2954865920,2954867041,FR +2954867042,2954867043,PT +2954867044,2954870799,FR +2954870800,2954870803,ES +2954870804,2954870843,FR +2954870844,2954870847,ES +2954870848,2954870903,FR +2954870904,2954870907,ES +2954870908,2954871615,FR +2954871616,2954871623,BE +2954871624,2954871679,FR +2954871680,2954871695,FI +2954871696,2954871759,FR +2954871760,2954871775,PL +2954871776,2954871807,FR +2954871808,2954871823,ES +2954871824,2954871955,FR +2954871956,2954871959,PT +2954871960,2954871983,FR +2954871984,2954871999,PT +2954872000,2954872331,FR +2954872332,2954872335,GB +2954872336,2954872551,FR +2954872552,2954872555,GB +2954872556,2954872607,FR +2954872608,2954872639,ES +2954872640,2954872679,FR +2954872680,2954872687,ES +2954872688,2954873351,FR +2954873352,2954873355,GB +2954873356,2954873695,FR +2954873696,2954873727,FI +2954873728,2954873839,FR +2954873840,2954873847,ES +2954873848,2954873879,FR +2954873880,2954873887,PT +2954873888,2954873919,FR +2954873920,2954873983,IE +2954873984,2954874111,GB +2954874112,2954874127,FR +2954874128,2954874135,ES +2954874136,2954874347,FR +2954874348,2954874355,ES +2954874356,2954874415,FR +2954874416,2954874419,GB +2954874420,2954874431,FR +2954874432,2954874447,GB +2954874448,2954874527,FR +2954874528,2954874559,FI +2954874560,2954874655,FR +2954874656,2954874663,DE +2954874664,2954874943,FR +2954874944,2954874975,ES +2954874976,2954875075,FR +2954875076,2954875079,BE +2954875080,2954875135,FR +2954875136,2954875167,GB +2954875168,2954875467,FR +2954875468,2954875471,GB +2954875472,2954875583,FR +2954875584,2954875587,ES +2954875588,2954875711,FR +2954875712,2954875775,DE +2954875776,2954875879,FR +2954875880,2954875883,ES +2954875884,2954875891,FR +2954875892,2954875895,ES +2954875896,2954875967,FR +2954875968,2954875999,FI +2954876000,2954876043,FR +2954876044,2954876047,GB +2954876048,2954876247,FR +2954876248,2954876255,ES +2954876256,2954876351,FR +2954876352,2954876383,ES +2954876384,2954876559,FR +2954876560,2954876575,LT +2954876576,2954876655,FR +2954876656,2954876663,BE +2954876664,2954876871,FR +2954876872,2954876875,ES +2954876876,2954876887,FR +2954876888,2954876891,ES +2954876892,2954877103,FR +2954877104,2954877107,PL +2954877108,2954877163,FR +2954877164,2954877167,ES +2954877168,2954877523,FR +2954877524,2954877527,ES +2954877528,2954877535,PT +2954877536,2954877727,FR +2954877728,2954877743,IE +2954877744,2954877759,FR +2954877760,2954877775,CZ +2954877776,2954877819,FR +2954877820,2954877823,ES +2954877824,2954877967,FR +2954877968,2954877983,PT +2954877984,2954878143,FR +2954878144,2954878207,ES +2954878208,2954878271,FR +2954878272,2954878335,IT +2954878336,2954878471,FR +2954878472,2954878475,GB +2954878476,2954878607,FR +2954878608,2954878623,FI +2954878624,2954878695,FR +2954878696,2954878703,IE +2954878704,2954878855,FR +2954878856,2954878863,IE +2954878864,2954878899,FR +2954878900,2954878903,GB +2954878904,2954878907,FR +2954878908,2954878911,ES +2954878912,2954878931,FR +2954878932,2954878935,GB +2954878936,2954887167,FR +2954887168,2954891263,UA +2954891264,2954895359,IT +2954895360,2954897407,RU +2954897408,2954899455,DE +2954899456,2954901503,ES +2954901504,2954903551,IT +2954903552,2954911743,JP +2954911744,2954913791,US +2954913792,2954915839,IE +2954915840,2954918911,US +2954918912,2954919167,NL +2954919168,2954919295,US +2954919296,2954919423,NL +2954919424,2954919935,IE +2954919936,2954928127,RU +2954928128,2954932223,PL +2954932224,2954936319,RU +2954936320,2954938367,AM +2954938368,2954940415,HU +2954940416,2954944511,DE +2954944512,2954946559,GB +2954946560,2954948607,DE +2954948608,2954950655,RU +2954950656,2954952703,ES +2954952704,2955018239,TR +2955018240,2955027726,JP +2955027727,2955027727,IE +2955027728,2955034623,JP +2955034624,2955083775,IE +2955083776,2955149311,GB +2955149312,2955411455,UA +2955411456,2955673599,TR +2955673600,2955804671,SA +2955804672,2955837439,EE +2955837440,2955845631,IR +2955845632,2955853823,GB +2955853824,2955870207,CH +2955870208,2955935743,SA +2955935744,2956230655,RU +2956230656,2956238847,SI +2956238848,2956240383,ES +2956240384,2956240895,HK +2956240896,2956242943,ES +2956244992,2956245247,FR +2956245248,2956245503,RO +2956245504,2956245759,GB +2956245760,2956246015,DE +2956246016,2956247039,FR +2956247040,2956251135,DE +2956251136,2956253183,GB +2956253184,2956255231,IE +2956255232,2956259327,FR +2956259328,2956261375,DE +2956261376,2956263423,ES +2956263424,2956296191,TR +2956312576,2956328959,RU +2956328960,2956460031,TR +2956460032,2956468223,RU +2956468224,2956470271,LV +2956472320,2956474367,RU +2956474368,2956476415,GB +2956476416,2956492799,ES +2956492800,2956496895,CH +2956496896,2956500991,IR +2956500992,2956503039,NL +2956503040,2956504063,CY +2956504064,2956504319,CH +2956504320,2956504575,NL +2956504576,2956504831,CH +2956504832,2956506111,NL +2956506112,2956506367,GB +2956506368,2956509183,NL +2956509184,2956517375,GB +2956517376,2956521471,NL +2956521472,2956525567,SE +2956525568,2956533759,JO +2956533760,2956535807,FR +2956535808,2956537855,LV +2956537856,2956541951,UA +2956544000,2956546047,RU +2956546048,2956548095,FR +2956548096,2956549119,SE +2956549120,2956550143,SI +2956550144,2956554239,ES +2956554240,2956558335,IT +2956558336,2956574719,DE +2956574720,2956576767,SE +2956576768,2956578815,ES +2956578816,2956582911,RU +2956582912,2956587007,IS +2956587008,2956589055,FR +2956589056,2956593151,GB +2956593152,2956595199,ES +2956595200,2956597247,PL +2956597248,2956599295,NL +2956599296,2956602367,RU +2956602368,2956602623,NL +2956602624,2956602879,SE +2956602880,2956603135,GB +2956603136,2956604671,RU +2956604672,2956604927,NL +2956604928,2956605183,RU +2956605184,2956605439,NL +2956605440,2956605695,DE +2956605696,2956607487,RU +2956607488,2956611583,PS +2956611584,2956613631,IT +2956614912,2956615167,NL +2956615168,2956615423,FR +2956615680,2956623871,GB +2956623872,2956656639,GR +2956656640,2956722175,RU +2956722176,2956787711,BY +2956787712,2956820479,IE +2956820480,2956822527,NL +2956822528,2956823807,SE +2956823808,2956824063,BE +2956824064,2956824575,SE +2956824576,2956826623,PT +2956826624,2956828671,HR +2956828672,2956833279,BA +2956833280,2956833791,AT +2956833792,2956836863,BA +2956836864,2956853247,SK +2956853248,2956865535,HR +2956865536,2956869631,IT +2956869632,2956886015,RU +2956886016,2956888063,GB +2956888064,2956890111,BE +2956890112,2956892159,IR +2956892160,2956894207,IT +2956894208,2956898303,BE +2956898304,2956902399,RU +2956902400,2956904447,NL +2956904448,2956906495,DK +2956906496,2956908543,GB +2956908544,2956910591,RU +2956910592,2956914687,CZ +2956914688,2956918783,RU +2956918784,2956984319,HU +2956984320,2957049855,SE +2957049856,2957058047,PS +2957058048,2957066239,RU +2957066240,2957068287,GB +2957068288,2957070335,LU +2957070336,2957074431,IT +2957074432,2957082623,RU +2957082624,2957090815,DE +2957090816,2957115391,IR +2957115392,2957180927,AT +2957180928,2957189119,UA +2957189120,2957193215,LV +2957193216,2957195263,RU +2957195264,2957197311,PS +2957197312,2957201407,IR +2957201408,2957201423,GB +2957201424,2957202679,US +2957202680,2957202680,PT +2957202681,2957202687,US +2957202688,2957202691,RU +2957202692,2957202699,IE +2957202700,2957202703,JP +2957202704,2957202944,US +2957202945,2957202947,AL +2957202948,2957202951,AD +2957202952,2957202955,AR +2957202956,2957202959,AU +2957202960,2957202963,BY +2957202964,2957202967,BE +2957202968,2957202971,BA +2957202972,2957202975,BR +2957202976,2957202979,BG +2957202980,2957202983,CL +2957202984,2957202987,CN +2957202988,2957202991,CO +2957202992,2957202995,CR +2957202996,2957202999,HR +2957203000,2957203003,CY +2957203004,2957203007,CZ +2957203008,2957203011,DK +2957203012,2957203015,EG +2957203016,2957203019,EE +2957203020,2957203023,FJ +2957203024,2957203027,FI +2957203028,2957203031,FR +2957203032,2957203035,GE +2957203036,2957203039,DE +2957203040,2957203043,GR +2957203044,2957203047,HK +2957203048,2957203051,HU +2957203052,2957203055,IS +2957203056,2957203059,IN +2957203060,2957203063,IE +2957203064,2957203067,IL +2957203068,2957203071,IT +2957203072,2957203075,JP +2957203076,2957203079,KR +2957203080,2957203083,LV +2957203084,2957203087,LI +2957203088,2957203091,LT +2957203092,2957203095,LU +2957203096,2957203099,MK +2957203100,2957203103,MY +2957203104,2957203107,MX +2957203108,2957203111,NL +2957203112,2957203115,NZ +2957203116,2957203119,NO +2957203120,2957203123,US +2957203124,2957203127,MT +2957203128,2957203131,XK +2957203132,2957203196,GB +2957203197,2957203199,US +2957203200,2957203455,GB +2957203456,2957205503,FR +2957205504,2957213695,PS +2957213696,2957221887,FR +2957221888,2957223935,GB +2957223936,2957223999,FR +2957224000,2957224063,GB +2957224064,2957224191,FR +2957224192,2957224447,DE +2957224448,2957224959,GB +2957224960,2957225215,FR +2957225216,2957228031,GB +2957228032,2957230079,DK +2957230080,2957238271,RS +2957238272,2957240319,CZ +2957240320,2957242367,BG +2957242368,2957244415,RU +2957244416,2957246463,HU +2957246464,2957336575,SE +2957336576,2957344767,KZ +2957344768,2957352959,SE +2957352960,2957361151,KZ +2957361152,2957508607,SE +2957508608,2957574143,FI +2957574144,2957639679,GE +2957639680,2957641727,GB +2957641728,2957643775,RU +2957643776,2957647871,GB +2957647872,2957649919,FR +2957649920,2957651967,CH +2957651968,2957654015,AE +2957654016,2957656063,DE +2957656064,2957672447,GE +2957672448,2957680639,CZ +2957680640,2957688831,GB +2957688832,2957690879,SE +2957690880,2957692927,RU +2957692928,2957694975,NO +2957694976,2957697023,CZ +2957697024,2957705215,NL +2957705216,2957770751,NO +2957770752,2957836287,SI +2957836288,2957869055,RU +2957869056,2957901823,HU +2957901824,2958032895,PT +2958032896,2958557183,ES +2958557184,2958819327,TR +2958819328,2958884863,GR +2958884864,2958950399,FI +2958950400,2959081471,DE +2959081472,2959089663,RU +2959089664,2959093759,PL +2959093760,2959097855,RO +2959097856,2959099903,RU +2959099904,2959101951,UA +2959101952,2959103999,RU +2959104000,2959106047,RO +2959106048,2959114239,AT +2959114240,2959118335,RU +2959118336,2959120383,PL +2959120384,2959122431,AT +2959122432,2959126527,PL +2959126528,2959128575,RO +2959128576,2959130623,RU +2959130624,2959138815,UA +2959138816,2959147007,RU +2959147008,2959149055,UA +2959149056,2959151103,CZ +2959151104,2959155199,PL +2959155200,2959159295,RU +2959159296,2959161343,PL +2959161344,2959163391,UA +2959163392,2959167487,GB +2959167488,2959171583,PL +2959171584,2959175679,RU +2959175680,2959179775,UA +2959179776,2959181823,RU +2959181824,2959183871,PL +2959183872,2959185919,RO +2959186944,2959187455,CY +2959187456,2959187711,AT +2959187712,2959187967,FR +2959187968,2959204351,RU +2959204352,2959208447,ES +2959208448,2959210495,CZ +2959210496,2959212543,PL +2959212544,2959220735,UA +2959224832,2959226879,RU +2959226880,2959228927,RO +2959228928,2959237119,UA +2959237120,2959241215,CZ +2959241216,2959245311,PL +2959245312,2959253503,RU +2959253504,2959255551,DE +2959255552,2959261695,RU +2959261696,2959265791,KZ +2959265792,2959269887,ES +2959269888,2959275007,KZ +2959275008,2959278079,CZ +2959278080,2959282175,RU +2959282176,2959286271,SA +2959286272,2959290367,RO +2959290368,2959292415,PL +2959292416,2959302655,RU +2959302656,2959308877,UA +2959308878,2959308878,RU +2959308879,2959310847,UA +2959310848,2959343615,RU +2959343616,2959351807,UA +2959353856,2959355903,RU +2959355904,2959357951,KZ +2959357952,2959359999,UA +2959360000,2959384575,RU +2959384576,2959392767,UA +2959392768,2959394815,PL +2959394816,2959398911,ES +2959398912,2959400959,RU +2959400960,2959405055,ES +2959405056,2959413247,RU +2959413248,2959417343,ES +2959417344,2959423487,IR +2959423488,2959427583,RU +2959427584,2959429631,ES +2959429632,2959431679,PL +2959431680,2959433727,RU +2959433728,2959441919,UA +2959441920,2959446015,PL +2959446016,2959450111,CZ +2959450112,2959452159,PL +2959454208,2959456255,SK +2959456256,2959466495,UA +2959466496,2959474687,RU +2959474688,2959491071,UA +2959491072,2959493119,NL +2959493120,2959495167,CZ +2959495168,2959499263,PL +2959499264,2959505407,SK +2959505408,2959507455,RO +2959507456,2959515647,CZ +2959515648,2959517695,RU +2959517696,2959519743,DE +2959519744,2959523839,PL +2959523840,2959532031,UA +2959532032,2959540223,IR +2959540224,2959548415,UA +2959548416,2959552511,PL +2959552512,2959558655,UA +2959558656,2959560703,PL +2959560704,2959568895,RU +2959568896,2959570943,UA +2959570944,2959572991,RO +2959572992,2959581183,RU +2959581184,2959585279,PL +2959585280,2959591423,LV +2959591424,2959595519,UA +2959595520,2959597567,RS +2959597568,2959601663,UA +2959601664,2959603711,RO +2959603712,2959605759,IT +2959605760,2959632383,UA +2959632384,2959634431,RS +2959634432,2959636479,PL +2959636480,2959648767,RU +2959648768,2959650815,UA +2959650816,2959652863,PL +2959652864,2959654911,UA +2959654912,2959663103,RU +2959663104,2959704063,UA +2959704064,2959708159,PL +2959712256,2959728639,UA +2959736832,2959738879,UA +2959738880,2959745023,RU +2959745024,2959747071,PL +2959747072,2959749119,PS +2959749120,2959753215,LV +2959753216,2959761407,RU +2959761408,2959763455,LV +2959763456,2959765503,PL +2959765504,2959767551,GB +2959767552,2959769599,RS +2959769600,2959777791,RU +2959777792,2959783935,LV +2959783936,2959785983,SK +2959785984,2959794175,UA +2959794176,2959796223,IL +2959796224,2959806463,RU +2959806464,2959810559,SK +2959810560,2959814655,PL +2959814656,2959818751,UA +2959818752,2959822847,RO +2959822848,2959824895,RU +2959824896,2959826943,UA +2959826944,2959828991,RU +2959828992,2959833087,PL +2959833088,2959835135,CZ +2959835136,2959843327,IT +2959843328,2959845375,RU +2959845376,2959847423,PL +2959847424,2959853567,UA +2959853568,2959867903,RU +2959867904,2959876095,UA +2959876096,2959880191,RS +2959880192,2959882239,RU +2959882240,2959884287,BA +2959884288,2959892479,KZ +2959892480,2959900671,UA +2959900672,2959902719,PL +2959902720,2959915007,RU +2959915008,2959917055,UA +2959917056,2959925247,RU +2959925248,2959927295,RO +2959927296,2959929343,UA +2959929344,2959935487,RU +2959935488,2959937535,UA +2959937536,2959945727,RU +2959945728,2959947775,PL +2959947776,2959949823,SK +2959949824,2959966207,RU +2959966208,2959968255,PL +2959968256,2959970303,RS +2959970304,2959974399,RU +2959974400,2959976447,PL +2959976448,2960015359,UA +2960015360,2960023551,RU +2960023552,2960024575,IT +2960024576,2960024831,SA +2960025088,2960025599,UA +2960025600,2960025855,NL +2960025856,2960026111,FR +2960026112,2960026623,RO +2960026624,2960027647,IR +2960027648,2960028671,RO +2960028672,2960029183,NO +2960029184,2960029439,GB +2960029440,2960029695,KW +2960029696,2960030975,RU +2960030976,2960031231,KZ +2960031232,2960035839,RU +2960035840,2960039935,PL +2960039936,2960054271,RU +2960054272,2960056319,RO +2960056320,2960064511,RU +2960064512,2960066559,RO +2960066560,2960068607,RU +2960068608,2960072703,PL +2960072704,2960080895,UA +2960080896,2960084991,RU +2960084992,2960089087,UA +2960089088,2960091135,RU +2960091136,2960093183,PT +2960093184,2960105471,PL +2960105472,2960107519,RO +2960109568,2960113663,UA +2960113664,2960117759,NO +2960117760,2960119807,RU +2960119808,2960121855,CH +2960121856,2960125951,PL +2960125952,2960127999,UA +2960128000,2960130047,RU +2960130048,2960138239,UA +2960138240,2960148479,RU +2960148480,2960150527,PL +2960150528,2960152575,RO +2960152576,2960158719,RU +2960158720,2960160767,PL +2960160768,2960162815,UA +2960162816,2960175103,RU +2960175104,2960179199,SK +2960179200,2960211967,RU +2960220160,2960224255,RO +2960224256,2960228351,RU +2960228352,2960232447,TJ +2960232448,2960240639,UA +2960240640,2960244735,RO +2960244736,2960248831,PL +2960248832,2960265215,UA +2960265216,2960269311,RU +2960269312,2960273407,UA +2960273408,2960275455,RU +2960275456,2960277503,RO +2960277504,2960285695,RU +2960285696,2960289791,GB +2960289792,2960320511,RU +2960320512,2960322559,PL +2960322560,2960326655,CZ +2960326656,2960334847,PL +2960334848,2960347135,RU +2960347136,2960349183,PL +2960349184,2960351231,RU +2960351232,2960353279,UA +2960353280,2960369663,RU +2960369664,2960371711,IT +2960371712,2960375807,US +2960375808,2960383999,RU +2960384000,2960388095,RO +2960388096,2960392191,PL +2960392192,2960397311,TR +2960397312,2960400383,DE +2960400384,2960404479,RO +2960404480,2960408575,RU +2960408576,2960416767,UA +2960416768,2960424959,SK +2960424960,2960427007,RO +2960427008,2960429055,RU +2960429056,2960429311,BG +2960429312,2960429567,NL +2960429568,2960430079,UA +2960430080,2960431103,PL +2960431104,2960441343,RU +2960441344,2960443391,UA +2960443392,2960445439,PL +2960445440,2960449535,RU +2960449536,2960453631,RO +2960453632,2960472063,RU +2960472064,2960472319,BE +2960472320,2960473343,NL +2960473344,2960473599,LT +2960473600,2960474111,NL +2960474112,2960482303,UA +2960482304,2960484351,TR +2960484352,2960486399,DE +2960486400,2960498687,RU +2960498688,2960506879,UA +2960506880,2960531455,RU +2960533504,2960537599,UA +2960537600,2960539647,RO +2960539648,2960543743,RU +2960543744,2960547839,RO +2960547840,2960551935,SK +2960551936,2960558079,RU +2960558080,2960560127,PL +2960560128,2960562175,UA +2960562176,2960564223,BY +2960574464,2960576511,RO +2960576512,2960588799,RU +2960588800,2960592895,UA +2960592896,2960594943,RU +2960594944,2960596991,UA +2960596992,2960605183,PL +2960605184,2960621567,UA +2960629760,2960646143,RU +2960646144,2960648191,KZ +2960648192,2960650239,UA +2960650240,2960652287,RU +2960652288,2960654335,PS +2960654336,2960658431,RU +2960658432,2960660479,US +2960660480,2960662527,RU +2960662528,2960670719,UA +2960670720,2960678911,RU +2960678912,2960685055,UA +2960685056,2960687103,PL +2960687104,2960695295,FR +2960695296,2960697343,AT +2960697344,2960699391,ES +2960699392,2960719871,RU +2960719872,2960723455,UA +2960723456,2960723711,CZ +2960723712,2960723967,UA +2960723968,2960726015,RU +2960726016,2960732159,RO +2960732160,2960736255,RU +2960736256,2960738303,ES +2960738304,2960740351,UA +2960740352,2960742399,PL +2960742400,2960744447,US +2960744448,2960748543,RO +2960748544,2960752639,PL +2960752640,2960769023,RU +2960769024,2960773119,UA +2960773120,2960777215,RU +2960777216,2960789503,UA +2960789504,2960793599,RU +2960793600,2960797695,CZ +2960797696,2960805887,RU +2960805888,2960807935,KZ +2960807936,2960818175,UA +2960818176,2960834559,US +2960834560,2960835071,GB +2960835072,2960835583,CH +2960835584,2960836351,IT +2960836352,2960836607,PL +2960836608,2960838655,RU +2960839168,2960839679,IR +2960839680,2960846847,PL +2960846848,2960847871,DE +2960847872,2960848383,PL +2960848384,2960848639,GB +2960848640,2960850943,RU +2960850944,2960859135,MD +2960859136,2960863231,GB +2960863232,2960863487,DE +2960863488,2960863743,RU +2960863744,2960863999,GB +2960864000,2960864255,DE +2960864256,2960864767,GB +2960864768,2960865279,DE +2960865280,2960865535,RU +2960865536,2960865791,HR +2960865792,2960866303,GB +2960866304,2960866815,PL +2960866816,2960867071,GB +2960867072,2960867327,FR +2960867328,2960883711,IR +2960883712,2960904191,RU +2960904192,2960906239,RS +2960906240,2960907263,RU +2960907264,2960907775,UA +2960907776,2960908031,GB +2960908032,2960908287,PL +2960908288,2960916479,KG +2960916480,2960924671,UA +2960932864,2960933887,IR +2960933888,2960934655,GB +2960934656,2960934911,NL +2960934912,2960936959,RO +2960936960,2960941055,KZ +2960941056,2960943103,AM +2960943104,2960945151,RO +2960945152,2960945663,GB +2960945664,2960949247,RU +2960949248,2960951295,UA +2960951296,2960951807,RU +2960951808,2960952319,UA +2960952320,2960953343,PL +2960953344,2960954367,RU +2960954368,2960954623,SE +2960954624,2960954879,DE +2960954880,2960960511,RU +2960960512,2960963583,RO +2960963584,2960964607,CZ +2960964608,2960965119,RU +2960965120,2960965375,PL +2960965376,2960965631,GB +2960965632,2960973823,RU +2960973824,2960974335,SE +2960974336,2960974847,RU +2960974848,2960977919,UA +2960977920,2960979455,PL +2960979456,2960979711,IE +2960979712,2960979967,EE +2960979968,2960980223,RU +2960980224,2960980479,AT +2960980480,2960980991,SE +2960980992,2960981247,PT +2960981248,2960982015,NL +2960982016,2960990207,DE +2960990208,2960998399,UA +2960998400,2961057023,RU +2961057024,2961057279,IE +2961057280,2961057535,GR +2961057536,2961057791,AT +2961057792,2961061887,RU +2961061888,2961062911,PL +2961062912,2961063935,UA +2961063936,2961064191,DE +2961064192,2961064447,NL +2961064448,2961064703,RU +2961064704,2961064959,DE +2961064960,2961065215,HK +2961065216,2961065471,AU +2961065472,2961065727,SE +2961065728,2961066239,HK +2961066240,2961066495,DE +2961066496,2961066751,BG +2961066752,2961067519,DE +2961067520,2961067775,GB +2961067776,2961068543,DE +2961068544,2961068799,NL +2961068800,2961069055,IT +2961069056,2961069311,SE +2961069312,2961069567,NL +2961069568,2961069823,SE +2961069824,2961072127,US +2961072128,2961088511,UA +2961088512,2961088767,SE +2961088768,2961089023,RU +2961089024,2961089535,UA +2961089536,2961090559,KG +2961090560,2961091583,NL +2961091584,2961091839,RO +2961091840,2961092095,SE +2961092096,2961096703,RO +2961096704,2961097471,GB +2961097472,2961102847,RO +2961102848,2961103871,DE +2961103872,2961104895,RO +2961104896,2961106943,GB +2961106944,2961107967,NL +2961107968,2961108991,RO +2961108992,2961111039,GB +2961111040,2961112063,PL +2961112064,2961113087,RO +2961113088,2961178623,CH +2961178624,2965372927,FR +2965372928,2965766143,RU +2965766144,2965897215,DE +2965897216,2966028287,IT +2966028288,2966159359,QA +2966159360,2966290431,AE +2966290432,2966421503,IT +2966421504,2966945791,RU +2966945792,2967268351,TR +2967268352,2967269375,IN +2967269376,2967273471,TR +2967273472,2967277567,RU +2967277568,2967281663,IR +2967281664,2967283711,PT +2967283712,2967285759,DE +2967285760,2967287807,IT +2967287808,2967289855,GB +2967289856,2967291903,IR +2967291904,2967293951,RS +2967293952,2967295999,SE +2967296000,2967298047,NO +2967298048,2967306239,PL +2967306240,2967339007,GE +2967339008,2967343103,BG +2967343104,2967345151,RU +2967345152,2967347199,ES +2967347200,2967351295,HR +2967351296,2967355391,FR +2967355392,2967363583,ES +2967363584,2967371775,SE +2967371776,2967388159,KZ +2967388160,2967392255,RU +2967392256,2967394303,FR +2967394304,2967396351,RU +2967396352,2967398399,CZ +2967398400,2967400447,DK +2967400448,2967404543,RU +2967404544,2967421183,RO +2967421184,2967421439,BG +2967421440,2967421695,RO +2967421696,2967421951,ES +2967421952,2967422975,US +2967422976,2967425023,KZ +2967425024,2967427071,IR +2967427072,2967428095,NL +2967428096,2967429119,BG +2967429120,2967430143,RO +2967430144,2967430302,KZ +2967430303,2967430303,US +2967430304,2967431167,KZ +2967431168,2967432191,US +2967432192,2967432447,GB +2967432448,2967432959,RO +2967432960,2967433727,CH +2967433728,2967434239,RO +2967434240,2967435007,GB +2967435008,2967435263,IE +2967435264,2967437311,RO +2967437312,2967441407,PL +2967441408,2967445503,BG +2967445504,2967446015,GB +2967446016,2967446527,RO +2967446528,2967446783,IT +2967446784,2967447039,DE +2967447040,2967448575,RO +2967448576,2967450623,US +2967450624,2967450879,RO +2967450880,2967451135,US +2967451136,2967451647,RO +2967451648,2967452671,KZ +2967452672,2967453183,RO +2967453184,2967453439,GB +2967453440,2967453695,RO +2967468032,2967470079,US +2967470080,2967601151,SA +2967601152,2967633919,HU +2967633920,2967666687,RU +2967666688,2967699455,TR +2967699456,2967703551,GB +2967703552,2967707647,ES +2967707648,2967709695,PL +2967709696,2967711743,IT +2967711744,2967715839,RU +2967715840,2967724031,GB +2967724032,2967728127,CY +2967730176,2967732223,CZ +2967732224,2967994367,IL +2967994368,2968584191,TR +2968584192,2968600575,HU +2968600576,2968602623,IQ +2968602624,2968604671,PL +2968604672,2968608767,IQ +2968608768,2968610815,RU +2968610816,2968612863,UA +2968612864,2968614143,IL +2968614144,2968614911,US +2968614912,2968616959,FR +2968616960,2968625151,UA +2968625152,2968629247,DE +2968629248,2968631295,BH +2968631296,2968633343,SA +2968633344,2968643583,RU +2968643584,2968645631,NO +2968645632,2968647679,PL +2968647680,2968648223,FR +2968648224,2968648255,CH +2968648256,2968648287,GB +2968648288,2968648319,BE +2968648320,2968648479,FR +2968648480,2968648511,CH +2968648512,2968648543,GB +2968648544,2968648575,BE +2968648576,2968649727,FR +2968649728,2969042943,IT +2969042944,2969567231,GB +2969567232,2972098569,BR +2972098570,2972098570,US +2972098571,2975594495,BR +2975594496,2975596543,PE +2975596544,2977726975,BR +2977726976,2977727231,US +2977727232,2984247295,BR +2984247296,2984935423,MX +2984935424,2984936447,AR +2984936448,2984937471,BR +2984937472,2984937503,HN +2984937504,2984937511,US +2984937512,2984937607,HN +2984937608,2984937615,US +2984937616,2984938079,HN +2984938080,2984938095,US +2984938096,2984938239,HN +2984938240,2984938255,US +2984938256,2984938759,HN +2984938760,2984938767,CA +2984938768,2984938847,HN +2984938848,2984938863,CA +2984938864,2984939519,HN +2984939520,2984951807,BR +2984951808,2984968191,EC +2984968192,2985033727,BR +2985033728,2985951231,MX +2985951232,2986082303,PY +2986082304,2986344447,CO +2986344448,2987393023,DE +2987393024,2987397119,IM +2987397120,2987401215,LV +2987401216,2987405311,LT +2987405312,2987409407,DE +2987409408,2987413503,NO +2987413504,2987415807,UA +2987415808,2987417599,RU +2987417600,2987425791,PL +2987425792,2987429887,BG +2987429888,2987433983,RU +2987433984,2987438079,FR +2987438080,2987442175,FI +2987442176,2987446271,IE +2987446272,2987450367,SE +2987450368,2987454463,GB +2987454464,2987458559,FR +2987458560,2987462655,CZ +2987462656,2987466751,RS +2987466752,2987470847,GB +2987470848,2987474943,IQ +2987474944,2987479039,GB +2987479040,2987487231,CZ +2987487232,2987491327,HR +2987491328,2987495423,RU +2987495424,2987499519,NO +2987499520,2987500199,MD +2987500200,2987500207,AQ +2987500208,2987503615,MD +2987503616,2987511807,RU +2987515904,2987516159,US +2987516160,2987517951,DE +2987517952,2987519999,US +2987520000,2987524095,GB +2987524096,2987528191,RU +2987528192,2987532287,US +2987532288,2987536383,MD +2987536384,2987540479,FR +2987540480,2987544575,SK +2987544576,2987548671,NL +2987548672,2987552767,RU +2987552768,2987556863,GB +2987556864,2987560959,NL +2987560960,2987565055,DE +2987565056,2987569151,AT +2987569152,2987573247,FR +2987573248,2987577343,TR +2987577344,2987585535,RU +2987585536,2987589631,DE +2987589632,2987593727,FR +2987593728,2987597823,LT +2987597824,2987601919,ES +2987601920,2987606015,IS +2987606016,2987610111,DE +2987610112,2987614207,RU +2987614208,2987618303,PL +2987618304,2987622399,NL +2987622400,2987626495,FR +2987626496,2987634687,IT +2987634688,2987638783,PL +2987638784,2987642879,FO +2987642880,2987651071,DE +2987651072,2987655167,RU +2987655168,2987659263,DE +2987659264,2987661311,OM +2987663360,2987665407,IT +2987665408,2987667455,RU +2987667456,2987669503,FR +2987669504,2987671551,NL +2987671552,2987673599,FR +2987673600,2987675647,IT +2987675648,2987677695,IE +2987677696,2987681791,DE +2987681792,2987683839,NO +2987683840,2987685887,IT +2987685888,2987687935,GR +2987687936,2987689983,RU +2987689984,2987692031,CZ +2987692032,2987694079,SA +2987694080,2987696127,UA +2987696128,2987698175,RS +2987698176,2987700223,NL +2987700224,2987702271,RU +2987702272,2987704319,JO +2987704320,2987706367,GB +2987706368,2987708415,RS +2987710464,2987712511,DK +2987712512,2987714559,TR +2987714560,2987716607,RU +2987716608,2987718655,FR +2987718656,2987720703,NL +2987720704,2987722751,DE +2987722752,2987724799,RU +2987724800,2987726847,NL +2987726848,2987728895,RU +2987728896,2987730943,GB +2987730944,2987732991,IR +2987732992,2987735039,HU +2987735040,2987736577,ES +2987736578,2987736578,BY +2987736579,2987737087,ES +2987737088,2987739135,RU +2987739136,2987742982,SE +2987742983,2987742983,DK +2987742984,2987743231,SE +2987743232,2987745279,DK +2987745280,2987747327,IT +2987747328,2987749375,ES +2987749376,2987751423,NL +2987751424,2987753471,RO +2987753472,2987755519,NO +2987755520,2987757567,PL +2987757568,2987759615,DE +2987759616,2987761663,PL +2987761664,2987763711,IR +2987763712,2987765759,GR +2987765760,2987767807,FR +2987767808,2987769855,CZ +2987769856,2987771903,FI +2987771904,2987773951,IT +2987773952,2987775487,FR +2987775488,2987775999,GB +2987776000,2987778047,NL +2987778048,2987780095,CH +2987780096,2987782143,GB +2987782144,2987784191,EE +2987784192,2987786239,DK +2987786240,2987788287,FR +2987788288,2987789052,TR +2987789053,2987789054,US +2987789055,2987789055,TR +2987789056,2987789311,GB +2987789312,2987790335,TR +2987790336,2987792383,GB +2987792384,2987794431,CH +2987794432,2987796479,IQ +2987796480,2987800575,RU +2987800576,2987802623,NL +2987802624,2987804671,CH +2987804672,2987806463,IR +2987806464,2987806719,TR +2987806720,2987808767,NL +2987808768,2987810815,RU +2987810816,2987812863,NO +2987812864,2987814911,CH +2987814912,2987816959,CZ +2987816960,2987819007,IR +2987819008,2987821055,FR +2987821056,2987823103,GB +2987823104,2987827199,FR +2987827200,2987829247,GB +2987829248,2987831295,KZ +2987831296,2987833343,FR +2987833344,2987835391,IT +2987835392,2987837439,RU +2987837440,2987839487,SE +2987839488,2987841535,GB +2987841536,2987843583,RS +2987843584,2987845631,HU +2987845632,2987847679,NL +2987847680,2987849727,FR +2987849728,2987851775,IT +2987851776,2987853823,RU +2987853824,2987855871,IT +2987855872,2987857919,QA +2987857920,2987859967,DE +2987859968,2987862015,FR +2987862016,2987864063,BE +2987864064,2987866111,DE +2987866112,2987868159,ES +2987868160,2987870207,RO +2987870208,2987872255,GR +2987872256,2987874303,AT +2987874304,2987876351,SK +2987876352,2987878399,NO +2987878400,2987880447,PL +2987880448,2987882495,EE +2987882496,2987884543,DE +2987884544,2987886591,GB +2987886592,2987888639,UA +2987888640,2987890687,RU +2987890688,2987892735,FR +2987892736,2987894783,GB +2987894784,2987896831,CH +2987896832,2987898879,DK +2987898880,2987900927,NL +2987900928,2987902975,PL +2987902976,2987905023,IT +2987905024,2987907071,ES +2987907072,2987909119,CZ +2987909120,2987911167,RU +2987911168,2987913215,CZ +2987913216,2987915263,DK +2987915264,2987917311,IT +2987917312,2988179455,DE +2988179456,2988411647,SE +2988411648,2988411775,DE +2988411776,2988441599,SE +2988441600,2988441839,FR +2988441840,2988441843,IE +2988441844,2988441939,FR +2988441940,2988441943,ES +2988441944,2988442075,FR +2988442076,2988442079,ES +2988442080,2988442207,FR +2988442208,2988442239,ES +2988442240,2988442511,FR +2988442512,2988442519,ES +2988442520,2988442719,FR +2988442720,2988442751,FI +2988442752,2988442847,FR +2988442848,2988442863,IT +2988442864,2988442999,FR +2988443000,2988443007,GB +2988443008,2988443103,FR +2988443104,2988443119,GB +2988443120,2988443263,FR +2988443264,2988443295,ES +2988443296,2988443543,FR +2988443544,2988443547,ES +2988443548,2988443671,FR +2988443672,2988443675,ES +2988443676,2988443687,FR +2988443688,2988443695,ES +2988443696,2988443703,PT +2988443704,2988443895,FR +2988443896,2988443903,BE +2988443904,2988444115,FR +2988444116,2988444119,IT +2988444120,2988444208,FR +2988444209,2988444209,FI +2988444210,2988444223,FR +2988444224,2988444231,BE +2988444232,2988444239,FI +2988444240,2988444247,CZ +2988444248,2988444255,PL +2988444256,2988444671,FR +2988444672,2988444679,ES +2988444680,2988444719,FR +2988444720,2988444735,ES +2988444736,2988444739,GB +2988444740,2988444815,FR +2988444816,2988444831,ES +2988444832,2988445223,FR +2988445224,2988445231,ES +2988445232,2988446175,FR +2988446176,2988446207,FI +2988446208,2988446399,FR +2988446400,2988446431,PL +2988446432,2988446719,FR +2988446720,2988446723,DE +2988446724,2988446863,FR +2988446864,2988446879,IE +2988446880,2988447103,FR +2988447104,2988447167,GB +2988447168,2988448543,FR +2988448544,2988448547,GB +2988448548,2988448607,FR +2988448608,2988448639,ES +2988448640,2988448799,FR +2988448800,2988448815,ES +2988448816,2988449127,FR +2988449128,2988449135,ES +2988449136,2988449207,FR +2988449208,2988449215,ES +2988449216,2988449327,FR +2988449328,2988449331,PL +2988449332,2988449631,FR +2988449632,2988449639,ES +2988449640,2988451839,FR +2988451840,2988453887,BE +2988453888,2988457983,GB +2988457984,2988458063,FR +2988458064,2988458067,ES +2988458068,2988458279,FR +2988458280,2988458283,ES +2988458284,2988458331,FR +2988458332,2988458335,GB +2988458336,2988459087,FR +2988459088,2988459103,GB +2988459104,2988459119,FR +2988459120,2988459127,IT +2988459128,2988459135,PL +2988459136,2988459167,FR +2988459168,2988459171,IE +2988459172,2988459179,FR +2988459180,2988459183,ES +2988459184,2988459231,FR +2988459232,2988459235,GB +2988459236,2988459495,FR +2988459496,2988459503,ES +2988459504,2988459535,FR +2988459536,2988459539,ES +2988459540,2988459599,FR +2988459600,2988459603,GB +2988459604,2988459619,FR +2988459620,2988459623,GB +2988459624,2988459647,FR +2988459648,2988459679,GB +2988459680,2988459687,FR +2988459688,2988459691,PL +2988459692,2988459695,FR +2988459696,2988459699,IE +2988459700,2988459715,FR +2988459716,2988459719,FI +2988459720,2988459863,FR +2988459864,2988459867,ES +2988459868,2988459967,FR +2988459968,2988459999,ES +2988460000,2988460143,FR +2988460144,2988460147,GB +2988460148,2988460151,FR +2988460152,2988460159,ES +2988460160,2988460575,FR +2988460576,2988460591,PT +2988460592,2988460607,GB +2988460608,2988460651,FR +2988460652,2988460655,ES +2988460656,2988460735,FR +2988460736,2988460751,PT +2988460752,2988460863,FR +2988460864,2988460895,CZ +2988460896,2988461263,FR +2988461264,2988461279,ES +2988461280,2988461307,FR +2988461308,2988461311,ES +2988461312,2988461423,FR +2988461424,2988461439,IE +2988461440,2988461495,FR +2988461496,2988461499,ES +2988461500,2988461703,FR +2988461704,2988461707,GB +2988461708,2988462331,FR +2988462332,2988462335,ES +2988462336,2988462747,FR +2988462748,2988462751,ES +2988462752,2988463111,FR +2988463112,2988463119,ES +2988463120,2988463143,FR +2988463144,2988463151,ES +2988463152,2988463223,FR +2988463224,2988463227,ES +2988463228,2988463747,FR +2988463748,2988463751,GB +2988463752,2988463759,LT +2988463760,2988463915,FR +2988463916,2988463919,ES +2988463920,2988463947,FR +2988463948,2988463951,GB +2988463952,2988463999,FR +2988464000,2988464007,IE +2988464008,2988464015,LT +2988464016,2988464019,PT +2988464020,2988464023,FR +2988464024,2988464027,GB +2988464028,2988464271,FR +2988464272,2988464275,ES +2988464276,2988464359,FR +2988464360,2988464360,NL +2988464361,2988464519,FR +2988464520,2988464527,DE +2988464528,2988464615,FR +2988464616,2988464619,IE +2988464620,2988464623,FR +2988464624,2988464627,ES +2988464628,2988464787,FR +2988464788,2988464791,ES +2988464792,2988465191,FR +2988465192,2988465195,PL +2988465196,2988465215,FR +2988465216,2988465219,ES +2988465220,2988465551,FR +2988465552,2988465563,ES +2988465564,2988465575,FR +2988465576,2988465583,ES +2988465584,2988466059,FR +2988466060,2988466063,CZ +2988466064,2988466087,FR +2988466088,2988466095,PT +2988466096,2988466111,BE +2988466112,2988474535,FR +2988474536,2988474543,GB +2988474544,2988474687,FR +2988474688,2988474703,FI +2988474704,2988474959,FR +2988474960,2988474975,FI +2988474976,2988475215,FR +2988475216,2988475223,ES +2988475224,2988475343,FR +2988475344,2988475351,ES +2988475352,2988476415,FR +2988476416,2988478463,IT +2988478464,2988478579,FR +2988478580,2988478583,DE +2988478584,2988478587,FR +2988478588,2988478591,DE +2988478592,2988478719,FR +2988478720,2988478751,CZ +2988478752,2988478795,FR +2988478796,2988478799,ES +2988478800,2988479003,FR +2988479004,2988479007,ES +2988479008,2988479155,FR +2988479156,2988479159,ES +2988479160,2988479343,FR +2988479344,2988479359,GB +2988479360,2988479603,FR +2988479604,2988479607,GB +2988479608,2988479727,FR +2988479728,2988479735,DE +2988479736,2988479791,FR +2988479792,2988479807,GB +2988479808,2988479903,FR +2988479904,2988479935,PL +2988479936,2988480011,FR +2988480012,2988480015,GB +2988480016,2988480063,FR +2988480064,2988480095,ES +2988480096,2988480207,FR +2988480208,2988480223,ES +2988480224,2988480439,FR +2988480440,2988480443,NL +2988480444,2988480447,GB +2988480448,2988480799,FR +2988480800,2988480803,GB +2988480804,2988480927,FR +2988480928,2988480959,ES +2988480960,2988481059,FR +2988481060,2988481063,FI +2988481064,2988481343,FR +2988481344,2988481407,NL +2988481408,2988481695,FR +2988481696,2988481711,ES +2988481712,2988481743,FR +2988481744,2988481759,ES +2988481760,2988482095,FR +2988482096,2988482099,GB +2988482100,2988482103,FR +2988482104,2988482111,FI +2988482112,2988482143,DE +2988482144,2988482159,FR +2988482160,2988482163,ES +2988482164,2988482167,FR +2988482168,2988482175,ES +2988482176,2988482235,FR +2988482236,2988482255,GB +2988482256,2988482311,FR +2988482312,2988482315,GB +2988482316,2988482411,FR +2988482412,2988482415,PT +2988482416,2988482575,FR +2988482576,2988482579,CZ +2988482580,2988482799,FR +2988482800,2988482807,ES +2988482808,2988482863,FR +2988482864,2988482871,ES +2988482872,2988482875,PT +2988482876,2988482879,FR +2988482880,2988482883,PL +2988482884,2988483027,FR +2988483028,2988483031,ES +2988483032,2988483111,FR +2988483112,2988483115,ES +2988483116,2988483119,FR +2988483120,2988483127,ES +2988483128,2988483159,FR +2988483160,2988483167,ES +2988483168,2988483175,FR +2988483176,2988483183,PL +2988483184,2988483279,FR +2988483280,2988483283,ES +2988483284,2988483375,FR +2988483376,2988483379,GB +2988483380,2988483595,FR +2988483596,2988483599,FI +2988483600,2988483967,FR +2988483968,2988483983,GB +2988483984,2988484047,FR +2988484048,2988484051,ES +2988484052,2988484127,FR +2988484128,2988484131,PT +2988484132,2988484339,FR +2988484340,2988484343,PT +2988484344,2988484399,FR +2988484400,2988484403,PT +2988484404,2988484831,FR +2988484832,2988484847,GB +2988484848,2988484863,FR +2988484864,2988484879,NL +2988484880,2988484883,GB +2988484884,2988484891,FR +2988484892,2988484895,GB +2988484896,2988485455,FR +2988485456,2988485471,GB +2988485472,2988485503,FR +2988485504,2988485519,GB +2988485520,2988485563,FR +2988485564,2988485567,ES +2988485568,2988485631,FR +2988485632,2988485663,ES +2988485664,2988485799,FR +2988485800,2988485803,PT +2988485804,2988486083,FR +2988486084,2988486087,PT +2988486088,2988486095,FR +2988486096,2988486099,GB +2988486100,2988486135,FR +2988486136,2988486139,ES +2988486140,2988486195,FR +2988486196,2988486199,PT +2988486200,2988486323,FR +2988486324,2988486327,PT +2988486328,2988486335,FR +2988486336,2988486343,ES +2988486344,2988486351,FR +2988486352,2988486367,ES +2988486368,2988486607,FR +2988486608,2988486615,FI +2988486616,2988486623,ES +2988486624,2988486679,FR +2988486680,2988486687,ES +2988486688,2988486711,FR +2988486712,2988486719,IE +2988486720,2988486747,FR +2988486748,2988486751,GB +2988486752,2988486887,FR +2988486888,2988486891,PT +2988486892,2988487043,FR +2988487044,2988487047,PT +2988487048,2988487071,FR +2988487072,2988487075,ES +2988487076,2988487095,FR +2988487096,2988487099,ES +2988487100,2988487103,GB +2988487104,2988487303,FR +2988487304,2988487311,NL +2988487312,2988487375,FR +2988487376,2988487383,ES +2988487384,2988487839,FR +2988487840,2988487871,CZ +2988487872,2988487919,FR +2988487920,2988487923,DE +2988487924,2988487979,FR +2988487980,2988487983,ES +2988487984,2988488491,FR +2988488492,2988488495,ES +2988488496,2988488543,FR +2988488544,2988488555,GB +2988488556,2988488639,FR +2988488640,2988488647,ES +2988488648,2988488971,FR +2988488972,2988488975,MT +2988488976,2988488983,ES +2988488984,2988488991,FR +2988488992,2988489023,ES +2988489024,2988489167,FR +2988489168,2988489175,PT +2988489176,2988489375,FR +2988489376,2988489379,ES +2988489380,2988489451,FR +2988489452,2988489455,DE +2988489456,2988489475,FR +2988489476,2988489479,GB +2988489480,2988489483,DE +2988489484,2988489675,FR +2988489676,2988489679,ES +2988489680,2988489935,FR +2988489936,2988489943,ES +2988489944,2988490179,FR +2988490180,2988490191,ES +2988490192,2988490291,FR +2988490292,2988490295,DE +2988490296,2988490303,ES +2988490304,2988490367,FR +2988490368,2988490371,ES +2988490372,2988490686,FR +2988490687,2988490687,BE +2988490688,2988490719,ES +2988490720,2988490967,FR +2988490968,2988490975,CZ +2988490976,2988491251,FR +2988491252,2988491252,ES +2988491253,2988491839,FR +2988491840,2988491919,FI +2988491920,2988491935,DE +2988491936,2988491951,PL +2988491952,2988491967,FR +2988491968,2988492031,GB +2988492032,2988492799,FR +2988492800,2988494847,PL +2988494848,2988495199,FR +2988495200,2988495231,IT +2988495232,2988495967,FR +2988495968,2988495999,ES +2988496000,2988496767,FR +2988496768,2988496799,CZ +2988496800,2988496831,FR +2988496832,2988496895,NL +2988496896,2988498975,FR +2988498976,2988498983,ES +2988498984,2988499347,FR +2988499348,2988499351,GB +2988499352,2988499535,FR +2988499536,2988499551,ES +2988499552,2988499567,FR +2988499568,2988499575,IE +2988499576,2988499583,FR +2988499584,2988499599,ES +2988499600,2988499635,FR +2988499636,2988499639,GB +2988499640,2988499671,FR +2988499672,2988499675,GB +2988499676,2988499711,FR +2988499712,2988499715,PL +2988499716,2988499729,FR +2988499730,2988499730,GB +2988499731,2988499736,FR +2988499737,2988499737,NL +2988499738,2988500223,FR +2988500224,2988500255,ES +2988500256,2988500371,FR +2988500372,2988500375,LT +2988500376,2988500415,FR +2988500416,2988500447,CZ +2988500448,2988500479,ES +2988500480,2988500519,FR +2988500520,2988500523,ES +2988500524,2988500815,FR +2988500816,2988500831,PL +2988500832,2988500855,FR +2988500856,2988500859,ES +2988500860,2988500887,FR +2988500888,2988500895,ES +2988500896,2988500939,FR +2988500940,2988500943,ES +2988500944,2988501683,FR +2988501684,2988501687,GB +2988501688,2988502031,FR +2988502032,2988502035,IE +2988502036,2988502051,FR +2988502052,2988502055,PL +2988502056,2988502263,FR +2988502264,2988502267,ES +2988502268,2988502479,FR +2988502480,2988502483,ES +2988502484,2988502495,FR +2988502496,2988502511,ES +2988502512,2988502655,FR +2988502656,2988502719,DE +2988502720,2988502751,FR +2988502752,2988502783,ES +2988502784,2988502823,FR +2988502824,2988502831,ES +2988502832,2988502881,FR +2988502882,2988502882,IT +2988502883,2988502983,FR +2988502984,2988502991,ES +2988502992,2988503375,FR +2988503376,2988503383,PT +2988503384,2988503471,FR +2988503472,2988503487,ES +2988503488,2988503919,FR +2988503920,2988503927,CZ +2988503928,2988504023,FR +2988504024,2988504031,PT +2988504032,2988504159,FR +2988504160,2988504191,LT +2988504192,2988504239,FR +2988504240,2988504255,GB +2988504256,2988504287,PL +2988504288,2988504359,FR +2988504360,2988504363,GB +2988504364,2988504367,FI +2988504368,2988504371,FR +2988504372,2988504375,PL +2988504376,2988504467,FR +2988504468,2988504471,ES +2988504472,2988504527,FR +2988504528,2988504543,PL +2988504544,2988504559,FR +2988504560,2988504563,FI +2988504564,2988504983,FR +2988504984,2988504987,ES +2988504988,2988505151,FR +2988505152,2988505167,GB +2988505168,2988505215,FR +2988505216,2988505247,ES +2988505248,2988505279,FR +2988505280,2988505311,ES +2988505312,2988505375,FR +2988505376,2988505391,GB +2988505392,2988505395,ES +2988505396,2988505535,FR +2988505536,2988505567,ES +2988505568,2988505919,FR +2988505920,2988505935,GB +2988505936,2988506191,FR +2988506192,2988506207,GB +2988506208,2988506367,FR +2988506368,2988506375,IE +2988506376,2988506523,FR +2988506524,2988506527,IE +2988506528,2988506887,FR +2988506888,2988506891,ES +2988506892,2988507163,FR +2988507164,2988507167,ES +2988507168,2988507263,FR +2988507264,2988507279,ES +2988507280,2988507335,FR +2988507336,2988507339,ES +2988507340,2988507551,FR +2988507552,2988507560,GB +2988507561,2988507561,FR +2988507562,2988507567,GB +2988507568,2988507583,FR +2988507584,2988507591,ES +2988507592,2988507687,FR +2988507688,2988507695,ES +2988507696,2988508079,FR +2988508080,2988508095,ES +2988508096,2988508135,FR +2988508136,2988508143,GB +2988508144,2988508155,FR +2988508156,2988508159,ES +2988508160,2988508439,FR +2988508440,2988508443,GB +2988508444,2988508607,FR +2988508608,2988508639,ES +2988508640,2988508851,FR +2988508852,2988508855,GB +2988508856,2988509151,FR +2988509152,2988509183,IT +2988509184,2988509191,FR +2988509192,2988509199,CZ +2988509200,2988509491,FR +2988509492,2988509495,IE +2988509496,2988509511,FR +2988509512,2988509515,PL +2988509516,2988509747,FR +2988509748,2988509751,LT +2988509752,2988509779,FR +2988509780,2988509783,GB +2988509784,2988510015,FR +2988510016,2988510023,ES +2988510024,2988510079,FR +2988510080,2988510087,ES +2988510088,2988510095,FR +2988510096,2988510099,ES +2988510100,2988510175,FR +2988510176,2988510191,DE +2988510192,2988510311,FR +2988510312,2988510319,GB +2988510320,2988510639,FR +2988510640,2988510655,LT +2988510656,2988511023,FR +2988511024,2988511027,GB +2988511028,2988511747,FR +2988511748,2988511751,GB +2988511752,2988512127,FR +2988512128,2988512143,ES +2988512144,2988512199,FR +2988512200,2988512207,ES +2988512208,2988512247,FR +2988512248,2988512251,GB +2988512252,2988512307,FR +2988512308,2988512311,GB +2988512312,2988512399,FR +2988512400,2988512403,ES +2988512404,2988512407,LT +2988512408,2988512639,FR +2988512640,2988512647,GB +2988512648,2988512655,FR +2988512656,2988512663,PT +2988512664,2988512903,FR +2988512904,2988512907,GB +2988512908,2988512943,FR +2988512944,2988512951,ES +2988512952,2988512995,FR +2988512996,2988512999,GB +2988513000,2988513003,FR +2988513004,2988513007,ES +2988513008,2988513167,FR +2988513168,2988513171,PT +2988513172,2988513283,FR +2988513284,2988513287,ES +2988513288,2988513311,FR +2988513312,2988513327,PT +2988513328,2988513519,FR +2988513520,2988513535,GB +2988513536,2988513583,FR +2988513584,2988513599,IE +2988513600,2988513679,FR +2988513680,2988513683,ES +2988513684,2988513687,GB +2988513688,2988513739,FR +2988513740,2988513743,ES +2988513744,2988514183,FR +2988514184,2988514191,ES +2988514192,2988514207,FR +2988514208,2988514215,PT +2988514216,2988514231,FR +2988514232,2988514239,ES +2988514240,2988514287,FR +2988514288,2988514303,ES +2988514304,2988514519,FR +2988514520,2988514523,ES +2988514524,2988514527,FR +2988514528,2988514543,GB +2988514544,2988514739,FR +2988514740,2988514743,GB +2988514744,2988514943,FR +2988514944,2988514959,ES +2988514960,2988515327,FR +2988515328,2988517375,DE +2988517376,2988519423,FR +2988519424,2988521471,PL +2988521472,2988521567,FR +2988521568,2988521599,PL +2988521600,2988521775,FR +2988521776,2988521791,LT +2988521792,2988521951,FR +2988521952,2988521983,ES +2988521984,2988523551,FR +2988523552,2988523559,ES +2988523560,2988523599,FR +2988523600,2988523603,ES +2988523604,2988523631,FR +2988523632,2988523635,DE +2988523636,2988523663,FR +2988523664,2988523667,IE +2988523668,2988523679,FR +2988523680,2988523711,ES +2988523712,2988523743,FR +2988523744,2988523759,DE +2988523760,2988524075,FR +2988524076,2988524079,ES +2988524080,2988524155,FR +2988524156,2988524159,PT +2988524160,2988524199,FR +2988524200,2988524203,IE +2988524204,2988524211,FR +2988524212,2988524215,ES +2988524216,2988524231,FR +2988524232,2988524239,ES +2988524240,2988524359,FR +2988524360,2988524363,ES +2988524364,2988524383,FR +2988524384,2988524415,PL +2988524416,2988524447,CZ +2988524448,2988524603,FR +2988524604,2988524607,ES +2988524608,2988524623,FR +2988524624,2988524627,GB +2988524628,2988524767,FR +2988524768,2988524783,ES +2988524784,2988525887,FR +2988525888,2988525951,GB +2988525952,2988526135,FR +2988526136,2988526143,GB +2988526144,2988526175,FR +2988526176,2988526239,ES +2988526240,2988526415,FR +2988526416,2988526423,ES +2988526424,2988526703,FR +2988526704,2988526707,GB +2988526708,2988526867,FR +2988526868,2988526871,PT +2988526872,2988527187,FR +2988527188,2988527191,ES +2988527192,2988527487,FR +2988527488,2988527503,GB +2988527504,2988527547,FR +2988527548,2988527551,IE +2988527552,2988527591,FR +2988527592,2988527595,IE +2988527596,2988527723,FR +2988527724,2988527727,ES +2988527728,2988527831,FR +2988527832,2988527839,ES +2988527840,2988527887,FR +2988527888,2988527891,ES +2988527892,2988528079,FR +2988528080,2988528095,ES +2988528096,2988528227,FR +2988528228,2988528231,IE +2988528232,2988528447,FR +2988528448,2988528455,IE +2988528456,2988528467,FR +2988528468,2988528471,GB +2988528472,2988528591,FR +2988528592,2988528607,FI +2988528608,2988528699,FR +2988528700,2988528703,CZ +2988528704,2988528999,FR +2988529000,2988529003,GB +2988529004,2988529175,FR +2988529176,2988529179,ES +2988529180,2988529331,FR +2988529332,2988529335,GB +2988529336,2988529383,FR +2988529384,2988529387,ES +2988529388,2988529583,FR +2988529584,2988529591,ES +2988529592,2988529775,FR +2988529776,2988529783,ES +2988529784,2988529823,FR +2988529824,2988529855,ES +2988529856,2988530047,FR +2988530048,2988530049,GB +2988530050,2988530067,FR +2988530068,2988530071,DE +2988530072,2988530087,FR +2988530088,2988530091,NL +2988530092,2988530399,FR +2988530400,2988530403,ES +2988530404,2988530423,FR +2988530424,2988530431,ES +2988530432,2988530703,FR +2988530704,2988530719,PT +2988530720,2988531023,FR +2988531024,2988531027,ES +2988531028,2988531179,FR +2988531180,2988531183,GB +2988531184,2988531187,FR +2988531188,2988531191,IE +2988531192,2988531275,FR +2988531276,2988531279,PT +2988531280,2988532991,FR +2988532992,2988533119,GB +2988533120,2988533183,IE +2988533184,2988533247,BE +2988533248,2988535807,FR +2988535808,2988537855,ES +2988537856,2988539935,FR +2988539936,2988539967,GB +2988539968,2988539971,FR +2988539972,2988539975,ES +2988539976,2988540207,FR +2988540208,2988540211,GB +2988540212,2988540219,FR +2988540220,2988540223,GB +2988540224,2988540271,FR +2988540272,2988540275,ES +2988540276,2988540563,FR +2988540564,2988540567,CZ +2988540568,2988540623,FR +2988540624,2988540631,GB +2988540632,2988540759,FR +2988540760,2988540763,ES +2988540764,2988541103,FR +2988541104,2988541119,ES +2988541120,2988541243,FR +2988541244,2988541247,GB +2988541248,2988541351,FR +2988541352,2988541355,IE +2988541356,2988541455,FR +2988541456,2988541467,ES +2988541468,2988541791,FR +2988541792,2988541807,ES +2988541808,2988541863,FR +2988541864,2988541867,GB +2988541868,2988541955,FR +2988541956,2988541959,DE +2988541960,2988542051,FR +2988542052,2988542055,ES +2988542056,2988542063,FR +2988542064,2988542067,GB +2988542068,2988542271,FR +2988542272,2988542335,ES +2988542336,2988542339,FR +2988542340,2988542340,PT +2988542341,2988542519,FR +2988542520,2988542523,GB +2988542524,2988543127,FR +2988543128,2988543135,ES +2988543136,2988543179,FR +2988543180,2988543183,ES +2988543184,2988543199,FR +2988543200,2988543203,GB +2988543204,2988543403,FR +2988543404,2988543407,ES +2988543408,2988543559,FR +2988543560,2988543563,PT +2988543564,2988543871,FR +2988543872,2988543935,ES +2988543936,2988544055,FR +2988544056,2988544063,FI +2988544064,2988544307,FR +2988544308,2988544311,GB +2988544312,2988544375,FR +2988544376,2988544383,ES +2988544384,2988544447,GB +2988544448,2988544527,FR +2988544528,2988544535,ES +2988544536,2988544671,FR +2988544672,2988544687,GB +2988544688,2988544767,FR +2988544768,2988544775,ES +2988544776,2988544799,FR +2988544800,2988544831,FI +2988544832,2988544835,FR +2988544836,2988544843,ES +2988544844,2988545515,FR +2988545516,2988545519,GB +2988545520,2988545579,FR +2988545580,2988545583,ES +2988545584,2988545663,FR +2988545664,2988545695,ES +2988545696,2988545791,FR +2988545792,2988545795,NL +2988545796,2988545799,ES +2988545800,2988545995,FR +2988545996,2988545999,FI +2988546000,2988546119,FR +2988546120,2988546123,IE +2988546124,2988546159,FR +2988546160,2988546175,ES +2988546176,2988546327,FR +2988546328,2988546335,ES +2988546336,2988546351,FR +2988546352,2988546367,ES +2988546368,2988546575,FR +2988546576,2988546579,ES +2988546580,2988546599,FR +2988546600,2988546603,PT +2988546604,2988546615,FR +2988546616,2988546619,FI +2988546620,2988546623,FR +2988546624,2988546687,FI +2988546688,2988546691,CH +2988546692,2988546727,FR +2988546728,2988546731,ES +2988546732,2988547003,FR +2988547004,2988547007,ES +2988547008,2988547067,FR +2988547068,2988547071,ES +2988547072,2988547095,FR +2988547096,2988547099,ES +2988547100,2988547431,FR +2988547432,2988547435,ES +2988547436,2988547451,FR +2988547452,2988547455,PT +2988547456,2988547471,ES +2988547472,2988547583,FR +2988547584,2988547599,ES +2988547600,2988547619,FR +2988547620,2988547623,PT +2988547624,2988547751,FR +2988547752,2988547759,ES +2988547760,2988547775,FR +2988547776,2988547807,ES +2988547808,2988547871,FR +2988547872,2988547903,GB +2988547904,2988547967,FR +2988547968,2988547971,GB +2988547972,2988548015,FR +2988548016,2988548019,ES +2988548020,2988548023,GB +2988548024,2988548095,FR +2988548096,2988548338,ES +2988548339,2988548339,FR +2988548340,2988550143,ES +2988550144,2988550163,FR +2988550164,2988550167,GB +2988550168,2988550183,FR +2988550184,2988550191,PL +2988550192,2988550255,FR +2988550256,2988550259,ES +2988550260,2988550355,FR +2988550356,2988550359,GB +2988550360,2988550363,ES +2988550364,2988550367,FR +2988550368,2988550399,PL +2988550400,2988550407,FR +2988550408,2988550411,GB +2988550412,2988550438,FR +2988550439,2988550439,GB +2988550440,2988550463,FR +2988550464,2988550527,DE +2988550528,2988550595,FR +2988550596,2988550599,PT +2988550600,2988550643,FR +2988550644,2988550647,ES +2988550648,2988550699,FR +2988550700,2988550703,ES +2988550704,2988550975,FR +2988550976,2988551007,PL +2988551008,2988551171,FR +2988551172,2988551175,FI +2988551176,2988551179,ES +2988551180,2988551183,GB +2988551184,2988551191,FR +2988551192,2988551199,ES +2988551200,2988551431,FR +2988551432,2988551439,ES +2988551440,2988551443,FR +2988551444,2988551451,ES +2988551452,2988551455,FR +2988551456,2988551471,GB +2988551472,2988551535,FR +2988551536,2988551551,DE +2988551552,2988551567,FR +2988551568,2988551583,IE +2988551584,2988551671,FR +2988551672,2988551675,DE +2988551676,2988551903,FR +2988551904,2988551911,GB +2988551912,2988552591,FR +2988552592,2988552595,FI +2988552596,2988552631,FR +2988552632,2988552635,IE +2988552636,2988552687,FR +2988552688,2988552711,ES +2988552712,2988552751,FR +2988552752,2988552767,ES +2988552768,2988552959,FR +2988552960,2988552975,ES +2988552976,2988552991,FR +2988552992,2988552995,ES +2988552996,2988553007,FR +2988553008,2988553023,IE +2988553024,2988553055,FR +2988553056,2988553087,PL +2988553088,2988553199,FR +2988553200,2988553215,BE +2988553216,2988553223,FR +2988553224,2988553231,PL +2988553232,2988553279,FR +2988553280,2988553283,ES +2988553284,2988553311,FR +2988553312,2988553315,ES +2988553316,2988553531,FR +2988553532,2988553535,ES +2988553536,2988553855,FR +2988553856,2988553919,BE +2988553920,2988553971,FR +2988553972,2988553975,ES +2988553976,2988554035,FR +2988554036,2988554039,ES +2988554040,2988554187,FR +2988554188,2988554191,PL +2988554192,2988554239,FR +2988554240,2988554495,ES +2988554496,2988554499,NL +2988554500,2988554815,FR +2988554816,2988554879,GB +2988554880,2988554931,FR +2988554932,2988554935,ES +2988554936,2988555087,FR +2988555088,2988555091,FI +2988555092,2988555103,FR +2988555104,2988555107,GB +2988555108,2988555163,FR +2988555164,2988555167,IE +2988555168,2988555527,FR +2988555528,2988555531,DE +2988555532,2988555551,FR +2988555552,2988555559,PT +2988555560,2988556139,FR +2988556140,2988556143,DE +2988556144,2988556203,FR +2988556204,2988556207,FI +2988556208,2988556211,DE +2988556212,2988556223,FR +2988556224,2988556227,ES +2988556228,2988556255,FR +2988556256,2988556259,ES +2988556260,2988556263,FR +2988556264,2988556271,GB +2988556272,2988556283,FR +2988556284,2988556287,GB +2988556288,2988556319,FR +2988556320,2988556351,GB +2988556352,2988556359,FR +2988556360,2988556363,ES +2988556364,2988557023,FR +2988557024,2988557039,IE +2988557040,2988557095,FR +2988557096,2988557103,ES +2988557104,2988557111,PT +2988557112,2988557395,FR +2988557396,2988557399,PL +2988557400,2988557423,FR +2988557424,2988557427,ES +2988557428,2988557507,FR +2988557508,2988557511,ES +2988557512,2988557515,GB +2988557516,2988557539,FR +2988557540,2988557543,ES +2988557544,2988557631,FR +2988557632,2988557635,GB +2988557636,2988558075,FR +2988558076,2988558079,NL +2988558080,2988558203,FR +2988558204,2988558207,DE +2988558208,2988558239,PL +2988558240,2988558463,FR +2988558464,2988558527,BE +2988558528,2988558731,FR +2988558732,2988558735,PT +2988558736,2988558803,FR +2988558804,2988558807,ES +2988558808,2988558887,FR +2988558888,2988558891,GB +2988558892,2988559015,FR +2988559016,2988559023,DE +2988559024,2988559199,FR +2988559200,2988559231,PT +2988559232,2988559615,FR +2988559616,2988559619,ES +2988559620,2988559631,FR +2988559632,2988559647,GB +2988559648,2988559663,FR +2988559664,2988559679,ES +2988559680,2988560543,FR +2988560544,2988560575,GB +2988560576,2988560639,FR +2988560640,2988560703,ES +2988560704,2988560759,FR +2988560760,2988560767,FI +2988560768,2988560783,FR +2988560784,2988560799,NL +2988560800,2988560815,DE +2988560816,2988560879,FR +2988560880,2988560895,GB +2988560896,2988561051,FR +2988561052,2988561055,GB +2988561056,2988561175,FR +2988561176,2988561179,ES +2988561180,2988561215,FR +2988561216,2988561231,ES +2988561232,2988561235,PT +2988561236,2988561399,FR +2988561400,2988561403,ES +2988561404,2988561583,FR +2988561584,2988561591,GB +2988561592,2988561683,FR +2988561684,2988561687,ES +2988561688,2988561759,FR +2988561760,2988561763,PL +2988561764,2988561767,IT +2988561768,2988561939,FR +2988561940,2988561943,FI +2988561944,2988562495,FR +2988562496,2988562527,FI +2988562528,2988562595,FR +2988562596,2988562599,GB +2988562600,2988562847,FR +2988562848,2988562863,GB +2988562864,2988563527,FR +2988563528,2988563535,ES +2988563536,2988563671,FR +2988563672,2988563675,DE +2988563676,2988563967,FR +2988563968,2988563999,GB +2988564000,2988564023,FR +2988564024,2988564027,IE +2988564028,2988564143,FR +2988564144,2988564159,ES +2988564160,2988564175,FR +2988564176,2988564179,GB +2988564180,2988564191,FR +2988564192,2988564195,ES +2988564196,2988564215,FR +2988564216,2988564219,GB +2988564220,2988564279,FR +2988564280,2988564287,ES +2988564288,2988564367,FR +2988564368,2988564383,GB +2988564384,2988564403,FR +2988564404,2988564407,ES +2988564408,2988566331,FR +2988566332,2988566332,GB +2988566333,2988572671,FR +2988572672,2988612607,RU +2988612608,2988613247,UA +2988613248,2988613248,RU +2988613249,2988613631,UA +2988613632,2988703743,RU +2988703744,2988834815,PL +2988834816,2988965887,CH +2988965888,2989096959,SK +2989096960,2989228031,PL +2989228032,2989490175,RU +2989490176,2989555711,HU +2989555712,2989588479,RU +2989588480,2989588735,CO +2989588736,2989588991,RU +2989588992,2989589503,CO +2989589504,2989621247,RU +2989621248,2989752319,BE +2989752320,2989785087,LB +2989785088,2989817855,SY +2989817856,2989883391,KW +2989883392,2989948927,UA +2989948928,2990014463,FI +2990014464,2990079999,PL +2990080000,2990096895,RU +2990096896,2990097023,KZ +2990097024,2990097151,US +2990097152,2990097279,KZ +2990097280,2990112767,RU +2990112768,2990129151,ES +2990129152,2990145535,RU +2990145536,2990211071,SI +2990211072,2990276607,GR +2990276608,2990342143,ES +2990342144,2990407679,KW +2990407680,2990440447,GB +2990440448,2990473215,NL +2990473216,2990475674,DE +2990475675,2990475675,HR +2990475676,2990538751,DE +2990538752,2991063039,RU +2991063040,2991067135,SE +2991067136,2991071231,DK +2991071232,2991079423,NO +2991079424,2991095807,RU +2991095808,2991103999,AM +2991104000,2991106047,RU +2991106048,2991112191,AM +2991112192,2991128575,CZ +2991128576,2991144959,PL +2991144960,2991161343,SA +2991161344,2991177727,FR +2991177728,2991179503,SE +2991179504,2991179507,ES +2991179508,2991191807,SE +2991191808,2991192063,FI +2991192064,2991194111,SE +2991194112,2991210495,NO +2991210496,2991243263,RU +2991243264,2991259647,UA +2991259648,2991292415,RU +2991292416,2991308799,FI +2991308800,2991325183,BG +2991325184,2991341567,AZ +2991341568,2991357951,MD +2991357952,2991374335,DE +2991374336,2991390719,RU +2991390720,2991407103,BA +2991407104,2991423487,DE +2991423488,2991439871,JO +2991439872,2991456255,CZ +2991456256,2991472639,RU +2991472640,2991489023,GB +2991489024,2991505407,AM +2991505408,2991521791,SE +2991521792,2991527935,RS +2991527936,2991529983,XK +2991529984,2991538175,RS +2991538176,2991554559,SI +2991554560,2991570943,GB +2991570944,2991581183,IT +2991581184,2991582207,DE +2991582208,2991583231,FR +2991583232,2991585279,DE +2991585280,2991587327,GB +2991587328,2991718399,SA +2991718400,2991849471,CH +2991849472,2991980543,NL +2991980544,2992111615,SA +2992111616,2992156159,KZ +2992156160,2992156415,RU +2992156416,2992373759,KZ +2992373760,2992635903,UA +2992635904,2993684479,GB +2993684480,2993946623,AT +2993946624,2994208767,BE +2994208768,2994733055,BY +2994733056,2994798591,GR +2994798592,2994929663,RU +2994929664,2994995199,IR +2994995200,2994997247,NL +2994997248,2994999295,BE +2994999296,2995003391,FR +2995003392,2995007487,BH +2995007488,2995009535,TR +2995009536,2995011583,ES +2995011584,2995013631,DE +2995013632,2995015679,SE +2995015680,2995017727,BG +2995017728,2995019775,IT +2995019776,2995021823,RU +2995021824,2995023871,IT +2995023872,2995044351,MD +2995044352,2995046399,ES +2995046400,2995048447,RU +2995048448,2995050495,NL +2995050496,2995050561,AL +2995050562,2995050562,XK +2995050563,2995052543,AL +2995052544,2995056639,DK +2995056640,2995058687,DE +2995058688,2995060735,SE +2995060736,2995126271,UA +2995126272,2995191807,GE +2995191808,2995257343,LB +2995257344,2995388415,UA +2995388416,2995453951,RO +2995453952,2995519487,ES +2995519488,2995650559,RU +2995650560,2995716095,DE +2995716096,2995781631,SK +2995781632,2995912703,BE +2995912704,2996043775,GR +2996043776,2996171263,RS +2996171264,2996171775,XK +2996171776,2996174847,RS +2996174848,2996305919,UA +2996305920,2996436991,QA +2996436992,2996469759,BY +2996469760,2996502399,RU +2996502400,2996502431,TR +2996502432,2996535295,RU +2996535296,2996568063,DK +2996568064,2996600831,ES +2996600832,2996633599,RO +2996633600,2996634111,IR +2996634112,2996634623,IT +2996634624,2996635647,IR +2996635648,2996637695,TR +2996637696,2996645887,FR +2996645888,2996649983,IR +2996649984,2996666367,RO +2996666368,2996682751,RU +2996682752,2996699135,DK +2996699136,2996764671,UA +2996764672,2996768767,GB +2996768768,2996773631,RU +2996773632,2996773887,KZ +2996773888,2996774399,RU +2996774400,2996774911,UA +2996774912,2996775423,RU +2996775424,2996775935,UA +2996775936,2996776959,BY +2996776960,2996781055,RU +2996781056,2996785151,RO +2996785152,2996789247,RU +2996789248,2996789503,UA +2996789504,2996789759,RU +2996789760,2996790015,UA +2996790016,2996790271,US +2996790272,2996790527,TR +2996790528,2996792063,UA +2996792064,2996792319,US +2996792320,2996797439,UA +2996797440,2996801535,PL +2996801536,2996805631,RO +2996805632,2996809727,PL +2996809728,2996813823,UA +2996813824,2996817919,PL +2996817920,2996826111,UA +2996826112,2996828159,BY +2996828160,2996830207,RU +2996830208,2996862975,HR +2996862976,2996895743,AM +2996895744,2996928511,KW +2996928512,2996994047,RU +2996994048,2997010431,NL +2997010432,2997026815,DE +2997026816,2997059583,RU +2997059584,2997092351,BY +2997092352,2997125119,NO +2997125120,2997157887,HU +2997157888,2997190655,UA +2997190656,2997223423,AT +2997223424,2997256191,PT +2997256192,2997321727,RU +2997321728,2997354495,IE +2997354496,2997387263,MD +2997387264,2997420031,BY +2997420032,2997428223,IR +2997428224,2997452799,RU +2997452800,2997485567,BG +2997485568,2997500415,FR +2997500416,2997500671,NL +2997500672,2997506559,FR +2997506560,2997506815,GB +2997506816,2997507071,ES +2997507072,2997507327,IT +2997507328,2997507583,DE +2997507584,2997508095,PT +2997508096,2997508351,DE +2997508352,2997508607,IT +2997508608,2997508863,ES +2997508864,2997509119,GB +2997509120,2997513345,FR +2997513346,2997513346,IT +2997513347,2997513347,ES +2997513348,2997513348,DE +2997513349,2997513349,PT +2997513350,2997513350,BE +2997513351,2997513351,LU +2997513352,2997513352,AT +2997513353,2997513353,NL +2997513354,2997513354,IE +2997513355,2997515683,FR +2997515684,2997515684,GB +2997515685,2997518335,FR +2997518336,2997519359,US +2997519360,2997520383,GL +2997520384,2997520895,NL +2997520896,2997521151,MT +2997521152,2997521407,US +2997521408,2997521663,UY +2997521664,2997521919,IN +2997521920,2997522431,GB +2997522432,2997522687,IT +2997522688,2997522943,BE +2997522944,2997523199,NO +2997523200,2997523455,GL +2997523456,2997525503,NL +2997525504,2997526527,TR +2997526528,2997543167,RU +2997543168,2997543423,NL +2997543424,2997543679,RU +2997543680,2997544191,NL +2997544192,2997544447,RU +2997544448,2997544959,NL +2997544960,2997551103,RU +2997551104,2997555199,AU +2997555200,2997557247,SG +2997557248,2997559295,TW +2997559296,2997560319,IN +2997560320,2997560831,KR +2997560832,2997561343,RU +2997561344,2997563391,TH +2997563392,2997567487,RU +2997567488,2997568511,IN +2997568512,2997569535,RU +2997569536,2997570559,IN +2997570560,2997573631,JP +2997573632,2997574655,IN +2997574656,2997576703,KR +2997576704,2997576959,NL +2997576960,2997577471,GB +2997577472,2997578239,RU +2997578240,2997578751,FR +2997578752,2997579775,RU +2997579776,2997581823,NL +2997581824,2997583871,TW +2997583872,2997616639,SY +2997616640,2997649407,SI +2997649408,2997682175,BY +2997682176,2997714943,RU +2997714944,2997739519,IR +2997739520,2997747711,AU +2997747712,2997780479,CH +2997780480,2997813247,SE +2997813248,2997846015,AL +2997846016,2997848665,MD +2997848666,2997848666,UM +2997848667,2997878783,MD +2997878784,2998140927,RU +2998140928,2998403071,PL +2998403072,2998665215,RU +2998665216,2998927359,AT +2998927360,2999451647,CH +2999451648,2999713791,DE +2999713792,2999975935,RU +2999975936,2999984127,FR +2999984128,2999989007,BE +2999989008,2999989015,NL +2999989016,2999989031,BE +2999989032,2999989055,NL +2999989056,2999989059,LU +2999989060,2999989119,BE +2999989120,2999989247,FR +2999989248,2999992319,BE +2999992320,3000000511,RU +3000000512,3000008703,DE +3000008704,3000016895,RU +3000016896,3000020991,GB +3000020992,3000021247,DZ +3000021248,3000021503,DE +3000021504,3000021759,GB +3000021760,3000022015,DE +3000022016,3000022271,BE +3000022272,3000022527,PT +3000022528,3000022783,DE +3000022784,3000025087,GB +3000025088,3000033279,GI +3000033280,3000041471,RU +3000041472,3000049919,BA +3000049920,3000057855,CH +3000057856,3000066047,UA +3000066048,3000074239,RU +3000074240,3000082431,CZ +3000082432,3000090623,DK +3000090624,3000131583,RU +3000131584,3000139775,DE +3000139776,3000147967,UA +3000147968,3000156159,TR +3000156160,3000164351,UA +3000164352,3000172543,HU +3000172544,3000180735,RU +3000180736,3000188927,TR +3000188928,3000197119,IT +3000197120,3000213503,UA +3000213504,3000221695,RU +3000221696,3000229887,TR +3000229888,3000238079,CH +3000238080,3000240127,KZ +3000240128,3000242175,RU +3000242176,3000244223,AT +3000244224,3000246271,PL +3000248320,3000252415,PL +3000252416,3000254463,RO +3000254464,3000256511,UA +3000256512,3000260607,RU +3000260608,3000262655,RS +3000262656,3000266751,UA +3000266752,3000268799,DE +3000268800,3000270847,PL +3000270848,3000272895,RU +3000272896,3000274943,IT +3000274944,3000283135,PL +3000283136,3000285183,RU +3000285184,3000287231,RO +3000287232,3000289279,UA +3000289280,3000291327,RO +3000291328,3000293375,RU +3000293376,3000295423,PL +3000295424,3000297471,RU +3000297472,3000301567,UA +3000301568,3000302591,RU +3000302592,3000303103,LV +3000303104,3000303359,CH +3000303360,3000303615,DE +3000303616,3000305663,UA +3000305664,3000313855,RU +3000313856,3000315903,CZ +3000315904,3000317951,LV +3000317952,3000319999,PL +3000320000,3000322047,FR +3000322048,3000322303,PL +3000322304,3000322559,GB +3000322560,3000322815,DE +3000322816,3000323071,RU +3000323072,3000323583,DE +3000323584,3000326143,RU +3000326144,3000330239,PL +3000330240,3000332287,UA +3000332288,3000334335,RU +3000334336,3000336383,PL +3000336384,3000338431,AM +3000338432,3000340479,PL +3000340480,3000342527,RU +3000342528,3000344575,CZ +3000344576,3000346623,PL +3000346624,3000348671,UA +3000348672,3000350719,RO +3000350720,3000352767,UA +3000352768,3000358911,RU +3000358912,3000360959,PL +3000360960,3000363007,RU +3000363008,3000365055,FI +3000365056,3000369151,RU +3000369152,3000377343,PL +3000377344,3000385535,RU +3000385536,3000393727,PS +3000393728,3000401919,NL +3000401920,3000410111,PL +3000410112,3000426495,UA +3000426496,3000434687,RU +3000434688,3000451071,IR +3000451072,3000467455,RU +3000467456,3000471551,GB +3000471552,3000475647,RU +3000475648,3000483839,UA +3000483840,3000487935,PL +3000487936,3000492031,PS +3000496128,3000506367,UA +3000506368,3000508415,PL +3000508416,3000510463,RU +3000510464,3000512511,PL +3000512512,3000513791,SE +3000513792,3000514047,PT +3000514048,3000514303,SE +3000514304,3000514559,BE +3000514560,3000516607,SI +3000516608,3000520703,RU +3000520704,3000522751,CZ +3000522752,3000524799,PL +3000524800,3000526847,UA +3000526848,3000528895,PL +3000528896,3000530943,IE +3000530944,3000532991,UA +3000532992,3000535039,UZ +3000535040,3000537087,PL +3000537088,3000539135,CZ +3000539136,3000543231,RU +3000543232,3000545279,UA +3000545280,3000547327,RU +3000547328,3000549375,UA +3000549376,3000551423,SE +3000551424,3000553471,PL +3000553472,3000555519,KG +3000555520,3000557567,RU +3000557568,3000561663,UA +3000563712,3000565759,IR +3000565760,3000567807,RU +3000567808,3000569855,RS +3000569856,3000571903,BE +3000571904,3000573951,RU +3000573952,3000575999,PL +3000576000,3000586239,RU +3000586240,3000588287,NL +3000590336,3000594431,RU +3000594432,3000596479,PL +3000596480,3000598527,RU +3000598528,3000600575,FI +3000600576,3000602623,PL +3000602624,3000604671,CZ +3000604672,3000606719,RU +3000606720,3000608767,UA +3000608768,3000610815,KG +3000610816,3000612863,RU +3000612864,3000612930,PL +3000612931,3000612931,PT +3000612932,3000613022,PL +3000613023,3000613023,PT +3000613024,3000613241,PL +3000613242,3000613242,PT +3000613243,3000616959,PL +3000616960,3000621055,UA +3000621056,3000623103,PL +3000623104,3000625151,RU +3000627200,3000629247,CZ +3000629248,3000631295,PL +3000631296,3000647679,RU +3000647680,3000651775,UA +3000651776,3000664063,RU +3000664064,3000668159,RO +3000672256,3000676351,HR +3000676352,3000680447,SA +3000682496,3000684543,UZ +3000684544,3000688639,RU +3000688640,3000692735,PL +3000696832,3000700927,RS +3000700928,3000705023,PL +3000705024,3000709119,RU +3000709120,3000713215,AM +3000713216,3000717311,IT +3000717312,3000721407,UA +3000721408,3000733695,PL +3000733696,3000737791,RU +3000737792,3000741887,UA +3000741888,3000745983,RU +3000745984,3000750079,UA +3000750080,3000754175,RU +3000754176,3000758271,IR +3000758272,3000762367,UA +3000762368,3000781311,RS +3000781312,3000781439,XK +3000781440,3000928767,RS +3000928768,3000929279,XK +3000929280,3001024511,RS +3001024512,3001548799,NL +3001548800,3001614335,NO +3001614336,3001679871,TR +3001679872,3001745407,RU +3001745408,3001810943,PL +3001810944,3001815039,IE +3001815040,3001819135,RU +3001819136,3001823231,IR +3001823232,3001827327,GE +3001827328,3001831423,SE +3001831424,3001835519,BA +3001835520,3001839615,IR +3001839616,3001843711,ES +3001843712,3001845759,RU +3001845760,3001846238,GB +3001846239,3001846239,RU +3001846240,3001846527,GB +3001846528,3001847807,RU +3001847808,3001851903,GB +3001851904,3001855999,IT +3001856000,3001857023,NL +3001857024,3001857279,MD +3001857280,3001859071,NL +3001859072,3001860095,MD +3001860096,3001861119,LV +3001861120,3001862143,LT +3001862144,3001863167,EE +3001863168,3001864191,LT +3001864192,3001868287,RU +3001868288,3001869311,US +3001869312,3001870591,FR +3001870592,3001870847,CA +3001870848,3001871103,FR +3001871104,3001871359,ID +3001871360,3001872383,US +3001872384,3001876479,RU +3001876480,3001880575,IT +3001880576,3001884671,RU +3001884672,3001888767,NL +3001892864,3001896959,AZ +3001896960,3001901055,CH +3001901056,3001905151,FR +3001905152,3001909247,GB +3001909248,3001917439,ES +3001917440,3001919487,GB +3001919488,3001919999,AU +3001920000,3001920255,GB +3001920256,3001920511,AU +3001920512,3001921535,GB +3001921536,3001929727,RU +3001929728,3001933823,RS +3001933824,3001937919,ES +3001937920,3001942015,RU +3001946112,3001950207,RU +3001950208,3001954303,CZ +3001954304,3001958399,IT +3001958400,3001962495,KZ +3001962496,3001966335,GB +3001966336,3001966591,DE +3001966592,3001970687,NL +3001970688,3001974783,RU +3001974784,3001982975,GB +3001982976,3001987071,CH +3001987072,3001991167,JO +3001991168,3001995263,IR +3001995264,3001999359,HU +3001999360,3002003455,DE +3002003456,3002011647,PL +3002011648,3002015743,BA +3002015744,3002019839,IT +3002019840,3002021271,NL +3002021272,3002021279,MT +3002021280,3002023935,NL +3002023936,3002028031,DE +3002028032,3002036223,GB +3002036224,3002040319,BG +3002040320,3002044415,PL +3002044416,3002048511,IR +3002048512,3002052607,GB +3002052608,3002056703,IT +3002056704,3002060799,FI +3002060800,3002064895,ES +3002064896,3002068991,BG +3002068992,3002073087,ES +3002073088,3002597375,TR +3002597376,3002599423,RU +3002599424,3002601471,CZ +3002601472,3002603519,IS +3002603520,3002605567,SE +3002605568,3002607615,GB +3002607616,3002609663,IR +3002609664,3002611711,GB +3002611712,3002613759,CZ +3002613760,3002615807,RU +3002615808,3002617855,PL +3002617856,3002619903,RU +3002619904,3002621951,IT +3002621952,3002623999,NO +3002624000,3002626047,GB +3002626048,3002626303,IN +3002626304,3002628095,DE +3002628096,3002630143,NO +3002630144,3002632191,GB +3002632192,3002634239,EE +3002634240,3002636287,IT +3002636288,3002638335,NL +3002638336,3002640383,BE +3002640384,3002642431,NL +3002642432,3002644479,IT +3002644480,3002648575,FR +3002648576,3002650623,HU +3002650624,3002652671,FR +3002652672,3002654719,DE +3002654720,3002656767,NL +3002656768,3002657068,RU +3002657069,3002657069,EE +3002657070,3002658815,RU +3002658816,3002660863,DE +3002660864,3002662911,CZ +3002662912,3002664959,DE +3002664960,3002667007,ES +3002667008,3002669055,GE +3002669056,3002671103,DE +3002671104,3002673151,LV +3002673152,3002675199,GB +3002675200,3002677247,DK +3002677248,3002683391,RU +3002683392,3002685439,DE +3002685440,3002687487,PL +3002687488,3002688511,GB +3002688512,3002689535,NL +3002689536,3002691583,IL +3002691584,3002693631,MK +3002693632,3002695679,NO +3002695680,3002697727,RU +3002697728,3002699775,DE +3002699776,3002701823,SE +3002701824,3002703871,NL +3002703872,3002705919,FR +3002705920,3002707967,BG +3002707968,3002710015,KW +3002710016,3002712063,IT +3002712064,3002714111,LU +3002714112,3002716159,IT +3002716160,3002718207,CZ +3002718208,3002722303,IT +3002724352,3002726399,RU +3002726400,3002728447,NL +3002728448,3002730495,FR +3002730496,3002732543,DE +3002732544,3002734591,NL +3002734592,3002736639,CH +3002736640,3002738687,LT +3002738688,3002740735,PL +3002740736,3002742783,GB +3002742784,3002744831,LI +3002744832,3002746879,IT +3002746880,3002748927,GB +3002748928,3002750975,DE +3002750976,3002753023,TR +3002753024,3002755071,GB +3002755072,3002757119,FR +3002757120,3002759167,IE +3002759168,3002761215,DE +3002761216,3002763263,CH +3002763264,3002765311,RS +3002765312,3002767359,NL +3002767360,3002769407,RU +3002769408,3002773503,DE +3002773504,3002775551,GB +3002775552,3002777599,RO +3002777600,3002779647,NL +3002779648,3002781695,IT +3002781696,3002783743,FR +3002783744,3002785791,NO +3002785792,3002789887,DE +3002789888,3002791935,RU +3002791936,3002793983,AE +3002793984,3002796031,DK +3002796032,3002798079,DE +3002798080,3002800127,FR +3002800128,3002802175,NL +3002802176,3002804223,GB +3002804224,3002806271,TR +3002806272,3002808319,DE +3002808320,3002810367,FI +3002810368,3002812415,AT +3002812416,3002814463,IT +3002814464,3002816511,FR +3002816512,3002818559,DE +3002818560,3002820607,RU +3002820608,3002822655,UA +3002822656,3002824703,DE +3002826752,3002828799,SE +3002828800,3002830847,RU +3002830848,3002834943,FI +3002834944,3002835063,BE +3002835064,3002835067,LU +3002835068,3002836319,BE +3002836320,3002836335,LU +3002836336,3002836991,BE +3002836992,3002841087,GB +3002841088,3002843135,CZ +3002843136,3002845183,NL +3002845184,3002847231,FR +3002847232,3002849279,IR +3002849280,3002851327,RU +3002851328,3002853375,DE +3002853376,3002855423,GB +3002855424,3002857471,SE +3002857472,3002859519,FR +3002859520,3002875903,PL +3002875904,3002892287,RU +3002892288,3002908671,IR +3002908672,3002925055,RU +3002925056,3002941439,IR +3002941440,3002957823,SY +3002957824,3002974207,SK +3002974208,3002990591,RS +3002990592,3003006975,DE +3003006976,3003023359,LU +3003023360,3003039743,RS +3003039744,3003056127,BG +3003056128,3003058175,DE +3003058176,3003060223,EE +3003060224,3003062271,DE +3003062272,3003064319,NL +3003064320,3003066367,RO +3003066368,3003068415,PL +3003068416,3003070463,NL +3003070464,3003074559,GB +3003074560,3003076607,IT +3003076608,3003078143,GB +3003078144,3003078151,US +3003078152,3003078155,IN +3003078156,3003080703,GB +3003080704,3003082751,FR +3003082752,3003084799,ES +3003086848,3003088895,RU +3003088896,3003090943,FR +3003090944,3003092991,DE +3003092992,3003095039,NO +3003095040,3003095295,AT +3003095296,3003095551,CH +3003095552,3003095807,CZ +3003095808,3003096063,IT +3003096064,3003097087,AT +3003097088,3003099135,FR +3003099136,3003101183,CZ +3003101184,3003103231,UA +3003103232,3003105279,IT +3003105280,3003109375,NL +3003109376,3003111423,FR +3003111424,3003113471,IT +3003113472,3003115519,ES +3003115520,3003117567,RU +3003117568,3003119615,IT +3003119616,3003121663,RU +3003121664,3003122175,AR +3003122176,3003122687,CL +3003122688,3003123711,AR +3003123712,3003123967,CL +3003123968,3003124479,CO +3003124480,3003124735,AR +3003124736,3003125247,SV +3003125248,3003125503,AR +3003125504,3003125759,CO +3003125760,3003126783,CL +3003126784,3003127807,CR +3003127808,3003128063,CO +3003128064,3003128319,AR +3003128320,3003128575,PY +3003128576,3003128831,CO +3003128832,3003129087,TT +3003129088,3003129343,CO +3003129344,3003129599,BO +3003129600,3003129855,HN +3003129856,3003138047,MX +3003138048,3003146239,HN +3003146240,3003150335,GT +3003150336,3003154431,SV +3003154432,3003154687,CL +3003154688,3003154943,EC +3003154944,3003159039,AR +3003159040,3003159295,CO +3003159296,3003159807,AR +3003159808,3003160063,BR +3003160064,3003160575,AR +3003160576,3003160831,CL +3003160832,3003161087,PE +3003161088,3003161343,CO +3003161344,3003161599,CL +3003161600,3003162623,UY +3003162624,3003170815,CR +3003170816,3003171071,GT +3003171072,3003171327,AR +3003171328,3003171839,PA +3003171840,3003172863,TT +3003172864,3003173375,PA +3003173376,3003173631,CR +3003173632,3003173887,AR +3003173888,3003174143,EC +3003174144,3003174399,CO +3003174400,3003174911,BR +3003174912,3003179007,CR +3003179008,3003187199,AR +3003187200,3003189215,CO +3003189216,3003189247,AT +3003189248,3003252735,CO +3003252736,3003449343,CL +3003449344,3003514879,SV +3003514880,3003645951,PE +3003645952,3003777023,CL +3003777024,3003908095,BR +3003908096,3004170239,CO +3004170240,3004301311,BR +3004301312,3004432383,CO +3004432384,3004694527,VE +3004694528,3005218815,UY +3005218816,3005349887,CO +3005349888,3005480959,BR +3005480960,3005874175,AR +3005874176,3005890559,PA +3005890560,3005890815,CO +3005890816,3005893887,PA +3005893888,3005894655,CO +3005894656,3005895423,PA +3005895424,3005896191,CO +3005896192,3005896703,PA +3005896704,3005897215,CO +3005897216,3005897471,PA +3005897472,3005899519,CO +3005899520,3005900031,PA +3005900032,3005901055,CO +3005901056,3005901567,PA +3005901568,3005903103,CO +3005903104,3005903359,PA +3005903360,3005905407,CO +3005905408,3005905663,PA +3005905664,3005906687,CO +3005906688,3005911039,PA +3005911040,3005911807,CO +3005911808,3005912319,PA +3005912320,3005912575,CO +3005912576,3005912831,PA +3005912832,3005913087,CO +3005913088,3005913599,PA +3005913600,3005913855,CO +3005913856,3005914623,PA +3005914624,3005915135,CO +3005915136,3005918207,AR +3005918208,3005919231,CO +3005919232,3005923327,AR +3005923328,3005939711,BZ +3005956096,3005960191,AR +3005960192,3005965311,PE +3005965312,3005966335,AR +3005966336,3005968383,CO +3005968384,3005972479,AR +3005972480,3005988863,CH +3005988864,3006005247,DO +3006005248,3006267391,VE +3006267392,3006283775,PA +3006283776,3006284287,CR +3006284288,3006284543,PA +3006284544,3006284799,CR +3006284800,3006285055,PA +3006285056,3006285567,CR +3006285568,3006286335,PA +3006286336,3006286591,CR +3006286592,3006286847,PA +3006286848,3006287103,CR +3006287104,3006287871,PA +3006287872,3006288383,CR +3006288384,3006288639,PA +3006288640,3006289151,CR +3006289152,3006289663,PA +3006289664,3006291711,CR +3006291712,3006308351,PA +3006308352,3006308863,CR +3006308864,3006309631,PA +3006309632,3006311167,CR +3006311168,3006311423,PA +3006311424,3006312191,CR +3006312192,3006312447,PA +3006312448,3006312703,CR +3006312704,3006312959,PA +3006312960,3006313983,CR +3006313984,3006314239,PA +3006314240,3006315007,CR +3006315008,3006315263,PA +3006315264,3006315775,CR +3006315776,3006316031,PA +3006316032,3006316543,CR +3006316544,3006320639,PA +3006320640,3006320895,CR +3006320896,3006321151,PA +3006321152,3006321407,CR +3006321408,3006322175,PA +3006322176,3006322431,CR +3006322432,3006323199,PA +3006323200,3006324735,CR +3006324736,3006328831,PA +3006328832,3006329599,NI +3006329600,3006329855,PA +3006329856,3006330111,NI +3006330112,3006330623,PA +3006330624,3006330879,NI +3006330880,3006331903,CR +3006331904,3006332927,AR +3006332928,3006349311,EC +3006349312,3006349847,PE +3006349848,3006349855,BO +3006349856,3006351359,PE +3006351360,3006353407,AR +3006353408,3006357503,DO +3006357504,3006361599,AR +3006361600,3006363647,HN +3006363648,3006365695,AR +3006365696,3006431231,CO +3006431232,3006463999,CR +3006464000,3006480383,SV +3006480384,3006484479,DO +3006484480,3006488575,AR +3006488576,3006496767,CO +3006496768,3006521343,CR +3006521344,3006527487,AR +3006527488,3006528511,BR +3006528512,3006529535,BZ +3006529536,3006660607,DO +3006660608,3006791679,BR +3006791680,3006922751,CL +3006922752,3007053823,BO +3007053824,3007062015,AR +3007062016,3007066111,CO +3007066112,3007070207,EC +3007070208,3007078399,CL +3007078400,3007082495,AR +3007082496,3007086591,BO +3007090688,3007091199,NL +3007091200,3007092223,RU +3007092224,3007092479,VE +3007092480,3007092735,IR +3007092736,3007094783,AR +3007094784,3007096831,CR +3007096832,3007098879,AR +3007098880,3007099463,HN +3007099464,3007099471,IN +3007099472,3007099631,HN +3007099632,3007099639,GB +3007099640,3007100055,HN +3007100056,3007100063,BR +3007100064,3007100407,HN +3007100408,3007100415,PH +3007100416,3007100463,HN +3007100464,3007100471,IN +3007100472,3007100927,HN +3007100928,3007102975,AR +3007102976,3007103999,US +3007104000,3007106047,AR +3007106048,3007107071,PE +3007107072,3007108095,AR +3007108096,3007109119,TT +3007109120,3007111167,AR +3007111168,3007112191,PE +3007112192,3007115263,AR +3007115264,3007116287,CO +3007116288,3007117311,EC +3007117312,3007122431,AR +3007122432,3007122943,CL +3007122944,3007123199,PE +3007123200,3007123455,CO +3007123456,3007143935,AR +3007143936,3007148031,CL +3007148032,3007152127,CO +3007152128,3007152383,DE +3007152384,3007152639,US +3007152640,3007153279,DE +3007153280,3007153407,US +3007153408,3007153919,DE +3007153920,3007154175,US +3007154176,3007154303,DE +3007154304,3007154687,US +3007154688,3007154943,DE +3007154944,3007155199,US +3007155200,3007155327,DE +3007155328,3007155711,US +3007155712,3007155967,DE +3007155968,3007156223,AT +3007156224,3007156351,DE +3007156352,3007156479,US +3007156480,3007156495,ES +3007156496,3007156543,DE +3007156544,3007156607,GB +3007156608,3007156991,DE +3007156992,3007157007,HR +3007157008,3007157055,DE +3007157056,3007157119,GB +3007157120,3007157375,DE +3007157376,3007157503,US +3007157504,3007157519,IE +3007157520,3007157567,DE +3007157568,3007157631,GB +3007157632,3007157759,US +3007157760,3007158015,DE +3007158016,3007158031,BE +3007158032,3007158079,DE +3007158080,3007158143,GB +3007158144,3007158399,DE +3007158400,3007158527,US +3007158528,3007158543,GB +3007158544,3007158591,DE +3007158592,3007158655,GB +3007158656,3007159039,DE +3007159040,3007159055,GB +3007159056,3007159103,DE +3007159104,3007159167,GB +3007159168,3007159295,US +3007159296,3007159423,DE +3007159424,3007159551,US +3007159552,3007159567,RU +3007159568,3007159615,DE +3007159616,3007159679,GB +3007159680,3007160063,DE +3007160064,3007160079,HR +3007160080,3007160127,DE +3007160128,3007160191,GB +3007160192,3007160447,DE +3007160448,3007160575,US +3007160576,3007160591,IE +3007160592,3007160607,US +3007160608,3007160639,DE +3007160640,3007160655,GB +3007160656,3007160703,DE +3007160704,3007160831,US +3007160832,3007161087,DE +3007161088,3007161103,GB +3007161104,3007161151,DE +3007161152,3007161167,GB +3007161168,3007161471,DE +3007161472,3007161599,US +3007161600,3007161615,GB +3007161616,3007161663,DE +3007161664,3007161679,GB +3007161680,3007162111,DE +3007162112,3007162127,ES +3007162128,3007162175,DE +3007162176,3007162191,GB +3007162192,3007162239,DE +3007162240,3007162367,US +3007162368,3007162495,DE +3007162496,3007162623,US +3007162624,3007162639,NL +3007162640,3007162687,DE +3007162688,3007162703,GB +3007162704,3007163135,DE +3007163136,3007163151,GB +3007163152,3007163519,DE +3007163520,3007163647,US +3007163648,3007163663,ES +3007163664,3007163775,DE +3007163776,3007163903,US +3007163904,3007164159,DE +3007164160,3007164175,SK +3007164176,3007164543,DE +3007164544,3007164671,US +3007164672,3007164687,SE +3007164688,3007165183,DE +3007165184,3007165199,GB +3007165200,3007165311,DE +3007165312,3007165439,US +3007165440,3007165567,DE +3007165568,3007165695,US +3007165696,3007165711,DK +3007165712,3007166207,DE +3007166208,3007166223,TR +3007166224,3007166591,DE +3007166592,3007166719,US +3007166720,3007166735,GB +3007166736,3007166847,DE +3007166848,3007166975,US +3007166976,3007167231,DE +3007167232,3007167247,ES +3007167248,3007167615,DE +3007167616,3007167743,US +3007167744,3007167759,AU +3007167760,3007168127,DE +3007168128,3007168255,US +3007168256,3007168271,GR +3007168272,3007168383,DE +3007168384,3007168511,US +3007168512,3007168767,QA +3007168768,3007169023,CL +3007169024,3007169151,US +3007169152,3007169279,CL +3007169280,3007170047,US +3007170048,3007170303,MX +3007170304,3007170559,US +3007170560,3007171071,DE +3007171072,3007171327,US +3007171328,3007171583,ES +3007171584,3007171839,US +3007171840,3007171855,CL +3007171856,3007171871,US +3007171872,3007171873,BR +3007171874,3007171875,CL +3007171876,3007172095,BR +3007172096,3007172351,US +3007172352,3007172383,FR +3007172384,3007172415,BE +3007172416,3007172447,CL +3007172448,3007172607,BR +3007172608,3007172863,US +3007172864,3007173023,BR +3007173024,3007173055,NZ +3007173056,3007173119,BR +3007173120,3007173375,US +3007173376,3007173407,NO +3007173408,3007173439,SE +3007173440,3007173631,BR +3007173632,3007173663,NO +3007173664,3007173695,NZ +3007173696,3007173887,BR +3007173888,3007174015,US +3007174016,3007174047,NL +3007174048,3007174079,FR +3007174080,3007174271,BR +3007174272,3007174303,FI +3007174304,3007174335,NL +3007174336,3007174431,BR +3007174432,3007174463,IT +3007174464,3007174655,BR +3007174656,3007175679,US +3007175680,3007175935,GB +3007175936,3007175967,NZ +3007175968,3007175999,BE +3007176000,3007176319,BR +3007176320,3007176351,SE +3007176352,3007176383,FR +3007176384,3007176447,BR +3007176448,3007176703,US +3007176704,3007177727,IN +3007177728,3007178751,US +3007178752,3007179007,NL +3007179008,3007179263,KR +3007179264,3007179775,US +3007179776,3007180031,SG +3007180032,3007181055,US +3007181056,3007181183,BR +3007181184,3007181215,IT +3007181216,3007181247,IS +3007181248,3007181311,BR +3007181312,3007181567,US +3007181568,3007181599,NL +3007181600,3007181631,AU +3007181632,3007181823,BR +3007181824,3007181855,BE +3007181856,3007181887,NO +3007181888,3007182079,BR +3007182080,3007182335,US +3007182336,3007182591,BR +3007182592,3007182623,SE +3007182624,3007182655,NL +3007182656,3007182847,BR +3007182848,3007183103,US +3007183104,3007183231,BR +3007183232,3007183263,NZ +3007183264,3007183295,IT +3007183296,3007183359,BR +3007183360,3007183615,AU +3007183616,3007183871,IE +3007183872,3007184127,US +3007184128,3007184383,KW +3007184384,3007184895,BR +3007184896,3007250431,AR +3007250432,3007283199,CR +3007283200,3007283455,PA +3007283456,3007283711,CR +3007283712,3007284223,PA +3007284224,3007284735,CR +3007284736,3007285247,PA +3007285248,3007285503,CR +3007285504,3007285759,PA +3007285760,3007286015,CR +3007286016,3007286271,PA +3007286272,3007286783,CR +3007286784,3007287295,PA +3007287296,3007299583,CR +3007299584,3007301631,PA +3007301632,3007305727,AR +3007305728,3007307775,BZ +3007307776,3007310847,CL +3007310848,3007312895,AR +3007312896,3007313919,CL +3007313920,3007314943,AR +3007314944,3007315967,HN +3007315968,3019898879,BR +3019898880,3024093183,JP +3024093184,3024617471,KR +3024617472,3024879615,MY +3024879616,3025141759,CN +3025141760,3025403903,KR +3025403904,3025600511,CN +3025600512,3025601663,IN +3025601664,3025601791,HK +3025601792,3025601919,IN +3025601920,3025602047,CN +3025602048,3025602303,HK +3025602304,3025602559,IN +3025602560,3025602815,SG +3025602816,3025603071,IN +3025603072,3025603091,HK +3025603092,3025603103,CN +3025603104,3025603215,HK +3025603216,3025603231,CN +3025603232,3025603247,HK +3025603248,3025603257,CN +3025603258,3025603259,IN +3025603260,3025603271,HK +3025603272,3025603327,IN +3025603328,3025603335,GU +3025603336,3025603583,IN +3025603584,3025603839,SG +3025603840,3025604095,HK +3025604096,3025604351,IN +3025604352,3025606655,SG +3025606656,3025606815,IN +3025606816,3025606831,SG +3025606832,3025607167,IN +3025607168,3025607423,SG +3025607424,3025607679,HK +3025607680,3025608191,IN +3025608192,3025608203,JP +3025608204,3025608207,IN +3025608208,3025608223,SG +3025608224,3025608447,IN +3025608448,3025608703,HK +3025608704,3025610751,IN +3025610752,3025612799,SG +3025612800,3025612815,IN +3025612816,3025612831,SG +3025612832,3025612895,IN +3025612896,3025613087,SG +3025613088,3025613119,IN +3025613120,3025613351,SG +3025613352,3025613367,IN +3025613368,3025613375,SG +3025613376,3025613455,IN +3025613456,3025613463,SG +3025613464,3025616895,IN +3025616896,3025617439,SG +3025617440,3025617447,IN +3025617448,3025617455,SG +3025617456,3025617487,IN +3025617488,3025617503,SG +3025617504,3025617663,IN +3025617664,3025617919,SG +3025617920,3025618175,MY +3025618176,3025618179,TH +3025618180,3025618431,IN +3025618432,3025618687,TW +3025618688,3025618943,IN +3025618944,3025619535,SG +3025619536,3025619551,IN +3025619552,3025619719,SG +3025619720,3025619967,IN +3025619968,3025620243,TW +3025620244,3025620991,IN +3025620992,3025621247,PH +3025621248,3025621503,IN +3025621504,3025621759,PH +3025621760,3025622015,IN +3025622016,3025622447,SG +3025622448,3025622527,IN +3025622528,3025622783,ID +3025622784,3025623055,IN +3025623056,3025623103,SG +3025623104,3025623247,IN +3025623248,3025623251,HK +3025623252,3025623295,IN +3025623296,3025623551,JP +3025623552,3025623807,SG +3025623808,3025624063,IN +3025624064,3025624319,TW +3025624320,3025624335,IN +3025624336,3025624343,HK +3025624344,3025625343,IN +3025625344,3025625375,SG +3025625376,3025625391,IN +3025625392,3025625395,CA +3025625396,3025625399,IN +3025625400,3025625407,TH +3025625408,3025625471,SG +3025625472,3025625503,MY +3025625504,3025625535,SG +3025625536,3025625599,CA +3025625600,3025625855,SG +3025625856,3025625887,IN +3025625888,3025625915,SG +3025625916,3025625919,IN +3025625920,3025625927,KR +3025625928,3025625935,IN +3025625936,3025626015,SG +3025626016,3025626047,IN +3025626048,3025626079,SG +3025626080,3025626111,IN +3025626112,3025626623,SG +3025626624,3025629439,IN +3025629440,3025629567,HK +3025629568,3025629695,IN +3025629696,3025629951,HK +3025629952,3025630031,AU +3025630032,3025630207,IN +3025630208,3025630719,AU +3025630720,3025630975,JP +3025630976,3025631239,IN +3025631240,3025631247,AU +3025631248,3025631487,IN +3025631488,3025631743,HK +3025631744,3025631747,IN +3025631748,3025631767,HK +3025631768,3025631775,IN +3025631776,3025631839,HK +3025631840,3025631999,IN +3025632000,3025632255,HK +3025632256,3025632439,SG +3025632440,3025632447,IN +3025632448,3025632463,SG +3025632464,3025632479,HK +3025632480,3025632511,IN +3025632512,3025633151,SG +3025633152,3025633535,IN +3025633536,3025633791,HK +3025633792,3025633807,AU +3025633808,3025633823,IN +3025633824,3025633855,AU +3025633856,3025633919,IN +3025633920,3025634047,MY +3025634048,3025636351,IN +3025636352,3025636607,SG +3025636608,3025637151,IN +3025637152,3025637183,MY +3025637184,3025637375,IN +3025637376,3025637631,HK +3025637632,3025637887,MY +3025637888,3025638015,IN +3025638016,3025638047,HK +3025638048,3025638063,MY +3025638064,3025638143,IN +3025638144,3025638175,MY +3025638176,3025638183,SG +3025638184,3025638199,IN +3025638200,3025638207,SG +3025638208,3025638279,IN +3025638280,3025638303,SG +3025638304,3025638399,IN +3025638400,3025638655,SG +3025638656,3025638783,IN +3025638784,3025638791,HK +3025638792,3025639167,IN +3025639168,3025639175,SG +3025639176,3025639295,IN +3025639296,3025639327,AU +3025639328,3025639423,IN +3025639424,3025639535,SG +3025639536,3025639551,HK +3025639552,3025639679,SG +3025639680,3025639807,HK +3025639808,3025639839,IN +3025639840,3025639871,HK +3025639872,3025639883,CN +3025639884,3025639903,HK +3025639904,3025639943,IN +3025639944,3025639951,JP +3025639952,3025639967,IN +3025639968,3025639999,SG +3025640000,3025640191,IN +3025640192,3025640447,JP +3025640448,3025640835,MY +3025640836,3025640839,IN +3025640840,3025640855,MY +3025640856,3025640863,IN +3025640864,3025640895,MY +3025640896,3025641727,IN +3025641728,3025641751,HK +3025641752,3025641759,IN +3025641760,3025641779,HK +3025641780,3025641983,IN +3025641984,3025642495,HK +3025642496,3025642751,SG +3025642752,3025643039,IN +3025643040,3025643071,HK +3025643072,3025647103,IN +3025647104,3025647359,SG +3025647360,3025647615,AU +3025647616,3025647775,IN +3025647776,3025647791,SG +3025647792,3025647839,IN +3025647840,3025647871,SG +3025647872,3025647903,HK +3025647904,3025647935,IN +3025647936,3025647967,SG +3025647968,3025648079,IN +3025648080,3025648087,SG +3025648088,3025648091,US +3025648092,3025648095,SG +3025648096,3025648127,IN +3025648128,3025648383,SG +3025648384,3025649151,IN +3025649152,3025649663,HK +3025649664,3025666047,IN +3025666048,3025928191,CN +3025928192,3025932287,TW +3025932288,3025944575,JP +3025944576,3025960959,KR +3025960960,3025969151,PK +3025969152,3025973247,IN +3025973248,3025974271,AU +3025974272,3025975295,HK +3025975296,3025977343,SG +3025977344,3025979391,AU +3025979392,3025981439,IN +3025981440,3025982463,AU +3025982464,3025983487,ID +3025983488,3025985535,AU +3025985536,3025989631,BD +3025989632,3025993727,KR +3025993728,3026059263,VN +3026059264,3026067455,PH +3026067456,3026068479,IN +3026068480,3026069503,PH +3026069504,3026071551,JP +3026071552,3026073599,AU +3026073600,3026075647,CN +3026075648,3026083839,AF +3026083840,3026087935,CN +3026087936,3026089983,AU +3026089984,3026092031,CN +3026092032,3026104319,MO +3026104320,3026106367,CN +3026106368,3026108415,MO +3026108416,3026116607,JP +3026116608,3026118655,HK +3026118656,3026120703,AU +3026120704,3026124799,JP +3026124800,3026157567,AU +3026157568,3028287487,CN +3028287488,3028353023,TH +3028353024,3028385791,SG +3028385792,3028484095,CN +3028484096,3028500479,KR +3028500480,3028516863,JP +3028516864,3028518911,AU +3028518912,3028520959,JP +3028520960,3028521983,ID +3028521984,3028523007,LA +3028523008,3028525055,JP +3028525056,3028533247,HK +3028533248,3028549631,JP +3028549632,3028811775,KR +3028811776,3029336063,CN +3029336064,3029598207,JP +3029598208,3029600255,VN +3029600256,3029601279,AU +3029601280,3029602303,IN +3029602304,3029604351,CN +3029604352,3029605375,AU +3029605376,3029606399,JP +3029606400,3029614591,IN +3029614592,3029622783,AU +3029622784,3029630975,NZ +3029630976,3029635071,VN +3029635072,3029637119,JP +3029637120,3029639167,CN +3029639168,3029643263,JP +3029643264,3029644287,AU +3029644288,3029645311,KR +3029645312,3029651455,JP +3029651456,3029653503,BD +3029653504,3029663743,CN +3029663744,3029671935,BD +3029671936,3029680127,IN +3029680128,3029696511,MN +3029696512,3029704703,CN +3029704704,3029712895,JP +3029712896,3029714943,AU +3029714944,3029715199,JP +3029715200,3029715455,AU +3029715456,3029716991,JP +3029716992,3029721087,PK +3029721088,3029722111,IN +3029722112,3029722623,AU +3029722624,3029722879,JP +3029722880,3029723135,NZ +3029723136,3029724159,BD +3029724160,3029725183,CN +3029725184,3029727231,IN +3029727232,3029728255,AU +3029728256,3029729279,HK +3029729280,3029762047,AU +3029762048,3029770239,HK +3029770240,3029778431,CN +3029778432,3029788671,KR +3029788672,3029790719,ID +3029790720,3029791743,IN +3029791744,3029792767,ID +3029792768,3029793791,IN +3029793792,3029794815,PG +3029794816,3029860351,IN +3029860352,3031433215,CN +3031433216,3031564287,TW +3031564288,3031572479,IN +3031572480,3031580671,HK +3031580672,3031581695,AU +3031581696,3031582719,JP +3031582720,3031584767,SG +3031584768,3031587839,JP +3031587840,3031592959,ID +3031592960,3031595007,CN +3031595008,3031596031,AU +3031596032,3031597055,KH +3031597056,3031613439,PK +3031613440,3031629823,CN +3031629824,3031695359,IN +3031695360,3031760895,TH +3031760896,3031826431,AU +3031826432,3031891967,KR +3031891968,3031957503,TH +3031957504,3032252415,CN +3032252416,3032271871,HK +3032271872,3032272895,AU +3032272896,3032276991,JP +3032276992,3032285183,IN +3032285184,3032289279,JP +3032289280,3032293375,AU +3032293376,3032301567,JP +3032301568,3032317951,KR +3032317952,3032319999,JP +3032320000,3032323071,AU +3032323072,3032324095,CN +3032324096,3032326143,AU +3032326144,3032330239,TL +3032330240,3032334335,KR +3032334336,3032342527,NZ +3032342528,3032350719,JP +3032350720,3032743935,PH +3032743936,3033038847,JP +3033038848,3033063423,AU +3033063424,3033065471,JP +3033065472,3033066495,MY +3033066496,3033067519,BD +3033067520,3033068543,IN +3033068544,3033069567,AU +3033069568,3033070591,JP +3033070592,3033268223,CN +3033268224,3033530367,TW +3033530368,3033661439,CN +3033661440,3033694207,KR +3033694208,3033710591,BD +3033710592,3033712639,KR +3033712640,3033714687,SG +3033714688,3033715711,NZ +3033715712,3033716735,CN +3033716736,3033717759,TH +3033717760,3033718783,BD +3033718784,3033719807,HK +3033719808,3033726975,CN +3033726976,3033743359,KR +3033743360,3033745407,IN +3033745408,3033747455,JP +3033747456,3033748479,IN +3033748480,3033749503,JP +3033749504,3033751551,ID +3033751552,3033759743,IN +3033759744,3033792511,BD +3033792512,3033923583,CN +3033923584,3033939967,JP +3033939968,3033948159,AU +3033948160,3033956351,NC +3033956352,3033964543,IN +3033964544,3033966591,HK +3033966592,3033968639,AU +3033968640,3033972735,TW +3033972736,3033980927,TH +3033980928,3033982975,JP +3033982976,3033983999,ID +3033984000,3033985023,VN +3033985024,3033989119,ID +3033989120,3034054655,IN +3034054656,3034120191,AU +3034120192,3034251263,TW +3034251264,3034316799,HK +3034316800,3034447871,JP +3034447872,3034456063,AU +3034456064,3034464255,JP +3034464256,3034466303,NZ +3034466304,3034472447,JP +3034472448,3034478591,IN +3034478592,3034479615,TH +3034479616,3034480639,NZ +3034480640,3034482687,SG +3034482688,3034484735,AF +3034484736,3034488831,TH +3034488832,3034492927,AU +3034492928,3034497023,JP +3034497024,3034499071,AU +3034499072,3034500095,HK +3034500096,3034501118,PH +3034501119,3034501119,TW +3034501120,3034502143,VU +3034502144,3034503167,IN +3034503168,3034504191,ID +3034504192,3034505215,KR +3034505216,3034578943,CN +3034578944,3035103231,KR +3035103232,3035168767,PH +3035168768,3035193343,CN +3035193344,3035197439,JP +3035197440,3035198463,SG +3035198464,3035198719,KR +3035198720,3035198975,SG +3035198976,3035199487,HK +3035199488,3035200511,IN +3035200512,3035202559,AU +3035202560,3035205631,JP +3035205632,3035206655,CN +3035206656,3035207679,IN +3035207680,3035209727,ID +3035209728,3035217919,HK +3035217920,3035234303,KR +3035234304,3035299839,BD +3035299840,3035316223,JP +3035316224,3035324415,CN +3035324416,3035326463,JP +3035326464,3035327487,NZ +3035327488,3035328511,AU +3035328512,3035329535,CN +3035329536,3035330559,MM +3035330560,3035331583,IN +3035331584,3035332607,JP +3035332608,3035333631,AU +3035333632,3035334655,HK +3035334656,3035334911,DE +3035334912,3035335423,JP +3035335424,3035335679,US +3035335680,3035337727,JP +3035337728,3035338751,ID +3035338752,3035339775,SG +3035339776,3035340799,AU +3035340800,3035348991,MN +3035348992,3035357183,AU +3035357184,3035365375,JP +3035365376,3035627519,KR +3035627520,3035660287,ID +3035660288,3035673343,SG +3035673344,3035673599,US +3035673600,3035676671,SG +3035676672,3035676927,US +3035676928,3035693055,SG +3035693056,3036610559,ID +3036610560,3036676095,SG +3036676096,3037697047,AR +3037697048,3037697055,US +3037697056,3037790207,AR +3037790208,3037986815,VE +3037986816,3038773247,AR +3038773248,3038904319,CO +3038904320,3039035391,VE +3039035392,3039166463,DO +3039166464,3039231999,PA +3039232000,3039297535,EC +3039297536,3039363071,PY +3039363072,3039379455,AW +3039379456,3039395839,GY +3039395840,3039396351,US +3039396352,3039396607,NL +3039396608,3039398911,US +3039398912,3039399935,BZ +3039399936,3039407103,US +3039407104,3039408127,BZ +3039408128,3039410175,US +3039410176,3039411199,BZ +3039411200,3039412223,CA +3039412224,3039412351,CL +3039412352,3039412479,BR +3039412480,3039412735,SG +3039412736,3039412991,TW +3039412992,3039413503,US +3039413504,3039414015,BR +3039414016,3039414527,US +3039414528,3039414783,BR +3039414784,3039415039,IT +3039415040,3039415295,BR +3039415296,3039415551,US +3039415552,3039415807,BR +3039415808,3039416575,US +3039416576,3039416591,BR +3039416592,3039416607,SG +3039416608,3039416713,BR +3039416714,3039416715,US +3039416716,3039416719,SG +3039416720,3039416735,BR +3039416736,3039416739,US +3039416740,3039416741,SG +3039416742,3039417087,BR +3039417088,3039417343,DE +3039417344,3039417599,BR +3039417600,3039417855,US +3039417856,3039418111,BR +3039418112,3039418623,US +3039418624,3039418879,BR +3039418880,3039419135,US +3039419136,3039419583,BR +3039419584,3039419647,SG +3039419648,3039419839,BR +3039419840,3039419903,SG +3039419904,3039420415,BR +3039420416,3039428607,AR +3039428608,3039559679,CL +3039559680,3039821823,AR +3039821824,3040870399,CO +3040870400,3041132543,PE +3041132544,3041394687,CO +3041394688,3041656831,CL +3041656832,3041787903,BR +3041787904,3041796095,CO +3041796096,3044016127,AR +3044016128,3044147199,EC +3044147200,3044155391,GT +3044155392,3044161535,AR +3044161536,3044162559,HN +3044162560,3044163583,AR +3044163584,3044179967,BO +3044179968,3044188159,AR +3044188160,3044196351,BO +3044196352,3044206591,AR +3044206592,3044208639,CL +3044208640,3044212735,BZ +3044212736,3044245503,HN +3044245504,3044278271,BO +3044278272,3044417535,AR +3044417536,3044418047,CY +3044418048,3044421631,PA +3044421632,3044425727,CY +3044425728,3044446207,AR +3044446208,3044450303,CO +3044450304,3044454399,CL +3044454400,3044482559,AR +3044482560,3044482687,CO +3044482688,3044540415,AR +3044540416,3045064703,PY +3045064704,3047161855,CO +3047161856,3047423999,CL +3047424000,3047948287,AR +3047948288,3048079359,CL +3048079360,3048095743,CO +3048095744,3048112127,GT +3048112128,3048120319,AR +3048120320,3048121343,PY +3048121344,3048122367,PA +3048122368,3048123007,CR +3048123008,3048123071,PL +3048123072,3048123391,CR +3048123392,3048126463,AR +3048126464,3048128511,ES +3048128512,3048132607,AR +3048132608,3048144895,CR +3048144896,3048210431,EC +3048210432,3048275967,PE +3048275968,3048292351,AR +3048292352,3048292799,CA +3048292800,3048292807,ES +3048292808,3048293271,CA +3048293272,3048293279,ES +3048293280,3048293599,CA +3048293600,3048293615,ES +3048293616,3048294627,CA +3048294628,3048294631,BR +3048294632,3048294759,CA +3048294760,3048294767,BR +3048294768,3048296447,CA +3048296448,3048296751,US +3048296752,3048296759,CA +3048296760,3048297407,US +3048297408,3048297423,CA +3048297424,3048299487,US +3048299488,3048299503,BR +3048299504,3048299599,US +3048299600,3048299607,BR +3048299608,3048299655,US +3048299656,3048299663,BR +3048299664,3048300863,US +3048300864,3048300895,CA +3048300896,3048301311,US +3048301312,3048301343,CA +3048301344,3048301471,US +3048301472,3048301503,CA +3048301504,3048301935,US +3048301936,3048301951,CA +3048301952,3048302295,US +3048302296,3048302303,CA +3048302304,3048302815,US +3048302816,3048302823,NL +3048302824,3048303303,US +3048303304,3048303311,NL +3048303312,3048304031,US +3048304032,3048304047,NL +3048304048,3048304663,US +3048304664,3048304671,CR +3048304672,3048304919,US +3048304920,3048304927,CR +3048304928,3048304999,US +3048305000,3048305007,CR +3048305008,3048305063,US +3048305064,3048305071,CR +3048305072,3048307607,US +3048307608,3048307615,CA +3048307616,3048307743,US +3048307744,3048307751,CA +3048307752,3048307967,US +3048307968,3048307983,CA +3048307984,3048308103,US +3048308104,3048308111,CA +3048308112,3048308727,US +3048308728,3048308735,CR +3048308736,3048325119,BO +3048325120,3048331263,AR +3048331264,3048332287,GY +3048332288,3048333311,CL +3048333312,3048341503,PE +3048341504,3048472575,PA +3048472576,3048996863,VE +3048996864,3049029631,TT +3049029632,3049046015,BO +3049046016,3049062399,EC +3049062400,3049078271,CR +3049078272,3049078527,MX +3049078528,3049095167,CR +3049095168,3049103359,GT +3049103360,3049107455,AR +3049107456,3049111551,SV +3049111552,3049119743,AR +3049119744,3049127935,HN +3049127936,3049193471,CL +3049193472,3049199615,BR +3049199616,3049201663,AR +3049201664,3049202687,BR +3049202688,3049203711,AR +3049203712,3049209855,BR +3049209856,3049210879,AR +3049210880,3049211903,BO +3049211904,3049213951,BR +3049213952,3049214975,AR +3049214976,3049225215,BR +3049225216,3049226239,AR +3049226240,3049229311,BR +3049229312,3049230335,AR +3049230336,3049233407,BR +3049233408,3049234431,AR +3049234432,3049238527,BR +3049238528,3049239551,CL +3049239552,3049241087,BR +3049241088,3049241599,AR +3049241600,3049242623,MX +3049242624,3049249791,BR +3049249792,3049250815,AR +3049250816,3049251839,CL +3049251840,3049252863,BR +3049252864,3049253887,EC +3049253888,3049255935,BR +3049255936,3049259007,MX +3049259008,3049291775,AR +3049291776,3049324543,CO +3049324544,3049362175,CR +3049362176,3049362431,NI +3049362432,3049521151,CR +3049521152,3049586687,EC +3049586688,3049635839,PA +3049635840,3049652223,AR +3049652224,3049750527,EC +3049750528,3049754623,PE +3049754624,3049762815,AR +3049762816,3049766911,HN +3049766912,3049775103,ES +3049775104,3049783295,PA +3049783296,3050045439,CL +3050045440,3050307583,CO +3050307584,3050373119,VE +3050373120,3050405887,AR +3050405888,3050438655,GT +3050438656,3050504191,HN +3050504192,3050569727,EC +3050569728,3050635263,CL +3050635264,3050700799,BR +3050700800,3050700815,JP +3050700816,3050701055,BR +3050701056,3050701311,DE +3050701312,3050701327,IE +3050701328,3050701439,BR +3050701440,3050701503,US +3050701504,3050701567,BR +3050701568,3050701823,DE +3050701824,3050701839,SG +3050701840,3050702079,BR +3050702080,3050702335,US +3050702336,3050702351,DK +3050702352,3050702591,BR +3050702592,3050702847,US +3050702848,3050702863,FR +3050702864,3050703103,BR +3050703104,3050703359,US +3050703360,3050703375,AT +3050703376,3050703615,BR +3050703616,3050703871,US +3050703872,3050703887,PE +3050703888,3050704127,BR +3050704128,3050704383,US +3050704384,3050704399,KR +3050704400,3050704639,BR +3050704640,3050704895,US +3050704896,3050704911,IT +3050704912,3050705151,BR +3050705152,3050705407,US +3050705408,3050705423,JP +3050705424,3050705663,BR +3050705664,3050705919,SG +3050705920,3050705935,AU +3050705936,3050705983,BR +3050705984,3050706047,US +3050706048,3050706175,BR +3050706176,3050706431,US +3050706432,3050706447,NL +3050706448,3050706687,BR +3050706688,3050706943,US +3050706944,3050706959,HK +3050706960,3050707199,BR +3050707200,3050707455,US +3050707456,3050707471,IT +3050707472,3050707711,BR +3050707712,3050707967,US +3050707968,3050707983,CH +3050707984,3050708223,BR +3050708224,3050708479,US +3050708480,3050708495,FR +3050708496,3050708735,BR +3050708736,3050708991,US +3050708992,3050709007,AT +3050709008,3050709247,BR +3050709248,3050709503,DE +3050709504,3050709519,TH +3050709520,3050709759,BR +3050709760,3050710015,NL +3050710016,3050710031,ES +3050710032,3050710079,BR +3050710080,3050710143,US +3050710144,3050710271,BR +3050710272,3050710527,US +3050710528,3050710543,FR +3050710544,3050710783,BR +3050710784,3050711039,US +3050711040,3050711055,AU +3050711056,3050711295,BR +3050711296,3050711551,US +3050711552,3050711567,EE +3050711568,3050711615,BR +3050711616,3050711679,US +3050711680,3050711807,BR +3050711808,3050712063,US +3050712064,3050712079,FR +3050712080,3050712127,BR +3050712128,3050712191,US +3050712192,3050712319,BR +3050712320,3050712575,US +3050712576,3050712591,PL +3050712592,3050712831,BR +3050712832,3050713087,US +3050713088,3050713103,LV +3050713104,3050713215,BR +3050713216,3050713599,US +3050713600,3050713855,NL +3050713856,3050714367,US +3050714368,3050714623,GB +3050714624,3050714879,BR +3050714880,3050715135,ES +3050715136,3050724351,US +3050724352,3050724607,BG +3050724608,3050748159,US +3050748160,3050748415,GB +3050748416,3050753023,US +3050753024,3050753279,DE +3050753280,3050753385,PE +3050753386,3050753386,DE +3050753387,3050753535,PE +3050753536,3050754047,US +3050754048,3050755071,DE +3050755072,3050755327,CO +3050755328,3050755583,CL +3050755584,3050759935,US +3050759936,3050760191,GB +3050760192,3050766335,US +3050766336,3050766351,NO +3050766352,3050766591,BR +3050766592,3050766847,US +3050766848,3050766863,KR +3050766864,3050767103,BR +3050767104,3050767359,NL +3050767360,3050767375,AT +3050767376,3050767615,BR +3050767616,3050767871,US +3050767872,3050767887,MY +3050767888,3050768127,BR +3050768128,3050768383,US +3050768384,3050768399,AT +3050768400,3050768511,BR +3050768512,3050768575,US +3050768576,3050768639,BR +3050768640,3050768895,US +3050768896,3050768911,CZ +3050768912,3050769151,BR +3050769152,3050769407,US +3050769408,3050769423,AU +3050769424,3050769663,BR +3050769664,3050769919,US +3050769920,3050769935,MY +3050769936,3050770175,BR +3050770176,3050770431,US +3050770432,3050770447,LV +3050770448,3050770687,BR +3050770688,3050770943,US +3050770944,3050770959,HK +3050770960,3050771199,BR +3050771200,3050771455,US +3050771456,3050771471,SG +3050771472,3050771583,BR +3050771584,3050771967,US +3050771968,3050771983,EE +3050771984,3050772223,BR +3050772224,3050772479,US +3050772480,3050772495,MY +3050772496,3050772735,BR +3050772736,3050772991,US +3050772992,3050773007,HK +3050773008,3050773247,BR +3050773248,3050773503,US +3050773504,3050773519,NL +3050773520,3050773759,BR +3050773760,3050774015,US +3050774016,3050774031,TR +3050774032,3050774271,BR +3050774272,3050774527,US +3050774528,3050774543,ES +3050774544,3050774783,BR +3050774784,3050775039,US +3050775040,3050775055,KR +3050775056,3050775295,BR +3050775296,3050775551,US +3050775552,3050775567,FR +3050775568,3050775807,BR +3050775808,3050776063,US +3050776064,3050776079,MY +3050776080,3050776319,BR +3050776320,3050776575,US +3050776576,3050776591,TH +3050776592,3050776831,BR +3050776832,3050777087,US +3050777088,3050777103,AU +3050777104,3050777343,BR +3050777344,3050777599,RO +3050777600,3050777615,HK +3050777616,3050777855,BR +3050777856,3050778111,US +3050778112,3050778127,KR +3050778128,3050778367,BR +3050778368,3050778623,US +3050778624,3050778639,TR +3050778640,3050778879,BR +3050778880,3050800383,US +3050800384,3050800399,AL +3050800400,3050800415,AD +3050800416,3050800431,AI +3050800432,3050800447,AG +3050800448,3050800463,AR +3050800464,3050800479,AM +3050800480,3050800495,AZ +3050800496,3050800511,BS +3050800512,3050800639,US +3050800640,3050800655,BB +3050800656,3050800671,BY +3050800672,3050800687,BZ +3050800688,3050800703,BM +3050800704,3050800719,BO +3050800720,3050800735,BA +3050800736,3050800751,VG +3050800752,3050800767,KY +3050800768,3050800895,US +3050800896,3050800911,CN +3050800912,3050800927,CO +3050800928,3050800943,GG +3050800944,3050800959,CU +3050800960,3050800975,CY +3050800976,3050800991,DK +3050800992,3050801007,DO +3050801008,3050801023,EC +3050801024,3050801151,US +3050801152,3050801167,EG +3050801168,3050801175,GQ +3050801176,3050801183,NZ +3050801184,3050801199,GF +3050801200,3050801215,PF +3050801216,3050801231,GE +3050801232,3050801247,SV +3050801248,3050801263,GD +3050801264,3050801279,GT +3050801280,3050801407,US +3050801408,3050801423,HN +3050801424,3050801439,IR +3050801440,3050801455,JM +3050801456,3050801471,JO +3050801472,3050801487,KG +3050801488,3050801503,LB +3050801504,3050801519,LI +3050801520,3050801535,MG +3050801536,3050801663,US +3050801664,3050801679,MT +3050801680,3050801695,MQ +3050801696,3050801703,MU +3050801704,3050801711,CL +3050801712,3050801727,MX +3050801728,3050801743,MC +3050801744,3050801759,ME +3050801760,3050801775,NC +3050801776,3050801791,NI +3050801792,3050802175,US +3050802176,3050802191,OM +3050802192,3050802207,PK +3050802208,3050802223,PE +3050802224,3050802239,PH +3050802240,3050802255,PR +3050802256,3050802271,QA +3050802272,3050802279,LC +3050802280,3050802287,IN +3050802288,3050802303,RS +3050802304,3050802431,US +3050802432,3050802447,SC +3050802448,3050802463,SI +3050802464,3050802479,KR +3050802480,3050802495,LK +3050802496,3050802511,TW +3050802512,3050802519,TT +3050802520,3050802527,CR +3050802528,3050802543,UY +3050802544,3050802559,VE +3050802560,3050802687,US +3050802688,3050802751,NZ +3050802752,3050802815,NO +3050802816,3050803199,US +3050803200,3050803263,NL +3050803264,3050803327,SE +3050803328,3050803775,US +3050803776,3050803839,FR +3050803840,3050804223,US +3050804224,3050804287,BE +3050804288,3050804351,NZ +3050804352,3050805247,US +3050805248,3050805311,NL +3050805312,3050805375,FI +3050805376,3050805759,US +3050805760,3050805791,DK +3050805792,3050811391,US +3050811392,3050811647,HK +3050811648,3050812415,US +3050812416,3050813439,BR +3050813440,3050815487,DE +3050815488,3050816255,US +3050816256,3050816511,NL +3050816512,3050827263,US +3050827264,3050827519,BR +3050827520,3050829567,US +3050829568,3050829823,UA +3050829824,3050831871,US +3050831872,3051356159,BR +3051356160,3051372799,CR +3051372800,3051374591,PA +3051374592,3051374847,CR +3051374848,3051375103,PA +3051375104,3051375359,CR +3051375360,3051375871,PA +3051375872,3051380735,CR +3051380736,3051388927,AR +3051388928,3051389183,US +3051389184,3051390207,NL +3051390208,3051390719,US +3051390720,3051390975,NL +3051390976,3051394047,US +3051394048,3051394303,NL +3051394304,3051395071,US +3051395072,3051395327,NL +3051395328,3051395839,PA +3051395840,3051396351,US +3051396352,3051396607,PA +3051396608,3051396863,US +3051396864,3051397119,PA +3051397120,3051398143,CO +3051398144,3051399167,AR +3051399168,3051400191,DO +3051400192,3051401215,EC +3051401216,3051405311,AR +3051405312,3051407359,CR +3051407360,3051408383,PE +3051408384,3051409407,DO +3051409408,3051411455,AR +3051411456,3051413503,CR +3051413504,3051421695,PE +3051421696,3051429887,AR +3051429888,3051438079,VE +3051438080,3051450367,CO +3051450368,3051454463,CL +3051454464,3051456511,SV +3051456512,3051457535,AR +3051457536,3051460607,CL +3051462656,3051470847,PE +3051470848,3051479039,AR +3051479040,3051487231,CU +3051487232,3051552767,CL +3051552768,3051618303,BO +3051618304,3051880447,AR +3051880448,3051913215,CO +3051913216,3051983871,CR +3051983872,3051984895,BR +3051984896,3051995135,CR +3051995136,3052011519,PE +3052011520,3052273663,CO +3052273664,3052404735,AR +3052404736,3053453311,CO +3053453312,3054501887,ID +3054501888,3054534655,HK +3054534656,3054537727,PH +3054537728,3054538751,SG +3054538752,3054540799,CN +3054540800,3054541823,NZ +3054541824,3054542847,BD +3054542848,3054551039,ID +3054551040,3054559231,CN +3054559232,3054561279,JP +3054561280,3054562303,SG +3054562304,3054563327,JP +3054563328,3054567423,ID +3054567424,3054632959,TH +3054632960,3054665727,CN +3054665728,3054682111,IN +3054682112,3054698495,PH +3054698496,3054731263,IN +3054731264,3054764031,SG +3054764032,3054960639,JP +3054960640,3054993407,ID +3054993408,3054997503,IN +3054997504,3055001599,SG +3055001600,3055005695,ID +3055005696,3055007743,NZ +3055007744,3055009791,CN +3055009792,3055011839,AU +3055011840,3055013887,CN +3055013888,3055014911,JP +3055014912,3055015935,AU +3055015936,3055026175,JP +3055026176,3055484927,ID +3055484928,3055550463,KR +3055550464,3056599039,CN +3056599040,3056615423,JP +3056615424,3056623615,BD +3056623616,3056631807,CN +3056631808,3056639999,NZ +3056640000,3056648191,ID +3056648192,3056664575,IN +3056664576,3056734207,CN +3056734208,3056746495,KR +3056746496,3056747519,NP +3056747520,3056748543,IN +3056748544,3056749567,WS +3056749568,3056749595,SG +3056749596,3056749596,US +3056749597,3056750591,SG +3056750592,3056754687,TH +3056754688,3056758783,JP +3056758784,3056762879,CN +3056762880,3056771071,SG +3056771072,3056772095,NZ +3056772096,3056773119,JP +3056773120,3056774143,WS +3056774144,3056775167,JP +3056775168,3056779263,NO +3056779264,3056791551,JP +3056791552,3056795647,ID +3056795648,3056861183,CN +3056861184,3056992255,TH +3056992256,3057025023,CN +3057025024,3057026047,SG +3057026048,3057027071,US +3057027072,3057028095,TW +3057028096,3057029119,ID +3057029120,3057030143,SG +3057030144,3057031167,IN +3057031168,3057032191,BD +3057032192,3057033215,NP +3057033216,3057037311,NZ +3057037312,3057041407,JP +3057041408,3057049599,MY +3057049600,3057050623,AU +3057050624,3057051647,SG +3057051648,3057052415,AU +3057052416,3057052671,ES +3057052672,3057052927,IL +3057052928,3057053183,GB +3057053184,3057053439,US +3057053440,3057053695,SG +3057053696,3057054719,JP +3057054720,3057055743,CN +3057055744,3057057791,JP +3057057792,3057123327,SG +3057123328,3057451007,IN +3057451008,3057516543,CN +3057516544,3057647615,MY +3057647616,3058696191,IN +3058696192,3059548159,CN +3059548160,3059564543,MO +3059564544,3059572735,NP +3059572736,3059580927,JP +3059580928,3059613695,TH +3059613696,3059744767,IN +3059744768,3063414783,CN +3063414784,3063545855,HK +3063545856,3063611391,NZ +3063611392,3063676927,TW +3063676928,3063742463,IN +3063742464,3063807999,CN +3063808000,3063939071,JP +3063939072,3063955455,MN +3063955456,3063963647,CN +3063963648,3063971839,BD +3063971840,3063988223,AU +3063988224,3064004607,JP +3064004608,3064012799,LK +3064012800,3064013823,CA +3064013824,3064015871,HK +3064015872,3064016895,AU +3064016896,3064017919,SG +3064017920,3064018943,IN +3064018944,3064019967,NZ +3064019968,3064020991,HK +3064020992,3064021503,AU +3064021504,3064021759,HK +3064022016,3064023039,HK +3064023040,3064024063,SG +3064024064,3064025087,JP +3064025088,3064029183,VN +3064029184,3064135679,KR +3064135680,3064160255,JP +3064160256,3064168447,BD +3064168448,3064201215,KR +3064201216,3064725503,JP +3064725504,3064791039,KR +3064791040,3064807423,TW +3064807424,3064808447,IN +3064808448,3064808703,VG +3064808704,3064808959,JP +3064808960,3064809215,VN +3064809216,3064809471,VG +3064809472,3064810495,MY +3064810496,3064811519,HK +3064811520,3064823807,KR +3064823808,3064831999,JP +3064832000,3064840191,KR +3064840192,3064856575,GU +3064856576,3064987647,CN +3064987648,3066036223,PK +3066036224,3066560511,KR +3066560512,3067084799,CN +3067084800,3068657663,KR +3068657664,3068723199,TH +3068723200,3068919807,TW +3068919808,3068948479,JP +3068948480,3068949503,VN +3068949504,3068949759,AU +3068949760,3068949763,PG +3068949764,3068949937,AU +3068949938,3068949938,PG +3068949939,3068950527,AU +3068950528,3068952575,NZ +3068952576,3068985343,CN +3068985344,3068986367,HK +3068986368,3068987391,AU +3068987392,3068990463,IN +3068990464,3068991487,VN +3068991488,3068993535,CN +3068993536,3069018111,KR +3069018112,3069034495,IN +3069034496,3069050879,KR +3069050880,3069124607,CN +3069124608,3069126655,PH +3069126656,3069127679,MY +3069127680,3069128703,TW +3069128704,3069149183,HK +3069149184,3069181951,AU +3069181952,3069706239,CN +3069706240,3069968383,JP +3069968384,3069984767,KR +3069984768,3070001151,BD +3070001152,3070033919,KR +3070033920,3070099455,ID +3070099456,3070164991,CN +3070164992,3070167039,ID +3070167040,3070169087,TH +3070169088,3070170111,ID +3070170112,3070171135,MY +3070171136,3070172159,HK +3070172160,3070174207,AU +3070174208,3070175231,CN +3070175232,3070176255,PH +3070176256,3070177279,HK +3070177280,3070178303,PK +3070178304,3070179327,MM +3070179328,3070180351,IN +3070180352,3070181375,CN +3070181376,3070185471,JP +3070185472,3070197759,AU +3070197760,3070230527,KR +3070230528,3074949119,CN +3074949120,3075342335,JP +3075342336,3075375103,MY +3075375104,3075383295,KR +3075383296,3075385343,CN +3075385344,3075386367,MY +3075386368,3075387391,AU +3075387392,3075388415,HK +3075388416,3075389439,CN +3075389440,3075390463,IN +3075390464,3075391487,JP +3075391488,3075407871,KR +3075407872,3075473407,JP +3075473408,3075571711,VN +3075571712,3075575807,FJ +3075575808,3075577855,AU +3075577856,3075579903,ID +3075579904,3075581951,MY +3075581952,3075582975,MN +3075582976,3075583999,CN +3075584000,3075585023,JP +3075585024,3075586047,CN +3075586048,3075588095,KH +3075588096,3075604479,SG +3075604480,3075735551,IN +3075735552,3075866623,CN +3075866624,3075915775,JP +3075915776,3075932159,KR +3075932160,3075997695,IN +3075997696,3076128767,TH +3076128768,3076161535,SG +3076161536,3076169727,KR +3076169728,3076171775,VN +3076171776,3076173823,TH +3076173824,3076175871,JP +3076175872,3076177919,HK +3076177920,3076194303,JP +3076194304,3076202495,VN +3076202496,3076210687,HK +3076210688,3076218879,ID +3076218880,3076227071,JP +3076227072,3076228095,CN +3076228096,3076229119,NP +3076229120,3076235263,CN +3076235264,3076243455,VN +3076243456,3076259839,KR +3076259840,3076521983,CN +3076521984,3078619135,KR +3078619136,3081437183,CN +3081437184,3081502719,MY +3081502720,3081764863,CN +3081764864,3081842687,JP +3081842688,3081846783,AU +3081846784,3081847807,TW +3081847808,3081848831,KR +3081848832,3081850879,SG +3081850880,3081851903,HK +3081851904,3081852927,JP +3081852928,3081854975,HK +3081854976,3081859071,MN +3081859072,3081861119,PH +3081861120,3081862143,AU +3081862144,3081863167,IN +3081863168,3081895935,JP +3081895936,3082027007,HK +3082027008,3082158079,JP +3082158080,3082166271,CN +3082166272,3082174463,JP +3082174464,3082178559,BZ +3082178560,3082178823,HK +3082178824,3082178824,SG +3082178825,3082179047,HK +3082179048,3082179055,SG +3082179056,3082179079,HK +3082179080,3082179083,JP +3082179084,3082179583,HK +3082179584,3082181631,IN +3082181632,3082182655,ID +3082182656,3082190847,LA +3082190848,3082289151,JP +3082289152,3087007743,CN +3087007744,3088449535,US +3088449536,3088515071,TH +3088515072,3088629759,US +3088629760,3088633855,NL +3088633856,3088686591,US +3088686592,3088687103,NL +3088687104,3088708607,US +3088708608,3088709631,NL +3088709632,3088710655,US +3088710656,3088711167,NL +3088711168,3088785407,US +3088785408,3088786431,NL +3088786432,3088812031,US +3088812032,3088813055,NL +3088813056,3088827135,US +3088827136,3088827391,NL +3088827392,3088829951,US +3088829952,3088830463,NL +3088830464,3088830975,US +3088830976,3088831487,NL +3088831488,3088856063,US +3088856064,3088856575,NL +3088856576,3088857087,US +3088857088,3088857599,NL +3088857600,3088858111,US +3088858112,3088858623,NL +3088858624,3088863231,US +3088863232,3088863743,NL +3088863744,3088863999,US +3088864000,3088864255,NL +3088864256,3088867839,US +3088867840,3088868351,NL +3088868352,3088868607,US +3088868608,3088868863,NL +3088868864,3088869375,US +3088869376,3088870143,NL +3088870144,3088871423,US +3088871424,3088871935,NL +3088871936,3088880639,US +3088880640,3088881663,NL +3088881664,3088882687,US +3088882688,3088883199,NL +3088883200,3088902143,US +3088902144,3088902655,NL +3088902656,3088913663,US +3088913664,3088913919,NL +3088913920,3089027071,US +3089027072,3089031167,NL +3089031168,3089059839,US +3089059840,3089063935,NL +3089063936,3090292223,US +3090292224,3090292735,NL +3090292736,3090308863,US +3090308864,3090309119,NL +3090309120,3090325503,US +3090325504,3090329599,NL +3090329600,3090388223,US +3090388224,3090388479,NL +3090388480,3090389503,US +3090389504,3090389631,CA +3090389632,3090401791,US +3090401792,3090402047,IN +3090402048,3090415103,US +3090415104,3090415615,NL +3090415616,3091202047,US +3091202048,3091726335,CA +3091726336,3091955711,US +3091955712,3091959807,CA +3091959808,3091976191,US +3091976192,3091980287,CA +3091980288,3092381695,US +3092381696,3092447231,TH +3092447232,3092623359,US +3092623360,3092627455,NL +3092627456,3092634367,US +3092634368,3092634623,NL +3092634624,3092635391,US +3092635392,3092635647,NL +3092635648,3092643839,US +3092643840,3092647935,NL +3092647936,3092656127,US +3092656128,3092660223,NL +3092660224,3092664319,US +3092664320,3092665343,NL +3092665344,3092666367,US +3092666368,3092667391,NL +3092667392,3092669439,US +3092669440,3092669951,NL +3092669952,3092671487,US +3092671488,3092672511,NL +3092672512,3092673023,US +3092673024,3092673535,NL +3092673536,3092697087,US +3092697088,3092697599,NL +3092697600,3092701183,US +3092701184,3092702207,NL +3092702208,3092704255,US +3092704256,3092705279,NL +3092705280,3092754431,US +3092754432,3092758527,NL +3092758528,3093168127,US +3093168128,3093200895,CA +3093200896,3093213183,US +3093213184,3093217279,CA +3093217280,3093233663,US +3093233664,3093237759,PR +3093237760,3093282815,US +3093282816,3093299199,CA +3093299200,3093907199,US +3093907200,3093907455,CA +3093907456,3093909528,US +3093909529,3093909529,AT +3093909530,3093909597,US +3093909598,3093909598,DE +3093909599,3093909656,US +3093909657,3093909657,FR +3093909658,3093909812,US +3093909813,3093909813,AT +3093909814,3093935103,US +3093935104,3093935359,CA +3093935360,3093943785,US +3093943786,3093943786,CZ +3093943787,3093945989,US +3093945990,3093945990,AT +3093945991,3094020095,US +3094020096,3094023303,CA +3094023304,3094023311,BD +3094023312,3094032759,CA +3094032760,3094032767,GI +3094032768,3094041359,CA +3094041360,3094041367,DZ +3094041368,3094045663,CA +3094045664,3094045671,CO +3094045672,3094077751,CA +3094077752,3094077759,US +3094077760,3094085631,CA +3094085632,3096444927,US +3096444928,3096898618,CA +3096898619,3096898619,US +3096898620,3096969215,CA +3096969216,3097143823,US +3097143824,3097143831,BD +3097143832,3097493503,US +3097493504,3097772031,CA +3097772032,3098095615,US +3098095616,3098099711,CA +3098099712,3098099967,US +3098099968,3098100735,SE +3098100736,3098101247,SG +3098101248,3098103295,US +3098103296,3098103551,NL +3098103552,3098103807,DE +3098103808,3098104063,FR +3098104064,3098104319,GB +3098104320,3098104575,IL +3098104576,3098104831,AU +3098104832,3098105087,JP +3098105088,3098105855,ES +3098105856,3098106111,HK +3098106112,3098106623,IN +3098106624,3098106879,NL +3098106880,3098107135,DE +3098107136,3098107391,FR +3098107392,3098107647,US +3098107648,3098107903,SE +3098107904,3098148863,US +3098148864,3098165247,JM +3098165248,3098181631,US +3098181632,3098185727,CA +3098185728,3098263551,US +3098263552,3098271743,CA +3098271744,3098412031,US +3098412032,3098413055,CN +3098413056,3098415104,US +3098415105,3098421247,CN +3098421248,3098422271,US +3098422272,3098422527,FR +3098422528,3098422783,US +3098422784,3098423039,IT +3098423040,3098423295,GB +3098423296,3098424319,FR +3098424320,3098425343,CN +3098425344,3098426367,RU +3098426368,3098427391,FR +3098427392,3098428415,US +3098428416,3098428671,NL +3098428672,3098428927,CA +3098428928,3098429439,SE +3098429440,3098431487,GB +3098431488,3098435071,US +3098435072,3098435327,NL +3098435328,3098435583,CA +3098435584,3098441215,US +3098441216,3098441727,FR +3098441728,3098476543,US +3098476544,3098492927,CA +3098492928,3098494719,US +3098494720,3098495743,CA +3098495744,3098495999,US +3098496000,3098496255,CA +3098496256,3098503423,US +3098503424,3098503679,CA +3098503680,3098507263,US +3098507264,3098507519,CA +3098507520,3103784959,US +3103850496,3103850751,RU +3103850752,3103851007,PS +3103851008,3103851519,FR +3103851520,3103852543,PL +3103852544,3103852799,AE +3103852800,3103853567,PL +3103853568,3103853823,NO +3103853824,3103854079,RU +3103854080,3103854335,FR +3103854336,3103854591,AE +3103854592,3103854847,UA +3103854848,3103855103,PL +3103855104,3103855359,DE +3103855360,3103855615,RU +3103855616,3103855871,ES +3103855872,3103856127,AT +3103856128,3103856383,PL +3103856384,3103856639,RU +3103856640,3103856895,HU +3103856896,3103857151,CZ +3103857152,3103857407,FR +3103857408,3103857663,RS +3103857664,3103857919,FR +3103857920,3103858175,PL +3103858176,3103858431,BG +3103858432,3103858687,AT +3103858688,3103858943,NL +3103858944,3103859199,GB +3103859200,3103859455,SK +3103859456,3103859711,DE +3103859712,3103859967,RO +3103859968,3103860223,PL +3103860224,3103860479,FR +3103860480,3103860735,UA +3103860736,3103860991,BG +3103860992,3103861247,RU +3103861248,3103861503,PL +3103861504,3103861759,AT +3103861760,3103862015,ME +3103862016,3103862271,MD +3103862272,3103862527,IT +3103862528,3103862783,FR +3103862784,3103863039,TR +3103863040,3103863295,RU +3103863296,3103863807,UA +3103863808,3103864063,NL +3103864064,3103864319,GB +3103864320,3103864575,DE +3103864576,3103864831,NO +3103864832,3103865087,BG +3103865088,3103865343,DK +3103865344,3103865599,DE +3103865600,3103865855,BG +3103865856,3103866367,DE +3103866368,3103866879,UA +3103866880,3103867135,RU +3103867136,3103867391,NO +3103867392,3103867647,FR +3103867648,3103867903,RU +3103867904,3103868159,ES +3103868160,3103868415,IE +3103868416,3103868671,RS +3103868672,3103868927,GB +3103868928,3103869183,LB +3103869184,3103869439,AL +3103869440,3103869695,DE +3103869696,3103869951,PL +3103869952,3103870207,RU +3103870208,3103870463,IR +3103870464,3103870719,MD +3103870720,3103870975,SE +3103870976,3103871231,IT +3103871232,3103871487,RU +3103871488,3103871743,SE +3103871744,3103871999,CZ +3103872000,3103872511,UA +3103872512,3103872767,FI +3103872768,3103873023,HR +3103873024,3103873279,SE +3103873280,3103873535,FR +3103873536,3103873791,CZ +3103873792,3103874047,PL +3103874048,3103874303,LT +3103874304,3103874559,CH +3103874560,3103875071,NL +3103875072,3103875327,UA +3103875328,3103875583,IT +3103875584,3103875839,IQ +3103875840,3103876095,UA +3103876096,3103876351,AL +3103876352,3103876607,GB +3103876608,3103876863,DE +3103876864,3103877119,RO +3103877120,3103877375,GB +3103877376,3103877631,CH +3103877632,3103877887,IT +3103916032,3103917055,CH +3103917056,3103918079,IT +3103918080,3103919103,DE +3103919104,3103920127,IR +3103920128,3103921151,DE +3103921152,3103922175,CH +3103922176,3103923199,NL +3103923200,3103923455,SE +3103923456,3103924223,NL +3103924224,3103924479,DE +3103924480,3103925247,RU +3103925248,3103926271,PL +3103926272,3103926783,CZ +3103926784,3103927039,SK +3103927040,3103927119,CZ +3103927120,3103927135,GB +3103927136,3103927167,CZ +3103927168,3103927295,SK +3103927296,3103929343,NL +3103929344,3103930367,BE +3103930368,3103931391,DE +3103931392,3103932415,PL +3103932416,3103933439,IE +3103933440,3103934463,ES +3103934464,3103935487,RU +3103935488,3103936511,PL +3103936512,3103937535,NL +3103937536,3103938559,PT +3103938560,3103939583,RU +3103939584,3103940607,BE +3103940608,3103941631,CY +3103941632,3103942655,DE +3103942656,3103943679,RU +3103943680,3103944703,UA +3103944704,3103945727,PL +3103945728,3103947775,DE +3103947776,3103948799,RU +3103948800,3103949823,GB +3103949824,3103950847,DE +3103950848,3103951871,GB +3103951872,3103952895,DE +3103952896,3103953919,IT +3103953920,3103954431,NL +3103954432,3103954943,ES +3103954944,3103955967,SE +3103955968,3103956991,AT +3103956992,3103958015,DE +3103958016,3103960063,GB +3103960064,3103961087,NL +3103961088,3103961343,TR +3103961344,3103961599,AE +3103961600,3103961855,AR +3103961856,3103962111,AT +3103962112,3103963135,DE +3103963136,3103964159,RU +3103964160,3103965183,MK +3103965184,3103967231,GB +3103967232,3103968255,CH +3103968256,3103969279,GB +3103969280,3103970303,BG +3103970304,3103971327,UA +3103971328,3103972351,GB +3103972352,3103972863,IE +3103972864,3103973375,GB +3103973376,3103974399,KZ +3103974400,3103974919,LT +3103974920,3103974943,SE +3103974944,3103975167,LT +3103975168,3103975423,SE +3103975424,3103976447,SA +3103976448,3103977471,GB +3103977472,3103978495,NL +3103978496,3103979519,QA +3103979520,3103980543,DE +3103980544,3103981567,FR +3103981568,3103983615,NO +3103983616,3103984639,CZ +3103984640,3103985663,DK +3103985664,3103986687,RU +3103986688,3103987711,LB +3103987712,3103988735,FR +3103989760,3103990783,RU +3103990784,3103991807,IT +3103991808,3103992831,DE +3103992832,3103993855,LU +3103993856,3103994879,SE +3103994880,3103995903,JE +3103995904,3103996927,TR +3103996928,3103997951,PL +3103997952,3103998975,FR +3103998976,3103999999,RU +3104000000,3104002047,GB +3104002048,3104003071,DE +3104003072,3104004863,GB +3104005120,3104006143,GB +3104006144,3104007167,DE +3104007168,3104008191,GG +3104008192,3104009215,NL +3104009216,3104010239,IT +3104010240,3104011263,PL +3104011264,3104012287,ES +3104012288,3104012799,BH +3104012800,3104013311,SA +3104013312,3104014335,IR +3104014336,3104015359,FR +3104015360,3104016383,SE +3104016384,3104017407,HU +3104017408,3104018431,RU +3104018432,3104019455,IL +3104019456,3104020479,UA +3104020480,3104021503,AE +3104021504,3104022527,CZ +3104022528,3104023551,BE +3104023552,3104024575,GB +3104024576,3104025599,FR +3104025600,3104026623,RU +3104026624,3104027647,NL +3104027648,3104028671,RU +3104028672,3104029695,DE +3104029696,3104029951,AM +3104029952,3104030719,IT +3104030720,3104031743,HR +3104031744,3104032767,FR +3104032768,3104033791,IR +3104033792,3104035839,NL +3104035840,3104036863,IR +3104036864,3104037887,BE +3104037888,3104038911,GR +3104038912,3104039935,PL +3104039936,3104040959,LT +3104040960,3104041983,DE +3104041984,3104043007,ES +3104043008,3104044031,RU +3104044032,3104045055,HU +3104045056,3104046079,GB +3104046080,3104047103,IT +3104047104,3104048127,IR +3104048128,3104049151,GB +3104049152,3104050175,SE +3104050176,3104051199,GB +3104051200,3104052223,IR +3104052224,3104053247,FR +3104053248,3104054271,GB +3104054272,3104055295,IR +3104055296,3104056319,ES +3104056320,3104057343,NO +3104057344,3104058367,UA +3104058368,3104059391,FR +3104059392,3104060415,GB +3104060416,3104061439,AD +3104061440,3104062463,RU +3104062464,3104063487,FR +3104063488,3104064511,RU +3104064512,3104065535,TR +3104065536,3104066559,EE +3104066560,3104067583,FR +3104067584,3104068607,BG +3104068608,3104069631,SY +3104069632,3104070655,GR +3104070656,3104071679,ES +3104071680,3104073727,GB +3104073728,3104074751,IR +3104074752,3104075775,RU +3104075776,3104076799,NL +3104076800,3104077823,GB +3104077824,3104078847,AT +3104078848,3104079871,FR +3104079872,3104080895,GB +3104080896,3104081919,GR +3104081920,3104082943,DK +3104082944,3104083967,IT +3104083968,3104084991,RU +3104084992,3104085247,NL +3104085248,3104085503,HR +3104085504,3104086015,NL +3104086016,3104087039,IT +3104087040,3104088063,GB +3104088064,3104089087,UZ +3104089088,3104090111,GB +3104090112,3104091135,CH +3104091136,3104092159,NO +3104093184,3104094207,RU +3104094208,3104096255,ES +3104096256,3104097279,IE +3104097280,3104098303,GB +3104098304,3104099327,CZ +3104099328,3104100351,RU +3104100352,3104101375,TR +3104101376,3104102399,PL +3104102400,3104103423,DK +3104103424,3104104447,IR +3104104448,3104105471,TR +3104105472,3104106495,FI +3104106496,3104107519,DE +3104107520,3104108543,UA +3104108544,3104109567,GB +3104109568,3104110591,ES +3104110592,3104111615,FR +3104111616,3104112639,LB +3104112640,3104113663,GB +3104113664,3104114687,MK +3104114688,3104116735,DE +3104116736,3104117759,RU +3104117760,3104118783,SE +3104118784,3104120831,DE +3104120832,3104121855,CH +3104121856,3104122879,GB +3104122880,3104123903,RU +3104123904,3104124159,SE +3104124160,3104124415,LU +3104124416,3104124671,RO +3104124672,3104124927,CZ +3104124928,3104125951,MT +3104125952,3104126975,LT +3104126976,3104127999,CH +3104128000,3104129023,IT +3104129024,3104130047,GB +3104130048,3104131071,CZ +3104131072,3104132095,CY +3104132096,3104133119,GR +3104133120,3104134143,DE +3104134144,3104135167,ES +3104135168,3104136191,GB +3104136192,3104137215,IT +3104137216,3104138239,PL +3104138240,3104139263,DE +3104139264,3104140287,UA +3104140288,3104141311,FR +3104141312,3104142335,IT +3104142336,3104143359,BG +3104143360,3104144383,NL +3104144384,3104145407,ES +3104145408,3104146431,RU +3104146432,3104147455,NL +3104147456,3104149503,RU +3104149504,3104150527,GB +3104150528,3104151551,RU +3104151552,3104152575,SA +3104152576,3104153599,IR +3104153600,3104154623,RU +3104154624,3104155647,DK +3104155648,3104156671,DE +3104156672,3104156927,GB +3104156928,3104156959,RO +3104156960,3104156991,US +3104156992,3104157695,RO +3104157696,3104158719,TR +3104158720,3104159743,IT +3104159744,3104160767,CH +3104160768,3104161791,GB +3104161792,3104162815,RU +3104162816,3104164863,IT +3104164864,3104165887,RU +3104165888,3104166911,IT +3104166912,3104167935,FR +3104167936,3104168959,PL +3104168960,3104169983,PS +3104169984,3104171007,CZ +3104171008,3104172031,HU +3104172032,3104172451,NO +3104172452,3104172452,US +3104172453,3104173055,NO +3104173056,3104174079,ES +3104174080,3104175103,IE +3104175104,3104176127,IT +3104176128,3104177151,RU +3104177152,3104178175,UA +3104178176,3104179199,PL +3104179200,3104180223,ES +3104180224,3104181247,SE +3104181248,3104182271,RU +3104182272,3104183295,PS +3104183296,3104184319,MK +3104184320,3104185343,BY +3104185344,3104186367,PL +3104186368,3104187391,ES +3104187392,3104188415,IE +3104188416,3104189439,UZ +3104189440,3104190463,RU +3104190464,3104191487,NL +3104191488,3104192511,PL +3104192512,3104193535,PS +3104193536,3104194559,FR +3104194560,3104195071,IL +3104195072,3104195327,US +3104195328,3104195583,IL +3104195584,3104196607,DE +3104196608,3104197631,IT +3104197632,3104198655,GR +3104198656,3104199679,RU +3104199680,3104200703,NL +3104200704,3104201727,IT +3104201728,3104202751,FR +3104202752,3104203775,DE +3104203776,3104204799,HU +3104204800,3104205823,BA +3104205824,3104206079,NL +3104206080,3104206335,GB +3104206336,3104206847,NL +3104206848,3104207871,PL +3104207872,3104208895,RU +3104208896,3104209919,DE +3104209920,3104210943,RU +3104211968,3104212991,GB +3104212992,3104214015,HU +3104214016,3104215039,FR +3104215040,3104216063,DE +3104216064,3104217087,LB +3104217088,3104218111,GB +3104218112,3104219135,HU +3104219136,3104220159,NL +3104220160,3104221183,RU +3104221184,3104222207,CH +3104222208,3104223231,RU +3104223232,3104224255,EE +3104224256,3104225279,FI +3104225280,3104226303,UA +3104226304,3104227327,RS +3104227328,3104228351,IT +3104228352,3104229375,GB +3104229376,3104230399,ES +3104230400,3104231423,NL +3104231424,3104233471,FR +3104233472,3104234495,RU +3104234496,3104235519,OM +3104235520,3104236543,GB +3104236544,3104237567,RU +3104237568,3104238591,LU +3104238592,3104239615,RU +3104239616,3104240639,IT +3104240640,3104242687,RU +3104242688,3104243711,DE +3104243712,3104244735,TR +3104244736,3104245759,FR +3104245760,3104246783,BH +3104246784,3104247807,FR +3104247808,3104248831,AT +3104248832,3104250879,CZ +3104250880,3104251903,RU +3104251904,3104252415,SE +3104252416,3104252671,NL +3104252672,3104252927,LU +3104252928,3104253951,FR +3104253952,3104254975,RU +3104254976,3104255999,CZ +3104256000,3104257023,RU +3104257024,3104258047,HR +3104258048,3104259071,DE +3104259072,3104260095,NO +3104260096,3104261119,FR +3104261120,3104262143,DE +3104262144,3104263167,FR +3104263168,3104264191,NL +3104264192,3104265215,GB +3104265216,3104266239,RU +3104266240,3104267263,GB +3104267264,3104268287,RU +3104268288,3104269311,NL +3104269312,3104270335,FR +3104270336,3104271359,PL +3104271360,3104272383,FR +3104272384,3104273407,IT +3104273408,3104274431,RU +3104274432,3104275455,PS +3104275456,3104276479,AT +3104276480,3104277503,LB +3104277504,3104280575,NO +3104280576,3104281599,RU +3104281600,3104282623,GB +3104282624,3104283647,RU +3104283648,3104284671,CY +3104284672,3104285695,FR +3104285696,3104286719,GB +3104286720,3104287743,PL +3104287744,3104288767,RU +3104288768,3104289791,TR +3104289792,3104290815,RU +3104290816,3104291839,IE +3104291840,3104292863,GB +3104292864,3104293887,NO +3104293888,3104294911,DE +3104294912,3104295935,RU +3104295936,3104296959,BG +3104296960,3104297983,DE +3104297984,3104299007,FR +3104299008,3104300031,BG +3104300032,3104301055,NO +3104301056,3104301823,US +3104301824,3104302079,NL +3104302080,3104303103,GB +3104303104,3104304127,RU +3104304128,3104305151,LV +3104305152,3104306175,FR +3104306176,3104307199,GB +3104307200,3104308223,NL +3104308224,3104309247,EE +3104309248,3104310271,AM +3104310272,3104311295,RU +3104311296,3104312319,DE +3104312320,3104313343,TR +3104313344,3104314367,NO +3104314368,3104315391,RU +3104315392,3104316415,IT +3104316416,3104317439,FR +3104317440,3104318463,CY +3104318464,3104319487,IT +3104319488,3104320511,UA +3104320512,3104321535,BE +3104321536,3104322559,FR +3104322560,3104323583,BE +3104323584,3104324607,CZ +3104324608,3104325631,LV +3104325632,3104326655,FR +3104326656,3104327679,MD +3104327680,3104328703,HU +3104328704,3104329727,FR +3104329728,3104330751,SE +3104330752,3104331775,DE +3104331776,3104333823,GB +3104333824,3104334847,FR +3104334848,3104335871,SE +3104335872,3104336895,LT +3104336896,3104337919,GB +3104337920,3104338943,IE +3104338944,3104339967,DE +3104339968,3104340991,IT +3104340992,3104342015,RU +3104342016,3104343039,TR +3104343040,3104344063,GB +3104344064,3104345087,DE +3104345088,3104346111,ES +3104346112,3104347135,FR +3104347136,3104348159,IT +3104348160,3104349183,RO +3104349184,3104350207,RU +3104350208,3104352255,CZ +3104352256,3104353279,DE +3104353280,3104354303,IR +3104354304,3104355327,NL +3104355328,3104356351,RU +3104356352,3104357375,AT +3104357376,3104358399,CZ +3104358400,3104359423,IE +3104359424,3104360447,IT +3104360448,3104361471,RU +3104361472,3104362495,GB +3104362496,3104363519,CH +3104363520,3104364543,UZ +3104364544,3104366591,RU +3104366592,3104368639,DE +3104368640,3104369663,KZ +3104369664,3104370687,CZ +3104370688,3104372735,ES +3104372736,3104373759,NO +3104373760,3104374783,FR +3104374784,3104375807,SE +3104375808,3104376831,DK +3104376832,3104377855,FI +3104377856,3104378879,DE +3104378880,3104379215,GB +3104379216,3104379223,CZ +3104379224,3104379391,GB +3104379392,3104379647,CH +3104379648,3104379903,AT +3104379904,3104380927,FR +3104380928,3104381951,DK +3104381952,3104382975,DE +3104382976,3104383999,GB +3104384000,3104385023,TR +3104385024,3104386047,UA +3104386048,3104387071,AL +3104387072,3104388095,GB +3104388096,3104389119,IT +3104389120,3104390143,PL +3104390144,3104391167,SE +3104391168,3104392191,DE +3104392192,3104393215,IQ +3104393216,3104397311,RU +3104397312,3104398335,NO +3104398336,3104399359,GB +3104399360,3104400383,FR +3104400384,3104401407,MT +3104401408,3104403455,DE +3104403456,3104404479,SK +3104404480,3104405503,CZ +3104405504,3104405759,KZ +3104405760,3104406015,RU +3104406016,3104406527,KZ +3104406528,3104407551,PL +3104407552,3104408575,DE +3104408576,3104409599,AT +3104409600,3104410623,LB +3104410624,3104411647,DK +3104411648,3104412671,RU +3104412672,3104413695,IT +3104413696,3104414719,FR +3104414720,3104415743,TR +3104415744,3104416767,RU +3104416768,3104417791,SE +3104417792,3104418815,US +3104418816,3104419839,GB +3104419840,3104421887,DE +3104421888,3104422911,RU +3104422912,3104423935,LU +3104423936,3104424959,ES +3104424960,3104425983,KW +3104425984,3104428031,RU +3104428032,3104429055,IT +3104429056,3104430079,GI +3104430080,3104431103,DE +3104431104,3104432127,TR +3104432128,3104433151,DE +3104433152,3104434175,RU +3104434176,3104435199,GB +3104435200,3104437247,RO +3104437248,3104438271,LU +3104438272,3104439295,FR +3104439296,3104440319,NL +3104440320,3104441343,RU +3104441344,3104442367,IL +3104442368,3104443391,DK +3104443392,3104444415,GB +3104444416,3104445439,FR +3104445440,3104446463,MD +3104446464,3104447487,PL +3104447488,3104448511,NO +3104448512,3104449535,IT +3104449536,3104450559,DE +3104450560,3104451583,HR +3104451584,3104452607,RU +3104452608,3104453631,NL +3104453632,3104454655,CH +3104454656,3104455679,NL +3104455680,3104456703,RU +3104456704,3104457727,IL +3104457728,3104457983,SC +3104457984,3104458495,DE +3104458496,3104459775,IR +3104459776,3104460799,IT +3104460800,3104461823,ES +3104461824,3104462847,CZ +3104462848,3104463871,GB +3104463872,3104464895,DE +3104464896,3104465919,NL +3104465920,3104466943,GB +3104467968,3104468991,DE +3104468992,3104470015,SA +3104470016,3104471039,IE +3104471040,3104472063,PL +3104472064,3104473087,HU +3104473088,3104474111,RU +3104474112,3104475135,SE +3104475136,3104476159,RU +3104476160,3104477183,RS +3104477184,3104478207,GB +3104478208,3104479231,DE +3104479232,3104480255,RU +3104480256,3104482303,NL +3104482304,3104484351,ES +3104484352,3104485375,RU +3104485376,3104486399,FR +3104486400,3104488447,RU +3104488448,3104489471,IT +3104489472,3104490495,DE +3104490496,3104491519,FI +3104491520,3104492543,GB +3104492544,3104493567,RS +3104493568,3104494591,UA +3104494592,3104495615,DK +3104495616,3104496639,JO +3104496640,3104497663,DK +3104497664,3104498687,CH +3104498688,3104500735,NL +3104500736,3104501759,CZ +3104501760,3104502783,LY +3104502784,3104503807,DE +3104503808,3104504831,ES +3104504832,3104505855,FR +3104505856,3104506879,NO +3104506880,3104507903,RU +3104507904,3104508927,YE +3104508928,3104509951,TR +3104509952,3104510975,DE +3104510976,3104511999,IT +3104512000,3104513023,LT +3104513024,3104514047,UA +3104514048,3104515071,RU +3104515072,3104516095,GB +3104516096,3104516351,CY +3104516352,3104516607,LU +3104516608,3104516863,CY +3104516864,3104517119,LU +3104517120,3104518143,IL +3104518144,3104519167,RU +3104519168,3104520191,IT +3104520192,3104521215,CH +3104521216,3104522239,RU +3104522240,3104523263,IE +3104523264,3104524287,IR +3104524288,3104525311,RU +3104525312,3104526335,BY +3104526336,3104527359,UA +3104527360,3104528383,AT +3104528384,3104529407,IR +3104529408,3104530431,GB +3104530432,3104531455,SE +3104531456,3104532479,PL +3104532480,3104533503,GB +3104533504,3104534527,PL +3104534528,3104535551,SE +3104535552,3104536575,ES +3104536576,3104537599,SA +3104537600,3104538623,US +3104538624,3104539647,PL +3104539648,3104540671,RU +3104540672,3104541695,DE +3104541696,3104542719,GB +3104542720,3104543743,NL +3104543744,3104544767,RU +3104544768,3104545791,IT +3104545792,3104546815,DE +3104546816,3104547839,FR +3104547840,3104548863,PT +3104548864,3104549887,CH +3104549888,3104550911,HU +3104550912,3104551935,IR +3104551936,3104552959,NO +3104552960,3104553983,GB +3104553984,3104555007,FR +3104555008,3104556031,IT +3104556032,3104557055,RU +3104557056,3104558079,ES +3104558080,3104559103,GB +3104559104,3104560127,FI +3104560128,3104561151,TR +3104561152,3104561919,NL +3104561920,3104562047,FR +3104562048,3104562175,NL +3104562176,3104563199,ES +3104563200,3104564223,IT +3104564224,3104565247,RU +3104565248,3104566271,IT +3104566272,3104567295,ES +3104567296,3104568319,GB +3104568320,3104569343,RU +3104569344,3104570367,TR +3104570368,3104571391,DE +3104571392,3104572415,FR +3104572416,3104573439,CH +3104573440,3104574463,UA +3104574464,3104575487,NL +3104575488,3104576511,AZ +3104576512,3104577535,PL +3104577536,3104578559,IQ +3104578560,3104579583,RU +3104579584,3104580607,FR +3104581632,3104582655,ME +3104582656,3104583679,CH +3104583680,3104584703,FR +3104584704,3104585727,RU +3104585728,3104586751,NO +3104586752,3104587775,IR +3104587776,3104588799,DE +3104588800,3104589823,RU +3104589824,3104590847,NO +3104590848,3104591871,BA +3104591872,3104592895,IE +3104592896,3104593919,RU +3104593920,3104594943,DE +3104594944,3104595967,RU +3104595968,3104596991,FR +3104596992,3104598015,IR +3104598016,3104599039,ES +3104599040,3104600063,TR +3104600064,3104601087,UA +3104601088,3104602111,PT +3104602112,3104603135,NL +3104603136,3104604159,RU +3104604160,3104605183,CH +3104605184,3104606207,NL +3104606208,3104607231,GB +3104607232,3104608255,UA +3104608256,3104609279,NL +3104609280,3104609503,SE +3104609504,3104609535,NL +3104609536,3104609759,SE +3104609760,3104609791,NL +3104609792,3104610303,SE +3104610304,3104611327,RU +3104611328,3104612351,IE +3104612352,3104613375,GB +3104613376,3104614399,SA +3104614400,3104615423,BA +3104615424,3104616447,SA +3104616448,3104617471,DE +3104617472,3104618495,AT +3104618496,3104619519,PS +3104619520,3104621567,GB +3104621568,3104622591,CZ +3104622592,3104623615,GB +3104623616,3104624639,FR +3104624640,3104625663,RU +3104625664,3104625919,NL +3104625920,3104626687,CY +3104626688,3104627711,NL +3104627712,3104628735,LB +3104628736,3104629759,TR +3104629760,3104630783,RU +3104630784,3104631807,GB +3104631808,3104632831,EE +3104632832,3104633855,NL +3104633856,3104634879,JO +3104634880,3104635903,SE +3104635904,3104637951,RU +3104637952,3104638975,UA +3104638976,3104639999,RS +3104640000,3104641023,GB +3104641024,3104642047,EE +3104642048,3104643071,KZ +3104643072,3104644095,RU +3104644096,3104645119,DE +3104645120,3104646143,RU +3104646144,3104647167,FR +3104647168,3104648191,GB +3104648192,3104649215,RU +3104649216,3104650239,GB +3104650240,3104651263,SI +3104651264,3104652287,TR +3104652288,3104653311,ES +3104653312,3104654335,FR +3104654336,3104655359,DE +3104655360,3104656383,GB +3104656384,3104657407,ES +3104657408,3104658431,GB +3104658432,3104659455,JO +3104659456,3104660479,LU +3104660480,3104661503,NO +3104661504,3104662527,SE +3104662528,3104663551,FR +3104663552,3104664255,GB +3104664256,3104664263,CH +3104664264,3104664271,PL +3104664272,3104665599,GB +3104665600,3104668671,RU +3104668672,3104669695,NO +3104669696,3104670719,FR +3104670720,3104672767,RU +3104672768,3104673791,GB +3104673792,3104674815,PL +3104674816,3104675839,DE +3104675840,3104676863,LV +3104676864,3104677887,DE +3104677888,3104678911,RU +3104678912,3104679935,IT +3104679936,3104681983,PL +3104681984,3104683007,RU +3104683008,3104684031,FR +3104684032,3104685055,PL +3104685056,3104686079,GB +3104686080,3104687103,IL +3104687104,3104688127,AM +3104688128,3104689151,ES +3104689152,3104690175,GB +3104690176,3104691199,DE +3104691200,3104693247,FR +3104693248,3104694271,IT +3104694272,3104695295,NL +3104695296,3104696319,IR +3104696320,3104697343,PL +3104697344,3104698367,MK +3104698368,3104699391,BA +3104699392,3104700415,GB +3104700416,3104701439,UA +3104701440,3104702463,IT +3104702464,3104703487,FR +3104703488,3104704511,RU +3104704512,3104705535,IT +3104705536,3104706559,DE +3104706560,3104707583,UA +3104707584,3104708607,TR +3104708608,3104709631,ES +3104709632,3104710655,NL +3104710656,3104711679,RU +3104711680,3104712703,ES +3104712704,3104714751,RU +3104714752,3104715775,DE +3104715776,3104716799,AT +3104716800,3104717823,ES +3104718848,3104719871,TR +3104719872,3104720895,RU +3104720896,3104721919,PL +3104721920,3104722943,IT +3104722944,3104723967,IR +3104723968,3104724991,GB +3104724992,3104726015,RU +3104726016,3104727039,DE +3104727040,3104727295,FR +3104727296,3104727551,DE +3104727552,3104727807,ES +3104727808,3104728063,IT +3104728064,3104729087,KZ +3104729088,3104730111,FR +3104730112,3104731135,CH +3104731136,3104732159,PL +3104732160,3104733183,SK +3104733184,3104734207,FR +3104734208,3104735231,BA +3104735232,3104736255,FR +3104736256,3104737279,JO +3104737280,3104740351,GB +3104740352,3104741375,PL +3104741376,3104742399,GB +3104742400,3104743423,CH +3104743424,3104744447,IR +3104744448,3104745471,GB +3104745472,3104746495,NL +3104746496,3104747519,TR +3104747520,3104749567,FR +3104749568,3104750591,NL +3104750592,3104751615,CZ +3104751616,3104751871,GB +3104751872,3104752127,CA +3104752128,3104752255,GB +3104752256,3104752383,RU +3104752384,3104752639,UA +3104752640,3104753663,SA +3104753664,3104754687,GR +3104754688,3104755711,MK +3104755712,3104757759,GB +3104757760,3104758783,EE +3104758784,3104759807,GB +3104759808,3104760831,CZ +3104760832,3104761855,FR +3104761856,3104762879,CZ +3104762880,3104763903,IT +3104763904,3104764927,SE +3104764928,3104765951,FR +3104765952,3104766975,IQ +3104766976,3104767999,CZ +3104768000,3104769023,PL +3104769024,3104770047,UA +3104770048,3104771071,DE +3104771072,3104772095,NL +3104772096,3104773119,FR +3104773120,3104774143,PT +3104774144,3104775167,FR +3104775168,3104776191,HR +3104776192,3104776703,GB +3104776704,3104777215,IE +3104777216,3104778239,RU +3104778240,3104779263,TR +3104779264,3104780287,PL +3104780288,3104782335,FR +3104782336,3104783359,NL +3104783360,3104784383,RU +3104784384,3104785407,BA +3104785408,3104786431,FR +3104786432,3104787455,DK +3104787456,3104788479,ES +3104788480,3104789503,PL +3104789504,3104791551,RU +3104791552,3104792575,DE +3104792576,3104793599,RU +3104793600,3104794623,ES +3104794624,3104795647,GB +3104795648,3104796671,CZ +3104796672,3104797695,GE +3104797696,3104798719,RU +3104798720,3104799743,SE +3104799744,3104800767,DK +3104800768,3104801280,FR +3104801281,3104801281,IT +3104801282,3104801791,FR +3104801792,3104802815,PL +3104802816,3104803839,AE +3104803840,3104804863,FR +3104804864,3104805887,CZ +3104805888,3104806911,ES +3104806912,3104807935,NO +3104807936,3104808959,BY +3104808960,3104809983,IT +3104809984,3104811007,NL +3104811008,3104812031,IT +3104812032,3104813055,RU +3104813056,3104816127,DE +3104816128,3104817151,RU +3104817152,3104818175,DE +3104818176,3104819199,TR +3104819200,3104820223,CH +3104820224,3104821247,GB +3104821248,3104821503,RU +3104821504,3104822271,NL +3104822272,3104823295,FI +3104823296,3104824319,NO +3104824320,3104825343,NL +3104825344,3104826367,GB +3104826368,3104827391,CH +3104827392,3104828415,PL +3104828416,3104829439,AT +3104829440,3104830463,GB +3104830464,3104831487,DE +3104831488,3104832511,NL +3104832512,3104833535,CZ +3104833536,3104834559,GB +3104834560,3104835583,KW +3104835584,3104836607,RU +3104836608,3104837631,BA +3104837632,3104838655,DK +3104838656,3104839679,NL +3104839680,3104840703,IQ +3104840704,3104841727,UA +3104841728,3104843775,PL +3104843776,3104844799,GB +3104844800,3104846847,FR +3104846848,3104847871,AT +3104847872,3104848895,RU +3104848896,3104849919,DE +3104849920,3104850943,RU +3104850944,3104851199,GB +3104851200,3104851455,JE +3104851456,3104851967,GB +3104851968,3104852991,DE +3104852992,3104854015,AT +3104854016,3104855039,GI +3104855040,3104855295,SE +3104855296,3104855551,GB +3104855552,3104856063,SE +3104856064,3104857087,IL +3104857088,3104858111,SE +3104858112,3104859135,FI +3104859136,3104861183,RU +3104861184,3104862207,DE +3104862208,3104863231,AT +3104863232,3104864255,RU +3104864256,3104865279,ES +3104865280,3104866303,UA +3104866304,3104867327,PL +3104867328,3104868351,IT +3104868352,3104869375,RU +3104869376,3104870399,DK +3104870400,3104871423,PL +3104871424,3104872447,RU +3104872448,3104873471,GB +3104873472,3104874495,DK +3104874496,3104875519,GB +3104875520,3104876543,GR +3104876544,3104877567,FI +3104877568,3104878591,CH +3104878592,3104879615,RU +3104879616,3104880639,CZ +3104880640,3104881663,DE +3104881664,3104882687,AT +3104882688,3104883711,MT +3104883712,3104884735,DE +3104884736,3104885759,SE +3104885760,3104886783,GB +3104886784,3104887807,ES +3104887808,3104888831,RU +3104888832,3104889855,US +3104889856,3104890879,FR +3104890880,3104891903,GB +3104891904,3104892927,UA +3104892928,3104893951,IR +3104893952,3104894975,TR +3104894976,3104895999,BE +3104896000,3104897023,RU +3104897024,3104898047,ES +3104898048,3104899071,FR +3104899072,3104900095,RU +3104900096,3104901119,DE +3104901120,3104902143,RU +3104902144,3104903167,AT +3104903168,3104904191,RU +3104904192,3104905215,IT +3104905216,3104906239,GB +3104906240,3104907263,RU +3104907264,3104908287,DE +3104908288,3104909311,RU +3104909312,3104910335,PL +3104910336,3104911359,GB +3104911360,3104912383,IT +3104912384,3104913407,DK +3104913408,3104914431,FR +3104914432,3104915455,NL +3104915456,3104916479,RU +3104916480,3104917503,CH +3104917504,3104918527,NL +3104918528,3104919551,RU +3104919552,3104920575,NL +3104920576,3104922623,RU +3104922624,3104923647,NO +3104924672,3104925695,CZ +3104925696,3104926719,IT +3104926720,3104927743,FR +3104927744,3104928767,TR +3104928768,3104929791,CZ +3104929792,3104930815,RU +3104930816,3104931839,UA +3104931840,3104933887,RU +3104933888,3104934911,TR +3104934912,3104935935,RU +3104935936,3104936959,DE +3104936960,3104937983,GB +3104937984,3104939007,RU +3104939008,3104940031,IT +3104940032,3104941055,PL +3104941056,3104942079,GB +3104942080,3104943103,RU +3104943104,3104944127,GB +3104944128,3104945151,CH +3104945152,3104946175,GB +3104946176,3104947199,NL +3104947200,3104948223,RS +3104948224,3104949247,DK +3104949248,3104950271,GB +3104950272,3104951295,RU +3104951296,3104952319,DE +3104952320,3104953343,CH +3104953344,3104954367,CZ +3104954368,3104955391,DK +3104955392,3104956415,VA +3104956416,3104957439,MD +3104957440,3104958463,PT +3104958464,3104959487,PS +3104959488,3104961535,FR +3104961536,3104962559,DE +3104962560,3104963583,FR +3104963584,3104964607,GB +3104964608,3104965631,DK +3104965632,3104966655,RU +3104966656,3104967679,BE +3104967680,3104968703,RS +3104968704,3104969727,ES +3104969728,3104970751,RU +3104970752,3104971775,IT +3104971776,3104972799,CZ +3104972800,3104973823,GB +3104973824,3104974847,DE +3104975872,3104976895,RU +3104976896,3104977919,GB +3104977920,3104978431,NL +3104978432,3104978943,DE +3104978944,3104979967,BG +3104979968,3104980991,HR +3104980992,3104982015,SK +3104982016,3104983039,PL +3104983040,3104984063,AM +3104984064,3104985087,FI +3104985088,3104986111,FR +3104986112,3104987135,SE +3104987136,3104988159,RU +3104988160,3104989183,DE +3104989184,3104990207,FR +3104990208,3104991231,DE +3104991232,3104992255,BE +3104992256,3104995327,RU +3104995328,3104996351,GB +3104996352,3104997375,RU +3104997376,3104998399,DE +3104998400,3104999423,PL +3104999424,3105000447,GB +3105000448,3105001471,PL +3105001472,3105002495,GB +3105002496,3105003519,BE +3105003520,3105004543,BA +3105004544,3105005567,IR +3105005568,3105006591,EE +3105006592,3105007615,SE +3105007616,3105008639,FR +3105008640,3105009663,CH +3105009664,3105010687,PL +3105010688,3105011711,AT +3105011712,3105012229,CY +3105012230,3105012230,US +3105012231,3105012231,CY +3105012232,3105012235,US +3105012236,3105012257,CY +3105012258,3105012258,US +3105012259,3105012259,CY +3105012260,3105012267,US +3105012268,3105012485,CY +3105012486,3105012486,GB +3105012487,3105012487,CY +3105012488,3105012491,GB +3105012492,3105012543,CY +3105012544,3105012557,DE +3105012558,3105012559,US +3105012560,3105012560,CY +3105012561,3105012563,DE +3105012564,3105012735,CY +3105012736,3105013759,GL +3105013760,3105014783,SE +3105014784,3105015807,ES +3105015808,3105016831,RU +3105016832,3105017855,IL +3105017856,3105018879,FR +3105018880,3105019903,IR +3105019904,3105020927,GB +3105020928,3105021439,NL +3105021440,3105021951,IN +3105021952,3105022975,RO +3105022976,3105023999,BG +3105024000,3105025023,IT +3105025024,3105026047,NL +3105026048,3105027071,IT +3105027072,3105028095,AZ +3105028096,3105029119,ES +3105029120,3105030143,KZ +3105030144,3105031167,CZ +3105031168,3105032191,UA +3105032192,3105033215,DE +3105033216,3105035263,GB +3105035264,3105036287,RU +3105036288,3105037311,ES +3105037312,3105038335,CH +3105038336,3105040383,DE +3105040384,3105041407,GB +3105041408,3105042431,GR +3105042432,3105043455,FR +3105043456,3105044479,DE +3105044480,3105045503,NL +3105045504,3105046527,DE +3105046528,3105047295,NO +3105047296,3105047551,DK +3105047552,3105048575,ES +3105048576,3105049599,SK +3105049600,3105050623,KW +3105050624,3105051647,TR +3105051648,3105052671,CH +3105052672,3105053695,GB +3105053696,3105054719,TR +3105054720,3105055743,GE +3105055744,3105056047,NL +3105056048,3105056055,GB +3105056056,3105056243,NL +3105056244,3105056244,DE +3105056245,3105056767,NL +3105056768,3105057791,SC +3105057792,3105058815,GB +3105058816,3105059839,JO +3105059840,3105060863,PL +3105060864,3105061887,CH +3105061888,3105062911,SY +3105062912,3105063935,IT +3105063936,3105064959,DK +3105064960,3105065983,FR +3105065984,3105067007,IT +3105067008,3105069055,GB +3105069056,3105070079,TR +3105070080,3105071103,ES +3105071104,3105072127,FR +3105072128,3105073151,IT +3105073152,3105074175,CH +3105074176,3105075199,DE +3105075200,3105076223,RU +3105076224,3105077247,BE +3105077248,3105078271,IT +3105078272,3105079295,ES +3105079296,3105080319,KZ +3105080320,3105081343,DE +3105081344,3105082367,GB +3105082368,3105083391,RU +3105083392,3105084415,GB +3105084416,3105085439,ES +3105085440,3105086463,DE +3105086464,3105087487,PS +3105087488,3105088511,FR +3105088512,3105089535,JO +3105089536,3105090559,DE +3105090560,3105091583,NL +3105091584,3105092607,FR +3105092608,3105093631,UA +3105093632,3105095679,SE +3105095680,3105097727,GB +3105097728,3105098751,FR +3105098752,3105099775,SE +3105099776,3105100799,FR +3105100800,3105101823,PL +3105101824,3105102847,IQ +3105102848,3105103871,HR +3105103872,3105104895,GB +3105104896,3105105919,CY +3105105920,3105106943,FR +3105106944,3105107967,RU +3105107968,3105110015,GB +3105110016,3105111039,EE +3105111040,3105112063,GB +3105112064,3105113087,IT +3105113088,3105113343,NL +3105113344,3105113599,ES +3105113600,3105113855,IE +3105113856,3105114111,FR +3105114112,3105115135,SA +3105115136,3105117183,RU +3105117184,3105118207,FR +3105118208,3105119231,BG +3105119232,3105120255,IM +3105120256,3105121279,GB +3105121280,3105122303,EE +3105122304,3105123327,NO +3105123328,3105124351,ES +3105124352,3105125375,BY +3105125376,3105126399,ES +3105126400,3105127423,KG +3105127424,3105128447,KZ +3105128448,3105129471,GB +3105129472,3105130495,RU +3105130496,3105131519,FI +3105131520,3105132543,DK +3105132544,3105133567,CH +3105133568,3105134591,PL +3105134592,3105135615,SA +3105135616,3105136639,BG +3105136640,3105137663,IR +3105137664,3105138687,GB +3105138688,3105139711,NO +3105139712,3105140735,PL +3105140736,3105142783,RU +3105142784,3105143807,NL +3105143808,3105144831,DE +3105144832,3105145855,ES +3105145856,3105146879,IQ +3105146880,3105147903,CH +3105147904,3105148927,DK +3105148928,3105149951,CH +3105149952,3105150975,CY +3105150976,3105151999,UA +3105152000,3105153023,US +3105153024,3105154047,RU +3105154048,3105156095,DE +3105156096,3105157119,AT +3105157120,3105158143,DK +3105158144,3105159167,NO +3105159168,3105161215,GB +3105161216,3105162239,FI +3105162240,3105163263,TR +3105163264,3105164287,IL +3105164288,3105165311,GB +3105165312,3105166335,IS +3105166336,3105167359,GB +3105167360,3105168383,IT +3105168384,3105169407,DE +3105169408,3105170431,ES +3105170432,3105171455,PL +3105171456,3105172479,DK +3105172480,3105173503,ES +3105173504,3105174527,FR +3105174528,3105177599,NL +3105177600,3105178623,RU +3105178624,3105179647,IR +3105179648,3105180671,IT +3105180672,3105181695,IR +3105181696,3105182719,FR +3105182720,3105183743,PL +3105183744,3105184767,SE +3105184768,3105185791,RO +3105185792,3105186815,AT +3105186816,3105187839,DE +3105187840,3105188863,US +3105188864,3105189887,GB +3105189888,3105190911,FR +3105190912,3105191935,SM +3105191936,3105192959,PS +3105192960,3105193983,DE +3105193984,3105195007,FR +3105195008,3105196031,GB +3105196032,3105197055,IQ +3105197056,3105198079,RU +3105198080,3105199103,SE +3105199104,3105200127,PL +3105200128,3105201151,FR +3105201152,3105202175,RU +3105202176,3105203199,CZ +3105203200,3105204223,DE +3105204224,3105205247,NL +3105205248,3105206271,IT +3105206272,3105207295,UA +3105207296,3105208319,RO +3105208320,3105210367,NL +3105210368,3105211391,FR +3105211392,3105212415,CZ +3105212416,3105213439,NL +3105213440,3105214463,TR +3105214464,3105215487,GB +3105215488,3105216511,GP +3105216512,3105217535,GB +3105217536,3105218559,CZ +3105218560,3105219583,DE +3105219584,3105220607,GL +3105220608,3105221631,DK +3105221632,3105222655,AT +3105222656,3105223679,NL +3105223680,3105224575,DE +3105224576,3105224703,AE +3105224704,3105225727,IT +3105225728,3105226751,AM +3105226752,3105227775,RO +3105228800,3105229823,PL +3105229824,3105230847,NL +3105230848,3105231871,UA +3105231872,3105232895,AT +3105232896,3105233919,RU +3105233920,3105234943,IR +3105234944,3105235967,LB +3105235968,3105236991,IT +3105236992,3105238015,FR +3105238016,3105239039,DE +3105239040,3105240063,FR +3105240064,3105241087,CH +3105241088,3105242111,TR +3105242112,3105243135,RU +3105243136,3105244159,KZ +3105244160,3105245183,DE +3105245184,3105246207,DK +3105246208,3105248255,GB +3105248256,3105249279,IT +3105249280,3105250303,RS +3105250304,3105251327,ES +3105251328,3105252351,CZ +3105252352,3105253375,TR +3105253376,3105254399,CH +3105254400,3105255423,FR +3105255424,3105256447,PL +3105256448,3105257471,FR +3105257472,3105258495,NO +3105258496,3105259519,CZ +3105259520,3105260543,FR +3105260544,3105261567,FI +3105261568,3105262591,PL +3105262592,3105263615,DE +3105263616,3105264639,RS +3105264640,3105265663,DE +3105265664,3105266687,RU +3105266688,3105267711,IE +3105267712,3105268735,TR +3105268736,3105269759,GB +3105269760,3105270783,FR +3105270784,3105271807,RU +3105271808,3105272831,SK +3105272832,3105273855,RU +3105273856,3105274879,TR +3105274880,3105276927,NL +3105276928,3105277951,FR +3105277952,3105278975,ES +3105278976,3105279999,RU +3105280000,3105281023,GB +3105281024,3105282047,SK +3105282048,3105283071,FR +3105283072,3105284095,DE +3105284096,3105285119,GB +3105285120,3105286143,IT +3105286144,3105287167,RU +3105287168,3105288191,CZ +3105288192,3105289215,GB +3105289216,3105290239,AT +3105290240,3105291263,TR +3105292288,3105293311,AT +3105293312,3105294335,GB +3105294336,3105295359,RU +3105295360,3105296383,PL +3105296384,3105297407,LT +3105297408,3105298431,PL +3105298432,3105299455,NL +3105299456,3105300479,IT +3105300480,3105301503,RU +3105301504,3105302527,ES +3105302528,3105303551,FR +3105304576,3105305599,GE +3105305600,3105308671,GB +3105308672,3105309695,RU +3105309696,3105310719,ES +3105310720,3105311743,TR +3105312768,3105313791,RU +3105313792,3105314815,IT +3105314816,3105315839,GR +3105315840,3105317887,FR +3105317888,3105318911,GB +3105318912,3105319935,UA +3105319936,3105320959,HU +3105320960,3105321983,SK +3105321984,3105323007,GB +3105323008,3105324031,ES +3105324032,3105325055,SA +3105325056,3105326079,IR +3105326080,3105328127,FR +3105328128,3105329151,NL +3105329152,3105330175,NO +3105330176,3105331199,PL +3105331200,3105332223,IQ +3105332224,3105333247,DE +3105333248,3105334271,LV +3105334272,3105335295,UA +3105335296,3105336319,GR +3105336320,3105337343,IL +3105337344,3105339391,GB +3105339392,3105340415,SY +3105340416,3105341439,FR +3105341440,3105342463,ES +3105342464,3105343487,AE +3105345536,3105346559,DE +3105346560,3105347583,NL +3105347584,3105348607,DK +3105348608,3105349631,ES +3105349632,3105350655,DE +3105350656,3105351679,RU +3105351680,3105352703,GB +3105352704,3105353727,DE +3105353728,3105353983,GB +3105353984,3105354751,DE +3105354752,3105355775,BE +3105355776,3105356799,NL +3105356800,3105357823,GB +3105357824,3105358847,IS +3105358848,3105359871,ES +3105359872,3105360895,CZ +3105360896,3105361919,GB +3105361920,3105362943,FR +3105362944,3105363967,CZ +3105363968,3105364991,PL +3105364992,3105366015,FR +3105366016,3105367039,AL +3105367040,3105368063,SI +3105368064,3105370111,RU +3105370112,3105371135,NL +3105371136,3105373183,RU +3105373184,3105374207,SY +3105374208,3105375231,GB +3105375232,3105375295,IT +3105375296,3105375327,DE +3105375328,3105375359,CA +3105375360,3105375375,DE +3105375376,3105375391,US +3105375392,3105375551,IT +3105375552,3105375615,DE +3105375616,3105375743,IT +3105375744,3105376255,DE +3105376256,3105377279,GB +3105377280,3105378303,IL +3105378304,3105380351,GB +3105380352,3105381375,PL +3105381376,3105382399,RU +3105382400,3105383423,GB +3105383424,3105383679,BY +3105383680,3105383935,SK +3105383936,3105384447,AT +3105384448,3105385471,IT +3105385472,3105387519,RU +3105387520,3105388543,IT +3105388544,3105389567,GB +3105389568,3105390591,TR +3105390592,3105391615,JO +3105391616,3105392639,NL +3105392640,3105393663,IR +3105393664,3105395711,FR +3105395712,3105396735,IR +3105396736,3105398783,FR +3105398784,3105399807,GB +3105399808,3105400831,PL +3105400832,3105401855,DK +3105401856,3105402879,NL +3105402880,3105404927,RU +3105404928,3105404928,FR +3105404929,3105404929,RE +3105404930,3105405122,FR +3105405123,3105405123,RE +3105405124,3105405378,FR +3105405379,3105405379,RE +3105405380,3105405634,FR +3105405635,3105405635,RE +3105405636,3105405890,FR +3105405891,3105405891,RE +3105405892,3105405951,FR +3105405952,3105406975,NO +3105406976,3105407999,FR +3105408000,3105410047,PL +3105410048,3105411071,IL +3105411072,3105412095,BA +3105412096,3105413119,RU +3105413120,3105414143,PL +3105414144,3105416191,NL +3105416192,3105417215,IR +3105417216,3105418239,IE +3105418240,3105419263,CZ +3105419264,3105420287,NL +3105420288,3105421311,RU +3105421312,3105421823,US +3105421824,3105422335,NL +3105422336,3105423359,IR +3105423360,3105423487,VN +3105423488,3105423615,NO +3105423616,3105423871,FI +3105423872,3105424127,RU +3105424128,3105424383,IL +3105424384,3105426431,RU +3105426432,3105427455,QA +3105427456,3105428479,RU +3105428480,3105429503,GR +3105429504,3105430527,ES +3105430528,3105431551,CH +3105431552,3105432575,GB +3105432576,3105433599,DE +3105433600,3105434623,FR +3105434624,3105435647,SE +3105435648,3105436671,LT +3105437696,3105438719,GB +3105438720,3105439743,RU +3105439744,3105440767,GB +3105440768,3105441791,RU +3105441792,3105442815,IT +3105442816,3105443839,FI +3105443840,3105444863,NL +3105444864,3105445119,GB +3105445120,3105445631,US +3105445632,3105445887,GB +3105445888,3105446911,RU +3105446912,3105447935,CH +3105447936,3105448959,DE +3105448960,3105449983,TR +3105449984,3105451007,AE +3105451008,3105452031,PL +3105452032,3105453055,ES +3105453056,3105454079,UA +3105454080,3105455103,PL +3105455104,3105456127,AT +3105456128,3105457151,IT +3105457152,3105458175,DE +3105458176,3105459199,IT +3105459200,3105460223,DK +3105460224,3105461247,GB +3105461248,3105462271,PL +3105462272,3105463295,RU +3105464320,3105465343,NL +3105465344,3105466367,DE +3105466368,3105467391,MT +3105467392,3105468415,GB +3105468416,3105469439,RU +3105469440,3105469951,SE +3105469952,3105470207,AT +3105470208,3105470463,AE +3105470464,3105471487,CZ +3105471488,3105472511,GB +3105472512,3105473535,CH +3105473536,3105474559,ES +3105474560,3105475583,FI +3105475584,3105476607,IT +3105476608,3105477631,GB +3105477632,3105478655,DK +3105478656,3105479679,PL +3105479680,3105480703,GB +3105480704,3105481727,CH +3105481728,3105482751,NL +3105482752,3105483775,IT +3105483776,3105486847,GB +3105486848,3105487871,SK +3105487872,3105488895,IS +3105488896,3105489407,BG +3105489408,3105489663,FR +3105489664,3105489919,BG +3105489920,3105490943,ES +3105490944,3105491967,SE +3105491968,3105494015,GB +3105494016,3105495039,BE +3105495040,3105495807,AE +3105495808,3105496063,LU +3105496064,3105497087,RU +3105497088,3105498111,IR +3105498112,3105499135,DE +3105499136,3105500159,RU +3105501184,3105502207,FI +3105502208,3105503231,RU +3105503232,3105504255,NL +3105504256,3105505279,DK +3105505280,3105506303,IT +3105506304,3105507327,TR +3105507328,3105508351,RU +3105508352,3105510399,DE +3105510400,3105511423,SA +3105511424,3105512447,FR +3105512448,3105513471,GB +3105513472,3105514495,DE +3105514496,3105515519,RU +3105515520,3105516543,FR +3105516544,3105517567,NL +3105517568,3105518591,RU +3105518592,3105519615,RS +3105519616,3105520639,RU +3105520640,3105521663,LU +3105521664,3105522687,NO +3105522688,3105523711,LT +3105523712,3105524735,ES +3105524736,3105525759,IT +3105525760,3105526783,TR +3105526784,3105527807,GB +3105527808,3105528063,NL +3105528064,3105528319,US +3105528320,3105528831,NL +3105528832,3105529855,DE +3105529856,3105530879,LU +3105530880,3105531903,NO +3105531904,3105532927,RU +3105532928,3105533951,RS +3105533952,3105534975,BA +3105534976,3105535231,ZA +3105535232,3105535794,US +3105535795,3105535795,RU +3105535796,3105535999,US +3105536000,3105537023,AZ +3105537024,3105538047,AT +3105538048,3105539071,RU +3105539072,3105540095,IT +3105540096,3105541119,DE +3105541120,3105542143,RU +3105542144,3105543167,IR +3105543168,3105544191,NL +3105544192,3105545215,RU +3105545216,3105546239,FR +3105546240,3105547263,ES +3105547264,3105548287,GB +3105548288,3105549311,IR +3105549312,3105550079,AT +3105550080,3105550335,FR +3105550336,3105551359,GB +3105551360,3105552383,US +3105552384,3105553407,FR +3105553408,3105554431,DE +3105554432,3105555455,DK +3105555456,3105556479,CH +3105556480,3105557503,DE +3105557504,3105558527,GB +3105558528,3105558591,US +3105558592,3105559551,NL +3105559552,3105560575,GB +3105560576,3105561599,NO +3105561600,3105563647,NL +3105563648,3105564671,IS +3105564672,3105565695,NL +3105565696,3105567743,RU +3105567744,3105568767,PL +3105568768,3105569791,MT +3105569792,3105570815,HU +3105570816,3105571839,LI +3105571840,3105572863,KZ +3105572864,3105573887,IT +3105573888,3105574911,FR +3105574912,3105575935,RU +3105575936,3105576959,DE +3105576960,3105577983,OM +3105577984,3105579007,LV +3105579008,3105580031,SE +3105580032,3105581055,RU +3105581056,3105582079,IL +3105582080,3105583103,CH +3105583104,3105584127,DK +3105584128,3105585151,DE +3105585152,3105586175,AT +3105586176,3105587199,ES +3105587200,3105588223,RS +3105588224,3105589247,GB +3105589248,3105590271,ES +3105590272,3105591295,NL +3105591296,3105592319,GB +3105592320,3105593343,RU +3105593344,3105595391,DE +3105595392,3105596415,RU +3105596416,3105598463,SE +3105598464,3105599487,NL +3105599488,3105600511,GB +3105600512,3105601535,DE +3105601536,3105602559,CH +3105602560,3105603583,PL +3105603584,3105604607,RU +3105604608,3105605631,GB +3105605632,3105606655,ES +3105606656,3105607679,DK +3105607680,3105608703,RU +3105608704,3105609727,DE +3105609728,3105610751,IQ +3105610752,3105611775,SA +3105611776,3105612799,FR +3105612800,3105613823,US +3105613824,3105614847,SE +3105614848,3105615871,NL +3105615872,3105616895,SE +3105616896,3105617919,GB +3105617920,3105617967,NL +3105617968,3105617999,AF +3105618000,3105618015,NL +3105618016,3105618031,AF +3105618032,3105618047,NL +3105618048,3105618063,AF +3105618064,3105618111,NL +3105618112,3105618127,AF +3105618128,3105618943,NL +3105618944,3105619967,DE +3105619968,3105620991,TR +3105620992,3105622015,DE +3105622016,3105623039,SI +3105623040,3105624063,GB +3105624064,3105625087,PL +3105625088,3105626111,US +3105626112,3105627135,GB +3105627136,3105628159,FR +3105628160,3105629183,GB +3105629184,3105629695,BE +3105629696,3105629951,NL +3105629952,3105630207,BE +3105630208,3105631231,FR +3105631232,3105632255,GB +3105632256,3105633279,ES +3105633280,3105634303,IT +3105634304,3105635327,NL +3105635328,3105636351,TR +3105636352,3105636863,IT +3105637376,3105637631,NL +3105637632,3105637887,DE +3105637888,3105638399,US +3105638400,3105639423,IM +3105639424,3105640447,DE +3105640448,3105641471,IT +3105641472,3105642495,NL +3105642496,3105644543,GB +3105644544,3105645567,DE +3105645568,3105646591,SK +3105646592,3105647615,MD +3105647616,3105648639,UA +3105648640,3105649663,GB +3105649664,3105650687,PL +3105650688,3105651199,EE +3105651200,3105651455,PL +3105651456,3105651711,EE +3105651712,3105652735,SK +3105652736,3105653759,NO +3105653760,3105654783,TR +3105654784,3105655807,SE +3105655808,3105656831,ES +3105656832,3105657855,SK +3105657856,3105658879,NL +3105658880,3105659903,IL +3105659904,3105660927,DE +3105660928,3105661951,TR +3105661952,3105662975,GB +3105662976,3105663999,ES +3105664000,3105665023,DE +3105665024,3105666047,PL +3105666048,3105667071,NL +3105667072,3105668095,DE +3105668096,3105669119,NL +3105669120,3105670143,CZ +3105670144,3105671167,IE +3105671168,3105673215,GB +3105673216,3105674239,DE +3105674240,3105675263,GB +3105675264,3105676287,ES +3105676288,3105678335,NL +3105678336,3105679359,DE +3105679360,3105680383,FR +3105680384,3105681407,UA +3105681408,3105682431,GB +3105682432,3105683455,FI +3105683456,3105684479,PL +3105684480,3105686527,GB +3105686528,3105687551,BE +3105687552,3105688319,SE +3105688320,3105688575,NL +3105688576,3105689599,PL +3105689600,3105690623,SI +3105690624,3105691647,SE +3105691648,3105692671,GR +3105692672,3105693695,DE +3105693696,3105696767,FR +3105696768,3105697791,GB +3105697792,3105698815,FR +3105698816,3105700863,RU +3105700864,3105701887,BE +3105701888,3105702911,FR +3105702912,3105703935,ES +3105703936,3105704959,IT +3105704960,3105705983,DK +3105705984,3105707007,HU +3105707008,3105708031,PL +3105708032,3105709055,AT +3105709056,3105710079,SA +3105710080,3105711103,IT +3105711104,3105712127,RS +3105712128,3105713151,IT +3105713152,3105714175,NL +3105714176,3105715199,SE +3105715200,3105716223,DE +3105716224,3105717247,TR +3105717248,3105719295,RU +3105719296,3105721343,GB +3105721344,3105722367,OM +3105722368,3105723391,IT +3105723392,3105724415,FR +3105724416,3105725439,CH +3105725440,3105726463,SK +3105726464,3105727487,IT +3105727488,3105727743,NO +3105727744,3105727999,BE +3105728000,3105728127,AT +3105728128,3105728191,FI +3105728192,3105728255,PT +3105728256,3105728319,TR +3105728320,3105728383,PL +3105728384,3105728447,CZ +3105728448,3105728511,LT +3105728512,3105729535,DE +3105729536,3105731583,GB +3105731584,3105732607,FR +3105732608,3105733631,KG +3105733632,3105734655,DE +3105734656,3105735679,TR +3105735680,3105736703,IS +3105736704,3105737727,NL +3105737728,3105738751,IT +3105738752,3105739775,GB +3105739776,3105740799,ES +3105740800,3105741823,DE +3105741824,3105742847,IR +3105742848,3105744895,GB +3105744896,3105745919,FR +3105745920,3105746943,UA +3105746944,3105747967,DE +3105747968,3105748991,FR +3105748992,3105750015,IT +3105750016,3105751039,UA +3105751040,3105752063,PL +3105752064,3105753087,IR +3105753088,3105754111,GB +3105754112,3105756159,RU +3105756160,3105757183,US +3105757184,3105758207,GB +3105758208,3105759231,FR +3105759232,3105760255,DE +3105760256,3105761279,LB +3105761280,3105762303,RU +3105762304,3105763327,IT +3105763328,3105764351,FR +3105764352,3105765375,BE +3105765376,3105766399,NL +3105766400,3105769471,IT +3105769472,3105770495,IE +3105770496,3105771519,IR +3105771520,3105772543,IT +3105772544,3105773567,UA +3105773568,3105774591,AZ +3105774592,3105775615,FR +3105775616,3105776639,RU +3105776640,3105777663,DK +3105777664,3105778687,RU +3105778688,3105780735,IT +3105780736,3105781759,RU +3105781760,3105782783,SK +3105782784,3105783807,PL +3105783808,3105785855,FR +3105785856,3105786879,SI +3105786880,3105787903,ES +3105787904,3105788927,AL +3105788928,3105789951,SA +3105789952,3105790975,SE +3105790976,3105791999,DE +3105793024,3105794047,NL +3105795072,3105796095,LU +3105796096,3105797119,NL +3105797120,3105798143,IT +3105798144,3105799167,IS +3105799168,3105800191,IT +3105800192,3105801215,RU +3105801216,3105802239,ES +3105802240,3105803263,UA +3105803264,3105804287,NL +3105804288,3105805311,FR +3105805312,3105806335,GB +3105806336,3105807167,FR +3105807168,3105807175,KM +3105807176,3105807359,FR +3105807360,3105808383,RU +3105808384,3105809407,NO +3105809408,3105810431,RU +3105810432,3105812479,NL +3105812480,3105814527,ES +3105814528,3105815551,JO +3105815552,3105816575,BE +3105816576,3105817599,FR +3105817600,3105818623,DE +3105818624,3105819647,NL +3105819648,3105820671,GB +3105820672,3105820927,NL +3105820928,3105821183,DE +3105821184,3105821695,GB +3105821696,3105822719,ES +3105822720,3105823743,PL +3105823744,3105824767,AT +3105824768,3105825791,RS +3105825792,3105826815,CZ +3105826816,3105827839,FR +3105827840,3105828863,LV +3105828864,3105829887,PL +3105829888,3105830911,AT +3105830912,3105831167,IT +3105831168,3105831423,US +3105831424,3105831679,SG +3105831680,3105831935,BR +3105831936,3105832959,DE +3105832960,3105833983,IT +3105833984,3105835007,FI +3105835008,3105836031,KZ +3105836032,3105837055,DK +3105837056,3105838079,PL +3105838080,3105839103,UA +3105839104,3105840127,PL +3105840128,3105841151,EE +3105841152,3105842175,IE +3105842176,3105843199,CH +3105843200,3105844223,ES +3105844224,3105847295,RU +3105847296,3105848319,BG +3105848320,3105849343,IR +3105849344,3105850367,US +3105850368,3105851391,RU +3105851392,3105852415,FI +3105852416,3105853439,SE +3105853440,3105854463,NL +3105854464,3105855487,FR +3105855488,3105856511,GB +3105856512,3105857535,PT +3105857536,3105859583,RU +3105859584,3105860607,GB +3105860608,3105861631,NL +3105861632,3105862655,DK +3105862656,3105863679,CH +3105863680,3105864703,PL +3105864704,3105865727,AE +3105865728,3105866199,NL +3105866200,3105866200,RU +3105866201,3105866210,NL +3105866211,3105866211,RU +3105866212,3105866239,NL +3105866240,3105866751,RU +3105866752,3105867775,SE +3105867776,3105868799,NL +3105868800,3105869823,GB +3105869824,3105870847,DE +3105870848,3105871871,AT +3105871872,3105872895,PL +3105872896,3105873919,IM +3105873920,3105874943,GB +3105874944,3105875967,NL +3105875968,3105876991,GB +3105876992,3105878015,ES +3105878016,3105879039,EE +3105879040,3105880063,NL +3105880064,3105881087,CH +3105881088,3105882111,GB +3105882112,3105883135,MD +3105883136,3105884159,PL +3105884160,3105885183,SE +3105885184,3105886207,TR +3105886208,3105887231,ES +3105887232,3105888255,AL +3105888256,3105889279,RO +3105889280,3105890303,ES +3105890304,3105891327,DE +3105891328,3105892351,PT +3105892352,3105893375,GB +3105893376,3105894399,AZ +3105894400,3105895423,PL +3105895424,3105896447,GB +3105896448,3105897471,RU +3105897472,3105898495,UA +3105898496,3105898751,CZ +3105898752,3105899263,RU +3105899264,3105899519,CZ +3105899520,3105900543,RU +3105900544,3105901567,GB +3105901568,3105901823,US +3105901824,3105902591,GB +3105902592,3105903615,DE +3105903616,3105904639,RU +3105904640,3105905663,NO +3105905664,3105906687,IE +3105906688,3105908735,FR +3105908736,3105910783,GB +3105910784,3105911807,IL +3105911808,3105912831,DE +3105912832,3105913855,RU +3105913856,3105914879,CH +3105914880,3105915903,IR +3105915904,3105916927,RU +3105916928,3105917951,ES +3105917952,3105918975,NL +3105918976,3105919999,PL +3105921024,3105922047,IE +3105922048,3105923071,PL +3105923072,3105924095,CZ +3105924096,3105925119,RU +3105925120,3105926143,BE +3105926144,3105927167,BA +3105927168,3105928191,IL +3105928192,3105928447,NL +3105928448,3105929215,CZ +3105929216,3105930239,RU +3105930240,3105931263,PT +3105931264,3105932287,US +3105932288,3105933311,SE +3105933312,3105933847,GB +3105933848,3105933855,IT +3105933856,3105934215,GB +3105934216,3105934223,IT +3105934224,3105934335,GB +3105934336,3105935359,SE +3105935360,3105936383,FR +3105936384,3105937407,CH +3105937408,3105938431,FR +3105938432,3105939455,CH +3105939456,3105940479,BY +3105940480,3105941503,GR +3105941504,3105942527,NL +3105942528,3105943039,LU +3105943040,3105943295,BE +3105943296,3105943551,LU +3105943552,3105944575,NL +3105944576,3105945599,DE +3105945600,3105946623,RU +3105946624,3105947647,IE +3105947648,3105948671,AD +3105948672,3105949695,GB +3105949696,3105950719,AT +3105950720,3105951743,FR +3105951744,3105952767,LU +3105952768,3105953791,CH +3105953792,3105954815,FR +3105954816,3105955839,JO +3105955840,3105956863,AL +3105956864,3105957887,PL +3105957888,3105958911,FR +3105958912,3105959935,IQ +3105959936,3105960959,SI +3105960960,3105961983,HU +3105961984,3105963007,IT +3105963008,3105964031,TR +3105964032,3105965055,ES +3105965056,3105966079,NL +3105966080,3105967103,FI +3105967104,3105968127,GB +3105968128,3105969151,HU +3105969152,3105970175,NL +3105970176,3105971199,FR +3105971200,3105972223,GB +3105972224,3105973247,DK +3105973248,3105974048,US +3105974049,3105974271,NL +3105974272,3105975295,MD +3105976320,3105977343,LB +3105977344,3105978367,NL +3105978368,3105979391,RU +3105979392,3105980415,KW +3105980416,3105981439,TR +3105981440,3105982463,ES +3105982464,3105983487,CZ +3105983488,3105984511,UA +3105984512,3105985279,CZ +3105985280,3105985535,HU +3105985536,3105986559,GB +3105986560,3105987583,NL +3105987584,3105988607,CZ +3105988608,3105989631,RU +3105989632,3105990655,NL +3105990656,3105990911,PS +3105990912,3105991679,US +3105992704,3105993727,BH +3105993728,3105994751,DE +3105994752,3105995775,GB +3105995776,3105996799,DE +3105996800,3105997823,GB +3105997824,3105999871,RU +3105999872,3106000895,DE +3106000896,3106001919,GB +3106001920,3106002943,FR +3106002944,3106003967,DE +3106004992,3106006015,CH +3106006016,3106007039,RU +3106007040,3106008063,CY +3106008064,3106009087,RU +3106009088,3106010111,GB +3106010112,3106011135,RU +3106011136,3106012159,CH +3106012160,3106013183,AT +3106013184,3106014207,DE +3106014208,3106015231,NO +3106015232,3106016255,GB +3106016256,3106017279,DK +3106017280,3106018303,IQ +3106018304,3106019327,RU +3106019328,3106019839,LV +3106019840,3106020351,NL +3106020352,3106021375,PL +3106021376,3106022399,FR +3106022400,3106023423,IT +3106023424,3106023679,NL +3106023680,3106023807,DE +3106023808,3106023935,AE +3106023936,3106024063,US +3106024064,3106024191,DE +3106024192,3106024319,US +3106024320,3106024447,DE +3106024448,3106025471,GB +3106025472,3106026495,PL +3106026496,3106027519,LT +3106027520,3106027535,PL +3106027536,3106027551,FR +3106027552,3106027567,CH +3106027568,3106027583,DE +3106027584,3106027599,CZ +3106027600,3106027615,IT +3106027616,3106027631,NL +3106027632,3106029567,GB +3106030592,3106031615,NL +3106031616,3106032639,AZ +3106032640,3106033663,PL +3106033664,3106034687,GB +3106034688,3106035711,IT +3106035712,3106036735,DE +3106036736,3106037759,RS +3106037760,3106038783,GB +3106038784,3106039807,AZ +3106039808,3106041855,IE +3106041856,3106042879,DE +3106042880,3106043903,GB +3106043904,3106044927,IE +3106044928,3106045951,GB +3106045952,3106046975,TR +3106046976,3106047999,DK +3106048000,3106048255,NL +3106048256,3106049023,IT +3106049024,3106050047,FR +3106050048,3106051071,NL +3106051072,3106052095,LI +3106052096,3106053119,RU +3106053120,3106054143,NL +3106054144,3106055167,IR +3106055168,3106056191,GB +3106056192,3106057215,NL +3106057216,3106058239,GB +3106058240,3106059263,NL +3106059264,3106060287,RU +3106060288,3106061311,DE +3106061312,3106062335,NL +3106062336,3106063359,ES +3106063360,3106064383,DE +3106064384,3106065407,NL +3106065408,3106066431,IT +3106066432,3106067455,GB +3106067456,3106068479,DE +3106068480,3106070527,NL +3106070528,3106071551,UA +3106071552,3106072575,BH +3106072576,3106073599,GB +3106073600,3106074623,PL +3106074624,3106076671,RU +3106076672,3106078463,GB +3106078464,3106078719,JP +3106078720,3106080767,RU +3106080768,3106081791,UA +3106081792,3106082815,DE +3106082816,3106083839,KZ +3106083840,3106084863,TR +3106084864,3106085887,GB +3106085888,3106086911,CH +3106086912,3106087935,NL +3106087936,3106091007,RU +3106091008,3106092031,GB +3106092032,3106093055,BE +3106093056,3106094079,GB +3106094080,3106095103,CH +3106095104,3106096127,FR +3106096128,3106097151,LV +3106097152,3106098175,GB +3106098176,3106098431,NL +3106098432,3106098687,GB +3106098688,3106098943,US +3106098944,3106099199,GB +3106099200,3106100223,NO +3106100224,3106101247,SE +3106101248,3106102271,GB +3106102272,3106103295,ES +3106103296,3106104319,NL +3106104320,3106105343,UA +3106105344,3106106367,AE +3106106368,3106106623,US +3106106624,3106107391,DE +3106107392,3106108415,NL +3106108416,3106110463,RU +3106110464,3106111487,GB +3106111488,3106112511,RU +3106112512,3106113535,US +3106113536,3106114559,NL +3106114560,3106115583,ES +3106115584,3106116607,DE +3106116608,3106117631,GB +3106117632,3106118655,AT +3106118656,3106119679,BA +3106119680,3106120703,RU +3106120704,3106121727,BE +3106121728,3106122751,RU +3106122752,3106123775,BE +3106123776,3106124799,BG +3106124800,3106125823,AT +3106125824,3106126847,NO +3106126848,3106127871,ES +3106127872,3106128895,RU +3106128896,3106129919,PL +3106129920,3106130175,SE +3106130176,3106130943,NO +3106130944,3106131967,FR +3106131968,3106132991,DE +3106132992,3106134015,NO +3106134016,3106135039,DE +3106135040,3106136063,RU +3106137088,3106138111,GB +3106138112,3106139135,DE +3106139136,3106140159,SE +3106140160,3106141183,DE +3106141184,3106142207,IS +3106142208,3106143231,GB +3106143232,3106144255,CH +3106144256,3106145279,ES +3106145280,3106146303,BE +3106146304,3106147327,GB +3106147328,3106148351,FR +3106148352,3106149375,AT +3106149632,3106149887,DE +3106149888,3106150143,GB +3106150400,3106151423,GB +3106151424,3106152447,NO +3106152448,3106153471,GB +3106153472,3106154495,AM +3106154496,3106155519,NL +3106155520,3106156543,DE +3106156544,3106157567,NO +3106157568,3106158591,IT +3106158592,3106159615,UA +3106159616,3106160639,RU +3106160640,3106161663,IT +3106161664,3106162687,BA +3106162688,3106163711,IT +3106163712,3106164991,GB +3106164992,3106165247,LT +3106165248,3106165759,GB +3106165760,3106166783,BA +3106166784,3106167807,BH +3106167808,3106168831,RO +3106168832,3106169855,FI +3106169856,3106170879,NL +3106170880,3106171903,RU +3106171904,3106172927,GB +3106172928,3106173951,NL +3106173952,3106175999,DE +3106176000,3106177023,NO +3106177024,3106178047,IT +3106178048,3106179071,NL +3106179072,3106180095,DE +3106180096,3106181119,NO +3106181120,3106182143,ES +3106182144,3106183167,AX +3106183168,3106184191,PL +3106184192,3106185215,RU +3106185216,3106186239,CZ +3106186240,3106187263,BE +3106187264,3106188287,PL +3106188288,3106189311,RU +3106189312,3106190335,KW +3106190336,3106191359,LU +3106191360,3106192383,DK +3106192384,3106193407,NL +3106193408,3106194431,IR +3106194432,3106195455,UA +3106195456,3106196479,AZ +3106196480,3106198527,ES +3106198528,3106199551,NO +3106199552,3106200575,FR +3106200576,3106202623,CH +3106202624,3106203647,RU +3106203648,3106204671,GR +3106204672,3106205695,MT +3106205696,3106205951,SE +3106205952,3106206719,NO +3106206720,3106207743,GE +3106207744,3106208767,GB +3106208768,3106209791,RO +3106209792,3106210815,CH +3106210816,3106211839,NL +3106211840,3106212863,BE +3106212864,3106213887,PS +3106213888,3106214911,DE +3106214912,3106215935,NL +3106215936,3106216959,RS +3106216960,3106217983,FR +3106219008,3106220031,US +3106220032,3106221055,FR +3106221056,3106222079,IT +3106222080,3106223103,RU +3106223104,3106224127,IR +3106224128,3106226175,RU +3106226176,3106228223,NL +3106228224,3106229247,CH +3106229248,3106230271,GG +3106230272,3106231295,IT +3106231296,3106232319,DK +3106232320,3106233343,IQ +3106233344,3106234367,IT +3106234368,3106235391,QA +3106235392,3106235647,BA +3106235648,3106235903,RU +3106235904,3106236159,RO +3106236160,3106236415,TR +3106236416,3106237439,AT +3106237440,3106238463,QA +3106238464,3106239487,PL +3106239488,3106240511,IT +3106240512,3106241535,IE +3106241536,3106242559,NL +3106242560,3106243583,RU +3106243584,3106244607,FI +3106244608,3106245631,DE +3106245632,3106245887,DK +3106245888,3106246655,SE +3106246656,3106247679,DE +3106247680,3106248703,IL +3106248704,3106249727,DE +3106249728,3106250751,FR +3106250752,3106251775,IQ +3106251776,3106252799,RU +3106252800,3106253823,RS +3106253824,3106255871,GB +3106255872,3106256895,IT +3106256896,3106257919,TR +3106257920,3106258943,RU +3106258944,3106259967,UA +3106259968,3106260991,GB +3106260992,3106261247,DE +3106261248,3106262015,AT +3106262016,3106263039,IT +3106263040,3106264063,PT +3106264064,3106265087,ES +3106265088,3106266111,GB +3106266112,3106266367,FR +3106266368,3106266399,HK +3106266400,3106266431,SG +3106266432,3106266463,JP +3106266464,3106266527,US +3106266528,3106266543,FR +3106266544,3106266559,HK +3106266560,3106266591,FR +3106266592,3106266607,US +3106266608,3106266623,FR +3106266624,3106266879,US +3106266880,3106266927,FR +3106266928,3106266943,AU +3106266944,3106266975,FR +3106266976,3106267007,US +3106267008,3106267135,JP +3106267136,3106269183,ES +3106270208,3106271231,GB +3106271232,3106272255,SK +3106272256,3106273279,NL +3106273280,3106274303,DE +3106274304,3106275327,CH +3106275328,3106276351,FI +3106276352,3106277375,AT +3106277376,3106278399,DE +3106278400,3106279423,NL +3106279424,3106280447,RU +3106280448,3106281471,FR +3106281472,3106282495,DK +3106282496,3106283519,LB +3106283520,3106285567,GB +3106285568,3106286591,DE +3106286592,3106287615,GB +3106287616,3106289663,DE +3106289664,3106290687,LV +3106290688,3106291711,IE +3106291712,3106292735,CH +3106292736,3106293759,NO +3106293760,3106294783,UA +3106294784,3106295807,DE +3106295808,3106296831,GB +3106296832,3106297855,RU +3106297856,3106298879,NL +3106298880,3106299903,FR +3106299904,3106300159,GB +3106300160,3106300415,DE +3106300416,3106300927,GB +3106300928,3106301951,NL +3106301952,3106302975,GB +3106302976,3106303999,CZ +3106304000,3106305023,GB +3106305024,3106306047,DE +3106306048,3106307071,NO +3106307072,3106308095,HU +3106308096,3106309119,ES +3106309120,3106310143,GB +3106310144,3106311167,IT +3106311168,3106312191,PT +3106312192,3106313215,BA +3106313216,3106314239,GB +3106314240,3106316287,NL +3106316288,3106317311,RU +3106317312,3106318335,LT +3106318336,3106319359,AT +3106319360,3106320383,DK +3106320384,3106321407,HR +3106321408,3106321919,SE +3106321920,3106322431,DK +3106322432,3106323455,ME +3106323456,3106324479,CZ +3106324480,3106325503,AL +3106325504,3106326527,FR +3106326528,3106326783,NL +3106326784,3106327039,US +3106327040,3106327295,GB +3106327296,3106327551,NL +3106327552,3106328575,RU +3106328576,3106329087,UA +3106329088,3106329599,US +3106329600,3106330623,IQ +3106330624,3106331647,UA +3106331648,3106333695,PL +3106333696,3106334719,GB +3106334720,3106335743,NL +3106335744,3106336767,NO +3106336768,3106337791,DE +3106337792,3106338815,GB +3106338816,3106339839,PL +3106339840,3106340863,IT +3106340864,3106341887,BA +3106341888,3106342911,RU +3106342912,3106343935,CH +3106343936,3106344959,DE +3106344960,3106345983,RU +3106345984,3106347007,DE +3106347008,3106348031,IT +3106348032,3106349055,UA +3106349056,3106350079,CH +3106350080,3106351103,SA +3106351104,3106352127,ES +3106352128,3106353151,NL +3106353152,3106354175,DE +3106354176,3106354316,NL +3106354317,3106354317,BE +3106354318,3106354431,NL +3106354432,3106354439,GB +3106354440,3106354447,AT +3106354448,3106354511,NL +3106354512,3106354519,GB +3106354520,3106354527,AT +3106354528,3106354943,NL +3106354944,3106354951,GB +3106354952,3106354959,AT +3106354960,3106355023,NL +3106355024,3106355031,GB +3106355032,3106355039,AT +3106355040,3106355051,NL +3106355052,3106355103,GB +3106355104,3106355199,NL +3106355200,3106356223,DE +3106356224,3106357247,ES +3106357248,3106358271,DE +3106358272,3106359295,ES +3106359296,3106360319,UA +3106360320,3106361343,IQ +3106361344,3106362367,RU +3106362368,3106364415,DE +3106364416,3106365439,CH +3106365440,3106366463,ES +3106366464,3106367487,IT +3106367488,3106369535,DE +3106369536,3106371583,RU +3106371584,3106372607,NL +3106372608,3106373631,SE +3106373632,3106374655,FI +3106374656,3106375679,RU +3106375680,3106376703,ES +3106376704,3106377727,FR +3106377728,3106378751,SE +3106378752,3106379775,RU +3106379776,3106380799,BE +3106380800,3106381823,FR +3106381824,3106382847,PL +3106382848,3106383871,IE +3106383872,3106384895,FR +3106384896,3106385919,AT +3106385920,3106386943,DE +3106386944,3106387967,IR +3106387968,3106388991,FI +3106388992,3106390015,IT +3106390016,3106391039,RU +3106391040,3106392063,UA +3106392064,3106393087,NO +3106393088,3106394111,RU +3106394112,3106395135,PT +3106395136,3106396159,NO +3106396160,3106397183,FR +3106397184,3106398207,DE +3106398208,3106399231,UA +3106399232,3106400255,CH +3106400256,3106402303,GB +3106402304,3106403327,IT +3106403328,3106405375,GB +3106405376,3106406399,DE +3106406400,3106408447,RU +3106408448,3106409471,GB +3106409472,3106411519,IT +3106411520,3106412543,HU +3106412544,3106413567,GB +3106413568,3106414591,RU +3106414592,3106415615,AZ +3106415616,3106416639,ES +3106416640,3106417663,RU +3106417664,3106418687,DK +3106418688,3106419711,UA +3106419712,3106420735,AT +3106420736,3106421759,NL +3106421760,3106422783,LU +3106422784,3106423807,IE +3106423808,3106424831,BE +3106424832,3106425855,TR +3106425856,3106426879,RU +3106426880,3106427903,CZ +3106427904,3106428927,TR +3106428928,3106429951,FI +3106429952,3106431999,NL +3106432000,3106433023,FR +3106434048,3106435071,NL +3106435072,3106436095,PL +3106436096,3106437119,DE +3106437120,3106438143,IS +3106438144,3106439167,GB +3106439168,3106440191,RU +3106440192,3106440706,DE +3106440707,3106440707,CH +3106440708,3106441215,DE +3106441216,3106442239,HU +3106442240,3106442495,GG +3106442496,3106443263,GB +3106443264,3106445311,ES +3106445312,3106446335,RU +3106446336,3106447359,AZ +3106447360,3106448383,DE +3106448384,3106449407,BG +3106449408,3106450431,AT +3106450432,3106451455,DE +3106451456,3106452479,AZ +3106452480,3106453503,NL +3106453504,3106454527,SE +3106454528,3106455551,ME +3106455552,3106456575,PS +3106456576,3106457599,PL +3106457600,3106458623,FI +3106458624,3106459647,GB +3106459648,3106460671,LB +3106460672,3106461695,IT +3106461696,3106462719,CH +3106462720,3106463743,IT +3106463744,3106464767,IR +3106464768,3106465791,PL +3106466816,3106467839,EE +3106467840,3106468863,IR +3106468864,3106470911,DE +3106470912,3106471935,NL +3106471936,3106472959,IR +3106472960,3106473983,FR +3106473984,3106475007,GB +3106475008,3106476031,DE +3106476032,3106477055,NO +3106477056,3106478079,UA +3106478080,3106479103,GB +3106479104,3106480127,FR +3106480128,3106481151,IT +3106481152,3106482175,NL +3106482176,3106483199,RU +3106483200,3106483423,GB +3106483424,3106483424,ES +3106483425,3106483425,NL +3106483426,3106483426,FR +3106483427,3106483429,GB +3106483430,3106483430,IE +3106483431,3106483761,GB +3106483762,3106483762,DE +3106483763,3106483763,CZ +3106483764,3106483765,GB +3106483766,3106483766,IT +3106483767,3106483767,DE +3106483768,3106483768,CZ +3106483769,3106483769,BE +3106483770,3106483770,PL +3106483771,3106483771,FR +3106483772,3106483772,IE +3106483773,3106483773,IT +3106483774,3106483774,PL +3106483775,3106483775,IE +3106483776,3106483815,GB +3106483816,3106483816,FR +3106483817,3106483826,GB +3106483827,3106483827,FR +3106483828,3106484223,GB +3106484224,3106485247,NL +3106485248,3106486271,CZ +3106486272,3106488319,DE +3106488320,3106489343,NO +3106489344,3106490367,PL +3106490368,3106491391,IT +3106491392,3106492415,CH +3106492416,3106493439,PL +3106493440,3106494463,SY +3106494464,3106495487,IT +3106495488,3106496511,PL +3106496512,3106497535,ES +3106497536,3106498559,RU +3106498560,3106500607,DE +3106500608,3106501631,RU +3106501632,3106502655,PT +3106502656,3106503679,RU +3106503680,3106504703,NL +3106504704,3106505727,PL +3106505728,3106506751,CH +3106506752,3106507775,NL +3106507776,3106508287,CZ +3106508288,3106509823,NL +3106509824,3106510847,SE +3106510848,3106511871,FR +3106511872,3106512895,GE +3106512896,3106513919,RU +3106513920,3106514943,IT +3106514944,3106515967,RU +3106515968,3106516991,SE +3106516992,3106518015,SI +3106518016,3106519039,FR +3106519040,3106520063,RU +3106520064,3106521087,GB +3106521088,3106522111,UA +3106522112,3106523135,RU +3106523136,3106524159,AZ +3106524160,3106525183,RU +3106525184,3106526207,CY +3106526208,3106527231,IT +3106527232,3106528255,KW +3106528256,3106532351,GB +3106532352,3106533375,BE +3106533376,3106533887,SE +3106533888,3106534143,GB +3106534144,3106534399,NO +3106534400,3106535423,ES +3106535424,3106536447,UA +3106536448,3106537471,IT +3106537472,3106538495,GB +3106538496,3106539519,SK +3106539520,3106540543,NL +3106540544,3106541567,RU +3106541568,3106542591,GB +3106542592,3106543615,ES +3106543616,3106544639,IR +3106544640,3106545663,FR +3106545664,3106546687,CY +3106546688,3106547711,MK +3106547712,3106548735,UA +3106548736,3106549759,PL +3106549760,3106550783,RU +3106550784,3106551807,GB +3106551808,3106552831,NL +3106552832,3106553855,RU +3106553856,3106554879,GB +3106554880,3106556927,NL +3106556928,3106558975,RU +3106558976,3106559999,NL +3106560000,3106562047,RU +3106562048,3106563071,TJ +3106564096,3106565119,ES +3106565120,3106566143,RU +3106566144,3106568191,FR +3106568192,3106569215,ES +3106569216,3106570239,RU +3106570240,3106571263,UA +3106571264,3106572287,FR +3106572288,3106573311,SE +3106573312,3106575359,RU +3106575360,3106577407,GB +3106577408,3106578431,RU +3106578432,3106579455,IT +3106579456,3106580479,RU +3106580480,3106581503,NO +3106581504,3106582527,TR +3106582528,3106583551,FR +3106583552,3106584575,RU +3106584576,3106585599,PL +3106585600,3106586623,FR +3106586624,3106587647,IQ +3106587648,3106589695,NL +3106590720,3106591743,GR +3106591744,3106592767,IR +3106592768,3106593791,LU +3106593792,3106594815,GB +3106594816,3106595839,IR +3106595840,3106596095,EE +3106596096,3106596863,RU +3106596864,3106597887,FR +3106597888,3106598911,GB +3106598912,3106599935,ES +3106599936,3106601983,CH +3106601984,3106603007,DE +3106603008,3106604031,BE +3106604032,3106606079,RU +3106606080,3106607103,AT +3106607104,3106608127,IT +3106608128,3106609151,NL +3106609152,3106611199,DE +3106611200,3106612223,GB +3106612224,3106613247,FR +3106613248,3106614271,GB +3106614272,3106615295,FR +3106615296,3106616319,GB +3106616320,3106617343,DE +3106617344,3106618367,BG +3106618368,3106619391,FR +3106619392,3106620415,NL +3106620416,3106621439,FR +3106621440,3106622463,ES +3106622464,3106623487,GB +3106623488,3106624511,NL +3106624512,3106625535,RU +3106625536,3106626559,FI +3106626560,3106627583,RU +3106627584,3106628607,GB +3106628608,3106629631,RU +3106629632,3106630655,EE +3106630656,3106630911,US +3106630912,3106631423,GB +3106631424,3106631679,US +3106631680,3106632703,SK +3106632704,3106633727,DE +3106633728,3106634751,FI +3106634752,3106635775,BE +3106635776,3106636799,GB +3106636800,3106637823,CZ +3106637824,3106638847,PL +3106638848,3106639871,DK +3106639872,3106640895,GB +3106640896,3106641919,IT +3106641920,3106642943,BE +3106642944,3106643967,GB +3106643968,3106644991,PL +3106644992,3106646015,IT +3106646016,3106647039,DE +3106647040,3106648063,HU +3106648064,3106649087,DE +3106649088,3106649855,ES +3106649856,3106649863,FR +3106649864,3106649983,ES +3106649984,3106649999,GB +3106650000,3106650015,ES +3106650016,3106650031,DE +3106650032,3106650111,ES +3106650112,3106651135,GB +3106651136,3106652159,AZ +3106652160,3106653183,IE +3106653184,3106654207,RU +3106654208,3106655231,CH +3106655232,3106656255,HU +3106656256,3106657279,GB +3106657280,3106658303,NL +3106658304,3106659327,GB +3106659328,3106660351,NL +3106660352,3106661375,UA +3106661376,3106662399,TR +3106662400,3106663423,IE +3106663424,3106664447,UA +3106664448,3106665471,FR +3106665472,3106666495,CH +3106666496,3106667519,UA +3106667520,3106668543,ES +3106668544,3106669567,RU +3106669568,3106670591,DE +3106670592,3106672639,RU +3106672640,3106673663,ES +3106673664,3106674687,CH +3106674688,3106676735,ES +3106676736,3106677759,DE +3106677760,3106678783,IR +3106678784,3106680831,FR +3106680832,3106682879,AT +3106682880,3106683903,LU +3106683904,3106684927,ES +3106684928,3106685951,GB +3106685952,3106686975,RU +3106686976,3106687999,LT +3106688000,3106688255,GB +3106688256,3106688511,FR +3106688512,3106689023,GB +3106689024,3106690047,CH +3106690048,3106691071,UA +3106691072,3106692095,FR +3106692096,3106693119,NL +3106693120,3106694143,NO +3106694144,3106695167,IR +3106695168,3106697215,DE +3106697216,3106698239,IR +3106698240,3106698303,BG +3106698304,3106698367,GE +3106698368,3106698495,BG +3106698496,3106698751,GE +3106698752,3106699263,BG +3106699264,3106700287,RU +3106700288,3106701311,BG +3106701312,3106702335,NL +3106702336,3106703359,DE +3106703360,3106704383,NL +3106704384,3106705407,FR +3106705408,3106706431,GR +3106706432,3106707455,DE +3106707456,3106708479,LB +3106708480,3106709503,LI +3106709504,3106710527,NL +3106710528,3106711551,RU +3106711552,3106712575,NL +3106712576,3106713599,PL +3106713600,3106714623,DE +3106714624,3106715647,IT +3106715648,3106716671,SE +3106716672,3106717695,CZ +3106717696,3106718719,TR +3106718720,3106719743,CH +3106719744,3106720245,DE +3106720246,3106720246,US +3106720247,3106720767,DE +3106720768,3106722815,AT +3106722816,3106723839,IT +3106723840,3106724863,PL +3106724864,3106725887,IT +3106725888,3106726911,NL +3106726912,3106727935,AM +3106727936,3106728959,ES +3106728960,3106729983,RU +3106729984,3106731007,IS +3106731008,3106732031,NL +3106732032,3106735167,GB +3106735168,3106735199,IE +3106735200,3106735263,DE +3106735264,3106735295,FR +3106735296,3106735327,IE +3106735328,3106736127,GB +3106736128,3106737151,IE +3106737152,3106738175,RO +3106738176,3106739199,DE +3106739200,3106740223,DK +3106740224,3106741247,GB +3106741248,3106742271,ES +3106742272,3106743295,FR +3106743296,3106744319,NO +3106744320,3106745343,SM +3106745344,3106746367,NL +3106746368,3106747391,DK +3106747392,3106748415,BE +3106748416,3106749439,CZ +3106749440,3106750463,RU +3106750464,3106751487,BG +3106751488,3106751805,IT +3106751806,3106751806,SM +3106751807,3106751999,IT +3106752000,3106752255,SM +3106752256,3106752511,IT +3106752512,3106753535,ES +3106753536,3106754559,IS +3106754560,3106755583,RU +3106755584,3106756607,SE +3106756608,3106757631,DE +3106757632,3106758655,RU +3106758656,3106759679,GB +3106759680,3106760703,RU +3106760704,3106761727,IE +3106761728,3106762751,DE +3106762752,3106763007,NL +3106763008,3106763775,DE +3106763776,3106764799,NL +3106764800,3106765823,SE +3106765824,3106766847,CZ +3106766848,3106767871,SE +3106767872,3106768895,DE +3106768896,3106769919,CZ +3106769920,3106770943,EE +3106770944,3106771967,RU +3106771968,3106772991,DK +3106772992,3106774015,BG +3106774016,3106775039,AE +3106775040,3106776063,GB +3106776064,3106777087,ES +3106777088,3106778111,GB +3106778112,3106779135,FR +3106779136,3106780159,NO +3106780160,3106781183,FR +3106781184,3106782207,DK +3106782208,3106783231,IR +3106783232,3106784255,NL +3106784256,3106785279,HU +3106785280,3106786303,CZ +3106786304,3106787327,DE +3106787328,3106788351,GB +3106788352,3106789375,AT +3106789376,3106790399,PL +3106790400,3106792447,GB +3106792448,3106793471,FR +3106793472,3106794495,AT +3106794496,3106795519,CH +3106795520,3106796543,DE +3106796544,3106797567,UA +3106797568,3106798591,DE +3106798592,3106799615,FR +3106799616,3106800639,IR +3106801664,3106804735,RU +3106804736,3106805759,EE +3106805760,3106806783,IT +3106806784,3106807807,NL +3106807808,3106808831,HR +3106808832,3106809855,DK +3106809856,3106810879,TR +3106810880,3106812927,RU +3106812928,3106813951,TR +3106813952,3106814975,CH +3106814976,3106815999,MD +3106816000,3106817023,NL +3106817024,3106818047,IT +3106818048,3106819071,IE +3106819072,3106820095,IL +3106820096,3106821247,CH +3106821248,3106821375,PL +3106821376,3106821631,US +3106821632,3106821759,HK +3106821760,3106821887,CN +3106821888,3106822015,RU +3106822016,3106822143,JP +3106822144,3106823167,CH +3106823168,3106824191,PL +3106824192,3106825215,RU +3106825216,3106826239,IT +3106826240,3106827263,PL +3106827264,3106828287,IR +3106828288,3106829311,GB +3106829312,3106830335,NL +3106830336,3106831359,US +3106831360,3106832383,ES +3106832384,3106833407,DE +3106833408,3106834431,NO +3106834432,3106835455,DE +3106835456,3106836479,IT +3106836480,3106837503,KW +3106837504,3106838527,UA +3106838528,3106838783,KZ +3106838784,3106839551,RU +3106839552,3106840575,NL +3106840576,3106841599,BG +3106841600,3106842623,FR +3106842624,3106843647,PL +3106843648,3106844671,GB +3106844672,3106845695,GE +3106845696,3106846719,NL +3106846720,3106847743,RU +3106847744,3106848767,UA +3106848768,3106849791,NL +3106849792,3106850815,RU +3106850816,3106851839,GB +3106851840,3106852863,PL +3106852864,3106853887,GB +3106853888,3106854399,NL +3106854400,3106854911,CH +3106854912,3106855935,IR +3106855936,3106856959,UA +3106856960,3106857983,NO +3106857984,3106859007,FR +3106859008,3106860031,NL +3106860032,3106861055,UA +3106861056,3106863103,PL +3106863104,3106864127,UA +3106864128,3106865151,IE +3106865152,3106866175,NL +3106866176,3106867199,AZ +3106867200,3106868223,LV +3106868224,3106870271,ES +3106870272,3106871295,NL +3106871296,3106872319,CH +3106872320,3106873343,BE +3106873344,3106874367,ES +3106874368,3106875391,RU +3106875392,3106876415,NO +3106876416,3106876671,US +3106876672,3106876735,BG +3106876736,3106876799,MD +3106876800,3106876927,CZ +3106876928,3106877439,US +3106877440,3106878463,IR +3106878464,3106879487,RU +3106879488,3106880511,MK +3106880512,3106881535,NL +3106881536,3106882559,PL +3106882560,3106883583,BE +3106883584,3106884607,IE +3106884608,3106885631,FI +3106885632,3106886655,FR +3106886656,3106887679,US +3106887680,3106888703,RS +3106888704,3106889727,LV +3106889728,3106890751,IT +3106890752,3106891775,NL +3106891776,3106892799,GB +3106892800,3106893823,IT +3106893824,3106894847,NL +3106894848,3106895871,GB +3106895872,3106896895,NL +3106896896,3106897919,DE +3106897920,3106898943,ES +3106898944,3106899967,NL +3106899968,3106900991,IT +3106900992,3106902015,DE +3106902016,3106903039,IE +3106903040,3106904063,BE +3106904064,3106904575,BY +3106904576,3106905087,RU +3106905088,3106906111,LU +3106906112,3106907135,HU +3106907136,3106908159,SE +3106908160,3106909183,NL +3106909184,3106910207,IL +3106910208,3106911231,CZ +3106911232,3106912255,IQ +3106912256,3106913279,HU +3106913280,3106914303,AL +3106914304,3106915327,SE +3106915328,3106917375,NL +3106917376,3106918399,RU +3106918400,3106919423,RS +3106919424,3106920447,ES +3106920448,3106921471,GB +3106921472,3106922495,CZ +3106922496,3106923519,NL +3106923520,3106924543,IT +3106924544,3106925567,DE +3106925568,3106926591,NL +3106926592,3106927615,FR +3106927616,3106928639,ES +3106928640,3106929663,NO +3106929664,3106930687,FR +3106930688,3106931711,DE +3106931712,3106932735,AT +3106932736,3106933759,PL +3106933760,3106934783,BE +3106934784,3106935807,RU +3106935808,3106936831,CZ +3106936832,3106937855,TR +3106937856,3106938879,PL +3106938880,3106939903,IT +3106939904,3106940927,RU +3106940928,3106941951,HU +3106941952,3106943999,FR +3106944000,3106945023,IT +3106945024,3106946047,NL +3106946048,3106946559,JE +3106946560,3106946815,GB +3106946816,3106946943,JE +3106946944,3106947071,GB +3106947072,3106948095,AE +3106948096,3106949119,NL +3106949120,3106950143,RU +3106950144,3106951167,IM +3106951168,3106952191,SE +3106952192,3106954239,ES +3106954240,3106955263,DE +3106956288,3106957311,NL +3106957312,3106958335,DE +3106958336,3106959359,GB +3106959360,3106960383,RU +3106960384,3106961407,DE +3106961408,3106962431,IE +3106962432,3106963455,KZ +3106963456,3106964479,PL +3106964480,3106965503,FR +3106965504,3106966527,KG +3106966528,3106967551,IT +3106967552,3106968575,CH +3106968576,3106969599,KZ +3106969600,3106969631,DK +3106969632,3106970623,NO +3106970624,3106970879,DE +3106970880,3106971135,SG +3106971136,3106971647,DE +3106971648,3106973695,GB +3106973696,3106974719,PL +3106974720,3106975743,BA +3106975744,3106976767,PL +3106976768,3106977791,TR +3106977792,3106978815,RU +3106978816,3106979839,KW +3106979840,3106980863,ES +3106980864,3106981887,UA +3106981888,3106982911,FR +3106982912,3106984959,DE +3106984960,3106985983,TR +3106985984,3106989055,DE +3106989056,3106990079,CH +3106990080,3106991103,PL +3106991104,3106992127,RU +3106992128,3106993151,AM +3106993152,3106994175,DE +3106994176,3106995199,SK +3106995200,3106996223,FR +3106996224,3106997247,SI +3106997248,3106998271,NO +3106998272,3106999295,IT +3106999296,3107000319,PL +3107000320,3107001343,DE +3107001344,3107002367,FR +3107002368,3107003391,AL +3107003392,3107004415,PL +3107004416,3107007487,GB +3107007488,3107008511,TR +3107008512,3107009535,NL +3107009536,3107010559,AT +3107010560,3107011583,IT +3107011584,3107012607,IE +3107012608,3107013631,RU +3107013632,3107014655,DE +3107014656,3107015679,GB +3107015680,3107016703,DE +3107016704,3107017087,GB +3107017088,3107017107,NL +3107017108,3107017108,GB +3107017109,3107017127,NL +3107017128,3107017128,GB +3107017129,3107017151,NL +3107017152,3107017215,GB +3107017216,3107017727,NL +3107017728,3107018751,IR +3107018752,3107019775,BG +3107019776,3107020799,GB +3107020800,3107021823,IR +3107021824,3107022847,IL +3107022848,3107023871,IR +3107023872,3107024895,RU +3107024896,3107025919,GB +3107025920,3107026943,SI +3107026944,3107027967,NL +3107027968,3107028991,GB +3107028992,3107030015,TR +3107030016,3107031039,SE +3107031040,3107032063,DE +3107032064,3107034111,NL +3107034112,3107035135,PL +3107035136,3107036159,CH +3107036160,3107037183,ES +3107037184,3107038207,BH +3107038208,3107039231,GE +3107039232,3107040255,ES +3107040256,3107041279,GB +3107041280,3107042303,AT +3107042304,3107043327,BE +3107043328,3107044351,ES +3107044352,3107045375,CZ +3107045376,3107046399,ES +3107046400,3107047423,NO +3107047424,3107048447,PL +3107048448,3107049471,IT +3107049472,3107050495,FR +3107050496,3107051519,IT +3107051520,3107052543,GB +3107052544,3107053567,CH +3107053568,3107054591,ES +3107054592,3107057663,GB +3107057664,3107058687,RU +3107058688,3107059711,LU +3107059712,3107060735,IT +3107060736,3107061759,DK +3107061760,3107062783,ES +3107062784,3107063807,MD +3107063808,3107064831,RU +3107064832,3107065855,HR +3107065856,3107067903,GB +3107067904,3107068927,RU +3107068928,3107069951,HU +3107069952,3107070975,FR +3107070976,3107071231,SE +3107071232,3107071999,IR +3107072000,3107073023,SE +3107073024,3107074047,ES +3107074048,3107075071,PL +3107075072,3107076095,FR +3107076096,3107077119,BA +3107077120,3107078143,NL +3107078144,3107079167,FR +3107079168,3107080191,TR +3107080192,3107082239,FR +3107082240,3107083263,RU +3107083264,3107084287,LU +3107084288,3107085311,FI +3107085312,3107086335,NL +3107086336,3107087359,EE +3107087360,3107088383,IE +3107088384,3107089407,BR +3107089408,3107090431,IT +3107090432,3107091455,FR +3107091456,3107092479,ES +3107092480,3107093503,DE +3107093504,3107094527,CZ +3107094528,3107095551,FR +3107095552,3107096575,CY +3107096576,3107097599,RU +3107097600,3107098623,DE +3107098624,3107099647,ES +3107099648,3107099903,UA +3107099904,3107100159,CZ +3107100160,3107100415,RU +3107100416,3107100671,SK +3107100672,3107101695,GB +3107101696,3107102719,RU +3107102720,3107103743,GB +3107103744,3107104767,PL +3107104768,3107105791,ES +3107105792,3107106815,NL +3107106816,3107107839,ES +3107107840,3107108863,AL +3107108864,3107109887,RS +3107109888,3107110911,CH +3107110912,3107111935,DE +3107111936,3107112959,ES +3107112960,3107113983,RU +3107113984,3107115007,ES +3107115008,3107116031,NL +3107116032,3107117055,SK +3107117056,3107118079,RU +3107118080,3107120127,CH +3107120128,3107121151,CZ +3107121152,3107122175,AT +3107122176,3107123199,CH +3107123200,3107124223,GB +3107124224,3107125247,FI +3107125248,3107125503,RO +3107125504,3107126271,UA +3107126272,3107127295,FR +3107127296,3107128319,SE +3107128320,3107129343,US +3107129344,3107130111,AT +3107130112,3107130367,CH +3107130368,3107131391,IT +3107131392,3107132415,GE +3107132416,3107133439,RU +3107133440,3107134463,CY +3107134464,3107135487,CZ +3107135488,3107136511,DE +3107136512,3107137535,TR +3107137536,3107138559,IR +3107138560,3107139583,ES +3107139584,3107140607,MX +3107140608,3107142655,NL +3107142656,3107143679,RU +3107143680,3107144703,HU +3107144704,3107145727,CH +3107145728,3107146751,IE +3107146752,3107147775,DK +3107147776,3107148799,GB +3107148800,3107149823,DE +3107149824,3107150847,PL +3107150848,3107151871,PT +3107151872,3107152895,PL +3107152896,3107153919,GE +3107153920,3107154943,IE +3107154944,3107155967,ES +3107155968,3107156991,TR +3107156992,3107158015,PL +3107158016,3107159039,IT +3107159040,3107160063,RU +3107160064,3107161087,AT +3107161088,3107162111,GR +3107162112,3107163135,IT +3107163136,3107164159,RU +3107164160,3107164213,FR +3107164214,3107164214,SE +3107164215,3107164777,FR +3107164778,3107164778,SE +3107164779,3107165183,FR +3107165184,3107166207,NL +3107166208,3107167231,AE +3107167232,3107168255,RU +3107168256,3107169279,ES +3107169280,3107170303,TR +3107170304,3107171327,IT +3107171328,3107172351,GB +3107172352,3107173375,FR +3107173376,3107174399,PL +3107174400,3107175423,DE +3107175424,3107176447,HU +3107176448,3107176703,NL +3107176704,3107177471,GB +3107177472,3107178495,AT +3107178496,3107179519,IR +3107179520,3107180543,SA +3107180544,3107181567,RU +3107181568,3107182591,JO +3107182592,3107183615,FR +3107183616,3107184639,IQ +3107184640,3107185663,SE +3107185664,3107185919,GB +3107185920,3107186431,US +3107186432,3107186687,GB +3107186688,3107187711,NO +3107187712,3107188735,MT +3107188736,3107189759,CZ +3107189760,3107190271,GB +3107190272,3107190783,UA +3107190784,3107191807,CZ +3107191808,3107192063,AE +3107192064,3107192831,GB +3107192832,3107194879,NL +3107194880,3107195903,IT +3107195904,3107196927,NL +3107196928,3107197951,ES +3107197952,3107198975,AT +3107198976,3107199999,GB +3107200000,3107201023,RU +3107201024,3107202047,FR +3107202048,3107203071,GB +3107203072,3107204095,NO +3107204096,3107205119,FR +3107205120,3107206143,BG +3107206144,3107207167,NL +3107207168,3107208191,RU +3107208192,3107209215,NL +3107209216,3107210239,IT +3107210240,3107213311,RU +3107213312,3107214335,GE +3107214336,3107215359,FR +3107215360,3107216383,CY +3107216384,3107217407,IE +3107217408,3107218431,CZ +3107218432,3107219455,IQ +3107219456,3107220479,NL +3107220480,3107221503,GB +3107221504,3107222527,IT +3107222528,3107223551,IQ +3107223552,3107224575,AT +3107224576,3107225599,FR +3107225600,3107226623,AZ +3107226624,3107227647,RU +3107227648,3107228671,US +3107228672,3107229695,RU +3107229696,3107231743,GB +3107231744,3107232767,RU +3107232768,3107233023,GB +3107233024,3107233791,SE +3107233792,3107234815,DE +3107234816,3107235839,FI +3107235840,3107236863,PL +3107236864,3107237887,CZ +3107237888,3107238911,NL +3107238912,3107239935,SE +3107239936,3107241983,AT +3107241984,3107243007,PL +3107243008,3107244031,GB +3107244032,3107244543,RU +3107244544,3107245055,GB +3107245056,3107246079,BG +3107246080,3107248127,NL +3107248128,3107249151,CZ +3107249152,3107250175,GB +3107250176,3107251199,NL +3107251200,3107252223,TR +3107252224,3107253247,SY +3107253248,3107254271,NL +3107254272,3107255295,IT +3107255296,3107257343,DE +3107257344,3107258367,GB +3107258368,3107259391,IT +3107259392,3107260415,CZ +3107260416,3107261439,NL +3107261440,3107262463,SI +3107262464,3107263487,GB +3107263488,3107264511,RU +3107264512,3107265535,FR +3107265536,3107266559,GB +3107266560,3107267583,IE +3107267584,3107268607,IT +3107268608,3107270655,DE +3107270656,3107271679,NL +3107271680,3107271680,AE +3107271681,3107271935,CY +3107271936,3107272703,AE +3107272704,3107273727,GB +3107273728,3107274751,TR +3107274752,3107275775,SE +3107275776,3107276799,IT +3107276800,3107277823,BY +3107277824,3107278847,UA +3107278848,3107279871,FR +3107279872,3107280895,FI +3107280896,3107281919,NL +3107281920,3107282943,GB +3107282944,3107283967,PL +3107283968,3107284991,AL +3107284992,3107286015,KG +3107286016,3107287039,AT +3107287040,3107288063,RS +3107288064,3107289087,NO +3107289088,3107290111,IT +3107290112,3107291135,PL +3107291136,3107292159,NL +3107292160,3107293183,PL +3107293184,3107294207,FR +3107295232,3107296255,PL +3107296256,3107297279,IT +3107297280,3107298303,PL +3107298304,3107299327,DE +3107299328,3107300351,NL +3107300352,3107301375,SE +3107301376,3107302399,DE +3107302400,3107303423,GB +3107303424,3107304447,DE +3107304448,3107305471,AT +3107305472,3107306495,FR +3107306496,3107307519,NO +3107307520,3107308543,IT +3107308544,3107310591,RO +3107310592,3107311615,DE +3107311616,3107311871,IL +3107311872,3107312127,US +3107312128,3107312383,FR +3107312384,3107312639,NL +3107312640,3107313663,SE +3107313664,3107315711,DE +3107315712,3107316735,GB +3107316736,3107317759,KG +3107317760,3107318783,RU +3107318784,3107318799,IE +3107318800,3107318871,NL +3107318872,3107318879,FR +3107318880,3107319039,NL +3107319040,3107319295,GB +3107319296,3107319807,NL +3107319808,3107320831,OM +3107320832,3107321855,SA +3107321856,3107322879,NL +3107322880,3107323903,IT +3107323904,3107324927,ES +3107324928,3107325951,CH +3107325952,3107326975,FR +3107326976,3107327999,LT +3107328000,3107329023,AE +3107329024,3107330047,RU +3107331072,3107332095,NO +3107332096,3107333119,IT +3107333120,3107334143,FR +3107334144,3107335167,RU +3107335168,3107336191,NL +3107336192,3107337215,RU +3107337216,3107339263,PL +3107339264,3107340287,LB +3107340288,3107341311,GB +3107341312,3107342335,NL +3107342336,3107343359,GB +3107343360,3107344383,DE +3107344384,3107345407,CH +3107345408,3107346431,GB +3107346432,3107347455,TR +3107347456,3107348479,NL +3107348480,3107349503,LB +3107349504,3107350527,PL +3107350528,3107351551,IE +3107351552,3107352575,DE +3107352576,3107353599,NL +3107353600,3107355647,DE +3107355648,3107356671,GB +3107356672,3107357695,SI +3107357696,3107358719,SY +3107358720,3107359743,RU +3107359744,3107360767,NL +3107360768,3107361791,AT +3107361792,3107362815,DE +3107362816,3107363839,IT +3107363840,3107364863,IQ +3107364864,3107365375,CY +3107365376,3107365631,NL +3107365632,3107365887,BE +3107365888,3107366911,IQ +3107366912,3107367935,GB +3107367936,3107368959,CH +3107368960,3107369983,RU +3107369984,3107371007,NL +3107371008,3107372031,PL +3107372032,3107373055,DE +3107373056,3107374079,ES +3107374080,3107375103,SE +3107375104,3107376127,GB +3107376128,3107377151,NL +3107377152,3107378175,AT +3107378176,3107379199,IT +3107379200,3107380223,NL +3107380224,3107380735,RU +3107380736,3107381247,GB +3107381248,3107383295,IE +3107383296,3107384319,DE +3107384320,3107385343,RU +3107385344,3107386367,DE +3107386368,3107387391,RU +3107387392,3107388415,BE +3107388416,3107389439,KG +3107389440,3107390463,RU +3107390464,3107391487,RO +3107391488,3107392511,SE +3107392512,3107393535,HU +3107393536,3107394559,GB +3107394560,3107395583,NL +3107395584,3107396607,AT +3107396608,3107397631,GR +3107397632,3107398655,FI +3107398656,3107399679,AZ +3107399680,3107400703,RU +3107400704,3107401727,AL +3107401728,3107402751,EE +3107402752,3107402819,US +3107402820,3107402821,NL +3107402822,3107402823,GB +3107402824,3107402839,US +3107402840,3107402843,GB +3107402844,3107402845,US +3107402846,3107402849,GB +3107402850,3107402855,JO +3107402856,3107402857,GB +3107402858,3107402859,DE +3107402860,3107402863,US +3107402864,3107402865,DE +3107402866,3107402877,US +3107402878,3107402883,GB +3107402884,3107402885,US +3107402886,3107402887,IQ +3107402888,3107402899,GB +3107402900,3107402903,MY +3107402904,3107402909,FR +3107402910,3107402911,CN +3107402912,3107402915,US +3107402916,3107402921,HK +3107402922,3107402925,NL +3107402926,3107402927,GB +3107402928,3107402929,GI +3107402930,3107402931,AU +3107402932,3107402939,CN +3107402940,3107402945,JO +3107402946,3107402947,IQ +3107402948,3107402949,GB +3107402950,3107402951,IQ +3107402952,3107402959,DO +3107402960,3107403775,GB +3107403776,3107404799,ES +3107404800,3107405823,GB +3107405824,3107406847,PL +3107406848,3107408895,DE +3107408896,3107409919,GB +3107409920,3107410943,IT +3107410944,3107411967,FI +3107411968,3107412991,IT +3107412992,3107414015,BE +3107414016,3107415039,FR +3107415040,3107416063,DE +3107416064,3107417087,NO +3107417088,3107419135,NL +3107419136,3107422207,DE +3107422208,3107423231,NL +3107423232,3107424255,GB +3107424256,3107425279,NL +3107425280,3107426303,RO +3107426304,3107427327,FR +3107427328,3107428351,AL +3107428352,3107429375,DE +3107429376,3107430399,RS +3107431424,3107432447,FR +3107432448,3107433471,IT +3107433472,3107434495,RU +3107434496,3107435519,FI +3107435520,3107436543,DE +3107436544,3107437567,IQ +3107437568,3107438591,GB +3107438592,3107439615,DE +3107439616,3107440639,DK +3107440640,3107442687,IE +3107443712,3107444735,IT +3107444736,3107445759,ES +3107445760,3107446783,DE +3107446784,3107447807,IR +3107447808,3107448831,BG +3107448832,3107449855,DE +3107449856,3107450879,AT +3107450880,3107451903,DE +3107451904,3107452927,FR +3107452928,3107453951,ES +3107453952,3107454975,GB +3107454976,3107455999,IT +3107456000,3107457023,GB +3107457024,3107458047,IT +3107458048,3107459071,IS +3107459072,3107460095,UA +3107460096,3107461119,GB +3107461120,3107462143,CH +3107462144,3107464191,NL +3107464192,3107465215,PL +3107465216,3107467263,GB +3107467264,3107468287,FR +3107468288,3107469311,NL +3107469312,3107470335,DK +3107470336,3107471359,NL +3107471360,3107473407,GB +3107473408,3107474431,IL +3107474432,3107475455,ES +3107475456,3107475610,SC +3107475611,3107475611,NL +3107475612,3107476479,SC +3107476480,3107477503,US +3107477504,3107478527,AE +3107478528,3107480575,IR +3107480576,3107481599,DK +3107481600,3107482623,DE +3107482624,3107483647,ES +3107483648,3107484671,DE +3107484672,3107485695,RU +3107485696,3107486719,IT +3107486720,3107487743,AT +3107487744,3107489791,DE +3107489792,3107490815,NL +3107490816,3107491839,US +3107491840,3107492863,NL +3107492864,3107493887,DE +3107493888,3107494911,FR +3107494912,3107495935,IT +3107495936,3107496191,FR +3107496192,3107496255,DE +3107496256,3107496287,BS +3107496288,3107496319,VG +3107496320,3107496399,NL +3107496400,3107496415,JP +3107496416,3107496431,NL +3107496432,3107496447,UA +3107496448,3107496463,CL +3107496464,3107496479,ES +3107496480,3107496495,RO +3107496496,3107496511,IN +3107496512,3107496703,NL +3107496704,3107496719,PE +3107496720,3107496735,PK +3107496736,3107496751,FJ +3107496752,3107496783,PA +3107496784,3107496799,BE +3107496800,3107496815,IL +3107496816,3107496831,CN +3107496832,3107496847,BR +3107496848,3107496863,NL +3107496864,3107496879,HK +3107496880,3107496895,IS +3107496896,3107496911,US +3107496912,3107496927,PL +3107496928,3107496959,FR +3107496960,3107497983,DK +3107497984,3107499007,IT +3107499008,3107500031,PL +3107500032,3107501055,FR +3107501056,3107502079,ES +3107502080,3107503103,NO +3107503104,3107504127,PL +3107504128,3107505151,IQ +3107505152,3107506175,SA +3107506176,3107507199,GB +3107507200,3107508223,FR +3107508224,3107509247,PL +3107509248,3107510271,SE +3107510272,3107511295,IT +3107511296,3107511807,RS +3107511808,3107512319,SI +3107512320,3107513343,NL +3107513344,3107514367,DE +3107514368,3107515391,NL +3107515392,3107516415,TR +3107516416,3107517439,FR +3107517440,3107518463,PL +3107518464,3107519487,MK +3107519488,3107520511,MT +3107520512,3107521535,DE +3107521536,3107522559,SE +3107522560,3107523583,NL +3107523584,3107524607,FR +3107524608,3107525631,SI +3107525632,3107526655,IT +3107526656,3107527679,DE +3107527680,3107528703,RU +3107528704,3107531775,GB +3107531776,3107532799,MD +3107532800,3107533823,AT +3107533824,3107534847,FR +3107534848,3107536895,NL +3107536896,3107537919,TR +3107537920,3107538943,AM +3107538944,3107539967,KZ +3107539968,3107540991,GB +3107540992,3107542015,RO +3107542016,3107543039,SE +3107543040,3107544063,DE +3107544064,3107545087,GB +3107545088,3107546111,NL +3107546112,3107547135,GB +3107547136,3107548159,SE +3107548160,3107549183,IT +3107549184,3107551231,IE +3107551232,3107552255,JO +3107552256,3107553279,FR +3107553280,3107554303,BE +3107554304,3107555327,IR +3107555328,3107556351,SE +3107556352,3107557375,NL +3107557376,3107558399,SI +3107558400,3107559423,FR +3107559424,3107561471,GB +3107561472,3107562495,GL +3107562496,3107563519,IR +3107563520,3107564543,SE +3107564544,3107565567,NL +3107565568,3107566591,AT +3107566592,3107567615,FI +3107567616,3107568639,DE +3107568640,3107569663,GB +3107569664,3107571711,ES +3107571712,3107572735,IR +3107572736,3107573759,ES +3107573760,3107574783,IT +3107574784,3107575807,JE +3107575808,3107576831,DE +3107576832,3107577855,FR +3107577856,3107578879,SI +3107578880,3107579391,CZ +3107579392,3107579903,RU +3107579904,3107580927,IT +3107580928,3107581951,RU +3107581952,3107582975,DE +3107582976,3107583999,TR +3107584000,3107585023,RU +3107585024,3107586047,NO +3107586048,3107587071,DE +3107587072,3107588095,IT +3107588096,3107589119,FR +3107589120,3107590143,IQ +3107590144,3107591167,IE +3107591168,3107592191,BG +3107592192,3107593215,GB +3107593216,3107594239,DE +3107594240,3107595263,FI +3107595264,3107596287,DE +3107596288,3107597311,CZ +3107597312,3107598335,IT +3107598336,3107599359,PL +3107599360,3107600383,AT +3107600384,3107601407,NL +3107601408,3107602431,DK +3107602432,3107603455,LT +3107603456,3107604479,NO +3107604480,3107605503,HR +3107605504,3107606527,SE +3107606528,3107607551,PT +3107607552,3107609599,GB +3107609600,3107610623,BA +3107610624,3107611647,BE +3107611648,3107612671,SK +3107612672,3107613695,IT +3107613696,3107614719,DE +3107614720,3107615743,RU +3107615744,3107617791,IT +3107617792,3107618815,RU +3107618816,3107619839,CH +3107619840,3107620863,IT +3107620864,3107621887,NO +3107621888,3107622911,JP +3107622912,3107623935,SE +3107623936,3107624959,NL +3107624960,3107625983,RU +3107625984,3107627007,DE +3107627008,3107628031,PL +3107628032,3107629055,GB +3107629056,3107630079,DE +3107630080,3107631103,ES +3107631104,3107632127,GB +3107632128,3107633151,SI +3107633152,3107634175,FR +3107634176,3107635199,RU +3107635200,3107636223,IT +3107636224,3107637247,ES +3107637248,3107638271,LB +3107638272,3107639295,RU +3107639296,3107640319,ES +3107640320,3107641343,DK +3107641344,3107643391,RU +3107643392,3107644415,GB +3107644416,3107645439,FR +3107645440,3107646463,IE +3107646464,3107647487,NL +3107647488,3107648511,IR +3107648512,3107649535,TR +3107649536,3107651583,RU +3107651584,3107652607,CZ +3107652608,3107653631,PL +3107653632,3107654655,FR +3107654656,3107655679,DE +3107655680,3107656703,BE +3107656704,3107657727,IT +3107657728,3107658751,SI +3107658752,3107659775,TR +3107659776,3107660799,EE +3107660800,3107661823,NL +3107661824,3107662847,FR +3107662848,3107663871,TR +3107663872,3107664895,ES +3107664896,3107665919,CH +3107665920,3107666943,RU +3107666944,3107667967,GB +3107667968,3107668991,ES +3107668992,3107670015,AM +3107670016,3107671039,TR +3107671040,3107672063,NL +3107672064,3107673087,IT +3107673088,3107674111,AE +3107674112,3107675135,PL +3107675136,3107676159,GB +3107676160,3107677183,IT +3107677184,3107678207,DE +3107678208,3107679231,DK +3107679232,3107680255,PL +3107680256,3107681279,IR +3107681280,3107682303,FI +3107682304,3107683327,CZ +3107683328,3107684351,GB +3107684352,3107685375,DE +3107685376,3107686399,IT +3107686400,3107688447,RU +3107688448,3107689471,CZ +3107689472,3107690495,GB +3107690496,3107691519,IT +3107691520,3107692543,UA +3107692544,3107693567,PL +3107693568,3107694591,IT +3107694592,3107695615,BE +3107695616,3107696639,RU +3107696640,3107698687,GB +3107698688,3107699711,SK +3107699712,3107700735,SA +3107700736,3107701759,RU +3107701760,3107702783,BE +3107702784,3107703807,DE +3107703808,3107704831,GB +3107704832,3107705855,CZ +3107705856,3107706879,NO +3107706880,3107707903,RU +3107707904,3107708159,DE +3107708160,3107708415,GB +3107708416,3107708671,NL +3107708672,3107708927,US +3107708928,3107709951,PL +3107709952,3107710975,DK +3107710976,3107711999,RU +3107712000,3107713023,NO +3107713024,3107714047,RO +3107714048,3107715071,RU +3107715072,3107716095,DE +3107716096,3107717119,LV +3107717120,3107718143,DE +3107718144,3107719167,GB +3107719168,3107720191,FR +3107720192,3107721215,RU +3107721216,3107723263,DE +3107723264,3107724287,FR +3107724288,3107725311,GB +3107725312,3107726335,IR +3107726336,3107727359,DE +3107727360,3107728383,ES +3107728384,3107730431,RU +3107730432,3107731455,CH +3107731456,3107732479,DE +3107732480,3107733503,NL +3107733504,3107734527,BG +3107734528,3107735551,HU +3107735552,3107737599,DE +3107737600,3107738623,NL +3107738624,3107738879,DE +3107738880,3107739135,DK +3107739136,3107739391,RO +3107739392,3107739647,PL +3107739648,3107740671,IM +3107740672,3107741695,FR +3107741696,3107742719,DE +3107742720,3107743743,HU +3107743744,3107744767,CZ +3107744768,3107746815,FR +3107746816,3107747839,SI +3107747840,3107748863,GB +3107748864,3107749887,IE +3107749888,3107750911,SE +3107750912,3107751935,RU +3107751936,3107752959,IR +3107752960,3107753983,IT +3107753984,3107755007,CH +3107755008,3107756031,FR +3107756032,3107757055,RU +3107757056,3107758079,NL +3107758080,3107759103,NO +3107759104,3107760127,FR +3107760128,3107761151,IL +3107761152,3107762175,NO +3107762176,3107763199,FR +3107763200,3107764223,CH +3107764224,3107765247,PL +3107765248,3107767295,IT +3107767296,3107768319,DE +3107768320,3107768575,US +3107768576,3107769343,RO +3107769344,3107770367,DK +3107770368,3107771391,DE +3107771392,3107772415,RU +3107772416,3107773439,IE +3107773440,3107774463,GB +3107774464,3107775487,TR +3107775488,3107776511,PL +3107776512,3107777535,FR +3107777536,3107778559,CY +3107778560,3107779583,IT +3107779584,3107780607,PL +3107780608,3107781631,DE +3107781632,3107782655,NL +3107782656,3107783679,IE +3107783680,3107784703,PL +3107784704,3107785727,DE +3107785728,3107786751,IT +3107786752,3107787775,SK +3107787776,3107788799,PS +3107788800,3107789823,RU +3107789824,3107791871,DE +3107791872,3107792895,RU +3107792896,3107793919,DE +3107793920,3107794943,TR +3107794944,3107795967,LB +3107795968,3107796991,NL +3107796992,3107798015,RS +3107798016,3107799039,IE +3107799040,3107800063,LT +3107800064,3107801087,NL +3107801088,3107802111,BE +3107802112,3107803135,RU +3107803136,3107804159,ES +3107804160,3107805183,CZ +3107805184,3107806207,GB +3107806208,3107807231,RU +3107807232,3107808255,GB +3107808256,3107809279,DE +3107809280,3107810303,BY +3107810304,3107811327,SE +3107811328,3107812351,GB +3107812352,3107813375,FR +3107813376,3107814399,DE +3107814400,3107815423,ES +3107815424,3107816447,RU +3107816448,3107817471,GB +3107817472,3107818495,NL +3107818496,3107819519,GB +3107819520,3107820543,FR +3107820544,3107821311,LV +3107821312,3107821567,SE +3107821568,3107822591,GB +3107822592,3107823615,UA +3107823616,3107824639,FR +3107824640,3107825663,GB +3107825664,3107826687,IT +3107826688,3107827711,RU +3107827712,3107828735,FR +3107828736,3107829759,IT +3107829760,3107831807,FR +3107831808,3107832831,RU +3107832832,3107833855,NL +3107833856,3107834879,PS +3107834880,3107835903,ES +3107835904,3107837951,GB +3107837952,3107839999,RU +3107840000,3107841023,NL +3107841024,3107842047,CZ +3107842048,3107843071,FI +3107843072,3107844095,SE +3107844096,3107845119,CY +3107845120,3107846143,RU +3107847168,3107848191,RU +3107848192,3107849215,IT +3107849216,3107850239,BE +3107850240,3107851263,CZ +3107851264,3107853311,NL +3107853312,3107854335,ES +3107854336,3107855359,DE +3107855360,3107856383,IT +3107856384,3107857407,SM +3107857408,3107858431,NL +3107858432,3107859455,FR +3107859456,3107860479,GB +3107860480,3107862527,IT +3107862528,3107863551,NL +3107863552,3107864575,IS +3107864576,3107865599,DE +3107865600,3107866623,NL +3107866624,3107867647,HR +3107867648,3107868671,GB +3107868672,3107869695,CH +3107869696,3107870719,GB +3107870720,3107871743,DE +3107871744,3107872767,PL +3107872768,3107873791,LV +3107873792,3107874815,RU +3107874816,3107875839,CH +3107875840,3107876863,CZ +3107876864,3107877887,RS +3107877888,3107878911,GB +3107878912,3107879935,IL +3107879936,3107880959,DE +3107880960,3107881983,HU +3107881984,3107883007,RS +3107883008,3107884031,US +3107884032,3107885055,NO +3107885056,3107887103,DE +3107887104,3107888127,BG +3107888128,3107889151,GB +3107889152,3107890175,NO +3107890176,3107891199,IE +3107891200,3107892223,CH +3107892224,3107893247,AL +3107893248,3107894271,SA +3107894272,3107895295,PL +3107895296,3107896319,FR +3107896320,3107897343,NL +3107897344,3107898367,RU +3107898368,3107899391,LV +3107899392,3107899903,RU +3107899904,3107900159,KZ +3107900160,3107900415,RU +3107900416,3107900927,DE +3107900928,3107901439,SE +3107901440,3107902463,NL +3107902464,3107904511,GB +3107904512,3107907583,FR +3107907584,3107908607,IR +3107908608,3107909631,US +3107909632,3107910655,IT +3107910656,3107911679,DE +3107911680,3107912703,IT +3107912704,3107913727,SE +3107913728,3107914751,AT +3107914752,3107915775,RO +3107915776,3107916799,DE +3107916800,3107917823,IT +3107917824,3107918847,HU +3107918848,3107919871,NL +3107919872,3107920895,CZ +3107920896,3107921919,ES +3107921920,3107922943,UA +3107922944,3107923967,CH +3107923968,3107924991,IT +3107924992,3107926015,HU +3107926016,3107927039,FR +3107927040,3107928063,IT +3107928064,3107929087,NL +3107929088,3107930111,RU +3107930112,3107931135,CH +3107931136,3107932159,NL +3107932160,3107932415,SE +3107932416,3107934207,MT +3107934208,3107935231,GB +3107935232,3107936255,PL +3107936256,3107937279,IT +3107937280,3107938303,FR +3107938304,3107939327,CZ +3107939328,3107940351,IT +3107940352,3107941375,CZ +3107941376,3107942399,PL +3107942400,3107943423,RU +3107943424,3107944447,NL +3107944448,3107945471,FR +3107945472,3107947519,DE +3107947520,3107948543,IT +3107948544,3107949567,RO +3107949568,3107950591,GB +3107950592,3107951615,IE +3107951616,3107952639,CH +3107952640,3107953663,NL +3107953664,3107954687,SK +3107954688,3107955711,IT +3107955712,3107956735,NL +3107956736,3107957759,IT +3107957760,3107958783,FR +3107958784,3107959807,AL +3107959808,3107960831,PT +3107960832,3107961855,IM +3107961856,3107962879,RU +3107962880,3107963903,FR +3107963904,3107964927,RU +3107964928,3107965951,PL +3107965952,3107966975,DE +3107966976,3107967999,NO +3107968000,3107969023,DE +3107969024,3107970047,RU +3107970048,3107971071,GB +3107971072,3107972095,UZ +3107972096,3107973119,IT +3107973120,3107974143,SA +3107974144,3107975167,IR +3107976192,3107977215,NL +3107977216,3107978239,AT +3107978240,3107979263,NL +3107979264,3107980287,ME +3107980288,3107981311,BE +3107981312,3107981823,IL +3107981824,3107982335,US +3107982336,3107983359,GB +3107983360,3107984383,IE +3107984384,3107985407,BG +3107985408,3107986431,OM +3107986432,3107987455,PL +3107987456,3107988479,NL +3107988480,3107989503,GB +3107989504,3107990527,CZ +3107990528,3107991551,RU +3107991552,3107992575,AT +3107992576,3107993599,RU +3107993600,3107994623,MT +3107994624,3107995647,AT +3107995648,3107996671,BE +3107996672,3107997695,IT +3107997696,3107998719,SE +3107998720,3107999743,AE +3107999744,3108000767,TR +3108000768,3108001791,MK +3108001792,3108002815,GB +3108002816,3108003839,RO +3108003840,3108004863,DE +3108004864,3108005375,US +3108005376,3108005631,CA +3108005632,3108005887,US +3108005888,3108006911,LT +3108006912,3108007935,NL +3108007936,3108008959,DE +3108008960,3108009983,CH +3108009984,3108011007,NL +3108011008,3108012031,DE +3108012032,3108013055,FR +3108013056,3108014079,HR +3108014080,3108015103,NL +3108015104,3108015359,GB +3108015360,3108015615,NL +3108015616,3108015871,HK +3108015872,3108016127,JP +3108016128,3108017151,DE +3108017152,3108018175,FR +3108018176,3108019199,AT +3108019200,3108020223,DE +3108020224,3108021247,US +3108021248,3108022271,AT +3108022272,3108023295,DE +3108023296,3108024319,RS +3108024320,3108025343,IR +3108025344,3108026367,BE +3108026368,3108027391,CH +3108027392,3108028415,GB +3108028416,3108029439,NL +3108029440,3108030463,CH +3108030464,3108031487,KW +3108031488,3108032511,IT +3108032512,3108033535,RU +3108033536,3108034559,GB +3108034560,3108036607,CZ +3108036608,3108037631,GB +3108037632,3108038655,RU +3108038656,3108039679,ES +3108039680,3108040703,MD +3108040704,3108041727,ES +3108041728,3108044799,GB +3108044800,3108045823,LU +3108045824,3108046847,DE +3108046848,3108047871,HU +3108047872,3108050943,RU +3108050944,3108051967,GB +3108051968,3108052991,FR +3108052992,3108054015,GB +3108054016,3108055039,LV +3108055040,3108056063,GB +3108056064,3108057087,IT +3108057088,3108058111,LT +3108058112,3108059135,NL +3108059136,3108060159,FR +3108060160,3108061183,CH +3108061184,3108062207,ES +3108062208,3108063231,TR +3108063232,3108064255,BE +3108064256,3108065279,CZ +3108065280,3108066303,FR +3108066304,3108067327,GB +3108067328,3108068351,DE +3108068352,3108069375,CZ +3108069376,3108070399,FR +3108070400,3108071423,GB +3108072448,3108073471,GB +3108073472,3108074495,FR +3108074496,3108075519,DK +3108075520,3108076543,BA +3108076544,3108077567,NL +3108077568,3108078591,GB +3108078592,3108079103,SE +3108079104,3108079359,NL +3108079360,3108079615,SE +3108079616,3108080639,RU +3108080640,3108081663,SE +3108081664,3108082687,GB +3108082688,3108083711,RU +3108083712,3108084735,NO +3108084736,3108085759,ES +3108085760,3108086783,LV +3108086784,3108087807,GB +3108087808,3108088831,CH +3108088832,3108089599,NL +3108089600,3108089615,AE +3108089616,3108089855,NL +3108089856,3108090879,SE +3108090880,3108091903,BE +3108091904,3108092927,ES +3108092928,3108093951,SE +3108093952,3108095999,DE +3108096000,3108096511,LT +3108096512,3108097023,RU +3108097024,3108098047,TR +3108098048,3108099071,DE +3108099072,3108100095,NL +3108100096,3108101119,IT +3108101120,3108102143,SK +3108102144,3108103167,FR +3108103168,3108104191,BA +3108104192,3108105215,AT +3108105216,3108106239,GB +3108106240,3108107263,DE +3108107264,3108108287,UA +3108108288,3108109311,FR +3108109312,3108110335,IQ +3108110336,3108111359,DK +3108111360,3108112383,GB +3108112384,3108113407,US +3108113408,3108114431,RU +3108114432,3108115455,AE +3108115456,3108116479,GB +3108116480,3108117503,IT +3108117504,3108118527,RU +3108118528,3108119551,GB +3108119552,3108120575,CZ +3108120576,3108122623,ES +3108122624,3108123647,AT +3108123648,3108123903,HU +3108123904,3108124159,SK +3108124160,3108124671,HU +3108124672,3108126719,ES +3108126720,3108127743,DE +3108127744,3108128767,BY +3108128768,3108129791,ES +3108129792,3108130815,DE +3108130816,3108131839,NL +3108131840,3108132863,RU +3108133888,3108134911,NL +3108134912,3108135935,LU +3108135936,3108136959,FR +3108136960,3108137215,NL +3108137216,3108137471,LU +3108137472,3108137983,NL +3108137984,3108139007,RO +3108139008,3108141055,GB +3108141056,3108142079,PL +3108142080,3108143103,TR +3108143104,3108144127,AL +3108144128,3108145151,DE +3108145152,3108146175,RO +3108146176,3108147199,NL +3108147200,3108148223,RU +3108148224,3108149247,SI +3108149248,3108150271,FR +3108150272,3108151295,CH +3108151296,3108152319,CY +3108152320,3108152575,GB +3108152576,3108152831,DE +3108152832,3108153343,GB +3108153344,3108154367,NL +3108154368,3108155391,ES +3108155392,3108156415,DE +3108156416,3108157439,GB +3108157440,3108158463,DK +3108158464,3108159487,CZ +3108159488,3108161535,DE +3108161536,3108162559,SK +3108162560,3108164607,GB +3108164608,3108165631,PL +3108165632,3108166655,RU +3108166656,3108167679,DE +3108167680,3108169727,IR +3108169728,3108170751,FR +3108170752,3108171775,DE +3108172800,3108173823,DE +3108173824,3108174847,NL +3108174848,3108175871,KG +3108175872,3108176127,NL +3108176128,3108176895,UA +3108176896,3108177919,NL +3108177920,3108178943,PL +3108178944,3108179967,IR +3108179968,3108180991,NO +3108180992,3108182015,IE +3108182016,3108183039,DE +3108183040,3108184063,ES +3108184064,3108185087,TR +3108185088,3108186111,DE +3108186112,3108187135,NO +3108187136,3108188159,NL +3108188160,3108189183,GB +3108189184,3108190207,RU +3108190208,3108191231,SE +3108191232,3108193279,NL +3108193280,3108194303,PL +3108194304,3108195327,FR +3108195328,3108196351,ES +3108196352,3108197375,FI +3108197376,3108198399,IS +3108198400,3108199423,FR +3108199424,3108200447,RU +3108200448,3108201471,ES +3108201472,3108202495,IR +3108202496,3108203519,ES +3108203520,3108204543,AT +3108204544,3108205567,ES +3108205568,3108206591,NO +3108206592,3108208639,TR +3108208640,3108209663,DK +3108209664,3108210687,CZ +3108210688,3108211711,CN +3108211712,3108212735,GB +3108212736,3108216831,FR +3108216832,3108217855,RU +3108217856,3108218111,GB +3108218112,3108218623,US +3108218624,3108218879,GB +3108218880,3108219903,RU +3108219904,3108220927,AT +3108220928,3108221951,AL +3108221952,3108222975,IS +3108222976,3108223999,GB +3108224000,3108225023,CZ +3108225024,3108227071,CH +3108227072,3108228095,NL +3108228096,3108229119,TR +3108229120,3108230143,ES +3108230144,3108231167,IR +3108231168,3108232191,PL +3108232192,3108233215,DE +3108233216,3108234239,NL +3108234240,3108235263,AT +3108235264,3108236287,GB +3108236288,3108237311,IT +3108237312,3108238335,LT +3108238336,3108239359,RU +3108239360,3108240383,GB +3108240384,3108240639,UA +3108240640,3108240895,RU +3108240896,3108241407,KG +3108241408,3108242431,GB +3108242432,3108243455,AT +3108243456,3108244479,GE +3108244480,3108245503,PL +3108245504,3108246527,UA +3108246528,3108247551,RU +3108247552,3108248575,PL +3108248576,3108249599,CZ +3108249600,3108250623,CH +3108250624,3108251647,LT +3108251648,3108252671,DE +3108252672,3108253695,LU +3108253696,3108254719,ME +3108254720,3108255743,CH +3108255744,3108256767,FI +3108256768,3108257791,RS +3108257792,3108258815,CH +3108258816,3108259839,CZ +3108259840,3108260863,HU +3108260864,3108261887,DE +3108262912,3108263935,GB +3108263936,3108264959,NL +3108264960,3108265983,RU +3108265984,3108267007,NL +3108267008,3108268031,RU +3108268032,3108269055,GB +3108269056,3108270079,ES +3108270080,3108271103,GB +3108271104,3108272127,RU +3108272128,3108273151,RO +3108273152,3108274175,DE +3108274176,3108275199,CY +3108275200,3108276223,HR +3108276224,3108277247,DE +3108277248,3108278271,GB +3108278272,3108279295,RU +3108279296,3108280319,FR +3108280320,3108281343,RU +3108281344,3108281855,US +3108281856,3108281919,IT +3108281920,3108281983,NO +3108281984,3108282047,SE +3108282048,3108282111,BR +3108282112,3108282367,US +3108282368,3108283391,NL +3108283392,3108284415,CZ +3108284416,3108285439,NO +3108285440,3108286463,NL +3108286464,3108287487,IT +3108287488,3108288511,NL +3108288512,3108289535,RU +3108289536,3108290559,RO +3108290560,3108291583,IT +3108291584,3108292607,NL +3108292608,3108293631,GB +3108293632,3108294655,CH +3108294656,3108295679,EE +3108295680,3108297727,CZ +3108297728,3108298751,TR +3108298752,3108300799,FR +3108300800,3108301823,GB +3108301824,3108302847,CH +3108302848,3108303871,NL +3108303872,3108304895,RU +3108304896,3108305919,GB +3108305920,3108306943,DE +3108306944,3108307967,PL +3108307968,3108308991,IQ +3108308992,3108310015,ES +3108310016,3108311039,GB +3108312064,3108313087,PL +3108313088,3108314111,LV +3108314112,3108315135,BA +3108315136,3108316159,NL +3108316160,3108317183,FI +3108317184,3108318207,CH +3108318208,3108319231,SE +3108319232,3108320255,SK +3108320256,3108321279,LT +3108321280,3108322303,RO +3108322304,3108323327,NL +3108323328,3108324351,GB +3108324352,3108325375,CZ +3108325376,3108326399,FI +3108326400,3108327423,FR +3108327424,3108328447,RU +3108328448,3108329471,GB +3108329472,3108330495,NL +3108330496,3108331519,CH +3108331520,3108332543,HU +3108332544,3108333567,NL +3108333568,3108334591,SK +3108334592,3108335615,IR +3108335616,3108336639,NL +3108336640,3108337151,GB +3108337152,3108337407,ES +3108337408,3108337663,GB +3108337664,3108338687,IR +3108338688,3108339711,RU +3108340736,3108341759,RU +3108341760,3108342783,CH +3108342784,3108343807,FI +3108343808,3108344831,GB +3108344832,3108345855,SI +3108345856,3108346879,UA +3108346880,3108347903,NL +3108347904,3108348927,AT +3108348928,3108349951,BE +3108349952,3108350207,SE +3108350208,3108350463,US +3108350464,3108350975,SE +3108350976,3108351999,GE +3108352000,3108354047,DE +3108354048,3108355071,TM +3108355072,3108356095,IT +3108356096,3108358143,PL +3108358144,3108359167,DE +3108359168,3108360191,NL +3108360192,3108361215,SA +3108361216,3108362239,IE +3108362240,3108363263,LU +3108363264,3108364287,RU +3108364288,3108365311,LU +3108365312,3108366335,FR +3108366336,3108367359,NL +3108367360,3108368383,AT +3108368384,3108368639,RO +3108368640,3108368895,US +3108368896,3108369151,SG +3108369152,3108369407,RO +3108369408,3108370431,AT +3108370432,3108371455,FR +3108371456,3108372479,ES +3108372480,3108373503,SK +3108373504,3108374527,NL +3108374528,3108375551,GB +3108375552,3108376575,BY +3108376576,3108377599,UA +3108377600,3108378623,DE +3108378624,3108379647,CZ +3108379648,3108380671,IE +3108380672,3108381695,GB +3108381696,3108382719,PL +3108382720,3108383743,CH +3108383744,3108384767,BE +3108384768,3108385791,CH +3108385792,3108386815,GE +3108386816,3108387839,GB +3108387840,3108388863,IR +3108388864,3108389887,NL +3108389888,3108390911,CH +3108390912,3108391935,BE +3108391936,3108392959,GR +3108392960,3108393983,LI +3108393984,3108395007,TR +3108395008,3108396031,GB +3108396032,3108397055,ES +3108397056,3108398079,TR +3108398080,3108399103,PT +3108399104,3108400127,RU +3108400128,3108401151,UA +3108401152,3108402175,NL +3108403200,3108404223,DE +3108404224,3108405247,SE +3108405248,3108406271,UA +3108406272,3108407295,GB +3108407296,3108408319,ES +3108408320,3108409343,TR +3108409344,3108410367,DE +3108410368,3108411391,IT +3108411392,3108412415,ES +3108412416,3108414463,GB +3108414464,3108415487,RU +3108415488,3108416511,GB +3108416512,3108417535,ES +3108417536,3108418559,FR +3108418560,3108419583,PL +3108419584,3108420607,NL +3108420608,3108421631,MD +3108421632,3108422655,GB +3108422656,3108423679,IR +3108423680,3108424703,IT +3108424704,3108425727,DE +3108425728,3108427775,NL +3108427776,3108428799,CZ +3108428800,3108429823,DE +3108429824,3108430847,LB +3108430848,3108433919,NL +3108433920,3108434943,GB +3108434944,3108435967,CH +3108435968,3108436991,IL +3108436992,3108438015,GB +3108438016,3108439039,US +3108439040,3108440063,DE +3108440064,3108441087,IT +3108441088,3108443135,CH +3108443136,3108444159,PL +3108444160,3108445183,GB +3108445184,3108446207,ES +3108446208,3108447231,DE +3108447232,3108448255,GB +3108448256,3108449279,CZ +3108449280,3108450303,IT +3108450304,3108451327,GB +3108451328,3108452351,RU +3108452352,3108453375,LU +3108453376,3108454399,NL +3108454400,3108456447,RU +3108456448,3108457471,GB +3108457472,3108458495,RU +3108458496,3108459519,UA +3108459520,3108460543,DE +3108460544,3108461567,RS +3108461568,3108462591,DE +3108462592,3108463615,RU +3108463616,3108464639,GB +3108464640,3108465663,HU +3108465664,3108466687,GB +3108466688,3108467711,CH +3108467712,3108468735,TR +3108468736,3108470783,DE +3108470784,3108471807,LV +3108471808,3108472831,YE +3108472832,3108473855,GB +3108473856,3108474879,PS +3108474880,3108475903,RU +3108475904,3108476927,FR +3108476928,3108477951,IR +3108477952,3108478975,FR +3108478976,3108479999,IE +3108480000,3108481023,AT +3108481024,3108482047,DE +3108482048,3108483071,SI +3108483072,3108484095,SE +3108484096,3108485119,AL +3108485120,3108486143,GB +3108486144,3108486655,FR +3108486656,3108486911,RU +3108486912,3108487167,FR +3108487168,3108488191,IR +3108488192,3108489215,RU +3108489216,3108490239,ES +3108490240,3108491263,AE +3108491264,3108492287,NO +3108492288,3108493311,RU +3108493312,3108494335,CY +3108494336,3108495359,IT +3108495360,3108496383,NL +3108496384,3108496895,AU +3108496896,3108497151,NZ +3108497152,3108497407,US +3108497408,3108498431,CZ +3108498432,3108499455,HR +3108499456,3108500479,PL +3108500480,3108501503,IT +3108501504,3108502527,DE +3108502528,3108503551,AT +3108503552,3108504575,ES +3108504576,3108505599,FR +3108505600,3108506623,RU +3108506624,3108507647,ES +3108507648,3108508671,HU +3108508672,3108509695,CH +3108509696,3108510719,IR +3108510720,3108511743,SI +3108511744,3108512767,PL +3108512768,3108513791,DK +3108513792,3108514815,IT +3108514816,3108515839,ES +3108515840,3108516863,UA +3108516864,3108517887,ES +3108517888,3108518911,BG +3108518912,3108519935,SI +3108519936,3108520959,CH +3108520960,3108521727,US +3108521728,3108521855,SK +3108521856,3108521919,MK +3108521920,3108521983,BA +3108521984,3108523007,AT +3108523008,3108524031,IT +3108524032,3108525055,FR +3108525056,3108526079,LV +3108526080,3108527103,FR +3108527104,3108528127,GB +3108528128,3108529151,NO +3108529152,3108530175,JO +3108530176,3108531199,SI +3108531200,3108532223,GB +3108532224,3108533247,ES +3108533248,3108534271,FI +3108534272,3108536319,NL +3108536320,3108537343,GB +3108537344,3108538367,NL +3108538368,3108539391,AT +3108539392,3108540415,DK +3108540416,3108541439,RU +3108541440,3108542463,GR +3108542464,3108543487,PT +3108543488,3108544511,US +3108544512,3108546559,NL +3108546560,3108547583,BE +3108547584,3108548607,GB +3108548608,3108549631,RO +3108549632,3108550655,NL +3108550656,3108551679,PL +3108551680,3108552703,RU +3108552704,3108553727,CH +3108553728,3108554751,PL +3108554752,3108555775,DE +3108555776,3108556799,LV +3108556800,3108557823,DK +3108557824,3108558847,ES +3108558848,3108559871,LB +3108559872,3108560895,NO +3108560896,3108562943,RU +3108562944,3108563967,DE +3108563968,3108564991,CH +3108564992,3108566015,RO +3108566016,3108567039,DE +3108567040,3108568063,FR +3108568064,3108569087,IQ +3108569088,3108570111,IR +3108570112,3108571135,SI +3108571136,3108572159,GB +3108572160,3108573183,NO +3108573184,3108574207,RU +3108574208,3108575231,DE +3108575232,3108576255,NO +3108576256,3108578303,NL +3108578304,3108579327,GB +3108579328,3108580351,GR +3108580352,3108581375,GB +3108581376,3108582399,DE +3108582400,3108583423,FR +3108583424,3108584447,BG +3108584448,3108585471,PL +3108585472,3108586495,GB +3108586496,3108587519,EE +3108587520,3108588543,DK +3108588544,3108589567,IR +3108589568,3108590591,DE +3108590592,3108591615,GB +3108591616,3108592639,PL +3108592640,3108593663,NL +3108593664,3108594687,ES +3108594688,3108597759,CZ +3108597760,3108598015,NL +3108598016,3108598271,IR +3108598272,3108598527,GB +3108598528,3108598783,IR +3108598784,3108600831,CH +3108600832,3108601855,NL +3108601856,3108602879,US +3108602880,3108603903,EE +3108603904,3108604927,IT +3108604928,3108605951,GB +3108606976,3108609023,GB +3108609024,3108610047,LI +3108610048,3108611071,CZ +3108611072,3108612095,IT +3108612096,3108615167,ES +3108615168,3108616191,RU +3108616192,3108617215,GB +3108617216,3108618239,ES +3108618240,3108619263,RU +3108619264,3108620287,DK +3108620288,3108621311,TR +3108621312,3108622335,FR +3108622336,3108623359,PL +3108623360,3108625407,RU +3108625408,3108626431,NL +3108626432,3108627455,CZ +3108627456,3108628479,PL +3108628480,3108629503,FR +3108629504,3108630527,BG +3108630528,3108631551,CH +3108631552,3108633599,IT +3108633600,3108634623,FR +3108634624,3108635647,AT +3108635648,3108636671,UZ +3108636672,3108637695,FR +3108637696,3108638719,DE +3108638720,3108639743,ES +3108639744,3108640767,TR +3108640768,3108641791,GB +3108641792,3108642815,CH +3108642816,3108643839,FR +3108643840,3108644863,IT +3108644864,3108645887,FR +3108645888,3108646911,US +3108646912,3108647935,DK +3108647936,3108648959,FR +3108648960,3108649983,IM +3108649984,3108651007,CZ +3108651008,3108652031,DE +3108652032,3108653055,CH +3108653056,3108654079,GI +3108654080,3108654335,DE +3108654336,3108654591,NL +3108654592,3108654847,GB +3108654848,3108655103,DK +3108655104,3108656127,ES +3108656128,3108657151,PL +3108657152,3108658175,RS +3108658176,3108659199,GE +3108659200,3108660223,FR +3108660224,3108661247,UZ +3108661248,3108662271,RU +3108662272,3108676607,CH +3108676608,3108677631,IR +3108677632,3108678655,GB +3108678656,3108679679,FI +3108679680,3108680703,GB +3108680704,3108681727,DE +3108681728,3108682751,SE +3108682752,3108683775,IT +3108683776,3108684799,ES +3108684800,3108685823,SK +3108685824,3108686847,FR +3108686848,3108687871,CZ +3108687872,3108688895,FO +3108688896,3108689919,CH +3108689920,3108690943,DE +3108690944,3108691967,RU +3108691968,3108692991,DE +3108692992,3108694015,RU +3108694016,3108696063,GB +3108696064,3108697087,ES +3108697088,3108698111,DE +3108698112,3108699135,IT +3108699136,3108700159,DE +3108700160,3108701183,PL +3108701184,3108702207,RU +3108702208,3108703231,AT +3108703232,3108704255,ES +3108704256,3108705279,SA +3108705280,3108706303,ES +3108706304,3108707327,DE +3108707328,3108708351,GB +3108708352,3108709375,CH +3108709376,3108710399,PL +3108710400,3108711423,SE +3108711424,3108712447,RU +3108712448,3108713471,BG +3108713472,3108714495,RO +3108714496,3108715519,XK +3108715520,3108716543,GB +3108716544,3108717567,RU +3108717568,3108718591,FR +3108718592,3108719615,DE +3108719616,3108720639,NL +3108720640,3108721663,GI +3108721664,3108723711,RU +3108723712,3108724735,GB +3108724736,3108725759,IQ +3108725760,3108726783,DE +3108726784,3108727807,GB +3108727808,3108728831,IT +3108728832,3108729855,NL +3108729856,3108730879,CZ +3108730880,3108731903,GB +3108731904,3108732927,FR +3108732928,3108733951,FI +3108733952,3108734975,RU +3108734976,3108735999,CZ +3108736000,3108737023,FR +3108737024,3108738047,IE +3108738048,3108739071,DE +3108739072,3108740095,CH +3108740096,3108741119,NL +3108741120,3108742143,PL +3108742144,3108743167,DE +3108743168,3108744191,NL +3108744192,3108745215,GB +3108745216,3108746239,ES +3108746240,3108747263,RU +3108747264,3108748287,DE +3108748288,3108749055,RU +3108749056,3108749311,KZ +3108749312,3108750335,HU +3108750336,3108751359,IR +3108751360,3108752383,RU +3108752384,3108753407,IR +3108753408,3108754431,NL +3108754432,3108755455,GB +3108755456,3108756479,AT +3108756480,3108757503,NL +3108758528,3108759551,DE +3108759552,3108760575,CZ +3108760576,3108761599,LV +3108761600,3108762111,AT +3108762112,3108762623,GB +3108762624,3108763647,NL +3108763648,3108764671,RU +3108764672,3108765695,NL +3108765696,3108766719,FR +3108766720,3108767743,PT +3108767744,3108767999,SK +3108768000,3108768255,SE +3108768256,3108768511,NL +3108768512,3108768767,CZ +3108769792,3108770815,NL +3108770816,3108772863,FR +3108772864,3108773887,RO +3108773888,3108774911,IQ +3108774912,3108775935,GB +3108775936,3108776959,DE +3108776960,3108779007,GB +3108779008,3108780031,RO +3108780032,3108781055,IT +3108781056,3108782079,RO +3108782080,3108783103,SE +3108783104,3108784127,UA +3108784128,3108785151,NL +3108785152,3108786175,ES +3108786176,3108787199,UA +3108787200,3108788223,NO +3108788224,3108789247,NL +3108789248,3108790271,GB +3108790272,3108791295,DE +3108791296,3108792319,IT +3108792320,3108793343,PL +3108793344,3108794367,RU +3108794368,3108795391,FR +3108795392,3108796415,DE +3108796416,3108797439,FR +3108797440,3108798463,NL +3108798464,3108799487,AE +3108799488,3108800511,NL +3108800512,3108801535,SA +3108801536,3108802559,TR +3108802560,3108803583,RU +3108803584,3108804607,GB +3108804608,3108805631,TR +3108805632,3108808703,DE +3108808704,3108809727,NL +3108809728,3108810751,DE +3108810752,3108811775,LB +3108811776,3108812799,CH +3108812800,3108813823,GB +3108813824,3108814847,DE +3108814848,3108815871,FR +3108815872,3108817919,TR +3108817920,3108818943,AE +3108818944,3108819967,GB +3108819968,3108822015,ES +3108822016,3108823039,RU +3108823040,3108825087,IE +3108825088,3108826111,RU +3108826112,3108827135,NL +3108827136,3108828159,RU +3108828160,3108829183,MT +3108829184,3108830207,IR +3108830208,3108831231,RU +3108831232,3108832255,TR +3108832256,3108833279,GB +3108833280,3108834303,RU +3108834304,3108835327,BE +3108835328,3108836351,RU +3108836352,3108837375,GB +3108837376,3108838399,NL +3108838400,3108839423,GE +3108839424,3108840447,IT +3108840448,3108841471,GR +3108841472,3108842495,TR +3108842496,3108843519,LI +3108843520,3108844543,IT +3108844544,3108845567,LI +3108845568,3108846591,GB +3108846592,3108847615,BE +3108847616,3108848639,GB +3108848640,3108849663,CH +3108849664,3108850687,GB +3108850688,3108851711,PL +3108851712,3108852039,GB +3108852040,3108852047,IT +3108852048,3108852735,GB +3108852736,3108853759,IT +3108853760,3108854783,TR +3108854784,3108855807,CH +3108855808,3108856831,LT +3108856832,3108857855,UA +3108857856,3108858879,DE +3108858880,3108859903,AT +3108859904,3108860927,FR +3108860928,3108861951,NO +3108861952,3108862975,NL +3108862976,3108863999,BG +3108864000,3108865023,NL +3108865024,3108866047,ES +3108866048,3108867071,RU +3108867072,3108868095,GB +3108868096,3108869119,SK +3108869120,3108870143,RU +3108870144,3108871167,GB +3108871168,3108872191,ES +3108872192,3108873215,IT +3108873216,3108873343,SG +3108873344,3108873471,MY +3108873472,3108873599,SG +3108873600,3108873727,MY +3108873728,3108873855,SG +3108873856,3108873983,ID +3108873984,3108874111,SG +3108874112,3108874239,ID +3108874240,3108875263,ES +3108875264,3108875439,GB +3108875440,3108875447,IT +3108875448,3108876287,GB +3108876288,3108877311,ES +3108877312,3108878335,FR +3108878336,3108879359,ES +3108879360,3108880383,NL +3108880384,3108881407,AM +3108881408,3108882431,BE +3108882432,3108883455,GB +3108883456,3108884479,RU +3108884480,3108885503,NL +3108885504,3108886527,BE +3108886528,3108888575,RU +3108888576,3108889599,VA +3108889600,3108893695,RU +3108893696,3108894719,FI +3108894720,3108894975,IL +3108894976,3108895743,US +3108895744,3108896767,AT +3108896768,3108897791,ES +3108897792,3108899839,GB +3108899840,3108900863,CZ +3108900864,3108901887,IT +3108901888,3108902911,IR +3108902912,3108903935,ES +3108903936,3108905983,RU +3108905984,3108907007,BG +3108907008,3108907263,DE +3108907264,3108907279,NL +3108907280,3108907295,BE +3108907296,3108907311,GB +3108907312,3108907327,DK +3108907328,3108907343,ES +3108907344,3108907359,IT +3108907360,3108907375,FR +3108907376,3108907391,AT +3108907392,3108907407,CH +3108907408,3108907423,US +3108907424,3108908031,DE +3108908032,3108909055,EE +3108909056,3108910079,IT +3108910080,3108911103,GB +3108911104,3108912127,CZ +3108912128,3108913151,DE +3108913152,3108914175,IT +3108914176,3108915199,NO +3108915200,3108916223,PL +3108916224,3108917247,RU +3108917248,3108918271,FR +3108918272,3108919295,TR +3108919296,3108920319,GB +3108920320,3108921343,RU +3108921344,3108922367,NL +3108922368,3108923391,CZ +3108923392,3108924415,IR +3108924416,3108927487,RU +3108927488,3108929535,CH +3108929536,3108930559,CY +3108930560,3108931583,PL +3108931584,3108932607,UZ +3108932608,3108933631,FR +3108933632,3108934655,AM +3108934656,3108935679,PL +3108935680,3108936703,SK +3108936704,3108937727,FR +3108937728,3108938751,NL +3108938752,3108940799,GB +3108941824,3108942847,DE +3108942848,3108943871,BE +3108943872,3108944895,DE +3108944896,3108945919,CH +3108945920,3108946943,GB +3108946944,3108946944,IT +3108946945,3108947199,NL +3108947200,3108947200,IT +3108947201,3108947455,NL +3108947456,3108947456,IT +3108947457,3108947711,NL +3108947712,3108947712,IT +3108947713,3108947967,NL +3108947968,3108948991,RU +3108948992,3108950015,GB +3108950016,3108951039,NO +3108951040,3108952063,ES +3108952064,3108953087,GB +3108953088,3108954111,GR +3108954112,3108955135,AL +3108955136,3108956159,NO +3108956160,3108956671,UA +3108956672,3108957183,TJ +3108957184,3108958207,RU +3108958208,3108959231,SI +3108959232,3108960255,AE +3108960256,3108961279,NL +3108961280,3108962303,DE +3108962304,3108963327,AM +3108963328,3108964351,ES +3108964352,3108965375,NL +3108965376,3108966399,TR +3108966400,3108967423,BY +3108967424,3108968447,ES +3108968448,3108969471,DE +3108969472,3108970495,ES +3108970496,3108971519,PL +3108971520,3108972543,ES +3108972544,3108973567,NL +3108973568,3108974591,DE +3108974592,3108975615,RU +3108975616,3108976639,IT +3108976640,3108977663,GB +3108977664,3108978687,IR +3108978688,3108979711,DE +3108979712,3108980735,RU +3108980736,3108981759,DE +3108981760,3108982783,RU +3108982784,3108983807,NL +3108983808,3108984063,AE +3108984064,3108984831,NO +3108984832,3108985855,CH +3108985856,3108986879,HU +3108986880,3108987903,IR +3108987904,3108988927,RU +3108989952,3108991999,GB +3108992000,3108993023,RU +3108993024,3108994047,BG +3108994048,3108995071,DE +3108995072,3108996095,ES +3108996096,3108998143,RU +3108998144,3108999167,GB +3108999168,3109000191,ES +3109000192,3109001215,FR +3109001216,3109002239,NL +3109002240,3109003263,IR +3109003264,3109004287,NL +3109004288,3109005311,SE +3109005312,3109006335,DE +3109006336,3109007359,ES +3109007360,3109008383,GB +3109008384,3109009407,CH +3109009408,3109010431,GB +3109010432,3109011455,GR +3109011456,3109012479,FR +3109012480,3109013503,DE +3109013504,3109015551,CH +3109015552,3109016575,DE +3109016576,3109017599,KZ +3109017600,3109018623,DE +3109018624,3109019647,FR +3109019648,3109020671,PT +3109020672,3109021695,BA +3109021696,3109022719,CH +3109022720,3109023743,RU +3109023744,3109024767,PL +3109024768,3109025791,LT +3109025792,3109026493,IT +3109026494,3109026526,SA +3109026527,3109026815,IT +3109026816,3109027839,CH +3109027840,3109028863,BG +3109028864,3109029887,ES +3109029888,3109030911,NL +3109030912,3109031935,GB +3109031936,3109032959,FR +3109032960,3109033983,TR +3109033984,3109035007,JO +3109035008,3109036031,RU +3109036032,3109037055,PL +3109037056,3109038079,NL +3109038080,3109039103,IQ +3109039104,3109040127,YE +3109040128,3109041151,HU +3109041152,3109042175,NL +3109042176,3109043199,PL +3109043200,3109044223,NO +3109044224,3109045247,CH +3109045248,3109046271,RS +3109046272,3109047295,TR +3109047296,3109048319,PT +3109048320,3109049343,KZ +3109049344,3109050367,GB +3109050368,3109051391,CH +3109051392,3109052415,DE +3109052416,3109053439,ME +3109053440,3109054463,IR +3109054464,3109055487,JO +3109055488,3109056511,IL +3109056512,3109058559,GB +3109058560,3109059583,DE +3109059584,3109060095,LU +3109060096,3109060351,CY +3109060352,3109060607,LU +3109060608,3109061631,LT +3109061632,3109062655,GB +3109062656,3109063679,TR +3109063680,3109064703,YE +3109064704,3109065727,DE +3109065728,3109066751,RU +3109066752,3109067775,UA +3109067776,3109068799,NO +3109068800,3109069823,PL +3109069824,3109070847,MK +3109070848,3109071871,DE +3109071872,3109072895,AZ +3109073920,3109074943,NO +3109074944,3109075967,DE +3109075968,3109076991,AT +3109076992,3109078015,HR +3109078016,3109079039,IR +3109079040,3109080063,US +3109080064,3109081087,RU +3109081088,3109082111,SE +3109082112,3109083135,PL +3109083136,3109084159,SE +3109084160,3109085183,NL +3109085184,3109086207,AL +3109086208,3109087231,RU +3109087232,3109088255,NL +3109088256,3109089279,LV +3109089280,3109090303,AT +3109090304,3109091327,NL +3109091328,3109092351,RU +3109092352,3109093375,SE +3109093376,3109095423,IT +3109095424,3109096447,NL +3109096448,3109097471,NO +3109097472,3109098495,GB +3109098496,3109099519,HU +3109099520,3109100543,RU +3109100544,3109101567,SI +3109101568,3109102591,TR +3109102592,3109103615,DK +3109103616,3109104639,IR +3109104640,3109105663,FR +3109105664,3109106687,LV +3109106688,3109107711,FR +3109107712,3109108735,PL +3109108736,3109109759,RS +3109109760,3109110783,RU +3109110784,3109111807,FI +3109111808,3109112831,IE +3109112832,3109113855,ES +3109113856,3109115903,AZ +3109115904,3109116927,AU +3109116928,3109117951,GE +3109117952,3109118463,IR +3109118464,3109118719,NL +3109118720,3109118975,IR +3109118976,3109119999,DE +3109120000,3109121023,PL +3109121024,3109122047,SE +3109122048,3109122559,GB +3109122560,3109123071,NL +3109123072,3109124095,DK +3109124096,3109126143,ES +3109126144,3109127167,LV +3109127168,3109128191,ES +3109128192,3109128207,NL +3109128208,3109128215,GB +3109128216,3109128223,AT +3109128224,3109128231,DK +3109128232,3109128239,SE +3109128240,3109128319,NL +3109128320,3109128383,GB +3109128384,3109128463,NL +3109128464,3109128471,DK +3109128472,3109128479,SE +3109128480,3109128487,IE +3109128488,3109128495,DK +3109128496,3109128503,SE +3109128504,3109128511,IE +3109128512,3109128719,NL +3109128720,3109128727,GB +3109128728,3109128735,AT +3109128736,3109128743,DK +3109128744,3109128751,SE +3109128752,3109128759,IE +3109128760,3109128760,IT +3109128761,3109128831,NL +3109128832,3109128895,BE +3109128896,3109128975,NL +3109128976,3109128983,DK +3109128984,3109128991,SE +3109128992,3109128999,IT +3109129000,3109129007,DK +3109129008,3109129015,SE +3109129016,3109129023,IE +3109129024,3109129215,NL +3109129216,3109130239,LB +3109130240,3109131263,RU +3109131264,3109132287,DE +3109132288,3109133311,TR +3109133312,3109134335,FR +3109134336,3109135359,GB +3109135360,3109136383,LT +3109136384,3109137407,GB +3109137408,3109138431,RU +3109138432,3109139455,GB +3109139456,3109140479,ES +3109140480,3109141503,RU +3109141504,3109143551,GB +3109143552,3109144575,GR +3109144576,3109145599,FR +3109145600,3109148671,AT +3109148672,3109149695,AZ +3109149696,3109150719,RU +3109150720,3109151743,BE +3109151744,3109152767,HR +3109152768,3109153791,GB +3109153792,3109154815,TR +3109154816,3109155839,AT +3109155840,3109156863,GB +3109156864,3109157887,RU +3109157888,3109158911,GB +3109158912,3109159935,IT +3109159936,3109160959,DE +3109160960,3109161983,GB +3109161984,3109163007,RU +3109163008,3109164031,AT +3109164032,3109165055,DE +3109165056,3109166079,RU +3109166080,3109167103,IR +3109167104,3109168127,LB +3109168128,3109169151,BG +3109169152,3109170175,DE +3109170176,3109171199,IE +3109171200,3109172223,GI +3109172224,3109172991,IL +3109172992,3109173247,US +3109173248,3109174271,ES +3109174272,3109175295,GB +3109175296,3109176319,IR +3109176320,3109177343,IL +3109177344,3109178367,IE +3109178368,3109179391,GB +3109179392,3109180415,ES +3109180416,3109181439,DE +3109181440,3109182463,NL +3109182464,3109183487,LT +3109183488,3109184255,LB +3109184256,3109184511,GB +3109184512,3109185535,CH +3109185536,3109187583,RS +3109187584,3109188607,IT +3109188608,3109189631,SA +3109189632,3109190655,AT +3109190656,3109191679,SE +3109191680,3109192703,CH +3109192704,3109193727,IT +3109193728,3109194751,IR +3109194752,3109195775,NL +3109195776,3109196799,FI +3109196800,3109197823,FR +3109197824,3109198847,NL +3109198848,3109199871,GB +3109199872,3109200895,DE +3109200896,3109201919,IR +3109201920,3109202943,IT +3109202944,3109203967,RO +3109203968,3109204991,RU +3109204992,3109206015,IR +3109206016,3109209087,NL +3109210112,3109211135,NL +3109211136,3109212159,CH +3109212160,3109213183,NL +3109213184,3109214207,CZ +3109214208,3109215231,BG +3109215232,3109216255,TR +3109216256,3109217279,IT +3109217280,3109218303,DK +3109218304,3109219327,HU +3109219328,3109220351,CZ +3109220352,3109221375,IE +3109222400,3109223423,PL +3109223424,3109224447,TR +3109224448,3109225471,RU +3109225472,3109226495,EE +3109226496,3109227519,NL +3109227520,3109228543,GB +3109228544,3109230591,NO +3109230592,3109231615,FR +3109231616,3109232639,IR +3109232640,3109233663,NL +3109233664,3109234687,GE +3109234688,3109235711,GB +3109235712,3109236735,PL +3109236736,3109237759,BE +3109237760,3109238783,GB +3109238784,3109239807,CZ +3109239808,3109240831,CH +3109240832,3109241855,GB +3109241856,3109242879,FR +3109242880,3109245951,IR +3109245952,3109246975,GB +3109246976,3109247999,IR +3109248000,3109249023,SE +3109249024,3109250047,NL +3109250048,3109251071,GB +3109251072,3109252095,ES +3109252096,3109253119,CH +3109253120,3109254143,IR +3109254144,3109255167,FI +3109255168,3109256191,GB +3109256192,3109257215,AZ +3109257216,3109258239,GB +3109258240,3109259263,ES +3109259264,3109260287,BE +3109260288,3109261311,DE +3109261312,3109262335,TR +3109262336,3109263359,GI +3109263360,3109264383,GB +3109264384,3109265407,US +3109265408,3109266431,ES +3109266432,3109267455,NO +3109267456,3109268479,GB +3109268480,3109269503,IT +3109269504,3109270527,GB +3109270528,3109272575,IR +3109272576,3109273599,FR +3109273600,3109274623,NO +3109274624,3109276671,IR +3109276672,3109277695,FI +3109277696,3109278719,IR +3109278720,3109279487,PT +3109279488,3109280767,NL +3109280768,3109281791,IL +3109281792,3109282815,HU +3109282816,3109283839,DE +3109283840,3109284863,IE +3109284864,3109285887,FR +3109285888,3109286911,RU +3109286912,3109287935,TR +3109287936,3109288959,PT +3109288960,3109289983,MK +3109289984,3109291007,NL +3109291008,3109292031,CH +3109292032,3109293055,IE +3109293056,3109294591,GB +3109294592,3109294847,FR +3109294848,3109295103,GB +3109295104,3109296127,DE +3109296128,3109297151,BE +3109297152,3109298175,SE +3109298176,3109299199,RU +3109299200,3109300223,NO +3109300224,3109301247,RU +3109301248,3109302271,ES +3109302272,3109303295,SY +3109303296,3109304319,SE +3109304320,3109305343,DE +3109305344,3109305599,DK +3109305600,3109305855,US +3109305856,3109306111,DK +3109306112,3109306367,LT +3109306368,3109307391,RO +3109307392,3109308415,IQ +3109308416,3109309439,NL +3109309440,3109310463,CH +3109310464,3109311487,DE +3109311488,3109312511,GB +3109312512,3109313535,IT +3109313536,3109314559,GB +3109314560,3109315583,IT +3109315584,3109316607,SI +3109316608,3109317631,LB +3109317632,3109318655,RU +3109318656,3109319679,FR +3109319680,3109320703,ES +3109320704,3109321727,DE +3109321728,3109322751,GR +3109322752,3109323775,ES +3109323776,3109324799,DK +3109324800,3109325823,PL +3109325824,3109326847,NL +3109326848,3109327871,BA +3109327872,3109328895,UA +3109328896,3109329919,CZ +3109329920,3109330943,RU +3109330944,3109331967,IR +3109331968,3109332991,SA +3109332992,3109334015,IT +3109334016,3109335039,RU +3109335040,3109336063,IT +3109336064,3109337087,TR +3109337088,3109339135,RU +3109339136,3109340159,CH +3109340160,3109341183,NL +3109341184,3109342207,GB +3109342208,3109343231,ES +3109343232,3109344255,CH +3109344256,3109345279,SE +3109345280,3109346303,DE +3109346304,3109347327,IR +3109347328,3109348351,LB +3109348352,3109349375,IT +3109349376,3109350399,CZ +3109350400,3109351423,SY +3109351424,3109352447,SE +3109352448,3109353471,RU +3109353472,3109354495,SE +3109354496,3109355519,IE +3109355520,3109356543,DE +3109356544,3109357567,DK +3109357568,3109358079,RU +3109358080,3109358591,GB +3109358592,3109359615,RU +3109359616,3109360639,NL +3109360640,3109362687,IT +3109362688,3109364735,AT +3109364736,3109365759,SK +3109365760,3109366783,GB +3109366784,3109367807,DK +3109367808,3109368831,DE +3109368832,3109369855,FI +3109369856,3109371903,GB +3109371904,3109372927,AT +3109372928,3109373951,IR +3109373952,3109374975,TR +3109374976,3109375999,FR +3109376000,3109377023,NL +3109377024,3109379071,GB +3109379072,3109380095,CZ +3109380096,3109381119,GB +3109381120,3109382143,SE +3109382144,3109383167,TR +3109383168,3109384191,CH +3109384192,3109385215,NL +3109385216,3109386239,GB +3109386240,3109387263,RU +3109387264,3109388287,CH +3109388288,3109389311,NO +3109389312,3109390335,DE +3109390336,3109391359,IR +3109391360,3109392383,NL +3109392384,3109393407,CH +3109393408,3109394431,SI +3109394432,3109395455,AL +3109395456,3109396479,SE +3109396480,3109397503,RU +3109397504,3109398527,CZ +3109398528,3109399551,CH +3109399552,3109400575,BE +3109400576,3109402623,RO +3109402624,3109403647,GB +3109403648,3109404671,TR +3109404672,3109405695,IT +3109405696,3109406719,GB +3109406720,3109407743,RO +3109407744,3109408767,TR +3109408768,3109409791,IR +3109409792,3109410815,IT +3109410816,3109411839,RU +3109411840,3109412863,DE +3109412864,3109413887,FR +3109413888,3109414911,CH +3109414912,3109415935,FR +3109415936,3109416959,TR +3109416960,3109419007,GB +3109419008,3109420031,CH +3109420032,3109421055,IT +3109421056,3109422079,UA +3109422080,3109423103,TR +3109423104,3109424127,ES +3109424128,3109425151,TR +3109425152,3109426175,BE +3109426176,3109426431,GB +3109426432,3109426687,US +3109426688,3109427199,GB +3109427200,3109427711,AT +3109427712,3109428223,GB +3109428224,3109429247,CH +3109429248,3109430271,ES +3109430272,3109431295,IR +3109431296,3109431807,IL +3109431808,3109432319,IT +3109432320,3109432831,MT +3109432832,3109433087,SE +3109433088,3109433343,MT +3109433344,3109435391,FR +3109435392,3109436415,UA +3109436416,3109437439,SM +3109437440,3109438463,RO +3109438464,3109439487,DK +3109439488,3109440511,ES +3109440512,3109441535,UA +3109441536,3109442559,TR +3109442560,3109443583,IT +3109443584,3109444607,FR +3109444608,3109445631,RU +3109445632,3109446655,CZ +3109446656,3109448703,SE +3109448704,3109449727,GB +3109449728,3109453823,RU +3109453824,3109454847,IT +3109454848,3109455871,RU +3109455872,3109456895,FR +3109456896,3109457919,PS +3109457920,3109458943,RU +3109458944,3109459711,SE +3109459712,3109459771,GB +3109459772,3109459772,LV +3109459773,3109459869,GB +3109459870,3109459870,LV +3109459871,3109459967,GB +3109459968,3109460991,TR +3109460992,3109462015,DE +3109462016,3109463039,LB +3109463040,3109464063,TR +3109464064,3109465087,FR +3109465088,3109466111,DE +3109466112,3109467135,FR +3109467136,3109468159,IR +3109468160,3109468415,ES +3109468416,3109468543,GB +3109468544,3109469183,ES +3109469184,3109470207,DE +3109470208,3109471231,AM +3109471232,3109472255,FR +3109472256,3109473279,IT +3109473280,3109474303,IL +3109474304,3109476351,ES +3109477376,3109478399,IS +3109478400,3109480447,CH +3109480448,3109481471,DE +3109481472,3109482495,MK +3109482496,3109483519,RS +3109483520,3109484543,TR +3109484544,3109485567,ES +3109485568,3109486591,FR +3109486592,3109487615,DE +3109487616,3109488639,BE +3109488640,3109489663,JE +3109489664,3109490687,SK +3109490688,3109491711,AT +3109491712,3109492735,DE +3109492736,3109493759,TR +3109493760,3109494783,IT +3109494784,3109495807,GB +3109495808,3109497335,AD +3109497336,3109497336,ES +3109497337,3109498879,AD +3109498880,3109499903,RU +3109499904,3109500927,NO +3109500928,3109502975,GB +3109502976,3109503999,LB +3109504000,3109505023,IT +3109505024,3109506047,DE +3109506048,3109507071,IT +3109507072,3109508095,DK +3109508096,3109509119,ES +3109509120,3109511167,FR +3109511168,3109512191,ES +3109512192,3109513215,FR +3109513216,3109514239,NL +3109514240,3109515263,FI +3109515264,3109516287,CH +3109516288,3109517311,NL +3109517312,3109518335,TR +3109518336,3109519359,BE +3109519360,3109520383,ES +3109520384,3109521407,DE +3109521408,3109522431,PL +3109522432,3109523455,CZ +3109523456,3109524479,PL +3109525504,3109527551,NL +3109527552,3109528575,IL +3109528576,3109529599,SE +3109529600,3109530623,LB +3109530624,3109531647,TR +3109531648,3109532671,DE +3109532672,3109533695,IR +3109533696,3109534719,NL +3109534720,3109535743,ES +3109535744,3109537791,RU +3109537792,3109538815,NL +3109538816,3109539839,LV +3109539840,3109541887,GB +3109541888,3109542911,EE +3109542912,3109543935,GB +3109543936,3109544959,DE +3109544960,3109545983,FR +3109545984,3109547007,PL +3109547008,3109548031,AT +3109548032,3109549055,IT +3109549056,3109550079,FI +3109550080,3109551103,NL +3109551104,3109552127,CY +3109552128,3109553151,ES +3109553152,3109554175,TR +3109554176,3109555199,RU +3109555200,3109556223,CZ +3109556224,3109557247,PT +3109557248,3109558271,GR +3109558272,3109559295,IQ +3109559296,3109560319,RO +3109560320,3109561343,KG +3109561344,3109562367,RU +3109562368,3109563391,NO +3109563392,3109564415,GB +3109564416,3109565439,IR +3109565440,3109566463,ES +3109566464,3109567487,GB +3109567488,3109568511,DE +3109568512,3109569535,NL +3109569536,3109570559,FR +3109570560,3109571583,CZ +3109571584,3109572607,CH +3109572608,3109573631,PS +3109573632,3109574655,IT +3109574656,3109575679,PS +3109575680,3109576703,DE +3109576704,3109578751,RU +3109578752,3109579775,FR +3109579776,3109580799,GB +3109580800,3109581823,SE +3109581824,3109582847,CH +3109582848,3109583871,BE +3109583872,3109584895,RU +3109584896,3109585919,RO +3109585920,3109586943,NL +3109586944,3109587967,SE +3109587968,3109588991,NL +3109588992,3109590015,DE +3109590016,3109591039,NL +3109591040,3109592063,IR +3109592064,3109594111,RU +3109594112,3109595135,NL +3109595136,3109596159,IT +3109596160,3109597183,TR +3109597184,3109598207,IR +3109598208,3109599231,NL +3109599232,3109600255,IT +3109600256,3109601279,NL +3109601280,3109602303,GB +3109602304,3109603327,FR +3109603328,3109604351,ES +3109604352,3109605375,IT +3109605376,3109606399,RU +3109606400,3109607423,DE +3109607424,3109608447,GB +3109608448,3109610495,DE +3109610496,3109611519,FO +3109611520,3109612543,ES +3109612544,3109613567,CH +3109613568,3109614591,IT +3109614592,3109615615,DE +3109615616,3109616639,CZ +3109616640,3109617663,IR +3109617664,3109618687,NO +3109618688,3109619711,NL +3109619712,3109621759,RU +3109621760,3109622783,NL +3109622784,3109623807,US +3109623808,3109624831,DE +3109624832,3109625855,ES +3109625856,3109626879,GB +3109626880,3109627903,DE +3109627904,3109628927,RU +3109628928,3109629951,IT +3109629952,3109630975,LV +3109630976,3109631999,FI +3109632000,3109633023,DE +3109633024,3109634047,ES +3109634048,3109635071,PL +3109635072,3109636095,FR +3109636096,3109637119,IE +3109637120,3109637887,NL +3109637888,3109638143,RU +3109638144,3109639167,NL +3109639168,3109640191,LB +3109640192,3109641215,IQ +3109641216,3109642239,NO +3109643264,3109643391,DE +3109643392,3109643519,UA +3109643520,3109643775,RU +3109643776,3109644031,UA +3109644032,3109644287,ES +3109644288,3109646335,RU +3109646336,3109647359,IR +3109647360,3109648383,CZ +3109648384,3109649407,GB +3109649408,3109650431,BG +3109650432,3109651455,FR +3109651456,3109652479,NL +3109652480,3109653503,MT +3109653504,3109654527,GB +3109654528,3109655551,CH +3109655552,3109656575,AT +3109656576,3109657599,NL +3109657600,3109658623,AL +3109658624,3109659647,AT +3109659648,3109661695,FR +3109661696,3109662719,NL +3109662720,3109663743,PL +3109663744,3109664767,IT +3109664768,3109665791,PL +3109665792,3109666815,CH +3109666816,3109667839,PT +3109667840,3109668863,DE +3109668864,3109669887,CH +3109669888,3109670911,GB +3109670912,3109671935,DE +3109671936,3109672959,HR +3109672960,3109673215,US +3109673216,3109673450,GB +3109673451,3109673451,NO +3109673452,3109673703,GB +3109673704,3109673704,IN +3109673705,3109673727,GB +3109673728,3109673983,AU +3109673984,3109675007,FR +3109675008,3109677055,DE +3109677056,3109678079,BE +3109678080,3109679103,MT +3109679104,3109680127,RO +3109680128,3109681151,MK +3109681152,3109681407,TR +3109681408,3109681663,MX +3109681664,3109681919,BR +3109681920,3109682175,CZ +3109682176,3109683199,CH +3109683200,3109684223,GB +3109684224,3109685247,TR +3109685248,3109686271,IT +3109686272,3109687295,GB +3109687296,3109688319,SA +3109688320,3109689343,AT +3109689344,3109690367,SE +3109690368,3109691391,ES +3109691392,3109692415,GB +3109692416,3109693439,CH +3109693440,3109694463,AT +3109694464,3109695487,GR +3109695488,3109696511,DE +3109696512,3109697535,DK +3109697536,3109698559,PT +3109698560,3109699071,NO +3109699072,3109699199,DE +3109699200,3109699583,CA +3109699584,3109700607,DK +3109700608,3109701631,IT +3109701632,3109702655,KZ +3109702656,3109703679,IE +3109703680,3109704703,TR +3109704704,3109705727,HU +3109705728,3109706751,SA +3109706752,3109707775,AT +3109707776,3109708799,FR +3109708800,3109709823,RU +3109709824,3109710847,IQ +3109710848,3109711871,CH +3109711872,3109712895,DK +3109712896,3109713919,IT +3109713920,3109714943,GB +3109714944,3109715967,PS +3109715968,3109716991,DE +3109716992,3109718015,RS +3109718016,3109719039,NL +3109719040,3109720063,GB +3109720064,3109721087,RU +3109721088,3109722111,ES +3109722112,3109723135,CH +3109723136,3109725183,DE +3109725184,3109726207,SK +3109726208,3109727231,LB +3109727232,3109728255,DE +3109728256,3109729279,SE +3109729280,3109730303,NO +3109730304,3109731327,BE +3109731328,3109732351,IT +3109732352,3109733375,GB +3109733376,3109734399,NL +3109734400,3109735423,DE +3109735424,3109737471,ES +3109737472,3109738495,NO +3109738496,3109739519,GB +3109739520,3109740543,NL +3109740544,3109741567,RU +3109741568,3109743615,DE +3109743616,3109744639,HU +3109744640,3109745663,TR +3109745664,3109746687,US +3109747712,3109748735,ES +3109748736,3109749759,MT +3109749760,3109750783,DE +3109750784,3109752831,NL +3109752832,3109753855,IQ +3109753856,3109754879,GB +3109754880,3109755903,DE +3109755904,3109756927,NL +3109756928,3109757951,AT +3109757952,3109758975,FR +3109758976,3109759999,GB +3109760000,3109762047,DE +3109762048,3109763071,RU +3109763072,3109765119,IT +3109765120,3109766143,NO +3109766144,3109767167,ES +3109768192,3109769215,GB +3109769216,3109770239,AT +3109770240,3109771263,GB +3109771264,3109772287,FR +3109772288,3109773311,NL +3109773312,3109774335,LB +3109774336,3109775359,GB +3109775360,3109776383,DE +3109776384,3109777407,ES +3109777408,3109778431,GB +3109778432,3109779455,CZ +3109779456,3109782527,GB +3109782528,3109783551,KG +3109783552,3109784575,ES +3109784576,3109785599,HU +3109785600,3109786623,AT +3109786624,3109787647,IT +3109787648,3109788671,NO +3109788672,3109789695,BA +3109789696,3109790719,IT +3109790720,3109792767,CZ +3109792768,3109795839,RU +3109795840,3109796863,HU +3109796864,3109797887,IT +3109797888,3109798911,ES +3109798912,3109799935,DE +3109799936,3109800959,SK +3109800960,3109801983,CZ +3109801984,3109803007,AZ +3109803008,3109804031,PL +3109804032,3109805055,GB +3109805056,3109807103,FR +3109807104,3109808127,ES +3109808128,3109809151,RE +3109809152,3109810175,GB +3109810176,3109811199,IT +3109811200,3109812223,DE +3109812224,3109813247,NL +3109813248,3109814271,RU +3109814272,3109815295,TR +3109815296,3109817343,IR +3109817344,3109818367,TR +3109818368,3109819391,NL +3109819392,3109820415,FR +3109820416,3109820671,KR +3109820672,3109820927,GB +3109820928,3109821183,CA +3109821184,3109821439,GB +3109821440,3109822463,SY +3109822464,3109823487,RU +3109823488,3109824511,FR +3109824512,3109825535,IR +3109825536,3109826559,ES +3109826560,3109827583,PL +3109827584,3109828607,NO +3109828608,3109829631,GE +3109829632,3109830655,NL +3109830656,3109831679,CH +3109831680,3109833727,NL +3109833728,3109834751,DE +3109834752,3109835775,ES +3109835776,3109836799,AM +3109836800,3109837823,SY +3109837824,3109838847,ES +3109838848,3109839871,PT +3109839872,3109840895,AT +3109840896,3109841919,IT +3109841920,3109842943,ES +3109842944,3109843967,FI +3109843968,3109844991,HU +3109844992,3109845503,DE +3109845504,3109845759,GB +3109845760,3109846015,DE +3109846016,3109847039,CH +3109847040,3109848063,AE +3109848064,3109849087,BG +3109849088,3109852159,RU +3109852160,3109853183,NL +3109853184,3109854207,DE +3109854208,3109855231,PL +3109855232,3109856255,DE +3109856256,3109857279,IT +3109857280,3109858303,DE +3109859328,3109860351,SI +3109860352,3109861375,DE +3109861376,3109862399,RU +3109862400,3109863423,DE +3109863424,3109864447,RO +3109864448,3109865471,BE +3109865472,3109866495,AT +3109866496,3109867519,DE +3109867520,3109868543,CH +3109868544,3109869567,TR +3109869568,3109870591,CZ +3109870592,3109871615,NL +3109871616,3109872639,AZ +3109872640,3109872895,SI +3109872896,3109873151,SE +3109873152,3109874687,SI +3109874688,3109875711,ES +3109875712,3109876735,DK +3109876736,3109877759,ES +3109877760,3109878783,PL +3109878784,3109879807,GB +3109879808,3109880319,US +3109880320,3109880575,FR +3109880576,3109880831,ES +3109880832,3109881855,FR +3109881856,3109882879,AT +3109882880,3109883903,NL +3109883904,3109884927,RO +3109884928,3109885951,GL +3109885952,3109886975,NL +3109886976,3109887999,GB +3109888000,3109888255,CZ +3109888256,3109888767,PL +3109888768,3109889023,RU +3109889024,3109890047,FR +3109890048,3109891071,RU +3109891072,3109892095,ES +3109892096,3109893119,FI +3109893120,3109894143,TR +3109894144,3109894399,DE +3109894400,3109894655,HK +3109894656,3109895167,DE +3109895168,3109896191,CZ +3109896192,3109897215,HU +3109897216,3109898239,TR +3109898240,3109899263,PL +3109899264,3109900287,NL +3109900288,3109901311,ES +3109901312,3109902335,DK +3109902336,3109903359,GB +3109903360,3109904383,PL +3109904384,3109905407,RO +3109905408,3109906431,RS +3109906432,3109907455,SI +3109907456,3109908479,RU +3109908480,3109909503,ES +3109909504,3109910527,DE +3109910528,3109911551,ES +3109911552,3109912575,UZ +3109912576,3109913599,FR +3109913600,3109914623,PL +3109914624,3109916671,DE +3109916672,3109917695,IT +3109917696,3109918719,IE +3109918720,3109919743,ES +3109919744,3109920767,IS +3109920768,3109921791,SE +3109921792,3109922815,IR +3109922816,3109923839,GB +3109924864,3109925887,IT +3109925888,3109926143,DE +3109926144,3109926175,FR +3109926176,3109926207,IT +3109926208,3109926255,ES +3109926256,3109926271,IT +3109926272,3109926279,GB +3109926280,3109926287,DE +3109926288,3109926335,ES +3109926336,3109926399,GB +3109926400,3109926655,ES +3109926656,3109926911,IT +3109926912,3109927935,UA +3109927936,3109928959,DE +3109928960,3109929983,DK +3109929984,3109931007,AE +3109931008,3109932031,DE +3109932032,3109933055,IT +3109933056,3109934079,RU +3109934080,3109935103,AT +3109935104,3109937151,CH +3109937152,3109938175,ES +3109938176,3109939199,GB +3109939200,3109940223,ES +3109940224,3109941247,DE +3109941248,3109942271,PL +3109942272,3109943295,AE +3109943296,3109944319,TR +3109944320,3109945343,RU +3109945344,3109946367,LU +3109946368,3109947391,CZ +3109947392,3109948415,CH +3109948416,3109949439,SE +3109949440,3109949695,IT +3109949696,3109950207,GB +3109950208,3109950463,DE +3109950464,3109951487,IT +3109951488,3109952511,DE +3109952512,3109952767,US +3109952768,3109953023,NL +3109953024,3109953279,CA +3109953280,3109953280,GB +3109953281,3109953282,US +3109953283,3109953283,GB +3109953284,3109953287,IT +3109953288,3109953291,US +3109953292,3109953292,HK +3109953293,3109953319,GB +3109953320,3109953323,MX +3109953324,3109953359,GB +3109953360,3109953363,SG +3109953364,3109953375,GB +3109953376,3109953383,US +3109953384,3109953471,GB +3109953472,3109953475,HK +3109953476,3109953483,GB +3109953484,3109953487,AU +3109953488,3109953491,GB +3109953492,3109953495,AU +3109953496,3109953531,GB +3109953532,3109953535,CA +3109953536,3109954559,RU +3109954560,3109955583,DE +3109956608,3109957631,IE +3109957632,3109958655,ES +3109958656,3109959679,CZ +3109959680,3109960703,FR +3109960704,3109961727,SE +3109962752,3109963775,PL +3109963776,3109964799,SE +3109964800,3109965823,GI +3109965824,3109966847,IT +3109966848,3109967871,RU +3109967872,3109968895,IT +3109968896,3109969919,NL +3109969920,3109970943,IR +3109970944,3109971967,CH +3109971968,3109972991,DE +3109972992,3109974015,RU +3109974016,3109975039,EE +3109975040,3109976063,GB +3109976064,3109977087,NL +3109977088,3109978111,GB +3109978112,3109979135,SE +3109979136,3109980159,IT +3109980160,3109981183,BE +3109981184,3109982207,FR +3109982208,3109984255,CH +3109984256,3109985279,RU +3109985280,3109986303,SK +3109986304,3109987327,IT +3109987328,3109988351,RU +3109988352,3109989375,NL +3109989376,3109990399,RU +3109990400,3109991423,GB +3109991424,3109992447,NL +3109992448,3109993471,GB +3109993472,3109993727,NL +3109993728,3109993983,FR +3109993984,3109994239,HU +3109994240,3109994495,GB +3109994496,3109994751,BG +3109994752,3109995007,IT +3109995008,3109995136,DE +3109995137,3109995285,GB +3109995286,3109995287,US +3109995288,3109995313,GB +3109995314,3109995315,US +3109995316,3109995519,GB +3109995520,3109996543,NL +3109996544,3109997567,IE +3109997568,3109998591,GB +3109998592,3109999615,NL +3109999616,3110001663,UA +3110001664,3110002687,FR +3110002688,3110003711,RU +3110003712,3110004735,NL +3110004736,3110005759,GB +3110005760,3110006783,NL +3110006784,3110007807,NO +3110007808,3110008831,NL +3110008832,3110009855,ES +3110009856,3110010879,DE +3110010880,3110011903,TR +3110011904,3110012927,KW +3110012928,3110013951,FR +3110013952,3110014975,NL +3110014976,3110015999,GB +3110016000,3110017023,UA +3110017024,3110018303,NL +3110018304,3110018559,US +3110018560,3110019071,NL +3110019072,3110020095,DE +3110020096,3110021119,IT +3110021120,3110022143,IE +3110022144,3110023167,NL +3110023168,3110024191,GB +3110024192,3110025215,IT +3110025216,3110026239,ES +3110026240,3110027263,IR +3110027264,3110028287,BE +3110028288,3110029311,NL +3110029312,3110030335,BE +3110030336,3110031359,GB +3110031360,3110032383,DE +3110032384,3110033407,TR +3110033408,3110035455,SE +3110035456,3110036479,DE +3110036480,3110038527,RU +3110038528,3110039551,GB +3110039552,3110040575,DE +3110040576,3110041599,CZ +3110041600,3110042623,TR +3110043648,3110044671,DE +3110044672,3110046719,IT +3110046720,3110047743,SA +3110047744,3110048767,IT +3110048768,3110049791,SE +3110049792,3110050815,IR +3110050816,3110051839,BG +3110051840,3110052863,SE +3110052864,3110054911,TR +3110054912,3110055935,GB +3110055936,3110056959,NL +3110056960,3110057983,IR +3110057984,3110059007,IQ +3110059008,3110060031,RU +3110060032,3110061055,DE +3110061056,3110062079,PL +3110062080,3110063103,DE +3110063104,3110063871,IQ +3110063872,3110064127,US +3110064128,3110065151,AT +3110065152,3110066175,DE +3110066176,3110067199,CH +3110067200,3110068223,PT +3110068224,3110069247,IT +3110069248,3110070271,RU +3110070272,3110073343,IT +3110073344,3110074367,GB +3110074368,3110075391,BG +3110075392,3110076415,LB +3110076416,3110077439,RU +3110077440,3110078463,NL +3110078464,3110079487,PL +3110079488,3110080511,DE +3110080512,3110081535,GB +3110081536,3110082559,IT +3110082560,3110083583,ES +3110084608,3110085631,GR +3110085632,3110086655,RU +3110086656,3110087679,NO +3110087680,3110088703,NL +3110088704,3110089727,GB +3110090752,3110091775,DE +3110091776,3110093823,GB +3110093824,3110094847,JO +3110094848,3110095871,NO +3110095872,3110096895,CH +3110096896,3110098943,RU +3110098944,3110099967,DK +3110099968,3110100991,GB +3110100992,3110102015,IT +3110102016,3110103039,AT +3110103040,3110104063,FR +3110104064,3110105087,SY +3110105088,3110106111,TR +3110106112,3110107135,IT +3110107136,3110108159,PL +3110108160,3110109183,AZ +3110109184,3110110207,IT +3110110208,3110111231,RU +3110111232,3110112255,TR +3110112256,3110113279,NL +3110113280,3110114303,SE +3110114304,3110115327,NL +3110115328,3110116351,SE +3110116352,3110117375,FR +3110117376,3110118399,RO +3110118400,3110119423,BG +3110119424,3110120447,TR +3110120448,3110121471,PT +3110121472,3110122495,MD +3110122496,3110123519,DK +3110123520,3110124543,FR +3110124544,3110125567,UA +3110125568,3110126591,TR +3110126592,3110127615,DE +3110127616,3110128639,GB +3110128640,3110129663,IT +3110129664,3110130687,RS +3110130688,3110131711,DE +3110131712,3110132735,IT +3110132736,3110133759,GB +3110133760,3110134783,QA +3110134784,3110135807,KW +3110135808,3110136831,ES +3110136832,3110137855,DE +3110137856,3110138879,IR +3110138880,3110139903,GB +3110139904,3110140927,SE +3110140928,3110141951,BG +3110141952,3110142975,RU +3110142976,3110143999,DE +3110144000,3110145023,TR +3110145024,3110146047,IT +3110146048,3110147071,PL +3110147072,3110148095,GB +3110148096,3110149119,CZ +3110149120,3110150143,GB +3110150144,3110151167,SE +3110151168,3110152191,EE +3110152192,3110153215,DE +3110153216,3110154239,LT +3110154240,3110155263,LB +3110155264,3110156287,SI +3110156288,3110157311,KZ +3110157312,3110158335,GB +3110158336,3110159359,PS +3110159360,3110160383,SI +3110160384,3110161407,BG +3110161408,3110162431,RU +3110162432,3110163455,IE +3110163456,3110164479,NO +3110164480,3110165503,GB +3110165504,3110166527,LB +3110166528,3110167551,DE +3110167552,3110168575,FR +3110168576,3110169599,LB +3110169600,3110170623,IT +3110170624,3110171647,KZ +3110171648,3110172671,IR +3110172672,3110173695,IT +3110173696,3110173951,IL +3110173952,3110174207,PS +3110174208,3110174719,IL +3110174720,3110175743,SE +3110175744,3110176767,PS +3110176768,3110177791,CH +3110177792,3110178815,FR +3110178816,3110179839,GB +3110179840,3110180863,LT +3110180864,3110181887,GB +3110181888,3110182911,IT +3110182912,3110183935,GB +3110183936,3110184959,RU +3110184960,3110185984,ES +3110185985,3110187007,DE +3110187008,3110187263,BE +3110187264,3110189055,DE +3110189056,3110190079,FR +3110190080,3110193151,NO +3110193152,3110194175,RU +3110194176,3110195199,FR +3110195200,3110196223,HU +3110196224,3110196479,LT +3110196480,3110196735,GB +3110196736,3110196991,SE +3110196992,3110197247,NO +3110197248,3110199295,IT +3110199296,3110200319,DE +3110200320,3110201343,NL +3110201344,3110202367,IT +3110202368,3110203391,IE +3110203392,3110204415,DE +3110204416,3110205439,BE +3110205440,3110206463,EE +3110206464,3110207487,RU +3110207488,3110208511,BA +3110208512,3110209535,KZ +3110209536,3110210559,IT +3110210560,3110211583,HR +3110211584,3110212607,ES +3110212608,3110213631,FR +3110213632,3110214655,IQ +3110214656,3110215679,CH +3110215680,3110216703,ES +3110216704,3110217215,DK +3110217216,3110217471,DE +3110217472,3110217727,DK +3110217728,3110218751,RU +3110218752,3110219775,GB +3110219776,3110220799,DE +3110220800,3110221823,NL +3110221824,3110222847,DE +3110222848,3110223871,TR +3110223872,3110224895,FR +3110224896,3110225919,AT +3110225920,3110226943,CH +3110226944,3110227967,KZ +3110227968,3110230015,RU +3110230016,3110231039,KZ +3110231040,3110232063,DE +3110232064,3110233087,DK +3110233088,3110233119,NL +3110233120,3110234111,GR +3110234880,3110235135,CY +3110235136,3110236159,GB +3110236160,3110237183,IR +3110237184,3110238207,FR +3110238208,3110239231,CH +3110239232,3110240255,NL +3110240256,3110241279,FR +3110241280,3110242303,GR +3110242304,3110243327,FR +3110243328,3110244351,DE +3110244352,3110245375,NL +3110245376,3110246399,GB +3110246400,3110247423,CH +3110247424,3110249471,GB +3110249472,3110250495,IT +3110250496,3110254591,GB +3110254592,3110255615,DE +3110255616,3110256639,GB +3110256640,3110257663,SE +3110257664,3110259711,GB +3110259712,3110260735,LB +3110260736,3110261759,SK +3110261760,3110262783,GB +3110262784,3110263807,TR +3110263808,3110265855,JO +3110265856,3110266879,FI +3110266880,3110267903,ES +3110267904,3110269951,DE +3110269952,3110270975,SE +3110270976,3110271999,PT +3110272000,3110273023,TR +3110273024,3110274047,BA +3110274048,3110277119,RU +3110277120,3110278143,LB +3110278144,3110279167,TR +3110279168,3110279199,PL +3110279200,3110279231,DE +3110279232,3110279295,GB +3110279296,3110279303,FR +3110279304,3110279311,IT +3110279312,3110279319,SE +3110279320,3110279327,BE +3110279328,3110279335,IE +3110279336,3110279343,CZ +3110279344,3110279347,NO +3110279348,3110279351,LI +3110279352,3110279355,AT +3110279356,3110279359,DK +3110279360,3110279363,FI +3110279364,3110279367,PT +3110279368,3110279371,GR +3110279372,3110279375,RO +3110279376,3110279379,HU +3110279380,3110279383,LU +3110279384,3110279387,BG +3110279388,3110279391,HR +3110279392,3110279395,SI +3110279396,3110279399,LT +3110279400,3110279403,LV +3110279404,3110279407,EE +3110279408,3110279411,CY +3110279412,3110279415,MT +3110279416,3110279419,SK +3110279420,3110279423,IS +3110279424,3110279455,ES +3110279456,3110279487,NL +3110279488,3110279679,GB +3110279680,3110279711,ES +3110279712,3110279743,NL +3110279744,3110279807,GB +3110279808,3110279815,FR +3110279816,3110279823,IT +3110279824,3110279831,SE +3110279832,3110279839,BE +3110279840,3110279847,IE +3110279848,3110279855,CZ +3110279856,3110279859,NO +3110279860,3110279863,LI +3110279864,3110279867,AT +3110279868,3110279871,DK +3110279872,3110279875,FI +3110279876,3110279879,PT +3110279880,3110279883,GR +3110279884,3110279887,RO +3110279888,3110279891,HU +3110279892,3110279895,LU +3110279896,3110279899,BG +3110279900,3110279903,HR +3110279904,3110279907,SI +3110279908,3110279911,LT +3110279912,3110279915,LV +3110279916,3110279919,EE +3110279920,3110279923,CY +3110279924,3110279927,MT +3110279928,3110279931,SK +3110279932,3110279935,IS +3110279936,3110279967,PL +3110279968,3110279999,DE +3110280000,3110280191,GB +3110280192,3110281215,RU +3110281216,3110282239,LB +3110282240,3110283263,SE +3110284288,3110285311,PS +3110285312,3110286335,BE +3110286336,3110288383,DE +3110288384,3110289407,ES +3110289408,3110291455,CZ +3110291456,3110292479,AT +3110292480,3110293503,GB +3110293504,3110294527,AT +3110294528,3110295551,GB +3110295552,3110296575,RO +3110297600,3110298623,NL +3110298624,3110299647,SY +3110299648,3110300671,PL +3110300672,3110301695,IE +3110301696,3110302719,FR +3110302720,3110303743,CZ +3110303744,3110304767,DK +3110304768,3110305791,KZ +3110305792,3110306815,NL +3110306816,3110307327,NZ +3110307328,3110307452,GB +3110307453,3110307453,NL +3110307454,3110307583,GB +3110307584,3110307683,BY +3110307684,3110307684,BR +3110307685,3110307839,BY +3110307840,3110308863,IE +3110308864,3110309887,RU +3110309888,3110310911,DE +3110310912,3110311935,FR +3110311936,3110315007,UA +3110315008,3110316031,GB +3110316032,3110317055,RU +3110317056,3110318079,PL +3110318080,3110319103,CZ +3110319104,3110320127,US +3110320128,3110321151,ES +3110321152,3110322175,SE +3110322176,3110323199,PL +3110323200,3110324223,IT +3110324224,3110325247,GB +3110325248,3110326271,NL +3110326272,3110327295,DE +3110327296,3110328319,IR +3110328320,3110329343,FR +3110329344,3110330367,LB +3110330368,3110331391,IT +3110331392,3110332415,DE +3110332416,3110333439,PT +3110333440,3110334463,GB +3110334464,3110335487,ES +3110335488,3110336511,GB +3110336512,3110337535,GE +3110337536,3110338559,US +3110338560,3110339583,CH +3110339584,3110340607,FR +3110340608,3110341631,DE +3110341632,3110343679,IT +3110343680,3110344703,IQ +3110344704,3110345727,RU +3110345728,3110346751,FR +3110346752,3110347775,IT +3110347776,3110348799,NL +3110348800,3110349823,US +3110349824,3110350847,IR +3110350848,3110351871,DE +3110351872,3110352895,RU +3110352896,3110353919,NL +3110353920,3110354943,GB +3110354944,3110355967,KZ +3110355968,3110356991,GB +3110356992,3110358015,ES +3110358016,3110359039,GE +3110359040,3110360063,IT +3110360064,3110360575,RO +3110360576,3110360831,FI +3110360832,3110361087,RO +3110361088,3110362111,ES +3110362112,3110363135,CZ +3110363136,3110364159,KW +3110364160,3110364671,RU +3110364672,3110364927,UA +3110364928,3110366207,RU +3110366208,3110371327,IT +3110371328,3110372351,NL +3110372352,3110373375,LU +3110373376,3110374399,ES +3110374400,3110375423,NL +3110375424,3110376447,AT +3110376448,3110377471,GB +3110377472,3110378495,SA +3110378496,3110379519,RU +3110379520,3110380543,DE +3110380544,3110381567,IT +3110381568,3110382591,LB +3110382592,3110382847,GB +3110382848,3110383103,US +3110383104,3110383359,GB +3110383360,3110383615,US +3110383616,3110384639,IT +3110384640,3110385663,ES +3110385664,3110386687,FR +3110386688,3110387711,GB +3110387712,3110388735,NL +3110388736,3110389759,CZ +3110389760,3110390783,LB +3110390784,3110391807,NO +3110391808,3110392831,AE +3110392832,3110393087,GB +3110393088,3110393343,IE +3110393344,3110393599,GB +3110393600,3110393855,IE +3110393856,3110394879,LB +3110394880,3110395391,GB +3110395392,3110395647,RU +3110395648,3110395648,SA +3110395649,3110395903,RU +3110395904,3110396927,KZ +3110396928,3110397951,PL +3110397952,3110398975,NL +3110398976,3110399999,IT +3110400000,3110401023,AT +3110401024,3110402047,MK +3110402048,3110403071,GB +3110403072,3110404095,IT +3110404096,3110405119,NO +3110405120,3110406143,DE +3110406144,3110407167,LI +3110407168,3110408191,GB +3110408192,3110409215,LB +3110409216,3110410239,KZ +3110410240,3110411263,RU +3110411264,3110412287,FR +3110412288,3110413311,NO +3110413312,3110414335,IT +3110414336,3110415359,NL +3110415360,3110416383,GB +3110416384,3110417407,LI +3110417408,3110418431,DE +3110418432,3110419455,SE +3110419456,3110420479,NL +3110420480,3110421503,FR +3110421504,3110422015,RU +3110422016,3110422271,US +3110422272,3110422527,RU +3110422528,3110423551,PL +3110423552,3110425599,GB +3110425600,3110426623,IE +3110426624,3110427647,DK +3110427648,3110428671,DE +3110428672,3110429695,US +3110429696,3110430719,DE +3110430720,3110431743,RO +3110431744,3110432767,NL +3110432768,3110433791,DE +3110433792,3110434815,CH +3110434816,3110435839,GB +3110435840,3110436863,SE +3110436864,3110437887,PL +3110437888,3110438911,DE +3110438912,3110439935,GE +3110439936,3110440959,SK +3110440960,3110441983,BE +3110441984,3110443007,GB +3110443008,3110444031,DK +3110444032,3110445055,CH +3110445056,3110447103,ES +3110447104,3110448127,RO +3110448128,3110449151,DE +3110449152,3110450175,PT +3110450176,3110451199,FR +3110451200,3110452223,DE +3110452224,3110453247,PL +3110453248,3110454271,GB +3110454272,3110455295,NL +3110455296,3110457343,RU +3110457344,3110458367,FR +3110458368,3110459391,IT +3110459392,3110459392,IL +3110459393,3110459647,EE +3110459648,3110459903,FR +3110459904,3110460159,US +3110460160,3110460415,IT +3110460416,3110461439,CZ +3110461440,3110462463,GB +3110462464,3110463487,IR +3110463488,3110464511,PL +3110464512,3110465535,IQ +3110465536,3110466559,IE +3110466560,3110467583,NL +3110467584,3110468607,DE +3110468608,3110469631,NL +3110469632,3110470655,IL +3110470656,3110471679,NL +3110471680,3110472703,RU +3110472704,3110473727,AT +3110473728,3110474751,SE +3110474752,3110475775,CZ +3110475776,3110476799,NL +3110476800,3110477823,NO +3110477824,3110478847,SE +3110478848,3110479871,TR +3110479872,3110480895,IT +3110480896,3110481919,NL +3110481920,3110482943,RO +3110482944,3110483967,NO +3110483968,3110487039,DE +3110487040,3110488063,NL +3110488064,3110489087,KZ +3110489088,3110490111,CZ +3110490112,3110491135,FR +3110491136,3110492159,GB +3110492160,3110493183,RO +3110493184,3110494207,DE +3110494208,3110495231,CZ +3110495232,3110496255,SE +3110496256,3110497279,DE +3110497280,3110498303,NO +3110498304,3110499327,RU +3110499328,3110500351,KZ +3110500352,3110501375,RU +3110501376,3110502399,RS +3110502400,3110503423,KZ +3110503424,3110504447,GB +3110504448,3110505471,RU +3110505472,3110506495,IT +3110506496,3110507519,GE +3110507520,3110508543,GB +3110508544,3110509567,DE +3110509568,3110510591,RO +3110510592,3110511615,FR +3110511616,3110512639,UA +3110512640,3110514687,ES +3110514688,3110515711,FR +3110515712,3110516735,RU +3110516736,3110517759,UA +3110517760,3110518783,PL +3110518784,3110521855,GB +3110521856,3110523903,ES +3110523904,3110524927,SE +3110524928,3110525439,US +3110525440,3110525695,NL +3110525696,3110525951,DE +3110526976,3110527999,DE +3110528000,3110529023,AT +3110529024,3110530047,FI +3110530048,3110531071,RS +3110531072,3110532095,DE +3110532096,3110534143,GB +3110534144,3110535167,DE +3110535168,3110536191,LU +3110536192,3110537215,GB +3110537216,3110538239,ES +3110538240,3110539263,LB +3110539264,3110540287,NL +3110540288,3110541311,LB +3110541312,3110542335,RU +3110542336,3110543359,HK +3110543360,3110544383,NL +3110544384,3110545407,ES +3110545408,3110546431,UA +3110546432,3110547455,DE +3110547456,3110547967,SE +3110547968,3110548223,JP +3110548224,3110548479,DE +3110548480,3110549503,IT +3110549504,3110550527,NL +3110550528,3110551551,RU +3110551552,3110552575,FR +3110552576,3110553599,RU +3110553600,3110554623,DE +3110554624,3110555647,NL +3110555648,3110556671,IT +3110556672,3110557695,IR +3110557696,3110558719,LB +3110558720,3110559743,DE +3110559744,3110560767,GB +3110560768,3110561791,RU +3110561792,3110562815,IE +3110562816,3110563071,RU +3110563072,3110563327,US +3110563328,3110563583,FI +3110563584,3110563839,RU +3110563840,3110564863,IT +3110564864,3110565887,GB +3110565888,3110566911,DK +3110566912,3110567935,ES +3110567936,3110568959,IR +3110568960,3110569983,RU +3110569984,3110571007,RS +3110571008,3110572031,FR +3110572032,3110573055,SK +3110573056,3110574079,ES +3110574080,3110575103,PL +3110575104,3110575359,NL +3110575360,3110575615,US +3110575616,3110576127,NL +3110576128,3110578175,RU +3110578176,3110579199,KZ +3110579200,3110580223,NL +3110580224,3110581247,KZ +3110581248,3110582271,ES +3110582272,3110583295,KZ +3110583296,3110584319,SE +3110584320,3110585343,DE +3110585344,3110586367,TR +3110586368,3110587391,NL +3110587392,3110588415,ES +3110588416,3110590463,SE +3110590464,3110591487,HR +3110591488,3110592511,GB +3110592512,3110593535,DE +3110593536,3110594303,GB +3110594304,3110594559,SE +3110594560,3110595583,DE +3110595584,3110596607,NL +3110596608,3110597119,SE +3110597120,3110597631,NL +3110597632,3110599679,IR +3110599680,3110600191,RU +3110600192,3110600703,UA +3110600704,3110601727,GR +3110601728,3110602751,RU +3110602752,3110603775,NL +3110603776,3110604799,RU +3110604800,3110605823,CH +3110605824,3110606847,TR +3110606848,3110607871,IT +3110607872,3110608895,NL +3110608896,3110611967,RO +3110611968,3110612991,GB +3110612992,3110615039,RO +3110615040,3110616063,QA +3110616064,3110617087,ES +3110617088,3110618111,PL +3110618112,3110619135,LB +3110619136,3110620159,DE +3110620160,3110621183,FR +3110621184,3110622207,GB +3110622208,3110623231,CH +3110623232,3110624255,DE +3110624256,3110625279,RU +3110625280,3110626303,GB +3110626304,3110627327,NL +3110627328,3110628351,RU +3110628352,3110629375,LU +3110629376,3110630399,RU +3110630400,3110631423,IT +3110631424,3110632447,GB +3110632448,3110633471,IT +3110633472,3110634495,NL +3110634496,3110635007,ES +3110635008,3110636543,NL +3110636544,3110637567,DE +3110637568,3110638591,GR +3110638592,3110639615,RU +3110639616,3110640639,ES +3110640640,3110641663,IQ +3110641664,3110642687,DE +3110642688,3110643711,ES +3110643712,3110644735,LU +3110644736,3110645759,RU +3110645760,3110646783,LT +3110646784,3110647807,RO +3110647808,3110648047,DE +3110648048,3110648055,PL +3110648056,3110648063,DK +3110648064,3110648319,FR +3110648320,3110648575,BE +3110648576,3110648831,HU +3110648832,3110649855,NL +3110649856,3110650879,IR +3110650880,3110651903,RO +3110651904,3110652927,GG +3110652928,3110653951,DE +3110653952,3110654975,CZ +3110654976,3110655999,RU +3110656000,3110657023,IE +3110657024,3110658047,GI +3110658048,3110659071,AT +3110659072,3110661119,IR +3110661120,3110662143,ES +3110662144,3110663167,IR +3110663168,3110664191,LB +3110664192,3110665215,RU +3110665216,3110666239,LB +3110667264,3110668287,RO +3110668288,3110669311,PL +3110669312,3110671359,ES +3110671360,3110672383,AT +3110672384,3110673407,ES +3110673408,3110674431,FR +3110674432,3110675455,GB +3110675456,3110676479,RO +3110676480,3110677503,DE +3110677504,3110679551,RU +3110679552,3110680575,BE +3110680576,3110681599,GB +3110681600,3110682623,SE +3110682624,3110683647,GB +3110684672,3110685695,GB +3110685696,3110686719,NL +3110686720,3110687743,BE +3110687744,3110688767,RO +3110688768,3110689791,UA +3110689792,3110690815,IT +3110690816,3110691839,GB +3110691840,3110692863,IR +3110692864,3110693887,IT +3110693888,3110694911,RU +3110694912,3110695935,DE +3110695936,3110696959,UA +3110696960,3110697983,IR +3110697984,3110699007,GB +3110699008,3110700031,IT +3110700032,3110701055,CH +3110701056,3110702079,FR +3110702080,3110703103,PL +3110703104,3110704127,CH +3110704128,3110705151,GE +3110705152,3110706175,FR +3110706176,3110707199,BE +3110707200,3110708223,NL +3110708224,3110709247,GB +3110709248,3110710271,RU +3110710272,3110711295,CY +3110711296,3110712319,IL +3110712320,3110713343,DK +3110713344,3110714367,IR +3110714368,3110715391,RO +3110715392,3110716415,NL +3110716416,3110717439,AZ +3110717440,3110718463,BE +3110718464,3110719487,NL +3110719488,3110721535,IT +3110721536,3110723087,NL +3110723088,3110723103,DE +3110723104,3110723583,NL +3110723584,3110724607,RU +3110724608,3110725631,TJ +3110725632,3110726655,ES +3110726656,3110726911,IR +3110726912,3110726943,AE +3110726944,3110727679,IR +3110727680,3110728703,IT +3110728704,3110729727,SE +3110729728,3110730751,NL +3110730752,3110731775,DE +3110731776,3110733823,RO +3110733824,3110734847,DE +3110735872,3110736895,GR +3110736896,3110737919,TR +3110737920,3110738943,LU +3110738944,3110739967,IQ +3110739968,3110740991,IL +3110740992,3110742015,RO +3110742016,3110743039,RU +3110743040,3110744063,ES +3110744064,3110745087,AT +3110745088,3110746111,NL +3110747136,3110748159,NL +3110748160,3110749183,CH +3110749184,3110750207,BE +3110750208,3110751231,NL +3110751232,3110752255,DE +3110752256,3110753279,NL +3110753280,3110754303,DE +3110754304,3110755327,IE +3110755328,3110756351,RU +3110756352,3110757375,HU +3110757376,3110758399,CY +3110758400,3110759423,RU +3110759424,3110760447,AT +3110760448,3110761471,HU +3110762496,3110763007,NL +3110763008,3110763263,RO +3110763264,3110763519,NL +3110763520,3110764543,AD +3110764544,3110765567,IL +3110765568,3110766591,PL +3110766592,3110767615,IR +3110767616,3110768639,NL +3110768640,3110769663,IR +3110769664,3110770687,DE +3110770688,3110771711,NL +3110771712,3110772735,KZ +3110773760,3110774783,DE +3110774784,3110775807,PL +3110775808,3110776831,RU +3110776832,3110777855,GB +3110777856,3110778879,SE +3110778880,3110779903,DE +3110779904,3110780927,AT +3110780928,3110781951,PS +3110781952,3110782975,RU +3110782976,3110783999,PT +3110784000,3110784255,US +3110784256,3110785023,RU +3110785024,3110786047,TR +3110786048,3110787071,NL +3110787072,3110788095,FR +3110788096,3110789119,ES +3110789120,3110790143,NL +3110790144,3110791167,IR +3110791168,3110792191,DE +3110792192,3110793215,BE +3110793216,3110794239,NL +3110794240,3110795263,DE +3110795264,3110796287,AT +3110796288,3110797311,DE +3110797312,3110798335,ES +3110798336,3110799359,DE +3110799360,3110800383,GB +3110800384,3110801407,DK +3110801408,3110802431,ES +3110802432,3110803455,DE +3110803456,3110804479,NL +3110804480,3110806527,IR +3110806528,3110809599,NL +3110809600,3110810623,LB +3110810624,3110811647,DE +3110811648,3110812671,NL +3110812672,3110813695,IS +3110813696,3110814207,PL +3110814208,3110815743,NL +3110815744,3110816767,RU +3110816768,3110817791,QA +3110817792,3110818815,NL +3110818816,3110819839,FR +3110819840,3110821887,NL +3110821888,3110822911,DE +3110822912,3110823935,NL +3110823936,3110825983,ES +3110825984,3110829055,NL +3110829056,3110830079,UA +3110830080,3110831103,RU +3110831104,3110832127,TR +3110832128,3110833151,UA +3110833152,3110834175,PL +3110834176,3110836223,IT +3110836224,3110837247,ES +3110837248,3110838271,UA +3110838272,3110839295,ES +3110839296,3110840319,UA +3110840320,3110841343,DK +3110841344,3110842367,KZ +3110842368,3110843391,DK +3110843392,3110845439,IT +3110845440,3110846463,NL +3110846464,3110847487,DE +3110847488,3110848511,GB +3110848512,3110849535,DK +3110849536,3110850559,IT +3110850560,3110851583,BE +3110851584,3110852607,NL +3110852608,3110853631,MK +3110853632,3110854655,DE +3110854656,3110855679,NL +3110855680,3110856703,GB +3110856704,3110857727,FR +3110857728,3110858751,IT +3110858752,3110859775,RU +3110859776,3110861823,IR +3110861824,3110864895,RU +3110864896,3110865919,DE +3110865920,3110866943,GB +3110866944,3110868991,RU +3110868992,3110870015,PS +3110870016,3110871039,CZ +3110871040,3110872063,FR +3110872064,3110873087,MD +3110873088,3110874111,IE +3110874112,3110875135,GB +3110876160,3110878207,GB +3110878208,3110879231,CZ +3110879232,3110880255,LV +3110880256,3110881279,PL +3110881280,3110883327,DE +3110883328,3110884351,IL +3110884352,3110886399,RU +3110886400,3110887423,GB +3110887424,3110888447,IR +3110888448,3110889471,DK +3110890496,3110891519,DK +3110891520,3110892543,RO +3110892544,3110893567,NL +3110893568,3110894591,CZ +3110894592,3110895615,TR +3110895616,3110896639,IE +3110896640,3110897663,GB +3110897664,3110898687,MD +3110898688,3110899711,BG +3110899712,3110900735,MD +3110900736,3110901759,TR +3110901760,3110902783,MD +3110903808,3110904831,RU +3110904832,3110905855,IR +3110905856,3110906879,GB +3110906880,3110907903,DE +3110907904,3110908927,GB +3110908928,3110909951,MD +3110909952,3110910975,DE +3110910976,3110911999,BG +3110912000,3110914047,RU +3110914048,3110915071,AT +3110915072,3110916095,ES +3110916096,3110918143,RU +3110918144,3110919167,DE +3110919168,3110920191,RU +3110920192,3110921215,NL +3110921216,3110922239,DE +3110922240,3110923263,GB +3110923264,3110924287,FR +3110924288,3110925311,SA +3110925312,3110926335,CH +3110926336,3110927359,LU +3110927360,3110928383,DK +3110928384,3110929407,CH +3110929408,3110930431,IE +3110930432,3110931455,GB +3110931456,3110932479,DK +3110932480,3110933503,RO +3110933504,3110934015,US +3110934016,3110934527,RU +3110934528,3110935551,IT +3110935552,3110936575,TR +3110936576,3110937599,DE +3110937600,3110938623,CH +3110938624,3110941695,GB +3110941696,3110942719,UA +3110942720,3110943743,IT +3110943744,3110944767,IR +3110944768,3110945791,DK +3110945792,3110946815,IT +3110946816,3110947839,IR +3110947840,3110948863,DK +3110948864,3110949887,IR +3110949888,3110950911,SE +3110950912,3110951935,DK +3110951936,3110952959,GB +3110952960,3110953983,NL +3110953984,3110955007,IS +3110955008,3110956031,GB +3110956032,3110957055,DE +3110957056,3110958079,RU +3110958080,3110959103,GB +3110959104,3110960127,JO +3110960128,3110961151,GB +3110961152,3110962175,IR +3110962176,3110963199,DK +3110963200,3110965247,GB +3110965248,3110966271,NL +3110966272,3110967295,IL +3110968320,3110969343,DE +3110969344,3110970367,NL +3110970368,3110971391,CH +3110971392,3110972415,GB +3110972416,3110973439,FR +3110973440,3110974463,SA +3110974464,3110975487,DE +3110975488,3110977535,IT +3110977536,3110978559,JO +3110978560,3110979583,DE +3110979584,3110980607,FR +3110980608,3110982655,RU +3110982656,3110982677,RO +3110982678,3110983679,SY +3110983680,3110986751,SE +3110986752,3110987775,GB +3110987776,3110988799,NL +3110988800,3110989055,CN +3110989056,3110989823,DE +3110989824,3110990335,CA +3110990336,3110990847,CH +3110990848,3110992895,IR +3110992896,3110993919,RO +3110993920,3110994943,GB +3110994944,3110995967,PL +3110995968,3110996991,RU +3110996992,3110998015,DE +3110998016,3110999039,ES +3110999040,3111000063,IT +3111000064,3111001087,RO +3111001088,3111002111,IR +3111002112,3111003135,DE +3111003136,3111004159,GG +3111004160,3111005183,DE +3111005184,3111006207,RU +3111006208,3111007231,PL +3111007232,3111008255,GB +3111008256,3111009279,RU +3111009280,3111010303,BG +3111010304,3111012351,ES +3111012352,3111013375,CH +3111013376,3111014399,ES +3111014400,3111015423,DK +3111015424,3111016447,FR +3111016448,3111017471,CH +3111017472,3111018495,NL +3111018496,3111019519,FR +3111019520,3111020543,CH +3111020544,3111021567,SY +3111021568,3111022591,IL +3111022592,3111023615,NL +3111023616,3111024639,IT +3111024640,3111025663,AT +3111025664,3111026687,DE +3111026688,3111027967,RU +3111027968,3111028735,UA +3111028736,3111029759,AT +3111029760,3111031807,SK +3111031808,3111032831,NO +3111032832,3111033343,DE +3111033344,3111033599,CH +3111033600,3111033855,DE +3111033856,3111035903,ES +3111035904,3111036927,GE +3111036928,3111037951,RU +3111037952,3111038975,NL +3111038976,3111041023,GB +3111041024,3111042047,CH +3111042048,3111043071,GB +3111043072,3111044095,FR +3111044096,3111045119,CH +3111045120,3111046143,NL +3111046144,3111047167,CZ +3111047168,3111048191,RU +3111048192,3111049215,ES +3111049216,3111050239,IR +3111050240,3111051263,CH +3111051264,3111052287,ES +3111052288,3111053311,IR +3111053312,3111054335,SA +3111054336,3111055359,IR +3111055360,3111056383,TR +3111056384,3111057407,IR +3111057408,3111058431,GB +3111058432,3111059455,IR +3111059456,3111060479,ES +3111060480,3111061503,LB +3111061504,3111063551,IR +3111063552,3111064575,FR +3111064576,3111065599,GB +3111065600,3111066623,RU +3111066624,3111067647,NL +3111067648,3111068671,DE +3111068672,3111069695,IS +3111069696,3111070719,IR +3111070720,3111071743,FR +3111071744,3111072767,RU +3111072768,3111074815,FR +3111074816,3111075839,DE +3111075840,3111076863,IR +3111076864,3111077887,DE +3111077888,3111078911,NL +3111078912,3111079935,IT +3111079936,3111080959,IR +3111080960,3111081983,RU +3111081984,3111083007,HU +3111083008,3111084031,CA +3111084032,3111085055,CZ +3111085056,3111086079,RU +3111086080,3111087103,KZ +3111087104,3111088127,CZ +3111088128,3111089151,IE +3111089152,3111090175,UA +3111090176,3111091199,NL +3111091200,3111092223,AT +3111092224,3111093247,IR +3111093248,3111094271,PL +3111094272,3111095295,IR +3111095296,3111096319,IE +3111096320,3111097343,AT +3111097344,3111098367,ES +3111098368,3111099391,SE +3111099392,3111100415,CH +3111100416,3111101439,LB +3111101440,3111102463,RU +3111102464,3111103487,DE +3111103488,3111104511,DK +3111104512,3111105535,CH +3111105536,3111106559,LT +3111106560,3111107583,ES +3111107584,3111108607,HR +3111108608,3111109631,DE +3111109632,3111110655,BE +3111110656,3111111679,US +3111111680,3111112703,BE +3111112704,3111113727,HU +3111113728,3111114751,BG +3111114752,3111115775,RU +3111115776,3111116799,DE +3111116800,3111117823,GB +3111117824,3111117824,ES +3111117825,3111118079,FR +3111118080,3111118847,ES +3111118848,3111119614,CY +3111119615,3111119871,TR +3111119872,3111120895,FR +3111120896,3111121919,SE +3111121920,3111122943,TR +3111122944,3111123967,IT +3111123968,3111126015,ES +3111126016,3111127039,IT +3111127040,3111128063,CH +3111128064,3111129087,UA +3111129088,3111130111,FR +3111130112,3111131135,RS +3111131136,3111132159,NO +3111132160,3111133183,CZ +3111133184,3111135231,IR +3111135232,3111136255,PL +3111136256,3111137279,NL +3111137280,3111139327,CH +3111139328,3111140351,RU +3111140352,3111141375,IT +3111141376,3111142399,NL +3111142400,3111143423,DE +3111143424,3111144447,CH +3111144448,3111145471,ES +3111145472,3111145983,RU +3111145984,3111146239,FI +3111146240,3111146495,US +3111146496,3111146635,IT +3111146636,3111146639,FR +3111146640,3111149567,IT +3111149568,3111150591,GB +3111150592,3111151359,RU +3111151360,3111151615,US +3111151616,3111152639,OM +3111152640,3111153663,NL +3111153664,3111154687,SE +3111154688,3111155711,PL +3111155712,3111156735,UA +3111156736,3111157759,DE +3111157760,3111158783,IR +3111158784,3111159807,CH +3111159808,3111160831,SE +3111160832,3111161855,RU +3111161856,3111162879,IS +3111162880,3111163903,IR +3111163904,3111164927,DE +3111164928,3111165951,HU +3111165952,3111166975,GB +3111166976,3111167999,CZ +3111168000,3111169023,IR +3111169024,3111170047,UA +3111170048,3111171071,DE +3111171072,3111172095,PL +3111172096,3111173119,RO +3111173120,3111173631,IQ +3111173632,3111173887,KR +3111173888,3111174143,IQ +3111174144,3111175167,AZ +3111175168,3111176191,IT +3111176192,3111177215,YE +3111177216,3111178239,IS +3111178240,3111179263,DK +3111179264,3111180287,IT +3111180288,3111181311,DE +3111181312,3111182335,GB +3111182336,3111183359,RU +3111183360,3111184383,FR +3111184384,3111185407,IQ +3111185408,3111186431,RU +3111187456,3111189503,GB +3111189504,3111190527,DE +3111190528,3111191551,GB +3111191552,3111192575,DE +3111192576,3111193599,TR +3111193600,3111194623,RU +3111194624,3111195647,GB +3111195648,3111196671,CH +3111196672,3111197695,GB +3111197696,3111198719,RU +3111198720,3111199743,PL +3111199744,3111200767,KZ +3111200768,3111201791,ES +3111201792,3111202815,SK +3111202816,3111203839,FR +3111203840,3111204863,NL +3111204864,3111205887,IR +3111205888,3111206911,GB +3111206912,3111207935,FR +3111207936,3111208959,GB +3111208960,3111211007,RU +3111211008,3111212031,GB +3111212032,3111214079,NL +3111214080,3111215103,GB +3111215104,3111216127,SE +3111216128,3111217151,AT +3111217152,3111218175,IR +3111218176,3111219199,RU +3111219200,3111220223,IR +3111220224,3111221247,RU +3111221248,3111223295,DE +3111223296,3111224319,GB +3111224320,3111225343,KZ +3111225344,3111226367,PL +3111226368,3111227391,PT +3111227392,3111228415,DE +3111228416,3111230463,IR +3111230464,3111231487,PT +3111231488,3111232511,FR +3111232512,3111233535,DE +3111233536,3111234559,LV +3111234560,3111235583,NL +3111235584,3111236607,SE +3111236608,3111237631,GB +3111237632,3111238655,ES +3111238656,3111239679,GB +3111239680,3111240703,ES +3111240704,3111241727,NL +3111241728,3111242751,RU +3111242752,3111243775,GB +3111243776,3111244799,RU +3111244800,3111245823,NL +3111245824,3111246847,GB +3111246848,3111247871,TR +3111247872,3111248127,BE +3111248128,3111248383,SE +3111248384,3111248639,ES +3111248640,3111248895,NL +3111248896,3111249919,DK +3111249920,3111250943,IE +3111250944,3111251967,ES +3111251968,3111252991,GB +3111252992,3111254015,RU +3111254016,3111255039,IE +3111255040,3111256063,EE +3111256064,3111257087,IT +3111257088,3111259135,FR +3111259136,3111260159,DE +3111260160,3111261183,IE +3111261184,3111262207,TR +3111262208,3111264511,NL +3111264512,3111264767,AU +3111264768,3111265279,HK +3111265280,3111265334,NL +3111265335,3111265335,US +3111265336,3111266303,NL +3111266304,3111267327,DE +3111267328,3111268351,DK +3111268352,3111269375,BE +3111269376,3111270399,RO +3111270400,3111271423,NO +3111271424,3111272447,GB +3111272448,3111273471,ES +3111273472,3111274495,SA +3111274496,3111275519,IR +3111275520,3111276543,NL +3111276544,3111277567,IT +3111277568,3111278591,RO +3111278592,3111279615,LB +3111279616,3111280639,PL +3111280640,3111281663,GB +3111281664,3111282687,FR +3111282688,3111283711,SE +3111283712,3111284223,IT +3111284224,3111284735,ES +3111284736,3111285759,AL +3111285760,3111286783,IT +3111286784,3111287039,IL +3111287040,3111287295,DE +3111287296,3111287551,NL +3111287552,3111287807,GB +3111287808,3111288831,DE +3111288832,3111289855,FR +3111289856,3111290879,DE +3111290880,3111291903,UA +3111291904,3111292927,NL +3111292928,3111293951,SI +3111293952,3111294975,CY +3111294976,3111295999,US +3111296000,3111297023,NL +3111297024,3111298047,IE +3111298048,3111299071,NL +3111299072,3111300095,DE +3111300096,3111301119,ES +3111301120,3111302143,EE +3111302144,3111303167,BG +3111303168,3111304191,NL +3111304192,3111305215,IR +3111305216,3111306239,TR +3111306240,3111307263,NL +3111307264,3111308287,DE +3111308288,3111309311,GB +3111309312,3111310335,CH +3111310336,3111311359,DE +3111312384,3111313407,DE +3111313408,3111313523,GB +3111313524,3111313524,SA +3111313525,3111313663,GB +3111313664,3111313919,NL +3111313920,3111314175,DE +3111314176,3111314431,GB +3111314432,3111314687,PT +3111314688,3111315455,GB +3111315456,3111316479,IT +3111316480,3111317503,NL +3111317504,3111318527,SY +3111318528,3111319551,UA +3111319552,3111320575,SE +3111320576,3111321599,LB +3111321600,3111322623,CZ +3111322624,3111323647,GE +3111323648,3111324671,CZ +3111324672,3111325695,MT +3111325696,3111326719,FI +3111326720,3111327743,HU +3111327744,3111328767,DE +3111328768,3111329791,RO +3111329792,3111330815,NL +3111330816,3111331839,UA +3111331840,3111332863,TR +3111332864,3111333887,PL +3111333888,3111334911,DE +3111334912,3111335935,ES +3111335936,3111336959,HR +3111336960,3111337983,GB +3111337984,3111339007,RO +3111339008,3111340031,GB +3111340032,3111341055,CZ +3111341056,3111342079,IR +3111342080,3111343103,DE +3111343104,3111344127,GB +3111344128,3111344383,NL +3111344384,3111344639,DE +3111344640,3111345151,US +3111345152,3111346175,RO +3111346176,3111347199,RU +3111347200,3111348223,LB +3111348224,3111349247,DE +3111349248,3111350271,GB +3111350272,3111351295,PL +3111351296,3111353343,GB +3111353344,3111353599,AT +3111353600,3111353855,FR +3111353856,3111355391,GB +3111355392,3111356415,IT +3111356416,3111357439,GE +3111357440,3111358463,RU +3111358464,3111358719,ES +3111358720,3111358975,IE +3111358976,3111359231,FR +3111359232,3111359487,IE +3111359488,3111360511,IR +3111360512,3111361535,PL +3111361536,3111363583,RU +3111363584,3111365631,IR +3111365632,3111367679,DE +3111367680,3111368703,CZ +3111368704,3111369727,AT +3111369728,3111370751,NL +3111370752,3111371007,DE +3111371008,3111371263,US +3111371264,3111371519,GB +3111371520,3111371775,DE +3111371776,3111373823,GB +3111373824,3111374847,GR +3111374848,3111375871,TR +3111375872,3111376895,IL +3111376896,3111377919,BE +3111377920,3111378943,RO +3111378944,3111379967,IL +3111379968,3111380991,GB +3111380992,3111382015,ES +3111382016,3111383039,DE +3111383040,3111383295,GB +3111383296,3111383551,US +3111383552,3111383807,TR +3111383808,3111384063,NL +3111384064,3111387135,NO +3111387136,3111388159,IT +3111388160,3111389183,NO +3111389184,3111390207,DK +3111390208,3111390463,ES +3111390464,3111390719,IE +3111390720,3111390975,FR +3111390976,3111391231,NL +3111391232,3111392255,DE +3111392256,3111394303,IR +3111394304,3111395327,AT +3111395328,3111396351,FI +3111396352,3111397375,DE +3111397376,3111398399,NL +3111398400,3111399423,IR +3111399424,3111400447,CZ +3111400448,3111402495,GB +3111402496,3111403519,KE +3111403520,3111404543,IE +3111404544,3111405567,GB +3111405568,3111406591,BE +3111406592,3111407615,CZ +3111407616,3111408639,NL +3111408640,3111409663,IT +3111409664,3111410687,FR +3111410688,3111411711,BG +3111411712,3111412735,AT +3111412736,3111413759,IL +3111413760,3111414783,FR +3111414784,3111416831,GB +3111416832,3111417855,LB +3111417856,3111418879,SE +3111418880,3111419903,NL +3111419904,3111421951,FR +3111421952,3111422975,PL +3111422976,3111423999,KZ +3111424000,3111425023,NL +3111425024,3111426047,DK +3111426048,3111427071,TR +3111427072,3111428095,DE +3111428096,3111429119,IR +3111429120,3111430143,NL +3111430144,3111431167,IE +3111431168,3111432191,GB +3111432192,3111433215,FR +3111433216,3111434239,ES +3111434240,3111436287,DK +3111436288,3111437311,KZ +3111437312,3111439359,RU +3111439360,3111440383,BG +3111440384,3111441407,DE +3111441408,3111442431,GB +3111442432,3111443455,NL +3111443456,3111444479,DE +3111444480,3111445503,SA +3111445504,3111446527,RU +3111446528,3111447551,DE +3111447552,3111447775,NL +3111447776,3111447807,AT +3111447808,3111448063,GB +3111448064,3111448319,BG +3111448320,3111448575,GB +3111448576,3111448960,NO +3111448961,3111449502,BE +3111449503,3111449599,NO +3111449600,3111451647,DE +3111451648,3111452671,PL +3111452672,3111453695,MY +3111453696,3111454719,NL +3111454720,3111455743,IQ +3111455744,3111456255,CH +3111456256,3111456767,DE +3111456768,3111457791,FR +3111457792,3111458815,GB +3111458816,3111459839,NL +3111459840,3111460863,RU +3111460864,3111461887,GR +3111461888,3111462911,FR +3111462912,3111463935,AT +3111463936,3111464959,ES +3111464960,3111465983,IR +3111465984,3111467007,US +3111467008,3111469055,FR +3111469056,3111470079,EE +3111470080,3111471103,AE +3111471104,3111473151,NL +3111473152,3111474175,BG +3111474176,3111475199,PL +3111475200,3111475711,SE +3111475712,3111476223,NL +3111476224,3111477247,FR +3111477248,3111478271,IR +3111478272,3111479295,RU +3111479296,3111480319,SE +3111480320,3111481343,NL +3111482368,3111482879,RU +3111482880,3111483391,FI +3111483392,3111484415,TR +3111484416,3111485439,NL +3111485440,3111486463,SA +3111486464,3111487487,CY +3111487488,3111488511,IR +3111488512,3111490559,RU +3111490560,3111491583,KG +3111491584,3111493631,RU +3111493632,3111494655,DE +3111494656,3111495679,LI +3111495680,3111496703,CH +3111496704,3111498751,ES +3111498752,3111499775,DE +3111499776,3111500799,IT +3111500800,3111501823,BG +3111501824,3111502847,NO +3111502848,3111504895,GB +3111504896,3111505919,IR +3111505920,3111506943,NL +3111506944,3111507967,DE +3111507968,3111508991,IT +3111508992,3111510015,FI +3111510016,3111511039,LB +3111511040,3111512063,GR +3111512064,3111513087,RU +3111513088,3111514111,GB +3111514112,3111515135,UA +3111515136,3111516159,RU +3111516160,3111519231,DE +3111519232,3111520255,RO +3111520256,3111521279,IQ +3111521280,3111522303,IR +3111522304,3111523327,FR +3111523328,3111524351,DE +3111524352,3111525375,LB +3111525376,3111526399,GB +3111526400,3111527423,IS +3111527424,3111528447,SE +3111528448,3111529471,DK +3111529472,3111530495,IQ +3111530496,3111531519,AZ +3111531520,3111533567,ES +3111533568,3111534591,NL +3111534592,3111535615,RU +3111535616,3111536639,FR +3111536640,3111537663,IT +3111537664,3111538687,LV +3111538688,3111539711,CZ +3111539712,3111540735,GE +3111540736,3111541759,NL +3111541760,3111542783,FR +3111542784,3111543807,IQ +3111543808,3111544831,DE +3111546880,3111547903,PT +3111547904,3111548927,FR +3111548928,3111549951,SA +3111549952,3111550975,NL +3111550976,3111551999,IQ +3111552000,3111553023,NL +3111553024,3111554047,IR +3111554048,3111555071,TR +3111555072,3111556095,DE +3111556096,3111557119,AL +3111557120,3111558143,IR +3111558144,3111559167,ES +3111559168,3111560191,EE +3111560192,3111561215,RU +3111561216,3111562239,RS +3111562240,3111563263,DE +3111563264,3111564287,TR +3111564288,3111565311,DK +3111565312,3111566335,IT +3111566336,3111567359,ES +3111567360,3111568383,TR +3111568384,3111569407,DE +3111569408,3111570431,RO +3111570432,3111571455,IE +3111571456,3111572479,DE +3111572480,3111573503,PL +3111573504,3111574527,LU +3111574528,3111575551,LB +3111575552,3111576575,FI +3111576576,3111577599,IE +3111577600,3111578623,FI +3111578624,3111579647,US +3111579648,3111580671,BG +3111580672,3111581695,AT +3111581696,3111582719,DK +3111582720,3111583743,IL +3111583744,3111584767,RU +3111584768,3111585791,IR +3111585792,3111586815,DE +3111586816,3111587839,PL +3111587840,3111588863,DE +3111588864,3111589887,GB +3111589888,3111590911,FR +3111590912,3111591935,NL +3111591936,3111592959,DE +3111592960,3111593983,CH +3111593984,3111595007,US +3111595008,3111596031,AT +3111596032,3111597055,ES +3111597056,3111598079,GB +3111598080,3111599103,RU +3111599104,3111600127,GB +3111600128,3111601151,RU +3111601152,3111602175,GB +3111602176,3111603199,DE +3111603200,3111604223,UA +3111604224,3111605247,TR +3111605248,3111606271,CH +3111606272,3111607039,RS +3111607040,3111607295,BG +3111607296,3111608319,DE +3111608320,3111609343,CZ +3111609344,3111610367,SE +3111610368,3111611391,CH +3111611392,3111612415,GB +3111612416,3111613439,ES +3111613440,3111614463,AT +3111614464,3111615487,PL +3111615488,3111616511,IS +3111616512,3111617535,FI +3111617536,3111618559,GB +3111618560,3111619583,DE +3111619584,3111621631,GB +3111621632,3111622655,PL +3111622656,3111623679,GB +3111623680,3111624703,BE +3111624704,3111625727,AT +3111625728,3111626751,IR +3111626752,3111627775,FR +3111627776,3111628799,GB +3111628800,3111629823,CH +3111629824,3111630847,HU +3111630848,3111631871,PL +3111631872,3111633919,NL +3111633920,3111636991,FR +3111636992,3111638015,PL +3111638016,3111639039,UA +3111639040,3111640063,CZ +3111640064,3111641087,NL +3111641088,3111643135,IT +3111643136,3111644159,GB +3111644160,3111645183,ES +3111645184,3111646207,IR +3111646208,3111647231,IT +3111647232,3111648255,ES +3111648256,3111648767,GB +3111648768,3111649023,NL +3111649024,3111650559,GB +3111650560,3111650815,SG +3111650816,3111651071,TR +3111651072,3111651327,GB +3111651328,3111652351,RO +3111652352,3111652863,GB +3111652864,3111653119,NL +3111653120,3111653375,DK +3111653376,3111654399,RO +3111654400,3111654911,GB +3111654912,3111655167,DE +3111655168,3111655423,FR +3111655424,3111656447,NO +3111656448,3111657471,LB +3111657472,3111658239,GB +3111658240,3111658495,NL +3111658496,3111659519,AL +3111659520,3111660543,IT +3111660544,3111661567,ES +3111661568,3111662591,FI +3111662592,3111663615,GB +3111663616,3111664639,RU +3111664640,3111665663,DE +3111665664,3111666687,PL +3111666688,3111667711,CZ +3111667712,3111668735,GB +3111668736,3111669759,KZ +3111669760,3111670783,IT +3111670784,3111671807,ES +3111671808,3111672831,RU +3111672832,3111673855,MK +3111673856,3111674879,GI +3111674880,3111675903,NO +3111675904,3111676927,ES +3111676928,3111677951,AE +3111677952,3111678975,ES +3111678976,3111679231,GB +3111679232,3111679487,NL +3111679488,3111679999,GB +3111680000,3111681023,IR +3111681024,3111682047,IL +3111682048,3111683071,GB +3111683072,3111684095,UA +3111684096,3111685119,IR +3111685120,3111686143,CH +3111686144,3111687167,RO +3111687168,3111688191,DE +3111688192,3111689215,GB +3111689216,3111690239,DE +3111690240,3111691263,IR +3111691264,3111692287,BE +3111692288,3111693311,IR +3111693312,3111694335,GB +3111694336,3111695359,FR +3111695360,3111696383,RU +3111696384,3111697407,CY +3111697408,3111698431,RU +3111698432,3111701503,IR +3111701504,3111702527,GB +3111702528,3111713791,IR +3111713792,3111714303,RU +3111714304,3111714559,US +3111714560,3111714815,RU +3111714816,3111715839,TJ +3111715840,3111716863,GB +3111716864,3111717887,NL +3111717888,3111718911,AD +3111718912,3111719935,GB +3111719936,3111720959,CY +3111720960,3111721983,GB +3111721984,3111723007,SE +3111723008,3111725055,IT +3111725056,3111726079,AT +3111726080,3111727103,SE +3111727104,3111728127,HR +3111728128,3111729151,AT +3111729152,3111730175,IR +3111730176,3111731199,DK +3111731200,3111732223,SK +3111732224,3111733247,DE +3111733248,3111734271,RU +3111734272,3111735295,GB +3111735296,3111736319,KZ +3111736320,3111737343,RU +3111737344,3111738367,GB +3111738368,3111739391,NL +3111739392,3111740415,DE +3111740416,3111741439,IT +3111741440,3111743487,UA +3111743488,3111744511,NL +3111744512,3111745535,UA +3111745536,3111746559,MD +3111746560,3111747583,TR +3111747584,3111748607,IR +3111748608,3111750655,GB +3111750656,3111751679,FR +3111751680,3111752703,GB +3111752704,3111753727,IT +3111753728,3111754751,BG +3111754752,3111755775,IT +3111755776,3111756543,NO +3111756544,3111756799,US +3111756800,3111757823,NL +3111757824,3111758335,NZ +3111758336,3111758591,NL +3111758592,3111758847,FR +3111758848,3111759871,DK +3111759872,3111760127,IS +3111760128,3111760383,AQ +3111760384,3111760639,GB +3111760640,3111760895,LT +3111760896,3111761919,NL +3111761920,3111762943,SY +3111762944,3111763967,NL +3111763968,3111766015,DE +3111766016,3111767039,HR +3111767040,3111768063,SE +3111768064,3111769087,IT +3111769088,3111770111,DE +3111770112,3111771135,FI +3111771136,3111772159,GB +3111772160,3111773183,NL +3111773184,3111774207,IQ +3111774208,3111775231,ES +3111775232,3111776255,AM +3111776256,3111778303,RU +3111778304,3111779327,GB +3111779328,3111780351,SA +3111780352,3111780607,GB +3111780608,3111781375,US +3111781376,3111782399,DE +3111782400,3111783423,IL +3111783424,3111784447,TR +3111784448,3111785471,GB +3111785472,3111786495,NL +3111786496,3111787519,IT +3111787520,3111788543,RU +3111788544,3111789567,KZ +3111789568,3111790335,GB +3111790336,3111790591,TR +3111790592,3111791615,CZ +3111791616,3111792639,IT +3111792640,3111793663,CH +3111793664,3111794687,SK +3111794688,3111795711,GB +3111795712,3111796735,PL +3111796736,3111798783,GB +3111798784,3111799807,SE +3111799808,3111800831,CH +3111800832,3111801855,IR +3111801856,3111802879,DE +3111802880,3111803903,PL +3111803904,3111804927,LB +3111804928,3111805951,PL +3111805952,3111806975,FR +3111806976,3111807999,PL +3111808000,3111809023,FI +3111809024,3111810047,NO +3111810048,3111811071,NL +3111811072,3111812095,SA +3111812096,3111814143,GB +3111814144,3111815167,IE +3111815168,3111816191,PL +3111816192,3111816447,LT +3111816448,3111816703,GB +3111816704,3111816959,LT +3111816960,3111817215,GB +3111817216,3111819263,PL +3111819264,3111821311,NL +3111821312,3111822335,FR +3111822336,3111823359,GB +3111823360,3111824383,NL +3111824384,3111825407,PL +3111825408,3111825919,GB +3111825920,3111826175,LT +3111826176,3111826431,RU +3111826432,3111827455,DE +3111827456,3111828479,ES +3111828480,3111829503,DK +3111829504,3111830527,NL +3111830528,3111831551,NO +3111831552,3111832575,TR +3111832576,3111836671,GB +3111836672,3111837439,RO +3111837440,3111837695,DE +3111837696,3111838719,IT +3111838720,3111839743,AL +3111839744,3111840767,GB +3111840768,3111841791,CH +3111841792,3111842815,BG +3111843840,3111844863,BE +3111844864,3111845887,IQ +3111845888,3111846911,TR +3111846912,3111847935,GB +3111847936,3111848959,IT +3111848960,3111849983,RU +3111849984,3111851007,KZ +3111851008,3111852031,SA +3111852032,3111853055,FR +3111854080,3111855103,NO +3111855104,3111856127,IT +3111856128,3111858175,RU +3111858176,3111859199,PL +3111859200,3111860223,EE +3111860224,3111861247,ES +3111861248,3111862271,NL +3111863296,3111864319,IR +3111864320,3111865343,FR +3111865344,3111866367,RU +3111866368,3111867391,GB +3111867392,3111868415,FR +3111868416,3111869439,DE +3111869440,3111870463,NO +3111870464,3111871487,GB +3111871488,3111873535,TR +3111873536,3111874559,AT +3111874560,3111875583,GB +3111875584,3111876607,FI +3111876608,3111877631,ES +3111877632,3111878655,PL +3111878656,3111879679,CZ +3111879680,3111880703,FI +3111880704,3111881727,ES +3111881728,3111882751,RO +3111882752,3111886847,GB +3111886848,3111887871,PL +3111887872,3111888895,RU +3111888896,3111889919,IE +3111889920,3111890943,RU +3111890944,3111891967,AT +3111891968,3111892991,FR +3111892992,3111894015,BY +3111894016,3111895039,BG +3111895040,3111896063,RU +3111896064,3111897087,IS +3111897088,3111899135,ES +3111899136,3111900159,IR +3111900160,3111901183,IT +3111901184,3111902207,LU +3111902208,3111903231,RO +3111903232,3111904255,DE +3111904256,3111905279,SE +3111905280,3111906303,IT +3111906304,3111908351,GB +3111908352,3111909375,RO +3111909376,3111912447,GB +3111912448,3111913471,ES +3111913472,3111914495,GB +3111914496,3111915519,RU +3111915520,3111916543,DE +3111916544,3111919615,ES +3111919616,3111920639,RO +3111920640,3111921663,ES +3111922688,3111923711,IT +3111923712,3111924735,DE +3111924736,3111925759,NO +3111925760,3111927807,GB +3111927808,3111928831,DE +3111928832,3111929728,CH +3111929729,3111930879,DE +3111930880,3111931903,NO +3111931904,3111932927,CZ +3111932928,3111933951,TR +3111933952,3111935999,FI +3111936000,3111937023,NO +3111937024,3111940095,ES +3111940096,3111941119,IR +3111941120,3111942143,PL +3111942144,3111943167,DE +3111943168,3111944191,PT +3111944192,3111945215,PL +3111945216,3111946239,CH +3111946240,3111948287,ES +3111948288,3111949311,AT +3111949312,3111950335,IQ +3111950336,3111951359,RU +3111951360,3111952383,IR +3111952384,3111953407,GB +3111953408,3111954431,RU +3111954432,3111955455,UA +3111955456,3111956479,IR +3111956480,3111957503,RU +3111957504,3111958527,IT +3111958528,3111959551,PL +3111959552,3111960575,RU +3111960576,3111962623,DE +3111962624,3111963647,NL +3111963648,3111964671,IE +3111964672,3111965695,RU +3111965696,3111966719,LB +3111966720,3111967743,FR +3111967744,3111969791,DE +3111969792,3111970815,RU +3111970816,3111971839,DE +3111971840,3111972863,FR +3111972864,3111973887,CH +3111973888,3111974911,LB +3111974912,3111975935,RO +3111975936,3111976959,IT +3111976960,3111977983,DE +3111977984,3111979007,PL +3111979008,3111980031,NL +3111980032,3111981055,IL +3111981056,3111982079,RU +3111982080,3111983103,IR +3111983104,3111984127,UA +3111985152,3111986175,TR +3111986176,3111987199,RU +3111987200,3111988223,NL +3111988224,3111989247,KZ +3111989248,3111990015,RU +3111990016,3111990271,US +3111990272,3111991295,FR +3111991296,3111992319,RU +3111992320,3111993343,RS +3111993344,3111994367,US +3111994368,3111995391,IT +3111995392,3111996415,RU +3111996416,3111997439,ES +3111997440,3111998463,DK +3111998464,3111999487,GB +3111999488,3112000511,KZ +3112000512,3112001535,DE +3112001536,3112002559,DK +3112002560,3112003583,RU +3112003584,3112004607,GB +3112004608,3112005631,RO +3112005632,3112006655,RU +3112006656,3112007679,NL +3112007680,3112008703,BA +3112008704,3112009727,PL +3112009728,3112010751,CZ +3112010752,3112011775,PL +3112012800,3112013823,GB +3112013824,3112014847,IT +3112014848,3112017919,LB +3112017920,3112018943,NO +3112018944,3112019967,CH +3112019968,3112020991,NO +3112020992,3112022015,DE +3112022016,3112023039,RS +3112023040,3112024063,LU +3112024064,3112025087,US +3112025088,3112026111,GB +3112026112,3112027135,RU +3112027136,3112028159,CH +3112028160,3112029183,RU +3112029184,3112030207,GB +3112030208,3112031231,AT +3112031232,3112032255,CH +3112032256,3112033279,RU +3112033280,3112034303,DK +3112034304,3112034305,DE +3112034306,3112034306,GB +3112034307,3112034307,PL +3112034308,3112034308,FR +3112034309,3112034309,NL +3112034310,3112034310,AT +3112034311,3112034311,IT +3112034312,3112034312,CH +3112034313,3112034313,CZ +3112034314,3112034314,DK +3112034315,3112034315,ES +3112034316,3112034316,PT +3112034317,3112034317,HU +3112034318,3112034318,SK +3112034319,3112034319,BE +3112034320,3112034320,IE +3112034321,3112034321,NO +3112034322,3112034322,SE +3112034323,3112034323,FI +3112034324,3112034333,DE +3112034334,3112034334,RO +3112034335,3112034335,RS +3112034336,3112034336,IL +3112034337,3112034337,AE +3112034338,3112034338,SA +3112034339,3112034559,DE +3112034560,3112034579,US +3112034580,3112034580,VE +3112034581,3112034581,CO +3112034582,3112034582,BR +3112034583,3112034583,PE +3112034584,3112034584,BO +3112034585,3112034585,CL +3112034586,3112034586,AR +3112034587,3112034587,PY +3112034588,3112034588,UY +3112034589,3112034589,MX +3112034590,3112034817,US +3112034818,3112034818,GB +3112034819,3112034819,PL +3112034820,3112034820,FR +3112034821,3112034821,NL +3112034822,3112034822,AT +3112034823,3112034823,IT +3112034824,3112034824,CH +3112034825,3112034825,CZ +3112034826,3112034826,DK +3112034827,3112034827,ES +3112034828,3112034828,PT +3112034829,3112034829,HU +3112034830,3112034830,SK +3112034831,3112034831,BE +3112034832,3112034832,IE +3112034833,3112034833,NO +3112034834,3112034834,SE +3112034835,3112034835,FI +3112034836,3112034837,DE +3112034838,3112034838,TR +3112034839,3112034839,GR +3112034840,3112034845,US +3112034846,3112034846,RO +3112034847,3112034847,RS +3112034848,3112034848,IL +3112034849,3112034849,AE +3112034850,3112034850,SA +3112034851,3112034857,US +3112034858,3112034858,GB +3112034859,3112034859,PL +3112034860,3112034860,FR +3112034861,3112034861,NL +3112034862,3112034862,AT +3112034863,3112034863,IT +3112034864,3112034864,CH +3112034865,3112034865,CZ +3112034866,3112034866,DK +3112034867,3112034867,ES +3112034868,3112034868,PT +3112034869,3112034869,HU +3112034870,3112034870,SK +3112034871,3112034871,BE +3112034872,3112034872,IE +3112034873,3112034873,NO +3112034874,3112034874,SE +3112034875,3112034875,FI +3112034876,3112034877,DE +3112034878,3112034878,TR +3112034879,3112034879,GR +3112034880,3112034885,US +3112034886,3112034886,RO +3112034887,3112034887,RS +3112034888,3112034888,IL +3112034889,3112034889,AE +3112034890,3112034890,SA +3112034891,3112035091,US +3112035092,3112035092,CA +3112035093,3112035093,US +3112035094,3112035097,CA +3112035098,3112035327,US +3112035328,3112036351,RU +3112036352,3112038399,NL +3112038400,3112039423,IS +3112039424,3112047615,IR +3112047616,3112048639,AT +3112048640,3112049663,GB +3112049664,3112050687,DE +3112051712,3112052735,NO +3112052736,3112053759,IR +3112053760,3112054783,LB +3112054784,3112055807,BE +3112055808,3112056831,DK +3112056832,3112057855,NL +3112057856,3112058879,IS +3112058880,3112059903,NL +3112059904,3112062975,RO +3112062976,3112063999,ES +3112064000,3112065023,RU +3112065024,3112066047,PT +3112066048,3112067071,RU +3112067072,3112068095,ES +3112068096,3112069119,DE +3112069120,3112070143,ES +3112070144,3112071167,DK +3112071168,3112072191,UA +3112072192,3112073215,RO +3112073216,3112074239,NL +3112074240,3112075263,IR +3112075264,3112076287,RU +3112076288,3112077311,IR +3112077312,3112078335,GB +3112078336,3112079359,IT +3112079360,3112080383,IR +3112080384,3112081407,GB +3112081408,3112082431,DK +3112082432,3112083455,IR +3112083456,3112085503,GB +3112085504,3112086527,DE +3112086528,3112087551,GB +3112087552,3112088575,TR +3112088576,3112089599,RU +3112089600,3112090623,NO +3112090624,3112091647,PL +3112091648,3112092671,RU +3112092672,3112093695,SK +3112093696,3112094719,IR +3112094720,3112095743,IT +3112095744,3112096767,AT +3112096768,3112097791,DE +3112097792,3112098815,TR +3112098816,3112099839,CH +3112099840,3112100863,GB +3112100864,3112101887,FR +3112102912,3112103935,GB +3112103936,3112104959,DE +3112104960,3112105983,FR +3112105984,3112107007,GB +3112107008,3112108031,UA +3112108032,3112109055,LT +3112109056,3112110079,FR +3112110080,3112111103,IL +3112111104,3112112127,NL +3112112128,3112113151,GB +3112113152,3112114175,PL +3112114176,3112115199,RU +3112115200,3112116223,DE +3112116224,3112118271,IT +3112118272,3112119295,NO +3112119296,3112120319,GB +3112120320,3112121343,DK +3112121344,3112122367,ES +3112122368,3112123391,GB +3112123392,3112124415,FI +3112124416,3112125439,AM +3112125440,3112126463,GB +3112126464,3112127487,FI +3112127488,3112128511,GB +3112128512,3112129535,FR +3112129536,3112130559,FI +3112130560,3112131583,DK +3112131584,3112132607,GB +3112132608,3112133631,DK +3112133632,3112134655,NO +3112134656,3112136703,NL +3112136704,3112137727,CH +3112137728,3112138751,ES +3112138752,3112139775,PL +3112139776,3112140799,LB +3112140800,3112141569,ES +3112141570,3112141570,FR +3112141571,3112141571,DE +3112141572,3112141823,ES +3112141824,3112142847,IT +3112142848,3112143871,NL +3112143872,3112144895,GB +3112144896,3112145919,ES +3112145920,3112146943,RU +3112146944,3112148991,GB +3112148992,3112150015,PT +3112150016,3112151039,RU +3112151040,3112152063,NO +3112152064,3112153087,CH +3112153088,3112154111,IR +3112154112,3112155135,LB +3112155136,3112156159,NL +3112156160,3112157183,LB +3112157184,3112158207,GB +3112158208,3112159231,IT +3112159232,3112160255,NL +3112160256,3112161279,CH +3112161280,3112162303,DE +3112162304,3112163327,IT +3112163328,3112164351,RS +3112164352,3112165375,IT +3112165376,3112166399,RU +3112166400,3112167423,SE +3112167424,3112168447,IR +3112168448,3112169471,IT +3112169472,3112170495,FR +3112170496,3112171519,UA +3112171520,3112172543,GB +3112172544,3112173567,NO +3112173568,3112174591,SE +3112174592,3112175615,RU +3112175616,3112176639,UA +3112176640,3112177663,ES +3112177664,3112178687,FI +3112178688,3112179711,PL +3112180736,3112181759,IT +3112181760,3112182783,NL +3112182784,3112183807,IQ +3112183808,3112184831,CH +3112184832,3112185855,DE +3112185856,3112186879,IR +3112186880,3112187903,ES +3112187904,3112188927,GB +3112188928,3112189951,ES +3112189952,3112190975,NL +3112190976,3112191999,DE +3112192000,3112193023,DK +3112193024,3112194047,IT +3112194048,3112195071,IR +3112195072,3112196095,RU +3112196096,3112197119,NL +3112197120,3112198143,UA +3112198144,3112199167,RO +3112199168,3112200191,DK +3112200192,3112200959,RU +3112200960,3112201215,GB +3112201216,3112202239,DE +3112202240,3112203263,TR +3112203264,3112205311,DE +3112205312,3112206335,LB +3112206336,3112207359,ES +3112207360,3112208383,GB +3112208384,3112209407,IR +3112209408,3112210431,FR +3112210432,3112211455,NO +3112211456,3112212479,IT +3112212480,3112213503,IR +3112213504,3112214527,PL +3112214528,3112215551,FI +3112215552,3112216575,IR +3112216576,3112217599,ES +3112217600,3112218623,CH +3112218624,3112219647,GB +3112219648,3112220671,SY +3112220672,3112221695,NL +3112221696,3112222719,DE +3112222720,3112223743,ES +3112223744,3112224767,RU +3112224768,3112225791,BY +3112225792,3112227839,GB +3112227840,3112228863,RU +3112228864,3112229887,DE +3112229888,3112231935,GB +3112231936,3112232959,HU +3112232960,3112233983,UA +3112233984,3112235007,FR +3112235008,3112236031,RO +3112236032,3112237055,AT +3112237056,3112238079,SI +3112238080,3112239103,FI +3112239104,3112240127,AZ +3112240128,3112241151,IQ +3112241152,3112242175,GB +3112242176,3112243199,HR +3112243200,3112244223,TR +3112244224,3112245247,GB +3112245248,3112246271,NO +3112246272,3112247295,ES +3112247296,3112248319,PL +3112248320,3112249343,RO +3112249344,3112250367,ES +3112250368,3112251391,FR +3112251392,3112252415,KZ +3112252416,3112253439,CH +3112253440,3112254463,RU +3112254464,3112255487,DK +3112255488,3112256511,NO +3112256512,3112257535,NL +3112257536,3112258559,GB +3112258560,3112259583,PL +3112259584,3112260607,IR +3112260608,3112261631,DE +3112261632,3112262655,IT +3112262656,3112263679,AZ +3112263680,3112265727,RU +3112265728,3112266751,ES +3112266752,3112267775,IR +3112267776,3112268799,PL +3112268800,3112269823,IR +3112269824,3112270847,RS +3112270848,3112271871,IR +3112271872,3112272895,UA +3112272896,3112273919,IE +3112273920,3112274943,CZ +3112274944,3112275967,IR +3112275968,3112276991,RU +3112276992,3112278015,LV +3112278016,3112279039,FI +3112279040,3112280063,NO +3112281088,3112282111,FR +3112282112,3112283135,IR +3112283136,3112284159,AT +3112284160,3112285183,GB +3112285184,3112286207,DE +3112286208,3112288255,IR +3112288256,3112289279,KZ +3112289280,3112291327,IR +3112291328,3112292351,RU +3112292352,3112293375,GB +3112293376,3112295423,IR +3112295424,3112296575,GB +3112296576,3112296639,ES +3112296640,3112296687,GB +3112296688,3112296703,US +3112296704,3112297471,GB +3112297472,3112301567,IR +3112301568,3112302591,DE +3112302592,3112303615,ES +3112303616,3112304639,DE +3112304640,3112305663,SE +3112306688,3112307711,DE +3112307712,3112308735,IS +3112308736,3112309759,HR +3112309760,3112310783,DE +3112310784,3112312831,ES +3112312832,3112313855,DE +3112313856,3112315903,GB +3112315904,3112316927,PL +3112316928,3112317951,IQ +3112317952,3112318975,UA +3112320000,3112321023,IQ +3112321024,3112322047,FI +3112322048,3112323071,NO +3112323072,3112324095,NL +3112324096,3112325119,IR +3112325120,3112326143,RU +3112326144,3112327167,IL +3112327168,3112328191,RU +3112328192,3112329215,GB +3112329216,3112330239,DK +3112330240,3112331263,GB +3112331264,3112331519,RU +3112331520,3112332287,NL +3112332288,3112333311,PL +3112333312,3112334335,RU +3112334336,3112335359,FR +3112335360,3112336383,GB +3112336384,3112337407,RS +3112337408,3112338431,BE +3112338432,3112339455,MK +3112339456,3112340479,LB +3112340480,3112341503,CH +3112341504,3112342527,ES +3112342528,3112343551,BE +3112343552,3112344575,ES +3112344576,3112345599,GB +3112345600,3112346623,DK +3112346624,3112347647,SE +3112347648,3112349695,NL +3112349696,3112350719,HU +3112350720,3112351743,PL +3112352768,3112353791,DK +3112353792,3112354815,DE +3112354816,3112355839,GB +3112355840,3112356863,ES +3112356864,3112357887,DE +3112357888,3112358911,PL +3112358912,3112359935,RU +3112359936,3112360959,ES +3112360960,3112361983,SK +3112361984,3112364031,NL +3112364032,3112365055,RU +3112365056,3112366079,US +3112366080,3112367103,NL +3112367104,3112368127,NO +3112368128,3112369151,RU +3112369152,3112370175,AT +3112370176,3112371199,LU +3112371200,3112372223,CH +3112372224,3112373247,GB +3112373248,3112374271,ES +3112374272,3112375295,IT +3112375296,3112376319,SE +3112376320,3112377343,NL +3112377344,3112378367,IR +3112378368,3112379391,PL +3112379392,3112380415,LB +3112380416,3112382463,FR +3112382464,3112383487,TR +3112383488,3112384511,ES +3112384512,3112385535,AE +3112385536,3112386559,CZ +3112386560,3112386815,RU +3112386816,3112387071,DE +3112387072,3112387327,NL +3112387328,3112387583,RU +3112387584,3112388607,HK +3112388608,3112389631,DE +3112389632,3112390655,SA +3112390656,3112391679,FR +3112391680,3112394751,IR +3112394752,3112395775,SA +3112395776,3112396799,IR +3112396800,3112397823,RU +3112397824,3112400895,IR +3112400896,3112401919,DE +3112401920,3112403967,IR +3112403968,3112404991,ES +3112404992,3112407039,IR +3112407040,3112408063,AE +3112408064,3112411135,IR +3112411136,3112412159,IT +3112412160,3112414207,IR +3112414208,3112415231,RU +3112415232,3112416255,AE +3112416256,3112417279,RU +3112417280,3112419327,ES +3112419328,3112420351,FR +3112420352,3112421375,DE +3112421376,3112423423,GB +3112423424,3112424447,TR +3112424448,3112425471,IT +3112425472,3112426495,FI +3112426496,3112427519,FR +3112427520,3112428543,PL +3112428544,3112430591,GB +3112430592,3112431615,DE +3112431616,3112432639,PL +3112432640,3112433663,CZ +3112433664,3112435711,IT +3112435712,3112436735,UA +3112436736,3112437759,BG +3112437760,3112439807,GB +3112439808,3112440831,CH +3112440832,3112441855,RU +3112441856,3112442879,DE +3112442880,3112443903,RU +3112443904,3112447999,DE +3112448000,3112449023,LT +3112449024,3112450047,PL +3112450048,3112451071,IT +3112451072,3112452095,LU +3112452096,3112453119,FR +3112453120,3112454143,IT +3112454144,3112455167,FR +3112455168,3112456191,GB +3112456192,3112457215,IR +3112457216,3112458239,GB +3112458240,3112459263,ES +3112459264,3112460287,AL +3112460288,3112461311,AT +3112461312,3112462335,FR +3112462336,3112463359,FI +3112463360,3112464383,RO +3112464384,3112465407,CZ +3112465408,3112466431,FR +3112466432,3112468479,TR +3112468480,3112469503,CH +3112469504,3112470527,AE +3112470528,3112472575,ES +3112472576,3112473599,RS +3112473600,3112474623,LB +3112474624,3112475647,GB +3112475648,3112476671,IL +3112476672,3112477695,ME +3112477696,3112479743,AE +3112479744,3112480767,RO +3112480768,3112481791,AE +3112481792,3112482815,NL +3112482816,3112485887,AE +3112485888,3112486911,RU +3112486912,3112487935,AE +3112487936,3112488959,KW +3112488960,3112489983,DE +3112489984,3112491007,IR +3112491008,3112492031,SE +3112492032,3112494079,DE +3112494080,3112495103,IT +3112497152,3112498175,RU +3112498176,3112499199,GB +3112499200,3112500223,PS +3112500224,3112501247,NL +3112501248,3112502271,RU +3112502272,3112503295,ES +3112503296,3112505343,DE +3112505344,3112506367,EG +3112506368,3112507391,BG +3112507392,3112508415,DE +3112508416,3112509439,CH +3112509440,3112511487,NL +3112511488,3112512511,RU +3112512512,3112514559,CH +3112514560,3112515583,FR +3112515584,3112516607,CZ +3112516608,3112517631,SK +3112517632,3112518655,RO +3112518656,3112519679,SE +3112519680,3112520191,NL +3112520192,3112520447,GB +3112520448,3112520703,US +3112520704,3112521727,PT +3112521728,3112522751,FR +3112522752,3112523775,SA +3112523776,3112524799,PL +3112524800,3112525823,IT +3112525824,3112526847,ES +3112526848,3112527871,CZ +3112527872,3112528895,DE +3112528896,3112529919,NL +3112529920,3112530943,DE +3112530944,3112531967,FR +3112531968,3112532991,ES +3112532992,3112534015,KW +3112534016,3112535039,FR +3112535040,3112536063,HR +3112536064,3112537087,CZ +3112537088,3112538111,NO +3112538112,3112539135,CZ +3112539136,3112540159,NL +3112540160,3112541183,IR +3112541184,3112542207,GB +3112542208,3112543231,PL +3112543232,3112544255,IR +3112544256,3112545279,GB +3112545280,3112546303,DE +3112546304,3112547327,GB +3112547328,3112548351,SA +3112548352,3112549375,SI +3112549376,3112550399,CZ +3112550400,3112550911,GB +3112550912,3112551167,RO +3112551168,3112551423,US +3112551424,3112552447,CZ +3112552448,3112553471,ES +3112553472,3112554495,SE +3112554496,3112555519,CH +3112555520,3112556543,IR +3112556544,3112557567,IT +3112557568,3112558591,GB +3112558592,3112559615,IQ +3112559616,3112560639,RU +3112560640,3112561663,FR +3112561664,3112562687,DE +3112562688,3112563711,CZ +3112563712,3112564735,AE +3112564736,3112565759,GB +3112565760,3112566783,US +3112566784,3112567807,CZ +3112567808,3112568831,DE +3112568832,3112569855,IT +3112569856,3112571903,SE +3112571904,3112572927,DE +3112572928,3112573951,BE +3112573952,3112574975,DK +3112574976,3112577023,RU +3112577024,3112578047,ES +3112578048,3112579071,DE +3112579072,3112580095,GB +3112580096,3112581119,IT +3112581120,3112582143,NL +3112582144,3112583167,CZ +3112583168,3112584191,NL +3112584192,3112585215,IT +3112585216,3112586239,RU +3112586240,3112587263,LU +3112587264,3112588287,HU +3112588288,3112589311,DE +3112589312,3112590335,FI +3112590336,3112591359,SE +3112591360,3112592383,IR +3112592384,3112593407,FI +3112593408,3112594431,GB +3112594432,3112595455,DE +3112595456,3112596479,GR +3112596480,3112597503,CY +3112597504,3112598527,RU +3112598528,3112599551,NO +3112599552,3112600575,DE +3112600576,3112601599,SY +3112601600,3112602623,ES +3112602624,3112603647,IT +3112603648,3112604671,IE +3112604672,3112605695,RU +3112605696,3112606719,IT +3112606720,3112607743,FR +3112607744,3112608767,CZ +3112608768,3112609791,CH +3112609792,3112610815,TJ +3112610816,3112611839,GE +3112611840,3112612863,LB +3112612864,3112613887,GB +3112613888,3112614911,TR +3112614912,3112615935,SK +3112615936,3112616959,BG +3112616960,3112617983,CH +3112617984,3112620031,RU +3112620032,3112621055,NL +3112621056,3112622079,SK +3112622080,3112623103,NL +3112623104,3112624127,DE +3112624128,3112625151,GB +3112625152,3112626175,BG +3112626176,3112627199,RU +3112627200,3112628223,KZ +3112628224,3112629247,DE +3112629248,3112630271,NO +3112630272,3112631295,NL +3112631296,3112632319,DK +3112632320,3112633343,PL +3112633344,3112634367,CZ +3112634368,3112635135,DE +3112635136,3112635263,BY +3112635264,3112635391,DE +3112635392,3112636415,BE +3112636416,3112637439,AT +3112637440,3112637951,CZ +3112637952,3112638463,SK +3112638464,3112639487,DE +3112639488,3112640511,IR +3112640512,3112641535,DE +3112641536,3112642559,GB +3112642560,3112644607,TR +3112644608,3112645631,SY +3112645632,3112646655,DE +3112646656,3112647679,GB +3112647680,3112648703,DK +3112648704,3112649727,RO +3112649728,3112650751,IQ +3112650752,3112652799,IR +3112652800,3112653823,RU +3112653824,3112654847,IR +3112654848,3112655871,PL +3112655872,3112656895,IT +3112656896,3112657919,TR +3112657920,3112658943,IT +3112658944,3112659967,GB +3112659968,3112660991,TR +3112660992,3112662015,IT +3112662016,3112663039,ES +3112663040,3112664063,PL +3112664064,3112665087,FR +3112665088,3112666111,GB +3112666112,3112667135,CZ +3112669184,3112670207,CZ +3112670208,3112671231,RU +3112671232,3112672255,US +3112672256,3112673279,DE +3112673280,3112674303,FR +3112674304,3112676351,GB +3112676352,3112677375,RU +3112677376,3112678399,FR +3112678400,3112679423,RU +3112679424,3112680447,NO +3112680448,3112681471,IQ +3112681472,3112682495,PL +3112682496,3112683519,CZ +3112683520,3112684543,JO +3112684544,3112685567,ES +3112685568,3112687615,GB +3112687616,3112688639,FR +3112688640,3112689663,TR +3112689664,3112690687,PL +3112690688,3112691711,IR +3112691712,3112692735,RU +3112692736,3112693759,FR +3112693760,3112694783,NL +3112694784,3112695807,GB +3112695808,3112696831,LU +3112696832,3112697855,US +3112697856,3112699903,NL +3112699904,3112700927,RO +3112700928,3112701951,KZ +3112701952,3112702975,MD +3112702976,3112703231,SE +3112703232,3112703487,FI +3112703488,3112703743,DK +3112703744,3112703999,NO +3112704000,3112705023,DE +3112705024,3112706047,ES +3112706048,3112707071,RU +3112707072,3112708095,FI +3112708096,3112709119,FR +3112709120,3112710143,DK +3112710144,3112711167,NO +3112711168,3112712191,PT +3112712192,3112713215,TR +3112713216,3112714239,AT +3112714240,3112715263,NL +3112715264,3112717311,GB +3112717312,3112718335,RU +3112718336,3112719359,AT +3112719360,3112720383,TR +3112720384,3112721407,ES +3112721408,3112722431,PL +3112722432,3112722687,US +3112722688,3112722943,BG +3112722944,3112723199,US +3112723200,3112723455,BG +3112723456,3112724479,IR +3112724480,3112725503,GB +3112725504,3112726527,CZ +3112726528,3112727551,DE +3112727552,3112728575,DK +3112728576,3112729599,CH +3112729600,3112730623,IT +3112730624,3112731647,NO +3112731648,3112732671,PL +3112732672,3112733695,IT +3112733696,3112734719,DE +3112734720,3112735743,SY +3112735744,3112736767,IQ +3112736768,3112737791,PL +3112737792,3112741887,DE +3112741888,3112742911,IR +3112742912,3112743935,RO +3112743936,3112744959,IR +3112744960,3112745983,US +3112745984,3112747007,NL +3112747008,3112748031,IR +3112748032,3112750079,CZ +3112750080,3112751103,TR +3112751104,3112752127,BE +3112752128,3112753151,AT +3112753152,3112754175,ES +3112754176,3112755199,IR +3112755200,3112756223,PL +3112756224,3112757247,AT +3112757248,3112758271,GB +3112758272,3112759295,NL +3112759296,3112760319,IQ +3112760320,3112762367,GB +3112762368,3112763391,IE +3112763392,3112764415,GB +3112764416,3112765439,NO +3112765440,3112766463,GB +3112766464,3112767487,DE +3112767488,3112768018,NL +3112768019,3112768019,RU +3112768020,3112768511,NL +3112768512,3112769535,IE +3112769536,3112770559,IR +3112770560,3112771583,DE +3112771584,3112772607,NL +3112772608,3112773631,UA +3112773632,3112774655,BE +3112774656,3112775679,ES +3112775680,3112776703,PL +3112776704,3112778751,ES +3112778752,3112779775,IR +3112779776,3112780799,GB +3112780800,3112781823,ES +3112781824,3112782847,FR +3112782848,3112783871,RU +3112783872,3112784895,NL +3112784896,3112785919,IT +3112785920,3112786943,TR +3112786944,3112787967,DE +3112787968,3112788991,LU +3112788992,3112791039,ES +3112791040,3112792063,IR +3112792064,3112793087,DK +3112793088,3112794111,BY +3112794112,3112795135,DE +3112795136,3112796159,CZ +3112796160,3112797183,GB +3112797184,3112798207,RO +3112798208,3112799231,DE +3112799232,3112800255,ES +3112800256,3112801279,CZ +3112801280,3112802303,PL +3112802304,3112803327,ES +3112803328,3112804351,RO +3112804352,3112805375,RU +3112805376,3112806399,CH +3112806400,3112807423,DE +3112807424,3112808447,CH +3112808448,3112809471,RU +3112809472,3112809727,GB +3112809728,3112809983,BG +3112809984,3112810495,NL +3112810496,3112811519,DE +3112811520,3112812543,SE +3112812544,3112814591,GB +3112814592,3112815615,NL +3112815616,3112816639,IT +3112816640,3112817663,NL +3112817664,3112818687,TR +3112818688,3112819711,UA +3112819712,3112820735,GB +3112820736,3112821759,IT +3112821760,3112822783,FR +3112822784,3112823807,RU +3112823808,3112824831,CH +3112824832,3112825855,GB +3112825856,3112826879,SA +3112826880,3112827903,PL +3112827904,3112828927,FR +3112828928,3112829951,GB +3112829952,3112830975,DE +3112830976,3112831999,RU +3112832000,3112833023,AZ +3112833024,3112834047,ES +3112834048,3112835071,CH +3112835072,3112836095,DE +3112836096,3112836607,ES +3112836608,3112836863,SE +3112836864,3112837119,ES +3112837120,3112838143,NO +3112838144,3112839167,IT +3112839168,3112840191,GR +3112840192,3112841215,CZ +3112841216,3112842239,FI +3112842240,3112843263,DE +3112843264,3112844287,NL +3112844288,3112845311,GB +3112845312,3112846335,SE +3112846336,3112847359,CZ +3112847360,3112848383,NO +3112848384,3112849407,UA +3112849408,3112850431,NL +3112850432,3112851455,TR +3112851456,3112852479,RU +3112852480,3112853503,ES +3112853504,3112854527,BE +3112854528,3112855551,KG +3112855552,3112856575,FR +3112856576,3112857599,CZ +3112857600,3112858623,IE +3112858624,3112859647,FR +3112859648,3112860671,IQ +3112860672,3112861695,AT +3112861696,3112862719,RU +3112862720,3112863743,GB +3112863744,3112865791,DE +3112865792,3112866815,DK +3112866816,3112867839,FR +3112867840,3112869887,GB +3112869888,3112870911,RU +3112870912,3112871935,DE +3112871936,3112872959,IL +3112872960,3112873983,IS +3112873984,3112875007,BG +3112875008,3112876031,RU +3112876032,3112877055,KG +3112877056,3112878079,CZ +3112878080,3112880127,GB +3112880128,3112882175,RU +3112882176,3112883199,NL +3112883200,3112884223,RU +3112884224,3112885247,IT +3112885248,3112886271,CZ +3112886272,3112887295,PL +3112887296,3112888319,UA +3112888320,3112889343,GB +3112889344,3112890367,PL +3112890368,3112891391,NL +3112891392,3112892415,CZ +3112892416,3112893439,NL +3112893440,3112894463,RU +3112894464,3112895487,DE +3112895488,3112896511,BG +3112896512,3112897535,SA +3112897536,3112898559,LB +3112898560,3112899583,PL +3112899584,3112900607,FR +3112900608,3112901631,GB +3112901632,3112902655,IT +3112902656,3112903679,DE +3112903680,3112904703,GB +3112904704,3112905727,PL +3112905728,3112906751,BE +3112906752,3112907775,IT +3112907776,3112908799,UA +3112908800,3112909823,GE +3112909824,3112910847,ES +3112910848,3112911871,IR +3112911872,3112912895,RO +3112912896,3112914943,DE +3112914944,3112916991,DK +3112916992,3112918015,NO +3112918016,3112920063,DE +3112920064,3112921087,DK +3112921088,3112922111,IT +3112922112,3112923135,RU +3112923136,3112924159,DE +3112924160,3112925183,GE +3112925184,3112926207,SA +3112926208,3112927231,PL +3112927232,3112928255,US +3112928256,3112929279,FR +3112929280,3112930303,UZ +3112930304,3112931327,GB +3112931328,3112932351,US +3112932352,3112933375,NL +3112933376,3112934399,NO +3112934400,3112935423,DE +3112935424,3112937471,NO +3112937472,3112938495,FI +3112938496,3112939519,NO +3112939520,3112940543,ES +3112940544,3112941567,IT +3112941568,3112942591,CH +3112942592,3112943615,NO +3112943616,3112944639,ES +3112944640,3112945663,TR +3112945664,3112946687,UA +3112946688,3112947711,DE +3112947712,3112948735,AT +3112948736,3112949759,RU +3112949760,3112950783,CZ +3112950784,3112951807,JO +3112951808,3112952831,SK +3112952832,3112953855,IL +3112953856,3112954879,DK +3112954880,3112954917,RS +3112954918,3112954918,DE +3112954919,3112955007,RS +3112955008,3112955008,DE +3112955009,3112955135,AE +3112955136,3112955263,QA +3112955264,3112955391,KW +3112955392,3112955903,DE +3112955904,3112956927,IL +3112956928,3112958975,FR +3112958976,3112959999,EE +3112960000,3112961023,DK +3112961024,3112962047,IR +3112962048,3112963071,GB +3112963072,3112964095,IR +3112964096,3112965119,GB +3112965120,3112966143,NL +3112966144,3112967167,PL +3112967168,3112968191,SK +3112968192,3112969215,ES +3112969216,3112970239,DE +3112970240,3112971263,SK +3112971264,3112972287,FR +3112972288,3112973311,US +3112973312,3112973567,SE +3112973568,3112973823,DE +3112973824,3112974079,UA +3112974080,3112974083,HU +3112974084,3112974087,AT +3112974088,3112974335,HU +3112974336,3112975359,IR +3112975360,3112977407,ES +3112977408,3112978431,FR +3112978432,3112979455,NL +3112979456,3112980479,PL +3112980480,3112981503,GB +3112981504,3112982527,AT +3112982528,3112983551,CH +3112983552,3112984575,IE +3112984576,3112985599,AE +3112985600,3112986623,PL +3112986624,3112987647,DE +3112987648,3112988927,HU +3112988928,3112989042,NL +3112989043,3112989043,AT +3112989044,3112989183,NL +3112989184,3112989439,ES +3112989440,3112989695,AT +3112989696,3112990719,SE +3112990720,3112991743,PL +3112991744,3112992767,TR +3112992768,3112993791,FR +3112993792,3112994815,RU +3112994816,3112995839,FR +3112995840,3112996863,AT +3112996864,3112997887,GB +3112997888,3112998911,RU +3112998912,3112999935,IT +3112999936,3113000959,NL +3113000960,3113001983,RU +3113001984,3113003007,NL +3113003008,3113004031,IT +3113004032,3113006079,US +3113006080,3113007103,PS +3113007104,3113008127,NL +3113008128,3113009151,ES +3113009152,3113010175,IQ +3113010176,3113011199,FR +3113011200,3113012223,DE +3113012224,3113013247,US +3113013248,3113014271,RU +3113014272,3113016319,ES +3113017344,3113018367,NL +3113018368,3113019391,LT +3113019392,3113020415,IR +3113020416,3113021439,CZ +3113021440,3113022463,IR +3113022464,3113023487,CZ +3113023488,3113024511,AE +3113024512,3113025535,DE +3113025536,3113026559,CH +3113026560,3113027583,FR +3113027584,3113028607,IQ +3113028608,3113029631,AE +3113029632,3113030655,ES +3113030656,3113031679,CH +3113031680,3113032447,RO +3113032448,3113032703,NL +3113032704,3113033727,SE +3113033728,3113034751,TR +3113034752,3113035775,IR +3113035776,3113036799,RU +3113036800,3113037823,ES +3113037824,3113038847,IR +3113038848,3113039871,LV +3113039872,3113040895,GB +3113041920,3113042943,DE +3113042944,3113043967,DK +3113043968,3113044991,NO +3113044992,3113046015,RU +3113046016,3113047039,FI +3113047040,3113048063,IT +3113048064,3113049087,NO +3113049088,3113050111,RU +3113050112,3113051135,FI +3113052160,3113053183,IR +3113053184,3113054207,TR +3113054208,3113055231,SE +3113055232,3113056255,FR +3113056256,3113057279,DE +3113057280,3113058303,RU +3113058304,3113059327,FR +3113059328,3113060351,IR +3113060352,3113061375,PL +3113061376,3113062399,GB +3113062400,3113063423,DK +3113063424,3113064447,DE +3113064448,3113065471,SE +3113065472,3113066495,NO +3113066496,3113067519,LT +3113067520,3113067935,DE +3113067936,3113067936,US +3113067937,3113068543,DE +3113068544,3113069567,IR +3113069568,3113070591,IT +3113070592,3113071615,GB +3113071616,3113072639,RU +3113072640,3113073663,IT +3113073664,3113074687,RS +3113074688,3113074943,GB +3113074944,3113075199,GR +3113075200,3113075455,CY +3113075456,3113075711,GB +3113075712,3113076735,HU +3113076736,3113077759,DE +3113077760,3113078015,GB +3113078016,3113078271,NL +3113078272,3113078783,GB +3113078784,3113079807,BE +3113079808,3113080831,IR +3113080832,3113081855,TR +3113081856,3113082879,ES +3113083904,3113084927,IT +3113084928,3113086975,RU +3113086976,3113087999,ES +3113088000,3113089023,IR +3113089024,3113090047,MT +3113090048,3113091071,GB +3113091072,3113093119,NL +3113093120,3113094143,DE +3113094144,3113095167,ES +3113095168,3113096191,GB +3113096192,3113097215,IT +3113097216,3113097471,DE +3113097472,3113097727,GB +3113097728,3113097983,DE +3113097984,3113098239,GB +3113098240,3113099263,IE +3113099264,3113100287,NL +3113100288,3113102335,LB +3113102336,3113103359,ES +3113103360,3113104383,SK +3113104384,3113105407,FR +3113105408,3113106431,PS +3113106432,3113107455,ES +3113107456,3113108479,RU +3113108480,3113109503,IT +3113109504,3113110527,SE +3113110528,3113111551,NL +3113111552,3113112575,NO +3113112576,3113113599,GB +3113113600,3113114623,IT +3113114624,3113115647,IR +3113116672,3113117695,NL +3113117696,3113118719,KW +3113118720,3113120767,DE +3113120768,3113121791,GB +3113121792,3113122815,IT +3113122816,3113123839,IR +3113123840,3113124863,GB +3113124864,3113125887,VG +3113125888,3113126911,FR +3113126912,3113127167,DE +3113127168,3113127423,GB +3113127424,3113127935,AT +3113127936,3113128959,NL +3113128960,3113129983,CH +3113129984,3113131007,IT +3113131008,3113132031,IR +3113132032,3113133055,PL +3113133056,3113134079,UA +3113134080,3113136127,IT +3113136128,3113139199,DE +3113139200,3113140223,FR +3113140224,3113141247,ES +3113141248,3113142271,NO +3113142272,3113143295,ES +3113143296,3113144319,PL +3113144320,3113145343,CZ +3113145344,3113146367,CH +3113146368,3113147391,RO +3113147392,3113148415,ES +3113148416,3113149439,BE +3113149440,3113150463,DE +3113150464,3113151487,IR +3113151488,3113151743,NL +3113151744,3113151999,SE +3113152000,3113152511,NL +3113152512,3113153535,SG +3113153536,3113154559,IT +3113154560,3113156607,NL +3113156608,3113157631,ES +3113157632,3113160703,DE +3113160704,3113160959,IE +3113160960,3113161727,DE +3113161728,3113162751,KZ +3113162752,3113163775,SA +3113163776,3113164799,NL +3113164800,3113165823,PL +3113165824,3113166847,GB +3113166848,3113167871,IQ +3113167872,3113168895,RS +3113168896,3113169919,HU +3113169920,3113170943,NL +3113170944,3113171967,UA +3113171968,3113172991,FI +3113172992,3113175039,DE +3113175040,3113176063,IR +3113176064,3113177087,GB +3113177088,3113178111,BG +3113178112,3113179135,GB +3113179136,3113180159,RU +3113180160,3113182207,ES +3113182208,3113183231,UA +3113183232,3113184255,NL +3113184256,3113185279,RU +3113185280,3113186303,CZ +3113186304,3113187327,PL +3113187328,3113188351,RS +3113188352,3113189375,BH +3113190400,3113191423,NL +3113191424,3113193471,ES +3113193472,3113194495,UA +3113194496,3113195519,SE +3113195520,3113196543,IT +3113196544,3113197567,NL +3113197568,3113198591,PL +3113198592,3113200639,DE +3113200640,3113201663,RU +3113201664,3113202687,GE +3113202688,3113203711,AT +3113203712,3113204735,GB +3113204736,3113205759,BE +3113205760,3113206783,HR +3113206784,3113207807,AZ +3113207808,3113208831,HU +3113208832,3113209855,IR +3113209856,3113210879,NO +3113210880,3113211903,GB +3113211904,3113212927,NO +3113213952,3113214975,GB +3113214976,3113215087,DE +3113215088,3113215091,GB +3113215092,3113215359,DE +3113215360,3113215391,GB +3113215392,3113215471,DE +3113215472,3113215487,GB +3113215488,3113215615,DE +3113215616,3113215647,GB +3113215648,3113215727,DE +3113215728,3113215743,FI +3113215744,3113215839,DE +3113215840,3113215871,GB +3113215872,3113215983,DE +3113215984,3113215999,GB +3113216000,3113217023,US +3113217024,3113218047,FR +3113218048,3113219071,NL +3113219072,3113220095,FR +3113220096,3113221119,GB +3113221120,3113222143,DK +3113222144,3113223167,GB +3113223168,3113224191,NL +3113224192,3113225215,DE +3113225216,3113226239,TR +3113226240,3113227263,DE +3113227264,3113228287,NL +3113228288,3113230335,RU +3113230336,3113231359,FR +3113231360,3113232383,CH +3113232384,3113233407,LB +3113233408,3113234431,FR +3113234432,3113235455,DE +3113235456,3113236479,ES +3113236480,3113237503,NL +3113237504,3113238527,RU +3113238528,3113239551,IR +3113239552,3113240575,US +3113240576,3113241599,IT +3113241600,3113242623,TR +3113242624,3113243647,RO +3113243648,3113244671,US +3113244672,3113245695,GB +3113245696,3113245951,AT +3113245952,3113246719,DE +3113246720,3113246975,SK +3113246976,3113247231,RU +3113247232,3113247487,FR +3113247488,3113247743,RU +3113247744,3113247999,NL +3113248000,3113248767,GB +3113248768,3113249791,NL +3113249792,3113250815,GB +3113250816,3113251839,FR +3113251840,3113252863,LT +3113252864,3113253887,IT +3113253888,3113254911,IE +3113254912,3113255935,NO +3113255936,3113256959,GB +3113256960,3113257983,RU +3113257984,3113259007,GB +3113259008,3113260031,SE +3113260032,3113261055,GB +3113261056,3113262079,FR +3113262080,3113263103,US +3113263104,3113264127,AT +3113264128,3113265151,SK +3113265152,3113266175,IL +3113266176,3113267199,PL +3113267200,3113268223,CZ +3113268224,3113269247,GB +3113269248,3113270271,LV +3113270272,3113271295,DE +3113271296,3113272319,FR +3113272320,3113273343,NL +3113273344,3113274367,RU +3113274368,3113275391,DE +3113275392,3113276415,ES +3113276416,3113277439,IT +3113277440,3113278463,US +3113278464,3113279487,GB +3113279488,3113280511,NL +3113280512,3113281535,GB +3113281536,3113282559,ES +3113282560,3113283583,DE +3113283584,3113284607,GB +3113284608,3113285631,PL +3113285632,3113286655,TR +3113286656,3113287679,FR +3113287680,3113288703,AL +3113288704,3113289727,EE +3113289728,3113290751,IR +3113290752,3113292799,NL +3113292800,3113293823,AT +3113293824,3113294847,NL +3113294848,3113295871,IL +3113295872,3113296895,FR +3113296896,3113297119,DE +3113297120,3113297151,GB +3113297152,3113297343,DE +3113297344,3113297375,GB +3113297376,3113297391,DE +3113297392,3113297407,ES +3113297408,3113297567,DE +3113297568,3113297599,GB +3113297600,3113297647,DE +3113297648,3113297663,GB +3113297664,3113297887,DE +3113297888,3113297919,GB +3113297920,3113298943,ES +3113298944,3113299199,RU +3113299200,3113299455,NL +3113299456,3113300991,GB +3113300992,3113303039,RU +3113303040,3113304063,NL +3113304064,3113304895,DE +3113304896,3113304959,GB +3113304960,3113305087,DE +3113305088,3113306111,ES +3113306112,3113307135,UA +3113307136,3113308159,FR +3113308160,3113309183,DE +3113309184,3113310207,IT +3113310208,3113311231,GB +3113311232,3113312255,SE +3113312256,3113313279,BG +3113313280,3113314303,IT +3113314304,3113315327,UA +3113315328,3113316351,CH +3113316352,3113317375,RO +3113317376,3113318399,AT +3113318400,3113319423,GE +3113319424,3113320447,RU +3113320448,3113321471,NL +3113321472,3113322495,AT +3113323520,3113324543,RU +3113324544,3113325567,HU +3113325568,3113326591,CH +3113326592,3113328639,GB +3113328640,3113329663,CZ +3113329664,3113330687,GR +3113330688,3113331711,DE +3113331712,3113332735,FI +3113332736,3113333759,ES +3113333760,3113334783,UA +3113334784,3113335807,IR +3113335808,3113336831,NO +3113336832,3113337855,NL +3113337856,3113338879,DE +3113338880,3113339903,GB +3113339904,3113340927,HU +3113340928,3113341951,NL +3113341952,3113342975,IL +3113342976,3113343231,GB +3113343232,3113343487,DE +3113343488,3113343743,FR +3113343744,3113343999,IT +3113344000,3113345023,DE +3113345024,3113347071,ES +3113347072,3113348095,CY +3113348096,3113349119,SY +3113349120,3113350143,DE +3113350144,3113351167,NL +3113351168,3113352191,FR +3113352192,3113353215,NL +3113353216,3113354239,KZ +3113354240,3113355263,CZ +3113355264,3113356287,PL +3113356288,3113357311,FI +3113357312,3113358335,KZ +3113358336,3113359359,CZ +3113359360,3113360383,FR +3113360384,3113361407,BG +3113361408,3113362431,US +3113362432,3113363455,DE +3113363456,3113364479,FR +3113364480,3113365503,GB +3113365504,3113366527,DE +3113366528,3113367551,PL +3113367552,3113368575,ES +3113368576,3113369599,DE +3113370624,3113371647,NL +3113371648,3113372671,RU +3113372672,3113373695,FR +3113373696,3113374719,CH +3113374720,3113375743,RO +3113375744,3113376767,TR +3113376768,3113377791,PT +3113377792,3113378815,PL +3113378816,3113379839,NO +3113379840,3113380863,NL +3113380864,3113381887,US +3113381888,3113382911,AZ +3113382912,3113383935,RU +3113383936,3113384959,UA +3113384960,3113385983,US +3113385984,3113388031,IT +3113388032,3113389055,SY +3113389056,3113390079,SE +3113390080,3113391103,BG +3113391104,3113392127,CZ +3113392128,3113393151,GB +3113393152,3113394175,RU +3113394176,3113396223,TR +3113396224,3113397247,RU +3113397248,3113398271,SE +3113398272,3113399295,GE +3113399296,3113401343,IE +3113401344,3113402367,NL +3113402368,3113403391,GB +3113403392,3113404415,DE +3113404416,3113405439,NO +3113405440,3113406463,DE +3113406464,3113407487,DK +3113407488,3113408511,RU +3113408512,3113409535,NL +3113409536,3113410559,FR +3113410560,3113411583,PL +3113411584,3113412607,DE +3113412608,3113413631,RO +3113413632,3113414655,DE +3113414656,3113415679,KW +3113415680,3113416703,PL +3113416704,3113417727,DE +3113417728,3113418751,SI +3113418752,3113419775,FR +3113419776,3113420799,DE +3113420800,3113421823,CH +3113421824,3113422847,NL +3113422848,3113423871,ES +3113423872,3113424895,FI +3113424896,3113425151,AZ +3113425152,3113425407,SK +3113425408,3113425919,CZ +3113425920,3113426943,KW +3113426944,3113427199,FR +3113427200,3113427455,SG +3113427456,3113427711,NL +3113427712,3113427967,US +3113427968,3113428991,RU +3113428992,3113430015,IR +3113430016,3113431039,CZ +3113431040,3113432063,MD +3113432064,3113433087,PL +3113433088,3113434111,LV +3113434112,3113435135,TR +3113435136,3113436159,FR +3113436160,3113437183,PL +3113437184,3113437439,DK +3113437440,3113437567,GB +3113437568,3113438207,DK +3113438208,3113439231,DE +3113439232,3113440255,RU +3113440256,3113441279,IR +3113441280,3113442303,GB +3113442304,3113443327,RU +3113443328,3113444351,UA +3113444352,3113446399,DE +3113446400,3113447423,GB +3113447424,3113448447,NL +3113448448,3113449471,IT +3113449472,3113450495,EE +3113450496,3113452543,RU +3113452544,3113453567,GB +3113453568,3113454591,IS +3113454592,3113455615,RO +3113455616,3113456639,DK +3113456640,3113457663,FR +3113457664,3113458687,NL +3113458688,3113459711,US +3113459712,3113460735,IR +3113460736,3113461759,IT +3113461760,3113462783,DE +3113462784,3113463807,IE +3113463808,3113464831,IR +3113464832,3113465855,IS +3113465856,3113466879,GB +3113466880,3113467903,CH +3113467904,3113468927,RU +3113468928,3113469951,TR +3113469952,3113470975,ME +3113470976,3113471999,FR +3113472000,3113473023,GB +3113473024,3113473279,FR +3113473280,3113473535,SE +3113473536,3113473791,ES +3113473792,3113475071,DE +3113475072,3113479167,FR +3113479168,3113480191,SE +3113480192,3113481215,FR +3113481216,3113482239,GB +3113482240,3113483263,CZ +3113483264,3113484287,PL +3113484288,3113485311,FI +3113485312,3113486335,GB +3113486336,3113487359,IT +3113487360,3113488383,IR +3113488384,3113489407,NO +3113489408,3113490431,NL +3113490432,3113491455,RU +3113491456,3113492479,GE +3113492480,3113493503,TR +3113493504,3113494527,RU +3113494528,3113497599,NL +3113497600,3113498623,ES +3113498624,3113499647,TR +3113499648,3113500671,BG +3113500672,3113501695,PL +3113501696,3113502719,DE +3113502720,3113503743,SI +3113503744,3113504767,CH +3113504768,3113505791,RU +3113505792,3113506815,TR +3113506816,3113507839,GB +3113507840,3113508863,AT +3113508864,3113509887,DE +3113509888,3113510911,IT +3113510912,3113511935,RU +3113511936,3113512959,IT +3113512960,3113513983,PT +3113513984,3113515007,IT +3113515008,3113516031,FR +3113516032,3113517055,CH +3113517056,3113518079,CZ +3113518080,3113519103,GB +3113519104,3113520127,CH +3113520128,3113521151,SE +3113521152,3113522175,BG +3113522176,3113523199,SA +3113523200,3113524223,IT +3113524224,3113525247,AT +3113525248,3113526271,BG +3113526272,3113527295,FR +3113527296,3113528319,DE +3113528320,3113529343,CZ +3113529344,3113530367,NO +3113530368,3113531391,US +3113531392,3113532415,DE +3113532416,3113533439,IT +3113533440,3113534463,SY +3113534464,3113535487,GB +3113535488,3113536511,RS +3113536512,3113537535,IT +3113537536,3113538559,RU +3113538560,3113539583,CZ +3113539584,3113541631,RU +3113541632,3113542655,FR +3113542656,3113543679,CH +3113543680,3113544703,NL +3113544704,3113545727,AT +3113545728,3113546751,TR +3113546752,3113547775,FR +3113547776,3113548799,DE +3113548800,3113549823,FR +3113549824,3113550847,PL +3113550848,3113551871,GB +3113551872,3113552895,UZ +3113552896,3113553919,UA +3113553920,3113554943,NO +3113554944,3113555967,UA +3113555968,3113556991,NL +3113556992,3113558015,DE +3113558016,3113559039,IT +3113559040,3113560063,NL +3113560064,3113561087,UA +3113561088,3113562111,SE +3113562112,3113563135,RU +3113563136,3113564159,DE +3113564160,3113565183,NL +3113565184,3113566207,FR +3113566208,3113567231,RU +3113567232,3113568255,US +3113568256,3113569279,ES +3113569280,3113570303,NL +3113570304,3113571327,ES +3113571328,3113573375,NL +3113573376,3113574399,CH +3113575424,3113576447,TR +3113576448,3113577471,BG +3113577472,3113578495,GB +3113578496,3113579519,CZ +3113579520,3113580543,GB +3113580544,3113581567,PL +3113581568,3113582591,RU +3113582592,3113583615,CZ +3113583616,3113584639,NL +3113584640,3113585663,LU +3113585664,3113586687,AM +3113586688,3113587199,RU +3113587200,3113587455,LU +3113587456,3113587711,RU +3113587712,3113588735,DE +3113588736,3113589759,LT +3113589760,3113590783,DE +3113590784,3113591807,RU +3113591808,3113592831,DE +3113592832,3113593855,GE +3113593856,3113594879,LU +3113594880,3113595903,GB +3113595904,3113596927,SA +3113596928,3113597951,CZ +3113597952,3113598975,IT +3113598976,3113599999,GB +3113600000,3113601023,UA +3113601024,3113602047,PL +3113602048,3113603071,CZ +3113603072,3113604095,GB +3113604096,3113605119,DE +3113605120,3113606143,FR +3113606144,3113607167,GB +3113607168,3113608191,DE +3113608192,3113609215,DK +3113609216,3113610239,SA +3113610240,3113611263,GB +3113611264,3113613311,RU +3113613312,3113614335,DE +3113614336,3113615359,IL +3113615360,3113616383,TR +3113616384,3113617407,CH +3113617408,3113618431,AT +3113618432,3113619455,RU +3113619456,3113620479,RO +3113620480,3113621503,GB +3113621504,3113622527,NL +3113622528,3113623551,CH +3113623552,3113624575,DE +3113624576,3113625599,IT +3113625600,3113626623,LT +3113626624,3113627647,PL +3113627648,3113628671,DE +3113628672,3113629695,CH +3113629696,3113630719,NL +3113630720,3113631743,GB +3113631744,3113632767,IT +3113632768,3113633791,NL +3113633792,3113634815,DK +3113634816,3113636863,ES +3113636864,3113637887,DE +3113637888,3113638911,FR +3113638912,3113639935,BG +3113639936,3113640959,DE +3113640960,3113641983,ES +3113641984,3113643007,SA +3113643008,3113644031,IR +3113644032,3113645055,NO +3113645056,3113646079,IR +3113646080,3113647103,FR +3113647104,3113648127,CZ +3113648128,3113649151,TR +3113649152,3113650175,PL +3113650176,3113651199,GB +3113651200,3113652223,SY +3113652224,3113653759,GB +3113653760,3113653763,DE +3113653764,3113653767,FR +3113653768,3113653771,GB +3113653772,3113653775,IT +3113653776,3113653779,ES +3113653780,3113653781,NL +3113653782,3113653783,BE +3113653784,3113653785,GR +3113653786,3113653787,PT +3113653788,3113653789,SE +3113653790,3113653791,AT +3113653792,3113653793,CH +3113653794,3113653795,DK +3113653796,3113653797,FI +3113653798,3113653799,NO +3113653800,3113653801,IE +3113653802,3113653803,IS +3113653804,3113653805,FO +3113653806,3113653887,GB +3113653888,3113653889,DE +3113653890,3113653891,FR +3113653892,3113653893,GB +3113653894,3113653895,IT +3113653896,3113653897,ES +3113653898,3113653898,NL +3113653899,3113653899,BE +3113653900,3113653900,GR +3113653901,3113653901,PT +3113653902,3113653902,SE +3113653903,3113653903,AT +3113653904,3113653904,CH +3113653905,3113653905,DK +3113653906,3113653906,FI +3113653907,3113653907,NO +3113653908,3113653908,IE +3113653909,3113653909,IS +3113653910,3113653910,FO +3113653911,3113654015,GB +3113654016,3113654019,DE +3113654020,3113654023,FR +3113654024,3113654027,GB +3113654028,3113654031,IT +3113654032,3113654035,ES +3113654036,3113654037,NL +3113654038,3113654039,BE +3113654040,3113654041,GR +3113654042,3113654043,PT +3113654044,3113654045,SE +3113654046,3113654047,AT +3113654048,3113654049,CH +3113654050,3113654051,DK +3113654052,3113654053,FI +3113654054,3113654055,NO +3113654056,3113654057,IE +3113654058,3113654059,IS +3113654060,3113654061,FO +3113654062,3113654271,GB +3113654272,3113655295,RU +3113655296,3113656319,NL +3113656320,3113657343,FR +3113657344,3113658367,AM +3113658368,3113659391,IE +3113659392,3113660415,FR +3113660416,3113661439,GB +3113661440,3113662463,UA +3113662464,3113664511,NL +3113664512,3113665535,BA +3113665536,3113666559,DK +3113666560,3113667583,GB +3113667584,3113668607,TR +3113668608,3113669631,NL +3113669632,3113670655,CZ +3113670656,3113671679,KW +3113671680,3113672703,IE +3113672704,3113673727,GB +3113673728,3113674751,IT +3113674752,3113675775,HR +3113675776,3113676799,PL +3113676800,3113677823,FR +3113677824,3113678847,DE +3113678848,3113679871,PL +3113679872,3113680895,FR +3113680896,3113681919,SK +3113681920,3113682943,AE +3113682944,3113683967,NO +3113683968,3113684991,US +3113684992,3113686015,NO +3113686016,3113687039,AT +3113687040,3113688063,IT +3113688064,3113689087,GB +3113689088,3113690111,IT +3113691136,3113692159,KZ +3113692160,3113693183,GB +3113693184,3113694207,DE +3113694208,3113695227,FR +3113695228,3113695228,GB +3113695229,3113695231,FR +3113695232,3113695347,DE +3113695348,3113695351,GB +3113695352,3113695359,DE +3113695360,3113695615,GB +3113695616,3113695647,DE +3113695648,3113695679,GB +3113695680,3113695727,DE +3113695728,3113695743,GB +3113695744,3113695775,DE +3113695776,3113695807,GB +3113695808,3113695839,DE +3113695840,3113695855,GB +3113695856,3113696031,DE +3113696032,3113696063,GB +3113696064,3113696111,DE +3113696112,3113696127,CH +3113696128,3113696255,DE +3113696256,3113697279,NL +3113697280,3113698303,DE +3113698304,3113699327,FR +3113699328,3113700351,PL +3113700352,3113701375,FI +3113701376,3113702399,SY +3113702400,3113703423,UA +3113703424,3113704447,DK +3113704448,3113705471,IT +3113705472,3113706495,IR +3113706496,3113707519,DE +3113707520,3113708543,UA +3113708544,3113709567,ES +3113709568,3113710317,BE +3113710318,3113710318,CA +3113710319,3113710591,BE +3113710592,3113711615,PL +3113711616,3113712639,RU +3113712640,3113713663,IT +3113713664,3113714687,UA +3113714688,3113715711,HR +3113715712,3113716735,GE +3113716736,3113717759,DE +3113717760,3113718783,IT +3113718784,3113719807,SY +3113719808,3113720831,DE +3113720832,3113721855,BG +3113721856,3113722623,US +3113722624,3113722879,GB +3113722880,3113723903,CH +3113723904,3113725951,CZ +3113725952,3113726975,ES +3113726976,3113727999,FR +3113728000,3113729023,UA +3113729024,3113730047,FR +3113730048,3113731071,DK +3113731072,3113732095,IL +3113732096,3113734143,DE +3113734144,3113735167,ES +3113735168,3113736191,FR +3113736192,3113737215,ES +3113737216,3113738239,NL +3113738240,3113739263,GB +3113739264,3113740287,FR +3113740288,3113741311,NL +3113741312,3113742335,IR +3113742336,3113743359,RU +3113743360,3113744383,PL +3113744384,3113745407,FI +3113745408,3113746431,CZ +3113746432,3113747455,GB +3113747456,3113748479,IE +3113748480,3113749503,GB +3113749504,3113750527,ES +3113750528,3113751551,CH +3113751552,3113752575,TR +3113752576,3113753599,FR +3113753600,3113754623,SK +3113754624,3113755135,DK +3113755136,3113755647,NO +3113755648,3113756671,GB +3113756672,3113758719,IT +3113758720,3113759743,GB +3113759744,3113760767,FR +3113760768,3113761791,BE +3113761792,3113762815,ES +3113762816,3113763327,CZ +3113763328,3113763839,US +3113763840,3113764863,VA +3113764864,3113765887,IE +3113766912,3113767935,RU +3113767936,3113768959,NL +3113768960,3113769983,TR +3113769984,3113771007,RU +3113771008,3113772031,DE +3113772032,3113773055,CZ +3113773056,3113774079,DE +3113774080,3113775103,NL +3113775104,3113776127,SK +3113776128,3113777151,IS +3113777152,3113778175,PL +3113778176,3113779199,TR +3113779200,3113780223,GB +3113780224,3113781247,RU +3113781248,3113782271,BY +3113782272,3113783295,IT +3113783296,3113784319,TR +3113784320,3113785343,IT +3113785344,3113786367,CZ +3113786368,3113787391,IT +3113787392,3113788415,GB +3113788416,3113789439,ES +3113789440,3113790463,FR +3113790464,3113791487,ES +3113791488,3113792511,SE +3113792512,3113793535,HU +3113793536,3113794559,RU +3113794560,3113795583,ES +3113795584,3113796607,RU +3113796608,3113797631,SK +3113797632,3113798655,DK +3113798656,3113800703,DE +3113800704,3113801727,NL +3113801728,3113802751,GB +3113802752,3113803775,DE +3113803776,3113804799,CH +3113804800,3113805823,SE +3113805824,3113807871,DE +3113807872,3113808895,IT +3113808896,3113809919,DE +3113809920,3113810943,GB +3113810944,3113812991,IT +3113812992,3113814015,SE +3113814016,3113815039,FR +3113815040,3113816063,GB +3113816064,3113817087,ES +3113818112,3113819135,SI +3113819136,3113820159,FR +3113820160,3113822207,PL +3113822208,3113823231,BE +3113823232,3113824255,RU +3113824256,3113825279,MK +3113825280,3113826303,GE +3113826304,3113827327,IE +3113827328,3113828351,NL +3113828352,3113829375,DE +3113829376,3113830399,BE +3113830400,3113831423,CZ +3113831424,3113832447,IT +3113832448,3113833471,CZ +3113833472,3113834495,LB +3113834496,3113835519,DE +3113836544,3113837567,FR +3113837568,3113838591,GB +3113838592,3113839615,CH +3113839616,3113840639,IT +3113840640,3113841663,FR +3113841664,3113842687,ES +3113842688,3113843711,UA +3113843712,3113844735,IT +3113844736,3113845759,GB +3113845760,3113846783,RU +3113846784,3113847807,ES +3113847808,3113848831,DE +3113848832,3113849855,EE +3113849856,3113850879,IL +3113850880,3113851903,DK +3113851904,3113852927,SE +3113852928,3113853951,PS +3113853952,3113854975,US +3113854976,3113855999,ES +3113856000,3113857023,GB +3113857024,3113857279,BR +3113857280,3113857535,MX +3113857536,3113857791,US +3113857792,3113858047,CA +3113858048,3113859071,UA +3113859072,3113860095,IR +3113860096,3113861119,NL +3113861120,3113862143,CZ +3113862144,3113863167,MD +3113863168,3113864191,LT +3113864192,3113865215,GB +3113865216,3113866239,IR +3113866240,3113867263,LB +3113867264,3113868287,HU +3113868288,3113869311,TR +3113869312,3113870335,ES +3113870336,3113871359,TR +3113871360,3113872383,FR +3113872384,3113873407,GB +3113873408,3113874431,RU +3113874432,3113875455,FR +3113875456,3113876479,TR +3113876480,3113877503,DK +3113877504,3113878527,ES +3113878528,3113879551,US +3113879552,3113880575,ES +3113880576,3113881599,NL +3113881600,3113882623,RO +3113882624,3113883647,RU +3113883648,3113884671,ES +3113884672,3113885695,DE +3113885696,3113886719,FR +3113886720,3113887743,CH +3113887744,3113888767,AT +3113888768,3113889791,IT +3113889792,3113890815,GB +3113890816,3113891839,RU +3113891840,3113892863,ES +3113892864,3113893887,CZ +3113893888,3113894911,TR +3113894912,3113895935,DK +3113895936,3113896959,RU +3113896960,3113899007,IE +3113899008,3113900031,CH +3113900032,3113901055,IT +3113901056,3113902079,CH +3113902080,3113903103,PL +3113903104,3113904127,CH +3113904128,3113905151,DE +3113905152,3113906175,SE +3113906176,3113907199,DE +3113907200,3113908223,IS +3113908224,3113910271,RU +3113910272,3113911295,TR +3113911296,3113912319,GB +3113912320,3113913343,FR +3113913344,3113914367,BE +3113914368,3113915391,GB +3113915392,3113916415,DE +3113916416,3113916927,FR +3113916928,3113917439,EE +3113917440,3113918463,NL +3113918464,3113919487,ES +3113919488,3113920511,BE +3113920512,3113921535,QA +3113921536,3113922559,GB +3113922560,3113923583,DK +3113923584,3113924607,UA +3113924608,3113925631,IR +3113925632,3113926655,DE +3113926656,3113927679,RU +3113927680,3113928703,ES +3113928704,3113929727,RU +3113929728,3113931775,ES +3113931776,3113932799,UA +3113932800,3113933055,RO +3113933056,3113933567,US +3113933568,3113933823,RO +3113933824,3113934847,EE +3113934848,3113935871,NL +3113935872,3113936895,SE +3113936896,3113937919,AT +3113937920,3113938943,IT +3113938944,3113939967,DK +3113939968,3113940991,GB +3113940992,3113942015,SY +3113942016,3113943039,ES +3113943040,3113944063,FR +3113944064,3113945087,ES +3113945088,3113947135,IR +3113947136,3113948159,RU +3113948160,3113949183,ES +3113949184,3113950207,NO +3113950208,3113951231,CH +3113951232,3113952255,CZ +3113952256,3113953279,DK +3113953280,3113954303,PL +3113954304,3113955327,NL +3113955328,3113956351,SK +3113956352,3113957375,RO +3113957376,3113958399,DE +3113958400,3113961471,ES +3113961472,3113962495,IR +3113962496,3113963519,NL +3113963520,3113964543,DK +3113965568,3113966591,UA +3113966592,3113967615,FR +3113967616,3113968639,EE +3113968640,3113969663,GR +3113969664,3113970687,GB +3113970688,3113971711,DE +3113971712,3113972735,RU +3113972736,3113973759,BG +3113973760,3113974783,IT +3113974784,3113975807,AT +3113975808,3113976831,CZ +3113976832,3113977855,DK +3113977856,3113978879,GB +3113978880,3113979903,FR +3113979904,3113980927,GB +3113980928,3113981951,TR +3113981952,3113982975,FR +3113982976,3113983999,IQ +3113984000,3113985023,SY +3113985024,3113986047,DE +3113986048,3113987071,NL +3113987072,3113988095,FR +3113988096,3113989119,IT +3113989120,3113989631,GB +3113989632,3113989887,DE +3113989888,3113990143,GB +3113990144,3113991167,CH +3113991168,3113993215,DE +3113993216,3113994239,IT +3113994240,3113995263,NL +3113995264,3113996287,ES +3113996288,3113997311,HR +3113997312,3113998335,NO +3113998336,3113999359,HR +3113999360,3114000383,FR +3114000384,3114001407,HR +3114001408,3114002431,RO +3114002432,3114002687,US +3114002688,3114002825,RU +3114002826,3114002826,AM +3114002827,3114003455,RU +3114003456,3114004479,IR +3114004480,3114005503,AE +3114005504,3114006527,GB +3114006528,3114007551,BG +3114007552,3114008575,EE +3114008576,3114009599,RU +3114009600,3114010623,TR +3114010624,3114011647,CH +3114011648,3114012671,AL +3114012672,3114013695,GB +3114013696,3114014719,IS +3114014720,3114015743,FR +3114015744,3114016767,TR +3114016768,3114017791,PL +3114017792,3114018815,CZ +3114018816,3114019839,UA +3114019840,3114020863,IR +3114020864,3114021887,GB +3114021888,3114022911,UA +3114022912,3114023935,BE +3114023936,3114024959,GR +3114024960,3114025983,GB +3114025984,3114027007,DE +3114027008,3114028031,RU +3114028032,3114030079,FR +3114030080,3114031103,DE +3114031104,3114033151,FI +3114033152,3114034175,DK +3114034176,3114035199,ES +3114035200,3114036223,GB +3114036224,3114037247,RU +3114037248,3114038271,NO +3114038272,3114039295,GB +3114039296,3114040319,CZ +3114040320,3114041343,DE +3114042368,3114043391,IT +3114043392,3114045439,GB +3114045440,3114046463,AT +3114046464,3114047487,IT +3114047488,3114048511,HU +3114048512,3114049535,DE +3114049536,3114050559,NL +3114050560,3114051583,GB +3114051584,3114052607,BE +3114052608,3114052863,NL +3114052864,3114053119,FR +3114053120,3114053375,CZ +3114053376,3114053631,CH +3114053632,3114055679,RU +3114055680,3114057727,GB +3114057728,3114058751,IT +3114058752,3114059775,GB +3114059776,3114060799,BZ +3114060800,3114061823,DE +3114061824,3114062847,NL +3114062848,3114063871,LB +3114063872,3114064895,ES +3114064896,3114065919,CH +3114065920,3114066943,DE +3114066944,3114067967,CH +3114067968,3114068991,IT +3114068992,3114070015,BH +3114070016,3114071039,IT +3114071040,3114072063,GB +3114072064,3114073087,ES +3114073088,3114074111,DE +3114074112,3114075135,CH +3114075136,3114076159,ES +3114076160,3114077183,IR +3114077184,3114078207,PL +3114078208,3114079231,DK +3114079232,3114080255,DE +3114080256,3114081279,IT +3114081280,3114083327,DE +3114083328,3114084351,MT +3114084352,3114085375,TR +3114085376,3114086399,RS +3114086400,3114087423,GB +3114087424,3114088447,NL +3114088448,3114089471,NO +3114089472,3114091519,NL +3114091520,3114092543,BE +3114092544,3114093567,CH +3114093568,3114094591,UA +3114094592,3114095359,PL +3114095360,3114095615,DE +3114095616,3114096639,DK +3114096640,3114097663,NO +3114097664,3114098687,ES +3114098688,3114099711,RU +3114099712,3114100735,DE +3114100736,3114101759,RS +3114101760,3114102783,EE +3114102784,3114104831,DK +3114104832,3114105599,GR +3114105600,3114105855,RO +3114105856,3114106879,RU +3114106880,3114107903,ES +3114107904,3114108927,LI +3114108928,3114109951,KG +3114109952,3114110975,BE +3114110976,3114111999,NL +3114113024,3114114047,ES +3114114048,3114115071,DE +3114115072,3114116095,SE +3114116096,3114117119,PL +3114117120,3114118143,SE +3114118144,3114119167,PL +3114119168,3114120191,DE +3114120192,3114121215,IQ +3114121216,3114122239,ES +3114122240,3114123263,RU +3114123264,3114124287,FR +3114124288,3114125311,CZ +3114125312,3114126335,GL +3114126336,3114127359,TR +3114127360,3114128383,NL +3114128384,3114129407,ES +3114129408,3114130431,IT +3114130432,3114131455,SE +3114131456,3114132479,GB +3114132480,3114133503,IT +3114133504,3114134527,GB +3114134528,3114135551,PL +3114135552,3114136575,CZ +3114136576,3114137599,FR +3114137600,3114138623,AT +3114138624,3114139647,RU +3114139648,3114140671,AL +3114140672,3114141695,FR +3114141696,3114142719,ES +3114142720,3114143743,DE +3114143744,3114144767,AT +3114145792,3114146815,AT +3114146816,3114147839,IT +3114147840,3114148863,SY +3114148864,3114149887,IT +3114149888,3114150911,DE +3114150912,3114151935,FR +3114151936,3114152959,DE +3114152960,3114153983,ES +3114153984,3114155007,GB +3114155008,3114156031,DK +3114156032,3114157055,CZ +3114157056,3114158079,RU +3114158080,3114159103,FI +3114159104,3114160127,GB +3114160128,3114161151,HR +3114161152,3114162175,NL +3114162176,3114163199,IT +3114163200,3114164223,SY +3114164224,3114165247,DE +3114165248,3114165439,FR +3114165440,3114165487,DE +3114165488,3114165503,GB +3114165504,3114166015,DE +3114166016,3114166207,FR +3114166208,3114166255,DE +3114166256,3114166271,FR +3114166272,3114166511,DE +3114166512,3114166527,GB +3114166528,3114167295,DE +3114167296,3114168319,FR +3114168320,3114169343,RU +3114169344,3114169583,DE +3114169584,3114169599,GB +3114169600,3114170607,DE +3114170608,3114170623,GB +3114170624,3114171391,DE +3114171392,3114172415,ES +3114172416,3114172927,RU +3114172928,3114173439,GB +3114173440,3114173679,DE +3114173680,3114173695,GB +3114173696,3114174463,DE +3114174464,3114175231,US +3114175232,3114175487,DE +3114175488,3114176511,IT +3114176512,3114177535,NL +3114177536,3114177775,DE +3114177776,3114177791,GB +3114177792,3114178031,DE +3114178032,3114178047,GB +3114178048,3114178271,DE +3114178272,3114178303,GB +3114178304,3114178543,DE +3114178544,3114178559,GB +3114178560,3114179583,RU +3114179584,3114180607,TR +3114180608,3114181631,DK +3114181632,3114182655,NL +3114182656,3114183679,ES +3114183680,3114184703,IR +3114184704,3114185727,EE +3114185728,3114186751,DE +3114186752,3114187775,BE +3114187776,3114188799,IT +3114188800,3114189823,DE +3114189824,3114191871,NL +3114191872,3114192895,IS +3114192896,3114193919,UA +3114193920,3114194943,DE +3114194944,3114195967,BY +3114195968,3114196991,GR +3114196992,3114198015,DE +3114198016,3114199039,AT +3114199040,3114201087,IT +3114201088,3114203135,GB +3114203136,3114203391,RO +3114203392,3114204159,NL +3114204160,3114205183,ES +3114205184,3114206207,IT +3114206208,3114207231,NL +3114207232,3114208255,GB +3114208256,3114209279,FR +3114209280,3114210303,SE +3114210304,3114211327,CH +3114211328,3114212351,GB +3114212352,3114213375,CZ +3114213376,3114214399,DE +3114214400,3114215423,RU +3114215424,3114216447,ES +3114216448,3114217471,RU +3114217472,3114217727,NL +3114217728,3114218495,ZA +3114218496,3114219519,IT +3114219520,3114220543,AT +3114220544,3114221567,IT +3114221568,3114222591,RU +3114222592,3114223615,GB +3114223616,3114224639,TR +3114224640,3114225663,GB +3114225664,3114226175,NL +3114226176,3114226431,RU +3114226432,3114226687,US +3114226688,3114228735,IR +3114228736,3114229759,CZ +3114229760,3114230783,FR +3114230784,3114231807,ES +3114231808,3114233855,FR +3114233856,3114234879,ES +3114234880,3114235903,TR +3114235904,3114236927,DE +3114236928,3114237951,NL +3114237952,3114238975,RU +3114238976,3114239999,CZ +3114240000,3114241023,NL +3114241024,3114242047,UA +3114242048,3114243071,IT +3114243072,3114244095,RU +3114244096,3114245119,IR +3114245120,3114245375,SE +3114245376,3114245631,CH +3114245632,3114245887,IS +3114245888,3114246143,SE +3114246144,3114247167,TR +3114247168,3114248191,CH +3114248192,3114249215,CZ +3114249216,3114250239,RU +3114250240,3114251263,IR +3114251264,3114252287,JO +3114252288,3114253311,NO +3114253312,3114254335,NL +3114254336,3114255359,GB +3114255360,3114256383,SE +3114256384,3114257407,AT +3114257408,3114258431,CH +3114258432,3114259455,DE +3114259456,3114260479,ES +3114260480,3114261503,GB +3114261504,3114262527,BE +3114262528,3114263551,ES +3114263552,3114264575,NL +3114264576,3114265599,GB +3114265600,3114266623,FI +3114266624,3114267647,NL +3114267648,3114267674,US +3114267675,3114267675,FR +3114267676,3114267676,DE +3114267677,3114267677,NL +3114267678,3114267678,PL +3114267679,3114267679,ES +3114267680,3114267680,GB +3114267681,3114267903,US +3114267904,3114268159,GB +3114268160,3114268671,BR +3114268672,3114269695,BE +3114269696,3114270719,ES +3114270720,3114271743,DE +3114271744,3114272767,NL +3114272768,3114273791,LU +3114273792,3114274815,PL +3114274816,3114275839,DE +3114275840,3114276863,CZ +3114276864,3114277887,GB +3114277888,3114278911,TR +3114278912,3114279935,FR +3114279936,3114280959,GB +3114280960,3114281983,DE +3114281984,3114283007,GR +3114283008,3114284031,PL +3114284032,3114285055,FR +3114285056,3114286079,NL +3114286080,3114288127,UA +3114288128,3114289151,IS +3114289152,3114290175,NL +3114290176,3114291199,BG +3114291200,3114291455,ES +3114291456,3114291711,NL +3114291712,3114291967,ES +3114291968,3114292223,IE +3114292224,3114293247,DE +3114293248,3114294271,UA +3114294272,3114295295,RO +3114295296,3114296319,DE +3114296320,3114296447,IE +3114296448,3114296575,GB +3114296576,3114296703,ES +3114296704,3114296831,PT +3114296832,3114296959,PL +3114296960,3114297087,HR +3114297088,3114297215,FR +3114297216,3114297343,IT +3114297344,3114298367,IR +3114298368,3114299391,SK +3114299392,3114300415,IE +3114300416,3114301439,US +3114301440,3114302463,IT +3114302464,3114303487,CH +3114303488,3114304511,BE +3114304512,3114305535,IT +3114305536,3114306559,RU +3114306560,3114307583,LT +3114307584,3114308607,DE +3114308608,3114310655,ES +3114310656,3114311679,NL +3114311680,3114312703,ES +3114312704,3114313727,GB +3114313728,3114314751,ES +3114314752,3114315775,CY +3114315776,3114316799,IR +3114316800,3114318847,GB +3114318848,3114319871,RU +3114319872,3114320895,LB +3114320896,3114321919,TR +3114321920,3114323967,DE +3114323968,3114324991,CZ +3114324992,3114326015,ES +3114326016,3114327039,RU +3114327040,3114328063,BE +3114328064,3114329087,LB +3114329088,3114330111,ES +3114330112,3114331135,RS +3114331136,3114332159,JO +3114332160,3114333183,DE +3114333184,3114334207,CH +3114334208,3114335231,DE +3114335232,3114336255,GB +3114336256,3114337279,US +3114337280,3114338303,BG +3114338304,3114339327,FR +3114339328,3114340351,ES +3114340352,3114341375,GB +3114341376,3114342399,CH +3114342400,3114343423,GB +3114344448,3114345471,RU +3114345472,3114346495,IR +3114346496,3114347519,ES +3114347520,3114348543,FR +3114348544,3114349567,KG +3114349568,3114350591,RU +3114350592,3114351615,NO +3114351616,3114353663,RU +3114353664,3114354687,UA +3114354688,3114355711,HU +3114355712,3114356735,NO +3114356736,3114357759,DE +3114357760,3114358783,EE +3114358784,3114359807,NL +3114359808,3114360831,PL +3114360832,3114361855,ES +3114361856,3114362879,CH +3114362880,3114363135,NL +3114363136,3114363391,DE +3114363392,3114363647,GB +3114363648,3114363903,NL +3114363904,3114364927,TR +3114364928,3114365951,IR +3114365952,3114366975,ES +3114366976,3114367999,GB +3114368000,3114369023,NO +3114369024,3114370047,DE +3114370048,3114371071,GB +3114371072,3114372095,NO +3114372096,3114373119,NL +3114373120,3114374143,DE +3114374144,3114375167,GB +3114375168,3114377215,DE +3114377216,3114378239,TR +3114378240,3114379263,GB +3114379264,3114380287,FR +3114380288,3114381311,SK +3114381312,3114382335,DE +3114382336,3114383359,RU +3114383360,3114384383,ES +3114384384,3114385407,GB +3114385408,3114386431,IT +3114387456,3114387711,JP +3114387712,3114387967,AU +3114387968,3114388479,US +3114388480,3114389503,HU +3114389504,3114390527,NL +3114390528,3114391551,SE +3114391552,3114392575,MD +3114392576,3114393599,IT +3114393600,3114394623,AZ +3114394624,3114395647,DE +3114395648,3114396671,BG +3114396672,3114397695,RU +3114397696,3114398719,CZ +3114398720,3114399743,AT +3114399744,3114400767,GB +3114400768,3114401791,CZ +3114401792,3114402815,HU +3114402816,3114403839,CZ +3114403840,3114404351,NL +3114404352,3114404607,BG +3114404608,3114404863,NL +3114404864,3114405887,RU +3114405888,3114406911,CY +3114406912,3114407935,UA +3114407936,3114408959,CZ +3114408960,3114409983,BE +3114409984,3114411007,RU +3114411008,3114412031,IT +3114412032,3114413055,IR +3114413056,3114413119,LT +3114413120,3114413183,EE +3114413184,3114413247,LV +3114413248,3114413311,PL +3114413312,3114413439,DK +3114413440,3114413567,DE +3114413568,3114413631,CZ +3114413632,3114413695,HU +3114413696,3114413759,BG +3114413760,3114413823,MD +3114413824,3114413951,DE +3114413952,3114414079,CH +3114414080,3114415103,IT +3114415104,3114416127,ES +3114416128,3114417151,NL +3114417152,3114418175,HU +3114418176,3114419199,RO +3114419200,3114420223,GB +3114420224,3114421247,TR +3114421248,3114422271,SK +3114422272,3114423295,FR +3114423296,3114424319,MD +3114424320,3114425343,NL +3114425344,3114426367,RU +3114426368,3114427391,PL +3114427392,3114428415,GB +3114428416,3114429439,DK +3114429440,3114431487,GB +3114431488,3114432511,DE +3114432512,3114433535,MC +3114433536,3114434559,IL +3114434560,3114434815,NL +3114434816,3114435583,US +3114435584,3114436607,MD +3114436608,3114437631,AZ +3114437632,3114438655,MD +3114438656,3114439679,TR +3114439680,3114440703,IL +3114440704,3114441727,NL +3114441728,3114442751,FI +3114442752,3114443775,FR +3114443776,3114444799,SY +3114444800,3114446847,ES +3114446848,3114447871,FR +3114447872,3114448895,PT +3114448896,3114449919,NL +3114449920,3114450943,RU +3114450944,3114451967,MK +3114451968,3114452991,FR +3114452992,3114454015,CZ +3114454016,3114455039,DE +3114455040,3114456063,FR +3114456064,3114457087,DE +3114457088,3114458111,IR +3114458112,3114459135,RO +3114459136,3114460159,GB +3114460160,3114461183,DK +3114461184,3114461951,RU +3114461952,3114462207,NL +3114462208,3114463231,GR +3114463232,3114464255,US +3114464256,3114465279,BE +3114465280,3114466303,DE +3114466304,3114468351,GB +3114468352,3114469375,NL +3114469376,3114470399,DE +3114470400,3114471423,FI +3114471424,3114472447,US +3114472448,3114473471,AT +3114473472,3114474495,UZ +3114474496,3114475519,FR +3114475520,3114476543,TR +3114476544,3114477567,DE +3114477568,3114478591,CZ +3114478592,3114479615,MD +3114479616,3114481663,DE +3114481664,3114482687,FI +3114482688,3114484735,FR +3114484736,3114485759,GB +3114485760,3114486783,US +3114486784,3114487807,DE +3114487808,3114488831,CH +3114488832,3114489855,SE +3114489856,3114490879,IR +3114490880,3114491903,CH +3114491904,3114492159,US +3114492160,3114492927,GB +3114492928,3114493951,NL +3114493952,3114495999,RO +3114496000,3114497023,DE +3114497024,3114498047,LU +3114498048,3114499071,AT +3114499072,3114500095,FR +3114500096,3114501119,TR +3114501120,3114502143,ES +3114502144,3114503167,FR +3114503168,3114504191,BG +3114504192,3114505215,TR +3114505216,3114506239,IL +3114506240,3114507263,FI +3114507264,3114508287,RU +3114508288,3114509311,SA +3114509312,3114510335,ES +3114510336,3114511359,GB +3114511360,3114512383,NL +3114512384,3114513407,RU +3114513408,3114514431,CZ +3114514432,3114516479,DK +3114516480,3114517503,MD +3114517504,3114518527,DK +3114518528,3114519551,GE +3114519552,3114520575,DE +3114520576,3114521599,US +3114521600,3114522623,FR +3114522624,3114523647,SY +3114523648,3114524671,FR +3114524672,3114525695,ME +3114525696,3114526719,FR +3114526720,3114527743,GB +3114527744,3114529791,RU +3114529792,3114530815,BG +3114530816,3114532863,NL +3114532864,3114533887,MD +3114533888,3114534911,AT +3114534912,3114535935,FI +3114535936,3114536959,DK +3114536960,3114537983,IL +3114537984,3114541055,SA +3114541056,3114542079,BA +3114542080,3114542207,SE +3114542208,3114542335,NO +3114542336,3114542399,SI +3114542400,3114542463,SK +3114542464,3114542527,RO +3114542528,3114542591,RS +3114542592,3114542719,BE +3114542720,3114542847,NL +3114542848,3114542911,TH +3114542912,3114542975,ID +3114542976,3114543039,KR +3114543040,3114543103,MY +3114543104,3114544127,ES +3114544128,3114545151,GB +3114545152,3114546175,MD +3114546176,3114547199,DE +3114547200,3114548223,NL +3114548224,3114550271,GB +3114550272,3114551295,CZ +3114551296,3114552319,IR +3114552320,3114553343,LB +3114553344,3114554367,MD +3114554368,3114555391,DE +3114555392,3114556415,ES +3114556416,3114557439,IT +3114558464,3114559487,ES +3114559488,3114560511,LB +3114560512,3114561535,DE +3114561536,3114562559,TR +3114562560,3114563583,ES +3114563584,3114564607,GB +3114564608,3114565631,FR +3114565632,3114566655,LT +3114566656,3114567679,SY +3114567680,3114568703,GB +3114568704,3114569727,PL +3114569728,3114570751,IT +3114570752,3114571775,RU +3114571776,3114572799,CH +3114572800,3114573823,BE +3114573824,3114574847,GB +3114574848,3114575871,FR +3114575872,3114576895,US +3114576896,3114577919,RU +3114577920,3114578943,IT +3114578944,3114579967,GB +3114579968,3114580991,CH +3114580992,3114582015,SA +3114582016,3114583039,IL +3114583040,3114584063,SA +3114584064,3114585087,SY +3114585088,3114586111,AT +3114586112,3114587135,NL +3114587136,3114588159,FR +3114588160,3114589183,IQ +3114589184,3114590207,GB +3114591232,3114592255,DE +3114592256,3114593279,FR +3114593280,3114594303,SA +3114594304,3114595327,BG +3114595328,3114596351,LU +3114596352,3114597375,SY +3114597376,3114598399,IR +3114598400,3114600447,ES +3114600448,3114603519,DE +3114603520,3114604543,TR +3114604544,3114605567,BG +3114605568,3114606591,IR +3114606592,3114607615,FR +3114607616,3114608639,SK +3114608640,3114609663,IR +3114609664,3114610687,TR +3114610688,3114612735,NL +3114612736,3114613759,IT +3114613760,3114613823,JP +3114613824,3114613887,AU +3114613888,3114613951,TW +3114613952,3114614015,SG +3114614016,3114614079,SA +3114614080,3114614143,AE +3114614144,3114614207,PK +3114614208,3114614271,TR +3114614272,3114614399,MX +3114614400,3114614527,IN +3114614528,3114614655,FI +3114614656,3114614783,CA +3114614784,3114615807,FR +3114615808,3114616831,NL +3114616832,3114617855,DK +3114617856,3114618879,GB +3114618880,3114619903,SE +3114619904,3114620927,US +3114620928,3114621951,IT +3114621952,3114622975,PT +3114622976,3114623999,BG +3114624000,3114625023,IR +3114625024,3114626047,PT +3114626048,3114627071,HU +3114627072,3114628095,RU +3114628096,3114629119,IR +3114629120,3114630143,RU +3114630144,3114631167,IT +3114631168,3114632191,CH +3114632192,3114633215,FI +3114633216,3114634239,DE +3114634240,3114635263,SK +3114635264,3114636287,FR +3114636288,3114637311,PL +3114637312,3114639103,NL +3114639104,3114639359,PL +3114639360,3114640383,RU +3114640384,3114641407,ES +3114641408,3114642431,SC +3114642432,3114643455,SE +3114643456,3114644479,BH +3114644480,3114645503,GB +3114645504,3114646527,RO +3114646528,3114648575,NL +3114648576,3114649599,NO +3114649600,3114650623,RU +3114650624,3114651647,IR +3114651648,3114652671,CH +3114652672,3114654719,US +3114654720,3114655743,BG +3114655744,3114656767,RU +3114656768,3114657791,US +3114657792,3114658815,HR +3114658816,3114659071,NL +3114659072,3114659079,GB +3114659080,3114659839,NL +3114659840,3114660863,MD +3114660864,3114661887,DE +3114661888,3114663935,ES +3114663936,3114664959,CH +3114664960,3114667007,DE +3114667008,3114668031,FR +3114668032,3114669055,RU +3114669056,3114670079,TR +3114670080,3114671103,IQ +3114671104,3114672127,FI +3114672128,3114673151,SE +3114673152,3114675199,GB +3114675200,3114676223,NO +3114676224,3114677247,NL +3114677248,3114678271,SK +3114678272,3114679295,TJ +3114679296,3114680319,IR +3114680320,3114681343,CY +3114681344,3114682367,GB +3114682368,3114683391,RU +3114683392,3114684415,FI +3114684416,3114685439,CH +3114685440,3114686463,DE +3114686464,3114687487,NL +3114687488,3114688511,KW +3114688512,3114689535,CH +3114689536,3114690559,FR +3114690560,3114691583,IR +3114692608,3114693631,IR +3114693632,3114694655,CY +3114694656,3114695679,DK +3114695680,3114696703,RS +3114696704,3114697727,GB +3114697728,3114699775,HU +3114699776,3114700799,DE +3114700800,3114701823,UA +3114701824,3114702847,SE +3114702848,3114703871,UA +3114703872,3114704895,GB +3114704896,3114705919,UA +3114705920,3114706943,FR +3114706944,3114707967,PL +3114707968,3114708991,ES +3114708992,3114710015,DE +3114710016,3114711039,NO +3114711040,3114712063,FI +3114712064,3114713087,DE +3114713088,3114714111,CH +3114714112,3114715135,RU +3114715136,3114716159,DE +3114716160,3114718207,SE +3114718208,3114719231,ES +3114719232,3114721279,UA +3114721280,3114722303,GB +3114722304,3114723327,HU +3114723328,3114724351,SE +3114724352,3114725119,NL +3114725120,3114725375,US +3114725376,3114726399,RU +3114726400,3114727423,SE +3114727424,3114728447,BE +3114728448,3114729471,GB +3114729472,3114730495,AU +3114730496,3114731519,GB +3114731520,3114732543,CH +3114732544,3114733567,SY +3114733568,3114734591,FR +3114734592,3114737663,IT +3114737664,3114738687,PL +3114738688,3114740735,GB +3114740736,3114741759,MK +3114741760,3114742783,BE +3114742784,3114743807,IR +3114743808,3114744831,MD +3114744832,3114745855,TR +3114745856,3114746879,CA +3114746880,3114747903,FR +3114747904,3114748927,IR +3114748928,3114749951,GB +3114749952,3114750975,CH +3114750976,3114751999,SE +3114752000,3114753023,ES +3114753024,3114754047,HU +3114754048,3114755071,NL +3114755072,3114756095,IR +3114756096,3114757119,IT +3114757120,3114758143,ES +3114758144,3114759167,IT +3114759168,3114760191,GB +3114760192,3114761215,RU +3114761216,3114762239,IR +3114762240,3114763263,FR +3114763264,3114764287,MD +3114764288,3114765311,SA +3114765312,3114766335,PL +3114766336,3114767359,BG +3114767360,3114768383,DE +3114768384,3114769407,IL +3114769408,3114770431,DE +3114770432,3114771455,UA +3114771456,3114772479,DK +3114772480,3114773503,GB +3114773504,3114774527,BG +3114774528,3114775551,SE +3114775552,3114776575,GB +3114776576,3114777599,CZ +3114777600,3114777855,DE +3114777856,3114778111,US +3114778112,3114778623,DE +3114778624,3114779647,IT +3114779648,3114780671,IE +3114780672,3114781695,LT +3114781696,3114782719,NL +3114782720,3114783743,CZ +3114783744,3114784767,PL +3114784768,3114785791,RU +3114785792,3114786815,FR +3114786816,3114787839,RU +3114787840,3114788863,GB +3114788864,3114790911,CH +3114790912,3114791935,AT +3114791936,3114792959,IT +3114792960,3114793983,FR +3114793984,3114795007,NL +3114795008,3114796031,DE +3114796032,3114797055,NL +3114797056,3114798079,DE +3114798080,3114799103,LT +3114799104,3114800127,RS +3114800128,3114801151,GB +3114801152,3114802175,IT +3114802176,3114803199,IR +3114803200,3114804223,TR +3114804224,3114805247,GR +3114805248,3114806271,HR +3114806272,3114807295,FR +3114807296,3114808319,NL +3114808320,3114809343,GB +3114809344,3114810367,FR +3114810368,3114811391,RU +3114811392,3114812415,DK +3114812416,3114813439,IL +3114813440,3114814463,NO +3114814464,3114815487,IT +3114815488,3114815743,BE +3114815744,3114816511,DE +3114816512,3114817535,NL +3114817536,3114818559,IT +3114818560,3114819583,GB +3114819584,3114820607,IT +3114820608,3114821631,AT +3114821632,3114822655,ES +3114822656,3114823679,UA +3114823680,3114824703,NL +3114824704,3114825727,HR +3114825728,3114826751,GB +3114826752,3114827775,PL +3114827776,3114828799,UA +3114828800,3114830847,GB +3114830848,3114831871,NL +3114831872,3114832895,GB +3114832896,3114833919,FR +3114833920,3114834943,TR +3114834944,3114835967,FR +3114835968,3114836991,NL +3114836992,3114838015,IT +3114838016,3114838271,GB +3114838272,3114839039,DE +3114839040,3114841087,IT +3114841088,3114842111,DK +3114842112,3114843135,RU +3114843136,3114844159,FR +3114844160,3114845183,GB +3114845184,3114846207,DK +3114846208,3114847231,NL +3114847232,3114848255,FI +3114848256,3114849279,RU +3114849280,3114850303,FI +3114850304,3114851327,GB +3114851328,3114852351,UA +3114852352,3114853375,RU +3114853376,3114854399,DE +3114854400,3114855423,GB +3114855424,3114856447,RU +3114856448,3114857471,SE +3114857472,3114858495,DK +3114858496,3114860543,NL +3114860544,3114861567,DE +3114861568,3114862591,AE +3114862592,3114863615,AT +3114863616,3114864639,DK +3114864640,3114865663,UA +3114865664,3114866687,IR +3114866688,3114867711,IT +3114867712,3114869759,GB +3114869760,3114870783,IR +3114870784,3114871807,SE +3114871808,3114872831,IT +3114872832,3114873855,MD +3114873856,3114874879,TR +3114874880,3114875903,DE +3114875904,3114876927,CH +3114876928,3114877951,TR +3114877952,3114878975,EE +3114878976,3114879999,SE +3114880000,3114881023,FR +3114881024,3114882047,NL +3114882048,3114883071,CH +3114883072,3114884095,FR +3114884096,3114885119,CH +3114885120,3114886143,PT +3114886144,3114887167,RU +3114887168,3114888191,DE +3114888192,3114890239,NL +3114890240,3114892287,GB +3114892288,3114893311,DE +3114893312,3114894335,TR +3114894336,3114895359,US +3114895360,3114896383,ES +3114896384,3114897407,LT +3114897408,3114898431,GB +3114898432,3114899455,IL +3114899456,3114900479,RU +3114900480,3114901503,FR +3114901504,3114902527,SY +3114902528,3114903551,ES +3114903552,3114904575,GB +3114904576,3114905599,NO +3114905600,3114906623,IT +3114906624,3114907647,TR +3114907648,3114908671,IT +3114908672,3114909695,IS +3114909696,3114910719,DE +3114910720,3114911231,NL +3114911232,3114911743,GB +3114911744,3114912767,US +3114912768,3114913791,DE +3114913792,3114914815,FR +3114914816,3114915839,DE +3114915840,3114916863,RU +3114916864,3114917887,LB +3114917888,3114918911,IT +3114918912,3114919167,HN +3114919168,3114919423,CH +3114919424,3114919679,CW +3114919680,3114919935,CH +3114919936,3114920703,GB +3114920704,3114920959,NL +3114920960,3114921983,IT +3114921984,3114923007,CH +3114923008,3114924031,GB +3114924032,3114925055,HU +3114925056,3114925311,US +3114925312,3114925567,DE +3114925568,3114925823,US +3114925824,3114926079,GB +3114926080,3114927103,RU +3114927104,3114928127,NL +3114928128,3114929151,GB +3114929152,3114930175,BH +3114930176,3114931199,CH +3114931200,3114932223,FR +3114932224,3114933247,DE +3114933248,3114934271,DK +3114934272,3114935295,PL +3114935296,3114936319,CA +3114936320,3114936575,DE +3114936576,3114936831,PA +3114936832,3114937343,DE +3114938368,3114939391,CH +3114939392,3114940415,RU +3114940416,3114941439,IL +3114941440,3114942463,GB +3114942464,3114943487,DE +3114943488,3114944511,NL +3114944512,3114945535,SE +3114945536,3114946559,NL +3114946560,3114947583,FR +3114947584,3114948607,HU +3114948608,3114949631,CH +3114949632,3114950655,NL +3114950656,3114951679,ES +3114951680,3114952703,GB +3114952704,3114953727,PL +3114953728,3114954751,MD +3114954752,3114955775,DE +3114955776,3114956799,AE +3114956800,3114957823,DE +3114957824,3114958847,RO +3114958848,3114959871,NL +3114959872,3114960895,CH +3114960896,3114961919,IT +3114961920,3114962431,GR +3114962432,3114962687,DE +3114962688,3114962943,GR +3114962944,3114963967,GB +3114963968,3114964991,FR +3114964992,3114966015,GB +3114966016,3114967039,TR +3114967040,3114968063,DE +3114968064,3114969087,MD +3114969088,3114970111,DE +3114970112,3114971135,TR +3114971136,3114972159,GB +3114972160,3114973183,SE +3114973184,3114974207,MD +3114974208,3114975231,GB +3114975232,3114976255,RU +3114976256,3114977279,US +3114977280,3114978303,PL +3114978304,3114979327,RU +3114979328,3114980351,NL +3114980352,3114981375,DE +3114981376,3114982399,US +3114982400,3114983423,JP +3114983424,3114983679,PL +3114983680,3114983935,RO +3114983936,3114984447,PL +3114984448,3114985471,CZ +3114985472,3114986495,CY +3114986496,3114987519,IR +3114987520,3114988543,CZ +3114988544,3114989567,DE +3114989568,3114990591,NO +3114990592,3114991615,LT +3114991616,3114992639,GB +3114992640,3114993663,FR +3114993664,3114994687,ES +3114994688,3114995711,RU +3114995712,3114996735,MD +3114996736,3114997759,FR +3114997760,3114998783,TR +3114998784,3114999807,DE +3114999808,3115000831,NL +3115000832,3115001855,IT +3115001856,3115002879,NL +3115002880,3115003903,DE +3115003904,3115004927,NL +3115004928,3115005951,IR +3115005952,3115006975,GB +3115006976,3115007423,RS +3115007424,3115007487,XK +3115007488,3115007999,RS +3115008000,3115009023,BE +3115009024,3115010047,MD +3115010048,3115011071,SY +3115011072,3115012095,DE +3115012096,3115013119,RU +3115013120,3115014143,FR +3115014144,3115016191,TR +3115016192,3115017215,DE +3115017216,3115018239,RU +3115018240,3115019263,ES +3115019264,3115020287,LB +3115020288,3115021311,FR +3115021312,3115022335,AE +3115022336,3115023359,GB +3115023360,3115024383,CZ +3115024384,3115025407,NL +3115025408,3115026431,SY +3115026432,3115027455,DE +3115027456,3115028479,SK +3115028480,3115029503,AL +3115029504,3115030527,RU +3115030528,3115031551,SA +3115031552,3115032575,FR +3115032576,3115033599,RU +3115033600,3115034623,ES +3115034624,3115035647,BE +3115035648,3115036671,FO +3115036672,3115037695,FI +3115037696,3115038719,HR +3115038720,3115039743,RO +3115039744,3115040767,GB +3115040768,3115041791,RU +3115041792,3115042815,DK +3115043840,3115044863,DE +3115044864,3115045887,NL +3115045888,3115046911,IT +3115046912,3115047935,DE +3115047936,3115048959,GB +3115048960,3115049983,DE +3115049984,3115051007,MD +3115051008,3115052031,LV +3115052032,3115055103,NL +3115055104,3115056127,DE +3115056128,3115057151,NL +3115057152,3115058175,IR +3115058176,3115059199,BE +3115059200,3115060223,DE +3115060224,3115062271,FR +3115062272,3115063295,US +3115063296,3115064319,EE +3115064320,3115066367,MD +3115066368,3115067391,NL +3115067392,3115068415,US +3115068416,3115069439,HU +3115069440,3115070463,NL +3115070464,3115071487,US +3115071488,3115071743,NL +3115071744,3115071999,LB +3115072000,3115072511,DE +3115072512,3115073535,ES +3115073536,3115074559,DE +3115074560,3115075583,IR +3115075584,3115076607,SY +3115076608,3115077631,SE +3115077632,3115078655,IL +3115078656,3115079679,PL +3115079680,3115080703,MD +3115080704,3115081727,LI +3115081728,3115082751,ES +3115082752,3115083775,UA +3115083776,3115084799,SK +3115084800,3115085823,NL +3115085824,3115086847,GB +3115086848,3115087871,PL +3115087872,3115088895,GB +3115088896,3115089919,DE +3115089920,3115090943,RU +3115090944,3115091967,NL +3115091968,3115092991,RU +3115092992,3115094015,IT +3115094016,3115094527,DE +3115094528,3115094783,TR +3115094784,3115095039,NL +3115095040,3115095551,DE +3115095552,3115096063,CH +3115096064,3115097087,FR +3115097088,3115098111,LT +3115098112,3115099391,NL +3115099392,3115099647,US +3115099648,3115100159,NL +3115100160,3115101183,ES +3115101184,3115102207,GB +3115102208,3115103231,ES +3115103232,3115104255,IT +3115104256,3115105279,ES +3115105280,3115106303,US +3115106304,3115107327,DE +3115107328,3115108351,CH +3115108352,3115110399,IT +3115110400,3115111423,PL +3115111424,3115112447,IR +3115112448,3115114495,NL +3115114496,3115115519,FR +3115115520,3115116543,IQ +3115116544,3115117567,FR +3115117568,3115118591,SY +3115118592,3115119615,PL +3115119616,3115120639,GB +3115120640,3115121663,PL +3115121664,3115122687,CZ +3115122688,3115123711,RU +3115123712,3115124735,SE +3115124736,3115125759,GB +3115125760,3115126783,NL +3115126784,3115127807,RO +3115127808,3115128831,NL +3115128832,3115129855,DE +3115129856,3115130879,BA +3115130880,3115131234,DE +3115131235,3115131235,US +3115131236,3115131903,DE +3115131904,3115132927,RU +3115132928,3115133951,KW +3115133952,3115134975,ES +3115134976,3115135999,GB +3115136000,3115137023,SI +3115137024,3115138047,JO +3115138048,3115139071,LB +3115139072,3115140095,GB +3115140096,3115141119,FR +3115141120,3115142143,RU +3115142144,3115143167,DE +3115143168,3115144191,RU +3115144192,3115145215,IT +3115145216,3115146239,CH +3115146240,3115147263,RU +3115147264,3115148287,FR +3115148288,3115149311,UA +3115149312,3115150335,IR +3115150336,3115151359,US +3115151360,3115152383,UA +3115152384,3115154431,GB +3115154432,3115155455,FR +3115155456,3115156479,DE +3115156480,3115157503,NL +3115157504,3115159551,AT +3115159552,3115160575,MD +3115160576,3115161599,CZ +3115161600,3115162623,FI +3115162624,3115162879,RU +3115162880,3115163135,CY +3115163136,3115164671,RU +3115164672,3115165695,IE +3115165696,3115166719,IR +3115166720,3115167743,SY +3115167744,3115168767,RU +3115168768,3115169791,LU +3115169792,3115170815,IE +3115170816,3115171839,TR +3115171840,3115172863,GB +3115172864,3115173887,SE +3115173888,3115174911,FR +3115174912,3115175935,AL +3115175936,3115176959,FI +3115176960,3115177983,IT +3115177984,3115179007,NL +3115179008,3115180031,SE +3115180032,3115180287,US +3115180288,3115180543,DE +3115180544,3115180799,CY +3115180800,3115181055,MT +3115181056,3115182079,DE +3115182080,3115183103,NL +3115183104,3115184127,IT +3115184128,3115185151,DE +3115185152,3115186175,MD +3115186176,3115187199,CZ +3115187200,3115188223,FR +3115188224,3115189247,IT +3115189248,3115190271,BE +3115190272,3115191295,SE +3115191296,3115192319,PL +3115192320,3115193343,HU +3115193344,3115194367,TR +3115194368,3115195391,FI +3115195392,3115196415,TR +3115196416,3115197439,LI +3115197440,3115198463,DE +3115198464,3115199487,NL +3115199488,3115200511,CZ +3115200512,3115201535,DE +3115201536,3115202559,FR +3115202560,3115203583,GR +3115203584,3115204607,DE +3115204608,3115205631,BE +3115205632,3115206655,TR +3115206656,3115207679,DE +3115207680,3115208703,GB +3115208704,3115209727,ES +3115209728,3115210751,NO +3115210752,3115211775,FR +3115211776,3115212799,CZ +3115212800,3115213823,GE +3115213824,3115214847,US +3115214848,3115215871,CH +3115215872,3115216895,GB +3115216896,3115217919,PL +3115217920,3115218943,DK +3115218944,3115219967,PL +3115219968,3115220991,NL +3115220992,3115222015,RU +3115222016,3115223039,IR +3115223040,3115223807,RU +3115223808,3115224063,US +3115224064,3115225087,SE +3115225088,3115226111,UA +3115226112,3115227135,DE +3115227136,3115228159,PL +3115228160,3115228671,AT +3115228672,3115229183,IL +3115229184,3115230207,EE +3115230208,3115231231,RU +3115231232,3115232255,CZ +3115232256,3115232767,NL +3115232768,3115233279,UA +3115233280,3115234303,IS +3115234304,3115235327,ES +3115235328,3115236351,BE +3115236352,3115237375,NL +3115237376,3115238399,RU +3115238400,3115239423,BE +3115239424,3115240447,IR +3115240448,3115241471,US +3115241472,3115242495,AL +3115242496,3115243519,ES +3115243520,3115244543,CH +3115244544,3115245567,UA +3115245568,3115246591,GB +3115246592,3115247615,SY +3115247616,3115248639,GB +3115248640,3115249663,SY +3115249664,3115250687,LB +3115250688,3115251711,SE +3115251712,3115252735,IR +3115252736,3115253759,US +3115253760,3115254783,SI +3115254784,3115255807,NL +3115256832,3115257855,GB +3115257856,3115258879,RU +3115258880,3115259903,AT +3115259904,3115260927,NL +3115260928,3115261951,GB +3115261952,3115262975,MD +3115262976,3115263999,GB +3115264000,3115265023,CY +3115265024,3115266047,RU +3115266048,3115267071,GB +3115267072,3115268095,SY +3115268096,3115269119,NL +3115269120,3115270143,ES +3115270144,3115271167,NO +3115271168,3115271423,US +3115271424,3115271679,AU +3115271680,3115271935,JP +3115271936,3115272191,HK +3115272192,3115273215,RU +3115273216,3115274239,HK +3115274240,3115275263,MD +3115275264,3115276287,CZ +3115276288,3115277311,NL +3115277312,3115277823,ES +3115277824,3115278335,UA +3115278336,3115279359,NO +3115279360,3115280383,CN +3115280384,3115281407,PL +3115281408,3115282431,IL +3115282432,3115283455,GB +3115283456,3115284479,RU +3115284480,3115285503,FR +3115285504,3115286527,IT +3115286528,3115287551,RU +3115287552,3115288575,SK +3115288576,3115289599,GB +3115289600,3115290623,CZ +3115290624,3115291647,GB +3115291648,3115292671,FR +3115292672,3115293695,GB +3115293696,3115293951,US +3115293952,3115294463,RU +3115294464,3115294719,IN +3115294720,3115295743,GB +3115295744,3115296767,NL +3115296768,3115297791,IE +3115297792,3115298815,RU +3115298816,3115299839,FI +3115299840,3115300863,BE +3115300864,3115301887,PT +3115301888,3115302911,NL +3115302912,3115303935,LT +3115303936,3115305983,NL +3115305984,3115306495,TR +3115306496,3115307007,BE +3115307008,3115307519,DE +3115307520,3115308031,CA +3115308032,3115309055,IT +3115309056,3115310079,BE +3115310080,3115311103,CZ +3115311104,3115312127,RU +3115312128,3115313151,SY +3115313152,3115314175,DE +3115314176,3115315199,UA +3115315200,3115316223,IR +3115316224,3115317247,UA +3115317248,3115318271,JO +3115318272,3115319295,AL +3115319296,3115320319,IE +3115320320,3115322367,ES +3115322368,3115323391,IE +3115323392,3115324415,DE +3115324416,3115325439,IT +3115325440,3115326463,RU +3115326464,3115327487,SE +3115327488,3115328511,IR +3115328512,3115329535,NO +3115329536,3115330559,BG +3115330560,3115331583,JO +3115331584,3115332607,NL +3115332608,3115333631,IS +3115333632,3115334655,IR +3115334656,3115335679,LV +3115335680,3115336703,FR +3115336704,3115337727,ES +3115337728,3115338751,SK +3115338752,3115340799,GB +3115340800,3115341823,ES +3115341824,3115342079,US +3115342080,3115342847,GB +3115342848,3115343871,RU +3115343872,3115344895,SE +3115344896,3115345919,IE +3115345920,3115346943,ES +3115346944,3115347967,UA +3115347968,3115348991,GB +3115348992,3115350015,LV +3115350016,3115351039,PL +3115351040,3115352063,GB +3115352064,3115353087,IE +3115353088,3115354111,GB +3115354112,3115355135,CZ +3115355136,3115356159,NL +3115356160,3115357183,LB +3115357184,3115358207,FR +3115358208,3115362303,DE +3115362304,3115363327,FR +3115363328,3115364351,GB +3115364352,3115365375,FR +3115365376,3115366399,ES +3115366400,3115367423,SE +3115367424,3115368447,ES +3115368448,3115369471,BG +3115369472,3115370495,MT +3115370496,3115371519,IT +3115371520,3115372543,GB +3115372544,3115373567,LB +3115373568,3115374591,NO +3115374592,3115375615,BG +3115375616,3115376639,LV +3115376640,3115377663,UA +3115377664,3115378687,DE +3115378688,3115379711,FR +3115379712,3115380735,CH +3115380736,3115381759,GB +3115381760,3115382271,NO +3115382272,3115382783,SE +3115382784,3115383807,GB +3115383808,3115384831,DE +3115384832,3115385855,TJ +3115385856,3115387903,SK +3115387904,3115388927,MK +3115388928,3115389951,AT +3115389952,3115390719,GB +3115390720,3115390975,NL +3115390976,3115391999,GB +3115392000,3115393023,AL +3115393024,3115395071,IT +3115395072,3115396095,ES +3115396096,3115397119,FR +3115397120,3115398143,MT +3115398144,3115399167,RU +3115399168,3115400191,BG +3115400192,3115401215,RU +3115401216,3115402239,GB +3115402240,3115403263,NL +3115403264,3115404287,ES +3115404288,3115405567,GB +3115405568,3115405823,DE +3115405824,3115406335,GB +3115406336,3115407359,DE +3115407360,3115408383,CY +3115408384,3115409407,MD +3115409408,3115410431,RU +3115410432,3115411455,NL +3115411456,3115412479,AM +3115412480,3115414527,RU +3115414528,3115415551,DE +3115415552,3115416575,DK +3115416576,3115417599,MD +3115417600,3115418367,DE +3115418368,3115418623,HK +3115418624,3115419647,IS +3115419648,3115420671,NL +3115420672,3115421695,DE +3115421696,3115422719,NL +3115422720,3115423743,DE +3115423744,3115424767,ES +3115424768,3115425791,IR +3115425792,3115426815,DK +3115426816,3115427839,TR +3115427840,3115428863,ES +3115428864,3115429887,US +3115429888,3115430399,NL +3115430400,3115430911,FI +3115430912,3115431935,FR +3115431936,3115432959,AE +3115432960,3115433983,UA +3115433984,3115435007,IT +3115435008,3115436031,ES +3115436032,3115437055,GB +3115437056,3115438079,DE +3115438080,3115439103,GB +3115439104,3115440127,IT +3115440128,3115441151,RU +3115441152,3115442175,NL +3115442176,3115443199,FR +3115443200,3115444223,GB +3115444224,3115445247,IR +3115445248,3115446271,RU +3115446272,3115447295,UA +3115447296,3115448319,IT +3115448320,3115449343,DE +3115449344,3115450367,BG +3115450368,3115451391,AT +3115451392,3115452415,BG +3115452416,3115453439,IT +3115453440,3115454463,MD +3115454464,3115455487,ES +3115455488,3115456511,DK +3115456512,3115457535,DE +3115457536,3115458559,FR +3115458560,3115461631,DE +3115461632,3115462655,UA +3115462656,3115462911,FR +3115462912,3115463167,GB +3115463168,3115463423,DE +3115463424,3115463679,US +3115463680,3115464703,FR +3115464704,3115465727,TR +3115465728,3115466751,CH +3115466752,3115468799,IE +3115468800,3115469823,DE +3115469824,3115470847,FR +3115470848,3115471871,ES +3115471872,3115472895,PL +3115472896,3115473919,UA +3115473920,3115474943,IT +3115474944,3115475967,PL +3115475968,3115476991,IT +3115476992,3115478015,IR +3115478016,3115479039,DE +3115479040,3115480063,DK +3115480064,3115481087,DE +3115481088,3115482111,CH +3115482112,3115483135,SE +3115483136,3115484159,RU +3115484160,3115485183,FR +3115485184,3115486207,ES +3115486208,3115487231,SE +3115487232,3115488255,NL +3115488256,3115489279,SY +3115489280,3115490303,US +3115490304,3115491327,PL +3115491328,3115492351,ES +3115492352,3115493375,GB +3115493376,3115494399,ES +3115494400,3115495423,CZ +3115495424,3115496447,GR +3115496448,3115497471,SE +3115497472,3115498495,FR +3115498496,3115499519,GB +3115499520,3115501567,DE +3115501568,3115502591,NL +3115502592,3115504639,RU +3115504640,3115505663,DE +3115505664,3115506687,GB +3115506688,3115507711,IR +3115507712,3115508735,SI +3115508736,3115509759,RO +3115509760,3115510783,NL +3115510784,3115511807,PL +3115511808,3115512831,TR +3115512832,3115513855,RU +3115513856,3115514879,FR +3115514880,3115515903,IT +3115515904,3115517951,RU +3115517952,3115518975,KZ +3115518976,3115519999,UA +3115520000,3115521023,CH +3115521024,3115522047,GB +3115522048,3115523071,TR +3115523072,3115524095,AL +3115524096,3115525119,CZ +3115525120,3115526143,RU +3115526144,3115527167,IE +3115527168,3115528191,BE +3115528192,3115529215,SI +3115529216,3115530239,ME +3115530240,3115531263,PL +3115531264,3115532287,AT +3115532288,3115533311,DE +3115533312,3115534335,MT +3115534336,3115535359,RU +3115535360,3115536383,IS +3115536384,3115537407,BY +3115537408,3115538431,RU +3115538432,3115539455,NL +3115539456,3115540479,ME +3115540480,3115541503,DK +3115541504,3115542527,DE +3115542528,3115543551,ES +3115543552,3115544575,IS +3115544576,3115545599,NL +3115545600,3115546623,FI +3115546624,3115547647,GB +3115547648,3115548671,RU +3115548672,3115549695,NO +3115549696,3115550719,PL +3115550720,3115551743,RS +3115551744,3115552767,ES +3115552768,3115553791,RU +3115553792,3115554815,FR +3115554816,3115555839,DE +3115555840,3115556863,RO +3115556864,3115557887,RU +3115557888,3115558911,DE +3115558912,3115559935,IR +3115559936,3115560959,RU +3115560960,3115561983,FR +3115561984,3115563007,DE +3115563008,3115564031,ES +3115564032,3115565055,RU +3115565056,3115566079,FR +3115566080,3115567103,RU +3115567104,3115567615,ZA +3115567616,3115568127,AE +3115568128,3115569151,NL +3115569152,3115570175,GB +3115570176,3115571199,UA +3115571200,3115572223,SI +3115572224,3115573247,IR +3115573248,3115574271,RU +3115574272,3115575295,GB +3115575296,3115576319,ES +3115576320,3115577343,FI +3115577344,3115578367,IL +3115578368,3115579391,GB +3115579392,3115580415,US +3115580416,3115581439,GB +3115581440,3115582463,CZ +3115582464,3115583487,GB +3115583488,3115584511,NL +3115584512,3115584767,AT +3115584768,3115585023,US +3115585024,3115585535,CZ +3115585536,3115586559,RU +3115586560,3115587583,CH +3115587584,3115588607,DE +3115588608,3115589631,TR +3115589632,3115590655,GB +3115590656,3115591679,GR +3115591680,3115592703,CH +3115592704,3115593727,BE +3115593728,3115593983,ES +3115593984,3115594751,GB +3115594752,3115595775,IR +3115595776,3115596799,RU +3115596800,3115597823,IQ +3115597824,3115598847,NO +3115598848,3115599871,BE +3115599872,3115600895,HU +3115600896,3115601919,BE +3115601920,3115602943,JO +3115602944,3115603967,AE +3115603968,3115604991,HU +3115604992,3115606015,FR +3115606016,3115607039,NL +3115607040,3115608063,MD +3115608064,3115609087,NL +3115609088,3115610111,RU +3115610112,3115611135,PL +3115611136,3115612159,GB +3115612160,3115613183,IT +3115613184,3115614207,LT +3115614208,3115615231,IR +3115615232,3115616255,FR +3115616256,3115618303,SK +3115618304,3115619327,ES +3115619328,3115621375,NL +3115621376,3115622399,GB +3115622400,3115623423,RU +3115623424,3115624447,DE +3115624448,3115625471,IM +3115625472,3115626495,NL +3115626496,3115627519,RU +3115627520,3115628543,IT +3115628544,3115629567,GB +3115629568,3115630591,RU +3115630592,3115631615,GB +3115631616,3115631871,NL +3115631872,3115632639,US +3115632640,3115633663,RU +3115633664,3115635711,PL +3115635712,3115636735,RU +3115636736,3115637759,GB +3115637760,3115638783,US +3115638784,3115639807,DE +3115639808,3115640831,RU +3115640832,3115641855,NO +3115641856,3115642879,RU +3115642880,3115643903,IE +3115643904,3115644927,FR +3115644928,3115645951,RU +3115645952,3115647999,SE +3115648000,3115649023,FR +3115649024,3115649279,NL +3115649280,3115649535,GB +3115649536,3115649791,DE +3115649792,3115650047,GB +3115650048,3115651071,DE +3115651072,3115652095,UA +3115652096,3115653119,DK +3115653120,3115654143,DE +3115654144,3115655167,GR +3115655168,3115656191,ES +3115656192,3115657215,UA +3115657216,3115658239,MD +3115658240,3115659263,SE +3115659264,3115660287,MD +3115660288,3115661311,IQ +3115661312,3115662335,CZ +3115662336,3115663359,NO +3115663360,3115664383,SA +3115664384,3115665407,RS +3115665408,3115666431,NL +3115666432,3115667455,FR +3115667456,3115668479,NO +3115668480,3115669503,NL +3115669504,3115670527,SE +3115670528,3115671551,IT +3115671552,3115672575,SE +3115672576,3115673599,RO +3115673600,3115674623,DE +3115674624,3115675647,SY +3115675648,3115676671,DE +3115676672,3115677695,GB +3115677696,3115678719,DE +3115678720,3115679743,GB +3115679744,3115681791,NL +3115681792,3115682815,IT +3115682816,3115683839,NL +3115683840,3115684863,GB +3115684864,3115685887,BG +3115685888,3115687935,FR +3115687936,3115689983,UA +3115689984,3115691007,DE +3115691008,3115692031,IE +3115692032,3115693055,CZ +3115693056,3115694079,IR +3115694080,3115695103,CZ +3115695104,3115697151,DE +3115697152,3115698175,GB +3115698176,3115699199,RS +3115699200,3115700223,CH +3115700224,3115701247,TR +3115701248,3115702271,NL +3115702272,3115703295,SE +3115703296,3115704319,GR +3115704320,3115705343,DE +3115705344,3115706367,MD +3115706368,3115707391,NL +3115707392,3115708415,ES +3115708416,3115709439,RO +3115709440,3115710463,RU +3115710464,3115711487,GE +3115711488,3115714559,ES +3115715584,3115717631,RU +3115717632,3115718655,UA +3115718656,3115719679,CH +3115719680,3115720703,GB +3115720704,3115722751,DE +3115722752,3115723775,FR +3115723776,3115724799,DE +3115724800,3115725311,GB +3115725312,3115725567,DE +3115725568,3115725823,CH +3115725824,3115726847,GB +3115726848,3115727871,NL +3115727872,3115728703,GB +3115728704,3115728735,NL +3115728736,3115728895,GB +3115728896,3115729919,FR +3115729920,3115730943,GB +3115730944,3115731967,IE +3115731968,3115732991,MD +3115732992,3115734015,DE +3115734016,3115735039,SE +3115735040,3115736063,GB +3115736064,3115737087,LV +3115737088,3115738111,PL +3115738112,3115739135,UA +3115739136,3115740159,NL +3115740160,3115741183,RU +3115741184,3115742207,LB +3115742208,3115743231,IT +3115743232,3115744255,AM +3115745280,3115746303,RU +3115746304,3115747327,BE +3115747328,3115748351,JO +3115748352,3115749375,IT +3115749376,3115750399,GB +3115750400,3115751423,GE +3115751424,3115752447,ES +3115752448,3115753471,GB +3115753472,3115754495,RS +3115754496,3115755519,RU +3115755520,3115756543,FR +3115756544,3115757567,IT +3115757568,3115758591,AT +3115758592,3115759615,ES +3115759616,3115760639,US +3115760640,3115761663,TR +3115761664,3115762687,MD +3115762688,3115763711,IT +3115763712,3115764735,GB +3115764736,3115765759,DK +3115765760,3115766783,IT +3115766784,3115767807,HU +3115767808,3115768831,KZ +3115768832,3115769855,IR +3115769856,3115770879,PL +3115770880,3115771903,GB +3115771904,3115772927,DE +3115772928,3115773951,TR +3115773952,3115774975,GB +3115776000,3115777023,IR +3115777024,3115779071,FR +3115779072,3115780095,IT +3115780096,3115781119,CZ +3115781120,3115782143,RU +3115782144,3115783167,ES +3115783168,3115784191,GB +3115784192,3115785215,DE +3115785216,3115786239,NL +3115786240,3115787263,MD +3115787264,3115788287,PL +3115788288,3115789311,DK +3115789312,3115790335,UA +3115790336,3115791359,RU +3115791360,3115792383,DE +3115792384,3115793407,SE +3115793408,3115795455,FR +3115795456,3115796479,IT +3115796480,3115797503,CZ +3115797504,3115798015,UA +3115798016,3115798527,RU +3115798528,3115799551,MD +3115799552,3115801599,DE +3115801600,3115802623,LB +3115802624,3115802879,NL +3115802880,3115803135,RO +3115803136,3115803391,NL +3115803392,3115803647,RO +3115803648,3115804671,GB +3115804672,3115804927,CH +3115804928,3115805183,IT +3115805184,3115805439,ES +3115805440,3115805695,AT +3115805696,3115806719,UA +3115806720,3115807743,NL +3115807744,3115808767,BE +3115808768,3115809791,BY +3115809792,3115810815,DE +3115810816,3115811839,IR +3115811840,3115812863,IL +3115812864,3115813887,MD +3115813888,3115814911,FR +3115814912,3115815935,SE +3115815936,3115816959,RS +3115816960,3115817983,SE +3115817984,3115819007,DE +3115819008,3115820031,RU +3115820032,3115822079,TR +3115822080,3115823103,RU +3115823104,3115824127,DE +3115824128,3115824639,US +3115824640,3115824895,DE +3115824896,3115825151,GB +3115825152,3115826175,GR +3115826176,3115828223,CH +3115828224,3115829247,RU +3115829248,3115830271,NL +3115830272,3115831295,DE +3115831296,3115832319,FR +3115832320,3115833343,GB +3115833344,3115834367,FR +3115834368,3115835391,ES +3115835392,3115836415,PL +3115836416,3115837439,FR +3115837440,3115838463,SK +3115838464,3115839487,PL +3115839488,3115840511,UZ +3115840512,3115841535,IE +3115841536,3115842559,MK +3115842560,3115843583,FR +3115843584,3115844607,ES +3115844608,3115845631,FR +3115845632,3115846655,PL +3115846656,3115847679,CH +3115847680,3115848703,IL +3115848704,3115849727,AE +3115849728,3115850751,TR +3115850752,3115851775,SK +3115851776,3115852799,IR +3115852800,3115853823,IT +3115853824,3115854847,RU +3115854848,3115855871,FI +3115855872,3115856895,IR +3115856896,3115857919,RU +3115857920,3115858943,LU +3115858944,3115859967,BG +3115859968,3115860991,FI +3115860992,3115862015,DE +3115862016,3115863039,NL +3115863040,3115864063,RU +3115864064,3115865087,PL +3115865088,3115866111,LB +3115866112,3115867135,ES +3115867136,3115868159,SE +3115868160,3115869183,NL +3115869184,3115870207,DE +3115870208,3115871231,SY +3115871232,3115872255,NL +3115872256,3115873279,GB +3115873280,3115874303,CH +3115874304,3115875327,GB +3115875328,3115876351,PL +3115876352,3115877375,RU +3115877376,3115878399,CH +3115878400,3115879423,IT +3115879424,3115879679,GB +3115879680,3115880447,CR +3115880448,3115881471,LT +3115881472,3115882495,ES +3115882496,3115884543,GB +3115884544,3115885567,DE +3115885568,3115886591,NL +3115886592,3115887615,UA +3115887616,3115888639,ES +3115888640,3115889663,CH +3115889664,3115889919,PL +3115889920,3115890175,CZ +3115890176,3115890431,GB +3115890432,3115890687,PL +3115890688,3115891711,FR +3115891712,3115892735,NL +3115892736,3115893759,GB +3115893760,3115894783,IQ +3115894784,3115895807,DE +3115895808,3115896831,NL +3115896832,3115897855,TR +3115897856,3115898879,DE +3115898880,3115899903,IQ +3115899904,3115900927,GB +3115900928,3115901951,DE +3115901952,3115902975,IT +3115902976,3115903999,RU +3115904000,3115905023,GB +3115905024,3115906047,RO +3115906048,3115907071,MD +3115907072,3115908095,GB +3115908096,3115909119,CZ +3115909120,3115910143,UA +3115910144,3115912191,FR +3115912192,3115913215,MD +3115913216,3115914239,IR +3115914240,3115915263,RU +3115915264,3115916287,DE +3115916288,3115917311,NL +3115917312,3115918335,CH +3115918336,3115919359,ES +3115919360,3115920383,NL +3115920384,3115921407,IT +3115921408,3115922431,NL +3115923456,3115924479,RU +3115924480,3115925503,TR +3115925504,3115926527,ES +3115926528,3115927551,RU +3115927552,3115928575,SY +3115928576,3115929599,GB +3115929600,3115930623,US +3115930624,3115931647,GB +3115931648,3115932671,SI +3115932672,3115933695,ES +3115933696,3115934719,DK +3115934720,3115935743,RO +3115935744,3115936767,RU +3115936768,3115937791,GB +3115937792,3115938815,TR +3115938816,3115939839,FR +3115939840,3115940863,RU +3115940864,3115941119,CU +3115941120,3115941887,DE +3115941888,3115942911,CZ +3115942912,3115943935,IL +3115943936,3115948031,RU +3115948032,3115949055,GB +3115949056,3115950079,GR +3115950080,3115951103,GB +3115951104,3115952127,NL +3115952128,3115953151,FI +3115953152,3115954175,IQ +3115954176,3115955199,LB +3115955200,3115956223,UA +3115956224,3115957247,CY +3115957248,3115959295,DE +3115959296,3115960319,ES +3115960320,3115961343,CH +3115961344,3115962367,NL +3115962368,3115963391,AT +3115963392,3115964415,NL +3115964416,3115965439,CZ +3115965440,3115966463,SY +3115966464,3115967487,GB +3115967488,3115968511,BE +3115968512,3115969535,TR +3115969536,3115970559,CH +3115970560,3115971583,IR +3115971584,3115972607,NL +3115972608,3115973119,CR +3115973120,3115973375,GB +3115973376,3115973631,US +3115973632,3115974655,UA +3115974656,3115975679,RU +3115975680,3115976703,GB +3115976704,3115977727,US +3115977728,3115978751,IT +3115978752,3115980799,PL +3115980800,3115981823,DE +3115981824,3115982847,ES +3115982848,3115983871,SE +3115983872,3115984895,CZ +3115984896,3115985919,FI +3115985920,3115986943,NO +3115986944,3115987967,IR +3115987968,3115988991,GB +3115988992,3115990015,SE +3115990016,3115991039,RO +3115991040,3115991551,NL +3115991552,3115991807,BE +3115991808,3115992063,NL +3115992064,3115993087,IT +3115993088,3115994111,FR +3115994112,3115994367,CH +3115994368,3115994623,GB +3115994624,3115994879,SE +3115994880,3115995135,DK +3115995136,3115996159,AL +3115996160,3115997183,GR +3115997184,3115998207,FR +3115998208,3115999231,IT +3115999232,3116000255,PL +3116000256,3116002303,GB +3116002304,3116003327,TR +3116003328,3116004351,BG +3116004352,3116005375,NL +3116005376,3116006399,DE +3116006400,3116007423,GB +3116007424,3116008447,RO +3116008448,3116009471,NO +3116009472,3116010495,BG +3116010496,3116011519,RU +3116011520,3116012031,DE +3116012032,3116012543,US +3116012544,3116013567,BE +3116013568,3116015615,PL +3116015616,3116016639,CZ +3116016640,3116017663,GB +3116017664,3116019711,NL +3116019712,3116020735,PS +3116020736,3116021759,ES +3116021760,3116022783,RU +3116022784,3116023807,ES +3116023808,3116024831,RU +3116024832,3116025855,CZ +3116025856,3116026879,ES +3116026880,3116027903,OM +3116027904,3116028927,BY +3116028928,3116029951,BE +3116029952,3116030975,PL +3116030976,3116033023,DE +3116033024,3116034047,FR +3116034048,3116035071,RU +3116035072,3116036095,DE +3116036096,3116037119,IR +3116037120,3116038143,NL +3116038144,3116039167,CZ +3116039168,3116040191,PL +3116040192,3116041215,AL +3116041216,3116042239,BA +3116042240,3116043263,SI +3116043264,3116044287,NL +3116044288,3116045311,TR +3116045312,3116046335,NL +3116046336,3116047359,NO +3116047360,3116048383,FR +3116048384,3116049407,MD +3116049408,3116050431,IL +3116050432,3116052479,IT +3116052480,3116053503,IR +3116053504,3116054527,PL +3116054528,3116055551,GB +3116055552,3116057599,DE +3116057600,3116058623,ES +3116058624,3116059647,HU +3116059648,3116060671,OM +3116060672,3116061695,UA +3116061696,3116062719,IR +3116062720,3116063743,RU +3116063744,3116064767,LB +3116064768,3116065791,ES +3116065792,3116066047,BE +3116066048,3116066815,NL +3116066816,3116067839,TR +3116067840,3116068863,NL +3116068864,3116069887,RU +3116069888,3116070911,GB +3116070912,3116071935,CH +3116071936,3116072959,NL +3116072960,3116073983,LB +3116073984,3116075007,GB +3116075008,3116076031,HR +3116076032,3116077055,CZ +3116077056,3116078079,DK +3116078080,3116080383,GB +3116080384,3116080639,US +3116080640,3116080895,HK +3116080896,3116081151,GB +3116081152,3116082175,IL +3116082176,3116083199,FR +3116083200,3116084223,US +3116084224,3116085247,IT +3116085248,3116085503,KW +3116085504,3116085759,SA +3116085760,3116086015,EG +3116086016,3116086271,JO +3116086272,3116087295,ES +3116087296,3116088319,TR +3116088320,3116089343,RU +3116089344,3116090367,SY +3116090368,3116091391,RU +3116091392,3116092415,DE +3116092416,3116093439,IQ +3116093440,3116094463,FR +3116094464,3116095487,CZ +3116095488,3116096511,FR +3116096512,3116097535,SY +3116097536,3116098559,NL +3116098560,3116099583,CH +3116099584,3116100607,US +3116100608,3116101631,CZ +3116101632,3116102143,DE +3116102144,3116102655,GB +3116102656,3116103679,FR +3116103680,3116104703,HU +3116104704,3116105727,SE +3116105728,3116107007,DE +3116107008,3116107263,US +3116107264,3116107775,DE +3116107776,3116108799,ES +3116108800,3116109823,RU +3116109824,3116110847,ES +3116110848,3116111871,DK +3116111872,3116112895,IT +3116112896,3116113919,US +3116113920,3116114943,DE +3116114944,3116115967,TR +3116115968,3116116991,NL +3116116992,3116118015,CH +3116118016,3116120063,DE +3116120064,3116121087,HU +3116121088,3116122111,GB +3116122112,3116123135,DE +3116123136,3116124159,PL +3116124160,3116125183,DE +3116125184,3116126207,NL +3116126208,3116127231,CH +3116127232,3116128255,TR +3116128256,3116130303,FR +3116130304,3116131327,RU +3116131328,3116132351,CZ +3116132352,3116133375,IR +3116133376,3116134399,DE +3116134400,3116135423,IR +3116135424,3116136447,PL +3116136448,3116137471,DE +3116137472,3116138495,NL +3116138496,3116139519,TR +3116139520,3116140543,DE +3116140544,3116141567,AT +3116141568,3116142591,NL +3116142592,3116143615,TR +3116143616,3116144639,ES +3116144640,3116145663,CH +3116145664,3116147711,FR +3116147712,3116148735,PL +3116148736,3116149759,FR +3116149760,3116150783,GB +3116150784,3116151807,FR +3116151808,3116152831,RU +3116153856,3116154879,SK +3116154880,3116155903,RU +3116155904,3116156927,CH +3116156928,3116157951,DE +3116157952,3116158975,RU +3116158976,3116161023,ES +3116161024,3116162047,AL +3116162048,3116163071,GB +3116163072,3116164095,SE +3116164096,3116165119,BG +3116165120,3116166143,GB +3116166144,3116167167,SK +3116167168,3116169215,DE +3116169216,3116170239,US +3116170240,3116171263,GB +3116171264,3116172287,DE +3116172288,3116173311,CZ +3116173312,3116174335,NL +3116174336,3116176383,RU +3116176384,3116177407,FR +3116177408,3116177919,US +3116177920,3116178431,DE +3116178432,3116179455,SE +3116179456,3116180479,CZ +3116180480,3116181503,US +3116181504,3116182527,GB +3116182528,3116183551,US +3116183552,3116184575,SE +3116184576,3116185599,TR +3116185600,3116185855,US +3116185856,3116186623,GB +3116186624,3116187647,IT +3116187648,3116188671,ES +3116188672,3116189695,MD +3116189696,3116190719,NL +3116190720,3116191743,IT +3116191744,3116192767,AT +3116192768,3116193791,SE +3116193792,3116194815,LB +3116194816,3116195839,CZ +3116195840,3116196863,DE +3116196864,3116197887,RU +3116197888,3116198911,NL +3116198912,3116199935,ES +3116199936,3116200191,DE +3116200192,3116200447,FR +3116200448,3116200703,HU +3116200704,3116200959,CZ +3116200960,3116201983,DE +3116201984,3116203007,IR +3116203008,3116204031,PL +3116204032,3116205055,TR +3116205056,3116206079,RU +3116206080,3116207103,PL +3116207104,3116208127,UA +3116208128,3116209151,GB +3116209152,3116210175,CH +3116210176,3116211199,LT +3116211200,3116212223,FR +3116212224,3116213247,NL +3116213248,3116214271,RU +3116214272,3116215295,RO +3116215296,3116216319,FR +3116216320,3116217343,ES +3116217344,3116218367,NL +3116218368,3116219391,UA +3116219392,3116220415,FR +3116220416,3116221439,RU +3116221440,3116222463,BG +3116222464,3116223487,GB +3116223488,3116224511,PL +3116224512,3116225535,GE +3116225536,3116226559,PL +3116226560,3116227583,GE +3116227584,3116228607,DE +3116228608,3116229631,ES +3116229632,3116230655,DE +3116230656,3116231679,GB +3116231680,3116232703,FR +3116232704,3116233727,NL +3116233728,3116234751,UA +3116234752,3116235775,GB +3116235776,3116238847,RU +3116238848,3116239871,UA +3116239872,3116240895,IE +3116240896,3116241151,US +3116241152,3116241407,FR +3116241408,3116241663,US +3116241664,3116241919,TR +3116241920,3116242943,IR +3116242944,3116243967,NL +3116243968,3116244991,LB +3116244992,3116246015,CH +3116246016,3116247039,BG +3116247040,3116248063,RU +3116248064,3116249087,GB +3116249088,3116249343,AT +3116249344,3116249599,DE +3116249600,3116249855,CH +3116249856,3116250111,AT +3116250112,3116251135,DE +3116251136,3116251391,US +3116251392,3116251519,GB +3116251520,3116251647,DE +3116251648,3116252159,US +3116252160,3116253183,MD +3116253184,3116254207,NL +3116254208,3116255231,DE +3116255232,3116256255,GB +3116256256,3116257279,AT +3116257280,3116257535,CR +3116257536,3116258303,AT +3116258304,3116259327,NL +3116259328,3116260351,FR +3116260352,3116261375,DE +3116261376,3116262399,BG +3116262400,3116263423,ES +3116263424,3116264447,RU +3116264448,3116265471,NL +3116265472,3116266495,CZ +3116266496,3116268543,RU +3116268544,3116269567,DE +3116269568,3116270591,GB +3116270592,3116271615,AL +3116271616,3116272639,IT +3116272640,3116273663,US +3116273664,3116274687,SE +3116274688,3116275711,UA +3116275712,3116276735,RS +3116276736,3116277759,DE +3116277760,3116278783,IT +3116278784,3116279807,RU +3116279808,3116281855,NO +3116281856,3116282879,ES +3116282880,3116285951,RU +3116285952,3116286975,DE +3116286976,3116287999,GB +3116288000,3116290047,IE +3116290048,3116294143,IT +3116294144,3116295167,US +3116295168,3116297215,NL +3116297216,3116298239,DE +3116298240,3116299263,ES +3116299264,3116300287,CH +3116300288,3116301311,CZ +3116301312,3116302335,ES +3116302336,3116303359,NL +3116303360,3116304383,PT +3116304384,3116305407,ES +3116305408,3116306431,NL +3116306432,3116307455,EE +3116307456,3116308479,ES +3116308480,3116309503,NO +3116309504,3116310527,KZ +3116310528,3116311551,RU +3116311552,3116312575,FR +3116312576,3116314623,ES +3116314624,3116315647,FR +3116315648,3116316671,TJ +3116316672,3116317695,RU +3116317696,3116318719,IT +3116318720,3116319743,ES +3116319744,3116320767,CH +3116320768,3116321791,NL +3116321792,3116322815,IR +3116322816,3116323839,UA +3116323840,3116324863,GB +3116324864,3116325887,ES +3116325888,3116326911,FR +3116326912,3116327935,IT +3116327936,3116328959,NL +3116328960,3116329983,IT +3116329984,3116331007,DE +3116331008,3116332031,UA +3116332032,3116333055,US +3116333056,3116334079,DE +3116334080,3116335103,NL +3116335104,3116336127,BE +3116336128,3116337151,NL +3116337152,3116338175,SA +3116338176,3116339199,RU +3116339200,3116340223,CH +3116340224,3116341247,UA +3116341248,3116342271,FR +3116342272,3116343295,IE +3116343296,3116344319,GB +3116344320,3116345343,AL +3116345344,3116346367,MD +3116346368,3116347391,DE +3116347392,3116348415,UA +3116348416,3116349439,IT +3116349440,3116350463,CZ +3116350464,3116351487,HU +3116351488,3116352511,FI +3116352512,3116353535,RU +3116353536,3116354559,FR +3116354560,3116355583,IL +3116355584,3116356607,GB +3116356608,3116357631,RU +3116357632,3116358655,DE +3116358656,3116359679,GE +3116359680,3116360703,DE +3116360704,3116361727,US +3116361728,3116362751,IS +3116362752,3116363775,CH +3116363776,3116364799,NL +3116364800,3116365823,PL +3116365824,3116367871,ES +3116367872,3116368895,NL +3116368896,3116369919,GI +3116369920,3116370943,IR +3116370944,3116371967,FI +3116371968,3116372991,NL +3116372992,3116374015,RU +3116374016,3116375039,FI +3116375040,3116376063,DE +3116376064,3116377087,BE +3116377088,3116378111,DE +3116378112,3116379135,GB +3116379136,3116380159,BE +3116380160,3116381183,DE +3116381184,3116382207,LB +3116382208,3116382463,JP +3116382464,3116382719,GU +3116382720,3116382975,AQ +3116382976,3116383231,DE +3116383232,3116384255,RU +3116384256,3116385279,DE +3116385280,3116386047,US +3116386048,3116386303,GB +3116386304,3116387327,ES +3116387328,3116388351,DE +3116388352,3116389375,GB +3116389376,3116390399,BG +3116390400,3116391423,IE +3116391424,3116392447,GB +3116392448,3116393471,US +3116393472,3116394495,PL +3116394496,3116395519,NL +3116395520,3116396543,RU +3116396544,3116397567,IR +3116397568,3116398591,ES +3116398592,3116399615,RO +3116399616,3116400639,NL +3116400640,3116401663,FI +3116401664,3116402687,NL +3116402688,3116403711,IT +3116403712,3116404735,DE +3116404736,3116405759,NL +3116405760,3116406783,FR +3116406784,3116407807,IE +3116407808,3116408831,RU +3116408832,3116409855,LB +3116409856,3116410879,GB +3116410880,3116412927,DE +3116412928,3116413951,GB +3116413952,3116414975,ES +3116414976,3116415231,NL +3116415232,3116415999,BE +3116416000,3116417023,NL +3116417024,3116418047,CH +3116418048,3116419071,FI +3116419072,3116420095,DE +3116420096,3116421119,BE +3116421120,3116422143,ES +3116422144,3116423167,NL +3116423168,3116424191,UA +3116424192,3116425215,ES +3116425216,3116426239,AT +3116426240,3116427263,GB +3116427264,3116428287,NO +3116428288,3116429311,KW +3116429312,3116430335,PL +3116430336,3116431359,RU +3116431360,3116432383,UA +3116432384,3116433407,HU +3116433408,3116434431,ES +3116434432,3116435455,TR +3116435456,3116436479,ES +3116436480,3116437503,AM +3116437504,3116439551,RU +3116439552,3116440575,LT +3116440576,3116441599,MD +3116441600,3116442879,GB +3116442880,3116443135,US +3116443136,3116443391,FR +3116443392,3116443647,GB +3116443648,3116444671,DE +3116444672,3116445695,FR +3116445696,3116446719,US +3116446720,3116447743,RO +3116447744,3116448767,BG +3116448768,3116449791,EE +3116449792,3116450815,US +3116450816,3116451839,ES +3116451840,3116452863,NL +3116452864,3116453887,FI +3116453888,3116454911,DE +3116454912,3116455935,CZ +3116455936,3116456959,RU +3116456960,3116457983,NO +3116457984,3116459007,MD +3116459008,3116460031,CZ +3116460032,3116461055,ES +3116461056,3116462079,FR +3116462080,3116464127,PL +3116464128,3116465151,DK +3116465152,3116466175,SE +3116466176,3116467199,CZ +3116467200,3116468223,AZ +3116468224,3116470271,RU +3116470272,3116471295,DE +3116471296,3116472319,GB +3116472320,3116473343,AE +3116473344,3116474367,GB +3116474368,3116475391,PL +3116475392,3116476415,TR +3116476416,3116477439,GB +3116477440,3116478463,ES +3116478464,3116479487,JO +3116479488,3116480511,CH +3116480512,3116481535,NL +3116481536,3116482559,IT +3116482560,3116483583,AT +3116483584,3116484607,RU +3116484608,3116485631,ES +3116485632,3116486655,RU +3116486656,3116488703,IR +3116488704,3116489727,NL +3116489728,3116490751,HU +3116490752,3116491775,CH +3116491776,3116492799,DE +3116492800,3116493823,IR +3116493824,3116494847,DK +3116494848,3116495871,NL +3116495872,3116496895,CH +3116496896,3116497919,RU +3116497920,3116498943,IT +3116498944,3116499967,NL +3116499968,3116500991,IT +3116500992,3116502015,IQ +3116502016,3116504063,NL +3116504064,3116505087,AT +3116505088,3116507135,ES +3116507136,3116508159,RU +3116508160,3116509183,DE +3116509184,3116510207,GB +3116510208,3116511231,CZ +3116511232,3116512255,ES +3116512256,3116513279,GB +3116513280,3116515327,ES +3116515328,3116516351,UA +3116516352,3116517375,CZ +3116517376,3116518399,SY +3116518400,3116519423,IR +3116519424,3116520447,RU +3116520448,3116521471,BE +3116521472,3116522495,GB +3116522496,3116523519,LU +3116523520,3116524543,TR +3116524544,3116525567,ES +3116525568,3116526591,RU +3116526592,3116527615,ES +3116527616,3116528639,GB +3116528640,3116529663,NL +3116529664,3116530687,UA +3116530688,3116531711,SY +3116531712,3116532735,FR +3116532736,3116533759,SA +3116533760,3116534783,NL +3116534784,3116535807,DE +3116535808,3116536831,AT +3116536832,3116537855,DE +3116537856,3116538879,LB +3116538880,3116539903,FR +3116539904,3116540927,NL +3116540928,3116541951,FR +3116541952,3116542975,GB +3116542976,3116543999,TR +3116544000,3116545023,ES +3116545024,3116546047,CH +3116546048,3116546079,FR +3116546080,3116546111,GB +3116546112,3116546143,DE +3116546144,3116546175,LU +3116546176,3116546207,ES +3116546208,3116546223,DK +3116546224,3116546239,FI +3116546240,3116546255,NL +3116546256,3116546271,PT +3116546272,3116546287,SE +3116546288,3116546303,AU +3116546304,3116546319,CH +3116546320,3116546335,HR +3116546336,3116546351,IE +3116546352,3116546367,LU +3116546368,3116546383,BE +3116546384,3116546399,GR +3116546400,3116546415,NO +3116546416,3116546431,SI +3116546432,3116546815,LU +3116546816,3116547071,BE +3116547072,3116548095,UA +3116548096,3116549119,NL +3116549120,3116550143,TJ +3116550144,3116551167,IT +3116551168,3116552191,FR +3116552192,3116553215,ES +3116553216,3116554239,PL +3116554240,3116555263,US +3116555264,3116557311,PL +3116557312,3116558335,NL +3116558336,3116559359,FR +3116559360,3116560383,DE +3116560384,3116561407,IL +3116561408,3116562431,IR +3116562432,3116563455,NL +3116563456,3116564479,GB +3116564480,3116565503,DK +3116565504,3116566527,MD +3116566528,3116567551,UA +3116567552,3116568575,GB +3116568576,3116569599,RO +3116569600,3116570623,EE +3116570624,3116571647,RU +3116571648,3116572671,BE +3116572672,3116573695,SA +3116573696,3116574719,ES +3116574720,3116575743,UA +3116575744,3116576767,ES +3116576768,3116577791,TR +3116577792,3116578815,HU +3116578816,3116579839,GB +3116579840,3116580863,AT +3116580864,3116581887,US +3116581888,3116582911,CH +3116582912,3116583935,IR +3116583936,3116584959,TR +3116584960,3116587007,CZ +3116587008,3116588031,FR +3116588032,3116589055,SE +3116589056,3116590079,ES +3116590080,3116591103,DE +3116591104,3116592127,GB +3116592128,3116593151,ES +3116593152,3116594175,DE +3116594176,3116595199,GB +3116595200,3116596223,DK +3116596224,3116597247,GB +3116597248,3116598271,IT +3116598272,3116599295,GB +3116599296,3116600319,BE +3116600320,3116601343,NO +3116601344,3116602367,RU +3116602368,3116603391,DE +3116603392,3116604415,RU +3116604416,3116605439,SI +3116605440,3116606463,MD +3116606464,3116607487,GB +3116607488,3116608511,RU +3116608512,3116609535,DK +3116609536,3116610559,ES +3116610560,3116611583,DE +3116611584,3116612607,MD +3116612608,3116613631,RU +3116613632,3116614655,PL +3116614656,3116615679,CH +3116615680,3116616703,GB +3116616704,3116617727,ES +3116617728,3116618751,NO +3116618752,3116619775,NL +3116619776,3116620799,DE +3116620800,3116621823,NL +3116621824,3116622847,CZ +3116622848,3116623871,TR +3116623872,3116624895,SE +3116624896,3116625151,AT +3116625152,3116625407,EE +3116625408,3116625663,GL +3116625664,3116625919,NZ +3116625920,3116626943,RU +3116626944,3116627967,NL +3116627968,3116628991,FR +3116628992,3116630015,TR +3116630016,3116631039,UA +3116631040,3116632063,FI +3116632064,3116633087,CH +3116633088,3116634111,RO +3116634112,3116635135,ES +3116635136,3116635903,DE +3116635904,3116636159,GB +3116636160,3116637183,US +3116637184,3116638207,NL +3116638208,3116639231,ES +3116639232,3116640255,SE +3116640256,3116641279,ES +3116641280,3116642303,NL +3116642304,3116643327,IT +3116643328,3116644351,HU +3116644352,3116645375,ES +3116645376,3116646399,NL +3116646400,3116647423,ES +3116647424,3116648447,UA +3116648448,3116649471,FR +3116649472,3116650495,DK +3116650496,3116651519,GB +3116651520,3116652543,CH +3116652544,3116653567,NO +3116653568,3116654591,US +3116654592,3116656639,GB +3116656640,3116657663,CH +3116657664,3116658687,DE +3116658688,3116659711,ES +3116659712,3116660735,RU +3116660736,3116661759,DE +3116661760,3116662783,UA +3116662784,3116663807,CH +3116663808,3116664831,GB +3116664832,3116665855,CH +3116665856,3116667903,SY +3116667904,3116668927,IR +3116668928,3116669951,SE +3116669952,3116670975,AT +3116670976,3116673023,IT +3116673024,3116674047,RU +3116674048,3116675071,NL +3116675072,3116676095,AT +3116676096,3116677119,AL +3116677120,3116678143,RU +3116678144,3116679167,NL +3116679168,3116681215,MD +3116681216,3116682239,ES +3116682240,3116684287,GB +3116684288,3116686335,UZ +3116686336,3116687359,NL +3116687360,3116688383,US +3116688384,3116689407,PL +3116689408,3116690431,FI +3116690432,3116691455,RU +3116691456,3116692479,AT +3116692480,3116693503,RU +3116693504,3116696575,ES +3116696576,3116697599,MK +3116697600,3116698623,IT +3116698624,3116699647,RU +3116699648,3116700671,NL +3116700672,3116701695,SY +3116701696,3116702719,NL +3116702720,3116703231,US +3116703232,3116703487,NL +3116703488,3116703743,GB +3116703744,3116704767,RU +3116704768,3116705791,BE +3116705792,3116706815,CH +3116706816,3116707839,AT +3116707840,3116708863,ES +3116708864,3116711935,GB +3116711936,3116712959,ES +3116712960,3116713983,IR +3116713984,3116715007,RU +3116715008,3116716031,ES +3116716032,3116717055,NL +3116717056,3116718079,FR +3116718080,3116719103,ES +3116719104,3116720127,SE +3116720128,3116721151,LU +3116721152,3116724223,FR +3116724224,3116725247,IR +3116725248,3116726271,NO +3116726272,3116727295,MD +3116727296,3116728319,TR +3116728320,3116729343,IT +3116729344,3116729599,DE +3116729600,3116730367,NL +3116730368,3116731391,DK +3116731392,3116732415,IT +3116732416,3116733439,RU +3116733440,3116734463,DK +3116734464,3116735487,BG +3116735488,3116736511,FR +3116736512,3116737535,GB +3116737536,3116738559,DE +3116738560,3116739583,DK +3116739584,3116740607,DE +3116740608,3116741631,JO +3116742656,3116743679,FR +3116743680,3116744703,NL +3116744704,3116745727,US +3116745728,3116746751,TR +3116746752,3116747775,ES +3116747776,3116748799,IL +3116748800,3116749823,NO +3116749824,3116750847,IT +3116750848,3116751871,ES +3116751872,3116752895,NO +3116752896,3116753919,SE +3116753920,3116754943,IT +3116754944,3116755967,RU +3116755968,3116756991,DE +3116756992,3116758015,NL +3116758016,3116759039,ES +3116759040,3116760063,US +3116760064,3116761087,FR +3116761088,3116762111,PL +3116762112,3116763135,SE +3116763136,3116764159,US +3116764160,3116765183,GB +3116765184,3116766207,PL +3116766208,3116767231,FR +3116767232,3116767743,US +3116767744,3116767999,NL +3116768000,3116769279,GB +3116769280,3116770303,LT +3116770304,3116772351,RU +3116772352,3116773375,MD +3116773376,3116774399,ES +3116774400,3116775423,TR +3116775424,3116775679,RO +3116775680,3116776447,NL +3116776448,3116777471,IT +3116777472,3116778495,ES +3116778496,3116779519,GB +3116779520,3116780543,TR +3116780544,3116781567,FR +3116781568,3116782591,SE +3116782592,3116783615,GB +3116783616,3116784639,DE +3116784640,3116785663,NO +3116785664,3116786687,IT +3116786688,3116787711,ES +3116787712,3116788735,CY +3116788736,3116789759,ES +3116789760,3116790783,RU +3116790784,3116792831,IT +3116792832,3116793855,TR +3116793856,3116794879,FR +3116794880,3116795903,GB +3116795904,3116796927,LT +3116796928,3116797951,CH +3116797952,3116798975,IS +3116798976,3116799999,DE +3116800000,3116801023,RU +3116801024,3116802047,IT +3116802048,3116803071,IR +3116803072,3116804095,NL +3116804096,3116805119,HU +3116805120,3116806143,SY +3116806144,3116809215,ES +3116809216,3116810239,GB +3116810240,3116811263,SE +3116811264,3116812287,TR +3116812288,3116813311,DE +3116813312,3116814335,CH +3116814336,3116815359,IT +3116815360,3116816383,MD +3116816384,3116818431,DE +3116818432,3116819455,FR +3116819456,3116820479,GB +3116820480,3116822527,AT +3116822528,3116823039,US +3116823040,3116823295,AU +3116823296,3116824575,US +3116824576,3116825599,FR +3116825600,3116826623,IR +3116826624,3116827647,DE +3116827648,3116829695,RU +3116829696,3116830719,CY +3116830720,3116831743,GB +3116831744,3116832767,MD +3116832768,3116833791,IT +3116833792,3116834815,HU +3116834816,3116835839,FR +3116835840,3116836863,BG +3116836864,3116837887,FR +3116837888,3116838911,ES +3116838912,3116839935,IT +3116839936,3116841983,GB +3116841984,3116843007,SC +3116843008,3116844031,IR +3116844032,3116845055,DE +3116845056,3116846079,IT +3116846080,3116847103,DE +3116847104,3116848127,AT +3116848128,3116849151,CZ +3116849152,3116850175,TR +3116850176,3116851199,NL +3116851200,3116852223,UA +3116852224,3116853247,US +3116853248,3116854271,DE +3116854272,3116855295,NL +3116855296,3116856319,IT +3116856320,3116857343,NL +3116857344,3116858367,RS +3116858368,3116859391,NL +3116859392,3116860415,GB +3116860416,3116861439,DE +3116861440,3116862463,SE +3116862464,3116863487,DE +3116863488,3116864511,RU +3116864512,3116865535,ES +3116865536,3116866559,AT +3116866560,3116867583,ES +3116867584,3116868607,RU +3116868608,3116869631,GB +3116869632,3116870655,SE +3116870656,3116871679,RO +3116871680,3116872703,CH +3116872704,3116873727,BE +3116873728,3116874751,FR +3116874752,3116875775,NL +3116875776,3116876799,DE +3116876800,3116877823,IR +3116877824,3116878847,FR +3116878848,3116879871,DE +3116879872,3116880895,IR +3116880896,3116881919,ES +3116881920,3116882943,DE +3116882944,3116883967,GB +3116883968,3116884991,US +3116884992,3116886015,ES +3116886016,3116887039,NL +3116887040,3116888063,DK +3116888064,3116889087,GB +3116889088,3116890111,SY +3116890112,3116891135,LU +3116891136,3116892159,PL +3116892160,3116893183,HR +3116893184,3116895231,DE +3116895232,3116896255,ES +3116896256,3116897279,RU +3116897280,3116898303,TR +3116898304,3116899327,ES +3116899328,3116900351,TR +3116900352,3116901375,DE +3116901376,3116902399,GB +3116902400,3116903423,BG +3116903424,3116905471,PL +3116905472,3116906495,AE +3116906496,3116907519,DE +3116907520,3116908543,UA +3116908544,3116909567,GB +3116909568,3116910591,EE +3116910592,3116911615,DK +3116911616,3116912639,ES +3116912640,3116913663,PL +3116913664,3116914687,IE +3116914688,3116915711,IT +3116915712,3116916735,GB +3116916736,3116919807,NL +3116919808,3116920831,CZ +3116920832,3116921855,ES +3116921856,3116922367,SG +3116922368,3116922623,GB +3116922624,3116922879,NL +3116922880,3116923903,PL +3116923904,3116924927,OM +3116924928,3116925951,JO +3116925952,3116926975,NL +3116926976,3116927999,DE +3116928000,3116929023,RU +3116929024,3116930047,FR +3116930048,3116931071,IT +3116931072,3116932095,RU +3116932096,3116933119,BG +3116933120,3116934143,RU +3116934144,3116935167,FR +3116935168,3116936191,RU +3116936192,3116937215,GB +3116937216,3116938239,US +3116938240,3116939263,IT +3116939264,3116940287,SE +3116940288,3116941055,RU +3116941056,3116941311,FI +3116941312,3116942335,FR +3116942336,3116943359,CY +3116943360,3116944383,FR +3116944384,3116945407,US +3116945408,3116945919,DE +3116945920,3116946431,CN +3116946432,3116947455,AL +3116947456,3116948479,RU +3116948480,3116949503,CH +3116949504,3116950527,DE +3116950528,3116951551,ES +3116951552,3116952575,NL +3116952576,3116953599,FR +3116953600,3116954623,RU +3116954624,3116955391,NL +3116955392,3116955647,US +3116955648,3116956671,AL +3116956672,3116957695,NO +3116957696,3116958719,GB +3116958720,3116959743,ES +3116959744,3116960767,DE +3116960768,3116961791,CZ +3116961792,3116962815,NL +3116962816,3116963839,DE +3116963840,3116964863,GE +3116964864,3116965887,RU +3116965888,3116966911,GB +3116966912,3116967935,BG +3116967936,3116968959,DE +3116968960,3116969983,RU +3116969984,3116971007,IR +3116971008,3116972031,RU +3116972032,3116973055,GR +3116973056,3116974079,GB +3116974080,3116975103,IT +3116975104,3116976127,PL +3116976128,3116977151,ES +3116977152,3116978175,IT +3116978176,3116979199,BG +3116979200,3116980223,DE +3116980224,3116981247,RU +3116981248,3116982271,NO +3116982272,3116983295,GB +3116983296,3116984319,OM +3116984320,3116985343,NL +3116985344,3116986367,DE +3116986368,3116987391,PL +3116987392,3116988415,AT +3116988416,3116990463,NO +3116990464,3116991487,GB +3116991488,3116992511,TR +3116992512,3116993535,UA +3116993536,3116994559,IT +3116994560,3116995583,DE +3116995584,3116996607,GB +3116996608,3116997631,ES +3116997632,3116998655,AT +3116998656,3116999679,DE +3116999680,3117000703,GB +3117000704,3117001727,RU +3117001728,3117002751,SE +3117002752,3117003775,ES +3117003776,3117004799,GB +3117004800,3117005823,IT +3117005824,3117005855,PT +3117006848,3117007871,KW +3117007872,3117008895,HR +3117008896,3117009919,NL +3117009920,3117010943,SE +3117010944,3117011967,GB +3117011968,3117012991,TR +3117012992,3117014015,CH +3117014016,3117015039,TR +3117015040,3117016063,DE +3117016064,3117017087,NL +3117017088,3117018111,CZ +3117018112,3117019135,SK +3117019136,3117020159,IT +3117020160,3117021183,US +3117021184,3117022207,CH +3117022208,3117023231,NL +3117023232,3117024255,FR +3117024256,3117025279,AT +3117025280,3117026303,DK +3117026304,3117027327,RU +3117027328,3117028351,IE +3117028352,3117029375,DE +3117029376,3117030399,FR +3117030400,3117031423,GB +3117031424,3117034495,UA +3117034496,3117035519,US +3117035520,3117036543,UA +3117036544,3117037567,FR +3117037568,3117038591,IR +3117038592,3117039615,FR +3117039616,3117040639,SE +3117040640,3117041663,IE +3117041664,3117042687,GB +3117042688,3117043711,BA +3117043712,3117044735,CH +3117044736,3117045759,RO +3117045760,3117046783,MD +3117046784,3117047807,IR +3117047808,3117048831,NL +3117048832,3117049855,UA +3117049856,3117052927,NL +3117052928,3117053951,ES +3117053952,3117054975,IT +3117054976,3117055999,PL +3117056000,3117057023,IT +3117057024,3117058047,CH +3117058048,3117059071,HU +3117059072,3117060095,SA +3117060096,3117061119,GB +3117061120,3117062143,AT +3117062144,3117063167,NL +3117063168,3117064191,DE +3117064192,3117066239,ES +3117066240,3117067263,TR +3117067264,3117068287,US +3117068288,3117069311,SE +3117069312,3117070335,FR +3117070336,3117071359,NG +3117071360,3117073407,ES +3117073408,3117074431,DE +3117074432,3117075455,NL +3117075456,3117076479,ES +3117076480,3117077503,SE +3117077504,3117078527,RU +3117078528,3117079551,PL +3117079552,3117080575,US +3117080576,3117081599,BE +3117081600,3117082623,SA +3117082624,3117083647,GB +3117083648,3117084671,US +3117084672,3117085695,TR +3117085696,3117086719,IT +3117086720,3117087743,LU +3117087744,3117088767,NL +3117088768,3117089791,DK +3117089792,3117090815,GB +3117090816,3117091839,IT +3117091840,3117092863,GB +3117092864,3117093887,HR +3117093888,3117094911,ES +3117094912,3117095935,IT +3117095936,3117096959,FR +3117096960,3117097983,NL +3117097984,3117099007,UA +3117099008,3117100031,CH +3117100032,3117101055,CZ +3117101056,3117102079,DE +3117102080,3117103103,IQ +3117103104,3117104127,NL +3117104128,3117105151,GB +3117105152,3117106175,IE +3117106176,3117107199,SY +3117107200,3117108223,CH +3117108224,3117109247,IT +3117109248,3117110271,AT +3117110272,3117111295,CZ +3117111296,3117112319,RU +3117112320,3117113343,DE +3117113344,3117114367,RU +3117114368,3117115391,MD +3117115392,3117116415,IT +3117116416,3117117439,SA +3117117440,3117118463,CH +3117118464,3117119487,BG +3117119488,3117119999,DE +3117120000,3117120255,IN +3117120256,3117120511,DE +3117120512,3117121535,IT +3117121536,3117122559,PL +3117122560,3117123583,CH +3117123584,3117124607,GB +3117124608,3117125631,FR +3117125632,3117126655,RU +3117126656,3117127679,US +3117127680,3117128703,BY +3117128704,3117129727,CZ +3117129728,3117130751,IR +3117130752,3117131775,ES +3117131776,3117132799,TR +3117132800,3117133823,IT +3117133824,3117135871,FR +3117135872,3117136895,GB +3117136896,3117137919,NL +3117137920,3117138943,IE +3117138944,3117139967,IR +3117139968,3117142015,DE +3117142016,3117143039,ES +3117143040,3117144063,GB +3117144064,3117145087,US +3117145088,3117147135,ES +3117147136,3117147391,GR +3117147392,3117148159,AE +3117148160,3117149183,DK +3117149184,3117150207,RU +3117150208,3117151231,NL +3117151232,3117152255,UA +3117152256,3117153279,RO +3117153280,3117154303,PL +3117154304,3117154559,RU +3117154560,3117154815,FI +3117154816,3117155327,RU +3117155328,3117156351,GB +3117156352,3117157375,SE +3117157376,3117158399,US +3117158400,3117159423,CZ +3117159424,3117160447,RU +3117160448,3117161471,UA +3117161472,3117162495,MD +3117162496,3117163519,AL +3117163520,3117164543,NL +3117164544,3117165567,FR +3117165568,3117166591,GB +3117166592,3117167615,LB +3117167616,3117168639,NL +3117168640,3117169663,MK +3117169664,3117172735,ES +3117172736,3117173759,TR +3117173760,3117174783,GB +3117174784,3117175807,SY +3117175808,3117176831,IT +3117176832,3117177855,SY +3117177856,3117178879,IE +3117178880,3117179903,DE +3117179904,3117180927,PT +3117180928,3117181951,FR +3117181952,3117182975,RU +3117182976,3117183999,DK +3117184000,3117185023,BY +3117185024,3117186047,FR +3117186048,3117187071,RU +3117187072,3117188095,DE +3117188096,3117189119,IT +3117189120,3117190143,IE +3117190144,3117191167,MD +3117191168,3117192191,SE +3117192192,3117193215,US +3117193216,3117194239,GB +3117194240,3117195263,RU +3117195264,3117196287,FR +3117196288,3117197311,BG +3117197312,3117198335,IR +3117198336,3117199359,FR +3117199360,3117200383,ES +3117200384,3117201407,IR +3117201408,3117202431,NL +3117202432,3117203455,FR +3117203456,3117204479,PL +3117204480,3117204991,NL +3117204992,3117205247,US +3117205248,3117205503,NL +3117205504,3117206527,ES +3117206528,3117208575,FR +3117208576,3117209599,GB +3117209600,3117210623,PL +3117210624,3117211647,IT +3117211648,3117212671,PL +3117212672,3117214719,TR +3117214720,3117215743,MD +3117215744,3117216767,DE +3117216768,3117217791,ES +3117217792,3117218815,DK +3117218816,3117219839,FR +3117219840,3117220863,FI +3117220864,3117221887,ES +3117221888,3117222911,IT +3117222912,3117223935,US +3117223936,3117224959,TR +3117224960,3117225983,NO +3117225984,3117227007,SA +3117227008,3117228031,GB +3117228032,3117229055,FR +3117229056,3117230079,GB +3117230080,3117231103,IT +3117231104,3117232127,UA +3117232128,3117233151,SE +3117233152,3117234175,NL +3117234176,3117235199,ES +3117235200,3117235455,LV +3117235456,3117235711,GB +3117235712,3117236223,LV +3117236224,3117237247,RU +3117237248,3117238271,NL +3117238272,3117239295,HU +3117239296,3117240319,CY +3117240320,3117241343,DE +3117241344,3117242367,PL +3117242368,3117243391,GE +3117243392,3117244415,TR +3117244416,3117245439,GR +3117245440,3117246463,TR +3117246464,3117247487,DE +3117247488,3117248511,CH +3117248512,3117249535,ES +3117249536,3117250559,SI +3117250560,3117251583,CH +3117251584,3117252607,US +3117252608,3117253631,RU +3117253632,3117254655,DE +3117254656,3117255679,CZ +3117255680,3117256703,IR +3117256704,3117257727,UA +3117257728,3117258751,ES +3117258752,3117259775,PL +3117259776,3117260799,DE +3117260800,3117261823,IE +3117261824,3117262847,IT +3117262848,3117263871,AL +3117263872,3117264895,GB +3117264896,3117265919,RO +3117265920,3117266943,GB +3117266944,3117267967,CY +3117267968,3117268223,ES +3117268224,3117268479,IE +3117268480,3117268735,FR +3117268736,3117268991,IE +3117268992,3117269503,US +3117269504,3117270015,DE +3117270016,3117271039,TR +3117271040,3117272063,RU +3117272064,3117273087,GB +3117273088,3117274111,BG +3117274112,3117276159,DE +3117276160,3117277183,IR +3117277184,3117278207,SE +3117278208,3117279231,IE +3117279232,3117280255,BE +3117280256,3117281279,RU +3117281280,3117282303,NL +3117282304,3117283327,US +3117283328,3117284351,HU +3117284352,3117285375,ES +3117285376,3117286399,CH +3117286400,3117287423,NO +3117287424,3117288447,IT +3117288448,3117289471,IE +3117289472,3117290495,GB +3117290496,3117291519,US +3117291776,3117292031,DE +3117292032,3117292287,FR +3117292288,3117292543,ES +3117292544,3117293567,SA +3117293568,3117294591,KZ +3117294592,3117295615,UA +3117295616,3117296639,GB +3117296640,3117297663,DE +3117297664,3117298687,NO +3117298688,3117299711,RO +3117299712,3117300735,DE +3117300736,3117301759,ES +3117301760,3117302783,GB +3117302784,3117303807,IR +3117303808,3117304831,MD +3117304832,3117305855,ES +3117305856,3117306879,RO +3117306880,3117307903,IT +3117307904,3117308927,DE +3117308928,3117309951,IR +3117309952,3117310975,KW +3117310976,3117311999,RU +3117312000,3117313023,NL +3117313024,3117314047,SE +3117314048,3117315071,PL +3117315072,3117316095,FR +3117316096,3117317119,RU +3117317120,3117318143,IQ +3117318144,3117319167,US +3117319168,3117320191,SA +3117320192,3117321215,FR +3117321216,3117322239,NL +3117322240,3117323263,BG +3117323264,3117324287,GB +3117324288,3117325311,DE +3117325312,3117326335,DK +3117326336,3117327359,DE +3117327360,3117328383,RU +3117328384,3117329407,NL +3117329408,3117330431,IQ +3117330432,3117331455,FI +3117331456,3117332479,DE +3117332480,3117333503,SI +3117333504,3117334527,DE +3117334528,3117335551,IE +3117335552,3117336575,DE +3117336576,3117337599,LB +3117337600,3117338623,RU +3117338624,3117339647,DE +3117339648,3117340671,NL +3117340672,3117341695,GB +3117341696,3117342719,TR +3117342720,3117342975,DK +3117342976,3117343231,NO +3117343232,3117344767,GB +3117344768,3117345791,NL +3117345792,3117346815,IR +3117346816,3117347839,US +3117347840,3117348863,CH +3117348864,3117349887,ES +3117349888,3117350911,IL +3117350912,3117351935,RU +3117351936,3117352959,IR +3117352960,3117353983,HU +3117353984,3117356031,DE +3117356032,3117357055,NL +3117357056,3117358079,RU +3117358080,3117359103,SA +3117359104,3117360127,LT +3117360128,3117361151,TR +3117361152,3117362175,ES +3117362176,3117363199,FR +3117363200,3117364223,GB +3117364224,3117365247,IR +3117365248,3117366271,TR +3117366272,3117367295,DE +3117367296,3117368319,RU +3117368320,3117369343,GB +3117369344,3117370367,IR +3117370368,3117371391,CH +3117371392,3117372415,FR +3117372416,3117373439,FI +3117373440,3117374463,RU +3117374464,3117375487,IE +3117375488,3117376511,TR +3117376512,3117378559,DE +3117378560,3117379583,GB +3117379584,3117380607,DE +3117380608,3117381631,CH +3117381632,3117383679,GB +3117383680,3117384703,GE +3117384704,3117385727,US +3117385728,3117386751,UA +3117386752,3117387775,GB +3117387776,3117388799,ES +3117388800,3117389823,PL +3117389824,3117390847,US +3117390848,3117391871,DE +3117391872,3117392895,CY +3117392896,3117393919,NL +3117393920,3117394943,CZ +3117394944,3117395967,ES +3117395968,3117396479,GB +3117396480,3117396735,US +3117396736,3117396991,TR +3117396992,3117398015,MD +3117398016,3117399039,UA +3117399040,3117400063,LT +3117400064,3117401087,NL +3117401088,3117402111,IR +3117402112,3117403135,GB +3117403136,3117404159,NL +3117404160,3117405183,DE +3117405184,3117406207,CH +3117406208,3117407231,DE +3117407232,3117408255,NL +3117408256,3117409279,IE +3117409280,3117410303,DE +3117410304,3117411327,BG +3117411328,3117412351,MD +3117412352,3117413375,UA +3117413376,3117414399,DE +3117414400,3117415423,US +3117415424,3117416447,RU +3117416448,3117417471,FR +3117417472,3117418495,IE +3117418496,3117419519,FR +3117419520,3117420543,AT +3117420544,3117421567,IT +3117421568,3117422591,ES +3117422592,3117423615,UA +3117423616,3117424639,CH +3117424640,3117426687,DE +3117426688,3117427711,FR +3117427712,3117428735,IT +3117428736,3117429759,BG +3117429760,3117430783,SE +3117430784,3117431807,NL +3117431808,3117432831,FR +3117432832,3117433855,ES +3117433856,3117434879,SE +3117434880,3117435903,RU +3117435904,3117436927,IR +3117436928,3117437951,DK +3117437952,3117438975,FR +3117438976,3117439999,GB +3117440000,3117441023,NO +3117441024,3117442047,TJ +3117442048,3117443071,TR +3117443072,3117444095,IT +3117444096,3117445119,CY +3117445120,3117446143,EE +3117446144,3117447167,FR +3117447168,3117448191,CH +3117448192,3117449215,NL +3117449216,3117450239,MD +3117450240,3117451263,AT +3117451264,3117452287,IT +3117452288,3117453311,FR +3117453312,3117454335,ES +3117454336,3117455359,IR +3117455360,3117456383,CZ +3117456384,3117457407,BG +3117457408,3117458431,DE +3117458432,3117459455,PL +3117459456,3117459711,US +3117459712,3117460479,GB +3117460480,3117461503,IR +3117461504,3117462527,UZ +3117462528,3117463551,IR +3117463552,3117464575,ES +3117464576,3117465599,IT +3117465600,3117466623,RU +3117466624,3117467647,IL +3117467648,3117468671,RU +3117468672,3117469695,US +3117469696,3117470719,NL +3117470720,3117471743,DK +3117471744,3117473791,ES +3117473792,3117474815,HU +3117474816,3117475839,UA +3117475840,3117476863,IT +3117476864,3117477887,US +3117477888,3117478911,GB +3117478912,3117479935,IT +3117479936,3117480959,MD +3117480960,3117481983,CH +3117481984,3117483007,LV +3117483008,3117484031,DE +3117484032,3117485055,ES +3117485056,3117486079,RU +3117486080,3117487103,FR +3117487104,3117488127,NL +3117488128,3117489151,CZ +3117489152,3117490175,RU +3117490176,3117491199,SY +3117491200,3117492223,ES +3117492224,3117493247,GB +3117493248,3117494271,RU +3117494272,3117495295,SA +3117495296,3117496319,FR +3117496320,3117497343,UA +3117497344,3117498367,ES +3117498368,3117499391,DE +3117499392,3117500415,PL +3117500416,3117502463,ES +3117502464,3117503999,RU +3117504000,3117504511,DE +3117504512,3117505535,RU +3117505536,3117506559,IE +3117506560,3117507583,EE +3117507584,3117508607,ES +3117508608,3117509631,DE +3117509632,3117510655,PS +3117510656,3117511679,RU +3117511680,3117512703,DE +3117512704,3117513727,ES +3117513728,3117514751,DE +3117514752,3117515775,US +3117515776,3117516799,DE +3117516800,3117517823,LT +3117517824,3117518847,FR +3117518848,3117519871,DE +3117519872,3117520895,NL +3117520896,3117521919,GB +3117521920,3117522943,DE +3117522944,3117523199,RU +3117523200,3117523967,US +3117523968,3117524991,GB +3117524992,3117526015,CH +3117526016,3117527039,AT +3117527040,3117528063,UA +3117528064,3117530111,FR +3117530112,3117531135,IR +3117531136,3117532159,ES +3117532160,3117533183,SE +3117533184,3117534207,SY +3117534208,3117535231,AT +3117535232,3117536255,FR +3117536256,3117537279,CH +3117537280,3117538303,GB +3117538304,3117539327,US +3117539328,3117540351,UA +3117540352,3117541375,US +3117541376,3117542399,BG +3117542400,3117543423,DE +3117543424,3117544447,PT +3117544448,3117545471,DE +3117545472,3117546495,PL +3117546496,3117547519,US +3117547520,3117548543,CH +3117548544,3117549567,NO +3117549568,3117550591,DE +3117550592,3117551615,AT +3117551616,3117553663,ES +3117553664,3117554687,NL +3117554688,3117555711,GB +3117555712,3117556735,CH +3117556736,3117557759,PL +3117557760,3117558783,US +3117558784,3117559807,RU +3117559808,3117560831,IT +3117560832,3117561855,DE +3117561856,3117562879,RU +3117562880,3117563903,ES +3117563904,3117565951,CH +3117565952,3117566975,ES +3117566976,3117567999,TR +3117568000,3117569023,DE +3117569024,3117570047,UA +3117570048,3117571071,ES +3117571072,3117572095,TR +3117572096,3117573119,CH +3117573120,3117574143,DE +3117574144,3117575167,GB +3117575168,3117576191,FR +3117576192,3117577215,IT +3117577216,3117578239,GB +3117578240,3117579263,NL +3117579264,3117580287,PL +3117580288,3117581311,NL +3117581312,3117582335,DK +3117582336,3117583359,US +3117583360,3117584383,RU +3117584384,3117585407,US +3117585408,3117586431,AT +3117586432,3117587455,ES +3117587456,3117589503,RU +3117589504,3117590527,CZ +3117590528,3117591551,GB +3117591552,3117592575,IT +3117592576,3117593599,DK +3117593600,3117594623,BA +3117594624,3117595647,ES +3117595648,3117596671,DE +3117596672,3117597695,ES +3117597696,3117598719,GB +3117598720,3117599743,IR +3117599744,3117600767,FR +3117600768,3117601791,DE +3117601792,3117602815,IE +3117602816,3117603071,RO +3117603072,3117603327,BE +3117603328,3117603583,RO +3117603584,3117603839,AT +3117603840,3117604863,SE +3117604864,3117605119,AT +3117605120,3117605631,ES +3117605632,3117605887,AT +3117605888,3117606911,GB +3117606912,3117607935,ES +3117607936,3117608959,DK +3117608960,3117609983,RU +3117609984,3117611007,ES +3117611008,3117612031,IT +3117612032,3117613055,TR +3117613056,3117614079,RU +3117614080,3117615103,US +3117615104,3117616127,ES +3117616128,3117617151,IT +3117617152,3117618175,DE +3117618176,3117619199,GB +3117619200,3117620223,FR +3117620224,3117621247,PL +3117621248,3117622271,US +3117622272,3117623295,SK +3117623296,3117624319,HU +3117624320,3117625599,GB +3117625600,3117626111,US +3117626112,3117626367,GB +3117626368,3117627391,NO +3117627392,3117628415,IR +3117628416,3117629439,DE +3117629440,3117630463,RS +3117630464,3117631487,ES +3117631488,3117632511,NO +3117632512,3117634559,IT +3117634560,3117636607,IR +3117636608,3117637631,CH +3117637632,3117638655,LV +3117638656,3117639679,DE +3117639680,3117640703,KW +3117640704,3117641727,CZ +3117641728,3117642751,RU +3117642752,3117643007,ES +3117643008,3117643263,IE +3117643264,3117643519,FR +3117643520,3117643775,IE +3117643776,3117644799,US +3117644800,3117645823,DE +3117645824,3117646847,UZ +3117646848,3117647871,DE +3117647872,3117648895,SE +3117648896,3117649919,GB +3117649920,3117650943,US +3117650944,3117651967,DE +3117651968,3117652991,US +3117652992,3117654015,RU +3117654016,3117655039,IT +3117655040,3117656063,RU +3117656064,3117659135,GB +3117659136,3117660159,ES +3117660160,3117661183,NL +3117661184,3117663231,CZ +3117663232,3117664255,ES +3117664256,3117665279,BG +3117665280,3117666303,DK +3117666304,3117667327,NL +3117667328,3117668351,ES +3117668352,3117669375,AT +3117669376,3117670399,DE +3117670400,3117671423,RU +3117671424,3117672447,KG +3117672448,3117673471,LU +3117673472,3117674495,DE +3117674496,3117676543,RU +3117676544,3117677567,NL +3117677568,3117678591,IE +3117678592,3117679615,RU +3117679616,3117680639,NL +3117680640,3117681663,MD +3117681664,3117682687,CZ +3117682688,3117683711,IT +3117683712,3117684735,FR +3117684736,3117685759,SE +3117685760,3117686783,RU +3117686784,3117687807,NL +3117687808,3117688831,DE +3117688832,3117689855,PL +3117689856,3117690879,DE +3117690880,3117691903,IR +3117691904,3117692927,DE +3117692928,3117693951,GB +3117693952,3117694975,IR +3117694976,3117695999,PL +3117696000,3117697023,GB +3117697024,3117698047,FR +3117698048,3117699071,DE +3117699072,3117700095,GB +3117700096,3117701119,ES +3117701120,3117702143,RU +3117702144,3117703167,DE +3117703168,3117704191,FR +3117704192,3117705215,AT +3117705216,3117706239,DE +3117706240,3117707263,BA +3117707264,3117709311,RU +3117709312,3117710335,IR +3117710336,3117711359,ES +3117711360,3117712383,NL +3117712384,3117713407,PL +3117713408,3117714431,ES +3117714432,3117715455,MD +3117715456,3117716479,GB +3117716480,3117716735,RU +3117716736,3117716991,FI +3117716992,3117717503,RU +3117717504,3117718527,IT +3117718528,3117719551,GB +3117719552,3117720575,FR +3117720576,3117721599,PL +3117721600,3117721855,GB +3117721856,3117722111,DK +3117722112,3117722367,CH +3117722368,3117722623,NL +3117722624,3117723647,TR +3117723648,3117724671,IE +3117724672,3117725695,GR +3117725696,3117726719,IE +3117726720,3117727743,AL +3117727744,3117728767,IR +3117728768,3117729791,DE +3117729792,3117730815,NL +3117730816,3117731839,ES +3117731840,3117732863,DK +3117732864,3117733887,FR +3117733888,3117734911,GB +3117734912,3117735935,LB +3117735936,3117736959,FR +3117736960,3117737983,IE +3117737984,3117739007,NL +3117739008,3117743103,UA +3117743104,3117744127,GE +3117744128,3117745151,RU +3117745152,3117746175,IT +3117746176,3117747199,IR +3117747200,3117748223,NL +3117748224,3117749247,US +3117749248,3117749503,IT +3117749504,3117750271,CA +3117750272,3117751295,NL +3117751296,3117752319,RU +3117752320,3117753343,DE +3117753344,3117754367,PL +3117754368,3117755391,UA +3117755392,3117756415,GB +3117756416,3117757439,ES +3117757440,3117758463,NO +3117758464,3117759487,CH +3117759488,3117760511,HK +3117760512,3117762559,NL +3117762560,3117763583,MD +3117763584,3117764607,DE +3117764608,3117765631,US +3117765632,3117766655,ES +3117766656,3117767679,NL +3117767680,3117768703,GB +3117768704,3117769727,DE +3117769728,3117771775,NL +3117771776,3117772799,ES +3117772800,3117773823,IT +3117773824,3117775871,GB +3117775872,3117776895,NO +3117776896,3117777919,DE +3117777920,3117778943,IE +3117778944,3117779967,RU +3117779968,3117780991,US +3117780992,3117782015,SK +3117782016,3117783039,GB +3117783040,3117784063,SE +3117784064,3117785087,RU +3117785088,3117786111,FR +3117786112,3117787135,IR +3117787136,3117788159,TR +3117788160,3117788927,NL +3117788928,3117789183,DE +3117789184,3117790207,UA +3117790208,3117791231,LB +3117791232,3117792255,LU +3117792256,3117794303,DE +3117794304,3117795327,ES +3117795328,3117796351,LV +3117796352,3117797375,CH +3117797376,3117798399,NL +3117798400,3117799423,RU +3117799424,3117800447,IT +3117800448,3117801471,IE +3117801472,3117802495,FI +3117802496,3117803519,RU +3117803520,3117804543,UA +3117804544,3117805567,DE +3117805568,3117806591,HR +3117806592,3117807615,GB +3117807616,3117808639,NO +3117808640,3117809663,IL +3117809664,3117810687,IT +3117810688,3117811711,NL +3117811712,3117811967,FR +3117811968,3117812223,IE +3117812224,3117812735,CN +3117812736,3117813759,ES +3117813760,3117814783,NO +3117814784,3117816831,NL +3117816832,3117817855,HU +3117817856,3117818879,PT +3117818880,3117819903,IR +3117819904,3117820927,RO +3117820928,3117821951,IT +3117821952,3117822975,GB +3117822976,3117823999,FR +3117824000,3117826047,RU +3117826048,3117827071,DE +3117827072,3117827327,AT +3117827328,3117827583,GB +3117827584,3117828095,AT +3117828096,3117829119,NL +3117829120,3117830143,RU +3117830144,3117832191,ES +3117832192,3117833215,NL +3117833216,3117834239,HR +3117834240,3117835263,US +3117835264,3117836287,ES +3117836288,3117837311,RO +3117837312,3117838335,ES +3117838336,3117839359,NL +3117839360,3117840383,CZ +3117840384,3117842431,DE +3117842432,3117843455,NL +3117843456,3117844479,US +3117844480,3117845503,ES +3117845504,3117846015,GB +3117846016,3117846527,US +3117846528,3117847551,ES +3117847552,3117848575,NL +3117848576,3117849599,CH +3117849600,3117850623,FI +3117850624,3117851647,RU +3117851648,3117852671,RS +3117852672,3117853695,ES +3117853696,3117853951,HU +3117853952,3117854335,CZ +3117854336,3117854463,HR +3117854464,3117854591,SI +3117854592,3117854719,AT +3117854720,3117855743,ES +3117855744,3117856767,GB +3117856768,3117857791,RU +3117857792,3117858815,TR +3117858816,3117859839,SK +3117859840,3117860863,UA +3117860864,3117861887,IT +3117861888,3117862911,ES +3117862912,3117863935,FR +3117863936,3117864447,NL +3117864448,3117864959,ES +3117864960,3117865983,FR +3117865984,3117867007,GB +3117867008,3117868031,FR +3117868032,3117871103,DE +3117871104,3117872127,US +3117872128,3117875199,RU +3117875200,3117876223,ES +3117876224,3117877247,DK +3117877248,3117878271,SE +3117879296,3117880319,DE +3117880320,3117881343,CZ +3117881344,3117882367,FR +3117882368,3117883391,AT +3117883392,3117884415,NO +3117884416,3117885439,GB +3117885440,3117886463,NL +3117886464,3117887487,TR +3117887488,3117888511,LV +3117888512,3117889535,AM +3117889536,3117890559,DE +3117890560,3117891583,RU +3117891584,3117892607,FR +3117892608,3117893631,LU +3117893632,3117894655,PL +3117894656,3117896703,DE +3117896704,3117897727,ES +3117897728,3117898751,BA +3117898752,3117899775,DK +3117899776,3117900799,NL +3117900800,3117901823,DE +3117901824,3117902847,ES +3117902848,3117903871,IE +3117903872,3117904895,PT +3117904896,3117905919,IE +3117905920,3117906943,CH +3117906944,3117907967,IR +3117907968,3117908991,GB +3117908992,3117910015,ES +3117910016,3117911039,FR +3117911040,3117913087,IT +3117913088,3117914111,NL +3117914112,3117915135,IR +3117915136,3117916159,DE +3117916160,3117917183,KZ +3117917184,3117918207,US +3117918208,3117919231,FR +3117919232,3117920255,IT +3117920256,3117921279,RU +3117921280,3117922303,US +3117922304,3117923327,EE +3117923328,3117924351,DE +3117924352,3117925375,IT +3117925376,3117926399,SE +3117926400,3117927423,AT +3117927424,3117929471,DE +3117929472,3117929727,GB +3117929728,3117930239,DE +3117930240,3117930495,TW +3117930496,3117931519,AT +3117931520,3117933567,US +3117933568,3117936639,IR +3117936640,3117937663,IT +3117937664,3117938687,IR +3117938688,3117939711,DK +3117939712,3117940735,NL +3117940736,3117941759,CN +3117941760,3117942783,CY +3117942784,3117943807,IQ +3117943808,3117945855,RU +3117945856,3117946879,SK +3117946880,3117947903,FR +3117947904,3117949055,ES +3117949056,3117949183,BG +3117949184,3117949439,DE +3117949440,3117949695,AT +3117949696,3117949951,CZ +3117949952,3117950975,FR +3117950976,3117951999,SA +3117952000,3117953023,EE +3117953024,3117954047,GB +3117954048,3117955071,NL +3117955072,3117956095,ES +3117956096,3117957119,RU +3117957120,3117958143,IT +3117958144,3117959167,DE +3117959168,3117960191,US +3117960192,3117961215,GB +3117961216,3117962239,RU +3117962240,3117963263,DE +3117963264,3117964287,IT +3117964288,3117965311,FR +3117965312,3117966335,GB +3117966336,3117967359,RU +3117967360,3117969407,GB +3117969408,3117970431,TR +3117970432,3117972479,DE +3117972480,3117973503,IR +3117973504,3117974527,ES +3117974528,3117975551,SY +3117975552,3117976575,RO +3117976576,3117977599,NL +3117977600,3117978623,GB +3117978624,3117979647,FR +3117979648,3117980671,SE +3117980672,3117981695,DK +3117981696,3117982719,NL +3117982720,3117983743,SK +3117983744,3117984767,ES +3117984768,3117985791,PL +3117985792,3117986815,AT +3117986816,3117987839,PL +3117987840,3117988863,IT +3117988864,3117989887,RO +3117989888,3117990911,RU +3117990912,3117991935,SY +3117991936,3117992959,US +3117992960,3117993983,RU +3117993984,3117995007,LT +3117995008,3117996031,DE +3117996032,3117997055,ES +3117997056,3117998079,CZ +3117998080,3117999103,DE +3117999104,3117999871,US +3117999872,3118002175,DE +3118002176,3118003199,FR +3118003200,3118004223,RU +3118004224,3118005247,NL +3118005248,3118006271,ES +3118006272,3118007295,SE +3118007296,3118008319,AX +3118008320,3118009343,SA +3118009344,3118010367,ES +3118010368,3118011391,KZ +3118011392,3118012415,IE +3118012416,3118013439,US +3118013440,3118014463,IT +3118014464,3118016511,NL +3118016512,3118017535,GB +3118017536,3118018559,DE +3118018560,3118019583,GB +3118019584,3118020607,DE +3118020608,3118021631,GB +3118021632,3118022655,NL +3118022656,3118023679,UA +3118023680,3118023935,RO +3118023936,3118024191,US +3118024192,3118024447,SG +3118024448,3118024703,IT +3118024704,3118025727,HU +3118025728,3118026751,IQ +3118026752,3118027775,DE +3118027776,3118028799,LB +3118028800,3118029823,IQ +3118029824,3118030847,NL +3118030848,3118031871,IL +3118031872,3118032895,SA +3118032896,3118033919,GB +3118033920,3118034943,IR +3118034944,3118035967,ES +3118035968,3118036735,GB +3118036736,3118037759,CN +3118037760,3118038015,GB +3118038016,3118039039,US +3118039040,3118041087,GB +3118041088,3118042111,PL +3118042112,3118043135,NL +3118043136,3118044159,DE +3118044160,3118045183,US +3118045184,3118046207,FR +3118046208,3118047231,GB +3118047232,3118048255,IR +3118048256,3118049279,NL +3118049280,3118050303,DE +3118050304,3118051327,SY +3118051328,3118052351,DE +3118052352,3118053375,KZ +3118053376,3118054399,LB +3118054400,3118055423,KZ +3118055424,3118056447,DE +3118056448,3118057471,RU +3118057472,3118058495,FR +3118058496,3118059519,ES +3118059520,3118060543,NL +3118060544,3118061567,PL +3118061568,3118062591,IE +3118062592,3118063615,ES +3118063616,3118064639,SE +3118064640,3118065663,GB +3118065664,3118066687,CZ +3118066688,3118067711,FI +3118067712,3118068735,BG +3118068736,3118069759,FR +3118069760,3118072831,DE +3118072832,3118073855,GB +3118073856,3118074879,RU +3118074880,3118075903,PT +3118075904,3118077951,ES +3118077952,3118078975,SE +3118078976,3118079999,SK +3118080000,3118081023,FR +3118081024,3118082047,NL +3118082048,3118083071,DK +3118083072,3118084095,IT +3118084096,3118085119,CH +3118085120,3118086143,US +3118086144,3118088191,DE +3118088192,3118089215,BG +3118089216,3118090239,RU +3118090240,3118091263,NL +3118091264,3118092287,AT +3118092288,3118093311,DK +3118093312,3118094335,DE +3118094336,3118095359,FI +3118095360,3118096383,CZ +3118096384,3118098431,ES +3118098432,3118099455,IT +3118099456,3118100479,RU +3118100480,3118101503,IE +3118101504,3118102271,CH +3118102272,3118102287,DE +3118102288,3118102527,CH +3118102528,3118103551,GB +3118103552,3118104575,US +3118104576,3118107647,DE +3118107648,3118108671,CH +3118108672,3118109695,FR +3118109696,3118110719,US +3118110720,3118111743,FR +3118111744,3118112767,PL +3118112768,3118113791,ES +3118113792,3118114815,NL +3118114816,3118115839,DE +3118115840,3118116863,FR +3118116864,3118118911,RU +3118118912,3118119935,DE +3118119936,3118120959,ES +3118120960,3118121983,FI +3118121984,3118123007,PT +3118123008,3118124031,UA +3118124032,3118125055,NL +3118125056,3118127103,FR +3118127104,3118128127,TR +3118128128,3118129151,DE +3118129152,3118130175,NL +3118130176,3118131199,DK +3118131200,3118132223,US +3118132224,3118133247,ES +3118133248,3118134271,CH +3118134272,3118135295,TR +3118135296,3118136319,FR +3118136320,3118137343,ES +3118137344,3118138367,IT +3118138368,3118139391,RU +3118139392,3118140415,ES +3118140416,3118141439,FR +3118141440,3118142463,CZ +3118142464,3118143487,US +3118143488,3118144511,ES +3118144512,3118145535,NL +3118145536,3118146559,IE +3118146560,3118147583,PL +3118147584,3118148607,RU +3118148608,3118149631,IT +3118149632,3118150655,HU +3118150656,3118151679,IQ +3118151680,3118152703,ES +3118152704,3118153727,CZ +3118153728,3118154751,GB +3118154752,3118155775,BG +3118155776,3118156799,GB +3118156800,3118157823,UA +3118157824,3118158847,NL +3118158848,3118159871,IT +3118159872,3118160895,DE +3118160896,3118161919,GB +3118161920,3118162943,BE +3118162944,3118166015,GB +3118166016,3118167039,DE +3118167040,3118168063,IT +3118168064,3118169087,ES +3118169088,3118170111,DE +3118170112,3118171135,PT +3118171136,3118172159,TR +3118172160,3118173183,ES +3118173184,3118174207,US +3118174208,3118175231,GB +3118175232,3118176255,IS +3118176256,3118177279,DE +3118177280,3118178303,RU +3118178304,3118179327,NO +3118179328,3118181375,CZ +3118181376,3118182399,FR +3118182400,3118183423,TR +3118183424,3118184447,IT +3118184448,3118185471,LB +3118185472,3118186495,SE +3118186496,3118187519,NL +3118187520,3118188543,DE +3118188544,3118189567,PL +3118189568,3118190591,FR +3118190592,3118191615,DE +3118191616,3118192639,FR +3118192640,3118193663,ES +3118193664,3118194687,DE +3118194688,3118195711,IT +3118195712,3118196735,FR +3118196736,3118197759,IT +3118197760,3118198783,GB +3118198784,3118199807,FR +3118199808,3118200831,DE +3118200832,3118201855,CH +3118201856,3118203903,DE +3118203904,3118204927,FR +3118204928,3118205951,ES +3118205952,3118206975,GB +3118206976,3118207999,GR +3118208000,3118209023,US +3118209024,3118210047,HR +3118210048,3118211071,CZ +3118211072,3118214143,RU +3118214144,3118215167,ES +3118215168,3118217215,IT +3118217216,3118218239,NL +3118218240,3118219263,GB +3118219264,3118220287,PL +3118220288,3118220543,SG +3118220544,3118220799,US +3118220800,3118221055,DE +3118221056,3118221311,IT +3118221312,3118222335,FR +3118222336,3118223359,FI +3118223360,3118224383,US +3118224384,3118225407,ES +3118225408,3118226431,GB +3118226432,3118227455,LV +3118227456,3118229503,DE +3118229504,3118231551,NL +3118231552,3118232575,IQ +3118232576,3118233599,LV +3118233600,3118234623,SK +3118234624,3118235647,LB +3118235648,3118236671,RS +3118236672,3118237695,EE +3118237696,3118238719,LB +3118238720,3118239743,GB +3118239744,3118240767,UA +3118240768,3118241791,DE +3118241792,3118242815,TR +3118242816,3118243839,CH +3118243840,3118244863,GB +3118244864,3118245887,ES +3118245888,3118246911,SY +3118246912,3118247935,NL +3118247936,3118248959,GB +3118248960,3118249983,AZ +3118249984,3118251007,RO +3118251008,3118252031,HU +3118252032,3118253055,DE +3118253056,3118254079,LV +3118254080,3118255103,DE +3118255104,3118256127,IL +3118256128,3118257151,NO +3118257152,3118258175,NL +3118258176,3118259199,IR +3118259200,3118260223,CZ +3118260224,3118261247,IR +3118261248,3118262271,DE +3118262272,3118263295,AT +3118263296,3118264319,IR +3118264320,3118265343,ES +3118265344,3118266367,CH +3118266368,3118267391,ES +3118267392,3118268415,MD +3118268416,3118269439,NO +3118269440,3118270463,GB +3118270464,3118271487,ES +3118271488,3118272511,IT +3118272512,3118275583,ES +3118275584,3118276607,DK +3118276608,3118277631,BG +3118277632,3118278655,DK +3118278656,3118279679,CH +3118279680,3118280703,RU +3118280704,3118281727,DE +3118281728,3118282751,NO +3118282752,3118283775,SI +3118283776,3118284799,IS +3118284800,3118285823,DE +3118285824,3118286079,AU +3118286080,3118286335,SG +3118286336,3118286847,DE +3118286848,3118287871,IT +3118287872,3118288895,IR +3118288896,3118289919,PL +3118289920,3118290943,DE +3118290944,3118291967,FR +3118291968,3118294015,GB +3118294016,3118295039,DK +3118295040,3118296063,DE +3118296064,3118297087,PL +3118297088,3118298111,IR +3118298112,3118300159,RU +3118300160,3118301183,CZ +3118301184,3118302207,ES +3118302208,3118302719,US +3118302720,3118304255,DE +3118304256,3118305279,HU +3118305280,3118306303,GB +3118306304,3118307327,DE +3118307328,3118308351,RU +3118308352,3118309375,NL +3118309376,3118311423,RU +3118311424,3118312447,DE +3118312448,3118313471,IT +3118313472,3118314495,IS +3118314496,3118315519,UA +3118315520,3118316543,NL +3118316544,3118317567,ES +3118317568,3118318591,IR +3118318592,3118319615,RU +3118319616,3118320639,NL +3118320640,3118321663,GB +3118321664,3118322687,DE +3118322688,3118323711,RU +3118323712,3118324735,GB +3118324736,3118325759,RO +3118325760,3118327807,FR +3118327808,3118328831,IS +3118328832,3118329855,FR +3118329856,3118330879,IT +3118330880,3118331903,DK +3118331904,3118332927,NL +3118332928,3118333951,AL +3118333952,3118334975,AT +3118334976,3118335999,PL +3118336000,3118337023,PT +3118337024,3118338047,CH +3118338048,3118339071,GB +3118339072,3118340095,NL +3118340096,3118341119,GB +3118341120,3118342143,ES +3118342144,3118343167,CH +3118343168,3118344191,US +3118344192,3118345215,NL +3118345216,3118346239,AT +3118346240,3118347263,LB +3118347264,3118348287,RU +3118348288,3118349311,NL +3118349312,3118350335,FR +3118350336,3118351359,DE +3118351360,3118352383,IT +3118352384,3118353407,RS +3118353408,3118354431,MT +3118354432,3118355455,NL +3118355456,3118356479,NO +3118356480,3118357503,FR +3118357504,3118358527,AZ +3118358528,3118359551,BG +3118359552,3118360575,NL +3118360576,3118361599,RU +3118361600,3118362623,NL +3118362624,3118363647,GB +3118363648,3118364671,CH +3118364672,3118365695,IR +3118365696,3118366719,DE +3118366720,3118367743,MD +3118367744,3118368767,US +3118368768,3118369791,DE +3118369792,3118370815,NL +3118370816,3118371839,FR +3118371840,3118372863,ES +3118372864,3118373887,RU +3118373888,3118374911,ES +3118374912,3118375935,DE +3118375936,3118376959,ES +3118376960,3118377983,GB +3118377984,3118379007,US +3118379008,3118380031,SE +3118380032,3118382079,IR +3118382080,3118383103,ES +3118383104,3118384127,FR +3118384128,3118385151,PT +3118385152,3118386175,UA +3118386176,3118387199,DE +3118387200,3118388223,GB +3118388224,3118389247,FR +3118389248,3118390271,GB +3118390272,3118391295,MD +3118391296,3118394367,NL +3118394368,3118395391,RU +3118395392,3118396415,DE +3118396416,3118397439,ES +3118397440,3118398463,IT +3118398464,3118399487,GE +3118399488,3118400511,IL +3118400512,3118401535,HU +3118401536,3118402559,GB +3118402560,3118403583,DK +3118403584,3118404607,HU +3118404608,3118405631,AT +3118405632,3118406655,DK +3118406656,3118407679,DE +3118407680,3118409727,NL +3118409728,3118410751,US +3118410752,3118411775,AE +3118411776,3118412799,NL +3118412800,3118413823,LB +3118413824,3118414847,RO +3118414848,3118415871,ES +3118415872,3118416895,DE +3118416896,3118417919,GB +3118417920,3118418943,FR +3118418944,3118420991,ES +3118420992,3118422015,NL +3118422016,3118423039,GB +3118423040,3118423807,US +3118423808,3118424063,NL +3118424064,3118425087,ES +3118425088,3118426111,NO +3118426112,3118428159,DE +3118428160,3118429183,UA +3118429184,3118430207,RU +3118430208,3118431231,ES +3118431232,3118432255,AM +3118432256,3118434303,NL +3118434304,3118435327,ES +3118435328,3118436351,NL +3118436352,3118437375,DE +3118437376,3118438399,FR +3118438400,3118439423,ES +3118439424,3118440447,FR +3118440448,3118442495,RU +3118442496,3118443519,MD +3118443520,3118444543,GB +3118444544,3118445567,UA +3118445568,3118446591,FR +3118446592,3118447615,GB +3118447616,3118448639,UA +3118448640,3118449663,GB +3118449664,3118451711,IT +3118451712,3118452735,RU +3118452736,3118453759,IT +3118453760,3118454783,RU +3118454784,3118456831,ES +3118456832,3118457855,BE +3118457856,3118458879,FR +3118458880,3118459903,GB +3118459904,3118460927,SE +3118460928,3118461951,ES +3118461952,3118462975,UA +3118462976,3118463999,RU +3118464000,3118464511,US +3118464512,3118465023,DE +3118465024,3118466047,TR +3118466048,3118467071,HU +3118467072,3118468095,RU +3118468096,3118469119,GB +3118469120,3118470143,DK +3118470144,3118471167,IE +3118471168,3118472191,AT +3118472192,3118473215,GB +3118473216,3118474239,FR +3118474240,3118475263,ES +3118475264,3118476287,CH +3118476288,3118477311,HU +3118477312,3118478335,ES +3118478336,3118479359,NL +3118479360,3118480383,SE +3118480384,3118481407,UA +3118481408,3118482431,RO +3118482432,3118483455,GB +3118483456,3118484479,FI +3118484480,3118485503,ES +3118485504,3118486527,NL +3118486528,3118487551,MD +3118487552,3118488575,NL +3118488576,3118489599,ES +3118489600,3118490623,RU +3118490624,3118491647,AL +3118491648,3118492671,UA +3118492672,3118493695,NL +3118493696,3118494719,CZ +3118494720,3118495743,DE +3118495744,3118496767,AT +3118496768,3118497791,SY +3118497792,3118500863,NL +3118500864,3118502911,US +3118502912,3118504959,DE +3118504960,3118505983,FI +3118505984,3118507007,BG +3118507008,3118508031,PT +3118508032,3118509055,NL +3118509056,3118510079,FR +3118510080,3118511103,IR +3118511104,3118512127,CH +3118512128,3118513151,ES +3118513152,3118514175,GB +3118514176,3118515199,ES +3118515200,3118516223,GB +3118516224,3118517247,AT +3118517248,3118518271,IR +3118518272,3118519295,GB +3118519296,3118520319,KZ +3118520320,3118521343,NL +3118521344,3118522367,ES +3118522368,3118523391,US +3118523392,3118524415,RU +3118524416,3118525439,GB +3118525440,3118526463,NL +3118526464,3118527487,DE +3118527488,3118528511,CH +3118528512,3118529535,RU +3118529536,3118530559,GB +3118530560,3118531583,ES +3118531584,3118532607,IT +3118532608,3118533631,RU +3118533632,3118533887,HK +3118533888,3118534143,GB +3118534144,3118534655,US +3118534656,3118535679,RO +3118535680,3118536703,ES +3118536704,3118537727,RU +3118537728,3118538751,MK +3118538752,3118539775,RU +3118539776,3118540799,TR +3118540800,3118541823,SY +3118541824,3118542847,NL +3118542848,3118544895,SE +3118544896,3118545919,SA +3118545920,3118546943,IT +3118546944,3118547967,FR +3118547968,3118548991,HU +3118548992,3118550015,DE +3118550016,3118551039,RO +3118551040,3118552063,IR +3118552064,3118553087,BG +3118553088,3118554111,AT +3118554112,3118555135,CH +3118555136,3118556159,AT +3118556160,3118557183,PL +3118557184,3118557247,RO +3118557248,3118557311,GB +3118557312,3118557439,RO +3118557440,3118557471,FI +3118557472,3118557487,ES +3118557488,3118557503,IT +3118557504,3118557519,GR +3118557520,3118557535,CH +3118557536,3118557551,SE +3118557552,3118557567,RU +3118557568,3118558015,RO +3118558016,3118558079,NL +3118558080,3118558207,RO +3118558208,3118559231,PL +3118559232,3118560255,NL +3118560256,3118561279,PS +3118561280,3118562303,FI +3118562304,3118563327,RU +3118563328,3118564351,MD +3118564352,3118567423,DE +3118567424,3118568447,MD +3118568448,3118569471,ES +3118569472,3118570495,RU +3118570496,3118571519,GB +3118571520,3118572543,BE +3118572544,3118573567,TR +3118573568,3118574591,ES +3118574592,3118575615,IL +3118575616,3118576639,RU +3118576640,3118577663,IR +3118577664,3118578687,FR +3118578688,3118579711,RU +3118579712,3118580735,AE +3118580736,3118582783,RU +3118582784,3118583807,GB +3118583808,3118584831,DE +3118584832,3118585855,UA +3118585856,3118586879,IT +3118586880,3118587903,NL +3118587904,3118588927,SE +3118588928,3118589951,PL +3118589952,3118590975,DE +3118590976,3118591999,BG +3118592000,3118593023,IR +3118593024,3118594047,ES +3118594048,3118595071,PL +3118595072,3118596095,GB +3118596096,3118597119,MK +3118597120,3118598143,SE +3118598144,3118599167,ES +3118599168,3118600191,MD +3118600192,3118601215,FR +3118601216,3118602239,LU +3118602240,3118603263,UA +3118603264,3118604287,ES +3118604288,3118604543,FR +3118604544,3118604799,CF +3118604800,3118605311,FR +3118605312,3118606335,UA +3118606336,3118607359,AT +3118607360,3118608383,PL +3118608384,3118609407,FR +3118609408,3118610431,RU +3118610432,3118611455,SE +3118611456,3118612479,PL +3118612480,3118613503,GR +3118613504,3118614527,RO +3118614528,3118614783,DE +3118614784,3118615039,BG +3118615040,3118615295,GB +3118615296,3118615551,BG +3118615552,3118616575,NL +3118616576,3118617599,RO +3118617600,3118618623,UA +3118618624,3118619647,AL +3118619648,3118619903,TR +3118619904,3118620159,US +3118620160,3118620671,TR +3118620672,3118621695,RU +3118621696,3118622719,NO +3118622720,3118623743,ES +3118623744,3118624767,NL +3118624768,3118625791,UA +3118625792,3118626815,IR +3118626816,3118627839,DE +3118627840,3118628863,OM +3118628864,3118629887,RU +3118629888,3118630911,IR +3118630912,3118631935,NL +3118631936,3118632959,IR +3118632960,3118633983,DE +3118633984,3118635007,NO +3118635008,3118636031,ES +3118636032,3118637055,GB +3118637056,3118638079,TR +3118638080,3118639103,RU +3118639104,3118640127,ES +3118640128,3118641151,DE +3118641152,3118643199,ES +3118643200,3118644223,DE +3118644224,3118646271,ES +3118646272,3118647295,TR +3118647296,3118648319,NO +3118648320,3118649343,NL +3118649344,3118650367,GB +3118650368,3118651391,DE +3118651392,3118652415,IE +3118652416,3118653439,GB +3118653440,3118657535,ES +3118657536,3118658559,DE +3118658560,3118659583,RU +3118659584,3118660607,PL +3118660608,3118661631,MD +3118661632,3118662655,FR +3118662656,3118663679,NO +3118663680,3118664703,ES +3118664704,3118665727,DE +3118665728,3118666751,FR +3118666752,3118667775,CH +3118667776,3118668799,SE +3118668800,3118669823,IT +3118669824,3118670847,ES +3118670848,3118671871,RU +3118671872,3118672895,RO +3118672896,3118673919,FI +3118673920,3118674943,BG +3118674944,3118675967,UA +3118675968,3118676991,CH +3118676992,3118678015,GB +3118678016,3118679039,IR +3118679040,3118680063,GB +3118680064,3118681087,MD +3118681088,3118682111,SE +3118682112,3118682947,NL +3118682948,3118682951,AD +3118682952,3118683135,NL +3118683136,3118684159,RU +3118684160,3118685183,AT +3118685184,3118686207,ES +3118686208,3118687231,BY +3118687232,3118688255,ES +3118688256,3118690303,NL +3118690304,3118691327,DE +3118691328,3118692351,IR +3118692352,3118693375,IT +3118693376,3118694399,NO +3118694400,3118695423,ES +3118695424,3118696447,DE +3118696448,3118696703,RO +3118696704,3118697471,IR +3118697472,3118698495,SY +3118698496,3118699519,ES +3118699520,3118700543,CH +3118700544,3118702591,DE +3118702592,3118703615,GB +3118703616,3118704639,CH +3118704640,3118705663,SK +3118705664,3118707711,ES +3118707712,3118708735,TR +3118708736,3118709759,ES +3118709760,3118711807,PL +3118711808,3118713855,GB +3118713856,3118714879,ES +3118714880,3118715903,IE +3118715904,3118717951,ES +3118717952,3118718975,IE +3118718976,3118719999,DE +3118720000,3118721023,GB +3118721024,3118722047,FR +3118722048,3118723071,IQ +3118723072,3118724095,GB +3118724096,3118725119,MD +3118725120,3118726143,GB +3118726144,3118726399,HK +3118726400,3118727167,GB +3118727168,3118728191,ES +3118728192,3118730239,DE +3118730240,3118731263,SY +3118731264,3118732287,DE +3118732288,3118733311,FR +3118733312,3118734335,BG +3118734336,3118735359,SE +3118735360,3118736383,AT +3118736384,3118737407,NL +3118737408,3118738431,AT +3118738432,3118739455,US +3118739456,3118740479,RU +3118740480,3118741503,ES +3118741504,3118742527,NL +3118742528,3118743551,UA +3118743552,3118744575,ES +3118744576,3118745599,DK +3118745600,3118746623,ES +3118746624,3118747647,UA +3118747648,3118748671,NL +3118748672,3118749695,FR +3118749696,3118750719,RU +3118750720,3118751743,US +3118751744,3118752767,ES +3118752768,3118754815,UA +3118754816,3118755839,PL +3118755840,3118756863,RU +3118756864,3118759935,ES +3118759936,3118760959,MD +3118760960,3118761983,RU +3118761984,3118763007,DE +3118763008,3118764031,PL +3118764032,3118765055,DE +3118765056,3118766079,AT +3118766080,3118767103,ES +3118767104,3118768127,FR +3118768128,3118769151,ES +3118769152,3118770175,CZ +3118770176,3118771199,IE +3118771200,3118772223,ES +3118772224,3118773247,DE +3118773248,3118774271,GB +3118774272,3118775295,HK +3118775296,3118776319,NL +3118776320,3118777343,UA +3118777344,3118781439,NL +3118781440,3118782463,SK +3118782464,3118783487,RO +3118783488,3118784511,IT +3118784512,3118785535,MD +3118785536,3118786559,FR +3118786560,3118787583,RU +3118787584,3118788607,IR +3118788608,3118789631,DE +3118789632,3118790655,IR +3118790656,3118791679,IT +3118791680,3118792703,GB +3118792704,3118793727,IR +3118793728,3118794751,TR +3118794752,3118795775,RU +3118795776,3118796799,TR +3118796800,3118797823,IT +3118797824,3118798847,GB +3118798848,3118799871,MK +3118799872,3118800895,IR +3118800896,3118801919,NL +3118801920,3118802943,KG +3118802944,3118803967,GB +3118803968,3118804991,ES +3118804992,3118806015,GB +3118806016,3118807039,NL +3118807040,3118807807,DE +3118807808,3118808063,US +3118808064,3118809087,PT +3118809088,3118810111,RU +3118810112,3118811135,CH +3118811136,3118812159,MK +3118812160,3118813183,GB +3118813184,3118814207,NL +3118814208,3118815231,UA +3118815232,3118816255,DE +3118816256,3118817279,DK +3118817280,3118818303,ES +3118818304,3118819327,DE +3118819328,3118820351,MD +3118820352,3118821375,GE +3118821376,3118823423,DE +3118823424,3118824447,RU +3118824448,3118825471,PL +3118825472,3118826495,FI +3118826496,3118827519,SE +3118827520,3118828543,BG +3118828544,3118829567,AT +3118829568,3118832639,DK +3118832640,3118833663,ES +3118833664,3118834687,FR +3118834688,3118835711,SA +3118835712,3118836735,DE +3118836736,3118837759,IT +3118837760,3118838783,FR +3118838784,3118839807,ES +3118839808,3118840831,RU +3118840832,3118841343,GB +3118841344,3118841855,CZ +3118841856,3118842879,RU +3118842880,3118843903,ES +3118843904,3118844927,HR +3118844928,3118845951,DE +3118845952,3118846975,NL +3118846976,3118849023,ES +3118849024,3118850047,NL +3118850048,3118850815,IL +3118850816,3118851071,NL +3118851072,3118852095,NO +3118852096,3118853119,RU +3118853120,3118854143,IT +3118854144,3118855167,NL +3118855168,3118856191,DE +3118856192,3118857215,RU +3118857216,3118858239,BG +3118858240,3118859263,ES +3118859264,3118860287,BG +3118860288,3118861311,FR +3118861312,3118862335,DE +3118862336,3118863359,RO +3118863360,3118864383,CH +3118864384,3118865407,SE +3118865408,3118866431,PL +3118866432,3118867455,SE +3118867456,3118868479,NL +3118868480,3118869503,IQ +3118869504,3118870527,UA +3118870528,3118872575,ES +3118872576,3118873599,MK +3118873600,3118874623,IL +3118874624,3118875647,ES +3118875648,3118876671,DE +3118876672,3118877695,NO +3118877696,3118878719,FR +3118878720,3118879743,IT +3118879744,3118880767,DE +3118880768,3118882815,UA +3118882816,3118883839,FR +3118883840,3118885887,RU +3118885888,3118886911,PL +3118886912,3118887935,CY +3118887936,3118888959,CH +3118888960,3118889983,CZ +3118889984,3118890239,ES +3118890240,3118890495,CH +3118890496,3118890751,US +3118890752,3118891007,DE +3118891008,3118892031,NO +3118892032,3118893055,AT +3118893056,3118894079,DE +3118894080,3118895103,RU +3118895104,3118896127,ES +3118896128,3118898175,GB +3118898176,3118899199,PL +3118899200,3118900223,DE +3118900224,3118901247,FR +3118901248,3118902271,PL +3118902272,3118903295,CZ +3118903296,3118904319,FI +3118904320,3118905343,US +3118905344,3118906367,CH +3118906368,3118907391,RU +3118907392,3118908415,UA +3118908416,3118909439,RU +3118909440,3118910463,PL +3118910464,3118911487,UZ +3118911488,3118912511,SA +3118912512,3118913535,NL +3118913536,3118914559,AT +3118914560,3118915583,GB +3118915584,3118916607,PL +3118916608,3118917631,GB +3118917632,3118918655,UA +3118918656,3118919679,ES +3118919680,3118920703,RU +3118920704,3118920753,IT +3118920754,3118920804,NL +3118920805,3118921727,IT +3118921728,3118922751,MD +3118922752,3118923775,MK +3118923776,3118924799,CH +3118924800,3118925823,DE +3118925824,3118926847,FR +3118926848,3118927871,PL +3118927872,3118928895,NL +3118928896,3118929919,ES +3118929920,3118932991,NL +3118932992,3118934015,IT +3118934016,3118935039,SA +3118935040,3118936063,SY +3118936064,3118937087,RU +3118937088,3118938111,CH +3118938112,3118939135,RU +3118939136,3118940159,DE +3118940160,3118941183,CY +3118941184,3118942207,NL +3118942208,3118943231,RO +3118943232,3118944255,GB +3118944256,3118945279,PL +3118945280,3118946303,SE +3118946304,3118947327,FI +3118947328,3118948351,ES +3118948352,3118949375,DE +3118949376,3118950399,SE +3118950400,3118951423,CH +3118951424,3118952447,TR +3118952448,3118953471,NL +3118953472,3118954495,ES +3118954496,3118955519,FR +3118955520,3118956543,DE +3118956544,3118957567,RS +3118957568,3118958591,DE +3118958592,3118960639,GB +3118960640,3118961663,FI +3118961664,3118962687,PL +3118962688,3118963711,RU +3118963712,3118964735,MK +3118964736,3118965759,RU +3118965760,3118967807,FR +3118967808,3118968831,US +3118968832,3118969855,SK +3118969856,3118971903,IR +3118971904,3118972927,PL +3118972928,3118973951,NL +3118973952,3118974975,ES +3118974976,3118975999,NL +3118976000,3118977023,RU +3118977024,3118978047,IT +3118978048,3118979071,DE +3118979072,3118980095,GB +3118980096,3118981119,NL +3118981120,3118982143,TR +3118982144,3118983167,LV +3118983168,3118984191,RU +3118984192,3118985215,CZ +3118985216,3118987263,RU +3118987264,3118991359,DE +3118991360,3118992383,ES +3118992384,3118993407,DE +3118993408,3118994431,RU +3118994432,3118994943,NL +3118994944,3118995199,US +3118995200,3118995455,DE +3118995456,3118996479,FR +3118996480,3118997503,EE +3118997504,3118998527,IR +3118998528,3118999551,ES +3118999552,3119001599,RU +3119001600,3119002623,ES +3119002624,3119004671,NL +3119004672,3119005695,RU +3119005696,3119006719,RO +3119006720,3119007743,AT +3119007744,3119008767,NL +3119008768,3119009791,SE +3119009792,3119010815,HU +3119010816,3119012863,RU +3119012864,3119013887,DE +3119013888,3119014911,RU +3119014912,3119015935,DE +3119015936,3119016959,RU +3119016960,3119017983,UA +3119017984,3119019007,NL +3119019008,3119020031,RU +3119020032,3119021055,MK +3119021056,3119022079,FR +3119022080,3119023103,BG +3119023104,3119024127,ES +3119024128,3119025151,RU +3119025152,3119026175,DK +3119026176,3119027199,DE +3119027200,3119028223,DK +3119028224,3119029247,IR +3119029248,3119030271,BG +3119030272,3119031295,NL +3119031296,3119032319,GB +3119032320,3119033343,RU +3119033344,3119034367,ES +3119034368,3119035391,IR +3119035392,3119036415,ES +3119036416,3119037439,NL +3119037440,3119038463,DE +3119038464,3119039487,FR +3119039488,3119040511,GB +3119040512,3119041535,FR +3119041536,3119042559,ES +3119042560,3119043583,RU +3119043584,3119044607,NL +3119044608,3119046655,DE +3119046656,3119047679,GB +3119047680,3119049727,RU +3119049728,3119050751,IT +3119050752,3119051775,GR +3119051776,3119054847,NL +3119054848,3119055871,RU +3119055872,3119056895,GB +3119056896,3119057919,FR +3119057920,3119058943,IR +3119058944,3119059967,PL +3119059968,3119060991,CZ +3119060992,3119062015,PL +3119062016,3119063039,NL +3119063040,3119064063,GB +3119064064,3119067135,UA +3119067136,3119068159,SE +3119068160,3119069183,DE +3119069184,3119070207,DK +3119070208,3119071231,NL +3119071232,3119072255,IT +3119072256,3119073279,CH +3119073280,3119074303,PL +3119074304,3119075327,ES +3119075328,3119077375,RU +3119077376,3119078399,NL +3119078400,3119079423,RU +3119079424,3119080447,ES +3119080448,3119081471,FR +3119081472,3119082495,DE +3119082496,3119083519,GB +3119083520,3119084543,RU +3119084544,3119086591,UA +3119086592,3119087615,GB +3119087616,3119088639,US +3119088640,3119089663,FR +3119089664,3119090687,UA +3119090688,3119091711,DE +3119091712,3119092735,MD +3119092736,3119093759,RO +3119093760,3119094783,UA +3119094784,3119096831,PL +3119096832,3119097855,DE +3119097856,3119098879,OM +3119098880,3119099903,NL +3119099904,3119100927,IE +3119100928,3119101951,AZ +3119101952,3119102975,GB +3119102976,3119103999,NL +3119104000,3119105023,RU +3119105024,3119106047,DK +3119106048,3119107071,RU +3119107072,3119108095,LT +3119108096,3119109119,MK +3119109120,3119110143,NL +3119110144,3119111167,RU +3119111168,3119112191,SY +3119112192,3119113215,ES +3119113216,3119114239,RO +3119114240,3119115263,ES +3119115264,3119116287,RU +3119116288,3119117311,DE +3119117312,3119118335,TR +3119118336,3119119359,IT +3119119360,3119120383,DK +3119120384,3119121407,GB +3119121408,3119122431,RO +3119122432,3119124479,RU +3119124480,3119125503,RO +3119125504,3119126527,ES +3119126528,3119127551,RU +3119127552,3119128575,CZ +3119128576,3119129599,DE +3119130624,3119131647,FR +3119131648,3119132671,DE +3119132672,3119133695,FR +3119133696,3119137791,UA +3119137792,3119138815,DE +3119138816,3119139839,GB +3119139840,3119141887,FR +3119141888,3119142911,SE +3119142912,3119143935,PL +3119143936,3119144959,NO +3119144960,3119145983,NL +3119145984,3119147007,ES +3119147008,3119148031,FR +3119148032,3119152127,RU +3119152128,3119153151,PT +3119153152,3119154175,RO +3119154176,3119155199,CZ +3119155200,3119156223,DE +3119156224,3119157247,FR +3119157248,3119158271,US +3119158272,3119159295,ES +3119159296,3119160319,NL +3119160320,3119161343,ES +3119161344,3119162367,NL +3119162368,3119163391,UA +3119163392,3119164415,GB +3119164416,3119165439,IT +3119165440,3119166463,UA +3119166464,3119167487,HU +3119167488,3119168511,ES +3119168512,3119169535,HU +3119169536,3119170559,IR +3119170560,3119171583,CH +3119171584,3119171839,FR +3119171840,3119172607,EE +3119172608,3119173631,DE +3119173632,3119174655,PL +3119174656,3119175167,HK +3119175168,3119175679,NL +3119175680,3119175935,IE +3119175936,3119176447,PL +3119176448,3119176703,IE +3119176704,3119177727,NL +3119177728,3119178751,ES +3119178752,3119179775,RU +3119179776,3119180799,PL +3119180800,3119181823,IT +3119181824,3119182847,PL +3119182848,3119183871,RU +3119183872,3119184895,SK +3119184896,3119185919,RU +3119185920,3119186943,GB +3119186944,3119187967,FR +3119187968,3119188991,RU +3119188992,3119190015,NL +3119190016,3119191039,SY +3119191040,3119192063,IT +3119192064,3119193087,SY +3119193088,3119195135,RU +3119195136,3119196159,DE +3119196160,3119197183,IR +3119197184,3119198207,TR +3120562176,3120594943,CO +3120594944,3120599039,AR +3120601088,3120602111,AR +3120602112,3120603135,BO +3120603136,3120610303,AR +3120610304,3120611327,PY +3120611328,3120617471,AR +3120617472,3120617727,CL +3120617728,3120627711,AR +3120627712,3120644095,NI +3120644096,3120660479,DO +3120660480,3120676863,CO +3120676864,3120680959,HT +3120680960,3120691199,AR +3120691200,3120693247,CO +3120693248,3120726015,BO +3120726016,3120734207,HN +3120734208,3120734463,BZ +3120734464,3120734719,EC +3120734720,3120735231,BZ +3120735232,3120735487,RU +3120735488,3120735743,NL +3120735744,3120735999,BZ +3120736000,3120736255,RU +3120736256,3120736511,EC +3120736512,3120736767,BZ +3120736768,3120737535,RU +3120737536,3120737791,BZ +3120737792,3120738303,EC +3120738304,3120742399,CW +3120742400,3120754687,PY +3120754688,3120755711,CR +3120755712,3120756735,GF +3120756736,3120757759,BR +3120757760,3120758783,CL +3120758784,3120824319,EC +3120824320,3120840703,CR +3120840704,3120857087,AR +3120857088,3120922623,EC +3120922624,3120930815,PA +3120930816,3120934911,CR +3120934912,3120949247,AR +3120949248,3120951295,CL +3120951296,3120955391,AR +3120955392,3121086463,DO +3121086464,3121151999,UY +3121152000,3121348607,CL +3121348608,3121479679,AR +3121479680,3121545215,VE +3121545216,3121610751,CR +3121610752,3121741823,PY +3121741824,3121872895,AR +3121872896,3122003967,CL +3122003968,3122135039,AR +3122135040,3122282495,VE +3122282496,3122294783,AR +3122294784,3122298879,CR +3122298880,3122331647,VE +3122331648,3122364415,BO +3122364416,3122659327,CO +3122659328,3122675711,CR +3122675712,3122692095,SV +3122692096,3122700287,HN +3122700288,3122716671,CR +3122716672,3122722815,HN +3122722816,3122724863,SV +3122724864,3122741247,AR +3122741248,3122757631,DO +3122757632,3122774015,EC +3122774016,3122790399,AR +3122790400,3123052543,CL +3123052544,3123183615,AR +3123183616,3123314687,CL +3123314688,3123380223,EC +3123380224,3123412991,CO +3123412992,3123445759,EC +3123445760,3123576831,TT +3123576832,3123707903,EC +3123707904,3124232191,UY +3124232192,3124760600,AR +3124760601,3124760601,MX +3124760602,3124783103,AR +3124783104,3124785151,GT +3124785152,3124788223,CL +3124788224,3124789247,PE +3124789248,3124822015,CR +3124822016,3124838399,EC +3124838400,3124840447,AR +3124840448,3124842495,CL +3124842496,3124844543,AR +3124844544,3124845567,BZ +3124846592,3124848639,AR +3124848640,3124849663,BR +3124849664,3124850687,AR +3124850688,3124851855,HN +3124851856,3124851863,IN +3124851864,3124854783,HN +3124854784,3124887551,CL +3124887552,3124953087,EC +3124953088,3125018623,CL +3125018624,3125280767,EC +3125280768,3125542911,PA +3125542912,3125673983,NI +3125673984,3125805055,CL +3125805056,3126329343,CO +3126329344,3126853631,VE +3126853632,3126860415,AR +3126860416,3126860543,US +3126860544,3126863999,AR +3126864000,3126864127,US +3126864128,3126870015,AR +3126870016,3126873343,VE +3126873344,3126873599,PA +3126873600,3126874111,VE +3126874112,3126878207,CR +3126878208,3126886399,PA +3126886400,3126906879,AR +3126906880,3126910975,TT +3126910976,3126918143,AR +3126918144,3126919167,HN +3126919168,3127115775,CO +3127115776,3127181311,AR +3127181312,3127246847,EC +3127246848,3127345151,CO +3127345152,3127640063,CL +3127640064,3127902207,AR +3127902208,3128426495,CO +3128426496,3128492031,DO +3128492032,3128524799,CO +3128524800,3128541183,AR +3128541184,3128557567,BO +3128557568,3129999359,AR +3129999360,3130261503,CO +3130261504,3130277887,CL +3130277888,3130284031,AR +3130284032,3130286079,DO +3130286080,3130290175,PA +3130290176,3130302463,AR +3130302464,3130302975,CY +3130302976,3130310655,CO +3130312704,3130314751,AR +3130314752,3130315775,CL +3130315776,3130316799,CR +3130316800,3130317823,AW +3130317824,3130318847,CW +3130318848,3130327039,AR +3130327040,3130458111,DO +3130458112,3130523647,GT +3130523648,3130654719,AR +3130654720,3130785791,CO +3130785792,3130851327,CL +3130851328,3130982399,AR +3130982400,3131006975,CO +3131006976,3131011071,BQ +3131011072,3131012095,CO +3131012096,3131012479,PA +3131012480,3131012607,CR +3131012608,3131013119,PA +3131013120,3131015167,AR +3131015168,3131047935,CR +3131047936,3131310079,PE +3131310080,3131572223,VE +3131572224,3131834367,CO +3131834368,3132096511,CL +3132096512,3132211199,CR +3132211200,3132227583,AR +3132227584,3132293119,EC +3132293120,3132295647,US +3132295648,3132295679,UY +3132295680,3132296447,US +3132296448,3132296703,HN +3132296704,3132301311,US +3132301312,3132301727,HN +3132301728,3132301743,NL +3132301744,3132302319,HN +3132302320,3132302335,NL +3132302336,3132302975,HN +3132302976,3132302983,NL +3132302984,3132303735,HN +3132303736,3132303743,NL +3132303744,3132304127,HN +3132304128,3132304303,US +3132304304,3132304311,DE +3132304312,3132304383,US +3132304384,3132304607,HN +3132304608,3132304623,DE +3132304624,3132305143,HN +3132305144,3132305151,NL +3132305152,3132306239,HN +3132306240,3132306271,DE +3132306272,3132307823,HN +3132307824,3132307839,US +3132307840,3132308367,HN +3132308368,3132308375,US +3132308376,3132308775,HN +3132308776,3132308783,US +3132308784,3132309503,HN +3132309504,3132313599,CR +3132313600,3132317695,CL +3132317696,3132321791,CO +3132321792,3132325887,PA +3132325888,3132358655,SR +3132358656,3132489727,CO +3132489728,3132510719,AR +3132510720,3132510975,PY +3132510976,3132588031,AR +3132588032,3132620799,CO +3132620800,3132915711,VE +3132915712,3132948479,PA +3132948480,3132964863,AW +3132964864,3132981247,AR +3132981248,3132997631,AW +3132997632,3133014015,AR +3133014016,3133046783,HT +3133046784,3133067263,AR +3133067264,3133071359,PA +3133071360,3133071871,CY +3133071872,3133073407,PA +3133073408,3133074431,CW +3133074432,3133075455,CL +3133075456,3133079551,CW +3133079552,3133145087,AR +3133145088,3133311999,BR +3133312000,3133313023,MX +3133313024,3133317119,BR +3133321216,3136983039,BR +3136984064,3136985087,BR +3136985088,3136985103,AR +3136985104,3136985107,CO +3136985108,3136985127,AR +3136985128,3136985131,CO +3136985132,3136985135,AR +3136985136,3136985143,CO +3136985144,3136985343,AR +3136985344,3136985355,CL +3136985356,3136985359,AR +3136985360,3136985375,CL +3136985376,3136985407,AR +3136985408,3136985415,BR +3136985416,3136985423,AR +3136985424,3136985431,BR +3136985432,3136985439,AR +3136985440,3136985447,BR +3136985448,3136985623,AR +3136985624,3136985631,MX +3136985632,3136985947,AR +3136985948,3136985951,BR +3136985952,3136985979,AR +3136985980,3136985983,BR +3136985984,3136986007,AR +3136986008,3136986047,BR +3136986048,3136986055,PE +3136986056,3136986087,BR +3136986088,3136986095,PE +3136986096,3136986099,BR +3136986100,3136986103,AR +3136986104,3136986105,BR +3136986106,3136986107,AR +3136986108,3140587519,BR +3140599808,3140614143,BR +3140614144,3140616191,CR +3140616192,3145727999,BR +3145728000,3149135871,MX +3149135872,3149398015,BR +3149398016,3149881343,MX +3149881344,3149889535,BR +3149889536,3153327103,MX +3153327104,3153327359,US +3153327360,3154051071,MX +3154051072,3154116607,BR +3154116608,3154124799,RU +3154124800,3154126847,PL +3154126848,3154128895,RU +3154128896,3154132991,EE +3154132992,3154149375,UA +3154149376,3154157567,KZ +3154157568,3154173951,RU +3154173952,3154182143,MD +3154182144,3154247679,DE +3154247680,3154256895,RS +3154256896,3154257919,XK +3154257920,3154274303,RS +3154274304,3154275327,XK +3154275328,3154282495,RS +3154282496,3154284543,XK +3154284544,3154313215,RS +3154313216,3154378751,TR +3154378752,3154444287,GR +3154444288,3154509823,BE +3154509824,3154571519,HU +3154571520,3154571775,BG +3154571776,3154575359,HU +3154575360,3154640895,FR +3154640896,3155165183,IT +3155165184,3155312938,RU +3155312939,3155312939,US +3155312940,3155427327,RU +3155427328,3155689471,AT +3155689472,3155951615,RO +3155951616,3156213759,GB +3156213760,3156279295,RU +3156279296,3156344831,PL +3156344832,3156410367,IR +3156410368,3156475903,RU +3156475904,3156541439,HU +3156541440,3156606975,PT +3156606976,3156672511,TR +3156672512,3156738047,GB +3156738048,3156803583,DE +3156803584,3156869119,TR +3156869120,3156876287,LU +3156876288,3156877311,RU +3156877312,3156877823,LU +3156877824,3156878335,UA +3156878336,3156893695,LU +3156893696,3156894719,IN +3156894720,3156897791,LU +3156897792,3156899839,US +3156899840,3156901887,SG +3156901888,3156906239,NL +3156906240,3156907007,LU +3156907008,3156908031,RU +3156908032,3156910079,LU +3156910080,3156912127,NL +3156912128,3156914175,LU +3156914176,3156916223,RU +3156916224,3156917247,GB +3156917248,3156920319,LU +3156920320,3156921343,SG +3156921344,3156922367,HK +3156922368,3156922623,NL +3156922624,3156922879,US +3156922880,3156923135,LU +3156923136,3156923391,RU +3156923392,3156923647,SG +3156923648,3156924415,LU +3156924416,3156925439,NL +3156925440,3156926463,SG +3156926464,3156927743,NL +3156927744,3156927999,LU +3156928000,3156929535,NL +3156929536,3156930559,LU +3156930560,3156932607,US +3156932608,3156932863,NL +3156932864,3156933119,US +3156933120,3156933631,NL +3156933632,3156934655,SG +3156934656,3157000191,RU +3157000192,3157008383,MK +3157008384,3157016575,RU +3157016576,3157024767,BE +3157024768,3157032959,RU +3157032960,3157065727,HU +3157065728,3157131263,AT +3157131264,3157196799,DE +3157196800,3157262335,PL +3157262336,3157786623,SA +3157786624,3158048767,TR +3158048768,3158070548,CH +3158070549,3158070549,SE +3158070550,3158310911,CH +3158310912,3158312959,FI +3158312960,3158315007,AZ +3158315008,3158316031,DE +3158316032,3158316543,GB +3158316544,3158317055,DE +3158317056,3158319103,SI +3158319104,3158321151,GB +3158321152,3158323199,DE +3158323200,3158325247,BE +3158325248,3158327295,DE +3158327296,3158329343,NL +3158329344,3158331391,BE +3158331392,3158333439,PL +3158333440,3158335487,IT +3158335488,3158337535,IL +3158337536,3158339583,SI +3158339584,3158341631,RU +3158341632,3158343679,IT +3158343680,3158345727,RU +3158345728,3158347775,CY +3158347776,3158349823,RU +3158349824,3158351871,DK +3158351872,3158355967,RU +3158355968,3158358015,LV +3158358016,3158360063,GB +3158360064,3158362111,DE +3158362112,3158364159,IL +3158366208,3158368255,RU +3158368256,3158370303,FR +3158370304,3158372351,BE +3158372352,3158374399,FR +3158374400,3158376447,DE +3158376448,3158378495,IT +3158378496,3158380543,RU +3158382592,3158384639,OM +3158384640,3158386687,GB +3158386688,3158388735,PL +3158388736,3158390783,RU +3158390784,3158392831,GB +3158392832,3158394879,RU +3158394880,3158396927,AT +3158396928,3158398975,IT +3158398976,3158401023,ES +3158401024,3158403071,GB +3158403072,3158405119,RU +3158405120,3158407167,GB +3158407168,3158409215,FR +3158409216,3158411263,RU +3158411264,3158413311,FI +3158413312,3158415359,DE +3158415360,3158417407,SE +3158417408,3158419455,NL +3158419456,3158421503,FR +3158421504,3158423551,GB +3158423552,3158425159,MT +3158425160,3158425167,IE +3158425168,3158425599,MT +3158425600,3158427647,NL +3158427648,3158429695,DE +3158429696,3158431743,RU +3158431744,3158433791,BE +3158433792,3158435839,NL +3158435840,3158439935,RU +3158439936,3158441983,GB +3158441984,3158444031,EE +3158444032,3158446079,BE +3158446080,3158448127,NL +3158450176,3158452223,RU +3158452224,3158454271,DE +3158458368,3158474751,GB +3158474752,3158507519,OM +3158507520,3158573055,FI +3158573056,3158573311,GB +3158573312,3158573823,RU +3158573824,3158574079,CZ +3158574080,3158581247,RU +3158581248,3158589439,DE +3158589440,3158615039,RU +3158615040,3158616063,GB +3158616064,3158630399,RU +3158630400,3158638591,PL +3158638592,3158704127,LT +3158704128,3158835199,KW +3158835200,3158851583,IQ +3158851584,3158852863,NL +3158852864,3158853119,ES +3158853120,3158853631,NL +3158853632,3158855679,RU +3158855680,3158856447,NL +3158856448,3158857471,DE +3158857472,3158857727,SE +3158857728,3158857983,DE +3158857984,3158858239,GB +3158858240,3158858495,SG +3158858496,3158859519,NL +3158859520,3158859775,GB +3158859776,3158859903,NL +3158859904,3158860031,CZ +3158860032,3158860287,GB +3158860288,3158860543,NL +3158860544,3158860799,GB +3158860800,3158861055,NL +3158861056,3158861311,UA +3158861312,3158861567,IE +3158861568,3158861823,AE +3158861824,3158862079,DE +3158862080,3158862463,GB +3158862464,3158862591,NL +3158862592,3158862847,FR +3158862848,3158863103,PL +3158863104,3158863359,IT +3158863360,3158863615,MD +3158863616,3158863871,EE +3158863872,3158864127,SK +3158864128,3158864383,ES +3158864384,3158864639,AT +3158864640,3158864895,RO +3158864896,3158865151,LT +3158865152,3158865407,NL +3158865408,3158865663,AL +3158865664,3158865919,CY +3158865920,3158866943,IT +3158866944,3158867199,DE +3158867200,3158867455,HU +3158867456,3158867711,DE +3158867712,3158867967,NO +3158867968,3158884351,AZ +3158884352,3158900735,NL +3158900736,3158917119,FR +3158917120,3158933503,DE +3158933504,3158949887,RU +3158949888,3158966271,GR +3158966272,3158982655,DE +3158982656,3158999039,GB +3158999040,3159031807,RO +3159031808,3159048191,RU +3159048192,3159064575,IR +3159064576,3159080959,CZ +3159080960,3159097343,RU +3159097344,3159359487,ES +3159359488,3159621631,PT +3159621632,3159883775,ES +3159883776,3160145919,NL +3160145920,3160147967,RU +3160147968,3160150015,CZ +3160150016,3160152063,LV +3160152064,3160154111,IT +3160154112,3160156159,DE +3160156160,3160158207,CZ +3160158208,3160160255,CH +3160160256,3160162303,NL +3160162304,3160164351,FR +3160164352,3160166399,LV +3160166400,3160168447,NO +3160168448,3160170495,GB +3160170496,3160172543,CZ +3160172544,3160174591,RU +3160174592,3160176639,DE +3160178688,3160180735,DE +3160180736,3160182783,GB +3160182784,3160184831,CH +3160184832,3160186879,NL +3160186880,3160188927,EE +3160188928,3160190975,SE +3160190976,3160193023,RU +3160193024,3160195071,IT +3160195072,3160197119,RU +3160197120,3160199167,DE +3160199168,3160201215,GE +3160201216,3160203263,RU +3160203264,3160205311,CH +3160205312,3160207359,GB +3160207360,3160209407,RU +3160209408,3160211455,SE +3160211456,3160213503,IE +3160213504,3160215551,DE +3160215552,3160219647,RU +3160219648,3160221695,ES +3160221696,3160223743,FR +3160223744,3160227839,RU +3160227840,3160229887,IR +3160229888,3160231935,ES +3160231936,3160233983,BE +3160233984,3160236031,GE +3160236032,3160238079,BE +3160238080,3160240127,RU +3160240128,3160242175,BE +3160242176,3160244223,RS +3160244224,3160246271,RU +3160246272,3160248319,IT +3160248320,3160250367,NL +3160250368,3160252415,BE +3160252416,3160254463,PL +3160254464,3160256511,LU +3160256512,3160258559,GB +3160258560,3160260607,NO +3160260608,3160262655,PT +3160262656,3160264703,HU +3160264704,3160266751,RU +3160266752,3160268799,DE +3160268800,3160272895,PT +3160272896,3160274943,RU +3160274944,3160276991,AT +3160276992,3160279039,FR +3160279040,3160281087,ES +3160281088,3160283135,GB +3160283136,3160285183,DE +3160285184,3160287231,RU +3160287232,3160289279,GB +3160289280,3160291327,RU +3160291328,3160293375,ES +3160293376,3160295423,FI +3160295424,3160297471,GB +3160297472,3160299519,MD +3160299520,3160301567,RU +3160301568,3160303615,DE +3160303616,3160305663,GB +3160305664,3160307711,DE +3160307712,3160309759,IT +3160309760,3160311807,GB +3160311808,3160313855,HU +3160313856,3160315903,IT +3160315904,3160317951,KZ +3160317952,3160322047,RU +3160322048,3160324095,CH +3160326144,3160328191,IT +3160328192,3160330239,FR +3160330240,3160332287,RU +3160332288,3160334335,NO +3160334336,3160336383,RU +3160336384,3160338431,CZ +3160338432,3160340479,GB +3160340480,3160346623,DE +3160346624,3160348671,IT +3160348672,3160350719,PL +3160350720,3160352767,SE +3160352768,3160354815,GB +3160354816,3160356863,NL +3160356864,3160358911,CZ +3160358912,3160360959,JO +3160360960,3160363007,IT +3160363008,3160365055,GB +3160367104,3160369151,NL +3160369152,3160371199,RU +3160371200,3160373247,ES +3160373248,3160375295,CZ +3160375296,3160377343,GB +3160377344,3160379391,NL +3160381440,3160383487,UA +3160383488,3160385535,SA +3160385536,3160387583,NL +3160387584,3160389631,RS +3160389632,3160391679,RU +3160391680,3160395775,GB +3160395776,3160397823,EE +3160397824,3160399871,ES +3160399872,3160401919,SE +3160401920,3160403967,DE +3160403968,3160406015,NO +3160406016,3160408063,ES +3160408064,3161456639,DE +3161456640,3161473023,PL +3161473024,3161489407,SK +3161489408,3161505791,LV +3161505792,3161538559,RU +3161538560,3161554943,NO +3161554944,3161571327,RU +3161571328,3161587711,UZ +3161587712,3161604095,RU +3161604096,3161612287,PL +3161612288,3161614335,IT +3161614336,3161614847,US +3161614848,3161615103,ES +3161615104,3161615359,US +3161615360,3161616383,ES +3161616384,3161618431,GB +3161618432,3161620479,IQ +3161620480,3161636863,DK +3161636864,3161637887,UA +3161637888,3161638911,RU +3161638912,3161640959,UA +3161640960,3161645055,RU +3161645056,3161653247,SE +3161653248,3161669631,LU +3161669632,3161673727,MQ +3161673728,3161676799,GP +3161676800,3161677823,FR +3161677824,3161681919,GP +3161681920,3161682943,GF +3161682944,3161686015,FR +3161686016,3161702399,UA +3161702400,3161718783,AM +3161718784,3161735167,PL +3161735168,3161751551,CZ +3161751552,3161767935,RU +3161767936,3161784319,BH +3161784320,3161800703,FI +3161800704,3161817087,SA +3161817088,3161833471,PL +3161833472,3161835519,RS +3161835520,3161841663,AT +3161841664,3161843711,RS +3161843712,3161845759,AT +3161845760,3161846271,GR +3161846272,3161849855,AT +3161849856,3161866239,BE +3161866240,3161882623,IR +3161882624,3161899007,DE +3161899008,3161915391,AT +3161915392,3161931775,TR +3161948160,3161964543,RO +3161964544,3161980927,ES +3161980928,3161989119,SK +3161989120,3161990143,NL +3161990144,3161992191,TR +3161992192,3161993215,NL +3161993216,3161997311,RU +3161997312,3162005503,DK +3162005504,3162013695,RS +3162013696,3162021887,IL +3162021888,3162030079,SE +3162030080,3162038271,CZ +3162038272,3162046463,RU +3162046464,3162054655,PL +3162054656,3162062847,NL +3162062848,3162071039,SE +3162071040,3162087423,IR +3162087424,3162095615,SK +3162095616,3162103807,GE +3162103808,3162104831,FR +3162104832,3162111999,NL +3162112000,3162120191,PL +3162120192,3162128383,GB +3162128384,3162136575,NL +3162136576,3162144767,IR +3162144768,3162152959,SE +3162152960,3162161151,RU +3162161152,3162169343,CZ +3162169344,3162177535,RU +3162177536,3162185727,FI +3162185728,3162193919,RU +3162193920,3162202111,FR +3162202112,3162209535,SK +3162209536,3162209791,CZ +3162209792,3162210303,SK +3162210304,3162218495,GE +3162218496,3162226687,JO +3162226688,3162234879,PL +3162234880,3162243071,RU +3162243072,3162251263,TR +3162251264,3162259455,RU +3162259456,3162267647,BG +3162267648,3162275839,RU +3162275840,3162284031,NO +3162284032,3162292223,PL +3162292224,3162300415,BA +3162300416,3162308607,RU +3162308608,3162316799,HR +3162316800,3162324991,PL +3162324992,3162327039,IE +3162327040,3162329087,CH +3162329088,3162331135,IE +3162331136,3162333183,GB +3162333184,3162341375,IT +3162341376,3162349567,PL +3162349568,3162357759,TR +3162357760,3162365951,PT +3162365952,3162374143,PL +3162374144,3162382335,BG +3162382336,3162390527,RU +3162390528,3162396927,SE +3162396928,3162397183,FI +3162397184,3162398719,SE +3162398720,3162404863,NL +3162404864,3162406911,BE +3162406912,3162415103,IR +3162415104,3162423295,DE +3162423296,3162431487,NO +3162431488,3162439679,SE +3162439680,3162447871,PL +3162447872,3162456063,RU +3162456064,3162464255,BG +3162464256,3162472447,BA +3162472448,3162480639,HU +3162480640,3162488831,ES +3162488832,3162497023,FI +3162497024,3162537983,RU +3162537984,3162570751,PL +3162570752,3162603519,HR +3162603520,3162636287,GE +3162636288,3162669055,FR +3162669056,3162676223,RU +3162676224,3162677247,KZ +3162677248,3162679039,RU +3162679040,3162679295,KZ +3162679296,3162680319,RU +3162680320,3162680575,UZ +3162680576,3162681343,RU +3162681344,3162682367,UA +3162682368,3162682879,MD +3162682880,3162683135,GB +3162683136,3162683391,ES +3162683392,3162685439,EE +3162685440,3162689535,MD +3162689536,3162701823,RU +3162701824,3162734591,MD +3162734592,3162767359,CN +3162767360,3162800127,SA +3162800128,3162832895,TR +3162832896,3162865663,SY +3162865664,3162931199,RU +3162931200,3162963967,CZ +3162963968,3162996735,OM +3162996736,3163029503,IT +3163029504,3163062271,DE +3163062272,3163095039,IR +3163095040,3163127807,PL +3163127808,3163160575,BH +3163160576,3163164927,DE +3163164928,3163165183,FR +3163165184,3163166975,DE +3163166976,3163167231,FR +3163167232,3163170527,DE +3163170528,3163170559,AE +3163170560,3163178854,DE +3163178855,3163178855,SG +3163178856,3163186534,DE +3163186535,3163186535,FR +3163186536,3163186673,DE +3163186674,3163186674,FR +3163186675,3163193343,DE +3163193344,3163226111,MD +3163226112,3163258879,SA +3163258880,3163291647,SY +3163291648,3163324415,PT +3163324416,3163357183,OM +3163357184,3163389951,IE +3163389952,3163422719,FR +3163422720,3163455487,NL +3163455488,3163521023,HU +3163521024,3163553791,RU +3163553792,3163684863,DE +3163684864,3163815935,PL +3163815936,3164078079,NO +3164078080,3164209151,IT +3164209152,3164340223,CH +3164340224,3164471295,HU +3164471296,3164602367,IR +3164602368,3164667903,SY +3164667904,3164733439,PS +3164733440,3164798975,RU +3164798976,3164864511,UA +3164864512,3164864703,GB +3164864704,3164864735,ZA +3164864736,3164864767,IE +3164864768,3164893183,GB +3164893184,3164895231,TR +3164895232,3164897279,GB +3164897280,3164899327,IT +3164899328,3164901375,RU +3164901376,3164903423,PL +3164903424,3164905471,AM +3164905472,3164913663,RU +3164913664,3164915711,ES +3164915712,3164917759,GR +3164917760,3164919807,RU +3164919808,3164921855,AL +3164921856,3164923903,GB +3164923904,3164925951,DE +3164925952,3164927999,PL +3164928000,3164930047,NL +3164930048,3164932095,IE +3164932096,3164932719,FR +3164932720,3164932735,CZ +3164932736,3164932831,FR +3164932832,3164932863,IT +3164932864,3164932879,FR +3164932880,3164932895,LT +3164932896,3164932927,FR +3164932928,3164932991,NL +3164932992,3164933119,GB +3164933120,3164934143,FR +3164934144,3164936191,PL +3164936192,3164937749,LT +3164937750,3164937750,FR +3164937751,3164938239,LT +3164938240,3164939705,FR +3164939706,3164939706,ES +3164939707,3164945919,FR +3164945920,3164945983,NL +3164945984,3164945999,FR +3164946000,3164946015,ES +3164946016,3164946047,GB +3164946048,3164946159,FR +3164946160,3164946175,GB +3164946176,3164946351,FR +3164946352,3164946367,GB +3164946368,3164946479,FR +3164946480,3164946483,ES +3164946484,3164946527,FR +3164946528,3164946559,FI +3164946560,3164946815,FR +3164946816,3164946879,DE +3164946880,3164946943,FR +3164946944,3164947007,IT +3164947008,3164947023,FR +3164947024,3164947039,FI +3164947040,3164947043,FR +3164947044,3164947047,GB +3164947048,3164947591,FR +3164947592,3164947599,ES +3164947600,3164948743,FR +3164948744,3164948747,GB +3164948748,3164948863,FR +3164948864,3164948927,GB +3164948928,3164948959,FR +3164948960,3164948991,ES +3164948992,3164949119,FR +3164949120,3164949123,PT +3164949124,3164949339,FR +3164949340,3164949343,GB +3164949344,3164949371,FR +3164949372,3164949375,GB +3164949376,3164950399,FR +3164950400,3164950407,ES +3164950408,3164950711,FR +3164950712,3164950715,FI +3164950716,3164951423,FR +3164951424,3164951455,ES +3164951456,3164952224,FR +3164952225,3164952231,GB +3164952232,3164952233,FR +3164952234,3164952235,GB +3164952236,3164952236,FR +3164952237,3164952237,GB +3164952238,3164952247,FR +3164952248,3164952271,ES +3164952272,3164952511,FR +3164952512,3164952527,PT +3164952528,3164953007,FR +3164953008,3164953023,LT +3164953024,3164953087,IE +3164953088,3164953583,FR +3164953584,3164953599,ES +3164953600,3164954463,FR +3164954464,3164954471,IT +3164954472,3164954479,IE +3164954480,3164954507,FR +3164954508,3164954511,ES +3164954512,3164958895,FR +3164958896,3164958911,PT +3164958912,3164959247,FR +3164959248,3164959255,ES +3164959256,3164959467,FR +3164959468,3164959471,GB +3164959472,3164959807,FR +3164959808,3164959823,IE +3164959824,3164959839,FI +3164959840,3164960247,FR +3164960248,3164960255,DE +3164960256,3164960263,FR +3164960264,3164960267,ES +3164960268,3164960391,FR +3164960392,3164960395,GB +3164960396,3164960439,FR +3164960440,3164960443,DE +3164960444,3164960499,FR +3164960500,3164960503,CZ +3164960504,3164960671,FR +3164960672,3164960675,ES +3164960676,3164960699,FR +3164960700,3164960703,ES +3164960704,3164960787,FR +3164960788,3164960791,DE +3164960792,3164960799,FR +3164960800,3164960831,PT +3164960832,3164961151,FR +3164961152,3164961159,ES +3164961160,3164961391,FR +3164961392,3164961395,ES +3164961396,3164961551,FR +3164961552,3164961555,ES +3164961556,3164961727,FR +3164961728,3164961735,ES +3164961736,3164962143,FR +3164962144,3164962151,ES +3164962152,3164962283,FR +3164962284,3164962287,ES +3164962288,3164962455,FR +3164962456,3164962459,IE +3164962460,3164962471,FR +3164962472,3164962475,ES +3164962476,3164962647,FR +3164962648,3164962655,PT +3164962656,3164962815,FR +3164962816,3164964863,ES +3164964864,3164966911,FI +3164966912,3164967135,FR +3164967136,3164967151,ES +3164967152,3164967231,FR +3164967232,3164967239,ES +3164967240,3164967303,FR +3164967304,3164967307,DE +3164967308,3164967935,FR +3164967936,3164967967,DE +3164967968,3164968223,FR +3164968224,3164968255,GB +3164968256,3164968319,FR +3164968320,3164968447,GB +3164968448,3164968835,FR +3164968836,3164968839,ES +3164968840,3164969135,FR +3164969136,3164969143,ES +3164969144,3164969147,FR +3164969148,3164969151,GB +3164969152,3164969179,FR +3164969180,3164969183,ES +3164969184,3164969191,FR +3164969192,3164969199,PT +3164969200,3164970223,FR +3164970224,3164970239,GB +3164970240,3164970413,FR +3164970414,3164970415,IT +3164970416,3164970607,FR +3164970608,3164970615,ES +3164970616,3164970631,FR +3164970632,3164970639,ES +3164970640,3164970719,FR +3164970720,3164970751,PL +3164970752,3164970927,FR +3164970928,3164970943,ES +3164970944,3164971011,FR +3164971012,3164971015,IE +3164971016,3164971479,FR +3164971480,3164971483,FI +3164971484,3164971579,FR +3164971580,3164971583,ES +3164971584,3164971615,FR +3164971616,3164971619,ES +3164971620,3164971807,FR +3164971808,3164971839,ES +3164971840,3164972399,FR +3164972400,3164972407,ES +3164972408,3164972543,FR +3164972544,3164972559,IT +3164972560,3164972599,FR +3164972600,3164972607,IT +3164972608,3164972735,FR +3164972736,3164972751,GB +3164972752,3164973407,FR +3164973408,3164973415,GB +3164973416,3164973419,FR +3164973420,3164973423,ES +3164973424,3164973711,FR +3164973712,3164973727,GB +3164973728,3164974335,FR +3164974336,3164974437,GB +3164974438,3164974438,IT +3164974439,3164974463,GB +3164974464,3164974495,DE +3164974496,3164975199,FR +3164975200,3164975215,ES +3164975216,3164975311,FR +3164975312,3164975327,ES +3164975328,3164975887,FR +3164975888,3164975903,IT +3164975904,3164975991,FR +3164975992,3164975995,PL +3164975996,3164976027,FR +3164976028,3164976031,ES +3164976032,3164976143,FR +3164976144,3164976159,BE +3164976160,3164976231,FR +3164976232,3164976239,ES +3164976240,3164976511,FR +3164976512,3164976527,LT +3164976528,3164977215,FR +3164977216,3164977223,NL +3164977224,3164977231,PT +3164977232,3164977239,BE +3164977240,3164977247,IT +3164977248,3164977255,CZ +3164977256,3164977263,PT +3164977264,3164977271,FI +3164977272,3164977279,IT +3164977280,3164978079,FR +3164978080,3164978111,PT +3164978112,3164978155,FR +3164978156,3164978159,DE +3164978160,3164978623,FR +3164978624,3164978655,ES +3164978656,3164979119,FR +3164979120,3164979135,LT +3164979136,3164979151,FR +3164979152,3164979155,ES +3164979156,3164995345,FR +3164995346,3164995346,GB +3164995347,3164995583,FR +3164995584,3165030399,NL +3165030400,3165031423,GB +3165031424,3165032447,NL +3165032448,3165036543,GB +3165036544,3165038591,DE +3165038592,3165040639,GB +3165040640,3165044735,SG +3165044736,3165045759,DE +3165045760,3165046783,SG +3165046784,3165047807,NL +3165047808,3165061119,SG +3165061120,3165126655,SK +3165126656,3165192191,RU +3165192192,3165257727,GE +3165257728,3165323263,RU +3165323264,3165388799,ES +3165388800,3165417471,MT +3165417472,3165421567,DE +3165421568,3165425663,IE +3165425664,3165437951,GB +3165437952,3165438207,DK +3165438208,3165439487,AT +3165439488,3165439743,GB +3165439744,3165439999,ES +3165440000,3165440255,JP +3165440256,3165440511,HK +3165440512,3165440767,JP +3165440768,3165441023,SG +3165441024,3165442047,AT +3165442048,3165442303,TW +3165442304,3165442559,AU +3165442560,3165442815,KR +3165442816,3165443071,HK +3165443072,3165443583,CA +3165443584,3165444095,US +3165444096,3165444351,BR +3165444352,3165444607,ZA +3165444608,3165444863,IT +3165444864,3165445119,NL +3165445120,3165445375,AT +3165445376,3165445631,CA +3165445632,3165445887,US +3165445888,3165446143,NO +3165446144,3165447167,DE +3165447168,3165447423,CA +3165447424,3165447679,AT +3165447680,3165448191,FR +3165448192,3165448447,AT +3165448448,3165448703,DE +3165448704,3165448959,US +3165448960,3165449215,CH +3165449216,3165451263,AT +3165451264,3165451519,BR +3165451520,3165451775,FR +3165451776,3165452031,AT +3165452032,3165452287,IL +3165452288,3165452543,AT +3165452544,3165452799,DE +3165452800,3165453055,AT +3165453056,3165453311,US +3165453312,3165453567,PE +3165453568,3165453823,US +3165453824,3165454079,RO +3165454080,3165454335,AE +3165454336,3165519871,RO +3165519872,3165585407,DE +3165585408,3165650943,CZ +3165650944,3166175231,DK +3166175232,3166306303,CH +3166306304,3166437375,RU +3166437376,3166568447,BE +3166568448,3166601215,UA +3166601216,3166609407,RU +3166609408,3166633983,UA +3166633984,3166638079,RU +3166638080,3166646271,UA +3166646272,3166650367,CZ +3166650368,3166654463,UA +3166654464,3166658559,RU +3166658560,3166662655,UA +3166662656,3166666751,RU +3166666752,3166667263,PL +3166667264,3166667775,CZ +3166667776,3166670847,GB +3166670848,3166672895,UA +3166672896,3166674943,GB +3166674944,3166679039,RU +3166679040,3166681087,IR +3166681088,3166685183,RU +3166685184,3166687231,PL +3166687232,3166689279,MD +3166689280,3166691327,PL +3166691328,3166693375,RU +3166693376,3166695423,UA +3166695424,3166697471,RU +3166697472,3166699519,RO +3166699520,3166961663,DE +3166961664,3167223807,SI +3167223808,3167694591,NL +3167694592,3167694847,GB +3167694848,3167748095,NL +3167748096,3167752191,ES +3167752192,3167752959,RO +3167752960,3167753215,IT +3167753216,3167755263,ES +3167755264,3167757311,RO +3167757312,3167757823,BE +3167757824,3167758335,GB +3167758336,3167758463,NL +3167758464,3167760383,ES +3167760384,3167762431,GB +3167762432,3167772671,IR +3167772672,3167773695,MD +3167773696,3167773951,ES +3167773952,3167774207,RO +3167774208,3167774335,KR +3167774336,3167774463,PH +3167774464,3167774719,RO +3167774720,3167775743,MD +3167775744,3167775999,RO +3167776000,3167776255,GB +3167776256,3167776511,RO +3167776512,3167776767,GB +3167776768,3167777791,MD +3167777792,3167778815,RO +3167778816,3167780863,MD +3167780864,3167783935,RO +3167783936,3167784447,ES +3167784448,3167784703,CA +3167784704,3167784959,PT +3167784960,3167797247,IR +3167797248,3167798271,MD +3167798272,3167798783,RO +3167798784,3167799295,FR +3167799296,3167800319,IR +3167800320,3167801343,MD +3167801344,3167803391,IR +3167803392,3167803903,PL +3167803904,3167804415,ES +3167804416,3167805439,GB +3167805440,3167825919,IR +3167825920,3167830015,NL +3167830016,3167834111,IR +3167834112,3167838207,IT +3167838208,3167842303,RO +3167842304,3167843327,ES +3167843328,3167844351,IR +3167844352,3167846399,GB +3167846400,3167866879,IR +3167866880,3167867903,SY +3167867904,3167868927,RO +3167868928,3167879167,MD +3167879168,3167895551,DE +3167895552,3167901695,IR +3167901696,3167902719,RO +3167902720,3167902975,BE +3167902976,3167903231,NL +3167903232,3167903743,DE +3167903744,3167932415,IR +3167932416,3167933439,CH +3167933440,3167933695,RO +3167933696,3167933951,DE +3167933952,3167934207,US +3167934208,3167934463,RO +3167934464,3167935487,ES +3167935488,3167936511,PL +3167936512,3167938559,RO +3167938560,3167939583,IR +3167939584,3167940351,RO +3167940352,3167940607,IT +3167940608,3167943679,MD +3167943680,3167944191,GB +3167944192,3167944447,RO +3167944448,3167944703,GB +3167944704,3167948799,IR +3167948800,3167951359,RO +3167951360,3167951487,IN +3167951488,3167951615,KR +3167951616,3167952895,RO +3167952896,3167985663,IR +3167985664,3167985919,US +3167985920,3167986431,RO +3167986432,3167986687,UA +3167986688,3167987711,RO +3167987712,3167987967,NL +3167987968,3167988223,IE +3167988224,3167988735,BE +3167988736,3167989759,MD +3167989760,3168002047,IR +3168002048,3168003071,RO +3168003072,3168004095,ES +3168004096,3168005887,RO +3168005888,3168006143,NL +3168006144,3168008191,SE +3168008192,3168008447,RO +3168008448,3168010239,US +3168010240,3168011263,MD +3168011264,3168011519,IE +3168011520,3168011775,RO +3168011776,3168012287,IR +3168012288,3168014335,MD +3168014336,3168015359,ES +3168015360,3168015615,BE +3168015616,3168015871,RO +3168015872,3168016127,US +3168016128,3168016383,GB +3168016384,3168018431,MD +3168018432,3168018687,TR +3168018688,3168018943,RO +3168018944,3168019455,GB +3168019456,3168020479,RO +3168020480,3168022527,MD +3168022528,3168035839,IR +3168035840,3168036863,RO +3168036864,3168037887,US +3168037888,3168038399,SE +3168038400,3168038911,RO +3168038912,3168039935,MD +3168039936,3168040959,BE +3168040960,3168041215,DE +3168041216,3168044799,RO +3168044800,3168045055,US +3168045056,3168047103,RO +3168047104,3168049151,IR +3168049152,3168049407,RO +3168049408,3168049663,IT +3168049664,3168050431,RO +3168050432,3168050687,MD +3168050688,3168051199,RO +3168051200,3168059391,IR +3168059392,3168061439,RO +3168061440,3168073727,IR +3168073728,3168075263,RO +3168075264,3168075519,GB +3168075520,3168076799,RO +3168076800,3168079871,ES +3168079872,3168081919,RO +3168081920,3168083967,FR +3168083968,3168084991,RO +3168084992,3168086015,MD +3168086016,3168088063,IT +3168088064,3168089087,RO +3168089088,3168090111,MD +3168090112,3168092159,ES +3168092160,3168096255,IR +3168096256,3168097279,ES +3168097280,3168100351,MD +3168100352,3168108543,IR +3168108544,3168110335,RO +3168110336,3168110591,GB +3168110592,3168110847,IT +3168110848,3168111359,RO +3168111360,3168111615,IT +3168111616,3168112639,FR +3168112640,3168116735,IR +3168116736,3168120831,IT +3168120832,3168126975,IR +3168126976,3168127999,RO +3168128000,3168128255,GB +3168128256,3168128511,RO +3168128512,3168129023,GB +3168129024,3168130047,IR +3168130048,3168130559,RO +3168130560,3168131071,GB +3168131072,3168131583,RO +3168131584,3168131711,IN +3168131712,3168131839,CN +3168131840,3168132095,RO +3168132096,3168133119,MD +3168133120,3168135167,NL +3168135168,3168135679,RO +3168135680,3168136191,CZ +3168136192,3168137215,MD +3168137216,3168137471,RO +3168137472,3168137727,FR +3168137728,3168137983,RO +3168137984,3168138239,NL +3168138240,3168139263,MD +3168139264,3168141311,GB +3168141312,3168142335,IT +3168142336,3168143615,RO +3168143616,3168143871,UA +3168143872,3168144383,RO +3168144384,3168144639,SG +3168144640,3168145151,RO +3168145152,3168145407,UA +3168145408,3168147455,RO +3168147456,3168147967,FR +3168147968,3168151551,RO +3168151552,3168153599,US +3168153600,3168154111,RO +3168154112,3168154367,SG +3168154368,3168155135,RO +3168155136,3168155391,IT +3168155392,3168156415,RO +3168156416,3168156671,ES +3168156672,3168157695,MD +3168157696,3168161791,IR +3168161792,3168162303,RO +3168162304,3168162815,IT +3168162816,3168163839,IR +3168163840,3168164351,RO +3168164352,3168164863,GB +3168164864,3168165119,RO +3168165120,3168165375,DE +3168165376,3168165887,GB +3168165888,3168166911,IR +3168166912,3168167935,FR +3168167936,3168169983,RO +3168169984,3168172031,ES +3168172032,3168172543,IR +3168172544,3168174079,RO +3168174080,3168176127,LT +3168176128,3168177151,MD +3168177152,3168178175,RO +3168178176,3168179199,MD +3168179200,3168182271,RO +3168182272,3168190463,IR +3168190464,3168191999,RO +3168192000,3168192255,GB +3168192256,3168192511,RO +3168192512,3168194559,MD +3168194560,3168196607,RO +3168196608,3168198655,IR +3168198656,3168199167,ES +3168199168,3168199679,RO +3168199680,3168200703,MD +3168200704,3168202751,IR +3168202752,3168203775,ES +3168203776,3168207103,RO +3168207104,3168207359,NL +3168207360,3168208895,RO +3168208896,3168209919,ES +3168209920,3168211455,RO +3168211456,3168211967,CZ +3168211968,3168212223,NL +3168212224,3168212479,US +3168212480,3168212735,RO +3168212736,3168212991,FR +3168212992,3168214015,IR +3168214016,3168214527,GB +3168214528,3168214783,BG +3168214784,3168215295,RO +3168215296,3168215551,GB +3168215552,3168215807,TH +3168215808,3168216063,GB +3168216064,3168216575,RO +3168216576,3168216831,GB +3168216832,3168218111,RO +3168218112,3168219135,IT +3168219136,3168221183,RO +3168221184,3168223231,ES +3168223232,3168223743,RO +3168223744,3168223999,IE +3168224000,3168224255,NL +3168224256,3168227327,RO +3168227328,3168229375,ES +3168229376,3168230399,IR +3168230400,3168230655,GB +3168230656,3168232447,RO +3168232448,3168233471,SY +3168233472,3168235519,ES +3168235520,3168237567,RO +3168237568,3168239615,PS +3168239616,3168243711,IR +3168243712,3168247807,RO +3168247808,3168264191,IR +3168264192,3168265215,ES +3168265216,3168265471,RS +3168265472,3168265727,NL +3168265728,3168265855,FR +3168265856,3168265983,BE +3168265984,3168266239,GR +3168266240,3168267263,RO +3168267264,3168268287,MD +3168268288,3168269311,IR +3168269312,3168270079,RO +3168270080,3168270591,IT +3168270592,3168270847,IE +3168270848,3168271359,RO +3168271360,3168272383,MD +3168272384,3168534527,IT +3168534528,3168796671,GB +3168796672,3168829439,FR +3168829440,3168862207,SA +3168862208,3168872191,RU +3168872192,3168872447,UA +3168872448,3168894975,RU +3168894976,3168927743,PS +3168927744,3168960511,RU +3168960512,3168993279,NL +3168993280,3169026047,RU +3169026048,3169034239,CZ +3169034240,3169042431,GB +3169044480,3169046527,NL +3169046528,3169050623,AZ +3169050624,3169052671,HU +3169052672,3169054719,PS +3169054720,3169056767,GB +3169056768,3169058815,EE +3169058816,3169091583,DK +3169091584,3169124351,IT +3169124352,3169157119,RO +3169157120,3169189887,SY +3169189888,3169222655,UA +3169222656,3169255423,SI +3169255424,3169275903,KW +3169275904,3169277951,CY +3169277952,3169278991,KW +3169278992,3169279007,SA +3169279008,3169279231,KW +3169279232,3169279239,IQ +3169279240,3169279255,SA +3169279256,3169279263,KW +3169279264,3169279295,SA +3169279296,3169279303,KW +3169279304,3169279311,SA +3169279312,3169279319,SD +3169279320,3169279487,GB +3169279488,3169279743,CY +3169279744,3169279759,IQ +3169279760,3169279871,KW +3169279872,3169285119,GB +3169285120,3169285631,KW +3169285632,3169286143,GB +3169286144,3169288191,KW +3169288192,3169320959,UA +3169320960,3169583103,RU +3169583104,3169648639,KW +3169648640,3169714175,MD +3169714176,3169779711,FI +3169779712,3169828607,UA +3169828608,3169828863,CZ +3169828864,3169845247,UA +3169845248,3169845503,RO +3169845504,3169845759,CZ +3169845760,3169849087,RO +3169849088,3169849343,FR +3169849344,3169849855,RO +3169849856,3169850367,SE +3169850368,3169851391,RO +3169851392,3169853439,NL +3169853440,3169854463,AU +3169854464,3169855487,ES +3169855488,3169855999,US +3169856000,3169856511,RO +3169856512,3169857023,IT +3169857024,3169862911,RO +3169862912,3169863167,IT +3169863168,3169863423,MD +3169863424,3169863679,RO +3169863680,3169863935,ES +3169863936,3169864191,NL +3169864192,3169864447,FR +3169864448,3169864703,IE +3169864704,3169866495,RO +3169866496,3169866751,GB +3169866752,3169867775,RO +3169867776,3169868031,GB +3169868032,3169869823,RO +3169869824,3169878015,MD +3169878016,3169882111,ES +3169882112,3169886207,SE +3169886208,3169894399,GB +3169894400,3169895423,ES +3169895424,3169895679,IR +3169895680,3169896447,RO +3169896448,3169896959,BG +3169896960,3169897471,RO +3169897472,3169898495,ES +3169898496,3169899263,RO +3169899264,3169899391,CN +3169899392,3169899519,TW +3169899520,3169899775,IR +3169899776,3169902079,RO +3169902080,3169902591,SE +3169902592,3169905151,RO +3169905152,3169905407,ES +3169905408,3169905663,RO +3169905664,3169906687,ES +3169906688,3169908735,RO +3169908736,3169910783,IR +3169910784,3169911807,RO +3169911808,3169912319,IT +3169912320,3169913855,RO +3169913856,3169914111,GB +3169914112,3169916927,RO +3169916928,3169918975,PL +3169918976,3169920767,RO +3169920768,3169923071,GB +3169923072,3169926143,RO +3169926144,3169927167,ES +3169927168,3169927423,RO +3169927424,3169927679,NL +3169927680,3169928191,RO +3169928192,3169928447,SE +3169928448,3169935359,RO +3169935360,3169937407,ES +3169937408,3169946623,RO +3169946624,3169947135,IT +3169947136,3169950207,RO +3169950208,3169950463,IT +3169950464,3169951743,RO +3169951744,3169955839,SE +3169955840,3169959423,RO +3169959424,3169959935,IT +3169959936,3169960191,RO +3169960192,3169960447,NL +3169960448,3169961471,RO +3169961472,3169961983,SE +3169961984,3169964799,RO +3169964800,3169965055,GB +3169965056,3169976319,RO +3169976320,3170111487,RU +3170111488,3170115583,MD +3170115584,3170119679,RU +3170119680,3170123775,CZ +3170123776,3170127871,DK +3170127872,3170131967,ES +3170136064,3170140159,GB +3170140160,3170172927,RU +3170172928,3170238463,IR +3170238464,3170246655,DE +3170246656,3170252799,RS +3170252800,3170253823,XK +3170253824,3170254847,RS +3170254848,3170263039,BA +3170263040,3170271231,CZ +3170271232,3170279423,PL +3170279424,3170287615,RU +3170287616,3170295807,GB +3170295808,3170303999,RU +3170304000,3170312191,SY +3170312192,3170320383,RU +3170320384,3170327593,JO +3170327594,3170327594,US +3170327595,3170328575,JO +3170328576,3170336767,UA +3170336768,3170338815,RO +3170338816,3170344959,ES +3170344960,3170347007,RO +3170347008,3170349055,ES +3170349056,3170361343,KZ +3170361344,3170369535,RO +3170369536,3170500607,SA +3170500608,3170631679,PT +3170631680,3170664447,PL +3170664448,3170697215,HR +3170697216,3170729983,IR +3170729984,3170762751,AZ +3170762752,3170795519,RU +3170795520,3170828287,BG +3170828288,3170861055,RU +3170861056,3170893823,RS +3170893824,3179105023,BR +3179105024,3179105279,US +3179105280,3179282431,BR +3179282432,3184116735,MX +3184116736,3184123903,BR +3184123904,3184125951,MX +3184125952,3184127999,BR +3184128000,3187671039,MX +3187671040,3187687423,CO +3187687424,3187695615,DO +3187695616,3187703807,AR +3187703808,3187711999,UY +3187712000,3187720191,AR +3187720192,3187728383,GT +3187728384,3187730431,CR +3187730432,3187732479,AR +3187732480,3187734527,CO +3187734528,3187736575,BO +3187736576,3187752959,AR +3187752960,3187761151,CO +3187761152,3187769343,AR +3187769344,3187802111,CO +3187802112,3187818495,AR +3187820544,3187822591,BR +3187822592,3187824639,AR +3187824640,3187826687,CL +3187826688,3187834879,AR +3187834880,3187843071,CW +3187843072,3187846143,AW +3187846144,3187851263,CW +3187851264,3187855359,PY +3187855360,3187857407,PA +3187857408,3187859455,CR +3187859456,3187863551,PA +3187863552,3187908607,AR +3187910656,3187913727,CL +3187913728,3187913815,PT +3187913816,3187913823,CL +3187913824,3187913983,PT +3187913984,3187914751,CL +3187914752,3187916799,BO +3187916800,3187933183,CO +3187933184,3187933341,GT +3187933342,3187933342,HN +3187933343,3187934079,GT +3187934080,3187934207,HN +3187934208,3187935543,GT +3187935544,3187935551,HN +3187935552,3187936591,GT +3187936592,3187936595,HN +3187936596,3187940571,GT +3187940572,3187940575,HN +3187940576,3187940631,GT +3187940632,3187940639,HN +3187940640,3187940823,GT +3187940824,3187940831,HN +3187940832,3187941647,GT +3187941648,3187941655,HN +3187941656,3187941711,GT +3187941712,3187941715,HN +3187941716,3187942271,GT +3187942272,3187942279,HN +3187942280,3187942563,GT +3187942564,3187942567,HN +3187942568,3187942655,GT +3187942656,3187942663,HN +3187942664,3187942975,GT +3187942976,3187942991,HN +3187942992,3187943391,GT +3187943392,3187943399,HN +3187943400,3187943551,GT +3187943552,3187943687,HN +3187943688,3187943715,GT +3187943716,3187943716,HN +3187943717,3187944351,GT +3187944352,3187944359,HN +3187944360,3187944773,GT +3187944774,3187944774,HN +3187944775,3187944855,GT +3187944856,3187944859,HN +3187944860,3187945343,GT +3187945344,3187945471,HN +3187945472,3187946687,GT +3187946688,3187946695,HN +3187946696,3187946735,GT +3187946736,3187946743,HN +3187946744,3187946887,GT +3187946888,3187946895,HN +3187946896,3187946975,GT +3187946976,3187946979,HN +3187946980,3187947999,GT +3187948000,3187948159,HN +3187948160,3187948367,GT +3187948368,3187948375,HN +3187948376,3187948799,GT +3187948800,3187948927,HN +3187948928,3187949115,GT +3187949116,3187949119,HN +3187949120,3187949567,GT +3187949568,3187949816,BQ +3187949817,3187949817,US +3187949818,3187950126,BQ +3187950127,3187950127,CW +3187950128,3187953663,BQ +3187953664,3187955711,CL +3187955712,3187957759,CR +3187957760,3187961855,CL +3187961856,3187965951,AR +3187965952,3187982335,CW +3187982336,3187998719,CL +3187998720,3188006911,AR +3188006912,3188015103,CL +3188015104,3188031487,HN +3188031488,3188039679,SV +3188039680,3188047871,AR +3188047872,3188051967,CO +3188051968,3188054015,CR +3188054016,3188056063,AR +3188056064,3188064255,PA +3188064256,3188080639,VE +3188080640,3188088831,CU +3188088832,3188094975,AR +3188094976,3188097023,CL +3188097024,3188105215,DO +3188105216,3188113407,CO +3188113408,3188117503,HN +3188117504,3188121599,AR +3188121600,3188125695,TT +3188125696,3188146175,AR +3188146176,3188147623,CO +3188147624,3188147631,PE +3188147632,3188148911,CO +3188148912,3188148915,PE +3188148916,3188149335,CO +3188149336,3188149339,PE +3188149340,3188151423,CO +3188151424,3188151439,PE +3188151440,3188152171,CO +3188152172,3188152175,PE +3188152176,3188153015,CO +3188153016,3188153023,EC +3188153024,3188154139,CO +3188154140,3188154143,CL +3188154144,3188170751,CO +3188170752,3188174847,CR +3188174848,3188178943,BR +3188178944,3188187135,CR +3188187136,3188203519,AR +3188203520,3188207615,DO +3188207616,3188211711,AR +3188211712,3188228095,CL +3188228096,3188236287,PE +3188237312,3188239359,VE +3188239360,3188240383,PE +3188240384,3188241407,CO +3188241408,3188242431,EC +3188242432,3188244479,AR +3188244480,3188248575,CO +3188248576,3188248703,CL +3188248704,3188260863,CO +3188260864,3188269055,AR +3188269056,3188275199,PA +3188275200,3188277247,CL +3188277248,3188293631,CO +3188293632,3188301823,VE +3188301824,3188310015,EC +3188310016,3188326399,CO +3188326400,3188359167,CR +3188359168,3188400127,EC +3188400128,3188408319,AR +3188408320,3188409599,BO +3188409600,3188409855,US +3188409856,3188416511,BO +3188416512,3188445183,AR +3188449280,3188453375,HN +3188453376,3188473855,EC +3188473856,3188482047,PE +3188482048,3188490239,AR +3188490240,3188498431,CO +3188498432,3188511103,AR +3188511104,3188511231,US +3188511232,3188523007,AR +3188523008,3188539391,CO +3188539392,3188542207,CL +3188542208,3188542463,US +3188542464,3188543487,CL +3188543488,3188545535,PA +3188545536,3188547583,AR +3188547584,3188551679,CO +3188551680,3188552703,AR +3188552704,3188553727,CL +3188553728,3188555775,CW +3188555776,3188572159,CL +3188572160,3188576255,CO +3188576256,3188597759,AR +3188597760,3188598783,PA +3188598784,3188600831,AR +3188600832,3188604927,CL +3188604928,3188621311,BO +3188621312,3188625407,GT +3188625408,3188627455,AR +3188627456,3188628479,CR +3188628480,3188637695,AR +3188637696,3188645887,PA +3188645888,3188662271,CO +3188662272,3188670463,BR +3188670464,3188671487,KY +3188671488,3188672511,BS +3188672512,3188674559,HN +3188674560,3188678655,AR +3188678656,3188686847,BR +3188686848,3188690943,EC +3188690944,3188695039,CU +3188695040,3188697087,EC +3188697088,3188703231,VE +3188703232,3188981759,AR +3188981760,3189178367,CL +3189178368,3189243903,PY +3189243904,3189637119,CO +3189637120,3189768191,AR +3189768192,3190030335,PA +3190030336,3190292479,VE +3190292480,3190554623,PE +3190554624,3190816767,CL +3190816768,3191078911,AR +3191078912,3191087103,CO +3191087104,3191091199,AR +3191091200,3191093247,BO +3191093248,3191095295,AR +3191095296,3191099391,EC +3191099392,3191103487,AR +3191103488,3191107583,VE +3191107584,3191108271,PE +3191108272,3191108287,MX +3191108288,3191108959,PE +3191108960,3191108991,CO +3191108992,3191109119,PE +3191109120,3191111167,MX +3191111168,3191111679,PE +3191111680,3191128063,PY +3191128064,3191132159,EC +3191132160,3191136255,AR +3191136256,3191144447,DO +3191144448,3191152639,SV +3191152640,3191155711,NI +3191155712,3191156223,SV +3191156224,3191156735,NI +3191156736,3191169023,HN +3191169024,3191193599,SV +3191193600,3191209983,HN +3191209984,3191275519,CL +3191275520,3191341055,AR +3191341056,3191406591,GT +3191406592,3191439359,SV +3191439360,3191455743,EC +3191455744,3191472127,AR +3191472128,3191603199,TT +3191603200,3191603455,CO +3191603456,3191603519,GT +3191603520,3191603647,CO +3191603648,3191603711,SV +3191603712,3191607295,CO +3191607296,3191607551,MX +3191607552,3191610111,CO +3191610112,3191610367,PE +3191610368,3191610879,CO +3191610880,3191611135,PE +3191611136,3191611391,CO +3191611392,3191619583,VE +3191619584,3191619903,CO +3191619904,3191619935,VE +3191619936,3191635967,CO +3191635968,3191652351,AR +3191652352,3191670783,CO +3191670784,3191672831,CL +3191672832,3191673281,CO +3191673282,3191673282,EC +3191673283,3191673343,CO +3191673344,3191674879,CL +3191674880,3191693311,CO +3191693312,3191701503,AR +3191701504,3191709695,CO +3191709696,3191709951,BR +3191709952,3191714815,CO +3191714816,3191715071,AR +3191715072,3191719935,CO +3191719936,3191720015,AR +3191720016,3191720959,CO +3191720960,3191721471,AR +3191721472,3191721983,CO +3191721984,3191722495,AR +3191722496,3191724799,CO +3191724800,3191725311,AR +3191725312,3191732735,CO +3191732736,3191732991,AR +3191732992,3191734271,CO +3191734272,3191799807,SV +3191799808,3191865343,EC +3191865344,3191930879,UY +3191930880,3192389631,CO +3192389632,3192913919,VE +3192913920,3192946687,GY +3192946688,3192979455,DO +3192979456,3193044991,PE +3193044992,3193110527,CL +3193143296,3193176063,TT +3193176064,3193307135,CO +3193307136,3193438207,SV +3193438208,3193503743,CW +3193569280,3193575167,CO +3193575168,3193575295,PE +3193575296,3193575311,CO +3193575312,3193575327,PE +3193575328,3193579263,CO +3193579264,3193579391,EC +3193579392,3193582847,CO +3193582848,3193583103,EC +3193583104,3193590527,CO +3193590528,3193590783,EC +3193590784,3193591807,CO +3193591808,3193592063,EC +3193592064,3193592319,CO +3193592320,3193592575,EC +3193592576,3193595391,CO +3193595392,3193595647,EC +3193595648,3193599743,CO +3193599744,3193599999,EC +3193600000,3193604351,CO +3193604352,3193604607,EC +3193604608,3193606527,CO +3193606528,3193606911,EC +3193606912,3193617151,CO +3193617152,3193617407,EC +3193617408,3193618431,CO +3193618432,3193618559,US +3193618560,3193618943,CO +3193618944,3193619071,EC +3193619072,3193621887,CO +3193621888,3193622271,EC +3193622272,3193622943,CO +3193622944,3193622975,EC +3193622976,3193623039,CO +3193623040,3193623551,EC +3193623552,3193624063,CO +3193624064,3193624575,EC +3193624576,3193625599,CO +3193625600,3193625855,EC +3193625856,3193626623,US +3193626624,3193628671,CO +3193628672,3193628927,EC +3193628928,3193631103,CO +3193631104,3193631231,EC +3193631232,3193634687,CO +3193634688,3193634815,EC +3193634816,3193700351,CL +3193700352,3193724927,HN +3193724928,3193729023,AR +3193729024,3193733119,CU +3193733120,3193735679,AR +3193735680,3193735935,US +3193735936,3193736447,AR +3193736448,3193736959,US +3193736960,3193738239,AR +3193738240,3193739007,US +3193739008,3193739519,AR +3193739520,3193739775,US +3193739776,3193740287,AR +3193740288,3193741055,US +3193741056,3193741311,AR +3193741312,3193741823,US +3193741824,3193743871,AR +3193743872,3193743999,US +3193744000,3193744895,AR +3193744896,3193745151,US +3193745152,3193745279,AR +3193745280,3193745407,US +3193745408,3193749503,AR +3193749504,3193749759,US +3193749760,3193750527,AR +3193750528,3193750783,US +3193750784,3193751295,AR +3193751296,3193751551,US +3193751552,3193752063,AR +3193752064,3193752575,US +3193752576,3193754111,AR +3193754112,3193754239,US +3193754240,3193755007,AR +3193755008,3193755135,US +3193755136,3193765887,AR +3193765888,3193774079,TT +3193775104,3193776127,GY +3193776128,3193777151,AR +3193777152,3193778175,VE +3193778176,3193782271,AR +3193782272,3193798655,TT +3193798656,3193806847,CO +3193806848,3193808895,CR +3193808896,3193809663,US +3193809664,3193810943,CR +3193810944,3193811967,PY +3193815040,3193823231,AR +3193823232,3193827327,CL +3193827328,3193828351,CR +3193829376,3193831423,CR +3193831424,3193864191,DO +3193864192,3193872383,EC +3193872384,3193880575,AR +3193880576,3193896959,VE +3193896960,3193929727,CL +3193929728,3193962495,EC +3193962496,3193987071,CL +3193987072,3193991167,EC +3193991168,3193995263,AR +3193995264,3194028031,CO +3194028032,3194044415,AR +3194044416,3194052607,CO +3194052608,3194056703,TT +3194056704,3194058751,BQ +3194058752,3194060799,AR +3194060800,3194068991,CO +3194068992,3194071039,PA +3194071040,3194072063,CL +3194073088,3194077183,HN +3194077184,3194085375,CO +3194085376,3194093567,VE +3194093568,3194126335,SR +3194126336,3194126591,AR +3194126592,3194126847,NL +3194126848,3194126911,AR +3194126912,3194126975,PE +3194126976,3194127231,AR +3194127232,3194127359,BR +3194127360,3194128127,AR +3194128128,3194128383,BR +3194128384,3194129407,NI +3194129408,3194129663,AR +3194129664,3194129671,BR +3194129672,3194129919,AR +3194129920,3194130047,BR +3194130048,3194130175,CO +3194130176,3194130303,CL +3194130304,3194130431,BR +3194130432,3194130943,AR +3194130944,3194131455,BR +3194131456,3194132991,AR +3194132992,3194133247,CL +3194133248,3194135551,AR +3194135552,3194136063,BR +3194136064,3194136319,AR +3194136320,3194136447,CO +3194136448,3194136575,AR +3194136576,3194137087,BR +3194137088,3194139647,AR +3194139648,3194140159,BR +3194140160,3194142719,CR +3194142720,3194159103,CL +3194159104,3194165247,HN +3194165248,3194175487,SV +3194175488,3194177535,AR +3194177536,3194179583,EC +3194179584,3194181631,AR +3194181632,3194182655,CL +3194182656,3194183679,BO +3194183680,3194187775,UY +3194187776,3194188799,AR +3194188800,3194189823,GT +3194189824,3194191871,CR +3194191872,3194224639,CO +3194224640,3194355711,CL +3194355712,3194363903,SX +3194363904,3194367999,CR +3194368000,3194370047,BO +3194370048,3194372095,PA +3194372096,3194380287,HT +3194380288,3194381311,US +3194381312,3194382335,CA +3194382336,3194388479,US +3194388480,3194396671,PE +3194396672,3194413055,CO +3194413056,3194421247,CL +3194421248,3194428415,AR +3194428416,3194437631,VE +3194437632,3194441727,BO +3194441728,3194445823,AR +3194445824,3194448687,CO +3194448688,3194448695,CL +3194448696,3194449031,CO +3194449032,3194449047,CL +3194449048,3194449175,CO +3194449176,3194449183,PE +3194449184,3194450263,CO +3194450264,3194450271,CL +3194450272,3194451415,CO +3194451416,3194451423,EC +3194451424,3194452375,CO +3194452376,3194452383,PE +3194452384,3194454015,CO +3194454016,3194458111,AR +3194458112,3194462207,CL +3194462208,3194466303,BR +3194466304,3194467327,AR +3194467328,3194468351,DO +3194468352,3194469375,US +3194469376,3194470399,CR +3194470400,3194486783,AR +3194486784,3194494975,BO +3194494976,3194511359,AR +3194511360,3194515455,AW +3194515456,3194519551,GT +3194519552,3194535935,PY +3194535936,3194585087,AR +3194585088,3194589183,HN +3194589184,3194591231,AR +3194591232,3194592255,PA +3194592256,3194593279,GY +3194593280,3194595327,AR +3194595328,3194596351,PA +3194596352,3194597375,HT +3194597376,3194601471,AR +3194601472,3194602495,CW +3194602496,3194610943,AR +3194610944,3194611199,CO +3194611200,3194613503,AR +3194613504,3194613759,CL +3194613760,3194617855,PE +3194617856,3194626047,NI +3194626048,3194630143,AR +3194630144,3194634239,NI +3194634240,3194638335,CR +3194638336,3194640383,AR +3194640384,3194642431,BZ +3194642432,3194646527,AR +3194646528,3194648575,DO +3194648576,3194667007,AR +3194667008,3194675199,GT +3194679296,3194683391,BO +3194683392,3194687487,CU +3194687488,3194691583,CO +3194691584,3194699775,BO +3194699776,3194705919,EC +3194705920,3194707967,CR +3194707968,3194716159,AR +3194716160,3194724351,HN +3194728448,3194729471,CL +3194729472,3194730495,PE +3194730496,3194732543,AR +3194732544,3194736639,BR +3194736640,3194737663,NI +3194737664,3194740735,AR +3194740736,3194742783,CL +3194742784,3194744831,EC +3194744832,3194746879,AR +3194746880,3194748927,BQ +3194748928,3194757119,UY +3194757120,3194765311,AR +3194765312,3194767359,EC +3194767360,3194768383,CR +3194768384,3194769407,AR +3194769408,3194771583,PE +3194771584,3194771591,US +3194771592,3194773503,PE +3194773504,3194781695,BR +3194781696,3194798079,CL +3194798080,3194799103,AR +3194799104,3194804223,GY +3194804224,3194805247,AR +3194805248,3194806271,CR +3194806272,3194814463,AR +3194814464,3194822655,CO +3194822656,3194830847,AR +3194830848,3194838015,BR +3194838016,3194839039,MX +3194839040,3194863615,CO +3194863616,3194871807,HN +3194871808,3194879999,BO +3194880000,3194896383,DO +3194896384,3194904575,CO +3194904576,3194908671,CL +3194908672,3194910719,AR +3194910720,3194925055,CL +3194925056,3194929151,AR +3194929152,3194937343,EC +3194937344,3194945535,AR +3194945536,3194953471,GT +3194953472,3194953599,NI +3194953600,3194953727,GT +3194953728,3194961407,AR +3194961408,3194961663,US +3194961664,3194961919,AR +3194961920,3194970111,EC +3194974208,3194976255,AR +3194976256,3194977279,VE +3194977280,3194978303,AR +3194994688,3195023359,AR +3195023360,3195024383,CL +3195024384,3195025407,UY +3195025408,3195043839,AR +3195056128,3195060223,AR +3195060224,3195061247,US +3195061248,3195062271,AR +3195062272,3195062783,US +3195062784,3195063039,UY +3195063040,3195063295,US +3195063296,3195064319,BR +3195064320,3195066367,PY +3195066368,3195067391,AR +3195067392,3195068415,CR +3195068416,3195076607,CW +3195076608,3195084799,CL +3195084800,3195092991,NI +3195092992,3195097087,DO +3195097088,3195099135,CR +3195099136,3195100159,GT +3195100160,3195101183,PY +3195101184,3195109375,CR +3195109376,3195125759,AR +3195125760,3195133951,PE +3195133952,3195138047,AR +3195138048,3195139071,DO +3195139072,3195140095,CL +3195140096,3195142143,CR +3195142144,3195142655,PA +3195142656,3195142911,VE +3195142912,3195143039,EC +3195143040,3195143167,UY +3195143168,3195143295,GT +3195143296,3195143679,PA +3195143680,3195143935,AR +3195143936,3195144447,PA +3195144448,3195144703,CR +3195144704,3195150335,PA +3195150336,3195158527,CL +3195158528,3195199487,AR +3195199488,3195201535,PY +3195201536,3195203583,AR +3195203584,3195205631,VE +3195205632,3195206655,PE +3195206656,3195207679,CL +3195207680,3195209687,GT +3195209688,3195209695,PR +3195209696,3195211775,GT +3195211776,3195214847,BZ +3195214848,3195215103,RU +3195215104,3195215871,BZ +3195215872,3195224063,AR +3195232256,3195236351,CR +3195236352,3195240447,AR +3195240448,3195256831,HT +3195256832,3195265023,AR +3195265024,3195273215,CO +3195273216,3195535359,PE +3195535360,3195543551,SV +3195547648,3195551743,AR +3195551744,3195559935,EC +3195559936,3195568127,AR +3195568128,3195572223,CO +3195572224,3195576319,AR +3195576320,3195580415,CL +3195580416,3195584511,AR +3195584512,3195592703,HT +3195592704,3195596799,PA +3195596800,3195597823,CR +3195597824,3195598847,AR +3195598848,3195600895,VE +3195600896,3195633663,CL +3195633664,3195641855,CO +3195641856,3195645951,PY +3195645952,3195650047,AR +3195650048,3195654143,GT +3195654144,3195658239,CW +3195658240,3195662335,VE +3195662336,3195666431,CW +3195666432,3195691007,AR +3195691008,3195699199,DO +3195699200,3195707391,AR +3195707392,3195711487,PA +3195711488,3195712511,SV +3195712512,3195713535,AR +3195713536,3195714559,GT +3195714560,3195715583,PA +3195715584,3195721727,AR +3195721728,3195723775,VE +3195723776,3195731967,AR +3195731968,3195736063,EC +3195736064,3195737087,BQ +3195737088,3195738111,CW +3195738112,3195740159,HN +3195740160,3195741055,PA +3195741056,3195741087,HN +3195741088,3195744255,PA +3195744256,3195748351,EC +3195748352,3195752447,CL +3195752448,3195763711,AR +3195763712,3195764735,BO +3195764736,3195768831,CR +3195768832,3195772927,AR +3195772928,3195781119,VE +3195781120,3195782143,BR +3195782144,3195783167,PA +3195783168,3195784191,BR +3195784192,3195785215,PA +3195785216,3195785311,HN +3195785312,3195785343,CA +3195785344,3195785375,HN +3195785376,3195785439,DE +3195785440,3195785735,HN +3195785736,3195785743,GB +3195785744,3195785815,HN +3195785816,3195785823,DE +3195785824,3195786015,HN +3195786016,3195786023,ES +3195786024,3195786191,HN +3195786192,3195786199,US +3195786200,3195786239,HN +3195786240,3195786287,US +3195786288,3195786295,ES +3195786296,3195786479,US +3195786480,3195786487,CA +3195786488,3195786751,US +3195786752,3195787127,HN +3195787128,3195787135,DE +3195787136,3195787215,HN +3195787216,3195787231,US +3195787232,3195787263,HN +3195787264,3195787607,US +3195787608,3195787615,DE +3195787616,3195787775,US +3195787776,3195788159,HN +3195788160,3195788167,CA +3195788168,3195788415,HN +3195788416,3195788423,US +3195788424,3195788919,HN +3195788920,3195788927,CA +3195788928,3195789087,HN +3195789088,3195789119,CA +3195789120,3195789311,HN +3195789312,3195793407,PA +3195793408,3195801599,AR +3195801600,3195803647,HN +3195803648,3195804671,CL +3195804672,3195805695,VE +3195805696,3195807743,NI +3195807744,3195807999,US +3195808000,3195808383,BZ +3195808384,3195808639,US +3195808640,3195808767,BZ +3195808768,3195808895,US +3195808896,3195809407,BZ +3195809408,3195809535,US +3195809536,3195809791,BZ +3195809792,3195811839,PE +3195811840,3195813887,AR +3195813888,3195822079,DO +3195822080,3195830271,CO +3195830272,3195838463,AR +3195838464,3195840511,HN +3195840512,3195842559,AR +3195842560,3195846655,BR +3195846656,3195852799,AR +3195852800,3195853823,SX +3195853824,3195854847,GY +3195854848,3195859967,AR +3195859968,3195862015,CR +3195863040,3196092415,CO +3196092416,3196097113,PY +3196097114,3196097114,IL +3196097115,3196125183,PY +3196125184,3196190719,BO +3196190720,3196207103,HN +3196207104,3196223487,CO +3196223488,3196305407,EC +3196305408,3196317055,CO +3196317056,3196317183,CW +3196317184,3196321791,CO +3196321792,3196583935,UY +3196583936,3196846079,AR +3196846080,3196977151,PA +3196977152,3197042687,VE +3197042688,3197075455,CO +3197075456,3197108223,GT +3197108224,3197370367,CO +3197370368,3197501439,GT +3197501440,3197566975,SV +3197566976,3197599743,CL +3197599744,3197600767,GT +3197600768,3197601791,CR +3197601792,3197612031,AR +3197612032,3197616127,SV +3197616128,3197632511,CO +3197632512,3197698047,EC +3197698048,3197730815,VE +3197730816,3197763583,CL +3197763584,3197894655,EC +3197894656,3198156799,CO +3198156800,3198484479,CL +3198484480,3198550015,CO +3198550016,3198681087,DO +3198681088,3198877695,VE +3198877696,3198894079,CR +3198894080,3198902271,CO +3198902272,3198910463,CR +3198910464,3198926847,CL +3198926848,3198943231,BO +3198943232,3199467519,AR +3199467520,3199500287,BO +3199500288,3199504383,BR +3199504384,3199505407,AR +3199505408,3199506431,BR +3199506432,3199508479,AR +3199508480,3199516671,BR +3199516672,3199533055,CL +3199533056,3199549439,BO +3199549440,3199565823,AR +3199565824,3199582207,NI +3199582208,3199598591,HN +3199598592,3199631359,CO +3199631360,3199729663,AR +3199729664,3199762431,NI +3199762432,3199778815,CO +3199778816,3199779839,AR +3199779840,3199780735,CR +3199780736,3199780863,US +3199780864,3199782911,CO +3199782912,3199784959,AR +3199784960,3199785983,EC +3199785984,3199795199,AR +3199795200,3199811583,CW +3199811584,3199819775,SX +3199819776,3199820799,CR +3199820800,3199822847,AR +3199822848,3199823711,HN +3199823712,3199823719,CL +3199823720,3199827967,HN +3199827968,3199860735,AR +3199860736,3199926271,BO +3199926272,3199991807,PE +3199991808,3200516095,AR +3200516096,3200565247,CL +3200565248,3200569343,HT +3200569344,3200573439,CL +3200573440,3200577535,AR +3200577536,3200578559,BR +3200578560,3200579583,EC +3200579584,3200581631,AR +3200581632,3200614399,BZ +3200614400,3200647167,AR +3200647168,3201302527,VE +3201302528,3201433599,CL +3201433600,3201441791,AR +3201441792,3201442047,US +3201442048,3201499135,AR +3201499136,3201515519,CL +3201515520,3201522687,AR +3201522688,3201531903,CR +3201531904,3201533951,AR +3201533952,3201534975,HN +3201534976,3201535999,CO +3201536000,3201540095,AR +3201540096,3201544191,CL +3201544192,3201548287,DO +3201548288,3201556479,AR +3201556480,3201560575,BO +3201560576,3201561599,PY +3201561600,3201562623,AR +3201562624,3201563647,CL +3201563648,3201563903,CH +3201563904,3201564159,DE +3201564160,3201564415,GB +3201564416,3201564671,NL +3201564672,3201630207,NI +3201630208,3201695743,TT +3201695744,3201761279,EC +3201761280,3201826815,CL +3201826816,3201851391,AR +3201851392,3201855487,EC +3201855488,3201859583,PE +3201859584,3201863679,CO +3201863680,3201865727,CL +3201865728,3201867775,CO +3201867776,3201869831,PE +3201869832,3201870495,AR +3201870496,3201870527,PE +3201870528,3201870815,AR +3201870816,3201870831,PE +3201870832,3201870911,AR +3201870912,3201870959,PE +3201870960,3201870975,AR +3201870976,3201871615,PE +3201871616,3201871695,AR +3201871696,3201871703,PE +3201871704,3201871823,AR +3201871824,3201871839,PE +3201871840,3201871871,AR +3201871872,3201875967,PE +3201875968,3201880063,CO +3201880064,3201884159,EC +3201884160,3201889279,VE +3201889280,3201889535,US +3201889536,3201894399,VE +3201894400,3201904639,AR +3201904640,3201908735,CO +3201908736,3201916927,AR +3201916928,3201917695,CO +3201917696,3201917859,AR +3201917860,3201917863,CO +3201917864,3201917879,AR +3201917880,3201917887,CO +3201917888,3201917951,AR +3201917952,3201920063,CO +3201920064,3201920064,AR +3201920065,3201920068,CO +3201920069,3201920639,AR +3201920640,3201920655,CO +3201920656,3201921279,AR +3201921280,3201921535,CO +3201921536,3201924863,AR +3201924864,3201924991,PA +3201924992,3201925119,AR +3201925120,3201957887,CL +3201957888,3202088959,PA +3202088960,3202127999,AR +3202128000,3202128015,CW +3202128016,3202215167,AR +3202215168,3202215295,PY +3202215296,3202220031,AR +3202220032,3202351103,PE +3202351104,3202875391,AR +3202875392,3203399679,PE +3203399680,3203465215,CO +3203465216,3203530751,CR +3203530752,3203531519,CO +3203531520,3203531775,PA +3203531776,3203532799,CO +3203532800,3203534847,PA +3203534848,3203535871,CO +3203535872,3203536383,PA +3203536384,3203536895,CO +3203536896,3203537919,HN +3203537920,3203538431,GT +3203538432,3203538687,PA +3203538688,3203538943,CO +3203538944,3203539967,BZ +3203539968,3203543551,CO +3203543552,3203544575,GT +3203544576,3203545087,CO +3203545088,3203545599,GT +3203545600,3203547135,CO +3203547136,3203549183,PA +3203549184,3203553279,CO +3203553280,3203553535,CR +3203553536,3203556863,CO +3203556864,3203557119,DO +3203557120,3203561983,CO +3203561984,3203562495,SV +3203562496,3203564543,CO +3203564544,3203564799,DO +3203564800,3203565055,CO +3203565056,3203566079,CR +3203566080,3203566591,CO +3203566592,3203566847,PA +3203566848,3203567103,DO +3203567104,3203568639,CO +3203568640,3203569663,SV +3203569664,3203570303,CO +3203570304,3203570431,SV +3203570432,3203570607,CO +3203570608,3203570623,CR +3203570624,3203571199,CO +3203571200,3203571711,SV +3203571712,3203571967,CO +3203571968,3203572223,SV +3203572224,3203661823,CO +3203661824,3203923967,AR +3203923968,3204448255,CO +3204448256,3208642559,BR +3208642560,3209412607,CO +3209412608,3209413631,US +3209413632,3209691135,CO +3209691136,3210084351,AR +3210084352,3210215423,BR +3210215424,3210739711,CO +3210739712,3210739967,US +3210739968,3210740223,MX +3210740224,3210740479,AR +3210740480,3210740735,US +3210740736,3210742015,BR +3210742016,3210742031,IT +3210742032,3210742047,BR +3210742048,3210742063,CL +3210742064,3210742079,US +3210742080,3210742143,BR +3210742144,3210742527,CL +3210742528,3210742543,KR +3210742544,3210742560,CL +3210742561,3210742561,BR +3210742562,3210742567,CL +3210742568,3210742575,US +3210742576,3210742591,BR +3210742592,3210742783,FR +3210742784,3210743039,CL +3210743040,3210743055,GR +3210743056,3210743079,CL +3210743080,3210743087,US +3210743088,3210743103,CL +3210743104,3210743295,FR +3210743296,3210743551,US +3210743552,3210743567,TH +3210743568,3210743615,BR +3210743616,3210743679,FR +3210743680,3210743807,BR +3210743808,3210744063,US +3210744064,3210744079,TR +3210744080,3210744087,BR +3210744088,3210744095,CL +3210744096,3210744127,BR +3210744128,3210744191,FR +3210744192,3210744255,US +3210744256,3210744319,BR +3210744320,3210744575,US +3210744576,3210744591,BE +3210744592,3210744607,BR +3210744608,3210744703,CL +3210744704,3210744831,US +3210744832,3210744863,NZ +3210744864,3210745087,BR +3210745088,3210745343,US +3210745344,3210745359,RU +3210745360,3210745375,BR +3210745376,3210745407,CL +3210745408,3210745471,BR +3210745472,3210745599,DE +3210745600,3210745855,US +3210745856,3210745871,IT +3210745872,3210745919,BR +3210745920,3210746047,US +3210746048,3210746111,BR +3210746112,3210746367,US +3210746368,3210746383,SE +3210746384,3210746495,BR +3210746496,3210746879,US +3210746880,3210746895,CH +3210746896,3210746943,CL +3210746944,3210747135,BR +3210747136,3210748159,US +3210748160,3210748175,JP +3210748176,3210748191,BR +3210748192,3210748287,CL +3210748288,3210748351,US +3210748352,3210748415,BR +3210748416,3210748671,GB +3210748672,3210748927,CL +3210748928,3210752255,US +3210752256,3210752511,SG +3210752512,3210755839,US +3210755840,3210755855,MY +3210755856,3210756095,BR +3210756096,3210756351,SG +3210756352,3210756607,US +3210756608,3210756863,DE +3210756864,3210757119,RU +3210757120,3210757631,US +3210757632,3210758143,BR +3210758144,3210758911,US +3210758912,3210759167,GH +3210759168,3210764031,US +3210764032,3210764047,IE +3210764048,3210764063,BR +3210764064,3210764095,CL +3210764096,3210764287,BR +3210764288,3210764543,US +3210764544,3210764799,CA +3210764800,3210765055,US +3210765056,3210765071,SE +3210765072,3210765311,BR +3210765312,3210765567,CL +3210765568,3210765823,US +3210765824,3210766079,ES +3210766080,3210766335,CL +3210766336,3210766591,US +3210766592,3210766847,CL +3210766848,3210767103,US +3210767104,3210767359,CL +3210767360,3210768383,US +3210768384,3210768639,NL +3210768640,3210768895,MD +3210768896,3210769151,US +3210769152,3210769407,NL +3210769408,3210770943,US +3210770944,3210771199,AU +3210771200,3210771215,TH +3210771216,3210771263,CL +3210771264,3210771455,BR +3210771456,3210772479,US +3210772480,3210772735,CL +3210772736,3210773247,US +3210773248,3210773503,MY +3210773504,3210773519,PL +3210773520,3210773759,BR +3210773760,3210774271,US +3210774272,3210774287,NO +3210774288,3210774399,BR +3210774400,3210774527,CL +3210774528,3210774783,US +3210774784,3210774799,IT +3210774800,3210774815,BR +3210774816,3210774847,CL +3210774848,3210775039,BR +3210775040,3210775295,US +3210775296,3210775311,CH +3210775312,3210775327,BR +3210775328,3210775551,CL +3210775552,3210775807,US +3210775808,3210775935,CL +3210775936,3210776063,BR +3210776064,3210776191,CL +3210776192,3210776319,BR +3210776320,3210776575,US +3210776576,3210776703,CL +3210776704,3210776831,BR +3210776832,3210777087,MX +3210777088,3210777215,CL +3210777216,3210777343,BR +3210777344,3210777471,CL +3210777472,3210777599,BR +3210777600,3210778367,US +3210778368,3210778623,IE +3210778624,3210781951,US +3210781952,3210782207,IT +3210782208,3210782975,US +3210782976,3210782991,TR +3210782992,3210783039,CL +3210783040,3210783231,BR +3210783232,3210783487,US +3210783488,3210783503,JP +3210783504,3210783551,CL +3210783552,3210783743,BR +3210783744,3210783999,US +3210784000,3210784015,JP +3210784016,3210784063,CL +3210784064,3210784255,BR +3210784256,3210784511,US +3210784512,3210784527,BE +3210784528,3210784575,CL +3210784576,3210784767,BR +3210784768,3210785791,US +3210785792,3210786047,BR +3210786048,3210786063,AU +3210786064,3210786111,CL +3210786112,3210786303,BR +3210786304,3210786559,US +3210786560,3210786575,GR +3210786576,3210786591,BR +3210786592,3210786623,CL +3210786624,3210786687,BR +3210786688,3210786815,CL +3210786816,3210787071,BR +3210787072,3210788351,US +3210788352,3210788607,MX +3210788608,3210788863,US +3210788864,3210789119,HR +3210789120,3210792959,US +3210792960,3210793471,GB +3210793472,3210795007,US +3210795008,3210796031,IL +3210796032,3210798847,US +3210798848,3210799103,ES +3210799104,3210802431,US +3210802432,3210802687,ES +3210802688,3210802943,US +3210802944,3210803039,CL +3210803040,3210803055,AU +3210803056,3210803071,CL +3210803072,3210803087,US +3210803088,3210803199,CL +3210803200,3210803201,US +3210803202,3210803455,BR +3210803456,3210803591,RU +3210803592,3210803592,IL +3210803593,3210803711,RU +3210803712,3210804479,DE +3210804480,3210805247,US +3210805248,3210809343,PA +3210809344,3210810367,VE +3210810368,3210811391,PA +3210811392,3210817535,AR +3210817536,3210821631,PE +3210821632,3210822655,EC +3210822656,3210825727,AR +3210825728,3210827775,BZ +3210827776,3210829823,DO +3210829824,3210830847,AR +3210830848,3210831359,PE +3210831360,3210831871,BR +3210831872,3210832895,DO +3210832896,3210835967,AR +3210835968,3210838015,PY +3210838016,3210868735,AR +3210868736,3210870527,US +3210870528,3210870783,AR +3210870784,3210903551,CO +3210903552,3210919935,PE +3210919936,3210920959,GT +3210920960,3210921983,PA +3210921984,3210924031,CL +3210924032,3210926079,DO +3210926080,3210928127,AR +3210928128,3210936319,NI +3210936320,3211067391,EC +3211067392,3211071487,US +3211071488,3211071743,NL +3211071744,3211071999,DE +3211072000,3211072027,US +3211072028,3211072057,BR +3211072058,3211072127,US +3211072128,3211072255,BR +3211072256,3211072287,US +3211072288,3211072319,NZ +3211072320,3211072511,BR +3211072512,3211073023,NL +3211073024,3211073279,GB +3211073280,3211073535,FR +3211073536,3211074047,US +3211074048,3211074303,CL +3211074304,3211074559,ES +3211074560,3211074815,NL +3211074816,3211075071,US +3211075072,3211075325,DK +3211075326,3211075326,CL +3211075327,3211075327,DK +3211075328,3211075583,NL +3211075584,3211076095,US +3211076096,3211076607,LT +3211076608,3211077631,SG +3211077632,3211079935,US +3211079936,3211080191,NG +3211080192,3211080703,US +3211080704,3211080959,GB +3211080960,3211081215,IQ +3211081216,3211081727,GB +3211081728,3211082239,HK +3211082240,3211082495,BN +3211082496,3211082751,GB +3211082752,3211083007,SG +3211083008,3211083263,US +3211083264,3211083519,BR +3211083520,3211083775,HK +3211083776,3211083791,RU +3211083792,3211083839,CL +3211083840,3211083855,GB +3211083856,3211083903,DE +3211083904,3211084031,FR +3211084032,3211084287,DE +3211084288,3211084303,NL +3211084304,3211084351,CL +3211084352,3211084367,GB +3211084368,3211084383,DE +3211084384,3211084559,CL +3211084560,3211084575,DE +3211084576,3211084671,CL +3211084672,3211084799,BY +3211084800,3211084815,AT +3211084816,3211084863,DE +3211084864,3211084879,GB +3211084880,3211085311,DE +3211085312,3211085327,GB +3211085328,3211085375,CL +3211085376,3211085391,GB +3211085392,3211085407,DE +3211085408,3211085583,CL +3211085584,3211085599,DE +3211085600,3211085695,CL +3211085696,3211085823,GE +3211085824,3211085839,TH +3211085840,3211085887,DE +3211085888,3211085903,GB +3211085904,3211086335,DE +3211086336,3211086351,FR +3211086352,3211086367,DE +3211086368,3211086463,CL +3211086464,3211086591,DE +3211086592,3211086607,CL +3211086608,3211086623,DE +3211086624,3211086847,CL +3211086848,3211086863,PL +3211086864,3211087359,DE +3211087360,3211087375,GB +3211087376,3211087871,DE +3211087872,3211087887,ES +3211087888,3211087999,DE +3211088000,3211088127,US +3211088128,3211088383,DE +3211088384,3211088399,BE +3211088400,3211088895,DE +3211088896,3211088911,DK +3211088912,3211089407,DE +3211089408,3211089423,GB +3211089424,3211089535,DE +3211089536,3211089663,US +3211089664,3211089919,DE +3211089920,3211089935,GB +3211089936,3211090431,DE +3211090432,3211090447,GR +3211090448,3211090943,DE +3211090944,3211090959,TR +3211090960,3211091071,DE +3211091072,3211091199,US +3211091200,3211091455,DE +3211091456,3211091471,FI +3211091472,3211091967,DE +3211091968,3211091983,RU +3211091984,3211092479,DE +3211092480,3211092495,BE +3211092496,3211092607,DE +3211092608,3211092735,US +3211092736,3211092991,DE +3211092992,3211093007,SK +3211093008,3211093503,DE +3211093504,3211093519,HR +3211093520,3211093791,DE +3211093792,3211093807,IN +3211093808,3211094015,DE +3211094016,3211094031,CZ +3211094032,3211094079,DE +3211094080,3211094095,GB +3211094096,3211094143,DE +3211094144,3211094271,US +3211094272,3211094527,DE +3211094528,3211094543,HR +3211094544,3211095039,DE +3211095040,3211095055,ES +3211095056,3211095551,DE +3211095552,3211095567,GB +3211095568,3211095679,DE +3211095680,3211095807,US +3211095808,3211096063,DE +3211096064,3211096079,GB +3211096080,3211097103,DE +3211097104,3211097151,GB +3211097152,3211097215,DE +3211097216,3211097343,GB +3211097344,3211097599,DE +3211097600,3211097855,US +3211097856,3211098111,DE +3211098112,3211098367,US +3211098368,3211098383,CL +3211098384,3211098399,DE +3211098400,3211098623,CL +3211098624,3211098879,DE +3211098880,3211098895,CL +3211098896,3211098911,DE +3211098912,3211099135,CL +3211099136,3211099679,DE +3211099680,3211099711,GB +3211099712,3211099775,DE +3211099776,3211099903,GB +3211099904,3211100159,DE +3211100160,3211101951,US +3211101952,3211102207,SG +3211102208,3211102335,AU +3211102336,3211102463,BR +3211102464,3211102591,AU +3211102592,3211102719,BR +3211102720,3211102847,AU +3211102848,3211102975,BR +3211102976,3211103103,AU +3211103104,3211103231,BR +3211103232,3211104447,AU +3211104448,3211104511,BR +3211104512,3211104703,AU +3211104704,3211104767,BR +3211104768,3211105279,GB +3211105280,3211105791,US +3211105792,3211106303,ES +3211106304,3211109375,US +3211109376,3211109887,DE +3211109888,3211111167,US +3211111168,3211111423,KR +3211111424,3211112447,JP +3211112448,3211112959,US +3211112960,3211113215,CL +3211113216,3211113471,SG +3211113472,3211113727,GB +3211113728,3211113983,LT +3211113984,3211114239,US +3211114240,3211114495,CL +3211114496,3211116031,US +3211116032,3211116287,RU +3211116288,3211118079,US +3211118080,3211118335,VE +3211118336,3211118591,US +3211118592,3211118847,BO +3211118848,3211119103,UY +3211119104,3211120639,US +3211120640,3211121663,AU +3211121664,3211129087,US +3211129088,3211129343,AT +3211129344,3211129599,SG +3211129600,3211129855,NL +3211129856,3211129983,HK +3211129984,3211130111,CL +3211130112,3211130367,US +3211130368,3211130623,GR +3211130624,3211130879,TR +3211130880,3211131391,US +3211131392,3211131903,NL +3211131904,3211132927,SG +3211132928,3211137023,CO +3211137024,3211141119,AR +3211141120,3211142143,CL +3211142144,3211143167,CR +3211143168,3211145215,AR +3211145216,3211147263,NI +3211147264,3211148287,CR +3211148288,3211165695,CO +3211165696,3211165727,HN +3211165728,3211165735,UY +3211165736,3211165951,HN +3211165952,3211165983,UY +3211165984,3211166415,HN +3211166416,3211166431,UY +3211166432,3211166559,HN +3211166560,3211166567,UY +3211166568,3211167487,HN +3211167488,3211167503,US +3211167504,3211167519,HN +3211167520,3211167527,US +3211167528,3211167927,HN +3211167928,3211167935,US +3211167936,3211168767,HN +3211168768,3211169023,US +3211169024,3211169279,HN +3211169280,3211169535,US +3211169536,3211171071,HN +3211171072,3211171327,US +3211171328,3211171487,HN +3211171488,3211171503,ES +3211171504,3211171511,HN +3211171512,3211171519,ES +3211171520,3211171791,HN +3211171792,3211171807,ES +3211171808,3211171839,HN +3211171840,3211172047,US +3211172048,3211172063,NL +3211172064,3211172271,US +3211172272,3211172279,NL +3211172280,3211172351,US +3211172352,3211172607,HN +3211172608,3211172623,NL +3211172624,3211172671,HN +3211172672,3211172687,NL +3211172688,3211173183,HN +3211173184,3211173199,NL +3211173200,3211173279,HN +3211173280,3211173295,NL +3211173296,3211173887,HN +3211173888,3211174183,US +3211174184,3211174191,CA +3211174192,3211174415,US +3211174416,3211174431,CA +3211174432,3211174687,US +3211174688,3211174703,CA +3211174704,3211174719,US +3211174720,3211174735,CA +3211174736,3211175199,US +3211175200,3211175215,BR +3211175216,3211175295,US +3211175296,3211175327,BR +3211175328,3211177831,US +3211177832,3211177847,CR +3211177848,3211177983,US +3211177984,3211178583,HN +3211178584,3211178591,ES +3211178592,3211178671,HN +3211178672,3211178703,ES +3211178704,3211179087,HN +3211179088,3211179103,US +3211179104,3211179199,HN +3211179200,3211179231,US +3211179232,3211180047,HN +3211180048,3211180063,BR +3211180064,3211180103,HN +3211180104,3211180111,BR +3211180112,3211180543,HN +3211180544,3211180687,US +3211180688,3211180695,BR +3211180696,3211180799,US +3211180800,3211180887,HN +3211180888,3211180895,CR +3211180896,3211181119,HN +3211181120,3211181135,CR +3211181136,3211181215,HN +3211181216,3211181231,CR +3211181232,3211181439,HN +3211181440,3211181447,CA +3211181448,3211182079,HN +3211182080,3211194367,CO +3211194368,3211195391,DO +3211195392,3211214847,AR +3211214848,3211223039,HN +3211223040,3211227135,AR +3211227136,3211231231,NI +3211231232,3211788287,CO +3211788288,3212312575,CL +3212312576,3212574719,BR +3212574720,3212836863,CL +3212836864,3213885439,BR +3213885440,3214934015,CO +3214934016,3217340159,BR +3217340160,3217340415,CL +3217340416,3219653127,BR +3219653128,3219653135,US +3219653136,3219653247,BR +3219653248,3219653375,HK +3219653376,3219653715,BR +3219653716,3219653716,US +3219653717,3219673087,BR +3219673088,3219673151,US +3219673152,3219673983,BR +3219673984,3219674015,SG +3219674016,3219687679,BR +3219687680,3219687935,US +3219687936,3219688447,IE +3219688448,3219688703,HK +3219688704,3219720191,BR +3219720192,3219724287,US +3219724288,3219726335,BR +3219726336,3219734527,JP +3219734528,3219750911,NL +3219750912,3219755007,BR +3219755008,3219755279,US +3219755280,3219757055,BR +3219757056,3219765247,US +3219765248,3219783743,BR +3219783744,3219783751,HK +3219783752,3219783935,BR +3219783936,3219784191,US +3219784192,3219784703,HK +3219784704,3219787775,BR +3219787776,3219791871,HK +3219791872,3219800063,US +3219800064,3219800575,BR +3219800576,3219800591,US +3219800592,3219800607,IE +3219800608,3219802148,BR +3219802149,3219802149,US +3219802150,3219802175,BR +3219802176,3219802303,US +3219802304,3219802367,BR +3219802368,3219802399,US +3219802400,3219802431,BR +3219802432,3219802495,US +3219802496,3219802623,BR +3219802624,3219802639,NL +3219802640,3219819007,BR +3219819008,3219819519,JP +3219819520,3219837439,BR +3219837440,3219837695,US +3219837696,3219838497,BR +3219838498,3219838498,US +3219838499,3219851263,BR +3219851264,3219853311,US +3219853312,3219881983,BR +3219881984,3219899391,IE +3219899392,3219902463,BR +3219902464,3219906559,IE +3219906560,3219914495,BR +3219914496,3219914751,IE +3219914752,3220029439,US +3220029440,3220030207,IE +3220030208,3220030463,BR +3220030464,3220030719,IE +3220030720,3220033535,BR +3220033536,3220037631,IE +3220037632,3220039679,US +3220039680,3220040703,NL +3220040704,3220040959,JP +3220040960,3220041215,BR +3220041216,3220041471,HK +3220041472,3220041727,BR +3220041728,3220042239,JP +3220042240,3220042751,BR +3220042752,3220043775,US +3220043776,3220045823,BR +3220045824,3220062207,US +3220062208,3220062719,SG +3220062720,3220063231,AU +3220063232,3220063743,JP +3220063744,3220066303,US +3220066304,3220070399,JP +3220070400,3220078591,IE +3220078592,3220080639,BR +3220080640,3220094975,US +3220094976,3220103167,BR +3220103168,3220127743,US +3220127744,3220135935,AU +3220135936,3220140031,JP +3220140032,3220144127,BR +3220144128,3220152319,JP +3220152320,3220161535,AU +3220161536,3220161807,US +3220161808,3220162559,BR +3220162560,3220163583,NL +3220163584,3220164607,BR +3220164608,3220168703,IE +3220168704,3220172799,US +3220172800,3221196100,BR +3221196101,3221196101,US +3221196102,3221225471,BR +3221226240,3221226495,US +3221226496,3221227519,KY +3221227520,3221243135,US +3221243136,3221243391,DE +3221243392,3221243647,US +3221243648,3221243903,SG +3221243904,3221258239,US +3221258240,3221291007,CA +3221291008,3221334269,US +3221334270,3221334270,DZ +3221334271,3221415935,US +3221415936,3221416191,RU +3221416192,3221464063,US +3221464064,3221464319,BD +3221464320,3221469175,US +3221469176,3221469183,CA +3221469184,3221470463,US +3221470464,3221470719,RO +3221470720,3221471487,US +3221471488,3221471743,RO +3221471744,3221474919,US +3221474920,3221474927,GB +3221474928,3221477375,US +3221477376,3221477631,RO +3221477632,3221560319,US +3221560320,3221561087,GB +3221561088,3221562367,US +3221562368,3221562623,SE +3221562624,3221565951,US +3221565952,3221566207,NL +3221566208,3221568255,US +3221568256,3221568511,NL +3221568512,3221568767,US +3221568768,3221569279,FR +3221569280,3221576191,US +3221576192,3221576447,AU +3221576448,3221577727,US +3221577728,3221577983,CA +3221577984,3221578239,NL +3221578240,3221578313,US +3221578314,3221578314,JP +3221578315,3221589503,US +3221589504,3221589759,FR +3221589760,3221590015,US +3221590016,3221590271,CA +3221590272,3221590527,DE +3221590528,3221594623,US +3221594624,3221594879,AT +3221594880,3221605375,US +3221605376,3221605887,CA +3221605888,3221608447,US +3221608448,3221608703,AU +3221608704,3221609119,US +3221609120,3221609151,CH +3221609152,3221614335,US +3221614336,3221614591,GB +3221614592,3221614847,AU +3221614848,3221618175,US +3221618176,3221618431,GB +3221618432,3221618687,US +3221618688,3221618943,GB +3221618944,3221647103,US +3221647104,3221647359,FR +3221647360,3221656831,US +3221656832,3221657087,AU +3221657088,3221757951,US +3221757952,3221759999,MY +3221760000,3221761023,IN +3221761024,3221779455,US +3221779456,3221780479,IN +3221780480,3221790719,US +3221790720,3221795071,IN +3221795072,3221795583,US +3221795584,3221796095,IN +3221796096,3221796351,US +3221796352,3221796607,IN +3221796608,3221796863,US +3221796864,3221815295,IN +3221815296,3222011903,US +3222011904,3222012159,CA +3222012160,3222012415,GB +3222012416,3222023935,US +3222023936,3222024191,IT +3222024192,3222025727,US +3222025728,3222025983,NL +3222025984,3222027775,US +3222027776,3222028031,CA +3222028032,3222030335,US +3222030336,3222030847,GB +3222030848,3222031359,US +3222031360,3222031615,AU +3222031616,3222031871,IT +3222031872,3222032639,US +3222032640,3222032895,DE +3222032896,3222036479,US +3222036480,3222036735,FR +3222036736,3222036991,US +3222036992,3222037247,CA +3222037248,3222037503,GB +3222037504,3222040575,US +3222040576,3222041599,BR +3222042624,3222044927,US +3222044928,3222045183,CA +3222045184,3222055935,US +3222056192,3222056447,US +3222056448,3222059007,CA +3222059008,3222061055,US +3222061056,3222061823,IT +3222061824,3222066943,US +3222066944,3222067199,CA +3222067200,3222067455,US +3222067456,3222067967,CH +3222067968,3222071039,US +3222071040,3222071295,GB +3222071296,3222071551,PT +3222071552,3222072063,US +3222072064,3222072319,SE +3222072320,3222075135,US +3222075136,3222075391,NL +3222075392,3222208511,US +3222208512,3222274047,AE +3222274048,3222274559,US +3222274560,3222274815,AU +3222274816,3222275071,US +3222275072,3222275583,JP +3222275584,3222277631,US +3222277632,3222278143,IT +3222278144,3222279679,US +3222279680,3222280191,PL +3222280192,3222281215,US +3222281216,3222281727,GB +3222281728,3222284543,US +3222284544,3222285055,BR +3222285056,3222287359,US +3222287360,3222287871,NL +3222287872,3222288383,US +3222288384,3222288895,JP +3222288896,3222305535,US +3222305536,3222309119,SE +3222309120,3222309375,DE +3222309376,3222313727,SE +3222313728,3222316799,CH +3222316800,3222319615,US +3222319616,3222320127,JP +3222320128,3222320383,AU +3222320384,3222320895,US +3222320896,3222326015,NL +3222326016,3222326527,US +3222326528,3222339583,CA +3222339584,3222455039,US +3222455040,3222455295,NL +3222455296,3222524159,US +3222524160,3222524415,JP +3222524416,3222524927,SG +3222524928,3222525183,US +3222525184,3222525439,DE +3222525440,3222806527,US +3222806528,3222814719,CA +3222814720,3222875647,US +3222875648,3222875903,SG +3222875904,3222890751,US +3222890752,3222891007,CA +3222891008,3222936575,US +3222936576,3222940927,CH +3222940928,3222941183,GB +3222941184,3222941695,CH +3222941696,3222952703,US +3222952704,3222952959,AU +3222952960,3222953215,US +3222953216,3222953727,AU +3222953728,3222953983,US +3222953984,3222954239,JP +3222954240,3222956287,US +3222956288,3222962431,FI +3222962432,3222963455,US +3222963456,3222964223,FI +3222964224,3222968831,US +3222968832,3222973951,NL +3222973952,3222979071,DE +3222979072,3222983167,US +3222983168,3222983935,CA +3222983936,3222984447,US +3222984704,3222988543,AU +3222988544,3222988799,PT +3222988800,3222989055,AU +3222989056,3222989311,US +3222989312,3222989567,GB +3222989568,3222989823,CA +3222989824,3222990079,PT +3222990080,3222990591,AT +3222990592,3222990847,PT +3222990848,3223091199,US +3223091200,3223092223,AU +3223092224,3223094271,GB +3223094272,3223201791,US +3223201792,3223202815,PR +3223202816,3223204863,US +3223204864,3223205119,CA +3223205120,3223214079,US +3223214080,3223214591,CA +3223214592,3223216383,US +3223216384,3223217151,CA +3223217152,3223223295,US +3223223296,3223223551,AI +3223223552,3223227903,US +3223227904,3223228159,CA +3223228160,3223229695,US +3223229696,3223229951,CA +3223229952,3223236607,US +3223236608,3223237631,BZ +3223237632,3223243263,US +3223243264,3223243519,CA +3223243520,3223249407,US +3223249408,3223249663,CA +3223249664,3223250943,US +3223250944,3223252991,CA +3223252992,3223258623,US +3223258624,3223258879,CA +3223258880,3223260671,US +3223260672,3223260927,DE +3223260928,3223262719,US +3223262720,3223262975,DE +3223262976,3223263231,BE +3223263232,3223263743,US +3223263744,3223263999,NL +3223264000,3223264255,FR +3223264256,3223265023,US +3223265024,3223265279,NL +3223265280,3223266559,US +3223266560,3223266815,AU +3223266816,3223267327,US +3223267328,3223267583,BE +3223267584,3223270399,US +3223270400,3223271423,CA +3223271424,3223272959,US +3223272960,3223273215,GB +3223273216,3223283199,US +3223283200,3223283455,NL +3223283456,3223286783,US +3223286784,3223289087,JP +3223289088,3223299583,US +3223299584,3223301119,NL +3223301120,3223302399,US +3223302400,3223302655,CA +3223302656,3223303167,US +3223303168,3223303423,CA +3223303424,3223307519,US +3223307520,3223310079,JP +3223310080,3223311103,US +3223311104,3223311359,FR +3223311360,3223315455,US +3223315456,3223315711,CA +3223315712,3223316223,US +3223316224,3223316479,NL +3223316480,3223321343,US +3223321344,3223321599,CA +3223321600,3223321855,FR +3223321856,3223390719,US +3223390720,3223390975,MU +3223390976,3223391999,US +3223392000,3223392255,FR +3223392256,3223392511,GB +3223392512,3223395839,US +3223395840,3223396095,DE +3223396096,3223397375,US +3223397376,3223397631,NL +3223397632,3223410431,US +3223410432,3223416831,CH +3223416832,3223417087,US +3223417088,3223417599,FR +3223417600,3223418367,US +3223418368,3223420927,CH +3223420928,3223421439,US +3223421440,3223421695,GB +3223421696,3223421951,NL +3223421952,3223422719,US +3223422720,3223422975,JP +3223422976,3223424767,US +3223424768,3223425535,FR +3223425536,3223425791,US +3223425792,3223430911,FR +3223430912,3223431423,US +3223431424,3223432191,FR +3223432192,3223433215,US +3223433216,3223435007,FR +3223435008,3223437311,US +3223437312,3223447551,CH +3223447552,3223447807,US +3223447808,3223449599,NL +3223449600,3223453183,US +3223453184,3223453439,DE +3223453440,3223458559,US +3223458560,3223458815,GB +3223458816,3223460351,US +3223460352,3223460863,CA +3223460864,3223462911,US +3223462912,3223463935,CA +3223463936,3223466495,US +3223466496,3223466751,GB +3223466752,3223467007,US +3223467008,3223468031,CA +3223468032,3223471615,US +3223471616,3223471871,CA +3223471872,3223473151,US +3223473152,3223473215,CA +3223473216,3223473231,US +3223473232,3223474175,CA +3223474176,3223477247,US +3223477248,3223478271,CA +3223478272,3223481087,US +3223481088,3223481343,SE +3223481344,3223483391,US +3223483392,3223483647,NL +3223483648,3223499519,US +3223499520,3223499775,FI +3223499776,3223504639,US +3223504640,3223504895,CA +3223504896,3223508991,US +3223508992,3223513087,CA +3223513088,3223514367,US +3223514368,3223514879,GB +3223514880,3223519231,US +3223519232,3223523599,DE +3223523600,3223523600,CH +3223523601,3223524351,DE +3223524352,3223534335,US +3223534336,3223534591,AU +3223534592,3223535359,US +3223535360,3223537919,DE +3223537920,3223542271,US +3223542272,3223542527,DE +3223542528,3223543295,US +3223543296,3223543551,GB +3223543552,3223546879,US +3223546880,3223547135,GB +3223547136,3223552511,US +3223552512,3223553535,NL +3223553536,3223554559,US +3223554560,3223554815,GB +3223554816,3223556095,US +3223556096,3223556351,CA +3223556352,3223556607,US +3223556608,3223556863,IT +3223556864,3223557375,US +3223557376,3223558655,DE +3223558656,3223563263,US +3223563264,3223563519,NL +3223563520,3223566079,US +3223566080,3223568639,NL +3223568640,3223569663,US +3223569664,3223570175,GB +3223570176,3223571711,US +3223572224,3223572479,IE +3223572480,3223577855,US +3223577856,3223578111,DE +3223578112,3223580671,US +3223580672,3223581951,AT +3223581952,3223582207,US +3223582208,3223582212,NL +3223582213,3223582213,PT +3223582214,3223582719,NL +3223582720,3223582975,AU +3223582976,3223584767,US +3223584768,3223585023,GB +3223585024,3223585791,SE +3223585792,3223586047,GB +3223586048,3223586303,SE +3223586304,3223586559,GB +3223586560,3223589119,SE +3223589120,3223589375,US +3223589376,3223594495,SE +3223594496,3223595007,AT +3223595008,3223599103,SE +3223599104,3223599359,AT +3223599360,3223599615,IS +3223599616,3223601663,SE +3223601664,3223602175,GB +3223602176,3223606527,SE +3223606528,3223606783,GB +3223606784,3223607551,SE +3223607552,3223607807,GB +3223607808,3223610367,SE +3223610368,3223610623,IT +3223610624,3223610879,SE +3223610880,3223611135,NO +3223611136,3223611647,SE +3223611648,3223611903,GB +3223611904,3223612927,SE +3223612928,3223613183,FR +3223613184,3223615999,SE +3223616000,3223616767,GB +3223616768,3223617535,SE +3223617536,3223617791,NO +3223617792,3223620863,SE +3223620864,3223621119,DK +3223621120,3223621375,GB +3223621376,3223627775,SE +3223627776,3223628031,DE +3223628032,3223628287,SE +3223628288,3223628543,ES +3223628544,3223630079,SE +3223630080,3223630591,FR +3223630592,3223630847,GB +3223630848,3223634431,SE +3223634432,3223634687,US +3223634688,3223634943,SE +3223634944,3223635455,GB +3223635456,3223637247,SE +3223637248,3223637503,GB +3223637504,3223638271,SE +3223638272,3223638527,GB +3223638528,3223640831,SE +3223640832,3223641087,GB +3223641088,3223644415,SE +3223644416,3223644671,DE +3223644672,3223644927,FR +3223644928,3223646207,SE +3223646208,3223646463,IT +3223646464,3223646975,SE +3223646976,3223647231,IT +3223647232,3223648511,SE +3223648512,3223648767,GB +3223648768,3223650047,SE +3223650048,3223650303,GB +3223650304,3223715839,CH +3223715840,3223781375,DK +3223781376,3223855103,US +3223855104,3223857151,CA +3223857152,3223863807,US +3223863808,3223864319,CA +3223864320,3223864575,US +3223864832,3223865343,HR +3223865344,3223867391,FI +3223867392,3223867647,GB +3223867648,3223867903,CA +3223867904,3223868415,US +3223868416,3223869439,BM +3223869440,3223869695,NO +3223869696,3223869951,DK +3223869952,3223871231,US +3223871232,3223871487,FI +3223871488,3223873535,CA +3223873536,3223881727,US +3223881728,3223882751,CA +3223882752,3223883263,US +3223883264,3223883519,CA +3223883520,3223902463,US +3223902464,3223902719,CA +3223902720,3223905279,US +3223905280,3223905535,FI +3223905536,3223906303,US +3223906304,3223909375,CA +3223909376,3223911935,US +3223911936,3223912191,CA +3223912192,3223938815,US +3223938816,3223946239,GB +3223946240,3223947519,CH +3223947520,3223948287,US +3223948288,3223948543,NL +3223948544,3223949823,CH +3223949824,3223950079,AU +3223950080,3223950335,DE +3223950336,3223950591,CA +3223950592,3223953663,CH +3223953664,3223955967,US +3223955968,3223956223,AU +3223956224,3223958015,US +3223958016,3223963135,JP +3223963136,3223963647,US +3223963648,3223964159,CA +3223964160,3223964415,US +3223964416,3223964671,AU +3223964672,3223965183,US +3223965184,3223965439,AU +3223965440,3223966207,US +3223966208,3223966463,GB +3223966464,3223967743,US +3223967744,3223967999,NL +3223968000,3223968255,US +3223968256,3223968511,NL +3223968512,3223970559,US +3223970560,3223970815,DE +3223970816,3223978239,US +3223978240,3223978495,DE +3223978496,3223979263,US +3223979264,3223979775,CA +3223979776,3223988735,US +3223988736,3223990271,CH +3223990272,3223991295,US +3223991552,3223991807,GB +3223991808,3223992063,CA +3223992064,3223993343,US +3223993344,3223994111,AU +3223994112,3223994623,DE +3223994880,3223995391,US +3223995392,3223995647,CA +3223995648,3223996415,US +3223996416,3223996927,CA +3223996928,3223999487,US +3224000256,3224000511,GB +3224000512,3224001023,US +3224001024,3224001279,CA +3224001280,3224002815,US +3224002816,3224003071,SE +3224003072,3224003327,US +3224003328,3224003583,ZA +3224003584,3224003839,GB +3224003840,3224004095,US +3224004096,3224004351,FR +3224004352,3224005631,JP +3224005632,3224006911,US +3224006912,3224012031,NL +3224012032,3224014591,US +3224014592,3224014847,NL +3224014848,3224016639,US +3224016640,3224016895,AU +3224016896,3224024063,US +3224024064,3224029695,CH +3224029696,3224030463,CA +3224030464,3224030719,US +3224030720,3224030975,CA +3224030976,3224038655,US +3224038656,3224038911,JP +3224038912,3224084735,US +3224084992,3224087551,SE +3224087552,3224090879,US +3224090880,3224091135,AU +3224091136,3224091903,US +3224092160,3224092415,CA +3224092416,3224092671,US +3224092672,3224093951,CH +3224093952,3224094207,US +3224094208,3224094463,AU +3224094464,3224096511,US +3224096512,3224097279,AU +3224097280,3224097535,NL +3224097536,3224097791,US +3224097792,3224098047,NL +3224098048,3224099583,US +3224099584,3224099839,CA +3224099840,3224101375,US +3224101376,3224102399,AU +3224102400,3224103423,US +3224103424,3224103679,GB +3224103680,3224104703,US +3224104704,3224104959,AU +3224104960,3224109055,US +3224109056,3224119551,DE +3224119552,3224126463,FR +3224126464,3224127231,US +3224127232,3224129791,FR +3224129792,3224132351,DE +3224132352,3224170495,US +3224170496,3224173567,SE +3224173568,3224258047,US +3224258048,3224258303,FI +3224258304,3224305663,US +3224305664,3224367615,JP +3224367616,3224368127,US +3224368128,3224369663,CH +3224369664,3224370431,US +3224370432,3224370687,CA +3224370688,3224370943,US +3224370944,3224371199,CA +3224371200,3224373247,US +3224373248,3224373503,AU +3224373504,3224376831,US +3224376832,3224377087,GB +3224377088,3224379135,US +3224379136,3224379391,DE +3224379392,3224398591,US +3224398592,3224398847,DE +3224398848,3224399103,US +3224399104,3224399615,AU +3224399616,3224407295,US +3224407296,3224407551,CA +3224407552,3224408319,US +3224408320,3224408575,DE +3224408576,3224427519,US +3224427520,3224427775,CA +3224427776,3224428543,US +3224428544,3224428799,DE +3224428800,3224428863,US +3224428864,3224428911,SG +3224428912,3224430335,US +3224430336,3224430591,DE +3224430592,3224431103,US +3224431104,3224431359,CA +3224431360,3224435967,US +3224435968,3224436223,ZA +3224436224,3224436735,US +3224436736,3224502271,FI +3224502272,3224567807,JP +3224567808,3224571903,NO +3224571904,3224580095,JP +3224580096,3224580351,US +3224580352,3224616959,JP +3224616960,3224617471,US +3224617472,3224633343,JP +3224633344,3224646399,DE +3224646400,3224651775,US +3224651776,3224652287,AU +3224652288,3224660991,US +3224660992,3224661247,CA +3224661248,3224664063,US +3224672000,3224672255,US +3224672256,3224672511,NL +3224672512,3224674047,US +3224674048,3224674559,DE +3224674560,3224674815,GB +3224674816,3224677119,US +3224677120,3224678655,AU +3224678656,3224689919,US +3224689920,3224690687,NL +3224690688,3224692735,US +3224692736,3224692991,DZ +3224692992,3224694527,US +3224694528,3224694783,CA +3224694784,3224698111,US +3224698112,3224698367,GB +3224698368,3224698623,FR +3224698624,3224699135,US +3224699136,3224699391,BE +3224699392,3224705023,US +3224705024,3224707071,CH +3224707072,3224725247,US +3224725248,3224725503,NL +3224725504,3224725759,CH +3224725760,3224772351,US +3224772352,3224777983,DE +3224777984,3224778239,US +3224779776,3224785151,DE +3224785152,3224791039,US +3224791040,3224791295,DE +3224791296,3224791807,AU +3224791808,3224793343,US +3224793344,3224793599,DE +3224793600,3224793855,US +3224793856,3224795391,DK +3224795392,3224795647,CA +3224795648,3224795903,CH +3224795904,3224796415,US +3224796416,3224797439,DE +3224797440,3224797695,US +3224797696,3224797951,NZ +3224797952,3224798207,US +3224798208,3224798463,CH +3224798464,3224798975,US +3224798976,3224799231,AU +3224799232,3224799487,US +3224799744,3224799999,US +3224800000,3224800255,NL +3224800256,3224800511,US +3224800512,3224816639,FR +3224816640,3224816895,IL +3224816896,3224820735,FR +3224820736,3224820991,PL +3224820992,3224821247,DE +3224821248,3224822015,US +3224822016,3224822271,SE +3224822272,3224826367,US +3224826368,3224826623,CA +3224826624,3224826879,US +3224827136,3224827391,GB +3224827392,3224827647,US +3224827904,3224828671,US +3224828672,3224828927,AU +3224828928,3224829439,US +3224829440,3224829695,DE +3224829696,3224834047,US +3224834048,3224834303,SG +3224834304,3224834559,US +3224834560,3224834815,TH +3224834816,3224851455,US +3224851456,3224851711,NL +3224851712,3224852735,US +3224852736,3224852991,DE +3224852992,3224855039,US +3224855040,3224855551,AU +3224855552,3224855807,US +3224855808,3224856063,IT +3224856064,3224856831,US +3224856832,3224857087,NL +3224857088,3224857855,US +3224857856,3224858111,PL +3224858368,3224858623,US +3224858624,3224858879,AU +3224858880,3224859391,US +3224859392,3224859647,NL +3224859648,3224860159,US +3224860160,3224860415,JP +3224860416,3224860671,CA +3224860672,3224862975,US +3224862976,3224863231,NL +3224863232,3224863487,CA +3224863488,3224863743,US +3224863744,3224863999,GB +3224864000,3224878079,US +3224878080,3224878335,NL +3224878336,3224878591,US +3224878592,3224878847,AU +3224878848,3224879359,US +3224879360,3224879615,NL +3224879616,3224879871,CA +3224879872,3224880383,US +3224880384,3224880639,NL +3224880640,3224880895,AU +3224880896,3224882687,US +3224882688,3224882943,CA +3224882944,3224884223,US +3224884224,3224884479,GB +3224884480,3224885247,US +3224885248,3224885503,CA +3224885504,3224886015,US +3224886016,3224886271,AU +3224886272,3224886527,JP +3224886528,3224887295,US +3224887296,3224887551,CA +3224887552,3224889343,US +3224889344,3224889599,AU +3224889600,3224892415,US +3224892416,3224892671,DE +3224892672,3224899071,US +3224899072,3224899327,AT +3224899328,3224908543,US +3224908544,3224908799,CA +3224908800,3224921087,US +3224921088,3224921343,FI +3224921344,3224928255,US +3224928256,3224928511,FI +3224928512,3224933887,US +3224933888,3224934143,DE +3224934144,3224957951,US +3224957952,3224958207,CA +3224958208,3225028863,US +3225028864,3225031423,JP +3225031424,3225033727,US +3225033728,3225033983,LU +3225033984,3225034239,AE +3225034240,3225034751,FI +3225034752,3225035775,BG +3225035776,3225037055,US +3225037056,3225049599,FI +3225049600,3225057535,US +3225057536,3225057791,CA +3225057792,3225060607,US +3225060608,3225061631,AU +3225061632,3225062399,US +3225062400,3225062911,VC +3225062912,3225063423,LC +3225063424,3225076223,US +3225076224,3225076479,CA +3225076480,3225076991,US +3225076992,3225077247,SE +3225077248,3225081087,US +3225081088,3225081343,CA +3225081344,3225082367,US +3225082368,3225082623,IT +3225082624,3225084415,US +3225084416,3225085183,NL +3225085184,3225085439,ES +3225085440,3225089279,US +3225089280,3225089535,CA +3225089536,3225314303,US +3225314304,3225314559,GB +3225314560,3225420799,US +3225420800,3225423871,CA +3225423872,3225426943,US +3225426944,3225427199,AT +3225427200,3225427455,US +3225427456,3225427967,CA +3225427968,3225428991,US +3225428992,3225431039,CA +3225431040,3225431551,GB +3225431552,3225434111,US +3225434112,3225436159,CA +3225436160,3225445375,US +3225445376,3225446399,BE +3225446400,3225450495,US +3225450496,3225451263,AG +3225451264,3225451519,MS +3225451520,3225452543,US +3225452544,3225456639,CA +3225456640,3225459711,US +3225459712,3225459967,CA +3225459968,3225460991,US +3225460992,3225462015,CA +3225462016,3225468927,US +3225468928,3225470463,CA +3225470464,3225471487,US +3225471488,3225471743,DE +3225471744,3225472255,HK +3225472256,3225498367,US +3225498368,3225503487,NL +3225503488,3225506303,US +3225506304,3225508863,AU +3225508864,3225509631,CH +3225509632,3225509887,US +3225509888,3225510143,NL +3225510144,3225518591,US +3225518592,3225518847,AU +3225518848,3225519103,IT +3225519104,3225519359,NL +3225519360,3225520895,US +3225520896,3225521151,DE +3225521152,3225522175,US +3225522176,3225522943,GB +3225522944,3225524223,US +3225524224,3225524479,VE +3225524480,3225524735,GB +3225524736,3225526271,US +3225526272,3225528319,BB +3225528320,3225528831,US +3225528832,3225529087,VI +3225529088,3225530367,US +3225530368,3225530623,PR +3225530624,3225531903,US +3225531904,3225532159,AU +3225532160,3225535999,CH +3225536000,3225540863,US +3225540864,3225541119,AU +3225541120,3225541375,US +3225541376,3225543935,GB +3225543936,3225544703,US +3225544704,3225546751,CA +3225546752,3225550847,US +3225550848,3225616383,DK +3225616384,3225616639,US +3225616896,3225617151,US +3225617152,3225617407,IE +3225617408,3225617663,GB +3225617664,3225618687,US +3225618688,3225618943,CA +3225618944,3225619455,US +3225619456,3225619711,AU +3225619712,3225624575,US +3225624576,3225625599,CA +3225625600,3225626367,US +3225626368,3225626623,GB +3225626624,3225627391,US +3225627392,3225627647,GB +3225627648,3225627903,US +3225627904,3225628159,CA +3225628160,3225628415,US +3225628416,3225628671,GB +3225628672,3225629183,US +3225629184,3225629439,GB +3225629440,3225629695,US +3225629696,3225629951,GB +3225629952,3225630463,US +3225630464,3225630719,DE +3225630720,3225631231,US +3225631232,3225631487,NL +3225631488,3225635839,US +3225635840,3225636095,PT +3225636096,3225636607,US +3225636608,3225636863,ES +3225636864,3225637887,US +3225637888,3225638143,AU +3225638400,3225638655,US +3225638656,3225638911,GB +3225638912,3225640447,US +3225640448,3225640703,GB +3225640704,3225641983,US +3225641984,3225643263,GB +3225643264,3225643775,CA +3225643776,3225650943,US +3225650944,3225651199,GB +3225651200,3225657343,US +3225658368,3225658879,US +3225659136,3225659391,DE +3225659648,3225659903,US +3225659904,3225660159,DE +3225660160,3225660415,AU +3225660416,3225664767,US +3225664768,3225669887,DE +3225669888,3225671935,US +3225672192,3225672447,DE +3225672448,3225672703,US +3225672704,3225673215,NL +3225673216,3225673471,CA +3225673472,3225673727,GB +3225673728,3225679871,US +3225679872,3225680127,AU +3225680128,3225680383,GR +3225680384,3225680639,CA +3225680640,3225681663,US +3225681664,3225681919,CA +3225681920,3225682943,DE +3225682944,3225683199,AT +3225683200,3225687039,DE +3225687040,3225687807,US +3225687808,3225688063,GB +3225688064,3225689855,US +3225689856,3225694975,NL +3225694976,3225695231,PL +3225695232,3225695487,US +3225695488,3225701119,CA +3225701120,3225701375,US +3225701376,3225709567,NO +3225709568,3225710079,US +3225710592,3225715455,US +3225715456,3225715711,CA +3225715712,3225715967,AU +3225715968,3225716991,US +3225716992,3225717247,CA +3225717248,3225717503,TN +3225717760,3225720575,US +3225720576,3225721343,GB +3225721344,3225723647,US +3225723648,3225723903,CA +3225723904,3225724159,US +3225724160,3225725439,DE +3225725440,3225725695,GB +3225725696,3225726207,AU +3225726208,3225726463,US +3225726464,3225726719,GB +3225726720,3225726975,US +3225726976,3225727231,IT +3225727232,3225727743,US +3225728000,3225728511,US +3225728512,3225728767,NL +3225728768,3225729023,US +3225729024,3225729279,CA +3225729536,3225729791,PT +3225729792,3225730047,US +3225730048,3225730303,CA +3225730304,3225735423,US +3225735424,3225735679,PT +3225735680,3225735935,US +3225735936,3225737215,DE +3225737216,3225737471,PT +3225737472,3225738495,US +3225738496,3225738751,PT +3225738752,3225739263,US +3225739264,3225739519,PT +3225739520,3225740543,US +3225740544,3225740799,CA +3225740800,3225741055,NL +3225741056,3225742079,US +3225742080,3225745919,JP +3225745920,3225746687,NL +3225746688,3225746943,US +3225746944,3225747199,NL +3225747200,3225747711,US +3225747712,3225747967,CA +3225747968,3225757695,US +3225757696,3225758719,CA +3225758720,3225763839,US +3225763840,3225764095,BE +3225764096,3225764863,US +3225764864,3225765887,CA +3225765888,3225766399,US +3225766400,3225766655,CA +3225766656,3225769471,US +3225769472,3225769983,CA +3225769984,3225773311,US +3225773312,3225773567,CA +3225773568,3225776639,US +3225776640,3225777151,CA +3225777152,3225777407,AU +3225777408,3225781247,US +3225781248,3225782271,CA +3225782272,3225807359,US +3225807360,3225807615,DE +3225807616,3225807871,US +3225807872,3225808895,CA +3225808896,3225811711,US +3225811712,3225811967,GB +3225811968,3225812991,US +3225812992,3225843711,FR +3225843712,3225847039,US +3225847040,3225847551,TR +3225847552,3225847807,AU +3225847808,3225848063,IT +3225848064,3225848831,US +3225848832,3225849855,DE +3225849856,3225850111,US +3225850112,3225853951,DE +3225853952,3225857023,US +3225857024,3225857279,CA +3225857280,3225857535,US +3225857536,3225857791,AU +3225857792,3225858047,US +3225858048,3225858559,CA +3225858560,3225858815,US +3225858816,3225859583,JP +3225860096,3225862143,US +3225864192,3225868287,US +3225868288,3225868543,AU +3225868544,3225869055,US +3225869056,3225869311,AU +3225869312,3225869567,CA +3225869568,3225870335,US +3225870336,3225870591,CA +3225870592,3225873663,US +3225873664,3225873919,ZA +3225873920,3225874943,US +3225874944,3225875199,GB +3225875200,3225878527,US +3225878528,3225880319,SE +3225880320,3225880575,US +3225880576,3225881343,SE +3225881344,3225881599,IT +3225881600,3225882367,SE +3225882368,3225882623,DE +3225882624,3225882879,SE +3225882880,3225883391,DE +3225883392,3225884927,SE +3225884928,3225885183,NL +3225885184,3225885695,AT +3225885696,3225886719,SE +3225886720,3225886975,NO +3225886976,3225887231,SE +3225887232,3225887487,DK +3225887488,3225887999,SE +3225888000,3225888255,GB +3225888256,3225892351,SE +3225892352,3225892863,FR +3225892864,3225894399,SE +3225894400,3225895423,GB +3225895424,3225902335,SE +3225902336,3225902591,NL +3225902592,3225902847,SE +3225902848,3225903103,NL +3225903104,3225905407,SE +3225905408,3225905663,IT +3225905664,3225913855,SE +3225913856,3225914111,DE +3225914112,3225915135,SE +3225915136,3225915391,DK +3225915392,3225917183,SE +3225917184,3225917439,NL +3225917440,3225917695,SE +3225917696,3225917951,NL +3225917952,3225918463,SE +3225918464,3225918719,GB +3225918720,3225920767,SE +3225920768,3225921023,GB +3225921024,3225921791,SE +3225921792,3225922047,GB +3225922048,3225922559,SE +3225922560,3225922815,IT +3225922816,3225923327,SE +3225923328,3225923583,IN +3225923584,3225923839,SE +3225923840,3225924095,GB +3225924096,3225929983,SE +3225929984,3225930239,US +3225930240,3225930495,FR +3225930496,3225932543,SE +3225932544,3225932799,IM +3225932800,3225933055,IT +3225933056,3225933311,ES +3225933312,3225934335,SE +3225934336,3225934591,IS +3225934592,3225935359,SE +3225935360,3225935615,US +3225935616,3225936639,SE +3225936640,3225936895,US +3225936896,3225937407,SE +3225937408,3225937663,US +3225937664,3225938175,SE +3225938176,3225938431,CH +3225938432,3225938687,US +3225938688,3225940991,SE +3225940992,3225941247,SI +3225941248,3225941503,IT +3225941504,3225941759,SE +3225941760,3225942015,AT +3225942016,3225942271,SE +3225942272,3225942527,BE +3225942528,3225944063,SE +3225944064,3225944831,US +3225944832,3226008831,TW +3226008832,3226010879,US +3226010880,3226011135,CA +3226011136,3226012671,US +3226012672,3226012927,AU +3226012928,3226014463,US +3226014464,3226014975,GB +3226014976,3226015231,NZ +3226015232,3226015487,AU +3226015488,3226015743,US +3226015744,3226016255,ID +3226016256,3226018303,US +3226018304,3226018559,DE +3226018560,3226021119,CH +3226021120,3226026495,US +3226026496,3226026751,AU +3226026752,3226067455,US +3226067456,3226067711,BE +3226067712,3226068223,US +3226068224,3226068479,GB +3226068480,3226110719,US +3226110720,3226128639,AU +3226128640,3226140927,US +3226140928,3226143487,CA +3226143488,3226143743,US +3226143744,3226145535,CA +3226145536,3226145791,US +3226145792,3226146559,CA +3226146560,3226146815,FR +3226146816,3226155519,CA +3226155520,3226155775,US +3226155776,3226156543,CA +3226156544,3226156799,US +3226156800,3226157567,CA +3226157568,3226157823,US +3226157824,3226167807,CA +3226167808,3226168063,US +3226168064,3226175231,CA +3226175232,3226175743,US +3226176000,3226177535,CA +3226177536,3226178559,US +3226178560,3226188543,CA +3226188544,3226188799,PR +3226188800,3226189055,US +3226189056,3226189823,CA +3226189824,3226191871,US +3226191872,3226194175,CA +3226194176,3226194431,US +3226194432,3226194687,CA +3226194688,3226194943,US +3226194944,3226205439,CA +3226205440,3226205695,AE +3226205696,3226205951,CA +3226205952,3226207743,US +3226207744,3226215423,GB +3226215424,3226237439,US +3226237440,3226237695,AU +3226237696,3226240255,DE +3226240256,3226240511,US +3226240512,3226241535,DE +3226241536,3226241791,NL +3226241792,3226248191,DE +3226248448,3226248703,IE +3226248704,3226250495,DE +3226250496,3226251263,US +3226251264,3226251519,DE +3226251520,3226267903,US +3226267904,3226268159,DE +3226268160,3226268415,PT +3226268416,3226268927,AT +3226268928,3226269951,DE +3226269952,3226270719,US +3226271488,3226273791,US +3226274048,3226274559,US +3226274560,3226274815,CH +3226274816,3226283519,US +3226283520,3226291199,CA +3226291200,3226300927,US +3226300928,3226301439,DE +3226301440,3226302463,US +3226302464,3226303487,FI +3226303488,3226305535,US +3226305536,3226307327,GB +3226307328,3226307583,US +3226307584,3226308095,ES +3226308096,3226333823,US +3226333824,3226333951,NL +3226333952,3226335231,US +3226335232,3226335487,RO +3226335488,3226365439,US +3226365440,3226365951,DE +3226365952,3226374143,US +3226374144,3226375167,DE +3226375168,3226376703,US +3226376704,3226376959,AT +3226376960,3226384639,US +3226384640,3226385407,BE +3226385408,3226397695,US +3226397696,3226398719,DE +3226398720,3226473471,US +3226473472,3226473983,PT +3226473984,3226474495,US +3226474496,3226474751,CL +3226474752,3226476287,US +3226476288,3226479359,CH +3226479360,3226480127,US +3226480128,3226480383,GB +3226480384,3226481407,US +3226481408,3226481663,DE +3226481664,3226488831,US +3226488832,3226489087,CA +3226489088,3226521855,US +3226521856,3226522111,BR +3226522112,3226536959,US +3226536960,3226542079,CA +3226542080,3226547199,US +3226547200,3226548735,CA +3226548736,3226548991,US +3226548992,3226549247,BE +3226549248,3226549503,US +3226549504,3226550015,GB +3226550016,3226550783,US +3226550784,3226551039,CA +3226551040,3226551807,US +3226551808,3226552319,CA +3226552320,3226552831,VI +3226552832,3226555391,US +3226555392,3226555903,CA +3226555904,3226556671,US +3226556672,3226556927,CA +3226556928,3226561791,US +3226561792,3226562047,NO +3226562048,3226564863,US +3226564864,3226565119,DE +3226565120,3226565375,US +3226565376,3226565631,FI +3226565632,3226574847,US +3226574848,3226575103,FI +3226575104,3226575359,US +3226575360,3226576383,CA +3226576384,3226576895,US +3226576896,3226578943,CA +3226578944,3226580479,US +3226580480,3226581247,FI +3226581248,3226582015,US +3226582016,3226582271,GB +3226582272,3226583551,US +3226583552,3226583807,SE +3226583808,3226590207,US +3226590208,3226591231,NL +3226591232,3226592255,CA +3226592256,3226592767,US +3226592768,3226593023,DE +3226593024,3226593791,US +3226593792,3226594047,NL +3226594048,3226626047,US +3226626048,3226626303,CA +3226626304,3226629375,US +3226629376,3226629631,CA +3226629632,3226630399,US +3226630400,3226630655,GB +3226630656,3226631167,US +3226631168,3226631423,SE +3226631424,3226631935,US +3226631936,3226632191,PT +3226632192,3226633215,CA +3226633216,3226635263,US +3226635264,3226635519,AU +3226635520,3226635775,US +3226635776,3226636031,ZA +3226636032,3226636287,AU +3226636288,3226637823,US +3226637824,3226638079,CA +3226638080,3226638591,US +3226638592,3226638847,NL +3226638848,3226639615,US +3226639616,3226640127,AT +3226640128,3226640639,US +3226640640,3226640895,AU +3226640896,3226654207,US +3226654208,3226654463,PT +3226654464,3226655743,US +3226655744,3226656255,NL +3226656256,3226656511,AU +3226656512,3226661119,US +3226661120,3226661375,NL +3226661376,3226664959,US +3226664960,3226690815,FI +3226690816,3226691071,CA +3226691072,3226691327,GB +3226691328,3226695167,US +3226695168,3226695679,AU +3226695680,3226695935,US +3226695936,3226696191,CA +3226696448,3226696703,AU +3226696704,3226697727,US +3226697728,3226701823,CA +3226701824,3226705919,US +3226705920,3226706175,FR +3226706176,3226707199,US +3226707200,3226707455,PL +3226707456,3226715391,TW +3226715392,3226715647,US +3226715648,3226715903,AU +3226715904,3226716159,US +3226716160,3226716415,GB +3226716416,3226716671,US +3226716672,3226716927,GB +3226716928,3226718207,US +3226718208,3226719231,ZA +3226719232,3226720255,KE +3226720768,3226721279,JP +3226721280,3226722047,US +3226722048,3226722303,NL +3226722304,3226722559,AU +3226722560,3226723583,US +3226723584,3226723839,DE +3226723840,3226724095,US +3226724096,3226724351,AU +3226724352,3226725631,US +3226725632,3226726143,AU +3226726144,3226728191,US +3226728192,3226728447,CA +3226728448,3226731775,US +3226731776,3226732031,GB +3226732032,3226733567,US +3226733568,3226733823,MX +3226733824,3226734079,PT +3226734080,3226734493,US +3226734494,3226734494,PT +3226734495,3226736639,US +3226736896,3226737407,US +3226737408,3226737663,AT +3226737664,3226738175,US +3226738176,3226738431,NL +3226738432,3226738687,US +3226738688,3226739199,NO +3226739200,3226746367,US +3226746368,3226746623,PT +3226746624,3226748927,US +3226749440,3226749695,US +3226749696,3226752255,GB +3226752256,3226752767,US +3226752768,3226753023,IT +3226753024,3226753279,US +3226753280,3226753535,AU +3226753536,3226753791,SI +3226753792,3226754815,HR +3226754816,3226755071,SI +3226755072,3226755327,HR +3226755328,3226755583,SI +3226755584,3226755839,HR +3226755840,3226756095,SI +3226756096,3226756351,US +3226756352,3226757375,SI +3226757376,3226757887,HR +3226757888,3226758143,SI +3226758144,3226758399,HR +3226758400,3226758655,SI +3226758656,3226763007,US +3226763008,3226770687,IT +3226770688,3226772991,US +3226772992,3226773247,CH +3226773248,3226774783,US +3226774784,3226775039,GB +3226775040,3226775551,US +3226775552,3226783743,FI +3226783744,3226784767,US +3226784768,3226785023,GB +3226785024,3226786815,US +3226786816,3226787071,DE +3226787072,3226787327,AT +3226787328,3226788351,US +3226788352,3226789375,HU +3226789376,3226789631,AU +3226789632,3226790911,US +3226790912,3226791167,CA +3226791168,3226791679,AU +3226791680,3226792191,US +3226792448,3226792703,AU +3226792704,3226792959,US +3226792960,3226793215,ZA +3226793216,3226793983,DE +3226793984,3226795263,US +3226795264,3226795519,NZ +3226795520,3226800127,US +3226800128,3226800639,DE +3226800640,3226811391,US +3226811392,3226811647,DE +3226811648,3226824191,US +3226824192,3226824447,DE +3226824448,3226861823,US +3226861824,3226862079,CA +3226862080,3226864383,US +3226864384,3226864639,RU +3226864896,3226865151,US +3226865152,3226865407,PL +3226865408,3226866175,US +3226866176,3226866431,GB +3226866432,3226867967,US +3226867968,3226868223,IL +3226868224,3226868479,US +3226868480,3226868735,GB +3226868736,3226884351,US +3226884352,3226884607,IL +3226884608,3226893567,US +3226893568,3226894079,NL +3226894080,3226894335,GB +3226894336,3226895359,US +3226895872,3226896127,GB +3226896128,3226896639,US +3226896640,3226896895,GB +3226896896,3226897151,PT +3226897152,3226903295,US +3226903296,3226903551,DE +3226903552,3226903807,US +3226903808,3226904063,AU +3226904064,3226904319,CH +3226904320,3226904575,FR +3226904576,3226904831,US +3226904832,3226905087,GB +3226905088,3226926591,US +3226926592,3226926847,SE +3226926848,3226927103,US +3226927104,3226992639,NL +3226992640,3226992895,US +3226992896,3226993151,CH +3226993152,3226993663,US +3226993664,3226993919,DE +3226993920,3226994175,US +3226994176,3226994687,AU +3226994688,3226994943,US +3226994944,3226995455,NL +3226995456,3226998527,US +3226998528,3226999039,AT +3226999040,3227013119,US +3227013376,3227013887,US +3227013888,3227014399,NL +3227014400,3227014655,NZ +3227014656,3227014911,FI +3227014912,3227017471,US +3227017472,3227017983,NL +3227018240,3227020287,US +3227020288,3227020543,NL +3227020544,3227022847,US +3227022848,3227023103,GB +3227023360,3227024127,US +3227024128,3227024383,PT +3227024384,3227025407,US +3227025408,3227025663,GB +3227025664,3227025919,US +3227025920,3227026175,GB +3227026176,3227026687,US +3227026688,3227026943,GB +3227026944,3227027455,CA +3227027456,3227040511,US +3227040512,3227040767,AU +3227040768,3227041279,US +3227041280,3227041535,AU +3227041536,3227042815,US +3227042816,3227043071,IT +3227043072,3227044863,US +3227044864,3227045119,PL +3227045120,3227053567,US +3227053568,3227053823,GB +3227053824,3227054079,DE +3227054080,3227056639,US +3227056640,3227057919,PT +3227057920,3227058175,US +3227058176,3227123711,FI +3227123712,3227217151,US +3227217152,3227217407,JP +3227217408,3227225087,US +3227225088,3227225599,LU +3227225600,3227234559,US +3227234560,3227234815,PT +3227234816,3227235071,US +3227235072,3227235327,AU +3227235328,3227236607,US +3227236608,3227236863,AU +3227236864,3227237119,RU +3227237120,3227237631,US +3227237632,3227237887,NO +3227237888,3227238143,US +3227238144,3227238399,GB +3227238400,3227240191,US +3227240192,3227240447,GB +3227240704,3227240959,GB +3227240960,3227243007,US +3227243008,3227243263,CA +3227243264,3227243519,GB +3227243520,3227243775,US +3227244032,3227249151,SE +3227249152,3227249663,US +3227249664,3227252735,CH +3227252736,3227273983,US +3227273984,3227274239,FI +3227274240,3227274495,US +3227274496,3227274751,NL +3227274752,3227276799,US +3227276800,3227277055,FR +3227277056,3227278847,US +3227278848,3227279103,NL +3227279104,3227281407,US +3227281408,3227282175,IT +3227282176,3227282431,US +3227282432,3227282687,NL +3227282688,3227282943,GB +3227282944,3227284479,US +3227284480,3227284735,FI +3227284736,3227286783,US +3227286784,3227287039,AT +3227287040,3227287295,IT +3227287296,3227287551,NL +3227287552,3227287807,CH +3227287808,3227288063,BG +3227288064,3227288319,BE +3227288320,3227288831,NL +3227288832,3227289087,PT +3227289088,3227289343,NL +3227289344,3227289599,PT +3227289600,3227290111,NL +3227290112,3227290367,AT +3227290368,3227290623,CH +3227290624,3227290879,US +3227290880,3227291135,AT +3227291136,3227294207,PT +3227294464,3227294975,GR +3227294976,3227304191,US +3227304192,3227304447,PR +3227304448,3227310079,US +3227310080,3227310335,NO +3227310336,3227312127,US +3227312128,3227312383,DK +3227312384,3227315199,US +3227316224,3227320319,US +3227320320,3227362047,FR +3227362048,3227362303,US +3227362304,3227362559,GB +3227362560,3227385855,FR +3227385856,3227391999,US +3227392000,3227392255,PT +3227392256,3227393023,US +3227393024,3227393279,AT +3227393280,3227396351,US +3227396352,3227396607,AU +3227396608,3227398399,US +3227398400,3227398655,CA +3227398656,3227400447,US +3227400448,3227400703,AT +3227400704,3227400959,GB +3227400960,3227401471,US +3227401472,3227401727,MU +3227401728,3227402495,AU +3227402496,3227403007,US +3227403008,3227403519,GR +3227403520,3227405311,US +3227405312,3227405567,DE +3227406080,3227414271,US +3227414272,3227415551,GB +3227415552,3227415807,US +3227415808,3227416063,GB +3227416064,3227417087,US +3227417088,3227417343,BN +3227417344,3227418111,US +3227418112,3227418367,CA +3227418368,3227425791,US +3227425792,3227427583,DK +3227427584,3227427839,ES +3227427840,3227429119,US +3227429120,3227429375,AU +3227429376,3227429887,US +3227429888,3227430143,GB +3227430144,3227430399,US +3227430400,3227430655,AU +3227430656,3227437055,FR +3227437056,3227439103,US +3227439104,3227439615,AU +3227439616,3227439871,MU +3227439872,3227440127,US +3227440128,3227440383,NL +3227440384,3227442175,US +3227442432,3227442687,RU +3227442688,3227443711,US +3227443712,3227443967,AT +3227443968,3227444223,AU +3227444224,3227445503,US +3227445504,3227445759,RU +3227445760,3227446015,US +3227446016,3227446271,GB +3227446272,3227446783,US +3227447040,3227447295,AT +3227447296,3227447807,ZA +3227447808,3227448063,US +3227448064,3227448575,AU +3227448576,3227448831,US +3227448832,3227449087,ZA +3227449088,3227450111,US +3227450112,3227450367,CA +3227450368,3227451455,US +3227451456,3227451831,CA +3227451832,3227451835,US +3227451836,3227452375,CA +3227452376,3227452382,US +3227452383,3227452735,CA +3227452736,3227452767,US +3227452768,3227453503,CA +3227453504,3227453507,US +3227453508,3227454047,CA +3227454048,3227454079,US +3227454080,3227454687,CA +3227454688,3227454719,US +3227454720,3227455047,CA +3227455048,3227455051,US +3227455052,3227455487,CA +3227455488,3227456255,US +3227456256,3227457023,CA +3227457024,3227457535,US +3227457536,3227459001,CA +3227459002,3227459002,US +3227459003,3227461081,CA +3227461082,3227461082,US +3227461083,3227461119,CA +3227461120,3227461631,US +3227461632,3227461959,CA +3227461960,3227461963,US +3227461964,3227464447,CA +3227464448,3227464575,US +3227464576,3227464663,CA +3227464664,3227464667,US +3227464668,3227465147,CA +3227465148,3227465151,US +3227465152,3227466135,CA +3227466136,3227466143,US +3227466144,3227467775,CA +3227467776,3227468287,US +3227468288,3227468799,CA +3227468800,3227484159,US +3227484160,3227517183,CA +3227517184,3227521279,ZA +3227521280,3227521791,US +3227521792,3227522047,ZA +3227522048,3227522815,MU +3227522816,3227523071,US +3227523072,3227525119,ZA +3227525120,3227525375,MU +3227525376,3227526143,ZA +3227526144,3227526399,US +3227526400,3227527423,ZA +3227527424,3227527935,US +3227527936,3227528191,MU +3227528192,3227528447,US +3227528448,3227528703,ZA +3227528704,3227528959,MU +3227528960,3227531519,ZA +3227531520,3227531775,MU +3227531776,3227532031,ZA +3227532032,3227532287,US +3227532288,3227532799,ZA +3227532800,3227534335,US +3227534336,3227535615,ZA +3227535616,3227535871,US +3227535872,3227536895,ZA +3227536896,3227537151,CA +3227537152,3227539199,ZA +3227539200,3227540735,MU +3227540736,3227540991,ZA +3227540992,3227541503,MU +3227541504,3227541759,ZA +3227541760,3227543295,MU +3227543296,3227543551,US +3227543552,3227544831,ZA +3227544832,3227545087,MU +3227545088,3227547647,ZA +3227547648,3227551743,MU +3227551744,3227552255,MF +3227552256,3227552511,ZA +3227552512,3227553791,MU +3227553792,3227554047,ZA +3227554304,3227554559,ZA +3227554560,3227554815,MU +3227554816,3227556863,ZA +3227556864,3227557375,US +3227557376,3227557631,ZA +3227557632,3227558911,US +3227558912,3227559167,ZA +3227559168,3227559423,GB +3227559424,3227559935,ZA +3227559936,3227562239,US +3227562240,3227566079,ZA +3227566080,3227566335,US +3227566336,3227566847,MU +3227566848,3227568127,ZA +3227568128,3227574271,US +3227574272,3227576575,ZA +3227576576,3227576831,US +3227576832,3227579391,MU +3227579392,3227579647,US +3227579648,3227580159,ZA +3227580160,3227580415,MU +3227580416,3227580927,ZA +3227580928,3227581695,MU +3227581696,3227582207,ZA +3227582208,3227638271,US +3227638272,3227638527,CA +3227638528,3227647999,US +3227648000,3227659775,FI +3227659776,3227660031,JP +3227660032,3227660543,FI +3227660544,3227660799,EE +3227660800,3227678719,FI +3227678720,3227680767,LU +3227680768,3227713535,FI +3227713536,3227722521,CA +3227722522,3227722522,US +3227722523,3227724031,CA +3227724032,3227724287,US +3227724288,3227738367,CA +3227738368,3227738623,US +3227738624,3227738879,CA +3227738880,3227739135,US +3227739136,3227740587,CA +3227740588,3227740591,US +3227740592,3227740795,CA +3227740796,3227740799,US +3227740800,3227740839,CA +3227740840,3227740847,US +3227740848,3227740927,CA +3227740928,3227741183,US +3227741184,3227742079,CA +3227742080,3227742083,US +3227742084,3227742207,CA +3227742208,3227742463,PL +3227742464,3227742691,CA +3227742692,3227742695,US +3227742696,3227743359,CA +3227743360,3227743375,US +3227743376,3227743487,CA +3227743488,3227743743,BR +3227743744,3227743999,CZ +3227744000,3227744119,CA +3227744120,3227744123,US +3227744124,3227744167,CA +3227744168,3227744171,US +3227744172,3227744303,CA +3227744304,3227744311,US +3227744312,3227744827,CA +3227744828,3227744831,US +3227744832,3227744911,CA +3227744912,3227744915,US +3227744916,3227745755,CA +3227745756,3227745759,US +3227745760,3227745867,CA +3227745868,3227745871,US +3227745872,3227746007,CA +3227746008,3227746011,US +3227746012,3227746167,CA +3227746168,3227746175,US +3227746176,3227746431,CA +3227746432,3227746463,US +3227746464,3227746559,CA +3227746560,3227746815,AU +3227746816,3227747071,BR +3227747072,3227748035,CA +3227748036,3227748039,US +3227748040,3227749783,CA +3227749784,3227749787,US +3227749788,3227749839,CA +3227749840,3227749855,BZ +3227749856,3227751868,CA +3227751869,3227751869,US +3227751870,3227754143,CA +3227754144,3227754147,US +3227754148,3227755775,CA +3227755776,3227756031,US +3227756032,3227756505,CA +3227756506,3227756506,US +3227756507,3227757055,CA +3227757056,3227757311,US +3227757312,3227759871,CA +3227759872,3227759887,BZ +3227759888,3227760127,CA +3227760128,3227760383,US +3227760384,3227760415,CA +3227760416,3227760419,US +3227760420,3227760435,CA +3227760436,3227760439,US +3227760440,3227760647,CA +3227760648,3227760655,BZ +3227760656,3227761107,CA +3227761108,3227761111,BZ +3227761112,3227762655,CA +3227762656,3227762671,US +3227762672,3227763483,CA +3227763484,3227763487,US +3227763488,3227764095,CA +3227764096,3227764103,BZ +3227764104,3227764119,CA +3227764120,3227764123,BZ +3227764124,3227764375,CA +3227764376,3227764387,BZ +3227764388,3227765247,CA +3227765248,3227765759,US +3227765760,3227766095,CA +3227766096,3227766099,US +3227766100,3227766343,CA +3227766344,3227766347,US +3227766348,3227767295,CA +3227767296,3227767311,US +3227767312,3227769631,CA +3227769632,3227769635,US +3227769636,3227770587,CA +3227770588,3227770591,BZ +3227770592,3227770719,CA +3227770720,3227770727,BZ +3227770728,3227770735,CA +3227770736,3227770739,BZ +3227770740,3227770963,CA +3227770964,3227770967,US +3227770968,3227771263,CA +3227771264,3227771279,US +3227771280,3227771347,CA +3227771348,3227771351,US +3227771352,3227771619,CA +3227771620,3227771623,US +3227771624,3227772707,CA +3227772708,3227772711,US +3227772712,3227774751,CA +3227774752,3227774783,US +3227774784,3227775059,CA +3227775060,3227775063,US +3227775064,3227775423,CA +3227775424,3227775431,US +3227775432,3227775695,CA +3227775696,3227775707,BZ +3227775708,3227775731,CA +3227775732,3227775743,BZ +3227775744,3227775856,CA +3227775857,3227775857,ES +3227775858,3227775935,CA +3227775936,3227775939,US +3227775940,3227776983,CA +3227776984,3227776984,US +3227776985,3227777083,CA +3227777084,3227777087,US +3227777088,3227777759,CA +3227777760,3227777763,US +3227777764,3227777951,CA +3227777952,3227777967,US +3227777968,3227777983,CA +3227777984,3227777999,US +3227778000,3227778015,CA +3227778016,3227778019,BZ +3227778020,3227778135,CA +3227778136,3227778139,BZ +3227778140,3227779071,CA +3227779072,3227779327,US +3227779328,3227779583,ZA +3227779584,3227779839,AU +3227779840,3227783679,US +3227783680,3227783935,FR +3227783936,3227784703,US +3227784704,3227784959,AU +3227784960,3227785727,AT +3227785728,3227792383,US +3227792384,3227792639,GB +3227792640,3227792895,AU +3227792896,3227794687,US +3227794688,3227794943,GB +3227794944,3227795199,US +3227795200,3227795455,NO +3227795456,3227798783,US +3227798784,3227799039,TH +3227799040,3227799295,GB +3227799296,3227799551,US +3227799552,3227799807,AU +3227799808,3227801343,US +3227801344,3227801599,CA +3227801600,3227803647,US +3227803648,3227804415,DE +3227804416,3227804671,GB +3227804672,3227804927,US +3227804928,3227805183,CA +3227805184,3227805439,SG +3227805440,3227805695,GB +3227805696,3227806463,US +3227806464,3227806719,GB +3227806720,3227806975,US +3227806976,3227807039,SG +3227807040,3227807487,US +3227807488,3227807743,FI +3227807744,3227809023,GB +3227809024,3227809279,IN +3227809280,3227812543,GB +3227812544,3227812575,FI +3227812576,3227813375,GB +3227813376,3227813631,US +3227813632,3227815167,GB +3227815168,3227815935,US +3227815936,3227816191,GB +3227816192,3227818495,US +3227818496,3227818751,GB +3227818752,3227819263,MX +3227819264,3227819519,AR +3227819520,3227822079,MX +3227822336,3227822847,MX +3227822848,3227823103,HN +3227823104,3227824383,MX +3227824384,3227824639,BR +3227824640,3227825663,MX +3227825664,3227825919,CR +3227825920,3227826687,MX +3227826688,3227827199,AR +3227827200,3227829759,MX +3227829760,3227830015,BR +3227830016,3227831807,MX +3227831808,3227832063,BR +3227832064,3227833855,MX +3227833856,3227834367,BR +3227834368,3227837439,MX +3227837440,3227837951,BR +3227837952,3227842303,MX +3227842304,3227842815,BR +3227842816,3227843327,MX +3227843328,3227844095,BR +3227844096,3227844351,AR +3227844352,3227844607,US +3227844608,3227844863,CA +3227844864,3227845119,NL +3227845120,3227845631,US +3227845632,3227845887,RU +3227845888,3227846655,US +3227846656,3227846911,ES +3227846912,3227847423,US +3227847424,3227847679,GB +3227847680,3227848703,US +3227848704,3227848959,NZ +3227848960,3227851775,US +3227851776,3227852031,DE +3227852032,3227853311,US +3227853312,3227853567,GB +3227853568,3227860991,US +3227863296,3227863807,US +3227863808,3227864063,NL +3227864064,3227865343,US +3227865344,3227866111,NL +3227866112,3227866367,HK +3227866368,3227866623,US +3227866624,3227867647,NL +3227867648,3227867903,BR +3227867904,3227868159,TH +3227868160,3227872767,US +3227872768,3227873023,GB +3227873024,3227874047,NL +3227874048,3227874815,US +3227874816,3227875071,PT +3227875072,3227878911,US +3227878912,3227879167,AU +3227879168,3227879679,US +3227879680,3227879935,GB +3227879936,3227880959,US +3227880960,3227881215,EG +3227881216,3227883007,US +3227883008,3227883519,CA +3227883520,3227885823,US +3227885824,3227887871,ES +3227887872,3227888127,PR +3227888128,3227888383,BE +3227888384,3227889663,US +3227889664,3227889919,NL +3227890176,3227890431,US +3227890432,3227890943,DE +3227890944,3227891455,US +3227891456,3227891711,AU +3227891712,3227893759,US +3227893760,3227894015,FI +3227894016,3227895039,US +3227895040,3227895551,DE +3227895552,3227909119,US +3227909120,3227909375,NL +3227909376,3227909631,US +3227909632,3227909887,AU +3227909888,3227910399,US +3227910400,3227910655,AT +3227910656,3227911679,US +3227911680,3227912191,UA +3227912192,3227912447,GB +3227912448,3227912703,MU +3227912704,3227912959,US +3227912960,3227913215,CA +3227913216,3227914495,US +3227914496,3227914751,AT +3227914752,3227918591,FI +3227918592,3227918847,US +3227918848,3227931135,FI +3227931136,3227931391,US +3227931392,3227931647,AU +3227931648,3227931903,PE +3227931904,3227932927,US +3227932928,3227933183,DE +3227933184,3227933695,US +3227933696,3227933951,NZ +3227933952,3227934463,US +3227934464,3227934719,CH +3227934720,3227947519,US +3227947520,3227955711,DE +3227955712,3227964927,US +3227964928,3227965183,NL +3227965184,3227967487,US +3227967488,3227967743,NL +3227967744,3227967999,PL +3227968000,3227968255,US +3227968256,3227968767,GB +3227968768,3227969023,RU +3227969024,3227971327,US +3227971328,3227971583,AU +3227971584,3227974143,US +3227974144,3227974655,AU +3227974656,3227975167,US +3227975168,3227975679,CA +3227975680,3227976191,US +3227976192,3227976447,LU +3227976448,3227977471,US +3227977472,3227977727,FR +3227977728,3227979263,US +3227979264,3227979519,AE +3227979520,3227980799,US +3227980800,3227981055,GR +3227981056,3227981567,US +3227981568,3227981823,DE +3227981824,3227982591,US +3227982592,3227982847,DE +3227982848,3227985919,GB +3227985920,3227986175,DE +3227986176,3227986431,US +3227986688,3227986943,JP +3227986944,3227997439,US +3227997440,3228005631,FI +3228005632,3228008959,US +3228008960,3228009215,AU +3228009216,3228010751,US +3228010752,3228011519,GB +3228011520,3228013311,US +3228013312,3228013567,PT +3228013568,3228045055,US +3228045056,3228045311,KR +3228045312,3228047103,US +3228047104,3228047359,NL +3228047360,3228048383,US +3228048384,3228048895,GB +3228048896,3228050175,US +3228050176,3228050943,PT +3228050944,3228051199,CA +3228051200,3228051455,US +3228051712,3228051967,CH +3228051968,3228052223,US +3228052224,3228052991,AU +3228052992,3228053503,US +3228053504,3228053759,PT +3228053760,3228054783,US +3228054784,3228055039,GB +3228055040,3228055295,US +3228055296,3228055807,NL +3228055808,3228056319,NO +3228056320,3228059647,US +3228059648,3228059903,CH +3228059904,3228060927,US +3228060928,3228061183,DE +3228061184,3228061695,US +3228061952,3228062207,US +3228062208,3228062463,GB +3228062464,3228077055,US +3228077056,3228077311,NL +3228077312,3228077567,US +3228077568,3228077823,NL +3228077824,3228078847,US +3228078848,3228079103,GR +3228079104,3228080639,US +3228080640,3228080895,IE +3228080896,3228081151,FR +3228081152,3228083967,US +3228083968,3228084479,BE +3228084480,3228085247,US +3228085248,3228085503,JP +3228085504,3228100607,US +3228100608,3228101119,JP +3228101120,3228102143,US +3228102144,3228102399,GB +3228102400,3228103423,US +3228103424,3228103679,CA +3228103680,3228103935,US +3228103936,3228104191,FR +3228104192,3228104703,JP +3228104704,3228104959,DK +3228104960,3228105471,US +3228105472,3228105727,CH +3228105728,3228109311,US +3228109312,3228109567,AU +3228109568,3228125951,US +3228125952,3228126207,DE +3228126208,3228133375,US +3228133376,3228134655,CA +3228134656,3228150271,US +3228150272,3228150527,FI +3228150528,3228172287,US +3228172288,3228237823,IT +3228237824,3228238079,US +3228238336,3228238591,GB +3228238592,3228238847,US +3228238848,3228239359,GB +3228239616,3228240127,US +3228240128,3228240383,AU +3228240640,3228241407,GB +3228241408,3228250367,US +3228250624,3228250879,US +3228250880,3228263679,IT +3228263680,3228263935,AU +3228263936,3228264447,US +3228264448,3228264703,NI +3228264704,3228265983,US +3228265984,3228266239,IE +3228266240,3228266495,PR +3228266752,3228267007,NZ +3228267008,3228267263,NL +3228267264,3228269055,US +3228269056,3228269311,PT +3228269312,3228269567,DE +3228269568,3228270079,AT +3228270080,3228271103,GB +3228271104,3228271359,US +3228271360,3228271615,CA +3228271616,3228271871,DE +3228271872,3228272127,CA +3228272128,3228274687,US +3228274688,3228274943,CA +3228274944,3228280831,US +3228280832,3228281087,NL +3228281088,3228281599,US +3228281600,3228282111,AU +3228282112,3228282367,US +3228282368,3228282623,GB +3228282624,3228283135,US +3228283136,3228283391,GR +3228283392,3228283647,GB +3228283648,3228285695,US +3228285696,3228285951,SE +3228285952,3228289023,US +3228289024,3228297215,FI +3228297216,3228297727,AT +3228297728,3228297983,US +3228297984,3228298495,NL +3228298496,3228309247,US +3228309248,3228311039,DE +3228311296,3228311551,DE +3228311808,3228312063,DE +3228312320,3228316159,DE +3228316160,3228316415,US +3228316416,3228327167,DE +3228327168,3228328703,US +3228328704,3228328959,AU +3228328960,3228329471,NO +3228329472,3228330751,US +3228330752,3228331263,SE +3228331264,3228332287,US +3228332544,3228332799,GR +3228332800,3228334079,FR +3228334080,3228334335,GB +3228334336,3228334591,AT +3228334592,3228335359,US +3228335360,3228335615,SK +3228335616,3228335871,CZ +3228335872,3228336127,US +3228336128,3228336639,CZ +3228336640,3228337663,SK +3228337664,3228338431,CZ +3228338432,3228340735,SK +3228340736,3228341247,CZ +3228341248,3228341759,SK +3228341760,3228342271,CZ +3228342272,3228342783,SK +3228342784,3228343039,CZ +3228343040,3228343295,SK +3228343296,3228343551,CZ +3228343552,3228344063,SK +3228344064,3228344575,CZ +3228344576,3228347135,SK +3228347136,3228347391,CZ +3228347392,3228348159,SK +3228348160,3228353279,US +3228353280,3228358399,SE +3228358400,3228362239,US +3228362240,3228362495,TH +3228362496,3228363263,US +3228363264,3228363519,CH +3228363520,3228364287,US +3228364288,3228364543,AT +3228364544,3228368895,US +3228368896,3228379135,DE +3228379648,3228380415,DE +3228380416,3228380671,US +3228380672,3228380927,DE +3228381184,3228387839,DE +3228388096,3228388351,US +3228388352,3228392447,DE +3228392448,3228392959,US +3228392960,3228393727,DE +3228394240,3228394495,US +3228394752,3228395263,DE +3228395264,3228395775,US +3228395776,3228399615,DE +3228399616,3228399871,US +3228399872,3228400383,DE +3228400640,3228403711,DE +3228403968,3228404223,DE +3228404736,3228405503,FR +3228405504,3228405759,DE +3228405760,3228406015,FR +3228406016,3228406271,US +3228406272,3228406527,IN +3228406528,3228406783,BR +3228406784,3228407039,FR +3228407296,3228424703,DE +3228424704,3228424959,US +3228424960,3228426143,DE +3228426144,3228426151,US +3228426152,3228430335,DE +3228430848,3228431103,ZA +3228431872,3228434431,DE +3228434432,3228456191,US +3228456192,3228456447,CA +3228456448,3228457471,US +3228457472,3228457727,CA +3228457728,3228461567,US +3228461568,3228461823,CA +3228461824,3228478463,US +3228478464,3228479487,CA +3228479488,3228508159,US +3228508160,3228508415,AU +3228508416,3228508671,NO +3228508672,3228509951,US +3228509952,3228510207,NL +3228510208,3228511231,US +3228511232,3228511487,CZ +3228511488,3228511999,US +3228512000,3228512511,NL +3228512512,3228522495,US +3228522496,3228522751,GB +3228522752,3228525823,US +3228525824,3228526079,PT +3228526080,3228526335,NZ +3228526336,3228526591,CH +3228526592,3228526847,AT +3228526848,3228527103,AU +3228527104,3228531711,US +3228531712,3228532223,NO +3228532224,3228532479,US +3228532480,3228532735,DE +3228532736,3228533759,US +3228533760,3228534015,CA +3228534016,3228539903,US +3228539904,3228540927,BR +3228540928,3228558591,US +3228558592,3228559103,BR +3228559104,3228564479,US +3228564480,3228564735,AT +3228564736,3228572927,US +3228572928,3228573183,CA +3228573184,3228573951,PT +3228573952,3228577023,US +3228577024,3228577279,NL +3228577280,3228578047,US +3228578048,3228578303,GB +3228578304,3228581119,US +3228581120,3228581375,AT +3228581376,3228583423,US +3228583424,3228585983,ES +3228585984,3228590591,US +3228590592,3228590847,GB +3228590848,3228591103,DK +3228591104,3228591359,GB +3228591360,3228617727,US +3228617728,3228617983,FI +3228617984,3228618239,US +3228618240,3228618495,SE +3228618496,3228618751,US +3228618752,3228619007,DE +3228619008,3228620031,US +3228620032,3228620287,DE +3228620288,3228620543,CH +3228620544,3228620799,AU +3228620800,3228628735,US +3228628736,3228628991,ES +3228628992,3228630527,US +3228630528,3228630783,NL +3228630784,3228631039,US +3228631040,3228647423,NL +3228647424,3228647679,IT +3228647680,3228647935,ES +3228647936,3228696575,NL +3228696576,3228714764,IL +3228714765,3228714765,CA +3228714766,3228830719,IL +3228830720,3228833791,PS +3228833792,3229024255,IL +3229024256,3229089791,US +3229089792,3229090047,CA +3229090048,3229092095,US +3229092096,3229093887,AU +3229093888,3229151487,US +3229151488,3229151743,SE +3229151744,3229155327,US +3229155328,3229155583,GB +3229155584,3229155839,SE +3229155840,3229156095,ES +3229156096,3229159423,SE +3229159424,3229159935,NL +3229159936,3229160959,SE +3229160960,3229161471,DE +3229161472,3229161727,SE +3229161728,3229161983,GB +3229161984,3229163263,SE +3229163264,3229163519,ES +3229163520,3229164287,SE +3229164288,3229164543,DK +3229164544,3229165055,GB +3229165056,3229165311,NO +3229165312,3229167103,SE +3229167104,3229167615,IT +3229167616,3229171711,SE +3229171712,3229172223,GB +3229172224,3229172479,DE +3229172480,3229172735,SE +3229172736,3229172991,CH +3229172992,3229173503,SE +3229173504,3229173759,IT +3229173760,3229176319,SE +3229176320,3229176575,US +3229176576,3229182463,SE +3229182464,3229182975,GB +3229182976,3229183999,SE +3229184000,3229184511,GB +3229184512,3229186559,SE +3229186560,3229186815,IT +3229186816,3229187327,ES +3229187328,3229187583,IT +3229187584,3229187839,DK +3229187840,3229192959,SE +3229192960,3229193727,FR +3229193728,3229194239,SE +3229194240,3229194495,FR +3229194496,3229195007,SE +3229195008,3229195263,NL +3229195264,3229196287,DE +3229196288,3229196799,SE +3229196800,3229197311,NL +3229197312,3229197823,SE +3229197824,3229198335,GB +3229198336,3229198591,US +3229198592,3229198847,ES +3229198848,3229199103,CH +3229199104,3229199359,IT +3229199360,3229200383,SE +3229200384,3229200895,GB +3229200896,3229201151,DE +3229201152,3229201663,SE +3229201664,3229201919,DK +3229201920,3229202431,SE +3229202432,3229202687,ES +3229202688,3229203199,NL +3229203200,3229203967,GB +3229203968,3229204223,SE +3229204224,3229204479,IT +3229204480,3229205503,SE +3229205504,3229206015,GB +3229206016,3229211647,SE +3229211648,3229211903,IT +3229211904,3229212927,SE +3229212928,3229213183,DE +3229213184,3229218047,SE +3229218048,3229218303,CA +3229218304,3229218559,US +3229218560,3229218815,AU +3229218816,3229219583,SE +3229219584,3229219839,DE +3229219840,3229220863,SE +3229220864,3229221119,US +3229221120,3229221375,FR +3229221376,3229245439,GB +3229245440,3229246719,US +3229246720,3229250815,GB +3229250816,3229251071,US +3229251072,3229254399,GB +3229254400,3229256959,SG +3229256960,3229258495,GB +3229258496,3229259519,US +3229259520,3229264639,GB +3229264640,3229264895,AU +3229264896,3229265919,US +3229265920,3229266175,AU +3229266176,3229266943,US +3229266944,3229267199,AU +3229267200,3229273599,US +3229273600,3229273855,CA +3229273856,3229275647,US +3229275648,3229275903,GB +3229275904,3229276159,US +3229276160,3229276415,IE +3229276416,3229277951,GB +3229277952,3229278207,IE +3229278208,3229281023,GB +3229281024,3229281791,US +3229281792,3229283071,PT +3229283072,3229354495,US +3229354496,3229355775,AU +3229355776,3229358079,US +3229358080,3229359359,DE +3229359360,3229359615,US +3229359616,3229359871,CA +3229359872,3229360127,US +3229360128,3229360383,AT +3229360384,3229361919,US +3229361920,3229362175,BE +3229362176,3229363711,US +3229363712,3229363967,NL +3229363968,3229380607,US +3229380608,3229380863,DE +3229380864,3229381375,US +3229381376,3229381631,DE +3229381632,3229381887,PL +3229381888,3229382143,AU +3229382144,3229390847,US +3229390848,3229391103,AU +3229391104,3229391359,US +3229391360,3229391615,CN +3229391616,3229391871,AT +3229391872,3229395455,US +3229395456,3229401087,RU +3229401088,3229405183,GB +3229405184,3229408255,RU +3229408256,3229412095,US +3229412096,3229412351,DE +3229412352,3229412607,US +3229412608,3229414911,DE +3229414912,3229415167,US +3229415168,3229415679,DE +3229415680,3229415935,US +3229415936,3229483007,DE +3229483008,3229483263,US +3229483264,3229499647,FI +3229499648,3229614847,US +3229614848,3229615103,GB +3229615104,3229679871,US +3229679872,3229695487,DE +3229695488,3229700095,US +3229700096,3229700351,AT +3229700352,3229701887,US +3229701888,3229702143,TR +3229702144,3229704703,US +3229704704,3229704959,DE +3229704960,3229745151,US +3229745152,3229810687,FI +3229810688,3229814015,US +3229814016,3229814271,AU +3229814272,3229815807,US +3229815808,3229816063,DE +3229816064,3229817087,US +3229817088,3229817343,AU +3229817344,3229817599,NL +3229817600,3229818623,AU +3229818624,3229818879,US +3229818880,3229820927,JM +3229820928,3229821951,US +3229821952,3229822207,CA +3229822208,3229830911,US +3229830912,3229831167,NL +3229831168,3229833471,US +3229833472,3229833727,GB +3229833728,3229834239,IN +3229834240,3229834495,AU +3229834496,3229834751,US +3229834752,3229835007,CA +3229835008,3229835263,US +3229835264,3229835519,FI +3229835520,3229835775,CA +3229835776,3229838335,US +3229838336,3229838591,GB +3229838592,3229838847,CA +3229838848,3229844479,US +3229844480,3229844735,FR +3229844736,3229844991,US +3229844992,3229845247,BL +3229845248,3229845503,US +3229845504,3229846015,GB +3229846016,3229846527,CA +3229847296,3229870335,US +3229870592,3229870847,CA +3229870848,3229874943,US +3229874944,3229875455,AU +3229875456,3229876223,US +3229876224,3229876479,CA +3229876480,3229878527,US +3229878528,3229878783,GB +3229878784,3229879039,IT +3229879040,3229879295,NO +3229879296,3229880063,US +3229880064,3229880319,KR +3229880320,3229881087,US +3229881088,3229881343,CA +3229881344,3229884159,US +3229884160,3229884415,JP +3229884416,3229884927,US +3229884928,3229885183,NL +3229885184,3229885439,BR +3229885440,3229886719,US +3229886720,3229886975,AU +3229886976,3229889791,US +3229889792,3229890047,PT +3229890048,3229890303,US +3229890304,3229890559,PT +3229890560,3229891583,US +3229891584,3229891839,CA +3229891840,3229900031,US +3229900032,3229900287,AU +3229900288,3229901567,US +3229901568,3229901823,GB +3229901824,3229937407,US +3229937408,3229937663,GB +3229937664,3229937919,US +3229937920,3229938175,CA +3229938176,3229938687,US +3229938688,3229938943,IL +3229938944,3229939199,NL +3229939200,3229939455,US +3229939456,3229940735,KR +3229940736,3229940991,CH +3229940992,3229941247,AU +3229941248,3229945343,US +3229945600,3229945855,PT +3229945856,3229947135,US +3229947136,3229947391,AU +3229947392,3229948927,US +3229948928,3229949183,IT +3229949184,3229949695,US +3229949696,3229949951,AU +3229949952,3229950207,NO +3229950208,3229950975,US +3229950976,3229951231,IL +3229951232,3229952255,US +3229952256,3229952511,AU +3229952512,3229953279,US +3229953280,3229953535,CA +3229953536,3229955327,US +3229955328,3229955583,NL +3229955584,3229956095,PT +3229956096,3229956607,US +3229956608,3229956863,GB +3229956864,3229958143,US +3229958144,3229958399,NO +3229958400,3229958655,US +3229958912,3229959167,SG +3229959168,3229962079,US +3229962080,3229962111,CA +3229962112,3229969407,US +3229969408,3229969663,PT +3229969664,3229969919,AT +3229969920,3229970431,FI +3229970432,3229972735,US +3229972736,3229972991,SE +3229972992,3229975295,US +3229975296,3229975551,GB +3229975552,3230004223,US +3230004224,3230004479,NL +3230004480,3230005759,US +3230005760,3230006015,ZA +3230006016,3230007039,US +3230007040,3230007295,CA +3230007296,3230072831,FR +3230072832,3230074623,US +3230074624,3230074879,DE +3230074880,3230082559,IT +3230082560,3230083071,US +3230083072,3230084095,CA +3230084096,3230084607,US +3230084608,3230084863,NO +3230084864,3230085119,US +3230085120,3230085375,CA +3230085376,3230085887,US +3230085888,3230086143,DE +3230086144,3230086655,GB +3230086656,3230089727,US +3230089728,3230089983,GB +3230089984,3230090239,US +3230090240,3230090495,GB +3230090496,3230092543,US +3230092544,3230092799,CA +3230092800,3230093823,US +3230093824,3230094079,NL +3230094080,3230094335,CA +3230094336,3230095615,US +3230095872,3230096383,PK +3230096640,3230096895,US +3230096896,3230097151,JP +3230097408,3230100735,JP +3230100736,3230100991,US +3230100992,3230101503,PR +3230101504,3230104319,US +3230104320,3230104575,CA +3230104576,3230105855,US +3230105856,3230106111,NL +3230106112,3230106879,US +3230106880,3230107135,AT +3230107136,3230109439,US +3230109440,3230109695,NO +3230109696,3230109951,US +3230109952,3230115071,CH +3230115072,3230115327,IT +3230115328,3230115583,GR +3230115584,3230116095,BE +3230116096,3230117631,US +3230117632,3230117887,FR +3230117888,3230120191,US +3230120448,3230120703,US +3230120704,3230120959,PT +3230120960,3230125823,US +3230125824,3230126335,AU +3230126336,3230126591,US +3230126848,3230128895,US +3230128896,3230129151,PT +3230129152,3230129663,US +3230129664,3230129919,JP +3230129920,3230130431,US +3230130432,3230130687,IE +3230130688,3230131711,US +3230131712,3230131967,CA +3230131968,3230132991,GB +3230132992,3230137599,US +3230137600,3230138111,NL +3230138112,3230140159,US +3230140160,3230140415,MT +3230140416,3230140671,US +3230140672,3230140927,FI +3230140928,3230142975,US +3230142976,3230143231,GB +3230143232,3230143487,BE +3230143488,3230144255,US +3230144256,3230144511,NL +3230144512,3230145279,US +3230145280,3230145535,CA +3230145536,3230145791,US +3230145792,3230146047,GB +3230146048,3230146303,FR +3230146304,3230146559,PT +3230146560,3230148351,US +3230148352,3230148607,AU +3230148608,3230148863,GB +3230148864,3230149119,CH +3230149120,3230150655,NI +3230150656,3230150911,US +3230150912,3230151167,PT +3230151168,3230151423,US +3230151424,3230151679,NL +3230151680,3230151935,PT +3230151936,3230152191,CA +3230152192,3230152447,FR +3230152448,3230153215,BF +3230153216,3230153471,FR +3230153472,3230153727,PF +3230153728,3230153983,US +3230153984,3230154239,RU +3230154240,3230156543,US +3230156544,3230164735,FI +3230164736,3230167551,US +3230167552,3230168063,CA +3230168064,3230177791,US +3230177792,3230178303,GB +3230178304,3230178559,CH +3230178560,3230214911,US +3230214912,3230215167,PR +3230215168,3230219775,US +3230219776,3230220031,NL +3230220032,3230220287,US +3230220288,3230222847,NL +3230222848,3230223103,ES +3230223104,3230223359,GB +3230223360,3230223615,CH +3230223616,3230225919,LU +3230225920,3230226175,AU +3230226176,3230226431,ES +3230226432,3230226687,US +3230226688,3230226943,NO +3230226944,3230228223,GB +3230228224,3230228479,ES +3230228480,3230228735,AU +3230228736,3230229759,US +3230229760,3230230015,DE +3230230016,3230236415,US +3230236416,3230236671,GB +3230236672,3230236927,CA +3230236928,3230240767,US +3230240768,3230241023,DK +3230241024,3230241791,GB +3230241792,3230242303,CH +3230242304,3230243839,US +3230243840,3230244095,HK +3230244096,3230244351,US +3230244352,3230244607,CA +3230244608,3230245119,FR +3230245120,3230246143,SE +3230246144,3230246911,US +3230246912,3230247167,CH +3230247168,3230247935,US +3230247936,3230248191,AU +3230248192,3230251007,US +3230251008,3230251263,CH +3230251264,3230251519,MX +3230251520,3230252031,CH +3230252032,3230254847,US +3230254848,3230255359,SE +3230255360,3230255615,ES +3230255616,3230257919,US +3230257920,3230259199,CH +3230259200,3230263807,US +3230263808,3230264063,SE +3230264064,3230264319,NL +3230264320,3230266111,CH +3230266112,3230267135,US +3230267136,3230267903,CA +3230267904,3230269695,US +3230269696,3230271743,GB +3230271744,3230291455,US +3230291456,3230291711,PT +3230291712,3230295039,US +3230295040,3230295295,AU +3230295296,3230296319,US +3230296320,3230297343,NO +3230297344,3230300159,SE +3230301696,3230309119,US +3230309120,3230309375,NO +3230309376,3230310143,GB +3230310144,3230316287,US +3230316288,3230316543,IT +3230316544,3230316799,US +3230316800,3230317311,CA +3230317312,3230318591,US +3230318592,3230318847,GB +3230318848,3230321663,US +3230321664,3230321919,PT +3230321920,3230323455,US +3230323456,3230323711,AT +3230323712,3230327807,US +3230327808,3230328063,AT +3230328064,3230328319,GB +3230328320,3230329087,CH +3230329088,3230332927,US +3230332928,3230333183,GB +3230333184,3230333695,US +3230333696,3230333951,NZ +3230333952,3230335231,US +3230335232,3230335743,CA +3230335744,3230335999,US +3230336000,3230336255,CA +3230336256,3230336511,US +3230336512,3230339583,CA +3230339584,3230339839,US +3230339840,3230340095,CA +3230340096,3230340351,US +3230340352,3230350847,CA +3230350848,3230351103,US +3230351104,3230354943,CA +3230354944,3230355199,FR +3230355200,3230365183,CA +3230365184,3230365439,US +3230365440,3230367743,CA +3230367744,3230367999,US +3230368000,3230368511,CA +3230368512,3230370303,US +3230370304,3230370559,CA +3230370560,3230370815,US +3230370816,3230372607,CA +3230372608,3230372863,US +3230372864,3230374399,CA +3230374400,3230374655,US +3230374656,3230383359,CA +3230383360,3230383615,US +3230383616,3230384127,CA +3230384128,3230384383,MF +3230384384,3230387455,CA +3230387456,3230387711,US +3230387712,3230400255,CA +3230400256,3230402559,US +3230402560,3230404607,BR +3230404608,3230405631,AR +3230405632,3230406655,CL +3230406656,3230414847,BR +3230414848,3230415871,CL +3230415872,3230416895,AR +3230416896,3230424063,BR +3230424064,3230425087,EC +3230425088,3230432255,BR +3230432256,3230432767,CO +3230432768,3230433023,AR +3230433024,3230433279,BR +3230433280,3230436351,CN +3230436352,3230437375,AU +3230437376,3230439423,PK +3230439424,3230440447,IN +3230440448,3230455807,CN +3230456832,3230457855,IN +3230457856,3230458367,ID +3230458368,3230458879,AU +3230458880,3230459903,IN +3230459904,3230460927,AU +3230460928,3230463999,IN +3230464000,3230465023,AU +3230465024,3230466047,BD +3230466048,3230467071,BR +3230467072,3230468095,HN +3230468096,3230469119,EC +3230469120,3230471167,BR +3230471168,3230472191,AR +3230472192,3230475263,BR +3230475264,3230476287,EC +3230476288,3230477311,PE +3230477312,3230478335,MX +3230478336,3230479359,CL +3230479360,3230482431,BR +3230482432,3230483455,CL +3230483456,3230489599,BR +3230489600,3230490623,AR +3230490624,3230497791,BR +3230497792,3230498815,MX +3230498816,3230499839,DO +3230499840,3230503935,BR +3230503936,3230504959,AR +3230504960,3230508031,BR +3230508032,3230509055,HN +3230509056,3230510079,CL +3230510080,3230511103,BR +3230511104,3230513151,AR +3230513152,3230519295,BR +3230519296,3230520319,AR +3230520320,3230521343,CL +3230521344,3230524415,BR +3230524416,3230525439,AR +3230525440,3230528511,BR +3230528512,3230529535,MX +3230529536,3230531583,BR +3230531584,3230662655,ZA +3230679040,3230681087,BR +3230681088,3230682623,FR +3230682624,3230683135,PK +3230683136,3230686207,BD +3230686208,3230687231,ID +3230687232,3230691327,BR +3230691328,3230692351,PE +3230692352,3230695423,BR +3230695424,3230728191,CN +3230777344,3230784511,BR +3230784512,3230785535,MX +3230785536,3230823679,US +3230823680,3230823935,DK +3230823936,3230824191,US +3230824192,3230824447,FR +3230824448,3230825215,US +3230825216,3230825471,GB +3230825472,3230826239,ES +3230826240,3230827519,US +3230827520,3230827775,AT +3230827776,3230828031,NZ +3230828032,3230828543,HU +3230828544,3230829055,GB +3230829568,3230830079,RU +3230830080,3230832127,US +3230832128,3230832383,NZ +3230832384,3230832639,US +3230832640,3230832895,FI +3230832896,3230833663,US +3230833664,3230833919,CA +3230833920,3230834175,BR +3230834176,3230835455,US +3230835456,3230837503,NO +3230837504,3230837759,US +3230837760,3230838015,ES +3230838016,3230840319,IT +3230840320,3230840575,FR +3230840576,3230840831,US +3230840832,3230841087,JP +3230841088,3230841343,DE +3230841344,3230841599,US +3230841600,3230841855,ES +3230841856,3230843135,US +3230843136,3230843391,NO +3230843392,3230844927,US +3230844928,3230845183,AU +3230845184,3230845951,US +3230845952,3230846207,CZ +3230846208,3230849535,US +3230849536,3230850047,NZ +3230850048,3230851839,US +3230851840,3230852095,NO +3230852096,3230852351,GB +3230852352,3230852607,BR +3230852608,3230853119,CA +3230853376,3230853887,FR +3230853888,3230854399,US +3230854400,3230854655,UY +3230854656,3230855167,NO +3230855168,3230855679,US +3230855680,3230855935,IT +3230855936,3230857983,US +3230857984,3230858751,AU +3230858752,3230865151,US +3230865152,3230865407,GB +3230865408,3230867967,US +3230867968,3230868223,IS +3230868224,3230868479,US +3230868480,3230868735,GB +3230868736,3230870015,US +3230870016,3230870271,PL +3230870272,3230878719,US +3230878720,3230879487,PT +3230879488,3230879743,FR +3230879744,3230895359,US +3230895360,3230895615,PL +3230895616,3230897151,US +3230897408,3230897663,US +3230897664,3230897919,GB +3230898688,3230898943,US +3230898944,3230899199,PT +3230899200,3230902271,US +3230902272,3230902527,NL +3230902528,3230913023,US +3230913024,3230913279,BR +3230913280,3230913535,US +3230913536,3230913791,GB +3230913792,3230914047,CA +3230914048,3230914303,US +3230914304,3230914815,FI +3230914816,3230915071,GB +3230915072,3230915327,BR +3230915328,3230915583,GB +3230915584,3230917631,US +3230917632,3230917887,GB +3230917888,3230918399,US +3230918400,3230918655,LC +3230918656,3230919423,US +3230919424,3230919679,AU +3230919680,3230922239,US +3230922240,3230922495,AU +3230922496,3230922751,IT +3230922752,3230923519,US +3230923776,3230933247,US +3230933248,3230948607,SE +3230948608,3230951167,US +3230951168,3230951423,PT +3230951424,3230953215,US +3230953216,3230954495,CA +3230954496,3230967295,AU +3230967296,3230967551,RU +3230967552,3230967807,ES +3230967808,3230969599,US +3230969600,3230969855,MX +3230969856,3230970111,US +3230970112,3230972671,GB +3230972672,3230973951,US +3230973952,3230974207,NL +3230974208,3230974463,IT +3230974464,3230974719,GB +3230974720,3230975487,US +3230975488,3230975999,GB +3230976000,3230976255,NL +3230976256,3230980095,ES +3230980096,3230980351,GB +3230980352,3230980607,CA +3230980608,3230981119,US +3230981120,3230981375,IT +3230981376,3230981631,AU +3230981632,3230981887,US +3230981888,3230984191,AU +3230984192,3230991103,US +3230991104,3230991359,PL +3230991360,3230991615,US +3230991616,3230991871,FI +3230991872,3230994175,US +3230994176,3230994431,GB +3230994432,3230995199,US +3230995200,3230995455,ES +3230995456,3230995711,AU +3230995712,3230996223,US +3230996224,3230996479,CA +3230996480,3230997247,US +3230997248,3230997503,AT +3230997504,3230997759,US +3230997760,3230999039,NL +3230999040,3230999295,US +3230999296,3230999551,NL +3230999552,3230999807,AU +3230999808,3231000831,US +3231000832,3231001087,FR +3231001088,3231003903,US +3231003904,3231004159,CA +3231004160,3231004415,AU +3231004416,3231004927,US +3231004928,3231005183,GB +3231005184,3231005439,US +3231005440,3231005695,FR +3231005696,3231005951,GB +3231005952,3231006207,US +3231006208,3231007487,CA +3231007488,3231010047,US +3231010048,3231010303,FR +3231010304,3231010815,NO +3231010816,3231011071,CA +3231011328,3231011583,US +3231011584,3231011839,CA +3231011840,3231013375,US +3231013376,3231013887,CA +3231013888,3231015423,US +3231015424,3231015679,GB +3231015680,3231015935,US +3231015936,3231016191,NO +3231016192,3231016447,US +3231016448,3231016703,NO +3231016704,3231016959,US +3231016960,3231017215,CA +3231017216,3231018495,US +3231018496,3231018751,IT +3231018752,3231019007,GB +3231019008,3231020287,US +3231020288,3231020543,GB +3231020544,3231020799,NL +3231020800,3231021567,GB +3231021568,3231021823,US +3231021824,3231022079,CA +3231022080,3231022591,US +3231022592,3231022847,DE +3231022848,3231042047,US +3231042048,3231042303,GU +3231042304,3231043839,US +3231043840,3231044095,JP +3231044096,3231048447,US +3231048448,3231048703,NL +3231048704,3231049727,US +3231049728,3231049983,AT +3231049984,3231051263,US +3231051264,3231051519,GB +3231051776,3231070463,US +3231070720,3231074559,SE +3231074560,3231075071,US +3231075072,3231075583,NL +3231075584,3231075839,US +3231075840,3231077119,SE +3231077120,3231077375,PL +3231077376,3231077631,SE +3231077632,3231078655,US +3231078656,3231078911,GB +3231078912,3231079423,CA +3231079424,3231079679,NL +3231079680,3231079935,US +3231079936,3231080191,NL +3231080192,3231082495,US +3231082496,3231082751,PL +3231082752,3231083007,US +3231083008,3231083263,GB +3231083520,3231087615,US +3231087616,3231087871,NO +3231087872,3231088127,US +3231088128,3231088383,GT +3231088384,3231088895,US +3231088896,3231091711,AU +3231091712,3231091967,GB +3231091968,3231092735,US +3231092992,3231093247,US +3231093248,3231093503,IT +3231093504,3231101183,US +3231101184,3231103231,GB +3231103232,3231103487,CA +3231103488,3231103999,US +3231104000,3231104255,NO +3231104256,3231104767,DE +3231104768,3231105023,US +3231105024,3231105535,PT +3231105536,3231106303,IT +3231106304,3231106559,NO +3231106560,3231106815,GB +3231106816,3231107071,US +3231107328,3231107583,US +3231107584,3231107839,AU +3231107840,3231108095,AT +3231108096,3231108351,GB +3231108352,3231108607,RU +3231108608,3231109119,US +3231109120,3231109375,GB +3231109376,3231109631,NO +3231109632,3231111679,US +3231111680,3231112191,NZ +3231112448,3231112959,US +3231112960,3231113215,NO +3231113216,3231113983,US +3231113984,3231115775,GB +3231115776,3231116799,AU +3231116800,3231117055,HU +3231117056,3231118847,US +3231118848,3231119103,AU +3231119104,3231119359,US +3231119360,3231119615,GB +3231119616,3231120383,TH +3231120384,3231120639,NO +3231120640,3231120895,US +3231120896,3231121151,NO +3231121152,3231149311,US +3231149312,3231149567,CA +3231149568,3231155199,US +3231155200,3231156223,CA +3231156224,3231166463,US +3231166464,3231170559,CA +3231170560,3231174655,US +3231174656,3231178751,CN +3231178752,3231179263,HK +3231179264,3231180287,US +3231180288,3231180799,HK +3231180800,3231181823,US +3231181824,3231182079,CN +3231182080,3231182847,US +3231182848,3231183871,HK +3231183872,3231184895,CN +3231184896,3231185151,US +3231185152,3231185919,CN +3231185920,3231186687,US +3231186688,3231186943,CN +3231186944,3231188479,US +3231188480,3231188735,NO +3231188736,3231190527,US +3231190528,3231190783,GB +3231190784,3231191295,US +3231191296,3231191551,GB +3231191552,3231193599,US +3231193600,3231194111,DE +3231194112,3231197695,US +3231197696,3231197951,FR +3231197952,3231198207,US +3231198208,3231198463,GB +3231198464,3231198975,US +3231198976,3231199231,PT +3231199232,3231199487,GB +3231199488,3231200255,NL +3231200256,3231200767,US +3231200768,3231201023,AT +3231201024,3231202559,US +3231202560,3231203071,GB +3231203072,3231203327,AT +3231203328,3231204351,US +3231204352,3231204607,FI +3231204608,3231204863,JP +3231204864,3231207167,US +3231207168,3231207423,CA +3231207424,3231207935,US +3231207936,3231208191,DE +3231208192,3231208959,US +3231209472,3231210239,US +3231210240,3231210495,CA +3231210496,3231211775,US +3231211776,3231212031,CA +3231212032,3231212287,CH +3231212288,3231214335,US +3231214336,3231214591,CA +3231214592,3231215359,US +3231215360,3231215615,NO +3231215616,3231215871,GB +3231215872,3231217407,US +3231217408,3231217663,AU +3231217664,3231218175,US +3231218176,3231218431,GB +3231218432,3231218687,US +3231218688,3231218943,BE +3231218944,3231223039,US +3231223040,3231223295,IT +3231223296,3231225599,US +3231225600,3231225855,DE +3231225856,3231226879,US +3231226880,3231227135,GB +3231227136,3231227391,US +3231227392,3231227647,CA +3231227648,3231228927,US +3231228928,3231229183,PR +3231229184,3231229439,CA +3231229440,3231229695,IT +3231229696,3231229951,FR +3231229952,3231231487,US +3231231488,3231231743,PT +3231231744,3231234047,US +3231234048,3231235071,GB +3231235072,3231236863,US +3231236864,3231237119,CA +3231237120,3231241215,US +3231241216,3231241471,AU +3231241472,3231241727,CA +3231241728,3231244287,US +3231244288,3231244543,CA +3231244544,3231248639,US +3231248640,3231248895,GB +3231248896,3231249407,US +3231249408,3231249663,GB +3231249664,3231250431,US +3231250432,3231250687,CA +3231250688,3231251711,US +3231251712,3231251967,GB +3231251968,3231252223,AT +3231252224,3231252991,US +3231252992,3231253503,GB +3231253504,3231255551,US +3231255808,3231256063,PT +3231256064,3231257087,US +3231257088,3231257599,HU +3231257600,3231275007,US +3231275008,3231275263,BR +3231275264,3231275519,CH +3231275520,3231276287,US +3231276288,3231276543,AU +3231276544,3231276799,US +3231276800,3231281919,JP +3231281920,3231282175,US +3231282176,3231282431,HU +3231282432,3231282943,US +3231282944,3231283199,CL +3231283200,3231283455,BR +3231283456,3231284991,US +3231284992,3231285247,NL +3231285248,3231291647,US +3231291648,3231291903,NL +3231291904,3231292159,US +3231292160,3231292415,MX +3231292416,3231292927,US +3231292928,3231293183,AU +3231293184,3231294975,US +3231294976,3231295231,NL +3231295232,3231295487,CR +3231295488,3231295743,BE +3231295744,3231296255,US +3231296512,3231296767,US +3231296768,3231299327,AT +3231299328,3231300095,US +3231300096,3231300351,CA +3231300352,3231300607,US +3231300608,3231300863,SE +3231300864,3231301119,GB +3231301120,3231302143,US +3231302144,3231302399,NL +3231302400,3231302655,US +3231302656,3231303167,AU +3231303168,3231307007,US +3231307008,3231307263,GB +3231307264,3231308031,US +3231308032,3231308287,CA +3231308288,3231308799,US +3231308800,3231309055,CA +3231309824,3231316735,US +3231316736,3231316991,NZ +3231316992,3231321343,US +3231321344,3231321599,CA +3231321600,3231322111,US +3231322112,3231322367,JP +3231322368,3231324159,SG +3231324160,3231324671,JP +3231324672,3231325183,US +3231325184,3231326207,CA +3231326208,3231352831,US +3231352832,3231358975,CA +3231358976,3231369215,US +3231369216,3231369471,TW +3231369472,3231383551,US +3231383552,3231383807,CA +3231383808,3231385343,NO +3231385344,3231401215,US +3231401216,3231401471,CA +3231401472,3231408559,US +3231408560,3231408567,AU +3231408568,3231408767,US +3231408768,3231408783,DE +3231408784,3231408871,US +3231408872,3231408879,AU +3231408880,3231411055,US +3231411056,3231411063,AU +3231411064,3231411855,US +3231411856,3231411871,AU +3231411872,3231423999,US +3231424000,3231424511,PR +3231424512,3231475199,US +3231475200,3231475455,PL +3231475456,3231477759,US +3231477760,3231478015,CA +3231478016,3231482879,US +3231482880,3231483135,BE +3231483136,3231484927,US +3231484928,3231487999,JP +3231488512,3231488767,JP +3231489280,3231489535,US +3231489536,3231489791,JP +3231489792,3231490047,AU +3231490048,3231490559,US +3231490560,3231490815,GB +3231490816,3231491327,US +3231491328,3231491583,NZ +3231491584,3231491839,US +3231491840,3231492095,GB +3231492096,3231492351,US +3231492352,3231492607,GB +3231492608,3231493631,US +3231493632,3231493887,CH +3231493888,3231500031,US +3231500032,3231500287,BM +3231500288,3231502079,US +3231502080,3231502335,AU +3231502592,3231502847,US +3231502848,3231503103,PT +3231503104,3231503615,US +3231503616,3231503871,IT +3231503872,3231506687,US +3231506688,3231506943,AU +3231506944,3231507199,US +3231507200,3231507455,BE +3231507456,3231510271,US +3231510272,3231510527,GB +3231510528,3231512575,US +3231512576,3231512831,LU +3231513088,3231514879,US +3231514880,3231515647,NO +3231515648,3231516671,US +3231516672,3231519231,SE +3231519232,3231526911,US +3231526912,3231527423,CA +3231527424,3231528191,US +3231528192,3231528287,CA +3231528288,3231528303,US +3231528304,3231528311,NO +3231528312,3231528383,US +3231528384,3231528703,CA +3231528704,3231528959,US +3231528960,3231528975,CA +3231528976,3231528983,US +3231528984,3231528999,CA +3231529000,3231529015,US +3231529016,3231529191,CA +3231529192,3231529199,US +3231529200,3231529215,CA +3231529216,3231529471,US +3231529472,3231529679,CA +3231529680,3231529687,US +3231529688,3231529727,CA +3231529728,3231529983,US +3231529984,3231530239,CA +3231530240,3231530495,IN +3231530496,3231530751,CA +3231530752,3231539199,US +3231539200,3231547391,CA +3231547392,3231547647,US +3231547648,3231547903,NO +3231547904,3231549951,US +3231549952,3231550207,JP +3231550208,3231550719,DE +3231550720,3231550975,GB +3231550976,3231551231,US +3231551232,3231551999,CA +3231552000,3231553023,US +3231553024,3231553791,JP +3231553792,3231554047,CH +3231554048,3231555327,DE +3231555328,3231555583,CA +3231555584,3231556607,US +3231556608,3231556863,CA +3231556864,3231557631,US +3231557632,3231557887,AT +3231557888,3231558399,GB +3231558400,3231558655,DE +3231558656,3231558911,GB +3231558912,3231559167,CA +3231559168,3231559423,GB +3231559424,3231559679,US +3231559680,3231559935,GB +3231559936,3231561983,US +3231561984,3231562239,IT +3231562240,3231562495,US +3231562496,3231562751,GB +3231562752,3231563007,US +3231563008,3231563263,CH +3231563264,3231563519,ZA +3231563776,3231583231,US +3231583232,3231584255,CA +3231584256,3231588863,US +3231588864,3231589119,GB +3231589120,3231591679,US +3231591680,3231591935,AU +3231591936,3231596031,US +3231596032,3231596543,PR +3231596544,3231634943,US +3231634944,3231635455,CA +3231635456,3231641855,US +3231641856,3231642111,SG +3231642112,3231649791,US +3231649792,3231653631,SG +3231653632,3231663615,US +3231663616,3231663871,FI +3231663872,3231664127,CA +3231664128,3231664383,US +3231664384,3231664639,GB +3231664640,3231665407,US +3231665408,3231665663,IT +3231665664,3231667199,US +3231667200,3231667711,ES +3231667712,3231668735,US +3231668736,3231668991,BE +3231668992,3231669759,US +3231669760,3231670015,CA +3231670016,3231670271,DE +3231670272,3231671039,US +3231671040,3231672319,GB +3231672320,3231672575,US +3231672576,3231672831,NL +3231672832,3231673343,US +3231673344,3231673599,NO +3231673600,3231673855,IE +3231673856,3231674111,US +3231674112,3231674367,CA +3231674368,3231675391,US +3231675392,3231675903,BR +3231675904,3231676159,IE +3231676160,3231676671,US +3231676672,3231676927,FR +3231676928,3231677183,FI +3231677184,3231690751,US +3231690752,3231692799,CA +3231692800,3231694847,US +3231694848,3231711231,CA +3231711232,3231713023,US +3231713024,3231713279,CA +3231713280,3231713791,US +3231713792,3231714047,GB +3231714048,3231715071,US +3231715072,3231715327,NL +3231715328,3231715583,AU +3231715584,3231716095,US +3231716096,3231716351,AU +3231716352,3231716607,US +3231716608,3231716863,TR +3231716864,3231717119,LU +3231717120,3231717375,NO +3231717376,3231718143,US +3231718144,3231718399,IT +3231718400,3231719679,US +3231719680,3231719935,ES +3231720192,3231720703,US +3231720704,3231720959,IT +3231720960,3231722751,US +3231722752,3231723007,BR +3231723008,3231724031,US +3231724032,3231724287,BR +3231724288,3231727871,US +3231727872,3231728127,DE +3231728128,3231728383,US +3231728384,3231728639,AT +3231728640,3231729407,US +3231729408,3231729663,AU +3231729664,3231735551,US +3231735552,3231736063,CH +3231736064,3231737343,US +3231737344,3231737599,CA +3231737600,3231738367,US +3231738368,3231738623,NL +3231738624,3231739135,US +3231739136,3231739391,GB +3231739392,3231739647,PL +3231739904,3231742719,US +3231742720,3231742975,FR +3231742976,3231743487,US +3231743488,3231743743,NO +3231743744,3231743999,US +3231744000,3231744255,BR +3231744256,3231747583,US +3231747584,3231747839,NL +3231747840,3231748095,GB +3231748096,3231750143,US +3231750144,3231750399,NL +3231750400,3231750911,US +3231751168,3231751423,IT +3231751424,3231752191,US +3231752192,3231752447,IT +3231752448,3231752703,AU +3231752704,3231753983,US +3231753984,3231754239,CA +3231754240,3231754495,US +3231754496,3231755263,AU +3231755264,3231755519,HU +3231755520,3231755775,US +3231755776,3231756543,PR +3231756544,3231757311,GB +3231757312,3231759359,US +3231759360,3231759615,BR +3231759616,3231760895,US +3231760896,3231761407,GB +3231761408,3231763711,US +3231763712,3231763967,AU +3231763968,3231768575,US +3231768576,3231768831,RU +3231768832,3231769087,NO +3231769344,3231769855,US +3231769856,3231770111,AU +3231770112,3231770367,US +3231770368,3231770879,AT +3231770880,3231771135,RU +3231771136,3231773951,US +3231773952,3231775231,PT +3231775232,3231775487,KY +3231775488,3231775999,NL +3231776000,3231776511,US +3231776512,3231776767,CA +3231776768,3231793151,US +3231793152,3231793663,BE +3231793664,3231799807,US +3231799808,3231800319,HK +3231800320,3231801343,CN +3231801344,3231809535,CA +3231809536,3231810047,NZ +3231810048,3231842303,US +3231842304,3231843327,RU +3231843328,3231844351,NO +3231844352,3231845375,RU +3231845376,3231846399,ES +3231846400,3231846655,RO +3231846656,3231846911,PT +3231846912,3231847167,GB +3231847168,3231847423,UA +3231847424,3231848447,RU +3231848448,3231849471,ES +3231849472,3231850495,CH +3231850496,3231851519,UA +3231851520,3231853567,RU +3231853568,3231855615,PL +3231855616,3231856639,RS +3231856640,3231857663,RU +3231857664,3231858687,PL +3231858688,3231859711,RU +3231859712,3231860735,FR +3231860736,3231861759,SA +3231861760,3231863807,UA +3231863808,3231864831,DE +3231864832,3231865855,RU +3231865856,3231866879,PL +3231866880,3231867903,CZ +3231867904,3231868927,RU +3231868928,3231869951,LV +3231869952,3231873023,UA +3231873024,3231875071,RU +3231875072,3231876095,PL +3231876096,3231877119,UA +3231877120,3231878143,NL +3231878144,3231879167,UA +3231879168,3231881215,PL +3231881216,3231882239,UA +3231882240,3231884287,RU +3231884288,3231885311,PL +3231885312,3231886335,DE +3231886336,3231888383,PL +3231888384,3231889407,RU +3231889408,3231890431,RO +3231890432,3231892479,RU +3231893504,3231894527,UA +3231895552,3231896575,UA +3231896576,3231897599,RU +3231897600,3231898623,IE +3231898624,3231899647,SE +3231899648,3231900671,UA +3231900672,3231901439,DE +3231901440,3231901695,BG +3231901696,3231903743,UA +3231903744,3231905791,RU +3231905792,3231906047,PL +3231906048,3231907839,RU +3231907840,3231916031,US +3231916032,3231948799,FI +3231948800,3231973375,US +3231973376,3232038911,AT +3232038912,3232039167,SE +3232039168,3232039423,DK +3232039424,3232039679,IT +3232039680,3232047359,SE +3232047360,3232048639,GB +3232048640,3232049151,SE +3232049152,3232049407,GB +3232049408,3232051199,SE +3232051200,3232051455,AT +3232051456,3232051967,SE +3232051968,3232052991,GB +3232052992,3232053247,US +3232053248,3232056063,SE +3232056064,3232056319,IT +3232056320,3232060415,SE +3232060416,3232060671,IE +3232060672,3232060927,IT +3232060928,3232065791,SE +3232065792,3232066303,GB +3232066304,3232066559,SE +3232066560,3232066815,NO +3232066816,3232067839,SE +3232067840,3232068095,PL +3232068096,3232069887,SE +3232069888,3232070143,CH +3232070144,3232070399,SE +3232070400,3232070655,ES +3232070656,3232079871,SE +3232079872,3232080895,GB +3232080896,3232082687,SE +3232082688,3232083199,GB +3232083200,3232083455,SE +3232083456,3232083711,DE +3232083712,3232086271,SE +3232086272,3232087039,GB +3232087040,3232089087,SE +3232089088,3232089343,ES +3232089344,3232090367,SE +3232090368,3232090623,IT +3232090624,3232095231,SE +3232095232,3232096255,GB +3232096256,3232096767,SE +3232096768,3232097023,DK +3232097024,3232098047,SE +3232098048,3232098303,FR +3232098304,3232100095,SE +3232100096,3232100351,IE +3232100352,3232101119,GB +3232101120,3232103167,SE +3232103168,3232103423,FR +3232103424,3232104447,SE +3232104448,3232106495,DE +3232107520,3232108543,RU +3232108544,3232112639,DE +3232116736,3232129023,DE +3232129024,3232130047,NL +3232130048,3232131071,UA +3232131072,3232133119,DE +3232133120,3232133631,UA +3232134144,3232135167,RU +3232135168,3232135679,PL +3232135680,3232135935,RO +3232135936,3232137215,RU +3232137216,3232139263,UA +3232139264,3232140287,GB +3232140288,3232141311,FR +3232141312,3232141823,UA +3232141824,3232142335,DE +3232142336,3232143359,ES +3232143360,3232155968,DE +3232155969,3232155969,GI +3232155970,3232156060,DE +3232156061,3232156061,GI +3232156062,3232156068,DE +3232156069,3232156069,GI +3232156070,3232156159,DE +3232156160,3232156671,PL +3232157696,3232159743,DE +3232159744,3232160767,PL +3232163840,3232165887,RU +3232169216,3232169727,DE +3232169728,3232169983,PL +3232169984,3232170240,IT +3232170241,3232170252,CN +3232170253,3232235519,IT +3232301056,3232309247,US +3232309248,3232311807,SG +3232311808,3232407039,US +3232407040,3232407551,SG +3232407552,3232432383,US +3232433664,3232440319,US +3232440320,3232448511,CA +3232448512,3232461311,US +3232461312,3232461823,CA +3232461824,3232462847,US +3232462848,3232464895,BB +3232464896,3232483327,GB +3232483328,3232492799,US +3232492800,3232493055,NL +3232493056,3232555775,US +3232555776,3232557055,JP +3232557312,3232557567,US +3232557568,3232559103,JP +3232559104,3232559359,US +3232559360,3232560127,JP +3232560896,3232561663,US +3232561664,3232561919,CA +3232561920,3232562431,US +3232562432,3232562687,LU +3232562688,3232562943,CA +3232562944,3232563455,US +3232563456,3232564479,GB +3232564480,3232567295,US +3232567296,3232569599,NZ +3232569600,3232570367,US +3232570368,3232571391,CA +3232571392,3232595967,US +3232595968,3232598015,GB +3232598016,3232629759,US +3232629760,3232630783,CA +3232630784,3232645119,US +3232645120,3232646399,AT +3232646400,3232661503,US +3232661504,3232694271,JP +3232694272,3232695807,US +3232695808,3232696319,CA +3232696320,3232702463,US +3232702464,3232703743,FI +3232703744,3232703999,FR +3232704000,3232704511,CH +3232704512,3232705535,GB +3232705536,3232706559,FI +3232706560,3232716799,US +3232716800,3232724151,CA +3232724152,3232724159,US +3232724160,3232727039,CA +3232727040,3232759807,US +3232759808,3232765951,SE +3232765952,3232766207,NO +3232766208,3232766463,SE +3232766464,3232766719,NO +3232766720,3232767231,DE +3232767232,3232774911,SE +3232774912,3232775167,IE +3232775168,3232792319,SE +3232792320,3232792575,DK +3232792576,3232794879,SE +3232794880,3232795135,DE +3232795136,3232802559,SE +3232802560,3232802815,DK +3232802816,3232803071,SE +3232803072,3232803327,IE +3232803328,3232804351,SE +3232804352,3232804607,DK +3232804608,3232804863,IT +3232804864,3232811007,SE +3232811008,3232812543,GB +3232812544,3232812799,SE +3232812800,3232813055,ES +3232813056,3232820223,SE +3232820224,3232820479,IE +3232820480,3232825343,SE +3232825344,3233288191,US +3233288192,3233292287,CA +3233292288,3233431551,US +3233431552,3233448287,CA +3233448288,3233448295,US +3233448296,3233448447,CA +3233448448,3233448463,US +3233448464,3233448479,CA +3233448480,3233448495,US +3233448496,3233448591,CA +3233448592,3233448607,US +3233448608,3233448823,CA +3233448824,3233448831,US +3233448832,3233448863,CA +3233448864,3233448871,US +3233448872,3233448879,FI +3233448880,3233448903,CA +3233448904,3233448911,US +3233448912,3233449095,CA +3233449096,3233449103,GB +3233449104,3233449199,CA +3233449200,3233449207,US +3233449208,3233449215,GB +3233449216,3233449311,CA +3233449312,3233449319,RO +3233449320,3233449359,CA +3233449360,3233449367,US +3233449368,3233449535,CA +3233449536,3233449567,US +3233449568,3233449615,CA +3233449616,3233449631,US +3233449632,3233449647,CA +3233449648,3233449663,US +3233449664,3233449759,CA +3233449760,3233449775,US +3233449776,3233449823,CA +3233449824,3233449839,US +3233449840,3233450047,CA +3233450048,3233450111,US +3233450112,3233450127,CA +3233450128,3233450135,US +3233450136,3233450199,CA +3233450200,3233450207,GB +3233450208,3233450239,CA +3233450240,3233450751,US +3233450752,3233450783,CA +3233450784,3233450815,US +3233450816,3233450863,CA +3233450864,3233450887,US +3233450888,3233450895,CA +3233450896,3233450911,US +3233450912,3233450927,CA +3233450928,3233450959,US +3233450960,3233451007,CA +3233451008,3233451263,US +3233451264,3233451519,CA +3233451520,3233451775,GB +3233451776,3233451903,CA +3233451904,3233451951,US +3233451952,3233452031,CA +3233452032,3233452287,US +3233452288,3233452303,CA +3233452304,3233452319,US +3233452320,3233452383,CA +3233452384,3233452415,US +3233452416,3233452519,CA +3233452520,3233452527,US +3233452528,3233452543,CA +3233452544,3233452831,US +3233452832,3233452847,CA +3233452848,3233452879,US +3233452880,3233452959,CA +3233452960,3233453007,US +3233453008,3233453023,CA +3233453024,3233453055,US +3233453056,3233453183,CA +3233453184,3233453199,US +3233453200,3233453247,CA +3233453248,3233453263,US +3233453264,3233453271,CA +3233453272,3233453279,US +3233453280,3233453295,CA +3233453296,3233453439,US +3233453440,3233453455,CA +3233453456,3233453471,US +3233453472,3233453567,CA +3233453568,3233453631,IT +3233453632,3233454079,US +3233454080,3233454303,CA +3233454304,3233454335,US +3233454336,3233454399,CA +3233454400,3233454415,US +3233454416,3233454423,CA +3233454424,3233454431,US +3233454432,3233454511,CA +3233454512,3233454527,US +3233454528,3233454559,CA +3233454560,3233454575,US +3233454576,3233454591,CA +3233454592,3233454599,SE +3233454600,3233455039,CA +3233455040,3233455071,US +3233455072,3233455327,CA +3233455328,3233455335,US +3233455336,3233455439,CA +3233455440,3233455447,US +3233455448,3233455471,CA +3233455472,3233455487,US +3233455488,3233455519,CA +3233455520,3233455551,US +3233455552,3233455695,CA +3233455696,3233455711,US +3233455712,3233455743,CA +3233455744,3233455807,US +3233455808,3233455855,CA +3233455856,3233455871,US +3233455872,3233455935,CA +3233455936,3233455967,US +3233455968,3233456015,CA +3233456016,3233456031,US +3233456032,3233456063,CA +3233456064,3233456111,US +3233456112,3233456119,CA +3233456120,3233456191,US +3233456192,3233456255,LV +3233456256,3233456383,US +3233456384,3233456391,UA +3233456392,3233456399,NO +3233456400,3233456447,UA +3233456448,3233456639,US +3233456640,3233456655,CA +3233456656,3233456671,US +3233456672,3233456799,CA +3233456800,3233456847,US +3233456848,3233456863,CA +3233456864,3233456895,US +3233456896,3233456943,CA +3233456944,3233456959,US +3233456960,3233456975,CA +3233456976,3233456999,US +3233457000,3233457023,CA +3233457024,3233457039,US +3233457040,3233457087,CA +3233457088,3233457471,US +3233457472,3233457519,CA +3233457520,3233457535,US +3233457536,3233457631,CA +3233457632,3233457647,US +3233457648,3233457663,CA +3233457664,3233457671,US +3233457672,3233457735,CA +3233457736,3233457775,US +3233457776,3233457831,CA +3233457832,3233457871,US +3233457872,3233457887,CA +3233457888,3233457895,US +3233457896,3233457919,CA +3233457920,3233458191,US +3233458192,3233458223,CA +3233458224,3233458271,US +3233458272,3233458303,CA +3233458304,3233458351,US +3233458352,3233458359,CA +3233458360,3233458399,US +3233458400,3233458431,CA +3233458432,3233458527,US +3233458528,3233458591,CA +3233458592,3233458607,US +3233458608,3233458687,CA +3233458688,3233458943,US +3233458944,3233458959,BG +3233458960,3233458975,US +3233458976,3233459007,BG +3233459008,3233459455,US +3233459456,3233459471,CA +3233459472,3233459631,US +3233459632,3233459679,CA +3233459680,3233459695,US +3233459696,3233459711,CA +3233459712,3233459727,US +3233459728,3233459775,CA +3233459776,3233459807,US +3233459808,3233459823,CA +3233459824,3233459839,US +3233459840,3233459967,CA +3233459968,3233459999,US +3233460000,3233460015,CA +3233460016,3233460047,US +3233460048,3233460223,CA +3233460224,3233460479,US +3233460480,3233460495,CA +3233460496,3233460511,US +3233460512,3233460519,SE +3233460520,3233460671,CA +3233460672,3233461279,US +3233461280,3233461303,CA +3233461304,3233461319,US +3233461320,3233461375,CA +3233461376,3233461407,US +3233461408,3233461487,CA +3233461488,3233461543,US +3233461544,3233461567,CA +3233461568,3233461583,US +3233461584,3233461599,CA +3233461600,3233461615,US +3233461616,3233461639,CA +3233461640,3233461679,US +3233461680,3233461727,CA +3233461728,3233461743,US +3233461744,3233461759,CA +3233461760,3233461823,US +3233461824,3233461839,CA +3233461840,3233461855,US +3233461856,3233461871,CA +3233461872,3233462015,US +3233462016,3233462127,CA +3233462128,3233462143,US +3233462144,3233462527,CA +3233462528,3233462783,US +3233462784,3233463295,CA +3233463296,3233463855,US +3233463856,3233463919,CA +3233463920,3233463999,US +3233464000,3233464063,CA +3233464064,3233484799,US +3233484800,3233487359,ES +3233487360,3233487871,US +3233487872,3233488895,CA +3233488896,3233546751,US +3233546752,3233547007,CA +3233547008,3233548799,US +3233548800,3233549055,PT +3233549056,3233549311,BR +3233549312,3233557247,US +3233557248,3233557503,NZ +3233557504,3233561855,EC +3233561856,3233562367,US +3233562368,3233562879,GB +3233562880,3233563135,FR +3233563136,3233563903,US +3233563904,3233564159,NL +3233564160,3233564415,US +3233564416,3233564671,NZ +3233564672,3233564927,US +3233564928,3233566719,JP +3233567744,3233567999,US +3233568768,3233569023,CA +3233569536,3233569791,US +3233569792,3233570047,JP +3233570048,3233570815,US +3233570816,3233571071,GB +3233571072,3233572095,US +3233572096,3233572351,AU +3233572352,3233573119,US +3233573120,3233573375,NO +3233573376,3233573631,US +3233573632,3233573887,AU +3233573888,3233575679,US +3233575680,3233575935,AU +3233575936,3233576191,RU +3233576192,3233576447,GB +3233576448,3233577215,US +3233577216,3233577727,NL +3233577728,3233578239,US +3233578240,3233578495,GB +3233578496,3233578751,US +3233578752,3233579007,IE +3233579264,3233579519,GB +3233579520,3233580031,US +3233580032,3233580287,GB +3233580288,3233581055,US +3233581056,3233581311,NL +3233581312,3233583359,US +3233583360,3233583615,GB +3233583616,3233584895,US +3233584896,3233585151,AU +3233585152,3233586431,US +3233586432,3233586943,NL +3233586944,3233588223,US +3233588224,3233589247,GA +3233589248,3233589759,CA +3233589760,3233590015,US +3233590016,3233590271,TW +3233590272,3233590527,TH +3233590528,3233590783,US +3233590784,3233591039,PH +3233591040,3233591295,ID +3233591296,3233593599,US +3233593600,3233594111,AU +3233594112,3233594367,RU +3233594368,3233594623,US +3233594624,3233594879,NL +3233594880,3233595903,US +3233595904,3233596927,EC +3233596928,3233605887,US +3233605888,3233607167,PL +3233607168,3233607935,US +3233607936,3233608191,NZ +3233608192,3233609727,HU +3233609728,3233612031,US +3233612032,3233612287,GB +3233612288,3233613823,US +3233613824,3233614847,GB +3233614848,3233615359,US +3233615360,3233615615,NL +3233615616,3233617407,US +3233617408,3233617663,CA +3233617664,3233617919,GB +3233617920,3233618175,JP +3233618176,3233620479,US +3233620480,3233620735,NZ +3233620736,3233620991,US +3233620992,3233622015,CA +3233622016,3233622271,US +3233622272,3233622527,GB +3233622528,3233624831,US +3233624832,3233625343,NL +3233625344,3233625599,US +3233625600,3233625855,AU +3233625856,3233626111,GB +3233626112,3233628415,US +3233628672,3233628927,FR +3233628928,3233629439,CA +3233629440,3233629695,GB +3233629696,3233629951,IL +3233629952,3233630463,US +3233630464,3233630719,NL +3233630720,3233630975,US +3233630976,3233631231,ZA +3233631232,3233631487,DE +3233631488,3233642239,US +3233642240,3233642495,GB +3233642496,3233646591,US +3233646592,3233646847,AU +3233646848,3233647359,US +3233647360,3233647871,GA +3233647872,3233649663,US +3233649664,3233649919,AU +3233649920,3233650431,US +3233650432,3233650687,NL +3233650688,3233651199,US +3233651200,3233651455,IT +3233651456,3233651967,US +3233651968,3233652223,NL +3233652224,3233652479,US +3233652736,3233652991,NL +3233652992,3233654271,US +3233654272,3233655551,GB +3233655552,3233663487,US +3233663488,3233663999,GB +3233664000,3233664255,CA +3233664256,3233665023,US +3233665024,3233666047,AU +3233666048,3233668863,US +3233668864,3233669119,PH +3233669120,3233670399,US +3233670400,3233670655,AU +3233671168,3233676031,US +3233676032,3233676287,DE +3233676288,3233677311,US +3233677312,3233677567,CA +3233677568,3233684991,US +3233684992,3233685503,MX +3233685504,3233688575,US +3233688576,3233688831,GB +3233688832,3233692159,US +3233692160,3233692671,NO +3233692672,3233692927,US +3233692928,3233693183,AU +3233693184,3233693695,US +3233693696,3233693951,GB +3233693952,3233694207,US +3233694208,3233694463,AU +3233694464,3233694719,GB +3233694720,3233694975,US +3233694976,3233695231,FR +3233695232,3233696511,US +3233696512,3233696767,CA +3233696768,3233701631,US +3233701632,3233701887,NO +3233701888,3233704959,US +3233704960,3233705215,AU +3233705216,3233710335,US +3233710336,3233711359,FR +3233711360,3233721599,US +3233721600,3233721855,HU +3233721856,3233722111,PT +3233722112,3233723391,US +3233723392,3233723903,AU +3233723904,3233724415,GB +3233724416,3233725951,US +3233725952,3233726975,NO +3233726976,3233728767,US +3233728768,3233729279,GB +3233729280,3233729535,US +3233729536,3233730047,AU +3233730048,3233730559,US +3233730560,3233732607,AU +3233732608,3233736959,US +3233736960,3233737983,FR +3233737984,3233738751,US +3233738752,3233739007,NL +3233739008,3233739263,US +3233739264,3233739519,FR +3233739520,3233740543,US +3233740544,3233741311,GB +3233741312,3233743359,US +3233743360,3233743615,CA +3233743616,3233744383,US +3233744384,3233744639,PR +3233744640,3233745663,US +3233745664,3233745919,CA +3233745920,3233746943,US +3233746944,3233747199,PR +3233747200,3233748735,US +3233748736,3233748991,PR +3233748992,3233749503,US +3233749504,3233750015,CA +3233750016,3233752831,US +3233752832,3233753087,PR +3233753088,3233763071,US +3233763072,3233763327,CA +3233763328,3233765887,US +3233765888,3233766143,CA +3233766144,3233768447,US +3233768448,3233768703,CA +3233768704,3233768959,PR +3233768960,3233778175,US +3233778176,3233778431,CA +3233778432,3233779455,US +3233779456,3233779711,CA +3233779712,3233781503,US +3233781504,3233781759,PR +3233781760,3233783807,US +3233783808,3233784063,PR +3233784064,3233784319,CA +3233784320,3233786111,US +3233786112,3233786367,PR +3233786368,3233790207,US +3233790208,3233790463,PR +3233790464,3233790719,CA +3233790720,3233790975,PR +3233790976,3233791231,CA +3233791232,3233791487,PR +3233791488,3233793023,US +3233793024,3233793279,PR +3233793280,3233794047,US +3233794048,3233794303,CA +3233794304,3233800447,US +3233800448,3233800703,CA +3233800704,3233800959,US +3233800960,3233801215,CA +3233801216,3233801983,US +3233801984,3233802239,CA +3233802240,3233802495,US +3233802496,3233802751,CA +3233802752,3233803007,US +3233803008,3233803263,CA +3233803264,3233808383,US +3233808384,3233873919,TW +3233873920,3233939455,US +3233939456,3234004991,FI +3234004992,3234005247,US +3234005248,3234005503,GB +3234005760,3234006015,CA +3234006016,3234007039,US +3234007040,3234007295,RU +3234007296,3234007551,US +3234007808,3234008063,US +3234008064,3234008831,NZ +3234008832,3234013695,US +3234013696,3234013951,AU +3234013952,3234014975,US +3234014976,3234015487,KR +3234015488,3234015743,US +3234015744,3234016255,IE +3234016256,3234019327,AU +3234019328,3234023423,US +3234023424,3234023679,NL +3234023680,3234030079,US +3234030080,3234030335,DE +3234030336,3234031103,US +3234031104,3234031359,AU +3234031360,3234031871,US +3234031872,3234032383,NL +3234032384,3234033151,US +3234033152,3234033407,IT +3234033408,3234033663,US +3234033664,3234033919,AU +3234033920,3234034687,US +3234034688,3234035455,GB +3234035456,3234039295,US +3234039296,3234043135,SE +3234043136,3234043903,US +3234043904,3234044159,AU +3234044160,3234047743,US +3234047744,3234047999,GB +3234048000,3234048511,US +3234048512,3234048767,AU +3234048768,3234051839,US +3234051840,3234052095,NL +3234052096,3234052351,DE +3234052352,3234052607,US +3234052864,3234054911,US +3234054912,3234055167,PT +3234055168,3234055423,US +3234055424,3234055679,AU +3234055680,3234056959,US +3234056960,3234057215,CA +3234057216,3234061055,US +3234061056,3234061311,NZ +3234061312,3234065407,US +3234065408,3234065663,GB +3234065664,3234065919,BR +3234065920,3234069247,US +3234069248,3234069503,CA +3234069504,3234070271,US +3234070272,3234070527,CA +3234070528,3234070783,US +3234070784,3234110463,FR +3234110464,3234128455,US +3234128456,3234128463,GB +3234128464,3234130695,US +3234130696,3234130703,AU +3234130704,3234131183,US +3234131184,3234131191,GB +3234131192,3234136063,US +3234136064,3234150911,CA +3234150912,3234151423,US +3234151424,3234158847,CA +3234158848,3234159103,US +3234159104,3234159615,CA +3234159616,3234160127,US +3234160128,3234167295,CA +3234167296,3234167807,US +3234167808,3234172927,CA +3234172928,3234173951,US +3234173952,3234175999,CA +3234176000,3234177279,US +3234177280,3234187007,CA +3234187008,3234187519,US +3234187520,3234189055,CA +3234189056,3234189311,US +3234189312,3234192383,CA +3234192384,3234193663,US +3234193664,3234198783,CA +3234198784,3234199039,US +3234199040,3234201343,CA +3234201344,3234203647,US +3234203648,3234205695,AR +3234205696,3234226175,US +3234226176,3234226263,CA +3234226264,3234226271,US +3234226272,3234226279,CA +3234226280,3234226303,US +3234226304,3234226711,CA +3234226712,3234226751,US +3234226752,3234226847,CA +3234226848,3234226863,US +3234226864,3234226879,CA +3234226880,3234226943,US +3234226944,3234226959,CA +3234226960,3234226967,US +3234226968,3234227007,CA +3234227008,3234227023,US +3234227024,3234227135,CA +3234227136,3234227143,US +3234227144,3234227159,CA +3234227160,3234227167,FI +3234227168,3234227191,CA +3234227192,3234227455,US +3234227456,3234227611,CA +3234227612,3234227615,US +3234227616,3234227619,CA +3234227620,3234227623,US +3234227624,3234227639,CA +3234227640,3234227643,US +3234227644,3234227695,CA +3234227696,3234227699,US +3234227700,3234227707,CA +3234227708,3234227711,US +3234227712,3234227775,CA +3234227776,3234227807,US +3234227808,3234227839,CA +3234227840,3234227879,US +3234227880,3234227903,CA +3234227904,3234227935,US +3234227936,3234227951,CA +3234227952,3234228223,US +3234228224,3234228287,CA +3234228288,3234228383,US +3234228384,3234228463,CA +3234228464,3234228479,US +3234228480,3234228607,CA +3234228608,3234228639,US +3234228640,3234228671,CA +3234228672,3234228703,US +3234228704,3234228719,CA +3234228720,3234228735,US +3234228736,3234229039,CA +3234229040,3234229047,US +3234229048,3234229063,CA +3234229064,3234229079,US +3234229080,3234229111,CA +3234229112,3234229119,US +3234229120,3234229191,CA +3234229192,3234229199,US +3234229200,3234229215,CA +3234229216,3234229223,SE +3234229224,3234229239,CA +3234229240,3234229503,US +3234229504,3234229567,CA +3234229568,3234229599,US +3234229600,3234229607,CA +3234229608,3234229615,US +3234229616,3234229695,CA +3234229696,3234229743,US +3234229744,3234229895,CA +3234229896,3234229903,US +3234229904,3234229911,CA +3234229912,3234229951,US +3234229952,3234230015,CA +3234230016,3234230207,ES +3234230208,3234230271,US +3234230272,3234230399,CA +3234230400,3234230431,US +3234230432,3234230527,CA +3234230528,3234230783,US +3234230784,3234230927,CA +3234230928,3234230991,US +3234230992,3234231007,CA +3234231008,3234231039,US +3234231040,3234231055,CA +3234231056,3234231063,US +3234231064,3234231087,CA +3234231088,3234231103,US +3234231104,3234231143,CA +3234231144,3234231151,US +3234231152,3234231255,CA +3234231256,3234231279,US +3234231280,3234231807,CA +3234231808,3234232111,US +3234232112,3234232127,CA +3234232128,3234232159,US +3234232160,3234232247,CA +3234232248,3234232255,US +3234232256,3234232319,CA +3234232320,3234232575,EG +3234232576,3234233343,US +3234233344,3234233399,CA +3234233400,3234233407,US +3234233408,3234233471,CA +3234233472,3234233487,US +3234233488,3234233519,CA +3234233520,3234233599,US +3234233600,3234233647,CA +3234233648,3234233759,US +3234233760,3234233791,CA +3234233792,3234233823,US +3234233824,3234233855,CA +3234233856,3234234127,US +3234234128,3234234143,CA +3234234144,3234234199,US +3234234200,3234234207,CA +3234234208,3234234239,US +3234234240,3234234247,CA +3234234248,3234234271,US +3234234272,3234234287,CA +3234234288,3234234335,US +3234234336,3234234367,CA +3234234368,3234267135,US +3234267136,3234267391,CA +3234267392,3234268927,US +3234268928,3234269183,SG +3234269184,3234270207,US +3234270208,3234271231,CA +3234271232,3234275327,PT +3234275328,3234279423,AU +3234279424,3234283519,CA +3234283520,3234316287,US +3234316288,3234320383,CA +3234320384,3234338815,US +3234338816,3234339071,CN +3234339072,3234339327,MT +3234339328,3234339583,DE +3234339584,3234339839,PA +3234339840,3234340095,US +3234340096,3234340351,IN +3234340352,3234349055,US +3234349056,3234353151,NZ +3234353152,3234400679,US +3234400680,3234400687,NA +3234400688,3234401511,US +3234401512,3234401519,NA +3234401520,3234529279,US +3234529280,3234529535,PR +3234529536,3234538751,US +3234538752,3234539007,TC +3234539520,3234549759,US +3234549760,3234550015,RU +3234553856,3234556415,US +3234556416,3234556927,CA +3234556928,3234557439,FI +3234557440,3234564607,US +3234564608,3234566911,KR +3234566912,3234568703,US +3234568704,3234568959,NZ +3234568960,3234569215,US +3234569728,3234569983,CL +3234569984,3234574335,US +3234574336,3234574591,AU +3234574592,3234574847,MX +3234574848,3234579711,US +3234579712,3234579967,CA +3234579968,3234581247,US +3234581248,3234581503,CA +3234581504,3234582527,US +3234583040,3234583807,US +3234583808,3234584063,AU +3234584064,3234584575,US +3234584576,3234584831,AU +3234584832,3234587391,US +3234587392,3234587647,SA +3234587648,3234588671,US +3234588672,3234588927,AU +3234588928,3234589439,US +3234589440,3234589695,AU +3234589696,3234590463,US +3234590464,3234590719,CA +3234590720,3234592511,US +3234592512,3234592767,TH +3234592768,3234726143,US +3234726144,3234726399,CA +3234726400,3234726911,US +3234726912,3234727935,CA +3234727936,3234733055,US +3234733056,3234733311,CA +3234733312,3234739711,US +3234739712,3234740223,CA +3234740224,3234745599,US +3234745600,3234746879,GB +3234746880,3234747903,US +3234747904,3234748159,IL +3234748160,3234749695,US +3234749696,3234750207,CA +3234750208,3234762751,US +3234762752,3234764799,CA +3234764800,3234766335,NZ +3234766336,3234772223,US +3234772224,3234772479,CA +3234772480,3234772735,US +3234772992,3234781439,US +3234781440,3234781951,CA +3234781952,3234782719,US +3234782720,3234783999,IL +3234784000,3234794495,US +3234794496,3234794751,CA +3234794752,3234795007,US +3234795264,3234799359,US +3234799360,3234799615,NL +3234799616,3234799871,US +3234799872,3234800127,AU +3234800128,3234800639,US +3234800640,3234800895,AU +3234800896,3234801663,US +3234801664,3234802431,EC +3234802432,3234803711,US +3234803712,3234803967,PR +3234803968,3234806783,US +3234806784,3234807295,CA +3234807296,3234807807,US +3234807808,3234808063,AU +3234808064,3234809087,EC +3234809088,3234810879,US +3234810880,3234811135,CA +3234811136,3234814719,US +3234814720,3234814975,HK +3234814976,3234815999,US +3234816000,3234816767,AU +3234816768,3234820351,US +3234820352,3234820607,AU +3234820608,3234821887,US +3234821888,3234822655,AU +3234822656,3234826751,US +3234826752,3234827007,CA +3234827008,3234827519,US +3234827520,3234828031,NL +3234828032,3234828287,NZ +3234828288,3234828799,US +3234828800,3234829055,CL +3234829056,3234830079,US +3234830080,3234830847,AU +3234831360,3234832127,AU +3234832128,3234832639,US +3234832640,3234832895,AU +3234832896,3234833663,US +3234833664,3234833919,AU +3234833920,3234838271,US +3234838272,3234838527,GT +3234838528,3234839295,US +3234839296,3234839551,AU +3234839552,3234841087,US +3234841088,3234841599,BR +3234841600,3234841855,PT +3234841856,3234842367,AU +3234842368,3234842623,US +3234842624,3234843647,BR +3234843648,3234844159,MX +3234844160,3234844415,BR +3234844416,3234853375,US +3234853376,3234853631,TH +3234853632,3234853887,US +3234853888,3234854143,EC +3234854144,3234854911,US +3234854912,3234855167,AU +3234855168,3234857215,US +3234857216,3234861055,CA +3234861056,3234988287,US +3234988288,3234990847,CA +3234990848,3235004415,US +3235004416,3235020799,CA +3235020800,3235021567,US +3235021568,3235021823,CA +3235021824,3235044375,US +3235044376,3235044383,GB +3235044384,3235046831,US +3235046832,3235046847,AF +3235046848,3235065343,US +3235065344,3235065855,CA +3235065856,3235068511,US +3235068512,3235068575,IT +3235068576,3235085311,US +3235085312,3235086335,CA +3235086336,3235108863,US +3235108864,3235109119,TW +3235109120,3235109375,CN +3235109376,3235184639,US +3235184640,3235184895,CA +3235184896,3235275775,US +3235275776,3235276799,CA +3235276800,3235278847,US +3235278848,3235282943,BB +3235282944,3235315711,CA +3235315712,3235389439,US +3235389440,3235389951,VE +3235389952,3235512319,US +3235512320,3235577855,JP +3235577856,3235641855,CA +3235641856,3235642111,US +3235642112,3235643135,CA +3235643136,3235745791,US +3235745792,3235746047,DE +3235746048,3235746303,US +3235746304,3235746559,DE +3235746560,3235747839,US +3235747840,3235748095,GB +3235748096,3235748351,US +3235748352,3235748607,GB +3235748608,3235753983,US +3235753984,3235754239,SG +3235754240,3235754495,JP +3235754496,3235774719,US +3235774720,3235776767,CA +3235776768,3235800575,US +3235800576,3235801087,CA +3235801088,3235807231,US +3235807232,3235839999,CA +3235840000,3235843071,US +3235843072,3235844031,CA +3235844032,3235844063,US +3235844064,3235844095,CA +3235844096,3235856383,US +3235856384,3235872767,BO +3235872768,3235906303,US +3235906304,3235906559,CA +3235906560,3235908863,US +3235908864,3235909119,CA +3235909120,3235912447,US +3235912448,3235912703,CA +3235912704,3235914495,US +3235914496,3235914751,CA +3235914752,3235916543,US +3235916544,3235916799,VI +3235916800,3235917567,US +3235917568,3235917823,CA +3235917824,3235919359,US +3235919360,3235919615,CA +3235919616,3235921151,US +3235921152,3235921407,PR +3235921408,3235926271,US +3235926272,3235926527,CA +3235926528,3235927295,US +3235927296,3235927807,CA +3235927808,3235928319,US +3235928320,3235929343,CA +3235929344,3235929599,US +3235929600,3235929855,CA +3235929856,3235932159,US +3235932160,3235932415,CA +3235932416,3235932671,US +3235932672,3235932927,CA +3235932928,3235937023,US +3235937024,3235937535,CA +3235937536,3235937791,US +3235937792,3235938047,CA +3235938048,3235941631,US +3235941632,3235941887,CA +3235941888,3235945983,US +3235945984,3235946239,CA +3235946240,3235946751,US +3235946752,3235947007,CA +3235947008,3235949311,US +3235949312,3235950335,CA +3235950336,3235950591,US +3235950592,3235950847,CA +3235950848,3235951871,US +3235951872,3235952127,CA +3235952128,3235957247,US +3235957248,3235957503,PR +3235957504,3235957759,US +3235957760,3235958015,DE +3235958016,3235959551,US +3235959552,3235959807,CA +3235959808,3235960319,US +3235960320,3235960575,CA +3235960576,3235962111,US +3235962112,3235962367,CA +3235962368,3235963647,US +3235963648,3235963903,CA +3235963904,3235966975,US +3235966976,3235967231,PR +3235967232,3235967743,US +3235967744,3235967999,CA +3235968000,3235968511,US +3235968512,3235968767,CA +3235968768,3235970559,US +3235970560,3235970815,CA +3235970816,3235971071,US +3235971072,3235971327,CA +3235971328,3235996671,US +3235996672,3235997183,CA +3235997184,3235997695,US +3235997696,3235998207,CA +3235998208,3235998719,US +3235998720,3235999231,CA +3235999232,3236044799,US +3236044800,3236052991,CA +3236052992,3236069375,US +3236069376,3236102143,CA +3236102144,3236102399,US +3236102400,3236106239,PH +3236106240,3236140543,US +3236140544,3236141055,CA +3236141056,3236142151,US +3236142152,3236142159,CA +3236142160,3236146195,US +3236146196,3236146199,GB +3236146200,3236147063,US +3236147064,3236147071,FR +3236147072,3236156959,US +3236156960,3236156967,GB +3236156968,3236157951,US +3236157952,3236158207,GB +3236158208,3236167935,US +3236167936,3236175871,CA +3236175872,3236200447,US +3236200448,3236233215,MY +3236233216,3236239359,US +3236239360,3236241407,CA +3236241408,3236267519,US +3236267520,3236268031,DE +3236268032,3236268543,ES +3236268544,3236272639,US +3236272640,3236272895,HK +3236272896,3236273919,US +3236273920,3236274175,DE +3236274176,3236275199,US +3236275200,3236275711,FR +3236275712,3236276223,AU +3236276224,3236277759,US +3236277760,3236278783,IN +3236278784,3236279807,US +3236279808,3236280063,GB +3236280064,3236281855,US +3236281856,3236282367,SG +3236282368,3236287487,US +3236287488,3236287743,EC +3236287744,3236287999,CO +3236288000,3236291071,US +3236291072,3236291327,GB +3236291328,3236302847,US +3236306944,3236312063,US +3236312064,3236312319,MO +3236312320,3236312575,GH +3236312576,3236312831,GR +3236312832,3236313087,VG +3236313088,3236314367,US +3236314368,3236314623,GB +3236314624,3236319743,US +3236319744,3236319999,ES +3236320000,3236365567,US +3236365568,3236365823,CA +3236365824,3236368127,US +3236368128,3236368383,NZ +3236368384,3236372991,US +3236372992,3236373247,AU +3236373248,3236373503,US +3236373504,3236373759,BS +3236373760,3236379391,US +3236379392,3236379647,AU +3236379648,3236381183,US +3236381184,3236381439,CA +3236381440,3236381695,AT +3236381696,3236385279,US +3236385280,3236385535,DE +3236385536,3236387071,US +3236387072,3236387327,CA +3236387328,3236387839,US +3236387840,3236389375,PR +3236389376,3236392447,US +3236392448,3236392703,CL +3236392704,3236393471,US +3236393472,3236393983,BR +3236393984,3236395007,CO +3236395008,3236395519,AR +3236395520,3236396799,US +3236396800,3236397055,AU +3236397056,3236398847,US +3236398848,3236399359,AU +3236399616,3236400127,US +3236400128,3236400383,CL +3236400384,3236400639,AU +3236400640,3236406783,US +3236406784,3236407551,AU +3236407552,3236408063,SG +3236408064,3236408319,US +3236408320,3236409087,CA +3236409088,3236409599,BR +3236409600,3236412415,US +3236412416,3236412671,CA +3236412672,3236413695,US +3236413696,3236413951,AU +3236413952,3236416255,US +3236416256,3236416511,AU +3236416512,3236418559,US +3236418560,3236418815,AU +3236418816,3236427519,US +3236427520,3236427775,CA +3236427776,3236429311,US +3236429312,3236429567,MU +3236429568,3236462591,US +3236462592,3236470783,AU +3236470784,3236560895,US +3236560896,3236561151,CA +3236561152,3236566783,US +3236566784,3236567039,CA +3236567040,3236585983,US +3236585984,3236586239,CA +3236586240,3236604671,US +3236604672,3236604927,CA +3236604928,3236611071,US +3236611072,3236612095,CA +3236612096,3236613119,US +3236613120,3236613375,CA +3236613376,3236617983,US +3236617984,3236619775,CA +3236619776,3236620031,US +3236620288,3236623615,US +3236623616,3236623871,AU +3236623872,3236625919,US +3236625920,3236626175,CA +3236626176,3236638719,US +3236638720,3236642815,BB +3236642816,3236659199,US +3236659200,3236691967,CA +3236691968,3236695039,US +3236695040,3236696063,CA +3236696064,3236757503,US +3236757504,3236765695,CA +3236765696,3236774911,US +3236774912,3236775423,HK +3236775424,3236775679,NL +3236775680,3236776191,CA +3236776192,3236776447,DE +3236776448,3236776959,US +3236776960,3236777215,CA +3236777216,3236778239,US +3236778240,3236778751,GB +3236778752,3236780287,US +3236780288,3236780543,FR +3236780544,3236780799,CH +3236780800,3236781599,US +3236781600,3236781615,NL +3236781616,3236781727,US +3236781728,3236781759,NL +3236781760,3236781823,US +3236781824,3236782335,ES +3236782336,3236782719,US +3236782720,3236782751,BE +3236782752,3236782847,US +3236782848,3236782911,LU +3236782912,3236784383,US +3236784384,3236784895,IT +3236784896,3236785663,US +3236785664,3236785919,DE +3236785920,3236786175,ZA +3236786176,3236786431,US +3236786432,3236786687,FR +3236786688,3236787199,CA +3236787200,3236787967,US +3236787968,3236788223,JP +3236788224,3236788479,US +3236788480,3236789503,GB +3236789504,3236823295,US +3236823296,3236825855,CH +3236825856,3236827135,CA +3236827136,3236958207,US +3236958208,3236962303,AU +3236962304,3236985063,US +3236985064,3236985071,AU +3236985072,3236985079,JP +3236985080,3236995623,US +3236995624,3236995631,NL +3236995632,3237003263,US +3237003264,3237003519,GB +3237003520,3237008639,US +3237008640,3237008895,DE +3237008896,3237009663,US +3237009664,3237009919,GB +3237009920,3237010687,US +3237010688,3237010943,NL +3237010944,3237011199,GB +3237011200,3237011711,US +3237011712,3237011967,AU +3237011968,3237012223,US +3237012224,3237012479,NL +3237012480,3237012735,GB +3237012736,3237012991,AU +3237012992,3237013247,US +3237013248,3237013503,NL +3237013504,3237013759,GB +3237013760,3237014015,US +3237014016,3237014271,AU +3237014272,3237014527,NL +3237014528,3237015807,US +3237015808,3237016063,CA +3237016064,3237016319,US +3237016320,3237016575,CA +3237016576,3237016831,US +3237016832,3237017087,GB +3237017088,3237018111,US +3237018112,3237018367,DE +3237018368,3237036063,US +3237036064,3237036095,CA +3237036096,3237036127,US +3237036128,3237036135,CA +3237036136,3237036159,US +3237036160,3237036255,CA +3237036256,3237036351,US +3237036352,3237036367,CA +3237036368,3237036383,US +3237036384,3237036415,CA +3237036416,3237036495,US +3237036496,3237036511,CA +3237036512,3237036543,US +3237036544,3237036799,CN +3237036800,3237037311,US +3237037312,3237037567,CA +3237037568,3237037583,US +3237037584,3237037607,CA +3237037608,3237037631,US +3237037632,3237037703,CA +3237037704,3237037711,US +3237037712,3237037767,CA +3237037768,3237037775,NO +3237037776,3237037815,CA +3237037816,3237037823,US +3237037824,3237037887,CA +3237037888,3237037895,US +3237037896,3237037943,CA +3237037944,3237037959,US +3237037960,3237037967,CA +3237037968,3237037975,US +3237037976,3237037999,CA +3237038000,3237038007,US +3237038008,3237038031,CA +3237038032,3237038047,US +3237038048,3237038367,CA +3237038368,3237038399,US +3237038400,3237038415,CA +3237038416,3237038431,US +3237038432,3237038495,CA +3237038496,3237038575,US +3237038576,3237038607,CA +3237038608,3237038615,US +3237038616,3237038663,CA +3237038664,3237038671,US +3237038672,3237038679,CA +3237038680,3237038687,US +3237038688,3237038743,CA +3237038744,3237038751,US +3237038752,3237038767,CA +3237038768,3237038775,US +3237038776,3237038783,CA +3237038784,3237038791,US +3237038792,3237038831,CA +3237038832,3237038839,US +3237038840,3237038863,CA +3237038864,3237038879,US +3237038880,3237038911,CA +3237038912,3237038927,US +3237038928,3237039007,CA +3237039008,3237039039,US +3237039040,3237039103,CA +3237039104,3237039183,US +3237039184,3237039199,CA +3237039200,3237039215,US +3237039216,3237039295,CA +3237039296,3237039343,US +3237039344,3237039359,CA +3237039360,3237039615,US +3237039616,3237039935,CA +3237039936,3237040063,US +3237040064,3237040143,CA +3237040144,3237040159,US +3237040160,3237040287,CA +3237040288,3237040303,US +3237040304,3237040319,CA +3237040320,3237040335,US +3237040336,3237040351,CA +3237040352,3237040511,US +3237040512,3237040639,CA +3237040640,3237040895,US +3237040896,3237041151,CA +3237041152,3237041183,US +3237041184,3237041199,CA +3237041200,3237041407,US +3237041408,3237041663,CA +3237041664,3237041823,US +3237041824,3237041935,CA +3237041936,3237041983,US +3237041984,3237042047,CA +3237042048,3237042063,US +3237042064,3237042127,CA +3237042128,3237042431,US +3237042432,3237042463,CA +3237042464,3237042471,US +3237042472,3237042479,CA +3237042480,3237042495,US +3237042496,3237042607,CA +3237042608,3237042623,US +3237042624,3237042631,CA +3237042632,3237042639,US +3237042640,3237042647,CA +3237042648,3237042655,US +3237042656,3237042679,CA +3237042680,3237043455,US +3237043456,3237043711,CA +3237043712,3237043967,US +3237043968,3237044223,CH +3237044224,3237044287,US +3237044288,3237044351,CA +3237044352,3237044479,US +3237044480,3237044623,CA +3237044624,3237044631,US +3237044632,3237044639,CA +3237044640,3237044647,US +3237044648,3237044695,CA +3237044696,3237044703,US +3237044704,3237044711,CA +3237044712,3237044719,US +3237044720,3237044727,CA +3237044728,3237044735,US +3237044736,3237044815,CA +3237044816,3237044831,US +3237044832,3237044887,CA +3237044888,3237044895,US +3237044896,3237045031,CA +3237045032,3237045039,US +3237045040,3237045223,CA +3237045224,3237045231,US +3237045232,3237045247,CA +3237045248,3237045663,US +3237045664,3237045671,FI +3237045672,3237046559,US +3237046560,3237046607,CA +3237046608,3237046623,US +3237046624,3237046647,CA +3237046648,3237046655,SE +3237046656,3237046671,CA +3237046672,3237046767,US +3237046768,3237046775,CA +3237046776,3237046815,US +3237046816,3237046879,CA +3237046880,3237046943,US +3237046944,3237047039,CA +3237047040,3237047295,FR +3237047296,3237047807,US +3237047808,3237047839,CA +3237047840,3237047871,US +3237047872,3237047935,CA +3237047936,3237048031,US +3237048032,3237048079,CA +3237048080,3237048111,US +3237048112,3237048127,CA +3237048128,3237048143,US +3237048144,3237048159,CA +3237048160,3237048191,US +3237048192,3237048255,CA +3237048256,3237048575,US +3237048576,3237048767,CA +3237048768,3237048783,US +3237048784,3237049855,CA +3237049856,3237050111,US +3237050112,3237050159,GB +3237050160,3237050175,US +3237050176,3237050303,GB +3237050304,3237051903,US +3237051904,3237052159,TR +3237052160,3237052319,CA +3237052320,3237052367,US +3237052368,3237052415,CA +3237052416,3237125295,US +3237125296,3237125311,CR +3237125312,3237154815,US +3237154816,3237155839,ES +3237155840,3237156863,AU +3237156864,3237170175,US +3237170176,3237171199,CA +3237171200,3237182463,US +3237182464,3237183487,NL +3237183488,3237205503,US +3237205504,3237206015,CA +3237206016,3237216255,US +3237216256,3237281791,JP +3237281792,3237285119,US +3237285120,3237285631,AU +3237285632,3237287935,US +3237287936,3237288191,CA +3237288192,3237289471,US +3237289472,3237289727,BR +3237289728,3237290495,US +3237291008,3237291263,NZ +3237291264,3237294847,US +3237294848,3237295103,CA +3237295104,3237296639,US +3237296640,3237297151,SG +3237297152,3237297407,CL +3237297408,3237305087,US +3237305088,3237305343,CA +3237305344,3237308671,US +3237308672,3237310719,AU +3237310720,3237312767,US +3237312768,3237313023,BO +3237313024,3237319679,US +3237319680,3237319935,DZ +3237319936,3237320703,US +3237320704,3237320959,UA +3237320960,3237321471,US +3237321728,3237322751,US +3237322752,3237323263,CA +3237323264,3237323519,IN +3237323520,3237325055,US +3237325056,3237325311,PL +3237325312,3237325823,US +3237325824,3237326079,CA +3237326080,3237328639,US +3237328640,3237328895,CA +3237328896,3237329151,US +3237329152,3237329407,NZ +3237329408,3237330943,US +3237330944,3237331199,AU +3237331200,3237331967,US +3237331968,3237332223,HK +3237332224,3237335039,US +3237335040,3237335295,AU +3237335296,3237335551,US +3237335552,3237337599,AU +3237337600,3237337855,US +3237338112,3237339391,US +3237339392,3237339647,GB +3237339648,3237340159,US +3237340160,3237340415,CA +3237340416,3237345535,US +3237345536,3237346303,KR +3237346304,3237366015,US +3237366016,3237366271,AU +3237366272,3237412863,US +3237412864,3237413119,CA +3237413120,3237415679,GB +3237415680,3237415935,US +3237415936,3237416959,CA +3237416960,3237478399,US +3237478400,3237511167,LK +3237511168,3237548031,US +3237548032,3237552127,KR +3237552128,3237554431,US +3237554432,3237554434,SG +3237554435,3237554435,US +3237554436,3237554463,SG +3237554464,3237554943,US +3237554944,3237555199,SG +3237555200,3237568511,US +3237568512,3237572607,CA +3237572608,3237576703,US +3237576704,3237609471,CA +3237609472,3237613567,US +3237613568,3237614591,CA +3237614592,3237615615,US +3237615616,3237616895,CA +3237616896,3237642239,US +3237642240,3237650431,AU +3237650432,3237653503,US +3237653504,3237653759,IN +3237653760,3237655039,US +3237655040,3237655551,IN +3237655552,3237675007,US +3237675008,3237675263,CA +3237675264,3237681663,US +3237681664,3237682943,CA +3237682944,3237684991,US +3237684992,3237685247,CL +3237685248,3237688319,US +3237688320,3237689343,CA +3237689344,3237690623,US +3237690624,3237691903,SA +3237691904,3237698303,US +3237698304,3237698559,CA +3237698560,3237712895,US +3237712896,3237713151,AU +3237713152,3237716991,US +3237716992,3237717247,CA +3237717248,3237717503,US +3237717504,3237717759,CA +3237717760,3237724927,US +3237724928,3237725183,AU +3237725184,3237725439,CA +3237725440,3237725695,US +3237725696,3237726207,CA +3237726208,3237726463,US +3237726720,3237726975,GH +3237726976,3237727231,US +3237727232,3237728255,AU +3237728256,3237732863,US +3237732864,3237733119,NL +3237734144,3237734399,CA +3237734400,3237773311,US +3237773312,3237777407,CA +3237777408,3237781503,US +3237781504,3237785599,CA +3237785600,3237797887,US +3237797888,3237801983,CA +3237801984,3237858303,US +3237858304,3237863423,CA +3237863424,3237863431,US +3237863432,3237863439,CN +3237863440,3237863447,US +3237863448,3237863463,CN +3237863464,3237863471,US +3237863472,3237863559,CN +3237863560,3237863567,US +3237863568,3237863591,CN +3237863592,3237863599,US +3237863600,3237863607,CN +3237863608,3237863623,US +3237863624,3237863639,CN +3237863640,3237863655,US +3237863656,3237863663,CN +3237863664,3237863687,US +3237863688,3237863735,CN +3237863736,3237863751,US +3237863752,3237863775,CN +3237863776,3237863791,US +3237863792,3237863823,CN +3237863824,3237863839,US +3237863840,3237863871,CN +3237863872,3237863879,US +3237863880,3237863887,CN +3237863888,3237863903,US +3237863904,3237863927,CN +3237863928,3237863935,US +3237863936,3237863951,CN +3237863952,3237863959,US +3237863960,3237863967,CN +3237863968,3237863975,US +3237863976,3237863983,CN +3237863984,3237863991,US +3237863992,3237864007,CN +3237864008,3237864015,US +3237864016,3237864079,CN +3237864080,3237864087,US +3237864088,3237864127,CN +3237864128,3237864135,US +3237864136,3237864143,CN +3237864144,3237864151,US +3237864152,3237864159,CN +3237864160,3237864167,US +3237864168,3237864199,CN +3237864200,3237864207,US +3237864208,3237864215,CN +3237864216,3237864231,US +3237864232,3237864247,CN +3237864248,3237864255,US +3237864256,3237864263,CN +3237864264,3237864271,US +3237864272,3237864335,CN +3237864336,3237864343,US +3237864344,3237864351,CN +3237864352,3237864359,US +3237864360,3237864375,CN +3237864376,3237864383,US +3237864384,3237864423,CN +3237864424,3237864431,US +3237864432,3237864439,CN +3237864440,3237864447,US +3237864448,3237864527,CN +3237864528,3237864543,US +3237864544,3237864583,CN +3237864584,3237864591,US +3237864592,3237864631,CN +3237864632,3237864639,US +3237864640,3237864679,CN +3237864680,3237864703,US +3237864704,3237864711,CN +3237864712,3237864735,US +3237864736,3237864791,CN +3237864792,3237864799,US +3237864800,3237864807,CN +3237864808,3237864815,US +3237864816,3237864903,CN +3237864904,3237864911,US +3237864912,3237864919,CN +3237864920,3237864935,US +3237864936,3237864975,CN +3237864976,3237864983,US +3237864984,3237864999,CN +3237865000,3237865007,US +3237865008,3237865079,CN +3237865080,3237865111,US +3237865112,3237865127,CN +3237865128,3237865135,US +3237865136,3237865167,CN +3237865168,3237865183,US +3237865184,3237865255,CN +3237865256,3237865263,US +3237865264,3237865311,CN +3237865312,3237865319,US +3237865320,3237865375,CN +3237865376,3237865383,US +3237865384,3237865415,CN +3237865416,3237865463,US +3237865464,3237865471,CN +3237865472,3237865487,US +3237865488,3237865495,CN +3237865496,3237865519,US +3237865520,3237865591,CN +3237865592,3237865599,US +3237865600,3237865631,CN +3237865632,3237865639,US +3237865640,3237865647,CN +3237865648,3237865663,US +3237865664,3237865679,CN +3237865680,3237865687,US +3237865688,3237865767,CN +3237865768,3237865775,US +3237865776,3237865799,CN +3237865800,3237865807,US +3237865808,3237865815,CN +3237865816,3237865839,US +3237865840,3237865855,CN +3237865856,3237865871,US +3237865872,3237865879,CN +3237865880,3237865895,US +3237865896,3237866039,CN +3237866040,3237866055,US +3237866056,3237866071,CN +3237866072,3237866087,US +3237866088,3237866095,CN +3237866096,3237866103,US +3237866104,3237866143,CN +3237866144,3237866151,US +3237866152,3237866215,CN +3237866216,3237866223,US +3237866224,3237866287,CN +3237866288,3237866295,US +3237866296,3237866319,CN +3237866320,3237866327,US +3237866328,3237866391,CN +3237866392,3237866399,US +3237866400,3237866439,CN +3237866440,3237866455,US +3237866456,3237866527,CN +3237866528,3237866535,US +3237866536,3237866591,CN +3237866592,3237866615,US +3237866616,3237866655,CN +3237866656,3237866687,US +3237866688,3237866735,CN +3237866736,3237866759,US +3237866760,3237866767,CN +3237866768,3237866775,US +3237866776,3237866823,CN +3237866824,3237866831,US +3237866832,3237866839,CN +3237866840,3237866855,US +3237866856,3237866863,CN +3237866864,3237866903,US +3237866904,3237866911,CN +3237866912,3237866919,US +3237866920,3237866975,CN +3237866976,3237866983,US +3237866984,3237867007,CN +3237867008,3237867015,US +3237867016,3237867023,CN +3237867024,3237867031,US +3237867032,3237867039,CN +3237867040,3237867055,US +3237867056,3237867063,CN +3237867064,3237867071,US +3237867072,3237867079,CN +3237867080,3237867087,US +3237867088,3237867103,CN +3237867104,3237867119,US +3237867120,3237867175,CN +3237867176,3237867183,US +3237867184,3237867239,CN +3237867240,3237867247,US +3237867248,3237867255,CN +3237867256,3237867279,US +3237867280,3237867287,CN +3237867288,3237867295,US +3237867296,3237867319,CN +3237867320,3237867327,US +3237867328,3237867343,CN +3237867344,3237867359,US +3237867360,3237867407,CN +3237867408,3237867423,US +3237867424,3237867447,CN +3237867448,3237867455,US +3237867456,3237867471,CN +3237867472,3237867479,US +3237867480,3237867495,CN +3237867496,3237867503,US +3237867504,3237867511,CN +3237867512,3237867519,US +3237867520,3237867775,HK +3237867776,3237868031,AU +3237868032,3237868159,HK +3237868160,3237868287,AU +3237868288,3237868543,DK +3237868544,3237868799,GB +3237868800,3237869311,US +3237869312,3237869439,KR +3237869440,3237869567,JP +3237869568,3237869823,AU +3237869824,3237869951,PH +3237869952,3237870079,VN +3237870080,3237870335,IS +3237870336,3237870591,SG +3237870592,3237870847,BN +3237870848,3237871103,RO +3237871104,3237871231,TH +3237871232,3237871359,TW +3237871360,3237871615,RU +3237871616,3237892063,US +3237892064,3237892071,GB +3237892072,3237893631,US +3237893632,3237893887,TW +3237893888,3237894911,US +3237894912,3237895167,HK +3237895168,3237895423,US +3237895424,3237895679,HK +3237895680,3237896191,US +3237896192,3237900287,PR +3237900288,3237955071,US +3237955072,3237955327,NL +3237955328,3237955591,US +3237955592,3237955599,NL +3237955600,3237956367,US +3237956368,3237956383,NL +3237956384,3237957247,US +3237957248,3237957375,NL +3237957376,3237957631,GB +3237957632,3237957887,AU +3237957888,3237958143,CA +3237958144,3237958399,PE +3237958400,3237958655,BS +3237958656,3237958911,PY +3237958912,3237959167,JM +3237959168,3237959423,GY +3237959424,3237959679,NI +3237959680,3237959935,US +3237959936,3237960191,CA +3237960192,3237960447,SR +3237960448,3237960703,GB +3237960704,3237960959,AU +3237960960,3237961215,DE +3237961216,3237961471,US +3237961472,3237961727,CA +3237961728,3237961983,US +3237961984,3237962239,CA +3237962240,3237962495,GB +3237962496,3237962751,AU +3237962752,3237963007,CA +3237963008,3237963519,US +3237963520,3237963775,RO +3237963776,3237964031,AU +3237964032,3237964287,RO +3237964288,3237964799,US +3237964800,3237965055,DE +3237965056,3237965311,US +3237965312,3237965567,DE +3237965568,3237965823,US +3237965824,3237966079,DE +3237966080,3237966591,US +3237966592,3237966847,DE +3237966848,3237967103,US +3237967104,3237967359,IT +3237967360,3237967615,DE +3237967616,3237968639,US +3237968640,3237968895,NL +3237968896,3237969151,US +3237969152,3237969407,RO +3237969408,3238002687,US +3238002688,3238008831,NL +3238008832,3238010879,AE +3238010880,3238017023,CH +3238017024,3238018303,DK +3238018304,3238018559,UA +3238018560,3238018815,FR +3238018816,3238019071,DE +3238019072,3238035711,PL +3238035968,3238037503,RU +3238037504,3238039039,LV +3238039040,3238039551,UA +3238039552,3238039807,PL +3238039808,3238040063,RU +3238040576,3238042623,RU +3238042624,3238042879,IR +3238042880,3238043135,IT +3238043136,3238043647,GB +3238043648,3238043903,NL +3238043904,3238044159,DK +3238044160,3238044671,KZ +3238044672,3238045183,FI +3238045184,3238047743,RU +3238047744,3238048255,GB +3238048256,3238048767,NL +3238048768,3238049791,CH +3238049792,3238050303,RU +3238050304,3238050815,DE +3238050816,3238051071,AT +3238051072,3238051327,GB +3238051328,3238051583,RO +3238051584,3238051839,GB +3238051840,3238053375,PL +3238053376,3238053631,RU +3238053632,3238053887,DE +3238053888,3238054911,RU +3238054912,3238055935,UA +3238055936,3238056959,PL +3238057216,3238057471,BG +3238057472,3238057983,RU +3238057984,3238059519,UA +3238059520,3238059775,NO +3238059776,3238060031,UA +3238060032,3238060287,CH +3238060288,3238060543,RO +3238060544,3238060799,HU +3238061056,3238061311,UA +3238061824,3238062079,CZ +3238062080,3238062591,CH +3238063104,3238063359,PL +3238063360,3238063615,CH +3238063616,3238063871,DE +3238064128,3238064383,UA +3238064384,3238064639,ES +3238064640,3238064895,PL +3238064896,3238065151,DK +3238065152,3238065407,SI +3238065664,3238065919,DE +3238065920,3238066175,UA +3238066176,3238066431,DE +3238066432,3238066687,GB +3238066688,3238066943,DE +3238066944,3238067199,LT +3238067200,3238067455,NO +3238067456,3238067711,SE +3238067712,3238067967,AT +3238067968,3238068223,GB +3238068224,3238133759,IE +3238133760,3238199295,SI +3238199296,3238264831,DK +3238264832,3238330367,IS +3238330368,3238337023,CH +3238337024,3238337535,LI +3238337536,3238395903,CH +3238395904,3238461439,HU +3238461440,3238502399,DE +3238502400,3238504447,RU +3238504448,3238510591,DE +3238518784,3238526975,DE +3238526976,3238527231,RU +3238529024,3238530047,CH +3238531072,3238535167,CH +3238535168,3238536191,SE +3238536192,3238537215,DK +3238537216,3238538495,CH +3238538496,3238538751,PL +3238538752,3238539263,UA +3238539264,3238541311,CH +3238541568,3238541823,PL +3238541824,3238542591,CH +3238542592,3238542847,PL +3238543360,3238545407,CH +3238545920,3238546431,RU +3238546432,3238546943,CH +3238546944,3238547455,UA +3238548992,3238549503,CZ +3238549504,3238555647,CH +3238559232,3238559487,SE +3238559744,3238562303,CH +3238562560,3238562815,IR +3238562816,3238573567,CH +3238573568,3238574079,PL +3238575104,3238578431,CH +3238578432,3238578687,UA +3238578944,3238579199,RU +3238579200,3238579455,CH +3238580224,3238588415,CH +3238589696,3238589951,CH +3238589952,3238590207,LT +3238590464,3238590719,CH +3238590976,3238591231,SA +3238591232,3238592511,CH +3238592512,3238594559,GB +3238594560,3238595583,BE +3238595584,3238595839,SI +3238595840,3238596351,GB +3238596608,3238596863,BG +3238596864,3238597119,RU +3238597120,3238597375,DE +3238597376,3238597631,SI +3238597632,3238597887,GB +3238597888,3238598143,SI +3238598144,3238598399,RU +3238598400,3238598655,NL +3238598656,3238598911,CH +3238598912,3238599167,PL +3238599168,3238599679,HU +3238599680,3238599935,US +3238608896,3238621183,SE +3238623232,3238623487,LV +3238623488,3238623743,PL +3238623744,3238623999,CH +3238624000,3238624255,PL +3238624256,3238625279,HU +3238625280,3238630399,LU +3238630400,3238631423,GR +3238632960,3238633215,UA +3238633216,3238653951,DK +3238653952,3238655999,RU +3238656000,3238656255,GB +3238656256,3238656511,RU +3238656512,3238657023,UA +3238657024,3238657535,AT +3238657536,3238657791,GB +3238658048,3238821887,SE +3238821888,3238823935,HR +3238823936,3238860799,SE +3238860800,3238862847,HR +3238862848,3238903807,SE +3238903808,3238905855,HR +3238905856,3238914047,SE +3238914048,3238916095,HR +3238916096,3238941695,SE +3238941696,3238942719,NL +3238942720,3238967295,SE +3238967296,3238969343,HR +3238969344,3238975487,SE +3238975488,3238977535,HR +3238977536,3238981631,SE +3238981632,3238983679,HR +3238983680,3238993919,SE +3238993920,3238995967,HR +3238995968,3239018495,SE +3239018496,3239020543,HR +3239020544,3239022591,SE +3239022592,3239024639,HR +3239024640,3239026687,SE +3239026688,3239028735,HR +3239028736,3239051263,SE +3239051264,3239059455,DE +3239062272,3239062527,ES +3239062528,3239062783,CH +3239062784,3239063039,UA +3239063040,3239063295,HU +3239063296,3239063551,UA +3239063552,3239075839,DE +3239075840,3239076095,GB +3239076096,3239076351,DE +3239076352,3239076607,CH +3239076608,3239076863,PL +3239076864,3239077119,NL +3239077120,3239077375,UA +3239077376,3239077631,BG +3239077632,3239077887,PT +3239077888,3239078143,CZ +3239078144,3239078399,UA +3239078656,3239078911,PL +3239078912,3239079167,GB +3239079168,3239079423,SI +3239079680,3239079935,MD +3239079936,3239088127,DE +3239088384,3239088639,GB +3239088640,3239088895,DK +3239088896,3239089151,IL +3239089152,3239089407,RO +3239089664,3239089919,GB +3239090176,3239090431,SI +3239090432,3239090687,ES +3239090688,3239090943,NL +3239090944,3239091199,AT +3239091456,3239091711,BG +3239091712,3239091967,UA +3239091968,3239092223,FR +3239092224,3239104511,DE +3239104512,3239105279,RU +3239105280,3239105535,CH +3239105536,3239106559,DE +3239106560,3239106815,ES +3239106816,3239107071,CH +3239107072,3239107327,RO +3239107328,3239107583,GR +3239107584,3239107839,CH +3239108096,3239109887,DE +3239109888,3239110143,PL +3239110144,3239110655,DE +3239110656,3239110911,RU +3239110912,3239111167,UA +3239111168,3239111423,NL +3239111424,3239111679,DE +3239111936,3239112191,AT +3239112192,3239112447,IL +3239112704,3239112959,PL +3239112960,3239113215,CH +3239113216,3239113471,AT +3239113472,3239113727,ES +3239113728,3239113983,AT +3239113984,3239114239,DE +3239114240,3239114495,BG +3239114496,3239114751,UA +3239114752,3239116543,DE +3239116544,3239116799,PL +3239116800,3239117055,PT +3239117056,3239117311,SI +3239117312,3239117567,DE +3239118848,3239119871,DE +3239119872,3239120127,GB +3239120128,3239120383,CZ +3239120384,3239120639,PL +3239120896,3239121663,DE +3239121664,3239121919,FR +3239121920,3239123967,DE +3239127296,3239127551,PL +3239127552,3239127807,IL +3239127808,3239128063,RU +3239128064,3239128319,UA +3239128320,3239128575,IT +3239128576,3239128831,UA +3239128832,3239129087,CZ +3239129088,3239130111,DE +3239130112,3239130367,RU +3239130368,3239130623,JO +3239130624,3239130879,PL +3239132160,3239133183,DE +3239133440,3239133695,GB +3239133696,3239133951,ES +3239133952,3239134207,SE +3239134208,3239134463,IL +3239134464,3239134719,UA +3239134976,3239135231,PL +3239135232,3239135487,SE +3239135488,3239135743,FR +3239135744,3239135999,IL +3239136000,3239136255,UA +3239136256,3239136511,CH +3239136512,3239136767,DE +3239136768,3239137023,MD +3239137024,3239137279,LI +3239138304,3239138559,PL +3239138560,3239138815,CH +3239141376,3239145471,US +3239145472,3239147519,DE +3239147520,3239149567,SG +3239149568,3239160319,GB +3239160320,3239160575,US +3239160576,3239160831,DE +3239160832,3239161087,PL +3239161088,3239161343,BY +3239161344,3239161599,PL +3239161600,3239161855,HU +3239162368,3239162623,DE +3239163904,3239164159,PL +3239164160,3239164671,DE +3239164672,3239164927,GB +3239165952,3239166207,FR +3239166464,3239166719,CH +3239166720,3239166975,RO +3239166976,3239167231,FR +3239167232,3239167487,DE +3239167488,3239167743,FR +3239167744,3239167999,CH +3239168000,3239168255,PL +3239168256,3239168511,CH +3239168512,3239168767,SE +3239168768,3239169023,PL +3239169024,3239169535,DE +3239169536,3239169791,DK +3239169792,3239170047,SE +3239170048,3239170303,UA +3239170304,3239170559,FR +3239170560,3239170815,GB +3239170816,3239171071,SE +3239171072,3239171327,PL +3239171328,3239171583,UA +3239171584,3239171839,PL +3239172096,3239172607,UA +3239172608,3239172863,SE +3239172864,3239172991,DE +3239172992,3239173002,BG +3239173003,3239173119,DE +3239173376,3239173631,DE +3239173632,3239173887,AT +3239173888,3239174143,PL +3239174400,3239174655,US +3239174656,3239174911,GB +3239174912,3239175167,SI +3239175424,3239175679,BG +3239175680,3239175935,DE +3239176192,3239180287,DE +3239180288,3239181311,CZ +3239181312,3239181567,AT +3239181824,3239182079,DE +3239182336,3239205887,DE +3239205888,3239206143,US +3239206144,3239264255,DE +3239264256,3239264767,NO +3239264768,3239266303,RU +3239266816,3239267327,UA +3239267328,3239267839,FR +3239267840,3239268351,CH +3239268352,3239268863,SE +3239268864,3239269375,RU +3239269376,3239270399,UA +3239270400,3239270911,GB +3239270912,3239271423,SA +3239271424,3239271935,AT +3239271936,3239272447,CH +3239272960,3239273471,GB +3239273472,3239274495,RU +3239274496,3239275007,PL +3239275520,3239276543,UA +3239276544,3239277055,LU +3239277056,3239277567,DE +3239277568,3239279103,RU +3239279104,3239280127,PL +3239280128,3239280639,RU +3239281664,3239282687,RU +3239282688,3239283711,FI +3239283712,3239284735,PL +3239284736,3239285247,IR +3239285248,3239285503,SE +3239285504,3239285759,BG +3239286784,3239287807,UA +3239287808,3239288831,GB +3239288832,3239289855,DE +3239289856,3239290879,PL +3239290880,3239291903,RU +3239291904,3239292927,BG +3239292928,3239293951,CZ +3239293952,3239294975,DE +3239294976,3239295999,UA +3239296000,3239297023,GB +3239297024,3239298047,RO +3239298048,3239299071,GB +3239301120,3239302143,FR +3239302144,3239303167,PL +3239303168,3239304191,FR +3239304192,3239305215,HR +3239305216,3239306239,GB +3239306240,3239307263,UA +3239307264,3239308287,EG +3239308288,3239309311,DE +3239309312,3239313407,UA +3239313408,3239445759,DE +3239445760,3239446015,PL +3239446016,3239446271,RU +3239446272,3239446527,FR +3239446528,3239447551,DE +3239448576,3239449599,DE +3239451648,3239451903,PL +3239451904,3239452159,DE +3239452160,3239452415,CY +3239452416,3239452671,HR +3239452672,3239464959,DE +3239465216,3239465471,PL +3239465472,3239465727,AT +3239465728,3239465983,PL +3239465984,3239466239,UA +3239466240,3239466495,AT +3239466752,3239467007,GB +3239467008,3239467263,RU +3239467264,3239467519,GB +3239467520,3239467775,IT +3239467776,3239468031,PL +3239468032,3239468287,FR +3239468288,3239468543,RO +3239468544,3239468799,NO +3239468800,3239469055,RO +3239470080,3239470591,DE +3239470592,3239470847,CH +3239470848,3239471103,BG +3239471872,3239472127,FR +3239472128,3239474943,DE +3239474944,3239475199,ES +3239475200,3239477247,DE +3239480320,3239480575,UA +3239480832,3239481087,CH +3239481088,3239481343,FR +3239485440,3239486719,DE +3239486720,3239486975,ES +3239486976,3239487487,DE +3239487744,3239487999,PL +3239488256,3239488511,CH +3239488512,3239488767,KW +3239488768,3239489023,RO +3239489024,3239489279,DE +3239489280,3239489535,PL +3239489536,3239501823,DE +3239506432,3239506687,RU +3239506688,3239506943,GB +3239507200,3239507455,GB +3239507968,3239508223,BG +3239508224,3239508479,SA +3239508480,3239508735,NO +3239508736,3239508991,DE +3239508992,3239509247,PL +3239509248,3239509503,DE +3239509504,3239509759,CH +3239509760,3239514111,DE +3239518208,3239522303,DE +3239522304,3239522559,PL +3239522560,3239522815,SI +3239523072,3239523327,PL +3239523328,3239523583,BG +3239523584,3239523839,UA +3239523840,3239524095,PL +3239524352,3239524607,DE +3239524608,3239524863,SE +3239524864,3239525119,UA +3239525120,3239525375,LT +3239525632,3239525887,PL +3239525888,3239526143,SI +3239526144,3239526399,PL +3239526400,3239538687,DE +3239538688,3239539199,NL +3239539200,3239539455,IT +3239539456,3239539711,BE +3239539712,3239539967,GB +3239539968,3239540223,SE +3239540480,3239540735,DE +3239540736,3239540991,GB +3239540992,3239541247,FR +3239541248,3239541503,UA +3239541504,3239541759,FR +3239541760,3239542015,GB +3239543808,3239544831,DE +3239544832,3239545087,GB +3239545088,3239545343,SI +3239545344,3239545855,HU +3239545856,3239546111,UA +3239546112,3239546367,GB +3239546368,3239546623,RU +3239546624,3239546879,NL +3239547904,3239549951,DE +3239549952,3239550207,TR +3239550208,3239550463,UA +3239550464,3239550719,FR +3239550720,3239550975,NO +3239550976,3239554047,DE +3239554048,3239554303,SE +3239554560,3239554815,PL +3239554816,3239555071,UA +3239556096,3239556351,SA +3239556352,3239556607,UA +3239556608,3239556863,HR +3239556864,3239557119,UA +3239557120,3239565055,DE +3239565056,3239565311,US +3239565312,3239567359,DE +3239567360,3239567615,GB +3239567616,3239567871,UA +3239567872,3239568127,DE +3239568128,3239568383,FR +3239568384,3239568639,SE +3239568640,3239568895,NO +3239568896,3239574783,DE +3239575040,3239575295,DE +3239575296,3239575551,DK +3239575552,3239577599,DE +3239578624,3239578879,DE +3239579136,3239579391,PL +3239579392,3239581695,DE +3239581696,3239581951,PL +3239581952,3239582207,UA +3239582208,3239582463,GB +3239582464,3239582719,DE +3239582720,3239582975,GB +3239582976,3239583231,IT +3239583232,3239583487,UA +3239583744,3239591935,DE +3239591936,3239592447,FI +3239592448,3239592703,US +3239592704,3239593983,FI +3239593984,3239624703,DE +3239624704,3239625727,CH +3239625728,3239626751,RU +3239626752,3239628799,PL +3239628800,3239629823,DE +3239630848,3239631871,DE +3239631872,3239632895,UA +3239632896,3239636991,DE +3239636992,3239638015,BG +3239638016,3239639039,PL +3239639040,3239639551,SI +3239639552,3239639807,CZ +3239639808,3239640063,SI +3239640064,3239641087,DE +3239641088,3239643135,PL +3239643136,3239645183,RU +3239645184,3239653375,DE +3239653376,3239657471,NL +3239657472,3239665663,DE +3239666176,3239666687,AT +3239666688,3239667199,DE +3239667200,3239667711,CH +3239667712,3239670271,RO +3239670272,3239670783,DE +3239670784,3239671295,GB +3239671296,3239671807,DE +3239671808,3239672319,UA +3239672832,3239673343,TR +3239673344,3239673855,SE +3239673856,3239682047,DE +3239682048,3239682559,PL +3239682560,3239683071,BG +3239683072,3239683583,PT +3239683584,3239684095,PL +3239684096,3239686143,DE +3239686144,3239686655,UA +3239686656,3239687167,IT +3239687168,3239687679,UA +3239687680,3239688191,DE +3239688192,3239688703,PL +3239688704,3239689215,GB +3239689728,3239690239,RU +3239690240,3239690495,ES +3239690496,3239690751,PL +3239691008,3239691263,FR +3239691520,3239691775,FR +3239691822,3239691822,GB +3239692032,3239692287,AT +3239692288,3239696383,DE +3239697408,3239697663,HR +3239697664,3239697919,RU +3239697920,3239698175,PL +3239698432,3239706623,DE +3239706880,3239707135,NL +3239707392,3239707647,UA +3239707648,3239707903,GB +3239707904,3239708159,DE +3239708160,3239708415,SE +3239708416,3239708671,RO +3239708672,3239708927,AT +3239708928,3239709183,NL +3239709184,3239709439,RO +3239709440,3239709695,FR +3239709952,3239710207,UA +3239710464,3239710719,DE +3239710720,3239710975,RU +3239710976,3239711231,SE +3239711232,3239711487,BY +3239711488,3239711743,RU +3239711744,3239711999,UA +3239712512,3239712767,GB +3239712768,3239713023,DE +3239713024,3239713279,PL +3239713280,3239713535,SI +3239713536,3239713791,UA +3239713792,3239714047,DE +3239714048,3239714303,FR +3239714304,3239714559,SE +3239714560,3239714815,HU +3239714816,3239723007,DE +3239723008,3239731199,GB +3239731200,3239739391,DE +3239739392,3239739647,IT +3239739648,3239739903,RO +3239739904,3239740159,CH +3239740160,3239740415,PL +3239740416,3239740671,DK +3239740928,3239741183,UA +3239741184,3239741439,RU +3239741440,3239744511,DE +3239747584,3239759871,DE +3239760128,3239760383,UA +3239761408,3239761663,RU +3239761920,3239762175,BG +3239762176,3239762431,RU +3239762432,3239762687,DK +3239762944,3239763199,SI +3239763200,3239763455,SE +3239763456,3239763711,GB +3239763968,3239772159,DE +3239772160,3239772415,NL +3239772416,3239772671,IE +3239772672,3239773183,DK +3239773184,3239773439,FR +3239773440,3239773951,PL +3239773952,3239774207,SA +3239774464,3239774719,ES +3239774976,3239775231,PT +3239776256,3239778303,DE +3239782400,3239782655,AT +3239782656,3239782911,RU +3239782912,3239783167,GB +3239783168,3239783423,CH +3239783424,3239783679,DK +3239783936,3239784191,DE +3239784192,3239784447,ES +3239784448,3239788543,DE +3239788544,3239788607,GB +3239789056,3239789567,DE +3239789568,3239790079,FR +3239790080,3239790591,RO +3239790592,3239791103,NL +3239791104,3239791615,CH +3239792128,3239792639,FR +3239792640,3239793151,UA +3239793152,3239793663,PL +3239793664,3239794175,RO +3239794176,3239794687,NL +3239794688,3239795199,GB +3239795200,3239795711,PL +3239795712,3239796223,IL +3239796224,3239796735,NO +3239796736,3239821311,DE +3239821312,3239821823,SE +3239821824,3239822335,FR +3239822336,3239822847,UA +3239822848,3239823359,PL +3239823360,3239823871,SE +3239823872,3239824383,IT +3239824384,3239824895,PL +3239824896,3239825407,UZ +3239825408,3239825919,UA +3239825920,3239826431,PL +3239826432,3239826943,GB +3239826944,3239827455,RU +3239827456,3239827967,DK +3239827968,3239828479,CH +3239828480,3239828991,DE +3239828992,3239829503,RU +3239830016,3239830527,CH +3239831040,3239831551,RU +3239832576,3239834623,RU +3239834624,3239835135,AT +3239836160,3239836671,DK +3239836672,3239837183,DE +3239837184,3239837695,SE +3239837696,3239837951,PL +3239838976,3239839231,DE +3239839232,3239839487,RU +3239839744,3239839999,SK +3239840000,3239840511,SA +3239840512,3239840767,DE +3239840768,3239841023,AT +3239841024,3239841279,DE +3239841536,3239846911,DE +3239847936,3239848447,DE +3239848448,3239848703,CH +3239848960,3239849215,RU +3239849216,3239849471,GB +3239849472,3239849727,RU +3239849728,3239849983,NL +3239849984,3239859199,DE +3239859200,3239859455,PL +3239859456,3239859711,UA +3239859712,3239859967,HU +3239859968,3239860223,CA +3239860224,3239860479,DE +3239860480,3239860735,FI +3239860736,3239861247,DE +3239861248,3239861503,UA +3239861760,3239862015,SA +3239862016,3239862271,IT +3239862272,3239874559,DE +3239874816,3239875071,DE +3239875072,3239875327,SI +3239875328,3239875583,DK +3239875840,3239876095,DK +3239876096,3239876351,DE +3239876352,3239876607,RO +3239876608,3239876863,NL +3239876864,3239877119,DE +3239877120,3239877375,GB +3239877376,3239877631,IL +3239877632,3239877887,UA +3239877888,3239878143,IT +3239878144,3239878399,PL +3239878400,3239878655,SE +3239878656,3239882751,DE +3239882752,3239883007,GB +3239883008,3239883263,UA +3239883264,3239883519,GB +3239883520,3239883775,CZ +3239883776,3239884031,DE +3239884032,3239884287,RU +3239884544,3239884799,FR +3239884800,3239885055,UA +3239885056,3239885311,CH +3239885312,3239885567,UA +3239885568,3239885823,PL +3239885824,3239886079,CH +3239886080,3239886335,PL +3239886336,3239886591,RU +3239886848,3239888895,DE +3239888896,3239889151,UA +3239889152,3239889407,GB +3239889664,3239889919,FI +3239889920,3239890175,AT +3239890176,3239890431,FR +3239890432,3239890687,NL +3239890688,3239895039,DE +3239895040,3239895295,DK +3239895296,3239895551,TR +3239895552,3239895807,PL +3239895808,3239896063,DK +3239896064,3239896575,DE +3239896576,3239896831,PL +3239896832,3239897087,HU +3239897088,3239897343,GB +3239897344,3239897599,FR +3239897600,3239897855,RU +3239897856,3239898111,FR +3239898112,3239898367,NO +3239898624,3239898879,DE +3239898880,3239899135,RU +3239899136,3239901695,DE +3239901696,3239901951,BG +3239901952,3239902207,DE +3239902720,3239902975,EE +3239903232,3239907327,DE +3239907328,3239907583,UA +3239908096,3239908351,RU +3239908864,3239910399,DE +3239912960,3239913215,DE +3239913216,3239913471,LT +3239914240,3239914495,DE +3239915520,3239915775,PL +3239915776,3239916031,HU +3239916032,3239916287,SA +3239916288,3239916543,PL +3239916544,3239916799,FR +3239916800,3239917055,KZ +3239917056,3239917311,DE +3239917312,3239917567,BG +3239919616,3239922687,DE +3239922688,3239922943,CZ +3239922944,3239938815,DE +3239938816,3239939071,NL +3239939072,3239948543,DE +3239950848,3239951103,DE +3239951104,3239951359,RO +3239951360,3239951615,DE +3239952384,3239954431,DE +3239954432,3239954687,UA +3239954688,3239954943,DK +3239954944,3239955199,ES +3239955200,3239955711,UA +3239955712,3239955967,PL +3239955968,3239956223,CZ +3239956224,3239956479,PL +3239956480,3239959551,DE +3239959552,3239959807,UA +3239959808,3239960063,BE +3239960064,3239960319,FR +3239960320,3239960575,GB +3239960576,3239966719,DE +3239967232,3239967487,DE +3239967744,3239968255,DE +3239968512,3239968767,PL +3239968768,3239969023,NO +3239969536,3239970047,DE +3239972864,3239974911,DE +3239974912,3239975935,GB +3239975936,3239976191,RO +3239976192,3239976447,DE +3239976448,3239976959,NL +3239977984,3239978751,DE +3239978752,3239979007,RU +3239979264,3239979519,GB +3239979520,3239979775,DE +3239980032,3239993343,DE +3239995392,3239996415,DE +3239996416,3239996671,GB +3239996928,3239997183,BE +3239997184,3239997439,GB +3239997440,3240004863,DE +3240004864,3240005119,FR +3240005120,3240005375,SE +3240005376,3240005631,NL +3240005632,3240009727,DE +3240009728,3240009983,PL +3240009984,3240010239,IL +3240010496,3240010751,AT +3240010752,3240011007,HU +3240011520,3240011775,CH +3240011776,3240026111,DE +3240026112,3240027135,FR +3240027136,3240028159,BG +3240028160,3240029183,GB +3240029184,3240030207,RU +3240030208,3240032255,UA +3240032256,3240033279,RS +3240033280,3240033535,GB +3240033536,3240033791,UA +3240033792,3240034303,GB +3240034304,3240034559,RU +3240034560,3240035327,DE +3240036096,3240037375,DE +3240037888,3240038143,AT +3240038912,3240039423,DE +3240049664,3240050687,DE +3240054784,3240058879,DE +3240067072,3240083455,DE +3240083456,3240085503,RU +3240085504,3240087551,KZ +3240087552,3240091647,IM +3240091648,3240097791,DE +3240098816,3240099327,CH +3240099840,3240101887,GB +3240102144,3240102399,GB +3240102912,3240103935,UA +3240104192,3240104703,GB +3240104704,3240104959,NL +3240104960,3240105215,RU +3240105216,3240105471,UA +3240105472,3240105727,GB +3240105984,3240109055,GB +3240109056,3240109567,PL +3240109568,3240112639,GB +3240112640,3240112895,PL +3240112896,3240113151,AT +3240113152,3240113407,LV +3240113408,3240113663,TR +3240113664,3240113919,RU +3240113920,3240114175,TR +3240114176,3240114431,CZ +3240114432,3240114687,UA +3240114688,3240114943,GB +3240115200,3240116223,RU +3240116224,3240116479,DE +3240116480,3240116735,DK +3240116736,3240117247,GB +3240117261,3240117261,UA +3240118272,3240120319,ES +3240120320,3240120831,IR +3240120832,3240121343,GB +3240122368,3240123391,GB +3240125440,3240125695,RO +3240125696,3240125951,GB +3240126208,3240132607,GB +3240163328,3240165375,GB +3240165376,3240165887,PL +3240165888,3240166399,ES +3240166400,3240166911,PL +3240167424,3240167935,PL +3240167936,3240168447,RU +3240168448,3240168959,FR +3240168960,3240169471,CZ +3240169472,3240169983,IL +3240169984,3240170495,IT +3240170496,3240171007,DE +3240171008,3240171519,CZ +3240171520,3240172031,RO +3240172032,3240173055,RU +3240173056,3240173567,CH +3240173568,3240174079,RO +3240174080,3240174591,PL +3240174592,3240175103,FR +3240175104,3240175615,RU +3240176128,3240176639,PL +3240176640,3240177151,UA +3240177152,3240177663,FR +3240177664,3240178175,UA +3240178688,3240179199,BE +3240179200,3240179711,UA +3240179712,3240180223,FR +3240180736,3240181247,NL +3240181248,3240181759,RU +3240181760,3240182271,UA +3240182784,3240183295,RU +3240183296,3240183807,NL +3240183808,3240184319,GB +3240184320,3240184831,CZ +3240184832,3240185343,GB +3240185344,3240185855,FR +3240185856,3240188415,RU +3240188416,3240188927,RO +3240188928,3240189439,MD +3240189440,3240189951,RO +3240189952,3240190463,DE +3240190464,3240190975,IT +3240190976,3240191487,RU +3240191488,3240191999,AE +3240192000,3240192511,UA +3240193024,3240193535,GB +3240193536,3240194047,PL +3240194560,3240195071,AT +3240195072,3240195583,GB +3240195584,3240196095,RO +3240196096,3240197119,RU +3240197120,3240197631,PL +3240197632,3240198143,CZ +3240198144,3240198655,CH +3240199168,3240199679,RU +3240199680,3240200191,NL +3240200704,3240201215,GB +3240201728,3240202239,CH +3240202240,3240202751,RU +3240202752,3240203263,GB +3240203264,3240203775,DK +3240203776,3240204287,AT +3240204288,3240204799,SE +3240204800,3240205311,RO +3240205312,3240205823,GB +3240205824,3240206335,DE +3240206336,3240206847,RU +3240207872,3240208127,RU +3240208128,3240208895,FR +3240208896,3240209407,GB +3240209408,3240209919,AE +3240209920,3240210943,PL +3240210944,3240211455,GB +3240211456,3240211967,NL +3240211968,3240212479,BE +3240212480,3240212991,RU +3240212992,3240213503,GB +3240213504,3240214015,SE +3240214016,3240214527,DK +3240214528,3240215551,RU +3240215552,3240216063,UA +3240216064,3240216575,GB +3240216576,3240217087,RO +3240217088,3240217599,UA +3240218112,3240218623,UA +3240218624,3240219135,NL +3240219136,3240219647,AT +3240219648,3240220159,UA +3240220160,3240220671,NL +3240220672,3240221183,AT +3240221184,3240221695,SE +3240221696,3240222207,NL +3240222208,3240222719,FR +3240222720,3240223231,KW +3240223232,3240223743,RU +3240223744,3240224255,MT +3240224256,3240225279,RU +3240225280,3240225791,IL +3240225792,3240226303,RU +3240226304,3240226815,CH +3240226816,3240227327,RU +3240227840,3240228351,GB +3240228352,3240228863,SE +3240228864,3240229375,GB +3240229376,3240229887,RO +3240230400,3240230911,GB +3240230912,3240231935,PL +3240231936,3240232959,NL +3240232960,3240235007,RU +3240235008,3240236031,FR +3240236032,3240237055,UA +3240237056,3240239103,DE +3240239104,3240240127,CH +3240240128,3240241151,US +3240241152,3240242175,FI +3240242176,3240243199,PL +3240243200,3240244223,DE +3240244224,3240245247,PL +3240245248,3240246271,IL +3240246272,3240247295,UA +3240247296,3240248319,RS +3240248320,3240249343,DE +3240249344,3240250367,UA +3240251392,3240252415,IE +3240252416,3240253439,LT +3240253440,3240254463,BE +3240254464,3240256511,UA +3240256512,3240257535,DE +3240257536,3240258559,FO +3240258560,3240259583,RO +3240259584,3240260607,PL +3240260608,3240262655,DE +3240262656,3240263679,RU +3240263680,3240264191,UA +3240264192,3240264703,FR +3240264704,3240265215,TR +3240265216,3240265727,HU +3240265728,3240266239,CH +3240266240,3240266751,PL +3240266752,3240267263,UA +3240267264,3240267775,RS +3240267776,3240268287,DE +3240268288,3240269311,GB +3240269312,3240269823,NL +3240269824,3240270335,SE +3240270336,3240270847,UA +3240270848,3240271359,RO +3240271360,3240271871,PL +3240271872,3240272383,RU +3240272384,3240272895,PL +3240272896,3240273407,RU +3240273408,3240273919,NL +3240273920,3240274431,UA +3240274432,3240274943,GB +3240274944,3240275455,UA +3240275456,3240275967,RO +3240275968,3240276479,GR +3240276480,3240276991,PL +3240276992,3240278015,RO +3240278016,3240278527,RU +3240278528,3240279039,GB +3240279040,3240279551,CH +3240279552,3240280063,RU +3240280064,3240280191,DE +3240280192,3240280319,SE +3240280320,3240280447,PL +3240280832,3240280959,GB +3240280960,3240281215,PL +3240281344,3240281471,PL +3240281472,3240281599,FR +3240281600,3240281727,JO +3240281728,3240281855,PL +3240281856,3240281983,NL +3240281984,3240282111,NO +3240282112,3240282239,DE +3240282240,3240282367,RU +3240282368,3240282495,RO +3240282624,3240282879,SE +3240282880,3240283007,UA +3240283008,3240283391,PL +3240283392,3240283647,TR +3240283648,3240283903,AT +3240283904,3240284159,DE +3240284160,3240285183,RU +3240285184,3240286207,PL +3240286208,3240287231,UA +3240287232,3240288255,PL +3240288256,3240296447,GB +3240296448,3240296703,RO +3240298496,3240300543,GB +3240302848,3240303103,UA +3240304640,3240305663,RU +3240305664,3240305919,PL +3240306176,3240306687,RU +3240306688,3240306943,BG +3240306944,3240307199,PL +3240307200,3240307711,RU +3240307712,3240308223,ES +3240308224,3240308479,BG +3240308480,3240308735,PL +3240308736,3240309759,RU +3240309760,3240310783,NO +3240310784,3240311807,GB +3240311808,3240312063,PL +3240312320,3240312575,IR +3240312832,3240316927,SG +3240321024,3240321535,RU +3240321792,3240322047,PL +3240322048,3240322303,RU +3240322560,3240324095,CZ +3240324096,3240324351,RO +3240324352,3240324607,RU +3240324608,3240324863,PL +3240324864,3240325119,SI +3240325120,3240328191,GB +3240328192,3240328447,SG +3240328448,3240361983,GB +3240361984,3240362239,TR +3240362240,3240362495,DE +3240362496,3240362751,GB +3240363008,3240370175,GB +3240370176,3240370431,CH +3240370432,3240370687,DE +3240370688,3240370943,GB +3240370944,3240371199,RU +3240371200,3240371455,CH +3240371456,3240371711,RO +3240371712,3240371967,RU +3240371968,3240372223,TR +3240372224,3240372479,SI +3240372480,3240372735,RU +3240372992,3240373247,IE +3240373248,3240373503,RO +3240373504,3240373759,FR +3240373760,3240374015,DE +3240374016,3240374271,GB +3240378368,3240386559,GB +3240394752,3240403455,GB +3240406272,3240406527,DE +3240407040,3240407295,IL +3240407296,3240407551,NL +3240407552,3240407807,NO +3240408576,3240408831,FR +3240408832,3240409087,PL +3240409088,3240409343,TR +3240409600,3240409855,NL +3240409856,3240410367,DE +3240410368,3240410623,AT +3240410624,3240410879,PT +3240410880,3240411135,NO +3240411136,3240419327,RO +3240419840,3240420095,AT +3240420608,3240420863,NL +3240420864,3240421119,GB +3240423424,3240435711,GB +3240436480,3240436735,GB +3240436736,3240437759,DE +3240443904,3240460287,GB +3240460288,3240461055,IL +3240461056,3240461567,DE +3240461568,3240461823,UA +3240461824,3240462079,RU +3240462080,3240462335,TR +3240462336,3240462591,RO +3240462592,3240462847,RU +3240462848,3240463103,RO +3240463104,3240463615,PL +3240463616,3240463871,UA +3240463872,3240464127,GB +3240464128,3240464383,SA +3240464384,3240464639,AT +3240464640,3240464895,FR +3240464896,3240465151,GB +3240465152,3240465407,CH +3240465408,3240465919,DE +3240465920,3240466175,FR +3240466176,3240466687,DE +3240466688,3240466943,PT +3240466944,3240467199,TR +3240467456,3240467711,UA +3240467712,3240467967,RU +3240467968,3240468223,DE +3240468224,3240468479,CH +3240468480,3240476671,GB +3240484864,3240486911,GB +3240487936,3240488191,CH +3240488192,3240488447,GB +3240488448,3240488703,BG +3240488704,3240488959,NL +3240488960,3240491007,GB +3240493056,3240501247,SE +3240505344,3240505599,PL +3240505600,3240505855,GB +3240506368,3240506623,GB +3240507392,3240575487,GB +3240575488,3240575743,RO +3240575744,3240575999,GB +3240576000,3240576255,DE +3240576256,3240576511,UA +3240576512,3240576767,FR +3240576768,3240577023,PL +3240577024,3240577279,UA +3240577280,3240577535,RO +3240577536,3240577791,DE +3240577792,3240578559,UA +3240578816,3240579071,IL +3240579072,3240581119,GB +3240583168,3240587263,GB +3240587264,3240587519,NL +3240587520,3240587775,RU +3240587776,3240588031,UA +3240588032,3240588287,DE +3240588288,3240588543,RU +3240588544,3240588799,RO +3240588800,3240589055,UA +3240589056,3240589311,RO +3240589312,3240593407,SE +3240593408,3240593663,GB +3240594176,3240594431,DK +3240594432,3240594943,GB +3240595456,3240607743,GB +3240609792,3240611839,DE +3240611840,3240613887,GB +3240615936,3240620031,GB +3240621824,3240622079,GB +3240622080,3240622591,RU +3240622848,3240623103,GB +3240624128,3240689663,EE +3240689664,3240690175,GB +3240690176,3240690687,TR +3240690688,3240691199,UA +3240691200,3240691711,IT +3240691712,3240692735,DE +3240692736,3240693247,DK +3240693248,3240693759,ES +3240693760,3240695807,BE +3240695808,3240697855,SE +3240698112,3240698367,LV +3240698624,3240699135,SI +3240699136,3240699391,DE +3240699904,3240700159,LT +3240700160,3240700415,AT +3240700416,3240700671,BE +3240700672,3240700927,ES +3240700928,3240701183,PL +3240701184,3240701439,LV +3240701440,3240701695,ES +3240701952,3240702975,UA +3240704000,3240705023,GR +3240705024,3240706047,UA +3240706048,3240707071,BG +3240707840,3240709119,FR +3240709120,3240710143,RU +3240710144,3240710399,UA +3240710400,3240710655,LT +3240710912,3240711167,FR +3240711168,3240711679,IT +3240711680,3240711935,RU +3240712192,3240712447,UA +3240712448,3240712703,SI +3240712704,3240712959,CH +3240713472,3240713727,RU +3240713728,3240713983,AT +3240713984,3240714239,FR +3240714240,3240716287,GB +3240716288,3240718335,CH +3240718336,3240718847,PL +3240719360,3240719871,DE +3240719872,3240720383,SE +3240720384,3240720895,DE +3240721408,3240721919,DE +3240721920,3240722431,RO +3240722432,3240723455,UA +3240723456,3240724479,DE +3240724480,3240724991,CH +3240724992,3240725503,AT +3240725504,3240726527,RU +3240726528,3240727039,DE +3240727040,3240727551,DZ +3240727552,3240728063,CH +3240728064,3240728575,GR +3240728576,3240729087,GB +3240729600,3240730111,DK +3240730112,3240730623,BE +3240730624,3240731647,ES +3240731648,3240732671,GB +3240732672,3240733695,SE +3240733696,3240734719,PL +3240734720,3240735743,IT +3240735744,3240736255,FR +3240736256,3240736767,BG +3240736768,3240737791,UA +3240737792,3240738815,BG +3240739072,3240739327,CH +3240739328,3240739583,FR +3240739584,3240739839,LV +3240739840,3240740095,DE +3240740096,3240740351,LT +3240740352,3240740607,IT +3240740864,3240741119,DE +3240741120,3240741375,AT +3240741376,3240741631,IL +3240741632,3240741887,RU +3240742144,3240742399,IT +3240742400,3240742655,RO +3240742656,3240742911,AT +3240742912,3240743423,IL +3240743424,3240743935,PL +3240744448,3240744959,SE +3240744960,3240745471,RO +3240745472,3240745983,UA +3240745984,3240746495,GB +3240746496,3240747007,FR +3240747008,3240747263,SE +3240747264,3240747519,TR +3240747776,3240748031,ES +3240748032,3240748287,AT +3240748288,3240748543,GR +3240748544,3240749055,PL +3240749056,3240749311,AT +3240749312,3240749567,BE +3240749568,3240749823,ES +3240749824,3240750335,IT +3240750592,3240750847,FR +3240750848,3240751103,UA +3240751104,3240752127,ES +3240752128,3240754175,RO +3240754176,3240755199,DE +3240755200,3240787967,IT +3240788992,3240790015,IT +3240790528,3240791551,IT +3240791552,3240791807,RU +3240791808,3240792063,ES +3240792064,3240792319,GB +3240792320,3240792575,RU +3240792576,3240792831,CH +3240792832,3240793087,PL +3240793088,3240793343,UA +3240793600,3240794111,FR +3240794112,3240794367,GB +3240794368,3240794879,PL +3240794880,3240795135,DE +3240795136,3240795391,UA +3240795392,3240795647,RU +3240795648,3240795903,CH +3240795904,3240796159,SE +3240796160,3240808959,IT +3240809216,3240809471,PL +3240809472,3240809727,NL +3240809728,3240809983,FR +3240810240,3240810495,SE +3240810496,3240810751,TR +3240811008,3240811263,PL +3240811520,3240811775,SA +3240811776,3240812031,DE +3240812032,3240812287,HU +3240812288,3240812543,KW +3240813568,3240814591,PL +3240814592,3240816639,IT +3240818688,3240820735,NL +3240820736,3240820799,FR +3240820800,3240820831,CY +3240820832,3240820863,GB +3240820864,3240820991,PL +3240820992,3240822783,IT +3240823808,3240824319,PL +3240824576,3240825855,IT +3240826880,3240827135,IT +3240827136,3240827391,FR +3240827392,3240827647,BG +3240827648,3240827903,CH +3240828160,3240828415,DE +3240828928,3240837119,IT +3240839424,3240839679,IT +3240840192,3240840447,IT +3240840448,3240840703,PL +3240840704,3240840959,RU +3240841216,3240843263,IT +3240843264,3240843775,NL +3240843776,3240844031,PL +3240844288,3240844543,NL +3240844544,3240844799,CH +3240845056,3240845311,UA +3240845312,3240845823,IT +3240846592,3240846847,IT +3240846848,3240847359,VA +3240847360,3240852735,IT +3240852736,3240852991,GB +3240853248,3240853503,RU +3240853504,3240854527,VA +3240854528,3240855039,IT +3240855552,3240857599,IT +3240857600,3240857855,PL +3240858624,3240858879,PL +3240859136,3240859391,NL +3240859392,3240859647,SE +3240859648,3240861183,CH +3240861184,3240861439,AT +3240861696,3240866815,IT +3240866816,3240867071,RU +3240867072,3240867327,PL +3240867328,3240867583,RU +3240867584,3240867839,CH +3240867840,3240873983,IT +3240873984,3240874495,RU +3240874496,3240875007,UA +3240875008,3240875519,AT +3240875520,3240876031,FR +3240876032,3240876543,DK +3240876544,3240877055,NL +3240877056,3240877567,DE +3240877568,3240879103,UA +3240879104,3240880127,PL +3240880128,3240881151,RU +3240882176,3240883199,PL +3240883200,3240884223,IL +3240884224,3240886271,UA +3240886272,3240954495,SE +3240954496,3240954623,DE +3240954624,3240955647,SE +3240955648,3240955903,GB +3240955904,3241017343,SE +3241017600,3241017855,AT +3241017856,3241018111,RU +3241018112,3241018367,FR +3241018368,3241022463,AT +3241027584,3241029119,AT +3241029120,3241029375,UA +3241029376,3241029631,PL +3241029632,3241031679,AT +3241032192,3241032703,AT +3241032704,3241032959,RU +3241032960,3241033215,GB +3241033216,3241033727,DE +3241033728,3241033983,IL +3241033984,3241034239,RU +3241034240,3241034495,UA +3241034752,3241035007,PL +3241035008,3241035263,DK +3241035264,3241035519,RO +3241035520,3241035775,SI +3241035776,3241036031,GB +3241036032,3241036287,CH +3241036544,3241036799,SI +3241036800,3241037055,GB +3241037056,3241037311,RU +3241037824,3241038079,NL +3241038080,3241038335,UA +3241038336,3241038591,DE +3241038592,3241039103,LT +3241039104,3241039359,FR +3241039360,3241039615,UA +3241039616,3241039871,GB +3241039872,3241040127,CH +3241040128,3241040383,UA +3241040384,3241040639,GB +3241040640,3241040895,RO +3241040896,3241062399,AT +3241063424,3241063679,IT +3241063680,3241063935,PL +3241063936,3241064191,DE +3241064192,3241064447,GB +3241064448,3241064703,DE +3241064704,3241065471,PL +3241065472,3241066495,AT +3241068800,3241069311,UA +3241069312,3241069567,FR +3241069824,3241070079,GB +3241070080,3241070335,FR +3241070336,3241070847,RU +3241070848,3241071103,AT +3241071104,3241071359,UA +3241071616,3241071871,PL +3241071872,3241072127,RU +3241072384,3241072639,DE +3241073920,3241074175,GB +3241074688,3241076735,AT +3241077248,3241077759,AT +3241077760,3241078015,LV +3241078016,3241078271,PL +3241078272,3241078527,ES +3241078528,3241078783,DE +3241080832,3241082879,AT +3241082880,3241083135,FR +3241083136,3241091071,CH +3241101056,3241101311,DK +3241101312,3241101567,RO +3241101568,3241101823,DE +3241101824,3241102079,BG +3241102336,3241102591,ES +3241102592,3241102847,DE +3241102848,3241103359,NL +3241103360,3241103615,FR +3241103616,3241103871,DK +3241103872,3241104127,DE +3241104128,3241104383,GB +3241104384,3241104639,ES +3241104640,3241104895,UA +3241105152,3241105407,RU +3241105408,3241108223,CH +3241108224,3241108735,DE +3241108736,3241108991,RO +3241108992,3241109247,SA +3241109248,3241117695,CH +3241117696,3241117951,SI +3241117952,3241118207,UA +3241118208,3241118463,AT +3241118464,3241118719,FR +3241118720,3241118975,CH +3241118976,3241119231,FR +3241119232,3241119487,DK +3241119488,3241119743,LT +3241119744,3241119999,RO +3241120000,3241120255,ES +3241120256,3241120511,RU +3241120512,3241120767,GB +3241120768,3241121023,RU +3241121024,3241121279,CH +3241121536,3241121791,PL +3241121792,3241122047,DE +3241122048,3241122303,CH +3241122304,3241122559,RU +3241122560,3241123327,AT +3241123328,3241124095,PL +3241124096,3241124351,DE +3241124352,3241124607,RO +3241124608,3241124863,PL +3241124864,3241125119,GB +3241125120,3241125375,IL +3241125376,3241125631,UA +3241125632,3241125887,SE +3241125888,3241129983,CH +3241129984,3241130239,FR +3241130240,3241130495,PT +3241130496,3241130751,DK +3241130752,3241131007,DE +3241131008,3241131263,NL +3241131264,3241131519,UA +3241131520,3241131775,CH +3241131776,3241132031,DK +3241132032,3241144319,CH +3241145856,3241146111,HR +3241146112,3241146367,PL +3241146368,3241146623,IL +3241146624,3241146879,RO +3241146880,3241148415,CH +3241148416,3241419519,FR +3241419520,3241419775,GP +3241419776,3241476095,FR +3241476864,3241477375,BE +3241477632,3241477887,GB +3241478144,3241481727,BE +3241481728,3241481983,PT +3241481984,3241482239,DE +3241482240,3241484799,SE +3241484800,3241485055,BE +3241485312,3241486335,BE +3241486336,3241487615,SE +3241487616,3241496575,BE +3241496576,3241496831,AT +3241497344,3241497599,UA +3241497600,3241497855,SE +3241497856,3241498111,DK +3241498112,3241498367,BE +3241498624,3241498879,NO +3241498880,3241499135,UA +3241499648,3241500159,DE +3241500160,3241500671,GB +3241501440,3241501440,GB +3241501696,3241501696,GB +3241501952,3241502463,BE +3241503232,3241503487,RS +3241503488,3241503999,BE +3241504000,3241505023,DE +3241505024,3241508095,BE +3241508096,3241508351,NL +3241508864,3241539839,BE +3241541376,3241541631,PL +3241541632,3241689087,FR +3241693184,3241699327,FR +3241699840,3241700095,SE +3241700352,3241721855,FR +3241722112,3241722367,FR +3241724416,3241724671,RU +3241724672,3241724927,FR +3241725952,3241726975,FR +3241728000,3241728255,DE +3241728256,3241729023,FR +3241730048,3241742335,FR +3241743360,3241743615,DE +3241744384,3241745407,FR +3241746432,3241763071,FR +3241763072,3241763327,DE +3241764864,3241803775,FR +3241803776,3241803823,CY +3241803832,3241803839,GB +3241803840,3241804031,CY +3241804032,3241805823,BE +3241807872,3241820159,BE +3241820160,3241821695,GB +3241821696,3241822207,GR +3241822208,3241824255,CZ +3241824256,3241828351,BE +3241836544,3241840639,BE +3241841664,3241842175,BE +3241843456,3241843711,CH +3241843712,3241848831,BE +3241852928,3241854463,SK +3241854464,3241854975,GB +3241854976,3241855999,DE +3241856000,3241857279,NL +3241857280,3241857535,CH +3241857536,3241859071,AT +3241859072,3241861119,US +3241861120,3241863167,BE +3241863168,3241863423,PL +3241863424,3241863679,FR +3241863680,3241863935,GR +3241863936,3241864191,GB +3241864192,3241864447,TR +3241864704,3241864959,SE +3241864960,3241865215,IT +3241865472,3241865727,NO +3241865728,3241865983,CH +3241865984,3241866239,RO +3241866240,3241866751,DE +3241866752,3241867007,UA +3241867008,3241867263,FR +3241867776,3241868031,NO +3241868032,3241868287,RU +3241868288,3241868543,HR +3241868544,3241868799,DE +3241869056,3241869311,BY +3241869312,3241934847,PL +3241934848,3242196991,GB +3242196992,3242393599,FI +3242393600,3242459135,NL +3242459136,3242467327,BG +3242467328,3242475519,HU +3242475520,3242483711,LV +3242483712,3242524671,BG +3242524672,3242590207,NO +3242590208,3242594463,FR +3242594464,3242594495,ES +3242594496,3242594559,FI +3242594560,3242594635,FR +3242594636,3242594639,GB +3242594640,3242594663,FR +3242594664,3242594667,DE +3242594668,3242595711,FR +3242595712,3242595839,IT +3242595840,3242595967,FR +3242595968,3242596095,ES +3242596096,3242596255,FR +3242596256,3242596287,LT +3242596288,3242596415,FR +3242596416,3242596479,PT +3242596480,3242597087,FR +3242597088,3242597119,CZ +3242597120,3242597343,FR +3242597344,3242597375,NL +3242597376,3242598351,FR +3242598352,3242598367,LT +3242598368,3242602823,FR +3242602824,3242602831,ES +3242602832,3242602975,FR +3242602976,3242603007,PL +3242603008,3242603039,FR +3242603040,3242603071,DE +3242603072,3242603127,FR +3242603128,3242603135,ES +3242603136,3242604095,FR +3242604096,3242604159,PL +3242604160,3242604287,IT +3242604288,3242604671,FR +3242604672,3242604799,NL +3242604800,3242605279,FR +3242605280,3242605311,BE +3242605312,3242606943,FR +3242606944,3242606959,BE +3242606960,3242606975,FR +3242606976,3242607039,ES +3242607040,3242607071,FR +3242607072,3242607103,DE +3242607104,3242607135,FR +3242607136,3242607167,CZ +3242607168,3242607231,PL +3242607232,3242607359,IT +3242607360,3242607375,GB +3242607376,3242607775,FR +3242607776,3242607807,CZ +3242607808,3242608383,FR +3242608384,3242608639,GB +3242608640,3242608767,FR +3242608768,3242608895,DE +3242608896,3242609919,FR +3242609920,3242610047,GB +3242610048,3242610271,FR +3242610272,3242610303,FI +3242610304,3242610431,BE +3242610432,3242614513,FR +3242614514,3242614514,PL +3242614515,3242614527,FR +3242614528,3242614783,PL +3242614784,3242615167,FR +3242615168,3242615295,IE +3242615296,3242615871,FR +3242615872,3242615935,PL +3242615936,3242615999,FR +3242616000,3242616063,NL +3242616064,3242616191,FR +3242616192,3242616319,ES +3242616320,3242616447,FR +3242616448,3242616575,DE +3242616576,3242616959,FR +3242616960,3242617087,IT +3242617088,3242617599,FR +3242617600,3242617727,GB +3242617728,3242617911,FR +3242617912,3242617919,ES +3242617920,3242618239,FR +3242618240,3242618367,NL +3242618368,3242618415,FR +3242618416,3242618431,CZ +3242618432,3242618495,PL +3242618496,3242620199,FR +3242620200,3242620207,ES +3242620208,3242620223,FR +3242620224,3242620239,PT +3242620240,3242620255,ES +3242620256,3242620287,PL +3242620288,3242620351,FR +3242620352,3242620359,ES +3242620360,3242620367,FR +3242620368,3242620383,PL +3242620384,3242622031,FR +3242622032,3242622047,PL +3242622048,3242622207,FR +3242622208,3242622463,PL +3242622464,3242622591,FR +3242622592,3242622623,PL +3242622624,3242622915,FR +3242622916,3242622927,PL +3242622928,3242622959,FR +3242622960,3242622975,PL +3242622976,3242655743,IT +3242655744,3242721279,NO +3242721280,3242852351,CH +3242852352,3242917887,BE +3242917888,3242950655,NO +3242950656,3242983423,BE +3242983424,3243048959,IT +3243048960,3243114495,SI +3243114496,3243245567,NL +3243245568,3243376639,AT +3243376640,3243442175,GB +3243442176,3243507711,AT +3243507712,3243507967,GB +3243509504,3243509759,CZ +3243509760,3243510015,RU +3243510016,3243510271,NL +3243510272,3243510527,CZ +3243510784,3243511807,CZ +3243512064,3243512319,UA +3243512320,3243512575,FR +3243512832,3243513087,DE +3243513088,3243513343,GR +3243513344,3243513855,UA +3243513856,3243514111,BE +3243514112,3243514367,CH +3243514368,3243514623,IE +3243514624,3243514879,DK +3243514880,3243515135,AT +3243515136,3243515391,PL +3243515648,3243515903,RU +3243515904,3243519999,CZ +3243520512,3243520767,UA +3243520768,3243521023,GB +3243521024,3243521279,AT +3243521280,3243521535,CZ +3243521536,3243521791,DE +3243521792,3243524095,CZ +3243524096,3243524351,RO +3243524352,3243524607,AT +3243524608,3243524863,DE +3243524864,3243525119,NL +3243525120,3243525375,CZ +3243525376,3243525631,RO +3243525888,3243526143,PL +3243526144,3243526399,UA +3243526400,3243526655,FR +3243526912,3243527167,SE +3243527168,3243527423,RU +3243527424,3243527679,UA +3243527936,3243528191,PL +3243528192,3243529215,CZ +3243529216,3243529471,BE +3243529728,3243529983,BG +3243529984,3243530239,GB +3243530496,3243530751,FR +3243531008,3243531263,DE +3243531776,3243532031,AT +3243532032,3243532287,DE +3243532288,3243536383,CZ +3243536384,3243536639,AT +3243537408,3243537919,CZ +3243540480,3243540991,CZ +3243544064,3243544319,GB +3243544320,3243544575,NL +3243544576,3243552767,CZ +3243552768,3243553023,NL +3243553024,3243553279,FR +3243553280,3243553535,DE +3243554048,3243554303,DE +3243554304,3243554559,PL +3243554560,3243554815,MD +3243554816,3243555071,LV +3243555072,3243555327,RO +3243555328,3243555583,CZ +3243556864,3243565055,CZ +3243565056,3243569151,GB +3243570432,3243570687,CZ +3243570688,3243570943,PL +3243571968,3243572223,GR +3243572224,3243572479,CZ +3243572992,3243573247,RU +3243573248,3243704319,CZ +3243704320,3243769855,SK +3243769856,3243900927,DK +3243900928,3243966463,NO +3243966464,3243974655,PL +3243974656,3243978751,LU +3243978752,3243982847,NL +3243982848,3243991039,HU +3243991040,3243999231,BE +3243999232,3244031999,NO +3244032000,3244097535,GR +3244097536,3244098559,DE +3244099584,3244100607,FR +3244100608,3244102655,UA +3244102656,3244103679,CH +3244103680,3244104703,BG +3244105728,3244107775,GB +3244107776,3244108799,RO +3244108800,3244109823,GB +3244109824,3244111871,UA +3244111872,3244112895,KZ +3244112896,3244113919,RU +3244113920,3244114943,CH +3244114944,3244115967,PL +3244115968,3244116991,SK +3244116992,3244118015,UA +3244119040,3244120063,GB +3244120064,3244122111,PL +3244123136,3244124159,UA +3244124160,3244125183,PL +3244125184,3244126207,UA +3244126208,3244127231,FR +3244127232,3244128255,UA +3244128256,3244129279,RU +3244129280,3244130303,FR +3244130304,3244131327,NO +3244131328,3244133375,FI +3244133376,3244134399,RO +3244134400,3244135423,PL +3244135424,3244137471,GB +3244137472,3244138495,PL +3244138496,3244139519,UA +3244139520,3244140543,GR +3244140544,3244141567,UA +3244141568,3244142591,NL +3244142592,3244143615,DE +3244143616,3244144639,FR +3244144640,3244146687,UA +3244146688,3244146943,GB +3244146944,3244147711,RU +3244147712,3244149759,GB +3244149760,3244150783,PL +3244150784,3244151807,CH +3244151808,3244152831,KZ +3244152832,3244153855,UA +3244153856,3244154879,NO +3244154880,3244155903,GB +3244155904,3244156927,UA +3244157952,3244158975,RU +3244158976,3244159999,DE +3244160000,3244161023,RU +3244161024,3244162047,SE +3244162048,3244163071,NO +3244163072,3244228607,FI +3244228608,3244261375,TN +3244261376,3244277759,IE +3244277760,3244294143,SI +3244294144,3244818431,DE +3244818432,3244818687,ES +3244818688,3244818943,AT +3244818944,3244819199,PL +3244819200,3244819455,DE +3244819456,3244819711,GB +3244819712,3244819967,RO +3244819968,3244820223,NL +3244820480,3244820735,BE +3244820736,3244820991,DE +3244820992,3244821247,SI +3244821248,3244821503,RU +3244821760,3244822015,TR +3244822016,3244822271,RU +3244822272,3244822527,GB +3244822528,3244822783,UA +3244822784,3244823039,CZ +3244823040,3244823295,DE +3244823296,3244823551,FR +3244823552,3244823807,GE +3244823808,3244824063,RO +3244824064,3244824319,IR +3244824320,3244824575,SI +3244824576,3244824831,RU +3244824832,3244825087,GB +3244825088,3244825343,DE +3244825344,3244826111,RU +3244826112,3244826367,RO +3244826368,3244826623,CH +3244826624,3244826879,DE +3244826880,3244827135,MK +3244827136,3244827391,AT +3244827392,3244827647,GB +3244827648,3244827903,FR +3244827904,3244828159,BE +3244828160,3244828415,FI +3244828416,3244828671,FR +3244828672,3244828927,SA +3244829184,3244829439,CH +3244829440,3244829695,DK +3244829696,3244829951,IL +3244829952,3244830463,PL +3244830464,3244830719,CH +3244830720,3244830975,FR +3244830976,3244831231,DE +3244831232,3244831487,PL +3244831488,3244831743,ES +3244831744,3244831999,PT +3244832000,3244832255,HU +3244832256,3244832511,FR +3244832512,3244832767,AT +3244832768,3244833023,FR +3244833024,3244833279,RU +3244833280,3244833535,UA +3244833536,3244833791,RU +3244833792,3244834047,FR +3244834048,3244834303,CH +3244834304,3244834559,IL +3244834560,3244834815,GB +3244834816,3244835071,RU +3244835072,3244835327,AT +3244835328,3244835583,DE +3244835840,3244836095,RS +3244836096,3244836607,RU +3244836608,3244836863,PL +3244836864,3244837119,FR +3244837120,3244837375,RO +3244837376,3244837887,RU +3244837888,3244838143,CY +3244838144,3244838399,IL +3244838400,3244838655,GB +3244838656,3244838911,BG +3244839168,3244839423,GB +3244839424,3244839679,AT +3244839680,3244839935,DK +3244839936,3244840191,DE +3244840192,3244840447,UA +3244840448,3244840703,IT +3244840704,3244840959,RU +3244840960,3244841215,PL +3244841216,3244841471,GB +3244841472,3244841727,DE +3244841728,3244842239,GB +3244842752,3244843007,DE +3244843008,3244843263,UA +3244843264,3244843519,RU +3244843520,3244843775,NL +3244843776,3244844031,PL +3244844032,3244844287,SE +3244844288,3244844543,GB +3244844544,3244844799,RU +3244844800,3244845055,GB +3244845056,3244845311,NL +3244845312,3244845567,NO +3244845568,3244845823,RO +3244845824,3244846335,GB +3244846336,3244846591,TR +3244846848,3244847103,NL +3244847104,3244847359,SE +3244847360,3244847615,GB +3244847616,3244847871,DK +3244847872,3244848127,IL +3244848128,3244848383,CH +3244848384,3244848639,IL +3244848640,3244848895,DE +3244848896,3244849151,IL +3244849152,3244849407,AT +3244849408,3244849663,RO +3244849664,3244849919,SE +3244849920,3244850175,RO +3244850176,3244850431,TR +3244850432,3244850687,AT +3244850688,3244850943,GB +3244850944,3244851455,RU +3244851456,3244851711,NL +3244851968,3244852223,GB +3244852224,3244852479,CH +3244852480,3244852735,UA +3244852736,3244852991,SI +3244852992,3244853247,DK +3244853248,3244853503,IE +3244853504,3244853759,IT +3244853760,3244854015,TR +3244854016,3244854271,RU +3244854272,3244854527,GB +3244854784,3244855295,RU +3244855296,3244855551,GB +3244855552,3244855807,RU +3244855808,3244856063,DE +3244856064,3244856319,IL +3244856320,3244856575,CH +3244856576,3244856831,RU +3244856832,3244857087,RO +3244857088,3244857343,IT +3244857344,3244857599,GB +3244857856,3244858111,PL +3244858112,3244858367,DE +3244858368,3244858623,PL +3244858624,3244858879,RU +3244858880,3244859135,FR +3244859136,3244859391,BE +3244859392,3244859647,SE +3244859648,3244859903,PL +3244859904,3244860159,FR +3244860160,3244860415,PL +3244860416,3244860671,GB +3244860672,3244860927,BG +3244860928,3244861183,PL +3244861184,3244861439,CH +3244861440,3244861951,GB +3244861952,3244862207,RU +3244862208,3244862463,DK +3244862464,3244862719,CZ +3244862720,3244862975,RO +3244862976,3244863231,DE +3244863232,3244863487,GB +3244863744,3244863999,RU +3244864000,3244864255,UA +3244864256,3244864511,GB +3244864512,3244864767,RO +3244864768,3244865023,RU +3244865024,3244865535,UA +3244865536,3244865791,PL +3244865792,3244866047,CH +3244866048,3244866559,NL +3244866560,3244866815,FI +3244866816,3244867071,UA +3244867328,3244867583,RU +3244867584,3244867839,NL +3244867840,3244868095,BE +3244868096,3244868351,DE +3244868352,3244868607,RU +3244868608,3244868863,FI +3244868864,3244869119,RU +3244869376,3244869631,FR +3244869632,3244869887,GR +3244869888,3244870143,TR +3244870144,3244870399,DK +3244870400,3244870655,UA +3244870656,3244870911,SA +3244870912,3244871167,FR +3244871168,3244871423,LT +3244871424,3244871679,RU +3244871680,3244872703,UA +3244872704,3244872959,IR +3244872960,3244873215,UA +3244873216,3244873471,SE +3244873472,3244873727,IE +3244873728,3244873983,DE +3244873984,3244874239,SE +3244874240,3244874495,ES +3244874496,3244874751,FR +3244874752,3244875007,DE +3244875008,3244875263,PL +3244875520,3244875775,IT +3244875776,3244876799,RU +3244876800,3244877055,DK +3244877056,3244877311,JO +3244877312,3244877567,RU +3244877568,3244877823,FR +3244877824,3244878079,AT +3244878080,3244878335,GB +3244878336,3244878591,RU +3244878592,3244878847,PL +3244878848,3244879103,SI +3244879104,3244879359,RU +3244879360,3244879615,CH +3244879616,3244879871,PL +3244879872,3244880127,SI +3244880128,3244880383,RU +3244880384,3244880639,UA +3244880640,3244880895,RU +3244880896,3244881151,PL +3244881152,3244881407,RU +3244881408,3244881663,DK +3244881664,3244881919,RO +3244881920,3244882175,RU +3244882176,3244882431,UA +3244882432,3244882687,IT +3244882688,3244882943,PL +3244883200,3244883455,KZ +3244883456,3244883711,CZ +3244883712,3244883967,NL +3244883968,3244884223,DE +3244884224,3244884479,FR +3244884480,3244884735,IR +3244884736,3244884991,NL +3244884992,3244885247,GR +3244885248,3244885503,CH +3244885504,3244885759,IR +3244885760,3244886015,UA +3244886016,3244886271,LB +3244886272,3244886527,CH +3244886528,3244886783,DK +3244886784,3244887039,RU +3244887040,3244887295,NL +3244887296,3244887551,GB +3244887552,3244887807,RU +3244887808,3244888063,BE +3244888064,3244888319,PL +3244888320,3244888575,DE +3244888576,3244888831,FR +3244888832,3244889087,DE +3244889088,3244889343,PL +3244889344,3244889599,US +3244889600,3244889855,SI +3244889856,3244890111,HR +3244890112,3244890367,PL +3244890368,3244890623,NL +3244890624,3244890879,FR +3244890880,3244891135,RU +3244891392,3244891647,PL +3244891648,3244891903,UA +3244892160,3244892415,PL +3244892416,3244892671,NL +3244892672,3244892927,ES +3244892928,3244893183,PL +3244893184,3244893439,BE +3244893440,3244893695,RU +3244893696,3244893951,DE +3244893952,3244894463,RU +3244894464,3244894719,UA +3244894720,3244894975,GR +3244894976,3244895231,FR +3244895232,3244895487,DK +3244895488,3244895743,PL +3244895744,3244895999,DE +3244896000,3244896511,GB +3244896512,3244896767,LT +3244896768,3244897023,NL +3244897024,3244897279,GB +3244897280,3244897535,DE +3244897536,3244897791,RU +3244897792,3244898047,GB +3244898048,3244898303,DE +3244898304,3244898559,KW +3244898560,3244898815,GI +3244899072,3244899327,RU +3244899328,3244899583,BG +3244899584,3244899839,GB +3244899840,3244900095,UA +3244900096,3244900351,PL +3244900352,3244900607,RO +3244900608,3244900863,RU +3244900864,3244901119,PL +3244901120,3244901375,SI +3244901376,3244901631,DE +3244901632,3244901887,GB +3244901888,3244902143,UA +3244902144,3244902655,RU +3244902656,3244902911,BE +3244902912,3244903167,DE +3244903168,3244903423,PL +3244903424,3244903679,FI +3244903680,3244903935,NO +3244903936,3244904191,RO +3244904192,3244904447,IT +3244904448,3244904703,GR +3244904960,3244905215,BY +3244905216,3244905471,MD +3244905728,3244905983,GR +3244905984,3244906239,AT +3244906240,3244906495,DE +3244906752,3244907007,SA +3244907008,3244907263,FR +3244907264,3244907519,RO +3244907520,3244907775,UA +3244907776,3244908287,RU +3244908800,3244909055,FI +3244909056,3244909311,GB +3244909312,3244909567,IL +3244909568,3244909823,RU +3244909824,3244910079,NL +3244910336,3244910591,DE +3244910592,3244910847,GB +3244910848,3244911103,DE +3244911104,3244911359,BE +3244911360,3244911615,RU +3244911616,3244911871,GB +3244911872,3244912127,GR +3244912128,3244912383,PL +3244912384,3244912639,NL +3244912640,3244912895,NO +3244912896,3244913151,SE +3244913152,3244913407,RU +3244913408,3244913663,SI +3244913664,3244913919,DK +3244913920,3244914431,RU +3244914432,3244914687,SA +3244914688,3244914943,GB +3244915200,3244915455,PL +3244915456,3244915711,FI +3244915712,3244915967,UA +3244915968,3244916223,PL +3244916224,3244916479,RU +3244916480,3244916735,SI +3244916736,3244916991,FR +3244916992,3244917247,PL +3244917248,3244917503,SE +3244917504,3244917759,AT +3244917760,3244918015,RU +3244918016,3244918271,BE +3244918272,3244918527,SE +3244918528,3244918783,UA +3244918784,3244919039,CH +3244919040,3244919295,DE +3244919296,3244919551,SE +3244919552,3244919807,DE +3244919808,3244920063,RO +3244920320,3244920575,SK +3244920576,3244920831,PL +3244920832,3244921087,NL +3244921088,3244921343,IE +3244921344,3244921599,LT +3244921600,3244921855,DE +3244921856,3244922111,BG +3244922112,3244922367,DK +3244922368,3244922623,GB +3244922880,3244923135,UA +3244923136,3244923391,AT +3244923648,3244923903,LV +3244923904,3244924159,RU +3244924160,3244924927,CZ +3244924928,3244925183,FI +3244925184,3244925439,CH +3244925696,3244925951,RS +3244925952,3244926207,UA +3244926464,3244926719,LV +3244926720,3244926975,PL +3244926976,3244927231,DE +3244927232,3244927487,RU +3244927488,3244927743,GB +3244927744,3244927999,US +3244928000,3244928255,GB +3244928256,3244928511,NL +3244928512,3244929023,RU +3244929024,3244929279,RO +3244929536,3244929791,PL +3244929792,3244930047,RU +3244930048,3244930303,PL +3244930304,3244930559,AT +3244930560,3244930815,CA +3244930816,3244931071,NL +3244931328,3244931583,RO +3244931584,3244931839,FR +3244931840,3244932095,NL +3244932096,3244932351,GB +3244932352,3244932607,UA +3244932608,3244932863,DK +3244932864,3244933375,PL +3244933376,3244933631,HR +3244933632,3244933887,GB +3244933888,3244934143,AT +3244934144,3244934399,BG +3244934400,3244934655,FR +3244934656,3244934911,RU +3244934912,3244935167,IL +3244935168,3244935423,NL +3244935424,3244935679,UA +3244935680,3244935935,PL +3244935936,3244936191,IL +3244936192,3244937215,AT +3244937472,3244937727,GB +3244937728,3244937983,UA +3244937984,3244938239,TR +3244938240,3244938495,GB +3244938496,3244938751,RU +3244938752,3244939007,AT +3244939008,3244939263,NL +3244939264,3244939519,UA +3244939776,3244940031,GB +3244940032,3244940287,UA +3244940288,3244940543,DK +3244940544,3244940799,PL +3244940800,3244941055,RU +3244941056,3244941311,DE +3244941312,3244941567,CY +3244941568,3244941823,FR +3244941824,3244942079,SE +3244942080,3244942335,PL +3244942336,3244942591,IT +3244942592,3244942847,PL +3244942848,3244943103,DE +3244943104,3244943359,GB +3244943360,3244943615,FR +3244943616,3244943871,NL +3244943872,3244944127,TR +3244944128,3244944639,RU +3244944640,3244944895,GE +3244944896,3244945151,FR +3244945152,3244945407,RO +3244945408,3244945663,LV +3244945664,3244945919,NL +3244945920,3244946175,PL +3244946176,3244946431,TR +3244946944,3244947455,DE +3244947456,3244947711,PL +3244947712,3244947967,UA +3244947968,3244948223,DE +3244948224,3244948479,PL +3244948480,3244948735,FR +3244948736,3244948991,IE +3244948992,3244949247,UA +3244949248,3244951551,RU +3244951552,3244952575,FI +3244952576,3244953599,GB +3244953600,3244954623,DE +3244955648,3244957695,UA +3244958720,3244959743,FR +3244959744,3244960767,RU +3244960768,3244961791,RO +3244961792,3244962815,KG +3244962816,3244963839,IL +3244963840,3244966911,UA +3244966912,3244968959,RU +3244968960,3244969983,PL +3244969984,3244971007,UA +3244971008,3244972031,PL +3244972032,3244975103,RU +3244975104,3244977151,PL +3244977152,3244978175,RU +3244978176,3244979199,GB +3244979200,3244980223,FR +3244980224,3244981247,DK +3244981248,3244982271,RO +3244982272,3244983295,PL +3244983296,3244984319,RU +3244984320,3244985343,UA +3244985344,3244986367,DE +3244986368,3244987391,UA +3244987392,3244988415,RU +3244988416,3244990463,PL +3244990464,3244991487,RU +3244991488,3244992511,DK +3244992512,3244994559,RU +3244994560,3244995583,ES +3244995584,3244996607,IT +3244996608,3244997631,UA +3244997632,3244998655,RU +3244998656,3244999679,PL +3244999680,3245000703,IQ +3245000704,3245001727,UA +3245001728,3245002751,IL +3245002752,3245003263,PL +3245003264,3245003519,SE +3245003520,3245003775,UA +3245003776,3245004799,RU +3245004800,3245005823,PL +3245005824,3245006847,UA +3245006848,3245007871,DE +3245007872,3245008895,PL +3245008896,3245009919,RU +3245009920,3245010431,UA +3245010432,3245010687,PL +3245010688,3245010943,FR +3245010944,3245011967,RU +3245011968,3245012991,PL +3245012992,3245014015,UA +3245014016,3245015039,GR +3245015040,3245016063,RU +3245016064,3245017087,RS +3245017088,3245018111,PL +3245018112,3245019135,RU +3245019136,3245019391,UZ +3245019392,3245019462,SC +3245019463,3245019463,UZ +3245019464,3245019647,SC +3245019648,3245020159,UZ +3245020160,3245021183,RU +3245021184,3245022207,UA +3245022208,3245023231,NO +3245023232,3245024255,PL +3245024256,3245025279,BG +3245025280,3245026303,UA +3245026304,3245027327,GB +3245027328,3245029375,RU +3245029376,3245030399,FR +3245030400,3245032447,RU +3245032448,3245033471,BG +3245033472,3245034495,UA +3245035520,3245036543,UA +3245036544,3245037567,IS +3245037568,3245038591,PL +3245038592,3245039615,RU +3245039616,3245040639,MD +3245040640,3245041663,RU +3245041664,3245043711,UA +3245043712,3245044735,RU +3245044736,3245045759,GB +3245045760,3245046783,DE +3245046784,3245047807,FR +3245047808,3245050879,UA +3245050880,3245051903,RU +3245051904,3245052927,DE +3245052928,3245054975,RU +3245054976,3245055999,AT +3245056000,3245057023,CZ +3245057024,3245058047,PL +3245058048,3245061119,UA +3245061120,3245062143,RU +3245063168,3245065215,RU +3245065216,3245066239,PL +3245066240,3245067263,UA +3245067264,3245068287,GB +3245069312,3245070335,PL +3245071360,3245072383,NL +3245072384,3245073407,UA +3245073408,3245076479,RU +3245076480,3245077503,FR +3245077504,3245078527,UA +3245078528,3245079551,PL +3245079552,3245080575,CZ +3245080576,3245082623,SE +3245082624,3245084927,DE +3245084928,3245085183,BE +3245085184,3245085439,GB +3245085440,3245085695,DE +3245085952,3245086207,FR +3245086208,3245086463,AT +3245086464,3245086719,GH +3245086720,3245086975,BG +3245087488,3245087743,NL +3245087744,3245087999,GH +3245088000,3245088255,LV +3245088256,3245088511,KW +3245088512,3245088767,FR +3245088768,3245089279,BG +3245089280,3245089791,PL +3245089792,3245090303,GB +3245090304,3245090815,UA +3245090816,3245091327,AT +3245091328,3245091839,SE +3245091840,3245092351,UA +3245092864,3245093887,UA +3245093888,3245094911,RO +3245094912,3245095935,UA +3245095936,3245096959,IT +3245099008,3245103103,GB +3245105664,3245106175,NL +3245106176,3245106687,AT +3245106688,3245107711,UA +3245107712,3245108735,CZ +3245108736,3245109247,FR +3245110272,3245111295,DE +3245111296,3245112319,UA +3245112320,3245113343,PL +3245113344,3245113855,UA +3245113856,3245114367,RU +3245114368,3245114879,SK +3245114880,3245115391,JO +3245115392,3245115903,CH +3245115904,3245116415,AT +3245116416,3245116927,FR +3245116928,3245117439,KW +3245117440,3245118463,LV +3245118464,3245119487,GB +3245120512,3245121535,GB +3245121536,3245122047,GR +3245122048,3245122559,UA +3245122560,3245123071,DE +3245123072,3245123583,FR +3245123584,3245124095,GB +3245124096,3245124607,UA +3245124608,3245125119,DE +3245125120,3245125631,ES +3245125632,3245125887,DE +3245125888,3245126143,PL +3245126400,3245126655,DE +3245126656,3245126911,FR +3245126912,3245127167,DE +3245127168,3245127423,RU +3245127680,3245127935,DE +3245127936,3245128191,LV +3245128192,3245128447,IT +3245128448,3245128703,CH +3245128704,3245129215,LU +3245129216,3245129471,DK +3245129472,3245129983,GB +3245129984,3245130239,DE +3245130240,3245130495,PL +3245130496,3245130751,IL +3245130752,3245131007,SE +3245131008,3245131263,FR +3245131520,3245132031,GB +3245132032,3245132287,BE +3245132288,3245132543,PL +3245132544,3245132799,FR +3245132800,3245133311,IT +3245134080,3245134335,UA +3245134336,3245134591,NL +3245134848,3245135103,AT +3245135104,3245135359,TR +3245135360,3245135615,UG +3245135872,3245136127,FR +3245136128,3245136383,DE +3245136384,3245136639,GB +3245136896,3245137151,PL +3245137152,3245137407,GB +3245137408,3245137663,DE +3245137664,3245137919,SE +3245137920,3245138431,DK +3245138432,3245138943,UA +3245138944,3245139455,PL +3245139968,3245140479,CH +3245140992,3245141503,UA +3245141504,3245141759,NL +3245141760,3245142015,SE +3245142016,3245143039,UA +3245143040,3245144063,GB +3245144064,3245145087,UA +3245145088,3245146111,UG +3245146112,3245147135,FR +3245147136,3245148159,DE +3245148160,3245149183,UA +3245150208,3245154303,IS +3245154304,3245158399,IT +3245158400,3245158911,CH +3245158912,3245159423,GB +3245159424,3245159935,CH +3245159936,3245160447,BG +3245160448,3245160959,DK +3245160960,3245161471,PL +3245161472,3245161727,RU +3245161728,3245161983,BG +3245161984,3245162495,BE +3245163008,3245163519,KE +3245163520,3245164031,NL +3245164032,3245164543,RU +3245164544,3245165055,BE +3245165056,3245165567,AT +3245165568,3245166079,RU +3245166592,3245166847,UA +3245166848,3245167103,SA +3245167104,3245167359,IL +3245167360,3245167615,GB +3245168128,3245168383,SE +3245168384,3245168639,FR +3245168640,3245168895,AT +3245168896,3245169151,RU +3245169152,3245169407,IT +3245169408,3245169663,PL +3245169920,3245170175,PT +3245170432,3245170687,CH +3245170688,3245171711,DE +3245172736,3245173759,IT +3245174784,3245175039,IT +3245175040,3245175295,DE +3245175296,3245175551,RU +3245175552,3245175807,PL +3245175808,3245176063,GB +3245176064,3245176319,SK +3245176320,3245176575,UA +3245176576,3245176831,FR +3245177088,3245177343,ES +3245177344,3245177599,NL +3245177600,3245177855,PL +3245177856,3245178111,SI +3245178112,3245178623,BE +3245178624,3245178879,PL +3245178880,3245179391,UA +3245179392,3245179903,LU +3245179904,3245180415,DE +3245180416,3245180927,TR +3245181440,3245181951,DE +3245181952,3245182463,AT +3245182464,3245182975,FR +3245182976,3245183999,UA +3245184000,3245187071,AT +3245187072,3245189119,UA +3245190144,3245191167,ES +3245191168,3245193215,CZ +3245193216,3245195263,BE +3245195264,3245197311,GB +3245197312,3245199359,IT +3245199360,3245199615,LU +3245199616,3245199871,SE +3245199872,3245200127,NO +3245200128,3245200383,LV +3245200384,3245200639,PL +3245200896,3245201151,DE +3245201152,3245201407,KW +3245201408,3245201663,UA +3245201920,3245202175,SA +3245202432,3245202687,GB +3245202944,3245203455,DE +3245203712,3245203967,PL +3245204224,3245204479,SI +3245204480,3245204735,BE +3245204736,3245204991,ES +3245205248,3245205503,DE +3245205504,3245205759,AT +3245205760,3245206015,IT +3245206016,3245206271,BE +3245206272,3245206527,LT +3245206528,3245207295,DE +3245207296,3245207551,PL +3245207552,3245208063,UA +3245208064,3245208575,DE +3245208576,3245209087,PL +3245209088,3245209599,RU +3245209600,3245210111,UA +3245210112,3245210623,FR +3245210624,3245211135,HU +3245211136,3245211647,GB +3245212672,3245213183,GB +3245213184,3245213695,DE +3245213696,3245214207,LV +3245214208,3245214719,AT +3245214720,3245215231,SE +3245215232,3245215743,SI +3245215744,3245217791,UA +3245217792,3245218815,DE +3245218816,3245219839,AT +3245219840,3245221887,FI +3245221888,3245223935,DE +3245223936,3245225983,NL +3245225984,3245228031,HU +3245228032,3245229055,FI +3245229056,3245230079,DE +3245230080,3245232127,UA +3245232128,3245232383,PL +3245232384,3245232639,BE +3245232896,3245233151,IT +3245233152,3245233407,DK +3245233408,3245233663,CH +3245233664,3245233919,GR +3245233920,3245234175,DK +3245234176,3245234431,GB +3245234432,3245234687,UA +3245234688,3245234943,DE +3245234944,3245235199,RU +3245235200,3245235455,BE +3245235712,3245235967,AT +3245235968,3245236223,CH +3245236224,3245237247,PL +3245237248,3245237759,UA +3245237760,3245238271,DE +3245238272,3245238783,CD +3245238784,3245239295,UA +3245239296,3245240319,FI +3245240320,3245241343,UA +3245241344,3245242367,DE +3245242368,3245243391,PL +3245243392,3245244415,UA +3245244416,3245244671,ES +3245244672,3245244927,AT +3245244928,3245245183,BE +3245245440,3245245695,BG +3245245696,3245245951,DE +3245246720,3245246975,PL +3245246976,3245247231,GB +3245247232,3245247487,DE +3245247488,3245247743,FR +3245248000,3245248255,PL +3245248512,3245248767,UA +3245248768,3245249023,SI +3245249024,3245249535,NL +3245249792,3245250047,GB +3245250048,3245250303,DE +3245250304,3245250559,IT +3245250560,3245250815,FR +3245250816,3245251071,CH +3245251072,3245251327,ES +3245251328,3245251583,MT +3245251584,3245251839,UA +3245251840,3245252095,NL +3245252352,3245252607,BG +3245253120,3245253631,UA +3245253632,3245254143,LV +3245254144,3245254655,DK +3245254656,3245255167,UA +3245255168,3245255679,TR +3245255680,3245257215,UA +3245257216,3245257727,DE +3245257728,3245258239,GB +3245258240,3245258751,AT +3245258752,3245259263,UA +3245259264,3245259775,SK +3245259776,3245260287,UA +3245260288,3245260799,BE +3245260800,3245261823,DE +3245261824,3245262847,DK +3245263872,3245264895,DE +3245264896,3245266943,TR +3245266944,3245268991,BG +3245268992,3245270015,FI +3245270016,3245271039,PL +3245271040,3245272063,NL +3245272064,3245273087,RU +3245273088,3245275135,GB +3245275136,3245277183,BE +3245277184,3245277695,UA +3245277696,3245278207,RU +3245278720,3245279743,UA +3245279744,3245280255,TJ +3245280256,3245280767,BE +3245280768,3245281279,FR +3245281280,3245281791,RO +3245282304,3245282815,IT +3245282816,3245283327,PL +3245283328,3245283839,GB +3245283840,3245284351,PL +3245284352,3245284863,GB +3245285632,3245285887,GB +3245285888,3245286143,DE +3245286144,3245286399,GB +3245286400,3245287423,PL +3245287424,3245287679,DE +3245287680,3245287935,PL +3245287936,3245288191,PT +3245288192,3245288703,DE +3245288960,3245289215,IT +3245289216,3245289471,AT +3245289472,3245290495,UA +3245291520,3245292543,DE +3245292544,3245293567,UA +3245293568,3245294079,FI +3245294080,3245294591,ES +3245294592,3245295103,RO +3245295104,3245296127,IT +3245296128,3245296639,GB +3245297920,3245298175,NL +3245298176,3245298431,IE +3245298432,3245298687,UA +3245298688,3245298943,GB +3245298944,3245299199,UA +3245299456,3245299711,AT +3245299968,3245300223,BG +3245300736,3245300991,RU +3245300992,3245301247,FI +3245301248,3245301503,NL +3245301504,3245301759,BE +3245301760,3245302783,SK +3245302784,3245303807,DE +3245303808,3245304831,SE +3245304832,3245306367,DE +3245306368,3245306879,UA +3245307392,3245307903,FI +3245307904,3245308415,RO +3245308416,3245308927,ES +3245309440,3245309951,UA +3245309952,3245311999,CZ +3245312000,3245314047,DE +3245314048,3245315071,PL +3245317120,3245318143,UA +3245318400,3245318655,RO +3245318656,3245318911,DK +3245318912,3245319167,DE +3245319168,3245319423,HR +3245319424,3245319679,SE +3245319680,3245319935,PL +3245319936,3245320191,DE +3245320448,3245320703,DE +3245321216,3245321471,NL +3245321472,3245321727,UA +3245321984,3245322239,DE +3245322240,3245323263,RU +3245324288,3245325311,GB +3245325312,3245326335,UA +3245326336,3245326847,SI +3245326848,3245327359,BG +3245327872,3245328383,DE +3245328384,3245328895,GB +3245328896,3245329407,CH +3245329408,3245329919,UA +3245329920,3245333503,DE +3245333504,3245334527,SI +3245334528,3245334783,HU +3245334784,3245335039,BE +3245335296,3245335551,GB +3245335552,3245335807,NL +3245336064,3245336575,GB +3245336576,3245336831,RO +3245337600,3245337855,PL +3245337856,3245338367,DE +3245338368,3245339647,UA +3245339648,3245340671,LV +3245341696,3245342719,RU +3245342720,3245408255,CN +3245408256,3245867007,GB +3245867008,3245916159,IE +3245916160,3245917183,GB +3245917184,3245931263,IE +3245931264,3245931519,GB +3245931520,3245932543,IE +3245932544,3245998079,BE +3245998080,3246129151,US +3246129152,3246129407,RU +3246129408,3246129663,ES +3246129664,3246131711,RU +3246131712,3246132735,SY +3246132736,3246132991,DE +3246132992,3246134271,RU +3246134784,3246135551,RU +3246135552,3246135807,ES +3246135808,3246136831,SY +3246136832,3246137087,RU +3246137088,3246137599,ES +3246137600,3246138623,RU +3246138624,3246138879,ES +3246138880,3246139391,SY +3246139392,3246140159,RU +3246140160,3246140415,ES +3246140416,3246142207,RU +3246142208,3246142463,ES +3246142464,3246142975,SY +3246142976,3246144767,RU +3246144768,3246145023,ES +3246145024,3246145535,SY +3246145536,3246146559,RU +3246146560,3246147071,SY +3246147072,3246147583,ES +3246147584,3246148607,SY +3246148608,3246149631,DE +3246149632,3246149887,RU +3246149888,3246150143,ES +3246150144,3246150655,SY +3246150656,3246150911,DE +3246150912,3246151167,ES +3246151168,3246151679,SY +3246151680,3246153727,RU +3246153728,3246157823,SY +3246157824,3246159871,RU +3246159872,3246160127,ES +3246160128,3246160383,RU +3246160384,3246160895,SY +3246160896,3246161407,RU +3246161408,3246161919,SY +3246161920,3246162943,RU +3246162944,3246163199,ES +3246163200,3246163711,RU +3246163712,3246163967,ES +3246163968,3246168063,DE +3246168064,3246169599,SY +3246169600,3246170111,RU +3246170112,3246174207,SY +3246174208,3246178303,RU +3246178304,3246180351,SY +3246180352,3246182399,RU +3246182400,3246186495,SY +3246186496,3246187519,RU +3246187520,3246190591,SY +3246190592,3246191615,US +3246191616,3246192639,DE +3246192640,3246193663,PS +3246193664,3246194175,SY +3246194176,3246194431,RU +3246194432,3246260223,ES +3246260224,3246325759,PT +3246325760,3246328831,ES +3246329088,3246329855,ES +3246350848,3246351103,ES +3246351616,3246352639,ES +3246359552,3246362623,US +3246362624,3246371073,ES +3246371074,3246371074,PT +3246371075,3246374911,ES +3246378752,3246379007,ES +3246379008,3246381055,GB +3246383872,3246384127,ES +3246385152,3246387199,US +3246387200,3246388223,GB +3246389248,3246390783,ES +3246391296,3246613503,GB +3246613504,3246614527,HU +3246614528,3246784511,GB +3246784512,3246825983,CH +3246825984,3246826239,US +3246826240,3246915583,CH +3246915584,3246979783,PT +3246979784,3246979784,US +3246979785,3247046655,PT +3247046656,3247046911,AT +3247046912,3247047679,SI +3247048192,3247048703,NO +3247048704,3247048959,EE +3247048960,3247049215,SI +3247049216,3247053823,DE +3247054080,3247054335,CH +3247054336,3247054591,LT +3247054592,3247054847,DE +3247054848,3247063039,SI +3247063040,3247063295,FR +3247063296,3247063551,PL +3247063552,3247063807,DE +3247063808,3247064063,BG +3247064064,3247064319,DE +3247064320,3247064575,CH +3247064576,3247064831,RU +3247064832,3247065087,SE +3247065344,3247065599,CH +3247065600,3247065855,SE +3247066112,3247066367,DK +3247066368,3247066623,LV +3247066624,3247066879,CZ +3247066880,3247067135,RU +3247067136,3247067647,DE +3247067648,3247067903,RU +3247067904,3247068159,CH +3247068160,3247068415,UA +3247068672,3247068927,GB +3247068928,3247069183,UA +3247069184,3247069439,DE +3247069440,3247069695,RU +3247069696,3247069951,NL +3247069952,3247070207,DE +3247070208,3247070463,IL +3247070464,3247070719,UA +3247070720,3247070975,AT +3247070976,3247071231,GB +3247071232,3247071487,DE +3247071488,3247072255,RO +3247072256,3247072511,NL +3247072512,3247072767,BE +3247072768,3247073023,SE +3247073024,3247073279,RO +3247073280,3247073535,DE +3247073536,3247073791,AT +3247073792,3247074047,CZ +3247074048,3247074303,GB +3247074304,3247074559,DE +3247074560,3247074815,SE +3247074816,3247075071,PL +3247075328,3247076095,DE +3247076096,3247076351,DK +3247076352,3247076607,TR +3247076608,3247076863,DE +3247076864,3247077119,PL +3247077120,3247077375,DE +3247078144,3247078399,AT +3247078400,3247078655,DK +3247078656,3247078911,HU +3247078912,3247079167,FI +3247079168,3247079423,HU +3247079424,3247080447,RU +3247080448,3247081471,UA +3247081472,3247083519,PL +3247083520,3247084543,UA +3247084544,3247085567,RU +3247085568,3247086591,CZ +3247086592,3247087615,DE +3247087616,3247088639,IT +3247088640,3247089663,DE +3247091712,3247092735,RU +3247092736,3247093759,DE +3247093760,3247094783,UA +3247094784,3247095807,LV +3247095808,3247097855,RO +3247097856,3247098879,FI +3247098880,3247099903,NL +3247099904,3247100927,PL +3247100928,3247101951,CH +3247101952,3247102975,SE +3247102976,3247106047,NL +3247106048,3247107071,RU +3247107072,3247108095,UA +3247108096,3247109119,PL +3247109120,3247110143,UA +3247110144,3247111167,NL +3247112192,3247177727,FR +3247177728,3247243263,TR +3247243264,3247243775,DE +3247243776,3247244031,NL +3247244032,3247244287,DE +3247244288,3247248383,NL +3247248384,3247250431,DE +3247250432,3247253503,NL +3247253504,3247255039,DE +3247255040,3247256831,NL +3247256832,3247260671,DE +3247260672,3247266559,NL +3247266560,3247267071,DE +3247267072,3247267839,NL +3247267840,3247271679,DE +3247271680,3247274239,NL +3247274240,3247274495,DE +3247274496,3247275519,NL +3247275520,3247276031,DE +3247276032,3247278847,NL +3247278848,3247279615,DE +3247279616,3247279871,NL +3247279872,3247280127,DE +3247280128,3247288319,NL +3247288320,3247291647,DE +3247291648,3247292415,NL +3247292416,3247301375,DE +3247301376,3247302143,NL +3247302144,3247302655,DE +3247302656,3247308799,NL +3247308800,3247309055,BG +3247309056,3247309567,FI +3247309824,3247313407,FI +3247313664,3247313919,AM +3247314688,3247315967,FI +3247316480,3247316735,IR +3247316736,3247316991,RU +3247321600,3247322111,FI +3247322368,3247322623,CH +3247322880,3247323135,FI +3247323136,3247323647,RU +3247324416,3247324671,SE +3247324672,3247324927,CH +3247325184,3247333631,FI +3247333632,3247333887,DE +3247333888,3247334399,FI +3247334400,3247334655,NO +3247334656,3247335167,FI +3247335168,3247335423,DK +3247335424,3247336447,DE +3247336448,3247337215,NO +3247337216,3247337471,CH +3247337472,3247337983,PL +3247337984,3247338239,UA +3247338240,3247338495,PL +3247338496,3247338751,SI +3247339008,3247339519,GB +3247339520,3247340543,FI +3247340544,3247340799,UA +3247340800,3247341055,CH +3247341312,3247341567,DE +3247343616,3247345663,FI +3247345920,3247346175,HU +3247346944,3247347199,SI +3247347200,3247347455,FI +3247347456,3247347711,IL +3247347968,3247348223,HU +3247348992,3247349247,DE +3247349248,3247349503,FR +3247349504,3247349759,UA +3247349760,3247353855,SE +3247353856,3247357951,FI +3247361024,3247361279,FI +3247362048,3247362303,RO +3247362304,3247362559,HU +3247362560,3247362815,PL +3247362816,3247363071,DK +3247363072,3247363327,GB +3247363328,3247363583,UA +3247363584,3247363839,HU +3247363840,3247364095,NL +3247364096,3247364351,GB +3247364352,3247364607,ES +3247364608,3247365119,UA +3247365120,3247365375,GB +3247365376,3247365631,UA +3247365632,3247365887,SA +3247366144,3247370495,FI +3247371008,3247371263,PL +3247371264,3247371519,SE +3247371520,3247371775,CA +3247371776,3247372031,RU +3247372032,3247372287,FI +3247372288,3247372543,RO +3247372800,3247373055,RO +3247373056,3247373567,FI +3247374336,3247374591,RU +3247375360,3247375871,FI +3247376384,3247378431,FI +3247379200,3247379455,FI +3247382528,3247390719,FI +3247392256,3247393791,FI +3247394048,3247394303,PL +3247394560,3247397887,FI +3247397888,3247398143,RU +3247398144,3247404799,FI +3247404800,3247405055,RU +3247405056,3247405311,RO +3247405312,3247405567,PL +3247405568,3247405823,DE +3247406080,3247431679,FI +3247431936,3247432191,FI +3247432192,3247432447,TR +3247432704,3247437823,FI +3247438080,3247438335,IT +3247438848,3247439871,FI +3247439872,3247702015,ES +3247702016,3247702271,RO +3247702528,3247703295,ES +3247703552,3247704063,FR +3247705856,3247706111,RU +3247708160,3247711743,ES +3247711744,3247712255,IT +3247713280,3247713535,RU +3247713536,3247713791,BE +3247713792,3247714047,SK +3247726592,3247742975,ES +3247742976,3247751167,DE +3247751168,3247769599,ES +3247769600,3247771647,DE +3247775744,3247783935,DE +3247783936,3247788031,US +3247788032,3247790079,NL +3247790080,3247792127,IE +3247792128,3247800319,FR +3247800320,3247816703,DK +3247823104,3247823359,AT +3247828992,3247833087,BE +3247833088,3247833599,RU +3247833600,3247834111,PL +3247834112,3247834623,DE +3247834624,3247835135,UA +3247835136,3247836159,GB +3247836160,3247837183,CZ +3247837184,3247838207,ES +3247838208,3247838463,RU +3247838464,3247838719,PL +3247838720,3247839231,NO +3247839232,3247839743,CZ +3247839744,3247840255,GB +3247840256,3247841279,UA +3247841280,3247841791,RU +3247841792,3247842047,GB +3247842048,3247842303,CZ +3247842304,3247842815,PL +3247842816,3247843327,CZ +3247843328,3247843583,LT +3247843584,3247845375,PL +3247845376,3247845631,CH +3247845632,3247845887,UA +3247845888,3247846399,PL +3247846400,3247847423,RU +3247847424,3247848447,UA +3247848448,3247849471,IT +3247849472,3247849727,DE +3247849728,3247849983,RU +3247849984,3247850239,SE +3247850240,3247850495,BG +3247850496,3247850751,RU +3247850752,3247851007,PL +3247851008,3247851519,RU +3247851520,3247852543,SK +3247852544,3247853567,PL +3247853568,3247854591,RU +3247854592,3247855615,DK +3247855616,3247856127,UA +3247856128,3247856639,ES +3247856640,3247857663,RU +3247857664,3247858175,UA +3247858688,3247859711,RU +3247859712,3247859967,SE +3247859968,3247861759,RU +3247861760,3247862015,IT +3247862016,3247862271,UA +3247862272,3247863807,RU +3247864064,3247864319,NO +3247864320,3247864575,UA +3247864576,3247864831,PL +3247864832,3247865343,RU +3247865344,3247865599,MT +3247865600,3247865855,IL +3247865856,3247871999,CZ +3247872000,3247875327,NL +3247875328,3247875583,PL +3247875584,3247876095,DE +3247876352,3247876607,FR +3247877120,3247877631,GR +3247877632,3247879167,AT +3247879168,3247882239,GB +3247882240,3247898623,SE +3247898624,3247899647,RU +3247899648,3247900671,DE +3247900672,3247901695,PL +3247901696,3247902719,UA +3247902720,3247903743,GB +3247903744,3247904767,BG +3247904768,3247905791,RU +3247905792,3247906815,RO +3247906816,3247907839,DE +3247907840,3247908863,PL +3247908864,3247909887,BY +3247909888,3247910911,DE +3247910912,3247912959,PL +3247912960,3247913983,UA +3247913984,3247914495,DE +3247914496,3247915007,AT +3247915008,3247917055,PL +3247917056,3247918079,NL +3247918080,3247919103,PL +3247919104,3247920127,BG +3247920128,3247921151,FR +3247921152,3247922175,UA +3247922176,3247923199,SE +3247923200,3247925247,PL +3247925248,3247926271,UA +3247926272,3247927295,RU +3247927296,3247928319,PL +3247928320,3247929343,HU +3247929344,3247931391,GB +3247931392,3247939583,IR +3247947776,3247960063,RU +3247960064,3247962111,UA +3247962112,3247963135,DE +3247963136,3247964159,UA +3247964160,3248095231,ES +3248095232,3248160767,AT +3248160768,3248226303,DE +3248226304,3248357375,NO +3248357376,3248488447,DE +3248488448,3248488703,FR +3248488704,3248490495,NO +3248490752,3248491007,NO +3248491520,3248492031,RU +3248492544,3248496639,NO +3248496896,3248497151,US +3248497152,3248498431,NO +3248498432,3248498687,DE +3248498688,3248504831,NO +3248513280,3248513535,UA +3248513536,3248514047,AT +3248514816,3248515071,FR +3248515072,3248521215,NO +3248521984,3248522239,RU +3248522240,3248522751,NO +3248523264,3248524287,NO +3248526336,3248527359,NO +3248528384,3248528895,NO +3248528896,3248529151,RU +3248529408,3248540671,NO +3248540672,3248541183,RU +3248541184,3248541695,SE +3248545792,3248546815,UA +3248546816,3248547839,RU +3248549632,3248549887,SE +3248551936,3248553215,NO +3248553728,3248553983,RU +3248553984,3248554239,RO +3248557056,3248558079,UA +3248558080,3248560127,NO +3248560896,3248561151,IN +3248561664,3248562080,NO +3248562081,3248562081,DK +3248562082,3248575487,NO +3248575488,3248576511,CZ +3248576512,3248599039,NO +3248599040,3248603135,SE +3248603136,3248603391,BG +3248603392,3248603647,RU +3248603648,3248604159,NO +3248606976,3248619519,NO +3248619520,3248624383,DK +3248624384,3248624639,US +3248624640,3248638463,DK +3248638464,3248638719,GB +3248638720,3248716287,DK +3248716288,3248716799,GB +3248716800,3248750591,DK +3248750592,3248750847,PT +3248752640,3248752895,DE +3248752896,3248753151,TR +3248753408,3248753663,GB +3248753664,3248753919,FR +3248753920,3248754431,GB +3248754432,3248754687,AT +3248758784,3248774143,SE +3248774144,3248775167,UA +3248775168,3248783615,GB +3248783616,3248783871,PL +3248783872,3248784127,UA +3248784128,3248784895,DE +3248785408,3248785535,SI +3248785536,3248785663,RO +3248785664,3248786943,SI +3248786944,3248787199,PL +3248787200,3248787455,DE +3248787456,3248787711,NL +3248787712,3248787967,CH +3248787968,3248788223,RU +3248788224,3248788479,ES +3248788480,3248789503,FR +3248789760,3248790015,FR +3248790016,3248790271,DE +3248790272,3248790527,DK +3248790528,3248790783,FR +3248790784,3248791039,PL +3248791040,3248791295,BE +3248791296,3248791551,DE +3248791552,3248792063,GB +3248792320,3248792343,GB +3248792352,3248792407,GB +3248792416,3248792439,GB +3248792480,3248792527,GB +3248792536,3248792575,GB +3248796608,3248796863,GB +3248798976,3248799231,GB +3248799736,3248799743,GB +3248799744,3248800255,NL +3248800256,3248800767,RU +3248800768,3248801279,FR +3248801280,3248801791,RO +3248801792,3248802303,RU +3248802304,3248802815,FR +3248802816,3248803327,RU +3248803328,3248803839,GB +3248804864,3248805375,DE +3248805376,3248805887,RU +3248805888,3248806399,NL +3248806400,3248806911,CZ +3248806912,3248807423,IE +3248807936,3248808447,AT +3248808448,3248808959,GR +3248808960,3248810111,FR +3248810144,3248810175,CY +3248810176,3248810207,FR +3248810240,3248810495,CH +3248810496,3248812543,AT +3248812544,3248813055,GB +3248813056,3248813567,CH +3248813568,3248814079,DE +3248815104,3248815615,GB +3248815616,3248816127,PL +3248816128,3248881663,CZ +3248881664,3249012735,FI +3249012736,3249012991,DE +3249012992,3249013503,LU +3249014272,3249014783,DE +3249014784,3249025023,LU +3249025536,3249025791,FR +3249026560,3249026815,PL +3249027072,3249045503,LU +3249078272,3249078783,RU +3249078784,3249079295,CH +3249079296,3249079807,RU +3249079808,3249080831,RO +3249080832,3249081343,DE +3249081344,3249081855,LV +3249081856,3249082367,GB +3249082368,3249082879,HU +3249082880,3249083391,PL +3249083392,3249083903,RO +3249083904,3249084927,RU +3249085440,3249085951,RU +3249085952,3249086463,GI +3249086464,3249088511,RU +3249088512,3249089023,NL +3249089024,3249089535,NO +3249089536,3249090047,RU +3249090048,3249090559,FR +3249090560,3249091071,SI +3249091072,3249091327,TR +3249091328,3249091583,NL +3249091584,3249092095,RU +3249092096,3249092607,DE +3249092608,3249093119,IT +3249093120,3249093631,GB +3249093632,3249094655,RU +3249094656,3249095679,FR +3249095680,3249096191,NL +3249096192,3249096703,IL +3249096704,3249097215,DE +3249097216,3249097727,DK +3249097728,3249098239,DE +3249098240,3249098751,PL +3249098752,3249099263,UA +3249099264,3249099775,CH +3249099776,3249100287,FI +3249100288,3249100799,UA +3249100800,3249101311,IL +3249101312,3249101823,GB +3249101824,3249102335,RU +3249102336,3249102847,DE +3249102848,3249103359,RU +3249103360,3249103871,DE +3249103872,3249104383,FI +3249104384,3249104895,RU +3249104896,3249105407,IL +3249105920,3249106431,NL +3249106432,3249106943,RU +3249106944,3249108479,PL +3249108480,3249108991,RU +3249108992,3249109503,GB +3249109504,3249110015,RU +3249110016,3249111039,UA +3249111040,3249111551,RU +3249111552,3249112063,KW +3249112064,3249113087,UA +3249113088,3249113599,RO +3249113600,3249114111,NL +3249114112,3249114623,GB +3249114624,3249115647,RO +3249115648,3249116159,UA +3249116160,3249116671,PL +3249116672,3249117183,IT +3249117184,3249117695,CH +3249117696,3249118207,DK +3249118208,3249118719,RO +3249118720,3249119231,LU +3249119232,3249119743,RU +3249119744,3249120255,IT +3249120256,3249120767,SE +3249120768,3249121279,LV +3249121280,3249121791,DE +3249122304,3249124351,RU +3249124352,3249124863,DE +3249124864,3249125375,CZ +3249125376,3249125887,DE +3249125888,3249126399,CH +3249126400,3249126911,UA +3249126912,3249127423,SA +3249127424,3249127935,GB +3249127936,3249128447,LV +3249128448,3249128959,DE +3249128960,3249129471,BG +3249129984,3249130495,RU +3249130496,3249131007,DE +3249131008,3249131519,GB +3249131520,3249132031,DK +3249132032,3249132543,RU +3249132544,3249133055,DE +3249133056,3249133567,UA +3249133568,3249134079,GB +3249134592,3249135615,RU +3249135616,3249136127,GB +3249136128,3249137151,RU +3249137152,3249137663,FR +3249137664,3249138175,PL +3249138176,3249138687,RU +3249138688,3249139199,GB +3249139712,3249140223,UA +3249140224,3249140735,IT +3249140736,3249141247,NL +3249141248,3249141759,IL +3249141760,3249142271,RU +3249142784,3249143295,UA +3249143808,3249274879,AT +3249274880,3249405951,NL +3249405952,3249521279,DE +3249521280,3249521343,UA +3249521344,3249537023,DE +3249537024,3249537279,PT +3249537792,3249538047,GB +3249538048,3249541119,NL +3249545216,3249551359,NL +3249551360,3249552639,GB +3249552640,3249552895,NL +3249553152,3249553407,NL +3249561600,3249565695,NL +3249569792,3249574143,NL +3249574144,3249574399,RU +3249574400,3249574655,SE +3249574912,3249590527,NL +3249590528,3249590783,FR +3249592320,3249598463,NL +3249600256,3249600511,AT +3249600512,3249601535,UA +3249601536,3249668095,NL +3249668096,3249676287,IE +3249676288,3249676543,GB +3249676800,3249677055,UA +3249677056,3249677311,SE +3249678336,3249678847,IE +3249681664,3249681919,IE +3249683456,3249684479,SE +3249684480,3249696767,IE +3249697280,3249697535,IE +3249697792,3249698047,IE +3249698048,3249698303,PL +3249698304,3249698559,RU +3249698560,3249698815,HU +3249701120,3249701631,SE +3249701632,3249701887,RU +3249701888,3249702143,PL +3249702144,3249702399,FI +3249702400,3249702655,FR +3249702656,3249702911,RU +3249702912,3249704191,FR +3249704192,3249704447,RO +3249704704,3249704959,PL +3249704960,3249705983,UA +3249705984,3249706495,AT +3249706496,3249707007,LV +3249707008,3249707519,BG +3249707520,3249708031,FR +3249708032,3249708543,CH +3249708544,3249709055,RU +3249709056,3249709311,AT +3249709312,3249709567,PL +3249709568,3249709823,UA +3249709824,3249710079,DE +3249710080,3249710335,PL +3249710336,3249710591,RO +3249710592,3249710847,BG +3249710848,3249711103,PL +3249711104,3249711359,HU +3249711872,3249712127,AT +3249712384,3249712639,GB +3249712896,3249713151,DK +3249713152,3249715199,LV +3249715200,3249715455,AT +3249715456,3249715711,DE +3249715712,3249715967,NL +3249715968,3249716223,UA +3249716224,3249716479,SI +3249716480,3249716735,NL +3249716736,3249717247,UA +3249717248,3249718271,LV +3249719296,3249720319,IR +3249720320,3249721343,IT +3249721344,3249721599,AT +3249721600,3249721855,BE +3249721856,3249722367,FR +3249722624,3249723135,PL +3249723136,3249723391,EE +3249723392,3249723647,IT +3249723648,3249723903,GB +3249724160,3249724415,LU +3249724672,3249724927,RU +3249724928,3249725183,BG +3249725184,3249725439,GB +3249725440,3249725951,RO +3249725952,3249726463,DE +3249726464,3249726975,UA +3249727488,3249727999,LV +3249728000,3249728511,IT +3249728512,3249729023,UA +3249729024,3249729535,GB +3249729536,3249730559,PL +3249730560,3249731583,IT +3249731584,3249732607,UA +3249732608,3249733631,IT +3249733632,3249799167,CZ +3249799168,3249802239,SE +3249802240,3249802751,DE +3249802752,3249828607,SE +3249828608,3249828863,AT +3249828864,3249829375,DE +3249829376,3249829631,AT +3249829632,3249829887,SE +3249829888,3249830143,GB +3249830144,3249830399,SE +3249830400,3249830655,IT +3249830656,3249830911,DK +3249830912,3249843711,SE +3249843712,3249843967,GB +3249843968,3249844479,SE +3249844480,3249844735,AT +3249844736,3249844991,AU +3249844992,3249845759,SE +3249845760,3249846271,DE +3249846272,3249850623,SE +3249850624,3249850879,GB +3249850880,3249855487,SE +3249855488,3249856511,NL +3249856512,3249859583,SE +3249859584,3249860095,DE +3249860096,3249861375,SE +3249861376,3249861631,BE +3249861632,3249862143,DE +3249862144,3249862399,BE +3249862400,3249862655,SE +3249862656,3249863167,DE +3249863168,3249863423,BE +3249863424,3249863679,SE +3249863680,3249863935,ES +3249863936,3249864447,SE +3249864448,3249864703,NL +3249864704,3249865471,SE +3249865472,3249865727,GB +3249865728,3249868031,SE +3249868032,3249868287,DK +3249868288,3249868543,SE +3249868544,3249868799,DE +3249868800,3249869823,NL +3249869824,3249871103,SE +3249871104,3249871359,NO +3249871360,3249871615,US +3249871616,3249871871,NO +3249871872,3249872383,SE +3249872384,3249872639,GB +3249872640,3249910271,SE +3249910272,3249910783,NL +3249910784,3249911807,SE +3249911808,3249912319,GB +3249912320,3249924607,SE +3249924608,3249924863,NO +3249924864,3249926143,SE +3249926144,3249926399,AU +3249926400,3249926655,SE +3249926656,3249926911,BE +3249926912,3249929471,SE +3249929472,3249929983,CA +3249929984,3249930239,NO +3249930240,3249931263,SE +3249931264,3249931775,NL +3249931776,3249932287,SE +3249932288,3249934335,US +3249934336,3249934847,IT +3249934848,3249935871,SE +3249935872,3249936383,DE +3249936384,3249960447,SE +3249960448,3249960959,DE +3249960960,3249961215,CA +3249961216,3249961471,SE +3249961472,3249961727,NL +3249961728,3249967103,SE +3249967104,3249967615,IL +3249967616,3249967871,GB +3249967872,3249968127,SE +3249968128,3249969151,FR +3249969152,3249969663,SE +3249969664,3249970175,DE +3249970176,3249970431,SE +3249970432,3249970687,NO +3249970688,3249970943,DK +3249970944,3249971199,FI +3249971200,3249971455,IT +3249971456,3249971711,SE +3249971712,3249972735,DE +3249972736,3249973759,SE +3249973760,3249974015,NL +3249974016,3249974527,SE +3249974528,3249974783,ES +3249974784,3249976063,SE +3249976064,3249976319,FR +3249976320,3249976831,SE +3249976832,3249977087,GB +3249977088,3249991679,SE +3249991680,3249991935,US +3249991936,3249993215,SE +3249993216,3249993471,NL +3249993472,3249993727,SE +3249993728,3249994239,DE +3249994240,3249994495,CH +3249994496,3249995263,SE +3249995264,3249995519,GB +3249995520,3249997055,SE +3249997056,3249997311,US +3249997312,3250000127,SE +3250000128,3250000383,GB +3250000384,3250007295,SE +3250007296,3250007551,GB +3250007552,3250010367,SE +3250010368,3250010879,CH +3250010880,3250012159,SE +3250012160,3250013183,DE +3250013184,3250013976,SE +3250013977,3250013977,NO +3250013978,3250013978,DK +3250013979,3250014207,SE +3250014208,3250014719,DE +3250014720,3250014975,SE +3250014976,3250015231,NO +3250015232,3250015743,FI +3250015744,3250016767,SE +3250016768,3250017023,NL +3250017024,3250017791,SE +3250017792,3250018303,DE +3250018304,3250019071,SE +3250019072,3250019327,GB +3250019328,3250019839,SE +3250019840,3250020095,GB +3250020096,3250020863,SE +3250020864,3250021375,IT +3250021376,3250022399,FR +3250022400,3250023423,SE +3250023424,3250024447,DE +3250024448,3250026495,SE +3250026496,3250027519,FR +3250027520,3250030335,SE +3250030336,3250030591,DK +3250030592,3250031103,DE +3250031104,3250031359,DK +3250031360,3250031615,US +3250031616,3250035455,SE +3250035456,3250035711,US +3250035712,3250038271,SE +3250038272,3250039295,ES +3250039296,3250039807,SE +3250039808,3250040319,GB +3250040320,3250042623,SE +3250042624,3250043135,FR +3250043136,3250051071,SE +3250051072,3250051327,BR +3250051328,3250051583,ES +3250051584,3250061311,SE +3250061312,3250192383,FI +3250192384,3250192639,AT +3250192896,3250193151,IL +3250193152,3250193407,DE +3250193408,3250193663,IE +3250193664,3250194175,AT +3250194176,3250194431,DE +3250194432,3250194687,FR +3250194688,3250194943,UA +3250194944,3250195199,RO +3250195456,3250195711,DE +3250195712,3250195967,GB +3250196224,3250196479,UA +3250196480,3250200575,AT +3250200576,3250200831,HU +3250200832,3250201087,RO +3250201088,3250201343,RU +3250201344,3250201599,DK +3250201600,3250202111,NL +3250202112,3250202367,BG +3250202368,3250202623,PL +3250202624,3250233343,AT +3250233600,3250233855,AT +3250233856,3250234111,GB +3250234112,3250234367,GR +3250234368,3250241535,AT +3250245632,3250245887,TR +3250245888,3250246143,AT +3250246144,3250246399,GB +3250246656,3250257151,AT +3250257408,3250257663,AT +3250257664,3250257919,PL +3250258432,3250271231,AT +3250271232,3250271743,PL +3250271744,3250271999,LB +3250272000,3250272255,GB +3250272256,3250274303,SK +3250274304,3250276351,PL +3250276352,3250276607,GB +3250276608,3250276863,RU +3250276864,3250277375,IT +3250277376,3250277631,UA +3250277632,3250277887,DE +3250277888,3250278399,UA +3250278400,3250279423,RU +3250307072,3250323199,AT +3250323200,3250323455,RU +3250323456,3250323711,PL +3250324480,3250324991,GB +3250324992,3250325247,AE +3250325248,3250325503,MA +3250326528,3250327039,BH +3250331648,3250335743,MT +3250335744,3250339839,KW +3250339840,3250348031,JO +3250348032,3250356223,BH +3250356224,3250357247,LB +3250357248,3250357823,GB +3250357824,3250357855,FR +3250357856,3250357871,EE +3250357872,3250357879,CH +3250357880,3250357887,SE +3250357888,3250357895,DK +3250357904,3250357919,FR +3250357920,3250357927,PL +3250357928,3250357959,CY +3250358016,3250358527,LB +3250358528,3250358783,HU +3250359296,3250359807,HU +3250359808,3250362879,KW +3250362880,3250363391,DE +3250363392,3250363903,SE +3250363904,3250364415,DE +3250364416,3250372607,KW +3250372608,3250373631,HU +3250373632,3250374143,DE +3250374144,3250374655,PL +3250374656,3250375679,SE +3250375680,3250376703,GB +3250376704,3250380799,AT +3250380800,3250386943,CH +3250386944,3250387199,SE +3250387200,3250387455,FR +3250387456,3250387711,DE +3250388224,3250388479,PL +3250388480,3250388735,UA +3250388736,3250388991,FR +3250388992,3250405887,NG +3250405888,3250406399,IE +3250406400,3250406911,RU +3250406912,3250407423,RO +3250407424,3250407935,PL +3250407936,3250408447,GB +3250408448,3250408959,PL +3250408960,3250409471,DE +3250409472,3250409983,GB +3250409984,3250410495,DE +3250411008,3250411519,LT +3250411520,3250412031,RU +3250412544,3250413055,DK +3250413056,3250413567,DE +3250413568,3250414079,UA +3250414080,3250414591,RO +3250414592,3250415103,SE +3250415104,3250415359,GB +3250415360,3250415615,PL +3250415616,3250416127,FR +3250416128,3250417663,DE +3250417664,3250418175,IT +3250418176,3250418687,DE +3250418688,3250419199,PL +3250419712,3250420223,RU +3250420224,3250420735,IR +3250420736,3250421247,FR +3250421248,3250421759,UA +3250421760,3250422015,NG +3250422016,3250423295,GB +3250423296,3250423551,NL +3250423552,3250423807,BE +3250423808,3250424063,AT +3250424064,3250424319,SI +3250424320,3250424575,RU +3250424576,3250424831,NL +3250424832,3250425343,GB +3250425344,3250425599,TR +3250425600,3250425855,FR +3250425856,3250426111,LT +3250426368,3250426623,AT +3250426624,3250426879,FR +3250426880,3250427135,JO +3250427136,3250427391,NL +3250427392,3250429951,DE +3250429952,3250438143,SI +3250438144,3250446335,CH +3250446336,3250454527,DE +3250454528,3250585599,BE +3250585600,3250585855,NL +3250586624,3250588671,PT +3250588800,3250588927,CY +3250588928,3250589183,GB +3250589184,3250589439,DE +3250589696,3250593791,CH +3250593792,3250594815,GB +3250594816,3250595327,UA +3250595328,3250595839,GR +3250595840,3250596351,DE +3250596352,3250597887,RO +3250597888,3250598399,BG +3250598400,3250598911,GB +3250598912,3250599423,RO +3250599424,3250599935,SE +3250599936,3250600447,BG +3250600448,3250601471,DE +3250601472,3250601983,PL +3250601984,3250610175,GB +3250610176,3250618367,TR +3250618368,3250626559,RU +3250626560,3250634751,PL +3250634752,3250642943,GB +3250642944,3250651135,CH +3250651136,3250659327,IT +3250659328,3250660607,GB +3250661376,3250662399,GB +3250667520,3250675711,PL +3250675712,3250683903,GB +3250683904,3250692095,CH +3250692352,3250692607,NL +3250693376,3250693631,NL +3250693632,3250694143,DE +3250694144,3250694399,PL +3250694400,3250694655,GB +3250694656,3250694911,SK +3250695168,3250695679,IT +3250695680,3250697471,DE +3250697472,3250697727,PL +3250697984,3250698239,IT +3250698240,3250698751,GR +3250698752,3250699263,RU +3250699264,3250699775,GB +3250699776,3250700287,DE +3250700288,3250708479,UA +3250708480,3250716671,KZ +3250716672,3250716927,RO +3250716928,3250718207,MA +3250718208,3250720767,DE +3250720768,3250722047,IT +3250722048,3250722303,RO +3250722304,3250724863,GB +3250724864,3250733055,MA +3250733056,3250741247,DZ +3250741248,3250742783,RU +3250742784,3250743551,AT +3250743552,3250743807,RU +3250743808,3250746367,UA +3250746368,3250747391,NL +3250747392,3250747903,SI +3250747904,3250748159,SA +3250748160,3250748415,PL +3250748416,3250749439,UA +3250749440,3250749695,GH +3250749696,3250749951,IT +3250750464,3250751487,FR +3250751488,3250751743,DE +3250752000,3250752511,CH +3250752512,3250753023,BG +3250753536,3250754047,DE +3250754048,3250754303,AT +3250754560,3250755071,DE +3250755584,3250755839,FR +3250755840,3250756351,RU +3250756608,3250756863,BG +3250756864,3250757119,DE +3250757120,3250757375,BE +3250757376,3250757631,HU +3250757632,3250765823,GH +3250765824,3250782207,SE +3250782208,3250847743,GB +3250847744,3250978815,DE +3250978816,3251044351,HR +3251044352,3251109887,FI +3251110656,3251110911,IT +3251110912,3251111167,FR +3251111168,3251111423,CH +3251111424,3251111679,AT +3251111680,3251111935,ES +3251112192,3251112447,SK +3251112448,3251112703,RU +3251112704,3251112959,SE +3251113472,3251113983,BG +3251114496,3251114751,RU +3251114752,3251115007,RO +3251115008,3251115263,PL +3251115264,3251115775,RU +3251115776,3251116031,BE +3251116288,3251116543,GB +3251117056,3251117311,BG +3251117312,3251117567,FR +3251117568,3251117823,IL +3251117824,3251118079,SE +3251118080,3251118591,UA +3251118592,3251119103,RU +3251119104,3251120127,UA +3251120128,3251120639,KW +3251120640,3251121151,FR +3251121152,3251121663,DK +3251121664,3251122175,PL +3251122688,3251123199,PL +3251123712,3251124223,RU +3251124736,3251125247,FR +3251125248,3251125759,BE +3251126272,3251126783,NL +3251126784,3251127295,PL +3251127296,3251127807,UA +3251127808,3251128319,NL +3251129344,3251129855,UA +3251129856,3251130367,CH +3251130368,3251130879,GB +3251130880,3251131391,PL +3251131392,3251131903,UA +3251131904,3251132415,SE +3251132416,3251132927,RU +3251132928,3251133439,DK +3251133440,3251133951,NO +3251133952,3251134463,RU +3251134464,3251136511,GB +3251136512,3251137023,DK +3251137024,3251137535,DE +3251137536,3251138047,PL +3251138048,3251138559,FR +3251138560,3251139071,AT +3251139072,3251139583,GB +3251139584,3251140095,FR +3251140096,3251141631,PL +3251141632,3251142143,LT +3251142144,3251142655,RO +3251142656,3251142911,DE +3251142912,3251143167,RU +3251143424,3251143679,LV +3251143680,3251143935,NL +3251143936,3251144191,GB +3251144448,3251144703,BE +3251144704,3251144959,HU +3251144960,3251145471,DE +3251145472,3251145727,FR +3251145728,3251145983,NL +3251145984,3251146239,RO +3251146240,3251146495,AT +3251146496,3251146751,SK +3251146752,3251147007,CH +3251147008,3251147263,GB +3251147264,3251147519,PL +3251147520,3251147775,NL +3251147776,3251148031,SE +3251148544,3251148799,UA +3251149056,3251149311,NL +3251149312,3251149567,DE +3251149568,3251149823,IE +3251149824,3251150079,DE +3251150080,3251150335,CH +3251150336,3251150591,GB +3251150848,3251151103,DE +3251151104,3251151359,UA +3251151360,3251151615,DE +3251151872,3251152127,NL +3251152128,3251152383,RO +3251152384,3251152639,GB +3251152896,3251153151,RU +3251153408,3251153663,TR +3251153664,3251153919,FR +3251153920,3251154175,DE +3251154176,3251154431,UA +3251154432,3251154687,NL +3251154688,3251154943,UA +3251154944,3251155455,GB +3251155456,3251155711,NL +3251155712,3251155967,UA +3251155968,3251156223,TR +3251156480,3251156735,FR +3251156736,3251156991,UA +3251156992,3251157247,FR +3251157248,3251157503,BE +3251157760,3251158015,PL +3251158016,3251158271,TR +3251158272,3251158527,RU +3251158528,3251158783,UA +3251158784,3251159295,GB +3251159296,3251159551,DE +3251159808,3251160063,DE +3251160320,3251160575,PL +3251160576,3251160831,NL +3251160832,3251161087,RU +3251161088,3251161343,RO +3251161344,3251161599,LV +3251161600,3251161855,SE +3251161856,3251162111,HR +3251162112,3251162367,DK +3251162368,3251162623,UA +3251162624,3251162879,DE +3251162880,3251163135,SI +3251163136,3251163391,SE +3251163392,3251163647,UA +3251163648,3251163903,DE +3251163904,3251164159,RU +3251164160,3251164415,UA +3251164416,3251164671,IT +3251164672,3251164927,GB +3251164928,3251165439,PL +3251165696,3251165951,DE +3251165952,3251166207,UA +3251166208,3251166463,CH +3251166720,3251166975,FR +3251166976,3251167231,CH +3251167232,3251167487,LV +3251167488,3251167743,DK +3251167744,3251168255,PL +3251168256,3251168511,AT +3251168512,3251168767,UA +3251168768,3251169023,DE +3251169024,3251169279,FR +3251169280,3251170047,PL +3251170048,3251170303,NO +3251170304,3251170559,CH +3251170560,3251170815,BG +3251171072,3251171327,RU +3251171328,3251171839,DE +3251171840,3251172095,RO +3251172096,3251172351,ES +3251172608,3251172863,GB +3251173120,3251173375,SA +3251173376,3251173631,UA +3251173632,3251173887,DE +3251173888,3251174143,DK +3251174656,3251174911,DE +3251174912,3251175167,RO +3251175168,3251175423,UA +3251175424,3251175679,FR +3251175680,3251175935,US +3251175936,3251176191,CA +3251176192,3251176959,FR +3251176960,3251177471,US +3251177472,3251179519,DE +3251179520,3251180031,SE +3251180032,3251180543,PL +3251180544,3251181055,RO +3251181056,3251181567,GR +3251181568,3251182079,DE +3251182080,3251182591,FR +3251182592,3251183103,IT +3251183104,3251183615,RU +3251183616,3251183871,LT +3251183872,3251184127,CH +3251184128,3251184383,PL +3251184640,3251184895,PL +3251185408,3251185663,DK +3251185664,3251185919,IT +3251185920,3251186175,AT +3251186176,3251186431,GB +3251186688,3251186943,RO +3251186944,3251187199,SI +3251187456,3251187711,GB +3251187712,3251188735,NL +3251188736,3251189759,DE +3251190784,3251191807,UA +3251191808,3251192319,GB +3251192320,3251192831,LV +3251192832,3251193343,BE +3251193344,3251193855,GB +3251194368,3251194879,NO +3251194880,3251195391,FR +3251195392,3251195903,CZ +3251195904,3251196927,UA +3251196928,3251197951,CH +3251197952,3251198975,RU +3251198976,3251199999,DE +3251200000,3251200511,SE +3251200512,3251200767,UA +3251201024,3251201279,UA +3251201280,3251201535,SI +3251201536,3251201791,AT +3251201792,3251202047,FR +3251202048,3251202303,NL +3251202304,3251202559,UA +3251202560,3251202815,AT +3251202816,3251203327,ES +3251203328,3251203583,SI +3251203584,3251203839,CZ +3251203840,3251204095,RU +3251205120,3251205631,UA +3251205632,3251206143,RU +3251206144,3251206655,GB +3251206656,3251207167,CH +3251207168,3251207679,GB +3251208192,3251209215,CY +3251209216,3251210239,GB +3251210240,3251211263,PL +3251211264,3251212287,PT +3251212288,3251212415,PL +3251212416,3251212671,FI +3251212800,3251212927,FR +3251212928,3251213055,RO +3251213056,3251213119,SE +3251213120,3251213151,NL +3251213152,3251213183,FR +3251213184,3251213215,UA +3251213216,3251213247,CY +3251213280,3251213311,GB +3251213312,3251213375,CY +3251213376,3251213439,DE +3251213504,3251213567,NL +3251213632,3251213695,PL +3251213760,3251213823,CY +3251213824,3251213887,FR +3251213888,3251214015,CY +3251214080,3251214143,CY +3251214272,3251214335,DE +3251214336,3251214463,RU +3251214464,3251214591,UA +3251214592,3251214975,GB +3251214976,3251215103,RO +3251215232,3251215359,IL +3251215360,3251215487,UA +3251215488,3251215615,SE +3251215616,3251215743,CY +3251215872,3251216127,RO +3251216256,3251216383,RU +3251216384,3251216639,GB +3251216640,3251216895,RO +3251216896,3251217151,NL +3251217152,3251217407,GB +3251217408,3251217663,PL +3251217664,3251217919,SI +3251217920,3251218175,GR +3251218176,3251218431,PL +3251218432,3251219199,DE +3251219200,3251219455,IT +3251219456,3251219711,BG +3251219712,3251220223,AT +3251220224,3251220479,UA +3251220480,3251222527,DE +3251222528,3251224575,GB +3251225600,3251226111,GB +3251226112,3251226623,UA +3251226624,3251227135,GB +3251227648,3251228159,GB +3251228160,3251228671,UA +3251229696,3251230719,SI +3251230720,3251231743,UA +3251231744,3251232767,NO +3251232768,3251233791,UA +3251233792,3251234815,RU +3251234816,3251235839,RO +3251235840,3251236863,DE +3251236864,3251237887,BG +3251240960,3251241215,BE +3251241216,3251243007,GB +3251245056,3251245311,DE +3251245312,3251245567,BE +3251245568,3251245823,TR +3251245824,3251246079,DK +3251246080,3251246335,DE +3251246336,3251246591,UA +3251246592,3251246847,RO +3251246848,3251247103,NL +3251247104,3251249151,DE +3251249152,3251251199,NL +3251252736,3251256831,CH +3251256832,3251257343,GB +3251257344,3251259903,BE +3251260416,3251261439,FR +3251263488,3251265535,FR +3251265536,3251267839,NL +3251267840,3251268351,GB +3251268352,3251268607,DE +3251268608,3251268863,BG +3251268864,3251269119,NL +3251269120,3251269375,DK +3251269376,3251269631,FR +3251269888,3251270143,GB +3251270400,3251270655,NO +3251270656,3251270911,DE +3251270912,3251271167,PL +3251271168,3251271423,UA +3251271424,3251271679,DE +3251271680,3251271935,TR +3251271936,3251272191,FR +3251272192,3251272447,NL +3251272448,3251272703,AT +3251272704,3251272959,DE +3251272960,3251273471,FR +3251273472,3251273727,DE +3251273728,3251281919,SG +3251281920,3251286015,DE +3251286016,3251288063,US +3251288064,3251290111,SG +3251290112,3251302399,GB +3251302400,3251306495,LI +3251306496,3251307007,AT +3251307776,3251308031,GB +3251311104,3251311615,RS +3251311616,3251312127,GB +3251312384,3251312639,RS +3251313152,3251313663,RS +3251314688,3251315711,FR +3251315712,3251317759,RU +3251317760,3251318783,PL +3251318784,3251319807,UA +3251320832,3251321855,PL +3251321856,3251322879,RU +3251322880,3251331071,GB +3251331072,3251331583,FR +3251331584,3251332095,PL +3251332096,3251333119,RU +3251333120,3251333631,CH +3251333632,3251334143,PT +3251334144,3251334655,FR +3251335168,3251335679,RU +3251335680,3251336191,RO +3251336192,3251336703,GB +3251336704,3251337215,ES +3251337216,3251337727,CH +3251337728,3251338239,DE +3251338240,3251339263,RU +3251339264,3251347455,IE +3251347456,3251355647,DE +3251355648,3251356159,GB +3251356160,3251356671,AT +3251356672,3251357183,EE +3251357184,3251357695,BG +3251357696,3251358207,ES +3251358208,3251358719,RU +3251358720,3251359231,RO +3251359232,3251360255,PL +3251360256,3251360767,GB +3251360768,3251361279,FR +3251361792,3251362303,AT +3251362304,3251362815,UA +3251362816,3251363327,NL +3251363328,3251363839,PL +3251364096,3251364607,NL +3251364608,3251364863,RO +3251364864,3251366911,IT +3251366912,3251367423,UA +3251367424,3251367935,NZ +3251367936,3251372031,GB +3251372032,3251634175,IT +3251634176,3251896319,FI +3251896320,3252158463,NO +3252158464,3252174847,LT +3252174848,3252175871,NL +3252175872,3252177919,SE +3252177920,3252178943,HR +3252178944,3252191231,SE +3252191232,3252196351,HR +3252196352,3252197119,LT +3252197120,3252197375,SE +3252197376,3252207615,HR +3252207616,3252220927,LT +3252220928,3252221183,SE +3252221184,3252222463,LT +3252222464,3252223487,SE +3252223488,3252232191,LT +3252232192,3252232319,SE +3252232320,3252232576,NL +3252232577,3252240383,SE +3252240384,3252286463,HR +3252286464,3252289535,LT +3252289536,3252289791,BG +3252289792,3252291583,GR +3252291584,3252292607,DE +3252292608,3252293631,FR +3252293632,3252297727,DE +3252297728,3252308223,GR +3252308224,3252308479,DE +3252308480,3252313599,GR +3252313600,3252313855,SI +3252313856,3252314111,DE +3252314112,3252314623,GR +3252314624,3252314879,HU +3252314880,3252315135,GB +3252315136,3252316415,CH +3252316672,3252318463,GR +3252318464,3252318719,TR +3252318720,3252318975,GP +3252318976,3252319231,PL +3252319232,3252319743,AT +3252320256,3252320511,CZ +3252320768,3252321023,GR +3252321280,3252321791,GR +3252321792,3252322303,PL +3252322304,3252323327,NO +3252323328,3252324351,PL +3252324352,3252326399,RU +3252326400,3252327423,DE +3252327424,3252329471,PL +3252329472,3252330495,UA +3252330496,3252334591,GB +3252334592,3252335615,PL +3252335616,3252336639,RU +3252336640,3252337663,UA +3252337664,3252338687,RU +3252338688,3252340735,BE +3252341248,3252341503,DE +3252342016,3252342079,GB +3252342080,3252342239,CY +3252342240,3252342271,CH +3252342272,3252342527,SE +3252342528,3252342543,NO +3252342544,3252342591,DE +3252342592,3252342607,IE +3252342608,3252342655,CY +3252342656,3252342783,IL +3252342784,3252346367,DE +3252346624,3252355071,GR +3252355072,3252356351,LT +3252357120,3252358911,LT +3252358912,3252359167,DE +3252359168,3252362239,DK +3252362240,3252362495,PL +3252362496,3252362751,IT +3252362752,3252363263,DK +3252363264,3252379647,LT +3252379648,3252379903,ES +3252379904,3252380159,GB +3252380160,3252380415,BE +3252380672,3252380927,SI +3252381184,3252381439,IT +3252381440,3252381695,ES +3252381696,3252381951,RU +3252381952,3252382207,DE +3252382208,3252382463,SI +3252382464,3252382719,PL +3252382720,3252382975,GB +3252382976,3252383231,IT +3252383232,3252383743,GB +3252383744,3252383999,SE +3252384000,3252384511,PL +3252384512,3252384767,GB +3252384768,3252385023,NL +3252385024,3252385279,RO +3252385280,3252385535,GB +3252385536,3252385791,RO +3252385792,3252386047,GB +3252386304,3252386559,GB +3252386560,3252386815,BE +3252386816,3252387071,UA +3252387072,3252387327,RU +3252387328,3252387583,PL +3252387584,3252387839,RU +3252387840,3252404223,LT +3252404224,3252405759,NO +3252405760,3252406271,FR +3252406272,3252407295,NO +3252407296,3252415231,FR +3252415232,3252415999,LU +3252416000,3252420607,FR +3252420608,3252424703,NO +3252424704,3252426751,FR +3252426752,3252427775,US +3252427776,3252428321,FR +3252428322,3252428322,AO +3252428323,3252428799,FR +3252428800,3252429823,NO +3252429824,3252448511,FR +3252448512,3252448767,NO +3252448768,3252449791,FR +3252449792,3252450047,DK +3252450048,3252450879,FR +3252450880,3252450911,NO +3252450912,3252461567,FR +3252461568,3252469503,NO +3252469504,3252469759,FR +3252469760,3252473855,NL +3252473856,3252476927,US +3252476928,3252477951,FR +3252477952,3252486143,NO +3252486144,3252490239,BE +3252490240,3252496127,SE +3252496128,3252496383,AU +3252496384,3252500223,SE +3252500224,3252500479,GB +3252500480,3252505343,SE +3252505344,3252505599,US +3252505600,3252507135,SE +3252507136,3252507647,RO +3252507648,3252510719,GB +3252510720,3252514815,FR +3252514816,3252515071,SI +3252515072,3252515327,GB +3252515328,3252515583,NL +3252515584,3252515839,SI +3252515840,3252516095,CH +3252516096,3252516351,FR +3252516352,3252516607,GB +3252516608,3252516863,SE +3252517376,3252517631,PL +3252517888,3252518143,DK +3252518144,3252518399,NL +3252518400,3252518655,PL +3252518656,3252518911,DE +3252518912,3252527103,NL +3252527104,3252535295,BE +3252541952,3252542207,CI +3252543488,3252551679,BE +3252551680,3252563967,CH +3252563968,3252564479,RU +3252564736,3252564991,IR +3252564992,3252566015,UA +3252566016,3252566271,DE +3252566272,3252566527,RO +3252566528,3252566783,RU +3252566784,3252567039,CH +3252567296,3252567551,GB +3252567552,3252567807,RU +3252567808,3252568063,RO +3252568064,3252576255,CH +3252578816,3252579327,CH +3252579328,3252579583,FR +3252579584,3252579839,RU +3252579840,3252580095,SE +3252580352,3252584447,LI +3252584448,3252584703,FR +3252584704,3252584959,IL +3252584960,3252585215,CZ +3252585216,3252585471,PL +3252585472,3252585727,NL +3252585728,3252585983,FI +3252585984,3252586239,FR +3252586240,3252586495,PL +3252586496,3252586751,IT +3252586752,3252587007,NL +3252587008,3252587263,CH +3252587520,3252587775,UA +3252587776,3252588031,SE +3252588544,3252599807,CH +3252600320,3252600575,NL +3252600576,3252600831,RU +3252600832,3252616191,CH +3252616704,3252616959,ES +3252616960,3252617215,CH +3252617216,3252617471,PL +3252617472,3252633599,CH +3252634624,3252634879,RU +3252636672,3252636927,TR +3252636928,3252637183,DE +3252637184,3252637695,GB +3252637696,3252641791,CH +3252642304,3252642559,UA +3252642560,3252642815,DK +3252642816,3252643071,AE +3252643072,3252643327,RO +3252643328,3252643583,CH +3252645120,3252645375,CH +3252645888,3252682751,CH +3252682752,3252813823,HU +3252813824,3252830207,RO +3252830208,3252832255,MD +3252832256,3252832767,RO +3252832768,3252834303,MD +3252834304,3252862975,RO +3252862976,3252879359,HU +3252879360,3252895743,EG +3252895744,3252903935,IT +3252903936,3252904447,UA +3252904448,3252904703,RU +3252904704,3252904959,DE +3252904960,3252905215,PL +3252905216,3252905471,CH +3252905472,3252905727,LT +3252905984,3252906239,IT +3252906240,3252906495,PL +3252906496,3252906751,GB +3252906752,3252907007,FR +3252907008,3252907263,AT +3252907520,3252907775,RO +3252907776,3252908031,GB +3252908032,3252908287,PL +3252908288,3252908543,AT +3252908800,3252909055,UA +3252909056,3252909311,PL +3252909312,3252909567,DE +3252909568,3252909823,GB +3252909824,3252910335,UA +3252910848,3252911103,PL +3252911104,3252911359,DE +3252911616,3252911871,SE +3252911872,3252912127,SA +3252912128,3252912383,EG +3252912640,3252912895,FR +3252912896,3252913151,PL +3252913152,3252913407,ES +3252913408,3252913663,FR +3252913664,3252913919,RU +3252914176,3252916223,FR +3252916224,3252920319,DE +3252920320,3252928511,LB +3252928512,3252929535,DE +3252929536,3252930559,HU +3252930560,3252931071,GB +3252931072,3252931583,DE +3252931584,3252932095,NO +3252932096,3252933631,UA +3252933632,3252934655,IT +3252934656,3252936703,PL +3252936704,3252937215,CH +3252937216,3252937727,RO +3252937728,3252938239,FR +3252938240,3252938751,UA +3252938752,3252939263,RU +3252939264,3252939775,DE +3252940288,3252940799,PT +3252940800,3252941311,RU +3252941824,3252942847,GB +3252942848,3252943359,FR +3252943360,3252943871,UA +3252943872,3252944383,RU +3252944384,3252944895,DE +3252944896,3252945151,AT +3252945152,3252945407,GB +3252945408,3252945663,UA +3252945920,3252947455,AT +3252948992,3252977663,AT +3252980992,3252981247,GB +3252981504,3252981759,SE +3252981760,3252982015,DE +3252982272,3252982527,DE +3252982528,3252982783,FR +3252983040,3252983551,DE +3252983552,3252983807,SI +3252983808,3252984063,BG +3252984064,3252984319,RO +3252984320,3252984575,AT +3252984576,3252984831,GB +3252984832,3252985087,FR +3252985088,3252985343,SE +3252985344,3252985855,RU +3252988416,3252988927,AT +3252989440,3252989695,PL +3252989952,3252994303,AT +3252995072,3252996095,CH +3252996096,3253002239,AT +3253003008,3253003263,AT +3253004288,3253004799,AT +3253004800,3253005055,CZ +3253006336,3253010431,DE +3253010432,3253075967,FI +3253075968,3253139455,RO +3253139456,3253139711,MD +3253139712,3253207039,RO +3253207040,3253223679,RU +3253223680,3253223935,UA +3253223936,3253230591,RU +3253230592,3253230847,BY +3253230848,3253247999,RU +3253248000,3253248255,DE +3253248256,3253270527,RU +3253270528,3253271551,BY +3253271552,3253288703,RU +3253288704,3253288959,AR +3253288960,3253313535,RU +3253313536,3253313791,NL +3253313792,3253338111,RU +3253338112,3253338367,PL +3253338368,3253341695,SE +3253341696,3253341951,NO +3253341952,3253380351,SE +3253380352,3253380607,GB +3253380608,3253380863,SE +3253380864,3253381119,IT +3253381120,3253383935,SE +3253383936,3253384191,NO +3253384192,3253384447,SE +3253384448,3253384703,IT +3253384704,3253388287,SE +3253388288,3253388799,FR +3253388800,3253389055,SE +3253389056,3253389823,FR +3253389824,3253395199,SE +3253395200,3253395455,GB +3253395456,3253395967,IT +3253395968,3253397503,SE +3253397504,3253397759,GB +3253397760,3253398271,SE +3253398272,3253398783,FR +3253398784,3253399039,SE +3253399040,3253399295,FR +3253399296,3253399551,IT +3253399552,3253400575,SE +3253400576,3253401087,IT +3253401088,3253402111,SE +3253402112,3253402367,IT +3253402368,3253402623,JP +3253402624,3253403647,SE +3253403648,3253403903,PL +3253403904,3253409791,SE +3253409792,3253410047,GB +3253410048,3253411839,SE +3253411840,3253412095,US +3253412096,3253412351,SE +3253412352,3253412607,US +3253412608,3253416447,SE +3253416448,3253416703,GB +3253416704,3253416959,US +3253416960,3253419519,SE +3253419520,3253419775,GB +3253419776,3253428223,SE +3253428224,3253428479,DE +3253428480,3253429247,SE +3253429248,3253429759,JP +3253429760,3253430015,ES +3253430016,3253432831,SE +3253432832,3253433087,IT +3253433088,3253433343,DE +3253433344,3253434111,SE +3253434112,3253434367,GB +3253434368,3253434623,IT +3253434624,3253434879,SE +3253434880,3253435135,IT +3253435136,3253435903,SE +3253435904,3253436159,NL +3253436160,3253436415,NO +3253436416,3253440511,SE +3253440512,3253440767,FR +3253440768,3253441023,SE +3253441024,3253441279,CL +3253441280,3253441535,NL +3253441536,3253443839,SE +3253443840,3253444351,NO +3253444352,3253453311,SE +3253453312,3253453567,NO +3253453568,3253454079,SE +3253454080,3253454335,GB +3253454336,3253454847,SE +3253454848,3253454848,NL +3253454849,3253455615,SE +3253455616,3253455871,US +3253455872,3253456383,SE +3253456384,3253456639,US +3253456640,3253460735,SE +3253460736,3253460991,IT +3253460992,3253461247,US +3253461248,3253461759,SE +3253461760,3253462015,PL +3253462016,3253462527,SE +3253462528,3253463039,US +3253463040,3253464063,GB +3253464064,3253464575,SE +3253464576,3253465087,NL +3253465088,3253469183,SE +3253469184,3253534719,PT +3253534720,3253600255,GB +3253601280,3253602303,FI +3253602304,3253603327,DE +3253603328,3253605375,PL +3253605376,3253606399,UA +3253606400,3253606655,PL +3253606656,3253606911,TR +3253606912,3253607423,DE +3253607424,3253608447,NG +3253608448,3253610495,UA +3253610496,3253611519,PL +3253612544,3253613567,RU +3253613568,3253614591,ES +3253614592,3253615615,RO +3253615616,3253616639,DE +3253616640,3253617663,PL +3253617664,3253618687,GB +3253618688,3253619711,UA +3253619712,3253620735,IT +3253620736,3253621759,GB +3253622784,3253623807,DE +3253623808,3253624831,PL +3253624832,3253625855,UA +3253625856,3253626879,IT +3253626880,3253627903,DE +3253627904,3253628927,UA +3253628928,3253629951,GR +3253629952,3253630975,UA +3253632000,3253633023,DE +3253633024,3253635071,RU +3253635072,3253636095,IT +3253636096,3253637119,CH +3253637120,3253638143,ES +3253638144,3253639167,FR +3253639168,3253640191,UA +3253640192,3253641215,AT +3253641216,3253642239,NL +3253642240,3253643263,GB +3253643264,3253645311,PL +3253645312,3253646335,RU +3253646336,3253647359,PL +3253647360,3253648383,DK +3253648384,3253648895,IL +3253648896,3253649407,PL +3253650432,3253651455,DE +3253651456,3253652479,PL +3253652480,3253653503,LI +3253653504,3253654527,IL +3253654528,3253657599,LV +3253657600,3253658623,UA +3253658624,3253659647,DE +3253659648,3253660671,GB +3253661696,3253662719,NL +3253663744,3253664767,NL +3253664768,3253665791,DE +3253665792,3253666815,CZ +3253666816,3253667839,DE +3253667840,3253668863,GB +3253668864,3253669887,ES +3253669888,3253670911,DE +3253670912,3253671935,CH +3253671936,3253672959,UA +3253672960,3253673983,DE +3253675008,3253676031,PL +3253676032,3253677055,AT +3253677056,3253678079,PL +3253678080,3253679103,DK +3253679104,3253680127,IT +3253680128,3253682175,PL +3253682176,3253683199,RO +3253683200,3253685247,UA +3253685248,3253686271,FR +3253686272,3253687295,PL +3253688320,3253690367,NL +3253690368,3253691391,DK +3253691392,3253692415,PL +3253692416,3253693439,DE +3253693440,3253694463,IL +3253694464,3253695487,GB +3253695488,3253696511,NL +3253696512,3253697535,FR +3253697536,3253698559,PL +3253698560,3253699071,UA +3253699072,3253699583,RO +3253699584,3253699839,NL +3253699840,3253700095,RU +3253700096,3253700607,RO +3253700608,3253701119,PL +3253701120,3253702143,RO +3253702144,3253702655,UA +3253702656,3253703167,PL +3253703680,3253704191,HU +3253704704,3253705215,UA +3253705728,3253706239,DE +3253706240,3253706751,RO +3253707264,3253707775,DE +3253707776,3253708287,MD +3253708800,3253709311,DK +3253709312,3253709823,UA +3253709824,3253710335,RO +3253710336,3253710847,GB +3253710848,3253711359,DK +3253711872,3253712383,UA +3253712384,3253712895,MD +3253712896,3253713151,PL +3253713152,3253713407,DE +3253713408,3253713919,NL +3253713920,3253714431,AT +3253714944,3253715455,FR +3253715456,3253715967,RO +3253716480,3253716991,FR +3253716992,3253717503,CH +3253717504,3253718015,NL +3253718016,3253719551,PL +3253719552,3253720063,BE +3253720064,3253720575,RO +3253720576,3253721087,GR +3253721088,3253721599,UA +3253721600,3253722111,RO +3253722112,3253722623,CH +3253722624,3253723135,NL +3253723136,3253723647,PL +3253723648,3253724159,AT +3253724160,3253724671,UA +3253724672,3253725183,RO +3253725184,3253725439,SE +3253725440,3253725695,RU +3253725696,3253726207,UA +3253726720,3253727231,UA +3253727232,3253727743,FR +3253727744,3253728255,RU +3253728768,3253729279,RO +3253729280,3253729791,AT +3253729792,3253730303,UA +3253730304,3253730815,RO +3253730816,3253731327,UA +3253731328,3253731839,DE +3253731840,3253732351,GB +3253732352,3253733375,DE +3253733376,3253734399,GB +3253734400,3253735167,DE +3253735168,3253735423,GB +3253735424,3253737791,DE +3253737792,3253737807,FR +3253737808,3253737823,DE +3253737824,3253737831,PL +3253737832,3253737839,AT +3253737840,3253737847,DE +3253737848,3253737855,HU +3253737856,3253738536,DE +3253738537,3253738537,GB +3253738538,3253738559,DE +3253738560,3253738567,CZ +3253738568,3253738569,BE +3253738570,3253738570,US +3253738571,3253738575,BE +3253738576,3253738751,DE +3253738752,3253739775,GB +3253739776,3253741055,DE +3253741056,3253741679,GB +3253741680,3253741695,RU +3253741696,3253742591,GB +3253742592,3253742847,DE +3253742848,3253743103,GB +3253743104,3253743615,DE +3253743616,3253744415,GB +3253744416,3253744447,CH +3253744448,3253744511,GB +3253744512,3253744512,US +3253744513,3253744911,GB +3253744912,3253745151,DE +3253745152,3253745183,NO +3253745184,3253745663,DE +3253745664,3253745983,GB +3253745984,3253745999,SE +3253746000,3253746007,DK +3253746008,3253746015,IE +3253746016,3253746023,AT +3253746024,3253746031,CH +3253746032,3253746039,FI +3253746040,3253746047,DE +3253746048,3253746111,IT +3253746112,3253746175,DE +3253746176,3253746431,GB +3253746432,3253746559,DE +3253746560,3253746687,GB +3253746688,3253747711,DE +3253747712,3253759999,GB +3253760000,3253760511,DE +3253760512,3253760767,FR +3253760768,3253761407,DE +3253761408,3253761416,ES +3253761417,3253761417,GB +3253761418,3253761471,ES +3253761472,3253762815,DE +3253762816,3253762943,CH +3253762944,3253762948,DE +3253762949,3253762949,GB +3253762950,3253763071,DE +3253763072,3253763327,SE +3253763328,3253764095,DE +3253764096,3253764607,GB +3253764608,3253765119,DE +3253765120,3253765183,ES +3253765184,3253765247,FR +3253765248,3253765279,PL +3253765280,3253765295,NL +3253765296,3253765311,BE +3253765312,3253765375,TR +3253765376,3253766143,DE +3253766144,3253766399,GB +3253766400,3253766463,DE +3253766464,3253766527,NL +3253766528,3253766655,DE +3253766656,3253766911,CH +3253766912,3253767167,DE +3253767168,3253767615,GB +3253767616,3253767675,IE +3253767676,3253767935,DE +3253767936,3253768369,GB +3253768370,3253768370,ES +3253768371,3253768401,GB +3253768402,3253768402,SE +3253768403,3253768565,GB +3253768566,3253768566,DE +3253768567,3253768703,GB +3253768704,3253768831,DE +3253768832,3253768895,GB +3253768896,3253769727,DE +3253769728,3253770239,GB +3253770240,3253770991,DE +3253770992,3253770999,GB +3253771000,3253771199,DE +3253771200,3253771215,IE +3253771216,3253771231,GB +3253771232,3253771263,IE +3253771264,3253771583,DE +3253771584,3253771647,GB +3253771648,3253771792,DE +3253771793,3253771793,GB +3253771794,3253771839,DE +3253771840,3253771903,GB +3253771904,3253772191,DE +3253772192,3253772207,GB +3253772208,3253772287,DE +3253772288,3253772519,GB +3253772520,3253772527,DE +3253772528,3253772543,GB +3253772544,3253774335,DE +3253774336,3253774583,GB +3253774584,3253774591,DE +3253774592,3253774847,GB +3253774848,3253775135,DE +3253775136,3253775151,GB +3253775152,3253775183,DE +3253775184,3253775191,FR +3253775192,3253775599,DE +3253775600,3253775607,IT +3253775608,3253775609,DE +3253775610,3253775610,GB +3253775611,3253776303,DE +3253776304,3253776311,ES +3253776312,3253776383,DE +3253776384,3253776809,GB +3253776810,3253776810,CH +3253776811,3253777407,GB +3253777408,3253777791,DE +3253777792,3253777855,FR +3253777856,3253777887,GB +3253777888,3253777919,DE +3253777920,3253778231,GB +3253778232,3253778239,FR +3253778240,3253778271,GB +3253778272,3253778287,DE +3253778288,3253778391,GB +3253778392,3253778399,IT +3253778400,3253778431,GB +3253778432,3253778751,DE +3253778752,3253778879,BE +3253778880,3253778911,DE +3253778912,3253778943,NL +3253778944,3253779135,GB +3253779136,3253779167,NL +3253779168,3253779199,GB +3253779200,3253779455,DE +3253779456,3253779711,GB +3253779712,3253781415,DE +3253781416,3253781423,GB +3253781424,3253781503,DE +3253781504,3253781615,GB +3253781616,3253781631,FR +3253781632,3253782015,GB +3253782016,3253782527,DE +3253782528,3253782535,FR +3253782536,3253783487,GB +3253783488,3253783519,DE +3253783520,3253784703,GB +3253784704,3253784803,DE +3253784804,3253784804,GB +3253784805,3253785123,DE +3253785124,3253785124,GB +3253785125,3253785343,DE +3253785344,3253785599,NL +3253785600,3253786111,DE +3253786112,3253786367,GB +3253786368,3253786623,DE +3253786624,3253786879,GB +3253786880,3253788079,DE +3253788080,3253788082,GB +3253788083,3253788127,DE +3253788128,3253788143,GB +3253788144,3253788159,DE +3253788160,3253788415,NL +3253788416,3253788447,GB +3253788448,3253788479,DE +3253788480,3253788511,GB +3253788512,3253790207,DE +3253790208,3253790463,GB +3253790464,3253790695,DE +3253790696,3253790703,GB +3253790704,3253791472,DE +3253791473,3253791473,GB +3253791474,3253793007,DE +3253793008,3253793011,ES +3253793012,3253793071,DE +3253793072,3253793087,FR +3253793088,3253793259,DE +3253793260,3253793260,GB +3253793261,3253793261,DE +3253793262,3253793262,GB +3253793263,3253793271,DE +3253793272,3253793275,GB +3253793276,3253793359,DE +3253793360,3253793375,DK +3253793376,3253795839,DE +3253795840,3253796351,GB +3253796352,3253796863,DE +3253796864,3253862399,SE +3253862400,3253862655,GB +3253862656,3253882879,FR +3253882880,3253886975,NL +3253886976,3253887231,GB +3253887232,3253887487,NL +3253887488,3253887743,ES +3253888000,3253888255,PL +3253888256,3253888511,BE +3253888512,3253888767,GB +3253888768,3253889023,SE +3253889024,3253889279,RO +3253889792,3253890047,DK +3253890048,3253890303,NL +3253890560,3253890815,GB +3253890816,3253891071,IE +3253891072,3253891327,DE +3253891328,3253891583,GB +3253891584,3253891839,UA +3253891840,3253892351,GB +3253892352,3253892607,NL +3253892608,3253892863,AT +3253892864,3253893119,NL +3253893120,3253893375,RO +3253893376,3253893631,DE +3253893632,3253893887,SE +3253893888,3253894143,RU +3253894144,3253894399,PT +3253894400,3253894655,NL +3253894656,3253894911,FI +3253894912,3253896703,RU +3253896704,3253896959,AT +3253896960,3253897215,RU +3253897216,3253898239,PL +3253898240,3253898495,GB +3253898496,3253898751,HR +3253898752,3253899263,PL +3253899264,3253899519,MD +3253899520,3253899775,RU +3253899776,3253900287,PL +3253900288,3253901311,RU +3253901312,3253901567,PL +3253901824,3253902079,SI +3253902080,3253902335,DK +3253902336,3253904383,UA +3253904384,3253904895,ES +3253904896,3253905151,UA +3253905152,3253905407,RU +3253905408,3253905919,PL +3253905920,3253906431,RU +3253906432,3253906687,PL +3253906688,3253906943,RU +3253906944,3253907455,FR +3253907456,3253908479,RU +3253908480,3253908991,CZ +3253908992,3253909247,SE +3253909248,3253909503,NL +3253909504,3253910527,SE +3253910528,3253911039,ES +3253911040,3253911551,RU +3253911552,3253911807,FR +3253911808,3253912063,RU +3253912064,3253912575,IR +3253912576,3253913599,RO +3253913600,3253915647,RU +3253915648,3253916159,IR +3253916160,3253916671,NL +3253916672,3253917183,PL +3253917184,3253917439,CY +3253917440,3253917695,PL +3253917696,3253918207,RU +3253918208,3253918719,CH +3253918720,3253919743,IL +3253919744,3253923839,GB +3253923840,3253927935,GR +3253927936,3253961727,GB +3253961728,3253962239,MD +3253962752,3253963263,BE +3253963264,3253963775,RU +3253963776,3253964287,SI +3253964288,3253964799,PL +3253964800,3253965311,SE +3253965312,3253966335,PL +3253966848,3253967359,UA +3253967360,3253967871,PL +3253967872,3253968895,UA +3253968896,3253969151,DE +3253969408,3253969919,AT +3253970688,3253970943,UA +3253970944,3253971967,RS +3253971968,3253972991,RU +3253972992,3253974527,GB +3253974784,3253975039,SE +3253975040,3253977087,DE +3253977088,3253985279,TR +3253985280,3253993471,GB +3253993472,3254067199,BE +3254067200,3254075391,CZ +3254075392,3254083583,HU +3254083584,3254124543,BE +3254124544,3254156799,CH +3254156800,3254157055,LI +3254157056,3254177279,CH +3254177280,3254177535,LI +3254177536,3254255615,CH +3254255616,3254256127,RE +3254256128,3254256639,GP +3254256640,3254257151,YT +3254257152,3254259455,FR +3254259456,3254259967,YT +3254259968,3254260223,GF +3254260224,3254260479,MQ +3254260480,3254260991,FR +3254260992,3254262015,YT +3254262016,3254262527,FR +3254262528,3254263039,YT +3254263040,3254266367,FR +3254266368,3254266623,RE +3254266624,3254277119,FR +3254277120,3254278143,YT +3254278144,3254485879,FR +3254485880,3254485887,CI +3254485888,3254486527,FR +3254486528,3254486543,CH +3254486544,3254487039,FR +3254487040,3254487199,KM +3254487200,3254487263,FR +3254487264,3254487295,KM +3254487296,3254487419,CF +3254487420,3254488431,FR +3254488432,3254488447,MG +3254488448,3254489087,FR +3254489088,3254489343,DZ +3254489344,3254489365,FR +3254489366,3254489367,MR +3254489368,3254489369,FR +3254489370,3254489370,MR +3254489371,3254489373,FR +3254489374,3254489375,MR +3254489376,3254489407,FR +3254489408,3254489439,MR +3254489440,3254489443,FR +3254489444,3254489455,MR +3254489456,3254489463,FR +3254489464,3254489519,MR +3254489520,3254489535,FR +3254489536,3254489567,MR +3254489568,3254489599,FR +3254489600,3254489855,MR +3254489856,3254490111,TD +3254490112,3254490367,FR +3254490368,3254490623,CF +3254490624,3254491135,FR +3254491136,3254491391,DZ +3254491392,3254491903,FR +3254491904,3254492031,CM +3254492032,3254493183,FR +3254493184,3254493253,GP +3254493254,3254493311,FR +3254493312,3254493323,GP +3254493324,3254493343,FR +3254493344,3254493354,GP +3254493355,3254493375,FR +3254493376,3254493410,GP +3254493411,3254493695,FR +3254493696,3254493951,GP +3254493952,3254493999,MQ +3254494000,3254494015,GF +3254494016,3254494207,MQ +3254494208,3254494527,GP +3254494528,3254494975,FR +3254494976,3254494983,DJ +3254494984,3254495055,FR +3254495056,3254495063,DJ +3254495064,3254495487,FR +3254495488,3254495743,DZ +3254495744,3254508799,FR +3254508800,3254508831,MQ +3254508832,3254509412,FR +3254509413,3254509413,GQ +3254509414,3254576383,FR +3254576384,3254576543,DO +3254576544,3254608383,FR +3254608384,3254608895,RE +3254608896,3254609151,FR +3254609152,3254609407,RE +3254609408,3254609663,FR +3254609664,3254610175,RE +3254610176,3254610431,FR +3254610432,3254610687,RE +3254610688,3254610943,FR +3254610944,3254611199,RE +3254611200,3254611455,FR +3254611456,3254611967,YT +3254611968,3254612223,FR +3254612224,3254612991,RE +3254612992,3254613247,FR +3254613248,3254613759,RE +3254613760,3254614015,FR +3254614016,3254615551,RE +3254615552,3254616063,YT +3254616064,3254648831,FR +3254648832,3254649855,AL +3254649856,3254650879,SE +3254653440,3254654847,DE +3254654848,3254654975,FI +3254654976,3254655999,IT +3254656256,3254656511,BG +3254656512,3254656767,DE +3254656768,3254657023,GB +3254657024,3254661119,ES +3254661120,3254665215,GB +3254681600,3254697983,DE +3254697984,3254698495,SE +3254698496,3254699007,GB +3254699008,3254699519,UA +3254700032,3254700543,GR +3254700544,3254701055,DE +3254701568,3254702079,IL +3254702080,3254702591,RU +3254702592,3254703103,GB +3254703104,3254703615,DE +3254703616,3254704127,NL +3254704128,3254704639,UA +3254705152,3254705663,UA +3254705664,3254706175,GR +3254706176,3254707199,RU +3254707200,3254707711,TR +3254707712,3254708223,RO +3254708224,3254708735,UA +3254709248,3254709759,DE +3254709760,3254710271,PL +3254710272,3254710783,IT +3254710784,3254711295,RO +3254711808,3254712319,PL +3254712320,3254712831,RU +3254712832,3254713343,KZ +3254713344,3254713855,TR +3254713856,3254714367,NL +3254714368,3254779903,TR +3254779904,3254780159,DE +3254780160,3254780671,GB +3254780672,3254780927,LT +3254780928,3254781183,GR +3254781184,3254781439,NL +3254781440,3254781951,BE +3254781952,3254782207,LV +3254782208,3254782463,FR +3254782464,3254782719,AT +3254782720,3254782975,DE +3254782976,3254783743,CZ +3254783744,3254783999,SA +3254784000,3254784255,IT +3254784256,3254784511,CH +3254784512,3254785279,LT +3254785280,3254785535,KZ +3254785536,3254785791,DK +3254785792,3254786047,LU +3254786048,3254786815,AT +3254786816,3254787071,SM +3254787072,3254788095,NL +3254788096,3254788351,BG +3254788352,3254789119,ES +3254789120,3254789375,FR +3254789376,3254789631,BE +3254789632,3254790655,TK +3254790656,3254790911,LU +3254790912,3254791423,BE +3254791424,3254791679,SK +3254791680,3254792191,DK +3254792192,3254792959,LV +3254792960,3254793215,EE +3254793216,3254794751,UA +3254794752,3254795007,GB +3254795008,3254795263,SE +3254795264,3254795519,KZ +3254795520,3254795775,SE +3254795776,3254796031,PL +3254796032,3254796287,AT +3254796288,3254797311,SE +3254797312,3254798335,RU +3254798336,3254799359,AT +3254799360,3254800383,IE +3254800384,3254801407,FI +3254801408,3254802431,HR +3254802432,3254803455,UA +3254803456,3254804479,DE +3254804480,3254806527,PL +3254807552,3254808575,KZ +3254808576,3254809599,RU +3254810624,3254811647,RU +3254811648,3254812671,RO +3254812672,3254812927,PL +3254812928,3254813183,RO +3254813184,3254813439,TR +3254813440,3254813695,UA +3254813696,3254813951,DK +3254814208,3254814463,SE +3254814464,3254814719,DE +3254814976,3254815231,CH +3254815232,3254815487,UA +3254815744,3254815999,IT +3254816256,3254816511,TR +3254816512,3254816767,DE +3254816768,3254817279,RU +3254817280,3254817535,CY +3254817536,3254817791,GB +3254817792,3254818047,UA +3254818048,3254818303,DE +3254818304,3254818559,UA +3254818560,3254818815,DE +3254818816,3254819327,FR +3254819328,3254819583,PL +3254819584,3254819839,DK +3254819840,3254820095,GB +3254820096,3254820351,UA +3254820352,3254820607,GB +3254820864,3254821119,LT +3254821120,3254821375,DK +3254821376,3254821631,RU +3254821632,3254821887,DE +3254821888,3254822143,HU +3254822144,3254822399,DE +3254822400,3254822655,FR +3254822656,3254822911,PL +3254823168,3254823423,NO +3254823424,3254823679,NL +3254823680,3254823935,PL +3254823936,3254824191,CH +3254824192,3254824447,RO +3254824448,3254824959,SI +3254824960,3254825215,FR +3254825216,3254825471,RO +3254825472,3254825727,TR +3254825728,3254825983,FR +3254826240,3254826495,PL +3254826496,3254827263,DE +3254827264,3254827519,GR +3254827776,3254828031,UA +3254828544,3254828799,RO +3254828800,3254829055,SI +3254829056,3254829311,NO +3254829568,3254829823,NL +3254829824,3254830079,FR +3254830080,3254830335,IE +3254830336,3254830591,NL +3254830592,3254830847,CH +3254830848,3254831103,PL +3254831104,3254831359,UA +3254831360,3254831615,DE +3254831616,3254831871,TR +3254831872,3254832127,LT +3254832128,3254832383,RO +3254832384,3254832639,BE +3254832640,3254832895,UA +3254833152,3254833407,DE +3254833408,3254833663,RU +3254833664,3254833919,GB +3254833920,3254834175,PL +3254834176,3254834431,CH +3254834432,3254834687,FR +3254834688,3254834943,GB +3254834944,3254835199,NL +3254835200,3254835455,DE +3254835456,3254835711,SE +3254835712,3254835967,UA +3254835968,3254836223,RU +3254836224,3254836479,PL +3254836736,3254836991,AT +3254837248,3254837503,HR +3254837504,3254837759,RU +3254837760,3254838015,IE +3254838528,3254838783,CH +3254838784,3254839039,AT +3254839296,3254839551,DE +3254839552,3254839807,PL +3254839808,3254840063,BE +3254840064,3254840319,BG +3254840320,3254840575,DK +3254840576,3254840831,UA +3254840832,3254841343,GB +3254841344,3254841599,PL +3254841600,3254841855,IE +3254841856,3254842111,LV +3254842880,3254843135,SE +3254843136,3254843391,DE +3254843648,3254843903,FR +3254843904,3254844159,NL +3254844160,3254844415,PL +3254844416,3254844671,GB +3254844672,3254844927,RO +3254844928,3254845183,DE +3254845184,3254845439,FR +3254845440,3254882303,SK +3254882304,3254882559,PL +3254882560,3254882815,IL +3254882816,3254883071,PL +3254883072,3254883583,GB +3254883584,3254883839,AL +3254883840,3254884351,GB +3254884352,3254884607,RU +3254884608,3254884863,PL +3254884864,3254885119,SE +3254885120,3254885375,DE +3254885376,3254885631,RU +3254885632,3254885887,SK +3254885888,3254886143,AT +3254886144,3254886399,UA +3254886400,3254886655,IT +3254886656,3254886911,RU +3254886912,3254887423,CH +3254887424,3254888191,GB +3254888192,3254888447,RO +3254888448,3254888703,RU +3254888704,3254888959,RO +3254888960,3254889471,RU +3254889472,3254890495,SK +3254890496,3254890751,DE +3254891008,3254891263,RO +3254891520,3254891775,GB +3254891776,3254892031,DE +3254892032,3254892287,GB +3254892288,3254892543,BE +3254892800,3254893055,SK +3254893568,3254894079,CZ +3254894080,3254894335,CH +3254894336,3254894591,SK +3254894848,3254895103,UA +3254895104,3254895359,GB +3254895360,3254895615,UA +3254895616,3254895871,PL +3254895872,3254896127,SE +3254896128,3254896383,RU +3254896384,3254896639,PL +3254896640,3254896895,DK +3254896896,3254897151,PL +3254897152,3254897407,RU +3254897408,3254897663,FR +3254897664,3254897919,NL +3254897920,3254898175,BE +3254898176,3254898431,AT +3254898432,3254898687,DE +3254898688,3254898943,IT +3254898944,3254899199,EE +3254899200,3254899455,GB +3254899456,3254899967,SE +3254899968,3254900479,RU +3254900480,3254900991,SK +3254900992,3254901247,PL +3254901504,3254901759,DK +3254901760,3254902271,UA +3254902272,3254904831,SK +3254904832,3254907903,RU +3254908160,3254908415,CH +3254908416,3254908671,PL +3254908672,3254908927,SE +3254908928,3254909951,RU +3254909952,3254910719,PL +3254910720,3254910975,HR +3254910976,3254930602,FR +3254930603,3254930603,RE +3254930604,3254962380,FR +3254962381,3254962381,NL +3254962382,3254962421,FR +3254962422,3254962422,NL +3254962423,3255019519,FR +3255019520,3255019775,GP +3255019776,3255107583,FR +3255111680,3255117823,FR +3255120640,3255120895,DE +3255121664,3255121919,FR +3255123712,3255123967,DE +3255126016,3255126527,FR +3255128064,3255128575,FR +3255129856,3255130111,HR +3255130112,3255130623,FR +3255132160,3255160831,FR +3255166976,3255169023,FR +3255172352,3255172607,DE +3255173120,3255173631,SH +3255173648,3255173711,GB +3255173760,3255173823,GB +3255173840,3255174151,GB +3255174160,3255174167,GB +3255174200,3255174207,GB +3255174216,3255174247,GB +3255174272,3255174279,GB +3255174312,3255174319,GB +3255174328,3255174335,GB +3255174376,3255174383,GB +3255174400,3255175167,GB +3255175200,3255175231,GB +3255175248,3255175263,GB +3255175280,3255175295,GB +3255175312,3255175327,GB +3255175432,3255175447,GB +3255175456,3255175503,GB +3255175512,3255175535,GB +3255175552,3255175559,GB +3255175592,3255175607,GB +3255176192,3255177215,GB +3255177472,3255177855,GB +3255177984,3255187199,GB +3255187200,3255187455,DE +3255187456,3255187711,GB +3255188480,3255191807,GB +3255192320,3255193343,GB +3255193600,3255193863,GB +3255193888,3255193959,GB +3255193968,3255193975,GB +3255193976,3255193983,GI +3255193984,3255193999,GB +3255194016,3255194039,GB +3255194056,3255194063,GB +3255194072,3255194431,GB +3255194496,3255194559,GB +3255194624,3255194703,GB +3255194720,3255194815,GB +3255194880,3255205887,GB +3255205888,3255214079,FR +3255214080,3255222271,CH +3255222272,3255223295,DE +3255223296,3255224319,RU +3255224320,3255225343,RO +3255225344,3255226367,PL +3255226368,3255227391,DE +3255227392,3255228415,RO +3255228416,3255230463,RU +3255230464,3255230719,MA +3255230720,3255230975,PS +3255230976,3255231231,DE +3255231232,3255231487,BE +3255231488,3255231743,DE +3255231744,3255231999,PT +3255232000,3255232255,RO +3255232256,3255233023,UA +3255233280,3255233535,GB +3255233536,3255233791,SE +3255233792,3255234047,SI +3255234048,3255234303,NO +3255234304,3255234559,DE +3255234560,3255234815,FR +3255234816,3255235071,PL +3255235072,3255235327,SI +3255235328,3255235583,SE +3255235584,3255235839,GB +3255235840,3255236351,PL +3255236608,3255236863,GB +3255236864,3255237119,DE +3255237120,3255237375,AT +3255237888,3255238143,ES +3255238400,3255238655,QA +3255238656,3255245759,BE +3255245760,3255245775,LU +3255245776,3255292311,BE +3255292312,3255292319,LU +3255292320,3255304191,BE +3255304192,3255304447,DE +3255304448,3255305215,LV +3255305216,3255305471,BG +3255305472,3255307263,LV +3255307776,3255308031,PL +3255308032,3255308287,CH +3255308288,3255311359,LV +3255311616,3255311871,SE +3255311872,3255312127,PT +3255312128,3255312383,SE +3255312384,3255315711,LV +3255315712,3255316223,PL +3255316224,3255316479,RU +3255316736,3255316991,GB +3255316992,3255317247,FR +3255317248,3255317503,UA +3255317504,3255317759,BE +3255317760,3255318015,BG +3255318016,3255318271,GB +3255318272,3255318527,RU +3255318528,3255318783,UA +3255318784,3255319295,DE +3255319552,3255319807,BG +3255319808,3255320063,AT +3255320064,3255320319,BE +3255320320,3255320575,AT +3255320576,3255321087,UA +3255321088,3255322111,PL +3255322112,3255323135,RU +3255323136,3255323647,GB +3255323648,3255324159,IL +3255324160,3255324671,CH +3255324672,3255325695,RO +3255325696,3255326207,RU +3255326720,3255327231,IL +3255327232,3255327743,DE +3255327744,3255328255,GB +3255328256,3255328767,SI +3255328768,3255336959,DE +3255336960,3255341055,RU +3255341056,3255342079,UA +3255342080,3255343103,FR +3255343104,3255344127,RU +3255344128,3255345151,UA +3255345152,3255353343,RU +3255353344,3255361535,DE +3255361536,3255362047,RU +3255362048,3255362559,FI +3255362560,3255364607,RU +3255364608,3255365119,NL +3255365120,3255365631,SK +3255365632,3255366143,UA +3255366144,3255367167,DK +3255367168,3255367679,RU +3255367680,3255368191,UA +3255368192,3255368703,FR +3255368704,3255369215,CZ +3255369216,3255369727,GB +3255370240,3255370751,RU +3255370752,3255371263,DE +3255371264,3255371775,BG +3255372288,3255372799,DE +3255372800,3255373311,MC +3255373312,3255373823,UA +3255373824,3255374335,PL +3255374848,3255375359,CY +3255375360,3255375871,RO +3255375872,3255376383,PL +3255376384,3255376895,RU +3255376896,3255377151,GB +3255377152,3255377407,SI +3255377408,3255377919,KZ +3255377920,3255378431,GB +3255378432,3255378943,CH +3255378944,3255379455,UA +3255379456,3255379967,RU +3255379968,3255380479,GB +3255380480,3255380991,NL +3255380992,3255381503,CH +3255381504,3255382015,PL +3255382016,3255382527,NL +3255382528,3255383039,UA +3255383040,3255383551,PL +3255383552,3255384063,CH +3255384576,3255385087,AT +3255385088,3255385599,RO +3255385600,3255386111,FR +3255386112,3255386623,KE +3255386624,3255387391,PL +3255387392,3255387647,RU +3255387648,3255388159,UA +3255388160,3255388671,DE +3255388672,3255389183,SE +3255389184,3255389695,GB +3255389696,3255390207,PL +3255390720,3255391231,KE +3255391232,3255391743,NL +3255391744,3255392255,DK +3255392256,3255392767,DE +3255392768,3255393791,RO +3255393792,3255399679,SE +3255399680,3255400447,DE +3255400448,3255401471,CH +3255401472,3255412479,DE +3255412480,3255412735,RO +3255412736,3255413247,DE +3255413248,3255413503,LV +3255413504,3255413759,RU +3255414528,3255414783,LV +3255415808,3255416319,AT +3255416320,3255416831,DE +3255417856,3255418879,GB +3255418880,3255422975,DE +3255424000,3255425023,LV +3255426048,3255426559,IT +3255426816,3255427071,PL +3255427072,3255431167,RU +3255431168,3255432191,GB +3255432192,3255432447,HU +3255432448,3255435263,GB +3255435264,3255435295,EE +3255435296,3255435327,LT +3255435328,3255435359,LV +3255435360,3255435367,AT +3255435368,3255435375,CZ +3255435392,3255435399,EE +3255435400,3255435407,DE +3255435424,3255435431,HU +3255435432,3255435439,LV +3255435456,3255435463,LT +3255435464,3255435471,NL +3255435488,3255435495,PL +3255435496,3255435503,RO +3255435520,3255435551,IS +3255435552,3255435559,BE +3255435560,3255435567,DK +3255435584,3255435591,FR +3255435592,3255435599,IS +3255435616,3255435623,IE +3255435624,3255435631,LU +3255435648,3255435655,CH +3255435656,3255435663,GB +3255435776,3255435807,IS +3255435808,3255435815,BE +3255435816,3255435823,DK +3255435840,3255435847,FR +3255435848,3255435855,IS +3255435872,3255435879,IE +3255435880,3255435887,LU +3255435904,3255435911,CH +3255435912,3255435919,GB +3255436032,3255436063,EE +3255436064,3255436095,LT +3255436096,3255436127,LV +3255436128,3255436135,AT +3255436136,3255436143,CZ +3255436160,3255436167,EE +3255436168,3255436175,DE +3255436192,3255436199,HU +3255436200,3255436207,LV +3255436224,3255436231,LT +3255436232,3255436239,NL +3255436256,3255436263,PL +3255436264,3255436271,RO +3255436288,3255436319,MT +3255436320,3255436327,BG +3255436328,3255436335,HR +3255436352,3255436359,CY +3255436360,3255436367,FI +3255436384,3255436391,GR +3255436392,3255436399,IT +3255436416,3255436423,MT +3255436424,3255436431,NO +3255436448,3255436455,PT +3255436456,3255436463,SI +3255436480,3255436487,ES +3255436488,3255436495,SE +3255436544,3255436575,MT +3255436576,3255436583,BG +3255436584,3255436591,HR +3255436608,3255436615,CY +3255436616,3255436623,FI +3255436640,3255436647,GR +3255436648,3255436655,IT +3255436672,3255436679,MT +3255436680,3255436687,NO +3255436704,3255436711,PT +3255436712,3255436719,SI +3255436736,3255436743,ES +3255436744,3255436751,SE +3255436800,3255436807,SK +3255438352,3255438359,SK +3255451648,3255452671,FR +3255474176,3255476223,GB +3255483392,3255484415,DE +3255485440,3255486463,FR +3255488512,3255489535,AT +3255492608,3255496703,GB +3255498752,3255500799,FR +3255500800,3255504895,CH +3255504896,3255505919,GB +3255506432,3255506687,PL +3255506688,3255506943,PT +3255506944,3255507199,PL +3255507456,3255507711,FR +3255507712,3255507967,AT +3255507968,3255508223,UA +3255508224,3255508479,RU +3255508480,3255521100,CH +3255521101,3255521101,DE +3255521102,3255544319,CH +3255544320,3255544575,DE +3255544576,3255544831,AT +3255544832,3255558143,CH +3255558400,3255558655,UA +3255558912,3255559167,GB +3255559168,3255559679,CH +3255560192,3255562751,CH +3255562752,3255563007,CZ +3255563008,3255563263,CH +3255563776,3255564031,CH +3255564032,3255564287,RU +3255565312,3255566335,DE +3255566336,3255570431,GB +3255570432,3255574527,CH +3255574528,3255578623,CZ +3255578624,3255582719,RU +3255582720,3255599103,UA +3255599104,3255615487,CH +3255615488,3255623679,DE +3255623680,3255631871,BG +3255631872,3255659519,NL +3255660288,3255660543,GR +3255660544,3255666175,NL +3255666432,3255666687,DE +3255668224,3255697407,NL +3255697408,3255704575,SE +3255704576,3255705087,FR +3255705088,3255710719,SE +3255710720,3255710975,ES +3255710976,3255716351,SE +3255716352,3255716863,CH +3255716864,3255719167,SE +3255719168,3255719423,NO +3255719424,3255719679,SE +3255719680,3255719935,IT +3255719936,3255724543,SE +3255724544,3255725055,US +3255725056,3255725311,ES +3255725312,3255730943,SE +3255730944,3255731199,GB +3255731200,3255743231,SE +3255743232,3255743487,IT +3255743488,3255743743,DE +3255743744,3255743999,US +3255744000,3255752959,SE +3255752960,3255753215,LI +3255753216,3255762431,SE +3255762432,3255762943,BE +3255762944,3255771135,DE +3255779328,3255787519,DE +3255791616,3255792639,UA +3255792640,3255793663,RU +3255793664,3255794943,PL +3255795200,3255795711,RU +3255795712,3255798783,DE +3255799040,3255799295,SE +3255799296,3255800319,DE +3255800576,3255800831,UA +3255800832,3255801855,DE +3255802880,3255817215,DE +3255817216,3255817471,SE +3255817472,3255817727,ES +3255817728,3255820287,DE +3255821312,3255822335,CH +3255822336,3255828479,DE +3255828480,3256025087,SE +3256025088,3256057855,NO +3256057856,3256082431,DK +3256082432,3256090623,LV +3256090624,3256221695,IT +3256221696,3256223743,SE +3256223744,3256225791,NL +3256225792,3256229887,SE +3256229888,3256233983,DE +3256233984,3256238079,SE +3256238080,3256246271,NO +3256246272,3256352767,SE +3256352768,3256385535,CH +3256385536,3256393727,AT +3256393728,3256394239,DE +3256394752,3256395263,PL +3256395264,3256395775,GB +3256395776,3256396287,TR +3256396288,3256396799,GR +3256396800,3256397311,RU +3256397312,3256397823,PL +3256398336,3256398847,RO +3256398848,3256399359,PL +3256399360,3256400895,UA +3256400896,3256401407,GB +3256401408,3256401919,UA +3256401920,3256410111,DE +3256410112,3256410623,TR +3256410624,3256411135,GR +3256411136,3256411647,FR +3256411648,3256412159,CH +3256412672,3256413183,RO +3256413184,3256413695,UA +3256413696,3256414207,PL +3256414208,3256414719,RU +3256414720,3256415231,DE +3256415232,3256415743,PL +3256415744,3256416255,UA +3256416256,3256416767,RS +3256417280,3256417791,NO +3256417792,3256418303,GB +3256418304,3256483839,DE +3256483840,3256487935,NL +3256489472,3256489983,GR +3256489984,3256490239,BE +3256490496,3256490751,CH +3256491008,3256491263,DE +3256492032,3256524287,NL +3256524288,3256524799,DE +3256524800,3256549375,NL +3256549376,3256614911,TR +3256614912,3256615935,FI +3256615936,3256616959,UA +3256616960,3256617983,GB +3256617984,3256619007,PL +3256619008,3256620031,UA +3256620032,3256621055,RU +3256621056,3256622079,DK +3256622080,3256623103,RU +3256623104,3256624127,PL +3256624128,3256625151,UA +3256625152,3256626175,PL +3256627200,3256628223,PL +3256628224,3256629247,UA +3256629248,3256630271,RU +3256630272,3256633343,UA +3256633344,3256634367,RU +3256634368,3256635391,MD +3256635392,3256636415,PL +3256636416,3256638463,UA +3256638464,3256639487,RU +3256640512,3256641535,UA +3256641536,3256642559,PL +3256642560,3256643583,SI +3256643584,3256644607,NL +3256644608,3256645631,IT +3256645632,3256646655,SE +3256646656,3256647679,GB +3256647680,3256648703,RS +3256648704,3256649727,UA +3256649728,3256650751,GB +3256650752,3256652799,UA +3256652800,3256653823,DE +3256653824,3256654847,RU +3256655872,3256656895,RU +3256656896,3256657919,GB +3256657920,3256658943,PL +3256658944,3256662015,UA +3256662016,3256663039,RU +3256663040,3256664063,PL +3256664064,3256665087,RU +3256665088,3256666111,UA +3256666112,3256667135,PL +3256667136,3256671231,RU +3256671232,3256672255,PL +3256672256,3256673279,RU +3256673280,3256674303,PL +3256674304,3256675327,LT +3256675328,3256677375,RU +3256677376,3256678399,GB +3256678400,3256680447,DK +3256680448,3256688639,CH +3256688640,3256692735,IL +3256692736,3256693759,GR +3256694784,3256695807,DE +3256695808,3256696831,UA +3256699136,3256699391,NL +3256700416,3256700671,NL +3256705536,3256705791,BE +3256706048,3256706559,GR +3256711168,3256711423,DE +3256713216,3256727551,PL +3256727552,3256727807,DE +3256727808,3256728063,HU +3256728064,3256728575,RU +3256728576,3256729599,DE +3256729600,3256731647,FI +3256731648,3256732671,NO +3256732672,3256732927,IT +3256732928,3256733183,UA +3256733184,3256733439,FR +3256733440,3256733695,DK +3256733696,3256735743,TR +3256735744,3256737791,GB +3256737792,3256745983,DE +3256745984,3256778751,ES +3256778752,3256786943,CY +3256786944,3256787199,NL +3256787456,3256787711,DE +3256787712,3256787967,UA +3256787968,3256788223,PL +3256788480,3256788735,GB +3256788736,3256788991,DE +3256788992,3256789247,RO +3256789248,3256789503,SE +3256789504,3256789759,UA +3256789760,3256790015,GB +3256790016,3256790271,UA +3256790272,3256790783,DE +3256790784,3256791039,NL +3256791552,3256791807,GR +3256791808,3256792063,PL +3256792064,3256792319,DE +3256792320,3256792575,CH +3256792576,3256792831,NL +3256793088,3256793343,GB +3256793344,3256793599,DE +3256793600,3256793855,GB +3256793856,3256794111,SK +3256794112,3256794367,NL +3256794368,3256794623,GB +3256794624,3256794879,RU +3256794880,3256795135,AT +3256795136,3256811519,GR +3256811520,3256819711,DE +3256819712,3256821503,PL +3256821504,3256821759,NO +3256821760,3256822271,PL +3256822272,3256822527,MD +3256822528,3256822783,PL +3256822784,3256823807,UA +3256823808,3256824319,PL +3256824320,3256824831,GB +3256825856,3256826111,EE +3256826112,3256826367,KW +3256826368,3256826623,IL +3256826624,3256826879,RU +3256826880,3256827135,PL +3256827136,3256827391,IS +3256827392,3256827647,GB +3256827648,3256827903,PL +3256827904,3256844287,DE +3256860672,3256863743,DE +3256864256,3256864511,DE +3256864512,3256864767,CH +3256864768,3256870911,DE +3256870912,3256871167,RU +3256871168,3256871935,DE +3256872448,3256872703,DE +3256872960,3256875007,DE +3256875008,3256875519,UA +3256875520,3256876031,RU +3256876032,3256876287,PL +3256876288,3256876543,RU +3256876544,3256876799,CH +3256877056,3256897535,GB +3256898048,3256898303,GB +3256898560,3256899071,TR +3256899072,3256899583,RU +3256915456,3256915711,RS +3256915712,3256915967,SE +3256918016,3256934399,GB +3256942592,3256944639,GB +3256945408,3256945663,GB +3256945664,3256945919,SI +3256945920,3256946175,GB +3256946176,3256946431,RO +3256946432,3256946687,UA +3256946688,3256947711,DE +3256948736,3256950015,GB +3256950272,3256950527,NO +3256950528,3256958975,GB +3256958976,3256959999,RO +3256960000,3256960255,SA +3256960256,3256960511,HU +3256960512,3256961023,SA +3256961024,3256962559,PL +3256962560,3256962815,FR +3256962816,3256963071,RU +3256963072,3256963327,SE +3256963328,3256963839,RU +3256963840,3256964095,PL +3256964096,3256965119,RU +3256966144,3256967167,RU +3256967168,3256967423,LT +3256967424,3256967679,RU +3256967680,3256968191,CH +3256968192,3256969215,RO +3256969216,3256970239,IR +3256970240,3256970495,AT +3256970496,3256970751,GB +3256970752,3256971007,RU +3256971008,3256971263,PL +3256971264,3256971775,NL +3256971776,3256972031,RU +3256972032,3256972287,DE +3256972288,3256973311,PL +3256973312,3256973823,DE +3256973824,3256975359,IR +3256975360,3256988671,GB +3256988672,3256988927,RU +3256988928,3256989183,UA +3256989440,3256989695,GB +3256989696,3256989951,HU +3256989952,3256990207,PL +3256990208,3256990463,CH +3256990464,3256990719,PL +3256990720,3256991231,UA +3256991232,3256991487,SE +3256991488,3256991743,RU +3256991744,3257011199,GB +3257011200,3257011455,BG +3257011456,3257024511,GB +3257024512,3257032703,AU +3257036800,3257057279,GB +3257058816,3257059071,PL +3257060352,3257065471,GB +3257073664,3257081855,GB +3257090048,3257092351,GB +3257092608,3257092863,RO +3257093888,3257098239,GB +3257106432,3257118719,GB +3257120512,3257120767,GB +3257121280,3257121535,GB +3257122304,3257122559,GB +3257122560,3257122815,US +3257122816,3257139199,GB +3257139200,3257139455,DK +3257139456,3257143295,GB +3257143296,3257143807,RU +3257143808,3257144063,DE +3257144064,3257144319,RU +3257144320,3257144575,DE +3257144576,3257144831,GB +3257144832,3257145087,FR +3257145088,3257145343,GB +3257151488,3257180159,GB +3257180160,3257180415,TR +3257180416,3257180671,RU +3257180672,3257180927,EE +3257180928,3257181183,GB +3257181184,3257181439,SA +3257181440,3257181695,PL +3257181696,3257181951,FR +3257182208,3257182463,PL +3257192448,3257196543,GB +3257196544,3257200639,LU +3257200640,3257204735,GB +3257204736,3257225215,AT +3257226240,3257227263,DE +3257229312,3257268223,AT +3257268224,3257268479,UA +3257268480,3257268735,SE +3257269248,3257269503,IT +3257269504,3257269759,AT +3257270016,3257270271,DE +3257286656,3257294847,CH +3257294848,3257303039,HU +3257303040,3257311231,PT +3257311232,3257335807,CH +3257335808,3257352191,DE +3257354240,3257356799,DE +3257357312,3257357567,PT +3257357568,3257357823,SI +3257357824,3257371903,DE +3257371904,3257372159,BE +3257372416,3257372671,GB +3257372672,3257401343,DE +3257401344,3257453567,CH +3257453568,3257454591,RO +3257454592,3257455103,IT +3257455104,3257455359,RO +3257455360,3257455615,SI +3257455616,3257466879,CH +3257466880,3257467135,DE +3257467392,3257467903,SE +3257467904,3257468927,IT +3257469184,3257469439,IT +3257469952,3257470975,PL +3257470976,3257471999,GB +3257472000,3257472511,SG +3257472512,3257475071,GB +3257476864,3257477119,DE +3257481472,3257481727,DE +3257482240,3257482751,GB +3257482752,3257483007,NL +3257483008,3257491455,CH +3257491456,3257495551,BE +3257499648,3257532415,CH +3257532416,3257542655,CY +3257542656,3257542911,PL +3257542912,3257543423,IT +3257543424,3257543679,PT +3257543680,3257544191,RO +3257544192,3257544703,DE +3257544704,3257544959,CH +3257544960,3257545215,DK +3257545216,3257546495,GR +3257546496,3257546527,DE +3257546528,3257546655,CY +3257546656,3257546687,SE +3257546688,3257546719,DE +3257546720,3257546751,DK +3257546752,3257548799,FI +3257548800,3257551623,GB +3257551624,3257551647,BE +3257551648,3257551711,GB +3257551712,3257551719,BE +3257551720,3257551807,GB +3257551808,3257551871,BE +3257551872,3257552732,GB +3257552733,3257552733,SE +3257552734,3257556991,GB +3257557504,3257558015,LU +3257558016,3257559039,RO +3257559552,3257560063,UA +3257560064,3257560575,DE +3257560576,3257561087,PL +3257561088,3257561599,UA +3257561600,3257562111,DE +3257562112,3257563647,PL +3257563648,3257564159,NL +3257564160,3257564671,GB +3257564672,3257565183,RO +3257565184,3257573375,CY +3257573376,3257574143,CH +3257577472,3257581567,DE +3257581568,3257585663,UA +3257585664,3257586175,BE +3257586176,3257586687,NL +3257586688,3257586943,LU +3257586944,3257587455,ES +3257587456,3257587711,GB +3257587712,3257587967,US +3257587968,3257588223,FR +3257588224,3257588735,BE +3257588736,3257589759,NL +3257589760,3257663487,GB +3257663488,3257729023,UA +3257729024,3257730047,DE +3257730048,3257730559,NL +3257730560,3257731071,DE +3257731072,3257734143,NL +3257734144,3257734911,DE +3257734912,3257735679,NL +3257735680,3257736191,DE +3257736192,3257737471,NL +3257737472,3257738751,DE +3257738752,3257740543,NL +3257740544,3257740799,DE +3257740800,3257741055,FR +3257741056,3257741311,NL +3257741312,3257741567,DE +3257741568,3257741823,NL +3257741824,3257743615,DE +3257743616,3257747199,NL +3257747200,3257747455,DE +3257747456,3257748479,NL +3257748480,3257749503,DE +3257749504,3257753087,NL +3257753088,3257756415,DE +3257756416,3257761279,NL +3257761280,3257761791,DE +3257761792,3257763583,NL +3257763584,3257763839,DE +3257763840,3257765375,NL +3257765376,3257768703,DE +3257768704,3257771263,NL +3257771264,3257772543,DE +3257772544,3257775359,NL +3257775360,3257775615,DE +3257775616,3257776127,NL +3257776128,3257776383,DE +3257776384,3257779199,NL +3257779200,3257780479,DE +3257780480,3257782271,NL +3257782272,3257784831,DE +3257784832,3257787135,NL +3257787136,3257787391,DE +3257787392,3257788415,NL +3257788416,3257789951,DE +3257789952,3257794559,NL +3257794560,3257843711,GB +3257843712,3257860095,IE +3257860096,3257925631,SE +3257925632,3257925887,AT +3257925888,3257926143,SE +3257926144,3257926399,AT +3257926656,3257974783,AT +3257975296,3257975807,DE +3257975808,3257977855,AT +3257977856,3257978111,GB +3257978112,3257978367,SE +3257978368,3257978623,BG +3257978624,3257978879,ES +3257978880,3257979135,CZ +3257979136,3257979391,UA +3257979392,3257979647,GB +3257979904,3257980159,UA +3257980160,3257980415,SE +3257980416,3257980671,NL +3257980672,3257980927,CH +3257980928,3257981183,PL +3257981184,3257981439,GB +3257981440,3257981695,RU +3257981696,3257981951,PL +3257986048,3257987327,AT +3257987328,3257987583,CZ +3257987840,3257988095,AT +3257990656,3257990911,AT +3257992960,3257993215,DE +3257996032,3257996287,DE +3257996544,3257996799,CH +3257996800,3258003967,DE +3258003968,3258004479,RU +3258004992,3258005247,DE +3258006528,3258015743,DE +3258019328,3258019583,DE +3258019840,3258021887,DE +3258021888,3258022911,RU +3258022912,3258023167,PL +3258023168,3258023423,DE +3258023424,3258023679,TR +3258023680,3258023935,RU +3258023936,3258056703,DE +3258057216,3258057471,CZ +3258058240,3258058495,RU +3258059008,3258059263,UA +3258059264,3258059519,RU +3258059520,3258059775,RO +3258062848,3258063103,RU +3258063360,3258063871,CZ +3258063872,3258064127,AT +3258064128,3258064383,FR +3258064384,3258065151,GB +3258065152,3258065407,DE +3258065408,3258065663,CH +3258065664,3258065919,SA +3258065920,3258066175,DE +3258066176,3258066431,PL +3258066432,3258066943,FR +3258066944,3258067199,DK +3258067200,3258067455,GB +3258067456,3258067967,GR +3258067968,3258068223,RO +3258068224,3258068479,CH +3258068736,3258068991,DE +3258069248,3258069503,PL +3258069504,3258069759,RO +3258069760,3258070015,UA +3258070272,3258070527,PL +3258070528,3258071295,GB +3258071296,3258071551,DK +3258071552,3258071807,DE +3258072064,3258072319,FR +3258072320,3258072575,PL +3258072576,3258072831,BE +3258072832,3258073087,RO +3258073088,3258074111,CZ +3258074112,3258074879,DE +3258074880,3258075135,IL +3258075904,3258076159,PL +3258076160,3258076415,BG +3258076416,3258076927,FR +3258076928,3258077183,UA +3258077184,3258077439,GB +3258077440,3258077695,UA +3258077952,3258078207,PL +3258078208,3258078463,TR +3258078464,3258078719,UA +3258078720,3258078975,GB +3258078976,3258079231,RU +3258079232,3258079487,GB +3258079488,3258079743,PL +3258079744,3258079999,GB +3258080000,3258080255,BE +3258080512,3258080767,DE +3258081024,3258081279,FR +3258081280,3258081535,NL +3258081536,3258081791,BE +3258081792,3258082047,UA +3258082304,3258082559,CZ +3258082560,3258082815,HU +3258082816,3258083071,NL +3258083072,3258083583,RU +3258083584,3258083839,LV +3258083840,3258084351,SE +3258084352,3258084607,GB +3258084608,3258084863,AT +3258084864,3258085119,PL +3258085376,3258085631,NL +3258085632,3258085887,DE +3258085888,3258086143,PA +3258086144,3258086399,AT +3258086656,3258086911,PL +3258086912,3258087167,GB +3258087168,3258087423,UA +3258087424,3258087679,RU +3258087680,3258087935,GB +3258087936,3258088191,BG +3258088192,3258088447,PL +3258088448,3258088703,BE +3258088704,3258088959,UA +3258088960,3258089215,RO +3258089216,3258089471,FR +3258089472,3258090495,RU +3258090496,3258091519,PL +3258091520,3258092287,SI +3258092288,3258092543,RU +3258092544,3258092799,SE +3258092800,3258093567,RU +3258093568,3258094591,UA +3258094592,3258095359,RU +3258095360,3258095615,AT +3258095616,3258095871,RU +3258095872,3258096383,GB +3258096384,3258097663,PL +3258097664,3258097919,DE +3258097920,3258098175,UA +3258098176,3258098431,DE +3258098432,3258098687,NL +3258098688,3258098943,DE +3258098944,3258099199,GB +3258099200,3258099455,SI +3258099456,3258099711,UA +3258099712,3258099967,FI +3258099968,3258100223,UA +3258100736,3258100991,CH +3258100992,3258101247,AT +3258101248,3258101503,RO +3258101504,3258101759,IL +3258101760,3258102015,CH +3258102016,3258102271,BE +3258102272,3258102527,CH +3258102528,3258102783,TR +3258103040,3258103295,SE +3258103296,3258103551,DE +3258103552,3258103807,AE +3258104320,3258104575,PL +3258104576,3258104831,DE +3258105600,3258105855,DE +3258107904,3258109951,CZ +3258109952,3258110207,DK +3258110464,3258110975,CZ +3258111488,3258111743,PL +3258111744,3258118399,CZ +3258118400,3258118655,UA +3258118656,3258118911,CZ +3258120192,3258120703,CZ +3258121216,3258121471,PL +3258121728,3258121983,UA +3258121984,3258122239,RU +3258122240,3258187775,FR +3258187776,3258230783,SE +3258230784,3258232831,NO +3258232832,3258249215,SE +3258249216,3258253311,NO +3258253312,3258265599,NL +3258267648,3258268671,NL +3258268672,3258268927,IT +3258269184,3258269695,NL +3258271744,3258272767,NL +3258272768,3258273791,FR +3258273792,3258288127,NL +3258294272,3258297343,NL +3258297344,3258297599,BE +3258297600,3258298111,NL +3258298112,3258298367,GB +3258302464,3258318847,NL +3258318848,3258320895,DE +3258320896,3258321919,GB +3258321920,3258322943,RU +3258322944,3258326015,PL +3258326016,3258327039,SE +3258327040,3258335231,TR +3258335232,3258336255,RU +3258336256,3258337279,NO +3258337280,3258338303,DE +3258339328,3258340351,UA +3258340352,3258341375,PL +3258341376,3258342399,UA +3258342400,3258343423,DE +3258343424,3258351615,NO +3258351616,3258352639,RO +3258352640,3258353663,RU +3258354688,3258355711,BG +3258355712,3258356735,NL +3258356736,3258357759,RU +3258357760,3258360831,UA +3258360832,3258361855,SE +3258361856,3258362879,IL +3258362880,3258362891,IM +3258362892,3258362892,GB +3258362893,3258363903,IM +3258363904,3258364927,RU +3258364928,3258365951,RS +3258365952,3258366975,UA +3258366976,3258367999,PL +3258368000,3258384383,KW +3258384384,3258426367,DE +3258427648,3258427903,RO +3258427904,3258428159,DE +3258428416,3258449919,DE +3258449920,3258486783,CH +3258486784,3258487807,LI +3258488832,3258499071,CH +3258501120,3258503935,CH +3258503936,3258504191,PL +3258504704,3258504959,DE +3258504960,3258505215,IL +3258505728,3258506495,CH +3258506496,3258506751,DE +3258508288,3258509311,CH +3258509568,3258509823,DE +3258509824,3258510079,CH +3258511360,3258515455,CH +3258515456,3258580991,FR +3258580992,3258587135,SY +3258587136,3258588159,US +3258588160,3258588927,ES +3258588928,3258589951,RU +3258589952,3258590207,ES +3258590208,3258593279,RU +3258593280,3258595327,SY +3258595328,3258597375,RU +3258597888,3258599423,RU +3258599424,3258600959,PS +3258600960,3258601471,RU +3258601472,3258601983,ES +3258601984,3258602495,RU +3258602496,3258603519,ES +3258603520,3258613759,RU +3258613760,3258619903,SY +3258619904,3258620415,PS +3258620416,3258620927,RU +3258620928,3258621951,SY +3258621952,3258630143,RU +3258630144,3258634239,SE +3258634240,3258636287,SY +3258636288,3258637311,US +3258637312,3258637823,PS +3258637824,3258638335,RU +3258638336,3258642431,SY +3258642432,3258642687,PS +3258642688,3258642943,RU +3258642944,3258643967,PS +3258643968,3258644223,RU +3258644224,3258644479,PS +3258644480,3258646527,SY +3258646528,3258685439,DE +3258685440,3258685695,CH +3258685696,3258691583,DE +3258691840,3258692351,AT +3258692352,3258692607,DE +3258692608,3258692863,FR +3258693120,3258693375,SI +3258693376,3258693631,DE +3258693632,3258693887,RU +3258693888,3258694143,SI +3258694144,3258694399,RU +3258694656,3258694911,GB +3258694912,3258712063,DE +3258712064,3258728447,GB +3258728448,3258729471,FR +3258729472,3258729727,DE +3258729728,3258729983,UA +3258729984,3258730239,CH +3258730240,3258730495,NL +3258730496,3258730751,RO +3258730752,3258731007,TR +3258731008,3258731263,SI +3258731264,3258731519,NO +3258731776,3258732031,UA +3258732032,3258732287,DE +3258732288,3258732543,PL +3258732544,3258732799,SE +3258732800,3258733055,CH +3258733056,3258733311,RO +3258733312,3258734079,GB +3258734592,3258762239,GB +3258764032,3258764287,GB +3258764288,3258764543,DE +3258764800,3258765055,BE +3258765056,3258765311,NL +3258767360,3258767615,GB +3258767616,3258767871,CH +3258767872,3258769919,GB +3258769920,3258770431,PL +3258770432,3258771455,IR +3258771456,3258772479,KZ +3258772480,3258773503,RU +3258773504,3258774015,FR +3258774016,3258774271,RU +3258774272,3258774527,DK +3258774528,3258776063,RU +3258776064,3258776319,GE +3258776320,3258776575,PL +3258776576,3258777599,UA +3258789888,3258790911,CZ +3258790912,3258792191,RU +3258792192,3258792447,PL +3258792448,3258792703,MK +3258792704,3258792959,NL +3258792960,3258793983,RU +3258793984,3258794495,NL +3258794496,3258794751,PL +3258794752,3258795007,RU +3258795008,3258796031,PL +3258797568,3258798079,GB +3258801152,3258802175,GB +3258802176,3258806271,LU +3258808832,3258809343,GB +3258814464,3258816511,GB +3258818048,3258818303,SE +3258818560,3258843135,GB +3258843136,3258843391,RU +3258844928,3258847231,GB +3258848256,3258848767,GB +3258848768,3258849023,RO +3258849024,3258849279,DE +3258849280,3258859519,GB +3258859520,3258859775,BY +3258859776,3258860031,GB +3258860544,3258900479,GB +3258902528,3258902783,GB +3258903040,3258903295,FR +3258903296,3258903551,GB +3258903552,3258903807,DE +3258903808,3258904063,AT +3258904064,3258904575,GB +3258908672,3258941439,GB +3258941440,3258943487,PL +3258943488,3258944511,BG +3258944512,3258945535,RU +3258946560,3258947583,CH +3258948608,3258949631,RU +3258949632,3258972159,GR +3258972160,3258974207,NO +3258974208,3259039743,DE +3259039744,3259105279,PT +3259105280,3259170815,GB +3259170816,3259236351,RU +3259236352,3259237887,SE +3259237888,3259238143,FR +3259238144,3259243007,SE +3259243008,3259243519,AT +3259243520,3259244543,US +3259244544,3259246591,SE +3259246592,3259247615,IT +3259247616,3259247871,RO +3259247872,3259248127,SE +3259248128,3259248383,GB +3259248384,3259248895,SE +3259248896,3259249151,GB +3259249152,3259258623,SE +3259258624,3259258879,ES +3259258880,3259260927,SE +3259260928,3259261183,DK +3259261184,3259262719,SE +3259262720,3259262975,DK +3259262976,3259265023,SE +3259265024,3259265535,DE +3259265536,3259269375,SE +3259269376,3259269631,FR +3259269632,3259276287,SE +3259276288,3259276543,ES +3259276544,3259278591,SE +3259278592,3259278847,GB +3259278848,3259280639,SE +3259280640,3259280895,US +3259280896,3259281407,SE +3259281408,3259282431,US +3259282432,3259283711,SE +3259283712,3259283967,US +3259283968,3259284479,SE +3259284480,3259284735,US +3259284736,3259285759,SE +3259285760,3259286015,GB +3259286016,3259290623,SE +3259290624,3259290879,NO +3259290880,3259291135,US +3259291136,3259292415,SE +3259292416,3259292671,IT +3259292672,3259293951,SE +3259293952,3259294207,BG +3259294208,3259297535,SE +3259297536,3259297791,GB +3259297792,3259301887,SE +3259301888,3259302143,DE +3259302144,3259302399,AE +3259302400,3259303423,CH +3259303424,3259305983,SE +3259305984,3259310079,NL +3259311104,3259311615,DE +3259312640,3259313151,GB +3259317248,3259318271,CH +3259318272,3259318343,GB +3259318344,3259318351,FR +3259318352,3259318599,GB +3259318600,3259318607,AT +3259318608,3259318663,GB +3259318664,3259318671,DK +3259318672,3259318679,GB +3259318680,3259318687,IT +3259318688,3259318727,GB +3259318728,3259318735,FR +3259318736,3259319055,GB +3259319056,3259319071,IT +3259319072,3259319087,GB +3259319088,3259319095,SE +3259319096,3259319103,DK +3259319104,3259319111,FR +3259319112,3259319199,GB +3259319200,3259319215,DE +3259319216,3259319255,GB +3259319256,3259319263,DK +3259319264,3259319287,GB +3259319288,3259319295,BE +3259319296,3259319303,GB +3259319304,3259319311,BE +3259319312,3259319319,DK +3259319320,3259319367,GB +3259319368,3259319375,BE +3259319376,3259319407,GB +3259319408,3259319423,LU +3259319424,3259319439,GB +3259319440,3259319447,CH +3259319448,3259319463,GB +3259319464,3259319471,DK +3259319472,3259319587,GB +3259319588,3259319591,NL +3259319592,3259319663,GB +3259319664,3259319667,FR +3259319668,3259319823,GB +3259319824,3259319831,FR +3259319832,3259319879,GB +3259319880,3259319887,BY +3259319888,3259319987,GB +3259319988,3259319991,NL +3259319992,3259320011,GB +3259320012,3259320015,BE +3259320016,3259320055,GB +3259320056,3259320063,AT +3259320064,3259320575,GB +3259320576,3259320583,FR +3259320584,3259326975,GB +3259326976,3259327487,IE +3259327488,3259328190,GB +3259328191,3259328191,US +3259328192,3259328511,GB +3259328512,3259328703,EE +3259328704,3259328799,GB +3259328800,3259328863,EE +3259328864,3259334495,GB +3259334496,3259334527,IE +3259334528,3259334543,GB +3259334544,3259334551,IE +3259334552,3259334655,GB +3259334656,3259338751,DE +3259338752,3259339007,GB +3259340800,3259341823,GB +3259342848,3259344895,CH +3259347200,3259347455,DE +3259347456,3259347711,CH +3259348224,3259348479,CH +3259348736,3259348991,CH +3259348992,3259351039,NL +3259351040,3259351551,IT +3259351552,3259352063,FR +3259352064,3259352575,CH +3259352576,3259353087,IE +3259354112,3259354367,NL +3259354368,3259354623,DE +3259354880,3259355135,PL +3259355136,3259359231,NO +3259359232,3259367423,ES +3259367424,3259432959,GB +3259432960,3259435263,SE +3259435264,3259435519,IT +3259435520,3259438079,SE +3259438080,3259438335,ES +3259438336,3259438591,SE +3259438592,3259439103,NO +3259439104,3259457279,SE +3259457280,3259457535,IT +3259457536,3259466239,SE +3259466240,3259466495,HU +3259466496,3259469823,SE +3259469824,3259470335,AX +3259470336,3259470847,SE +3259470848,3259471871,US +3259471872,3259479807,SE +3259479808,3259480063,DK +3259480064,3259480831,SE +3259480832,3259481087,ES +3259481088,3259484671,SE +3259484672,3259485183,ES +3259485184,3259490303,SE +3259490304,3259490559,IN +3259490560,3259490815,NL +3259490816,3259491071,SE +3259491072,3259491327,BE +3259491328,3259495935,SE +3259495936,3259496447,DK +3259496448,3259498495,SE +3259498496,3259541503,GB +3259541504,3259543551,NL +3259543552,3259760639,GB +3259760640,3259811839,DE +3259813888,3259814399,DE +3259814400,3259814655,AT +3259814656,3259817983,DE +3259819008,3259821055,DE +3259821824,3259822079,AT +3259822592,3259823103,DE +3259823104,3259823615,RO +3259823616,3259823871,NO +3259823872,3259824127,IE +3259825408,3259825663,DE +3259826176,3259891711,DE +3259891712,3259957247,BE +3259957248,3259958271,DE +3259958272,3259959295,RU +3259959296,3259960319,UA +3259960320,3259961343,BG +3259961344,3259962367,FI +3259962368,3259963391,UA +3259963392,3259964415,PL +3259964416,3259965023,GB +3259965024,3259965031,DE +3259965032,3259965439,GB +3259965440,3259966463,RU +3259967488,3259968511,RS +3259968512,3259969535,RU +3259970560,3259971583,CZ +3259971584,3259972607,IT +3259972608,3259973631,UA +3259973632,3259981823,PT +3259981824,3259990015,EG +3259990016,3260006399,FR +3260006400,3260014591,IT +3260014592,3260018687,NL +3260018688,3260019711,GB +3260019712,3260021247,DE +3260021248,3260021759,RU +3260021760,3260022271,GR +3260022272,3260022783,NL +3260022784,3260284927,GB +3260284928,3260415487,RU +3260415488,3260415999,BY +3260416000,3260481535,FI +3260481536,3260503039,RU +3260503040,3260504063,US +3260504064,3260506367,RU +3260506368,3260506623,CH +3260506624,3260509439,RU +3260509440,3260509695,CH +3260509696,3260547071,RU +3260547072,3260547327,DE +3260547328,3260547583,UA +3260547584,3260547839,NL +3260547840,3260548095,PL +3260548096,3260548351,IE +3260548352,3260548607,DK +3260549120,3260549375,AT +3260549376,3260549631,CH +3260549632,3260549887,DE +3260550656,3260551167,RU +3260551168,3260553983,DE +3260553984,3260554239,GB +3260554240,3260555263,CH +3260555264,3260563455,HU +3260563456,3260571647,GB +3260571648,3260573695,US +3260573696,3260574719,NL +3260574720,3260575743,IL +3260575744,3260579327,US +3260579328,3260579583,CA +3260579584,3260579839,US +3260579840,3260580351,PL +3260580352,3260580863,HU +3260580864,3260581375,GB +3260581376,3260581887,RO +3260581888,3260582399,IL +3260582400,3260583423,RU +3260583424,3260583679,GB +3260583680,3260583935,IT +3260583936,3260584447,NO +3260584448,3260585471,RO +3260585472,3260586495,UA +3260586496,3260587007,PL +3260587008,3260587519,FR +3260587520,3260588031,PL +3260588032,3260596223,DE +3260596224,3260596735,CH +3260596736,3260597247,SK +3260597248,3260597759,CH +3260597760,3260598271,DE +3260598272,3260598783,RU +3260598784,3260599295,RO +3260599296,3260599807,RU +3260599808,3260600319,UA +3260600320,3260601343,RU +3260601344,3260601855,CH +3260601856,3260602367,PL +3260602368,3260602879,DK +3260602880,3260603903,UA +3260603904,3260604415,FR +3260604416,3260604927,PL +3260605440,3260605951,BG +3260605952,3260606463,NL +3260606464,3260607487,SE +3260607488,3260607999,NL +3260608000,3260608511,RO +3260608512,3260609023,IE +3260609024,3260609535,GB +3260609536,3260610047,PL +3260610048,3260610559,FR +3260610560,3260611071,RO +3260611072,3260611583,BG +3260612096,3260612607,SE +3260612608,3260678143,FI +3260678144,3260743679,IL +3260743680,3260809215,JP +3260809216,3260874751,PL +3260893184,3260894207,SE +3260894208,3260895231,AT +3260895232,3260898303,SE +3260898304,3260899327,ES +3260899328,3260900095,CH +3260900096,3260900351,RU +3260900352,3260900607,RO +3260900608,3260901119,NL +3260901120,3260903423,DE +3260903424,3260906239,CH +3260906368,3260906495,DE +3260906496,3260907519,PL +3260907520,3260915711,GB +3260915712,3260923903,UA +3260923904,3260938751,IT +3260938752,3260939007,US +3260939008,3260940287,IT +3260940288,3261071359,DE +3261071360,3261136895,AT +3261136896,3261150143,DE +3261150144,3261150207,US +3261150208,3261202431,DE +3261202432,3261213439,FR +3261213440,3261213695,AF +3261213696,3261267967,FR +3261267968,3261296639,DE +3261296896,3261297151,DE +3261297664,3261297919,RU +3261297920,3261298175,PL +3261298176,3261333503,DE +3261333504,3261399039,FI +3261399040,3261472767,GB +3261472768,3261503487,RO +3261503488,3261503935,MD +3261503936,3261530111,RO +3261530112,3261531903,SE +3261531904,3261532159,GB +3261532160,3261532415,SE +3261532416,3261532671,GB +3261532672,3261532927,SE +3261532928,3261533183,GB +3261533184,3261533439,SE +3261533440,3261533695,US +3261533696,3261534719,SE +3261534720,3261534975,US +3261534976,3261538559,SE +3261538560,3261538815,GB +3261538816,3261539327,SE +3261539328,3261540351,GB +3261540352,3261555455,SE +3261555456,3261555711,DK +3261555712,3261570303,SE +3261570304,3261570559,IT +3261570560,3261595647,SE +3261595648,3261661183,NL +3261661184,3261669375,RO +3261669376,3261673471,MT +3261673472,3261675519,IT +3261675520,3261675775,LV +3261675776,3261676031,IT +3261676800,3261677055,IT +3261677568,3261685759,GB +3261685760,3261687807,DE +3261687808,3261689855,RO +3261689856,3261691903,GB +3261691904,3261694463,NL +3261694464,3261694975,RU +3261694976,3261695487,PL +3261695488,3261695999,GB +3261696000,3261696511,UA +3261696512,3261697023,NL +3261697024,3261698047,RO +3261698048,3261698559,UA +3261698560,3261699071,DE +3261699072,3261699327,RU +3261699328,3261699583,GB +3261699584,3261700095,NL +3261700096,3261700607,FR +3261700608,3261701119,GB +3261701120,3261701631,RU +3261702144,3261710335,GB +3261710336,3261718527,RU +3261718528,3261726719,IS +3261726720,3261734911,ES +3261734912,3261743103,GB +3261743104,3261751295,MT +3261751296,3261759487,EE +3261759488,3261767679,IE +3261767680,3261775871,RS +3261775872,3261776383,PL +3261776384,3261776895,RU +3261777408,3261777449,GB +3261777450,3261777451,NL +3261777452,3261777919,GB +3261777920,3261778943,PL +3261778944,3261779455,RO +3261779456,3261779967,DE +3261779968,3261780479,UA +3261780480,3261780991,PL +3261780992,3261781503,RO +3261781504,3261782015,PL +3261782016,3261783039,UA +3261783040,3261784063,GB +3261784064,3261796351,AT +3261796352,3261796607,GB +3261796608,3261796863,RU +3261796864,3261797119,PL +3261797120,3261797375,KR +3261797376,3261797631,AT +3261797632,3261797887,RU +3261797888,3261798143,TR +3261798144,3261798399,RU +3261798400,3261805567,AT +3261805568,3261806591,DE +3261806592,3261810687,AT +3261812736,3261812991,RU +3261812992,3261815807,AT +3261816064,3261816575,AT +3261816576,3261816831,DE +3261816832,3261820927,AT +3261820928,3261821183,RO +3261821184,3261821439,AT +3261821440,3261821695,NL +3261821696,3261821951,UA +3261821952,3261822207,RU +3261822208,3261822463,UA +3261822464,3261822719,GB +3261822720,3261822975,SE +3261822976,3261823231,PL +3261823232,3261823487,NL +3261823488,3261823743,RO +3261823744,3261823999,BE +3261824000,3261824255,RU +3261824512,3261824767,FR +3261824768,3261825023,PT +3261825024,3261857791,AT +3261857792,3261923327,CZ +3261923328,3261988863,NL +3261988864,3261989119,SE +3261990400,3261990655,UA +3261993472,3261993727,RU +3261994752,3261995263,FI +3261995264,3261995519,DE +3261995520,3261995775,PL +3261996800,3262005247,FI +3262005248,3262005759,PL +3262005760,3262006015,RU +3262006016,3262006271,NL +3262006272,3262006527,RO +3262006528,3262006783,FR +3262006784,3262007039,SE +3262007040,3262007295,IT +3262007552,3262007807,GR +3262008064,3262008319,GB +3262008320,3262008575,PT +3262008576,3262008831,PL +3262008832,3262009087,AT +3262009088,3262009343,UA +3262013440,3262017535,SE +3262018560,3262018815,PL +3262021120,3262021375,UA +3262021376,3262021631,PL +3262021632,3262021887,CH +3262021888,3262022143,UA +3262022912,3262023167,DE +3262023680,3262023935,DK +3262025216,3262025471,FI +3262027264,3262027519,TR +3262027520,3262027775,BE +3262027776,3262028287,RU +3262028288,3262028543,FR +3262028544,3262028799,AE +3262028800,3262029823,DE +3262029824,3262030847,NL +3262030848,3262031871,FR +3262033920,3262034434,FI +3262034435,3262034435,AX +3262034436,3262034511,FI +3262034512,3262034519,AX +3262034520,3262034943,FI +3262034944,3262035199,AX +3262035200,3262036991,FI +3262036992,3262038015,AX +3262038016,3262038271,FR +3262038528,3262038783,IL +3262038784,3262039039,NO +3262039040,3262039295,DE +3262039296,3262039551,GB +3262039552,3262039807,GR +3262039808,3262040063,SI +3262040320,3262040575,ES +3262040576,3262040831,RU +3262040832,3262041343,GB +3262041344,3262041599,BG +3262041600,3262041855,DK +3262041856,3262042367,FR +3262042368,3262042623,GB +3262042880,3262043135,NL +3262043136,3262043391,RO +3262043392,3262043647,TR +3262043648,3262043903,NL +3262043904,3262044159,GB +3262044160,3262044415,RS +3262044416,3262044671,LU +3262044672,3262044927,GR +3262044928,3262045183,UA +3262045184,3262045439,LT +3262045440,3262045695,NL +3262045696,3262045951,SI +3262045952,3262046207,RU +3262046208,3262049279,FI +3262049280,3262049535,JO +3262049536,3262049791,GB +3262049792,3262050559,PL +3262050560,3262051583,GB +3262051584,3262051839,FR +3262052608,3262052863,IL +3262052864,3262053119,GB +3262053120,3262053375,RU +3262053376,3262053631,UA +3262053632,3262053887,RU +3262054144,3262054399,RU +3262054400,3262122143,FI +3262122144,3262122147,AX +3262122148,3262122175,FI +3262122176,3262122183,SE +3262122184,3262122751,FI +3262122752,3262122815,AX +3262122816,3262124031,FI +3262124032,3262128127,DE +3262128128,3262136319,GB +3262137600,3262137855,DE +3262139392,3262140415,GB +3262140416,3262140671,DE +3262141184,3262141439,DE +3262141440,3262142463,ES +3262142464,3262142719,DE +3262143488,3262143743,GB +3262144000,3262144047,DE +3262145024,3262145279,DE +3262145552,3262145567,DE +3262145616,3262145631,DE +3262146048,3262146815,DE +3262147584,3262147839,DE +3262148608,3262148863,DE +3262148880,3262148919,DE +3262148928,3262149119,DE +3262149120,3262149151,FR +3262149152,3262149159,DE +3262149168,3262149375,FR +3262149632,3262149887,DE +3262150912,3262151047,DE +3262151072,3262151103,DE +3262151136,3262151151,DE +3262151168,3262151423,DE +3262151936,3262152191,DE +3262152664,3262152671,DE +3262152704,3262185471,AT +3262185472,3262222335,DE +3262223360,3262223871,DE +3262224896,3262225151,AT +3262226432,3262227455,DE +3262227712,3262227967,RO +3262228480,3262228735,DE +3262229248,3262229503,NL +3262229760,3262230015,DE +3262230528,3262283775,DE +3262283776,3262284799,RU +3262284800,3262285823,UA +3262286848,3262287871,SE +3262287872,3262288127,MD +3262288128,3262288383,FR +3262288384,3262288895,IL +3262288896,3262289919,PL +3262289920,3262316543,SE +3262316544,3262382079,DE +3262382080,3262414847,IT +3262414848,3262415359,DE +3262415360,3262416895,PL +3262416896,3262417407,RO +3262417408,3262417919,PL +3262417920,3262418431,RU +3262418432,3262419455,FR +3262419456,3262419967,NL +3262419968,3262420479,FR +3262420480,3262420991,CH +3262420992,3262421503,ES +3262422016,3262422527,SE +3262422528,3262423039,AT +3262423040,3262423551,GB +3262423552,3262424063,RU +3262424064,3262424575,IT +3262424576,3262424831,PL +3262424832,3262425087,GB +3262425088,3262425343,GR +3262425344,3262425599,RU +3262425600,3262426111,UA +3262426624,3262427135,GB +3262427136,3262427647,FR +3262427648,3262428159,DK +3262428160,3262428671,CH +3262428672,3262429183,PL +3262429184,3262429695,ES +3262429696,3262430207,DE +3262430208,3262430719,EE +3262431232,3262431743,PL +3262431744,3262432255,UA +3262432256,3262432767,CH +3262432768,3262433279,GB +3262433280,3262433791,RO +3262433792,3262434303,FR +3262434304,3262434815,SI +3262434816,3262435839,DE +3262435840,3262436351,CH +3262436352,3262436863,SE +3262437888,3262438399,FR +3262438400,3262438911,NL +3262438912,3262439423,DK +3262439424,3262439935,AT +3262439936,3262440447,IL +3262440960,3262441471,IL +3262441472,3262441983,UA +3262441984,3262442495,DE +3262443008,3262443519,UA +3262443520,3262444031,ES +3262444032,3262444543,AT +3262444544,3262445055,GB +3262445056,3262445567,RO +3262446592,3262447103,PL +3262447104,3262447615,GB +3262447616,3262460415,PT +3262460544,3262460671,RU +3262460672,3262460927,AE +3262460928,3262461055,CY +3262461056,3262461183,DK +3262461312,3262461439,NO +3262461440,3262461567,DE +3262461568,3262461695,GB +3262461824,3262461951,RO +3262461952,3262463999,IQ +3262464000,3262472191,RU +3262472192,3262472207,DE +3262472208,3262472211,FR +3262472212,3262472215,DE +3262472216,3262472219,NL +3262472220,3262472223,AT +3262472224,3262472231,DE +3262472232,3262472235,AT +3262472236,3262472247,DE +3262472248,3262472251,IT +3262472252,3262472275,DE +3262472276,3262472279,BE +3262472280,3262472307,DE +3262472308,3262472311,ES +3262472312,3262472315,NL +3262472316,3262472351,DE +3262472352,3262472355,NL +3262472356,3262472363,DE +3262472364,3262472367,GB +3262472368,3262472371,NL +3262472372,3262472375,FR +3262472376,3262472379,GB +3262472380,3262472387,DE +3262472388,3262472391,FR +3262472392,3262472395,GB +3262472396,3262472399,DE +3262472400,3262472403,NL +3262472404,3262472415,DE +3262472416,3262472419,ES +3262472420,3262472423,DE +3262472424,3262472427,BE +3262472428,3262472459,DE +3262472460,3262472463,CH +3262472464,3262472479,DE +3262472480,3262472483,IT +3262472484,3262472495,DE +3262472496,3262472499,CH +3262472500,3262472511,DE +3262472512,3262472515,CA +3262472516,3262472519,GB +3262472520,3262472527,DE +3262472528,3262472531,CH +3262472532,3262472547,DE +3262472548,3262472551,NL +3262472552,3262472563,DE +3262472564,3262472567,DK +3262472568,3262472575,DE +3262472576,3262472579,CA +3262472580,3262472583,AT +3262472584,3262472591,US +3262472592,3262472603,DE +3262472604,3262472607,CH +3262472608,3262472615,US +3262472616,3262472631,DE +3262472632,3262472635,ES +3262472636,3262472655,DE +3262472656,3262472659,GB +3262472660,3262472679,DE +3262472680,3262472683,CL +3262472684,3262472687,US +3262472688,3262472695,DE +3262472696,3262472699,IT +3262472700,3262472703,AT +3262472704,3262472715,DE +3262472716,3262472727,NL +3262472728,3262472735,DE +3262472736,3262472739,IT +3262472740,3262472747,DE +3262472748,3262472751,GB +3262472752,3262472763,DE +3262472764,3262472767,CA +3262472768,3262472771,DE +3262472772,3262472775,US +3262472776,3262472779,DE +3262472780,3262472783,US +3262472784,3262472791,DE +3262472792,3262472795,GB +3262472796,3262472799,AT +3262472800,3262472819,DE +3262472820,3262472823,CH +3262472824,3262472835,DE +3262472836,3262472839,DK +3262472840,3262472843,DE +3262472844,3262472847,AT +3262472848,3262472851,DE +3262472852,3262472855,IT +3262472856,3262472859,FR +3262472860,3262472863,US +3262472864,3262472867,FR +3262472868,3262472871,GB +3262472872,3262472875,DE +3262472876,3262472879,FR +3262472880,3262472883,DE +3262472884,3262472887,CA +3262472888,3262472899,DE +3262472900,3262472903,AT +3262472904,3262472927,DE +3262472928,3262472931,NL +3262472932,3262472939,DE +3262472940,3262472943,CH +3262472944,3262472947,DE +3262472948,3262472951,LU +3262472952,3262472963,DE +3262472964,3262472967,AT +3262472968,3262472979,DE +3262472980,3262472983,AT +3262472984,3262472995,DE +3262472996,3262472999,FR +3262473000,3262473039,DE +3262473040,3262473043,GB +3262473044,3262473051,DE +3262473052,3262473055,AT +3262473056,3262473075,DE +3262473076,3262473079,GB +3262473080,3262473083,DE +3262473084,3262473087,US +3262473088,3262473091,NL +3262473092,3262473111,DE +3262473112,3262473115,ES +3262473116,3262473155,DE +3262473156,3262473159,IT +3262473160,3262473163,NL +3262473164,3262473167,CH +3262473168,3262473199,DE +3262473200,3262473203,ES +3262473204,3262473211,DE +3262473212,3262473215,FR +3262473216,3262473231,DE +3262473232,3262473239,JP +3262473240,3262473243,DE +3262473244,3262473247,JP +3262473248,3262473251,DE +3262473252,3262473255,JP +3262473256,3262473271,DE +3262473272,3262473283,JP +3262473284,3262473295,DE +3262473296,3262473299,JP +3262473300,3262473303,DE +3262473304,3262473315,JP +3262473316,3262473319,DE +3262473320,3262473323,JP +3262473324,3262473339,DE +3262473340,3262473347,JP +3262473348,3262473355,DE +3262473356,3262473371,JP +3262473372,3262473379,DE +3262473380,3262473383,JP +3262473384,3262473403,DE +3262473404,3262473415,JP +3262473416,3262473439,DE +3262473440,3262473443,JP +3262473444,3262473459,DE +3262473460,3262473467,JP +3262473468,3262473475,DE +3262473476,3262473476,US +3262473477,3262473482,DE +3262473483,3262473483,US +3262473484,3262473490,DE +3262473491,3262473491,US +3262473492,3262473492,DE +3262473493,3262473493,US +3262473494,3262473496,DE +3262473497,3262473497,US +3262473498,3262473499,DE +3262473500,3262473500,US +3262473501,3262473501,DE +3262473502,3262473502,US +3262473503,3262473503,DE +3262473504,3262473504,US +3262473505,3262473505,DE +3262473506,3262473506,US +3262473507,3262473511,DE +3262473512,3262473512,US +3262473513,3262473515,DE +3262473516,3262473516,US +3262473517,3262473517,CN +3262473518,3262473519,DE +3262473520,3262473523,US +3262473524,3262473527,DE +3262473528,3262473528,US +3262473529,3262473529,DE +3262473530,3262473532,US +3262473533,3262473535,DE +3262473536,3262473536,US +3262473537,3262473537,DE +3262473538,3262473538,US +3262473539,3262473544,DE +3262473545,3262473545,US +3262473546,3262473548,DE +3262473549,3262473549,CA +3262473550,3262473550,US +3262473551,3262473552,DE +3262473553,3262473554,US +3262473555,3262473560,DE +3262473561,3262473562,US +3262473563,3262473566,DE +3262473567,3262473567,US +3262473568,3262473572,DE +3262473573,3262473573,US +3262473574,3262473579,DE +3262473580,3262473581,US +3262473582,3262473587,DE +3262473588,3262473588,US +3262473589,3262473594,DE +3262473595,3262473595,US +3262473596,3262473596,DE +3262473597,3262473597,US +3262473598,3262473603,DE +3262473604,3262473604,US +3262473605,3262473607,DE +3262473608,3262473608,US +3262473609,3262473617,DE +3262473618,3262473618,US +3262473619,3262473628,DE +3262473629,3262473629,US +3262473630,3262473633,DE +3262473634,3262473634,US +3262473635,3262473643,DE +3262473644,3262473644,US +3262473645,3262473646,DE +3262473647,3262473647,US +3262473648,3262473651,DE +3262473652,3262473652,US +3262473653,3262473653,DE +3262473654,3262473654,US +3262473655,3262473659,DE +3262473660,3262473661,US +3262473662,3262473665,DE +3262473666,3262473667,US +3262473668,3262473669,DE +3262473670,3262473671,US +3262473672,3262473675,DE +3262473676,3262473677,US +3262473678,3262473680,DE +3262473681,3262473681,US +3262473682,3262473683,DE +3262473684,3262473686,US +3262473687,3262473691,DE +3262473692,3262473692,CA +3262473693,3262473731,DE +3262473732,3262473733,US +3262473734,3262473736,DE +3262473737,3262473737,US +3262473738,3262473742,DE +3262473743,3262473743,US +3262473744,3262473752,DE +3262473753,3262473753,US +3262473754,3262473754,DE +3262473755,3262473755,US +3262473756,3262473758,DE +3262473759,3262473759,US +3262473760,3262473765,DE +3262473766,3262473766,US +3262473767,3262473777,DE +3262473778,3262473778,US +3262473779,3262473780,DE +3262473781,3262473782,US +3262473783,3262473855,DE +3262473856,3262473859,US +3262473860,3262473903,DE +3262473904,3262473907,US +3262473908,3262473931,DE +3262473932,3262473935,US +3262473936,3262473963,DE +3262473964,3262473967,US +3262473968,3262473971,DE +3262473972,3262473975,US +3262473976,3262473985,DE +3262473986,3262473986,TW +3262473987,3262473987,DE +3262473988,3262473988,SG +3262473989,3262473989,IN +3262473990,3262473990,SG +3262473991,3262473991,DE +3262473992,3262473992,SG +3262473993,3262473993,IN +3262473994,3262473995,TW +3262473996,3262473996,MY +3262473997,3262473997,ID +3262473998,3262473998,DE +3262473999,3262473999,TW +3262474000,3262474000,SG +3262474001,3262474001,TW +3262474002,3262474002,DE +3262474003,3262474003,TW +3262474004,3262474004,SG +3262474005,3262474005,TW +3262474006,3262474007,SG +3262474008,3262474009,TW +3262474010,3262474010,SG +3262474011,3262474011,DE +3262474012,3262474013,SG +3262474014,3262474014,HK +3262474015,3262474016,SG +3262474017,3262474018,MY +3262474019,3262474024,SG +3262474025,3262474025,DE +3262474026,3262474026,SG +3262474027,3262474027,CN +3262474028,3262474030,SG +3262474031,3262474031,IN +3262474032,3262474032,MY +3262474033,3262474033,SG +3262474034,3262474034,MY +3262474035,3262474035,SG +3262474036,3262474036,MY +3262474037,3262474037,SG +3262474038,3262474038,MY +3262474039,3262474039,TW +3262474040,3262474041,MY +3262474042,3262474042,DE +3262474043,3262474043,SG +3262474044,3262474044,DE +3262474045,3262474047,SG +3262474048,3262474048,DE +3262474049,3262474049,IN +3262474050,3262474051,SG +3262474052,3262474052,DE +3262474053,3262474061,SG +3262474062,3262474063,CN +3262474064,3262474064,TW +3262474065,3262474065,IN +3262474066,3262474066,SG +3262474067,3262474067,MY +3262474068,3262474068,SG +3262474069,3262474069,MY +3262474070,3262474070,SG +3262474071,3262474071,TW +3262474072,3262474072,IN +3262474073,3262474075,SG +3262474076,3262474076,MY +3262474077,3262474077,SG +3262474078,3262474078,IN +3262474079,3262474080,DE +3262474081,3262474083,SG +3262474084,3262474084,DE +3262474085,3262474085,SG +3262474086,3262474086,DE +3262474087,3262474087,SG +3262474088,3262474088,MY +3262474089,3262474089,SG +3262474090,3262474091,MY +3262474092,3262474094,SG +3262474095,3262474095,HK +3262474096,3262474097,SG +3262474098,3262474098,MY +3262474099,3262474100,SG +3262474101,3262474101,DE +3262474102,3262474102,SG +3262474103,3262474103,MY +3262474104,3262474104,CN +3262474105,3262474105,DE +3262474106,3262474106,MY +3262474107,3262474107,CN +3262474108,3262474108,HK +3262474109,3262474110,MY +3262474111,3262474111,TH +3262474112,3262474112,SG +3262474113,3262474113,PH +3262474114,3262474114,IN +3262474115,3262474115,SG +3262474116,3262474117,DE +3262474118,3262474118,TH +3262474119,3262474119,TW +3262474120,3262474121,DE +3262474122,3262474122,SG +3262474123,3262474125,MY +3262474126,3262474126,IN +3262474127,3262474127,SG +3262474128,3262474128,DE +3262474129,3262474130,MY +3262474131,3262474131,IN +3262474132,3262474133,DE +3262474134,3262474134,CN +3262474135,3262474136,SG +3262474137,3262474138,DE +3262474139,3262474139,CN +3262474140,3262474140,TW +3262474141,3262474142,SG +3262474143,3262474143,PH +3262474144,3262474150,SG +3262474151,3262474151,MY +3262474152,3262474152,SG +3262474153,3262474156,DE +3262474157,3262474157,SG +3262474158,3262474159,MY +3262474160,3262474161,DE +3262474162,3262474162,SG +3262474163,3262474163,MY +3262474164,3262474164,IN +3262474165,3262474165,CN +3262474166,3262474166,SG +3262474167,3262474167,HK +3262474168,3262474168,TW +3262474169,3262474169,DE +3262474170,3262474170,SG +3262474171,3262474171,DE +3262474172,3262474172,SG +3262474173,3262474173,DE +3262474174,3262474174,TW +3262474175,3262474175,SG +3262474176,3262474176,MY +3262474177,3262474177,DE +3262474178,3262474178,TW +3262474179,3262474179,CN +3262474180,3262474180,MY +3262474181,3262474181,SG +3262474182,3262474182,MY +3262474183,3262474183,SG +3262474184,3262474184,DE +3262474185,3262474185,SG +3262474186,3262474186,MY +3262474187,3262474187,SG +3262474188,3262474188,MY +3262474189,3262474189,SG +3262474190,3262474190,CN +3262474191,3262474192,SG +3262474193,3262474193,DE +3262474194,3262474194,SG +3262474195,3262474195,MY +3262474196,3262474197,DE +3262474198,3262474198,SG +3262474199,3262474199,CN +3262474200,3262474200,DE +3262474201,3262474201,SG +3262474202,3262474203,CN +3262474204,3262474204,IN +3262474205,3262474205,SG +3262474206,3262474206,DE +3262474207,3262474207,MY +3262474208,3262474208,SG +3262474209,3262474211,DE +3262474212,3262474212,MY +3262474213,3262474213,SG +3262474214,3262474214,CN +3262474215,3262474215,DE +3262474216,3262474216,SG +3262474217,3262474217,DE +3262474218,3262474218,SG +3262474219,3262474219,MY +3262474220,3262474220,IN +3262474221,3262474221,DE +3262474222,3262474222,IN +3262474223,3262474223,SG +3262474224,3262474224,MY +3262474225,3262474225,SG +3262474226,3262474226,MY +3262474227,3262474227,DE +3262474228,3262474228,SG +3262474229,3262474230,DE +3262474231,3262474231,SG +3262474232,3262474232,DE +3262474233,3262474233,IN +3262474234,3262474234,DE +3262474235,3262474236,MY +3262474237,3262474237,DE +3262474238,3262474238,SG +3262474239,3262474475,DE +3262474476,3262474479,AU +3262474480,3262474631,DE +3262474632,3262474635,DK +3262474636,3262474795,DE +3262474796,3262474799,JP +3262474800,3262474807,DE +3262474808,3262474815,JP +3262474816,3262474899,DE +3262474900,3262474907,JP +3262474908,3262474911,DE +3262474912,3262474915,JP +3262474916,3262474919,DE +3262474920,3262474935,JP +3262474936,3262474939,DE +3262474940,3262474947,JP +3262474948,3262474951,DE +3262474952,3262474959,JP +3262474960,3262474963,DE +3262474964,3262474971,JP +3262474972,3262474975,DE +3262474976,3262474987,JP +3262474988,3262474991,DE +3262474992,3262475003,JP +3262475004,3262475013,DE +3262475014,3262475014,US +3262475015,3262475020,DE +3262475021,3262475021,US +3262475022,3262475023,DE +3262475024,3262475024,CO +3262475025,3262475027,DE +3262475028,3262475028,US +3262475029,3262475034,DE +3262475035,3262475035,US +3262475036,3262475060,DE +3262475061,3262475061,US +3262475062,3262475068,DE +3262475069,3262475069,US +3262475070,3262475070,DE +3262475071,3262475071,US +3262475072,3262475072,DE +3262475073,3262475074,BR +3262475075,3262475075,DE +3262475076,3262475076,US +3262475077,3262475081,DE +3262475082,3262475082,BR +3262475083,3262475085,DE +3262475086,3262475086,US +3262475087,3262475089,DE +3262475090,3262475090,US +3262475091,3262475092,DE +3262475093,3262475094,BR +3262475095,3262475096,DE +3262475097,3262475098,US +3262475099,3262475100,DE +3262475101,3262475102,US +3262475103,3262475104,DE +3262475105,3262475105,US +3262475106,3262475110,DE +3262475111,3262475112,US +3262475113,3262475113,DE +3262475114,3262475115,US +3262475116,3262475119,DE +3262475120,3262475121,US +3262475122,3262475122,DE +3262475123,3262475123,US +3262475124,3262475125,DE +3262475126,3262475128,US +3262475129,3262475131,DE +3262475132,3262475132,US +3262475133,3262475134,DE +3262475135,3262475135,US +3262475136,3262475136,DE +3262475137,3262475138,US +3262475139,3262475141,DE +3262475142,3262475142,US +3262475143,3262475144,DE +3262475145,3262475152,US +3262475153,3262475155,DE +3262475156,3262475156,US +3262475157,3262475166,DE +3262475167,3262475167,US +3262475168,3262475172,DE +3262475173,3262475174,US +3262475175,3262475175,DE +3262475176,3262475176,US +3262475177,3262475177,DE +3262475178,3262475178,US +3262475179,3262475181,DE +3262475182,3262475185,US +3262475186,3262475186,DE +3262475187,3262475188,US +3262475189,3262475190,DE +3262475191,3262475191,BR +3262475192,3262475192,MX +3262475193,3262475193,US +3262475194,3262475195,DE +3262475196,3262475197,US +3262475198,3262475199,DE +3262475200,3262475200,US +3262475201,3262475202,DE +3262475203,3262475203,BR +3262475204,3262475204,DE +3262475205,3262475205,BR +3262475206,3262475206,DE +3262475207,3262475207,US +3262475208,3262475208,DE +3262475209,3262475209,US +3262475210,3262475211,DE +3262475212,3262475212,US +3262475213,3262475215,DE +3262475216,3262475216,US +3262475217,3262475218,DE +3262475219,3262475219,US +3262475220,3262475220,DE +3262475221,3262475221,US +3262475222,3262475271,DE +3262475272,3262475275,IT +3262475276,3262475279,US +3262475280,3262475283,DE +3262475284,3262475287,NL +3262475288,3262475295,DE +3262475296,3262475303,NL +3262475304,3262475307,DE +3262475308,3262475311,AR +3262475312,3262475315,FR +3262475316,3262475359,DE +3262475360,3262475363,IT +3262475364,3262475371,DE +3262475372,3262475375,NL +3262475376,3262475383,DE +3262475384,3262475387,US +3262475388,3262475391,DE +3262475392,3262475395,AT +3262475396,3262475399,NL +3262475400,3262475403,US +3262475404,3262475415,DE +3262475416,3262475419,CH +3262475420,3262475427,DE +3262475428,3262475431,ES +3262475432,3262475435,IT +3262475436,3262475443,DE +3262475444,3262475447,US +3262475448,3262475451,FR +3262475452,3262475479,DE +3262475480,3262475483,US +3262475484,3262475487,IT +3262475488,3262475491,DE +3262475492,3262475495,CH +3262475496,3262475499,NL +3262475500,3262475503,DE +3262475504,3262475507,FR +3262475508,3262475523,DE +3262475524,3262475527,US +3262475528,3262475531,DE +3262475532,3262475535,US +3262475536,3262475543,DE +3262475544,3262475559,US +3262475560,3262475579,DE +3262475580,3262475583,US +3262475584,3262475587,DE +3262475588,3262475591,US +3262475592,3262475595,DE +3262475596,3262475607,US +3262475608,3262475631,DE +3262475632,3262475635,US +3262475636,3262475643,DE +3262475644,3262475651,US +3262475652,3262475655,DE +3262475656,3262475671,US +3262475672,3262475691,DE +3262475692,3262475695,BR +3262475696,3262475699,US +3262475700,3262475711,DE +3262475712,3262475715,US +3262475716,3262475723,DE +3262475724,3262475727,US +3262475728,3262475735,DE +3262475736,3262475743,US +3262475744,3262475751,DE +3262475752,3262475763,US +3262475764,3262475767,DE +3262475768,3262475771,US +3262475772,3262475783,DE +3262475784,3262475787,BE +3262475788,3262475791,DE +3262475792,3262475807,AE +3262475808,3262475811,US +3262475812,3262475815,IE +3262475816,3262475819,FR +3262475820,3262475823,DE +3262475824,3262475839,RO +3262475840,3262475855,DE +3262475856,3262475871,TR +3262475872,3262475875,BE +3262475876,3262475879,NL +3262475880,3262475883,PL +3262475884,3262475887,BE +3262475888,3262475891,DE +3262475892,3262475895,SA +3262475896,3262475903,CY +3262475904,3262475919,GR +3262475920,3262475935,DE +3262475936,3262475951,FR +3262475952,3262475963,US +3262475964,3262475967,HU +3262475968,3262475975,DE +3262475976,3262475983,BG +3262475984,3262475991,SG +3262475992,3262476015,DE +3262476016,3262476019,ES +3262476020,3262476023,FR +3262476024,3262476027,DE +3262476028,3262476031,FR +3262476032,3262476047,DE +3262476048,3262476055,IL +3262476056,3262476087,DE +3262476088,3262476091,DK +3262476092,3262476095,NL +3262476096,3262476099,US +3262476100,3262476107,DE +3262476108,3262476111,BE +3262476112,3262476119,DE +3262476120,3262476123,FR +3262476124,3262476139,DE +3262476140,3262476143,BE +3262476144,3262476147,CH +3262476148,3262476151,DE +3262476152,3262476155,US +3262476156,3262476159,BE +3262476160,3262476163,GR +3262476164,3262476171,DE +3262476172,3262476175,GB +3262476176,3262476179,ES +3262476180,3262476183,DE +3262476184,3262476187,AT +3262476188,3262476195,DE +3262476196,3262476199,US +3262476200,3262476203,GB +3262476204,3262476211,DE +3262476212,3262476215,CL +3262476216,3262476223,FR +3262476224,3262476227,DE +3262476228,3262476231,SE +3262476232,3262476235,DE +3262476236,3262476239,US +3262476240,3262476243,IT +3262476244,3262476247,ES +3262476248,3262476251,NL +3262476252,3262476255,DE +3262476256,3262476259,US +3262476260,3262476275,DE +3262476276,3262476279,CA +3262476280,3262476283,BE +3262476284,3262476291,DE +3262476292,3262476295,ZA +3262476296,3262476299,DE +3262476300,3262476303,DO +3262476304,3262476315,DE +3262476316,3262476319,BE +3262476320,3262476323,DE +3262476324,3262476327,IT +3262476328,3262476331,NL +3262476332,3262476339,DE +3262476340,3262476343,ES +3262476344,3262476351,DE +3262476352,3262476355,AR +3262476356,3262476359,DE +3262476360,3262476363,US +3262476364,3262476367,DE +3262476368,3262476371,US +3262476372,3262476375,DE +3262476376,3262476379,US +3262476380,3262476383,DE +3262476384,3262476387,US +3262476388,3262476395,DE +3262476396,3262476399,AT +3262476400,3262476423,DE +3262476424,3262476427,ES +3262476428,3262476431,US +3262476432,3262476435,IT +3262476436,3262476439,AT +3262476440,3262476459,DE +3262476460,3262476463,DK +3262476464,3262476471,DE +3262476472,3262476475,CA +3262476476,3262476479,US +3262476480,3262476491,DE +3262476492,3262476495,BE +3262476496,3262476503,DE +3262476504,3262476507,CH +3262476508,3262476519,DE +3262476520,3262476523,GB +3262476524,3262476527,MX +3262476528,3262476531,DE +3262476532,3262476535,IL +3262476536,3262476539,US +3262476540,3262476543,DE +3262476544,3262476547,DK +3262476548,3262476551,DE +3262476552,3262476555,IT +3262476556,3262476559,FR +3262476560,3262476579,DE +3262476580,3262476587,US +3262476588,3262476591,ES +3262476592,3262476595,GB +3262476596,3262476603,DE +3262476604,3262476607,NL +3262476608,3262476619,DE +3262476620,3262476623,NL +3262476624,3262476635,DE +3262476636,3262476639,DK +3262476640,3262476651,DE +3262476652,3262476655,FR +3262476656,3262476663,US +3262476664,3262476667,DE +3262476668,3262476671,GB +3262476672,3262476675,SE +3262476676,3262476679,DE +3262476680,3262476683,NL +3262476684,3262476687,IT +3262476688,3262476691,DE +3262476692,3262476695,FR +3262476696,3262476707,DE +3262476708,3262476711,US +3262476712,3262476719,DE +3262476720,3262476723,IT +3262476724,3262476727,FR +3262476728,3262476735,DE +3262476736,3262476739,CA +3262476740,3262476743,DE +3262476744,3262476747,CH +3262476748,3262476751,BE +3262476752,3262476771,DE +3262476772,3262476775,US +3262476776,3262476783,DE +3262476784,3262476787,IT +3262476788,3262476791,US +3262476792,3262476795,ES +3262476796,3262476827,DE +3262476828,3262476831,LU +3262476832,3262476855,DE +3262476856,3262476859,ES +3262476860,3262476883,DE +3262476884,3262476887,FR +3262476888,3262476899,DE +3262476900,3262476903,FR +3262476904,3262476911,DE +3262476912,3262476915,CH +3262476916,3262476935,DE +3262476936,3262476939,AT +3262476940,3262476951,DE +3262476952,3262476955,NL +3262476956,3262476975,DE +3262476976,3262476979,BE +3262476980,3262476995,DE +3262476996,3262476999,IT +3262477000,3262477015,DE +3262477016,3262477019,CH +3262477020,3262477027,DE +3262477028,3262477035,FR +3262477036,3262477039,DK +3262477040,3262477043,US +3262477044,3262477083,DE +3262477084,3262477087,NL +3262477088,3262477091,DE +3262477092,3262477095,BE +3262477096,3262477151,DE +3262477152,3262477155,CH +3262477156,3262477159,ES +3262477160,3262477163,US +3262477164,3262477167,DE +3262477168,3262477171,NL +3262477172,3262477183,DE +3262477184,3262477187,US +3262477188,3262477191,DE +3262477192,3262477195,GB +3262477196,3262477199,PL +3262477200,3262477203,GB +3262477204,3262477211,DE +3262477212,3262477215,AT +3262477216,3262477223,DE +3262477224,3262477227,BE +3262477228,3262477231,GB +3262477232,3262477239,DE +3262477240,3262477243,CA +3262477244,3262477247,US +3262477248,3262477251,DE +3262477252,3262477255,ES +3262477256,3262477259,DE +3262477260,3262477263,GB +3262477264,3262477267,DE +3262477268,3262477271,NL +3262477272,3262477275,US +3262477276,3262477279,NL +3262477280,3262477283,DE +3262477284,3262477287,FR +3262477288,3262477291,BM +3262477292,3262477299,DE +3262477300,3262477303,IT +3262477304,3262477311,DE +3262477312,3262477315,ES +3262477316,3262477319,DE +3262477320,3262477327,US +3262477328,3262477331,HU +3262477332,3262477335,DE +3262477336,3262477339,CA +3262477340,3262477343,DE +3262477344,3262477347,CH +3262477348,3262477359,DE +3262477360,3262477363,LU +3262477364,3262477367,DE +3262477368,3262477371,US +3262477372,3262477375,FR +3262477376,3262477379,AT +3262477380,3262477383,US +3262477384,3262477387,FR +3262477388,3262477407,DE +3262477408,3262477411,US +3262477412,3262477443,DE +3262477444,3262477447,BE +3262477448,3262477451,AR +3262477452,3262477467,DE +3262477468,3262477471,AT +3262477472,3262477475,DE +3262477476,3262477479,FR +3262477480,3262477483,DE +3262477484,3262477487,NL +3262477488,3262477503,DE +3262477504,3262477507,FR +3262477508,3262477511,CH +3262477512,3262477515,US +3262477516,3262477523,DE +3262477524,3262477527,IT +3262477528,3262477563,DE +3262477564,3262477571,BE +3262477572,3262477575,NL +3262477576,3262477579,DE +3262477580,3262477583,NO +3262477584,3262477587,DE +3262477588,3262477591,FR +3262477592,3262477595,GB +3262477596,3262477599,CH +3262477600,3262477623,DE +3262477624,3262477627,FR +3262477628,3262477631,CH +3262477632,3262477659,DE +3262477660,3262477667,US +3262477668,3262477671,DE +3262477672,3262477675,NL +3262477676,3262477695,DE +3262477696,3262477699,NL +3262477700,3262477703,DE +3262477704,3262477707,IT +3262477708,3262477711,GB +3262477712,3262477727,DE +3262477728,3262477731,AT +3262477732,3262477739,DE +3262477740,3262477743,NL +3262477744,3262477751,CH +3262477752,3262477763,DE +3262477764,3262477767,VE +3262477768,3262477771,DE +3262477772,3262477775,CA +3262477776,3262477779,DE +3262477780,3262477783,GB +3262477784,3262477791,DE +3262477792,3262477795,GB +3262477796,3262477799,FR +3262477800,3262477803,DE +3262477804,3262477807,CH +3262477808,3262477811,CA +3262477812,3262477823,DE +3262477824,3262477827,GB +3262477828,3262477831,US +3262477832,3262477835,DE +3262477836,3262477839,ES +3262477840,3262477843,GB +3262477844,3262477847,DE +3262477848,3262477851,GB +3262477852,3262477867,DE +3262477868,3262477871,HU +3262477872,3262477907,DE +3262477908,3262477911,CH +3262477912,3262477915,US +3262477916,3262477931,DE +3262477932,3262477935,US +3262477936,3262477939,DE +3262477940,3262477943,CA +3262477944,3262477955,DE +3262477956,3262477959,US +3262477960,3262477987,DE +3262477988,3262477991,NL +3262477992,3262478007,DE +3262478008,3262478011,IT +3262478012,3262478015,DE +3262478016,3262478019,CH +3262478020,3262478031,DE +3262478032,3262478035,AT +3262478036,3262478039,DE +3262478040,3262478043,NL +3262478044,3262478211,DE +3262478212,3262478215,NL +3262478216,3262478219,FR +3262478220,3262478223,SE +3262478224,3262478227,GB +3262478228,3262478239,DE +3262478240,3262478243,FR +3262478244,3262478247,DE +3262478248,3262478251,IT +3262478252,3262478255,CH +3262478256,3262478263,DE +3262478264,3262478267,IT +3262478268,3262478271,ES +3262478272,3262478299,DE +3262478300,3262478303,ES +3262478304,3262478307,PT +3262478308,3262478311,ES +3262478312,3262478319,DE +3262478320,3262478323,GB +3262478324,3262478327,DE +3262478328,3262478331,ES +3262478332,3262478335,GB +3262478336,3262478418,DE +3262478419,3262478419,FR +3262478420,3262478563,DE +3262478564,3262478564,RU +3262478565,3262478851,DE +3262478852,3262478852,CH +3262478853,3262478855,DE +3262478856,3262478856,FR +3262478857,3262478857,LI +3262478858,3262478862,DE +3262478863,3262478863,AT +3262478864,3262478865,DE +3262478866,3262478866,CH +3262478867,3262478867,GB +3262478868,3262478868,IT +3262478869,3262478870,FR +3262478871,3262478872,DE +3262478873,3262478873,NL +3262478874,3262478874,AT +3262478875,3262478877,DE +3262478878,3262478878,AT +3262478879,3262478881,DE +3262478882,3262478882,GR +3262478883,3262478887,DE +3262478888,3262478888,DK +3262478889,3262478890,FR +3262478891,3262478893,DE +3262478894,3262478894,AT +3262478895,3262478895,DE +3262478896,3262478896,NL +3262478897,3262478897,FR +3262478898,3262478898,DE +3262478899,3262478899,SE +3262478900,3262478900,GB +3262478901,3262478901,DE +3262478902,3262478902,IT +3262478903,3262478904,DE +3262478905,3262478905,SE +3262478906,3262478910,DE +3262478911,3262478911,BH +3262478912,3262478912,NL +3262478913,3262478913,FR +3262478914,3262478914,DE +3262478915,3262478915,NL +3262478916,3262478920,DE +3262478921,3262478921,AT +3262478922,3262478924,DE +3262478925,3262478925,NL +3262478926,3262478926,AT +3262478927,3262478935,DE +3262478936,3262478937,CH +3262478938,3262478938,NL +3262478939,3262478939,GB +3262478940,3262478940,NL +3262478941,3262478941,DE +3262478942,3262478942,BE +3262478943,3262478947,DE +3262478948,3262478948,IT +3262478949,3262478954,DE +3262478955,3262478955,FR +3262478956,3262478956,DE +3262478957,3262478957,PT +3262478958,3262478958,SE +3262478959,3262478960,DE +3262478961,3262478961,NL +3262478962,3262478966,DE +3262478967,3262478967,NL +3262478968,3262478968,ES +3262478969,3262478969,DE +3262478970,3262478970,BE +3262478971,3262478971,DE +3262478972,3262478972,NO +3262478973,3262478973,CH +3262478974,3262478974,GB +3262478975,3262478983,DE +3262478984,3262478984,CH +3262478985,3262478985,PT +3262478986,3262478986,DE +3262478987,3262478987,GB +3262478988,3262478988,IE +3262478989,3262478989,NL +3262478990,3262478990,DE +3262478991,3262478992,FR +3262478993,3262478993,NL +3262478994,3262478997,DE +3262478998,3262478998,GB +3262478999,3262478999,AT +3262479000,3262479000,DE +3262479001,3262479001,AT +3262479002,3262479002,DE +3262479003,3262479003,FR +3262479004,3262479007,DE +3262479008,3262479008,NL +3262479009,3262479009,DE +3262479010,3262479011,NL +3262479012,3262479012,DE +3262479013,3262479013,NL +3262479014,3262479014,DE +3262479015,3262479015,CH +3262479016,3262479016,SE +3262479017,3262479017,DK +3262479018,3262479018,IT +3262479019,3262479019,DE +3262479020,3262479022,CH +3262479023,3262479024,DE +3262479025,3262479025,NL +3262479026,3262479027,DE +3262479028,3262479028,CH +3262479029,3262479029,DE +3262479030,3262479030,ES +3262479031,3262479031,AT +3262479032,3262479036,DE +3262479037,3262479037,AT +3262479038,3262479038,DK +3262479039,3262479039,DE +3262479040,3262479040,NL +3262479041,3262479041,CH +3262479042,3262479042,DK +3262479043,3262479043,FR +3262479044,3262479047,DE +3262479048,3262479048,NL +3262479049,3262479050,DE +3262479051,3262479051,GB +3262479052,3262479052,DE +3262479053,3262479053,NL +3262479054,3262479056,DE +3262479057,3262479057,GB +3262479058,3262479058,FR +3262479059,3262479063,DE +3262479064,3262479064,FR +3262479065,3262479065,DE +3262479066,3262479066,IT +3262479067,3262479067,DE +3262479068,3262479068,ES +3262479069,3262479069,FR +3262479070,3262479070,ES +3262479071,3262479075,DE +3262479076,3262479076,BE +3262479077,3262479078,DE +3262479079,3262479079,ES +3262479080,3262479080,DE +3262479081,3262479081,CH +3262479082,3262479082,IT +3262479083,3262479083,NL +3262479084,3262479084,CH +3262479085,3262479085,DE +3262479086,3262479086,FR +3262479087,3262479088,DE +3262479089,3262479089,CH +3262479090,3262479090,FR +3262479091,3262479091,DE +3262479092,3262479092,IT +3262479093,3262479093,FR +3262479094,3262479095,GB +3262479096,3262479096,ES +3262479097,3262479097,DE +3262479098,3262479098,GB +3262479099,3262479100,DE +3262479101,3262479101,CH +3262479102,3262479102,IT +3262479103,3262479105,DE +3262479106,3262479106,ES +3262479107,3262479107,DE +3262479108,3262479108,AT +3262479109,3262479110,DE +3262479111,3262479111,LU +3262479112,3262479115,DE +3262479116,3262479116,IT +3262479117,3262479117,DE +3262479118,3262479118,GR +3262479119,3262479121,DE +3262479122,3262479122,FR +3262479123,3262479124,DE +3262479125,3262479125,IL +3262479126,3262479130,DE +3262479131,3262479131,NL +3262479132,3262479132,AT +3262479133,3262479133,NL +3262479134,3262479134,ES +3262479135,3262479139,DE +3262479140,3262479140,NL +3262479141,3262479142,DE +3262479143,3262479143,GB +3262479144,3262479144,CH +3262479145,3262479145,NO +3262479146,3262479146,DE +3262479147,3262479147,IT +3262479148,3262479149,ES +3262479150,3262479151,DE +3262479152,3262479152,NL +3262479153,3262479153,DE +3262479154,3262479154,FR +3262479155,3262479155,NL +3262479156,3262479160,DE +3262479161,3262479161,FR +3262479162,3262479162,DE +3262479163,3262479163,FR +3262479164,3262479164,DE +3262479165,3262479167,CH +3262479168,3262479168,DE +3262479169,3262479169,IT +3262479170,3262479170,CH +3262479171,3262479174,DE +3262479175,3262479175,FR +3262479176,3262479178,DE +3262479179,3262479179,AT +3262479180,3262479180,NL +3262479181,3262479182,DE +3262479183,3262479183,DK +3262479184,3262479184,DE +3262479185,3262479185,IT +3262479186,3262479186,ES +3262479187,3262479187,DE +3262479188,3262479188,CH +3262479189,3262479189,ES +3262479190,3262479191,IT +3262479192,3262479192,FR +3262479193,3262479193,GB +3262479194,3262479199,DE +3262479200,3262479200,NL +3262479201,3262479201,HU +3262479202,3262479202,FR +3262479203,3262479208,DE +3262479209,3262479209,ES +3262479210,3262479212,DE +3262479213,3262479213,NO +3262479214,3262479214,DE +3262479215,3262479215,IT +3262479216,3262479219,DE +3262479220,3262479220,NL +3262479221,3262479226,DE +3262479227,3262479227,NL +3262479228,3262479228,DK +3262479229,3262479233,DE +3262479234,3262479234,GB +3262479235,3262479238,DE +3262479239,3262479239,FR +3262479240,3262479241,DE +3262479242,3262479242,FR +3262479243,3262479243,NL +3262479244,3262479244,IT +3262479245,3262479249,DE +3262479250,3262479250,AT +3262479251,3262479252,DE +3262479253,3262479253,NL +3262479254,3262479254,FR +3262479255,3262479255,DE +3262479256,3262479256,IT +3262479257,3262479257,US +3262479258,3262479261,DE +3262479262,3262479262,CH +3262479263,3262479264,DE +3262479265,3262479265,CH +3262479266,3262479266,FR +3262479267,3262479267,DE +3262479268,3262479268,NL +3262479269,3262479269,DE +3262479270,3262479270,DK +3262479271,3262479271,DE +3262479272,3262479272,IT +3262479273,3262479273,DE +3262479274,3262479274,ES +3262479275,3262479275,IT +3262479276,3262479276,DE +3262479277,3262479277,NL +3262479278,3262479278,DE +3262479279,3262479279,ES +3262479280,3262479280,DE +3262479281,3262479281,FR +3262479282,3262479282,DE +3262479283,3262479283,IT +3262479284,3262479289,DE +3262479290,3262479290,BE +3262479291,3262479293,DE +3262479294,3262479294,FR +3262479295,3262479295,DE +3262479296,3262479296,IT +3262479297,3262479300,DE +3262479301,3262479301,ES +3262479302,3262479303,DE +3262479304,3262479304,AT +3262479305,3262479307,DE +3262479308,3262479308,DK +3262479309,3262479309,SE +3262479310,3262479312,DE +3262479313,3262479313,FR +3262479314,3262479318,DE +3262479319,3262479319,DK +3262479320,3262479324,DE +3262479325,3262479325,ES +3262479326,3262479327,DE +3262479328,3262479328,DK +3262479329,3262479329,ES +3262479330,3262479330,NL +3262479331,3262479332,FR +3262479333,3262479333,HU +3262479334,3262479334,NL +3262479335,3262479335,DE +3262479336,3262479336,FR +3262479337,3262479337,ES +3262479338,3262479338,DE +3262479339,3262479339,NL +3262479340,3262479340,CH +3262479341,3262479342,DE +3262479343,3262479343,NO +3262479344,3262479344,NL +3262479345,3262479345,DE +3262479346,3262479346,DK +3262479347,3262479347,NO +3262479348,3262479350,IT +3262479351,3262479351,DE +3262479352,3262479352,IT +3262479353,3262479355,DE +3262479356,3262479356,CH +3262479357,3262479357,FR +3262479358,3262479361,DE +3262479362,3262479362,PT +3262479363,3262479368,DE +3262479369,3262479369,FR +3262479370,3262479370,CH +3262479371,3262479371,GB +3262479372,3262479372,DE +3262479373,3262479373,IT +3262479374,3262479374,DE +3262479375,3262479375,NL +3262479376,3262479377,FR +3262479378,3262479378,DE +3262479379,3262479379,CH +3262479380,3262479380,AT +3262479381,3262479381,FR +3262479382,3262479385,DE +3262479386,3262479386,NL +3262479387,3262479387,DK +3262479388,3262479389,DE +3262479390,3262479390,DK +3262479391,3262479391,NO +3262479392,3262479393,DE +3262479394,3262479394,FR +3262479395,3262479395,NL +3262479396,3262479396,DE +3262479397,3262479397,IT +3262479398,3262479399,DE +3262479400,3262479400,NL +3262479401,3262479404,DE +3262479405,3262479405,IE +3262479406,3262479406,GB +3262479407,3262479413,DE +3262479414,3262479414,CH +3262479415,3262479415,DE +3262479416,3262479416,DK +3262479417,3262479419,DE +3262479420,3262479420,ES +3262479421,3262479421,DE +3262479422,3262479422,SE +3262479423,3262479426,DE +3262479427,3262479427,IT +3262479428,3262479429,FR +3262479430,3262479430,GB +3262479431,3262479433,DE +3262479434,3262479434,IT +3262479435,3262479437,DE +3262479438,3262479438,IT +3262479439,3262479439,DE +3262479440,3262479440,AT +3262479441,3262479441,DK +3262479442,3262479442,IT +3262479443,3262479443,GR +3262479444,3262479448,DE +3262479449,3262479449,GB +3262479450,3262479452,DE +3262479453,3262479453,CH +3262479454,3262479455,DE +3262479456,3262479456,IT +3262479457,3262479462,DE +3262479463,3262479463,IT +3262479464,3262479464,NL +3262479465,3262479465,DE +3262479466,3262479466,GB +3262479467,3262479470,DE +3262479471,3262479471,GB +3262479472,3262479472,DE +3262479473,3262479473,CH +3262479474,3262479474,BE +3262479475,3262479475,DE +3262479476,3262479476,GB +3262479477,3262479477,BE +3262479478,3262479478,IT +3262479479,3262479481,DE +3262479482,3262479482,IT +3262479483,3262479483,DE +3262479484,3262479484,AT +3262479485,3262479489,DE +3262479490,3262479490,IT +3262479491,3262479494,DE +3262479495,3262479495,BE +3262479496,3262479498,DE +3262479499,3262479499,ES +3262479500,3262479502,IT +3262479503,3262479507,DE +3262479508,3262479508,HU +3262479509,3262479509,FR +3262479510,3262479513,DE +3262479514,3262479514,FR +3262479515,3262479515,ES +3262479516,3262479517,DE +3262479518,3262479518,GB +3262479519,3262479519,GR +3262479520,3262479521,DE +3262479522,3262479522,CH +3262479523,3262479526,DE +3262479527,3262479528,NL +3262479529,3262479529,DE +3262479530,3262479530,BE +3262479531,3262479535,DE +3262479536,3262479536,GB +3262479537,3262479538,DE +3262479539,3262479539,IT +3262479540,3262479540,DE +3262479541,3262479541,CH +3262479542,3262479543,DE +3262479544,3262479544,IT +3262479545,3262479545,BE +3262479546,3262479546,GB +3262479547,3262479547,AT +3262479548,3262479548,DE +3262479549,3262479549,IT +3262479550,3262479552,DE +3262479553,3262479553,IL +3262479554,3262479554,DK +3262479555,3262479555,FR +3262479556,3262479558,DE +3262479559,3262479559,SE +3262479560,3262479560,DE +3262479561,3262479561,BE +3262479562,3262479562,GB +3262479563,3262479563,DE +3262479564,3262479564,GB +3262479565,3262479565,SE +3262479566,3262479566,NL +3262479567,3262479567,CH +3262479568,3262479568,NO +3262479569,3262479575,DE +3262479576,3262479576,NL +3262479577,3262479577,FR +3262479578,3262479578,DE +3262479579,3262479579,ZA +3262479580,3262479580,DE +3262479581,3262479581,IT +3262479582,3262479583,DE +3262479584,3262479584,NL +3262479585,3262479585,DE +3262479586,3262479586,GR +3262479587,3262479588,DE +3262479589,3262479589,IT +3262479590,3262479590,DE +3262479591,3262479591,NL +3262479592,3262479592,DE +3262479593,3262479593,FR +3262479594,3262479594,DE +3262479595,3262479595,FR +3262479596,3262479599,DE +3262479600,3262479600,IT +3262479601,3262479601,DE +3262479602,3262479602,GB +3262479603,3262479604,DE +3262479605,3262479605,SE +3262479606,3262479606,FR +3262479607,3262479607,NL +3262479608,3262479609,DE +3262479610,3262479610,SI +3262479611,3262479611,DE +3262479612,3262479612,ES +3262479613,3262479613,NL +3262479614,3262479617,DE +3262479618,3262479618,NO +3262479619,3262479619,ES +3262479620,3262479620,GB +3262479621,3262479622,DE +3262479623,3262479623,CH +3262479624,3262479624,ES +3262479625,3262479625,NL +3262479626,3262479628,DE +3262479629,3262479629,SI +3262479630,3262479630,NL +3262479631,3262479631,HU +3262479632,3262479632,DE +3262479633,3262479633,LU +3262479634,3262479634,DE +3262479635,3262479636,GB +3262479637,3262479637,ES +3262479638,3262479638,DE +3262479639,3262479639,AT +3262479640,3262479641,DE +3262479642,3262479642,GB +3262479643,3262479643,DE +3262479644,3262479644,NL +3262479645,3262479645,DE +3262479646,3262479646,GB +3262479647,3262479647,DE +3262479648,3262479648,NO +3262479649,3262479653,DE +3262479654,3262479654,ES +3262479655,3262479656,DE +3262479657,3262479657,NL +3262479658,3262479658,DE +3262479659,3262479659,NL +3262479660,3262479660,PT +3262479661,3262479662,FR +3262479663,3262479664,DE +3262479665,3262479665,DK +3262479666,3262479667,DE +3262479668,3262479668,NL +3262479669,3262479669,IT +3262479670,3262479670,DE +3262479671,3262479671,IT +3262479672,3262479673,DE +3262479674,3262479674,BE +3262479675,3262479676,DE +3262479677,3262479677,ES +3262479678,3262479678,IT +3262479679,3262479679,AT +3262479680,3262479680,IT +3262479681,3262479681,DE +3262479682,3262479682,IT +3262479683,3262479683,HU +3262479684,3262479688,DE +3262479689,3262479689,NL +3262479690,3262479690,LU +3262479691,3262479691,DE +3262479692,3262479692,LU +3262479693,3262479693,DE +3262479694,3262479694,CH +3262479695,3262479695,DE +3262479696,3262479696,CH +3262479697,3262479697,GB +3262479698,3262479698,FR +3262479699,3262479699,NL +3262479700,3262479700,DE +3262479701,3262479701,NL +3262479702,3262479702,AT +3262479703,3262479703,FR +3262479704,3262479707,DE +3262479708,3262479708,CH +3262479709,3262479709,NL +3262479710,3262479711,DE +3262479712,3262479712,GB +3262479713,3262479713,DE +3262479714,3262479714,AT +3262479715,3262479716,DE +3262479717,3262479717,BE +3262479718,3262479720,DE +3262479721,3262479721,AT +3262479722,3262479727,DE +3262479728,3262479728,BE +3262479729,3262479729,DE +3262479730,3262479730,ES +3262479731,3262479731,CH +3262479732,3262479732,IT +3262479733,3262479734,DE +3262479735,3262479736,CH +3262479737,3262479737,DE +3262479738,3262479738,AT +3262479739,3262479739,DK +3262479740,3262479740,DE +3262479741,3262479741,NL +3262479742,3262479742,FR +3262479743,3262479745,DE +3262479746,3262479746,GB +3262479747,3262479747,CH +3262479748,3262479748,DE +3262479749,3262479749,FR +3262479750,3262479750,AT +3262479751,3262479753,DE +3262479754,3262479754,FR +3262479755,3262479755,NL +3262479756,3262479756,FR +3262479757,3262479763,DE +3262479764,3262479764,FR +3262479765,3262479765,DE +3262479766,3262479766,CH +3262479767,3262479770,DE +3262479771,3262479771,IT +3262479772,3262479775,DE +3262479776,3262479776,IT +3262479777,3262479777,BE +3262479778,3262479778,NL +3262479779,3262479782,DE +3262479783,3262479783,GB +3262479784,3262479784,AT +3262479785,3262479785,FR +3262479786,3262479786,CH +3262479787,3262479788,DE +3262479789,3262479789,IT +3262479790,3262479790,DE +3262479791,3262479791,IT +3262479792,3262479793,DE +3262479794,3262479794,FR +3262479795,3262479795,CH +3262479796,3262479797,DE +3262479798,3262479799,GB +3262479800,3262479808,DE +3262479809,3262479809,FR +3262479810,3262479816,DE +3262479817,3262479817,HU +3262479818,3262479818,DE +3262479819,3262479819,NL +3262479820,3262479820,DE +3262479821,3262479822,NL +3262479823,3262479823,ES +3262479824,3262479824,GB +3262479825,3262479825,DE +3262479826,3262479826,BE +3262479827,3262479828,DE +3262479829,3262479829,CH +3262479830,3262479832,DE +3262479833,3262479833,ES +3262479834,3262479834,DE +3262479835,3262479835,AT +3262479836,3262479836,NL +3262479837,3262479837,HU +3262479838,3262479838,CH +3262479839,3262479839,NL +3262479840,3262479840,DE +3262479841,3262479841,FR +3262479842,3262479842,DK +3262479843,3262479843,GB +3262479844,3262479846,DE +3262479847,3262479847,LU +3262479848,3262479860,DE +3262479861,3262479861,NO +3262479862,3262479862,BE +3262479863,3262479864,DE +3262479865,3262479865,FR +3262479866,3262479866,DE +3262479867,3262479867,SE +3262479868,3262479873,DE +3262479874,3262479875,FR +3262479876,3262479876,DE +3262479877,3262479877,CH +3262479878,3262479879,DE +3262479880,3262479880,AT +3262479881,3262479883,DE +3262479884,3262479884,GB +3262479885,3262479888,DE +3262479889,3262479889,NL +3262479890,3262479892,DE +3262479893,3262479893,LU +3262479894,3262479894,CH +3262479895,3262479896,ES +3262479897,3262479899,DE +3262479900,3262479900,NL +3262479901,3262479901,AT +3262479902,3262479908,DE +3262479909,3262479909,SE +3262479910,3262479914,DE +3262479915,3262479915,FR +3262479916,3262479917,DE +3262479918,3262479918,GB +3262479919,3262479922,DE +3262479923,3262479923,AT +3262479924,3262479929,DE +3262479930,3262479930,IT +3262479931,3262479932,DE +3262479933,3262479933,NL +3262479934,3262479936,DE +3262479937,3262479937,FR +3262479938,3262479939,DE +3262479940,3262479940,ES +3262479941,3262479941,IT +3262479942,3262479944,DE +3262479945,3262479945,FR +3262479946,3262479946,DE +3262479947,3262479947,HU +3262479948,3262479948,DE +3262479949,3262479949,NL +3262479950,3262479950,CH +3262479951,3262479955,DE +3262479956,3262479956,IT +3262479957,3262479957,BE +3262479958,3262479961,DE +3262479962,3262479962,GB +3262479963,3262479963,ES +3262479964,3262479964,DE +3262479965,3262479965,ES +3262479966,3262479974,DE +3262479975,3262479975,FR +3262479976,3262479976,NL +3262479977,3262479978,DE +3262479979,3262479979,CH +3262479980,3262479980,AT +3262479981,3262479984,DE +3262479985,3262479985,CH +3262479986,3262479987,DE +3262479988,3262479988,FR +3262479989,3262479989,DE +3262479990,3262479990,NL +3262479991,3262479995,DE +3262479996,3262479996,NL +3262479997,3262480001,DE +3262480002,3262480002,BE +3262480003,3262480005,DE +3262480006,3262480006,FR +3262480007,3262480010,DE +3262480011,3262480011,BE +3262480012,3262480012,NL +3262480013,3262480015,DE +3262480016,3262480016,ES +3262480017,3262480018,DE +3262480019,3262480019,BE +3262480020,3262480021,DE +3262480022,3262480022,CH +3262480023,3262480029,DE +3262480030,3262480030,GB +3262480031,3262480031,DE +3262480032,3262480032,CH +3262480033,3262480033,GB +3262480034,3262480034,DE +3262480035,3262480035,LU +3262480036,3262480038,DE +3262480039,3262480039,CH +3262480040,3262480042,DE +3262480043,3262480043,GB +3262480044,3262480044,RS +3262480045,3262480045,GB +3262480046,3262480048,DE +3262480049,3262480049,LU +3262480050,3262480051,DE +3262480052,3262480052,NL +3262480053,3262480057,DE +3262480058,3262480058,NL +3262480059,3262480059,CH +3262480060,3262480060,DE +3262480061,3262480062,GB +3262480063,3262480063,SI +3262480064,3262480066,DE +3262480067,3262480067,NL +3262480068,3262480073,DE +3262480074,3262480074,AT +3262480075,3262480076,DE +3262480077,3262480078,FR +3262480079,3262480082,DE +3262480083,3262480083,NO +3262480084,3262480084,IT +3262480085,3262480087,DE +3262480088,3262480088,FR +3262480089,3262480089,NL +3262480090,3262480090,CH +3262480091,3262480092,DE +3262480093,3262480093,BE +3262480094,3262480094,DE +3262480095,3262480095,AT +3262480096,3262480097,DE +3262480098,3262480098,GB +3262480099,3262480104,DE +3262480105,3262480105,IT +3262480106,3262480106,DE +3262480107,3262480107,DK +3262480108,3262480109,DE +3262480110,3262480110,GB +3262480111,3262480111,AT +3262480112,3262480112,BE +3262480113,3262480113,DE +3262480114,3262480114,IT +3262480115,3262480116,DE +3262480117,3262480117,BE +3262480118,3262480133,DE +3262480134,3262480134,AT +3262480135,3262480135,NL +3262480136,3262480136,FR +3262480137,3262480139,DE +3262480140,3262480140,FR +3262480141,3262480141,AT +3262480142,3262480146,DE +3262480147,3262480147,IT +3262480148,3262480148,GB +3262480149,3262480150,DE +3262480151,3262480151,GB +3262480152,3262480158,DE +3262480159,3262480159,IT +3262480160,3262480161,DE +3262480162,3262480162,NO +3262480163,3262480164,DE +3262480165,3262480165,FR +3262480166,3262480172,DE +3262480173,3262480173,NL +3262480174,3262480174,DE +3262480175,3262480175,NL +3262480176,3262480177,DE +3262480178,3262480178,IT +3262480179,3262480179,DE +3262480180,3262480180,FR +3262480181,3262480181,ES +3262480182,3262480184,DE +3262480185,3262480185,FR +3262480186,3262480187,DE +3262480188,3262480188,FI +3262480189,3262480189,CH +3262480190,3262480194,DE +3262480195,3262480195,GB +3262480196,3262480197,DE +3262480198,3262480198,NL +3262480199,3262480199,GB +3262480200,3262480201,DE +3262480202,3262480202,GB +3262480203,3262480205,DE +3262480206,3262480206,CH +3262480207,3262480212,DE +3262480213,3262480213,FR +3262480214,3262480215,DE +3262480216,3262480216,HU +3262480217,3262480218,DE +3262480219,3262480219,ES +3262480220,3262480220,NL +3262480221,3262480221,BE +3262480222,3262480226,DE +3262480227,3262480227,IE +3262480228,3262480229,DE +3262480230,3262480230,SE +3262480231,3262480232,DE +3262480233,3262480233,SE +3262480234,3262480238,DE +3262480239,3262480239,NL +3262480240,3262480243,DE +3262480244,3262480244,CH +3262480245,3262480246,DE +3262480247,3262480247,NL +3262480248,3262480248,DE +3262480249,3262480249,NL +3262480250,3262480250,DE +3262480251,3262480251,NL +3262480252,3262480264,DE +3262480265,3262480265,GB +3262480266,3262480268,DE +3262480269,3262480269,NL +3262480270,3262480270,DE +3262480271,3262480271,CH +3262480272,3262480272,DK +3262480273,3262480273,DE +3262480274,3262480274,IT +3262480275,3262480275,BE +3262480276,3262480276,ES +3262480277,3262480282,DE +3262480283,3262480283,GB +3262480284,3262480293,DE +3262480294,3262480294,FR +3262480295,3262480295,DE +3262480296,3262480296,NO +3262480297,3262480303,DE +3262480304,3262480304,IT +3262480305,3262480305,DE +3262480306,3262480306,AT +3262480307,3262480311,DE +3262480312,3262480312,NL +3262480313,3262480313,FR +3262480314,3262480314,NL +3262480315,3262480315,DE +3262480316,3262480316,IT +3262480317,3262480317,DE +3262480318,3262480318,IT +3262480319,3262480319,AT +3262480320,3262480320,DK +3262480321,3262480321,DE +3262480322,3262480322,GB +3262480323,3262480324,DE +3262480325,3262480325,ES +3262480326,3262480329,DE +3262480330,3262480330,FR +3262480331,3262480332,DE +3262480333,3262480333,CH +3262480334,3262480334,DE +3262480335,3262480335,GB +3262480336,3262480336,DE +3262480337,3262480337,NL +3262480338,3262480340,DE +3262480341,3262480341,CH +3262480342,3262480342,DE +3262480343,3262480343,DK +3262480344,3262480346,DE +3262480347,3262480347,NL +3262480348,3262480352,DE +3262480353,3262480353,CH +3262480354,3262480354,DE +3262480355,3262480355,GB +3262480356,3262480356,DE +3262480357,3262480357,GB +3262480358,3262480358,CH +3262480359,3262480365,DE +3262480366,3262480366,AT +3262480367,3262480367,DE +3262480368,3262480368,GB +3262480369,3262480369,FR +3262480370,3262480370,ES +3262480371,3262480371,GB +3262480372,3262480372,DE +3262480373,3262480373,AT +3262480374,3262480374,ES +3262480375,3262480375,NL +3262480376,3262480377,DE +3262480378,3262480378,IT +3262480379,3262480379,CH +3262480380,3262480380,GB +3262480381,3262480381,IT +3262480382,3262480383,DE +3262480384,3262488575,GB +3262488576,3262496767,SE +3262496768,3262504959,FR +3262505472,3262505983,GB +3262505984,3262506495,PL +3262506496,3262507007,RO +3262507008,3262507519,DK +3262507520,3262508543,RO +3262509056,3262509567,PL +3262509568,3262510079,RO +3262510080,3262511103,FR +3262511104,3262511615,GB +3262512128,3262512639,UA +3262512640,3262513151,DE +3262513152,3262578687,AT +3262578688,3262583807,FR +3262583808,3262584063,CH +3262584064,3262611455,FR +3262611456,3262627839,GB +3262627840,3262636031,IT +3262636032,3262644223,BE +3262644224,3262648575,NL +3262648576,3262648831,DE +3262648832,3262649855,NL +3262649856,3262650623,DE +3262650624,3262654463,NL +3262654464,3262654719,DE +3262654720,3262658303,NL +3262658304,3262658559,DE +3262658560,3262661119,NL +3262661120,3262661375,DE +3262661376,3262664703,NL +3262664704,3262671359,DE +3262671360,3262672127,NL +3262672128,3262672895,DE +3262672896,3262673919,NL +3262673920,3262674943,DE +3262674944,3262676479,NL +3262676480,3262676735,DE +3262676736,3262678271,NL +3262678272,3262678527,DE +3262678528,3262681087,NL +3262681088,3262681343,DE +3262681344,3262682623,NL +3262682624,3262682879,DE +3262682880,3262686207,NL +3262686208,3262686463,DE +3262686464,3262687743,NL +3262687744,3262689023,DE +3262689024,3262690815,NL +3262690816,3262691583,DE +3262691584,3262692607,NL +3262692608,3262701567,DE +3262701568,3262703103,NL +3262703104,3262704383,DE +3262704384,3262707807,NL +3262707808,3262707839,DE +3262707840,3262707967,NL +3262707968,3262708223,DE +3262708224,3262709759,NL +3262709760,3262710527,DE +3262710528,3262712575,NL +3262712576,3262712831,DE +3262712832,3262716415,NL +3262716416,3262716671,DE +3262716672,3262721535,NL +3262721536,3262723071,DE +3262723072,3262724095,NL +3262724096,3262726911,DE +3262726912,3262732799,NL +3262732800,3262733055,DE +3262733056,3262753791,NL +3262753792,3262754815,DE +3262754816,3262761727,NL +3262761728,3262761983,DE +3262761984,3262774783,NL +3262774784,3262775039,DE +3262775040,3262832639,NL +3262832640,3262840319,DE +3262840320,3262906367,NL +3262906368,3262954495,CH +3262954496,3262955519,LI +3262955520,3262963711,CH +3262964224,3262964479,CH +3262964992,3262965247,DE +3262965248,3262971903,CH +3262971904,3263029247,IE +3263029248,3263030271,UA +3263031296,3263032319,TR +3263032320,3263033343,RU +3263033344,3263033855,LV +3263033856,3263034367,IT +3263034368,3263034879,UA +3263034880,3263035391,GB +3263036416,3263036927,GR +3263036928,3263037439,RU +3263037440,3263045631,LB +3263045632,3263046847,KW +3263046848,3263046911,IQ +3263046912,3263047935,KW +3263047936,3263048191,LB +3263048192,3263053823,KW +3263053824,3263062015,GB +3263062016,3263070207,EE +3263070208,3263070719,FR +3263070720,3263070975,NL +3263072256,3263074303,LB +3263074304,3263074815,CH +3263074816,3263075327,RO +3263075328,3263075839,IT +3263075840,3263076351,GB +3263077376,3263077887,FR +3263077888,3263078399,DE +3263079424,3263080447,PL +3263080448,3263081471,RU +3263081472,3263082495,NL +3263083520,3263084543,UA +3263084544,3263085567,RO +3263085568,3263086591,NL +3263086592,3263086847,DK +3263086848,3263087103,NL +3263087360,3263087871,DE +3263087872,3263088127,SI +3263088128,3263088383,DE +3263088384,3263088639,LV +3263088640,3263089151,CH +3263089408,3263089663,RU +3263089664,3263089919,UA +3263089920,3263090175,RO +3263090176,3263090431,DE +3263090432,3263090687,PL +3263090688,3263090943,DE +3263090944,3263091199,GB +3263091200,3263091455,PL +3263091456,3263091711,NO +3263091712,3263091967,FI +3263091968,3263092479,HR +3263092736,3263092991,PL +3263092992,3263093247,FR +3263093248,3263093503,CH +3263093760,3263094015,RO +3263094016,3263094527,PL +3263094528,3263094783,DK +3263094784,3263095039,UA +3263095040,3263095295,ES +3263095296,3263095551,FR +3263095808,3263096063,DE +3263096064,3263096319,PL +3263096320,3263096575,TR +3263096576,3263096831,SA +3263096832,3263097087,PL +3263097344,3263097599,DK +3263097600,3263097855,NL +3263097856,3263098111,FR +3263098112,3263098367,DE +3263098368,3263098623,PL +3263098624,3263098879,DE +3263098880,3263099135,GB +3263099136,3263099391,NL +3263099392,3263099903,DE +3263099904,3263100159,RO +3263100416,3263100671,DE +3263100672,3263100927,GB +3263100928,3263101183,AT +3263101184,3263101439,US +3263101440,3263101695,DK +3263101952,3263102207,LT +3263102208,3263102463,GB +3263102464,3263102719,PL +3263102720,3263102975,GR +3263102976,3263104030,DE +3263104031,3263104031,FR +3263104032,3263104040,DE +3263104041,3263104041,GB +3263104042,3263108351,DE +3263108352,3263108607,US +3263108608,3263109951,DE +3263109952,3263109959,FR +3263109960,3263137791,DE +3263137792,3263138303,PL +3263138304,3263138559,DE +3263138560,3263138815,AT +3263138816,3263168511,DE +3263168512,3263430655,GB +3263430656,3263433471,SE +3263433472,3263433727,NO +3263433728,3263436543,SE +3263436544,3263436799,ES +3263436800,3263438591,SE +3263438592,3263438847,IT +3263438848,3263443455,SE +3263443456,3263443967,NL +3263443968,3263445759,SE +3263445760,3263446015,GB +3263446016,3263446271,SE +3263446272,3263446527,CH +3263446528,3263447039,DE +3263447040,3263449599,SE +3263449600,3263450111,GB +3263450112,3263450367,DK +3263450368,3263458047,SE +3263458048,3263458303,DE +3263458304,3263459583,SE +3263459584,3263459839,FR +3263459840,3263460095,SE +3263460096,3263460351,GB +3263460352,3263461631,SE +3263461632,3263461887,GB +3263461888,3263467519,SE +3263467520,3263468031,AX +3263468032,3263469567,SE +3263469568,3263469663,SG +3263469664,3263469695,US +3263469696,3263469855,SG +3263469856,3263469887,US +3263469888,3263470591,SG +3263470592,3263475711,SE +3263475712,3263476159,JP +3263476160,3263476191,GB +3263476192,3263476255,JP +3263476256,3263476287,GB +3263476288,3263476415,JP +3263476416,3263476479,GB +3263476480,3263476671,JP +3263476672,3263476703,GB +3263476704,3263476735,JP +3263476736,3263478015,SE +3263478016,3263478271,AU +3263478272,3263478527,SE +3263478528,3263478783,ES +3263478784,3263480831,SE +3263480832,3263481343,JP +3263481344,3263481359,GB +3263481360,3263481455,JP +3263481456,3263481471,GB +3263481472,3263481487,JP +3263481488,3263481503,GB +3263481504,3263481855,JP +3263481856,3263482879,SE +3263482880,3263483903,GB +3263483904,3263496191,SE +3263496192,3263503103,GB +3263503104,3263503359,DE +3263503360,3263511551,GB +3263511552,3263512063,BE +3263512064,3263512575,GB +3263512576,3263512831,ES +3263512832,3263513855,GB +3263513856,3263514111,RU +3263514112,3263520767,GB +3263520768,3263525887,DE +3263525888,3263526143,ZA +3263526144,3263527423,DE +3263527424,3263527679,ZW +3263527680,3263545343,DE +3263545344,3263561727,US +3263561728,3263627263,NL +3263627264,3263627519,ES +3263627520,3263628031,UA +3263628032,3263628287,ES +3263628288,3263631359,RU +3263631360,3263632127,UA +3263632128,3263632383,ES +3263632384,3263633151,RU +3263633152,3263633663,UA +3263633664,3263633919,RU +3263634432,3263634943,ES +3263634944,3263635199,RU +3263635200,3263635455,ES +3263635456,3263636223,UA +3263636224,3263636479,RU +3263636480,3263636991,UA +3263636992,3263637247,RU +3263637248,3263637503,UA +3263637504,3263638527,RU +3263638528,3263639039,UA +3263639040,3263639295,RU +3263639296,3263639551,DE +3263639552,3263640575,US +3263640576,3263641599,RU +3263641600,3263642623,ES +3263642624,3263646719,RU +3263646720,3263647743,ES +3263647744,3263651619,LT +3263651620,3263651620,RU +3263651621,3263651839,LT +3263651840,3263653119,RU +3263653120,3263653631,ES +3263653632,3263654399,RU +3263654400,3263654911,SY +3263654912,3263656959,RU +3263656960,3263657471,SY +3263657472,3263657727,DE +3263657728,3263659263,RU +3263659264,3263660031,ES +3263660032,3263661055,DE +3263661568,3263661823,ES +3263661824,3263666175,RU +3263666176,3263676415,AZ +3263676416,3263677439,RU +3263677440,3263678463,ES +3263678464,3263680511,DE +3263680512,3263690751,RU +3263690752,3263692799,SY +3263692800,3263823871,FI +3263823872,3263886079,DE +3263886080,3263886335,SG +3263886336,3263954943,DE +3263954944,3263979519,ES +3263979520,3263987711,DE +3263987712,3264004095,ES +3264004096,3264012287,HU +3264012544,3264012799,FR +3264012800,3264013055,GB +3264013056,3264013311,TR +3264013312,3264013567,UA +3264013824,3264014079,NL +3264014080,3264014335,DE +3264014336,3264014591,PT +3264014592,3264014847,PL +3264014848,3264015103,IE +3264015104,3264015359,RO +3264015360,3264015615,DK +3264015872,3264016127,PT +3264016128,3264016383,UA +3264016384,3264016639,SE +3264016640,3264016895,PL +3264017152,3264017663,SE +3264017664,3264017919,RO +3264017920,3264018175,NL +3264018176,3264018431,FR +3264018432,3264018687,HU +3264018944,3264019199,PL +3264019200,3264019967,GB +3264019968,3264020223,AT +3264020224,3264020479,PL +3264020480,3264086015,BG +3264086016,3264151551,FI +3264151552,3264184319,NO +3264184320,3264184831,MD +3264184832,3264185343,NL +3264185344,3264185855,FR +3264185856,3264186367,DE +3264186368,3264186879,UA +3264186880,3264187391,RU +3264187392,3264187903,IR +3264187904,3264188415,IT +3264188416,3264189439,UA +3264189440,3264190463,RU +3264190464,3264190975,LV +3264190976,3264191487,GB +3264191488,3264191999,DE +3264192000,3264200703,GB +3264200704,3264208895,ES +3264208896,3264217087,HU +3264217088,3264282623,IS +3264282624,3264290815,GB +3264290816,3264296191,FI +3264296192,3264297727,FR +3264297728,3264298751,DE +3264298752,3264299007,BG +3264299008,3264307199,DE +3264307200,3264311295,PL +3264311808,3264312063,DE +3264312064,3264312319,CH +3264312576,3264312831,UA +3264312832,3264313087,DE +3264313088,3264313343,NL +3264313344,3264313599,RO +3264313600,3264313855,PT +3264313856,3264314623,DE +3264314880,3264315135,GB +3264315392,3264317439,IE +3264318464,3264318975,ES +3264319488,3264319743,FR +3264319744,3264319999,SE +3264320000,3264320255,DE +3264320256,3264321023,GB +3264321024,3264321535,DE +3264321792,3264322047,RS +3264322048,3264322303,FR +3264322560,3264322815,HU +3264322816,3264323071,CH +3264323072,3264323327,RU +3264323328,3264323583,RO +3264323584,3264324607,BG +3264324608,3264325631,SE +3264325632,3264326655,RU +3264326656,3264327679,SE +3264327680,3264328703,AT +3264328704,3264329727,CZ +3264329728,3264330751,PL +3264330752,3264331775,GB +3264331776,3264332287,DE +3264332288,3264332799,NL +3264332800,3264333311,GB +3264333312,3264333823,UA +3264333824,3264334335,NL +3264334336,3264334847,UA +3264334848,3264335359,PL +3264335360,3264335871,SK +3264335872,3264336383,BZ +3264337408,3264338431,UA +3264338432,3264338943,DE +3264338944,3264339455,UA +3264339456,3264339967,GB +3264339968,3264340223,DE +3264340224,3264340479,PL +3264340480,3264340735,DE +3264340736,3264340991,UA +3264340992,3264341503,PL +3264341504,3264341759,DE +3264341760,3264342015,IT +3264342016,3264342783,DE +3264342784,3264343039,FR +3264343040,3264343295,DE +3264343296,3264343551,GB +3264343552,3264343807,RO +3264343808,3264344063,DE +3264344064,3264345087,GB +3264345088,3264346111,NL +3264346112,3264347135,SE +3264347136,3264348159,DE +3264352256,3264356351,FR +3264357632,3264357887,DE +3264359936,3264360191,FR +3264360448,3264369151,FR +3264372736,3264373759,FR +3264374784,3264376063,SE +3264376064,3264376319,HR +3264376320,3264376575,UA +3264376576,3264376831,CH +3264376832,3264377087,UA +3264377088,3264377343,RU +3264377600,3264377855,RU +3264378112,3264378367,SE +3264378368,3264378623,DE +3264378624,3264378879,RU +3264378880,3264379135,PL +3264379136,3264379391,BE +3264379392,3264379647,RU +3264379648,3264379903,PL +3264380160,3264380415,RO +3264380672,3264380927,NL +3264380928,3264381951,PL +3264381952,3264385023,UA +3264385024,3264386047,DE +3264386048,3264387071,IR +3264387072,3264388095,LB +3264389120,3264390143,RU +3264391168,3264392191,SE +3264392192,3264393215,FR +3264393216,3264394239,DE +3264394240,3264395263,UA +3264395264,3264396287,AT +3264396288,3264397311,UA +3264398336,3264399359,UA +3264399360,3264400383,RU +3264401408,3264402431,DE +3264402432,3264403455,CH +3264403456,3264404479,PL +3264405504,3264406527,FR +3264406528,3264407551,UA +3264407552,3264408575,BG +3264408576,3264409599,AE +3264409600,3264410623,RU +3264410624,3264411647,NO +3264411648,3264413695,PL +3264413696,3264430079,CH +3264430592,3264430847,CH +3264431104,3264431615,LI +3264431616,3264431871,CH +3264432128,3264434175,CH +3264438272,3264440575,CH +3264441344,3264441599,PL +3264442368,3264442879,CH +3264447488,3264447743,CH +3264447744,3264447999,DE +3264448000,3264448511,CH +3264449536,3264450559,CH +3264452352,3264452607,CH +3264454656,3264455679,CH +3264456704,3264457215,CH +3264457472,3264457727,AT +3264457984,3264458239,CH +3264458752,3264463871,CH +3264463872,3264466943,LI +3264466944,3264475391,CH +3264476416,3264476671,CH +3264476672,3264477183,RU +3264477184,3264477439,PL +3264477440,3264477695,RU +3264478720,3264478975,CH +3264479232,3264544767,CH +3264544768,3264556799,HU +3264556800,3264557055,BG +3264557056,3264557823,HU +3264557824,3264558079,BG +3264558080,3264561151,HU +3264561152,3264563199,RU +3264563200,3264564223,ES +3264564224,3264565247,IE +3264565248,3264567295,NL +3264567296,3264567551,PL +3264567808,3264568063,RU +3264568320,3264568575,UA +3264568832,3264569087,FR +3264569088,3264569343,RU +3264569344,3264577535,CZ +3264577536,3264585727,MK +3264585728,3264593919,FR +3264593920,3264602111,ES +3264602112,3264603135,RU +3264603136,3264604159,PL +3264604160,3264604671,IT +3264604672,3264605183,RU +3264605184,3264605695,GR +3264605696,3264606207,FI +3264606208,3264606463,PL +3264606464,3264606719,DE +3264606720,3264606975,RU +3264606976,3264607231,BE +3264607232,3264607487,IT +3264607488,3264610303,DE +3264610304,3264612479,GB +3264612480,3264612575,FR +3264612576,3264613027,GB +3264613028,3264613031,FR +3264613032,3264614911,GB +3264614912,3264615167,SE +3264615168,3264615423,GB +3264615424,3264615935,CH +3264615936,3264616263,GB +3264616264,3264616271,CH +3264616272,3264616335,GB +3264616336,3264616337,CH +3264616338,3264617983,GB +3264617984,3264618239,US +3264618240,3264619391,GB +3264619392,3264619519,BE +3264619520,3264623971,GB +3264623972,3264623975,BE +3264623976,3264624639,GB +3264624640,3264624671,US +3264624672,3264626687,GB +3264626688,3264627711,EE +3264628736,3264629759,UA +3264630784,3264631807,DE +3264631808,3264632831,RO +3264632832,3264633855,RU +3264634880,3264636927,PL +3264636928,3264637951,RU +3264637952,3264639999,DK +3264640000,3264641023,BG +3264641024,3264642047,GB +3264643072,3264651263,RU +3264651264,3264651775,CH +3264651776,3264652287,IT +3264652288,3264652799,RU +3264652800,3264653311,PL +3264653312,3264653823,DE +3264653824,3264654335,PL +3264654336,3264654847,DE +3264654848,3264655359,UA +3264655360,3264655871,GB +3264655872,3264656383,RU +3264656896,3264657407,GB +3264657408,3264657919,PL +3264657920,3264658431,RO +3264658432,3264659455,DE +3264659456,3264659967,UA +3264659968,3264660479,GB +3264660480,3264660991,PL +3264660992,3264661503,CH +3264661504,3264662015,GB +3264662016,3264662527,RU +3264663040,3264663551,PL +3264663552,3264664063,NL +3264664064,3264664575,DE +3264664576,3264665087,NO +3264665600,3264666111,RO +3264666112,3264666623,IL +3264666624,3264667135,UA +3264667136,3264667647,RU +3264667648,3264668159,BE +3264668160,3264669183,DE +3264669184,3264669695,PL +3264669696,3264670207,UA +3264670720,3264671231,FR +3264671232,3264671743,PL +3264671744,3264672255,DE +3264672256,3264672511,FR +3264672512,3264672767,RO +3264672768,3264673279,CH +3264673280,3264673791,PL +3264673792,3264674303,CH +3264674304,3264674815,PL +3264674816,3264675327,GB +3264675328,3264675839,RU +3264675840,3264741375,NL +3264741376,3264749567,SI +3264749568,3264750079,LV +3264750080,3264750591,RU +3264750592,3264751103,KG +3264751104,3264751615,DK +3264751616,3264752127,GB +3264752128,3264752639,RO +3264752640,3264753151,AE +3264753152,3264753663,PL +3264753664,3264754175,IT +3264754176,3264754687,PL +3264754688,3264754943,LU +3264754944,3264755199,PL +3264755200,3264755711,DE +3264755712,3264756223,PL +3264756736,3264757247,PL +3264757248,3264757759,RU +3264757760,3264765951,GB +3264765952,3264774143,AT +3264774144,3264782335,HU +3264782336,3264790527,AT +3264790528,3264806911,HR +3264806912,3264815103,GB +3264815104,3264825343,SE +3264825856,3264826111,NL +3264826112,3264826367,GB +3264826880,3264827135,NL +3264827136,3264827391,LV +3264827648,3264828159,GR +3264828160,3264828415,DE +3264828416,3264828671,SE +3264828672,3264828927,MT +3264828928,3264829439,DE +3264829440,3264830207,FR +3264830208,3264830463,SE +3264830464,3264830719,FR +3264830720,3264830975,AT +3264830976,3264831231,CH +3264831232,3264831487,PL +3264831488,3264831743,CH +3264831744,3264831999,FR +3264832000,3264832255,IE +3264832512,3264832767,DE +3264832768,3264833023,IL +3264833536,3264834047,DE +3264834048,3264834303,GB +3264834304,3264834559,PL +3264834560,3264835327,FR +3264835328,3264835583,AT +3264835584,3264835839,RU +3264835840,3264836351,DE +3264836352,3264836607,PL +3264836608,3264836863,DE +3264836864,3264837119,NL +3264837120,3264837375,BG +3264837376,3264837631,PL +3264837632,3264839679,AT +3264839680,3264840191,UA +3264840192,3264840447,DE +3264840448,3264840703,IT +3264840704,3264840959,PT +3264841216,3264841471,PL +3264841472,3264841727,LV +3264841728,3264844031,GB +3264844032,3264844287,BG +3264844288,3264844799,DE +3264844800,3264845311,UA +3264845312,3264845951,DE +3264845952,3264846079,GB +3264846208,3264846335,AE +3264846336,3264846463,GB +3264846464,3264846591,NO +3264846848,3264846911,DK +3264846912,3264847103,CY +3264847232,3264847263,CH +3264847264,3264847295,LI +3264847296,3264847359,CY +3264847488,3264847615,RU +3264847616,3264847679,PL +3264847680,3264847743,FI +3264847872,3264849919,DE +3264849920,3264850431,GB +3264850688,3264850943,LV +3264850944,3264851967,IT +3264851968,3264854015,CH +3264854016,3264854271,GB +3264854528,3264854783,DE +3264854784,3264855039,IT +3264855040,3264855551,CH +3264855552,3264856063,DE +3264856064,3264861695,IT +3264861696,3264862207,FR +3264862208,3264862463,PL +3264862464,3264862719,AT +3264862720,3264862975,GB +3264862976,3264863231,DE +3264863232,3264864255,AT +3264864256,3264872447,RO +3264872448,3264888831,GB +3264888832,3264897023,RU +3264897024,3264905215,GB +3264905216,3264913407,CY +3264913408,3264921599,GB +3264921600,3264929791,LU +3264929792,3264937983,SK +3264937984,3265003519,GB +3265003520,3265005567,DE +3265009664,3265009919,FR +3265009920,3265010175,DE +3265011712,3265018879,DE +3265018880,3265019903,HK +3265036288,3265044479,DE +3265044736,3265044991,DE +3265045760,3265046015,TR +3265046528,3265048575,DE +3265050624,3265052671,DE +3265053696,3265054207,DE +3265055232,3265055743,FR +3265056256,3265056511,DE +3265056768,3265069055,DE +3265069056,3265134591,FI +3265134592,3265134847,CH +3265134848,3265134879,BE +3265134880,3265135017,CH +3265135018,3265135018,BE +3265135019,3265135039,CH +3265135040,3265135071,BE +3265135072,3265137983,CH +3265137984,3265138047,NL +3265138048,3265138303,CH +3265138304,3265138307,NL +3265138308,3265138599,CH +3265138600,3265138607,NL +3265138608,3265139967,CH +3265139968,3265139975,BE +3265139976,3265139999,CH +3265140000,3265140015,BE +3265140016,3265140119,CH +3265140120,3265140143,BE +3265140144,3265140159,CH +3265140160,3265140191,BE +3265140192,3265141551,CH +3265141552,3265141555,IE +3265141556,3265141759,CH +3265141760,3265141775,GB +3265141776,3265141791,CH +3265141792,3265141839,GB +3265141840,3265141855,CH +3265141856,3265141887,GB +3265141888,3265142220,CH +3265142221,3265142221,GB +3265142222,3265142783,CH +3265142784,3265150975,MT +3265150976,3265159167,AD +3265159168,3265167359,FR +3265167360,3265175551,AT +3265175552,3265183743,NL +3265183744,3265191935,BY +3265191936,3265200127,CH +3265200128,3265265663,GB +3265265664,3265331199,SK +3265331200,3265340415,GB +3265340416,3265340671,DE +3265340672,3265340927,GB +3265340928,3265341183,CH +3265341184,3265341279,AT +3265341312,3265341439,FR +3265341440,3265341695,GB +3265341696,3265341951,DE +3265341952,3265343487,GB +3265343488,3265347583,DE +3265347584,3265352703,FR +3265352704,3265352959,BE +3265352960,3265353215,FR +3265353216,3265355263,DE +3265355264,3265355775,FR +3265355776,3265357055,BE +3265357056,3265357311,FR +3265357312,3265357567,DE +3265357568,3265357823,BE +3265357824,3265358847,NL +3265358848,3265359103,BE +3265359104,3265359871,NL +3265359872,3265360127,CH +3265360128,3265360383,GB +3265360384,3265360895,CH +3265360896,3265361919,GB +3265361920,3265363967,IT +3265363968,3265366015,ES +3265366080,3265366271,BE +3265366272,3265366527,HU +3265366528,3265367039,DK +3265367040,3265367295,AT +3265367296,3265367551,ES +3265367552,3265367807,SE +3265367808,3265369343,DK +3265369344,3265369599,IL +3265369600,3265369855,SE +3265369856,3265370111,DE +3265370112,3265370623,DK +3265370880,3265376255,DE +3265376256,3265376511,IT +3265376512,3265378303,GB +3265378304,3265380095,NL +3265380096,3265384447,GB +3265384448,3265386495,DE +3265386496,3265387519,NL +3265388544,3265396735,GB +3265396736,3265527807,DE +3265527808,3265593343,GB +3265593344,3265594367,RU +3265594880,3265595391,UA +3265595392,3265595903,PL +3265596416,3265596927,GB +3265596928,3265597439,FR +3265597440,3265597951,MC +3265597952,3265599999,RU +3265600512,3265601023,GB +3265601024,3265601535,RU +3265601536,3265601791,SE +3265601792,3265602047,CH +3265602048,3265602303,NL +3265602560,3265602815,IT +3265602816,3265603071,IE +3265603328,3265603583,MD +3265603584,3265603839,DE +3265603840,3265604095,PL +3265604096,3265604351,GB +3265604352,3265604607,FR +3265604608,3265604863,CH +3265604864,3265605119,RU +3265605120,3265605375,UA +3265605376,3265605631,CZ +3265605632,3265605887,PL +3265605888,3265606143,FR +3265606144,3265606399,RU +3265606400,3265606655,BE +3265606656,3265606911,AT +3265606912,3265607167,RU +3265607168,3265607423,PL +3265607424,3265607679,DK +3265607936,3265608191,CZ +3265608448,3265608703,SE +3265608704,3265608959,GB +3265608960,3265609471,RU +3265609472,3265609727,UA +3265609728,3265617919,NL +3265617920,3265626111,SI +3265626112,3265634303,JO +3265634304,3265642495,IE +3265642496,3265650687,GB +3265650688,3265658879,SE +3265658880,3265724415,AT +3265724416,3265789951,FR +3265789952,3265867775,GB +3265868288,3265868543,GB +3265868800,3265869055,DE +3265871872,3265875967,GB +3265880064,3265886207,GB +3265887232,3265887487,GB +3265887488,3265887743,PT +3265887744,3265888255,PL +3265888256,3265896447,GB +3265902336,3265902591,FR +3265904384,3265904639,RO +3265904640,3265904895,DE +3265905152,3265905663,GB +3265905920,3265906175,GB +3265906176,3265906431,DE +3265906432,3265906687,CH +3265906688,3265906943,AT +3265906944,3265907199,ES +3265907200,3265907455,DE +3265907456,3265907711,FR +3265907712,3265908735,UA +3265908736,3265908991,NL +3265908992,3265909247,RO +3265909248,3265909503,UA +3265909504,3265909759,DE +3265909760,3265910015,RO +3265910272,3265910527,FR +3265910528,3265910783,PT +3265910784,3265911295,DE +3265911296,3265911551,GB +3265911552,3265911807,CH +3265911808,3265912063,PL +3265912064,3265912319,GB +3265912320,3265912575,DE +3265912832,3265913087,CZ +3265913088,3265913343,SE +3265913344,3265914367,PL +3265914624,3265914879,BG +3265914880,3265915135,GR +3265915136,3265915391,RO +3265915392,3265915647,GB +3265915648,3265915903,RO +3265915904,3265916159,PL +3265916416,3265916671,UA +3265916672,3265916927,DE +3265916928,3265917183,FR +3265917184,3265917439,PL +3265917696,3265917951,SE +3265917952,3265918207,GB +3265918464,3265918719,AT +3265918720,3265918975,RU +3265918976,3265919231,NL +3265919232,3265919487,FR +3265919488,3265919743,RU +3265919744,3265919999,DE +3265920000,3265920255,CZ +3265920512,3265920767,GB +3265920768,3265921023,RU +3265921024,3265986559,AE +3265986560,3266052095,NL +3266052096,3266322431,DE +3266322432,3266330623,LT +3266330624,3266338815,GB +3266338816,3266339071,RU +3266339072,3266339327,UA +3266339840,3266340095,RU +3266340096,3266340607,PL +3266340608,3266340863,FI +3266340864,3266341119,CH +3266341120,3266341375,GB +3266341376,3266341631,DE +3266341888,3266342143,KW +3266342144,3266342399,CH +3266342400,3266342655,BE +3266342656,3266342911,KG +3266342912,3266343167,SI +3266343168,3266343423,GR +3266343424,3266343679,RU +3266343680,3266343935,RO +3266343936,3266344191,CH +3266344448,3266344703,RU +3266344704,3266344959,ES +3266344960,3266345983,DE +3266345984,3266346495,GB +3266346496,3266346751,IT +3266346752,3266347007,FR +3266351360,3266352607,GB +3266352896,3266353567,GB +3266353584,3266353591,GB +3266353664,3266353671,GB +3266353680,3266353687,GB +3266353776,3266353783,US +3266353856,3266353863,GB +3266353880,3266353887,GB +3266353896,3266353903,GB +3266353920,3266354175,GB +3266354688,3266355199,GB +3266355200,3266363391,RO +3266363392,3266371583,GB +3266371584,3266379775,HU +3266379776,3266380799,UA +3266380800,3266381823,PL +3266381824,3266382847,FR +3266382848,3266383871,RU +3266383872,3266384895,IL +3266384896,3266385919,RU +3266385920,3266386943,UA +3266386944,3266387967,PL +3266387968,3266396159,FR +3266396160,3266412543,IT +3266412544,3266420735,AT +3266420736,3266428927,GB +3266428928,3266437119,GR +3266437120,3266445311,GL +3266445312,3266510847,NL +3266510848,3266543615,ES +3266543616,3266576383,IT +3266576384,3266616575,DE +3266617328,3266617343,GB +3266617344,3266627583,DE +3266627584,3266628095,SE +3266628096,3266629119,DE +3266629632,3266633727,DE +3266634392,3266634399,EE +3266635776,3266641919,DE +3266641920,3266707455,PL +3266707456,3266772991,DK +3266772992,3266781183,IT +3266781184,3266789375,PL +3266789376,3266794361,IT +3266794362,3266794362,SM +3266794363,3266797567,IT +3266797568,3266797823,GB +3266797824,3266798207,ES +3266798208,3266798847,GB +3266798848,3266798879,CZ +3266798880,3266802367,GB +3266802368,3266802399,BG +3266802400,3266803215,GB +3266803216,3266803219,FR +3266803220,3266804095,GB +3266804096,3266804127,NL +3266804128,3266804479,GB +3266804480,3266804735,NL +3266804736,3266805759,GB +3266805760,3266813951,AT +3266813952,3266822143,UA +3266822144,3266830335,FR +3266830336,3266838527,BE +3266838528,3266969599,IT +3266969600,3267035135,RU +3267035136,3267039231,NO +3267039232,3267040255,DE +3267040256,3267041279,RO +3267042304,3267043327,UA +3267043328,3267044351,GB +3267045376,3267046399,PL +3267046400,3267047423,NL +3267047424,3267048447,UA +3267048448,3267049471,PL +3267049472,3267050495,GB +3267050496,3267051519,SE +3267051520,3267052543,DE +3267052544,3267053567,LV +3267053568,3267054591,PL +3267054592,3267055615,NL +3267055616,3267056639,PS +3267056640,3267057663,IL +3267057664,3267058687,CH +3267058688,3267059711,AT +3267059712,3267060735,NL +3267060736,3267061759,LV +3267061760,3267063807,UA +3267063808,3267064831,BE +3267064832,3267065855,PL +3267066880,3267067903,IT +3267067904,3267068927,UA +3267068928,3267069951,BG +3267069952,3267070975,KZ +3267070976,3267071999,DE +3267072000,3267073023,PL +3267073024,3267075071,UA +3267075072,3267076095,CH +3267076096,3267078143,DE +3267078144,3267079167,FR +3267079168,3267080191,IT +3267080192,3267081215,AT +3267081216,3267082239,PL +3267082240,3267083263,DE +3267084288,3267085311,FR +3267085312,3267086335,RU +3267086336,3267087359,PL +3267087360,3267088383,RU +3267088384,3267089407,UA +3267089408,3267090431,FI +3267090432,3267091455,UA +3267091456,3267092479,DE +3267092480,3267093503,FR +3267093504,3267094527,RU +3267094528,3267095551,FI +3267095552,3267096575,PL +3267096576,3267097599,DE +3267097600,3267098623,KZ +3267098624,3267098879,GB +3267098880,3267098895,FR +3267098896,3267099007,GB +3267099008,3267099043,FR +3267099044,3267099135,GB +3267099136,3267099263,DE +3267099264,3267099327,NL +3267099328,3267099383,GB +3267099384,3267099387,NL +3267099388,3267099455,BE +3267099456,3267099463,GB +3267099464,3267099647,BE +3267099648,3267100671,IT +3267100672,3267166207,FI +3267166208,3267231743,GB +3267231744,3267297279,RU +3267297280,3267357132,CH +3267357133,3267357133,US +3267357134,3267362815,CH +3267362816,3267428351,DK +3267428352,3267493887,GB +3267501056,3267504127,GB +3267511296,3267512319,FR +3267513344,3267514367,FR +3267514368,3267515391,DE +3267520512,3267521535,DE +3267522560,3267523583,DE +3267527680,3267528703,FR +3267529728,3267530751,AT +3267531776,3267532799,FR +3267534848,3267536895,FR +3267537920,3267538943,FR +3267549184,3267550207,DK +3267559424,3267624959,DE +3267627372,3267627375,DE +3267627408,3267627411,GB +3267628396,3267628415,FR +3267630080,3267631095,GB +3267631096,3267631103,IT +3267634176,3267635199,GB +3267648320,3267648335,GB +3267657552,3267657555,RO +3267657560,3267657563,RO +3267657576,3267657583,RO +3267657696,3267657703,RO +3267657712,3267657727,RO +3267661904,3267661967,ES +3267662784,3267662847,NO +3267662896,3267662911,IE +3267665920,3267666943,GB +3267670016,3267671039,ZA +3267681304,3267681331,FR +3267681340,3267681343,FR +3267681888,3267681903,FR +3267681956,3267681963,FR +3267683936,3267683967,PL +3267690496,3267691519,FI +3267691520,3267692543,SE +3267692544,3267741759,FI +3267741760,3267741791,SE +3267741792,3267756031,FI +3267756032,3267821567,SE +3267821568,3267839177,FR +3267839178,3267839178,RE +3267839179,3267845375,FR +3267845376,3267845631,GP +3267845632,3267846655,FR +3267846656,3267846911,MQ +3267846912,3267887103,FR +3267887104,3268017469,GB +3268017470,3268017470,KE +3268017471,3268149247,GB +3268149248,3268165631,EE +3268165632,3268173823,CH +3268173824,3268182015,MT +3268182016,3268198399,PL +3268198400,3268214783,MA +3268215584,3268215615,GB +3268215648,3268215679,GB +3268215712,3268215743,GB +3268215808,3268216063,GB +3268218112,3268218367,GB +3268219808,3268219823,GB +3268221440,3268221471,GB +3268221504,3268221599,GB +3268221696,3268221951,GB +3268222976,3268223167,GB +3268223200,3268223231,GB +3268224768,3268225023,US +3268226368,3268226399,GB +3268226496,3268226655,GB +3268226688,3268226815,GB +3268227328,3268227391,GB +3268227520,3268227615,GB +3268231168,3268231199,GB +3268231320,3268231359,GB +3268231392,3268231423,GB +3268231648,3268231679,GB +3268231744,3268231807,GB +3268232224,3268232243,GB +3268232352,3268232367,GB +3268232384,3268232415,GB +3268232480,3268232575,GB +3268232960,3268233087,GB +3268233984,3268234047,GB +3268234176,3268234239,GB +3268234560,3268234623,GB +3268235008,3268235263,GB +3268235264,3268235519,DE +3268235520,3268235775,GB +3268235936,3268236031,GB +3268236192,3268236207,GB +3268236544,3268236607,GB +3268236672,3268236799,GB +3268237824,3268237855,GB +3268237904,3268237911,GB +3268238336,3268238359,GB +3268238368,3268238399,GB +3268238472,3268238527,GB +3268238536,3268238543,GB +3268238552,3268238623,GB +3268238632,3268238783,GB +3268238816,3268238831,GB +3268239584,3268240127,GB +3268240160,3268240191,GB +3268240384,3268240399,GB +3268240480,3268240487,GB +3268240688,3268240695,GB +3268240712,3268240735,GB +3268240744,3268240751,GB +3268240976,3268240991,GB +3268241008,3268241023,GB +3268241544,3268241551,GB +3268241640,3268241655,GB +3268242496,3268242523,GB +3268242880,3268243071,GB +3268243328,3268243391,GB +3268244776,3268244783,GB +3268244792,3268244799,GB +3268245504,3268245759,GB +3268246272,3268246783,GB +3268246976,3268246991,GB +3268248320,3268248447,GB +3268248512,3268248543,GB +3268249600,3268251311,GB +3268251312,3268251327,IE +3268251328,3268251583,GB +3268251584,3268251615,DE +3268251616,3268251631,CH +3268251632,3268251647,GB +3268254464,3268254543,GB +3268254624,3268254639,GB +3268254896,3268254903,GB +3268255824,3268255863,GB +3268255896,3268255919,GB +3268255952,3268255959,GB +3268255968,3268255983,GB +3268256896,3268256959,GB +3268257024,3268257055,GB +3268257088,3268257119,GB +3268257416,3268257419,GB +3268257432,3268257439,IT +3268257464,3268257471,GB +3268257488,3268257527,GB +3268258560,3268258623,GB +3268258688,3268258751,GB +3268259520,3268259527,GB +3268259544,3268259551,GB +3268259560,3268259575,GB +3268259808,3268259815,GB +3268259832,3268260095,GB +3268260352,3268260383,GB +3268260416,3268260447,GB +3268260512,3268260607,GB +3268260640,3268260647,GB +3268261936,3268261951,GB +3268262768,3268262783,GB +3268262880,3268262887,GB +3268263232,3268263263,GB +3268263776,3268263783,GB +3268264736,3268264767,GB +3268265416,3268265431,GB +3268265984,3268266495,GB +3268266984,3268266991,GB +3268267536,3268267551,GB +3268267584,3268267599,GB +3268267616,3268267647,GB +3268267744,3268267775,GB +3268267952,3268267959,GB +3268268032,3268272127,GB +3268272728,3268272735,GB +3268273024,3268273151,GB +3268274112,3268274175,GB +3268274456,3268274459,GB +3268274528,3268274543,GB +3268274560,3268274591,GB +3268275984,3268275999,GB +3268276640,3268276655,GB +3268276672,3268276687,GB +3268276864,3268276895,GB +3268277056,3268277119,GB +3268277760,3268278015,GB +3268278464,3268278495,GB +3268280064,3268280319,GB +3268280320,3268345855,FR +3268345856,3268411391,GB +3268411392,3268476927,AT +3268476928,3268542463,CH +3268542464,3268607999,PT +3268608000,3268673535,FI +3268673536,3268739071,CZ +3268739072,3268739327,DE +3268739328,3268739583,PL +3268739584,3268739839,DE +3268739840,3268740095,GB +3268740096,3268740351,IL +3268740352,3268740607,DE +3268740608,3268740863,RO +3268740864,3268741119,CH +3268741376,3268741631,LV +3268741888,3268742143,AT +3268742144,3268742399,RU +3268742656,3268742911,BE +3268742912,3268743167,NL +3268743168,3268743423,RO +3268743680,3268743935,GB +3268743936,3268744191,ES +3268744448,3268744703,RU +3268744704,3268744959,PL +3268744960,3268745215,UA +3268745472,3268745727,RU +3268745728,3268745983,PL +3268745984,3268746239,DE +3268746240,3268746495,GB +3268746496,3268746751,IE +3268746752,3268747007,FR +3268747008,3268747263,DE +3268747264,3268755455,CZ +3268755456,3268763647,SE +3268763648,3268764159,RU +3268764160,3268764671,DE +3268764672,3268765183,LV +3268765184,3268765695,RU +3268765696,3268766719,UA +3268766720,3268767231,IL +3268767232,3268767743,RU +3268767744,3268768255,NL +3268768256,3268768767,BE +3268768768,3268769279,RU +3268769280,3268769791,SE +3268769792,3268770303,UA +3268770304,3268770815,RU +3268770816,3268771327,FR +3268771328,3268771839,NL +3268771840,3268788223,NO +3268788224,3268804607,CZ +3268804608,3268869375,FR +3268869376,3268869631,PF +3268869632,3268870143,FR +3268870144,3268935679,FI +3268935680,3269066751,GB +3269066752,3269132287,SE +3269132288,3269197823,GR +3269197824,3269263359,ES +3269264640,3269264895,DE +3269265856,3269265919,DE +3269265920,3269266175,GB +3269266688,3269266943,DE +3269266944,3269267455,GB +3269272576,3269272583,DE +3269272704,3269272831,DE +3269272832,3269272847,GB +3269272848,3269272863,NL +3269272864,3269272887,GB +3269272896,3269273087,NL +3269273088,3269273343,DE +3269273600,3269273855,GB +3269273856,3269275647,DE +3269275904,3269276159,DE +3269276160,3269276415,GB +3269277184,3269277695,FR +3269277696,3269277759,GB +3269277760,3269278719,NL +3269279232,3269279487,NL +3269279672,3269279679,CH +3269279744,3269280255,GB +3269280256,3269280271,DE +3269280272,3269280767,NL +3269280768,3269281023,GB +3269281024,3269281279,DE +3269281280,3269281535,FR +3269282048,3269282303,DE +3269282304,3269282559,GB +3269282560,3269282815,FR +3269283328,3269283583,DE +3269283872,3269283903,DE +3269284096,3269284351,GB +3269284864,3269285079,FR +3269285088,3269285135,DE +3269285136,3269285151,GB +3269285152,3269285215,DE +3269285216,3269285311,FR +3269285312,3269285327,DE +3269285336,3269285343,FR +3269285344,3269285631,GB +3269285632,3269285887,DE +3269286400,3269286471,DE +3269288688,3269288695,DE +3269288704,3269288959,DE +3269290560,3269290575,DE +3269290592,3269290687,DE +3269290736,3269290743,DE +3269291264,3269291519,DE +3269291520,3269291567,GB +3269291584,3269291647,GB +3269291776,3269292287,ES +3269293120,3269293151,DE +3269293208,3269293215,DE +3269293248,3269293279,DE +3269293376,3269293391,DE +3269293856,3269293887,DE +3269293920,3269293951,DE +3269294080,3269295103,GB +3269296232,3269296235,DE +3269296368,3269296375,DE +3269297152,3269297663,GB +3269298664,3269298671,DE +3269303040,3269303295,DE +3269303296,3269303423,GB +3269303552,3269303679,DE +3269305344,3269305351,DE +3269305856,3269306879,DE +3269307648,3269307903,DE +3269310656,3269310671,DE +3269310976,3269311231,DE +3269311872,3269311999,DE +3269313792,3269314175,DE +3269314192,3269314199,DE +3269315584,3269315591,DE +3269317632,3269317663,GB +3269317664,3269317671,IE +3269317672,3269317887,GB +3269317888,3269318399,DE +3269318400,3269318655,GB +3269318656,3269318983,DE +3269319008,3269319047,DE +3269319056,3269319071,DE +3269319136,3269320447,DE +3269320704,3269321727,GB +3269322240,3269322495,DE +3269322656,3269322671,DE +3269322752,3269323263,DE +3269326848,3269326855,DE +3269326960,3269326971,DE +3269326992,3269326999,DE +3269327024,3269327039,DE +3269327056,3269327103,DE +3269327760,3269327775,DE +3269327864,3269328383,DE +3269328896,3269459967,GB +3269459968,3269525503,ES +3269525504,3269591039,IR +3269591040,3269621759,RU +3269621760,3269623551,BY +3269623552,3269656575,RU +3269656576,3269722111,GB +3269722112,3269787647,CZ +3269787648,3269853183,NL +3269853184,3269918719,CH +3269918720,3269984255,DE +3269984256,3270049791,AT +3270049792,3270115327,DE +3270131712,3270148095,NO +3270148352,3270149887,FI +3270150656,3270151423,FI +3270152704,3270153727,FI +3270166528,3270167551,NO +3270205440,3270207487,ES +3270208512,3270209535,NL +3270234112,3270242303,NL +3270246400,3270377471,SE +3270377472,3270443007,GB +3270443008,3270508543,DK +3270508544,3270639615,FI +3270639616,3270640127,PL +3270640640,3270642175,RU +3270642176,3270642687,NO +3270642688,3270643199,DE +3270643200,3270643711,RU +3270643712,3270644223,AT +3270644224,3270644735,NL +3270644736,3270645247,DE +3270645760,3270646271,IL +3270646272,3270646783,RU +3270647296,3270647807,RU +3270647808,3270648063,TR +3270648064,3270648319,RU +3270648320,3270648575,CH +3270648576,3270648831,AT +3270648832,3270649087,SI +3270649088,3270649343,AT +3270649600,3270649855,PL +3270649856,3270650111,DK +3270650112,3270650367,AT +3270650368,3270650623,DK +3270650624,3270651903,FR +3270652416,3270652927,CH +3270652928,3270653183,PL +3270653184,3270653439,UA +3270653440,3270653695,NL +3270653696,3270653951,GB +3270654464,3270654719,BE +3270654720,3270655231,UA +3270655232,3270655487,IT +3270655488,3270655743,PL +3270655744,3270655999,CH +3270656000,3270664191,NL +3270664192,3270666239,UA +3270666240,3270667263,PL +3270667264,3270668287,SE +3270668288,3270669311,FR +3270669312,3270670335,UA +3270670336,3270672383,RU +3270672384,3270680575,GB +3270680576,3270684671,IL +3270684672,3270688767,FR +3270688768,3270772079,IT +3270772080,3270772087,NL +3270772088,3270836223,IT +3270836224,3270901759,DE +3270901760,3270903807,IT +3270903808,3270905855,SE +3270905856,3270909951,IT +3270911840,3270911871,PL +3270911872,3270911935,DE +3270911968,3270911999,NL +3270913024,3270920703,DE +3270920704,3270921215,UA +3270921216,3270921471,DK +3270921472,3270921727,UA +3270921728,3270922239,GB +3270923264,3270924287,DE +3270926336,3270926591,AT +3270926592,3270926847,CH +3270926848,3270927103,PL +3270927104,3270927359,UA +3270927616,3270927871,FR +3270927872,3270928127,HU +3270928384,3270928895,UA +3270928896,3270929407,PL +3270929408,3270929919,GB +3270929920,3270930431,BG +3270930432,3270931455,RU +3270931456,3270931967,UA +3270931968,3270932479,CH +3270932480,3270932991,UA +3270932992,3270933503,DE +3270933504,3270934015,PL +3270934016,3270934527,IT +3270934528,3270967295,DE +3270967296,3270968319,PL +3270968320,3270968831,DE +3270968832,3270969343,SE +3270969344,3270969855,CH +3270969856,3270970367,AT +3270970368,3270970879,UA +3270970880,3270971391,RU +3270971392,3270972415,UA +3270972416,3270973951,RU +3270973952,3270974463,FR +3270974464,3270974975,IT +3270974976,3270975487,NL +3270975744,3270975999,RU +3270976000,3270976255,FR +3270976256,3270976511,UA +3270976512,3270976767,HU +3270976768,3270977023,UA +3270977024,3270977279,NL +3270977280,3270977535,RS +3270977536,3270977791,RU +3270977792,3270978047,PL +3270978048,3270978303,UA +3270979072,3270979327,PL +3270979328,3270979583,AT +3270979584,3270979839,NO +3270979840,3270980095,GB +3270980096,3270980351,AM +3270980352,3270980607,RU +3270980608,3270980863,MD +3270980864,3270981631,RU +3270981632,3270981887,IT +3270981888,3270982143,AT +3270982400,3270982655,TR +3270982656,3270982911,UA +3270982912,3270983167,DK +3270983168,3270983423,PL +3270983424,3270983679,NL +3270983680,3270991871,GB +3270991872,3271000063,NL +3271000064,3271008255,RU +3271008256,3271008767,BE +3271008768,3271009279,SI +3271009280,3271009791,MD +3271009792,3271010303,IL +3271010304,3271010815,RU +3271010816,3271011327,GB +3271011328,3271013375,UA +3271013376,3271013887,US +3271014400,3271014911,RU +3271015424,3271015935,DK +3271015936,3271016447,RU +3271016448,3271024639,RS +3271024640,3271032831,GB +3271032832,3271098367,NO +3271098368,3271163903,SI +3271163904,3271229439,FR +3271229440,3271360511,FI +3271360512,3271363407,GB +3271363408,3271363415,AT +3271363416,3271363423,GB +3271363424,3271363455,IT +3271363456,3271363471,GB +3271363472,3271363487,ZA +3271363488,3271363519,IT +3271363552,3271363583,FR +3271363584,3271365887,GB +3271365888,3271366143,DE +3271366144,3271366399,GB +3271366400,3271366655,NL +3271366656,3271371263,GB +3271371264,3271371519,IE +3271371520,3271371679,ZA +3271371680,3271371711,DE +3271371712,3271371775,CH +3271371776,3271372031,GB +3271372032,3271372287,BE +3271372288,3271372799,FR +3271372800,3271373055,SE +3271373056,3271373311,BE +3271373312,3271373567,GB +3271373568,3271373823,FR +3271373824,3271374079,DE +3271374080,3271374335,BE +3271374336,3271374847,DE +3271374848,3271375359,GB +3271375360,3271375871,CH +3271375872,3271376383,BE +3271376384,3271376447,GB +3271376448,3271376463,FR +3271376464,3271376479,IT +3271376480,3271376511,FR +3271376512,3271376639,DE +3271376640,3271376895,AT +3271376896,3271377407,ES +3271377408,3271377919,NL +3271377920,3271378687,BE +3271378688,3271378943,SE +3271378944,3271380991,GB +3271380992,3271381247,BE +3271381248,3271381503,NO +3271381504,3271381759,SE +3271381760,3271382527,IT +3271382528,3271383039,IL +3271383040,3271383295,CH +3271383296,3271383551,BE +3271383552,3271384063,GB +3271384064,3271384319,CH +3271384320,3271384575,BE +3271384576,3271384831,GB +3271384832,3271385087,BE +3271385088,3271385159,DE +3271385160,3271385183,GB +3271385184,3271385215,ES +3271385216,3271385343,NL +3271385344,3271391231,DE +3271391232,3271391743,NL +3271391744,3271391999,NO +3271392000,3271392255,DE +3271392256,3271392511,FR +3271392512,3271392767,BE +3271392768,3271393279,FR +3271393280,3271393791,AT +3271393792,3271394047,DK +3271394048,3271394303,DE +3271394304,3271394559,BE +3271394560,3271394815,GB +3271394816,3271395071,DE +3271395072,3271395327,GB +3271395328,3271396863,IT +3271396864,3271397119,GB +3271397120,3271397375,NL +3271397376,3271397887,CH +3271397888,3271397951,FR +3271397952,3271397983,IT +3271397984,3271397999,NL +3271398000,3271398015,FR +3271398016,3271398047,NL +3271398048,3271398079,ZA +3271398080,3271398143,GB +3271398144,3271398303,NL +3271398304,3271398335,DE +3271398336,3271398399,IT +3271398400,3271398911,DE +3271398912,3271399167,GB +3271399168,3271400959,BE +3271400960,3271401215,CH +3271401216,3271401471,DE +3271401472,3271403263,DK +3271403264,3271403519,DE +3271403520,3271403775,NL +3271403776,3271403903,ZA +3271403904,3271403919,GB +3271403920,3271403935,IE +3271403936,3271403967,GB +3271403968,3271403983,ZA +3271403984,3271403991,GB +3271403992,3271403999,ZA +3271404000,3271404031,DE +3271404032,3271405311,NL +3271405312,3271405567,FR +3271405568,3271405823,ES +3271405824,3271406079,AT +3271406080,3271406335,ZA +3271406336,3271406591,RO +3271406592,3271406847,GB +3271406848,3271407615,AT +3271407616,3271407871,DE +3271407872,3271408127,AT +3271408128,3271408383,DE +3271408384,3271408639,FR +3271408640,3271408895,BE +3271408896,3271409151,ES +3271409152,3271409407,IT +3271409408,3271409663,GB +3271409664,3271417855,BE +3271417856,3271424071,FR +3271424072,3271424079,IT +3271424080,3271424095,IE +3271424096,3271424111,GB +3271424112,3271424127,BE +3271424128,3271424191,GB +3271424192,3271424511,FR +3271424512,3271425023,GB +3271425024,3271425279,DE +3271425280,3271425535,DK +3271425536,3271426047,DE +3271426048,3271491583,FR +3271491584,3271557119,DK +3271557120,3271589887,BE +3271589888,3271688191,NO +3271691776,3271692031,US +3271692032,3271692287,GB +3271694080,3271694335,IE +3271694592,3271695103,GB +3271696384,3271698431,GB +3271704576,3271712767,RU +3271712768,3271720959,LV +3271720960,3271729151,GB +3271729152,3271737343,DE +3271737344,3271738367,RU +3271738368,3271738879,RO +3271738880,3271739391,RU +3271739392,3271739903,AT +3271739904,3271740415,IE +3271740416,3271740927,UA +3271740928,3271741439,RU +3271741440,3271741951,PL +3271741952,3271742463,RU +3271742976,3271743999,RU +3271744000,3271744511,RO +3271744512,3271745023,AT +3271745024,3271745535,PL +3271745536,3271746047,GB +3271746048,3271746559,CZ +3271746560,3271747071,US +3271747072,3271747583,KZ +3271747584,3271748095,RU +3271748096,3271748607,GR +3271748608,3271749119,UA +3271749120,3271750143,RU +3271750656,3271751167,GB +3271751168,3271751679,RO +3271751680,3271752191,NL +3271752192,3271752703,GB +3271752704,3271753215,RU +3271753216,3271753727,PL +3271753728,3271770111,FR +3271770112,3271786495,AT +3271786496,3271788543,UA +3271789568,3271790591,RU +3271790592,3271791615,LV +3271791616,3271792639,UA +3271792640,3271793663,PL +3271793664,3271794687,UA +3271794688,3271795711,IT +3271795712,3271796735,NL +3271796736,3271797759,SK +3271797760,3271798783,SA +3271798784,3271799807,NL +3271799808,3271800831,RU +3271800832,3271801855,GB +3271801856,3271802879,PS +3271802880,3271803903,DE +3271803904,3271804927,UA +3271804928,3271805951,PL +3271805952,3271806975,UA +3271808000,3271809023,DE +3271809024,3271810047,RU +3271810048,3271811071,PL +3271811072,3271812095,UA +3271812096,3271813119,ES +3271813120,3271814143,PL +3271814144,3271815167,UA +3271815168,3271816191,RU +3271816192,3271817215,UA +3271817216,3271818239,DE +3271818240,3271819263,RU +3271819264,3271884799,DE +3271884800,3271901183,UA +3271901184,3271909375,ES +3271909888,3271910399,DE +3271910400,3271910911,DK +3271910912,3271911423,LV +3271911424,3271911935,LI +3271911936,3271912959,UA +3271912960,3271913215,SK +3271913216,3271913471,SE +3271913472,3271913983,NO +3271913984,3271914495,RO +3271914496,3271915007,ES +3271915008,3271915519,SE +3271915520,3271916031,DE +3271916032,3271916543,GB +3271916544,3271917311,UA +3271917312,3271925759,RU +3271925760,3271926015,DK +3271926272,3271926527,RU +3271926528,3271926783,NL +3271926784,3271927295,SI +3271927296,3271927551,NO +3271927552,3271927807,GB +3271928064,3271928319,GB +3271928576,3271928831,CH +3271928832,3271929087,IE +3271929088,3271929343,LB +3271929344,3271929599,NO +3271929600,3271929855,GB +3271930112,3271930367,HU +3271930368,3271930623,RU +3271930624,3271930879,GE +3271930880,3271931135,CH +3271931136,3271931647,PL +3271931648,3271931903,NO +3271931904,3271932159,UA +3271932160,3271932415,SE +3271932416,3271932671,CZ +3271932672,3271932927,DE +3271932928,3271933183,PL +3271933184,3271933439,GB +3271933440,3271933695,SE +3271933696,3271933951,DE +3271933952,3272015871,FR +3272019968,3272020991,IT +3272020992,3272024063,DK +3272024064,3272032255,IE +3272032256,3272040447,SE +3272040448,3272048639,FR +3272048640,3272056831,NL +3272056832,3272065023,RU +3272065024,3272073727,GB +3272073728,3272073855,IE +3272073856,3272081407,GB +3272081408,3272087551,PT +3272087552,3272088575,MR +3272088576,3272089599,PT +3272089600,3272090111,NO +3272090112,3272091647,RU +3272091648,3272092671,UA +3272092672,3272093183,RU +3272093184,3272093695,RO +3272094208,3272094719,AM +3272094720,3272095231,PL +3272095232,3272095743,FI +3272095744,3272096255,UA +3272096256,3272096767,PT +3272096768,3272097279,FI +3272097280,3272097791,RU +3272097792,3272106239,GB +3272106240,3272106495,PL +3272106496,3272106751,SE +3272106752,3272107007,PL +3272107008,3272107263,GB +3272107264,3272107519,PL +3272107776,3272108031,GB +3272108032,3272108287,DE +3272108288,3272108543,RO +3272108544,3272109055,PL +3272109056,3272109311,CH +3272109312,3272109567,TR +3272109824,3272110079,FR +3272110336,3272110591,CH +3272110848,3272111103,LV +3272111104,3272111615,GB +3272112128,3272112383,RO +3272112384,3272113151,DE +3272113152,3272113407,FR +3272113408,3272113919,GB +3272113920,3272114175,AT +3272114176,3272122367,PL +3272122368,3272131071,GB +3272131072,3272131583,RO +3272131584,3272132095,GB +3272132096,3272132607,CH +3272132608,3272133119,UA +3272133120,3272133631,GB +3272133632,3272134143,EE +3272134144,3272134655,RO +3272134656,3272135167,NL +3272135168,3272135679,CH +3272135680,3272136191,AT +3272136192,3272136703,FR +3272136704,3272137215,PL +3272137216,3272137727,LT +3272137728,3272138239,PL +3272138240,3272138751,BG +3272138752,3272146943,DE +3272146944,3272212479,RU +3272212480,3272212991,GB +3272212992,3272213375,ES +3272213376,3272213391,IT +3272213392,3272213399,GB +3272213400,3272213407,ES +3272213408,3272213415,NL +3272213416,3272213423,ES +3272213424,3272213431,NL +3272213432,3272213439,GB +3272213440,3272213471,ES +3272213472,3272213487,CY +3272213488,3272213495,GB +3272213496,3272213503,ES +3272213504,3272213567,IT +3272213568,3272213575,GB +3272213576,3272213583,IE +3272213584,3272213599,DE +3272213600,3272213615,IT +3272213632,3272213639,NL +3272213656,3272213663,IT +3272213672,3272213679,IT +3272213696,3272213743,IT +3272213752,3272213759,IT +3272213760,3272214015,NL +3272214016,3272214271,ES +3272214272,3272214351,GB +3272214352,3272214407,FR +3272214432,3272214463,SE +3272214528,3272215039,FR +3272215040,3272215295,ES +3272215296,3272215551,NL +3272215552,3272215807,CH +3272215808,3272215823,NL +3272215872,3272215879,BE +3272215884,3272215919,CH +3272215920,3272215935,NL +3272215936,3272215999,GB +3272216016,3272216031,DE +3272216032,3272216039,IT +3272216040,3272216047,GB +3272216048,3272216055,IT +3272216216,3272216223,FR +3272216320,3272216351,NL +3272216352,3272216383,DE +3272216384,3272216447,CH +3272216452,3272216455,NL +3272216464,3272216479,FR +3272216480,3272216495,IR +3272216512,3272216575,IT +3272216576,3272216895,GB +3272216896,3272216911,FR +3272216912,3272216927,DE +3272216960,3272217007,GB +3272217088,3272217151,GB +3272217152,3272217175,BE +3272217216,3272217279,BE +3272217280,3272217303,DE +3272217304,3272217327,BE +3272217344,3272217599,GB +3272217600,3272217631,CH +3272217856,3272217875,ES +3272217880,3272217895,IT +3272217896,3272217919,ES +3272217920,3272217983,DE +3272217984,3272218079,ES +3272218112,3272218623,GB +3272218632,3272218639,RU +3272218688,3272218719,DE +3272218752,3272218879,GB +3272218880,3272219135,BE +3272219136,3272219391,NL +3272219392,3272219647,GB +3272219648,3272219903,FR +3272219904,3272220159,DE +3272220160,3272220415,FR +3272220416,3272221183,GB +3272221184,3272221439,NL +3272221440,3272221447,SE +3272221448,3272221455,NO +3272221456,3272221463,SE +3272221472,3272221495,SE +3272221504,3272221519,SE +3272221696,3272221951,NL +3272221952,3272222207,GB +3272222208,3272222463,ES +3272222464,3272222719,NL +3272222720,3272223015,GB +3272223024,3272223039,GB +3272223232,3272223487,NL +3272223488,3272223503,SG +3272223520,3272223551,HK +3272223744,3272225023,GB +3272225280,3272225535,IT +3272225536,3272225791,GB +3272225792,3272225815,IT +3272225856,3272225919,GB +3272225920,3272226047,IT +3272226048,3272226815,FR +3272226816,3272227071,GB +3272227072,3272227327,PT +3272227328,3272227359,US +3272227360,3272227511,GB +3272227520,3272227583,GB +3272227584,3272227839,FR +3272227840,3272228095,ES +3272228096,3272228223,GB +3272228224,3272228351,ES +3272228352,3272228607,FR +3272228608,3272228623,NL +3272228624,3272228631,CY +3272228632,3272228639,NL +3272228640,3272228671,IT +3272228672,3272228703,DE +3272228704,3272228735,FR +3272228736,3272228799,NL +3272228800,3272228863,CH +3272228864,3272237055,LU +3272237056,3272245247,IM +3272245248,3272261631,FI +3272261632,3272261887,MT +3272261888,3272262143,BG +3272262144,3272262399,IL +3272262400,3272262655,DE +3272262656,3272262911,NO +3272262912,3272263167,SA +3272263168,3272263423,RU +3272263424,3272263935,GB +3272263936,3272264191,ES +3272264192,3272264447,NL +3272264448,3272264703,DE +3272264704,3272264959,LV +3272264960,3272265215,RU +3272265216,3272265471,AT +3272265472,3272265727,DK +3272265728,3272265983,DE +3272266240,3272266495,UA +3272266496,3272266751,SE +3272266752,3272267007,NL +3272267008,3272267263,GB +3272267264,3272267519,RU +3272267776,3272268031,LV +3272268032,3272268287,MT +3272268288,3272268543,UA +3272268800,3272269055,IL +3272269056,3272269311,GB +3272269568,3272351743,GB +3272351744,3272352767,PL +3272352768,3272353791,UA +3272353792,3272355839,CH +3272355840,3272356351,GB +3272356352,3272356607,ES +3272356608,3272356863,GB +3272356864,3272357887,RO +3272357888,3272358911,UA +3272358912,3272359935,NL +3272359936,3272368127,RU +3272368128,3272376319,KZ +3272376320,3272384511,SK +3272384512,3272392703,LT +3272392704,3272400895,AT +3272401216,3272401247,PL +3272401280,3272401407,NL +3272402048,3272402063,SE +3272402560,3272402623,GB +3272402944,3272403007,HU +3272403072,3272403199,NL +3272403968,3272404991,FR +3272404992,3272406015,DE +3272406016,3272407039,NL +3272409088,3272417279,BE +3272417280,3272418559,FR +3272418560,3272418815,GB +3272418816,3272419327,PL +3272419328,3272420351,DE +3272420864,3272420991,PL +3272420992,3272421119,DK +3272421376,3272421887,RO +3272421888,3272422143,RU +3272422144,3272422399,GB +3272422400,3272422911,CH +3272423424,3272423935,BE +3272423936,3272424447,FR +3272424448,3272425471,DE +3272425472,3272441855,GB +3272441856,3272474623,LV +3272474624,3272474879,FR +3272474880,3272475135,NL +3272475136,3272475391,RU +3272475392,3272475903,PL +3272475904,3272476159,FR +3272476160,3272476415,RO +3272476672,3272476927,DE +3272476928,3272477183,GR +3272477440,3272477695,PL +3272477696,3272477951,RU +3272477952,3272478207,RO +3272478208,3272478463,DK +3272478464,3272478719,FI +3272478720,3272478975,GB +3272478976,3272479231,UA +3272479488,3272479743,SA +3272479744,3272480255,SE +3272480256,3272480511,FR +3272480512,3272480767,CH +3272481024,3272481279,SE +3272481792,3272482047,IT +3272482048,3272482303,NL +3272482304,3272482559,PL +3272482560,3272482815,BE +3272482816,3272491007,RU +3272491008,3272499199,GB +3272499200,3272499711,RU +3272499712,3272500223,NL +3272500224,3272500735,RU +3272500736,3272501247,IT +3272501248,3272502783,RU +3272502784,3272503295,KW +3272503808,3272504319,RU +3272504320,3272504831,PL +3272504832,3272505343,RU +3272505344,3272505855,AT +3272505856,3272506879,UA +3272506880,3272507391,CH +3272507392,3272515583,CY +3272515584,3272523775,LT +3272523776,3272540159,DE +3272540160,3272605695,CH +3272605696,3272613887,BE +3272613888,3272622079,RU +3272623104,3272624127,DE +3272624128,3272625151,RU +3272625152,3272626175,UA +3272626176,3272627199,DE +3272627200,3272628223,NL +3272628224,3272629247,UA +3272629248,3272638463,RU +3272638464,3272646655,ES +3272646656,3272647385,GB +3272647386,3272647386,DE +3272647387,3272654847,GB +3272654848,3272663039,FI +3272663040,3272671231,AT +3272671232,3272736767,SE +3272737792,3272738815,GB +3272738816,3272739839,IL +3272739840,3272741887,UA +3272741888,3272743935,RU +3272743936,3272744959,UA +3272744960,3272753151,RU +3272753152,3272769535,NL +3272769536,3272802303,NO +3272802304,3272867839,RU +3272867840,3272868863,PL +3272868864,3272869887,UA +3272869888,3272870911,NL +3272870912,3272871935,FR +3272871936,3272872959,FI +3272873984,3272875007,BG +3272875008,3272876031,RU +3272876032,3272884223,NL +3272884224,3272892415,DE +3272892416,3272892927,UA +3272893440,3272893951,SE +3272893952,3272894463,RU +3272894976,3272895487,RO +3272895488,3272895999,GB +3272896000,3272896511,PL +3272896512,3272897535,DE +3272897536,3272898047,FI +3272898048,3272898559,UA +3272898560,3272899071,DE +3272899328,3272899583,PL +3272899584,3272900095,UA +3272900096,3272900607,LV +3272900608,3272900863,RU +3272900864,3272901119,AT +3272901120,3272901375,UA +3272901376,3272901631,PL +3272901632,3272901887,AT +3272901888,3272902143,DE +3272902144,3272902399,PL +3272902400,3272902655,RU +3272902656,3272902911,IR +3272902912,3272903167,RU +3272903168,3272903423,PL +3272903424,3272903679,AT +3272903680,3272903935,RU +3272903936,3272904191,DK +3272904192,3272904447,SI +3272904704,3272904959,NL +3272904960,3272905215,RO +3272905216,3272905727,CH +3272905728,3272905983,UA +3272905984,3272906239,FI +3272906240,3272906495,PL +3272906496,3272906751,EE +3272906752,3272907007,HU +3272907008,3272907263,HR +3272907264,3272907519,UA +3272907520,3272907775,GB +3272907776,3272908031,RO +3272908032,3272908287,CH +3272908288,3272908543,AT +3272908544,3272908799,DE +3272908800,3272916991,SK +3272916992,3272917503,MC +3272917504,3272918527,RU +3272918528,3272919039,FR +3272919040,3272919551,PL +3272919552,3272920063,RO +3272920064,3272920575,NL +3272920576,3272921087,SE +3272921088,3272921599,CH +3272921600,3272922111,DE +3272922112,3272922623,PL +3272922624,3272923135,GB +3272923136,3272923647,ES +3272923648,3272924159,PL +3272924160,3272924671,DE +3272924672,3272925183,GB +3272925184,3272933375,DE +3272933376,3272935183,GB +3272935184,3272935199,HU +3272935200,3272941599,GB +3272941600,3272941615,FR +3272941616,3272942335,GB +3272942336,3272942591,ES +3272942592,3272943047,GB +3272943048,3272943055,DE +3272943056,3272943559,GB +3272943560,3272943567,DE +3272943568,3272943903,GB +3272943904,3272943907,HK +3272943908,3272966143,GB +3272966144,3272982527,US +3272982528,3272998911,GB +3272998912,3273007103,PT +3273007104,3273015295,CZ +3273015296,3273023487,SE +3273023488,3273024511,PL +3273024512,3273025535,NL +3273025536,3273026559,RU +3273026560,3273028607,UA +3273028608,3273029631,PL +3273029632,3273029887,CH +3273029888,3273030143,GB +3273030400,3273030655,RU +3273030656,3273031679,PL +3273031680,3273032191,GB +3273032192,3273033215,UA +3273033216,3273033727,GB +3273033728,3273034239,DE +3273034240,3273034751,BE +3273034752,3273035263,UA +3273035264,3273035775,DE +3273035776,3273036287,FR +3273036288,3273036799,BG +3273037312,3273037823,GB +3273038336,3273038847,GR +3273039360,3273039871,GB +3273039872,3273048063,LT +3273048064,3273056255,IT +3273056256,3273064447,MD +3273064448,3273129983,PT +3273129984,3273131519,DK +3273131520,3273131775,SE +3273131776,3273138175,DK +3273138176,3273146367,BG +3273146368,3273148415,RU +3273148416,3273150463,LU +3273150464,3273152511,DZ +3273152512,3273154559,BG +3273154560,3273162751,DE +3273162752,3273170943,UA +3273170944,3273179135,SE +3273179136,3273187327,CM +3273187328,3273187839,SE +3273187840,3273188351,DK +3273188352,3273188863,RU +3273188864,3273189887,GB +3273189888,3273190399,UA +3273190400,3273191935,RO +3273191936,3273192447,UA +3273192448,3273192959,DK +3273192960,3273193471,FR +3273193472,3273193983,PL +3273194496,3273195007,UA +3273195008,3273195519,RU +3273195520,3273200387,FR +3273200388,3273200388,GB +3273200389,3273261055,FR +3273261056,3273261567,NO +3273261568,3273262079,BE +3273262080,3273262591,LU +3273263616,3273264127,SE +3273264128,3273264639,PL +3273264640,3273265151,AT +3273265152,3273266175,UA +3273266176,3273266687,LV +3273266688,3273267455,PL +3273267456,3273267711,CZ +3273267712,3273268223,GB +3273268224,3273268735,SE +3273268736,3273269247,RU +3273269248,3273277439,GB +3273277440,3273278463,UA +3273279488,3273281535,PL +3273281536,3273283583,UA +3273283584,3273284607,GB +3273284608,3273285631,UA +3273285632,3273293823,GB +3273293824,3273302015,MK +3273302016,3273310207,RU +3273310208,3273318399,AT +3273318400,3273326591,GB +3273326984,3273326987,DE +3273326992,3273327047,DE +3273327104,3273327231,DE +3273327264,3273327295,DE +3273327336,3273327351,DE +3273327392,3273327407,IE +3273327488,3273327495,GB +3273327520,3273327551,IE +3273327552,3273327583,GB +3273328512,3273328639,DE +3273328640,3273329199,GB +3273329200,3273329215,DE +3273329216,3273329279,GB +3273329312,3273329327,GB +3273329408,3273329423,GB +3273329424,3273329439,DE +3273329440,3273330175,GB +3273330176,3273330183,IR +3273330200,3273330207,IE +3273330232,3273330235,GB +3273330288,3273330431,IE +3273330432,3273330463,GB +3273330496,3273330519,GB +3273330528,3273330551,GB +3273330560,3273331199,GB +3273331712,3273331743,GB +3273331752,3273331791,GB +3273331808,3273331823,GB +3273331828,3273331831,GB +3273331840,3273331887,GB +3273331904,3273331967,GB +3273331968,3273332031,DE +3273332032,3273332095,GB +3273332096,3273332223,DE +3273332224,3273332479,GB +3273332544,3273332575,DE +3273332608,3273332671,DE +3273333056,3273333119,DE +3273334272,3273334783,DE +3273334784,3273335039,AE +3273335296,3273335423,GB +3273335432,3273335455,GB +3273335512,3273335535,GB +3273335616,3273335623,GB +3273335656,3273335663,GB +3273335696,3273335703,GB +3273335936,3273335999,DE +3273336848,3273336863,DE +3273336864,3273336871,GB +3273336872,3273336895,DE +3273336960,3273337087,DE +3273337856,3273338111,DE +3273338624,3273338879,DE +3273339136,3273339391,DE +3273339392,3273339919,GB +3273339920,3273339943,DE +3273339944,3273339955,GB +3273339956,3273339959,DE +3273339960,3273339967,GB +3273339968,3273339983,DE +3273339984,3273340095,GB +3273340096,3273340111,GI +3273340112,3273340119,GB +3273340120,3273340143,DE +3273340144,3273340415,GB +3273340928,3273341711,FR +3273341752,3273341823,FR +3273341856,3273341879,FR +3273341888,3273341951,FR +3273342022,3273342022,GB +3273342034,3273342034,GB +3273342036,3273342039,GB +3273342080,3273342095,GB +3273342192,3273342207,GB +3273342208,3273342231,AE +3273342240,3273342255,AE +3273342464,3273342975,DE +3273342976,3273343999,GB +3273344000,3273344767,DE +3273345024,3273345279,DE +3273346560,3273346815,OM +3273346816,3273347071,DE +3273347584,3273347839,GB +3273347840,3273348351,DE +3273349120,3273349631,DE +3273350272,3273350287,DE +3273350336,3273350351,DE +3273351168,3273351423,GB +3273351424,3273351455,DE +3273351504,3273351519,DE +3273351872,3273351903,DE +3273351936,3273352191,DE +3273352928,3273352959,DE +3273352992,3273353023,DE +3273357312,3273358335,GB +3273359888,3273359903,DE +3273360016,3273360079,DE +3273361472,3273361535,DE +3273361632,3273361663,DE +3273361792,3273361823,DE +3273361856,3273361919,DE +3273362048,3273362175,DE +3273362240,3273362255,DE +3273363208,3273363211,DE +3273363328,3273363391,DE +3273363456,3273364479,GB +3273364608,3273364735,DE +3273364992,3273365247,DE +3273365504,3273365519,NL +3273365520,3273365543,GB +3273365544,3273365759,NL +3273365760,3273365767,GB +3273365888,3273366015,FR +3273366016,3273366527,DE +3273366528,3273367551,GB +3273367552,3273367567,DE +3273368064,3273368575,DE +3273369344,3273369855,DE +3273369872,3273369887,FR +3273370624,3273371135,DE +3273371712,3273371743,DE +3273371760,3273371775,DE +3273371808,3273371823,DE +3273371872,3273371875,DE +3273372000,3273372055,DE +3273372096,3273372159,DE +3273372672,3273372927,GB +3273372928,3273373183,NL +3273373184,3273373455,GB +3273373456,3273373567,DE +3273373568,3273374847,GB +3273374856,3273374863,GB +3273374896,3273374903,GB +3273374912,3273374931,GB +3273375168,3273375168,GB +3273375232,3273375551,DE +3273375744,3273375871,DE +3273376000,3273376255,DE +3273376536,3273376543,DE +3273377792,3273378095,DE +3273378560,3273378815,DE +3273381888,3273382143,DE +3273382144,3273382399,GB +3273382400,3273382463,DE +3273382480,3273382591,DE +3273382640,3273382687,DE +3273384192,3273384703,DE +3273384960,3273385215,DE +3273385280,3273385343,DE +3273385472,3273385727,DE +3273385760,3273385791,DE +3273385856,3273385919,DE +3273387056,3273387071,DE +3273387216,3273387231,DE +3273387264,3273387519,DE +3273387552,3273387583,DE +3273388160,3273388223,DE +3273388800,3273388807,DE +3273388816,3273388863,DE +3273388872,3273388879,DE +3273388904,3273388911,DE +3273388912,3273388927,GB +3273390080,3273390111,DE +3273390112,3273390143,US +3273390144,3273390207,DE +3273390368,3273390399,DE +3273391104,3273391359,DE +3273391488,3273391615,DE +3273392128,3273392639,PL +3273392640,3273393663,RO +3273394176,3273394687,RO +3273395200,3273395711,DE +3273395712,3273396223,RU +3273396224,3273396735,PL +3273396736,3273397247,RO +3273397248,3273397759,RU +3273397760,3273398271,NL +3273398272,3273398783,RO +3273398784,3273399295,GB +3273399296,3273399807,SE +3273399808,3273400319,UA +3273400320,3273408511,RU +3273408512,3273433087,SK +3273433088,3273433599,LU +3273433600,3273434111,RO +3273434112,3273434623,BE +3273434624,3273435135,IL +3273435648,3273436159,PL +3273436160,3273436671,NO +3273436672,3273437183,DE +3273437184,3273437695,RO +3273438208,3273438719,IL +3273438720,3273439231,UA +3273439232,3273439743,RO +3273439744,3273440255,DE +3273440256,3273440767,RO +3273440768,3273441279,GB +3273441280,3273449471,FR +3273449472,3273457663,CH +3273457664,3273523199,HR +3273523200,3273588735,DE +3273588736,3273687039,IT +3273687040,3273719807,DE +3273719808,3273727079,NL +3273727080,3273727088,GB +3273727089,3273727095,ES +3273727096,3273727103,DE +3273727104,3273727119,NL +3273727120,3273727127,PT +3273727128,3273727135,FI +3273727136,3273727143,NO +3273727144,3273727151,CZ +3273727152,3273727167,IT +3273727168,3273732095,NL +3273732096,3273736191,GB +3273736192,3273744383,FR +3273744384,3273752575,GB +3273752576,3273768959,NL +3273768960,3273785343,TR +3273785344,3273801727,RU +3273801728,3273802239,DE +3273802752,3273803263,SA +3273803776,3273804287,CH +3273804288,3273804799,UA +3273804800,3273805311,RO +3273805312,3273805823,GI +3273805824,3273806335,PL +3273806336,3273806847,DE +3273806848,3273807359,SE +3273807360,3273807871,LU +3273807872,3273808383,CH +3273808384,3273808895,UA +3273808896,3273809407,GB +3273809408,3273809919,UA +3273809920,3273818111,BG +3273818112,3273826303,AT +3273826304,3273834495,DE +3273834496,3273835519,RU +3273835520,3273836543,UA +3273837568,3273838591,UA +3273838592,3273839615,PL +3273839616,3273840639,EE +3273840640,3273841663,PL +3273841664,3273842687,AT +3273842688,3273850879,RU +3273850880,3273867263,DE +3273867264,3273867519,BE +3273867520,3273867775,UA +3273867776,3273868031,PT +3273868288,3273869311,RU +3273869312,3273871359,DE +3273871360,3273871615,PL +3273871616,3273871871,LU +3273871872,3273872383,SE +3273872384,3273872639,BG +3273872640,3273872895,PS +3273872896,3273873151,IE +3273873152,3273873919,DE +3273873920,3273874431,GB +3273874432,3273875455,GR +3273875456,3273875711,PT +3273876224,3273876479,IT +3273876480,3273876991,SE +3273877248,3273877503,DE +3273877536,3273877567,AT +3273877568,3273877759,IT +3273877760,3273878015,GR +3273878016,3273878271,FR +3273878272,3273878527,LV +3273878528,3273878783,RU +3273878784,3273879039,NO +3273879040,3273879551,BE +3273879552,3273880063,GB +3273880064,3273880575,NL +3273880576,3273881087,RU +3273881600,3273881855,GB +3273881856,3273882111,CH +3273882112,3273882367,SI +3273882368,3273883135,GB +3273883136,3273883391,GR +3273883392,3273883647,DE +3273883648,3273916415,NL +3273916416,3273932799,IT +3273932800,3273940991,DE +3273940992,3273943039,GB +3273943040,3273945087,DE +3273945088,3273947135,GB +3273947136,3273949183,DE +3273949184,3273981951,FR +3273981952,3274047487,DE +3274050560,3274051583,PL +3274051584,3274052351,UA +3274052352,3274052607,GB +3274052608,3274052863,DE +3274053120,3274053375,KZ +3274053376,3274053631,RU +3274053632,3274054655,DE +3274054656,3274055167,GB +3274055168,3274055423,MT +3274055424,3274055679,PL +3274055680,3274063871,RU +3274063872,3274072063,GB +3274072064,3274080255,HU +3274080256,3274088447,DE +3274088448,3274096639,KG +3274096640,3274113023,NL +3274113024,3274145791,CZ +3274145792,3274162175,KW +3274162176,3274162687,GB +3274163200,3274163711,UA +3274163712,3274164223,BG +3274164224,3274164735,AT +3274165760,3274166271,RU +3274166272,3274166783,RO +3274166784,3274167295,UA +3274167296,3274167807,BG +3274168320,3274168831,PL +3274168832,3274169343,DZ +3274169856,3274170367,DE +3274170368,3274170879,TR +3274170880,3274171391,DE +3274171392,3274171903,RU +3274171904,3274172415,DE +3274172416,3274172927,UA +3274172928,3274173439,DE +3274173440,3274173951,GR +3274174208,3274174463,CZ +3274174464,3274175487,UA +3274175488,3274175999,BE +3274176512,3274177023,UA +3274178048,3274178559,NL +3274178560,3274244095,GB +3274244096,3274309631,DK +3274309632,3274326015,FR +3274326016,3274334719,RU +3274334720,3274335231,PL +3274335232,3274335743,DE +3274335744,3274336255,NL +3274336256,3274336767,SE +3274336768,3274337279,AT +3274337280,3274337791,DE +3274337792,3274338303,SE +3274338304,3274338815,PL +3274338816,3274339327,DE +3274339328,3274339839,RO +3274339840,3274340351,RU +3274340352,3274340863,DE +3274340864,3274341375,RU +3274341376,3274341887,FR +3274341888,3274342399,UA +3274342400,3274342911,RO +3274342912,3274343423,UA +3274343424,3274343935,US +3274343936,3274344447,NL +3274344448,3274344959,UA +3274344960,3274345471,RO +3274345472,3274345983,PL +3274345984,3274346495,DE +3274346496,3274347007,FR +3274347008,3274347519,RU +3274347520,3274348031,FR +3274348032,3274348543,DK +3274348544,3274349055,PL +3274349056,3274350079,RU +3274350592,3274358783,RU +3274358784,3274366975,SE +3274366976,3274368511,NL +3274368512,3274368767,AT +3274368768,3274369023,FR +3274370048,3274371071,GB +3274373376,3274373631,PL +3274373632,3274374143,FR +3274374144,3274375167,DE +3274375168,3274383359,EG +3274383360,3274384383,RU +3274384384,3274385407,SE +3274385408,3274386431,UA +3274386432,3274388479,GB +3274388480,3274389503,DE +3274389504,3274390527,CH +3274390528,3274391551,NO +3274391552,3274392063,FR +3274392064,3274392575,PL +3274392576,3274393087,RU +3274393088,3274393599,UA +3274393600,3274394111,PL +3274394112,3274394623,AM +3274394624,3274395135,CZ +3274395136,3274395647,DK +3274396160,3274396671,LV +3274396672,3274397183,PL +3274397184,3274397695,EE +3274397696,3274398207,DE +3274398208,3274399743,RU +3274399744,3274407935,LU +3274408192,3274408447,IT +3274408448,3274408703,NL +3274408704,3274408959,SI +3274408960,3274409215,GR +3274409216,3274409471,SI +3274409472,3274409727,CH +3274409728,3274409983,RU +3274409984,3274410239,LT +3274410240,3274410495,SA +3274410496,3274410751,NL +3274410752,3274411007,AT +3274411008,3274411263,CH +3274411264,3274411519,DE +3274411520,3274412031,PL +3274412032,3274412287,RU +3274412288,3274412543,NO +3274412544,3274412799,UA +3274412800,3274413055,RU +3274413056,3274413311,UA +3274413312,3274413567,AT +3274413568,3274413823,FR +3274413824,3274414079,SE +3274414080,3274414335,AT +3274414336,3274414591,CH +3274414592,3274414847,NL +3274414848,3274415103,IE +3274415104,3274415359,PL +3274415360,3274415615,GB +3274415616,3274415871,NL +3274415872,3274416127,SI +3274416128,3274424319,IT +3274424320,3274435711,SE +3274435712,3274435839,US +3274435840,3274440703,SE +3274442752,3274443263,GB +3274443520,3274443647,GB +3274443712,3274443775,GB +3274443808,3274444031,GB +3274446336,3274447871,GB +3274448384,3274448639,GB +3274448896,3274449663,GB +3274449920,3274450231,GB +3274450248,3274450367,GB +3274450376,3274450391,GB +3274450408,3274450415,GB +3274450432,3274450591,GB +3274450656,3274450687,GB +3274451200,3274452255,GB +3274452264,3274452311,GB +3274452320,3274452335,GB +3274452344,3274452367,GB +3274452384,3274452391,GB +3274452400,3274452423,GB +3274452432,3274452439,GB +3274452448,3274452455,GB +3274452464,3274452471,GB +3274452496,3274452543,GB +3274452560,3274452575,GB +3274452656,3274452703,GB +3274452736,3274452927,GB +3274452992,3274453767,GB +3274453784,3274453791,GB +3274453800,3274453847,GB +3274453864,3274453871,GB +3274453888,3274453903,GB +3274453920,3274453935,GB +3274453944,3274453951,GB +3274453960,3274453975,GB +3274453984,3274453991,GB +3274454000,3274454271,GB +3274454656,3274455311,GB +3274455328,3274455335,GB +3274455344,3274455351,GB +3274455360,3274455375,GB +3274455384,3274455391,GB +3274455400,3274455423,GB +3274455432,3274455439,GB +3274455448,3274455503,GB +3274455520,3274455535,GB +3274455744,3274455807,GB +3274455872,3274455935,GB +3274455968,3274456359,GB +3274456368,3274456375,GB +3274456384,3274456391,GB +3274456400,3274456407,GB +3274456416,3274456447,GB +3274456456,3274456511,GB +3274456528,3274456535,GB +3274456544,3274456559,GB +3274456568,3274460223,GB +3274460416,3274462207,GB +3274462464,3274465023,GB +3274465152,3274466351,GB +3274466368,3274466399,GB +3274466416,3274466463,GB +3274466560,3274466735,GB +3274466744,3274466763,GB +3274466768,3274466783,GB +3274466816,3274467099,GB +3274467104,3274467307,GB +3274467328,3274470383,GB +3274470400,3274470535,GB +3274470656,3274471423,GB +3274471536,3274471615,GB +3274471680,3274471935,GB +3274472960,3274483711,GB +3274489600,3274489855,GB +3274490176,3274490895,GB +3274490912,3274491199,GB +3274491208,3274491247,GB +3274491256,3274491295,GB +3274491304,3274491319,GB +3274491328,3274491383,GB +3274491392,3274504447,GB +3274505728,3274505791,GB +3274505793,3274505855,GB +3274506240,3274571775,IT +3274571776,3274579967,GR +3274579968,3274580991,UA +3274580992,3274581503,PL +3274581504,3274581759,NL +3274582016,3274583039,PL +3274583040,3274584063,DE +3274584064,3274585087,GB +3274585088,3274586111,RS +3274586112,3274587135,UA +3274587136,3274588159,GB +3274588160,3274596351,SK +3274596352,3274604543,RU +3274604544,3274612735,TR +3274612736,3274620927,RU +3274620928,3274629119,FR +3274629120,3274635263,LU +3274635264,3274635519,FR +3274635520,3274635775,LU +3274635776,3274636287,FR +3274636288,3274636799,LU +3274636800,3274637311,FR +3274637312,3274670079,CZ +3274670080,3274686463,DK +3274686464,3274686719,RU +3274686720,3274686975,BG +3274686976,3274687231,RO +3274687232,3274687487,DE +3274687488,3274687743,RU +3274687744,3274687999,SI +3274688000,3274688255,GB +3274688256,3274688511,IT +3274688512,3274688767,PT +3274688768,3274689023,PL +3274689024,3274689279,UA +3274689280,3274689535,PL +3274689536,3274689791,RU +3274689792,3274690047,SE +3274690048,3274690303,ES +3274690304,3274690559,GB +3274690560,3274690815,GR +3274690816,3274691071,ES +3274691328,3274691583,SI +3274691840,3274692095,SI +3274692096,3274692351,RO +3274692352,3274692607,BE +3274692864,3274693119,AT +3274693376,3274693631,UA +3274693632,3274693887,RU +3274693888,3274694143,IT +3274694144,3274694399,DK +3274694400,3274694655,GB +3274694656,3274694911,SI +3274694912,3274695167,GB +3274695168,3274695423,SI +3274695424,3274695679,PL +3274695680,3274695935,SI +3274695936,3274696191,DE +3274696448,3274696703,CH +3274696704,3274696959,IT +3274696960,3274697215,GR +3274697216,3274697471,SA +3274697472,3274697727,CZ +3274697728,3274697983,ES +3274697984,3274698239,GB +3274698240,3274698495,SE +3274698752,3274699007,GB +3274699008,3274699263,FR +3274699520,3274699775,SI +3274699776,3274700031,GB +3274700032,3274700287,CH +3274700288,3274700543,PL +3274700544,3274700799,DK +3274700800,3274701055,UA +3274701056,3274701311,DE +3274701568,3274701823,IT +3274701824,3274702079,IL +3274702080,3274702335,UA +3274702336,3274702591,SE +3274702592,3274702847,KZ +3274702848,3274801151,CH +3274802176,3274803199,FR +3274803200,3274804223,DE +3274804224,3274805247,FR +3274805248,3274806271,GB +3274806272,3274807295,UA +3274807296,3274809343,DE +3274809344,3274810367,SE +3274810368,3274811391,UA +3274811392,3274812415,RU +3274812416,3274813439,SE +3274813440,3274814463,ES +3274814464,3274815487,GB +3274815488,3274816511,RU +3274816512,3274817535,SK +3274817536,3274819583,RU +3274819584,3274821631,UA +3274821632,3274823679,KZ +3274823680,3274825727,TR +3274825728,3274827775,DE +3274829824,3274831871,SE +3274831872,3274833919,RO +3274833920,3274842111,BY +3274842112,3274850303,DK +3274850304,3274855487,GB +3274855488,3274855519,AT +3274855520,3274866687,GB +3274866688,3274883071,DE +3274883072,3274899455,EE +3274899456,3274902399,DE +3274902400,3274902423,AT +3274902528,3274909695,DE +3274910208,3274910975,DE +3274911232,3274911743,DE +3274911744,3274911999,FR +3274912000,3274912031,GB +3274912032,3274912063,DE +3274912064,3274912191,FR +3274912192,3274912287,DE +3274912288,3274912295,LU +3274912296,3274912303,GB +3274912304,3274912447,FR +3274912448,3274912511,NL +3274912512,3274912767,FR +3274912768,3274912799,DE +3274912800,3274912831,IT +3274912832,3274912895,FR +3274912896,3274913023,RO +3274913024,3274913279,FR +3274913280,3274914815,DE +3274915072,3274915839,DE +3274915840,3274916735,NL +3274916736,3274916863,DE +3274916864,3274917215,NL +3274917216,3274917311,GB +3274917312,3274917327,ZA +3274917328,3274917335,CH +3274917336,3274917343,GB +3274917344,3274917375,SE +3274917376,3274917887,NL +3274917888,3274918399,BE +3274918400,3274918655,IT +3274918656,3274918911,BE +3274918912,3274919359,CH +3274919392,3274919423,CH +3274919424,3274919935,GB +3274919936,3274921983,BE +3274921984,3274922847,ZA +3274922848,3274922863,BE +3274922864,3274922871,GB +3274922872,3274922879,IT +3274922880,3274922943,ZA +3274922944,3274923007,NL +3274923264,3274924031,NL +3274924032,3274928127,FR +3274928128,3274928511,ES +3274928512,3274928575,RU +3274928576,3274928639,GB +3274928640,3274929151,ES +3274929408,3274929663,FR +3274929664,3274930175,BE +3274930176,3274932223,IT +3274932224,3274932991,GB +3274932992,3274933151,DE +3274933152,3274933183,CH +3274933184,3274933215,ZA +3274933216,3274933247,BE +3274933248,3274936063,GB +3274936064,3274936159,SE +3274936160,3274936175,GB +3274936192,3274936863,GB +3274936864,3274936871,BE +3274936872,3274936879,CH +3274936880,3274936895,SE +3274936896,3274938367,GB +3274938496,3274938535,GB +3274938536,3274938543,FR +3274938544,3274938559,GB +3274938624,3274938879,GB +3274938880,3274939135,DE +3274939136,3274939391,IT +3274939392,3274940415,ZA +3274940416,3274941055,DE +3274941056,3274941087,NL +3274941096,3274941103,IT +3274941104,3274942463,DE +3274942464,3274944511,FR +3274944512,3274948607,NL +3274948608,3274952447,DK +3274952448,3274952479,SE +3274952480,3274952511,FR +3274952512,3274952527,GB +3274952528,3274952543,BE +3274952544,3274952575,GB +3274952576,3274952703,IT +3274952704,3274954239,AT +3274954240,3274954399,NL +3274954400,3274954415,BE +3274954416,3274954431,GB +3274954432,3274954495,PT +3274954496,3274954623,AT +3274954624,3274954751,NL +3274954752,3274955007,SE +3274955264,3274956287,SE +3274956288,3274956543,GB +3274956544,3274956615,BE +3274956616,3274956623,AT +3274956624,3274956639,DE +3274956640,3274956655,GB +3274956656,3274956671,FR +3274956672,3274956735,DE +3274956736,3274956767,DK +3274956768,3274956799,SE +3274956800,3274957055,CH +3274957056,3274957567,AT +3274957568,3274957823,CH +3274957824,3274957831,GR +3274957952,3274957959,BE +3274957968,3274957983,FR +3274957984,3274957999,BE +3274958000,3274958007,GB +3274958008,3274958015,BE +3274958080,3274958279,IE +3274958288,3274958335,IE +3274958336,3274959231,AT +3274959232,3274959247,IT +3274959248,3274959255,GB +3274959256,3274959263,ZA +3274959272,3274959279,GB +3274959280,3274959287,DE +3274959288,3274959295,GB +3274959296,3274959327,ES +3274959328,3274959615,DE +3274960384,3274960447,BE +3274960448,3274960511,ES +3274960512,3274960575,GB +3274960576,3274960639,IT +3274960640,3274961407,AT +3274961408,3274961503,CH +3274961504,3274961535,DK +3274961536,3274961559,CH +3274961568,3274961663,CH +3274961664,3274961727,BY +3274961920,3274962111,AT +3274962112,3274962175,GB +3274962176,3274962431,ZA +3274962432,3274962687,BE +3274962688,3274962879,GR +3274962880,3274963167,GB +3274963168,3274963183,IE +3274963184,3274963191,GB +3274963192,3274963199,NL +3274963200,3274963455,DE +3274963456,3274963711,CH +3274963712,3274963743,DE +3274963744,3274963775,FR +3274963776,3274963783,GB +3274963784,3274963791,BE +3274963792,3274963807,NL +3274963808,3274963839,IT +3274963840,3274963967,DE +3274963968,3274964223,FR +3274964224,3274964735,BE +3274964736,3274964863,GB +3274964864,3274964879,HU +3274964880,3274964895,FR +3274964896,3274964927,NL +3274964928,3274964991,GB +3274964992,3275030527,DE +3275030528,3275096063,ES +3275096064,3275104767,RU +3275104768,3275105279,DE +3275105280,3275105791,GB +3275105792,3275106303,NL +3275106304,3275106815,RU +3275106816,3275107327,UA +3275107328,3275107839,BG +3275107840,3275108351,PL +3275108352,3275108863,FR +3275108864,3275109375,PL +3275109376,3275109887,UA +3275109888,3275110399,RO +3275110400,3275110911,NL +3275110912,3275111423,GB +3275111424,3275111935,IT +3275111936,3275112447,FR +3275112448,3275120639,DK +3275120640,3275137023,SE +3275137536,3275137791,NL +3275137792,3275138047,UA +3275138048,3275138559,DE +3275139072,3275139583,PT +3275140096,3275140607,AT +3275141120,3275141631,RU +3275141632,3275142143,GE +3275142144,3275142655,KG +3275142656,3275143167,SE +3275143168,3275144703,PL +3275144704,3275145215,HR +3275145216,3275153407,RU +3275153408,3275158271,GB +3275158272,3275158527,US +3275158528,3275161599,GB +3275161600,3275227135,ES +3275227136,3275292671,HU +3275292672,3275358207,ES +3275358208,3275374591,RU +3275374592,3275382783,GB +3275382784,3275390975,SE +3275390976,3275399167,GB +3275399168,3275407359,AT +3275407360,3275415551,GB +3275415552,3275423743,UA +3275423744,3275423751,GB +3275423808,3275423839,GB +3275423872,3275424295,GB +3275424320,3275424383,GB +3275424432,3275424439,GB +3275424480,3275424487,GB +3275424496,3275424639,GB +3275424648,3275424703,GB +3275424712,3275424743,GB +3275424752,3275424871,GB +3275424880,3275424895,GB +3275424904,3275424911,GB +3275424960,3275425135,GB +3275425144,3275425311,GB +3275425328,3275425343,GB +3275425536,3275425559,GB +3275425568,3275425583,GB +3275425792,3275426559,GB +3275426576,3275427103,GB +3275427112,3275427263,GB +3275427272,3275427599,GB +3275427616,3275427715,GB +3275427728,3275428367,GB +3275428376,3275428407,GB +3275428416,3275428447,GB +3275428608,3275428863,GB +3275429888,3275430143,GB +3275430592,3275430631,GB +3275430656,3275430911,GB +3275431936,3275432883,GB +3275433984,3275436543,GB +3275436800,3275438655,GB +3275438672,3275438847,GB +3275439104,3275439679,GB +3275439688,3275439935,GB +3275439944,3275439951,GB +3275439968,3275441407,GB +3275441424,3275441439,GB +3275441472,3275441567,GB +3275441600,3275441823,GB +3275441832,3275441835,GB +3275441840,3275442723,GB +3275443200,3275443227,GB +3275443230,3275443230,GB +3275443232,3275443239,GB +3275443248,3275443407,GB +3275443424,3275443727,GB +3275443760,3275443775,GB +3275443840,3275443967,GB +3275444224,3275444735,GB +3275446272,3275446783,GB +3275446800,3275446815,GB +3275446848,3275447039,GB +3275447056,3275447135,GB +3275448320,3275449359,GB +3275449376,3275449399,GB +3275449440,3275449471,GB +3275449488,3275449519,GB +3275449520,3275449527,FR +3275449528,3275449567,GB +3275449584,3275449887,GB +3275449904,3275449911,GB +3275449920,3275449927,GB +3275449936,3275449943,GB +3275450048,3275450071,GB +3275450112,3275450207,GB +3275450224,3275450879,GB +3275451232,3275451263,GB +3275451392,3275451663,GB +3275451680,3275451711,GB +3275451720,3275451727,GB +3275451744,3275451767,GB +3275451776,3275451779,GB +3275451784,3275451791,GB +3275452416,3275453023,GB +3275453056,3275453151,GB +3275453168,3275453399,GB +3275453408,3275453839,GB +3275453848,3275453919,GB +3275453936,3275453951,GB +3275453960,3275454063,GB +3275454096,3275454127,GB +3275454144,3275454175,GB +3275454192,3275454303,GB +3275454336,3275454383,GB +3275454416,3275455231,GB +3275455248,3275455295,GB +3275455360,3275456407,GB +3275456416,3275458303,GB +3275458304,3275458559,FK +3275458560,3275459071,IE +3275459840,3275460095,IE +3275460096,3275460223,GB +3275460224,3275460239,IE +3275460288,3275460295,GB +3275460352,3275460607,IE +3275460608,3275460863,HK +3275460864,3275463183,GB +3275463192,3275463199,GB +3275463216,3275463239,GB +3275463248,3275463279,GB +3275463296,3275463423,GB +3275463456,3275463495,GB +3275463504,3275463523,GB +3275463528,3275463635,GB +3275463640,3275464031,GB +3275464032,3275464047,IE +3275464048,3275468655,GB +3275468656,3275468671,IE +3275468672,3275468735,GB +3275468736,3275468751,IE +3275468752,3275468767,GB +3275468768,3275468799,IE +3275468800,3275469071,GB +3275469072,3275469087,IE +3275469088,3275473151,GB +3275473232,3275473311,GB +3275473328,3275473359,GB +3275473368,3275473895,GB +3275473904,3275474047,GB +3275474088,3275474735,GB +3275474752,3275474887,GB +3275474896,3275474911,GB +3275474936,3275474951,GB +3275474960,3275475039,GB +3275475044,3275475287,GB +3275475292,3275475295,GB +3275475376,3275475399,GB +3275475408,3275475447,GB +3275475456,3275475783,GB +3275475800,3275475807,GB +3275475824,3275475831,GB +3275475840,3275475871,GB +3275475876,3275475879,GB +3275475968,3275476223,GB +3275476288,3275476479,GB +3275476608,3275476631,GB +3275476640,3275476687,GB +3275476704,3275476735,GB +3275476944,3275476959,GB +3275476976,3275477015,GB +3275477024,3275477151,GB +3275477160,3275477567,GB +3275477760,3275478271,GB +3275478528,3275481087,GB +3275481344,3275481599,GB +3275482112,3275482431,GB +3275482480,3275483647,GB +3275484160,3275484415,GB +3275485184,3275485215,GB +3275485224,3275485231,GB +3275485248,3275485375,GB +3275485408,3275485431,GB +3275485440,3275485759,GB +3275485840,3275485855,GB +3275485936,3275485936,GB +3275486208,3275487231,GB +3275487240,3275487243,CZ +3275487248,3275487263,CZ +3275488768,3275489279,CZ +3275489280,3275497471,GB +3275497472,3275505663,DE +3275505664,3275506175,PL +3275506176,3275506687,UA +3275506688,3275507199,SE +3275507200,3275507711,UA +3275507712,3275509759,RO +3275509856,3275509887,PL +3275509888,3275509919,AM +3275509920,3275509951,PL +3275509952,3275509983,GB +3275509984,3275510015,PT +3275510016,3275510079,SE +3275510080,3275510143,ES +3275510208,3275510335,CY +3275510336,3275510399,IE +3275510400,3275510463,NL +3275510464,3275510527,GB +3275510528,3275510559,PL +3275510592,3275510623,CY +3275510624,3275510655,EE +3275510656,3275510687,FR +3275510688,3275510719,CY +3275510720,3275510751,GB +3275510752,3275510783,NL +3275510784,3275510911,CY +3275511040,3275511167,GB +3275511296,3275511551,GB +3275511552,3275511679,NL +3275511680,3275511807,CY +3275511936,3275512063,FR +3275512064,3275512191,CZ +3275512192,3275512319,IT +3275512320,3275512447,FI +3275512448,3275512575,DK +3275512576,3275512703,BE +3275512832,3275512895,SE +3275512896,3275512959,AT +3275512960,3275513023,PL +3275513024,3275513087,UA +3275513088,3275513151,CY +3275513216,3275513279,CH +3275513280,3275513343,CY +3275513344,3275513471,PL +3275513600,3275513727,CY +3275513728,3275513855,GB +3275513856,3275522047,DE +3275522048,3275530239,IT +3275530240,3275530751,DK +3275530752,3275531263,AT +3275531264,3275531775,GB +3275532288,3275532799,UA +3275532800,3275533311,GB +3275533824,3275534335,UA +3275534848,3275535359,RO +3275535360,3275535871,DE +3275535872,3275536383,SE +3275536384,3275536895,UA +3275536896,3275537407,DE +3275537408,3275537919,FR +3275537920,3275538431,IT +3275538432,3275539455,CH +3275539456,3275540479,GB +3275540480,3275541503,UA +3275542528,3275543551,DE +3275543552,3275544575,NL +3275544576,3275545599,PL +3275545600,3275546623,RU +3275546624,3275548671,UA +3275548672,3275549695,IL +3275549696,3275550719,SY +3275550720,3275551743,PL +3275551744,3275552767,RU +3275552768,3275553791,LV +3275553792,3275554815,FI +3275588448,3275588463,BE +3275590656,3275590911,BE +3275612928,3275613183,LU +3275620352,3275622399,RU +3275622400,3275623423,GB +3275623424,3275623935,PL +3275623936,3275624447,UA +3275624448,3275624959,SK +3275624960,3275625471,IL +3275625472,3275625983,DE +3275626496,3275627007,UA +3275627008,3275627519,AT +3275627520,3275628031,GB +3275628032,3275628543,IL +3275628544,3275629311,RU +3275629312,3275629567,TR +3275629568,3275630079,UA +3275630080,3275630591,RU +3275630592,3275631103,PL +3275631104,3275631615,FR +3275631616,3275632127,DE +3275632128,3275633151,RU +3275633152,3275633663,FR +3275633664,3275634687,RU +3275634688,3275635199,RO +3275635200,3275636735,RU +3275636736,3275637247,PL +3275637248,3275637759,SE +3275637760,3275638271,BE +3275638272,3275638783,RU +3275638784,3275639807,FR +3275639808,3275640319,SE +3275640320,3275640831,RU +3275640832,3275641343,DE +3275641344,3275641855,NL +3275641856,3275642367,AT +3275642880,3275643391,RO +3275643392,3275643903,BE +3275643904,3275644415,RU +3275644416,3275644927,RO +3275644928,3275653119,DE +3275653120,3275661311,LV +3275661312,3275669503,IT +3275669504,3275677695,GB +3275677696,3275685887,IT +3275685888,3275751423,DE +3275751424,3275759615,AT +3275759616,3275775999,NL +3275776000,3275784191,DE +3275784704,3275785215,PL +3275785216,3275785727,RO +3275785728,3275786239,CH +3275786240,3275786751,UA +3275786752,3275787263,CH +3275787264,3275787775,RU +3275787776,3275788287,UA +3275788288,3275788799,SE +3275788800,3275789311,AT +3275789312,3275789823,UA +3275789824,3275790335,PL +3275790848,3275791359,UA +3275791360,3275791871,RU +3275791872,3275792383,PL +3275792384,3275792895,BG +3275792896,3275793407,UA +3275793408,3275793919,FR +3275793920,3275794431,UA +3275794432,3275794943,GB +3275794944,3275795455,RS +3275795456,3275795967,GR +3275795968,3275796479,PL +3275796480,3275796991,DE +3275796992,3275797503,RO +3275797504,3275798015,DE +3275798016,3275799039,UA +3275799040,3275799551,ES +3275799552,3275800063,IT +3275800064,3275800575,UA +3275800576,3275808767,RU +3275808768,3275816959,UA +3275816960,3275882495,CH +3275882496,3275884543,DE +3275884544,3275886591,IT +3275886592,3275888639,PL +3275888640,3275890687,GB +3275890688,3275898879,SE +3275898880,3275899135,LV +3275899136,3275899647,UA +3275899648,3275899903,RU +3275899904,3275900159,PL +3275900160,3275900415,SI +3275900416,3275900671,DE +3275900672,3275901183,RU +3275901184,3275901439,PL +3275901440,3275901695,DE +3275901696,3275901951,IE +3275901952,3275902207,DE +3275902208,3275902719,RU +3275902720,3275902975,UA +3275902976,3275903231,FR +3275903232,3275903487,GB +3275903488,3275903743,FR +3275903744,3275903999,DE +3275904000,3275904255,RU +3275904256,3275904511,CH +3275904512,3275904767,PL +3275905024,3275905279,PL +3275905280,3275905535,RU +3275905536,3275905791,NL +3275905792,3275906303,AT +3275906304,3275906559,UA +3275906560,3275907071,SE +3275907072,3275907327,RU +3275907328,3275907583,CH +3275907584,3275907839,PL +3275907840,3275908095,DE +3275908096,3275908351,SA +3275908352,3275908607,SE +3275908608,3275908863,DE +3275908864,3275909119,PL +3275909376,3275909631,UA +3275909632,3275909887,EE +3275909888,3275910143,SI +3275910144,3275910399,RU +3275910400,3275910655,DK +3275910656,3275910911,UA +3275910912,3275911167,DE +3275911168,3275911423,FR +3275911424,3275911679,RO +3275911936,3275912191,BE +3275912192,3275912447,PL +3275912448,3275912703,RU +3275912704,3275912959,IL +3275912960,3275913215,FR +3275913472,3275913983,DE +3275913984,3275914239,CH +3275914240,3275914495,RO +3275914496,3275914751,BG +3275914752,3275915007,RU +3275915008,3275915263,PT +3275915264,3275915775,SA +3275915776,3275916287,SE +3275916288,3275916383,US +3275916384,3275916415,GB +3275916416,3275916799,US +3275916800,3275917311,NL +3275917312,3275918847,UA +3275918848,3275919359,RO +3275919360,3275919871,PL +3275919872,3275920383,UA +3275920384,3275920895,GB +3275920896,3275921407,ES +3275921920,3275922431,DE +3275922432,3275922943,UA +3275922944,3275923455,GR +3275923456,3275924991,ME +3275924992,3275925759,RS +3275925760,3275928927,ME +3275928928,3275928943,RS +3275928944,3275931647,ME +3275931648,3275939839,UA +3275939840,3275948031,GB +3275948032,3276013567,SE +3276013568,3276014239,GB +3276014240,3276014247,FR +3276014248,3276014463,GB +3276014464,3276014479,FR +3276014480,3276014951,GB +3276014952,3276014959,ES +3276014960,3276015055,GB +3276015056,3276015063,FR +3276015064,3276018383,GB +3276018384,3276018399,FR +3276018400,3276019711,GB +3276019712,3276020735,FR +3276020736,3276021055,GB +3276021056,3276021071,FR +3276021072,3276025159,GB +3276025160,3276025167,FR +3276025168,3276028031,GB +3276028032,3276028039,FR +3276028040,3276028279,GB +3276028280,3276028287,FR +3276028288,3276028383,GB +3276028384,3276028391,FR +3276028392,3276028543,GB +3276028544,3276028671,FR +3276028672,3276029375,GB +3276029376,3276029439,FR +3276029440,3276030591,GB +3276030592,3276030607,FR +3276030608,3276031479,GB +3276031480,3276031487,FR +3276031488,3276032311,GB +3276032312,3276032319,FR +3276032320,3276036543,GB +3276036544,3276036607,FR +3276036608,3276039263,GB +3276039264,3276039279,FR +3276039280,3276042087,GB +3276042088,3276042095,FR +3276042096,3276042239,GB +3276042240,3276044287,FR +3276044288,3276045247,GB +3276045248,3276045255,FR +3276045256,3276046335,GB +3276046336,3276062719,RU +3276062720,3276063231,PL +3276063232,3276063743,FR +3276063744,3276064255,UA +3276064256,3276064767,DE +3276064768,3276065279,BG +3276065280,3276065791,UA +3276065792,3276066303,DE +3276066304,3276066815,GB +3276066816,3276067327,PS +3276067328,3276067839,UA +3276067840,3276068351,AT +3276068352,3276068863,BG +3276068864,3276069375,UA +3276069888,3276070399,GB +3276070400,3276070911,UA +3276071936,3276072447,GB +3276072448,3276072959,SK +3276072960,3276073471,PL +3276073472,3276073983,SK +3276073984,3276074495,DE +3276074496,3276075007,GB +3276075008,3276075519,RU +3276075520,3276076031,DE +3276076032,3276076287,NL +3276076288,3276076543,RU +3276076544,3276077055,DE +3276077568,3276078079,FR +3276078080,3276078591,RU +3276079104,3276095487,NO +3276095488,3276096511,RU +3276096512,3276097535,IT +3276097536,3276098559,NL +3276098560,3276099583,UA +3276099584,3276100607,PL +3276100608,3276101631,UA +3276101632,3276102655,LV +3276102656,3276103679,GB +3276103680,3276104703,SI +3276105728,3276106751,AT +3276106752,3276107775,BG +3276107776,3276108799,DE +3276108800,3276109823,SE +3276109824,3276110847,BG +3276110848,3276111871,PL +3276111872,3276112895,DK +3276112896,3276113919,UA +3276115968,3276116991,NL +3276116992,3276118015,RU +3276118016,3276119039,GB +3276119040,3276120063,RU +3276120064,3276121087,GB +3276121088,3276122111,BG +3276122112,3276123135,RU +3276123136,3276124159,AT +3276124160,3276125183,UA +3276125184,3276126207,AT +3276126208,3276127231,UA +3276127232,3276128255,UZ +3276128256,3276129279,AT +3276129280,3276131327,UA +3276131328,3276132351,RU +3276132352,3276133375,PL +3276133376,3276134399,GB +3276134400,3276135423,RU +3276135424,3276136447,UA +3276136448,3276137471,NL +3276138496,3276139519,NL +3276139520,3276140543,RU +3276140544,3276141567,DE +3276141568,3276143615,UA +3276144640,3276152831,CH +3276152832,3276161023,HU +3276161024,3276169215,GB +3276169216,3276177407,AT +3276177408,3276185599,CZ +3276185600,3276193791,NO +3276193792,3276201983,RU +3276201984,3276210175,AT +3276210176,3276234303,DE +3276234304,3276234367,GB +3276234368,3276275711,DE +3276275712,3276283903,SK +3276283904,3276292095,GB +3276292096,3276292479,BE +3276292480,3276292607,CH +3276292608,3276300287,BE +3276300288,3276304383,DE +3276304384,3276304639,BG +3276304640,3276305407,GB +3276305408,3276306431,IL +3276306432,3276308479,NL +3276308480,3276309503,GB +3276309504,3276310527,AT +3276310528,3276311551,PT +3276311552,3276312575,RU +3276312576,3276313599,UA +3276313600,3276314623,PL +3276314624,3276315647,FR +3276315648,3276316671,UA +3276316672,3276324863,GB +3276324864,3276333055,IT +3276333056,3276341247,RU +3276341248,3276406783,NL +3276406784,3276414975,FI +3276414976,3276415999,DK +3276416000,3276417023,SE +3276417024,3276419071,DE +3276419072,3276420095,PL +3276420096,3276421119,GB +3276421120,3276422143,PL +3276422144,3276422655,GB +3276422656,3276423167,RU +3276423168,3276423423,PL +3276423424,3276423679,NL +3276423680,3276423935,SE +3276423936,3276424191,UA +3276424192,3276424447,GB +3276424448,3276424703,PL +3276424704,3276424959,DE +3276424960,3276425215,RO +3276425216,3276425471,UA +3276425472,3276425727,DE +3276425728,3276425983,RU +3276425984,3276426239,IT +3276426240,3276426495,CZ +3276426496,3276426751,NO +3276426752,3276427007,RO +3276427008,3276427263,PL +3276427264,3276427519,FR +3276427520,3276427775,IT +3276427776,3276428031,RU +3276428032,3276428287,GB +3276428288,3276428543,RU +3276428544,3276428799,BG +3276428800,3276429055,DE +3276429056,3276429311,NL +3276430080,3276430591,PL +3276430592,3276430847,GB +3276430848,3276431103,DE +3276431104,3276431359,RU +3276431360,3276447743,GB +3276447744,3276451583,DE +3276455936,3276464127,BE +3276464128,3276472319,GR +3276474880,3276474927,IT +3276474936,3276474939,IT +3276474956,3276474959,IT +3276478064,3276478095,CH +3276478108,3276478111,CH +3276485632,3276486655,GB +3276490776,3276490776,NL +3276490782,3276490782,AT +3276490783,3276490783,CH +3276492232,3276492235,GB +3276492248,3276492259,GB +3276492284,3276492287,GB +3276492296,3276492299,GB +3276492304,3276492307,GB +3276492312,3276492315,GB +3276494476,3276494479,GB +3276495528,3276495547,GB +3276498120,3276498123,GB +3276499504,3276499571,DE +3276499576,3276499579,DE +3276499680,3276499687,DE +3276499744,3276499775,DE +3276500088,3276500091,DE +3276500108,3276500111,DE +3276500160,3276500163,DE +3276500168,3276500171,DE +3276501108,3276501111,DE +3276501116,3276501119,DE +3276501128,3276501135,DE +3276501148,3276501151,DE +3276501172,3276501183,DE +3276501196,3276501199,DE +3276503040,3276505087,DE +3276509088,3276509095,GB +3276509108,3276509115,GB +3276509184,3276510207,IT +3276512256,3276513023,ZA +3276518368,3276518383,NL +3276520704,3276520735,SE +3276522496,3276523519,NL +3276524864,3276524895,PT +3276528128,3276528195,GB +3276528204,3276528215,GB +3276528224,3276528231,GB +3276530544,3276530555,NL +3276530560,3276530571,NL +3276530584,3276530591,NL +3276530688,3276531711,NL +3276532583,3276532583,GB +3276532590,3276532590,GR +3276532608,3276532608,GB +3276533248,3276533311,SI +3276536752,3276536783,HU +3276537344,3276537599,AT +3276537856,3276668927,ES +3276668928,3276677119,MC +3276677120,3276678143,HR +3276678144,3276678655,SE +3276678656,3276679167,UA +3276679168,3276679679,DE +3276679680,3276680191,UA +3276680192,3276680703,SK +3276680704,3276681215,AT +3276681728,3276682239,BE +3276682240,3276682751,AT +3276683776,3276684287,UA +3276684288,3276684799,RU +3276684800,3276685311,DE +3276685312,3276685823,RO +3276685824,3276686335,PL +3276686336,3276686847,UA +3276686848,3276687359,FI +3276687360,3276687871,RU +3276687872,3276688383,KW +3276688384,3276688895,DE +3276688896,3276689407,ES +3276689408,3276690431,GB +3276690432,3276690943,NL +3276690944,3276691455,GR +3276691456,3276691967,RO +3276691968,3276692479,RU +3276692480,3276692991,UA +3276692992,3276693503,GB +3276693504,3276694015,UA +3276694016,3276694527,AT +3276694528,3276695039,UA +3276695040,3276695551,RU +3276695552,3276696063,UA +3276696064,3276696575,RO +3276696576,3276697087,CZ +3276697088,3276697599,GB +3276697600,3276698111,UA +3276698112,3276699647,RU +3276699648,3276700159,NL +3276700160,3276700671,CZ +3276700672,3276701183,RO +3276701184,3276701695,RU +3276701696,3276709887,SE +3276709888,3276718079,DE +3276718080,3276726271,IT +3276726272,3276727295,SE +3276727296,3276728319,ES +3276728320,3276729343,UA +3276729344,3276730367,PL +3276730368,3276731391,DE +3276731392,3276732415,UA +3276732416,3276733439,DE +3276733440,3276734463,UA +3276734464,3276734735,AT +3276734736,3276734751,DK +3276734752,3276734815,AT +3276734816,3276734847,DE +3276734880,3276734895,GB +3276734896,3276734911,NL +3276734912,3276734943,FR +3276734944,3276735455,AT +3276735456,3276735487,NL +3276735488,3276735871,AT +3276735936,3276735999,ES +3276736000,3276736511,AT +3276736512,3276736575,IT +3276736576,3276736735,GB +3276736768,3276736799,IT +3276736800,3276736815,DE +3276736816,3276736831,CZ +3276736832,3276736863,NL +3276736864,3276736871,DE +3276736872,3276736879,NL +3276736880,3276736959,DK +3276736960,3276736991,CH +3276736992,3276737015,GB +3276737016,3276737023,BE +3276737024,3276737343,IT +3276737344,3276737407,DE +3276737408,3276737535,ES +3276737536,3276737615,IT +3276737616,3276737631,DE +3276737632,3276737791,RU +3276737792,3276737935,NL +3276737936,3276737943,DE +3276737944,3276737991,GB +3276737992,3276737999,IT +3276738000,3276738015,GB +3276738016,3276738047,BE +3276738048,3276738079,GB +3276738080,3276738111,ES +3276738112,3276738143,GB +3276738144,3276738175,IT +3276738176,3276738559,GB +3276738560,3276738847,CH +3276739072,3276739151,CH +3276739168,3276740127,CH +3276740128,3276740167,GB +3276740168,3276740175,DE +3276740176,3276740191,NL +3276740224,3276740351,CH +3276740352,3276740703,FR +3276740704,3276740719,IT +3276740720,3276740735,CZ +3276740736,3276740799,PT +3276740800,3276740815,SI +3276740816,3276740831,SK +3276740832,3276740863,DE +3276740864,3276741375,FR +3276741632,3276742655,FR +3276742656,3276742735,RU +3276742736,3276742751,NL +3276742752,3276742783,GR +3276742784,3276742911,HU +3276742912,3276743071,AT +3276743072,3276743103,DE +3276743104,3276743135,HU +3276743136,3276743167,NL +3276743424,3276743903,AT +3276743904,3276743935,BE +3276743936,3276744191,AT +3276744192,3276744703,BE +3276744704,3276744959,IT +3276744960,3276745215,GR +3276745216,3276745295,DK +3276745296,3276745311,NL +3276745312,3276745343,DK +3276745344,3276745407,DE +3276745408,3276745655,DK +3276745664,3276745727,DK +3276745728,3276746047,GB +3276746048,3276746111,DE +3276746112,3276746239,IT +3276746240,3276746335,GB +3276746336,3276746351,BE +3276746352,3276746367,NL +3276746368,3276746751,GB +3276746752,3276748287,CH +3276748288,3276748799,GB +3276748800,3276748951,AT +3276748952,3276748959,GB +3276748960,3276749023,AT +3276749024,3276749055,IT +3276749056,3276749087,AT +3276749088,3276749103,FR +3276749120,3276749183,NL +3276749184,3276749311,DE +3276749312,3276749343,BE +3276749344,3276749375,DE +3276749376,3276749823,BE +3276749824,3276750151,NL +3276750152,3276750159,GB +3276750160,3276750175,FR +3276750176,3276750207,BE +3276750208,3276750335,FR +3276750336,3276750431,GB +3276750464,3276751039,GB +3276751040,3276751071,FR +3276751072,3276751087,GB +3276751088,3276751103,NL +3276751104,3276751175,GB +3276751176,3276751199,SE +3276751232,3276751295,IL +3276751296,3276751359,AT +3276751360,3276753055,GB +3276753056,3276753071,NO +3276753072,3276753119,GB +3276753120,3276753151,IT +3276753152,3276753375,GB +3276753376,3276753407,FI +3276753408,3276753951,GB +3276753952,3276753983,HU +3276753984,3276754991,GB +3276754992,3276755007,DE +3276755008,3276755071,HU +3276755072,3276755199,DE +3276755200,3276755775,GB +3276755776,3276755791,NO +3276755792,3276755807,RU +3276755808,3276755839,GB +3276755840,3276755967,ES +3276755968,3276756031,GB +3276756032,3276756063,NL +3276756064,3276756095,BE +3276756096,3276756287,GB +3276756288,3276756319,SE +3276756320,3276756351,FR +3276756352,3276756671,GB +3276756672,3276756735,DE +3276756736,3276757119,GB +3276757120,3276757135,NO +3276757136,3276757151,NL +3276757152,3276757183,GB +3276757248,3276757503,GB +3276757760,3276757823,GB +3276757824,3276757839,DE +3276757840,3276757855,ES +3276757856,3276757887,CH +3276757888,3276759039,GB +3276759040,3276759695,DE +3276759696,3276759711,NL +3276759712,3276759743,DE +3276759744,3276759775,CH +3276759808,3276761215,DE +3276761216,3276761279,ES +3276761280,3276761919,DE +3276761920,3276761983,GB +3276761984,3276762015,DK +3276762016,3276762111,FR +3276762112,3276762623,DE +3276762880,3276762943,DE +3276762944,3276762959,GB +3276762960,3276762975,IT +3276762976,3276763007,NO +3276763008,3276763327,DE +3276763328,3276763391,SE +3276763392,3276763519,DE +3276763520,3276763551,IT +3276763552,3276763567,CH +3276763568,3276763583,GR +3276763584,3276763647,GB +3276763648,3276763967,DE +3276763968,3276763983,DK +3276763984,3276763991,GB +3276763992,3276763999,BE +3276764000,3276764031,IT +3276764160,3276765183,DE +3276765184,3276766975,GB +3276766976,3276766983,FR +3276766992,3276767015,FR +3276767016,3276767023,DK +3276767024,3276767039,BE +3276767040,3276767079,FR +3276767080,3276767087,GB +3276767088,3276767103,NL +3276767104,3276767231,FR +3276767232,3276767743,ZA +3276767744,3276767807,NL +3276767808,3276767871,DK +3276767872,3276767935,NL +3276767936,3276767967,FR +3276767968,3276767999,AT +3276768000,3276768511,NL +3276768512,3276768767,DE +3276768768,3276768863,ES +3276768864,3276768895,AT +3276768896,3276769023,HU +3276769024,3276769279,DE +3276769280,3276769295,ES +3276769296,3276769311,DE +3276769312,3276769343,CH +3276769344,3276769407,NL +3276769408,3276769919,ES +3276769984,3276770015,AT +3276770016,3276770031,IT +3276770032,3276770047,CH +3276770048,3276770143,ES +3276770144,3276770175,FI +3276770176,3276770239,ES +3276770240,3276770303,DK +3276770304,3276770815,ES +3276770944,3276771135,ES +3276771200,3276771327,ES +3276771328,3276771455,NL +3276771456,3276771583,GB +3276771584,3276772287,NL +3276772288,3276772351,AT +3276772352,3276772567,BE +3276772576,3276773375,BE +3276773376,3276774047,DK +3276774048,3276774079,FI +3276774080,3276774095,DK +3276774112,3276774143,IE +3276774144,3276774271,DK +3276774272,3276774303,DE +3276774304,3276774335,FR +3276774336,3276774399,GB +3276774400,3276774543,SE +3276774544,3276774559,GB +3276774560,3276774591,DE +3276774592,3276774655,CH +3276774656,3276775103,SE +3276775104,3276775167,NL +3276775168,3276775295,SE +3276775296,3276775359,FR +3276775360,3276775391,DK +3276775392,3276775423,DE +3276775424,3276781151,NL +3276781152,3276781247,FR +3276781248,3276781311,BE +3276781312,3276781503,NL +3276781504,3276781567,FR +3276781568,3276782719,BE +3276782784,3276782799,FR +3276782800,3276782815,CZ +3276782816,3276782847,ES +3276782848,3276782975,BE +3276782976,3276783039,GR +3276783040,3276783055,DK +3276783056,3276783071,GB +3276783072,3276783087,PT +3276783088,3276783103,CH +3276783104,3276783615,IT +3276783616,3276784383,FR +3276784640,3276784895,FR +3276784896,3276785151,NO +3276785152,3276785407,IE +3276785408,3276785439,PT +3276785440,3276785455,GR +3276785456,3276785463,GB +3276785464,3276785471,IE +3276785472,3276785535,PT +3276785536,3276785567,BE +3276785568,3276785599,PT +3276785600,3276785607,TR +3276785608,3276785615,PL +3276785616,3276785631,CZ +3276785632,3276785663,IT +3276785664,3276785791,IL +3276785792,3276785823,NL +3276785856,3276785919,GB +3276785920,3276786175,AT +3276786176,3276786431,NO +3276786688,3276786815,HU +3276786816,3276786879,SE +3276786880,3276786911,TR +3276786912,3276786943,BE +3276786944,3276787359,AT +3276787360,3276787391,DE +3276787392,3276787455,BE +3276787456,3276787775,FR +3276787968,3276788735,FR +3276788736,3276788863,IE +3276788864,3276788895,DE +3276788928,3276788991,NL +3276788992,3276789247,NO +3276789248,3276789439,FI +3276789504,3276789567,FR +3276789568,3276789583,ES +3276789584,3276789599,FR +3276789600,3276789615,ES +3276789616,3276789631,NL +3276789632,3276789759,FR +3276789760,3276790015,IT +3276790016,3276790111,ES +3276790112,3276790127,FR +3276790128,3276790143,NL +3276790144,3276790175,IT +3276790176,3276790191,NL +3276790200,3276790207,DE +3276790208,3276790223,NL +3276790224,3276790271,GB +3276790272,3276790527,IE +3276790528,3276790783,HU +3276790784,3276790943,PK +3276790944,3276791007,IT +3276791008,3276791039,NL +3276791040,3276791295,GB +3276791296,3276791327,PT +3276791552,3276792831,GB +3276792832,3276793087,FR +3276793088,3276793279,GB +3276793280,3276793343,IE +3276793344,3276793735,FR +3276793736,3276793743,NL +3276793744,3276793751,BE +3276793752,3276793759,FR +3276793760,3276793791,PL +3276793792,3276793855,FR +3276794112,3276794255,NL +3276794256,3276794271,DE +3276794304,3276794335,DK +3276794336,3276794367,NL +3276794368,3276795903,BE +3276795904,3276797951,AT +3276799104,3276799231,GB +3276799296,3276799359,GB +3276799360,3276799391,NL +3276799392,3276799455,AT +3276799456,3276799471,PL +3276799472,3276799487,NL +3276799488,3276799743,DE +3276799744,3276799775,NL +3276799776,3276799807,GB +3276799808,3276799839,FR +3276799840,3276799871,ES +3276799872,3276799999,NL +3276800000,3276824575,GB +3276824576,3276832767,EE +3276832768,3276834815,PL +3276834816,3276835839,RU +3276835840,3276836351,UA +3276836352,3276836863,RO +3276836864,3276837887,RU +3276837888,3276838911,PL +3276838912,3276840959,FR +3276840960,3276849151,SK +3276849152,3276857343,DE +3276857344,3276857599,RU +3276857600,3276857855,SI +3276857856,3276858111,NL +3276858112,3276858367,KW +3276858368,3276858623,RU +3276858624,3276858879,PL +3276859392,3276859647,UA +3276859648,3276859903,CH +3276859904,3276860159,AT +3276860160,3276860415,CH +3276860416,3276860927,PL +3276860928,3276861183,BE +3276861184,3276861439,DE +3276861440,3276865535,DK +3276865536,3276866559,NL +3276866560,3276868703,GB +3276868704,3276868711,BE +3276868712,3276870719,GB +3276870720,3276870735,IT +3276870736,3276870911,GB +3276870912,3276871679,IT +3276871680,3276873759,GB +3276873760,3276873791,ES +3276873792,3276873983,GB +3276873984,3276874239,ES +3276874240,3276874351,GB +3276874352,3276874367,ES +3276874368,3276874959,GB +3276874960,3276874975,NL +3276874976,3276876279,GB +3276876280,3276876283,DK +3276876284,3276880427,GB +3276880428,3276880431,DK +3276880432,3276881411,GB +3276881412,3276881415,FR +3276881416,3276881811,GB +3276881812,3276881815,FR +3276881816,3276882047,GB +3276882048,3276882687,IT +3276882688,3276883077,GB +3276883078,3276883078,IT +3276883079,3276883639,GB +3276883640,3276883643,IT +3276883644,3276883711,GB +3276883712,3276883839,IT +3276883840,3276884687,GB +3276884688,3276884719,PL +3276884720,3276886363,GB +3276886364,3276886367,DE +3276886368,3276886649,GB +3276886650,3276886650,DE +3276886651,3276886911,GB +3276886912,3276887039,DE +3276887040,3276889087,GB +3276889088,3276889215,IT +3276889216,3276890175,GB +3276890176,3276890191,US +3276890192,3276892287,GB +3276892288,3276892367,IT +3276892368,3276893695,GB +3276893696,3276893951,IT +3276893952,3276897727,GB +3276897728,3276897791,BE +3276897792,3276898671,GB +3276898672,3276898687,CH +3276898688,3276898783,GB +3276898784,3276898799,CH +3276898800,3276899263,GB +3276899264,3276899295,CH +3276899296,3276900207,GB +3276900208,3276900211,CH +3276900212,3276901613,GB +3276901614,3276901614,CH +3276901615,3276902141,GB +3276902142,3276902142,CH +3276902143,3276902367,GB +3276902368,3276902399,CH +3276902400,3276902655,GB +3276902656,3276902911,SE +3276902912,3276903423,GB +3276903424,3276903487,SE +3276903488,3276903551,GB +3276903552,3276903679,SE +3276903680,3276907341,GB +3276907342,3276907342,NL +3276907343,3276908759,GB +3276908760,3276908760,NL +3276908761,3276909831,GB +3276909832,3276909835,NL +3276909836,3276911167,GB +3276911168,3276911199,IT +3276911200,3276911249,GB +3276911250,3276911250,IT +3276911251,3276911679,GB +3276911680,3276911711,IT +3276911712,3276912207,GB +3276912208,3276912215,IT +3276912216,3276912287,GB +3276912288,3276912319,IT +3276912320,3276912383,GB +3276912384,3276912511,IT +3276912512,3276912671,GB +3276912672,3276912687,IT +3276912688,3276912879,GB +3276912880,3276912895,IT +3276912896,3276917231,GB +3276917232,3276917247,FR +3276917248,3276917735,GB +3276917736,3276917739,ES +3276917740,3276919061,GB +3276919062,3276919062,DE +3276919063,3276919375,GB +3276919376,3276919391,DE +3276919392,3276919487,GB +3276919488,3276919535,DE +3276919536,3276922735,GB +3276922736,3276922751,DE +3276922752,3276922879,GB +3276922880,3276924927,FR +3276924928,3276925911,GB +3276925912,3276925919,FR +3276925920,3276925951,GB +3276925952,3276926207,FR +3276926208,3276926683,GB +3276926684,3276926687,FR +3276926688,3276931071,GB +3276931072,3276939263,KZ +3276939264,3276955647,DE +3276955648,3276956159,GB +3276956160,3276958463,ES +3276958464,3276958719,GB +3276958720,3276958975,NL +3276958976,3276959231,GB +3276959232,3276959487,IL +3276959488,3276959743,US +3276959744,3276963071,ES +3276963072,3276963327,GB +3276963328,3276963839,ES +3276963840,3276964351,IL +3276964352,3276964863,RO +3276965376,3276966399,RU +3276966400,3276966911,BH +3276966912,3276968959,RU +3276968960,3276969471,RO +3276969472,3276969983,UA +3276969984,3276970495,DE +3276970496,3276971519,RU +3276971520,3276972031,DE +3276972032,3276980223,PL +3276980224,3276988415,DK +3276988416,3276996607,AT +3276996608,3277062143,FR +3277062144,3277127679,SE +3277127680,3277160447,DK +3277160448,3277176831,NL +3277176832,3277177087,SI +3277177088,3277177343,GB +3277177856,3277178111,PL +3277178368,3277178623,UA +3277178624,3277178879,PL +3277178880,3277179135,ES +3277179392,3277179647,DE +3277179648,3277180159,BE +3277180416,3277180671,RU +3277180928,3277181183,UA +3277181184,3277181439,PL +3277181440,3277181695,DE +3277181696,3277181951,RO +3277181952,3277182207,IT +3277182208,3277182463,RU +3277182464,3277182719,UA +3277182720,3277182975,BG +3277183232,3277183487,DE +3277183744,3277183999,UA +3277184000,3277184255,DE +3277184256,3277184511,PT +3277184512,3277184767,DE +3277185024,3277185279,SA +3277185280,3277185535,RU +3277185792,3277186047,PL +3277186048,3277186303,IT +3277186304,3277186559,DE +3277186560,3277186815,PL +3277186816,3277187071,RU +3277187072,3277187327,GB +3277187584,3277188351,RU +3277188352,3277188607,DE +3277188608,3277188863,RU +3277188864,3277189119,RO +3277189120,3277189375,DE +3277189376,3277189631,PL +3277189632,3277189887,TR +3277189888,3277190143,PL +3277190400,3277190655,GB +3277190656,3277190911,BE +3277190912,3277191167,FR +3277191424,3277191679,PL +3277191680,3277191935,UA +3277191936,3277192191,DK +3277192192,3277192447,PL +3277192448,3277192703,DK +3277192704,3277192959,GB +3277192960,3277193215,TR +3277193216,3277258751,NL +3277258752,3277324287,TR +3277324288,3277324799,RU +3277324800,3277325055,KZ +3277325056,3277325311,RU +3277325312,3277326335,IT +3277326336,3277326847,GB +3277326848,3277327359,AT +3277327360,3277327871,RS +3277327872,3277328383,UA +3277328384,3277328895,RU +3277328896,3277329407,NL +3277329408,3277329919,GB +3277329920,3277330431,RU +3277330944,3277331455,UA +3277331456,3277332479,PL +3277332480,3277332991,NL +3277332992,3277333503,AT +3277333504,3277334015,DK +3277334016,3277334527,RO +3277334528,3277335039,RU +3277335040,3277335551,UA +3277335552,3277336063,DE +3277336064,3277336575,HR +3277336576,3277337087,AT +3277337088,3277337599,PL +3277337600,3277338111,UA +3277338112,3277338623,NO +3277339136,3277339647,RU +3277339648,3277340159,DE +3277340160,3277340671,RU +3277340672,3277341183,RO +3277341184,3277341695,AM +3277341696,3277342207,RU +3277342208,3277342719,GB +3277342720,3277343231,UA +3277343232,3277343743,BG +3277343744,3277344767,UA +3277344768,3277345279,RO +3277345280,3277345791,SI +3277345792,3277346303,FR +3277346304,3277346815,GB +3277346816,3277347327,DE +3277347328,3277347839,PL +3277347840,3277348351,RU +3277348352,3277348863,FR +3277348864,3277349887,RO +3277349888,3277350399,GB +3277350400,3277350911,RU +3277351424,3277351935,NO +3277351936,3277352447,DE +3277352448,3277352959,SE +3277352960,3277353471,RU +3277353472,3277353983,PL +3277353984,3277354495,DE +3277354496,3277355007,GB +3277355008,3277355519,RU +3277355520,3277356031,MK +3277356032,3277356543,UA +3277356544,3277357055,RU +3277357056,3277357567,PL +3277357568,3277358079,SE +3277358080,3277359103,RU +3277359104,3277359615,NL +3277359616,3277360127,UA +3277360128,3277360639,BG +3277360640,3277361151,CZ +3277361152,3277361663,PL +3277362176,3277362687,ES +3277363200,3277363711,ES +3277363712,3277364223,RU +3277364224,3277364735,GB +3277364736,3277365247,UA +3277365248,3277365759,NL +3277365760,3277366271,GR +3277366272,3277366783,CZ +3277366784,3277367295,AT +3277367808,3277368319,RU +3277368320,3277369343,RO +3277369344,3277369855,CY +3277369856,3277370367,RU +3277370368,3277370623,PL +3277370624,3277370879,RU +3277370880,3277371391,RO +3277371392,3277371903,RU +3277371904,3277372415,PL +3277372416,3277372927,IR +3277373440,3277373951,RU +3277373952,3277374463,FR +3277374464,3277375999,RU +3277376000,3277376511,NL +3277377536,3277378047,RU +3277378560,3277379071,HR +3277379072,3277379583,UZ +3277379584,3277380095,RS +3277380608,3277381119,RU +3277381120,3277381631,KW +3277381632,3277382143,RU +3277382656,3277383167,GB +3277383680,3277384191,PL +3277384704,3277385215,GB +3277385216,3277385727,AT +3277385728,3277386239,RU +3277386240,3277386751,UA +3277386752,3277387263,SA +3277387264,3277388287,RU +3277388288,3277388543,RO +3277388544,3277388799,HU +3277388800,3277389311,RU +3277389312,3277389823,AM +3277389824,3277394943,GB +3277394944,3277395455,US +3277395456,3277403135,GB +3277403136,3277403215,FR +3277403216,3277403231,GB +3277403232,3277403311,FR +3277403312,3277403327,GB +3277403328,3277403359,FR +3277403360,3277403375,GB +3277403376,3277403455,FR +3277403456,3277403471,AT +3277403472,3277403487,FR +3277403488,3277403647,GB +3277403648,3277403807,ES +3277403808,3277404159,GB +3277404160,3277404415,DE +3277404416,3277404671,IT +3277404672,3277404735,CH +3277404736,3277404927,GB +3277404928,3277404975,NL +3277404976,3277405183,GB +3277405184,3277405263,SE +3277405264,3277405439,GB +3277405440,3277405471,DE +3277405472,3277452639,GB +3277452640,3277452647,IE +3277452648,3277452655,DK +3277452656,3277455359,GB +3277455360,3277463551,DE +3277463552,3277471743,US +3277471744,3277480447,GB +3277480960,3277481471,DK +3277481472,3277481983,PL +3277481984,3277482495,SE +3277482496,3277483007,PL +3277483008,3277483519,IT +3277483520,3277484031,RO +3277484032,3277484543,CH +3277486080,3277486591,GB +3277487104,3277487615,RO +3277487616,3277488127,PL +3277488128,3277504511,RU +3277504512,3277520895,DE +3277520896,3277553663,SK +3277553664,3277586431,RU +3277586432,3277666815,GB +3277666816,3277667327,US +3277667328,3277676543,DE +3277676544,3277680639,FR +3277680640,3277684735,US +3277684736,3277685247,RU +3277685248,3277685759,DE +3277685760,3277686271,IE +3277686272,3277686783,PL +3277686784,3277687295,RO +3277687296,3277687807,UA +3277687808,3277688319,RO +3277688320,3277688831,PL +3277688832,3277689343,RU +3277689344,3277689855,AT +3277689856,3277690879,RU +3277690880,3277691391,KZ +3277691392,3277691903,UA +3277691904,3277692415,GB +3277692416,3277692927,DE +3277693440,3277693951,PL +3277693952,3277694463,RU +3277694464,3277694975,DE +3277694976,3277695487,IT +3277695488,3277695999,ES +3277696000,3277696511,UA +3277696512,3277697023,AT +3277697536,3277698047,PL +3277698048,3277698559,RU +3277698560,3277699071,DE +3277699584,3277700607,RU +3277700608,3277701119,UA +3277701120,3277701631,DK +3277701632,3277702143,AT +3277702656,3277703679,DE +3277703680,3277704191,PL +3277704192,3277704703,UA +3277704704,3277705215,RU +3277705728,3277706239,ES +3277706240,3277706751,UA +3277707264,3277707775,CZ +3277707776,3277708287,MD +3277708288,3277708799,AT +3277708800,3277709311,PL +3277709312,3277709823,NL +3277709824,3277710335,GB +3277710336,3277710847,RU +3277710848,3277711359,PL +3277711360,3277711871,NO +3277711872,3277712383,IL +3277712384,3277712895,PL +3277712896,3277713407,NL +3277713408,3277713919,RU +3277713920,3277714943,DE +3277714944,3277715967,RU +3277715968,3277716479,PL +3277716480,3277716991,SE +3277716992,3277717503,IT +3277717504,3277725695,YE +3277725696,3277730157,CH +3277730158,3277730158,GB +3277730159,3277730559,CH +3277730560,3277730563,GB +3277730564,3277731103,CH +3277731104,3277731119,DE +3277731120,3277731122,CH +3277731123,3277731123,DE +3277731124,3277731223,CH +3277731224,3277731231,DE +3277731232,3277731247,CH +3277731248,3277731255,DE +3277731256,3277732207,CH +3277732208,3277732223,GB +3277732224,3277733887,CH +3277733888,3277742079,DE +3277742080,3277745151,FI +3277745152,3277746175,CH +3277746176,3277750271,GB +3277750272,3277766655,IT +3277766656,3277774847,PL +3277774848,3277783039,RU +3277783040,3277815807,BE +3277816064,3277816319,PL +3277816576,3277816831,GB +3277816832,3277817087,CH +3277817088,3277817343,GB +3277817600,3277817855,FR +3277817856,3277818111,BE +3277818112,3277818367,DE +3277818368,3277818623,CY +3277818624,3277818879,UA +3277818880,3277819135,SE +3277819136,3277819391,CH +3277819392,3277819647,IT +3277819648,3277819903,GB +3277819904,3277820159,PL +3277820160,3277820415,RO +3277820416,3277820671,DE +3277820672,3277820927,UA +3277820928,3277821183,CH +3277821184,3277821439,TR +3277821440,3277821695,NL +3277821696,3277821951,UA +3277821952,3277822207,RO +3277822208,3277822463,ES +3277822464,3277822719,PL +3277822976,3277823231,ES +3277823232,3277823487,UA +3277823488,3277823743,SI +3277823744,3277823999,UA +3277824000,3277824255,TR +3277824256,3277824511,SI +3277824512,3277825023,AT +3277825024,3277825279,PL +3277825280,3277825535,UA +3277825536,3277826047,RO +3277826048,3277826303,FR +3277826304,3277826815,PL +3277826816,3277827071,UA +3277827072,3277827327,DK +3277827328,3277827583,SI +3277827584,3277828095,NL +3277828096,3277828351,PL +3277828352,3277828607,NL +3277828608,3277828863,RO +3277828864,3277829119,TR +3277829120,3277829375,RO +3277829376,3277829631,DK +3277829632,3277829887,PL +3277829888,3277830143,IL +3277830144,3277830399,SE +3277830656,3277830911,PL +3277830912,3277831167,GB +3277831168,3277831423,PL +3277831424,3277831679,UA +3277831680,3277832191,IE +3277833216,3277833727,BE +3277833728,3277834239,NL +3277834240,3277836287,UA +3277836288,3277836799,FI +3277836800,3277837311,UA +3277837312,3277839103,RU +3277839104,3277839359,AE +3277839360,3277839871,DE +3277839872,3277840383,UA +3277840384,3277840895,FR +3277840896,3277841407,GR +3277841408,3277841919,RO +3277841920,3277842431,IT +3277842432,3277842943,UA +3277842944,3277843455,PL +3277843456,3277843967,PT +3277843968,3277845503,DK +3277845504,3277847039,NL +3277847552,3277848063,RU +3277848064,3277848575,RO +3277848576,3277856767,AT +3277856768,3277864959,DE +3277864960,3277873151,RU +3277873152,3277881343,NL +3277881344,3277886463,IT +3277886464,3277887487,IQ +3277887488,3277889535,IT +3277889536,3277897727,RU +3277897728,3277905919,IT +3277905920,3277914111,BG +3277914112,3277946879,GR +3277946880,3277963263,DK +3277963264,3277979647,GB +3277979648,3277987839,SK +3277987840,3278004223,RU +3278004224,3278012415,FR +3278012416,3278020607,SK +3278020608,3278028799,RU +3278028800,3278036991,DE +3278036992,3278045183,FR +3278045184,3278061567,GB +3278061568,3278065663,NL +3278065664,3278110719,GB +3278110720,3278176255,SE +3278176256,3278241791,FR +3278241792,3278307327,GB +3278307328,3278372863,IT +3278372864,3278635007,GB +3278635008,3278766079,NL +3278767104,3278767615,RO +3278767616,3278768127,UA +3278768128,3278769151,GB +3278769152,3278769663,FR +3278769664,3278770175,DE +3278770176,3278770687,DK +3278770688,3278771711,DE +3278772224,3278772735,BG +3278772736,3278773247,DE +3278773248,3278773759,NO +3278773760,3278774271,GB +3278774272,3278774783,RU +3278774784,3278775295,FR +3278775296,3278775807,GB +3278775808,3278776319,IR +3278776320,3278776831,IL +3278776832,3278777343,DE +3278777344,3278777855,SE +3278777856,3278778367,RU +3278778368,3278779391,PL +3278779392,3278779903,RU +3278779904,3278780415,BE +3278780416,3278780927,UA +3278780928,3278781439,GB +3278781440,3278781951,DE +3278781952,3278782463,RU +3278782464,3278790095,GB +3278790096,3278790111,ES +3278790112,3278790655,GB +3278790656,3278793727,IT +3278793728,3278794751,GB +3278794752,3278807039,IT +3278807040,3278815231,GB +3278815232,3278823423,AT +3278823424,3278831615,FR +3278831616,3278897151,HU +3278897152,3278913535,GB +3278913536,3278921727,CH +3278921728,3278929919,RU +3278929920,3278938111,TR +3278938112,3278938151,DE +3278938152,3278938155,GB +3278938156,3278938159,DE +3278938160,3278938163,ES +3278938164,3278938171,DE +3278938172,3278938175,NL +3278938176,3278938179,FR +3278938180,3278938183,NL +3278938184,3278938191,DE +3278938192,3278938195,ES +3278938196,3278938199,NL +3278938200,3278938203,CH +3278938204,3278938207,DE +3278938208,3278938215,IT +3278938216,3278938227,DE +3278938228,3278938231,FR +3278938232,3278938235,DE +3278938236,3278938239,FR +3278938240,3278938243,LI +3278938244,3278938247,IT +3278938248,3278938251,AT +3278938252,3278938259,DE +3278938260,3278938263,CH +3278938264,3278938267,DE +3278938268,3278938275,FR +3278938276,3278938279,NL +3278938280,3278938283,AT +3278938284,3278938287,DE +3278938288,3278938291,ES +3278938292,3278938299,DE +3278938300,3278938303,ES +3278938304,3278938307,DE +3278938308,3278938311,GB +3278938312,3278938315,DE +3278938316,3278938323,FR +3278938324,3278938335,DE +3278938336,3278938339,CH +3278938340,3278938343,DE +3278938344,3278938347,NL +3278938348,3278938351,FR +3278938352,3278938359,DE +3278938360,3278938363,DK +3278938364,3278938367,BH +3278938368,3278938375,FR +3278938376,3278938399,DE +3278938400,3278938403,AT +3278938404,3278938407,DE +3278938408,3278938411,CH +3278938412,3278938415,DE +3278938416,3278938419,CH +3278938420,3278938423,GB +3278938424,3278938427,DE +3278938428,3278938431,FR +3278938432,3278938439,DE +3278938440,3278938443,IT +3278938444,3278938447,DE +3278938448,3278938451,IT +3278938452,3278938455,DE +3278938456,3278938459,ES +3278938460,3278938463,FR +3278938464,3278938487,DE +3278938488,3278938491,NL +3278938492,3278938495,ES +3278938496,3278938499,NL +3278938500,3278938519,DE +3278938520,3278938523,NL +3278938524,3278938527,FR +3278938528,3278938531,NO +3278938532,3278938563,DE +3278938564,3278938567,FR +3278938568,3278938583,DE +3278938584,3278938587,GB +3278938588,3278938591,CH +3278938592,3278938595,DE +3278938596,3278938599,DK +3278938600,3278938607,DE +3278938608,3278938611,AT +3278938612,3278938615,NL +3278938616,3278938619,DK +3278938620,3278938627,FR +3278938628,3278938631,DE +3278938632,3278938635,NL +3278938636,3278938639,GB +3278938640,3278938643,DE +3278938644,3278938647,GB +3278938648,3278938659,DE +3278938660,3278938663,CH +3278938664,3278938667,GB +3278938668,3278938675,DE +3278938676,3278938679,FR +3278938680,3278938695,DE +3278938696,3278938699,IT +3278938700,3278938703,ES +3278938704,3278938707,FR +3278938708,3278938719,DE +3278938720,3278938723,NL +3278938724,3278938727,BE +3278938728,3278938731,ES +3278938732,3278938735,CH +3278938736,3278938739,DE +3278938740,3278938743,FR +3278938744,3278938751,DE +3278938752,3278938755,CH +3278938756,3278938759,DE +3278938760,3278938763,GB +3278938764,3278938767,DE +3278938768,3278938771,GB +3278938772,3278938775,SE +3278938776,3278938779,GB +3278938780,3278938783,IT +3278938784,3278938787,BE +3278938788,3278938791,ES +3278938792,3278938803,DE +3278938804,3278938807,IT +3278938808,3278938815,GB +3278938816,3278938831,DE +3278938832,3278938835,IT +3278938836,3278938839,FR +3278938840,3278938863,DE +3278938864,3278938871,IT +3278938872,3278938875,DE +3278938876,3278938879,NL +3278938880,3278938887,FR +3278938888,3278938891,ES +3278938892,3278938895,DE +3278938896,3278938903,FR +3278938904,3278938911,GB +3278938912,3278938927,DE +3278938928,3278938931,GB +3278938932,3278938943,DE +3278938944,3278938947,IT +3278938948,3278938951,DE +3278938952,3278938955,FR +3278938956,3278938967,DE +3278938968,3278938971,BE +3278938972,3278938975,DE +3278938976,3278938979,NL +3278938980,3278938987,FR +3278938988,3278938991,AT +3278938992,3278938995,FR +3278938996,3278938999,DE +3278939000,3278939003,ES +3278939004,3278939007,NL +3278939008,3278939011,DE +3278939012,3278939015,RU +3278939016,3278939047,DE +3278939048,3278939055,FR +3278939056,3278939075,DE +3278939076,3278939079,CH +3278939080,3278939083,DE +3278939084,3278939087,IT +3278939088,3278939091,IS +3278939092,3278939095,DE +3278939096,3278939099,IT +3278939100,3278939103,DE +3278939104,3278939107,CH +3278939108,3278939111,FR +3278939112,3278939131,DE +3278939132,3278939135,NL +3278939136,3278939147,US +3278939148,3278939151,AR +3278939152,3278939155,ES +3278939156,3278939195,US +3278939196,3278939199,CL +3278939200,3278939259,US +3278939260,3278939263,BR +3278939264,3278939271,AR +3278939272,3278939279,US +3278939280,3278939283,CO +3278939284,3278939291,US +3278939292,3278939295,AR +3278939296,3278939307,US +3278939308,3278939311,MX +3278939312,3278939315,US +3278939316,3278939319,AR +3278939320,3278939323,US +3278939324,3278939327,CA +3278939328,3278939331,US +3278939332,3278939335,BR +3278939336,3278939339,CA +3278939340,3278939351,US +3278939352,3278939355,BR +3278939356,3278939379,US +3278939380,3278939383,BR +3278939384,3278939391,US +3278939392,3278939403,DE +3278939404,3278939407,CH +3278939408,3278939419,DE +3278939420,3278939423,IE +3278939424,3278939439,DE +3278939440,3278939443,IT +3278939444,3278939459,DE +3278939460,3278939463,DK +3278939464,3278939467,CY +3278939468,3278939471,DE +3278939472,3278939475,PL +3278939476,3278939479,BE +3278939480,3278939483,DE +3278939484,3278939491,NL +3278939492,3278939495,DE +3278939496,3278939499,CH +3278939500,3278939515,DE +3278939516,3278939523,NL +3278939524,3278939527,LU +3278939528,3278939531,FR +3278939532,3278939535,DE +3278939536,3278939539,BE +3278939540,3278939571,DE +3278939572,3278939575,ES +3278939576,3278939579,DE +3278939580,3278939583,NL +3278939584,3278939587,IT +3278939588,3278939591,LU +3278939592,3278939595,DE +3278939596,3278939599,NL +3278939600,3278939603,GB +3278939604,3278939607,DE +3278939608,3278939611,DK +3278939612,3278939615,FR +3278939616,3278939631,DE +3278939632,3278939635,GB +3278939636,3278939639,DK +3278939640,3278939647,DE +3278939648,3278939651,FR +3278939652,3278939663,DE +3278939664,3278939667,IT +3278939668,3278939743,DE +3278939744,3278939747,GB +3278939748,3278939751,DE +3278939752,3278939755,GR +3278939756,3278939759,DE +3278939760,3278939763,FR +3278939764,3278939783,DE +3278939784,3278939787,BE +3278939788,3278939803,DE +3278939804,3278939807,GB +3278939808,3278939823,DE +3278939824,3278939827,HU +3278939828,3278939835,DE +3278939836,3278939839,FR +3278939840,3278939859,DE +3278939860,3278939863,GB +3278939864,3278939867,IT +3278939868,3278939871,DE +3278939872,3278939875,ES +3278939876,3278939879,IT +3278939880,3278939887,DE +3278939888,3278939891,PL +3278939892,3278939899,ES +3278939900,3278939903,IT +3278939904,3278939907,HK +3278939908,3278939911,MY +3278939912,3278939919,DE +3278939920,3278939923,SG +3278939924,3278939927,DE +3278939928,3278939931,SG +3278939932,3278939935,IN +3278939936,3278939939,MY +3278939940,3278939947,DE +3278939948,3278939951,SG +3278939952,3278939955,MY +3278939956,3278939963,DE +3278939964,3278939967,MY +3278939968,3278939971,TW +3278939972,3278939975,MY +3278939976,3278939991,DE +3278939992,3278939995,SG +3278939996,3278939999,DE +3278940000,3278940007,SG +3278940008,3278940015,DE +3278940016,3278940043,SG +3278940044,3278940047,DE +3278940048,3278940059,SG +3278940060,3278940067,CN +3278940068,3278940071,TW +3278940072,3278940079,DE +3278940080,3278940083,SG +3278940084,3278940087,DE +3278940088,3278940091,MY +3278940092,3278940095,SG +3278940096,3278940099,DE +3278940100,3278940103,SG +3278940104,3278940107,MY +3278940108,3278940111,SG +3278940112,3278940115,DE +3278940116,3278940127,SG +3278940128,3278940163,DE +3278940164,3278940167,CH +3278940168,3278940171,DE +3278940172,3278940175,FR +3278940176,3278940179,GB +3278940180,3278940183,CH +3278940184,3278940187,DE +3278940188,3278940195,GB +3278940196,3278940215,DE +3278940216,3278940219,NL +3278940220,3278940223,DE +3278940224,3278940227,CH +3278940228,3278940231,DE +3278940232,3278940235,CH +3278940236,3278940239,ES +3278940240,3278940247,DE +3278940248,3278940251,FR +3278940252,3278940255,IT +3278940256,3278940259,BE +3278940260,3278940263,DE +3278940264,3278940267,ES +3278940268,3278940275,DE +3278940276,3278940279,GB +3278940280,3278940283,CH +3278940284,3278940291,NL +3278940292,3278940295,DE +3278940296,3278940299,IT +3278940300,3278940311,DE +3278940312,3278940315,IT +3278940316,3278940319,DE +3278940320,3278940323,NL +3278940324,3278940327,ES +3278940328,3278940335,DE +3278940336,3278940339,NL +3278940340,3278940347,DE +3278940348,3278940351,GB +3278940352,3278940355,DE +3278940356,3278940359,NL +3278940360,3278940363,DE +3278940364,3278940367,IT +3278940368,3278940371,FR +3278940372,3278940375,GB +3278940376,3278940379,PT +3278940380,3278940383,FR +3278940384,3278940387,NL +3278940388,3278940391,IE +3278940392,3278940395,FR +3278940396,3278940403,DE +3278940404,3278940407,FR +3278940408,3278940411,IT +3278940412,3278940423,DE +3278940424,3278940427,CH +3278940428,3278940431,DE +3278940432,3278940435,CH +3278940436,3278940439,DE +3278940440,3278940443,CH +3278940444,3278940447,DE +3278940448,3278940451,GB +3278940452,3278940463,DE +3278940464,3278940467,FR +3278940468,3278940471,DE +3278940472,3278940475,ES +3278940476,3278940479,FR +3278940480,3278940483,CH +3278940484,3278940487,FR +3278940488,3278940491,ES +3278940492,3278940495,IT +3278940496,3278940499,NL +3278940500,3278940503,FR +3278940504,3278940507,DK +3278940508,3278940511,FR +3278940512,3278940515,DE +3278940516,3278940523,CH +3278940524,3278940531,ES +3278940532,3278940535,DE +3278940536,3278940539,CH +3278940540,3278940543,ES +3278940544,3278940551,DE +3278940552,3278940555,GB +3278940556,3278940563,DE +3278940564,3278940571,FR +3278940572,3278940579,CH +3278940580,3278940587,DE +3278940588,3278940591,IT +3278940592,3278940595,FR +3278940596,3278940599,BE +3278940600,3278940603,DE +3278940604,3278940607,FR +3278940608,3278940611,ES +3278940612,3278940615,PT +3278940616,3278940623,DE +3278940624,3278940631,IT +3278940632,3278940635,GB +3278940636,3278940639,BE +3278940640,3278940643,CH +3278940644,3278940647,IT +3278940648,3278940651,DE +3278940652,3278940655,FR +3278940656,3278940663,DE +3278940664,3278940667,FR +3278940668,3278940683,DE +3278940684,3278940691,NL +3278940692,3278940695,SE +3278940696,3278940707,DE +3278940708,3278940711,ES +3278940712,3278940715,BE +3278940716,3278940719,DE +3278940720,3278940723,ES +3278940724,3278940727,FR +3278940728,3278940731,DE +3278940732,3278940739,FR +3278940740,3278940743,GB +3278940744,3278940747,ES +3278940748,3278940751,DE +3278940752,3278940759,FR +3278940760,3278940763,NL +3278940764,3278940767,DE +3278940768,3278940771,GB +3278940772,3278940783,DE +3278940784,3278940787,CH +3278940788,3278940791,GB +3278940792,3278940795,NL +3278940796,3278940803,DE +3278940804,3278940807,DK +3278940808,3278940815,DE +3278940816,3278940819,IT +3278940820,3278940835,DE +3278940836,3278940839,IT +3278940840,3278940847,DE +3278940848,3278940851,CH +3278940852,3278940859,DE +3278940860,3278940863,NL +3278940864,3278940867,CH +3278940868,3278940871,GB +3278940872,3278940875,DE +3278940876,3278940879,IT +3278940880,3278940883,CH +3278940884,3278940887,ES +3278940888,3278940891,BE +3278940892,3278940899,DE +3278940900,3278940903,FR +3278940904,3278940911,ES +3278940912,3278940919,DE +3278940920,3278940923,PT +3278940924,3278940931,DE +3278940932,3278940935,NL +3278940936,3278940939,ES +3278940940,3278940943,FR +3278940944,3278940947,NL +3278940948,3278940951,FR +3278940952,3278940955,IT +3278940956,3278940959,DK +3278940960,3278940963,FR +3278940964,3278940967,IT +3278940968,3278940983,DE +3278940984,3278940987,IT +3278940988,3278940991,NL +3278940992,3278940999,DE +3278941000,3278941003,NL +3278941004,3278941023,DE +3278941024,3278941027,IT +3278941028,3278941031,FR +3278941032,3278941035,DE +3278941036,3278941039,IT +3278941040,3278941043,DE +3278941044,3278941047,FR +3278941048,3278941051,ES +3278941052,3278941059,DE +3278941060,3278941063,GB +3278941064,3278941067,IT +3278941068,3278941071,ES +3278941072,3278941083,DE +3278941084,3278941087,GB +3278941088,3278941095,DE +3278941096,3278941099,FR +3278941100,3278941107,DE +3278941108,3278941111,DK +3278941112,3278941119,FR +3278941120,3278941127,DE +3278941128,3278941131,BE +3278941132,3278941135,NL +3278941136,3278941143,DE +3278941144,3278941151,IT +3278941152,3278941155,DE +3278941156,3278941159,SE +3278941160,3278941167,DE +3278941168,3278941171,GB +3278941172,3278941175,AT +3278941176,3278941179,IT +3278941180,3278941183,FR +3278941184,3278941191,US +3278941192,3278941195,BR +3278941196,3278941215,US +3278941216,3278941219,BR +3278941220,3278941243,US +3278941244,3278941247,CO +3278941248,3278941255,US +3278941256,3278941259,MX +3278941260,3278941279,US +3278941280,3278941283,BR +3278941284,3278941287,AR +3278941288,3278941303,US +3278941304,3278941307,CO +3278941308,3278941319,US +3278941320,3278941323,CA +3278941324,3278941331,US +3278941332,3278941335,BR +3278941336,3278941343,US +3278941344,3278941347,AR +3278941348,3278941371,US +3278941372,3278941375,CA +3278941376,3278941399,US +3278941400,3278941403,VE +3278941404,3278941407,BR +3278941408,3278941419,US +3278941420,3278941423,DE +3278941424,3278941427,CL +3278941428,3278941431,PE +3278941432,3278941439,US +3278941440,3278941443,AR +3278941444,3278941455,US +3278941456,3278941459,JM +3278941460,3278941475,US +3278941476,3278941479,BR +3278941480,3278941491,US +3278941492,3278941495,MX +3278941496,3278941499,US +3278941500,3278941503,CA +3278941504,3278941587,US +3278941588,3278941591,DE +3278941592,3278941595,US +3278941596,3278941599,PE +3278941600,3278941615,US +3278941616,3278941619,CA +3278941620,3278941639,US +3278941640,3278941643,BR +3278941644,3278941651,US +3278941652,3278941655,VE +3278941656,3278941659,US +3278941660,3278941663,BR +3278941664,3278941667,CA +3278941668,3278941671,US +3278941672,3278941675,VE +3278941676,3278941691,US +3278941692,3278941695,MX +3278941696,3278941735,US +3278941736,3278941739,CA +3278941740,3278941743,US +3278941744,3278941747,CA +3278941748,3278941819,US +3278941820,3278941823,CL +3278941824,3278941847,US +3278941848,3278941855,AR +3278941856,3278941891,US +3278941892,3278941895,CA +3278941896,3278941911,US +3278941912,3278941915,MX +3278941916,3278941943,US +3278941944,3278941947,CO +3278941948,3278941951,US +3278941952,3278941955,GB +3278941956,3278941959,FR +3278941960,3278941963,DE +3278941964,3278941971,GB +3278941972,3278941979,DE +3278941980,3278941983,ES +3278941984,3278941987,DE +3278941988,3278941995,FR +3278941996,3278941999,ES +3278942000,3278942015,DE +3278942016,3278942019,FR +3278942020,3278942023,DE +3278942024,3278942027,FR +3278942028,3278942031,CH +3278942032,3278942035,GR +3278942036,3278942039,CH +3278942040,3278942043,ES +3278942044,3278942055,DE +3278942056,3278942059,ES +3278942060,3278942063,DE +3278942064,3278942071,ES +3278942072,3278942075,FR +3278942076,3278942083,DE +3278942084,3278942087,BE +3278942088,3278942091,DE +3278942092,3278942095,BE +3278942096,3278942099,PL +3278942100,3278942103,GB +3278942104,3278942107,CH +3278942108,3278942111,DE +3278942112,3278942115,FR +3278942116,3278942119,DE +3278942120,3278942123,GB +3278942124,3278942127,AT +3278942128,3278942131,DE +3278942132,3278942135,GB +3278942136,3278942139,UA +3278942140,3278942143,NL +3278942144,3278942147,GB +3278942148,3278942155,DE +3278942156,3278942159,FR +3278942160,3278942163,DE +3278942164,3278942167,IT +3278942168,3278942171,CH +3278942172,3278942179,DE +3278942180,3278942183,FR +3278942184,3278942203,DE +3278942204,3278942207,CH +3278942208,3278942211,TW +3278942212,3278942443,DE +3278942444,3278942447,NZ +3278942448,3278942463,DE +3278942464,3278942467,SG +3278942468,3278942471,MY +3278942472,3278942479,DE +3278942480,3278942483,SG +3278942484,3278942487,DE +3278942488,3278942491,IN +3278942492,3278942495,MY +3278942496,3278942499,DE +3278942500,3278942507,MY +3278942508,3278942511,TH +3278942512,3278942515,SG +3278942516,3278942519,DE +3278942520,3278942523,IN +3278942524,3278942527,DE +3278942528,3278942531,IN +3278942532,3278942551,DE +3278942552,3278942555,TW +3278942556,3278942559,IN +3278942560,3278942563,DE +3278942564,3278942571,MY +3278942572,3278942575,IN +3278942576,3278942591,DE +3278942592,3278942595,TW +3278942596,3278942599,DE +3278942600,3278942603,SG +3278942604,3278942607,TW +3278942608,3278942615,DE +3278942616,3278942627,SG +3278942628,3278942635,MY +3278942636,3278942639,SG +3278942640,3278942651,DE +3278942652,3278942655,MY +3278942656,3278942659,DE +3278942660,3278942667,SG +3278942668,3278942671,DE +3278942672,3278942675,SG +3278942676,3278942679,DE +3278942680,3278942683,TW +3278942684,3278942687,DE +3278942688,3278942691,SG +3278942692,3278942703,DE +3278942704,3278942707,MY +3278942708,3278942719,SG +3278942720,3278942721,DE +3278942722,3278942722,GB +3278942723,3278942724,DE +3278942725,3278942725,GB +3278942726,3278942726,IT +3278942727,3278942727,DE +3278942728,3278942728,CH +3278942729,3278942730,BE +3278942731,3278942731,DE +3278942732,3278942732,ES +3278942733,3278942733,DE +3278942734,3278942734,GB +3278942735,3278942735,DE +3278942736,3278942736,IT +3278942737,3278942739,DE +3278942740,3278942740,NL +3278942741,3278942741,GB +3278942742,3278942742,DE +3278942743,3278942743,ES +3278942744,3278942749,DE +3278942750,3278942750,IT +3278942751,3278942751,FR +3278942752,3278942752,CH +3278942753,3278942754,DE +3278942755,3278942755,GB +3278942756,3278942756,DE +3278942757,3278942757,GB +3278942758,3278942759,IT +3278942760,3278942761,DE +3278942762,3278942762,GB +3278942763,3278942763,NL +3278942764,3278942764,FR +3278942765,3278942765,CH +3278942766,3278942766,PL +3278942767,3278942767,FR +3278942768,3278942768,NO +3278942769,3278942769,GB +3278942770,3278942773,DE +3278942774,3278942774,CH +3278942775,3278942775,FR +3278942776,3278942776,DE +3278942777,3278942778,GB +3278942779,3278942779,SE +3278942780,3278942784,DE +3278942785,3278942785,GR +3278942786,3278942786,SI +3278942787,3278942789,DE +3278942790,3278942790,ES +3278942791,3278942791,IT +3278942792,3278942792,US +3278942793,3278942795,DE +3278942796,3278942796,IT +3278942797,3278942797,GB +3278942798,3278942798,DE +3278942799,3278942799,IT +3278942800,3278942800,FR +3278942801,3278942803,DE +3278942804,3278942804,IT +3278942805,3278942805,DE +3278942806,3278942806,BE +3278942807,3278942807,AT +3278942808,3278942809,DE +3278942810,3278942810,ES +3278942811,3278942811,NL +3278942812,3278942813,DE +3278942814,3278942814,CH +3278942815,3278942815,DE +3278942816,3278942816,AT +3278942817,3278942817,FR +3278942818,3278942818,DK +3278942819,3278942819,DE +3278942820,3278942820,IT +3278942821,3278942824,DE +3278942825,3278942825,NL +3278942826,3278942826,RU +3278942827,3278942827,FR +3278942828,3278942828,ES +3278942829,3278942830,DE +3278942831,3278942831,CH +3278942832,3278942832,IT +3278942833,3278942833,DE +3278942834,3278942834,NL +3278942835,3278942835,AT +3278942836,3278942837,DE +3278942838,3278942838,ES +3278942839,3278942839,FR +3278942840,3278942843,DE +3278942844,3278942844,ES +3278942845,3278942850,DE +3278942851,3278942851,HU +3278942852,3278942852,DE +3278942853,3278942853,ES +3278942854,3278942854,GB +3278942855,3278942857,DE +3278942858,3278942858,IT +3278942859,3278942860,DE +3278942861,3278942861,FR +3278942862,3278942863,DE +3278942864,3278942864,ES +3278942865,3278942865,GB +3278942866,3278942867,NL +3278942868,3278942869,DE +3278942870,3278942870,CH +3278942871,3278942871,IS +3278942872,3278942872,DE +3278942873,3278942873,IT +3278942874,3278942875,DE +3278942876,3278942876,PL +3278942877,3278942878,DE +3278942879,3278942879,DK +3278942880,3278942881,DE +3278942882,3278942882,CH +3278942883,3278942883,GB +3278942884,3278942889,DE +3278942890,3278942890,ES +3278942891,3278942894,DE +3278942895,3278942895,NL +3278942896,3278942896,DE +3278942897,3278942897,CH +3278942898,3278942899,NL +3278942900,3278942903,DE +3278942904,3278942904,BE +3278942905,3278942905,IE +3278942906,3278942907,DE +3278942908,3278942908,GB +3278942909,3278942910,DE +3278942911,3278942911,IT +3278942912,3278942913,DE +3278942914,3278942914,CH +3278942915,3278942922,DE +3278942923,3278942923,NL +3278942924,3278942924,DE +3278942925,3278942925,GB +3278942926,3278942930,DE +3278942931,3278942931,CH +3278942932,3278942932,NL +3278942933,3278942933,BE +3278942934,3278942934,DE +3278942935,3278942936,NL +3278942937,3278942937,DE +3278942938,3278942938,CH +3278942939,3278942940,DE +3278942941,3278942941,IT +3278942942,3278942942,DE +3278942943,3278942944,NL +3278942945,3278942946,DE +3278942947,3278942947,BE +3278942948,3278942948,AT +3278942949,3278942950,DE +3278942951,3278942951,IT +3278942952,3278942957,DE +3278942958,3278942958,CH +3278942959,3278942961,DE +3278942962,3278942963,NL +3278942964,3278942967,DE +3278942968,3278942968,NL +3278942969,3278942969,AT +3278942970,3278942970,ES +3278942971,3278942971,IT +3278942972,3278942978,DE +3278942979,3278942979,FR +3278942980,3278942980,IT +3278942981,3278942984,DE +3278942985,3278942985,ES +3278942986,3278942986,CH +3278942987,3278942987,BE +3278942988,3278942988,DE +3278942989,3278942990,CH +3278942991,3278942992,DE +3278942993,3278942993,GB +3278942994,3278942994,CH +3278942995,3278943002,DE +3278943003,3278943003,CH +3278943004,3278943005,DE +3278943006,3278943006,FR +3278943007,3278943007,DE +3278943008,3278943008,IT +3278943009,3278943009,DE +3278943010,3278943010,NL +3278943011,3278943011,DE +3278943012,3278943012,CZ +3278943013,3278943013,IT +3278943014,3278943014,DE +3278943015,3278943016,ES +3278943017,3278943017,FR +3278943018,3278943018,CH +3278943019,3278943019,DE +3278943020,3278943020,CH +3278943021,3278943021,BE +3278943022,3278943022,ES +3278943023,3278943023,BE +3278943024,3278943024,FR +3278943025,3278943025,DE +3278943026,3278943026,DK +3278943027,3278943027,DE +3278943028,3278943029,GB +3278943030,3278943030,ES +3278943031,3278943031,NL +3278943032,3278943032,FR +3278943033,3278943034,DE +3278943035,3278943035,ES +3278943036,3278943036,DE +3278943037,3278943037,FR +3278943038,3278943039,DE +3278943040,3278943040,IT +3278943041,3278943041,DE +3278943042,3278943042,BE +3278943043,3278943043,SI +3278943044,3278943044,FR +3278943045,3278943048,DE +3278943049,3278943049,GB +3278943050,3278943050,IT +3278943051,3278943056,DE +3278943057,3278943057,CH +3278943058,3278943058,DE +3278943059,3278943059,CH +3278943060,3278943065,DE +3278943066,3278943066,GB +3278943067,3278943069,DE +3278943070,3278943070,PL +3278943071,3278943073,DE +3278943074,3278943074,ES +3278943075,3278943076,FR +3278943077,3278943077,DE +3278943078,3278943079,CH +3278943080,3278943080,BE +3278943081,3278943081,DE +3278943082,3278943082,CH +3278943083,3278943084,DE +3278943085,3278943085,NL +3278943086,3278943087,DE +3278943088,3278943088,NL +3278943089,3278943090,DE +3278943091,3278943091,IT +3278943092,3278943092,ES +3278943093,3278943096,DE +3278943097,3278943097,BE +3278943098,3278943099,DE +3278943100,3278943100,SE +3278943101,3278943101,DE +3278943102,3278943102,ZA +3278943103,3278943105,DE +3278943106,3278943106,FR +3278943107,3278943107,DE +3278943108,3278943108,FR +3278943109,3278943109,IT +3278943110,3278943110,DK +3278943111,3278943111,GB +3278943112,3278943114,DE +3278943115,3278943115,PT +3278943116,3278943117,DE +3278943118,3278943119,IT +3278943120,3278943120,DE +3278943121,3278943121,AT +3278943122,3278943122,GB +3278943123,3278943123,FR +3278943124,3278943124,BE +3278943125,3278943125,CH +3278943126,3278943126,IT +3278943127,3278943127,DE +3278943128,3278943128,GB +3278943129,3278943130,DE +3278943131,3278943131,BE +3278943132,3278943132,FR +3278943133,3278943133,DE +3278943134,3278943135,NL +3278943136,3278943136,FR +3278943137,3278943137,DE +3278943138,3278943138,BE +3278943139,3278943139,DE +3278943140,3278943140,ES +3278943141,3278943141,NL +3278943142,3278943142,FR +3278943143,3278943143,ES +3278943144,3278943146,DE +3278943147,3278943147,NL +3278943148,3278943148,FR +3278943149,3278943150,DE +3278943151,3278943151,NL +3278943152,3278943153,DE +3278943154,3278943154,SE +3278943155,3278943159,DE +3278943160,3278943160,ES +3278943161,3278943161,BE +3278943162,3278943163,DE +3278943164,3278943164,NL +3278943165,3278943165,SE +3278943166,3278943169,DE +3278943170,3278943172,FR +3278943173,3278943173,NL +3278943174,3278943174,DE +3278943175,3278943177,ES +3278943178,3278943178,DE +3278943179,3278943179,CH +3278943180,3278943181,DE +3278943182,3278943182,SE +3278943183,3278943183,FR +3278943184,3278943184,DE +3278943185,3278943185,BE +3278943186,3278943186,NL +3278943187,3278943187,DE +3278943188,3278943188,GB +3278943189,3278943193,DE +3278943194,3278943194,IT +3278943195,3278943195,DE +3278943196,3278943196,CH +3278943197,3278943197,NL +3278943198,3278943198,GR +3278943199,3278943199,GB +3278943200,3278943200,DE +3278943201,3278943202,CH +3278943203,3278943203,SE +3278943204,3278943206,DE +3278943207,3278943207,IT +3278943208,3278943208,DE +3278943209,3278943209,ES +3278943210,3278943211,DE +3278943212,3278943212,IT +3278943213,3278943213,DE +3278943214,3278943214,IT +3278943215,3278943216,DE +3278943217,3278943217,GB +3278943218,3278943218,IT +3278943219,3278943222,DE +3278943223,3278943223,NL +3278943224,3278943225,DE +3278943226,3278943226,FR +3278943227,3278943227,GB +3278943228,3278943235,DE +3278943236,3278943236,ES +3278943237,3278943237,FR +3278943238,3278943239,DE +3278943240,3278943240,NL +3278943241,3278943242,DE +3278943243,3278943243,ES +3278943244,3278943244,FR +3278943245,3278943245,DE +3278943246,3278943246,NL +3278943247,3278943248,DE +3278943249,3278943249,ES +3278943250,3278943251,FR +3278943252,3278943252,IT +3278943253,3278943253,DE +3278943254,3278943254,DK +3278943255,3278943255,DE +3278943256,3278943256,FR +3278943257,3278943257,IT +3278943258,3278943260,DE +3278943261,3278943261,ES +3278943262,3278943262,NL +3278943263,3278943263,FR +3278943264,3278943265,DE +3278943266,3278943266,FR +3278943267,3278943267,NL +3278943268,3278943269,DE +3278943270,3278943270,CH +3278943271,3278943274,DE +3278943275,3278943275,IT +3278943276,3278943279,DE +3278943280,3278943280,FR +3278943281,3278943281,IT +3278943282,3278943283,DE +3278943284,3278943284,IT +3278943285,3278943289,DE +3278943290,3278943290,IT +3278943291,3278943292,DE +3278943293,3278943293,GB +3278943294,3278943294,IT +3278943295,3278943295,DE +3278943296,3278943296,ES +3278943297,3278943297,IT +3278943298,3278943298,PT +3278943299,3278943299,DK +3278943300,3278943300,GB +3278943301,3278943303,DE +3278943304,3278943304,FR +3278943305,3278943305,LU +3278943306,3278943309,DE +3278943310,3278943310,ES +3278943311,3278943311,BE +3278943312,3278943314,DE +3278943315,3278943316,FR +3278943317,3278943319,DE +3278943320,3278943320,BE +3278943321,3278943321,DE +3278943322,3278943322,NL +3278943323,3278943323,FR +3278943324,3278943326,DE +3278943327,3278943328,IT +3278943329,3278943329,DE +3278943330,3278943330,ES +3278943331,3278943331,PL +3278943332,3278943333,DE +3278943334,3278943334,FR +3278943335,3278943335,AT +3278943336,3278943337,IT +3278943338,3278943338,DE +3278943339,3278943339,PT +3278943340,3278943340,ES +3278943341,3278943341,CH +3278943342,3278943343,DE +3278943344,3278943344,GB +3278943345,3278943345,DE +3278943346,3278943346,FR +3278943347,3278943347,DE +3278943348,3278943349,GB +3278943350,3278943351,DE +3278943352,3278943352,NL +3278943353,3278943353,DE +3278943354,3278943355,ES +3278943356,3278943356,FR +3278943357,3278943357,DE +3278943358,3278943358,FR +3278943359,3278943359,ES +3278943360,3278943360,CH +3278943361,3278943361,DE +3278943362,3278943362,IT +3278943363,3278943366,DE +3278943367,3278943367,FR +3278943368,3278943369,DE +3278943370,3278943370,FR +3278943371,3278943371,DE +3278943372,3278943372,CH +3278943373,3278943374,GR +3278943375,3278943375,ES +3278943376,3278943376,NO +3278943377,3278943377,IT +3278943378,3278943378,DE +3278943379,3278943379,CH +3278943380,3278943380,ES +3278943381,3278943381,GB +3278943382,3278943382,ES +3278943383,3278943383,PL +3278943384,3278943384,IT +3278943385,3278943385,DE +3278943386,3278943387,FR +3278943388,3278943388,DE +3278943389,3278943389,BE +3278943390,3278943391,DE +3278943392,3278943392,PL +3278943393,3278943393,CH +3278943394,3278943394,FR +3278943395,3278943395,IT +3278943396,3278943396,NL +3278943397,3278943399,DE +3278943400,3278943400,FR +3278943401,3278943401,DE +3278943402,3278943402,FR +3278943403,3278943403,GB +3278943404,3278943404,DE +3278943405,3278943405,GB +3278943406,3278943406,AT +3278943407,3278943407,DE +3278943408,3278943408,FR +3278943409,3278943409,IT +3278943410,3278943410,NL +3278943411,3278943411,ES +3278943412,3278943412,GB +3278943413,3278943413,DE +3278943414,3278943414,ES +3278943415,3278943415,UA +3278943416,3278943416,NL +3278943417,3278943417,DE +3278943418,3278943418,GB +3278943419,3278943419,ES +3278943420,3278943420,BE +3278943421,3278943422,DE +3278943423,3278943423,IT +3278943424,3278943424,DE +3278943425,3278943425,GB +3278943426,3278943426,DE +3278943427,3278943427,AT +3278943428,3278943428,DE +3278943429,3278943430,IT +3278943431,3278943431,CH +3278943432,3278943435,DE +3278943436,3278943436,ES +3278943437,3278943437,FR +3278943438,3278943438,DE +3278943439,3278943439,SE +3278943440,3278943440,DE +3278943441,3278943441,IT +3278943442,3278943442,FR +3278943443,3278943445,DE +3278943446,3278943446,CH +3278943447,3278943447,DE +3278943448,3278943448,FR +3278943449,3278943449,DE +3278943450,3278943450,CH +3278943451,3278943451,AT +3278943452,3278943452,DE +3278943453,3278943453,PT +3278943454,3278943455,DE +3278943456,3278943456,IT +3278943457,3278943457,GB +3278943458,3278943459,DE +3278943460,3278943460,FR +3278943461,3278943464,DE +3278943465,3278943465,ES +3278943466,3278943466,DE +3278943467,3278943467,ES +3278943468,3278943468,DE +3278943469,3278943469,NL +3278943470,3278943471,ES +3278943472,3278943472,BE +3278943473,3278943477,DE +3278943478,3278943478,NL +3278943479,3278943481,DE +3278943482,3278943482,IT +3278943483,3278943489,DE +3278943490,3278943490,BE +3278943491,3278943491,DE +3278943492,3278943492,CH +3278943493,3278943495,DE +3278943496,3278943496,GB +3278943497,3278943500,DE +3278943501,3278943501,FR +3278943502,3278943505,DE +3278943506,3278943506,AT +3278943507,3278943507,FR +3278943508,3278943509,IT +3278943510,3278943510,DE +3278943511,3278943512,IT +3278943513,3278943513,ES +3278943514,3278943514,BE +3278943515,3278943515,DE +3278943516,3278943517,ES +3278943518,3278943518,FR +3278943519,3278943519,HU +3278943520,3278943520,AT +3278943521,3278943521,ES +3278943522,3278943523,DE +3278943524,3278943524,AT +3278943525,3278943525,BE +3278943526,3278943526,FR +3278943527,3278943529,DE +3278943530,3278943530,AT +3278943531,3278943531,DE +3278943532,3278943532,NL +3278943533,3278943533,ES +3278943534,3278943534,GB +3278943535,3278943535,BR +3278943536,3278943537,ES +3278943538,3278943538,DE +3278943539,3278943539,IT +3278943540,3278943540,ES +3278943541,3278943542,DE +3278943543,3278943543,IT +3278943544,3278943545,DE +3278943546,3278943546,NL +3278943547,3278943547,CH +3278943548,3278943548,GB +3278943549,3278943549,IL +3278943550,3278943553,DE +3278943554,3278943554,FR +3278943555,3278943555,DE +3278943556,3278943556,FR +3278943557,3278943557,DE +3278943558,3278943558,AT +3278943559,3278943560,DE +3278943561,3278943561,FR +3278943562,3278943565,DE +3278943566,3278943566,BE +3278943567,3278943567,AE +3278943568,3278943568,NL +3278943569,3278943570,DE +3278943571,3278943571,BE +3278943572,3278943572,GB +3278943573,3278943575,DE +3278943576,3278943576,NL +3278943577,3278943577,FR +3278943578,3278943578,DE +3278943579,3278943579,BE +3278943580,3278943580,IT +3278943581,3278943581,CH +3278943582,3278943582,DE +3278943583,3278943583,NL +3278943584,3278943585,DE +3278943586,3278943586,NL +3278943587,3278943587,ES +3278943588,3278943590,DE +3278943591,3278943591,NL +3278943592,3278943592,DE +3278943593,3278943593,PL +3278943594,3278943594,ES +3278943595,3278943595,GB +3278943596,3278943596,GR +3278943597,3278943601,DE +3278943602,3278943602,PL +3278943603,3278943603,FR +3278943604,3278943604,ES +3278943605,3278943605,DE +3278943606,3278943606,AT +3278943607,3278943607,DE +3278943608,3278943608,ES +3278943609,3278943609,DE +3278943610,3278943610,BE +3278943611,3278943611,NL +3278943612,3278943613,DE +3278943614,3278943614,IT +3278943615,3278943615,CH +3278943616,3278943616,DE +3278943617,3278943617,ES +3278943618,3278943619,DE +3278943620,3278943620,IT +3278943621,3278943621,CH +3278943622,3278943622,DE +3278943623,3278943623,DK +3278943624,3278943624,DE +3278943625,3278943625,FR +3278943626,3278943628,DE +3278943629,3278943630,FR +3278943631,3278943632,DE +3278943633,3278943633,GB +3278943634,3278943634,DE +3278943635,3278943635,IT +3278943636,3278943636,CH +3278943637,3278943638,IT +3278943639,3278943641,DE +3278943642,3278943642,FR +3278943643,3278943643,NL +3278943644,3278943645,FR +3278943646,3278943646,IT +3278943647,3278943649,DE +3278943650,3278943650,ES +3278943651,3278943651,DE +3278943652,3278943653,IT +3278943654,3278943654,BE +3278943655,3278943655,FR +3278943656,3278943656,AT +3278943657,3278943658,DE +3278943659,3278943659,NL +3278943660,3278943660,CY +3278943661,3278943661,DE +3278943662,3278943662,ES +3278943663,3278943663,CH +3278943664,3278943666,ES +3278943667,3278943667,IT +3278943668,3278943669,DE +3278943670,3278943670,IT +3278943671,3278943672,DE +3278943673,3278943673,ES +3278943674,3278943677,DE +3278943678,3278943678,BE +3278943679,3278943679,FR +3278943680,3278943680,GB +3278943681,3278943681,CH +3278943682,3278943682,DE +3278943683,3278943683,PT +3278943684,3278943684,AD +3278943685,3278943686,DE +3278943687,3278943687,CH +3278943688,3278943689,IT +3278943690,3278943690,ES +3278943691,3278943695,DE +3278943696,3278943696,GB +3278943697,3278943697,DE +3278943698,3278943698,IT +3278943699,3278943699,FR +3278943700,3278943700,CH +3278943701,3278943701,AT +3278943702,3278943702,FR +3278943703,3278943703,PL +3278943704,3278943705,DE +3278943706,3278943706,ES +3278943707,3278943710,DE +3278943711,3278943711,IT +3278943712,3278943713,DE +3278943714,3278943714,ES +3278943715,3278943715,DE +3278943716,3278943716,ES +3278943717,3278943719,DE +3278943720,3278943720,CH +3278943721,3278943726,DE +3278943727,3278943727,PL +3278943728,3278943729,DE +3278943730,3278943730,FR +3278943731,3278943731,DK +3278943732,3278943733,CH +3278943734,3278943734,DE +3278943735,3278943735,AD +3278943736,3278943736,DE +3278943737,3278943737,ES +3278943738,3278943740,DE +3278943741,3278943741,PT +3278943742,3278943742,IL +3278943743,3278943745,DE +3278943746,3278943746,CH +3278943747,3278943747,DE +3278943748,3278943749,ES +3278943750,3278943751,DE +3278943752,3278943752,GR +3278943753,3278943754,DE +3278943755,3278943755,SL +3278943756,3278943756,DE +3278943757,3278943757,FR +3278943758,3278943758,DE +3278943759,3278943759,NL +3278943760,3278943761,DE +3278943762,3278943762,CY +3278943763,3278943763,DE +3278943764,3278943764,FR +3278943765,3278943765,CH +3278943766,3278943766,BE +3278943767,3278943767,ES +3278943768,3278943768,DE +3278943769,3278943769,CZ +3278943770,3278943770,FR +3278943771,3278943772,DE +3278943773,3278943773,IT +3278943774,3278943777,DE +3278943778,3278943778,CH +3278943779,3278943780,DE +3278943781,3278943781,GB +3278943782,3278943782,IT +3278943783,3278943786,DE +3278943787,3278943787,IT +3278943788,3278943788,DE +3278943789,3278943789,ES +3278943790,3278943790,DE +3278943791,3278943791,IT +3278943792,3278943792,FR +3278943793,3278943793,IT +3278943794,3278943794,HU +3278943795,3278943796,DE +3278943797,3278943797,ES +3278943798,3278943798,DE +3278943799,3278943799,IE +3278943800,3278943800,DE +3278943801,3278943801,LU +3278943802,3278943802,DE +3278943803,3278943803,GB +3278943804,3278943804,DE +3278943805,3278943805,DK +3278943806,3278943806,ES +3278943807,3278943807,DE +3278943808,3278943808,IT +3278943809,3278943809,FR +3278943810,3278943810,DE +3278943811,3278943811,GR +3278943812,3278943812,IT +3278943813,3278943813,DE +3278943814,3278943814,ES +3278943815,3278943815,DE +3278943816,3278943816,GB +3278943817,3278943817,FR +3278943818,3278943818,DE +3278943819,3278943819,AT +3278943820,3278943820,DE +3278943821,3278943821,SM +3278943822,3278943823,DE +3278943824,3278943824,CH +3278943825,3278943826,DE +3278943827,3278943827,AT +3278943828,3278943828,ES +3278943829,3278943829,CH +3278943830,3278943830,ES +3278943831,3278943831,US +3278943832,3278943832,BE +3278943833,3278943833,DE +3278943834,3278943835,GB +3278943836,3278943838,DE +3278943839,3278943839,IT +3278943840,3278943845,DE +3278943846,3278943846,GB +3278943847,3278943847,DE +3278943848,3278943848,IT +3278943849,3278943849,DE +3278943850,3278943851,FR +3278943852,3278943852,BE +3278943853,3278943853,GB +3278943854,3278943854,ES +3278943855,3278943859,DE +3278943860,3278943860,FR +3278943861,3278943863,DE +3278943864,3278943864,DK +3278943865,3278943865,GB +3278943866,3278943866,IT +3278943867,3278943867,ES +3278943868,3278943868,IT +3278943869,3278943869,IE +3278943870,3278943870,NL +3278943871,3278943871,FR +3278943872,3278943873,DE +3278943874,3278943874,CH +3278943875,3278943875,IL +3278943876,3278943882,DE +3278943883,3278943883,CH +3278943884,3278943884,DE +3278943885,3278943885,IT +3278943886,3278943888,DE +3278943889,3278943889,BE +3278943890,3278943890,NL +3278943891,3278943891,ES +3278943892,3278943895,DE +3278943896,3278943896,PL +3278943897,3278943897,ES +3278943898,3278943898,IT +3278943899,3278943899,GB +3278943900,3278943900,ES +3278943901,3278943901,DE +3278943902,3278943902,GB +3278943903,3278943903,IT +3278943904,3278943904,DE +3278943905,3278943905,FR +3278943906,3278943906,IT +3278943907,3278943907,DE +3278943908,3278943908,GB +3278943909,3278943909,HU +3278943910,3278943910,FR +3278943911,3278943911,DE +3278943912,3278943913,IT +3278943914,3278943914,DE +3278943915,3278943915,PL +3278943916,3278943916,DE +3278943917,3278943917,FR +3278943918,3278943918,ES +3278943919,3278943920,FR +3278943921,3278943923,DE +3278943924,3278943924,IT +3278943925,3278943926,ES +3278943927,3278943929,DE +3278943930,3278943930,IT +3278943931,3278943932,DE +3278943933,3278943933,ES +3278943934,3278943939,DE +3278943940,3278943940,DK +3278943941,3278943941,DE +3278943942,3278943942,NL +3278943943,3278943943,AT +3278943944,3278943944,IT +3278943945,3278943945,NL +3278943946,3278943946,LU +3278943947,3278943950,DE +3278943951,3278943951,LU +3278943952,3278943953,DE +3278943954,3278943954,FR +3278943955,3278943956,DE +3278943957,3278943957,GB +3278943958,3278943967,DE +3278943968,3278943968,ES +3278943969,3278943969,DE +3278943970,3278943970,ES +3278943971,3278943971,BE +3278943972,3278943972,IT +3278943973,3278943973,DE +3278943974,3278943974,GR +3278943975,3278943975,CH +3278943976,3278943976,DE +3278943977,3278943977,DK +3278943978,3278943978,DE +3278943979,3278943979,ES +3278943980,3278943980,GB +3278943981,3278943981,DE +3278943982,3278943982,ES +3278943983,3278943984,DE +3278943985,3278943985,NL +3278943986,3278943987,IT +3278943988,3278943988,ES +3278943989,3278943990,DE +3278943991,3278943991,NL +3278943992,3278943996,DE +3278943997,3278943997,CH +3278943998,3278944001,DE +3278944002,3278944002,GB +3278944003,3278944003,LU +3278944004,3278944006,DE +3278944007,3278944007,NL +3278944008,3278944008,IT +3278944009,3278944009,CH +3278944010,3278944010,NL +3278944011,3278944012,DE +3278944013,3278944013,DK +3278944014,3278944014,DE +3278944015,3278944015,IS +3278944016,3278944020,DE +3278944021,3278944021,IT +3278944022,3278944022,FR +3278944023,3278944024,DE +3278944025,3278944025,CH +3278944026,3278944026,DE +3278944027,3278944027,FR +3278944028,3278944028,DE +3278944029,3278944029,IT +3278944030,3278944033,DE +3278944034,3278944034,GR +3278944035,3278944035,FR +3278944036,3278944036,US +3278944037,3278944037,FR +3278944038,3278944039,DE +3278944040,3278944040,FR +3278944041,3278944043,DE +3278944044,3278944045,FR +3278944046,3278944046,NL +3278944047,3278944047,GB +3278944048,3278944048,BE +3278944049,3278944049,IT +3278944050,3278944050,DE +3278944051,3278944051,BE +3278944052,3278944052,AT +3278944053,3278944053,IT +3278944054,3278944058,DE +3278944059,3278944059,ES +3278944060,3278944060,BE +3278944061,3278944061,FR +3278944062,3278944063,DE +3278944064,3278944064,FR +3278944065,3278944065,IT +3278944066,3278944066,GB +3278944067,3278944067,DE +3278944068,3278944068,ES +3278944069,3278944069,PL +3278944070,3278944071,DE +3278944072,3278944072,AT +3278944073,3278944073,FR +3278944074,3278944075,ES +3278944076,3278944076,DE +3278944077,3278944077,GB +3278944078,3278944078,DE +3278944079,3278944079,GB +3278944080,3278944080,DE +3278944081,3278944081,GB +3278944082,3278944082,IT +3278944083,3278944084,ES +3278944085,3278944085,DE +3278944086,3278944086,NL +3278944087,3278944087,DE +3278944088,3278944088,IT +3278944089,3278944089,DE +3278944090,3278944090,IT +3278944091,3278944091,DE +3278944092,3278944092,GR +3278944093,3278944094,DE +3278944095,3278944095,AT +3278944096,3278944097,DE +3278944098,3278944098,SE +3278944099,3278944099,GB +3278944100,3278944102,DE +3278944103,3278944104,IT +3278944105,3278944105,DE +3278944106,3278944106,AT +3278944107,3278944108,DE +3278944109,3278944109,ES +3278944110,3278944111,DE +3278944112,3278944112,NL +3278944113,3278944113,DE +3278944114,3278944114,IT +3278944115,3278944116,ES +3278944117,3278944118,IT +3278944119,3278944119,ES +3278944120,3278944121,DE +3278944122,3278944122,FR +3278944123,3278944123,IT +3278944124,3278944124,DE +3278944125,3278944125,SE +3278944126,3278944127,DE +3278944128,3278944128,PT +3278944129,3278944129,BE +3278944130,3278944130,DE +3278944131,3278944131,FR +3278944132,3278944132,IE +3278944133,3278944133,IT +3278944134,3278944134,DE +3278944135,3278944135,NL +3278944136,3278944137,DE +3278944138,3278944138,GB +3278944139,3278944139,FR +3278944140,3278944140,PT +3278944141,3278944141,FR +3278944142,3278944142,GB +3278944143,3278944144,DE +3278944145,3278944145,SE +3278944146,3278944147,DE +3278944148,3278944148,ES +3278944149,3278944149,DE +3278944150,3278944150,IE +3278944151,3278944158,DE +3278944159,3278944159,CH +3278944160,3278944160,FR +3278944161,3278944163,DE +3278944164,3278944164,IT +3278944165,3278944166,DE +3278944167,3278944167,IT +3278944168,3278944168,CH +3278944169,3278944169,DE +3278944170,3278944171,CH +3278944172,3278944172,DE +3278944173,3278944173,FR +3278944174,3278944174,GB +3278944175,3278944175,DE +3278944176,3278944176,ES +3278944177,3278944177,LU +3278944178,3278944179,DE +3278944180,3278944180,GB +3278944181,3278944181,IT +3278944182,3278944182,DE +3278944183,3278944184,ES +3278944185,3278944185,NL +3278944186,3278944192,DE +3278944193,3278944193,FR +3278944194,3278944194,GB +3278944195,3278944195,IT +3278944196,3278944197,DE +3278944198,3278944198,IT +3278944199,3278944199,AT +3278944200,3278944200,DE +3278944201,3278944201,SE +3278944202,3278944202,NO +3278944203,3278944203,NL +3278944204,3278944207,DE +3278944208,3278944208,NL +3278944209,3278944209,PL +3278944210,3278944210,AT +3278944211,3278944211,DE +3278944212,3278944212,FR +3278944213,3278944213,DE +3278944214,3278944214,GB +3278944215,3278944215,IT +3278944216,3278944216,DE +3278944217,3278944217,IT +3278944218,3278944219,DE +3278944220,3278944220,GB +3278944221,3278944221,GR +3278944222,3278944224,DE +3278944225,3278944225,NL +3278944226,3278944226,RU +3278944227,3278944227,IT +3278944228,3278944230,DE +3278944231,3278944231,CH +3278944232,3278944232,NL +3278944233,3278944233,GB +3278944234,3278944234,AT +3278944235,3278944238,DE +3278944239,3278944239,SE +3278944240,3278944240,FR +3278944241,3278944241,IT +3278944242,3278944242,ES +3278944243,3278944243,DE +3278944244,3278944244,ES +3278944245,3278944245,BE +3278944246,3278944246,NL +3278944247,3278944247,ES +3278944248,3278944248,NL +3278944249,3278944249,DE +3278944250,3278944250,IT +3278944251,3278944251,AT +3278944252,3278944252,IT +3278944253,3278944254,GB +3278944255,3278944257,DE +3278944258,3278944258,US +3278944259,3278944262,DE +3278944263,3278944264,US +3278944265,3278944268,DE +3278944269,3278944269,US +3278944270,3278944272,DE +3278944273,3278944273,CA +3278944274,3278944279,DE +3278944280,3278944280,US +3278944281,3278944288,DE +3278944289,3278944289,US +3278944290,3278944291,DE +3278944292,3278944292,US +3278944293,3278944293,DE +3278944294,3278944294,CA +3278944295,3278944295,US +3278944296,3278944298,DE +3278944299,3278944301,US +3278944302,3278944302,DE +3278944303,3278944303,US +3278944304,3278944312,DE +3278944313,3278944346,US +3278944347,3278944347,AR +3278944348,3278944360,US +3278944361,3278944361,AR +3278944362,3278944365,US +3278944366,3278944366,MX +3278944367,3278944367,US +3278944368,3278944368,CA +3278944369,3278944379,US +3278944380,3278944380,DE +3278944381,3278944385,US +3278944386,3278944386,DE +3278944387,3278944388,US +3278944389,3278944389,CA +3278944390,3278944390,AR +3278944391,3278944391,CA +3278944392,3278944395,US +3278944396,3278944396,CA +3278944397,3278944399,US +3278944400,3278944400,BR +3278944401,3278944401,US +3278944402,3278944402,CA +3278944403,3278944412,US +3278944413,3278944413,CA +3278944414,3278944418,US +3278944419,3278944419,DE +3278944420,3278944420,CA +3278944421,3278944421,DE +3278944422,3278944432,US +3278944433,3278944433,DE +3278944434,3278944444,US +3278944445,3278944449,DE +3278944450,3278944451,CA +3278944452,3278944460,DE +3278944461,3278944461,US +3278944462,3278944470,DE +3278944471,3278944471,US +3278944472,3278944513,DE +3278944514,3278944517,US +3278944518,3278944518,DE +3278944519,3278944520,US +3278944521,3278944521,CA +3278944522,3278944522,US +3278944523,3278944523,CA +3278944524,3278944524,US +3278944525,3278944525,CL +3278944526,3278944526,US +3278944527,3278944527,CA +3278944528,3278944528,US +3278944529,3278944529,CA +3278944530,3278944537,US +3278944538,3278944538,AR +3278944539,3278944544,US +3278944545,3278944545,CA +3278944546,3278944555,US +3278944556,3278944556,CL +3278944557,3278944559,US +3278944560,3278944560,AR +3278944561,3278944561,US +3278944562,3278944562,CA +3278944563,3278944563,US +3278944564,3278944564,CA +3278944565,3278944569,US +3278944570,3278944570,DE +3278944571,3278944572,US +3278944573,3278944573,DE +3278944574,3278944574,US +3278944575,3278944575,DE +3278944576,3278944578,US +3278944579,3278944579,DE +3278944580,3278944580,AR +3278944581,3278944581,US +3278944582,3278944583,DE +3278944584,3278944588,US +3278944589,3278944589,DE +3278944590,3278944599,US +3278944600,3278944600,SA +3278944601,3278944606,US +3278944607,3278944608,DE +3278944609,3278944611,US +3278944612,3278944612,DE +3278944613,3278944626,US +3278944627,3278944627,DE +3278944628,3278944633,US +3278944634,3278944634,DE +3278944635,3278944638,US +3278944639,3278944640,DE +3278944641,3278944642,US +3278944643,3278944643,CL +3278944644,3278944650,US +3278944651,3278944651,DE +3278944652,3278944654,US +3278944655,3278944657,AR +3278944658,3278944659,US +3278944660,3278944660,AR +3278944661,3278944661,US +3278944662,3278944663,DE +3278944664,3278944665,AR +3278944666,3278944667,US +3278944668,3278944668,AR +3278944669,3278944670,US +3278944671,3278944671,CL +3278944672,3278944672,DE +3278944673,3278944673,PE +3278944674,3278944674,DE +3278944675,3278944677,US +3278944678,3278944678,CA +3278944679,3278944679,US +3278944680,3278944680,CA +3278944681,3278944683,US +3278944684,3278944686,DE +3278944687,3278944687,US +3278944688,3278944688,AR +3278944689,3278944693,US +3278944694,3278944695,DE +3278944696,3278944696,US +3278944697,3278944697,CA +3278944698,3278944706,US +3278944707,3278944707,DE +3278944708,3278944708,PE +3278944709,3278944709,US +3278944710,3278944710,DE +3278944711,3278944712,CL +3278944713,3278944713,DE +3278944714,3278944714,JM +3278944715,3278944715,CA +3278944716,3278944716,DE +3278944717,3278944718,US +3278944719,3278944719,CA +3278944720,3278944720,US +3278944721,3278944721,CA +3278944722,3278944727,US +3278944728,3278944728,DE +3278944729,3278944730,US +3278944731,3278944731,DE +3278944732,3278944734,US +3278944735,3278944735,DE +3278944736,3278944736,AR +3278944737,3278944739,US +3278944740,3278944740,CA +3278944741,3278944741,DE +3278944742,3278944743,US +3278944744,3278944745,DE +3278944746,3278944749,US +3278944750,3278944750,DE +3278944751,3278944751,US +3278944752,3278944752,DE +3278944753,3278944753,US +3278944754,3278944754,BR +3278944755,3278944755,AR +3278944756,3278944758,US +3278944759,3278944760,DE +3278944761,3278944761,UY +3278944762,3278944763,DE +3278944764,3278944764,AR +3278944765,3278944765,US +3278944766,3278944767,DE +3278944768,3278944771,DO +3278944772,3278944819,US +3278944820,3278944823,AR +3278944824,3278944827,BR +3278944828,3278944851,US +3278944852,3278944855,CA +3278944856,3278944863,US +3278944864,3278944867,MX +3278944868,3278944871,US +3278944872,3278944875,DE +3278944876,3278944887,US +3278944888,3278944891,CO +3278944892,3278944903,US +3278944904,3278944907,BR +3278944908,3278944919,US +3278944920,3278944923,CO +3278944924,3278944935,US +3278944936,3278944939,BR +3278944940,3278944947,US +3278944948,3278944951,CO +3278944952,3278944963,US +3278944964,3278944971,CA +3278944972,3278944975,US +3278944976,3278944995,CA +3278944996,3278944999,CO +3278945000,3278945007,US +3278945008,3278945011,CO +3278945012,3278945015,PE +3278945016,3278945023,US +3278945024,3278945027,BR +3278945028,3278945031,CW +3278945032,3278945087,US +3278945088,3278945091,BR +3278945092,3278945099,US +3278945100,3278945107,BR +3278945108,3278945111,DO +3278945112,3278945127,US +3278945128,3278945131,AR +3278945132,3278945135,BR +3278945136,3278945151,US +3278945152,3278945155,CA +3278945156,3278945159,BR +3278945160,3278945171,US +3278945172,3278945175,AR +3278945176,3278945191,US +3278945192,3278945199,CA +3278945200,3278945203,US +3278945204,3278945207,AR +3278945208,3278945227,US +3278945228,3278945235,CA +3278945236,3278945247,US +3278945248,3278945255,CA +3278945256,3278945267,US +3278945268,3278945271,AR +3278945272,3278945275,US +3278945276,3278945279,CL +3278945280,3278945283,CA +3278945284,3278945299,US +3278945300,3278945303,DE +3278945304,3278945307,CO +3278945308,3278945311,CA +3278945312,3278945319,US +3278945320,3278945323,MX +3278945324,3278945327,AR +3278945328,3278945331,CA +3278945332,3278945335,US +3278945336,3278945339,CA +3278945340,3278945343,US +3278945344,3278945347,BR +3278945348,3278945363,US +3278945364,3278945367,PR +3278945368,3278945395,US +3278945396,3278945399,AR +3278945400,3278945403,MX +3278945404,3278945427,US +3278945428,3278945431,CA +3278945432,3278945435,AR +3278945436,3278945439,MX +3278945440,3278945451,US +3278945452,3278945455,BR +3278945456,3278945459,US +3278945460,3278945463,MX +3278945464,3278945479,US +3278945480,3278945483,CL +3278945484,3278945491,BR +3278945492,3278945503,US +3278945504,3278945507,MX +3278945508,3278945515,AR +3278945516,3278945519,BR +3278945520,3278945523,US +3278945524,3278945527,CA +3278945528,3278945531,US +3278945532,3278945535,CW +3278945536,3278945539,AR +3278945540,3278945579,US +3278945580,3278945583,AR +3278945584,3278945587,US +3278945588,3278945591,DO +3278945592,3278945659,US +3278945660,3278945663,AR +3278945664,3278945667,US +3278945668,3278945671,UY +3278945672,3278945675,DE +3278945676,3278945687,US +3278945688,3278945691,BR +3278945692,3278945699,US +3278945700,3278945703,AR +3278945704,3278945715,US +3278945716,3278945719,CO +3278945720,3278945723,US +3278945724,3278945727,AR +3278945728,3278945743,US +3278945744,3278945747,MX +3278945748,3278945763,US +3278945764,3278945767,MX +3278945768,3278945771,CO +3278945772,3278945779,US +3278945780,3278945783,PE +3278945784,3278945791,US +3278945792,3278945794,DE +3278945795,3278945795,CH +3278945796,3278945796,DE +3278945797,3278945797,BE +3278945798,3278945798,NL +3278945799,3278945799,LU +3278945800,3278945800,DE +3278945801,3278945801,NL +3278945802,3278945802,PT +3278945803,3278945803,GB +3278945804,3278945804,DE +3278945805,3278945805,DK +3278945806,3278945806,FR +3278945807,3278945807,DE +3278945808,3278945808,RU +3278945809,3278945809,DE +3278945810,3278945810,CH +3278945811,3278945815,DE +3278945816,3278945816,GB +3278945817,3278945822,DE +3278945823,3278945823,CH +3278945824,3278945827,DE +3278945828,3278945828,FR +3278945829,3278945829,DE +3278945830,3278945831,NL +3278945832,3278945832,DE +3278945833,3278945833,GB +3278945834,3278945834,DE +3278945835,3278945835,CH +3278945836,3278945844,DE +3278945845,3278945845,ES +3278945846,3278945846,CH +3278945847,3278945847,DE +3278945848,3278945848,GB +3278945849,3278945849,DE +3278945850,3278945850,NL +3278945851,3278945852,DE +3278945853,3278945853,CH +3278945854,3278945854,FR +3278945855,3278945855,DE +3278945856,3278945856,DK +3278945857,3278945858,DE +3278945859,3278945859,GB +3278945860,3278945860,FR +3278945861,3278945861,IT +3278945862,3278945862,BE +3278945863,3278945863,ES +3278945864,3278945864,IE +3278945865,3278945866,DE +3278945867,3278945867,FR +3278945868,3278945868,NO +3278945869,3278945870,DE +3278945871,3278945871,IT +3278945872,3278945872,FR +3278945873,3278945873,DE +3278945874,3278945874,IT +3278945875,3278945875,ES +3278945876,3278945876,NL +3278945877,3278945877,SE +3278945878,3278945878,FR +3278945879,3278945880,DE +3278945881,3278945881,BE +3278945882,3278945886,DE +3278945887,3278945888,IT +3278945889,3278945890,DE +3278945891,3278945891,CH +3278945892,3278945892,BE +3278945893,3278945893,DE +3278945894,3278945894,AT +3278945895,3278945895,ES +3278945896,3278945896,GB +3278945897,3278945897,IT +3278945898,3278945898,ES +3278945899,3278945906,DE +3278945907,3278945907,GB +3278945908,3278945908,DE +3278945909,3278945909,FR +3278945910,3278945910,DE +3278945911,3278945911,NL +3278945912,3278945917,DE +3278945918,3278945918,IT +3278945919,3278946049,DE +3278946050,3278946054,US +3278946055,3278946055,CA +3278946056,3278946059,US +3278946060,3278946060,CN +3278946061,3278946061,US +3278946062,3278946062,DE +3278946063,3278946067,US +3278946068,3278946068,DE +3278946069,3278946084,US +3278946085,3278946085,DE +3278946086,3278946091,US +3278946092,3278946092,DE +3278946093,3278946108,US +3278946109,3278946109,GB +3278946110,3278946142,US +3278946143,3278946143,DE +3278946144,3278946166,US +3278946167,3278946167,DE +3278946168,3278946208,US +3278946209,3278946213,DE +3278946214,3278946214,US +3278946215,3278946221,DE +3278946222,3278946222,US +3278946223,3278946224,DE +3278946225,3278946225,US +3278946226,3278946229,DE +3278946230,3278946231,US +3278946232,3278946239,DE +3278946240,3278946263,US +3278946264,3278946267,DE +3278946268,3278946271,US +3278946272,3278946275,SV +3278946276,3278946279,DO +3278946280,3278946283,DE +3278946284,3278946287,US +3278946288,3278946291,DE +3278946292,3278946299,US +3278946300,3278946303,DE +3278946304,3278954495,LB +3278954496,3278962687,RU +3278962688,3279028223,CZ +3279028224,3279028735,PL +3279028736,3279029247,RU +3279029760,3279030271,RU +3279030784,3279031295,DE +3279031296,3279031807,NL +3279032320,3279032831,HU +3279032832,3279033343,FR +3279033344,3279033855,RU +3279033856,3279034367,DE +3279034368,3279035391,FR +3279035392,3279035903,PS +3279035904,3279036415,UA +3279036416,3279044607,LV +3279044608,3279052799,FR +3279052800,3279053311,UA +3279053312,3279053823,DE +3279053824,3279054335,NL +3279054336,3279054847,GB +3279054848,3279055359,RU +3279055360,3279055871,SA +3279056896,3279057151,RU +3279057408,3279057919,FR +3279058944,3279059455,UA +3279059456,3279060479,RU +3279060992,3279069183,UA +3279069184,3279077375,PL +3279077376,3279085567,ES +3279085568,3279089663,NL +3279089664,3279093759,KG +3279093760,3279123455,FR +3279123456,3279123967,RE +3279123968,3279159295,FR +3279159296,3279290367,PL +3279290368,3279291391,NL +3279291392,3279291647,GB +3279291648,3279294463,NL +3279294720,3279294975,IE +3279294976,3279295231,SE +3279295232,3279295487,ES +3279295488,3279295743,PT +3279295744,3279295999,IL +3279296000,3279296511,ZA +3279296512,3279297279,ES +3279297280,3279297535,ZA +3279297536,3279298047,SE +3279298048,3279298559,ZA +3279298560,3279305471,DE +3279305488,3279305503,DE +3279305504,3279305535,GB +3279305536,3279305631,DE +3279305632,3279305663,GB +3279305664,3279305727,ES +3279305728,3279306751,DE +3279306752,3279310847,FR +3279310848,3279311871,DE +3279312896,3279313415,DE +3279313424,3279313919,DE +3279313920,3279314943,GB +3279314944,3279315711,CH +3279315712,3279315967,BE +3279315968,3279316223,DE +3279316224,3279316479,BE +3279316480,3279317759,IT +3279317760,3279317887,DE +3279317888,3279317951,IT +3279317952,3279317967,DE +3279317968,3279317983,IT +3279317984,3279318015,NL +3279318016,3279318271,DE +3279318272,3279318527,GB +3279318528,3279318559,CZ +3279318560,3279318655,FR +3279318656,3279318687,CZ +3279318688,3279318719,FR +3279318720,3279318751,ZA +3279318752,3279318783,GB +3279318784,3279319039,NL +3279319040,3279320063,AT +3279320064,3279321087,FR +3279321088,3279322623,DK +3279322624,3279322663,NL +3279322664,3279322671,AT +3279322672,3279322687,GB +3279322688,3279322879,DE +3279322880,3279322975,NL +3279322976,3279323071,DE +3279323072,3279330079,GB +3279330080,3279330111,DK +3279330112,3279330815,GB +3279331072,3279335295,GB +3279335296,3279335423,BE +3279335424,3279339519,GB +3279339520,3279340031,ES +3279340032,3279340543,IT +3279340544,3279340671,FR +3279340800,3279341055,FR +3279341056,3279341567,IT +3279341568,3279341823,SE +3279341824,3279342079,ZA +3279342080,3279342335,IT +3279342336,3279342591,ZA +3279342592,3279342847,SE +3279342848,3279343103,HR +3279343104,3279343359,SI +3279343360,3279343615,ZA +3279343616,3279345151,BE +3279345152,3279345663,SE +3279345664,3279346943,GB +3279346944,3279347711,FR +3279347712,3279348223,SE +3279348224,3279348735,IT +3279348736,3279348991,GB +3279348992,3279349247,ES +3279349248,3279349503,IT +3279349504,3279349759,FR +3279349760,3279351039,DE +3279351040,3279351295,FR +3279351296,3279351807,GB +3279351808,3279352319,DK +3279352320,3279352575,GB +3279352576,3279352831,BE +3279352832,3279352855,SE +3279353088,3279353343,GB +3279353344,3279354879,DK +3279354880,3279355647,AT +3279355648,3279355903,BE +3279373312,3279374335,FI +3279374592,3279375359,FI +3279388672,3279396863,GR +3279402752,3279403007,CZ +3279403264,3279403903,CZ +3279404288,3279404415,CZ +3279404800,3279405055,CZ +3279421440,3279486975,IT +3279486976,3279552511,NL +3279552512,3279559028,LV +3279559029,3279559029,US +3279559030,3279560703,LV +3279560704,3279568895,GB +3279568896,3279577087,IT +3279577088,3279585279,BE +3279585280,3279586815,GB +3279586816,3279587327,DE +3279587328,3279587583,GB +3279587584,3279588095,DE +3279588096,3279590399,GB +3279590400,3279590655,US +3279590656,3279590911,GB +3279590912,3279591167,DE +3279591168,3279592447,GB +3279592448,3279592959,DE +3279592960,3279593593,GB +3279593594,3279593594,DE +3279593595,3279593599,GB +3279593600,3279593727,DE +3279593728,3279593919,GB +3279593920,3279593983,DE +3279593984,3279596543,GB +3279596544,3279597311,DE +3279597312,3279598591,GB +3279598592,3279599615,DE +3279599616,3279601663,GB +3279601664,3279609855,CZ +3279609856,3279618047,RU +3279618048,3279671295,UA +3279671296,3279673343,LV +3279673344,3279675391,NL +3279675392,3279677439,BG +3279677440,3279678463,US +3279678464,3279679487,SG +3279679488,3279683583,UA +3279683584,3279946751,DE +3279946752,3279947775,SE +3279947776,3279948799,NL +3279949824,3279950847,UA +3279950848,3279951871,DE +3279952896,3279953919,PL +3279953920,3279955967,TR +3279955968,3279958015,DE +3279958016,3279970303,RU +3279972352,3279974399,AT +3279974400,3279976447,PL +3279976448,3279978495,RU +3279978496,3279978751,SI +3279978752,3279979007,NL +3279979008,3279979263,RO +3279979264,3279979519,SA +3279979520,3279979775,BG +3279979776,3279980031,RU +3279980032,3279980287,BG +3279980288,3279980543,PL +3279980544,3279980799,RO +3279980800,3279981055,RU +3279981056,3279981311,GB +3279981312,3279981567,UA +3279981568,3279981823,PL +3279981824,3279982079,SI +3279982080,3279982335,PL +3279982336,3279982591,FR +3279982592,3279982847,DE +3279982848,3279983103,IL +3279983104,3279983615,FR +3279983616,3279983871,PL +3279983872,3279984127,FR +3279984128,3279984383,AT +3279984384,3279984639,RO +3279984640,3279985151,RU +3279985152,3279985407,PL +3279985408,3279985663,CZ +3279985664,3279985919,DE +3279985920,3279986687,RU +3279986688,3279987199,NL +3279987712,3279988223,RO +3279988224,3279988735,AM +3279988736,3279989247,RO +3279989248,3279989759,AT +3279989760,3279990271,PL +3279990272,3279990783,DK +3279990784,3279991295,IL +3279991808,3279992319,PL +3279992320,3279992831,UA +3279992832,3279993855,NL +3279993856,3279994367,RO +3279994368,3279994879,GB +3279994880,3280003071,CZ +3280003072,3280003583,BG +3280003584,3280004095,GB +3280004096,3280004607,PL +3280004608,3280005119,UA +3280005120,3280005631,HU +3280005632,3280006143,IT +3280006144,3280006655,DK +3280006656,3280007167,GB +3280007680,3280008191,PL +3280008192,3280009215,RU +3280009216,3280009727,UA +3280009728,3280010239,GB +3280010240,3280010751,UA +3280023552,3280024575,IT +3280076800,3280084991,GB +3280084992,3280093183,BA +3280093184,3280109567,GR +3280109568,3280117759,BE +3280117760,3280125951,CH +3280126208,3280126463,IS +3280126464,3280126719,SI +3280126720,3280126975,IT +3280126976,3280127231,CH +3280127232,3280127487,PL +3280127488,3280127743,AT +3280127744,3280127999,NL +3280128000,3280128255,SE +3280128256,3280128511,GB +3280128512,3280129023,HU +3280129280,3280129535,LV +3280129792,3280130047,FR +3280130304,3280130559,RU +3280130560,3280130815,GB +3280130816,3280131071,IS +3280131072,3280131327,PL +3280131328,3280131583,IT +3280131584,3280131839,RU +3280131840,3280132095,RO +3280132096,3280132351,RU +3280132352,3280132607,GB +3280132608,3280132863,CH +3280132864,3280133119,UA +3280133120,3280133375,IT +3280133376,3280133631,DE +3280133632,3280133887,FR +3280133888,3280134143,NL +3280134144,3280142335,IT +3280142336,3280207871,RU +3280207872,3280273407,FR +3280273408,3280325119,RU +3280325120,3280325631,US +3280325632,3280326655,ES +3280326656,3280327167,US +3280327168,3280327679,RU +3280327680,3280328703,ES +3280328704,3280329727,RU +3280329728,3280330751,IQ +3280330752,3280338943,RU +3280338944,3280347135,GB +3280347136,3280355327,NO +3280355328,3280371711,GR +3280371712,3280379903,CH +3280379904,3280381951,FR +3280381952,3280383999,NL +3280384000,3280386047,IT +3280386048,3280388095,SA +3280388096,3280396287,GB +3280396288,3280404479,US +3280404480,3280437247,IT +3280437248,3280453631,DE +3280453632,3280454655,IT +3280454656,3280455679,UA +3280455680,3280456703,IT +3280456704,3280457727,RU +3280457728,3280458751,GB +3280458752,3280459775,RU +3280459776,3280460799,DK +3280460800,3280462847,DE +3280462848,3280463871,PL +3280463872,3280466943,RU +3280467968,3280468991,ES +3280470016,3280535551,PL +3280535552,3280568319,GB +3280568320,3280576511,IT +3280576512,3280576767,BY +3280576768,3280577279,PL +3280577280,3280577535,DE +3280577792,3280578047,NL +3280578048,3280578303,RO +3280578304,3280578559,UA +3280578816,3280579071,NL +3280579072,3280579327,DE +3280579328,3280579583,RU +3280579584,3280579839,CH +3280579840,3280580095,HR +3280580096,3280580351,KW +3280580352,3280580607,CH +3280580608,3280580863,GB +3280580864,3280581119,DE +3280581120,3280581375,DK +3280581376,3280581631,EE +3280581632,3280581887,BY +3280581888,3280582143,FR +3280582144,3280582399,CZ +3280582400,3280582655,DK +3280582656,3280582911,FR +3280582912,3280583167,UA +3280583424,3280583679,RU +3280583936,3280584191,PL +3280584192,3280584447,KW +3280584448,3280584703,DE +3280585216,3280585727,DK +3280585728,3280585983,UA +3280585984,3280586239,PL +3280586240,3280586751,DE +3280586752,3280587263,RU +3280587264,3280587775,UA +3280588288,3280588799,UA +3280588800,3280589311,PL +3280589312,3280590335,DE +3280590336,3280590847,NL +3280590848,3280591359,DE +3280591360,3280591871,UA +3280591872,3280592383,US +3280592384,3280592895,TR +3280592896,3280593407,DE +3280593408,3280593919,UA +3280593920,3280594431,LU +3280594432,3280594943,NL +3280594944,3280595455,UA +3280595456,3280595967,DE +3280595968,3280596479,DK +3280596480,3280596991,AT +3280596992,3280597503,UA +3280597504,3280597759,NL +3280597760,3280598015,BE +3280598016,3280598527,UA +3280598528,3280599039,PL +3280599040,3280599551,FR +3280599552,3280600063,UA +3280600064,3280600575,BG +3280600576,3280601087,UA +3280601088,3280609279,PT +3280609280,3280617471,DE +3280617472,3280625663,UA +3280625664,3280633855,MD +3280633856,3280642047,BG +3280642048,3280650239,UA +3280650240,3280650495,RO +3280650496,3280650751,UA +3280650752,3280651263,GB +3280651264,3280651519,SI +3280651520,3280651775,FR +3280651776,3280652031,UA +3280652032,3280652287,NO +3280652288,3280652543,PL +3280652544,3280652799,SI +3280652800,3280653055,FR +3280653056,3280653311,CH +3280653312,3280653823,GB +3280653824,3280654079,RU +3280654080,3280654591,PL +3280654592,3280654847,ES +3280654848,3280655103,RU +3280655104,3280655359,PL +3280655360,3280655615,SE +3280655616,3280655871,FI +3280655872,3280656127,RO +3280656128,3280656639,CH +3280656640,3280657407,UA +3280657664,3280657919,SE +3280657920,3280658175,RO +3280658176,3280658431,DE +3280658432,3280660479,MT +3280660480,3280662527,RU +3280662528,3280662591,DE +3280662592,3280662607,IT +3280662608,3280662623,DE +3280662624,3280662655,IT +3280662656,3280662687,AR +3280662688,3280662703,AT +3280662704,3280662783,DE +3280662784,3280663295,CZ +3280663296,3280663327,AR +3280663328,3280663343,DE +3280663344,3280663391,IT +3280663392,3280663407,HK +3280663408,3280663423,IT +3280663424,3280663999,DE +3280664000,3280664063,IT +3280664064,3280664319,CZ +3280664320,3280664831,DE +3280664832,3280665087,CZ +3280665088,3280666623,DE +3280666624,3280732159,NO +3280732160,3280764927,DE +3280765952,3280766975,DK +3280766976,3280767999,AT +3280768000,3280769023,FR +3280770048,3280771071,FR +3280771072,3280772095,PL +3280772096,3280773119,ES +3280773120,3280774143,UA +3280774144,3280775167,ME +3280775168,3280776191,UA +3280776192,3280777215,SE +3280777216,3280778239,UA +3280778240,3280779263,RU +3280779264,3280780287,DE +3280780288,3280781311,PL +3280781312,3280782335,FI +3280782336,3280783359,TR +3280783360,3280784383,SE +3280784384,3280785407,RU +3280785408,3280786431,DE +3280786432,3280788479,GB +3280788480,3280789503,PL +3280790528,3280791551,UA +3280791552,3280792575,DE +3280792576,3280793599,PL +3280793600,3280794623,NL +3280794624,3280795647,UA +3280795648,3280796671,MZ +3280796672,3280797695,CZ +3280797696,3280863231,CH +3280863232,3280928767,TR +3280928768,3280934927,GB +3280934928,3280934935,DE +3280934936,3280935055,GB +3280935056,3280935063,IT +3280935064,3280935087,GB +3280935088,3280935095,ES +3280935096,3280935119,GB +3280935120,3280935127,FR +3280935128,3280940787,GB +3280940788,3280940791,DE +3280940792,3280941387,GB +3280941388,3280941395,DE +3280941396,3280942191,GB +3280942192,3280942207,DK +3280942208,3280952331,GB +3280952332,3280952335,DE +3280952336,3280952783,GB +3280952784,3280952799,DE +3280952800,3280955707,GB +3280955708,3280955711,DE +3280955712,3280958919,GB +3280958920,3280958927,DE +3280958928,3280963375,GB +3280963376,3280963383,DE +3280963384,3280985279,GB +3280985280,3280985343,CH +3280985344,3280991231,GB +3280991232,3280991743,DE +3280991744,3280994559,GB +3280994560,3280994815,RU +3280994816,3280995071,NL +3280995072,3280995327,DE +3280995328,3280995583,SE +3280995584,3280995839,GB +3280995840,3280996095,RU +3280996096,3280996351,CH +3280996352,3280996607,GB +3280996608,3280996863,PL +3280996864,3280997119,NL +3280997120,3280997375,FR +3280997376,3280997631,PL +3280997632,3280997887,SE +3280997888,3280998143,UA +3280998144,3280998399,DE +3280998400,3280998655,GR +3280998656,3280999423,GB +3280999424,3280999679,HU +3280999680,3280999935,UA +3280999936,3281000191,DE +3281000448,3281000703,FR +3281000704,3281000959,UA +3281000960,3281001215,SI +3281001472,3281001727,UA +3281001728,3281001983,RU +3281001984,3281002239,CH +3281002240,3281002495,DE +3281002496,3281010687,CH +3281010688,3281018879,BE +3281018880,3281027071,CZ +3281027080,3281027087,GB +3281027136,3281027151,GB +3281027200,3281027215,GB +3281027280,3281027287,GB +3281027304,3281027311,GB +3281027320,3281027327,GB +3281027584,3281027615,GB +3281027632,3281027679,GB +3281027696,3281027743,GB +3281027776,3281027807,GB +3281027840,3281027903,GB +3281028064,3281028159,GB +3281028992,3281029055,GB +3281030400,3281035263,GB +3281035264,3281043455,CH +3281043456,3281049615,RU +3281049616,3281049622,GI +3281049623,3281059839,RU +3281059840,3281125375,DE +3281125376,3281127167,SK +3281127168,3281127423,CZ +3281127424,3281133567,SK +3281133568,3281141759,IR +3281141760,3281149951,RU +3281149952,3281158143,CZ +3281158144,3281166335,SK +3281166336,3281174527,GB +3281174528,3281190911,FR +3281190912,3281256447,GB +3281256448,3281321983,FI +3281321984,3281338367,GB +3281338368,3281338623,PL +3281338624,3281338879,SA +3281338880,3281339135,FR +3281339392,3281339647,PL +3281339648,3281339903,GB +3281339904,3281340159,UA +3281340160,3281340415,BG +3281340416,3281340671,RO +3281340928,3281341183,DE +3281341184,3281341439,AT +3281341440,3281341695,DE +3281341696,3281341951,PL +3281341952,3281342207,DK +3281342208,3281343231,DE +3281343232,3281343487,FI +3281343488,3281343743,GB +3281343744,3281343999,TR +3281344000,3281344255,NL +3281344256,3281344511,RU +3281344512,3281344767,UA +3281344768,3281345023,RU +3281345280,3281345535,SA +3281346048,3281346303,SI +3281346304,3281346559,PL +3281346560,3281346815,UA +3281346816,3281347071,DE +3281347072,3281347327,PL +3281347328,3281347583,DE +3281347584,3281347839,PL +3281347840,3281348095,SE +3281348096,3281348351,DE +3281348352,3281348607,GB +3281348608,3281349119,RU +3281349120,3281349375,UA +3281349376,3281349631,NL +3281349632,3281350143,UA +3281350144,3281350655,RU +3281350656,3281350911,UA +3281350912,3281351167,ES +3281351168,3281351423,UA +3281351424,3281351679,CH +3281351680,3281351935,TR +3281351936,3281352191,UA +3281352192,3281352447,PL +3281352704,3281352959,DE +3281352960,3281353215,GB +3281353216,3281353471,DE +3281353472,3281353727,SE +3281353728,3281353983,PL +3281353984,3281354239,UA +3281354240,3281354751,GB +3281354752,3281371135,SE +3281371136,3281372159,RS +3281372160,3281372671,RU +3281372672,3281373183,PL +3281373184,3281375231,RU +3281375232,3281377279,ES +3281377280,3281379327,AT +3281379328,3281383423,PL +3281383424,3281385471,AT +3281385472,3281387519,BG +3281387520,3281453055,PL +3281453056,3281518591,RU +3281518592,3281649663,GB +3281649664,3281696171,FR +3281696172,3281696172,PL +3281696173,3281715199,FR +3281715200,3281780735,TR +3281780736,3281846271,FI +3281846272,3281911807,GB +3281911808,3281919999,UZ +3281920000,3281928191,DE +3281928192,3281944575,MT +3281944576,3281960959,DE +3281960960,3281969151,JO +3281969152,3281969663,RU +3281969664,3281970175,PL +3281970176,3281970687,RU +3281970688,3281971199,CH +3281971200,3281971711,RU +3281971712,3281972223,RO +3281972224,3281972735,DE +3281972736,3281973247,RU +3281973248,3281973759,FR +3281973760,3281974271,DK +3281974784,3281975295,PL +3281975296,3281976319,RU +3281976320,3281976831,DE +3281976832,3281977343,RU +3281977344,3282042879,NO +3282042880,3282083839,CH +3282083840,3282084351,DE +3282084352,3282084863,RO +3282084864,3282085375,RU +3282085376,3282085887,BE +3282085888,3282086399,DE +3282086400,3282086911,LV +3282086912,3282087423,DE +3282087424,3282087935,PL +3282087936,3282088447,SE +3282088448,3282089471,PL +3282089472,3282089983,SK +3282089984,3282090495,PL +3282091008,3282091519,FR +3282091520,3282092031,CH +3282092032,3282093055,UA +3282093056,3282095103,DE +3282095104,3282096127,UA +3282096128,3282097151,IT +3282097152,3282098175,GB +3282098176,3282099199,NL +3282099200,3282100223,UA +3282100224,3282101247,ES +3282101248,3282102271,DE +3282102272,3282103295,UA +3282103296,3282104319,GB +3282104320,3282105343,IL +3282105344,3282106367,RU +3282106368,3282107391,DE +3282107392,3282107654,NL +3282107655,3282107655,CH +3282107656,3282108415,NL +3282108416,3282173951,RU +3282173952,3282174463,UA +3282174464,3282174975,GB +3282174976,3282175487,DE +3282176000,3282177023,RU +3282177024,3282177535,GB +3282177536,3282178047,KZ +3282178048,3282178559,PL +3282178560,3282179071,ES +3282179072,3282179583,GB +3282179584,3282180095,RU +3282180096,3282180607,PL +3282180608,3282181119,KZ +3282181120,3282181631,GB +3282181632,3282182143,DE +3282182144,3282190335,RU +3282190336,3282190847,UA +3282190848,3282191359,IL +3282191360,3282191871,NL +3282191872,3282192383,UA +3282192384,3282192895,BG +3282192896,3282193407,UA +3282193408,3282193919,PL +3282193920,3282194431,RU +3282194432,3282195455,UA +3282195456,3282196479,IE +3282196480,3282197503,UA +3282198272,3282198527,HR +3282198528,3282206719,GB +3282206720,3282223103,CH +3282223104,3282231295,BE +3282231296,3282239487,DE +3282239488,3282305023,SE +3282305024,3282370559,PL +3282370560,3282436095,FI +3282436096,3282468095,GB +3282468096,3282468351,DE +3282468352,3282477055,GB +3282477056,3282485247,RU +3282485248,3282493439,GI +3282501632,3282534399,GR +3282534400,3282538495,GB +3282538496,3282542591,PL +3282542592,3282546687,US +3282546688,3282550783,GB +3282550784,3282554879,FR +3282554880,3282558975,DE +3282558976,3282563071,FR +3282563072,3282567167,GB +3282567168,3282622871,SK +3282622872,3282622879,AT +3282622880,3282632703,SK +3282632704,3282698239,NL +3282698240,3282706431,GR +3282706432,3282714623,RU +3282714624,3282722815,AT +3282722816,3282731007,DE +3282731008,3282739199,FI +3282739200,3282739455,CH +3282739456,3282739711,RO +3282739712,3282739967,FR +3282739968,3282740223,IR +3282740224,3282740479,FR +3282740736,3282740991,BG +3282741248,3282741503,PT +3282741504,3282741759,GB +3282741760,3282742015,ES +3282742016,3282742271,RO +3282742528,3282742783,GB +3282742784,3282743039,RU +3282743040,3282743295,CH +3282743296,3282743551,CY +3282743552,3282743807,SI +3282743808,3282744063,BG +3282744064,3282744319,UA +3282744320,3282744575,SA +3282744576,3282744831,LT +3282744832,3282745087,PL +3282745088,3282745343,RS +3282745344,3282745599,HU +3282745600,3282745855,DE +3282745856,3282746111,PL +3282746112,3282746367,SE +3282746368,3282746623,PL +3282746624,3282746879,SE +3282747136,3282747391,PL +3282747392,3282763775,RU +3282763776,3282960383,GB +3282960384,3283091455,TR +3283091456,3283111935,CH +3283111936,3283113471,LI +3283113472,3283156991,CH +3283156992,3283173375,DE +3283173376,3283174399,PL +3283174400,3283175423,GB +3283175424,3283176447,UA +3283177472,3283178495,BE +3283178496,3283179519,PL +3283180544,3283181567,UA +3283181568,3283182591,NO +3283182592,3283183615,PL +3283183616,3283184639,RU +3283186688,3283187711,UA +3283187712,3283188735,RU +3283188736,3283189759,UA +3283189760,3283206143,DE +3283206144,3283206655,GB +3283207168,3283207679,PL +3283207680,3283208191,AT +3283208192,3283208703,DE +3283208704,3283209215,NO +3283209216,3283209727,RU +3283209728,3283210239,TR +3283210240,3283210751,UA +3283210752,3283211263,PL +3283211264,3283211775,GB +3283211776,3283212287,NL +3283212288,3283212799,PL +3283212800,3283213311,BG +3283213312,3283213823,ES +3283213824,3283214335,UA +3283214336,3283214847,RO +3283214848,3283215359,RU +3283215360,3283215871,AT +3283216384,3283216895,DE +3283216896,3283217407,CH +3283217408,3283218943,UA +3283218944,3283219455,NL +3283219456,3283219967,GB +3283219968,3283220479,BE +3283220480,3283220991,BG +3283220992,3283221503,AT +3283221504,3283222015,GB +3283222016,3283223039,DE +3283223040,3283223551,RU +3283223552,3283224063,NL +3283224576,3283225087,BG +3283225088,3283225599,UA +3283225600,3283226111,RU +3283226112,3283226623,DK +3283226624,3283227135,RU +3283227136,3283227647,UA +3283227648,3283229183,RU +3283229184,3283229695,PL +3283229696,3283230207,IT +3283230208,3283230719,UA +3283230720,3283238911,RS +3283238912,3283247103,CZ +3283247104,3283247615,LV +3283247616,3283248127,BG +3283248128,3283248639,DE +3283248640,3283249151,RO +3283249152,3283249663,UA +3283249664,3283249919,MD +3283249920,3283250175,RO +3283250176,3283250687,RU +3283251200,3283251711,FR +3283251712,3283252223,PL +3283252224,3283252735,BG +3283252736,3283253247,SI +3283253760,3283254271,PL +3283255296,3283263487,UA +3283263488,3283271679,SE +3283271680,3283279871,RU +3283279872,3283288063,SE +3283288064,3283419135,DE +3283419136,3283451903,IR +3283451904,3283460095,NO +3283460096,3283460607,GB +3283460608,3283460863,US +3283460864,3283461631,GB +3283461632,3283461887,SE +3283461888,3283462143,GB +3283462144,3283462399,US +3283462400,3283462655,GB +3283462656,3283462911,DE +3283462912,3283463167,GB +3283463168,3283463679,NL +3283463680,3283464191,DE +3283464192,3283468287,IT +3283468288,3283472383,FI +3283472384,3283476479,CZ +3283476480,3283480575,LU +3283480576,3283482623,LT +3283482624,3283483647,SK +3283483648,3283484159,ES +3283484160,3283484415,DE +3283484416,3283484671,ES +3283484672,3283484927,UA +3283484928,3283485183,NL +3283485184,3283485439,DE +3283485440,3283485695,RU +3283485696,3283485951,GB +3283485952,3283486207,SE +3283486208,3283486463,AT +3283486464,3283486719,UA +3283486720,3283486975,RU +3283486976,3283487231,PL +3283487488,3283487743,DE +3283487744,3283487999,CH +3283488000,3283488255,NL +3283488256,3283488511,PL +3283488768,3283489279,FR +3283489280,3283489535,DE +3283489792,3283490047,RU +3283490048,3283490559,UA +3283490560,3283490815,PL +3283491072,3283491327,TR +3283491328,3283491583,AT +3283491840,3283492095,RU +3283492352,3283492607,ES +3283492608,3283492863,SA +3283492864,3283493119,DK +3283493120,3283493375,IL +3283493376,3283493887,PL +3283493888,3283494911,DK +3283494912,3283495167,PL +3283495168,3283495423,BG +3283495424,3283495679,TR +3283495680,3283495935,NL +3283495936,3283496191,BG +3283496192,3283496447,DE +3283496448,3283496703,HR +3283496704,3283496959,LV +3283496960,3283497215,DE +3283497216,3283497471,PL +3283497472,3283497727,DE +3283497728,3283498239,PL +3283498240,3283498495,CH +3283498496,3283498751,PL +3283498752,3283499007,AT +3283499008,3283499263,DE +3283499264,3283499519,RU +3283499520,3283499775,DE +3283499776,3283500031,GB +3283500032,3283500287,DE +3283500288,3283500543,SI +3283500544,3283500799,GB +3283500800,3283501055,UA +3283501056,3283509247,LT +3283509248,3283517439,DE +3283517440,3283525631,RU +3283525632,3283533823,GB +3283533824,3283534847,UA +3283534848,3283535359,DE +3283536384,3283536895,UA +3283537408,3283537919,PL +3283537920,3283538431,RO +3283538432,3283538943,IT +3283538944,3283539455,RO +3283539456,3283539967,RS +3283539968,3283540479,DK +3283540480,3283540991,PL +3283540992,3283541503,RO +3283541504,3283542015,CH +3283542016,3283550207,IT +3283552268,3283552271,IT +3283561472,3283562495,GB +3283563520,3283564543,GB +3283568640,3283569663,GB +3283576832,3283579903,DE +3283593216,3283595263,IT +3283615744,3283623935,HU +3283623936,3283632127,DK +3283632128,3283632639,NL +3283632640,3283633151,GB +3283633152,3283633663,SE +3283633664,3283634175,UA +3283634688,3283635199,RU +3283635200,3283635711,GB +3283635712,3283636223,RU +3283636224,3283636735,UA +3283636736,3283637759,PL +3283638272,3283638783,PL +3283639296,3283639807,CH +3283639808,3283640319,DE +3283640320,3283648511,DK +3283648512,3283649023,GB +3283649024,3283656703,BE +3283656704,3283664895,HU +3283664896,3283673087,UA +3283673088,3283681279,GB +3283681280,3283746815,DE +3283746816,3283812351,CH +3283812352,3283877887,PL +3283877888,3283943423,GB +3283943424,3283944447,CZ +3283944448,3283945471,AT +3283945472,3283946495,UA +3283946496,3283947519,GB +3283947520,3283948543,UA +3283948544,3283949567,NL +3283949568,3283950591,SE +3283950592,3283951615,KZ +3283951616,3283952639,PL +3283952640,3283953663,UA +3283953664,3283954687,PL +3283954688,3283955326,UA +3283955327,3283955327,CY +3283955328,3283956735,UA +3283956736,3283957759,PL +3283957760,3283958783,GR +3283958784,3283959807,UA +3283959808,3283960831,FR +3283960832,3283961855,KZ +3283962880,3283963903,PL +3283963904,3283964927,BG +3283964928,3283966975,PL +3283966976,3283967999,DE +3283968000,3283970047,RU +3283970048,3283971071,UA +3283971072,3283972095,RU +3283972096,3283973119,SE +3283973120,3283974143,NL +3283974144,3283975167,RU +3283975168,3283976191,NL +3283976192,3283976703,IE +3283976704,3283977215,DK +3283977216,3283977727,UA +3283977728,3283978751,RU +3283978752,3283979263,RO +3283979264,3283979775,IL +3283979776,3283980287,NL +3283980288,3283980799,RO +3283980800,3283981823,CH +3283981824,3283982335,RO +3283982848,3283983103,SE +3283983104,3283983359,RO +3283983360,3283983871,CY +3283983872,3283984383,GB +3283984384,3283984895,SE +3283984896,3283985407,GR +3283985920,3283986431,AT +3283986944,3283987455,AT +3283987456,3283987967,GB +3283988480,3283988735,RO +3283988736,3283988991,GB +3283988992,3283989503,FR +3283989504,3283990015,RU +3283990016,3283990527,SE +3283991040,3283991551,RO +3283991552,3283992063,SE +3283992576,3283993087,IL +3283993088,3283993599,RO +3283993600,3283994111,UA +3283994112,3283994623,AT +3283994624,3283995135,UA +3283995136,3283995647,BE +3283995648,3283996159,CH +3283996160,3283996671,MK +3283996672,3283997183,ES +3283997184,3283997695,PS +3283997696,3283998207,SA +3283998208,3283998719,UA +3283998720,3283999231,NL +3283999232,3283999743,RU +3283999744,3284000255,GB +3284000256,3284000767,RU +3284000768,3284001279,BG +3284001280,3284002303,UA +3284002304,3284002815,PL +3284002816,3284003327,DK +3284003328,3284003839,UA +3284003840,3284004351,DE +3284004352,3284004863,RU +3284004864,3284005375,UA +3284005376,3284005887,PA +3284005888,3284006399,DE +3284006400,3284007423,UA +3284007424,3284007935,RO +3284007936,3284008447,CH +3284008448,3284008959,NO +3284008960,3284009215,NL +3284009216,3284009471,PL +3284009472,3284009727,DE +3284009728,3284009983,FR +3284009984,3284010239,CH +3284010240,3284010751,FR +3284010752,3284011519,DE +3284011520,3284011775,HR +3284011776,3284012031,DE +3284012032,3284012287,RU +3284012288,3284012543,UA +3284012544,3284012799,RU +3284012800,3284013311,AT +3284013312,3284013567,PL +3284013568,3284013823,DK +3284013824,3284014079,IL +3284014080,3284014335,TR +3284014336,3284014591,IT +3284014592,3284014847,GB +3284014848,3284015103,IL +3284015104,3284015359,US +3284015360,3284015615,DK +3284015616,3284015871,AT +3284015872,3284016127,FR +3284016128,3284016383,NL +3284016384,3284016639,CH +3284016640,3284017151,DK +3284017152,3284025343,GR +3284025344,3284028139,GB +3284028140,3284028143,US +3284028144,3284028287,GB +3284028288,3284028319,US +3284028320,3284029183,GB +3284029184,3284029199,US +3284029200,3284029295,GB +3284029296,3284029311,US +3284029312,3284029439,GB +3284029440,3284030463,US +3284030464,3284030471,GB +3284030472,3284030479,IL +3284030480,3284030495,FR +3284030496,3284030575,GB +3284030576,3284030583,DE +3284030584,3284030615,GB +3284030616,3284030623,SE +3284030624,3284030775,GB +3284030776,3284030783,SE +3284030784,3284030799,GB +3284030800,3284030815,SE +3284030816,3284030991,GB +3284030992,3284031007,FR +3284031008,3284033535,GB +3284033536,3284041727,RU +3284041728,3284041983,DK +3284041984,3284042239,SI +3284042496,3284042751,AT +3284042752,3284043007,RU +3284043008,3284043263,TH +3284043264,3284043519,EE +3284043520,3284043775,DE +3284043776,3284044031,HR +3284044032,3284044287,FR +3284044288,3284044543,DE +3284044800,3284045055,CZ +3284045056,3284045311,EE +3284045312,3284045567,DE +3284045568,3284045823,AT +3284046080,3284046335,DE +3284046336,3284046591,NL +3284046592,3284046847,SE +3284046848,3284047103,DE +3284047616,3284047871,NL +3284047872,3284048127,UA +3284048128,3284048383,DK +3284048640,3284049151,FR +3284049408,3284049663,SI +3284049664,3284049919,RO +3284049920,3284058111,CH +3284058112,3284066303,SE +3284066304,3284075007,NL +3284075008,3284075519,DE +3284075520,3284076031,RU +3284076032,3284076543,SA +3284076544,3284077055,PL +3284077056,3284077567,RU +3284077568,3284078079,UA +3284078080,3284078591,DE +3284078592,3284079103,NL +3284079104,3284079615,RU +3284079616,3284080127,DE +3284080640,3284081151,UA +3284081152,3284081663,DE +3284081664,3284082175,IE +3284082176,3284082687,NO +3284082688,3284083199,RU +3284083200,3284083711,BG +3284083712,3284084223,RU +3284084224,3284084735,UA +3284084736,3284085247,RU +3284085248,3284085759,DE +3284086272,3284086783,RO +3284086784,3284087295,CZ +3284087296,3284087807,RU +3284087808,3284088319,IL +3284088832,3284089855,UA +3284089856,3284090367,BG +3284090368,3284090879,PL +3284090880,3284091391,RU +3284091392,3284091903,GB +3284091904,3284092415,DE +3284092416,3284092927,GB +3284092928,3284093439,UA +3284093440,3284093951,IR +3284093952,3284094975,RU +3284094976,3284095487,UA +3284095488,3284095999,RU +3284096000,3284096511,IT +3284096512,3284097023,GB +3284097024,3284097535,RU +3284098048,3284098559,DE +3284098560,3284099071,BG +3284099072,3284099327,SI +3284099328,3284099583,HU +3284099584,3284100095,GR +3284100096,3284100607,AM +3284101120,3284101631,UA +3284101632,3284102143,GB +3284102144,3284102655,DK +3284102656,3284103167,AT +3284103168,3284103679,NL +3284103680,3284104191,DE +3284104192,3284104703,NO +3284104704,3284105215,TR +3284105216,3284105727,NL +3284105728,3284106239,FI +3284106240,3284106751,RO +3284106752,3284107263,UA +3284107264,3284107775,DE +3284107776,3284108287,RU +3284108288,3284108799,CH +3284108800,3284109311,FR +3284109312,3284109823,RU +3284109824,3284110335,UA +3284110848,3284111359,DK +3284111360,3284111871,SE +3284111872,3284112383,RU +3284112384,3284112895,BG +3284112896,3284113919,NL +3284113920,3284114431,AM +3284114432,3284114943,GB +3284114944,3284115455,RU +3284115456,3284115967,RO +3284115968,3284116479,PL +3284116480,3284116991,NL +3284116992,3284117503,RU +3284117504,3284118015,UA +3284118016,3284118527,PL +3284118528,3284119039,FR +3284119040,3284119551,RU +3284120064,3284120575,UA +3284120576,3284121087,PL +3284121088,3284121599,RU +3284121600,3284122111,PL +3284122112,3284122623,AM +3284122624,3284123135,CH +3284123136,3284124159,RU +3284124160,3284124671,UA +3284124672,3284125183,DE +3284125696,3284126207,UA +3284126208,3284127231,CZ +3284127744,3284128255,RU +3284128256,3284128767,GB +3284128768,3284129279,SE +3284129280,3284129791,UA +3284129792,3284130303,DE +3284130304,3284130815,GB +3284130816,3284131327,RU +3284131328,3284131839,HU +3284131840,3284132351,DE +3284132352,3284132863,UA +3284132864,3284133375,HU +3284133376,3284133887,TM +3284133888,3284134399,PL +3284134400,3284134655,NL +3284134656,3284134911,UA +3284134912,3284135935,RU +3284135936,3284136447,CH +3284136448,3284136959,RU +3284136960,3284137471,FR +3284137472,3284137983,UA +3284137984,3284138495,PL +3284138496,3284139007,RU +3284139008,3284172799,AT +3284172800,3284193279,DE +3284193280,3284195327,AT +3284195328,3284197375,DE +3284197376,3284199423,IL +3284199424,3284200447,DK +3284200448,3284201471,FR +3284201472,3284202495,PL +3284202496,3284203519,RS +3284203520,3284204031,DK +3284204032,3284204543,FI +3284204544,3284205311,DE +3284205312,3284205567,ES +3284205568,3284257535,NL +3284257536,3284257791,GB +3284257792,3284271103,NL +3284271104,3284399155,GB +3284399156,3284399159,BG +3284399160,3284402175,GB +3284402176,3284467711,SE +3284467712,3284533247,FI +3284533248,3284598783,SE +3284598784,3284664319,HU +3284664320,3284672511,GB +3284672512,3284680703,DE +3284680704,3284681215,UA +3284681728,3284682239,FI +3284682240,3284682751,DE +3284682752,3284683263,SE +3284683264,3284683775,KZ +3284683776,3284684287,GB +3284684288,3284684799,FR +3284684800,3284685311,DE +3284685312,3284685823,NL +3284685824,3284686335,DE +3284686336,3284686847,RO +3284686848,3284687359,PL +3284687360,3284687871,UA +3284687872,3284688383,NG +3284688384,3284688895,IT +3284688896,3284697087,FR +3284697088,3284705279,GB +3284705280,3284713471,FR +3284713472,3284713727,DE +3284713728,3284713983,GR +3284713984,3284714239,DE +3284714240,3284714495,FR +3284714496,3284714751,UA +3284714752,3284715007,AT +3284715008,3284715263,GB +3284715264,3284715519,PL +3284715520,3284715775,SI +3284715776,3284716031,BE +3284716032,3284716287,IT +3284716288,3284716543,RU +3284716544,3284716799,GR +3284716800,3284717055,IL +3284717056,3284717311,PL +3284717312,3284717567,DE +3284717568,3284717823,FR +3284717824,3284718079,RU +3284718336,3284718591,GB +3284718592,3284718847,PL +3284718848,3284719103,RU +3284719104,3284719359,PL +3284719616,3284719871,RU +3284719872,3284720127,FR +3284720128,3284720383,CH +3284720384,3284720895,SE +3284721152,3284721407,TR +3284721408,3284721663,NL +3284721664,3284722175,BE +3284722176,3284722687,RU +3284722688,3284723199,FR +3284723200,3284723711,GB +3284724224,3284724735,PL +3284724736,3284725247,RU +3284725248,3284725759,GR +3284725760,3284726271,LU +3284726272,3284726783,DE +3284726784,3284727295,UA +3284727296,3284727807,MK +3284727808,3284728319,RU +3284728320,3284728831,UA +3284728832,3284729343,PT +3284729344,3284729855,FR +3284729856,3284795391,DE +3284795392,3284803583,FR +3284803584,3284811775,DE +3284811776,3284819967,KE +3284819968,3284822272,GB +3284822273,3284822273,NL +3284822274,3284822274,IT +3284822275,3284822275,CH +3284822276,3284822276,ES +3284822277,3284822277,BE +3284822278,3284822278,RU +3284822279,3284822279,SE +3284822280,3284822280,IT +3284822281,3284822281,GB +3284822282,3284822282,FR +3284822283,3284822447,GB +3284822448,3284822479,NL +3284822480,3284828159,GB +3284828160,3284844543,AT +3284844544,3284860927,CH +3284860928,3284926463,DE +3284926464,3284991999,NO +3284992000,3285057535,PL +3285057536,3285065727,IT +3285065728,3285073919,RU +3285073920,3285074431,NL +3285074432,3285074687,GB +3285074688,3285076607,NL +3285076608,3285076767,BE +3285076768,3285078111,NL +3285078112,3285078143,GB +3285078144,3285078175,NL +3285078176,3285078191,GB +3285078192,3285079423,NL +3285079424,3285079551,DE +3285079552,3285079967,NL +3285079968,3285079999,DE +3285080000,3285082111,NL +3285082112,3285084159,AT +3285086208,3285088255,PL +3285088256,3285088511,RO +3285088512,3285088767,DK +3285088768,3285089279,RU +3285089280,3285090303,PL +3285090304,3285098495,DE +3285098496,3285114879,GB +3285114880,3285115903,RU +3285115904,3285116415,SI +3285116928,3285117439,UA +3285117952,3285118463,FR +3285118464,3285118975,UA +3285118976,3285119487,RU +3285119488,3285119999,RO +3285120000,3285120511,RU +3285121024,3285121535,SE +3285121536,3285122047,CY +3285122048,3285123071,RU +3285123072,3285188607,BE +3285188608,3285292799,RU +3285292800,3285293055,UA +3285293056,3285319679,RU +3285319680,3285320191,HU +3285320192,3285320703,RU +3285320704,3285321215,RO +3285321216,3285321727,DE +3285321728,3285322239,RU +3285322240,3285322751,DE +3285322752,3285323263,PL +3285323264,3285323775,CZ +3285323776,3285324287,CH +3285324288,3285324799,DK +3285324800,3285325311,RU +3285325312,3285325823,GB +3285325824,3285326335,PL +3285326336,3285326847,DE +3285326848,3285327359,SK +3285327360,3285328383,RU +3285328384,3285328895,PL +3285328896,3285329407,SE +3285329408,3285329919,GB +3285329920,3285330431,RO +3285330432,3285330943,FR +3285330944,3285331455,RO +3285331456,3285331967,KZ +3285331968,3285332991,DE +3285332992,3285333503,SE +3285333504,3285334015,GB +3285334016,3285334527,NL +3285334528,3285335039,DE +3285335040,3285335551,PL +3285335552,3285336063,SE +3285336064,3285344255,IT +3285344256,3285352447,GB +3285352448,3285368831,RU +3285368832,3285385215,SI +3285385216,3285386239,PL +3285386240,3285387263,RU +3285387264,3285388287,PL +3285388288,3285389311,CH +3285389312,3285390335,FI +3285390336,3285393407,RU +3285393408,3285394431,AT +3285394432,3285396479,RU +3285396480,3285397503,IR +3285397504,3285398527,NL +3285398528,3285399551,CZ +3285399552,3285400575,NL +3285400576,3285401599,UA +3285401600,3285402623,RU +3285402624,3285403647,IL +3285403648,3285404671,NL +3285404672,3285406719,RU +3285406720,3285407743,UA +3285407744,3285408767,RU +3285408768,3285409791,GB +3285409792,3285410815,UA +3285410816,3285412863,RU +3285412864,3285413887,UA +3285413888,3285414978,RU +3285414979,3285414979,UA +3285414980,3285419007,RU +3285419008,3285420031,SE +3285420032,3285425151,UA +3285425152,3285426175,LV +3285426176,3285427199,RU +3285427200,3285428223,GB +3285429248,3285430271,UA +3285430272,3285431295,DK +3285431296,3285432319,UZ +3285432320,3285434367,UA +3285434368,3285436415,RU +3285436416,3285437439,GR +3285437440,3285438463,RU +3285438464,3285440511,UA +3285440512,3285442559,RU +3285442560,3285443583,IE +3285443584,3285444607,UA +3285444608,3285446655,RU +3285446656,3285447679,UA +3285447680,3285449215,RU +3285449216,3285449471,GB +3285449472,3285449727,RU +3285449728,3285450751,UA +3285451456,3285451471,GB +3285452496,3285452511,GB +3285453440,3285453567,GB +3285453664,3285453695,GB +3285458176,3285458431,GB +3285461280,3285461299,NL +3285461432,3285461435,NL +3285461808,3285461839,NL +3285461844,3285461847,NL +3285461856,3285461859,NL +3285461864,3285461871,NL +3285461884,3285461887,NL +3285463168,3285463199,LU +3285467040,3285467103,BG +3285472256,3285472271,US +3285472272,3285472287,DE +3285472288,3285472511,US +3285477136,3285477151,IT +3285479396,3285479399,FR +3285480960,3285481215,CH +3285485568,3285485571,SK +3285488576,3285488639,CY +3285495296,3285495807,ES +3285501312,3285501363,CZ +3285501364,3285501367,US +3285501368,3285501383,CZ +3285501744,3285501759,GB +3285501920,3285501923,CZ +3285501928,3285501935,CZ +3285501944,3285501947,CZ +3285510144,3285512191,GB +3285515776,3285515799,GR +3285515816,3285515823,GR +3285516032,3285516095,HR +3285516288,3285581823,BE +3285581824,3285596159,DE +3285596160,3285596191,US +3285596192,3285596223,DE +3285596224,3285596255,US +3285596256,3285596287,DE +3285596288,3285596319,US +3285596320,3285596351,DE +3285596352,3285596383,FR +3285596384,3285597183,DE +3285597184,3285597215,US +3285597216,3285606399,DE +3285606400,3285614591,GB +3285614592,3285630975,TR +3285630976,3285633023,UA +3285633024,3285635071,NO +3285635072,3285637119,UA +3285637120,3285638143,DE +3285638144,3285639167,UA +3285639168,3285641215,FR +3285641216,3285642239,RU +3285642240,3285643263,UA +3285643264,3285645311,FR +3285645312,3285647359,BG +3285647360,3285712895,DK +3285712896,3285721087,GB +3285721088,3285729279,SE +3285729280,3285737471,CH +3285737472,3285745663,PL +3285753856,3285762047,LV +3285762048,3285762559,FR +3285762560,3285763071,RU +3285763072,3285763583,GB +3285763584,3285764095,DE +3285764096,3285764607,RU +3285765120,3285766143,UA +3285766656,3285767679,UA +3285767680,3285768191,FR +3285768192,3285768703,RU +3285768704,3285768959,RO +3285769216,3285769727,DE +3285769728,3285770239,RO +3285770240,3285770495,NL +3285770496,3285770751,US +3285770752,3285771007,UA +3285771008,3285771263,CH +3285771264,3285771519,BG +3285771520,3285771775,AT +3285771776,3285772031,RO +3285772032,3285772287,SE +3285772288,3285772543,TR +3285772544,3285772799,LT +3285773056,3285773311,DE +3285773312,3285773567,LV +3285773568,3285773823,KG +3285774080,3285774335,RO +3285774336,3285774591,CZ +3285774592,3285774847,RU +3285774848,3285775103,FR +3285775104,3285775615,RU +3285775872,3285776127,NL +3285776384,3285776639,UA +3285776640,3285776895,FR +3285776896,3285777151,PL +3285777152,3285777407,HU +3285777408,3285777663,IL +3285777664,3285777919,SI +3285777920,3285778175,PL +3285778176,3285778431,DE +3285778432,3285843967,GB +3285843968,3285852159,LU +3285852160,3285860351,GB +3285860352,3285868543,FI +3285868544,3285876735,IE +3285876736,3285909503,RU +3285910336,3285910399,ES +3285911552,3285912575,GB +3285913648,3285913655,IE +3285913656,3285913703,GB +3285913704,3285913711,FI +3285913712,3285913991,GB +3285914008,3285914015,GB +3285914624,3285914879,GB +3285915904,3285916159,AT +3285916416,3285916671,YE +3285917696,3285917703,GB +3285917712,3285917807,GB +3285917952,3285918463,GB +3285919744,3285921791,QA +3285921792,3285923839,FR +3285924352,3285924415,ES +3285924912,3285924919,CH +3285924920,3285924927,FI +3285924928,3285924943,DE +3285924944,3285924947,IT +3285924948,3285924951,AT +3285924952,3285924955,CH +3285924956,3285924959,PL +3285924960,3285924991,DE +3285924992,3285924995,FR +3285924996,3285924999,CZ +3285925000,3285925007,RU +3285925008,3285925059,DE +3285925060,3285925063,CH +3285925064,3285925071,RU +3285925072,3285925079,PL +3285925080,3285925087,IT +3285925088,3285925103,DE +3285925164,3285925171,CH +3285926432,3285926463,CH +3285926592,3285926623,DE +3285928304,3285928311,GB +3285929216,3285929231,DE +3285930752,3285931007,GB +3285931520,3285931527,HU +3285931528,3285931559,DE +3285931560,3285931567,HU +3285931568,3285931599,DE +3285931600,3285931775,HU +3285935872,3285936127,GB +3285936136,3285936147,FR +3285936152,3285936227,FR +3285939136,3285939175,GB +3285939184,3285939191,GB +3285939744,3285939759,GB +3285939840,3285939967,GB +3285940736,3285940767,IT +3285941248,3285941503,ES +3285943808,3285944063,CH +3285947136,3285947159,NL +3285947168,3285947175,NL +3285949604,3285949607,CH +3285949856,3285949887,ES +3285950208,3285950463,IT +3285951648,3285951679,ES +3285953536,3285953665,GB +3285953672,3285953735,GB +3285953792,3285953919,GB +3285954048,3285954303,AE +3285954560,3285954567,IT +3285954568,3285954575,PL +3285954576,3285954815,GB +3285958144,3285958399,BG +3285961984,3285961995,GB +3285962752,3285963775,DE +3285964800,3285964935,DE +3285964944,3285964991,DE +3285964992,3285965007,HU +3285965056,3285966079,DE +3285968896,3285970943,GB +3285975040,3286013695,FR +3286013696,3286013951,RE +3286013952,3286106111,FR +3286106112,3286114303,EE +3286114304,3286122495,BA +3286122496,3286130687,BY +3286130688,3286131711,RS +3286131712,3286132735,PL +3286132736,3286133759,RO +3286133760,3286134783,IE +3286134784,3286135807,PL +3286135808,3286136831,NL +3286136832,3286137855,AT +3286137856,3286138879,UA +3286138880,3286155263,RU +3286155264,3286171647,DE +3286171648,3286237183,IT +3286237184,3286302719,GB +3286302720,3286310911,NO +3286310912,3286311423,CH +3286311424,3286311935,NL +3286311936,3286312447,PL +3286312448,3286312959,RU +3286312960,3286313983,RO +3286313984,3286314495,CH +3286314496,3286315007,IL +3286315008,3286315519,UA +3286315520,3286315775,SI +3286315776,3286316031,BG +3286316032,3286316543,UA +3286316544,3286317055,NL +3286317056,3286317567,RU +3286317568,3286318079,RO +3286318080,3286318591,CH +3286320128,3286321151,PL +3286321152,3286322175,CZ +3286322176,3286323199,PL +3286323200,3286324223,GB +3286324224,3286325247,RO +3286325248,3286326271,DK +3286326272,3286327295,PL +3286327296,3286329343,NL +3286329344,3286330367,DE +3286330368,3286331391,RU +3286331392,3286332415,UA +3286332416,3286333439,CH +3286333440,3286334463,PL +3286334464,3286335487,BG +3286335488,3286336511,RU +3286336512,3286337535,DE +3286337536,3286338559,PL +3286338560,3286339583,RO +3286339584,3286340607,UA +3286340608,3286342655,DE +3286342656,3286343679,UA +3286343680,3286344703,RU +3286344704,3286345727,BE +3286345728,3286346751,IT +3286346752,3286347775,UA +3286347776,3286348799,PA +3286349824,3286350847,SE +3286350848,3286351871,GB +3286351872,3286352895,CH +3286352896,3286353919,DE +3286353920,3286354943,LI +3286354944,3286355967,FR +3286355968,3286356991,DE +3286356992,3286358015,PL +3286358016,3286359039,GB +3286360064,3286361087,IT +3286361088,3286362111,UA +3286362112,3286363135,RU +3286363136,3286364159,AT +3286364160,3286365183,DE +3286365184,3286367231,PL +3286367232,3286368255,BG +3286368256,3286376447,CH +3286376448,3286384639,GB +3286384640,3286401023,DE +3286401024,3286407167,GB +3286407168,3286408191,GG +3286408192,3286409215,GB +3286409216,3286417407,DE +3286417408,3286417663,UA +3286417664,3286417919,IT +3286417920,3286418175,DE +3286418176,3286418431,AT +3286418432,3286418687,TR +3286418944,3286419199,PL +3286419200,3286419455,DK +3286419456,3286419711,DE +3286419712,3286419967,GB +3286419968,3286420223,FI +3286420224,3286420735,RU +3286420736,3286420991,NL +3286420992,3286421247,RO +3286421248,3286421503,PL +3286421504,3286421759,KZ +3286421760,3286422015,RU +3286422016,3286422271,MD +3286422272,3286422527,FR +3286422528,3286422783,RO +3286422784,3286423039,UA +3286423040,3286423295,RO +3286423552,3286423807,RU +3286423808,3286424063,CZ +3286424064,3286424319,LV +3286424320,3286424575,FR +3286424832,3286425087,TR +3286425088,3286425343,RU +3286425344,3286425599,IT +3286425600,3286433791,KW +3286433792,3286499327,DE +3286499328,3286499583,HU +3286499584,3286499839,BG +3286499840,3286502143,HU +3286502144,3286502399,BG +3286502400,3286510335,HU +3286510336,3286510591,BG +3286510592,3286514431,HU +3286514432,3286514687,RO +3286514688,3286552575,HU +3286552576,3286553087,BG +3286553088,3286564863,HU +3286564864,3286566655,AE +3286566656,3286567423,KW +3286567424,3286630399,AE +3286630400,3286638591,BG +3286638592,3286646783,AT +3286646784,3286654975,RU +3286654976,3286655231,UA +3286655488,3286655743,LT +3286655744,3286655999,RU +3286656000,3286656255,CH +3286656256,3286656511,RU +3286656512,3286656767,GR +3286656768,3286657023,UA +3286657024,3286657279,BE +3286657536,3286657791,HU +3286658048,3286658303,DE +3286658304,3286658559,RU +3286658560,3286658815,NL +3286658816,3286659327,RU +3286659328,3286659583,PL +3286659584,3286659839,DE +3286659840,3286660095,UA +3286660096,3286660351,DE +3286660352,3286660607,CH +3286660608,3286660863,GB +3286660864,3286661119,UA +3286661120,3286661375,PL +3286661376,3286661631,SI +3286661632,3286661887,GB +3286661888,3286662143,RU +3286662144,3286662399,SK +3286662400,3286662655,UA +3286662656,3286662911,DE +3286662912,3286671359,UA +3286671360,3286679551,AT +3286679552,3286695935,IT +3286695936,3286761471,DK +3286761472,3286761727,DE +3286761728,3286769663,GB +3286769664,3286769919,DE +3286769920,3286773759,GB +3286773760,3286777855,DE +3286777856,3286781951,FR +3286781952,3286782207,GB +3286782208,3286782463,DE +3286782464,3286782535,GB +3286782536,3286782543,FR +3286782544,3286782575,GB +3286782576,3286782583,DE +3286782584,3286783599,GB +3286783600,3286783615,CH +3286783616,3286783679,DE +3286783680,3286784511,GB +3286784512,3286784767,CH +3286784768,3286785023,DE +3286785024,3286787071,GB +3286787072,3286787327,FR +3286787328,3286787583,DE +3286787584,3286788095,GB +3286788096,3286788351,DE +3286788352,3286788607,FR +3286788608,3286789119,GB +3286789120,3286789631,DE +3286789632,3286790143,FR +3286790144,3286790655,GB +3286790656,3286790911,DE +3286790912,3286791679,GB +3286791680,3286791935,AT +3286791936,3286794239,GB +3286794240,3286888447,DE +3286888448,3286889471,IE +3286889472,3286891007,DE +3286891008,3286891014,HU +3286891015,3286891015,DE +3286891016,3286891263,HU +3286891264,3286892543,DE +3286892544,3286893055,LI +3286893056,3286893567,RU +3286893568,3286894591,UA +3286894592,3286895103,PL +3286895104,3286895615,GB +3286895616,3286896127,DE +3286896128,3286896639,SE +3286896640,3286897151,PL +3286897152,3286897663,AT +3286897664,3286898175,PL +3286898176,3286898687,HR +3286899712,3286900223,DE +3286900224,3286900735,RO +3286900736,3286900991,BE +3286900992,3286901503,DE +3286901504,3286902015,FR +3286902016,3286902527,CH +3286902528,3286902783,GB +3286902784,3286903039,PL +3286903040,3286903551,FR +3286903552,3286903807,CH +3286903808,3286904063,AT +3286904064,3286904319,BE +3286904320,3286904575,FR +3286904576,3286904831,PT +3286904832,3286905087,GB +3286905088,3286905343,GR +3286905344,3286905599,DE +3286905600,3286905855,MT +3286906112,3286906367,BE +3286906368,3286906879,RO +3286906880,3286907135,RU +3286907136,3286907391,SE +3286907392,3286907647,AT +3286907648,3286907903,ES +3286907904,3286908159,CH +3286908160,3286908415,ES +3286908928,3286909951,CH +3286909952,3286913023,UA +3286913024,3286913535,GB +3286914048,3286915071,BG +3286915072,3286916095,FR +3286917120,3286918143,RU +3286918144,3286919167,AT +3286919168,3286920191,DE +3286921216,3286922239,UA +3286922240,3286923263,GB +3286925312,3286925823,DE +3286926080,3286926335,LV +3286926336,3286926591,UA +3286926592,3286926847,DE +3286926848,3286927103,PT +3286927104,3286927359,FI +3286927360,3286927615,DE +3286927616,3286927871,SI +3286927872,3286928127,BG +3286928128,3286928383,DE +3286928640,3286928895,PL +3286928896,3286929151,FI +3286929408,3286929663,LV +3286929664,3286929919,BE +3286929920,3286930175,SE +3286930432,3286930687,UA +3286930688,3286930943,DE +3286930944,3286931199,SE +3286931200,3286931455,AT +3286931456,3286931711,DE +3286931712,3286931967,GB +3286931968,3286932223,FR +3286932224,3286932479,DK +3286932736,3286932991,AT +3286932992,3286933247,IL +3286933504,3286933759,DK +3286934016,3286934271,BE +3286934272,3286934527,CH +3286934528,3286934783,PL +3286934784,3286935039,TR +3286935040,3286935551,ES +3286935552,3286935807,EG +3286936064,3286936319,RU +3286936320,3286936575,IT +3286936576,3286936831,RO +3286936832,3286937087,NL +3286937088,3286937343,UA +3286937344,3286937599,GB +3286937600,3286937855,CH +3286937856,3286938111,RO +3286938112,3286938367,DE +3286938624,3286938879,CH +3286939136,3286939391,RO +3286939392,3286939647,DE +3286939648,3286939903,BE +3286939904,3286940159,EG +3286940160,3286940415,BE +3286940416,3286940671,NL +3286940672,3286940927,RO +3286941184,3286941439,RU +3286941696,3286942719,DE +3286942720,3286943743,FI +3286943744,3286944767,RU +3286944768,3286945791,CZ +3286945792,3286946815,RU +3286946816,3286947839,UA +3286947840,3286948863,DE +3286948864,3286949887,UA +3286949888,3286950911,CH +3286950912,3286951935,DE +3286951936,3286952959,IT +3286952960,3286953983,BG +3286953984,3286955007,GB +3286955008,3286956031,DE +3286956032,3286957055,FR +3286957056,3286958079,EG +3286958080,3287023615,ES +3287023616,3287154687,FI +3287154688,3287162879,BE +3287162880,3287164927,US +3287164928,3287165183,DE +3287165184,3287165439,US +3287165440,3287165695,SA +3287165696,3287165951,US +3287165952,3287166207,SA +3287166208,3287167487,US +3287167488,3287167743,SA +3287167744,3287168767,US +3287168768,3287169279,SA +3287169280,3287169535,US +3287169536,3287169791,SA +3287169792,3287170303,US +3287170304,3287170559,DE +3287170560,3287171071,US +3287171072,3287171583,EE +3287171584,3287172095,PL +3287172608,3287173119,PL +3287173120,3287173631,RU +3287173632,3287174143,NL +3287174144,3287174655,SE +3287175168,3287176191,RO +3287176192,3287176703,BG +3287176704,3287177215,NL +3287177216,3287178239,RO +3287178240,3287178751,UA +3287179264,3287180287,FR +3287180288,3287181311,RU +3287181312,3287182335,UZ +3287182336,3287185407,UA +3287187456,3287196671,DE +3287196672,3287198719,PL +3287198720,3287199743,GB +3287199744,3287201791,UA +3287201792,3287202815,PL +3287202816,3287203839,UA +3287203840,3287212031,FI +3287212032,3287212543,DE +3287212544,3287212799,FR +3287212800,3287213311,PL +3287213312,3287213567,FR +3287213568,3287213823,RU +3287214080,3287214335,GB +3287214336,3287214591,DE +3287214592,3287214847,NO +3287214848,3287215103,IT +3287215104,3287215359,PL +3287215360,3287215615,GB +3287215616,3287215871,DE +3287215872,3287216127,RU +3287216384,3287216639,GB +3287217152,3287217407,NL +3287217408,3287217663,PL +3287217664,3287217919,RU +3287218432,3287218687,GB +3287218688,3287218943,RU +3287218944,3287219199,FR +3287219456,3287219711,CH +3287219712,3287220223,SE +3287220224,3287285759,RU +3287285760,3287416831,NL +3287416832,3287425023,RU +3287425024,3287433215,SE +3287433216,3287433727,PL +3287433728,3287434239,DE +3287434240,3287434751,PL +3287434752,3287435263,GB +3287435264,3287435775,NL +3287436288,3287436799,RS +3287436800,3287437311,RO +3287437312,3287437823,UA +3287437824,3287438335,RU +3287438336,3287438847,CH +3287438848,3287439359,GB +3287439360,3287439871,RO +3287439872,3287440895,PL +3287440896,3287441407,UA +3287441408,3287442431,NL +3287443456,3287443967,DE +3287443968,3287444479,BG +3287444480,3287444991,PL +3287445504,3287446527,UA +3287446528,3287447039,PL +3287447552,3287448063,DK +3287448064,3287448575,GB +3287448576,3287449087,PL +3287449088,3287449599,BG +3287449600,3287450111,PL +3287450112,3287450623,DK +3287450624,3287451135,SE +3287451136,3287451647,PL +3287451648,3287452159,ES +3287452160,3287452671,PL +3287452672,3287453183,CH +3287453184,3287454207,RU +3287454208,3287454719,SE +3287455232,3287455743,UA +3287455744,3287456255,NL +3287456256,3287457279,GB +3287457280,3287457791,RO +3287457792,3287458047,NL +3287458048,3287458303,UA +3287458304,3287458559,DE +3287458560,3287459327,CH +3287459328,3287459583,AT +3287459584,3287459839,DE +3287459840,3287460095,AT +3287460096,3287460351,ME +3287460352,3287460607,CY +3287460608,3287460863,NL +3287460864,3287461119,BE +3287461120,3287461375,DE +3287461376,3287461631,CH +3287461632,3287461887,AT +3287461888,3287462143,PL +3287462656,3287462911,UA +3287462912,3287463167,FR +3287463168,3287463423,IT +3287463680,3287463935,PL +3287463936,3287464191,AT +3287464192,3287464447,SK +3287464448,3287464703,PL +3287464960,3287465215,SA +3287465216,3287465471,SE +3287465472,3287465727,DE +3287465728,3287465983,FR +3287465984,3287467007,DK +3287467008,3287468031,SA +3287468032,3287469055,UA +3287469056,3287470079,DE +3287471360,3287471615,CH +3287472128,3287472639,RU +3287472640,3287473151,UA +3287473152,3287474175,GB +3287474176,3287476223,DE +3287476224,3287477247,PL +3287477248,3287478271,GB +3287479296,3287480319,RO +3287480320,3287481343,LI +3287481344,3287482367,PL +3287482368,3287548415,DE +3287548928,3287549439,UA +3287549440,3287549951,SE +3287549952,3287550463,UA +3287550464,3287550975,DE +3287550976,3287551487,LT +3287552000,3287552511,GB +3287553024,3287553535,FR +3287553536,3287554047,IL +3287554048,3287554559,RU +3287554560,3287555071,PL +3287555072,3287555583,GB +3287555584,3287556095,US +3287556096,3287563007,TR +3287563008,3287563263,US +3287563264,3287564287,TR +3287564288,3287572479,FI +3287572480,3287580671,DE +3287580672,3287588863,LV +3287588864,3287597055,BE +3287597056,3287605247,GI +3287605248,3287630335,DE +3287630336,3287631359,PL +3287631360,3287631871,IR +3287631872,3287632383,RU +3287632384,3287632895,SE +3287632896,3287633407,RU +3287633408,3287633919,SK +3287633920,3287634431,UA +3287634432,3287634943,RO +3287634944,3287635455,PL +3287635456,3287635967,DE +3287636480,3287636991,IE +3287636992,3287637503,AT +3287637504,3287638015,PL +3287639040,3287639551,GB +3287640064,3287640575,PL +3287640576,3287641087,SI +3287642112,3287642623,NL +3287642624,3287643135,BE +3287643136,3287643647,IT +3287643648,3287644671,UA +3287644672,3287645183,NL +3287646208,3287662591,PT +3287662592,3287662847,DE +3287662848,3287663103,DK +3287663104,3287663359,LV +3287663616,3287663871,NL +3287663872,3287664127,PT +3287664128,3287664383,PL +3287664384,3287664639,US +3287664640,3287664895,UA +3287664896,3287665151,GB +3287665152,3287665407,NO +3287665408,3287665919,PL +3287665920,3287666431,RU +3287666688,3287666943,SI +3287666944,3287667199,CZ +3287667200,3287667455,DK +3287667456,3287667711,RU +3287667712,3287667967,ES +3287667968,3287668223,PL +3287668224,3287668479,RU +3287668480,3287668735,UA +3287668736,3287668991,SI +3287668992,3287669247,PL +3287669248,3287669503,LI +3287669760,3287670015,RO +3287670016,3287670271,UA +3287670272,3287670527,PL +3287670528,3287670783,GB +3287670784,3287671039,PL +3287671040,3287671295,AT +3287671296,3287671551,PL +3287671552,3287671807,TR +3287671808,3287672063,CH +3287672320,3287672575,DE +3287672576,3287672831,NL +3287672832,3287673087,RU +3287673088,3287673343,SK +3287673344,3287673599,PT +3287673600,3287673855,GB +3287673856,3287674111,NL +3287674112,3287674367,CH +3287674880,3287675135,SE +3287675648,3287675903,DE +3287675904,3287676159,RU +3287676160,3287676415,DE +3287676672,3287676927,GB +3287676928,3287677183,ES +3287677184,3287677439,RU +3287677440,3287677695,SI +3287677696,3287677951,RO +3287677952,3287678207,GB +3287678208,3287678463,UA +3287678464,3287678719,DE +3287678720,3287678975,HR +3287678976,3287687167,SI +3287687168,3287695359,EG +3287695360,3287703551,CH +3287703552,3287704063,CZ +3287704064,3287704575,NL +3287704576,3287705087,LU +3287705088,3287705599,TJ +3287705600,3287706111,SA +3287706112,3287706623,RU +3287706624,3287707135,GB +3287707648,3287708159,BE +3287708160,3287709183,NL +3287709184,3287709695,RU +3287709696,3287710207,SE +3287710208,3287710719,RU +3287710720,3287711231,UA +3287711232,3287711743,PL +3287711744,3287719935,GB +3287719936,3287728127,DE +3287728128,3287729407,IT +3287729664,3287729919,DK +3287729920,3287730175,HU +3287732224,3287734271,IT +3287734272,3287734527,PL +3287734528,3287734783,UA +3287734784,3287735039,RU +3287735296,3287736319,IT +3287736320,3287736831,PL +3287736832,3287737343,LV +3287737344,3287737855,GB +3287737856,3287738367,FR +3287738368,3287738879,GB +3287738880,3287739391,DE +3287739392,3287739903,NL +3287739904,3287740415,PT +3287740416,3287740927,BG +3287740928,3287741439,RO +3287741440,3287741951,CH +3287742976,3287743487,RO +3287743488,3287743999,DE +3287744512,3287810047,DE +3287810048,3287818239,FR +3287818240,3287826431,AT +3287826432,3287826687,LV +3287826688,3287826943,RO +3287826944,3287827199,RU +3287827200,3287827455,DE +3287827456,3287827711,SI +3287827712,3287827967,RU +3287827968,3287828223,GB +3287828224,3287828479,DE +3287828480,3287828735,PL +3287828736,3287828991,AT +3287828992,3287829247,DE +3287829248,3287829503,GB +3287829504,3287829759,RO +3287829760,3287830015,NL +3287830016,3287830271,NO +3287830272,3287830527,RO +3287830528,3287830783,IE +3287830784,3287831039,GB +3287831040,3287831295,RU +3287831296,3287831551,CH +3287831808,3287832063,AT +3287832064,3287832319,FI +3287832320,3287832575,NL +3287832576,3287832831,PL +3287832832,3287833087,DE +3287833088,3287833343,GB +3287833344,3287833855,CH +3287833856,3287834111,UA +3287834112,3287834367,RU +3287834368,3287834623,HU +3287834624,3287842815,GB +3287842816,3287851007,DE +3287851008,3287859199,UA +3287859200,3287859455,GB +3287859968,3287860479,GB +3287861248,3287862015,GB +3287863808,3287864063,GB +3287866384,3287866439,GB +3287866496,3287866591,GB +3287866608,3287866623,GB +3287867392,3287867903,UA +3287867904,3287868415,PL +3287868416,3287868927,RO +3287868928,3287869439,ES +3287869440,3287869951,RU +3287869952,3287870463,UA +3287870464,3287870975,RU +3287870976,3287871487,NL +3287873024,3287873535,PL +3287873536,3287874047,RU +3287874048,3287874559,FR +3287874560,3287875071,DE +3287875072,3287875583,PL +3287875584,3287941119,DK +3287941120,3287949311,IT +3287949312,3287949567,AT +3287949568,3287949823,IL +3287949824,3287950079,IT +3287950080,3287950335,DE +3287950336,3287950591,UA +3287950592,3287951103,PL +3287951104,3287951359,HU +3287951360,3287951615,FR +3287951616,3287951871,CH +3287951872,3287952127,RU +3287952128,3287952383,UA +3287952384,3287953151,CH +3287953152,3287953407,UA +3287953408,3287953663,DE +3287953664,3287953919,GB +3287953920,3287954175,DE +3287954176,3287954431,RU +3287954432,3287954687,CH +3287954688,3287954943,RO +3287954944,3287955199,PL +3287955456,3287955711,RU +3287955712,3287955967,DE +3287955968,3287956223,SI +3287956224,3287956479,RO +3287956480,3287956735,BG +3287956736,3287956991,SE +3287956992,3287957247,UA +3287957504,3287965695,AM +3287965696,3287973887,RS +3287973888,3287982079,CZ +3287982080,3287990271,EE +3287990272,3287994367,SI +3287994368,3287995391,BA +3287995392,3287996415,SI +3287996416,3287998463,BA +3287998464,3288006655,IT +3288006656,3288072191,GR +3288072192,3288088575,SE +3288088576,3288104959,RS +3288104960,3288159231,DE +3288159232,3288160255,NL +3288160256,3288236031,DE +3288236032,3288236543,LI +3288236544,3288237055,FR +3288237056,3288238591,RO +3288238592,3288239103,PL +3288239104,3288239615,RO +3288240128,3288240639,CH +3288240640,3288241151,FR +3288241152,3288241663,ES +3288241664,3288242175,UA +3288242176,3288242687,RO +3288243200,3288243711,PL +3288243712,3288244735,FR +3288244736,3288245247,DE +3288245248,3288245759,GB +3288245760,3288246271,RO +3288246272,3288246783,DK +3288246784,3288247295,KW +3288247296,3288247807,NO +3288247808,3288248831,PL +3288248832,3288249855,GB +3288249856,3288250367,RO +3288250368,3288250879,PL +3288251392,3288251903,RU +3288251904,3288252415,AT +3288252416,3288260607,NO +3288260608,3288268799,IT +3288268800,3288334335,FI +3288334336,3288399871,UG +3288399872,3288400127,MU +3288400128,3288400383,IN +3288400384,3288400639,PR +3288400640,3288400895,SA +3288400896,3288401151,KE +3288401152,3288401407,RU +3288401408,3288401663,SA +3288401664,3288401919,MU +3288401920,3288403711,ZA +3288403712,3288403967,AO +3288403968,3288406527,ZA +3288406528,3288407039,KE +3288407040,3288408063,NA +3288408064,3288413183,ZA +3288413184,3288414207,TZ +3288414208,3288416255,ZA +3288416256,3288417279,SA +3288417280,3288417535,IN +3288417536,3288418047,KW +3288418048,3288418303,ZA +3288418304,3288418815,US +3288418816,3288423423,ZA +3288423424,3288425727,SN +3288425728,3288426495,ZA +3288426496,3288427263,IN +3288427264,3288427519,BM +3288427520,3288428543,IN +3288428544,3288428799,CU +3288428800,3288429311,IN +3288429312,3288429567,ZA +3288429568,3288430079,KE +3288430080,3288430335,GH +3288430592,3288432639,SC +3288432640,3288433407,ZA +3288433408,3288433919,KE +3288433920,3288434175,NG +3288434176,3288434431,IN +3288434432,3288434687,CU +3288434688,3288434943,JM +3288434944,3288435199,CD +3288435200,3288435711,JM +3288435712,3288435967,US +3288435968,3288436223,PR +3288436224,3288436479,US +3288436480,3288436735,EG +3288436736,3288440831,ZA +3288440832,3288441343,VC +3288441344,3288442879,BB +3288442880,3288443135,KN +3288443136,3288443647,VC +3288443648,3288444927,BB +3288444928,3288449023,NG +3288449024,3288465407,SD +3288465408,3288465919,JM +3288465920,3288466431,ZA +3288466432,3288467455,SY +3288467456,3288469503,BI +3288469504,3288481791,ZA +3288481792,3288482303,ZW +3288482304,3288485631,ZA +3288485632,3288485887,ZW +3288485888,3288489983,MA +3288489984,3288514559,ZA +3288514560,3288522751,EG +3288522752,3288530943,ZA +3288530944,3288532991,JM +3288532992,3288534527,PR +3288534528,3288535039,EG +3288535040,3288539135,CW +3288539136,3288543871,US +3288543872,3288543983,GB +3288543984,3288543986,US +3288543987,3288543987,CH +3288543988,3288544767,US +3288544768,3288545023,MX +3288545024,3288545279,FR +3288545280,3288545535,US +3288545536,3288545791,ZA +3288545792,3288546303,KE +3288547072,3288547327,NG +3288547328,3288547583,GH +3288547584,3288547839,IN +3288547840,3288548095,SA +3288548096,3288549375,AE +3288549376,3288549631,PK +3288549632,3288549887,GD +3288549888,3288553983,DO +3288553984,3288554239,CM +3288554240,3288554495,IR +3288554496,3288555007,ZA +3288555008,3288555263,NA +3288555264,3288555519,JM +3288555520,3288557567,MZ +3288557568,3288557823,JM +3288557824,3288558079,ZA +3288558080,3288558335,DO +3288558336,3288558847,ZA +3288558848,3288559103,MU +3288559104,3288564735,ZA +3288564736,3288568831,TT +3288568832,3288569855,ZA +3288569856,3288570111,CU +3288570112,3288570367,JM +3288570368,3288577023,ZA +3288578048,3288580095,JM +3288580096,3288588287,BB +3288588288,3288608255,ZA +3288608256,3288608264,US +3288608265,3288608265,DE +3288608266,3288614655,US +3288614656,3288616959,ZA +3288616960,3288617215,ZW +3288617216,3288661759,ZA +3288661760,3288662015,LS +3288662016,3288753919,ZA +3288753920,3288754175,NG +3288754176,3288758271,ZA +3288758272,3288758527,EG +3288758528,3288774911,ZA +3288774912,3288775167,EG +3288775168,3288777727,NG +3288777728,3288778239,TZ +3288778240,3288778495,ZA +3288778496,3288778751,MU +3288778752,3288779007,EG +3288779008,3288779263,ZA +3288779264,3288779775,KE +3288779776,3288780799,NG +3288780800,3288782591,ZA +3288782592,3288782847,KE +3288782848,3288783359,NG +3288783872,3288784127,KE +3288784128,3288785407,ZA +3288785408,3288785663,UG +3288785664,3288785919,TZ +3288785920,3288786175,NG +3288786176,3288786431,KE +3288786432,3288787967,ZA +3288787968,3288788223,EG +3288788224,3288792831,ZA +3288792832,3288793087,AO +3288793088,3289002751,ZA +3289002752,3289003007,AO +3289003008,3289004031,ZA +3289004032,3289005055,NG +3289005056,3289005311,TZ +3289005312,3289014527,ZA +3289014528,3289014783,EG +3289014784,3289015295,ZA +3289015296,3289015551,CM +3289015552,3289020159,ZA +3289020160,3289020415,UG +3289020416,3289020671,EG +3289020672,3289020927,ZA +3289020928,3289021439,CI +3289021440,3289024767,ZA +3289024768,3289025023,GH +3289025024,3289025535,UG +3289025536,3289027327,ZA +3289027328,3289027583,TZ +3289027584,3289027839,MZ +3289027840,3289044735,ZA +3289044736,3289044991,GH +3289044992,3289047039,ML +3289047040,3289048063,ZA +3289048064,3289048319,UG +3289048320,3289048831,ZA +3289048832,3289049087,NG +3289049088,3289053951,ZA +3289053952,3289055231,NG +3289055232,3289070591,ZA +3289070592,3289070847,NA +3289070848,3289071103,ZA +3289071104,3289071359,SO +3289071360,3289074431,ZA +3289074432,3289074687,DZ +3289074688,3289075711,ZA +3289075712,3289077759,MW +3289077760,3289078271,KE +3289078272,3289078527,GH +3289078528,3289081855,ZA +3289081856,3289082111,NG +3289082112,3289086975,ZA +3289086976,3289087231,SZ +3289087232,3289089791,ZA +3289089792,3289090047,MZ +3289090048,3289093631,ZA +3289093632,3289094143,NG +3289094144,3289100031,ZA +3289100032,3289100287,LS +3289100288,3289102335,ZA +3289102336,3289103359,NG +3289103360,3289103615,ZA +3289103616,3289103871,AO +3289103872,3289104383,KE +3289104384,3289107967,ZA +3289107968,3289108479,GH +3289108480,3289114367,ZA +3289114368,3289114623,NG +3289114624,3289115135,ZA +3289115136,3289115391,AO +3289115392,3289120511,ZA +3289120512,3289120767,TZ +3289120768,3289123327,PR +3289123328,3289123583,NA +3289123584,3289123839,EG +3289123840,3289124863,ZM +3289124864,3289128959,ZA +3289128960,3289137151,IN +3289137152,3289153535,BM +3289153536,3289156607,MU +3289156608,3289158655,RW +3289158656,3289161727,MU +3289161728,3289169919,PR +3289169920,3289186303,MA +3289186304,3289186559,NG +3289186560,3289212159,ZA +3289212160,3289212415,MZ +3289212416,3289212927,NG +3289212928,3289213183,ZM +3289213184,3289213439,TZ +3289213440,3289213951,ZA +3289213952,3289214207,MA +3289214208,3289214463,AO +3289214464,3289214719,CD +3289214720,3289215231,NG +3289215232,3289217279,ZA +3289217280,3289217535,KE +3289217536,3289217791,UG +3289217792,3289218047,GH +3289218048,3289218303,ZA +3289218304,3289218559,MU +3289218560,3289220351,ZA +3289220352,3289220607,TZ +3289220608,3289221119,ZA +3289221120,3289221631,KE +3289221632,3289227519,ZA +3289227520,3289227775,NG +3289227776,3289229311,ZA +3289229312,3289229567,SZ +3289229568,3289230591,ZA +3289230592,3289230847,KE +3289230848,3289231359,GH +3289231360,3289233919,ZA +3289233920,3289234175,TZ +3289234176,3289235455,ZA +3289235456,3289237503,GH +3289237504,3289238015,ZA +3289238016,3289238271,KE +3289238272,3289238527,UG +3289238528,3289238783,AO +3289238784,3289239039,ZA +3289239040,3289239295,EG +3289239296,3289239551,BF +3289239552,3289239807,SC +3289239808,3289240063,KE +3289240064,3289243391,ZA +3289243392,3289243647,BI +3289243648,3289248255,ZA +3289248256,3289248511,NG +3289248512,3289248767,AO +3289248768,3289249023,EG +3289249024,3289249279,NG +3289249280,3289250815,ZA +3289250816,3289251071,GH +3289251072,3289251327,EG +3289251328,3289251583,ZA +3289251584,3289251839,KE +3289251840,3289319423,ZA +3289319424,3289319679,MU +3289319680,3289319935,ZA +3289319936,3289320447,MU +3289320448,3289321471,ZA +3289321472,3289325567,IN +3289325568,3289333759,SA +3289333760,3289382911,ZA +3289382912,3289387007,NL +3289387008,3289399295,US +3289399296,3289400319,SC +3289400320,3289401343,US +3289401344,3289402367,SC +3289402368,3289403391,US +3289403392,3289404415,SC +3289404416,3289405439,US +3289405440,3289406463,SC +3289406464,3289409535,US +3289409536,3289410047,BE +3289410048,3289410559,CH +3289410560,3289411583,US +3289411584,3289412607,NL +3289412608,3289413631,US +3289413632,3289414655,GB +3289414656,3289415679,US +3289415680,3289424895,SC +3289424896,3289430015,US +3289430016,3289431039,GB +3289431040,3289434111,US +3289434112,3289434367,GB +3289434368,3289435135,SC +3289435136,3289436159,US +3289436160,3289437183,AU +3289437184,3289438207,SC +3289438208,3289439231,AU +3289439232,3289439487,DE +3289439488,3289439743,GB +3289439744,3289439999,US +3289440000,3289440255,SC +3289440256,3289440511,ZA +3289440512,3289441023,US +3289441024,3289441279,ZA +3289441280,3289441535,US +3289441536,3289441791,ZA +3289441792,3289442047,US +3289442048,3289442303,ZA +3289442304,3289445375,US +3289445376,3289445631,DE +3289445632,3289445887,US +3289445888,3289446143,ZA +3289446144,3289446399,US +3289446400,3289446655,ZA +3289446656,3289446911,US +3289446912,3289447167,ZA +3289447168,3289447423,US +3289447424,3289448447,ZA +3289448448,3289465855,US +3289465856,3289466879,SC +3289466880,3289467903,US +3289467904,3289468927,SC +3289468928,3289469951,US +3289469952,3289470975,SC +3289470976,3289471999,US +3289472000,3289472511,SC +3289472512,3289472767,NL +3289472768,3289473023,GB +3289473024,3289475071,US +3289475072,3289475583,HU +3289475584,3289475839,GB +3289475840,3289476095,SC +3289476096,3289477119,US +3289477120,3289478143,GB +3289478144,3289481215,US +3289481216,3289490431,SC +3289490432,3289491455,US +3289491456,3289492479,GB +3289492480,3289493503,US +3289493504,3289494527,GB +3289494528,3289495551,US +3289495552,3289496575,GB +3289496576,3289499647,US +3289499648,3289499903,GB +3289499904,3289500671,SC +3289500672,3289501695,US +3289501696,3289502719,AU +3289502720,3289503743,SC +3289503744,3289504767,AU +3289504768,3289505535,SC +3289505536,3289505791,DE +3289505792,3289506047,US +3289506048,3289507839,SC +3289507840,3289517055,US +3289517056,3289518079,DE +3289518080,3289530367,US +3289530368,3289538559,NL +3289538560,3289540607,US +3289540608,3289541119,ES +3289541120,3289541631,AU +3289541632,3289542655,US +3289542656,3289543679,GB +3289543680,3289544703,US +3289544704,3289545727,AU +3289545728,3289546751,US +3289546752,3289550847,SC +3289550848,3289553919,US +3289553920,3289554943,GB +3289554944,3289555967,US +3289555968,3289556991,GB +3289556992,3289558015,US +3289558016,3289558527,ID +3289558528,3289558783,GB +3289558784,3289559039,NL +3289559040,3289560063,US +3289560064,3289561087,SC +3289561088,3289562111,US +3289562112,3289563135,SC +3289563136,3289565183,US +3289565184,3289565439,GB +3289565440,3289566207,SC +3289566208,3289567231,US +3289567232,3289568255,AU +3289568256,3289569023,SC +3289569024,3289569279,GB +3289569280,3289571327,AU +3289571328,3289571583,US +3289571584,3289571839,SC +3289571840,3289572095,US +3289572096,3289572351,DE +3289572352,3289572607,US +3289572608,3289572863,SC +3289572864,3289581567,US +3289581568,3289582591,DE +3289582592,3289595903,US +3289595904,3289604095,NL +3289604096,3289606143,US +3289606144,3289606655,AT +3289606656,3289607167,HK +3289607168,3289630719,US +3289630720,3289630975,GB +3289630976,3289631743,SC +3289631744,3289632767,US +3289632768,3289633791,AU +3289633792,3289634815,US +3289634816,3289636863,SC +3289636864,3289637887,CN +3289637888,3289638911,AU +3289638912,3289639935,SC +3289639936,3289640191,AU +3289640192,3289640447,GB +3289640448,3289640959,IE +3289640960,3289641727,SC +3289641728,3289641983,DE +3289641984,3289642239,SC +3289642240,3289642495,US +3289642496,3289644031,SC +3289644032,3289645055,US +3289645056,3289653247,NA +3289653248,3289661439,EG +3289661440,3289677823,DZ +3289677824,3289710591,MU +3289710592,3289777407,ZA +3289777408,3289777663,EG +3289777664,3289777919,NG +3289777920,3289778175,EG +3289779200,3289780223,GW +3289780224,3289788415,ZA +3289788416,3289792511,MZ +3289792512,3289809407,ZA +3289809408,3289809663,EG +3289809664,3289809919,KE +3289809920,3289812991,ZA +3289812992,3289817087,MU +3289817088,3289907199,ZA +3289907200,3289908223,LS +3289908224,3289923583,ZA +3289923584,3289924607,SZ +3289924608,3290031103,ZA +3290031104,3290031359,LS +3290031360,3290060287,ZA +3290060288,3290060543,SZ +3290060544,3290103807,ZA +3290103808,3290110335,CA +3290110336,3290110367,US +3290110368,3290120191,CA +3290120192,3290128383,MU +3290128384,3290136575,ZW +3290136576,3290169343,NG +3290169344,3290171135,ZA +3290171136,3290171391,SZ +3290171392,3290171903,ZA +3290171904,3290172159,NG +3290172160,3290172415,KE +3290172416,3290181631,ZA +3290181632,3290181887,US +3290181888,3290182399,PR +3290182400,3290182655,US +3290182656,3290183423,PR +3290183424,3290183679,US +3290183680,3290184959,PR +3290184960,3290185215,US +3290185216,3290185727,PR +3290185728,3290226687,ZA +3290226688,3290230783,MZ +3290230784,3290234879,BF +3290234880,3290243071,ZA +3290243072,3290245119,ZW +3290245120,3290246143,DZ +3290246144,3290247167,NG +3290247168,3290249215,TZ +3290249216,3290251263,ZA +3290251264,3290259455,TT +3290259456,3290267647,GH +3290267648,3290275839,ZA +3290275840,3290284031,SD +3290284032,3290288127,AO +3290292224,3290296319,GH +3290296320,3290423295,ZA +3290423296,3290427391,NA +3290427392,3290431487,ZA +3290431488,3290433535,JM +3290433536,3290435583,ZA +3290435584,3290439679,DZ +3290439680,3290447871,TT +3290447872,3290456063,AR +3290456064,3290460159,ZA +3290460160,3290464255,ML +3290464256,3290472447,PR +3290480640,3290482687,AO +3290482688,3290484735,CF +3290484736,3290486783,ZA +3290486784,3290488831,MA +3290488832,3290489343,NG +3290489344,3290489855,KE +3290489856,3290490367,EG +3290490368,3290492927,ZA +3290492928,3290494975,TZ +3290494976,3290718975,ZA +3290718976,3290719231,SZ +3290719232,3290955775,ZA +3290955776,3290980351,CR +3290980352,3290984447,ZA +3290984448,3290988543,MZ +3290988544,3290992639,KE +3290992640,3290996735,GH +3290996736,3291000831,NG +3291000832,3291004927,ZA +3291004928,3291021311,NG +3291021312,3291029503,ZA +3291029504,3291037695,TZ +3291037696,3291038463,ZA +3291038464,3291038719,CD +3291038720,3291038975,KE +3291038976,3291039231,NG +3291039232,3291039487,ZA +3291039488,3291039743,BF +3291039744,3291039999,ZA +3291040000,3291040255,EG +3291040256,3291040511,ZM +3291040512,3291040767,CI +3291040768,3291041023,TZ +3291041024,3291041279,AO +3291041280,3291041535,ZA +3291041536,3291041791,TD +3291041792,3291042047,NG +3291042048,3291042303,ZA +3291042304,3291042559,AO +3291042560,3291042815,EG +3291042816,3291043071,NG +3291043072,3291043327,ZA +3291043328,3291043583,TZ +3291043584,3291043839,KE +3291043840,3291044095,ZW +3291044096,3291044351,KE +3291044352,3291044607,GN +3291044608,3291044863,KE +3291044864,3291045119,AO +3291045120,3291045375,KE +3291045376,3291045631,NG +3291045632,3291045887,TN +3291045888,3291078655,ZA +3291078656,3291086847,DZ +3291086848,3291103231,PR +3291103232,3291119615,ZA +3291119616,3291148287,BG +3291148288,3291168767,ZA +3291168768,3291176959,TZ +3291176960,3291185151,ZW +3291185152,3291201535,UG +3291201536,3291201791,KE +3291201792,3291202047,ZM +3291202048,3291202303,GH +3291202304,3291202559,ZA +3291202560,3291202815,GH +3291202816,3291203071,AO +3291203072,3291203327,EG +3291203328,3291203583,ZW +3291203584,3291203839,ZA +3291203840,3291204095,EG +3291204096,3291204351,KE +3291204352,3291204863,ZA +3291204864,3291205119,KE +3291205120,3291205631,GH +3291205632,3291206143,ZA +3291206144,3291206399,AO +3291206400,3291206911,KE +3291206912,3291207167,ZA +3291207168,3291207423,MG +3291207424,3291207679,NG +3291207680,3291207935,BW +3291207936,3291208447,KE +3291208448,3291208703,EG +3291208704,3291208959,KE +3291208960,3291209215,TZ +3291209216,3291209471,KE +3291209472,3291209727,AO +3291209728,3291209983,NG +3291209984,3291210239,GH +3291210240,3291210495,UG +3291210496,3291210751,ZA +3291210752,3291211007,KE +3291211008,3291211263,SL +3291211264,3291211519,TZ +3291211520,3291211775,ZA +3291211776,3291212287,NG +3291212288,3291212543,MZ +3291212544,3291212799,NG +3291212800,3291213055,MA +3291213056,3291213311,EG +3291213312,3291213567,NG +3291213568,3291213823,KE +3291213824,3291214079,CG +3291214080,3291214335,MZ +3291214336,3291214591,GH +3291214592,3291214847,ZA +3291214848,3291215103,NG +3291215104,3291215615,KE +3291215616,3291215871,BF +3291215872,3291216127,KE +3291216128,3291216383,LS +3291216384,3291216639,ZA +3291216640,3291217151,NG +3291217152,3291217407,ZA +3291217408,3291217919,TZ +3291217920,3291242495,ZA +3291242496,3291250687,GH +3291250688,3291258879,NA +3291258880,3291262975,TZ +3291262976,3291267071,ZW +3291267072,3291279359,ZA +3291279360,3291283455,RW +3291287552,3291291647,ZA +3291291648,3291295743,TZ +3291295744,3291299839,NG +3291299840,3291312127,ZA +3291312128,3291313151,MU +3291313152,3291314175,NG +3291314176,3291315199,ZA +3291315200,3291316223,UG +3291316224,3291324415,TZ +3291324416,3291325439,AO +3291325440,3291326463,BW +3291326464,3291330559,ZA +3291330560,3291331583,TZ +3291331584,3291332607,MW +3291332608,3291348991,ZA +3291348992,3291353087,MZ +3291353088,3291353343,KE +3291353344,3291353599,EG +3291353600,3291354111,ZM +3291354112,3291354367,NG +3291354368,3291354623,AO +3291354624,3291354879,EG +3291354880,3291355135,ZA +3291355136,3291355391,EG +3291355392,3291355647,ZA +3291355648,3291355903,EG +3291355904,3291356159,NG +3291356160,3291356415,NA +3291356416,3291356671,EG +3291356672,3291357183,ZA +3291357184,3291365375,MU +3291365376,3291367423,ZA +3291367424,3291369471,AO +3291369472,3291373567,GH +3291373568,3291377663,TZ +3291377664,3291378687,CD +3291378688,3291379711,ZA +3291379712,3291380735,TZ +3291380736,3291381759,ZM +3291381760,3291383807,TZ +3291383808,3291385855,ZA +3291385856,3291386879,NG +3291386880,3291387903,SC +3291387904,3291388927,BJ +3291388928,3291389343,GA +3291389344,3291389347,CG +3291389348,3291389951,GA +3291389952,3291397119,ZA +3291397120,3291398143,EG +3291398144,3291406335,ZM +3291406336,3291408383,ZA +3291408384,3291410431,GM +3291410432,3291412479,NG +3291412480,3291414527,DZ +3291414528,3291426815,ZA +3291426816,3291430911,NA +3291430912,3291432703,ZA +3291432704,3291432959,NA +3291432960,3291435263,ZA +3291435264,3291437823,NA +3291437824,3291438079,ZA +3291438080,3291438847,NA +3291438848,3291439103,ZA +3291439104,3291447295,NG +3291447296,3291463679,CI +3291463680,3291480063,ZA +3291480064,3291545599,SC +3291545600,3291546367,MU +3291546368,3291546623,BI +3291546624,3291546879,SZ +3291546880,3291550207,MU +3291550208,3291550463,MR +3291550464,3291553279,MU +3291553280,3291553535,NG +3291553536,3291611135,MU +3291611136,3291611647,ZA +3291611648,3291611903,MU +3291611904,3291612159,ZA +3291612160,3291613183,NG +3291613184,3291615231,SN +3291615232,3291616255,ML +3291616256,3291616511,TZ +3291616512,3291616767,KE +3291616768,3291617279,EG +3291617280,3291619327,GH +3291619328,3291627519,GA +3291627520,3291643903,ZA +3291643904,3291660287,MZ +3291660288,3291742207,ZA +3291742208,3291742464,US +3291742465,3291742591,GB +3291742592,3291742719,IE +3291742720,3291744767,US +3291744768,3291745023,MX +3291745024,3291745791,US +3291745792,3291746047,MX +3291746048,3291750399,US +3291750400,3291750655,IT +3291750656,3291750911,US +3291750912,3291751167,SG +3291751168,3291751423,US +3291751424,3291751679,SG +3291751680,3291751935,US +3291751936,3291752191,HK +3291752192,3291752447,US +3291752448,3291752959,CA +3291752960,3291753471,US +3291753472,3291753727,GB +3291753728,3291753983,KH +3291753984,3291754239,JP +3291754240,3291754495,US +3291754496,3291754751,AU +3291754752,3291755007,GB +3291755008,3291755263,AU +3291755264,3291755519,US +3291755520,3291755775,AU +3291755776,3291756031,US +3291756032,3291756287,AU +3291756288,3291756543,US +3291756544,3291756799,AU +3291756800,3291757311,US +3291757312,3291757567,GB +3291757568,3291757823,AU +3291757824,3291758079,US +3291758080,3291758335,GB +3291758336,3291760639,US +3291760640,3291760895,AU +3291760896,3291762175,US +3291762176,3291762431,GB +3291762432,3291762687,AU +3291762688,3291763199,US +3291763200,3291763455,GB +3291763456,3291763711,US +3291763712,3291763967,GB +3291763968,3291766015,US +3291766016,3291766271,NL +3291766272,3291766527,AU +3291766528,3291766783,US +3291766784,3291767039,AU +3291767040,3291813375,US +3291813376,3291813631,GB +3291813632,3291813887,US +3291813888,3291814143,GB +3291814144,3291815423,US +3291815424,3291815679,GB +3291815680,3291817471,US +3291817472,3291817983,NL +3291817984,3291819263,US +3291819264,3291819775,NL +3291819776,3291821055,US +3291821056,3291821567,NL +3291821568,3291822847,US +3291822848,3291823103,CH +3291823104,3291823359,DE +3291823360,3291824127,US +3291824128,3291824639,GB +3291824640,3291824895,US +3291824896,3291824896,MX +3291824897,3291826175,US +3291826176,3291826431,CA +3291826432,3291827199,US +3291827200,3291827455,CA +3291827456,3291828735,US +3291828736,3291829247,CA +3291829248,3291830271,US +3291830272,3291832319,KH +3291832320,3291835391,US +3291835392,3291836415,DE +3291836416,3291878655,US +3291878656,3291878911,GB +3291878912,3291879935,US +3291879936,3291880191,AU +3291880192,3291880447,US +3291880448,3291880703,DE +3291880704,3291883775,US +3291883776,3291884031,CA +3291884032,3291884287,US +3291884288,3291884543,NZ +3291884544,3291886335,US +3291886336,3291886591,CA +3291886592,3291887103,US +3291887104,3291887359,GB +3291887360,3291887615,FR +3291887616,3291888127,US +3291888128,3291888383,NZ +3291888384,3291888895,US +3291888896,3291889151,FR +3291889152,3291891455,US +3291891456,3291891711,GB +3291891712,3291893759,US +3291893760,3291894015,CA +3291894016,3291906047,US +3291906048,3291907071,LK +3291907072,3291939063,US +3291939064,3291939064,GB +3291939065,3291939327,US +3291939328,3291939583,IN +3291939584,3291943423,US +3291943424,3291943679,FR +3291943680,3291943935,US +3291943936,3291944959,MX +3291944960,3291945727,US +3291945728,3291945983,GB +3291945984,3291965439,US +3291965440,3291966463,NZ +3291966464,3291971583,US +3291971584,3291972607,JP +3291972608,3292004351,US +3292004352,3292004607,SE +3292004608,3292004863,DK +3292004864,3292005375,US +3292005376,3292005631,CZ +3292005632,3292005887,SC +3292005888,3292006655,US +3292006656,3292006911,SC +3292006912,3292007423,US +3292007424,3292007679,SC +3292007680,3292008191,US +3292008192,3292008447,SC +3292008448,3292009727,US +3292009728,3292009983,SC +3292009984,3292011519,US +3292011520,3292011775,SC +3292011776,3292013055,US +3292013056,3292013311,SC +3292013312,3292013823,US +3292013824,3292014079,SC +3292014080,3292014335,US +3292014336,3292014591,SC +3292014592,3292016127,US +3292016128,3292016383,SC +3292016384,3292018175,US +3292018176,3292018687,SC +3292018688,3292019199,US +3292019200,3292019455,SC +3292019456,3292019711,US +3292019712,3292019967,SC +3292019968,3292020479,US +3292020480,3292020735,SC +3292020736,3292021247,US +3292021248,3292021503,SC +3292021504,3292021759,US +3292021760,3292022271,SC +3292022272,3292023039,US +3292023040,3292023551,SC +3292023552,3292024831,US +3292024832,3292025343,SC +3292025344,3292027647,US +3292027648,3292027903,SC +3292027904,3292028415,US +3292028416,3292028671,SC +3292028672,3292030463,US +3292030464,3292030719,SC +3292030720,3292031487,US +3292031488,3292032511,SC +3292032512,3292033791,US +3292033792,3292034047,SC +3292034048,3292034559,US +3292034560,3292034815,SC +3292034816,3292035071,US +3292035072,3292035327,SC +3292035328,3292035839,US +3292035840,3292036095,SC +3292036096,3292036607,US +3292036608,3292036863,SC +3292036864,3292040959,US +3292040960,3292041471,SC +3292041472,3292043007,US +3292043008,3292043263,SC +3292043264,3292044543,US +3292044544,3292045055,SC +3292045056,3292045311,US +3292045312,3292045567,SC +3292045568,3292047615,US +3292047616,3292047871,SC +3292047872,3292048383,US +3292048384,3292049151,SC +3292049152,3292049663,US +3292049664,3292049919,SC +3292049920,3292051711,US +3292051712,3292051967,SC +3292051968,3292053503,US +3292053504,3292053759,SC +3292053760,3292054015,US +3292054016,3292054527,SC +3292054528,3292055807,US +3292055808,3292056063,SC +3292056064,3292056575,US +3292056576,3292056831,SC +3292056832,3292057087,US +3292057088,3292057855,SC +3292057856,3292058879,US +3292058880,3292059135,SC +3292059136,3292059391,US +3292059392,3292059647,SC +3292059648,3292060415,US +3292060416,3292060671,SC +3292060672,3292061439,US +3292061440,3292061695,SC +3292061696,3292062975,US +3292062976,3292063231,SC +3292063232,3292063487,US +3292063488,3292063743,SC +3292063744,3292063999,US +3292064000,3292064255,SC +3292064256,3292064511,US +3292064512,3292064767,SC +3292064768,3292065791,US +3292065792,3292066047,SC +3292066048,3292066559,US +3292066560,3292066815,SC +3292066816,3292067327,US +3292067328,3292067839,SC +3292067840,3292068607,US +3292068608,3292068863,SC +3292068864,3292069375,US +3292069376,3292069631,DE +3292069632,3292069887,SC +3292069888,3292070143,SE +3292070144,3292070399,DK +3292070400,3292070655,US +3292070656,3292070911,SC +3292070912,3292071167,CZ +3292071168,3292071423,SC +3292071424,3292071935,US +3292071936,3292072191,SC +3292072192,3292073215,US +3292073216,3292073471,SC +3292073472,3292073983,US +3292073984,3292074495,SC +3292074496,3292075263,US +3292075264,3292075775,SC +3292075776,3292076287,US +3292076288,3292076543,SC +3292076544,3292078591,US +3292078592,3292079103,SC +3292079104,3292079359,US +3292079360,3292079615,SC +3292079616,3292080127,US +3292080128,3292080383,SC +3292080384,3292081151,US +3292081152,3292081407,SC +3292081408,3292082431,US +3292082432,3292082687,SC +3292082688,3292084735,US +3292084736,3292084991,SC +3292084992,3292085247,US +3292085248,3292085503,SC +3292085504,3292085759,US +3292085760,3292086015,SC +3292086016,3292088063,US +3292088064,3292088319,SC +3292088320,3292089087,US +3292089088,3292089343,SC +3292089344,3292091903,US +3292091904,3292092159,SC +3292092160,3292093439,US +3292093440,3292093951,SC +3292093952,3292095231,US +3292095232,3292095487,SC +3292095488,3292097023,US +3292097024,3292097535,SC +3292097536,3292098047,US +3292098048,3292098303,SC +3292098304,3292098559,US +3292098560,3292098815,SC +3292098816,3292099327,US +3292099328,3292099583,SC +3292099584,3292100095,US +3292100096,3292100351,SC +3292100352,3292102143,US +3292102144,3292102399,SC +3292102400,3292102911,US +3292102912,3292103167,SC +3292103168,3292103423,US +3292103424,3292103679,SC +3292103680,3292104447,US +3292104448,3292104703,SC +3292104704,3292104959,US +3292104960,3292105471,SC +3292105472,3292105983,US +3292105984,3292106239,SC +3292106240,3292106495,US +3292106496,3292107007,SC +3292107008,3292107519,US +3292107520,3292108543,SC +3292108544,3292108799,US +3292108800,3292109055,SC +3292109056,3292109567,US +3292109568,3292109823,SC +3292109824,3292110079,US +3292110080,3292110591,SC +3292110592,3292111615,US +3292111616,3292111871,SC +3292111872,3292112127,US +3292112128,3292112383,SC +3292112384,3292112895,US +3292112896,3292113151,SC +3292113152,3292113919,US +3292113920,3292114175,SC +3292114176,3292114431,US +3292114432,3292114687,SC +3292114688,3292115967,US +3292115968,3292116223,SC +3292116224,3292116735,US +3292116736,3292116991,SC +3292116992,3292117247,US +3292117248,3292117503,SC +3292117504,3292117759,US +3292117760,3292118015,SC +3292118016,3292119039,US +3292119040,3292119295,SC +3292119296,3292119551,US +3292119552,3292120063,SC +3292120064,3292120575,US +3292120576,3292121087,SC +3292121088,3292121599,US +3292121600,3292122111,SC +3292122112,3292123903,US +3292123904,3292124159,SC +3292124160,3292124927,US +3292124928,3292125183,SC +3292125184,3292125439,US +3292125440,3292125951,SC +3292125952,3292127231,US +3292127232,3292127487,SC +3292127488,3292128767,US +3292128768,3292129023,SC +3292129024,3292129791,US +3292129792,3292130303,SC +3292130304,3292131327,US +3292131328,3292132095,SC +3292132096,3292133887,US +3292133888,3292134143,SC +3292134144,3292134399,US +3292134400,3292134911,SC +3292134912,3292135167,DE +3292135168,3292135423,AU +3292135424,3292135679,SE +3292135680,3292135935,DK +3292135936,3292136191,US +3292136192,3292136447,SC +3292136448,3292136703,CZ +3292136704,3292136959,SC +3292136960,3292137215,US +3292137216,3292137471,SC +3292137472,3292137727,US +3292137728,3292138239,SC +3292138240,3292138495,US +3292138496,3292138751,SC +3292138752,3292139519,US +3292139520,3292139775,SC +3292139776,3292140031,US +3292140032,3292140287,SC +3292140288,3292140799,US +3292140800,3292141055,SC +3292141056,3292141567,US +3292141568,3292142079,SC +3292142080,3292142591,US +3292142592,3292142847,SC +3292142848,3292143103,US +3292143104,3292143359,SC +3292143360,3292143871,US +3292143872,3292144127,SC +3292144128,3292146431,US +3292146432,3292146687,SC +3292146688,3292146943,US +3292146944,3292147455,SC +3292147456,3292147967,US +3292147968,3292148479,SC +3292148480,3292149503,US +3292149504,3292149759,SC +3292149760,3292150271,US +3292150272,3292150527,SC +3292150528,3292152063,US +3292152064,3292152319,SC +3292152320,3292153343,US +3292153344,3292153855,SC +3292153856,3292154111,US +3292154112,3292154623,SC +3292154624,3292157439,US +3292157440,3292157695,SC +3292157696,3292157951,US +3292157952,3292158463,SC +3292158464,3292159999,US +3292160000,3292160511,SC +3292160512,3292161791,US +3292161792,3292162047,SC +3292162048,3292162559,US +3292162560,3292163071,SC +3292163072,3292163327,US +3292163328,3292163583,SC +3292163584,3292165887,US +3292165888,3292166143,SC +3292166144,3292167935,US +3292167936,3292168191,SC +3292168192,3292168703,US +3292168704,3292169727,SC +3292169728,3292171775,US +3292171776,3292172287,SC +3292172288,3292173055,US +3292173056,3292173567,SC +3292173568,3292174335,US +3292174336,3292174591,SC +3292174592,3292175103,US +3292175104,3292175359,SC +3292175360,3292176383,US +3292176384,3292176639,SC +3292176640,3292177151,US +3292177152,3292177407,SC +3292177408,3292178175,US +3292178176,3292178687,SC +3292178688,3292178943,US +3292178944,3292179199,SC +3292179200,3292179711,US +3292179712,3292179967,SC +3292179968,3292180479,US +3292180480,3292180735,SC +3292180736,3292180991,US +3292180992,3292181503,SC +3292181504,3292183039,US +3292183040,3292183551,SC +3292183552,3292184575,US +3292184576,3292184831,SC +3292184832,3292185599,US +3292185600,3292186111,SC +3292186112,3292186367,US +3292186368,3292186879,SC +3292186880,3292187391,US +3292187392,3292187903,SC +3292187904,3292188159,US +3292188160,3292188671,SC +3292188672,3292190975,US +3292190976,3292191231,SC +3292191232,3292193791,US +3292193792,3292194047,SC +3292194048,3292195839,US +3292195840,3292196607,SC +3292196608,3292197119,US +3292197120,3292197375,SC +3292197376,3292198399,US +3292198400,3292198655,SC +3292198656,3292199935,US +3292199936,3292200191,SC +3292200192,3292200447,US +3292200448,3292200703,SC +3292200704,3292200959,AU +3292200960,3292201215,SE +3292201216,3292201471,DK +3292201472,3292201983,US +3292201984,3292202239,CZ +3292202240,3292203007,US +3292203008,3292203519,SC +3292203520,3292204031,US +3292204032,3292204287,SC +3292204288,3292206335,US +3292206336,3292206847,SC +3292206848,3292209151,US +3292209152,3292209407,SC +3292209408,3292209663,US +3292209664,3292209919,SC +3292209920,3292210175,US +3292210176,3292210431,SC +3292210432,3292212479,US +3292212480,3292212735,SC +3292212736,3292213247,US +3292213248,3292213503,SC +3292213504,3292213759,US +3292213760,3292214015,SC +3292214016,3292214783,US +3292214784,3292215039,SC +3292215040,3292215295,US +3292215296,3292215807,SC +3292215808,3292216319,US +3292216320,3292216831,SC +3292216832,3292219391,US +3292219392,3292219647,SC +3292219648,3292220671,US +3292220672,3292221439,SC +3292221440,3292221695,US +3292221696,3292221951,SC +3292221952,3292223743,US +3292223744,3292223999,SC +3292224000,3292227071,US +3292227072,3292227327,SC +3292227328,3292229887,US +3292229888,3292230143,SC +3292230144,3292231935,US +3292231936,3292232191,SC +3292232192,3292233215,US +3292233216,3292233727,SC +3292233728,3292234495,US +3292234496,3292234751,SC +3292234752,3292235775,US +3292235776,3292236031,SC +3292236032,3292237311,US +3292237312,3292237823,SC +3292237824,3292239359,US +3292239360,3292240127,SC +3292240128,3292240639,US +3292240640,3292240895,SC +3292240896,3292241151,US +3292241152,3292241407,SC +3292241408,3292242175,US +3292242176,3292242431,SC +3292242432,3292243199,US +3292243200,3292244223,SC +3292244224,3292244991,US +3292244992,3292245247,SC +3292245248,3292246783,US +3292246784,3292247039,SC +3292247040,3292247551,US +3292247552,3292248063,SC +3292248064,3292249343,US +3292249344,3292249599,SC +3292249600,3292250367,US +3292250368,3292250623,SC +3292250624,3292250879,US +3292250880,3292251135,SC +3292251136,3292251903,US +3292251904,3292252159,SC +3292252160,3292252415,US +3292252416,3292252671,SC +3292252672,3292254975,US +3292254976,3292255743,SC +3292255744,3292257023,US +3292257024,3292257279,SC +3292257280,3292258559,US +3292258560,3292258815,SC +3292258816,3292259327,US +3292259328,3292259583,SC +3292259584,3292260863,US +3292260864,3292261375,SC +3292261376,3292262399,US +3292262400,3292263167,SC +3292263168,3292263935,US +3292263936,3292264191,SC +3292264192,3292264447,US +3292264448,3292264703,SC +3292264704,3292264959,US +3292264960,3292265215,SC +3292265216,3292265983,US +3292265984,3292266239,DE +3292266240,3292266495,SC +3292266496,3292268543,MU +3292268544,3292269055,ZA +3292269056,3292332031,MU +3292332032,3292334079,NG +3292334080,3292336127,TZ +3292336128,3292340223,ZA +3292340224,3292344319,GH +3292344320,3292345343,ZA +3292345344,3292346367,KE +3292346368,3292350463,ZA +3292350464,3292351487,CD +3292351488,3292352511,AO +3292352512,3292364799,ZA +3292364800,3292385279,SC +3292385280,3292387327,BW +3292387328,3292389375,NG +3292389376,3292391423,ZA +3292391424,3292393471,MA +3292393472,3292397567,ZA +3292397568,3292463103,US +3292463104,3292528639,ZA +3292528640,3294625791,MA +3294625792,3295674367,KE +3295674368,3296722943,MA +3296722944,3298820095,EG +3298820096,3299344383,ZA +3299344384,3299606527,TG +3299606528,3299868671,GH +3299868672,3300130815,TN +3300130816,3300392959,CI +3300392960,3300655103,TN +3300655104,3300917247,ET +3300917248,3300921343,MU +3300921344,3300925439,BJ +3300925440,3300929535,MG +3300933632,3300935679,MU +3300935680,3300937727,TZ +3300937728,3300938751,MU +3300938752,3300941823,ZA +3300941824,3300950015,MU +3300953088,3300954111,MU +3300954112,3300958207,NG +3300958208,3301048319,ZA +3301048320,3301081087,PK +3301081088,3301113855,ZA +3301113856,3301117951,AF +3301117952,3301130239,PK +3301130240,3301144319,ZA +3301144320,3301144575,NG +3301144576,3301146623,ZA +3301146624,3301163007,IN +3301163008,3301171199,PK +3301171200,3301172223,NG +3301172224,3301173759,UG +3301173760,3301174271,ZA +3301174272,3301175295,UG +3301175296,3301179391,AF +3301179392,3301179903,RU +3301179904,3301181439,SC +3301181440,3301185535,US +3301185536,3301187583,GB +3301187584,3301189631,FR +3301189632,3301191679,US +3301191680,3301193727,CA +3301193728,3301195775,JP +3301195776,3301197823,DE +3301197824,3301199871,GB +3301199872,3301201919,US +3301201920,3301203967,NL +3301203968,3301204991,DK +3301204992,3301205247,SE +3301205248,3301206015,DK +3301206016,3301208063,CH +3301208064,3301216255,US +3301216256,3301218303,ES +3301218304,3301220351,BE +3301220352,3301222399,IT +3301222400,3301224447,BE +3301224448,3301226495,NO +3301226496,3301228543,US +3301228544,3301230591,IE +3301230592,3301232639,FI +3301232640,3301234687,US +3301234688,3301236735,EE +3301236736,3301238783,CA +3301238784,3301240831,US +3301240832,3301242879,SE +3301242880,3301244927,GB +3301244928,3301246975,US +3301246976,3301247999,SC +3301248000,3301250047,US +3301250048,3301251071,SC +3301251072,3301253119,US +3301253120,3301254143,SC +3301254144,3301256191,US +3301256192,3301257215,SC +3301257216,3301259263,US +3301259264,3301260287,SC +3301260288,3301262335,US +3301262336,3301263359,SC +3301263360,3301267455,US +3301267456,3301268479,SC +3301268480,3301272575,US +3301272576,3301277695,SC +3301277696,3301278719,US +3301278720,3301279743,SC +3301279744,3301280767,PR +3301280768,3301282815,US +3301282816,3301283839,SC +3301283840,3301284863,US +3301284864,3301286911,SC +3301286912,3301287935,NL +3301287936,3301288959,CH +3301288960,3301289983,ES +3301289984,3301291007,PT +3301291008,3301292031,PL +3301292032,3301294079,SC +3301294080,3301295103,LU +3301295104,3301296127,SC +3301296128,3301297151,HK +3301297152,3301298175,SC +3301298176,3301299199,AT +3301299200,3301300223,BE +3301300224,3301301247,LV +3301301248,3301302271,CZ +3301302272,3301303295,DK +3301303296,3301304319,SC +3301304320,3301305343,FR +3301305344,3301306367,AT +3301306368,3301307391,IN +3301307392,3301308415,RU +3301308416,3301309439,SG +3301309440,3301310463,BR +3301310464,3301310975,US +3301310976,3301311487,SC +3301311488,3301311743,DE +3301311744,3301313023,SC +3301313024,3301313279,AU +3301313280,3301314303,SC +3301314304,3301314559,NO +3301314560,3301315071,SC +3301315072,3301315327,ES +3301315328,3301315583,SC +3301315584,3301315839,NL +3301315840,3301317375,SC +3301317376,3301317631,PR +3301317632,3301318655,SC +3301318656,3301318911,US +3301318912,3301319679,SC +3301319680,3301319935,US +3301319936,3301320447,SC +3301320448,3301320959,US +3301320960,3301321215,SC +3301321216,3301321471,US +3301321472,3301322751,SC +3301322752,3301323007,CA +3301323008,3301324287,SC +3301324288,3301324543,US +3301324544,3301325567,SC +3301325568,3301325823,US +3301325824,3301329151,SC +3301329152,3301329407,DK +3301329408,3301330687,SC +3301330688,3301330943,HK +3301330944,3301331199,HU +3301331200,3301331455,SC +3301331456,3301331711,NZ +3301331712,3301332479,SC +3301332480,3301332735,ES +3301332736,3301332991,SC +3301332992,3301333247,NL +3301333248,3301333759,SC +3301333760,3301334015,US +3301334016,3301334527,SC +3301334528,3301334783,US +3301334784,3301335039,PR +3301335040,3301335295,US +3301335296,3301337087,SC +3301337088,3301337343,US +3301337344,3301337855,SC +3301337856,3301338111,US +3301338112,3301340671,SC +3301340672,3301340927,PR +3301340928,3301343231,SC +3301343232,3301343743,US +3301343744,3301344511,SC +3301344512,3301344767,IN +3301344768,3301345023,AT +3301345024,3301345279,FR +3301345280,3301345535,SC +3301345536,3301345791,DK +3301345792,3301346047,CZ +3301346048,3301346303,SC +3301346304,3301346559,BE +3301346560,3301349119,SC +3301349120,3301349375,CH +3301349376,3301351423,SC +3301351424,3301351935,US +3301351936,3301352703,SC +3301352704,3301352959,US +3301352960,3301353727,SC +3301353728,3301354239,US +3301354240,3301355263,SC +3301355264,3301355519,US +3301355520,3301356799,SC +3301356800,3301357055,US +3301357056,3301357823,SC +3301357824,3301358335,US +3301358336,3301359359,SC +3301359360,3301359615,US +3301359616,3301361151,SC +3301361152,3301361407,AT +3301361408,3301361663,FR +3301361664,3301361919,DE +3301361920,3301362175,SC +3301362176,3301362431,CZ +3301362432,3301362687,LV +3301362688,3301362943,SC +3301362944,3301363199,AT +3301363200,3301364479,SC +3301364480,3301364735,NO +3301364736,3301364991,SC +3301364992,3301365247,PT +3301365248,3301367551,SC +3301367552,3301367807,PR +3301367808,3301371391,SC +3301371392,3301372159,US +3301372160,3301373183,SC +3301373184,3301373439,US +3301373440,3301373695,SC +3301373696,3301373951,US +3301373952,3301375231,SC +3301375232,3301375487,US +3301375488,3301375743,SC +3301375744,3301376511,US +3301376512,3301377535,SC +3301377536,3301378559,US +3301378560,3301379071,SC +3301379072,3301379327,US +3301379328,3301379583,SC +3301379584,3301379839,US +3301379840,3301380095,SC +3301380096,3301380351,CA +3301380352,3301382655,US +3301382656,3301382911,SC +3301382912,3301383423,US +3301383424,3301383679,SC +3301383680,3301384959,US +3301384960,3301385215,SC +3301385216,3301385727,US +3301385728,3301386239,SC +3301386240,3301387007,US +3301387008,3301387263,ES +3301387264,3301387519,PT +3301387520,3301388287,US +3301388288,3301388543,LU +3301388544,3301389311,US +3301389312,3301389567,SC +3301389568,3301390079,US +3301390080,3301390335,SC +3301390336,3301391359,US +3301391360,3301391615,SC +3301391616,3301391871,RU +3301391872,3301392895,US +3301392896,3301393151,SC +3301393152,3301393407,US +3301393408,3301393663,SC +3301393664,3301394687,US +3301394688,3301395199,SC +3301395200,3301395455,PR +3301395456,3301396479,US +3301396480,3301398015,SC +3301398016,3301398271,US +3301398272,3301398527,SC +3301398528,3301399039,US +3301399040,3301399551,SC +3301399552,3301400319,US +3301400320,3301400575,SC +3301400576,3301401343,US +3301401344,3301401599,SC +3301401600,3301401855,US +3301401856,3301402111,SC +3301402112,3301402623,US +3301402624,3301402879,GB +3301402880,3301403135,NL +3301403136,3301403391,SC +3301403392,3301403647,ES +3301403648,3301403903,US +3301403904,3301404159,SC +3301404160,3301404415,NO +3301404416,3301404671,NZ +3301404672,3301404927,LU +3301404928,3301405183,HU +3301405184,3301405439,US +3301405440,3301405695,AU +3301405696,3301405951,SC +3301405952,3301406463,US +3301406464,3301406719,CZ +3301406720,3301406975,DK +3301406976,3301407487,US +3301407488,3301408511,SC +3301408512,3301409023,US +3301409024,3301409279,SC +3301409280,3301410047,US +3301410048,3301410303,SC +3301410304,3301410559,US +3301410560,3301410815,SC +3301410816,3301411071,US +3301411072,3301411327,SC +3301411328,3301411583,US +3301411584,3301411839,PR +3301411840,3301412863,US +3301412864,3301413119,CA +3301413120,3301413375,SC +3301413376,3301416191,US +3301416192,3301416447,SC +3301416448,3301416703,PR +3301416704,3301418239,US +3301418240,3301418495,SC +3301418496,3301419007,US +3301419008,3301419519,SC +3301419520,3301419775,CH +3301419776,3301420287,SC +3301420288,3301420543,PL +3301420544,3301421311,US +3301421312,3301421567,HU +3301421568,3301421823,HK +3301421824,3301422847,SC +3301422848,3301423615,US +3301423616,3301423871,FR +3301423872,3301424383,US +3301424384,3301424639,RU +3301424640,3301424895,US +3301424896,3301425151,SC +3301425152,3301426431,US +3301426432,3301426687,SC +3301426688,3301426943,US +3301426944,3301427199,SC +3301427200,3301427711,US +3301427712,3301427967,SC +3301427968,3301428223,PR +3301428224,3301428479,US +3301428480,3301428735,SC +3301428736,3301430271,US +3301430272,3301430527,SC +3301430528,3301432831,US +3301432832,3301433087,PR +3301433088,3301433343,SC +3301433344,3301433855,US +3301433856,3301434111,PR +3301434112,3301435391,US +3301435392,3301435647,SC +3301435648,3301435903,NL +3301435904,3301436159,SC +3301436160,3301436415,ES +3301436416,3301437183,US +3301437184,3301437439,SC +3301437440,3301437695,LU +3301437696,3301439487,US +3301439488,3301439743,DK +3301439744,3301439999,SC +3301440000,3301440767,US +3301440768,3301441023,SC +3301441024,3301441279,US +3301441280,3301441535,SC +3301441536,3301445631,ZA +3301445632,3301453823,KE +3301453824,3301457919,ML +3301457920,3301462015,NG +3301462016,3301466111,ML +3301466112,3301470207,ER +3301470208,3301474303,NG +3301474304,3301490687,MA +3301490688,3301494783,CD +3301494784,3301498879,BW +3301502976,3301507071,MA +3301507328,3301507583,ZW +3301507584,3301507839,GH +3301507840,3301508095,EG +3301508096,3301508607,GH +3301508608,3301509119,ZA +3301509120,3301510143,SS +3301511168,3301512191,ZW +3301512192,3301513215,MU +3301513216,3301515263,EG +3301515264,3301523455,GH +3301523456,3301531647,CI +3301531648,3301539839,ZA +3301539840,3301544191,KE +3301544192,3301544959,DE +3301544960,3301548031,KE +3301556224,3301560319,DJ +3301560320,3301565439,KE +3301565440,3301566463,MU +3301566464,3301568511,ZA +3301568512,3301570559,EG +3301572608,3301605375,EG +3301605376,3301613567,SD +3301613568,3301629951,KE +3301629952,3301631999,ZA +3301632000,3301634047,CM +3301634048,3301636095,LS +3301636096,3301637119,ZA +3301637120,3301638143,AO +3301638144,3301703679,TN +3301703680,3301834751,EG +3301834752,3301900287,MA +3301900288,3301904383,NG +3301904384,3301908479,KE +3301908480,3301912575,ZA +3301912576,3301916671,MU +3301916672,3301933055,IN +3301933056,3301949439,KE +3301949440,3301965823,SN +3301965824,3302490111,ZA +3302490112,3302490367,KE +3302490368,3302490623,US +3302490624,3302491135,ZA +3302491136,3302492159,NG +3302492160,3302494207,MW +3302494208,3302496255,ZA +3302496256,3302498303,EG +3302498304,3302502399,NA +3302502400,3302505471,AO +3302505472,3302505679,NA +3302505680,3302505681,AO +3302505682,3302506495,NA +3302506496,3302508543,KE +3302508544,3302514687,MU +3302514688,3302522879,ZA +3302522880,3302523903,KE +3302523904,3302525951,ZA +3302525952,3302526975,EG +3302526976,3302529023,NG +3302529024,3302530047,ZA +3302530048,3302531071,TN +3302531072,3302531327,CF +3302531328,3302531583,AO +3302531584,3302531839,TZ +3302531840,3302532095,BW +3302532096,3302533119,NA +3302533120,3302533887,ZA +3302533888,3302534143,MU +3302534144,3302535167,ZA +3302535168,3302536191,UG +3302536192,3302537215,GH +3302537216,3302538239,NG +3302538240,3302539263,GH +3302539264,3302540287,ZA +3302540288,3302540799,UG +3302540800,3302541311,AO +3302541312,3302542335,NG +3302542336,3302542847,ZA +3302542848,3302543103,EG +3302543104,3302543359,NA +3302543360,3302544383,NG +3302544384,3302544639,CM +3302544640,3302544895,MU +3302544896,3302545151,GH +3302545152,3302545407,ZA +3302545408,3302545919,CD +3302545920,3302546431,TZ +3302546432,3302546943,SL +3302546944,3302547455,KE +3302547456,3302547967,ZW +3302547968,3302548479,CI +3302548480,3302548991,GH +3302548992,3302549503,ZA +3302549504,3302550015,KE +3302550016,3302550527,TZ +3302550528,3302551551,ZA +3302551552,3302552063,EG +3302552064,3302552575,KE +3302552832,3302553087,KE +3302553088,3302553343,EG +3302553344,3302553599,TZ +3302553600,3302554111,AO +3302554112,3302554367,ZA +3302554368,3302554623,NG +3302554624,3302554879,EG +3302554880,3302555135,NG +3302555392,3302555647,NG +3302555648,3302621183,MA +3302621184,3302684671,EG +3302684672,3302686719,JO +3302686720,3302750207,EG +3302750208,3302752255,JO +3302752256,3302760447,NG +3302760448,3302762495,ZA +3302762496,3302766591,US +3302766592,3302768639,ZA +3302768640,3302776831,NG +3302776832,3302785023,ZW +3302785024,3302793215,NG +3302793216,3302801407,ZA +3302801408,3302805503,NG +3302805504,3302809599,MW +3302809600,3302817791,NG +3302817792,3302883327,EG +3302883328,3302948863,NG +3302948864,3302949119,MU +3302949120,3302949375,AO +3302949376,3302949631,ZM +3302949632,3302949887,BI +3302949888,3302950143,CI +3302950144,3302950655,TZ +3302950656,3302950911,EG +3302950912,3302951423,ZA +3302951424,3302951679,SL +3302951680,3302951935,KE +3302951936,3302952191,RW +3302952192,3302952447,AO +3302952448,3302952959,ZA +3302952960,3302953471,EG +3302953472,3302953727,NA +3302953728,3302953983,AO +3302953984,3302954239,SD +3302954240,3302954495,KE +3302954496,3302955007,ZA +3302955008,3302955263,LS +3302955264,3302955519,UG +3302955520,3302955775,ZW +3302955776,3302956031,MW +3302956032,3302956287,CD +3302956544,3302957055,ZA +3302957056,3302957311,CG +3302957312,3302957567,MZ +3302957568,3302957823,GM +3302957824,3302958079,NA +3302958080,3302958335,BI +3302958336,3302958591,SZ +3302958592,3302958847,DJ +3302958848,3302959103,GA +3302959104,3302959359,BJ +3302959360,3302959615,MG +3302959616,3302959871,TD +3302959872,3302960127,SC +3302960128,3302960383,LR +3302960384,3302960639,MR +3302960896,3302961151,BF +3302961152,3302977535,ZA +3302977536,3302981631,NG +3302981632,3302985727,ZA +3302985728,3302987775,GM +3302987776,3302989823,SD +3302989824,3302993919,KE +3302993920,3302998015,MA +3302998016,3303010303,ZA +3303010304,3303012351,RW +3303012352,3303013375,ZA +3303013376,3303013631,SN +3303013632,3303014399,KE +3303014400,3303537151,TN +3303537152,3303537407,BI +3303537408,3303612415,TN +3303612416,3303620607,ZA +3303620608,3304022271,TN +3304022272,3304022527,CF +3304022528,3304062975,TN +3304062976,3304065279,SC +3304065280,3304065535,US +3304065536,3304066303,SC +3304066304,3304066559,US +3304066560,3304066815,CA +3304066816,3304067071,US +3304067072,3304067327,CA +3304067328,3304071167,SC +3304071168,3304071423,US +3304071424,3304071679,SC +3304071680,3304071935,PR +3304071936,3304072959,SC +3304072960,3304073215,US +3304073216,3304073471,GB +3304073472,3304073727,NL +3304073728,3304073983,SC +3304073984,3304074239,ES +3304074240,3304074495,PT +3304074496,3304075519,SC +3304075520,3304075775,HU +3304075776,3304076031,HK +3304076032,3304076287,AU +3304076288,3304076543,SC +3304076544,3304076799,BE +3304076800,3304077055,LV +3304077056,3304077311,SC +3304077312,3304077567,DK +3304077568,3304077823,SC +3304077824,3304078079,FR +3304078080,3304078335,SC +3304078336,3304078591,IN +3304078592,3304079103,SC +3304079104,3304079359,BR +3304079360,3304080895,SC +3304080896,3304081407,US +3304081408,3304081919,SC +3304081920,3304082175,US +3304082176,3304082431,PR +3304082432,3304082687,US +3304082688,3304083199,SC +3304083200,3304083455,US +3304083456,3304083711,SC +3304083712,3304083967,US +3304083968,3304084991,SC +3304084992,3304085503,US +3304085504,3304086015,SC +3304086016,3304086271,US +3304086272,3304086527,SC +3304086528,3304086783,US +3304086784,3304087295,SC +3304087296,3304087551,US +3304087552,3304089343,SC +3304089344,3304089599,US +3304089600,3304091135,SC +3304091136,3304091391,NO +3304091392,3304091647,SC +3304091648,3304091903,LU +3304091904,3304092159,SC +3304092160,3304092415,HK +3304092416,3304092671,SC +3304092672,3304092927,AT +3304092928,3304093439,SC +3304093440,3304093695,CZ +3304093696,3304094975,SC +3304094976,3304095231,RU +3304095232,3304096255,SC +3304096256,3304096511,US +3304096512,3304098047,SC +3304098048,3304098303,US +3304098304,3304098815,SC +3304098816,3304099071,US +3304099072,3304099327,SC +3304099328,3304099583,CA +3304099584,3304099839,SC +3304099840,3304100095,CA +3304100096,3304100607,SC +3304100608,3304101119,US +3304101120,3304102143,SC +3304102144,3304102399,US +3304102400,3304102655,SC +3304102656,3304103167,US +3304103168,3304103679,SC +3304103680,3304103935,US +3304103936,3304104959,SC +3304104960,3304105215,US +3304105216,3304105727,SC +3304105728,3304105983,US +3304105984,3304106239,GB +3304106240,3304107263,SC +3304107264,3304107519,PL +3304107520,3304107775,NO +3304107776,3304108799,SC +3304108800,3304109055,AU +3304109056,3304109311,SC +3304109312,3304109567,BE +3304109568,3304109823,LV +3304109824,3304111615,SC +3304111616,3304111871,SG +3304111872,3304113151,SC +3304113152,3304113407,US +3304113408,3304113663,SC +3304113664,3304113919,US +3304113920,3304114175,SC +3304114176,3304114431,US +3304114432,3304115199,SC +3304115200,3304115711,US +3304115712,3304115967,SC +3304115968,3304116223,US +3304116224,3304116735,SC +3304116736,3304116991,US +3304116992,3304117759,SC +3304117760,3304118271,US +3304118272,3304118527,SC +3304118528,3304118783,US +3304118784,3304119039,SC +3304119040,3304119551,US +3304119552,3304119807,SC +3304119808,3304120063,PR +3304120064,3304120575,SC +3304120576,3304120831,US +3304120832,3304121087,SC +3304121088,3304121343,US +3304121344,3304122367,SC +3304122368,3304122623,GB +3304122624,3304122879,NL +3304122880,3304125183,SC +3304125184,3304125439,AU +3304125440,3304125695,AT +3304125696,3304126719,SC +3304126720,3304126975,DE +3304126976,3304127231,FR +3304127232,3304194303,SC +3304194304,3304194559,US +3304194560,3304194815,AT +3304194816,3304195071,SC +3304195072,3304195327,DE +3304195328,3304198143,SC +3304198144,3304198399,PL +3304198400,3304198655,PT +3304198656,3304199423,SC +3304199424,3304199679,GB +3304199680,3304201471,SC +3304201472,3304201983,US +3304201984,3304202751,SC +3304202752,3304203007,US +3304203008,3304204543,SC +3304204544,3304204799,US +3304204800,3304205567,SC +3304205568,3304205823,US +3304205824,3304206335,SC +3304206336,3304206591,CA +3304206592,3304207871,SC +3304207872,3304208639,US +3304208640,3304208895,SC +3304208896,3304209151,US +3304209152,3304209407,SC +3304209408,3304209663,US +3304209664,3304210431,SC +3304210432,3304210687,SG +3304210688,3304210943,RU +3304210944,3304212223,SC +3304212224,3304212479,FR +3304212480,3304212735,SC +3304212736,3304212991,DK +3304212992,3304213247,SC +3304213248,3304213503,LV +3304213504,3304213759,SC +3304213760,3304214015,AT +3304214016,3304216831,SC +3304216832,3304217087,GB +3304217088,3304218367,SC +3304218368,3304218623,PR +3304218624,3304218879,US +3304218880,3304222207,SC +3304222208,3304222463,US +3304222464,3304223231,SC +3304223232,3304223487,US +3304223488,3304223999,SC +3304224000,3304224255,US +3304224256,3304225023,SC +3304225024,3304225279,US +3304225280,3304226047,SC +3304226048,3304226559,US +3304226560,3304227839,SC +3304227840,3304228095,RU +3304228096,3304228863,SC +3304228864,3304229119,DE +3304229120,3304229375,DK +3304229376,3304230399,SC +3304230400,3304230655,AU +3304230656,3304230911,SC +3304230912,3304231167,HU +3304231168,3304231423,SC +3304231424,3304231679,NZ +3304231680,3304232191,SC +3304232192,3304232447,PT +3304232448,3304232703,ES +3304232704,3304232959,CH +3304232960,3304233215,NL +3304233216,3304233471,GB +3304233472,3304233983,US +3304233984,3304234751,SC +3304234752,3304235007,PR +3304235008,3304235775,SC +3304235776,3304236031,PR +3304236032,3304237823,SC +3304237824,3304238079,US +3304238080,3304238591,SC +3304238592,3304239103,US +3304239104,3304240383,SC +3304240384,3304240639,US +3304240640,3304240895,SC +3304240896,3304241151,US +3304241152,3304241663,SC +3304241664,3304241919,US +3304241920,3304242431,SC +3304242432,3304242687,US +3304242688,3304244991,SC +3304244992,3304245247,FR +3304245248,3304245503,DE +3304245504,3304246271,SC +3304246272,3304246527,BE +3304246528,3304248063,SC +3304248064,3304248319,NO +3304248320,3304248831,SC +3304248832,3304249087,ES +3304249088,3304249343,SC +3304249344,3304249599,NL +3304249600,3304249855,GB +3304249856,3304250879,SC +3304250880,3304251135,US +3304251136,3304251903,SC +3304251904,3304252159,US +3304252160,3304255231,SC +3304255232,3304255487,US +3304255488,3304255999,SC +3304256000,3304256255,US +3304256256,3304256511,CA +3304256512,3304325375,SC +3304325376,3304325631,US +3304325632,3304326143,SC +3304326144,3304326399,DE +3304326400,3304327423,SC +3304327424,3304327679,AT +3304327680,3304327935,SC +3304327936,3304328191,HK +3304328192,3304328447,HU +3304328448,3304328703,LU +3304328704,3304329215,SC +3304329216,3304329471,PL +3304329472,3304331007,SC +3304331008,3304331263,US +3304331264,3304332543,SC +3304332544,3304332799,US +3304332800,3304333055,SC +3304333056,3304333311,PR +3304333312,3304333823,SC +3304333824,3304334079,US +3304334080,3304336127,SC +3304336128,3304336383,US +3304336384,3304337663,SC +3304337664,3304337919,US +3304337920,3304340735,SC +3304340736,3304340991,US +3304340992,3304341503,SC +3304341504,3304341759,SG +3304341760,3304342783,SC +3304342784,3304343039,IN +3304343040,3304343295,SC +3304343296,3304343551,FR +3304343552,3304343807,DE +3304343808,3304344063,DK +3304344064,3304344319,SC +3304344320,3304344575,LV +3304344576,3304345343,SC +3304345344,3304345599,HK +3304345600,3304345855,SC +3304345856,3304346111,LU +3304346112,3304347135,SC +3304347136,3304347391,ES +3304347392,3304348671,SC +3304348672,3304348927,US +3304348928,3304349183,SC +3304349184,3304349439,US +3304349440,3304349695,PR +3304349696,3304350975,SC +3304350976,3304351487,US +3304351488,3304352511,SC +3304352512,3304352767,US +3304352768,3304353023,SC +3304353024,3304353791,US +3304353792,3304356607,SC +3304356608,3304357119,US +3304357120,3304357887,SC +3304357888,3304358143,US +3304358144,3304358399,SC +3304358400,3304358655,BR +3304358656,3304358911,SC +3304358912,3304359167,RU +3304359168,3304359423,SC +3304359424,3304359679,AT +3304359680,3304360191,SC +3304360192,3304360447,DK +3304360448,3304362495,SC +3304362496,3304362751,NZ +3304362752,3304363007,NO +3304363008,3304363775,SC +3304363776,3304364031,CH +3304364032,3304365055,SC +3304365056,3304365567,US +3304365568,3304365823,SC +3304365824,3304366079,PR +3304366080,3304366335,SC +3304366336,3304366591,US +3304366592,3304367103,SC +3304367104,3304367359,US +3304367360,3304367871,SC +3304367872,3304368127,US +3304368128,3304368895,SC +3304368896,3304369151,US +3304369152,3304370687,SC +3304370688,3304370943,US +3304370944,3304371199,SC +3304371200,3304371455,US +3304371456,3304371967,SC +3304371968,3304372223,US +3304372224,3304373247,SC +3304373248,3304373503,US +3304373504,3304376063,SC +3304376064,3304376319,FR +3304376320,3304376575,SC +3304376576,3304376831,DK +3304376832,3304377087,CZ +3304377088,3304377343,SC +3304377344,3304377599,BE +3304377600,3304380671,SC +3304380672,3304380927,GB +3304380928,3304381695,SC +3304381696,3304381951,US +3304381952,3304382719,SC +3304382720,3304382975,US +3304382976,3304383487,SC +3304383488,3304383743,US +3304383744,3304384511,SC +3304384512,3304384767,US +3304384768,3304385279,SC +3304385280,3304385535,US +3304385536,3304386047,SC +3304386048,3304386303,US +3304386304,3304388095,SC +3304388096,3304388351,PR +3304388352,3304389887,SC +3304389888,3304390143,US +3304390144,3304390399,SC +3304390400,3304390655,US +3304390656,3304391679,SC +3304391680,3304400895,US +3304400896,3304401919,SC +3304401920,3304402943,PR +3304402944,3304403967,US +3304403968,3304404991,SC +3304404992,3304407039,US +3304407040,3304408063,CA +3304408064,3304414207,US +3304414208,3304416255,SC +3304416256,3304421375,US +3304421376,3304424447,SC +3304424448,3304425471,US +3304425472,3304426495,PR +3304426496,3304428543,US +3304428544,3304429567,SC +3304429568,3304430591,US +3304430592,3304431615,SC +3304431616,3304432639,GB +3304432640,3304433663,NL +3304433664,3304434687,SC +3304434688,3304435711,ES +3304435712,3304436735,PT +3304436736,3304437759,PL +3304437760,3304438783,NO +3304438784,3304439807,NZ +3304439808,3304440831,LU +3304440832,3304441855,SC +3304441856,3304442879,HK +3304442880,3304443903,AU +3304443904,3304444927,AT +3304444928,3304445951,SC +3304445952,3304446463,FI +3304446464,3304446719,SC +3304446720,3304446975,FI +3304446976,3304447999,CZ +3304448000,3304449023,DK +3304449024,3304450047,SC +3304450048,3304451071,FR +3304451072,3304452095,AT +3304452096,3304453119,IN +3304453120,3304454143,RU +3304454144,3304455167,SG +3304455168,3304456191,BR +3304456192,3304521727,ZA +3304521728,3304528895,US +3304528896,3304529919,SC +3304529920,3304536063,US +3304536064,3304538111,CA +3304538112,3304562687,US +3304562688,3304563711,GB +3304563712,3304564735,NL +3304564736,3304565759,CH +3304565760,3304566783,ES +3304566784,3304567807,PT +3304567808,3304568831,PL +3304568832,3304569855,NO +3304569856,3304570879,NZ +3304570880,3304571903,LU +3304571904,3304572927,HU +3304572928,3304573951,HK +3304573952,3304574975,AU +3304574976,3304575999,AT +3304576000,3304577023,BE +3304577024,3304578047,LV +3304578048,3304579071,CZ +3304579072,3304580095,DK +3304580096,3304581119,DE +3304581120,3304582143,FR +3304582144,3304583167,AT +3304583168,3304584191,IN +3304584192,3304585215,RU +3304585216,3304586239,US +3304586240,3304587263,BR +3304587264,3304669183,ZA +3304669184,3304685567,TZ +3304685568,3304701951,ZA +3304701952,3304718335,AO +3304718336,3304734719,ZA +3304734720,3304751103,BJ +3304751104,3304759295,ZA +3304759296,3304763391,KE +3304763392,3304767487,LR +3304767488,3304771583,ZA +3304771584,3304773631,KE +3304773632,3304781823,ZA +3304781824,3304782847,AO +3304782848,3304783871,MU +3304783872,3304801023,ZA +3304801024,3304804095,GH +3304804096,3304806399,NG +3304806400,3304806655,ZA +3304806656,3304807167,SC +3304807168,3304807423,ZA +3304807424,3304807935,SC +3304807936,3304808959,ZA +3304808960,3304809215,SC +3304809216,3304809471,ZA +3304809472,3304812543,KE +3304812544,3304812799,SC +3304812800,3304813055,ZA +3304813056,3304813567,SC +3304813568,3304820735,ZA +3304820736,3304821759,KE +3304821760,3304822783,MU +3304822784,3304823807,BJ +3304823808,3304824831,ML +3304824832,3304841215,ZA +3304841216,3304843263,NG +3304843264,3304845311,ZA +3304845312,3304846335,GQ +3304846336,3304847359,SC +3304847360,3304848383,ZA +3304848384,3304849407,MU +3304849408,3305111551,ZA +3305111552,3307208703,TN +3307208704,3309305855,EG +3309305856,3312451583,ZA +3312451584,3312975871,DZ +3312975872,3313500159,EG +3313500160,3313762303,MA +3313762304,3314024447,EG +3314024448,3314286591,KE +3314286592,3314548735,DZ +3314548736,3314750463,MA +3314750464,3314751487,US +3314751488,3314810879,MA +3314810880,3314827263,AO +3314827264,3314829311,ZA +3314829312,3314831359,GM +3314831360,3314833407,NG +3314833408,3314835455,AO +3314835456,3314843647,TG +3314843648,3314860031,MG +3314860032,3314868223,CI +3314868224,3314876415,GH +3314876416,3314892799,MG +3314892800,3314909183,NG +3314909184,3314910207,TD +3314910208,3314911231,NG +3314911232,3314912255,CG +3314912256,3314913279,BI +3314913280,3314914303,ZA +3314914304,3314915327,AO +3314915328,3314916351,MW +3314916352,3314917375,MZ +3314917376,3314918399,ZA +3314918400,3314919423,NG +3314919424,3314920447,GQ +3314921472,3314922495,TZ +3314922496,3314923519,ZA +3314923520,3314924543,CD +3314924544,3314925567,NG +3314925568,3314941951,GN +3314941952,3315073023,EG +3315073024,3315138559,TZ +3315138560,3315204095,MA +3315204096,3315269631,ET +3315269632,3315286015,ZA +3315286016,3315288063,KE +3315288064,3315288319,MU +3315288320,3315288575,KE +3315288576,3315289343,MU +3315289344,3315289599,KE +3315289600,3315291135,MU +3315291136,3315293183,KE +3315293184,3315294207,MU +3315294208,3315302399,ZA +3315302400,3315318783,ML +3315318784,3315322879,LS +3315326976,3315331071,ZW +3315331072,3315333119,GH +3315333120,3315351551,ZA +3315351552,3315367935,ET +3315367936,3315384319,KE +3315384320,3315397095,NG +3315397096,3315397096,ZA +3315397097,3315400703,NG +3315400704,3315417087,UG +3315417088,3315425279,ZA +3315425280,3315433471,SC +3315433472,3315449855,RW +3315449856,3315450879,BI +3315450880,3315451903,AO +3315451904,3315452927,LS +3315452928,3315453951,ZW +3315453952,3315454975,CD +3315454976,3315455999,RW +3315456000,3315457023,NG +3315457024,3315458047,ZA +3315458048,3315459071,SL +3315459072,3315460095,KE +3315460096,3315461119,SL +3315462144,3315463167,ZA +3315463168,3315464191,SO +3315464192,3315465215,CD +3315465216,3315466239,CG +3315466240,3315482623,MZ +3315482624,3315499007,MG +3315499008,3315515391,ZW +3315515392,3315531775,SC +3315531776,3315539967,CM +3315539968,3315548159,ZA +3315548160,3315552255,NG +3315552256,3315556351,ZA +3315556352,3315560447,KE +3315560448,3315564543,TZ +3315564544,3315568639,GH +3315568640,3315572735,MG +3315572736,3315580927,ST +3315580928,3315589119,CI +3315597312,3315656703,EG +3315656704,3315658751,EE +3315658752,3316121599,EG +3316121600,3316645887,ZA +3316645888,3317170175,KE +3317170176,3317301247,ZA +3317301248,3317432319,TZ +3317432320,3317497855,NA +3317497856,3317530623,CD +3317530624,3317547007,LS +3317547008,3317563391,ZA +3317563392,3317694463,GH +3317694464,3318218751,EG +3318218752,3318743039,DZ +3318743040,3318874111,SD +3318874112,3318939647,NG +3318939648,3318947839,KE +3318947840,3318956031,NG +3318956032,3318964223,ZA +3318964224,3318972415,MW +3318972416,3318988799,ZA +3318988800,3319005183,ZW +3319005184,3319136255,ZM +3319136256,3319152639,NE +3319152640,3319156735,GQ +3319156736,3319160831,GW +3319160832,3319164927,NG +3319164928,3319166975,ZA +3319166976,3319169023,ZW +3319169024,3319201791,CG +3319201792,3319234559,SL +3319234560,3319242751,LY +3319242752,3319250943,ZA +3319250944,3319255039,MG +3319255040,3319257087,ZA +3319257088,3319258111,LR +3319258112,3319259135,CD +3319259136,3319263231,ZA +3319263232,3319267327,TZ +3319267328,3319398399,AO +3319398400,3319529471,MZ +3319529472,3319537663,ZM +3319545856,3319554047,SO +3319554048,3319562239,KE +3319562240,3319570431,LS +3319570432,3319578623,GH +3319578624,3319595007,ZM +3319595008,3319611391,ZA +3319611392,3319619583,GH +3319619584,3319627775,ZA +3319627776,3319635967,UG +3319635968,3319644159,ZA +3319644160,3319652351,TZ +3319652352,3319660543,ZW +3319660544,3319791615,EG +3319791616,3320053759,MU +3320053760,3320184831,ZA +3320184832,3320250367,MA +3320250368,3320258559,MR +3320258560,3320266751,LS +3320266752,3320283135,GA +3320283136,3320285183,GM +3320285184,3320287231,GA +3320287232,3320289279,ZA +3320289280,3320291327,LR +3320291328,3320295423,ZA +3320295424,3320297471,KE +3320297472,3320299519,MU +3320299520,3320300543,BW +3320300544,3320301567,ZA +3320301568,3320302591,SO +3320302592,3320303615,GM +3320303616,3320304639,SC +3320304640,3320305663,ZW +3320305664,3320306687,MZ +3320306688,3320307711,LR +3320307712,3320308735,CV +3320308736,3320309759,LY +3320309760,3320310783,ZA +3320310784,3320311807,SS +3320312832,3320313855,ZM +3320313856,3320314879,BI +3320314880,3320315903,CD +3320315904,3320381439,KE +3320381440,3320446975,NA +3320446976,3320451071,SC +3320451072,3320455167,ZA +3320455168,3320463359,NG +3320463360,3320479743,NA +3320479744,3320500223,ZA +3320500224,3320502271,BW +3320502272,3320504319,BJ +3320504320,3320505343,TZ +3320505344,3320506367,NG +3320506368,3320507391,ZA +3320507392,3320508415,KE +3320508416,3320509439,ZA +3320509440,3320510463,RW +3320510464,3320511487,LY +3320512512,3320578047,MZ +3320578048,3320643583,ZA +3320643584,3320709119,KE +3320774656,3320791039,UG +3320791040,3320807423,BF +3320807424,3320823807,ZA +3320823808,3320827903,KE +3320827904,3320831999,MU +3320832000,3320834047,KE +3320834048,3320840191,MU +3320905728,3320938495,DJ +3320938496,3320971263,AO +3320971264,3320979455,GA +3320979456,3320981503,ZA +3320981504,3320981759,KE +3320981760,3320985599,ZA +3320985600,3320985607,KE +3320985608,3320995839,ZA +3320995840,3321004031,NG +3321004032,3321008127,GM +3321008128,3321012223,ZA +3321012224,3321016319,MZ +3321016320,3321018367,CF +3321018368,3321020415,MU +3321020416,3321022463,TZ +3321022464,3321024511,ZA +3321024512,3321028607,KE +3321028608,3321032703,CI +3321032704,3321036799,NG +3321036800,3321069567,RW +3321069568,3321102335,NA +3321167872,3321233407,ZA +3321233408,3321298943,EG +3321298944,3321364479,MA +3321364480,3321430015,KE +3321430016,3321495551,MZ +3321495552,3321561087,TZ +3321561088,3321570815,SD +3321570816,3321571071,SS +3321571072,3321593855,SD +3321593856,3321626623,GH +3321626624,3321692159,SD +3321692160,3321708543,NG +3321708544,3321724927,GH +3321724928,3321757695,MA +3321757696,3321790463,KE +3321790464,3321806847,LS +3321806848,3321823231,SD +3321823232,3321839615,NG +3321839616,3321855999,GH +3321856000,3321860095,CV +3321860096,3321864191,ZA +3321864192,3321868287,NG +3321868288,3321872383,CG +3321872384,3321876479,GM +3321876480,3321880575,NG +3321880576,3321884671,KM +3321884672,3321885695,ZA +3321885696,3321886719,NG +3321886720,3321887743,GA +3321887744,3321888767,NG +3321888768,3321968639,US +3321968640,3321970687,CA +3321970688,3321987071,US +3321987072,3321987615,CN +3321987616,3321987647,US +3321987648,3321987959,CN +3321987960,3321987967,US +3321987968,3321988375,CN +3321988376,3321988391,US +3321988392,3321988519,CN +3321988520,3321988527,US +3321988528,3321988615,CN +3321988616,3321988623,US +3321988624,3321989135,CN +3321989136,3321989151,US +3321989152,3321989159,CN +3321989160,3321989167,US +3321989168,3321989191,CN +3321989192,3321989199,US +3321989200,3321991007,CN +3321991008,3321991039,US +3321991040,3321991303,CN +3321991304,3321991311,US +3321991312,3321992015,CN +3321992016,3321992031,US +3321992032,3321992199,CN +3321992200,3321992223,US +3321992224,3321992295,CN +3321992296,3321992311,US +3321992312,3321992855,CN +3321992856,3321992863,US +3321992864,3321993215,CN +3321993216,3321993223,US +3321993224,3321993239,CN +3321993240,3321993247,US +3321993248,3321993991,CN +3321993992,3321993999,US +3321994000,3321995359,CN +3321995360,3321995391,US +3321995392,3321995999,CN +3321996000,3321996031,US +3321996032,3321996047,CN +3321996048,3321996055,US +3321996056,3321996543,CN +3321996544,3321996551,US +3321996552,3321997047,CN +3321997048,3321997055,US +3321997056,3321998431,CN +3321998432,3321998463,US +3321998464,3321998991,CN +3321998992,3321998999,US +3321999000,3321999519,CN +3321999520,3321999551,US +3321999552,3321999647,CN +3321999648,3321999679,US +3321999680,3321999943,CN +3321999944,3321999951,US +3321999952,3322000303,CN +3322000304,3322000319,US +3322000320,3322001615,CN +3322001616,3322001623,US +3322001624,3322002079,CN +3322002080,3322002111,US +3322002112,3322002687,CN +3322002688,3322002695,US +3322002696,3322002879,CN +3322002880,3322002895,US +3322002896,3322003455,CN +3322003456,3322019839,CA +3322019840,3322023935,US +3322023936,3322028031,CL +3322028032,3322036223,US +3322036224,3322052607,CA +3322052608,3322068991,US +3322068992,3322069047,CN +3322069048,3322069055,US +3322069056,3322069407,CN +3322069408,3322069439,US +3322069440,3322069503,CN +3322069504,3322069535,US +3322069536,3322069575,CN +3322069576,3322069583,US +3322069584,3322069599,CN +3322069600,3322069631,US +3322069632,3322069823,CN +3322069824,3322069855,US +3322069856,3322070399,CN +3322070400,3322070415,US +3322070416,3322070975,CN +3322070976,3322071039,US +3322071040,3322071119,CN +3322071120,3322071167,US +3322071168,3322071295,CN +3322071296,3322071359,US +3322071360,3322071567,CN +3322071568,3322071583,US +3322071584,3322071743,CN +3322071744,3322071775,US +3322071776,3322071919,CN +3322071920,3322071959,US +3322071960,3322071983,CN +3322071984,3322072031,US +3322072032,3322072159,CN +3322072160,3322072191,US +3322072192,3322072207,CN +3322072208,3322072215,US +3322072216,3322072279,CN +3322072280,3322072319,US +3322072320,3322072351,CN +3322072352,3322072367,US +3322072368,3322072479,CN +3322072480,3322072607,US +3322072608,3322072631,CN +3322072632,3322072639,US +3322072640,3322072863,CN +3322072864,3322072895,US +3322072896,3322072927,CN +3322072928,3322072943,US +3322072944,3322072959,CN +3322072960,3322073023,US +3322073024,3322073343,CN +3322073344,3322073599,US +3322073600,3322073871,CN +3322073872,3322073887,US +3322073888,3322074079,CN +3322074080,3322074111,US +3322074112,3322074287,CN +3322074288,3322074303,US +3322074304,3322074335,CN +3322074336,3322074383,US +3322074384,3322074543,CN +3322074544,3322074559,US +3322074560,3322074567,CN +3322074568,3322074591,US +3322074592,3322074783,CN +3322074784,3322074815,US +3322074816,3322074943,CN +3322074944,3322074951,US +3322074952,3322074975,CN +3322074976,3322075007,US +3322075008,3322075103,CN +3322075104,3322075199,US +3322075200,3322075223,CN +3322075224,3322075263,US +3322075264,3322075303,CN +3322075304,3322075311,US +3322075312,3322075319,CN +3322075320,3322075343,US +3322075344,3322075471,CN +3322075472,3322075487,US +3322075488,3322075551,CN +3322075552,3322075647,US +3322075648,3322075679,CN +3322075680,3322075711,US +3322075712,3322079167,CN +3322079168,3322079231,US +3322079232,3322079935,CN +3322079936,3322079999,US +3322080000,3322081919,CN +3322081920,3322082047,US +3322082048,3322084671,CN +3322084672,3322084863,US +3322084864,3322084927,CN +3322084928,3322085119,US +3322085120,3322085375,CN +3322085376,3322167551,US +3322167552,3322167807,GB +3322167808,3322202111,US +3322202112,3322203135,GB +3322203136,3322250975,US +3322250976,3322251007,IL +3322251008,3322251335,US +3322251336,3322251343,IL +3322251344,3322254719,US +3322254720,3322254783,CA +3322254784,3322339583,US +3322339584,3322339839,GB +3322339840,3322354175,US +3322354176,3322354431,JP +3322354432,3322361870,US +3322361871,3322361882,CY +3322361883,3322361890,US +3322361891,3322361906,RS +3322361907,3322361914,GB +3322361915,3322362367,US +3322362368,3322362431,DE +3322362432,3322609663,US +3322609664,3322610687,SA +3322610688,3322678535,US +3322678536,3322678551,SA +3322678552,3322678791,US +3322678792,3322678799,SA +3322678800,3322683391,US +3322683392,3322691583,AR +3322691584,3322691607,US +3322691608,3322691615,RO +3322691616,3322691775,US +3322691776,3322691791,CA +3322691792,3322692103,US +3322692104,3322692111,RO +3322692112,3322692223,US +3322692224,3322692351,CA +3322692352,3322692695,US +3322692696,3322692703,FR +3322692704,3322692775,US +3322692776,3322692783,RO +3322692784,3322692887,US +3322692888,3322692891,RO +3322692892,3322692971,US +3322692972,3322692975,RO +3322692976,3322693247,US +3322693248,3322693263,BR +3322693264,3322693271,US +3322693272,3322693279,BR +3322693280,3322693287,SG +3322693288,3322693307,US +3322693308,3322693311,CA +3322693312,3322694319,US +3322694320,3322694327,CA +3322694328,3322694895,US +3322694896,3322694903,GB +3322694904,3322695423,US +3322695424,3322695679,NL +3322695680,3322695919,US +3322695920,3322695935,CA +3322695936,3322696543,US +3322696544,3322696551,GB +3322696552,3322697215,US +3322697216,3322697223,RO +3322697224,3322697295,US +3322697296,3322697303,MA +3322697304,3322697415,US +3322697416,3322697423,RO +3322697424,3322697431,US +3322697432,3322697439,CA +3322697440,3322697951,US +3322697952,3322697983,CA +3322697984,3322698303,US +3322698304,3322698367,IL +3322698368,3322698383,US +3322698384,3322698391,CA +3322698392,3322698399,RO +3322698400,3322699199,US +3322699200,3322699207,PK +3322699208,3322699215,US +3322699216,3322699223,CA +3322699224,3322699231,RO +3322699232,3322700095,US +3322700096,3322700127,FR +3322700128,3322700287,US +3322700288,3322700543,NL +3322700544,3322706575,US +3322706576,3322706591,CA +3322706592,3322706631,US +3322706632,3322706639,GB +3322706640,3322706651,US +3322706652,3322706655,CA +3322706656,3322707743,US +3322707744,3322707751,CA +3322707752,3322748927,US +3322748928,3322753023,JP +3322753024,3322765415,US +3322765416,3322765431,IN +3322765432,3322765543,US +3322765544,3322765559,IN +3322765560,3322766031,US +3322766032,3322766039,IN +3322766040,3322766543,US +3322766544,3322766551,IN +3322766552,3322766863,US +3322766864,3322766871,IN +3322766872,3322767087,US +3322767088,3322767095,IN +3322767096,3322768223,US +3322768224,3322768239,IN +3322768240,3322768607,US +3322768608,3322768623,IN +3322768624,3322769327,US +3322769328,3322769343,IN +3322769344,3322773503,US +3322773504,3322806271,CA +3322806272,3322875903,US +3322880000,3322888191,AU +3322888192,3322888815,US +3322888816,3322888823,IN +3322888824,3322889183,US +3322889184,3322889191,BR +3322889192,3322889199,US +3322889200,3322889207,CN +3322889208,3322889535,US +3322889536,3322889599,HK +3322889600,3322889607,PE +3322889608,3322889839,US +3322889840,3322889855,PE +3322889856,3322890423,US +3322890424,3322890431,QA +3322890432,3322890439,US +3322890440,3322890447,QA +3322890448,3322890719,US +3322890720,3322890727,QA +3322890728,3322893063,US +3322893064,3322893071,BR +3322893072,3322893087,US +3322893088,3322893119,BR +3322893120,3322893983,US +3322893984,3322893991,BR +3322893992,3322894207,US +3322894208,3322894215,CN +3322894216,3322894703,US +3322894704,3322894719,IN +3322894720,3322897063,US +3322897064,3322897071,QA +3322897072,3322897919,US +3322897920,3322897927,SA +3322897928,3322897935,RO +3322897936,3322898839,US +3322898840,3322898847,BR +3322898848,3322899079,US +3322899080,3322899087,HK +3322899088,3322899103,US +3322899104,3322899135,HK +3322899136,3322899143,IN +3322899144,3322902831,US +3322902832,3322902847,IN +3322902848,3322903375,US +3322903376,3322903383,GB +3322903384,3322903487,US +3322903488,3322903495,GB +3322903496,3322903519,US +3322903520,3322903535,GB +3322903536,3322904575,US +3322904576,3322905407,CN +3322905408,3322905471,US +3322905472,3322905919,CN +3322905920,3322905935,US +3322905936,3322905951,CN +3322905952,3322905983,US +3322905984,3322906055,CN +3322906056,3322906063,US +3322906064,3322906415,CN +3322906416,3322906423,US +3322906424,3322906623,CN +3322906624,3322906631,US +3322906632,3322906735,CN +3322906736,3322906751,US +3322906752,3322907199,CN +3322907200,3322907231,US +3322907232,3322907511,CN +3322907512,3322907519,US +3322907520,3322907855,CN +3322907856,3322907871,US +3322907872,3322907999,CN +3322908000,3322908015,US +3322908016,3322908239,CN +3322908240,3322908255,US +3322908256,3322908911,CN +3322908912,3322908919,US +3322908920,3322909119,CN +3322909120,3322909183,US +3322909184,3322910143,CN +3322910144,3322910159,US +3322910160,3322910799,CN +3322910800,3322910815,US +3322910816,3322910975,CN +3322910976,3322910983,US +3322910984,3322911103,CN +3322911104,3322911135,US +3322911136,3322912863,CN +3322912864,3322912895,US +3322912896,3322912927,CN +3322912928,3322912959,US +3322912960,3322913023,CN +3322913024,3322913031,US +3322913032,3322913039,CN +3322913040,3322913047,US +3322913048,3322913799,CN +3322913800,3322913815,US +3322913816,3322913951,CN +3322913952,3322913975,US +3322913976,3322914895,CN +3322914896,3322914903,US +3322914904,3322915079,CN +3322915080,3322915087,US +3322915088,3322915199,CN +3322915200,3322915263,US +3322915264,3322915631,CN +3322915632,3322915647,US +3322915648,3322916127,CN +3322916128,3322916135,US +3322916136,3322916623,CN +3322916624,3322916639,US +3322916640,3322916823,CN +3322916824,3322916831,US +3322916832,3322917119,CN +3322917120,3322917127,US +3322917128,3322917935,CN +3322917936,3322917951,US +3322917952,3322918143,CN +3322918144,3322918151,US +3322918152,3322919439,CN +3322919440,3322919471,US +3322919472,3322919695,CN +3322919696,3322919711,US +3322919712,3322919775,CN +3322919776,3322919839,US +3322919840,3322919959,CN +3322919960,3322919999,US +3322920000,3322920823,CN +3322920824,3322920831,US +3322920832,3322921583,CN +3322921584,3322921591,US +3322921592,3322921903,CN +3322921904,3322921911,US +3322921912,3322922111,CN +3322922112,3322922143,US +3322922144,3322924047,CN +3322924048,3322924063,US +3322924064,3322924255,CN +3322924256,3322924271,US +3322924272,3322924575,CN +3322924576,3322924607,US +3322924608,3322927247,CN +3322927248,3322927255,US +3322927256,3322927263,CN +3322927264,3322927279,US +3322927280,3322928175,CN +3322928176,3322928191,US +3322928192,3322928463,CN +3322928464,3322928479,US +3322928480,3322928511,CN +3322928512,3322928575,US +3322928576,3322928815,CN +3322928816,3322928831,US +3322928832,3322929591,CN +3322929592,3322929599,US +3322929600,3322931167,CN +3322931168,3322931175,US +3322931176,3322931671,CN +3322931672,3322931679,US +3322931680,3322932335,CN +3322932336,3322932343,US +3322932344,3322932927,CN +3322932928,3322932935,US +3322932936,3322933303,CN +3322933304,3322933311,US +3322933312,3322933503,CN +3322933504,3322933511,US +3322933512,3322935575,CN +3322935576,3322935583,US +3322935584,3322936023,CN +3322936024,3322936031,US +3322936032,3322936095,CN +3322936096,3322936103,US +3322936104,3322937095,CN +3322937096,3322937119,US +3322937120,3322937151,CN +3322937152,3322937167,US +3322937168,3322937343,CN +3322937344,3322945535,US +3322945536,3322951679,CN +3322951680,3322953727,US +3322953728,3322956583,NL +3322956584,3322956591,US +3322956592,3322956599,IN +3322956600,3322956607,SE +3322956608,3322956615,ES +3322956616,3322956623,DE +3322956624,3322962431,NL +3322962432,3322962687,GB +3322962688,3322962943,ES +3322962944,3322963455,NL +3322963456,3322964479,GB +3322964480,3322965247,NL +3322965248,3322965503,DE +3322965504,3322965759,US +3322965760,3322966015,NL +3322966016,3322969343,US +3322969344,3322970111,NL +3322970112,3323002879,CA +3323002880,3323013887,US +3323013888,3323014143,CA +3323014144,3323017727,US +3323017728,3323017983,CA +3323017984,3323020799,US +3323020800,3323021055,SG +3323021056,3323022591,US +3323022592,3323022847,GB +3323022848,3323023103,US +3323023360,3323027455,US +3323027456,3323027711,CA +3323027712,3323031807,US +3323032576,3323032831,US +3323032832,3323033087,IT +3323033344,3323033599,US +3323033600,3323034111,BR +3323034112,3323038719,US +3323038720,3323038975,CA +3323038976,3323048959,US +3323048960,3323049727,NL +3323049728,3323061247,US +3323061504,3323062015,US +3323062016,3323062527,BR +3323062528,3323068415,US +3323199488,3323201535,US +3323201536,3323203583,CA +3323203584,3323207679,US +3323207680,3323215871,CA +3323215872,3323224063,US +3323224064,3323232255,NL +3323232256,3323240959,US +3323240960,3323241215,CA +3323241216,3323241247,GB +3323241248,3323241279,EE +3323241280,3323241311,US +3323241312,3323241343,GB +3323241344,3323241351,CA +3323241352,3323241375,US +3323241376,3323241407,CA +3323241408,3323241439,GB +3323241440,3323241455,US +3323241456,3323241471,CA +3323241472,3323241479,GB +3323241480,3323241487,CN +3323241488,3323241495,CA +3323241496,3323241503,MT +3323241504,3323241511,US +3323241512,3323241519,CA +3323241520,3323241527,TR +3323241528,3323241567,CA +3323241568,3323241575,US +3323241576,3323241583,CA +3323241584,3323241591,CN +3323241592,3323241607,CA +3323241608,3323241623,US +3323241624,3323241631,BR +3323241632,3323241639,US +3323241640,3323241647,GB +3323241648,3323241655,CA +3323241656,3323241663,US +3323241664,3323241671,TR +3323241672,3323241679,PH +3323241680,3323241687,US +3323241688,3323241695,CN +3323241696,3323241703,EE +3323241704,3323241711,CN +3323241712,3323241719,GB +3323241720,3323241727,SA +3323241728,3323241819,CA +3323241820,3323241823,US +3323241824,3323241883,CA +3323241884,3323241887,US +3323241888,3323241983,CA +3323241984,3323242239,US +3323242240,3323242255,CA +3323242256,3323242271,US +3323242272,3323242287,CA +3323242288,3323242303,US +3323242304,3323242311,CA +3323242312,3323242319,SE +3323242320,3323242367,CA +3323242368,3323242511,US +3323242512,3323242527,BD +3323242528,3323242575,CA +3323242576,3323242591,US +3323242592,3323242607,CA +3323242608,3323242623,US +3323242624,3323242703,CA +3323242704,3323243007,US +3323243008,3323243055,CA +3323243056,3323243063,US +3323243064,3323243087,CA +3323243088,3323243095,IE +3323243096,3323243103,GB +3323243104,3323243119,CA +3323243120,3323243127,US +3323243128,3323243135,CA +3323243136,3323243143,US +3323243144,3323243159,CA +3323243160,3323243175,US +3323243176,3323243183,CA +3323243184,3323243199,US +3323243200,3323243207,CN +3323243208,3323243215,CA +3323243216,3323243231,US +3323243232,3323243239,CA +3323243240,3323243255,US +3323243256,3323243263,CA +3323243264,3323243391,CN +3323243392,3323243455,CA +3323243456,3323243487,GB +3323243488,3323243519,CA +3323243520,3323243535,US +3323243536,3323243551,BD +3323243552,3323243583,CA +3323243584,3323243615,US +3323243616,3323243663,CA +3323243664,3323243711,US +3323243712,3323243743,CA +3323243744,3323243791,US +3323243792,3323243799,CA +3323243800,3323243807,US +3323243808,3323243815,CA +3323243816,3323243823,US +3323243824,3323243903,CA +3323243904,3323243967,US +3323243968,3323244031,CA +3323244032,3323244095,LT +3323244096,3323244159,US +3323244160,3323244175,CA +3323244176,3323244255,US +3323244256,3323244287,CA +3323244288,3323244327,US +3323244328,3323244351,CA +3323244352,3323244415,US +3323244416,3323244487,CA +3323244488,3323244503,US +3323244504,3323244511,CA +3323244512,3323244527,US +3323244528,3323244687,CA +3323244688,3323244695,US +3323244696,3323244703,CA +3323244704,3323244735,US +3323244736,3323244767,CA +3323244768,3323244783,US +3323244784,3323244799,CA +3323244800,3323244927,US +3323244928,3323245055,CA +3323245056,3323245087,US +3323245088,3323245119,GB +3323245120,3323245247,US +3323245248,3323245255,CA +3323245256,3323245311,US +3323245312,3323245319,LT +3323245320,3323245327,CA +3323245328,3323245383,US +3323245384,3323245391,IN +3323245392,3323245399,GB +3323245400,3323245407,TR +3323245408,3323245415,AE +3323245416,3323245423,TR +3323245424,3323245439,CA +3323245440,3323245455,GB +3323245456,3323245463,AZ +3323245464,3323245479,CA +3323245480,3323245487,AE +3323245488,3323245495,BE +3323245496,3323245535,US +3323245536,3323245543,SG +3323245544,3323245551,US +3323245552,3323245559,GB +3323245560,3323245567,CN +3323245568,3323245655,US +3323245656,3323245663,CA +3323245664,3323245823,US +3323245824,3323245951,CA +3323245952,3323245959,US +3323245960,3323245983,CA +3323245984,3323246015,US +3323246016,3323246079,CA +3323246080,3323246207,US +3323246208,3323246231,CA +3323246232,3323246239,FI +3323246240,3323246271,CA +3323246272,3323246463,US +3323246464,3323246591,CN +3323246592,3323247359,US +3323247360,3323247423,CA +3323247424,3323247575,US +3323247576,3323247583,CA +3323247584,3323248383,US +3323248384,3323248639,CA +3323248640,3323270420,US +3323270421,3323270421,CH +3323270422,3323339263,US +3323339776,3323340031,CA +3323340288,3323342591,US +3323342592,3323342847,AU +3323343616,3323343871,DE +3323343872,3323346175,US +3323346176,3323346431,AU +3323346432,3323354367,US +3323354368,3323355647,DE +3323355648,3323356671,US +3323356672,3323356927,CA +3323356928,3323378687,US +3323378688,3323378943,CA +3323378944,3323382783,US +3323382784,3323383295,CA +3323383296,3323391231,US +3323391232,3323391487,CA +3323391488,3323394559,US +3323394560,3323395071,CL +3323395072,3323416415,US +3323416416,3323416479,GB +3323416480,3323437823,US +3323437824,3323438079,CA +3323438080,3323440703,US +3323440704,3323440735,GB +3323440736,3323441043,US +3323441044,3323441047,GB +3323441048,3323444847,US +3323444848,3323444863,CA +3323444864,3323446271,US +3323446272,3323446527,GB +3323446528,3323454463,US +3323454464,3323454719,NL +3323454720,3323457791,US +3323457792,3323458047,GB +3323458048,3323458815,US +3323458816,3323459071,NL +3323459072,3323462911,US +3323462912,3323463167,BR +3323463168,3323471615,US +3323471616,3323471623,GB +3323471624,3323471679,US +3323471680,3323471759,GB +3323471760,3323471855,US +3323471856,3323471859,FR +3323471860,3323475423,US +3323475424,3323475455,IN +3323475456,3323477855,US +3323477856,3323477871,KR +3323477872,3323477983,US +3323477984,3323478015,GB +3323478016,3323494895,US +3323494896,3323494911,GB +3323494912,3323495015,US +3323495016,3323495023,QA +3323495024,3323496279,US +3323496280,3323496287,HK +3323496288,3323497023,US +3323497024,3323497031,HK +3323497032,3323497519,US +3323497520,3323497527,QA +3323497528,3323498223,US +3323498224,3323498239,BR +3323498240,3323502031,US +3323502032,3323502039,HK +3323502040,3323502839,US +3323502840,3323502847,PK +3323502848,3323505287,US +3323505288,3323505295,BR +3323505296,3323505311,US +3323505312,3323505343,BR +3323505344,3323505527,US +3323505528,3323505535,PK +3323505536,3323506559,US +3323506560,3323506567,PK +3323506568,3323506647,US +3323506648,3323506655,GB +3323506656,3323507055,US +3323507056,3323507063,GB +3323507064,3323507823,US +3323507824,3323507831,CA +3323507832,3323508639,US +3323508640,3323508647,GB +3323508648,3323659263,US +3323659264,3323660543,NZ +3323660544,3323661311,US +3323661312,3323662335,CA +3323662336,3323674623,US +3323674624,3323677991,CA +3323677992,3323677995,US +3323677996,3323678031,CA +3323678032,3323678047,US +3323678048,3323678055,CA +3323678056,3323678059,MX +3323678060,3323678063,CA +3323678064,3323678079,GB +3323678080,3323678095,CA +3323678096,3323678111,US +3323678112,3323678127,CA +3323678128,3323678143,GB +3323678144,3323678147,CA +3323678148,3323678151,US +3323678152,3323678159,CA +3323678160,3323678167,GB +3323678168,3323678171,CA +3323678172,3323678175,US +3323678176,3323678195,CA +3323678196,3323678199,VE +3323678200,3323678463,US +3323678464,3323678519,CA +3323678520,3323678523,BR +3323678524,3323678527,US +3323678528,3323678583,CA +3323678584,3323678587,US +3323678588,3323678591,ID +3323678592,3323678631,CA +3323678632,3323678635,PL +3323678636,3323678687,CA +3323678688,3323678691,PA +3323678692,3323678695,CA +3323678696,3323678699,PT +3323678700,3323679871,CA +3323679872,3323679903,IN +3323679904,3323679963,CA +3323679964,3323679999,US +3323680000,3323680255,CA +3323680256,3323681023,US +3323681024,3323681327,CA +3323681328,3323681343,US +3323681344,3323681359,CA +3323681360,3323681363,FR +3323681364,3323681399,CA +3323681400,3323681403,IT +3323681404,3323681407,MX +3323681408,3323681415,CA +3323681416,3323681423,BR +3323681424,3323681439,CA +3323681440,3323681455,AE +3323681456,3323681479,CA +3323681480,3323681487,GB +3323681488,3323681519,CA +3323681520,3323681527,SI +3323681528,3323681535,CA +3323681536,3323681567,IN +3323681568,3323681583,US +3323681584,3323681591,CA +3323681592,3323681599,US +3323681600,3323681631,CA +3323681632,3323681663,NO +3323681664,3323681727,CA +3323681728,3323681735,MY +3323681736,3323681747,CA +3323681748,3323681751,VE +3323681752,3323681759,BG +3323681760,3323682559,CA +3323682560,3323682591,US +3323682592,3323682655,CA +3323682656,3323682687,IE +3323682688,3323682751,CA +3323682752,3323682767,US +3323682768,3323682771,CA +3323682772,3323682775,RO +3323682776,3323682787,CA +3323682788,3323682791,AF +3323682792,3323682831,CA +3323682832,3323682839,IN +3323682840,3323682843,BD +3323682844,3323682871,CA +3323682872,3323682875,US +3323682876,3323682955,CA +3323682956,3323682959,US +3323682960,3323682967,CA +3323682968,3323682971,US +3323682972,3323682975,CY +3323682976,3323682991,CA +3323682992,3323682999,CH +3323683000,3323683007,CA +3323683008,3323683039,AU +3323683040,3323683071,CA +3323683072,3323683103,BA +3323683104,3323683123,CA +3323683124,3323683127,BR +3323683128,3323683215,CA +3323683216,3323683223,VN +3323683224,3323683295,CA +3323683296,3323683299,CL +3323683300,3323683359,CA +3323683360,3323683367,MY +3323683368,3323683399,CA +3323683400,3323683403,BR +3323683404,3323683427,CA +3323683428,3323683431,IT +3323683432,3323683435,DE +3323683436,3323683447,CA +3323683448,3323683455,US +3323683456,3323683471,CA +3323683472,3323683479,MX +3323683480,3323683487,BR +3323683488,3323683523,CA +3323683524,3323683527,DE +3323683528,3323683535,CA +3323683536,3323683551,AU +3323683552,3323683583,CA +3323683584,3323683591,PA +3323683592,3323683679,CA +3323683680,3323683683,FR +3323683684,3323683687,BR +3323683688,3323683703,CA +3323683704,3323683707,CO +3323683708,3323683711,US +3323683712,3323683839,GP +3323683840,3323683847,CA +3323683848,3323683851,IN +3323683852,3323683855,GB +3323683856,3323683871,CA +3323683872,3323683903,IL +3323683904,3323683935,CA +3323683936,3323683967,US +3323683968,3323683983,CA +3323683984,3323683991,RO +3323683992,3323684031,CA +3323684032,3323684063,PE +3323684064,3323684223,CA +3323684224,3323684227,MX +3323684228,3323684239,CA +3323684240,3323684243,GB +3323684244,3323684271,CA +3323684272,3323684279,FR +3323684280,3323684287,ES +3323684288,3323684291,IN +3323684292,3323684387,CA +3323684388,3323684391,MX +3323684392,3323684395,CA +3323684396,3323684399,IN +3323684400,3323684431,CA +3323684432,3323684435,US +3323684436,3323684443,CA +3323684444,3323684447,IN +3323684448,3323684451,US +3323684452,3323684455,BR +3323684456,3323684459,PE +3323684460,3323684463,CA +3323684464,3323684479,US +3323684480,3323684511,CA +3323684512,3323684515,GB +3323684516,3323684539,CA +3323684540,3323684559,US +3323684560,3323684615,CA +3323684616,3323684619,US +3323684620,3323684735,CA +3323684736,3323684739,IN +3323684740,3323684783,CA +3323684784,3323684799,CO +3323684800,3323684831,CA +3323684832,3323684835,PE +3323684836,3323684839,MX +3323684840,3323684843,CA +3323684844,3323684847,US +3323684848,3323684855,CA +3323684856,3323684863,US +3323684864,3323684883,CA +3323684884,3323684887,US +3323684888,3323684891,CA +3323684892,3323684895,AR +3323684896,3323684951,CA +3323684952,3323684959,US +3323684960,3323684975,BZ +3323684976,3323684991,US +3323684992,3323685023,CA +3323685024,3323685039,RO +3323685040,3323685167,CA +3323685168,3323685183,MX +3323685184,3323685215,CA +3323685216,3323685231,US +3323685232,3323685239,SI +3323685240,3323685247,GB +3323685248,3323685263,CA +3323685264,3323685271,US +3323685272,3323685275,CA +3323685276,3323685287,US +3323685288,3323685295,CA +3323685296,3323685311,PL +3323685312,3323685315,VG +3323685316,3323685319,CA +3323685320,3323685327,CO +3323685328,3323685343,BR +3323685344,3323685347,BZ +3323685348,3323685351,IN +3323685352,3323685359,US +3323685360,3323685391,CA +3323685392,3323685399,MX +3323685400,3323685407,CA +3323685408,3323685411,MX +3323685412,3323685415,CA +3323685416,3323685419,AR +3323685420,3323685527,CA +3323685528,3323685535,GB +3323685536,3323685551,CA +3323685552,3323685555,BY +3323685556,3323685767,CA +3323685768,3323685775,BR +3323685776,3323685799,CA +3323685800,3323685823,US +3323685824,3323685831,BR +3323685832,3323685847,CA +3323685848,3323685855,DE +3323685856,3323685871,CA +3323685872,3323685887,US +3323685888,3323685899,CA +3323685900,3323685903,US +3323685904,3323685907,CA +3323685908,3323685911,CY +3323685912,3323685919,US +3323685920,3323685923,CA +3323685924,3323685927,BR +3323685928,3323685931,CA +3323685932,3323685935,PE +3323685936,3323685943,CA +3323685944,3323685951,NL +3323685952,3323686047,CA +3323686048,3323686051,US +3323686052,3323686055,AR +3323686056,3323686095,CA +3323686096,3323686111,US +3323686112,3323686135,CA +3323686136,3323686143,MX +3323686144,3323686159,NO +3323686160,3323686163,US +3323686164,3323686191,CA +3323686192,3323686195,PE +3323686196,3323686199,VI +3323686200,3323686255,CA +3323686256,3323686263,DE +3323686264,3323686271,US +3323686272,3323686287,CA +3323686288,3323686303,US +3323686304,3323686367,CA +3323686368,3323686371,IN +3323686372,3323686383,CA +3323686384,3323686391,US +3323686392,3323686439,CA +3323686440,3323686447,BR +3323686448,3323686591,CA +3323686592,3323686595,FR +3323686596,3323686599,CA +3323686600,3323686607,BR +3323686608,3323686623,CA +3323686624,3323686631,NL +3323686632,3323686639,BR +3323686640,3323686655,US +3323686656,3323686659,PE +3323686660,3323686663,US +3323686664,3323686667,CA +3323686668,3323686671,FR +3323686672,3323686683,CA +3323686684,3323686687,IN +3323686688,3323686731,CA +3323686732,3323686735,US +3323686736,3323686783,CA +3323686784,3323686791,BR +3323686792,3323686807,CA +3323686808,3323686811,CR +3323686812,3323686815,PE +3323686816,3323686823,CA +3323686824,3323686827,US +3323686828,3323686847,CA +3323686848,3323686851,US +3323686852,3323686879,CA +3323686880,3323686887,US +3323686888,3323686895,MX +3323686896,3323686911,CA +3323686912,3323686943,BR +3323686944,3323686975,IN +3323686976,3323687031,CA +3323687032,3323687039,US +3323687040,3323687073,CA +3323687074,3323687074,US +3323687075,3323687079,CA +3323687080,3323687103,US +3323687104,3323687111,BR +3323687112,3323687115,PT +3323687116,3323687167,CA +3323687168,3323687183,US +3323687184,3323687199,BR +3323687200,3323687215,CA +3323687216,3323687231,US +3323687232,3323687235,CA +3323687236,3323687239,SK +3323687240,3323687255,CA +3323687256,3323687259,US +3323687260,3323687279,CA +3323687280,3323687287,US +3323687288,3323687427,CA +3323687428,3323687431,BZ +3323687432,3323687567,CA +3323687568,3323687571,PL +3323687572,3323687575,CA +3323687576,3323687583,ES +3323687584,3323687591,CA +3323687592,3323687595,VE +3323687596,3323687711,CA +3323687712,3323687715,US +3323687716,3323687719,CA +3323687720,3323687727,US +3323687728,3323687731,VE +3323687732,3323687735,AE +3323687736,3323687743,CA +3323687744,3323687747,ES +3323687748,3323687815,CA +3323687816,3323687819,US +3323687820,3323687855,CA +3323687856,3323687863,US +3323687864,3323687871,CA +3323687872,3323687887,PK +3323687888,3323687891,BR +3323687892,3323687895,CA +3323687896,3323687903,IN +3323687904,3323687911,BR +3323687912,3323687915,CA +3323687916,3323687919,US +3323687920,3323687923,CA +3323687924,3323687927,VN +3323687928,3323687935,BR +3323687936,3323687999,US +3323688000,3323688051,CA +3323688052,3323688055,MX +3323688056,3323688059,CA +3323688060,3323688063,GB +3323688064,3323688135,CA +3323688136,3323688143,US +3323688144,3323688163,CA +3323688164,3323688175,BR +3323688176,3323688207,CA +3323688208,3323688215,AR +3323688216,3323688255,CA +3323688256,3323688271,BR +3323688272,3323688287,CA +3323688288,3323688303,PA +3323688304,3323688319,CA +3323688320,3323688335,US +3323688336,3323688391,CA +3323688392,3323688395,ID +3323688396,3323688415,CA +3323688416,3323688447,DE +3323688448,3323688463,CA +3323688464,3323688467,BR +3323688468,3323688471,CA +3323688472,3323688479,US +3323688480,3323688531,CA +3323688532,3323688535,EC +3323688536,3323688543,CA +3323688544,3323688551,VE +3323688552,3323688563,CA +3323688564,3323688567,CL +3323688568,3323688571,VE +3323688572,3323688603,CA +3323688604,3323688607,FR +3323688608,3323688655,CA +3323688656,3323688659,IN +3323688660,3323688663,CA +3323688664,3323688671,CH +3323688672,3323688675,CA +3323688676,3323688679,US +3323688680,3323688839,CA +3323688840,3323688843,US +3323688844,3323688847,CA +3323688848,3323688855,PT +3323688856,3323688863,CL +3323688864,3323689055,CA +3323689056,3323689059,FR +3323689060,3323689071,CA +3323689072,3323689079,ID +3323689080,3323689167,CA +3323689168,3323689183,US +3323689184,3323689191,PE +3323689192,3323689247,CA +3323689248,3323689251,IN +3323689252,3323689255,US +3323689256,3323689279,CA +3323689280,3323689295,US +3323689296,3323689347,CA +3323689348,3323689351,VE +3323689352,3323689359,CA +3323689360,3323689367,US +3323689368,3323689383,CA +3323689384,3323689391,BR +3323689392,3323689399,CA +3323689400,3323689403,MX +3323689404,3323689407,BR +3323689408,3323689427,CA +3323689428,3323689431,EC +3323689432,3323689435,CA +3323689436,3323689439,MY +3323689440,3323689491,CA +3323689492,3323689495,BR +3323689496,3323689519,CA +3323689520,3323689527,ES +3323689528,3323689559,CA +3323689560,3323689583,US +3323689584,3323689595,CA +3323689596,3323689663,US +3323689664,3323689711,CA +3323689712,3323689715,BR +3323689716,3323689719,US +3323689720,3323689807,CA +3323689808,3323689823,US +3323689824,3323689863,CA +3323689864,3323689871,PE +3323689872,3323689879,IT +3323689880,3323689903,CA +3323689904,3323689911,BR +3323689912,3323689927,CA +3323689928,3323689935,US +3323689936,3323689983,CA +3323689984,3323690015,RS +3323690016,3323690095,CA +3323690096,3323690111,PK +3323690112,3323690143,CO +3323690144,3323690199,CA +3323690200,3323690207,US +3323690208,3323690223,CA +3323690224,3323690235,US +3323690236,3323690351,CA +3323690352,3323690359,AE +3323690360,3323690363,US +3323690364,3323690463,CA +3323690464,3323690495,PE +3323690496,3323741439,US +3323741440,3323741695,GB +3323741696,3323744255,US +3323744256,3323748351,GB +3323748352,3323805695,US +3323805696,3323805951,GB +3323805952,3324051455,US +3324051456,3324182527,CA +3324182528,3324193279,US +3324193280,3324193791,CA +3324193792,3324196747,US +3324196748,3324196751,NG +3324196752,3324255231,US +3324255232,3324256255,VI +3324256256,3324259327,SA +3324259328,3324259583,US +3324259584,3324260095,SA +3324260096,3324277759,US +3324277760,3324278783,CA +3324278784,3324279071,US +3324279072,3324279079,TR +3324279080,3324279103,US +3324279104,3324279167,ZA +3324279168,3324279175,IN +3324279176,3324279183,US +3324279184,3324279191,CA +3324279192,3324279199,PT +3324279200,3324279303,US +3324279304,3324279311,GB +3324279312,3324279359,US +3324279360,3324279423,CO +3324279424,3324279431,US +3324279432,3324279439,SE +3324279440,3324279567,US +3324279568,3324279583,IN +3324279584,3324279615,BR +3324279616,3324279647,CA +3324279648,3324279679,AU +3324279680,3324279871,US +3324279872,3324279903,BR +3324279904,3324280191,US +3324280192,3324280207,CA +3324280208,3324280223,GB +3324280224,3324280319,US +3324280320,3324280351,AF +3324280352,3324280447,US +3324280448,3324280479,BR +3324280480,3324280511,US +3324280512,3324280575,AF +3324280576,3324280695,US +3324280696,3324280703,ZW +3324280704,3324280767,PH +3324280768,3324354559,US +3324354560,3324362751,CA +3324362752,3324379135,US +3324379136,3324380159,CA +3324380160,3324380927,US +3324380928,3324381183,CA +3324381184,3324449535,US +3324449536,3324449791,GB +3324449792,3324470271,US +3324470272,3324474367,GB +3324474368,3324522495,US +3324522496,3324522751,CN +3324522752,3324523007,US +3324523008,3324523431,CN +3324523432,3324523455,US +3324523456,3324523559,CN +3324523560,3324523567,US +3324523568,3324523575,CN +3324523576,3324523583,US +3324523584,3324524047,CN +3324524048,3324524055,US +3324524056,3324524255,CN +3324524256,3324524287,US +3324524288,3324524439,CN +3324524440,3324524447,US +3324524448,3324524543,CN +3324524544,3324524551,US +3324524552,3324524783,CN +3324524784,3324524791,US +3324524792,3324524991,CN +3324524992,3324525055,US +3324525056,3324525095,CN +3324525096,3324525103,US +3324525104,3324525111,CN +3324525112,3324525119,US +3324525120,3324525583,CN +3324525584,3324525631,US +3324525632,3324525695,CN +3324525696,3324525791,US +3324525792,3324526015,CN +3324526016,3324526335,US +3324526336,3324526591,CN +3324526592,3324579839,US +3324582912,3324583935,CA +3324583936,3324587775,CL +3324587776,3324601087,US +3324601088,3324601343,GB +3324601344,3324604671,US +3324604672,3324604927,GB +3324604928,3324613695,US +3324613696,3324613727,LU +3324613728,3324613759,US +3324613760,3324613855,LU +3324613856,3324624895,US +3324633088,3324634111,PE +3324634112,3324635647,AR +3324635648,3324635903,HK +3324635904,3324636159,US +3324636160,3324637183,NZ +3324637184,3324638207,DE +3324638208,3324638719,IN +3324638720,3324642303,US +3324642304,3324642559,CA +3324642560,3324645887,US +3324645888,3324646143,CA +3324646144,3324647679,US +3324647680,3324647935,CA +3324647936,3324650495,US +3324650496,3324650751,CA +3324650752,3324653311,US +3324653312,3324653567,CA +3324653568,3324655871,US +3324655872,3324656127,CA +3324656128,3324659967,US +3324659968,3324660223,CA +3324660224,3324660479,US +3324660480,3324660735,CA +3324660736,3324662015,US +3324662016,3324662271,CA +3324662272,3324662527,US +3324662528,3324662783,CA +3324662784,3324664319,US +3324664320,3324664575,CA +3324664576,3324665855,US +3324665856,3324666367,CA +3324666368,3324668415,US +3324668416,3324668671,CA +3324668672,3324672767,US +3324672768,3324673023,CA +3324673024,3324674815,US +3324674816,3324675327,CA +3324675328,3324676351,US +3324676352,3324676863,CA +3324676864,3324678911,US +3324678912,3324679167,CA +3324679168,3324679423,US +3324679424,3324679935,CA +3324679936,3324681215,US +3324681216,3324681471,CA +3324681472,3324682495,US +3324682496,3324682751,CA +3324682752,3324684799,US +3324684800,3324685055,CA +3324685056,3324686335,US +3324686336,3324686591,CA +3324686592,3324690687,US +3324690688,3324690943,CA +3324690944,3324692991,US +3324692992,3324693247,CA +3324693248,3324693503,US +3324693504,3324693759,CA +3324693760,3324694527,US +3324694528,3324695039,CA +3324695040,3324695551,US +3324695552,3324695807,CA +3324695808,3324696063,US +3324696064,3324696575,CA +3324696576,3324696831,US +3324696832,3324697087,CA +3324697088,3324698623,US +3324698624,3324699135,CA +3324699136,3324699391,US +3324699392,3324699647,CA +3324699648,3324701183,US +3324701184,3324701695,CA +3324701696,3324701951,US +3324701952,3324702207,CA +3324702208,3324703999,US +3324704000,3324704255,CA +3324704256,3324706303,US +3324706304,3324706559,CA +3324706560,3324805119,US +3324805120,3324805151,CN +3324805152,3324805183,ES +3324805184,3324805207,US +3324805208,3324805215,IN +3324805216,3324805239,US +3324805240,3324805247,CA +3324805248,3324805255,SG +3324805256,3324805279,US +3324805280,3324805295,CN +3324805296,3324805303,US +3324805304,3324805343,CN +3324805344,3324805359,US +3324805360,3324805367,CN +3324805368,3324805375,US +3324805376,3324805383,CN +3324805384,3324805399,US +3324805400,3324805407,CN +3324805408,3324805415,US +3324805416,3324805423,ES +3324805424,3324805439,CN +3324805440,3324805455,US +3324805456,3324805463,ZA +3324805464,3324805471,BR +3324805472,3324805503,CN +3324805504,3324805519,US +3324805520,3324805535,GB +3324805536,3324805583,US +3324805584,3324805591,PK +3324805592,3324805599,US +3324805600,3324805615,CN +3324805616,3324805663,US +3324805664,3324805695,IN +3324805696,3324805703,TR +3324805704,3324805711,BR +3324805712,3324805719,US +3324805720,3324805727,BR +3324805728,3324805791,US +3324805792,3324805807,NL +3324805808,3324805823,US +3324805824,3324805831,NL +3324805832,3324805839,US +3324805840,3324805847,PK +3324805848,3324805951,US +3324805952,3324805967,GB +3324805968,3324805983,US +3324805984,3324805999,NL +3324806000,3324806047,CN +3324806048,3324806127,US +3324806128,3324806135,NO +3324806136,3324806159,US +3324806160,3324806167,CN +3324806168,3324806175,SG +3324806176,3324806183,US +3324806184,3324806191,IL +3324806192,3324806207,US +3324806208,3324806215,CN +3324806216,3324806223,TW +3324806224,3324806231,US +3324806232,3324806239,NO +3324806240,3324806279,CN +3324806280,3324806303,US +3324806304,3324806311,BR +3324806312,3324806327,US +3324806328,3324806335,CN +3324806336,3324806351,IN +3324806352,3324806399,US +3324806400,3324806415,CN +3324806416,3324806423,CA +3324806424,3324806447,US +3324806448,3324806463,IN +3324806464,3324806535,US +3324806536,3324806543,PK +3324806544,3324806551,CA +3324806552,3324806559,NL +3324806560,3324806687,US +3324806688,3324806719,CN +3324806720,3324806751,RU +3324806752,3324806759,US +3324806760,3324806767,GB +3324806768,3324806775,US +3324806776,3324806783,UA +3324806784,3324806799,AU +3324806800,3324806807,SG +3324806808,3324806815,US +3324806816,3324806823,NO +3324806824,3324806831,US +3324806832,3324806847,RU +3324806848,3324806855,US +3324806856,3324806863,CN +3324806864,3324806879,IN +3324806880,3324806895,IL +3324806896,3324806975,US +3324806976,3324806983,GB +3324806984,3324806991,CA +3324806992,3324807007,US +3324807008,3324807023,PK +3324807024,3324807039,CA +3324807040,3324807055,RU +3324807056,3324807103,US +3324807104,3324807111,AE +3324807112,3324807127,US +3324807128,3324807135,AU +3324807136,3324807151,US +3324807152,3324807167,GB +3324807168,3324807175,BR +3324807176,3324807255,US +3324807256,3324807263,BR +3324807264,3324807327,US +3324807328,3324807335,IN +3324807336,3324807343,CR +3324807344,3324807359,BR +3324807360,3324807367,IN +3324807368,3324807391,CN +3324807392,3324807423,US +3324807424,3324807455,BR +3324807456,3324807471,CN +3324807472,3324807487,US +3324807488,3324807495,RO +3324807496,3324807503,QA +3324807504,3324807511,US +3324807512,3324807519,NL +3324807520,3324807535,IN +3324807536,3324807551,BR +3324807552,3324807647,US +3324807648,3324807663,IN +3324807664,3324807671,BR +3324807672,3324807727,US +3324807728,3324807743,CA +3324807744,3324807791,US +3324807792,3324807799,AU +3324807800,3324807807,BR +3324807808,3324807871,US +3324807872,3324807903,IN +3324807904,3324807919,US +3324807920,3324807935,CN +3324807936,3324807959,US +3324807960,3324807967,CA +3324807968,3324807983,IN +3324807984,3324807999,TR +3324808000,3324808007,BR +3324808008,3324808015,US +3324808016,3324808023,QA +3324808024,3324808047,US +3324808048,3324808063,SG +3324808064,3324808079,CN +3324808080,3324808119,US +3324808120,3324808127,IN +3324808128,3324808159,US +3324808160,3324808167,NO +3324808168,3324808183,US +3324808184,3324808191,ZA +3324808192,3324808199,US +3324808200,3324808207,BR +3324808208,3324808247,US +3324808248,3324808255,TR +3324808256,3324808279,US +3324808280,3324808287,SG +3324808288,3324808303,CN +3324808304,3324808311,RO +3324808312,3324808351,US +3324808352,3324808383,TW +3324808384,3324808399,US +3324808400,3324808415,IN +3324808416,3324808503,US +3324808504,3324808511,ES +3324808512,3324808527,US +3324808528,3324808543,GB +3324808544,3324808567,US +3324808568,3324808575,IN +3324808576,3324808583,JM +3324808584,3324808599,US +3324808600,3324808607,CN +3324808608,3324808639,US +3324808640,3324808647,AU +3324808648,3324808663,US +3324808664,3324808671,BR +3324808672,3324808719,US +3324808720,3324808735,MX +3324808736,3324808759,CA +3324808760,3324808767,VN +3324808768,3324808775,US +3324808776,3324808783,CN +3324808784,3324808791,US +3324808792,3324808799,IN +3324808800,3324808831,CA +3324808832,3324808847,US +3324808848,3324808855,CA +3324808856,3324808863,SG +3324808864,3324808935,US +3324808936,3324808943,NL +3324808944,3324808951,US +3324808952,3324808959,GB +3324808960,3324809039,US +3324809040,3324809055,DK +3324809056,3324809087,US +3324809088,3324809119,NO +3324809120,3324809143,US +3324809144,3324809151,AU +3324809152,3324809167,BZ +3324809168,3324809175,AU +3324809176,3324809183,CN +3324809184,3324809191,US +3324809192,3324809199,NL +3324809200,3324809207,US +3324809208,3324809215,ES +3324809216,3324809231,US +3324809232,3324809247,NL +3324809248,3324809263,TR +3324809264,3324809279,GB +3324809280,3324809287,RO +3324809288,3324809295,US +3324809296,3324809303,JM +3324809304,3324809311,US +3324809312,3324809375,CA +3324809376,3324809391,BR +3324809392,3324809407,US +3324809408,3324809423,AR +3324809424,3324809439,ES +3324809440,3324809471,CA +3324809472,3324809519,US +3324809520,3324809535,AU +3324809536,3324809551,ES +3324809552,3324809583,US +3324809584,3324809599,CN +3324809600,3324809615,CA +3324809616,3324809663,US +3324809664,3324809695,CA +3324809696,3324809727,RU +3324809728,3324809743,US +3324809744,3324809759,NO +3324809760,3324809791,IN +3324809792,3324809807,AU +3324809808,3324809855,US +3324809856,3324809871,CN +3324809872,3324809903,US +3324809904,3324809911,CN +3324809912,3324809919,US +3324809920,3324809935,IN +3324809936,3324809967,US +3324809968,3324809983,BR +3324809984,3324809991,IN +3324809992,3324809999,US +3324810000,3324810015,JM +3324810016,3324810063,US +3324810064,3324810079,NL +3324810080,3324810087,US +3324810088,3324810095,AF +3324810096,3324810143,US +3324810144,3324810175,CA +3324810176,3324810231,US +3324810232,3324810239,CN +3324810240,3324810271,HK +3324810272,3324810359,US +3324810360,3324810367,IN +3324810368,3324810375,CA +3324810376,3324810391,US +3324810392,3324810399,BR +3324810400,3324810431,CN +3324810432,3324810447,IN +3324810448,3324810463,NL +3324810464,3324810471,US +3324810472,3324810479,PK +3324810480,3324810487,CN +3324810488,3324810495,US +3324810496,3324810511,IN +3324810512,3324810527,GB +3324810528,3324810607,US +3324810608,3324810623,RO +3324810624,3324810655,AE +3324810656,3324810687,IN +3324810688,3324810719,GB +3324810720,3324810727,CN +3324810728,3324810735,QA +3324810736,3324810751,TW +3324810752,3324810759,US +3324810760,3324810767,CA +3324810768,3324810783,US +3324810784,3324810791,CA +3324810792,3324810799,US +3324810800,3324810807,SG +3324810808,3324810823,US +3324810824,3324810831,CN +3324810832,3324810879,US +3324810880,3324810887,IL +3324810888,3324810895,US +3324810896,3324810903,IN +3324810904,3324810911,ZA +3324810912,3324810927,US +3324810928,3324810935,CA +3324810936,3324810943,ES +3324810944,3324810983,US +3324810984,3324811007,CN +3324811008,3324811023,US +3324811024,3324811039,CM +3324811040,3324811047,US +3324811048,3324811055,AU +3324811056,3324811079,US +3324811080,3324811087,CA +3324811088,3324811103,US +3324811104,3324811119,GB +3324811120,3324811127,CN +3324811128,3324811135,US +3324811136,3324811167,CN +3324811168,3324811199,CA +3324811200,3324811231,CN +3324811232,3324811263,GB +3324811264,3324811279,CN +3324811280,3324811295,US +3324811296,3324811303,SG +3324811304,3324811311,CN +3324811312,3324811335,US +3324811336,3324811343,BR +3324811344,3324811359,US +3324811360,3324811391,BR +3324811392,3324811399,US +3324811400,3324811407,GB +3324811408,3324811423,MY +3324811424,3324811439,US +3324811440,3324811447,VN +3324811448,3324811455,BR +3324811456,3324811471,RU +3324811472,3324811511,US +3324811512,3324811519,GB +3324811520,3324811535,US +3324811536,3324811543,CA +3324811544,3324811599,US +3324811600,3324811607,CN +3324811608,3324811615,TR +3324811616,3324811631,AU +3324811632,3324811647,NO +3324811648,3324811679,US +3324811680,3324811687,IN +3324811688,3324811695,CN +3324811696,3324811703,IN +3324811704,3324811711,VN +3324811712,3324811743,US +3324811744,3324811751,GB +3324811752,3324811759,IE +3324811760,3324811815,US +3324811816,3324811823,AU +3324811824,3324811831,US +3324811832,3324811839,CA +3324811840,3324811871,US +3324811872,3324811887,CA +3324811888,3324811895,IN +3324811896,3324811903,GB +3324811904,3324811911,AU +3324811912,3324811919,IL +3324811920,3324811935,US +3324811936,3324811951,IN +3324811952,3324811967,RU +3324811968,3324811983,US +3324811984,3324811999,CN +3324812000,3324812015,CM +3324812016,3324812023,SG +3324812024,3324812031,MX +3324812032,3324812047,CN +3324812048,3324812079,US +3324812080,3324812095,TR +3324812096,3324812119,US +3324812120,3324812127,TR +3324812128,3324812143,US +3324812144,3324812151,NO +3324812152,3324812191,US +3324812192,3324812207,CN +3324812208,3324812215,IN +3324812216,3324812231,US +3324812232,3324812239,ES +3324812240,3324812247,CA +3324812248,3324812255,GB +3324812256,3324812279,US +3324812280,3324812287,CA +3324812288,3324813311,US +3324813312,3324815383,CN +3324815384,3324815559,US +3324815560,3324815583,CN +3324815584,3324815751,US +3324815752,3324815775,CN +3324815776,3324815871,US +3324815872,3324816207,CN +3324816208,3324816215,US +3324816216,3324817927,CN +3324817928,3324818087,US +3324818088,3324818095,CN +3324818096,3324818127,US +3324818128,3324818135,CN +3324818136,3324818159,US +3324818160,3324818207,CN +3324818208,3324818319,US +3324818320,3324818335,CN +3324818336,3324818431,US +3324818432,3324818455,CN +3324818456,3324818463,US +3324818464,3324820487,CN +3324820488,3324820623,US +3324820624,3324820655,CN +3324820656,3324820687,US +3324820688,3324820719,CN +3324820720,3324822015,US +3324822016,3324822527,CA +3324822528,3324824575,US +3324824576,3324824831,DE +3324824832,3324937087,US +3324937088,3324937095,BD +3324937096,3324937103,KH +3324937104,3324937999,US +3324938000,3324938007,PK +3324938008,3324938159,US +3324938160,3324938167,GB +3324938168,3324939415,US +3324939416,3324939423,RO +3324939424,3324939455,US +3324939456,3324939519,IL +3324939520,3324939735,US +3324939736,3324939739,CA +3324939740,3324942855,US +3324942856,3324942863,RO +3324942864,3324943047,US +3324943048,3324943055,CA +3324943056,3324943215,US +3324943216,3324943231,GB +3324943232,3324953087,US +3324953088,3324953151,EE +3324953152,3324954367,US +3324954368,3324954431,EE +3324954432,3324954495,US +3324954496,3324954559,EE +3324954560,3324956223,US +3324956224,3324956255,IN +3324956256,3324957759,US +3324957760,3324957823,EE +3324957824,3324963579,US +3324963580,3324963583,RO +3324963584,3324963839,US +3324963840,3324963903,NL +3324963904,3324964031,US +3324964032,3324964095,EE +3324964096,3324964159,US +3324964160,3324964223,EE +3324964224,3324964939,US +3324964940,3324964943,GB +3324964944,3324964963,US +3324964964,3324964967,GB +3324964968,3324980223,US +3324980224,3324981247,CA +3324981248,3325034495,US +3325034496,3325035519,NZ +3325035520,3325067263,US +3325067264,3325100287,CA +3325100288,3325100543,US +3325101056,3325117311,US +3325117312,3325117319,AF +3325117320,3325119887,US +3325119888,3325119903,MX +3325119904,3325120076,US +3325120077,3325120081,MX +3325120082,3325120423,US +3325120424,3325120431,IN +3325120432,3325122559,US +3325122560,3325123071,CA +3325123072,3325128703,US +3325128704,3325129215,TH +3325129216,3325131775,US +3325131776,3325132031,AU +3325132032,3325132799,US +3325132800,3325133823,CO +3325133824,3325134335,BR +3325134336,3325136127,US +3325136128,3325136383,CA +3325136384,3325142015,US +3325142016,3325142271,CR +3325142272,3325144831,US +3325144832,3325145087,CA +3325145088,3325169663,US +3325169664,3325171711,AR +3325171712,3325190143,US +3325190144,3325191687,CA +3325191688,3325191695,US +3325191696,3325198367,CA +3325198368,3325198375,MY +3325198376,3325198415,CA +3325198416,3325198419,VE +3325198420,3325198423,US +3325198424,3325198559,CA +3325198560,3325198575,PA +3325198576,3325198579,CA +3325198580,3325198583,BR +3325198584,3325198587,CA +3325198588,3325198591,US +3325198592,3325198619,CA +3325198620,3325198623,AR +3325198624,3325198627,ES +3325198628,3325198639,CA +3325198640,3325198643,BR +3325198644,3325198647,BD +3325198648,3325198655,CA +3325198656,3325198659,PE +3325198660,3325198695,CA +3325198696,3325198703,IL +3325198704,3325198719,US +3325198720,3325198727,CA +3325198728,3325198735,FR +3325198736,3325198751,CA +3325198752,3325198755,LK +3325198756,3325198759,US +3325198760,3325198779,CA +3325198780,3325198783,MX +3325198784,3325198811,CA +3325198812,3325198815,US +3325198816,3325198823,DE +3325198824,3325198831,CA +3325198832,3325198847,US +3325198848,3325198855,HR +3325198856,3325198863,ID +3325198864,3325198895,CA +3325198896,3325198911,BE +3325198912,3325198943,NP +3325198944,3325198947,AU +3325198948,3325198967,CA +3325198968,3325198975,US +3325198976,3325199039,CA +3325199040,3325199043,US +3325199044,3325199055,CA +3325199056,3325199063,US +3325199064,3325199071,CA +3325199072,3325199079,US +3325199080,3325199143,CA +3325199144,3325199147,US +3325199148,3325199151,GT +3325199152,3325199255,CA +3325199256,3325199259,BR +3325199260,3325199291,CA +3325199292,3325199295,US +3325199296,3325199303,BR +3325199304,3325199315,CA +3325199316,3325199319,AU +3325199320,3325199343,CA +3325199344,3325199351,CH +3325199352,3325199359,US +3325199360,3325199391,CA +3325199392,3325199399,US +3325199400,3325199491,CA +3325199492,3325199495,BR +3325199496,3325199559,CA +3325199560,3325199567,US +3325199568,3325199615,CA +3325199616,3325199619,BR +3325199620,3325199623,CA +3325199624,3325199627,BE +3325199628,3325199775,CA +3325199776,3325199779,BR +3325199780,3325199783,US +3325199784,3325199807,CA +3325199808,3325199839,US +3325199840,3325199855,BR +3325199856,3325199903,CA +3325199904,3325199911,IN +3325199912,3325199923,CA +3325199924,3325199927,US +3325199928,3325199931,CA +3325199932,3325199935,CN +3325199936,3325199947,CA +3325199948,3325199951,BR +3325199952,3325199959,PT +3325199960,3325199967,CA +3325199968,3325199983,BZ +3325199984,3325199991,GB +3325199992,3325200063,CA +3325200064,3325200071,US +3325200072,3325200079,CA +3325200080,3325200083,US +3325200084,3325200087,CA +3325200088,3325200091,ES +3325200092,3325200095,CA +3325200096,3325200111,BE +3325200112,3325200127,CA +3325200128,3325200191,BD +3325200192,3325200239,CA +3325200240,3325200255,US +3325200256,3325200259,PE +3325200260,3325200279,CA +3325200280,3325200287,NL +3325200288,3325200291,CA +3325200292,3325200295,FR +3325200296,3325200303,IN +3325200304,3325200311,CA +3325200312,3325200315,IN +3325200316,3325200323,CA +3325200324,3325200327,IL +3325200328,3325200447,CA +3325200448,3325200451,AR +3325200452,3325200455,CA +3325200456,3325200459,US +3325200460,3325200463,CA +3325200464,3325200471,US +3325200472,3325200527,CA +3325200528,3325200543,MX +3325200544,3325200567,CA +3325200568,3325200571,US +3325200572,3325200575,UA +3325200576,3325200583,CA +3325200584,3325200591,IN +3325200592,3325200595,CA +3325200596,3325200599,BR +3325200600,3325200695,CA +3325200696,3325200699,BD +3325200700,3325200727,CA +3325200728,3325200731,US +3325200732,3325200739,CA +3325200740,3325200747,US +3325200748,3325200751,CA +3325200752,3325200759,GB +3325200760,3325200767,CA +3325200768,3325200783,US +3325200784,3325200807,CA +3325200808,3325200811,TR +3325200812,3325200815,IE +3325200816,3325200827,CA +3325200828,3325200831,CO +3325200832,3325200863,BA +3325200864,3325200879,ES +3325200880,3325200891,CA +3325200892,3325200895,US +3325200896,3325200939,CA +3325200940,3325200943,US +3325200944,3325200947,CA +3325200948,3325200951,BZ +3325200952,3325201011,CA +3325201012,3325201015,US +3325201016,3325201039,CA +3325201040,3325201047,BR +3325201048,3325201055,US +3325201056,3325201071,CA +3325201072,3325201075,US +3325201076,3325201087,CA +3325201088,3325201103,ID +3325201104,3325201111,US +3325201112,3325201115,CA +3325201116,3325201119,IN +3325201120,3325201187,CA +3325201188,3325201191,BR +3325201192,3325201247,CA +3325201248,3325201255,CL +3325201256,3325201259,AU +3325201260,3325201427,CA +3325201428,3325201431,US +3325201432,3325201439,CA +3325201440,3325201447,IN +3325201448,3325201531,CA +3325201532,3325201535,US +3325201536,3325201551,CA +3325201552,3325201559,US +3325201560,3325201563,IN +3325201564,3325201591,CA +3325201592,3325201599,PT +3325201600,3325201603,CA +3325201604,3325201615,US +3325201616,3325201627,CA +3325201628,3325201631,US +3325201632,3325201647,CA +3325201648,3325201655,US +3325201656,3325201663,ES +3325201664,3325201671,CO +3325201672,3325201739,CA +3325201740,3325201759,US +3325201760,3325201763,SA +3325201764,3325201795,CA +3325201796,3325201799,DM +3325201800,3325201811,CA +3325201812,3325201815,US +3325201816,3325201847,CA +3325201848,3325201851,BR +3325201852,3325201855,ES +3325201856,3325201919,BR +3325201920,3325202015,CA +3325202016,3325202031,ES +3325202032,3325202039,CA +3325202040,3325202079,US +3325202080,3325202115,CA +3325202116,3325202119,US +3325202120,3325202271,CA +3325202272,3325202275,GB +3325202276,3325202279,US +3325202280,3325202327,CA +3325202328,3325202331,AU +3325202332,3325202367,CA +3325202368,3325202371,PH +3325202372,3325202395,CA +3325202396,3325202399,IN +3325202400,3325204479,CA +3325204480,3325205503,US +3325205504,3325206428,CA +3325206429,3325206429,US +3325206430,3325206531,CA +3325206532,3325206535,CO +3325206536,3325206551,CA +3325206552,3325206555,US +3325206556,3325206559,CZ +3325206560,3325206591,IN +3325206592,3325206623,CA +3325206624,3325206624,RO +3325206625,3325206626,CA +3325206627,3325206627,RO +3325206628,3325206635,CA +3325206636,3325206639,ES +3325206640,3325206671,US +3325206672,3325206679,BR +3325206680,3325206683,CL +3325206684,3325206687,SE +3325206688,3325206719,US +3325206720,3325206799,CA +3325206800,3325206815,US +3325206816,3325206831,CA +3325206832,3325206839,US +3325206840,3325206847,BG +3325206848,3325206863,MX +3325206864,3325206879,CA +3325206880,3325206911,BA +3325206912,3325206915,BR +3325206916,3325206919,US +3325206920,3325206935,CA +3325206936,3325206943,HR +3325206944,3325207023,CA +3325207024,3325207039,US +3325207040,3325207043,CA +3325207044,3325207051,BR +3325207052,3325207055,US +3325207056,3325207059,GB +3325207060,3325207071,CA +3325207072,3325207103,MX +3325207104,3325207131,CA +3325207132,3325207135,US +3325207136,3325207167,BD +3325207168,3325207283,CA +3325207284,3325207287,US +3325207288,3325207379,CA +3325207380,3325207383,US +3325207384,3325207415,CA +3325207416,3325207423,US +3325207424,3325207439,UA +3325207440,3325207503,CA +3325207504,3325207519,US +3325207520,3325207591,CA +3325207592,3325207599,EC +3325207600,3325207699,CA +3325207700,3325207703,LU +3325207704,3325207775,CA +3325207776,3325207783,US +3325207784,3325207791,CA +3325207792,3325207795,GB +3325207796,3325207807,CA +3325207808,3325207935,US +3325207936,3325208063,CA +3325208064,3325208095,BS +3325208096,3325208119,CA +3325208120,3325208123,US +3325208124,3325208171,CA +3325208172,3325208175,BR +3325208176,3325208187,CA +3325208188,3325208191,IN +3325208192,3325208255,CA +3325208256,3325208327,US +3325208328,3325208363,CA +3325208364,3325208367,PA +3325208368,3325208375,US +3325208376,3325208383,BR +3325208384,3325208391,US +3325208392,3325208403,CA +3325208404,3325208415,US +3325208416,3325208487,CA +3325208488,3325208491,AE +3325208492,3325208495,US +3325208496,3325208499,IN +3325208500,3325208543,CA +3325208544,3325208547,US +3325208548,3325208643,CA +3325208644,3325208647,IN +3325208648,3325208747,CA +3325208748,3325208751,CZ +3325208752,3325208767,CA +3325208768,3325208783,US +3325208784,3325208791,CA +3325208792,3325208799,US +3325208800,3325208827,CA +3325208828,3325208831,EG +3325208832,3325208835,CO +3325208836,3325208939,CA +3325208940,3325208943,AU +3325208944,3325208947,BR +3325208948,3325208999,CA +3325209000,3325209003,AU +3325209004,3325209007,BR +3325209008,3325209023,CA +3325209024,3325209055,US +3325209056,3325209083,CA +3325209084,3325209087,US +3325209088,3325209091,CA +3325209092,3325209095,AR +3325209096,3325209099,CA +3325209100,3325209103,DM +3325209104,3325209151,CA +3325209152,3325209155,US +3325209156,3325209163,BZ +3325209164,3325209167,GB +3325209168,3325209183,CA +3325209184,3325209215,AR +3325209216,3325209231,CA +3325209232,3325209247,DE +3325209248,3325209295,CA +3325209296,3325209311,US +3325209312,3325209327,CA +3325209328,3325209343,US +3325209344,3325209359,RO +3325209360,3325209379,CA +3325209380,3325209383,CH +3325209384,3325209387,CA +3325209388,3325209407,US +3325209408,3325209411,GB +3325209412,3325209435,CA +3325209436,3325209439,NG +3325209440,3325209447,CA +3325209448,3325209451,MT +3325209452,3325209475,CA +3325209476,3325209479,US +3325209480,3325209483,GB +3325209484,3325209543,CA +3325209544,3325209551,US +3325209552,3325209567,CA +3325209568,3325209575,US +3325209576,3325209579,CA +3325209580,3325209583,US +3325209584,3325209639,CA +3325209640,3325209647,TR +3325209648,3325209655,CA +3325209656,3325209663,CH +3325209664,3325209679,US +3325209680,3325209695,CA +3325209696,3325209711,SN +3325209712,3325209727,CA +3325209728,3325209759,IE +3325209760,3325209767,GB +3325209768,3325209775,US +3325209776,3325209779,CA +3325209780,3325209783,ID +3325209784,3325209879,CA +3325209880,3325209887,BD +3325209888,3325209915,CA +3325209916,3325209919,FR +3325209920,3325209939,CA +3325209940,3325209943,US +3325209944,3325209951,CA +3325209952,3325209955,ID +3325209956,3325209959,CA +3325209960,3325209963,US +3325209964,3325209967,CA +3325209968,3325209983,US +3325209984,3325209987,DE +3325209988,3325209991,CA +3325209992,3325209995,US +3325209996,3325210011,CA +3325210012,3325210015,US +3325210016,3325210031,CA +3325210032,3325210039,FR +3325210040,3325210043,PK +3325210044,3325210047,BR +3325210048,3325210063,CA +3325210064,3325210067,BR +3325210068,3325210071,IE +3325210072,3325210351,CA +3325210352,3325210367,HK +3325210368,3325210399,CA +3325210400,3325210431,SE +3325210432,3325210435,IN +3325210436,3325210439,CA +3325210440,3325210447,PA +3325210448,3325210451,FR +3325210452,3325210455,ES +3325210456,3325210511,CA +3325210512,3325210519,GB +3325210520,3325210631,CA +3325210632,3325210635,US +3325210636,3325210639,FR +3325210640,3325210643,BR +3325210644,3325210647,US +3325210648,3325210663,CA +3325210664,3325210687,BR +3325210688,3325210703,CA +3325210704,3325210707,US +3325210708,3325210711,CA +3325210712,3325210719,IN +3325210720,3325210751,US +3325210752,3325210755,CA +3325210756,3325210759,PH +3325210760,3325210767,BR +3325210768,3325210771,AR +3325210772,3325210775,CA +3325210776,3325210779,US +3325210780,3325210787,CA +3325210788,3325210791,BR +3325210792,3325210799,US +3325210800,3325210815,AE +3325210816,3325210823,BR +3325210824,3325210847,CA +3325210848,3325210851,US +3325210852,3325210863,CA +3325210864,3325210879,US +3325210880,3325210951,CA +3325210952,3325210955,BR +3325210956,3325210959,VN +3325210960,3325210975,IN +3325210976,3325211071,CA +3325211072,3325211087,BD +3325211088,3325211091,US +3325211092,3325211095,CA +3325211096,3325211103,US +3325211104,3325211115,CA +3325211116,3325211119,BR +3325211120,3325211127,US +3325211128,3325211151,CA +3325211152,3325211155,IN +3325211156,3325211175,CA +3325211176,3325211183,US +3325211184,3325211235,CA +3325211236,3325211239,FR +3325211240,3325211279,CA +3325211280,3325211295,CN +3325211296,3325211299,US +3325211300,3325211411,CA +3325211412,3325211415,IN +3325211416,3325211419,CA +3325211420,3325211423,US +3325211424,3325211647,CA +3325211648,3325211807,US +3325211808,3325211839,CA +3325211840,3325211855,US +3325211856,3325211859,CL +3325211860,3325211863,CA +3325211864,3325211871,NO +3325211872,3325211883,CA +3325211884,3325211887,US +3325211888,3325211895,RO +3325211896,3325211967,CA +3325211968,3325211999,ES +3325212000,3325212007,US +3325212008,3325212063,CA +3325212064,3325212071,US +3325212072,3325212087,CA +3325212088,3325212091,BZ +3325212092,3325212095,US +3325212096,3325212119,CA +3325212120,3325212127,US +3325212128,3325212143,CA +3325212144,3325212151,US +3325212152,3325212155,MX +3325212156,3325212167,CA +3325212168,3325212171,BZ +3325212172,3325212175,IN +3325212176,3325212191,CA +3325212192,3325212199,AR +3325212200,3325212215,CA +3325212216,3325212223,HR +3325212224,3325212295,CA +3325212296,3325212303,IN +3325212304,3325212407,CA +3325212408,3325212411,PE +3325212412,3325212495,CA +3325212496,3325212503,FR +3325212504,3325212511,HU +3325212512,3325212515,CY +3325212516,3325212559,CA +3325212560,3325212575,BR +3325212576,3325212579,PE +3325212580,3325212583,CA +3325212584,3325212587,HN +3325212588,3325212591,BR +3325212592,3325212611,CA +3325212612,3325212615,BR +3325212616,3325212647,CA +3325212648,3325212655,US +3325212656,3325212719,CA +3325212720,3325212727,ID +3325212728,3325212731,RO +3325212732,3325212771,CA +3325212772,3325212775,US +3325212776,3325212927,CA +3325212928,3325212943,LK +3325212944,3325213023,CA +3325213024,3325213055,SE +3325213056,3325213071,US +3325213072,3325213087,NZ +3325213088,3325213103,CA +3325213104,3325213111,US +3325213112,3325213115,CA +3325213116,3325213119,US +3325213120,3325213227,CA +3325213228,3325213231,US +3325213232,3325213423,CA +3325213424,3325213431,US +3325213432,3325213435,CA +3325213436,3325213439,US +3325213440,3325213447,CA +3325213448,3325213451,BD +3325213452,3325213471,CA +3325213472,3325213479,IN +3325213480,3325213483,CA +3325213484,3325213487,VE +3325213488,3325213535,CA +3325213536,3325213543,TR +3325213544,3325213551,CA +3325213552,3325213555,ES +3325213556,3325213567,CA +3325213568,3325213571,IE +3325213572,3325213575,CA +3325213576,3325213591,IN +3325213592,3325213607,CA +3325213608,3325213615,US +3325213616,3325213631,CA +3325213632,3325213639,TR +3325213640,3325213655,CA +3325213656,3325213663,US +3325213664,3325213679,CA +3325213680,3325213687,BR +3325213688,3325213695,US +3325213696,3325213711,CA +3325213712,3325213715,AR +3325213716,3325213951,CA +3325213952,3325213983,BA +3325213984,3325214015,CA +3325214016,3325214063,US +3325214064,3325214071,CA +3325214072,3325214079,AE +3325214080,3325214095,CA +3325214096,3325214111,IN +3325214112,3325214143,CA +3325214144,3325214147,MA +3325214148,3325214151,CA +3325214152,3325214155,US +3325214156,3325214163,CA +3325214164,3325214167,BR +3325214168,3325214187,CA +3325214188,3325214191,US +3325214192,3325214255,CA +3325214256,3325214259,SA +3325214260,3325214263,US +3325214264,3325214375,CA +3325214376,3325214383,US +3325214384,3325214399,CA +3325214400,3325214403,PL +3325214404,3325214463,CA +3325214464,3325214479,AU +3325214480,3325214499,CA +3325214500,3325214503,PA +3325214504,3325214583,CA +3325214584,3325214591,US +3325214592,3325214623,CA +3325214624,3325214639,DE +3325214640,3325214667,CA +3325214668,3325214671,US +3325214672,3325214703,CA +3325214704,3325214719,AU +3325214720,3325214735,CA +3325214736,3325214739,US +3325214740,3325214783,CA +3325214784,3325214791,US +3325214792,3325214815,CA +3325214816,3325214819,US +3325214820,3325214823,IN +3325214824,3325214831,BR +3325214832,3325214999,CA +3325215000,3325215007,BZ +3325215008,3325215055,CA +3325215056,3325215059,IT +3325215060,3325215131,CA +3325215132,3325215135,BZ +3325215136,3325215175,CA +3325215176,3325215183,VI +3325215184,3325215203,CA +3325215204,3325215207,GB +3325215208,3325215211,FR +3325215212,3325215263,CA +3325215264,3325215279,BE +3325215280,3325215299,US +3325215300,3325215303,IN +3325215304,3325215319,CA +3325215320,3325215327,BR +3325215328,3325215335,CA +3325215336,3325215343,US +3325215344,3325215455,CA +3325215456,3325215459,US +3325215460,3325215467,CA +3325215468,3325215471,BR +3325215472,3325215475,ES +3325215476,3325215479,PE +3325215480,3325215495,CA +3325215496,3325215503,BR +3325215504,3325215611,CA +3325215612,3325215615,BR +3325215616,3325215667,CA +3325215668,3325215675,BR +3325215676,3325215719,CA +3325215720,3325215727,MX +3325215728,3325215731,CA +3325215732,3325215735,BR +3325215736,3325215743,CA +3325215744,3325215751,IN +3325215752,3325215759,CA +3325215760,3325215767,BR +3325215768,3325215807,CA +3325215808,3325215839,US +3325215840,3325215863,CA +3325215864,3325215871,BR +3325215872,3325215903,US +3325215904,3325215911,DE +3325215912,3325215915,IN +3325215916,3325215919,GB +3325215920,3325215927,US +3325215928,3325215931,CA +3325215932,3325215935,BR +3325215936,3325215951,CA +3325215952,3325215967,BE +3325215968,3325215983,CA +3325215984,3325215999,VE +3325216000,3325216007,CA +3325216008,3325216015,MX +3325216016,3325216023,CA +3325216024,3325216027,MX +3325216028,3325216031,CA +3325216032,3325216035,IN +3325216036,3325216043,CA +3325216044,3325216047,EG +3325216048,3325216063,CA +3325216064,3325216067,ES +3325216068,3325216071,CA +3325216072,3325216079,US +3325216080,3325216095,BR +3325216096,3325216115,CA +3325216116,3325216119,US +3325216120,3325216127,CA +3325216128,3325216159,MX +3325216160,3325216247,CA +3325216248,3325216251,BR +3325216252,3325216319,CA +3325216320,3325216327,US +3325216328,3325216359,CA +3325216360,3325216363,GB +3325216364,3325216367,CA +3325216368,3325216383,US +3325216384,3325216399,CA +3325216400,3325216415,BR +3325216416,3325216447,CA +3325216448,3325216463,FR +3325216464,3325216527,CA +3325216528,3325216531,US +3325216532,3325216707,CA +3325216708,3325216711,US +3325216712,3325216855,CA +3325216856,3325216859,VG +3325216860,3325216895,CA +3325216896,3325216927,PA +3325216928,3325216975,CA +3325216976,3325216979,FR +3325216980,3325217167,CA +3325217168,3325217183,PE +3325217184,3325217199,CA +3325217200,3325217215,US +3325217216,3325217223,VE +3325217224,3325217227,AU +3325217228,3325217231,CA +3325217232,3325217235,US +3325217236,3325217243,CA +3325217244,3325217247,US +3325217248,3325217279,BA +3325217280,3325217307,CA +3325217308,3325217311,HK +3325217312,3325217403,CA +3325217404,3325217407,FR +3325217408,3325217471,CA +3325217472,3325217503,IE +3325217504,3325217527,CA +3325217528,3325217531,HK +3325217532,3325217651,CA +3325217652,3325217655,AE +3325217656,3325217663,CA +3325217664,3325217667,CO +3325217668,3325217695,CA +3325217696,3325217699,US +3325217700,3325217703,BR +3325217704,3325217707,US +3325217708,3325217711,CA +3325217712,3325217715,US +3325217716,3325217823,CA +3325217824,3325217831,BR +3325217832,3325217835,CA +3325217836,3325217839,CL +3325217840,3325217855,CA +3325217856,3325217887,BR +3325217888,3325217939,CA +3325217940,3325217943,US +3325217944,3325217951,CO +3325217952,3325217959,CA +3325217960,3325217963,US +3325217964,3325217971,CA +3325217972,3325217975,US +3325217976,3325217983,CA +3325217984,3325217987,US +3325217988,3325218015,CA +3325218016,3325218031,US +3325218032,3325218039,CA +3325218040,3325218047,US +3325218048,3325218131,CA +3325218132,3325218135,US +3325218136,3325218139,CA +3325218140,3325218147,GB +3325218148,3325218159,CA +3325218160,3325218167,US +3325218168,3325218207,CA +3325218208,3325218239,US +3325218240,3325218251,CA +3325218252,3325218255,PL +3325218256,3325218447,CA +3325218448,3325218455,AR +3325218456,3325218479,CA +3325218480,3325218483,BR +3325218484,3325218487,CA +3325218488,3325218491,US +3325218492,3325218519,CA +3325218520,3325218523,US +3325218524,3325218527,CA +3325218528,3325218531,BR +3325218532,3325218535,US +3325218536,3325218559,CA +3325218560,3325218567,US +3325218568,3325218583,CA +3325218584,3325218591,IN +3325218592,3325218615,CA +3325218616,3325218623,BR +3325218624,3325218663,CA +3325218664,3325218667,US +3325218668,3325218671,CA +3325218672,3325218687,IT +3325218688,3325218703,CA +3325218704,3325218719,US +3325218720,3325218783,CA +3325218784,3325218815,AU +3325218816,3325219079,CA +3325219080,3325219083,BR +3325219084,3325219087,BZ +3325219088,3325219091,CA +3325219092,3325219095,VE +3325219096,3325219175,CA +3325219176,3325219183,US +3325219184,3325219407,CA +3325219408,3325219411,FR +3325219412,3325219415,CA +3325219416,3325219419,US +3325219420,3325219423,BR +3325219424,3325219455,CA +3325219456,3325219459,US +3325219460,3325219463,BR +3325219464,3325219467,CA +3325219468,3325219471,DE +3325219472,3325219475,US +3325219476,3325219479,CA +3325219480,3325219483,IN +3325219484,3325219503,CA +3325219504,3325219511,VG +3325219512,3325219531,CA +3325219532,3325219535,BR +3325219536,3325219551,PK +3325219552,3325219583,CA +3325219584,3325219599,US +3325219600,3325219615,GB +3325219616,3325219631,CA +3325219632,3325219647,US +3325219648,3325219695,CA +3325219696,3325219699,US +3325219700,3325219759,CA +3325219760,3325219767,US +3325219768,3325219775,GB +3325219776,3325219779,PA +3325219780,3325219791,CA +3325219792,3325219799,UY +3325219800,3325219807,CA +3325219808,3325219811,US +3325219812,3325219839,CA +3325219840,3325219871,TN +3325219872,3325219875,BR +3325219876,3325219903,CA +3325219904,3325219931,US +3325219932,3325219935,CA +3325219936,3325219951,US +3325219952,3325219983,CA +3325219984,3325219999,US +3325220000,3325220011,CA +3325220012,3325220015,AU +3325220016,3325220027,CA +3325220028,3325220031,US +3325220032,3325220039,CA +3325220040,3325220043,US +3325220044,3325220047,BR +3325220048,3325220051,AU +3325220052,3325220055,CA +3325220056,3325220063,GB +3325220064,3325220107,CA +3325220108,3325220111,PE +3325220112,3325220295,CA +3325220296,3325220303,FR +3325220304,3325220407,CA +3325220408,3325220411,US +3325220412,3325220415,BZ +3325220416,3325220511,CA +3325220512,3325220519,BR +3325220520,3325220543,CA +3325220544,3325220559,US +3325220560,3325220579,CA +3325220580,3325220583,BZ +3325220584,3325220587,US +3325220588,3325220607,CA +3325220608,3325220623,US +3325220624,3325220635,CA +3325220636,3325220636,US +3325220637,3325220651,CA +3325220652,3325220655,BR +3325220656,3325220703,CA +3325220704,3325220719,US +3325220720,3325220831,CA +3325220832,3325220879,US +3325220880,3325220895,CA +3325220896,3325220927,FR +3325220928,3325220959,CA +3325220960,3325220967,EC +3325220968,3325221043,CA +3325221044,3325221047,CL +3325221048,3325221051,BR +3325221052,3325221055,CA +3325221056,3325221119,BR +3325221120,3325221183,CA +3325221184,3325221199,US +3325221200,3325221215,BR +3325221216,3325221263,CA +3325221264,3325221279,TW +3325221280,3325221439,CA +3325221440,3325221443,PE +3325221444,3325221451,CA +3325221452,3325221455,US +3325221456,3325221467,CA +3325221468,3325221471,BR +3325221472,3325221503,CA +3325221504,3325221535,PT +3325221536,3325221551,CA +3325221552,3325221555,PE +3325221556,3325221567,CA +3325221568,3325221575,AU +3325221576,3325221583,CA +3325221584,3325221599,US +3325221600,3325221615,CA +3325221616,3325221623,GB +3325221624,3325221627,MX +3325221628,3325221727,CA +3325221728,3325221731,US +3325221732,3325221739,CA +3325221740,3325221743,BR +3325221744,3325221751,CA +3325221752,3325221755,IN +3325221756,3325221759,PE +3325221760,3325221779,CA +3325221780,3325221783,US +3325221784,3325221787,BR +3325221788,3325221791,VN +3325221792,3325221795,CA +3325221796,3325221799,US +3325221800,3325221807,BR +3325221808,3325221831,CA +3325221832,3325221839,BG +3325221840,3325221903,CA +3325221904,3325221907,US +3325221908,3325221911,CA +3325221912,3325221915,ES +3325221916,3325221927,CA +3325221928,3325221931,IN +3325221932,3325221999,CA +3325222000,3325222015,CH +3325222016,3325222143,US +3325222144,3325222179,CA +3325222180,3325222183,US +3325222184,3325222203,CA +3325222204,3325222207,BY +3325222208,3325222351,CA +3325222352,3325222359,US +3325222360,3325222391,CA +3325222392,3325222395,TR +3325222396,3325222399,FR +3325222400,3325222463,US +3325222464,3325222567,CA +3325222568,3325222571,US +3325222572,3325222575,LK +3325222576,3325222607,CA +3325222608,3325222623,US +3325222624,3325222627,DE +3325222628,3325222643,CA +3325222644,3325222647,VN +3325222648,3325222651,LB +3325222652,3325222655,US +3325222656,3325222667,CA +3325222668,3325222671,MX +3325222672,3325222687,CA +3325222688,3325222703,GB +3325222704,3325222719,CA +3325222720,3325222735,AU +3325222736,3325222751,US +3325222752,3325222783,MX +3325222784,3325222843,CA +3325222844,3325222847,US +3325222848,3325222851,CA +3325222852,3325222855,BZ +3325222856,3325222947,CA +3325222948,3325222951,AE +3325222952,3325222963,CA +3325222964,3325222967,VE +3325222968,3325222983,CA +3325222984,3325222987,TW +3325222988,3325223027,CA +3325223028,3325223031,US +3325223032,3325223039,CA +3325223040,3325223043,AR +3325223044,3325223047,US +3325223048,3325223059,CA +3325223060,3325223063,PE +3325223064,3325223079,CA +3325223080,3325223083,US +3325223084,3325223087,BY +3325223088,3325223095,NL +3325223096,3325223099,CA +3325223100,3325223103,BR +3325223104,3325223119,US +3325223120,3325223231,CA +3325223232,3325223239,BR +3325223240,3325223279,CA +3325223280,3325223283,FR +3325223284,3325223303,CA +3325223304,3325223311,RO +3325223312,3325223335,CA +3325223336,3325223343,US +3325223344,3325223347,CA +3325223348,3325223351,IN +3325223352,3325223355,MX +3325223356,3325223375,CA +3325223376,3325223391,US +3325223392,3325223399,CA +3325223400,3325223407,US +3325223408,3325223427,CA +3325223428,3325223431,US +3325223432,3325223435,CA +3325223436,3325223439,MX +3325223440,3325223463,CA +3325223464,3325223471,US +3325223472,3325223535,CA +3325223536,3325223551,AT +3325223552,3325223583,IE +3325223584,3325223619,CA +3325223620,3325223631,BR +3325223632,3325223643,CA +3325223644,3325223647,CZ +3325223648,3325223663,KN +3325223664,3325223723,CA +3325223724,3325223727,US +3325223728,3325223795,CA +3325223796,3325223799,US +3325223800,3325223807,CA +3325223808,3325223811,HK +3325223812,3325223839,CA +3325223840,3325223843,PE +3325223844,3325223847,CA +3325223848,3325223855,MX +3325223856,3325223871,AU +3325223872,3325223907,CA +3325223908,3325223911,VE +3325223912,3325223919,CA +3325223920,3325223935,BR +3325223936,3325223967,CA +3325223968,3325223991,US +3325223992,3325224031,CA +3325224032,3325224039,US +3325224040,3325224043,CO +3325224044,3325224047,CA +3325224048,3325224055,GB +3325224056,3325224063,CA +3325224064,3325224067,FR +3325224068,3325224071,US +3325224072,3325224079,HR +3325224080,3325224087,CA +3325224088,3325224091,BZ +3325224092,3325224383,CA +3325224384,3325224391,GB +3325224392,3325224455,CA +3325224456,3325224463,FR +3325224464,3325224479,CA +3325224480,3325224511,US +3325224512,3325224551,CA +3325224552,3325224559,BR +3325224560,3325224647,CA +3325224648,3325224651,IN +3325224652,3325224671,CA +3325224672,3325224675,US +3325224676,3325224683,CA +3325224684,3325224687,VE +3325224688,3325224695,US +3325224696,3325224699,CA +3325224700,3325224703,BR +3325224704,3325224719,US +3325224720,3325224735,CA +3325224736,3325224751,LK +3325224752,3325224767,CA +3325224768,3325224783,FR +3325224784,3325224795,CA +3325224796,3325224799,HR +3325224800,3325224807,CA +3325224808,3325224815,GB +3325224816,3325224823,FR +3325224824,3325224831,CA +3325224832,3325224847,US +3325224848,3325224855,CA +3325224856,3325224863,MX +3325224864,3325224871,CA +3325224872,3325224875,IL +3325224876,3325224879,CA +3325224880,3325224895,US +3325224896,3325224919,CA +3325224920,3325224927,DJ +3325224928,3325224943,CA +3325224944,3325224947,DE +3325224948,3325224951,CA +3325224952,3325224955,GB +3325224956,3325225087,CA +3325225088,3325225095,US +3325225096,3325225103,IN +3325225104,3325225135,CA +3325225136,3325225139,US +3325225140,3325225203,CA +3325225204,3325225207,US +3325225208,3325225247,CA +3325225248,3325225263,TR +3325225264,3325225287,CA +3325225288,3325225291,GB +3325225292,3325225295,CA +3325225296,3325225299,US +3325225300,3325225315,CA +3325225316,3325225319,ES +3325225320,3325225367,CA +3325225368,3325225371,US +3325225372,3325225407,CA +3325225408,3325225411,IN +3325225412,3325225415,CA +3325225416,3325225419,AU +3325225420,3325225439,CA +3325225440,3325225455,HK +3325225456,3325225463,US +3325225464,3325225467,BR +3325225468,3325225483,CA +3325225484,3325225487,CL +3325225488,3325225495,CA +3325225496,3325225499,MX +3325225500,3325225631,CA +3325225632,3325225647,US +3325225648,3325225671,CA +3325225672,3325225675,US +3325225676,3325225727,CA +3325225728,3325225735,RO +3325225736,3325225743,US +3325225744,3325225775,CA +3325225776,3325225783,US +3325225784,3325225799,CA +3325225800,3325225807,IN +3325225808,3325225819,CA +3325225820,3325225823,US +3325225824,3325225899,CA +3325225900,3325225911,CY +3325225912,3325225915,CA +3325225916,3325225919,BR +3325225920,3325225923,EG +3325225924,3325225927,IN +3325225928,3325225943,CA +3325225944,3325225951,PL +3325225952,3325225967,MX +3325225968,3325225983,US +3325225984,3325226003,CA +3325226004,3325226007,MX +3325226008,3325226023,CA +3325226024,3325226027,FR +3325226028,3325226031,BR +3325226032,3325226039,HK +3325226040,3325226071,CA +3325226072,3325226075,BR +3325226076,3325226087,CA +3325226088,3325226091,EC +3325226092,3325226095,CA +3325226096,3325226099,PL +3325226100,3325226159,CA +3325226160,3325226167,FR +3325226168,3325226179,CA +3325226180,3325226183,BR +3325226184,3325226187,US +3325226188,3325226239,CA +3325226240,3325226255,US +3325226256,3325226287,CA +3325226288,3325226303,GB +3325226304,3325226307,CA +3325226308,3325226311,FR +3325226312,3325226315,DE +3325226316,3325226319,CA +3325226320,3325226323,IN +3325226324,3325226343,CA +3325226344,3325226347,IN +3325226348,3325226435,CA +3325226436,3325226439,MA +3325226440,3325226443,VN +3325226444,3325226447,CA +3325226448,3325226451,LT +3325226452,3325226455,CA +3325226456,3325226463,IN +3325226464,3325226495,CA +3325226496,3325227007,US +3325227008,3325227039,CA +3325227040,3325227071,BR +3325227072,3325227087,US +3325227088,3325227107,CA +3325227108,3325227111,AR +3325227112,3325227119,US +3325227120,3325227223,CA +3325227224,3325227227,GB +3325227228,3325227279,CA +3325227280,3325227295,BR +3325227296,3325227331,CA +3325227332,3325227335,US +3325227336,3325227371,CA +3325227372,3325227375,AU +3325227376,3325227383,CA +3325227384,3325227387,MA +3325227388,3325227391,CA +3325227392,3325227395,PK +3325227396,3325227399,CA +3325227400,3325227403,LK +3325227404,3325227455,CA +3325227456,3325227471,US +3325227472,3325227483,CA +3325227484,3325227487,IT +3325227488,3325227503,RO +3325227504,3325227519,CA +3325227520,3325227527,VG +3325227528,3325227539,CA +3325227540,3325227543,CZ +3325227544,3325227551,BD +3325227552,3325227555,BR +3325227556,3325227567,CA +3325227568,3325227571,IN +3325227572,3325227575,KE +3325227576,3325227583,US +3325227584,3325227587,CA +3325227588,3325227591,IN +3325227592,3325227599,CA +3325227600,3325227615,CY +3325227616,3325227627,CA +3325227628,3325227631,BZ +3325227632,3325227639,BR +3325227640,3325227791,CA +3325227792,3325227799,US +3325227800,3325227871,CA +3325227872,3325227875,BR +3325227876,3325227879,US +3325227880,3325227999,CA +3325228000,3325228015,IN +3325228016,3325228063,CA +3325228064,3325228159,US +3325228160,3325228175,AE +3325228176,3325228255,CA +3325228256,3325228263,US +3325228264,3325228287,CA +3325228288,3325228415,US +3325228416,3325228615,CA +3325228616,3325228623,US +3325228624,3325228675,CA +3325228676,3325228683,US +3325228684,3325228687,CA +3325228688,3325228691,BR +3325228692,3325228735,CA +3325228736,3325228739,FR +3325228740,3325228783,CA +3325228784,3325228787,US +3325228788,3325228807,CA +3325228808,3325228815,PL +3325228816,3325228823,CA +3325228824,3325228831,BR +3325228832,3325228863,US +3325228864,3325228871,CA +3325228872,3325228875,IN +3325228876,3325228931,CA +3325228932,3325228935,LU +3325228936,3325228991,CA +3325228992,3325229007,BR +3325229008,3325229071,CA +3325229072,3325229079,IN +3325229080,3325229083,CA +3325229084,3325229087,US +3325229088,3325229175,CA +3325229176,3325229183,IN +3325229184,3325229247,US +3325229248,3325229255,CA +3325229256,3325229263,BR +3325229264,3325229279,CA +3325229280,3325229295,US +3325229296,3325229311,FR +3325229312,3325229327,CA +3325229328,3325229331,US +3325229332,3325229351,CA +3325229352,3325229359,BR +3325229360,3325229411,CA +3325229412,3325229415,RU +3325229416,3325229459,CA +3325229460,3325229471,BR +3325229472,3325229487,US +3325229488,3325229499,CA +3325229500,3325229503,IN +3325229504,3325229511,CA +3325229512,3325229515,IN +3325229516,3325229519,CA +3325229520,3325229527,US +3325229528,3325229535,CA +3325229536,3325229551,FR +3325229552,3325229555,US +3325229556,3325229591,CA +3325229592,3325229599,US +3325229600,3325229615,CA +3325229616,3325229619,MX +3325229620,3325229627,CA +3325229628,3325229631,US +3325229632,3325229647,CA +3325229648,3325229663,FR +3325229664,3325229695,MX +3325229696,3325229747,CA +3325229748,3325229755,CY +3325229756,3325229795,CA +3325229796,3325229799,PA +3325229800,3325229815,CA +3325229816,3325229823,US +3325229824,3325229831,CA +3325229832,3325229835,US +3325229836,3325229855,CA +3325229856,3325229887,US +3325229888,3325229955,CA +3325229956,3325229959,US +3325229960,3325229975,CA +3325229976,3325229979,IN +3325229980,3325229983,BR +3325229984,3325229991,CA +3325229992,3325229999,IN +3325230000,3325230047,CA +3325230048,3325230055,AE +3325230056,3325230059,CA +3325230060,3325230071,US +3325230072,3325230079,CA +3325230080,3325230095,US +3325230096,3325230103,CA +3325230104,3325230111,US +3325230112,3325230123,CA +3325230124,3325230127,CL +3325230128,3325230135,CA +3325230136,3325230143,FR +3325230144,3325230167,CA +3325230168,3325230171,PK +3325230172,3325230175,US +3325230176,3325230319,CA +3325230320,3325230323,US +3325230324,3325230447,CA +3325230448,3325230455,US +3325230456,3325230495,CA +3325230496,3325230511,US +3325230512,3325230527,CA +3325230528,3325230543,MU +3325230544,3325230559,US +3325230560,3325230715,CA +3325230716,3325230719,AR +3325230720,3325230751,US +3325230752,3325230779,CA +3325230780,3325230783,BR +3325230784,3325230815,CA +3325230816,3325230847,GB +3325230848,3325230983,CA +3325230984,3325230991,US +3325230992,3325231007,FR +3325231008,3325231071,CA +3325231072,3325231079,US +3325231080,3325231095,CA +3325231096,3325231099,US +3325231100,3325231103,BR +3325231104,3325232127,US +3325233152,3325234175,US +3325234176,3325234431,SA +3325234432,3325249279,US +3325249280,3325249535,CO +3325249536,3325250303,US +3325250304,3325250559,CA +3325250560,3325256703,US +3325257216,3325257727,US +3325257728,3325258751,CA +3325258752,3325259775,US +3325259776,3325261311,CA +3325261312,3325265919,US +3325265920,3325266943,CA +3325266944,3325267711,US +3325267712,3325268735,SY +3325268736,3325269759,US +3325269760,3325270015,CA +3325270016,3325271039,US +3325271040,3325271295,CA +3325271296,3325281023,US +3325281024,3325281279,NZ +3325281280,3325284863,US +3325284864,3325285119,AU +3325285376,3325290239,US +3325290240,3325290495,CA +3325290496,3325296383,US +3325296384,3325296639,CA +3325296640,3325304319,US +3325304320,3325304575,AS +3325304576,3325304831,US +3325304832,3325305087,CA +3325305088,3325306111,US +3325306112,3325306367,BR +3325306368,3325307903,US +3325307904,3325308927,GB +3325308928,3325313023,CA +3325313024,3325323687,US +3325323688,3325323695,GB +3325323696,3325337599,US +3325337600,3325338111,GB +3325338112,3325340671,US +3325340672,3325340927,CA +3325340928,3325362175,US +3325362176,3325427711,CA +3325427712,3325427967,US +3325427968,3325430527,ZA +3325430528,3325431551,US +3325431552,3325443583,ZA +3325443584,3325444095,US +3325444096,3325448447,ZA +3325448448,3325448959,US +3325448960,3325450239,ZA +3325450240,3325451007,US +3325451008,3325451263,ZA +3325451264,3325452799,US +3325452800,3325453311,ZA +3325453312,3325454335,CA +3325454336,3325463807,US +3325463808,3325464063,ZA +3325464064,3325465087,NA +3325465088,3325466623,ZA +3325466624,3325467135,US +3325467136,3325469695,ZA +3325469696,3325469951,US +3325469952,3325470207,ZA +3325470208,3325471231,US +3325471232,3325471487,ZA +3325471488,3325471999,US +3325472000,3325474303,ZA +3325474304,3325474559,US +3325474560,3325478911,ZA +3325478912,3325479423,US +3325479424,3325481727,ZA +3325481728,3325481983,US +3325481984,3325483007,CA +3325483008,3325483775,US +3325483776,3325484287,ZA +3325484288,3325484799,US +3325484800,3325485055,ZA +3325485056,3325485311,US +3325485312,3325486591,ZA +3325486592,3325486847,US +3325486848,3325487359,ZA +3325487360,3325487615,US +3325487616,3325487871,ZA +3325487872,3325490943,US +3325490944,3325492991,ZA +3325492992,3325497343,US +3325497344,3325499903,PR +3325499904,3325505535,US +3325505536,3325509631,CA +3325509632,3325551615,US +3325551616,3325552639,CA +3325552640,3325573119,US +3325573120,3325574143,VG +3325574144,3325575167,BB +3325575168,3325630975,US +3325630976,3325631487,CA +3325631488,3325640703,US +3325640704,3325644799,CA +3325644800,3325689855,US +3325689856,3325690367,JM +3325690368,3325691647,US +3325691648,3325691903,CA +3325691904,3325693183,BR +3325693184,3325722623,US +3325722624,3325755391,CA +3325755392,3325956095,US +3325956096,3325960191,CA +3325960192,3325976063,US +3325976064,3325976319,CA +3325976320,3325980671,US +3325980672,3325980927,CA +3325980928,3325992447,US +3325992448,3325992959,CA +3325992960,3325993983,US +3325993984,3325994239,CA +3325994240,3325996799,US +3325996800,3325997055,CA +3325997056,3326325139,US +3326325140,3326325140,MZ +3326325141,3326390527,US +3326390528,3326390535,CA +3326390536,3326402111,US +3326402112,3326402119,PR +3326402120,3326406655,US +3326406656,3326408703,CO +3326408704,3326413823,US +3326413824,3326414335,YE +3326414336,3326420991,US +3326420992,3326423039,PR +3326423040,3326476495,US +3326476496,3326476503,GE +3326476504,3326492239,US +3326492240,3326492255,CA +3326492256,3326526463,US +3326526464,3326526719,CA +3326526720,3326613503,US +3326613504,3326615551,CA +3326615552,3326619647,US +3326619648,3326623743,CA +3326623744,3326631935,US +3326631936,3326640127,CA +3326640128,3326680831,US +3326680832,3326681087,CA +3326681088,3326681343,US +3326681344,3326682623,CA +3326682624,3326682879,US +3326682880,3326697215,CA +3326697216,3326699519,US +3326699520,3326699775,CA +3326699776,3326700799,US +3326700800,3326713343,CA +3326713344,3326714111,US +3326714112,3326716927,CA +3326716928,3326717951,US +3326717952,3326722047,CA +3326722048,3326726143,US +3326726144,3326726399,CA +3326726400,3326726655,US +3326726656,3326729215,CA +3326729216,3326729471,JP +3326729472,3326729727,CA +3326729728,3326734335,US +3326734336,3326734591,CA +3326734592,3326737151,US +3326737152,3326737663,CA +3326737664,3326737919,US +3326737920,3326738175,CA +3326738176,3326764863,US +3326764864,3326764871,GB +3326764872,3326768887,US +3326768888,3326768895,GB +3326768896,3326770863,US +3326770864,3326770871,GB +3326770872,3326952191,US +3326952192,3326952447,AS +3326952448,3326953983,US +3326953984,3326954495,AS +3326954496,3327144959,US +3327144960,3327145983,CA +3327145984,3327162367,US +3327162368,3327162623,GB +3327162624,3327162879,US +3327162880,3327163391,GB +3327163392,3327197183,US +3327197184,3327198207,JP +3327198208,3327199231,US +3327199232,3327200255,BR +3327200256,3327256831,US +3327256832,3327257087,GU +3327257088,3327397375,US +3327397376,3327397887,CA +3327397888,3327426559,US +3327426560,3327459327,CA +3327459328,3327723519,US +3327723520,3327725311,CA +3327725312,3327788543,US +3327788544,3327789055,CA +3327789056,3327806463,US +3327806464,3327811583,CA +3327811584,3327885311,US +3327885312,3327918079,CA +3327918080,3327995903,US +3327995904,3327996927,CW +3327996928,3328028671,US +3328028672,3328030719,CW +3328030720,3328180479,US +3328180480,3328181247,CA +3328181248,3328181759,US +3328181760,3328185855,CA +3328185856,3328186111,US +3328186112,3328187647,CA +3328187648,3328187903,US +3328187904,3328196351,CA +3328196352,3328196607,US +3328196608,3328202751,CA +3328202752,3328204799,US +3328204800,3328214783,CA +3328214784,3328215295,GB +3328215296,3328224255,CA +3328224256,3328224511,US +3328224512,3328235007,CA +3328235008,3328235519,US +3328235520,3328236543,CA +3328236544,3328237311,US +3328237312,3328241663,CA +3328241664,3328243199,US +3328243200,3328245759,CA +3328245760,3328249599,US +3328249600,3328249855,GB +3328249856,3328299775,US +3328299776,3328301055,CA +3328301056,3328306431,US +3328306432,3328306687,CA +3328306688,3328341215,US +3328341216,3328341223,CA +3328341224,3328342815,US +3328342816,3328342847,PK +3328342848,3328358399,US +3328358400,3328360447,CA +3328360448,3328383999,US +3328384000,3328385023,CA +3328385024,3328414719,US +3328414720,3328414975,CH +3328414976,3328420351,US +3328420352,3328420607,CA +3328420608,3328421119,US +3328421120,3328421375,HK +3328421376,3328432639,US +3328432640,3328433663,CA +3328433664,3328433919,CH +3328433920,3328475135,US +3328475136,3328477183,CA +3328477184,3328479231,US +3328479232,3328479623,CA +3328479624,3328479624,US +3328479625,3328481279,CA +3328481280,3328481535,US +3328481536,3328481759,CA +3328481760,3328481760,US +3328481761,3328482303,CA +3328482304,3328482815,US +3328482816,3328483327,CA +3328483328,3328515071,US +3328515072,3328516095,DM +3328516096,3328617983,US +3328617984,3328618239,CA +3328618240,3328629631,US +3328629632,3328629695,GB +3328629696,3328630015,US +3328630016,3328630271,CA +3328630272,3328630783,US +3328630784,3328631807,CA +3328631808,3328638975,US +3328638976,3328704511,CA +3328704512,3328774399,US +3328774400,3328775935,CA +3328775936,3328794623,US +3328795648,3328796671,US +3328798720,3328799743,NL +3328800000,3328800255,NL +3328800256,3328800767,IT +3328800768,3328801023,NZ +3328801024,3328801279,SE +3328801280,3328801791,CZ +3328801792,3328802047,US +3328802048,3328802303,DE +3328802304,3328802815,AU +3328802816,3328811007,US +3328811008,3328811263,CN +3328811264,3328811271,US +3328811272,3328811591,CN +3328811592,3328811599,US +3328811600,3328811711,CN +3328811712,3328811791,US +3328811792,3328811831,CN +3328811832,3328811855,US +3328811856,3328811863,CN +3328811864,3328811871,US +3328811872,3328812319,CN +3328812320,3328812335,US +3328812336,3328812527,CN +3328812528,3328812535,US +3328812536,3328812783,CN +3328812784,3328812799,US +3328812800,3328812847,CN +3328812848,3328812855,US +3328812856,3328813831,CN +3328813832,3328813839,US +3328813840,3328815471,CN +3328815472,3328815487,US +3328815488,3328816023,CN +3328816024,3328816031,US +3328816032,3328818439,CN +3328818440,3328818447,US +3328818448,3328819199,CN +3328819200,3328826623,US +3328826624,3328826879,SG +3328826880,3329230335,US +3329230336,3329230591,JP +3329230592,3329498623,US +3329498624,3329498879,ES +3329498880,3330613247,US +3330613248,3330614783,CA +3330614784,3330617087,US +3330617088,3330617343,CA +3330617344,3330621183,US +3330621184,3330623743,CA +3330623744,3330624255,US +3330624256,3330624511,CA +3330624512,3330625535,US +3330625536,3330627071,GB +3330627072,3330640895,US +3330640896,3330641151,CH +3330641152,3330646527,US +3330646528,3330647295,CA +3330647296,3330649599,US +3330649600,3330649855,CA +3330649856,3330662911,US +3330662912,3330663167,GB +3330663168,3330664191,US +3330664192,3330664447,CA +3330664448,3330677759,US +3330677760,3330678783,CA +3330678784,3330714367,US +3330714368,3330714623,CA +3330714624,3330726655,US +3330726656,3330726911,CA +3330726912,3330754559,US +3330754560,3330754815,CA +3330754816,3330763519,US +3330763520,3330763775,CA +3330763776,3330765823,US +3330765824,3330766335,CA +3330766336,3330771199,US +3330771200,3330771711,CH +3330771712,3330778879,US +3330778880,3330779135,GB +3330779136,3330785279,US +3330785280,3330785791,CA +3330785792,3330791423,US +3330791424,3330791679,CA +3330791680,3330796543,US +3330796544,3330796799,CA +3330796800,3330812927,US +3330812928,3330813951,CA +3330813952,3330814047,US +3330814048,3330814055,LK +3330814056,3330814719,US +3330814720,3330814727,PK +3330814728,3330814807,US +3330814808,3330814815,LK +3330814816,3330814831,US +3330814832,3330814839,LK +3330814840,3330814847,PK +3330814848,3330815743,US +3330815744,3330815999,IN +3330816000,3330817882,US +3330817883,3330817887,CL +3330817888,3330817899,ES +3330817900,3330866943,US +3330866944,3330867199,CA +3330867200,3330883583,US +3330883584,3330884351,NL +3330884352,3330884863,US +3330884864,3330885119,GB +3330885120,3330888063,US +3330888064,3330888127,NL +3330888128,3330888191,US +3330888192,3330888703,AU +3330888704,3330888959,US +3330888960,3330889215,CH +3330889216,3330889471,GB +3330889472,3330890239,JP +3330890240,3330890751,BE +3330890752,3330891263,GB +3330891264,3330892287,US +3330892288,3330892543,FR +3330892544,3330893567,US +3330893568,3330893823,NL +3330893824,3330894079,CA +3330894080,3330894591,GB +3330894592,3330894847,DE +3330894848,3330897919,US +3330897920,3330898175,CA +3330898176,3330898431,DE +3330898432,3330898943,FR +3330898944,3330904575,US +3330904576,3330904831,CA +3330904832,3331098111,US +3331098112,3331098367,CA +3331098368,3331102463,US +3331102464,3331102719,CA +3331102720,3331194879,US +3331194880,3331260415,AU +3331260416,3331269375,US +3331269376,3331269376,AU +3331269377,3331269631,US +3331269632,3331269632,IL +3331269633,3331270399,US +3331270400,3331270400,SG +3331270401,3331270655,US +3331270656,3331270656,IL +3331270657,3331271167,US +3331271168,3331271168,JP +3331271169,3331271679,US +3331271680,3331271680,JP +3331271681,3331271935,US +3331271936,3331271936,ES +3331271937,3331272959,US +3331272960,3331272960,IT +3331272961,3331273471,US +3331273472,3331273472,IL +3331273473,3331273727,US +3331273728,3331273983,AU +3331273984,3331273984,HK +3331273985,3331274239,US +3331274240,3331274240,SE +3331274241,3331274495,US +3331274496,3331274496,PL +3331274497,3331274751,US +3331274752,3331274752,BR +3331274753,3331275263,US +3331275264,3331275264,CH +3331275265,3331275775,US +3331275776,3331275776,CA +3331275777,3331356671,US +3331356672,3331357183,BZ +3331357184,3331358719,US +3331358720,3331362815,JP +3331362816,3331365199,CA +3331365200,3331365207,GB +3331365208,3331366911,CA +3331366912,3331371327,US +3331371328,3331371343,SE +3331371344,3331371519,US +3331371520,3331371583,EE +3331371584,3331371711,US +3331371712,3331371775,EE +3331371776,3331372287,US +3331372288,3331372319,FR +3331372320,3331527167,US +3331527168,3331527679,GB +3331527680,3331528959,US +3331528960,3331528991,CN +3331528992,3331529023,US +3331529024,3331529031,IN +3331529032,3331529039,LB +3331529040,3331529175,US +3331529176,3331529183,VE +3331529184,3331529215,CN +3331529216,3331529247,US +3331529248,3331529255,VE +3331529256,3331529375,US +3331529376,3331529383,IN +3331529384,3331529391,US +3331529392,3331529399,IN +3331529400,3331529599,US +3331529600,3331529727,EE +3331529728,3331530063,US +3331530064,3331530071,IN +3331530072,3331530079,US +3331530080,3331530111,PK +3331530112,3331530175,US +3331530176,3331530183,BR +3331530184,3331530191,MX +3331530192,3331530199,US +3331530200,3331530223,IN +3331530224,3331530231,US +3331530232,3331530239,LB +3331530240,3331563519,US +3331563520,3331563775,IN +3331563776,3331565567,US +3331565568,3331566079,CA +3331566080,3331617855,US +3331617856,3331617919,GB +3331617920,3331620079,US +3331620080,3331620095,GB +3331620096,3331620527,US +3331620528,3331620543,GB +3331620544,3331632639,US +3331632640,3331632895,CA +3331632896,3331633407,US +3331633408,3331633919,CH +3331633920,3331636479,US +3331636480,3331636735,AU +3331636736,3331637247,US +3331637248,3331638271,KR +3331638272,3331638783,AU +3331638784,3331647231,US +3331647232,3331647487,CA +3331647488,3331649279,US +3331649280,3331649535,CA +3331649536,3331818495,US +3331818496,3331818751,MX +3331818752,3331840111,US +3331840112,3331840115,CA +3331840116,3331935231,US +3331935232,3331935583,CA +3331935584,3331935615,US +3331935616,3331936255,CA +3331936256,3331983103,US +3331983104,3331983359,CA +3331983360,3331988479,US +3331988480,3331989503,CA +3331989504,3332001791,US +3332001792,3332002047,CA +3332002048,3332002063,US +3332002064,3332002071,CA +3332002072,3332002079,FI +3332002080,3332002111,CA +3332002112,3332002143,US +3332002144,3332002159,CA +3332002160,3332002215,US +3332002216,3332002223,CA +3332002224,3332002303,US +3332002304,3332002431,CA +3332002432,3332002495,US +3332002496,3332002559,CA +3332002560,3332002815,IN +3332002816,3332003711,US +3332003712,3332003839,IT +3332003840,3332004607,CA +3332004608,3332004671,US +3332004672,3332004863,CA +3332004864,3332005375,US +3332005376,3332005631,IN +3332005632,3332005632,CA +3332005633,3332005886,US +3332005887,3332005887,CA +3332005888,3332028415,US +3332028416,3332030463,CA +3332030464,3332423423,US +3332423424,3332423679,CA +3332423680,3332440319,US +3332440320,3332460543,CA +3332460544,3332460799,US +3332460800,3332461311,CA +3332461312,3332461567,US +3332461568,3332462335,CA +3332462336,3332462591,US +3332462592,3332473855,CA +3332473856,3332477951,US +3332477952,3332482303,CA +3332482304,3332483071,US +3332483072,3332483615,CO +3332483616,3332483711,US +3332483712,3332483743,PE +3332483744,3332483839,US +3332483840,3332484095,BO +3332484096,3332491263,CA +3332491264,3332492031,US +3332492032,3332500735,CA +3332500736,3332500991,US +3332500992,3332501247,CA +3332501248,3332501503,US +3332501504,3332503039,CA +3332503040,3332503551,US +3332503552,3332505343,CA +3332505344,3332505855,US +3332505856,3332508671,CA +3332508672,3332508927,US +3332508928,3332525311,CA +3332525312,3332525574,US +3332525575,3332525575,CA +3332525576,3332526079,US +3332526080,3332526591,CA +3332526592,3332527103,US +3332527104,3332528127,CA +3332528128,3332529663,US +3332529664,3332554751,CA +3332554752,3332558847,US +3332558848,3332562943,CA +3332562944,3332563455,US +3332563456,3332564479,CA +3332564480,3332564735,US +3332564736,3332566783,CA +3332566784,3332567039,US +3332567040,3332570879,CA +3332570880,3332571391,US +3332571392,3332579327,CA +3332579328,3332581375,US +3332581376,3332590079,CA +3332590080,3332590591,US +3332590592,3332594687,CA +3332594688,3332594943,US +3332594944,3332595455,CA +3332595456,3332595711,US +3332595712,3332610559,CA +3332610560,3332611071,US +3332611072,3332611327,CA +3332611328,3332611583,US +3332611584,3332616191,CA +3332616192,3332616959,US +3332616960,3332617727,CA +3332617728,3332624383,US +3332624384,3332636415,CA +3332636416,3332636671,US +3332636672,3332724735,CA +3332724736,3332726783,PM +3332726784,3332737023,CA +3332737024,3332738047,PM +3332738048,3332744191,CA +3332744192,3332745215,PM +3332745216,3332752127,CA +3332752128,3332752383,PM +3332752384,3332833279,CA +3332833280,3332833535,US +3332833536,3332841471,CA +3332841472,3332841727,US +3332841728,3332866303,CA +3332866304,3332874239,US +3332874240,3332875007,CA +3332875008,3332875263,US +3332875264,3332876287,CA +3332876288,3332882431,US +3332882432,3332890623,KN +3332890624,3332897279,US +3332897280,3332898815,CA +3332898816,3332899071,US +3332899072,3332906495,CA +3332906496,3332909567,US +3332909568,3332909823,CA +3332909824,3332910079,US +3332910080,3332922879,CA +3332922880,3332923391,US +3332923392,3332925695,CA +3332925696,3332927487,US +3332928512,3332929023,US +3332929024,3332930047,CA +3332930560,3332931327,US +3332931328,3332947967,CA +3332947968,3332948223,US +3332948224,3332964351,CA +3332964352,3332964607,US +3332964608,3332966143,CA +3332966144,3332966399,US +3332966400,3332979967,CA +3332979968,3332980735,US +3332980736,3332988927,CA +3332988928,3332989951,US +3332989952,3332997119,CA +3332997120,3332997375,US +3332997376,3333008383,CA +3333008384,3333008895,US +3333008896,3333012479,CA +3333012480,3333012991,US +3333012992,3333014015,CA +3333014016,3333014527,US +3333014528,3333017599,CA +3333017600,3333018111,US +3333018112,3333023231,CA +3333023232,3333025279,US +3333025280,3333029631,CA +3333029632,3333385983,US +3333385984,3333386239,JP +3333386240,3333396223,US +3333396224,3333396479,JP +3333396480,3333396673,US +3333396674,3333396674,DE +3333396675,3333427967,US +3333427968,3333428223,GB +3333428224,3333444607,US +3333444608,3333444863,SG +3333444864,3333471999,US +3333472000,3333472255,NL +3333472256,3333480191,US +3333480192,3333481471,DE +3333481472,3333502975,US +3333502976,3333503359,CN +3333503360,3333503391,US +3333503392,3333504271,CN +3333504272,3333504287,US +3333504288,3333504431,CN +3333504432,3333504447,US +3333504448,3333505023,CN +3333505024,3333519359,US +3333519360,3333519871,HK +3333519872,3333520383,US +3333520384,3333520639,NL +3333520640,3333520895,DE +3333520896,3333583871,US +3333583872,3333584895,CA +3333584896,3333593855,US +3333593856,3333594111,CA +3333594112,3333609983,US +3333609984,3333610239,SG +3333610240,3333614591,US +3333614592,3333614847,GB +3333614848,3333621503,US +3333621504,3333621759,CA +3333621760,3333624319,US +3333624320,3333624575,CA +3333624576,3333675775,US +3333675776,3333676031,CA +3333676032,3333677311,US +3333677312,3333677567,HK +3333677568,3333701887,US +3333701888,3333702143,GB +3333702144,3333702399,US +3333702400,3333702655,CH +3333702656,3333705727,US +3333705728,3333709567,GB +3333709568,3333710591,US +3333710592,3333710847,IT +3333710848,3333711359,GB +3333711360,3333712127,DE +3333712128,3333712383,CH +3333712384,3333712639,DE +3333712640,3333716223,US +3333716224,3333716735,CA +3333716736,3333716991,GB +3333716992,3333717247,AU +3333717248,3333717503,FR +3333717504,3333717759,SG +3333717760,3333718015,NL +3333718016,3333721599,US +3333721600,3333721855,JP +3333721856,3333781503,US +3333781504,3333783551,CA +3333783552,3333801727,US +3333801728,3333801983,CA +3333801984,3333829631,US +3333829632,3333830143,IN +3333830144,3333859839,US +3333859840,3333860095,BM +3333860096,3333871103,US +3333871104,3333871359,CA +3333871360,3333939455,US +3333939456,3333939711,CA +3333939712,3333988607,US +3333988608,3333988863,BR +3333988864,3333997823,US +3333997824,3333998079,CA +3333998080,3334006527,US +3334006528,3334006783,NL +3334006784,3334020095,US +3334020096,3334021119,CA +3334021120,3334068479,US +3334068480,3334068735,CA +3334068736,3334138623,US +3334138624,3334138879,BM +3334138880,3334187775,US +3334187776,3334188031,BM +3334188032,3334932223,US +3334932224,3334932479,CA +3334932480,3334934015,US +3334934016,3334934527,CA +3334934528,3334962175,US +3334962176,3334963199,NL +3334963200,3334995967,US +3334995968,3334998527,PH +3334998528,3335004159,US +3335004160,3335004183,CN +3335004184,3335004223,US +3335004224,3335004319,CN +3335004320,3335004327,US +3335004328,3335004335,CN +3335004336,3335004351,US +3335004352,3335004463,CN +3335004464,3335004479,US +3335004480,3335004487,CN +3335004488,3335004495,US +3335004496,3335004503,CN +3335004504,3335004511,US +3335004512,3335004551,CN +3335004552,3335004559,US +3335004560,3335004623,CN +3335004624,3335004639,US +3335004640,3335005311,CN +3335005312,3335005327,US +3335005328,3335005423,CN +3335005424,3335005455,US +3335005456,3335005487,CN +3335005488,3335005503,US +3335005504,3335005519,CN +3335005520,3335005527,US +3335005528,3335005543,CN +3335005544,3335005551,US +3335005552,3335005647,CN +3335005648,3335005663,US +3335005664,3335005759,CN +3335005760,3335005823,US +3335005824,3335008071,CN +3335008072,3335008079,US +3335008080,3335008127,CN +3335008128,3335008255,US +3335008256,3335009175,CN +3335009176,3335009183,US +3335009184,3335009215,CN +3335009216,3335009279,US +3335009280,3335010175,CN +3335010176,3335010239,US +3335010240,3335012351,CN +3335012352,3335028735,CA +3335028736,3335057919,US +3335057920,3335058175,CA +3335058176,3335160319,US +3335160320,3335160575,CA +3335160576,3335252735,US +3335252736,3335252991,CA +3335252992,3335276287,US +3335276288,3335276799,PR +3335276800,3335277311,US +3335277312,3335277567,FR +3335277568,3335278079,US +3335278080,3335278335,JP +3335278336,3335349343,US +3335349344,3335349367,FR +3335349368,3335349368,US +3335349369,3335349375,FR +3335349376,3335352463,US +3335352464,3335352479,CA +3335352480,3335352783,US +3335352784,3335352799,AU +3335352800,3335353855,US +3335353856,3335353863,AU +3335353864,3335354015,US +3335354016,3335354023,AU +3335354024,3335354031,US +3335354032,3335354047,AU +3335354048,3335354111,US +3335354112,3335354143,CN +3335354144,3335354179,AU +3335354180,3335354183,CA +3335354184,3335354191,US +3335354192,3335354195,AU +3335354196,3335354431,US +3335354432,3335354463,AU +3335354464,3335354751,US +3335354752,3335354783,CN +3335354784,3335429631,US +3335429632,3335430143,CA +3335430144,3335439615,US +3335439616,3335439871,CH +3335439872,3335440383,US +3335440384,3335441151,CH +3335441152,3335456767,US +3335458816,3335460863,BM +3335460864,3335475199,US +3335475200,3335475455,DE +3335475456,3335480191,US +3335480192,3335480319,IT +3335480320,3335524351,US +3335524352,3335524607,AU +3335524608,3335559680,US +3335559681,3335559935,IE +3335559936,3335564151,US +3335564152,3335564155,TH +3335564156,3335573759,US +3335573760,3335574015,IN +3335574016,3335665252,US +3335665253,3335665342,TH +3335665343,3335719071,US +3335719072,3335719087,IN +3335719088,3335747071,US +3335747072,3335749631,NL +3335749632,3335784191,US +3335784192,3335784447,CA +3335784448,3335860991,US +3335860992,3335861247,MX +3335861248,3336139775,US +3336139776,3336140799,CA +3336140800,3336854015,US +3336854016,3336854271,CO +3336854272,3336990719,US +3336990720,3336990975,CA +3336990976,3336991231,US +3336991232,3336991487,CA +3336991488,3336993023,US +3336993024,3336993535,CA +3336993536,3336993791,US +3336993792,3336994047,CA +3336994048,3337030655,US +3337030656,3337030911,GB +3337030912,3337044479,US +3337044480,3337044735,CA +3337044736,3337044991,US +3337044992,3337046015,CA +3337046016,3337046527,US +3337046528,3337047551,CA +3337047552,3337050111,US +3337050112,3337051647,CA +3337051648,3337051903,US +3337051904,3337052159,CA +3337052160,3337053183,US +3337053184,3337053695,CA +3337053696,3337055231,US +3337055232,3337060351,CA +3337060352,3337106431,US +3337106432,3337106687,DE +3337106688,3337106943,SG +3337106944,3337107199,HK +3337107200,3337107455,AU +3337107456,3337107711,JP +3337107712,3337107967,GB +3337107968,3337198367,US +3337198368,3337198399,CA +3337198400,3337198703,US +3337198704,3337198707,CA +3337198708,3337201727,US +3337201728,3337201735,CA +3337201736,3337201767,US +3337201768,3337201775,CA +3337201776,3337201791,US +3337201792,3337201823,CA +3337201824,3337209375,US +3337209376,3337209383,CA +3337209384,3337217791,US +3337217792,3337218047,CA +3337218048,3337289983,US +3337289984,3337297919,CA +3337297920,3337302015,US +3337302016,3337303551,CA +3337303552,3337304063,US +3337304064,3337322495,CA +3337322496,3337322751,US +3337322752,3337323007,CA +3337323008,3337324543,US +3337324544,3337335295,CA +3337335296,3337335807,US +3337335808,3337341951,CA +3337341952,3337342463,US +3337342464,3337355007,CA +3337355008,3337650175,US +3337650176,3337650687,GB +3337650688,3337651199,US +3337651200,3337651455,CH +3337651456,3337651711,SG +3337651712,3337653503,CH +3337653504,3337653759,JP +3337653760,3337654783,CH +3337654784,3337655039,AU +3337655040,3337682943,CH +3337682944,3337882111,US +3337882112,3337882623,AU +3337882624,3337891839,US +3337891840,3337892127,IN +3337892128,3337892159,US +3337892160,3337892255,IN +3337892256,3337892351,US +3337892352,3337892607,CN +3337892608,3337892671,HK +3337892672,3337893119,US +3337893120,3337893375,CN +3337893376,3337893631,CA +3337893632,3337893887,IN +3337893888,3337894143,CN +3337894144,3337894399,US +3337894400,3337894463,IN +3337894464,3337894527,US +3337894528,3337894655,IN +3337894656,3337894719,CN +3337894720,3337894783,US +3337894784,3337894911,CN +3337894912,3337895167,IN +3337895168,3337895295,CN +3337895296,3337895551,US +3337895552,3337895615,CN +3337895616,3337895679,US +3337895680,3337895935,CN +3337895936,3337900031,PR +3337900032,3337957375,US +3337957376,3337959423,CA +3337959424,3337960447,US +3337960448,3337961471,CA +3337961472,3337961487,US +3337961488,3337961495,CA +3337961496,3337961519,US +3337961520,3337961527,RO +3337961528,3337961535,US +3337961536,3337961551,LT +3337961552,3337961559,KZ +3337961560,3337961567,ID +3337961568,3337961575,PK +3337961576,3337961583,AZ +3337961584,3337961591,US +3337961592,3337961599,LT +3337961600,3337961615,RO +3337961616,3337961623,CA +3337961624,3337961631,US +3337961632,3337961663,GB +3337961664,3337961687,CA +3337961688,3337961695,US +3337961696,3337961983,CA +3337961984,3337961999,US +3337962000,3337962007,CA +3337962008,3337962015,US +3337962016,3337962047,CA +3337962048,3337962111,US +3337962112,3337962143,CA +3337962144,3337962151,US +3337962152,3337962167,CA +3337962168,3337962175,US +3337962176,3337962215,CA +3337962216,3337962223,US +3337962224,3337962239,CA +3337962240,3337962327,US +3337962328,3337962335,CA +3337962336,3337962431,US +3337962432,3337962511,CA +3337962512,3337962519,US +3337962520,3337962599,CA +3337962600,3337962623,US +3337962624,3337962799,CA +3337962800,3337962807,US +3337962808,3337962831,CA +3337962832,3337962943,US +3337962944,3337962951,CA +3337962952,3337962959,NO +3337962960,3337962967,CA +3337962968,3337962975,US +3337962976,3337962983,CA +3337962984,3337962991,US +3337962992,3337963071,CA +3337963072,3337963167,US +3337963168,3337963271,CA +3337963272,3337963279,US +3337963280,3337963295,CA +3337963296,3337963311,US +3337963312,3337963319,CA +3337963320,3337963327,US +3337963328,3337963335,CA +3337963336,3337963343,US +3337963344,3337963359,CA +3337963360,3337963399,US +3337963400,3337963423,CA +3337963424,3337963439,US +3337963440,3337963447,CA +3337963448,3337963455,US +3337963456,3337963487,CA +3337963488,3337963495,US +3337963496,3337963535,CA +3337963536,3337963631,US +3337963632,3337963647,CA +3337963648,3337963743,US +3337963744,3337963759,CA +3337963760,3337963767,US +3337963768,3337963775,CA +3337963776,3337963783,AZ +3337963784,3337963791,US +3337963792,3337963799,AZ +3337963800,3337963807,US +3337963808,3337963847,CA +3337963848,3337963855,BR +3337963856,3337963863,CA +3337963864,3337963871,MA +3337963872,3337963879,US +3337963880,3337963903,CA +3337963904,3337963911,MA +3337963912,3337963919,CA +3337963920,3337963951,US +3337963952,3337963967,CA +3337963968,3337964031,IN +3337964032,3337964287,US +3337964288,3337964295,CA +3337964296,3337964335,US +3337964336,3337964351,CA +3337964352,3337964415,US +3337964416,3337964543,CA +3337964544,3337964671,US +3337964672,3337964735,IN +3337964736,3337964751,US +3337964752,3337964759,CA +3337964760,3337969663,US +3337969664,3337973759,PR +3337973760,3337977855,CA +3337977856,3337980671,US +3337980672,3337980927,PR +3337980928,3337986047,US +3337986048,3337986303,BB +3337986304,3337990143,US +3337990144,3337990655,CA +3337990656,3338010367,US +3338010368,3338010623,PR +3338010624,3338017791,US +3338017792,3338018815,CA +3338018816,3338021887,US +3338021888,3338022911,CA +3338022912,3338067711,US +3338067712,3338067967,SG +3338067968,3338069247,US +3338069248,3338069759,BB +3338069760,3338207487,US +3338207488,3338207743,CA +3338207744,3338208511,US +3338208512,3338208767,CA +3338208768,3338211583,US +3338211584,3338212095,CA +3338212096,3338215423,US +3338215424,3338215935,CA +3338215936,3338216447,US +3338216448,3338216703,CA +3338216704,3338217215,US +3338217216,3338217471,CA +3338217472,3338220543,US +3338220544,3338221055,CA +3338221056,3338222847,US +3338222848,3338223359,CA +3338223360,3338228735,US +3338228736,3338228991,CA +3338228992,3338229759,US +3338229760,3338230015,CA +3338230016,3338230527,US +3338230528,3338230783,CA +3338230784,3338231807,US +3338231808,3338232063,CA +3338232064,3338233599,US +3338233600,3338233855,VG +3338233856,3338235135,US +3338235136,3338235391,CA +3338235392,3338235647,US +3338235648,3338235903,CA +3338235904,3338236671,US +3338236672,3338236927,CA +3338236928,3338238975,US +3338238976,3338239231,CA +3338239232,3338239999,US +3338240000,3338240255,CA +3338240256,3338241535,US +3338241536,3338242047,CA +3338242048,3338246143,US +3338246144,3338246399,CA +3338246400,3338246655,US +3338246656,3338247167,CA +3338247168,3338247423,US +3338247424,3338247679,CA +3338247680,3338247935,US +3338247936,3338249215,CA +3338249216,3338249727,US +3338249728,3338249983,CA +3338249984,3338250751,US +3338250752,3338251007,CA +3338251008,3338251263,US +3338251264,3338251775,CA +3338251776,3338252543,US +3338252544,3338252799,CA +3338252800,3338253311,US +3338253312,3338253567,CA +3338253568,3338254079,US +3338254080,3338254335,CA +3338254336,3338255615,US +3338255616,3338255871,CA +3338255872,3338257407,US +3338257408,3338257663,CA +3338257664,3338257919,US +3338257920,3338258175,CA +3338258176,3338259455,US +3338259456,3338259711,CA +3338259712,3338260735,US +3338260736,3338261759,CA +3338261760,3338262527,US +3338262528,3338263039,CA +3338263040,3338264063,US +3338264064,3338264575,CA +3338264576,3338265855,US +3338265856,3338266623,CA +3338266624,3338267647,US +3338267648,3338268159,CA +3338268160,3338269183,US +3338269184,3338270207,CA +3338270208,3338270719,US +3338270720,3338271231,CA +3338271232,3338271487,US +3338271488,3338271743,CA +3338271744,3338271999,US +3338272000,3338272255,CA +3338272256,3338350591,US +3338350592,3338354687,CA +3338354688,3338358882,US +3338358883,3338358883,DE +3338358884,3338358908,US +3338358909,3338358909,DE +3338358910,3338358923,US +3338358924,3338358924,DE +3338358925,3338358987,US +3338358988,3338358988,DE +3338358989,3338359015,US +3338359016,3338359016,DE +3338359017,3338359033,US +3338359034,3338359034,DE +3338359035,3338359295,US +3338359296,3338359359,BR +3338359360,3338359817,US +3338359818,3338359818,GB +3338359819,3338359847,US +3338359848,3338359848,RO +3338359849,3338360439,US +3338360440,3338360440,CA +3338360441,3338360479,US +3338360480,3338360483,GB +3338360484,3338360831,US +3338360832,3338361087,RU +3338361088,3338361192,US +3338361193,3338361193,RO +3338361194,3338371071,US +3338371072,3338403839,CA +3338403840,3338424319,US +3338424320,3338428415,CA +3338428416,3338429695,US +3338429696,3338429951,SG +3338429952,3338430719,US +3338430720,3338430975,NL +3338430976,3338431487,US +3338431488,3338431743,CA +3338431744,3338432255,US +3338432256,3338432511,SG +3338432512,3338436607,US +3338436608,3338437631,CA +3338437632,3338446079,US +3338446080,3338446335,CA +3338446336,3338455039,US +3338455040,3338455295,GB +3338455296,3338567679,US +3338567680,3338600447,CA +3338600448,3338600983,US +3338600984,3338600991,CA +3338600992,3338600999,BR +3338601000,3338601007,MX +3338601008,3338601015,JP +3338601016,3338601023,AU +3338601024,3338608175,US +3338608176,3338608183,CN +3338608184,3338608287,US +3338608288,3338608295,CN +3338608296,3338608319,US +3338608320,3338608327,CN +3338608328,3338608335,US +3338608336,3338608343,CN +3338608344,3338608775,US +3338608776,3338608783,CN +3338608784,3338622463,US +3338622464,3338623487,CA +3338623488,3338631679,US +3338631680,3338631935,CA +3338631936,3338686463,US +3338686464,3338688511,AW +3338688512,3338770431,US +3338770432,3338772479,PR +3338772480,3338825727,US +3338825728,3338827775,AW +3338827776,3338849615,US +3338849616,3338849631,FR +3338849632,3338916351,US +3338916352,3338916479,CN +3338916480,3338921219,US +3338921220,3338921220,PT +3338921221,3338964991,US +3338964992,3338965247,CA +3338965248,3338976767,US +3338976768,3338977023,CA +3338977024,3338993407,US +3338993408,3338993663,CA +3338993664,3339043327,US +3339043328,3339043583,CA +3339043584,3339075583,US +3339075584,3339076863,GB +3339076864,3339077631,JP +3339077632,3339077887,SG +3339077888,3339079167,US +3339079168,3339079423,DK +3339079424,3339079679,CA +3339079680,3339080703,IT +3339080704,3339080959,FR +3339080960,3339081727,HK +3339081728,3339081983,NL +3339081984,3339082751,FR +3339082752,3339086335,US +3339086336,3339086591,JP +3339086592,3339091967,US +3339091968,3339092991,NL +3339092992,3339093503,US +3339093504,3339094015,NL +3339094016,3339137279,US +3339137280,3339137535,FR +3339137536,3339138815,US +3339138816,3339139071,NL +3339139072,3339139327,SE +3339139328,3339139583,JP +3339139584,3339139839,GB +3339139840,3339140351,US +3339140352,3339140607,HK +3339140608,3339142911,US +3339142912,3339143167,DE +3339143168,3339147007,US +3339147008,3339147775,CA +3339147776,3339148031,MS +3339148032,3339153407,US +3339153408,3339155455,BB +3339155456,3339159551,US +3339159552,3339160575,CA +3339160576,3339164671,US +3339164672,3339165695,CA +3339165696,3339167743,US +3339167744,3339168767,PR +3339168768,3339177983,US +3339177984,3339178495,PR +3339178496,3339178751,DO +3339178752,3339179007,PR +3339179008,3339180031,US +3339180032,3339181055,CA +3339181056,3339184127,US +3339184128,3339185839,CA +3339185840,3339185843,US +3339185844,3339186175,CA +3339186176,3339261951,US +3339261952,3339263999,HK +3339264000,3339270399,US +3339270400,3339270655,CA +3339271168,3339327999,US +3339328512,3339328831,CA +3339328832,3339328895,US +3339328896,3339328943,CA +3339328944,3339328959,AE +3339328960,3339329279,CA +3339329280,3339329407,US +3339329408,3339329439,CA +3339329440,3339329455,GB +3339329456,3339329535,CA +3339329536,3339338239,US +3339338240,3339338495,CA +3339338496,3339342847,US +3339342848,3339343103,CA +3339343104,3339669503,US +3339669504,3339671807,CA +3339671808,3339672063,US +3339672576,3339678721,US +3339678722,3339678782,CN +3339678783,3339678785,US +3339678786,3339678846,CN +3339678847,3339679487,US +3339679488,3339679743,CN +3339679744,3339707391,US +3339707392,3339708415,BM +3339708416,3339722687,US +3339722688,3339722703,EG +3339722704,3339722719,CA +3339722720,3339727343,US +3339727344,3339727351,CA +3339727352,3339728895,US +3339728896,3339729407,AG +3339729408,3339729919,DM +3339729920,3339743231,US +3339743232,3339744255,CA +3339744256,3339747327,US +3339747328,3339748351,CA +3339748352,3339753471,US +3339753472,3339754495,CA +3339754496,3339760639,US +3339760640,3339761663,CA +3339761664,3339766047,US +3339766048,3339766055,DE +3339766056,3339766071,US +3339766072,3339766079,CA +3339766080,3339766095,US +3339766096,3339766103,GB +3339766104,3339766111,US +3339766112,3339766119,IN +3339766120,3339766183,US +3339766184,3339766191,AU +3339766192,3339766231,US +3339766232,3339766239,GB +3339766240,3339766247,MX +3339766248,3339766343,US +3339766344,3339766351,SA +3339766352,3339766383,US +3339766384,3339766399,AU +3339766400,3339766495,US +3339766496,3339766511,RU +3339766512,3339766543,US +3339766544,3339766547,RO +3339766548,3339766551,US +3339766552,3339766559,RO +3339766560,3339766583,US +3339766584,3339766591,AU +3339766592,3339766599,US +3339766600,3339766607,BR +3339766608,3339766623,US +3339766624,3339766631,NO +3339766632,3339766671,US +3339766672,3339766679,CA +3339766680,3339766687,RO +3339766688,3339766695,US +3339766696,3339766703,PT +3339766704,3339766719,US +3339766720,3339766727,IN +3339766728,3339766743,US +3339766744,3339766751,SE +3339766752,3339766759,BE +3339766760,3339766767,US +3339766768,3339766775,HU +3339766776,3339766879,US +3339766880,3339766887,GB +3339766888,3339766903,US +3339766904,3339766911,NZ +3339766912,3339766919,US +3339766920,3339766927,IL +3339766928,3339766943,US +3339766944,3339766951,RU +3339766952,3339766983,US +3339766984,3339766991,RU +3339766992,3339767007,US +3339767008,3339767015,DE +3339767016,3339767031,US +3339767032,3339767039,CA +3339767040,3339767071,US +3339767072,3339767079,CA +3339767080,3339767087,US +3339767088,3339767095,HU +3339767096,3339767111,US +3339767112,3339767119,GB +3339767120,3339767127,US +3339767128,3339767135,CA +3339767136,3339767143,GB +3339767144,3339767191,US +3339767192,3339767199,RO +3339767200,3339767207,IT +3339767208,3339767231,US +3339767232,3339767239,RU +3339767240,3339767247,PT +3339767248,3339767263,US +3339767264,3339767271,AR +3339767272,3339767335,US +3339767336,3339767343,RO +3339767344,3339767351,US +3339767352,3339767359,IL +3339767360,3339767431,US +3339767432,3339767439,CN +3339767440,3339767447,SA +3339767448,3339767471,US +3339767472,3339767479,CN +3339767480,3339767495,US +3339767496,3339767503,HU +3339767504,3339767511,US +3339767512,3339767519,IN +3339767520,3339767527,US +3339767528,3339767535,CA +3339767536,3339767543,US +3339767544,3339767551,MX +3339767552,3339767615,RO +3339767616,3339767663,US +3339767664,3339767671,RU +3339767672,3339767679,US +3339767680,3339767711,BR +3339767712,3339778047,US +3339778048,3339779071,BM +3339779072,3339923455,US +3339923456,3339927551,CA +3339927552,3339934719,US +3339934720,3339935743,CA +3339935744,3339937279,US +3339937280,3339937535,MX +3339937536,3339937816,US +3339937817,3339937879,CN +3339937880,3339938817,US +3339938818,3339938830,IN +3339938831,3339939130,US +3339939131,3339939191,BR +3339939192,3339939440,US +3339939441,3339939446,TR +3339939447,3339939473,US +3339939474,3339939534,GB +3339939535,3339939582,TR +3339939583,3339952127,US +3339952128,3339956223,CA +3339956224,3339962559,US +3339962560,3339962591,GB +3339962592,3339963167,US +3339963168,3339963199,SC +3339963200,3339965439,US +3339965440,3339968511,CA +3339968512,3339975935,US +3339975936,3339976191,CA +3339976192,3340080127,US +3340080128,3340081151,CA +3340081152,3340084223,US +3340084224,3340085247,KN +3340085248,3340086271,US +3340086272,3340087295,AU +3340087296,3340088319,US +3340088320,3340089343,CA +3340089344,3340097535,US +3340097536,3340098559,CA +3340098560,3340107775,US +3340107776,3340369919,CA +3340369920,3340386815,US +3340387328,3340388351,CA +3340388352,3340390399,US +3340390400,3340391423,CA +3340391424,3340391785,US +3340391786,3340391793,MY +3340391794,3340391817,US +3340391818,3340391825,LK +3340391826,3340392169,US +3340392170,3340392190,LK +3340392191,3340394495,US +3340394496,3340396543,HK +3340396544,3340418559,US +3340418560,3340419071,CA +3340419072,3340429823,US +3340429824,3340430079,PA +3340430080,3340453375,US +3340453376,3340453887,BM +3340453888,3340454911,US +3340454912,3340455167,DE +3340455168,3340460031,US +3340460032,3340462079,PR +3340462080,3340481535,US +3340481536,3340482559,CA +3340482560,3340483583,US +3340484608,3340490751,US +3340490752,3340492799,CA +3340492800,3340493567,US +3340493568,3340493823,HK +3340493824,3340637439,US +3340637440,3340637695,IE +3340637696,3340639231,US +3340639232,3340639295,IE +3340639296,3340677119,US +3340677120,3340679167,CA +3340679168,3340693679,US +3340693680,3340693695,GB +3340693696,3340694783,US +3340694784,3340695039,CA +3340695040,3340846111,US +3340846112,3340846119,CA +3340846120,3340846127,GB +3340846128,3340846131,MX +3340846132,3340846139,BR +3340846140,3340851455,US +3340851456,3340851711,CA +3340851712,3340852735,US +3340852736,3340853247,CA +3340853248,3340857343,US +3340857344,3340858015,CA +3340858016,3340858047,US +3340858048,3340858367,CA +3340858368,3340925095,US +3340925096,3340925103,TR +3340925104,3340925111,US +3340925112,3340925119,CO +3340925120,3340925159,US +3340925160,3340925167,FR +3340925168,3340925175,BE +3340925176,3340925183,TR +3340925184,3340925215,US +3340925216,3340925247,AF +3340925248,3340925255,US +3340925256,3340925263,TR +3340925264,3340925359,US +3340925360,3340925367,IN +3340925368,3340925375,US +3340925376,3340925383,IN +3340925384,3340925391,RU +3340925392,3340925439,US +3340925440,3340925447,GB +3340925448,3340925511,US +3340925512,3340925519,EE +3340925520,3340925527,GB +3340925528,3340925535,PL +3340925536,3340925543,RU +3340925544,3340925567,US +3340925568,3340925575,DE +3340925576,3340925591,US +3340925592,3340925599,VE +3340925600,3340925607,US +3340925608,3340925615,GB +3340925616,3340925631,US +3340925632,3340925639,FR +3340925640,3340925647,CO +3340925648,3340925655,US +3340925656,3340925663,GB +3340925664,3340925695,US +3340925696,3340925703,AU +3340925704,3340925711,ID +3340925712,3340925735,US +3340925736,3340925743,UA +3340925744,3340925783,US +3340925784,3340925791,BR +3340925792,3340925807,US +3340925808,3340925815,RU +3340925816,3340925823,US +3340925824,3340925887,GB +3340925888,3340925895,US +3340925896,3340925903,GR +3340925904,3340925919,US +3340925920,3340925927,PT +3340925928,3340925935,US +3340925936,3340925943,BR +3340925944,3340925951,CA +3340925952,3340925959,BE +3340925960,3340925967,IT +3340925968,3340925999,US +3340926000,3340926007,RU +3340926008,3340926015,US +3340926016,3340926023,RU +3340926024,3340926095,US +3340926096,3340926103,RO +3340926104,3340926127,US +3340926128,3340926135,GB +3340926136,3340926143,US +3340926144,3340926151,RU +3340926152,3340926159,CN +3340926160,3340926167,US +3340926168,3340926175,AR +3340926176,3340926191,US +3340926192,3340926199,BR +3340926200,3340926215,US +3340926216,3340926223,SE +3340926224,3340926231,CA +3340926232,3340926247,US +3340926248,3340926255,AR +3340926256,3340926295,US +3340926296,3340926303,DE +3340926304,3340926319,US +3340926320,3340926327,RU +3340926328,3340926343,US +3340926344,3340926351,TR +3340926352,3340926359,CA +3340926360,3340926367,US +3340926368,3340926375,GB +3340926376,3340926399,US +3340926400,3340926407,CA +3340926408,3340926439,US +3340926440,3340926447,OM +3340926448,3340926455,DE +3340926456,3340926463,US +3340926464,3340926479,MX +3340926480,3340926487,BR +3340926488,3340926495,CA +3340926496,3340926503,DE +3340926504,3340926511,MX +3340926512,3340926527,SE +3340926528,3340926599,US +3340926600,3340926607,CA +3340926608,3340926615,IN +3340926616,3340926623,US +3340926624,3340926655,BR +3340926656,3340926663,RU +3340926664,3340926671,US +3340926672,3340926679,DO +3340926680,3340926783,US +3340926784,3340926791,NO +3340926792,3340926807,US +3340926808,3340926815,IN +3340926816,3340926823,GB +3340926824,3340926959,US +3340926960,3340926967,IL +3340926968,3341057023,US +3341057024,3341058047,CA +3341058048,3341082623,US +3341082624,3341084671,CA +3341084672,3341180927,US +3341180928,3341182975,CA +3341182976,3341186686,US +3341186687,3341186688,IN +3341186689,3341194463,US +3341194464,3341194495,NL +3341194496,3341205503,US +3341205504,3341206589,LC +3341206590,3341206590,BB +3341206591,3341207551,LC +3341207552,3341210263,US +3341210264,3341210271,CA +3341210272,3341216255,US +3341216256,3341216767,JP +3341216768,3341217791,CA +3341217792,3341287423,US +3341287424,3341408511,CZ +3341408512,3341408767,US +3341408768,3341418495,CZ +3341418496,3341444863,US +3341444864,3341445631,DE +3341445632,3341464575,US +3341464576,3341464831,GB +3341464832,3341470207,US +3341470208,3341470463,GB +3341470464,3341472255,US +3341472256,3341472511,DE +3341472512,3341479935,US +3341479936,3341480447,DE +3341480448,3341484287,US +3341484288,3341485055,CA +3341485056,3341488639,US +3341488640,3341489151,JP +3341489152,3341495551,US +3341495552,3341495807,HK +3341495808,3341500159,US +3341500160,3341500415,HK +3341500416,3341511679,US +3341511680,3341517823,CA +3341517824,3341518847,US +3341518848,3341531135,CA +3341531136,3341533951,US +3341533952,3341534207,CA +3341534720,3341535007,US +3341535008,3341535015,ID +3341535016,3341535023,GH +3341535024,3341535031,PA +3341535032,3341535039,VN +3341535040,3341535047,MA +3341535048,3341535055,GH +3341535056,3341535087,US +3341535088,3341535091,GH +3341535092,3341535095,MX +3341535096,3341535167,US +3341535168,3341535171,CN +3341535172,3341535183,US +3341535184,3341535187,ID +3341535188,3341535195,US +3341535196,3341535199,SA +3341535200,3341535231,US +3341535232,3341536255,GB +3341536256,3341536511,US +3341536512,3341536767,CA +3341536768,3341546239,US +3341546240,3341547007,CA +3341547008,3341547519,CH +3341547520,3341549311,CA +3341549312,3341631999,US +3341632000,3341632767,CA +3341632768,3341634815,US +3341634816,3341635071,CA +3341635072,3341643519,US +3341643520,3341643775,CA +3341643776,3341644287,US +3341644288,3341644799,CA +3341644800,3341645055,US +3341645056,3341645567,CA +3341645568,3341646079,US +3341646080,3341646591,CA +3341646592,3341709311,US +3341709312,3341710335,CA +3341710336,3341727999,US +3341728000,3341728255,AU +3341728256,3341758463,US +3341758464,3341759487,CA +3341759488,3341760511,BB +3341760512,3341762559,CA +3341762560,3341777919,US +3341777920,3341778943,CA +3341778944,3341784063,US +3341784064,3341784575,CA +3341784576,3341785087,CH +3341785088,3341795583,US +3341795584,3341795839,GB +3341795840,3341796607,US +3341796608,3341796863,AU +3341796864,3341797375,JP +3341797376,3341807615,US +3341807616,3341807652,CA +3341807653,3341807653,US +3341807654,3341807706,CA +3341807707,3341807815,US +3341807816,3341807822,CA +3341807823,3341807844,US +3341807845,3341807855,CA +3341807856,3341807865,US +3341807866,3341808192,CA +3341808193,3341808206,ID +3341808207,3341808607,CA +3341808608,3341808638,US +3341808639,3341808639,CA +3341808640,3341827071,US +3341827072,3341827327,CA +3341827328,3341828095,US +3341828096,3341829119,CA +3341829120,3341837311,US +3341837312,3341837743,CA +3341837744,3341837747,US +3341837748,3341838335,CA +3341838336,3341838591,GB +3341838592,3341854551,US +3341854552,3341854559,SG +3341854560,3341863935,US +3341863936,3341864959,AG +3341864960,3341867007,US +3341867008,3341869055,CA +3341869056,3341870079,US +3341870080,3341870335,CA +3341870336,3341873407,US +3341873408,3341873663,CA +3341873664,3341881087,US +3341881088,3341881343,SG +3341881344,3341891071,US +3341891072,3341891327,AU +3341891328,3342139391,US +3342139392,3342204927,CH +3342204928,3342470399,US +3342470400,3342470655,CA +3342471168,3342487551,US +3342487552,3342488575,CA +3342488576,3342488639,US +3342488640,3342488703,GB +3342488704,3342488831,SC +3342488832,3342488863,GB +3342488864,3342488872,US +3342488873,3342488882,BG +3342488883,3342488896,US +3342488897,3342488908,GB +3342488909,3342488909,US +3342488910,3342488925,GB +3342488926,3342489087,US +3342489088,3342489215,SC +3342489216,3342489279,GB +3342489280,3342489301,US +3342489302,3342489311,AR +3342489312,3342489450,US +3342489451,3342489463,IL +3342489464,3342489474,US +3342489475,3342489482,NL +3342489483,3342489485,US +3342489486,3342489501,IL +3342489502,3342489503,US +3342489504,3342489567,GB +3342489568,3342496767,US +3342496768,3342497791,CA +3342499840,3342505983,US +3342505984,3342507007,BB +3342507008,3342510079,US +3342510080,3342512127,CA +3342512128,3342516223,US +3342516224,3342516735,CA +3342516736,3342516991,US +3342516992,3342517247,CA +3342517248,3342526463,US +3342526464,3342528511,CA +3342528512,3342552063,US +3342552064,3342553087,CA +3342553088,3342556127,US +3342556128,3342556159,CA +3342556160,3342565375,US +3342565376,3342567423,CA +3342567424,3342570239,US +3342570240,3342570495,CH +3342570496,3342579711,US +3342579712,3342581759,CA +3342581760,3342585599,US +3342585600,3342585855,MU +3342585856,3342595071,US +3342595072,3342595583,CA +3342595584,3342595839,FR +3342595840,3342596095,CA +3342596096,3342598143,US +3342598144,3342603263,CA +3342603264,3342604799,US +3342604800,3342605311,CA +3342605312,3342605567,US +3342605568,3342623743,CA +3342624000,3342624255,US +3342624256,3342627839,CA +3342627840,3342628095,US +3342628096,3342629631,CA +3342629632,3342629887,US +3342629888,3342657535,CA +3342657536,3342657791,US +3342657792,3342663423,CA +3342663424,3342831103,US +3342831104,3342831359,IN +3342831360,3342879487,US +3342879488,3342879551,NL +3342879552,3342879567,US +3342879568,3342879743,NL +3342879744,3343013887,US +3343013888,3343015695,CA +3343015696,3343015727,US +3343015728,3343015935,CA +3343015936,3343046919,US +3343046920,3343046923,IT +3343046924,3343046939,US +3343046940,3343046943,RU +3343046944,3343046955,US +3343046956,3343046959,IT +3343046960,3343046963,BE +3343046964,3343046967,US +3343046968,3343046971,NL +3343046972,3343046987,US +3343046988,3343046991,CA +3343046992,3343047111,US +3343047112,3343047127,SG +3343047128,3343047143,US +3343047144,3343047151,IT +3343047152,3343047327,US +3343047328,3343047343,IT +3343047344,3343047423,US +3343047424,3343047439,RU +3343047440,3343047519,US +3343047520,3343047535,IN +3343047536,3343047751,US +3343047752,3343047759,BR +3343047760,3343047791,US +3343047792,3343047799,PL +3343047800,3343047847,US +3343047848,3343047855,IT +3343047856,3343055871,US +3343055872,3343056895,CA +3343056896,3343117311,US +3343117312,3343117567,JP +3343117568,3343153151,US +3343153152,3343153167,CA +3343153168,3343153175,US +3343153176,3343154943,CA +3343154944,3343167487,US +3343167488,3343169535,CA +3343169536,3343171583,US +3343171584,3343172607,BM +3343172608,3343172695,US +3343172696,3343172703,NL +3343172704,3343319295,US +3343319296,3343342847,CA +3343342848,3343343103,PR +3343343104,3343346175,CA +3343346176,3343346687,US +3343346688,3343355391,CA +3343355392,3343355903,US +3343355904,3343359743,CA +3343359744,3343359999,US +3343360000,3343364095,CA +3343364096,3343365631,US +3343365632,3343366655,CA +3343366656,3343366911,US +3343366912,3343372543,CA +3343372544,3343378431,US +3343378432,3343378447,BR +3343378448,3343378511,US +3343378512,3343378519,GB +3343378520,3343378535,US +3343378536,3343378543,GB +3343378544,3343378559,US +3343378560,3343378583,GB +3343378584,3343378599,US +3343378600,3343378607,RU +3343378608,3343378615,GB +3343378616,3343378751,US +3343378752,3343378759,BR +3343378760,3343378767,CL +3343378768,3343378775,BR +3343378776,3343378791,RU +3343378792,3343378799,US +3343378800,3343378807,VE +3343378808,3343378815,UA +3343378816,3343378823,US +3343378824,3343378839,SE +3343378840,3343378847,RU +3343378848,3343378863,BR +3343378864,3343378879,US +3343378880,3343378887,RU +3343378888,3343378895,BL +3343378896,3343378911,US +3343378912,3343378919,VE +3343378920,3343378927,NL +3343378928,3343378959,US +3343378960,3343378967,RU +3343378968,3343379039,US +3343379040,3343379071,GB +3343379072,3343379079,RU +3343379080,3343379087,SE +3343379088,3343379095,BR +3343379096,3343379103,NL +3343379104,3343379119,US +3343379120,3343379127,NL +3343379128,3343379143,US +3343379144,3343379151,GB +3343379152,3343379183,US +3343379184,3343379199,EE +3343379200,3343379215,US +3343379216,3343379223,BR +3343379224,3343379391,US +3343379392,3343379399,NI +3343379400,3343379407,CO +3343379408,3343380479,US +3343380480,3343384319,CA +3343384320,3343457527,US +3343457528,3343457535,ID +3343457536,3343457607,US +3343457608,3343457615,AU +3343457616,3343457743,US +3343457744,3343457759,CA +3343457760,3343457807,US +3343457808,3343457815,GB +3343457816,3343460863,US +3343460864,3343461375,CA +3343461376,3343465471,US +3343465472,3343466495,JM +3343466496,3343563521,US +3343563522,3343563522,SG +3343563523,3343649791,US +3343649792,3343650815,VI +3343650816,3343653535,US +3343653536,3343653551,CA +3343653552,3343653631,US +3343653632,3343653695,CA +3343653696,3343746047,US +3343746048,3343747071,VI +3343747072,3343763903,US +3343763904,3343763935,CA +3343763936,3343858687,US +3343858688,3343859199,VG +3343859200,3343922975,US +3343922976,3343923007,PA +3343923008,3343923071,US +3343923072,3343923135,CY +3343923136,3343923199,HK +3343923200,3344116223,US +3344116224,3344116735,CA +3344116736,3344126975,US +3344126976,3344127999,CA +3344128000,3344140287,US +3344140288,3344141311,CA +3344141312,3344144383,US +3344144384,3344148479,CA +3344148480,3344154623,US +3344154624,3344156671,GD +3344156672,3344158719,CA +3344158720,3344165631,US +3344165632,3344165663,MX +3344165664,3344166911,US +3344166912,3344168959,CA +3344168960,3344171263,US +3344171264,3344195583,CA +3344195584,3344203775,US +3344203776,3344236287,CA +3344236288,3344237055,US +3344237056,3344238335,CA +3344238336,3344238591,US +3344240640,3344242175,CA +3344242176,3344242687,US +3344242688,3344252671,CA +3344252672,3344252927,US +3344252928,3344255999,CA +3344256000,3344261887,US +3344261888,3344266239,CA +3344266240,3344266751,US +3344266752,3344268543,CA +3344268544,3344268799,IN +3344268800,3344269311,US +3344269312,3344287743,CA +3344287744,3344287999,US +3344288000,3344288767,CA +3344288768,3344289791,PR +3344289792,3344292863,US +3344292864,3344296447,CA +3344296448,3344296959,US +3344296960,3344297983,GD +3344297984,3344299263,US +3344299264,3344299519,CA +3344299520,3344299775,US +3344299776,3344300543,CA +3344300544,3344300799,US +3344300800,3344301823,CA +3344301824,3344379903,US +3344379904,3344380927,CA +3344380928,3344381167,US +3344381168,3344381175,NZ +3344381176,3344381215,US +3344381216,3344381223,NG +3344381224,3344381255,US +3344381256,3344381263,CA +3344381264,3344381271,MX +3344381272,3344381887,US +3344381888,3344381893,ES +3344381894,3344406527,US +3344406528,3344408575,CA +3344408576,3344411135,US +3344411136,3344411647,BM +3344411648,3344415679,US +3344415680,3344415743,AR +3344415744,3344429055,US +3344429056,3344429343,CA +3344429344,3344429375,US +3344429376,3344431103,CA +3344431104,3344486399,US +3344486400,3344488447,NL +3344488448,3344534271,US +3344534272,3344534527,CA +3344534528,3344633855,US +3344633856,3344637951,CH +3344637952,3344648703,US +3344648704,3344648959,SG +3344648960,3344649215,DE +3344649216,3344650239,PR +3344650240,3344652287,CA +3344652288,3344654335,US +3344654336,3344656383,VG +3344656384,3344658431,US +3344658432,3344660479,CA +3344660480,3344670719,US +3344670720,3344670975,MF +3344670976,3344671103,MQ +3344671104,3344671231,GP +3344671232,3344671487,MQ +3344671488,3344671743,BL +3344671744,3344673983,US +3344673984,3344673991,SC +3344673992,3344674079,US +3344674080,3344674087,GB +3344674088,3344674151,US +3344674152,3344674159,TR +3344674160,3344674207,US +3344674208,3344674223,GB +3344674224,3344674279,US +3344674280,3344674287,GB +3344674288,3344674343,US +3344674344,3344674351,TR +3344674352,3344674471,US +3344674472,3344674479,GB +3344674480,3344674751,US +3344674752,3344674767,MO +3344674768,3344676863,US +3344676864,3344677247,CA +3344677248,3344677263,US +3344677264,3344677279,CA +3344677280,3344677295,US +3344677296,3344677407,CA +3344677408,3344677423,US +3344677424,3344678911,CA +3344678912,3344680959,AE +3344680960,3344681983,US +3344681984,3344685055,CA +3344685056,3344691199,US +3344691200,3344693247,CA +3344693248,3344694271,US +3344694272,3344695295,CA +3344695296,3344937471,US +3344937472,3344937983,EG +3344937984,3344938239,US +3344938240,3344938495,UZ +3344938496,3344955391,US +3344955392,3344955647,GB +3344955648,3344964607,US +3344964608,3344965631,CA +3344965632,3344973823,US +3344973824,3344974847,BM +3344974848,3344979967,US +3344979968,3344982015,CA +3344982016,3345007615,US +3345007616,3345008639,CA +3345008640,3345010687,US +3345010688,3345011711,CA +3345011712,3345299455,US +3345299456,3345301503,CA +3345301504,3345303551,US +3345303552,3345304575,CA +3345304576,3345315071,US +3345315072,3345315327,TW +3345315328,3345315583,US +3345315584,3345315839,TW +3345315840,3345318943,US +3345318944,3345318975,CY +3345318976,3345321471,US +3345321472,3345321983,GB +3345321984,3345327103,US +3345327104,3345328127,CA +3345328128,3345332287,US +3345332288,3345332295,GH +3345332296,3345332303,PK +3345332304,3345332311,US +3345332312,3345332319,LK +3345332320,3345332327,PT +3345332328,3345332339,US +3345332340,3345332343,GH +3345332344,3345332347,US +3345332348,3345332351,CY +3345332352,3345332375,US +3345332376,3345332383,CA +3345332384,3345332387,AE +3345332388,3345332403,US +3345332404,3345332407,GH +3345332408,3345332411,ID +3345332412,3345332423,US +3345332424,3345332431,MY +3345332432,3345332435,VN +3345332436,3345332439,GB +3345332440,3345332463,US +3345332464,3345332471,VN +3345332472,3345332487,US +3345332488,3345332495,AU +3345332496,3345332503,CA +3345332504,3345332511,BR +3345332512,3345332535,US +3345332536,3345332539,BR +3345332540,3345332583,US +3345332584,3345332587,CY +3345332588,3345332591,IN +3345332592,3345332595,US +3345332596,3345332599,BD +3345332600,3345332603,US +3345332604,3345332607,ID +3345332608,3345332655,US +3345332656,3345332659,CY +3345332660,3345332663,VN +3345332664,3345332667,US +3345332668,3345332671,ID +3345332672,3345332751,US +3345332752,3345332767,GB +3345332768,3345332799,US +3345332800,3345332815,GB +3345332816,3345332991,US +3345332992,3345333055,VN +3345333056,3345333183,US +3345333184,3345333215,IN +3345333216,3345333219,BR +3345333220,3345333223,GH +3345333224,3345333227,MX +3345333228,3345333231,CY +3345333232,3345333247,US +3345333248,3345333759,GP +3345333760,3345334271,MF +3345334272,3345339391,US +3345339392,3345340415,CA +3345340416,3345375231,US +3345375232,3345377279,CA +3345377280,3345383423,US +3345383424,3345384447,CA +3345384448,3345390591,US +3345390592,3345391615,CA +3345391616,3345398783,US +3345398784,3345399807,BS +3345399808,3345401855,PR +3345401856,3345403903,CA +3345403904,3345408092,US +3345408093,3345408094,GB +3345408095,3345408110,US +3345408111,3345408114,AU +3345408115,3345408189,US +3345408190,3345408193,AR +3345408194,3345408225,US +3345408226,3345408227,GB +3345408228,3345408235,US +3345408236,3345408239,CN +3345408240,3345408319,US +3345408320,3345408323,GB +3345408324,3345408390,US +3345408391,3345408394,GB +3345408395,3345408415,US +3345408416,3345408420,AU +3345408421,3345408460,US +3345408461,3345408464,IN +3345408465,3345408496,US +3345408497,3345408497,GB +3345408498,3345408499,US +3345408500,3345408500,GB +3345408501,3345408534,US +3345408535,3345408538,AU +3345408539,3345408569,US +3345408570,3345408573,CA +3345408574,3345408577,US +3345408578,3345408585,GB +3345408586,3345408634,US +3345408635,3345408639,CA +3345408640,3345408651,US +3345408652,3345408655,CA +3345408656,3345408784,US +3345408785,3345408788,CA +3345408789,3345408903,US +3345408904,3345408907,GB +3345408908,3345409085,US +3345409086,3345409089,CA +3345409090,3345409093,US +3345409094,3345409097,CA +3345409098,3345409175,US +3345409176,3345409179,CN +3345409180,3345409558,US +3345409559,3345409562,CA +3345409563,3345409578,US +3345409579,3345409580,GB +3345409581,3345409706,US +3345409707,3345409710,IN +3345409711,3345409816,US +3345409817,3345409820,GB +3345409821,3345409871,US +3345409872,3345409875,CA +3345409876,3345409887,US +3345409888,3345409891,GB +3345409892,3345409911,US +3345409912,3345409915,CA +3345409916,3345409919,AU +3345409920,3345409945,US +3345409946,3345409949,SG +3345409950,3345412095,US +3345412096,3345413119,CA +3345413120,3345418239,US +3345418240,3345419519,NL +3345419520,3345422847,US +3345423360,3345424383,TC +3345424384,3345430527,US +3345430528,3345431039,CA +3345431040,3345431295,US +3345431296,3345432575,CA +3345432576,3345433599,GB +3345433600,3345433855,SG +3345433856,3345434879,US +3345434880,3345435135,ES +3345435136,3345435391,LU +3345435392,3345436159,DE +3345436160,3345436927,US +3345436928,3345437183,ES +3345437184,3345437695,GB +3345437696,3345437951,US +3345437952,3345438207,CA +3345438208,3345438463,GB +3345438464,3345438975,FR +3345439232,3345439743,US +3345439744,3345439999,FR +3345440000,3345440255,DE +3345440256,3345441023,US +3345441024,3345441791,DE +3345442304,3345442559,CL +3345442560,3345442815,JP +3345442816,3345443327,AT +3345443328,3345443583,CH +3345443584,3345443839,DE +3345443840,3345444607,US +3345444608,3345445119,CH +3345445120,3345446655,US +3345446656,3345446911,IT +3345446912,3345447679,US +3345447680,3345447935,BE +3345447936,3345448447,FR +3345448448,3345448703,BE +3345448704,3345448959,DE +3345448960,3345666623,US +3345666624,3345666639,NO +3345666640,3345667103,US +3345667104,3345667119,IN +3345667120,3346196479,US +3346196480,3346197503,CA +3346197504,3346198527,US +3346198528,3346200575,CA +3346200576,3346201599,US +3346201600,3346202623,CA +3346202624,3346209279,US +3346209792,3346210241,JM +3346210242,3346210242,CA +3346210243,3346210303,JM +3346210304,3346219007,US +3346219008,3346221055,CA +3346221056,3346221583,US +3346221584,3346221591,IT +3346221592,3346221623,US +3346221624,3346221631,RU +3346221632,3346221655,US +3346221656,3346221663,IT +3346221664,3346221671,BE +3346221672,3346221679,US +3346221680,3346221687,NL +3346221688,3346221719,US +3346221720,3346221727,CA +3346221728,3346221871,US +3346221872,3346221887,SG +3346221888,3346221903,US +3346221904,3346221911,IT +3346221912,3346221999,US +3346222000,3346222007,BR +3346222008,3346222039,US +3346222040,3346222047,PL +3346222048,3346225151,US +3346225152,3346227199,CA +3346227200,3346231743,US +3346231744,3346231807,SC +3346231808,3346231810,US +3346231811,3346231827,AR +3346231828,3346231846,US +3346231847,3346231854,GB +3346231855,3346231916,US +3346231917,3346231924,GB +3346231925,3346232460,US +3346232461,3346232468,AR +3346232469,3346232608,US +3346232609,3346232617,AR +3346232618,3346232703,US +3346232704,3346232767,GB +3346232768,3346232831,US +3346232832,3346232895,GB +3346232896,3346232959,US +3346232960,3346232991,GB +3346232992,3346233023,US +3346233024,3346233087,GB +3346233088,3346233279,US +3346233280,3346233311,GB +3346233312,3346234367,US +3346234368,3346234687,CA +3346234688,3346234695,US +3346234696,3346234911,CA +3346234912,3346234919,FR +3346234920,3346235391,CA +3346235392,3346241535,US +3346241536,3346243327,CA +3346243328,3346282495,US +3346282496,3346284543,PR +3346284544,3346319359,US +3346321408,3346322431,US +3346323456,3346325503,CA +3346325504,3346327551,US +3346327552,3346328575,CA +3346328576,3346329599,US +3346329600,3346330623,CA +3346330624,3346332103,US +3346332104,3346332111,GB +3346332112,3346492831,US +3346492832,3346492839,CA +3346492840,3346497535,US +3346497536,3346498559,CA +3346498560,3346505783,US +3346505784,3346505791,GB +3346505792,3346505895,US +3346505896,3346505903,AU +3346505904,3346506111,US +3346506112,3346506119,JM +3346506120,3346506271,US +3346506272,3346506279,GB +3346506280,3346506287,CA +3346506288,3346506311,US +3346506312,3346506319,CO +3346506320,3346506415,US +3346506416,3346506423,IN +3346506424,3346506447,US +3346506448,3346506455,CA +3346506456,3346506487,US +3346506488,3346506495,CA +3346506496,3346506527,US +3346506528,3346506535,GB +3346506536,3346506567,US +3346506568,3346506575,TR +3346506576,3346520063,US +3346520064,3346521087,CA +3346521088,3346523135,US +3346523136,3346523391,BO +3346523392,3346523647,RU +3346523648,3346523903,US +3346523904,3346524159,FR +3346524160,3346525183,CA +3346525184,3346528255,US +3346528256,3346529279,PR +3346529280,3346530303,CA +3346530304,3346591487,US +3346591488,3346591743,CA +3346591744,3346663167,US +3346663168,3346663423,CA +3346663424,3346691071,US +3346691072,3346692095,CA +3346692096,3346793215,US +3346793216,3346793471,CA +3346793472,3346793983,US +3346794496,3346899711,US +3346899712,3346899967,CA +3346899968,3346923519,US +3346923520,3346989055,CA +3346989056,3347013631,US +3347013632,3347014399,CA +3347014400,3347014655,US +3347014656,3347015167,CA +3347015168,3347015295,QA +3347015296,3347015423,KW +3347015424,3347015647,US +3347015648,3347015663,AE +3347015664,3347016703,US +3347016704,3347017727,CA +3347017728,3347021823,US +3347021824,3347022847,CA +3347022848,3347030527,US +3347030528,3347030783,IN +3347030784,3347033087,US +3347033088,3347034111,CA +3347034112,3347039231,US +3347039232,3347040255,DM +3347040256,3349268479,US +3349268480,3349268991,CA +3349268992,3349273087,US +3349273088,3349273343,CA +3349273344,3349341695,US +3349341696,3349341951,CA +3349341952,3349446911,US +3349446912,3349447167,CA +3349447168,3349463039,US +3349463040,3349463295,CA +3349463296,3349479167,US +3349479168,3349479423,CA +3349479424,3349533695,US +3349533696,3349533951,CA +3349533952,3349545215,US +3349545216,3349545727,CA +3349545728,3349545983,US +3349545984,3349551103,CA +3349551104,3349553663,US +3349553664,3349554687,IN +3349554688,3349600255,CA +3349600256,3349601023,US +3349601024,3349605375,CA +3349605376,3349605631,US +3349605632,3349608447,CA +3349608448,3349609471,US +3349609472,3349610239,CA +3349610240,3349614591,US +3349614592,3349614655,CA +3349614656,3349614671,US +3349614672,3349614783,CA +3349614784,3349614847,US +3349614848,3349615551,CA +3349615552,3349615615,US +3349615616,3349616127,CA +3349616128,3349616639,US +3349616640,3349617663,CA +3349617664,3349619343,US +3349619344,3349619391,CA +3349619392,3349619503,US +3349619504,3349619519,PA +3349619520,3349619583,CA +3349619584,3349637119,US +3349637120,3349639167,CA +3349639168,3349640191,US +3349640192,3349641215,CA +3349641216,3349643263,US +3349643264,3349643423,CA +3349643424,3349643431,US +3349643432,3349644287,CA +3349644288,3349645311,US +3349645312,3349647359,CA +3349647360,3349648165,US +3349648166,3349648168,NG +3349648169,3349649407,US +3349649408,3349650687,CA +3349650688,3349650943,GB +3349650944,3349653503,CA +3349653504,3349723175,US +3349723176,3349723183,LK +3349723184,3349723199,US +3349723200,3349723215,PK +3349723216,3349723260,US +3349723261,3349723265,CA +3349723266,3349723360,US +3349723361,3349723367,CA +3349723368,3349723996,US +3349723997,3349724000,LK +3349724001,3349724191,US +3349724192,3349724199,AF +3349724200,3349724207,US +3349724208,3349724215,CA +3349724216,3349724351,US +3349724352,3349724359,PK +3349724360,3349724415,US +3349724416,3349724447,AE +3349724448,3349724985,US +3349724986,3349724999,PK +3349725000,3349731327,US +3349731328,3349732003,CA +3349732004,3349732007,US +3349732008,3349733375,CA +3349733376,3349739519,US +3349739520,3349739551,CA +3349739552,3349739559,US +3349739560,3349740543,CA +3349740544,3349987327,US +3349987328,3349996543,BM +3349996544,3349997055,KY +3349997056,3350002687,BM +3350002688,3350002719,US +3350002720,3350002943,BM +3350002944,3350003007,US +3350003008,3350003711,BM +3350003712,3350042879,US +3350042880,3350043135,KW +3350043136,3350134783,US +3350134784,3350136575,CA +3350136576,3350136831,US +3350136832,3350146047,CA +3350146048,3350150143,US +3350150144,3350160639,CA +3350160640,3350160895,US +3350160896,3350161919,CA +3350161920,3350162431,US +3350162432,3350166527,CA +3350166528,3350167551,US +3350167552,3350169855,CA +3350169856,3350170111,US +3350170112,3350181887,CA +3350181888,3350183167,US +3350183168,3350200063,CA +3350200064,3350469119,US +3350469632,3350470655,CA +3350470656,3350475775,US +3350475776,3350476799,CA +3350476800,3350487039,US +3350487040,3350488063,CA +3350488064,3350488103,US +3350488104,3350488127,CN +3350488128,3350488159,US +3350488160,3350488191,CN +3350488192,3350488207,US +3350488208,3350488223,CN +3350488224,3350488247,US +3350488248,3350488255,CN +3350488256,3350488271,US +3350488272,3350488279,CN +3350488280,3350488319,US +3350488320,3350488327,CN +3350488328,3350488343,US +3350488344,3350488367,CN +3350488368,3350488455,US +3350488456,3350488463,CN +3350488464,3350488471,US +3350488472,3350488479,CN +3350488480,3350488487,US +3350488488,3350488543,CN +3350488544,3350488575,US +3350488576,3350488607,CN +3350488608,3350488743,US +3350488744,3350488751,CN +3350488752,3350488847,US +3350488848,3350488855,CN +3350488856,3350488959,US +3350488960,3350489023,CN +3350489024,3350489063,US +3350489064,3350489071,CN +3350489072,3350492961,US +3350492962,3350492990,GB +3350492991,3350501395,US +3350501396,3350501399,TR +3350501400,3350501403,PH +3350501404,3350503103,US +3350503104,3350503135,PH +3350503136,3350505471,US +3350505472,3350507519,CA +3350507520,3350514639,US +3350514640,3350514655,GB +3350514656,3350514879,US +3350514880,3350514911,GB +3350514912,3350515135,US +3350515136,3350515167,GB +3350515168,3350518887,US +3350518888,3350518891,FR +3350518892,3350518895,US +3350518896,3350518899,CA +3350518900,3350518975,US +3350518976,3350518979,PR +3350518980,3350519035,US +3350519036,3350519039,PA +3350519040,3350519059,US +3350519060,3350519063,IN +3350519064,3350548735,US +3350548736,3350548991,CA +3350548992,3350574591,US +3350574848,3350575103,CA +3350575104,3350593535,US +3350593536,3350605823,CA +3350605824,3350606847,US +3350606848,3350607871,CA +3350607872,3350618111,US +3350618112,3350619135,CA +3350619136,3350620383,US +3350620384,3350620415,GB +3350620416,3350623231,US +3350623232,3350624255,CA +3350624256,3350626303,US +3350626304,3350628351,CA +3350628352,3350642687,US +3350642688,3350643711,TC +3350643712,3350645759,US +3350646784,3350648831,US +3350648832,3350650623,CA +3350650624,3350650631,US +3350650632,3350650879,CA +3350650880,3350762495,US +3350762496,3350762751,GB +3350762752,3350763263,SG +3350763264,3350763519,HK +3350763520,3350790399,US +3350790400,3350814975,CA +3350814976,3350815231,US +3350815232,3350823423,CA +3350823424,3350823935,US +3350823936,3350825727,CA +3350825728,3350825983,GB +3350825984,3350834687,CA +3350834688,3350835199,US +3350835200,3350836223,CA +3350836224,3350836227,US +3350836228,3350836235,GB +3350836236,3350836239,US +3350836240,3350836243,IQ +3350836244,3350836247,EG +3350836248,3350836251,SA +3350836252,3350836255,IT +3350836256,3350836259,NZ +3350836260,3350836263,HK +3350836264,3350836267,CN +3350836268,3350836275,IN +3350836276,3350836279,ZA +3350836280,3350836283,CA +3350836284,3350836991,US +3350836992,3350837247,CA +3350837248,3350837759,US +3350837760,3350843391,CA +3350843392,3350843647,US +3350843648,3350855679,CA +3350855680,3350862079,US +3350862080,3350864639,CL +3350864640,3350952495,US +3350952496,3350952511,PE +3350952512,3350952583,US +3350952584,3350952591,BA +3350952592,3350952799,US +3350952800,3350952815,AZ +3350952816,3350953135,US +3350953136,3350953143,AZ +3350953144,3350953615,US +3350953616,3350953623,AR +3350953624,3350953631,NZ +3350953632,3350953855,US +3350953856,3350953871,AZ +3350953872,3350970367,US +3350970368,3350971391,CA +3350971392,3350978559,US +3350979584,3350980607,CA +3350980608,3350994943,US +3350994944,3350998015,CA +3350998016,3351002111,US +3351002112,3351003135,CA +3351003136,3351004159,US +3351004160,3351005183,CA +3351005184,3351012543,US +3351012544,3351012575,SE +3351012576,3351012995,US +3351012996,3351012999,RO +3351013000,3351013151,US +3351013152,3351013167,KW +3351013168,3351013375,US +3351013376,3351013391,CN +3351013392,3351013407,US +3351013408,3351013439,CN +3351013440,3351013447,US +3351013448,3351014183,CN +3351014184,3351014207,US +3351014208,3351014591,CN +3351014592,3351014655,US +3351014656,3351014663,CN +3351014664,3351014671,US +3351014672,3351014799,CN +3351014800,3351014807,CA +3351014808,3351014815,CN +3351014816,3351014911,US +3351014912,3351014943,CN +3351014944,3351015039,US +3351015040,3351015103,CN +3351015104,3351015135,US +3351015136,3351015151,CN +3351015152,3351015159,US +3351015160,3351015167,CN +3351015168,3351015231,US +3351015232,3351015239,CN +3351015240,3351015247,US +3351015248,3351015263,CN +3351015264,3351015279,US +3351015280,3351015295,CN +3351015296,3351015303,US +3351015304,3351015327,CN +3351015328,3351015343,US +3351015344,3351015359,CN +3351015360,3351015423,US +3351015424,3351016447,CA +3351016448,3351030783,US +3351030784,3351031807,CA +3351031808,3351034879,US +3351034880,3351035903,CA +3351035904,3351043071,US +3351043072,3351043327,CA +3351043328,3351043583,FR +3351043584,3351044095,CA +3351044096,3351045311,US +3351045312,3351045343,EE +3351045344,3351058943,US +3351058944,3351059455,CA +3351059456,3351071743,US +3351071744,3351072767,CA +3351072768,3351074241,US +3351074242,3351074242,MX +3351074243,3351074271,US +3351074272,3351074272,GT +3351074273,3351074301,US +3351074302,3351074302,PT +3351074303,3351074303,BR +3351074304,3351074367,US +3351074368,3351074369,BR +3351074370,3351074373,US +3351074374,3351074374,AR +3351074375,3351074375,BR +3351074376,3351074377,DE +3351074378,3351074378,BD +3351074379,3351074379,US +3351074380,3351074380,DE +3351074381,3351074381,US +3351074382,3351074382,KW +3351074383,3351074383,BR +3351074384,3351074385,US +3351074386,3351074386,RU +3351074387,3351074387,BR +3351074388,3351074388,DE +3351074389,3351074389,US +3351074390,3351074390,DE +3351074391,3351074391,BR +3351074392,3351074392,CL +3351074393,3351074394,US +3351074395,3351074395,TR +3351074396,3351074396,BR +3351074397,3351074397,SE +3351074398,3351074402,US +3351074403,3351074403,BR +3351074404,3351074404,CL +3351074405,3351074405,US +3351074406,3351074406,CA +3351074407,3351074407,US +3351074408,3351074409,BR +3351074410,3351074410,DE +3351074411,3351074415,US +3351074416,3351074417,BR +3351074418,3351074418,US +3351074419,3351074419,IN +3351074420,3351074426,US +3351074427,3351074427,DE +3351074428,3351074429,US +3351074430,3351074430,BR +3351074431,3351074434,US +3351074435,3351074435,BR +3351074436,3351074439,US +3351074440,3351074440,CA +3351074441,3351074444,US +3351074445,3351074445,CA +3351074446,3351074446,CL +3351074447,3351074456,US +3351074457,3351074457,RU +3351074458,3351074463,US +3351074464,3351074466,BR +3351074467,3351074467,US +3351074468,3351074468,RU +3351074469,3351074469,US +3351074470,3351074471,RU +3351074472,3351074472,US +3351074473,3351074473,BR +3351074474,3351074474,RU +3351074475,3351074475,BR +3351074476,3351074480,US +3351074481,3351074482,RU +3351074483,3351074483,US +3351074484,3351074484,CA +3351074485,3351074486,US +3351074487,3351074487,DE +3351074488,3351074488,US +3351074489,3351074489,BR +3351074490,3351074495,RU +3351074496,3351074496,US +3351074497,3351074497,BD +3351074498,3351074498,RU +3351074499,3351074499,CL +3351074500,3351074500,RU +3351074501,3351074504,US +3351074505,3351074505,DE +3351074506,3351074507,US +3351074508,3351074511,RU +3351074512,3351074512,AR +3351074513,3351074516,RU +3351074517,3351074518,CA +3351074519,3351074521,US +3351074522,3351074524,RU +3351074525,3351074528,CA +3351074529,3351074538,US +3351074539,3351074543,RU +3351074544,3351074545,US +3351074546,3351074550,RU +3351074551,3351074551,SK +3351074552,3351074557,US +3351074558,3351074558,CA +3351074559,3351074559,MY +3351074560,3351074690,US +3351074691,3351074691,BR +3351074692,3351074711,US +3351074712,3351074712,TR +3351074713,3351074728,US +3351074729,3351074729,EG +3351074730,3351074731,US +3351074732,3351074732,BR +3351074733,3351074734,US +3351074735,3351074735,BR +3351074736,3351074743,US +3351074744,3351074745,BR +3351074746,3351074746,AU +3351074747,3351074750,US +3351074751,3351074751,HU +3351074752,3351074815,US +3351074816,3351076863,CA +3351076864,3351080959,US +3351080960,3351081727,AG +3351081728,3351081983,DM +3351081984,3351086079,US +3351086080,3351087103,CA +3351087104,3351094271,US +3351094272,3351095295,CA +3351095296,3351100887,US +3351100888,3351100891,CA +3351100892,3351100895,US +3351100896,3351100927,CA +3351100928,3351103487,US +3351103488,3351104511,CA +3351104512,3351112703,US +3351112704,3351113727,CA +3351113728,3351129087,US +3351129088,3351129343,HK +3351129344,3351196159,US +3351196160,3351196671,VG +3351196672,3351197695,US +3351197696,3351197711,PT +3351197712,3351197715,US +3351197716,3351197719,GH +3351197720,3351197735,US +3351197736,3351197739,CY +3351197740,3351197743,US +3351197744,3351197751,VN +3351197752,3351197759,PT +3351197760,3351197767,US +3351197768,3351197775,IN +3351197776,3351197783,BR +3351197784,3351197791,US +3351197792,3351197795,IN +3351197796,3351197799,BR +3351197800,3351197803,CN +3351197804,3351197807,AE +3351197808,3351197835,US +3351197836,3351197839,BR +3351197840,3351197859,US +3351197860,3351197863,CY +3351197864,3351197867,US +3351197868,3351197871,CY +3351197872,3351197879,US +3351197880,3351197887,GH +3351197888,3351197891,MX +3351197892,3351197899,BR +3351197900,3351197903,CY +3351197904,3351198023,US +3351198024,3351198031,GH +3351198032,3351198059,US +3351198060,3351198063,GH +3351198064,3351198071,IN +3351198072,3351198091,US +3351198092,3351198095,GT +3351198096,3351198103,MX +3351198104,3351198111,VN +3351198112,3351198127,US +3351198128,3351198131,IN +3351198132,3351198135,BR +3351198136,3351198155,US +3351198156,3351198159,EG +3351198160,3351198171,US +3351198172,3351198175,GH +3351198176,3351198183,US +3351198184,3351198187,GH +3351198188,3351198215,US +3351198216,3351198223,VN +3351198224,3351198231,US +3351198232,3351198235,CA +3351198236,3351198239,US +3351198240,3351198247,TR +3351198248,3351198251,ID +3351198252,3351198255,GH +3351198256,3351198259,US +3351198260,3351198263,DE +3351198264,3351198335,US +3351198336,3351198351,CA +3351198352,3351198355,GT +3351198356,3351198359,US +3351198360,3351198363,GB +3351198364,3351198371,US +3351198372,3351198383,CA +3351198384,3351198387,GH +3351198388,3351198391,US +3351198392,3351198399,TR +3351198400,3351198403,US +3351198404,3351198407,IN +3351198408,3351198411,US +3351198412,3351198415,GB +3351198416,3351198423,GT +3351198424,3351198427,RO +3351198428,3351198431,US +3351198432,3351198439,IN +3351198440,3351198447,US +3351198448,3351198463,JO +3351198464,3351198475,US +3351198476,3351198479,CY +3351198480,3351198495,US +3351198496,3351198499,CN +3351198500,3351198519,US +3351198520,3351198527,IN +3351198528,3351198535,US +3351198536,3351198539,CY +3351198540,3351198559,US +3351198560,3351198563,ID +3351198564,3351198567,CN +3351198568,3351198575,US +3351198576,3351198579,CY +3351198580,3351198607,US +3351198608,3351198615,GR +3351198616,3351198619,MX +3351198620,3351198623,BD +3351198624,3351198627,CY +3351198628,3351198687,US +3351198688,3351198703,MA +3351198704,3351198711,IN +3351198712,3351232511,US +3351232512,3351232767,IL +3351232768,3351268111,US +3351268112,3351268115,GB +3351268116,3351268131,US +3351268132,3351268135,GB +3351268136,3351268493,US +3351268494,3351268494,DE +3351268495,3351268533,US +3351268534,3351268534,CN +3351268535,3351268537,US +3351268538,3351268538,CN +3351268539,3351268553,US +3351268554,3351268554,CN +3351268555,3351268565,US +3351268566,3351268566,MY +3351268567,3351268613,US +3351268614,3351268614,PA +3351268615,3351268617,US +3351268618,3351268618,IN +3351268619,3351268645,US +3351268646,3351268646,CN +3351268647,3351268653,US +3351268654,3351268654,BR +3351268655,3351268669,US +3351268670,3351268670,CN +3351268671,3351268721,US +3351268722,3351268722,DE +3351268723,3351268789,US +3351268790,3351268790,BR +3351268791,3351268809,US +3351268810,3351268810,CN +3351268811,3351268841,US +3351268842,3351268842,CN +3351268843,3351268953,US +3351268954,3351268954,DE +3351268955,3351268961,US +3351268962,3351268962,CN +3351268963,3351269033,US +3351269034,3351269034,CN +3351269035,3351269065,US +3351269066,3351269066,SE +3351269067,3351269217,US +3351269218,3351269218,DE +3351269219,3351269241,US +3351269242,3351269242,CA +3351269243,3351269257,US +3351269258,3351269258,DE +3351269259,3351269261,US +3351269262,3351269262,CN +3351269263,3351275519,US +3351275520,3351276543,CA +3351276544,3351293951,US +3351293952,3351294975,CA +3351294976,3351295999,US +3351296000,3351298047,CA +3351298048,3351303167,US +3351303168,3351304191,CA +3351304192,3351306239,US +3351306240,3351306751,VC +3351306752,3351307263,LC +3351307264,3351308287,US +3351308288,3351310335,CA +3351310336,3351310895,US +3351310896,3351310911,GB +3351310912,3351326719,US +3351326720,3351328767,CA +3351328768,3351329279,US +3351329280,3351329535,CA +3351329536,3351336959,US +3351336960,3351339007,CA +3351339008,3351353471,US +3351353472,3351353479,TR +3351353480,3351353503,US +3351353504,3351353511,AE +3351353512,3351353575,US +3351353576,3351353583,CA +3351353584,3351353631,US +3351353632,3351353663,TR +3351353664,3351353823,US +3351353824,3351353839,BR +3351353840,3351354111,US +3351354112,3351354367,PK +3351354368,3351357439,US +3351357440,3351359487,CA +3351359488,3351372799,US +3351372800,3351373823,BM +3351373824,3351380223,US +3351380224,3351380479,CA +3351380480,3351380991,US +3351380992,3351381759,CA +3351381760,3351382271,US +3351382272,3351382527,CA +3351382528,3351383039,US +3351383040,3351383295,CA +3351383296,3351384319,US +3351384320,3351384575,CA +3351384576,3351385343,US +3351385344,3351385599,CA +3351385600,3351386111,US +3351386112,3351386367,PR +3351386368,3351386623,US +3351386624,3351386879,CA +3351386880,3351387135,US +3351387136,3351387391,CA +3351387392,3351387903,US +3351387904,3351388159,CA +3351388160,3351388927,US +3351388928,3351389439,CA +3351389440,3351390463,US +3351390464,3351390975,CA +3351390976,3351394815,US +3351394816,3351395071,CA +3351395072,3351396095,US +3351396096,3351396351,CA +3351396352,3351397375,US +3351397376,3351397631,CA +3351397632,3351397887,US +3351397888,3351398143,CA +3351398144,3351398399,US +3351398400,3351398655,CA +3351398656,3351398911,US +3351398912,3351399167,CA +3351399168,3351399423,US +3351399424,3351399935,CA +3351399936,3351400191,US +3351400192,3351400447,CA +3351400448,3351400959,US +3351400960,3351401215,CA +3351401216,3351401983,US +3351401984,3351402239,CA +3351402240,3351402495,US +3351402496,3351403775,CA +3351403776,3351404031,US +3351404032,3351404287,CA +3351404288,3351405311,US +3351405312,3351405567,CA +3351405568,3351405823,US +3351405824,3351406079,CA +3351406080,3351407103,US +3351407104,3351407359,CA +3351407360,3351407615,US +3351407616,3351407871,CA +3351407872,3351408895,US +3351408896,3351409407,CA +3351409408,3351410687,US +3351410688,3351410943,CA +3351410944,3351411711,US +3351411712,3351411967,CA +3351411968,3351412223,US +3351412224,3351412479,CA +3351412480,3351412735,US +3351412736,3351413247,CA +3351413248,3351413503,US +3351413504,3351413759,CA +3351413760,3351414271,US +3351414272,3351414783,CA +3351414784,3351415039,US +3351415040,3351415551,CA +3351415552,3351415807,US +3351415808,3351416063,CA +3351416064,3351417087,US +3351417088,3351417599,CA +3351417600,3351419647,US +3351419648,3351419903,CA +3351419904,3351423743,US +3351423744,3351423999,PR +3351424000,3351428351,US +3351428352,3351428607,CA +3351428608,3351436031,US +3351436032,3351436287,CA +3351436288,3351436543,US +3351436544,3351436799,PR +3351436800,3351437055,US +3351437056,3351437311,CA +3351437312,3351437567,US +3351437568,3351437823,CA +3351437824,3351438079,US +3351438080,3351438335,CA +3351438336,3351438591,US +3351438592,3351439103,CA +3351439104,3351441151,US +3351441152,3351441407,CA +3351441408,3351441919,US +3351441920,3351442175,CA +3351442176,3351474687,US +3351474688,3351475199,CA +3351475200,3351475711,US +3351475712,3351475967,IS +3351475968,3351483391,US +3351483392,3351484415,CA +3351484416,3351486463,US +3351486464,3351488511,CA +3351488512,3351494911,US +3351494912,3351495195,SG +3351495196,3351495196,US +3351495197,3351495679,SG +3351495680,3351495935,US +3351495936,3351495989,SG +3351495990,3351495990,US +3351495991,3351496191,SG +3351496192,3351497727,US +3351497728,3351498751,CA +3351498752,3351501823,US +3351501824,3351502847,JM +3351502848,3351503871,US +3351503872,3351504895,CA +3351504896,3351512575,US +3351512576,3351513087,CA +3351513088,3351524095,US +3351524096,3351524351,GB +3351524352,3351614975,US +3351614976,3351615231,SG +3351615232,3351615487,US +3351615488,3351617535,TW +3351617536,3351619583,DE +3351619584,3351642111,US +3351642112,3351695871,CA +3351695872,3351696383,US +3351696384,3351696639,CA +3351696640,3351697407,US +3351697408,3351698431,CA +3351698432,3351698943,US +3351698944,3351699455,CA +3351699456,3351706367,US +3351706368,3351706623,CA +3351706624,3351855615,US +3351855616,3351855871,GB +3351855872,3351860223,US +3351860224,3351861247,KY +3351861248,3351869439,US +3351869440,3351871487,CA +3351871488,3351895551,US +3351895552,3351895807,CA +3351895808,3351904255,US +3351904256,3351912703,CA +3351912704,3351912959,US +3351912960,3351933951,CA +3351933952,3351939071,US +3351939072,3351959551,CA +3351959552,3351961599,US +3351961600,3351963647,CA +3351963648,3351969279,US +3351969280,3351969535,CA +3351969536,3351969791,US +3351969792,3352035327,IL +3352035328,3352036351,CA +3352036352,3352046591,US +3352046592,3352046783,CA +3352046784,3352046799,US +3352046800,3352049663,CA +3352049664,3352051711,US +3352051712,3352055807,CA +3352055808,3352066047,US +3352066048,3352067071,CA +3352067072,3352068095,US +3352068096,3352069119,CA +3352069120,3352069919,US +3352069920,3352069935,CO +3352069936,3352069943,US +3352069944,3352069951,BD +3352069952,3352088575,US +3352088576,3352090623,CA +3352090624,3352094719,US +3352094720,3352096767,VG +3352096768,3352559871,US +3352559872,3352563199,CA +3352563200,3352563455,US +3352563456,3352573951,CA +3352573952,3352574207,US +3352574464,3352575743,CA +3352575744,3352575999,US +3352576000,3352581631,CA +3352581632,3352582143,US +3352582144,3352583935,CA +3352583936,3352584191,US +3352584192,3352591359,CA +3352591360,3352591615,US +3352591616,3352615423,CA +3352615424,3352616959,US +3352616960,3352887295,CA +3352887296,3352916379,US +3352916380,3352916380,VE +3352916381,3352916479,US +3352916480,3352916506,BR +3352916507,3352916507,US +3352916508,3352916512,BR +3352916513,3352916513,US +3352916514,3352916514,BR +3352916515,3352916515,US +3352916516,3352916527,BR +3352916528,3352916530,US +3352916531,3352916533,BR +3352916534,3352916534,US +3352916535,3352916541,BR +3352916542,3352916542,US +3352916543,3352916557,BR +3352916558,3352916561,US +3352916562,3352916562,GB +3352916563,3352916564,BR +3352916565,3352916566,US +3352916567,3352916584,BR +3352916585,3352916586,US +3352916587,3352916593,BR +3352916594,3352916607,US +3352916608,3352916615,BR +3352916616,3352916619,US +3352916620,3352916635,BR +3352916636,3352916636,US +3352916637,3352916638,BR +3352916639,3352916639,DE +3352916640,3352916640,BR +3352916641,3352916648,US +3352916649,3352916689,BR +3352916690,3352916690,US +3352916691,3352916694,BR +3352916695,3352918015,US +3352918016,3352919039,CA +3352919040,3353335303,US +3353335304,3353335307,NL +3353335308,3353335311,US +3353335312,3353335313,NL +3353335314,3353335315,US +3353335316,3353335323,NL +3353335324,3353335331,US +3353335332,3353335333,NL +3353335334,3353335335,US +3353335336,3353335339,NL +3353335340,3353335341,US +3353335342,3353335347,NL +3353335348,3353335353,US +3353335354,3353335359,NL +3353335360,3353335361,US +3353335362,3353335363,NL +3353335364,3353335374,US +3353335375,3353335376,NL +3353335377,3353335378,US +3353335379,3353335380,NL +3353335381,3353335382,US +3353335383,3353335386,NL +3353335387,3353335388,US +3353335389,3353335390,NL +3353335391,3353335392,US +3353335393,3353335394,NL +3353335395,3353335396,US +3353335397,3353335402,NL +3353335403,3353335407,US +3353335408,3353335411,NL +3353335412,3353335416,US +3353335417,3353335420,NL +3353335421,3353335422,US +3353335423,3353335424,NL +3353335425,3353335426,US +3353335427,3353335435,NL +3353335436,3353335437,US +3353335438,3353335445,NL +3353335446,3353335451,US +3353335452,3353335455,NL +3353335456,3353335458,US +3353335459,3353335460,NL +3353335461,3353335462,US +3353335463,3353335468,NL +3353335469,3353335471,US +3353335472,3353335473,NL +3353335474,3353335474,US +3353335475,3353335476,NL +3353335477,3353335485,US +3353335486,3353335487,NL +3353335488,3353335491,US +3353335492,3353335499,NL +3353335500,3353335505,US +3353335506,3353335507,NL +3353335508,3353335513,US +3353335514,3353335515,NL +3353335516,3353335517,US +3353335518,3353335519,NL +3353335520,3353335521,US +3353335522,3353335529,NL +3353335530,3353335559,US +3353335560,3353335591,NL +3353335592,3353335596,US +3353335597,3353335598,NL +3353335599,3353335600,US +3353335601,3353335606,NL +3353335607,3353335614,US +3353335615,3353335616,NL +3353335617,3353335619,US +3353335620,3353335655,NL +3353335656,3353335662,US +3353335663,3353335664,NL +3353335665,3353335666,US +3353335667,3353335668,NL +3353335669,3353335670,US +3353335671,3353335676,NL +3353335677,3353335681,US +3353335682,3353335683,NL +3353335684,3353335686,US +3353335687,3353335702,NL +3353335703,3353335704,US +3353335705,3353335706,NL +3353335707,3353335708,US +3353335709,3353335710,NL +3353335711,3353335712,US +3353335713,3353335716,NL +3353335717,3353335718,US +3353335719,3353335722,NL +3353335723,3353335728,US +3353335729,3353335739,NL +3353335740,3353335741,US +3353335742,3353335745,NL +3353335746,3353335747,US +3353335748,3353335749,NL +3353335750,3353335750,US +3353335751,3353335758,NL +3353335759,3353335767,US +3353335768,3353335769,NL +3353335770,3353335778,US +3353335779,3353335789,NL +3353335790,3353335792,US +3353335793,3353335794,NL +3353335795,3353653503,US +3353653504,3353653759,GB +3353653760,3353688063,US +3353688064,3353688575,GB +3353688576,3353722367,US +3353722368,3353722623,GB +3353722624,3353726975,US +3353726976,3353727231,IN +3353727232,3353729023,US +3353729024,3353729279,HK +3353729280,3353730047,US +3353730048,3353731071,CA +3353731072,3353731775,US +3353731776,3353731823,IL +3353731824,3353731999,US +3353732000,3353732031,CN +3353732032,3353732159,US +3353732160,3353732191,CA +3353732192,3353732351,US +3353732352,3353732863,DE +3353732864,3353736191,US +3353736192,3353736959,PR +3353736960,3353737215,US +3353737216,3353737471,GB +3353737472,3353739775,US +3353739776,3353740007,HK +3353740008,3353740015,SG +3353740016,3353740031,CN +3353740032,3353740263,HK +3353740264,3353740271,SG +3353740272,3353740287,CN +3353740288,3353752585,US +3353752586,3353752589,BE +3353752590,3353753055,US +3353753056,3353753059,BR +3353753060,3353780223,US +3353780224,3353780479,GB +3353780480,3353821183,US +3353821184,3353821199,CN +3353821200,3353821215,US +3353821216,3353821279,CN +3353821280,3353821284,US +3353821285,3353821295,CN +3353821296,3353821296,US +3353821297,3353821300,CN +3353821301,3353821301,US +3353821302,3353821302,CN +3353821303,3353821303,US +3353821304,3353821306,CN +3353821307,3353821308,US +3353821309,3353821309,CN +3353821310,3353821311,US +3353821312,3353821719,CN +3353821720,3353821727,US +3353821728,3353822375,CN +3353822376,3353822383,US +3353822384,3353822687,CN +3353822688,3353822719,US +3353822720,3353822967,CN +3353822968,3353822975,US +3353822976,3353823231,CN +3353823232,3353836535,US +3353836536,3353836543,RO +3353836544,3353836799,US +3353836800,3353837311,CA +3353837312,3353855999,US +3353856000,3353858047,CA +3353858048,3353861119,US +3353861120,3353862143,CA +3353862144,3353862719,US +3353862720,3353862751,CA +3353862752,3353864959,US +3353864960,3353865215,CA +3353865216,3353884927,US +3353884928,3353885183,GB +3353885184,3353939711,US +3353939712,3353939967,CA +3353939968,3353942527,US +3353942528,3353943039,CA +3353943040,3353960191,US +3353960192,3353960447,CA +3353960448,3353979647,US +3353979648,3353979903,CA +3353979904,3353982719,US +3353982720,3353983231,CA +3353983232,3353989631,US +3353989632,3353989887,CA +3353989888,3354066943,US +3354066944,3354132479,CA +3354132480,3354467748,US +3354467749,3354467749,BL +3354467750,3354467811,US +3354467812,3354467812,BL +3354467813,3354467898,US +3354467899,3354467899,NL +3354467900,3354467966,US +3354467967,3354467967,CA +3354467968,3354467969,US +3354467970,3354467970,CA +3354467971,3354468164,US +3354468165,3354468165,IN +3354468166,3354468299,US +3354468300,3354468300,PK +3354468301,3354468351,US +3354476032,3354484911,US +3354484912,3354484927,GB +3354484928,3354485375,US +3354485376,3354485439,GB +3354485440,3354492927,US +3354492928,3354494975,CA +3354494976,3354499071,US +3354499072,3354501119,AU +3354501120,3354503167,CA +3354503168,3354507263,US +3354507264,3354507267,PK +3354507268,3354507271,US +3354507272,3354507279,ID +3354507280,3354507283,NZ +3354507284,3354507287,US +3354507288,3354507291,CY +3354507292,3354507295,US +3354507296,3354507299,BR +3354507300,3354507303,US +3354507304,3354507315,BR +3354507316,3354507319,US +3354507320,3354507323,PK +3354507324,3354507343,US +3354507344,3354507347,CA +3354507348,3354507351,CN +3354507352,3354507363,US +3354507364,3354507367,CY +3354507368,3354507375,CA +3354507376,3354507383,US +3354507384,3354507387,CN +3354507388,3354507391,US +3354507392,3354507399,CA +3354507400,3354507403,EG +3354507404,3354507407,CN +3354507408,3354507431,US +3354507432,3354507439,BR +3354507440,3354507443,CY +3354507444,3354507451,US +3354507452,3354507455,AU +3354507456,3354507459,US +3354507460,3354507463,BR +3354507464,3354507467,US +3354507468,3354507471,CY +3354507472,3354507475,US +3354507476,3354507479,CY +3354507480,3354507483,MM +3354507484,3354507511,US +3354507512,3354507519,MA +3354507520,3354507535,US +3354507536,3354507539,ID +3354507540,3354507543,HU +3354507544,3354507551,US +3354507552,3354507559,NI +3354507560,3354507567,ID +3354507568,3354507591,US +3354507592,3354507599,CY +3354507600,3354507623,US +3354507624,3354507631,CN +3354507632,3354507639,US +3354507640,3354507643,CN +3354507644,3354507647,MM +3354507648,3354507655,US +3354507656,3354507659,CA +3354507660,3354507667,CY +3354507668,3354507671,BR +3354507672,3354507679,US +3354507680,3354507683,GH +3354507684,3354507687,PT +3354507688,3354507691,CA +3354507692,3354507695,VN +3354507696,3354507703,US +3354507704,3354507711,NZ +3354507712,3354507719,US +3354507720,3354507723,VN +3354507724,3354507727,US +3354507728,3354507735,BR +3354507736,3354507743,IN +3354507744,3354507747,TH +3354507748,3354507751,US +3354507752,3354507759,MX +3354507760,3354507775,US +3354507776,3354507779,CY +3354507780,3354507787,US +3354507788,3354507791,CY +3354507792,3354507803,US +3354507804,3354507807,CY +3354507808,3354507835,US +3354507836,3354507839,CY +3354507840,3354507847,PA +3354507848,3354507855,CY +3354507856,3354507863,US +3354507864,3354507871,GR +3354507872,3354507887,US +3354507888,3354507895,BR +3354507896,3354507903,CY +3354507904,3354507907,US +3354507908,3354507911,IN +3354507912,3354507915,ID +3354507916,3354507919,FR +3354507920,3354507931,US +3354507932,3354507943,CY +3354507944,3354507959,US +3354507960,3354507967,GH +3354507968,3354507983,MX +3354507984,3354507991,AE +3354507992,3354508015,US +3354508016,3354508031,MX +3354508032,3354508043,US +3354508044,3354508047,DK +3354508048,3354508051,US +3354508052,3354508059,VN +3354508060,3354508063,BR +3354508064,3354508071,US +3354508072,3354508075,CY +3354508076,3354508079,RU +3354508080,3354508083,US +3354508084,3354508087,VN +3354508088,3354508095,AU +3354508096,3354508099,CY +3354508100,3354508107,US +3354508108,3354508111,BD +3354508112,3354508115,CY +3354508116,3354508119,US +3354508120,3354508123,BR +3354508124,3354508135,US +3354508136,3354508139,IN +3354508140,3354508143,CY +3354508144,3354508147,MY +3354508148,3354508151,BB +3354508152,3354508159,US +3354508160,3354508163,GH +3354508164,3354508167,CY +3354508168,3354508191,US +3354508192,3354508195,IN +3354508196,3354508199,US +3354508200,3354508203,CA +3354508204,3354508215,US +3354508216,3354508219,MX +3354508220,3354508223,IN +3354508224,3354508235,US +3354508236,3354508239,CA +3354508240,3354508255,US +3354508256,3354508259,EG +3354508260,3354508263,US +3354508264,3354508267,TH +3354508268,3354508271,US +3354508272,3354508275,TW +3354508276,3354508279,US +3354508280,3354508287,AE +3354508288,3354508303,CY +3354508304,3354508311,US +3354508312,3354508319,VN +3354508320,3354508327,US +3354508328,3354508335,AE +3354508336,3354508347,US +3354508348,3354508351,CA +3354508352,3354508375,US +3354508376,3354508383,MA +3354508384,3354508395,US +3354508396,3354508399,VN +3354508400,3354508439,US +3354508440,3354508447,AE +3354508448,3354508487,US +3354508488,3354508491,VN +3354508492,3354508495,CY +3354508496,3354508527,US +3354508528,3354508535,AE +3354508536,3354508543,BD +3354508544,3354508567,US +3354508568,3354508571,GH +3354508572,3354508575,CN +3354508576,3354508579,BR +3354508580,3354508603,US +3354508604,3354508607,CY +3354508608,3354508623,US +3354508624,3354508639,MX +3354508640,3354508679,US +3354508680,3354508683,CY +3354508684,3354508687,PK +3354508688,3354508703,US +3354508704,3354508735,AE +3354508736,3354508743,PK +3354508744,3354508751,IN +3354508752,3354508847,US +3354508848,3354508855,MA +3354508856,3354508863,US +3354508864,3354508895,CY +3354508896,3354508927,US +3354508928,3354508943,GB +3354508944,3354508951,US +3354508952,3354508959,PK +3354508960,3354508991,EG +3354508992,3354508999,RU +3354509000,3354509019,US +3354509020,3354509023,GR +3354509024,3354509027,BR +3354509028,3354509031,US +3354509032,3354509039,CY +3354509040,3354509183,US +3354509184,3354509191,BR +3354509192,3354509247,US +3354509248,3354509255,BR +3354509256,3354509263,US +3354509264,3354509279,BR +3354509280,3354509283,AU +3354509284,3354509287,GH +3354509288,3354509291,CY +3354509292,3354509295,IN +3354509296,3354509299,CA +3354509300,3354509391,US +3354509392,3354509399,CN +3354509400,3354509551,US +3354509552,3354509567,CN +3354509568,3354509631,US +3354509632,3354509647,GB +3354509648,3354509695,US +3354509696,3354509703,GB +3354509704,3354509783,US +3354509784,3354509791,BR +3354509792,3354509807,US +3354509808,3354509823,SG +3354509824,3354509895,US +3354509896,3354509903,BR +3354509904,3354510063,US +3354510064,3354510079,BR +3354510080,3354513151,US +3354513152,3354513407,CA +3354513408,3354515711,US +3354515712,3354515775,CA +3354515776,3354515967,US +3354515968,3354516031,CA +3354516032,3354516223,US +3354516224,3354516287,CA +3354516288,3354534147,US +3354534148,3354534159,IE +3354534160,3354591231,US +3354591232,3354656767,CA +3354656768,3354676223,US +3354676224,3354677247,CA +3354677248,3354686975,US +3354686976,3354687231,CN +3354687232,3354687487,US +3354687488,3354688511,CA +3354688512,3354707455,US +3354707456,3354707967,CA +3354707968,3354708207,US +3354708208,3354708223,CA +3354708224,3354770687,US +3354770688,3354770943,CA +3354770944,3354788095,US +3354788096,3354789887,CA +3354789888,3354790399,US +3354790400,3354806383,CA +3354806384,3354806399,US +3354806400,3354806639,CA +3354806640,3354806655,SE +3354806656,3354807551,CA +3354807552,3354810367,US +3354810368,3354814975,CA +3354814976,3354815231,US +3354815232,3354823423,CA +3354823424,3354823679,US +3354823680,3354853119,CA +3354853120,3354853375,US +3354853376,3354869759,CA +3354869760,3354873855,US +3354873856,3354875391,CA +3354875392,3354875903,US +3354875904,3354918911,CA +3354918912,3354955775,US +3354955776,3354956031,AR +3354956032,3354972159,US +3354972160,3354972415,CA +3354972416,3355012607,US +3355012608,3355017215,CA +3355017216,3355052287,US +3355052288,3355052543,HK +3355052544,3355053055,CA +3355053056,3355249151,US +3355249152,3355249663,CA +3355249664,3355260927,US +3355260928,3355262719,CA +3355262720,3355310591,US +3355310592,3355311103,CA +3355311104,3355319295,US +3355319296,3355320319,CA +3355320320,3355324415,US +3355324416,3355328511,CA +3355328512,3355338751,US +3355338752,3355340799,BB +3355340800,3355351039,US +3355351040,3355351295,CA +3355351296,3355372287,US +3355372288,3355372543,CA +3355372544,3355384095,US +3355384096,3355384127,AR +3355384128,3355384831,US +3355384832,3355385855,CA +3355385856,3355389439,US +3355389440,3355389695,GB +3355389696,3355389951,JP +3355389952,3355407359,US +3355407360,3355408383,PR +3355408384,3355412771,US +3355412772,3355412775,CY +3355412776,3355412791,US +3355412792,3355412795,CY +3355412796,3355412799,US +3355412800,3355412803,CY +3355412804,3355412807,CN +3355412808,3355412815,US +3355412816,3355412823,EG +3355412824,3355412991,US +3355412992,3355413023,IN +3355413024,3355413055,US +3355413056,3355413087,IN +3355413088,3355417799,US +3355417800,3355417803,CN +3355417804,3355417999,US +3355418000,3355418015,BE +3355418016,3355418023,AE +3355418024,3355418063,US +3355418064,3355418071,CA +3355418072,3355418079,IL +3355418080,3355418111,CN +3355418112,3355418367,US +3355418368,3355418371,BR +3355418372,3355418375,US +3355418376,3355418383,GH +3355418384,3355418395,US +3355418396,3355418399,GT +3355418400,3355418431,BE +3355418432,3355418455,GB +3355418456,3355418463,AE +3355418464,3355418527,US +3355418528,3355418535,BR +3355418536,3355418551,US +3355418552,3355418555,CY +3355418556,3355418567,US +3355418568,3355418575,MX +3355418576,3355418591,GB +3355418592,3355418607,US +3355418608,3355418615,MX +3355418616,3355418619,US +3355418620,3355418623,CY +3355418624,3355432959,US +3355432960,3355435007,CA +3355435008,3355443199,US +3355443200,3355445247,EC +3355445248,3355447295,BR +3355447296,3355447551,CU +3355447552,3355447807,AR +3355447808,3355448063,HT +3355448064,3355448319,AR +3355448320,3355448831,CW +3355448832,3355449343,SX +3355449344,3355450367,CU +3355450368,3355451391,EC +3355451392,3355458559,BR +3355458560,3355458591,HN +3355458592,3355458599,US +3355458600,3355459071,HN +3355459072,3355459327,BR +3355459328,3355459583,EC +3355459840,3355460095,VE +3355460096,3355460351,CL +3355460608,3355461119,UY +3355461120,3355461887,BR +3355461888,3355463423,EC +3355463424,3355463935,AR +3355463936,3355464191,BR +3355464192,3355464447,CL +3355464448,3355464959,MX +3355464960,3355465215,BR +3355465216,3355465983,UY +3355465984,3355466239,BR +3355466240,3355467263,MX +3355467264,3355467519,US +3355467520,3355467775,MX +3355467776,3355468799,AR +3355468800,3355469567,BR +3355469568,3355470591,MX +3355470592,3355470847,PE +3355470848,3355471103,CL +3355471104,3355471359,MX +3355471360,3355471615,PE +3355471616,3355472383,MX +3355472384,3355472639,BR +3355472640,3355473407,CL +3355473408,3355473919,PE +3355473920,3355475199,CL +3355475200,3355477503,MX +3355477504,3355478015,BR +3355478016,3355478271,PE +3355478272,3355478783,US +3355478784,3355479039,VE +3355479040,3355479551,CL +3355479552,3355479807,PE +3355479808,3355480063,MX +3355480064,3355485183,CL +3355485184,3355487743,PE +3355487744,3355487999,CL +3355488000,3355488255,AR +3355488256,3355488767,GT +3355488768,3355489023,PA +3355489024,3355489279,CR +3355489280,3355489535,SV +3355489536,3355491071,AR +3355491072,3355491327,CO +3355491328,3355494655,AR +3355494656,3355494911,CO +3355495424,3355496447,UY +3355496448,3355498495,AR +3355498496,3355500543,US +3355500544,3355508735,AR +3355508736,3355510271,VE +3355510272,3355510527,EC +3355510528,3355510783,AR +3355510784,3355512831,VE +3355512832,3355516927,CL +3355516928,3355525119,AR +3355525120,3355535359,CO +3355535360,3355537407,TT +3355537664,3355537919,AR +3355538176,3355538431,CL +3355538432,3355539199,AR +3355539200,3355539455,VE +3355539456,3355540479,CL +3355540480,3355540735,CO +3355540736,3355540991,BR +3355540992,3355541503,CO +3355541504,3355545599,CL +3355545600,3355547647,VE +3355547648,3355547903,NI +3355547904,3355548159,GT +3355548160,3355548671,DO +3355548672,3355549695,SR +3355549696,3355549951,BM +3355549952,3355550207,EC +3355550208,3355552767,VE +3355552768,3355553023,EC +3355553024,3355553279,CO +3355553280,3355553535,CL +3355553536,3355553791,CO +3355553792,3355555839,PE +3355555840,3355557887,VE +3355557888,3355559935,CO +3355559936,3355561983,PY +3355561984,3355564031,SR +3355564032,3355566079,BR +3355566080,3355574271,AR +3355574272,3355576319,CL +3355576320,3355578367,VE +3355578368,3355582463,CL +3355582464,3355590655,UY +3355590656,3355592703,CO +3355592704,3355599871,CL +3355599872,3355600895,BR +3355600896,3355604991,CL +3355604992,3355607039,AR +3355607040,3355608057,HT +3355608058,3355608058,IL +3355608059,3355615231,HT +3355615232,3355623423,SR +3355623424,3355639807,CL +3355639808,3355642367,VE +3355642880,3355643903,UY +3355643904,3355647999,BR +3355648000,3355668991,AR +3355668992,3355669247,PE +3355669248,3355672575,AR +3355672576,3355677183,CO +3355677184,3355677439,GT +3355677440,3355682815,CO +3355682816,3355684863,AR +3355684864,3355686911,TT +3355686912,3355688959,AR +3355688960,3355689471,CO +3355689472,3355689727,HN +3355689728,3355689983,AR +3355691008,3355693055,PA +3355693056,3355695103,CL +3355695104,3355697151,AR +3355697152,3355701503,HN +3355701504,3355702015,PE +3355702016,3355702271,AR +3355702272,3355703295,CO +3355703296,3355705343,PY +3355705344,3355709439,MX +3355709440,3355713535,CO +3355713536,3355720447,MX +3355720448,3355720703,AR +3355720704,3355722751,MX +3355722752,3355723263,AR +3355723264,3355746303,MX +3355746304,3355754495,HT +3355754496,3355770879,PE +3355770880,3355773183,PR +3355773184,3355773439,BR +3355773440,3355773695,AR +3355773696,3355773951,PR +3355773952,3355774975,CU +3355774976,3355779071,VE +3355779072,3355781119,BR +3355781120,3355783167,VE +3355783168,3355787263,CR +3355787264,3355803647,AR +3355803648,3355820031,VE +3355820032,3355836415,AR +3355836416,3355841023,EC +3355841024,3355841279,CL +3355841280,3355843327,EC +3355843328,3355843583,VE +3355843584,3355844863,EC +3355844864,3355845119,CL +3355845120,3355845375,EC +3355845376,3355848959,BR +3355849728,3355849983,PA +3355849984,3355850495,CL +3355850496,3355850751,NI +3355850752,3355852799,CW +3355852800,3355856639,CL +3355856640,3355856895,PA +3355860992,3355869183,CL +3355869184,3355870719,BR +3355870720,3355871231,CR +3355871232,3355873279,BR +3355873280,3355875327,BQ +3355875328,3355877375,PA +3355877376,3355885567,CO +3355885568,3355901951,GT +3355901952,3355902975,BR +3355902976,3355903999,CL +3355904000,3355905535,BR +3355905536,3355905791,PY +3355905792,3355906047,AR +3355906048,3355910143,CL +3355910144,3355918335,SX +3355918336,3355923455,EC +3355923456,3355924479,UY +3355924480,3355926527,TT +3355926528,3355927039,NL +3355927040,3355928063,US +3355928064,3355928575,CA +3355928576,3355929087,GB +3355929088,3355929599,US +3355929600,3355930367,PA +3355930368,3355930623,HK +3355930624,3355934719,BR +3355934720,3355939839,AR +3355939840,3355940863,SR +3355940864,3355942911,AR +3355942912,3355947007,BO +3355947008,3355949055,AR +3355949056,3355951103,CW +3355951104,3355967487,EC +3355967488,3356033023,VE +3356033024,3356033791,BR +3356033792,3356034047,CL +3356034048,3356035071,PY +3356035072,3356037119,MX +3356037120,3356041215,BR +3356041216,3356049407,CR +3356049408,3356049663,CL +3356049664,3356051455,BR +3356051456,3356051711,CO +3356051712,3356051967,CL +3356051968,3356052223,GT +3356052224,3356052479,AR +3356052480,3356053247,BR +3356053248,3356054015,CL +3356054016,3356054527,US +3356054528,3356057087,BR +3356057088,3356057343,CO +3356057344,3356057599,BR +3356057600,3356057855,EC +3356057856,3356059135,CL +3356059136,3356060671,BR +3356060672,3356061695,CL +3356061696,3356062207,BR +3356062208,3356062463,CL +3356062464,3356062719,JM +3356062720,3356063743,CR +3356063744,3356064255,HN +3356064256,3356064511,CL +3356064512,3356065791,BR +3356065792,3356066047,CL +3356066048,3356069119,BR +3356069120,3356069631,CL +3356069632,3356070143,BR +3356070144,3356070655,CL +3356070656,3356070911,AR +3356070912,3356071423,BR +3356071424,3356072447,CL +3356073216,3356073471,AR +3356073472,3356073983,CO +3356073984,3356075263,BR +3356075264,3356076287,BO +3356076288,3356076543,AR +3356076544,3356077567,MX +3356077568,3356078079,BR +3356078080,3356078335,EC +3356078336,3356079359,CL +3356079360,3356079615,AR +3356079616,3356080639,MX +3356080640,3356080895,BR +3356080896,3356082431,NI +3356082432,3356082687,CL +3356082688,3356082943,AR +3356082944,3356083967,CL +3356083968,3356084479,BR +3356084480,3356084735,CL +3356084736,3356085247,BR +3356085248,3356085759,CL +3356085760,3356086271,BR +3356086272,3356086527,AR +3356086528,3356087295,CR +3356087296,3356087807,AR +3356087808,3356088063,BR +3356088064,3356088319,CL +3356088320,3356089087,TT +3356089088,3356089343,AR +3356089344,3356090623,BR +3356090624,3356090879,CL +3356090880,3356091391,AR +3356091392,3356091647,CL +3356091648,3356091903,AR +3356091904,3356093183,CL +3356093184,3356093951,AR +3356093952,3356094975,CL +3356094976,3356096255,AR +3356096256,3356096511,CL +3356096512,3356096767,EC +3356096768,3356097023,BR +3356097024,3356097535,CL +3356097536,3356097791,BR +3356097792,3356098303,AR +3356098304,3356098559,GT +3356098560,3356099583,CL +3356099584,3356100607,BR +3356100608,3356102399,CL +3356102400,3356102655,PA +3356102656,3356105727,CL +3356105728,3356106751,SV +3356106752,3356106975,US +3356106976,3356107007,FR +3356107008,3356107263,US +3356107264,3356107327,BR +3356107328,3356107519,US +3356107520,3356107551,BR +3356107552,3356107775,US +3356107776,3356107975,HN +3356107976,3356107983,IS +3356107984,3356108063,HN +3356108064,3356108071,IT +3356108072,3356108511,HN +3356108512,3356108519,US +3356108520,3356109119,HN +3356109120,3356109135,FR +3356109136,3356110015,HN +3356110016,3356110031,US +3356110032,3356110335,HN +3356110336,3356110847,US +3356110848,3356113919,BR +3356113920,3356114943,UY +3356114944,3356123135,PE +3356123136,3356131839,AR +3356131840,3356132351,PE +3356132352,3356133375,BR +3356133376,3356133887,CO +3356133888,3356134143,BR +3356134144,3356134655,AR +3356134656,3356134911,PY +3356134912,3356135167,DO +3356135168,3356135423,MX +3356135424,3356135679,PA +3356135680,3356135935,CR +3356135936,3356136191,BR +3356136192,3356137471,EC +3356137472,3356137727,JM +3356137728,3356137983,HN +3356137984,3356138239,CO +3356138240,3356138495,US +3356138496,3356139007,BO +3356139008,3356139263,CL +3356139264,3356139519,BR +3356139520,3356139775,US +3356139776,3356140031,AR +3356140032,3356140287,DO +3356140288,3356140543,BR +3356140544,3356140799,CO +3356140800,3356141311,BM +3356141312,3356142847,CL +3356142848,3356143103,GT +3356143104,3356143615,CO +3356143616,3356144127,CR +3356144128,3356144639,BR +3356144640,3356145151,AR +3356145152,3356145407,CL +3356145408,3356145663,BR +3356145664,3356145919,CL +3356145920,3356146175,BR +3356146176,3356146431,AR +3356146432,3356146687,BR +3356146688,3356146943,PE +3356146944,3356147199,BR +3356147200,3356147455,CL +3356147456,3356147711,AR +3356147712,3356148223,BR +3356148224,3356148479,BZ +3356148480,3356148735,CL +3356148736,3356148991,AR +3356148992,3356149503,MX +3356149504,3356149759,AR +3356149760,3356150015,MX +3356150016,3356150527,AR +3356150528,3356150783,PA +3356150784,3356151039,AR +3356151040,3356151295,NI +3356151296,3356151551,BR +3356151552,3356151807,AR +3356151808,3356152063,CL +3356152064,3356152319,EC +3356152320,3356152575,MX +3356152576,3356152831,CL +3356152832,3356154623,MX +3356154624,3356154879,AR +3356154880,3356156671,CL +3356156672,3356156927,BR +3356156928,3356157951,PY +3356157952,3356158207,CL +3356158208,3356158463,MX +3356158464,3356158719,CL +3356158976,3356159743,CL +3356159744,3356159999,BR +3356160000,3356160255,MX +3356160256,3356160511,GT +3356160512,3356160767,CL +3356160768,3356161279,MX +3356161280,3356161535,BR +3356161536,3356162559,MX +3356162560,3356162815,PE +3356162816,3356163583,CL +3356163584,3356163839,VE +3356163840,3356164095,CL +3356164096,3356171519,BR +3356171520,3356171775,AR +3356171776,3356172031,NI +3356172032,3356172287,SV +3356172288,3356174335,PE +3356174336,3356176383,CO +3356176384,3356180479,PE +3356180480,3356190719,CL +3356192768,3356194815,AR +3356196864,3356229631,VE +3356229632,3356233727,BR +3356233728,3356237823,CL +3356237824,3356246015,GT +3356246016,3356262655,MX +3356262656,3356263167,CL +3356263168,3356263423,BR +3356263424,3356263679,CL +3356263680,3356265215,AR +3356265216,3356265471,BR +3356265472,3356267007,CL +3356267008,3356267263,PY +3356267264,3356268799,CL +3356269056,3356269311,AR +3356269312,3356269823,UY +3356269824,3356270079,BR +3356270080,3356272383,MX +3356272384,3356272639,CR +3356272640,3356272895,US +3356272896,3356273151,EC +3356273152,3356273407,CO +3356273408,3356273663,CL +3356273664,3356274431,SV +3356274432,3356278783,CO +3356278784,3356279039,AR +3356279040,3356279295,VE +3356279296,3356279807,CL +3356279808,3356280831,EC +3356280832,3356282879,AR +3356282880,3356284927,PA +3356284928,3356286975,AR +3356286976,3356287487,US +3356287488,3356287743,SV +3356287744,3356288255,HN +3356288256,3356288767,SV +3356288768,3356289023,GT +3356289024,3356289791,SV +3356289792,3356289799,US +3356289800,3356289807,GT +3356289808,3356289823,SV +3356289824,3356289887,US +3356289888,3356289919,SV +3356289920,3356289951,US +3356289952,3356289983,GT +3356289984,3356290303,US +3356290304,3356290559,SV +3356290560,3356291071,CR +3356291072,3356293119,TT +3356293120,3356295167,BO +3356295168,3356297215,CL +3356297216,3356299263,BR +3356299264,3356305663,MX +3356305664,3356307455,AR +3356307456,3356316415,MX +3356316416,3356316671,AR +3356317696,3356328959,MX +3356328960,3356329983,HN +3356329984,3356332031,GF +3356332032,3356334079,CU +3356334080,3356336127,BO +3356336128,3356336895,SV +3356336896,3356337919,HN +3356337920,3356340479,SV +3356340480,3356340735,HN +3356340736,3356340991,SV +3356340992,3356341247,HN +3356341248,3356341503,SV +3356341504,3356342015,HN +3356342016,3356343039,SV +3356343040,3356343295,HN +3356343296,3356344319,SV +3356344320,3356360703,CO +3356360704,3356362751,CL +3356362752,3356364799,VE +3356364800,3356368895,MX +3356368896,3356369407,BR +3356369408,3356369663,EC +3356369664,3356369919,BR +3356369920,3356370175,DO +3356370176,3356370943,AR +3356370944,3356372991,CO +3356372992,3356375039,CU +3356377088,3356379647,CL +3356379648,3356380159,AR +3356380160,3356380927,CL +3356380928,3356381183,DO +3356381184,3356381439,CL +3356381696,3356381951,CL +3356381952,3356382207,EC +3356382208,3356389375,CL +3356389376,3356389887,CO +3356389888,3356390399,CL +3356390400,3356390655,AR +3356390656,3356391167,CL +3356391168,3356391423,PA +3356393472,3356413567,CL +3356413568,3356413951,CO +3356413952,3356419839,CL +3356419840,3356419967,CO +3356419968,3356420287,CL +3356420288,3356420351,CO +3356420352,3356420735,CL +3356420736,3356420991,CO +3356420992,3356421119,CL +3356421120,3356422143,CO +3356422144,3356426239,CL +3356426240,3356427263,BR +3356427264,3356491775,US +3356491776,3356493823,PE +3356493824,3356495871,ZA +3356495872,3356499967,AR +3356499968,3356508159,MX +3356508160,3356508671,AR +3356508672,3356509183,CR +3356509184,3356509439,CO +3356509440,3356509503,US +3356509504,3356510207,CO +3356510208,3356511999,AR +3356512000,3356512255,CO +3356512256,3356514303,AR +3356514304,3356514559,US +3356514560,3356514815,AR +3356514816,3356515327,DO +3356515328,3356515839,CW +3356515840,3356516095,EC +3356516096,3356516351,VE +3356516352,3356520447,AR +3356520448,3356521471,CL +3356521472,3356521727,AR +3356521728,3356522495,CO +3356522496,3356557311,AR +3356557312,3356819455,BR +3356819456,3356884991,CO +3356884992,3356950527,CL +3356950528,3356958463,MX +3356958464,3356958719,BR +3356958720,3356967167,MX +3356967168,3356967423,DO +3356967424,3356967935,MX +3356967936,3356968959,BR +3356968960,3356972031,MX +3356972032,3356972287,AR +3356972288,3356979967,MX +3356979968,3356980223,CO +3356980224,3356980479,BR +3356980480,3356980735,MX +3356980736,3356981247,BR +3356981248,3356988415,MX +3356988416,3356988671,BR +3356988672,3356989439,MX +3356989440,3356989951,BR +3356989952,3356996607,MX +3356996608,3356997631,BR +3356997632,3356998911,MX +3356998912,3356999167,BR +3356999168,3357003007,MX +3357003008,3357003263,BR +3357003264,3357003519,CL +3357003520,3357003775,AR +3357003776,3357007871,MX +3357007872,3357011967,BR +3357011968,3357015551,MX +3357015552,3357016063,BR +3357016064,3357018623,CO +3357018624,3357019135,BR +3357019136,3357020159,CL +3357020160,3357032447,CO +3357032448,3357040639,BR +3357040640,3357048831,CO +3357048832,3357057023,EC +3357057024,3357065215,PE +3357065216,3357073407,EC +3357073408,3357077503,CL +3357077504,3357081599,AR +3357081600,3357114367,CO +3357114368,3357138943,EC +3357138944,3357147135,CO +3357147136,3357179903,AR +3357179904,3357188095,CO +3357188096,3357190143,VE +3357190144,3357192191,DO +3357192192,3357194239,PY +3357194240,3357196287,AR +3357196288,3357204479,CW +3357212672,3357368319,CL +3357368320,3357376511,CO +3357376512,3357403135,CL +3357403136,3357405183,CO +3357405184,3357407231,EC +3357407232,3357409279,AR +3357409280,3357411327,BR +3357411328,3357412351,VE +3357412352,3357412863,PE +3357412864,3357413119,CA +3357413120,3357413375,FR +3357413376,3357414399,US +3357414400,3357415423,PR +3357415424,3357415679,US +3357415680,3357416447,MX +3357416448,3357417215,VE +3357417216,3357417471,US +3357417472,3357418495,CL +3357418496,3357418751,NI +3357418752,3357419007,PR +3357419008,3357419519,GT +3357419520,3357420031,SZ +3357420032,3357421055,CO +3357421056,3357421311,CL +3357421312,3357421567,CO +3357421568,3357422847,NI +3357422848,3357423103,PR +3357423104,3357423359,CO +3357423360,3357424639,VE +3357424640,3357425663,CL +3357425664,3357442047,CO +3357442048,3357442303,NI +3357442304,3357442335,GT +3357442336,3357442343,HN +3357442344,3357442431,GT +3357442432,3357442439,HN +3357442440,3357442655,GT +3357442656,3357442671,NI +3357442672,3357442815,GT +3357442816,3357443071,SV +3357443072,3357443599,GT +3357443600,3357443615,HN +3357443616,3357443735,GT +3357443736,3357443743,HN +3357443744,3357444207,GT +3357444208,3357444215,HN +3357444216,3357444351,GT +3357444352,3357444607,HN +3357444608,3357448311,GT +3357448312,3357448319,SV +3357448320,3357448967,GT +3357448968,3357448975,HN +3357448976,3357449151,GT +3357449152,3357449727,HN +3357449728,3357451167,GT +3357451168,3357451175,HN +3357451176,3357451263,GT +3357451264,3357451519,HN +3357451520,3357451775,NI +3357451776,3357452287,GT +3357452288,3357452543,HN +3357452544,3357452799,GT +3357452800,3357453055,NI +3357453056,3357453311,SV +3357453312,3357453567,HN +3357453568,3357455871,GT +3357455872,3357456127,NI +3357456128,3357456639,GT +3357456640,3357456895,HN +3357456896,3357457919,GT +3357457920,3357458431,HN +3357458432,3357474815,CL +3357474816,3357475071,US +3357475072,3357475887,AR +3357475888,3357475903,VE +3357475904,3357476255,AR +3357476256,3357476271,VE +3357476272,3357476351,AR +3357476352,3357476607,EC +3357476608,3357476863,AR +3357476864,3357477375,EC +3357477376,3357477887,AR +3357477888,3357478911,CO +3357478912,3357479087,AR +3357479088,3357479095,CO +3357479096,3357480031,AR +3357480032,3357480039,CO +3357480040,3357480103,AR +3357480104,3357480111,CO +3357480112,3357480159,AR +3357480160,3357480175,CO +3357480176,3357480407,AR +3357480408,3357480415,CO +3357480416,3357480423,AR +3357480424,3357480427,CO +3357480428,3357480463,AR +3357480464,3357480479,CO +3357480480,3357480559,AR +3357480560,3357480575,CO +3357480576,3357480751,AR +3357480752,3357480767,CO +3357480768,3357480959,AR +3357480960,3357483007,EC +3357483008,3357491199,CL +3357491200,3357499391,CO +3357499392,3357507583,PE +3357507584,3357515775,VE +3357515776,3357523967,SV +3357523968,3357532159,CO +3357532160,3357556735,AR +3357556736,3357556991,VE +3357556992,3357557759,MX +3357557760,3357559295,EC +3357559296,3357559551,CA +3357559552,3357560175,AR +3357560176,3357560183,VE +3357560184,3357560319,AR +3357560320,3357560575,MX +3357560576,3357560831,AR +3357560832,3357561855,CO +3357561856,3357581311,AR +3357581312,3357589503,CL +3357589504,3357605887,BZ +3357605888,3357606911,MX +3357606912,3357607167,AR +3357607168,3357613055,MX +3357613056,3357613311,AR +3357613312,3357618943,MX +3357618944,3357619199,SV +3357619200,3357623039,MX +3357623040,3357623295,AR +3357623296,3357626623,MX +3357626624,3357626879,BR +3357626880,3357627135,AR +3357627136,3357627391,BR +3357627392,3357627647,MX +3357627648,3357627903,CR +3357627904,3357628415,MX +3357628416,3357630719,BR +3357630720,3357633535,MX +3357633536,3357633791,BR +3357633792,3357634815,MX +3357634816,3357635071,BO +3357635072,3357635327,MX +3357635328,3357635583,BR +3357635584,3357635839,MX +3357635840,3357636095,BR +3357636096,3357637887,MX +3357637888,3357638143,PA +3357638144,3357640703,BR +3357640704,3357644799,MX +3357644800,3357646847,BR +3357646848,3357647871,MX +3357647872,3357648895,BR +3357648896,3357650431,MX +3357650432,3357650943,BR +3357650944,3357657855,MX +3357657856,3357658111,AR +3357658112,3357670655,MX +3357670656,3357670911,BR +3357670912,3357671423,MX +3357671424,3357671679,CO +3357671680,3357712383,MX +3357712384,3357713407,BR +3357713408,3357715199,MX +3357715200,3357715455,CO +3357715456,3357726463,MX +3357726464,3357726719,AR +3357726720,3357727743,BR +3357727744,3357728767,MX +3357728768,3357736959,BR +3357736960,3357745151,VE +3357745152,3357753343,CO +3357753344,3357757487,VE +3357757488,3357757495,BO +3357757496,3357773823,VE +3357773824,3357775871,PA +3357775872,3357776127,US +3357776128,3357776383,UY +3357776384,3357776895,US +3357776896,3357777919,CL +3357777920,3357780559,GT +3357780560,3357780575,SV +3357780576,3357784503,GT +3357784504,3357784511,SV +3357784512,3357785535,GT +3357785536,3357785567,SV +3357785568,3357786111,GT +3357786112,3357802495,VE +3357802496,3357868031,MX +3357868032,3357933567,PE +3357933568,3358015487,MX +3358015488,3358023679,BR +3358023680,3358064639,MX +3358064640,3358130175,UY +3358130176,3358131199,EC +3358131200,3358132223,CO +3358132224,3358133631,AR +3358133632,3358133759,VE +3358133760,3358142719,AR +3358142720,3358142975,US +3358142976,3358143231,CO +3358143232,3358143487,VE +3358143488,3358143999,US +3358144000,3358144127,CL +3358144128,3358144255,AR +3358144256,3358144511,CL +3358144512,3358144639,AR +3358144640,3358144767,VE +3358144768,3358144839,AR +3358144840,3358144847,VE +3358144848,3358149735,AR +3358149736,3358149743,CO +3358149744,3358150367,AR +3358150368,3358150399,CO +3358150400,3358151039,AR +3358151040,3358151167,EC +3358151168,3358151423,AR +3358151424,3358151679,EC +3358151680,3358151807,PE +3358151808,3358152063,AR +3358152064,3358152191,PE +3358152192,3358153679,AR +3358153680,3358153695,PR +3358153696,3358153855,AR +3358153856,3358153983,EC +3358153984,3358154239,AR +3358154240,3358154751,CL +3358154752,3358158847,PE +3358158848,3358159423,AR +3358159424,3358159455,EC +3358159456,3358159871,AR +3358159872,3358160895,VE +3358160896,3358236671,AR +3358236672,3358244863,CL +3358244864,3358261247,DO +3358261248,3358264063,AR +3358264064,3358264319,PY +3358264320,3358326783,AR +3358326784,3358392319,VE +3358392320,3358457855,AR +3358457856,3358482175,PA +3358482176,3358482431,BZ +3358482432,3358523391,PA +3358523392,3358526719,AR +3358526720,3358527487,VE +3358527488,3358530047,AR +3358530048,3358530303,VE +3358530304,3358530815,AR +3358530816,3358531583,VE +3358531584,3358532095,AR +3358532096,3358532351,VE +3358532352,3358533119,AR +3358533120,3358533631,VE +3358533632,3358533887,AR +3358533888,3358534143,VE +3358534144,3358543615,AR +3358543616,3358543871,VE +3358543872,3358544127,MX +3358544128,3358547967,AR +3358547968,3358548623,VE +3358548624,3358548639,AR +3358548640,3358548991,VE +3358548992,3358549503,AR +3358549504,3358550015,VE +3358550016,3358563327,AR +3358563328,3358564095,CO +3358564096,3358567423,AR +3358567424,3358568447,CO +3358568448,3358578687,AR +3358578688,3358579711,CO +3358579712,3358587903,AR +3358587904,3358588927,CL +3358588928,3358654463,PE +3358654464,3358658559,AR +3358658560,3358660607,CL +3358660608,3358662655,AR +3358662656,3358670847,BR +3358670848,3358695423,AR +3358695424,3358703615,GT +3358703616,3358715903,AR +3358715904,3358717951,EC +3358717952,3358719999,US +3358720000,3358728191,PR +3358728192,3358736383,CL +3358736384,3358738175,BB +3358738176,3358738687,GD +3358738688,3358739711,BB +3358739712,3358739967,KN +3358739968,3358743039,BB +3358743040,3358743295,TC +3358743296,3358744575,BB +3358744576,3358752767,CL +3358752768,3358756863,BB +3358756864,3358760959,CL +3358760960,3358769151,AR +3358777344,3358779391,CR +3358779392,3358781439,EC +3358781440,3358851071,AR +3358851072,3358855167,MX +3358855168,3358859263,BR +3358859264,3358887935,MX +3358887936,3358892031,HN +3358892032,3358916607,MX +3358916608,3358924799,BR +3358924800,3358965759,MX +3358965760,3358973951,BR +3358973952,3358982143,MX +3358982144,3359047679,CL +3359047680,3359080447,AR +3359080448,3359096831,CU +3359096832,3359105023,CL +3359105024,3359109119,EC +3359109120,3359111167,AR +3359111168,3359113215,EC +3359113216,3359244287,MX +3359244288,3359260671,US +3359260672,3359268863,BO +3359268864,3359277055,AR +3359277056,3359285247,UY +3359285248,3359293439,BO +3359293440,3359305727,CO +3359305728,3359307775,DO +3359309824,3359313919,AR +3359313920,3359315967,CR +3359315968,3359318015,HN +3359318016,3359356927,AR +3359356928,3359358975,VE +3359358976,3359375359,AR +3359375360,3359440895,PE +3359440896,3359463679,AR +3359463680,3359463743,HN +3359463744,3359477759,AR +3359477760,3359478015,UY +3359478016,3359498239,AR +3359498240,3359502335,PY +3359502336,3359505407,AR +3359505408,3359505663,VE +3359505664,3359505919,CW +3359505920,3359506431,AR +3359506432,3359508479,US +3359508480,3359514623,VE +3359514624,3359516671,US +3359516672,3359516927,VG +3359516928,3359517183,US +3359517184,3359517439,VG +3359517440,3359517695,US +3359517696,3359517951,VG +3359517952,3359520255,US +3359520256,3359520767,AR +3359520768,3359521791,VE +3359521792,3359522815,CO +3359522816,3359539199,NI +3359539200,3359571967,PE +3359571968,3359582207,AR +3359582208,3359584255,PA +3359584256,3359586303,AR +3359586304,3359588351,CL +3359588352,3359596543,AR +3359596544,3359598591,CL +3359598592,3359599615,EC +3359599616,3359621119,AR +3359621120,3359637503,EC +3359637504,3359797247,MX +3359797248,3359801343,BR +3359801344,3359899647,MX +3359899648,3359916031,CL +3359916032,3359932415,AR +3359932416,3359948799,MX +3359948800,3359989759,AR +3359989760,3359997951,CO +3359997952,3360006143,AR +3360006144,3360014335,EC +3360014336,3360096255,AR +3360096256,3360104447,UY +3360104448,3360112639,CO +3360112640,3360113663,BR +3360113664,3360114687,CO +3360114688,3360115711,BR +3360115712,3360116735,CO +3360116736,3360118783,BO +3360118784,3360120831,AR +3360124928,3360125951,VE +3360125952,3360127999,BR +3360128000,3360128295,HN +3360128296,3360128303,IT +3360128304,3360128319,HN +3360128320,3360128327,IT +3360128328,3360128543,HN +3360128544,3360128575,US +3360128576,3360128775,HN +3360128776,3360128783,BE +3360128784,3360129023,HN +3360129024,3360145407,VE +3360145408,3360153599,CL +3360153600,3360157695,AR +3360157696,3360159743,VE +3360159744,3360161791,BQ +3360161792,3360251903,CL +3360251904,3360253951,BO +3360253952,3360255999,SV +3360256000,3360260095,CL +3360260096,3360276479,AR +3360276480,3360278527,VE +3360278528,3360280575,EC +3360280576,3360282623,CL +3360284672,3360325631,CL +3360325632,3360333823,CO +3360333824,3360342015,CL +3360342016,3360354303,VE +3360354304,3360356351,PA +3360356352,3360358399,CR +3360358400,3360366591,CL +3360366592,3360382975,CO +3360382976,3360399359,VE +3360399360,3360403455,BO +3360403456,3360405503,BR +3360405504,3360407551,HN +3360407552,3360423935,PA +3360423936,3360534527,MX +3360534528,3360536575,BR +3360536576,3360537599,CL +3360537600,3360538623,EC +3360538624,3360667647,MX +3360667648,3360669695,BR +3360669696,3360686079,MX +3360686080,3360698367,AR +3360698368,3360699135,UY +3360699136,3360707839,AR +3360707840,3360708095,US +3360708096,3360708735,AR +3360708736,3360708863,US +3360708864,3360710527,AR +3360710528,3360710655,US +3360710656,3360718847,HT +3360718848,3360763903,AR +3360765952,3360767999,CO +3360768000,3360772351,AR +3360772352,3360772479,BO +3360772480,3360780991,AR +3360780992,3360780995,BR +3360780996,3360781055,AR +3360781056,3360781071,BR +3360781072,3360781599,AR +3360781600,3360781615,BS +3360781616,3360781791,AR +3360781792,3360781795,MX +3360781796,3360788479,AR +3360788480,3360790527,CL +3360790528,3360849919,AR +3360849920,3360882687,VE +3360882688,3360948223,CL +3360948224,3361013759,VE +3361013760,3361021695,SV +3361021696,3361021951,HN +3361021952,3361030143,PY +3361030144,3361034239,VE +3361034240,3361036287,EC +3361036288,3361046527,AR +3361046528,3361052671,BO +3361052672,3361054463,AR +3361054464,3361054719,PE +3361054720,3361058815,NI +3361058816,3361062911,AR +3361062912,3361071103,CL +3361071104,3361079295,CO +3361079296,3361144831,CL +3361144832,3361210367,BO +3361210368,3361275903,DO +3361275904,3361284095,PE +3361284096,3361296383,CL +3361296384,3361298431,SV +3361298432,3361300479,DO +3361300480,3361308671,CO +3361308672,3361325055,AR +3361325056,3361341439,CO +3361341440,3361374207,VE +3361374208,3361378303,PA +3361378304,3361380351,BO +3361380352,3361382399,EC +3361382400,3361415167,CL +3361415168,3361417215,AR +3361417216,3361419263,CL +3361419264,3361423359,AR +3361423360,3361456127,CR +3361456128,3361472511,CO +3361472512,3361538047,MX +3361538048,3361570815,VE +3361570816,3361587199,CO +3361587200,3361599487,EC +3361599488,3361601535,UY +3361601536,3361603583,EC +3361603584,3361665023,MX +3361665024,3361667071,BR +3361667072,3361668095,GT +3361668096,3361669119,BR +3361669120,3361713151,MX +3361713152,3361716223,BR +3361716224,3361717247,CL +3361717248,3361726463,BR +3361726464,3361734655,MX +3361734656,3362258943,BR +3362258944,3362324479,CL +3362324480,3362337791,AR +3362337792,3362338047,US +3362338048,3362349055,AR +3362349056,3362351103,CR +3362351104,3362353151,AR +3362353152,3362355199,EC +3362355200,3362357247,AR +3362357248,3362381823,BO +3362381824,3362390015,EC +3362390016,3362422783,PE +3362426880,3362427903,PA +3362427904,3362428927,BR +3362428928,3362430975,CL +3362430976,3362447359,CO +3362447360,3362447871,SV +3362447872,3362449407,HN +3362449408,3362450175,SV +3362450176,3362451199,HN +3362451200,3362451455,SV +3362451456,3362452479,AR +3362452480,3362452991,BO +3362452992,3362453247,HN +3362453248,3362453503,NI +3362453504,3362455551,AR +3362455552,3362471935,EC +3362471936,3362476031,CL +3362476032,3362476287,HN +3362476288,3362476543,AR +3362476544,3362477055,CR +3362477056,3362478079,BQ +3362478080,3362484223,AR +3362486272,3362488319,HN +3362488320,3362504703,PE +3362504704,3362506751,VE +3362506752,3362508799,AR +3362508800,3362510847,HN +3362512896,3362514943,AR +3362514944,3362516991,HN +3362516992,3362519039,BO +3362519040,3362521087,EC +3362521088,3362529279,TT +3362529280,3362537471,PA +3362537472,3362545663,AR +3362545664,3362549759,PE +3362549760,3362552431,AR +3362552432,3362552447,MX +3362552448,3362552575,AR +3362552576,3362552591,MX +3362552592,3362552991,AR +3362552992,3362553007,MX +3362553008,3362553167,AR +3362553168,3362553183,DO +3362553184,3362553791,AR +3362553792,3362553807,VI +3362553808,3362553855,AR +3362553856,3362557951,PY +3362557952,3362562047,AR +3362570240,3362586623,UY +3362586624,3362652159,VE +3362652160,3362664447,PE +3362664448,3362668543,BO +3362668544,3362684927,EC +3362684928,3362691071,AR +3362691072,3362692095,PA +3362692096,3362692607,AR +3362692608,3362692863,BR +3362692864,3362695167,AR +3362695168,3362697215,CO +3362697216,3362703359,AR +3362703360,3362705407,CO +3362705408,3362707455,AR +3362707456,3362708203,CO +3362708204,3362708204,AR +3362708205,3362708383,CO +3362708384,3362708384,AR +3362708385,3362708413,CO +3362708414,3362708414,AR +3362708415,3362709503,CO +3362709504,3362711551,AR +3362711552,3362713599,EC +3362713600,3362714623,VE +3362714624,3362714879,HN +3362714880,3362716415,VE +3362716416,3362716671,CR +3362716672,3362717695,VE +3362717696,3362815999,CL +3362816000,3362832383,AR +3362832384,3362838527,CO +3362838528,3362840575,EC +3362840576,3362897919,CL +3362897920,3362903295,HT +3362903296,3362904063,MX +3362904064,3362914303,HT +3362914304,3362930687,CO +3362930688,3362934783,CL +3362934784,3362936831,AR +3362936832,3362938879,CL +3362938880,3362942975,AR +3362942976,3362945023,GT +3362945024,3362983935,AR +3362983936,3362984447,PY +3362984448,3362984703,CR +3362984704,3362984959,PA +3362984960,3362985983,PE +3362985984,3362988031,AR +3362988032,3362992127,EC +3362992128,3362996223,AR +3362996224,3363000319,UY +3363000320,3363004415,AR +3363012608,3363024895,PA +3363024896,3363025151,HN +3363025152,3363025407,PA +3363025408,3363025663,CO +3363025664,3363025919,CW +3363025920,3363026431,CO +3363026432,3363026943,HT +3363026944,3363027199,CL +3363027200,3363027967,AR +3363027968,3363028991,HN +3363028992,3363045375,AR +3363045376,3363110911,CO +3363110912,3363176447,AR +3363176448,3363274751,CO +3363274752,3363291135,GT +3363291136,3363299327,BO +3363299328,3363373055,CL +3363373056,3363438591,PE +3363438592,3363471359,AR +3363471360,3363487743,CR +3363487744,3363504127,CO +3363504128,3363512319,PE +3363512320,3363553919,AR +3363553920,3363554303,US +3363554304,3363554431,BR +3363554432,3363555071,AR +3363555072,3363555327,US +3363555328,3363555839,AR +3363555840,3363556607,US +3363556608,3363557375,AR +3363557376,3363559423,BZ +3363559424,3363561471,AR +3363565568,3363569663,AR +3363569664,3363577855,PA +3363577856,3363586047,CL +3363594240,3363600383,AR +3363600384,3363600639,PY +3363600640,3363600895,VE +3363600896,3363601407,AR +3363601408,3363601919,CO +3363601920,3363602175,AR +3363602176,3363602431,PA +3363602432,3363610623,CW +3363614720,3363617791,AR +3363617792,3363618815,PE +3363618816,3363627007,UY +3363627008,3363635199,EC +3363635200,3363651583,UY +3363651584,3363667967,AR +3363667968,3363676159,EC +3363676160,3363678207,TT +3363682304,3363684351,VE +3363684352,3363708927,EC +3363708928,3363713023,CL +3363713024,3363713279,EC +3363713280,3363714047,CL +3363714048,3363715583,PE +3363715584,3363716095,CL +3363716096,3363716607,PE +3363716608,3363716863,AR +3363716864,3363717119,PE +3363717120,3363733503,CL +3363733504,3363831807,AR +3363831808,3367763967,BR +3367763968,3367804927,MX +3367804928,3367840767,BR +3367840768,3367841023,HN +3367841024,3367841039,CA +3367841040,3367841407,HN +3367841408,3367841423,CA +3367841424,3367841791,HN +3367841792,3368052991,BR +3368052992,3368053247,PE +3368053248,3368053503,CO +3368053504,3368086527,BR +3368086528,3368087551,CR +3368087552,3368157183,BR +3368157184,3368173567,MX +3368173568,3370188799,BR +3370188800,3370196991,MX +3370196992,3370214399,BR +3370214400,3370215423,AR +3370215424,3370487807,BR +3370487808,3370488831,CR +3370488832,3370489855,AR +3370489856,3370490879,VE +3370490880,3370506239,BR +3370506240,3370507263,VE +3370507264,3370512383,BR +3370514432,3370515455,BR +3370515456,3370516479,AR +3370516480,3370926079,BR +3370926080,3370942463,MX +3370942464,3371106303,BR +3371106304,3371122687,MX +3371122688,3378511871,BR +3378511872,3380506879,MX +3380506880,3380507135,BR +3380507136,3380744191,MX +3380744192,3380745215,CO +3380745216,3380746239,BR +3380746240,3380747263,PE +3380747264,3380748287,BR +3380748288,3380761087,MX +3380761088,3380761599,VE +3380761600,3380764671,BR +3380764672,3380808191,MX +3380808192,3380808703,CR +3380808704,3380811775,MX +3380811776,3380813823,BR +3380813824,3380815103,MX +3380815104,3380815359,CR +3380815360,3380815871,CL +3380815872,3380816127,MX +3380816128,3380816383,BO +3380816384,3380816639,SV +3380816640,3380816895,CW +3380816896,3380817151,MX +3380817152,3380817407,BO +3380817408,3380817663,CO +3380817664,3380817919,AR +3380817920,3380818175,MX +3380818176,3380818431,PA +3380818432,3380818687,DO +3380818688,3380818943,PY +3380818944,3380822015,MX +3380822272,3380822527,MX +3380822528,3380822783,NI +3380822784,3380823039,PE +3380823040,3380824063,BR +3380824064,3380824319,MX +3380824320,3380824575,GT +3380824576,3380825087,AR +3380825088,3380825343,MX +3380825344,3380825599,HT +3380825600,3380825855,CO +3380825856,3380826111,AR +3380826112,3380828159,BR +3380828672,3380829183,CO +3380829184,3380830207,BR +3380830208,3380830463,MX +3380830464,3380830719,CO +3380830720,3380831231,PA +3380831232,3380831743,MX +3380831744,3380831999,AR +3380832256,3380832767,MX +3380832768,3380833279,DO +3380833280,3380833791,MX +3380833792,3380834303,SV +3380834304,3380834815,MX +3380834816,3380835071,CO +3380835072,3380835327,NI +3380835328,3380835839,MX +3380835840,3380836351,AR +3380836352,3380836607,MX +3380836608,3380836863,PE +3380836864,3380837375,SV +3380837376,3380840447,MX +3380840448,3380843519,BR +3380843520,3380844543,PA +3380844544,3380853759,BR +3380853760,3380854783,CO +3380854784,3380858879,MX +3380858880,3380860927,BR +3380860928,3380861951,CO +3380861952,3380862975,PE +3380862976,3380865023,BR +3380865024,3380867071,MX +3380867072,3380869119,BR +3380869120,3381350399,MX +3381350400,3381351423,AR +3381351424,3381354495,BR +3381354496,3381373951,MX +3381373952,3381374975,BR +3381374976,3381377023,MX +3381377024,3381379071,BR +3381379072,3381385215,MX +3381385216,3381387263,BR +3381387264,3381448703,MX +3381448704,3381452799,BR +3381452800,3381453823,AR +3381453824,3381455871,BR +3381455872,3381456895,US +3381456896,3381460991,BR +3381460992,3381944319,MX +3381944320,3381946367,BR +3381946368,3381947391,CL +3381947392,3381952511,BR +3381952512,3381960703,MX +3381960704,3381962751,BR +3381962752,3381962991,US +3381962992,3381962999,FR +3381963000,3381963559,US +3381963560,3381963567,FR +3381963568,3381963711,US +3381963712,3381963727,CA +3381963728,3381963775,US +3381963776,3381968895,BR +3381968896,3381972991,MX +3381972992,3381974015,BR +3381974016,3381975039,CL +3381975040,3381979135,BR +3381979136,3381980159,CR +3381980160,3381985279,BR +3381985280,3382009855,MX +3382009856,3382018047,BR +3382018048,3382053887,MX +3382053888,3382057983,BR +3382057984,3382059007,CL +3382059008,3382063103,MX +3382063104,3382066175,BR +3382066176,3382067199,PE +3382067200,3382071295,MX +3382071296,3382072319,BR +3382072320,3382073343,SV +3382073344,3382075391,BR +3382075392,3382076415,CO +3382076416,3382077439,BR +3382077440,3382078463,HT +3382078464,3382083583,BR +3382083584,3382087679,MX +3382087680,3382091775,BR +3382091776,3382099967,BO +3382099968,3382558719,MX +3382558720,3382575103,BR +3382575104,3382577151,MX +3382577152,3382579199,BR +3382579200,3382580223,MX +3382580224,3382583295,BR +3382583296,3382585343,MX +3382585344,3382587391,BR +3382587392,3382588415,HN +3382588416,3382589439,PE +3382589440,3382591487,BR +3382591488,3382599679,MX +3382601728,3382602751,MX +3382602752,3382603775,BR +3382603776,3382605823,MX +3382605824,3382607871,AR +3382607872,3382642687,MX +3382642688,3382644735,AR +3382644736,3382646783,MX +3382646784,3382648831,BR +3382648832,3382653951,MX +3382653952,3382654975,BR +3382654976,3382657023,AR +3382657024,3382659071,MX +3382659072,3382661119,BR +3382661120,3382662143,MX +3382662144,3382665215,BR +3382665216,3382669311,MX +3382669312,3382669567,SV +3382669568,3382669823,GT +3382669824,3382670079,HN +3382670080,3382670335,GT +3382670336,3382672383,BR +3382672384,3382677503,MX +3382677504,3382681599,BR +3382681600,3382683647,MX +3382683648,3382685695,CL +3382685696,3382686655,MX +3382686656,3382686719,US +3382686720,3382689791,BR +3382689792,3382695935,MX +3382695936,3382696959,AR +3382696960,3382697983,EC +3382697984,3382704127,MX +3382704128,3382706175,BR +3382706176,3382853631,MX +3382853632,3382870015,BR +3382870016,3383701503,MX +3383701504,3383705599,BR +3383705600,3383754751,MX +3383754752,3384148991,AR +3384148992,3384153087,BR +3384153088,3384154111,MX +3384154112,3384155135,SV +3384155136,3384162047,BR +3384162048,3384162303,CR +3384162304,3384167423,BR +3384167424,3384168447,CR +3384168448,3384169471,AR +3384169472,3384170495,EC +3384170496,3384175615,BR +3384175616,3384177663,AR +3384177664,3384180735,BR +3384180736,3384184831,AR +3384184832,3384185855,BR +3384185856,3384186879,EC +3384186880,3384196095,BR +3384196096,3384197119,AR +3384197120,3384205823,BR +3384205824,3384206335,CR +3384206336,3384209407,BR +3384209408,3384210431,EC +3384210432,3384211455,BR +3384211456,3384212479,CO +3384212480,3384213503,BR +3384213504,3384279039,EC +3384279040,3384410111,CO +3384410112,3384672255,CL +3384672256,3384688639,HN +3384688640,3384705023,CO +3384705024,3384737791,AR +3384737792,3385851903,CR +3385851904,3386114047,VE +3386114048,3386245119,AR +3386245120,3386376191,CL +3386376192,3386392575,CO +3386408960,3386425343,GT +3386425344,3386441727,AR +3386441728,3386458111,PY +3386458112,3386474495,EC +3386474496,3386490879,UY +3386490880,3386499071,CO +3386499072,3386503167,AR +3386503168,3386504191,CL +3386504192,3386505215,AR +3386505216,3386507263,CL +3386507264,3386523647,EC +3386523648,3386540031,PA +3386540032,3386548223,CL +3386548224,3386556415,CR +3386556416,3386562047,PA +3386562048,3386562303,PE +3386562304,3386571263,PA +3386571264,3386571327,BZ +3386571328,3386571391,PA +3386571392,3386571519,BZ +3386571520,3386572799,PA +3386572800,3386589183,EC +3386589184,3386601471,AR +3386601472,3386605567,CO +3386605568,3386613759,CL +3386613760,3386621951,AR +3386621952,3386630143,CO +3386630144,3386632191,UY +3386632192,3386634239,CL +3386634240,3386636287,CO +3386636288,3386637311,BR +3386637312,3386638335,UY +3386638336,3386640895,SX +3386640896,3386641151,US +3386641152,3386642431,SX +3386642432,3386644735,AR +3386644736,3386644991,PY +3386644992,3386645247,CR +3386645248,3386645503,CL +3386645504,3386645759,AR +3386645760,3386646015,CR +3386646016,3386662911,CO +3386662912,3386671103,CL +3386671104,3386675199,HN +3386675200,3386687487,AR +3386687488,3386695679,CU +3386695680,3386703871,CL +3386703872,3386720255,UY +3386720256,3386728447,TT +3386728448,3386732543,AR +3386732544,3386734591,CL +3386734592,3386734847,AR +3386734848,3386735103,CL +3386735104,3386735359,CO +3386735360,3386735615,CL +3386735616,3386736127,CO +3386736128,3386736383,DO +3386736384,3386736639,EC +3386736640,3386753023,CO +3386753024,3386761215,CL +3386761216,3386769407,PA +3386769408,3386773503,VE +3386773504,3386774527,AR +3386774528,3386777599,BR +3386781696,3386783743,PY +3386783744,3386784767,AR +3386784768,3386785791,GT +3386785792,3386802175,BO +3386802176,3386900479,CL +3386900480,3387162623,PA +3387162624,3387228159,CO +3387228160,3387260927,AW +3387260928,3387293695,DO +3387293696,3387359231,PE +3387359232,3387424767,AR +3387424768,3387502599,CO +3387502600,3387502607,JP +3387502608,3387555839,CO +3387555840,3387568127,AR +3387568128,3387572223,PE +3387572224,3387576319,CO +3387576320,3387578367,EC +3387578368,3387584511,AR +3387584512,3387585535,PE +3387585536,3387586047,AR +3387586048,3387586303,PE +3387586304,3387586431,AR +3387586432,3387587583,PE +3387587584,3387588159,AR +3387588160,3387588175,PE +3387588176,3387600895,AR +3387600896,3387604991,CO +3387604992,3387613183,EC +3387613184,3387613439,US +3387613440,3387617279,VE +3387617280,3387619327,CO +3387619328,3387686911,AR +3387686912,3387736063,CL +3387736064,3387752447,CO +3387752448,3387817983,CR +3387817984,3387834367,VE +3387834368,3387850751,TT +3387850752,3387867135,EC +3387867136,3387949055,CL +3387949056,3388014591,PE +3388014592,3388080127,CL +3388080128,3388211199,VE +3388211200,3388342271,CO +3388342272,3388407807,CL +3388407808,3388473343,SV +3388473344,3388604415,VE +3388604416,3388997631,AR +3388997632,3389001727,AU +3389001728,3389005823,PH +3389005824,3389014015,NZ +3389014016,3389014271,AU +3389014272,3389014783,JP +3389014784,3389015807,AU +3389015808,3389016063,SG +3389016064,3389016575,JP +3389016576,3389017087,AU +3389017088,3389017343,JP +3389017344,3389017599,HK +3389017600,3389017855,AU +3389017856,3389018111,VN +3389018112,3389018367,PG +3389018368,3389019135,AU +3389019136,3389019391,NZ +3389019392,3389020159,AU +3389020160,3389020671,ID +3389020672,3389020927,AU +3389020928,3389021183,PH +3389021184,3389021695,ID +3389021696,3389021951,BD +3389021952,3389022463,AU +3389022464,3389022719,IN +3389022720,3389023231,AU +3389023232,3389023743,CN +3389023744,3389023999,AU +3389024000,3389024255,IN +3389024256,3389024511,SG +3389024512,3389025023,AU +3389025024,3389025279,ID +3389025280,3389025535,AU +3389025536,3389025791,IN +3389025792,3389026047,PK +3389026048,3389026303,TH +3389026304,3389026559,IN +3389026560,3389027071,AU +3389027072,3389027583,IN +3389027584,3389028607,TH +3389028608,3389028863,NZ +3389028864,3389029375,CN +3389029376,3389029887,NZ +3389029888,3389030399,SG +3389030400,3389034495,HK +3389034496,3389035519,PH +3389035520,3389035775,IN +3389035776,3389036031,SG +3389036032,3389036287,AU +3389036288,3389036543,NZ +3389036544,3389037567,AU +3389037568,3389038591,NC +3389038592,3389044735,HK +3389044736,3389046783,AU +3389046784,3389063167,US +3389063168,3389063679,AU +3389063680,3389063935,HK +3389063936,3389064191,AU +3389064192,3389064447,IN +3389064448,3389064703,SG +3389064704,3389065215,HK +3389065216,3389067263,NZ +3389067264,3389071359,AU +3389071360,3389079551,PG +3389079552,3389087743,SG +3389087744,3389087999,HK +3389088000,3389090239,SG +3389090240,3389090303,CN +3389090304,3389092351,SG +3389092352,3389092863,PH +3389092864,3389093887,HK +3389093888,3389095935,IN +3389095936,3389104127,SG +3389104128,3389112319,SB +3389112320,3389116415,MV +3389116416,3389120511,JP +3389122560,3389122815,HK +3389122816,3389123583,AU +3389123584,3389123839,ID +3389123840,3389124351,AU +3389124352,3389124607,SG +3389124608,3389128447,PG +3389128448,3389129727,AU +3389129728,3389132799,NZ +3389132800,3389136895,AU +3389136896,3389142015,HK +3389142016,3389143039,TW +3389143040,3389145087,AU +3389145088,3389151231,HK +3389151232,3389152255,JP +3389152256,3389153023,US +3389153024,3389153279,AU +3389153280,3389161471,TV +3389161472,3389194239,JP +3389194240,3389195775,AU +3389195776,3389196287,HK +3389196288,3389197567,AU +3389197568,3389197823,IN +3389197824,3389198079,ID +3389198080,3389198335,IN +3389198336,3389202431,KR +3389202432,3389210623,AU +3389210624,3389210879,IN +3389210880,3389211135,AU +3389211136,3389211391,IN +3389211392,3389211647,AU +3389211648,3389212671,TH +3389212672,3389213183,IN +3389213184,3389213439,AU +3389213440,3389213695,MY +3389213952,3389214207,IN +3389214208,3389214463,SG +3389214464,3389214719,AU +3389214720,3389218815,NZ +3389218816,3389222911,AU +3389222912,3389223935,US +3389223936,3389226495,IN +3389226496,3389226751,SG +3389226752,3389227007,IN +3389227008,3389227519,CN +3389227520,3389228031,PK +3389228032,3389228799,AU +3389228800,3389229055,SG +3389229056,3389229311,JP +3389229312,3389229567,AU +3389229568,3389230079,SG +3389230080,3389235199,JP +3389235200,3389243391,TW +3389243392,3389247487,AU +3389247488,3389251583,ID +3389251584,3389259775,PF +3389259776,3389263871,PH +3389263872,3389266175,NZ +3389266176,3389266431,IN +3389266432,3389266943,HK +3389266944,3389267967,AU +3389267968,3389276159,WS +3389276160,3389284351,AU +3389284352,3389292543,BD +3389292544,3389300735,CN +3389300736,3389301247,ID +3389301760,3389302015,IN +3389302016,3389302527,AU +3389302528,3389302783,PK +3389302784,3389303039,VN +3389303040,3389303295,IN +3389303296,3389303807,ID +3389303808,3389304063,IN +3389304064,3389304319,BD +3389304320,3389304575,PH +3389304576,3389304831,AU +3389304832,3389305087,VN +3389305088,3389305599,IN +3389305600,3389305855,ID +3389305856,3389306111,IN +3389306112,3389306367,AU +3389306368,3389306623,IN +3389306624,3389306879,AU +3389306880,3389307135,SG +3389307136,3389307647,ID +3389307648,3389307903,IN +3389307904,3389308159,AU +3389308160,3389308415,ID +3389308416,3389308671,AU +3389308672,3389308927,PH +3389308928,3389317119,HK +3389317120,3389322239,AU +3389322240,3389324031,JP +3389324032,3389324287,VU +3389324288,3389325311,CN +3389325312,3389326335,AU +3389326336,3389326847,TW +3389326848,3389327359,AU +3389327360,3389329407,TW +3389329408,3389333503,US +3389333504,3389341695,BD +3389341696,3389345791,JP +3389345792,3389349887,TH +3389349888,3389358079,AU +3389358080,3389366271,PK +3389366272,3389374463,AU +3389374464,3389378559,MN +3389378560,3389381631,CN +3389381632,3389382655,JP +3389382656,3389390847,TW +3389390848,3389391359,HK +3389391360,3389391615,VN +3389391616,3389392127,AU +3389392128,3389392383,NZ +3389392384,3389392895,CN +3389392896,3389394943,JP +3389394944,3389399039,TH +3389399040,3389407743,AU +3389407744,3389408255,CN +3389408256,3389409279,JP +3389409280,3389409791,CN +3389409792,3389411327,AU +3389411328,3389411583,IN +3389411584,3389412351,AU +3389412352,3389412607,NZ +3389412608,3389412863,PH +3389412864,3389413119,AU +3389413120,3389413887,CN +3389413888,3389414143,TH +3389414144,3389414399,AU +3389414400,3389414911,CN +3389414912,3389415167,HK +3389415168,3389415423,KR +3389415424,3389415935,VN +3389415936,3389416191,JP +3389416192,3389416447,IN +3389416448,3389416959,TH +3389416960,3389417215,SG +3389417216,3389417471,CN +3389417472,3389417983,TW +3389417984,3389418239,AU +3389418240,3389418495,TH +3389418496,3389418751,CN +3389418752,3389419007,NZ +3389419008,3389419519,CN +3389419520,3389420031,AU +3389420032,3389420287,CN +3389420288,3389420543,AU +3389420544,3389421311,NZ +3389421312,3389421567,JP +3389421568,3389422591,KI +3389422592,3389431807,AU +3389431808,3389435903,SG +3389435904,3389439999,CN +3389440000,3389444095,HK +3389444096,3389452287,ID +3389452288,3389453311,SG +3389453312,3389454335,JP +3389454336,3389455359,AU +3389455360,3389456383,JP +3389456384,3389456895,NZ +3389456896,3389457407,AU +3389457408,3389458431,NZ +3389458432,3389460479,AU +3389460480,3389464575,JP +3389464576,3389469695,NZ +3389469696,3389470719,KH +3389470720,3389471231,AU +3389471232,3389471487,IN +3389471488,3389471743,US +3389471744,3389472767,NZ +3389472768,3389480959,AU +3389480960,3389489151,JP +3389489152,3389493247,HK +3389493248,3389521919,AU +3389521920,3389522175,CN +3389522176,3389522431,SG +3389522432,3389523455,CN +3389523456,3389523967,JP +3389523968,3389524991,AU +3389524992,3389525247,CN +3389525248,3389525503,NZ +3389525504,3389526015,TW +3389526016,3389528063,JP +3389528064,3389528319,CN +3389528320,3389528575,AU +3389528576,3389529087,JP +3389529088,3389529599,ID +3389529600,3389529855,PH +3389529856,3389530111,HK +3389530112,3389532159,AU +3389532160,3389533183,SG +3389533184,3389534207,NZ +3389534208,3389538303,JP +3389538304,3389538559,AU +3389538560,3389540351,TH +3389540352,3389541375,KH +3389541376,3389541631,AU +3389541632,3389541887,CN +3389541888,3389542399,TH +3389542400,3389543423,JP +3389543424,3389544447,TH +3389544448,3389545471,HK +3389545472,3389545727,AU +3389545728,3389545983,HK +3389545984,3389546495,SG +3389554688,3389562879,CN +3389562880,3389571071,KR +3389571072,3389575167,CN +3389575168,3389579263,JP +3389579264,3389587455,PH +3389587456,3389595647,AU +3389595648,3389595903,CN +3389595904,3389596159,AU +3389596160,3389596671,CN +3389596672,3389597439,SG +3389597440,3389597695,MY +3389597696,3389599743,MN +3389599744,3389600255,CN +3389600256,3389600511,AU +3389600512,3389601535,CN +3389601536,3389601791,IN +3389601792,3389602047,AU +3389602048,3389602815,CN +3389602816,3389603839,HK +3389603840,3389604095,IN +3389604096,3389604351,AU +3389604352,3389604863,SG +3389604864,3389605119,US +3389605120,3389605375,ID +3389605376,3389605631,AU +3389605632,3389605887,SG +3389605888,3389606399,ID +3389606400,3389606655,AU +3389606656,3389606911,IN +3389606912,3389607423,LA +3389607424,3389607679,AU +3389607680,3389608191,VN +3389608192,3389608447,TH +3389608448,3389608703,HK +3389608704,3389608959,AU +3389608960,3389609215,VN +3389609216,3389609471,ID +3389609472,3389609727,SG +3389609728,3389609983,AU +3389609984,3389610239,NZ +3389610240,3389610495,SG +3389610496,3389610751,TH +3389610752,3389611519,IN +3389611520,3389612031,AU +3389612032,3389616127,MY +3389616128,3389617151,AU +3389617152,3389618175,NZ +3389618176,3389640703,IN +3389640704,3389644799,JP +3389644800,3389645823,NZ +3389645824,3389661183,AU +3389661184,3389669375,ID +3389669376,3389673471,CN +3389673472,3389677567,AU +3389677568,3389681663,JP +3389681664,3389685759,CN +3389685760,3389718527,AU +3389718528,3389784063,JP +3389784064,3389784319,NZ +3389784320,3389784831,CN +3389784832,3389785087,NZ +3389785088,3389786111,HK +3389786112,3389788159,JP +3389788160,3389788415,IN +3389788416,3389788927,CN +3389788928,3389789695,US +3389789696,3389790719,AU +3389790720,3389790975,BN +3389790976,3389791231,JP +3389791232,3389791743,AU +3389791744,3389791999,JP +3389792000,3389800447,AU +3389800448,3389801471,JP +3389801472,3389801983,AU +3389801984,3389802239,NZ +3389802240,3389802495,AU +3389802496,3389802751,CN +3389802752,3389803263,TH +3389803264,3389803519,ID +3389803520,3389804543,TW +3389804544,3389805567,IN +3389805568,3389806079,CN +3389806080,3389807359,AU +3389807360,3389807615,NZ +3389807616,3389808127,AU +3389808128,3389808639,SG +3389808640,3389808895,CN +3389808896,3389809151,TH +3389809152,3389809663,CN +3389809664,3389809919,AU +3389809920,3389810175,IN +3389810176,3389810431,AU +3389810432,3389810687,IN +3389810688,3389811199,NZ +3389811200,3389811455,CN +3389811456,3389811711,AU +3389811712,3389811967,NZ +3389811968,3389812479,AU +3389812480,3389812735,CN +3389812736,3389813759,AU +3389813760,3389814015,CN +3389814016,3389814527,TH +3389814528,3389816575,AU +3389816576,3389816831,US +3389816832,3389846527,AU +3389846528,3389847551,JP +3389847552,3389849599,NZ +3389849600,3389915135,JP +3389915136,3389916159,AU +3389916160,3389917183,HK +3389917184,3389919231,SG +3389919232,3389931519,NZ +3389931520,3389932031,CN +3389932032,3389932287,AU +3389932288,3389932799,HK +3389932800,3389933055,CN +3389933056,3389933567,PK +3389933568,3389933823,IN +3389933824,3389934847,CN +3389934848,3389935103,AU +3389935104,3389935615,CN +3389935616,3389935871,HK +3389935872,3389936127,AU +3389936128,3389936895,NZ +3389936896,3389937663,PH +3389937664,3389937919,CN +3389937920,3389938175,AU +3389938176,3389938687,KR +3389938688,3389939199,ID +3389939200,3389939711,AU +3389939712,3389939967,NZ +3389939968,3389940223,CN +3389940224,3389940479,AU +3389940480,3389940991,NZ +3389940992,3389941247,AU +3389941248,3389941503,NZ +3389941504,3389941759,KR +3389941760,3389942271,CN +3389942272,3389942783,NZ +3389942784,3389943295,CN +3389943296,3389943551,AU +3389943552,3389943807,CN +3389943808,3389944319,AU +3389944320,3389944831,CN +3389944832,3389945087,AU +3389945088,3389945343,TH +3389945344,3389945855,CN +3389945856,3389946879,IN +3389946880,3389947391,CN +3389947392,3389947647,AU +3389947648,3389947903,CN +3389947904,3389948159,AU +3389948160,3389948415,CN +3389948416,3389949695,AU +3389949696,3389950207,CN +3389950208,3389950975,AU +3389950976,3389951743,NZ +3389951744,3389953279,AU +3389953280,3389953535,CN +3389953536,3389953791,AU +3389953792,3389954047,CN +3389954048,3389954303,AU +3389954304,3389954815,SG +3389954816,3389955327,AU +3389955328,3389956095,CN +3389956096,3389957119,IN +3389957120,3389957375,TH +3389957376,3389957631,KR +3389957632,3389957887,AU +3389957888,3389958399,NZ +3389958400,3389960447,CN +3389960448,3389962239,AU +3389962240,3389962751,CN +3389962752,3389963007,AU +3389963264,3389966335,AU +3389966336,3389968383,SG +3389968384,3389968895,CN +3389968896,3389969663,AU +3389969664,3389969919,CN +3389969920,3389970431,AU +3389970432,3389971199,NZ +3389971200,3389971711,CN +3389971712,3389971967,AU +3389971968,3389973503,CN +3389973504,3389973759,NZ +3389973760,3389974271,AU +3389974272,3389974527,CN +3389974528,3389975295,AU +3389975296,3389976575,CN +3389976576,3389978111,AU +3389978112,3389978367,CN +3389978368,3389979391,AU +3389979392,3389979647,CN +3389979648,3389980415,NZ +3389980416,3389980671,ID +3389980672,3390308351,JP +3390308352,3390310399,NZ +3390310400,3390316543,AU +3390316544,3390325247,NZ +3390325248,3390325503,CN +3390325504,3390325759,AU +3390325760,3390326015,PG +3390326016,3390327807,AU +3390327808,3390328575,NZ +3390328576,3390328831,CN +3390328832,3390329087,NZ +3390329088,3390329343,AU +3390329344,3390330623,KR +3390330624,3390331647,CN +3390331648,3390332415,NZ +3390332416,3390332927,CN +3390332928,3390333439,NZ +3390333440,3390333695,HK +3390333696,3390333951,KR +3390333952,3390334463,HK +3390334464,3390335231,NZ +3390335232,3390335487,TH +3390335488,3390336511,ID +3390336768,3390337023,HK +3390337024,3390337279,GU +3390337280,3390337535,NZ +3390337536,3390337791,CN +3390337792,3390338303,JP +3390338304,3390338559,CN +3390338560,3390338815,HK +3390338816,3390339071,KR +3390339072,3390339327,CN +3390339328,3390339839,NZ +3390339840,3390340351,JP +3390340352,3390341119,CN +3390341120,3390375935,KR +3390375936,3390377983,AU +3390377984,3390382079,NZ +3390382080,3390386175,IN +3390386176,3390390271,CN +3390390272,3390398463,NZ +3390398464,3390406655,MN +3390406656,3390406911,NZ +3390406912,3390407167,SG +3390407168,3390407423,NZ +3390407424,3390407935,CN +3390407936,3390408191,NZ +3390408192,3390408703,IN +3390408704,3390409727,NZ +3390409728,3390409983,TH +3390409984,3390410495,CN +3390410496,3390410751,NZ +3390410752,3390411007,TH +3390411008,3390411519,JP +3390411520,3390412031,CN +3390412032,3390412287,TH +3390412288,3390413567,CN +3390413568,3390413823,NZ +3390413824,3390414079,CN +3390414080,3390414335,NZ +3390414336,3390414847,SG +3390414848,3390418943,JP +3390418944,3390423039,MV +3390423040,3390429439,SG +3390429440,3390429951,HK +3390429952,3390439423,SG +3390439424,3390441471,NZ +3390441472,3390443519,TH +3390443520,3390447359,NZ +3390447360,3390447615,ID +3390447616,3390455807,KR +3390455808,3390472191,JP +3390472192,3390480383,NC +3390480384,3390484479,AU +3390484480,3390488575,GU +3390488576,3390492671,BD +3390492672,3390496767,JP +3390496768,3390500863,NC +3390500864,3390502911,HK +3390502912,3390504959,CN +3390504960,3390767103,JP +3390767104,3390769407,NZ +3390769408,3390769663,IN +3390769664,3390770175,TH +3390770176,3390770431,CN +3390770432,3390770687,AU +3390770688,3390770943,CN +3390770944,3390771199,AU +3390771200,3390775295,SG +3390775296,3390790399,NZ +3390790400,3390790655,AU +3390790656,3390801919,NZ +3390801920,3390802431,CN +3390802432,3390832639,NZ +3390832640,3390963711,TH +3390963712,3391094783,KR +3391094784,3391356927,JP +3391356928,3391369215,NZ +3391369216,3391373311,AU +3391373312,3391414783,NZ +3391414784,3391415039,CN +3391415040,3391444479,NZ +3391444480,3391444991,VN +3391444992,3391453183,NZ +3391453184,3391453439,ID +3391453440,3391469055,NZ +3391469056,3391469311,AU +3391469312,3391487999,NZ +3391488000,3391489023,CN +3391489024,3391490047,NP +3391490048,3391492095,CN +3391492096,3391496191,HK +3391496192,3391500287,SG +3391500288,3391523583,CN +3391523584,3391523839,AU +3391523840,3391524863,CN +3391524864,3391525375,AU +3391525376,3391525887,CN +3391525888,3391526143,AU +3391526144,3391528191,CN +3391528192,3391528447,AU +3391528448,3391529471,CN +3391529472,3391529983,AU +3391529984,3391532031,CN +3391532032,3391533055,IN +3391533056,3391533567,CN +3391533568,3391534079,HK +3391534080,3391535103,IN +3391535104,3391553535,CN +3391553536,3391619071,TW +3391619072,3391620095,AU +3391620096,3391620607,CN +3391620608,3391620863,IN +3391620864,3391621119,CN +3391621120,3391622911,HK +3391622912,3391623167,CN +3391623168,3391627263,HK +3391627264,3391651839,IN +3391651840,3391653631,HK +3391653632,3391654143,CN +3391654144,3391654911,HK +3391654912,3391655167,CN +3391655168,3391655679,HK +3391655680,3391656447,CN +3391656448,3391657471,HK +3391657472,3391657727,CN +3391657728,3391658751,HK +3391658752,3391659263,CN +3391659264,3391659519,HK +3391659520,3391660031,CN +3391660032,3391660543,HK +3391660544,3391660799,CN +3391660800,3391662079,AU +3391662080,3391663103,HK +3391663104,3391664127,PH +3391664128,3391668223,BD +3391668224,3391676415,HK +3391676416,3391684607,SG +3391684608,3391686655,IN +3391686656,3391687167,CN +3391687168,3391687423,IN +3391687424,3391688191,CN +3391688192,3391688703,AU +3391688704,3391717375,IN +3391717376,3391717631,CN +3391717632,3391717887,IN +3391717888,3391718399,CN +3391718400,3391718911,IN +3391718912,3391719423,JP +3391719424,3391720959,NZ +3391720960,3391721215,CN +3391721216,3391721471,NZ +3391721472,3391721983,AU +3391721984,3391722239,TW +3391722240,3391722495,PH +3391722496,3391723519,IN +3391723520,3391725567,CN +3391725568,3391733759,TH +3391733760,3391734015,CN +3391734016,3391734783,AU +3391734784,3391736831,CN +3391736832,3391737855,IN +3391737856,3391741951,JP +3391741952,3391746047,IN +3391746048,3391750143,CN +3391750144,3391750303,JP +3391750304,3391750335,SG +3391750336,3391750659,JP +3391750660,3391750663,SG +3391750664,3391750667,JP +3391750668,3391750671,SG +3391750672,3391750683,JP +3391750684,3391750687,SG +3391750688,3391750919,JP +3391750920,3391750939,SG +3391750940,3391751071,JP +3391751072,3391751103,SG +3391751104,3391751183,JP +3391751184,3391751231,SG +3391751232,3391751295,JP +3391751296,3391751359,SG +3391751360,3391751903,JP +3391751904,3391751935,SG +3391751936,3391752063,JP +3391752064,3391752095,SG +3391752096,3391752287,JP +3391752288,3391752383,SG +3391752384,3391752463,JP +3391752464,3391752471,SG +3391752472,3391752475,JP +3391752476,3391752511,SG +3391752512,3391752543,JP +3391752544,3391752575,SG +3391752576,3391752591,JP +3391752592,3391752599,SG +3391752600,3391752831,JP +3391752832,3391752863,SG +3391752864,3391752959,JP +3391752960,3391753023,SG +3391753024,3391753055,JP +3391753056,3391753087,SG +3391753088,3391753215,JP +3391753216,3391753247,SG +3391753248,3391753279,JP +3391753280,3391753311,SG +3391753312,3391753343,JP +3391753344,3391753503,SG +3391753504,3391753631,JP +3391753632,3391753695,SG +3391753696,3391753759,JP +3391753760,3391753791,SG +3391753792,3391754015,JP +3391754016,3391754079,SG +3391754080,3391754199,JP +3391754200,3391754207,SG +3391754208,3391755839,JP +3391755840,3391755871,SG +3391755872,3391758335,JP +3391758336,3391759871,SG +3391759872,3391760127,JP +3391760128,3391760639,SG +3391760640,3391761151,JP +3391761152,3391761663,SG +3391761664,3391762175,JP +3391762176,3391762943,SG +3391762944,3391763007,JP +3391763008,3391763103,SG +3391763104,3391763135,JP +3391763136,3391763167,SG +3391763168,3391763199,JP +3391763200,3391763455,SG +3391763456,3391763743,JP +3391763744,3391763807,SG +3391763808,3391763839,JP +3391763840,3391763871,SG +3391763872,3391763903,JP +3391763904,3391764351,SG +3391764352,3391764383,JP +3391764384,3391764991,SG +3391764992,3391765055,JP +3391765056,3391765119,SG +3391765120,3391765183,JP +3391765184,3391765631,SG +3391765632,3391765727,JP +3391765728,3391765791,SG +3391765792,3391765823,JP +3391765824,3391765919,SG +3391765920,3391765951,JP +3391765952,3391766015,SG +3391766016,3391767039,JP +3391767040,3391767199,SG +3391767200,3391767231,JP +3391767232,3391767263,SG +3391767264,3391767295,JP +3391767296,3391767871,SG +3391767872,3391767903,JP +3391767904,3391767967,SG +3391767968,3391767999,JP +3391768000,3391768031,SG +3391768032,3391768047,JP +3391768048,3391768055,SG +3391768056,3391768063,JP +3391768064,3391768319,SG +3391768320,3391768351,JP +3391768352,3391768383,SG +3391768384,3391768415,JP +3391768416,3391768447,SG +3391768448,3391768543,JP +3391768544,3391768571,SG +3391768572,3391768591,JP +3391768592,3391768615,SG +3391768616,3391769087,JP +3391769088,3391769103,SG +3391769104,3391769119,JP +3391769120,3391769143,SG +3391769144,3391769159,JP +3391769160,3391769175,SG +3391769176,3391769199,JP +3391769200,3391769215,SG +3391769216,3391770159,JP +3391770160,3391770167,SG +3391770168,3391774719,JP +3391774720,3391776767,SG +3391776768,3391777039,JP +3391777040,3391777055,SG +3391777056,3391777535,JP +3391777536,3391777543,SG +3391777544,3391777551,JP +3391777552,3391777559,SG +3391777560,3391778047,JP +3391778048,3391778063,SG +3391778064,3391778303,JP +3391778304,3391778311,SG +3391778312,3391782911,JP +3391782912,3391784991,SG +3391784992,3391785119,JP +3391785120,3391785183,SG +3391785184,3391785215,JP +3391785216,3391785471,SG +3391785472,3391786015,JP +3391786016,3391786079,SG +3391786080,3391786112,JP +3391786113,3391786113,SG +3391786114,3391786207,JP +3391786208,3391788207,SG +3391788208,3391788223,JP +3391788224,3391788543,SG +3391788544,3391789055,JP +3391789056,3391789311,SG +3391789312,3391789407,JP +3391789408,3391789439,SG +3391789440,3391789567,JP +3391789568,3391790079,SG +3391790080,3391790335,JP +3391790336,3391791103,SG +3391791104,3391791359,JP +3391791360,3391791743,SG +3391791744,3391792383,JP +3391792384,3391792959,SG +3391792960,3391792991,JP +3391792992,3391793023,SG +3391793024,3391793055,JP +3391793056,3391793151,SG +3391793152,3391793663,JP +3391793664,3391794175,SG +3391794176,3391794431,JP +3391794432,3391794687,SG +3391794688,3391794695,JP +3391794696,3391794711,SG +3391794712,3391794727,JP +3391794728,3391794751,SG +3391794752,3391794767,JP +3391794768,3391794775,SG +3391794776,3391794783,JP +3391794784,3391794799,SG +3391794800,3391794815,JP +3391794816,3391794848,SG +3391794849,3391794879,JP +3391794880,3391794895,SG +3391794896,3391794943,JP +3391794944,3391795455,SG +3391795456,3391795775,JP +3391795776,3391795783,SG +3391795784,3391795791,JP +3391795792,3391795807,SG +3391795808,3391795839,JP +3391795840,3391795871,SG +3391795872,3391795927,JP +3391795928,3391795935,SG +3391795936,3391795975,JP +3391795976,3391796007,SG +3391796008,3391796023,JP +3391796024,3391796047,SG +3391796048,3391796087,JP +3391796088,3391796095,SG +3391796096,3391796199,JP +3391796200,3391796207,SG +3391796208,3391796231,JP +3391796232,3391796239,SG +3391796240,3391796263,JP +3391796264,3391796279,SG +3391796280,3391796303,JP +3391796304,3391796319,SG +3391796320,3391796335,JP +3391796336,3391796343,SG +3391796344,3391796351,JP +3391796352,3391796359,SG +3391796360,3391796367,JP +3391796368,3391796375,SG +3391796376,3391796431,JP +3391796432,3391796447,SG +3391796448,3391796479,JP +3391796480,3391796511,SG +3391796512,3391796543,JP +3391796544,3391796551,SG +3391796552,3391796559,JP +3391796560,3391796567,SG +3391796568,3391796607,JP +3391796608,3391796639,SG +3391796640,3391796663,JP +3391796664,3391796671,SG +3391796672,3391796735,JP +3391796736,3391797055,SG +3391797056,3391797063,JP +3391797064,3391797079,SG +3391797080,3391797087,JP +3391797088,3391797095,SG +3391797096,3391797111,JP +3391797112,3391797119,SG +3391797120,3391797143,JP +3391797144,3391797183,SG +3391797184,3391797191,JP +3391797192,3391797207,SG +3391797208,3391797263,JP +3391797264,3391797295,SG +3391797296,3391797303,JP +3391797304,3391797311,SG +3391797312,3391797343,JP +3391797344,3391797359,SG +3391797360,3391797365,JP +3391797366,3391797375,SG +3391797376,3391797391,JP +3391797392,3391797407,SG +3391797408,3391797423,JP +3391797424,3391797431,SG +3391797432,3391797455,JP +3391797456,3391797471,SG +3391797472,3391797487,JP +3391797488,3391797503,SG +3391797504,3391797519,JP +3391797520,3391797535,SG +3391797536,3391797551,JP +3391797552,3391797567,SG +3391797568,3391797599,JP +3391797600,3391797607,SG +3391797608,3391797695,JP +3391797696,3391797703,SG +3391797704,3391797727,JP +3391797728,3391797839,SG +3391797840,3391797855,JP +3391797856,3391797871,SG +3391797872,3391797887,JP +3391797888,3391797895,SG +3391797896,3391797903,JP +3391797904,3391797967,SG +3391797968,3391798063,JP +3391798064,3391798111,SG +3391798112,3391798143,JP +3391798144,3391798191,SG +3391798192,3391798199,JP +3391798200,3391798215,SG +3391798216,3391798239,JP +3391798240,3391798255,SG +3391798256,3391798263,JP +3391798264,3391798287,SG +3391798288,3391798303,JP +3391798304,3391798319,SG +3391798320,3391798327,JP +3391798328,3391798375,SG +3391798376,3391798383,JP +3391798384,3391798391,SG +3391798392,3391798407,JP +3391798408,3391798431,SG +3391798432,3391798455,JP +3391798456,3391798463,SG +3391798464,3391798495,JP +3391798496,3391798503,SG +3391798504,3391798511,JP +3391798512,3391798519,SG +3391798520,3391798527,JP +3391798528,3391798575,SG +3391798576,3391798583,JP +3391798584,3391798599,SG +3391798600,3391798607,JP +3391798608,3391798615,SG +3391798616,3391798639,JP +3391798640,3391798687,SG +3391798688,3391798703,JP +3391798704,3391798711,SG +3391798712,3391798735,JP +3391798736,3391798743,SG +3391798744,3391798767,JP +3391798768,3391801855,SG +3391801856,3391801887,JP +3391801888,3391801951,SG +3391801952,3391802015,JP +3391802016,3391802047,SG +3391802048,3391802111,JP +3391802112,3391802479,SG +3391802480,3391802623,JP +3391802624,3391802879,SG +3391802880,3391803135,JP +3391803136,3391804671,SG +3391804672,3391805183,JP +3391805184,3391805439,SG +3391805440,3391806207,JP +3391806208,3391806975,SG +3391806976,3391807167,JP +3391807168,3391807199,SG +3391807200,3391807231,JP +3391807232,3391807299,SG +3391807300,3391807327,JP +3391807328,3391807423,SG +3391807424,3391807455,JP +3391807456,3391807471,SG +3391807472,3391807475,JP +3391807476,3391808767,SG +3391808768,3391809279,JP +3391809280,3391809535,SG +3391809536,3391809631,JP +3391809632,3391809663,SG +3391809664,3391809727,JP +3391809728,3391809759,SG +3391809760,3391809791,JP +3391809792,3391810047,SG +3391810048,3391810559,JP +3391810560,3391811071,SG +3391811072,3391811103,JP +3391811104,3391811199,SG +3391811200,3391811263,JP +3391811264,3391815679,SG +3391815680,3391817727,AU +3391817728,3391819775,TO +3391819776,3391823871,JP +3391823872,3391827967,TH +3391827968,3391832063,KR +3391832064,3391832575,ID +3391832576,3391832831,AU +3391832832,3391833087,IN +3391833088,3391834111,JP +3391834112,3391835135,ID +3391835136,3391836159,CN +3391836160,3391836671,AU +3391836672,3391837183,HK +3391837184,3391838207,AU +3391838208,3391838719,ID +3391838720,3391838975,IN +3391838976,3391839231,US +3391839232,3391840255,ID +3391840256,3391841279,JP +3391841280,3391842303,MY +3391842304,3391843327,JP +3391843328,3391844351,VN +3391844352,3391845887,ID +3391845888,3391846399,PK +3391846400,3391847423,IN +3391847424,3391848447,HK +3391848448,3391849215,AU +3391849216,3391849471,IN +3391849472,3391851007,AU +3391851008,3391851263,SG +3391851264,3391851519,JP +3391851520,3391852543,AU +3391852544,3391856639,CN +3391856640,3391864831,ID +3391864832,3391866879,TW +3391866880,3391868927,US +3391868928,3391870975,SG +3391870976,3391873023,US +3391873024,3391877119,AU +3391877120,3391879167,JP +3391879168,3391881215,ID +3391881216,3391885311,TH +3391885312,3391889407,CN +3391889408,3391893503,TH +3391893504,3391894527,CN +3391894528,3391895551,TH +3391895552,3391896575,IN +3391896576,3391897599,NZ +3391897600,3391898367,TH +3391898368,3391898623,CN +3391898624,3391900159,TH +3391900160,3391900415,CN +3391900416,3391901695,AU +3391901696,3391905791,PK +3391905792,3391906047,TH +3391906048,3391906303,CN +3391906304,3391906815,AU +3391906816,3391907839,PH +3391907840,3391909887,BD +3391909888,3391910911,IO +3391910912,3391911935,AU +3391911936,3391913983,HK +3391913984,3391914239,TH +3391914240,3391914495,CN +3391914496,3391915007,TH +3391915008,3391915519,CN +3391915520,3391915775,AU +3391915776,3391916287,TH +3391916288,3391916543,VN +3391916544,3391918591,TH +3391918592,3391919103,CN +3391919104,3391920127,TH +3391920128,3391930367,AU +3391930368,3391946751,TH +3391946752,3391947519,CN +3391947520,3391947775,AU +3391947776,3391948287,HK +3391948288,3391948799,IN +3391948800,3391949311,HK +3391949312,3391949823,IN +3391949824,3391950079,JP +3391950080,3391950335,AU +3391950336,3391950591,HK +3391950592,3391954943,CN +3391954944,3391971327,HK +3391971328,3391979519,AU +3391979520,3391979775,HK +3391979776,3391979951,JP +3391979952,3391979955,CN +3391979956,3391979957,JP +3391979958,3391979959,CN +3391979960,3391980031,JP +3391980032,3391980543,HK +3391980544,3391983615,MY +3391983616,3391984639,NP +3391984640,3391984895,HK +3391984896,3391985151,ID +3391985152,3391986687,AU +3391986688,3391987199,PK +3391987200,3391987455,AU +3391987456,3391987711,BD +3391987712,3391991807,JP +3391991808,3392012287,HK +3392012288,3392016383,ID +3392016384,3392017151,CN +3392017152,3392017407,IN +3392017408,3392017919,CN +3392017920,3392018431,IN +3392018432,3392020479,ID +3392020480,3392028671,CN +3392028672,3392040959,ID +3392040960,3392045055,MY +3392045056,3392045311,CN +3392045312,3392046079,ID +3392046080,3392049151,AU +3392049152,3392053247,ID +3392053248,3392057343,AU +3392057344,3392061439,NZ +3392061440,3392069631,IN +3392069632,3392073727,CN +3392073728,3392077823,ID +3392077824,3392079871,AU +3392079872,3392086015,JP +3392086016,3392094207,PK +3392094208,3392098559,ID +3392098560,3392098815,AU +3392098816,3392099327,CN +3392099328,3392100095,AU +3392100096,3392100351,VN +3392100352,3392100607,ID +3392100608,3392100863,SG +3392100864,3392101887,ID +3392101888,3392102143,PK +3392102144,3392102399,AU +3392102400,3392106495,CN +3392106496,3392108543,IN +3392108544,3392109567,AU +3392109824,3392110079,PH +3392110080,3392110335,CN +3392110336,3392110591,IN +3392110592,3392110847,CN +3392110848,3392111103,PH +3392111104,3392111615,CN +3392111616,3392112127,PH +3392112128,3392112639,AU +3392112640,3392113663,JP +3392113664,3392114175,PH +3392114176,3392114431,VN +3392114432,3392114687,KR +3392114688,3392118783,GU +3392118784,3392126975,MY +3392126976,3392127231,ID +3392127232,3392127487,IN +3392127488,3392129023,ID +3392129024,3392129279,IN +3392129280,3392130303,ID +3392130304,3392130815,TW +3392130816,3392132863,ID +3392132864,3392133119,IN +3392133120,3392134655,ID +3392134656,3392134911,IN +3392134912,3392135167,ID +3392135168,3392143359,TH +3392143360,3392208895,JP +3392208896,3392287743,NZ +3392287744,3392288767,NP +3392288768,3392324607,NZ +3392324608,3392325119,AU +3392325120,3392325631,NZ +3392325632,3392326655,ID +3392326656,3392339967,NZ +3392339968,3392340991,NP +3392340992,3392344063,JP +3392344064,3392348159,ID +3392348160,3392354303,JP +3392354304,3392355327,ID +3392355328,3392356351,DE +3392356352,3392364543,NP +3392364544,3392372735,ID +3392372736,3392380927,HK +3392380928,3392385023,AU +3392385024,3392389119,BD +3392389120,3392401407,ID +3392401408,3392403455,SG +3392403456,3392404479,IN +3392404480,3392405503,ID +3392405504,3392406015,NP +3392406016,3392406527,IN +3392406528,3392407551,TH +3392407552,3392409599,ID +3392409600,3392413695,JP +3392413696,3392413951,PK +3392413952,3392414463,CN +3392414464,3392414719,HK +3392414720,3392415231,AU +3392415232,3392415487,JP +3392415488,3392415743,VN +3392415744,3392415999,BD +3392416000,3392416255,AU +3392416256,3392416767,HK +3392416768,3392417023,IN +3392417024,3392417535,AU +3392417536,3392417791,CN +3392417792,3392418559,ID +3392418560,3392418815,SG +3392418816,3392419071,ID +3392419072,3392419327,IN +3392419328,3392419839,PH +3392419840,3392420351,IN +3392420352,3392420863,ID +3392420864,3392421119,AU +3392421120,3392421375,MY +3392421376,3392421887,IN +3392421888,3392438271,SG +3392438272,3392438527,IN +3392438528,3392438783,AU +3392438784,3392439039,IN +3392439040,3392439551,ID +3392439552,3392439807,PG +3392439808,3392440063,IN +3392440064,3392440319,AU +3392440320,3392440575,HK +3392440576,3392440831,ID +3392440832,3392441343,BD +3392441344,3392441855,ID +3392441856,3392442111,AU +3392442112,3392442367,CN +3392442624,3392442879,AU +3392442880,3392443391,ID +3392443392,3392443647,IN +3392443648,3392443903,MY +3392443904,3392444159,IN +3392444160,3392444415,JP +3392444416,3392444671,NZ +3392444672,3392444927,IN +3392444928,3392445183,JP +3392445184,3392445439,NZ +3392445440,3392445695,ID +3392445696,3392445951,NZ +3392445952,3392446463,AU +3392446464,3392450559,PH +3392450560,3392454655,JP +3392454656,3392462847,HK +3392462848,3392472063,NP +3392472064,3392473087,AU +3392473088,3392475135,IN +3392475136,3392479231,JP +3392479232,3392487423,AU +3392487424,3392499711,IN +3392499712,3392503807,JP +3392503808,3392505343,HK +3392505344,3392505855,IN +3392505856,3392506879,HK +3392506880,3392507135,CN +3392507136,3392507647,HK +3392507648,3392507903,CN +3392507904,3392508927,KH +3392508928,3392510975,HK +3392510976,3392511999,MM +3392512000,3392516095,BD +3392516096,3392519167,AU +3392519168,3392519679,NZ +3392519680,3392524287,AU +3392524288,3392528383,JP +3392528384,3392536575,ID +3392536576,3392602111,IN +3392602112,3392618495,HK +3392618496,3392626687,SG +3392626688,3392630783,NZ +3392630784,3392634879,JP +3392634880,3392635903,PK +3392635904,3392636927,VN +3392636928,3392637951,JP +3392637952,3392638975,TH +3392638976,3392643071,AU +3392643072,3392647167,ID +3392647168,3392651263,MN +3392651264,3392659455,JP +3392659456,3392667647,TW +3392667648,3392668671,IN +3392668672,3392669695,BD +3392669696,3392671743,HK +3392671744,3392675839,JP +3392675840,3392681983,NZ +3392681984,3392682239,SG +3392682240,3392682495,VN +3392682496,3392683007,IN +3392683008,3392683519,AU +3392683520,3392684031,NL +3392684032,3392688127,JP +3392688128,3392692223,MY +3392692224,3392700415,IN +3392700416,3392708607,SG +3392708608,3392712703,ID +3392712704,3392716799,AF +3392716800,3392733183,IN +3392733184,3392741375,ID +3392741376,3392765951,PH +3392765952,3392782335,TH +3392782336,3392786431,CN +3392786432,3392787455,NL +3392787456,3392789503,CN +3392789504,3392790527,HK +3392790528,3392794623,JP +3392794624,3392798975,CN +3392798976,3392799231,JP +3392799232,3392799487,PH +3392799488,3392799743,AU +3392799744,3392800767,JP +3392800768,3392802815,SG +3392802816,3392803839,JP +3392803840,3392806911,HK +3392806912,3392815103,AU +3392815104,3392819199,ID +3392819200,3392823295,MY +3392823296,3392824319,KH +3392824320,3392824575,AU +3392824832,3392825343,IN +3392825344,3392826367,CN +3392826368,3392827391,BD +3392827392,3392828415,CN +3392828416,3392829439,JP +3392829440,3392830463,IN +3392830464,3392830719,ID +3392830720,3392830975,IN +3392830976,3392831231,TH +3392831232,3392831487,IN +3392831488,3392832511,PG +3392832512,3392833535,IN +3392833536,3392835583,AU +3392835584,3392839679,JP +3392839680,3392845823,ID +3392845824,3392847871,HK +3392847872,3392856063,ID +3392856064,3392857087,AU +3392857088,3392857343,IN +3392857344,3392858111,AU +3392858112,3392858367,IN +3392858368,3392858623,AU +3392858624,3392858879,JP +3392858880,3392859135,AU +3392859136,3392859647,PH +3392859648,3392860159,ID +3392860160,3392860671,AU +3392860672,3392861183,ID +3392861184,3392861439,TH +3392861440,3392861695,VN +3392861696,3392862207,AU +3392862208,3392863231,KI +3392863232,3392864255,BD +3392864256,3392864767,CN +3392864768,3392865279,IN +3392865280,3392866303,NU +3392866304,3392867327,MY +3392867328,3392868351,PK +3392868352,3392880639,AU +3392880640,3392888831,PK +3392888832,3392892927,AU +3392892928,3392897023,JP +3392897024,3392901119,BD +3392901120,3392903167,JP +3392903168,3392905215,HK +3392905216,3392909311,ID +3392909312,3392913407,JP +3392913408,3392917503,ID +3392917504,3392918527,BD +3392918528,3392919551,CN +3392919552,3392921599,KR +3392921600,3392921855,NZ +3392921856,3392922623,AU +3392922624,3392922879,IN +3392922880,3392923135,AU +3392923136,3392923391,BN +3392923392,3392923647,IN +3392923648,3392924159,HK +3392924160,3392924671,JP +3392924672,3392924927,CN +3392924928,3392925183,AU +3392925184,3392925695,VN +3392925696,3392925951,CN +3392925952,3392926719,AU +3392926720,3392927231,IN +3392927232,3392927743,AU +3392927744,3392927999,IN +3392928256,3392928767,TW +3392928768,3392929279,VN +3392929280,3392929535,PK +3392929536,3392929791,ID +3392929792,3392931839,MU +3392931840,3392933887,PH +3392933888,3392942079,JP +3392942080,3392944127,CN +3392944128,3392945151,MY +3392945152,3392946175,IN +3392946176,3392954367,AU +3392954368,3392956415,CN +3392956416,3392958463,VN +3392958464,3392962559,CN +3392962560,3392963583,IN +3392963584,3392970751,CN +3392970752,3392978943,JP +3392978944,3392983039,TH +3392983040,3392987135,IN +3392987136,3392995327,HK +3392995328,3392995583,PG +3392995584,3392995839,JP +3392995840,3392996351,NZ +3392996352,3392997375,AU +3392997376,3392998399,IN +3392998400,3392999423,AU +3392999424,3393003519,JP +3393003520,3393011711,PK +3393011712,3393012735,PH +3393012736,3393013759,CN +3393013760,3393014783,AU +3393014784,3393015807,CN +3393015808,3393016831,IN +3393016832,3393017855,HK +3393017856,3393018879,CN +3393018880,3393019903,AU +3393019904,3393021439,ID +3393021440,3393021695,IN +3393021696,3393021951,HK +3393021952,3393022463,ID +3393022464,3393022975,VU +3393023232,3393023487,AU +3393023488,3393023743,SG +3393024000,3393024511,ID +3393024512,3393025023,NZ +3393025024,3393025279,AU +3393025280,3393025535,IN +3393025536,3393025791,PH +3393025792,3393026047,AU +3393026048,3393026559,IN +3393026560,3393026815,AU +3393026816,3393027071,CN +3393027072,3393027839,ID +3393027840,3393028095,CN +3393028096,3393060863,AU +3393060864,3393062911,FJ +3393062912,3393069055,ID +3393069056,3393077247,KH +3393077248,3393085439,IN +3393085440,3393089535,LA +3393089536,3393090559,CN +3393090560,3393091071,IN +3393091072,3393093631,FJ +3393093632,3393101823,AU +3393101824,3393110015,JP +3393110016,3393118207,HK +3393118208,3393122303,IN +3393122304,3393123327,AU +3393123328,3393123583,IN +3393123584,3393123839,NZ +3393123840,3393124351,IN +3393124352,3393125631,CN +3393125632,3393125887,JP +3393125888,3393126143,AU +3393126144,3393126399,CN +3393126400,3393134591,HK +3393134592,3393146879,AU +3393146880,3393150975,CN +3393150976,3393159167,IN +3393159168,3393167359,SG +3393167360,3393175551,CN +3393175552,3393183743,PK +3393183744,3393184255,SG +3393184256,3393184767,PK +3393184768,3393187839,SG +3393187840,3393189887,NP +3393189888,3393190911,CN +3393190912,3393191167,IN +3393191168,3393191423,CN +3393191424,3393191935,SB +3393191936,3393198335,HK +3393198336,3393198591,JP +3393198592,3393206271,HK +3393206272,3393206527,JP +3393206528,3393208063,HK +3393208064,3393208831,JP +3393208832,3393214207,HK +3393214208,3393214463,JP +3393214464,3393217535,HK +3393217536,3393217791,JP +3393217792,3393218047,HK +3393218048,3393218559,JP +3393218560,3393219839,HK +3393219840,3393220607,JP +3393220608,3393222911,HK +3393222912,3393223167,JP +3393223168,3393224703,HK +3393224704,3393224959,JP +3393224960,3393225471,HK +3393225472,3393225617,JP +3393225618,3393225618,HK +3393225619,3393225727,JP +3393225728,3393227007,HK +3393227008,3393227263,JP +3393227264,3393227519,HK +3393227520,3393227775,JP +3393227776,3393231871,HK +3393231872,3393232127,JP +3393232128,3393236479,HK +3393236480,3393236735,JP +3393236736,3393237759,HK +3393237760,3393238015,JP +3393238016,3393241087,HK +3393241088,3393241343,JP +3393241344,3393245695,HK +3393245696,3393245951,JP +3393245952,3393251839,HK +3393251840,3393252095,JP +3393252096,3393253375,HK +3393253376,3393253631,JP +3393253632,3393257471,HK +3393257472,3393260031,CN +3393260032,3393260543,BD +3393260544,3393265663,AU +3393265664,3393273855,CK +3393273856,3393282047,AU +3393282048,3393286143,CN +3393286144,3393290239,ID +3393290240,3393298431,IN +3393298432,3393300479,NZ +3393300480,3393302527,BD +3393302528,3393306623,PH +3393306624,3393314815,HK +3393314816,3393318911,ID +3393318912,3393320959,SG +3393320960,3393359840,HK +3393359841,3393359841,CN +3393359842,3393363967,HK +3393363968,3393364991,AU +3393364992,3393366015,IN +3393366016,3393367039,CN +3393367040,3393372159,IN +3393372160,3393374975,HK +3393374976,3393375743,SG +3393375744,3393375999,HK +3393376000,3393376255,TW +3393376256,3393388543,HK +3393388544,3393389567,CN +3393389568,3393390591,IN +3393390592,3393392639,ID +3393392640,3393396735,JP +3393396736,3393400831,ID +3393400832,3393404927,JP +3393404928,3393421311,AU +3393421312,3393470463,HK +3393470464,3393474559,AU +3393474560,3393478655,NZ +3393478656,3393486847,AU +3393486848,3393495039,IN +3393495040,3393499135,AU +3393499136,3393503231,SG +3393503232,3393507327,HK +3393507328,3393511423,SG +3393511424,3393519615,KR +3393519616,3393520639,HK +3393520640,3393521663,CN +3393521664,3393523711,PK +3393523712,3393527807,CN +3393527808,3393535999,PK +3393536000,3393544191,HK +3393544192,3393548287,ID +3393548288,3393552383,JP +3393552384,3393553407,HK +3393553408,3393554431,AU +3393554432,3393556479,TH +3393556480,3393560575,SG +3393560576,3393568767,PH +3393568768,3393572863,LK +3393572864,3393576959,AU +3393576960,3393581055,JP +3393581056,3393585151,HK +3393585152,3393593343,CN +3393593344,3393597439,MN +3393597440,3393601535,ID +3393601536,3393609727,NP +3393609728,3393613823,CN +3393613824,3393617919,AS +3393617920,3393618431,AU +3393618432,3393618687,NZ +3393618688,3393618943,IN +3393618944,3393620223,ID +3393620224,3393620479,AU +3393620480,3393620735,ID +3393620736,3393620991,AU +3393620992,3393621247,JP +3393621248,3393622015,AU +3393622016,3393626111,PK +3393626112,3393629523,HK +3393629524,3393629525,MO +3393629526,3393630207,HK +3393630208,3393634303,JP +3393634304,3393638399,CN +3393638400,3393650687,JP +3393650688,3393658879,IN +3393658880,3393662975,CN +3393662976,3393675263,JP +3393675264,3393679359,MY +3393679360,3393683455,TH +3393683456,3393691647,IN +3393691648,3393695743,AU +3393695744,3393699839,PH +3393699840,3393717759,HK +3393717760,3393718015,US +3393718016,3393724415,HK +3393724416,3393726463,AU +3393726464,3393728511,CN +3393728512,3393736703,JP +3393736704,3393740799,CN +3393740800,3393741567,US +3393741568,3393741823,MG +3393741824,3393742847,US +3393742848,3393743871,TL +3393743872,3393744895,US +3393744896,3393748991,CN +3393748992,3393765375,AU +3393765376,3393773567,ID +3393773568,3393774591,IN +3393774592,3393775615,HK +3393775616,3393777663,BD +3393777664,3393779711,MN +3393779712,3393780735,IN +3393780736,3393782783,HK +3393782784,3393783807,BD +3393783808,3393785855,MY +3393785856,3393789951,ID +3393789952,3393798143,SG +3393798144,3393806335,JP +3393806336,3393814527,ID +3393814528,3393815551,CN +3393815552,3393816575,KR +3393816576,3393818623,JP +3393818624,3393822719,AU +3393822720,3393830911,PH +3393830912,3393835007,NZ +3393835008,3393839103,JP +3393839104,3393843199,ID +3393843200,3393847295,CN +3393847296,3393848319,HK +3393848320,3393849343,JP +3393849344,3393851391,CN +3393851392,3393855487,JP +3393855488,3393855743,AU +3393855744,3393855999,NZ +3393856000,3393856255,AU +3393856256,3393856511,HK +3393856512,3393856767,CN +3393856768,3393857023,SG +3393857024,3393857535,NZ +3393857536,3393858047,HK +3393858048,3393858303,CN +3393858304,3393858559,ID +3393858560,3393858815,AU +3393858816,3393859071,ID +3393859072,3393859327,AU +3393859328,3393859583,JP +3393859840,3393860095,AU +3393860096,3393860607,HK +3393860608,3393860863,CN +3393860864,3393861375,IN +3393861376,3393861631,US +3393861632,3393861887,VN +3393861888,3393862143,AU +3393862144,3393862655,VN +3393862656,3393862911,NZ +3393862912,3393863167,AU +3393863168,3393863679,SG +3393863680,3393865727,AU +3393865728,3393867775,ID +3393867776,3393871871,CN +3393871872,3393872127,HK +3393872128,3393872383,JP +3393872384,3393872655,HK +3393872656,3393872656,IN +3393872657,3393874943,HK +3393874944,3393875967,AU +3393875968,3393876991,HK +3393876992,3393878015,SG +3393878016,3393879039,IN +3393879040,3393880063,HK +3393880064,3393896447,AU +3393896448,3393906687,NZ +3393906688,3393907711,CN +3393907712,3393908735,ID +3393908736,3393910783,BD +3393910784,3393911807,PH +3393911808,3393912063,AU +3393912064,3393912319,JP +3393912320,3393912831,CN +3393912832,3393913855,HK +3393913856,3393914879,MY +3393914880,3393916927,JP +3393916928,3393921023,ID +3393921024,3393929215,MY +3393929216,3393937407,HK +3393937408,3393941503,ID +3393941504,3393945599,JP +3393945600,3393961983,MY +3393961984,3393966079,IN +3393966080,3393970175,CN +3393970176,3393974271,JP +3393974272,3393976319,SG +3393976320,3393977343,MO +3393977344,3393978367,CN +3393978368,3393995263,HK +3393995264,3393995264,ZA +3393995265,3393995775,HK +3393995776,3393996031,DE +3393996032,3393999615,HK +3393999616,3393999871,JP +3393999872,3394000127,HK +3394000128,3394000383,SG +3394000384,3394000639,TW +3394000640,3394005759,HK +3394005760,3394006015,US +3394006016,3394011135,HK +3394011136,3394027519,AU +3394027520,3394035711,JP +3394035712,3394039807,MY +3394039808,3394040575,SG +3394040576,3394040831,IN +3394040832,3394041087,SG +3394041088,3394041343,MY +3394041344,3394041855,SG +3394041856,3394042879,AU +3394042880,3394043903,CN +3394043904,3394060287,HK +3394060288,3394064383,ID +3394064384,3394066431,CN +3394066432,3394067455,AU +3394067456,3394068479,CN +3394068480,3394076671,ID +3394076672,3394078719,HK +3394078720,3394078975,AU +3394078976,3394079231,IN +3394079232,3394079743,PH +3394079744,3394087471,HK +3394087472,3394087487,CN +3394087488,3394111487,HK +3394111488,3394113535,CN +3394113536,3394116095,SG +3394116096,3394116607,AU +3394116608,3394117631,SG +3394117632,3394121727,AU +3394121728,3394125823,SG +3394125824,3394142207,PH +3394142208,3394150399,NZ +3394150400,3394154495,IN +3394154496,3394158591,JP +3394158592,3394162687,ID +3394162688,3394166783,JP +3394166784,3394168831,VN +3394168832,3394170879,IN +3394170880,3394172927,NZ +3394172928,3394173695,JP +3394173696,3394173951,IN +3394173952,3394174975,HK +3394174976,3394179071,JP +3394179072,3394181119,BD +3394181120,3394183167,KH +3394183168,3394191359,NP +3394191360,3394207743,SG +3394207744,3394215935,JP +3394215936,3394220031,AU +3394220032,3394232319,SG +3394232320,3394234367,CN +3394234368,3394236415,VN +3394236416,3394238463,JP +3394238464,3394239487,CN +3394239488,3394244095,HK +3394244096,3394244607,TW +3394244608,3394248703,HK +3394248704,3394252799,VU +3394252800,3394256895,IN +3394256896,3394265087,AU +3394265088,3394267135,JP +3394267136,3394269183,TW +3394269184,3394273279,ID +3394273280,3394277375,HK +3394277376,3394279423,AU +3394279424,3394281471,PH +3394281472,3394285567,SG +3394285568,3394289663,AU +3394289664,3394293759,CN +3394293760,3394297855,ID +3394297856,3394306047,TH +3394306048,3394307071,CN +3394307072,3394308095,AU +3394308096,3394310143,JP +3394310144,3394314239,AU +3394314240,3394322431,ID +3394322432,3394326527,AU +3394326528,3394330623,JP +3394330624,3394338815,AU +3394338816,3394347007,IN +3394347008,3394351103,PH +3394351104,3394355199,CN +3394355200,3394359295,IN +3394359296,3394363391,AU +3394363392,3394441215,HK +3394441216,3394453503,IN +3394453504,3394461695,AU +3394461696,3394465791,SG +3394465792,3394467839,AU +3394467840,3394468863,ID +3394468864,3394469887,BD +3394469888,3394478079,JP +3394478080,3394482175,PK +3394482176,3394484223,AU +3394484224,3394486271,JP +3394486272,3394494463,HK +3394494464,3394498559,JP +3394498560,3394500607,HK +3394500608,3394501631,SG +3394501632,3394502655,CN +3394502656,3394503679,HK +3394503680,3394507263,CN +3394507264,3394507775,JP +3394507776,3394508287,AU +3394508288,3394508543,CN +3394508544,3394508799,PH +3394508800,3394510847,CN +3394510848,3394514943,BD +3394514944,3394519039,JP +3394519040,3394521087,BD +3394521088,3394523135,KH +3394523136,3394527231,JP +3394527232,3394535423,PH +3394535424,3394621439,HK +3394621440,3394625535,CN +3394625536,3394629631,HK +3394629632,3394631679,AU +3394631680,3394634751,HK +3394634752,3394635775,AU +3394635776,3394637823,KR +3394637824,3394641919,AF +3394641920,3394648063,AU +3394648064,3394650111,JP +3394650112,3394658303,HK +3394658304,3394662399,NZ +3394662400,3394664447,AU +3394664448,3394666495,JP +3394666496,3394682879,MO +3394682880,3394686975,PH +3394686976,3394689023,AU +3394689024,3394691071,BD +3394691072,3394697215,JP +3394697216,3394697471,SG +3394697472,3394697727,CN +3394697728,3394697983,AU +3394697984,3394698239,IN +3394698240,3394699263,CN +3394699264,3394700287,HK +3394700288,3394707455,AU +3394707456,3394715647,IN +3394715648,3394719743,JP +3394719744,3394723839,CN +3394723840,3394732031,MY +3394732032,3394740223,NC +3394740224,3394744319,AU +3394744320,3394752511,ID +3394752512,3394753535,WS +3394753536,3394754559,VN +3394754560,3394756607,MY +3394756608,3394760703,JP +3394760704,3394764799,ID +3394764800,3394765311,HK +3394765312,3394765567,JP +3394765568,3394765823,DE +3394765824,3394766335,HK +3394766336,3394766591,US +3394766592,3394768639,HK +3394768640,3394768895,US +3394768896,3394769151,HK +3394769152,3394769407,SG +3394769408,3394769919,HK +3394769920,3394770431,TW +3394770432,3394770687,HK +3394770688,3394770943,SG +3394770944,3394771711,HK +3394771712,3394771967,TW +3394771968,3394772991,HK +3394772992,3394774015,CN +3394774016,3394775039,HK +3394775040,3394776063,BD +3394776064,3394777087,NZ +3394777088,3394781183,JP +3394781184,3394789375,MP +3394789376,3394791167,HK +3394791168,3394792959,US +3394792960,3394793215,HK +3394793216,3394793216,ZA +3394793217,3394796287,HK +3394796288,3394796288,ZA +3394796289,3394797567,HK +3394797568,3394813951,IN +3394813952,3394815999,JP +3394816000,3394818047,HK +3394818048,3394830335,IN +3394830336,3394831359,HK +3394831360,3394832383,NZ +3394832384,3394834431,CN +3394834432,3394834559,HK +3394834560,3394834575,JP +3394834576,3394834591,SG +3394834592,3394834599,JP +3394834600,3394834607,SG +3394834608,3394834687,HK +3394834688,3394834943,JP +3394834944,3394834959,HK +3394834960,3394834975,JP +3394834976,3394834983,HK +3394834984,3394834991,SG +3394834992,3394835055,HK +3394835056,3394835071,SG +3394835072,3394835199,HK +3394835200,3394835455,JP +3394835456,3394835583,SG +3394835584,3394835711,JP +3394835712,3394835967,CN +3394835968,3394836239,JP +3394836240,3394836247,AS +3394836248,3394836415,JP +3394836416,3394836479,HK +3394836480,3394838527,BT +3394838528,3394846719,NZ +3394846720,3394850815,IN +3394850816,3394854911,JP +3394854912,3394855935,CN +3394855936,3394856959,AU +3394856960,3394857983,IN +3394857984,3394859007,CN +3394859008,3394860031,JP +3394860032,3394860543,ID +3394860544,3394860799,IN +3394860800,3394861055,CN +3394861056,3394861311,IN +3394861312,3394862079,HK +3394862080,3394863103,KR +3394863104,3394871295,NZ +3394871296,3394879487,AU +3394879488,3394883583,PH +3394883584,3394887679,ID +3394887680,3394889727,JP +3394889728,3394891775,CN +3394891776,3394893823,JP +3394893824,3394894847,KR +3394894848,3394895871,HK +3394895872,3394896895,CN +3394896896,3394897919,TH +3394897920,3394899967,JP +3394899968,3394904063,CN +3394904064,3394904319,AU +3394904320,3394904575,IN +3394904576,3394905087,AU +3394905088,3394905343,BN +3394905344,3394905599,CN +3394905600,3394906111,AU +3394906112,3394906367,IN +3394906368,3394906623,AU +3394906624,3394907135,IN +3394907136,3394908159,NZ +3394908160,3394910207,AU +3394910208,3394912255,NZ +3394912256,3394920447,PF +3394920448,3394928639,CN +3394928640,3394936831,PH +3394936832,3394940927,AU +3394940928,3394945023,JP +3394945024,3394945279,IN +3394945280,3394945535,CN +3394945536,3394946047,ID +3394946048,3394946303,CN +3394946304,3394946559,AU +3394946560,3394947071,ID +3394947072,3394948095,BD +3394948096,3394948351,IN +3394948352,3394948607,CN +3394948608,3394949119,AU +3394949120,3394953215,JP +3394953216,3394957311,CN +3394957312,3394959359,AU +3394959360,3394960383,HK +3394960384,3394961407,KR +3394961408,3394962431,CN +3394962432,3394963455,AU +3394963456,3394965503,ID +3394965504,3394967551,TH +3394967552,3394969599,ID +3394969600,3394970623,US +3394970624,3394971647,CN +3394971648,3394972671,BD +3394972672,3394973695,AU +3394973696,3394977791,JP +3394977792,3394985983,IN +3394985984,3394990079,CN +3394990080,3394994175,JP +3394994176,3394995199,CN +3394995200,3394998271,IN +3394998272,3395002367,JP +3395002368,3395006463,PH +3395006464,3395010559,CN +3395010560,3395014655,AU +3395014656,3395018751,JP +3395018752,3395027967,CN +3395027968,3395028991,VN +3395028992,3395031039,CN +3395031040,3395035135,PK +3395035136,3395039231,AU +3395039232,3395043327,CN +3395043328,3395059711,AU +3395059712,3395067903,PH +3395067904,3395076095,HK +3395076096,3395080191,ID +3395080192,3395082239,AU +3395082240,3395084287,NZ +3395084288,3395088383,IN +3395088384,3395091455,AU +3395091456,3395093503,CN +3395093504,3395094015,AU +3395094016,3395094527,KR +3395094528,3395096575,KH +3395096576,3395104767,ID +3395104768,3395108863,TH +3395108864,3395117055,JP +3395117056,3395121151,AU +3395121152,3395129343,ID +3395129344,3395131391,JP +3395131392,3395131647,AU +3395131648,3395131903,KH +3395131904,3395132159,IN +3395132160,3395132415,AU +3395132416,3395133439,VN +3395133440,3395141631,AU +3395141632,3395145727,HK +3395145728,3395149823,BN +3395149824,3395155967,ID +3395155968,3395156991,AU +3395156992,3395158015,CN +3395166208,3395170303,AU +3395170304,3395174399,JP +3395174400,3395174911,AU +3395174912,3395175167,NP +3395175168,3395175423,IN +3395175680,3395175935,AU +3395175936,3395176191,SG +3395176192,3395176703,AU +3395176704,3395176959,TH +3395176960,3395177215,CN +3395177216,3395177471,HK +3395177472,3395177983,TH +3395177984,3395178495,AU +3395178496,3395178751,ID +3395178752,3395179007,CN +3395179008,3395179263,VN +3395179264,3395180031,ID +3395180032,3395180287,JP +3395180288,3395180543,HK +3395180544,3395181055,VN +3395181056,3395181567,TH +3395181568,3395182591,CN +3395182592,3395190783,SG +3395190784,3395198975,JP +3395198976,3395199999,IN +3395200000,3395200511,BD +3395200512,3395200767,TH +3395200768,3395201023,MY +3395201024,3395202047,TH +3395202048,3395203071,IN +3395203072,3395215359,JP +3395215360,3395219455,HK +3395219456,3395223551,TH +3395223552,3395231743,CN +3395231744,3395239935,JP +3395239936,3395254783,SG +3395254784,3395255039,IN +3395255040,3395256319,SG +3395256320,3395264511,ID +3395264512,3395272703,JP +3395272704,3395276799,PG +3395276800,3395280895,JP +3395280896,3395284991,PH +3395284992,3395287039,CN +3395287040,3395287551,JP +3395287552,3395287807,NZ +3395287808,3395288063,IN +3395288064,3396995071,CN +3396995072,3396997119,ID +3396997120,3396999167,IN +3396999168,3397001215,JP +3397001216,3397003263,CN +3397003264,3397005311,TH +3397005312,3397009407,JP +3397009408,3397017599,CN +3397017600,3397021695,HK +3397021696,3397026047,CN +3397026048,3397026303,AU +3397026304,3397026815,TH +3397026816,3397027071,CN +3397027072,3397027327,PH +3397027328,3397027839,IN +3397027840,3397029887,JP +3397029888,3397033983,MY +3397033984,3397038079,ID +3397038080,3397058559,JP +3397058560,3397066751,MU +3397066752,3397070847,IN +3397070848,3397074943,PH +3397074944,3397083135,HK +3397083136,3397087231,CN +3397087232,3397088255,HK +3397088256,3397090303,CN +3397090304,3397091327,TW +3397091328,3397093887,MP +3397093888,3397094399,GU +3397094400,3397097471,MP +3397097472,3397099519,GU +3397099520,3397103615,HK +3397103616,3397105663,LA +3397105664,3397107711,JP +3397107712,3397115903,HK +3397115904,3397119999,ID +3397120000,3397124095,PK +3397124096,3397128191,JP +3397128192,3397131263,CN +3397131264,3397132287,HK +3397132288,3397136383,AU +3397136384,3397140479,JP +3397140480,3397148671,AU +3397148672,3397156863,NZ +3397156864,3397165055,PH +3397165056,3397173247,LK +3397173248,3397173503,AU +3397173504,3397173759,PH +3397173760,3397174015,IN +3397174016,3397174271,AU +3397174272,3397175295,ID +3397175296,3397175807,AU +3397175808,3397176063,IN +3397176064,3397176319,ID +3397176320,3397176575,VN +3397176576,3397176831,ID +3397176832,3397177343,AU +3397177344,3397181439,JP +3397181440,3397185535,PW +3397185536,3397187583,AU +3397187584,3397188607,HK +3397188608,3397189631,PH +3397189632,3397201919,AU +3397201920,3397206015,JP +3397206016,3397210111,BD +3397210112,3397211135,ID +3397211136,3397212159,AU +3397212160,3397212671,ID +3397212672,3397213183,HK +3397213184,3397213439,IN +3397213440,3397213695,AU +3397213696,3397214207,ID +3397214208,3397215231,AU +3397215232,3397215743,ID +3397215744,3397216255,PH +3397216256,3397216767,AU +3397216768,3397217023,IN +3397217024,3397217279,SG +3397217280,3397217535,BD +3397217536,3397217791,CN +3397217792,3397218047,NZ +3397218048,3397218303,AU +3397218304,3397222399,CN +3397222400,3397230591,PK +3397230592,3397234687,AU +3397234688,3397238783,CN +3397238784,3397255167,HK +3397255168,3397263359,JP +3397263360,3397267455,PH +3397267456,3397271551,HK +3397271552,3397275647,TW +3397275648,3397277695,NZ +3397277696,3397279743,MN +3397279744,3397283839,AU +3397283840,3397285887,KR +3397285888,3397287935,BD +3397287936,3397299359,SG +3397299360,3397299375,IN +3397299376,3397304319,SG +3397304320,3397308415,NZ +3397308416,3397312511,HK +3397312512,3397320703,JP +3397320704,3397322751,CN +3397322752,3397323775,NZ +3397323776,3397328895,CN +3397328896,3397330943,ID +3397330944,3397337087,CN +3397337088,3397338039,HK +3397338040,3397338043,SG +3397338044,3397338375,HK +3397338376,3397338379,JP +3397338380,3397338403,HK +3397338404,3397338415,JP +3397338416,3397338423,HK +3397338424,3397338427,JP +3397338428,3397338455,HK +3397338456,3397338457,JP +3397338458,3397338459,HK +3397338460,3397338463,JP +3397338464,3397339647,HK +3397339648,3397339687,SG +3397339688,3397340927,HK +3397340928,3397341183,TH +3397341184,3397345279,JP +3397345280,3397349375,ID +3397349376,3397363711,CN +3397363712,3397365759,HK +3397365760,3397369855,JP +3397369856,3397374463,CN +3397374464,3397374975,AU +3397374976,3397386239,CN +3397386240,3397394431,GU +3397394432,3397402623,PH +3397402624,3397410815,GU +3397410816,3397411327,AU +3397411328,3397411583,SG +3397411584,3397411839,HK +3397411840,3397412351,KR +3397412352,3397412863,AU +3397412864,3397413375,HK +3397413376,3397413631,AU +3397413632,3397413887,IN +3397413888,3397414399,SC +3397414400,3397414911,IN +3397414912,3397419007,AU +3397419008,3397419583,HK +3397419584,3397419599,KR +3397419600,3397419607,HK +3397419608,3397419615,KR +3397419616,3397419647,HK +3397419648,3397419671,KR +3397419672,3397419711,HK +3397419712,3397419719,KR +3397419720,3397427199,HK +3397427200,3397443583,SG +3397443584,3397451775,HK +3397451776,3397468159,TH +3397468160,3397492735,AU +3397492736,3397496831,MY +3397496832,3397498879,JP +3397498880,3397500927,ID +3397500928,3397501951,BD +3397501952,3397503999,IN +3397504000,3397505023,TH +3397505024,3397505279,CN +3397505280,3397506559,IN +3397506560,3397506815,AU +3397506816,3397507071,IN +3397507072,3397507583,ID +3397507584,3397507839,AU +3397507840,3397508095,IN +3397508096,3397509119,PH +3397509120,3397510143,ID +3397510144,3397511167,FJ +3397511168,3397512191,LK +3397512192,3397512447,KH +3397512448,3397512703,AU +3397512704,3397512959,PH +3397512960,3397513727,IN +3397513728,3397514239,SG +3397514240,3397515263,AU +3397515264,3397516287,NP +3397516288,3397516543,AU +3397516544,3397516799,NZ +3397516800,3397517055,JP +3397517056,3397517311,AU +3397517312,3397525503,CN +3397525504,3397526527,AU +3397526528,3397527039,VN +3397527040,3397527295,AU +3397527296,3397527551,CN +3397527552,3397528575,IN +3397528576,3397530623,AU +3397530624,3397531647,ID +3397531648,3397532671,SG +3397532672,3397533695,JP +3397533696,3397566463,HK +3397566464,3397574655,AU +3397574656,3397582847,CN +3397582848,3397584895,MN +3397584896,3397586943,JP +3397586944,3397588991,CN +3397588992,3397591039,KR +3397591040,3397595135,HK +3397595136,3397599231,CN +3397599232,3397603327,HK +3397603328,3397605375,KH +3397605376,3397607423,AU +3397607424,3397623807,IN +3397623808,3397631999,GU +3397632000,3397636095,JP +3397636096,3397640191,CN +3397640192,3397648383,MN +3397648384,3397713919,TW +3397713920,3397715967,ID +3397715968,3397718015,HK +3397718016,3397722111,KR +3397722112,3397726207,CN +3397726208,3397734399,IN +3397734400,3397735423,MY +3397735424,3397736447,MM +3397736448,3397737471,BD +3397737472,3397738495,IN +3397738496,3397742591,MY +3397742592,3397746687,JP +3397746688,3397763071,TH +3397763072,3397771263,SG +3397771264,3397779455,TW +3397779456,3397781503,ID +3397781504,3397783551,BD +3397783552,3397785599,VN +3397785600,3397787647,TO +3397787648,3397791743,AU +3397791744,3397791999,NZ +3397792000,3397792767,AU +3397792768,3397793023,IN +3397793024,3397793279,NZ +3397793280,3397793535,VN +3397793536,3397793791,AU +3397793792,3397794303,PH +3397794304,3397794559,CN +3397794560,3397794815,IN +3397794816,3397812223,HK +3397812224,3397816319,CN +3397816320,3397832703,IN +3397832704,3397836799,CN +3397836800,3397844991,AU +3397844992,3397845247,JP +3397845248,3397845503,AU +3397845504,3397846015,JP +3397846016,3397846271,AU +3397846272,3397848063,JP +3397848064,3397849087,SG +3397849088,3397857791,JP +3397857792,3397858559,AU +3397858560,3397869823,JP +3397869824,3397870079,AU +3397870080,3397871871,JP +3397871872,3397872127,AU +3397872128,3397887999,JP +3397888000,3397889023,IN +3397889024,3397895423,JP +3397895424,3397895679,AU +3397895680,3397906111,JP +3397906112,3397906175,IN +3397906176,3397907455,JP +3397907456,3397908479,HK +3397908480,3397910527,JP +3397910528,3397918719,SG +3397918720,3397922815,AU +3397922816,3397926911,CN +3397926912,3397933055,IN +3397933056,3397934079,BD +3397934080,3397935103,PH +3397935104,3397939199,AU +3397939200,3397951487,KR +3397951488,3397959679,SG +3397959680,3397963775,JP +3397963776,3397971967,CN +3397971968,3397974015,LA +3397974016,3397975039,CN +3397975040,3397976063,AU +3397976064,3397984255,ID +3397984256,3397992447,JP +3397992448,3398004735,AU +3398004736,3398008831,PH +3398008832,3398017023,LA +3398017024,3398021119,AU +3398021120,3398023167,FJ +3398023168,3398025215,JP +3398025216,3398029311,AU +3398029312,3398033407,IN +3398033408,3398033663,NZ +3398033664,3398033919,ID +3398033920,3398034943,IN +3398034944,3398035199,ID +3398035200,3398035455,CN +3398035456,3398037503,IN +3398037504,3398039551,NZ +3398039552,3398040575,IN +3398040576,3398041599,MY +3398041600,3398062079,AU +3398062080,3398066175,JP +3398066176,3398074367,IN +3398074368,3398090751,PH +3398090752,3398098943,AU +3398098944,3398107135,ID +3398107136,3398107586,AU +3398107587,3398107587,US +3398107588,3398156287,AU +3398156288,3398164479,TH +3398164480,3398172671,AU +3398172672,3398180863,JP +3398180864,3398189055,IN +3398189056,3398205439,HK +3398205440,3398208511,IN +3398208512,3398213631,CN +3398213632,3398221823,TW +3398221824,3398230015,JP +3398230016,3398238207,HK +3398238208,3398279167,IN +3398279168,3398287359,CN +3398287360,3398291455,JP +3398291456,3398295551,AU +3398295552,3398303743,PK +3398303744,3398305791,IN +3398305792,3398307839,JP +3398307840,3398311935,CN +3398311936,3398320127,AU +3398320128,3398336511,IN +3398336512,3398340607,AU +3398340608,3398352895,PK +3398352896,3398361087,TH +3398361088,3398369279,JP +3398369280,3398369791,IN +3398369792,3398370303,JP +3398370304,3398371327,CN +3398371328,3398373375,JP +3398373376,3398381567,CN +3398381568,3398383615,AU +3398383616,3398385663,CN +3398385664,3398393855,JP +3398393856,3398394879,IN +3398394880,3398396927,CN +3398396928,3398397951,VN +3398397952,3398402047,PK +3398402048,3398418431,TH +3398418432,3398434815,JP +3398434816,3398467583,IN +3398467584,3398475775,BT +3398475776,3398481919,AU +3398481920,3398483967,LA +3398483968,3398484735,US +3398484736,3398484991,MY +3398484992,3398485247,AQ +3398485248,3398485503,CN +3398485504,3398485759,US +3398485760,3398486015,AQ +3398486016,3398487039,BD +3398487040,3398488063,NZ +3398488064,3398492159,TW +3398492160,3398500351,JP +3398500352,3398504447,ID +3398504448,3398508543,JP +3398508544,3398565887,TW +3398565888,3398567423,ID +3398567424,3398569983,AU +3398569984,3398572031,JP +3398572032,3398574079,AU +3398574080,3398582271,ID +3398582272,3398590463,MY +3398590464,3398598655,HK +3398598656,3398606847,ID +3398606848,3398610943,CN +3398610944,3398612991,ID +3398612992,3398613503,PH +3398613504,3398613759,CN +3398613760,3398614015,AU +3398614016,3398615039,CN +3398615040,3398616063,IN +3398616064,3398619135,CN +3398619136,3398621183,AU +3398621184,3398623231,HK +3398623232,3398631423,ID +3398631424,3398634439,JP +3398634440,3398634447,KR +3398634448,3398636543,JP +3398636544,3398636575,HK +3398636576,3398637119,JP +3398637120,3398637183,HK +3398637184,3398639903,JP +3398639904,3398639907,MY +3398639908,3398640671,JP +3398640672,3398640695,SG +3398640696,3398641663,JP +3398641664,3398643679,AU +3398643680,3398643695,NZ +3398643696,3398643711,AU +3398643712,3398647807,JP +3398647808,3398655999,IN +3398656000,3398668287,AU +3398668288,3398672383,CN +3398672384,3398680575,PK +3398680576,3398684671,ID +3398684672,3398688767,JP +3398688768,3398705151,ID +3398705152,3398709247,CN +3398709248,3398710271,KR +3398710272,3398713343,IN +3398713344,3398729727,CN +3398729728,3398737919,AU +3398737920,3398742015,SG +3398742016,3398746111,TH +3398746112,3398750207,IN +3398750208,3398754303,TW +3398754304,3398758399,AU +3398758400,3398768639,JP +3398768640,3398770687,TH +3398770688,3398778879,CN +3398778880,3398787071,ID +3398787072,3398795263,TH +3398795264,3398803455,ID +3398803456,3398811647,CN +3398811648,3398819839,IN +3398819840,3398828031,CN +3398828032,3398829055,KH +3398829056,3398830079,IN +3398830080,3398831103,KH +3398831104,3398831359,JP +3398831360,3398831615,HK +3398831616,3398832127,JP +3398832128,3398840319,CN +3398840320,3398842367,JP +3398842368,3398843391,CN +3398843392,3398844415,AU +3398844416,3398852607,ID +3398852608,3398860799,NZ +3398860800,3398873087,ID +3398873088,3398877183,KR +3398877184,3398881279,CN +3398881280,3398885375,SG +3398885376,3398894591,CN +3398894592,3398895615,TH +3398895616,3398897663,ID +3398897664,3398901759,FJ +3398901760,3398902015,AU +3398902016,3398902271,CN +3398902272,3398902783,PH +3398902784,3398903807,AU +3398903808,3398905855,TH +3398905856,3398909951,TW +3398909952,3398918143,GU +3398918144,3398926335,JP +3398926336,3398934527,CN +3398934528,3398938623,VN +3398938624,3398942719,TH +3398942720,3398959103,MY +3398959104,3398975487,ID +3398975488,3398983679,BN +3398983680,3398991871,JP +3398991872,3399004159,ID +3399004160,3399008255,CN +3399008256,3399012351,ID +3399012352,3399016447,JP +3399016448,3399024639,ID +3399024640,3399025663,CN +3399025664,3399026175,TW +3399026176,3399026431,SG +3399026432,3399026687,CN +3399026688,3399028735,HK +3399028736,3399032831,ID +3399032832,3399036927,IN +3399036928,3399041023,CN +3399041024,3399045119,AU +3399045120,3399047167,MV +3399047168,3399057407,HK +3399057408,3399065599,ID +3399065600,3399077887,TW +3399077888,3399081983,AU +3399081984,3399106559,ID +3399106560,3399122943,AU +3399122944,3399131135,NZ +3399131136,3399135231,IN +3399135232,3399139327,ID +3399139328,3399147519,TW +3399147520,3399155711,PK +3399155712,3399196671,ID +3399196672,3399204863,AU +3399204864,3399221247,HK +3399221248,3399286783,SG +3399286784,3399303167,JP +3399303168,3399311359,IN +3399311360,3399319551,JP +3399319552,3399332351,SG +3399332352,3399332863,AU +3399332864,3399335935,SG +3399335936,3399344127,CN +3399344128,3399352319,JP +3399352320,3399389183,ID +3399389184,3399393279,KR +3399393280,3399401471,CN +3399401472,3399409663,AU +3399409664,3399413759,JP +3399413760,3399414015,SG +3399414016,3399414271,AU +3399414272,3399414527,CN +3399414528,3399414783,AU +3399414784,3399415807,VN +3399416832,3399417087,ID +3399417088,3399417855,AU +3399417856,3399450623,ID +3399450624,3399467007,AU +3399467008,3399483391,IN +3399483392,3399495679,BN +3399495680,3399499775,NZ +3399499776,3399507967,TW +3399507968,3399512063,AU +3399512064,3399514111,NZ +3399514112,3399515135,SG +3399515136,3399515647,VN +3399515648,3399516159,AU +3399516160,3399517183,SG +3399517184,3399518207,IN +3399518208,3399519231,ID +3399519232,3399520255,CN +3399520256,3399521279,IN +3399521280,3399522303,NZ +3399522304,3399523327,HK +3399523328,3399524351,CN +3399524352,3399528447,IN +3399528448,3399532543,CN +3399532544,3399548927,SG +3399548928,3399557119,AU +3399557120,3399565311,SG +3399565312,3399581695,AU +3399581696,3399584255,US +3399584256,3399584511,BD +3399584512,3399587839,US +3399587840,3399588095,BD +3399588096,3399589631,US +3399589632,3399589887,NP +3399589888,3399593983,HK +3399593984,3399598079,BD +3399598080,3399614463,JP +3399614464,3399622655,MY +3399622656,3399626751,ID +3399626752,3399630847,IN +3399630848,3399631615,AU +3399631616,3399631871,CN +3399631872,3399632895,SG +3399632896,3399633407,NZ +3399633408,3399633663,AU +3399633664,3399633919,CN +3399633920,3399634943,TH +3399634944,3399639039,JP +3399639040,3399643135,AU +3399643136,3399655423,JP +3399655424,3399659519,PH +3399659520,3399661567,NZ +3399661568,3399662591,HK +3399662592,3399663615,IN +3399663616,3399671807,ID +3399671808,3399679999,IN +3399680000,3399680303,HK +3399680304,3399680319,DE +3399680320,3399688191,HK +3399688192,3399696383,SG +3399696384,3399712767,PK +3399712768,3399720959,KR +3399720960,3399729151,JP +3399729152,3399745535,PH +3399745536,3399749631,CN +3399749632,3399751679,AU +3399751680,3399752191,IN +3399752192,3399752447,AU +3399752448,3399752703,HK +3399752704,3399753727,NZ +3399753728,3399761919,IN +3399761920,3399770111,JP +3399770112,3399778303,CN +3399778304,3399786495,IN +3399786496,3399794687,PH +3399794688,3399798783,AU +3399798784,3399800831,BD +3399800832,3399802879,ID +3399802880,3399811071,JP +3399811072,3399819263,MY +3399819264,3399823359,ID +3399823360,3399825407,JP +3399825408,3399826431,KR +3399826432,3399826943,PH +3399826944,3399827455,IN +3399827456,3399835647,AU +3399835648,3399839743,US +3399839744,3399841791,JP +3399841792,3399842815,HK +3399842816,3399843839,AU +3399843840,3399852031,TW +3399852032,3399856127,JP +3399856128,3399860223,CN +3399860224,3399864319,PG +3399864320,3399868415,CN +3399868416,3399872255,PK +3399872256,3399873023,CN +3399873024,3399873279,PK +3399873280,3399873535,CN +3399873536,3399873791,PK +3399873792,3399874047,CN +3399874048,3399875327,PK +3399875328,3399876607,CN +3399876608,3399917567,SG +3399917568,3399921663,PK +3399921664,3399923711,NC +3399923712,3399923967,IN +3399923968,3399924223,JP +3399924224,3399924479,US +3399924480,3399924735,AU +3399924736,3399925759,PH +3399925760,3399933951,NP +3399933952,3399942143,CN +3399942144,3399954943,AU +3399954944,3399974911,US +3399974912,3399979007,HK +3399979008,3399983744,US +3399983745,3399983745,SG +3399983746,3399991295,US +3399991296,3399995391,IN +3399995392,3399999487,KR +3399999488,3400000255,JP +3400000256,3400000511,AU +3400000512,3400002303,JP +3400002304,3400002367,HK +3400002368,3400006143,JP +3400006144,3400006399,HK +3400006400,3400007679,JP +3400007680,3400024063,AU +3400024064,3400028159,MY +3400028160,3400029183,CN +3400029184,3400031231,IN +3400031232,3400031743,SG +3400031744,3400031999,IN +3400032000,3400032255,HK +3400032256,3400040447,AU +3400040448,3400044543,CN +3400044544,3400045567,IN +3400045568,3400047615,HK +3400047616,3400048639,IN +3400048640,3400056831,CN +3400056832,3400060927,TW +3400060928,3400062975,HK +3400062976,3400065023,JP +3400065024,3400073215,BD +3400073216,3400077311,HK +3400077312,3400079359,AU +3400079360,3400081407,MY +3400081408,3400089599,ID +3400089600,3400097791,JP +3400097792,3400105983,AU +3400105984,3400114175,JP +3400114176,3400118271,TW +3400118272,3400120319,AU +3400120320,3400122367,JP +3400122368,3400130559,NZ +3400130560,3400138751,ID +3400138752,3400146943,HK +3400146944,3400151039,FJ +3400151040,3400155135,MY +3400155136,3400163327,MN +3400163328,3400167423,JP +3400167424,3400171519,TH +3400171520,3400179711,CN +3400179712,3400183807,NZ +3400183808,3400187903,JP +3400187904,3400188927,CA +3400188928,3400189951,AU +3400189952,3400191999,IN +3400192000,3400194047,JP +3400194048,3400204287,CN +3400204288,3400212479,ID +3400212480,3400220671,MY +3400220672,3400224767,NC +3400224768,3400228863,JP +3400228864,3400232959,AU +3400232960,3400245247,JP +3400245248,3400253439,AU +3400253440,3400257535,MY +3400257536,3400259583,HK +3400259584,3400261631,CN +3400261632,3400263679,JP +3400263680,3400263935,CN +3400263936,3400264191,ID +3400264192,3400264447,IN +3400264448,3400264703,CN +3400264704,3400265215,ID +3400265216,3400265471,AU +3400265472,3400265727,IN +3400265728,3400267775,PG +3400267776,3400268799,KR +3400268800,3400269823,MO +3400269824,3400270847,CN +3400270848,3400271359,VN +3400271360,3400271615,AU +3400271616,3400271871,CN +3400271872,3400273919,AU +3400273920,3400275967,TH +3400275968,3400278015,JP +3400278016,3400286207,SG +3400286208,3400294399,JP +3400294400,3400310783,AU +3400310784,3400335359,SG +3400335360,3400336383,CN +3400336384,3400336639,PH +3400336640,3400336895,JP +3400336896,3400337151,CN +3400337152,3400337407,PH +3400337408,3400339455,CN +3400339456,3400341503,ID +3400341504,3400343551,AU +3400343552,3400351743,TW +3400351744,3400359935,ID +3400359936,3400364031,JP +3400364032,3400365055,CN +3400365056,3400366079,US +3400367104,3400368127,IN +3400368128,3400388607,AU +3400388608,3400392703,TH +3400392704,3400400895,CN +3400400896,3400401919,MO +3400401920,3400402175,TW +3400402176,3400402431,IN +3400402432,3400402943,NZ +3400402944,3400404991,HK +3400404992,3400409087,TW +3400409088,3400413183,AU +3400413184,3400417279,JP +3400417280,3400421375,CN +3400421376,3400423423,AU +3400423424,3400424447,KR +3400424448,3400425471,IN +3400425472,3400429567,AU +3400429568,3400431615,NZ +3400431616,3400431871,IN +3400431872,3400432127,HK +3400432128,3400432639,IN +3400432640,3400433663,CN +3400433664,3400435711,HK +3400435712,3400436223,BD +3400436224,3400441855,HK +3400441856,3400450047,NZ +3400450048,3400458239,JP +3400458240,3400466431,AU +3400466432,3400491007,MO +3400491008,3400495103,CN +3400495104,3400499199,MO +3400499200,3400503295,NZ +3400503296,3400507391,JP +3400507392,3400515583,MO +3400515584,3400531967,PH +3400531968,3400532991,IN +3400532992,3400534015,MY +3400534016,3400535039,JP +3400535040,3400535551,MY +3400535552,3400536063,AU +3400536064,3400548351,JP +3400548352,3400581119,TH +3400581120,3400589311,SG +3400589312,3400597503,CN +3400597504,3400605695,HK +3400605696,3400607743,JP +3400607744,3400608767,AU +3400608768,3400609791,IN +3400609792,3400630271,JP +3400630272,3400646655,IN +3400646656,3400646911,HK +3400646912,3400647679,JP +3400647680,3400648677,AU +3400648678,3400648678,HK +3400648679,3400648703,AU +3400648704,3400648815,JP +3400648816,3400648831,HK +3400648832,3400649943,JP +3400649944,3400649951,HK +3400649952,3400650143,JP +3400650144,3400650159,HK +3400650160,3400650409,JP +3400650410,3400650410,AU +3400650411,3400650751,JP +3400650752,3400654847,AU +3400654848,3400663039,IN +3400663040,3400683519,MY +3400683520,3400691711,JP +3400691712,3400695807,KH +3400695808,3400728575,TW +3400728576,3400736767,MN +3400736768,3400744959,JP +3400744960,3400753151,IN +3400753152,3400761343,MY +3400761344,3400763391,AU +3400763392,3400764415,ID +3400764416,3400765439,NZ +3400765440,3400766463,AU +3400766464,3400767487,KR +3400767488,3400768511,HK +3400768512,3400769535,IN +3400769536,3400773631,CN +3400773632,3400775679,KR +3400775680,3400777727,ID +3400777728,3400790015,JP +3400790016,3400794111,CN +3400794112,3400802303,ID +3400802304,3400806399,JP +3400806400,3400808447,ID +3400808448,3400810495,JP +3400810496,3400826879,NZ +3400826880,3400835071,CN +3400835072,3400839167,HK +3400839168,3400847359,JP +3400847360,3400849407,CN +3400849408,3400851455,MN +3400851456,3400859647,AU +3400859648,3400860671,HK +3400860928,3400861183,IN +3400861696,3400862719,CN +3400862720,3400864767,BD +3400864768,3400865791,AU +3400865792,3400866815,HK +3400866816,3400867839,CN +3400867840,3400884223,AU +3400884224,3400888319,JP +3400888320,3400892415,CN +3400892416,3400925183,HK +3400925184,3400933375,TH +3400933376,3400937471,CN +3400937472,3400941567,ID +3400941568,3400966143,AU +3400966144,3400974335,ID +3400974336,3400982527,CN +3400982528,3400990719,HK +3400990720,3400998911,ID +3400998912,3401003007,PH +3401003008,3401007103,JP +3401007104,3401008143,CA +3401008144,3401008159,MY +3401008160,3401010175,CA +3401010176,3401010183,MY +3401010184,3401010191,CA +3401010192,3401010207,MY +3401010208,3401011199,CA +3401011200,3401015295,JP +3401015296,3401023487,AU +3401023488,3401056255,TH +3401056256,3401383935,MY +3401383936,3401400319,CN +3401400320,3401404415,AU +3401404416,3401408511,CN +3401408512,3401416703,HK +3401416704,3401416959,KR +3401416960,3401420799,SG +3401420800,3401424895,JP +3401424896,3401428991,NZ +3401428992,3401431039,JP +3401431040,3401433087,CN +3401433088,3401441279,JP +3401441280,3401449471,IN +3401449472,3401515007,MY +3401515008,3401515263,CN +3401515264,3401515519,AU +3401515520,3401516031,ID +3401516032,3401519103,AU +3401519104,3401523199,JP +3401523200,3401527295,NZ +3401527296,3401529343,AU +3401529344,3401530367,VN +3401530368,3401531391,AU +3401531392,3401532415,IN +3401532416,3401539583,CN +3401539584,3401543679,AU +3401543680,3401545727,JP +3401545728,3401547775,BD +3401547776,3401580543,IN +3401580544,3402629119,CN +3402629120,3405774847,JP +3405774848,3405775871,AU +3405775872,3405776895,CN +3405776896,3405777407,AU +3405777408,3405777919,CN +3405777920,3405779455,AU +3405779456,3405779711,CN +3405779712,3405780991,AU +3405780992,3405781247,CN +3405781248,3405785599,AU +3405785600,3405786111,CN +3405786112,3405786367,AU +3405786368,3405787135,CN +3405787136,3405793279,AU +3405793280,3405793535,US +3405793536,3405795583,AU +3405795584,3405796351,CN +3405796352,3405797887,AU +3405797888,3405798399,CN +3405798400,3405799423,AU +3405799424,3405799935,CN +3405799936,3405801471,AU +3405801472,3405803519,CN +3405803520,3405803775,AU +3405804032,3405804543,CN +3405804544,3405806079,AU +3405806080,3405806335,CN +3405806336,3405807615,AU +3405807616,3405807871,CN +3405807872,3405808127,AU +3405808128,3405809663,CN +3405809664,3405809919,AU +3405809920,3405810175,CN +3405810176,3405811199,AU +3405811200,3405811455,CN +3405811456,3405811711,AU +3405811712,3405811967,CN +3405811968,3405812223,AU +3405812224,3405812479,CN +3405812480,3405812735,AU +3405812736,3405812991,CN +3405812992,3405813247,AU +3405813248,3405814015,CN +3405814016,3405820159,AU +3405820160,3405820415,CN +3405820416,3405832191,AU +3405832192,3405832447,CN +3405832448,3405839359,AU +3405839360,3405840383,HK +3405840384,3405841407,AU +3405841408,3405842431,CN +3405842432,3405844991,AU +3405844992,3405845247,CN +3405845248,3405846783,AU +3405846784,3405847039,ID +3405847040,3405847551,CN +3405847552,3405857023,AU +3405857024,3405857791,CN +3405857792,3405858303,AU +3405858304,3405858815,CN +3405858816,3405859839,AU +3405859840,3405860351,CN +3405860352,3405863423,AU +3405863424,3405863679,CN +3405863936,3405865215,AU +3405865216,3405867007,CN +3405867008,3405868031,AU +3405868032,3405868287,CN +3405868288,3405905151,AU +3405905152,3405905663,CN +3405905664,3405922303,AU +3405922304,3405924351,CN +3405924352,3405924607,AU +3405924608,3405924863,CN +3405924864,3405934591,AU +3405934592,3405936639,CN +3405936640,3405938175,AU +3405938176,3405938687,CN +3405938688,3405941759,AU +3405941760,3405942015,CN +3405942016,3405944319,AU +3405944320,3405944575,CN +3405944832,3405946367,CN +3405946368,3405946879,AU +3405946880,3405948927,CN +3405948928,3405951999,AU +3405952000,3405952511,CN +3405952512,3405956095,AU +3405956096,3405956607,CN +3405956608,3405959423,AU +3405959424,3405959679,CN +3405959680,3405960703,AU +3405960704,3405961215,CN +3405961216,3405963775,AU +3405963776,3405964287,CN +3405964288,3405964543,JP +3405964544,3405964799,CN +3405964800,3405966335,AU +3405966336,3405966847,CN +3405966848,3405988863,AU +3405988864,3405989119,CN +3405989120,3405989887,AU +3405989888,3405990399,CN +3405990400,3405990655,AU +3405990656,3405990911,CN +3405990912,3405991935,AU +3405991936,3405993983,CN +3405993984,3405996031,AU +3405996032,3405997055,CN +3405997056,3405998335,AU +3405998336,3405998591,CN +3405998592,3406000127,AU +3406000128,3406002431,CN +3406002432,3406002943,AU +3406002944,3406003199,CN +3406003200,3406005247,AU +3406005248,3406005503,PK +3406005504,3406006015,AU +3406006016,3406006271,CN +3406006272,3406007039,AU +3406007040,3406007295,CN +3406007296,3406008063,AU +3406008064,3406008319,CN +3406008320,3406070783,AU +3406070784,3406071551,CN +3406071552,3406071807,AU +3406071808,3406073855,US +3406073856,3406075647,AU +3406075648,3406076927,CN +3406076928,3406077951,AU +3406077952,3406078207,TH +3406078208,3406081535,AU +3406081536,3406082047,CN +3406082048,3406083071,AU +3406083072,3406083327,CN +3406083328,3406084607,AU +3406084608,3406084863,CN +3406084864,3406085119,BD +3406085120,3406089471,AU +3406089472,3406089727,CN +3406089728,3406090239,AU +3406090240,3406091263,CN +3406091264,3406095103,AU +3406095104,3406095359,CN +3406095360,3406095871,AU +3406095872,3406096383,CN +3406096384,3406103551,AU +3406103552,3406104063,CN +3406104064,3406104319,AU +3406104320,3406105087,CN +3406105088,3406105343,AU +3406105344,3406105599,CN +3406105600,3406107903,AU +3406107904,3406108415,CN +3406108416,3406109695,AU +3406109696,3406109951,NZ +3406109952,3406113791,AU +3406113792,3406114047,CN +3406114048,3406114303,AU +3406114304,3406114815,CN +3406114816,3406115839,AU +3406115840,3406117375,CN +3406117376,3406117887,AU +3406117888,3406118399,CN +3406118400,3406131711,AU +3406131712,3406132223,CN +3406132224,3406132735,AU +3406132736,3406132991,CN +3406132992,3406133247,AU +3406133248,3406133503,CN +3406133504,3406146559,AU +3406146560,3406146815,CN +3406146816,3406148607,AU +3406148608,3406149375,CN +3406149376,3406149887,AU +3406149888,3406150399,CN +3406150400,3406150655,AU +3406150656,3406151423,CN +3406151424,3406152447,AU +3406152448,3406152703,CN +3406152704,3406157311,AU +3406157312,3406157823,CN +3406157824,3406158335,AU +3406158336,3406158847,CN +3406158848,3406201599,AU +3406201600,3406201855,CN +3406201856,3406202879,AU +3406202880,3406203135,CN +3406203136,3406203391,AU +3406203392,3406203903,CN +3406203904,3406204415,AU +3406204416,3406204671,CN +3406204672,3406205951,AU +3406205952,3406206463,ID +3406206464,3406206975,CN +3406206976,3406208255,AU +3406208256,3406208511,CN +3406208512,3406208767,AU +3406208768,3406209023,CN +3406209024,3406225407,AU +3406225408,3406229503,CN +3406229504,3406231039,AU +3406231040,3406231295,NZ +3406231296,3406231551,AU +3406231552,3406232063,CN +3406232064,3406266623,AU +3406266624,3406266879,CN +3406266880,3406268927,AU +3406268928,3406269439,CN +3406269440,3406271231,AU +3406271232,3406271487,CN +3406271488,3406271999,AU +3406272000,3406272511,CN +3406272512,3406274047,AU +3406274048,3406274303,CN +3406274304,3406274559,AU +3406274560,3406276607,HK +3406276608,3406277375,AU +3406277376,3406277631,ID +3406277632,3406282751,AU +3406282752,3406283263,CN +3406283264,3406284799,AU +3406284800,3406285055,CN +3406285056,3406299135,AU +3406299136,3406299391,CN +3406299392,3406301183,AU +3406301184,3406301439,CN +3406301440,3406305023,AU +3406305024,3406305279,CN +3406305280,3406307327,HK +3406307328,3406317055,AU +3406317056,3406317311,CN +3406317312,3406320127,AU +3406320128,3406320383,CN +3406320384,3406321151,AU +3406321152,3406321663,CN +3406321664,3406322431,AU +3406322432,3406322687,CN +3406322688,3406327039,AU +3406327040,3406327295,IN +3406327296,3406327807,CN +3406327808,3406328575,AU +3406328576,3406328831,CN +3406328832,3406329343,IN +3406329344,3406331647,AU +3406331648,3406331903,VN +3406331904,3406341631,AU +3406341632,3406342143,CN +3406342144,3406342399,AU +3406342400,3406342655,CN +3406342656,3406343167,AU +3406343168,3406343423,VN +3406343424,3406343679,CN +3406343680,3406346239,AU +3406346240,3406346495,CN +3406346496,3406346751,AU +3406346752,3406347263,CN +3406347264,3406347775,AU +3406347776,3406348543,CN +3406348544,3406349567,AU +3406349568,3406350335,CN +3406350336,3406350591,AU +3406350592,3406350847,IN +3406350848,3406351103,AU +3406351104,3406351359,CN +3406351360,3406352639,AU +3406352640,3406354431,CN +3406354432,3406354687,AU +3406354688,3406354943,CN +3406354944,3406355455,AU +3406355456,3406355711,CN +3406355712,3406356223,AU +3406356480,3406372863,AU +3406372864,3406373119,CN +3406373120,3406373887,AU +3406373888,3406374399,CN +3406374400,3406379263,AU +3406379264,3406379519,CN +3406379520,3406380799,AU +3406380800,3406381055,CN +3406381056,3406381311,AU +3406381312,3406381567,CN +3406381568,3406382591,AU +3406382592,3406383359,CN +3406383360,3406383871,AU +3406383872,3406384639,CN +3406384640,3406384895,SG +3406384896,3406389247,AU +3406389248,3406390783,CN +3406390784,3406392319,AU +3406392320,3406392575,CN +3406392576,3406405119,AU +3406405120,3406405375,CN +3406405376,3406409727,AU +3406409728,3406411775,NZ +3406411776,3406413311,AU +3406413312,3406413823,JP +3406413824,3406434303,AU +3406434304,3406436351,MY +3406436352,3406438911,AU +3406438912,3406439167,CN +3406439168,3406444543,AU +3406444544,3406444799,CN +3406444800,3406445055,AU +3406445056,3406445311,MY +3406445312,3406449151,AU +3406449152,3406449663,CN +3406449664,3406451711,AU +3406451712,3406452991,CN +3406452992,3406454527,AU +3406454528,3406454783,CN +3406454784,3406462207,AU +3406462208,3406462463,CN +3406462464,3406512383,AU +3406512384,3406512639,PK +3406512640,3406513663,AU +3406513664,3406513919,CN +3406513920,3406514175,AU +3406514176,3406514431,IN +3406514432,3406514687,AU +3406514688,3406514943,TH +3406514944,3406515199,AU +3406515200,3406516223,CN +3406516224,3406516735,AU +3406516736,3406516991,CN +3406516992,3406517247,AU +3406517248,3406518271,CN +3406518272,3406521343,AU +3406521344,3406522367,CN +3406522368,3406523647,AU +3406523648,3406523903,CN +3406523904,3406525695,AU +3406525696,3406525951,CN +3406525952,3406526975,AU +3406526976,3406527231,CN +3406527232,3406527999,AU +3406528000,3406528255,CN +3406528256,3406528511,AU +3406528512,3406529535,HK +3406529536,3406529791,IL +3406529792,3406530559,HK +3406530560,3406531583,CN +3406531584,3406531839,AU +3406531840,3406532607,CN +3406532608,3406541823,AU +3406541824,3406542847,CN +3406542848,3406548991,AU +3406548992,3406550015,CN +3406550016,3406565375,AU +3406565376,3406565631,CN +3406565632,3406565887,AU +3406565888,3406566143,PH +3406566144,3406566399,CN +3406566400,3406566911,ID +3406566912,3406567423,AU +3406567424,3406567679,CN +3406567680,3406572031,AU +3406572032,3406572287,JP +3406572288,3406575871,AU +3406575872,3406576127,CN +3406576128,3406577919,AU +3406577920,3406578431,CN +3406578432,3406579199,AU +3406579200,3406579711,CN +3406579712,3406583295,AU +3406583552,3406583807,CN +3406583808,3406585855,HK +3406585856,3406586111,AU +3406586112,3406586367,JP +3406586368,3406586879,AU +3406586880,3406587391,CN +3406587392,3406587647,AU +3406587648,3406587903,CN +3406587904,3406590463,AU +3406590464,3406590719,CN +3406590720,3406591487,AU +3406591488,3406591743,CN +3406591744,3406594559,AU +3406594560,3406594815,CN +3406594816,3406596351,AU +3406596352,3406596607,CN +3406596608,3406611455,AU +3406611456,3406612479,CN +3406612480,3406614527,HK +3406614528,3406615295,AU +3406615296,3406615551,CN +3406615552,3406617343,AU +3406617344,3406617599,CN +3406617600,3406617855,MY +3406617856,3406618111,AU +3406618112,3406618623,IN +3406618624,3406619135,AU +3406619136,3406619391,CN +3406619392,3406622719,AU +3406622720,3406623743,CN +3406623744,3406625023,AU +3406625024,3406625279,NF +3406625280,3406625791,AU +3406626816,3406631423,AU +3406631424,3406631679,CN +3406631680,3406632959,AU +3406632960,3406633215,CN +3406633216,3406637055,AU +3406637056,3406637311,IN +3406637312,3406638079,AU +3406638080,3406638591,CN +3406638592,3406647295,AU +3406647296,3406649343,HK +3406649344,3406649855,CN +3406649856,3406650367,AU +3406650368,3406651391,CN +3406651392,3406669823,AU +3406669824,3406670847,IN +3406670848,3406671103,AU +3406671104,3406671359,CN +3406671360,3406684159,AU +3406684160,3406684671,CN +3406684672,3406684927,AU +3406684928,3406685183,CN +3406685184,3406686463,AU +3406686464,3406686719,CN +3406686720,3406696959,AU +3406696960,3406697215,IN +3406697216,3406698495,AU +3406698496,3406699519,CN +3406699520,3406700543,AU +3406700544,3406700799,IN +3406700800,3406701055,CN +3406701056,3406706687,AU +3406706688,3406706943,CN +3406706944,3406707967,AU +3406707968,3406708479,CN +3406708480,3406718975,AU +3406718976,3406719231,CN +3406719232,3406721535,AU +3406721536,3406722047,CN +3406722048,3406722559,AU +3406722560,3406722815,CN +3406722816,3406733823,AU +3406733824,3406734079,CN +3406734080,3406734847,AU +3406734848,3406735103,HK +3406735104,3406737407,AU +3406737408,3406737663,ID +3406737664,3406739199,AU +3406739200,3406739455,ID +3406739456,3406740991,HK +3406740992,3406741503,SG +3406741504,3406741759,CN +3406741760,3406742015,AU +3406742016,3406742527,CN +3406742528,3406746623,AU +3406746624,3406746879,JP +3406746880,3406747135,AU +3406747136,3406747391,CN +3406747392,3406751487,AU +3406751488,3406751743,CN +3406751744,3406755327,AU +3406755328,3406755583,CN +3406755584,3406757887,AU +3406757888,3406761983,CN +3406761984,3406763007,AU +3406763008,3406763775,CN +3406763776,3406775295,AU +3406775296,3406775551,JP +3406775552,3406780159,AU +3406780160,3406780927,CN +3406780928,3406784767,AU +3406784768,3406785023,CN +3406785024,3406786559,AU +3406786560,3406788607,CN +3406788608,3406791167,AU +3406791168,3406791679,CN +3406791680,3406796031,AU +3406796032,3406796287,CN +3406796288,3406796543,AU +3406796544,3406796799,CN +3406796800,3406797823,AU +3406797824,3406798847,CN +3406798848,3406802431,AU +3406802432,3406802687,CN +3406802688,3406815999,AU +3406816000,3406816255,CN +3406816256,3406817279,AU +3406817280,3406819839,CN +3406819840,3406820863,AU +3406820864,3406821119,CN +3406821120,3406825983,AU +3406825984,3406826239,CN +3406826496,3406827007,CN +3406827008,3406827519,AU +3406827520,3406829567,CN +3406829568,3406830335,AU +3406830336,3406830591,CN +3406830592,3406832127,AU +3406832128,3406832383,PK +3406832384,3406833151,AU +3406833152,3406833407,CN +3406833408,3406835967,AU +3406835968,3406836735,CN +3406836736,3406838271,AU +3406838272,3406838527,CN +3406838528,3406839551,AU +3406839552,3406839807,CN +3406839808,3406857471,AU +3406857472,3406857727,CN +3406857728,3406864639,AU +3406864640,3406865151,CN +3406865152,3406865663,AU +3406865664,3406865919,IN +3406865920,3406869503,AU +3406869504,3406870527,JP +3406870528,3406871039,AU +3406871040,3406871551,CN +3406871552,3406881791,AU +3406881792,3406882047,CN +3406882048,3406884351,AU +3406884352,3406884607,CN +3406884608,3406884863,HK +3406884864,3406885119,CN +3406885120,3406886143,AU +3406886144,3406886399,CN +3406886400,3406889471,AU +3406889472,3406889727,CN +3406889728,3406893567,AU +3406893568,3406893823,CN +3406893824,3406894335,AU +3406894336,3406894591,ID +3406894592,3406896127,AU +3406896128,3406896383,CN +3406896384,3406896895,AU +3406896896,3406897151,IN +3406897152,3406898943,AU +3406898944,3406899199,CN +3406899200,3406903295,AU +3406903296,3406903551,CN +3406903552,3406905599,AU +3406905600,3406905855,BD +3406905856,3406907903,AU +3406907904,3406908415,CN +3406908416,3406911487,AU +3406911488,3406911999,CN +3406912000,3406923775,AU +3406923776,3406924031,CN +3406924288,3406930431,AU +3406930432,3406930687,JP +3406930688,3406930943,AU +3406930944,3406931199,CN +3406931200,3406936831,AU +3406936832,3406937087,CN +3406937088,3406937343,AU +3406937600,3406938111,CN +3406938112,3406938623,AU +3406938624,3406938879,IN +3406938880,3406946815,AU +3406946816,3406947071,KR +3406947072,3406948095,AU +3406948096,3406948351,CN +3406948352,3406948607,AU +3406948608,3406948863,CN +3406948864,3406950399,AU +3406950400,3406951423,NF +3406951424,3406952447,AU +3406952448,3406952959,CN +3406952960,3406954239,AU +3406954240,3406954495,CN +3406954496,3406955007,AU +3406955008,3406955775,CN +3406955776,3406956287,AU +3406956288,3406956543,CN +3406956544,3406961151,AU +3406961152,3406961407,IN +3406961408,3406962431,AU +3406962432,3406962687,CN +3406962688,3406963967,AU +3406963968,3406964223,CN +3406964224,3406966783,AU +3406966784,3406967295,CN +3406967296,3406967551,HK +3406967552,3406967807,IN +3406967808,3406968063,CN +3406968064,3406972927,AU +3406972928,3406973951,CN +3406973952,3406974975,AU +3406974976,3406975487,CN +3406975488,3406976767,AU +3406976768,3406977023,CN +3406977024,3406980095,AU +3406980096,3406980607,CN +3406980608,3406981119,AU +3406981376,3406981631,CN +3406981632,3406981887,AU +3406981888,3406982143,CN +3406982144,3406982655,AU +3406982656,3406982911,CN +3406983168,3406987519,AU +3406987520,3406987775,CN +3406987776,3406988031,AU +3406988032,3406988799,CN +3406988800,3406989567,AU +3406989568,3406989823,IN +3406989824,3406991359,AU +3406991360,3406991615,CN +3406991616,3406993663,AU +3406993664,3406993919,CN +3406993920,3406994431,AU +3406995456,3407005439,AU +3407005440,3407005695,CN +3407005696,3407007743,AU +3407007744,3407007999,CN +3407008000,3407008511,AU +3407008512,3407008767,CN +3407008768,3407009535,AU +3407009536,3407009791,CN +3407009792,3407020287,AU +3407020288,3407020543,CN +3407020544,3407020799,AU +3407020800,3407021055,IN +3407021056,3407021311,ID +3407021312,3407024639,AU +3407024640,3407024895,CN +3407024896,3407026175,AU +3407026176,3407026431,CN +3407026432,3407027711,AU +3407027712,3407027967,CN +3407027968,3407028223,AU +3407028224,3407030271,HK +3407030272,3407030527,AU +3407030528,3407030783,CN +3407030784,3407031295,AU +3407031296,3407032063,CN +3407032064,3407034879,AU +3407034880,3407035135,CN +3407035136,3407035391,AU +3407035392,3407035903,CN +3407035904,3407036415,AU +3407036416,3407036671,CN +3407036672,3407037439,AU +3407037440,3407037695,CN +3407037696,3407038463,AU +3407038464,3407038719,CN +3407038720,3407045887,AU +3407045888,3407046143,CN +3407046144,3407048447,AU +3407048448,3407048703,CN +3407048704,3407053567,AU +3407053568,3407053823,CN +3407053824,3407054079,AU +3407054080,3407054335,CN +3407054336,3407056895,AU +3407056896,3407057151,CN +3407057152,3407057663,AU +3407057664,3407057919,CN +3407057920,3407058175,AU +3407058176,3407058431,CN +3407058432,3407059967,AU +3407059968,3407060223,CN +3407060224,3407065087,AU +3407065088,3407065343,CN +3407065344,3407065599,AU +3407065600,3407066111,CN +3407066112,3407073279,AU +3407073280,3407073535,CN +3407073536,3407078399,AU +3407078400,3407079423,CN +3407079424,3407079679,AU +3407079680,3407079935,CN +3407079936,3407081471,AU +3407081728,3407081983,AU +3407081984,3407082239,CN +3407082240,3407083519,AU +3407083520,3407084031,CN +3407084032,3407085311,AU +3407085312,3407085567,CN +3407085568,3407089919,AU +3407089920,3407090175,CN +3407090176,3407095807,AU +3407095808,3407096319,CN +3407096576,3407096831,AU +3407096832,3407097087,CN +3407097088,3407097855,AU +3407097856,3407098111,CN +3407098112,3407101183,AU +3407101184,3407101439,CN +3407101440,3407101695,AU +3407101696,3407101951,MY +3407101952,3407102207,AU +3407102208,3407102463,CN +3407102464,3407107071,AU +3407107072,3407107583,CN +3407107584,3407108351,AU +3407108352,3407108607,CN +3407108608,3407112447,AU +3407112448,3407112703,SG +3407112704,3407113215,CN +3407113216,3407115007,AU +3407115008,3407115263,CN +3407115264,3407115519,AU +3407115520,3407116287,CN +3407116288,3407116799,AU +3407116800,3407117055,CN +3407117056,3407117823,AU +3407117824,3407118335,CN +3407118336,3407120127,AU +3407120128,3407120383,CN +3407120384,3407122431,HK +3407122432,3407123967,AU +3407123968,3407124223,CN +3407124224,3407124479,AU +3407124480,3407126527,HK +3407126528,3407144447,AU +3407144448,3407144703,CN +3407144704,3407144959,AU +3407144960,3407145215,CN +3407145216,3407145983,AU +3407145984,3407146239,CN +3407146240,3407147263,AU +3407147264,3407147519,NZ +3407147520,3407151103,AU +3407151104,3407151871,CN +3407151872,3407152895,AU +3407152896,3407153151,IN +3407153152,3407153407,CN +3407153408,3407153663,AU +3407153664,3407153919,CN +3407153920,3407155711,AU +3407155712,3407155967,CN +3407155968,3407159551,AU +3407159552,3407160063,CN +3407160064,3407161599,AU +3407161600,3407161855,CN +3407161856,3407162367,TH +3407162368,3407162623,CN +3407162624,3407168511,AU +3407168512,3407168767,CN +3407168768,3407170047,AU +3407170048,3407170559,ID +3407170560,3407172095,AU +3407172096,3407172351,CN +3407172352,3407175679,AU +3407175680,3407176703,CN +3407176704,3407182847,AU +3407182848,3407183103,CN +3407183104,3407185919,AU +3407185920,3407186431,CN +3407186432,3407188223,AU +3407188224,3407188479,CN +3407188480,3407203839,AU +3407203840,3407204095,CN +3407204096,3407222783,AU +3407222784,3407223039,CN +3407223040,3407223807,AU +3407223808,3407224319,CN +3407224320,3407224575,AU +3407224576,3407224831,CN +3407224832,3407234047,AU +3407234048,3407234303,CN +3407234304,3407236095,AU +3407236096,3407236351,CN +3407236352,3407236607,AU +3407236608,3407236863,CN +3407236864,3407238143,AU +3407238144,3407238399,CN +3407238400,3407238911,AU +3407238912,3407239167,CN +3407239168,3407240191,AU +3407240192,3407241215,CN +3407241216,3407241983,AU +3407241984,3407242239,CN +3407242240,3407243775,AU +3407243776,3407244031,CN +3407244032,3407244287,AU +3407244800,3407247871,AU +3407247872,3407248383,CN +3407248384,3407250175,AU +3407250176,3407250431,CN +3407250432,3407258367,AU +3407258368,3407258623,CN +3407258624,3407259135,AU +3407259136,3407259391,CN +3407259648,3407260159,AU +3407260160,3407260415,CN +3407260416,3407261695,AU +3407261696,3407263743,HK +3407263744,3407264255,AU +3407264256,3407264511,HK +3407264512,3407266303,AU +3407266304,3407266559,CN +3407266560,3407268863,AU +3407268864,3407269119,US +3407269120,3407278591,AU +3407278592,3407279103,CN +3407279104,3407279359,AU +3407279360,3407279871,CN +3407279872,3407281151,AU +3407281152,3407281663,CN +3407281664,3407282175,AU +3407282176,3407282431,CN +3407282688,3407294207,AU +3407294208,3407294463,CN +3407294464,3407300863,AU +3407300864,3407301119,CN +3407301120,3407303935,AU +3407303936,3407304191,CN +3407304192,3407305727,AU +3407305728,3407306751,CN +3407306752,3407307263,AU +3407307264,3407307519,CN +3407307520,3407309567,AU +3407309568,3407309823,CN +3407309824,3407310847,AU +3407310848,3407311103,CN +3407311104,3407314687,AU +3407314688,3407314943,HK +3407314944,3407315455,AU +3407315456,3407315711,CN +3407315712,3407318015,AU +3407318016,3407318527,CN +3407318528,3407326207,AU +3407326208,3407326463,CN +3407326464,3407328767,AU +3407328768,3407329023,CN +3407329024,3407329791,AU +3407329792,3407330303,CN +3407330304,3407331327,AU +3407331328,3407331583,CN +3407331584,3407332607,AU +3407332608,3407333119,CN +3407333120,3407334399,AU +3407334400,3407335423,CN +3407335424,3407339519,AU +3407339520,3407339775,CN +3407339776,3407340031,AU +3407340032,3407341567,CN +3407341568,3407345919,AU +3407345920,3407346175,CN +3407346176,3407346431,AU +3407346432,3407346687,CN +3407346688,3407351039,AU +3407351040,3407351295,CN +3407351296,3407352319,AU +3407352320,3407352575,CN +3407352576,3407354623,AU +3407354624,3407354879,CN +3407354880,3407358719,AU +3407358720,3407358975,CN +3407358976,3407360511,AU +3407360512,3407361023,ID +3407361024,3407362047,AU +3407362048,3407362303,CN +3407362304,3407362559,AU +3407362560,3407362815,CN +3407362816,3407364863,AU +3407364864,3407365119,CN +3407365120,3407366655,AU +3407366656,3407366911,CN +3407366912,3407367167,AU +3407367168,3407367679,ID +3407367680,3407367935,AU +3407367936,3407368703,CN +3407368704,3407369215,AU +3407369216,3407369983,CN +3407369984,3407370239,IN +3407370240,3407370751,AU +3407370752,3407371007,CN +3407371008,3407376127,AU +3407376128,3407376639,CN +3407376640,3407377407,AU +3407377408,3407377663,CN +3407377664,3407378943,AU +3407378944,3407379455,CN +3407379456,3407382015,AU +3407382016,3407382527,JP +3407382528,3407384831,AU +3407384832,3407385087,CN +3407385088,3407386623,AU +3407386624,3407387135,CN +3407387136,3407387903,AU +3407387904,3407388159,CN +3407388160,3407388927,AU +3407388928,3407389183,CN +3407389184,3407390463,AU +3407390464,3407390719,CN +3407390720,3407395327,AU +3407395328,3407395839,CN +3407395840,3407398655,AU +3407398656,3407398911,CN +3407398912,3407399423,AU +3407399424,3407399679,CN +3407399680,3407401983,AU +3407401984,3407402495,CN +3407402496,3407403263,AU +3407403264,3407403519,CN +3407403520,3407403775,AU +3407403776,3407404031,CN +3407404032,3407410175,AU +3407410176,3407410431,CN +3407410432,3407418111,AU +3407418112,3407418879,CN +3407418880,3407425023,AU +3407425024,3407425279,CN +3407425280,3407425535,AU +3407425536,3407427583,HK +3407427584,3407429631,AU +3407429632,3407430143,CN +3407430144,3407436543,AU +3407436544,3407436799,CN +3407436800,3407438591,AU +3407438592,3407439103,CN +3407439104,3407440383,AU +3407440384,3407440639,CN +3407440640,3407440895,AU +3407440896,3407441151,IN +3407441152,3407446783,AU +3407446784,3407447039,CN +3407447040,3407447807,AU +3407447808,3407448063,CN +3407448320,3407448575,AU +3407448576,3407448831,CN +3407448832,3407450879,AU +3407450880,3407451135,CN +3407451136,3407452415,AU +3407452416,3407453183,CN +3407453184,3407455231,AU +3407455232,3407455487,CN +3407455488,3407455743,AU +3407455744,3407455999,CN +3407456000,3407457791,AU +3407457792,3407458303,CN +3407458304,3407459327,AU +3407459328,3407459583,CN +3407459584,3407459839,AU +3407459840,3407460095,CN +3407460096,3407462143,AU +3407462144,3407462399,CN +3407462400,3407464191,AU +3407464192,3407464703,CN +3407464704,3407464959,AU +3407464960,3407465471,CN +3407465472,3407466495,AU +3407466496,3407470591,CN +3407470592,3407471871,AU +3407471872,3407472127,CN +3407472128,3407473407,AU +3407473408,3407473919,CN +3407473920,3407475199,AU +3407475200,3407475455,CN +3407475456,3407480831,AU +3407480832,3407480912,JP +3407480913,3407480913,AU +3407480914,3407481223,JP +3407481224,3407481231,AU +3407481232,3407481343,JP +3407481344,3407481855,AU +3407481856,3407482111,CN +3407482112,3407487487,AU +3407487488,3407487743,CN +3407487744,3407489023,AU +3407489024,3407489279,HK +3407489280,3407491327,AU +3407491328,3407491839,CN +3407491840,3407492863,AU +3407492864,3407493631,CN +3407493632,3407494143,AU +3407494144,3407494399,CN +3407494400,3407495423,AU +3407495424,3407495679,CN +3407495680,3407496191,AU +3407496192,3407496447,CN +3407496448,3407498239,AU +3407498240,3407498495,CN +3407498496,3407498751,PK +3407498752,3407499263,AU +3407499264,3407499519,CN +3407499520,3407500287,AU +3407500288,3407500543,CN +3407500544,3407503615,AU +3407503616,3407503871,CN +3407503872,3407504895,AU +3407504896,3407505407,CN +3407505408,3407508223,AU +3407508224,3407508735,CN +3407508736,3407511807,AU +3407511808,3407512063,CN +3407512064,3407515391,AU +3407515392,3407515903,CN +3407515904,3407516671,AU +3407516672,3407517183,CN +3407517184,3407518207,AU +3407518208,3407518463,CN +3407518464,3407519231,AU +3407519232,3407519743,CN +3407519744,3407522303,AU +3407522304,3407522559,CN +3407522560,3407523071,AU +3407523072,3407523327,CN +3407523328,3407523583,AU +3407523584,3407523839,JP +3407523840,3407524095,CN +3407524096,3407524607,AU +3407524608,3407524863,NZ +3407524864,3407526143,AU +3407526144,3407526399,CN +3407526400,3407530495,AU +3407530496,3407531007,CN +3407531008,3407532543,AU +3407532544,3407532799,CN +3407532800,3407533567,AU +3407533568,3407533823,CN +3407533824,3407535615,AU +3407535616,3407535871,CN +3407535872,3407536127,AU +3407536128,3407536383,CN +3407536384,3407537151,AU +3407537152,3407537407,CN +3407537408,3407538175,AU +3407538176,3407538431,CN +3407538432,3407544319,AU +3407544320,3407544575,CN +3407544576,3407545855,AU +3407545856,3407546367,ID +3407546368,3407546879,AU +3407546880,3407547135,CN +3407547136,3407548159,AU +3407548160,3407548671,CN +3407548672,3407549439,AU +3407549440,3407549695,CN +3407549696,3407549951,AU +3407549952,3407550463,CN +3407550464,3407554559,AU +3407554560,3407554815,CN +3407554816,3407555839,AU +3407555840,3407556095,CN +3407556096,3407557887,AU +3407557888,3407558143,CN +3407558144,3407560959,AU +3407560960,3407561471,CN +3407561472,3407561727,NZ +3407561728,3407561983,AU +3407561984,3407562239,JP +3407562240,3407565055,AU +3407565056,3407565311,CN +3407565312,3407566847,AU +3407566848,3407567103,CN +3407567104,3407568895,AU +3407568896,3407569407,SG +3407569408,3407570431,AU +3407570432,3407570687,CN +3407570688,3407572223,AU +3407572224,3407572479,CN +3407572480,3407574271,AU +3407574272,3407574527,CN +3407574528,3407575295,AU +3407575296,3407576063,CN +3407576064,3407576319,AU +3407576320,3407576575,CN +3407576576,3407595519,AU +3407595520,3407595775,CN +3407595776,3407596031,AU +3407596032,3407596287,CN +3407596288,3407602943,AU +3407602944,3407603199,JP +3407603200,3407603967,AU +3407603968,3407604223,CN +3407604224,3407604479,AU +3407604480,3407604735,IN +3407604736,3407606015,AU +3407606016,3407606271,CN +3407606272,3407608319,AU +3407608320,3407608575,CN +3407608576,3407608715,AU +3407608716,3407608736,JP +3407608737,3407612415,AU +3407612416,3407612671,CN +3407612672,3407612927,AU +3407612928,3407613183,CN +3407613184,3407618303,AU +3407618304,3407619071,CN +3407619072,3407620863,AU +3407620864,3407621375,CN +3407621376,3407623679,AU +3407623680,3407623935,CN +3407623936,3407624191,AU +3407624192,3407624447,CN +3407624704,3407628543,AU +3407628544,3407629055,CN +3407629056,3407629311,AU +3407629312,3407629567,CN +3407629568,3407631871,AU +3407631872,3407632127,CN +3407632128,3407632383,AU +3407632384,3407632639,CN +3407632640,3407638527,AU +3407638528,3407638783,CN +3407638784,3407642623,AU +3407642624,3407643135,TH +3407643136,3407643391,AU +3407643392,3407643647,CN +3407643648,3407644671,AU +3407644672,3407644927,CN +3407644928,3407645695,AU +3407645696,3407645951,CN +3407645952,3407646463,AU +3407646464,3407646719,MY +3407646720,3407646975,AU +3407646976,3407647231,CN +3407647232,3407652095,AU +3407652096,3407652351,CN +3407652352,3407653119,AU +3407653120,3407653631,CN +3407653632,3407655423,AU +3407655424,3407655935,CN +3407655936,3407657215,AU +3407657216,3407657471,CN +3407657472,3407657727,AU +3407657728,3407657983,CN +3407657984,3407660031,AU +3407660032,3407660287,CN +3407660288,3407667711,AU +3407667712,3407668223,CN +3407668224,3407671039,AU +3407671040,3407671295,CN +3407671296,3407675903,AU +3407675904,3407676159,CN +3407676160,3407677439,AU +3407677440,3407677951,CN +3407677952,3407678719,AU +3407678720,3407679231,CN +3407679232,3407682047,AU +3407682048,3407682559,ID +3407682560,3407682815,CN +3407682816,3407687167,AU +3407687168,3407687423,CN +3407687424,3407689983,AU +3407689984,3407690239,CN +3407690240,3407691007,AU +3407691008,3407691263,CN +3407691264,3407691519,AU +3407691520,3407691775,CN +3407691776,3407693055,AU +3407693056,3407693311,CN +3407693312,3407694079,AU +3407694080,3407694335,CN +3407694336,3407696127,AU +3407696128,3407696383,CN +3407696384,3407698431,AU +3407698432,3407698687,CN +3407698688,3407699711,AU +3407699712,3407699967,CN +3407699968,3407700991,AU +3407700992,3407701247,CN +3407701248,3407701759,AU +3407701760,3407702015,CN +3407702016,3407704063,AU +3407704064,3407704319,CN +3407704320,3407706111,AU +3407706112,3407707135,CN +3407707136,3407721983,AU +3407721984,3407722495,CN +3407722496,3407723263,AU +3407723264,3407723519,CN +3407723520,3407723775,AU +3407723776,3407724287,CN +3407724288,3407727871,AU +3407727872,3407728127,CN +3407728128,3407729151,AU +3407729152,3407729407,CN +3407729408,3407730943,AU +3407730944,3407731199,CN +3407731200,3407732223,AU +3407732224,3407732479,HK +3407732480,3407733503,AU +3407733504,3407733759,CN +3407733760,3407734527,AU +3407734528,3407734783,CN +3407734784,3407735039,AU +3407735040,3407735551,CN +3407735552,3407738879,AU +3407738880,3407739135,CN +3407739136,3407740415,AU +3407740416,3407740927,CN +3407740928,3407745023,AU +3407745024,3407745535,CN +3407745536,3407747327,AU +3407747328,3407747583,CN +3407747584,3407747839,AU +3407747840,3407748095,CN +3407748096,3407748351,AU +3407748352,3407748607,CN +3407748608,3407750655,AU +3407750656,3407751167,SG +3407751168,3407753215,AU +3407753216,3407753727,HK +3407753728,3407757823,AU +3407757824,3407758079,CN +3407758080,3407761663,AU +3407761664,3407761919,CN +3407761920,3407763199,AU +3407763200,3407763455,CN +3407763456,3407769343,AU +3407769344,3407769599,CN +3407769600,3407771903,AU +3407771904,3407772159,CN +3407772160,3407772415,AU +3407772416,3407772671,CN +3407772672,3407779839,AU +3407779840,3407780095,CN +3407780096,3407780863,AU +3407780864,3407781119,CN +3407781120,3407782399,AU +3407782400,3407782655,CN +3407782656,3407785215,AU +3407785216,3407785471,CN +3407785472,3407785727,NZ +3407785728,3407785983,CN +3407785984,3407788799,AU +3407788800,3407789055,CN +3407789056,3407790591,AU +3407790592,3407790847,CN +3407790848,3407796479,AU +3407796480,3407796735,CN +3407796736,3407797247,AU +3407797248,3407797503,CN +3407797760,3407798015,CN +3407798016,3407800319,AU +3407800320,3407800831,CN +3407800832,3407801087,AU +3407801088,3407801343,CN +3407801344,3407801855,ID +3407801856,3407802367,AU +3407802368,3407802879,CN +3407802880,3407803903,AU +3407803904,3407804159,CN +3407804160,3407804927,AU +3407804928,3407805439,CN +3407805440,3407805951,AU +3407805952,3407806463,ID +3407806464,3407808511,AU +3407808512,3407809023,IN +3407809024,3407814655,AU +3407814656,3407815167,HK +3407815168,3407817983,AU +3407817984,3407818495,CN +3407818496,3407819007,AU +3407819008,3407819263,CN +3407819264,3407819519,AU +3407819520,3407819775,CN +3407819776,3407820287,AU +3407820288,3407820799,CN +3407820800,3407824127,AU +3407824128,3407824383,CN +3407824384,3407824895,AU +3407824896,3407825151,CN +3407825152,3407826943,AU +3407826944,3407827199,CN +3407827200,3407828223,AU +3407828224,3407828479,CN +3407828480,3407828991,AU +3407828992,3407829503,US +3407829504,3407831295,AU +3407831296,3407831551,CN +3407831552,3407833343,AU +3407833344,3407833855,CN +3407833856,3407834111,AU +3407834112,3407834623,CN +3407834624,3407838207,AU +3407838208,3407838463,CN +3407838464,3407847935,AU +3407847936,3407848191,CN +3407848192,3407848447,AU +3407848448,3407848959,ID +3407848960,3407851007,AU +3407851008,3407851263,CN +3407851264,3407851775,AU +3407851776,3407852031,CN +3407852032,3407852799,AU +3407852800,3407853055,CN +3407853056,3407854335,AU +3407854336,3407854591,CN +3407854592,3407854847,AU +3407854848,3407855103,CN +3407855104,3407858687,AU +3407858688,3407858943,CN +3407858944,3407862783,AU +3407862784,3407863039,CN +3407863040,3407863295,AU +3407863296,3407863807,CN +3407863808,3407864063,AU +3407864064,3407864319,CN +3407864320,3407865087,AU +3407865088,3407865343,CN +3407865344,3407866367,AU +3407866368,3407866623,SG +3407866624,3407869951,AU +3407869952,3407870463,CN +3407870464,3407871231,AU +3407871232,3407871487,CN +3407871488,3407873023,AU +3407873024,3407873535,IN +3407873536,3407877119,AU +3407877120,3407877375,CN +3407877376,3407884287,AU +3407884288,3407884799,CN +3407884800,3407886335,AU +3407886336,3407886591,CN +3407886592,3407887359,AU +3407887360,3407887615,CN +3407887616,3407887871,AU +3407887872,3407888127,CN +3407888128,3407889407,AU +3407889408,3407889919,CN +3407889920,3407891455,AU +3407891456,3407891711,CN +3407891712,3407892735,AU +3407892736,3407892991,CN +3407892992,3407893503,AU +3407893504,3407894015,CN +3407894528,3407896319,AU +3407896320,3407896575,CN +3407896576,3407898111,AU +3407898112,3407898367,CN +3407898368,3407898879,AU +3407898880,3407899135,CN +3407899136,3407905279,AU +3407905280,3407905535,CN +3407905536,3407906047,AU +3407906048,3407906303,CN +3407906304,3407907839,AU +3407907840,3407908095,CN +3407908096,3407910911,AU +3407910912,3407911167,CN +3407911168,3407919615,AU +3407919616,3407920127,CN +3407920128,3407921151,AU +3407921152,3407921407,CN +3407921408,3407922175,AU +3407922176,3407922431,CN +3407922432,3407923967,AU +3407923968,3407924735,CN +3407924736,3407926271,AU +3407926272,3407926527,CN +3407926528,3407928575,AU +3407928576,3407928831,IN +3407928832,3407938559,AU +3407938560,3407938815,CN +3407938816,3407939327,AU +3407939328,3407939583,CN +3407939584,3407940607,SG +3407940608,3407941631,HK +3407941632,3407942911,AU +3407942912,3407943167,CN +3407943168,3407944191,AU +3407944192,3407944447,CN +3407944448,3407945727,AU +3407945728,3407945983,CN +3407945984,3407953663,AU +3407953664,3407954175,CN +3407954176,3407954687,AU +3407954688,3407955199,CN +3407955200,3407956223,AU +3407956224,3407956479,CN +3407956480,3407957759,AU +3407957760,3407958015,CN +3407958016,3407963135,AU +3407963136,3407963391,CN +3407963392,3407968767,AU +3407968768,3407969023,CN +3407969024,3407970559,AU +3407970560,3407970815,CN +3407970816,3407971071,AU +3407971072,3407971327,CN +3407971328,3407974655,AU +3407974656,3407974911,CN +3407974912,3407976447,AU +3407976448,3407976959,US +3407976960,3407977471,AU +3407977472,3407977727,CN +3407977728,3407977983,AU +3407977984,3407978495,CN +3407978496,3407982079,AU +3407982080,3407982335,CN +3407982336,3407984895,AU +3407984896,3407985151,CN +3407985152,3407987711,AU +3407987712,3407987967,PH +3407987968,3407988223,AU +3407988224,3407988735,IN +3407988736,3407988991,CN +3407988992,3407989247,AU +3407989248,3407990015,CN +3407990016,3407990271,AU +3407990272,3407990783,CN +3407990784,3407992319,AU +3407992320,3407992831,CN +3407992832,3407994879,AU +3407994880,3407995647,CN +3407995648,3407997183,AU +3407997184,3407997439,CN +3407997440,3407998975,AU +3407998976,3407999231,TH +3407999232,3407999743,AU +3407999744,3407999999,CN +3408000000,3408001535,AU +3408001536,3408001791,CN +3408001792,3408004095,AU +3408004096,3408004351,CN +3408004352,3408008447,AU +3408008448,3408008703,CN +3408008704,3408009983,AU +3408009984,3408010239,CN +3408010240,3408012543,AU +3408012544,3408012799,MN +3408012800,3408013055,AU +3408013056,3408013311,CN +3408013312,3408015359,AU +3408015360,3408015871,CN +3408015872,3408016895,AU +3408016896,3408017151,CN +3408017152,3408017407,AU +3408017408,3408017919,CN +3408017920,3408020223,AU +3408020224,3408020479,CN +3408020480,3408020735,JP +3408020736,3408020991,CN +3408020992,3408022527,AU +3408022528,3408022783,CN +3408022784,3408023807,AU +3408023808,3408024063,JP +3408024320,3408026623,AU +3408026624,3408026879,CN +3408026880,3408030207,AU +3408030208,3408030463,CN +3408030464,3408031999,AU +3408032000,3408032255,CN +3408032256,3408032767,AU +3408032768,3408033023,LK +3408033024,3408033279,IN +3408033280,3408033791,ID +3408033792,3408039935,AU +3408039936,3408040191,VN +3408040192,3408040703,AU +3408040704,3408040959,CN +3408040960,3408041471,AU +3408041472,3408041727,CN +3408041728,3408041983,AU +3408041984,3408042495,CN +3408042496,3408042751,MY +3408042752,3408044287,AU +3408044288,3408044799,CN +3408044800,3408050943,AU +3408050944,3408051199,CN +3408051200,3408052223,AU +3408052224,3408054271,HK +3408054272,3408055295,AU +3408055296,3408056319,CN +3408056320,3408062463,AU +3408062464,3408062719,CN +3408062720,3408064511,AU +3408064512,3408064767,CN +3408065024,3408065279,CN +3408065280,3408065791,AU +3408065792,3408066047,CN +3408066048,3408066303,PH +3408066304,3408067327,AU +3408067328,3408067583,CN +3408067584,3408111807,AU +3408111808,3408111808,US +3408111809,3409379839,AU +3409379840,3409380607,CN +3409380608,3409381887,AU +3409381888,3409382143,CN +3409382144,3409382655,AU +3409382656,3409382911,CN +3409382912,3409384959,AU +3409384960,3409385215,CN +3409385216,3409387007,AU +3409387008,3409387263,CN +3409387264,3409396479,AU +3409396480,3409396735,PH +3409396736,3409403135,AU +3409403136,3409403391,CN +3409403392,3409405183,AU +3409405184,3409405439,CN +3409405440,3409407231,AU +3409407232,3409407743,CN +3409407744,3409409023,AU +3409409024,3409409535,CN +3409409536,3409409791,AU +3409409792,3409410047,CN +3409410048,3409412095,AU +3409412096,3409412607,CN +3409412608,3409416703,AU +3409416704,3409417215,CN +3409417216,3409418495,AU +3409418496,3409418751,PL +3409418752,3409420287,AU +3409420288,3409420543,IN +3409420544,3409423615,AU +3409423616,3409423871,IN +3409423872,3409428479,AU +3409428480,3409428735,CN +3409428736,3409429503,AU +3409429504,3409429759,CN +3409429760,3409435135,AU +3409435136,3409435647,CN +3409435648,3409435903,AU +3409435904,3409436159,CN +3409436160,3409436671,AU +3409436672,3409436927,CN +3409436928,3409445119,AU +3409445120,3409445375,CN +3409445376,3409445887,AU +3409445888,3409446143,CN +3409446144,3409447935,AU +3409447936,3409448191,CN +3409448192,3409451007,AU +3409451008,3409451263,CN +3409451264,3409453055,AU +3409453056,3409453567,NZ +3409453568,3409454591,AU +3409454592,3409454847,CN +3409454848,3409455103,AU +3409455104,3409455359,CN +3409455360,3409456639,AU +3409456640,3409456895,CN +3409456896,3409457152,AU +3409457153,3409459199,HK +3409459200,3409462271,AU +3409462272,3409462783,CN +3409462784,3409465855,AU +3409465856,3409466879,CN +3409466880,3409467135,AU +3409467136,3409467391,HK +3409467392,3409467903,AU +3409467904,3409468415,HK +3409468416,3409469183,AU +3409469184,3409469439,CN +3409469440,3409473023,AU +3409473024,3409473279,CN +3409473280,3409475839,AU +3409475840,3409476095,CN +3409476096,3409486079,AU +3409486080,3409486335,CN +3409486336,3409488127,AU +3409488128,3409488383,CN +3409488384,3409488895,AU +3409488896,3409489407,CN +3409489408,3409489663,AU +3409489664,3409489919,CN +3409489920,3409491711,AU +3409491712,3409491967,CN +3409491968,3409492223,AU +3409492224,3409492479,CN +3409492480,3409492735,AU +3409492736,3409492991,CN +3409492992,3409494015,AU +3409494016,3409494271,CN +3409494272,3409495551,AU +3409495552,3409495807,CN +3409495808,3409496319,AU +3409496320,3409496575,CN +3409496576,3409498111,AU +3409498112,3409498879,CN +3409498880,3409499647,AU +3409499648,3409499903,CN +3409499904,3409500159,AU +3409500160,3409500415,CN +3409500416,3409502975,AU +3409502976,3409503487,CN +3409503488,3409503999,AU +3409504000,3409504511,CN +3409504512,3409506303,AU +3409506304,3409506559,CN +3409506560,3409506815,PH +3409506816,3409509375,AU +3409509376,3409509631,CN +3409509632,3409509887,HK +3409509888,3409510143,CN +3409510144,3409511679,AU +3409511680,3409512191,CN +3409512192,3409513471,AU +3409513472,3409513983,CN +3409513984,3409516543,AU +3409516544,3409517055,ID +3409517056,3409517567,AU +3409517568,3409517823,CN +3409517824,3409520383,AU +3409520384,3409520639,CN +3409520640,3409522175,AU +3409522176,3409522431,CN +3409522432,3409525247,AU +3409525248,3409525503,CN +3409525504,3409526015,AU +3409526016,3409526271,CN +3409526272,3409527295,AU +3409527296,3409527551,CN +3409527552,3409528063,AU +3409528064,3409528831,CN +3409528832,3409529087,AU +3409529088,3409529343,CN +3409529344,3409533439,AU +3409533440,3409533695,CN +3409533696,3409536255,AU +3409536256,3409536511,CN +3409536512,3409538303,AU +3409538304,3409538559,CN +3409538560,3409541887,AU +3409541888,3409542143,CN +3409542144,3409547519,AU +3409547520,3409547775,NZ +3409547776,3409550591,AU +3409550592,3409550847,CN +3409550848,3409561599,AU +3409561600,3409561855,CN +3409561856,3409562111,AU +3409562112,3409562367,CN +3409562368,3409563135,AU +3409563136,3409563391,CN +3409563392,3409567231,AU +3409567232,3409567487,CN +3409567488,3409567743,AU +3409567744,3409571839,CN +3409571840,3409573375,AU +3409573376,3409573887,CN +3409573888,3409574143,AU +3409574144,3409574399,CN +3409574400,3409575167,AU +3409575168,3409575935,CN +3409575936,3409707007,AU +3409707008,3409772543,HK +3409772544,3409838335,AU +3409838336,3409838591,MY +3409838592,3409838847,CN +3409838848,3409871615,AU +3409871616,3409871871,CN +3409871872,3409873663,AU +3409873664,3409873919,CN +3409873920,3409875967,AU +3409875968,3409876735,JP +3409876736,3409876991,AU +3409876992,3409878015,TH +3409878016,3409879295,AU +3409879296,3409879551,CN +3409879552,3409882111,AU +3409882112,3409883135,IN +3409883136,3409887999,AU +3409888000,3409888255,SG +3409888256,3409888511,AU +3409888512,3409888767,CN +3409888768,3409891327,AU +3409891328,3409891839,GB +3409891840,3409892351,AU +3409892352,3409892863,US +3409892864,3409896447,AU +3409896448,3409897471,CN +3409897472,3409897983,AU +3409897984,3409898239,CN +3409898240,3409901055,AU +3409901056,3409901311,CN +3409901312,3409969151,AU +3409969152,3410755583,TW +3410755584,3410771967,AU +3410771968,3410780159,JP +3410780160,3410788351,BD +3410788352,3410792447,IN +3410792448,3410796543,BD +3410796544,3410797567,CN +3410797568,3410798591,JP +3410798592,3410799615,CN +3410799616,3410800639,SG +3410800640,3410804735,IN +3410804736,3410808831,PH +3410808832,3410811903,CN +3410811904,3410812927,BD +3410812928,3410813951,AU +3410813952,3410814975,IN +3410814976,3410817023,HK +3410817024,3410818047,CN +3410818048,3410818815,JP +3410818816,3410819071,CN +3410819072,3410820095,IN +3410820096,3410821119,LA +3410821120,3410853887,TW +3410853888,3410862079,HK +3410862080,3410866175,AU +3410866176,3410866431,KR +3410866432,3410866687,IN +3410866688,3410866943,VN +3410866944,3410867199,AU +3410867200,3410868223,CN +3410868224,3410870271,JP +3410870272,3410874367,IN +3410874368,3410886655,ID +3410886656,3410887679,TW +3410887680,3410887935,IN +3410887936,3410888703,HK +3410888704,3410890751,SG +3410890752,3410894847,AU +3410894848,3410898943,HK +3410898944,3410903039,CN +3410903040,3410911231,HK +3410911232,3410915327,TH +3410915328,3410919423,ID +3410919424,3410920447,IN +3410920448,3410921471,JP +3410921472,3410923519,HK +3410923520,3410924543,BD +3410924544,3410925567,SG +3410925568,3410926591,MH +3410926592,3410927615,CN +3410927616,3410931711,NP +3410931712,3410935807,TW +3410935808,3410939903,MY +3410939904,3410943999,IN +3410944000,3410952191,JP +3410952192,3410956287,CN +3410956288,3410958335,AU +3410958336,3410958847,IN +3410958848,3410959359,ID +3410959360,3410959615,VN +3410959616,3410959871,ID +3410959872,3410960383,AU +3410960384,3410960447,GB +3410960448,3410960463,SG +3410960464,3410962175,GB +3410962176,3410962207,SG +3410962208,3410962431,GB +3410962432,3410964223,HK +3410964224,3410964479,GB +3410964480,3410968575,JP +3410968576,3410984959,NZ +3410984960,3411017727,TW +3411017728,3411018751,HK +3411018752,3411019263,CN +3411019264,3411019775,JP +3411019776,3411021823,ID +3411021824,3411023871,MY +3411023872,3411025919,JP +3411025920,3411030015,CN +3411030016,3411032063,NC +3411032064,3411032319,TH +3411032320,3411032575,CN +3411032576,3411033087,AU +3411033088,3411034111,NZ +3411034112,3411050495,HK +3411050496,3411050751,PK +3411050752,3411051007,CN +3411051008,3411051263,PK +3411051264,3411051519,SG +3411051520,3411052543,CN +3411052544,3411052544,JP +3411052545,3411052799,HK +3411052800,3411053055,JP +3411053056,3411054591,HK +3411054592,3411058687,CN +3411058688,3411061247,AU +3411061248,3411061759,KH +3411061760,3411062783,AU +3411062784,3411064831,HK +3411064832,3411065087,BD +3411065088,3411065855,HK +3411065856,3411066879,BD +3411066880,3411085311,HK +3411085312,3411086335,KR +3411086336,3411087359,JP +3411087360,3411091455,CN +3411091456,3411092223,SG +3411092224,3411092479,JP +3411092480,3411092735,SG +3411092736,3411092991,JP +3411092992,3411093055,SG +3411093056,3411093087,JP +3411093088,3411093119,SG +3411093120,3411093215,JP +3411093216,3411093247,SG +3411093248,3411093503,JP +3411093504,3411093631,SG +3411093632,3411093695,JP +3411093696,3411093759,SG +3411093760,3411094015,JP +3411094016,3411094279,SG +3411094280,3411094287,JP +3411094288,3411094319,SG +3411094320,3411094334,JP +3411094335,3411094527,SG +3411094528,3411095295,JP +3411095296,3411099647,SG +3411099648,3411107839,MM +3411107840,3411111935,LK +3411111936,3411116031,JP +3411116032,3411124223,KR +3411124224,3411128319,MM +3411128320,3411130367,HK +3411130368,3411132415,ID +3411132416,3411144703,PK +3411144704,3411145727,IN +3411145728,3411146751,CN +3411146752,3411147775,ID +3411147776,3411148799,HK +3411148800,3411149311,CN +3411149312,3411149823,MV +3411149824,3411150847,IN +3411150848,3411154943,HK +3411154944,3411155199,US +3411155200,3411155455,AU +3411155456,3411155711,US +3411155712,3411155967,AU +3411155968,3411156991,HK +3411156992,3411161087,PH +3411161088,3411165183,PK +3411165184,3411173375,MY +3411173376,3411177471,AU +3411177472,3411181567,CN +3411181568,3411189503,JP +3411189504,3411189759,HK +3411189760,3411197951,AU +3411197952,3411202047,BD +3411202048,3411204607,AU +3411204864,3411205631,KR +3411205632,3411206143,HK +3411206144,3411210239,CN +3411210240,3411212287,KR +3411212288,3411213311,IN +3411213312,3411214335,HK +3411214336,3411215359,CN +3411215360,3411216383,AU +3411216384,3411218431,CN +3411218432,3411220479,PG +3411220480,3411226623,ID +3411226624,3411228671,IO +3411228672,3411230719,CN +3411230720,3411247103,HK +3411247104,3411255295,KR +3411255296,3411263487,BD +3411263488,3411269631,AU +3411269632,3411270143,HK +3411270144,3411270399,NZ +3411270400,3411270655,AU +3411270656,3411271679,SG +3411271680,3411275775,CN +3411275776,3411277823,JP +3411277824,3411278335,HK +3411278336,3411278591,SG +3411278592,3411278847,FJ +3411278848,3411296255,HK +3411296256,3411312639,AU +3411312640,3411313151,HK +3411313152,3411313663,SG +3411313664,3411313919,AU +3411313920,3411314175,HK +3411314176,3411314687,NZ +3411314688,3411316735,ID +3411316736,3411318783,TW +3411318784,3411320831,ID +3411320832,3411329023,PH +3411329024,3411337215,HK +3411337216,3411341311,AU +3411341312,3411345407,KR +3411345408,3411354879,HK +3411354880,3411355647,SG +3411355648,3411376127,HK +3411376128,3411376383,US +3411376384,3411410943,HK +3411410944,3411443711,CN +3411443712,3411460095,HK +3411460096,3411464191,NZ +3411464192,3411468287,AU +3411468288,3411470335,JP +3411470336,3411472383,HK +3411472384,3411474943,JP +3411474944,3411475199,CN +3411475200,3411475455,AU +3411475456,3411475967,HK +3411475968,3411476479,CN +3411476480,3411509247,AU +3411509248,3411542015,PH +3411542016,3411550207,IN +3411550208,3411558399,CN +3411558400,3411566591,HK +3411566592,3411567615,IN +3411567616,3411568639,GB +3411568640,3411569663,AU +3411569664,3411570687,HK +3411570688,3411574783,AU +3411574784,3411582975,IN +3411582976,3411587071,HK +3411587072,3411591167,JP +3411591168,3411599359,CN +3411599360,3411607551,AU +3411607552,3411608575,CN +3411608576,3411608831,IN +3411608832,3411609087,AU +3411609088,3411609599,HK +3411609600,3411610623,CN +3411610624,3411611647,HK +3411611648,3411615743,ID +3411615744,3411623935,JP +3411623936,3411632127,AU +3411640320,3411641343,JP +3411641344,3411641599,IN +3411641600,3411641855,CN +3411641856,3411642367,IN +3411642368,3411643391,CN +3411643392,3411644415,VN +3411644416,3411644671,CN +3411644672,3411644927,AU +3411644928,3411645951,ID +3411645952,3411646207,SG +3411646208,3411647487,IN +3411647488,3411648511,AU +3411648512,3411656703,NZ +3411656704,3411673087,AU +3411673088,3411674111,CN +3411674112,3411674623,IN +3411674624,3411675135,HK +3411675136,3411677183,CN +3411677184,3411679231,JP +3411679232,3411681279,AU +3411681280,3411689471,KR +3411689472,3411705855,IN +3411705856,3411730431,CN +3411730432,3411738623,HK +3411738624,3411746815,TW +3411746816,3411755007,CN +3411755008,3411763199,AU +3411763200,3411767295,CN +3411767296,3411769343,MN +3411769344,3411771391,CN +3411771392,3411779583,HK +3411779584,3411787775,JP +3411787776,3411795967,IN +3411795968,3411804159,AU +3411804160,3411805183,CN +3411805184,3411805695,PK +3411805696,3411805951,CN +3411805952,3411806207,AU +3411806208,3411808255,PH +3411808256,3411810303,JP +3411810304,3411810815,NZ +3411810816,3411812351,AU +3411812352,3411820543,IN +3411820544,3411836927,SG +3411836928,3411845119,MY +3411845120,3411853311,CN +3411853312,3411857407,IN +3411857408,3411859249,JP +3411859250,3411859251,AU +3411859252,3411859815,JP +3411859816,3411859816,CN +3411859817,3411861503,JP +3411861504,3411869695,AU +3411869696,3411943423,CN +3411943424,3411951615,NZ +3411951616,3411967999,LK +3411968000,3411984383,AU +3411984384,3412000767,IN +3412000768,3412002815,CN +3412002816,3412004863,GU +3412004864,3412017151,JP +3412017152,3412025343,SG +3412025344,3412049919,CN +3412049920,3412050943,HK +3412050944,3412051967,KH +3412051968,3412055039,CN +3412055040,3412056063,HK +3412056064,3412057087,IN +3412057088,3412058111,BD +3412058112,3412066303,CN +3412066304,3412213759,NZ +3412213760,3412221951,AU +3412221952,3412230143,IN +3412230144,3412246527,HK +3412246528,3412249903,AU +3412249904,3412249919,SG +3412249920,3412253695,AU +3412253696,3412254719,JP +3412254720,3412262911,NR +3412262912,3412264959,JP +3412264960,3412267007,HK +3412267008,3412271103,CN +3412271104,3412273151,NZ +3412273152,3412275199,IN +3412275200,3412279295,PK +3412279296,3412281343,NZ +3412281344,3412283391,JP +3412283392,3412287487,CN +3412287488,3412295679,ID +3412295680,3412296191,NZ +3412296192,3412296703,ID +3412296704,3412297727,NZ +3412297728,3412298751,MY +3412298752,3412299263,TH +3412299264,3412299519,AU +3412299520,3412299775,HK +3412299776,3412302847,AU +3412302848,3412303871,WS +3412303872,3412312063,PK +3412312064,3412320255,IN +3412320256,3412322303,JP +3412322304,3412324351,PH +3412324352,3412326399,JP +3412326400,3412327423,VN +3412327424,3412327935,TH +3412327936,3412328191,HK +3412328192,3412328447,WS +3412328448,3412336639,AU +3412336640,3412340735,CN +3412340736,3412342783,HK +3412342784,3412343039,AU +3412343040,3412343295,HK +3412343296,3412343551,CN +3412343552,3412343807,AU +3412343808,3412344063,CN +3412344064,3412344319,AU +3412344320,3412344575,SG +3412344576,3412344831,CN +3412344832,3412348927,IN +3412348928,3412361215,CN +3412361216,3412369407,JP +3412369408,3412377599,KR +3412377600,3412381695,CN +3412381696,3412385791,NZ +3412385792,3412393983,AU +3412393984,3412426751,IN +3412426752,3412433759,TH +3412433760,3412433775,ID +3412433776,3412433791,TH +3412433792,3412433823,HK +3412433824,3412434943,TH +3412434944,3412443135,PK +3412443136,3412451327,SG +3412451328,3412594687,AU +3412594688,3412596735,IN +3412596736,3412598783,MV +3412598784,3412602879,CN +3412602880,3412606975,NC +3412606976,3412615167,PH +3412615168,3412631551,JP +3412631552,3412639743,SG +3412639744,3412656127,JP +3412656128,3412672511,HK +3412672512,3412680703,JP +3412680704,3412697087,CN +3412697088,3412705279,IN +3412705280,3412713471,AU +3412713472,3412721663,TW +3412721664,3412787199,MY +3412787200,3412819967,CN +3412819968,3412852735,TH +3412852736,3412918271,AU +3412918272,3412926463,KR +3412926464,3412934655,MY +3412934656,3412951039,IN +3412951040,3413000191,NZ +3413000192,3413004287,LA +3413004288,3413008383,IN +3413008384,3413016575,JP +3413016576,3413024767,AU +3413024768,3413032959,CN +3413032960,3413037055,AU +3413037056,3413041151,CN +3413041152,3413043199,JP +3413043200,3413043967,CN +3413043968,3413044223,AU +3413044224,3413045247,HK +3413045248,3413047295,IN +3413047296,3413098495,AU +3413098496,3413102591,JP +3413102592,3413106687,TW +3413106688,3413110783,PH +3413110784,3413112831,JP +3413112832,3413113855,IN +3413113856,3413114879,HK +3413114880,3413133311,JP +3413133312,3413135359,BD +3413135360,3413139455,HK +3413139456,3413147647,AU +3413147648,3413155839,IN +3413155840,3413164031,SG +3413164032,3413172223,BD +3413172224,3413180415,MY +3413180416,3413213183,TH +3413213184,3413229567,VN +3413229568,3413245951,AU +3413245952,3413251071,MY +3413251072,3413262335,JP +3413262336,3413263359,PH +3413263360,3413264383,US +3413264384,3413264639,SG +3413264640,3413264895,AU +3413264896,3413265151,ID +3413265152,3413265407,SG +3413265408,3413266431,AU +3413266432,3413270527,CN +3413270528,3413278719,TH +3413278720,3413295103,NZ +3413295104,3413303295,JP +3413303296,3413304319,ID +3413304320,3413305343,JP +3413305344,3413306367,IN +3413306368,3413307391,PH +3413307392,3413308415,IN +3413308416,3413309439,CN +3413309440,3413310463,JP +3413310464,3413311487,HK +3413311488,3413327871,LK +3413327872,3413344255,IN +3413344256,3413360639,PH +3413360640,3413377023,MY +3413377024,3413524479,SG +3413524480,3413540863,TH +3413540864,3413557247,NZ +3413557248,3413565439,CN +3413565440,3413569535,TW +3413569536,3413569791,SG +3413569792,3413570047,CN +3413570048,3413570303,KH +3413570304,3413570559,AU +3413570560,3413571583,PH +3413571584,3413572607,CN +3413572608,3413573631,JP +3413573632,3413573887,AU +3413573888,3413574143,JP +3413574144,3413574399,HK +3413574400,3413574655,TW +3413574656,3413575679,PH +3413575680,3413576703,VN +3413576704,3413576959,AU +3413576960,3413577215,ID +3413577216,3413577727,AU +3413577728,3413578751,JP +3413578752,3413579007,PK +3413579008,3413579263,AU +3413579264,3413579775,JP +3413579776,3413582847,CN +3413582848,3413583871,VN +3413583872,3413584127,JP +3413584128,3413584383,ID +3413584384,3413584895,AU +3413584896,3413585919,VN +3413585920,3413586175,ID +3413586176,3413586687,IN +3413586688,3413586943,FJ +3413586944,3413587967,ID +3413587968,3413588223,NZ +3413588224,3413588479,MY +3413588480,3413593087,VN +3413593088,3413593599,AU +3413593600,3413593855,SG +3413593856,3413594111,KH +3413594112,3413595135,CN +3413595136,3413595391,NZ +3413595392,3413595647,CN +3413595648,3413595903,AU +3413595904,3413596159,HK +3413596160,3413597183,NP +3413597184,3413597695,AU +3413597696,3413597951,TW +3413597952,3413602303,AU +3413602304,3413602559,ID +3413602560,3413604351,CN +3413604352,3413606399,HK +3413606400,3413639167,CN +3413639168,3413639423,SG +3413639424,3413639679,JP +3413639680,3413640479,SG +3413640480,3413640959,JP +3413640960,3413643519,SG +3413643520,3413643775,JP +3413643776,3413644459,SG +3413644460,3413644479,JP +3413644480,3413644511,SG +3413644512,3413644527,JP +3413644528,3413645055,SG +3413645056,3413645311,JP +3413645312,3413646079,SG +3413646080,3413646399,JP +3413646400,3413646479,SG +3413646480,3413646591,JP +3413646592,3413646847,SG +3413646848,3413646895,JP +3413646896,3413646935,SG +3413646936,3413646943,JP +3413646944,3413646959,SG +3413646960,3413646975,JP +3413646976,3413647047,SG +3413647048,3413647055,JP +3413647056,3413647103,SG +3413647104,3413647423,JP +3413647424,3413647455,SG +3413647456,3413647871,JP +3413647872,3413648383,SG +3413648384,3413648399,JP +3413648400,3413648591,SG +3413648592,3413648607,JP +3413648608,3413648623,SG +3413648624,3413648639,JP +3413648640,3413649375,SG +3413649376,3413649407,JP +3413649408,3413649727,SG +3413649728,3413649743,JP +3413649744,3413649759,SG +3413649760,3413649775,JP +3413649776,3413649807,SG +3413649808,3413649823,JP +3413649824,3413649855,SG +3413649856,3413649871,JP +3413649872,3413649919,SG +3413649920,3413650175,JP +3413650176,3413650943,SG +3413650944,3413651199,JP +3413651200,3413651455,SG +3413651456,3413651967,JP +3413651968,3413652479,SG +3413652480,3413652735,JP +3413652736,3413653247,SG +3413653248,3413653503,JP +3413653504,3413654271,SG +3413654272,3413654783,JP +3413654784,3413655295,SG +3413655296,3413656831,JP +3413656832,3413657087,SG +3413657088,3413657343,JP +3413657344,3413657599,SG +3413657600,3413658879,JP +3413658880,3413659135,SG +3413659136,3413659903,JP +3413659904,3413660159,SG +3413660160,3413661183,JP +3413661184,3413661439,SG +3413661440,3413661951,JP +3413661952,3413662463,SG +3413662464,3413662719,JP +3413662720,3413662975,SG +3413662976,3413664255,JP +3413664256,3413664511,SG +3413664512,3413665023,JP +3413665024,3413665279,SG +3413665280,3413665535,JP +3413665536,3413665983,SG +3413665984,3413666047,JP +3413666048,3413666303,SG +3413666304,3413666815,JP +3413666816,3413667583,SG +3413667584,3413667839,JP +3413667840,3413670399,SG +3413670400,3413670655,JP +3413670656,3413670719,SG +3413670720,3413670735,JP +3413670736,3413670751,SG +3413670752,3413670783,JP +3413670784,3413670815,SG +3413670816,3413670847,JP +3413670848,3413670879,SG +3413670880,3413670911,JP +3413670912,3413671167,SG +3413671168,3413671363,JP +3413671364,3413671395,SG +3413671396,3413671423,JP +3413671424,3413671711,SG +3413671712,3413671743,JP +3413671744,3413672447,SG +3413672448,3413672511,JP +3413672512,3413672703,SG +3413672704,3413672767,JP +3413672768,3413672831,SG +3413672832,3413672959,JP +3413672960,3413674511,SG +3413674512,3413674815,JP +3413674816,3413674911,SG +3413674912,3413674959,JP +3413674960,3413676671,SG +3413676672,3413676831,JP +3413676832,3413676863,SG +3413676864,3413676864,JP +3413676865,3413676991,SG +3413676992,3413677055,JP +3413677056,3413678591,SG +3413678592,3413678847,JP +3413678848,3413679103,SG +3413679104,3413679359,JP +3413679360,3413679615,SG +3413679616,3413679743,JP +3413679744,3413679807,SG +3413679808,3413679871,JP +3413679872,3413680127,SG +3413680128,3413680639,JP +3413680640,3413680895,SG +3413680896,3413681151,JP +3413681152,3413681343,SG +3413681344,3413681407,JP +3413681408,3413683487,SG +3413683488,3413683519,JP +3413683520,3413683663,SG +3413683664,3413683679,JP +3413683680,3413683711,SG +3413683712,3413683967,JP +3413683968,3413685375,SG +3413685376,3413685391,JP +3413685392,3413685407,SG +3413685408,3413685503,JP +3413685504,3413685759,SG +3413685760,3413685823,JP +3413685824,3413685855,SG +3413685856,3413685887,JP +3413685888,3413685919,SG +3413685920,3413685951,JP +3413685952,3413686271,SG +3413686272,3413686335,JP +3413686336,3413686368,SG +3413686369,3413686783,JP +3413686784,3413687807,SG +3413687808,3413687999,JP +3413688000,3413688063,SG +3413688064,3413688319,JP +3413688320,3413688927,SG +3413688928,3413688959,JP +3413688960,3413688991,SG +3413688992,3413689087,JP +3413689088,3413689599,SG +3413689600,3413689847,JP +3413689848,3413689851,SG +3413689852,3413689855,JP +3413689856,3413690367,SG +3413690368,3413690623,JP +3413690624,3413691391,SG +3413691392,3413691647,JP +3413691648,3413693247,SG +3413693248,3413693279,JP +3413693280,3413693311,SG +3413693312,3413693375,JP +3413693376,3413695487,SG +3413695488,3413695999,JP +3413696000,3413696527,SG +3413696528,3413696639,JP +3413696640,3413696671,SG +3413696672,3413696703,JP +3413696704,3413696735,SG +3413696736,3413696831,JP +3413696832,3413696863,SG +3413696864,3413696959,JP +3413696960,3413696967,SG +3413696968,3413696991,JP +3413696992,3413697023,SG +3413697024,3413697119,JP +3413697120,3413697151,SG +3413697152,3413697207,JP +3413697208,3413697215,SG +3413697216,3413697263,JP +3413697264,3413697407,SG +3413697408,3413697535,JP +3413697536,3413699839,SG +3413699840,3413699967,JP +3413699968,3413700063,SG +3413700064,3413700351,JP +3413700352,3413700607,SG +3413700608,3413700639,JP +3413700640,3413700671,SG +3413700672,3413700767,JP +3413700768,3413700863,SG +3413700864,3413700895,JP +3413700896,3413700927,SG +3413700928,3413701023,JP +3413701024,3413701055,SG +3413701056,3413701119,JP +3413701120,3413703167,SG +3413703168,3413703231,JP +3413703232,3413703295,SG +3413703296,3413703359,JP +3413703360,3413704447,SG +3413704448,3413704639,JP +3413704640,3413704703,SG +3413704704,3413737471,MY +3413737472,3413742079,SG +3413742080,3413742591,TH +3413742592,3413744127,SG +3413744128,3413745407,TH +3413745408,3413747455,SG +3413747456,3413747711,JP +3413747712,3413748223,SG +3413748224,3413748479,JP +3413748480,3413749503,SG +3413749504,3413749759,JP +3413749760,3413750079,TH +3413750080,3413750143,JP +3413750144,3413750271,TH +3413750272,3413751039,SG +3413751040,3413751295,JP +3413751296,3413751551,SG +3413751552,3413752063,JP +3413752064,3413752575,SG +3413752576,3413752831,JP +3413752832,3413753087,SG +3413753088,3413753855,TH +3413753856,3413762047,AU +3413762048,3413770239,TW +3413770240,3413786623,IN +3413786624,3413835775,AU +3413835776,3413843967,SG +3413843968,3413848063,IN +3413848064,3413850111,SG +3413850112,3413850623,ID +3413850624,3413850879,CN +3413850880,3413851135,AU +3413851136,3413852159,ID +3413852160,3413868543,AU +3413868544,3413884927,IN +3413884928,3413893119,KR +3413893120,3413901311,ID +3413901312,3413902847,SG +3413902848,3413903359,JP +3413903360,3413905407,HK +3413905408,3413907455,IN +3413907456,3413917695,PK +3413917696,3413925887,JP +3413925888,3413934079,SG +3413934080,3413946367,IN +3413946368,3413950463,AU +3413950464,3413966847,IN +3413966848,3414050303,SG +3414050304,3414050815,US +3414050816,3414155519,SG +3414155520,3414155775,PH +3414155776,3414163455,SG +3414163456,3414171647,PK +3414171648,3414179839,CN +3414179840,3414188031,ID +3414188032,3414196223,CN +3414196224,3414204415,AU +3414204416,3414220799,KR +3414220800,3414222847,HK +3414222848,3414223871,AU +3414223872,3414224895,KR +3414224896,3414226943,VN +3414226944,3414227967,ID +3414227968,3414230015,PK +3414230016,3414230527,PH +3414230528,3414231039,KR +3414231040,3414233087,HK +3414233088,3414245375,AU +3414245376,3414253567,HK +3414253568,3414261759,JP +3414261760,3414269951,AU +3414269952,3414278143,JP +3414278144,3414294527,IN +3414294528,3414302719,PK +3414302720,3414310911,CN +3414310912,3414327295,KR +3414327296,3414335487,TH +3414335488,3414339583,AU +3414339584,3414343679,KR +3414343680,3414360063,ID +3414360064,3414376447,AU +3414376448,3414409215,PH +3414409216,3414413311,JP +3414413312,3414417407,TH +3414417408,3414425599,HK +3414425600,3414431743,AU +3414431744,3414432767,US +3414432768,3414433791,AU +3414433792,3414441983,CN +3414441984,3414450175,AU +3414450176,3414458367,JP +3414458368,3414466559,IN +3414466560,3414474751,KR +3414474752,3414478847,HK +3414478848,3414482943,IN +3414482944,3414491135,AU +3414491136,3414523903,TW +3414523904,3414532095,JP +3414532096,3414540287,KR +3414540288,3414554623,JP +3414554624,3414555647,AU +3414555648,3414556671,PK +3414556672,3414605823,AU +3414605824,3414616063,IN +3414616064,3414618111,ID +3414618112,3414620159,CN +3414620160,3414621183,IN +3414621184,3414638591,PK +3414638592,3414646783,TW +3414646784,3414654975,CN +3414654976,3414663167,HK +3414663168,3414667263,CN +3414667264,3414669311,ID +3414669312,3414670335,AU +3414670336,3414670591,IN +3414670592,3414670847,SG +3414670848,3414671359,MY +3414671360,3415080959,JP +3415080960,3415082239,MY +3415082240,3415083007,SG +3415083008,3415083519,AU +3415083520,3415084031,SG +3415084032,3415084543,CN +3415084544,3415085055,US +3415085056,3415087615,SG +3415087616,3415087871,US +3415087872,3415088127,SG +3415088128,3415089151,HK +3415089152,3415097343,MY +3415097344,3415103487,ID +3415103488,3415113727,HK +3415113728,3415121919,AU +3415121920,3415130111,KR +3415130112,3415136255,JP +3415136256,3415136767,KR +3415136768,3415137023,PK +3415137024,3415137279,CN +3415137280,3415137535,IN +3415137536,3415137791,NF +3415137792,3415138303,AU +3415138304,3415146495,CN +3415146496,3415162879,LK +3415162880,3415171071,AU +3415171072,3415179263,JP +3415179264,3415187455,SG +3415187456,3415191551,AU +3415191552,3415195647,IN +3415195648,3415199743,NZ +3415199744,3415220223,AU +3415220224,3415224319,NZ +3415224320,3415228415,US +3415228416,3415236607,KH +3415236608,3415244799,CN +3415244800,3415277567,TH +3415277568,3415285759,CN +3415285760,3415293951,AU +3415293952,3415302143,HK +3415302144,3415306239,JP +3415306240,3415308287,TH +3415308288,3415310335,JP +3415310336,3415326719,IN +3415326720,3415334911,TW +3415334912,3415343103,JP +3415343104,3415425023,TH +3415425024,3415431167,NC +3415431168,3415432191,IN +3415432192,3415435263,AU +3415435264,3415436287,PH +3415436288,3415436799,AU +3415436800,3415437311,HK +3415437312,3415441407,JP +3415441408,3415474175,AU +3415474176,3415495679,CN +3415495680,3415496191,ID +3415496192,3415496703,CN +3415496704,3415497727,BD +3415497728,3415497983,TW +3415497984,3415498751,AU +3415498752,3415506943,JP +3415506944,3415556095,TH +3415556096,3415563263,AU +3415563264,3415564287,CN +3415564288,3415568383,JP +3415568384,3415572479,KR +3415572480,3415605247,SG +3415605248,3415736319,TH +3415736320,3415737599,SG +3415737600,3415737855,JP +3415737856,3415738879,SG +3415738880,3415739135,JP +3415739136,3415740159,SG +3415740160,3415740415,JP +3415740416,3415741695,SG +3415741696,3415741951,JP +3415741952,3415742207,SG +3415742208,3415742463,JP +3415742464,3415746815,SG +3415746816,3415747071,JP +3415747072,3415747839,SG +3415747840,3415748351,JP +3415748352,3415749375,SG +3415749376,3415749631,JP +3415749632,3415749887,TH +3415749888,3415750143,SG +3415750144,3415750399,JP +3415750400,3415751423,SG +3415751424,3415751679,JP +3415751680,3415752191,TH +3415752192,3415752703,SG +3415752704,3415760895,CN +3415760896,3415769087,NZ +3415769088,3415777279,CN +3415777280,3415785471,KR +3415785472,3415793663,JP +3415793664,3415801855,AU +3415801856,3415802879,CN +3415802880,3415803391,HK +3415803392,3415805951,PH +3415805952,3415806975,AU +3415806976,3415810047,ID +3415810048,3415814399,IN +3415814400,3415814655,ID +3415814656,3415815167,TH +3415815168,3415816191,IN +3415816192,3415817215,JP +3415817216,3415818239,MY +3415818240,3415822335,JP +3415822336,3415822847,MY +3415822848,3415823103,MV +3415823104,3415826431,MY +3415826432,3415834623,ID +3415834624,3415838719,TH +3415838720,3415842815,KR +3415842816,3415851007,TH +3415851008,3415855103,AU +3415855104,3415856127,IN +3415856128,3415858175,ID +3415858176,3415859199,LK +3415859200,3415867391,AU +3415867392,3416047615,TH +3416047616,3416063999,CN +3416064000,3416131583,TH +3416131584,3416133631,PH +3416133632,3416135679,CN +3416135680,3416137727,MY +3416137728,3416145919,AU +3416145920,3416154111,IN +3416154112,3416215551,TH +3416215552,3416219647,NL +3416219648,3416260607,TH +3416260608,3416261119,VN +3416261120,3416261631,AU +3416261632,3416262655,TH +3416262656,3416264703,AU +3416264704,3416268799,JP +3416268800,3416272895,HK +3416272896,3416273919,ID +3416273920,3416274943,HK +3416274944,3416276991,ID +3416276992,3416285183,HK +3416285184,3416285247,VN +3416285248,3416285251,CN +3416285252,3416287231,VN +3416287232,3416289279,HK +3416289280,3416293375,NZ +3416293376,3416293631,ID +3416293632,3416293887,CN +3416293888,3416294399,PH +3416294400,3416295423,VN +3416295424,3416295679,IN +3416295680,3416295935,TH +3416295936,3416296447,IN +3416296448,3416297471,KR +3416297472,3416301567,TW +3416301568,3416309759,PH +3416309760,3416317951,CN +3416317952,3416326143,TW +3416326144,3416327167,CN +3416327168,3416328191,HK +3416328192,3416330239,AU +3416330240,3416334335,ID +3416334336,3416339455,SG +3416339456,3416339711,IN +3416339712,3416342527,SG +3416342528,3416371199,AU +3416371200,3416371711,PH +3416371712,3416371967,VN +3416371968,3416372223,PK +3416372224,3416372479,CN +3416372480,3416372735,SG +3416372736,3416372991,AU +3416372992,3416373247,CN +3416373248,3416373759,ID +3416373760,3416374271,AU +3416374272,3416374527,PH +3416374528,3416374783,IN +3416374784,3416375295,ID +3416375296,3416383487,CN +3416383488,3416391679,HK +3416391680,3416457215,VN +3416457216,3416474583,JP +3416474584,3416474599,AU +3416474600,3416482127,JP +3416482128,3416482133,SG +3416482134,3416489755,JP +3416489756,3416489759,AU +3416489760,3416489983,JP +3416489984,3416506367,VN +3416506368,3416514559,TW +3416514560,3416522751,IN +3416522752,3416588287,AU +3416588288,3416653823,JP +3416653824,3416686591,AU +3416686592,3416694783,SG +3416694784,3416702975,CN +3416702976,3416707071,ID +3416707072,3416709119,KR +3416709120,3416709375,AU +3416709376,3416709631,ID +3416709632,3416710143,AU +3416710144,3416711167,HK +3416711168,3416719359,AU +3416719360,3416721407,PH +3416721408,3416723199,VN +3416723200,3416723455,TW +3416723456,3416724479,KH +3416724480,3416725503,HK +3416725504,3416726527,AU +3416726528,3416727551,CN +3416727552,3416735743,JP +3416735744,3416752127,PH +3416752128,3416784895,NZ +3416784896,3416793087,CN +3416793088,3416801279,AU +3416801280,3416817663,JP +3416817664,3416850431,HK +3416850432,3416851455,PH +3416851456,3416851967,KR +3416851968,3416852479,SG +3416852480,3416854527,JP +3416854528,3416856575,AU +3416856576,3416858623,BD +3416858624,3416862719,HK +3416862720,3416864767,MN +3416864768,3416864895,JP +3416864896,3416865023,SG +3416865024,3416865151,HK +3416865152,3416865279,SG +3416865280,3416865287,JP +3416865288,3416865295,HK +3416865296,3416865303,AU +3416865304,3416865311,HK +3416865312,3416865327,SG +3416865328,3416865343,HK +3416865344,3416865359,JP +3416865360,3416865407,HK +3416865408,3416865599,JP +3416865600,3416865655,HK +3416865656,3416865791,JP +3416865792,3416865919,SG +3416865920,3416866055,HK +3416866056,3416866071,SG +3416866072,3416866079,HK +3416866080,3416866095,SG +3416866096,3416866559,HK +3416866560,3416883199,SG +3416883200,3416915967,HK +3416915968,3416920063,AU +3416920064,3416921087,TH +3416921088,3416922111,PH +3416922112,3416922367,AU +3416922368,3416922623,IN +3416922624,3416923135,VN +3416923136,3416924159,HK +3416924160,3416928255,JP +3416928256,3416928511,IN +3416928512,3416928767,HK +3416928768,3416929279,TH +3416929280,3416930303,JP +3416930304,3416930559,NZ +3416930560,3416930815,AU +3416930816,3416931327,CN +3416931328,3416932351,IN +3416932352,3416936447,PK +3416936448,3416937215,AU +3416937216,3416937471,HK +3416937472,3416939007,AU +3416939008,3416939519,HK +3416939520,3416940543,AU +3416940544,3416948735,KR +3416948736,3416981503,TH +3416981504,3416982527,CN +3416982528,3416982783,NZ +3416982784,3416983039,AU +3416983040,3416983551,PH +3416983552,3416985599,JP +3416985600,3416989695,VN +3416989696,3416997887,NZ +3416997888,3417014271,AU +3417014272,3417022463,JP +3417022464,3417030655,KR +3417030656,3417034751,AU +3417034752,3417035007,CN +3417035008,3417035775,IN +3417035776,3417036799,JP +3417036800,3417037823,ID +3417037824,3417038079,AU +3417038080,3417038335,ID +3417038336,3417038591,IN +3417038592,3417038847,NZ +3417038848,3417042943,CN +3417042944,3417044991,IN +3417044992,3417045247,AU +3417045248,3417045311,CX +3417045312,3417045375,AU +3417045376,3417045759,CX +3417045760,3417045823,AU +3417045824,3417046015,CX +3417046016,3417047039,AU +3417047040,3417055231,PH +3417055232,3417112575,TH +3417112576,3417128959,AU +3417128960,3417135103,JP +3417135104,3417137151,ID +3417137152,3417145343,KR +3417145344,3417178111,NZ +3417178112,3417179135,PH +3417179136,3417179391,CN +3417179392,3417179647,ID +3417179648,3417180159,CN +3417180160,3417182207,ID +3417182208,3417184767,AU +3417184768,3417185023,MN +3417185024,3417185279,AF +3417185280,3417185791,SG +3417185792,3417186303,NZ +3417186304,3417194495,HK +3417194496,3417198591,JP +3417198592,3417200639,SG +3417200640,3417202687,JP +3417202688,3417210879,CN +3417210880,3417227263,AU +3417227264,3417243647,JP +3417243648,3417244671,PH +3417244672,3417245695,IN +3417247744,3417251839,JP +3417251840,3417260031,KR +3417260032,3417264127,PK +3417264128,3417268223,JP +3417272320,3417274367,NZ +3417274368,3417275391,AU +3417275392,3417276415,PH +3417276416,3417284607,CN +3417284608,3417288703,SG +3417288704,3417289215,IN +3417289216,3417289727,AU +3417289728,3417291263,IN +3417291264,3417291775,AU +3417291776,3417292799,KR +3417292800,3417333759,CN +3417333760,3417337855,AU +3417337856,3417338367,IN +3417338368,3417338879,HK +3417339904,3417340415,AU +3417340416,3417340927,NZ +3417340928,3417341951,HK +3417341952,3417346047,KH +3417346048,3417348095,MY +3417348096,3417348351,AU +3417348352,3417348607,IN +3417348608,3417349119,NZ +3417349120,3417349631,IN +3417349632,3417350143,AU +3417350144,3417352191,VN +3417352192,3417354239,CN +3417354240,3417356287,ID +3417356288,3417357311,AU +3417357312,3417357567,NZ +3417357568,3417358335,PK +3417358336,3417374719,HK +3417374720,3417440255,PH +3417440256,3417833471,JP +3417833472,3417849855,NZ +3417849856,3417853951,AU +3417853952,3417858047,CN +3417858048,3417866239,JP +3417866240,3417915391,HK +3417915392,3417939967,TH +3417939968,3417946111,PF +3417946112,3417946137,AU +3417946138,3417946138,HK +3417946139,3417947135,AU +3417947136,3417947391,TH +3417947392,3417947647,CN +3417947648,3417947903,AU +3417947904,3417948159,IN +3417948160,3417964543,AU +3417964544,3418030079,HK +3418030080,3418062847,TW +3418062848,3418071039,US +3418071040,3418079231,CN +3418079232,3418095615,IN +3418095616,3418111999,TH +3418112000,3418128383,HK +3418128384,3418136575,AU +3418136576,3418144767,BD +3418144768,3418148863,TW +3418148864,3418150911,JP +3418150912,3418152959,AU +3418152960,3418155007,IN +3418155008,3418157055,MY +3418157056,3418161151,BD +3418161152,3418161663,CN +3418161664,3418162431,AU +3418162432,3418162687,IN +3418162688,3418163199,CN +3418163200,3418165247,PH +3418165248,3418167295,MY +3418167552,3418167807,AU +3418167808,3418168319,HK +3418168320,3418169343,VN +3418169344,3418177535,JP +3418177536,3418181631,LK +3418181632,3418183679,AU +3418183680,3418184191,ID +3418184192,3418184959,IN +3418184960,3418185727,AU +3418185728,3418189823,JP +3418189824,3418190847,CN +3418191872,3418192895,ID +3418192896,3418193919,AU +3418193920,3418202111,KH +3418202112,3418206207,HK +3418206208,3418208255,IN +3418208256,3418210303,LK +3418210304,3418218495,CN +3418218496,3418220543,BD +3418220544,3418221567,HK +3418221568,3418223615,CN +3418223616,3418226687,IN +3418226688,3418227711,BD +3418227712,3418228735,KR +3418228736,3418230783,BD +3418230784,3418232831,TW +3418232832,3418233343,AU +3418233344,3418233855,KR +3418233856,3418234879,JP +3418234880,3418235903,BD +3418235904,3418236415,ID +3418236416,3418236927,HK +3418236928,3418241023,ID +3418241024,3418243071,JP +3418243072,3418251263,PH +3418251264,3418255359,CN +3418255360,3418257407,ID +3418257408,3418259455,HK +3418259456,3418267647,IN +3418267648,3418271743,VN +3418271744,3418273791,SG +3418273792,3418275839,ID +3418275840,3418279935,AU +3418279936,3418281983,NZ +3418281984,3418282239,NR +3418282496,3418283519,PH +3418283520,3418284031,AU +3418284032,3418286079,JP +3418286080,3418287103,AU +3418287104,3418288127,JP +3418288128,3418290175,ID +3418290176,3418290431,IN +3418290432,3418290687,CN +3418290688,3418291199,TH +3418291200,3418291711,AU +3418291712,3418292223,BD +3418292224,3418292991,CN +3418292992,3418293503,HK +3418293504,3418293759,CN +3418293760,3418294015,AU +3418294016,3418294271,CN +3418294272,3418296319,VN +3418296320,3418297343,HK +3418297344,3418298367,CN +3418298368,3418298623,HK +3418298624,3418298879,CN +3418298880,3418299391,HK +3418299392,3418300415,CN +3418300416,3418300927,BD +3418300928,3418301439,IN +3418301440,3418302463,AU +3418302464,3418304511,ID +3418304512,3418306559,VN +3418306560,3418308607,IN +3418308608,3418324991,CN +3418324992,3418326015,VU +3418326016,3418326271,AU +3418326272,3418326527,CN +3418326528,3418327039,PH +3418327040,3418329087,JP +3418329088,3418333183,CN +3418333184,3418345471,AU +3418345472,3418357759,JP +3418357760,3418365951,CN +3418365952,3418374143,TH +3418374144,3418382335,AU +3418382336,3418393919,JP +3418393920,3418393927,AU +3418393928,3418394367,JP +3418394368,3418394623,TW +3418394624,3418397483,JP +3418397484,3418397487,PH +3418397488,3418399231,JP +3418399232,3418399247,PH +3418399248,3418400861,JP +3418400862,3418400862,SG +3418400863,3418401455,JP +3418401456,3418401459,TW +3418401460,3418401631,JP +3418401632,3418401647,PH +3418401648,3418405935,JP +3418405936,3418405939,PH +3418405940,3418406911,JP +3418406912,3418423295,IN +3418423296,3418444091,HK +3418444092,3418444095,CN +3418444096,3418456063,HK +3418456064,3418472447,IN +3418472448,3418480639,AU +3418480640,3418488831,CN +3418488832,3418505215,AU +3418505216,3418511055,JP +3418511056,3418511071,HK +3418511072,3418512319,JP +3418512320,3418512335,AU +3418512336,3418513407,JP +3418513408,3418517503,IN +3418517504,3418518527,ID +3418518528,3418519551,BD +3418519552,3418554367,HK +3418554368,3418570751,VN +3418570752,3418578943,CN +3418578944,3418583039,TH +3418583040,3418585087,HK +3418585088,3418586111,SG +3418586112,3418586367,AU +3418586368,3418586879,SG +3418586880,3418587135,AU +3418587136,3418621951,CN +3418621952,3418623999,HK +3418624000,3418626047,JP +3418626048,3418627071,VN +3418627072,3418628095,CN +3418628096,3418636287,AU +3418636288,3418642943,JP +3418642944,3418643199,ID +3418643200,3418643455,JP +3418643456,3418644479,AU +3418644480,3418644735,JP +3418644736,3418644863,AU +3418644864,3418650807,JP +3418650808,3418650808,HK +3418650809,3418652671,JP +3418652672,3418750975,IN +3418750976,3418816511,HK +3418816512,3418947583,IN +3418947584,3418955775,AU +3418955776,3418959871,TW +3418959872,3418960383,BD +3418960384,3418960895,ID +3418960896,3418961919,JP +3418961920,3418962943,VN +3418962944,3418963967,IN +3418963968,3418988543,AU +3418988544,3418992639,ID +3418992640,3418993663,SG +3418993664,3418993919,PH +3418993920,3418994431,CN +3418994432,3418994687,AU +3418994688,3418995711,MY +3418995712,3418996735,JP +3418996736,3419013119,IN +3419013120,3419062271,AU +3419062272,3419070463,JP +3419070464,3419072511,HK +3419072512,3419073023,IN +3419073024,3419073279,SG +3419073280,3419073535,FJ +3419073536,3419074559,CN +3419074560,3419078655,BD +3419078656,3419209727,TW +3419209728,3419226111,VN +3419226112,3419234303,CN +3419234304,3419241751,JP +3419241752,3419241752,AU +3419241753,3419242495,JP +3419242496,3419275263,CN +3419275264,3419340799,AU +3419340800,3419344895,TW +3419344896,3419348991,KR +3419348992,3419353087,TW +3419353088,3419354111,JP +3419354112,3419356159,ID +3419356160,3419356671,NZ +3419356672,3419356927,IN +3419356928,3419357183,TH +3419357184,3419411455,CN +3419411456,3419411711,HK +3419411712,3419411967,NZ +3419411968,3419412223,PH +3419412224,3419412479,JP +3419412480,3419414527,PH +3419414528,3419422719,CN +3419422720,3419439103,AU +3419439104,3419442431,SG +3419442432,3419442687,HK +3419442688,3419471871,SG +3419471872,3419504639,TH +3419504640,3419508735,HK +3419508736,3419512831,JP +3419512832,3419516927,AU +3419516928,3419517951,JP +3419517952,3419518975,VN +3419518976,3419519999,JP +3419520000,3419520767,ID +3419520768,3419521023,TH +3419521024,3419529215,AU +3419529216,3419537407,CN +3419537408,3419541503,HK +3419541504,3419553791,KR +3419553792,3419556095,AU +3419556096,3419556351,CN +3419556352,3419556607,AU +3419556608,3419556863,CN +3419556864,3419557119,AU +3419557120,3419557120,HK +3419557121,3419557887,AU +3419557888,3419558399,ID +3419558400,3419558655,AU +3419558656,3419559935,ID +3419559936,3419560959,JP +3419560960,3419561983,IN +3419561984,3419570175,AU +3419570176,3419602943,VN +3419602944,3419611135,TW +3419611136,3419617279,JP +3419617280,3419618303,PH +3419618304,3419619327,SG +3419619328,3419635711,NZ +3419635712,3419643903,SG +3419643904,3419668479,JP +3419668480,3419672575,CN +3419672576,3419674623,AU +3419674624,3419675647,IN +3419675648,3419676671,PK +3419676672,3419684863,JP +3419684864,3419688959,IN +3419688960,3419693055,CN +3419693056,3419701247,KR +3419701248,3419709439,AU +3419709440,3419717631,KR +3419717632,3419734015,IN +3419734016,3419774975,AU +3419774976,3419783167,JP +3419783168,3419791359,PH +3419791360,3419873279,AU +3419873280,3419877375,AF +3419877376,3419877631,ID +3419877888,3419878143,ID +3419878144,3419878399,IN +3419878400,3419879423,GU +3419879424,3419880447,JP +3419880448,3419881471,MM +3419881472,3419897855,PH +3419897856,3419899647,JP +3419899648,3419899903,AU +3419899904,3419900159,GB +3419900160,3419903231,AU +3419903232,3419903487,JP +3419903488,3419906047,AU +3419906048,3419914239,PK +3419914240,3419922431,KR +3419922432,3419924479,JP +3419924480,3419925503,HK +3419925504,3419925759,JP +3419925760,3419930623,HK +3419930624,3419971583,JP +3419971584,3419979775,KR +3419979776,3419996159,JP +3419996160,3420020735,AU +3420020736,3420028927,TW +3420028928,3420029951,MY +3420029952,3420030975,ID +3420030976,3420031487,IN +3420031488,3420031999,MN +3420032000,3420032255,ID +3420032256,3420032511,AU +3420032512,3420033023,NZ +3420033024,3420034047,IN +3420034048,3420035071,AU +3420035072,3420036095,SG +3420036096,3420037119,JP +3420037120,3420038143,AU +3420038144,3420039167,CN +3420039168,3420040191,KH +3420040192,3420040703,ID +3420040704,3420040959,IN +3420040960,3420041215,HK +3420041216,3420042239,MY +3420042240,3420043263,JP +3420043264,3420044287,SG +3420044288,3420045311,ID +3420045312,3420061695,KR +3420061696,3420127231,HK +3420127232,3420323839,AU +3420323840,3420332031,TW +3420332032,3420335039,AU +3420335040,3420335040,HK +3420335041,3420335041,PK +3420335042,3420335047,AU +3420335048,3420335052,HK +3420335053,3420335053,AU +3420335054,3420335054,HK +3420335055,3420337171,AU +3420337172,3420337172,VN +3420337173,3420337173,IN +3420337174,3420337439,AU +3420337440,3420337471,SG +3420337472,3420340048,AU +3420340049,3420340049,NZ +3420340050,3420366063,AU +3420366064,3420366079,TW +3420366080,3420366959,AU +3420366960,3420366975,KR +3420366976,3420369007,AU +3420369008,3420369023,HK +3420369024,3420370559,AU +3420370560,3420370575,JP +3420370576,3420372991,AU +3420372992,3420374527,HK +3420374528,3420374783,ID +3420374784,3420375551,HK +3420375552,3420375807,ID +3420375808,3420377087,HK +3420377088,3420389375,JP +3420389376,3420393471,US +3420393472,3420395519,HK +3420395520,3420397567,JP +3420397568,3420401663,KH +3420401664,3420411903,JP +3420411904,3420412415,TH +3420412416,3420412927,ID +3420412928,3420413951,BD +3420413952,3420422143,KR +3420422144,3420430335,MY +3420430336,3420434431,PK +3420434432,3420434687,IN +3420434688,3420434943,KR +3420434944,3420435199,HK +3420435200,3420435455,AU +3420435456,3420436479,JP +3420436480,3420437503,AU +3420437504,3420438527,IN +3420438528,3420454911,HK +3420454912,3422552063,KR +3422552064,3422846975,US +3422846976,3422855167,GB +3422855168,3422955519,US +3422955520,3422956799,FR +3422956800,3423076351,US +3423076352,3423077375,CA +3423077376,3423092735,US +3423092736,3423092767,VI +3423092768,3423092783,US +3423092784,3423092831,VI +3423092832,3423092847,US +3423092848,3423093759,VI +3423093760,3423094783,US +3423094784,3423095807,CA +3423095808,3423128575,US +3423128576,3423128831,AO +3423128832,3423129087,ZA +3423129088,3423129599,NG +3423129600,3423131647,US +3423131648,3423133695,PL +3423133696,3423135999,US +3423136000,3423136255,CA +3423136256,3423137023,US +3423137024,3423137279,CA +3423137536,3423143935,US +3423143936,3423145983,CA +3423145984,3423162367,US +3423162368,3423163391,CA +3423163392,3423164415,US +3423166464,3423182847,US +3423182848,3423184895,CA +3423184896,3423258623,US +3423258624,3423260671,CA +3423260672,3423268863,US +3423268864,3423269887,CA +3423269888,3423285247,US +3423285248,3423287295,CA +3423287296,3423287807,VG +3423287808,3423303679,US +3423303680,3423304703,CA +3423304704,3423311871,US +3423311872,3423313151,VI +3423313152,3423313407,US +3423313408,3423313919,VI +3423313920,3423366479,US +3423366480,3423366495,IT +3423366496,3423371263,US +3423371264,3423375359,ZA +3423375360,3423379455,CA +3423379456,3423404031,US +3423406080,3423410175,US +3423410176,3423412223,BM +3423412224,3423416319,US +3423416320,3423417343,CA +3423417344,3423430655,US +3423430656,3423431679,TC +3423431680,3423465471,US +3423465472,3423466495,VC +3423466496,3423468543,US +3423468544,3423469567,CA +3423469568,3423473663,US +3423473664,3423474687,CA +3423474688,3423488511,US +3423488512,3423489023,CA +3423489024,3423533055,US +3423533056,3423535103,AI +3423535104,3423543295,US +3423543296,3423545343,CA +3423545344,3423552767,US +3423552768,3423553023,GB +3423553024,3423553279,US +3423553280,3423553535,GB +3423553536,3423571967,US +3423571968,3423574015,PR +3423574016,3423579135,US +3423579136,3423580159,CA +3423580160,3423582207,US +3423582208,3423586303,CA +3423586304,3423588351,US +3423590400,3423602687,US +3423602688,3423603711,KN +3423603712,3423612671,US +3423612672,3423612927,CA +3423612928,3423614975,US +3423614976,3423615487,CA +3423615488,3423626239,US +3423626240,3423627263,CA +3423627264,3423629311,US +3423629312,3423630335,AG +3423630336,3423637503,US +3423637504,3423639551,CA +3423639552,3423651839,US +3423651840,3423653887,CA +3423653888,3423705599,US +3423705600,3423705855,CA +3423705856,3423725423,US +3423725424,3423725427,CA +3423725428,3423731711,US +3423731712,3423797247,AE +3423797248,3423797503,US +3423797504,3423801087,CA +3423801088,3423801343,US +3423801344,3423823359,CA +3423823360,3423823871,US +3423823872,3423827711,CA +3423827712,3423827967,US +3423827968,3423830271,CA +3423830272,3423830527,US +3423830528,3423838719,CA +3423838720,3423838975,US +3423838976,3423846399,CA +3423846400,3423848447,US +3423848448,3423849471,KN +3423849472,3423849983,US +3423849984,3423850495,CA +3423850496,3423850751,US +3423850752,3423854335,CA +3423854336,3423854591,US +3423854592,3423858175,CA +3423858176,3423858687,US +3423858688,3423858943,CA +3423858944,3423859455,US +3423859456,3423859711,CA +3423859712,3423859967,US +3423859968,3423862527,CA +3423862528,3424378879,US +3424378880,3424379135,PR +3424379136,3424412415,US +3424412416,3424412671,CA +3424412672,3424493823,US +3424493824,3424494079,CA +3424494080,3424507135,US +3424507136,3424507391,CA +3424507392,3425173503,US +3425173504,3425304575,CA +3425304576,3425471487,US +3425471488,3425472511,CA +3425472512,3425516799,US +3425516800,3425517055,MX +3425517056,3425697791,US +3425697792,3425699839,CA +3425699840,3425714175,US +3425714176,3425722367,CA +3425722368,3425828863,US +3425828864,3425869167,CA +3425869168,3425869183,US +3425869184,3425894399,CA +3425894400,3426013183,US +3426013184,3426013439,IL +3426013440,3426356991,US +3426356992,3426357247,CA +3426357248,3426369023,US +3426369024,3426369535,CA +3426369536,3426387967,US +3426387968,3426388991,MX +3426388992,3426400255,US +3426400256,3426400511,CA +3426400512,3426418687,US +3426418688,3426420479,GB +3426420480,3426420735,US +3426420736,3426435071,GB +3426435072,3426439167,SG +3426439168,3426441215,AU +3426441216,3426441727,HK +3426441728,3426445823,US +3426445824,3426446335,DE +3426446336,3426482687,US +3426482688,3426484223,CA +3426484224,3426617855,US +3426617856,3426618367,CA +3426618368,3426646527,US +3426646528,3426646783,GB +3426646784,3426725375,US +3426725376,3426725887,CA +3426725888,3426729471,US +3426729472,3426729983,CA +3426729984,3426744319,US +3426744320,3426746367,CA +3426746368,3427112447,US +3427112448,3427112703,CN +3427112704,3427117055,US +3427117056,3427117311,CA +3427117312,3427127295,US +3427127296,3427127551,CA +3427127552,3427487743,US +3427487744,3427487999,GB +3427488000,3427488767,US +3427488768,3427489023,AU +3427489024,3427503615,US +3427503616,3427503871,AU +3427503872,3427504127,SG +3427504128,3427618303,US +3427618304,3427618559,CA +3427618560,3427651071,US +3427651072,3427651327,CA +3427651328,3427729407,US +3427729408,3427729663,CA +3427729664,3427730431,US +3427730432,3427730687,BE +3427730688,3427730943,DE +3427730944,3427731967,US +3427731968,3427732223,DE +3427732224,3427732479,US +3427732480,3427732735,CH +3427732736,3427735039,IE +3427735040,3427735295,US +3427735296,3427736063,HK +3427736064,3427736319,GB +3427736320,3427741951,US +3427741952,3427742207,DE +3427742208,3427742463,US +3427742464,3427742719,AT +3427742720,3427743231,CH +3427743232,3427743487,GB +3427743488,3427743743,DE +3427743744,3427743999,CA +3427744000,3427744255,SE +3427744256,3427745279,DE +3427745280,3427745791,TW +3427745792,3427746047,GB +3427746048,3427746303,DK +3427746304,3427746559,US +3427746560,3427746815,JP +3427746816,3427747071,DE +3427747072,3427747327,US +3427747328,3427747583,DE +3427747584,3427747839,US +3427747840,3427748095,NO +3427748096,3427748351,CH +3427748352,3427748607,JP +3427748608,3427749631,DE +3427749632,3427749887,NL +3427749888,3427750655,DE +3427750656,3427750911,GB +3427750912,3427751423,US +3427751424,3427751519,BE +3427751520,3427752447,US +3427752448,3427752959,GB +3427752960,3427753215,US +3427753216,3427753471,JP +3427753472,3427753727,FI +3427753728,3427753983,IT +3427753984,3427754239,CH +3427754240,3427754495,GB +3427754496,3427754751,DE +3427754752,3427755007,CA +3427755008,3427755263,IT +3427755264,3427755519,US +3427755520,3427755775,DE +3427755776,3427756287,BE +3427756288,3427756543,AU +3427756544,3427756799,DE +3427756800,3427757055,US +3427757056,3427757311,GR +3427757312,3427757567,FR +3427757568,3427757823,JP +3427757824,3427758079,DE +3427758080,3427758335,BE +3427758336,3427758591,US +3427758592,3427758847,IT +3427758848,3427759103,US +3427759104,3427759359,BE +3427759360,3427759871,GB +3427759872,3427760127,US +3427760128,3427760895,CA +3427760896,3427761663,US +3427761664,3427761919,JP +3427761920,3427762175,US +3427762176,3427762431,DE +3427762432,3427762687,CA +3427762688,3427763455,IT +3427763456,3427763711,AU +3427763712,3427763967,GB +3427763968,3427764223,US +3427764224,3427764479,FR +3427764480,3427765503,US +3427765504,3427765759,GB +3427765760,3427766271,US +3427766272,3427766783,GB +3427766784,3427767039,SE +3427767040,3427767807,DE +3427767808,3427769599,US +3427769600,3427770111,JP +3427770112,3427770367,NO +3427770368,3427770623,US +3427770624,3427771391,CH +3427771392,3427771647,US +3427771648,3427771903,CA +3427771904,3427772415,CH +3427772416,3427772671,DE +3427772672,3427772927,HK +3427772928,3427773183,BE +3427773184,3427773439,DE +3427773440,3427773695,US +3427773696,3427773951,FR +3427773952,3427774719,US +3427774720,3427775231,DE +3427775232,3427776511,US +3427776512,3427776767,CZ +3427776768,3427777279,US +3427777280,3427777535,DE +3427777536,3427777791,US +3427777792,3427778047,HK +3427778048,3427778303,US +3427778304,3427778559,SE +3427778560,3427779071,NO +3427779072,3427779327,GB +3427779328,3427780095,US +3427780096,3427780351,GB +3427780352,3427780863,DE +3427780864,3427781631,US +3427781632,3427781887,BE +3427781888,3427782399,US +3427782400,3427782655,GB +3427782656,3427783423,FR +3427783424,3427783679,GB +3427783680,3427783935,US +3427783936,3427784703,FR +3427784704,3427785215,US +3427785216,3427785471,JP +3427785472,3427785727,NO +3427785728,3427786751,US +3427786752,3427787263,LU +3427787264,3427787775,US +3427787776,3427788031,FR +3427788032,3427788287,CH +3427788288,3427788799,GB +3427788800,3427789567,NO +3427789568,3427790079,DE +3427790080,3427790847,US +3427790848,3427791103,IT +3427791104,3427791615,DE +3427791616,3427791871,US +3427791872,3427792383,CA +3427792384,3427792639,NL +3427792640,3427793407,SG +3427793408,3427793919,HK +3427793920,3427794175,US +3427794176,3427794943,NL +3427794944,3427796991,CA +3427796992,3427831551,US +3427831552,3427831807,MX +3427831808,3427860479,US +3427860480,3428057087,CA +3428057088,3428286719,US +3428286720,3428286975,CA +3428286976,3428296959,US +3428296960,3428297215,CL +3428297216,3428299519,US +3428299520,3428299775,ZA +3428299776,3428306175,US +3428306176,3428306431,PE +3428306432,3428318975,US +3428318976,3428319231,CA +3428319232,3428399359,US +3428399360,3428399615,CA +3428399616,3428434943,US +3428434944,3428435199,CA +3428435200,3428437503,US +3428437504,3428437759,MX +3428437760,3428582655,US +3428582656,3428582911,CA +3428582912,3428585215,US +3428585216,3428585471,CA +3428585472,3428585983,US +3428585984,3428586239,CA +3428586240,3428586495,US +3428586496,3428587007,CA +3428587008,3428587263,US +3428587264,3428587519,CA +3428587520,3428587775,US +3428587776,3428588031,CA +3428588032,3428588543,US +3428588544,3428588799,CA +3428588800,3428591871,US +3428591872,3428592127,CA +3428592128,3428592383,US +3428592384,3428593919,CA +3428593920,3428594687,US +3428594688,3428595199,CA +3428595200,3428596223,US +3428596224,3428596735,CA +3428596736,3428597247,US +3428597248,3428597503,CA +3428597504,3428598015,US +3428598016,3428598271,CA +3428598272,3428598591,US +3428598592,3428598623,CA +3428598624,3428598783,US +3428598784,3428599039,CA +3428599040,3428599551,US +3428599552,3428600575,CA +3428600576,3428600831,US +3428600832,3428601599,CA +3428601600,3428602111,US +3428602112,3428602367,CA +3428602368,3428603903,US +3428603904,3428605183,CA +3428605184,3428607999,US +3428608000,3428609023,CA +3428609024,3428610047,US +3428610048,3428610559,CA +3428610560,3428610815,US +3428610816,3428611071,CA +3428611072,3428612607,US +3428612608,3428613887,CA +3428613888,3428614143,US +3428614144,3428620031,CA +3428620032,3428620287,US +3428620288,3428621823,CA +3428621824,3428622335,US +3428622336,3428623615,CA +3428623616,3428623871,US +3428623872,3428624639,CA +3428624640,3428625407,US +3428625408,3428628223,CA +3428628224,3428630015,US +3428630016,3428634623,CA +3428634624,3428634879,US +3428634880,3428635135,CA +3428635136,3428635391,US +3428635392,3428635647,CA +3428635648,3428635903,US +3428635904,3428636927,CA +3428636928,3428637439,US +3428637440,3428637951,CA +3428637952,3428638719,US +3428638720,3428639487,CA +3428639488,3428640255,US +3428640256,3428640511,CA +3428640512,3428640767,US +3428640768,3428643327,CA +3428643328,3428643583,US +3428643584,3428643839,CA +3428643840,3428644351,US +3428644352,3428645631,CA +3428645632,3428646143,US +3428646144,3428646399,CA +3428646400,3428646655,US +3428646656,3428646911,CA +3428646912,3428660735,US +3428660736,3428661503,CA +3428661504,3428721755,US +3428721756,3428721756,NO +3428721757,3428743167,US +3428743168,3428744191,CA +3428744192,3428801467,US +3428801468,3428801468,PR +3428801469,3428931463,US +3428931464,3428931464,QA +3428931465,3428958207,US +3428958208,3428962303,CO +3428962304,3429027839,US +3429027840,3429028351,GB +3429028352,3429028863,DE +3429028864,3429029375,FR +3429029376,3429171199,US +3429171200,3429236735,CA +3429236736,3429381887,US +3429381888,3429382143,DE +3429382144,3429396223,US +3429396224,3429396479,DE +3429396480,3429408511,US +3429408512,3429408767,DE +3429408768,3429411583,US +3429411584,3429411839,DE +3429411840,3429500927,US +3429500928,3429502975,CA +3429502976,3429616639,US +3429616640,3429616895,CA +3429616896,3429775359,US +3429775360,3429777407,TC +3429777408,3429892095,US +3429892096,3429957631,CA +3429957632,3430074111,US +3430074112,3430074367,AU +3430074368,3430340643,US +3430340644,3430340644,CA +3430340645,3430354943,US +3430354944,3430356991,PR +3430356992,3430417151,US +3430417152,3430417167,BR +3430417168,3430468607,US +3430468608,3430468863,AQ +3430468864,3430703871,US +3430703872,3430704127,PR +3430704128,3430705151,US +3430705152,3430706175,MX +3430706176,3430722303,US +3430722304,3430722559,CA +3430722560,3430729471,US +3430729472,3430729727,GB +3430729728,3430747903,US +3430747904,3430748159,CA +3430748160,3430749951,US +3430749952,3430750207,CA +3430750208,3430767615,US +3430767616,3430768127,CA +3430768128,3430768895,US +3430768896,3430769151,CA +3430769152,3430769407,US +3430769408,3430769663,CA +3430769664,3430770943,US +3430770944,3430771199,CA +3430771200,3430771711,US +3430771712,3430772223,CA +3430772224,3430773247,US +3430773248,3430773503,CA +3430773504,3430774271,US +3430774272,3430774527,CA +3430774528,3430777343,US +3430777344,3430777599,CA +3430777600,3430777855,US +3430777856,3430778111,CA +3430778112,3430778623,US +3430778624,3430778879,CA +3430778880,3430779903,US +3430779904,3430780159,CA +3430780160,3430780671,US +3430780672,3430780927,CA +3430780928,3430782463,US +3430782464,3430782719,CA +3430782720,3430793983,US +3430793984,3430794239,PR +3430794240,3430795007,US +3430795008,3430795263,CA +3430795264,3430805759,US +3430805760,3430806015,CA +3430806016,3430807295,US +3430807296,3430807551,CA +3430807552,3430809087,US +3430809088,3430809343,CA +3430809344,3430811135,US +3430811136,3430811263,FI +3430811264,3430811391,SE +3430811392,3430811519,BR +3430811520,3430811647,AR +3430811648,3430812671,US +3430812672,3430813183,MX +3430813184,3430842367,US +3430842368,3430842879,DO +3430842880,3430845439,US +3430845440,3430845951,MX +3430845952,3430849535,US +3430849536,3430850047,CA +3430850048,3431071999,US +3431072000,3431072255,HK +3431072256,3431114495,US +3431114496,3431114751,CA +3431114752,3431468031,US +3431468032,3431469055,CA +3431469056,3431470847,US +3431470848,3431471103,GB +3431471104,3431596287,US +3431596288,3431606271,CA +3431606272,3431609343,US +3431609344,3431613439,CA +3431613440,3431613695,US +3431613696,3431620095,CA +3431620096,3431620351,US +3431620352,3431621375,CA +3431621376,3431622399,US +3431622400,3431622655,CA +3431622656,3431622911,US +3431622912,3431624703,CA +3431624704,3431624959,US +3431624960,3431638783,CA +3431638784,3431639039,US +3431639040,3431641855,CA +3431641856,3431642623,US +3431642624,3431657471,CA +3431657472,3431658751,US +3431658752,3431661311,CA +3431661312,3431745023,US +3431745024,3431745279,BE +3431745280,3431745791,US +3431745792,3431746047,GB +3431746048,3431747071,US +3431747072,3431747327,LU +3431747328,3431748607,US +3431748608,3431749119,FR +3431749120,3431751423,US +3431751424,3431752703,IT +3431752704,3431753215,US +3431753216,3431753471,SG +3431753472,3431753727,US +3431753728,3431755007,CA +3431755008,3431755775,NL +3431755776,3431759615,CA +3431759616,3431759871,DE +3431759872,3431851007,US +3431851008,3431851263,GB +3431851264,3432004607,US +3432004608,3432005631,CA +3432005632,3432009215,US +3432009216,3432009471,PR +3432009472,3432106239,US +3432106240,3432106495,MX +3432106496,3432113407,US +3432113408,3432113663,CA +3432113664,3432133887,US +3432133888,3432134143,GB +3432134144,3432205311,US +3432205312,3432206335,CA +3432206336,3432324607,US +3432324608,3432324863,CA +3432324864,3432329215,US +3432329216,3432330239,DE +3432330240,3432361983,US +3432361984,3432366079,DE +3432366080,3432517119,US +3432517120,3432517631,NA +3432517632,3432520703,US +3432520704,3432520959,GB +3432520960,3432530943,US +3432530944,3432531007,TH +3432531008,3432531071,SG +3432531072,3432531199,JP +3432531200,3432531455,FR +3432531456,3432549559,US +3432549560,3432549595,HK +3432549596,3432570879,US +3432570880,3432572927,HK +3432572928,3432585215,US +3432585216,3432585727,MX +3432585728,3432606463,US +3432606464,3432606719,GB +3432606720,3432613631,US +3432613632,3432613887,CA +3432613888,3432634111,US +3432634112,3432634367,CA +3432634368,3432660991,US +3432660992,3432662527,DE +3432662528,3432662531,PT +3432662532,3432663039,DE +3432663040,3432689151,US +3432689152,3432689663,CA +3432689664,3432695807,US +3432695808,3432697855,CA +3432697856,3432726271,US +3432726272,3432726527,CA +3432726528,3432736255,US +3432736256,3432736511,GB +3432736512,3432737279,US +3432737280,3432737535,SG +3432737536,3432738303,US +3432738304,3432738559,GB +3432738560,3432748799,US +3432748800,3432749055,PA +3432749056,3432749311,US +3432749312,3432749567,BG +3432749568,3432749823,US +3432749824,3432750079,BG +3432750080,3432750335,US +3432750336,3432750591,BG +3432750592,3432807423,US +3432807424,3432808447,CA +3432808448,3433955583,US +3433955584,3433959423,CA +3433959424,3433963519,US +3433963520,3433964799,CA +3433964800,3433965055,US +3433965056,3433967359,CA +3433967360,3433967615,US +3433967616,3433981951,CA +3433981952,3433983999,US +3433984000,3434012671,CA +3434012672,3434012927,US +3434012928,3434014719,CA +3434014720,3434015231,US +3434015232,3434020607,CA +3434020608,3434299391,US +3434299392,3434303487,VE +3434303488,3434380855,US +3434380856,3434380856,ES +3434380857,3434427391,US +3434427392,3434428415,HR +3434428416,3434433279,US +3434433280,3434433535,PR +3434433536,3434480439,US +3434480440,3434480440,CL +3434480441,3434490107,US +3434490108,3434490108,PH +3434490109,3434553343,US +3434553344,3434553599,ES +3434553600,3434571775,US +3434571776,3434573823,CO +3434573824,3434583039,US +3434583040,3434584063,NL +3434584064,3434807551,US +3434807552,3434831359,CA +3434831360,3434831615,US +3434831616,3434872575,CA +3434872576,3435069439,US +3435069440,3435134975,CA +3435134976,3435216383,US +3435216384,3435216637,DE +3435216638,3435216638,US +3435216639,3435216650,DE +3435216651,3435216651,US +3435216652,3435216895,DE +3435216896,3435271423,US +3435271424,3435271679,CA +3435271680,3435507711,US +3435507712,3435511807,CA +3435511808,3436249343,US +3436249344,3436252415,CA +3436252416,3436253183,US +3436253184,3436255743,CA +3436255744,3436256255,US +3436256256,3436278271,CA +3436278272,3436278527,US +3436278528,3436282367,CA +3436282368,3436282623,US +3436282624,3436289791,CA +3436289792,3436290047,US +3436290048,3436314367,CA +3436314368,3436476415,US +3436476416,3436478463,AW +3436478464,3436485103,US +3436485104,3436485104,KZ +3436485105,3436507135,US +3436507136,3436509183,BB +3436509184,3436598647,US +3436598648,3436598648,DZ +3436598649,3436684197,US +3436684198,3436684198,DK +3436684199,3436697087,US +3436697088,3436697343,VE +3436697344,3437232383,US +3437232384,3437232639,CA +3437232640,3437242879,US +3437242880,3437243135,CA +3437243136,3437249279,US +3437249280,3437249535,CA +3437249536,3437259775,US +3437259776,3437260031,CA +3437260032,3437262079,US +3437262080,3437262335,CA +3437262336,3437263615,US +3437263616,3437263871,CA +3437263872,3437266431,US +3437266432,3437266687,CA +3437266688,3437281279,US +3437281280,3437281535,CA +3437281536,3437292799,US +3437292800,3437293055,CA +3437293056,3437297919,US +3437297920,3437301759,CA +3437301760,3437305855,US +3437305856,3437307391,CA +3437307392,3437307903,US +3437307904,3437310975,CA +3437310976,3437311487,US +3437311488,3437331711,CA +3437331712,3437331967,US +3437331968,3437332479,CA +3437332480,3437332735,US +3437332736,3437334015,CA +3437334016,3437334271,US +3437334272,3437334783,CA +3437334784,3437335551,US +3437335552,3437336063,CA +3437336064,3437336319,US +3437336320,3437341695,CA +3437341696,3437341951,US +3437342208,3437343231,CA +3437343232,3437343487,US +3437343488,3437350911,CA +3437350912,3437351423,US +3437351424,3437353471,CA +3437353472,3437353727,SG +3437353728,3437358847,CA +3437358848,3437359103,US +3437359104,3437428735,CA +3437428736,3437691391,US +3437691392,3437691647,HK +3437691648,3437691903,JP +3437691904,3437692415,FR +3437692416,3437692671,US +3437692672,3437693439,CA +3437693440,3437693695,HK +3437693696,3437693951,NO +3437693952,3437694207,ES +3437694208,3437695231,AT +3437695232,3437695999,HK +3437696000,3437696767,NL +3437696768,3437702911,US +3437702912,3437703167,HK +3437703168,3437703423,US +3437703424,3437703679,NL +3437703680,3437703935,ES +3437703936,3437704191,US +3437704192,3437704703,CH +3437704704,3437706495,US +3437706496,3437706751,CH +3437706752,3437707263,US +3437707264,3437707519,DE +3437707520,3437707775,US +3437707776,3437708031,FR +3437708032,3437708287,US +3437708288,3437708799,FI +3437708800,3437710079,US +3437710080,3437710335,GB +3437710336,3437712639,US +3437712640,3437713663,GB +3437713664,3437715199,US +3437715200,3437715455,DE +3437715456,3437715711,JP +3437715712,3437715967,IT +3437715968,3437716991,DE +3437716992,3437717247,US +3437717248,3437718527,BE +3437718528,3437720063,US +3437720064,3437723135,SG +3437723136,3437725183,US +3437725184,3437725695,MN +3437725696,3437726207,DE +3437726208,3437726463,US +3437726464,3437726975,GB +3437726976,3437731583,US +3437731584,3437731615,AF +3437731616,3437734399,US +3437734400,3437734655,SG +3437734656,3437748223,US +3437748224,3437748479,GB +3437748480,3437748991,NL +3437748992,3437749247,US +3437749248,3437749503,DE +3437749504,3437749759,US +3437749760,3437750015,JP +3437750016,3437750271,BE +3437750272,3437750527,GB +3437750528,3437751551,US +3437751552,3437751807,IT +3437751808,3437752063,GB +3437752064,3437752319,ES +3437752320,3437752575,IE +3437752576,3437755135,US +3437755136,3437755647,JP +3437755648,3437755903,GB +3437755904,3437756159,US +3437756160,3437756415,IE +3437756416,3437772799,US +3437772800,3437776895,CA +3437776896,3437789863,US +3437789864,3437789871,AU +3437789872,3437961215,US +3437961216,3437964287,ZA +3437964288,3438006271,US +3438006272,3438010367,CA +3438010368,3438014463,US +3438018560,3438034943,US +3438034944,3438051327,BS +3438051328,3438084095,US +3438084096,3438116863,CA +3438116864,3438132559,US +3438132560,3438132575,CA +3438132576,3438137183,US +3438137184,3438137191,CA +3438137192,3438139391,US +3438139392,3438140415,GB +3438140416,3438143007,US +3438143008,3438143023,KY +3438143024,3438215423,US +3438215424,3438215935,CA +3438215936,3438216191,US +3438216192,3438217983,CA +3438217984,3438218239,US +3438218240,3438218751,CA +3438218752,3438219263,US +3438219264,3438219519,CA +3438219520,3438219775,US +3438219776,3438246911,CA +3438246912,3438247167,US +3438247168,3438252543,CA +3438252544,3438252799,US +3438252800,3438261759,CA +3438261760,3438262015,US +3438262016,3438280703,CA +3438280704,3438542847,US +3438542848,3438608383,CA +3438608384,3438610125,US +3438610126,3438610126,DE +3438610127,3438610167,US +3438610168,3438610171,PL +3438610172,3438610325,US +3438610326,3438610326,GB +3438610327,3438610408,US +3438610409,3438610410,GB +3438610411,3438611455,US +3438611456,3438611711,GB +3438611712,3438611787,US +3438611788,3438611791,HU +3438611792,3438895103,US +3438895104,3438896639,HN +3438896640,3438915605,US +3438915606,3438915606,GT +3438915607,3439059711,US +3439059712,3439059967,PR +3439059968,3439071103,US +3439071104,3439071135,MX +3439071136,3448303615,US +3448303616,3448303871,KY +3448303872,3448338687,US +3448338688,3448339455,GB +3448339456,3448377343,US +3448377344,3448377855,AG +3448377856,3448379647,US +3448379648,3448379903,SG +3448379904,3448380415,US +3448380416,3448380671,SG +3448380672,3448380839,US +3448380840,3448380847,SG +3448380848,3448381183,US +3448381184,3448381439,SG +3448381440,3448398335,US +3448398336,3448399103,CA +3448399104,3448399359,US +3448399360,3448399871,CA +3448399872,3448444143,US +3448444144,3448444159,SG +3448444160,3448500479,US +3448500480,3448500735,SG +3448500736,3448559103,US +3448559104,3448559359,GB +3448559360,3448717311,US +3448717312,3448717567,AU +3448717568,3448838143,US +3448838144,3448838399,CA +3448838400,3448987647,US +3448987648,3448989695,IN +3448989696,3448990719,HK +3448990720,3448991743,IN +3448991744,3449001245,US +3449001246,3449001246,MC +3449001247,3449098751,US +3449098752,3449099263,DE +3449099264,3449100287,US +3449100288,3449100799,HK +3449100800,3449101311,AU +3449101312,3449159679,US +3449159680,3449168639,CA +3449168640,3449168895,US +3449168896,3449169151,CA +3449169152,3449169663,US +3449169664,3449170431,CA +3449170432,3449170687,US +3449170688,3449171199,CA +3449171200,3449171711,US +3449171712,3449172991,CA +3449172992,3449173247,US +3449173248,3449173503,CA +3449173504,3449173759,US +3449173760,3449174783,CA +3449174784,3449175039,US +3449175040,3449175295,CA +3449175296,3449175551,US +3449175552,3449175807,CA +3449175808,3449176063,US +3449176064,3449178367,CA +3449178368,3449178623,US +3449178624,3449179903,CA +3449179904,3449180671,US +3449180672,3449181951,CA +3449181952,3449182015,US +3449182016,3449182031,CA +3449182032,3449182207,US +3449182208,3449186303,CA +3449186304,3449186559,US +3449186560,3449186815,CA +3449186816,3449187071,US +3449187072,3449187583,CA +3449187584,3449187839,US +3449187840,3449188095,CA +3449188096,3449188351,US +3449188352,3449188607,CA +3449188608,3449188671,US +3449188672,3449188703,CA +3449188704,3449188863,US +3449188864,3449189375,CA +3449189376,3449189887,US +3449189888,3449190655,CA +3449190656,3449190911,US +3449190912,3449191167,CA +3449191168,3449191423,US +3449191424,3449191679,CA +3449191680,3449192447,US +3449192448,3449195775,CA +3449195776,3449196031,US +3449196032,3449196287,CA +3449196288,3449198687,US +3449198688,3449198719,CA +3449198720,3449203711,US +3449203712,3449203775,CA +3449203776,3449204223,US +3449204224,3449204479,CA +3449204480,3449204735,US +3449204736,3449205759,CA +3449205760,3449208927,US +3449208928,3449208943,CA +3449208944,3449209343,US +3449209344,3449209599,CA +3449209600,3449210367,US +3449210368,3449212415,CA +3449212416,3449212671,US +3449212672,3449212927,CA +3449212928,3449213183,US +3449213184,3449213695,CA +3449213696,3449214975,US +3449214976,3449215487,CA +3449215488,3449215871,US +3449215872,3449215999,CA +3449216000,3449220607,US +3449220608,3449221375,CA +3449221376,3449222655,US +3449222656,3449224959,CA +3449224960,3449225471,US +3449225472,3449254143,CA +3449254144,3449254911,US +3449254912,3449273599,CA +3449273600,3449273855,US +3449273856,3449278975,CA +3449278976,3449279487,US +3449279488,3449290495,CA +3449290496,3449569279,US +3449569280,3449572068,AU +3449572069,3449572069,US +3449572070,3449573375,AU +3449573376,3449575423,US +3449575424,3449577471,AU +3449577472,3449598207,US +3449598208,3449598463,GB +3449598464,3449638911,US +3449638912,3449639167,GB +3449639168,3449639423,US +3449639424,3449639679,GB +3449639680,3449639935,US +3449639936,3449640191,GB +3449640192,3449640447,NL +3449640448,3449640959,GB +3449640960,3449641215,NL +3449641216,3449641471,GB +3449641472,3449769727,US +3449769728,3449769983,ZA +3449769984,3449823231,US +3449823232,3449824255,CO +3449824256,3449835519,US +3449835520,3449836543,ES +3449836544,3449843199,US +3449843200,3449843711,YE +3449843712,3449874687,US +3449874688,3449874943,AG +3449874944,3449923583,US +3449923584,3449923839,ES +3449923840,3449974783,US +3449974784,3449976831,CA +3449976832,3449994239,US +3449994240,3449994495,MX +3449994496,3449999375,US +3449999376,3449999376,MY +3449999377,3450078911,US +3450078912,3450078943,CN +3450078944,3450086143,US +3450086144,3450086655,CH +3450086656,3450088191,US +3450088192,3450088447,CH +3450088448,3450093055,US +3450093056,3450093311,CH +3450093312,3450217215,US +3450217216,3450217471,LC +3450217472,3450254079,US +3450254080,3450254335,CA +3450254336,3450272511,US +3450272512,3450272767,MX +3450272768,3450275327,US +3450275328,3450275583,GB +3450275584,3450275839,FR +3450275840,3450345279,US +3450345280,3450345287,AT +3450345288,3450345295,DE +3450345296,3450345303,CZ +3450345304,3450345335,US +3450345336,3450345343,CN +3450345344,3450345359,US +3450345360,3450345367,DE +3450345368,3450345407,US +3450345408,3450345415,IT +3450345416,3450345423,CZ +3450345424,3450345439,DE +3450345440,3450612479,US +3450612480,3450612735,CA +3450612736,3450632191,US +3450632192,3450634239,CA +3450634240,3450685183,US +3450685184,3450685439,CA +3450685440,3450699007,US +3450699008,3450699263,CA +3450699264,3450731519,US +3450731520,3450732543,CA +3450732544,3450773503,US +3450773504,3450777599,CA +3450777600,3450852351,US +3450852352,3450853375,CA +3450853376,3450986495,US +3450986496,3450986751,HK +3450986752,3451170303,US +3451170304,3451170559,VE +3451170560,3451187967,US +3451187968,3451188223,AU +3451188224,3451207423,US +3451207424,3451207679,CH +3451207680,3451236351,US +3451236352,3451236607,HU +3451236608,3451371519,US +3451371520,3451371775,GB +3451371776,3451503103,US +3451503104,3451503359,BR +3451503360,3451507199,US +3451507200,3451507711,BR +3451507712,3451715839,US +3451715840,3451724543,CA +3451724544,3451725311,US +3451725568,3451726847,CA +3451726848,3451727359,US +3451727360,3451737343,CA +3451737344,3451737599,US +3451737600,3451740927,CA +3451740928,3451741183,US +3451741184,3451741695,CA +3451741696,3451742207,US +3451742208,3451744255,CA +3451744256,3451745535,US +3451745536,3451749887,CA +3451749888,3451750143,US +3451750144,3451766783,CA +3451766784,3451767295,US +3451767296,3451767551,CA +3451767552,3451767807,US +3451767808,3451780863,CA +3451780864,3451783935,US +3451783936,3451784191,CA +3451784192,3451786751,US +3451786752,3451787007,CA +3451787008,3451788031,US +3451788032,3451788287,CA +3451788288,3451798783,US +3451798784,3451799039,CA +3451799040,3451800063,US +3451800064,3451800319,CA +3451800320,3451807231,US +3451807232,3451807487,CA +3451807488,3451808511,US +3451808512,3451808767,CA +3451808768,3451810815,US +3451810816,3451811327,CA +3451811328,3451821567,US +3451821568,3451821823,PR +3451821824,3451824127,US +3451824128,3451824383,CA +3451824384,3451827455,US +3451827456,3451827711,PR +3451827712,3451828991,US +3451828992,3451829247,CA +3451829248,3451835903,US +3451835904,3451836159,CA +3451836160,3451836927,US +3451836928,3451837183,CA +3451837184,3451837695,US +3451837696,3451837951,CA +3451837952,3451840255,US +3451840256,3451840767,CA +3451840768,3451879423,US +3451879424,3451879935,DE +3451879936,3451890431,US +3451890432,3451890687,AU +3451890688,3451896319,US +3451896320,3451896575,DE +3451896576,3451912191,US +3451912192,3452174335,CA +3452174336,3452436479,US +3452436480,3452502015,CA +3452502016,3452506111,HK +3452506112,3452516095,US +3452516096,3452516351,PL +3452516352,3452658431,US +3452658432,3452658687,HK +3452658688,3452715007,US +3452715008,3452723199,CA +3452723200,3452730623,US +3452730624,3452730879,HK +3452730880,3452764671,US +3452764672,3452765183,CA +3452765184,3452765439,US +3452765440,3452765951,CA +3452765952,3452766207,US +3452766208,3452766463,CA +3452766464,3452766975,US +3452766976,3452767487,CA +3452767488,3452767743,US +3452767744,3452767999,CA +3452768000,3452768607,US +3452768608,3452768639,CA +3452768640,3452769023,US +3452769024,3452769535,CA +3452769536,3452769791,US +3452769792,3452770047,CA +3452770048,3452770303,US +3452770304,3452770559,CA +3452770560,3452770815,US +3452770816,3452771071,CA +3452771072,3452771839,US +3452771840,3452773119,CA +3452773120,3452773375,US +3452773376,3452773887,CA +3452773888,3452774655,US +3452774656,3452774911,CA +3452774912,3452775167,US +3452775168,3452775935,CA +3452775936,3452776191,US +3452776192,3452776703,CA +3452776704,3452776959,US +3452776960,3452777471,CA +3452777472,3452777727,US +3452777728,3452779007,CA +3452779008,3452779263,US +3452779264,3452779519,CA +3452779520,3452780031,US +3452780032,3452780543,CA +3452780544,3452781055,US +3452781056,3452781567,CA +3452781568,3452781823,US +3452781824,3452782079,CA +3452782080,3452782335,US +3452782336,3452783359,CA +3452783360,3452783871,US +3452783872,3452784639,CA +3452784640,3452784895,US +3452784896,3452785151,CA +3452785152,3452785407,US +3452785408,3452785919,CA +3452785920,3452786175,US +3452786176,3452787455,CA +3452787456,3452787711,US +3452787712,3452789503,CA +3452789504,3452789759,US +3452789760,3452790271,CA +3452790272,3452791551,US +3452791552,3452793087,CA +3452793088,3452793343,US +3452793344,3452793599,CA +3452793600,3452793855,US +3452793856,3452795135,CA +3452795136,3452795391,US +3452795392,3452796159,CA +3452796160,3452796415,US +3452796416,3452797183,CA +3452797184,3452797439,US +3452797440,3452798719,CA +3452798720,3452798975,US +3452798976,3452799487,CA +3452799488,3452799743,US +3452799744,3452801535,CA +3452801536,3452801791,US +3452801792,3452802559,CA +3452802560,3452802815,US +3452802816,3452803327,CA +3452803328,3452803583,US +3452803584,3452806143,CA +3452806144,3452806911,US +3452806912,3452807167,CA +3452807168,3452807423,US +3452807424,3452807679,CA +3452807680,3452807935,US +3452807936,3452808191,CA +3452808192,3452808447,US +3452808448,3452809727,CA +3452809728,3452809983,US +3452809984,3452810239,CA +3452810240,3452811007,US +3452811008,3452811519,CA +3452811520,3452811775,US +3452811776,3452812287,CA +3452812288,3452812543,US +3452812544,3452813311,CA +3452813312,3452813567,US +3452813568,3452814079,CA +3452814080,3452814335,US +3452814336,3452815359,CA +3452815360,3452815615,US +3452815616,3452816127,CA +3452816128,3452816511,US +3452816512,3452816527,CA +3452816528,3452816895,US +3452816896,3452817663,CA +3452817664,3452817919,US +3452817920,3452818431,CA +3452818432,3452818687,US +3452818688,3452818943,CA +3452818944,3452819199,US +3452819200,3452819711,CA +3452819712,3452820479,US +3452820480,3452820735,CA +3452820736,3452820991,US +3452820992,3452821503,CA +3452821504,3452822271,US +3452822272,3452822527,CA +3452822528,3452822783,US +3452822784,3452823551,CA +3452823552,3452823807,US +3452823808,3452824063,CA +3452824064,3452824319,US +3452824320,3452824575,CA +3452824576,3452824831,US +3452824832,3452825599,CA +3452825600,3452825855,US +3452825856,3452827135,CA +3452827136,3452827391,US +3452827392,3452828927,CA +3452828928,3452829439,US +3452829440,3452895231,CA +3452895232,3452895487,US +3452895488,3452902399,CA +3452902400,3452902655,US +3452902656,3452912127,CA +3452912128,3452912383,US +3452912384,3452914175,CA +3452914176,3452914431,US +3452914432,3452919551,CA +3452919552,3452919807,US +3452919808,3452920831,CA +3452920832,3452923391,US +3452923392,3452931327,CA +3452931328,3452931583,US +3452931584,3452933119,CA +3452933120,3452933631,US +3452933632,3452934911,CA +3452934912,3452936191,US +3452936192,3452938751,CA +3452938752,3452939023,US +3452939024,3452939039,CA +3452939040,3452939263,US +3452939264,3452942847,CA +3452942848,3452943103,US +3452943104,3452953087,CA +3452953088,3452953343,US +3452953344,3452958207,CA +3452958208,3452958719,US +3452958720,3452960511,CA +3452960512,3453026559,US +3453026560,3453028095,CA +3453028096,3453028351,US +3453028352,3453029375,CA +3453029376,3453092095,US +3453092096,3453096959,CA +3453096960,3453097983,US +3453097984,3453101055,CA +3453101056,3453101311,US +3453101312,3453108223,CA +3453108224,3453109759,US +3453109760,3453123839,CA +3453123840,3453124095,US +3453124096,3453128959,CA +3453128960,3453129215,US +3453129216,3453129983,CA +3453129984,3453130239,US +3453130240,3453133823,CA +3453133824,3453134847,US +3453134848,3453139455,CA +3453139456,3453140991,US +3453140992,3453149183,CA +3453149184,3453149439,US +3453149440,3453151743,CA +3453151744,3453151999,US +3453152000,3453155327,CA +3453155328,3453155583,US +3453155584,3453157119,CA +3453157120,3453157631,US +3453157632,3453159423,CA +3453159424,3453159935,BM +3453159936,3453163519,CA +3453163520,3453164031,US +3453164032,3453180671,CA +3453180672,3453180927,US +3453180928,3453195263,CA +3453195264,3453195519,US +3453195520,3453206527,CA +3453206528,3453207551,HN +3453207552,3453207807,NI +3453207808,3453208575,HN +3453208576,3453208831,NI +3453208832,3453209599,HN +3453209600,3453209855,US +3453209856,3453210367,HN +3453210368,3453210623,SV +3453210624,3453213183,CR +3453213184,3453214719,HN +3453214720,3453215231,GT +3453215232,3453215999,SV +3453216000,3453217023,CR +3453217024,3453217791,SV +3453217792,3453219327,CR +3453219328,3453219583,US +3453219584,3453219839,SV +3453219840,3453220607,US +3453220608,3453222911,HN +3453222912,3453403135,US +3453403136,3453405951,BB +3453405952,3453406207,KN +3453406208,3453406463,TC +3453406464,3453406975,VC +3453406976,3453407231,GD +3453407232,3453407743,BB +3453407744,3453408255,GD +3453408256,3453409023,BB +3453409024,3453409535,KN +3453409536,3453411327,BB +3453411328,3453419519,US +3453419520,3453427711,MO +3453427712,3453551844,US +3453551845,3453551845,GB +3453551846,3453552127,US +3453552128,3453552383,GB +3453552384,3453552639,US +3453552640,3453552895,GB +3453552896,3453553151,US +3453553152,3453553407,GB +3453553408,3453554431,US +3453554432,3453554687,GB +3453554688,3453555967,US +3453555968,3453556031,GB +3453556032,3453599999,US +3453600000,3453600767,GB +3453600768,3453607935,US +3453607936,3453609983,KN +3453609984,3453610495,AG +3453610496,3453611263,KN +3453611264,3453611775,DM +3453611776,3453612031,KN +3453612032,3453612543,DM +3453612544,3453613055,KN +3453613056,3453614591,AG +3453614592,3453615103,DM +3453615104,3453615359,AG +3453615360,3453615615,KN +3453615616,3453616127,AG +3453616128,3454003013,US +3454003014,3454003014,ES +3454003015,3454004997,US +3454004998,3454004998,GB +3454004999,3454287871,US +3454287872,3454296063,GB +3454296064,3454304255,JP +3454304256,3454436351,US +3454436352,3454436607,GU +3454436608,3454497791,US +3454497792,3454498815,MX +3454498816,3454599423,US +3454599424,3454601215,CA +3454601216,3454603007,US +3454603008,3454603519,CA +3454603520,3454604031,US +3454604032,3454604799,CA +3454604800,3454607359,US +3454607360,3454608127,CA +3454608128,3454608383,US +3454608384,3454609151,CA +3454609152,3454611455,US +3454611456,3454617343,CA +3454617344,3454617599,US +3454617600,3454617855,CA +3454617856,3454618111,US +3454618112,3454618367,CA +3454618368,3454618623,US +3454618624,3454619647,DO +3454619648,3454631423,CA +3454631424,3454631935,US +3454631936,3454634751,CA +3454634752,3454636031,US +3454636032,3454636799,CA +3454636800,3454637055,US +3454637056,3454652159,CA +3454652160,3454652415,US +3454652416,3454661631,CA +3454661632,3454662655,US +3454662656,3454664447,CA +3454664448,3454668799,US +3454668800,3454669567,CA +3454669568,3454669823,US +3454669824,3454670847,CA +3454670848,3454672895,US +3454672896,3454681087,CA +3454681088,3454694143,US +3454694144,3454694399,CA +3454694400,3454718767,US +3454718768,3454718775,EG +3454718776,3454721183,US +3454721184,3454721191,EG +3454721192,3454727935,US +3454727936,3454728191,JP +3454728192,3454730239,US +3454730240,3454732287,EC +3454732288,3454796031,US +3454796032,3454808831,CA +3454808832,3454809087,US +3454809088,3454810111,CA +3454810112,3454810367,US +3454810368,3454813951,CA +3454813952,3454814207,US +3454814208,3454814975,CA +3454814976,3454815231,US +3454815232,3454815743,CA +3454815744,3454816255,US +3454816256,3454816511,CA +3454816512,3454816767,US +3454816768,3454828287,CA +3454828288,3454828543,US +3454828544,3454861055,CA +3454861056,3454861567,US +3454861568,3454867711,CA +3454867712,3454867967,US +3454867968,3454881535,CA +3454881536,3454881791,US +3454881792,3454883839,CA +3454883840,3454915071,US +3454915072,3454926847,CA +3454926848,3455017471,US +3455017472,3455017983,GB +3455017984,3455035391,US +3455035392,3455035903,AU +3455035904,3455109119,US +3455109120,3455111167,HN +3455111168,3455115263,SR +3455115264,3455126527,US +3455126528,3455126783,MX +3455126784,3455132159,US +3455132160,3455133695,BO +3455133696,3455320063,US +3455320064,3455322111,FR +3455322112,3455330815,US +3455330816,3455331327,ES +3455331328,3455357951,US +3455357952,3455358975,BB +3455358976,3455359231,US +3455359232,3455359487,ES +3455359488,3455418367,US +3455418368,3455418879,KY +3455418880,3455453439,US +3455453440,3455453695,HT +3455453696,3455488103,US +3455488104,3455488111,CA +3455488112,3455582207,US +3455582208,3455583743,SG +3455583744,3455584255,NL +3455584256,3455584767,GB +3455584768,3455588351,US +3455588352,3455588863,BE +3455588864,3455589119,FR +3455589120,3455589375,US +3455589376,3455589631,BE +3455589632,3455592191,US +3455592192,3455592447,IE +3455592448,3455592703,KR +3455592704,3455594239,US +3455594240,3455594495,DE +3455594496,3455594751,TW +3455594752,3455595519,US +3455595520,3455595775,KR +3455595776,3455596031,FR +3455596032,3455596543,CH +3455596544,3455596799,NL +3455596800,3455597311,US +3455597312,3455597567,FR +3455597568,3455598847,US +3455598848,3455599103,NO +3455599104,3455599359,US +3455599360,3455599615,MX +3455599616,3455600127,TW +3455600128,3455600639,GB +3455600640,3455600895,US +3455600896,3455601151,GB +3455601152,3455601407,US +3455601408,3455601919,GB +3455601920,3455602175,US +3455602176,3455602687,GB +3455602688,3455616511,US +3455616512,3455616767,CA +3455616768,3455617279,US +3455617280,3455619071,GB +3455619072,3455619263,US +3455619264,3455619327,AR +3455619328,3455619839,US +3455619840,3455620095,GB +3455620096,3455620287,US +3455620288,3455620351,VE +3455620352,3455621631,US +3455621632,3455622143,GB +3455622144,3455624191,US +3455624192,3455624447,FR +3455624448,3455627519,US +3455627520,3455628287,DK +3455628288,3455628543,BE +3455628544,3455628799,CA +3455628800,3455630847,GB +3455630848,3455631103,US +3455631104,3455631359,GB +3455631360,3455632639,ES +3455632640,3455632895,US +3455632896,3455633407,GB +3455633408,3455634431,US +3455634432,3455635455,DE +3455635456,3455635711,US +3455635712,3455635967,FR +3455635968,3455636223,DE +3455636224,3455636479,CA +3455636480,3455637759,US +3455637760,3455638271,GB +3455638272,3455638527,BE +3455638528,3455639551,US +3455639552,3455639807,IT +3455639808,3455640063,US +3455640064,3455640319,CA +3455640320,3455640575,GB +3455640576,3455640831,US +3455640832,3455641087,GB +3455641088,3455641343,NL +3455641344,3455641599,GB +3455641600,3455642879,US +3455642880,3455643135,FR +3455643136,3455644159,US +3455644160,3455644415,HK +3455644416,3455644927,US +3455644928,3455645439,GB +3455645440,3455645695,JP +3455645696,3455645951,BE +3455645952,3455646719,FR +3455646720,3455646975,SE +3455646976,3455647231,GB +3455647232,3455647487,HK +3455647488,3455647743,IT +3455647744,3455713279,US +3455713280,3455778815,CA +3455778816,3455802623,US +3455802624,3455802879,EG +3455802880,3455848927,US +3455848928,3455848959,TW +3455848960,3455871999,US +3455872000,3455872255,ZM +3455872256,3455899969,US +3455899970,3455899970,HK +3455899971,3455903967,US +3455903968,3455903983,HK +3455903984,3455905791,US +3455905792,3455906047,MX +3455906048,3455909887,US +3455909888,3455975423,IN +3455975424,3456303103,US +3456303104,3456311295,JP +3456311296,3456360447,US +3456360448,3456364543,BG +3456364544,3456892927,US +3456892928,3456958463,CA +3456958464,3457551871,US +3457551872,3457552127,CA +3457552128,3457553407,US +3457553408,3457553663,CA +3457553664,3457554175,US +3457554176,3457554431,CA +3457554432,3457555711,US +3457555712,3457555967,CA +3457555968,3457564927,US +3457564928,3457565183,CA +3457565184,3457575167,US +3457575168,3457575423,CA +3457575424,3457577727,US +3457577728,3457578239,CA +3457578240,3457580543,US +3457580544,3457580799,CA +3457580800,3457582591,US +3457582592,3457582847,CA +3457582848,3457592319,US +3457592320,3457592575,CA +3457592576,3457595391,US +3457595392,3457595903,CA +3457595904,3457596671,US +3457596672,3457597695,CA +3457597696,3457598207,US +3457598208,3457598463,CA +3457598464,3457600511,US +3457600512,3457600767,CA +3457600768,3457683967,US +3457683968,3457684479,CA +3457684480,3457684735,US +3457684736,3457684991,CA +3457684992,3457756351,US +3457756352,3457756383,GB +3457756384,3457762559,US +3457762560,3457762687,CA +3457762688,3457859839,US +3457859840,3457860095,CA +3457860096,3457892351,US +3457892352,3457892607,IN +3457892608,3458039807,US +3458039808,3458043903,CA +3458043904,3458195455,US +3458195456,3458196479,SG +3458196480,3458233343,US +3458233344,3458234367,CA +3458234368,3458813951,US +3458813952,3458818047,CA +3458818048,3458820095,US +3458820096,3458820351,CA +3458820352,3458820863,US +3458820864,3458821119,JM +3458821120,3458821887,US +3458821888,3458822143,CA +3458822144,3459055615,US +3459055616,3459121151,CA +3459121152,3459186687,US +3459186688,3459230975,CA +3459230976,3459231231,US +3459231232,3459252223,CA +3459252224,3459256831,US +3459256832,3459257087,CO +3459257088,3459257343,US +3459257344,3459258367,AW +3459258368,3459259391,CL +3459259392,3459264767,US +3459264768,3459265023,VE +3459265024,3459266559,US +3459266560,3459267327,AG +3459267328,3459267583,AI +3459267584,3459267839,AG +3459267840,3459268095,DM +3459268096,3459268607,AG +3459268608,3459273727,US +3459273728,3459274751,CL +3459274752,3459277823,US +3459277824,3459278847,AW +3459278848,3459285503,US +3459285504,3459286271,CL +3459286272,3459287807,US +3459287808,3459288063,CL +3459288064,3459290111,US +3459290112,3459290623,CL +3459290624,3459295231,US +3459295232,3459296255,KR +3459296256,3459310591,US +3459310592,3459310847,KY +3459310848,3459312639,US +3459312640,3459312671,MX +3459312672,3459312767,US +3459312768,3459312895,MX +3459312896,3459325951,US +3459325952,3459326207,VE +3459326208,3459326463,SZ +3459326464,3459327487,CA +3459327488,3459327999,CO +3459328000,3459329023,CL +3459329024,3459330047,VE +3459330048,3459334399,US +3459334400,3459334655,CA +3459334656,3459335423,US +3459335424,3459335679,VE +3459335680,3459335935,DO +3459335936,3459336191,VE +3459336192,3459336447,MX +3459336448,3459336703,US +3459336704,3459336959,LK +3459336960,3459337215,AW +3459337216,3459337471,CO +3459337472,3459337727,VE +3459337728,3459337983,MX +3459337984,3459338239,US +3459338240,3459338495,SV +3459338496,3459339263,PH +3459339264,3459339519,ID +3459339520,3459339775,US +3459339776,3459340031,ID +3459340032,3459340287,VE +3459340288,3459340543,MX +3459340544,3459340799,FM +3459340800,3459341055,SK +3459341056,3459341311,MX +3459341312,3459341567,TW +3459341568,3459341823,US +3459341824,3459342079,IL +3459342080,3459342335,LK +3459342336,3459342591,VE +3459342592,3459342847,BY +3459342848,3459343103,VE +3459343104,3459343359,BR +3459343360,3459343615,CA +3459343616,3459344127,OM +3459344128,3459346431,US +3459346432,3459346687,LK +3459346688,3459346943,US +3459346944,3459347455,PR +3459347456,3459347711,US +3459347712,3459348223,PR +3459348224,3459348479,AG +3459348480,3459348735,CO +3459348736,3459348991,BW +3459348992,3459349503,IT +3459349504,3459350527,US +3459350528,3459352575,VE +3459352576,3459352831,US +3459352832,3459353087,FM +3459353088,3459353343,US +3459353344,3459354623,CO +3459354624,3459357183,NI +3459357184,3459357439,VE +3459357440,3459357695,HT +3459357696,3459357951,SV +3459357952,3459358207,TG +3459358208,3459358719,PR +3459358720,3459358975,VE +3459358976,3459359999,US +3459360000,3459360511,VE +3459360512,3459362815,US +3459362816,3459364863,CO +3459364864,3459366911,AR +3459366912,3459367167,VE +3459367168,3459367423,US +3459367424,3459368703,VE +3459368704,3459368959,US +3459368960,3459371007,MX +3459371008,3459373055,PE +3459373056,3459373311,US +3459373312,3459375103,CL +3459375104,3459376127,VE +3459376128,3459448831,US +3459448832,3459449087,PR +3459449088,3459450623,CA +3459450624,3459450879,US +3459450880,3459456511,CA +3459456512,3459456767,US +3459456768,3459457279,CA +3459457280,3459457535,US +3459457536,3459457791,CA +3459457792,3459512319,US +3459512320,3459513855,CA +3459513856,3459592191,US +3459592192,3459596287,CA +3459596288,3459615231,US +3459615232,3459615487,GB +3459615488,3459615743,US +3459615744,3459615999,CA +3459616000,3459616255,DM +3459616256,3459616767,US +3459616768,3459617999,CA +3459618000,3459618000,ID +3459618001,3459620863,CA +3459620864,3459624959,US +3459624960,3459629055,BM +3459629056,3459686399,US +3459686400,3459689471,NL +3459689472,3459690239,US +3459690240,3459690751,NL +3459690752,3459691007,US +3459691008,3459691519,NL +3459691520,3459691775,US +3459691776,3459692543,NL +3459692544,3459731455,US +3459731456,3459735551,CA +3459735552,3459745535,US +3459745536,3459745791,IT +3459745792,3459848959,US +3459848960,3459849215,FR +3459849216,3459873311,US +3459873312,3459873327,MX +3459873328,3460104703,US +3460104704,3460105215,MX +3460105216,3460111971,US +3460111972,3460111972,MX +3460111973,3460114431,US +3460114432,3460116479,SR +3460116480,3460161535,US +3460161536,3460165631,PR +3460165632,3460374527,US +3460374528,3460375551,MX +3460375552,3460453631,US +3460453632,3460453887,BS +3460453888,3460507647,US +3460507648,3460507903,MX +3460507904,3460762367,US +3460762368,3460762623,CA +3460762624,3460763391,US +3460763392,3460763647,VG +3460763648,3460794623,US +3460794624,3460794879,CA +3460794880,3460878335,US +3460878336,3460878591,CA +3460878592,3460880383,US +3460882432,3460893439,US +3460893440,3460893695,IT +3460893696,3460894463,US +3460894464,3460894719,JP +3460894720,3460895231,US +3460895232,3460895487,BE +3460895488,3460896255,US +3460896256,3460896511,ZA +3460896512,3460896767,ES +3460896768,3460897023,FR +3460897024,3460897279,GB +3460897280,3460899327,US +3460899328,3460899583,ZA +3460899584,3460901375,US +3460901376,3460901631,SE +3460901632,3460907263,US +3460907264,3460907519,SG +3460907520,3460908287,US +3460908288,3460908543,FI +3460908544,3460908799,US +3460908800,3460910335,IE +3460910336,3460910591,US +3460910592,3460910847,IE +3460910848,3460912127,US +3460912128,3460912383,IT +3460912384,3460912639,FR +3460912640,3460912895,ES +3460912896,3460916223,US +3460916224,3460916479,CH +3460916480,3460916735,GB +3460916736,3460916991,AR +3460916992,3460917759,US +3460917760,3460918015,CA +3460918016,3460918271,US +3460918272,3460918527,NL +3460918528,3460918783,US +3460918784,3460919039,JP +3460919040,3460919295,NL +3460919296,3460920319,US +3460920320,3460920575,IT +3460920576,3460920831,BE +3460920832,3460921343,US +3460921344,3460921599,DE +3460921600,3460921855,AU +3460921856,3460924671,US +3460924672,3460925183,GB +3460925184,3460925695,US +3460925696,3460925951,ES +3460925952,3460926207,US +3460926208,3460926463,GB +3460926464,3460926719,US +3460926720,3460926975,DE +3460926976,3460927231,US +3460927232,3460929023,BE +3460929024,3460929279,US +3460929280,3460929535,DE +3460929536,3460929791,GB +3460929792,3460930047,DK +3460930048,3460931583,US +3460931584,3460931839,SE +3460931840,3460932095,DE +3460932096,3460932351,GB +3460932352,3460932607,FR +3460932608,3460932863,US +3460932864,3460933119,GB +3460933120,3460933887,US +3460933888,3460934143,DE +3460934144,3460934911,US +3460934912,3460935167,SG +3460935168,3460935679,US +3460935680,3460935935,FI +3460935936,3460936191,FR +3460936192,3460936447,US +3460936448,3460936703,GB +3460936704,3460936959,IT +3460936960,3460937215,DE +3460937216,3460937471,FR +3460937472,3460937727,US +3460937728,3460937983,DK +3460937984,3460938239,IE +3460938240,3460938495,DE +3460938496,3460939263,US +3460939264,3460939519,HK +3460939520,3460941567,US +3460941568,3460941823,AU +3460941824,3460942079,US +3460942080,3460942335,GB +3460942336,3460943359,US +3460943360,3460943615,ID +3460943616,3460943871,HK +3460943872,3460944895,US +3460944896,3460945151,DE +3460945152,3460945663,US +3460945664,3460945919,GB +3460945920,3460946687,US +3460946688,3460946943,DE +3460946944,3460947455,US +3460947456,3460947711,DE +3460947712,3460947967,SE +3460947968,3460950271,US +3460950272,3460950527,DE +3460950528,3460951295,US +3460951296,3460951551,GB +3460951552,3460952319,US +3460952320,3460952575,GB +3460952576,3460952831,ES +3460952832,3460953855,US +3460953856,3460954111,GB +3460954112,3460954623,US +3460954624,3460954879,DE +3460954880,3460955135,LU +3460955136,3461021695,US +3461021696,3461031935,CA +3461031936,3461032191,US +3461032192,3461087231,CA +3461087232,3461330943,US +3461330944,3461331199,SG +3461331200,3461331711,US +3461331712,3461331967,SG +3461331968,3461332223,US +3461332224,3461332479,SG +3461332480,3461332735,US +3461332736,3461332991,SG +3461332992,3461356543,US +3461356544,3461357567,AS +3461357568,3461409023,US +3461410816,3461414911,CA +3461414912,3461462015,US +3461462016,3461462271,AU +3461462272,3461462527,NL +3461462528,3461462783,US +3461462784,3461463039,SG +3461463040,3461513727,US +3461513728,3461513983,BF +3461513984,3461514495,US +3461514496,3461514751,QA +3461514752,3461515775,US +3461515776,3461516031,CA +3461516032,3461516287,US +3461516288,3461516543,IL +3461516544,3461808127,US +3461808128,3461873663,CA +3461873664,3461897727,US +3461897728,3461897983,CA +3461897984,3461905407,US +3461905408,3461905663,CA +3461905664,3461940735,US +3461940736,3461940991,CA +3461940992,3461948159,US +3461948160,3461948415,CA +3461948416,3461948927,US +3461948928,3461949183,CA +3461949184,3461949695,US +3461949696,3461950207,CA +3461950208,3461950719,US +3461950720,3461951231,CA +3461951232,3461953535,US +3461953536,3461953791,CA +3461953792,3461968127,US +3461968128,3461968383,CA +3461968384,3461970431,US +3461970432,3461970687,CA +3461970688,3461972223,US +3461972224,3461972479,CA +3461972480,3461977855,US +3461977856,3461978111,CA +3461978112,3461992703,US +3461992704,3461992959,CA +3461992960,3461999871,US +3461999872,3462000127,PR +3462000128,3462000895,US +3462000896,3462001151,CA +3462001152,3462001919,US +3462001920,3462002431,CA +3462002432,3462148607,US +3462148608,3462148863,CA +3462148864,3462160895,US +3462160896,3462161151,PR +3462161152,3462163967,US +3462163968,3462164223,CA +3462164224,3462168319,US +3462168320,3462168575,CA +3462168576,3462169599,US +3462169600,3462169855,CA +3462169856,3462170623,US +3462170624,3462171135,CA +3462171136,3462171391,US +3462171392,3462171647,CA +3462171648,3462173695,US +3462173696,3462173951,CA +3462173952,3462174463,US +3462174464,3462174719,CA +3462174720,3462179839,US +3462179840,3462180095,CA +3462180096,3462181375,US +3462181376,3462181887,CA +3462181888,3462191871,US +3462191872,3462192127,PR +3462192128,3462194175,US +3462194176,3462194431,CA +3462194432,3462231039,US +3462231040,3462231295,CA +3462231296,3462231807,US +3462231808,3462232063,CA +3462232064,3462268415,US +3462268416,3462268671,CA +3462268672,3462290175,US +3462290176,3462290431,CA +3462290432,3462314239,US +3462314240,3462314495,CA +3462314496,3462321407,US +3462321408,3462321663,CA +3462321664,3462321919,US +3462321920,3462322175,CA +3462322176,3462323711,US +3462323712,3462323967,CA +3462323968,3462339071,US +3462339072,3462339583,CA +3462339584,3462340607,US +3462340608,3462340863,CA +3462340864,3462350847,US +3462350848,3462351103,CA +3462351104,3462593791,US +3462593792,3462594559,GN +3462594560,3462633471,US +3462633472,3462633727,SG +3462633728,3462633823,US +3462633824,3462633855,SG +3462633856,3462633983,US +3462633984,3462634239,SG +3462634240,3462634751,US +3462634752,3462635007,SG +3462635008,3462635263,US +3462635264,3462635519,SG +3462635520,3462660295,US +3462660296,3462660303,SG +3462660304,3462660327,US +3462660328,3462660335,SG +3462660336,3462661375,US +3462661376,3462661631,SG +3462661632,3463004159,US +3463004160,3463006207,CO +3463006208,3463043071,US +3463043072,3463044095,ES +3463044096,3463089151,US +3463089152,3463090175,CA +3463090176,3463116799,US +3463116800,3463118847,CO +3463118848,3463156735,US +3463156736,3463157759,BO +3463157760,3463176447,US +3463176448,3463176703,CW +3463176704,3463184383,US +3463184384,3463194623,CA +3463194624,3463198719,US +3463198720,3463213311,CA +3463213312,3463215103,US +3463215104,3463243775,CA +3463243776,3463245055,US +3463245056,3463249663,CA +3463249664,3463518207,US +3463518208,3463520255,NL +3463520256,3463708671,US +3463708672,3463774207,CA +3463774208,3464108031,US +3464108032,3464108287,DE +3464108288,3464127999,US +3464128000,3464128255,DE +3464128256,3464129535,US +3464129536,3464130047,DE +3464130048,3464167679,US +3464167680,3464169215,CA +3464169216,3464169471,US +3464169472,3464171775,CA +3464171776,3464172031,US +3464172032,3464173567,CA +3464173568,3464173823,US +3464173824,3464175103,CA +3464175104,3464175359,US +3464175360,3464180735,CA +3464180736,3464200703,US +3464200704,3464200959,AU +3464200960,3464202239,US +3464202240,3464202495,CA +3464202496,3464203007,US +3464203008,3464203263,RU +3464203264,3464203519,DE +3464203520,3464204799,US +3464204800,3464205055,DK +3464205056,3464205311,NL +3464205312,3464205567,SE +3464205568,3464205823,US +3464205824,3464205951,AF +3464205952,3464206079,UZ +3464206080,3464206207,TJ +3464206208,3464206335,KG +3464206336,3464206463,KZ +3464206464,3464206591,TM +3464206592,3464206719,LA +3464206720,3464206847,MN +3464206848,3464206975,LK +3464206976,3464207103,BD +3464207104,3464207231,MM +3464207232,3464207359,PG +3464207360,3464207487,TZ +3464207488,3464207615,MG +3464207616,3464207743,AO +3464207744,3464207871,NE +3464207872,3464207999,MR +3464208000,3464208127,SN +3464208128,3464208255,TN +3464208256,3464208383,DZ +3464208384,3464216575,CA +3464216576,3464261631,US +3464261632,3464265727,CA +3464265728,3464340479,US +3464340480,3464341503,CA +3464341504,3464342287,US +3464342288,3464342295,VN +3464342296,3464349695,US +3464349696,3464351743,CA +3464351744,3464384511,US +3464384512,3464388607,CA +3464388608,3464391935,US +3464391936,3464392191,CA +3464392192,3464392703,US +3464392704,3464392959,CA +3464392960,3464394751,US +3464394752,3464396799,LC +3464396800,3464421631,US +3464421632,3464421887,CA +3464421888,3464426495,US +3464426496,3464426751,GD +3464426752,3464429311,US +3464429312,3464429567,CA +3464429568,3464551663,US +3464551664,3464551671,SG +3464551672,3464551679,US +3464551680,3464551711,SG +3464551712,3464626175,US +3464626432,3464626687,CA +3464626688,3464627967,US +3464627968,3464628735,CA +3464628736,3464628991,US +3464628992,3464630271,CA +3464630272,3464631295,US +3464631296,3464639487,CA +3464639488,3464639743,US +3464639744,3464642047,CA +3464642048,3464642559,US +3464642560,3464642815,CA +3464642816,3464643071,US +3464643072,3464647935,CA +3464647936,3464648191,US +3464648192,3464648703,CA +3464648704,3464649215,US +3464649216,3464650239,CA +3464650240,3464664319,US +3464664320,3464684543,CA +3464684544,3464684799,BL +3464684800,3464688383,CA +3464688384,3464688639,US +3464688640,3464691711,CA +3464691712,3464740863,US +3464740864,3464744959,PH +3464744960,3464769535,US +3464769536,3464773631,CA +3464773632,3464781823,US +3464781824,3464782335,GB +3464782336,3464783871,US +3464783872,3464785919,AR +3464785920,3464802303,US +3464802304,3464806399,CA +3464806400,3465154559,US +3465154560,3465158655,BS +3465158656,3465177087,US +3465177088,3465179135,PE +3465179136,3465412607,US +3465412608,3465412863,HK +3465412864,3465462783,US +3465462784,3465463039,GB +3465463040,3465466495,US +3465466496,3465466527,GB +3465466528,3465470207,US +3465470208,3465470463,GB +3465470464,3465474047,US +3465474048,3465476095,GB +3465476096,3465510911,US +3465510912,3465543679,JP +3465543680,3465962495,US +3465962496,3465962751,CA +3465962752,3466067967,US +3466067968,3466068223,CA +3466068224,3466069055,US +3466069056,3466069087,CA +3466069088,3466069343,US +3466069344,3466069375,CA +3466069376,3466069447,US +3466069448,3466069455,CA +3466069456,3466071807,US +3466071808,3466072063,CA +3466072064,3466072431,US +3466072432,3466072439,CA +3466072440,3466072775,US +3466072776,3466072783,CA +3466072784,3466073055,US +3466073056,3466073087,CA +3466073088,3466074367,US +3466074368,3466074623,CA +3466074624,3466080191,US +3466080192,3466080199,CA +3466080200,3466080255,US +3466080256,3466084351,CA +3466084352,3466158079,US +3466158080,3466166271,PA +3466166272,3466290687,US +3466290688,3466290943,CH +3466290944,3466296575,US +3466296576,3466296831,GB +3466296832,3466489855,US +3466489856,3466490111,CA +3466490112,3466564744,US +3466564745,3466564745,BH +3466564746,3466756095,US +3466756096,3466772479,CA +3466772480,3466846207,US +3466846208,3466854399,CA +3466854400,3466860799,US +3466860800,3466861311,FR +3466861312,3466901503,US +3466901504,3466903551,DE +3466903552,3466907647,US +3466907648,3466909695,DE +3466909696,3466914303,US +3466914304,3466914559,FR +3466914560,3466926551,US +3466926552,3466926559,IT +3466926560,3466929407,US +3466929408,3466929663,IT +3466929664,3466937663,US +3466937664,3466937669,DE +3466937670,3466937670,US +3466937671,3466937727,DE +3466937728,3466938807,US +3466938808,3466938811,GB +3466938812,3466958079,US +3466958080,3466958335,CA +3466958336,3466965503,US +3466965504,3466965759,NL +3466965760,3467051007,US +3467051008,3467051263,CA +3467051264,3467051519,US +3467051520,3467056639,CA +3467056640,3467056895,US +3467056896,3467063295,CA +3467063296,3467063551,US +3467063552,3467068927,CA +3467068928,3467069439,US +3467069440,3467116543,CA +3467116544,3467229695,US +3467229696,3467229951,AS +3467229952,3467378687,US +3467378688,3467444223,CA +3467444224,3467554815,US +3467554816,3467567103,CA +3467567104,3467619935,US +3467619936,3467619967,CA +3467619968,3467706367,US +3467706368,3467902975,CA +3467902976,3467964415,US +3467964416,3467968511,CA +3467968512,3468034047,US +3468034048,3468036095,GB +3468036096,3468036351,BE +3468036352,3468036607,DE +3468036608,3468036863,ES +3468036864,3468037375,DE +3468037376,3468037887,US +3468037888,3468038143,IE +3468038144,3468038655,FR +3468038656,3468038911,NL +3468038912,3468039167,SE +3468039168,3468039423,FR +3468039424,3468041215,US +3468041216,3468041471,FI +3468041472,3468041727,US +3468041728,3468041983,TW +3468041984,3468042367,US +3468042368,3468042431,IT +3468042432,3468042495,US +3468042496,3468042751,AT +3468042752,3468043135,US +3468043136,3468043263,DK +3468043264,3468044799,US +3468044800,3468044927,GB +3468044928,3468045055,DK +3468045056,3468045311,DE +3468045312,3468045695,US +3468045696,3468045823,ZA +3468045824,3468046079,NO +3468046080,3468046335,ZA +3468046336,3468046591,FR +3468046592,3468046719,US +3468046720,3468046847,DE +3468046848,3468047103,IT +3468047104,3468047359,US +3468047360,3468047615,DE +3468047616,3468047743,US +3468047744,3468047807,LU +3468047808,3468047871,US +3468047872,3468047887,ES +3468047888,3468047999,US +3468048000,3468048127,DE +3468048128,3468048383,US +3468048384,3468048639,FR +3468048640,3468049407,US +3468049408,3468049663,GB +3468049664,3468049919,US +3468049920,3468050175,IT +3468050176,3468050431,US +3468050432,3468050687,SE +3468050688,3468050943,US +3468050944,3468051007,IT +3468051008,3468051231,US +3468051232,3468051263,DK +3468051264,3468051327,AT +3468051328,3468052479,US +3468052480,3468052735,ES +3468052736,3468052991,GB +3468052992,3468053759,US +3468053760,3468054015,CH +3468054016,3468054271,DE +3468054272,3468055551,US +3468055552,3468055807,IT +3468055808,3468056575,US +3468056576,3468056831,NO +3468056832,3468056959,DK +3468056960,3468057023,IN +3468057024,3468057087,US +3468057088,3468057215,LU +3468057216,3468057375,GB +3468057376,3468057599,US +3468057600,3468057855,IL +3468057856,3468058111,US +3468058112,3468058175,BE +3468058176,3468058239,CH +3468058240,3468058367,GB +3468058368,3468058368,US +3468058369,3468058432,IT +3468058433,3468058559,US +3468058560,3468058623,SG +3468058624,3468058687,US +3468058688,3468058719,ES +3468058720,3468059647,US +3468059648,3468059903,FR +3468059904,3468060159,DE +3468060160,3468060671,FR +3468060672,3468060927,US +3468060928,3468060991,FR +3468060992,3468061119,US +3468061120,3468061183,CH +3468061184,3468061695,US +3468061696,3468061951,JP +3468061952,3468062079,US +3468062080,3468062143,GB +3468062144,3468062335,US +3468062336,3468062399,TW +3468062400,3468062463,DE +3468062464,3468062719,AT +3468062720,3468063231,NL +3468063232,3468063359,US +3468063360,3468063423,RO +3468063424,3468063487,US +3468063488,3468063743,BE +3468063744,3468063999,US +3468064000,3468064255,HK +3468064256,3468064511,US +3468064512,3468064527,BE +3468064528,3468064543,US +3468064544,3468064575,NO +3468064576,3468064639,US +3468064640,3468064703,LU +3468064704,3468064735,US +3468064736,3468064767,CH +3468064768,3468065023,DE +3468065024,3468065279,US +3468065280,3468065535,DE +3468065536,3468065791,US +3468065792,3468065919,IT +3468065920,3468065951,GB +3468065952,3468065983,LU +3468065984,3468065999,CZ +3468066000,3468066015,BE +3468066016,3468066047,DE +3468066048,3468066239,US +3468066240,3468066271,IE +3468066272,3468066319,US +3468066320,3468066327,FR +3468066328,3468066463,US +3468066464,3468066495,SE +3468066496,3468066527,CH +3468066528,3468066559,US +3468066560,3468066623,IT +3468066624,3468068095,US +3468068096,3468068351,MC +3468068352,3468068863,US +3468068864,3468069631,CA +3468069632,3468081407,US +3468081408,3468081663,DE +3468081664,3468081919,AT +3468081920,3468082431,US +3468082432,3468082687,NO +3468082688,3468083967,US +3468083968,3468084223,AU +3468084224,3468084735,US +3468084736,3468084991,SG +3468084992,3468085759,US +3468085760,3468086015,ID +3468086016,3468087807,US +3468087808,3468088063,SG +3468088064,3468091391,US +3468091392,3468091647,NL +3468091648,3468093695,US +3468093696,3468093951,DE +3468093952,3468095231,US +3468095232,3468095487,SE +3468095488,3468096511,US +3468096512,3468096767,NO +3468096768,3468099327,US +3468099328,3468099583,FR +3468099584,3468127743,US +3468127744,3468128255,IN +3468128256,3468296191,US +3468296192,3468361727,CA +3468361728,3468367871,US +3468367872,3468368895,CA +3468368896,3468443647,US +3468443648,3468460031,CA +3468460032,3468468223,BM +3468468224,3468545791,US +3468545792,3468546047,SG +3468546048,3468597759,US +3468597760,3468598391,SG +3468598392,3468598399,NL +3468598400,3468599039,SG +3468599040,3468599295,HK +3468599296,3468613631,US +3468613632,3468614655,PR +3468614656,3468619007,US +3468619008,3468619263,CA +3468619264,3468623871,US +3468623872,3468656639,CA +3468656640,3468658175,US +3468658176,3468658431,KY +3468658432,3468682159,US +3468682160,3468682175,SG +3468682176,3468682191,US +3468682192,3468682207,SG +3468682208,3468682415,US +3468682416,3468682495,SG +3468682496,3468682559,HK +3468682560,3468682575,US +3468682576,3468682591,HK +3468682592,3468682671,SG +3468682672,3468682735,HK +3468682736,3468682751,US +3468682752,3468682911,HK +3468682912,3468682927,US +3468682928,3468683103,HK +3468683104,3468683279,US +3468683280,3468683311,HK +3468683312,3468685311,US +3468685312,3468685663,IE +3468685664,3468685791,NL +3468685792,3468685807,US +3468685808,3468685823,NL +3468685824,3468687087,US +3468687088,3468687263,NL +3468687264,3468687455,US +3468687456,3468687631,IE +3468687632,3468687983,NL +3468687984,3468688159,IE +3468688160,3468688255,US +3468688256,3468688271,IE +3468688272,3468688303,NL +3468688304,3468688335,IE +3468688336,3468688367,NL +3468688368,3468688399,IE +3468688400,3468688431,NL +3468688432,3468688463,IE +3468688464,3468688495,NL +3468688496,3468688527,IE +3468688528,3468688559,NL +3468688560,3468688591,IE +3468688592,3468688623,NL +3468688624,3468688655,IE +3468688656,3468688687,NL +3468688688,3468688719,IE +3468688720,3468688751,NL +3468688752,3468688783,IE +3468688784,3468688815,NL +3468688816,3468688847,IE +3468688848,3468688879,NL +3468688880,3468688911,IE +3468688912,3468688943,NL +3468688944,3468688959,IE +3468688960,3468802303,US +3468802304,3468802559,CA +3468802560,3468894207,US +3468894208,3468902399,DE +3468902400,3469055743,US +3469055744,3469055999,CA +3469056000,3469070335,US +3469070336,3469070591,CA +3469070592,3469176319,US +3469176320,3469176575,MX +3469176576,3469186303,US +3469186304,3469186559,MX +3469186560,3469893631,US +3469893632,3469901823,CA +3469901824,3469989887,US +3469989888,3469990399,CA +3469990400,3470131199,US +3470131200,3470135295,AG +3470135296,3470136319,LC +3470136320,3470137343,AG +3470137344,3470139391,VG +3470139392,3470153727,US +3470153728,3470153983,IN +3470153984,3470192639,US +3470192640,3470194927,CA +3470194928,3470194935,US +3470194936,3470196735,CA +3470196736,3470453247,US +3470453248,3470453503,GB +3470453504,3470458879,US +3470458880,3470475263,KR +3470475264,3470509311,US +3470509312,3470509567,CA +3470509568,3470558207,US +3470558208,3470559231,HK +3470559232,3470572543,US +3470572544,3470575615,CA +3470575616,3470610431,US +3470610432,3470614527,AR +3470614528,3470646831,US +3470646832,3470646847,IL +3470646848,3470651391,US +3470651392,3470655487,CA +3470655488,3470671871,US +3470671872,3470680063,CA +3470680064,3470744063,US +3470744064,3470744575,CA +3470744576,3470745855,US +3470745856,3470746111,CA +3470746112,3470749951,US +3470749952,3470750207,CA +3470750208,3470752767,US +3470752768,3470753023,CO +3470753024,3470753535,US +3470753536,3470753791,CA +3470753792,3470754047,US +3470754048,3470754303,CA +3470754304,3470754559,PE +3470754560,3470755839,US +3470755840,3470756095,MU +3470756096,3470756607,US +3470756608,3470756863,CA +3470756864,3470761983,US +3470761984,3470770175,CA +3470770176,3470778367,US +3470778368,3470778879,GB +3470778880,3470779519,US +3470779520,3470779647,SE +3470779648,3470779903,US +3470779904,3470780159,GB +3470780160,3470780927,US +3470780928,3470781055,GB +3470781056,3470781183,US +3470781184,3470781695,FR +3470781696,3470785023,US +3470785024,3470785791,GB +3470785792,3470794751,US +3470794752,3470802943,PA +3470802944,3470884863,US +3470884864,3470885887,HK +3470885888,3470886655,US +3470886656,3470886911,GB +3470886912,3470912255,US +3470912256,3470912511,AU +3470912512,3471057919,US +3471057920,3471058943,VE +3471058944,3471059967,US +3471059968,3471060223,ES +3471060224,3471060991,US +3471060992,3471061247,NL +3471061248,3471061503,US +3471061504,3471061759,NL +3471061760,3471093615,US +3471093616,3471093616,SK +3471093617,3471263743,US +3471263744,3471265791,CO +3471265792,3471276031,US +3471276032,3471278079,BB +3471278080,3471282779,US +3471282780,3471282780,TH +3471282781,3471529215,US +3471529216,3471529983,CA +3471529984,3471558655,US +3471558656,3471560703,CA +3471560704,3471570943,US +3471570944,3471572991,CA +3471572992,3472249343,US +3472249344,3472249599,CA +3472249600,3472257599,US +3472257600,3472257627,MX +3472257628,3472257628,RU +3472257629,3472257631,MX +3472257632,3472257663,MY +3472257664,3472375807,US +3472375808,3472392191,PR +3472392192,3472408575,CA +3472408576,3472678911,US +3472678912,3472687103,PL +3472687104,3472721919,US +3472721920,3472723967,CA +3472723968,3473039359,US +3473039360,3473040639,BM +3473040640,3473040895,US +3473040896,3473041407,BM +3473041408,3473043455,US +3473047552,3473067007,US +3473067008,3473068031,CA +3473068032,3473276927,US +3473276928,3473342463,CA +3473342464,3473755391,US +3473755392,3473755647,HN +3473755648,3473764729,US +3473764730,3473764730,HK +3473764731,3473765771,US +3473765772,3473765772,UG +3473765773,3473765887,US +3473765888,3473766399,EC +3473766400,3473786059,US +3473786060,3473786060,ZA +3473786061,3473786111,US +3473786112,3473786127,PR +3473786128,3473835659,US +3473835660,3473835660,VE +3473835661,3473843248,US +3473843249,3473843249,ID +3473843250,3473917439,US +3473917440,3473917695,PR +3473917696,3474053119,US +3474053120,3474055167,PE +3474055168,3474193407,US +3474193408,3474193663,PH +3474193664,3474193919,US +3474193920,3474194431,PH +3474194432,3474309119,US +3474309120,3474325503,CA +3474325504,3474391039,US +3474391040,3474456575,CA +3474456576,3474463231,US +3474463232,3474463487,GB +3474463488,3474464255,US +3474464256,3474464767,GB +3474464768,3474548223,US +3474548224,3474548479,JP +3474548480,3475112191,US +3475112192,3475113215,CA +3475113216,3475115007,US +3475115008,3475120127,CA +3475120128,3475124223,US +3475124224,3475243007,CA +3475243008,3475358719,US +3475358720,3475359231,GB +3475359232,3475386367,US +3475386368,3475390463,CA +3475390464,3475569595,US +3475569596,3475569596,TR +3475569597,3475670015,US +3475670016,3475670271,AG +3475670272,3475670527,AI +3475670528,3475670783,LC +3475670784,3475670847,DM +3475670848,3475671039,AG +3475671040,3475681279,US +3475681280,3475685375,HN +3475685376,3475723779,US +3475723780,3475723780,TW +3475723781,3475766769,US +3475766770,3475766770,BR +3475766771,3475882767,US +3475882768,3475882783,FR +3475882784,3475882799,US +3475882800,3475882815,FR +3475882816,3475885951,US +3475885952,3475885999,CA +3475886000,3475896575,US +3475896576,3475896831,FR +3475896832,3475897471,US +3475897472,3475897503,FR +3475897504,3475906711,US +3475906712,3475906715,IE +3475906716,3475907735,US +3475907736,3475907739,SG +3475907740,3475907743,HK +3475907744,3475907791,US +3475907792,3475907795,IN +3475907796,3475908151,US +3475908152,3475908159,CA +3475908160,3475908223,US +3475908224,3475908227,GU +3475908228,3475909139,US +3475909140,3475909143,IE +3475909144,3475909359,US +3475909360,3475909367,IE +3475909368,3475910655,US +3475910656,3475911519,SG +3475911520,3475911551,HK +3475911552,3475912959,SG +3475912960,3475913215,US +3475913216,3475914751,SG +3475914752,3475914815,US +3475914816,3475914847,JP +3475914848,3475914855,US +3475914856,3475914871,JP +3475914872,3475914879,US +3475914880,3475914911,JP +3475914912,3475914919,US +3475914920,3475914923,JP +3475914924,3475914931,US +3475914932,3475914935,JP +3475914936,3475914951,US +3475914952,3475914959,HK +3475914960,3475914967,US +3475914968,3475914975,JP +3475914976,3475915327,US +3475915328,3475915359,JP +3475915360,3475915455,US +3475915456,3475915487,JP +3475915488,3475915647,US +3475915648,3475915679,JP +3475915680,3475915743,HK +3475915744,3475915775,JP +3475915776,3475916031,US +3475916032,3475916047,HK +3475916048,3475916287,US +3475916288,3475916863,HK +3475916864,3475917055,US +3475917056,3475917183,JP +3475917184,3475917231,US +3475917232,3475917311,JP +3475917312,3475917791,US +3475917792,3475917823,JP +3475917824,3475918207,US +3475918208,3475918271,JP +3475918272,3475918319,HK +3475918320,3475919871,US +3475919872,3475920383,JP +3475920384,3475920639,US +3475920640,3475920895,HK +3475920896,3475921167,US +3475921168,3475921183,HK +3475921184,3475921407,US +3475921408,3475922431,JP +3475922432,3475922703,US +3475922704,3475922719,JP +3475922720,3475922751,HK +3475922752,3475930623,US +3475930624,3475930879,HK +3475930880,3475931135,US +3475931136,3475939327,HK +3475939328,3475939427,US +3475939428,3475939431,NL +3475939432,3475939679,US +3475939680,3475939687,GB +3475939688,3475948031,US +3475948032,3475948287,IE +3475948288,3475952511,US +3475952512,3475952639,SG +3475952640,3475952767,US +3475952768,3475953023,JP +3475953024,3475953663,US +3475953664,3475953919,IE +3475953920,3475954175,SG +3475954176,3475954547,US +3475954548,3475954551,PT +3475954552,3475954607,US +3475954608,3475954611,SE +3475954612,3475954631,US +3475954632,3475954639,SG +3475954640,3475954647,US +3475954648,3475954651,CA +3475954652,3475955711,US +3475955712,3475959807,SG +3475959808,3475996671,US +3475996672,3476029439,CA +3476029440,3476111359,US +3476111360,3476111871,CA +3476111872,3476348927,US +3476348928,3476349183,CA +3476349184,3476447231,US +3476447232,3476455423,CA +3476455424,3476881407,US +3476881408,3476946943,CA +3476946944,3477384711,US +3477384712,3477384719,CN +3477384720,3477384735,US +3477384736,3477384743,IE +3477384744,3477384783,US +3477384784,3477384799,IE +3477384800,3477384831,US +3477384832,3477384839,SG +3477384840,3477384847,IE +3477384848,3477384855,SG +3477384856,3477384863,IE +3477384864,3477384871,SG +3477384872,3477384951,US +3477384952,3477384959,IE +3477384960,3478114303,US +3478114304,3478118399,PE +3478118400,3478192127,US +3478192128,3478257663,CA +3478257664,3478261775,US +3478261776,3478261791,SG +3478261792,3478274823,US +3478274824,3478274831,GB +3478274832,3478275983,US +3478275984,3478275999,GB +3478276000,3478277951,US +3478277952,3478277983,GB +3478277984,3478278399,US +3478278400,3478278655,GB +3478278656,3478286591,US +3478286592,3478286847,GB +3478286848,3478288607,US +3478288608,3478288615,GB +3478288616,3478288639,US +3478288640,3478288895,GB +3478288896,3478289663,US +3478289664,3478289919,GB +3478289920,3478721535,US +3478721536,3478721791,CN +3478721792,3478722047,US +3478722048,3478722303,AE +3478722304,3478732799,US +3478732800,3478749183,DE +3478749184,3479207935,US +3479207936,3479240703,CA +3479240704,3479568383,US +3479568384,3479633919,CA +3479633920,3479896063,US +3479896064,3479956479,CA +3479956480,3479956735,US +3479956736,3479961599,CA +3479961600,3479969345,US +3479969346,3479969346,DE +3479969347,3479969409,US +3479969410,3479969410,DE +3479969411,3480223743,US +3480223744,3480256511,CA +3480256512,3480284159,US +3480284160,3480284671,CA +3480284672,3480444927,US +3480444928,3480449023,CA +3480449024,3480551423,US +3480551424,3480551679,JP +3480551680,3480551935,DE +3480551936,3480552191,GB +3480552192,3480552447,US +3480552448,3480552703,CH +3480552704,3480552959,US +3480552960,3480553215,AT +3480553216,3480553471,US +3480553472,3480553727,SG +3480553728,3480553983,HK +3480553984,3480554239,US +3480554240,3480554495,GB +3480554496,3480554751,SG +3480554752,3480555263,US +3480555264,3480555519,NO +3480555520,3480555775,FR +3480555776,3480556287,SG +3480556288,3480556543,HK +3480556544,3480557055,US +3480557056,3480557311,HK +3480557312,3480557567,US +3480557568,3480557823,JP +3480557824,3480558079,CA +3480558080,3480558591,US +3480558592,3480558847,DO +3480558848,3480560895,US +3480560896,3480561151,BR +3480561152,3480561919,US +3480561920,3480562175,JP +3480562176,3480564735,US +3480564736,3480564991,DE +3480564992,3480567039,US +3480567040,3480567551,GB +3480567552,3480568319,US +3480568320,3480568575,HK +3480568576,3480569599,US +3480569600,3480569855,HK +3480569856,3480570111,US +3480570112,3480570367,FR +3480570368,3480570623,ES +3480570624,3480570879,JP +3480570880,3480571391,CH +3480571392,3480571647,BE +3480571648,3480575231,US +3480575232,3480575487,IL +3480575488,3480575743,US +3480575744,3480577023,IT +3480577024,3480580607,US +3480580608,3480580863,SE +3480580864,3480581119,DK +3480581120,3480581631,US +3480581632,3480581887,CL +3480581888,3480582143,NO +3480582144,3480582399,US +3480582400,3480582655,RU +3480582656,3480583423,MX +3480583424,3480588799,US +3480588800,3480589055,SE +3480589056,3480591103,US +3480591104,3480591359,ZA +3480591360,3480591615,US +3480591616,3480592127,ID +3480592128,3480592383,NO +3480592384,3480592639,CH +3480592640,3480592895,IE +3480592896,3480593151,SG +3480593152,3480593407,DK +3480593408,3480593663,SG +3480593664,3480593919,CN +3480593920,3480594175,ZA +3480594176,3480594431,BE +3480594432,3480595711,US +3480595712,3480595967,TH +3480595968,3480596991,SG +3480596992,3480597247,US +3480597248,3480598271,AU +3480598272,3480598527,FR +3480598528,3480599039,AU +3480599040,3480599295,JP +3480599296,3480599551,CA +3480599552,3480599807,SG +3480599808,3480600575,US +3480600576,3480601087,DE +3480601088,3480601343,BE +3480601344,3480601599,AU +3480601600,3480601855,GB +3480601856,3480602111,FR +3480602112,3480602879,US +3480602880,3480603647,IT +3480603648,3480603903,BE +3480603904,3480604159,HK +3480604160,3480604671,ES +3480604672,3480604927,IL +3480604928,3480605183,GB +3480605184,3480605439,MX +3480605440,3480605695,PH +3480605696,3480605951,MX +3480605952,3480606207,PH +3480606208,3480606463,MX +3480606464,3480606719,BE +3480606720,3480606975,GR +3480606976,3480607231,US +3480607232,3480607487,IT +3480607488,3480610303,US +3480610304,3480610559,ES +3480610560,3480611327,US +3480611328,3480611583,JP +3480611584,3480611839,MX +3480611840,3480612095,BR +3480612096,3480612351,LU +3480612352,3480613631,DE +3480613632,3480839423,US +3480839424,3480839935,GB +3480839936,3480907263,US +3480907264,3480907775,FR +3480907776,3480968191,US +3480968192,3480968447,AU +3480968448,3481665535,US +3481665536,3481731071,CA +3481731072,3481796607,US +3481796608,3481812991,AU +3481812992,3481822063,CA +3481822064,3481822079,US +3481822080,3481829375,CA +3481829376,3481951977,US +3481951978,3481951978,DE +3481951979,3481959020,US +3481959021,3481959022,GB +3481959023,3481964575,US +3481964576,3481964579,IE +3481964580,3481993791,US +3481993792,3481993799,CA +3481993800,3481994239,US +3481994240,3481994751,CA +3481994752,3481995007,US +3481995008,3481995263,CA +3481995264,3481996031,US +3481996032,3481996287,CA +3481996288,3481996543,US +3481996544,3481997311,CA +3481997312,3481997567,US +3481997568,3481998591,CA +3481998592,3481998847,AG +3481998848,3481999103,US +3481999104,3481999359,CA +3481999360,3481999615,US +3481999616,3482001663,CA +3482001664,3482001919,US +3482001920,3482002175,CA +3482002176,3482002431,US +3482002432,3482003455,CA +3482003456,3482004479,US +3482004480,3482006015,CA +3482006016,3482007551,US +3482007552,3482008063,CA +3482008064,3482008319,US +3482008320,3482011135,CA +3482011136,3482011647,US +3482011648,3482012159,CA +3482012160,3482012927,US +3482012928,3482013951,CA +3482013952,3482014207,US +3482014208,3482014719,CA +3482014720,3482014863,US +3482014864,3482014879,CA +3482014880,3482016255,US +3482016256,3482016767,CA +3482016768,3482017023,US +3482017024,3482017279,CA +3482017280,3482017535,US +3482017536,3482017791,CA +3482017792,3482018047,US +3482018048,3482018303,CA +3482018304,3482019327,US +3482019328,3482019583,CA +3482019584,3482020607,US +3482020608,3482020863,CA +3482020864,3482021119,US +3482021120,3482022143,CA +3482022144,3482022911,US +3482022912,3482024703,CA +3482024704,3482024959,US +3482024960,3482025215,CA +3482025216,3482025471,US +3482025472,3482028543,CA +3482028544,3482028799,US +3482028800,3482029311,CA +3482029312,3482029567,US +3482029568,3482030335,CA +3482030336,3482030591,US +3482030592,3482032895,CA +3482032896,3482033151,US +3482033152,3482033663,CA +3482033664,3482033919,US +3482033920,3482034431,CA +3482034432,3482035199,US +3482035200,3482035711,CA +3482035712,3482035967,US +3482035968,3482036223,CA +3482036224,3482036479,US +3482036480,3482036735,CA +3482036736,3482036991,US +3482036992,3482037247,CA +3482037248,3482037759,US +3482037760,3482038015,CA +3482038016,3482038271,US +3482038272,3482038783,CA +3482038784,3482039551,US +3482039552,3482040319,CA +3482040320,3482041087,US +3482041088,3482041343,CA +3482041344,3482041599,US +3482041600,3482041855,CA +3482041856,3482042111,US +3482042112,3482042367,CA +3482042368,3482043903,US +3482043904,3482044927,CA +3482044928,3482045183,US +3482045184,3482045695,CA +3482045696,3482046975,US +3482046976,3482047487,CA +3482047488,3482047743,US +3482047744,3482047999,CA +3482048000,3482048511,US +3482048512,3482048767,CA +3482048768,3482049791,US +3482049792,3482050559,CA +3482050560,3482051327,US +3482051328,3482051583,CA +3482051584,3482051839,US +3482051840,3482052863,CA +3482052864,3482053631,US +3482053632,3482053887,CA +3482053888,3482053999,US +3482054000,3482054015,CA +3482054016,3482054143,US +3482054144,3482054655,CA +3482054656,3482058239,US +3482058240,3482058495,CA +3482058496,3482583039,US +3482583040,3482632191,CA +3482632192,3482775551,US +3482775552,3482779647,PR +3482779648,3482910719,US +3482910720,3482927103,CA +3482927104,3483025407,US +3483025408,3483041791,DE +3483041792,3483254783,US +3483254784,3483271167,AU +3483271168,3483296004,US +3483296005,3483296005,BE +3483296006,3483336959,US +3483336960,3483337215,CA +3483337216,3483337983,US +3483337984,3483338239,CA +3483338240,3483339263,US +3483339264,3483339519,CA +3483339520,3483340287,US +3483340288,3483341055,CA +3483341056,3483341311,US +3483341312,3483341567,CA +3483341568,3483342591,US +3483342592,3483344895,CA +3483344896,3483435007,US +3483435008,3483533311,CA +3483533312,3483552255,US +3483552256,3483552511,CA +3483552512,3483631615,US +3483631616,3483697151,CA +3483697152,3483791359,US +3483791360,3483791623,PR +3483791624,3483791631,US +3483791632,3483791815,PR +3483791816,3483791823,US +3483791824,3483793919,PR +3483793920,3483794431,US +3483794432,3483795455,PR +3483795456,3483828223,US +3483828224,3483836415,CA +3483836416,3483844607,US +3483860992,3483877375,US +3483877376,3483893759,CA +3483893760,3484006911,US +3484006912,3484007167,AU +3484007168,3484013055,US +3484013056,3484013567,DE +3484013568,3484320767,US +3484321792,3484322047,PR +3484322048,3484325887,US +3484326912,3484327423,US +3484327424,3484327935,CA +3484327936,3484332031,US +3484332032,3484336127,HK +3484336128,3484438527,US +3484438528,3484438783,ZM +3484438784,3484439551,US +3484439552,3484439807,ZM +3484439808,3484450815,US +3484450816,3484451839,CA +3484451840,3484452095,US +3484452096,3484453631,CA +3484453632,3484453887,US +3484453888,3484454911,CA +3484454912,3484455423,US +3484455424,3484455679,CA +3484455680,3484455935,US +3484455936,3484456191,CA +3484456192,3484456703,US +3484456704,3484457727,CA +3484457728,3484457983,US +3484457984,3484458751,CA +3484458752,3484459007,US +3484459008,3484459775,CA +3484459776,3484460687,US +3484460688,3484460703,CA +3484460704,3484460735,US +3484460736,3484460751,CA +3484460752,3484460799,US +3484460800,3484461055,CA +3484461056,3484461823,US +3484461824,3484462079,CA +3484462080,3484462335,US +3484462336,3484462591,CA +3484462592,3484463359,US +3484463360,3484464127,CA +3484464128,3484464319,US +3484464320,3484464335,CA +3484464336,3484464895,US +3484464896,3484465151,CA +3484465152,3484465663,US +3484465664,3484465919,CA +3484465920,3484466175,US +3484466176,3484466431,CA +3484466432,3484466687,US +3484466688,3484468223,CA +3484468224,3484468479,US +3484468480,3484468991,CA +3484468992,3484469247,US +3484469248,3484469759,CA +3484469760,3484470015,US +3484470016,3484470527,CA +3484470528,3484471807,US +3484471808,3484472063,CA +3484472064,3484472319,US +3484472320,3484472575,CA +3484472576,3484473343,US +3484473344,3484473599,CA +3484473600,3484473855,US +3484473856,3484474879,CA +3484474880,3484475135,US +3484475136,3484477183,CA +3484477184,3484477695,US +3484477696,3484477951,CA +3484477952,3484478719,US +3484478720,3484478975,CA +3484478976,3484479231,US +3484479232,3484479487,CA +3484479488,3484479743,US +3484479744,3484479999,CA +3484480000,3484480255,US +3484480256,3484481279,CA +3484481280,3484481535,US +3484481536,3484482047,CA +3484482048,3484482559,US +3484482560,3484483583,CA +3484483584,3484647423,US +3484647424,3484663807,CA +3484663808,3484762111,US +3484762112,3484778495,CA +3484778496,3484884991,US +3484884992,3484893183,CA +3484893184,3485220863,US +3485220864,3485229055,CA +3485229056,3485270015,US +3485270016,3485270527,FR +3485270528,3485270783,US +3485270784,3485270911,IN +3485270912,3485271039,GB +3485271040,3485271295,IN +3485271296,3485271551,GB +3485271552,3485271679,BS +3485271680,3485271807,US +3485271808,3485271999,GB +3485272000,3485272047,US +3485272048,3485272063,GB +3485272064,3485272159,CA +3485272160,3485272223,US +3485272224,3485272255,CA +3485272256,3485272815,US +3485272816,3485272831,HK +3485272832,3485273071,US +3485273072,3485273079,FR +3485273080,3485273087,US +3485273088,3485273215,RU +3485273216,3485273319,US +3485273320,3485273335,EG +3485273336,3485273343,US +3485273344,3485273599,GB +3485273600,3485273727,FR +3485273728,3485273855,US +3485273856,3485274111,GB +3485274112,3485275135,US +3485275136,3485275647,DE +3485275648,3485313023,US +3485313024,3485314047,HK +3485314048,3485317119,US +3485317120,3485318143,IN +3485318144,3485319167,US +3485319168,3485323263,SE +3485323264,3485335551,CA +3485335552,3485462527,US +3485462528,3485464575,VC +3485464576,3485466623,LC +3485466624,3485597695,US +3485597696,3485695999,CA +3485696000,3485883903,US +3485883904,3485884159,CA +3485884160,3485884671,US +3485884672,3485886463,CA +3485886464,3485888511,US +3485888512,3485889023,CA +3485889024,3485890047,US +3485890048,3485890815,CA +3485890816,3485891327,US +3485891328,3485891839,CA +3485891840,3485958399,US +3485958400,3485958655,CA +3485958656,3485959423,US +3485959424,3485960191,CA +3485960192,3485960703,US +3485960704,3485960959,CA +3485960960,3485962751,US +3485962752,3485963007,CA +3485963008,3485965311,US +3485965312,3485965567,CA +3485965568,3485965568,US +3485965569,3485966335,CA +3485966336,3485967615,US +3485967616,3485967616,GB +3485967617,3485967871,US +3485967872,3485968127,CA +3485968128,3485969151,US +3485969152,3485969152,GB +3485969153,3485969663,US +3485969664,3485969664,GB +3485969665,3485970431,US +3485970432,3485970943,CA +3485970944,3485972991,US +3485972992,3485973247,CA +3485973248,3485973503,US +3485973504,3485974527,CA +3485974528,3486023679,US +3486023680,3486031871,CA +3486031872,3486269439,US +3486269440,3486285823,JM +3486285824,3486302207,PR +3486302208,3486310399,CA +3486310400,3486580735,US +3486580736,3486580991,GB +3486580992,3486581503,DE +3486581504,3486581759,TW +3486581760,3486582015,GB +3486582016,3486582271,NO +3486582272,3486582527,BE +3486582528,3486582783,AU +3486582784,3486583039,DE +3486583040,3486583295,CH +3486583296,3486583807,US +3486583808,3486584063,KR +3486584064,3486584319,US +3486584320,3486584831,CA +3486584832,3486585343,US +3486585344,3486585599,PT +3486585600,3486586367,FR +3486586368,3486586623,NZ +3486586624,3486586879,US +3486586880,3486587135,AU +3486587136,3486587391,FR +3486587392,3486587647,NL +3486587648,3486587903,CL +3486587904,3486588415,GB +3486588416,3486588671,FR +3486588672,3486589119,US +3486589120,3486589151,NL +3486589152,3486589247,US +3486589248,3486589279,ZA +3486589280,3486589951,US +3486589952,3486590207,IT +3486590208,3486590463,US +3486590464,3486591743,GB +3486591744,3486591999,CH +3486592000,3486592063,FI +3486592064,3486592255,US +3486592256,3486592511,NL +3486592512,3486593023,NO +3486593024,3486593279,NL +3486593280,3486593791,DE +3486593792,3486594047,FR +3486594048,3486594303,DE +3486594304,3486594559,BE +3486594560,3486594719,US +3486594720,3486594751,LU +3486594752,3486594783,GB +3486594784,3486594815,US +3486594816,3486594943,AR +3486594944,3486595071,US +3486595072,3486595327,DK +3486595328,3486595583,ID +3486595584,3486595839,PR +3486595840,3486596095,DK +3486596096,3486596351,NL +3486596352,3486596607,NO +3486596608,3486596735,US +3486596736,3486596799,CH +3486596800,3486596863,FR +3486596864,3486597119,GB +3486597120,3486597375,IE +3486597376,3486597631,IT +3486597632,3486597887,GB +3486597888,3486598655,US +3486598656,3486598911,BR +3486598912,3486599167,NO +3486599168,3486599423,SE +3486599424,3486599679,BR +3486599680,3486599935,US +3486599936,3486600447,BR +3486600448,3486601215,US +3486601216,3486601471,BE +3486601472,3486601727,US +3486601728,3486601983,BE +3486601984,3486602239,NZ +3486602240,3486603007,US +3486603008,3486603263,SG +3486603264,3486603519,US +3486603520,3486603775,JP +3486603776,3486604287,US +3486604288,3486604543,BE +3486604544,3486605055,US +3486605056,3486605311,ES +3486605312,3486605567,NL +3486605568,3486606079,US +3486606080,3486606335,MY +3486606336,3486606591,US +3486606592,3486606847,FI +3486606848,3486607359,US +3486607360,3486607615,JP +3486607616,3486607871,US +3486607872,3486608127,PH +3486608128,3486608383,GB +3486608384,3486609151,US +3486609152,3486609663,HK +3486609664,3486609919,AU +3486609920,3486610175,SG +3486610176,3486610431,US +3486610432,3486610687,SE +3486610688,3486610943,NL +3486610944,3486611199,US +3486611200,3486611215,BR +3486611216,3486611455,US +3486611456,3486611711,SG +3486611712,3486611775,EC +3486611776,3486611967,US +3486611968,3486612223,HK +3486612224,3486612479,SG +3486612480,3486612607,US +3486612608,3486612735,FR +3486612736,3486612991,DE +3486612992,3486613247,US +3486613248,3486613759,GB +3486613760,3486614015,ES +3486614016,3486614271,US +3486614272,3486614527,GB +3486614528,3486614783,US +3486614784,3486615039,FR +3486615040,3486615295,BE +3486615296,3486615551,PH +3486615552,3486615871,US +3486615872,3486615903,LU +3486615904,3486615935,US +3486615936,3486615967,CH +3486615968,3486616319,US +3486616320,3486616831,NO +3486616832,3486617215,US +3486617216,3486617343,SE +3486617344,3486617599,US +3486617600,3486617855,CH +3486617856,3486618111,AU +3486618112,3486618367,NO +3486618368,3486618623,ES +3486618624,3486618879,BE +3486618880,3486619135,FR +3486619136,3486619391,SG +3486619392,3486619647,BE +3486619648,3486619903,CA +3486619904,3486620159,US +3486620160,3486620415,SE +3486620416,3486620671,HK +3486620672,3486620927,US +3486620928,3486621183,NL +3486621184,3486621439,US +3486621440,3486621695,NL +3486621696,3486621951,FI +3486621952,3486622207,ES +3486622208,3486622463,ZA +3486622464,3486622719,GB +3486622720,3486622975,MX +3486622976,3486623231,DE +3486623232,3486623487,JP +3486623488,3486623743,DE +3486623744,3486623999,US +3486624000,3486624255,PH +3486624256,3486624511,SG +3486624512,3486624767,SE +3486624768,3486625023,ES +3486625024,3486625055,US +3486625056,3486625087,MX +3486625088,3486625151,US +3486625152,3486625183,MX +3486625184,3486625279,US +3486625280,3486625535,SE +3486625536,3486625791,NO +3486625792,3486626047,NL +3486626048,3486626303,FI +3486626304,3486626559,IL +3486626560,3486626567,CH +3486626568,3486626591,US +3486626592,3486626623,FI +3486626624,3486627071,US +3486627072,3486627327,JP +3486627328,3486627583,US +3486627584,3486627839,BE +3486627840,3486628095,BW +3486628096,3486628351,ZA +3486628352,3486628607,US +3486628608,3486628863,NO +3486628864,3486629375,PT +3486629376,3486629631,US +3486629632,3486629887,CL +3486629888,3486630143,SE +3486630144,3486631679,JP +3486631680,3486631935,ID +3486631936,3486632447,JP +3486632448,3486632703,US +3486632704,3486632959,JP +3486632960,3486633215,IT +3486633216,3486633471,GB +3486633472,3486633983,US +3486633984,3486634239,HK +3486634240,3486634495,US +3486634496,3486634751,KR +3486634752,3486635007,CH +3486635008,3486635263,DK +3486635264,3486635519,FR +3486635520,3486635775,ES +3486635776,3486636031,IL +3486636032,3486636287,ES +3486636288,3486636543,NL +3486636544,3486636799,TW +3486636800,3486637055,DE +3486637056,3486637311,US +3486637312,3486637823,BE +3486637824,3486638335,SE +3486638336,3486638591,FR +3486638592,3486638847,US +3486638848,3486639103,DK +3486639104,3486639359,BE +3486639360,3486639615,SG +3486639616,3486640127,US +3486640128,3486640383,BE +3486640384,3486640639,GB +3486640640,3486642175,US +3486642176,3486642431,BR +3486642432,3486642687,PT +3486642688,3486642943,DK +3486642944,3486646271,US +3486646272,3486662655,CA +3486662656,3486688255,US +3486688256,3486688511,GB +3486688512,3486699519,US +3486699520,3486699775,CA +3486699776,3486702591,US +3486702592,3486702847,CA +3486702848,3487039487,US +3487039488,3487105023,CA +3487105024,3487189247,US +3487189248,3487189503,DK +3487189504,3487216383,US +3487216384,3487216639,SE +3487216640,3487236095,US +3487236096,3487301631,CA +3487301632,3487706367,US +3487706368,3487706623,RU +3487706624,3487750399,US +3487750400,3487750415,HK +3487750416,3487750529,US +3487750530,3487750530,HK +3487750531,3487766527,US +3487766528,3487768575,CA +3487768576,3487842303,US +3487842304,3487858687,CA +3487858688,3487861759,BM +3487861760,3487862015,KY +3487862016,3487875071,BM +3487875072,3487891455,US +3487891456,3487907839,CA +3487907840,3487913471,US +3487913472,3487913983,CA +3487913984,3487920127,US +3487920128,3487920639,NL +3487920640,3487920895,US +3487920896,3487921407,NL +3487921408,3487921663,US +3487921664,3487922431,NL +3487922432,3487922687,US +3487922688,3487924223,NL +3487924224,3487969791,US +3487969792,3487970047,KW +3487970048,3488014335,US +3488014336,3488022527,CA +3488022528,3488071679,US +3488071680,3488072703,CA +3488072704,3488079871,US +3488079872,3488083967,CA +3488083968,3488088063,US +3488088064,3488104447,IL +3488104448,3488112639,US +3488112640,3488120831,CA +3488120832,3488350207,US +3488350208,3488415743,CA +3488415744,3488615935,US +3488615936,3488616191,AU +3488616192,3488910335,US +3488910336,3488911359,CA +3488911360,3488940031,US +3488940032,3488956415,CA +3488956416,3488989183,US +3488989184,3489005567,CA +3489005568,3489058047,US +3489058048,3489058063,GB +3489058064,3489136639,US +3489136640,3489153535,MX +3489153536,3489154047,HN +3489154048,3489155583,MX +3489155584,3489156607,AR +3489156608,3489157375,MX +3489157376,3489157631,CO +3489157632,3489158399,MX +3489158400,3489158655,AR +3489158656,3489158911,NI +3489158912,3489159167,BR +3489159168,3489160191,MX +3489160192,3489161215,AR +3489161216,3489162495,MX +3489162496,3489162751,GT +3489162752,3489163007,CL +3489163008,3489167615,MX +3489167616,3489167871,PE +3489167872,3489168127,MX +3489168128,3489168383,PE +3489168384,3489169407,AR +3489169408,3489185791,MX +3489185792,3489193983,CL +3489193984,3489267711,MX +3489267712,3489341439,US +3489341440,3489345535,CA +3489345536,3489398783,US +3489398784,3489399039,IT +3489399040,3489464319,US +3489464320,3489529855,CA +3489529856,3489535999,US +3489536000,3489538047,IE +3489538048,3489547263,US +3489547264,3489548287,IE +3489548288,3489562623,US +3489566720,3489575935,US +3489575936,3489576191,CN +3489576192,3489576703,US +3489576704,3489576959,CN +3489576960,3489577215,US +3489577216,3489578239,CN +3489578240,3489685503,US +3489685504,3489687551,BB +3489687552,3489718271,US +3489718272,3489718527,DM +3489718528,3489719039,LC +3489719040,3489719551,AG +3489719552,3489719807,VG +3489719808,3489720063,DM +3489720064,3489720319,LC +3489720320,3489738751,US +3489738752,3489740799,PH +3489740800,3489753151,US +3489753152,3489753167,PR +3489753168,3489753179,US +3489753180,3489753180,GB +3489753181,3489775103,US +3489775104,3489775359,BO +3489775360,3489906943,US +3489906944,3489906944,VN +3489906945,3489969151,US +3489969152,3489969663,PR +3489969664,3490020675,US +3490020676,3490020676,MK +3490020677,3490228735,US +3490228736,3490229247,CO +3490229248,3490263039,US +3490263040,3490265087,CO +3490265088,3490265343,EC +3490265344,3490267135,CO +3490267136,3490477967,US +3490477968,3490477968,NG +3490477969,3490488319,US +3490488320,3490489343,PR +3490489344,3490703615,US +3490703616,3490703871,PR +3490703872,3490821127,US +3490821128,3490821128,AE +3490821129,3491239063,US +3491239064,3491239064,JO +3491239065,3491353155,US +3491353156,3491353156,DO +3491353157,3491381247,US +3491381248,3491389439,BM +3491389440,3491447863,US +3491447864,3491447864,IE +3491447865,3491476991,US +3491476992,3491478527,VI +3491478528,3491557907,US +3491557908,3491557908,EC +3491557909,3491585075,US +3491585076,3491585076,EG +3491585077,3491637247,US +3491637248,3491637759,CO +3491637760,3491651583,US +3491651584,3491659775,VI +3491659776,3491743743,US +3491743744,3491745791,CO +3491745792,3491830963,US +3491830964,3491830964,CO +3491830965,3491904267,US +3491904268,3491904268,CR +3491904269,3491943447,US +3491943448,3491943455,BR +3491943456,3491961599,US +3491961600,3491961600,BO +3491961601,3491969023,US +3491969024,3491970047,PR +3491970048,3492151295,US +3492151296,3492162943,CA +3492162944,3492163071,US +3492163072,3492167679,CA +3492167680,3492669951,US +3492669952,3492671487,PA +3492671488,3492807155,US +3492807156,3492807159,SE +3492807160,3492812759,US +3492812760,3492812763,JP +3492812764,3492845823,US +3492845824,3492846079,CH +3492846080,3492865023,US +3492865024,3492865535,GB +3492865536,3492866047,US +3492866048,3492868095,GB +3492868096,3492877954,US +3492877955,3492877955,CA +3492877956,3492880745,US +3492880746,3492880746,ES +3492880747,3492893951,US +3492893952,3492893969,GB +3492893970,3492893971,US +3492893972,3492894207,GB +3492894208,3492904215,US +3492904216,3492904219,AT +3492904220,3492909989,US +3492909990,3492909990,DE +3492909991,3492911103,US +3492911104,3492912383,GB +3492912384,3492912639,US +3492912640,3492913151,GB +3492913152,3492921855,US +3492921856,3492922111,VI +3492922112,3492933375,US +3492933376,3492933503,CH +3492933504,3492933631,CA +3492933632,3492939022,US +3492939023,3492939023,DE +3492939024,3492954111,US +3492954112,3492956159,GB +3492956160,3492957695,US +3492957696,3492958207,VI +3492958208,3492969471,US +3492969472,3492969599,VI +3492969600,3492994815,US +3492994816,3492995071,GB +3492995072,3493039359,US +3493039360,3493039615,AR +3493039616,3493039695,US +3493039696,3493039703,RO +3493039704,3493073151,US +3493073152,3493073407,BO +3493073408,3493073663,US +3493073664,3493073919,BO +3493073920,3493081599,US +3493081600,3493082623,PY +3493082624,3493089023,US +3493089024,3493089279,CM +3493089280,3493140223,US +3493140224,3493140479,DE +3493140480,3493244927,US +3493244928,3493249023,PR +3493249024,3493866495,US +3493866496,3493867519,VG +3493867520,3493881855,US +3493881856,3493882879,CA +3493882880,3493900371,US +3493900372,3493900375,GB +3493900376,3493901023,US +3493901024,3493901031,HK +3493901032,3493936127,US +3493936128,3493937151,CA +3493937152,3493939199,US +3493939200,3493941247,CA +3493941248,3493980159,US +3493980160,3493981183,CA +3493981184,3493982207,US +3493982208,3493984255,CA +3493984256,3493986303,US +3493986304,3493987327,CA +3493987328,3493990399,US +3493990400,3493991423,CA +3493991424,3493998591,US +3493998592,3494000639,AI +3494000640,3494002687,US +3494003712,3494004735,CA +3494004736,3494009855,US +3494009856,3494010879,CA +3494010880,3494014975,US +3494014976,3494017023,CA +3494017024,3494043647,US +3494043648,3494045695,CA +3494045696,3494046719,JP +3494046720,3494047743,ID +3494047744,3494049791,US +3494049792,3494051839,CA +3494051840,3494075391,US +3494075392,3494076415,CA +3494076416,3494080511,US +3494080512,3494081535,CA +3494081536,3494088703,US +3494088704,3494090751,CA +3494090752,3494094847,US +3494094848,3494095871,CA +3494095872,3494121471,US +3494121472,3494122495,CA +3494122496,3494125567,US +3494125568,3494126591,CA +3494126592,3494135807,US +3494135808,3494136831,CA +3494136832,3494139903,US +3494139904,3494141951,CA +3494141952,3494143999,US +3494144000,3494145023,CA +3494145024,3494168575,US +3494168576,3494170623,CA +3494170624,3494181631,US +3494181632,3494181887,SN +3494181888,3494184959,US +3494184960,3494187007,CA +3494187008,3494191359,US +3494191360,3494191615,DE +3494191616,3494191871,GB +3494191872,3494192127,NL +3494192128,3494192383,US +3494192384,3494192639,JP +3494192640,3494197247,US +3494197248,3494198271,CA +3494198272,3494211583,US +3494211584,3494212607,NL +3494212608,3494244351,US +3494244352,3494246399,CA +3494246400,3494247423,US +3494247424,3494250495,CA +3494250496,3494262783,US +3494262784,3494264831,CA +3494264832,3494271999,US +3494272000,3494273023,KN +3494273024,3494275071,US +3494275072,3494277119,CA +3494277120,3494302719,US +3494302720,3494303743,CA +3494303744,3494310911,US +3494310912,3494311935,CA +3494311936,3494316031,US +3494316032,3494317055,CA +3494317056,3494336511,US +3494336512,3494337535,CA +3494337536,3494342655,US +3494342656,3494344703,CA +3494344704,3494344959,HK +3494344960,3494359039,US +3494359040,3494360063,CA +3494360064,3494361087,US +3494361088,3494362111,CA +3494362112,3494368255,US +3494368256,3494369279,CN +3494369280,3494380543,US +3494380544,3494381567,CA +3494381568,3494402559,US +3494402560,3494402815,GB +3494402816,3494410239,US +3494410240,3494412287,CA +3494412288,3494422527,US +3494422528,3494425599,CA +3494425600,3494437887,US +3494437888,3494438143,GP +3494438144,3494438399,DM +3494438400,3494438655,KN +3494438656,3494438911,DM +3494438912,3494455295,US +3494455296,3494456319,CA +3494456320,3494459391,US +3494459392,3494460415,CA +3494460416,3494464511,US +3494464512,3494465535,CA +3494465536,3494510591,US +3494510592,3494512639,CA +3494512640,3494516735,US +3494516736,3494517759,CA +3494517760,3494540031,US +3494540032,3494540287,UG +3494540288,3494563839,US +3494563840,3494565887,CA +3494565888,3494594559,US +3494594560,3494595583,CA +3494595584,3494605823,US +3494605824,3494606847,CA +3494606848,3494610943,US +3494610944,3494611967,CA +3494611968,3494624255,US +3494624256,3494625279,CA +3494625280,3494627327,US +3494627328,3494628351,BM +3494628352,3494642687,US +3494642688,3494643711,CA +3494643712,3494651903,US +3494651904,3494652927,CA +3494652928,3494655743,US +3494655744,3494655759,GB +3494655760,3494660095,US +3494660096,3494661119,CA +3494661120,3494664191,US +3494664192,3494665215,CA +3494665216,3494668287,US +3494668288,3494670335,CA +3494670336,3494709759,US +3494709760,3494710271,CA +3494710272,3494727679,US +3494727680,3494729727,CA +3494729728,3494730751,US +3494730752,3494731775,CA +3494731776,3494743039,US +3494743040,3494744063,CA +3494744064,3494747135,US +3494747136,3494748159,CA +3494748160,3494757375,US +3494757376,3494758399,CA +3494758400,3494776831,US +3494776832,3494777855,CA +3494777856,3494785023,US +3494785024,3494787071,MF +3494787072,3494787327,CA +3494787328,3494787583,NG +3494787584,3494788095,CA +3494788096,3494788351,NG +3494788352,3494788607,LY +3494788608,3494789119,CA +3494789120,3494813183,US +3494813184,3494813439,CA +3494813440,3494852607,US +3494852608,3494854655,CA +3494854656,3494862847,US +3494862848,3494863871,DM +3494863872,3494866943,US +3494866944,3494867967,CA +3494867968,3494871039,US +3494872064,3494874111,US +3494874112,3494874367,ES +3494874368,3494874879,US +3494874880,3494874911,ES +3494874912,3494893567,US +3494893568,3494894591,CA +3494894592,3494917119,US +3494917120,3494917631,CA +3494917632,3494928383,US +3494928384,3494930431,CA +3494930432,3494950655,US +3494950656,3494950911,PH +3494950912,3494964223,US +3494964224,3494965247,PR +3494965248,3494968319,US +3494968320,3494972415,CA +3494972416,3494979583,US +3494979584,3494981631,CA +3494981632,3494984191,US +3494984192,3494984703,PR +3494984704,3494985727,US +3494985728,3494985975,NL +3494985976,3494985976,US +3494985977,3494985983,NL +3494985984,3494999039,US +3494999040,3494999551,ID +3494999552,3495000063,CN +3495000064,3495001087,CA +3495001088,3495005439,US +3495005440,3495005695,CA +3495005696,3495006207,US +3495006208,3495007231,CA +3495007232,3495010303,US +3495010304,3495011327,KN +3495011328,3495012351,US +3495012352,3495014399,PR +3495014400,3495021567,US +3495021568,3495022079,CA +3495022080,3495023615,US +3495023616,3495024639,CA +3495024640,3495053311,US +3495053312,3495054335,DE +3495054336,3495057407,US +3495057408,3495059455,CA +3495059456,3495065599,US +3495065600,3495066495,CA +3495066496,3495066623,GB +3495066624,3495076863,US +3495076864,3495077887,BM +3495077888,3495078911,CA +3495078912,3495090175,US +3495090176,3495091199,KY +3495091200,3495098367,US +3495098368,3495100415,CA +3495100416,3495100927,IE +3495100928,3495120895,US +3495120896,3495122943,AG +3495122944,3495153663,US +3495153664,3495155711,CA +3495155712,3495187199,US +3495187200,3495187455,IM +3495187456,3495192575,US +3495192576,3495193599,CA +3495193600,3495215103,US +3495215104,3495217151,VI +3495217152,3495219199,VC +3495219200,3495251967,US +3495251968,3495254015,CA +3495254016,3495260159,US +3495260160,3495261183,CA +3495261184,3495271423,US +3495271424,3495272447,ZA +3495272448,3495285759,US +3495285760,3495288831,CA +3495288832,3495331881,US +3495331882,3495331882,CA +3495331883,3495332863,US +3495332864,3495333887,CA +3495333888,3495349247,US +3495349248,3495350271,CA +3495350272,3495358463,US +3495358464,3495359487,CA +3495359488,3495367679,US +3495367680,3495368703,CA +3495368704,3495370239,US +3495370240,3495370495,RU +3495370496,3495370751,US +3495370752,3495372799,BS +3495372800,3495375871,US +3495375872,3495376895,CA +3495376896,3495399423,US +3495399424,3495400447,KN +3495400448,3495403519,US +3495403520,3495404031,CA +3495404032,3495405055,US +3495405056,3495405567,HK +3495405568,3495406335,US +3495406336,3495406591,LB +3495406592,3495412735,US +3495412736,3495413759,CA +3495413760,3495429119,US +3495429120,3495430143,CA +3495430144,3495440831,US +3495440832,3495440847,IN +3495440848,3495455743,US +3495455744,3495456767,CA +3495456768,3495463935,US +3495463936,3495464959,CA +3495464960,3495475199,US +3495475200,3495477247,CA +3495477248,3495478271,US +3495478272,3495479295,CA +3495479296,3495481343,US +3495483392,3495505919,US +3495505920,3495507967,CA +3495507968,3495515135,US +3495515136,3495516159,CA +3495516160,3495526399,US +3495526400,3495527423,CA +3495527424,3495544063,US +3495544064,3495544319,NG +3495544320,3495551999,US +3495552000,3495553023,BM +3495553024,3495576575,US +3495576576,3495577599,CA +3495577600,3495579647,US +3495579648,3495581695,CA +3495581696,3495583743,US +3495583744,3495585791,CA +3495585792,3495587839,US +3495587840,3495588863,MS +3495588864,3495618559,US +3495618560,3495619583,CA +3495619584,3495620607,US +3495620608,3495622655,CA +3495622656,3495653375,US +3495653376,3495654399,CA +3495654400,3495673855,US +3495673856,3495674879,MF +3495674880,3495675162,VG +3495675163,3495675163,US +3495675164,3495675391,VG +3495675392,3495688191,US +3495688192,3495689215,CA +3495689216,3495694335,US +3495694336,3495696383,CA +3495696384,3495703551,US +3495703552,3495704575,CA +3495704576,3495718911,US +3495718912,3495723007,CA +3495723008,3495724031,US +3495724032,3495727103,CA +3495727104,3495729151,US +3495731200,3495739391,US +3495739392,3495740415,CA +3495740416,3495749631,US +3495749632,3495749856,CA +3495749857,3495749861,RU +3495749862,3495750655,CA +3495750656,3495758335,US +3495758336,3495758847,CA +3495758848,3495815167,US +3495815168,3495817215,CA +3495817216,3495828479,US +3495828480,3495829503,CA +3495829504,3495837695,US +3495837696,3495838463,CA +3495838464,3495847935,US +3495847936,3495849983,CA +3495849984,3495862271,US +3495862272,3495864319,CA +3495864320,3495864831,DM +3495864832,3495865343,MF +3495865344,3495866367,US +3495866368,3495868415,LC +3495868416,3495871487,US +3495871488,3495872511,CA +3495872512,3495881471,US +3495881472,3495881727,PA +3495881728,3495896063,US +3495896064,3495897087,PR +3495897088,3495930879,US +3495930880,3495931903,CA +3495931904,3495968767,US +3495968768,3495985151,CA +3495985152,3495988223,NI +3495988224,3495989247,GT +3495989248,3496034303,US +3496034304,3496050687,CA +3496050688,3496132607,US +3496132608,3496148991,CA +3496148992,3496181759,US +3496181760,3496189951,CA +3496189952,3496296447,US +3496296448,3496312831,CA +3496312832,3496451583,US +3496451584,3496452095,CA +3496452096,3496454911,US +3496454912,3496455167,CA +3496455168,3496468479,US +3496468480,3496476671,CA +3496476672,3496875263,US +3496875264,3496875519,BD +3496875520,3496878079,US +3496878080,3496882175,CA +3496882176,3496883199,US +3496883200,3496884223,GB +3496884224,3496885247,US +3496885248,3496886271,GB +3496886272,3496894463,US +3496894464,3496902655,CA +3496902656,3496946175,US +3496946176,3496946431,HK +3496946432,3496947711,US +3496947712,3496949759,JP +3496949760,3496951807,US +3496951808,3496959999,CA +3496960000,3497020415,US +3497020416,3497020671,IL +3497020672,3497066495,US +3497066496,3497082879,CA +3497082880,3497164799,US +3497164800,3497181183,CA +3497181184,3497229615,US +3497229616,3497229623,CA +3497229624,3497229767,US +3497229768,3497229775,CA +3497229776,3497410559,US +3497410560,3497431039,CA +3497431040,3497447423,US +3497447424,3497451519,CA +3497451520,3497664255,US +3497664256,3497664511,NL +3497664512,3497717759,US +3497717760,3497718783,CA +3497718784,3497719295,US +3497719296,3497721343,CA +3497721344,3497721599,NG +3497721600,3497721855,CA +3497721856,3497775103,US +3497775104,3497775359,CA +3497775360,3497775615,US +3497775616,3497778175,CA +3497778176,3497778943,US +3497778944,3497779199,CA +3497779200,3497820159,US +3497820160,3497852927,CA +3497852928,3498254591,US +3498254592,3498254847,JM +3498254848,3498287103,US +3498287104,3498295295,JM +3498295296,3498509055,US +3498509056,3498509311,PR +3498509312,3498513151,US +3498513152,3498513407,CL +3498513408,3498513919,US +3498513920,3498514431,CL +3498514432,3498587135,US +3498587136,3498588159,NL +3498588160,3498599935,US +3498599936,3498600191,WS +3498600192,3498708991,US +3498708992,3498717183,JM +3498717184,3498760191,US +3498760192,3498761215,PR +3498761216,3498761727,US +3498761728,3498761983,PR +3498761984,3498812415,US +3498812416,3498812671,PF +3498812672,3499299327,US +3499299328,3499299583,WS +3499299584,3499403263,US +3499403264,3499403775,MW +3499403776,3499436031,US +3499436032,3499436287,DE +3499436288,3499450367,US +3499450368,3499451391,IN +3499451392,3499705855,US +3499705856,3499706367,MG +3499706368,3499986943,US +3499986944,3499988991,KY +3499988992,3500126207,US +3500126208,3500126463,SE +3500126464,3500126719,GB +3500126720,3500351487,US +3500351488,3500359679,JM +3500359680,3500689407,US +3500689408,3500689919,CL +3500689920,3500728319,US +3500728320,3500736511,KY +3500736512,3500759551,US +3500759552,3500761087,KY +3500761088,3500807019,US +3500807020,3500807023,GB +3500807024,3500807195,US +3500807196,3500807199,GB +3500807200,3500807299,US +3500807300,3500807303,GB +3500807304,3500813219,US +3500813220,3500813223,GB +3500813224,3501168383,US +3501168384,3501168511,GB +3501168512,3501183487,US +3501183488,3501183743,GB +3501183744,3501368831,US +3501368832,3501369087,NL +3501369088,3501376147,US +3501376148,3501376151,NL +3501376152,3501378047,US +3501378048,3501378303,DE +3501378304,3501522943,US +3501522944,3501588479,CA +3501588480,3502439167,US +3502439168,3502439423,PK +3502439424,3502470143,US +3502470144,3502471167,MX +3502471168,3502518783,US +3502518784,3502519295,LK +3502519296,3502541055,US +3502541056,3502541311,CA +3502541312,3502545663,US +3502545664,3502545919,BS +3502545920,3502683135,US +3502683136,3502683391,MC +3502683392,3502993407,US +3502993408,3502993919,NL +3502993920,3503206399,US +3503206400,3503206911,CR +3503206912,3503250431,US +3503250432,3503250943,PK +3503250944,3503323135,US +3503323136,3503323647,KE +3503323648,3503386111,US +3503386112,3503386367,CH +3503386368,3503454719,US +3503454720,3503454975,AZ +3503454976,3503478783,US +3503478784,3503479039,DE +3503479040,3503738879,US +3503738880,3503740927,CO +3503740928,3503890431,US +3503890432,3503894527,CO +3503894528,3503990783,US +3503990784,3503992831,AE +3503992832,3504086015,US +3504086016,3504086527,LI +3504086528,3504136191,US +3504136192,3504138239,AZ +3504138240,3504193535,US +3504193536,3504194559,EC +3504194560,3504207871,US +3504207872,3504208127,CA +3504208128,3504223743,US +3504223744,3504223999,RO +3504224000,3504521215,US +3504521216,3504521727,GU +3504521728,3504889343,US +3504889344,3504889855,PK +3504889856,3504922623,US +3504922624,3504923391,PH +3504923392,3504928687,US +3504928688,3504928695,IT +3504928696,3504932351,US +3504932352,3504932863,BD +3504932864,3505004543,US +3505004544,3505005823,PR +3505005824,3505006079,DO +3505006080,3505012735,PR +3505012736,3505112063,US +3505112064,3505112319,EC +3505112320,3505112575,US +3505112576,3505112831,EC +3505112832,3505119231,US +3505119232,3505119487,PH +3505119488,3505121023,US +3505121024,3505121279,PH +3505121280,3505270271,US +3505270272,3505270527,JM +3505270528,3505270783,HT +3505270784,3505416703,US +3505416704,3505417471,MX +3505417472,3505424383,US +3505424384,3505425407,PK +3505425408,3505474559,US +3505474560,3505474815,GU +3505474816,3505511679,US +3505511680,3505511935,RO +3505511936,3505661951,US +3505661952,3505662463,JM +3505662464,3505818623,US +3505818624,3505819647,BS +3505819648,3506043135,US +3506043136,3506044927,PA +3506044928,3506231807,US +3506231808,3506232063,IN +3506232064,3506765823,US +3506765824,3506831359,CA +3506831360,3507012607,US +3507012608,3507012639,GR +3507012640,3507025407,US +3507025408,3507025663,IQ +3507025664,3507037183,US +3507037184,3507037439,DE +3507037440,3507055903,US +3507055904,3507055911,HK +3507055912,3507290111,US +3507290112,3507355647,AR +3507355648,3507421183,US +3507421184,3507421439,CA +3507421440,3507422207,US +3507422208,3507422719,CA +3507422720,3507423231,US +3507423232,3507423487,CA +3507423488,3507423743,US +3507423744,3507423999,CA +3507424000,3507424511,US +3507424512,3507424767,CA +3507424768,3507425023,US +3507425024,3507425279,CA +3507425280,3507426303,US +3507426304,3507426815,CA +3507426816,3507427583,US +3507427584,3507427839,CA +3507427840,3507428095,US +3507428096,3507428351,GB +3507428352,3507430655,US +3507430656,3507430911,CA +3507430912,3507433215,US +3507433216,3507433727,CA +3507433728,3507433983,US +3507433984,3507434239,CA +3507434240,3507434495,US +3507434496,3507436031,CA +3507436032,3507436799,US +3507436800,3507437055,CA +3507437056,3507437311,US +3507437312,3507445759,CA +3507445760,3507449855,US +3507449856,3507453951,CA +3507453952,3507454975,US +3507454976,3507455999,CA +3507456000,3507456255,US +3507456256,3507456511,CA +3507456512,3507458047,US +3507458048,3507462143,CA +3507462144,3507465727,US +3507465728,3507486719,CA +3507486720,3507585023,US +3507585024,3507601407,CA +3507601408,3507748863,US +3507748864,3507749375,CA +3507749376,3507749631,US +3507749632,3507765247,CA +3507765248,3507809279,US +3507809280,3507809535,BG +3507809536,3508109311,US +3508109312,3508109583,CA +3508109584,3508109679,US +3508109680,3508110591,CA +3508110592,3508111359,US +3508111360,3508111615,CA +3508111616,3508111871,US +3508111872,3508112895,CA +3508112896,3508113151,US +3508113152,3508113919,CA +3508113920,3508114431,US +3508114432,3508114687,ID +3508114688,3508117759,CA +3508117760,3508118015,US +3508118016,3508119807,CA +3508119808,3508120319,US +3508120320,3508120575,CA +3508120576,3508120831,US +3508120832,3508122111,CA +3508122112,3508122367,US +3508122368,3508122623,CA +3508122624,3508123135,US +3508123136,3508123647,CA +3508123648,3508123903,US +3508123904,3508125439,CA +3508125440,3508125951,US +3508125952,3508126463,CA +3508126464,3508126719,US +3508126720,3508127487,CA +3508127488,3508127743,US +3508127744,3508130047,CA +3508130048,3508130303,US +3508130304,3508130559,CA +3508130560,3508130815,US +3508130816,3508132095,CA +3508132096,3508132351,US +3508132352,3508132607,CA +3508132608,3508132863,US +3508132864,3508134143,CA +3508134144,3508135423,US +3508135424,3508135679,CA +3508135680,3508136447,US +3508136448,3508137375,CA +3508137376,3508137407,US +3508137408,3508142079,CA +3508142080,3508220927,US +3508220928,3508221951,KY +3508221952,3508222975,US +3508222976,3508223999,KY +3508224000,3508224255,BM +3508224256,3508243967,US +3508243968,3508244223,BM +3508244224,3508273407,US +3508273408,3508273663,MX +3508273664,3508278527,US +3508278528,3508278783,AU +3508278784,3508279039,US +3508279040,3508279295,VE +3508279296,3508279807,US +3508279808,3508280063,JP +3508280064,3508280319,TH +3508280320,3508280575,JP +3508280576,3508280831,TW +3508280832,3508281087,JP +3508281088,3508281343,KR +3508281344,3508281599,PH +3508281600,3508281855,NZ +3508281856,3508282111,US +3508282112,3508282367,HK +3508282368,3508282623,US +3508282624,3508282879,AU +3508282880,3508283135,US +3508283136,3508283391,HK +3508283392,3508283647,US +3508283648,3508283903,AU +3508283904,3508284159,MY +3508284160,3508284415,SG +3508284416,3508284671,AU +3508284672,3508286207,US +3508286208,3508286463,SE +3508286464,3508286719,HK +3508286720,3508288255,US +3508288256,3508288511,JP +3508288512,3508289023,US +3508289024,3508289279,AU +3508289280,3508289535,US +3508289536,3508289791,CA +3508289792,3508291327,US +3508291328,3508292095,GB +3508292096,3508292351,CH +3508292352,3508292863,US +3508292864,3508294143,DE +3508294144,3508295679,US +3508295680,3508295935,GB +3508295936,3508296959,US +3508296960,3508297215,CH +3508297216,3508297471,US +3508297472,3508297727,IT +3508297728,3508298239,US +3508298240,3508298495,DE +3508298496,3508298751,US +3508298752,3508299007,ES +3508299008,3508299263,BE +3508299264,3508299519,GB +3508299520,3508299775,US +3508299776,3508300031,SE +3508300032,3508300287,DE +3508300288,3508303615,US +3508303616,3508303871,DE +3508303872,3508304383,US +3508304384,3508304639,DE +3508304640,3508306943,US +3508306944,3508307199,CH +3508307200,3508308991,US +3508308992,3508309247,BE +3508309248,3508310527,SE +3508310528,3508310783,DE +3508310784,3508311039,BE +3508311040,3508311295,NL +3508311296,3508311807,IE +3508311808,3508312063,US +3508312064,3508312319,NL +3508312320,3508312575,CH +3508312576,3508312831,US +3508312832,3508313343,DE +3508313344,3508313599,SE +3508313600,3508313855,DK +3508313856,3508314367,GB +3508314368,3508314623,US +3508314624,3508314879,DK +3508314880,3508315135,US +3508315136,3508315391,NO +3508315392,3508315647,US +3508315648,3508315903,FR +3508315904,3508316159,US +3508316160,3508316415,PT +3508316416,3508316671,GB +3508316672,3508316927,US +3508316928,3508317183,SE +3508317184,3508317439,US +3508317440,3508317695,DE +3508317696,3508317951,US +3508317952,3508318463,FI +3508318464,3508318719,LU +3508318720,3508318975,IT +3508318976,3508319487,IL +3508319488,3508319743,RU +3508319744,3508319999,CH +3508320000,3508320255,SE +3508320256,3508320767,US +3508320768,3508321791,BE +3508321792,3508322303,US +3508322304,3508322559,GB +3508322560,3508322815,FI +3508322816,3508323071,NO +3508323072,3508323327,US +3508323328,3508323583,NO +3508323584,3508323839,DE +3508323840,3508324095,FI +3508324096,3508324351,IT +3508324352,3508324607,CH +3508324608,3508324863,NO +3508324864,3508325119,GB +3508325120,3508325375,DE +3508325376,3508325631,US +3508325632,3508325887,ZA +3508325888,3508326399,SE +3508326400,3508326655,GB +3508326656,3508326911,ZA +3508326912,3508327167,IT +3508327168,3508327679,ES +3508327680,3508327935,US +3508327936,3508328447,NE +3508328448,3508328703,BE +3508328704,3508329471,IL +3508329472,3508329727,NL +3508329728,3508329983,US +3508329984,3508330495,SE +3508330496,3508331263,GB +3508331264,3508331519,BE +3508331520,3508332031,US +3508332032,3508332287,GB +3508332288,3508332543,GR +3508332544,3508332799,IE +3508332800,3508333055,NO +3508333056,3508333311,US +3508333312,3508333823,CH +3508333824,3508334591,US +3508334592,3508334847,AU +3508334848,3508335103,SG +3508335104,3508335359,MY +3508335360,3508335615,AU +3508335616,3508336127,JP +3508336128,3508336383,SG +3508336384,3508336639,HK +3508336640,3508336895,AU +3508336896,3508337151,JP +3508337152,3508337663,PH +3508337664,3508337919,KR +3508337920,3508338175,JP +3508338176,3508338431,US +3508338432,3508338687,KR +3508338688,3508404223,CA +3508404224,3508690943,US +3508690944,3508695039,CA +3508695040,3508731903,US +3508731904,3508740095,CA +3508740096,3508744191,US +3508744192,3508744447,CA +3508744448,3508745215,US +3508745216,3508745471,CA +3508745472,3508754431,US +3508754432,3508758527,CA +3508758528,3508759551,US +3508759552,3508761343,CA +3508761344,3508762111,US +3508762112,3508762879,CA +3508762880,3508763135,US +3508763136,3508763391,CA +3508763392,3508764159,US +3508764160,3508764415,CA +3508764416,3508764671,US +3508764672,3508772863,CA +3508772864,3508774143,US +3508774144,3508774399,CA +3508774400,3508777983,US +3508777984,3508778239,CA +3508778240,3508779263,US +3508779264,3508779519,CA +3508779520,3508780031,US +3508780032,3508781055,CA +3508781056,3508782079,US +3508782080,3508782591,CA +3508782592,3508789247,US +3508789248,3508791295,CA +3508791296,3508793343,US +3508793344,3508795391,CA +3508795392,3508796159,US +3508796160,3508796415,CA +3508796416,3508796927,US +3508796928,3508797439,CA +3508797440,3508911231,US +3508911232,3508911359,CA +3508911360,3509144575,US +3509144576,3509144831,BR +3509144832,3509157887,US +3509157888,3509166079,CA +3509166080,3509215231,US +3509215232,3509223423,CA +3509223424,3509239807,US +3509239808,3509256191,NL +3509256192,3509305599,US +3509305600,3509305615,GB +3509305616,3509346303,US +3509346304,3509350711,CA +3509350712,3509350719,US +3509350720,3509354495,CA +3509354496,3509387263,US +3509387264,3509420031,PE +3509420032,3509518847,US +3509518848,3509519103,CA +3509519104,3509519871,US +3509519872,3509520127,CA +3509520128,3509520895,US +3509520896,3509521151,CA +3509521152,3509521407,US +3509521408,3509521663,CA +3509521664,3509522431,US +3509522432,3509522687,KW +3509522688,3509522943,CA +3509522944,3509524479,US +3509524480,3509524735,CA +3509524736,3509524991,US +3509524992,3509525759,CA +3509525760,3509526527,US +3509526528,3509526783,CA +3509526784,3509527807,US +3509527808,3509528063,CA +3509528064,3509529087,US +3509529088,3509529215,CA +3509529216,3509530623,US +3509530624,3509532671,CA +3509532672,3509532927,US +3509532928,3509533439,CA +3509533440,3509534719,US +3509534720,3509535231,CA +3509535232,3509535743,US +3509535744,3509535999,CA +3509536000,3509536255,US +3509536256,3509536767,CA +3509536768,3509537279,US +3509537280,3509538303,CA +3509538304,3509538559,US +3509538560,3509538815,CA +3509538816,3509539071,US +3509539072,3509539327,CA +3509539328,3509539967,US +3509539968,3509540031,CA +3509540032,3509540863,US +3509540864,3509541503,CA +3509541504,3509542911,US +3509542912,3509543167,CA +3509543168,3509543423,US +3509543424,3509543935,CA +3509543936,3509544191,US +3509544192,3509544447,CA +3509544448,3509544703,US +3509544704,3509544959,CA +3509544960,3509546095,US +3509546096,3509546111,CA +3509546112,3509546495,US +3509546496,3509547007,CA +3509547008,3509551615,US +3509551616,3509551871,CA +3509551872,3509552127,US +3509552128,3509552639,CA +3509552640,3509554431,US +3509554432,3509554959,CA +3509554960,3509555199,US +3509555200,3509555455,CA +3509555456,3509555711,US +3509555712,3509556735,CA +3509556736,3509557759,US +3509557760,3509558015,CA +3509558016,3509559039,US +3509559040,3509559295,KW +3509559296,3509559807,CA +3509559808,3509560063,US +3509560064,3509560319,CA +3509560320,3509560831,US +3509560832,3509561087,CA +3509561088,3509561343,US +3509561344,3509561599,CA +3509561600,3509561855,US +3509561856,3509562623,CA +3509562624,3509563391,US +3509563392,3509563903,CA +3509563904,3509564415,US +3509564416,3509564671,CA +3509564672,3509565183,US +3509565184,3509566463,CA +3509566464,3509567231,US +3509567232,3509569023,CA +3509569024,3509572351,US +3509572352,3509573375,CA +3509573376,3509573439,US +3509573440,3509573455,CA +3509573456,3509573631,US +3509573632,3509573887,CA +3509573888,3509574143,US +3509574144,3509575679,CA +3509575680,3509575935,US +3509575936,3509576191,CA +3509576192,3509576959,US +3509576960,3509577215,CA +3509577216,3509577983,US +3509577984,3509578239,CA +3509578240,3509579007,US +3509579008,3509579263,CA +3509579264,3509579519,US +3509579520,3509579775,CA +3509579776,3509580031,US +3509580032,3509580287,CA +3509580288,3509582335,US +3509582336,3509582847,CA +3509582848,3509583615,US +3509583616,3509583871,CA +3509583872,3509731327,US +3509731328,3509739519,CA +3509739520,3509828095,US +3509828096,3509828159,CA +3509828160,3509846015,US +3509846016,3509977087,CA +3509977088,3509993471,US +3509993472,3509997567,CA +3509997568,3510005759,US +3510005760,3510009343,CA +3510009344,3510020095,US +3510020096,3510021119,JP +3510021120,3510022143,US +3510022144,3510024191,JP +3510024192,3510240743,US +3510240744,3510240751,CA +3510240752,3510242303,US +3510242304,3510242559,OM +3510242560,3510245375,US +3510245376,3510245631,BD +3510245632,3510249471,US +3510249472,3510249983,QA +3510249984,3510253311,US +3510253312,3510253567,NC +3510253568,3510254079,US +3510254080,3510254591,CA +3510254592,3510261503,US +3510261504,3510261759,ZM +3510261760,3510263295,US +3510263296,3510263551,CA +3510263552,3510264063,US +3510264064,3510264319,UG +3510264320,3510265087,US +3510265088,3510265343,CA +3510265344,3510268671,US +3510268672,3510268927,SY +3510268928,3510269951,US +3510269952,3510270719,LY +3510270720,3510270975,SY +3510270976,3510280191,US +3510280192,3510286335,SG +3510286336,3510288383,HK +3510288384,3510321151,US +3510321152,3510321663,VG +3510321664,3510321919,AG +3510321920,3510322175,KN +3510322176,3510323199,AG +3510323200,3510324223,KN +3510324224,3510325247,AI +3510325248,3510326271,AG +3510326272,3510327295,VG +3510327296,3510328319,AG +3510328320,3510328575,KN +3510328576,3510328831,MS +3510328832,3510329599,AG +3510329600,3510329855,MS +3510329856,3510331391,AG +3510331392,3510332415,DM +3510332416,3510332927,KN +3510332928,3510333183,LC +3510333184,3510333439,MS +3510333440,3510333951,KN +3510333952,3510334975,AG +3510334976,3510335487,KN +3510335488,3510335743,AI +3510335744,3510335999,VG +3510336000,3510337279,AG +3510337280,3510337535,LC +3510337536,3510470927,US +3510470928,3510470935,IL +3510470936,3510479791,US +3510479792,3510479799,IE +3510479800,3510546431,US +3510546432,3510550527,CA +3510550528,3510788447,US +3510788448,3510788479,GB +3510788480,3510844415,US +3510844416,3510844927,CA +3510844928,3510935551,US +3510935552,3510943743,CA +3510943744,3511140351,US +3511140352,3511156735,CA +3511156736,3511257855,US +3511257856,3511258111,CN +3511258112,3511314215,US +3511314216,3511314223,CA +3511314224,3511812095,US +3511812096,3511844863,CA +3511844864,3512043519,US +3512043520,3512043775,FI +3512043776,3512052735,US +3512052736,3512052991,FI +3512052992,3512139775,US +3512139776,3512156159,CA +3512156160,3512176127,US +3512176128,3512176383,GB +3512176384,3512197119,US +3512197120,3512205311,CA +3512205312,3512205567,US +3512205568,3512205823,CL +3512205824,3512206079,AW +3512206080,3512206335,CL +3512206336,3512207103,HN +3512207104,3512207359,US +3512207360,3512209407,CO +3512209408,3512210431,US +3512210432,3512210943,NA +3512210944,3512211199,CL +3512211200,3512211455,AR +3512211456,3512221695,US +3512221696,3512221759,AG +3512221760,3512221791,GP +3512221792,3512221951,AG +3512221952,3512222207,VG +3512222208,3512222271,AG +3512222272,3512222335,KN +3512222336,3512222463,AG +3512222464,3512222975,AI +3512222976,3512223743,AG +3512223744,3512225791,ZA +3512225792,3512227839,PR +3512227840,3512229887,ZW +3512229888,3512230143,VE +3512230144,3512230911,US +3512230912,3512231167,CL +3512231168,3512231423,US +3512231424,3512231679,CL +3512231680,3512231935,VE +3512231936,3512233215,US +3512233216,3512233471,CL +3512233472,3512233727,US +3512233728,3512233983,HN +3512233984,3512236031,ZA +3512236032,3512236287,US +3512236288,3512237311,MR +3512237312,3512237823,US +3512237824,3512238079,HN +3512238080,3512240127,AW +3512240128,3512241663,BS +3512241664,3512242175,CO +3512242176,3512242431,CL +3512242432,3512242687,VE +3512242688,3512244991,EG +3512244992,3512246015,IL +3512246016,3512246783,CL +3512246784,3512247039,US +3512247040,3512247295,NG +3512247296,3512248319,US +3512248320,3512248831,CO +3512248832,3512249087,CL +3512249088,3512249343,CO +3512249344,3512256511,IL +3512256512,3512258559,CL +3512258560,3512260607,US +3512260608,3512261631,GU +3512261632,3512262655,US +3512262656,3512263679,GT +3512263680,3512264703,VE +3512264704,3512267263,US +3512267264,3512268031,TG +3512268032,3512268543,US +3512268544,3512268799,PR +3512268800,3512269055,US +3512269056,3512269311,PR +3512269312,3512269567,US +3512269568,3512269823,HN +3512269824,3512270847,US +3512270848,3512336383,CA +3512336384,3512369151,US +3512369152,3512385535,CA +3512385536,3512397823,US +3512397824,3512401919,CA +3512401920,3512418303,US +3512418304,3512451071,CA +3512451072,3512467455,PR +3512467456,3512532991,US +3512532992,3512598527,GB +3512598528,3512647679,US +3512647680,3512655871,TT +3512655872,3512678655,US +3512678656,3512678911,CA +3512678912,3512679167,AU +3512679168,3512679423,US +3512679424,3512679679,HK +3512679680,3512680191,US +3512680192,3512680447,SG +3512680448,3512688895,US +3512688896,3512689407,CA +3512689408,3512689663,US +3512689664,3512690175,CA +3512690176,3512690431,US +3512690432,3512690687,CA +3512690688,3512695295,US +3512695296,3512696319,CA +3512696320,3512696575,US +3512696576,3512696831,CA +3512696832,3512844287,US +3512844288,3512852479,CA +3512852480,3512931583,US +3512931584,3512931839,CA +3512931840,3512983551,US +3512983552,3512987647,AR +3512987648,3513188351,US +3513188352,3513204735,CA +3513204736,3513270271,US +3513270272,3513286655,CA +3513286656,3513294847,US +3513294848,3513303039,CA +3513303040,3513368575,US +3513368576,3513376767,CA +3513376768,3513475071,US +3513475072,3513491455,CA +3513491456,3513495551,US +3513495552,3513495615,CA +3513495616,3513495679,MX +3513495680,3513495743,PR +3513495744,3513495807,VI +3513495808,3513495871,UM +3513495872,3513496063,US +3513496064,3513496067,CA +3513496068,3513496071,MX +3513496072,3513496075,PR +3513496076,3513496079,VI +3513496080,3513496083,UM +3513496084,3513497087,US +3513497088,3513497151,CA +3513497152,3513497215,MX +3513497216,3513497279,PR +3513497280,3513497343,VI +3513497344,3513497407,UM +3513497408,3513500415,US +3513500416,3513500671,AU +3513500672,3513778175,US +3513778176,3513794559,CA +3513794560,3514007551,US +3514007552,3514040319,CA +3514040320,3514367999,US +3514368000,3514433535,CA +3514433536,3514589439,US +3514589440,3514589695,GT +3514589696,3514590207,SV +3514590208,3514590719,NI +3514590720,3514591103,SV +3514591104,3514591487,US +3514591488,3514592255,NI +3514592256,3514593279,SV +3514593280,3514596863,US +3514596864,3514597375,SV +3514597376,3514721301,US +3514721302,3514721303,BZ +3514721304,3514721385,US +3514721386,3514721391,BZ +3514721392,3514723693,US +3514723694,3514723695,BZ +3514723696,3514723696,US +3514723697,3514723697,BZ +3514723698,3514724455,US +3514724456,3514724456,BZ +3514724457,3514761215,US +3514826752,3514843135,CA +3514843136,3514993983,US +3514993984,3514993987,FR +3514993988,3514993991,DE +3514993992,3514994007,GB +3514994008,3514994015,DK +3514994016,3514994016,GB +3514994017,3514994023,DK +3514994024,3515211775,US +3515211776,3515219967,CA +3515219968,3515301887,US +3515301888,3515318271,CA +3515318272,3515596799,US +3515596800,3515613183,CA +3515613184,3515688686,US +3515688687,3515688687,PT +3515688688,3515711487,US +3515711488,3515731967,CA +3515731968,3515736063,US +3515736064,3515744255,DE +3515744256,3515760639,CA +3515760640,3515844095,US +3515844096,3515844607,GB +3515844608,3515965439,US +3515965440,3515973631,CA +3515973632,3515990015,US +3515990016,3516006399,CA +3516006400,3516039167,US +3516039168,3516071935,CA +3516071936,3516088831,US +3516088832,3516088832,GB +3516088833,3516094207,US +3516094208,3516094208,GB +3516094209,3516095487,US +3516095488,3516095488,GB +3516095489,3516139007,US +3516139008,3516139263,GB +3516139264,3516170239,US +3516170240,3516203007,CA +3516203008,3516305407,US +3516305408,3516309503,PK +3516309504,3516334079,US +3516334080,3516342271,CA +3516342272,3516357631,US +3516357632,3516357887,MY +3516357888,3516358143,CA +3516358144,3516358655,US +3516366848,3516370943,CA +3516370944,3516514303,US +3516514304,3516530687,CA +3516530688,3516643083,US +3516643084,3516643087,PR +3516643088,3516899327,US +3516899328,3516899839,ZA +3516899840,3516900031,NG +3516900032,3516900063,US +3516900064,3516900095,NG +3516900096,3516900351,ZA +3516900352,3516900607,NG +3516900608,3516900863,ZA +3516900864,3516902399,US +3516902400,3516902655,ZA +3516902656,3516902911,US +3516902912,3516903167,ZA +3516903168,3516903423,NG +3516903424,3516907519,CA +3516907520,3517019135,US +3517019136,3517019391,HN +3517019392,3517021439,US +3517021440,3517021695,NI +3517021696,3517038591,US +3517038592,3517054975,CA +3517054976,3517095935,US +3517095936,3517100031,CA +3517100032,3517112319,US +3517112320,3517116159,CA +3517116160,3517116415,US +3517116416,3517120511,CA +3517120512,3517233151,US +3517233152,3517235199,GU +3517235200,3517382655,US +3517382656,3517383167,CA +3517383168,3517383423,US +3517383424,3517384703,CA +3517384704,3517385407,US +3517385408,3517385439,CA +3517385440,3517385471,US +3517385472,3517385727,CA +3517385728,3517385983,US +3517385984,3517387263,CA +3517387264,3517387519,US +3517387520,3517387775,CA +3517387776,3517388287,US +3517388288,3517388799,CA +3517388800,3517389311,US +3517389312,3517389567,CA +3517389568,3517389823,US +3517389824,3517390335,CA +3517390336,3517390591,US +3517390592,3517391103,CA +3517391104,3517391871,US +3517391872,3517392127,CA +3517392128,3517392383,US +3517392384,3517392639,CA +3517392640,3517392895,US +3517392896,3517393407,CA +3517393408,3517394431,US +3517394432,3517394943,CA +3517394944,3517395199,US +3517395200,3517395455,CA +3517395456,3517396751,US +3517396752,3517396767,CA +3517396768,3517397247,US +3517397248,3517397503,CA +3517397504,3517397759,US +3517397760,3517398015,CA +3517398016,3517398527,US +3517398528,3517399039,CA +3517399040,3517399807,US +3517399808,3517399871,CA +3517399872,3517400063,US +3517400064,3517400319,CA +3517400320,3517401855,US +3517401856,3517402367,CA +3517402368,3517402623,US +3517402624,3517402879,CA +3517402880,3517403647,US +3517403648,3517403903,CA +3517403904,3517404415,US +3517404416,3517404927,CA +3517404928,3517405183,US +3517405184,3517405439,CA +3517405440,3517405695,US +3517405696,3517406719,CA +3517406720,3517406975,US +3517406976,3517407231,CA +3517407232,3517407743,US +3517407744,3517407999,CA +3517408000,3517408255,US +3517408256,3517408511,CA +3517408512,3517409023,US +3517409024,3517409279,CA +3517409280,3517409791,US +3517409792,3517411071,CA +3517411072,3517411327,US +3517411328,3517414399,CA +3517414400,3517415167,US +3517415168,3517415423,CA +3517415424,3517416919,US +3517416920,3517416927,CA +3517416928,3517416959,US +3517416960,3517417471,CA +3517417472,3517418495,US +3517418496,3517419007,CA +3517419008,3517419519,US +3517419520,3517420031,CA +3517420032,3517420375,US +3517420376,3517420383,CA +3517420384,3517420799,US +3517420800,3517421567,CA +3517421568,3517421823,US +3517421824,3517422079,CA +3517422080,3517422847,US +3517422848,3517423359,CA +3517423360,3517423423,US +3517423424,3517423455,CA +3517423456,3517423487,US +3517423488,3517423519,CA +3517423520,3517423871,US +3517423872,3517424127,CA +3517424128,3517424767,US +3517424768,3517424831,CA +3517424832,3517425407,US +3517425408,3517425919,CA +3517425920,3517426751,US +3517426752,3517426815,CA +3517426816,3517426943,US +3517426944,3517427711,CA +3517427712,3517428735,US +3517428736,3517429503,CA +3517429504,3517430271,US +3517430272,3517430527,CA +3517430528,3517432319,US +3517432320,3517433343,CA +3517433344,3517434111,US +3517434112,3517434367,CA +3517434368,3517435135,US +3517435136,3517435391,CA +3517435392,3517435647,US +3517435648,3517436415,CA +3517436416,3517436671,US +3517436672,3517436927,CA +3517436928,3517437183,US +3517437184,3517437439,CA +3517437440,3517437695,US +3517437696,3517437951,CA +3517437952,3517438207,US +3517438208,3517438463,CA +3517438464,3517438943,US +3517438944,3517439231,CA +3517439232,3517439743,US +3517439744,3517441279,CA +3517441280,3517441535,US +3517441536,3517441791,CA +3517441792,3517442175,US +3517442176,3517442207,CA +3517442208,3517442559,US +3517442560,3517442623,CA +3517442624,3517442815,US +3517442816,3517443583,CA +3517443584,3517444863,US +3517444864,3517445119,CA +3517445120,3517445631,US +3517445632,3517445887,CA +3517445888,3517446143,US +3517446144,3517446655,CA +3517446656,3517447167,US +3517447168,3517447679,CA +3517447680,3517447863,US +3517447864,3517447871,CA +3517447872,3517447935,US +3517447936,3517448191,CA +3517448192,3517546495,US +3517546496,3517562879,CA +3517562880,3517597695,US +3517597696,3517597951,IE +3517597952,3517602047,US +3517602048,3517602303,DE +3517602304,3517607935,US +3517607936,3517608191,DE +3517608192,3517608447,US +3517608448,3517608703,GB +3517608704,3517609727,US +3517609728,3517609743,AT +3517609744,3517610159,US +3517610160,3517610175,DE +3517610176,3517644799,US +3517644800,3517710335,CA +3517710336,3517718527,US +3517718528,3517726719,CA +3517726720,3517990911,US +3517990912,3517991423,CA +3517991424,3518058495,US +3518058496,3518059007,CN +3518059008,3518059263,US +3518059264,3518059519,CN +3518059520,3518059775,HK +3518059776,3518060031,US +3518060032,3518060287,CN +3518060288,3518060799,US +3518060800,3518061055,CN +3518061056,3518062079,US +3518062080,3518062591,CN +3518062592,3518066687,CA +3518066688,3518075647,US +3518075648,3518075903,AU +3518075904,3518076671,US +3518076672,3518076927,PA +3518076928,3518374719,US +3518374720,3518374783,IN +3518374784,3518380223,US +3518380224,3518380287,DE +3518380288,3518381055,US +3518381056,3518381311,IN +3518381312,3518381439,US +3518381440,3518381567,IN +3518381568,3518381631,DE +3518381632,3518392575,US +3518392576,3518392831,NL +3518392832,3518393087,US +3518393088,3518393343,SG +3518393344,3518393599,US +3518393600,3518393855,GB +3518393856,3518422271,US +3518422272,3518422527,CA +3518422528,3518424063,US +3518424064,3518425087,CA +3518425088,3518431231,US +3518431232,3518439423,CA +3518439424,3518463999,US +3518464000,3518472191,CA +3518472192,3518762495,US +3518762496,3518762751,GB +3518762752,3518918143,US +3518918144,3518918399,IN +3518918400,3518919423,US +3518919424,3518919679,IN +3518919680,3518929535,US +3518929536,3518929599,CA +3518929600,3519234047,US +3519234048,3519250431,CA +3519250432,3519319807,US +3519319808,3519320063,CA +3519320064,3519320319,US +3519320320,3519322623,CA +3519322624,3519322879,US +3519322880,3519323135,CA +3519323136,3519340543,US +3519340544,3519344639,CA +3519344640,3519354909,US +3519354910,3519354910,BR +3519354911,3519381503,US +3519381504,3519397887,CA +3519397888,3519475711,US +3519475712,3519476223,BH +3519476224,3519477759,DE +3519477760,3519578367,US +3519578368,3519578623,NA +3519578624,3519578879,US +3519578880,3519579135,CA +3519579136,3519579967,US +3519579968,3519579983,CY +3519579984,3519586303,US +3519586304,3519586559,GB +3519586560,3519590655,US +3519590656,3519590911,CA +3519590912,3519603772,US +3519603773,3519603781,IN +3519603782,3519676415,US +3519676416,3519709183,CA +3519709184,3519723519,US +3519723520,3519724031,CA +3519724032,3519741951,US +3519741952,3519758335,ZA +3519758336,3519772927,US +3519772928,3519773183,AS +3519773184,3519799807,US +3519799808,3519800575,CA +3519800576,3519801087,US +3519801088,3519801215,CA +3519801216,3519801223,US +3519801224,3519801343,CA +3519801344,3519803647,US +3519803648,3519803903,CA +3519803904,3519804159,US +3519804160,3519805183,CA +3519805184,3519806975,US +3519806976,3519807487,CA +3519807488,3519856639,US +3519856640,3519868927,CA +3519868928,3519869183,US +3519869184,3519869439,GB +3519869440,3519870207,US +3519870208,3519870463,GB +3519870464,3519871231,US +3519871232,3519871487,GB +3519871488,3519873023,US +3519873024,3519874559,CA +3519874560,3519875071,US +3519875072,3519877119,CA +3519877120,3519877167,US +3519877168,3519877183,CA +3519877184,3519877887,US +3519877888,3519878143,CA +3519878144,3519878271,US +3519878272,3519878303,CA +3519878304,3519879727,US +3519879728,3519879735,CA +3519879736,3519879935,US +3519879936,3519880447,CA +3519880448,3519881215,US +3519881216,3519884031,CA +3519884032,3519884287,US +3519884288,3519901695,CA +3519901696,3519930367,US +3519934464,3519938559,CA +3519938560,3519940607,IL +3519940608,3519940863,FR +3519940864,3519941887,IL +3519941888,3519942143,IT +3519942144,3519946751,IL +3519946752,3519948287,US +3519948288,3519948799,DE +3519948800,3519967231,US +3519967232,3519969279,CA +3519969280,3519971071,US +3519971072,3519971327,CA +3519971328,3520020479,US +3520020480,3520036863,CA +3520036864,3520192511,US +3520192512,3520192767,GB +3520192768,3520193023,DE +3520193024,3520193279,GB +3520193280,3520193535,DE +3520193536,3520194303,GB +3520194304,3520196607,US +3520196608,3520196863,IN +3520196864,3520196991,IL +3520196992,3520197119,IN +3520197120,3520197631,US +3520197632,3520197759,AU +3520197760,3520197887,RU +3520197888,3520198143,US +3520198144,3520198271,DE +3520198272,3520198399,MX +3520198400,3520198527,ES +3520198528,3520198655,JP +3520198656,3520198911,US +3520198912,3520199039,MX +3520199040,3520199167,AU +3520199168,3520199295,HK +3520199296,3520199423,DE +3520199424,3520199551,JP +3520199552,3520199807,GB +3520199808,3520199935,HK +3520199936,3520200447,GB +3520200448,3520200575,IN +3520200576,3520200703,FR +3520200704,3520356351,US +3520356352,3520364543,ZA +3520364544,3520390143,US +3520390144,3520390399,JP +3520390400,3520409599,US +3520409600,3520413439,DE +3520413440,3520413695,CA +3520413696,3520454655,US +3520454656,3520462847,CA +3520462848,3520626687,US +3520626688,3520634879,CA +3520634880,3520675839,US +3520675840,3520692223,CA +3520692224,3520937983,US +3520937984,3520954367,CA +3520954368,3520994815,US +3520994816,3520995071,GB +3520995072,3520995327,JP +3520995328,3520999423,US +3520999424,3521003519,CA +3521003520,3521028095,US +3521028096,3521032191,CA +3521032192,3521044479,US +3521044480,3521048575,CA +3521048576,3521086207,US +3521086208,3521086463,AU +3521086464,3521196287,US +3521196288,3521196543,AR +3521196544,3521216511,US +3521216512,3521220351,CA +3521220352,3521220607,US +3521220608,3521224959,CA +3521224960,3521225215,US +3521225216,3521232895,CA +3521232896,3521249279,US +3521249280,3521314815,CA +3521314816,3521347583,US +3521347584,3521358399,CA +3521358400,3521358463,US +3521358464,3521358655,CA +3521358656,3521358719,US +3521358720,3521358783,CA +3521358784,3521358815,US +3521358816,3521361375,CA +3521361376,3521361391,US +3521361392,3521361423,CA +3521361424,3521361439,US +3521361440,3521363967,CA +3521363968,3521380351,IT +3521380352,3521837055,US +3521837056,3521837311,SG +3521837312,3521904639,US +3521904640,3521921023,JM +3521921024,3521965055,US +3521965056,3521966079,DE +3521966080,3522101247,US +3522101248,3522109439,CA +3522109440,3522118143,US +3522118144,3522118655,GB +3522118656,3522118911,US +3522118912,3522119679,GB +3522119680,3522119935,US +3522119936,3522120191,LY +3522120192,3522120447,US +3522120448,3522121215,AE +3522121216,3522121471,US +3522121472,3522121983,AE +3522121984,3522122239,AW +3522122240,3522123519,US +3522123520,3522123775,GB +3522123776,3522125055,US +3522125056,3522125311,GB +3522125312,3522131845,US +3522131846,3522131846,BZ +3522131847,3522131858,US +3522131859,3522131859,DE +3522131860,3522133639,US +3522133640,3522133647,DE +3522133648,3522133663,US +3522133664,3522133695,DE +3522133696,3522174975,US +3522174976,3522179071,BM +3522179072,3522195455,US +3522195456,3522199551,CA +3522199552,3522854911,US +3522854912,3522871295,CA +3522871296,3522893823,US +3522893824,3522894847,CA +3522894848,3522902015,US +3522902016,3522903039,CA +3522903040,3522903807,US +3522903808,3522904063,CA +3522904064,3522940415,US +3522940416,3522940671,HK +3522940672,3522950655,US +3522950656,3522951167,CA +3522951168,3522952191,US +3522952192,3522952703,JE +3522952704,3523215359,US +3523215360,3523223551,AU +3523223552,3523231743,KR +3523231744,3523248127,AU +3523248128,3523280895,HK +3523280896,3523297279,TH +3523297280,3523317759,PH +3523317760,3523330047,JP +3523330048,3523338239,AU +3523338240,3523339775,MY +3523339776,3523340287,HK +3523340288,3523341311,AU +3523341312,3523342335,JP +3523342336,3523346431,BD +3523346432,3523354623,CN +3523354624,3523362815,KR +3523362816,3523379199,VN +3523379200,3523395583,PK +3523395584,3523411967,JP +3523411968,3523477503,HK +3523477504,3523493887,PH +3523493888,3523497983,BD +3523497984,3523500031,AU +3523500032,3523502079,KR +3523502080,3523510271,PH +3523510272,3523518463,TH +3523518464,3523526655,JP +3523526656,3523530751,US +3523530752,3523532799,NZ +3523532800,3523534847,KR +3523534848,3523538943,AU +3523538944,3523543039,JP +3523543040,3523551231,CN +3523551232,3523553279,AU +3523553280,3523555327,MY +3523555328,3523557375,NZ +3523557376,3523559423,HK +3523559424,3523575807,PH +3523575808,3523583999,CN +3523584000,3523596359,HK +3523596360,3523596375,PK +3523596376,3523596783,HK +3523596784,3523596791,PK +3523596792,3523596927,HK +3523596928,3523597055,PK +3523597056,3523597063,HK +3523597064,3523597103,PK +3523597104,3523597119,HK +3523597120,3523597127,PK +3523597128,3523597567,HK +3523597568,3523597823,PK +3523597824,3523601663,HK +3523601664,3523601919,SA +3523601920,3523674111,HK +3523674112,3523682303,FJ +3523682304,3523686399,NZ +3523686400,3523688447,AU +3523688448,3523690495,CN +3523690496,3523698687,IN +3523698688,3523698863,HK +3523698864,3523698879,JP +3523698880,3523698943,HK +3523698944,3523698975,JP +3523698976,3523699007,HK +3523699008,3523699071,JP +3523699072,3523699199,HK +3523699200,3523699711,US +3523699712,3523700223,JP +3523700224,3523700287,US +3523700288,3523700351,JP +3523700352,3523700415,US +3523700416,3523700671,JP +3523700672,3523700679,HK +3523700680,3523700735,JP +3523700736,3523701759,HK +3523701760,3523702783,JP +3523702784,3523702799,SG +3523702800,3523702807,SN +3523702808,3523702847,SG +3523702848,3523702871,JP +3523702872,3523702911,SG +3523702912,3523703039,JP +3523703040,3523703103,SG +3523703104,3523704703,JP +3523704704,3523704719,SG +3523704720,3523704751,JP +3523704752,3523704783,SG +3523704784,3523704791,JP +3523704792,3523704831,SG +3523704832,3523704839,HK +3523704840,3523706879,JP +3523706880,3523707039,AU +3523707040,3523707071,JP +3523707072,3523707103,AU +3523707104,3523707119,JP +3523707120,3523707135,AU +3523707136,3523707903,GB +3523707904,3523708159,AU +3523708160,3523708287,JP +3523708288,3523708319,AU +3523708320,3523708351,JP +3523708352,3523708415,AU +3523708416,3523708927,JP +3523708928,3523708975,AU +3523708976,3523708991,JP +3523708992,3523709183,AU +3523709184,3523713023,JP +3523713024,3523713135,AU +3523713136,3523714047,JP +3523714048,3523714719,AU +3523714720,3523714799,JP +3523714800,3523714943,AU +3523714944,3523715007,GB +3523715008,3523715031,JP +3523715032,3523715071,AU +3523715072,3523723263,JP +3523723264,3523725311,US +3523725312,3523737599,JP +3523737600,3523738111,US +3523738112,3523739647,JP +3523739648,3524001791,AU +3524001792,3524132863,CN +3524132864,3524145151,PH +3524145152,3524149247,JP +3524149248,3524157439,CN +3524157440,3524161535,AU +3524161536,3524247551,CN +3524247552,3524263935,AU +3524263936,3524266495,PH +3524266496,3524266751,SG +3524266752,3524274175,PH +3524274176,3524274431,SG +3524274432,3524280319,PH +3524280320,3524281343,JP +3524281344,3524282367,AU +3524282368,3524288511,IN +3524288512,3524289535,HK +3524289536,3524290559,IN +3524290560,3524291327,CN +3524291328,3524291583,TW +3524291584,3524294655,IN +3524294656,3524295679,SG +3524295680,3524296703,MY +3524296704,3524313087,CN +3524313088,3524329471,KR +3524329472,3524362239,TW +3524362240,3524370687,HK +3524370688,3524370943,JP +3524370944,3524386303,HK +3524386304,3524386559,JP +3524386560,3524395007,HK +3524395008,3524444159,IN +3524444160,3524460543,AU +3524460544,3524526079,MY +3524526080,3524591615,JP +3524591616,3524722687,CN +3524722688,3524730879,SG +3524730880,3524739071,CN +3524739072,3524743167,ID +3524743168,3524747263,MP +3524747264,3524755455,PH +3524755456,3524763647,AU +3524763648,3524781791,PH +3524781792,3524781823,SG +3524781824,3524788223,PH +3524788224,3524790271,SG +3524790272,3524790527,JP +3524790528,3524790815,SG +3524790816,3524790911,JP +3524790912,3524790975,SG +3524790976,3524791615,JP +3524791616,3524791647,SG +3524791648,3524791775,JP +3524791776,3524791791,SG +3524791792,3524791807,JP +3524791808,3524792063,SG +3524792064,3524792223,JP +3524792224,3524792255,SG +3524792256,3524792287,JP +3524792288,3524792319,SG +3524792320,3524793855,JP +3524793856,3524794111,SG +3524794112,3524794175,JP +3524794176,3524794207,SG +3524794208,3524794239,JP +3524794240,3524794303,SG +3524794304,3524794367,JP +3524794368,3524801023,SG +3524801024,3524801055,JP +3524801056,3524801087,SG +3524801088,3524801287,JP +3524801288,3524801295,SG +3524801296,3524801535,JP +3524801536,3524801791,SG +3524801792,3524801983,JP +3524801984,3524802023,SG +3524802024,3524802047,JP +3524802048,3524802303,SG +3524802304,3524802335,JP +3524802336,3524802351,SG +3524802352,3524802367,JP +3524802368,3524802383,SG +3524802384,3524802559,JP +3524802560,3524804863,SG +3524804864,3524809215,JP +3524809216,3524809727,SG +3524809728,3524810239,JP +3524810240,3524810495,SG +3524810496,3524812799,JP +3524812800,3524821503,SG +3524821504,3524821759,JP +3524821760,3524821823,SG +3524821824,3524821855,JP +3524821856,3524821951,SG +3524821952,3524821983,JP +3524821984,3524823807,SG +3524823808,3524824063,JP +3524824064,3524825855,SG +3524825856,3524826367,JP +3524826368,3524827167,SG +3524827168,3524827199,JP +3524827200,3524827231,SG +3524827232,3524827327,JP +3524827328,3524827359,SG +3524827360,3524827391,JP +3524827392,3524827471,SG +3524827472,3524827519,JP +3524827520,3524827551,SG +3524827552,3524827615,JP +3524827616,3524828127,SG +3524828128,3524828159,JP +3524828160,3524828415,SG +3524828416,3524828417,JP +3524828418,3524828418,SG +3524828419,3524828671,JP +3524828672,3524828927,SG +3524828928,3524829183,JP +3524829184,3524829439,SG +3524829440,3524829695,JP +3524829696,3524830207,SG +3524830208,3524830463,JP +3524830464,3524830719,SG +3524830720,3524830881,JP +3524830882,3524830882,SG +3524830883,3524830975,JP +3524830976,3524831231,SG +3524831232,3524831487,JP +3524831488,3524832511,SG +3524832512,3524832767,JP +3524832768,3524833343,SG +3524833344,3524833535,JP +3524833536,3524833791,SG +3524833792,3524834303,JP +3524834304,3524834815,SG +3524834816,3524835327,JP +3524835328,3524835839,SG +3524835840,3524836095,JP +3524836096,3524837119,SG +3524837120,3524837375,JP +3524837376,3524838399,SG +3524838400,3524838655,JP +3524838656,3524839167,SG +3524839168,3524839215,JP +3524839216,3524839231,SG +3524839232,3524839295,JP +3524839296,3524839359,SG +3524839360,3524839935,JP +3524839936,3524840447,SG +3524840448,3524840703,JP +3524840704,3524840959,SG +3524840960,3524841471,JP +3524841472,3524842751,SG +3524842752,3524843007,JP +3524843008,3524843263,SG +3524843264,3524843519,JP +3524843520,3524843775,SG +3524843776,3524844031,JP +3524844032,3524844543,SG +3524844544,3524845567,JP +3524845568,3524845823,SG +3524845824,3524846079,JP +3524846080,3524846335,SG +3524846336,3524846591,JP +3524846592,3524847359,SG +3524847360,3524847615,JP +3524847616,3524847871,SG +3524847872,3524848127,JP +3524848128,3524848383,SG +3524848384,3524848639,JP +3524848640,3524849407,SG +3524849408,3524849663,JP +3524849664,3524849919,SG +3524849920,3524850175,JP +3524850176,3524850431,SG +3524850432,3524850687,JP +3524850688,3524851455,SG +3524851456,3524853759,JP +3524853760,3526361087,CN +3526361088,3526393855,NZ +3526393856,3526395903,JP +3526395904,3526397951,HK +3526397952,3526402047,MY +3526402048,3526410239,NZ +3526410240,3526414335,MY +3526414336,3526416383,AU +3526416384,3526418431,MY +3526418432,3526426623,JP +3526426624,3526557695,AU +3526557696,3526651135,CN +3526651136,3526651391,KP +3526651392,3526754303,CN +3526754304,3526885375,NZ +3526885376,3526893567,PK +3526893568,3526897663,NZ +3526897664,3526901759,HK +3526901760,3526909951,AU +3526909952,3526918143,IN +3526918144,3526922239,SG +3526922240,3526924287,IN +3526924288,3526926335,AU +3526926336,3526934527,JP +3526934528,3526942719,CN +3526942720,3526950911,AU +3526950912,3526951935,MY +3526951936,3526952959,JP +3526952960,3526953983,ID +3526953984,3526954495,JP +3526954496,3526954751,PH +3526954752,3526955007,JP +3526955008,3526955263,US +3526955264,3526956287,JP +3526956288,3526956799,HK +3526956800,3526966271,JP +3526966272,3526966783,HK +3526966784,3526967295,SG +3526967296,3526971439,JP +3526971440,3526971443,HK +3526971444,3526971531,JP +3526971532,3526971535,HK +3526971536,3526971647,JP +3526971648,3526972159,HK +3526972160,3527002111,JP +3527002112,3527003647,IN +3527003648,3527004159,JP +3527004160,3527008255,ID +3527008256,3527016447,KR +3527016448,3527933951,TW +3527933952,3528392703,CN +3528392704,3528396799,JP +3528396800,3528400895,AU +3528400896,3528404991,JP +3528404992,3528407039,NZ +3528409088,3528425471,CN +3528441856,3528445951,JP +3528445952,3528450047,ID +3528450048,3528458239,CN +3528458240,3528474623,SG +3528474624,3528482815,TW +3528482816,3528491007,KR +3528491008,3528507391,AU +3528507392,3528589311,JP +3528589312,3528720383,CN +3528720384,3528785919,AU +3528785920,3528851455,TW +3528851456,3528884223,NZ +3528884224,3528908799,TH +3528908800,3528912895,VN +3528912896,3528933375,AU +3528949760,3528966143,CN +3528966144,3528974335,KR +3528974336,3528978431,JP +3528978432,3528982527,HK +3528982528,3529056255,JP +3529056256,3529064447,IN +3529064448,3529072639,HK +3529072640,3529080831,JP +3529080832,3529089023,AU +3529089024,3529097215,KR +3529097216,3529113599,JP +3529113600,3531603967,KR +3531603968,3532290815,JP +3532290816,3532291071,GB +3532291072,3533119487,JP +3533119488,3533121209,CN +3533121210,3533121210,JP +3533121211,3533123583,CN +3533123584,3534749695,JP +3534749696,3534757887,HK +3534757888,3534758143,AU +3534758144,3534758147,JP +3534758148,3534758399,AU +3534758400,3534758655,HK +3534758656,3534758911,AU +3534758912,3534758927,PH +3534758928,3534758975,AU +3534758976,3534759039,PH +3534759040,3534759167,AU +3534759168,3534759215,JP +3534759216,3534759359,AU +3534759360,3534759391,JP +3534759392,3534759935,AU +3534759936,3534760447,US +3534760448,3534760959,NZ +3534760960,3534761727,AU +3534761728,3534761983,JP +3534761984,3534784511,HK +3534784512,3534785023,TW +3534785024,3534785043,HK +3534785044,3534785047,SG +3534785048,3534786815,HK +3534786816,3534787327,MY +3534787328,3534787583,TH +3534787584,3534863443,HK +3534863444,3534863444,CN +3534863445,3534880767,HK +3534880768,3535273983,KR +3535273984,3535274495,HK +3535274496,3535274496,ZA +3535274497,3535279103,HK +3535279104,3535279359,US +3535279360,3535280383,HK +3535280384,3535280639,JP +3535280640,3535280895,HK +3535280896,3535281151,SG +3535281152,3535282431,HK +3535282432,3535282687,JP +3535282688,3535283199,HK +3535283200,3535283455,US +3535283456,3535291903,HK +3535291904,3535292159,US +3535292160,3535292671,HK +3535292672,3535292927,SG +3535292928,3535294463,HK +3535294464,3535294719,DE +3535294720,3535294975,HK +3535294976,3535295231,DE +3535295232,3535298303,HK +3535298304,3535298304,ZA +3535298305,3535339519,HK +3535339520,3535355903,NZ +3535355904,3535372287,AU +3535372288,3535380479,JP +3535380480,3535388671,PH +3535388672,3535405055,CN +3535405056,3535536127,MY +3535536128,3535798271,JP +3535798272,3535814655,TW +3535814656,3535822847,KR +3535822848,3535831039,CN +3535831040,3535863807,TW +3535863808,3535880191,SG +3535880192,3535896575,JP +3535896576,3535905791,AU +3535905792,3535906047,US +3535906048,3535909887,AU +3535909888,3535910143,US +3535910144,3535929343,AU +3535929344,3535994879,JP +3535994880,3536060415,MY +3536060416,3536322559,JP +3536322560,3536551935,TW +3536551936,3536568319,TH +3536568320,3536584703,JP +3536584704,3536846847,KR +3536846848,3536928767,TW +3536928768,3536945151,HK +3536945152,3536977919,TW +3536977920,3537010687,IN +3537010688,3537027071,ID +3537027072,3537047551,KR +3537047552,3537049599,ID +3537049600,3537051647,HK +3537051648,3537059839,JP +3537059840,3537068031,KR +3537068032,3537076223,VN +3537076224,3537174527,IN +3537174528,3537190911,TH +3537190912,3537240063,PH +3537240064,3537305599,IN +3537305600,3537371135,AU +3537371136,3537895423,KR +3537895424,3538943999,JP +3538944000,3539271679,TW +3539271680,3539304447,VN +3539304448,3539337215,HK +3539337216,3539353599,NZ +3539353600,3539402751,TH +3539402752,3539435519,JP +3539435520,3539464191,AU +3539464192,3539468287,ID +3539468288,3541303295,JP +3541303296,3541565439,TW +3541565440,3541696511,MY +3541696512,3542089727,AU +3542089728,3542847487,KR +3542847488,3542851071,US +3542851072,3542851327,DE +3542851328,3542851583,US +3542851584,3544186879,KR +3544186880,3544711167,CN +3544711168,3545235455,TW +3545235456,3546808319,CN +3546808320,3547856895,KR +3547856896,3548208127,JP +3548208128,3548208639,US +3548208640,3548905471,JP +3548905472,3551002623,CN +3551002624,3556769791,KR +3556769792,3556773887,DE +3556786176,3556794367,RU +3556794368,3556802559,ES +3556802560,3556810751,SD +3556810752,3556818943,PT +3556818944,3556827135,MD +3556827136,3556843519,NL +3556843520,3556851711,DE +3556851712,3556868095,UA +3556868096,3556876287,GB +3556876288,3556884479,NL +3556884480,3556886527,IR +3556886528,3556888575,GB +3556888576,3556890623,US +3556890624,3556892671,GB +3556892672,3556900863,RU +3556900864,3556909055,GB +3556909056,3556925439,DE +3556925440,3556933631,PL +3556933632,3556941823,UA +3556941824,3556950015,IE +3556950016,3556958207,TR +3556958208,3556966399,KG +3556966400,3556974591,SE +3556974592,3556982783,ES +3556982784,3556990975,DE +3556990976,3556999167,UA +3556999168,3557007359,RU +3557007360,3557015551,IT +3557015552,3557016976,LV +3557016977,3557016977,ES +3557016978,3557023743,LV +3557023744,3557028415,NL +3557028416,3557028479,BE +3557028480,3557031935,NL +3557031936,3557040127,IT +3557040128,3557048319,NO +3557048320,3557056511,CH +3557056512,3557064703,ES +3557064704,3557072895,CZ +3557072896,3557081087,DE +3557081088,3557089279,NL +3557089280,3557105663,DE +3557105664,3557107711,BG +3557107712,3557109759,IQ +3557109760,3557113599,BG +3557113600,3557113855,IQ +3557113856,3557130239,RU +3557130240,3557138431,BG +3557138432,3557146623,RU +3557146624,3557154815,SK +3557154816,3557171199,RU +3557171200,3557172479,IT +3557172480,3557172991,IR +3557172992,3557173503,IQ +3557173504,3557173631,IR +3557173632,3557173695,IQ +3557173696,3557173703,AE +3557173704,3557173759,IT +3557173760,3557174015,IR +3557174016,3557174527,IT +3557174528,3557174783,IR +3557174784,3557175039,IT +3557175040,3557175295,IR +3557175296,3557175807,CH +3557175808,3557176063,IR +3557176064,3557176831,IT +3557176832,3557177023,IQ +3557177024,3557179391,IT +3557179392,3557228543,DE +3557228544,3557236735,EE +3557236736,3557244927,ES +3557244928,3557253119,IT +3557253120,3557261311,RU +3557261312,3557277695,DE +3557277696,3557279743,NL +3557279744,3557280255,US +3557280256,3557280511,DE +3557280512,3557282815,NL +3557282816,3557283327,PL +3557283328,3557283583,NL +3557283584,3557285887,PL +3557285888,3557294079,RU +3557294080,3557302271,DE +3557302272,3557310463,UA +3557310464,3557326847,ES +3557326848,3557335039,DE +3557336272,3557336279,BE +3557339164,3557339164,BE +3557343232,3557351423,DE +3557351424,3557355519,RU +3557355520,3557355775,NL +3557355776,3557356031,US +3557356032,3557356287,NL +3557356288,3557356543,RU +3557356544,3557357311,NL +3557357312,3557357567,RU +3557357568,3557357823,NL +3557357824,3557358079,RU +3557358080,3557359103,NL +3557359104,3557359615,MY +3557359616,3557359991,JE +3557359992,3557359999,GB +3557360000,3557360047,JE +3557360048,3557360055,GB +3557360056,3557360127,JE +3557360128,3557360135,GB +3557360136,3557360263,JE +3557360264,3557360271,GB +3557360272,3557360743,JE +3557360744,3557360751,GB +3557360752,3557360863,JE +3557360864,3557360871,GB +3557360872,3557360935,JE +3557360936,3557360943,GB +3557360944,3557363583,JE +3557363584,3557363595,GB +3557363596,3557363631,JE +3557363632,3557363639,GB +3557363640,3557363703,JE +3557363704,3557363711,GB +3557363712,3557364551,JE +3557364552,3557364559,GB +3557364560,3557364703,JE +3557364704,3557364711,GB +3557364712,3557365095,JE +3557365096,3557365103,GB +3557365104,3557365791,JE +3557365792,3557365799,GB +3557365800,3557367807,JE +3557367808,3557375999,DE +3557376000,3557384191,ES +3557384192,3557392383,GB +3557392384,3557400575,AT +3557400576,3557408767,DE +3557408768,3557416959,GB +3557416960,3557425151,UA +3557425152,3557490687,DK +3557490688,3557507071,FR +3557507072,3557515263,GB +3557515264,3557523455,CZ +3557523456,3557531647,RU +3557531648,3557539839,SA +3557539840,3557548031,SY +3557548032,3557556223,DE +3557556224,3557564415,RU +3557564416,3557572607,DE +3557572608,3557580799,RU +3557580800,3557588991,DE +3557588992,3557597183,TR +3557597184,3557605375,SA +3557605376,3557613567,LT +3557613568,3557621759,EG +3557621760,3557629951,RU +3557629952,3557638143,PT +3557638144,3557646335,MK +3557646336,3557654527,RU +3557654528,3557670911,KZ +3557670912,3557679103,GB +3557679104,3557687295,SI +3557687296,3557703679,PL +3557703680,3557711871,DE +3557711872,3557720063,ES +3557720064,3557728255,IT +3557728256,3557744639,RU +3557744640,3557752831,PS +3557752832,3557761023,TR +3557761024,3557769215,RU +3557769216,3557777407,GB +3557777408,3557785599,RU +3557785600,3557793791,UA +3557793792,3557801983,HR +3557801984,3557810175,DE +3557810176,3557818367,ES +3557818368,3557826559,RU +3557826560,3557834751,AT +3557834752,3557842943,IR +3557842944,3557851135,FI +3557851136,3557859327,HU +3557859328,3557861983,SE +3557861984,3557862015,FI +3557862016,3557863295,SE +3557863296,3557863327,FI +3557863328,3557863887,SE +3557863888,3557863903,NO +3557863904,3557863919,FI +3557863920,3557864311,SE +3557864312,3557864319,FI +3557864320,3557867519,SE +3557867520,3557875711,RU +3557875712,3557883903,DE +3557883904,3557892095,RU +3557892096,3557900287,IE +3557900288,3557916671,AT +3557916672,3557924863,NO +3557924864,3557928959,AX +3557928960,3557933055,FI +3557933056,3557941247,IT +3557941248,3557957631,DE +3557957632,3557965823,SI +3557965824,3557974015,DE +3557974016,3557982207,CH +3557982208,3557990399,NO +3557990400,3557998591,PT +3557998592,3558006783,DE +3558006784,3558008537,GB +3558008538,3558008538,NL +3558008539,3558009599,GB +3558009600,3558009855,NL +3558009856,3558010879,GB +3558010880,3558012927,FR +3558012928,3558014207,GB +3558014208,3558014463,NL +3558014464,3558014719,US +3558014720,3558014975,NL +3558014976,3558023167,RU +3558023168,3558031359,DE +3558031360,3558039551,GB +3558039552,3558047743,IT +3558047744,3558055935,KZ +3558055936,3558064127,FR +3558064128,3558067967,NL +3558067968,3558068223,ES +3558068224,3558068735,NL +3558068736,3558068991,FR +3558068992,3558069247,IE +3558069248,3558080511,NL +3558080512,3558096895,RU +3558096896,3558113279,CZ +3558113280,3558129663,DE +3558129664,3558137855,NO +3558137856,3558146047,GB +3558146048,3558154239,RU +3558154240,3558157847,GB +3558157848,3558157851,US +3558157852,3558161431,GB +3558161432,3558161439,TZ +3558161440,3558162431,GB +3558162432,3558170623,DE +3558170624,3558178815,GB +3558178816,3558187007,BG +3558187008,3558195199,DE +3558195200,3558196247,GB +3558196248,3558196255,IT +3558196256,3558196327,GB +3558196328,3558196351,IT +3558196352,3558197247,GB +3558197248,3558199295,US +3558199296,3558203391,GB +3558203392,3558211583,ES +3558211584,3558219775,GB +3558219776,3558227967,ES +3558227968,3558230015,RU +3558230016,3558231039,PL +3558231040,3558231551,RU +3558231552,3558231807,SK +3558231808,3558232063,RU +3558232064,3558232575,LB +3558232576,3558236159,RU +3558236160,3558244351,GB +3558244352,3558252543,IT +3558252544,3558260735,KE +3558260736,3558268927,UA +3558268928,3558276095,GI +3558276096,3558276351,GB +3558276352,3558277119,GI +3558277120,3558285951,GB +3558285952,3558286079,DE +3558286080,3558286591,GB +3558286592,3558286655,FR +3558286656,3558289119,GB +3558289120,3558289151,FR +3558289152,3558289431,GB +3558289432,3558289439,NL +3558289440,3558289975,GB +3558289976,3558289983,CZ +3558289984,3558290831,GB +3558290832,3558290847,ES +3558290848,3558291071,GB +3558291072,3558291135,DE +3558291136,3558292255,GB +3558292256,3558292271,SE +3558292272,3558293199,GB +3558293200,3558293215,NL +3558293216,3558293503,GB +3558293504,3558301695,RU +3558301696,3558318079,DE +3558318080,3558321284,FR +3558321285,3558321285,RE +3558321286,3558334463,FR +3558334464,3558342655,CH +3558342656,3558350847,IT +3558350848,3558359039,RU +3558359040,3558367231,GB +3558367232,3558371327,LT +3558371328,3558375423,AT +3558375424,3558383615,CZ +3558383616,3558391807,HU +3558391808,3558399999,LU +3558400000,3558408191,SA +3558408192,3558416383,CH +3558416384,3558424575,BG +3558424576,3558440959,IL +3558440960,3558449151,SE +3558449152,3558457343,IT +3558457344,3558457407,BE +3558457408,3558457599,GB +3558457600,3558457727,FR +3558457728,3558465535,NL +3558465536,3558473727,GB +3558473728,3558506495,SA +3558506496,3558514687,UA +3558514688,3558522879,SK +3558522880,3558524927,NL +3558524928,3558525183,ES +3558525184,3558525439,NL +3558525440,3558525695,FR +3558525696,3558525951,IE +3558525952,3558526975,NL +3558526976,3558527744,ES +3558527745,3558531071,NL +3558531072,3558539263,RU +3558539264,3558547455,DK +3558547456,3558555647,FR +3558555648,3558572031,AT +3558572032,3558580223,DE +3558580224,3558588415,CH +3558588416,3558596607,CZ +3558596608,3558597343,EE +3558597344,3558597351,PL +3558597352,3558604799,EE +3558604800,3558612991,GB +3558612992,3558621183,DE +3558621184,3558629375,MD +3558629376,3558637567,DE +3558637568,3558645759,CH +3558645760,3558653951,IT +3558653952,3558662143,SE +3558662144,3558670335,LB +3558670336,3558686719,DE +3558686720,3558703103,TR +3558703104,3558711295,IT +3558711296,3558719487,NL +3558719488,3558735871,IL +3558735872,3558744063,GG +3558744064,3558752255,LB +3558752256,3558760447,SI +3558760448,3558768639,FR +3558768640,3558785023,RU +3558785024,3558801407,IS +3558801408,3558809599,TR +3558809600,3558817791,ES +3558817792,3558825983,AT +3558825984,3558834175,CY +3558834176,3558842367,GB +3558842368,3558850559,SE +3558850560,3558851327,GB +3558851328,3558851335,ES +3558851336,3558851815,GB +3558851816,3558851823,ES +3558851824,3558854135,GB +3558854136,3558854143,ES +3558854144,3558856703,GB +3558856704,3558858751,US +3558858752,3558866943,IT +3558866944,3558899711,GB +3558899712,3558916095,SE +3558916096,3558924287,RU +3558924288,3558932479,NL +3558932480,3558940671,RU +3558940672,3558948863,AT +3558948864,3558957055,PL +3558957056,3558965247,PS +3558965248,3558973439,NO +3558973440,3558981631,SA +3558981632,3558989823,IR +3558989824,3558998015,RU +3558998016,3559006207,JO +3559006208,3559014399,RU +3559014400,3559022591,DE +3559022592,3559030783,RU +3559030784,3559038975,ES +3559038976,3559047167,DE +3559047168,3559055359,IT +3559055360,3559063551,AM +3559063552,3559079935,CH +3559079936,3559088127,JO +3559088128,3559088991,GB +3559088992,3559088999,BE +3559089000,3559089527,GB +3559089528,3559089535,BE +3559089536,3559089935,GB +3559089936,3559089951,BE +3559089952,3559090239,GB +3559090240,3559090303,BE +3559090304,3559091023,GB +3559091024,3559091031,BE +3559091032,3559092243,GB +3559092244,3559092244,BE +3559092245,3559093311,GB +3559093312,3559093319,BE +3559093320,3559093487,GB +3559093488,3559093503,BE +3559093504,3559094303,GB +3559094304,3559094319,BE +3559094320,3559095455,GB +3559095456,3559095456,BE +3559095457,3559096319,GB +3559096320,3559104511,RO +3559104512,3559112703,RU +3559112704,3559120895,IT +3559120896,3559129087,GB +3559129088,3559137279,BG +3559137280,3559145471,GB +3559145472,3559153663,ES +3559153664,3559161855,GB +3559161856,3559161887,FR +3559161888,3559162047,GB +3559162048,3559162079,BE +3559162080,3559163903,GB +3559163904,3559163935,FR +3559163936,3559163999,GB +3559164000,3559164031,NL +3559164032,3559164151,GB +3559164152,3559164159,IT +3559164160,3559178239,GB +3559178240,3559186431,LB +3559186432,3559194623,RU +3559194624,3559197551,SE +3559197552,3559197567,FI +3559197568,3559200143,SE +3559200144,3559200151,FI +3559200152,3559200255,SE +3559200256,3559200511,FI +3559200512,3559200639,SE +3559200640,3559200671,FI +3559200672,3559201607,SE +3559201608,3559201615,FI +3559201616,3559201871,SE +3559201872,3559201879,FI +3559201880,3559202815,SE +3559202816,3559211007,DE +3559211008,3559219199,SK +3559219200,3559227391,SE +3559227392,3559235583,DK +3559235584,3559243775,DE +3559243776,3559251967,FR +3559251968,3559260159,NO +3559260160,3559268351,DE +3559268352,3559276543,IT +3559276544,3559284735,GB +3559284736,3559292927,RU +3559292928,3559301119,JO +3559301120,3559306576,GB +3559306577,3559306577,AT +3559306578,3559309311,GB +3559309312,3559317503,PL +3559317504,3559325695,FI +3559325696,3559333887,IT +3559333888,3559336447,SE +3559336448,3559336703,US +3559336704,3559342079,SE +3559342080,3559350271,BG +3559350272,3559358463,BA +3559358464,3559366655,FR +3559366656,3559368959,GB +3559368960,3559369215,AO +3559369216,3559374847,GB +3559374848,3559383039,AT +3559383040,3559391231,GB +3559391232,3559399423,CH +3559399424,3559407615,UA +3559407616,3559423999,HU +3559424000,3559432191,LB +3559432192,3559440383,DE +3559440384,3559448575,RU +3559448576,3559456767,ES +3559456768,3559473151,RU +3559473152,3559489535,CH +3559489536,3559491247,GB +3559491248,3559491263,NL +3559491264,3559491759,GB +3559491760,3559491767,NL +3559491768,3559505919,GB +3559505920,3559514111,CH +3559514112,3559522303,AT +3559522304,3559530495,GB +3559530496,3559538687,RU +3559538688,3559546879,UA +3559546880,3559555071,KG +3559555072,3559563263,CH +3559563264,3559571455,GB +3559571456,3559579647,AM +3559579648,3559587839,DE +3559587840,3559596031,KW +3559596032,3559604223,BG +3559604224,3559612415,DE +3559612416,3559620607,IT +3559620608,3559628799,CH +3559628800,3559636991,GB +3559636992,3559653375,FR +3559653376,3559669759,GB +3559669760,3559677951,RU +3559677952,3559686143,SI +3559686144,3559694335,RU +3559694336,3559710719,DE +3559710720,3559718911,FR +3559718912,3559727103,RU +3559727104,3559735295,NL +3559735296,3559739391,BG +3559739392,3559743487,KZ +3559743488,3559745535,IT +3559745536,3559747583,DE +3559747584,3559751679,DK +3559751680,3559759871,IT +3559759872,3559768063,NO +3559768064,3559776255,CH +3559776256,3559792639,RU +3559792640,3559800831,SA +3559800832,3559809023,IT +3559809024,3559817215,DE +3559817216,3559825407,GB +3559825408,3559833599,IT +3559833600,3559849983,RU +3559849984,3559858175,CZ +3559858176,3559866367,IT +3559866368,3559874559,GB +3559874560,3559882751,LT +3559882752,3559890943,AZ +3559890944,3559899135,CH +3559899136,3559899263,PL +3559899264,3559899647,UA +3559899648,3559899967,EE +3559899968,3559900007,UA +3559900008,3559900015,EE +3559900016,3559900031,UA +3559900032,3559900351,EE +3559900352,3559902719,UA +3559902720,3559902975,EE +3559902976,3559903231,UA +3559903232,3559907327,EE +3559907328,3559915519,FR +3559915520,3559923711,IT +3559923712,3559931903,RU +3559931904,3559940095,GB +3559940096,3559945087,DE +3559945088,3559945151,PL +3559945152,3559946495,DE +3559946496,3559946751,PL +3559946752,3559948287,DE +3559948288,3559956479,RU +3559956480,3559964671,IT +3559964672,3559976959,RU +3559976960,3559981055,HU +3559981056,3559989247,EE +3559989248,3559997439,PL +3559997440,3560005631,KE +3560005632,3560013823,RU +3560013824,3560016063,GB +3560016064,3560016064,ES +3560016065,3560021247,GB +3560021248,3560021263,ES +3560021264,3560022015,GB +3560022016,3560030207,ES +3560030208,3560046591,GB +3560046592,3560054783,BG +3560054784,3560062975,TR +3560062976,3560071167,BG +3560071168,3560079359,CY +3560079360,3560087551,FI +3560087552,3560095743,GB +3560095744,3560103935,FI +3560103936,3560112127,IR +3560112128,3560120319,DE +3560120320,3560128511,ES +3560128512,3560144895,HU +3560144896,3560153087,CH +3560153088,3560161279,FR +3560161280,3560169471,PL +3560169472,3560177663,AT +3560177664,3560185855,NL +3560185856,3560194047,LT +3560194048,3560210431,IT +3560210432,3560218623,BF +3560218624,3560226815,HU +3560226816,3560235007,AT +3560235008,3560243199,DE +3560243200,3560247295,BE +3560247296,3560251391,NL +3560251392,3560259583,RU +3560259584,3560267775,GB +3560267776,3560275967,EE +3560275968,3560308735,DE +3560308736,3560316927,FI +3560316928,3560325119,NL +3560325120,3560333311,DK +3560333312,3560341503,RO +3560341504,3560345855,GB +3560345856,3560348671,US +3560348672,3560357887,GB +3560357888,3560366079,GR +3560366080,3560374271,IT +3560374272,3560382463,ES +3560382464,3560390655,FO +3560390656,3560398847,UA +3560398848,3560407039,RU +3560407040,3560421375,PT +3560421376,3560423423,IL +3560423424,3560431615,CH +3560431616,3560439807,SK +3560439808,3560447999,BG +3560448000,3560472575,GB +3560472576,3560480767,MT +3560480768,3560488959,IT +3560488960,3560497151,MD +3560497152,3560501503,LU +3560501504,3560502527,DE +3560502528,3560502783,LU +3560502784,3560503039,DE +3560503040,3560505343,LU +3560505344,3560507391,TR +3560507392,3560507647,UA +3560507648,3560513535,TR +3560513536,3560515583,SK +3560515584,3560517631,RS +3560517632,3560521727,NL +3560521728,3560529919,PT +3560529920,3560554495,RU +3560554496,3560562687,SA +3560562688,3560570879,GB +3560570880,3560579071,TR +3560579072,3560587263,GB +3560587264,3560595455,DE +3560595456,3560603647,GE +3560603648,3560611839,GB +3560611840,3560620031,UA +3560620032,3560628223,RU +3560628224,3560636415,GB +3560636416,3560644607,LT +3560644608,3560652799,DE +3560652800,3560660991,GB +3560660992,3560669183,RU +3560669184,3560685567,CH +3560685568,3560693759,ES +3560693760,3560701951,PL +3560710144,3560718335,CH +3560718336,3560726527,GM +3560726528,3560734719,DK +3560734720,3560742911,DE +3560742912,3560751103,AT +3560751104,3560767487,DE +3560767488,3560833023,NL +3560833024,3560841215,GB +3560841216,3560849407,RS +3560849408,3560857599,DE +3560857600,3560865791,SA +3560865792,3560882175,FR +3560882176,3560890367,DE +3560890368,3560898559,NO +3560898560,3560906751,FI +3560906752,3560923135,DE +3560923136,3560931327,ES +3560931328,3560939535,DE +3560939536,3560939539,PT +3560939540,3560939543,IT +3560939544,3560939555,DE +3560939556,3560939559,ES +3560939560,3560939567,DE +3560939568,3560939571,NL +3560939572,3560939579,ES +3560939580,3560939583,BE +3560939584,3560939607,DE +3560939608,3560939611,IT +3560939612,3560939643,DE +3560939644,3560939647,BE +3560939648,3560939679,DE +3560939680,3560939683,IT +3560939684,3560939687,AT +3560939688,3560939691,ES +3560939692,3560939695,FR +3560939696,3560939719,DE +3560939720,3560939727,GR +3560939728,3560939735,NL +3560939736,3560939739,FR +3560939740,3560939743,DE +3560939744,3560939747,FR +3560939748,3560939751,DE +3560939752,3560939755,IT +3560939756,3560939759,DE +3560939760,3560939763,IT +3560939764,3560939767,DE +3560939768,3560939771,IE +3560939772,3560939775,CZ +3560939776,3560939779,BE +3560939780,3560939795,DE +3560939796,3560939799,GB +3560939800,3560939807,DE +3560939808,3560939811,FR +3560939812,3560939827,DE +3560939828,3560939831,FR +3560939832,3560939839,DE +3560939840,3560939843,GB +3560939844,3560939847,DE +3560939848,3560939851,BE +3560939852,3560939855,DE +3560939856,3560939859,FR +3560939860,3560939863,HU +3560939864,3560939867,ES +3560939868,3560939875,DE +3560939876,3560939879,CH +3560939880,3560939895,DE +3560939896,3560939899,ES +3560939900,3560939903,GB +3560939904,3560939907,BR +3560939908,3560939915,DE +3560939916,3560939919,ES +3560939920,3560939927,DE +3560939928,3560939931,NL +3560939932,3560939943,DE +3560939944,3560939951,FR +3560939952,3560939955,DE +3560939956,3560939959,AT +3560939960,3560939975,DE +3560939976,3560939979,BE +3560939980,3560939983,DE +3560939984,3560939987,FR +3560939988,3560939991,ES +3560939992,3560939995,IT +3560939996,3560939999,DE +3560940000,3560940007,ES +3560940008,3560940015,DE +3560940016,3560940019,BE +3560940020,3560940023,GB +3560940024,3560940027,GR +3560940028,3560940043,DE +3560940044,3560940047,GB +3560940048,3560940051,ES +3560940052,3560940055,BE +3560940056,3560940059,NL +3560940060,3560940063,LU +3560940064,3560940067,CH +3560940068,3560940071,FR +3560940072,3560940075,DE +3560940076,3560940079,ES +3560940080,3560940087,DE +3560940088,3560940091,IT +3560940092,3560940095,CH +3560940096,3560940099,DE +3560940100,3560940103,FR +3560940104,3560940115,DE +3560940116,3560940119,FR +3560940120,3560940123,GB +3560940124,3560940131,DE +3560940132,3560940135,IT +3560940136,3560940139,AT +3560940140,3560940147,DE +3560940148,3560940151,IT +3560940152,3560940155,FR +3560940156,3560940159,ES +3560940160,3560940163,IT +3560940164,3560940171,FR +3560940172,3560940179,DE +3560940180,3560940183,BE +3560940184,3560940187,FR +3560940188,3560940191,IT +3560940192,3560940195,AT +3560940196,3560940199,DE +3560940200,3560940203,CY +3560940204,3560940207,DE +3560940208,3560940211,ES +3560940212,3560940215,FR +3560940216,3560940219,IE +3560940220,3560940227,DE +3560940228,3560940231,CH +3560940232,3560940235,IT +3560940236,3560940239,DE +3560940240,3560940243,PT +3560940244,3560940247,GB +3560940248,3560940251,DE +3560940252,3560940255,CH +3560940256,3560940271,DE +3560940272,3560940275,GB +3560940276,3560940279,FR +3560940280,3560940283,AT +3560940284,3560940287,DE +3560940288,3560940291,FR +3560940292,3560940307,DE +3560940308,3560940311,BE +3560940312,3560940327,DE +3560940328,3560940331,ES +3560940332,3560940339,DE +3560940340,3560940343,CH +3560940344,3560940347,NL +3560940348,3560940367,DE +3560940368,3560940371,FR +3560940372,3560940379,CH +3560940380,3560940387,DE +3560940388,3560940391,ES +3560940392,3560940395,DE +3560940396,3560940399,IL +3560940400,3560940403,CH +3560940404,3560940407,DE +3560940408,3560940411,IT +3560940412,3560940419,DE +3560940420,3560940423,GR +3560940424,3560940431,DE +3560940432,3560940435,FR +3560940436,3560940439,DE +3560940440,3560940443,BE +3560940444,3560940447,SL +3560940448,3560940451,DE +3560940452,3560940455,NL +3560940456,3560940463,DE +3560940464,3560940467,CY +3560940468,3560940471,DE +3560940472,3560940475,FR +3560940476,3560940479,CH +3560940480,3560940487,ES +3560940488,3560940491,CZ +3560940492,3560940495,DE +3560940496,3560940499,IT +3560940500,3560940503,DE +3560940504,3560940507,GB +3560940508,3560940511,IT +3560940512,3560940523,DE +3560940524,3560940527,FR +3560940528,3560940531,DE +3560940532,3560940535,FR +3560940536,3560940539,HU +3560940540,3560940547,DE +3560940548,3560940551,IE +3560940552,3560940563,DE +3560940564,3560940567,GB +3560940568,3560940571,DE +3560940572,3560940575,DK +3560940576,3560940579,DE +3560940580,3560940583,IT +3560940584,3560940587,FR +3560940588,3560940591,IT +3560940592,3560940595,GR +3560940596,3560940599,CH +3560940600,3560940603,DE +3560940604,3560940607,GB +3560940608,3560940611,FR +3560940612,3560940619,DE +3560940620,3560940623,AT +3560940624,3560940627,SM +3560940628,3560940631,DE +3560940632,3560940635,AT +3560940636,3560940639,DE +3560940640,3560940647,GB +3560940648,3560940655,DE +3560940656,3560940663,IT +3560940664,3560940687,DE +3560940688,3560940691,IT +3560940692,3560940695,NO +3560940696,3560940699,FR +3560940700,3560940703,GB +3560940704,3560940707,ES +3560940708,3560940715,DE +3560940716,3560940719,ES +3560940720,3560940727,DE +3560940728,3560940731,FR +3560940732,3560940735,DE +3560940736,3560940739,DK +3560940740,3560940743,IT +3560940744,3560940751,DE +3560940752,3560940755,IE +3560940756,3560940763,FR +3560940764,3560940767,CH +3560940768,3560940779,DE +3560940780,3560940783,IT +3560940784,3560940787,NL +3560940788,3560940791,GB +3560940792,3560940799,ES +3560940800,3560940803,DE +3560940804,3560940807,GB +3560940808,3560940811,IT +3560940812,3560940815,DE +3560940816,3560940819,FR +3560940820,3560940823,NL +3560940824,3560940827,IT +3560940828,3560940831,ES +3560940832,3560940839,DE +3560940840,3560940843,IT +3560940844,3560940851,ES +3560940852,3560940863,DE +3560940864,3560940867,IT +3560940868,3560940879,DE +3560940880,3560940883,IT +3560940884,3560940887,NL +3560940888,3560940891,LU +3560940892,3560940899,DE +3560940900,3560940903,NL +3560940904,3560940907,DE +3560940908,3560940915,GB +3560940916,3560940923,DE +3560940924,3560940927,ES +3560940928,3560940931,GR +3560940932,3560940935,CH +3560940936,3560940955,DE +3560940956,3560940963,NL +3560940964,3560940967,DE +3560940968,3560940971,NL +3560940972,3560940979,DE +3560940980,3560940983,LU +3560940984,3560940987,IT +3560940988,3560940999,DE +3560941000,3560941003,ES +3560941004,3560941019,DE +3560941020,3560941023,IT +3560941024,3560941027,FR +3560941028,3560941047,DE +3560941048,3560941051,GR +3560941052,3560941059,FR +3560941060,3560941067,DE +3560941068,3560941071,FR +3560941072,3560941075,NL +3560941076,3560941079,GB +3560941080,3560941083,BE +3560941084,3560941087,IT +3560941088,3560941091,DE +3560941092,3560941095,BE +3560941096,3560941099,AT +3560941100,3560941103,DE +3560941104,3560941107,FR +3560941108,3560941119,DE +3560941120,3560941123,BE +3560941124,3560941127,FR +3560941128,3560941131,DE +3560941132,3560941135,GB +3560941136,3560941147,DE +3560941148,3560941151,IT +3560941152,3560941155,DE +3560941156,3560941159,ES +3560941160,3560941175,DE +3560941176,3560941179,ES +3560941180,3560941183,GB +3560941184,3560941187,IT +3560941188,3560941191,ES +3560941192,3560941195,DE +3560941196,3560941199,FR +3560941200,3560941203,DE +3560941204,3560941207,IT +3560941208,3560941215,DE +3560941216,3560941219,NL +3560941220,3560941223,GB +3560941224,3560941227,DE +3560941228,3560941231,SE +3560941232,3560941235,FR +3560941236,3560941243,DE +3560941244,3560941251,IT +3560941252,3560941255,DE +3560941256,3560941259,AT +3560941260,3560941263,DE +3560941264,3560941271,ES +3560941272,3560941275,DE +3560941276,3560941279,GR +3560941280,3560941283,NL +3560941284,3560941287,DE +3560941288,3560941291,ES +3560941292,3560941295,DE +3560941296,3560941303,IT +3560941304,3560941307,FR +3560941308,3560941315,DE +3560941316,3560941319,SE +3560941320,3560941327,DE +3560941328,3560941331,IT +3560941332,3560941335,PT +3560941336,3560941339,BE +3560941340,3560941343,GB +3560941344,3560941347,FR +3560941348,3560941351,IE +3560941352,3560941355,NL +3560941356,3560941359,ES +3560941360,3560941379,DE +3560941380,3560941383,CH +3560941384,3560941387,IE +3560941388,3560941391,SE +3560941392,3560941407,DE +3560941408,3560941411,CH +3560941412,3560941415,IT +3560941416,3560941419,DE +3560941420,3560941423,FR +3560941424,3560941427,DE +3560941428,3560941431,FR +3560941432,3560941443,DE +3560941444,3560941447,ES +3560941448,3560941451,DE +3560941452,3560941459,GB +3560941460,3560941467,DE +3560941468,3560941471,CH +3560941472,3560941475,BE +3560941476,3560941479,ES +3560941480,3560941483,DE +3560941484,3560941487,ES +3560941488,3560941491,DE +3560941492,3560941495,GB +3560941496,3560941507,DE +3560941508,3560941511,IT +3560941512,3560941515,AT +3560941516,3560941519,SE +3560941520,3560941523,NO +3560941524,3560941539,DE +3560941540,3560941543,FR +3560941544,3560941547,GB +3560941548,3560941551,DE +3560941552,3560941555,IT +3560941556,3560941559,DE +3560941560,3560941563,GB +3560941564,3560941567,GR +3560941568,3560941587,DE +3560941588,3560941591,ES +3560941592,3560941599,DE +3560941600,3560941603,FR +3560941604,3560941607,CH +3560941608,3560941611,GB +3560941612,3560941631,DE +3560941632,3560941635,NL +3560941636,3560941639,DE +3560941640,3560941643,GB +3560941644,3560941647,BE +3560941648,3560941651,NO +3560941652,3560941655,DE +3560941656,3560941659,GB +3560941660,3560941663,NL +3560941664,3560941671,DE +3560941672,3560941679,FR +3560941680,3560941683,GB +3560941684,3560941687,IT +3560941688,3560941691,DE +3560941692,3560941695,IT +3560941696,3560941699,FR +3560941700,3560941703,GB +3560941704,3560941711,DE +3560941712,3560941715,FR +3560941716,3560941723,DE +3560941724,3560941727,FR +3560941728,3560941735,DE +3560941736,3560941739,NL +3560941740,3560941743,NO +3560941744,3560941747,FR +3560941748,3560941751,ES +3560941752,3560941755,BE +3560941756,3560941771,DE +3560941772,3560941779,GB +3560941780,3560941783,DE +3560941784,3560941787,GB +3560941788,3560941791,DE +3560941792,3560941795,ES +3560941796,3560941799,FR +3560941800,3560941803,NL +3560941804,3560941807,ES +3560941808,3560941811,FR +3560941812,3560941815,NO +3560941816,3560941819,FR +3560941820,3560941823,NL +3560941824,3560941831,DE +3560941832,3560941835,GB +3560941836,3560941847,DE +3560941848,3560941851,BE +3560941852,3560941855,CH +3560941856,3560941859,BE +3560941860,3560941867,DE +3560941868,3560941871,AT +3560941872,3560941875,GB +3560941876,3560941879,NL +3560941880,3560941883,BG +3560941884,3560941887,DE +3560941888,3560941891,ES +3560941892,3560941895,DE +3560941896,3560941899,ES +3560941900,3560941903,DE +3560941904,3560941907,GB +3560941908,3560941915,DE +3560941916,3560941919,FR +3560941920,3560941959,DE +3560941960,3560941963,LU +3560941964,3560941967,FR +3560941968,3560941971,DE +3560941972,3560941975,DK +3560941976,3560941983,DE +3560941984,3560941987,NL +3560941988,3560941991,DE +3560941992,3560941995,GB +3560941996,3560941999,BE +3560942000,3560942003,FR +3560942004,3560942007,GB +3560942008,3560942011,IT +3560942012,3560942015,DE +3560942016,3560942019,NL +3560942020,3560942023,ES +3560942024,3560942027,CH +3560942028,3560942035,DE +3560942036,3560942039,GB +3560942040,3560942047,DE +3560942048,3560942051,IT +3560942052,3560942055,DE +3560942056,3560942059,IS +3560942060,3560942063,DE +3560942064,3560942067,ES +3560942068,3560942083,DE +3560942084,3560942087,FR +3560942088,3560942095,DE +3560942096,3560942099,FR +3560942100,3560942103,DE +3560942104,3560942107,NL +3560942108,3560942119,DE +3560942120,3560942123,AT +3560942124,3560942131,DE +3560942132,3560942135,ES +3560942136,3560942143,DE +3560942144,3560942147,GB +3560942148,3560942151,DE +3560942152,3560942155,IT +3560942156,3560942163,DE +3560942164,3560942171,ES +3560942172,3560942175,SE +3560942176,3560942179,DE +3560942180,3560942183,ES +3560942184,3560942191,DE +3560942192,3560942195,HU +3560942196,3560942199,ES +3560942200,3560942203,FR +3560942204,3560942211,DE +3560942212,3560942215,IT +3560942216,3560942219,DE +3560942220,3560942227,FR +3560942228,3560942231,IT +3560942232,3560942243,DE +3560942244,3560942247,IT +3560942248,3560942251,DE +3560942252,3560942255,GB +3560942256,3560942259,DE +3560942260,3560942263,ES +3560942264,3560942267,NL +3560942268,3560942271,DE +3560942272,3560942275,PL +3560942276,3560942279,IT +3560942280,3560942283,NL +3560942284,3560942287,DK +3560942288,3560942291,FR +3560942292,3560942295,BH +3560942296,3560942299,MA +3560942300,3560942307,DE +3560942308,3560942319,ES +3560942320,3560942323,DE +3560942324,3560942327,IT +3560942328,3560942335,PT +3560942336,3560942343,DE +3560942344,3560942347,FR +3560942348,3560942351,DE +3560942352,3560942355,ES +3560942356,3560942359,IT +3560942360,3560942363,AT +3560942364,3560942371,DE +3560942372,3560942375,FR +3560942376,3560942379,DE +3560942380,3560942383,GB +3560942384,3560942387,DE +3560942388,3560942391,IT +3560942392,3560942407,DE +3560942408,3560942411,GB +3560942412,3560942415,DE +3560942416,3560942419,IT +3560942420,3560942455,DE +3560942456,3560942459,ES +3560942460,3560942463,RU +3560942464,3560942467,BE +3560942468,3560942471,ES +3560942472,3560942475,DE +3560942476,3560942479,CH +3560942480,3560942483,ES +3560942484,3560942487,HU +3560942488,3560942495,FR +3560942496,3560942503,DE +3560942504,3560942511,ES +3560942512,3560942523,DE +3560942524,3560942527,NL +3560942528,3560942555,DE +3560942556,3560942559,FR +3560942560,3560942563,IT +3560942564,3560942567,ES +3560942568,3560942575,DE +3560942576,3560942579,FR +3560942580,3560942583,DE +3560942584,3560942587,GB +3560942588,3560942590,ES +3560942591,3560942619,DE +3560942620,3560942623,BE +3560942624,3560942627,IT +3560942628,3560942631,GB +3560942632,3560942635,FR +3560942636,3560942643,DE +3560942644,3560942647,FR +3560942648,3560942651,DE +3560942652,3560942655,GR +3560942656,3560942663,ES +3560942664,3560942667,NL +3560942668,3560942671,DE +3560942672,3560942675,IT +3560942676,3560942679,BE +3560942680,3560942691,DE +3560942692,3560942695,LU +3560942696,3560942699,DE +3560942700,3560942703,ES +3560942704,3560942707,DE +3560942708,3560942711,IT +3560942712,3560942715,LU +3560942716,3560942719,BE +3560942720,3560942723,DE +3560942724,3560942727,IT +3560942728,3560942731,GB +3560942732,3560942735,DE +3560942736,3560942739,CH +3560942740,3560942743,ES +3560942744,3560942751,GB +3560942752,3560942763,DE +3560942764,3560942767,FR +3560942768,3560942779,DE +3560942780,3560942783,CH +3560942784,3560942787,DE +3560942788,3560942791,HU +3560942792,3560942795,DE +3560942796,3560942799,FR +3560942800,3560942807,DE +3560942808,3560942811,AT +3560942812,3560942815,FR +3560942816,3560942819,DE +3560942820,3560942823,ES +3560942824,3560942827,GB +3560942828,3560942831,AT +3560942832,3560942835,IT +3560942836,3560942843,DE +3560942844,3560942847,ES +3560942848,3560942851,IT +3560942852,3560942855,ES +3560942856,3560942879,DE +3560942880,3560942883,GB +3560942884,3560942887,DE +3560942888,3560942891,FR +3560942892,3560942895,DE +3560942896,3560942899,ES +3560942900,3560942903,DE +3560942904,3560942907,CH +3560942908,3560942915,DE +3560942916,3560942919,BE +3560942920,3560942923,DE +3560942924,3560942927,IT +3560942928,3560942931,SE +3560942932,3560942935,AT +3560942936,3560942939,DE +3560942940,3560942943,AE +3560942944,3560942951,DE +3560942952,3560942955,ES +3560942956,3560942959,DE +3560942960,3560942963,GB +3560942964,3560942983,DE +3560942984,3560942987,BE +3560942988,3560942991,DE +3560942992,3560942999,IT +3560943000,3560943003,DE +3560943004,3560943007,DK +3560943008,3560943011,CH +3560943012,3560943015,IT +3560943016,3560943019,ES +3560943020,3560943023,DE +3560943024,3560943027,GR +3560943028,3560943031,DE +3560943032,3560943035,FR +3560943036,3560943039,PL +3560943040,3560943043,NO +3560943044,3560943047,DE +3560943048,3560943051,HR +3560943052,3560943055,CY +3560943056,3560943059,BE +3560943060,3560943075,DE +3560943076,3560943079,ES +3560943080,3560943110,DE +3560943111,3560943111,ES +3560943112,3560943114,DE +3560943115,3560943115,ES +3560943116,3560943116,DK +3560943117,3560943117,IL +3560943118,3560943121,DE +3560943122,3560943122,ES +3560943123,3560943125,DE +3560943126,3560943126,FR +3560943127,3560943129,DE +3560943130,3560943130,BE +3560943131,3560943131,RU +3560943132,3560943132,BE +3560943133,3560943133,ES +3560943134,3560943136,DE +3560943137,3560943137,ES +3560943138,3560943138,CH +3560943139,3560943139,DE +3560943140,3560943140,ES +3560943141,3560943142,DE +3560943143,3560943145,HU +3560943146,3560943149,DE +3560943150,3560943150,ES +3560943151,3560943151,DE +3560943152,3560943152,HU +3560943153,3560943154,DE +3560943155,3560943155,FR +3560943156,3560943157,DE +3560943158,3560943158,FR +3560943159,3560943161,DE +3560943162,3560943162,GR +3560943163,3560943163,DE +3560943164,3560943164,PL +3560943165,3560943165,DE +3560943166,3560943166,GB +3560943167,3560943167,FR +3560943168,3560943168,ES +3560943169,3560943169,DE +3560943170,3560943170,ES +3560943171,3560943171,IT +3560943172,3560943172,ES +3560943173,3560943173,BE +3560943174,3560943176,DE +3560943177,3560943177,CH +3560943178,3560943178,DE +3560943179,3560943179,PL +3560943180,3560943180,GB +3560943181,3560943181,DE +3560943182,3560943183,ES +3560943184,3560943184,IT +3560943185,3560943185,DE +3560943186,3560943186,ES +3560943187,3560943187,PT +3560943188,3560943192,DE +3560943193,3560943193,ES +3560943194,3560943195,DE +3560943196,3560943197,IT +3560943198,3560943198,DE +3560943199,3560943199,PT +3560943200,3560943200,DE +3560943201,3560943201,IT +3560943202,3560943202,IL +3560943203,3560943204,DE +3560943205,3560943205,IT +3560943206,3560943207,DE +3560943208,3560943208,AT +3560943209,3560943210,ES +3560943211,3560943211,FR +3560943212,3560943212,DE +3560943213,3560943213,FR +3560943214,3560943214,PL +3560943215,3560943221,DE +3560943222,3560943222,ES +3560943223,3560943223,FR +3560943224,3560943224,DE +3560943225,3560943226,GR +3560943227,3560943227,DE +3560943228,3560943230,NL +3560943231,3560943231,FR +3560943232,3560943232,DE +3560943233,3560943233,PL +3560943234,3560943234,EE +3560943235,3560943235,CH +3560943236,3560943236,NL +3560943237,3560943238,DE +3560943239,3560943239,FR +3560943240,3560943240,GB +3560943241,3560943241,FR +3560943242,3560943243,DE +3560943244,3560943244,PL +3560943245,3560943245,CH +3560943246,3560943247,DE +3560943248,3560943248,GR +3560943249,3560943249,CH +3560943250,3560943250,AT +3560943251,3560943251,GB +3560943252,3560943252,BE +3560943253,3560943253,DE +3560943254,3560943254,ES +3560943255,3560943255,GB +3560943256,3560943256,DE +3560943257,3560943257,ES +3560943258,3560943259,DE +3560943260,3560943260,ES +3560943261,3560943261,IE +3560943262,3560943262,DE +3560943263,3560943263,IT +3560943264,3560943264,CZ +3560943265,3560943267,DE +3560943268,3560943268,IT +3560943269,3560943269,DE +3560943270,3560943270,GB +3560943271,3560943271,IT +3560943272,3560943272,ES +3560943273,3560943273,FR +3560943274,3560943274,GB +3560943275,3560943275,DE +3560943276,3560943276,FR +3560943277,3560943277,IT +3560943278,3560943278,DE +3560943279,3560943279,FR +3560943280,3560943282,DE +3560943283,3560943283,ES +3560943284,3560943286,DE +3560943287,3560943287,NL +3560943288,3560943290,FR +3560943291,3560943291,IT +3560943292,3560943296,DE +3560943297,3560943297,ES +3560943298,3560943298,FR +3560943299,3560943299,GB +3560943300,3560943300,DE +3560943301,3560943301,FR +3560943302,3560943302,ES +3560943303,3560943303,IT +3560943304,3560943304,FR +3560943305,3560943310,DE +3560943311,3560943311,IT +3560943312,3560943312,PL +3560943313,3560943313,DE +3560943314,3560943314,ES +3560943315,3560943315,IT +3560943316,3560943316,DE +3560943317,3560943317,IT +3560943318,3560943318,CH +3560943319,3560943322,DE +3560943323,3560943323,NL +3560943324,3560943324,DE +3560943325,3560943325,CH +3560943326,3560943326,RU +3560943327,3560943330,DE +3560943331,3560943331,IT +3560943332,3560943335,DE +3560943336,3560943336,ES +3560943337,3560943337,IT +3560943338,3560943338,BE +3560943339,3560943339,NL +3560943340,3560943341,DE +3560943342,3560943342,ES +3560943343,3560943343,FR +3560943344,3560943344,NL +3560943345,3560943345,DE +3560943346,3560943346,IT +3560943347,3560943347,ES +3560943348,3560943348,FR +3560943349,3560943349,DE +3560943350,3560943350,BE +3560943351,3560943351,SE +3560943352,3560943352,IT +3560943353,3560943354,DE +3560943355,3560943355,IT +3560943356,3560943357,DE +3560943358,3560943358,BE +3560943359,3560943361,DE +3560943362,3560943362,GB +3560943363,3560943366,DE +3560943367,3560943367,IT +3560943368,3560943368,DE +3560943369,3560943369,GR +3560943370,3560943371,DE +3560943372,3560943372,FR +3560943373,3560943375,DE +3560943376,3560943376,ES +3560943377,3560943377,GB +3560943378,3560943378,DE +3560943379,3560943379,ES +3560943380,3560943383,DE +3560943384,3560943384,FR +3560943385,3560943385,ES +3560943386,3560943386,CH +3560943387,3560943387,GB +3560943388,3560943391,DE +3560943392,3560943392,GB +3560943393,3560943394,DE +3560943395,3560943395,NL +3560943396,3560943397,DE +3560943398,3560943398,BE +3560943399,3560943399,DE +3560943400,3560943400,IT +3560943401,3560943401,DE +3560943402,3560943402,NL +3560943403,3560943403,DE +3560943404,3560943404,BE +3560943405,3560943405,DE +3560943406,3560943407,ES +3560943408,3560943408,IT +3560943409,3560943409,ES +3560943410,3560943410,NL +3560943411,3560943411,DE +3560943412,3560943412,IT +3560943413,3560943413,ES +3560943414,3560943415,DE +3560943416,3560943416,FR +3560943417,3560943417,DE +3560943418,3560943418,GB +3560943419,3560943419,FR +3560943420,3560943420,DE +3560943421,3560943421,HU +3560943422,3560943422,DE +3560943423,3560943423,FR +3560943424,3560943424,DE +3560943425,3560943425,ES +3560943426,3560943426,IT +3560943427,3560943427,FR +3560943428,3560943428,NO +3560943429,3560943430,NL +3560943431,3560943435,DE +3560943436,3560943436,FR +3560943437,3560943437,ES +3560943438,3560943438,FR +3560943439,3560943439,NO +3560943440,3560943440,FR +3560943441,3560943441,DE +3560943442,3560943442,ES +3560943443,3560943443,BE +3560943444,3560943446,DE +3560943447,3560943447,GB +3560943448,3560943450,DE +3560943451,3560943451,PL +3560943452,3560943452,GB +3560943453,3560943454,DE +3560943455,3560943456,GB +3560943457,3560943457,ES +3560943458,3560943459,IT +3560943460,3560943460,ES +3560943461,3560943461,CH +3560943462,3560943462,FR +3560943463,3560943463,NL +3560943464,3560943464,ES +3560943465,3560943465,FR +3560943466,3560943466,NO +3560943467,3560943467,IT +3560943468,3560943468,CH +3560943469,3560943469,IT +3560943470,3560943471,DE +3560943472,3560943472,BE +3560943473,3560943473,AT +3560943474,3560943474,CH +3560943475,3560943475,DE +3560943476,3560943476,BE +3560943477,3560943477,DE +3560943478,3560943478,IT +3560943479,3560943479,GB +3560943480,3560943480,NL +3560943481,3560943481,BG +3560943482,3560943482,DE +3560943483,3560943486,ES +3560943487,3560943487,DE +3560943488,3560943488,ES +3560943489,3560943489,DE +3560943490,3560943490,GB +3560943491,3560943492,DE +3560943493,3560943493,FR +3560943494,3560943494,GB +3560943495,3560943495,IT +3560943496,3560943510,DE +3560943511,3560943511,IT +3560943512,3560943512,DE +3560943513,3560943513,LU +3560943514,3560943515,ES +3560943516,3560943519,DE +3560943520,3560943520,DK +3560943521,3560943521,DE +3560943522,3560943522,GB +3560943523,3560943524,DE +3560943525,3560943525,NL +3560943526,3560943526,IT +3560943527,3560943529,DE +3560943530,3560943530,CH +3560943531,3560943533,DE +3560943534,3560943534,BY +3560943535,3560943535,FR +3560943536,3560943536,BE +3560943537,3560943537,DE +3560943538,3560943538,GB +3560943539,3560943539,DE +3560943540,3560943540,BE +3560943541,3560943541,NL +3560943542,3560943542,DE +3560943543,3560943543,NL +3560943544,3560943544,ES +3560943545,3560943546,DE +3560943547,3560943547,SI +3560943548,3560943548,GB +3560943549,3560943549,DE +3560943550,3560943550,HU +3560943551,3560943551,FR +3560943552,3560943553,DE +3560943554,3560943554,IS +3560943555,3560943555,FR +3560943556,3560943556,DE +3560943557,3560943557,ES +3560943558,3560943558,DE +3560943559,3560943559,GB +3560943560,3560943562,IT +3560943563,3560943563,HU +3560943564,3560943566,DE +3560943567,3560943567,FR +3560943568,3560943568,GB +3560943569,3560943570,FR +3560943571,3560943572,DE +3560943573,3560943573,FR +3560943574,3560943574,NO +3560943575,3560943575,DE +3560943576,3560943576,IT +3560943577,3560943577,DK +3560943578,3560943578,ES +3560943579,3560943580,DE +3560943581,3560943581,NL +3560943582,3560943582,DE +3560943583,3560943583,ES +3560943584,3560943584,IT +3560943585,3560943585,FR +3560943586,3560943586,ES +3560943587,3560943587,DE +3560943588,3560943588,IT +3560943589,3560943590,DE +3560943591,3560943591,AT +3560943592,3560943592,SK +3560943593,3560943593,PL +3560943594,3560943594,FR +3560943595,3560943596,ES +3560943597,3560943599,DE +3560943600,3560943600,AT +3560943601,3560943601,DE +3560943602,3560943602,IT +3560943603,3560943603,DE +3560943604,3560943604,ES +3560943605,3560943605,GB +3560943606,3560943607,DE +3560943608,3560943608,IT +3560943609,3560943610,DE +3560943611,3560943611,FR +3560943612,3560943612,DE +3560943613,3560943613,ES +3560943614,3560943618,DE +3560943619,3560943620,ES +3560943621,3560943621,SE +3560943622,3560943622,BE +3560943623,3560943623,DE +3560943624,3560943624,ES +3560943625,3560943625,DE +3560943626,3560943626,ES +3560943627,3560943627,DK +3560943628,3560943628,DE +3560943629,3560943629,IT +3560943630,3560943630,DE +3560943631,3560943631,HU +3560943632,3560943632,DE +3560943633,3560943633,ES +3560943634,3560943634,FR +3560943635,3560943636,DE +3560943637,3560943637,PL +3560943638,3560943638,DE +3560943639,3560943639,ES +3560943640,3560943640,FR +3560943641,3560943642,DE +3560943643,3560943643,IT +3560943644,3560943644,DE +3560943645,3560943645,GB +3560943646,3560943646,DE +3560943647,3560943647,ES +3560943648,3560943651,DE +3560943652,3560943652,AT +3560943653,3560943653,DE +3560943654,3560943654,IT +3560943655,3560943655,DE +3560943656,3560943656,IT +3560943657,3560943657,DE +3560943658,3560943658,GB +3560943659,3560943659,DE +3560943660,3560943660,PT +3560943661,3560943661,DK +3560943662,3560943662,DE +3560943663,3560943664,NL +3560943665,3560943666,DE +3560943667,3560943667,PL +3560943668,3560943668,DK +3560943669,3560943669,FR +3560943670,3560943671,DE +3560943672,3560943672,BH +3560943673,3560943673,SE +3560943674,3560943674,MA +3560943675,3560943675,FR +3560943676,3560943677,DE +3560943678,3560943680,ES +3560943681,3560943682,DE +3560943683,3560943683,GR +3560943684,3560943684,NL +3560943685,3560943685,IT +3560943686,3560943686,FR +3560943687,3560943687,PT +3560943688,3560943688,DE +3560943689,3560943689,PT +3560943690,3560943691,DE +3560943692,3560943692,SE +3560943693,3560943693,DE +3560943694,3560943694,FR +3560943695,3560943695,DE +3560943696,3560943697,CH +3560943698,3560943698,DE +3560943699,3560943699,IT +3560943700,3560943700,DE +3560943701,3560943701,AT +3560943702,3560943702,DE +3560943703,3560943703,FR +3560943704,3560943704,DE +3560943705,3560943705,CH +3560943706,3560943706,LI +3560943707,3560943709,DE +3560943710,3560943710,NL +3560943711,3560943711,DE +3560943712,3560943712,IT +3560943713,3560943713,PL +3560943714,3560943714,NL +3560943715,3560943715,DE +3560943716,3560943716,GB +3560943717,3560943717,FR +3560943718,3560943719,DE +3560943720,3560943721,IT +3560943722,3560943726,DE +3560943727,3560943727,ES +3560943728,3560943728,GB +3560943729,3560943729,DE +3560943730,3560943730,NL +3560943731,3560943731,IT +3560943732,3560943736,DE +3560943737,3560943737,GR +3560943738,3560943740,DE +3560943741,3560943741,FR +3560943742,3560943742,DE +3560943743,3560943743,PL +3560943744,3560943744,DE +3560943745,3560943745,PL +3560943746,3560943748,DE +3560943749,3560943749,GB +3560943750,3560943750,DE +3560943751,3560943751,IT +3560943752,3560943752,DE +3560943753,3560943753,ES +3560943754,3560943754,HU +3560943755,3560943755,BE +3560943756,3560943756,IT +3560943757,3560943757,DE +3560943758,3560943758,CZ +3560943759,3560943759,IE +3560943760,3560943760,NO +3560943761,3560943761,DE +3560943762,3560943762,IT +3560943763,3560943763,FR +3560943764,3560943764,DE +3560943765,3560943765,SE +3560943766,3560943766,CY +3560943767,3560943768,DE +3560943769,3560943769,FR +3560943770,3560943770,NL +3560943771,3560943771,IT +3560943772,3560943774,DE +3560943775,3560943775,FR +3560943776,3560943780,DE +3560943781,3560943781,ES +3560943782,3560943782,DE +3560943783,3560943783,BE +3560943784,3560943788,DE +3560943789,3560943789,IT +3560943790,3560943790,DE +3560943791,3560943791,IT +3560943792,3560943793,DE +3560943794,3560943794,FR +3560943795,3560943795,DE +3560943796,3560943796,IT +3560943797,3560943800,DE +3560943801,3560943801,FR +3560943802,3560943802,IT +3560943803,3560943803,DE +3560943804,3560943804,ES +3560943805,3560943805,DE +3560943806,3560943806,ES +3560943807,3560943810,DE +3560943811,3560943811,ES +3560943812,3560943812,IT +3560943813,3560943813,CH +3560943814,3560943816,DE +3560943817,3560943817,FR +3560943818,3560943818,PT +3560943819,3560943819,DE +3560943820,3560943820,FR +3560943821,3560943821,IT +3560943822,3560943822,DE +3560943823,3560943823,GR +3560943824,3560943827,DE +3560943828,3560943828,ES +3560943829,3560943829,NL +3560943830,3560943830,DE +3560943831,3560943831,FR +3560943832,3560943832,DE +3560943833,3560943833,FR +3560943834,3560943836,DE +3560943837,3560943837,CH +3560943838,3560943840,DE +3560943841,3560943841,GB +3560943842,3560943842,DE +3560943843,3560943843,GB +3560943844,3560943844,DE +3560943845,3560943845,CZ +3560943846,3560943847,DE +3560943848,3560943848,FR +3560943849,3560943849,DE +3560943850,3560943850,NL +3560943851,3560943857,DE +3560943858,3560943858,GB +3560943859,3560943859,DE +3560943860,3560943860,GB +3560943861,3560943865,DE +3560943866,3560943866,BE +3560943867,3560943868,DE +3560943869,3560943869,LU +3560943870,3560943871,DE +3560943872,3560943875,BR +3560943876,3560943879,DE +3560943880,3560943887,US +3560943888,3560943891,CA +3560943892,3560943895,DE +3560943896,3560943899,CL +3560943900,3560943903,DE +3560943904,3560943915,US +3560943916,3560943919,CA +3560943920,3560943923,US +3560943924,3560943927,MX +3560943928,3560943935,US +3560943936,3560943939,PE +3560943940,3560943943,DE +3560943944,3560943947,US +3560943948,3560943975,DE +3560943976,3560943979,US +3560943980,3560943983,DE +3560943984,3560943987,US +3560943988,3560943991,DE +3560943992,3560943999,US +3560944000,3560944023,DE +3560944024,3560944031,US +3560944032,3560944035,MX +3560944036,3560944039,US +3560944040,3560944043,MX +3560944044,3560944059,DE +3560944060,3560944063,US +3560944064,3560944067,DE +3560944068,3560944071,US +3560944072,3560944079,DE +3560944080,3560944083,US +3560944084,3560944087,CL +3560944088,3560944103,DE +3560944104,3560944107,US +3560944108,3560944119,DE +3560944120,3560944135,US +3560944136,3560944139,DE +3560944140,3560944143,US +3560944144,3560944147,DE +3560944148,3560944159,US +3560944160,3560944163,MX +3560944164,3560944167,AR +3560944168,3560944175,US +3560944176,3560944179,BR +3560944180,3560944183,PA +3560944184,3560944187,US +3560944188,3560944191,CA +3560944192,3560944195,US +3560944196,3560944199,DE +3560944200,3560944203,BO +3560944204,3560944207,DE +3560944208,3560944211,CA +3560944212,3560944215,DE +3560944216,3560944219,BR +3560944220,3560944227,US +3560944228,3560944231,IT +3560944232,3560944235,US +3560944236,3560944239,CA +3560944240,3560944243,US +3560944244,3560944247,MX +3560944248,3560944267,US +3560944268,3560944271,CO +3560944272,3560944275,BR +3560944276,3560944279,PE +3560944280,3560944283,DE +3560944284,3560944295,US +3560944296,3560944299,CO +3560944300,3560944307,US +3560944308,3560944311,MX +3560944312,3560944315,US +3560944316,3560944323,AR +3560944324,3560944339,US +3560944340,3560944343,CO +3560944344,3560944351,US +3560944352,3560944355,GT +3560944356,3560944359,CA +3560944360,3560944363,DO +3560944364,3560944367,AR +3560944368,3560944371,BR +3560944372,3560944375,DE +3560944376,3560944379,AR +3560944380,3560944383,DE +3560944384,3560944395,US +3560944396,3560944399,PR +3560944400,3560944403,CA +3560944404,3560944411,DE +3560944412,3560944415,US +3560944416,3560944419,SG +3560944420,3560944431,US +3560944432,3560944435,DE +3560944436,3560944447,US +3560944448,3560944451,DE +3560944452,3560944459,US +3560944460,3560944460,AR +3560944461,3560944463,DE +3560944464,3560944467,CA +3560944468,3560944471,BR +3560944472,3560944475,US +3560944476,3560944479,AR +3560944480,3560944487,US +3560944488,3560944491,CA +3560944492,3560944519,US +3560944520,3560944523,DE +3560944524,3560944531,US +3560944532,3560944535,MX +3560944536,3560944551,US +3560944552,3560944555,BR +3560944556,3560944559,MX +3560944560,3560944563,US +3560944564,3560944567,ES +3560944568,3560944575,US +3560944576,3560944579,BR +3560944580,3560944603,US +3560944604,3560944607,CA +3560944608,3560944615,US +3560944616,3560944619,EC +3560944620,3560944623,US +3560944624,3560944627,CL +3560944628,3560944631,DE +3560944632,3560944635,CA +3560944636,3560944779,DE +3560944780,3560944783,ES +3560944784,3560944787,FR +3560944788,3560944791,NL +3560944792,3560944795,ES +3560944796,3560944799,GB +3560944800,3560944803,ES +3560944804,3560944807,FR +3560944808,3560944811,DE +3560944812,3560944815,ES +3560944816,3560944823,IT +3560944824,3560944827,DE +3560944828,3560944831,IE +3560944832,3560944835,DE +3560944836,3560944839,IT +3560944840,3560944847,DE +3560944848,3560944855,FR +3560944856,3560944859,NL +3560944860,3560944863,DE +3560944864,3560944871,FR +3560944872,3560944875,DE +3560944876,3560944879,ES +3560944880,3560944883,DE +3560944884,3560944887,ES +3560944888,3560944891,CH +3560944892,3560944899,DE +3560944900,3560944903,SG +3560944904,3560944907,MY +3560944908,3560944915,DE +3560944916,3560944919,SG +3560944920,3560944923,DE +3560944924,3560944927,CN +3560944928,3560944931,DE +3560944932,3560944935,SG +3560944936,3560944943,CN +3560944944,3560944947,MY +3560944948,3560944963,DE +3560944964,3560944967,MY +3560944968,3560944971,SG +3560944972,3560944975,CN +3560944976,3560944979,IN +3560944980,3560944983,DE +3560944984,3560944987,IN +3560944988,3560944991,SG +3560944992,3560944995,MY +3560944996,3560944999,SG +3560945000,3560945003,MY +3560945004,3560945007,DE +3560945008,3560945011,SG +3560945012,3560945019,DE +3560945020,3560945023,IN +3560945024,3560945027,DE +3560945028,3560945031,MY +3560945032,3560945035,IN +3560945036,3560945039,CN +3560945040,3560945043,SG +3560945044,3560945047,TW +3560945048,3560945059,DE +3560945060,3560945063,SG +3560945064,3560945067,MY +3560945068,3560945075,IN +3560945076,3560945091,DE +3560945092,3560945095,SG +3560945096,3560945099,CN +3560945100,3560945103,SG +3560945104,3560945107,MY +3560945108,3560945111,DE +3560945112,3560945115,SG +3560945116,3560945119,IN +3560945120,3560945123,CN +3560945124,3560945131,SG +3560945132,3560945135,TW +3560945136,3560945139,MY +3560945140,3560945143,SG +3560945144,3560945147,IN +3560945148,3560945151,SG +3560945152,3560945279,DE +3560945280,3560945295,JP +3560945296,3560945299,DE +3560945300,3560945311,JP +3560945312,3560945315,DE +3560945316,3560945323,JP +3560945324,3560945327,DE +3560945328,3560945331,JP +3560945332,3560945335,DE +3560945336,3560945339,JP +3560945340,3560945343,DE +3560945344,3560945351,JP +3560945352,3560945355,DE +3560945356,3560945359,TH +3560945360,3560945379,JP +3560945380,3560945387,DE +3560945388,3560945403,JP +3560945404,3560945409,DE +3560945410,3560945410,MY +3560945411,3560945411,DE +3560945412,3560945412,CN +3560945413,3560945413,SG +3560945414,3560945414,IN +3560945415,3560945416,SG +3560945417,3560945417,DE +3560945418,3560945418,CN +3560945419,3560945419,MY +3560945420,3560945420,DE +3560945421,3560945422,SG +3560945423,3560945423,CN +3560945424,3560945424,MY +3560945425,3560945425,IN +3560945426,3560945426,MY +3560945427,3560945430,DE +3560945431,3560945431,CN +3560945432,3560945433,IN +3560945434,3560945434,TW +3560945435,3560945435,DE +3560945436,3560945436,CN +3560945437,3560945437,SG +3560945438,3560945438,TW +3560945439,3560945439,SG +3560945440,3560945440,ID +3560945441,3560945441,SG +3560945442,3560945442,DE +3560945443,3560945443,IN +3560945444,3560945447,SG +3560945448,3560945449,DE +3560945450,3560945450,SG +3560945451,3560945451,IN +3560945452,3560945453,DE +3560945454,3560945458,SG +3560945459,3560945459,TW +3560945460,3560945460,SG +3560945461,3560945461,DE +3560945462,3560945462,IN +3560945463,3560945465,SG +3560945466,3560945466,CN +3560945467,3560945467,MY +3560945468,3560945469,SG +3560945470,3560945470,CN +3560945471,3560945471,SG +3560945472,3560945472,CN +3560945473,3560945473,TW +3560945474,3560945475,SG +3560945476,3560945476,CN +3560945477,3560945477,TW +3560945478,3560945478,DE +3560945479,3560945479,SG +3560945480,3560945480,IN +3560945481,3560945482,DE +3560945483,3560945485,MY +3560945486,3560945486,IN +3560945487,3560945488,DE +3560945489,3560945489,MY +3560945490,3560945490,TH +3560945491,3560945491,IN +3560945492,3560945495,DE +3560945496,3560945496,IN +3560945497,3560945499,DE +3560945500,3560945500,SG +3560945501,3560945501,DE +3560945502,3560945502,IN +3560945503,3560945539,DE +3560945540,3560945543,SG +3560945544,3560945551,IN +3560945552,3560945563,DE +3560945564,3560945567,SG +3560945568,3560945575,DE +3560945576,3560945579,SG +3560945580,3560945583,MY +3560945584,3560945587,SG +3560945588,3560945591,TW +3560945592,3560945595,SG +3560945596,3560945599,DE +3560945600,3560945603,SG +3560945604,3560945611,DE +3560945612,3560945619,SG +3560945620,3560945627,CN +3560945628,3560945635,SG +3560945636,3560945639,DE +3560945640,3560945643,SG +3560945644,3560945647,MY +3560945648,3560945651,IN +3560945652,3560945659,DE +3560945660,3560945663,IN +3560945664,3560945667,US +3560945668,3560945671,BR +3560945672,3560945675,US +3560945676,3560945679,PE +3560945680,3560945683,BR +3560945684,3560945691,CO +3560945692,3560945699,US +3560945700,3560945703,CO +3560945704,3560945707,US +3560945708,3560945711,CO +3560945712,3560945727,US +3560945728,3560945731,AR +3560945732,3560945739,US +3560945740,3560945743,BR +3560945744,3560945747,US +3560945748,3560945751,AR +3560945752,3560945763,US +3560945764,3560945767,AR +3560945768,3560945771,BR +3560945772,3560945775,CA +3560945776,3560945787,US +3560945788,3560945791,CO +3560945792,3560945795,AR +3560945796,3560945799,US +3560945800,3560945803,BR +3560945804,3560945807,US +3560945808,3560945811,CO +3560945812,3560945815,US +3560945816,3560945819,AR +3560945820,3560945823,US +3560945824,3560945827,BR +3560945828,3560945835,US +3560945836,3560945839,CL +3560945840,3560945843,BR +3560945844,3560945851,US +3560945852,3560945855,DE +3560945856,3560945859,US +3560945860,3560945863,DE +3560945864,3560945867,US +3560945868,3560945871,DE +3560945872,3560945875,CA +3560945876,3560945911,US +3560945912,3560945915,CA +3560945916,3560945919,US +3560945920,3560946017,DE +3560946018,3560946018,FI +3560946019,3560946019,CZ +3560946020,3560946176,DE +3560946177,3560946189,US +3560946190,3560946190,AR +3560946191,3560946194,US +3560946195,3560946195,PE +3560946196,3560946196,CA +3560946197,3560946197,US +3560946198,3560946198,CA +3560946199,3560946199,AR +3560946200,3560946200,US +3560946201,3560946201,CA +3560946202,3560946202,DE +3560946203,3560946203,CA +3560946204,3560946204,US +3560946205,3560946205,PE +3560946206,3560946208,US +3560946209,3560946209,CA +3560946210,3560946212,US +3560946213,3560946213,CO +3560946214,3560946214,CA +3560946215,3560946215,PE +3560946216,3560946216,DE +3560946217,3560946229,US +3560946230,3560946230,AR +3560946231,3560946231,US +3560946232,3560946232,CA +3560946233,3560946234,US +3560946235,3560946235,CL +3560946236,3560946237,US +3560946238,3560946238,AR +3560946239,3560946253,US +3560946254,3560946254,SG +3560946255,3560946256,US +3560946257,3560946257,MX +3560946258,3560946259,US +3560946260,3560946260,AR +3560946261,3560946262,US +3560946263,3560946263,AR +3560946264,3560946266,US +3560946267,3560946267,CA +3560946268,3560946271,US +3560946272,3560946272,DE +3560946273,3560946273,CA +3560946274,3560946279,US +3560946280,3560946280,ES +3560946281,3560946282,US +3560946283,3560946283,CL +3560946284,3560946284,US +3560946285,3560946285,CO +3560946286,3560946290,US +3560946291,3560946291,CA +3560946292,3560946295,US +3560946296,3560946296,CL +3560946297,3560946297,DE +3560946298,3560946298,US +3560946299,3560946299,DE +3560946300,3560946300,CL +3560946301,3560946311,DE +3560946312,3560946312,US +3560946313,3560946317,DE +3560946318,3560946319,US +3560946320,3560946320,DE +3560946321,3560946326,US +3560946327,3560946327,CA +3560946328,3560946328,US +3560946329,3560946329,DO +3560946330,3560946330,US +3560946331,3560946331,DO +3560946332,3560946333,CA +3560946334,3560946335,US +3560946336,3560946336,CA +3560946337,3560946337,DE +3560946338,3560946338,CA +3560946339,3560946339,US +3560946340,3560946340,CL +3560946341,3560946342,CA +3560946343,3560946343,DO +3560946344,3560946344,AR +3560946345,3560946345,US +3560946346,3560946346,PE +3560946347,3560946347,US +3560946348,3560946361,DE +3560946362,3560946363,US +3560946364,3560946367,DE +3560946368,3560946368,US +3560946369,3560946372,DE +3560946373,3560946373,US +3560946374,3560946374,DE +3560946375,3560946375,US +3560946376,3560946398,DE +3560946399,3560946399,US +3560946400,3560946408,DE +3560946409,3560946409,US +3560946410,3560946419,DE +3560946420,3560946420,US +3560946421,3560946431,DE +3560946432,3560946443,US +3560946444,3560946447,BR +3560946448,3560946451,DE +3560946452,3560946455,BO +3560946456,3560946467,US +3560946468,3560946471,BR +3560946472,3560946483,US +3560946484,3560946487,MX +3560946488,3560946491,US +3560946492,3560946495,BR +3560946496,3560946499,VE +3560946500,3560946503,AR +3560946504,3560946507,US +3560946508,3560946511,MX +3560946512,3560946523,US +3560946524,3560946527,MX +3560946528,3560946531,US +3560946532,3560946535,CA +3560946536,3560946539,PE +3560946540,3560946543,US +3560946544,3560946547,CA +3560946548,3560946551,US +3560946552,3560946555,PE +3560946556,3560946559,US +3560946560,3560946563,BR +3560946564,3560946567,US +3560946568,3560946571,BR +3560946572,3560946579,US +3560946580,3560946583,CA +3560946584,3560946587,US +3560946588,3560946591,AR +3560946592,3560946603,US +3560946604,3560946607,AR +3560946608,3560946611,BR +3560946612,3560946623,US +3560946624,3560946635,MX +3560946636,3560946643,US +3560946644,3560946647,AR +3560946648,3560946651,MX +3560946652,3560946655,CL +3560946656,3560946659,BR +3560946660,3560946663,MX +3560946664,3560946667,US +3560946668,3560946671,MX +3560946672,3560946679,BR +3560946680,3560946687,US +3560946688,3560946689,DE +3560946690,3560946695,US +3560946696,3560946696,BR +3560946697,3560946698,US +3560946699,3560946700,DE +3560946701,3560946701,CO +3560946702,3560946706,US +3560946707,3560946707,VE +3560946708,3560946708,BR +3560946709,3560946710,VE +3560946711,3560946711,US +3560946712,3560946712,VE +3560946713,3560946714,US +3560946715,3560946715,CO +3560946716,3560946716,US +3560946717,3560946717,AR +3560946718,3560946718,US +3560946719,3560946720,BR +3560946721,3560946723,CO +3560946724,3560946724,MX +3560946725,3560946729,US +3560946730,3560946730,MX +3560946731,3560946733,US +3560946734,3560946734,PR +3560946735,3560946747,US +3560946748,3560946748,DE +3560946749,3560946760,US +3560946761,3560946761,DE +3560946762,3560946762,US +3560946763,3560946763,DE +3560946764,3560946767,US +3560946768,3560946768,CA +3560946769,3560946769,US +3560946770,3560946825,DE +3560946826,3560946826,US +3560946827,3560946835,DE +3560946836,3560946836,US +3560946837,3560946839,DE +3560946840,3560946840,US +3560946841,3560946943,DE +3560946944,3560946947,US +3560946948,3560946951,BR +3560946952,3560946955,MX +3560946956,3560946959,CO +3560946960,3560946963,MX +3560946964,3560946967,AR +3560946968,3560946979,US +3560946980,3560946987,DE +3560946988,3560946991,US +3560946992,3560946995,DE +3560946996,3560946999,UY +3560947000,3560947015,US +3560947016,3560947019,AR +3560947020,3560947027,US +3560947028,3560947031,CO +3560947032,3560947039,US +3560947040,3560947043,BR +3560947044,3560947067,US +3560947068,3560947071,AR +3560947072,3560947075,BR +3560947076,3560947095,US +3560947096,3560947099,MX +3560947100,3560947107,US +3560947108,3560947111,DE +3560947112,3560947123,US +3560947124,3560947127,CO +3560947128,3560947143,US +3560947144,3560947147,DE +3560947148,3560947159,US +3560947160,3560947163,PR +3560947164,3560947191,US +3560947192,3560947195,VE +3560947196,3560947199,DE +3560947200,3560947203,CA +3560947204,3560947207,US +3560947208,3560947211,DE +3560947212,3560947231,US +3560947232,3560947235,CA +3560947236,3560947239,CO +3560947240,3560947247,US +3560947248,3560947251,CA +3560947252,3560947267,US +3560947268,3560947271,CO +3560947272,3560947275,US +3560947276,3560947279,AR +3560947280,3560947283,MX +3560947284,3560947287,US +3560947288,3560947291,BR +3560947292,3560947331,US +3560947332,3560947335,MX +3560947336,3560947343,US +3560947344,3560947347,MX +3560947348,3560947351,CO +3560947352,3560947355,US +3560947356,3560947359,CW +3560947360,3560947363,US +3560947364,3560947367,HN +3560947368,3560947371,BR +3560947372,3560947375,CA +3560947376,3560947383,US +3560947384,3560947391,CO +3560947392,3560947395,MX +3560947396,3560947399,US +3560947400,3560947407,AR +3560947408,3560947411,US +3560947412,3560947415,AR +3560947416,3560947431,US +3560947432,3560947435,MX +3560947436,3560947439,DE +3560947440,3560947443,BR +3560947444,3560947455,US +3560947456,3560947463,DE +3560947464,3560947475,JP +3560947476,3560947507,DE +3560947508,3560947511,JP +3560947512,3560947523,DE +3560947524,3560947527,JP +3560947528,3560947535,DE +3560947536,3560947543,JP +3560947544,3560947551,DE +3560947552,3560947555,JP +3560947556,3560947559,DE +3560947560,3560947567,JP +3560947568,3560947571,DE +3560947572,3560947591,JP +3560947592,3560947603,DE +3560947604,3560947607,JP +3560947608,3560947623,DE +3560947624,3560947631,JP +3560947632,3560947655,DE +3560947656,3560947659,JP +3560947660,3560947667,DE +3560947668,3560947683,JP +3560947684,3560947687,DE +3560947688,3560947703,JP +3560947704,3560947707,DE +3560947708,3560947711,JP +3560947712,3560955903,SE +3560955904,3560964095,BE +3560964096,3560996863,CN +3560996864,3561005055,GB +3561005056,3561013247,ES +3561013248,3561021439,TR +3561021440,3561022463,DE +3561022464,3561022975,AT +3561022976,3561037823,DE +3561037824,3561046015,BE +3561046016,3561054207,RU +3561054208,3561062399,MT +3561062400,3561070591,TR +3561070592,3561078783,CH +3561078784,3561095167,CZ +3561095168,3561103359,DE +3561103360,3561111551,UA +3561111552,3561119743,LU +3561119744,3561127935,IT +3561127936,3561136127,DE +3561136128,3561144319,ES +3561144320,3561152511,FI +3561152512,3561160703,IT +3561160704,3561168895,RU +3561168896,3561172991,FR +3561172992,3561177087,NO +3561177088,3561185279,CZ +3561185280,3561193471,GB +3561193472,3561201663,PL +3561201664,3561209855,NL +3561209856,3561218047,GB +3561218048,3561226239,AT +3561226240,3561234431,FI +3561234432,3561242623,TR +3561242624,3561259007,DE +3561259008,3561267199,IL +3561267200,3561275391,UA +3561275392,3561291775,BE +3561291776,3561297919,RS +3561297920,3561298943,ME +3561298944,3561299967,RS +3561299968,3561308159,GB +3561308160,3561316351,PL +3561316352,3561324543,RU +3561324544,3561325567,CZ +3561326592,3561328639,IT +3561328640,3561332735,US +3561332736,3561340927,AT +3561340928,3561357311,GB +3561357312,3561365503,DK +3561365504,3561373695,SA +3561373696,3561381887,GB +3561381888,3561390079,QA +3561390080,3561398271,BG +3561398272,3561406463,LV +3561406464,3561414655,GR +3561414656,3561422847,IT +3561422848,3561431039,BE +3561431040,3561439231,SA +3561439232,3561447423,NO +3561447424,3561455615,CH +3561455616,3561471999,CZ +3561472000,3561480191,DE +3561480192,3561488383,GB +3561488384,3561496575,OM +3561496576,3561498111,GB +3561498112,3561498367,DE +3561498368,3561498495,GB +3561498496,3561498559,NL +3561498560,3561498623,GB +3561498624,3561500671,NL +3561500672,3561502719,GB +3561502720,3561503743,NL +3561503744,3561504767,GB +3561504768,3561512959,DE +3561512960,3561521151,SI +3561521152,3561529343,GE +3561529344,3561536767,DE +3561536768,3561537023,PL +3561537024,3561537535,DE +3561537536,3561545727,BG +3561545728,3561553919,NL +3561553920,3561562111,SE +3561562112,3561570303,ES +3561570304,3561578495,AM +3561578496,3561586687,RU +3561586688,3561594879,BG +3561594880,3561603071,SE +3561603072,3561607167,FR +3561607168,3561607391,GB +3561607392,3561607423,FR +3561607424,3561607679,GB +3561607680,3561608191,FR +3561608192,3561609215,GB +3561609216,3561611263,FR +3561611264,3561611519,GB +3561611520,3561611775,FR +3561611776,3561612543,GB +3561612544,3561612799,FR +3561612800,3561613759,GB +3561613760,3561613823,FR +3561613824,3561614207,GB +3561614208,3561614335,FR +3561614336,3561614847,GB +3561614848,3561615103,FR +3561615104,3561615359,GB +3561615360,3561617407,FR +3561617408,3561618175,ES +3561618176,3561618431,IE +3561618432,3561618877,ES +3561618878,3561618878,PL +3561618879,3561619071,ES +3561619072,3561619072,GB +3561619073,3561619455,ES +3561619456,3561640575,GB +3561640576,3561640831,FR +3561640832,3561652223,GB +3561652224,3561668607,CH +3561668608,3561684991,RU +3561684992,3561693183,BG +3561693184,3561701375,DE +3561701376,3561709567,SE +3561709568,3561717759,PL +3561717760,3561725951,RU +3561725952,3561734143,ES +3561734144,3561750527,RU +3561750528,3561758719,KZ +3561758720,3561766911,PL +3561766912,3561775103,SA +3561775104,3561783295,IL +3561783296,3561799679,RU +3561799680,3561807871,DE +3561807872,3561816063,BE +3561816064,3561824255,VA +3561824256,3561828351,AT +3561828352,3561832447,LI +3561832448,3561840639,IT +3561840640,3561848831,PL +3561848832,3561857023,RU +3561857024,3561865215,DE +3561865216,3561873407,QA +3561873408,3561881599,DE +3561881600,3561889791,IT +3561889792,3561897983,FR +3561897984,3561906175,GB +3561906176,3561914367,DE +3561914368,3561922559,ES +3561922560,3561923583,GB +3561923584,3561924607,NL +3561924608,3561925023,GB +3561925024,3561925039,NL +3561925040,3561925079,GB +3561925080,3561925087,NL +3561925088,3561925343,GB +3561925344,3561925375,NL +3561925376,3561926655,GB +3561926656,3561938943,NL +3561938944,3561947135,IE +3561947136,3561963519,DE +3561963520,3561971711,BE +3561971712,3561975807,CZ +3561975808,3561979903,UA +3561979904,3561988095,ES +3561988096,3562004479,DE +3562004480,3562012671,NL +3562012672,3562020863,IR +3562020864,3562029055,UA +3562029056,3562037247,CZ +3562037248,3562045439,CH +3562045440,3562056711,ES +3562056712,3562056719,NL +3562056720,3562056911,ES +3562056912,3562056927,FR +3562056928,3562057471,ES +3562057472,3562057727,DE +3562057728,3562057975,ES +3562057976,3562057983,FR +3562057984,3562059327,ES +3562059328,3562059335,CH +3562059336,3562059391,ES +3562059392,3562059519,CH +3562059520,3562061823,ES +3562070016,3562078207,DE +3562078208,3562086399,SK +3562094592,3562094879,GB +3562094880,3562094975,CH +3562094976,3562102449,GB +3562102450,3562102450,DE +3562102451,3562102847,GB +3562102848,3562102851,NO +3562102852,3562102963,GB +3562102964,3562102967,NO +3562102968,3562110607,GB +3562110608,3562110623,FR +3562110624,3562110975,GB +3562110976,3562143743,ES +3562143744,3562151935,GB +3562151936,3562160127,DE +3562160128,3562169343,GB +3562169344,3562170367,CH +3562170368,3562172415,IE +3562172416,3562173951,CH +3562173952,3562174463,GB +3562174464,3562176511,CH +3562176512,3562184703,FR +3562184704,3562192895,DE +3562192896,3562201087,UA +3562201088,3562209279,DE +3562209280,3562217471,RU +3562217472,3562225663,DE +3562225664,3562233855,NL +3562233856,3562242047,FI +3562242048,3562253276,FR +3562253277,3562253277,NL +3562253278,3562258431,FR +3562258432,3562283007,NL +3562283008,3562285055,IT +3562285056,3562287103,IE +3562287104,3562289151,IT +3562289152,3562291199,FR +3562291200,3562307583,GB +3562307584,3562315775,NL +3562315776,3562323967,GB +3562323968,3562340351,DE +3562340352,3562348543,GB +3562348544,3562356735,ES +3562356736,3562362431,SE +3562362432,3562362495,GB +3562362496,3562364927,SE +3562364928,3562373119,PL +3562373120,3562381311,FR +3562381312,3562389503,SI +3562389504,3562397695,GH +3562397696,3562398975,GB +3562398976,3562399743,FR +3562399744,3562403839,ES +3562403840,3562405887,GB +3562405888,3562414079,FI +3562414080,3562422271,DE +3562422272,3562430463,IR +3562430464,3562431231,UA +3562431232,3562431487,RU +3562431488,3562431999,UA +3562432000,3562432255,NL +3562432256,3562433279,UA +3562433280,3562433535,CZ +3562433536,3562434047,NL +3562434048,3562435071,UA +3562435072,3562435583,NL +3562435584,3562438655,UA +3562438656,3562463231,DE +3562463232,3562471423,UA +3562471424,3562479615,PL +3562479616,3562487807,DE +3562487808,3562495999,GB +3562496000,3562504191,BE +3562504192,3562507071,DE +3562507072,3562507079,AT +3562507080,3562507111,DE +3562507112,3562507199,AT +3562507200,3562512383,DE +3562512384,3562520575,UA +3562528768,3562536959,PL +3562536960,3562545151,AT +3562545152,3562553343,GB +3562553344,3562561535,DK +3562561536,3562569727,UG +3562569728,3562577919,DE +3562577920,3562586111,AT +3562586112,3562594303,DE +3562594304,3562602495,BE +3562602496,3562610687,ES +3562610688,3562618879,NO +3562618880,3562627071,GB +3562627072,3562643455,DE +3562643456,3562651647,AT +3562651648,3562659839,DE +3562659840,3562668031,SK +3562668032,3562676223,IT +3562676224,3562684415,UA +3562684416,3562692607,FI +3562700800,3562708991,DE +3562708992,3562717183,UA +3562717184,3562725375,CH +3562725376,3562733567,CZ +3562733568,3562741759,PL +3562741760,3562758143,IT +3562758144,3562766335,HR +3562766336,3562774527,SE +3562774528,3562782719,BG +3562782720,3562790911,RU +3562790912,3562799103,DE +3562799104,3562807295,HU +3562807296,3562815487,ES +3562815488,3562823679,NL +3562823680,3562825215,RU +3562825216,3562825727,MY +3562825728,3562831359,NL +3562831360,3562831615,FR +3562831616,3562848255,RU +3562848256,3562856447,HR +3562856448,3562864639,UA +3562864640,3562872831,DE +3562872832,3562881023,DK +3562881024,3562889215,GB +3562889216,3562897407,LV +3562897408,3562905599,RO +3562905600,3562921983,SA +3562921984,3562930175,SI +3562930176,3562938367,RU +3562938368,3562946559,CH +3562946560,3562954751,FI +3562954752,3562962943,RU +3562962944,3562971135,IT +3562971136,3562987519,FR +3562987520,3562995711,DE +3562995712,3563003903,AT +3563003904,3563005183,DE +3563005184,3563005311,KZ +3563005312,3563006591,DE +3563006592,3563006719,CA +3563006720,3563008255,DE +3563008256,3563008511,PL +3563008512,3563010815,DE +3563010816,3563011071,PL +3563011072,3563012095,DE +3563012096,3563020287,FR +3563020288,3563028479,DE +3563028480,3563036671,IR +3563036672,3563044863,BG +3563044864,3563053055,ES +3563053056,3563061247,GB +3563061248,3563065343,GH +3563065344,3563067391,NG +3563067392,3563068415,MZ +3563068416,3563069439,NG +3563069440,3563077631,HU +3563077632,3563085823,KZ +3563085824,3563094015,RU +3563094016,3563102207,DE +3563102208,3563110399,CZ +3563110400,3563118591,RU +3563118592,3563126783,PL +3563126784,3563127807,RU +3563127808,3563128831,KG +3563128832,3563130879,RU +3563130880,3563134975,KG +3563134976,3563143167,IT +3563143168,3563151359,GB +3563151360,3563159551,DE +3563159552,3563167743,DK +3563167744,3563175935,ES +3563175936,3563192319,DK +3563192320,3563200511,TR +3563200512,3563208703,CH +3563208704,3563225087,DK +3563225088,3563233279,LB +3563233280,3563241471,BY +3563241472,3563257855,TR +3563257856,3563290623,FR +3563290624,3563315199,DE +3563315200,3563323391,DK +3563323648,3563331583,GB +3563331584,3563339775,DE +3563339776,3563347967,NG +3563347968,3563348991,GB +3563348992,3563353087,FI +3563353088,3563356159,GB +3563356160,3563364351,RU +3563364352,3563372543,BE +3563372544,3563380735,SA +3563380736,3563388927,GB +3563388928,3563397119,CH +3563397120,3563405311,DE +3563405312,3563407871,ES +3563407872,3563407903,US +3563407904,3563413503,ES +3563413504,3563421695,TR +3563421696,3563438079,SI +3563438080,3563446271,DE +3563446272,3563454463,LB +3563454464,3563462655,SA +3563462656,3563479039,IT +3563479040,3563487231,GB +3563487232,3563495423,RS +3563495424,3563503615,DE +3563503616,3563511807,GB +3563511808,3563519999,DE +3563520000,3563528191,FR +3563536384,3563544575,CH +3563544576,3563552767,RU +3563552768,3563560959,SI +3563560960,3563569151,EG +3563569152,3563577343,IT +3563577344,3563585535,GB +3563585536,3563601919,IT +3563601920,3563610111,RU +3563610112,3563618303,BG +3563618304,3563626495,GB +3563626496,3563634687,ES +3563634688,3563651071,NL +3563651072,3563683839,SE +3563683840,3563692031,BE +3563692032,3563700223,GB +3563700224,3563708415,DE +3563708416,3563716607,HU +3563716608,3563724799,PL +3563724800,3563732991,RU +3563732992,3563741183,PS +3563741184,3563749375,GB +3563749376,3563765759,PL +3563765760,3563782143,ES +3563790336,3563798527,EE +3563798528,3563800607,FR +3563800608,3563800623,GB +3563800624,3563800767,FR +3563800768,3563800783,GB +3563800784,3563800911,FR +3563800912,3563800927,GB +3563800928,3563800943,FR +3563800944,3563800991,GB +3563800992,3563801135,FR +3563801136,3563801151,DE +3563801152,3563801183,FR +3563801184,3563801199,DE +3563801200,3563801279,FR +3563801280,3563801295,NL +3563801296,3563801375,FR +3563801376,3563801391,GB +3563801392,3563801407,IT +3563801408,3563801423,DE +3563801424,3563801455,FR +3563801456,3563801519,GB +3563801520,3563801551,FR +3563801552,3563801567,GB +3563801568,3563801599,FR +3563801600,3563801631,GB +3563801632,3563801647,FR +3563801648,3563801743,GB +3563801744,3563801775,FR +3563801776,3563801791,BE +3563801792,3563801839,FR +3563801840,3563801855,GB +3563801856,3563801871,FR +3563801872,3563801887,GB +3563801888,3563801922,FR +3563801923,3563801935,GB +3563801936,3563802015,FR +3563802016,3563802031,BE +3563802032,3563802047,FR +3563802048,3563802063,IT +3563802064,3563802207,FR +3563802208,3563802223,GB +3563802224,3563802255,FR +3563802256,3563802271,GB +3563802272,3563802303,FR +3563802304,3563802319,IT +3563802320,3563802447,FR +3563802448,3563802463,GB +3563802464,3563802623,FR +3563802624,3563802655,GB +3563802656,3563802735,FR +3563802736,3563802751,US +3563802752,3563802783,GB +3563802784,3563803007,FR +3563803008,3563803023,GB +3563803024,3563803039,FR +3563803040,3563803055,GB +3563803056,3563803119,FR +3563803120,3563803135,NL +3563803136,3563803151,FR +3563803152,3563803167,GB +3563803168,3563803183,FR +3563803184,3563803215,GB +3563803216,3563803247,FR +3563803248,3563803263,GB +3563803264,3563803279,FR +3563803280,3563803295,GB +3563803296,3563803311,FR +3563803312,3563803327,GB +3563803328,3563803359,FR +3563803360,3563803423,GB +3563803424,3563803439,FR +3563803440,3563803455,DE +3563803456,3563803487,GB +3563803488,3563803503,US +3563803504,3563803519,GB +3563803520,3563803631,FR +3563803632,3563803647,GB +3563803648,3563803967,FR +3563803968,3563803983,BE +3563803984,3563804695,FR +3563804696,3563804703,GB +3563804704,3563804719,FR +3563804720,3563804727,GB +3563804728,3563806719,FR +3563806720,3563814911,SA +3563814912,3563823103,SE +3563823104,3563831295,DE +3563831296,3563847679,RU +3563847680,3563848447,NL +3563848448,3563848703,GB +3563848704,3563848847,NL +3563848848,3563848848,GB +3563848849,3563848849,NL +3563848850,3563848855,GB +3563848856,3563855871,NL +3563855872,3563864063,AT +3563864064,3563872255,GB +3563872256,3563880447,RU +3563880448,3563888639,TR +3563888640,3563896831,DE +3563896832,3563913215,HU +3563913216,3563921407,RU +3563921408,3563929599,UA +3563929600,3563937791,CH +3563937792,3563945983,TR +3563945984,3563956223,PL +3563956224,3563958271,RU +3563958272,3563962367,CZ +3563962368,3563970559,RU +3563970560,3563978751,TR +3563978752,3563995135,IT +3563995136,3564003327,MK +3564003328,3564011519,DE +3564011520,3564019711,UA +3564019712,3564027903,GB +3564027904,3564044287,DE +3564044288,3564052479,CZ +3564052480,3564060671,GB +3564060672,3564068863,RU +3564068864,3564077055,ES +3564077056,3564093439,GB +3564093440,3564101631,UA +3564101632,3564109823,DE +3564109824,3564126207,SE +3564126208,3564134399,IT +3564134400,3564142591,KG +3564142592,3564150783,DK +3564150784,3564154943,SE +3564154944,3564154975,FI +3564154976,3564158831,SE +3564158832,3564158839,FI +3564158840,3564158975,SE +3564158976,3564175359,DE +3564175360,3564176639,GB +3564176640,3564176671,PL +3564176672,3564183551,GB +3564183552,3564191743,UA +3564199936,3564208127,RU +3564208128,3564216319,GB +3564216320,3564224511,PT +3564224512,3564232703,GB +3564232704,3564249087,RU +3564249088,3564265471,DE +3564265472,3564273663,NL +3564273664,3564294399,DE +3564294400,3564294403,IT +3564294404,3564306431,DE +3564306432,3564314623,TR +3564322816,3564331007,IT +3564339200,3564355583,GB +3564355584,3564363775,NL +3564363776,3564371967,UA +3564371968,3564380159,DE +3564380160,3564388351,FI +3564388352,3564391135,SE +3564391136,3564391167,US +3564391168,3564396543,SE +3564396544,3564404735,RU +3564404736,3564412927,BG +3564412928,3564421119,IL +3564421120,3564429311,SA +3564429312,3564437503,KZ +3564437504,3564445695,LT +3564445696,3564453887,BG +3564453888,3564462079,DE +3564462080,3564470271,CH +3564470272,3564478463,IL +3564478464,3564486655,LU +3564486656,3564494847,CH +3564503040,3564511231,JO +3564511232,3564519423,RU +3564519424,3564527615,SI +3564527616,3564543999,SA +3564544000,3564560383,DE +3564560384,3564571695,GB +3564571696,3564571703,DE +3564571704,3564572427,GB +3564572428,3564572431,ES +3564572432,3564572527,GB +3564572528,3564572531,DK +3564572532,3564574719,GB +3564574720,3564574975,NL +3564574976,3564575487,GB +3564575488,3564575615,DE +3564575616,3564576767,GB +3564584960,3564593151,SA +3564593152,3564601343,RU +3564601344,3564609535,EE +3564609536,3564634111,RU +3564634112,3564642303,MK +3564642304,3564650495,CH +3564650496,3564666879,NL +3564666880,3564675071,IE +3564675072,3564683263,RU +3564683264,3564691455,IR +3564691456,3564699647,GI +3564699648,3564716031,GB +3564716032,3564724223,IT +3564724224,3564732415,NL +3564732416,3564733183,GB +3564733184,3564733215,DE +3564733216,3564733259,GB +3564733260,3564733263,DE +3564733264,3564733343,GB +3564733344,3564733351,DE +3564733352,3564733807,GB +3564733808,3564733823,DE +3564733824,3564734457,GB +3564734458,3564734458,DE +3564734459,3564734741,GB +3564734742,3564734742,DE +3564734743,3564734743,GB +3564734744,3564734751,DE +3564734752,3564734775,GB +3564734776,3564734783,DE +3564734784,3564739327,GB +3564739328,3564739343,DE +3564739344,3564739345,GB +3564739346,3564739346,DE +3564739347,3564739375,GB +3564739376,3564739383,DE +3564739384,3564740607,GB +3564740608,3564748799,FR +3564748800,3564756991,GB +3564756992,3564765183,ES +3564765184,3564773375,RU +3564773376,3564781567,DE +3564781568,3564787455,LT +3564787456,3564787583,NL +3564787584,3564789759,LT +3564789760,3564797951,ES +3564797952,3564806143,DE +3564806144,3564814335,BG +3564814336,3564822527,PL +3564822528,3564830719,EG +3564830720,3564838911,BE +3564838912,3564847103,DE +3564847104,3564855295,IT +3564855296,3564863487,DE +3564863488,3564879871,NL +3564879872,3564879935,GB +3564879936,3564879999,NL +3564880000,3564880519,GB +3564880520,3564880523,NL +3564880524,3564880651,GB +3564880652,3564880655,NL +3564880656,3564880945,GB +3564880946,3564880946,NL +3564880947,3564882015,GB +3564882016,3564882031,NL +3564882032,3564882399,GB +3564882400,3564882415,NL +3564882416,3564882543,GB +3564882544,3564882551,NL +3564882552,3564882559,GB +3564882560,3564882591,NL +3564882592,3564883071,GB +3564883072,3564883079,NL +3564883080,3564883199,GB +3564883200,3564883455,NL +3564883456,3564886271,GB +3564886272,3564886527,NL +3564886528,3564886719,GB +3564886720,3564886751,NL +3564886752,3564888991,GB +3564888992,3564889007,ES +3564889008,3564889633,GB +3564889634,3564889634,NL +3564889635,3564891119,GB +3564891120,3564891135,NL +3564891136,3564895231,GB +3564895232,3564895743,NL +3564895744,3564895959,GB +3564895960,3564895967,DE +3564895968,3564896095,GB +3564896096,3564896111,DE +3564896112,3564896255,GB +3564896256,3564904447,RU +3564904448,3564912639,DE +3564912640,3564913663,NL +3564913664,3564913919,ES +3564913920,3564914175,IE +3564914176,3564914431,FR +3564914432,3564914687,IE +3564914688,3564915711,GB +3564915712,3564915712,IN +3564915713,3564916735,US +3564916736,3564917759,MX +3564917760,3564918783,US +3564918784,3564920831,IT +3564920832,3564922111,DE +3564922112,3564924927,US +3564924928,3564926975,DE +3564926976,3564929023,US +3564929024,3564937215,AT +3564937216,3564945407,IT +3564945408,3564953599,GB +3564953600,3564954879,AT +3564954880,3564957695,GB +3564957696,3564960959,AT +3564960960,3564960975,GB +3564960976,3564961791,AT +3564961792,3564969983,TR +3564969984,3564978175,DE +3564978176,3564986367,GB +3564986368,3564994559,DE +3564994560,3565002751,NL +3565002752,3565027327,NO +3565027328,3565035519,PL +3565035520,3565037567,IE +3565037568,3565038591,GB +3565038592,3565038847,IE +3565038848,3565038879,GB +3565038880,3565038895,IE +3565038896,3565039615,GB +3565039616,3565041663,IE +3565041664,3565043711,GB +3565043712,3565051903,AT +3565051904,3565060095,IQ +3565060096,3565068287,GB +3565068288,3565076479,CH +3565076480,3565084671,DE +3565084672,3565092863,IS +3565092864,3565101055,GB +3565101056,3565109247,DE +3565109248,3565117439,PL +3565117440,3565125631,TR +3565125632,3565158399,NL +3565158400,3565223935,ES +3565223936,3565240319,FR +3565240320,3565248511,IE +3565248512,3565256703,RU +3565256704,3565289471,CN +3565289472,3565355007,DK +3565355008,3565420543,IT +3565420544,3565486335,GB +3565486336,3565486975,FR +3565486976,3565487615,NL +3565487616,3565495295,GB +3565495296,3565496319,FR +3565496320,3565502463,GB +3565502464,3565503487,NL +3565503488,3565518847,GB +3565518848,3565551615,TR +3565551616,3565682687,GB +3565682688,3565748223,NL +3565748224,3565752319,GB +3565752464,3565752479,GB +3565752536,3565752559,GB +3565752576,3565752839,GB +3565752856,3565752879,GB +3565752888,3565752983,GB +3565752992,3565752999,GB +3565753016,3565753031,GB +3565753040,3565753071,GB +3565753080,3565753183,GB +3565753248,3565753279,GB +3565753344,3565753791,GB +3565753800,3565753815,GB +3565753824,3565753831,GB +3565753840,3565753847,GB +3565753984,3565754367,GB +3565754496,3565754511,GB +3565754624,3565755263,GB +3565755280,3565755359,GB +3565755376,3565755583,GB +3565755648,3565755695,GB +3565755704,3565755727,GB +3565755736,3565755831,GB +3565755840,3565755847,GB +3565755856,3565755871,GB +3565755880,3565755903,GB +3565756152,3565756159,GB +3565756416,3565760783,GB +3565760792,3565760799,GB +3565760808,3565760823,GB +3565760832,3565760855,GB +3565760864,3565760935,GB +3565760944,3565760967,GB +3565760976,3565761007,GB +3565761016,3565761279,GB +3565761344,3565761535,GB +3565761544,3565761599,GB +3565761616,3565761631,GB +3565761640,3565761647,GB +3565761656,3565761687,GB +3565761704,3565761727,GB +3565761752,3565761783,GB +3565761792,3565762047,GB +3565762048,3565762303,ZA +3565762560,3565762815,GB +3565763072,3565763455,GB +3565763488,3565763599,GB +3565763616,3565763671,GB +3565763680,3565763703,GB +3565763720,3565763735,GB +3565763744,3565763751,GB +3565763760,3565763799,GB +3565763808,3565763815,GB +3565763832,3565763839,GB +3565763884,3565763891,GB +3565764096,3565764183,GB +3565764192,3565764207,GB +3565764256,3565764367,GB +3565764376,3565764439,GB +3565764448,3565764455,GB +3565764464,3565764551,GB +3565764576,3565766655,GB +3565766912,3565767167,GB +3565767176,3565767255,GB +3565767272,3565767287,GB +3565767296,3565767351,GB +3565767360,3565767399,GB +3565767408,3565767439,GB +3565767456,3565767487,GB +3565767504,3565767599,GB +3565767616,3565767631,GB +3565767680,3565767999,GB +3565768208,3565768223,GB +3565768240,3565768247,GB +3565768448,3565768575,GB +3565768704,3565768983,GB +3565769472,3565769727,GB +3565770752,3565771775,GB +3565777920,3565813759,GB +3565813760,3565879295,SA +3565879296,3566010367,GB +3566010368,3566075903,IT +3566075904,3566092287,NL +3566092288,3566108671,LV +3566108672,3566141439,ES +3566141440,3566206975,IL +3566206976,3566272511,DE +3566272512,3566338047,ES +3566338048,3566354431,FI +3566354432,3566370815,RO +3566370816,3566403583,TR +3566403584,3566436351,CH +3566436352,3566469119,IE +3566469120,3566534655,GB +3566534656,3566551039,DE +3566551040,3566600191,FI +3566600192,3566607359,IL +3566607360,3566607615,GN +3566607616,3566665727,IL +3566665728,3566723071,SE +3566723072,3566723327,RU +3566723328,3566739455,SE +3566739456,3566747647,RU +3566747648,3566764031,GR +3566764032,3566796799,AT +3566796800,3566862335,NL +3566862336,3566895103,TR +3566895104,3566927871,KZ +3566927872,3566993407,FR +3566993408,3567058943,TR +3567058944,3567124479,FR +3567124992,3567125023,GB +3567125248,3567125503,GB +3567126688,3567126759,GB +3567127552,3567127807,GB +3567129856,3567129887,GB +3567130016,3567130079,GB +3567131384,3567131647,GB +3567133216,3567133247,GB +3567133368,3567133375,GB +3567134208,3567134335,GB +3567134848,3567134975,GB +3567136000,3567136255,GB +3567136512,3567136575,GB +3567136640,3567136671,GB +3567136768,3567136895,GB +3567137024,3567137279,GB +3567137600,3567137663,GB +3567137988,3567137991,GB +3567138000,3567138003,GB +3567140096,3567140351,GB +3567140864,3567140927,GB +3567141632,3567141887,GB +3567142272,3567142399,GB +3567143432,3567143439,GB +3567143520,3567143551,GB +3567143680,3567143687,GB +3567143872,3567143935,GB +3567143952,3567143967,GB +3567144172,3567144175,GB +3567144320,3567144447,GB +3567144768,3567144831,GB +3567147528,3567147535,GB +3567147552,3567147559,GB +3567148520,3567148527,GB +3567148800,3567149055,GB +3567149088,3567149119,GB +3567149904,3567149911,GB +3567149920,3567149935,GB +3567151136,3567151199,GB +3567151232,3567151263,GB +3567152000,3567152127,GB +3567152160,3567152191,GB +3567152256,3567152383,GB +3567152400,3567152407,GB +3567152640,3567152647,GB +3567152744,3567152751,GB +3567152832,3567152863,GB +3567152960,3567152991,GB +3567153024,3567153055,GB +3567153600,3567153607,GB +3567153616,3567153623,GB +3567153648,3567153663,GB +3567153688,3567153703,GB +3567153720,3567153727,GB +3567153824,3567153847,GB +3567154304,3567154367,GB +3567155200,3567155967,GB +3567156416,3567156607,GB +3567157248,3567165439,CZ +3567165440,3567169535,RU +3567169536,3567173631,MK +3567173632,3567239167,GB +3567239168,3567255551,NL +3567255552,3567263743,PL +3567263744,3567271935,ES +3567271936,3567321087,PL +3567321088,3567338615,GB +3567338616,3567338623,DE +3567338624,3567344447,GB +3567344448,3567344479,ES +3567344480,3567345623,GB +3567345624,3567345631,IE +3567345632,3567350271,GB +3567350272,3567350527,ES +3567350528,3567353855,GB +3567353856,3567386623,CH +3567386624,3567388351,GB +3567388352,3567388383,DE +3567388384,3567388543,GB +3567388544,3567388607,DE +3567388608,3567388647,GB +3567388648,3567388655,DE +3567388656,3567389695,GB +3567389696,3567390719,DE +3567390720,3567391865,GB +3567391866,3567391866,PL +3567391867,3567393801,GB +3567393802,3567393802,SI +3567393803,3567399935,GB +3567399936,3567400447,DE +3567400448,3567400959,GB +3567400960,3567401471,DE +3567401472,3567403007,GB +3567403008,3567419391,IT +3567427584,3567435775,SE +3567435776,3567453079,GB +3567453080,3567453087,ES +3567453088,3567453407,GB +3567453408,3567453439,ES +3567453440,3567453695,GB +3567453696,3567453951,ES +3567453952,3567456407,GB +3567456408,3567456415,ES +3567456416,3567456511,GB +3567456512,3567456767,ES +3567456768,3567458305,GB +3567458306,3567458306,ES +3567458307,3567458471,GB +3567458472,3567458479,ES +3567458480,3567458911,GB +3567458912,3567458943,ES +3567458944,3567459135,GB +3567459136,3567459151,ES +3567459152,3567459935,GB +3567459936,3567459943,ES +3567459944,3567463135,GB +3567463136,3567463143,ES +3567463144,3567465983,GB +3567465984,3567466239,ES +3567466240,3567490047,GB +3567490048,3567490303,ES +3567490304,3567494847,GB +3567494848,3567494911,ES +3567494912,3567499007,GB +3567499008,3567499135,ES +3567499136,3567499519,GB +3567499520,3567499775,ES +3567499776,3567500543,GB +3567500544,3567500799,ES +3567500800,3567502615,GB +3567502616,3567502623,ES +3567502624,3567503359,GB +3567503360,3567504383,ES +3567504384,3567505151,GB +3567505152,3567505407,ES +3567505408,3567507271,GB +3567507272,3567507287,ES +3567507288,3567511487,GB +3567511488,3567511495,ES +3567511496,3567516671,GB +3567516672,3567517695,ES +3567517696,3567583231,RU +3567583232,3567583487,AT +3567583744,3567583871,AT +3567583936,3567583999,AT +3567584256,3567584383,AT +3567584392,3567584407,AT +3567584512,3567584639,AT +3567585280,3567585311,TR +3567585792,3567586303,GB +3567586304,3567586815,TR +3567587328,3567591423,GB +3567591424,3567599615,IT +3567599616,3567615999,NL +3567616000,3567616767,GB +3567616768,3567617023,US +3567617024,3567618047,GB +3567618048,3567619071,IN +3567619072,3567619583,GB +3567619584,3567619839,NG +3567619840,3567620095,GB +3567620096,3567620351,IN +3567620352,3567627263,GB +3567627264,3567629311,LU +3567629312,3567630335,GB +3567630336,3567634431,LU +3567634432,3567636479,GB +3567636480,3567646719,LU +3567646720,3567648767,GB +3567648768,3567665151,BE +3567665152,3567673343,ES +3567673344,3567681535,AT +3567681536,3567714303,ES +3567714304,3567715327,GB +3567716352,3567717631,GB +3567717888,3567718015,GB +3567718144,3567718399,CH +3567718400,3567718655,US +3567718656,3567718911,GB +3567718912,3567719423,US +3567719424,3567719679,GB +3567779840,3567845375,DE +3567845376,3567861759,GB +3567861760,3567878143,NO +3567878144,3567976447,ES +3567976448,3568041983,IT +3568041984,3568107519,DE +3568107520,3568173055,GB +3568173056,3568304127,TR +3568304128,3568369663,RU +3568369664,3568435199,IT +3568435200,3568443391,UA +3568443392,3568476159,NL +3568476160,3568484351,DK +3568484352,3568492543,NL +3568492544,3568500735,RS +3568500736,3568566271,IL +3568566272,3568599039,FR +3568599040,3568631807,PL +3568631808,3568697343,SE +3568697344,3568730111,PL +3568730112,3568746495,NL +3568746496,3568762879,FI +3568762880,3568795647,AT +3568795648,3568803839,GB +3568803840,3568812031,IT +3568812032,3568828415,ES +3568828416,3568959487,DE +3568959488,3569025023,AT +3569025024,3569057791,NL +3569057792,3569074687,GB +3569074688,3569074943,IE +3569074944,3569075455,GB +3569075456,3569075711,IE +3569075712,3569090559,GB +3569090560,3569123327,RU +3569123328,3569156095,GB +3569156096,3569188863,NL +3569188864,3569221631,IT +3569221632,3569287167,BE +3569287168,3569352703,PL +3569352704,3569483775,RU +3569483776,3569614847,FR +3569614848,3569680383,GB +3569680384,3569713151,SK +3569713152,3569729535,AT +3569729536,3569731167,FR +3569731168,3569731183,IT +3569731184,3569731215,GB +3569731216,3569731231,FR +3569731232,3569731247,DE +3569731248,3569731263,GB +3569731264,3569731311,FR +3569731312,3569731327,GB +3569731328,3569731375,FR +3569731376,3569731391,GB +3569731392,3569731423,FR +3569731424,3569731439,GB +3569731440,3569731455,FR +3569731456,3569731471,GB +3569731472,3569731487,FR +3569731488,3569731503,GB +3569731504,3569731519,IT +3569731520,3569731551,GB +3569731552,3569731583,FR +3569731584,3569731599,GB +3569731600,3569731615,FR +3569731616,3569731631,DE +3569731632,3569731647,IT +3569731648,3569731727,FR +3569731728,3569731743,GB +3569731744,3569731791,FR +3569731792,3569731807,GB +3569731808,3569731839,FR +3569731840,3569731871,GB +3569731872,3569731903,FR +3569731904,3569731919,BE +3569731920,3569731951,FR +3569731952,3569731967,NL +3569731968,3569731983,GB +3569731984,3569732031,FR +3569732032,3569732047,DE +3569732048,3569732063,GB +3569732064,3569732079,FR +3569732080,3569732095,GB +3569732096,3569732143,FR +3569732144,3569732191,GB +3569732192,3569732207,DE +3569732208,3569732287,FR +3569732288,3569732303,GB +3569732304,3569732319,DE +3569732320,3569732335,FR +3569732336,3569732351,GB +3569732352,3569732383,FR +3569732384,3569732399,US +3569732400,3569732447,FR +3569732448,3569732479,US +3569732480,3569732495,GB +3569732496,3569732543,FR +3569732544,3569732575,GB +3569732576,3569732607,FR +3569732608,3569732639,GB +3569732640,3569732671,FR +3569732672,3569732703,GB +3569732704,3569732719,FR +3569732720,3569732735,GB +3569732736,3569732751,FR +3569732752,3569732767,GB +3569732768,3569732783,FR +3569732784,3569732847,GB +3569732848,3569732863,FR +3569732864,3569732879,GB +3569732880,3569732895,FR +3569732896,3569732911,IT +3569732912,3569733007,FR +3569733008,3569733023,IE +3569733024,3569733055,FR +3569733056,3569733087,GB +3569733088,3569733103,IT +3569733104,3569733183,FR +3569733184,3569733199,GB +3569733200,3569733263,FR +3569733264,3569733279,US +3569733280,3569733295,DE +3569733296,3569733311,GB +3569733312,3569733327,FR +3569733328,3569733343,GB +3569733344,3569733423,FR +3569733424,3569733439,GB +3569733440,3569733471,FR +3569733472,3569733487,GB +3569733488,3569733519,FR +3569733520,3569733535,GB +3569733536,3569733551,NL +3569733552,3569733567,FR +3569733568,3569733583,GB +3569733584,3569733599,FR +3569733600,3569733615,GB +3569733616,3569733647,FR +3569733648,3569733663,GB +3569733664,3569733679,FR +3569733680,3569733695,GB +3569733696,3569733775,FR +3569733776,3569733791,IE +3569733792,3569733807,FR +3569733808,3569733823,GB +3569733824,3569733887,FR +3569733888,3569733919,GB +3569733920,3569733935,FR +3569733936,3569733951,GB +3569733952,3569733967,FR +3569733968,3569733983,ES +3569733984,3569733999,GB +3569734000,3569734047,FR +3569734048,3569734079,GB +3569734080,3569734143,FR +3569734144,3569734159,GB +3569734160,3569734191,FR +3569734192,3569734207,GB +3569734208,3569734367,FR +3569734368,3569734399,GB +3569734400,3569734447,BE +3569734448,3569734463,FR +3569734464,3569734511,BE +3569734512,3569736047,FR +3569736048,3569736063,GB +3569736064,3569736071,FR +3569736072,3569736079,ES +3569736080,3569736191,FR +3569736192,3569736223,NL +3569736224,3569736239,FR +3569736240,3569736383,NL +3569736384,3569736399,SE +3569736400,3569736655,NL +3569736656,3569736671,FR +3569736672,3569736703,NL +3569736704,3569739263,FR +3569739264,3569739295,NL +3569739296,3569739327,FR +3569739328,3569739471,NL +3569739472,3569739487,FR +3569739488,3569739599,NL +3569739600,3569739631,FR +3569739632,3569739647,NL +3569739648,3569739663,FR +3569739664,3569739679,NL +3569739680,3569739695,FR +3569739696,3569739839,NL +3569739840,3569739855,FR +3569739856,3569739903,NL +3569739904,3569739919,FR +3569739920,3569739935,NL +3569739936,3569739951,FR +3569739952,3569740047,NL +3569740048,3569740063,FR +3569740064,3569740111,NL +3569740112,3569740127,FR +3569740128,3569740255,NL +3569740256,3569740271,FR +3569740272,3569740303,NL +3569740304,3569740319,FR +3569740320,3569740367,NL +3569740368,3569740383,FR +3569740384,3569740415,NL +3569740416,3569740431,FR +3569740432,3569740463,NL +3569740464,3569740479,FR +3569740480,3569740495,NL +3569740496,3569740511,FR +3569740512,3569740543,NL +3569740544,3569740559,FR +3569740560,3569740655,NL +3569740656,3569740671,FR +3569740672,3569740687,NL +3569740688,3569740703,FR +3569740704,3569740799,NL +3569740800,3569742335,FR +3569742336,3569742351,BE +3569742352,3569742383,FR +3569742384,3569742399,BE +3569742400,3569742415,FR +3569742416,3569742511,BE +3569742512,3569742527,FR +3569742528,3569742623,BE +3569742624,3569742639,FR +3569742640,3569742671,BE +3569742672,3569742687,FR +3569742688,3569742735,BE +3569742736,3569742751,FR +3569742752,3569742767,BE +3569742768,3569742783,FR +3569742784,3569742927,BE +3569742928,3569742943,FR +3569742944,3569743087,BE +3569743088,3569743103,FR +3569743104,3569743135,BE +3569743136,3569743199,FR +3569743200,3569743215,BE +3569743216,3569743359,FR +3569743360,3569743391,BE +3569743392,3569743407,FR +3569743408,3569743423,BE +3569743424,3569743455,FR +3569743456,3569743583,BE +3569743584,3569743599,NL +3569743600,3569743615,FR +3569743616,3569743631,BE +3569743632,3569743647,FR +3569743648,3569743679,BE +3569743680,3569743711,FR +3569743712,3569743775,BE +3569743776,3569743791,FR +3569743792,3569743871,BE +3569743872,3569743983,NL +3569743984,3569743999,FR +3569744000,3569744047,NL +3569744048,3569744063,FR +3569744064,3569744127,NL +3569744128,3569744143,FR +3569744144,3569744543,NL +3569744544,3569744559,FR +3569744560,3569744575,NL +3569744576,3569744623,FR +3569744624,3569744815,NL +3569744816,3569744831,FR +3569744832,3569744911,NL +3569744912,3569744927,FR +3569744928,3569744975,NL +3569744976,3569744991,FR +3569744992,3569745007,NL +3569745008,3569745023,FR +3569745024,3569745039,NL +3569745040,3569745055,FR +3569745056,3569745103,NL +3569745104,3569745119,FR +3569745120,3569745167,NL +3569745168,3569745183,FR +3569745184,3569745215,NL +3569745216,3569745231,FR +3569745232,3569745247,NL +3569745248,3569745279,FR +3569745280,3569745311,NL +3569745312,3569745327,FR +3569745328,3569745359,NL +3569745360,3569745375,FR +3569745376,3569745407,NL +3569745408,3569745663,FR +3569745664,3569745727,NL +3569745728,3569745743,FR +3569745744,3569745813,NL +3569745814,3569745823,FR +3569745824,3569745839,NL +3569745840,3569745871,FR +3569745872,3569745887,NL +3569745888,3569745903,FR +3569745904,3569745919,NL +3569745920,3569811175,FR +3569811176,3569811176,GP +3569811177,3569811455,FR +3569811456,3569876991,IL +3569876992,3569942527,RS +3569942528,3570073599,DE +3570073600,3570081791,NL +3570081792,3570106367,CH +3570106368,3570139135,PL +3570139136,3570171903,DE +3570171904,3570204671,NL +3570204672,3570270207,GR +3570270208,3570335743,NL +3570335744,3570401279,GB +3570401280,3570466815,FR +3570466816,3570532351,SE +3570532352,3570597887,IT +3570597888,3570607103,GB +3570607104,3570608127,DE +3570608128,3570611199,GB +3570611200,3570611455,FR +3570611456,3570614271,GB +3570614272,3570617343,DE +3570617344,3570617855,GB +3570617856,3570622463,DE +3570622464,3570630655,GB +3570630656,3570663423,DE +3570663424,3570728959,GB +3570728960,3570729983,FI +3570729984,3570731007,SE +3570731008,3570794495,FI +3570794496,3570817913,SE +3570817914,3570817914,AT +3570817915,3570860031,SE +3570860032,3570892799,CH +3570892800,3570925567,SA +3570925568,3570991103,IT +3570991104,3571023871,MA +3571023872,3571056639,SE +3571056640,3571122175,DE +3571122176,3571187711,GB +3571187712,3571253247,RU +3571253248,3571264609,BE +3571264610,3571264610,FR +3571264611,3571286015,BE +3571286016,3571318783,DE +3571318784,3571321055,GB +3571321056,3571321071,DE +3571321072,3571321823,GB +3571321824,3571321855,DE +3571321856,3571384319,GB +3571384320,3571482623,DE +3571482624,3571515391,BE +3571515392,3571548159,GB +3571548160,3571580927,ES +3571580928,3571646463,FI +3571646464,3571688383,DE +3571688384,3571689215,ES +3571689216,3571699711,DE +3571699712,3571700735,GB +3571700736,3571711999,DE +3571712000,3571843071,GB +3571843072,3571974143,ES +3571974144,3571978239,RU +3571978240,3571980287,SK +3571980288,3571982335,AT +3571982336,3572006911,RU +3572006912,3572039679,CH +3572039680,3572047871,BE +3572047872,3572056063,LU +3572056064,3572072447,RU +3572072448,3572105215,BG +3572105216,3572170751,FR +3572170752,3572203519,IL +3572203520,3572236287,SI +3572236288,3572301823,AT +3572301824,3572318207,IT +3572318208,3572326399,GB +3572326400,3572330495,DK +3572330496,3572334591,IQ +3572334592,3572338687,DK +3572338688,3572340735,SE +3572340736,3572342783,LU +3572342784,3572346879,DE +3572346880,3572348927,DK +3572348928,3572350975,RS +3572350976,3572355071,SE +3572355072,3572356095,CH +3572356096,3572357119,GB +3572357120,3572358143,NL +3572358144,3572359167,GB +3572359168,3572360191,US +3572360192,3572360831,ES +3572360832,3572360895,MX +3572360896,3572361215,ES +3572361216,3572362239,LT +3572362240,3572363263,ES +3572363264,3572364287,RS +3572364288,3572365311,DE +3572365312,3572366335,DK +3572366336,3572366591,IT +3572366592,3572366847,NL +3572366848,3572367103,DE +3572367104,3572367359,ES +3572367360,3572432895,NL +3572432896,3572465663,IT +3572465664,3572498431,BE +3572498432,3572563967,GB +3572563968,3572572159,KG +3572572160,3572580351,NL +3572580352,3572596735,AT +3572596736,3572629503,GB +3572629504,3572695039,DK +3572695040,3572760575,CH +3572760576,3572826111,PL +3572826112,3572891647,IT +3572891648,3572957183,FI +3572957184,3573022719,SE +3573022720,3573055487,RU +3573055488,3573088255,GB +3573088256,3573153791,CH +3573153792,3573219327,GB +3573219328,3573252095,GR +3573252096,3573284863,NO +3573284864,3573415935,TR +3573415936,3573481471,CH +3573481472,3573547007,DE +3573547008,3573612543,ES +3573612544,3573743615,GB +3573743616,3573809151,CH +3573809152,3573874687,ES +3573874688,3573878783,PL +3573878784,3573879807,RU +3573879808,3573880831,MD +3573880832,3573882879,RU +3573882880,3573884927,DK +3573884928,3573886975,PL +3573886976,3573889023,RU +3573889024,3573891071,HR +3573891072,3573893119,NL +3573893120,3573897215,RU +3573897216,3573899263,GB +3573899264,3573903359,RU +3573903360,3573905407,SI +3573905408,3573909503,RU +3573909504,3573913599,PL +3573913600,3573915647,CH +3573915648,3573917695,RU +3573917696,3573919743,SA +3573919744,3573921791,GB +3573921792,3573923839,RU +3573923840,3573925887,UA +3573925888,3573929983,PL +3573929984,3573934079,RU +3573936128,3573938175,RU +3573938176,3573940223,PL +3573940224,3574005759,PS +3574005760,3574071295,CY +3574071296,3574136831,IL +3574136832,3574169599,DE +3574169600,3574173695,GB +3574173696,3574173951,ES +3574173952,3574174839,GB +3574174840,3574174847,ES +3574174848,3574182904,GB +3574182905,3574182905,ES +3574182906,3574183423,GB +3574183424,3574183679,ES +3574183680,3574186799,GB +3574186800,3574186815,ES +3574186816,3574187007,GB +3574187008,3574188031,ES +3574188032,3574191615,GB +3574191616,3574192127,ES +3574192128,3574195199,GB +3574195200,3574196223,ES +3574196224,3574198271,GB +3574198272,3574199295,ES +3574199296,3574200831,GB +3574200832,3574202367,ES +3574202368,3574267903,NL +3574267904,3574333439,FR +3574333440,3574341631,GB +3574348288,3574348543,GB +3574398976,3574464511,PT +3574464512,3574530047,TR +3574530048,3574530207,SE +3574530208,3574530239,DE +3574530240,3574594559,SE +3574594560,3574595583,GB +3574595584,3574597631,MQ +3574597632,3574598655,GP +3574598656,3574599679,MQ +3574599680,3574603775,GP +3574603776,3574611967,BG +3574611968,3574628351,HU +3574628352,3574661119,GR +3574661120,3574693887,NL +3574693888,3574726655,PL +3574726656,3574792191,GB +3574792192,3574824959,CZ +3574824960,3574830079,GB +3574830080,3574831103,NL +3574831104,3574841599,GB +3574841600,3574841855,NL +3574841856,3574842367,GB +3574842368,3574843391,NL +3574843392,3574857727,GB +3574857728,3574923263,DE +3574923264,3574939647,RU +3574939648,3574941375,SE +3574941376,3574941439,NO +3574941440,3574949743,SE +3574949744,3574949759,NO +3574949760,3574956031,SE +3574956032,3574972415,IT +3574972416,3574988799,LV +3574988800,3575054335,PT +3575054336,3575119871,DE +3575119872,3575185407,RU +3575185408,3575250943,PL +3575250944,3575316479,IT +3575316480,3575349247,RU +3575349248,3575382015,ES +3575382016,3575447551,FI +3575447552,3575513087,CZ +3575513088,3575545855,PT +3575545856,3575562239,FR +3575562240,3575570223,DE +3575570224,3575570239,NL +3575570240,3575578623,DE +3575578624,3575589631,GB +3575589632,3575589887,CY +3575589888,3575644159,GB +3575644160,3575646303,FR +3575646304,3575646319,ES +3575646320,3575646679,FR +3575646680,3575646683,PL +3575646684,3575646815,FR +3575646816,3575646847,PL +3575646848,3575646911,FR +3575646912,3575646975,PL +3575646976,3575647231,GB +3575647232,3575647447,FR +3575647448,3575647451,PL +3575647452,3575648223,FR +3575648224,3575648255,PT +3575648256,3575652991,FR +3575652992,3575653119,GB +3575653120,3575653143,FR +3575653144,3575653151,ES +3575653152,3575653171,FR +3575653172,3575653175,NL +3575653176,3575653239,FR +3575653240,3575653247,ES +3575653248,3575653371,FR +3575653372,3575653375,PL +3575653376,3575653567,FR +3575653568,3575653631,PL +3575653632,3575653711,FR +3575653712,3575653727,ES +3575653728,3575653759,FR +3575653760,3575653887,ES +3575653888,3575654591,FR +3575654592,3575654655,CZ +3575654656,3575655039,FR +3575655040,3575655103,ES +3575655104,3575655615,FR +3575655616,3575655623,IE +3575655624,3575655855,FR +3575655856,3575655859,PL +3575655860,3575655863,FR +3575655864,3575655867,ES +3575655868,3575656287,FR +3575656288,3575656319,PT +3575656320,3575656575,FR +3575656576,3575656703,BE +3575656704,3575656911,FR +3575656912,3575656927,NL +3575656928,3575657087,FR +3575657088,3575657215,ES +3575657216,3575657983,FR +3575657984,3575658239,ES +3575658240,3575658303,FR +3575658304,3575658367,FI +3575658368,3575658559,FR +3575658560,3575658623,DE +3575658624,3575658639,NL +3575658640,3575658655,FR +3575658656,3575658671,ES +3575658672,3575659007,FR +3575659008,3575659071,ES +3575659072,3575660155,FR +3575660156,3575660159,GB +3575660160,3575660223,ES +3575660224,3575660335,FR +3575660336,3575660351,LT +3575660352,3575660415,PT +3575660416,3575664959,FR +3575664960,3575665023,BE +3575665024,3575665039,LT +3575665040,3575665087,FR +3575665088,3575665151,DE +3575665152,3575665983,FR +3575665984,3575666047,NL +3575666048,3575666191,FR +3575666192,3575666207,GB +3575666208,3575666431,FR +3575666432,3575666495,DE +3575666496,3575667791,FR +3575667792,3575667807,FI +3575667808,3575667903,FR +3575667904,3575667967,CZ +3575667968,3575668271,FR +3575668272,3575668279,ES +3575668280,3575668447,FR +3575668448,3575668479,PL +3575668480,3575669247,FR +3575669248,3575669263,DE +3575669264,3575669375,FR +3575669376,3575669503,IE +3575669504,3575670779,FR +3575670780,3575670783,DE +3575670784,3575670911,FR +3575670912,3575671039,ES +3575671040,3575671103,GB +3575671104,3575671615,FR +3575671616,3575671679,FI +3575671680,3575671807,BE +3575671808,3575671855,FR +3575671856,3575671871,GB +3575671872,3575671935,NL +3575671936,3575672063,IT +3575672064,3575672703,FR +3575672704,3575672831,DE +3575672832,3575672911,FR +3575672912,3575672927,LT +3575672928,3575672959,PL +3575672960,3575673087,FR +3575673088,3575673343,GB +3575673344,3575674831,FR +3575674832,3575674847,LT +3575674848,3575675215,FR +3575675216,3575675231,PL +3575675232,3575675295,FR +3575675296,3575675327,LT +3575675328,3575675391,NL +3575675392,3575675399,FR +3575675400,3575675407,ES +3575675408,3575675615,FR +3575675616,3575675647,PL +3575675648,3575676255,FR +3575676256,3575676271,GB +3575676272,3575693311,FR +3575693312,3575697407,DE +3575697408,3575701503,IT +3575701504,3575703551,GB +3575703552,3575705599,SE +3575705600,3575707647,DK +3575707648,3575708671,LU +3575708672,3575709695,IQ +3575709696,3575742463,AT +3575742464,3575775231,RU +3575775232,3575824383,NL +3575824384,3575832575,KW +3575832576,3575840767,NL +3575840768,3575873535,GB +3575873536,3575906303,EE +3575906304,3575971839,FR +3575971840,3576037375,ES +3576038208,3576038271,GB +3576038336,3576038463,GB +3576038528,3576038591,GB +3576038912,3576038975,GB +3576039168,3576039231,GB +3576039360,3576039383,GB +3576039392,3576039455,GB +3576039520,3576039551,GB +3576039584,3576039647,GB +3576039808,3576039839,GB +3576039904,3576039935,GB +3576040064,3576040127,GB +3576040216,3576040223,GB +3576040272,3576040287,GB +3576040352,3576040383,GB +3576040832,3576040959,GB +3576041472,3576041535,GB +3576041728,3576041791,GB +3576041832,3576041847,GB +3576041864,3576041871,GB +3576041880,3576041887,GB +3576041904,3576041919,GB +3576041936,3576041943,GB +3576041952,3576041975,GB +3576042112,3576042239,GB +3576042496,3576042623,GB +3576042688,3576042695,GB +3576042752,3576042815,GB +3576045584,3576045599,GB +3576045664,3576045679,GB +3576045712,3576045735,GB +3576045800,3576045807,GB +3576045816,3576045823,GB +3576048640,3576048767,GB +3576048960,3576049023,GB +3576049152,3576050047,GB +3576053760,3576054911,GB +3576055104,3576055111,GB +3576055120,3576055127,GB +3576055152,3576055167,GB +3576055184,3576055199,GB +3576055208,3576055215,GB +3576055280,3576055551,GB +3576055808,3576055871,GB +3576055936,3576055999,GB +3576056192,3576056255,GB +3576056320,3576056447,GB +3576056704,3576056767,GB +3576056856,3576056871,GB +3576056880,3576056887,GB +3576056920,3576056927,GB +3576056936,3576056943,GB +3576056952,3576056975,GB +3576056992,3576056999,GB +3576057040,3576057047,GB +3576057632,3576057647,GB +3576057712,3576057743,GB +3576057824,3576057839,GB +3576058880,3576059007,GB +3576059648,3576059679,GB +3576059712,3576059743,GB +3576059776,3576059807,GB +3576060288,3576060351,GB +3576061040,3576061055,GB +3576061120,3576061135,GB +3576061184,3576061247,GB +3576061312,3576061439,GB +3576061584,3576061591,GB +3576061620,3576061631,GB +3576061640,3576061647,GB +3576061688,3576061695,GB +3576062464,3576062479,GB +3576064320,3576064448,GB +3576064544,3576064559,GB +3576065856,3576065887,GB +3576066304,3576066431,GB +3576067072,3576067199,GB +3576068352,3576068479,GB +3576068864,3576068927,GB +3576069056,3576069119,GB +3576069248,3576069279,GB +3576069312,3576069343,GB +3576070696,3576070703,GB +3576070712,3576070719,GB +3576070728,3576070735,GB +3576070776,3576070783,GB +3576071296,3576071423,GB +3576071552,3576071679,GB +3576071936,3576071951,GB +3576072064,3576072079,GB +3576072288,3576072319,GB +3576072416,3576072447,GB +3576073216,3576073279,GB +3576074752,3576074879,GB +3576075264,3576075327,GB +3576075776,3576075903,GB +3576076272,3576076351,GB +3576076568,3576076575,GB +3576076784,3576076791,GB +3576077440,3576077471,GB +3576077568,3576077695,GB +3576077936,3576077967,GB +3576078144,3576078175,GB +3576078464,3576078591,GB +3576080000,3576080127,GB +3576080224,3576080255,GB +3576080776,3576080783,GB +3576080792,3576080799,GB +3576080808,3576080815,GB +3576080824,3576080831,GB +3576082080,3576082111,GB +3576082192,3576082223,GB +3576082688,3576082943,GB +3576084480,3576084543,GB +3576084608,3576084671,GB +3576084704,3576084735,GB +3576084864,3576084927,GB +3576085184,3576085215,GB +3576086016,3576086143,GB +3576086368,3576086399,GB +3576086496,3576086527,GB +3576086568,3576086571,GB +3576086576,3576086591,GB +3576086600,3576086603,GB +3576087808,3576087823,GB +3576087952,3576087967,GB +3576088032,3576088047,GB +3576088224,3576088231,GB +3576088376,3576088383,GB +3576088480,3576088511,GB +3576088960,3576088967,GB +3576089024,3576089039,GB +3576089440,3576089471,GB +3576089776,3576089791,GB +3576091408,3576091423,GB +3576091456,3576091479,GB +3576091968,3576091983,GB +3576092000,3576092031,GB +3576092128,3576092159,GB +3576092864,3576092895,GB +3576093064,3576093071,GB +3576093184,3576093247,GB +3576095232,3576096767,GB +3576099072,3576099327,GB +3576099840,3576100863,GB +3576101376,3576103491,GB +3576103492,3576103495,HU +3576103496,3576104911,GB +3576104912,3576104927,ES +3576104928,3576106879,GB +3576106880,3576106943,DE +3576106944,3576107863,GB +3576107864,3576107871,FR +3576107872,3576109991,GB +3576109992,3576110015,NL +3576110016,3576110939,GB +3576110940,3576110943,NL +3576110944,3576114255,GB +3576114256,3576114271,FR +3576114272,3576114463,GB +3576114464,3576114471,US +3576114472,3576116127,GB +3576116128,3576116135,DE +3576116136,3576120315,GB +3576120316,3576120319,SG +3576120320,3576125959,GB +3576125960,3576125963,BE +3576125964,3576126779,GB +3576126780,3576126783,ES +3576126784,3576134653,GB +3576134654,3576134654,CH +3576134655,3576135679,GB +3576135680,3576168447,DE +3576168448,3576233983,GB +3576233984,3576236543,FR +3576236544,3576238463,GB +3576238464,3576238464,FR +3576238465,3576240383,GB +3576240384,3576240511,BE +3576240512,3576240639,ES +3576240640,3576241991,GB +3576241992,3576241999,FR +3576242000,3576242383,GB +3576242384,3576242391,FR +3576242392,3576248583,GB +3576248584,3576248591,AT +3576248592,3576248625,GB +3576248626,3576248626,SK +3576248627,3576248727,GB +3576248728,3576248735,AT +3576248736,3576251711,GB +3576251712,3576251775,FR +3576251776,3576253807,GB +3576253808,3576253815,FR +3576253816,3576254511,GB +3576254512,3576254527,FR +3576254528,3576254695,GB +3576254696,3576254703,FR +3576254704,3576254775,GB +3576254776,3576254783,FR +3576254784,3576255303,GB +3576255304,3576255311,ES +3576255312,3576255359,GB +3576255360,3576255367,FR +3576255368,3576256511,GB +3576256512,3576258559,FR +3576258560,3576258927,GB +3576258928,3576258935,FR +3576258936,3576260607,GB +3576260608,3576260623,FR +3576260624,3576261631,GB +3576261632,3576262655,FR +3576262656,3576263919,GB +3576263920,3576263935,FR +3576263936,3576264255,GB +3576264256,3576264263,FR +3576264264,3576264351,GB +3576264352,3576264359,FR +3576264360,3576264375,GB +3576264376,3576264383,FR +3576264384,3576264679,GB +3576264680,3576264687,FR +3576264688,3576265359,GB +3576265360,3576265367,FR +3576265368,3576266751,GB +3576266752,3576299519,FR +3576299520,3576365055,AE +3576365056,3576430591,TR +3576430592,3576496127,FR +3576496128,3576561663,IT +3576561664,3576622100,NL +3576622101,3576622101,GB +3576622102,3576627199,NL +3576627200,3576692735,AT +3576692736,3576758271,GB +3576758272,3576823807,BE +3576823808,3576889343,SE +3576889344,3576954879,NL +3576954880,3576987647,NO +3576987648,3576999935,GB +3576999936,3577000191,AU +3577000192,3577020415,GB +3577020416,3577085951,NL +3577085952,3577151487,DE +3577151488,3577153535,RE +3577153536,3577157631,FR +3577157632,3577158911,RE +3577158912,3577160703,FR +3577160704,3577163775,RE +3577163776,3577164073,FR +3577164074,3577164074,RE +3577164075,3577165464,FR +3577165465,3577165465,RE +3577165466,3577165823,FR +3577165824,3577167871,RE +3577167872,3577184255,ET +3577184256,3577217023,CH +3577217024,3577238112,FR +3577238113,3577238113,RE +3577238114,3577282559,FR +3577282560,3577348095,IL +3577348096,3577413631,PT +3577413632,3577454591,RU +3577454592,3577458687,UA +3577458688,3577479167,RU +3577479168,3577544703,ES +3577544704,3577545983,DE +3577545984,3577546111,SE +3577546112,3577596527,DE +3577596528,3577596543,IT +3577596544,3577596623,DE +3577596624,3577596639,IT +3577596640,3577596743,DE +3577596744,3577596751,IT +3577596752,3577610239,DE +3577626176,3577626239,GB +3577628672,3577629695,CH +3577635840,3577636863,DE +3577636864,3577637887,GB +3577639744,3577639775,FR +3577641200,3577641215,FR +3577641472,3577641983,FR +3577650048,3577650063,NL +3577663488,3577664511,SE +3577669632,3577670655,BE +3577675776,3577741311,PT +3577741312,3578003455,SE +3578003456,3578265599,DE +3578265600,3578331135,GB +3578331136,3578339327,PL +3578339328,3578347519,ES +3578347520,3578363903,DE +3578363904,3578396671,NL +3578396672,3578462207,TR +3578462208,3578527743,NL +3578527744,3578576895,PL +3578576896,3578593279,ES +3578593280,3578626047,PL +3578626048,3578658815,ES +3578658816,3578724351,GB +3578724352,3578732543,RU +3578732544,3578740735,IE +3578740736,3578757119,RU +3578757120,3578808575,SE +3578808576,3578808831,FI +3578808832,3578822655,SE +3578822656,3578855423,RU +3578855424,3578888191,GB +3578888192,3578920959,SK +3578920960,3578986495,IT +3578986496,3579002879,DE +3579002880,3579019263,GB +3579019264,3579052031,DK +3579052032,3579117567,NL +3579117568,3579183103,RU +3579183104,3579193607,GB +3579193608,3579193615,NL +3579193616,3579193759,GB +3579193760,3579193775,NL +3579193776,3579197311,GB +3579197312,3579197439,US +3579197440,3579209727,GB +3579209728,3579210135,DE +3579210136,3579210143,GB +3579210144,3579210319,DE +3579210320,3579210327,GB +3579210328,3579210663,DE +3579210664,3579210671,GB +3579210672,3579210751,DE +3579210752,3579216033,GB +3579216034,3579216034,DE +3579216035,3579244831,GB +3579244832,3579244879,AT +3579244880,3579248639,GB +3579248640,3579346943,RU +3579346944,3579362055,SE +3579362056,3579362063,NO +3579362064,3579445247,SE +3579445248,3579478015,AT +3579478016,3579480847,FR +3579480848,3579480855,NL +3579480856,3579480863,FR +3579480864,3579480871,NL +3579480872,3579481095,FR +3579481096,3579481103,CH +3579481104,3579481119,FR +3579481120,3579481127,GB +3579481128,3579481143,FR +3579481144,3579481151,CH +3579481152,3579481159,FR +3579481160,3579481167,GB +3579481168,3579481191,FR +3579481192,3579481199,CH +3579481200,3579481247,FR +3579481248,3579481255,GB +3579481256,3579481263,CH +3579481264,3579481279,FR +3579481280,3579481287,GB +3579481288,3579482623,FR +3579482624,3579482783,NL +3579482784,3579482799,FR +3579482800,3579482927,NL +3579482928,3579482943,FR +3579482944,3579482991,NL +3579482992,3579483151,FR +3579483152,3579483263,NL +3579483264,3579483295,FR +3579483296,3579483311,NL +3579483312,3579483359,FR +3579483360,3579483375,NL +3579483376,3579484751,FR +3579484752,3579484767,BE +3579484768,3579485263,FR +3579485264,3579485279,BE +3579485280,3579485695,FR +3579485696,3579485711,GB +3579485712,3579485714,FR +3579485715,3579485727,GB +3579485728,3579485807,FR +3579485808,3579485823,GB +3579485824,3579485887,FR +3579485888,3579485888,GB +3579485889,3579485903,FR +3579485904,3579485919,DE +3579485920,3579485983,FR +3579485984,3579485999,CH +3579486000,3579486015,FR +3579486016,3579486031,GB +3579486032,3579486047,DE +3579486048,3579486095,GB +3579486096,3579486143,FR +3579486144,3579486175,GB +3579486176,3579486191,FR +3579486192,3579486207,GB +3579486208,3579486271,FR +3579486272,3579486287,GB +3579486288,3579486303,FR +3579486304,3579486319,GB +3579486320,3579486335,FR +3579486336,3579486351,GB +3579486352,3579486367,FR +3579486368,3579486383,IT +3579486384,3579486399,DE +3579486400,3579486415,FR +3579486416,3579486431,DE +3579486432,3579486447,GB +3579486448,3579486735,FR +3579486736,3579486751,DE +3579486752,3579486831,FR +3579486832,3579486847,BE +3579486848,3579486863,FR +3579486864,3579486879,GB +3579486880,3579487007,FR +3579487008,3579487039,GB +3579487040,3579487055,DE +3579487056,3579487103,FR +3579487104,3579487119,GB +3579487120,3579487215,FR +3579487216,3579487231,GB +3579487232,3579487247,FR +3579487248,3579487263,GB +3579487264,3579487471,FR +3579487472,3579487487,ES +3579487488,3579487519,FR +3579487520,3579487531,IT +3579487532,3579487535,FR +3579487536,3579487551,GB +3579487552,3579487567,FR +3579487568,3579487583,GB +3579487584,3579487599,FR +3579487600,3579487615,IT +3579487616,3579487663,FR +3579487664,3579487711,DE +3579487712,3579487727,SE +3579487728,3579487743,GB +3579487744,3579487807,FR +3579487808,3579487823,GB +3579487824,3579487855,FR +3579487856,3579487871,GB +3579487872,3579487887,IE +3579487888,3579487903,DE +3579487904,3579487951,FR +3579487952,3579487967,GB +3579487968,3579487983,IT +3579487984,3579487999,GB +3579488000,3579488047,FR +3579488048,3579488079,GB +3579488080,3579490559,FR +3579490560,3579490655,PT +3579490656,3579490671,FR +3579490672,3579490719,PT +3579490720,3579490735,NL +3579490736,3579490751,FR +3579490752,3579490799,PT +3579490800,3579490831,FR +3579490832,3579490943,PT +3579490944,3579490959,FR +3579490960,3579490975,PT +3579490976,3579491007,FR +3579491008,3579491023,PT +3579491024,3579491231,FR +3579491232,3579491247,PT +3579491248,3579491263,NL +3579491264,3579491471,FR +3579491472,3579491487,PT +3579491488,3579497983,FR +3579497984,3579497991,NL +3579497992,3579527167,FR +3579527168,3579543551,BA +3579543552,3579576319,BG +3579576320,3579609087,IT +3579609088,3579641855,PL +3579641856,3579707391,NL +3579707392,3579723775,ES +3579723776,3579740159,AT +3579740160,3579772927,IE +3579772928,3579838463,DE +3579838464,3580039167,ES +3580039168,3580039199,NL +3580039200,3580039231,AT +3580039232,3580039247,ES +3580039248,3580039423,IT +3580039424,3580039515,ES +3580039516,3580039551,NL +3580039552,3580100607,ES +3580100608,3580102143,SE +3580102144,3580104703,LV +3580104704,3580106751,SE +3580106752,3580108799,LV +3580108800,3580112895,SE +3580112896,3580116991,LV +3580116992,3580129279,SE +3580129280,3580131327,LV +3580131328,3580133375,SE +3580133376,3580134399,LV +3580134400,3580135423,SE +3580135424,3580136191,EE +3580136192,3580136447,SE +3580136448,3580141567,HR +3580141568,3580142591,LV +3580142592,3580143615,SE +3580143616,3580145663,LV +3580145664,3580149759,SE +3580149760,3580166143,EE +3580166144,3580198911,SE +3580198912,3580199935,LV +3580199936,3580200447,EE +3580200448,3580203007,LT +3580203008,3580203647,SE +3580203648,3580203775,AT +3580203776,3580204031,SE +3580204032,3580204544,LT +3580204545,3580204799,SE +3580204800,3580204800,LT +3580204801,3580206079,SE +3580206080,3580207103,HR +3580207104,3580208127,SE +3580208128,3580209151,EE +3580209152,3580213247,HR +3580213248,3580215295,LV +3580215296,3580217343,EE +3580217344,3580219391,SE +3580219392,3580221951,LV +3580221952,3580223487,SE +3580223488,3580231679,HR +3580231680,3580231935,SE +3580231936,3580232191,LV +3580232192,3580232447,SE +3580232448,3580233215,LT +3580233216,3580233727,SE +3580233728,3580236799,LT +3580236800,3580237823,SE +3580237824,3580239871,LV +3580239872,3580241919,EE +3580241920,3580243967,SE +3580243968,3580244991,EE +3580244992,3580246015,LT +3580246016,3580248063,LV +3580248064,3580254207,EE +3580254208,3580255231,SE +3580255232,3580259327,LV +3580259328,3580260351,SE +3580260352,3580265471,AT +3580265472,3580265727,SE +3580265728,3580268543,EE +3580268544,3580271359,SE +3580271360,3580271615,LV +3580271616,3580271871,SE +3580271872,3580272639,LV +3580272640,3580280831,SE +3580280832,3580297215,HR +3580297216,3580329983,LT +3580329984,3580338175,EE +3580338176,3580338687,SE +3580338688,3580339199,HR +3580339200,3580340223,EE +3580340224,3580344319,LT +3580344320,3580346367,SE +3580346368,3580362751,LT +3580362752,3580624895,GB +3580624896,3580626943,RU +3580626944,3580628991,PL +3580628992,3580631039,RU +3580631040,3580631551,SE +3580631552,3580632063,NO +3580632064,3580632319,PL +3580632320,3580632831,NL +3580632832,3580633087,LI +3580633088,3580635135,RU +3580635136,3580637183,UA +3580639232,3580641279,PL +3580641280,3580643327,FR +3580643328,3580645375,UA +3580645376,3580647423,PL +3580647424,3580648027,GR +3580648028,3580648028,DE +3580648029,3580649471,GR +3580649472,3580651519,SE +3580651520,3580653567,NL +3580653568,3580655615,PL +3580655616,3580657663,SK +3580657664,3580663807,RU +3580663808,3580665855,PL +3580665856,3580667903,CZ +3580667904,3580669951,RU +3580669952,3580671999,UA +3580672000,3580682239,RU +3580682240,3580684287,PL +3580684288,3580686335,FR +3580688384,3580698623,RU +3580698624,3580702719,PL +3580702720,3580706815,RU +3580706816,3580708863,KG +3580708864,3580710911,RU +3580710912,3580715007,UA +3580715008,3580719103,RU +3580719104,3580723199,NL +3580723200,3580727295,UA +3580727296,3580731391,RU +3580739584,3580743679,RU +3580743680,3580747775,KZ +3580747776,3580751871,UA +3580751872,3580755967,IR +3580755968,3580772351,RU +3580772352,3580780543,LV +3580780544,3580805119,UA +3580805120,3580821503,RU +3580821504,3580837887,FR +3580837888,3580887039,UA +3580887040,3581149183,SE +3581157376,3581158399,AT +3581159424,3581161471,IE +3581173760,3581196287,NL +3581198336,3581199359,NL +3581204480,3581214719,SE +3581214720,3581231103,NL +3581239296,3581241343,NL +3581255680,3581258751,FR +3581280256,3581411327,BE +3581411328,3581673471,GB +3581673472,3581935615,NL +3581935616,3581943807,RU +3581943808,3581951999,FR +3581952000,3581960191,TR +3581960192,3581976575,DE +3581976576,3581984767,NO +3581984768,3581992959,RU +3581992960,3582001151,GB +3582001152,3582009343,DK +3582009344,3582017535,RU +3582017536,3582025727,GB +3582025728,3582030591,RU +3582030592,3582030847,CY +3582030848,3582033919,RU +3582033920,3582042111,CZ +3582042112,3582050303,ES +3582050304,3582058495,NL +3582058496,3582066687,AT +3582066688,3582074879,UA +3582074880,3582077439,GB +3582077440,3582077471,DE +3582077472,3582083071,GB +3582083072,3582084095,BG +3582084096,3582084351,NZ +3582084352,3582084607,CA +3582084608,3582085631,BG +3582085632,3582085887,FI +3582085888,3582087167,BG +3582087168,3582087423,DK +3582087424,3582087679,ES +3582087680,3582087935,CH +3582087936,3582088191,SE +3582088192,3582088447,NL +3582088448,3582088703,IT +3582088704,3582088959,NO +3582088960,3582089215,PT +3582089216,3582091263,BG +3582091264,3582099455,QA +3582099456,3582107647,GB +3582107648,3582115839,NL +3582115840,3582115903,EE +3582115904,3582115935,SE +3582115936,3582115967,EE +3582115968,3582116095,SE +3582116096,3582116351,EE +3582116352,3582116863,SE +3582116864,3582117887,EE +3582117888,3582120959,LT +3582120960,3582121983,EE +3582121984,3582124031,LT +3582124032,3582132223,FI +3582132224,3582140415,RU +3582140416,3582148607,GE +3582148608,3582156799,EG +3582156800,3582164991,GB +3582164992,3582173183,SE +3582173184,3582181375,GB +3582181376,3582197759,DE +3582197760,3582205951,DK +3582205952,3582214143,AE +3582214144,3582222335,RU +3582222336,3582225719,SE +3582225720,3582225727,FI +3582225728,3582227391,SE +3582227392,3582227455,FI +3582227456,3582230527,SE +3582230528,3582238719,BE +3582238720,3582251319,NL +3582251320,3582251327,FI +3582251328,3582255103,NL +3582255104,3582263295,KW +3582263296,3582271487,ME +3582271488,3582279679,NL +3582279680,3582283775,GB +3582283776,3582287871,CY +3582287872,3582296063,DE +3582296064,3582304255,GB +3582304256,3582312447,UA +3582312448,3582313855,JE +3582313856,3582313871,GB +3582313872,3582320639,JE +3582320640,3582328831,CH +3582328832,3582337023,HU +3582337024,3582345215,ES +3582345216,3582353407,IT +3582353408,3582361599,SE +3582361600,3582377983,PL +3582377984,3582386175,RU +3582386176,3582394367,NL +3582394368,3582402559,DE +3582402560,3582410751,PL +3582410752,3582435327,RU +3582435328,3582443519,MK +3582443520,3582451711,DE +3582451712,3582459903,LU +3582459904,3582468095,NL +3582468096,3582476239,SE +3582476240,3582476247,DK +3582476248,3582476287,SE +3582476288,3582484479,DE +3582484480,3582492671,CI +3582492672,3582509055,IT +3582509056,3582517247,SA +3582517248,3582525439,PL +3582525440,3582533631,IM +3582533632,3582541823,IT +3582541824,3582550015,US +3582550016,3582558207,RS +3582569024,3582569031,AT +3582570912,3582570943,FR +3582572416,3582572423,CH +3582574592,3582582783,DE +3582582784,3582590975,RU +3582590976,3582599167,FR +3582599168,3582607359,DE +3582607360,3582615551,RU +3582615552,3582623743,GB +3582623744,3582631935,FI +3582631936,3582640127,NO +3582640128,3582648319,RU +3582648320,3582656511,PT +3582656512,3582664703,ES +3582664704,3582669823,JO +3582669824,3582669951,PR +3582669952,3582669967,JO +3582669968,3582670011,PR +3582670012,3582670012,JO +3582670013,3582670079,PR +3582670080,3582672895,JO +3582672896,3582681087,DE +3582681088,3582689279,FR +3582689280,3582697471,DE +3582697472,3582705663,FI +3582722048,3582730239,IT +3582730240,3582736383,ES +3582736384,3582737407,DZ +3582737408,3582738431,ES +3582738432,3582746623,DK +3582746624,3582754815,RU +3582754816,3582763007,GR +3582763008,3582771199,FI +3582771200,3582779391,CY +3582779392,3582787583,RU +3582787584,3582795775,PT +3582795776,3582803967,ES +3582803968,3582812159,SE +3582812160,3582820351,FI +3582820352,3582828543,RU +3582828544,3582836735,KZ +3582836736,3582853119,RU +3582853120,3582861311,SE +3582861312,3582869503,RU +3582869504,3582877695,NO +3582877696,3582885887,AT +3582885888,3582892031,TR +3582892032,3582892543,US +3582892544,3582894079,TR +3582894080,3582902271,CH +3582902272,3582910463,RU +3582910464,3582916607,SI +3582916608,3582917631,ZA +3582917632,3582918655,LU +3582918656,3582926847,GB +3582926848,3582935039,ES +3582935040,3582943231,SI +3582943232,3582951423,AT +3582951424,3582959615,GB +3582959616,3582967807,FI +3582967808,3582975999,DE +3582976000,3582984191,TR +3582984192,3582992383,DE +3582992384,3583000575,ES +3583000576,3583008767,IT +3583008768,3583016959,TR +3583016960,3583025151,CH +3583025152,3583031807,IT +3583031808,3583032063,GR +3583032064,3583033343,IT +3583033344,3583041535,FR +3583041536,3583049727,NL +3583049728,3583066111,RU +3583066112,3583074303,DE +3583074304,3583082495,BG +3583082496,3583090687,KG +3583090688,3583098879,NO +3583098880,3583107071,FI +3583107072,3583115263,AT +3583115264,3583123455,CH +3583123456,3583131647,PL +3583131648,3583131709,DE +3583131710,3583131710,DK +3583131711,3583148031,DE +3583148032,3583164415,GB +3583164416,3583172607,PT +3583172608,3583188991,DE +3583188992,3583197183,RU +3583197184,3583205375,KE +3583205376,3583213567,HR +3583213568,3583221759,IR +3583221760,3583229951,AT +3583229952,3583238143,RU +3583238144,3583246335,GB +3583246336,3583254527,RU +3583254528,3583262719,GB +3583262720,3583270911,TR +3583270912,3583287295,DE +3583287296,3583295487,RU +3583295488,3583303679,ES +3583303680,3583311871,NL +3583311872,3583320063,RU +3583320064,3583328255,HR +3583328256,3583336447,DE +3583336448,3583337727,ME +3583337728,3583337983,AL +3583337984,3583338143,ME +3583338144,3583338175,RS +3583338176,3583344639,ME +3583344640,3583352831,BG +3583352832,3583361023,CY +3583361024,3583369215,IT +3583369216,3583377407,ES +3583377408,3583385599,AT +3583385600,3583393791,DK +3583393792,3583401983,RU +3583401984,3583410175,KE +3583410176,3583418367,SE +3583418368,3583426559,TN +3583426560,3583428607,CV +3583428608,3583434751,ZA +3583434752,3583442943,AT +3583442944,3583451135,RU +3583451136,3583459327,IL +3583459328,3583467519,CZ +3583467520,3583475711,ES +3583475712,3583483903,NO +3583483904,3583492095,FR +3583492096,3583508479,SK +3583508480,3583516671,FR +3583516672,3583524863,GB +3583524864,3583533055,EG +3583533056,3583541247,DE +3583541248,3583549439,RU +3583549440,3583557631,NL +3583557632,3583565823,IT +3583565824,3583566847,GB +3583566848,3583567103,NL +3583567104,3583574015,GB +3583574016,3583582207,NO +3583582208,3583590399,AT +3583590400,3583598591,DE +3583598592,3583602943,SE +3583602944,3583603072,UA +3583603073,3583603073,SE +3583603074,3583603199,UA +3583603200,3583606783,SE +3583606784,3583639551,TR +3583639552,3583647743,AZ +3583647744,3583655935,EG +3583655936,3583664127,SN +3583664128,3583680511,RO +3583680512,3583688703,RU +3583688704,3583696895,UA +3583696896,3583705087,NL +3583705088,3583713279,UA +3583713280,3583721471,CZ +3583721472,3583729663,DE +3583729664,3583737855,TR +3583742824,3583742831,DE +3583742976,3583743487,PL +3583743616,3583743743,GB +3583744112,3583744127,SE +3583744128,3583744255,PL +3583744320,3583744383,GB +3583744512,3583744767,GB +3583744960,3583744991,GB +3583745216,3583745279,SE +3583745536,3583745663,CZ +3583746048,3583754239,PL +3583754240,3583762431,RU +3583762432,3583770623,CZ +3583770624,3583778815,NL +3583778816,3583787007,IT +3583787008,3583795199,UA +3583795200,3583803391,PL +3583803392,3583811583,RU +3583811584,3583819775,DE +3583819776,3583827967,RU +3583827968,3583836159,CH +3583836160,3583844351,DE +3583844352,3583852543,KZ +3583852544,3583860735,FI +3583860736,3583868927,HU +3583868928,3583877119,AT +3583877120,3583885311,RO +3583885312,3583893503,GE +3583893504,3583901695,SI +3583901696,3583909887,RU +3583909888,3583918079,SE +3583918080,3583926271,IT +3583926272,3583934463,DE +3583934464,3583942655,CH +3583942656,3583950847,EG +3583950848,3583959039,PL +3583959040,3583967231,NO +3583967232,3583969279,TR +3583969280,3583969791,FR +3583969792,3583970047,US +3583970048,3583970303,CA +3583970304,3583971327,US +3583971328,3583973887,NL +3583973888,3583974399,IT +3583974400,3583975423,TR +3583975424,3583983231,LT +3583983232,3583983359,BR +3583983360,3583983615,LT +3583983616,3583999999,RU +3584000000,3584001023,IE +3584001024,3584004095,US +3584004096,3584008191,CH +3584008192,3584016383,SE +3584016384,3584024575,RU +3584024576,3584032767,UA +3584032768,3584040959,DE +3584040960,3584049151,CH +3584049152,3584057343,DE +3584057344,3584065535,GB +3584065536,3584073727,UA +3584073728,3584081919,SK +3584081920,3584082007,NL +3584082008,3584082015,AT +3584082016,3584090111,NL +3584090112,3584096255,NO +3584096256,3584098303,NL +3584098304,3584106495,SI +3584106496,3584114687,FI +3584114688,3584122879,GB +3584122880,3584131071,PL +3584131072,3584139263,TR +3584139264,3584147455,NO +3584147456,3584155647,FR +3584155648,3584163839,NO +3584163840,3584172031,CH +3584172032,3584180223,FR +3584180224,3584188415,AT +3584188416,3584196607,GB +3584196608,3584204799,DE +3584204800,3584212991,NL +3584212992,3584221183,ES +3584221184,3584229375,NO +3584229376,3584245759,HU +3584245760,3584253951,NL +3584253952,3584262143,AL +3584262144,3584270335,SE +3584270336,3584278527,FR +3584278528,3584286719,GB +3584286720,3584303103,AT +3584303104,3584311295,ES +3584311296,3584319487,DE +3584319488,3584327679,LT +3584327680,3584335871,DE +3584335872,3584344063,ES +3584344064,3584352255,SE +3584352256,3584360447,RO +3584360448,3584368639,GB +3584368640,3584376831,SA +3584376832,3584393215,DE +3584393216,3584401407,GB +3584401408,3584409599,MT +3584409600,3584417791,RU +3584417792,3584434175,GB +3584434176,3584442367,LU +3584442368,3584450559,GB +3584458752,3584466943,SA +3584466944,3584475135,NO +3584475136,3584483327,FR +3584483328,3584491519,DE +3584491520,3584499711,BG +3584499712,3584507903,RU +3584507904,3584509231,GB +3584509232,3584509239,AW +3584509240,3584509855,GB +3584509856,3584509871,AW +3584509872,3584512942,GB +3584512943,3584512943,JE +3584512944,3584516095,GB +3584516096,3584524287,NO +3584524288,3584532479,IS +3584532480,3584540671,DE +3584540672,3584548863,RU +3584549888,3584550911,FR +3584550912,3584552959,IT +3584552960,3584557055,FR +3584557056,3584565247,EE +3584565248,3584573439,RU +3584573440,3584589823,DE +3584589824,3584598015,RU +3584598016,3584606207,CZ +3584606208,3584614399,DE +3584614400,3584620543,IE +3584620544,3584621567,GB +3584621568,3584622591,IE +3584622592,3584630783,FI +3584630784,3584638975,BG +3584638976,3584647167,UA +3584647168,3584655359,LU +3584655360,3584661247,CY +3584661248,3584661503,MT +3584661504,3584663551,CY +3584663552,3584671743,FR +3584671744,3584688127,NL +3584688128,3584696319,GB +3584696320,3584701751,ES +3584701752,3584701823,NL +3584701824,3584701991,ES +3584701992,3584702007,CH +3584702008,3584703095,ES +3584703096,3584703103,BE +3584703104,3584704511,ES +3584704512,3584720895,RU +3584720896,3584729087,GB +3584729088,3584737279,DE +3584745472,3584753663,DK +3584753664,3584770047,RU +3584770048,3584778239,NL +3584778240,3584786431,IT +3584786432,3584794623,NL +3584794624,3584802815,IT +3584802816,3584811007,GB +3584811008,3584819199,ES +3584819200,3584827391,RU +3584827392,3584835583,ES +3584835584,3584843775,AZ +3584843776,3584851967,DE +3584851968,3584860159,ZA +3584860160,3584868351,PL +3584868352,3584876543,NO +3584876544,3584884735,SI +3584884736,3584892927,DE +3584901120,3584909311,AT +3584909312,3584917503,IT +3584917504,3584925695,FI +3584925696,3584933887,CH +3584933888,3584942079,SE +3584942080,3584950271,DK +3584950272,3584958463,UA +3584958464,3584966655,DE +3584966656,3584974847,DK +3584974848,3584983039,FR +3584983040,3584991231,US +3584991232,3584999423,IT +3584999424,3585007615,GB +3585007616,3585015807,AT +3585015808,3585023999,IT +3585024000,3585032191,CZ +3585032192,3585048575,LV +3585048576,3585056767,GB +3585056768,3585064959,LB +3585064960,3585081343,GB +3585081344,3585114111,IR +3585114112,3585122303,IS +3585122304,3585130495,ES +3585130496,3585138687,FR +3585138688,3585146879,RU +3585146880,3585155071,RO +3585155072,3585163263,GB +3585163264,3585171455,BE +3585171456,3585179647,RU +3585179648,3585196031,BE +3585196032,3585204223,ES +3585204224,3585212415,GB +3585212416,3585220607,DE +3585220608,3585228799,RU +3585228800,3585236991,DE +3585236992,3585245183,HU +3585245184,3585253375,GB +3585253376,3585261567,DE +3585261568,3585269759,IT +3585269760,3585277951,SY +3585277952,3585286143,SE +3585286144,3585288959,NO +3585288960,3585291007,GB +3585291008,3585292543,NO +3585292544,3585292863,GB +3585292864,3585292895,NO +3585292896,3585293263,GB +3585293264,3585293271,ZA +3585293272,3585294335,GB +3585294336,3585302527,DE +3585302528,3585310719,ES +3585310720,3585318911,DE +3585318912,3585327103,DZ +3585327104,3585335295,NL +3585335296,3585343487,UA +3585343488,3585351679,EE +3585351680,3585359871,CZ +3585359872,3585368063,SE +3585368064,3585376255,LV +3585376256,3585384447,PL +3585384448,3585392639,CH +3585392640,3585400831,RU +3585400832,3585409023,FR +3585409024,3585417215,RU +3585417216,3585425407,BE +3585425408,3585433599,ES +3585433600,3585441791,IS +3585441792,3585449983,SK +3585449984,3585458175,SA +3585458176,3585466367,HU +3585466368,3585474559,EG +3585474560,3585482751,DE +3585482752,3585490943,FR +3585490944,3585499135,IT +3585499136,3585515519,DE +3585515520,3585523711,RU +3585523712,3585531903,LV +3585531904,3585540095,AT +3585540096,3585548287,DE +3585548288,3585548543,NL +3585548544,3585548799,RU +3585548800,3585550399,DE +3585550400,3585550591,NL +3585550592,3585550847,RU +3585550848,3585551103,DE +3585551104,3585551359,NL +3585551360,3585551615,DE +3585551616,3585552127,NL +3585552128,3585552383,DE +3585552384,3585552639,RU +3585552640,3585552895,DE +3585552896,3585553151,RU +3585553152,3585553407,NL +3585553408,3585553663,BG +3585553664,3585555007,RU +3585555008,3585555967,NL +3585555968,3585556479,BG +3585556480,3585564671,DE +3585564672,3585572863,RU +3585572864,3585581055,IT +3585581056,3585597439,DE +3585597440,3585605631,RU +3585605632,3585613823,PL +3585613824,3585622015,EE +3585630208,3585632255,IL +3585632256,3585632511,GB +3585632512,3585632639,NL +3585632640,3585632767,IL +3585632768,3585633535,GB +3585633536,3585634047,IT +3585634048,3585634303,CZ +3585634304,3585634559,IT +3585634560,3585634687,IL +3585634688,3585634815,NL +3585634816,3585635071,IT +3585635072,3585635199,NL +3585635200,3585635327,IL +3585635328,3585635583,AE +3585635584,3585635711,NL +3585635712,3585635839,IL +3585635840,3585635903,CZ +3585635904,3585635967,NO +3585635968,3585636031,HU +3585636032,3585636095,SK +3585636096,3585637375,IL +3585637376,3585637503,NL +3585637504,3585637631,IL +3585637632,3585637887,HR +3585637888,3585638399,IL +3585638400,3585646591,RU +3585646592,3585654783,SA +3585654784,3585662975,NO +3585662976,3585671167,BY +3585671168,3585679359,SE +3585679360,3585687551,FI +3585687552,3585695743,DE +3585695744,3585703935,GB +3585703936,3585712127,DE +3585712128,3585720319,AT +3585720320,3585728511,GB +3585728512,3585736703,SE +3585736704,3585744895,HR +3585744896,3585747839,FR +3585747840,3585747903,GB +3585747904,3585749295,FR +3585749296,3585749311,ES +3585749312,3585750015,FR +3585750016,3585750031,GB +3585750032,3585750271,FR +3585750272,3585750287,ES +3585750288,3585750335,FR +3585750336,3585750351,GB +3585750352,3585750367,FR +3585750368,3585750383,ES +3585750384,3585750399,PT +3585750400,3585753087,FR +3585753088,3585761279,PL +3585761280,3585765375,UA +3585765376,3585765631,RU +3585765632,3585767679,UA +3585767680,3585768191,RU +3585768192,3585769215,UA +3585769216,3585769471,RU +3585769472,3585777663,TR +3585777664,3585785855,JO +3585785856,3585794047,UA +3585794048,3585802239,FI +3585802240,3585810431,IT +3585810432,3585818623,GB +3585818624,3585826815,DE +3585826816,3585835007,RU +3585835008,3585843199,NL +3585843200,3585851391,NO +3585851392,3585859583,SE +3585859584,3585860607,AF +3585860608,3585861631,RU +3585861632,3585863679,EE +3585863680,3585865471,NL +3585865472,3585865727,LB +3585865728,3585865983,UA +3585865984,3585867775,EE +3585867776,3585875967,NO +3585875968,3585884159,CH +3585884160,3585892351,IQ +3585892352,3585900543,DE +3585900544,3585906687,NO +3585906688,3585907711,CZ +3585907712,3585908735,NO +3585908736,3585916927,GP +3585916928,3585925119,IT +3585925120,3585933311,CH +3585933312,3585941503,NL +3585941504,3585949695,PL +3585949696,3585957887,KW +3585957888,3585966079,SE +3585966080,3585974271,CH +3585974272,3585982463,BE +3585982464,3585998847,RU +3586007040,3586015231,LT +3586015232,3586022687,FR +3586022688,3586022688,GB +3586022689,3586022689,TN +3586022690,3586022690,SE +3586022691,3586022691,BE +3586022692,3586022692,DK +3586022693,3586022693,DE +3586022694,3586022694,IT +3586022695,3586023423,FR +3586023424,3586031615,IS +3586031616,3586039807,IE +3586039808,3586047999,GB +3586048000,3586056191,PT +3586056192,3586072575,RU +3586072576,3586088959,DE +3586088960,3586097151,CZ +3586097152,3586105343,HR +3586105344,3586121727,BG +3586121728,3586129919,IE +3586129920,3586146303,CZ +3586146304,3586162687,PL +3586162688,3586179071,FI +3586179072,3586195455,ES +3586195456,3586203647,RU +3586203648,3586205695,ZA +3586205696,3586207743,BW +3586207744,3586211071,ZA +3586211072,3586211327,BW +3586211328,3586211839,ZA +3586211840,3586228223,CH +3586228224,3586244607,BE +3586244608,3586246655,NL +3586246656,3586248703,BE +3586248704,3586252799,NL +3586252800,3586254847,BE +3586254848,3586258943,NL +3586258944,3586259455,BE +3586259456,3586260991,NL +3586260992,3586271807,GB +3586271808,3586271823,IT +3586271824,3586272799,GB +3586272800,3586272807,IT +3586272808,3586273015,GB +3586273016,3586273023,IT +3586273024,3586277375,GB +3586277376,3586293759,TR +3586293760,3586310143,ES +3586310144,3586326527,CZ +3586326528,3586342911,IR +3586342912,3586359295,ES +3586359296,3586375679,PL +3586375680,3586392063,CZ +3586392064,3586405375,NL +3586405376,3586406399,RU +3586406400,3586408447,NL +3586408448,3586424831,BA +3586424832,3586441215,CH +3586441216,3586457599,DE +3586457600,3586473983,NL +3586473984,3586490367,HU +3586490368,3586506751,LT +3586506752,3586523135,NL +3586523136,3586544267,DE +3586544268,3586544271,DK +3586544272,3586544383,DE +3586544384,3586544511,DK +3586544512,3586546687,DE +3586546688,3586546943,NL +3586546944,3586555903,DE +3586555904,3586572287,IT +3586572288,3586585215,RS +3586585216,3586585223,XK +3586585224,3586586255,RS +3586586256,3586586263,XK +3586586264,3586588671,RS +3586588672,3586596863,IT +3586596864,3586605055,GB +3586605056,3586621439,SE +3586621440,3586625535,NL +3586625536,3586625711,IE +3586625712,3586625719,GB +3586625720,3586628118,IE +3586628119,3586628119,GB +3586628120,3586628127,IE +3586628128,3586628159,AT +3586628160,3586628191,IE +3586628192,3586628223,NL +3586628224,3586628255,AT +3586628256,3586628319,IE +3586628320,3586628351,AT +3586628352,3586628607,IE +3586628608,3586629631,GB +3586629632,3586631935,IE +3586631936,3586632191,CN +3586632192,3586634047,IE +3586634048,3586634079,NL +3586634080,3586634239,IE +3586634240,3586634527,NL +3586634528,3586634543,IE +3586634544,3586634623,NL +3586634624,3586634783,IE +3586634784,3586634815,NL +3586634816,3586634847,IE +3586634848,3586634911,NL +3586634912,3586634943,FI +3586634944,3586635007,NL +3586635008,3586635519,IE +3586635520,3586635775,NL +3586635776,3586637823,IE +3586637824,3586654207,PL +3586654208,3586662399,GE +3586662400,3586670591,UA +3586670592,3586675967,DE +3586675968,3586676223,RO +3586676224,3586676991,DE +3586676992,3586677434,RO +3586677435,3586677435,DE +3586677436,3586677631,RO +3586677632,3586677639,DE +3586677640,3586677643,GB +3586677644,3586677647,SG +3586677648,3586677655,US +3586677656,3586679599,RO +3586679600,3586679615,IT +3586679616,3586680511,RO +3586680512,3586680519,GB +3586680520,3586680831,RO +3586680832,3586680959,FR +3586680960,3586681471,RO +3586681472,3586681487,GB +3586681488,3586681527,RO +3586681528,3586681535,GB +3586681536,3586681615,RO +3586681616,3586681631,CZ +3586681632,3586681855,RO +3586681856,3586682111,FR +3586682112,3586682225,RO +3586682226,3586682226,IE +3586682227,3586682239,RO +3586682240,3586682367,US +3586682368,3586682415,RO +3586682416,3586682423,DE +3586682424,3586682495,RO +3586682496,3586682879,FR +3586682880,3586686975,US +3586686976,3586703359,SE +3586703360,3586719743,CH +3586719744,3586752511,ES +3586752512,3586785279,NL +3586785280,3586793471,OM +3586793472,3586801663,CH +3586801664,3586818047,HR +3586818048,3586834431,IE +3586834432,3586850815,DE +3586850816,3586867199,NO +3586867200,3586883583,FR +3586883584,3586899967,IT +3586899968,3586910207,DE +3586910208,3586910719,NL +3586910720,3586911231,BE +3586911232,3586916351,DE +3586916352,3586924543,IT +3586924544,3586925695,FI +3586925696,3586925759,AX +3586925760,3586928639,FI +3586928640,3586929663,AX +3586929664,3586932735,FI +3586932736,3586949119,LB +3586949120,3586965503,SE +3586965504,3586981887,NL +3586981888,3586998271,IT +3586998272,3587006463,PT +3587006464,3587014655,FR +3587014656,3587055615,GB +3587055616,3587063807,UZ +3587063808,3587080191,NL +3587080192,3587082447,GB +3587082448,3587082448,MZ +3587082449,3587082449,NG +3587082450,3587082450,NO +3587082451,3587082451,PT +3587082452,3587082452,QA +3587082453,3587082453,RO +3587082454,3587082454,RS +3587082455,3587082455,SA +3587082456,3587082456,SI +3587082457,3587082457,SK +3587082458,3587082458,TN +3587082459,3587082459,TR +3587082460,3587082460,TZ +3587082461,3587082461,UA +3587082462,3587082462,UG +3587082463,3587082463,ZA +3587082464,3587082475,GB +3587082476,3587082476,LB +3587082477,3587082477,MA +3587082478,3587082478,ME +3587082479,3587082479,MK +3587082480,3587088383,GB +3587088384,3587096575,DE +3587096576,3587121151,NL +3587121152,3587129343,AL +3587129344,3587145727,NL +3587145728,3587162111,CY +3587162112,3587178495,IR +3587178496,3587186687,AT +3587186688,3587186943,DE +3587186944,3587187199,GB +3587187200,3587187455,DE +3587187456,3587187711,GB +3587187712,3587188223,DE +3587188224,3587188479,AM +3587188480,3587193087,DE +3587193088,3587193599,GB +3587193600,3587194879,DE +3587194880,3587211263,GB +3587211264,3587219455,AT +3587219456,3587227647,RU +3587227648,3587227648,NL +3587227649,3587231231,GB +3587231232,3587231263,NL +3587231264,3587233087,GB +3587233088,3587233095,NL +3587233096,3587234191,GB +3587234192,3587234207,NL +3587234208,3587235839,GB +3587235840,3587237887,NL +3587237888,3587239487,GB +3587239488,3587239495,NL +3587239496,3587239551,GB +3587239552,3587239552,NL +3587239553,3587239583,GB +3587239584,3587239599,NL +3587239600,3587239711,GB +3587239712,3587239727,NL +3587239728,3587239791,GB +3587239792,3587239799,NL +3587239800,3587242671,GB +3587242672,3587242679,NL +3587242680,3587244031,GB +3587244032,3587260415,IT +3587260416,3587278591,DE +3587278592,3587279359,PT +3587279360,3587279615,DE +3587279616,3587280383,PT +3587280384,3587281151,DE +3587281152,3587284991,PT +3587284992,3587286527,FR +3587286784,3587289599,FR +3587290112,3587293183,FR +3587293184,3587309567,IT +3587309568,3587325951,GB +3587325952,3587342335,RU +3587342336,3587358719,CZ +3587358720,3587375103,SA +3587375104,3587383295,TR +3587383296,3587391487,CZ +3587391488,3587407871,KZ +3587407872,3587408127,BE +3587408128,3587408383,NL +3587408384,3587414015,BE +3587414016,3587414264,NL +3587414265,3587414265,BE +3587414266,3587415807,NL +3587415808,3587422463,BE +3587422464,3587423743,NL +3587423744,3587424255,BE +3587424256,3587440639,DE +3587440640,3587445759,SE +3587445760,3587445823,FI +3587445824,3587445983,SE +3587445984,3587445999,FI +3587446000,3587446143,SE +3587446144,3587446271,FI +3587446272,3587449087,SE +3587449088,3587449151,DK +3587449152,3587457023,SE +3587457024,3587473407,GB +3587473408,3587489791,IT +3587489792,3587506175,EG +3587506176,3587538943,IT +3587538944,3587547135,IS +3587547136,3587555327,CH +3587555328,3587571711,BE +3587571712,3587579903,DE +3587579904,3587588095,BE +3587588096,3587596287,BG +3587596288,3587604479,NL +3587604480,3587620863,FI +3587620864,3587637247,SE +3587637248,3587646975,FR +3587646976,3587647231,MC +3587647232,3587653631,FR +3587653632,3587670015,SK +3587670016,3587684279,IT +3587684280,3587684287,GB +3587684288,3587702783,IT +3587702784,3587710975,DE +3587710976,3587719167,CZ +3587719168,3587735551,PL +3587735552,3587751935,GB +3587751936,3587768319,FI +3587776512,3587784703,IR +3587784704,3587801087,DE +3587801088,3587817471,IT +3587817472,3587833855,MT +3587833856,3587842047,DE +3587842048,3587850239,IT +3587850240,3587854335,NL +3587854336,3587866623,PL +3587866624,3587874815,FR +3587874816,3587883007,DE +3587883008,3587915775,GB +3587915776,3587932159,EE +3587932160,3587948543,BE +3587948544,3587964927,RU +3587964928,3587981311,ES +3587981312,3587997695,IS +3587997696,3588014079,DE +3588014080,3588030463,CZ +3588030464,3588046847,RU +3588046848,3588063231,DE +3588063232,3588071423,CH +3588071424,3588079615,GB +3588079616,3588095999,CH +3588096000,3588104191,NL +3588104192,3588112383,BG +3588112384,3588128767,RE +3588128768,3588145151,HU +3588145152,3588153343,PL +3588153344,3588161535,RU +3588161536,3588173311,FR +3588173312,3588173567,RE +3588173568,3588173823,YT +3588173824,3588227071,FR +3588227072,3588292607,BE +3588292608,3588308991,AT +3588308992,3588325375,NO +3588325376,3588333567,GB +3588333568,3588341759,FR +3588341760,3588358143,IT +3588358144,3588374527,BG +3588390912,3588394239,LT +3588394240,3588394495,LV +3588394496,3588407295,LT +3588407296,3588423679,CZ +3588423680,3588440063,ES +3588440064,3588456447,PL +3588456448,3588464639,NL +3588464640,3588465151,AT +3588465152,3588465663,FR +3588465664,3588466431,AT +3588466432,3588466687,AU +3588466688,3588467199,DE +3588467200,3588467455,JP +3588467456,3588472831,AT +3588472832,3588489215,UA +3588489216,3588505599,FR +3588505600,3588521983,RU +3588521984,3588538367,PT +3588538368,3588554751,GB +3588554752,3588571135,AT +3588571136,3588587519,GB +3588587520,3588588567,ES +3588588568,3588588575,IT +3588588576,3588590591,ES +3588590592,3588590847,FR +3588590848,3588595199,ES +3588595200,3588595455,FR +3588595456,3588603903,ES +3588603904,3588620287,SI +3588620288,3588628479,SA +3588628480,3588636671,CH +3588636672,3588653055,UZ +3588653056,3588661247,IT +3588661248,3588666367,NO +3588666368,3588667391,DE +3588667392,3588668415,SG +3588668416,3588669439,HK +3588669440,3588685823,GB +3588685824,3588702207,UA +3588702208,3588718591,ES +3588718592,3588734975,BG +3588734976,3588751359,PL +3588751360,3588767743,TR +3588779648,3588779775,GB +3588784128,3588800511,CH +3588800512,3588801535,RU +3588801536,3588802047,KZ +3588802048,3588802815,RU +3588802816,3588803071,KZ +3588803072,3588807167,RU +3588807168,3588808959,KZ +3588808960,3588810239,RU +3588810240,3588810751,KZ +3588810752,3588813311,RU +3588813312,3588814079,KZ +3588814080,3588814335,RU +3588814336,3588814847,KZ +3588814848,3588816895,RU +3588816896,3588833279,IT +3588833280,3588849663,RO +3588849664,3588857855,IE +3588857856,3588866047,IR +3588866048,3588882431,NL +3588882432,3588890623,RU +3588890624,3588898815,GB +3588898816,3588915199,NO +3588915200,3588931583,IT +3588931584,3588947967,RU +3588947968,3588964351,GB +3588964352,3588997119,CZ +3588997120,3589013503,AT +3589013504,3589021695,ES +3589021696,3589029887,SA +3589029888,3589030119,GB +3589030120,3589030127,NL +3589030128,3589031055,GB +3589031056,3589031056,NL +3589031057,3589043455,GB +3589043456,3589043711,NL +3589043712,3589046271,GB +3589046272,3589079039,NO +3589079040,3589128191,DK +3589128192,3589144575,GB +3589144576,3589152767,UA +3589152768,3589160959,DE +3589160960,3589177343,PL +3589177344,3589193727,TR +3589193728,3589210111,SE +3589210112,3589226495,NL +3589226496,3589242879,NO +3589242880,3589259263,NL +3589259264,3589275647,DE +3589275648,3589292031,RS +3589292032,3589308415,AT +3589308416,3589324799,DE +3589324800,3589341183,BG +3589341184,3589373951,PL +3589373952,3589390335,DE +3589390336,3589423103,RU +3589423104,3589425011,GB +3589425012,3589425015,PT +3589425016,3589428863,GB +3589428864,3589428991,SE +3589428992,3589430591,GB +3589430592,3589430655,ES +3589430656,3589431295,GB +3589431296,3589431311,ES +3589431312,3589431327,PT +3589431328,3589432319,ES +3589432320,3589433855,GB +3589433856,3589434111,IE +3589434112,3589435759,GB +3589435760,3589435763,ES +3589435764,3589439487,GB +3589439488,3589455871,SE +3589455872,3589472255,RU +3589472256,3589488639,TR +3589488640,3589505023,RU +3589505024,3589521407,FI +3589521408,3589537791,IT +3589537792,3589545983,FR +3589545984,3589554175,DE +3589554176,3589570559,PS +3589570560,3589572735,GB +3589572736,3589572863,NL +3589572864,3589580799,GB +3589580800,3589581823,NL +3589581824,3589582719,GB +3589582720,3589582847,NL +3589582848,3589582975,GB +3589582976,3589583103,NL +3589583104,3589586943,GB +3589586944,3589587199,DE +3589587200,3589587455,NL +3589587456,3589587967,CH +3589587968,3589588991,GB +3589588992,3589599231,RS +3589599232,3589601279,SE +3589601280,3589603327,RS +3589603328,3589668863,FR +3589668864,3589670911,LT +3589670912,3589672959,RU +3589672960,3589675007,LT +3589675008,3589676031,RU +3589676032,3589677055,LT +3589677056,3589685247,FR +3589685248,3589718015,GB +3589718016,3589722023,BE +3589722024,3589722031,FR +3589722032,3589734399,BE +3589734400,3589742591,ZA +3589742592,3589746175,NL +3589746176,3589746687,US +3589746688,3589767167,NL +3589767168,3589810431,RU +3589810432,3589810687,PL +3589810688,3589816319,RU +3589819562,3589819563,GB +3589825792,3589825807,DE +3589825808,3589825809,US +3589825810,3589826047,DE +3589826718,3589826718,AT +3589827584,3589827647,DE +3589828736,3589828863,NL +3589828992,3589829119,ES +3589829504,3589829631,DE +3589832704,3589849087,TR +3589849088,3589865471,GB +3589865472,3589881855,GR +3589881856,3589890047,NL +3589890048,3589891839,GB +3589891840,3589891967,BE +3589891968,3589931007,GB +3589931008,3589947391,SI +3589947392,3589963775,FI +3589963776,3589980159,ES +3589980160,3589996543,CZ +3589996544,3589998591,GB +3589998592,3589998607,ES +3589998608,3589998639,GB +3589998640,3589998655,DE +3589998656,3589998999,GB +3589999000,3589999007,DE +3589999008,3589999031,GB +3589999032,3589999039,DE +3589999040,3590000191,GB +3590000192,3590000207,DE +3590000208,3590001967,GB +3590001968,3590001983,IT +3590001984,3590005055,GB +3590005056,3590005071,DE +3590005072,3590005119,GB +3590005120,3590005135,IT +3590005136,3590005407,GB +3590005408,3590005423,SE +3590005424,3590008879,GB +3590008880,3590008887,DE +3590008888,3590009103,GB +3590009104,3590009119,DE +3590009120,3590009263,GB +3590009264,3590009279,DE +3590009280,3590012927,GB +3590012928,3590029311,BE +3590029312,3590032159,FR +3590032160,3590032175,ES +3590032176,3590032191,GB +3590032192,3590032207,PL +3590032208,3590032223,NL +3590032224,3590032271,DE +3590032272,3590032295,PT +3590032296,3590032303,PL +3590032304,3590032311,CZ +3590032312,3590032319,LT +3590032320,3590032351,ES +3590032352,3590045695,FR +3590045696,3590047743,RU +3590047744,3590049791,UA +3590049792,3590062079,RU +3590062080,3590078463,DE +3590078464,3590094847,RU +3590094848,3590111231,DE +3590111232,3590127615,LT +3590127616,3590143999,GB +3590144000,3590156287,SI +3590156288,3590157311,HR +3590157312,3590158335,RS +3590158336,3590158591,SI +3590158592,3590158847,RS +3590158848,3590160383,SI +3590160384,3590176767,GB +3590176768,3590193151,HU +3590193152,3590201343,IT +3590201344,3590209535,DE +3590209536,3590225919,ES +3590225920,3590234111,TR +3590234112,3590242303,GB +3590242304,3590244351,US +3590244352,3590244607,DE +3590244608,3590245255,IE +3590245256,3590245271,GB +3590245272,3590245279,DE +3590245280,3590245311,IE +3590245312,3590245439,US +3590245440,3590247048,IE +3590247049,3590247049,IT +3590247050,3590247103,IE +3590247104,3590247119,GB +3590247120,3590247167,IE +3590247168,3590247231,US +3590247232,3590247295,IE +3590247296,3590247423,US +3590247424,3590247487,IE +3590247488,3590247551,US +3590247552,3590251647,IE +3590251648,3590251775,NL +3590251776,3590253567,IE +3590253568,3590254079,FR +3590254080,3590254854,IE +3590254855,3590254855,GB +3590254856,3590255871,IE +3590255872,3590255935,US +3590255936,3590256127,IE +3590256128,3590256383,ES +3590256384,3590256735,IE +3590256736,3590256767,BE +3590256768,3590257151,US +3590257152,3590258559,IE +3590258560,3590258687,US +3590258688,3590291455,IT +3590291456,3590299647,NG +3590299648,3590307839,FI +3590307840,3590308951,GB +3590308952,3590308959,GH +3590308960,3590309615,GB +3590309616,3590309623,BF +3590309624,3590311223,GB +3590311224,3590311231,CD +3590311232,3590317951,GB +3590317952,3590318015,UA +3590318016,3590324223,GB +3590324224,3623890943,US +3623890944,3623891199,ZA +3623891200,3623891455,US +3623891456,3623891711,ZA +3623891712,3623891967,US +3623891968,3623892479,ZA +3623892480,3624054783,US +3624054784,3624056831,ZA +3624056832,3624181759,US +3624181760,3624182783,ZA +3624182784,3624206335,US +3624206336,3624208383,ZA +3624208384,3624255487,US +3624255488,3624257535,ZA +3624257536,3624271871,US +3624271872,3624272383,SY +3624272384,3624272447,US +3624272448,3624272455,CA +3624272456,3624272639,US +3624272640,3624272895,DZ +3624272896,3624281087,US +3624281088,3624281343,HT +3624281344,3624284671,US +3624284672,3624284927,CA +3624284928,3624287743,US +3624287744,3624287999,CA +3624288000,3624288255,US +3624288256,3624290303,IN +3624290304,3624292351,CA +3624292352,3624292607,MF +3624292608,3624295176,US +3624295177,3624295177,SG +3624295178,3624295423,US +3624295424,3624295679,CA +3624295680,3624295935,US +3624295936,3624296191,LY +3624296192,3624296447,US +3624296448,3624296703,CA +3624296704,3624297471,US +3624297472,3624298495,CO +3624298496,3624299519,PH +3624299520,3624300031,US +3624300032,3624300287,LY +3624300288,3624302335,US +3624302336,3624302591,CA +3624302592,3624303871,US +3624303872,3624304127,CA +3624304128,3624321023,US +3624321024,3624325119,CA +3624325120,3624357887,US +3624357888,3624358143,KN +3624358144,3624359679,US +3624359680,3624360703,CW +3624360704,3624386559,US +3624386560,3624394751,CA +3624394752,3624402943,US +3624402944,3624411135,JP +3624411136,3624435711,US +3624435712,3624443903,CA +3624443904,3624443919,US +3624443920,3624452095,CA +3624452096,3624480767,US +3624480768,3624484863,CA +3624484864,3624525823,US +3624529920,3624534015,CA +3624534016,3624540671,US +3624540672,3624541183,GB +3624541184,3624587263,US +3624587264,3624591359,JM +3624591360,3624592383,US +3624592384,3624593919,CA +3624593920,3624595455,US +3624595456,3624599551,IN +3624599552,3624714239,US +3624714240,3624722431,SG +3624722432,3624730623,US +3624730624,3624796159,CA +3624796160,3624828927,US +3624828928,3624833023,CA +3624833024,3624845311,US +3624845312,3624849407,AU +3624849408,3624984575,US +3624984576,3624992767,CA +3624992768,3625058303,US +3625058304,3625091071,CA +3625091072,3625116927,US +3625116928,3625117183,SE +3625117184,3625118233,US +3625118234,3625118241,CA +3625118242,3625118271,US +3625118272,3625118287,CA +3625118288,3625140223,US +3625140224,3625148415,CA +3625148416,3625168895,US +3625168896,3625172991,CA +3625172992,3625256959,US +3625256960,3625257983,CA +3625257984,3625261055,US +3625263104,3625287679,US +3625287680,3625295871,CA +3625295872,3625346047,US +3625346048,3625346303,AR +3625346304,3625418751,US +3625418752,3625426943,CA +3625426944,3625508863,US +3625508864,3625512959,CA +3625512960,3625517055,US +3625517056,3625517311,CA +3625517312,3625517567,US +3625517568,3625518079,CA +3625518080,3625518335,US +3625518336,3625518847,CA +3625518848,3625519103,US +3625519104,3625519871,CA +3625519872,3625520127,US +3625520128,3625520639,CA +3625520640,3625521151,US +3625521152,3625521407,CA +3625521408,3625521663,US +3625521664,3625522687,CA +3625522688,3625522943,US +3625522944,3625523199,CA +3625523200,3625523455,US +3625523456,3625523967,CA +3625523968,3625524223,US +3625524224,3625524735,CA +3625524736,3625524991,US +3625524992,3625525503,CA +3625525504,3625526015,US +3625526016,3625526271,CA +3625526272,3625526527,US +3625526528,3625526783,CA +3625526784,3625527295,US +3625527296,3625528575,CA +3625528576,3625529087,US +3625529088,3625529599,CA +3625529600,3625529855,US +3625529856,3625531391,CA +3625531392,3625531647,US +3625531648,3625531903,CA +3625531904,3625532671,US +3625532672,3625535743,CA +3625535744,3625535999,US +3625536000,3625537535,CA +3625537536,3625538303,US +3625538304,3625538559,CA +3625538560,3625542655,US +3625542656,3625543167,CA +3625543168,3625544191,US +3625544192,3625547263,CA +3625547264,3625547519,US +3625547520,3625548287,CA +3625548288,3625549567,US +3625549568,3625549823,CA +3625549824,3625631743,US +3625631744,3625639935,CA +3625639936,3625961983,US +3625961984,3625962239,GB +3625962240,3626091519,US +3626091520,3626092031,AR +3626092032,3626233655,US +3626233656,3626233663,GB +3626233664,3626234111,US +3626234112,3626234367,GB +3626234368,3626270719,US +3626270720,3626287103,CA +3626287104,3626332159,US +3626332160,3626336255,CA +3626336256,3626508287,US +3626508288,3626512383,CA +3626512384,3626515967,US +3626515968,3626516223,GB +3626516224,3626524671,US +3626524672,3626532863,CA +3626532864,3626852351,US +3626852352,3626860543,CA +3626860544,3626893311,US +3626893312,3626905599,CA +3626905600,3626926079,US +3626926080,3626934271,CA +3626934272,3627044863,US +3627044864,3627048959,CA +3627048960,3627049983,AG +3627049984,3627065343,US +3627065344,3627069439,CA +3627069440,3627220223,US +3627220224,3627220479,CA +3627220480,3627299071,US +3627299072,3627299327,IN +3627299328,3627507711,US +3627507712,3627511807,CA +3627511808,3627532287,US +3627532288,3627544575,CA +3627544576,3627659263,US +3627659264,3627663359,CA +3627663360,3627667561,US +3627667562,3627667562,CA +3627667563,3627667564,US +3627667565,3627667565,CA +3627667566,3627679743,US +3627679744,3627712511,CA +3627712512,3627753471,US +3627753472,3627753727,AR +3627753728,3627759071,US +3627759072,3627759103,GB +3627759104,3627760127,US +3627760128,3627760383,NL +3627760384,3627760895,US +3627760896,3627761151,SG +3627761152,3627802623,US +3627802624,3627810815,CA +3627810816,3628138495,US +3628138496,3628138751,CA +3628138752,3628139263,US +3628139264,3628139359,CA +3628139360,3628139375,US +3628139376,3628140543,CA +3628140544,3628140799,US +3628140800,3628141055,CA +3628141056,3628141311,US +3628141312,3628143615,CA +3628143616,3628144383,US +3628144384,3628145151,CA +3628145152,3628145919,US +3628145920,3628146175,AU +3628146176,3628147199,CA +3628147200,3628147455,US +3628147456,3628147967,CA +3628147968,3628148223,US +3628148224,3628149247,CA +3628149248,3628150015,US +3628150016,3628150271,CA +3628150272,3628150527,US +3628150528,3628150783,CA +3628150784,3628151039,US +3628151040,3628151551,CA +3628151552,3628151807,US +3628151808,3628152063,CA +3628152064,3628152319,US +3628152320,3628153087,CA +3628153088,3628153343,KW +3628153344,3628155135,CA +3628155136,3628155391,US +3628155392,3628156159,CA +3628156160,3628157183,US +3628157184,3628157439,CA +3628157440,3628157951,US +3628157952,3628158207,CA +3628158208,3628158463,US +3628158464,3628158719,CA +3628158720,3628158975,US +3628158976,3628159231,CA +3628159232,3628159487,US +3628159488,3628159743,CA +3628159744,3628159807,US +3628159808,3628160255,CA +3628160256,3628160767,US +3628160768,3628161535,CA +3628161536,3628161791,US +3628161792,3628162047,CA +3628162048,3628162303,US +3628162304,3628162559,CA +3628162560,3628162815,US +3628162816,3628163071,CA +3628163072,3628163327,US +3628163328,3628165375,CA +3628165376,3628165631,US +3628165632,3628166143,CA +3628166144,3628167167,US +3628167168,3628167679,CA +3628167680,3628168063,US +3628168064,3628168191,CA +3628168192,3628168959,US +3628168960,3628169999,CA +3628170000,3628170015,US +3628170016,3628170495,CA +3628170496,3628179455,US +3628179456,3628187647,CA +3628187648,3628225097,US +3628225098,3628225098,AT +3628225099,3628225387,US +3628225388,3628225395,GB +3628225396,3628225779,US +3628225780,3628225783,GB +3628225784,3628226927,US +3628226928,3628226935,IE +3628226936,3628227167,US +3628227168,3628227199,PL +3628227200,3628236799,US +3628236800,3628257279,CA +3628257280,3628552191,US +3628552192,3628556287,CA +3628556288,3628580863,US +3628580864,3628589055,CA +3628589056,3628598271,US +3628598272,3628599295,CO +3628599296,3628603391,CL +3628603392,3628604415,US +3628604416,3628605439,GT +3628605440,3628608511,IL +3628608512,3628609023,VE +3628609024,3628613375,US +3628613376,3628613631,HN +3628613632,3628614399,ID +3628614400,3628614911,CO +3628614912,3628615167,US +3628615168,3628615679,IL +3628615680,3628616191,US +3628616192,3628617215,PR +3628617216,3628617471,HN +3628617472,3628617727,US +3628617728,3628618239,CO +3628618240,3628619775,HN +3628619776,3628622847,US +3628622848,3628623871,PR +3628623872,3628625919,NG +3628625920,3628626175,PA +3628626176,3628626943,HN +3628626944,3628627199,CO +3628627200,3628627455,IL +3628627456,3628627711,HN +3628627712,3628628991,SV +3628628992,3628629247,GT +3628629248,3628629503,US +3628629504,3628631807,VE +3628631808,3628634111,CO +3628634112,3628636159,AR +3628636160,3628636671,VE +3628636672,3628636927,US +3628636928,3628637183,VE +3628637184,3628637695,CO +3628637696,3628638207,US +3628638208,3628646399,CL +3628646400,3628646911,US +3628646912,3628647423,HN +3628647424,3628647679,SZ +3628647680,3628648959,CO +3628648960,3628649215,US +3628649216,3628649727,CO +3628649728,3628654079,US +3628654080,3628654591,PA +3628654592,3628654847,US +3628654848,3628655103,CR +3628655104,3628655359,VE +3628655360,3628657663,CO +3628657664,3628657919,VE +3628657920,3628658175,BS +3628658176,3628679167,US +3628679168,3628683263,CA +3628683264,3628747775,US +3628747776,3628748287,LU +3628748288,3628748799,AU +3628748800,3628753663,US +3628753664,3628753919,FR +3628753920,3628754943,AT +3628754944,3628755967,BE +3628755968,3628756991,AR +3628756992,3628759039,DE +3628759040,3628761087,CN +3628761088,3628834815,US +3628834816,3628843007,CA +3628843008,3629187071,US +3629187072,3629195263,CA +3629195264,3629199359,US +3629199360,3629201439,CA +3629201440,3629201447,US +3629201448,3629201471,CA +3629201472,3629201475,US +3629201476,3629201495,CA +3629201496,3629201499,US +3629201500,3629201503,CA +3629201504,3629201507,US +3629201508,3629201935,CA +3629201936,3629201939,US +3629201940,3629202103,CA +3629202104,3629202107,US +3629202108,3629203455,CA +3629203456,3629318143,US +3629318144,3629326335,CA +3629326336,3629539327,US +3629539328,3629547519,CA +3629547520,3629613055,US +3629613056,3629613311,SE +3629613312,3629614591,US +3629614592,3629614847,DE +3629614848,3629615103,NL +3629615104,3629615359,US +3629615360,3629615615,GB +3629615616,3629615871,JP +3629615872,3629616383,US +3629616384,3629616639,FR +3629616640,3629616895,US +3629616896,3629617151,HK +3629617152,3629662207,US +3629662208,3629662463,GB +3629662464,3629737215,US +3629737216,3629737471,CA +3629737472,3629767935,US +3629767936,3629768191,CA +3629768192,3629789439,US +3629789440,3629789695,CA +3629789696,3629789951,US +3629789952,3629790207,CA +3629790208,3629839103,US +3629839104,3629839359,CA +3629839360,3630040063,US +3630040064,3630040319,CA +3630040320,3630040431,US +3630040432,3630040447,CA +3630040448,3630040575,US +3630040576,3630040831,CA +3630040832,3630041343,US +3630041344,3630041599,CA +3630041600,3630045439,US +3630045440,3630046207,CA +3630046208,3630046719,US +3630046720,3630047487,CA +3630047488,3630047999,US +3630048000,3630048255,CA +3630048256,3630048511,US +3630048512,3630049599,CA +3630049600,3630050047,US +3630050048,3630050303,CA +3630050304,3630050559,US +3630050560,3630050815,CA +3630050816,3630051839,US +3630051840,3630052607,CA +3630052608,3630053887,US +3630053888,3630054143,CA +3630054144,3630054655,US +3630054656,3630055167,CA +3630055168,3630055935,US +3630055936,3630056959,CA +3630056960,3630057407,US +3630057408,3630057471,CA +3630057472,3630057727,US +3630057728,3630057983,CA +3630057984,3630058751,US +3630058752,3630059007,CA +3630059008,3630059263,US +3630059264,3630059519,CA +3630059520,3630061567,US +3630061568,3630062079,CA +3630062080,3630062335,US +3630062336,3630062591,CA +3630062592,3630062847,US +3630062848,3630063871,CA +3630063872,3630063935,US +3630063936,3630063951,CA +3630063952,3630066431,US +3630066432,3630066687,CA +3630066688,3630066943,US +3630066944,3630067711,CA +3630067712,3630068991,US +3630068992,3630069247,CA +3630069248,3630069503,US +3630069504,3630069759,CA +3630069760,3630071295,US +3630071296,3630071551,CA +3630071552,3630072831,US +3630072832,3630073343,CA +3630073344,3630074879,US +3630074880,3630075135,CA +3630075136,3630082303,US +3630082304,3630082559,CA +3630082560,3630082815,US +3630082816,3630083071,CA +3630083072,3630085631,US +3630085632,3630085887,CA +3630085888,3630087679,US +3630087680,3630087935,CA +3630087936,3630088447,US +3630088448,3630088959,CA +3630088960,3630091519,US +3630091520,3630091775,CA +3630091776,3630093567,US +3630093568,3630093823,CA +3630093824,3630096127,US +3630096128,3630096383,CA +3630096384,3630097151,US +3630097152,3630097663,CA +3630097664,3630102783,US +3630102784,3630103807,CA +3630103808,3630104063,US +3630104064,3630104575,CA +3630104576,3630141951,US +3630141952,3630142207,CA +3630142208,3630148095,US +3630148096,3630148607,CA +3630148608,3630148863,US +3630148864,3630149119,CA +3630149120,3630151679,US +3630151680,3630152191,CA +3630152192,3630152703,US +3630152704,3630152959,CA +3630152960,3630153727,US +3630153728,3630157823,CA +3630157824,3630159615,US +3630159616,3630159871,CA +3630159872,3630160127,US +3630160128,3630160383,CA +3630160384,3630161151,US +3630161152,3630161407,CA +3630161408,3630162431,US +3630162432,3630162687,CA +3630162688,3630163199,US +3630163200,3630163455,CA +3630163456,3630164991,US +3630164992,3630165247,CA +3630165248,3630165503,US +3630165504,3630166015,CA +3630166016,3630169855,US +3630169856,3630170111,CA +3630170112,3630313471,US +3630313472,3630317567,CA +3630317568,3630354431,US +3630354432,3630358527,BR +3630358528,3630375423,US +3630375424,3630383103,CA +3630383104,3630391295,US +3630391296,3630395391,CA +3630395392,3630417407,US +3630417408,3630417663,AU +3630417664,3630417919,US +3630417920,3630418175,CA +3630418176,3630418431,AU +3630418432,3630418943,US +3630418944,3630419199,AU +3630419200,3630423551,US +3630423552,3630423807,GB +3630423808,3630718975,US +3630718976,3630727167,CA +3630727168,3630745599,US +3630745600,3630746367,UG +3630746368,3630746623,US +3630746624,3630747647,UG +3630747648,3630780415,US +3630780416,3630784511,CA +3630784512,3630850047,US +3630850048,3630854143,CA +3630854144,3630895615,US +3630895616,3630895871,CA +3630895872,3630900735,US +3630900736,3630900991,CA +3630900992,3630905599,US +3630905600,3630905855,CA +3630905856,3630956543,US +3630956544,3631005695,CA +3631005696,3631017983,US +3631017984,3631022079,HK +3631022080,3631112191,US +3631112192,3631112703,VC +3631112704,3631116543,BB +3631116544,3631117567,GD +3631117568,3631117823,BB +3631117824,3631118079,GD +3631118080,3631119103,VC +3631119104,3631119615,BB +3631119616,3631120383,GD +3631120384,3631144959,US +3631144960,3631153151,CA +3631153152,3631284223,US +3631284224,3631316991,CA +3631316992,3631333375,US +3631333376,3631341567,CA +3631341568,3631611903,US +3631611904,3631628287,AU +3631628288,3631644671,US +3631644672,3631652863,CA +3631652864,3631665151,US +3631665152,3631667199,CA +3631667200,3631667455,US +3631667456,3631668735,CA +3631668736,3631806207,US +3631806208,3631806463,NL +3631806464,3631841279,US +3631841280,3631874047,CA +3631874048,3631874303,US +3631874304,3631874559,CA +3631874560,3631875583,US +3631875584,3631876095,CA +3631876096,3631878399,US +3631878400,3631878991,CA +3631878992,3631878999,US +3631879000,3631879175,CA +3631879176,3631879183,US +3631879184,3631879663,CA +3631879664,3631879679,US +3631879680,3631880191,CA +3631880192,3631881727,US +3631881728,3631882239,CA +3631882240,3631884543,US +3631884544,3631885055,CA +3631885056,3631885311,US +3631885312,3631885823,CA +3631885824,3631889663,US +3631889664,3631890175,CA +3631890176,3631890431,US +3631890432,3631890687,CA +3631890688,3631890943,US +3631890944,3631891199,CA +3631891200,3631891711,US +3631891712,3631891967,CA +3631891968,3631892479,US +3631892480,3631892735,CA +3631892736,3631893503,US +3631893504,3631893759,CA +3631893760,3631894015,US +3631894016,3631894271,CA +3631894272,3631897599,US +3631897600,3631897855,CA +3631897856,3631898111,US +3631898112,3631898367,CA +3631898368,3631901439,US +3631901440,3631901951,CA +3631901952,3631907071,US +3631907072,3631907839,CA +3631907840,3631908351,US +3631908352,3631908607,CA +3631908608,3631910911,US +3631910912,3631911423,CA +3631911424,3631911679,US +3631911680,3631911935,CA +3631911936,3631913983,US +3631913984,3631914239,CA +3631914240,3631915263,US +3631915264,3631915519,CA +3631915520,3631920383,US +3631920384,3631920639,CA +3631920640,3631939583,US +3631939584,3632005119,CA +3632005120,3632136191,US +3632144384,3632152575,US +3632152576,3632168959,CA +3632168960,3632187391,US +3632187392,3632188415,CA +3632188416,3632197631,US +3632197632,3632201727,CA +3632201728,3632218271,US +3632218272,3632218287,AU +3632218288,3632218295,US +3632218296,3632218303,SG +3632218304,3632244223,US +3632244224,3632244479,CA +3632244480,3632275455,US +3632275456,3632283647,NL +3632283648,3632284879,US +3632284880,3632284895,CA +3632284896,3632289583,US +3632289584,3632289599,PH +3632289600,3632291775,US +3632291776,3632291839,GB +3632291840,3632332799,US +3632332800,3632357375,CA +3632357376,3632376319,US +3632376320,3632377343,CA +3632377344,3632381951,US +3632381952,3632390143,CA +3632390144,3632414719,US +3632414720,3632422911,CA +3632422912,3632451583,US +3632451584,3632455679,CA +3632455680,3632857087,US +3632857088,3632861183,BS +3632861184,3632881663,US +3632881664,3632889855,CA +3632889856,3632898047,US +3632898048,3632902143,CA +3632902144,3632971775,US +3632971776,3632988159,CA +3632988160,3633029119,US +3633029120,3633029631,PY +3633029632,3633030655,US +3633030656,3633030911,SN +3633030912,3633031935,US +3633031936,3633032191,PG +3633032192,3633036031,US +3633036032,3633036287,HT +3633036288,3633036543,TT +3633036544,3633336319,US +3633336320,3633340415,KY +3633340416,3633344511,US +3633344512,3633348607,CA +3633348608,3633405951,US +3633405952,3633410047,CA +3633410048,3633479679,US +3633479680,3633483775,CA +3633483776,3633545215,US +3633545216,3633545727,GA +3633545728,3633546239,US +3633546240,3633546751,GA +3633546752,3633547263,US +3633547264,3633548287,GA +3633548288,3633548543,US +3633548544,3633548799,GA +3633548800,3633549567,US +3633549568,3633549823,GA +3633549824,3633567231,US +3633567232,3633567743,NL +3633567744,3633568767,US +3633568768,3633569023,SG +3633569024,3633569279,US +3633569280,3633569535,CA +3633569536,3633709055,US +3633709056,3633717247,CA +3633717248,3633720063,US +3633720064,3633720191,MX +3633720192,3633757439,US +3633757440,3633757695,IN +3633757696,3633757951,US +3633757952,3633758207,PH +3633758208,3633783039,US +3633783296,3633783551,US +3633783552,3633783807,CA +3633783808,3633815807,US +3633815808,3633816063,CA +3633816064,3633818623,US +3633818624,3633819135,CA +3633819136,3633821695,US +3633821696,3633821951,CA +3633821952,3633823743,US +3633823744,3633827839,HK +3633827840,3633872895,US +3633872896,3633874431,CA +3633874432,3633874687,US +3633874688,3633876991,CA +3633876992,3633881087,US +3633881088,3633885183,CW +3633885184,3633889279,US +3633889280,3633893375,CA +3633893376,3633971199,US +3633971200,3634020351,CA +3634020352,3634037247,US +3634037248,3634037759,CA +3634037760,3634040063,US +3634040064,3634040319,CA +3634040320,3634041087,US +3634041088,3634041343,CA +3634041344,3634042111,US +3634042112,3634042367,CA +3634042368,3634046719,US +3634046720,3634046975,CA +3634046976,3634050559,US +3634050560,3634050815,CA +3634050816,3634053119,US +3634053120,3634061311,CL +3634061312,3634094079,US +3634094080,3634098175,SE +3634098176,3634167807,US +3634167808,3634189055,CA +3634189056,3634189311,US +3634189312,3634193263,CA +3634193264,3634193279,US +3634193280,3634193940,CA +3634193941,3634193941,US +3634193942,3634194367,CA +3634194368,3634194399,US +3634194400,3634196479,CA +3634196480,3634257919,US +3634257920,3634262015,SE +3634262016,3634286079,US +3634286080,3634286335,CA +3634286336,3634288895,US +3634288896,3634289151,CA +3634289152,3634506495,US +3634506496,3634506751,CA +3634506752,3634511871,US +3634511872,3634515967,CA +3634515968,3634552831,US +3634552832,3634556927,CA +3634556928,3634741247,US +3634741248,3634749439,CA +3634749440,3634880511,US +3634880512,3634888703,CA +3634888704,3634913279,US +3634913280,3634915663,CA +3634915664,3634915679,US +3634915680,3634921471,CA +3634921472,3634925567,US +3634925568,3634929663,CA +3634929664,3635051103,US +3635051104,3635051119,CA +3635051120,3635051439,US +3635051440,3635051455,CA +3635051456,3635109887,US +3635109888,3635113983,CA +3635113984,3635118079,JP +3635118080,3635142655,US +3635142656,3635146751,CA +3635146752,3635159039,US +3635159040,3635163135,CA +3635163136,3635167231,US +3635167232,3635167487,GB +3635167488,3635171071,NL +3635171072,3635171327,CA +3635171328,3635187967,US +3635187968,3635188223,CN +3635188224,3635314687,US +3635314688,3635322879,CA +3635322880,3635466239,US +3635466240,3635470335,CA +3635470336,3635527679,US +3635527680,3635527935,PR +3635527936,3635528959,US +3635528960,3635529215,PR +3635529216,3635529711,US +3635529712,3635529719,CO +3635529720,3635529983,US +3635529984,3635530751,PR +3635530752,3635531007,US +3635531008,3635531263,PR +3635531264,3635533535,US +3635533536,3635533551,IN +3635533552,3635643391,US +3635643392,3635644415,JP +3635644416,3635645183,TH +3635645184,3635645439,JP +3635645440,3635645951,HK +3635645952,3635646463,TL +3635646464,3635646975,US +3635646976,3635647487,GB +3635647488,3635647743,US +3635647744,3635647999,CA +3635648000,3635648255,TW +3635648256,3635648511,ML +3635648512,3635648767,US +3635648768,3635649023,JP +3635649024,3635650559,US +3635650560,3635652607,HK +3635652608,3635655679,US +3635655680,3635656447,HK +3635656448,3635656703,US +3635656704,3635657727,JP +3635657728,3635659263,US +3635659264,3635660287,ID +3635660288,3635660799,US +3635660800,3635661823,HK +3635661824,3635670527,US +3635670528,3635671039,TL +3635671040,3635674623,US +3635674624,3635675135,HK +3635675136,3635740671,US +3635740672,3635740927,CA +3635740928,3635741439,US +3635741440,3635741695,CA +3635741696,3635741951,US +3635741952,3635745535,CA +3635745536,3635746047,US +3635746048,3635748223,CA +3635748224,3635748351,US +3635748352,3635752447,CA +3635752448,3635752703,US +3635752704,3635765759,CA +3635765760,3635768575,US +3635768576,3635771391,CA +3635771392,3635771647,US +3635771648,3635771903,CA +3635771904,3635772415,US +3635772416,3635772671,CA +3635772672,3635772927,US +3635772928,3635781119,CA +3635781120,3635783167,US +3635783168,3635799551,CA +3635799552,3635800063,US +3635800064,3635804159,CA +3635804160,3635804671,US +3635804672,3635806207,CA +3635806208,3635871743,US +3635871744,3635879935,CA +3635879936,3635892223,US +3635892224,3635896319,CA +3635896320,3635904511,US +3635904512,3635912703,CA +3635912704,3635924991,US +3635924992,3635929087,MV +3635929088,3635961855,US +3635961856,3635963903,SV +3635963904,3635964415,US +3635964416,3635965951,SV +3635965952,3635966323,US +3635966324,3635966324,ES +3635966325,3635966975,US +3635966976,3635967999,PY +3635968000,3635970047,SV +3635970048,3636012543,US +3636012544,3636012799,DE +3636012800,3636019199,US +3636019200,3636027391,CA +3636027392,3636031487,SG +3636031488,3636031743,US +3636031744,3636035583,SG +3636035584,3636064255,US +3636064256,3636068351,CA +3636068352,3636150271,US +3636150272,3636150527,CA +3636150528,3636150783,US +3636150784,3636156415,CA +3636156416,3636156927,US +3636156928,3636157119,CA +3636157120,3636157151,US +3636157152,3636157183,CA +3636157184,3636157439,US +3636157440,3636162559,CA +3636162560,3636163583,US +3636163584,3636164607,CA +3636164608,3636165119,US +3636165120,3636165631,CA +3636165632,3636166143,US +3636166144,3636166655,CA +3636166656,3636206079,US +3636206080,3636206335,AU +3636206336,3636396031,US +3636396032,3636430335,CA +3636430336,3636430591,KY +3636430592,3636461567,CA +3636461568,3636609023,US +3636609024,3636621311,CA +3636621312,3636625407,US +3636625408,3636626431,AR +3636626432,3636626943,BR +3636626944,3636627199,AR +3636627200,3636627455,BR +3636627456,3636628479,MX +3636628480,3636628991,PE +3636628992,3636822015,US +3636822016,3636854783,CA +3636854784,3636887551,US +3636887552,3636895743,CA +3636895744,3636914175,US +3636914176,3636914431,CA +3636914432,3636918527,US +3636918528,3636918783,CA +3636918784,3637075967,US +3637075968,3637080063,CA +3637080064,3637510143,US +3637510144,3637641215,CA +3637641216,3637665791,US +3637665792,3637669887,CA +3637669888,3637706751,US +3637706752,3637739519,CA +3637739520,3637821439,US +3637821440,3637829631,CA +3637829632,3638165503,US +3638165504,3638181887,CA +3638181888,3638226687,US +3638226688,3638226943,NL +3638226944,3638227967,US +3638227968,3638228223,JP +3638228224,3638247935,US +3638247936,3638248703,GB +3638248704,3638249215,US +3638249216,3638249471,GB +3638249472,3638250559,US +3638250560,3638250623,GB +3638250624,3638304767,US +3638304768,3638312959,CA +3638312960,3638366207,US +3638370304,3638386687,CA +3638386688,3638399743,US +3638399744,3638399999,CH +3638400000,3638401087,US +3638401088,3638401119,CA +3638401120,3638500125,US +3638500126,3638500126,CA +3638500127,3638509567,US +3638509568,3638534143,CA +3638534144,3638697983,US +3638697984,3638706175,CA +3638706176,3638874111,US +3638874112,3638878207,CA +3638878208,3638880511,US +3638880512,3638880767,CA +3638880768,3638898943,US +3638898944,3638899455,MX +3638899456,3638984703,US +3638984704,3638992895,GT +3638992896,3638996991,US +3639001088,3639069439,US +3639069440,3639069695,HK +3639069696,3639083007,US +3639083008,3639148543,CA +3639148544,3639222271,US +3639222272,3639230463,CA +3639230464,3639255039,US +3639255040,3639263231,CA +3639263232,3639279615,US +3639279616,3639283711,CA +3639283712,3639390207,US +3639390208,3639394303,ZA +3639394304,3639396351,US +3639396352,3639396383,NE +3639396384,3639396415,US +3639396416,3639396431,PK +3639396432,3639396447,US +3639396448,3639396463,NG +3639396464,3639396471,TZ +3639396472,3639396487,US +3639396488,3639396519,IN +3639396520,3639396543,US +3639396544,3639396551,TZ +3639396552,3639396671,US +3639396672,3639396735,NE +3639396736,3639396743,IN +3639396744,3639396863,US +3639396864,3639396879,NE +3639396880,3639396927,US +3639396928,3639396959,FR +3639396960,3639396975,NG +3639396976,3639396991,US +3639396992,3639397023,CD +3639397024,3639397119,US +3639397120,3639397375,IN +3639397376,3639397631,US +3639397632,3639397887,NG +3639397888,3639398423,US +3639398424,3639398431,LB +3639398432,3639398439,US +3639398440,3639398447,LB +3639398448,3639398527,US +3639398528,3639398591,SA +3639398592,3639398599,LB +3639398600,3639398655,US +3639398656,3639398663,SA +3639398664,3639399679,US +3639399680,3639399935,HN +3639399936,3639400447,US +3639400448,3639401471,RS +3639401472,3639401495,PK +3639401496,3639401511,US +3639401512,3639401519,ID +3639401520,3639401535,US +3639401536,3639401551,TZ +3639401552,3639401559,LK +3639401560,3639401623,US +3639401624,3639401631,TZ +3639401632,3639401647,US +3639401648,3639401655,PK +3639401656,3639401687,US +3639401688,3639401727,PK +3639401728,3639402015,US +3639402016,3639402039,PK +3639402040,3639402055,US +3639402056,3639402071,PK +3639402072,3639402079,US +3639402080,3639402095,PK +3639402096,3639402111,US +3639402112,3639402175,NG +3639402176,3639402191,PK +3639402192,3639402199,US +3639402200,3639402207,PK +3639402208,3639402239,US +3639402240,3639402495,GH +3639402496,3639525375,US +3639529472,3639533567,US +3639533568,3639537663,CA +3639537664,3639550207,US +3639550208,3639550215,AR +3639550216,3639550223,BR +3639550224,3639550239,CA +3639550240,3639550247,MX +3639550248,3639550311,US +3639550312,3639550319,AU +3639550320,3639554559,US +3639554560,3639554665,GB +3639554666,3639554666,US +3639554667,3639554748,GB +3639554749,3639554749,US +3639554750,3639554815,GB +3639554816,3639555839,US +3639555840,3639555847,AR +3639555848,3639555855,BR +3639555856,3639555863,CA +3639555864,3639555871,MX +3639555872,3639555999,US +3639556000,3639556007,AU +3639556008,3639556015,CA +3639556016,3639556023,CO +3639556024,3639556055,US +3639556056,3639556063,BR +3639556064,3639558143,US +3639558144,3639566335,CA +3639566336,3639566847,US +3639566848,3639567103,HK +3639567104,3639593983,US +3639593984,3639595007,GB +3639595008,3639607295,US +3639607296,3639611391,CA +3639611392,3639664639,US +3639664640,3639668735,CA +3639668736,3639672831,US +3639672832,3639681023,CL +3639681024,3639692031,US +3639692032,3639692287,GB +3639692288,3639704573,US +3639704574,3639704574,GB +3639704575,3639705599,US +3639705600,3639713791,CY +3639713792,3639730175,US +3639730176,3639734271,CA +3639734272,3639736575,US +3639736576,3639736831,HK +3639736832,3639737343,US +3639737344,3639737373,GB +3639737374,3639737374,FR +3639737375,3639737599,GB +3639737600,3639737629,US +3639737630,3639737630,GB +3639737631,3639887815,US +3639887816,3639887831,CA +3639887832,3639888351,US +3639888352,3639888359,CA +3639888360,3639888687,US +3639888688,3639888695,CA +3639888696,3639888719,US +3639888720,3639888727,CA +3639888728,3639888767,US +3639888768,3639888775,CA +3639888776,3639888967,US +3639888968,3639888975,CA +3639888976,3639889047,US +3639889048,3639889055,CA +3639889056,3639889063,US +3639889064,3639889071,CA +3639889072,3639889471,US +3639889472,3639889479,CA +3639889480,3639889487,US +3639889488,3639889495,CA +3639889496,3639889647,US +3639889648,3639889655,CA +3639889656,3639889767,US +3639889768,3639889775,CA +3639889776,3639889783,US +3639889784,3639889791,CA +3639889792,3639889815,US +3639889816,3639889823,CA +3639889824,3639889943,US +3639889944,3639889951,CA +3639889952,3639889991,US +3639889992,3639889999,CA +3639890000,3639890055,US +3639890056,3639890063,CA +3639890064,3639890079,US +3639890080,3639890095,CA +3639890096,3639890135,US +3639890136,3639890143,CA +3639890144,3639890239,US +3639890240,3639890247,CA +3639890248,3639890263,US +3639890264,3639890271,CA +3639890272,3639890311,US +3639890312,3639890327,CA +3639890328,3639890399,US +3639890400,3639890415,CA +3639890416,3639890447,US +3639890448,3639890455,CA +3639890456,3639890535,US +3639890536,3639890559,CA +3639890560,3639890607,US +3639890608,3639890623,CA +3639890624,3639890799,US +3639890800,3639890815,CA +3639890816,3639890863,US +3639890864,3639890871,CA +3639890872,3639890887,US +3639890888,3639890903,CA +3639890904,3639890919,US +3639890920,3639890935,CA +3639890936,3639891063,US +3639891064,3639891071,CA +3639891072,3639891127,US +3639891128,3639891135,CA +3639891136,3639891143,US +3639891144,3639891151,CA +3639891152,3639891159,US +3639891160,3639891167,CA +3639891168,3639891359,US +3639891360,3639891367,CA +3639891368,3639891447,US +3639891448,3639891455,CA +3639891456,3639891567,US +3639891568,3639891575,CA +3639891576,3639891623,US +3639891624,3639891639,CA +3639891640,3639891767,US +3639891768,3639891775,CA +3639891776,3639891799,US +3639891800,3639891807,CA +3639891808,3639891847,US +3639891848,3639891855,CA +3639891856,3639891911,US +3639891912,3639891919,CA +3639891920,3639893471,US +3639893472,3639893487,CA +3639893488,3639893495,US +3639893496,3639893503,CA +3639893504,3639893759,ID +3639893760,3639893855,US +3639893856,3639893863,CA +3639893864,3639902207,US +3639902208,3639918591,PE +3639918592,3639934975,AR +3639934976,3640023079,US +3640023080,3640023087,EG +3640023088,3640057855,US +3640057856,3640068095,CA +3640068096,3640073471,US +3640073472,3640080383,CA +3640080384,3640081407,US +3640081408,3640081919,CA +3640081920,3640082431,US +3640082432,3640082943,CA +3640082944,3640083967,US +3640083968,3640084991,CA +3640084992,3640085503,US +3640085504,3640085759,CA +3640085760,3640087551,US +3640087552,3640088319,CA +3640088320,3640090623,US +3640090624,3640095231,CA +3640095232,3640097023,US +3640097024,3640097279,CA +3640097280,3640098815,US +3640098816,3640107007,CA +3640107008,3640111871,US +3640111872,3640112127,CA +3640112128,3640112383,US +3640112384,3640112639,CA +3640112640,3640112895,US +3640112896,3640113151,CA +3640113152,3640115199,US +3640115200,3640118271,CA +3640118272,3640123135,US +3640123136,3640123391,CA +3640123392,3640125439,US +3640125440,3640126463,CA +3640126464,3640126719,US +3640126720,3640127487,CA +3640127488,3640129535,US +3640129536,3640129791,CA +3640129792,3640130303,US +3640130304,3640130559,CA +3640130560,3640131071,US +3640131072,3640131583,CA +3640131584,3640197119,US +3640197120,3640201215,CA +3640201216,3640205311,US +3640205312,3640209407,BM +3640209408,3640213503,CA +3640213504,3640287231,US +3640287232,3640287743,HK +3640287744,3640288255,US +3640288256,3640289279,PH +3640289280,3640290303,HK +3640290304,3640291327,CN +3640291328,3640312319,US +3640312320,3640312575,NI +3640312576,3640312831,US +3640312832,3640313087,TO +3640313088,3640315391,US +3640315392,3640315647,TR +3640315648,3640316927,US +3640316928,3640317183,MX +3640317184,3640318207,US +3640318208,3640318975,NC +3640318976,3640346879,US +3640346880,3640347134,MX +3640347135,3640360959,US +3640360960,3640369151,CA +3640369152,3640410111,US +3640410112,3640418303,CA +3640418304,3640430591,US +3640430592,3640432639,DE +3640432640,3640433407,US +3640433408,3640433663,DE +3640433664,3640438783,US +3640438784,3640442879,DE +3640442880,3640446975,US +3640446976,3640449023,CA +3640449024,3640450047,DE +3640450048,3640451071,US +3640451072,3640459263,DE +3640459264,3640557567,US +3640557568,3640582143,CA +3640582144,3640647679,US +3640647680,3640651775,JP +3640651776,3640655871,US +3640655872,3641180159,DE +3641180160,3641188351,GB +3641188352,3641192447,TJ +3641192448,3641196543,DE +3641196544,3641200639,SA +3641200640,3641204735,RU +3641204736,3641205759,NL +3641205760,3641206015,ES +3641206016,3641206271,NL +3641206272,3641206527,FR +3641206528,3641206783,IE +3641206784,3641208831,NL +3641212928,3641221119,NO +3641221120,3641229311,PL +3641229312,3641237503,CH +3641237504,3641241599,RU +3641241600,3641245695,GB +3641245696,3641249791,UA +3641253888,3641262079,DE +3641262080,3641266175,IT +3641266176,3641270271,RU +3641270272,3641278463,DE +3641278464,3641282559,IS +3641282560,3641286655,RU +3641286656,3641294847,PL +3641294848,3641298943,GB +3641298944,3641303039,SE +3641303040,3641307135,BG +3641307136,3641311231,LT +3641311232,3641315327,DE +3641315328,3641319423,DK +3641319424,3641323519,RU +3641323520,3641331711,DE +3641331712,3641335807,ES +3641335808,3641343999,SE +3641344000,3641356535,GB +3641356536,3641356543,CM +3641356544,3641360383,GB +3641360384,3641368575,RO +3641368576,3641372671,GB +3641372672,3641376767,BG +3641376768,3641380863,IT +3641380864,3641384959,IR +3641384960,3641389055,CH +3641389056,3641393151,DE +3641393152,3641397247,KZ +3641397248,3641401343,IT +3641401344,3641409535,ES +3641409536,3641413631,PL +3641413632,3641417727,DE +3641417728,3641421823,GE +3641421824,3641425919,TJ +3641425920,3641430015,DE +3641430016,3641434111,CH +3641434112,3641442303,CZ +3641442304,3641446399,GB +3641446400,3641450495,ES +3641450496,3641454591,RU +3641454592,3641458687,SK +3641458688,3641462783,RU +3641462784,3641466879,UZ +3641466880,3641470975,RU +3641470976,3641475071,MD +3641475072,3641479167,IT +3641479168,3641483263,GB +3641483264,3641491455,IT +3641491456,3641493503,UA +3641493504,3641494015,NL +3641494016,3641494527,BG +3641494528,3641495551,UA +3641495552,3641496063,NL +3641496064,3641498111,UA +3641498112,3641498367,NL +3641498368,3641499647,UA +3641499648,3641503743,SA +3641503744,3641507839,RU +3641507840,3641516031,NO +3641516032,3641520127,HU +3641520128,3641524223,FR +3641524224,3641528319,DE +3641528320,3641532415,ES +3641532416,3641536511,HU +3641536512,3641540607,ES +3641540608,3641548799,GB +3641548800,3641552895,DE +3641552896,3641556991,AT +3641556992,3641561087,DE +3641561088,3641565183,RU +3641565184,3641573375,SE +3641573376,3641577471,NO +3641577472,3641581567,RU +3641581568,3641585663,ES +3641585664,3641589759,RU +3641589760,3641593855,CH +3641593856,3641597951,NG +3641597952,3641602047,AZ +3641602048,3641606143,DE +3641606144,3641610239,GB +3641610240,3641618431,DE +3641618432,3641622527,GB +3641622528,3641626623,RU +3641626624,3641630719,HR +3641630720,3641634815,AT +3641634816,3641638911,RU +3641638912,3641643007,AT +3641643008,3641647103,RU +3641647104,3641651199,ES +3641651200,3641655295,RU +3641655296,3641659391,GB +3641659392,3641663487,FR +3641663488,3641667583,MT +3641667584,3641668863,GB +3641668864,3641670271,ZW +3641670272,3641670911,GB +3641670912,3641671167,LS +3641671168,3641671679,GB +3641671680,3641679871,RU +3641683968,3641688063,KZ +3641688064,3641692159,RU +3641692160,3641696255,IT +3641696256,3641700351,BE +3641700352,3641704447,SE +3641704448,3641708543,FR +3641708544,3641712639,RU +3641712640,3641716735,NL +3641716736,3641720831,GB +3641720832,3641729023,MK +3641729024,3641733119,DK +3641733120,3641737215,AT +3641737216,3641739263,RS +3641739264,3641741311,XK +3641741312,3641745407,ES +3641745408,3641749503,DE +3641749504,3641753599,CZ +3641753600,3641757695,SE +3641757696,3641761791,GB +3641761792,3641765887,CY +3641765888,3641769983,ES +3641769984,3641774079,NO +3641774080,3641778175,DE +3641778176,3641782271,PL +3641782272,3641786367,GB +3641786368,3641790463,SE +3641790464,3641794559,LT +3641794560,3641798655,RS +3641798656,3641802751,RU +3641802752,3641806847,NL +3641806848,3641810943,TR +3641810944,3641819135,RU +3641819136,3641823231,DE +3641823232,3641827327,NO +3641827328,3641835519,BH +3641835520,3641839615,IT +3641839616,3641843711,GB +3641843712,3641847807,ES +3641851904,3641855999,NL +3641856000,3641860095,GB +3641860096,3641868287,IT +3641868288,3641876479,RU +3641876480,3641880575,ES +3641880576,3641884671,DE +3641884672,3641888767,NO +3641888768,3641892863,IT +3641892864,3641896959,ES +3641896960,3641901055,BG +3641901056,3641901311,RO +3641901312,3641901567,US +3641901568,3641905151,RO +3641905152,3641909247,NL +3641909248,3641913343,AT +3641913344,3641917439,FR +3641917440,3641925631,GR +3641925632,3641933823,RU +3641933824,3641937919,GB +3641937920,3641942015,IT +3641942016,3641950207,DE +3641950208,3641954303,FR +3641954304,3641957119,MD +3641957120,3641957375,GB +3641957376,3641957887,MD +3641957888,3641958143,GB +3641958144,3641958399,MD +3641958400,3641961727,BE +3641961728,3641961743,NL +3641961744,3641961791,BE +3641961792,3641961799,US +3641961800,3641962495,BE +3641962496,3641966591,GB +3641966592,3641970687,IT +3641970688,3641978879,GB +3641978880,3641982975,DK +3641982976,3641991167,RU +3641991168,3641995263,SE +3641995264,3641999359,DE +3641999360,3642003455,HU +3642003456,3642007551,RU +3642007552,3642015743,UA +3642015744,3642019839,CH +3642019840,3642023935,SY +3642023936,3642028031,EG +3642028032,3642028287,GB +3642028288,3642028543,NG +3642028544,3642028544,GB +3642028545,3642028799,NG +3642028800,3642028800,GB +3642028801,3642028863,SO +3642028864,3642028928,GB +3642028929,3642029055,NG +3642029056,3642029056,GB +3642029057,3642029119,NG +3642029120,3642029183,GB +3642029184,3642029311,NG +3642029312,3642030591,GB +3642030592,3642030847,GN +3642030848,3642031616,GB +3642031617,3642031743,SL +3642031744,3642032127,GB +3642032128,3642036223,PS +3642036224,3642040319,HU +3642040320,3642048511,BY +3642048512,3642048767,GB +3642048768,3642049023,DE +3642049024,3642049279,CH +3642049280,3642049535,NO +3642049536,3642049791,SE +3642049792,3642050047,FI +3642050048,3642050303,FR +3642050304,3642050559,GB +3642050560,3642050815,ES +3642050816,3642051071,IT +3642051072,3642051327,CA +3642051328,3642051583,US +3642051584,3642051839,AU +3642051840,3642054399,DE +3642054400,3642056703,US +3642056704,3642060799,RU +3642060800,3642064895,KE +3642064896,3642068991,IT +3642068992,3642073087,AL +3642073088,3642077183,LV +3642077184,3642081271,BE +3642081272,3642081278,US +3642081279,3642081279,BE +3642081280,3642085375,NL +3642085376,3642089471,RU +3642089472,3642093567,SE +3642093568,3642097663,NL +3642097664,3642101759,GB +3642101760,3642104831,NL +3642104832,3642105855,US +3642105856,3642109951,NO +3642109952,3642114047,BE +3642114048,3642118143,NO +3642118144,3642122239,GB +3642122240,3642126335,ES +3642126336,3642130431,IL +3642130432,3642134527,CH +3642134528,3642138623,GB +3642138624,3642142719,RU +3642142720,3642146815,MT +3642146816,3642150911,DE +3642150912,3642163199,IT +3642163200,3642167295,NL +3642167296,3642171391,RU +3642171392,3642175487,JO +3642175488,3642179583,DE +3642179584,3642187775,RU +3642187776,3642191871,DK +3642191872,3642195967,BY +3642195968,3642204159,RU +3642204160,3642208255,IM +3642208256,3642212351,RU +3642212352,3642216447,BA +3642216448,3642220543,HU +3642220544,3642224639,GB +3642224640,3642228735,SK +3642228736,3642232831,DE +3642232832,3642236927,RS +3642236928,3642237263,CH +3642237264,3642237264,DE +3642237265,3642241023,CH +3642241024,3642245119,DE +3642245120,3642249215,LV +3642249216,3642253311,FR +3642253312,3642257407,FI +3642257408,3642261503,RU +3642261504,3642265599,BA +3642265600,3642269695,IR +3642269696,3642273791,UA +3642273792,3642277887,RU +3642277888,3642290175,DE +3642290176,3642294271,AL +3642294272,3642298367,GB +3642298368,3642302463,AZ +3642302464,3642306559,SE +3642306560,3642310655,IR +3642310656,3642314751,DE +3642314752,3642318847,RU +3642318848,3642322943,FI +3642322944,3642327039,AT +3642327040,3642331135,DE +3642331136,3642335231,RU +3642335232,3642339327,DE +3642339328,3642343423,FR +3642343424,3642347519,UA +3642347520,3642355711,RU +3642355712,3642359807,SE +3642359808,3642367999,RU +3642368000,3642376191,CH +3642376192,3642376447,XK +3642376448,3642377983,RS +3642377984,3642378047,XK +3642378048,3642379007,RS +3642379008,3642379263,XK +3642379264,3642379775,RS +3642379776,3642380063,XK +3642380064,3642380287,RS +3642380288,3642384383,IT +3642384384,3642392575,NL +3642392576,3642394623,AT +3642394624,3642396671,FR +3642396672,3642404863,MD +3642408960,3642411007,FR +3642411008,3642411519,AE +3642411520,3642413055,FR +3642413056,3642415103,RS +3642415104,3642417151,GB +3642417152,3642419199,DE +3642419200,3642421247,GB +3642421248,3642423091,DE +3642423092,3642423099,US +3642423100,3642424151,DE +3642424152,3642424215,US +3642424216,3642425087,DE +3642425088,3642425343,US +3642425344,3642429439,DE +3642429440,3642433535,GB +3642433536,3642435583,CY +3642435584,3642436607,RU +3642436608,3642441727,CY +3642441728,3642449919,IT +3642449920,3642454015,CH +3642454016,3642458111,IT +3642458112,3642462207,RU +3642462208,3642466303,UA +3642466304,3642474495,SE +3642474496,3642478591,DE +3642478592,3642482687,HU +3642482688,3642486783,NL +3642486784,3642490879,GB +3642490880,3642494975,IM +3642494976,3642499071,GB +3642499072,3642501119,SE +3642501120,3642503167,LU +3642503168,3642507263,LV +3642507264,3642509311,FR +3642509312,3642511359,RU +3642511360,3642515455,CZ +3642515456,3642519551,DE +3642519552,3642523647,IT +3642523648,3642527743,GB +3642527744,3642531839,PL +3642531840,3642535935,DK +3642535936,3642540031,IS +3642540032,3642544127,SE +3642544128,3642552319,RU +3642552320,3642553343,UA +3642553344,3642553599,RU +3642553600,3642553855,UA +3642553856,3642554367,RU +3642554368,3642554623,LT +3642554624,3642554720,UA +3642554721,3642554721,LV +3642554722,3642555103,UA +3642555104,3642555111,NL +3642555112,3642555607,UA +3642555608,3642555615,PL +3642555616,3642556415,UA +3642556416,3642560511,CZ +3642560512,3642564607,KG +3642564608,3642568703,DE +3642568704,3642572799,RU +3642572800,3642576895,IT +3642576896,3642580991,RU +3642580992,3642585087,ES +3642585088,3642589183,UZ +3642589184,3642593279,TZ +3642593280,3642597375,AT +3642597376,3642601471,IT +3642601472,3642605567,RU +3642605568,3642609663,GB +3642609664,3642613759,ZA +3642613760,3642617855,FI +3642617856,3642621951,JO +3642626048,3642630143,BE +3642630144,3642634239,DK +3642634240,3642638335,DE +3642638336,3642642431,CZ +3642642432,3642646527,DK +3642646528,3642650623,MT +3642650624,3642654719,GB +3642654720,3642662911,PL +3642662912,3642667007,UZ +3642667008,3642671103,FI +3642671104,3642675199,UA +3642675200,3642679295,BG +3642679296,3642683391,DE +3642683392,3642687487,RU +3642687488,3642691583,GB +3642691584,3642695679,DE +3642695680,3642699775,SK +3642699776,3642703871,CZ +3642703872,3642707967,LU +3642707968,3642712063,DE +3642712064,3642716159,NO +3642716160,3642720255,IT +3642720256,3642728447,GB +3642728448,3642736639,SE +3642736640,3642740735,CZ +3642740736,3642744831,DE +3642744832,3642753023,TR +3642753024,3643801599,GB +3643801600,3644063743,DE +3644063744,3644325887,EG +3644325888,3644588031,IT +3644588032,3644653567,IR +3644653568,3644655615,DE +3644655616,3644657663,IT +3644657664,3644659711,GB +3644659712,3644669951,IT +3644669952,3644678143,ES +3644678144,3644680191,FR +3644680192,3644682239,DE +3644682240,3644684287,GB +3644684288,3644686335,IT +3644686336,3644690431,ES +3644690432,3644694527,DE +3644694528,3644698623,IT +3644698624,3644702719,GB +3644702720,3644706815,DE +3644706816,3644708863,ES +3644708864,3644710911,DK +3644710912,3644711935,ES +3644711936,3644712959,GB +3644712960,3644713983,DE +3644713984,3644715007,DK +3644715008,3644716031,ES +3644716032,3644717055,SE +3644717056,3644717567,DE +3644717568,3644718079,DK +3644718080,3644718335,SI +3644718336,3644718591,NL +3644718592,3644718847,IT +3644718848,3644719103,DE +3644719104,3644809215,NL +3644809216,3644809216,FR +3644809217,3644817407,DK +3644817408,3644850175,NL +3644850176,3644854271,CZ +3644854272,3644858367,AZ +3644858368,3644862463,FI +3644862464,3644866559,FR +3644866560,3644874751,DE +3644874752,3644878847,ML +3644878848,3644879103,GB +3644879104,3644879359,IT +3644879360,3644882687,GB +3644882688,3644882943,AT +3644882944,3644887039,RU +3644887040,3644891135,IR +3644891136,3644895231,DE +3644895232,3644899327,FI +3644899328,3644903423,IT +3644903424,3644907519,TR +3644907520,3644911615,GB +3644911616,3644915711,BE +3644915712,3644919807,RU +3644919808,3644923903,DE +3644923904,3644924927,IL +3644924928,3644925183,US +3644925184,3644925439,IL +3644925440,3644925695,US +3644925696,3644926463,IL +3644926464,3644926719,US +3644926720,3644927999,IL +3644928000,3644932095,GI +3644932096,3644936191,IT +3644936192,3644940287,RU +3644940288,3644948479,HU +3644948480,3644952575,DE +3644952576,3644960767,GB +3644960768,3644964863,TR +3644964864,3644968959,RS +3644968960,3644973055,RU +3644973056,3644977151,NO +3644977152,3644981247,UA +3644981248,3644985343,BE +3644985344,3644989439,RU +3644989440,3644997631,DE +3644997632,3645005823,RU +3645005824,3645009919,UA +3645009920,3645014015,FR +3645014016,3645018111,DE +3645018112,3645022207,RU +3645022208,3645030143,CZ +3645030144,3645030399,SK +3645030400,3645038591,IR +3645038592,3645046783,PS +3645046784,3645050879,RU +3645050880,3645054975,SK +3645054976,3645059071,DE +3645059072,3645063167,GB +3645063168,3645067263,UA +3645067264,3645071359,SE +3645071360,3645075455,DE +3645075456,3645079551,RU +3645079552,3645083647,CH +3645083648,3645087743,FR +3645087744,3645091839,ES +3645091840,3645095935,RU +3645095936,3645104127,PL +3645104128,3645112319,NL +3645112320,3645116415,DE +3645116416,3645120511,GB +3645120512,3645124607,SE +3645124608,3645128703,NL +3645128704,3645132799,GB +3645132800,3645136895,HR +3645136896,3645145087,NO +3645145088,3645149183,GB +3645149184,3645161471,DE +3645161472,3645163519,AT +3645163520,3645164031,GB +3645164032,3645165567,AT +3645165568,3645169663,TR +3645169664,3645173759,CH +3645173760,3645177855,GB +3645177856,3645181951,GR +3645181952,3645183375,FR +3645183376,3645183383,SA +3645183384,3645186047,FR +3645186048,3645190143,GB +3645190144,3645194239,FI +3645194240,3645202431,DE +3645202432,3645206527,CZ +3645206528,3645210623,LV +3645210624,3645214719,RU +3645214720,3645218815,SE +3645218816,3645222911,DE +3645222912,3645227007,KW +3645227008,3645235199,RU +3645235200,3645243391,DE +3645243392,3645247487,ES +3645247488,3645251583,RU +3645251584,3645255679,SE +3645255680,3645259775,PL +3645259776,3645263871,PT +3645263872,3645267967,FR +3645267968,3645276159,RU +3645276160,3645280255,DE +3645280256,3645284351,IT +3645284352,3645288447,DE +3645288448,3645288895,FR +3645288896,3645288959,LU +3645288960,3645292543,FR +3645292544,3645296639,DE +3645296640,3645300735,NL +3645300736,3645304831,BE +3645304832,3645308927,ES +3645308928,3645313023,DK +3645313024,3645317119,ES +3645317120,3645321215,EE +3645321216,3645325311,BA +3645325312,3645329407,IT +3645329408,3645333503,CH +3645334272,3645335039,DE +3645335688,3645335691,DE +3645337600,3645341695,FR +3645341696,3645345791,RU +3645345792,3645349887,FI +3645349888,3645353983,RU +3645353984,3645358079,MT +3645358080,3645362175,ES +3645362176,3645364223,FR +3645364224,3645366271,DE +3645366272,3645370367,RU +3645370368,3645374463,CH +3645374464,3645378559,RU +3645378560,3645382655,SE +3645382656,3645386751,IT +3645386752,3645390847,SE +3645390848,3645399039,SI +3645399040,3645403135,IT +3645403136,3645407231,GB +3645407232,3645411327,DE +3645411328,3645415423,RU +3645415424,3645423615,GB +3645423616,3645431807,DE +3645431808,3645435903,BE +3645435904,3645439999,GB +3645440000,3645444095,SE +3645444096,3645448191,SK +3645448192,3645454335,DE +3645454336,3645456383,RU +3645456384,3645460479,GB +3645460480,3645464575,UA +3645464576,3645468671,SE +3645468672,3645472767,RU +3645472768,3645476863,AL +3645476864,3645480959,DE +3645480960,3645485055,RO +3645485056,3645489151,PL +3645489152,3645493247,RU +3645493248,3645501439,IT +3645501440,3645505535,PL +3645505536,3645507583,DE +3645507584,3645509631,AT +3645509632,3645511679,NL +3645511680,3645513727,TR +3645513728,3645517823,RU +3645517824,3645521919,IE +3645521920,3645526015,PL +3645526016,3645530111,SE +3645530112,3645534207,FR +3645534208,3645538303,RU +3645538304,3645546495,DK +3645546496,3645550591,RU +3645550592,3645558783,DE +3645558784,3645562879,DK +3645562880,3645563135,GB +3645563136,3645564671,LS +3645564672,3645565951,GB +3645565952,3645566975,ZW +3645566976,3645571071,RU +3645571072,3645575167,IE +3645575168,3645579263,CH +3645579264,3645583359,NL +3645583360,3645587455,PL +3645587456,3645595647,SK +3645595648,3645603839,SE +3645603840,3645612031,BG +3645612032,3645616127,GB +3645616128,3645620223,AT +3645620224,3645624319,BA +3645624320,3645628415,CZ +3645628416,3645636607,ES +3645636608,3645640703,AM +3645640704,3645644799,NL +3645644800,3645648895,RU +3645648896,3645652991,SE +3645652992,3645657087,KZ +3645657088,3645661183,SE +3645661184,3645665279,DE +3645665280,3645669375,PL +3645669376,3645669599,ES +3645669600,3645669887,PT +3645669888,3645670399,ES +3645670400,3645670427,PT +3645670428,3645670429,ES +3645670430,3645670430,PT +3645670431,3645670433,ES +3645670434,3645670436,PT +3645670437,3645670441,ES +3645670442,3645670456,PT +3645670457,3645670460,ES +3645670461,3645670467,PT +3645670468,3645670483,ES +3645670484,3645670508,PT +3645670509,3645670509,ES +3645670510,3645670527,PT +3645670528,3645670655,ES +3645670656,3645670911,PT +3645670912,3645673471,ES +3645673472,3645673535,PT +3645673536,3645674239,ES +3645674240,3645674271,PT +3645674272,3645675007,ES +3645675008,3645675519,PT +3645675520,3645675759,ES +3645675760,3645675775,PT +3645675776,3645676015,ES +3645676016,3645676031,PT +3645676032,3645676543,ES +3645676544,3645676799,PT +3645676800,3645677567,ES +3645677568,3645681663,AT +3645681664,3645685759,RU +3645685760,3645689855,UA +3645689856,3645693951,IT +3645693952,3645698047,BE +3645698048,3645702143,ES +3645702144,3645706239,GB +3645706240,3645710335,LT +3645710336,3645714431,NO +3645714432,3645718527,RU +3645718528,3645722623,GA +3645722624,3645726719,IT +3645726720,3645730815,RU +3645730816,3645734911,IR +3645734912,3645743103,NL +3645743104,3645747199,CZ +3645747200,3645751295,GB +3645751296,3645755391,FI +3645755392,3645759487,UA +3645759488,3645763583,FR +3645763584,3645763585,DE +3645763586,3645763587,IT +3645763588,3645763588,DE +3645763589,3645763589,IE +3645763590,3645763590,ES +3645763591,3645763591,BE +3645763592,3645763593,DE +3645763594,3645763594,CH +3645763595,3645763595,IT +3645763596,3645763597,DE +3645763598,3645763598,NL +3645763599,3645763600,DE +3645763601,3645763601,GR +3645763602,3645763603,FR +3645763604,3645763609,DE +3645763610,3645763610,PL +3645763611,3645763612,DE +3645763613,3645763613,HU +3645763614,3645763614,CH +3645763615,3645763615,ES +3645763616,3645763616,FR +3645763617,3645763617,DE +3645763618,3645763618,ES +3645763619,3645763619,DE +3645763620,3645763620,FR +3645763621,3645763621,CH +3645763622,3645763622,GB +3645763623,3645763623,FR +3645763624,3645763624,DE +3645763625,3645763625,FR +3645763626,3645763626,NL +3645763627,3645763627,AT +3645763628,3645763629,DE +3645763630,3645763631,NL +3645763632,3645763632,GB +3645763633,3645763633,DE +3645763634,3645763634,NL +3645763635,3645763635,DE +3645763636,3645763636,AT +3645763637,3645763637,FR +3645763638,3645763638,NL +3645763639,3645763639,DE +3645763640,3645763640,HU +3645763641,3645763641,IT +3645763642,3645763642,GB +3645763643,3645763645,DE +3645763646,3645763647,ES +3645763648,3645763648,DE +3645763649,3645763649,IL +3645763650,3645763650,DE +3645763651,3645763651,NL +3645763652,3645763653,DE +3645763654,3645763654,ES +3645763655,3645763660,DE +3645763661,3645763662,FR +3645763663,3645763663,HU +3645763664,3645763670,DE +3645763671,3645763671,FR +3645763672,3645763672,DE +3645763673,3645763673,BE +3645763674,3645763676,DE +3645763677,3645763678,HU +3645763679,3645763679,IT +3645763680,3645763683,DE +3645763684,3645763684,CH +3645763685,3645763687,DE +3645763688,3645763690,NL +3645763691,3645763691,CH +3645763692,3645763692,DE +3645763693,3645763693,NL +3645763694,3645763696,DE +3645763697,3645763697,NL +3645763698,3645763698,DE +3645763699,3645763699,BE +3645763700,3645763700,NL +3645763701,3645763701,DE +3645763702,3645763702,IT +3645763703,3645763705,DE +3645763706,3645763706,GB +3645763707,3645763707,NL +3645763708,3645763708,GR +3645763709,3645763709,NL +3645763710,3645763710,GB +3645763711,3645763713,NL +3645763714,3645763714,DE +3645763715,3645763715,NL +3645763716,3645763716,DE +3645763717,3645763717,NL +3645763718,3645763719,DE +3645763720,3645763720,IT +3645763721,3645763721,DE +3645763722,3645763722,GR +3645763723,3645763723,NL +3645763724,3645763726,IT +3645763727,3645763727,NL +3645763728,3645763728,GR +3645763729,3645763729,DE +3645763730,3645763730,IT +3645763731,3645763732,DE +3645763733,3645763733,FR +3645763734,3645763734,DE +3645763735,3645763735,GB +3645763736,3645763736,FR +3645763737,3645763737,DE +3645763738,3645763738,CH +3645763739,3645763740,ES +3645763741,3645763746,DE +3645763747,3645763747,NL +3645763748,3645763748,DE +3645763749,3645763750,NL +3645763751,3645763751,DE +3645763752,3645763752,NL +3645763753,3645763753,DE +3645763754,3645763755,NL +3645763756,3645763757,DE +3645763758,3645763758,FR +3645763759,3645763759,DE +3645763760,3645763760,NL +3645763761,3645763761,SE +3645763762,3645763762,ES +3645763763,3645763763,DE +3645763764,3645763764,NL +3645763765,3645763765,DE +3645763766,3645763766,IL +3645763767,3645763768,NL +3645763769,3645763769,FR +3645763770,3645763770,NL +3645763771,3645763771,GB +3645763772,3645763773,DE +3645763774,3645763774,NL +3645763775,3645763775,DE +3645763776,3645763776,NL +3645763777,3645763783,DE +3645763784,3645763784,NL +3645763785,3645763785,DE +3645763786,3645763786,CH +3645763787,3645763787,NL +3645763788,3645763788,IE +3645763789,3645763789,AT +3645763790,3645763790,ES +3645763791,3645763791,IT +3645763792,3645763792,FR +3645763793,3645763793,ES +3645763794,3645763794,DE +3645763795,3645763795,IT +3645763796,3645763797,DE +3645763798,3645763798,FR +3645763799,3645763801,DE +3645763802,3645763802,ES +3645763803,3645763803,NL +3645763804,3645763806,DE +3645763807,3645763807,IT +3645763808,3645763808,DE +3645763809,3645763809,IT +3645763810,3645763810,NL +3645763811,3645763813,DE +3645763814,3645763814,IT +3645763815,3645763816,DE +3645763817,3645763817,GR +3645763818,3645763818,ES +3645763819,3645763825,DE +3645763826,3645763826,IT +3645763827,3645763827,ZA +3645763828,3645763841,DE +3645763842,3645763842,CH +3645763843,3645763845,DE +3645763846,3645763846,FR +3645763847,3645763847,IT +3645763848,3645763850,DE +3645763851,3645763851,GB +3645763852,3645763852,DE +3645763853,3645763853,CH +3645763854,3645763854,NL +3645763855,3645763858,DE +3645763859,3645763859,DK +3645763860,3645763860,IT +3645763861,3645763861,DE +3645763862,3645763862,FR +3645763863,3645763864,ES +3645763865,3645763865,CH +3645763866,3645763866,DE +3645763867,3645763868,GB +3645763869,3645763869,DE +3645763870,3645763870,HU +3645763871,3645763874,DE +3645763875,3645763875,GB +3645763876,3645763876,PL +3645763877,3645763877,FR +3645763878,3645763879,DE +3645763880,3645763881,FR +3645763882,3645763882,DE +3645763883,3645763883,NL +3645763884,3645763884,IT +3645763885,3645763886,DE +3645763887,3645763887,FR +3645763888,3645763888,DE +3645763889,3645763889,GR +3645763890,3645763890,ES +3645763891,3645763894,DE +3645763895,3645763895,ES +3645763896,3645763896,DE +3645763897,3645763897,BE +3645763898,3645763898,DE +3645763899,3645763899,ES +3645763900,3645763900,NL +3645763901,3645763902,LU +3645763903,3645763903,DE +3645763904,3645763904,BE +3645763905,3645763905,RS +3645763906,3645763906,DE +3645763907,3645763908,IT +3645763909,3645763909,DE +3645763910,3645763910,ES +3645763911,3645763911,DE +3645763912,3645763912,IE +3645763913,3645763913,PT +3645763914,3645763914,DE +3645763915,3645763915,IL +3645763916,3645763916,BE +3645763917,3645763917,DE +3645763918,3645763918,IT +3645763919,3645763919,GB +3645763920,3645763920,DE +3645763921,3645763921,CH +3645763922,3645763922,ES +3645763923,3645763923,GB +3645763924,3645763924,PL +3645763925,3645763926,DE +3645763927,3645763927,HU +3645763928,3645763928,FR +3645763929,3645763929,NL +3645763930,3645763930,ES +3645763931,3645763931,FR +3645763932,3645763932,DE +3645763933,3645763933,FR +3645763934,3645763934,IT +3645763935,3645763935,FR +3645763936,3645763936,DE +3645763937,3645763937,FR +3645763938,3645763938,DE +3645763939,3645763939,NL +3645763940,3645763942,DE +3645763943,3645763943,ES +3645763944,3645763944,CH +3645763945,3645763945,DE +3645763946,3645763946,HU +3645763947,3645763949,DE +3645763950,3645763950,ES +3645763951,3645763951,DE +3645763952,3645763952,IT +3645763953,3645763953,TR +3645763954,3645763954,IT +3645763955,3645763955,FR +3645763956,3645763956,DE +3645763957,3645763957,GB +3645763958,3645763959,DE +3645763960,3645763960,IT +3645763961,3645763961,DE +3645763962,3645763962,ES +3645763963,3645763964,DE +3645763965,3645763965,AT +3645763966,3645763966,DE +3645763967,3645763967,IT +3645763968,3645763968,DE +3645763969,3645763969,ES +3645763970,3645763970,DE +3645763971,3645763971,ES +3645763972,3645763972,IT +3645763973,3645763973,DE +3645763974,3645763974,GB +3645763975,3645763975,AT +3645763976,3645763976,IT +3645763977,3645763978,DE +3645763979,3645763979,IT +3645763980,3645763981,DE +3645763982,3645763982,IT +3645763983,3645763984,FR +3645763985,3645763985,NL +3645763986,3645763986,DE +3645763987,3645763987,PL +3645763988,3645763988,CH +3645763989,3645763989,FR +3645763990,3645763993,DE +3645763994,3645763994,IT +3645763995,3645763995,ES +3645763996,3645764000,DE +3645764001,3645764001,IT +3645764002,3645764009,DE +3645764010,3645764010,FR +3645764011,3645764012,DE +3645764013,3645764013,HU +3645764014,3645764015,GB +3645764016,3645764016,IT +3645764017,3645764017,GB +3645764018,3645764019,DE +3645764020,3645764020,IT +3645764021,3645764021,DE +3645764022,3645764022,ES +3645764023,3645764023,FR +3645764024,3645764025,ES +3645764026,3645764028,DE +3645764029,3645764029,ES +3645764030,3645764030,DE +3645764031,3645764031,NL +3645764032,3645764032,FR +3645764033,3645764034,DE +3645764035,3645764035,IT +3645764036,3645764037,ES +3645764038,3645764038,IT +3645764039,3645764039,HU +3645764040,3645764040,ES +3645764041,3645764041,DE +3645764042,3645764042,CH +3645764043,3645764043,DE +3645764044,3645764044,ES +3645764045,3645764045,AE +3645764046,3645764048,DE +3645764049,3645764049,ES +3645764050,3645764051,DE +3645764052,3645764052,FR +3645764053,3645764055,DE +3645764056,3645764056,BE +3645764057,3645764059,DE +3645764060,3645764060,FR +3645764061,3645764061,IT +3645764062,3645764062,SE +3645764063,3645764063,AT +3645764064,3645764064,SI +3645764065,3645764065,DE +3645764066,3645764066,IT +3645764067,3645764067,DE +3645764068,3645764068,IT +3645764069,3645764069,CH +3645764070,3645764070,GB +3645764071,3645764074,DE +3645764075,3645764075,SE +3645764076,3645764076,GR +3645764077,3645764078,DE +3645764079,3645764079,ES +3645764080,3645764080,DE +3645764081,3645764081,GB +3645764082,3645764084,DE +3645764085,3645764085,IE +3645764086,3645764086,IT +3645764087,3645764087,CH +3645764088,3645764091,DE +3645764092,3645764092,FR +3645764093,3645764097,DE +3645764098,3645764098,IT +3645764099,3645764099,DE +3645764100,3645764100,BE +3645764101,3645764102,DE +3645764103,3645764103,SK +3645764104,3645764105,IT +3645764106,3645764106,NL +3645764107,3645764107,GR +3645764108,3645764108,DE +3645764109,3645764109,CH +3645764110,3645764110,DK +3645764111,3645764111,DE +3645764112,3645764112,IT +3645764113,3645764113,ES +3645764114,3645764115,DE +3645764116,3645764116,GR +3645764117,3645764117,DE +3645764118,3645764118,GB +3645764119,3645764119,CH +3645764120,3645764120,FR +3645764121,3645764121,IT +3645764122,3645764122,DE +3645764123,3645764123,PL +3645764124,3645764124,DE +3645764125,3645764125,NO +3645764126,3645764126,LU +3645764127,3645764128,DE +3645764129,3645764129,HR +3645764130,3645764130,FR +3645764131,3645764131,DE +3645764132,3645764132,ES +3645764133,3645764133,CY +3645764134,3645764135,DE +3645764136,3645764136,BE +3645764137,3645764137,DE +3645764138,3645764138,CH +3645764139,3645764140,DE +3645764141,3645764141,ES +3645764142,3645764142,HU +3645764143,3645764145,DE +3645764146,3645764147,NL +3645764148,3645764148,DK +3645764149,3645764154,DE +3645764155,3645764155,ES +3645764156,3645764158,DE +3645764159,3645764159,IT +3645764160,3645764160,BE +3645764161,3645764161,ES +3645764162,3645764162,DE +3645764163,3645764163,NL +3645764164,3645764165,DE +3645764166,3645764166,HU +3645764167,3645764167,DE +3645764168,3645764168,ES +3645764169,3645764169,GR +3645764170,3645764170,IT +3645764171,3645764172,DE +3645764173,3645764173,IT +3645764174,3645764174,DE +3645764175,3645764175,PL +3645764176,3645764176,DE +3645764177,3645764177,GB +3645764178,3645764178,DE +3645764179,3645764179,GR +3645764180,3645764181,DE +3645764182,3645764182,FR +3645764183,3645764184,DE +3645764185,3645764185,IT +3645764186,3645764186,FR +3645764187,3645764187,BE +3645764188,3645764188,GB +3645764189,3645764189,DE +3645764190,3645764190,IT +3645764191,3645764191,GB +3645764192,3645764193,DE +3645764194,3645764194,ES +3645764195,3645764195,DE +3645764196,3645764196,IT +3645764197,3645764197,DE +3645764198,3645764198,GR +3645764199,3645764199,DE +3645764200,3645764200,IT +3645764201,3645764201,BE +3645764202,3645764202,IT +3645764203,3645764203,DE +3645764204,3645764204,ES +3645764205,3645764207,DE +3645764208,3645764208,NO +3645764209,3645764210,DE +3645764211,3645764211,FR +3645764212,3645764212,NL +3645764213,3645764213,DE +3645764214,3645764214,NL +3645764215,3645764216,DE +3645764217,3645764217,IT +3645764218,3645764218,CH +3645764219,3645764219,DE +3645764220,3645764220,NL +3645764221,3645764221,IT +3645764222,3645764222,BE +3645764223,3645764223,DE +3645764224,3645764224,ES +3645764225,3645764225,GB +3645764226,3645764226,DE +3645764227,3645764227,CH +3645764228,3645764228,FR +3645764229,3645764229,PL +3645764230,3645764230,NL +3645764231,3645764231,CH +3645764232,3645764235,DE +3645764236,3645764236,IT +3645764237,3645764238,DE +3645764239,3645764240,ES +3645764241,3645764241,DE +3645764242,3645764242,AT +3645764243,3645764243,GR +3645764244,3645764244,FR +3645764245,3645764246,NL +3645764247,3645764247,IT +3645764248,3645764251,DE +3645764252,3645764253,ES +3645764254,3645764254,DE +3645764255,3645764255,CH +3645764256,3645764257,DE +3645764258,3645764258,NL +3645764259,3645764259,IT +3645764260,3645764260,DE +3645764261,3645764261,GB +3645764262,3645764262,BE +3645764263,3645764264,IT +3645764265,3645764265,TR +3645764266,3645764270,DE +3645764271,3645764271,IT +3645764272,3645764272,DE +3645764273,3645764273,IT +3645764274,3645764277,DE +3645764278,3645764278,NL +3645764279,3645764279,ES +3645764280,3645764280,IT +3645764281,3645764281,DE +3645764282,3645764282,NL +3645764283,3645764283,DE +3645764284,3645764284,FR +3645764285,3645764285,IT +3645764286,3645764286,DE +3645764287,3645764287,BE +3645764288,3645764288,FR +3645764289,3645764289,NL +3645764290,3645764290,DE +3645764291,3645764291,NL +3645764292,3645764292,FR +3645764293,3645764293,IT +3645764294,3645764294,DE +3645764295,3645764295,ES +3645764296,3645764297,DE +3645764298,3645764298,GR +3645764299,3645764299,DE +3645764300,3645764300,PL +3645764301,3645764301,GR +3645764302,3645764304,DE +3645764305,3645764305,GB +3645764306,3645764306,BM +3645764307,3645764307,NL +3645764308,3645764309,DE +3645764310,3645764310,ZA +3645764311,3645764311,DE +3645764312,3645764313,ES +3645764314,3645764316,DE +3645764317,3645764317,ES +3645764318,3645764318,HU +3645764319,3645764319,FR +3645764320,3645764320,IT +3645764321,3645764321,DE +3645764322,3645764322,CH +3645764323,3645764323,DE +3645764324,3645764324,FR +3645764325,3645764326,DE +3645764327,3645764327,DK +3645764328,3645764328,CH +3645764329,3645764329,ES +3645764330,3645764330,DE +3645764331,3645764331,RU +3645764332,3645764332,NL +3645764333,3645764336,DE +3645764337,3645764337,HU +3645764338,3645764338,NL +3645764339,3645764340,DE +3645764341,3645764341,IE +3645764342,3645764342,IT +3645764343,3645764343,ES +3645764344,3645764345,DE +3645764346,3645764346,IT +3645764347,3645764347,IE +3645764348,3645764348,NL +3645764349,3645764349,BE +3645764350,3645764350,IT +3645764351,3645764357,DE +3645764358,3645764358,FR +3645764359,3645764360,DE +3645764361,3645764361,CH +3645764362,3645764362,DE +3645764363,3645764363,NL +3645764364,3645764364,DE +3645764365,3645764365,BE +3645764366,3645764367,DE +3645764368,3645764368,IT +3645764369,3645764369,DE +3645764370,3645764370,GB +3645764371,3645764371,ES +3645764372,3645764372,FR +3645764373,3645764375,DE +3645764376,3645764377,NL +3645764378,3645764378,DE +3645764379,3645764380,GB +3645764381,3645764381,DE +3645764382,3645764382,NL +3645764383,3645764383,DE +3645764384,3645764384,AT +3645764385,3645764388,DE +3645764389,3645764389,NL +3645764390,3645764390,DE +3645764391,3645764391,NL +3645764392,3645764392,GR +3645764393,3645764393,DE +3645764394,3645764394,FR +3645764395,3645764396,NL +3645764397,3645764397,DE +3645764398,3645764398,NL +3645764399,3645764399,DE +3645764400,3645764401,NL +3645764402,3645764403,FR +3645764404,3645764404,NL +3645764405,3645764410,DE +3645764411,3645764411,FR +3645764412,3645764412,DE +3645764413,3645764413,FR +3645764414,3645764415,DE +3645764416,3645764417,NL +3645764418,3645764418,DE +3645764419,3645764419,NL +3645764420,3645764420,GB +3645764421,3645764421,DE +3645764422,3645764422,IT +3645764423,3645764423,HU +3645764424,3645764424,DE +3645764425,3645764425,GB +3645764426,3645764433,DE +3645764434,3645764434,NL +3645764435,3645764435,AT +3645764436,3645764436,DE +3645764437,3645764437,FR +3645764438,3645764439,DE +3645764440,3645764440,CH +3645764441,3645764441,DE +3645764442,3645764442,IT +3645764443,3645764456,DE +3645764457,3645764457,IT +3645764458,3645764458,DE +3645764459,3645764459,IT +3645764460,3645764462,DE +3645764463,3645764463,NL +3645764464,3645764467,DE +3645764468,3645764468,IT +3645764469,3645764470,DE +3645764471,3645764471,IT +3645764472,3645764472,GR +3645764473,3645764473,NL +3645764474,3645764476,DE +3645764477,3645764477,NL +3645764478,3645764479,DE +3645764480,3645764481,NL +3645764482,3645764482,DE +3645764483,3645764483,NL +3645764484,3645764484,DE +3645764485,3645764485,NL +3645764486,3645764487,DE +3645764488,3645764490,NL +3645764491,3645764491,DE +3645764492,3645764492,NL +3645764493,3645764493,ES +3645764494,3645764494,FR +3645764495,3645764495,NL +3645764496,3645764496,DE +3645764497,3645764497,NL +3645764498,3645764498,FR +3645764499,3645764500,NL +3645764501,3645764501,DE +3645764502,3645764503,NL +3645764504,3645764504,DE +3645764505,3645764505,NL +3645764506,3645764506,DE +3645764507,3645764507,ES +3645764508,3645764508,IT +3645764509,3645764510,DE +3645764511,3645764511,NL +3645764512,3645764512,DE +3645764513,3645764513,NL +3645764514,3645764514,ES +3645764515,3645764515,DE +3645764516,3645764516,NL +3645764517,3645764519,DE +3645764520,3645764522,NL +3645764523,3645764524,DE +3645764525,3645764531,NL +3645764532,3645764533,DE +3645764534,3645764535,NL +3645764536,3645764536,IT +3645764537,3645764538,DE +3645764539,3645764539,NL +3645764540,3645764540,DE +3645764541,3645764541,IT +3645764542,3645764549,NL +3645764550,3645764550,DE +3645764551,3645764551,GR +3645764552,3645764553,DE +3645764554,3645764554,NL +3645764555,3645764555,DE +3645764556,3645764556,CH +3645764557,3645764557,NL +3645764558,3645764561,DE +3645764562,3645764562,FR +3645764563,3645764563,ES +3645764564,3645764565,NL +3645764566,3645764567,DE +3645764568,3645764568,NL +3645764569,3645764569,DE +3645764570,3645764570,MA +3645764571,3645765135,DE +3645765136,3645765139,BE +3645765140,3645765143,IT +3645765144,3645765147,DE +3645765148,3645765151,IT +3645765152,3645765155,BE +3645765156,3645765167,IT +3645765168,3645765171,DE +3645765172,3645765175,NO +3645765176,3645765179,DE +3645765180,3645765183,FR +3645765184,3645765187,GR +3645765188,3645765195,DE +3645765196,3645765199,CH +3645765200,3645765215,DE +3645765216,3645765219,ES +3645765220,3645765223,PL +3645765224,3645765227,BE +3645765228,3645765231,GB +3645765232,3645765235,IT +3645765236,3645765239,DE +3645765240,3645765243,GB +3645765244,3645765247,IT +3645765248,3645765251,ES +3645765252,3645765255,DE +3645765256,3645765259,GR +3645765260,3645765263,PL +3645765264,3645765267,DE +3645765268,3645765271,PL +3645765272,3645765275,IT +3645765276,3645765283,DE +3645765284,3645765287,ES +3645765288,3645765295,DE +3645765296,3645765299,ES +3645765300,3645765307,DE +3645765308,3645765311,IT +3645765312,3645765315,TR +3645765316,3645765319,IT +3645765320,3645765323,DE +3645765324,3645765331,ES +3645765332,3645765335,DE +3645765336,3645765339,IT +3645765340,3645765343,FR +3645765344,3645765347,DE +3645765348,3645765351,GR +3645765352,3645765359,DE +3645765360,3645765363,FR +3645765364,3645765367,ES +3645765368,3645765371,IT +3645765372,3645765375,CH +3645765376,3645765379,DE +3645765380,3645765383,BM +3645765384,3645765387,NL +3645765388,3645765391,DE +3645765392,3645765399,ES +3645765400,3645765407,DE +3645765408,3645765411,DK +3645765412,3645765415,IT +3645765416,3645765419,FR +3645765420,3645765423,DE +3645765424,3645765427,IT +3645765428,3645765447,DE +3645765448,3645765451,ES +3645765452,3645765455,FR +3645765456,3645765459,AT +3645765460,3645765463,FR +3645765464,3645765467,GB +3645765468,3645765471,DE +3645765472,3645765475,NL +3645765476,3645765487,DE +3645765488,3645765491,HU +3645765492,3645765495,DE +3645765496,3645765499,GB +3645765500,3645765503,NL +3645765504,3645765507,DE +3645765508,3645765511,IT +3645765512,3645765515,GB +3645765516,3645765523,DE +3645765524,3645765527,IT +3645765528,3645765535,FR +3645765536,3645765539,SE +3645765540,3645765543,IL +3645765544,3645765559,DE +3645765560,3645765563,IE +3645765564,3645765567,ES +3645765568,3645765571,FR +3645765572,3645765575,DE +3645765576,3645765579,IT +3645765580,3645765591,DE +3645765592,3645765595,IE +3645765596,3645765619,DE +3645765620,3645765623,CH +3645765624,3645765639,DE +3645765640,3645765643,DK +3645765644,3645765647,GB +3645765648,3645765651,NL +3645765652,3645765671,DE +3645765672,3645765675,FR +3645765676,3645765679,DE +3645765680,3645765683,FR +3645765684,3645765687,DE +3645765688,3645765691,FR +3645765692,3645765695,CH +3645765696,3645765703,IT +3645765704,3645765715,DE +3645765716,3645765719,FR +3645765720,3645766401,DE +3645766402,3645766407,US +3645766408,3645767187,DE +3645767188,3645767188,US +3645767189,3645767193,DE +3645767194,3645767194,US +3645767195,3645767195,DE +3645767196,3645767196,US +3645767197,3645767197,DE +3645767198,3645767198,US +3645767199,3645767208,DE +3645767209,3645767209,US +3645767210,3645767222,DE +3645767223,3645767223,US +3645767224,3645767240,DE +3645767241,3645767241,US +3645767242,3645767426,DE +3645767427,3645767427,US +3645767428,3645767428,DE +3645767429,3645767429,US +3645767430,3645767431,DE +3645767432,3645767433,US +3645767434,3645767434,CA +3645767435,3645767435,DE +3645767436,3645767448,US +3645767449,3645767449,DE +3645767450,3645767450,US +3645767451,3645767451,DE +3645767452,3645767455,US +3645767456,3645767502,DE +3645767503,3645767503,US +3645767504,3645767679,DE +3645767680,3645771775,IE +3645771776,3645779967,SE +3645779968,3645784063,PS +3645784064,3645788159,DJ +3645788160,3645792255,GB +3645792256,3645796351,TR +3645796352,3645800447,CH +3645800448,3645804543,DE +3645804544,3645808639,GB +3645808640,3645812735,DE +3645812736,3645816831,RU +3645816832,3645825023,FI +3645825024,3645829119,RU +3645829120,3645833215,NL +3645833216,3645841407,RU +3645841408,3645845503,BG +3645845504,3645849599,RU +3645849600,3645857791,BG +3645857792,3645865983,GB +3645865984,3645870079,HU +3645870080,3645874175,PL +3645874176,3645878271,GB +3645878272,3645882367,DE +3645882368,3645886463,CH +3645886464,3645890559,DE +3645890560,3645894655,RU +3645894656,3645898751,NL +3645898752,3646243420,DE +3646243421,3646243421,US +3646243422,3646947327,DE +3646947328,3647209471,PL +3647209472,3647602687,NL +3647602688,3647733759,RU +3647733760,3647864831,FR +3647864832,3647916799,DE +3647916800,3647917055,SE +3647917056,3647947727,DE +3647947728,3647947735,GB +3647947736,3647964159,DE +3647964160,3647964287,ES +3647964288,3647964503,DE +3647964504,3647964511,ES +3647964512,3647964519,DE +3647964520,3647964527,ES +3647964528,3647964559,DE +3647964560,3647964567,ES +3647964568,3647964591,DE +3647964592,3647964599,ES +3647964600,3647964607,DE +3647964608,3647964615,ES +3647964616,3647964623,DE +3647964624,3647964639,ES +3647964640,3647965255,DE +3647965256,3647965263,ES +3647965264,3647965695,DE +3647965696,3647965951,CH +3647965952,3647966207,DE +3647966208,3647967231,GB +3647967232,3647967759,DE +3647967760,3647967775,BE +3647967776,3647968255,DE +3647968256,3647969279,FR +3647969280,3647969327,DE +3647969328,3647969335,IT +3647969336,3647970303,DE +3647970304,3647971327,FR +3647971328,3647972351,GB +3647972352,3647973375,IT +3647973376,3647973399,DE +3647973400,3647973407,IT +3647973408,3647973615,DE +3647973616,3647973623,IT +3647973624,3647973711,DE +3647973712,3647973719,IT +3647973720,3647974007,DE +3647974008,3647974015,IT +3647974016,3647974055,DE +3647974056,3647974063,IT +3647974064,3647974071,DE +3647974072,3647974079,IT +3647974080,3647975255,DE +3647975256,3647975263,ES +3647975264,3647975423,DE +3647975424,3647976447,ES +3647976448,3647977471,DE +3647977472,3647978495,GB +3647978496,3647978511,NL +3647978512,3647978515,DE +3647978516,3647979007,NL +3647979008,3647979071,IT +3647979072,3647980223,DE +3647980224,3647980239,FR +3647980240,3647980383,DE +3647980384,3647980415,FR +3647980416,3647980543,DE +3647980544,3647981567,GB +3647981568,3647982591,BE +3647982592,3647984031,DE +3647984032,3647984047,NL +3647984048,3647986431,DE +3647986432,3647986687,ES +3647986688,3647987647,DE +3647987648,3647987655,ES +3647987656,3647987695,DE +3647987696,3647987711,ES +3647987712,3647988735,IT +3647988736,3647988999,DE +3647989000,3647989007,BE +3647989008,3647995903,DE +3647995904,3648004095,RU +3648004096,3648004837,GB +3648004838,3648004838,RU +3648004839,3648007167,GB +3648007168,3648007679,US +3648007680,3648007935,RU +3648007936,3648008191,GB +3648008192,3648016383,FR +3648016384,3648020479,GB +3648020480,3648024575,IT +3648024576,3648028671,NL +3648028672,3648032767,HU +3648032768,3648036863,IE +3648036864,3648040959,CZ +3648040960,3648045055,BE +3648045056,3648049151,FI +3648049152,3648053247,UA +3648053248,3648057343,FR +3648057344,3648061439,FI +3648061440,3648069631,AM +3648069632,3648073727,DE +3648073728,3648077823,HU +3648077824,3648078527,BE +3648078528,3648078591,BF +3648078592,3648079103,BE +3648079104,3648079359,CG +3648079360,3648080511,BE +3648080512,3648080543,BF +3648080544,3648080639,BE +3648080640,3648080895,GA +3648080896,3648081023,ZM +3648081024,3648081055,GA +3648081056,3648081151,ZM +3648081152,3648081407,BE +3648081408,3648081663,CG +3648081664,3648082239,BE +3648082240,3648082311,NE +3648082312,3648082431,BE +3648082432,3648082479,ZM +3648082480,3648084223,BE +3648084224,3648084479,CD +3648084480,3648084991,BE +3648084992,3648086015,GB +3648086016,3648090111,AT +3648090112,3648094207,RU +3648094208,3648102399,PL +3648102400,3648106495,GB +3648106496,3648110591,DE +3648110592,3648114687,FR +3648114688,3648118783,IT +3648118784,3648122879,PL +3648122880,3648126975,ES +3648126976,3648139263,RU +3648139264,3648143359,GB +3648143360,3648147455,DE +3648147456,3648151551,SE +3648151552,3648155647,NL +3648155648,3648159743,CH +3648159744,3648163839,ES +3648163840,3648167935,RU +3648167936,3648168191,GB +3648168192,3648168447,IE +3648168448,3648171679,GB +3648171680,3648171695,IE +3648171696,3648172031,GB +3648172032,3648176127,RU +3648176128,3648178175,DE +3648178176,3648180223,FR +3648180224,3648184319,DE +3648184320,3648192511,RU +3648192512,3648196607,DE +3648196608,3648200703,IT +3648200704,3648208895,SE +3648208896,3648212991,DE +3648212992,3648217087,RU +3648217088,3648221183,UA +3648221184,3648225279,IE +3648225280,3648233471,DE +3648233472,3648237567,FR +3648237568,3648241663,RU +3648241664,3648245759,NL +3648245760,3648249855,RO +3648249856,3648253951,NL +3648253952,3648258047,CZ +3648258048,3648266239,ES +3648266240,3648270335,HU +3648270336,3648274431,RU +3648274432,3648278527,AT +3648278528,3648282623,NO +3648282624,3648286719,PL +3648286720,3648290815,DE +3648290816,3648299007,RU +3648299008,3648303103,FI +3648303104,3648307199,AT +3648307200,3648311295,TR +3648311296,3648323583,DK +3648323584,3648327679,NG +3648327680,3648331775,LT +3648331776,3648339967,BE +3648339968,3648344063,UA +3648344064,3648348159,RU +3648348160,3648352255,DE +3648352256,3648356351,RU +3648356352,3648360447,PL +3648360448,3648364543,FR +3648364544,3648368639,CH +3648368640,3648372735,RU +3648372736,3648376831,LU +3648376832,3648380927,CZ +3648380928,3648385023,NL +3648385024,3648389119,RU +3648389120,3648393215,IT +3648393216,3648397311,DE +3648397312,3648405503,NO +3648405504,3648413695,RU +3648413696,3648417791,SK +3648417792,3648419903,GB +3648419904,3648419935,BE +3648419936,3648425983,GB +3648425984,3648430079,IT +3648430080,3648434175,NL +3648434176,3648438271,RU +3648438272,3648442367,CH +3648442368,3648446463,SE +3648446464,3648450559,FR +3648450560,3648454655,IT +3648454656,3648458751,NL +3648458752,3648462847,RU +3648462848,3648466943,FI +3648466944,3648471039,DE +3648471040,3648475135,PL +3648475136,3648479231,RU +3648479232,3648483327,CH +3648483328,3648487423,SK +3648487424,3648491519,FR +3648491520,3648495615,CH +3648495616,3648499711,SE +3648499712,3648503807,FR +3648503808,3648511999,DE +3648512000,3648516095,NL +3648516096,3648519167,RS +3648519168,3648520191,MK +3648520192,3648745820,NL +3648745821,3648745821,US +3648745822,3648747227,NL +3648747228,3648747228,US +3648747229,3648747229,NL +3648747230,3648747230,US +3648747231,3648749003,NL +3648749004,3648749004,US +3648749005,3648782335,NL +3648782336,3649044479,ES +3649044480,3649110015,FR +3649110016,3649175551,PT +3649175552,3649241087,ES +3649241088,3649306623,TR +3649306624,3649372159,IL +3649372160,3649437695,IT +3649437696,3649470463,GB +3649470464,3649471487,SG +3649471488,3649472511,HK +3649472512,3649512191,GB +3649512192,3649512447,FR +3649512448,3649568767,GB +3649568768,3649634303,BE +3649634304,3649765375,GB +3649765376,3649830911,EG +3649830912,3649835007,NL +3649835008,3649837055,ES +3649837056,3649839103,NL +3649839104,3649840127,GB +3649840128,3649841151,NL +3649841152,3649843199,GB +3649843200,3649847817,NL +3649847818,3649848004,DE +3649848005,3649848005,NL +3649848006,3649848010,DE +3649848011,3649848011,PL +3649848012,3649848012,HR +3649848013,3649848014,DE +3649848015,3649848015,HU +3649848016,3649848016,PL +3649848017,3649848028,DE +3649848029,3649848031,NL +3649848032,3649855487,DE +3649855488,3649857791,GB +3649857792,3649858047,IN +3649858048,3649859071,GB +3649859072,3649859583,US +3649859584,3649863679,SE +3649863680,3649896447,FI +3649896448,3649961983,IT +3649961984,3650093055,SE +3650093056,3650097151,JO +3650097152,3650101247,SK +3650101248,3650105343,DE +3650105344,3650109439,HU +3650109440,3650113535,NO +3650113536,3650117631,GB +3650117632,3650121727,RU +3650121728,3650125823,FR +3650125824,3650129919,DE +3650129920,3650134015,GB +3650134016,3650142207,RU +3650142208,3650150399,PL +3650150400,3650158591,NO +3650158592,3650162687,MT +3650162688,3650166783,RU +3650166784,3650170879,BE +3650170880,3650174975,DK +3650174976,3650179071,GB +3650179072,3650183167,BG +3650183168,3650187263,DE +3650187264,3650195455,GB +3650195456,3650199551,RU +3650199552,3650203647,BG +3650203648,3650207743,ES +3650207744,3650211839,SK +3650211840,3650215935,LV +3650220032,3650224127,SA +3650224128,3650224383,TH +3650224384,3650224639,ES +3650224640,3650224895,UA +3650224896,3650225151,FR +3650225152,3650225407,HU +3650225408,3650225663,BR +3650225664,3650226175,TR +3650226176,3650226431,RS +3650226432,3650226687,SG +3650226688,3650227455,IN +3650227456,3650227711,PL +3650227712,3650227967,PT +3650227968,3650228223,AR +3650228224,3650228479,HK +3650228480,3650229247,AT +3650229248,3650229503,DE +3650229504,3650229759,LU +3650229760,3650230527,DE +3650230528,3650231295,AT +3650231296,3650231551,AR +3650231552,3650231807,GB +3650231808,3650231967,DE +3650231968,3650231999,AT +3650232000,3650232063,DE +3650232064,3650232319,SE +3650232320,3650233343,RU +3650233344,3650233599,CY +3650233600,3650236415,RU +3650236416,3650240511,GB +3650240512,3650244607,EE +3650244608,3650256895,GB +3650256896,3650265087,DE +3650265088,3650269183,CH +3650269184,3650273279,GB +3650273280,3650277375,IT +3650277376,3650281471,IR +3650281472,3650285567,FR +3650285568,3650289663,UA +3650293760,3650297855,RU +3650297856,3650301951,LT +3650301952,3650306047,DE +3650306048,3650314239,GB +3650314240,3650318335,DE +3650318336,3650322431,GI +3650322432,3650330623,IT +3650330624,3650333695,UA +3650333696,3650333951,PL +3650333952,3650334719,UA +3650334720,3650336767,DE +3650336768,3650338815,US +3650338816,3650342911,FR +3650342912,3650347007,CH +3650347008,3650351103,GE +3650351104,3650352264,GB +3650352265,3650352265,DE +3650352266,3650355199,GB +3650355200,3650359295,CH +3650359296,3650363391,NL +3650363392,3650367487,GB +3650367488,3650371583,RU +3650371584,3650375679,ES +3650375680,3650379775,NL +3650379776,3650381823,DE +3650381824,3650387967,IT +3650392064,3650396159,NO +3650396160,3650404351,NL +3650404352,3650412543,RU +3650412544,3650416639,DE +3650416640,3650420735,IE +3650420736,3650424831,ES +3650424832,3650428927,RU +3650428928,3650433023,NL +3650433024,3650437119,FI +3650437120,3650441215,NL +3650441216,3650445311,IT +3650445312,3650449407,GB +3650449408,3650453503,NO +3650453504,3650457599,NL +3650457600,3650461695,ES +3650461696,3650465791,AT +3650465792,3650469887,RU +3650469888,3650478079,NL +3650478080,3650482175,AT +3650482176,3650486271,PL +3650486272,3650502655,RU +3650502656,3650504703,SE +3650504704,3650506751,RU +3650506752,3650508799,LB +3650508800,3650510847,NL +3650510848,3650519039,GB +3650519040,3650523135,HU +3650523136,3650527231,DE +3650527232,3650535423,SE +3650535424,3650539519,RU +3650539520,3650543615,ES +3650543616,3650551807,CH +3650551808,3650555903,FR +3650555904,3650559999,RU +3650560000,3650564095,GB +3650564096,3650568191,SE +3650568192,3650572287,RU +3650572288,3650575103,DE +3650575104,3650575167,AT +3650575168,3650576383,DE +3650576384,3650576623,GB +3650576624,3650576631,SE +3650576632,3650576639,NO +3650576640,3650580479,GB +3650580480,3650584575,CH +3650584576,3650588671,RU +3650588672,3650592767,DE +3650592768,3650600959,IS +3650600960,3650605055,SE +3650605056,3650610175,DE +3650610176,3650613247,RU +3650613248,3650616319,DE +3650616320,3650616320,RU +3650616321,3650616575,DE +3650616576,3650616576,PL +3650616577,3650617343,DE +3650617344,3650682879,FI +3650682880,3650748415,PL +3650748416,3650879487,GB +3650879488,3650912255,RO +3650912256,3650916393,GB +3650916394,3650916394,FR +3650916395,3650920895,GB +3650920896,3650920927,GR +3650920928,3650921087,GB +3650921088,3650921215,GR +3650921216,3650921389,GB +3650921390,3650921390,IL +3650921391,3650922799,GB +3650922800,3650922815,FR +3650922816,3650926591,GB +3650926592,3650929663,ES +3650929664,3650929831,GB +3650929832,3650929839,DK +3650929840,3650929847,BE +3650929848,3650929855,FR +3650929856,3650929863,DE +3650929864,3650929871,JE +3650929872,3650929879,NL +3650929880,3650929887,IT +3650929888,3650929895,LU +3650929896,3650929903,ES +3650929904,3650929911,SE +3650929912,3650929919,CH +3650929920,3650932881,GB +3650932882,3650932882,DE +3650932883,3650932943,GB +3650932944,3650932975,IT +3650932976,3650936319,GB +3650936320,3650936455,FR +3650936456,3650936456,GB +3650936457,3650936575,FR +3650936576,3650939607,GB +3650939608,3650939615,TR +3650939616,3650945023,GB +3650945024,3651010559,DK +3651010560,3651076095,GB +3651076096,3651108863,DE +3651108864,3651141631,EE +3651141632,3651152895,DE +3651152896,3651153919,GB +3651153920,3651188991,DE +3651188992,3651190015,ES +3651190016,3651192319,DE +3651192320,3651193343,GB +3651193344,3651207167,DE +3651207168,3651207199,GB +3651207224,3651207295,GB +3651207424,3651207615,GB +3651207648,3651208959,GB +3651209216,3651209231,US +3651209232,3651209239,GB +3651209240,3651209243,DE +3651209472,3651210751,GB +3651211264,3651211775,IR +3651213824,3651214207,US +3651215360,3651215395,GB +3651215616,3651215871,GB +3651217408,3651217535,GI +3651219456,3651219967,US +3651220384,3651220415,GB +3651220432,3651220479,GB +3651221504,3651221695,GB +3651223552,3651223567,GB +3651223584,3651223607,GB +3651223648,3651223663,ES +3651227136,3651227391,GB +3651230720,3651231743,MU +3651232256,3651232287,GB +3651232320,3651232383,GB +3651232448,3651232511,GB +3651237376,3651237631,SC +3651239936,3651272703,GB +3651272704,3651338239,CH +3651338240,3651352575,GB +3651352576,3651353599,FR +3651353600,3651403775,GB +3651403776,3651534847,AE +3651534848,3651600383,NL +3651600384,3651665919,FR +3651665920,3651670015,ES +3651670016,3651674111,GB +3651674112,3651682303,CH +3651682304,3651686399,RU +3651686400,3651690495,NO +3651690496,3651694591,FR +3651694592,3651696639,PT +3651696640,3651698687,BE +3651698688,3651702783,PL +3651702784,3651706879,GB +3651706880,3651710975,MT +3651710976,3651715071,AZ +3651715072,3651719167,PL +3651719168,3651723263,CZ +3651723264,3651727359,IT +3651727360,3651729407,RU +3651729408,3651747839,GB +3651747840,3651751935,FI +3651751936,3651756031,RU +3651756032,3651764223,IT +3651764224,3651772415,CH +3651772416,3651776511,GB +3651776512,3651780607,CZ +3651780608,3651784703,TR +3651784704,3651788799,RS +3651788800,3651792895,NL +3651792896,3651796991,FR +3651796992,3651813375,NL +3651813376,3651821567,RU +3651821568,3651825663,CZ +3651825664,3651829759,RU +3651829760,3651833855,NO +3651833856,3651837951,ML +3651837952,3651842047,PL +3651842048,3651846143,DE +3651846144,3651850239,NO +3651850240,3651854335,RU +3651854336,3651858431,IT +3651858432,3651862527,IR +3651862528,3651866623,RU +3651866624,3651870719,FR +3651870720,3651874815,IT +3651874816,3651878911,PL +3651878912,3651883007,IT +3651883008,3651884543,CD +3651884544,3651884799,BE +3651884800,3651885311,CD +3651885312,3651885839,BE +3651885840,3651885843,CD +3651885844,3651887103,BE +3651887104,3651891199,GB +3651891200,3651895295,DE +3651895296,3651899391,GB +3651899392,3651899647,RU +3651899648,3651899903,IR +3651899904,3651900415,RU +3651900416,3651901439,IR +3651901440,3651903487,RU +3651903488,3651907583,IT +3651907584,3651911679,DE +3651911680,3651915775,NO +3651915776,3651919871,IS +3651919872,3651921919,NL +3651921920,3651923967,IT +3651923968,3651928063,DE +3651928064,3651932159,IT +3651932160,3651936255,RU +3651936256,3651944447,DE +3651944448,3651948543,ES +3651948544,3651952639,FO +3651952640,3651954175,AE +3651954176,3651960831,IR +3651960832,3651964927,GB +3651964928,3651969023,SK +3651969024,3651977215,DE +3651977216,3651985407,IT +3651985408,3651997695,PL +3651997696,3652001791,RU +3652001792,3652005887,HU +3652005888,3652009983,GB +3652009984,3652014079,RU +3652014080,3652018175,SA +3652018176,3652022271,IE +3652022272,3652026367,ES +3652026368,3652032767,DE +3652032768,3652033791,NL +3652033792,3652034559,DE +3652034560,3652046847,PL +3652046848,3652050943,IE +3652050944,3652055039,LI +3652055040,3652059135,NO +3652059136,3652063231,RU +3652063232,3652067327,IR +3652067328,3652071423,TR +3652071424,3652075519,BG +3652075520,3652083711,SE +3652083712,3652087807,RU +3652087808,3652095999,IT +3652096000,3652100095,BG +3652100096,3652108287,RU +3652108288,3652116479,FR +3652116480,3652120575,TM +3652120576,3652124671,GB +3652124672,3652128767,UA +3652128768,3652136959,RU +3652136960,3652141055,IT +3652141056,3652145151,GB +3652145152,3652149247,UA +3652149248,3652153343,DE +3652153344,3652157439,SE +3652157440,3652165631,RU +3652165632,3652169727,FR +3652169728,3652171775,MQ +3652171776,3652173823,FR +3652173824,3652177919,AT +3652177920,3652182015,CY +3652182016,3652190207,DE +3652190208,3652321279,GB +3652321280,3652386815,JP +3652386816,3652583423,GB +3652583424,3652583435,FR +3652583436,3652583439,DE +3652583440,3652583487,FR +3652583488,3652583503,NL +3652583504,3652583551,FR +3652583552,3652583583,FI +3652583584,3652583599,LT +3652583600,3652583615,FR +3652583616,3652583679,DE +3652583680,3652584447,FR +3652584448,3652584575,GB +3652584576,3652584639,IE +3652584640,3652584703,NL +3652584704,3652584767,BE +3652584768,3652584799,PL +3652584800,3652584831,CZ +3652584832,3652584895,IT +3652584896,3652584927,PT +3652584928,3652584959,FR +3652584960,3652585023,ES +3652585024,3652585087,DE +3652585088,3652585151,ES +3652585152,3652585343,FR +3652585344,3652585359,LT +3652585360,3652585695,FR +3652585696,3652585727,GB +3652585728,3652585791,FR +3652585792,3652585823,FI +3652585824,3652585983,FR +3652585984,3652586047,ES +3652586048,3652586079,FR +3652586080,3652586111,CZ +3652586112,3652587647,FR +3652587648,3652587711,DE +3652587712,3652588095,FR +3652588096,3652588159,IT +3652588160,3652589183,FR +3652589184,3652589231,ES +3652589232,3652589823,FR +3652589824,3652589839,LT +3652589840,3652589887,FR +3652589888,3652589919,PL +3652589920,3652590783,FR +3652590784,3652590847,ES +3652590848,3652591119,FR +3652591120,3652591127,ES +3652591128,3652591615,FR +3652591616,3652591743,GB +3652591744,3652591807,BE +3652591808,3652592391,FR +3652592392,3652592399,ES +3652592400,3652592543,FR +3652592544,3652592575,PL +3652592576,3652592703,FR +3652592704,3652592767,DE +3652592768,3652592847,FR +3652592848,3652592863,LT +3652592864,3652592927,FR +3652592928,3652592959,CZ +3652592960,3652593023,FR +3652593024,3652593055,PT +3652593056,3652593215,FR +3652593216,3652593279,IE +3652593280,3652593407,FR +3652593408,3652593471,ES +3652593472,3652593511,FR +3652593512,3652593519,ES +3652593520,3652593631,FR +3652593632,3652593663,PT +3652593664,3652593943,FR +3652593944,3652593951,ES +3652593952,3652595007,FR +3652595008,3652595071,DE +3652595072,3652595167,FR +3652595168,3652595183,ES +3652595184,3652595871,FR +3652595872,3652595935,PL +3652595936,3652596351,FR +3652596352,3652596415,IT +3652596416,3652596479,FR +3652596480,3652596543,ES +3652596544,3652596799,FR +3652596800,3652596831,CZ +3652596832,3652597183,FR +3652597184,3652597247,DE +3652597248,3652597375,FR +3652597376,3652597383,ES +3652597384,3652597407,FR +3652597408,3652597439,PL +3652597440,3652597887,FR +3652597888,3652597903,GB +3652597904,3652599569,FR +3652599570,3652599570,PT +3652599571,3652599679,FR +3652599680,3652599743,IT +3652599744,3652601855,FR +3652601856,3652603903,PL +3652603904,3652608191,FR +3652608192,3652608223,PT +3652608224,3652608255,FR +3652608256,3652608511,GB +3652608512,3652608639,FR +3652608640,3652608767,GB +3652608768,3652609023,FR +3652609024,3652609279,GB +3652609280,3652609503,FR +3652609504,3652609535,FI +3652609536,3652609727,FR +3652609728,3652609759,PL +3652609760,3652609791,CZ +3652609792,3652609823,FR +3652609824,3652609855,CZ +3652609856,3652609919,FR +3652609920,3652609983,ES +3652609984,3652610047,BE +3652610048,3652611135,FR +3652611136,3652611199,ES +3652611200,3652611231,FR +3652611232,3652611263,PT +3652611264,3652611679,FR +3652611680,3652611711,PT +3652611712,3652611775,NL +3652611776,3652612223,FR +3652612224,3652612287,ES +3652612288,3652612351,FR +3652612352,3652612479,GB +3652612480,3652612543,IE +3652612544,3652612607,NL +3652612608,3652613335,FR +3652613336,3652613343,ES +3652613344,3652613375,FR +3652613376,3652613407,FI +3652613408,3652613615,FR +3652613616,3652613623,ES +3652613624,3652613679,FR +3652613680,3652613695,LT +3652613696,3652614015,FR +3652614016,3652614079,BE +3652614080,3652615871,FR +3652615872,3652615935,DE +3652615936,3652620639,FR +3652620640,3652620671,CZ +3652620672,3652620735,PT +3652620736,3652620799,FR +3652620800,3652620831,PT +3652620832,3652621247,FR +3652621248,3652621311,DE +3652621312,3652621375,FR +3652621376,3652621439,ES +3652621440,3652621503,FR +3652621504,3652621567,IT +3652621568,3652621631,FR +3652621632,3652621663,PT +3652621664,3652621823,FR +3652621824,3652621951,IE +3652621952,3652622271,FR +3652622272,3652622335,GB +3652622336,3652622879,FR +3652622880,3652622911,CZ +3652622912,3652623679,FR +3652623680,3652623807,NL +3652623808,3652624191,FR +3652624192,3652624319,IT +3652624320,3652628479,FR +3652628480,3652628543,IT +3652628544,3652628607,FR +3652628608,3652628639,PL +3652628640,3652628855,FR +3652628856,3652628863,ES +3652628864,3652629743,FR +3652629744,3652629759,ES +3652629760,3652630015,FR +3652630016,3652630031,ES +3652630032,3652630079,FR +3652630080,3652630111,PL +3652630112,3652631295,FR +3652631296,3652631359,BE +3652631360,3652631391,FR +3652631392,3652631407,CH +3652631408,3652631423,FR +3652631424,3652631455,PL +3652631456,3652631551,FR +3652631552,3652631583,CZ +3652631584,3652631807,FR +3652631808,3652631823,GB +3652631824,3652632031,FR +3652632032,3652632063,PT +3652632064,3652632303,FR +3652632304,3652632311,ES +3652632312,3652633599,FR +3652633600,3652634623,DE +3652634624,3652635647,PL +3652635648,3652638655,FR +3652638656,3652638719,ES +3652638720,3652638815,FR +3652638816,3652638847,FI +3652638848,3652638975,GB +3652638976,3652639359,FR +3652639360,3652639423,DE +3652639424,3652639679,FR +3652639680,3652639807,NL +3652639808,3652640575,FR +3652640576,3652640703,GB +3652640704,3652640711,FR +3652640712,3652640719,ES +3652640720,3652640767,FR +3652640768,3652640831,ES +3652640832,3652641727,FR +3652641728,3652641791,GB +3652641792,3652642111,FR +3652642112,3652642175,IE +3652642176,3652642239,FR +3652642240,3652642303,DE +3652642304,3652642367,FR +3652642368,3652642431,GB +3652642432,3652642719,FR +3652642720,3652642751,PT +3652642752,3652642975,FR +3652642976,3652643007,IE +3652643008,3652643375,FR +3652643376,3652643379,ES +3652643380,3652643519,FR +3652643520,3652643583,NL +3652643584,3652643647,ES +3652643648,3652644031,FR +3652644032,3652644063,BE +3652644064,3652644199,FR +3652644200,3652644215,ES +3652644216,3652644223,FR +3652644224,3652644239,NL +3652644240,3652644247,FR +3652644248,3652644255,ES +3652644256,3652644351,FR +3652644352,3652644383,FI +3652644384,3652644415,PL +3652644416,3652644575,FR +3652644576,3652644607,DE +3652644608,3652645119,FR +3652645120,3652645503,GB +3652645504,3652645663,FR +3652645664,3652645695,FI +3652645696,3652645887,FR +3652645888,3652646015,NL +3652646016,3652646079,ES +3652646080,3652646111,FR +3652646112,3652646143,CZ +3652646144,3652646271,NL +3652646272,3652646655,FR +3652646656,3652646719,ES +3652646720,3652646799,FR +3652646800,3652646815,PL +3652646816,3652646847,FR +3652646848,3652646863,FI +3652646864,3652648847,FR +3652648848,3652648863,LT +3652648864,3652648895,FI +3652648896,3652648959,DE +3652648960,3652714495,IE +3652714496,3653238783,DE +3653238784,3653369855,CH +3653369856,3653373951,IT +3653373952,3653378047,NL +3653378048,3653382143,DE +3653382144,3653386239,CH +3653386240,3653390335,DE +3653390336,3653394431,FR +3653394432,3653402623,NL +3653402624,3653406557,GB +3653406558,3653406558,GN +3653406559,3653406617,GB +3653406618,3653406618,GN +3653406619,3653407103,GB +3653407104,3653407111,UG +3653407112,3653408071,GB +3653408072,3653408079,NG +3653408080,3653408231,GB +3653408232,3653408239,KE +3653408240,3653410815,GB +3653410816,3653414911,CZ +3653414912,3653419007,IT +3653419008,3653423103,IL +3653423104,3653427199,GB +3653427200,3653431295,DE +3653431296,3653435391,RU +3653435392,3653439487,DE +3653439488,3653443583,FR +3653443584,3653447679,DE +3653447680,3653451775,LV +3653451776,3653464063,RU +3653464064,3653468159,NL +3653468160,3653472255,GR +3653476352,3653480447,CZ +3653480448,3653484543,DK +3653484544,3653488639,TR +3653488640,3653492735,RU +3653492736,3653500927,NL +3653500928,3653505023,GB +3653505024,3653509119,KZ +3653509120,3653513215,NL +3653513216,3653517311,NO +3653517312,3653525503,AT +3653525504,3653529599,RU +3653529600,3653533695,CZ +3653533696,3653537791,IT +3653537792,3653541887,AT +3653541888,3653545983,UA +3653545984,3653550079,CH +3653550080,3653554175,MK +3653554176,3653558271,CZ +3653558272,3653566463,GB +3653566464,3653570559,RU +3653570560,3653574655,ES +3653574656,3653578751,CZ +3653578752,3653582847,SE +3653582848,3653586943,PL +3653586944,3653591039,DE +3653591040,3653595135,LU +3653595136,3653599231,RU +3653599232,3653601279,CH +3653601280,3653603327,BA +3653603328,3653607423,CZ +3653611520,3653615615,HU +3653615616,3653619711,RU +3653619712,3653623807,CH +3653623808,3653636095,RU +3653636096,3653640191,NL +3653640192,3653648383,GB +3653648384,3653652479,SE +3653652480,3653656575,RU +3653656576,3653660671,GB +3653660672,3653664767,CZ +3653664768,3653668863,DE +3653668864,3653672959,SE +3653672960,3653681151,RU +3653681152,3653685247,ES +3653685248,3653689343,DK +3653689344,3653693439,LV +3653693440,3653697535,DE +3653697536,3653705727,IT +3653705728,3653708331,NO +3653708332,3653708332,FI +3653708333,3653713919,NO +3653713920,3653718015,DE +3653718016,3653722111,AT +3653722112,3653730303,LV +3653730304,3653734399,BA +3653734400,3653738495,KE +3653738496,3653746687,GB +3653746688,3653750783,DE +3653750784,3653754879,RU +3653754880,3653758975,UA +3653758976,3653763071,RU +3653763072,3654025215,IT +3654025216,3654287359,GB +3654287360,3654608404,SE +3654608405,3654608405,NO +3654608406,3654608895,SE +3654608896,3654609919,NO +3654609920,3654610431,SE +3654610432,3654610943,FR +3654610944,3654610951,SE +3654610952,3654610959,DE +3654610960,3654612231,SE +3654612232,3654612239,AT +3654612240,3654612271,SE +3654612272,3654612287,AT +3654612288,3654614047,SE +3654614048,3654614063,GB +3654614064,3654614079,SE +3654614080,3654614271,FI +3654614272,3654811647,SE +3654811648,3654942719,ES +3654942720,3655073791,IR +3655073792,3655335935,IT +3655335936,3657433087,DE +3657433088,3659415455,CN +3659415456,3659415487,SG +3659415488,3659530239,CN +3659530240,3659595775,TW +3659595776,3659628543,ID +3659628544,3659661311,JP +3659661312,3659792383,TW +3659792384,3660054527,KR +3660054528,3660578815,JP +3660578816,3661103103,KR +3661103104,3663986687,CN +3663986688,3663987711,AU +3663987712,3663987967,ID +3663987968,3663989247,JP +3663989248,3663989503,VN +3663989504,3663989759,ID +3663989760,3663990271,AU +3663990272,3663990527,VN +3663990528,3663990783,JP +3663990784,3663991295,HK +3663991296,3663991551,MY +3663991552,3663991807,AU +3663992064,3663992319,NZ +3663992320,3663992575,MY +3663992576,3663993599,NZ +3663993600,3663996159,ID +3663996160,3663996415,AU +3663996416,3663996671,TH +3663996672,3663997183,AU +3663997184,3663997439,ID +3663997440,3663997695,JP +3663997696,3663997951,AU +3663997952,3663998207,MY +3663998208,3663998463,JP +3663998464,3663998975,TH +3663998976,3663999487,IN +3663999488,3663999743,AU +3664000000,3664000767,AU +3664000768,3664001023,ID +3664001024,3664001279,NZ +3664001280,3664001535,LK +3664001536,3664001791,MY +3664002048,3664002303,VN +3664002304,3664002559,LK +3664002560,3664003327,ID +3664003328,3664003583,NZ +3664003584,3664003839,TH +3664003840,3664004095,JP +3664004352,3664004607,MY +3664004864,3664005119,KH +3664005120,3664005887,ID +3664005888,3664006143,MY +3664006144,3664006399,AU +3664006400,3664006655,PF +3664006656,3664006911,AU +3664007168,3664008191,AU +3664008192,3664008447,MN +3664008448,3664008703,PK +3664008960,3664010239,AU +3664010240,3664052223,CN +3664052224,3664084991,NZ +3664084992,3664117759,KR +3664117760,3664248831,HK +3664248832,3664642047,CN +3664642048,3664707583,JP +3664707584,3664773119,MY +3664773120,3666870271,JP +3666870272,3666960455,KR +3666960456,3666960456,US +3666960457,3667918847,KR +3667918848,3668967423,TW +3668967424,3669491711,JP +3669491712,3669557247,TW +3669557248,3669590015,AU +3669590016,3669606399,JP +3669606400,3669614591,CN +3669614592,3669616639,NZ +3669616640,3669618687,AU +3669618688,3669620735,CN +3669620736,3669622783,IN +3669622784,3669688319,SG +3669688320,3669753855,TW +3669753856,3670015999,HK +3670016000,3671064575,CN +3671064576,3671130111,MY +3671130112,3671195647,KR +3671195648,3671326719,TW +3671326720,3671392255,SG +3671392256,3671457791,HK +3671457792,3671588863,AU +3671588864,3672637439,JP +3672637440,3673161727,KR +3673161728,3673686015,CN +3673686016,3673751551,IN +3673751552,3673817087,CN +3673817088,3673882623,HK +3673882624,3673948159,JP +3673948160,3674210303,HK +3674210304,3678404607,JP +3678404608,3678535679,IN +3678535680,3678666751,JP +3678666752,3678928895,TW +3678928896,3678994431,CN +3678994432,3679027199,HK +3679027200,3679059967,JP +3679059968,3679158271,SG +3679158272,3679191039,JP +3679191040,3679453183,HK +3679453184,3679584255,TW +3679584256,3679649791,CN +3679649792,3679682559,ID +3679682560,3679715327,CN +3679715328,3679977471,TW +3679977472,3680108543,NZ +3680108544,3680124927,TW +3680124928,3680125951,IN +3680125952,3680129023,CN +3680129024,3680133119,PH +3680133120,3680137215,IN +3680137216,3680141311,HK +3680141312,3680174079,AU +3680174080,3680206847,TW +3680206848,3680239615,IN +3680239616,3680403455,MY +3680403456,3680436223,JP +3680436224,3680501759,MY +3680501760,3682598911,JP +3682598912,3684575268,CN +3684575269,3684575269,HK +3684575270,3684696063,CN +3684696064,3688366079,JP +3688366080,3689938943,CN +3689938944,3690070015,KR +3690070016,3690463231,CN +3690463232,3690987519,KR +3690987520,3695181823,JP +3695181824,3697278975,KR +3697278976,3697573887,JP +3697573888,3697582079,GB +3697582080,3697586175,SG +3697586176,3697606655,JP +3697606656,3697655807,AU +3697655808,3697672191,CN +3697672192,3697737727,JP +3697737728,3697803263,KR +3697803264,3698327551,JP +3698327552,3698589695,CN +3698589696,3699376127,KR +3699376128,3700424703,TW +3700424704,3700752383,JP +3700752384,3700817919,KR +3700817920,3700981759,JP +3700981760,3701014527,CN +3701014528,3701080063,JP +3701080064,3701211135,CN +3701211136,3701252095,JP +3701252096,3701256191,NC +3701256192,3701258239,SG +3701258240,3701260287,IN +3701260288,3701293055,JP +3701293056,3701301247,AU +3701301248,3701305343,ID +3701305344,3701309439,TW +3701309440,3701374975,JP +3701374976,3701375999,IN +3701376000,3701377023,HK +3701377024,3701380095,IN +3701380096,3701381119,KH +3701381120,3701390335,IN +3701390336,3701391359,AU +3701391360,3701392383,IN +3701392384,3701393407,HK +3701393408,3701394431,MY +3701394432,3701395455,BD +3701395456,3701396479,MY +3701396480,3701397247,NZ +3701397248,3701397503,AU +3701397504,3701398527,JP +3701398528,3701399551,MV +3701399552,3701400575,HK +3701400576,3701401599,TW +3701401600,3701402623,BD +3701402624,3701403647,BT +3701403648,3701404671,CN +3701404672,3701405695,HK +3701405696,3701406719,JP +3701406720,3701407743,HK +3701407744,3701473279,JP +3701473280,3704619007,CN +3704619008,3705667583,JP +3705667584,3705929727,IN +3705929728,3706060799,TW +3706060800,3706126335,KR +3706126336,3706142719,CN +3706142720,3706159103,VN +3706159104,3706191871,CN +3706191872,3706207107,SG +3706207108,3706207108,US +3706207109,3706208255,SG +3706208256,3706224639,CN +3706224640,3706225663,HK +3706225664,3706226687,JP +3706226688,3706231807,HK +3706231808,3706232831,JP +3706232832,3706233343,HK +3706233344,3706234367,JP +3706234368,3706237951,HK +3706237952,3706238975,JP +3706238976,3706244095,HK +3706244096,3706244863,JP +3706244864,3706245887,HK +3706245888,3706246143,JP +3706246144,3706253823,HK +3706253824,3706254335,JP +3706254336,3706256895,HK +3706256896,3706257151,JP +3706257152,3706257407,HK +3706257408,3706322943,AU +3706322944,3706388479,CN +3706388480,3706781695,AU +3706781696,3706847231,HK +3706847232,3706978303,CN +3706978304,3707109375,AU +3707109376,3707174911,HK +3707174912,3707207679,JP +3707207680,3707208703,BD +3707208704,3707209727,NZ +3707209728,3707211775,CN +3707211776,3707215871,NP +3707215872,3707217919,BD +3707217920,3707219967,ID +3707219968,3707222015,AU +3707222016,3707224063,JP +3707224064,3707240447,LK +3707240448,3707568127,CN +3707568128,3707633663,AU +3707633664,3707699199,JP +3707699200,3707764735,SG +3707764736,3708600319,CN +3708600320,3708616703,JP +3708616704,3708813311,CN +3708813312,3715629055,JP +3715629056,3715653631,TW +3715653632,3715655679,BD +3715655680,3715657727,IN +3715657728,3715661823,SG +3715661824,3715672063,AU +3715672064,3715674111,JP +3715674112,3715678207,HK +3715678208,3715694591,PK +3715694592,3715710975,VN +3715710976,3715719167,AU +3715719168,3715727359,PH +3715727360,3715729151,AU +3715729152,3715729407,NZ +3715729408,3715735551,AU +3715735552,3715741695,JP +3715741696,3715743743,PH +3715743744,3715760127,JP +3715760128,3715891199,CN +3715891200,3716153343,HK +3716153344,3716170239,SG +3716170240,3716170494,TH +3716170495,3716171519,SG +3716171520,3716171775,JP +3716171776,3716172031,SG +3716172032,3716172287,JP +3716172288,3716173055,SG +3716173056,3716173311,JP +3716173312,3716173567,SG +3716173568,3716173823,JP +3716173824,3716174079,SG +3716174080,3716174083,TH +3716174084,3716174335,JP +3716174336,3716175615,SG +3716175616,3716176895,JP +3716176896,3716178175,SG +3716178176,3716178943,JP +3716178944,3716179967,SG +3716179968,3716181759,JP +3716181760,3716182783,SG +3716182784,3716183295,JP +3716183296,3716183551,SG +3716183552,3716184063,JP +3716184064,3716184319,SG +3716184320,3716184575,JP +3716184576,3716184831,SG +3716184832,3716185087,JP +3716185088,3716186111,SG +3716186112,3716415487,CN +3716415488,3716431871,VN +3716431872,3716440063,KR +3716440064,3716444159,JP +3716444160,3716446207,PK +3716446208,3716464639,JP +3716464640,3716481023,ID +3716481024,3716489215,VN +3716489216,3716493311,MY +3716493312,3716497407,KR +3716497408,3716513791,JP +3716513792,3716530175,KR +3716530176,3716538367,AU +3716538368,3716546559,CN +3716546560,3716677631,IN +3716677632,3716808703,CN +3716808704,3718840319,KR +3718840320,3718905855,TW +3718905856,3719036927,JP +3719036928,3719823359,CN +3719823360,3720347647,JP +3720347648,3720859647,CN +3720859648,3720863743,AU +3720863744,3723493375,CN +3723493376,3725590527,JP +3725590528,3730833407,CN +3730833408,3732602879,KR +3732602880,3732668415,TH +3732668416,3732733951,ID +3732733952,3732799487,CN +3732799488,3732832255,PH +3732832256,3732865023,CN +3732865024,3732930559,PH +3732930560,3733979135,CN +3733979136,3734503423,JP +3734503424,3734765567,NZ +3734765568,3734896639,TW +3734896640,3735027711,JP +3735027712,3735289855,CN +3735289856,3735388159,SG +3735388160,3735404543,LK +3735404544,3735420927,ID +3735420928,3735551999,HK +3735552000,3739222015,CN +3739222016,3739570175,JP +3739570176,3739572223,ID +3739572224,3739574271,AU +3739574272,3739680767,JP +3739680768,3739697151,KR +3739697152,3739746303,JP +3739746304,3740270591,KR +3740270592,3740925951,CN +3740925952,3741024255,TW +3741024256,3741057023,KR +3741057024,3741319167,VN +3741319168,3742367743,CN +3742367744,3742629887,HK +3742629888,3742760959,CN +3742760960,3742892031,TW +3742892032,3742957567,TH +3742957568,3742973951,PH +3742973952,3742982143,SG +3742982144,3742986239,ID +3742986240,3742988287,AU +3742988288,3742990335,VU +3742990336,3743006719,JP +3743006720,3743014911,TH +3743014912,3743016959,AU +3743016960,3743019007,SG +3743019008,3743022079,MY +3743022080,3743023103,BD +3743023104,3743027199,TW +3743031296,3743035391,IN +3743035392,3743039487,HK +3743039488,3743055871,TW +3743055872,3743088639,KR +3743088640,3743093647,AU +3743093648,3743093648,NZ +3743093649,3743096831,AU +3743096832,3743105023,TW +3743105024,3743106047,AU +3743106048,3743109119,JP +3743109120,3743113215,BD +3743113216,3743115263,AU +3743115264,3743117311,VN +3743117312,3743118335,BD +3743118336,3743119359,JP +3743119360,3743120383,IN +3743120384,3743121407,JP +3743121408,3743125503,MY +3743125504,3743129599,ID +3743129600,3743130623,HK +3743130624,3743130879,SG +3743130880,3743131135,HK +3743131136,3743133695,SG +3743133696,3743134719,AU +3743134720,3743135743,JP +3743135744,3743136767,CN +3743136768,3743137791,MY +3743137792,3743154175,TH +3743154176,3743186943,MY +3743186944,3743219711,KR +3743219712,3743252479,JP +3743252480,3743264767,NC +3743264768,3743268863,JP +3743268864,3743272959,IN +3743272960,3743273983,CN +3743273984,3743275007,BD +3743275008,3743276031,HK +3743276032,3743277055,IN +3743277056,3743281151,PK +3743281152,3743282175,AU +3743282176,3743283199,JP +3743283200,3743284223,HK +3743284224,3743285247,CN +3743285248,3743416319,IN +3743416320,3745513471,KR +3745513472,3749052415,CN +3749052416,3749183487,HK +3749183488,3749838847,CN +3749838848,3749839871,SG +3749839872,3749840895,IN +3749840896,3749841919,CN +3749841920,3749842943,AU +3749842944,3749843967,PH +3749843968,3749844991,ID +3749844992,3749846015,AU +3749846016,3749847039,IN +3749847040,3749855231,HK +3749855232,3749969919,KR +3749969920,3750232063,JP +3750232064,3750756351,TW +3750756352,3752067071,CN +3752067072,3752132607,ID +3752132608,3752133631,BD +3752133632,3752134655,ID +3752134656,3752136703,TW +3752136704,3752137727,NZ +3752137728,3752138751,JP +3752138752,3752140799,IN +3752140800,3752148991,JP +3752148992,3752153087,NZ +3752153088,3752157183,JP +3752157184,3752165375,AU +3752165376,3752198143,KR +3752198144,3752329215,CN +3752329216,3752853503,KR +3752853504,3753902079,IN +3753902080,3754033151,CN +3754033152,3754164223,KR +3754164224,3754229759,IN +3754229760,3754295295,HK +3754295296,3754426367,CN +3754426368,3754491903,TW +3754491904,3754688511,CN +3754688512,3754950655,TH +3754950656,3755474943,CN +3755474944,3755737087,JP +3755737088,3755868159,CN +3755868160,3755933695,KR +3755933696,3755966463,JP +3755966464,3755974655,IN +3755974656,3755976703,JP +3755976704,3755978751,KH +3755978752,3755986943,CN +3755986944,3755988991,JP +3755988992,3755990015,HK +3755990016,3755991039,SG +3755991040,3755999231,JP +3755999232,3757047807,IN +3757047808,3757834239,CN +3757834240,3757850623,AU +3757850624,3757858815,JP +3757858816,3757862911,AU +3757862912,3757867007,JP +3757867008,3757875519,CN +3757875520,3757875583,HK +3757875584,3757899775,CN +3757899776,3757965311,KR +3757965312,3758063615,CN +3758063616,3758079999,HK +3758080000,3758088191,KR +3758088192,3758090239,ID +3758090240,3758091263,AU +3758091264,3758092287,CN +3758092288,3758093311,HK +3758093312,3758094335,IN +3758094336,3758095359,HK +3758095360,3758095871,CN +3758095872,3758096127,SG +3758096128,3758096383,AU diff --git a/src/wraith/src/config/geoip6 b/src/wraith/src/config/geoip6 new file mode 100644 index 000000000..e6f575dfe --- /dev/null +++ b/src/wraith/src/config/geoip6 @@ -0,0 +1,41219 @@ +# Last updated based on December 6 2017 Maxmind GeoLite2 Country +# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz +# gunzip GeoLite2-Country.mmdb.gz +# python mmdb-convert.py GeoLite2-Country.mmdb +600:8801:9400:5a1:948b:ab15:dde3:61a3,600:8801:9400:5a1:948b:ab15:dde3:61a3,US +2001:200::,2001:200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:208::,2001:208:ffff:ffff:ffff:ffff:ffff:ffff,SG +2001:218::,2001:218:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:220::,2001:220:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:230::,2001:230:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:238::,2001:238:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:240::,2001:240:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:250::,2001:252:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:254::,2001:254:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:256::,2001:256:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:258::,2001:258:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:260::,2001:260:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:268::,2001:268:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:270::,2001:270:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:278::,2001:278:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:280::,2001:280:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:288::,2001:288:8275:ffff:ffff:ffff:ffff:ffff,TW +2001:288:8276::,2001:288:8276:7fff:ffff:ffff:ffff:ffff,US +2001:288:8276:8000::,2001:288:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:290::,2001:290:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:298::,2001:298:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:2a0::,2001:2a0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:2a8::,2001:2a8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:2b0::,2001:2b0:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:2b8::,2001:2b9:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:2c0::,2001:2c0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:2c8::,2001:2c8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:2d8::,2001:2d8:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:2e0::,2001:2e0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2001:2e8::,2001:2e8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:2f0::,2001:2f0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:2f8::,2001:2f8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:300::,2001:300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:308::,2001:308:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:310::,2001:310:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:318::,2001:318:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:320::,2001:320:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:330::,2001:330:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:338::,2001:338:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:340::,2001:340:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:348::,2001:348:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:350::,2001:350:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:358::,2001:358:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:360::,2001:360:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:368::,2001:368:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:370::,2001:370:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:378::,2001:378:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:380::,2001:380:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:388::,2001:388:efff:ffff:ffff:ffff:ffff:ffff,AU +2001:388:f000::,2001:388:f000:7fff:ffff:ffff:ffff:ffff,ID +2001:388:f000:8000::,2001:388:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:390::,2001:390:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:398::,2001:398:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:3a0::,2001:3a0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:3a8::,2001:3a8:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:3b0::,2001:3b0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:3b8::,2001:3b8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:3c0::,2001:3c0:1fff:ffff:ffff:ffff:ffff:ffff,JP +2001:3c8::,2001:3c8:ffff:ffff:ffff:ffff:ffff:ffff,TH +2001:3d0::,2001:3d0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:3d8::,2001:3d8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:3e0::,2001:3e0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:3e8::,2001:3e8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:400::,2001:400:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:408::,2001:408:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:410::,2001:410:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:418::,2001:418:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:420::,2001:420:3fff:ffff:ffff:ffff:ffff:ffff,US +2001:420:4000::,2001:420:447f:ffff:ffff:ffff:ffff:ffff,NL +2001:420:4480::,2001:420:4487:ffff:ffff:ffff:ffff:ffff,IL +2001:420:4488::,2001:420:4fff:ffff:ffff:ffff:ffff:ffff,NL +2001:420:5000::,2001:420:51ff:ffff:ffff:ffff:ffff:ffff,AU +2001:420:5200::,2001:420:5240:ffff:ffff:ffff:ffff:ffff,US +2001:420:5241::,2001:420:5241:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5241:8000::,2001:420:5243:ffff:ffff:ffff:ffff:ffff,US +2001:420:5244::,2001:420:5244:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5244:8000::,2001:420:5245:ffff:ffff:ffff:ffff:ffff,US +2001:420:5246::,2001:420:5246:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5246:8000::,2001:420:524a:ffff:ffff:ffff:ffff:ffff,US +2001:420:524b::,2001:420:524b:7fff:ffff:ffff:ffff:ffff,IN +2001:420:524b:8000::,2001:420:524b:ffff:ffff:ffff:ffff:ffff,US +2001:420:524c::,2001:420:524c:7fff:ffff:ffff:ffff:ffff,IN +2001:420:524c:8000::,2001:420:524d:ffff:ffff:ffff:ffff:ffff,US +2001:420:524e::,2001:420:524e:7fff:ffff:ffff:ffff:ffff,IN +2001:420:524e:8000::,2001:420:524e:ffff:ffff:ffff:ffff:ffff,US +2001:420:524f::,2001:420:524f:7fff:ffff:ffff:ffff:ffff,IN +2001:420:524f:8000::,2001:420:543f:ffff:ffff:ffff:ffff:ffff,US +2001:420:5440::,2001:420:5440:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5440:8000::,2001:420:5440:ffff:ffff:ffff:ffff:ffff,US +2001:420:5441::,2001:420:5441:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5441:8000::,2001:420:5441:ffff:ffff:ffff:ffff:ffff,US +2001:420:5442::,2001:420:5442:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5442:8000::,2001:420:5442:ffff:ffff:ffff:ffff:ffff,US +2001:420:5443::,2001:420:5443:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5443:8000::,2001:420:5443:ffff:ffff:ffff:ffff:ffff,US +2001:420:5444::,2001:420:5444:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5444:8000::,2001:420:5445:ffff:ffff:ffff:ffff:ffff,US +2001:420:5446::,2001:420:5446:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5446:8000::,2001:420:5446:ffff:ffff:ffff:ffff:ffff,US +2001:420:5447::,2001:420:5447:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5447:8000::,2001:420:5502:ffff:ffff:ffff:ffff:ffff,US +2001:420:5503::,2001:420:5503:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5503:8000::,2001:420:5503:ffff:ffff:ffff:ffff:ffff,US +2001:420:5504::,2001:420:5504:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5504:8000::,2001:420:5504:ffff:ffff:ffff:ffff:ffff,US +2001:420:5505::,2001:420:5505:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5505:8000::,2001:420:5505:ffff:ffff:ffff:ffff:ffff,US +2001:420:5506::,2001:420:5506:7fff:ffff:ffff:ffff:ffff,IN +2001:420:5506:8000::,2001:420:550b:ffff:ffff:ffff:ffff:ffff,US +2001:420:550c::,2001:420:550c:7fff:ffff:ffff:ffff:ffff,IN +2001:420:550c:8000::,2001:420:550d:ffff:ffff:ffff:ffff:ffff,US +2001:420:550e::,2001:420:550e:7fff:ffff:ffff:ffff:ffff,IN +2001:420:550e:8000::,2001:420:57ff:ffff:ffff:ffff:ffff:ffff,US +2001:420:5800::,2001:420:5bff:ffff:ffff:ffff:ffff:ffff,HK +2001:420:5c00::,2001:420:5dff:ffff:ffff:ffff:ffff:ffff,SG +2001:420:5e00::,2001:420:5fff:ffff:ffff:ffff:ffff:ffff,JP +2001:420:6000::,2001:420:c0bf:ffff:ffff:ffff:ffff:ffff,US +2001:420:c0c0::,2001:420:c0c3:ffff:ffff:ffff:ffff:ffff,NL +2001:420:c0c4::,2001:420:c0cf:ffff:ffff:ffff:ffff:ffff,US +2001:420:c0d0::,2001:420:c0d3:ffff:ffff:ffff:ffff:ffff,AU +2001:420:c0d4::,2001:420:c0d7:ffff:ffff:ffff:ffff:ffff,SG +2001:420:c0d8::,2001:420:c0db:ffff:ffff:ffff:ffff:ffff,HK +2001:420:c0dc::,2001:420:c0df:ffff:ffff:ffff:ffff:ffff,JP +2001:420:c0e0::,2001:420:c0e0:7fff:ffff:ffff:ffff:ffff,IN +2001:420:c0e0:8000::,2001:420:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:428::,2001:428:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:430::,2001:430:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:438::,2001:438:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:440::,2001:440:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:448::,2001:448:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:450::,2001:450:1b:ffff:ffff:ffff:ffff:ffff,US +2001:450:1c::,2001:450:1c:ffff:ffff:ffff:ffff:ffff,CA +2001:450:1d::,2001:450:1d:ffff:ffff:ffff:ffff:ffff,GB +2001:450:1e::,2001:450:1e:ffff:ffff:ffff:ffff:ffff,FR +2001:450:1f::,2001:450:1f:ffff:ffff:ffff:ffff:ffff,CA +2001:450:20::,2001:450:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:458::,2001:458:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:460::,2001:460:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:468::,2001:468:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:470::,2001:470:0:284::,US +2001:470:0:284::1,2001:470:0:284::1,AT +2001:470:0:284::2,2001:470:4:7ff:ffff:ffff:ffff:ffff,US +2001:470:4:800::,2001:470:4:fff:ffff:ffff:ffff:ffff,NL +2001:470:4:1000::,2001:470:5:317:ffff:ffff:ffff:ffff,US +2001:470:5:318::,2001:470:5:318:ffff:ffff:ffff:ffff,AR +2001:470:5:319::,2001:470:5:ffff:ffff:ffff:ffff:ffff,US +2001:470:6::,2001:470:6:7fff:ffff:ffff:ffff:ffff,MX +2001:470:6:8000::,2001:470:d:11b:ffff:ffff:ffff:ffff,US +2001:470:d:11c::,2001:470:d:11c:ffff:ffff:ffff:ffff,NZ +2001:470:d:11d::,2001:470:17:ffff:ffff:ffff:ffff:ffff,US +2001:470:18::,2001:470:18:7fff:ffff:ffff:ffff:ffff,CN +2001:470:18:8000::,2001:470:18:ffff:ffff:ffff:ffff:ffff,US +2001:470:19::,2001:470:19:e7f:ffff:ffff:ffff:ffff,CN +2001:470:19:e80::,2001:470:19:e80:ffff:ffff:ffff:ffff,HK +2001:470:19:e81::,2001:470:19:7fff:ffff:ffff:ffff:ffff,CN +2001:470:19:8000::,2001:470:1c:ffff:ffff:ffff:ffff:ffff,US +2001:470:1d::,2001:470:1d:7fff:ffff:ffff:ffff:ffff,CA +2001:470:1d:8000::,2001:470:23:1ff:ffff:ffff:ffff:ffff,US +2001:470:23:200::,2001:470:23:3ff:ffff:ffff:ffff:ffff,CN +2001:470:23:400::,2001:470:23:429:ffff:ffff:ffff:ffff,US +2001:470:23:42a::,2001:470:23:42a:ffff:ffff:ffff:ffff,RU +2001:470:23:42b::,2001:470:23:7ff:ffff:ffff:ffff:ffff,US +2001:470:23:800::,2001:470:23:fff:ffff:ffff:ffff:ffff,JP +2001:470:23:1000::,2001:470:23:ffff:ffff:ffff:ffff:ffff,US +2001:470:24::,2001:470:24:7fff:ffff:ffff:ffff:ffff,CN +2001:470:24:8000::,2001:470:24:ffff:ffff:ffff:ffff:ffff,US +2001:470:25::,2001:470:25:3ff:ffff:ffff:ffff:ffff,RU +2001:470:25:400::,2001:470:26:65b:ffff:ffff:ffff:ffff,US +2001:470:26:65c::,2001:470:26:65c:ffff:ffff:ffff:ffff,CH +2001:470:26:65d::,2001:470:26:825:ffff:ffff:ffff:ffff,US +2001:470:26:826::,2001:470:26:826:ffff:ffff:ffff:ffff,CH +2001:470:26:827::,2001:470:26:b6c:ffff:ffff:ffff:ffff,US +2001:470:26:b6d::,2001:470:26:b6d:ffff:ffff:ffff:ffff,AT +2001:470:26:b6e::,2001:470:27:1a5:ffff:ffff:ffff:ffff,US +2001:470:27:1a6::,2001:470:27:1a6:ffff:ffff:ffff:ffff,RU +2001:470:27:1a7::,2001:470:28:35:ffff:ffff:ffff:ffff,US +2001:470:28:36::,2001:470:28:36:ffff:ffff:ffff:ffff,SE +2001:470:28:37::,2001:470:28:1a5:ffff:ffff:ffff:ffff,US +2001:470:28:1a6::,2001:470:28:1a6:ffff:ffff:ffff:ffff,RU +2001:470:28:1a7::,2001:470:28:2df:ffff:ffff:ffff:ffff,US +2001:470:28:2e0::,2001:470:28:2e0:ffff:ffff:ffff:ffff,SE +2001:470:28:2e1::,2001:470:28:36d:ffff:ffff:ffff:ffff,US +2001:470:28:36e::,2001:470:28:36e:ffff:ffff:ffff:ffff,DK +2001:470:28:36f::,2001:470:28:3d4:ffff:ffff:ffff:ffff,US +2001:470:28:3d5::,2001:470:28:3d5:ffff:ffff:ffff:ffff,SE +2001:470:28:3d6::,2001:470:28:6dd:ffff:ffff:ffff:ffff,US +2001:470:28:6de::,2001:470:28:6de:ffff:ffff:ffff:ffff,SE +2001:470:28:6df::,2001:470:28:816:ffff:ffff:ffff:ffff,US +2001:470:28:817::,2001:470:28:817:ffff:ffff:ffff:ffff,DK +2001:470:28:818::,2001:470:28:906:ffff:ffff:ffff:ffff,US +2001:470:28:907::,2001:470:28:907:ffff:ffff:ffff:ffff,RU +2001:470:28:908::,2001:470:28:9c1:ffff:ffff:ffff:ffff,US +2001:470:28:9c2::,2001:470:28:9c2:ffff:ffff:ffff:ffff,SE +2001:470:28:9c3::,2001:470:28:a2b:ffff:ffff:ffff:ffff,US +2001:470:28:a2c::,2001:470:28:a2c:ffff:ffff:ffff:ffff,SE +2001:470:28:a2d::,2001:470:34:ffff:ffff:ffff:ffff:ffff,US +2001:470:35::,2001:470:35:7fff:ffff:ffff:ffff:ffff,TH +2001:470:35:8000::,2001:470:65:ffff:ffff:ffff:ffff:ffff,US +2001:470:66::,2001:470:66:7ff:ffff:ffff:ffff:ffff,CN +2001:470:66:800::,2001:470:66:bff:ffff:ffff:ffff:ffff,US +2001:470:66:c00::,2001:470:66:fff:ffff:ffff:ffff:ffff,CN +2001:470:66:1000::,2001:470:6d:6b1:ffff:ffff:ffff:ffff,US +2001:470:6d:6b2::,2001:470:6d:6b2:ffff:ffff:ffff:ffff,ES +2001:470:6d:6b3::,2001:470:6d:ffff:ffff:ffff:ffff:ffff,US +2001:470:6e::,2001:470:6e:7fff:ffff:ffff:ffff:ffff,CZ +2001:470:6e:8000::,2001:470:6f:49e:ffff:ffff:ffff:ffff,US +2001:470:6f:49f::,2001:470:6f:49f:ffff:ffff:ffff:ffff,SK +2001:470:6f:4a0::,2001:470:70:dff:ffff:ffff:ffff:ffff,US +2001:470:70:e00::,2001:470:70:fff:ffff:ffff:ffff:ffff,UA +2001:470:70:1000::,2001:470:70:ffff:ffff:ffff:ffff:ffff,US +2001:470:71::,2001:470:71:5ff:ffff:ffff:ffff:ffff,RU +2001:470:71:600::,2001:470:71:600:ffff:ffff:ffff:ffff,PL +2001:470:71:601::,2001:470:71:60b:ffff:ffff:ffff:ffff,RU +2001:470:71:60c::,2001:470:71:60c:ffff:ffff:ffff:ffff,PL +2001:470:71:60d::,2001:470:71:7fff:ffff:ffff:ffff:ffff,RU +2001:470:71:8000::,2001:470:184b:ffff:ffff:ffff:ffff:ffff,US +2001:470:184c::,2001:470:184c:7fff:ffff:ffff:ffff:ffff,GB +2001:470:184c:8000::,2001:470:1883:ffff:ffff:ffff:ffff:ffff,US +2001:470:1884::,2001:470:1884:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1884:8000::,2001:470:18a4:ffff:ffff:ffff:ffff:ffff,US +2001:470:18a5::,2001:470:18a5:7fff:ffff:ffff:ffff:ffff,GB +2001:470:18a5:8000::,2001:470:18aa:ffff:ffff:ffff:ffff:ffff,US +2001:470:18ab::,2001:470:18ab:ffff:ffff:ffff:ffff:ffff,GB +2001:470:18ac::,2001:470:18b6:ffff:ffff:ffff:ffff:ffff,US +2001:470:18b7::,2001:470:18b7:7fff:ffff:ffff:ffff:ffff,GB +2001:470:18b7:8000::,2001:470:18c2:ffff:ffff:ffff:ffff:ffff,US +2001:470:18c3::,2001:470:18c3:7fff:ffff:ffff:ffff:ffff,GB +2001:470:18c3:8000::,2001:470:18cc:ffff:ffff:ffff:ffff:ffff,US +2001:470:18cd::,2001:470:18cd:7fff:ffff:ffff:ffff:ffff,GB +2001:470:18cd:8000::,2001:470:18d6:ffff:ffff:ffff:ffff:ffff,US +2001:470:18d7::,2001:470:18d7:7fff:ffff:ffff:ffff:ffff,GB +2001:470:18d7:8000::,2001:470:18d8:ffff:ffff:ffff:ffff:ffff,US +2001:470:18d9::,2001:470:18d9:7fff:ffff:ffff:ffff:ffff,ZA +2001:470:18d9:8000::,2001:470:191f:ffff:ffff:ffff:ffff:ffff,US +2001:470:1920::,2001:470:1920:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1920:8000::,2001:470:1920:ffff:ffff:ffff:ffff:ffff,US +2001:470:1921::,2001:470:1921:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1921:8000::,2001:470:1962:ffff:ffff:ffff:ffff:ffff,US +2001:470:1963::,2001:470:1963:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1963:8000::,2001:470:1973:ffff:ffff:ffff:ffff:ffff,US +2001:470:1974::,2001:470:1974:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1974:8000::,2001:470:1985:ffff:ffff:ffff:ffff:ffff,US +2001:470:1986::,2001:470:1986:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1986:8000::,2001:470:19a5:ffff:ffff:ffff:ffff:ffff,US +2001:470:19a6::,2001:470:19a6:7fff:ffff:ffff:ffff:ffff,GB +2001:470:19a6:8000::,2001:470:19a8:ffff:ffff:ffff:ffff:ffff,US +2001:470:19a9::,2001:470:19a9:7fff:ffff:ffff:ffff:ffff,GB +2001:470:19a9:8000::,2001:470:19cc:ffff:ffff:ffff:ffff:ffff,US +2001:470:19cd::,2001:470:19cd:7fff:ffff:ffff:ffff:ffff,GB +2001:470:19cd:8000::,2001:470:19d9:ffff:ffff:ffff:ffff:ffff,US +2001:470:19da::,2001:470:19da:7fff:ffff:ffff:ffff:ffff,GB +2001:470:19da:8000::,2001:470:19de:ffff:ffff:ffff:ffff:ffff,US +2001:470:19df::,2001:470:19df:7fff:ffff:ffff:ffff:ffff,GB +2001:470:19df:8000::,2001:470:19ff:ffff:ffff:ffff:ffff:ffff,US +2001:470:1a00::,2001:470:1a00:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1a00:8000::,2001:470:1a10:ffff:ffff:ffff:ffff:ffff,US +2001:470:1a11::,2001:470:1a11:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1a11:8000::,2001:470:1a3d:ffff:ffff:ffff:ffff:ffff,US +2001:470:1a3e::,2001:470:1a3e:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1a3e:8000::,2001:470:1ad8:ffff:ffff:ffff:ffff:ffff,US +2001:470:1ad9::,2001:470:1ad9:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1ad9:8000::,2001:470:1b1e:ffff:ffff:ffff:ffff:ffff,US +2001:470:1b1f::,2001:470:1b1f:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1b1f:8000::,2001:470:1b2d:ffff:ffff:ffff:ffff:ffff,US +2001:470:1b2e::,2001:470:1b2e:ffff:ffff:ffff:ffff:ffff,GB +2001:470:1b2f::,2001:470:1b4a:ffff:ffff:ffff:ffff:ffff,US +2001:470:1b4b::,2001:470:1b4b:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1b4b:8000::,2001:470:1b62:ffff:ffff:ffff:ffff:ffff,US +2001:470:1b63::,2001:470:1b63:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1b63:8000::,2001:470:1bc7:ffff:ffff:ffff:ffff:ffff,US +2001:470:1bc8::,2001:470:1bc8:7fff:ffff:ffff:ffff:ffff,PT +2001:470:1bc8:8000::,2001:470:1c09:ffff:ffff:ffff:ffff:ffff,US +2001:470:1c0a::,2001:470:1c0a:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1c0a:8000::,2001:470:1d20:ffff:ffff:ffff:ffff:ffff,US +2001:470:1d21::,2001:470:1d21:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1d21:8000::,2001:470:1d32:ffff:ffff:ffff:ffff:ffff,US +2001:470:1d33::,2001:470:1d33:7fff:ffff:ffff:ffff:ffff,GB +2001:470:1d33:8000::,2001:470:1f00:ffff:ffff:ffff:ffff:ffff,US +2001:470:1f01::,2001:470:1f01:7fff:ffff:ffff:ffff:ffff,NZ +2001:470:1f01:8000::,2001:470:1f07:ffff:ffff:ffff:ffff:ffff,US +2001:470:1f08::,2001:470:1f08:fff:ffff:ffff:ffff:ffff,GB +2001:470:1f08:1000::,2001:470:1f08:1219:ffff:ffff:ffff:ffff,US +2001:470:1f08:121a::,2001:470:1f08:121a:ffff:ffff:ffff:ffff,GB +2001:470:1f08:121b::,2001:470:1f08:1367:ffff:ffff:ffff:ffff,US +2001:470:1f08:1368::,2001:470:1f08:1368:ffff:ffff:ffff:ffff,GB +2001:470:1f08:1369::,2001:470:1f09:114:ffff:ffff:ffff:ffff,US +2001:470:1f09:115::,2001:470:1f09:115:ffff:ffff:ffff:ffff,GB +2001:470:1f09:116::,2001:470:1f09:2b5:ffff:ffff:ffff:ffff,US +2001:470:1f09:2b6::,2001:470:1f09:2b6:ffff:ffff:ffff:ffff,GB +2001:470:1f09:2b7::,2001:470:1f09:414:ffff:ffff:ffff:ffff,US +2001:470:1f09:415::,2001:470:1f09:415:ffff:ffff:ffff:ffff,GB +2001:470:1f09:416::,2001:470:1f09:1219:ffff:ffff:ffff:ffff,US +2001:470:1f09:121a::,2001:470:1f09:121a:ffff:ffff:ffff:ffff,GB +2001:470:1f09:121b::,2001:470:1f09:1367:ffff:ffff:ffff:ffff,US +2001:470:1f09:1368::,2001:470:1f09:1368:ffff:ffff:ffff:ffff,GB +2001:470:1f09:1369::,2001:470:1f0a:1ff:ffff:ffff:ffff:ffff,US +2001:470:1f0a:200::,2001:470:1f0a:3ff:ffff:ffff:ffff:ffff,DE +2001:470:1f0a:400::,2001:470:1f0b:30e:ffff:ffff:ffff:ffff,US +2001:470:1f0b:30f::,2001:470:1f0b:30f:ffff:ffff:ffff:ffff,DE +2001:470:1f0b:310::,2001:470:1f0b:4b0:ffff:ffff:ffff:ffff,US +2001:470:1f0b:4b1::,2001:470:1f0b:4b1:ffff:ffff:ffff:ffff,UA +2001:470:1f0b:4b2::,2001:470:1f0b:59f:ffff:ffff:ffff:ffff,US +2001:470:1f0b:5a0::,2001:470:1f0b:5a0:ffff:ffff:ffff:ffff,AT +2001:470:1f0b:5a1::,2001:470:1f0b:779:ffff:ffff:ffff:ffff,US +2001:470:1f0b:77a::,2001:470:1f0b:77a:ffff:ffff:ffff:ffff,DE +2001:470:1f0b:77b::,2001:470:1f0b:784:ffff:ffff:ffff:ffff,US +2001:470:1f0b:785::,2001:470:1f0b:785:ffff:ffff:ffff:ffff,PL +2001:470:1f0b:786::,2001:470:1f0b:be6:ffff:ffff:ffff:ffff,US +2001:470:1f0b:be7::,2001:470:1f0b:be7:ffff:ffff:ffff:ffff,RU +2001:470:1f0b:be8::,2001:470:1f0b:118a:ffff:ffff:ffff:ffff,US +2001:470:1f0b:118b::,2001:470:1f0b:118b:ffff:ffff:ffff:ffff,DE +2001:470:1f0b:118c::,2001:470:1f0b:11d1:ffff:ffff:ffff:ffff,US +2001:470:1f0b:11d2::,2001:470:1f0b:11d2:ffff:ffff:ffff:ffff,DE +2001:470:1f0b:11d3::,2001:470:1f15:b3:ffff:ffff:ffff:ffff,US +2001:470:1f15:b4::,2001:470:1f15:b4:ffff:ffff:ffff:ffff,NL +2001:470:1f15:b5::,2001:470:1f15:16b:ffff:ffff:ffff:ffff,US +2001:470:1f15:16c::,2001:470:1f15:16c:ffff:ffff:ffff:ffff,NL +2001:470:1f15:16d::,2001:470:1f15:20f:ffff:ffff:ffff:ffff,US +2001:470:1f15:210::,2001:470:1f15:210:ffff:ffff:ffff:ffff,NL +2001:470:1f15:211::,2001:470:1f15:44f:ffff:ffff:ffff:ffff,US +2001:470:1f15:450::,2001:470:1f15:450:ffff:ffff:ffff:ffff,NL +2001:470:1f15:451::,2001:470:1f15:500:ffff:ffff:ffff:ffff,US +2001:470:1f15:501::,2001:470:1f15:501:ffff:ffff:ffff:ffff,NL +2001:470:1f15:502::,2001:470:1f15:582:ffff:ffff:ffff:ffff,US +2001:470:1f15:583::,2001:470:1f15:583:ffff:ffff:ffff:ffff,NL +2001:470:1f15:584::,2001:470:1f15:5ab:ffff:ffff:ffff:ffff,US +2001:470:1f15:5ac::,2001:470:1f15:5ac:ffff:ffff:ffff:ffff,NL +2001:470:1f15:5ad::,2001:470:1f15:9c5:ffff:ffff:ffff:ffff,US +2001:470:1f15:9c6::,2001:470:1f15:9c6:ffff:ffff:ffff:ffff,AT +2001:470:1f15:9c7::,2001:470:1f15:a5e:ffff:ffff:ffff:ffff,US +2001:470:1f15:a5f::,2001:470:1f15:a60:ffff:ffff:ffff:ffff,NL +2001:470:1f15:a61::,2001:470:1f15:b25:ffff:ffff:ffff:ffff,US +2001:470:1f15:b26::,2001:470:1f15:b26:ffff:ffff:ffff:ffff,NL +2001:470:1f15:b27::,2001:470:1f15:10db:ffff:ffff:ffff:ffff,US +2001:470:1f15:10dc::,2001:470:1f15:10dc:ffff:ffff:ffff:ffff,NL +2001:470:1f15:10dd::,2001:470:1f15:110b:ffff:ffff:ffff:ffff,US +2001:470:1f15:110c::,2001:470:1f15:110c:ffff:ffff:ffff:ffff,BE +2001:470:1f15:110d::,2001:470:1f16:1ff:ffff:ffff:ffff:ffff,US +2001:470:1f16:200::,2001:470:1f16:2ff:ffff:ffff:ffff:ffff,CA +2001:470:1f16:300::,2001:470:1f16:ffff:ffff:ffff:ffff:ffff,US +2001:470:1f17::,2001:470:1f17:ff:ffff:ffff:ffff:ffff,MX +2001:470:1f17:100::,2001:470:1f1d:195:ffff:ffff:ffff:ffff,US +2001:470:1f1d:196::,2001:470:1f1d:196:ffff:ffff:ffff:ffff,GB +2001:470:1f1d:197::,2001:470:1f1d:929:ffff:ffff:ffff:ffff,US +2001:470:1f1d:92a::,2001:470:1f1d:92a:ffff:ffff:ffff:ffff,GB +2001:470:1f1d:92b::,2001:470:1f1d:a59:ffff:ffff:ffff:ffff,US +2001:470:1f1d:a5a::,2001:470:1f1d:a5a:ffff:ffff:ffff:ffff,GB +2001:470:1f1d:a5b::,2001:470:1f1e:ffff:ffff:ffff:ffff:ffff,US +2001:470:1f1f::,2001:470:1f1f:ff:ffff:ffff:ffff:ffff,AU +2001:470:1f1f:100::,2001:470:1f21:37:ffff:ffff:ffff:ffff,US +2001:470:1f21:38::,2001:470:1f21:38:ffff:ffff:ffff:ffff,PT +2001:470:1f21:39::,2001:470:1f22:ffff:ffff:ffff:ffff:ffff,US +2001:470:1f23::,2001:470:1f23:7fff:ffff:ffff:ffff:ffff,ZA +2001:470:1f23:8000::,2001:470:2000:ffff:ffff:ffff:ffff:ffff,US +2001:470:2001::,2001:470:2001:7fff:ffff:ffff:ffff:ffff,UA +2001:470:2001:8000::,2001:470:206d:ffff:ffff:ffff:ffff:ffff,US +2001:470:206e::,2001:470:206e:7fff:ffff:ffff:ffff:ffff,RO +2001:470:206e:8000::,2001:470:207f:ffff:ffff:ffff:ffff:ffff,US +2001:470:2080::,2001:470:2080:7fff:ffff:ffff:ffff:ffff,UA +2001:470:2080:8000::,2001:470:20c1:ffff:ffff:ffff:ffff:ffff,US +2001:470:20c2::,2001:470:20c2:7fff:ffff:ffff:ffff:ffff,HU +2001:470:20c2:8000::,2001:470:20f1:ffff:ffff:ffff:ffff:ffff,US +2001:470:20f2::,2001:470:20f2:7fff:ffff:ffff:ffff:ffff,HU +2001:470:20f2:8000::,2001:470:2102:ffff:ffff:ffff:ffff:ffff,US +2001:470:2103::,2001:470:2103:7fff:ffff:ffff:ffff:ffff,BG +2001:470:2103:8000::,2001:470:2104:ffff:ffff:ffff:ffff:ffff,US +2001:470:2105::,2001:470:2105:7fff:ffff:ffff:ffff:ffff,AT +2001:470:2105:8000::,2001:470:2128:ffff:ffff:ffff:ffff:ffff,US +2001:470:2129::,2001:470:2129:7fff:ffff:ffff:ffff:ffff,HU +2001:470:2129:8000::,2001:470:2166:ffff:ffff:ffff:ffff:ffff,US +2001:470:2167::,2001:470:2167:7fff:ffff:ffff:ffff:ffff,TR +2001:470:2167:8000::,2001:470:216f:ffff:ffff:ffff:ffff:ffff,US +2001:470:2170::,2001:470:2170:7fff:ffff:ffff:ffff:ffff,AT +2001:470:2170:8000::,2001:470:2184:ffff:ffff:ffff:ffff:ffff,US +2001:470:2185::,2001:470:2185:7fff:ffff:ffff:ffff:ffff,AT +2001:470:2185:8000::,2001:470:21fb:ffff:ffff:ffff:ffff:ffff,US +2001:470:21fc::,2001:470:21fc:7fff:ffff:ffff:ffff:ffff,UA +2001:470:21fc:8000::,2001:470:2218:ffff:ffff:ffff:ffff:ffff,US +2001:470:2219::,2001:470:2219:7fff:ffff:ffff:ffff:ffff,HU +2001:470:2219:8000::,2001:470:28d8:ffff:ffff:ffff:ffff:ffff,US +2001:470:28d9::,2001:470:28d9:7fff:ffff:ffff:ffff:ffff,CN +2001:470:28d9:8000::,2001:470:3049:ffff:ffff:ffff:ffff:ffff,US +2001:470:304a::,2001:470:304a:7fff:ffff:ffff:ffff:ffff,MX +2001:470:304a:8000::,2001:470:30b8:ffff:ffff:ffff:ffff:ffff,US +2001:470:30b9::,2001:470:30b9:7fff:ffff:ffff:ffff:ffff,CA +2001:470:30b9:8000::,2001:470:30ea:ffff:ffff:ffff:ffff:ffff,US +2001:470:30eb::,2001:470:30eb:7fff:ffff:ffff:ffff:ffff,CA +2001:470:30eb:8000::,2001:470:3918:ffff:ffff:ffff:ffff:ffff,US +2001:470:3919::,2001:470:3919:7fff:ffff:ffff:ffff:ffff,AU +2001:470:3919:8000::,2001:470:4a08:ffff:ffff:ffff:ffff:ffff,US +2001:470:4a09::,2001:470:4a09:7fff:ffff:ffff:ffff:ffff,CA +2001:470:4a09:8000::,2001:470:4a60:ffff:ffff:ffff:ffff:ffff,US +2001:470:4a61::,2001:470:4a61:7fff:ffff:ffff:ffff:ffff,CN +2001:470:4a61:8000::,2001:470:4a63:ffff:ffff:ffff:ffff:ffff,US +2001:470:4a64::,2001:470:4a64:ffff:ffff:ffff:ffff:ffff,NZ +2001:470:4a65::,2001:470:4a77:ffff:ffff:ffff:ffff:ffff,US +2001:470:4a78::,2001:470:4a78:7fff:ffff:ffff:ffff:ffff,GB +2001:470:4a78:8000::,2001:470:4baa:7fff:ffff:ffff:ffff:ffff,US +2001:470:4baa:8000::,2001:470:4baa:ffff:ffff:ffff:ffff:ffff,CN +2001:470:4bab::,2001:470:4bbb:ffff:ffff:ffff:ffff:ffff,US +2001:470:4bbc::,2001:470:4bbc:7fff:ffff:ffff:ffff:ffff,CN +2001:470:4bbc:8000::,2001:470:5065:ffff:ffff:ffff:ffff:ffff,US +2001:470:5066::,2001:470:5066:7fff:ffff:ffff:ffff:ffff,DE +2001:470:5066:8000::,2001:470:5090:ffff:ffff:ffff:ffff:ffff,US +2001:470:5091::,2001:470:5091:7fff:ffff:ffff:ffff:ffff,DE +2001:470:5091:8000::,2001:470:5106:ffff:ffff:ffff:ffff:ffff,US +2001:470:5107::,2001:470:5107:7fff:ffff:ffff:ffff:ffff,DE +2001:470:5107:8000::,2001:470:5167:ffff:ffff:ffff:ffff:ffff,US +2001:470:5168::,2001:470:5168:7fff:ffff:ffff:ffff:ffff,DE +2001:470:5168:8000::,2001:470:519d:ffff:ffff:ffff:ffff:ffff,US +2001:470:519e::,2001:470:519e:7fff:ffff:ffff:ffff:ffff,DE +2001:470:519e:8000::,2001:470:51d8:ffff:ffff:ffff:ffff:ffff,US +2001:470:51d9::,2001:470:51d9:7fff:ffff:ffff:ffff:ffff,DE +2001:470:51d9:8000::,2001:470:52ba:ffff:ffff:ffff:ffff:ffff,US +2001:470:52bb::,2001:470:52bb:7fff:ffff:ffff:ffff:ffff,UA +2001:470:52bb:8000::,2001:470:5329:ffff:ffff:ffff:ffff:ffff,US +2001:470:532a::,2001:470:532a:7fff:ffff:ffff:ffff:ffff,DE +2001:470:532a:8000::,2001:470:581f:ffff:ffff:ffff:ffff:ffff,US +2001:470:5820::,2001:470:5820:ffff:ffff:ffff:ffff:ffff,CZ +2001:470:5821::,2001:470:591d:7fff:ffff:ffff:ffff:ffff,US +2001:470:591d:8000::,2001:470:591d:ffff:ffff:ffff:ffff:ffff,CZ +2001:470:591e::,2001:470:59c0:ffff:ffff:ffff:ffff:ffff,US +2001:470:59c1::,2001:470:59c1:7fff:ffff:ffff:ffff:ffff,CZ +2001:470:59c1:8000::,2001:470:59d7:ffff:ffff:ffff:ffff:ffff,US +2001:470:59d8::,2001:470:59d8:7fff:ffff:ffff:ffff:ffff,CZ +2001:470:59d8:8000::,2001:470:59ed:ffff:ffff:ffff:ffff:ffff,US +2001:470:59ee::,2001:470:59ee:7fff:ffff:ffff:ffff:ffff,SK +2001:470:59ee:8000::,2001:470:59ff:ffff:ffff:ffff:ffff:ffff,US +2001:470:5a00::,2001:470:5a00:7fff:ffff:ffff:ffff:ffff,CZ +2001:470:5a00:8000::,2001:470:5a0d:ffff:ffff:ffff:ffff:ffff,US +2001:470:5a0e::,2001:470:5a0e:7fff:ffff:ffff:ffff:ffff,CZ +2001:470:5a0e:8000::,2001:470:5a2e:ffff:ffff:ffff:ffff:ffff,US +2001:470:5a2f::,2001:470:5a2f:7fff:ffff:ffff:ffff:ffff,CZ +2001:470:5a2f:8000::,2001:470:5a34:ffff:ffff:ffff:ffff:ffff,US +2001:470:5a35::,2001:470:5a35:ffff:ffff:ffff:ffff:ffff,CZ +2001:470:5a36::,2001:470:5a39:ffff:ffff:ffff:ffff:ffff,US +2001:470:5a3a::,2001:470:5a3a:ffff:ffff:ffff:ffff:ffff,CZ +2001:470:5a3b::,2001:470:5a80:ffff:ffff:ffff:ffff:ffff,US +2001:470:5a81::,2001:470:5a81:ffff:ffff:ffff:ffff:ffff,CZ +2001:470:5a82::,2001:470:5aed:ffff:ffff:ffff:ffff:ffff,US +2001:470:5aee::,2001:470:5aee:7fff:ffff:ffff:ffff:ffff,AT +2001:470:5aee:8000::,2001:470:5b15:ffff:ffff:ffff:ffff:ffff,US +2001:470:5b16::,2001:470:5b16:7fff:ffff:ffff:ffff:ffff,SK +2001:470:5b16:8000::,2001:470:5b55:ffff:ffff:ffff:ffff:ffff,US +2001:470:5b56::,2001:470:5b56:7fff:ffff:ffff:ffff:ffff,CZ +2001:470:5b56:8000::,2001:470:5b6c:7fff:ffff:ffff:ffff:ffff,US +2001:470:5b6c:8000::,2001:470:5b6c:ffff:ffff:ffff:ffff:ffff,CZ +2001:470:5b6d::,2001:470:5bb1:ffff:ffff:ffff:ffff:ffff,US +2001:470:5bb2::,2001:470:5bb2:7fff:ffff:ffff:ffff:ffff,CZ +2001:470:5bb2:8000::,2001:470:6004:ffff:ffff:ffff:ffff:ffff,US +2001:470:6005::,2001:470:6005:7fff:ffff:ffff:ffff:ffff,PL +2001:470:6005:8000::,2001:470:605e:ffff:ffff:ffff:ffff:ffff,US +2001:470:605f::,2001:470:605f:7fff:ffff:ffff:ffff:ffff,PL +2001:470:605f:8000::,2001:470:613e:7fff:ffff:ffff:ffff:ffff,US +2001:470:613e:8000::,2001:470:613e:ffff:ffff:ffff:ffff:ffff,PL +2001:470:613f::,2001:470:613f:ffff:ffff:ffff:ffff:ffff,US +2001:470:6140::,2001:470:6140:7fff:ffff:ffff:ffff:ffff,PL +2001:470:6140:8000::,2001:470:6228:ffff:ffff:ffff:ffff:ffff,US +2001:470:6229::,2001:470:6229:7fff:ffff:ffff:ffff:ffff,PL +2001:470:6229:8000::,2001:470:627f:ffff:ffff:ffff:ffff:ffff,US +2001:470:6280::,2001:470:6280:7fff:ffff:ffff:ffff:ffff,PL +2001:470:6280:8000::,2001:470:62d4:ffff:ffff:ffff:ffff:ffff,US +2001:470:62d5::,2001:470:62d5:7fff:ffff:ffff:ffff:ffff,RU +2001:470:62d5:8000::,2001:470:6316:ffff:ffff:ffff:ffff:ffff,US +2001:470:6317::,2001:470:6317:7fff:ffff:ffff:ffff:ffff,PL +2001:470:6317:8000::,2001:470:632d:ffff:ffff:ffff:ffff:ffff,US +2001:470:632e::,2001:470:632e:7fff:ffff:ffff:ffff:ffff,RU +2001:470:632e:8000::,2001:470:645e:ffff:ffff:ffff:ffff:ffff,US +2001:470:645f::,2001:470:645f:7fff:ffff:ffff:ffff:ffff,PL +2001:470:645f:8000::,2001:470:6857:ffff:ffff:ffff:ffff:ffff,US +2001:470:6858::,2001:470:6858:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6858:8000::,2001:470:686f:ffff:ffff:ffff:ffff:ffff,US +2001:470:6870::,2001:470:6870:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6870:8000::,2001:470:6878:7fff:ffff:ffff:ffff:ffff,US +2001:470:6878:8000::,2001:470:6878:ffff:ffff:ffff:ffff:ffff,AT +2001:470:6879::,2001:470:68bd:ffff:ffff:ffff:ffff:ffff,US +2001:470:68be::,2001:470:68be:7fff:ffff:ffff:ffff:ffff,GB +2001:470:68be:8000::,2001:470:68cb:ffff:ffff:ffff:ffff:ffff,US +2001:470:68cc::,2001:470:68cc:7fff:ffff:ffff:ffff:ffff,IT +2001:470:68cc:8000::,2001:470:691d:ffff:ffff:ffff:ffff:ffff,US +2001:470:691e::,2001:470:691e:7fff:ffff:ffff:ffff:ffff,GB +2001:470:691e:8000::,2001:470:6924:ffff:ffff:ffff:ffff:ffff,US +2001:470:6925::,2001:470:6925:7fff:ffff:ffff:ffff:ffff,ES +2001:470:6925:8000::,2001:470:6953:ffff:ffff:ffff:ffff:ffff,US +2001:470:6954::,2001:470:6954:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6954:8000::,2001:470:6a28:ffff:ffff:ffff:ffff:ffff,US +2001:470:6a29::,2001:470:6a29:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6a29:8000::,2001:470:6a4d:ffff:ffff:ffff:ffff:ffff,US +2001:470:6a4e::,2001:470:6a4e:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6a4e:8000::,2001:470:6a51:ffff:ffff:ffff:ffff:ffff,US +2001:470:6a52::,2001:470:6a52:7fff:ffff:ffff:ffff:ffff,IT +2001:470:6a52:8000::,2001:470:6a62:ffff:ffff:ffff:ffff:ffff,US +2001:470:6a63::,2001:470:6a63:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6a63:8000::,2001:470:6ad1:ffff:ffff:ffff:ffff:ffff,US +2001:470:6ad2::,2001:470:6ad2:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6ad2:8000::,2001:470:6b28:ffff:ffff:ffff:ffff:ffff,US +2001:470:6b29::,2001:470:6b29:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6b29:8000::,2001:470:6bb1:ffff:ffff:ffff:ffff:ffff,US +2001:470:6bb2::,2001:470:6bb2:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6bb2:8000::,2001:470:6be2:7fff:ffff:ffff:ffff:ffff,US +2001:470:6be2:8000::,2001:470:6be2:ffff:ffff:ffff:ffff:ffff,GB +2001:470:6be3::,2001:470:6c1b:ffff:ffff:ffff:ffff:ffff,US +2001:470:6c1c::,2001:470:6c1c:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6c1c:8000::,2001:470:6c1f:ffff:ffff:ffff:ffff:ffff,US +2001:470:6c20::,2001:470:6c20:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6c20:8000::,2001:470:6c2a:ffff:ffff:ffff:ffff:ffff,US +2001:470:6c2b::,2001:470:6c2b:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6c2b:8000::,2001:470:6c3a:ffff:ffff:ffff:ffff:ffff,US +2001:470:6c3b::,2001:470:6c3b:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6c3b:8000::,2001:470:6c3d:ffff:ffff:ffff:ffff:ffff,US +2001:470:6c3e::,2001:470:6c3e:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6c3e:8000::,2001:470:6c8e:ffff:ffff:ffff:ffff:ffff,US +2001:470:6c8f::,2001:470:6c8f:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6c8f:8000::,2001:470:6caa:ffff:ffff:ffff:ffff:ffff,US +2001:470:6cab::,2001:470:6cab:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6cab:8000::,2001:470:6cad:ffff:ffff:ffff:ffff:ffff,US +2001:470:6cae::,2001:470:6cae:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6cae:8000::,2001:470:6cda:ffff:ffff:ffff:ffff:ffff,US +2001:470:6cdb::,2001:470:6cdb:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6cdb:8000::,2001:470:6ce3:ffff:ffff:ffff:ffff:ffff,US +2001:470:6ce4::,2001:470:6ce4:7fff:ffff:ffff:ffff:ffff,RU +2001:470:6ce4:8000::,2001:470:6d28:ffff:ffff:ffff:ffff:ffff,US +2001:470:6d29::,2001:470:6d29:ffff:ffff:ffff:ffff:ffff,GB +2001:470:6d2a::,2001:470:6d70:ffff:ffff:ffff:ffff:ffff,US +2001:470:6d71::,2001:470:6d71:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6d71:8000::,2001:470:6d74:ffff:ffff:ffff:ffff:ffff,US +2001:470:6d75::,2001:470:6d75:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6d75:8000::,2001:470:6d75:ffff:ffff:ffff:ffff:ffff,US +2001:470:6d76::,2001:470:6d76:ffff:ffff:ffff:ffff:ffff,GB +2001:470:6d77::,2001:470:6d7a:ffff:ffff:ffff:ffff:ffff,US +2001:470:6d7b::,2001:470:6d7b:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6d7b:8000::,2001:470:6e04:ffff:ffff:ffff:ffff:ffff,US +2001:470:6e05::,2001:470:6e05:7fff:ffff:ffff:ffff:ffff,GR +2001:470:6e05:8000::,2001:470:6e14:ffff:ffff:ffff:ffff:ffff,US +2001:470:6e15::,2001:470:6e15:7fff:ffff:ffff:ffff:ffff,ZA +2001:470:6e15:8000::,2001:470:6e1a:ffff:ffff:ffff:ffff:ffff,US +2001:470:6e1b::,2001:470:6e1b:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6e1b:8000::,2001:470:6ef4:ffff:ffff:ffff:ffff:ffff,US +2001:470:6ef5::,2001:470:6ef5:7fff:ffff:ffff:ffff:ffff,GB +2001:470:6ef5:8000::,2001:470:6f5b:ffff:ffff:ffff:ffff:ffff,US +2001:470:6f5c::,2001:470:6f5c:ffff:ffff:ffff:ffff:ffff,GB +2001:470:6f5d::,2001:470:700c:ffff:ffff:ffff:ffff:ffff,US +2001:470:700d::,2001:470:700d:7fff:ffff:ffff:ffff:ffff,DE +2001:470:700d:8000::,2001:470:701e:ffff:ffff:ffff:ffff:ffff,US +2001:470:701f::,2001:470:701f:7fff:ffff:ffff:ffff:ffff,DE +2001:470:701f:8000::,2001:470:703f:7fff:ffff:ffff:ffff:ffff,US +2001:470:703f:8000::,2001:470:703f:ffff:ffff:ffff:ffff:ffff,DE +2001:470:7040::,2001:470:710f:ffff:ffff:ffff:ffff:ffff,US +2001:470:7110::,2001:470:7110:7fff:ffff:ffff:ffff:ffff,RU +2001:470:7110:8000::,2001:470:7135:ffff:ffff:ffff:ffff:ffff,US +2001:470:7136::,2001:470:7136:7fff:ffff:ffff:ffff:ffff,DE +2001:470:7136:8000::,2001:470:7142:ffff:ffff:ffff:ffff:ffff,US +2001:470:7143::,2001:470:7143:7fff:ffff:ffff:ffff:ffff,DE +2001:470:7143:8000::,2001:470:714c:ffff:ffff:ffff:ffff:ffff,US +2001:470:714d::,2001:470:714d:7fff:ffff:ffff:ffff:ffff,DE +2001:470:714d:8000::,2001:470:7170:ffff:ffff:ffff:ffff:ffff,US +2001:470:7171::,2001:470:7171:ffff:ffff:ffff:ffff:ffff,DE +2001:470:7172::,2001:470:718d:ffff:ffff:ffff:ffff:ffff,US +2001:470:718e::,2001:470:718e:7fff:ffff:ffff:ffff:ffff,DE +2001:470:718e:8000::,2001:470:7204:ffff:ffff:ffff:ffff:ffff,US +2001:470:7205::,2001:470:7205:7fff:ffff:ffff:ffff:ffff,DE +2001:470:7205:8000::,2001:470:7224:ffff:ffff:ffff:ffff:ffff,US +2001:470:7225::,2001:470:7225:7fff:ffff:ffff:ffff:ffff,RU +2001:470:7225:8000::,2001:470:7257:ffff:ffff:ffff:ffff:ffff,US +2001:470:7258::,2001:470:7258:7fff:ffff:ffff:ffff:ffff,HR +2001:470:7258:8000::,2001:470:7263:ffff:ffff:ffff:ffff:ffff,US +2001:470:7264::,2001:470:7264:7fff:ffff:ffff:ffff:ffff,AT +2001:470:7264:8000::,2001:470:7271:ffff:ffff:ffff:ffff:ffff,US +2001:470:7272::,2001:470:7272:ffff:ffff:ffff:ffff:ffff,DE +2001:470:7273::,2001:470:727f:ffff:ffff:ffff:ffff:ffff,US +2001:470:7280::,2001:470:7280:7fff:ffff:ffff:ffff:ffff,DE +2001:470:7280:8000::,2001:470:7286:ffff:ffff:ffff:ffff:ffff,US +2001:470:7287::,2001:470:7287:ffff:ffff:ffff:ffff:ffff,PL +2001:470:7288::,2001:470:7292:ffff:ffff:ffff:ffff:ffff,US +2001:470:7293::,2001:470:7293:7fff:ffff:ffff:ffff:ffff,IT +2001:470:7293:8000::,2001:470:72d1:ffff:ffff:ffff:ffff:ffff,US +2001:470:72d2::,2001:470:72d2:7fff:ffff:ffff:ffff:ffff,RU +2001:470:72d2:8000::,2001:470:72da:ffff:ffff:ffff:ffff:ffff,US +2001:470:72db::,2001:470:72db:7fff:ffff:ffff:ffff:ffff,RU +2001:470:72db:8000::,2001:470:730f:ffff:ffff:ffff:ffff:ffff,US +2001:470:7310::,2001:470:7310:7fff:ffff:ffff:ffff:ffff,DE +2001:470:7310:8000::,2001:470:7333:ffff:ffff:ffff:ffff:ffff,US +2001:470:7334::,2001:470:7334:7fff:ffff:ffff:ffff:ffff,DE +2001:470:7334:8000::,2001:470:733b:ffff:ffff:ffff:ffff:ffff,US +2001:470:733c::,2001:470:733c:7fff:ffff:ffff:ffff:ffff,RU +2001:470:733c:8000::,2001:470:733e:ffff:ffff:ffff:ffff:ffff,US +2001:470:733f::,2001:470:733f:7fff:ffff:ffff:ffff:ffff,DE +2001:470:733f:8000::,2001:470:7351:ffff:ffff:ffff:ffff:ffff,US +2001:470:7352::,2001:470:7352:7fff:ffff:ffff:ffff:ffff,RU +2001:470:7352:8000::,2001:470:7354:ffff:ffff:ffff:ffff:ffff,US +2001:470:7355::,2001:470:7355:7fff:ffff:ffff:ffff:ffff,DE +2001:470:7355:8000::,2001:470:73a7:7fff:ffff:ffff:ffff:ffff,US +2001:470:73a7:8000::,2001:470:73a7:ffff:ffff:ffff:ffff:ffff,RU +2001:470:73a8::,2001:470:7403:ffff:ffff:ffff:ffff:ffff,US +2001:470:7404::,2001:470:7404:7fff:ffff:ffff:ffff:ffff,DE +2001:470:7404:8000::,2001:470:7421:ffff:ffff:ffff:ffff:ffff,US +2001:470:7422::,2001:470:7422:ffff:ffff:ffff:ffff:ffff,DE +2001:470:7423::,2001:470:743e:ffff:ffff:ffff:ffff:ffff,US +2001:470:743f::,2001:470:743f:7fff:ffff:ffff:ffff:ffff,DE +2001:470:743f:8000::,2001:470:7479:ffff:ffff:ffff:ffff:ffff,US +2001:470:747a::,2001:470:747a:7fff:ffff:ffff:ffff:ffff,DE +2001:470:747a:8000::,2001:470:74b8:ffff:ffff:ffff:ffff:ffff,US +2001:470:74b9::,2001:470:74b9:7fff:ffff:ffff:ffff:ffff,RS +2001:470:74b9:8000::,2001:470:7507:ffff:ffff:ffff:ffff:ffff,US +2001:470:7508::,2001:470:7508:7fff:ffff:ffff:ffff:ffff,GR +2001:470:7508:8000::,2001:470:7557:ffff:ffff:ffff:ffff:ffff,US +2001:470:7558::,2001:470:7558:7fff:ffff:ffff:ffff:ffff,DE +2001:470:7558:8000::,2001:470:756e:ffff:ffff:ffff:ffff:ffff,US +2001:470:756f::,2001:470:756f:7fff:ffff:ffff:ffff:ffff,EG +2001:470:756f:8000::,2001:470:7572:7fff:ffff:ffff:ffff:ffff,US +2001:470:7572:8000::,2001:470:7572:ffff:ffff:ffff:ffff:ffff,DE +2001:470:7573::,2001:470:7594:ffff:ffff:ffff:ffff:ffff,US +2001:470:7595::,2001:470:7595:7fff:ffff:ffff:ffff:ffff,AT +2001:470:7595:8000::,2001:470:759e:ffff:ffff:ffff:ffff:ffff,US +2001:470:759f::,2001:470:759f:7fff:ffff:ffff:ffff:ffff,DE +2001:470:759f:8000::,2001:470:75b2:ffff:ffff:ffff:ffff:ffff,US +2001:470:75b3::,2001:470:75b3:7fff:ffff:ffff:ffff:ffff,DE +2001:470:75b3:8000::,2001:470:75e5:ffff:ffff:ffff:ffff:ffff,US +2001:470:75e6::,2001:470:75e6:ffff:ffff:ffff:ffff:ffff,RU +2001:470:75e7::,2001:470:7690:ffff:ffff:ffff:ffff:ffff,US +2001:470:7691::,2001:470:7691:7fff:ffff:ffff:ffff:ffff,DE +2001:470:7691:8000::,2001:470:76e0:ffff:ffff:ffff:ffff:ffff,US +2001:470:76e1::,2001:470:76e1:7fff:ffff:ffff:ffff:ffff,DE +2001:470:76e1:8000::,2001:470:77ac:ffff:ffff:ffff:ffff:ffff,US +2001:470:77ad::,2001:470:77ad:7fff:ffff:ffff:ffff:ffff,MD +2001:470:77ad:8000::,2001:470:7829:ffff:ffff:ffff:ffff:ffff,US +2001:470:782a::,2001:470:782a:7fff:ffff:ffff:ffff:ffff,NL +2001:470:782a:8000::,2001:470:782f:ffff:ffff:ffff:ffff:ffff,US +2001:470:7830::,2001:470:7830:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7830:8000::,2001:470:7844:ffff:ffff:ffff:ffff:ffff,US +2001:470:7845::,2001:470:7845:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7845:8000::,2001:470:7852:ffff:ffff:ffff:ffff:ffff,US +2001:470:7853::,2001:470:7853:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7853:8000::,2001:470:7859:ffff:ffff:ffff:ffff:ffff,US +2001:470:785a::,2001:470:785a:ffff:ffff:ffff:ffff:ffff,AT +2001:470:785b::,2001:470:7872:ffff:ffff:ffff:ffff:ffff,US +2001:470:7873::,2001:470:7873:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7873:8000::,2001:470:7893:ffff:ffff:ffff:ffff:ffff,US +2001:470:7894::,2001:470:7894:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7894:8000::,2001:470:789e:ffff:ffff:ffff:ffff:ffff,US +2001:470:789f::,2001:470:789f:7fff:ffff:ffff:ffff:ffff,NL +2001:470:789f:8000::,2001:470:789f:ffff:ffff:ffff:ffff:ffff,US +2001:470:78a0::,2001:470:78a0:7fff:ffff:ffff:ffff:ffff,DE +2001:470:78a0:8000::,2001:470:78c7:ffff:ffff:ffff:ffff:ffff,US +2001:470:78c8::,2001:470:78c8:7fff:ffff:ffff:ffff:ffff,NL +2001:470:78c8:8000::,2001:470:78db:ffff:ffff:ffff:ffff:ffff,US +2001:470:78dc::,2001:470:78dc:7fff:ffff:ffff:ffff:ffff,NL +2001:470:78dc:8000::,2001:470:78e8:ffff:ffff:ffff:ffff:ffff,US +2001:470:78e9::,2001:470:78e9:7fff:ffff:ffff:ffff:ffff,LV +2001:470:78e9:8000::,2001:470:78f6:ffff:ffff:ffff:ffff:ffff,US +2001:470:78f7::,2001:470:78f7:7fff:ffff:ffff:ffff:ffff,DE +2001:470:78f7:8000::,2001:470:7919:ffff:ffff:ffff:ffff:ffff,US +2001:470:791a::,2001:470:791a:7fff:ffff:ffff:ffff:ffff,PL +2001:470:791a:8000::,2001:470:79ae:ffff:ffff:ffff:ffff:ffff,US +2001:470:79af::,2001:470:79af:7fff:ffff:ffff:ffff:ffff,NL +2001:470:79af:8000::,2001:470:79dc:ffff:ffff:ffff:ffff:ffff,US +2001:470:79dd::,2001:470:79dd:7fff:ffff:ffff:ffff:ffff,NL +2001:470:79dd:8000::,2001:470:79ec:ffff:ffff:ffff:ffff:ffff,US +2001:470:79ed::,2001:470:79ed:7fff:ffff:ffff:ffff:ffff,RU +2001:470:79ed:8000::,2001:470:7a0e:ffff:ffff:ffff:ffff:ffff,US +2001:470:7a0f::,2001:470:7a0f:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7a0f:8000::,2001:470:7a2e:7fff:ffff:ffff:ffff:ffff,US +2001:470:7a2e:8000::,2001:470:7a2e:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7a2f::,2001:470:7a40:ffff:ffff:ffff:ffff:ffff,US +2001:470:7a41::,2001:470:7a41:7fff:ffff:ffff:ffff:ffff,RU +2001:470:7a41:8000::,2001:470:7a94:ffff:ffff:ffff:ffff:ffff,US +2001:470:7a95::,2001:470:7a95:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7a95:8000::,2001:470:7a99:ffff:ffff:ffff:ffff:ffff,US +2001:470:7a9a::,2001:470:7a9a:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7a9b::,2001:470:7a9b:ffff:ffff:ffff:ffff:ffff,US +2001:470:7a9c::,2001:470:7a9c:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7a9c:8000::,2001:470:7ab5:ffff:ffff:ffff:ffff:ffff,US +2001:470:7ab6::,2001:470:7ab6:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7ab6:8000::,2001:470:7ad1:ffff:ffff:ffff:ffff:ffff,US +2001:470:7ad2::,2001:470:7ad2:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7ad3::,2001:470:7ad5:ffff:ffff:ffff:ffff:ffff,US +2001:470:7ad6::,2001:470:7ad6:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7ad7::,2001:470:7aeb:7fff:ffff:ffff:ffff:ffff,US +2001:470:7aeb:8000::,2001:470:7aeb:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7aec::,2001:470:7b01:ffff:ffff:ffff:ffff:ffff,US +2001:470:7b02::,2001:470:7b02:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7b02:8000::,2001:470:7ba2:ffff:ffff:ffff:ffff:ffff,US +2001:470:7ba3::,2001:470:7ba3:7fff:ffff:ffff:ffff:ffff,RU +2001:470:7ba3:8000::,2001:470:7ba6:ffff:ffff:ffff:ffff:ffff,US +2001:470:7ba7::,2001:470:7ba7:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7ba7:8000::,2001:470:7bbf:ffff:ffff:ffff:ffff:ffff,US +2001:470:7bc0::,2001:470:7bc0:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7bc1::,2001:470:7d33:ffff:ffff:ffff:ffff:ffff,US +2001:470:7d34::,2001:470:7d34:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7d34:8000::,2001:470:7d60:ffff:ffff:ffff:ffff:ffff,US +2001:470:7d61::,2001:470:7d61:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7d61:8000::,2001:470:7d66:ffff:ffff:ffff:ffff:ffff,US +2001:470:7d67::,2001:470:7d67:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7d67:8000::,2001:470:7d6a:ffff:ffff:ffff:ffff:ffff,US +2001:470:7d6b::,2001:470:7d6b:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7d6c::,2001:470:7db1:ffff:ffff:ffff:ffff:ffff,US +2001:470:7db2::,2001:470:7db2:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7db2:8000::,2001:470:7dbd:ffff:ffff:ffff:ffff:ffff,US +2001:470:7dbe::,2001:470:7dbe:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7dbe:8000::,2001:470:7e38:ffff:ffff:ffff:ffff:ffff,US +2001:470:7e39::,2001:470:7e39:7fff:ffff:ffff:ffff:ffff,NL +2001:470:7e39:8000::,2001:470:7ea5:ffff:ffff:ffff:ffff:ffff,US +2001:470:7ea6::,2001:470:7ea6:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7ea7::,2001:470:80b6:ffff:ffff:ffff:ffff:ffff,US +2001:470:80b7::,2001:470:80b7:7fff:ffff:ffff:ffff:ffff,CN +2001:470:80b7:8000::,2001:470:81b0:ffff:ffff:ffff:ffff:ffff,US +2001:470:81b1::,2001:470:81b1:7fff:ffff:ffff:ffff:ffff,CN +2001:470:81b1:8000::,2001:470:823b:7fff:ffff:ffff:ffff:ffff,US +2001:470:823b:8000::,2001:470:823b:ffff:ffff:ffff:ffff:ffff,CA +2001:470:823c::,2001:470:83a5:ffff:ffff:ffff:ffff:ffff,US +2001:470:83a6::,2001:470:83a6:7fff:ffff:ffff:ffff:ffff,CN +2001:470:83a6:8000::,2001:470:843a:ffff:ffff:ffff:ffff:ffff,US +2001:470:843b::,2001:470:843b:7fff:ffff:ffff:ffff:ffff,NZ +2001:470:843b:8000::,2001:470:859e:ffff:ffff:ffff:ffff:ffff,US +2001:470:859f::,2001:470:859f:7fff:ffff:ffff:ffff:ffff,AU +2001:470:859f:8000::,2001:470:8924:7fff:ffff:ffff:ffff:ffff,US +2001:470:8924:8000::,2001:470:8924:ffff:ffff:ffff:ffff:ffff,CA +2001:470:8925::,2001:470:94eb:ffff:ffff:ffff:ffff:ffff,US +2001:470:94ec::,2001:470:94ec:ffff:ffff:ffff:ffff:ffff,IM +2001:470:94ed::,2001:470:9624:ffff:ffff:ffff:ffff:ffff,US +2001:470:9625::,2001:470:9625:7fff:ffff:ffff:ffff:ffff,GB +2001:470:9625:8000::,2001:470:9678:ffff:ffff:ffff:ffff:ffff,US +2001:470:9679::,2001:470:9679:7fff:ffff:ffff:ffff:ffff,GB +2001:470:9679:8000::,2001:470:96a0:ffff:ffff:ffff:ffff:ffff,US +2001:470:96a1::,2001:470:96a1:7fff:ffff:ffff:ffff:ffff,GB +2001:470:96a1:8000::,2001:470:971e:ffff:ffff:ffff:ffff:ffff,US +2001:470:971f::,2001:470:971f:7fff:ffff:ffff:ffff:ffff,GB +2001:470:971f:8000::,2001:470:9794:ffff:ffff:ffff:ffff:ffff,US +2001:470:9795::,2001:470:9795:ffff:ffff:ffff:ffff:ffff,GB +2001:470:9796::,2001:470:97d6:7fff:ffff:ffff:ffff:ffff,US +2001:470:97d6:8000::,2001:470:97d6:ffff:ffff:ffff:ffff:ffff,GB +2001:470:97d7::,2001:470:97f0:ffff:ffff:ffff:ffff:ffff,US +2001:470:97f1::,2001:470:97f1:7fff:ffff:ffff:ffff:ffff,GB +2001:470:97f1:8000::,2001:470:98a2:ffff:ffff:ffff:ffff:ffff,US +2001:470:98a3::,2001:470:98a3:7fff:ffff:ffff:ffff:ffff,IT +2001:470:98a3:8000::,2001:470:999c:ffff:ffff:ffff:ffff:ffff,US +2001:470:999d::,2001:470:999d:ffff:ffff:ffff:ffff:ffff,DE +2001:470:999e::,2001:470:9ccc:ffff:ffff:ffff:ffff:ffff,US +2001:470:9ccd::,2001:470:9ccd:7fff:ffff:ffff:ffff:ffff,DE +2001:470:9ccd:8000::,2001:470:9fa8:ffff:ffff:ffff:ffff:ffff,US +2001:470:9fa9::,2001:470:9fa9:7fff:ffff:ffff:ffff:ffff,DE +2001:470:9fa9:8000::,2001:470:b0e1:ffff:ffff:ffff:ffff:ffff,US +2001:470:b0e2::,2001:470:b0e2:ffff:ffff:ffff:ffff:ffff,CA +2001:470:b0e3::,2001:470:b160:ffff:ffff:ffff:ffff:ffff,US +2001:470:b161::,2001:470:b161:7fff:ffff:ffff:ffff:ffff,CA +2001:470:b161:8000::,2001:470:b285:ffff:ffff:ffff:ffff:ffff,US +2001:470:b286::,2001:470:b286:7fff:ffff:ffff:ffff:ffff,CA +2001:470:b286:8000::,2001:470:b2cf:ffff:ffff:ffff:ffff:ffff,US +2001:470:b2d0::,2001:470:b2d0:7fff:ffff:ffff:ffff:ffff,CA +2001:470:b2d0:8000::,2001:470:b310:ffff:ffff:ffff:ffff:ffff,US +2001:470:b311::,2001:470:b311:7fff:ffff:ffff:ffff:ffff,CA +2001:470:b311:8000::,2001:470:b3d7:ffff:ffff:ffff:ffff:ffff,US +2001:470:b3d8::,2001:470:b3d8:7fff:ffff:ffff:ffff:ffff,CA +2001:470:b3d8:8000::,2001:470:b40c:ffff:ffff:ffff:ffff:ffff,US +2001:470:b40d::,2001:470:b40d:7fff:ffff:ffff:ffff:ffff,CH +2001:470:b40d:8000::,2001:470:b41b:ffff:ffff:ffff:ffff:ffff,US +2001:470:b41c::,2001:470:b41c:7fff:ffff:ffff:ffff:ffff,CH +2001:470:b41c:8000::,2001:470:b436:ffff:ffff:ffff:ffff:ffff,US +2001:470:b437::,2001:470:b437:7fff:ffff:ffff:ffff:ffff,CH +2001:470:b437:8000::,2001:470:b44f:ffff:ffff:ffff:ffff:ffff,US +2001:470:b450::,2001:470:b450:7fff:ffff:ffff:ffff:ffff,CH +2001:470:b450:8000::,2001:470:b4a5:ffff:ffff:ffff:ffff:ffff,US +2001:470:b4a6::,2001:470:b4a6:7fff:ffff:ffff:ffff:ffff,HR +2001:470:b4a6:8000::,2001:470:b4e9:ffff:ffff:ffff:ffff:ffff,US +2001:470:b4ea::,2001:470:b4ea:ffff:ffff:ffff:ffff:ffff,AT +2001:470:b4eb::,2001:470:b510:ffff:ffff:ffff:ffff:ffff,US +2001:470:b511::,2001:470:b511:7fff:ffff:ffff:ffff:ffff,CH +2001:470:b511:8000::,2001:470:b531:ffff:ffff:ffff:ffff:ffff,US +2001:470:b532::,2001:470:b532:7fff:ffff:ffff:ffff:ffff,IL +2001:470:b532:8000::,2001:470:b539:ffff:ffff:ffff:ffff:ffff,US +2001:470:b53a::,2001:470:b53a:ffff:ffff:ffff:ffff:ffff,ES +2001:470:b53b::,2001:470:b5e8:ffff:ffff:ffff:ffff:ffff,US +2001:470:b5e9::,2001:470:b5e9:7fff:ffff:ffff:ffff:ffff,NO +2001:470:b5e9:8000::,2001:470:b625:ffff:ffff:ffff:ffff:ffff,US +2001:470:b626::,2001:470:b626:ff:ffff:ffff:ffff:ffff,DE +2001:470:b626:100::,2001:470:b662:ffff:ffff:ffff:ffff:ffff,US +2001:470:b663::,2001:470:b663:7fff:ffff:ffff:ffff:ffff,AT +2001:470:b663:8000::,2001:470:b670:ffff:ffff:ffff:ffff:ffff,US +2001:470:b671::,2001:470:b671:7fff:ffff:ffff:ffff:ffff,CH +2001:470:b671:8000::,2001:470:b674:ffff:ffff:ffff:ffff:ffff,US +2001:470:b675::,2001:470:b675:7fff:ffff:ffff:ffff:ffff,CH +2001:470:b675:8000::,2001:470:b6d3:ffff:ffff:ffff:ffff:ffff,US +2001:470:b6d4::,2001:470:b6d4:7fff:ffff:ffff:ffff:ffff,DE +2001:470:b6d4:8000::,2001:470:b77d:ffff:ffff:ffff:ffff:ffff,US +2001:470:b77e::,2001:470:b77e:7fff:ffff:ffff:ffff:ffff,AT +2001:470:b77e:8000::,2001:470:c322:ffff:ffff:ffff:ffff:ffff,US +2001:470:c323::,2001:470:c323:7fff:ffff:ffff:ffff:ffff,CA +2001:470:c323:8000::,2001:470:c3c2:ffff:ffff:ffff:ffff:ffff,US +2001:470:c3c3::,2001:470:c3c3:7fff:ffff:ffff:ffff:ffff,CA +2001:470:c3c3:8000::,2001:470:c453:ffff:ffff:ffff:ffff:ffff,US +2001:470:c454::,2001:470:c454:7fff:ffff:ffff:ffff:ffff,CA +2001:470:c454:8000::,2001:470:c825:ffff:ffff:ffff:ffff:ffff,US +2001:470:c826::,2001:470:c826:7fff:ffff:ffff:ffff:ffff,FR +2001:470:c826:8000::,2001:470:c82c:ffff:ffff:ffff:ffff:ffff,US +2001:470:c82d::,2001:470:c82d:7fff:ffff:ffff:ffff:ffff,LU +2001:470:c82d:8000::,2001:470:c84d:ffff:ffff:ffff:ffff:ffff,US +2001:470:c84e::,2001:470:c84e:7fff:ffff:ffff:ffff:ffff,FR +2001:470:c84e:8000::,2001:470:c886:ffff:ffff:ffff:ffff:ffff,US +2001:470:c887::,2001:470:c887:ffff:ffff:ffff:ffff:ffff,ES +2001:470:c888::,2001:470:c963:ffff:ffff:ffff:ffff:ffff,US +2001:470:c964::,2001:470:c964:ffff:ffff:ffff:ffff:ffff,GB +2001:470:c965::,2001:470:ca2b:ffff:ffff:ffff:ffff:ffff,US +2001:470:ca2c::,2001:470:ca2c:7fff:ffff:ffff:ffff:ffff,FR +2001:470:ca2c:8000::,2001:470:ca71:ffff:ffff:ffff:ffff:ffff,US +2001:470:ca72::,2001:470:ca72:7fff:ffff:ffff:ffff:ffff,FR +2001:470:ca72:8000::,2001:470:caeb:ffff:ffff:ffff:ffff:ffff,US +2001:470:caec::,2001:470:caec:7fff:ffff:ffff:ffff:ffff,FR +2001:470:caec:8000::,2001:470:cbd2:ffff:ffff:ffff:ffff:ffff,US +2001:470:cbd3::,2001:470:cbd3:7fff:ffff:ffff:ffff:ffff,FR +2001:470:cbd3:8000::,2001:470:ccb9:ffff:ffff:ffff:ffff:ffff,US +2001:470:ccba::,2001:470:ccba:7fff:ffff:ffff:ffff:ffff,ES +2001:470:ccba:8000::,2001:470:ccc1:ffff:ffff:ffff:ffff:ffff,US +2001:470:ccc2::,2001:470:ccc2:7fff:ffff:ffff:ffff:ffff,BE +2001:470:ccc2:8000::,2001:470:cd93:7fff:ffff:ffff:ffff:ffff,US +2001:470:cd93:8000::,2001:470:cd93:ffff:ffff:ffff:ffff:ffff,FR +2001:470:cd94::,2001:470:d175:ffff:ffff:ffff:ffff:ffff,US +2001:470:d176::,2001:470:d176:7fff:ffff:ffff:ffff:ffff,NL +2001:470:d176:8000::,2001:470:d19a:ffff:ffff:ffff:ffff:ffff,US +2001:470:d19b::,2001:470:d19b:7fff:ffff:ffff:ffff:ffff,BE +2001:470:d19b:8000::,2001:470:d2d5:ffff:ffff:ffff:ffff:ffff,US +2001:470:d2d6::,2001:470:d2d6:7fff:ffff:ffff:ffff:ffff,NL +2001:470:d2d6:8000::,2001:470:d673:7fff:ffff:ffff:ffff:ffff,US +2001:470:d673:8000::,2001:470:d673:ffff:ffff:ffff:ffff:ffff,BE +2001:470:d674::,2001:470:d6ee:ffff:ffff:ffff:ffff:ffff,US +2001:470:d6ef::,2001:470:d6ef:ffff:ffff:ffff:ffff:ffff,FR +2001:470:d6f0::,2001:470:d890:ffff:ffff:ffff:ffff:ffff,US +2001:470:d891::,2001:470:d891:7fff:ffff:ffff:ffff:ffff,BR +2001:470:d891:8000::,2001:470:da01:ffff:ffff:ffff:ffff:ffff,US +2001:470:da02::,2001:470:da02:7fff:ffff:ffff:ffff:ffff,AR +2001:470:da02:8000::,2001:470:da99:ffff:ffff:ffff:ffff:ffff,US +2001:470:da9a::,2001:470:da9a:7fff:ffff:ffff:ffff:ffff,BS +2001:470:da9a:8000::,2001:470:da9c:ffff:ffff:ffff:ffff:ffff,US +2001:470:da9d::,2001:470:da9d:7fff:ffff:ffff:ffff:ffff,BR +2001:470:da9d:8000::,2001:470:dbba:ffff:ffff:ffff:ffff:ffff,US +2001:470:dbbb::,2001:470:dbbb:7fff:ffff:ffff:ffff:ffff,BR +2001:470:dbbb:8000::,2001:470:dc23:ffff:ffff:ffff:ffff:ffff,US +2001:470:dc24::,2001:470:dc24:7fff:ffff:ffff:ffff:ffff,SE +2001:470:dc24:8000::,2001:470:dc44:ffff:ffff:ffff:ffff:ffff,US +2001:470:dc45::,2001:470:dc45:7fff:ffff:ffff:ffff:ffff,SE +2001:470:dc45:8000::,2001:470:dc8b:ffff:ffff:ffff:ffff:ffff,US +2001:470:dc8c::,2001:470:dc8c:7fff:ffff:ffff:ffff:ffff,SE +2001:470:dc8c:8000::,2001:470:dca5:ffff:ffff:ffff:ffff:ffff,US +2001:470:dca6::,2001:470:dca6:7fff:ffff:ffff:ffff:ffff,RU +2001:470:dca6:8000::,2001:470:dcb3:ffff:ffff:ffff:ffff:ffff,US +2001:470:dcb4::,2001:470:dcb4:7fff:ffff:ffff:ffff:ffff,NO +2001:470:dcb4:8000::,2001:470:dcba:ffff:ffff:ffff:ffff:ffff,US +2001:470:dcbb::,2001:470:dcbb:7fff:ffff:ffff:ffff:ffff,FI +2001:470:dcbb:8000::,2001:470:dce2:ffff:ffff:ffff:ffff:ffff,US +2001:470:dce3::,2001:470:dce3:7fff:ffff:ffff:ffff:ffff,SE +2001:470:dce3:8000::,2001:470:dd03:ffff:ffff:ffff:ffff:ffff,US +2001:470:dd04::,2001:470:dd04:7fff:ffff:ffff:ffff:ffff,SE +2001:470:dd04:8000::,2001:470:dd51:ffff:ffff:ffff:ffff:ffff,US +2001:470:dd52::,2001:470:dd52:7fff:ffff:ffff:ffff:ffff,IT +2001:470:dd52:8000::,2001:470:dd67:ffff:ffff:ffff:ffff:ffff,US +2001:470:dd68::,2001:470:dd68:ffff:ffff:ffff:ffff:ffff,DK +2001:470:dd69::,2001:470:dd8c:ffff:ffff:ffff:ffff:ffff,US +2001:470:dd8d::,2001:470:dd8d:7fff:ffff:ffff:ffff:ffff,RU +2001:470:dd8d:8000::,2001:470:de09:ffff:ffff:ffff:ffff:ffff,US +2001:470:de0a::,2001:470:de0a:7fff:ffff:ffff:ffff:ffff,NO +2001:470:de0a:8000::,2001:470:de0f:ffff:ffff:ffff:ffff:ffff,US +2001:470:de10::,2001:470:de10:7fff:ffff:ffff:ffff:ffff,LV +2001:470:de10:8000::,2001:470:de3f:ffff:ffff:ffff:ffff:ffff,US +2001:470:de40::,2001:470:de40:7fff:ffff:ffff:ffff:ffff,NO +2001:470:de40:8000::,2001:470:de41:ffff:ffff:ffff:ffff:ffff,US +2001:470:de42::,2001:470:de42:7fff:ffff:ffff:ffff:ffff,IS +2001:470:de42:8000::,2001:470:de97:ffff:ffff:ffff:ffff:ffff,US +2001:470:de98::,2001:470:de98:7fff:ffff:ffff:ffff:ffff,RU +2001:470:de98:8000::,2001:470:dea3:ffff:ffff:ffff:ffff:ffff,US +2001:470:dea4::,2001:470:dea4:7fff:ffff:ffff:ffff:ffff,SE +2001:470:dea4:8000::,2001:470:dec3:ffff:ffff:ffff:ffff:ffff,US +2001:470:dec4::,2001:470:dec4:ffff:ffff:ffff:ffff:ffff,SE +2001:470:dec5::,2001:470:ded3:ffff:ffff:ffff:ffff:ffff,US +2001:470:ded4::,2001:470:ded4:7fff:ffff:ffff:ffff:ffff,SE +2001:470:ded4:8000::,2001:470:dedd:ffff:ffff:ffff:ffff:ffff,US +2001:470:dede::,2001:470:dede:7fff:ffff:ffff:ffff:ffff,NO +2001:470:dede:8000::,2001:470:dee2:ffff:ffff:ffff:ffff:ffff,US +2001:470:dee3::,2001:470:dee3:ffff:ffff:ffff:ffff:ffff,NO +2001:470:dee4::,2001:470:df04:ffff:ffff:ffff:ffff:ffff,US +2001:470:df05::,2001:470:df05:7fff:ffff:ffff:ffff:ffff,SE +2001:470:df05:8000::,2001:470:df19:7fff:ffff:ffff:ffff:ffff,US +2001:470:df19:8000::,2001:470:df19:ffff:ffff:ffff:ffff:ffff,SE +2001:470:df1a::,2001:470:df40:ffff:ffff:ffff:ffff:ffff,US +2001:470:df41::,2001:470:df41:ffff:ffff:ffff:ffff:ffff,SE +2001:470:df42::,2001:470:df4f:ffff:ffff:ffff:ffff:ffff,US +2001:470:df50::,2001:470:df50:7fff:ffff:ffff:ffff:ffff,RU +2001:470:df50:8000::,2001:470:df6f:ffff:ffff:ffff:ffff:ffff,US +2001:470:df70::,2001:470:df70:7fff:ffff:ffff:ffff:ffff,SE +2001:470:df70:8000::,2001:470:df7c:ffff:ffff:ffff:ffff:ffff,US +2001:470:df7d::,2001:470:df7d:7fff:ffff:ffff:ffff:ffff,SE +2001:470:df7d:8000::,2001:470:dfa0:ffff:ffff:ffff:ffff:ffff,US +2001:470:dfa1::,2001:470:dfa1:7fff:ffff:ffff:ffff:ffff,SE +2001:470:dfa1:8000::,2001:470:dfb2:ffff:ffff:ffff:ffff:ffff,US +2001:470:dfb3::,2001:470:dfb3:7fff:ffff:ffff:ffff:ffff,SE +2001:470:dfb3:8000::,2001:470:dfc9:ffff:ffff:ffff:ffff:ffff,US +2001:470:dfca::,2001:470:dfca:ffff:ffff:ffff:ffff:ffff,RU +2001:470:dfcb::,2001:470:dfe3:ffff:ffff:ffff:ffff:ffff,US +2001:470:dfe4::,2001:470:dfe4:7fff:ffff:ffff:ffff:ffff,DK +2001:470:dfe4:8000::,2001:470:dff7:7fff:ffff:ffff:ffff:ffff,US +2001:470:dff7:8000::,2001:470:dff7:ffff:ffff:ffff:ffff:ffff,SE +2001:470:dff8::,2001:470:e071:ffff:ffff:ffff:ffff:ffff,US +2001:470:e072::,2001:470:e072:7fff:ffff:ffff:ffff:ffff,CA +2001:470:e072:8000::,2001:470:e1ed:7fff:ffff:ffff:ffff:ffff,US +2001:470:e1ed:8000::,2001:470:e1ed:ffff:ffff:ffff:ffff:ffff,BR +2001:470:e1ee::,2001:470:eaa2:ffff:ffff:ffff:ffff:ffff,US +2001:470:eaa3::,2001:470:eaa3:7fff:ffff:ffff:ffff:ffff,CA +2001:470:eaa3:8000::,2001:470:eae0:ffff:ffff:ffff:ffff:ffff,US +2001:470:eae1::,2001:470:eae1:7fff:ffff:ffff:ffff:ffff,CA +2001:470:eae1:8000::,2001:470:ebf4:ffff:ffff:ffff:ffff:ffff,US +2001:470:ebf5::,2001:470:ebf5:7fff:ffff:ffff:ffff:ffff,CA +2001:470:ebf5:8000::,2001:470:ecf5:ffff:ffff:ffff:ffff:ffff,US +2001:470:ecf6::,2001:470:ecf6:7fff:ffff:ffff:ffff:ffff,ID +2001:470:ecf6:8000::,2001:470:ed02:ffff:ffff:ffff:ffff:ffff,US +2001:470:ed03::,2001:470:ed03:7fff:ffff:ffff:ffff:ffff,MM +2001:470:ed03:8000::,2001:470:ed0b:ffff:ffff:ffff:ffff:ffff,US +2001:470:ed0c::,2001:470:ed0c:7fff:ffff:ffff:ffff:ffff,SG +2001:470:ed0c:8000::,2001:470:ed26:ffff:ffff:ffff:ffff:ffff,US +2001:470:ed27::,2001:470:ed27:7fff:ffff:ffff:ffff:ffff,ID +2001:470:ed27:8000::,2001:470:ed39:ffff:ffff:ffff:ffff:ffff,US +2001:470:ed3a::,2001:470:ed3a:7fff:ffff:ffff:ffff:ffff,SG +2001:470:ed3a:8000::,2001:470:ed3c:ffff:ffff:ffff:ffff:ffff,US +2001:470:ed3d::,2001:470:ed3d:7fff:ffff:ffff:ffff:ffff,SG +2001:470:ed3d:8000::,2001:470:ee04:ffff:ffff:ffff:ffff:ffff,US +2001:470:ee05::,2001:470:ee05:7fff:ffff:ffff:ffff:ffff,MY +2001:470:ee05:8000::,2001:470:ee1d:ffff:ffff:ffff:ffff:ffff,US +2001:470:ee1e::,2001:470:ee1e:7fff:ffff:ffff:ffff:ffff,ID +2001:470:ee1e:8000::,2001:470:ef3f:ffff:ffff:ffff:ffff:ffff,US +2001:470:ef40::,2001:470:ef40:7fff:ffff:ffff:ffff:ffff,CN +2001:470:ef40:8000::,2001:470:eff5:ffff:ffff:ffff:ffff:ffff,US +2001:470:eff6::,2001:470:eff6:7fff:ffff:ffff:ffff:ffff,MY +2001:470:eff6:8000::,2001:470:f011:ffff:ffff:ffff:ffff:ffff,US +2001:470:f012::,2001:470:f012:7fff:ffff:ffff:ffff:ffff,NZ +2001:470:f012:8000::,2001:470:f091:ffff:ffff:ffff:ffff:ffff,US +2001:470:f092::,2001:470:f092:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f092:8000::,2001:470:f0ad:ffff:ffff:ffff:ffff:ffff,US +2001:470:f0ae::,2001:470:f0ae:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f0ae:8000::,2001:470:f0e7:ffff:ffff:ffff:ffff:ffff,US +2001:470:f0e8::,2001:470:f0e8:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f0e8:8000::,2001:470:f12f:ffff:ffff:ffff:ffff:ffff,US +2001:470:f130::,2001:470:f130:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f130:8000::,2001:470:f166:ffff:ffff:ffff:ffff:ffff,US +2001:470:f167::,2001:470:f167:ff:ffff:ffff:ffff:ffff,CN +2001:470:f167:100::,2001:470:f241:ffff:ffff:ffff:ffff:ffff,US +2001:470:f242::,2001:470:f242:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f242:8000::,2001:470:f301:ffff:ffff:ffff:ffff:ffff,US +2001:470:f302::,2001:470:f302:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f302:8000::,2001:470:f3ee:ffff:ffff:ffff:ffff:ffff,US +2001:470:f3ef::,2001:470:f3ef:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f3ef:8000::,2001:470:f42c:ffff:ffff:ffff:ffff:ffff,US +2001:470:f42d::,2001:470:f42d:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f42d:8000::,2001:470:f518:ffff:ffff:ffff:ffff:ffff,US +2001:470:f519::,2001:470:f519:7fff:ffff:ffff:ffff:ffff,NZ +2001:470:f519:8000::,2001:470:f5c3:ffff:ffff:ffff:ffff:ffff,US +2001:470:f5c4::,2001:470:f5c4:7fff:ffff:ffff:ffff:ffff,JP +2001:470:f5c4:8000::,2001:470:f5d0:ffff:ffff:ffff:ffff:ffff,US +2001:470:f5d1::,2001:470:f5d1:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f5d1:8000::,2001:470:f817:ffff:ffff:ffff:ffff:ffff,US +2001:470:f818::,2001:470:f818:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f818:8000::,2001:470:f81d:ffff:ffff:ffff:ffff:ffff,US +2001:470:f81e::,2001:470:f81e:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f81e:8000::,2001:470:f825:7fff:ffff:ffff:ffff:ffff,US +2001:470:f825:8000::,2001:470:f825:ffff:ffff:ffff:ffff:ffff,HK +2001:470:f826::,2001:470:f83d:ffff:ffff:ffff:ffff:ffff,US +2001:470:f83e::,2001:470:f83e:7fff:ffff:ffff:ffff:ffff,HK +2001:470:f83e:8000::,2001:470:f83f:ffff:ffff:ffff:ffff:ffff,US +2001:470:f840::,2001:470:f840:7fff:ffff:ffff:ffff:ffff,MY +2001:470:f840:8000::,2001:470:f919:ffff:ffff:ffff:ffff:ffff,US +2001:470:f91a::,2001:470:f91a:7fff:ffff:ffff:ffff:ffff,SG +2001:470:f91a:8000::,2001:470:f978:ffff:ffff:ffff:ffff:ffff,US +2001:470:f979::,2001:470:f979:7fff:ffff:ffff:ffff:ffff,HK +2001:470:f979:8000::,2001:470:f9e5:ffff:ffff:ffff:ffff:ffff,US +2001:470:f9e6::,2001:470:f9e6:7fff:ffff:ffff:ffff:ffff,CN +2001:470:f9e6:8000::,2001:470:f9f9:ffff:ffff:ffff:ffff:ffff,US +2001:470:f9fa::,2001:470:f9fa:7fff:ffff:ffff:ffff:ffff,HK +2001:470:f9fa:8000::,2001:470:fa38:ffff:ffff:ffff:ffff:ffff,US +2001:470:fa39::,2001:470:fa39:7fff:ffff:ffff:ffff:ffff,HK +2001:470:fa39:8000::,2001:470:fa84:ffff:ffff:ffff:ffff:ffff,US +2001:470:fa85::,2001:470:fa85:7fff:ffff:ffff:ffff:ffff,HK +2001:470:fa85:8000::,2001:470:fc92:ffff:ffff:ffff:ffff:ffff,US +2001:470:fc93::,2001:470:fc93:7fff:ffff:ffff:ffff:ffff,CN +2001:470:fc93:8000::,2001:470:fc93:ffff:ffff:ffff:ffff:ffff,US +2001:470:fc94::,2001:470:fc94:7fff:ffff:ffff:ffff:ffff,JP +2001:470:fc94:8000::,2001:470:fd51:ffff:ffff:ffff:ffff:ffff,US +2001:470:fd52::,2001:470:fd52:7fff:ffff:ffff:ffff:ffff,CN +2001:470:fd52:8000::,2001:470:ffe1:ffff:ffff:ffff:ffff:ffff,US +2001:470:ffe2::,2001:470:ffe2:7fff:ffff:ffff:ffff:ffff,CN +2001:470:ffe2:8000::,2001:470:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:478::,2001:478:ffff:ffff:ffff:ffff:ffff:ffff,KN +2001:480::,2001:480:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:490::,2001:490:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4a0::,2001:4a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4b0::,2001:4b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4b8::,2001:4b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4c0::,2001:4c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:4c8::,2001:4c8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:4d0::,2001:4d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4e0::,2001:4e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4e8::,2001:4e8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:4f0::,2001:4f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4f8::,2001:4f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:500:1::,2001:500:4:ffff:ffff:ffff:ffff:ffff,US +2001:500:6::,2001:500:f:ffff:ffff:ffff:ffff:ffff,CA +2001:500:10::,2001:500:10:ffff:ffff:ffff:ffff:ffff,PR +2001:500:11::,2001:500:15:ffff:ffff:ffff:ffff:ffff,US +2001:500:16::,2001:500:2c:ffff:ffff:ffff:ffff:ffff,CA +2001:500:2d::,2001:500:31:ffff:ffff:ffff:ffff:ffff,US +2001:500:40::,2001:500:56:ffff:ffff:ffff:ffff:ffff,CA +2001:500:60::,2001:500:7d:ffff:ffff:ffff:ffff:ffff,US +2001:500:80::,2001:500:83:ffff:ffff:ffff:ffff:ffff,CA +2001:500:84::,2001:500:89:ffff:ffff:ffff:ffff:ffff,US +2001:500:8c::,2001:500:9f:ffff:ffff:ffff:ffff:ffff,US +2001:500:a0::,2001:500:a7:ffff:ffff:ffff:ffff:ffff,CA +2001:500:a8::,2001:500:a9:ffff:ffff:ffff:ffff:ffff,US +2001:500:c0::,2001:500:ef:ffff:ffff:ffff:ffff:ffff,CA +2001:500:f0::,2001:500:f0:ffff:ffff:ffff:ffff:ffff,US +2001:500:f1::,2001:500:f1:ffff:ffff:ffff:ffff:ffff,CA +2001:500:100::,2001:500:109:ffff:ffff:ffff:ffff:ffff,CA +2001:500:110::,2001:500:110:ffff:ffff:ffff:ffff:ffff,US +2001:500:120::,2001:500:13f:ffff:ffff:ffff:ffff:ffff,US +2001:500:200::,2001:500:20f:ffff:ffff:ffff:ffff:ffff,US +2001:500:3e5::,2001:500:3e5:ffff:ffff:ffff:ffff:ffff,US +2001:500:30ff::,2001:500:30ff:ffff:ffff:ffff:ffff:ffff,SE +2001:500:3682::,2001:500:3682:ffff:ffff:ffff:ffff:ffff,US +2001:500:4431::,2001:500:4431:ffff:ffff:ffff:ffff:ffff,US +2001:500:7967::,2001:500:7967:ffff:ffff:ffff:ffff:ffff,US +2001:500:856e::,2001:500:856e:ffff:ffff:ffff:ffff:ffff,US +2001:500:d937::,2001:500:d937:ffff:ffff:ffff:ffff:ffff,US +2001:500:ed30::,2001:500:ed30:ffff:ffff:ffff:ffff:ffff,SG +2001:501:8a29::,2001:501:8a29:ffff:ffff:ffff:ffff:ffff,JP +2001:501:973c::,2001:501:973c:ffff:ffff:ffff:ffff:ffff,US +2001:501:b1f9::,2001:501:b1f9:ffff:ffff:ffff:ffff:ffff,US +2001:502:8cc::,2001:502:8cc:ffff:ffff:ffff:ffff:ffff,US +2001:502:100e::,2001:502:100e:ffff:ffff:ffff:ffff:ffff,US +2001:502:1ca1::,2001:502:1ca1:ffff:ffff:ffff:ffff:ffff,US +2001:502:2eda::,2001:502:2eda:ffff:ffff:ffff:ffff:ffff,US +2001:502:4612::,2001:502:4612:ffff:ffff:ffff:ffff:ffff,US +2001:502:63bd::,2001:502:63bd:ffff:ffff:ffff:ffff:ffff,US +2001:502:7094::,2001:502:7094:ffff:ffff:ffff:ffff:ffff,US +2001:502:7a71::,2001:502:7a71:ffff:ffff:ffff:ffff:ffff,US +2001:502:8c25::,2001:502:8c25:ffff:ffff:ffff:ffff:ffff,GB +2001:502:ad09::,2001:502:ad09:ffff:ffff:ffff:ffff:ffff,US +2001:502:be98::,2001:502:be98:ffff:ffff:ffff:ffff:ffff,US +2001:502:cbe4::,2001:502:cbe4:ffff:ffff:ffff:ffff:ffff,US +2001:502:cfb5::,2001:502:cfb5:ffff:ffff:ffff:ffff:ffff,US +2001:502:d399::,2001:502:d399:ffff:ffff:ffff:ffff:ffff,US +2001:502:f3ff::,2001:502:f3ff:ffff:ffff:ffff:ffff:ffff,US +2001:503:c27::,2001:503:c27:ffff:ffff:ffff:ffff:ffff,US +2001:503:d2d::,2001:503:d2d:ffff:ffff:ffff:ffff:ffff,US +2001:503:231d::,2001:503:231d:ffff:ffff:ffff:ffff:ffff,US +2001:503:3227::,2001:503:3227:ffff:ffff:ffff:ffff:ffff,US +2001:503:39c1::,2001:503:39c1:ffff:ffff:ffff:ffff:ffff,US +2001:503:4872::,2001:503:4872:ffff:ffff:ffff:ffff:ffff,HK +2001:503:5419::,2001:503:5419:ffff:ffff:ffff:ffff:ffff,ES +2001:503:5ae2::,2001:503:5ae2:ffff:ffff:ffff:ffff:ffff,US +2001:503:6810::,2001:503:6810:ffff:ffff:ffff:ffff:ffff,US +2001:503:7bbb::,2001:503:7bbb:ffff:ffff:ffff:ffff:ffff,US +2001:503:7bbf::,2001:503:7bbf:ffff:ffff:ffff:ffff:ffff,DE +2001:503:8028::,2001:503:8028:ffff:ffff:ffff:ffff:ffff,US +2001:503:83eb::,2001:503:83eb:ffff:ffff:ffff:ffff:ffff,US +2001:503:91ef::,2001:503:91ef:ffff:ffff:ffff:ffff:ffff,FR +2001:503:a124::,2001:503:a124:ffff:ffff:ffff:ffff:ffff,US +2001:503:a83e::,2001:503:a83e:ffff:ffff:ffff:ffff:ffff,US +2001:503:ba3e::,2001:503:ba3e:ffff:ffff:ffff:ffff:ffff,US +2001:503:bfb0::,2001:503:bfb0:ffff:ffff:ffff:ffff:ffff,US +2001:503:c779::,2001:503:c779:ffff:ffff:ffff:ffff:ffff,US +2001:503:cc2c::,2001:503:cc2c:ffff:ffff:ffff:ffff:ffff,US +2001:503:d1ae::,2001:503:d1ae:ffff:ffff:ffff:ffff:ffff,US +2001:503:d414::,2001:503:d414:ffff:ffff:ffff:ffff:ffff,US +2001:503:e239::,2001:503:e239:ffff:ffff:ffff:ffff:ffff,US +2001:503:e8ef::,2001:503:e8ef:ffff:ffff:ffff:ffff:ffff,US +2001:503:eea3::,2001:503:eea3:ffff:ffff:ffff:ffff:ffff,US +2001:503:f189::,2001:503:f189:ffff:ffff:ffff:ffff:ffff,US +2001:503:f261::,2001:503:f261:ffff:ffff:ffff:ffff:ffff,US +2001:503:f3da::,2001:503:f3da:ffff:ffff:ffff:ffff:ffff,NL +2001:503:ff39::,2001:503:ff39:ffff:ffff:ffff:ffff:ffff,US +2001:504::,2001:504:1:ffff:ffff:ffff:ffff:ffff,US +2001:504:a::,2001:504:13:ffff:ffff:ffff:ffff:ffff,US +2001:504:15::,2001:504:15:ffff:ffff:ffff:ffff:ffff,CA +2001:504:16::,2001:504:18:ffff:ffff:ffff:ffff:ffff,US +2001:504:19::,2001:504:1a:ffff:ffff:ffff:ffff:ffff,CA +2001:504:1b::,2001:504:1c:ffff:ffff:ffff:ffff:ffff,US +2001:504:1d::,2001:504:1d:ffff:ffff:ffff:ffff:ffff,PR +2001:504:20::,2001:504:23:ffff:ffff:ffff:ffff:ffff,GB +2001:504:24::,2001:504:24:ffff:ffff:ffff:ffff:ffff,US +2001:504:25::,2001:504:26:ffff:ffff:ffff:ffff:ffff,CA +2001:504:27::,2001:504:29:ffff:ffff:ffff:ffff:ffff,US +2001:504:2c::,2001:504:2d:ffff:ffff:ffff:ffff:ffff,CA +2001:504:2e::,2001:504:2e:ffff:ffff:ffff:ffff:ffff,US +2001:504:2f::,2001:504:2f:ffff:ffff:ffff:ffff:ffff,CA +2001:504:30::,2001:504:31:ffff:ffff:ffff:ffff:ffff,US +2001:504:33::,2001:504:34:ffff:ffff:ffff:ffff:ffff,US +2001:504:35::,2001:504:35:ffff:ffff:ffff:ffff:ffff,GD +2001:504:36::,2001:504:36:ffff:ffff:ffff:ffff:ffff,US +2001:504:37::,2001:504:37:ffff:ffff:ffff:ffff:ffff,CA +2001:504:38::,2001:504:38:ffff:ffff:ffff:ffff:ffff,US +2001:504:39::,2001:504:39:ffff:ffff:ffff:ffff:ffff,CA +2001:504:3a::,2001:504:3d:ffff:ffff:ffff:ffff:ffff,US +2001:504:3e::,2001:504:3e:ffff:ffff:ffff:ffff:ffff,JM +2001:504:3f::,2001:504:41:ffff:ffff:ffff:ffff:ffff,US +2001:504:42::,2001:504:42:ffff:ffff:ffff:ffff:ffff,CA +2001:504:43::,2001:504:45:ffff:ffff:ffff:ffff:ffff,US +2001:504:46::,2001:504:46:ffff:ffff:ffff:ffff:ffff,CA +2001:504:47::,2001:504:47:ffff:ffff:ffff:ffff:ffff,US +2001:504:57::,2001:504:59:ffff:ffff:ffff:ffff:ffff,US +2001:504:60::,2001:504:62:ffff:ffff:ffff:ffff:ffff,US +2001:504:63::,2001:504:63:ffff:ffff:ffff:ffff:ffff,DM +2001:504:64::,2001:504:68:ffff:ffff:ffff:ffff:ffff,US +2001:504:69::,2001:504:69:ffff:ffff:ffff:ffff:ffff,CA +2001:504:70::,2001:504:72:ffff:ffff:ffff:ffff:ffff,US +2001:504:73::,2001:504:73:ffff:ffff:ffff:ffff:ffff,CA +2001:504:74::,2001:504:79:ffff:ffff:ffff:ffff:ffff,US +2001:504:80::,2001:504:8f:ffff:ffff:ffff:ffff:ffff,US +2001:506::,2001:506:1:ffff:ffff:ffff:ffff:ffff,US +2001:506:8::,2001:506:8:ffff:ffff:ffff:ffff:ffff,US +2001:506:20::,2001:506:20:ffff:ffff:ffff:ffff:ffff,CA +2001:506:28::,2001:506:28:ffff:ffff:ffff:ffff:ffff,US +2001:506:100::,2001:506:100:ffff:ffff:ffff:ffff:ffff,US +2001:506:1000::,2001:506:2fff:ffff:ffff:ffff:ffff:ffff,US +2001:506:4000::,2001:506:7fff:ffff:ffff:ffff:ffff:ffff,US +2001:508::,2001:508:ffff:ffff:ffff:ffff:ffff:ffff,BM +2001:510::,2001:510:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:518::,2001:518:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:520::,2001:520:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:528::,2001:528:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:530::,2001:530:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:538::,2001:538:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:540::,2001:540:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:548::,2001:548:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:550::,2001:550:0:1000::8275:169,US +2001:550:0:1000::8275:16a,2001:550:0:1000::8275:16a,SI +2001:550:0:1000::8275:16b,2001:550:0:1000::9a19:325,US +2001:550:0:1000::9a19:326,2001:550:0:1000::9a19:326,SI +2001:550:0:1000::9a19:327,2001:550:0:1000::9a36:2631,US +2001:550:0:1000::9a36:2632,2001:550:0:1000::9a36:2632,DE +2001:550:0:1000::9a36:2633,2001:550:7ff:ffff:ffff:ffff:ffff:ffff,US +2001:550:800::,2001:550:800:7fff:ffff:ffff:ffff:ffff,CA +2001:550:800:8000::,2001:550:909:ffff:ffff:ffff:ffff:ffff,US +2001:550:90a::,2001:550:90a:7fff:ffff:ffff:ffff:ffff,CA +2001:550:90a:8000::,2001:550:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:558::,2001:560:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:568::,2001:569:7413:ffff:ffff:ffff:ffff:ffff,CA +2001:569:7414::,2001:569:7414:7fff:ffff:ffff:ffff:ffff,US +2001:569:7414:8000::,2001:569:79c9:bfff:ffff:ffff:ffff:ffff,CA +2001:569:79c9:c000::,2001:569:79c9:dfff:ffff:ffff:ffff:ffff,GB +2001:569:79c9:e000::,2001:56f:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:570::,2001:570:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:578::,2001:57b:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:580::,2001:580:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:590::,2001:590:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:598::,2001:598:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:5a0::,2001:5a0:3600:ffff:ffff:ffff:ffff:ffff,US +2001:5a0:3601::,2001:5a0:3601:ffff:ffff:ffff:ffff:ffff,CA +2001:5a0:3602::,2001:5a0:36ff:ffff:ffff:ffff:ffff:ffff,US +2001:5a0:3700::,2001:5a0:3700:ff:ffff:ffff:ffff:ffff,CA +2001:5a0:3700:100::,2001:5a0:3700:ffff:ffff:ffff:ffff:ffff,US +2001:5a0:3701::,2001:5a0:3701:ffff:ffff:ffff:ffff:ffff,CA +2001:5a0:3702::,2001:5a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5a8::,2001:5a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5b0::,2001:5b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5b8::,2001:5b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5c0:1100::,2001:5c0:1100::,US +2001:5c8::,2001:5c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5d0::,2001:5d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5d8::,2001:5d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5e0::,2001:5e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5e8::,2001:5e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5f0::,2001:5f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5f8::,2001:5f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:608::,2001:608:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:610::,2001:617:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:618::,2001:618:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:620::,2001:627:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:628::,2001:62f:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:630::,2001:630:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:638::,2001:638:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:640::,2001:640:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:648::,2001:64f:ffff:ffff:ffff:ffff:ffff:ffff,GR +2001:650::,2001:65f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:660::,2001:667:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:668::,2001:668:1f:3d:ffff:ffff:ffff:ffff,DE +2001:668:1f:3e::,2001:668:1f:3e:ffff:ffff:ffff:ffff,GB +2001:668:1f:3f::,2001:668:1f:44:ffff:ffff:ffff:ffff,DE +2001:668:1f:45::,2001:668:1f:45:ffff:ffff:ffff:ffff,GB +2001:668:1f:46::,2001:66f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:670::,2001:673:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:678:1::,2001:678:1:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:2::,2001:678:2:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3::,2001:678:3:ffff:ffff:ffff:ffff:ffff,CH +2001:678:4::,2001:678:5:ffff:ffff:ffff:ffff:ffff,GB +2001:678:6::,2001:678:6:ffff:ffff:ffff:ffff:ffff,LT +2001:678:7::,2001:678:7:ffff:ffff:ffff:ffff:ffff,GR +2001:678:8::,2001:678:8:ffff:ffff:ffff:ffff:ffff,NL +2001:678:9::,2001:678:a:ffff:ffff:ffff:ffff:ffff,BE +2001:678:b::,2001:678:b:ffff:ffff:ffff:ffff:ffff,LV +2001:678:c::,2001:678:c:ffff:ffff:ffff:ffff:ffff,FR +2001:678:d::,2001:678:d:ffff:ffff:ffff:ffff:ffff,AT +2001:678:e::,2001:678:e:ffff:ffff:ffff:ffff:ffff,DE +2001:678:f::,2001:678:11:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:12::,2001:678:12:ffff:ffff:ffff:ffff:ffff,IT +2001:678:13::,2001:678:18:ffff:ffff:ffff:ffff:ffff,RU +2001:678:19::,2001:678:19:ffff:ffff:ffff:ffff:ffff,LT +2001:678:1a::,2001:678:1a:ffff:ffff:ffff:ffff:ffff,DK +2001:678:1b::,2001:678:1b:ffff:ffff:ffff:ffff:ffff,LU +2001:678:1c::,2001:678:1c:ffff:ffff:ffff:ffff:ffff,AT +2001:678:20::,2001:678:20:ffff:ffff:ffff:ffff:ffff,AT +2001:678:24::,2001:678:24:ffff:ffff:ffff:ffff:ffff,AT +2001:678:28::,2001:678:28:ffff:ffff:ffff:ffff:ffff,SM +2001:678:2c::,2001:678:2c:ffff:ffff:ffff:ffff:ffff,NL +2001:678:30::,2001:678:30:ffff:ffff:ffff:ffff:ffff,NL +2001:678:34::,2001:678:34:ffff:ffff:ffff:ffff:ffff,NL +2001:678:38::,2001:678:38:ffff:ffff:ffff:ffff:ffff,NL +2001:678:3c::,2001:678:3c:ffff:ffff:ffff:ffff:ffff,BG +2001:678:40::,2001:678:40:ffff:ffff:ffff:ffff:ffff,ES +2001:678:44::,2001:678:44:ffff:ffff:ffff:ffff:ffff,ES +2001:678:48::,2001:678:48:ffff:ffff:ffff:ffff:ffff,ES +2001:678:4c::,2001:678:4c:ffff:ffff:ffff:ffff:ffff,FR +2001:678:60::,2001:678:60:ffff:ffff:ffff:ffff:ffff,LU +2001:678:64::,2001:678:64:ffff:ffff:ffff:ffff:ffff,BE +2001:678:68::,2001:678:68:ffff:ffff:ffff:ffff:ffff,BE +2001:678:6c::,2001:678:6c:ffff:ffff:ffff:ffff:ffff,BE +2001:678:70::,2001:678:70:ffff:ffff:ffff:ffff:ffff,SK +2001:678:74::,2001:678:74:ffff:ffff:ffff:ffff:ffff,DK +2001:678:78::,2001:678:78:ffff:ffff:ffff:ffff:ffff,DK +2001:678:7c::,2001:678:7c:ffff:ffff:ffff:ffff:ffff,LV +2001:678:80::,2001:678:80:ffff:ffff:ffff:ffff:ffff,LV +2001:678:84::,2001:678:84:ffff:ffff:ffff:ffff:ffff,LV +2001:678:88::,2001:678:88:ffff:ffff:ffff:ffff:ffff,LT +2001:678:8c::,2001:678:8c:ffff:ffff:ffff:ffff:ffff,LT +2001:678:90::,2001:678:90:ffff:ffff:ffff:ffff:ffff,SK +2001:678:94::,2001:678:94:ffff:ffff:ffff:ffff:ffff,EE +2001:678:98::,2001:678:98:ffff:ffff:ffff:ffff:ffff,KZ +2001:678:9c::,2001:678:9c:ffff:ffff:ffff:ffff:ffff,SK +2001:678:a0::,2001:678:a0:ffff:ffff:ffff:ffff:ffff,FI +2001:678:a4::,2001:678:a4:ffff:ffff:ffff:ffff:ffff,AT +2001:678:a8::,2001:678:a8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:ac::,2001:678:ac:ffff:ffff:ffff:ffff:ffff,SE +2001:678:b0::,2001:678:b3:ffff:ffff:ffff:ffff:ffff,IR +2001:678:c0::,2001:678:c0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:c4::,2001:678:c4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:c8::,2001:678:c8:ffff:ffff:ffff:ffff:ffff,UA +2001:678:cc::,2001:678:cc:ffff:ffff:ffff:ffff:ffff,SA +2001:678:d0::,2001:678:d0:ffff:ffff:ffff:ffff:ffff,NL +2001:678:d4::,2001:678:d4:ffff:ffff:ffff:ffff:ffff,IT +2001:678:d8::,2001:678:d8:ffff:ffff:ffff:ffff:ffff,LV +2001:678:dc::,2001:678:dc:ffff:ffff:ffff:ffff:ffff,NL +2001:678:e0::,2001:678:e0:ffff:ffff:ffff:ffff:ffff,MD +2001:678:e4::,2001:678:e4:ffff:ffff:ffff:ffff:ffff,SE +2001:678:e8::,2001:678:e8:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:ec::,2001:678:ec:ffff:ffff:ffff:ffff:ffff,RU +2001:678:f0::,2001:678:f0:7fff:ffff:ffff:ffff:ffff,SE +2001:678:f0:8000::,2001:678:f0:ffff:ffff:ffff:ffff:ffff,PL +2001:678:f4::,2001:678:f4:ffff:ffff:ffff:ffff:ffff,RU +2001:678:f8::,2001:678:f8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:fc::,2001:678:fc:ffff:ffff:ffff:ffff:ffff,LT +2001:678:100::,2001:678:100:ffff:ffff:ffff:ffff:ffff,BG +2001:678:104::,2001:678:104:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:108::,2001:678:108:ffff:ffff:ffff:ffff:ffff,NL +2001:678:10c::,2001:678:10c:ffff:ffff:ffff:ffff:ffff,NL +2001:678:110::,2001:678:110:ffff:ffff:ffff:ffff:ffff,NL +2001:678:114::,2001:678:114:ffff:ffff:ffff:ffff:ffff,NL +2001:678:118::,2001:678:118:ffff:ffff:ffff:ffff:ffff,NL +2001:678:11c::,2001:678:11c:ffff:ffff:ffff:ffff:ffff,CH +2001:678:120::,2001:678:120:ffff:ffff:ffff:ffff:ffff,PL +2001:678:124::,2001:678:124:ffff:ffff:ffff:ffff:ffff,RU +2001:678:128::,2001:678:128:ffff:ffff:ffff:ffff:ffff,RU +2001:678:12c::,2001:678:12c:ffff:ffff:ffff:ffff:ffff,SK +2001:678:130::,2001:678:130:ffff:ffff:ffff:ffff:ffff,SE +2001:678:134::,2001:678:134:ffff:ffff:ffff:ffff:ffff,NO +2001:678:138::,2001:678:138:ffff:ffff:ffff:ffff:ffff,NO +2001:678:13c::,2001:678:13c:ffff:ffff:ffff:ffff:ffff,DE +2001:678:140::,2001:678:140:ffff:ffff:ffff:ffff:ffff,DE +2001:678:144::,2001:678:144:ffff:ffff:ffff:ffff:ffff,UA +2001:678:148::,2001:678:148:ffff:ffff:ffff:ffff:ffff,FI +2001:678:14c::,2001:678:14c:ffff:ffff:ffff:ffff:ffff,UA +2001:678:154::,2001:678:154:ffff:ffff:ffff:ffff:ffff,DE +2001:678:158::,2001:678:158:ffff:ffff:ffff:ffff:ffff,FR +2001:678:15c::,2001:678:15c:ffff:ffff:ffff:ffff:ffff,RO +2001:678:160::,2001:678:160:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:164::,2001:678:164:ffff:ffff:ffff:ffff:ffff,RO +2001:678:168::,2001:678:168:ffff:ffff:ffff:ffff:ffff,DE +2001:678:16c::,2001:678:16c:ffff:ffff:ffff:ffff:ffff,BG +2001:678:170::,2001:678:170:ffff:ffff:ffff:ffff:ffff,PL +2001:678:174::,2001:678:174:ffff:ffff:ffff:ffff:ffff,DE +2001:678:178::,2001:678:178:ffff:ffff:ffff:ffff:ffff,PL +2001:678:17c::,2001:678:17c:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:180::,2001:678:180:ffff:ffff:ffff:ffff:ffff,DE +2001:678:184::,2001:678:184:ffff:ffff:ffff:ffff:ffff,DE +2001:678:188::,2001:678:188:ffff:ffff:ffff:ffff:ffff,UZ +2001:678:18c::,2001:678:18c:ffff:ffff:ffff:ffff:ffff,AT +2001:678:190::,2001:678:190:ffff:ffff:ffff:ffff:ffff,RU +2001:678:198::,2001:678:198:ffff:ffff:ffff:ffff:ffff,NL +2001:678:19c::,2001:678:19c:ffff:ffff:ffff:ffff:ffff,SE +2001:678:1a0::,2001:678:1a0:ffff:ffff:ffff:ffff:ffff,SE +2001:678:1a4::,2001:678:1a4:ffff:ffff:ffff:ffff:ffff,TR +2001:678:1a8::,2001:678:1a8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:1ac::,2001:678:1ac:ffff:ffff:ffff:ffff:ffff,UA +2001:678:1b0::,2001:678:1b0:ffff:ffff:ffff:ffff:ffff,RU +2001:678:1b4::,2001:678:1b4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:1b8::,2001:678:1b8:ffff:ffff:ffff:ffff:ffff,AT +2001:678:1bc::,2001:678:1bc:ffff:ffff:ffff:ffff:ffff,RU +2001:678:1c0::,2001:678:1c0:ffff:ffff:ffff:ffff:ffff,PL +2001:678:1c4::,2001:678:1c4:ffff:ffff:ffff:ffff:ffff,CH +2001:678:1c8::,2001:678:1c8:ffff:ffff:ffff:ffff:ffff,NL +2001:678:1cc::,2001:678:1cc:ffff:ffff:ffff:ffff:ffff,PL +2001:678:1d0::,2001:678:1d0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:1d4::,2001:678:1d4:ffff:ffff:ffff:ffff:ffff,SE +2001:678:1d8::,2001:678:1d8:ffff:ffff:ffff:ffff:ffff,AT +2001:678:1dc::,2001:678:1dc:ffff:ffff:ffff:ffff:ffff,PL +2001:678:1e0::,2001:678:1e0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:1e4::,2001:678:1e4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:1e8::,2001:678:1e8:ffff:ffff:ffff:ffff:ffff,RU +2001:678:1ec::,2001:678:1ec:ffff:ffff:ffff:ffff:ffff,SI +2001:678:1f0::,2001:678:1f0:ffff:ffff:ffff:ffff:ffff,GB +2001:678:1f4::,2001:678:1f4:ffff:ffff:ffff:ffff:ffff,RU +2001:678:1f8::,2001:678:1f8:ffff:ffff:ffff:ffff:ffff,BG +2001:678:1fc::,2001:678:1fc:ffff:ffff:ffff:ffff:ffff,SE +2001:678:200::,2001:678:200:ffff:ffff:ffff:ffff:ffff,PL +2001:678:204::,2001:678:204:ffff:ffff:ffff:ffff:ffff,CH +2001:678:208::,2001:678:208:ffff:ffff:ffff:ffff:ffff,UA +2001:678:20c::,2001:678:20c:ffff:ffff:ffff:ffff:ffff,RU +2001:678:214::,2001:678:214:ffff:ffff:ffff:ffff:ffff,HU +2001:678:218::,2001:678:218:ffff:ffff:ffff:ffff:ffff,RO +2001:678:21c::,2001:678:21c:ffff:ffff:ffff:ffff:ffff,UA +2001:678:220::,2001:678:220:ffff:ffff:ffff:ffff:ffff,RU +2001:678:224::,2001:678:224:ffff:ffff:ffff:ffff:ffff,PL +2001:678:228::,2001:678:228:ffff:ffff:ffff:ffff:ffff,SE +2001:678:22c::,2001:678:22c:ffff:ffff:ffff:ffff:ffff,DE +2001:678:230::,2001:678:230:ffff:ffff:ffff:ffff:ffff,NL +2001:678:238::,2001:678:238:ffff:ffff:ffff:ffff:ffff,PL +2001:678:23c::,2001:678:23c:ffff:ffff:ffff:ffff:ffff,PL +2001:678:240::,2001:678:240:ffff:ffff:ffff:ffff:ffff,SE +2001:678:244::,2001:678:244:ffff:ffff:ffff:ffff:ffff,RU +2001:678:248::,2001:678:248:ffff:ffff:ffff:ffff:ffff,DE +2001:678:24c::,2001:678:24c:ffff:ffff:ffff:ffff:ffff,LT +2001:678:250::,2001:678:250:ffff:ffff:ffff:ffff:ffff,NL +2001:678:254::,2001:678:254:ffff:ffff:ffff:ffff:ffff,CH +2001:678:258::,2001:678:258:ffff:ffff:ffff:ffff:ffff,GB +2001:678:25c::,2001:678:25c:ffff:ffff:ffff:ffff:ffff,LU +2001:678:260::,2001:678:260:ffff:ffff:ffff:ffff:ffff,CH +2001:678:264::,2001:678:264:ffff:ffff:ffff:ffff:ffff,NL +2001:678:268::,2001:678:268:ffff:ffff:ffff:ffff:ffff,GB +2001:678:26c::,2001:678:26c:ffff:ffff:ffff:ffff:ffff,UA +2001:678:270::,2001:678:270:ffff:ffff:ffff:ffff:ffff,AT +2001:678:274::,2001:678:274:ffff:ffff:ffff:ffff:ffff,DE +2001:678:278::,2001:678:278:ffff:ffff:ffff:ffff:ffff,RU +2001:678:27c::,2001:678:27c:ffff:ffff:ffff:ffff:ffff,PL +2001:678:280::,2001:678:280:ffff:ffff:ffff:ffff:ffff,RU +2001:678:284::,2001:678:284:ffff:ffff:ffff:ffff:ffff,DE +2001:678:288::,2001:678:288:ffff:ffff:ffff:ffff:ffff,PL +2001:678:28c::,2001:678:28c:ffff:ffff:ffff:ffff:ffff,CH +2001:678:290::,2001:678:290:ffff:ffff:ffff:ffff:ffff,RU +2001:678:294::,2001:678:294:ffff:ffff:ffff:ffff:ffff,CH +2001:678:298::,2001:678:298:ffff:ffff:ffff:ffff:ffff,CH +2001:678:29c::,2001:678:29c:ffff:ffff:ffff:ffff:ffff,SI +2001:678:2a0::,2001:678:2a0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:2a4::,2001:678:2a4:ffff:ffff:ffff:ffff:ffff,UA +2001:678:2a8::,2001:678:2a8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:2ac::,2001:678:2ac:ffff:ffff:ffff:ffff:ffff,RO +2001:678:2b0::,2001:678:2b0:ffff:ffff:ffff:ffff:ffff,PL +2001:678:2b4::,2001:678:2b4:ffff:ffff:ffff:ffff:ffff,UA +2001:678:2b8::,2001:678:2b9:ffff:ffff:ffff:ffff:ffff,DE +2001:678:2c0::,2001:678:2c0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:2c4::,2001:678:2c4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:2c8::,2001:678:2c8:ffff:ffff:ffff:ffff:ffff,NL +2001:678:2cc::,2001:678:2cc:ffff:ffff:ffff:ffff:ffff,DE +2001:678:2d0::,2001:678:2d0:ffff:ffff:ffff:ffff:ffff,UA +2001:678:2d4::,2001:678:2d4:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:2d8::,2001:678:2d8:ffff:ffff:ffff:ffff:ffff,AT +2001:678:2dc::,2001:678:2dc:ffff:ffff:ffff:ffff:ffff,GB +2001:678:2e0::,2001:678:2e0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:2e4::,2001:678:2e4:ffff:ffff:ffff:ffff:ffff,NL +2001:678:2e8::,2001:678:2e8:ffff:ffff:ffff:ffff:ffff,RU +2001:678:2ec::,2001:678:2ec:ffff:ffff:ffff:ffff:ffff,RU +2001:678:2f0::,2001:678:2f0:ffff:ffff:ffff:ffff:ffff,RU +2001:678:2f4::,2001:678:2f4:ffff:ffff:ffff:ffff:ffff,IL +2001:678:2f8::,2001:678:2f8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:2fc::,2001:678:2fc:ffff:ffff:ffff:ffff:ffff,GB +2001:678:300::,2001:678:303:ffff:ffff:ffff:ffff:ffff,DE +2001:678:310::,2001:678:310:ffff:ffff:ffff:ffff:ffff,CH +2001:678:314::,2001:678:314:ffff:ffff:ffff:ffff:ffff,RO +2001:678:318::,2001:678:318:ffff:ffff:ffff:ffff:ffff,UA +2001:678:31c::,2001:678:31c:ffff:ffff:ffff:ffff:ffff,UA +2001:678:320::,2001:678:320:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:324::,2001:678:324:ffff:ffff:ffff:ffff:ffff,LV +2001:678:328::,2001:678:328:ffff:ffff:ffff:ffff:ffff,CH +2001:678:32c::,2001:678:32c:ffff:ffff:ffff:ffff:ffff,GB +2001:678:330::,2001:678:330:ffff:ffff:ffff:ffff:ffff,SE +2001:678:334::,2001:678:334:ffff:ffff:ffff:ffff:ffff,UA +2001:678:338::,2001:678:338:ffff:ffff:ffff:ffff:ffff,DE +2001:678:33c::,2001:678:33c:ffff:ffff:ffff:ffff:ffff,DK +2001:678:340::,2001:678:340:ffff:ffff:ffff:ffff:ffff,DE +2001:678:344::,2001:678:344:ffff:ffff:ffff:ffff:ffff,RU +2001:678:348::,2001:678:348:ffff:ffff:ffff:ffff:ffff,NL +2001:678:34c::,2001:678:34c:ffff:ffff:ffff:ffff:ffff,US +2001:678:350::,2001:678:350:ffff:ffff:ffff:ffff:ffff,RU +2001:678:354::,2001:678:354:ffff:ffff:ffff:ffff:ffff,RU +2001:678:358::,2001:678:358:ffff:ffff:ffff:ffff:ffff,IE +2001:678:35c::,2001:678:35c:ffff:ffff:ffff:ffff:ffff,DE +2001:678:360::,2001:678:360:ffff:ffff:ffff:ffff:ffff,DE +2001:678:364::,2001:678:364:ffff:ffff:ffff:ffff:ffff,PL +2001:678:36c::,2001:678:36c:ffff:ffff:ffff:ffff:ffff,DE +2001:678:370::,2001:678:370:ffff:ffff:ffff:ffff:ffff,DE +2001:678:374::,2001:678:374:ffff:ffff:ffff:ffff:ffff,UA +2001:678:378::,2001:678:378:ffff:ffff:ffff:ffff:ffff,RU +2001:678:37c::,2001:678:37c:ffff:ffff:ffff:ffff:ffff,UA +2001:678:380::,2001:678:380:ffff:ffff:ffff:ffff:ffff,PL +2001:678:384::,2001:678:384:ffff:ffff:ffff:ffff:ffff,RU +2001:678:388::,2001:678:388:ffff:ffff:ffff:ffff:ffff,PL +2001:678:38c::,2001:678:38c:ffff:ffff:ffff:ffff:ffff,PL +2001:678:390::,2001:678:390:ffff:ffff:ffff:ffff:ffff,NL +2001:678:394::,2001:678:394:ffff:ffff:ffff:ffff:ffff,SE +2001:678:398::,2001:678:398:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:39c::,2001:678:39c:ffff:ffff:ffff:ffff:ffff,SA +2001:678:3a0::,2001:678:3a0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3a4::,2001:678:3a4:ffff:ffff:ffff:ffff:ffff,SE +2001:678:3a8::,2001:678:3a8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3ac::,2001:678:3ac:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3b0::,2001:678:3b0:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3b4::,2001:678:3b4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3b8::,2001:678:3b8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3bc::,2001:678:3bc:ffff:ffff:ffff:ffff:ffff,FR +2001:678:3c0::,2001:678:3c0:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3c4::,2001:678:3c4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3c8::,2001:678:3c8:ffff:ffff:ffff:ffff:ffff,GR +2001:678:3cc::,2001:678:3cc:ffff:ffff:ffff:ffff:ffff,FR +2001:678:3d0::,2001:678:3d0:ffff:ffff:ffff:ffff:ffff,RU +2001:678:3d4::,2001:678:3d4:ffff:ffff:ffff:ffff:ffff,NL +2001:678:3d8::,2001:678:3d8:ffff:ffff:ffff:ffff:ffff,GB +2001:678:3dc::,2001:678:3dc:ffff:ffff:ffff:ffff:ffff,AT +2001:678:3e0::,2001:678:3e0:ffff:ffff:ffff:ffff:ffff,NL +2001:678:3e4::,2001:678:3e4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3e8::,2001:678:3e8:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3ec::,2001:678:3ec:ffff:ffff:ffff:ffff:ffff,SE +2001:678:3f0::,2001:678:3f0:ffff:ffff:ffff:ffff:ffff,NO +2001:678:3f4::,2001:678:3f4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3f8::,2001:678:3f8:ffff:ffff:ffff:ffff:ffff,UA +2001:678:3fc::,2001:678:3fc:ffff:ffff:ffff:ffff:ffff,FR +2001:678:400::,2001:678:400:ffff:ffff:ffff:ffff:ffff,DE +2001:678:404::,2001:678:404:ffff:ffff:ffff:ffff:ffff,RS +2001:678:408::,2001:678:408:ffff:ffff:ffff:ffff:ffff,ME +2001:678:40c::,2001:678:40c:ffff:ffff:ffff:ffff:ffff,RU +2001:678:410::,2001:678:410:ffff:ffff:ffff:ffff:ffff,RU +2001:678:414::,2001:678:414:ffff:ffff:ffff:ffff:ffff,DE +2001:678:418::,2001:678:418:ffff:ffff:ffff:ffff:ffff,GB +2001:678:41c::,2001:678:41c:ffff:ffff:ffff:ffff:ffff,UA +2001:678:420::,2001:678:420:ffff:ffff:ffff:ffff:ffff,RU +2001:678:424::,2001:678:424:ffff:ffff:ffff:ffff:ffff,GB +2001:678:428::,2001:678:428:ffff:ffff:ffff:ffff:ffff,NL +2001:678:42c::,2001:678:42c:ffff:ffff:ffff:ffff:ffff,SI +2001:678:430::,2001:678:431:baff:ffff:ffff:ffff:ffff,GB +2001:678:431:bb00::,2001:678:431:bbff:ffff:ffff:ffff:ffff,FR +2001:678:431:bc00::,2001:678:433:ffff:ffff:ffff:ffff:ffff,GB +2001:678:440::,2001:678:440:ffff:ffff:ffff:ffff:ffff,SE +2001:678:444::,2001:678:444:ffff:ffff:ffff:ffff:ffff,TR +2001:678:448::,2001:678:448:ffff:ffff:ffff:ffff:ffff,NL +2001:678:44c::,2001:678:44c:ffff:ffff:ffff:ffff:ffff,DE +2001:678:450::,2001:678:450:ffff:ffff:ffff:ffff:ffff,SE +2001:678:454::,2001:678:454:ffff:ffff:ffff:ffff:ffff,SE +2001:678:458::,2001:678:458:ffff:ffff:ffff:ffff:ffff,DE +2001:678:45c::,2001:678:45c:ffff:ffff:ffff:ffff:ffff,PL +2001:678:460::,2001:678:460:ffff:ffff:ffff:ffff:ffff,GB +2001:678:464::,2001:678:464:ffff:ffff:ffff:ffff:ffff,NO +2001:678:468::,2001:678:468:ffff:ffff:ffff:ffff:ffff,UA +2001:678:46c::,2001:678:46c:ffff:ffff:ffff:ffff:ffff,RU +2001:678:470::,2001:678:470:ffff:ffff:ffff:ffff:ffff,PL +2001:678:474::,2001:678:474:ffff:ffff:ffff:ffff:ffff,GB +2001:678:478::,2001:678:478:ffff:ffff:ffff:ffff:ffff,DE +2001:678:47c::,2001:678:47c:ffff:ffff:ffff:ffff:ffff,GB +2001:678:480::,2001:678:480:ffff:ffff:ffff:ffff:ffff,AT +2001:678:484::,2001:678:484:ffff:ffff:ffff:ffff:ffff,GB +2001:678:488::,2001:678:488:ffff:ffff:ffff:ffff:ffff,GB +2001:678:48c::,2001:678:48c:ffff:ffff:ffff:ffff:ffff,RU +2001:678:490::,2001:678:490:ffff:ffff:ffff:ffff:ffff,DE +2001:678:494::,2001:678:494:ffff:ffff:ffff:ffff:ffff,RU +2001:678:498::,2001:678:498:ffff:ffff:ffff:ffff:ffff,GB +2001:678:49c::,2001:678:49c:ffff:ffff:ffff:ffff:ffff,GB +2001:678:4a0::,2001:678:4a0:ffff:ffff:ffff:ffff:ffff,GB +2001:678:4a4::,2001:678:4a4:ffff:ffff:ffff:ffff:ffff,GB +2001:678:4a8::,2001:678:4a8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4ac::,2001:678:4ac:ffff:ffff:ffff:ffff:ffff,RU +2001:678:4b0::,2001:678:4b0:ffff:ffff:ffff:ffff:ffff,SE +2001:678:4b4::,2001:678:4b4:ffff:ffff:ffff:ffff:ffff,PL +2001:678:4b8::,2001:678:4b8:ffff:ffff:ffff:ffff:ffff,UA +2001:678:4bc::,2001:678:4bc:ffff:ffff:ffff:ffff:ffff,GB +2001:678:4c0::,2001:678:4c0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4c4::,2001:678:4c4:ffff:ffff:ffff:ffff:ffff,CH +2001:678:4c8::,2001:678:4c8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4cc::,2001:678:4cc:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4d0::,2001:678:4d0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4d4::,2001:678:4d4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4d8::,2001:678:4d8:ffff:ffff:ffff:ffff:ffff,GB +2001:678:4dc::,2001:678:4dc:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4e0::,2001:678:4e0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4e4::,2001:678:4e4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4e8::,2001:678:4e8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4ec::,2001:678:4ec:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4f0::,2001:678:4f0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4f4::,2001:678:4f4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:4f8::,2001:678:4f8:ffff:ffff:ffff:ffff:ffff,RU +2001:678:4fc::,2001:678:4fc:ffff:ffff:ffff:ffff:ffff,DE +2001:678:500::,2001:678:500:ffff:ffff:ffff:ffff:ffff,GB +2001:678:504::,2001:678:504:ffff:ffff:ffff:ffff:ffff,PL +2001:678:508::,2001:678:508:ffff:ffff:ffff:ffff:ffff,ES +2001:678:50c::,2001:678:50c:ffff:ffff:ffff:ffff:ffff,DE +2001:678:510::,2001:678:510:ffff:ffff:ffff:ffff:ffff,AT +2001:678:514::,2001:678:514:ffff:ffff:ffff:ffff:ffff,PT +2001:678:518::,2001:678:518:ffff:ffff:ffff:ffff:ffff,DE +2001:678:51c::,2001:678:51c:ffff:ffff:ffff:ffff:ffff,DK +2001:678:520::,2001:678:520:ffff:ffff:ffff:ffff:ffff,RU +2001:678:524::,2001:678:524:ffff:ffff:ffff:ffff:ffff,SE +2001:678:528::,2001:678:528:ffff:ffff:ffff:ffff:ffff,AT +2001:678:52c::,2001:678:52c:ffff:ffff:ffff:ffff:ffff,FI +2001:678:530::,2001:678:530:ffff:ffff:ffff:ffff:ffff,PL +2001:678:534::,2001:678:534:ffff:ffff:ffff:ffff:ffff,RU +2001:678:538::,2001:678:538:ffff:ffff:ffff:ffff:ffff,NL +2001:678:53c::,2001:678:53c:ffff:ffff:ffff:ffff:ffff,NL +2001:678:540::,2001:678:540:ffff:ffff:ffff:ffff:ffff,DE +2001:678:544::,2001:678:544:ffff:ffff:ffff:ffff:ffff,IE +2001:678:548::,2001:678:548:ffff:ffff:ffff:ffff:ffff,RU +2001:678:54c::,2001:678:54c:ffff:ffff:ffff:ffff:ffff,SE +2001:678:550::,2001:678:550:ffff:ffff:ffff:ffff:ffff,GB +2001:678:554::,2001:678:554:ffff:ffff:ffff:ffff:ffff,DK +2001:678:558::,2001:678:558:ffff:ffff:ffff:ffff:ffff,DE +2001:678:55c::,2001:678:55c:ffff:ffff:ffff:ffff:ffff,SE +2001:678:560::,2001:678:560:ffff:ffff:ffff:ffff:ffff,DE +2001:678:564::,2001:678:564:ffff:ffff:ffff:ffff:ffff,UA +2001:678:568::,2001:678:568:ffff:ffff:ffff:ffff:ffff,RU +2001:678:56c::,2001:678:56c:ffff:ffff:ffff:ffff:ffff,NL +2001:678:570::,2001:678:570:ffff:ffff:ffff:ffff:ffff,PL +2001:678:574::,2001:678:574:ffff:ffff:ffff:ffff:ffff,PL +2001:678:578::,2001:678:578:ffff:ffff:ffff:ffff:ffff,DE +2001:678:57c::,2001:678:57c:ffff:ffff:ffff:ffff:ffff,RU +2001:678:580::,2001:678:580:ffff:ffff:ffff:ffff:ffff,DE +2001:678:584::,2001:678:584:ffff:ffff:ffff:ffff:ffff,DE +2001:67c::,2001:67c::ffff:ffff:ffff:ffff:ffff,IE +2001:67c:4::,2001:67c:4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:8::,2001:67c:8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:c::,2001:67c:c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:10::,2001:67c:10:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:14::,2001:67c:14:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18::,2001:67c:18:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1c::,2001:67c:1c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:20::,2001:67c:20:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:24::,2001:67c:24:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:28::,2001:67c:28:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2c::,2001:67c:2c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:30::,2001:67c:30:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:34::,2001:67c:34:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:38::,2001:67c:38:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:3c::,2001:67c:3c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:40::,2001:67c:40:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:44::,2001:67c:44:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:48::,2001:67c:48:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:4c::,2001:67c:4c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:50::,2001:67c:50:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:54::,2001:67c:54:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:58::,2001:67c:58:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:5c::,2001:67c:5c:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:60::,2001:67c:60:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:64::,2001:67c:64:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:68::,2001:67c:68:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:6c::,2001:67c:6c:ffff:ffff:ffff:ffff:ffff,IS +2001:67c:70::,2001:67c:70:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:74::,2001:67c:74:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:78::,2001:67c:78:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:7c::,2001:67c:7c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:80::,2001:67c:80:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:84::,2001:67c:84:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:88::,2001:67c:88:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:8c::,2001:67c:8c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:90::,2001:67c:90:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:94::,2001:67c:94:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:98::,2001:67c:98:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:9c::,2001:67c:9c:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:a0::,2001:67c:a0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:a4::,2001:67c:a4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:a8::,2001:67c:a8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:ac::,2001:67c:ac:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:b0::,2001:67c:b0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:b4::,2001:67c:b4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:b8::,2001:67c:b8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:bc::,2001:67c:bc:ffff:ffff:ffff:ffff:ffff,EE +2001:67c:c0::,2001:67c:c0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:c4::,2001:67c:c4:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:c8::,2001:67c:c8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:cc::,2001:67c:cc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:d0::,2001:67c:d0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:d4::,2001:67c:d4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:d8::,2001:67c:d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:dc::,2001:67c:dc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:e0::,2001:67c:e0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:e4::,2001:67c:e4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:e8::,2001:67c:e8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:ec::,2001:67c:ec:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:f0::,2001:67c:f0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:f4::,2001:67c:f4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:f8::,2001:67c:f8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:fc::,2001:67c:fc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:100::,2001:67c:100:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:104::,2001:67c:104:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:108::,2001:67c:108:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:10c::,2001:67c:10c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:110::,2001:67c:110:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:114::,2001:67c:114:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:118::,2001:67c:118:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:11c::,2001:67c:11c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:120::,2001:67c:120:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:124::,2001:67c:124:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:128::,2001:67c:128:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:12c::,2001:67c:12c:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:130::,2001:67c:130:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:134::,2001:67c:134:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:138::,2001:67c:138:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:13c::,2001:67c:13c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:140::,2001:67c:140:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:144::,2001:67c:144:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:148::,2001:67c:148:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:14c::,2001:67c:14d:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:150::,2001:67c:150:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:154::,2001:67c:154:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:158::,2001:67c:158:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:15c::,2001:67c:15c:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:160::,2001:67c:160:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:164::,2001:67c:164:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:168::,2001:67c:168:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:16c::,2001:67c:16c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:170::,2001:67c:170:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:174::,2001:67c:174:7fff:ffff:ffff:ffff:ffff,NL +2001:67c:174:8000::,2001:67c:174:ffff:ffff:ffff:ffff:ffff,SM +2001:67c:178::,2001:67c:178:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:17c::,2001:67c:17c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:180::,2001:67c:180:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:184::,2001:67c:184:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:188::,2001:67c:188:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:18c::,2001:67c:18c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:190::,2001:67c:190:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:194::,2001:67c:194:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:198::,2001:67c:198:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:19c::,2001:67c:19c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1a0::,2001:67c:1a0:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:1a4::,2001:67c:1a4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1a8::,2001:67c:1a8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1ac::,2001:67c:1ac:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1b0::,2001:67c:1b0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1b4::,2001:67c:1b4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1b8::,2001:67c:1b8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1bc::,2001:67c:1bc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1c0::,2001:67c:1c0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1c4::,2001:67c:1c4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1c8::,2001:67c:1c8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1cc::,2001:67c:1cc:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:1d0::,2001:67c:1d0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1d4::,2001:67c:1d4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1d8::,2001:67c:1d8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1dc::,2001:67c:1dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1e0::,2001:67c:1e0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1e4::,2001:67c:1e4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1e8::,2001:67c:1e8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1ec::,2001:67c:1ec:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:1f0::,2001:67c:1f0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1f4::,2001:67c:1f4:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:1f8::,2001:67c:1f8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1fc::,2001:67c:1fc:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:200::,2001:67c:200:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:204::,2001:67c:204:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:208::,2001:67c:208:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:20c::,2001:67c:20c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:210::,2001:67c:210:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:214::,2001:67c:214:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:218::,2001:67c:218:ffff:ffff:ffff:ffff:ffff,LT +2001:67c:21c::,2001:67c:21c:ffff:ffff:ffff:ffff:ffff,AM +2001:67c:220::,2001:67c:220:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:224::,2001:67c:224:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:228::,2001:67c:228:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:22c::,2001:67c:22c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:230::,2001:67c:230:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:234::,2001:67c:234:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:238::,2001:67c:238:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:23c::,2001:67c:23c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:240::,2001:67c:240:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:244::,2001:67c:244:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:248::,2001:67c:248:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:24c::,2001:67c:24c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:250::,2001:67c:250:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:254::,2001:67c:254:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:258::,2001:67c:258:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:25c::,2001:67c:25c:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:260::,2001:67c:260:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:264::,2001:67c:264:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:268::,2001:67c:268:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:26c::,2001:67c:26c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:270::,2001:67c:270:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:274::,2001:67c:274:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:278::,2001:67c:278:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:27c::,2001:67c:27c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:280::,2001:67c:280:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:284::,2001:67c:284:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:288::,2001:67c:288:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:28c::,2001:67c:28c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:290::,2001:67c:290:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:294::,2001:67c:294:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:298::,2001:67c:298:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:29c::,2001:67c:29c:ffff:ffff:ffff:ffff:ffff,IT +2001:67c:2a0::,2001:67c:2a0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2a4::,2001:67c:2a4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a8::,2001:67c:2a8:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2ac::,2001:67c:2ac:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2b0::,2001:67c:2b0:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2b4::,2001:67c:2b4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2b8::,2001:67c:2b8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2bc::,2001:67c:2bc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c0::,2001:67c:2c0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2c4::,2001:67c:2c4:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c8::,2001:67c:2c8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2cc::,2001:67c:2cc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d0::,2001:67c:2d0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2d4::,2001:67c:2d4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2d8::,2001:67c:2d8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2dc::,2001:67c:2dc:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2e0::,2001:67c:2e0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2e4::,2001:67c:2e4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2e8::,2001:67c:2e8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2ec::,2001:67c:2ec:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2f0::,2001:67c:2f0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2f4::,2001:67c:2f4:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:2f8::,2001:67c:2f8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2fc::,2001:67c:2fc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:300::,2001:67c:300:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:304::,2001:67c:304:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:308::,2001:67c:308:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:30c::,2001:67c:30c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:310::,2001:67c:310:ffff:ffff:ffff:ffff:ffff,CY +2001:67c:314::,2001:67c:314:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:318::,2001:67c:318:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:31c::,2001:67c:31c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:320::,2001:67c:320:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:324::,2001:67c:324:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:328::,2001:67c:328:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:32c::,2001:67c:32c:ffff:ffff:ffff:ffff:ffff,EE +2001:67c:330::,2001:67c:330:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:334::,2001:67c:334:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:338::,2001:67c:338:ffff:ffff:ffff:ffff:ffff,IE +2001:67c:33c::,2001:67c:33c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:340::,2001:67c:340:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:344::,2001:67c:344:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:348::,2001:67c:348:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:34c::,2001:67c:34c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:350::,2001:67c:350:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:354::,2001:67c:354:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:358::,2001:67c:358:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:35c::,2001:67c:35c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:360::,2001:67c:360:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:364::,2001:67c:364:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:368::,2001:67c:368:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:36c::,2001:67c:36c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:370::,2001:67c:370:ffff:ffff:ffff:ffff:ffff,SG +2001:67c:374::,2001:67c:374:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:378::,2001:67c:378:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:37c::,2001:67c:37c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:380::,2001:67c:380:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:384::,2001:67c:384:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:388::,2001:67c:388:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:38c::,2001:67c:38c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:390::,2001:67c:390:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:394::,2001:67c:394:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:398::,2001:67c:398:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:39c::,2001:67c:39c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:3a0::,2001:67c:3a0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:3a4::,2001:67c:3a4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:3a8::,2001:67c:3a8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:3ac::,2001:67c:3ac:ffff:ffff:ffff:ffff:ffff,RS +2001:67c:3b0::,2001:67c:3b0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:3b4::,2001:67c:3b4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:3b8::,2001:67c:3b8:ffff:ffff:ffff:ffff:ffff,IE +2001:67c:3bc::,2001:67c:3bc:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:3c0::,2001:67c:3c0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:3c4::,2001:67c:3c4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:3c8::,2001:67c:3c8:ffff:ffff:ffff:ffff:ffff,EE +2001:67c:3cc::,2001:67c:3cc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:3d0::,2001:67c:3d0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:3d4::,2001:67c:3d4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:3d8::,2001:67c:3d8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:3dc::,2001:67c:3dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:3e0::,2001:67c:3e0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:3e4::,2001:67c:3e4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:3e8::,2001:67c:3e9:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:3f0::,2001:67c:3f0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:3f4::,2001:67c:3f4:ffff:ffff:ffff:ffff:ffff,HR +2001:67c:3f8::,2001:67c:3f8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:3fc::,2001:67c:3fc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:404::,2001:67c:404:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:408::,2001:67c:408:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:40c::,2001:67c:40c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:410::,2001:67c:410:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:414::,2001:67c:414:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:418::,2001:67c:418:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:41c::,2001:67c:41c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:420::,2001:67c:420:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:424::,2001:67c:424:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:428::,2001:67c:428:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:42c::,2001:67c:42c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:430::,2001:67c:430:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:434::,2001:67c:434:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:438::,2001:67c:438:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:43c::,2001:67c:43c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:440::,2001:67c:440:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:444::,2001:67c:444:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:448::,2001:67c:448:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:44c::,2001:67c:44c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:450::,2001:67c:450:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:454::,2001:67c:454:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:458::,2001:67c:458:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:45c::,2001:67c:45c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:460::,2001:67c:460:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:464::,2001:67c:464:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:468::,2001:67c:468:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:46c::,2001:67c:46c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:470::,2001:67c:470:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:474::,2001:67c:474:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:478::,2001:67c:478:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:47c::,2001:67c:47c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:480::,2001:67c:480:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:484::,2001:67c:484:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:488::,2001:67c:488:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:48c::,2001:67c:48c:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:490::,2001:67c:490:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:494::,2001:67c:494:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:498::,2001:67c:498:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:49c::,2001:67c:49c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4a0::,2001:67c:4a0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:4a4::,2001:67c:4a4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4a8::,2001:67c:4a8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:4ac::,2001:67c:4ac:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:4b0::,2001:67c:4b0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:4b4::,2001:67c:4b4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:4b8::,2001:67c:4b8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:4bc::,2001:67c:4bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4c0::,2001:67c:4c0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:4c4::,2001:67c:4c4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4c8::,2001:67c:4c8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:4cc::,2001:67c:4cc:ffff:ffff:ffff:ffff:ffff,IL +2001:67c:4d0::,2001:67c:4d0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:4d4::,2001:67c:4d4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:4d8::,2001:67c:4d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4dc::,2001:67c:4dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:4e0::,2001:67c:4e0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:4e4::,2001:67c:4e4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4e8::,2001:67c:4e8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:4ec::,2001:67c:4ec:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:4f0::,2001:67c:4f0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:4f4::,2001:67c:4f4:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:4f8::,2001:67c:4f8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:4fc::,2001:67c:4fc:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:500::,2001:67c:500:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:504::,2001:67c:504:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:508::,2001:67c:508:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:50c::,2001:67c:50c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:510::,2001:67c:510:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:514::,2001:67c:514:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:518::,2001:67c:518:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:51c::,2001:67c:51c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:520::,2001:67c:520:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:524::,2001:67c:524:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:528::,2001:67c:528:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:52c::,2001:67c:52c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:530::,2001:67c:530:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:534::,2001:67c:534:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:538::,2001:67c:538:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:53c::,2001:67c:53c:ffff:ffff:ffff:ffff:ffff,HR +2001:67c:540::,2001:67c:540:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:544::,2001:67c:544:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:548::,2001:67c:548:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:54c::,2001:67c:54c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:550::,2001:67c:550:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:554::,2001:67c:554:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:558::,2001:67c:558:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:55c::,2001:67c:55c:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:560::,2001:67c:560:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:564::,2001:67c:564:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:568::,2001:67c:568:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:56c::,2001:67c:56c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:570::,2001:67c:570:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:574::,2001:67c:574:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:578::,2001:67c:578:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:57c::,2001:67c:57c:ffff:ffff:ffff:ffff:ffff,BY +2001:67c:580::,2001:67c:580:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:584::,2001:67c:584:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:588::,2001:67c:588:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:58c::,2001:67c:58c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:590::,2001:67c:590:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:594::,2001:67c:594:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:598::,2001:67c:598:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:59c::,2001:67c:59c:ffff:ffff:ffff:ffff:ffff,HU +2001:67c:5a0::,2001:67c:5a1:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:5a8::,2001:67c:5a8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:5ac::,2001:67c:5ac:ffff:ffff:ffff:ffff:ffff,BY +2001:67c:5b0::,2001:67c:5b0:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:5b4::,2001:67c:5b4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:5b8::,2001:67c:5b8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:5bc::,2001:67c:5bc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:5c0::,2001:67c:5c0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:5c4::,2001:67c:5c4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:5c8::,2001:67c:5c8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:5cc::,2001:67c:5cc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:5d0::,2001:67c:5d0:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:5d4::,2001:67c:5d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:5d8::,2001:67c:5d8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:5dc::,2001:67c:5dc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:5e0::,2001:67c:5e0:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:5e4::,2001:67c:5e4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:5e8::,2001:67c:5e8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:5ec::,2001:67c:5ec:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:5f0::,2001:67c:5f0:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:5f4::,2001:67c:5f4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:5f8::,2001:67c:5f8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:5fc::,2001:67c:5fc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:600::,2001:67c:600:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:604::,2001:67c:604:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:608::,2001:67c:608:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:60c::,2001:67c:60c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:610::,2001:67c:610:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:614::,2001:67c:614:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:618::,2001:67c:618:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:61c::,2001:67c:61c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:620::,2001:67c:620:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:624::,2001:67c:624:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:628::,2001:67c:628:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:62c::,2001:67c:62c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:630::,2001:67c:630:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:634::,2001:67c:634:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:638::,2001:67c:638:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:63c::,2001:67c:63c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:640::,2001:67c:640:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:644::,2001:67c:644:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:648::,2001:67c:648:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:64c::,2001:67c:64c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:650::,2001:67c:650:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:654::,2001:67c:654:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:658::,2001:67c:658:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:65c::,2001:67c:65c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:660::,2001:67c:660:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:664::,2001:67c:664:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:668::,2001:67c:668:ffff:ffff:ffff:ffff:ffff,MD +2001:67c:66c::,2001:67c:66c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:670::,2001:67c:670:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:674::,2001:67c:674:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:678::,2001:67c:678:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:67c::,2001:67c:67c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:680::,2001:67c:680:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:684::,2001:67c:684:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:688::,2001:67c:688:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:68c::,2001:67c:68c:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:690::,2001:67c:690:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:694::,2001:67c:694:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:698::,2001:67c:698:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:69c::,2001:67c:69c:ffff:ffff:ffff:ffff:ffff,RS +2001:67c:6a0::,2001:67c:6a0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:6a4::,2001:67c:6a4:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:6a8::,2001:67c:6a8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:6ac::,2001:67c:6ac:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:6b0::,2001:67c:6b0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:6b4::,2001:67c:6b4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:6b8::,2001:67c:6b8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:6bc::,2001:67c:6bc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:6c0::,2001:67c:6c0:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:6c4::,2001:67c:6c4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:6c8::,2001:67c:6c8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:6cc::,2001:67c:6cc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:6d0::,2001:67c:6d0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:6d4::,2001:67c:6d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:6d8::,2001:67c:6d8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:6dc::,2001:67c:6dc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:6e0::,2001:67c:6e0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:6e4::,2001:67c:6e4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:6e8::,2001:67c:6e8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:6ec::,2001:67c:6ec:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:6f0::,2001:67c:6f0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:6f4::,2001:67c:6f4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:6f8::,2001:67c:6f8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:6fc::,2001:67c:6fc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:700::,2001:67c:700:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:704::,2001:67c:704:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:708::,2001:67c:708:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:70c::,2001:67c:70c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:710::,2001:67c:710:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:714::,2001:67c:714:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:718::,2001:67c:718:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:71c::,2001:67c:71c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:720::,2001:67c:720:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:724::,2001:67c:724:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:728::,2001:67c:728:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:72c::,2001:67c:72c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:730::,2001:67c:730:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:734::,2001:67c:734:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:738::,2001:67c:738:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:73c::,2001:67c:73c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:740::,2001:67c:740:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:744::,2001:67c:744:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:748::,2001:67c:748:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:74c::,2001:67c:74c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:750::,2001:67c:750:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:754::,2001:67c:754:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:758::,2001:67c:758:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:75c::,2001:67c:75c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:760::,2001:67c:760:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:764::,2001:67c:764:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:768::,2001:67c:768:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:76c::,2001:67c:76c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:770::,2001:67c:770:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:774::,2001:67c:774:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:778::,2001:67c:778:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:77c::,2001:67c:77c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:780::,2001:67c:780:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:784::,2001:67c:784:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:788::,2001:67c:788:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:78c::,2001:67c:78c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:790::,2001:67c:790:ffff:ffff:ffff:ffff:ffff,IT +2001:67c:794::,2001:67c:794:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:798::,2001:67c:798:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:79c::,2001:67c:79c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:7a0::,2001:67c:7a0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:7a4::,2001:67c:7a4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:7a8::,2001:67c:7a8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:7ac::,2001:67c:7ac:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:7b0::,2001:67c:7b0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:7b4::,2001:67c:7b4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:7b8::,2001:67c:7b8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:7bc::,2001:67c:7bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:7c0::,2001:67c:7c3:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:7d0::,2001:67c:7d0:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:7d4::,2001:67c:7d4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:7d8::,2001:67c:7d8:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:7dc::,2001:67c:7dc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:7e0::,2001:67c:7e0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:7e4::,2001:67c:7e4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:7e8::,2001:67c:7e8:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:7ec::,2001:67c:7ec:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:7f0::,2001:67c:7f0:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:7f4::,2001:67c:7f4:ffff:ffff:ffff:ffff:ffff,KW +2001:67c:7f8::,2001:67c:7f8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:7fc::,2001:67c:7fc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1000::,2001:67c:1001:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1008::,2001:67c:1009:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1010::,2001:67c:1011:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1018::,2001:67c:1019:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1020::,2001:67c:1021:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1028::,2001:67c:1029:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1030::,2001:67c:1030:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1038::,2001:67c:1038:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:103c::,2001:67c:103c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1040::,2001:67c:1040:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1044::,2001:67c:1044:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1048::,2001:67c:1048:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:104c::,2001:67c:104c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1050::,2001:67c:1050:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:1054::,2001:67c:1054:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1058::,2001:67c:1058:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:105c::,2001:67c:105c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1060::,2001:67c:1060:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:1064::,2001:67c:1064:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1068::,2001:67c:1068:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:106c::,2001:67c:106c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1070::,2001:67c:1071:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:1078::,2001:67c:1078:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:107c::,2001:67c:107c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1080::,2001:67c:1080:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1084::,2001:67c:1084:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1088::,2001:67c:1089:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1090::,2001:67c:1090:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1094::,2001:67c:1094:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1098::,2001:67c:1098:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:109c::,2001:67c:109c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:10a0::,2001:67c:10a0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:10a4::,2001:67c:10a4:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:10a8::,2001:67c:10a9:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:10b0::,2001:67c:10b0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:10b4::,2001:67c:10b4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:10b8::,2001:67c:10b8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:10bc::,2001:67c:10bc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:10c0::,2001:67c:10c0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10c4::,2001:67c:10c4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:10c8::,2001:67c:10c8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10cc::,2001:67c:10cc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10d0::,2001:67c:10d0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10d4::,2001:67c:10d4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:10d8::,2001:67c:10d8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:10dc::,2001:67c:10dc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10e0::,2001:67c:10e0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:10e4::,2001:67c:10e4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10e8::,2001:67c:10e8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:10ec::,2001:67c:10ec:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:10f0::,2001:67c:10f0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:10f4::,2001:67c:10f4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:10f8::,2001:67c:10f8:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:10fc::,2001:67c:10fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1100::,2001:67c:1100:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1104::,2001:67c:1104:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1108::,2001:67c:1109:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1110::,2001:67c:1111:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1118::,2001:67c:1118:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:111c::,2001:67c:111c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1120::,2001:67c:1120:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1124::,2001:67c:1124:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:1128::,2001:67c:1128:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:112c::,2001:67c:112c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1130::,2001:67c:1130:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1134::,2001:67c:1134:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1138::,2001:67c:1138:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:113c::,2001:67c:113c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1140::,2001:67c:1140:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1144::,2001:67c:1144:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1148::,2001:67c:1148:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:114c::,2001:67c:114c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1150::,2001:67c:1150:ffff:ffff:ffff:ffff:ffff,IL +2001:67c:1154::,2001:67c:1154:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:1158::,2001:67c:1158:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:115c::,2001:67c:115c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1160::,2001:67c:1160:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1164::,2001:67c:1164:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1168::,2001:67c:1168:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:116c::,2001:67c:116c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1170::,2001:67c:1170:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1174::,2001:67c:1174:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1178::,2001:67c:1178:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:117c::,2001:67c:117c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1184::,2001:67c:1184:ffff:ffff:ffff:ffff:ffff,HR +2001:67c:1188::,2001:67c:1188:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:118c::,2001:67c:118c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1190::,2001:67c:1190:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1194::,2001:67c:1194:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1198::,2001:67c:1199:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:11a0::,2001:67c:11a0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:11a4::,2001:67c:11a4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:11a8::,2001:67c:11a8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:11ac::,2001:67c:11ac:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:11b0::,2001:67c:11b0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:11b4::,2001:67c:11b4:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:11b8::,2001:67c:11b8:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:11bc::,2001:67c:11bc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:11c0::,2001:67c:11c0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:11c4::,2001:67c:11c4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:11c8::,2001:67c:11c8:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:11cc::,2001:67c:11cc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:11d0::,2001:67c:11d0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:11d4::,2001:67c:11d4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:11d8::,2001:67c:11d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:11dc::,2001:67c:11dc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:11e0::,2001:67c:11e0:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:11e4::,2001:67c:11e4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:11e8::,2001:67c:11e8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:11ec::,2001:67c:11ec:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:11f0::,2001:67c:11f0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:11f4::,2001:67c:11f4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:11f8::,2001:67c:11f8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:11fc::,2001:67c:11fc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1200::,2001:67c:1200:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1204::,2001:67c:1204:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1208::,2001:67c:1208:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:120c::,2001:67c:120c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1210::,2001:67c:1213:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1220::,2001:67c:1223:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1230::,2001:67c:1233:ffff:ffff:ffff:ffff:ffff,SG +2001:67c:1240::,2001:67c:1240:ffff:ffff:ffff:ffff:ffff,IE +2001:67c:1244::,2001:67c:1244:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1248::,2001:67c:1248:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:124c::,2001:67c:124c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1250::,2001:67c:1250:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1254::,2001:67c:1254:7fff:ffff:ffff:ffff:ffff,JP +2001:67c:1254:8000::,2001:67c:1254:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1258::,2001:67c:1258:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:125c::,2001:67c:125c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1260::,2001:67c:1260:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1264::,2001:67c:1264:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1268::,2001:67c:1268:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:126c::,2001:67c:126c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1270::,2001:67c:1270:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1274::,2001:67c:1274:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1278::,2001:67c:1278:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:127c::,2001:67c:127c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:1280::,2001:67c:1280:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1284::,2001:67c:1284:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1288::,2001:67c:1288:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:128c::,2001:67c:128c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1290::,2001:67c:1290:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1294::,2001:67c:1294:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1298::,2001:67c:1298:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:129c::,2001:67c:129c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:12a0::,2001:67c:12a0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:12a4::,2001:67c:12a4:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:12a8::,2001:67c:12a8:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:12ac::,2001:67c:12ac:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:12b0::,2001:67c:12b0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:12b4::,2001:67c:12b4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:12b8::,2001:67c:12b8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:12bc::,2001:67c:12bc:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:12c0::,2001:67c:12c1:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:12c8::,2001:67c:12c8:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:12cc::,2001:67c:12cc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:12d0::,2001:67c:12d0:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:12d4::,2001:67c:12d4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:12d8::,2001:67c:12d8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:12dc::,2001:67c:12dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:12e0::,2001:67c:12e0:ffff:ffff:ffff:ffff:ffff,KG +2001:67c:12e4::,2001:67c:12e4:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:12e8::,2001:67c:12e9:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:12f0::,2001:67c:12f0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:12f4::,2001:67c:12f4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:12f8::,2001:67c:12f8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:12fc::,2001:67c:12fc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1300::,2001:67c:1300:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1304::,2001:67c:1304:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1308::,2001:67c:1308:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:130c::,2001:67c:130c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1310::,2001:67c:1310:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1314::,2001:67c:1314:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1318::,2001:67c:1318:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:131c::,2001:67c:131c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1320::,2001:67c:1320:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1324::,2001:67c:1324:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1328::,2001:67c:1328:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:132c::,2001:67c:132c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1330::,2001:67c:1330:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1334::,2001:67c:1334:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1338::,2001:67c:1338:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:133c::,2001:67c:133c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1340::,2001:67c:1340:ffff:ffff:ffff:ffff:ffff,HR +2001:67c:1344::,2001:67c:1344:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1348::,2001:67c:1348:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:134c::,2001:67c:134c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1350::,2001:67c:1350:ffff:ffff:ffff:ffff:ffff,CY +2001:67c:1354::,2001:67c:1354:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1358::,2001:67c:1358:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:135c::,2001:67c:135c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1360::,2001:67c:1360:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1364::,2001:67c:1364:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1368::,2001:67c:1368:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:136c::,2001:67c:136c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1370::,2001:67c:1370:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1374::,2001:67c:1374:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1378::,2001:67c:1378:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:137c::,2001:67c:137c:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:1380::,2001:67c:1380:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1384::,2001:67c:1384:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1388::,2001:67c:1388:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:138c::,2001:67c:138c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1390::,2001:67c:1390:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1394::,2001:67c:1394:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1398::,2001:67c:1398:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:139c::,2001:67c:139c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:13a0::,2001:67c:13a0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:13a4::,2001:67c:13a4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:13a8::,2001:67c:13a8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:13ac::,2001:67c:13ac:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:13b0::,2001:67c:13b0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:13b4::,2001:67c:13b4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:13b8::,2001:67c:13b8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:13bc::,2001:67c:13bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:13c0::,2001:67c:13c0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:13c4::,2001:67c:13c4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:13c8::,2001:67c:13c8:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:13cc::,2001:67c:13cc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:13d0::,2001:67c:13d0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:13d4::,2001:67c:13d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:13d8::,2001:67c:13d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:13dc::,2001:67c:13dc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:13e0::,2001:67c:13e0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:13e4::,2001:67c:13e4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:13e8::,2001:67c:13e8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:13ec::,2001:67c:13ec:ffff:ffff:ffff:ffff:ffff,PT +2001:67c:13f0::,2001:67c:13f0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:13f4::,2001:67c:13f4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:13f8::,2001:67c:13f8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:13fc::,2001:67c:13fc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1400::,2001:67c:1407:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1420::,2001:67c:1420:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1424::,2001:67c:1424:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:142c::,2001:67c:142c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1430::,2001:67c:1430:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1434::,2001:67c:1434:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1438::,2001:67c:1438:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:143c::,2001:67c:143c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1440::,2001:67c:1447:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1460::,2001:67c:1467:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1480::,2001:67c:1480:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1484::,2001:67c:1484:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1488::,2001:67c:1488:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:148c::,2001:67c:148c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1490::,2001:67c:1490:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1494::,2001:67c:1494:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1498::,2001:67c:1498:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:149c::,2001:67c:149c:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:14a0::,2001:67c:14a0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:14a4::,2001:67c:14a4:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:14a8::,2001:67c:14a8:ffff:ffff:ffff:ffff:ffff,KZ +2001:67c:14ac::,2001:67c:14ac:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:14b0::,2001:67c:14b0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:14b4::,2001:67c:14b4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:14b8::,2001:67c:14b8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:14bc::,2001:67c:14bc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:14c0::,2001:67c:14c0:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:14c4::,2001:67c:14c4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:14c8::,2001:67c:14c9:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:14d0::,2001:67c:14d0:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:14d4::,2001:67c:14d4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:14d8::,2001:67c:14d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:14dc::,2001:67c:14dc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:14e0::,2001:67c:14e7:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1500::,2001:67c:1500:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1504::,2001:67c:1504:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1508::,2001:67c:1508:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:150c::,2001:67c:150c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1510::,2001:67c:1510:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1514::,2001:67c:1514:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1518::,2001:67c:1518:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:151c::,2001:67c:151c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1520::,2001:67c:1520:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1524::,2001:67c:1524:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1528::,2001:67c:1528:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:152c::,2001:67c:152c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1530::,2001:67c:1530:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1534::,2001:67c:1534:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1538::,2001:67c:1538:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:153c::,2001:67c:153c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1540::,2001:67c:1540:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1544::,2001:67c:1544:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1548::,2001:67c:1548:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:154c::,2001:67c:154c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1550::,2001:67c:1550:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1554::,2001:67c:1554:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:1558::,2001:67c:1558:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:155c::,2001:67c:155c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1560::,2001:67c:1562:7fff:ffff:ffff:ffff:ffff,GB +2001:67c:1562:8000::,2001:67c:1562:ffff:ffff:ffff:ffff:ffff,AU +2001:67c:1563::,2001:67c:1563:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1570::,2001:67c:1570:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1574::,2001:67c:1574:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1578::,2001:67c:1578:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:157c::,2001:67c:157c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1580::,2001:67c:1580:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1584::,2001:67c:1584:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1588::,2001:67c:1588:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:158c::,2001:67c:158c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1590::,2001:67c:1591:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1598::,2001:67c:1598:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:159c::,2001:67c:159c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:15a0::,2001:67c:15a3:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:15b0::,2001:67c:15b0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:15b4::,2001:67c:15b4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:15b8::,2001:67c:15b8:ffff:ffff:ffff:ffff:ffff,SM +2001:67c:15bc::,2001:67c:15bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15c0::,2001:67c:15c0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:15c4::,2001:67c:15c4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15c8::,2001:67c:15c8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15cc::,2001:67c:15cc:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:15d0::,2001:67c:15d0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:15d4::,2001:67c:15d4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15d8::,2001:67c:15d8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:15dc::,2001:67c:15dc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:15e0::,2001:67c:15e0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:15e4::,2001:67c:15e4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:15e8::,2001:67c:15e8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15ec::,2001:67c:15ec:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15f0::,2001:67c:15f0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:15f4::,2001:67c:15f4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:15f8::,2001:67c:15f8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:15fc::,2001:67c:15fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1600::,2001:67c:160f:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1640::,2001:67c:164f:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:1680::,2001:67c:1680:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1684::,2001:67c:1684:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:1688::,2001:67c:1688:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:168c::,2001:67c:168c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1690::,2001:67c:1690:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1694::,2001:67c:1694:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1698::,2001:67c:1698:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:169c::,2001:67c:169c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:16a0::,2001:67c:16a0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:16a4::,2001:67c:16a4:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:16a8::,2001:67c:16a8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:16ac::,2001:67c:16ac:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:16b0::,2001:67c:16b0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:16b4::,2001:67c:16b4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:16b8::,2001:67c:16b8:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:16bc::,2001:67c:16bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:16c0::,2001:67c:16c0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:16c4::,2001:67c:16c4:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:16c8::,2001:67c:16c8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:16cc::,2001:67c:16cc:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:16d0::,2001:67c:16d1:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:16d8::,2001:67c:16d8:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:16dc::,2001:67c:16dc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:16e0::,2001:67c:16e0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:16e4::,2001:67c:16e4:ffff:ffff:ffff:ffff:ffff,HR +2001:67c:16e8::,2001:67c:16e8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:16ec::,2001:67c:16ec:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:16f0::,2001:67c:16f0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:16f4::,2001:67c:16f4:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:16f8::,2001:67c:16f8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:16fc::,2001:67c:16fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1700::,2001:67c:1700:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1704::,2001:67c:1704:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1708::,2001:67c:1708:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:170c::,2001:67c:170c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1710::,2001:67c:1710:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1714::,2001:67c:1714:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1718::,2001:67c:1719:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1720::,2001:67c:1720:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1724::,2001:67c:1724:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1728::,2001:67c:1728:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:172c::,2001:67c:172c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1730::,2001:67c:1730:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1734::,2001:67c:1734:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1738::,2001:67c:1738:7fff:ffff:ffff:ffff:ffff,UA +2001:67c:1738:8000::,2001:67c:1738:ffff:ffff:ffff:ffff:ffff,IL +2001:67c:173c::,2001:67c:173c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1740::,2001:67c:1740:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1744::,2001:67c:1744:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:1748::,2001:67c:1748:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:174c::,2001:67c:174c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1750::,2001:67c:1750:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1754::,2001:67c:1754:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1758::,2001:67c:1758:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:175c::,2001:67c:175c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1760::,2001:67c:1760:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:1764::,2001:67c:1764:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1768::,2001:67c:1768:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:176c::,2001:67c:176c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1770::,2001:67c:1770:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1774::,2001:67c:1774:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1778::,2001:67c:1778:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:177c::,2001:67c:177c:ffff:ffff:ffff:ffff:ffff,LT +2001:67c:1780::,2001:67c:1780:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1784::,2001:67c:1784:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1788::,2001:67c:1788:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:178c::,2001:67c:178c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1790::,2001:67c:1790:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1794::,2001:67c:1794:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1798::,2001:67c:1798:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:179c::,2001:67c:179c:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:17a0::,2001:67c:17a0:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:17a4::,2001:67c:17a4:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:17a8::,2001:67c:17a8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17ac::,2001:67c:17ac:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17b0::,2001:67c:17b0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:17b4::,2001:67c:17b4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:17b8::,2001:67c:17b8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:17bc::,2001:67c:17bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17c0::,2001:67c:17c0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17c4::,2001:67c:17c4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17c8::,2001:67c:17c8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:17cc::,2001:67c:17cc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17d0::,2001:67c:17d0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:17d4::,2001:67c:17d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:17d8::,2001:67c:17d8:ffff:ffff:ffff:ffff:ffff,CY +2001:67c:17dc::,2001:67c:17dc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17e0::,2001:67c:17e0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17e4::,2001:67c:17e4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:17e8::,2001:67c:17e8:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:17ec::,2001:67c:17ec:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:17f0::,2001:67c:17f0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17f4::,2001:67c:17f4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17f8::,2001:67c:17f8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:17fc::,2001:67c:17fc:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1800::,2001:67c:1800:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1804::,2001:67c:1804:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1808::,2001:67c:1809:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:1810::,2001:67c:1810:7fff:ffff:ffff:ffff:ffff,BE +2001:67c:1810:8000::,2001:67c:1810:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:1814::,2001:67c:1814:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1818::,2001:67c:1818:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:181c::,2001:67c:181c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1820::,2001:67c:1820:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1824::,2001:67c:1824:ffff:ffff:ffff:ffff:ffff,IS +2001:67c:1828::,2001:67c:1828:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:182c::,2001:67c:182c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1830::,2001:67c:1830:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1834::,2001:67c:1834:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:1838::,2001:67c:1838:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:183c::,2001:67c:183c:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:1840::,2001:67c:1840:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1844::,2001:67c:1844:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1848::,2001:67c:1848:ffff:ffff:ffff:ffff:ffff,MD +2001:67c:184c::,2001:67c:184c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1850::,2001:67c:1850:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:1854::,2001:67c:1854:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1858::,2001:67c:1858:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:185c::,2001:67c:185c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:1860::,2001:67c:1860:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1864::,2001:67c:1864:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1868::,2001:67c:1868:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:186c::,2001:67c:186c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1870::,2001:67c:1870:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1874::,2001:67c:1874:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1878::,2001:67c:1878:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:187c::,2001:67c:187c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1880::,2001:67c:1880:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1884::,2001:67c:1884:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1888::,2001:67c:1888:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:188c::,2001:67c:188c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1890::,2001:67c:1890:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1894::,2001:67c:1894:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1898::,2001:67c:1898:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:189c::,2001:67c:189c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:18a0::,2001:67c:18a0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:18a4::,2001:67c:18a4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:18a8::,2001:67c:18a8:ffff:ffff:ffff:ffff:ffff,BY +2001:67c:18ac::,2001:67c:18ac:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:18b0::,2001:67c:18b0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18b4::,2001:67c:18b4:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:18b8::,2001:67c:18b8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18bc::,2001:67c:18bc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18c0::,2001:67c:18c0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:18c4::,2001:67c:18c4:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:18c8::,2001:67c:18c9:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:18d0::,2001:67c:18d0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:18d4::,2001:67c:18d4:ffff:ffff:ffff:ffff:ffff,NZ +2001:67c:18d8::,2001:67c:18d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:18dc::,2001:67c:18dc:ffff:ffff:ffff:ffff:ffff,LI +2001:67c:18e0::,2001:67c:18e0:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:18e4::,2001:67c:18e4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:18e8::,2001:67c:18e8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18ec::,2001:67c:18ec:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18f0::,2001:67c:18f0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18f4::,2001:67c:18f4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:18fc::,2001:67c:18fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1900::,2001:67c:1903:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:1910::,2001:67c:1910:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1914::,2001:67c:1914:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1918::,2001:67c:1918:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:191c::,2001:67c:191c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1920::,2001:67c:1920:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1924::,2001:67c:1924:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1928::,2001:67c:1928:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:192c::,2001:67c:192c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1930::,2001:67c:1933:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1940::,2001:67c:1940:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1944::,2001:67c:1944:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1948::,2001:67c:1948:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:194c::,2001:67c:194c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1950::,2001:67c:1950:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1954::,2001:67c:1954:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1958::,2001:67c:1958:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:195c::,2001:67c:195c:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:1960::,2001:67c:1960:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1968::,2001:67c:1968:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:196c::,2001:67c:196c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1970::,2001:67c:1970:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1974::,2001:67c:1974:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1978::,2001:67c:1978:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:197c::,2001:67c:197c:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:1980::,2001:67c:1980:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1984::,2001:67c:1984:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:1988::,2001:67c:1988:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:198c::,2001:67c:198c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1990::,2001:67c:1990:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1994::,2001:67c:1994:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1998::,2001:67c:1998:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:199c::,2001:67c:199c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:19a0::,2001:67c:19a0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:19a4::,2001:67c:19a4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:19a8::,2001:67c:19a8:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:19ac::,2001:67c:19ac:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:19b0::,2001:67c:19b3:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:19c0::,2001:67c:19c0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:19c4::,2001:67c:19c4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:19c8::,2001:67c:19c8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:19cc::,2001:67c:19cc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:19d0::,2001:67c:19d0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:19d4::,2001:67c:19d4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:19d8::,2001:67c:19d8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:19dc::,2001:67c:19dc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:19e0::,2001:67c:19e0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:19e8::,2001:67c:19e8:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:19ec::,2001:67c:19ec:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:19f0::,2001:67c:19f0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:19f4::,2001:67c:19f4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:19f8::,2001:67c:19f8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:19fc::,2001:67c:19fc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1a00::,2001:67c:1a3f:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1b00::,2001:67c:1b00:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b04::,2001:67c:1b04:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b08::,2001:67c:1b08:ffff:ffff:ffff:ffff:ffff,IT +2001:67c:1b0c::,2001:67c:1b0c:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:1b10::,2001:67c:1b10:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b14::,2001:67c:1b14:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1b18::,2001:67c:1b18:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b1c::,2001:67c:1b1c:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:1b24::,2001:67c:1b24:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1b28::,2001:67c:1b28:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b2c::,2001:67c:1b2c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1b34::,2001:67c:1b34:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1b38::,2001:67c:1b38:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1b3c::,2001:67c:1b3c:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:1b40::,2001:67c:1b43:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1b50::,2001:67c:1b50:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1b58::,2001:67c:1b59:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1b60::,2001:67c:1b60:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1b64::,2001:67c:1b64:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1b68::,2001:67c:1b68:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1b6c::,2001:67c:1b6c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1b70::,2001:67c:1b70:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1b74::,2001:67c:1b74:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1b78::,2001:67c:1b78:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b7c::,2001:67c:1b7c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b80::,2001:67c:1b80:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b84::,2001:67c:1b84:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1b88::,2001:67c:1b88:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1b8c::,2001:67c:1b8c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1b90::,2001:67c:1b90:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1b98::,2001:67c:1b98:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1b9c::,2001:67c:1b9c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1ba0::,2001:67c:1ba0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1ba4::,2001:67c:1ba4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1ba8::,2001:67c:1ba8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1bac::,2001:67c:1bac:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1bb0::,2001:67c:1bb0:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:1bb4::,2001:67c:1bb4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1bb8::,2001:67c:1bb8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1bbc::,2001:67c:1bbc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1bc0::,2001:67c:1bc0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1bc4::,2001:67c:1bc4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1bc8::,2001:67c:1bc8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1bcc::,2001:67c:1bcc:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1bd0::,2001:67c:1bd0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1bd4::,2001:67c:1bd4:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:1bd8::,2001:67c:1bd8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1be0::,2001:67c:1be0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1be4::,2001:67c:1be4:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1be8::,2001:67c:1be8:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:1bec::,2001:67c:1bec:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1bf0::,2001:67c:1bf0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1bf4::,2001:67c:1bf4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1bf8::,2001:67c:1bf8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1bfc::,2001:67c:1bfc:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:1c00::,2001:67c:1cff:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2000::,2001:67c:2000:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2004::,2001:67c:2004:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2008::,2001:67c:2008:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:200c::,2001:67c:200c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2010::,2001:67c:2010:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2014::,2001:67c:2014:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2018::,2001:67c:2018:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:201c::,2001:67c:201c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2020::,2001:67c:2020:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2024::,2001:67c:2024:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2028::,2001:67c:2028:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:202c::,2001:67c:202c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2030::,2001:67c:2030:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2034::,2001:67c:2034:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2038::,2001:67c:2038:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:203c::,2001:67c:203c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2040::,2001:67c:2040:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:2044::,2001:67c:2044:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2048::,2001:67c:2048:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:204c::,2001:67c:204c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2050::,2001:67c:2050:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2054::,2001:67c:2054:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2058::,2001:67c:2058:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:205c::,2001:67c:205c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2060::,2001:67c:2060:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2064::,2001:67c:2064:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2068::,2001:67c:2068:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:206c::,2001:67c:206c:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2070::,2001:67c:2070:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2074::,2001:67c:2074:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2078::,2001:67c:2078:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:207c::,2001:67c:207c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2080::,2001:67c:2080:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2084::,2001:67c:2084:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2088::,2001:67c:2088:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:208c::,2001:67c:208c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2090::,2001:67c:2090:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2094::,2001:67c:2094:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2098::,2001:67c:2098:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:209c::,2001:67c:209c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:20a0::,2001:67c:20a1:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:20a8::,2001:67c:20a8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:20ac::,2001:67c:20ac:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:20b0::,2001:67c:20b0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:20b4::,2001:67c:20b4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:20b8::,2001:67c:20b9:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:20c0::,2001:67c:20c0:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:20c4::,2001:67c:20c4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:20c8::,2001:67c:20c8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:20cc::,2001:67c:20cc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:20d0::,2001:67c:20d1:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:20d8::,2001:67c:20d8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:20dc::,2001:67c:20dc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:20e0::,2001:67c:20e0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:20e4::,2001:67c:20e4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:20e8::,2001:67c:20e8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:20ec::,2001:67c:20ec:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:20f0::,2001:67c:20f0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:20f4::,2001:67c:20f4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:20f8::,2001:67c:20f8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:20fc::,2001:67c:20fc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2100::,2001:67c:2100:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2104::,2001:67c:2104:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2108::,2001:67c:2108:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:210c::,2001:67c:210c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2110::,2001:67c:2110:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2114::,2001:67c:2114:ffff:ffff:ffff:ffff:ffff,IS +2001:67c:2118::,2001:67c:2118:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:211c::,2001:67c:211c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2120::,2001:67c:2120:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2124::,2001:67c:2124:ffff:ffff:ffff:ffff:ffff,HU +2001:67c:2128::,2001:67c:2128:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:212c::,2001:67c:212c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2130::,2001:67c:2130:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2134::,2001:67c:2134:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2138::,2001:67c:2138:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:213c::,2001:67c:213c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2140::,2001:67c:2140:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2144::,2001:67c:2144:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2148::,2001:67c:2148:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:214c::,2001:67c:214c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2150::,2001:67c:2150:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2154::,2001:67c:2154:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2158::,2001:67c:2158:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:215c::,2001:67c:215c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2160::,2001:67c:2160:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2164::,2001:67c:2164:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:2168::,2001:67c:2168:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:216c::,2001:67c:216c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2170::,2001:67c:2170:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2174::,2001:67c:2174:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2178::,2001:67c:2178:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:217c::,2001:67c:217c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2180::,2001:67c:2180:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2184::,2001:67c:2184:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2188::,2001:67c:2188:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:218c::,2001:67c:218c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2190::,2001:67c:2190:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2194::,2001:67c:2194:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2198::,2001:67c:2198:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:219c::,2001:67c:219c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:21a0::,2001:67c:21a0:ffff:ffff:ffff:ffff:ffff,IT +2001:67c:21a4::,2001:67c:21a4:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:21a8::,2001:67c:21a8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:21ac::,2001:67c:21ac:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:21b0::,2001:67c:21b0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:21b4::,2001:67c:21b4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:21b8::,2001:67c:21b8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:21bc::,2001:67c:21bc:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:21c0::,2001:67c:21c0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:21c4::,2001:67c:21c4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:21c8::,2001:67c:21c8:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:21cc::,2001:67c:21cc:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:21d0::,2001:67c:21d0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:21d4::,2001:67c:21d4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:21d8::,2001:67c:21d8:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:21dc::,2001:67c:21dc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:21e0::,2001:67c:21e0:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:21e4::,2001:67c:21e4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:21e8::,2001:67c:21e8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:21ec::,2001:67c:21ec:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:21f0::,2001:67c:21f0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:21f4::,2001:67c:21f4:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:21f8::,2001:67c:21f8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:21fc::,2001:67c:21fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2200::,2001:67c:2200:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2204::,2001:67c:2204:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2208::,2001:67c:2208:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:220c::,2001:67c:220c:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2210::,2001:67c:2210:ffff:ffff:ffff:ffff:ffff,RS +2001:67c:2214::,2001:67c:2214:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2218::,2001:67c:2219:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2220::,2001:67c:2220:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2224::,2001:67c:2224:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2228::,2001:67c:2228:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:222c::,2001:67c:222c:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:2230::,2001:67c:2230:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2234::,2001:67c:2234:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2238::,2001:67c:2238:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:223c::,2001:67c:223c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2240::,2001:67c:2240:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2244::,2001:67c:2244:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2248::,2001:67c:2248:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:224c::,2001:67c:224c:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:2250::,2001:67c:2250:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2254::,2001:67c:2254:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2258::,2001:67c:2258:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:225c::,2001:67c:225c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2260::,2001:67c:2260:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2264::,2001:67c:2264:ffff:ffff:ffff:ffff:ffff,KG +2001:67c:2268::,2001:67c:2268:ffff:ffff:ffff:ffff:ffff,BY +2001:67c:226c::,2001:67c:226c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2270::,2001:67c:2270:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2274::,2001:67c:2274:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2278::,2001:67c:2278:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2280::,2001:67c:2280:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2284::,2001:67c:2284:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2288::,2001:67c:2288:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:228c::,2001:67c:228c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2290::,2001:67c:2290:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2294::,2001:67c:2294:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:2298::,2001:67c:2298:ffff:ffff:ffff:ffff:ffff,US +2001:67c:229c::,2001:67c:229c:ffff:ffff:ffff:ffff:ffff,GR +2001:67c:22a0::,2001:67c:22a0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:22a4::,2001:67c:22a4:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:22a8::,2001:67c:22a8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:22b0::,2001:67c:22b0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:22b4::,2001:67c:22b4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:22b8::,2001:67c:22b8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:22bc::,2001:67c:22bc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:22c0::,2001:67c:22c0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:22c4::,2001:67c:22c4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:22c8::,2001:67c:22c8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:22cc::,2001:67c:22cc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:22d0::,2001:67c:22d0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:22d4::,2001:67c:22d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:22d8::,2001:67c:22d8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:22dc::,2001:67c:22dc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:22e0::,2001:67c:22e0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:22e4::,2001:67c:22e4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:22e8::,2001:67c:22e8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:22ec::,2001:67c:22ec:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:22f0::,2001:67c:22f0:ffff:ffff:ffff:ffff:ffff,RS +2001:67c:22f4::,2001:67c:22f4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:22f8::,2001:67c:22f8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:22fc::,2001:67c:22fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2300::,2001:67c:2300:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2304::,2001:67c:2304:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2308::,2001:67c:2308:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:230c::,2001:67c:230c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2310::,2001:67c:2310:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2314::,2001:67c:2314:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2318::,2001:67c:2318:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:231c::,2001:67c:231c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2320::,2001:67c:2320:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2324::,2001:67c:2324:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2328::,2001:67c:2328:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:232c::,2001:67c:232c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2330::,2001:67c:2330:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2334::,2001:67c:2334:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2338::,2001:67c:2338:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:233c::,2001:67c:233c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2340::,2001:67c:2340:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2344::,2001:67c:2344:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2348::,2001:67c:2348:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:234c::,2001:67c:234c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2350::,2001:67c:2350:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2354::,2001:67c:2354:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2358::,2001:67c:2358:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:235c::,2001:67c:235c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2360::,2001:67c:2360:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2364::,2001:67c:2364:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2368::,2001:67c:2368:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:236c::,2001:67c:236c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2370::,2001:67c:2370:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2374::,2001:67c:2374:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2378::,2001:67c:2378:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:237c::,2001:67c:237c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2380::,2001:67c:2380:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2384::,2001:67c:2384:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2388::,2001:67c:2388:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:238c::,2001:67c:238c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2390::,2001:67c:2390:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2394::,2001:67c:2394:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2398::,2001:67c:2398:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:239c::,2001:67c:239c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:23a0::,2001:67c:23a0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:23a4::,2001:67c:23a4:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:23a8::,2001:67c:23a8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:23ac::,2001:67c:23ac:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:23b0::,2001:67c:23b0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:23b4::,2001:67c:23b4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:23b8::,2001:67c:23b8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:23bc::,2001:67c:23bc:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:23c0::,2001:67c:23c0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:23c4::,2001:67c:23c4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:23c8::,2001:67c:23c8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:23cc::,2001:67c:23cc:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:23d0::,2001:67c:23d0:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:23d4::,2001:67c:23d4:ffff:ffff:ffff:ffff:ffff,EE +2001:67c:23d8::,2001:67c:23d9:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:23e0::,2001:67c:23e0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:23e4::,2001:67c:23e4:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:23e8::,2001:67c:23e8:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:23ec::,2001:67c:23ec:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:23f0::,2001:67c:23f0:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:23f4::,2001:67c:23f4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:23f8::,2001:67c:23f8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:23fc::,2001:67c:23fc:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2400::,2001:67c:2400:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2404::,2001:67c:2404:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2408::,2001:67c:2408:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:240c::,2001:67c:240c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2410::,2001:67c:2410:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:2414::,2001:67c:2414:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2418::,2001:67c:2418:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:241c::,2001:67c:241c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2420::,2001:67c:2420:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2424::,2001:67c:2424:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2428::,2001:67c:2428:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:242c::,2001:67c:242c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2430::,2001:67c:2433:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2440::,2001:67c:2440:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2444::,2001:67c:2444:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2448::,2001:67c:2448:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:244c::,2001:67c:244c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2450::,2001:67c:2450:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2454::,2001:67c:2454:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2458::,2001:67c:2458:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:245c::,2001:67c:245c:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2460::,2001:67c:2460:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2464::,2001:67c:2464:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2468::,2001:67c:2468:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:246c::,2001:67c:246c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2470::,2001:67c:2470:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2474::,2001:67c:2474:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2478::,2001:67c:2478:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:247c::,2001:67c:247c:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2480::,2001:67c:2480:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2484::,2001:67c:2484:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2488::,2001:67c:2488:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:248c::,2001:67c:248c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2490::,2001:67c:2490:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2494::,2001:67c:2494:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2498::,2001:67c:2498:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:249c::,2001:67c:249c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:24a0::,2001:67c:24a0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:24a8::,2001:67c:24a8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:24ac::,2001:67c:24ac:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:24b0::,2001:67c:24b0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:24b4::,2001:67c:24b4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:24b8::,2001:67c:24b8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:24bc::,2001:67c:24bc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:24c0::,2001:67c:24c0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:24c4::,2001:67c:24c4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:24c8::,2001:67c:24c8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:24cc::,2001:67c:24cc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:24d0::,2001:67c:24d0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:24d4::,2001:67c:24d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:24d8::,2001:67c:24d8:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:24dc::,2001:67c:24dc:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:24e0::,2001:67c:24e0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:24e4::,2001:67c:24e4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:24e8::,2001:67c:24e9:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:24f0::,2001:67c:24f0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:24f4::,2001:67c:24f4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:24f8::,2001:67c:24f8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:24fc::,2001:67c:24fc:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2500::,2001:67c:2507:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2520::,2001:67c:2520:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2524::,2001:67c:2524:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2528::,2001:67c:2528:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:252c::,2001:67c:252c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2530::,2001:67c:2530:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2534::,2001:67c:2534:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2538::,2001:67c:2538:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:253c::,2001:67c:253c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2540::,2001:67c:2540:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2544::,2001:67c:2544:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2548::,2001:67c:2548:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:254c::,2001:67c:254c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2550::,2001:67c:2550:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2554::,2001:67c:2554:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2558::,2001:67c:2558:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:255c::,2001:67c:255c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2560::,2001:67c:2560:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2564::,2001:67c:2564:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2568::,2001:67c:2568:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:256c::,2001:67c:256c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2570::,2001:67c:2570:ffff:ffff:ffff:ffff:ffff,LI +2001:67c:2574::,2001:67c:2574:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2578::,2001:67c:2578:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:257c::,2001:67c:257c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2580::,2001:67c:2580:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2584::,2001:67c:2584:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2588::,2001:67c:2588:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:258c::,2001:67c:258c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2590::,2001:67c:2590:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2594::,2001:67c:2594:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2598::,2001:67c:2598:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:259c::,2001:67c:259c:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:25a0::,2001:67c:25a0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:25a4::,2001:67c:25a4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:25ac::,2001:67c:25ac:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:25b0::,2001:67c:25b0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:25b4::,2001:67c:25b4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:25b8::,2001:67c:25b8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:25bc::,2001:67c:25bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:25c0::,2001:67c:25c0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:25c4::,2001:67c:25c4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:25c8::,2001:67c:25c8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:25cc::,2001:67c:25cc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:25d0::,2001:67c:25d0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:25d4::,2001:67c:25d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:25d8::,2001:67c:25d8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:25dc::,2001:67c:25dc:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:25e0::,2001:67c:25e0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:25e4::,2001:67c:25e4:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:25e8::,2001:67c:25e8:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:25ec::,2001:67c:25ec:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:25f0::,2001:67c:25f0:ffff:ffff:ffff:ffff:ffff,IL +2001:67c:25f4::,2001:67c:25f4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:25fc::,2001:67c:25fc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2600::,2001:67c:2600:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2604::,2001:67c:2604:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:2608::,2001:67c:2608:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:260c::,2001:67c:260c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2610::,2001:67c:2610:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2614::,2001:67c:2614:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2618::,2001:67c:2618:ffff:ffff:ffff:ffff:ffff,EE +2001:67c:261c::,2001:67c:261c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2620::,2001:67c:2620:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2624::,2001:67c:2624:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:2628::,2001:67c:2628:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:262c::,2001:67c:262c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2630::,2001:67c:2630:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2634::,2001:67c:2634:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2638::,2001:67c:2638:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:263c::,2001:67c:263c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2640::,2001:67c:2640:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:2644::,2001:67c:2644:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2648::,2001:67c:2648:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:264c::,2001:67c:264c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2650::,2001:67c:2650:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2654::,2001:67c:2654:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:2658::,2001:67c:2658:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:265c::,2001:67c:265c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2664::,2001:67c:2664:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2668::,2001:67c:2668:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:266c::,2001:67c:266c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2670::,2001:67c:2670:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:2674::,2001:67c:2674:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:267c::,2001:67c:267c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2680::,2001:67c:2680:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2684::,2001:67c:2684:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2688::,2001:67c:2688:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:268c::,2001:67c:268c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2690::,2001:67c:2690:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2694::,2001:67c:2694:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2698::,2001:67c:2698:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:269c::,2001:67c:269c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:26a0::,2001:67c:26a0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:26a4::,2001:67c:26a4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:26a8::,2001:67c:26a8:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:26ac::,2001:67c:26ac:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:26b0::,2001:67c:26b0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:26b4::,2001:67c:26b4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:26b8::,2001:67c:26b8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:26bc::,2001:67c:26bc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:26c0::,2001:67c:26c3:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:26d0::,2001:67c:26d0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:26d4::,2001:67c:26d4:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:26d8::,2001:67c:26d8:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:26dc::,2001:67c:26dc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:26e0::,2001:67c:26e0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:26e4::,2001:67c:26e4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:26e8::,2001:67c:26e8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:26ec::,2001:67c:26ec:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:26f0::,2001:67c:26f0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:26f4::,2001:67c:26f4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:26f8::,2001:67c:26f8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:26fc::,2001:67c:26fc:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2700::,2001:67c:2700:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2704::,2001:67c:2704:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2708::,2001:67c:2708:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:270c::,2001:67c:270c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2710::,2001:67c:2710:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2714::,2001:67c:2714:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2718::,2001:67c:2718:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:271c::,2001:67c:271c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2720::,2001:67c:2720:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2724::,2001:67c:2724:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2728::,2001:67c:2728:ffff:ffff:ffff:ffff:ffff,IR +2001:67c:272c::,2001:67c:272c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2730::,2001:67c:2730:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2734::,2001:67c:2734:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2738::,2001:67c:2738:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:273c::,2001:67c:273c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2740::,2001:67c:2740:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:2744::,2001:67c:2744:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2748::,2001:67c:2748:ffff:ffff:ffff:ffff:ffff,GR +2001:67c:274c::,2001:67c:274c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2750::,2001:67c:2750:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2754::,2001:67c:2754:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2758::,2001:67c:2758:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:275c::,2001:67c:275c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2760::,2001:67c:2760:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2764::,2001:67c:2764:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2768::,2001:67c:2768:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:276c::,2001:67c:276c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2770::,2001:67c:2770:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2774::,2001:67c:2774:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:277c::,2001:67c:277c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2780::,2001:67c:2780:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2784::,2001:67c:2784:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2788::,2001:67c:2788:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:278c::,2001:67c:278c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2790::,2001:67c:2790:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2794::,2001:67c:2794:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2798::,2001:67c:2798:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:279c::,2001:67c:279c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:27a0::,2001:67c:27a0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:27a4::,2001:67c:27a4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:27a8::,2001:67c:27a8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:27ac::,2001:67c:27ac:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:27b0::,2001:67c:27b0:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:27b4::,2001:67c:27b4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:27b8::,2001:67c:27b8:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:27bc::,2001:67c:27bc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:27c0::,2001:67c:27c0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:27c4::,2001:67c:27c4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:27c8::,2001:67c:27c8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:27cc::,2001:67c:27cc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:27d0::,2001:67c:27d0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:27d4::,2001:67c:27d4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:27d8::,2001:67c:27d8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:27dc::,2001:67c:27dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:27e0::,2001:67c:27e0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:27e4::,2001:67c:27e4:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:27e8::,2001:67c:27e8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:27ec::,2001:67c:27ec:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:27f0::,2001:67c:27f0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:27f4::,2001:67c:27f4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:27f8::,2001:67c:27f8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:27fc::,2001:67c:27fc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2800::,2001:67c:2800:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2804::,2001:67c:2804:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2808::,2001:67c:2808:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:280c::,2001:67c:280c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2810::,2001:67c:2810:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2814::,2001:67c:2814:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2818::,2001:67c:2818:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:281c::,2001:67c:281c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2820::,2001:67c:2820:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2824::,2001:67c:2824:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2828::,2001:67c:2828:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:282c::,2001:67c:282c:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2830::,2001:67c:2830:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2834::,2001:67c:2834:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2838::,2001:67c:2838:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:283c::,2001:67c:283c:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:2840::,2001:67c:2840:ffff:ffff:ffff:ffff:ffff,IL +2001:67c:2844::,2001:67c:2844:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2848::,2001:67c:2848:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:284c::,2001:67c:284c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2850::,2001:67c:2850:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2854::,2001:67c:2854:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2858::,2001:67c:2858:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:285c::,2001:67c:285c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2860::,2001:67c:2860:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2864::,2001:67c:2864:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2868::,2001:67c:2868:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:286c::,2001:67c:286c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2870::,2001:67c:2870:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2874::,2001:67c:2874:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2878::,2001:67c:2878:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:287c::,2001:67c:287c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2880::,2001:67c:2880:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2884::,2001:67c:2884:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2888::,2001:67c:2889:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2890::,2001:67c:2890:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2894::,2001:67c:2894:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2898::,2001:67c:2898:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:289c::,2001:67c:289c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:28a0::,2001:67c:28a0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:28a4::,2001:67c:28a4:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:28a8::,2001:67c:28a8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:28ac::,2001:67c:28ac:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:28b0::,2001:67c:28b0:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:28b4::,2001:67c:28b4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:28b8::,2001:67c:28b8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:28bc::,2001:67c:28bc:ffff:ffff:ffff:ffff:ffff,HU +2001:67c:28c0::,2001:67c:28c0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:28c4::,2001:67c:28c4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:28c8::,2001:67c:28c8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:28cc::,2001:67c:28cc:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:28d0::,2001:67c:28d0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:28d4::,2001:67c:28d4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:28d8::,2001:67c:28d8:ffff:ffff:ffff:ffff:ffff,SM +2001:67c:28dc::,2001:67c:28dc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:28e0::,2001:67c:28e0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:28e4::,2001:67c:28e4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:28e8::,2001:67c:28e8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:28ec::,2001:67c:28ec:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:28f0::,2001:67c:28f0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:28f4::,2001:67c:28f4:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:28f8::,2001:67c:28f8:ffff:ffff:ffff:ffff:ffff,LT +2001:67c:28fc::,2001:67c:28fc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2900::,2001:67c:291f:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2980::,2001:67c:2980:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:2984::,2001:67c:2984:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2988::,2001:67c:2989:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:2990::,2001:67c:2990:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2994::,2001:67c:2994:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:2998::,2001:67c:2998:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:299c::,2001:67c:299c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:29a0::,2001:67c:29a0:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:29a4::,2001:67c:29a4:ffff:ffff:ffff:ffff:ffff,LT +2001:67c:29a8::,2001:67c:29a8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:29ac::,2001:67c:29ac:ffff:ffff:ffff:ffff:ffff,CY +2001:67c:29b0::,2001:67c:29b1:ffff:ffff:ffff:ffff:ffff,CY +2001:67c:29b8::,2001:67c:29b8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:29bc::,2001:67c:29bc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:29c0::,2001:67c:29c1:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:29c8::,2001:67c:29c8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:29cc::,2001:67c:29cc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:29d0::,2001:67c:29d0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:29d4::,2001:67c:29d4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:29d8::,2001:67c:29d8:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:29dc::,2001:67c:29dc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:29e0::,2001:67c:29e0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:29e4::,2001:67c:29e4:ffff:ffff:ffff:ffff:ffff,US +2001:67c:29e8::,2001:67c:29e8:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:29ec::,2001:67c:29ec:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:29f0::,2001:67c:29f0:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:29f4::,2001:67c:29f4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:29f8::,2001:67c:29f8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:29fc::,2001:67c:29fc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2a00::,2001:67c:2a00:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2a04::,2001:67c:2a04:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2a08::,2001:67c:2a08:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2a0c::,2001:67c:2a0c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a14::,2001:67c:2a14:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a18::,2001:67c:2a18:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2a1c::,2001:67c:2a1c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a20::,2001:67c:2a20:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2a24::,2001:67c:2a24:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2a28::,2001:67c:2a28:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2a2c::,2001:67c:2a2c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2a30::,2001:67c:2a30:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a34::,2001:67c:2a34:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a38::,2001:67c:2a38:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2a3c::,2001:67c:2a3c:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:2a40::,2001:67c:2a40:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2a44::,2001:67c:2a44:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2a48::,2001:67c:2a48:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2a4c::,2001:67c:2a4c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2a50::,2001:67c:2a50:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2a54::,2001:67c:2a54:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a58::,2001:67c:2a58:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2a5c::,2001:67c:2a5c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2a60::,2001:67c:2a60:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2a64::,2001:67c:2a64:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2a68::,2001:67c:2a68:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2a6c::,2001:67c:2a6c:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:2a70::,2001:67c:2a70:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2a74::,2001:67c:2a74:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2a78::,2001:67c:2a78:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2a7c::,2001:67c:2a7c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a80::,2001:67c:2a80:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2a84::,2001:67c:2a84:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2a88::,2001:67c:2a88:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:2a8c::,2001:67c:2a8c:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2a90::,2001:67c:2a90:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2a94::,2001:67c:2a94:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2a98::,2001:67c:2a98:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2a9c::,2001:67c:2a9c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2aa0::,2001:67c:2aa0:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:2aa4::,2001:67c:2aa4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2aa8::,2001:67c:2aa8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2aac::,2001:67c:2aac:ffff:ffff:ffff:ffff:ffff,IS +2001:67c:2ab0::,2001:67c:2ab0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ab4::,2001:67c:2ab4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2ab8::,2001:67c:2ab8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2abc::,2001:67c:2abc:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2ac0::,2001:67c:2ac0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2ac4::,2001:67c:2ac4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ac8::,2001:67c:2ac8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2acc::,2001:67c:2acc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ad0::,2001:67c:2ad0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2ad4::,2001:67c:2ad4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ad8::,2001:67c:2ad8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2adc::,2001:67c:2adc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ae0::,2001:67c:2ae0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2ae4::,2001:67c:2ae4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ae8::,2001:67c:2ae8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2aec::,2001:67c:2aec:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2af0::,2001:67c:2af0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2af8::,2001:67c:2af8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2afc::,2001:67c:2afc:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2b04::,2001:67c:2b04:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2b08::,2001:67c:2b08:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b0c::,2001:67c:2b0c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2b10::,2001:67c:2b10:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2b14::,2001:67c:2b14:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2b18::,2001:67c:2b18:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2b1c::,2001:67c:2b1c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2b20::,2001:67c:2b20:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2b24::,2001:67c:2b24:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b28::,2001:67c:2b28:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2b2c::,2001:67c:2b2c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2b30::,2001:67c:2b30:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2b34::,2001:67c:2b34:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b38::,2001:67c:2b38:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2b3c::,2001:67c:2b3c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2b40::,2001:67c:2b40:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2b44::,2001:67c:2b44:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2b48::,2001:67c:2b48:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b4c::,2001:67c:2b4c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2b50::,2001:67c:2b50:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2b54::,2001:67c:2b54:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2b58::,2001:67c:2b58:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b5c::,2001:67c:2b5c:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:2b60::,2001:67c:2b60:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2b64::,2001:67c:2b64:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2b6c::,2001:67c:2b6c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b70::,2001:67c:2b70:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2b74::,2001:67c:2b74:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2b78::,2001:67c:2b79:ffff:ffff:ffff:ffff:ffff,GR +2001:67c:2b80::,2001:67c:2b80:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2b84::,2001:67c:2b84:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2b88::,2001:67c:2b88:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2b8c::,2001:67c:2b8c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2b90::,2001:67c:2b90:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2b94::,2001:67c:2b94:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b98::,2001:67c:2b98:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2b9c::,2001:67c:2b9c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ba0::,2001:67c:2ba0:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:2ba4::,2001:67c:2ba4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ba8::,2001:67c:2ba8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2bac::,2001:67c:2bac:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2bb0::,2001:67c:2bb0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2bb4::,2001:67c:2bb4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2bb8::,2001:67c:2bb8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2bbc::,2001:67c:2bbc:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2bc0::,2001:67c:2bc0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2bc4::,2001:67c:2bc4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2bc8::,2001:67c:2bc8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2bcc::,2001:67c:2bcc:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:2bd0::,2001:67c:2bd0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2bd4::,2001:67c:2bd4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2bd8::,2001:67c:2bd8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2bdc::,2001:67c:2bdc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2be0::,2001:67c:2be0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2be8::,2001:67c:2be8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2bec::,2001:67c:2bec:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2bf0::,2001:67c:2bf0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2bf4::,2001:67c:2bf4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2bf8::,2001:67c:2bf8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2bfc::,2001:67c:2bfc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c00::,2001:67c:2c00:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2c04::,2001:67c:2c04:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c08::,2001:67c:2c08:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c0c::,2001:67c:2c0c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c10::,2001:67c:2c10:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c14::,2001:67c:2c14:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c18::,2001:67c:2c18:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c1c::,2001:67c:2c1c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2c20::,2001:67c:2c20:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c24::,2001:67c:2c24:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2c28::,2001:67c:2c28:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c2c::,2001:67c:2c2c:ffff:ffff:ffff:ffff:ffff,HU +2001:67c:2c30::,2001:67c:2c30:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c34::,2001:67c:2c34:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c38::,2001:67c:2c38:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c3c::,2001:67c:2c3c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c40::,2001:67c:2c40:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c44::,2001:67c:2c44:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2c48::,2001:67c:2c48:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2c4c::,2001:67c:2c4c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c50::,2001:67c:2c50:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c54::,2001:67c:2c54:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c58::,2001:67c:2c58:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c5c::,2001:67c:2c5c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2c60::,2001:67c:2c60:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2c64::,2001:67c:2c64:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2c68::,2001:67c:2c68:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c6c::,2001:67c:2c6c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2c70::,2001:67c:2c70:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c74::,2001:67c:2c74:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c78::,2001:67c:2c78:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c7c::,2001:67c:2c7c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c80::,2001:67c:2c80:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c84::,2001:67c:2c84:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2c88::,2001:67c:2c89:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2c90::,2001:67c:2c93:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2ca0::,2001:67c:2ca7:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2cc0::,2001:67c:2cc0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2cc4::,2001:67c:2cc4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2cc8::,2001:67c:2cc8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2ccc::,2001:67c:2ccc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2cd0::,2001:67c:2cd0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2cd4::,2001:67c:2cd4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2cd8::,2001:67c:2cd8:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:2cdc::,2001:67c:2cdc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ce0::,2001:67c:2ce0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2ce4::,2001:67c:2ce4:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2ce8::,2001:67c:2ce8:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2cec::,2001:67c:2cec:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2cf0::,2001:67c:2cf0:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2cf4::,2001:67c:2cf4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2cf8::,2001:67c:2cf8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2cfc::,2001:67c:2cfc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2d04::,2001:67c:2d04:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2d08::,2001:67c:2d08:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d0c::,2001:67c:2d0c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d10::,2001:67c:2d10:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2d14::,2001:67c:2d14:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2d18::,2001:67c:2d19:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d20::,2001:67c:2d20:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2d24::,2001:67c:2d24:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2d28::,2001:67c:2d28:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d2c::,2001:67c:2d2c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2d30::,2001:67c:2d30:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2d34::,2001:67c:2d34:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2d38::,2001:67c:2d38:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2d3c::,2001:67c:2d3c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2d40::,2001:67c:2d40:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2d44::,2001:67c:2d44:ffff:ffff:ffff:ffff:ffff,PT +2001:67c:2d48::,2001:67c:2d48:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2d4c::,2001:67c:2d4c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2d50::,2001:67c:2d50:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d54::,2001:67c:2d54:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2d58::,2001:67c:2d58:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2d5c::,2001:67c:2d5c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d60::,2001:67c:2d60:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2d64::,2001:67c:2d64:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2d68::,2001:67c:2d68:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2d6c::,2001:67c:2d6c:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2d70::,2001:67c:2d70:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2d74::,2001:67c:2d74:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2d78::,2001:67c:2d78:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2d7c::,2001:67c:2d7c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2d80::,2001:67c:2d80:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d84::,2001:67c:2d84:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2d88::,2001:67c:2d88:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d8c::,2001:67c:2d8c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2d90::,2001:67c:2d90:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2d94::,2001:67c:2d94:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2d98::,2001:67c:2d98:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2d9c::,2001:67c:2d9c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2da0::,2001:67c:2da0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2da4::,2001:67c:2da4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2da8::,2001:67c:2da8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2dac::,2001:67c:2dac:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2db0::,2001:67c:2db0:ffff:ffff:ffff:ffff:ffff,IT +2001:67c:2db4::,2001:67c:2db4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2db8::,2001:67c:2db8:ffff:ffff:ffff:ffff:ffff,MD +2001:67c:2dbc::,2001:67c:2dbc:ffff:ffff:ffff:ffff:ffff,IL +2001:67c:2dc0::,2001:67c:2dc0:ffff:ffff:ffff:ffff:ffff,LI +2001:67c:2dc4::,2001:67c:2dc4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2dc8::,2001:67c:2dc8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2dcc::,2001:67c:2dcc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2dd0::,2001:67c:2dd0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2dd4::,2001:67c:2dd4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2dd8::,2001:67c:2dd8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2ddc::,2001:67c:2ddc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2de0::,2001:67c:2de0:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2de4::,2001:67c:2de4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2de8::,2001:67c:2de8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2dec::,2001:67c:2dec:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2df0::,2001:67c:2df0:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2df4::,2001:67c:2df4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2df8::,2001:67c:2df8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2dfc::,2001:67c:2dfc:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2e00::,2001:67c:2e00:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2e04::,2001:67c:2e04:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2e08::,2001:67c:2e08:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2e0c::,2001:67c:2e0c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2e10::,2001:67c:2e10:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2e14::,2001:67c:2e14:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2e18::,2001:67c:2e18:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2e1c::,2001:67c:2e1c:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2e20::,2001:67c:2e20:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2e24::,2001:67c:2e24:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2e28::,2001:67c:2e28:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2e2c::,2001:67c:2e2c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2e30::,2001:67c:2e30:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2e34::,2001:67c:2e34:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2e38::,2001:67c:2e38:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2e3c::,2001:67c:2e3c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2e40::,2001:67c:2e40:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2e44::,2001:67c:2e44:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2e48::,2001:67c:2e48:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2e4c::,2001:67c:2e4c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2e50::,2001:67c:2e50:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2e54::,2001:67c:2e54:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2e58::,2001:67c:2e58:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2e5c::,2001:67c:2e5c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2e60::,2001:67c:2e60:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2e64::,2001:67c:2e64:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2e68::,2001:67c:2e69:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2e70::,2001:67c:2e70:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2e74::,2001:67c:2e74:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2e78::,2001:67c:2e78:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2e7c::,2001:67c:2e7c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2e80::,2001:67c:2e80:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2e84::,2001:67c:2e84:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2e88::,2001:67c:2e88:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2e8c::,2001:67c:2e8c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2e90::,2001:67c:2e90:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2e94::,2001:67c:2e94:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2e98::,2001:67c:2e98:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2e9c::,2001:67c:2e9c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ea0::,2001:67c:2ea0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ea4::,2001:67c:2ea4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ea8::,2001:67c:2ea8:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:2eac::,2001:67c:2eac:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2eb0::,2001:67c:2eb0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2eb4::,2001:67c:2eb4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2eb8::,2001:67c:2eb8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ebc::,2001:67c:2ebc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ec0::,2001:67c:2ec0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ec4::,2001:67c:2ec4:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2ec8::,2001:67c:2ec8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ecc::,2001:67c:2ecc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ed0::,2001:67c:2ed0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ed4::,2001:67c:2ed4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2ed8::,2001:67c:2ed8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2edc::,2001:67c:2edc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2ee0::,2001:67c:2ee0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ee4::,2001:67c:2ee4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2ee8::,2001:67c:2ee8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2eec::,2001:67c:2eec:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2ef0::,2001:67c:2ef0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2ef4::,2001:67c:2ef4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ef8::,2001:67c:2ef8:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2efc::,2001:67c:2efc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2f00::,2001:67c:2f00:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2f04::,2001:67c:2f04:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2f08::,2001:67c:2f08:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2f0c::,2001:67c:2f0c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2f10::,2001:67c:2f10:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2f14::,2001:67c:2f14:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2f18::,2001:67c:2f18:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2f1c::,2001:67c:2f1c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2f20::,2001:67c:2f20:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2f24::,2001:67c:2f24:ffff:ffff:ffff:ffff:ffff,HR +2001:67c:2f28::,2001:67c:2f28:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2f30::,2001:67c:2f30:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2f34::,2001:67c:2f34:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2f38::,2001:67c:2f38:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2f3c::,2001:67c:2f3c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2f40::,2001:67c:2f40:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2f44::,2001:67c:2f44:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2f48::,2001:67c:2f48:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2f4c::,2001:67c:2f4c:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2f50::,2001:67c:2f50:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2f54::,2001:67c:2f54:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2f58::,2001:67c:2f58:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2f5c::,2001:67c:2f5c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2f60::,2001:67c:2f60:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2f64::,2001:67c:2f64:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2f68::,2001:67c:2f68:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2f6c::,2001:67c:2f6c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2f70::,2001:67c:2f70:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2f74::,2001:67c:2f74:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2f78::,2001:67c:2f78:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2f7c::,2001:67c:2f7c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2f80::,2001:67c:2f80:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2f84::,2001:67c:2f84:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2f88::,2001:67c:2f88:ffff:ffff:ffff:ffff:ffff,ZA +2001:67c:2f8c::,2001:67c:2f8c:ffff:ffff:ffff:ffff:ffff,IT +2001:67c:2f90::,2001:67c:2f90:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2f94::,2001:67c:2f94:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2f98::,2001:67c:2f98:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2f9c::,2001:67c:2f9c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2fa0::,2001:67c:2fa0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2fa4::,2001:67c:2fa4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2fa8::,2001:67c:2fa8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2fac::,2001:67c:2fac:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2fb0::,2001:67c:2fb0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2fb4::,2001:67c:2fb4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2fb8::,2001:67c:2fb8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2fbc::,2001:67c:2fbc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2fc0::,2001:67c:2fc0:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2fc4::,2001:67c:2fc4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2fc8::,2001:67c:2fc8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2fcc::,2001:67c:2fcc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2fd0::,2001:67c:2fd0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2fd4::,2001:67c:2fd4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2fd8::,2001:67c:2fd8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2fdc::,2001:67c:2fdc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2fe4::,2001:67c:2fe4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2fe8::,2001:67c:2fe8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2fec::,2001:67c:2fec:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2ff0::,2001:67c:2ff0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2ff4::,2001:67c:2ff4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2ff8::,2001:67c:2ff8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2ffc::,2001:67c:2ffc:ffff:ffff:ffff:ffff:ffff,PL +2001:680::,2001:680:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:688::,2001:688:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:690::,2001:697:ffff:ffff:ffff:ffff:ffff:ffff,PT +2001:6a0::,2001:6a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:6a8::,2001:6af:ffff:ffff:ffff:ffff:ffff:ffff,BE +2001:6b0::,2001:6b0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:6b8::,2001:6b8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:6c8::,2001:6cf:ffff:ffff:ffff:ffff:ffff:ffff,DK +2001:6d0::,2001:6d0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:6d8::,2001:6df:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:6e0::,2001:6e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:6e8::,2001:6ef:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:6f0::,2001:6f7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:6f8::,2001:6f8:2ff:ffff:ffff:ffff:ffff:ffff,GB +2001:6f8:300::,2001:6f8:3ff:ffff:ffff:ffff:ffff:ffff,BE +2001:6f8:400::,2001:6f8:900:7fff:ffff:ffff:ffff:ffff,GB +2001:6f8:900:8000::,2001:6f8:900:ffff:ffff:ffff:ffff:ffff,DE +2001:6f8:901::,2001:6f8:13ff:ffff:ffff:ffff:ffff:ffff,GB +2001:6f8:1400::,2001:6f8:14ff:ffff:ffff:ffff:ffff:ffff,BE +2001:6f8:1500::,2001:6f8:1d2c:ffff:ffff:ffff:ffff:ffff,GB +2001:6f8:1d2d::,2001:6f8:1d2d:7fff:ffff:ffff:ffff:ffff,DE +2001:6f8:1d2d:8000::,2001:6f8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:700::,2001:700:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:708::,2001:708:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:710::,2001:710:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:718::,2001:71f:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:720::,2001:727:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:728::,2001:728:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:730::,2001:730:3e0b:ffff:ffff:ffff:ffff:ffff,AT +2001:730:3e0c::,2001:730:3e0c:7fff:ffff:ffff:ffff:ffff,NL +2001:730:3e0c:8000::,2001:737:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:738::,2001:738:ffff:ffff:ffff:ffff:ffff:ffff,HU +2001:748::,2001:748:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:750::,2001:750:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:758::,2001:758:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:760::,2001:760:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:768::,2001:768:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:770::,2001:777:ffff:ffff:ffff:ffff:ffff:ffff,IE +2001:778::,2001:77f:ffff:ffff:ffff:ffff:ffff:ffff,LT +2001:780::,2001:787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:788::,2001:78f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:790::,2001:790:ffff:ffff:ffff:ffff:ffff:ffff,IR +2001:798::,2001:79f:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:7a0::,2001:7a0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:7a8::,2001:7a8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:7b0::,2001:7b0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:7b8::,2001:7bf:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:7c0::,2001:7c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:7c8::,2001:7c8:ffff:ffff:ffff:ffff:ffff:ffff,IE +2001:7d0::,2001:7d0:833c:7fff:ffff:ffff:ffff:ffff,EE +2001:7d0:833c:8000::,2001:7d0:833c:ffff:ffff:ffff:ffff:ffff,CA +2001:7d0:833d::,2001:7d0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2001:7d8::,2001:7d8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:7e0::,2001:7e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:7e8::,2001:7e8:c03f:ffff:ffff:ffff:ffff:ffff,LU +2001:7e8:c040::,2001:7e8:c040:7fff:ffff:ffff:ffff:ffff,FR +2001:7e8:c040:8000::,2001:7e8:c68a:7fff:ffff:ffff:ffff:ffff,LU +2001:7e8:c68a:8000::,2001:7e8:c68a:ffff:ffff:ffff:ffff:ffff,BE +2001:7e8:c68b::,2001:7e8:c9b7:7fff:ffff:ffff:ffff:ffff,LU +2001:7e8:c9b7:8000::,2001:7e8:c9b7:ffff:ffff:ffff:ffff:ffff,DE +2001:7e8:c9b8::,2001:7e8:cc63:ffff:ffff:ffff:ffff:ffff,LU +2001:7e8:cc64::,2001:7e8:cc64:7fff:ffff:ffff:ffff:ffff,FR +2001:7e8:cc64:8000::,2001:7e8:d04f:ffff:ffff:ffff:ffff:ffff,LU +2001:7e8:d050::,2001:7e8:d050:7fff:ffff:ffff:ffff:ffff,DE +2001:7e8:d050:8000::,2001:7e8:d2db:ffff:ffff:ffff:ffff:ffff,LU +2001:7e8:d2dc::,2001:7e8:d2dc:7fff:ffff:ffff:ffff:ffff,FR +2001:7e8:d2dc:8000::,2001:7e8:d2e4:ffff:ffff:ffff:ffff:ffff,LU +2001:7e8:d2e5::,2001:7e8:d2e5:7fff:ffff:ffff:ffff:ffff,FR +2001:7e8:d2e5:8000::,2001:7e8:d302:7fff:ffff:ffff:ffff:ffff,LU +2001:7e8:d302:8000::,2001:7e8:d302:ffff:ffff:ffff:ffff:ffff,DE +2001:7e8:d303::,2001:7e8:d361:ffff:ffff:ffff:ffff:ffff,LU +2001:7e8:d362::,2001:7e8:d362:7fff:ffff:ffff:ffff:ffff,BE +2001:7e8:d362:8000::,2001:7e8:d4ae:ffff:ffff:ffff:ffff:ffff,LU +2001:7e8:d4af::,2001:7e8:d4af:7fff:ffff:ffff:ffff:ffff,DE +2001:7e8:d4af:8000::,2001:7e8:d4e0:7fff:ffff:ffff:ffff:ffff,LU +2001:7e8:d4e0:8000::,2001:7e8:d4e0:ffff:ffff:ffff:ffff:ffff,FR +2001:7e8:d4e1::,2001:7ef:ffff:ffff:ffff:ffff:ffff:ffff,LU +2001:7f0:1::,2001:7f0:1:7fff:ffff:ffff:ffff:ffff,DE +2001:7f0:3003::,2001:7f0:3003:7fff:ffff:ffff:ffff:ffff,DE +2001:7f8::,2001:7f8::ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:1::,2001:7f8:1:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:2::,2001:7f8:2:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:3::,2001:7f8:4:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:5::,2001:7f8:5:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:6::,2001:7f8:6:ffff:ffff:ffff:ffff:ffff,BG +2001:7f8:7::,2001:7f8:7:ffff:ffff:ffff:ffff:ffff,FI +2001:7f8:8::,2001:7f8:8:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:9::,2001:7f8:9:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:a::,2001:7f8:a:ffff:ffff:ffff:ffff:ffff,PT +2001:7f8:b::,2001:7f8:b:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:c::,2001:7f8:c:ffff:ffff:ffff:ffff:ffff,CH +2001:7f8:d::,2001:7f8:d:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:e::,2001:7f8:e:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:f::,2001:7f8:f:ffff:ffff:ffff:ffff:ffff,ES +2001:7f8:10::,2001:7f8:10:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:11::,2001:7f8:11:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:12::,2001:7f8:12:ffff:ffff:ffff:ffff:ffff,NO +2001:7f8:13::,2001:7f8:13:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:14::,2001:7f8:14:ffff:ffff:ffff:ffff:ffff,CZ +2001:7f8:15::,2001:7f8:15:ffff:ffff:ffff:ffff:ffff,EE +2001:7f8:16::,2001:7f8:16:ffff:ffff:ffff:ffff:ffff,LV +2001:7f8:17::,2001:7f8:17:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:18::,2001:7f8:18:ffff:ffff:ffff:ffff:ffff,IE +2001:7f8:19::,2001:7f8:19:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:1a::,2001:7f8:1a:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:1b::,2001:7f8:1b:ffff:ffff:ffff:ffff:ffff,BE +2001:7f8:1c::,2001:7f8:1c:ffff:ffff:ffff:ffff:ffff,CH +2001:7f8:1d::,2001:7f8:1d:ffff:ffff:ffff:ffff:ffff,FI +2001:7f8:1e::,2001:7f8:1e:ffff:ffff:ffff:ffff:ffff,RS +2001:7f8:1f::,2001:7f8:1f:ffff:ffff:ffff:ffff:ffff,DK +2001:7f8:20::,2001:7f8:20:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:21::,2001:7f8:21:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:22::,2001:7f8:22:ffff:ffff:ffff:ffff:ffff,ME +2001:7f8:23::,2001:7f8:23:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:24::,2001:7f8:24:ffff:ffff:ffff:ffff:ffff,CH +2001:7f8:25::,2001:7f8:25:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:26::,2001:7f8:26:ffff:ffff:ffff:ffff:ffff,BE +2001:7f8:27::,2001:7f8:27:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:28::,2001:7f8:28:ffff:ffff:ffff:ffff:ffff,HR +2001:7f8:29::,2001:7f8:29:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:2a::,2001:7f8:2a:ffff:ffff:ffff:ffff:ffff,ES +2001:7f8:2b::,2001:7f8:2c:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:2d::,2001:7f8:2d:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:2e::,2001:7f8:2e:ffff:ffff:ffff:ffff:ffff,MD +2001:7f8:2f::,2001:7f8:2f:ffff:ffff:ffff:ffff:ffff,SK +2001:7f8:30::,2001:7f8:30:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:31::,2001:7f8:31:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:32::,2001:7f8:32:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:33::,2001:7f8:33:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:34::,2001:7f8:34:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:35::,2001:7f8:35:ffff:ffff:ffff:ffff:ffff,HU +2001:7f8:36::,2001:7f8:36:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:37::,2001:7f8:38:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:39::,2001:7f8:39:ffff:ffff:ffff:ffff:ffff,EE +2001:7f8:3a::,2001:7f8:3a:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:3b::,2001:7f8:3b:ffff:ffff:ffff:ffff:ffff,IL +2001:7f8:3d::,2001:7f8:3d:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:3e::,2001:7f8:3e:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:3f::,2001:7f8:3f:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:40::,2001:7f8:40:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:41::,2001:7f8:41:ffff:ffff:ffff:ffff:ffff,NO +2001:7f8:42::,2001:7f8:42:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:43::,2001:7f8:43:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:44::,2001:7f8:44:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:45::,2001:7f8:45:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:46::,2001:7f8:46:ffff:ffff:ffff:ffff:ffff,SI +2001:7f8:47::,2001:7f8:47:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:48::,2001:7f8:48:ffff:ffff:ffff:ffff:ffff,IS +2001:7f8:4a::,2001:7f8:4a:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:4b::,2001:7f8:4b:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:4c::,2001:7f8:4c:ffff:ffff:ffff:ffff:ffff,LU +2001:7f8:4d::,2001:7f8:4d:ffff:ffff:ffff:ffff:ffff,IE +2001:7f8:4e::,2001:7f8:4e:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:4f::,2001:7f8:4f:ffff:ffff:ffff:ffff:ffff,BH +2001:7f8:50::,2001:7f8:50:ffff:ffff:ffff:ffff:ffff,EE +2001:7f8:51::,2001:7f8:51:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:52::,2001:7f8:52:ffff:ffff:ffff:ffff:ffff,LB +2001:7f8:53::,2001:7f8:53:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:54::,2001:7f8:54:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:55::,2001:7f8:55:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:56::,2001:7f8:56:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:57::,2001:7f8:57:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:58::,2001:7f8:58:ffff:ffff:ffff:ffff:ffff,BG +2001:7f8:59::,2001:7f8:59:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:5a::,2001:7f8:5a:ffff:ffff:ffff:ffff:ffff,BY +2001:7f8:5b::,2001:7f8:5b:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:5c::,2001:7f8:5c:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:5d::,2001:7f8:5d:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:5e::,2001:7f8:5e:ffff:ffff:ffff:ffff:ffff,CZ +2001:7f8:5f::,2001:7f8:5f:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:60::,2001:7f8:60:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:61::,2001:7f8:61:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:62::,2001:7f8:62:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:63::,2001:7f8:63:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:64::,2001:7f8:64:ffff:ffff:ffff:ffff:ffff,RO +2001:7f8:65::,2001:7f8:65:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:66::,2001:7f8:66:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:67::,2001:7f8:67:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:68::,2001:7f8:68:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:69::,2001:7f8:69:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:6a::,2001:7f8:6a:ffff:ffff:ffff:ffff:ffff,MD +2001:7f8:6b::,2001:7f8:6b:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:6c::,2001:7f8:6c:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:6d::,2001:7f8:6d:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:6e::,2001:7f8:6e:ffff:ffff:ffff:ffff:ffff,GR +2001:7f8:6f::,2001:7f8:70:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:71::,2001:7f8:71:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:72::,2001:7f8:72:ffff:ffff:ffff:ffff:ffff,PS +2001:7f8:73::,2001:7f8:73:ffff:ffff:ffff:ffff:ffff,AE +2001:7f8:74::,2001:7f8:75:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:76::,2001:7f8:76:ffff:ffff:ffff:ffff:ffff,NO +2001:7f8:77::,2001:7f8:78:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:79::,2001:7f8:79:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:7a::,2001:7f8:7a:ffff:ffff:ffff:ffff:ffff,AE +2001:7f8:7b::,2001:7f8:7b:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:7c::,2001:7f8:7c:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:7d::,2001:7f8:7d:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:7e::,2001:7f8:7e:ffff:ffff:ffff:ffff:ffff,ES +2001:7f8:7f::,2001:7f8:7f:ffff:ffff:ffff:ffff:ffff,CZ +2001:7f8:80::,2001:7f8:80:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:81::,2001:7f8:81:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:82::,2001:7f8:82:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:84::,2001:7f8:84:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:85::,2001:7f8:85:ffff:ffff:ffff:ffff:ffff,HU +2001:7f8:86::,2001:7f8:86:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:87::,2001:7f8:87:ffff:ffff:ffff:ffff:ffff,CZ +2001:7f8:88::,2001:7f8:89:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:8a::,2001:7f8:8a:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:8b::,2001:7f8:8b:ffff:ffff:ffff:ffff:ffff,BY +2001:7f8:8c::,2001:7f8:8c:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:8d::,2001:7f8:8d:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:8e::,2001:7f8:8e:ffff:ffff:ffff:ffff:ffff,BG +2001:7f8:8f::,2001:7f8:8f:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:90::,2001:7f8:90:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:91::,2001:7f8:91:ffff:ffff:ffff:ffff:ffff,SK +2001:7f8:92::,2001:7f8:92:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:93::,2001:7f8:93:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:94::,2001:7f8:94:ffff:ffff:ffff:ffff:ffff,AM +2001:7f8:95::,2001:7f8:95:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:96::,2001:7f8:96:ffff:ffff:ffff:ffff:ffff,BG +2001:7f8:97::,2001:7f8:97:ffff:ffff:ffff:ffff:ffff,RO +2001:7f8:98::,2001:7f8:98:ffff:ffff:ffff:ffff:ffff,BG +2001:7f8:99::,2001:7f8:99:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:9a::,2001:7f8:9a:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:9b::,2001:7f8:9b:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:9c::,2001:7f8:9e:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:9f::,2001:7f8:9f:ffff:ffff:ffff:ffff:ffff,BG +2001:7f8:a0::,2001:7f8:a0:ffff:ffff:ffff:ffff:ffff,ES +2001:7f8:a1::,2001:7f8:a1:ffff:ffff:ffff:ffff:ffff,RS +2001:7f8:a2::,2001:7f8:a2:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:a3::,2001:7f8:a3:ffff:ffff:ffff:ffff:ffff,LB +2001:7f8:a4::,2001:7f8:a4:ffff:ffff:ffff:ffff:ffff,AL +2001:7f8:a5::,2001:7f8:a5:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:a6::,2001:7f8:a6:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:a7::,2001:7f8:a7:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:a8::,2001:7f8:a8:ffff:ffff:ffff:ffff:ffff,IR +2001:7f8:a9::,2001:7f8:a9:ffff:ffff:ffff:ffff:ffff,MD +2001:7f8:aa::,2001:7f8:aa:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:ab::,2001:7f8:ab:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:ac::,2001:7f8:ac:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:ad::,2001:7f8:ad:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:ae::,2001:7f8:ae:ffff:ffff:ffff:ffff:ffff,CZ +2001:7f8:af::,2001:7f8:af:ffff:ffff:ffff:ffff:ffff,FI +2001:7f8:b0::,2001:7f8:b0:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:b1::,2001:7f8:b1:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:b2::,2001:7f8:b2:ffff:ffff:ffff:ffff:ffff,CZ +2001:7f8:b3::,2001:7f8:b3:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:b4::,2001:7f8:b4:ffff:ffff:ffff:ffff:ffff,LT +2001:7f8:b5::,2001:7f8:b5:ffff:ffff:ffff:ffff:ffff,CH +2001:7f8:b6::,2001:7f8:b7:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:b8::,2001:7f8:b8:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:b9::,2001:7f8:b9:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:ba::,2001:7f8:ba:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:bb::,2001:7f8:bb:ffff:ffff:ffff:ffff:ffff,AL +2001:7f8:bc::,2001:7f8:bc:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:bd::,2001:7f8:bd:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:be::,2001:7f8:be:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:bf::,2001:7f8:bf:ffff:ffff:ffff:ffff:ffff,CH +2001:7f8:c0::,2001:7f8:c0:ffff:ffff:ffff:ffff:ffff,IT +2001:7f9:4::,2001:7f9:4:ffff:ffff:ffff:ffff:ffff,AL +2001:7f9:8::,2001:7f9:8:ffff:ffff:ffff:ffff:ffff,AM +2001:7f9:c::,2001:7f9:c:ffff:ffff:ffff:ffff:ffff,PL +2001:7fa:0:1::,2001:7fa::1:ffff:ffff:ffff:ffff,HK +2001:7fa:0:2::,2001:7fa::2:ffff:ffff:ffff:ffff,KR +2001:7fa:0:3::,2001:7fa::3:ffff:ffff:ffff:ffff,JP +2001:7fa:1::,2001:7fa:1:ffff:ffff:ffff:ffff:ffff,TW +2001:7fa:2::,2001:7fa:2:ffff:ffff:ffff:ffff:ffff,ID +2001:7fa:3::,2001:7fa:4:ffff:ffff:ffff:ffff:ffff,NZ +2001:7fa:5::,2001:7fa:5:ffff:ffff:ffff:ffff:ffff,CN +2001:7fa:6::,2001:7fa:6:ffff:ffff:ffff:ffff:ffff,VN +2001:7fa:7::,2001:7fa:7:ffff:ffff:ffff:ffff:ffff,JP +2001:7fa:8::,2001:7fa:8:ffff:ffff:ffff:ffff:ffff,KR +2001:7fa:9::,2001:7fa:e:ffff:ffff:ffff:ffff:ffff,AU +2001:7fa:f::,2001:7fa:f:ffff:ffff:ffff:ffff:ffff,ID +2001:7fa:10::,2001:7fa:10:ffff:ffff:ffff:ffff:ffff,CN +2001:7fa:11::,2001:7fa:11:ffff:ffff:ffff:ffff:ffff,AU +2001:7fc::,2001:7fc:1:ffff:ffff:ffff:ffff:ffff,RU +2001:7fe::,2001:7fe:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:808::,2001:80f:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:810::,2001:810:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:818::,2001:81f:ffff:ffff:ffff:ffff:ffff:ffff,PT +2001:820::,2001:820:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:828::,2001:828:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:830::,2001:830:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:838::,2001:83f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:840::,2001:847:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:848::,2001:848:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:850::,2001:853:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:858::,2001:858:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:860::,2001:867:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:868::,2001:86f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:870::,2001:871:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:878::,2001:87f:ffff:ffff:ffff:ffff:ffff:ffff,DK +2001:880::,2001:880:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:888::,2001:88f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:890::,2001:891:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:898::,2001:89f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:8a0::,2001:8a0:5225:7fff:ffff:ffff:ffff:ffff,PT +2001:8a0:5225:8000::,2001:8a0:5225:ffff:ffff:ffff:ffff:ffff,GB +2001:8a0:5226::,2001:8a7:ffff:ffff:ffff:ffff:ffff:ffff,PT +2001:8a8::,2001:8a8:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:8b0::,2001:8b0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:8b8::,2001:8bf:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:8c0::,2001:8c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:8c8::,2001:8c8:ffff:ffff:ffff:ffff:ffff:ffff,RS +2001:8d0::,2001:8d7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:8d8::,2001:8d8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:8e0::,2001:8e7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:8f0::,2001:8f1:ffff:ffff:ffff:ffff:ffff:ffff,GR +2001:8f2::,2001:8f3:ffff:ffff:ffff:ffff:ffff:ffff,CY +2001:8f8::,2001:8ff:ffff:ffff:ffff:ffff:ffff:ffff,AE +2001:900::,2001:900:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:908::,2001:90f:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:910::,2001:917:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:918::,2001:91f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:920::,2001:920:1804:ffff:ffff:ffff:ffff:ffff,GB +2001:920:1805::,2001:920:1805:7fff:ffff:ffff:ffff:ffff,DE +2001:920:1805:8000::,2001:920:1840:ffff:ffff:ffff:ffff:ffff,GB +2001:920:1841::,2001:920:1841:7fff:ffff:ffff:ffff:ffff,DE +2001:920:1841:8000::,2001:920:1845:ffff:ffff:ffff:ffff:ffff,GB +2001:920:1846::,2001:920:1846:7fff:ffff:ffff:ffff:ffff,DE +2001:920:1846:8000::,2001:920:186a:ffff:ffff:ffff:ffff:ffff,GB +2001:920:186b::,2001:920:186b:ffff:ffff:ffff:ffff:ffff,DE +2001:920:186c::,2001:920:187f:ffff:ffff:ffff:ffff:ffff,GB +2001:920:1880::,2001:920:1880:7fff:ffff:ffff:ffff:ffff,DE +2001:920:1880:8000::,2001:920:1881:ffff:ffff:ffff:ffff:ffff,GB +2001:920:1882::,2001:920:1882:7fff:ffff:ffff:ffff:ffff,DE +2001:920:1882:8000::,2001:920:18a0:ffff:ffff:ffff:ffff:ffff,GB +2001:920:18a1::,2001:920:18a1:7fff:ffff:ffff:ffff:ffff,DE +2001:920:18a1:8000::,2001:920:18ad:ffff:ffff:ffff:ffff:ffff,GB +2001:920:18ae::,2001:920:18ae:7fff:ffff:ffff:ffff:ffff,DE +2001:920:18ae:8000::,2001:920:18c0:ffff:ffff:ffff:ffff:ffff,GB +2001:920:18c1::,2001:920:18c1:7fff:ffff:ffff:ffff:ffff,DE +2001:920:18c1:8000::,2001:920:18ef:ffff:ffff:ffff:ffff:ffff,GB +2001:920:18f0::,2001:920:18f0:7fff:ffff:ffff:ffff:ffff,DE +2001:920:18f0:8000::,2001:920:1907:ffff:ffff:ffff:ffff:ffff,GB +2001:920:1908::,2001:920:1908:7fff:ffff:ffff:ffff:ffff,DE +2001:920:1908:8000::,2001:920:1940:ffff:ffff:ffff:ffff:ffff,GB +2001:920:1941::,2001:920:1941:7fff:ffff:ffff:ffff:ffff,DE +2001:920:1941:8000::,2001:920:1960:ffff:ffff:ffff:ffff:ffff,GB +2001:920:1961::,2001:920:1961:ffff:ffff:ffff:ffff:ffff,DE +2001:920:1962::,2001:920:4008:ffff:ffff:ffff:ffff:ffff,GB +2001:920:4009::,2001:920:4009:7fff:ffff:ffff:ffff:ffff,BE +2001:920:4009:8000::,2001:920:5843:7fff:ffff:ffff:ffff:ffff,GB +2001:920:5843:8000::,2001:920:5843:ffff:ffff:ffff:ffff:ffff,ES +2001:920:5844::,2001:920:5845:ffff:ffff:ffff:ffff:ffff,GB +2001:920:5846::,2001:920:5846:ffff:ffff:ffff:ffff:ffff,ES +2001:920:5847::,2001:920:584d:ffff:ffff:ffff:ffff:ffff,GB +2001:920:584e::,2001:920:584e:7fff:ffff:ffff:ffff:ffff,ES +2001:920:584e:8000::,2001:927:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:928::,2001:928:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:930::,2001:930:ffff:ffff:ffff:ffff:ffff:ffff,TR +2001:938::,2001:938:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:940::,2001:940:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:948::,2001:948:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:950::,2001:950:ffff:ffff:ffff:ffff:ffff:ffff,HU +2001:958::,2001:958:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:960::,2001:960:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:968::,2001:968:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:978::,2001:978:2:39::5:1,DE +2001:978:2:39::5:2,2001:978:2:39::5:2,SI +2001:978:2:39::5:3,2001:978:22ff:ffff:ffff:ffff:ffff:ffff,DE +2001:978:2300::,2001:978:2300:7fff:ffff:ffff:ffff:ffff,GB +2001:978:2300:8000::,2001:978:2304:ffff:ffff:ffff:ffff:ffff,DE +2001:978:2305::,2001:978:2305:ffff:ffff:ffff:ffff:ffff,US +2001:978:2306::,2001:978:29ff:ffff:ffff:ffff:ffff:ffff,DE +2001:978:2a00::,2001:978:2a00:ffff:ffff:ffff:ffff:ffff,IE +2001:978:2a01::,2001:978:33ff:ffff:ffff:ffff:ffff:ffff,DE +2001:978:3400::,2001:978:3400:ffff:ffff:ffff:ffff:ffff,US +2001:978:3401::,2001:978:3500:7fff:ffff:ffff:ffff:ffff,DE +2001:978:3500:8000::,2001:978:3500:ffff:ffff:ffff:ffff:ffff,PL +2001:978:3501::,2001:978:3bff:ffff:ffff:ffff:ffff:ffff,DE +2001:978:3c00::,2001:978:3c00:7fff:ffff:ffff:ffff:ffff,NL +2001:978:3c00:8000::,2001:978:3c03:ffff:ffff:ffff:ffff:ffff,DE +2001:978:3c04::,2001:978:3c04:7fff:ffff:ffff:ffff:ffff,NL +2001:978:3c04:8000::,2001:978:73ff:ffff:ffff:ffff:ffff:ffff,DE +2001:978:7400::,2001:978:7400:ffff:ffff:ffff:ffff:ffff,FI +2001:978:7401::,2001:978:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:980::,2001:981:6566:ffff:ffff:ffff:ffff:ffff,NL +2001:981:6567::,2001:981:6567:7fff:ffff:ffff:ffff:ffff,GB +2001:981:6567:8000::,2001:981:d262:ffff:ffff:ffff:ffff:ffff,NL +2001:981:d263::,2001:981:d263:7fff:ffff:ffff:ffff:ffff,PL +2001:981:d263:8000::,2001:984:55a9:ffff:ffff:ffff:ffff:ffff,NL +2001:984:55aa::,2001:984:55aa:7fff:ffff:ffff:ffff:ffff,PT +2001:984:55aa:8000::,2001:985:40b4:ffff:ffff:ffff:ffff:ffff,NL +2001:985:40b5::,2001:985:40b5:7fff:ffff:ffff:ffff:ffff,PL +2001:985:40b5:8000::,2001:987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:988::,2001:988:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:990::,2001:990:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:998::,2001:99b:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:9a0::,2001:9a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:9a8::,2001:9a8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:9b0::,2001:9b7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:9c0::,2001:9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:9c8::,2001:9cf:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:9d0::,2001:9d0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:9d8::,2001:9d8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:9e0::,2001:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:9e8::,2001:9e8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:9f0::,2001:9f7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:a00::,2001:a00:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:a08::,2001:a08:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:a10::,2001:a10:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:a18::,2001:a1f:ffff:ffff:ffff:ffff:ffff:ffff,LU +2001:a20::,2001:a20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:a30::,2001:a30:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:a38::,2001:a3f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:a40::,2001:a40:ffff:ffff:ffff:ffff:ffff:ffff,PT +2001:a48::,2001:a48:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:a50::,2001:a50:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:a58::,2001:a58:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:a60::,2001:a67:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:a68::,2001:a68:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:a70::,2001:a70:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:a78::,2001:a78:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:a80::,2001:a80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:a88::,2001:a88:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:a90::,2001:a90:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:a98::,2001:a98:ffff:ffff:ffff:ffff:ffff:ffff,TR +2001:aa0::,2001:aa0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:aa8::,2001:ab7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:ab8::,2001:abf:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:ac0::,2001:ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:ac8::,2001:ac8:1f:ffff:ffff:ffff:ffff:ffff,GB +2001:ac8:20::,2001:ac8:20:ffff:ffff:ffff:ffff:ffff,DE +2001:ac8:21::,2001:ac8:21:ffff:ffff:ffff:ffff:ffff,GB +2001:ac8:22::,2001:ac8:22:7fff:ffff:ffff:ffff:ffff,NL +2001:ac8:22:8000::,2001:ac8:22:ffff:ffff:ffff:ffff:ffff,GB +2001:ac8:23::,2001:ac8:23:7fff:ffff:ffff:ffff:ffff,ES +2001:ac8:23:8000::,2001:ac8:23:ffff:ffff:ffff:ffff:ffff,GB +2001:ac8:24::,2001:ac8:24:ffff:ffff:ffff:ffff:ffff,IT +2001:ac8:25::,2001:ac8:25:ffff:ffff:ffff:ffff:ffff,FR +2001:ac8:26::,2001:ac8:26:ffff:ffff:ffff:ffff:ffff,HU +2001:ac8:27::,2001:ac8:27:ffff:ffff:ffff:ffff:ffff,BE +2001:ac8:28::,2001:ac8:28:ffff:ffff:ffff:ffff:ffff,CH +2001:ac8:29::,2001:ac8:29:ffff:ffff:ffff:ffff:ffff,AT +2001:ac8:2a::,2001:ac8:2f:ffff:ffff:ffff:ffff:ffff,GB +2001:ac8:30::,2001:ac8:30:ffff:ffff:ffff:ffff:ffff,BG +2001:ac8:31::,2001:ac8:32:ffff:ffff:ffff:ffff:ffff,GB +2001:ac8:33::,2001:ac8:33:ffff:ffff:ffff:ffff:ffff,CZ +2001:ac8:34::,2001:ac8:34:ffff:ffff:ffff:ffff:ffff,GB +2001:ac8:35::,2001:ac8:35:ffff:ffff:ffff:ffff:ffff,ES +2001:ac8:36::,2001:ac8:36:ffff:ffff:ffff:ffff:ffff,DE +2001:ac8:37::,2001:ac8:37:ffff:ffff:ffff:ffff:ffff,DK +2001:ac8:38::,2001:ac8:38:ffff:ffff:ffff:ffff:ffff,NO +2001:ac8:39::,2001:ac8:39:ffff:ffff:ffff:ffff:ffff,IT +2001:ac8:3a::,2001:ac8:3f:ffff:ffff:ffff:ffff:ffff,GB +2001:ac8:40::,2001:ac8:40:ffff:ffff:ffff:ffff:ffff,JP +2001:ac8:41::,2001:ac8:42:ffff:ffff:ffff:ffff:ffff,ES +2001:ac8:43::,2001:ac8:44:ffff:ffff:ffff:ffff:ffff,DE +2001:ac8:45::,2001:ac8:45:ffff:ffff:ffff:ffff:ffff,BE +2001:ac8:46::,2001:ac8:46:ffff:ffff:ffff:ffff:ffff,HU +2001:ac8:47::,2001:ac8:47:ffff:ffff:ffff:ffff:ffff,DK +2001:ac8:48::,2001:ac8:49:ffff:ffff:ffff:ffff:ffff,GB +2001:ac8:4a::,2001:ac8:4b:ffff:ffff:ffff:ffff:ffff,IT +2001:ac8:4c::,2001:ac8:4c:ffff:ffff:ffff:ffff:ffff,NO +2001:ac8:4d::,2001:ac8:4d:ffff:ffff:ffff:ffff:ffff,FR +2001:ac8:4e::,2001:ac8:4e:ffff:ffff:ffff:ffff:ffff,CZ +2001:ac8:4f::,2001:ac8:4f:ffff:ffff:ffff:ffff:ffff,BG +2001:ac8:50::,2001:ac8:50:ffff:ffff:ffff:ffff:ffff,AT +2001:ac8:51::,2001:ac8:51:ffff:ffff:ffff:ffff:ffff,CH +2001:ac8:52::,2001:ac8:52:ffff:ffff:ffff:ffff:ffff,NL +2001:ac8:53::,2001:ac8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:ad0::,2001:ad0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2001:ad8::,2001:ae1:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:ae8::,2001:ae8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:af0::,2001:af0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:af8::,2001:af8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:b00::,2001:b07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:b08::,2001:b08:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:b10::,2001:b10:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:b18::,2001:b18:ffff:ffff:ffff:ffff:ffff:ffff,BG +2001:b20::,2001:b27:ffff:ffff:ffff:ffff:ffff:ffff,LU +2001:b28::,2001:b28:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:b30::,2001:b37:ffff:ffff:ffff:ffff:ffff:ffff,RO +2001:b40::,2001:b40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:b48::,2001:b4f:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:b50::,2001:b50:ffff:ffff:ffff:ffff:ffff:ffff,DK +2001:b58::,2001:b5f:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:b60::,2001:b67:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:b68::,2001:b68:ffff:ffff:ffff:ffff:ffff:ffff,HR +2001:b70::,2001:b70:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:b80::,2001:b87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:b88::,2001:b88:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:b90::,2001:b90:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:b98::,2001:b9f:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:ba0::,2001:ba0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:ba8::,2001:baf:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:bb0::,2001:bb6:355d:ffff:ffff:ffff:ffff:ffff,IE +2001:bb6:355e::,2001:bb6:355e:7fff:ffff:ffff:ffff:ffff,GB +2001:bb6:355e:8000::,2001:bb6:b215:7fff:ffff:ffff:ffff:ffff,IE +2001:bb6:b215:8000::,2001:bb6:b215:ffff:ffff:ffff:ffff:ffff,ES +2001:bb6:b216::,2001:bb7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2001:bb8::,2001:bb8:ffff:ffff:ffff:ffff:ffff:ffff,EE +2001:bc8::,2001:bc8:204f:ffff:ffff:ffff:ffff:ffff,FR +2001:bc8:2050::,2001:bc8:2050:7fff:ffff:ffff:ffff:ffff,DE +2001:bc8:2050:8000::,2001:bc8:3f13:7fff:ffff:ffff:ffff:ffff,FR +2001:bc8:3f13:8000::,2001:bc8:3f13:ffff:ffff:ffff:ffff:ffff,DE +2001:bc8:3f14::,2001:bc8:46ff:ffff:ffff:ffff:ffff:ffff,FR +2001:bc8:4700::,2001:bc8:4700:7fff:ffff:ffff:ffff:ffff,NL +2001:bc8:4700:8000::,2001:bc8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:bd0::,2001:bd0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:be0::,2001:be7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:be8::,2001:bef:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:bf0::,2001:bf7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:bf8::,2001:bf8:ffff:ffff:ffff:ffff:ffff:ffff,IL +2001:c00::,2001:c00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2001:c08::,2001:c08:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:c10::,2001:c10:ff08:ffff:ffff:ffff:ffff:ffff,SG +2001:c10:ff09::,2001:c10:ff09:7fff:ffff:ffff:ffff:ffff,TW +2001:c10:ff09:8000::,2001:c10:ffff:ffff:ffff:ffff:ffff:ffff,SG +2001:c18::,2001:c18:ffff:ffff:ffff:ffff:ffff:ffff,MY +2001:c20::,2001:c20:ffff:ffff:ffff:ffff:ffff:ffff,SG +2001:c28::,2001:c28:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:c30::,2001:c30:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:c38::,2001:c39:ffff:ffff:ffff:ffff:ffff:ffff,TH +2001:c40::,2001:c40:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:c48::,2001:c48:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:c50::,2001:c50:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:c58::,2001:c58:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:c60::,2001:c60:ffff:ffff:ffff:ffff:ffff:ffff,PG +2001:c68::,2001:c68:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:c70::,2001:c70:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:c78::,2001:c79:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:c80::,2001:c80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:c90::,2001:c90:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:c98::,2001:c98:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:ca0::,2001:ca0:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:ca8::,2001:ca8:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:cb0::,2001:cb0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:cb8::,2001:cb8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:cc0::,2001:cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:cc8::,2001:cc9:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:cd0::,2001:cd0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:cd8::,2001:cd8:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:ce0::,2001:ce0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2001:ce8::,2001:ce8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:cf0::,2001:cf0:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:cf8::,2001:cf8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d00::,2001:d00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d08::,2001:d08:ffff:ffff:ffff:ffff:ffff:ffff,MY +2001:d10::,2001:d10:ffff:ffff:ffff:ffff:ffff:ffff,ID +2001:d18::,2001:d18:ffff:ffff:ffff:ffff:ffff:ffff,PH +2001:d28::,2001:d28:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d30::,2001:d30:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d38::,2001:d38:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:d40::,2001:d40:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:d48::,2001:d48:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:d50::,2001:d50:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d58::,2001:d58:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:d68::,2001:d68:ffff:ffff:ffff:ffff:ffff:ffff,ID +2001:d70::,2001:d73:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d80::,2001:d80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d88::,2001:d88:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d90::,2001:d90:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d98::,2001:d98:ffff:ffff:ffff:ffff:ffff:ffff,SG +2001:da0::,2001:da0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:da8::,2001:daa:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:db0::,2001:db0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:dc0::,2001:dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:dc1::,2001:dc1:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:dc2::,2001:dc4:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:dc5::,2001:dc5:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:dc6::,2001:dc6:ffff:ffff:ffff:ffff:ffff:ffff,ID +2001:dc7::,2001:dc7:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:dc8::,2001:dc8:ffff:ffff:ffff:ffff:ffff:ffff,VN +2001:dc9::,2001:dc9:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:dca::,2001:dca:ffff:ffff:ffff:ffff:ffff:ffff,HK +2001:dcc::,2001:dcc:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:dcd::,2001:dcd:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:dce::,2001:dce:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2001:dd8::,2001:dd8::ffff:ffff:ffff:ffff:ffff,FJ +2001:dd8:1::,2001:dd8:1:ffff:ffff:ffff:ffff:ffff,CN +2001:dd8:2::,2001:dd8:2:ffff:ffff:ffff:ffff:ffff,MY +2001:dd8:3::,2001:dd8:3:ffff:ffff:ffff:ffff:ffff,NZ +2001:dd8:4::,2001:dd8:4:ffff:ffff:ffff:ffff:ffff,SG +2001:dd8:5::,2001:dd8:5:ffff:ffff:ffff:ffff:ffff,CN +2001:dd8:6::,2001:dd8:6:ffff:ffff:ffff:ffff:ffff,AU +2001:dd8:7::,2001:dd8:7:ffff:ffff:ffff:ffff:ffff,NP +2001:dd8:8::,2001:dd8:f:ffff:ffff:ffff:ffff:ffff,AU +2001:dd8:10::,2001:dd8:11:ffff:ffff:ffff:ffff:ffff,NP +2001:dd8:12::,2001:dd8:12:ffff:ffff:ffff:ffff:ffff,AU +2001:dd8:13::,2001:dd8:13:ffff:ffff:ffff:ffff:ffff,NZ +2001:dd8:14::,2001:dd8:14:ffff:ffff:ffff:ffff:ffff,AU +2001:dd8:15::,2001:dd8:15:ffff:ffff:ffff:ffff:ffff,HK +2001:dd8:16::,2001:dd8:16:ffff:ffff:ffff:ffff:ffff,SG +2001:dd8:17::,2001:dd8:17:ffff:ffff:ffff:ffff:ffff,KR +2001:dd8:18::,2001:dd8:18:ffff:ffff:ffff:ffff:ffff,TW +2001:dd8:19::,2001:dd8:19:ffff:ffff:ffff:ffff:ffff,IN +2001:dd8:1a::,2001:dd8:1a:ffff:ffff:ffff:ffff:ffff,CN +2001:dd8:1b::,2001:dd8:1b:ffff:ffff:ffff:ffff:ffff,IN +2001:dd8:1c::,2001:dd8:1c:ffff:ffff:ffff:ffff:ffff,PK +2001:dd8:1d::,2001:dd8:1d:ffff:ffff:ffff:ffff:ffff,BD +2001:dd8:1e::,2001:dd8:1e:ffff:ffff:ffff:ffff:ffff,KH +2001:dd8:1f::,2001:dd8:1f:ffff:ffff:ffff:ffff:ffff,ID +2001:dd8:20::,2001:dd8:21:ffff:ffff:ffff:ffff:ffff,IN +2001:dd8:22::,2001:dd8:22:ffff:ffff:ffff:ffff:ffff,JP +2001:dd8:24::,2001:dd8:25:ffff:ffff:ffff:ffff:ffff,NP +2001:dda::,2001:dda::ffff:ffff:ffff:ffff:ffff,JP +2001:ddc::,2001:ddc::ffff:ffff:ffff:ffff:ffff,MY +2001:ddd::,2001:ddd::ffff:ffff:ffff:ffff:ffff,AU +2001:dde::,2001:dde::ffff:ffff:ffff:ffff:ffff,MV +2001:de1::,2001:de1:3f:ffff:ffff:ffff:ffff:ffff,JP +2001:de8::,2001:de8::ffff:ffff:ffff:ffff:ffff,TH +2001:de8:1::,2001:de8:1:ffff:ffff:ffff:ffff:ffff,IN +2001:de8:2::,2001:de8:2:ffff:ffff:ffff:ffff:ffff,ID +2001:de8:3::,2001:de8:3:ffff:ffff:ffff:ffff:ffff,VN +2001:de8:4::,2001:de8:8:ffff:ffff:ffff:ffff:ffff,JP +2001:de8:a::,2001:de8:a:ffff:ffff:ffff:ffff:ffff,VN +2001:de8:b::,2001:de8:b:ffff:ffff:ffff:ffff:ffff,BD +2001:de8:c::,2001:de8:c:ffff:ffff:ffff:ffff:ffff,JP +2001:de8:d::,2001:de8:d:ffff:ffff:ffff:ffff:ffff,SG +2001:de8:e::,2001:de8:e:ffff:ffff:ffff:ffff:ffff,TH +2001:de8:f::,2001:de8:10:ffff:ffff:ffff:ffff:ffff,MY +2001:de8:11::,2001:de8:11:ffff:ffff:ffff:ffff:ffff,ID +2001:de8:12::,2001:de8:12:ffff:ffff:ffff:ffff:ffff,SG +2001:de8:13::,2001:de8:13:ffff:ffff:ffff:ffff:ffff,MY +2001:de8:14::,2001:de8:14:ffff:ffff:ffff:ffff:ffff,AU +2001:de8:15::,2001:de8:15:ffff:ffff:ffff:ffff:ffff,ID +2001:de8:16::,2001:de8:16:ffff:ffff:ffff:ffff:ffff,PF +2001:de8:17::,2001:de8:17:ffff:ffff:ffff:ffff:ffff,AU +2001:de8:19::,2001:de8:19:ffff:ffff:ffff:ffff:ffff,NZ +2001:de8:1a::,2001:de8:1a:ffff:ffff:ffff:ffff:ffff,ID +2001:de8:1d::,2001:de8:1d:ffff:ffff:ffff:ffff:ffff,KH +2001:de8:1e::,2001:de8:1e:ffff:ffff:ffff:ffff:ffff,JP +2001:de8:8000::,2001:de8:8000:ffff:ffff:ffff:ffff:ffff,WS +2001:de9::,2001:de9::ffff:ffff:ffff:ffff:ffff,LK +2001:de9:8000::,2001:de9:8000:ffff:ffff:ffff:ffff:ffff,ID +2001:dea::,2001:dea::ffff:ffff:ffff:ffff:ffff,AU +2001:dea:8000::,2001:dea:8000:ffff:ffff:ffff:ffff:ffff,PG +2001:deb::,2001:deb::ffff:ffff:ffff:ffff:ffff,TH +2001:deb:8000::,2001:deb:8000:ffff:ffff:ffff:ffff:ffff,BT +2001:dec::,2001:dec::ffff:ffff:ffff:ffff:ffff,VU +2001:dec:8000::,2001:dec:8000:ffff:ffff:ffff:ffff:ffff,PK +2001:ded::,2001:ded::ffff:ffff:ffff:ffff:ffff,SG +2001:ded:8000::,2001:ded:8000:ffff:ffff:ffff:ffff:ffff,IN +2001:dee::,2001:dee::ffff:ffff:ffff:ffff:ffff,HK +2001:dee:8000::,2001:dee:8001:ffff:ffff:ffff:ffff:ffff,NZ +2001:def::,2001:def::ffff:ffff:ffff:ffff:ffff,HK +2001:def:8000::,2001:def:8001:ffff:ffff:ffff:ffff:ffff,NP +2001:df0::,2001:df0:1:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:2::,2001:df0:2:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:4::,2001:df0:4:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:7::,2001:df0:7:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:8::,2001:df0:8:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:9::,2001:df0:a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c::,2001:df0:13:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:14::,2001:df0:14:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:15::,2001:df0:15:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:17::,2001:df0:17:ffff:ffff:ffff:ffff:ffff,LK +2001:df0:18::,2001:df0:18:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:19::,2001:df0:1d:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:1e::,2001:df0:1e:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:1f::,2001:df0:1f:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:40::,2001:df0:40:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:42::,2001:df0:42:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:43::,2001:df0:43:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:44::,2001:df0:44:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:45::,2001:df0:46:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:48::,2001:df0:48:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:49::,2001:df0:49:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:4a::,2001:df0:4a:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:4b::,2001:df0:4d:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:50::,2001:df0:60:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:62::,2001:df0:62:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:63::,2001:df0:63:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:65::,2001:df0:65:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:66::,2001:df0:66:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:68::,2001:df0:68:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:69::,2001:df0:69:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:6a::,2001:df0:6a:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:6b::,2001:df0:6b:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:6f::,2001:df0:6f:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:70::,2001:df0:70:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:71::,2001:df0:71:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:73::,2001:df0:74:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:75::,2001:df0:75:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:76::,2001:df0:76:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:77::,2001:df0:77:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:78::,2001:df0:78:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:7b::,2001:df0:7b:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:7d::,2001:df0:7d:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:7e::,2001:df0:81:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:82::,2001:df0:82:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:83::,2001:df0:83:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:84::,2001:df0:84:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:85::,2001:df0:85:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:86::,2001:df0:87:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:89::,2001:df0:89:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8b::,2001:df0:8b:ffff:ffff:ffff:ffff:ffff,NP +2001:df0:8c::,2001:df0:8c:ffff:ffff:ffff:ffff:ffff,NU +2001:df0:8e::,2001:df0:90:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:91::,2001:df0:91:ffff:ffff:ffff:ffff:ffff,FJ +2001:df0:92::,2001:df0:92:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:93::,2001:df0:93:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:94::,2001:df0:94:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:95::,2001:df0:95:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:96::,2001:df0:96:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:97::,2001:df0:97:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:98::,2001:df0:9a:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:9c::,2001:df0:9c:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:9d::,2001:df0:9d:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:9e::,2001:df0:9e:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:9f::,2001:df0:9f:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:a0::,2001:df0:a1:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a2::,2001:df0:a2:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:a3::,2001:df0:a3:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:a4::,2001:df0:a4:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a5::,2001:df0:a6:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:a7::,2001:df0:ab:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ad::,2001:df0:ad:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:ae::,2001:df0:ae:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:b0::,2001:df0:b0:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:b1::,2001:df0:b8:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:b9::,2001:df0:b9:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:ba::,2001:df0:bd:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:be::,2001:df0:be:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:bf::,2001:df0:bf:ffff:ffff:ffff:ffff:ffff,LA +2001:df0:c0::,2001:df0:c0:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:c1::,2001:df0:c2:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c4::,2001:df0:c4:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c5::,2001:df0:c5:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:c6::,2001:df0:c6:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:c7::,2001:df0:c8:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c9::,2001:df0:cc:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:cd::,2001:df0:cd:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:ce::,2001:df0:ce:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:cf::,2001:df0:cf:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:d1::,2001:df0:d1:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:d2::,2001:df0:d2:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:d4::,2001:df0:d5:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:d7::,2001:df0:d7:ffff:ffff:ffff:ffff:ffff,KR +2001:df0:d8::,2001:df0:d8:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:d9::,2001:df0:d9:1ff:ffff:ffff:ffff:ffff,TW +2001:df0:d9:200::,2001:df0:d9:2ff:ffff:ffff:ffff:ffff,HK +2001:df0:d9:300::,2001:df0:d9:ffff:ffff:ffff:ffff:ffff,TW +2001:df0:da::,2001:df0:da:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:dc::,2001:df0:dc:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:dd::,2001:df0:dd:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:de::,2001:df0:df:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:e1::,2001:df0:e1:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:e2::,2001:df0:e2:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:e3::,2001:df0:e3:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:e4::,2001:df0:e5:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:e6::,2001:df0:e6:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:e7::,2001:df0:e8:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:e9::,2001:df0:e9:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ea::,2001:df0:ea:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:eb::,2001:df0:eb:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:ed::,2001:df0:ed:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ee::,2001:df0:ee:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:ef::,2001:df0:f0:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:f1::,2001:df0:f1:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:f2::,2001:df0:f2:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f3::,2001:df0:f3:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:f4::,2001:df0:f4:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f6::,2001:df0:f6:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:f7::,2001:df0:f7:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:f8::,2001:df0:fa:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:fb::,2001:df0:fb:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:fc::,2001:df0:fc:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:fd::,2001:df0:fe:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:100::,2001:df0:1ff:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:201::,2001:df0:201:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:202::,2001:df0:202:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:203::,2001:df0:203:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:204::,2001:df0:204:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:205::,2001:df0:205:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:206::,2001:df0:206:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:207::,2001:df0:207:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:208::,2001:df0:208:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:209::,2001:df0:209:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:20a::,2001:df0:20a:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:20b::,2001:df0:20b:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:20c::,2001:df0:20c:ffff:ffff:ffff:ffff:ffff,NF +2001:df0:20d::,2001:df0:20d:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:20e::,2001:df0:20e:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:210::,2001:df0:210:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:211::,2001:df0:211:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:212::,2001:df0:212:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:213::,2001:df0:213:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:214::,2001:df0:214:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:215::,2001:df0:215:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:216::,2001:df0:217:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:218::,2001:df0:219:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:21a::,2001:df0:21a:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:21b::,2001:df0:21b:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:21c::,2001:df0:21c:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:21e::,2001:df0:21e:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:21f::,2001:df0:220:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:221::,2001:df0:221:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:222::,2001:df0:222:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:224::,2001:df0:224:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:226::,2001:df0:228:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:229::,2001:df0:229:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:22b::,2001:df0:22b:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:22c::,2001:df0:22d:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:22e::,2001:df0:22e:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:22f::,2001:df0:22f:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:230::,2001:df0:230:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:232::,2001:df0:232:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:233::,2001:df0:234:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:235::,2001:df0:235:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:237::,2001:df0:237:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:238::,2001:df0:238:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:239::,2001:df0:239:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:23a::,2001:df0:23a:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:23b::,2001:df0:23b:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:23c::,2001:df0:23d:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:23e::,2001:df0:23e:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:23f::,2001:df0:23f:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:241::,2001:df0:241:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:242::,2001:df0:242:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:243::,2001:df0:243:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:245::,2001:df0:246:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:247::,2001:df0:247:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:248::,2001:df0:248:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:249::,2001:df0:24a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:24b::,2001:df0:24b:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:24c::,2001:df0:24c:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:24e::,2001:df0:24e:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:24f::,2001:df0:24f:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:250::,2001:df0:250:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:251::,2001:df0:252:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:253::,2001:df0:253:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:254::,2001:df0:254:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:255::,2001:df0:255:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:256::,2001:df0:256:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:257::,2001:df0:257:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:258::,2001:df0:258:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:259::,2001:df0:259:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:25a::,2001:df0:25a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:25b::,2001:df0:25b:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:25c::,2001:df0:25d:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:25e::,2001:df0:25e:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:260::,2001:df0:260:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:261::,2001:df0:261:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:263::,2001:df0:263:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:264::,2001:df0:264:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:265::,2001:df0:265:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:266::,2001:df0:266:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:267::,2001:df0:267:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:268::,2001:df0:269:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:26b::,2001:df0:26b:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:26c::,2001:df0:26c:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:26d::,2001:df0:26f:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:270::,2001:df0:270:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:272::,2001:df0:272:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:273::,2001:df0:273:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:274::,2001:df0:277:ffff:ffff:ffff:ffff:ffff,NP +2001:df0:278::,2001:df0:278:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:279::,2001:df0:279:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:27a::,2001:df0:27a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:27b::,2001:df0:27b:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:27c::,2001:df0:27c:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:27d::,2001:df0:27d:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:27e::,2001:df0:27e:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:27f::,2001:df0:27f:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:280::,2001:df0:28f:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:290::,2001:df0:290:ffff:ffff:ffff:ffff:ffff,KR +2001:df0:291::,2001:df0:291:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:292::,2001:df0:292:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:293::,2001:df0:293:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:294::,2001:df0:294:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:295::,2001:df0:296:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:298::,2001:df0:298:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:299::,2001:df0:299:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:29a::,2001:df0:29a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:29b::,2001:df0:29b:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:29c::,2001:df0:29c:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:29d::,2001:df0:29d:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:29f::,2001:df0:29f:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:2a0::,2001:df0:2a0:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:2a1::,2001:df0:2a1:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2a3::,2001:df0:2a3:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2a4::,2001:df0:2a4:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2a5::,2001:df0:2a5:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:2a6::,2001:df0:2a6:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2a7::,2001:df0:2a7:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2a8::,2001:df0:2a8:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:2a9::,2001:df0:2aa:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2ab::,2001:df0:2ab:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2ac::,2001:df0:2ac:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:2ad::,2001:df0:2ad:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2af::,2001:df0:2af:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:2b0::,2001:df0:2b1:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2b2::,2001:df0:2b2:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2b4::,2001:df0:2b4:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2b5::,2001:df0:2b5:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2b8::,2001:df0:2b8:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:2b9::,2001:df0:2b9:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:2ba::,2001:df0:2ba:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:2bb::,2001:df0:2bb:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:2bc::,2001:df0:2bc:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2bd::,2001:df0:2bd:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2be::,2001:df0:2be:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2bf::,2001:df0:2bf:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:2c1::,2001:df0:2c1:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:2c2::,2001:df0:2c2:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2c3::,2001:df0:2c3:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:2c4::,2001:df0:2c4:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2c5::,2001:df0:2c5:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:2c6::,2001:df0:2c8:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2c9::,2001:df0:2c9:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2ca::,2001:df0:2ca:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2cb::,2001:df0:2cb:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:2cc::,2001:df0:2cc:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2ce::,2001:df0:2e0:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2e1::,2001:df0:2e1:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2e2::,2001:df0:2e2:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2e3::,2001:df0:2e3:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2e4::,2001:df0:2e4:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2e5::,2001:df0:2e5:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2e6::,2001:df0:2e7:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2e8::,2001:df0:2e8:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:2e9::,2001:df0:2e9:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:2ea::,2001:df0:2ea:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:2ec::,2001:df0:2ec:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2ed::,2001:df0:2ee:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2ef::,2001:df0:2ef:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:2f0::,2001:df0:2f3:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2f4::,2001:df0:2f4:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2f5::,2001:df0:2f5:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2f6::,2001:df0:2f6:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2f9::,2001:df0:2f9:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2fa::,2001:df0:2fa:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2fb::,2001:df0:2fb:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:2fc::,2001:df0:2fc:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2fd::,2001:df0:2fd:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2fe::,2001:df0:2ff:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:300::,2001:df0:319:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:400::,2001:df0:400:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:401::,2001:df0:401:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:402::,2001:df0:403:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:408::,2001:df0:408:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:409::,2001:df0:409:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:40a::,2001:df0:40a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:40c::,2001:df0:40c:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:40d::,2001:df0:40d:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:40e::,2001:df0:40f:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:410::,2001:df0:410:ffff:ffff:ffff:ffff:ffff,VU +2001:df0:411::,2001:df0:411:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:412::,2001:df0:412:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:413::,2001:df0:413:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:415::,2001:df0:415:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:418::,2001:df0:419:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:41a::,2001:df0:41a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:41b::,2001:df0:41b:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:41c::,2001:df0:41c:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:41d::,2001:df0:41e:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:41f::,2001:df0:41f:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:420::,2001:df0:420:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:421::,2001:df0:421:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:422::,2001:df0:422:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:423::,2001:df0:423:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:425::,2001:df0:425:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:426::,2001:df0:426:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:427::,2001:df0:427:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:430::,2001:df0:43f:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:440::,2001:df0:440:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:441::,2001:df0:441:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:442::,2001:df0:443:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:444::,2001:df0:445:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:446::,2001:df0:446:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:447::,2001:df0:447:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:448::,2001:df0:448:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:449::,2001:df0:449:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:44a::,2001:df0:44a:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:44b::,2001:df0:44b:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:44c::,2001:df0:44d:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:44e::,2001:df0:44e:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:44f::,2001:df0:44f:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:450::,2001:df0:450:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:451::,2001:df0:451:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:452::,2001:df0:452:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:453::,2001:df0:453:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:454::,2001:df0:454:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:455::,2001:df0:455:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:456::,2001:df0:456:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:457::,2001:df0:457:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:458::,2001:df0:458:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:45a::,2001:df0:45a:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:45c::,2001:df0:45d:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:45f::,2001:df0:45f:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:460::,2001:df0:460:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:461::,2001:df0:461:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:462::,2001:df0:462:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:464::,2001:df0:464:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:465::,2001:df0:465:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:466::,2001:df0:466:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:467::,2001:df0:467:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:468::,2001:df0:469:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:46a::,2001:df0:46a:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:46b::,2001:df0:46b:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:46c::,2001:df0:46c:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:500::,2001:df0:600:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:700::,2001:df0:700:ffff:ffff:ffff:ffff:ffff,PG +2001:df0:800::,2001:df0:800:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:900::,2001:df0:900:ffff:ffff:ffff:ffff:ffff,NP +2001:df0:a00::,2001:df0:a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:b00::,2001:df0:b00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:c00::,2001:df0:c00:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:d00::,2001:df0:d00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:e00::,2001:df0:e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f00::,2001:df0:f00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:1000::,2001:df0:1000:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:1100::,2001:df0:1100:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:1200::,2001:df0:1200:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:1300::,2001:df0:1300:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:1400::,2001:df0:1400:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:1500::,2001:df0:1500:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:1600::,2001:df0:1600:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:1700::,2001:df0:1700:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:1800::,2001:df0:1800:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:1900::,2001:df0:1900:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:1a00::,2001:df0:1a00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:1b00::,2001:df0:1b00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:1c00::,2001:df0:1c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:1d00::,2001:df0:1d00:ffff:ffff:ffff:ffff:ffff,MV +2001:df0:1e00::,2001:df0:1e01:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:1f00::,2001:df0:1f00:ffff:ffff:ffff:ffff:ffff,MV +2001:df0:2000::,2001:df0:2000:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2100::,2001:df0:2100:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2200::,2001:df0:2200:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2300::,2001:df0:2300:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2400::,2001:df0:2400:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:2500::,2001:df0:2500:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2600::,2001:df0:2600:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2700::,2001:df0:2700:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2800::,2001:df0:2800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2900::,2001:df0:2900:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2a00::,2001:df0:2a00:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:2d00::,2001:df0:2d00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2e00::,2001:df0:2e00:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:2f00::,2001:df0:2f00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:3000::,2001:df0:3000:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:3100::,2001:df0:3100:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:3200::,2001:df0:3200:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:3300::,2001:df0:3300:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:3500::,2001:df0:3500:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:3600::,2001:df0:3600:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:3700::,2001:df0:3700:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:3800::,2001:df0:3800:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:3900::,2001:df0:3900:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:3a00::,2001:df0:3a00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:3b00::,2001:df0:3b00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:3c00::,2001:df0:3c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:3d00::,2001:df0:3d00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:3e00::,2001:df0:3e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:3f00::,2001:df0:3f00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:4100::,2001:df0:4100:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:4200::,2001:df0:4200:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:4300::,2001:df0:4300:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:4400::,2001:df0:4400:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:4500::,2001:df0:4500:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:4700::,2001:df0:4700:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:4800::,2001:df0:4800:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:4900::,2001:df0:4900:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:4b00::,2001:df0:4b00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:4d00::,2001:df0:4d00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:4e00::,2001:df0:4e00:ffff:ffff:ffff:ffff:ffff,TW +2001:df0:4f00::,2001:df0:4f00:ffff:ffff:ffff:ffff:ffff,MN +2001:df0:5000::,2001:df0:5000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:5100::,2001:df0:5100:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:5200::,2001:df0:5200:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:5300::,2001:df0:5300:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:5500::,2001:df0:5500:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:5700::,2001:df0:5700:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:5800::,2001:df0:5800:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:5900::,2001:df0:5900:ffff:ffff:ffff:ffff:ffff,NP +2001:df0:5a00::,2001:df0:5a00:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:5b00::,2001:df0:5b00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:5c00::,2001:df0:5c00:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:5d00::,2001:df0:5d01:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:5e00::,2001:df0:5e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:5f00::,2001:df0:5f00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:6000::,2001:df0:6000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:6100::,2001:df0:6100:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:6200::,2001:df0:6200:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:6300::,2001:df0:6300:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:6400::,2001:df0:6400:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:6500::,2001:df0:6500:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:6600::,2001:df0:6600:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:6700::,2001:df0:6700:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:6800::,2001:df0:6800:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:6900::,2001:df0:6900:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:6a00::,2001:df0:6a00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:6b00::,2001:df0:6b00:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:6d00::,2001:df0:6d00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:6e00::,2001:df0:6e00:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:6f00::,2001:df0:6f00:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:7000::,2001:df0:7000:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:7100::,2001:df0:7100:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:7200::,2001:df0:7200:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:7300::,2001:df0:7300:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:7400::,2001:df0:7400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:7500::,2001:df0:7500:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:7600::,2001:df0:7600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:7700::,2001:df0:7700:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:7900::,2001:df0:7900:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:7a00::,2001:df0:7a00:ffff:ffff:ffff:ffff:ffff,TL +2001:df0:7b00::,2001:df0:7b00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:7c00::,2001:df0:7c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:7d00::,2001:df0:7d00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:7e00::,2001:df0:7e00:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:7f00::,2001:df0:7f00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:8000::,2001:df0:8000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8100::,2001:df0:8100:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:8200::,2001:df0:8200:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:8300::,2001:df0:8300:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:8400::,2001:df0:8400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8500::,2001:df0:8500:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:8600::,2001:df0:8600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8700::,2001:df0:8700:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:8800::,2001:df0:8800:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8900::,2001:df0:8900:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:8a00::,2001:df0:8a00:ffff:ffff:ffff:ffff:ffff,NP +2001:df0:8b00::,2001:df0:8b00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:8c00::,2001:df0:8c00:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:8d00::,2001:df0:8d00:ffff:ffff:ffff:ffff:ffff,MV +2001:df0:8e00::,2001:df0:8e00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:8f00::,2001:df0:8f00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:9100::,2001:df0:9100:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:9200::,2001:df0:9200:ffff:ffff:ffff:ffff:ffff,MM +2001:df0:9300::,2001:df0:9300:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:9400::,2001:df0:9400:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:9500::,2001:df0:9500:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:9600::,2001:df0:9600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:9700::,2001:df0:9700:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:9800::,2001:df0:9800:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:9900::,2001:df0:9900:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:9a00::,2001:df0:9a00:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:9b00::,2001:df0:9b00:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:9c00::,2001:df0:9c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:9d00::,2001:df0:9d00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:9e00::,2001:df0:9e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:9f00::,2001:df0:9f00:ffff:ffff:ffff:ffff:ffff,KH +2001:df0:a000::,2001:df0:a000:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a100::,2001:df0:a100:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a200::,2001:df0:a200:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:a300::,2001:df0:a300:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:a500::,2001:df0:a500:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:a600::,2001:df0:a600:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a700::,2001:df0:a700:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:a800::,2001:df0:a800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a900::,2001:df0:a900:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:aa00::,2001:df0:aa00:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:ab00::,2001:df0:ab00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:ac00::,2001:df0:ac00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:ad00::,2001:df0:ad00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:ae00::,2001:df0:ae00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:af00::,2001:df0:af00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:b000::,2001:df0:b000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:b100::,2001:df0:b100:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:b200::,2001:df0:b200:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:b300::,2001:df0:b300:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:b400::,2001:df0:b400:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:b500::,2001:df0:b500:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:b600::,2001:df0:b600:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:b700::,2001:df0:b700:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:b800::,2001:df0:b800:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:b900::,2001:df0:b900:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ba00::,2001:df0:ba00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:bb00::,2001:df0:bb00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:bc00::,2001:df0:bc00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:bd00::,2001:df0:bd00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:be00::,2001:df0:be00:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:bf00::,2001:df0:bf00:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:c000::,2001:df0:c000:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:c100::,2001:df0:c100:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c200::,2001:df0:c200:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c300::,2001:df0:c300:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:c400::,2001:df0:c400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:c500::,2001:df0:c500:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:c600::,2001:df0:c600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:c800::,2001:df0:c800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c900::,2001:df0:c900:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:ca00::,2001:df0:ca00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:cb00::,2001:df0:cb00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:cc00::,2001:df0:cc00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:cd00::,2001:df0:cd00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:ce00::,2001:df0:ce00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:cf00::,2001:df0:cf00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:d000::,2001:df0:d000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:d100::,2001:df0:d100:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:d200::,2001:df0:d200:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:d300::,2001:df0:d301:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:d400::,2001:df0:d400:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:d500::,2001:df0:d500:ffff:ffff:ffff:ffff:ffff,AF +2001:df0:d600::,2001:df0:d600:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:d700::,2001:df0:d700:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:d900::,2001:df0:d900:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:db00::,2001:df0:db03:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:dc00::,2001:df0:dc00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:dd00::,2001:df0:dd00:ffff:ffff:ffff:ffff:ffff,KH +2001:df0:de00::,2001:df0:de00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:df00::,2001:df0:df00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:e100::,2001:df0:e100:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:e200::,2001:df0:e200:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:e300::,2001:df0:e300:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:e400::,2001:df0:e400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:e500::,2001:df0:e500:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:e600::,2001:df0:e600:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:e700::,2001:df0:e700:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:e800::,2001:df0:e800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:e900::,2001:df0:e900:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ea00::,2001:df0:ea00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:eb00::,2001:df0:eb00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ec00::,2001:df0:ec00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:ed00::,2001:df0:ed00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ee00::,2001:df0:ee00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ef00::,2001:df0:ef00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f000::,2001:df0:f000:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:f100::,2001:df0:f100:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:f200::,2001:df0:f200:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f300::,2001:df0:f300:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f400::,2001:df0:f401:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:f500::,2001:df0:f500:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f600::,2001:df0:f600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:f700::,2001:df0:f700:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f800::,2001:df0:f800:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f900::,2001:df0:f900:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:fa00::,2001:df0:fa00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:fb00::,2001:df0:fb00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:fc00::,2001:df0:fc01:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:fd00::,2001:df0:fd00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:fe00::,2001:df0:fe00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:ff00::,2001:df0:ff00:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:100::,2001:df1:100:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:200::,2001:df1:200:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:300::,2001:df1:300:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:400::,2001:df1:400:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:500::,2001:df1:500:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:600::,2001:df1:600:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:700::,2001:df1:700:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:800::,2001:df1:801:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:900::,2001:df1:900:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:a00::,2001:df1:a00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:b00::,2001:df1:b00:ffff:ffff:ffff:ffff:ffff,PG +2001:df1:c00::,2001:df1:c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:d00::,2001:df1:d00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:e00::,2001:df1:e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:f00::,2001:df1:f00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:1100::,2001:df1:1100:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:1200::,2001:df1:1200:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:1300::,2001:df1:1300:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:1400::,2001:df1:1400:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:1500::,2001:df1:1500:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:1600::,2001:df1:1600:ffff:ffff:ffff:ffff:ffff,LK +2001:df1:1700::,2001:df1:1700:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:1800::,2001:df1:1800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:1900::,2001:df1:1900:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:1a00::,2001:df1:1a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:1b00::,2001:df1:1b00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:1c00::,2001:df1:1c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:1d00::,2001:df1:1d00:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:1e00::,2001:df1:1e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:1f00::,2001:df1:1f00:ffff:ffff:ffff:ffff:ffff,VG +2001:df1:2000::,2001:df1:2000:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:2100::,2001:df1:2100:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:2200::,2001:df1:2200:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:2300::,2001:df1:2300:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:2400::,2001:df1:2401:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:2500::,2001:df1:2500:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:2600::,2001:df1:2600:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:2700::,2001:df1:2700:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:2900::,2001:df1:2900:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:2a00::,2001:df1:2a00:ffff:ffff:ffff:ffff:ffff,MY +2001:df1:2b00::,2001:df1:2b00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:2c00::,2001:df1:2c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:2d00::,2001:df1:2d00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:2e00::,2001:df1:2e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:3000::,2001:df1:3000:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:3100::,2001:df1:3100:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:3200::,2001:df1:3200:ffff:ffff:ffff:ffff:ffff,VN +2001:df1:3300::,2001:df1:3300:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:3400::,2001:df1:3400:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:3500::,2001:df1:3500:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:3600::,2001:df1:3600:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:3700::,2001:df1:3700:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:3800::,2001:df1:3800:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:3900::,2001:df1:3900:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:3a00::,2001:df1:3a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:3b00::,2001:df1:3b00:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:3c00::,2001:df1:3c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:3d00::,2001:df1:3d00:ffff:ffff:ffff:ffff:ffff,CN +2001:df1:3e00::,2001:df1:3e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:3f00::,2001:df1:3f00:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:4000::,2001:df1:4000:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:4100::,2001:df1:4100:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:4200::,2001:df1:4200:ffff:ffff:ffff:ffff:ffff,MY +2001:df1:4300::,2001:df1:4300:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:4400::,2001:df1:4400:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:4500::,2001:df1:4500:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:4600::,2001:df1:4600:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:4700::,2001:df1:4700:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:4800::,2001:df1:4800:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:4900::,2001:df1:4900:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:4a00::,2001:df1:4a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:4b00::,2001:df1:4b00:ffff:ffff:ffff:ffff:ffff,PK +2001:df1:4c00::,2001:df1:4c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:4d00::,2001:df1:4d00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:4e00::,2001:df1:4e00:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:4f00::,2001:df1:4f00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:5000::,2001:df1:5000:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:5100::,2001:df1:5100:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:5200::,2001:df1:5200:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:5300::,2001:df1:5300:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:5500::,2001:df1:5500:ffff:ffff:ffff:ffff:ffff,MM +2001:df1:5600::,2001:df1:5600:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:5700::,2001:df1:5700:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:5800::,2001:df1:5800:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:5900::,2001:df1:5900:ffff:ffff:ffff:ffff:ffff,MY +2001:df1:5a00::,2001:df1:5a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:5b00::,2001:df1:5b00:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:5c00::,2001:df1:5c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:5d00::,2001:df1:5d00:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:5e00::,2001:df1:5e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:5f00::,2001:df1:5f00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:6000::,2001:df1:6000:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:6100::,2001:df1:6100:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:6200::,2001:df1:6200:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:6300::,2001:df1:6300:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:6400::,2001:df1:6400:ffff:ffff:ffff:ffff:ffff,TH +2001:df1:6500::,2001:df1:6500:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:6600::,2001:df1:6600:ffff:ffff:ffff:ffff:ffff,MY +2001:df1:6700::,2001:df1:6700:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:6800::,2001:df1:6800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:6900::,2001:df1:6900:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:6a00::,2001:df1:6a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:6b00::,2001:df1:6b00:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:6c00::,2001:df1:6c00:ffff:ffff:ffff:ffff:ffff,TH +2001:df1:6d00::,2001:df1:6d00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:6e00::,2001:df1:6e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:6f00::,2001:df1:6f00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:7000::,2001:df1:7000:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:7100::,2001:df1:7100:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:7200::,2001:df1:7200:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:7300::,2001:df1:7300:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:7400::,2001:df1:7400:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:7500::,2001:df1:7500:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:7600::,2001:df1:7600:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:7700::,2001:df1:7700:ffff:ffff:ffff:ffff:ffff,TH +2001:df1:7800::,2001:df1:7800:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:7900::,2001:df1:7900:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:7a00::,2001:df1:7a00:ffff:ffff:ffff:ffff:ffff,NP +2001:df1:7b00::,2001:df1:7b00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:7c00::,2001:df1:7c00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:7d00::,2001:df1:7d00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:7e00::,2001:df1:7e00:ffff:ffff:ffff:ffff:ffff,MM +2001:df1:7f00::,2001:df1:7f00:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:8000::,2001:df1:8000:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:8100::,2001:df1:8100:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:8200::,2001:df1:8200:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:8400::,2001:df1:8400:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:8500::,2001:df1:8500:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:8600::,2001:df1:8600:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:8700::,2001:df1:8700:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:8800::,2001:df1:8800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:8900::,2001:df1:8900:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:8a00::,2001:df1:8a00:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:8b00::,2001:df1:8b00:ffff:ffff:ffff:ffff:ffff,CN +2001:df1:8c00::,2001:df1:8c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:8d00::,2001:df1:8d00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:8e00::,2001:df1:8e00:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:8f00::,2001:df1:8f00:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:9000::,2001:df1:9000:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:9100::,2001:df1:9100:ffff:ffff:ffff:ffff:ffff,PK +2001:df1:9200::,2001:df1:9200:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:9300::,2001:df1:9300:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:9400::,2001:df1:9400:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:9500::,2001:df1:9500:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:9600::,2001:df1:9600:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:9700::,2001:df1:9700:ffff:ffff:ffff:ffff:ffff,MY +2001:df1:9800::,2001:df1:9800:ffff:ffff:ffff:ffff:ffff,MY +2001:df1:9900::,2001:df1:9900:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:9a00::,2001:df1:9a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:9b00::,2001:df1:9b00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:9c00::,2001:df1:9c00:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:9d00::,2001:df1:9d00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:9e00::,2001:df1:9e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:9f00::,2001:df1:9f00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:a000::,2001:df1:a000:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:a100::,2001:df1:a100:ffff:ffff:ffff:ffff:ffff,CN +2001:df1:a200::,2001:df1:a200:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:a300::,2001:df1:a300:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:a400::,2001:df1:a400:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:a500::,2001:df1:a500:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:a700::,2001:df1:a700:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:a800::,2001:df1:a800:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:a900::,2001:df1:a900:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:aa00::,2001:df1:aa00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:ab00::,2001:df1:ab00:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:ac00::,2001:df1:ac00:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:ad00::,2001:df1:ad00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:af00::,2001:df1:af00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:b000::,2001:df1:b000:ffff:ffff:ffff:ffff:ffff,TH +2001:df1:b100::,2001:df1:b100:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:b200::,2001:df1:b200:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:b300::,2001:df1:b300:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:b400::,2001:df1:b400:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:b500::,2001:df1:b500:ffff:ffff:ffff:ffff:ffff,JP +2001:df1:b600::,2001:df1:b600:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:b700::,2001:df1:b700:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:b800::,2001:df1:b800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:b900::,2001:df1:b900:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:ba00::,2001:df1:ba00:ffff:ffff:ffff:ffff:ffff,BN +2001:df1:bb00::,2001:df1:bb00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:bc00::,2001:df1:bc00:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:bd00::,2001:df1:bd00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:be00::,2001:df1:be00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:bf00::,2001:df1:bf00:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:c100::,2001:df1:c100:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:c200::,2001:df1:c200:ffff:ffff:ffff:ffff:ffff,FR +2001:df1:c300::,2001:df1:c300:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:c400::,2001:df1:c400:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:c500::,2001:df1:c500:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:c600::,2001:df1:c600:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:c700::,2001:df1:c700:ffff:ffff:ffff:ffff:ffff,MM +2001:df1:c701::,2001:df1:c701:ffff:ffff:ffff:ffff:ffff,KH +2001:df1:c800::,2001:df1:c800:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:c900::,2001:df1:c900:ffff:ffff:ffff:ffff:ffff,CN +2001:df1:ca00::,2001:df1:ca00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:cb00::,2001:df1:cb00:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:cc00::,2001:df1:cc00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:cd00::,2001:df1:cd00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:ce00::,2001:df1:ce00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:d000::,2001:df1:d000:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:d100::,2001:df1:d100:ffff:ffff:ffff:ffff:ffff,CN +2001:df1:d200::,2001:df1:d200:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:d300::,2001:df1:d300:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:d400::,2001:df1:d401:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:d600::,2001:df1:d600:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:d700::,2001:df1:d700:ffff:ffff:ffff:ffff:ffff,NL +2001:df1:d800::,2001:df1:d800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:d900::,2001:df1:d900:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:da00::,2001:df1:da00:ffff:ffff:ffff:ffff:ffff,CN +2001:df1:db00::,2001:df1:db00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:dd00::,2001:df1:dd01:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:de00::,2001:df1:de00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:df00::,2001:df1:df00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:e000::,2001:df1:e000:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:e100::,2001:df1:e100:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:e200::,2001:df1:e200:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:e300::,2001:df1:e307:ffff:ffff:ffff:ffff:ffff,US +2001:df1:e400::,2001:df1:e400:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:e500::,2001:df1:e500:ffff:ffff:ffff:ffff:ffff,JP +2001:df1:e600::,2001:df1:e600:ffff:ffff:ffff:ffff:ffff,CN +2001:df1:e700::,2001:df1:e700:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:e800::,2001:df1:e800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:e900::,2001:df1:e900:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:ea00::,2001:df1:ea00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:eb00::,2001:df1:eb00:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:ec00::,2001:df1:ec00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:ed00::,2001:df1:ed00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:ee00::,2001:df1:ee00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:ef00::,2001:df1:ef00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:f000::,2001:df1:f000:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:f100::,2001:df1:f100:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:f200::,2001:df1:f200:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:f300::,2001:df1:f300:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:f400::,2001:df1:f400:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:f500::,2001:df1:f500:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:f600::,2001:df1:f600:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:f700::,2001:df1:f700:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:f800::,2001:df1:f800:ffff:ffff:ffff:ffff:ffff,BN +2001:df1:f900::,2001:df1:f900:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:fa00::,2001:df1:fa00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:fb00::,2001:df1:fb00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:fc00::,2001:df1:fc00:ffff:ffff:ffff:ffff:ffff,MY +2001:df1:fd00::,2001:df1:fd00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:fe00::,2001:df1:fe00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:ff00::,2001:df1:ff00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2::,2001:df2::ffff:ffff:ffff:ffff:ffff,AU +2001:df2:100::,2001:df2:100:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:200::,2001:df2:200:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:300::,2001:df2:300:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:400::,2001:df2:400:ffff:ffff:ffff:ffff:ffff,TH +2001:df2:500::,2001:df2:500:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:600::,2001:df2:600:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:700::,2001:df2:700:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:800::,2001:df2:800:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:900::,2001:df2:900:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:a00::,2001:df2:a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:b00::,2001:df2:b00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:d00::,2001:df2:d00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:e00::,2001:df2:e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:f00::,2001:df2:f00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:1000::,2001:df2:1001:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:1100::,2001:df2:1100:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:1200::,2001:df2:1200:ffff:ffff:ffff:ffff:ffff,BD +2001:df2:1300::,2001:df2:1300:ffff:ffff:ffff:ffff:ffff,NZ +2001:df2:1400::,2001:df2:1400:ffff:ffff:ffff:ffff:ffff,NP +2001:df2:1500::,2001:df2:1500:ffff:ffff:ffff:ffff:ffff,PG +2001:df2:1600::,2001:df2:1600:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:1700::,2001:df2:1700:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:1800::,2001:df2:1803:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:1900::,2001:df2:1900:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:1a00::,2001:df2:1a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:1b00::,2001:df2:1b00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:1c00::,2001:df2:1c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:1d00::,2001:df2:1d00:ffff:ffff:ffff:ffff:ffff,MY +2001:df2:1e00::,2001:df2:1e00:ffff:ffff:ffff:ffff:ffff,SG +2001:df2:1f00::,2001:df2:1f00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:2000::,2001:df2:2000:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:2100::,2001:df2:2100:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:2200::,2001:df2:2200:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:2300::,2001:df2:2300:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:2400::,2001:df2:2400:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:2500::,2001:df2:2500:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:2600::,2001:df2:2600:ffff:ffff:ffff:ffff:ffff,SG +2001:df2:2700::,2001:df2:2700:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:2800::,2001:df2:2800:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:2900::,2001:df2:2900:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:2a00::,2001:df2:2a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:2b00::,2001:df2:2b00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:2c00::,2001:df2:2c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:2d00::,2001:df2:2d00:ffff:ffff:ffff:ffff:ffff,SG +2001:df2:2e00::,2001:df2:2e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:2f00::,2001:df2:2f00:ffff:ffff:ffff:ffff:ffff,TH +2001:df2:3000::,2001:df2:3000:ffff:ffff:ffff:ffff:ffff,SG +2001:df2:3100::,2001:df2:3100:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:3200::,2001:df2:3200:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:3300::,2001:df2:3300:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:3400::,2001:df2:3400:ffff:ffff:ffff:ffff:ffff,NZ +2001:df2:3500::,2001:df2:3500:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:3600::,2001:df2:3600:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:3700::,2001:df2:3700:ffff:ffff:ffff:ffff:ffff,BD +2001:df2:3800::,2001:df2:3800:ffff:ffff:ffff:ffff:ffff,TH +2001:df2:3900::,2001:df2:3900:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:3a00::,2001:df2:3a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:3b00::,2001:df2:3b00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:3c00::,2001:df2:3c07:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:3d00::,2001:df2:3d00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:3e00::,2001:df2:3e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:3f00::,2001:df2:3f00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:4000::,2001:df2:4000:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:4100::,2001:df2:4100:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:4200::,2001:df2:4200:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:4300::,2001:df2:4300:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:4400::,2001:df2:4400:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:4500::,2001:df2:4500:ffff:ffff:ffff:ffff:ffff,MY +2001:df2:4600::,2001:df2:4600:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:4700::,2001:df2:4700:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:4900::,2001:df2:4900:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:4a00::,2001:df2:4a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:4b00::,2001:df2:4b00:ffff:ffff:ffff:ffff:ffff,FJ +2001:df2:4c00::,2001:df2:4c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:4e00::,2001:df2:4e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:4f00::,2001:df2:4f00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:5100::,2001:df2:5100:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:5200::,2001:df2:5200:ffff:ffff:ffff:ffff:ffff,CN +2001:df2:5300::,2001:df2:5300:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:5400::,2001:df2:5400:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:5500::,2001:df2:5500:ffff:ffff:ffff:ffff:ffff,NZ +2001:df2:5600::,2001:df2:5600:ffff:ffff:ffff:ffff:ffff,MY +2001:df2:5700::,2001:df2:5700:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:5800::,2001:df2:5800:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:5900::,2001:df2:5900:ffff:ffff:ffff:ffff:ffff,LK +2001:df2:5a00::,2001:df2:5a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:5b00::,2001:df2:5b00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:5c00::,2001:df2:5c00:ffff:ffff:ffff:ffff:ffff,TH +2001:df2:5d00::,2001:df2:5d00:ffff:ffff:ffff:ffff:ffff,MN +2001:df2:5e00::,2001:df2:5e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:5f00::,2001:df2:5f00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:6000::,2001:df2:6000:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:6100::,2001:df2:6100:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:6200::,2001:df2:6200:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:6300::,2001:df2:6300:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:6400::,2001:df2:6400:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:6500::,2001:df2:6500:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:6600::,2001:df2:6600:ffff:ffff:ffff:ffff:ffff,VN +2001:df2:6700::,2001:df2:6700:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:6800::,2001:df2:6800:ffff:ffff:ffff:ffff:ffff,PH +2001:df2:6900::,2001:df2:6900:ffff:ffff:ffff:ffff:ffff,VN +2001:df2:6a00::,2001:df2:6a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:6b00::,2001:df2:6b00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:6c00::,2001:df2:6c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:6d00::,2001:df2:6d00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df2:6e00::,2001:df2:6e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:6f00::,2001:df2:6f00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:7000::,2001:df2:7000:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:7100::,2001:df2:7100:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:7200::,2001:df2:7200:ffff:ffff:ffff:ffff:ffff,BD +2001:df2:7300::,2001:df2:7300:ffff:ffff:ffff:ffff:ffff,NZ +2001:df2:7400::,2001:df2:7400:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:7500::,2001:df2:7500:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:7600::,2001:df2:7600:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:7700::,2001:df2:7700:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:7800::,2001:df2:7800:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:7900::,2001:df2:7900:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:7a00::,2001:df2:7a00:ffff:ffff:ffff:ffff:ffff,PH +2001:df2:7b00::,2001:df2:7b00:ffff:ffff:ffff:ffff:ffff,VN +2001:df2:7c00::,2001:df2:7c00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df2:7d00::,2001:df2:7d00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:7e00::,2001:df2:7e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:7e01::,2001:df2:7e01:ffff:ffff:ffff:ffff:ffff,SG +2001:df2:7f00::,2001:df2:7f00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:8000::,2001:df2:8000:ffff:ffff:ffff:ffff:ffff,BN +2001:df2:8100::,2001:df2:8100:ffff:ffff:ffff:ffff:ffff,MY +2001:df2:8200::,2001:df2:8201:ffff:ffff:ffff:ffff:ffff,MY +2001:df2:8300::,2001:df2:8300:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:8400::,2001:df2:8401:ffff:ffff:ffff:ffff:ffff,NZ +2001:df2:8500::,2001:df2:8500:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:8600::,2001:df2:8600:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:8700::,2001:df2:8700:ffff:ffff:ffff:ffff:ffff,PK +2001:df2:8800::,2001:df2:8800:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:8900::,2001:df2:8900:ffff:ffff:ffff:ffff:ffff,BD +2001:df2:8a00::,2001:df2:8a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:8b00::,2001:df2:8b00:ffff:ffff:ffff:ffff:ffff,NP +2001:df2:8c00::,2001:df2:8c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:8d00::,2001:df2:8d00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:8e00::,2001:df2:8e00:ffff:ffff:ffff:ffff:ffff,MY +2001:df2:8f00::,2001:df2:8f00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df2:9100::,2001:df2:9100:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:9200::,2001:df2:9200:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:9300::,2001:df2:9300:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:9400::,2001:df2:9400:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:9500::,2001:df2:9500:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:9600::,2001:df2:9600:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:9700::,2001:df2:9700:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:9800::,2001:df2:9803:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:9900::,2001:df2:9900:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:9a00::,2001:df2:9a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:9b00::,2001:df2:9b00:ffff:ffff:ffff:ffff:ffff,VN +2001:df2:9c00::,2001:df2:9c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:9d00::,2001:df2:9d07:ffff:ffff:ffff:ffff:ffff,NZ +2001:df2:9e00::,2001:df2:9e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:9f00::,2001:df2:9f00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:a000::,2001:df2:a000:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:a100::,2001:df2:a100:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:a200::,2001:df2:a200:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:a300::,2001:df2:a300:ffff:ffff:ffff:ffff:ffff,US +2001:df2:a400::,2001:df2:a400:ffff:ffff:ffff:ffff:ffff,MY +2001:df2:a500::,2001:df2:a500:ffff:ffff:ffff:ffff:ffff,KH +2001:df2:a600::,2001:df2:a600:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:a700::,2001:df2:a700:ffff:ffff:ffff:ffff:ffff,VU +2001:df2:a800::,2001:df2:a800:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:a900::,2001:df2:a900:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:aa00::,2001:df2:aa00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:ab00::,2001:df2:ab00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:ac00::,2001:df2:ac01:ffff:ffff:ffff:ffff:ffff,TH +2001:df2:ad00::,2001:df2:ad00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:ae00::,2001:df2:ae00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:af00::,2001:df2:af00:ffff:ffff:ffff:ffff:ffff,JP +2001:df2:b000::,2001:df2:b000:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:b100::,2001:df2:b100:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:b200::,2001:df2:b200:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:b300::,2001:df2:b300:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:b400::,2001:df2:b400:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:b500::,2001:df2:b500:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:b600::,2001:df2:b600:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:b700::,2001:df2:b700:ffff:ffff:ffff:ffff:ffff,NP +2001:df2:b900::,2001:df2:b900:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:ba00::,2001:df2:ba00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:bb00::,2001:df2:bb00:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:bc00::,2001:df2:bc00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:bd00::,2001:df2:bd00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:be00::,2001:df2:be00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:bf00::,2001:df2:bf00:ffff:ffff:ffff:ffff:ffff,US +2001:df2:c000::,2001:df2:c000:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:c100::,2001:df2:c100:ffff:ffff:ffff:ffff:ffff,VN +2001:df2:c200::,2001:df2:c200:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:c300::,2001:df2:c300:ffff:ffff:ffff:ffff:ffff,JP +2001:df2:c400::,2001:df2:c400:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:c500::,2001:df2:c500:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:c600::,2001:df2:c600:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:c700::,2001:df2:c700:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:c800::,2001:df2:c800:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:c900::,2001:df2:c900:ffff:ffff:ffff:ffff:ffff,JP +2001:df2:ca00::,2001:df2:ca00:ffff:ffff:ffff:ffff:ffff,VN +2001:df2:cb00::,2001:df2:cb00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:cc00::,2001:df2:cc00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:cd00::,2001:df2:cd00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:ce00::,2001:df2:ce00:ffff:ffff:ffff:ffff:ffff,VN +2001:df2:cf00::,2001:df2:cf00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:d000::,2001:df2:d000:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:d100::,2001:df2:d100:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:d200::,2001:df2:d200:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:d300::,2001:df2:d300:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:d400::,2001:df2:d400:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:d500::,2001:df2:d500:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:d600::,2001:df2:d600:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:d700::,2001:df2:d700:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:d800::,2001:df2:d800:ffff:ffff:ffff:ffff:ffff,JP +2001:df2:d900::,2001:df2:d900:ffff:ffff:ffff:ffff:ffff,VN +2001:df2:da00::,2001:df2:da00:ffff:ffff:ffff:ffff:ffff,JP +2001:df2:db00::,2001:df2:db00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:dc00::,2001:df2:dc00:ffff:ffff:ffff:ffff:ffff,TH +2001:df2:dd00::,2001:df2:dd00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:de00::,2001:df2:de00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:df00::,2001:df2:df00:ffff:ffff:ffff:ffff:ffff,JP +2001:df2:e100::,2001:df2:e100:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:e200::,2001:df2:e200:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:e300::,2001:df2:e300:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:e400::,2001:df2:e400:ffff:ffff:ffff:ffff:ffff,PH +2001:df2:e500::,2001:df2:e500:ffff:ffff:ffff:ffff:ffff,US +2001:df2:e600::,2001:df2:e600:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:e700::,2001:df2:e700:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:e800::,2001:df2:e800:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:e900::,2001:df2:e900:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:ea00::,2001:df2:ea00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:eb00::,2001:df2:eb00:ffff:ffff:ffff:ffff:ffff,MY +2001:df2:ec00::,2001:df2:ec00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:ed00::,2001:df2:ed00:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:ee00::,2001:df2:ee01:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:ef00::,2001:df2:ef00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:f000::,2001:df2:f000:ffff:ffff:ffff:ffff:ffff,VN +2001:df2:f100::,2001:df2:f100:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:f200::,2001:df2:f200:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:f300::,2001:df2:f300:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:f400::,2001:df2:f400:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:f500::,2001:df2:f500:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:f600::,2001:df2:f600:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:f700::,2001:df2:f700:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:f800::,2001:df2:f800:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:f900::,2001:df2:f900:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:fa00::,2001:df2:fa00:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:fb00::,2001:df2:fb00:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:fc00::,2001:df2:fc00:ffff:ffff:ffff:ffff:ffff,JP +2001:df2:fd00::,2001:df2:fd00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df2:fe00::,2001:df2:fe00:ffff:ffff:ffff:ffff:ffff,US +2001:df2:ff00::,2001:df2:ff00:ffff:ffff:ffff:ffff:ffff,IN +2001:df3::,2001:df3::ffff:ffff:ffff:ffff:ffff,MY +2001:df3:100::,2001:df3:101:ffff:ffff:ffff:ffff:ffff,TH +2001:df3:200::,2001:df3:200:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:300::,2001:df3:300:ffff:ffff:ffff:ffff:ffff,MV +2001:df3:400::,2001:df3:400:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:500::,2001:df3:500:ffff:ffff:ffff:ffff:ffff,BD +2001:df3:600::,2001:df3:600:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:700::,2001:df3:700:ffff:ffff:ffff:ffff:ffff,PK +2001:df3:800::,2001:df3:80d:ffff:ffff:ffff:ffff:ffff,US +2001:df3:80e::,2001:df3:80e:7fff:ffff:ffff:ffff:ffff,IN +2001:df3:80e:8000::,2001:df3:81f:ffff:ffff:ffff:ffff:ffff,US +2001:df3:900::,2001:df3:900:ffff:ffff:ffff:ffff:ffff,VN +2001:df3:a00::,2001:df3:a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:b00::,2001:df3:b00:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:c00::,2001:df3:c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:d00::,2001:df3:d00:ffff:ffff:ffff:ffff:ffff,CH +2001:df3:e00::,2001:df3:e00:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:f00::,2001:df3:f00:ffff:ffff:ffff:ffff:ffff,MY +2001:df3:1000::,2001:df3:1000:ffff:ffff:ffff:ffff:ffff,BD +2001:df3:1100::,2001:df3:1100:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:1200::,2001:df3:1200:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:1300::,2001:df3:1300:ffff:ffff:ffff:ffff:ffff,MM +2001:df3:1400::,2001:df3:1400:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:1500::,2001:df3:1500:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:1600::,2001:df3:1600:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:1700::,2001:df3:1700:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:1800::,2001:df3:1800:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:1900::,2001:df3:1900:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:1b00::,2001:df3:1b00:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:1d00::,2001:df3:1d00:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:1e00::,2001:df3:1e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:1f00::,2001:df3:1f00:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:2000::,2001:df3:2000:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:2100::,2001:df3:2100:ffff:ffff:ffff:ffff:ffff,BD +2001:df3:2200::,2001:df3:2200:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:2300::,2001:df3:2300:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:2400::,2001:df3:2400:ffff:ffff:ffff:ffff:ffff,TH +2001:df3:2500::,2001:df3:2500:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:2600::,2001:df3:2600:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:2700::,2001:df3:2700:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:2800::,2001:df3:2800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:2900::,2001:df3:2900:ffff:ffff:ffff:ffff:ffff,TH +2001:df3:2a00::,2001:df3:2a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:2b00::,2001:df3:2b00:ffff:ffff:ffff:ffff:ffff,MY +2001:df3:2c00::,2001:df3:2c00:ffff:ffff:ffff:ffff:ffff,MY +2001:df3:2d00::,2001:df3:2d00:ffff:ffff:ffff:ffff:ffff,VN +2001:df3:2e00::,2001:df3:2e00:ffff:ffff:ffff:ffff:ffff,MY +2001:df3:2f00::,2001:df3:2f00:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:3000::,2001:df3:3000:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:3100::,2001:df3:3100:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:3200::,2001:df3:3200:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:3300::,2001:df3:3300:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:3400::,2001:df3:3400:ffff:ffff:ffff:ffff:ffff,BD +2001:df3:3500::,2001:df3:3500:ffff:ffff:ffff:ffff:ffff,SE +2001:df3:3600::,2001:df3:3601:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:3700::,2001:df3:3700:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:3800::,2001:df3:3800:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:3900::,2001:df3:3900:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:3a00::,2001:df3:3a00:ffff:ffff:ffff:ffff:ffff,PH +2001:df3:3b00::,2001:df3:3b00:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:3c00::,2001:df3:3c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:3d00::,2001:df3:3d00:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:3f00::,2001:df3:3f00:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:4000::,2001:df3:4000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:4100::,2001:df3:4100:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:4200::,2001:df3:4200:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:4300::,2001:df3:4300:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:4400::,2001:df3:4400:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:4500::,2001:df3:4500:ffff:ffff:ffff:ffff:ffff,PH +2001:df3:4600::,2001:df3:4600:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:4700::,2001:df3:4700:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:4800::,2001:df3:4800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:4900::,2001:df3:4900:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:4a00::,2001:df3:4a00:ffff:ffff:ffff:ffff:ffff,PH +2001:df3:4b00::,2001:df3:4b00:ffff:ffff:ffff:ffff:ffff,US +2001:df3:4c00::,2001:df3:4c00:ffff:ffff:ffff:ffff:ffff,PG +2001:df3:4d00::,2001:df3:4d00:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:4e00::,2001:df3:4e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:4f00::,2001:df3:4f00:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:5000::,2001:df3:5000:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:5100::,2001:df3:5100:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:5200::,2001:df3:5200:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:5300::,2001:df3:5300:ffff:ffff:ffff:ffff:ffff,NP +2001:df3:5400::,2001:df3:5400:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:5500::,2001:df3:5500:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:5600::,2001:df3:5600:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:5700::,2001:df3:5700:ffff:ffff:ffff:ffff:ffff,TH +2001:df3:5800::,2001:df3:5800:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:5900::,2001:df3:5900:ffff:ffff:ffff:ffff:ffff,KH +2001:df3:5a00::,2001:df3:5a00:ffff:ffff:ffff:ffff:ffff,MY +2001:df3:5b00::,2001:df3:5b00:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:5c00::,2001:df3:5c00:ffff:ffff:ffff:ffff:ffff,VN +2001:df3:5d00::,2001:df3:5d00:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:5e00::,2001:df3:5e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:5f00::,2001:df3:5f00:ffff:ffff:ffff:ffff:ffff,BD +2001:df3:6000::,2001:df3:6000:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:6100::,2001:df3:6100:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:6200::,2001:df3:6200:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:6400::,2001:df3:6400:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:6600::,2001:df3:6600:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:6800::,2001:df3:6800:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:6a00::,2001:df3:6a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:6c00::,2001:df3:6c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:6e00::,2001:df3:6e00:ffff:ffff:ffff:ffff:ffff,TW +2001:df3:7000::,2001:df3:7000:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:7200::,2001:df3:7200:ffff:ffff:ffff:ffff:ffff,PH +2001:df3:7400::,2001:df3:7400:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:7600::,2001:df3:7600:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:7800::,2001:df3:7800:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:7a00::,2001:df3:7a00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:7c00::,2001:df3:7c00:ffff:ffff:ffff:ffff:ffff,MY +2001:df3:7e00::,2001:df3:7e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:8000::,2001:df3:8000:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:8200::,2001:df3:8200:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:8400::,2001:df3:8400:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:8600::,2001:df3:8600:ffff:ffff:ffff:ffff:ffff,VN +2001:df3:8800::,2001:df3:8800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:8a00::,2001:df3:8a00:ffff:ffff:ffff:ffff:ffff,VN +2001:df3:8e00::,2001:df3:8e00:ffff:ffff:ffff:ffff:ffff,VN +2001:df3:9200::,2001:df3:9200:ffff:ffff:ffff:ffff:ffff,VN +2001:df3:9400::,2001:df3:9400:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:9600::,2001:df3:9600:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:9a00::,2001:df3:9a00:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:9c00::,2001:df3:9c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:9e00::,2001:df3:9e00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:a000::,2001:df3:a003:ffff:ffff:ffff:ffff:ffff,PH +2001:df3:a200::,2001:df3:a200:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:a400::,2001:df3:a400:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:a600::,2001:df3:a600:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:a800::,2001:df3:a800:ffff:ffff:ffff:ffff:ffff,MY +2001:df3:aa00::,2001:df3:aa00:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:ac00::,2001:df3:ac00:ffff:ffff:ffff:ffff:ffff,TH +2001:df3:ae00::,2001:df3:ae00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:b000::,2001:df3:b000:ffff:ffff:ffff:ffff:ffff,TH +2001:df3:b200::,2001:df3:b200:ffff:ffff:ffff:ffff:ffff,PK +2001:df3:b400::,2001:df3:b400:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:b600::,2001:df3:b600:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:b800::,2001:df3:b800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:ba00::,2001:df3:ba00:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:bc00::,2001:df3:bc00:ffff:ffff:ffff:ffff:ffff,JP +2001:df3:be00::,2001:df3:be00:ffff:ffff:ffff:ffff:ffff,BD +2001:df3:c000::,2001:df3:c000:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:c200::,2001:df3:c200:ffff:ffff:ffff:ffff:ffff,TH +2001:df3:c400::,2001:df3:c400:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:c600::,2001:df3:c600:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:c800::,2001:df3:c800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:ca00::,2001:df3:ca00:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:cc00::,2001:df3:cc00:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:ce00::,2001:df3:ce00:ffff:ffff:ffff:ffff:ffff,MM +2001:df3:d000::,2001:df3:d000:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:d200::,2001:df3:d200:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:d400::,2001:df3:d400:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:d600::,2001:df3:d600:ffff:ffff:ffff:ffff:ffff,AF +2001:df3:da00::,2001:df3:da00:ffff:ffff:ffff:ffff:ffff,US +2001:df3:dc00::,2001:df3:dc00:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:de00::,2001:df3:de00:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:e000::,2001:df3:e000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:e200::,2001:df3:e200:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:e400::,2001:df3:e400:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:e600::,2001:df3:e600:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:e800::,2001:df3:e800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:ea00::,2001:df3:ea00:ffff:ffff:ffff:ffff:ffff,MV +2001:df3:ee00::,2001:df3:ee00:ffff:ffff:ffff:ffff:ffff,TH +2001:df3:f000::,2001:df3:f000:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:f200::,2001:df3:f200:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:f400::,2001:df3:f400:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:f600::,2001:df3:f600:ffff:ffff:ffff:ffff:ffff,VN +2001:df3:f800::,2001:df3:f800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:fa00::,2001:df3:fa00:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:fc00::,2001:df3:fc00:ffff:ffff:ffff:ffff:ffff,HK +2001:df3:fe00::,2001:df3:fe00:ffff:ffff:ffff:ffff:ffff,ID +2001:df4::,2001:df4::ffff:ffff:ffff:ffff:ffff,MY +2001:df4:200::,2001:df4:200:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:400::,2001:df4:400:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:600::,2001:df4:600:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:800::,2001:df4:800:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:a00::,2001:df4:a00:ffff:ffff:ffff:ffff:ffff,NP +2001:df4:c00::,2001:df4:c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:e00::,2001:df4:e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:1000::,2001:df4:1000:ffff:ffff:ffff:ffff:ffff,HK +2001:df4:1200::,2001:df4:1200:ffff:ffff:ffff:ffff:ffff,HK +2001:df4:1400::,2001:df4:1400:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:1600::,2001:df4:1600:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:1800::,2001:df4:1800:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:1a00::,2001:df4:1a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:1c00::,2001:df4:1c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:1e00::,2001:df4:1e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:2000::,2001:df4:2000:ffff:ffff:ffff:ffff:ffff,TH +2001:df4:2200::,2001:df4:2200:ffff:ffff:ffff:ffff:ffff,MY +2001:df4:2400::,2001:df4:2400:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:2600::,2001:df4:2600:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:2800::,2001:df4:2800:ffff:ffff:ffff:ffff:ffff,HK +2001:df4:2a00::,2001:df4:2a00:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:2c00::,2001:df4:2c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:2e00::,2001:df4:2e00:ffff:ffff:ffff:ffff:ffff,BD +2001:df4:3000::,2001:df4:3000:ffff:ffff:ffff:ffff:ffff,TH +2001:df4:3200::,2001:df4:3200:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:3400::,2001:df4:3400:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:3600::,2001:df4:3600:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:3800::,2001:df4:3800:ffff:ffff:ffff:ffff:ffff,BD +2001:df4:3a00::,2001:df4:3a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:3c00::,2001:df4:3c00:ffff:ffff:ffff:ffff:ffff,BD +2001:df4:3e00::,2001:df4:3e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:4000::,2001:df4:400f:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:4200::,2001:df4:4200:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:4400::,2001:df4:4400:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:4600::,2001:df4:4600:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:4c00::,2001:df4:4c00:ffff:ffff:ffff:ffff:ffff,MY +2001:df4:4e00::,2001:df4:4e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:5000::,2001:df4:5000:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:5200::,2001:df4:5200:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:5400::,2001:df4:5400:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:5600::,2001:df4:5600:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:5800::,2001:df4:5800:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:5a00::,2001:df4:5a00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df4:5c00::,2001:df4:5c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:5e00::,2001:df4:5e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:6000::,2001:df4:6000:ffff:ffff:ffff:ffff:ffff,MY +2001:df4:6200::,2001:df4:6200:ffff:ffff:ffff:ffff:ffff,PK +2001:df4:6400::,2001:df4:6400:ffff:ffff:ffff:ffff:ffff,LA +2001:df4:6600::,2001:df4:6600:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:6800::,2001:df4:6800:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:6a00::,2001:df4:6a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:6c00::,2001:df4:6c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:6e00::,2001:df4:6e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:7000::,2001:df4:7000:ffff:ffff:ffff:ffff:ffff,HK +2001:df4:7200::,2001:df4:7200:ffff:ffff:ffff:ffff:ffff,JP +2001:df4:7400::,2001:df4:7400:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:7600::,2001:df4:7600:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:7a00::,2001:df4:7a00:ffff:ffff:ffff:ffff:ffff,HK +2001:df4:7c00::,2001:df4:7c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:7e00::,2001:df4:7e00:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:8000::,2001:df4:8000:ffff:ffff:ffff:ffff:ffff,MY +2001:df4:8200::,2001:df4:8200:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:8400::,2001:df4:8400:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:8600::,2001:df4:8600:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:8a00::,2001:df4:8a00:ffff:ffff:ffff:ffff:ffff,TW +2001:df4:8c00::,2001:df4:8c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df4:8e00::,2001:df4:8e00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df4:9000::,2001:df4:9000:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:9200::,2001:df4:9200:ffff:ffff:ffff:ffff:ffff,NZ +2001:df4:9600::,2001:df4:9600:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:9800::,2001:df4:9800:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:9a00::,2001:df4:9a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:9c00::,2001:df4:9c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:9e00::,2001:df4:9e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:a000::,2001:df4:a000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df4:a200::,2001:df4:a200:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:a400::,2001:df4:a400:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:a600::,2001:df4:a600:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:a800::,2001:df4:a800:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:aa00::,2001:df4:aa00:ffff:ffff:ffff:ffff:ffff,PK +2001:df4:ac00::,2001:df4:ac00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:ae00::,2001:df4:ae00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:b000::,2001:df4:b000:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:b200::,2001:df4:b200:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:b400::,2001:df4:b400:ffff:ffff:ffff:ffff:ffff,JP +2001:df4:b600::,2001:df4:b600:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:ba00::,2001:df4:ba01:ffff:ffff:ffff:ffff:ffff,PH +2001:df4:bc00::,2001:df4:bc00:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:be00::,2001:df4:be00:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:c000::,2001:df4:c000:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:c200::,2001:df4:c200:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:c400::,2001:df4:c400:ffff:ffff:ffff:ffff:ffff,VN +2001:df4:c600::,2001:df4:c600:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:c800::,2001:df4:c800:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:ca00::,2001:df4:ca00:ffff:ffff:ffff:ffff:ffff,NP +2001:df4:cc00::,2001:df4:cc00:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:ce00::,2001:df4:ce00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:d000::,2001:df4:d000:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:d200::,2001:df4:d200:ffff:ffff:ffff:ffff:ffff,VN +2001:df4:d400::,2001:df4:d400:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:d600::,2001:df4:d600:ffff:ffff:ffff:ffff:ffff,VN +2001:df4:d800::,2001:df4:d800:ffff:ffff:ffff:ffff:ffff,VN +2001:df4:da00::,2001:df4:da00:ffff:ffff:ffff:ffff:ffff,VN +2001:df4:de00::,2001:df4:de00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:e000::,2001:df4:e000:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:e200::,2001:df4:e200:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:e400::,2001:df4:e400:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:e600::,2001:df4:e600:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:e800::,2001:df4:e800:ffff:ffff:ffff:ffff:ffff,MN +2001:df4:ea00::,2001:df4:ea00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:ec00::,2001:df4:ec00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:ee00::,2001:df4:ee00:ffff:ffff:ffff:ffff:ffff,HK +2001:df4:f000::,2001:df4:f000:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:f200::,2001:df4:f200:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:f400::,2001:df4:f400:ffff:ffff:ffff:ffff:ffff,BD +2001:df4:f600::,2001:df4:f600:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:f800::,2001:df4:f800:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:fa00::,2001:df4:fa00:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:fc00::,2001:df4:fc00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df4:fe00::,2001:df4:fe00:ffff:ffff:ffff:ffff:ffff,AU +2001:df5::,2001:df5::ffff:ffff:ffff:ffff:ffff,AU +2001:df5:200::,2001:df5:200:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:400::,2001:df5:400:ffff:ffff:ffff:ffff:ffff,HK +2001:df5:600::,2001:df5:600:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:800::,2001:df5:800:ffff:ffff:ffff:ffff:ffff,HK +2001:df5:c00::,2001:df5:c00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:e00::,2001:df5:e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:1000::,2001:df5:1000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:1200::,2001:df5:1200:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:1400::,2001:df5:1400:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:1600::,2001:df5:1600:ffff:ffff:ffff:ffff:ffff,SG +2001:df5:1a00::,2001:df5:1a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:1c00::,2001:df5:1c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:1e00::,2001:df5:1e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:2000::,2001:df5:2000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:2200::,2001:df5:2200:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:2400::,2001:df5:2400:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:2600::,2001:df5:2600:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:2800::,2001:df5:2800:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:2c00::,2001:df5:2c00:ffff:ffff:ffff:ffff:ffff,JP +2001:df5:2e00::,2001:df5:2e00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:3000::,2001:df5:3000:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:3200::,2001:df5:3200:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:3400::,2001:df5:3400:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:3600::,2001:df5:3600:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:3800::,2001:df5:3800:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:3a00::,2001:df5:3a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:3c00::,2001:df5:3c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:3e00::,2001:df5:3e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:4000::,2001:df5:4000:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:4200::,2001:df5:4200:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:4400::,2001:df5:4400:ffff:ffff:ffff:ffff:ffff,PH +2001:df5:4600::,2001:df5:4600:ffff:ffff:ffff:ffff:ffff,SG +2001:df5:4800::,2001:df5:4800:ffff:ffff:ffff:ffff:ffff,BN +2001:df5:4a00::,2001:df5:4a00:ffff:ffff:ffff:ffff:ffff,VN +2001:df5:4c00::,2001:df5:4c01:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:4e00::,2001:df5:4e00:ffff:ffff:ffff:ffff:ffff,MY +2001:df5:5200::,2001:df5:5200:ffff:ffff:ffff:ffff:ffff,HK +2001:df5:5600::,2001:df5:5600:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:5800::,2001:df5:5800:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:5a00::,2001:df5:5a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:5e00::,2001:df5:5e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:6000::,2001:df5:6000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:6200::,2001:df5:6200:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:6400::,2001:df5:6400:ffff:ffff:ffff:ffff:ffff,JP +2001:df5:6600::,2001:df5:6600:ffff:ffff:ffff:ffff:ffff,BD +2001:df5:6800::,2001:df5:6800:ffff:ffff:ffff:ffff:ffff,KR +2001:df5:6a00::,2001:df5:6a00:ffff:ffff:ffff:ffff:ffff,MV +2001:df5:6c00::,2001:df5:6c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:6e00::,2001:df5:6e00:ffff:ffff:ffff:ffff:ffff,NC +2001:df5:7000::,2001:df5:7000:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:7200::,2001:df5:7200:ffff:ffff:ffff:ffff:ffff,BD +2001:df5:7400::,2001:df5:7400:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:7600::,2001:df5:7600:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:7800::,2001:df5:7800:ffff:ffff:ffff:ffff:ffff,CN +2001:df5:7a00::,2001:df5:7a00:ffff:ffff:ffff:ffff:ffff,SG +2001:df5:7c00::,2001:df5:7c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:7e00::,2001:df5:7e00:ffff:ffff:ffff:ffff:ffff,BD +2001:df5:8000::,2001:df5:8000:ffff:ffff:ffff:ffff:ffff,SG +2001:df5:8200::,2001:df5:8200:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:8400::,2001:df5:8400:ffff:ffff:ffff:ffff:ffff,SG +2001:df5:8600::,2001:df5:8600:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:8800::,2001:df5:8800:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:8a00::,2001:df5:8a00:ffff:ffff:ffff:ffff:ffff,VN +2001:df5:8c00::,2001:df5:8c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:8e00::,2001:df5:8e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:9000::,2001:df5:9000:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:9200::,2001:df5:9200:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:9600::,2001:df5:9600:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:9800::,2001:df5:9800:ffff:ffff:ffff:ffff:ffff,SG +2001:df5:9a00::,2001:df5:9a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:9c00::,2001:df5:9c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:9e00::,2001:df5:9e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:a000::,2001:df5:a000:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:a200::,2001:df5:a200:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:a400::,2001:df5:a400:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:a600::,2001:df5:a600:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:a800::,2001:df5:a800:ffff:ffff:ffff:ffff:ffff,NL +2001:df5:aa00::,2001:df5:aa00:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:ac00::,2001:df5:ac00:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:ae00::,2001:df5:ae00:ffff:ffff:ffff:ffff:ffff,PH +2001:df5:b000::,2001:df5:b000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:b200::,2001:df5:b200:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:b400::,2001:df5:b400:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:b600::,2001:df5:b600:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:b800::,2001:df5:b800:ffff:ffff:ffff:ffff:ffff,HK +2001:df5:ba00::,2001:df5:ba00:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:bc00::,2001:df5:bc00:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:be00::,2001:df5:be00:ffff:ffff:ffff:ffff:ffff,VN +2001:df5:c200::,2001:df5:c200:ffff:ffff:ffff:ffff:ffff,VN +2001:df5:c400::,2001:df5:c400:ffff:ffff:ffff:ffff:ffff,TH +2001:df5:c800::,2001:df5:c800:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:ca00::,2001:df5:ca00:ffff:ffff:ffff:ffff:ffff,TH +2001:df5:cc00::,2001:df5:cc00:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:ce00::,2001:df5:ce00:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:d000::,2001:df5:d000:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:d200::,2001:df5:d200:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:d400::,2001:df5:d400:ffff:ffff:ffff:ffff:ffff,HK +2001:df5:d401::,2001:df5:d401:ffff:ffff:ffff:ffff:ffff,JP +2001:df5:d600::,2001:df5:d600:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:d800::,2001:df5:d800:ffff:ffff:ffff:ffff:ffff,SG +2001:df5:da00::,2001:df5:da00:ffff:ffff:ffff:ffff:ffff,PH +2001:df5:de00::,2001:df5:de00:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:e000::,2001:df5:e000:ffff:ffff:ffff:ffff:ffff,MY +2001:df5:e200::,2001:df5:e200:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:e600::,2001:df5:e600:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:e800::,2001:df5:e800:ffff:ffff:ffff:ffff:ffff,PH +2001:df5:ea00::,2001:df5:ea00:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:ec00::,2001:df5:ec00:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:ee00::,2001:df5:ee00:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:f000::,2001:df5:f000:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:f200::,2001:df5:f200:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:f400::,2001:df5:f401:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:f600::,2001:df5:f600:ffff:ffff:ffff:ffff:ffff,PH +2001:df5:f800::,2001:df5:f800:ffff:ffff:ffff:ffff:ffff,SE +2001:df5:fa00::,2001:df5:fa00:ffff:ffff:ffff:ffff:ffff,FJ +2001:df5:fc00::,2001:df5:fc00:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:fe00::,2001:df5:fe00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6::,2001:df6:3:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:200::,2001:df6:200:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:400::,2001:df6:400:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:600::,2001:df6:600:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:800::,2001:df6:80f:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:a00::,2001:df6:a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:e00::,2001:df6:e00:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:1000::,2001:df6:1000:ffff:ffff:ffff:ffff:ffff,PH +2001:df6:1200::,2001:df6:1200:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:1400::,2001:df6:1400:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:1600::,2001:df6:1600:ffff:ffff:ffff:ffff:ffff,VN +2001:df6:1800::,2001:df6:1800:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:1a00::,2001:df6:1a00:ffff:ffff:ffff:ffff:ffff,VN +2001:df6:1c00::,2001:df6:1c00:ffff:ffff:ffff:ffff:ffff,CN +2001:df6:1e00::,2001:df6:1e00:ffff:ffff:ffff:ffff:ffff,VN +2001:df6:2000::,2001:df6:2001:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:2200::,2001:df6:2200:ffff:ffff:ffff:ffff:ffff,VN +2001:df6:2400::,2001:df6:2400:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:2600::,2001:df6:2600:ffff:ffff:ffff:ffff:ffff,US +2001:df6:2800::,2001:df6:2800:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:2a00::,2001:df6:2a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:2c00::,2001:df6:2c00:ffff:ffff:ffff:ffff:ffff,VN +2001:df6:2e00::,2001:df6:2e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:3000::,2001:df6:3000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df6:3200::,2001:df6:3200:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:3400::,2001:df6:3400:ffff:ffff:ffff:ffff:ffff,VN +2001:df6:3600::,2001:df6:3600:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:3800::,2001:df6:3800:ffff:ffff:ffff:ffff:ffff,NZ +2001:df6:3a00::,2001:df6:3a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:3c00::,2001:df6:3c00:ffff:ffff:ffff:ffff:ffff,PK +2001:df6:3e00::,2001:df6:3e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:4000::,2001:df6:4001:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:4200::,2001:df6:4200:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:4400::,2001:df6:4400:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:4600::,2001:df6:4600:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:4800::,2001:df6:4801:ffff:ffff:ffff:ffff:ffff,NZ +2001:df6:4c00::,2001:df6:4c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:4e00::,2001:df6:4e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:5000::,2001:df6:5000:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:5200::,2001:df6:5200:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:5600::,2001:df6:5600:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:5800::,2001:df6:5800:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:5a00::,2001:df6:5a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:5c00::,2001:df6:5c00:ffff:ffff:ffff:ffff:ffff,TH +2001:df6:5e00::,2001:df6:5e01:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:6000::,2001:df6:6000:ffff:ffff:ffff:ffff:ffff,JP +2001:df6:6200::,2001:df6:6200:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:6400::,2001:df6:6400:ffff:ffff:ffff:ffff:ffff,SG +2001:df6:6600::,2001:df6:6600:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:6800::,2001:df6:6800:ffff:ffff:ffff:ffff:ffff,CN +2001:df6:6a00::,2001:df6:6a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:6c00::,2001:df6:6c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:6e00::,2001:df6:6e00:ffff:ffff:ffff:ffff:ffff,MY +2001:df6:7000::,2001:df6:7000:ffff:ffff:ffff:ffff:ffff,VN +2001:df6:7200::,2001:df6:7200:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:7400::,2001:df6:7400:ffff:ffff:ffff:ffff:ffff,TH +2001:df6:7600::,2001:df6:7600:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:7800::,2001:df6:7800:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:7a00::,2001:df6:7a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:7c00::,2001:df6:7c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:8000::,2001:df6:8000:ffff:ffff:ffff:ffff:ffff,JP +2001:df6:8200::,2001:df6:8200:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:8400::,2001:df6:8400:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:8600::,2001:df6:8600:ffff:ffff:ffff:ffff:ffff,NZ +2001:df6:8800::,2001:df6:8800:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:8a00::,2001:df6:8a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:8e00::,2001:df6:8e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:9000::,2001:df6:9000:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:9200::,2001:df6:9200:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:9400::,2001:df6:9400:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:9600::,2001:df6:9600:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:9800::,2001:df6:9800:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:9a00::,2001:df6:9a00:ffff:ffff:ffff:ffff:ffff,TH +2001:df6:9c00::,2001:df6:9c00:ffff:ffff:ffff:ffff:ffff,TH +2001:df6:9e00::,2001:df6:9e01:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:a000::,2001:df6:a000:ffff:ffff:ffff:ffff:ffff,JP +2001:df6:a200::,2001:df6:a200:ffff:ffff:ffff:ffff:ffff,BD +2001:df6:a400::,2001:df6:a400:ffff:ffff:ffff:ffff:ffff,SG +2001:df6:a600::,2001:df6:a600:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:a800::,2001:df6:a800:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:aa00::,2001:df6:aa00:ffff:ffff:ffff:ffff:ffff,VN +2001:df6:ac00::,2001:df6:ac00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:ae00::,2001:df6:ae00:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:b000::,2001:df6:b000:ffff:ffff:ffff:ffff:ffff,TH +2001:df6:b200::,2001:df6:b200:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:b400::,2001:df6:b400:ffff:ffff:ffff:ffff:ffff,MY +2001:df6:b600::,2001:df6:b600:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:b800::,2001:df6:b800:ffff:ffff:ffff:ffff:ffff,SG +2001:df6:bc00::,2001:df6:bc00:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:be00::,2001:df6:be00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df6:c200::,2001:df6:c200:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:c400::,2001:df6:c400:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:c600::,2001:df6:c600:ffff:ffff:ffff:ffff:ffff,BD +2001:df6:c800::,2001:df6:c801:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:ca00::,2001:df6:ca00:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:cc00::,2001:df6:cc00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:ce00::,2001:df6:ce00:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:d000::,2001:df6:d000:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:d200::,2001:df6:d200:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:d400::,2001:df6:d400:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:d600::,2001:df6:d600:ffff:ffff:ffff:ffff:ffff,BD +2001:df6:d800::,2001:df6:d800:ffff:ffff:ffff:ffff:ffff,BD +2001:df6:da00::,2001:df6:da00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:dc00::,2001:df6:dc00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:de00::,2001:df6:de00:ffff:ffff:ffff:ffff:ffff,BD +2001:df6:e200::,2001:df6:e200:ffff:ffff:ffff:ffff:ffff,NZ +2001:df6:e400::,2001:df6:e400:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:e600::,2001:df6:e600:ffff:ffff:ffff:ffff:ffff,ES +2001:df6:e800::,2001:df6:e800:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:ea00::,2001:df6:ea00:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:ec00::,2001:df6:ec00:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:ee00::,2001:df6:ee00:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:f000::,2001:df6:f000:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:f200::,2001:df6:f200:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:f400::,2001:df6:f400:ffff:ffff:ffff:ffff:ffff,CN +2001:df6:f600::,2001:df6:f600:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:f800::,2001:df6:f800:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:fa00::,2001:df6:fa00:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:fc00::,2001:df6:fc00:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:fe00::,2001:df6:fe00:ffff:ffff:ffff:ffff:ffff,AU +2001:df7::,2001:df7::ffff:ffff:ffff:ffff:ffff,IN +2001:df7:200::,2001:df7:203:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:400::,2001:df7:400:ffff:ffff:ffff:ffff:ffff,HK +2001:df7:600::,2001:df7:600:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:800::,2001:df7:800:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:a00::,2001:df7:a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:c00::,2001:df7:c00:ffff:ffff:ffff:ffff:ffff,TW +2001:df7:e00::,2001:df7:e00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df7:1000::,2001:df7:1000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:1200::,2001:df7:1200:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:1400::,2001:df7:1400:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:1a00::,2001:df7:1a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:1c00::,2001:df7:1c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:2000::,2001:df7:2000:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:2200::,2001:df7:2200:ffff:ffff:ffff:ffff:ffff,TH +2001:df7:2400::,2001:df7:2400:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:2600::,2001:df7:2600:ffff:ffff:ffff:ffff:ffff,HK +2001:df7:2800::,2001:df7:2800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:2a00::,2001:df7:2a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:2c00::,2001:df7:2c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:2e00::,2001:df7:2e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:3000::,2001:df7:3001:ffff:ffff:ffff:ffff:ffff,NZ +2001:df7:3200::,2001:df7:3200:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:3400::,2001:df7:3400:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:3600::,2001:df7:3600:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:3800::,2001:df7:3800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:3c00::,2001:df7:3c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:3e00::,2001:df7:3e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:4000::,2001:df7:4000:ffff:ffff:ffff:ffff:ffff,SG +2001:df7:4200::,2001:df7:4200:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:4400::,2001:df7:4400:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:4600::,2001:df7:4600:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:4800::,2001:df7:481f:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:4a00::,2001:df7:4a00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:4c00::,2001:df7:4c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:4e00::,2001:df7:4e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:5000::,2001:df7:5000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:5200::,2001:df7:5200:ffff:ffff:ffff:ffff:ffff,NP +2001:df7:5400::,2001:df7:5400:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:5600::,2001:df7:5600:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:5a00::,2001:df7:5a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:5e00::,2001:df7:5e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:6000::,2001:df7:6000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:6200::,2001:df7:6200:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:6400::,2001:df7:6400:ffff:ffff:ffff:ffff:ffff,MY +2001:df7:6600::,2001:df7:6600:ffff:ffff:ffff:ffff:ffff,CN +2001:df7:6800::,2001:df7:6800:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:6a00::,2001:df7:6a00:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:6c00::,2001:df7:6c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:6e00::,2001:df7:6e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:7000::,2001:df7:7000:ffff:ffff:ffff:ffff:ffff,HK +2001:df7:7200::,2001:df7:7200:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:7400::,2001:df7:7400:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:7600::,2001:df7:7600:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:7800::,2001:df7:7800:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:7a00::,2001:df7:7a00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:7c00::,2001:df7:7c00:ffff:ffff:ffff:ffff:ffff,TH +2001:df7:7e00::,2001:df7:7e00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:8200::,2001:df7:8200:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:8400::,2001:df7:8401:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:8600::,2001:df7:8600:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:8800::,2001:df7:8800:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:8a00::,2001:df7:8a00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:8e00::,2001:df7:8e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:9200::,2001:df7:921f:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:9400::,2001:df7:9400:ffff:ffff:ffff:ffff:ffff,US +2001:df7:9600::,2001:df7:9600:ffff:ffff:ffff:ffff:ffff,HK +2001:df7:9800::,2001:df7:9800:ffff:ffff:ffff:ffff:ffff,NZ +2001:df7:9a00::,2001:df7:9a00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:9c00::,2001:df7:9c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:9e00::,2001:df7:9e00:ffff:ffff:ffff:ffff:ffff,SG +2001:df7:a000::,2001:df7:a000:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:a200::,2001:df7:a200:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:a400::,2001:df7:a400:ffff:ffff:ffff:ffff:ffff,SG +2001:df7:a401::,2001:df7:a401:7fff:ffff:ffff:ffff:ffff,TH +2001:df7:a401:8000::,2001:df7:a401:ffff:ffff:ffff:ffff:ffff,SG +2001:df7:a600::,2001:df7:a600:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:a800::,2001:df7:a800:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:aa00::,2001:df7:aa00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:ac00::,2001:df7:ac00:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:ae00::,2001:df7:ae00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df7:b000::,2001:df7:b000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:b200::,2001:df7:b200:ffff:ffff:ffff:ffff:ffff,PG +2001:df7:b400::,2001:df7:b400:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:b600::,2001:df7:b600:ffff:ffff:ffff:ffff:ffff,HK +2001:df7:b800::,2001:df7:b800:ffff:ffff:ffff:ffff:ffff,SG +2001:df7:ba00::,2001:df7:ba00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:bc00::,2001:df7:bc00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:be00::,2001:df7:be00:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:c000::,2001:df7:c003:ffff:ffff:ffff:ffff:ffff,SG +2001:df7:c200::,2001:df7:c200:ffff:ffff:ffff:ffff:ffff,MM +2001:df7:c400::,2001:df7:c400:ffff:ffff:ffff:ffff:ffff,NZ +2001:df7:c600::,2001:df7:c600:ffff:ffff:ffff:ffff:ffff,VN +2001:df7:c800::,2001:df7:c800:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:ca00::,2001:df7:ca00:ffff:ffff:ffff:ffff:ffff,VN +2001:df7:cc00::,2001:df7:cc00:ffff:ffff:ffff:ffff:ffff,VN +2001:df7:ce00::,2001:df7:ce00:ffff:ffff:ffff:ffff:ffff,VN +2001:df7:d000::,2001:df7:d000:ffff:ffff:ffff:ffff:ffff,BD +2001:df7:d200::,2001:df7:d200:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:d400::,2001:df7:d400:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:d600::,2001:df7:d600:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:d800::,2001:df7:d800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:da00::,2001:df7:da00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:dc00::,2001:df7:dc00:ffff:ffff:ffff:ffff:ffff,TH +2001:df7:de00::,2001:df7:de03:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:e000::,2001:df7:e000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:e200::,2001:df7:e200:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:e400::,2001:df7:e400:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:e600::,2001:df7:e600:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:e800::,2001:df7:e800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:ea00::,2001:df7:ea00:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:ec00::,2001:df7:ec00:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:ee00::,2001:df7:ee00:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:f000::,2001:df7:f000:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:f200::,2001:df7:f200:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:f400::,2001:df7:f400:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:f600::,2001:df7:f600:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:f800::,2001:df7:f800:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:fa00::,2001:df7:fa00:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:fc00::,2001:df7:fc00:ffff:ffff:ffff:ffff:ffff,SG +2001:df7:fe00::,2001:df7:fe00:ffff:ffff:ffff:ffff:ffff,ID +2001:df8::,2001:df8:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:df9::,2001:df9:ffff:ffff:ffff:ffff:ffff:ffff,NP +2001:dfa::,2001:dfa:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:e00::,2001:e01:ffff:ffff:ffff:ffff:ffff:ffff,ID +2001:e08::,2001:e08:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:e10::,2001:e10:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:e18::,2001:e18:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:e20::,2001:e20:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2001:e28::,2001:e28:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:e30::,2001:e30:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:e38::,2001:e38:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:e40::,2001:e47:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:e48::,2001:e48:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:e58::,2001:e58:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:e60::,2001:e60:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:e68::,2001:e68:ffff:ffff:ffff:ffff:ffff:ffff,MY +2001:e70::,2001:e70:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:e78::,2001:e78:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:e80::,2001:e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:e88::,2001:e88:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:e90::,2001:e90:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:e98::,2001:e98:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:ea0::,2001:ea0:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:ea8::,2001:ea8:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:eb0::,2001:eb0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2001:eb8::,2001:eb8:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:ec0::,2001:ec0:ffff:ffff:ffff:ffff:ffff:ffff,TH +2001:ed0::,2001:ed0:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:ed8::,2001:ed8:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:ee0::,2001:ee0:ffff:ffff:ffff:ffff:ffff:ffff,VN +2001:ee8::,2001:ee8:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:ef0::,2001:ef0:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:ef8::,2001:ef8:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:f00::,2001:f00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2001:f08::,2001:f08:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:f10::,2001:f10:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:f18::,2001:f18:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:f20::,2001:f20:ffff:ffff:ffff:ffff:ffff:ffff,ID +2001:f28::,2001:f28:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:f30::,2001:f30:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:f38::,2001:f38:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:f40::,2001:f40:ffff:ffff:ffff:ffff:ffff:ffff,MY +2001:f48::,2001:f48:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:f50::,2001:f50:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2001:f58::,2001:f58:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:f60::,2001:f6f:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:f80::,2001:f80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:f88::,2001:f88:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:f90::,2001:f90:ffff:ffff:ffff:ffff:ffff:ffff,MO +2001:f98::,2001:f98:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:fa0::,2001:fa0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:fa8::,2001:fa8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:fb0::,2001:fb1:ffff:ffff:ffff:ffff:ffff:ffff,TH +2001:fc0::,2001:fc0:ffff:ffff:ffff:ffff:ffff:ffff,SG +2001:fc8::,2001:fc8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:fd0::,2001:fd0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:fd8::,2001:fd8:ffff:ffff:ffff:ffff:ffff:ffff,PH +2001:fe0::,2001:fe0:ffff:ffff:ffff:ffff:ffff:ffff,PH +2001:fe8::,2001:fe8:ffff:ffff:ffff:ffff:ffff:ffff,PK +2001:ff0::,2001:ff0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:ff8::,2001:ff8:ffff:ffff:ffff:ffff:ffff:ffff,MO +2001:1200::,2001:1200:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1208::,2001:1208:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1210::,2001:1210:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1218::,2001:1218:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1220::,2001:1221::ffff:ffff:ffff:ffff:ffff,MX +2001:1228::,2001:1228:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:122c::,2001:122c:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1230::,2001:1230:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1238::,2001:1238:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1240::,2001:1240:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1248::,2001:1248:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1250::,2001:1250:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1258::,2001:1258:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1260::,2001:1260:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1270::,2001:1270:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1278::,2001:1278:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:1280::,2001:1280:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:1284::,2001:1284:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:1288::,2001:1288:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:128c::,2001:128c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:1290::,2001:1291:200:88fc:ffff:ffff:ffff:ffff,BR +2001:1291:200:88fd::,2001:1291:200:88fd:ffff:ffff:ffff:ffff,AR +2001:1291:200:88fe::,2001:1291:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:1294::,2001:1294:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:1298::,2001:1298:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:129c::,2001:129c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12a0::,2001:12a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12a4::,2001:12a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12ac::,2001:12ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12b0::,2001:12b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12b4::,2001:12b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12b8::,2001:12b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12bc::,2001:12bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12c0::,2001:12c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12c4::,2001:12c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12c8::,2001:12c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12d0::,2001:12d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12d8::,2001:12d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12e0::,2001:12e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12e8::,2001:12e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12f0::,2001:12f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:12f8::,2001:12f8::ffff:ffff:ffff:ffff:ffff,BR +2001:12f8:2::,2001:12f8:d:ffff:ffff:ffff:ffff:ffff,BR +2001:12fe::,2001:12ff:ffff:ffff:ffff:ffff:ffff:ffff,BR +2001:1300::,2001:1300:ffff:ffff:ffff:ffff:ffff:ffff,PE +2001:1308::,2001:1308:ffff:ffff:ffff:ffff:ffff:ffff,DO +2001:1310::,2001:1310:ffff:ffff:ffff:ffff:ffff:ffff,CL +2001:1318::,2001:1318:ffff:ffff:ffff:ffff:ffff:ffff,AR +2001:1320::,2001:1320:ffff:ffff:ffff:ffff:ffff:ffff,PY +2001:1328::,2001:1328:ffff:ffff:ffff:ffff:ffff:ffff,UY +2001:1330::,2001:1337:ffff:ffff:ffff:ffff:ffff:ffff,CR +2001:1338::,2001:1338:ffff:ffff:ffff:ffff:ffff:ffff,VE +2001:1340::,2001:1340:ffff:ffff:ffff:ffff:ffff:ffff,CU +2001:1348::,2001:1348:ffff:ffff:ffff:ffff:ffff:ffff,UY +2001:1350::,2001:1350:ffff:ffff:ffff:ffff:ffff:ffff,VE +2001:1358::,2001:1358:ffff:ffff:ffff:ffff:ffff:ffff,CU +2001:1360::,2001:1360:ffff:ffff:ffff:ffff:ffff:ffff,GT +2001:1368::,2001:1368:ffff:ffff:ffff:ffff:ffff:ffff,PA +2001:1370::,2001:1370:ffff:ffff:ffff:ffff:ffff:ffff,HT +2001:1378::,2001:1378:ffff:ffff:ffff:ffff:ffff:ffff,BO +2001:1380::,2001:1380:ffff:ffff:ffff:ffff:ffff:ffff,PE +2001:1388::,2001:1388:ffff:ffff:ffff:ffff:ffff:ffff,PE +2001:1398::,2001:1398:ffff:ffff:ffff:ffff:ffff:ffff,CL +2001:13a0::,2001:13a0:ffff:ffff:ffff:ffff:ffff:ffff,PE +2001:13a8::,2001:13a8:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:13b0::,2001:13b7:ffff:ffff:ffff:ffff:ffff:ffff,AR +2001:13c7:6000::,2001:13c7:6000:ffff:ffff:ffff:ffff:ffff,CO +2001:13c7:6001::,2001:13c7:6001:ffff:ffff:ffff:ffff:ffff,AR +2001:13c7:6002::,2001:13c7:6002:ffff:ffff:ffff:ffff:ffff,SX +2001:13c7:6003::,2001:13c7:6003:ffff:ffff:ffff:ffff:ffff,HT +2001:13c7:6004::,2001:13c7:6005:ffff:ffff:ffff:ffff:ffff,CW +2001:13c7:6006::,2001:13c7:6006:ffff:ffff:ffff:ffff:ffff,EC +2001:13c7:6007::,2001:13c7:600e:ffff:ffff:ffff:ffff:ffff,AR +2001:13c7:6010::,2001:13c7:601f:ffff:ffff:ffff:ffff:ffff,AR +2001:13c7:6f00::,2001:13c7:6fff:ffff:ffff:ffff:ffff:ffff,EC +2001:13c7:7000::,2001:13c7:7000:ffff:ffff:ffff:ffff:ffff,MX +2001:13c7:7001::,2001:13c7:7003:ffff:ffff:ffff:ffff:ffff,UY +2001:13c7:7004::,2001:13c7:7004:ffff:ffff:ffff:ffff:ffff,CR +2001:13c7:7005::,2001:13c7:7009:ffff:ffff:ffff:ffff:ffff,UY +2001:13c7:7010::,2001:13c7:7013:ffff:ffff:ffff:ffff:ffff,UY +2001:13c7:7014::,2001:13c7:7014:ffff:ffff:ffff:ffff:ffff,MX +2001:13c8::,2001:13c8:ffff:ffff:ffff:ffff:ffff:ffff,CU +2001:13d0::,2001:13d7:ffff:ffff:ffff:ffff:ffff:ffff,AR +2001:13d8::,2001:13d8:ffff:ffff:ffff:ffff:ffff:ffff,CR +2001:13e0::,2001:13e0:ffff:ffff:ffff:ffff:ffff:ffff,DO +2001:13e8::,2001:13e8:ffff:ffff:ffff:ffff:ffff:ffff,AR +2001:13f0::,2001:13f0:ffff:ffff:ffff:ffff:ffff:ffff,DO +2001:13f8::,2001:13f8:ffff:ffff:ffff:ffff:ffff:ffff,CO +2001:1400::,2001:1407:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:1408::,2001:1408:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:1410::,2001:1410:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1418::,2001:1418:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:1420::,2001:1427:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:1428::,2001:1428:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:1430::,2001:1430:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:1438::,2001:1438:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1440::,2001:1440:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1448::,2001:1448:ffff:ffff:ffff:ffff:ffff:ffff,DK +2001:1450::,2001:1450:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:1458::,2001:1459:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:1460::,2001:1460:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:1468::,2001:1468:7fff:ffff:ffff:ffff:ffff:ffff,CZ +2001:1468:8000::,2001:1468:ffff:ffff:ffff:ffff:ffff:ffff,IE +2001:1469::,2001:146b:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:146c::,2001:146c:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:146d::,2001:146e:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:146f::,2001:146f:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1470::,2001:1477:ffff:ffff:ffff:ffff:ffff:ffff,SI +2001:1478::,2001:1478:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:1488::,2001:1488:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:1490::,2001:1490:ffff:ffff:ffff:ffff:ffff:ffff,SA +2001:1498::,2001:1498:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:14a0::,2001:14a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:14a8::,2001:14a8:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:14b0::,2001:14b0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:14b8::,2001:14bf:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:14c0::,2001:14c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:14c8::,2001:14c8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:14d0::,2001:14d7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2001:14d8::,2001:14d8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:14e0::,2001:14e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:14e8::,2001:14e8:ffff:ffff:ffff:ffff:ffff:ffff,IR +2001:14f0::,2001:14f8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1500::,2001:1500:ffff:ffff:ffff:ffff:ffff:ffff,IR +2001:1508::,2001:1508:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:1510::,2001:1510:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:1520::,2001:1520:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1528::,2001:1528:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:1530::,2001:1530:ffff:ffff:ffff:ffff:ffff:ffff,EE +2001:1538::,2001:1538:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:1540::,2001:1540:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:1548::,2001:1548:ffff:ffff:ffff:ffff:ffff:ffff,GR +2001:1558::,2001:1558:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:1560::,2001:1567:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1568::,2001:1568:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:1578::,2001:157f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1580::,2001:1580:ffff:ffff:ffff:ffff:ffff:ffff,DK +2001:1588::,2001:158f:ffff:ffff:ffff:ffff:ffff:ffff,PT +2001:1590::,2001:1590:ffff:ffff:ffff:ffff:ffff:ffff,SI +2001:1598::,2001:1598:ffff:ffff:ffff:ffff:ffff:ffff,BE +2001:15a8::,2001:15a8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:15b0::,2001:15b0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:15b8::,2001:15b8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:15c0::,2001:15c7:ffff:ffff:ffff:ffff:ffff:ffff,SI +2001:15c8::,2001:15c8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:15d8::,2001:15df:ffff:ffff:ffff:ffff:ffff:ffff,PT +2001:15e0::,2001:15e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:15e8::,2001:15ef:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:15f0::,2001:15f0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:15f8::,2001:15f8:ffff:ffff:ffff:ffff:ffff:ffff,DK +2001:1600::,2001:1607:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:1608::,2001:1608:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1610::,2001:1617:ffff:ffff:ffff:ffff:ffff:ffff,LU +2001:1618::,2001:161f:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:1620::,2001:1623:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:1630::,2001:1637:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:1638::,2001:1638:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1640::,2001:1640:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1650::,2001:1650:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:1658::,2001:1658:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:1660::,2001:1660:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:1668::,2001:1668:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:1670::,2001:1670:ffff:ffff:ffff:ffff:ffff:ffff,OM +2001:1678::,2001:1678:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:1680::,2001:1687:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:1688::,2001:168f:ffff:ffff:ffff:ffff:ffff:ffff,SI +2001:1690::,2001:1690:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:1698::,2001:1698:ffff:ffff:ffff:ffff:ffff:ffff,LU +2001:16a0::,2001:16a2:596:ffff:ffff:ffff:ffff:ffff,SA +2001:16a2:597::,2001:16a2:597:7fff:ffff:ffff:ffff:ffff,GB +2001:16a2:597:8000::,2001:16a2:4367:ffff:ffff:ffff:ffff:ffff,SA +2001:16a2:4368::,2001:16a2:4368:7fff:ffff:ffff:ffff:ffff,GB +2001:16a2:4368:8000::,2001:16a2:82aa:ffff:ffff:ffff:ffff:ffff,SA +2001:16a2:82ab::,2001:16a2:82ab:7fff:ffff:ffff:ffff:ffff,GB +2001:16a2:82ab:8000::,2001:16a2:8452:7fff:ffff:ffff:ffff:ffff,SA +2001:16a2:8452:8000::,2001:16a2:8452:ffff:ffff:ffff:ffff:ffff,GB +2001:16a2:8453::,2001:16a2:84cc:7fff:ffff:ffff:ffff:ffff,SA +2001:16a2:84cc:8000::,2001:16a2:84cc:ffff:ffff:ffff:ffff:ffff,GB +2001:16a2:84cd::,2001:16a2:84da:7fff:ffff:ffff:ffff:ffff,SA +2001:16a2:84da:8000::,2001:16a2:84da:ffff:ffff:ffff:ffff:ffff,DE +2001:16a2:84db::,2001:16a2:85a7:ffff:ffff:ffff:ffff:ffff,SA +2001:16a2:85a8::,2001:16a2:85a8:7fff:ffff:ffff:ffff:ffff,GB +2001:16a2:85a8:8000::,2001:16a2:8601:7fff:ffff:ffff:ffff:ffff,SA +2001:16a2:8601:8000::,2001:16a2:8601:ffff:ffff:ffff:ffff:ffff,GB +2001:16a2:8602::,2001:16a2:861c:ffff:ffff:ffff:ffff:ffff,SA +2001:16a2:861d::,2001:16a2:861d:7fff:ffff:ffff:ffff:ffff,GB +2001:16a2:861d:8000::,2001:16a2:87a5:ffff:ffff:ffff:ffff:ffff,SA +2001:16a2:87a6::,2001:16a2:87a6:7fff:ffff:ffff:ffff:ffff,GB +2001:16a2:87a6:8000::,2001:16a2:8858:7fff:ffff:ffff:ffff:ffff,SA +2001:16a2:8858:8000::,2001:16a2:8858:ffff:ffff:ffff:ffff:ffff,GB +2001:16a2:8859::,2001:16a2:8baa:7fff:ffff:ffff:ffff:ffff,SA +2001:16a2:8baa:8000::,2001:16a2:8baa:ffff:ffff:ffff:ffff:ffff,GB +2001:16a2:8bab::,2001:16a2:96d7:7fff:ffff:ffff:ffff:ffff,SA +2001:16a2:96d7:8000::,2001:16a2:96d7:ffff:ffff:ffff:ffff:ffff,ZA +2001:16a2:96d8::,2001:16a2:b7d4:ffff:ffff:ffff:ffff:ffff,SA +2001:16a2:b7d5::,2001:16a2:b7d5:7fff:ffff:ffff:ffff:ffff,IN +2001:16a2:b7d5:8000::,2001:16a7:ffff:ffff:ffff:ffff:ffff:ffff,SA +2001:16a8::,2001:16a8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:16b0::,2001:16b0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:16b8::,2001:16b8:2486:ffff:ffff:ffff:ffff:ffff,DE +2001:16b8:2487::,2001:16b8:2487:7fff:ffff:ffff:ffff:ffff,FR +2001:16b8:2487:8000::,2001:16b8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:16c0::,2001:16c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2001:16d0::,2001:16d0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:16d8::,2001:16d8:dd00:7fff:ffff:ffff:ffff:ffff,SE +2001:16d8:dd00:8000::,2001:16d8:dd00:ffff:ffff:ffff:ffff:ffff,DK +2001:16d8:dd01::,2001:16d8:dda3:ffff:ffff:ffff:ffff:ffff,SE +2001:16d8:dda4::,2001:16d8:dda4:7fff:ffff:ffff:ffff:ffff,DK +2001:16d8:dda4:8000::,2001:16d8:ddcd:ffff:ffff:ffff:ffff:ffff,SE +2001:16d8:ddce::,2001:16d8:ddce:7fff:ffff:ffff:ffff:ffff,DK +2001:16d8:ddce:8000::,2001:16d8:ee00:7fff:ffff:ffff:ffff:ffff,SE +2001:16d8:ee00:8000::,2001:16d8:ee00:ffff:ffff:ffff:ffff:ffff,NO +2001:16d8:ee01::,2001:16d8:ee5b:ffff:ffff:ffff:ffff:ffff,SE +2001:16d8:ee5c::,2001:16d8:ee5c:7fff:ffff:ffff:ffff:ffff,NO +2001:16d8:ee5c:8000::,2001:16d8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:16e0::,2001:16e7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:16e8::,2001:16e8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:16f0::,2001:16f7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:16f8::,2001:16f8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:1700::,2001:171f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:1800::,2001:1800:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1808::,2001:1808:ffff:ffff:ffff:ffff:ffff:ffff,GD +2001:1810::,2001:1810:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1818::,2001:1818:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1820::,2001:1820:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1828::,2001:1828:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1830::,2001:1830:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1838::,2001:1838:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1840::,2001:1840:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1848::,2001:1848:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1850::,2001:1850:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1860::,2001:1860:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1868::,2001:1868:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1878::,2001:1878:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1888::,2001:1888:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1890::,2001:1898:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:18a0::,2001:18a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:18a8::,2001:18a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:18b0::,2001:18b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:18b8::,2001:18b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:18c0::,2001:18c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:18c8::,2001:18c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:18d8::,2001:18d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:18e0::,2001:18e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:18e8::,2001:18e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:18f0::,2001:18f0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:18f8::,2001:18f8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:1900::,2001:1900:1::53:ff,US +2001:1900:1::53:100,2001:1900:1::53:1ff,SG +2001:1900:1::53:200,2001:1900:1::53:2ff,JP +2001:1900:1::53:300,2001:1900:1::53:80ff,US +2001:1900:1::53:8100,2001:1900:1::53:81ff,SG +2001:1900:1::53:8200,2001:1900:1::53:82ff,JP +2001:1900:1::53:8300,2001:1900:2::53:ff,US +2001:1900:2::53:100,2001:1900:2::53:1ff,GB +2001:1900:2::53:200,2001:1900:2::53:2ff,DE +2001:1900:2::53:300,2001:1900:5:1::1c5,US +2001:1900:5:1::1c6,2001:1900:5:1::1c6,SI +2001:1900:5:1::1c7,2001:1900:5:2:2::93d,US +2001:1900:5:2:2::93e,2001:1900:5:2:2::93e,SI +2001:1900:5:2:2::93f,2001:1900:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1908::,2001:1908:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1910::,2001:1910:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1920::,2001:1920:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:1928::,2001:1928:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:1930::,2001:1930:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1938::,2001:1938:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1940::,2001:1940:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1948::,2001:1948:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1950::,2001:1950:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1958::,2001:1958:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1960::,2001:1960:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1968::,2001:1968:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1970::,2001:1970:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:1978::,2001:1978:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:1980::,2001:1980:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1988::,2001:1988:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1990::,2001:1990:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1998::,2001:1998:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:19a0::,2001:19a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:19a8::,2001:19a8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:19b0::,2001:19b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:19b8::,2001:19b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:19c0::,2001:19c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:19c8::,2001:19c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:19d0::,2001:19d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:19d8::,2001:19d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:19e0::,2001:19e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:19e8::,2001:19e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:19f0::,2001:19f0:5000:7fff:ffff:ffff:ffff:ffff,US +2001:19f0:5000:8000::,2001:19f0:5001:7fff:ffff:ffff:ffff:ffff,NL +2001:19f0:5001:8000::,2001:19f0:5800:7fff:ffff:ffff:ffff:ffff,US +2001:19f0:5800:8000::,2001:19f0:5801:7fff:ffff:ffff:ffff:ffff,AU +2001:19f0:5801:8000::,2001:19f0:6800:ffff:ffff:ffff:ffff:ffff,US +2001:19f0:6801::,2001:19f0:6801:7fff:ffff:ffff:ffff:ffff,FR +2001:19f0:6801:8000::,2001:19f0:6c00:7fff:ffff:ffff:ffff:ffff,US +2001:19f0:6c00:8000::,2001:19f0:6c01:7fff:ffff:ffff:ffff:ffff,DE +2001:19f0:6c01:8000::,2001:19f0:7000:7fff:ffff:ffff:ffff:ffff,US +2001:19f0:7000:8000::,2001:19f0:7001:7fff:ffff:ffff:ffff:ffff,JP +2001:19f0:7001:8000::,2001:19f0:7400:7fff:ffff:ffff:ffff:ffff,US +2001:19f0:7400:8000::,2001:19f0:7400:ffff:ffff:ffff:ffff:ffff,GB +2001:19f0:7401::,2001:19f0:7401:7fff:ffff:ffff:ffff:ffff,US +2001:19f0:7401:8000::,2001:19f0:7401:ffff:ffff:ffff:ffff:ffff,GB +2001:19f0:7402::,2001:19f0:7800:3fff:ffff:ffff:ffff:ffff,US +2001:19f0:7800:4000::,2001:19f0:7800:4000:ffff:ffff:ffff:ffff,CA +2001:19f0:7800:4001::,2001:19f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:19f8::,2001:19f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:1a08::,2001:1a08:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:1a10::,2001:1a17:ffff:ffff:ffff:ffff:ffff:ffff,QA +2001:1a18::,2001:1a1f:ffff:ffff:ffff:ffff:ffff:ffff,CY +2001:1a20::,2001:1a20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:1a28::,2001:1a28:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1a30::,2001:1a30:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1a38::,2001:1a38:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:1a40::,2001:1a40:ffff:ffff:ffff:ffff:ffff:ffff,BH +2001:1a48::,2001:1a48:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:1a50::,2001:1a50:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1a58::,2001:1a58:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:1a60::,2001:1a60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:1a68::,2001:1a68:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:1a70::,2001:1a77:ffff:ffff:ffff:ffff:ffff:ffff,MT +2001:1a78::,2001:1a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1a88::,2001:1a8f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:1a90::,2001:1a90:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:1a98::,2001:1a9f:ffff:ffff:ffff:ffff:ffff:ffff,IS +2001:1aa0::,2001:1aa7:ffff:ffff:ffff:ffff:ffff:ffff,HU +2001:1aa8::,2001:1aa8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:1ab0::,2001:1ab0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:1ab8::,2001:1abb:ffff:ffff:ffff:ffff:ffff:ffff,LT +2001:1ac0::,2001:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:1ac8::,2001:1ac8:ffff:ffff:ffff:ffff:ffff:ffff,BG +2001:1ad0::,2001:1ad0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:1ad8::,2001:1ad8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:1ae0::,2001:1ae0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2001:1ae8::,2001:1aef:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:1af0::,2001:1af7:ffff:ffff:ffff:ffff:ffff:ffff,HR +2001:1af8::,2001:1af8:4010:7fff:ffff:ffff:ffff:ffff,NL +2001:1af8:4010:8000::,2001:1af8:4010:ffff:ffff:ffff:ffff:ffff,DE +2001:1af8:4011::,2001:1af8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:1b00::,2001:1b00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:1b08::,2001:1b08:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:1b10::,2001:1b10:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1b18::,2001:1b18:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1b28::,2001:1b28:ffff:ffff:ffff:ffff:ffff:ffff,EE +2001:1b30::,2001:1b37:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1b38::,2001:1b3f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:1b40::,2001:1b40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:1b48::,2001:1b4f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:1b50::,2001:1b57:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:1b58::,2001:1b58:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:1b60::,2001:1b67:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1b68::,2001:1b6f:ffff:ffff:ffff:ffff:ffff:ffff,TR +2001:1b70::,2001:1b77:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:1b78::,2001:1b78:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:1b80::,2001:1b87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:1b88::,2001:1b88:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:1b90::,2001:1b90:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:1b98::,2001:1b98:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:1ba0::,2001:1ba0:ffff:ffff:ffff:ffff:ffff:ffff,SK +2001:1ba8::,2001:1ba8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:1bb0::,2001:1bb0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:1bb8::,2001:1bb8:ffff:ffff:ffff:ffff:ffff:ffff,IE +2001:1bc0::,2001:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1bc8::,2001:1bcf:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:1bd0::,2001:1bd0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:1bd8::,2001:1bd8:ffff:ffff:ffff:ffff:ffff:ffff,IE +2001:1be0::,2001:1be0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:1be8::,2001:1be8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:1bf0::,2001:1bf7:ffff:ffff:ffff:ffff:ffff:ffff,EE +2001:1bf8::,2001:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,LV +2001:1c00::,2001:1c00:d06:ffff:ffff:ffff:ffff:ffff,NL +2001:1c00:d07::,2001:1c00:d07:7fff:ffff:ffff:ffff:ffff,GB +2001:1c00:d07:8000::,2001:1c01:1d04:2fff:ffff:ffff:ffff:ffff,NL +2001:1c01:1d04:3000::,2001:1c01:1d04:3fff:ffff:ffff:ffff:ffff,US +2001:1c01:1d04:4000::,2001:1dff:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:2002::,2001:2002:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:2003::,2001:2003:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:2010:9::,2001:2010:9:7fff:ffff:ffff:ffff:ffff,DK +2001:2010:ea7:8000::,2001:2010:ea7:ffff:ffff:ffff:ffff:ffff,DK +2001:2011:c002::,2001:2011:c002:ffff:ffff:ffff:ffff:ffff,DK +2001:2012::,2001:2012::7fff:ffff:ffff:ffff:ffff,DK +2001:2012:100::,2001:2012:127:ffff:ffff:ffff:ffff:ffff,DK +2001:2012:200::,2001:2012:200:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:200:b800::,2001:2012:20c:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:20d::,2001:2012:229:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:22a::,2001:2012:22b:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:22c::,2001:2012:232:ffff:ffff:ffff:ffff:ffff,DK +2001:2012:233:8000::,2001:2012:235:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:300::,2001:2012:317:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:318::,2001:2012:321:ffff:ffff:ffff:ffff:ffff,DK +2001:2012:400::,2001:2012:404:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:405::,2001:2012:433:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:1002::,2001:2012:1002:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:1100::,2001:2012:1128:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:1129::,2001:2012:1129:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:1200::,2001:2012:1201:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:1202::,2001:2012:1219:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:121a::,2001:2012:1225:ffff:ffff:ffff:ffff:ffff,DK +2001:2012:1226:8000::,2001:2012:1226:ffff:ffff:ffff:ffff:ffff,DK +2001:2012:1228::,2001:2012:1231:ffff:ffff:ffff:ffff:ffff,DK +2001:2012:1300::,2001:2012:131c:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:131d::,2001:2012:131d:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:1400::,2001:2012:1406:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:1407::,2001:2012:1409:ffff:ffff:ffff:ffff:ffff,DK +2001:2012:140b:8000::,2001:2012:140d:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:140e::,2001:2012:1410:ffff:ffff:ffff:ffff:ffff,DK +2001:2012:1411:8000::,2001:2012:141a:ffff:ffff:ffff:ffff:ffff,DK +2001:2012:141c:8000::,2001:2012:1427:7fff:ffff:ffff:ffff:ffff,DK +2001:2012:3ec6::,2001:2012:3ec7:ffff:ffff:ffff:ffff:ffff,DK +2001:2012:c2ff:8000::,2001:2012:c2ff:ffff:ffff:ffff:ffff:ffff,DK +2001:2012:d94a:8000::,2001:2012:d94a:ffff:ffff:ffff:ffff:ffff,DK +2001:2040:5::,2001:2040:5:7fff:ffff:ffff:ffff:ffff,SE +2001:2040:4a::,2001:2040:4a:7fff:ffff:ffff:ffff:ffff,SE +2001:2040:4b::,2001:2040:4b:ffff:ffff:ffff:ffff:ffff,SE +2001:2040:6c::,2001:2040:6c:7fff:ffff:ffff:ffff:ffff,SE +2001:2040:70::,2001:2040:70:7fff:ffff:ffff:ffff:ffff,SE +2001:2040:c006::,2001:2040:c006:ffff:ffff:ffff:ffff:ffff,SE +2001:2060:41::,2001:2060:41:7fff:ffff:ffff:ffff:ffff,FI +2001:2060:49::,2001:2060:49:7fff:ffff:ffff:ffff:ffff,FI +2001:2060:59::,2001:2060:59:7fff:ffff:ffff:ffff:ffff,FI +2001:2060:5b:8000::,2001:2060:5b:ffff:ffff:ffff:ffff:ffff,FI +2001:2060:60::,2001:2060:60:7fff:ffff:ffff:ffff:ffff,FI +2001:2060:bffb::,2001:2060:bffb:ffff:ffff:ffff:ffff:ffff,FI +2001:4000::,2001:4000:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:4010::,2001:4010:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4018::,2001:4018:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4020::,2001:4020:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4028::,2001:402f:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4030::,2001:4030:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:4038::,2001:4038:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4040::,2001:4040:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:4048::,2001:4048:ffff:ffff:ffff:ffff:ffff:ffff,LT +2001:4050::,2001:4050:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4058::,2001:4058:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:4060::,2001:4060:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:4068::,2001:4068:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4070::,2001:4070:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4078::,2001:407f:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:4080::,2001:4080:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:4088::,2001:4088:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4090::,2001:4090:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:40a0::,2001:40a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:40a8::,2001:40a8:ffff:ffff:ffff:ffff:ffff:ffff,IL +2001:40b0::,2001:40b0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:40b8::,2001:40b8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:40c0::,2001:40c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:40d0::,2001:40d0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:40d8::,2001:40d8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:40e0::,2001:40e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:40e8::,2001:40e8:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:40f0::,2001:40f0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:40f8::,2001:40f8:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4100::,2001:4100:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:4108::,2001:4108:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:4118::,2001:4118:ffff:ffff:ffff:ffff:ffff:ffff,SK +2001:4120::,2001:4120:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4128::,2001:4128:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4130::,2001:4130:ffff:ffff:ffff:ffff:ffff:ffff,UA +2001:4138::,2001:4140:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4150::,2001:4150:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4158::,2001:415f:ffff:ffff:ffff:ffff:ffff:ffff,BE +2001:4160::,2001:4160:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4168::,2001:4168:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:4170::,2001:4170:ffff:ffff:ffff:ffff:ffff:ffff,RS +2001:4178::,2001:4180:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4188::,2001:418f:ffff:ffff:ffff:ffff:ffff:ffff,IR +2001:4190::,2001:4190:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4198::,2001:4198:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:41a0::,2001:41a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:41a8::,2001:41a8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:41b0::,2001:41b0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:41b8::,2001:41b8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:41c0::,2001:41cf:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:41d0::,2001:41d0:2:4dbd:ffff:ffff:ffff:ffff,FR +2001:41d0:2:4dbe::,2001:41d0:2:4dbe:ffff:ffff:ffff:ffff,CZ +2001:41d0:2:4dbf::,2001:41d0:a:7e08:ffff:ffff:ffff:ffff,FR +2001:41d0:a:7e09::,2001:41d0:a:7e09:ffff:ffff:ffff:ffff,PT +2001:41d0:a:7e0a::,2001:41d0:129:9bff:ffff:ffff:ffff:ffff,FR +2001:41d0:129:9c00::,2001:41d0:129:9cff:ffff:ffff:ffff:ffff,NL +2001:41d0:129:9d00::,2001:41d0:601:1100::5fe,FR +2001:41d0:601:1100::5ff,2001:41d0:601:1100::5ff,PL +2001:41d0:601:1100::600,2001:41d0:1000:171a:ffff:ffff:ffff:ffff,FR +2001:41d0:1000:171b::,2001:41d0:1000:171b:ffff:ffff:ffff:ffff,DE +2001:41d0:1000:171c::,2001:41d0:1007:ffff:ffff:ffff:ffff:ffff,FR +2001:41d0:1008::,2001:41d0:1008:7fff:ffff:ffff:ffff:ffff,BE +2001:41d0:1008:8000::,2001:41d0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:41d8::,2001:41d8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:41e0::,2001:41e0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:41e8::,2001:41e8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:41f0::,2001:41f0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:41f8::,2001:41f8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4200::,2001:4200:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:4210::,2001:4210:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:4218::,2001:4218:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:4220::,2001:4220:ffff:ffff:ffff:ffff:ffff:ffff,EG +2001:4228::,2001:4228:ffff:ffff:ffff:ffff:ffff:ffff,SD +2001:4238::,2001:4238:27a0:ffff:ffff:ffff:ffff:ffff,MU +2001:4238:27a1::,2001:4238:27a1:7fff:ffff:ffff:ffff:ffff,KE +2001:4238:27a1:8000::,2001:4238:28e4:ffff:ffff:ffff:ffff:ffff,MU +2001:4238:28e5::,2001:4238:28e5:7fff:ffff:ffff:ffff:ffff,KE +2001:4238:28e5:8000::,2001:4238:29aa:ffff:ffff:ffff:ffff:ffff,MU +2001:4238:29ab::,2001:4238:29ab:7fff:ffff:ffff:ffff:ffff,KE +2001:4238:29ab:8000::,2001:4238:29e9:ffff:ffff:ffff:ffff:ffff,MU +2001:4238:29ea::,2001:4238:29ea:7fff:ffff:ffff:ffff:ffff,KE +2001:4238:29ea:8000::,2001:4238:2af1:ffff:ffff:ffff:ffff:ffff,MU +2001:4238:2af2::,2001:4238:2af2:7fff:ffff:ffff:ffff:ffff,KE +2001:4238:2af2:8000::,2001:4238:2b30:ffff:ffff:ffff:ffff:ffff,MU +2001:4238:2b31::,2001:4238:2b31:7fff:ffff:ffff:ffff:ffff,KE +2001:4238:2b31:8000::,2001:4238:2b33:ffff:ffff:ffff:ffff:ffff,MU +2001:4238:2b34::,2001:4238:2b34:7fff:ffff:ffff:ffff:ffff,KE +2001:4238:2b34:8000::,2001:4238:ffff:ffff:ffff:ffff:ffff:ffff,MU +2001:4240::,2001:4240:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2001:4248::,2001:4248:ffff:ffff:ffff:ffff:ffff:ffff,MU +2001:4250::,2001:4250:ffff:ffff:ffff:ffff:ffff:ffff,AO +2001:4258::,2001:4258:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2001:4260::,2001:4260:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:4268::,2001:4268:ffff:ffff:ffff:ffff:ffff:ffff,CM +2001:4270::,2001:4270:ffff:ffff:ffff:ffff:ffff:ffff,NG +2001:4278::,2001:4278:ffff:ffff:ffff:ffff:ffff:ffff,SN +2001:4288::,2001:4288:ffff:ffff:ffff:ffff:ffff:ffff,MA +2001:4290::,2001:4290:ffff:ffff:ffff:ffff:ffff:ffff,MU +2001:4298::,2001:4298:ffff:ffff:ffff:ffff:ffff:ffff,DJ +2001:42a0::,2001:42a0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:42a8::,2001:42a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:42b0::,2001:42b0:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2001:42b8::,2001:42b8:ffff:ffff:ffff:ffff:ffff:ffff,EG +2001:42c0::,2001:42c0:ffff:ffff:ffff:ffff:ffff:ffff,ML +2001:42c8::,2001:42c8::ff:ffff:ffff:ffff:ffff,CA +2001:42c8:0:100::,2001:42c8::1ff:ffff:ffff:ffff:ffff,KE +2001:42c8:0:200::,2001:42c8:ff:ffff:ffff:ffff:ffff:ffff,CA +2001:42c8:100::,2001:42c8:100:ff:ffff:ffff:ffff:ffff,KE +2001:42c8:100:100::,2001:42c8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:42d0::,2001:42d0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:42d8::,2001:42d8:ffff:ffff:ffff:ffff:ffff:ffff,CI +2001:42e0::,2001:42e0:ffff:ffff:ffff:ffff:ffff:ffff,SC +2001:42f0::,2001:42f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:4300::,2001:4300:ffff:ffff:ffff:ffff:ffff:ffff,EG +2001:4308::,2001:4308:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:4310::,2001:4310:ffff:ffff:ffff:ffff:ffff:ffff,MA +2001:4318::,2001:4318:ffff:ffff:ffff:ffff:ffff:ffff,CI +2001:4320::,2001:4320:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2001:4328::,2001:4328:ffff:ffff:ffff:ffff:ffff:ffff,MU +2001:4330::,2001:4330:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:4338::,2001:4338:ffff:ffff:ffff:ffff:ffff:ffff,SZ +2001:4340::,2001:4340:ffff:ffff:ffff:ffff:ffff:ffff,DZ +2001:4350::,2001:4350:ffff:ffff:ffff:ffff:ffff:ffff,TN +2001:4358::,2001:4358:ffff:ffff:ffff:ffff:ffff:ffff,KE +2001:4368::,2001:4368:ffff:ffff:ffff:ffff:ffff:ffff,KE +2001:4370::,2001:4370:ffff:ffff:ffff:ffff:ffff:ffff,KE +2001:4378::,2001:4378:ffff:ffff:ffff:ffff:ffff:ffff,MZ +2001:4388::,2001:4388:ffff:ffff:ffff:ffff:ffff:ffff,EG +2001:4398::,2001:4398:ffff:ffff:ffff:ffff:ffff:ffff,MG +2001:43a0::,2001:43a0:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2001:43a8::,2001:43a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:43b0::,2001:43b0:ffff:ffff:ffff:ffff:ffff:ffff,NG +2001:43b8::,2001:43b8:ffff:ffff:ffff:ffff:ffff:ffff,MU +2001:43c0::,2001:43c0:ffff:ffff:ffff:ffff:ffff:ffff,GH +2001:43c8::,2001:43c8:ffff:ffff:ffff:ffff:ffff:ffff,EG +2001:43d0::,2001:43d0:ffff:ffff:ffff:ffff:ffff:ffff,KE +2001:43d8::,2001:43d8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:43e0::,2001:43e0:ffff:ffff:ffff:ffff:ffff:ffff,GH +2001:43e8::,2001:43e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f0::,2001:43f0:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2001:43f8::,2001:43f8:3:ffff:ffff:ffff:ffff:ffff,TZ +2001:43f8:10::,2001:43f8:10:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:20::,2001:43f8:20:ffff:ffff:ffff:ffff:ffff,NL +2001:43f8:30::,2001:43f8:30:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:50::,2001:43f8:50:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:60::,2001:43f8:60:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:70::,2001:43f8:77:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:80::,2001:43f8:80:ffff:ffff:ffff:ffff:ffff,NA +2001:43f8:90::,2001:43f8:90:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:92::,2001:43f8:92:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:a0::,2001:43f8:a0:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:b0::,2001:43f8:b0:ffff:ffff:ffff:ffff:ffff,SL +2001:43f8:c0::,2001:43f8:c1:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:e0::,2001:43f8:e0:ffff:ffff:ffff:ffff:ffff,TZ +2001:43f8:100::,2001:43f8:100:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:110::,2001:43f8:110:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:120::,2001:43f8:120:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:130::,2001:43f8:130:ffff:ffff:ffff:ffff:ffff,UG +2001:43f8:140::,2001:43f8:140:ffff:ffff:ffff:ffff:ffff,ZM +2001:43f8:150::,2001:43f8:150:ffff:ffff:ffff:ffff:ffff,RW +2001:43f8:160::,2001:43f8:160:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:180::,2001:43f8:180:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:190::,2001:43f8:190:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:1a0::,2001:43f8:1a0:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:1b0::,2001:43f8:1b0:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:1c0::,2001:43f8:1c0:ffff:ffff:ffff:ffff:ffff,DZ +2001:43f8:1d0::,2001:43f8:1d0:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:1e0::,2001:43f8:1e0:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:1f0::,2001:43f8:1f5:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:200::,2001:43f8:200:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:210::,2001:43f8:210:ffff:ffff:ffff:ffff:ffff,LS +2001:43f8:220::,2001:43f8:220:ffff:ffff:ffff:ffff:ffff,BW +2001:43f8:230::,2001:43f8:230:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:240::,2001:43f8:241:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:250::,2001:43f8:250:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:260::,2001:43f8:260:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:270::,2001:43f8:271:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:280::,2001:43f8:280:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:290::,2001:43f8:290:ffff:ffff:ffff:ffff:ffff,MG +2001:43f8:2a0::,2001:43f8:2a0:ffff:ffff:ffff:ffff:ffff,BW +2001:43f8:2b0::,2001:43f8:2b0:ffff:ffff:ffff:ffff:ffff,BW +2001:43f8:2c0::,2001:43f8:2c0:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:2d0::,2001:43f8:2d0:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:2e0::,2001:43f8:2e0:ffff:ffff:ffff:ffff:ffff,EG +2001:43f8:2f0::,2001:43f8:2f0:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:300::,2001:43f8:300:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:310::,2001:43f8:310:ffff:ffff:ffff:ffff:ffff,ZW +2001:43f8:320::,2001:43f8:320:ffff:ffff:ffff:ffff:ffff,TN +2001:43f8:330::,2001:43f8:330:ffff:ffff:ffff:ffff:ffff,TZ +2001:43f8:340::,2001:43f8:340:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:360::,2001:43f8:360:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:370::,2001:43f8:370:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:380::,2001:43f8:380:ffff:ffff:ffff:ffff:ffff,MW +2001:43f8:390::,2001:43f8:391:ffff:ffff:ffff:ffff:ffff,AO +2001:43f8:3b0::,2001:43f8:3b0:ffff:ffff:ffff:ffff:ffff,NA +2001:43f8:3c0::,2001:43f8:3c1:ffff:ffff:ffff:ffff:ffff,CD +2001:43f8:3d0::,2001:43f8:3d0:ffff:ffff:ffff:ffff:ffff,BF +2001:43f8:3e0::,2001:43f8:3ef:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:400::,2001:43f8:4ff:ffff:ffff:ffff:ffff:ffff,AO +2001:43f8:600::,2001:43f8:60f:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:610::,2001:43f8:611:ffff:ffff:ffff:ffff:ffff,TZ +2001:43f8:620::,2001:43f8:620:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:630::,2001:43f8:630:ffff:ffff:ffff:ffff:ffff,MW +2001:43f8:640::,2001:43f8:640:ffff:ffff:ffff:ffff:ffff,MZ +2001:43f8:650::,2001:43f8:650:ffff:ffff:ffff:ffff:ffff,MA +2001:43f8:660::,2001:43f8:660:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:670::,2001:43f8:670:ffff:ffff:ffff:ffff:ffff,AO +2001:43f8:680::,2001:43f8:680:ffff:ffff:ffff:ffff:ffff,TZ +2001:43f8:6a0::,2001:43f8:6a0:ffff:ffff:ffff:ffff:ffff,CG +2001:43f8:6b0::,2001:43f8:6b3:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:6c0::,2001:43f8:6c0:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:6d0::,2001:43f8:6d3:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:6e0::,2001:43f8:6e0:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:700::,2001:43f8:70f:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:720::,2001:43f8:720:ffff:ffff:ffff:ffff:ffff,AO +2001:43f8:750::,2001:43f8:75f:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:760::,2001:43f8:760:ffff:ffff:ffff:ffff:ffff,AO +2001:43f8:770::,2001:43f8:773:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:780::,2001:43f8:780:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:790::,2001:43f8:790:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:7a0::,2001:43f8:7a0:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:7b0::,2001:43f8:7b0:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:7c0::,2001:43f8:7c0:ffff:ffff:ffff:ffff:ffff,AO +2001:43f8:7d0::,2001:43f8:7d0:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:7e0::,2001:43f8:7e0:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:7f0::,2001:43f8:7f0:ffff:ffff:ffff:ffff:ffff,SD +2001:43f8:800::,2001:43f8:83f:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:900::,2001:43f8:900:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:920::,2001:43f8:920:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:930::,2001:43f8:931:ffff:ffff:ffff:ffff:ffff,MZ +2001:43f8:940::,2001:43f8:940:ffff:ffff:ffff:ffff:ffff,CI +2001:43f8:950::,2001:43f8:950:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:960::,2001:43f8:960:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:970::,2001:43f8:970:ffff:ffff:ffff:ffff:ffff,GM +2001:43f8:980::,2001:43f8:981:ffff:ffff:ffff:ffff:ffff,NA +2001:43f8:990::,2001:43f8:991:ffff:ffff:ffff:ffff:ffff,BI +2001:43f8:9a0::,2001:43f8:9a0:ffff:ffff:ffff:ffff:ffff,BJ +2001:43f8:9b0::,2001:43f8:9b1:ffff:ffff:ffff:ffff:ffff,SZ +2001:43f8:9c0::,2001:43f8:9c1:ffff:ffff:ffff:ffff:ffff,DJ +2001:43f8:9d0::,2001:43f8:9d0:ffff:ffff:ffff:ffff:ffff,AO +2001:43f8:9e0::,2001:43f8:9e0:ffff:ffff:ffff:ffff:ffff,ZW +2001:43f8:9f0::,2001:43f8:9f0:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:a00::,2001:43f8:a00:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:a10::,2001:43f8:a11:ffff:ffff:ffff:ffff:ffff,MG +2001:43f8:a20::,2001:43f8:a21:ffff:ffff:ffff:ffff:ffff,SC +2001:43f8:a30::,2001:43f8:a30:ffff:ffff:ffff:ffff:ffff,UG +2001:43f8:a40::,2001:43f8:a40:ffff:ffff:ffff:ffff:ffff,MZ +2001:43f8:a50::,2001:43f8:a50:ffff:ffff:ffff:ffff:ffff,BF +2001:43f8:a60::,2001:43f8:a61:ffff:ffff:ffff:ffff:ffff,LR +2001:43f8:a80::,2001:43f8:a80:ffff:ffff:ffff:ffff:ffff,AO +2001:43f8:a90::,2001:43f8:a90:ffff:ffff:ffff:ffff:ffff,SL +2001:43f8:aa0::,2001:43f8:aa0:ffff:ffff:ffff:ffff:ffff,ZM +2001:43f8:ab0::,2001:43f8:ab0:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:ac0::,2001:43f8:ac0:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:ad0::,2001:43f8:ad0:ffff:ffff:ffff:ffff:ffff,UG +2001:43f8:ae0::,2001:43f8:ae1:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:af0::,2001:43f8:af1:ffff:ffff:ffff:ffff:ffff,BJ +2001:43f8:b10::,2001:43f8:b10:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:b20::,2001:43f8:b20:ffff:ffff:ffff:ffff:ffff,CI +2001:43f8:b30::,2001:43f8:b30:ffff:ffff:ffff:ffff:ffff,MA +2001:43f8:b40::,2001:43f8:b40:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:b50::,2001:43f8:b50:ffff:ffff:ffff:ffff:ffff,BF +2001:43f8:b60::,2001:43f8:b61:ffff:ffff:ffff:ffff:ffff,BF +2001:43f8:b70::,2001:43f8:b70:ffff:ffff:ffff:ffff:ffff,CI +2001:43f8:b80::,2001:43f8:b80:ffff:ffff:ffff:ffff:ffff,TZ +2001:43f8:b90::,2001:43f8:b90:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:ba0::,2001:43f8:ba0:ffff:ffff:ffff:ffff:ffff,TD +2001:43f8:bb0::,2001:43f8:bb1:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:bc0::,2001:43f8:bc0:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:bd0::,2001:43f8:bd0:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:be0::,2001:43f8:be0:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:bf0::,2001:43f8:bf0:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:c00::,2001:43f8:c00:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:c10::,2001:43f8:c10:ffff:ffff:ffff:ffff:ffff,CG +2001:43f8:c20::,2001:43f8:c20:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:c30::,2001:43f8:c30:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:c40::,2001:43f8:c40:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:c50::,2001:43f8:c50:ffff:ffff:ffff:ffff:ffff,EG +2001:43f8:c60::,2001:43f8:c61:ffff:ffff:ffff:ffff:ffff,GN +2001:43f8:c70::,2001:43f8:c70:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:c80::,2001:43f8:c80:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:c90::,2001:43f8:c90:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:ca0::,2001:43f8:ca0:ffff:ffff:ffff:ffff:ffff,CI +2001:43f8:cb0::,2001:43f8:cb0:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:cc0::,2001:43f8:ccf:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:ce0::,2001:43f8:ce0:ffff:ffff:ffff:ffff:ffff,TZ +2001:43f8:cf0::,2001:43f8:cf1:ffff:ffff:ffff:ffff:ffff,SN +2001:43f8:d00::,2001:43f8:d00:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:d10::,2001:43f8:d11:ffff:ffff:ffff:ffff:ffff,TG +2001:43f8:d20::,2001:43f8:d2f:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:d40::,2001:43f8:d40:ffff:ffff:ffff:ffff:ffff,UG +2001:43f8:d50::,2001:43f8:d50:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:d60::,2001:43f8:d60:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:d70::,2001:43f8:d70:ffff:ffff:ffff:ffff:ffff,CM +2001:43f8:d80::,2001:43f8:d80:ffff:ffff:ffff:ffff:ffff,RW +2001:43f8:d90::,2001:43f8:d90:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:da0::,2001:43f8:da0:ffff:ffff:ffff:ffff:ffff,ZM +2001:43f8:db0::,2001:43f8:db0:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:dc0::,2001:43f8:dc0:ffff:ffff:ffff:ffff:ffff,AO +2001:43f8:dd0::,2001:43f8:dd0:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:de0::,2001:43f8:de0:ffff:ffff:ffff:ffff:ffff,GH +2001:43f8:e00::,2001:43f8:eff:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:1000::,2001:43f8:1000:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:1010::,2001:43f8:1010:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:1020::,2001:43f8:1020:ffff:ffff:ffff:ffff:ffff,ZW +2001:43f8:1030::,2001:43f8:1030:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:1040::,2001:43f8:1040:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:1050::,2001:43f8:1050:ffff:ffff:ffff:ffff:ffff,ZA +2001:4400::,2001:4403:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2001:4408::,2001:4408:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:4410::,2001:4410:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2001:4420::,2001:4420:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:4428::,2001:4428:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2001:4430::,2001:4430:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:4438::,2001:4438:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:4450::,2001:4457:ffff:ffff:ffff:ffff:ffff:ffff,PH +2001:4458::,2001:4458:ffff:ffff:ffff:ffff:ffff:ffff,MY +2001:4460::,2001:4460:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:4470::,2001:4470:ffff:ffff:ffff:ffff:ffff:ffff,MY +2001:4478::,2001:447b:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:4480::,2001:4480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2001:4488::,2001:448b:ffff:ffff:ffff:ffff:ffff:ffff,ID +2001:4490::,2001:4493:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:4498::,2001:4498:ffff:ffff:ffff:ffff:ffff:ffff,MY +2001:44a0::,2001:44a0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:44a8::,2001:44a8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:44b0::,2001:44b0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:44b8::,2001:44b8:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:44c0::,2001:44c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:44c8::,2001:44c8:ffff:ffff:ffff:ffff:ffff:ffff,TH +2001:44d0::,2001:44df:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:44f0::,2001:44f0:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:4500::,2001:4500:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:4508::,2001:4508:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:4510::,2001:4517:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:4528::,2001:452b:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:4530::,2001:4530:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2001:4538::,2001:4538:ffff:ffff:ffff:ffff:ffff:ffff,PK +2001:4540::,2001:455f:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:4580::,2001:45bf:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:4600::,2001:4618:bb28:ffff:ffff:ffff:ffff:ffff,NO +2001:4618:bb29::,2001:4618:bb29:7fff:ffff:ffff:ffff:ffff,SE +2001:4618:bb29:8000::,2001:4640:7864:ffff:ffff:ffff:ffff:ffff,NO +2001:4640:7865::,2001:4640:7865:7fff:ffff:ffff:ffff:ffff,US +2001:4640:7865:8000::,2001:4641:666e:ffff:ffff:ffff:ffff:ffff,NO +2001:4641:666f::,2001:4641:666f:7fff:ffff:ffff:ffff:ffff,LV +2001:4641:666f:8000::,2001:4644:3fb8:ffff:ffff:ffff:ffff:ffff,NO +2001:4644:3fb9::,2001:4644:3fb9:7fff:ffff:ffff:ffff:ffff,SE +2001:4644:3fb9:8000::,2001:4644:40cf:ffff:ffff:ffff:ffff:ffff,NO +2001:4644:40d0::,2001:4644:40d0:7fff:ffff:ffff:ffff:ffff,AE +2001:4644:40d0:8000::,2001:4646:39c1:ffff:ffff:ffff:ffff:ffff,NO +2001:4646:39c2::,2001:4646:39c2:7fff:ffff:ffff:ffff:ffff,US +2001:4646:39c2:8000::,2001:464f:2257:ffff:ffff:ffff:ffff:ffff,NO +2001:464f:2258::,2001:464f:2258:7fff:ffff:ffff:ffff:ffff,HU +2001:464f:2258:8000::,2001:46ff:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:4800::,2001:4808:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4810::,2001:4810:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4818::,2001:4818:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:4828::,2001:4828:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4830::,2001:4830:1200:7fff:ffff:ffff:ffff:ffff,US +2001:4830:1200:8000::,2001:4830:1200:ffff:ffff:ffff:ffff:ffff,AU +2001:4830:1201::,2001:4830:121d:ffff:ffff:ffff:ffff:ffff,US +2001:4830:121e::,2001:4830:121e:ffff:ffff:ffff:ffff:ffff,AU +2001:4830:121f::,2001:4830:600f:ffff:ffff:ffff:ffff:ffff,US +2001:4830:6010::,2001:4830:601f:ffff:ffff:ffff:ffff:ffff,GB +2001:4830:6020::,2001:4830:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4838::,2001:4838:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4840::,2001:4840:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4848::,2001:4848:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4850::,2001:4850:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4858::,2001:4858:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4860::,2001:4860:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4868::,2001:4868:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4870::,2001:4871:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4878::,2001:4878:128:ffff:ffff:ffff:ffff:ffff,US +2001:4878:129::,2001:4878:129:ffff:ffff:ffff:ffff:ffff,CR +2001:4878:12a::,2001:4878:203:ffff:ffff:ffff:ffff:ffff,US +2001:4878:204::,2001:4878:204:ffff:ffff:ffff:ffff:ffff,DE +2001:4878:205::,2001:4878:214:ffff:ffff:ffff:ffff:ffff,US +2001:4878:215::,2001:4878:215:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:216::,2001:4878:21f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:220::,2001:4878:220:ffff:ffff:ffff:ffff:ffff,SE +2001:4878:221::,2001:4878:224:ffff:ffff:ffff:ffff:ffff,US +2001:4878:225::,2001:4878:225:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:226::,2001:4878:227:ffff:ffff:ffff:ffff:ffff,US +2001:4878:228::,2001:4878:228:ffff:ffff:ffff:ffff:ffff,IL +2001:4878:229::,2001:4878:233:ffff:ffff:ffff:ffff:ffff,US +2001:4878:234::,2001:4878:234:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:235::,2001:4878:241:ffff:ffff:ffff:ffff:ffff,US +2001:4878:242::,2001:4878:242:ffff:ffff:ffff:ffff:ffff,NL +2001:4878:243::,2001:4878:243:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:244::,2001:4878:245:ffff:ffff:ffff:ffff:ffff,US +2001:4878:246::,2001:4878:246:ffff:ffff:ffff:ffff:ffff,DK +2001:4878:247::,2001:4878:248:ffff:ffff:ffff:ffff:ffff,US +2001:4878:249::,2001:4878:249:ffff:ffff:ffff:ffff:ffff,FR +2001:4878:24a::,2001:4878:24f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:250::,2001:4878:250:ffff:ffff:ffff:ffff:ffff,IT +2001:4878:251::,2001:4878:320:ffff:ffff:ffff:ffff:ffff,US +2001:4878:321::,2001:4878:321:ffff:ffff:ffff:ffff:ffff,SG +2001:4878:322::,2001:4878:322:ffff:ffff:ffff:ffff:ffff,JP +2001:4878:323::,2001:4878:323:ffff:ffff:ffff:ffff:ffff,US +2001:4878:324::,2001:4878:324:ffff:ffff:ffff:ffff:ffff,KR +2001:4878:325::,2001:4878:33f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:340::,2001:4878:340:ffff:ffff:ffff:ffff:ffff,HK +2001:4878:341::,2001:4878:343:ffff:ffff:ffff:ffff:ffff,US +2001:4878:344::,2001:4878:344:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:345::,2001:4878:347:ffff:ffff:ffff:ffff:ffff,US +2001:4878:348::,2001:4878:348:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:349::,2001:4878:2128:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2129::,2001:4878:2129:ffff:ffff:ffff:ffff:ffff,CR +2001:4878:212a::,2001:4878:2203:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2204::,2001:4878:2204:ffff:ffff:ffff:ffff:ffff,DE +2001:4878:2205::,2001:4878:2214:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2215::,2001:4878:2215:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:2216::,2001:4878:221f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2220::,2001:4878:2220:ffff:ffff:ffff:ffff:ffff,SE +2001:4878:2221::,2001:4878:2224:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2225::,2001:4878:2225:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:2226::,2001:4878:2227:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2228::,2001:4878:2228:ffff:ffff:ffff:ffff:ffff,IL +2001:4878:2229::,2001:4878:2233:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2234::,2001:4878:2234:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:2235::,2001:4878:2241:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2242::,2001:4878:2242:ffff:ffff:ffff:ffff:ffff,NL +2001:4878:2243::,2001:4878:2243:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:2244::,2001:4878:2245:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2246::,2001:4878:2246:ffff:ffff:ffff:ffff:ffff,DK +2001:4878:2247::,2001:4878:2248:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2249::,2001:4878:2249:ffff:ffff:ffff:ffff:ffff,FR +2001:4878:224a::,2001:4878:224f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2250::,2001:4878:2250:ffff:ffff:ffff:ffff:ffff,IT +2001:4878:2251::,2001:4878:2320:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2321::,2001:4878:2321:ffff:ffff:ffff:ffff:ffff,SG +2001:4878:2322::,2001:4878:2322:ffff:ffff:ffff:ffff:ffff,JP +2001:4878:2323::,2001:4878:2323:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2324::,2001:4878:2324:ffff:ffff:ffff:ffff:ffff,KR +2001:4878:2325::,2001:4878:233f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2340::,2001:4878:2340:ffff:ffff:ffff:ffff:ffff,HK +2001:4878:2341::,2001:4878:2343:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2344::,2001:4878:2344:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:2345::,2001:4878:2347:ffff:ffff:ffff:ffff:ffff,US +2001:4878:2348::,2001:4878:2348:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:2349::,2001:4878:4128:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4129::,2001:4878:4129:ffff:ffff:ffff:ffff:ffff,CR +2001:4878:412a::,2001:4878:4203:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4204::,2001:4878:4204:ffff:ffff:ffff:ffff:ffff,DE +2001:4878:4205::,2001:4878:4214:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4215::,2001:4878:4215:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:4216::,2001:4878:421f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4220::,2001:4878:4220:ffff:ffff:ffff:ffff:ffff,SE +2001:4878:4221::,2001:4878:4224:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4225::,2001:4878:4225:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:4226::,2001:4878:4227:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4228::,2001:4878:4228:ffff:ffff:ffff:ffff:ffff,IL +2001:4878:4229::,2001:4878:4233:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4234::,2001:4878:4234:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:4235::,2001:4878:4241:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4242::,2001:4878:4242:ffff:ffff:ffff:ffff:ffff,NL +2001:4878:4243::,2001:4878:4243:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:4244::,2001:4878:4245:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4246::,2001:4878:4246:ffff:ffff:ffff:ffff:ffff,DK +2001:4878:4247::,2001:4878:4248:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4249::,2001:4878:4249:ffff:ffff:ffff:ffff:ffff,FR +2001:4878:424a::,2001:4878:424f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4250::,2001:4878:4250:ffff:ffff:ffff:ffff:ffff,IT +2001:4878:4251::,2001:4878:4304:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4305::,2001:4878:4305:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:4306::,2001:4878:4320:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4321::,2001:4878:4321:ffff:ffff:ffff:ffff:ffff,SG +2001:4878:4322::,2001:4878:4322:ffff:ffff:ffff:ffff:ffff,JP +2001:4878:4323::,2001:4878:4323:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4324::,2001:4878:4324:ffff:ffff:ffff:ffff:ffff,KR +2001:4878:4325::,2001:4878:433f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4340::,2001:4878:4340:ffff:ffff:ffff:ffff:ffff,HK +2001:4878:4341::,2001:4878:4343:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4344::,2001:4878:4344:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:4345::,2001:4878:4347:ffff:ffff:ffff:ffff:ffff,US +2001:4878:4348::,2001:4878:4348:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:4349::,2001:4878:8128:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8129::,2001:4878:8129:ffff:ffff:ffff:ffff:ffff,CR +2001:4878:812a::,2001:4878:8203:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8204::,2001:4878:8204:ffff:ffff:ffff:ffff:ffff,DE +2001:4878:8205::,2001:4878:8214:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8215::,2001:4878:8215:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:8216::,2001:4878:8216:7fff:ffff:ffff:ffff:ffff,FR +2001:4878:8216:8000::,2001:4878:8216:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8217::,2001:4878:8217:7fff:ffff:ffff:ffff:ffff,ES +2001:4878:8217:8000::,2001:4878:821f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8220::,2001:4878:8220:ffff:ffff:ffff:ffff:ffff,SE +2001:4878:8221::,2001:4878:8224:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8225::,2001:4878:8225:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:8226::,2001:4878:8227:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8228::,2001:4878:8228:ffff:ffff:ffff:ffff:ffff,IL +2001:4878:8229::,2001:4878:8233:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8234::,2001:4878:8234:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:8235::,2001:4878:8241:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8242::,2001:4878:8242:ffff:ffff:ffff:ffff:ffff,NL +2001:4878:8243::,2001:4878:8243:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:8244::,2001:4878:8245:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8246::,2001:4878:8246:ffff:ffff:ffff:ffff:ffff,DK +2001:4878:8247::,2001:4878:8248:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8249::,2001:4878:8249:ffff:ffff:ffff:ffff:ffff,FR +2001:4878:824a::,2001:4878:824f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8250::,2001:4878:8250:ffff:ffff:ffff:ffff:ffff,IT +2001:4878:8251::,2001:4878:8304:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8305::,2001:4878:8305:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:8306::,2001:4878:8320:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8321::,2001:4878:8321:ffff:ffff:ffff:ffff:ffff,SG +2001:4878:8322::,2001:4878:8322:ffff:ffff:ffff:ffff:ffff,JP +2001:4878:8323::,2001:4878:8323:ffff:ffff:ffff:ffff:ffff,AU +2001:4878:8324::,2001:4878:8324:ffff:ffff:ffff:ffff:ffff,KR +2001:4878:8325::,2001:4878:833f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8340::,2001:4878:8340:ffff:ffff:ffff:ffff:ffff,HK +2001:4878:8341::,2001:4878:8343:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8344::,2001:4878:8344:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:8345::,2001:4878:8346:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8347::,2001:4878:8347:7fff:ffff:ffff:ffff:ffff,HK +2001:4878:8347:8000::,2001:4878:8347:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8348::,2001:4878:8348:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:8349::,2001:4878:a128:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a129::,2001:4878:a129:ffff:ffff:ffff:ffff:ffff,CR +2001:4878:a12a::,2001:4878:a203:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a204::,2001:4878:a204:ffff:ffff:ffff:ffff:ffff,DE +2001:4878:a205::,2001:4878:a214:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a215::,2001:4878:a215:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:a216::,2001:4878:a21f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a220::,2001:4878:a220:ffff:ffff:ffff:ffff:ffff,SE +2001:4878:a221::,2001:4878:a224:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a225::,2001:4878:a225:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:a226::,2001:4878:a227:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a228::,2001:4878:a228:ffff:ffff:ffff:ffff:ffff,IL +2001:4878:a229::,2001:4878:a233:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a234::,2001:4878:a234:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:a235::,2001:4878:a241:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a242::,2001:4878:a242:ffff:ffff:ffff:ffff:ffff,NL +2001:4878:a243::,2001:4878:a243:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:a244::,2001:4878:a245:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a246::,2001:4878:a246:ffff:ffff:ffff:ffff:ffff,DK +2001:4878:a247::,2001:4878:a248:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a249::,2001:4878:a249:ffff:ffff:ffff:ffff:ffff,FR +2001:4878:a24a::,2001:4878:a24f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a250::,2001:4878:a250:ffff:ffff:ffff:ffff:ffff,IT +2001:4878:a251::,2001:4878:a304:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a305::,2001:4878:a305:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:a306::,2001:4878:a320:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a321::,2001:4878:a321:ffff:ffff:ffff:ffff:ffff,SG +2001:4878:a322::,2001:4878:a322:ffff:ffff:ffff:ffff:ffff,JP +2001:4878:a323::,2001:4878:a323:ffff:ffff:ffff:ffff:ffff,AU +2001:4878:a324::,2001:4878:a324:ffff:ffff:ffff:ffff:ffff,KR +2001:4878:a325::,2001:4878:a33f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a340::,2001:4878:a340:ffff:ffff:ffff:ffff:ffff,HK +2001:4878:a341::,2001:4878:a343:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a344::,2001:4878:a344:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:a345::,2001:4878:a347:ffff:ffff:ffff:ffff:ffff,US +2001:4878:a348::,2001:4878:a348:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:a349::,2001:4878:c128:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c129::,2001:4878:c129:ffff:ffff:ffff:ffff:ffff,CR +2001:4878:c12a::,2001:4878:c203:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c204::,2001:4878:c204:ffff:ffff:ffff:ffff:ffff,DE +2001:4878:c205::,2001:4878:c214:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c215::,2001:4878:c215:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:c216::,2001:4878:c21f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c220::,2001:4878:c220:ffff:ffff:ffff:ffff:ffff,SE +2001:4878:c221::,2001:4878:c224:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c225::,2001:4878:c225:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:c226::,2001:4878:c227:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c228::,2001:4878:c228:ffff:ffff:ffff:ffff:ffff,IL +2001:4878:c229::,2001:4878:c233:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c234::,2001:4878:c234:ffff:ffff:ffff:ffff:ffff,GB +2001:4878:c235::,2001:4878:c241:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c242::,2001:4878:c242:ffff:ffff:ffff:ffff:ffff,NL +2001:4878:c243::,2001:4878:c243:ffff:ffff:ffff:ffff:ffff,PL +2001:4878:c244::,2001:4878:c245:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c246::,2001:4878:c246:ffff:ffff:ffff:ffff:ffff,DK +2001:4878:c247::,2001:4878:c248:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c249::,2001:4878:c249:ffff:ffff:ffff:ffff:ffff,FR +2001:4878:c24a::,2001:4878:c24f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c250::,2001:4878:c250:ffff:ffff:ffff:ffff:ffff,IT +2001:4878:c251::,2001:4878:c304:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c305::,2001:4878:c305:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:c306::,2001:4878:c320:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c321::,2001:4878:c321:ffff:ffff:ffff:ffff:ffff,SG +2001:4878:c322::,2001:4878:c322:ffff:ffff:ffff:ffff:ffff,JP +2001:4878:c323::,2001:4878:c323:ffff:ffff:ffff:ffff:ffff,AU +2001:4878:c324::,2001:4878:c324:ffff:ffff:ffff:ffff:ffff,KR +2001:4878:c325::,2001:4878:c33f:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c340::,2001:4878:c340:ffff:ffff:ffff:ffff:ffff,HK +2001:4878:c341::,2001:4878:c343:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c344::,2001:4878:c344:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:c345::,2001:4878:c347:ffff:ffff:ffff:ffff:ffff,US +2001:4878:c348::,2001:4878:c348:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:c349::,2001:4878:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4888::,2001:4888:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4890::,2001:4890:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4898::,2001:4898:e80f:ffff:ffff:ffff:ffff:ffff,US +2001:4898:e810::,2001:4898:e810:ffff:ffff:ffff:ffff:ffff,BR +2001:4898:e811::,2001:489a:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48a0::,2001:48a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48a8::,2001:48a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48b0::,2001:48b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48b8::,2001:48b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48c0::,2001:48c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48c8::,2001:48c8:6:ffff:ffff:ffff:ffff:ffff,US +2001:48c8:7::,2001:48c8:7:ffff:ffff:ffff:ffff:ffff,NL +2001:48c8:8::,2001:48c8:f:ffff:ffff:ffff:ffff:ffff,US +2001:48c8:10::,2001:48c8:10:ffff:ffff:ffff:ffff:ffff,SG +2001:48c8:11::,2001:48c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48d0::,2001:48d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48d8::,2001:48d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48e0::,2001:48e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48e8::,2001:48e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48f8::,2001:48f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4900::,2001:4900:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:4908::,2001:4908:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4910::,2001:4910:ffff:ffff:ffff:ffff:ffff:ffff,BM +2001:4918::,2001:4918:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4920::,2001:4920:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4928::,2001:4928:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4930::,2001:4930:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4938::,2001:4938:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:4940::,2001:4940:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4948::,2001:4948:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4950::,2001:4950:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4958::,2001:4958:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:4960::,2001:4960:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4968::,2001:4968:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4970::,2001:4970:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4978::,2001:4978:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4980::,2001:4980:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4988::,2001:4988:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4990::,2001:4990:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4998::,2001:4998:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49a0::,2001:49a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49a8::,2001:49a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49b0::,2001:49b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49b8::,2001:49b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49c0::,2001:49c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49c8::,2001:49c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49d0::,2001:49d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49d8::,2001:49d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49e0::,2001:49e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49e8::,2001:49e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49f0::,2001:49f0:d001:f:ffff:ffff:ffff:ffff,US +2001:49f0:d001:10::,2001:49f0:d001:10:ffff:ffff:ffff:ffff,CA +2001:49f0:d001:11::,2001:49f0:d001:11:ffff:ffff:ffff:ffff,BR +2001:49f0:d001:12::,2001:49f0:d001:12:ffff:ffff:ffff:ffff,MX +2001:49f0:d001:13::,2001:49f0:d001:13:ffff:ffff:ffff:ffff,JP +2001:49f0:d001:14::,2001:49f0:d001:14:ffff:ffff:ffff:ffff,AU +2001:49f0:d001:15::,2001:49f0:d006:ffff:ffff:ffff:ffff:ffff,US +2001:49f0:d007::,2001:49f0:d007:15:ffff:ffff:ffff:ffff,GB +2001:49f0:d007:16::,2001:49f0:d007:16:ffff:ffff:ffff:ffff,US +2001:49f0:d007:17::,2001:49f0:d007:17:ffff:ffff:ffff:ffff,IT +2001:49f0:d007:18::,2001:49f0:d007:18:ffff:ffff:ffff:ffff,IE +2001:49f0:d007:19::,2001:49f0:d007:19:ffff:ffff:ffff:ffff,FR +2001:49f0:d007:1a::,2001:49f0:d007:1f:ffff:ffff:ffff:ffff,GB +2001:49f0:d007:20::,2001:49f0:d007:20:ffff:ffff:ffff:ffff,TH +2001:49f0:d007:21::,2001:49f0:d007:ffff:ffff:ffff:ffff:ffff,GB +2001:49f0:d008::,2001:49f0:d01d:ffff:ffff:ffff:ffff:ffff,US +2001:49f0:d01e::,2001:49f0:d01e:ffff:ffff:ffff:ffff:ffff,ES +2001:49f0:d01f::,2001:49f0:d01f:ffff:ffff:ffff:ffff:ffff,DE +2001:49f0:d020::,2001:49f0:d022:ffff:ffff:ffff:ffff:ffff,US +2001:49f0:d023::,2001:49f0:d024:ffff:ffff:ffff:ffff:ffff,NL +2001:49f0:d025::,2001:49f0:d02d:3:ffff:ffff:ffff:ffff,US +2001:49f0:d02d:4::,2001:49f0:d02d:4:ffff:ffff:ffff:ffff,NL +2001:49f0:d02d:5::,2001:49f0:d02d:5:ffff:ffff:ffff:ffff,US +2001:49f0:d02d:6::,2001:49f0:d02d:6:ffff:ffff:ffff:ffff,IN +2001:49f0:d02d:7::,2001:49f0:d02d:7:ffff:ffff:ffff:ffff,SE +2001:49f0:d02d:8::,2001:49f0:d02d:8:ffff:ffff:ffff:ffff,ES +2001:49f0:d02d:9::,2001:49f0:d02d:9:ffff:ffff:ffff:ffff,DE +2001:49f0:d02d:a::,2001:49f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:49f8::,2001:49f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4a00::,2001:4a1f:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4b00::,2001:4b07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:4b08::,2001:4b08:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4b10::,2001:4b17:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4b18::,2001:4b18:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:4b20::,2001:4b28:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:4b30::,2001:4b37:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:4b38::,2001:4b3f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4b40::,2001:4b40:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:4b48::,2001:4b48:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4b50::,2001:4b57:ffff:ffff:ffff:ffff:ffff:ffff,BE +2001:4b58::,2001:4b58:ffff:ffff:ffff:ffff:ffff:ffff,BG +2001:4b60::,2001:4b60:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:4b68::,2001:4b6f:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:4b70::,2001:4b7f:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:4b80::,2001:4b87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:4b88::,2001:4b88:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4b90::,2001:4b90:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:4b98::,2001:4b98:dc2:7fff:ffff:ffff:ffff:ffff,FR +2001:4b98:dc2:8000::,2001:4b98:dc2:ffff:ffff:ffff:ffff:ffff,LU +2001:4b98:dc3::,2001:4b9f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:4ba0::,2001:4ba7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4ba8::,2001:4baf:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:4bb0::,2001:4bb0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:4bb8::,2001:4bb8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:4bc0::,2001:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4bc8::,2001:4bcf:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:4bd0::,2001:4bd0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4bd8::,2001:4bdf:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4be0::,2001:4be0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:4be8::,2001:4be8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4bf0::,2001:4bf0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4bf8::,2001:4bf8:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:4c00::,2001:4c07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:4c08::,2001:4c08:2000:ffff:ffff:ffff:ffff:ffff,GB +2001:4c08:2001::,2001:4c08:2001:7fff:ffff:ffff:ffff:ffff,NL +2001:4c08:2001:8000::,2001:4c08:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4c10::,2001:4c10:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4c20::,2001:4c20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4c28::,2001:4c28:3000:632:107:167:111:91,NO +2001:4c28:3000:632:107:167:111:92,2001:4c28:3000:632:107:167:111:92,IN +2001:4c28:3000:632:107:167:111:93,2001:4c28:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:4c30::,2001:4c30:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4c38::,2001:4c3f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4c40::,2001:4c40:ffff:ffff:ffff:ffff:ffff:ffff,BE +2001:4c48::,2001:4c4f:ffff:ffff:ffff:ffff:ffff:ffff,HU +2001:4c50::,2001:4c57:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4c58::,2001:4c5f:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4c60::,2001:4c60:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:4c68::,2001:4c68:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4c70::,2001:4c70:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4c78::,2001:4c78:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:4c80::,2001:4c80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4c88::,2001:4c88:ffff:ffff:ffff:ffff:ffff:ffff,IR +2001:4c90::,2001:4c97:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:4c98::,2001:4c98:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4ca0::,2001:4ca8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4cb0::,2001:4cb0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4cb8::,2001:4cbf:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4cc0::,2001:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,PT +2001:4cc8::,2001:4cc8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:4cd0::,2001:4cd0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2001:4cd8::,2001:4cd8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4ce0::,2001:4cf8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4d00::,2001:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AM +2001:4d08::,2001:4d08:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4d10::,2001:4d10:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:4d18::,2001:4d18:ffff:ffff:ffff:ffff:ffff:ffff,RO +2001:4d20::,2001:4d20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4d30::,2001:4d30:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4d38::,2001:4d38:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:4d48::,2001:4d4f:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4d50::,2001:4d50:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4d60::,2001:4d60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4d68::,2001:4d68:ffff:ffff:ffff:ffff:ffff:ffff,IE +2001:4d70::,2001:4d70:ffff:ffff:ffff:ffff:ffff:ffff,BG +2001:4d78::,2001:4d78:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4d80::,2001:4d80:ffff:ffff:ffff:ffff:ffff:ffff,RO +2001:4d88::,2001:4d8f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4d98::,2001:4d98:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:4da8::,2001:4da8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:4db0::,2001:4db0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4db8::,2001:4db8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:4dc0::,2001:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4dc8::,2001:4dc8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4dd0::,2001:4dd7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4dd8::,2001:4dd8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:4de0::,2001:4de0:4ff:ffff:ffff:ffff:ffff:ffff,NL +2001:4de0:500::,2001:4de0:5ff:ffff:ffff:ffff:ffff:ffff,SE +2001:4de0:600::,2001:4de0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4de8::,2001:4de8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:4df0::,2001:4df0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2001:5000::,2001:57ff:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:8000::,2001:8003:a105:93ff:ffff:ffff:ffff:ffff,AU +2001:8003:a105:9400::,2001:8003:a105:97ff:ffff:ffff:ffff:ffff,IN +2001:8003:a105:9800::,2001:8fff:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:a000::,2001:a7ff:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:b000::,2001:b011:380b:fff:ffff:ffff:ffff:ffff,TW +2001:b011:380b:1000::,2001:b011:380b:17ff:ffff:ffff:ffff:ffff,US +2001:b011:380b:1800::,2001:b7ff:ffff:ffff:ffff:ffff:ffff:ffff,TW +2003::,2003:6:1725:7fff:ffff:ffff:ffff:ffff,DE +2003:6:1725:8000::,2003:6:1725:ffff:ffff:ffff:ffff:ffff,US +2003:6:1726::,2003:42:2e35:ffff:ffff:ffff:ffff:ffff,DE +2003:42:2e36::,2003:42:2e36:7fff:ffff:ffff:ffff:ffff,ES +2003:42:2e36:8000::,2003:43:ae20:ffff:ffff:ffff:ffff:ffff,DE +2003:43:ae21::,2003:43:ae21:7fff:ffff:ffff:ffff:ffff,CH +2003:43:ae21:8000::,2003:52:ef50:7fff:ffff:ffff:ffff:ffff,DE +2003:52:ef50:8000::,2003:52:ef50:ffff:ffff:ffff:ffff:ffff,AT +2003:52:ef51::,2003:57:e508:bfff:ffff:ffff:ffff:ffff,DE +2003:57:e508:c000::,2003:57:e508:ffff:ffff:ffff:ffff:ffff,US +2003:57:e509::,2003:5c:ac42:7fff:ffff:ffff:ffff:ffff,DE +2003:5c:ac42:8000::,2003:5c:ac42:ffff:ffff:ffff:ffff:ffff,IT +2003:5c:ac43::,2003:63:2a36:bfff:ffff:ffff:ffff:ffff,DE +2003:63:2a36:c000::,2003:63:2a36:ffff:ffff:ffff:ffff:ffff,KW +2003:63:2a37::,2003:63:2a72:ffff:ffff:ffff:ffff:ffff,DE +2003:63:2a73::,2003:63:2a73:7fff:ffff:ffff:ffff:ffff,US +2003:63:2a73:8000::,2003:63:2e34:ffff:ffff:ffff:ffff:ffff,DE +2003:63:2e35::,2003:63:2e35:7fff:ffff:ffff:ffff:ffff,AT +2003:63:2e35:8000::,2003:68:ea18:ffff:ffff:ffff:ffff:ffff,DE +2003:68:ea19::,2003:68:ea19:7fff:ffff:ffff:ffff:ffff,CH +2003:68:ea19:8000::,2003:6a:6c7d:7fff:ffff:ffff:ffff:ffff,DE +2003:6a:6c7d:8000::,2003:6a:6c7d:ffff:ffff:ffff:ffff:ffff,GB +2003:6a:6c7e::,2003:6b:e08:ffff:ffff:ffff:ffff:ffff,DE +2003:6b:e09::,2003:6b:e09:7fff:ffff:ffff:ffff:ffff,CH +2003:6b:e09:8000::,2003:70:ce46:ffff:ffff:ffff:ffff:ffff,DE +2003:70:ce47::,2003:70:ce47:7fff:ffff:ffff:ffff:ffff,NL +2003:70:ce47:8000::,2003:75:f0d:ffff:ffff:ffff:ffff:ffff,DE +2003:75:f0e::,2003:75:f0e:7fff:ffff:ffff:ffff:ffff,US +2003:75:f0e:8000::,2003:75:2e35:5fff:ffff:ffff:ffff:ffff,DE +2003:75:2e35:6000::,2003:75:2e35:7fff:ffff:ffff:ffff:ffff,US +2003:75:2e35:8000::,2003:76:2f2c:ffff:ffff:ffff:ffff:ffff,DE +2003:76:2f2d::,2003:76:2f2d:7fff:ffff:ffff:ffff:ffff,NL +2003:76:2f2d:8000::,2003:76:2f50:7fff:ffff:ffff:ffff:ffff,DE +2003:76:2f50:8000::,2003:76:2f50:ffff:ffff:ffff:ffff:ffff,NL +2003:76:2f51::,2003:78:cf69:ffff:ffff:ffff:ffff:ffff,DE +2003:78:cf6a::,2003:78:cf6a:7fff:ffff:ffff:ffff:ffff,AT +2003:78:cf6a:8000::,2003:86:a749:ffff:ffff:ffff:ffff:ffff,DE +2003:86:a74a::,2003:86:a74a:7fff:ffff:ffff:ffff:ffff,AT +2003:86:a74a:8000::,2003:c2:5bc3:ffff:ffff:ffff:ffff:ffff,DE +2003:c2:5bc4::,2003:c2:5bc4:7fff:ffff:ffff:ffff:ffff,IT +2003:c2:5bc4:8000::,2003:c6:43d5:ffff:ffff:ffff:ffff:ffff,DE +2003:c6:43d6::,2003:c6:43d6:7fff:ffff:ffff:ffff:ffff,US +2003:c6:43d6:8000::,2003:c8:cbc5:ffff:ffff:ffff:ffff:ffff,DE +2003:c8:cbc6::,2003:c8:cbc6:7fff:ffff:ffff:ffff:ffff,CH +2003:c8:cbc6:8000::,2003:d2:93ec:7fff:ffff:ffff:ffff:ffff,DE +2003:d2:93ec:8000::,2003:d2:93ec:ffff:ffff:ffff:ffff:ffff,DK +2003:d2:93ed::,2003:da:6bdd:7fff:ffff:ffff:ffff:ffff,DE +2003:da:6bdd:8000::,2003:da:6bdd:ffff:ffff:ffff:ffff:ffff,US +2003:da:6bde::,2003:dd:1bc3:7fff:ffff:ffff:ffff:ffff,DE +2003:dd:1bc3:8000::,2003:dd:1bc3:ffff:ffff:ffff:ffff:ffff,GB +2003:dd:1bc4::,2003:e3:dbce:7fff:ffff:ffff:ffff:ffff,DE +2003:e3:dbce:8000::,2003:e3:dbce:ffff:ffff:ffff:ffff:ffff,HU +2003:e3:dbcf::,2003:1fff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2067:8e00::,2067:8e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2160:150::,2160:150:7fff:ffff:ffff:ffff:ffff:ffff,US +2400::,2400:fff:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:1000::,2400:1000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:1040::,2400:1040:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:10c0::,2400:10c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:1100::,2400:1100:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:1140::,2400:1140:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:11c0::,2400:11c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:1200::,2400:1200:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:1240::,2400:1240:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:12c0::,2400:12c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1300::,2400:1300:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:1340::,2400:1340:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1380::,2400:1380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:13c0::,2400:13c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:1400::,2400:1400:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:1440::,2400:1440:ffff:ffff:ffff:ffff:ffff:ffff,BT +2400:1480::,2400:1480:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:14c0::,2400:14c0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:1500::,2400:1500:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:1540::,2400:1540:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:1580::,2400:1580:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:15c0::,2400:15c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1600::,2400:1600:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:1640::,2400:1640:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1680::,2400:1680:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:16c0::,2400:16c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1700::,2400:1700:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:1740::,2400:1740:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:17c0::,2400:17c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1800::,2400:1800:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:1840::,2400:1840:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1880::,2400:1880:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:18c0::,2400:18c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1900::,2400:1900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:1940::,2400:1940:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1980::,2400:1980:ffff:ffff:ffff:ffff:ffff:ffff,AF +2400:19c0::,2400:19c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1a00::,2400:1a00:ffff:ffff:ffff:ffff:ffff:ffff,NP +2400:1a40::,2400:1a40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1a80::,2400:1a80:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:1ac0::,2400:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1b00::,2400:1b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:1b40::,2400:1b40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1b80::,2400:1b80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:1bc0::,2400:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:1c00::,2400:1c00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:1c40::,2400:1c40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:1c80::,2400:1c80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:1cc0::,2400:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1d00::,2400:1d00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:1d40::,2400:1d40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1d80::,2400:1d80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:1dc0::,2400:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1e00::,2400:1e00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:1e40::,2400:1e40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1e80::,2400:1e80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:1ec0::,2400:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1f00::,2400:1f00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:1f40::,2400:1f40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:1f80::,2400:1f80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:1fc0::,2400:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:2000::,2400:2410:3c1:fff:ffff:ffff:ffff:ffff,JP +2400:2410:3c1:1000::,2400:2410:3c1:1fff:ffff:ffff:ffff:ffff,US +2400:2410:3c1:2000::,2400:2411:91c2:23ff:ffff:ffff:ffff:ffff,JP +2400:2411:91c2:2400::,2400:2411:91c2:27ff:ffff:ffff:ffff:ffff,US +2400:2411:91c2:2800::,2400:2412:27a1:bfff:ffff:ffff:ffff:ffff,JP +2400:2412:27a1:c000::,2400:2412:27a1:ffff:ffff:ffff:ffff:ffff,US +2400:2412:27a2::,2400:2652:719f:ffff:ffff:ffff:ffff:ffff,JP +2400:2652:71a0::,2400:2652:71a0:7fff:ffff:ffff:ffff:ffff,NO +2400:2652:71a0:8000::,2400:2653:282:7fff:ffff:ffff:ffff:ffff,JP +2400:2653:282:8000::,2400:2653:282:ffff:ffff:ffff:ffff:ffff,CA +2400:2653:283::,2400:2653:3c0:7fff:ffff:ffff:ffff:ffff,JP +2400:2653:3c0:8000::,2400:2653:3c0:ffff:ffff:ffff:ffff:ffff,US +2400:2653:3c1::,2400:2653:a1a1:ffff:ffff:ffff:ffff:ffff,JP +2400:2653:a1a2::,2400:2653:a1a2:7fff:ffff:ffff:ffff:ffff,US +2400:2653:a1a2:8000::,2400:3000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:3040::,2400:3040:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3080::,2400:3080:ffff:ffff:ffff:ffff:ffff:ffff,AF +2400:30c0::,2400:30c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2400:3100::,2400:3100:ffff:ffff:ffff:ffff:ffff:ffff,VU +2400:3140::,2400:3140:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3180::,2400:3180:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:31c0::,2400:31c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3200::,2400:3200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3240::,2400:3240:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:3280::,2400:3280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:32c0::,2400:32c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3300::,2400:3300:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:3340::,2400:3340:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3380::,2400:3380:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:33c0::,2400:33c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3400::,2400:3400:ffff:ffff:ffff:ffff:ffff:ffff,VU +2400:3440::,2400:3440:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3480::,2400:3480:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:34c0::,2400:34c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3500::,2400:3500:ffff:ffff:ffff:ffff:ffff:ffff,TV +2400:3540::,2400:3540:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3580::,2400:3580:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:35c0::,2400:35c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3600::,2400:3600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3640::,2400:3640:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3680::,2400:3680:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:36c0::,2400:36c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3740::,2400:3740:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:37c0::,2400:37c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:3800::,2400:3800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:3840::,2400:3840:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:3880::,2400:3880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:38c0::,2400:38c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3900::,2400:3900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:3940::,2400:3940:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:3980::,2400:3980:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:39c0::,2400:39c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3a00::,2400:3a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3a40::,2400:3a40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3a80::,2400:3a80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:3ac0::,2400:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:3b00::,2400:3b00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:3b40::,2400:3b40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3b80::,2400:3b80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:3bc0::,2400:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3c00::,2400:3c03:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:3c40::,2400:3c40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3c80::,2400:3c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:3cc0::,2400:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3d00::,2400:3d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:3d40::,2400:3d40:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:3d80::,2400:3d80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:3dc0::,2400:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:3e00::,2400:3e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3e40::,2400:3e40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:3e80::,2400:3e80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:3ec0::,2400:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:3f00::,2400:3f00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:3f40::,2400:3f40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:3f80::,2400:3f80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:3fc0::,2400:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:4000::,2400:402d:a2d8:ffff:ffff:ffff:ffff:ffff,JP +2400:402d:a2d9::,2400:402d:a2d9:7fff:ffff:ffff:ffff:ffff,US +2400:402d:a2d9:8000::,2400:402e:9fba:7fff:ffff:ffff:ffff:ffff,JP +2400:402e:9fba:8000::,2400:402e:9fba:ffff:ffff:ffff:ffff:ffff,MY +2400:402e:9fbb::,2400:402e:abad:2bff:ffff:ffff:ffff:ffff,JP +2400:402e:abad:2c00::,2400:402e:abad:2cff:ffff:ffff:ffff:ffff,US +2400:402e:abad:2d00::,2400:4120:aa50:ffff:ffff:ffff:ffff:ffff,JP +2400:4120:aa51::,2400:4120:aa51:7fff:ffff:ffff:ffff:ffff,BR +2400:4120:aa51:8000::,2400:4122:8b5d:ffff:ffff:ffff:ffff:ffff,JP +2400:4122:8b5e::,2400:4122:8b5e:7fff:ffff:ffff:ffff:ffff,CO +2400:4122:8b5e:8000::,2400:4136:9f46:ffff:ffff:ffff:ffff:ffff,JP +2400:4136:9f47::,2400:4136:9f47:7fff:ffff:ffff:ffff:ffff,DE +2400:4136:9f47:8000::,2400:43ff:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:4400::,2400:4400:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:4440::,2400:4440:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:4480::,2400:4480:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:44c0::,2400:44c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:4500::,2400:4500:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:4540::,2400:4540:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:4580::,2400:4580:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:45c0::,2400:45c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:4600::,2400:4600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:4640::,2400:4640:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:4680::,2400:4680:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:46c0::,2400:46c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:4700::,2400:4700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:4740::,2400:4740:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:4780::,2400:4780:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:47c0::,2400:47c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:4800::,2400:4800:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:4840::,2400:4840:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:4880::,2400:4880:ffff:ffff:ffff:ffff:ffff:ffff,KH +2400:48c0::,2400:48c0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:4900::,2400:4900:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:4940::,2400:4940:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:4980::,2400:4980:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:49c0::,2400:49c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:4a00::,2400:4a00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:4a40::,2400:4a40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:4a80::,2400:4a80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:4ac0::,2400:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:4b00::,2400:4b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:4b40::,2400:4b40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:4b80::,2400:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:4bc0::,2400:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:4c00::,2400:4c00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:4c40::,2400:4c40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:4c80::,2400:4c80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:4cc0::,2400:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:4d00::,2400:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:4d40::,2400:4d40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:4dc0::,2400:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:4e00::,2400:4e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:4e40::,2400:4e40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:4e80::,2400:4e80:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:4ec0::,2400:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:4f00::,2400:4f00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:4f40::,2400:4f40:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:4fc0::,2400:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:5000::,2400:5000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:5040::,2400:5040:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:5080::,2400:5080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:50c0::,2400:50c0:ffff:ffff:ffff:ffff:ffff:ffff,BT +2400:5100::,2400:5100:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:5140::,2400:5140:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:5180::,2400:5180:ffff:ffff:ffff:ffff:ffff:ffff,AF +2400:51c0::,2400:51c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:5200::,2400:5200:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:5240::,2400:5240:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:5280::,2400:5280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:52c0::,2400:52c0:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:5300::,2400:5300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:5340::,2400:5340:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:5380::,2400:5380:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:53c0::,2400:53c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:5400::,2400:5400:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5440::,2400:5440:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:5480::,2400:5480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:54c0::,2400:54c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:5500::,2400:5500:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:5540::,2400:5540:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:5580::,2400:5580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:55c0::,2400:55c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5600::,2400:5600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5640::,2400:5640:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5680::,2400:5680:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:56c0::,2400:56c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5700::,2400:5700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:5740::,2400:5740:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:5780::,2400:5780:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:57c0::,2400:57c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5800::,2400:5800:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:5840::,2400:5840:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5880::,2400:5880:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:58c0::,2400:58c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:5900::,2400:5900:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:5940::,2400:5940:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:59c0::,2400:59c0:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:5a00::,2400:5a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5a40::,2400:5a40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5a80::,2400:5a80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:5ac0::,2400:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5b40::,2400:5b40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5b80::,2400:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:5bc0::,2400:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5c40::,2400:5c40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5c80::,2400:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5cc0::,2400:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5d00::,2400:5d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:5d40::,2400:5d40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:5d80::,2400:5d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:5dc0::,2400:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:5e00::,2400:5e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:5e40::,2400:5e40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:5e80::,2400:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:5ec0::,2400:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:5f00::,2400:5f00:ffff:ffff:ffff:ffff:ffff:ffff,PF +2400:5f40::,2400:5f40:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:5f80::,2400:5f80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:5fc0::,2400:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6000::,2400:6000:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6040::,2400:6040:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6080::,2400:6080:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:60c0::,2400:60c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6100::,2400:6100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:6140::,2400:6140:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:6180::,2400:6180:ff:ffff:ffff:ffff:ffff:ffff,SG +2400:6180:100::,2400:6180:100:7fff:ffff:ffff:ffff:ffff,IN +2400:6180:100:8000::,2400:6180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:61c0::,2400:61c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6200::,2400:6200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6240::,2400:6240:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:6280::,2400:6280:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:62c0::,2400:62c0:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:6300::,2400:6300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:6340::,2400:6340:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:6380::,2400:6380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:63c0::,2400:63c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:6400::,2400:6400:ffff:ffff:ffff:ffff:ffff:ffff,TO +2400:6440::,2400:6440:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:6480::,2400:6480:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:64c0::,2400:64c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:6500::,2400:6500::70ff:ffff:ffff:ffff:ffff,SG +2400:6500:0:7100::,2400:6500::71ff:ffff:ffff:ffff:ffff,JP +2400:6500:0:7200::,2400:6500::72ff:ffff:ffff:ffff:ffff,AU +2400:6500:0:7300::,2400:6500::73ff:ffff:ffff:ffff:ffff,SG +2400:6500:0:7400::,2400:6500::74ff:ffff:ffff:ffff:ffff,KR +2400:6500:0:7500::,2400:6500::75ff:ffff:ffff:ffff:ffff,IN +2400:6500:0:7600::,2400:6500:100:70ff:ffff:ffff:ffff:ffff,SG +2400:6500:100:7100::,2400:6500:100:72ff:ffff:ffff:ffff:ffff,CN +2400:6500:100:7300::,2400:6500:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:6540::,2400:6540:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:6580::,2400:6580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:65c0::,2400:65c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:6600::,2400:6600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6640::,2400:6640:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6680::,2400:6680:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:66c0::,2400:66c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6700::,2400:6700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:6740::,2400:6740:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6780::,2400:6780:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:67c0::,2400:67c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6800::,2400:6800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:6840::,2400:6840:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6880::,2400:6880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:68c0::,2400:68c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6900::,2400:6900:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:6940::,2400:6940:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6980::,2400:6980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:69c0::,2400:69c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6a00::,2400:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6a40::,2400:6a40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6a80::,2400:6a80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:6ac0::,2400:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6b00::,2400:6b00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:6b40::,2400:6b40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6b80::,2400:6b80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:6bc0::,2400:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6c00::,2400:6c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:6c40::,2400:6c40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6c80::,2400:6c80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:6cc0::,2400:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6d00::,2400:6d00:ffff:ffff:ffff:ffff:ffff:ffff,FJ +2400:6d40::,2400:6d40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6d80::,2400:6d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:6dc0::,2400:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6e00::,2400:6e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6e40::,2400:6e40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6e80::,2400:6e80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:6ec0::,2400:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6f00::,2400:6f00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:6f40::,2400:6f40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6f80::,2400:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:6fc0::,2400:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7000::,2400:7000:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:7040::,2400:7040:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7080::,2400:7080:ffff:ffff:ffff:ffff:ffff:ffff,NP +2400:70c0::,2400:70c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:7100::,2400:7100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7140::,2400:7140:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7180::,2400:7180:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:71c0::,2400:71c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7200::,2400:7200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7240::,2400:7240:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:72c0::,2400:72c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7300::,2400:7300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:7340::,2400:7340:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7380::,2400:7380:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:73c0::,2400:73c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7400::,2400:7400:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:7440::,2400:7440:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7480::,2400:7480:ffff:ffff:ffff:ffff:ffff:ffff,MN +2400:74c0::,2400:74c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7500::,2400:7500:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:7540::,2400:7540:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:75c0::,2400:75c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7600::,2400:7600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:7640::,2400:7640:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7680::,2400:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:76c0::,2400:76c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7700::,2400:7700:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:7740::,2400:7740:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7780::,2400:7780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:77c0::,2400:77c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7800::,2400:7800:4319:ffff:ffff:ffff:ffff:ffff,JP +2400:7800:431a::,2400:7800:431a:7fff:ffff:ffff:ffff:ffff,US +2400:7800:431a:8000::,2400:7800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:7840::,2400:7840:ffff:ffff:ffff:ffff:ffff:ffff,SE +2400:7880::,2400:7880:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:78c0::,2400:78c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:7900::,2400:7900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:7940::,2400:7940:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:7980::,2400:7980:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:79c0::,2400:79c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7a00::,2400:7a00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:7a40::,2400:7a40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:7a80::,2400:7a80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:7ac0::,2400:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7b00::,2400:7b00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:7b40::,2400:7b40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:7b80::,2400:7b83:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:7bc0::,2400:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7c00::,2400:7c00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:7c40::,2400:7c40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:7c80::,2400:7c80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:7cc0::,2400:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:7d00::,2400:7d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:7d80::,2400:7d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:7dc0::,2400:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:7e00::,2400:7e00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:7e40::,2400:7e40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:7e80::,2400:7e80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:7ec0::,2400:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2400:7f00::,2400:7f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:7f80::,2400:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:7fc0::,2400:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:8000::,2400:8000:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:8040::,2400:8040:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8080::,2400:8080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:80c0::,2400:80c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:8100::,2400:8100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:8140::,2400:8140:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:8180::,2400:8180:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:81c0::,2400:81c0:ffff:ffff:ffff:ffff:ffff:ffff,LA +2400:8200::,2400:8200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:8240::,2400:8240:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:8280::,2400:8280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:82c0::,2400:82c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:8300::,2400:8300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8340::,2400:8340:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:8380::,2400:8380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:83c0::,2400:83c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2400:8400::,2400:8400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8440::,2400:8440:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:8480::,2400:8480:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:84c0::,2400:84c0:e:ffff:ffff:ffff:ffff:ffff,HK +2400:84c0:f::,2400:84c0:f:7fff:ffff:ffff:ffff:ffff,US +2400:84c0:f:8000::,2400:84c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:8500::,2400:8500:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8540::,2400:8540:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:8580::,2400:8580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:85c0::,2400:85c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:8600::,2400:8600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:8640::,2400:8640:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:86c0::,2400:86c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:8700::,2400:8700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8740::,2400:8740:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:8780::,2400:8780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:87c0::,2400:87c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:8800::,2400:8800:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:8840::,2400:8840:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:8880::,2400:8880:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:88c0::,2400:88c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:8900::,2400:8900:e001:294d:49c2:953c:2c0c:16a0,JP +2400:8900:e001:294d:49c2:953c:2c0c:16a1,2400:8900:e001:294d:49c2:953c:2c0c:16a1,SG +2400:8900:e001:294d:49c2:953c:2c0c:16a2,2400:8900:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8901::,2400:8901:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:8902::,2400:8902:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8903::,2400:8903:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:8940::,2400:8940:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:8980::,2400:8980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:89c0::,2400:89c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:8a00::,2400:8a00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:8a40::,2400:8a40:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:8a80::,2400:8a81:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:8b00::,2400:8b00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:8b40::,2400:8b40:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:8b80::,2400:8b80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:8bc0::,2400:8bc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:8c00::,2400:8c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:8c40::,2400:8c40:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:8c80::,2400:8c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:8cc0::,2400:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:8d00::,2400:8d00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:8d40::,2400:8d40:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:8dc0::,2400:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:8e00::,2400:8e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:8e40::,2400:8e40:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:8e80::,2400:8e80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:8ec0::,2400:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:8f00::,2400:8f00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:8f40::,2400:8f40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:8f80::,2400:8f80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:8fc0::,2400:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:9000::,2400:9000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:9040::,2400:9040:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:9080::,2400:9080:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:90c0::,2400:90c0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:9100::,2400:9100:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:9140::,2400:9140:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:9180::,2400:9180:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:91c0::,2400:91c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:9240::,2400:9240:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:9280::,2400:9280:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:92c0::,2400:92c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:9300::,2400:9300:ffff:ffff:ffff:ffff:ffff:ffff,PG +2400:9340::,2400:9340:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:9380::,2400:9381:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:93c0::,2400:93c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:9400::,2400:9400:ffff:ffff:ffff:ffff:ffff:ffff,BN +2400:9440::,2400:9440:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:9480::,2400:9480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:94c0::,2400:94c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:9500::,2400:9500:ffff:ffff:ffff:ffff:ffff:ffff,NP +2400:9540::,2400:9540:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:9580::,2400:9580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:95c0::,2400:95c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:9600::,2400:9600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:9640::,2400:9640:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:96c0::,2400:96c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:9700::,2400:9700:ffff:ffff:ffff:ffff:ffff:ffff,NP +2400:9740::,2400:9740:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:9780::,2400:9780:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:97c0::,2400:97c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2400:9800::,2400:9800:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:9840::,2400:9840:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:9880::,2400:9880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:98c0::,2400:98c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:9900::,2400:9900:ffff:ffff:ffff:ffff:ffff:ffff,NP +2400:9940::,2400:9940:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:9980::,2400:9980:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:99c0::,2400:99c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:9a00::,2400:9a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:9a40::,2400:9a40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:9a80::,2400:9a80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:9ac0::,2400:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:9b40::,2400:9b40:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:9b80::,2400:9b80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:9bc0::,2400:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:9c00::,2400:9c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:9c40::,2400:9c40:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:9c80::,2400:9c80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:9cc0::,2400:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,AF +2400:9d00::,2400:9d00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:9d80::,2400:9d80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:9dc0::,2400:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:9e00::,2400:9e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:9e40::,2400:9e40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2400:9e80::,2400:9e80:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:9f40::,2400:9f40:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:9f80::,2400:9f80:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:9fc0::,2400:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:a040::,2400:a040:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a080::,2400:a080:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:a0c0::,2400:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:a140::,2400:a140:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:a1c0::,2400:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:a240::,2400:a240:ffff:ffff:ffff:ffff:ffff:ffff,LK +2400:a2c0::,2400:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:a300::,2400:a300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:a340::,2400:a340:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:a380::,2400:a380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a3c0::,2400:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:a400::,2400:a400:ffff:ffff:ffff:ffff:ffff:ffff,NP +2400:a440::,2400:a440:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:a480::,2400:a480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a4c0::,2400:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:a500::,2400:a500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:a540::,2400:a540:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:a580::,2400:a580:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:a5c0::,2400:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:a600::,2400:a600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:a640::,2400:a640:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:a680::,2400:a680:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:a6c0::,2400:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a700::,2400:a700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:a740::,2400:a740:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:a780::,2400:a780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a7c0::,2400:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:a800::,2400:a800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:a840::,2400:a840:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:a880::,2400:a880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:a8c0::,2400:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a900::,2400:a900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a940::,2400:a940:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:a980::,2400:a987:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a9c0::,2400:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:aa00::,2400:aa00:ffff:ffff:ffff:ffff:ffff:ffff,LA +2400:aa40::,2400:aa40:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:aa80::,2400:aa80:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:aac0::,2400:aac0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ab00::,2400:ab00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:ab40::,2400:ab40:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:ab80::,2400:ab80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:abc0::,2400:abc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ac00::,2400:ac00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:ac40::,2400:ac40:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:ac80::,2400:ac80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:acc0::,2400:acc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ad00::,2400:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:ad40::,2400:ad40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ad80::,2400:ad80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:adc0::,2400:addf:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:ae00::,2400:ae00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ae40::,2400:ae40:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:ae80::,2400:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:aec0::,2400:aec0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:af40::,2400:af40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:af80::,2400:af80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:afc0::,2400:afc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:b000::,2400:b000:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:b040::,2400:b040:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:b080::,2400:b080:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:b0c0::,2400:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b100::,2400:b100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b140::,2400:b140:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:b180::,2400:b180:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:b1c0::,2400:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:b200::,2400:b200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b240::,2400:b240:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:b2c0::,2400:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b300::,2400:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b340::,2400:b340:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:b380::,2400:b380:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:b3c0::,2400:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:b400::,2400:b400:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:b440::,2400:b440:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b480::,2400:b480:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:b4c0::,2400:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b500::,2400:b500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b540::,2400:b540:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:b580::,2400:b580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:b5c0::,2400:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:b600::,2400:b600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b640::,2400:b640:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:b680::,2400:b680:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:b6c0::,2400:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b700::,2400:b700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b740::,2400:b740:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:b780::,2400:b780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b7c0::,2400:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b800::,2400:b800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b840::,2400:b840:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:b880::,2400:b880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b8c0::,2400:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b940::,2400:b940:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:b980::,2400:b980:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:b9c0::,2400:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ba00::,2400:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ba40::,2400:ba41::ffff:ffff:ffff:ffff:ffff,CN +2400:ba41:1::,2400:ba41:1:ffff:ffff:ffff:ffff:ffff,US +2400:ba41:2::,2400:ba41:2:ffff:ffff:ffff:ffff:ffff,SG +2400:ba41:3::,2400:ba41:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ba80::,2400:ba80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:bac0::,2400:bac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:bb00::,2400:bb00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:bb40::,2400:bb40:ffff:ffff:ffff:ffff:ffff:ffff,PA +2400:bbc0::,2400:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:bc00::,2400:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:bc40::,2400:bc40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:bc80::,2400:bc80:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:bcc0::,2400:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:bd00::,2400:bd00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:bd40::,2400:bd40:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:bdc0::,2400:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,AF +2400:be00::,2400:be00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:be40::,2400:be40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:be80::,2400:be80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:bec0::,2400:bec0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:bf00::,2400:bf00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:bf40::,2400:bf40:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:bf80::,2400:bf80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:bfc0::,2400:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c000::,2400:c000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:c040::,2400:c040:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c080::,2400:c080:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:c0c0::,2400:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,VU +2400:c100::,2400:c100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c140::,2400:c140:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:c180::,2400:c180:ffff:ffff:ffff:ffff:ffff:ffff,LA +2400:c1c0::,2400:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:c200::,2400:c200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:c240::,2400:c240:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c2c0::,2400:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c300::,2400:c300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c340::,2400:c340:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c380::,2400:c380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:c3c0::,2400:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c400::,2400:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c401::,2400:c401:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:c440::,2400:c440:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:c4c0::,2400:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:c500::,2400:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c540::,2400:c540:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:c580::,2400:c580:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:c5c0::,2400:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:c600::,2400:c600:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:c640::,2400:c640:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:c680::,2400:c680:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c6c0::,2400:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:c700::,2400:c700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:c740::,2400:c740:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:c780::,2400:c780:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:c7c0::,2400:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:c800::,2400:c807:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c840::,2400:c840:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:c880::,2400:c880:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:c8c0::,2400:c8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:c900::,2400:c900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:c940::,2400:c940:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:c980::,2400:c980:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:c9c0::,2400:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ca00::,2400:ca00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ca40::,2400:ca40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cac0::,2400:cac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cb00::,2400:cb00:18:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:19::,2400:cb00:19:ffff:ffff:ffff:ffff:ffff,FR +2400:cb00:1a::,2400:cb00:1f:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:20::,2400:cb00:20:ffff:ffff:ffff:ffff:ffff,NL +2400:cb00:21::,2400:cb00:21:ffff:ffff:ffff:ffff:ffff,GB +2400:cb00:22::,2400:cb00:22:ffff:ffff:ffff:ffff:ffff,JP +2400:cb00:23::,2400:cb00:23:ffff:ffff:ffff:ffff:ffff,HK +2400:cb00:24::,2400:cb00:25:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:26::,2400:cb00:26:ffff:ffff:ffff:ffff:ffff,AU +2400:cb00:27::,2400:cb00:28:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:29::,2400:cb00:29:ffff:ffff:ffff:ffff:ffff,CA +2400:cb00:2a::,2400:cb00:30:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:31::,2400:cb00:31:ffff:ffff:ffff:ffff:ffff,CZ +2400:cb00:32::,2400:cb00:33:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:34::,2400:cb00:34:ffff:ffff:ffff:ffff:ffff,KR +2400:cb00:35::,2400:cb00:35:ffff:ffff:ffff:ffff:ffff,SG +2400:cb00:36::,2400:cb00:37:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:38::,2400:cb00:38:ffff:ffff:ffff:ffff:ffff,CL +2400:cb00:39::,2400:cb00:39:ffff:ffff:ffff:ffff:ffff,IT +2400:cb00:3a::,2400:cb00:3f:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:40::,2400:cb00:40:ffff:ffff:ffff:ffff:ffff,ES +2400:cb00:41::,2400:cb00:41:ffff:ffff:ffff:ffff:ffff,CO +2400:cb00:42::,2400:cb00:42:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:43::,2400:cb00:43:ffff:ffff:ffff:ffff:ffff,PE +2400:cb00:44::,2400:cb00:44:ffff:ffff:ffff:ffff:ffff,AR +2400:cb00:45::,2400:cb00:45:ffff:ffff:ffff:ffff:ffff,ZA +2400:cb00:46::,2400:cb00:46:ffff:ffff:ffff:ffff:ffff,NZ +2400:cb00:47::,2400:cb00:47:ffff:ffff:ffff:ffff:ffff,AU +2400:cb00:48::,2400:cb00:48:ffff:ffff:ffff:ffff:ffff,DE +2400:cb00:49::,2400:cb00:49:ffff:ffff:ffff:ffff:ffff,FR +2400:cb00:4a::,2400:cb00:4f:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:50::,2400:cb00:50:ffff:ffff:ffff:ffff:ffff,RO +2400:cb00:51::,2400:cb00:51:ffff:ffff:ffff:ffff:ffff,JP +2400:cb00:52::,2400:cb00:52:ffff:ffff:ffff:ffff:ffff,IE +2400:cb00:53::,2400:cb00:53:ffff:ffff:ffff:ffff:ffff,KW +2400:cb00:54::,2400:cb00:54:ffff:ffff:ffff:ffff:ffff,QA +2400:cb00:55::,2400:cb00:55:ffff:ffff:ffff:ffff:ffff,OM +2400:cb00:56::,2400:cb00:56:ffff:ffff:ffff:ffff:ffff,MY +2400:cb00:57::,2400:cb00:59:ffff:ffff:ffff:ffff:ffff,IN +2400:cb00:5a::,2400:cb00:5f:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:60::,2400:cb00:60:ffff:ffff:ffff:ffff:ffff,AE +2400:cb00:61::,2400:cb00:61:ffff:ffff:ffff:ffff:ffff,KE +2400:cb00:62::,2400:cb00:62:ffff:ffff:ffff:ffff:ffff,EG +2400:cb00:63::,2400:cb00:63:ffff:ffff:ffff:ffff:ffff,GB +2400:cb00:64::,2400:cb00:64:ffff:ffff:ffff:ffff:ffff,CH +2400:cb00:65::,2400:cb00:65:ffff:ffff:ffff:ffff:ffff,DK +2400:cb00:66::,2400:cb00:66:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:67::,2400:cb00:67:ffff:ffff:ffff:ffff:ffff,DE +2400:cb00:68::,2400:cb00:68:ffff:ffff:ffff:ffff:ffff,PH +2400:cb00:69::,2400:cb00:69:ffff:ffff:ffff:ffff:ffff,CA +2400:cb00:6a::,2400:cb00:6f:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:70::,2400:cb00:70:ffff:ffff:ffff:ffff:ffff,CA +2400:cb00:71::,2400:cb00:71:ffff:ffff:ffff:ffff:ffff,DE +2400:cb00:72::,2400:cb00:72:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:73::,2400:cb00:73:ffff:ffff:ffff:ffff:ffff,PL +2400:cb00:74::,2400:cb00:74:ffff:ffff:ffff:ffff:ffff,BG +2400:cb00:75::,2400:cb00:75:ffff:ffff:ffff:ffff:ffff,DE +2400:cb00:76::,2400:cb00:76:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:77::,2400:cb00:77:ffff:ffff:ffff:ffff:ffff,PH +2400:cb00:78::,2400:cb00:78:ffff:ffff:ffff:ffff:ffff,BE +2400:cb00:79::,2400:cb00:79:ffff:ffff:ffff:ffff:ffff,FI +2400:cb00:7a::,2400:cb00:7f:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:80::,2400:cb00:80:ffff:ffff:ffff:ffff:ffff,TW +2400:cb00:81::,2400:cb00:82:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:83::,2400:cb00:83:ffff:ffff:ffff:ffff:ffff,NO +2400:cb00:84::,2400:cb00:85:ffff:ffff:ffff:ffff:ffff,AU +2400:cb00:86::,2400:cb00:86:ffff:ffff:ffff:ffff:ffff,TH +2400:cb00:87::,2400:cb00:87:ffff:ffff:ffff:ffff:ffff,RU +2400:cb00:88::,2400:cb00:88:ffff:ffff:ffff:ffff:ffff,GR +2400:cb00:89::,2400:cb00:89:ffff:ffff:ffff:ffff:ffff,ES +2400:cb00:8a::,2400:cb00:8f:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:90::,2400:cb00:90:ffff:ffff:ffff:ffff:ffff,PA +2400:cb00:91::,2400:cb00:91:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:92::,2400:cb00:92:ffff:ffff:ffff:ffff:ffff,IN +2400:cb00:93::,2400:cb00:94:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:95::,2400:cb00:95:ffff:ffff:ffff:ffff:ffff,EC +2400:cb00:96::,2400:cb00:96:ffff:ffff:ffff:ffff:ffff,AO +2400:cb00:97::,2400:cb00:97:ffff:ffff:ffff:ffff:ffff,BR +2400:cb00:98::,2400:cb00:98:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:99::,2400:cb00:99:ffff:ffff:ffff:ffff:ffff,LU +2400:cb00:9a::,2400:cb00:ff:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:100::,2400:cb00:100:ffff:ffff:ffff:ffff:ffff,DE +2400:cb00:101::,2400:cb00:101:ffff:ffff:ffff:ffff:ffff,BR +2400:cb00:102::,2400:cb00:103:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:104::,2400:cb00:104:ffff:ffff:ffff:ffff:ffff,TH +2400:cb00:105::,2400:cb00:105:ffff:ffff:ffff:ffff:ffff,CW +2400:cb00:106::,2400:cb00:106:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:107::,2400:cb00:107:ffff:ffff:ffff:ffff:ffff,PT +2400:cb00:108::,2400:cb00:10f:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:110::,2400:cb00:110:ffff:ffff:ffff:ffff:ffff,CL +2400:cb00:111::,2400:cb00:111:ffff:ffff:ffff:ffff:ffff,LK +2400:cb00:112::,2400:cb00:112:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:113::,2400:cb00:113:ffff:ffff:ffff:ffff:ffff,ZA +2400:cb00:114::,2400:cb00:114:ffff:ffff:ffff:ffff:ffff,AT +2400:cb00:115::,2400:cb00:116:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:117::,2400:cb00:117:ffff:ffff:ffff:ffff:ffff,AM +2400:cb00:118::,2400:cb00:11f:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:120::,2400:cb00:120:ffff:ffff:ffff:ffff:ffff,RS +2400:cb00:121::,2400:cb00:121:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:122::,2400:cb00:122:ffff:ffff:ffff:ffff:ffff,DJ +2400:cb00:123::,2400:cb00:123:ffff:ffff:ffff:ffff:ffff,HU +2400:cb00:124::,2400:cb00:124:ffff:ffff:ffff:ffff:ffff,HR +2400:cb00:125::,2400:cb00:125:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:126::,2400:cb00:126:ffff:ffff:ffff:ffff:ffff,IT +2400:cb00:127::,2400:cb00:127:ffff:ffff:ffff:ffff:ffff,TH +2400:cb00:128::,2400:cb00:128:ffff:ffff:ffff:ffff:ffff,SE +2400:cb00:129::,2400:cb00:129:ffff:ffff:ffff:ffff:ffff,TH +2400:cb00:12a::,2400:cb00:131:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:132::,2400:cb00:132:ffff:ffff:ffff:ffff:ffff,UA +2400:cb00:133::,2400:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:cb40::,2400:cb40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cb80::,2400:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cbc0::,2400:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cc00::,2400:cc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:cc40::,2400:cc40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cc80::,2400:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ccc0::,2400:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cd00::,2400:cd00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:cd40::,2400:cd40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cd80::,2400:cd80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:cdc0::,2400:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ce00::,2400:ce00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ce40::,2400:ce40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ce80::,2400:ce80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:cec0::,2400:cec0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:cf00::,2400:cf00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:cf40::,2400:cf40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cf80::,2400:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cfc0::,2400:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d040::,2400:d040:ffff:ffff:ffff:ffff:ffff:ffff,LK +2400:d0c0::,2400:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d100::,2400:d100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d140::,2400:d140:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:d180::,2400:d180:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:d1c0::,2400:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d200::,2400:d200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d240::,2400:d240:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:d280::,2400:d280:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:d2c0::,2400:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:d300::,2400:d300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d340::,2400:d340:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:d380::,2400:d380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d3c0::,2400:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:d400::,2400:d400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:d440::,2400:d440:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d480::,2400:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:d4c0::,2400:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:d500::,2400:d500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:d540::,2400:d540:ffff:ffff:ffff:ffff:ffff:ffff,AF +2400:d580::,2400:d580:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:d5c0::,2400:d5c0:ffff:ffff:ffff:ffff:ffff:ffff,AF +2400:d600::,2400:d600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d640::,2400:d640:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:d680::,2400:d680:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:d6c0::,2400:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d700::,2400:d700:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:d740::,2400:d740:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:d780::,2400:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d7c0::,2400:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:d800::,2400:d803:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:d840::,2400:d840:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:d880::,2400:d880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:d8c0::,2400:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:d940::,2400:d940:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:d980::,2400:d980:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:d9c0::,2400:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:da00::,2400:da00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:da40::,2400:da40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:da80::,2400:da80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:dac0::,2400:dac0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:db00::,2400:db00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:db40::,2400:db40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:db80::,2400:db80:ffff:ffff:ffff:ffff:ffff:ffff,MN +2400:dbc0::,2400:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:dc00::,2400:dc00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:dc40::,2400:dc40:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:dc80::,2400:dc80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:dcc0::,2400:dcc0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:dd00::,2400:dd0f:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:dd40::,2400:dd40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:dd80::,2400:dd80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ddc0::,2400:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:de00::,2400:de00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:de40::,2400:de40:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:de80::,2400:de80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:dec0::,2400:dec0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:df00::,2400:df00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:df40::,2400:df40:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:df80::,2400:df80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:dfc0::,2400:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:e000::,2400:e000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:e040::,2400:e040:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:e0c0::,2400:e0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:e100::,2400:e100:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:e140::,2400:e140:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:e180::,2400:e180:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:e1c0::,2400:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:e200::,2400:e200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:e240::,2400:e240:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:e2c0::,2400:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:e300::,2400:e300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:e340::,2400:e340:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:e3c0::,2400:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:e400::,2400:e400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:e440::,2400:e440:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:e480::,2400:e480:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:e4c0::,2400:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:e500::,2400:e500:ffff:ffff:ffff:ffff:ffff:ffff,AF +2400:e540::,2400:e540:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:e5c0::,2400:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:e640::,2400:e640:ffff:ffff:ffff:ffff:ffff:ffff,AF +2400:e680::,2400:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:e6c0::,2400:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:e740::,2400:e740:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:e780::,2400:e780:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:e7c0::,2400:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:e840::,2400:e840:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:e880::,2400:e880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:e8c0::,2400:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:e900::,2400:e900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:e940::,2400:e940:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:e980::,2400:e980:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:e9c0::,2400:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:ea00::,2400:ea00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:ea40::,2400:ea40:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:ea80::,2400:ea80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:eac0::,2400:eac0:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:eb00::,2400:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:eb40::,2400:eb40:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:eb80::,2400:eb80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ebc0::,2400:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ec00::,2400:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:ec40::,2400:ec40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:ec80::,2400:ec80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:ecc0::,2400:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:ed00::,2400:ed00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:ed40::,2400:ed40:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:ed80::,2400:ed80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:edc0::,2400:edc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ee00::,2400:ee00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ee40::,2400:ee40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:ee80::,2400:ee80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:eec0::,2400:eec0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ef00::,2400:ef00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:ef40::,2400:ef40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ef80::,2400:ef80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:efc0::,2400:efc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2400:f000::,2400:f000:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f040::,2400:f040:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:f080::,2400:f080:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:f0c0::,2400:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,NP +2400:f100::,2400:f100:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f140::,2400:f140:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:f180::,2400:f180:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:f1c0::,2400:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:f200::,2400:f200:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:f240::,2400:f240:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:f280::,2400:f280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:f2c0::,2400:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:f300::,2400:f300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:f340::,2400:f340:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:f380::,2400:f380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:f3c0::,2400:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f400::,2400:f400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:f440::,2400:f440:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:f480::,2400:f480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:f4c0::,2400:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:f540::,2400:f540:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:f580::,2400:f580:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:f5c0::,2400:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:f600::,2400:f600:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:f640::,2400:f640:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:f680::,2400:f680:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:f6c0::,2400:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,NP +2400:f700::,2400:f700:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f740::,2400:f740:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:f780::,2400:f780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:f7c0::,2400:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:f800::,2400:f800:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f840::,2400:f840:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:f880::,2400:f880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f8c0::,2400:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:f900::,2400:f900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:f940::,2400:f940:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:f980::,2400:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:f9c0::,2400:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:fa00::,2400:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:fa40::,2400:fa40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:fa80::,2400:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:fac0::,2400:fac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:fb00::,2400:fb00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:fb40::,2400:fb40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:fb80::,2400:fb80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:fbc0::,2400:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:fc00::,2400:fc00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:fc40::,2400:fc40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:fc80::,2400:fc80:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:fcc0::,2400:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:fd00::,2400:fd00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:fd40::,2400:fd40:ffff:ffff:ffff:ffff:ffff:ffff,SC +2400:fd80::,2400:fd80:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:fdc0::,2400:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:fe00::,2400:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:fe40::,2400:fe40:ffff:ffff:ffff:ffff:ffff:ffff,MM +2400:fe80::,2400:fe80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:fec0::,2400:fec0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ff00::,2400:ff00:ffff:ffff:ffff:ffff:ffff:ffff,LK +2400:ff40::,2400:ff40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:ffc0::,2400:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401::,2401:1:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:40::,2401:40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:80::,2401:80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c0::,2401:c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:100::,2401:100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:140::,2401:140:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:180::,2401:180:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:1c0::,2401:1c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:200::,2401:200:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:240::,2401:240:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:280::,2401:280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:2c0::,2401:2c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2401:300::,2401:300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:340::,2401:340:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:380::,2401:380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3c0::,2401:3c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:400::,2401:403:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:440::,2401:440:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:4c0::,2401:4c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:4c1:c202:1193:f0a8:d737:3761:2b87,2401:4c1:c202:1193:f0a8:d737:3761:2b87,US +2401:500::,2401:500:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:540::,2401:540:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:580::,2401:580:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:5c0::,2401:5c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2401:600::,2401:600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:640::,2401:640:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:680::,2401:680:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:6c0::,2401:6c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:700::,2401:700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:740::,2401:740:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:780::,2401:780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7c0::,2401:7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:800::,2401:800:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:840::,2401:840:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:880::,2401:880:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:8c0::,2401:8c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:900::,2401:900:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:940::,2401:940:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:980::,2401:980:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:9c0::,2401:9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a00::,2401:a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a40::,2401:a40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ac0::,2401:ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b00::,2401:b00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:b40::,2401:b40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b80::,2401:b80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:bc0::,2401:bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c00::,2401:c00:ffff:ffff:ffff:ffff:ffff:ffff,NC +2401:c40::,2401:c40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c80::,2401:c80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:cc0::,2401:cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:d00::,2401:d00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:d40::,2401:d40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:d80::,2401:d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:dc0::,2401:dc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:e00::,2401:e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e40::,2401:e40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:e80::,2401:e80:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:ec0::,2401:ec0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:f00::,2401:f00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:f40::,2401:f40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:f80::,2401:f80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:fc0::,2401:fc0:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:1000::,2401:1000:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1040::,2401:1040:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:10c0::,2401:10c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:1100::,2401:1100:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:1140::,2401:1140:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:11c0::,2401:11c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1200::,2401:1200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1240::,2401:1240:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:1280::,2401:1280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:12c0::,2401:12c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1300::,2401:1300:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:1340::,2401:1340:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:1380::,2401:1380:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:13c0::,2401:13c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:1400::,2401:1400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:1440::,2401:1440:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:14c0::,2401:14c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:1500::,2401:1500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:1540::,2401:1540:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:1580::,2401:1580:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:15c0::,2401:15c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1600::,2401:1600:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:1640::,2401:1640:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:1680::,2401:1680:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:16c0::,2401:16c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:1700::,2401:1700:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:1740::,2401:1740:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1780::,2401:1780:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:17c0::,2401:17c0:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:1800::,2401:1801:77ff:ffff:ffff:ffff:ffff:ffff,HK +2401:1801:7800::,2401:1801:7800:7fff:ffff:ffff:ffff:ffff,AU +2401:1801:7800:8000::,2401:1801:7800:ffff:ffff:ffff:ffff:ffff,HK +2401:1801:7801::,2401:1801:7801:7fff:ffff:ffff:ffff:ffff,AU +2401:1801:7801:8000::,2401:1801:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:1840::,2401:1840:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:1880::,2401:1880:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:18c0::,2401:18c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1900::,2401:1900:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:1940::,2401:1940:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1980::,2401:1980:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:19c0::,2401:19c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1a00::,2401:1a00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:1a40::,2401:1a40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1a80::,2401:1a80:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:1ac0::,2401:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1b00::,2401:1b00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:1b40::,2401:1b40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:1b80::,2401:1b80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:1bc0::,2401:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:1c00::,2401:1c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:1c40::,2401:1c40:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:1c80::,2401:1c80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:1cc0::,2401:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:1d00::,2401:1d00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:1d40::,2401:1d40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1d80::,2401:1d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:1dc0::,2401:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1e00::,2401:1e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1e40::,2401:1e40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:1e80::,2401:1e80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:1ec0::,2401:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1f00::,2401:1f01:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:1f40::,2401:1f40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:1f80::,2401:1f80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:1fc0::,2401:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:2000::,2401:2001:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:2040::,2401:2040:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:2080::,2401:2080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:20c0::,2401:20c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:2100::,2401:2100:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:2140::,2401:2140:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:21c0::,2401:21c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:2200::,2401:2200:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:2240::,2401:2240:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:2280::,2401:2280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:22c0::,2401:22c0:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:2300::,2401:2300:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:2340::,2401:2340:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:2380::,2401:2380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:23c0::,2401:23c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:2400::,2401:2400:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:2440::,2401:2440:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:2480::,2401:2480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:24c0::,2401:24c0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:2500::,2401:2500:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:2540::,2401:2540:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:2580::,2401:2580:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:25c0::,2401:25c0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:2600::,2401:2600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:2640::,2401:2640:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:2680::,2401:2680:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:26c0::,2401:26c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:2700::,2401:2700:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:2740::,2401:2740:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:2780::,2401:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:27c0::,2401:27c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:2800::,2401:2800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:2840::,2401:2840:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:2880::,2401:2880:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:2900::,2401:2900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:2940::,2401:2940:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:2980::,2401:2980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:29c0::,2401:29c0:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:2a00::,2401:2a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:2a40::,2401:2a40:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:2a80::,2401:2a80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:2ac0::,2401:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:2b00::,2401:2b00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:2b40::,2401:2b40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:2b80::,2401:2b80:ffff:ffff:ffff:ffff:ffff:ffff,NP +2401:2bc0::,2401:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:2c00::,2401:2c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:2c40::,2401:2c40:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:2c80::,2401:2c80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:2cc0::,2401:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:2d00::,2401:2d00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:2d40::,2401:2d40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:2d80::,2401:2d80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:2dc0::,2401:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:2e00::,2401:2e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:2e40::,2401:2e40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:2e80::,2401:2e80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:2ec0::,2401:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:2f00::,2401:2f00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:2f40::,2401:2f40:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:2f80::,2401:2f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2401:2fc0::,2401:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3000::,2401:3000:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:3040::,2401:3040:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:3080::,2401:3080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:30c0::,2401:30c0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:3100::,2401:3100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3140::,2401:3140:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:3180::,2401:3180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:31c0::,2401:31c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3200::,2401:3200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:3240::,2401:3240:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:3280::,2401:3280:ffff:ffff:ffff:ffff:ffff:ffff,MO +2401:32c0::,2401:32c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:3300::,2401:3300:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:3340::,2401:3340:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:3380::,2401:3380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:33c0::,2401:33c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3400::,2401:3400:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:3440::,2401:3440:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3480::,2401:3480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:34c0::,2401:34c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3540::,2401:3540:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3580::,2401:3580:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:35c0::,2401:35c0:ffff:ffff:ffff:ffff:ffff:ffff,MM +2401:3600::,2401:3600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:3640::,2401:3640:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3680::,2401:3680:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:36c0::,2401:36c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:3740::,2401:3740:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:3780::,2401:3780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:37c0::,2401:37c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:3800::,2401:3800:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3840::,2401:3840:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:3880::,2401:3880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:38c0::,2401:38c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3900::,2401:3900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3940::,2401:3940:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3980::,2401:3980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:39c0::,2401:39c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:3a00::,2401:3a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3a40::,2401:3a40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3a80::,2401:3a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3ac0::,2401:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3b00::,2401:3b00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:3b40::,2401:3b40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:3b80::,2401:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3bc0::,2401:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:3c00::,2401:3c00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:3c40::,2401:3c40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3c80::,2401:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3cc0::,2401:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:3d00::,2401:3d0f:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:3d40::,2401:3d40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3d80::,2401:3d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3dc0::,2401:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3e00::,2401:3e00:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:3e40::,2401:3e40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:3e80::,2401:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3ec0::,2401:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:3f00::,2401:3f00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:3f40::,2401:3f40:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:3f80::,2401:3f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:3fc0::,2401:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:4000::,2401:4000:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:4040::,2401:4040:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:4080::,2401:4080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:40c0::,2401:40c0:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:4100::,2401:4100:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:4140::,2401:4140:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:4180::,2401:4180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:41c0::,2401:41c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:4200::,2401:4200:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:4240::,2401:4240:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:4280::,2401:4280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:42c0::,2401:42c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:4300::,2401:4300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:4340::,2401:4340:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:4380::,2401:4380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:43c0::,2401:43c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:4400::,2401:4400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:4440::,2401:4440:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:4480::,2401:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:44c0::,2401:44c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:4540::,2401:4540:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:4580::,2401:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:45c0::,2401:45c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:4600::,2401:4600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:4640::,2401:4640:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:4680::,2401:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:46c0::,2401:46c0:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:4700::,2401:4700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:4740::,2401:4740:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:4780::,2401:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:47c0::,2401:47c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:4800::,2401:4800:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:4840::,2401:4840:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:4880::,2401:4880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:48c0::,2401:48c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:4900::,2401:4900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:4a00::,2401:4a00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:4a40::,2401:4a40:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:4a80::,2401:4a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:4ac0::,2401:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:4b00::,2401:4b00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:4b40::,2401:4b40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:4b80::,2401:4b80:ffff:ffff:ffff:ffff:ffff:ffff,TL +2401:4bc0::,2401:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:4c00::,2401:4c00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:4c40::,2401:4c40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:4c80::,2401:4c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:4cc0::,2401:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:4d00::,2401:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:4d40::,2401:4d47:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:4d80::,2401:4d80:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:4dc0::,2401:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:4e00::,2401:4e00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:4e40::,2401:4e40:ffff:ffff:ffff:ffff:ffff:ffff,MP +2401:4e80::,2401:4e80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:4ec0::,2401:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:4f00::,2401:4f00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:4f40::,2401:4f40:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:4f80::,2401:4f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:4fc0::,2401:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:5000::,2401:5000:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:5040::,2401:5040:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:50c0::,2401:50c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:5100::,2401:5100:ffff:ffff:ffff:ffff:ffff:ffff,FJ +2401:5140::,2401:5140:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:5180::,2401:5180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:51c0::,2401:51c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5200::,2401:5200:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:5240::,2401:5240:ffff:ffff:ffff:ffff:ffff:ffff,NP +2401:5280::,2401:5280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:52c0::,2401:52c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:5300::,2401:5300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:5340::,2401:5340:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:53c0::,2401:53c0:ffff:ffff:ffff:ffff:ffff:ffff,PG +2401:5400::,2401:5400:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:5440::,2401:5440:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:5480::,2401:5480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:54c0::,2401:54c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:5500::,2401:5500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5540::,2401:5540:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:55c0::,2401:55c0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:5640::,2401:5640:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:5680::,2401:5680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:56c0::,2401:56c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:5700::,2401:5700:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:5740::,2401:5740:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:5780::,2401:5780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:57c0::,2401:57c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:5800::,2401:5800:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:5840::,2401:5840:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5880::,2401:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:58c0::,2401:58c0:ffff:ffff:ffff:ffff:ffff:ffff,GU +2401:5900::,2401:5900:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:5940::,2401:5940:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:5980::,2401:5980:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:59c0::,2401:59c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:5a00::,2401:5a00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:5a40::,2401:5a40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:5a80::,2401:5a80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:5ac0::,2401:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:5b00::,2401:5b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5b40::,2401:5b40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:5b80::,2401:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5bc0::,2401:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:5c00::,2401:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5c40::,2401:5c40:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:5c80::,2401:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:5cc0::,2401:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:5d00::,2401:5d00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:5d40::,2401:5d40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5dc0::,2401:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:5e00::,2401:5e00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:5e40::,2401:5e40:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:5e80::,2401:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5ec0::,2401:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:5f00::,2401:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5f40::,2401:5f40:ffff:ffff:ffff:ffff:ffff:ffff,BT +2401:5f80::,2401:5f80:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:5fc0::,2401:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:6000::,2401:6fff:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7000::,2401:7000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:7040::,2401:7040:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:7080::,2401:7080:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:70c0::,2401:70c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:7100::,2401:7100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7140::,2401:7140:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:7180::,2401:7180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:71c0::,2401:71c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7200::,2401:7200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7240::,2401:7240:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:72c0::,2401:72c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7300::,2401:7300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7340::,2401:7340:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7380::,2401:7380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:73c0::,2401:73c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7400::,2401:7401:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:7440::,2401:7440:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:74c0::,2401:74c0:ffff:ffff:ffff:ffff:ffff:ffff,NP +2401:7500::,2401:7500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:7540::,2401:7540:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:7580::,2401:7580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:75c0::,2401:75c0:ffff:ffff:ffff:ffff:ffff:ffff,MO +2401:7600::,2401:7600:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:7640::,2401:7640:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:7680::,2401:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:76c0::,2401:76c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:7700::,2401:7700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7740::,2401:7740:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:7780::,2401:7780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:77c0::,2401:77c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7800::,2401:7800:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:7840::,2401:7840:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:7880::,2401:7880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:78c0::,2401:78c0:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:7900::,2401:7900:ffff:ffff:ffff:ffff:ffff:ffff,LK +2401:7940::,2401:7940:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:7980::,2401:7980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:79c0::,2401:79c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:7a00::,2401:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7a40::,2401:7a40:ffff:ffff:ffff:ffff:ffff:ffff,VU +2401:7a80::,2401:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7ac0::,2401:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:7b00::,2401:7b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7b40::,2401:7b40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:7b80::,2401:7b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7bc0::,2401:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7c00::,2401:7c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:7c40::,2401:7c40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:7c80::,2401:7c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7cc0::,2401:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7d00::,2401:7d00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:7d40::,2401:7d40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7d80::,2401:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7dc0::,2401:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:7e00::,2401:7e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7e40::,2401:7e40:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:7e80::,2401:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7ec0::,2401:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:7f00::,2401:7f00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:7f40::,2401:7f40:ffff:ffff:ffff:ffff:ffff:ffff,NP +2401:7f80::,2401:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7fc0::,2401:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:8000::,2401:803f:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:8040::,2401:8040:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:8080::,2401:8080:ffff:ffff:ffff:ffff:ffff:ffff,AF +2401:80c0::,2401:80c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:8100::,2401:8100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:8140::,2401:8140:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:8180::,2401:8180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:81c0::,2401:81c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:8200::,2401:8200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:8240::,2401:8240:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:8280::,2401:8280:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:82c0::,2401:82c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:8300::,2401:8300:ffff:ffff:ffff:ffff:ffff:ffff,MV +2401:8340::,2401:8340:ffff:ffff:ffff:ffff:ffff:ffff,MM +2401:8380::,2401:8380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:83c0::,2401:83c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:8400::,2401:8400:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:8440::,2401:8440:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:84c0::,2401:84c0:ffff:ffff:ffff:ffff:ffff:ffff,RO +2401:8500::,2401:8500:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:8540::,2401:8540:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:85c0::,2401:85c0:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:8600::,2401:8600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:8640::,2401:8640:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:8680::,2401:8680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:86c0::,2401:86c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:8700::,2401:8700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:8740::,2401:8740:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:87c0::,2401:87c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:8800::,2401:8800:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:8840::,2401:8840:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:8880::,2401:8880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:88c0::,2401:88c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:8900::,2401:8900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:8940::,2401:8940:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:89c0::,2401:89c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:8a00::,2401:8a00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:8a40::,2401:8a40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:8a80::,2401:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:8ac0::,2401:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:8b00::,2401:8b00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:8b40::,2401:8b40:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:8b80::,2401:8b80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:8bc0::,2401:8bc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:8c00::,2401:8c01:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:8c40::,2401:8c40:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:8c80::,2401:8c80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:8cc0::,2401:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:8d00::,2401:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:8d40::,2401:8d40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:8dc0::,2401:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:8e00::,2401:8e00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:8e40::,2401:8e40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:8e80::,2401:8e80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:8ec0::,2401:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:8f00::,2401:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:8f40::,2401:8f40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:8f80::,2401:8f80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:8fc0::,2401:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9040::,2401:9040:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:9080::,2401:9080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:90c0::,2401:90c0:ffff:ffff:ffff:ffff:ffff:ffff,MN +2401:9100::,2401:9100:ffff:ffff:ffff:ffff:ffff:ffff,MO +2401:9140::,2401:9140:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:91c0::,2401:91c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:9200::,2401:9200:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:9240::,2401:9240:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:9280::,2401:9280:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:92c0::,2401:92c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:9300::,2401:9300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:9340::,2401:9340:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9380::,2401:9380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:93c0::,2401:93c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:9400::,2401:9400:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:9440::,2401:9440:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:9480::,2401:9480:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:94c0::,2401:94c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:9500::,2401:9500:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:9540::,2401:9540:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:9580::,2401:9580:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:95c0::,2401:95c0:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:9600::,2401:9600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9640::,2401:9640:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:9680::,2401:9680:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:96c0::,2401:96c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9700::,2401:9700:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:9740::,2401:9740:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9780::,2401:9780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:97c0::,2401:97c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:9800::,2401:9800:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:9840::,2401:9840:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:9880::,2401:9880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:98c0::,2401:98c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9940::,2401:9940:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:9980::,2401:9980:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:99c0::,2401:99c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:9a00::,2401:9a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9a40::,2401:9a40:ffff:ffff:ffff:ffff:ffff:ffff,NP +2401:9ac0::,2401:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9b00::,2401:9b00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:9b40::,2401:9b40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9bc0::,2401:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9c00::,2401:9c00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:9c40::,2401:9c40:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:9c80::,2401:9c80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:9cc0::,2401:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:9d00::,2401:9d00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:9d40::,2401:9d40:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:9d80::,2401:9d80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:9dc0::,2401:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9e00::,2401:9e00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:9e40::,2401:9e40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9e80::,2401:9e80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:9ec0::,2401:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:9f00::,2401:9f00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:9f40::,2401:9f40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:9f80::,2401:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9fc0::,2401:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:a000::,2401:a000:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:a040::,2401:a040:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:a080::,2401:a080:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:a0c0::,2401:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:a100::,2401:a100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:a140::,2401:a140:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a180::,2401:a180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a1c0::,2401:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:a240::,2401:a240:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:a280::,2401:a280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:a2c0::,2401:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:a300::,2401:a300:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:a340::,2401:a340:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a380::,2401:a380:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:a3c0::,2401:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a400::,2401:a400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:a440::,2401:a440:ffff:ffff:ffff:ffff:ffff:ffff,IO +2401:a480::,2401:a480:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:a4c0::,2401:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a500::,2401:a500:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:a540::,2401:a540:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a580::,2401:a580:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:a5c0::,2401:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a600::,2401:a600:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:a640::,2401:a640:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a680::,2401:a680:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:a6c0::,2401:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:a700::,2401:a700:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:a740::,2401:a740:ffff:ffff:ffff:ffff:ffff:ffff,MM +2401:a780::,2401:a780:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:a7c0::,2401:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:a800::,2401:a800:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:a840::,2401:a840:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:a880::,2401:a880:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:a8c0::,2401:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:a900::,2401:a900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:a940::,2401:a940:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a980::,2401:a980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a9c0::,2401:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:aa00::,2401:aa00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:aa40::,2401:aa40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:aa80::,2401:aa80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:aac0::,2401:aac0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:ab00::,2401:ab00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:ab40::,2401:ab40:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:ab80::,2401:ab80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:abc0::,2401:abc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:ac00::,2401:ac00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:ac40::,2401:ac40:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:ac80::,2401:ac80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:acc0::,2401:acc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ad00::,2401:ad00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:ad40::,2401:ad40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ad80::,2401:ad80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:adc0::,2401:adc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ae00::,2401:ae00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:ae40::,2401:ae40:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:ae80::,2401:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:aec0::,2401:aec0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:af00::,2401:af00:ffff:ffff:ffff:ffff:ffff:ffff,NC +2401:af40::,2401:af40:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:af80::,2401:af80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:afc0::,2401:afc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:b000::,2401:b000:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:b040::,2401:b040:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b080::,2401:b080:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:b0c0::,2401:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:b100::,2401:b100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:b140::,2401:b140:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:b180::,2401:b180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b1c0::,2401:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2401:b200::,2401:b200:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:b240::,2401:b240:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:b2c0::,2401:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:b300::,2401:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:b340::,2401:b340:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b380::,2401:b380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:b3c0::,2401:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:b400::,2401:b400:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b440::,2401:b440:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:b480::,2401:b480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b4c0::,2401:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b500::,2401:b500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:b540::,2401:b540:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b580::,2401:b580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b5c0::,2401:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:b600::,2401:b600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b640::,2401:b640:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:b680::,2401:b680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b6c0::,2401:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b740::,2401:b740:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:b780::,2401:b780:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:b7c0::,2401:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b800::,2401:b800:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:b840::,2401:b840:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:b880::,2401:b880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:b8c0::,2401:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:b900::,2401:b900:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:b940::,2401:b940:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b9c0::,2401:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:ba00::,2401:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ba40::,2401:ba40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ba80::,2401:ba80:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:bac0::,2401:bac0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:bb00::,2401:bb00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:bb40::,2401:bb40:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:bb80::,2401:bb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:bbc0::,2401:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:bc00::,2401:bc00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:bc40::,2401:bc40:ffff:ffff:ffff:ffff:ffff:ffff,US +2401:bc80::,2401:bc80:ffff:ffff:ffff:ffff:ffff:ffff,MM +2401:bcc0::,2401:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:bd00::,2401:bd00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:bd40::,2401:bd40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:bdc0::,2401:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:be00::,2401:be00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:be40::,2401:be40:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:be80::,2401:be80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:bec0::,2401:bec0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:bf00::,2401:bf00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:bf40::,2401:bf40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:bf80::,2401:bf80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:bfc0::,2401:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:c000::,2401:c000:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:c040::,2401:c040:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:c080::,2401:c080:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:c0c0::,2401:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:c100::,2401:c100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:c140::,2401:c140:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:c180::,2401:c180:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:c1c0::,2401:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:c200::,2401:c200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c240::,2401:c240:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:c280::,2401:c280:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:c2c0::,2401:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:c300::,2401:c300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:c340::,2401:c340:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:c3c0::,2401:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:c400::,2401:c400:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:c440::,2401:c440:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:c480::,2401:c480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:c4c0::,2401:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:c500::,2401:c500:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:c540::,2401:c540:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c580::,2401:c580:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:c5c0::,2401:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:c600::,2401:c600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c640::,2401:c640:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c680::,2401:c680:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:c6c0::,2401:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c700::,2401:c700:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:c740::,2401:c740:ffff:ffff:ffff:ffff:ffff:ffff,US +2401:c780::,2401:c780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:c7c0::,2401:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:c800::,2401:c800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:c840::,2401:c840:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c880::,2401:c880:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:c8c0::,2401:c8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c900::,2401:c900:1000:ffff:ffff:ffff:ffff:ffff,SG +2401:c900:1001::,2401:c900:1001:7fff:ffff:ffff:ffff:ffff,JP +2401:c900:1001:8000::,2401:c900:11ff:ffff:ffff:ffff:ffff:ffff,SG +2401:c900:1200::,2401:c900:1201:175:ffff:ffff:ffff:ffff,US +2401:c900:1201:176::,2401:c900:1201:176:ffff:ffff:ffff:ffff,HK +2401:c900:1201:177::,2401:c900:1201:1cb:ffff:ffff:ffff:ffff,US +2401:c900:1201:1cc::,2401:c900:1201:1cc:ffff:ffff:ffff:ffff,HK +2401:c900:1201:1cd::,2401:c900:12ff:ffff:ffff:ffff:ffff:ffff,US +2401:c900:1300::,2401:c900:1300:7fff:ffff:ffff:ffff:ffff,SG +2401:c900:1300:8000::,2401:c900:1301:7fff:ffff:ffff:ffff:ffff,AU +2401:c900:1301:8000::,2401:c900:1600:ffff:ffff:ffff:ffff:ffff,SG +2401:c900:1601::,2401:c900:1601:7fff:ffff:ffff:ffff:ffff,KR +2401:c900:1601:8000::,2401:c901:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:c940::,2401:c940:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:c980::,2401:c980:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:c9c0::,2401:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,NP +2401:ca00::,2401:ca00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ca40::,2401:ca40:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:ca80::,2401:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:cac0::,2401:cac0:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:cb00::,2401:cb00:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:cb40::,2401:cb40:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:cb80::,2401:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:cbc0::,2401:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:cc00::,2401:cc00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:cc40::,2401:cc40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:cc80::,2401:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:ccc0::,2401:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:cd00::,2401:cd00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:cd40::,2401:cd40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:cd80::,2401:cd80:1:ffff:ffff:ffff:ffff:ffff,AU +2401:cd80:2::,2401:cd80:2:ffff:ffff:ffff:ffff:ffff,NZ +2401:cd80:3::,2401:cd81:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:cdc0::,2401:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:ce00::,2401:ce00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ce40::,2401:ce40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:ce80::,2401:ce80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:cec0::,2401:cec0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:cf00::,2401:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:cf40::,2401:cf40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:cf80::,2401:cf80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:cfc0::,2401:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:d000::,2401:d000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:d040::,2401:d040:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:d080:2000::,2401:d080:20ff:ffff:ffff:ffff:ffff:ffff,AU +2401:d080:3000::,2401:d080:30ff:ffff:ffff:ffff:ffff:ffff,AU +2401:d080:4000::,2401:d080:40ff:ffff:ffff:ffff:ffff:ffff,AU +2401:d080:5000::,2401:d080:50ff:ffff:ffff:ffff:ffff:ffff,AU +2401:d080:6000::,2401:d080:60ff:ffff:ffff:ffff:ffff:ffff,AU +2401:d080:7000::,2401:d080:70ff:ffff:ffff:ffff:ffff:ffff,AU +2401:d080:8000::,2401:d080:80ff:ffff:ffff:ffff:ffff:ffff,AU +2401:d0c0::,2401:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:d100::,2401:d100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:d140::,2401:d140:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:d180::,2401:d180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:d1c0::,2401:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:d200::,2401:d200:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:d240::,2401:d240:ffff:ffff:ffff:ffff:ffff:ffff,GB +2401:d280::,2401:d280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:d2c0::,2401:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:d300::,2401:d300:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:d340::,2401:d340:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:d380::,2401:d380:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:d3c0::,2401:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:d400::,2401:d400:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:d440::,2401:d440:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:d480::,2401:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:d4c0::,2401:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:d500::,2401:d500:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:d540::,2401:d540:ffff:ffff:ffff:ffff:ffff:ffff,PG +2401:d580::,2401:d580:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:d5c0::,2401:d5c0:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:d600::,2401:d600:ffff:ffff:ffff:ffff:ffff:ffff,MN +2401:d640::,2401:d640:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:d680::,2401:d680:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:d6c0::,2401:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:d700::,2401:d700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:d740::,2401:d740:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:d780::,2401:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:d7c0::,2401:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,FJ +2401:d800::,2401:d800:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:d840::,2401:d840:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:d880::,2401:d880:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:d8c0::,2401:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:d900::,2401:d900:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:d940::,2401:d940:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:d980::,2401:d980:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:d9c0::,2401:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:da00::,2401:da00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:da40::,2401:da40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:da80::,2401:da80:17ff:ffff:ffff:ffff:ffff:ffff,HK +2401:da80:1800::,2401:da80:1800:7fff:ffff:ffff:ffff:ffff,PH +2401:da80:1800:8000::,2401:da80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:dac0::,2401:dac0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:db00::,2401:db00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:db40::,2401:db40:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:db80::,2401:db80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:dbc0::,2401:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:dc00::,2401:dc00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:dc40::,2401:dc40:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:dc80::,2401:dc80:ffff:ffff:ffff:ffff:ffff:ffff,PF +2401:dcc0::,2401:dcc0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:dd00::,2401:dd00:ffff:ffff:ffff:ffff:ffff:ffff,LK +2401:dd40::,2401:dd40:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:dd80::,2401:dd80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:ddc0::,2401:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:de00::,2401:de00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:de40::,2401:de40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:de80::,2401:de80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:dec0::,2401:dec0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:df00::,2401:df01:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:df40::,2401:df40:ffff:ffff:ffff:ffff:ffff:ffff,GI +2401:df80::,2401:df80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:dfc0::,2401:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,KI +2401:e000::,2401:e000:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:e040::,2401:e040:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:e080::,2401:e080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e0c0::,2401:e0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e100::,2401:e100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:e140::,2401:e140:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e180::,2401:e180:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:e1c0::,2401:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:e200::,2401:e200:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:e240::,2401:e240:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e280::,2401:e280:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:e2c0::,2401:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e300::,2401:e300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:e340::,2401:e340:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e380::,2401:e380:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:e3c0::,2401:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:e400::,2401:e400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:e440::,2401:e440:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:e480::,2401:e480:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:e4c0::,2401:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:e500::,2401:e500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:e540::,2401:e540:ffff:ffff:ffff:ffff:ffff:ffff,US +2401:e580::,2401:e580:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:e5c0::,2401:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:e600::,2401:e600:ffff:ffff:ffff:ffff:ffff:ffff,FJ +2401:e640::,2401:e640:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:e680::,2401:e680:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:e6c0::,2401:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e700::,2401:e700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:e740::,2401:e740:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:e780::,2401:e780:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:e7c0::,2401:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:e800::,2401:e800:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:e840::,2401:e840:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e880::,2401:e880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:e8c0::,2401:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e900::,2401:e900:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:e940::,2401:e940:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e980::,2401:e980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:e9c0::,2401:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ea00::,2401:ea00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:ea40::,2401:ea40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:ea80::,2401:ea80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:eac0::,2401:eac0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:eb00::,2401:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:eb40::,2401:eb40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:eb80::,2401:eb80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:ebc0::,2401:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:ec00::,2401:ec00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ec40::,2401:ec40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ec80::,2401:ec80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:ecc0::,2401:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:ed00::,2401:ed00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:ed40::,2401:ed40:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:ed80::,2401:ed80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:edc0::,2401:edc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:ee00::,2401:ee00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:ee40::,2401:ee40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:ee80::,2401:ee80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:eec0::,2401:eec0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2401:ef00::,2401:ef00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:ef40::,2401:ef40:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:ef80::,2401:ef80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:efc0::,2401:efc0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:f000::,2401:f000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:f040::,2401:f040:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:f080::,2401:f080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:f0c0::,2401:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:f100::,2401:f100:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:f140::,2401:f140:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:f180::,2401:f180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:f1c0::,2401:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:f200::,2401:f200:ffff:ffff:ffff:ffff:ffff:ffff,MM +2401:f240::,2401:f240:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:f280::,2401:f280:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:f2c0::,2401:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:f300::,2401:f300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:f340::,2401:f340:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:f380::,2401:f380:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:f3c0::,2401:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:f400::,2401:f400:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:f440::,2401:f440:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:f480::,2401:f480:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:f4c0::,2401:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:f500::,2401:f500:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:f540::,2401:f540:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:f580::,2401:f580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:f5c0::,2401:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:f640::,2401:f640:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:f680::,2401:f680:ffff:ffff:ffff:ffff:ffff:ffff,PG +2401:f6c0::,2401:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:f700::,2401:f700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:f740::,2401:f740:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:f7c0::,2401:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:f800::,2401:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:f840::,2401:f840:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:f880::,2401:f880:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:f8c0::,2401:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:f900::,2401:f900:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:f940::,2401:f940:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:f980::,2401:f980:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:f9c0::,2401:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2401:fa00::,2401:fa00::ffff:ffff:ffff:ffff:ffff,AU +2401:fa00:1::,2401:fa00:2:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:3::,2401:fa00:3:ffff:ffff:ffff:ffff:ffff,SG +2401:fa00:4::,2401:fa00:4:ffff:ffff:ffff:ffff:ffff,JP +2401:fa00:5::,2401:fa00:7:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:8::,2401:fa00:8:7fff:ffff:ffff:ffff:ffff,MY +2401:fa00:8:8000::,2401:fa00:8:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:9::,2401:fa00:9:ffff:ffff:ffff:ffff:ffff,AU +2401:fa00:a::,2401:fa00:a:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:b::,2401:fa00:b:7fff:ffff:ffff:ffff:ffff,US +2401:fa00:b:8000::,2401:fa00:b:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:c::,2401:fa00:c:7fff:ffff:ffff:ffff:ffff,US +2401:fa00:c:8000::,2401:fa00:c:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:d::,2401:fa00:d:ffff:ffff:ffff:ffff:ffff,KR +2401:fa00:e::,2401:fa00:e:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:f::,2401:fa00:f:7fff:ffff:ffff:ffff:ffff,SG +2401:fa00:f:8000::,2401:fa00:10:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:11::,2401:fa00:11:ffff:ffff:ffff:ffff:ffff,AU +2401:fa00:12::,2401:fa00:12:ffff:ffff:ffff:ffff:ffff,NZ +2401:fa00:13::,2401:fa00:13:ffff:ffff:ffff:ffff:ffff,HK +2401:fa00:14::,2401:fa00:15:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:16::,2401:fa00:16:7fff:ffff:ffff:ffff:ffff,ID +2401:fa00:16:8000::,2401:fa00:16:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:17::,2401:fa00:17:ffff:ffff:ffff:ffff:ffff,KR +2401:fa00:18::,2401:fa00:18:ffff:ffff:ffff:ffff:ffff,PH +2401:fa00:19::,2401:fa00:19:ffff:ffff:ffff:ffff:ffff,TH +2401:fa00:1a::,2401:fa00:1b:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:1c::,2401:fa00:1c:ffff:ffff:ffff:ffff:ffff,KR +2401:fa00:1d::,2401:fa00:1e:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:1f::,2401:fa00:1f:7fff:ffff:ffff:ffff:ffff,JP +2401:fa00:1f:8000::,2401:fa00:23:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:24::,2401:fa00:24:ffff:ffff:ffff:ffff:ffff,MY +2401:fa00:25::,2401:fa00:25:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:26::,2401:fa00:26:ffff:ffff:ffff:ffff:ffff,PH +2401:fa00:27::,2401:fa00:27:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:28::,2401:fa00:28:7fff:ffff:ffff:ffff:ffff,AU +2401:fa00:28:8000::,2401:fa00:28:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:29::,2401:fa00:29:7fff:ffff:ffff:ffff:ffff,US +2401:fa00:29:8000::,2401:fa00:2c:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:2d::,2401:fa00:2d:ffff:ffff:ffff:ffff:ffff,SG +2401:fa00:2e::,2401:fa00:30:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:31::,2401:fa00:31:7fff:ffff:ffff:ffff:ffff,PH +2401:fa00:31:8000::,2401:fa00:32:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:33::,2401:fa00:33:ffff:ffff:ffff:ffff:ffff,PH +2401:fa00:34::,2401:fa00:34:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:35::,2401:fa00:35:ffff:ffff:ffff:ffff:ffff,US +2401:fa00:36::,2401:fa00:36:ffff:ffff:ffff:ffff:ffff,SG +2401:fa00:37::,2401:fa00:40:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:41::,2401:fa00:41:7fff:ffff:ffff:ffff:ffff,CN +2401:fa00:41:8000::,2401:fa00:41:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:42::,2401:fa00:42:7fff:ffff:ffff:ffff:ffff,CN +2401:fa00:42:8000::,2401:fa00:43:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:44::,2401:fa00:44:7fff:ffff:ffff:ffff:ffff,CN +2401:fa00:44:8000::,2401:fa00:5f:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:60::,2401:fa00:60:7fff:ffff:ffff:ffff:ffff,US +2401:fa00:60:8000::,2401:fa00:f7:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:f8::,2401:fa00:f8:ffff:ffff:ffff:ffff:ffff,PH +2401:fa00:f9::,2401:fa00:47f:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:480::,2401:fa00:480:7fff:ffff:ffff:ffff:ffff,US +2401:fa00:480:8000::,2401:fa00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:fa40::,2401:fa40:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:fa80::,2401:fa80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:fac0::,2401:fac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:fb00::,2401:fb00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:fb40::,2401:fb40:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:fb80::,2401:fb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:fbc0::,2401:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:fc00::,2401:fc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:fc40::,2401:fc40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:fc80::,2401:fc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:fcc0::,2401:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:fd00::,2401:fd00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:fd40::,2401:fd40:ffff:ffff:ffff:ffff:ffff:ffff,MN +2401:fd80::,2401:fd80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:fdc0::,2401:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:fe00::,2401:fe00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:fe40::,2401:fe40:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:fe80::,2401:fe80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:fec0::,2401:fec0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:ff00::,2401:ff00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:ff40::,2401:ff40:ffff:ffff:ffff:ffff:ffff:ffff,NP +2401:ff80::,2401:ff80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:ffc0::,2401:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402::,2402:3ff:ffff:ffff:ffff:ffff:ffff:ffff,KR +2402:400::,2402:400:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:440::,2402:440:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:480::,2402:480:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:4c0::,2402:4c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:500::,2402:500:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:540::,2402:540:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:580::,2402:580:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:5c0::,2402:5c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:600::,2402:600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:640::,2402:640:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:680::,2402:680:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:6c0::,2402:6c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:700::,2402:700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:740::,2402:740:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:780::,2402:780:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:7c0::,2402:7c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:800::,2402:800:ffff:ffff:ffff:ffff:ffff:ffff,VN +2402:840::,2402:840:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:880::,2402:880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:8c0::,2402:8c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:900::,2402:900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:940::,2402:940:ffff:ffff:ffff:ffff:ffff:ffff,PH +2402:980::,2402:980:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:9c0::,2402:9c0:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:a00::,2402:a00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:a40::,2402:a40:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:a80::,2402:a80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:ac0::,2402:ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:b00::,2402:b00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:b40::,2402:b40:ffff:ffff:ffff:ffff:ffff:ffff,VN +2402:b80::,2402:b80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:bc0::,2402:bc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:c00::,2402:c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:c40::,2402:c40:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:c80::,2402:c80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:cc0::,2402:cc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:d00::,2402:d00:ffff:ffff:ffff:ffff:ffff:ffff,NO +2402:d40::,2402:d40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:d80::,2402:d80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:dc0::,2402:dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:e00::,2402:e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:e40::,2402:e40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:e80::,2402:e80:23:ffff:ffff:ffff:ffff:ffff,IN +2402:e80:24::,2402:e80:24:ffff:ffff:ffff:ffff:ffff,PL +2402:e80:25::,2402:e80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:ec0::,2402:ec0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:f00::,2402:f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:f40::,2402:f40:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:f80::,2402:f80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:fc0::,2402:fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:1000::,2402:1000:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:1040::,2402:1040:ffff:ffff:ffff:ffff:ffff:ffff,PK +2402:1080::,2402:1080:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:10c0::,2402:10c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1100::,2402:1100:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:1140::,2402:1140:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1180::,2402:1180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:11c0::,2402:11c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:1200::,2402:1200:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:1240::,2402:1240:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:1280::,2402:1280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:12c0::,2402:12c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1300::,2402:1300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1340::,2402:1340:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:13c0::,2402:13c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1400::,2402:1400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:1440::,2402:1440:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:14c0::,2402:14c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:1500::,2402:1500:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:1540::,2402:1540:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:1580::,2402:1580:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:15c0::,2402:15c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:1600::,2402:1600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:1640::,2402:1640:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:1680::,2402:1680:ffff:ffff:ffff:ffff:ffff:ffff,PK +2402:16c0::,2402:16c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:1700::,2402:1700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1740::,2402:1740:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:1780::,2402:1780:ffff:ffff:ffff:ffff:ffff:ffff,TW +2402:17c0::,2402:17c0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1800::,2402:1800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1840::,2402:1840:ffff:ffff:ffff:ffff:ffff:ffff,FJ +2402:1880::,2402:1883:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:18c0::,2402:18c0:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:1900::,2402:1900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1940::,2402:1940:ffff:ffff:ffff:ffff:ffff:ffff,TO +2402:1980::,2402:1980:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:19c0::,2402:19c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:1a00::,2402:1a00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2402:1a40::,2402:1a40:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:1a80::,2402:1a80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:1ac0::,2402:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:1b00::,2402:1b00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:1b40::,2402:1b40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1b80::,2402:1b80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1bc0::,2402:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:1c00::,2402:1c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:1c40::,2402:1c40:ffff:ffff:ffff:ffff:ffff:ffff,PK +2402:1c80::,2402:1c80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:1cc0::,2402:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:1d00::,2402:1d00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:1d40::,2402:1d40:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:1d80::,2402:1d80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:1dc0::,2402:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,NP +2402:1e00::,2402:1e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1e40::,2402:1e40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:1e80::,2402:1e80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:1ec0::,2402:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:1f00::,2402:1f00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:1f40::,2402:1f40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:1f80::,2402:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:1fc0::,2402:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:2000::,2402:2000:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:2040::,2402:2040:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:2080::,2402:2080:ffff:ffff:ffff:ffff:ffff:ffff,TW +2402:20c0::,2402:20c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2402:2100::,2402:2100:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:2140::,2402:2140:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:21c0::,2402:21c0:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:2200::,2402:2200:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:2240::,2402:2240:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:2280::,2402:2280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:22c0::,2402:22c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:2300::,2402:2300:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:2380::,2402:2380:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:2400::,2402:2400:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:2480::,2402:2480:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:2500::,2402:2500:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:2580::,2402:2580:ffff:ffff:ffff:ffff:ffff:ffff,TW +2402:2600::,2402:2600:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:2680::,2402:2680:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:2700::,2402:2700:ffff:ffff:ffff:ffff:ffff:ffff,TH +2402:2780::,2402:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:2800::,2402:2800:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:2880::,2402:2880:ffff:ffff:ffff:ffff:ffff:ffff,AF +2402:2900::,2402:2900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:2980::,2402:2980:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:2a00::,2402:2a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:2a80::,2402:2a80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:2b00::,2402:2b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:2b80::,2402:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:2c00::,2402:2c00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:2c80::,2402:2c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:2d00::,2402:2d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:2d80::,2402:2d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:2e80::,2402:2e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:2f00::,2402:2f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:2f80::,2402:2f80:7:ffff:ffff:ffff:ffff:ffff,AU +2402:2f80:8::,2402:2f80:8:ffff:ffff:ffff:ffff:ffff,HK +2402:2f80:9::,2402:2f80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:3000::,2402:3000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:3080::,2402:3080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:3100::,2402:3100:ffff:ffff:ffff:ffff:ffff:ffff,KR +2402:3180::,2402:3180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:3200::,2402:3200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:3280::,2402:3280:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:3300::,2402:3300:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:3380::,2402:3380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:3480::,2402:3480:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:3500::,2402:3500:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:3580::,2402:3580:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:3600::,2402:3600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:3680::,2402:3680:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:3700::,2402:3700:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:3780::,2402:3780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:3800::,2402:3800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:3880::,2402:3880:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:3900::,2402:3900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:3980::,2402:3980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:3a00::,2402:3a00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:3a80::,2402:3a80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:3b00::,2402:3b00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:3b80::,2402:3b80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:3c00::,2402:3c00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:3c80::,2402:3c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:3d00::,2402:3d00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:3d80::,2402:3d80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:3e00::,2402:3e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:3e80::,2402:3e80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:3f80::,2402:3f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:4000::,2402:4000:ffff:ffff:ffff:ffff:ffff:ffff,LK +2402:4100::,2402:4100:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:4180::,2402:4180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:4200::,2402:4200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:4280::,2402:4280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:4300::,2402:4300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:4380::,2402:4380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:4400::,2402:4400:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:4480::,2402:4480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:4500::,2402:4500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:4600::,2402:4600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:4680::,2402:4680:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:4700::,2402:4700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:4780::,2402:4780:ffff:ffff:ffff:ffff:ffff:ffff,TH +2402:4800::,2402:4800:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:4880::,2402:4880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:4900::,2402:4900:ffff:ffff:ffff:ffff:ffff:ffff,TW +2402:4980::,2402:4980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:4a00::,2402:4a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:4a80::,2402:4a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:4b00::,2402:4b00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:4b80::,2402:4b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:4c00::,2402:4c01:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:4c80::,2402:4c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:4d00::,2402:4d00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:4d80::,2402:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:4e00::,2402:4e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:4e80::,2402:4e80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:4f00::,2402:4f00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:4f80::,2402:4f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:5080::,2402:5080:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:5100::,2402:5100:ffff:ffff:ffff:ffff:ffff:ffff,KH +2402:5180::,2402:5180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:5200::,2402:5200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:5280::,2402:5280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:5300::,2402:5300:ffff:ffff:ffff:ffff:ffff:ffff,VN +2402:5380::,2402:5380:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:5400::,2402:5400:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:5480::,2402:5480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:5500::,2402:5500:ffff:ffff:ffff:ffff:ffff:ffff,PH +2402:5580::,2402:5580:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:5600::,2402:5600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:5680::,2402:5680:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:5700::,2402:5700:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:5780::,2402:5780:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:5800::,2402:5800:ffff:ffff:ffff:ffff:ffff:ffff,KR +2402:5880::,2402:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:5900::,2402:5900:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:5980::,2402:5980:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:5a00::,2402:5a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:5b00::,2402:5b00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:5c00::,2402:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:5c80::,2402:5c80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:5d00::,2402:5d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:5d80::,2402:5d80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:5e00::,2402:5e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:5e80::,2402:5e80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:5f00::,2402:5f00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:5f80::,2402:5f80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:6000::,2402:6000:ff:ffff:ffff:ffff:ffff:ffff,AU +2402:6000:100::,2402:6000:100:7fff:ffff:ffff:ffff:ffff,NZ +2402:6000:100:8000::,2402:6000:100:ffff:ffff:ffff:ffff:ffff,AU +2402:6000:101::,2402:6000:101:7fff:ffff:ffff:ffff:ffff,NZ +2402:6000:101:8000::,2402:6000:103:ffff:ffff:ffff:ffff:ffff,AU +2402:6000:104::,2402:6000:104:ffff:ffff:ffff:ffff:ffff,NZ +2402:6000:105::,2402:6000:10f:ffff:ffff:ffff:ffff:ffff,AU +2402:6000:110::,2402:6000:110:7fff:ffff:ffff:ffff:ffff,NZ +2402:6000:110:8000::,2402:6000:202:ffff:ffff:ffff:ffff:ffff,AU +2402:6000:203::,2402:6000:203:7fff:ffff:ffff:ffff:ffff,NZ +2402:6000:203:8000::,2402:6000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:6100::,2402:6100:ffff:ffff:ffff:ffff:ffff:ffff,KR +2402:6200::,2402:6200:ffff:ffff:ffff:ffff:ffff:ffff,GU +2402:6280::,2402:6280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:6400::,2402:6400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:6480::,2402:6480:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:6500::,2402:6500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:6580::,2402:6580:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:6600::,2402:6600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:6680::,2402:6680:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:6700::,2402:6700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:6780::,2402:6780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:6800::,2402:6800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:6880::,2402:6880:ffff:ffff:ffff:ffff:ffff:ffff,TH +2402:6900::,2402:6900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:6980::,2402:6980:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:6a00::,2402:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:6a80::,2402:6a80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:6b00::,2402:6b00:38b0:ffff:ffff:ffff:ffff:ffff,JP +2402:6b00:38b1::,2402:6b00:38b1:7fff:ffff:ffff:ffff:ffff,US +2402:6b00:38b1:8000::,2402:6b00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:6b80::,2402:6b80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:6c00::,2402:6c00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:6c80::,2402:6c80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:6d00::,2402:6d00:ffff:ffff:ffff:ffff:ffff:ffff,PF +2402:6d80::,2402:6d80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2402:6e00::,2402:6e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:6e80::,2402:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:6f00::,2402:6f00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:6f80::,2402:6f80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:7000::,2402:7000:ffff:ffff:ffff:ffff:ffff:ffff,KR +2402:7080::,2402:7080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:7100::,2402:7100:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:7180::,2402:7180:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:7200::,2402:7200:ffff:ffff:ffff:ffff:ffff:ffff,TK +2402:7280::,2402:7280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:7300::,2402:7300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:7380::,2402:7380:7ff:ffff:ffff:ffff:ffff:ffff,JP +2402:7380:800::,2402:7380:fff:ffff:ffff:ffff:ffff:ffff,HK +2402:7400::,2402:7400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:7480::,2402:7481:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:7500::,2402:7500:ffff:ffff:ffff:ffff:ffff:ffff,TW +2402:7600::,2402:7600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:7680::,2402:7680:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:7700::,2402:7700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:7780::,2402:7780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:7800::,2402:7800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:7880::,2402:7880:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:7900::,2402:7900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:7980::,2402:7980:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:7a00::,2402:7a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:7a80::,2402:7a80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:7b00::,2402:7b00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:7b80::,2402:7b80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:7c00::,2402:7c00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2402:7c80::,2402:7c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:7d00::,2402:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:7d80::,2402:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:7e00::,2402:7e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:7e80::,2402:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:7f00::,2402:7f00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:7f80::,2402:7f80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:8000::,2402:8000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:8080::,2402:8080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:8100::,2402:8100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:8180::,2402:8180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:8200::,2402:8200:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:8280::,2402:8280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:8300::,2402:8300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:8380::,2402:8380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:8400::,2402:8400:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:8480::,2402:8480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:8600::,2402:8600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:8680::,2402:8680:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:8700::,2402:8700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:8780::,2402:8780:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:8800::,2402:8800:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:8880::,2402:8880:ffff:ffff:ffff:ffff:ffff:ffff,MN +2402:8900::,2402:8900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:8a00::,2402:8a00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:8a80::,2402:8a80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:8b00::,2402:8b00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:8b80::,2402:8b80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:8c00::,2402:8c00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:8c80::,2402:8c80:ffff:ffff:ffff:ffff:ffff:ffff,LA +2402:8d00::,2402:8d03:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:8d80::,2402:8d80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:8e00::,2402:8e00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:8e80::,2402:8e80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:8f00::,2402:8f00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:8f80::,2402:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:9080::,2402:9080:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:9100::,2402:9100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:9180::,2402:9180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:9200::,2402:9200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:9280::,2402:9280:ffff:ffff:ffff:ffff:ffff:ffff,MO +2402:9300::,2402:9300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:9380::,2402:9380:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:9400::,2402:9400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:9480::,2402:9480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:9500::,2402:9500:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:9580::,2402:9580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:9680::,2402:9680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:9780::,2402:9780:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:9800::,2402:9800:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:9880::,2402:9880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:9900::,2402:9900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:9980::,2402:9980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:9a00::,2402:9a00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:9a80::,2402:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:9b00::,2402:9b00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2402:9b80::,2402:9b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:9c00::,2402:9c00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2402:9c80::,2402:9c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:9d80::,2402:9d80:ffff:ffff:ffff:ffff:ffff:ffff,VN +2402:9e00::,2402:9e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:9e80::,2402:9e80::ffff:ffff:ffff:ffff:ffff,HK +2402:9e80:1::,2402:9e80:1:7fff:ffff:ffff:ffff:ffff,AU +2402:9e80:1:8000::,2402:9e80:13:ffff:ffff:ffff:ffff:ffff,HK +2402:9e80:14::,2402:9e80:14:ffff:ffff:ffff:ffff:ffff,VN +2402:9e80:15::,2402:9e80:15:ffff:ffff:ffff:ffff:ffff,US +2402:9e80:16::,2402:9e80:17:ffff:ffff:ffff:ffff:ffff,HK +2402:9e80:18::,2402:9e80:18:7fff:ffff:ffff:ffff:ffff,CN +2402:9e80:18:8000::,2402:9e80:18:ffff:ffff:ffff:ffff:ffff,HK +2402:9e80:19::,2402:9e80:19:ffff:ffff:ffff:ffff:ffff,KR +2402:9e80:1a::,2402:9e80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:9f00::,2402:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:9f80::,2402:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:a000::,2402:a000:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:a080::,2402:a080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:a100::,2402:a100:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:a180::,2402:a180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:a200::,2402:a200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:a280::,2402:a280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:a300::,2402:a300:ffff:ffff:ffff:ffff:ffff:ffff,NP +2402:a380::,2402:a380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:a400::,2402:a400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:a480::,2402:a480:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:a500::,2402:a500:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:a600::,2402:a600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:a680::,2402:a680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:a700::,2402:a700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:a780::,2402:a780:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:a800::,2402:a800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:a880::,2402:a880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:a900::,2402:a900:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:a980::,2402:a980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:aa80::,2402:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:ab00::,2402:ab00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:ab80::,2402:ab80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:ac00::,2402:ac00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:ac80::,2402:ac80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:ad00::,2402:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:ad80::,2402:ad80:ffff:ffff:ffff:ffff:ffff:ffff,PK +2402:ae00::,2402:ae00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:ae80::,2402:ae80:ffff:ffff:ffff:ffff:ffff:ffff,WS +2402:af00::,2402:af00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:af80::,2402:af80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:b080::,2402:b080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:b100::,2402:b100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:b180::,2402:b180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:b200::,2402:b200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:b280::,2402:b280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:b300::,2402:b300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:b380::,2402:b380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:b400::,2402:b400:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:b480::,2402:b480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:b500::,2402:b500:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:b580::,2402:b580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:b600::,2402:b600:ffff:ffff:ffff:ffff:ffff:ffff,TW +2402:b700::,2402:b700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:b780::,2402:b780:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:b800::,2402:b801:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:b880::,2402:b880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:b980::,2402:b980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:ba00::,2402:ba00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2402:ba80::,2402:ba80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:bb00::,2402:bb00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:bb80::,2402:bb80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:bc00::,2402:bc07:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:bc80::,2402:bc80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:bd00::,2402:bd00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:bd80::,2402:bd81:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:bd82::,2402:bd83:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:be00::,2402:be00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2402:be80::,2402:be80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:bf00::,2402:bf00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:bf80::,2402:bf80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:c000::,2402:c000:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:c080::,2402:c081:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:c100::,2402:c100:ffff:ffff:ffff:ffff:ffff:ffff,KH +2402:c180::,2402:c180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:c200::,2402:c200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:c280::,2402:c280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:c300::,2402:c300:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:c380::,2402:c380:ffff:ffff:ffff:ffff:ffff:ffff,TH +2402:c400::,2402:c400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:c480::,2402:c480:4fff:ffff:ffff:ffff:ffff:ffff,HK +2402:c480:5000::,2402:c480:5000:7fff:ffff:ffff:ffff:ffff,SG +2402:c480:5000:8000::,2402:c480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:c500::,2402:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:c580::,2402:c580:ffff:ffff:ffff:ffff:ffff:ffff,US +2402:c600::,2402:c600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:c680::,2402:c680:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:c700::,2402:c700:ffff:ffff:ffff:ffff:ffff:ffff,VN +2402:c780::,2402:c780:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:c800::,2402:c800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:c880::,2402:c880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:c900::,2402:c900:ffff:ffff:ffff:ffff:ffff:ffff,MN +2402:c980::,2402:c980:ffff:ffff:ffff:ffff:ffff:ffff,TH +2402:ca00::,2402:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:cb00::,2402:cb01:ffff:ffff:ffff:ffff:ffff:ffff,LK +2402:cc00::,2402:cc00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:cc80::,2402:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:cd00::,2402:cd00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:cd80::,2402:cd80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:ce00::,2402:ce01:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:ce80::,2402:ce80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:cf00::,2402:cf00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:cf80::,2402:cf80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:d000::,2402:d000:ffff:ffff:ffff:ffff:ffff:ffff,LK +2402:d080::,2402:d080:ffff:ffff:ffff:ffff:ffff:ffff,TL +2402:d100::,2402:d100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:d180::,2402:d180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:d200::,2402:d200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:d280::,2402:d280:ffff:ffff:ffff:ffff:ffff:ffff,NL +2402:d300::,2402:d300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:d380::,2402:d380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:d400::,2402:d400:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:d500::,2402:d500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:d580::,2402:d580:ffff:ffff:ffff:ffff:ffff:ffff,US +2402:d600::,2402:d600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:d680::,2402:d680:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:d700::,2402:d700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:d780::,2402:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:d800::,2402:d800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:d880::,2402:d880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:d900::,2402:d900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:d980::,2402:d980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:da00::,2402:da00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:da80::,2402:da80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:db00::,2402:db00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:db80::,2402:db80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:dc00::,2402:dc00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:dc80::,2402:dc80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:dd80::,2402:dd80:ffff:ffff:ffff:ffff:ffff:ffff,AF +2402:de00::,2402:de00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2402:de80::,2402:de80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:df00::,2402:df00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:df80::,2402:df80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:e000::,2402:e000:ffff:ffff:ffff:ffff:ffff:ffff,PK +2402:e080::,2402:e080:ffff:ffff:ffff:ffff:ffff:ffff,AF +2402:e100::,2402:e100:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:e180::,2402:e180:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:e200::,2402:e200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:e280::,2402:e280:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:e300::,2402:e300:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:e380::,2402:e380::ffff:ffff:ffff:ffff:ffff,HK +2402:e380:1::,2402:e380:ffff:ffff:ffff:ffff:ffff:ffff,US +2402:e400::,2402:e400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:e480::,2402:e480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:e500::,2402:e500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:e580::,2402:e580:ffff:ffff:ffff:ffff:ffff:ffff,US +2402:e600::,2402:e600:ffff:ffff:ffff:ffff:ffff:ffff,SG +2402:e680::,2402:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:e780::,2402:e780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:e800::,2402:e800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2402:e880::,2402:e880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:e900::,2402:e900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:e980::,2402:e980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:ea80::,2402:ea80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:eb00::,2402:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:eb80::,2402:eb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:ec00::,2402:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:ec80::,2402:ec80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:ed80::,2402:ed80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:ee00::,2402:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:ee80::,2402:ee80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:ef00::,2402:ef3f:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:ef80::,2402:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:f000::,2402:f000:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:f080::,2402:f080:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:f100::,2402:f100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:f180::,2402:f180:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:f200::,2402:f200:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:f280::,2402:f280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:f300::,2402:f300:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:f400::,2402:f400:ffff:ffff:ffff:ffff:ffff:ffff,KR +2402:f480::,2402:f480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:f500::,2402:f500:ffff:ffff:ffff:ffff:ffff:ffff,BD +2402:f580::,2402:f580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:f600::,2402:f600:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:f680::,2402:f680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:f700::,2402:f700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:f780::,2402:f780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:f800::,2402:f800:ffff:ffff:ffff:ffff:ffff:ffff,VN +2402:f900::,2402:f900:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:f980::,2402:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2402:fa00::,2402:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:fa80::,2402:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2402:fb00::,2402:fb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2402:fb80::,2402:fb80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2402:fc00::,2402:fc00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2402:fc80::,2402:fc80:ffff:ffff:ffff:ffff:ffff:ffff,TH +2402:fd00::,2402:fd00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2402:fe00::,2402:fe00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2402:fe80::,2402:fe80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2402:ff00::,2402:ff00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:ff80::,2402:ff80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403::,2403:1:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:80::,2403:80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:100::,2403:100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:180::,2403:180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:200::,2403:200:ffff:ffff:ffff:ffff:ffff:ffff,NC +2403:280::,2403:280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:300::,2403:300:a03:ffff:ffff:ffff:ffff:ffff,SG +2403:300:a04::,2403:300:a04:ffff:ffff:ffff:ffff:ffff,HK +2403:300:a05::,2403:300:a07:ffff:ffff:ffff:ffff:ffff,SG +2403:300:a08::,2403:300:a08:ffff:ffff:ffff:ffff:ffff,AU +2403:300:a09::,2403:300:a09:ffff:ffff:ffff:ffff:ffff,SG +2403:300:a0a::,2403:300:a0a:ffff:ffff:ffff:ffff:ffff,HK +2403:300:a0b::,2403:300:a13:ffff:ffff:ffff:ffff:ffff,SG +2403:300:a14::,2403:300:a14:ffff:ffff:ffff:ffff:ffff,JP +2403:300:a15::,2403:300:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:380::,2403:380:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:400::,2403:400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:480::,2403:480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:500::,2403:500:ffff:ffff:ffff:ffff:ffff:ffff,LA +2403:580::,2403:580:ffff:ffff:ffff:ffff:ffff:ffff,BT +2403:600::,2403:600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:680::,2403:680:ffff:ffff:ffff:ffff:ffff:ffff,BD +2403:700::,2403:700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:780::,2403:780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:800::,2403:801:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:880::,2403:880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:900::,2403:900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:980::,2403:980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:a00::,2403:a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:a80::,2403:a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b00::,2403:b00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:b80::,2403:b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:c00::,2403:c00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:c80::,2403:c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d00::,2403:d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:d80::,2403:d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e00::,2403:e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:e80::,2403:e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f00::,2403:f00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f80::,2403:f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:1000::,2403:1000:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:1080::,2403:1080:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:1100::,2403:1100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:1180::,2403:1180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:1280::,2403:1280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:1300::,2403:1300:ffff:ffff:ffff:ffff:ffff:ffff,MY +2403:1380::,2403:1380:ffff:ffff:ffff:ffff:ffff:ffff,MY +2403:1400::,2403:1400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:1480::,2403:1480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:1500::,2403:1500:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:1580::,2403:1580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:1600::,2403:1600:ffff:ffff:ffff:ffff:ffff:ffff,KH +2403:1680::,2403:1680:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:1700::,2403:1700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:1780::,2403:1780:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:1800::,2403:1800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:1880::,2403:1880:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:1900::,2403:1900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:1980::,2403:1980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:1a00::,2403:1a00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:1a80::,2403:1a80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:1b80::,2403:1b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:1c00::,2403:1c00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:1c80::,2403:1c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:1d00::,2403:1d00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:1d80::,2403:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:1e00::,2403:1e00:ffff:ffff:ffff:ffff:ffff:ffff,AS +2403:1e80::,2403:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:1f00::,2403:1f00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:1f80::,2403:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:2000::,2403:2000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:2080::,2403:2080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:2100::,2403:2100:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:2180::,2403:2180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:2200::,2403:2200:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:2280::,2403:2280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:2300::,2403:2300:ffff:ffff:ffff:ffff:ffff:ffff,TH +2403:2380::,2403:2380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:2400::,2403:2400:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:2480::,2403:2480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:2500::,2403:2500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:2580::,2403:2580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:2600::,2403:2600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:2680::,2403:2680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:2700::,2403:2700:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:2780::,2403:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:2800::,2403:2801:ffff:ffff:ffff:ffff:ffff:ffff,TH +2403:2880::,2403:2880:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:2900::,2403:2900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:2980::,2403:2980:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:2a00::,2403:2a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:2a80::,2403:2a80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:2b80::,2403:2b80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2403:2c00::,2403:2c00:2:ffff:ffff:ffff:ffff:ffff,HK +2403:2c00:3::,2403:2c00:4:ffff:ffff:ffff:ffff:ffff,SG +2403:2c00:5::,2403:2c00:6:ffff:ffff:ffff:ffff:ffff,HK +2403:2c00:7::,2403:2c00:7:ffff:ffff:ffff:ffff:ffff,JP +2403:2c00:8::,2403:2c00:8:ffff:ffff:ffff:ffff:ffff,DE +2403:2c00:9::,2403:2c00:a:ffff:ffff:ffff:ffff:ffff,US +2403:2c00:b::,2403:2c00:b::,ZA +2403:2c00:b::1,2403:2c00:9fff:ffff:ffff:ffff:ffff:ffff,HK +2403:2c00:a000::,2403:2c00:afff:ffff:ffff:ffff:ffff:ffff,ZA +2403:2c00:b000::,2403:2c00:bfff:ffff:ffff:ffff:ffff:ffff,DE +2403:2c00:c000::,2403:2c00:cfff:ffff:ffff:ffff:ffff:ffff,JP +2403:2c00:d000::,2403:2c00:dfff:ffff:ffff:ffff:ffff:ffff,HK +2403:2c00:e000::,2403:2c00:efff:ffff:ffff:ffff:ffff:ffff,SG +2403:2c00:f000::,2403:2c00:fffa:ffff:ffff:ffff:ffff:ffff,HK +2403:2c00:fffb::,2403:2c00:fffb:ffff:ffff:ffff:ffff:ffff,US +2403:2c00:fffc::,2403:2c00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:2c80::,2403:2c80::7fff:ffff:ffff:ffff:ffff,CN +2403:2c80:0:8000::,2403:2c80::ffff:ffff:ffff:ffff:ffff,HK +2403:2c80:1::,2403:2c80:1:ffff:ffff:ffff:ffff:ffff,JP +2403:2c80:2::,2403:2c80:2:ffff:ffff:ffff:ffff:ffff,SG +2403:2c80:3::,2403:2c80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:2d00::,2403:2d00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:2d80::,2403:2d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:2e00::,2403:2e00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:2e80::,2403:2e80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:2f00::,2403:2f00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:2f80::,2403:2f80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:3080::,2403:3080:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:3100::,2403:3100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:3180::,2403:3180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:3200::,2403:3200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:3280::,2403:3280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3300::,2403:3300:ffff:ffff:ffff:ffff:ffff:ffff,NL +2403:3380::,2403:3380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3400::,2403:3400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:3480::,2403:3480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3500::,2403:3500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:3580::,2403:3580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3600::,2403:3600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:3680::,2403:3680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3700::,2403:3700:ffff:ffff:ffff:ffff:ffff:ffff,KR +2403:3780::,2403:3780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3800::,2403:3800:ffff:ffff:ffff:ffff:ffff:ffff,NP +2403:3880::,2403:3880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3900::,2403:3900:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:3980::,2403:3980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3a00::,2403:3a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:3b00::,2403:3b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:3b80::,2403:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3c00::,2403:3c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:3c80::,2403:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3d00::,2403:3d00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:3d80::,2403:3d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3e00::,2403:3e00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2403:3e80::,2403:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:3f00::,2403:3f00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2403:3f80::,2403:3f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4000::,2403:4000:ffff:ffff:ffff:ffff:ffff:ffff,BD +2403:4080::,2403:4080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4100::,2403:4100:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:4180::,2403:4180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4200::,2403:4200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:4280::,2403:4280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4300::,2403:4300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4380::,2403:4380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4400::,2403:4400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:4480::,2403:4480:ffff:ffff:ffff:ffff:ffff:ffff,WS +2403:4500::,2403:4500:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:4580::,2403:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4600::,2403:4600:ffff:ffff:ffff:ffff:ffff:ffff,FJ +2403:4680::,2403:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4700::,2403:4700:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:4780::,2403:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4800::,2403:4800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:4880::,2403:4880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4900::,2403:4900:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:4980::,2403:4980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4a00::,2403:4a00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:4a80::,2403:4a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4b00::,2403:4b00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2403:4b80::,2403:4b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4c00::,2403:4c00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2403:4c80::,2403:4c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4d00::,2403:4d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:4d80::,2403:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:4e00::,2403:4e00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:4e80::,2403:4e80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:4f00::,2403:4f00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:4f80::,2403:4f80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:5000::,2403:5000:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:5080::,2403:5080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5100::,2403:5100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:5180::,2403:5180:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:5200::,2403:5200:ffff:ffff:ffff:ffff:ffff:ffff,TW +2403:5280::,2403:5280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5300::,2403:5300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:5380::,2403:5380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5400::,2403:5400:ffff:ffff:ffff:ffff:ffff:ffff,TH +2403:5480::,2403:5480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5500::,2403:5500:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:5580::,2403:5580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5600::,2403:5600:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:5680::,2403:5680:14:ffff:ffff:ffff:ffff:ffff,AU +2403:5680:15::,2403:5680:15:ffff:ffff:ffff:ffff:ffff,US +2403:5680:16::,2403:5680:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:5700::,2403:5700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:5780::,2403:5780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5800::,2403:5800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:5880::,2403:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5900::,2403:5900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:5980::,2403:5980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5a00::,2403:5a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:5a80::,2403:5a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5b00::,2403:5b00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:5b80::,2403:5b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5c80::,2403:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5d80::,2403:5d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5e00::,2403:5e00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2403:5e80::,2403:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:5f00::,2403:5f00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:5f80::,2403:5f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6000::,2403:6000:ffff:ffff:ffff:ffff:ffff:ffff,VN +2403:6080::,2403:6080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6100::,2403:6100:ffff:ffff:ffff:ffff:ffff:ffff,TH +2403:6180::,2403:6180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6200::,2403:6200:ffff:ffff:ffff:ffff:ffff:ffff,TH +2403:6280::,2403:6280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6300::,2403:6300:ffff:ffff:ffff:ffff:ffff:ffff,KR +2403:6380::,2403:6380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6400::,2403:6400:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:6480::,2403:6480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6500::,2403:6500:ffff:ffff:ffff:ffff:ffff:ffff,KR +2403:6580::,2403:6580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6600::,2403:6600:ffff:ffff:ffff:ffff:ffff:ffff,KH +2403:6680::,2403:6680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6700::,2403:6700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:6780::,2403:6780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6800::,2403:6800:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:6880::,2403:6880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6900::,2403:6900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:6980::,2403:6980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6a00::,2403:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6a80::,2403:6a80:ffff:ffff:ffff:ffff:ffff:ffff,MM +2403:6b00::,2403:6b00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:6b80::,2403:6b80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:6c00::,2403:6c00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:6c80::,2403:6c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6d00::,2403:6d00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:6d80::,2403:6d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6e00::,2403:6e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:6e80::,2403:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:6f80::,2403:6f80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:7000::,2403:7000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:7080::,2403:7080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:7100::,2403:7100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:7180::,2403:7180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:7200::,2403:7200:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:7280::,2403:7280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:7300::,2403:7300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:7380::,2403:7380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:7400::,2403:7400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:7480::,2403:7480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:7500::,2403:7500:ffff:ffff:ffff:ffff:ffff:ffff,KH +2403:7580::,2403:7580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:7600::,2403:7600:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:7680::,2403:7680:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:7700::,2403:7700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:7780::,2403:7780:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:7800::,2403:7800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:7900::,2403:7900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:7980::,2403:7980:ffff:ffff:ffff:ffff:ffff:ffff,PK +2403:7a00::,2403:7a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:7a80::,2403:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:7b00::,2403:7b00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:7b80::,2403:7b80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:7c00::,2403:7c00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:7c80::,2403:7c80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:7d00::,2403:7d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:7d80::,2403:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:7e00::,2403:7e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:7e80::,2403:7e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:7f00::,2403:7f00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:7f80::,2403:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8000::,2403:8000:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:8080::,2403:8080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8100::,2403:8100:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:8180::,2403:8180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8200::,2403:8200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:8280::,2403:8280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8300::,2403:8300:ffff:ffff:ffff:ffff:ffff:ffff,DE +2403:8380::,2403:8380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8400::,2403:8400:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:8480::,2403:8480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8500::,2403:8500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:8580::,2403:8580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8600::,2403:8600:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:8680::,2403:8680:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:8700::,2403:8700:ffff:ffff:ffff:ffff:ffff:ffff,BT +2403:8780::,2403:8780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:8800::,2403:8800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:8880::,2403:8880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8900::,2403:8900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8980::,2403:8980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8a00::,2403:8a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:8a80::,2403:8a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8b00::,2403:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8b80::,2403:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8c00::,2403:8c00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8c80::,2403:8c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8d00::,2403:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8d80::,2403:8d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:8e00::,2403:8e00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:8e80::,2403:8e80:ffff:ffff:ffff:ffff:ffff:ffff,MM +2403:8f00::,2403:8f00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:8f80::,2403:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9000::,2403:9000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:9080::,2403:9080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9100::,2403:9100:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:9180::,2403:9180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9200::,2403:9200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:9280::,2403:9280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9300::,2403:9300:ffff:ffff:ffff:ffff:ffff:ffff,BD +2403:9380::,2403:9380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9400::,2403:9400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:9480::,2403:9480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9500::,2403:9500:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:9580::,2403:9580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9600::,2403:9600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:9680::,2403:9680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9700::,2403:9700:ffff:ffff:ffff:ffff:ffff:ffff,MY +2403:9780::,2403:9780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9800::,2403:9800:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:9880::,2403:9880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9900::,2403:9a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:9a80::,2403:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9b00::,2403:9b00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9b80::,2403:9b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9c00::,2403:9c00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:9c80::,2403:9c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9d00::,2403:9d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9d80::,2403:9d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9e00::,2403:9e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:9e80::,2403:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:9f00::,2403:9f00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2403:9f80::,2403:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:a000::,2403:a000:ffff:ffff:ffff:ffff:ffff:ffff,PH +2403:a080::,2403:a080:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:a100::,2403:a100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:a180::,2403:a180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:a200::,2403:a200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:a280::,2403:a280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:a300::,2403:a300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:a380::,2403:a380:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:a400::,2403:a400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:a480::,2403:a480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:a500::,2403:a500:ffff:ffff:ffff:ffff:ffff:ffff,PK +2403:a580::,2403:a580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:a600::,2403:a600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:a680::,2403:a680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:a700::,2403:a700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:a780::,2403:a780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:a800::,2403:a800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:a880::,2403:a880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:a900::,2403:a900:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:a980::,2403:a980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:aa00::,2403:aa00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:aa80::,2403:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ab80::,2403:ab80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ac00::,2403:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ac80::,2403:ac80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:ad00::,2403:ad00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:ad80::,2403:ad80:5f:ffff:ffff:ffff:ffff:ffff,HK +2403:ad80:60::,2403:ad80:67:ffff:ffff:ffff:ffff:ffff,JP +2403:ad80:68::,2403:ad80:7f:ffff:ffff:ffff:ffff:ffff,HK +2403:ad80:80::,2403:ad80:87:ffff:ffff:ffff:ffff:ffff,US +2403:ad80:88::,2403:ad80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:ae00::,2403:ae00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:ae80::,2403:ae80:ffff:ffff:ffff:ffff:ffff:ffff,NR +2403:af00::,2403:af00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:af80::,2403:af80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b000::,2403:b000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:b080::,2403:b080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b100::,2403:b100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:b180::,2403:b180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b200::,2403:b200:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:b280::,2403:b280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b300::,2403:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:b380::,2403:b380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b400::,2403:b400:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b480::,2403:b480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b500::,2403:b500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:b580::,2403:b580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b600::,2403:b600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:b680::,2403:b680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b700::,2403:b700:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:b780::,2403:b780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b800::,2403:b800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:b880::,2403:b880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:b900::,2403:b900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:b980::,2403:b980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ba00::,2403:ba00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:ba80::,2403:ba80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:bb00::,2403:bb00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:bc00::,2403:bc00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2403:bc80::,2403:bc80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:bd00::,2403:bd00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:bd80::,2403:bd80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:be00::,2403:be00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:be80::,2403:be80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:bf00::,2403:bf00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2403:bf80::,2403:bf80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2403:c000::,2403:c000:ffff:ffff:ffff:ffff:ffff:ffff,TH +2403:c080::,2403:c080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:c100::,2403:c100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:c180::,2403:c180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:c200::,2403:c200:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:c280::,2403:c280:ffff:ffff:ffff:ffff:ffff:ffff,MM +2403:c300::,2403:c300:ffff:ffff:ffff:ffff:ffff:ffff,TW +2403:c380::,2403:c380:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:c400::,2403:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:c480::,2403:c480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:c500::,2403:c500:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:c580::,2403:c580:ffff:ffff:ffff:ffff:ffff:ffff,MY +2403:c600::,2403:c600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:c680::,2403:c680:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:c780::,2403:c780:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:c800::,2403:c800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:c880::,2403:c881:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:c900::,2403:c900:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:c980::,2403:c980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ca00::,2403:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:cb00::,2403:cb00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:cb80::,2403:cb80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:cc00::,2403:cc00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:cc80::,2403:cc80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2403:cd00::,2403:cd00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2403:cd80::,2403:cd80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2403:ce00::,2403:ce00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:cf00::,2403:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:cf80::,2403:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d000::,2403:d000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:d080::,2403:d080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d100::,2403:d100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:d180::,2403:d180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d200::,2403:d200:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:d280::,2403:d280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d300::,2403:d300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:d380::,2403:d380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d400::,2403:d400:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d480::,2403:d480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d500::,2403:d500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:d580::,2403:d580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d600::,2403:d600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:d680::,2403:d680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d700::,2403:d700:ffff:ffff:ffff:ffff:ffff:ffff,MN +2403:d780::,2403:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d880::,2403:d880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:d900::,2403:d900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:d980::,2403:d980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:da00::,2403:da00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:da80::,2403:da80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:db00::,2403:db00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:db80::,2403:db80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:dc00::,2403:dc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:dc80::,2403:dc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:dd00::,2403:dd00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2403:dd80::,2403:dd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:de00::,2403:de00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:de80::,2403:de80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:df00::,2403:df00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:df80::,2403:df80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e000::,2403:e000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:e080::,2403:e080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e100::,2403:e100:ffff:ffff:ffff:ffff:ffff:ffff,BD +2403:e180::,2403:e180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e200::,2403:e200:ffff:ffff:ffff:ffff:ffff:ffff,VN +2403:e280::,2403:e280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e300::,2403:e300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e380::,2403:e380:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:e400::,2403:e400:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:e480::,2403:e480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e500::,2403:e500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e580::,2403:e580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e600::,2403:e600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:e680::,2403:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e700::,2403:e700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e780::,2403:e780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e800::,2403:e800:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:e880::,2403:e880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:e900::,2403:e900:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:e980::,2403:e980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ea00::,2403:ea00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:ea80::,2403:ea80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:eb00::,2403:eb00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2403:eb80::,2403:eb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ec00::,2403:ec00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2403:ec80::,2403:ec80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ed00::,2403:ed00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ed80::,2403:ed80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ee00::,2403:ee00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2403:ee80::,2403:ee80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ef80::,2403:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f000::,2403:f000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:f080::,2403:f080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f100::,2403:f100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f180::,2403:f180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f200::,2403:f200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:f280::,2403:f280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f300::,2403:f300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f380::,2403:f380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f480::,2403:f480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:f481::,2403:f481:ffff:ffff:ffff:ffff:ffff:ffff,US +2403:f500::,2403:f500:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:f580::,2403:f580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f600::,2403:f600:ffff:ffff:ffff:ffff:ffff:ffff,NR +2403:f680::,2403:f680:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:f700::,2403:f700:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2403:f780::,2403:f780:ffff:ffff:ffff:ffff:ffff:ffff,BD +2403:f800::,2403:f800:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f880::,2403:f880:ffff:ffff:ffff:ffff:ffff:ffff,JP +2403:f900::,2403:f900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:f980::,2403:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:fa00::,2403:fa00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2403:fa80::,2403:fa80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2403:fb00::,2403:fb00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:fb80::,2403:fb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:fc00::,2403:fc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:fc80::,2403:fc80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:fd00::,2403:fd00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:fd80::,2403:fd80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:fe00::,2403:fe00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2403:fe80::,2403:fe80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2403:ff00::,2403:ff00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2403:ff80::,2403:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404::,2404:3f:ffff:ffff:ffff:ffff:ffff:ffff,TW +2404:80::,2404:8f:ffff:ffff:ffff:ffff:ffff:ffff,TW +2404:a0::,2404:a0:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:a8::,2404:a8:ffff:ffff:ffff:ffff:ffff:ffff,MY +2404:b0::,2404:b1:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:b8::,2404:b8:ffff:ffff:ffff:ffff:ffff:ffff,MY +2404:c0::,2404:c0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:c8::,2404:c8:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:d0::,2404:d0:ffff:ffff:ffff:ffff:ffff:ffff,PH +2404:d8::,2404:d8:ffff:ffff:ffff:ffff:ffff:ffff,PH +2404:e0::,2404:ef:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:100::,2404:100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:130::,2404:130:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:138::,2404:139:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:140::,2404:140:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:150::,2404:150:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:158::,2404:158:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:160::,2404:160:ffff:ffff:ffff:ffff:ffff:ffff,MY +2404:168::,2404:168:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:170::,2404:170:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:178::,2404:178:ffff:ffff:ffff:ffff:ffff:ffff,TW +2404:180::,2404:18f:ffff:ffff:ffff:ffff:ffff:ffff,KR +2404:1a0::,2404:1a3:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:1a8::,2404:1a8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:1b0::,2404:1b0:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:1b8::,2404:1b8:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:200::,2404:200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:280::,2404:280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:300::,2404:300:ffff:ffff:ffff:ffff:ffff:ffff,KH +2404:380::,2404:380:ffff:ffff:ffff:ffff:ffff:ffff,GU +2404:400::,2404:400:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:480::,2404:480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:500::,2404:500:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:580::,2404:580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:600::,2404:600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:680::,2404:680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:700::,2404:700:ffff:ffff:ffff:ffff:ffff:ffff,KH +2404:780::,2404:780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:800::,2404:800:ffff:ffff:ffff:ffff:ffff:ffff,KR +2404:880::,2404:880:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:980::,2404:980:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:a00::,2404:a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:a80::,2404:a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:b00::,2404:b00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:b80::,2404:b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:c00::,2404:c00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:c80::,2404:c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:d00::,2404:d00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:d80::,2404:d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:e00::,2404:e00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:e80::,2404:e80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:f00::,2404:f00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:f80::,2404:f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:1000::,2404:1000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:1080::,2404:1080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:1100::,2404:1100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:1180::,2404:1180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:1200::,2404:1200:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:1280::,2404:1280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:1300::,2404:1300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:1380::,2404:1380:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:1400::,2404:1400:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:1480::,2404:1480:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:1500::,2404:1500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:1580::,2404:1580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:1600::,2404:1601:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:1680::,2404:1680:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:1780::,2404:1780:ffff:ffff:ffff:ffff:ffff:ffff,MM +2404:1800::,2404:1800:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:1880::,2404:1880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:1900::,2404:1900:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:1980::,2404:1980:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:1a00::,2404:1a00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:1b00::,2404:1b00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:1b80::,2404:1b80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:1c00::,2404:1c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:1c80::,2404:1c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:1d00::,2404:1d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:1d80::,2404:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:1e00::,2404:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:1e80::,2404:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:1f00::,2404:1f00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:2000::,2404:2000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:2080::,2404:2080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:2100::,2404:2100:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:2180::,2404:2180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:2200::,2404:2200:ffff:ffff:ffff:ffff:ffff:ffff,NC +2404:2280::,2404:2280:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:2300::,2404:2300:ffff:ffff:ffff:ffff:ffff:ffff,KR +2404:2380::,2404:2380:ffff:ffff:ffff:ffff:ffff:ffff,PH +2404:2400::,2404:2400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:2480::,2404:2480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:2580::,2404:2580:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:2600::,2404:2600:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:2680::,2404:2680:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:2700::,2404:2700:ffff:ffff:ffff:ffff:ffff:ffff,MN +2404:2780::,2404:2780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:2800::,2404:2800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:2880::,2404:2880:ffff:ffff:ffff:ffff:ffff:ffff,KR +2404:2900::,2404:2900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:2980::,2404:2980:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:2a00::,2404:2a00:ffff:ffff:ffff:ffff:ffff:ffff,NC +2404:2a80::,2404:2a80:14:ffff:ffff:ffff:ffff:ffff,HK +2404:2a80:15::,2404:2a80:15:ffff:ffff:ffff:ffff:ffff,US +2404:2a80:16::,2404:2a80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:2b00::,2404:2b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:2c00::,2404:2c00:ffff:ffff:ffff:ffff:ffff:ffff,NP +2404:2c80::,2404:2c80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:2d00::,2404:2d00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:2d80::,2404:2d80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:2e00::,2404:2e00:ffff:ffff:ffff:ffff:ffff:ffff,LA +2404:2e80::,2404:2e80:ffff:ffff:ffff:ffff:ffff:ffff,NP +2404:2f80::,2404:2f80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:3080::,2404:3080:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:3100::,2404:3100:ffff:ffff:ffff:ffff:ffff:ffff,PK +2404:3180::,2404:3180:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:3200::,2404:3200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:3280::,2404:3280:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:3300::,2404:3300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:3380::,2404:3380:ffff:ffff:ffff:ffff:ffff:ffff,PH +2404:3480::,2404:3480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:3500::,2404:3500:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:3580::,2404:3580:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:3600::,2404:3601:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:3680::,2404:3680:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:3700::,2404:3700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:3780::,2404:3780:ffff:ffff:ffff:ffff:ffff:ffff,NP +2404:3800::,2404:3800:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:3880::,2404:3880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:3900::,2404:3900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:3980::,2404:3980:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:3a00::,2404:3a00:ffff:ffff:ffff:ffff:ffff:ffff,VN +2404:3a80::,2404:3a80:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:3b00::,2404:3b00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:3b80::,2404:3b80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:3c00::,2404:3c00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2404:3c80::,2404:3c80:ffff:ffff:ffff:ffff:ffff:ffff,PK +2404:3d00::,2404:3d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:3d80::,2404:3d80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:3e00::,2404:3e00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:3e80::,2404:3e80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:3f00::,2404:3f00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:3f80::,2404:3f80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:4080::,2404:4080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:4100::,2404:4100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:4180::,2404:4180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:4200::,2404:4200:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:4280::,2404:4280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:4300::,2404:4300:ffff:ffff:ffff:ffff:ffff:ffff,MY +2404:4380::,2404:4380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:4400::,2404:440f:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:4480::,2404:4480:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:4580::,2404:4580:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:4600::,2404:4600:ffff:ffff:ffff:ffff:ffff:ffff,KR +2404:4680::,2404:4680:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:4700::,2404:4700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:4780::,2404:4780:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:4800::,2404:4800:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:4880::,2404:4880:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:4900::,2404:4900:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:4980::,2404:4980:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:4a00::,2404:4a00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:4a80::,2404:4a80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:4b80::,2404:4b80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:4c00::,2404:4c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:4c80::,2404:4c80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:4d00::,2404:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:4d80::,2404:4d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:4e00::,2404:4e00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:4f00::,2404:4f01:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:4f80::,2404:4f80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:5000::,2404:5000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:5080::,2404:5080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:5100::,2404:5100:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:5180::,2404:5180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:5200::,2404:5200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:5280::,2404:5280:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:5300::,2404:5300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:5380::,2404:5380:ffff:ffff:ffff:ffff:ffff:ffff,MY +2404:5400::,2404:5400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:5480::,2404:5480:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:5500::,2404:5500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:5580::,2404:5580:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:5600::,2404:5600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:5680::,2404:5680:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:5700::,2404:5700:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:5780::,2404:5780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:5800::,2404:5800:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:5880::,2404:5880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:5900::,2404:5900:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:5980::,2404:5980:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:5a00::,2404:5a00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:5a80::,2404:5a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:5b00::,2404:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:5b80::,2404:5b80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:5c80::,2404:5c80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:5d00::,2404:5d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:5d80::,2404:5d80:5fff:ffff:ffff:ffff:ffff:ffff,JP +2404:5d80:6000::,2404:5d80:60ff:ffff:ffff:ffff:ffff:ffff,AU +2404:5d80:6100::,2404:5d80:6100:ffff:ffff:ffff:ffff:ffff,JP +2404:5d80:6101::,2404:5d80:6101:7fff:ffff:ffff:ffff:ffff,SG +2404:5d80:6101:8000::,2404:5d80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:5e00::,2404:5e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:5e80::,2404:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:5f80::,2404:5f80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2404:6000::,2404:6000:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:6080::,2404:6080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:6100::,2404:6100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:6180::,2404:6180:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:6200::,2404:6200:ffff:ffff:ffff:ffff:ffff:ffff,TW +2404:6280::,2404:6280:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:6300::,2404:6300:ffff:ffff:ffff:ffff:ffff:ffff,MY +2404:6380::,2404:6380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:6400::,2404:6400:ffff:ffff:ffff:ffff:ffff:ffff,PG +2404:6480::,2404:6480:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:6500::,2404:6500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:6600::,2404:6600:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:6680::,2404:6680:ffff:ffff:ffff:ffff:ffff:ffff,PK +2404:6700::,2404:6700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:6780::,2404:6780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:6800::,2404:6800:4002:ffff:ffff:ffff:ffff:ffff,AU +2404:6800:4003::,2404:6800:4003:ffff:ffff:ffff:ffff:ffff,SG +2404:6800:4004::,2404:6800:4007:ffff:ffff:ffff:ffff:ffff,AU +2404:6800:4008::,2404:6800:4008:ffff:ffff:ffff:ffff:ffff,TW +2404:6800:4009::,2404:6800:400a:ffff:ffff:ffff:ffff:ffff,AU +2404:6800:400b::,2404:6800:400b:ffff:ffff:ffff:ffff:ffff,JP +2404:6800:400c::,2404:6800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:6900::,2404:6900:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:6980::,2404:6980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:6a00::,2404:6a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:6a80::,2404:6a80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:6b00::,2404:6b00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:6b80::,2404:6b80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:6c00::,2404:6c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:6c80::,2404:6c80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:6d00::,2404:6d00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:6e00::,2404:6e00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2404:6e80::,2404:6e80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:6f00::,2404:6f00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2404:6f80::,2404:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:7000::,2404:7000:ffff:ffff:ffff:ffff:ffff:ffff,PK +2404:7100::,2404:7100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:7180::,2404:7180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:7200::,2404:7200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:7280::,2404:7280:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:7300::,2404:7300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:7380::,2404:7380:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:7400::,2404:7400:ffff:ffff:ffff:ffff:ffff:ffff,PH +2404:7480::,2404:7480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:7500::,2404:7500:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:7600::,2404:7600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:7680::,2404:7680:ffff:ffff:ffff:ffff:ffff:ffff,PK +2404:7700::,2404:7700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:7780::,2404:7780:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:7800::,2404:7800:ffff:ffff:ffff:ffff:ffff:ffff,PW +2404:7880::,2404:7880:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:7900::,2404:7900:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:7980::,2404:7980:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:7a00::,2404:7a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:7a80::,2404:7a80:8200:7fff:ffff:ffff:ffff:ffff,JP +2404:7a80:8200:8000::,2404:7a80:8200:ffff:ffff:ffff:ffff:ffff,CN +2404:7a80:8201::,2404:7a82:26df:ffff:ffff:ffff:ffff:ffff,JP +2404:7a82:26e0::,2404:7a82:26e0:7fff:ffff:ffff:ffff:ffff,US +2404:7a82:26e0:8000::,2404:7a87:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:7b00::,2404:7b00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:7c00::,2404:7c00:ffff:ffff:ffff:ffff:ffff:ffff,NP +2404:7c80::,2404:7c80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:7d00::,2404:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:7d80::,2404:7d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:7e00::,2404:7e00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:7e80::,2404:7e80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:7f00::,2404:7f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:7f80::,2404:7f80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:8000::,2404:8000:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:8100::,2404:8100:ffff:ffff:ffff:ffff:ffff:ffff,MY +2404:8180::,2404:8180:ffff:ffff:ffff:ffff:ffff:ffff,PK +2404:8200::,2404:8200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:8280::,2404:8280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:8300::,2404:8300:ffff:ffff:ffff:ffff:ffff:ffff,PK +2404:8380::,2404:8380:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:8480::,2404:8480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:8500::,2404:8500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:8580::,2404:8580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:8600::,2404:8600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:8680::,2404:8680:fff:ffff:ffff:ffff:ffff:ffff,SG +2404:8680:1000::,2404:8680:1fff:ffff:ffff:ffff:ffff:ffff,TH +2404:8680:2000::,2404:8680:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:8700::,2404:8700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:8780::,2404:8780:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:8880::,2404:8880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:8900::,2404:8900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:8980::,2404:8980:ffff:ffff:ffff:ffff:ffff:ffff,BN +2404:8a00::,2404:8a00:ffff:ffff:ffff:ffff:ffff:ffff,LK +2404:8a80::,2404:8a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:8b00::,2404:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:8b80::,2404:8b80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:8c00::,2404:8c00:ffff:ffff:ffff:ffff:ffff:ffff,GU +2404:8c80::,2404:8c80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:8d00::,2404:8d07:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:8d80::,2404:8d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:8e00::,2404:8e01:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:8e80::,2404:8e80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:8f00::,2404:8f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:8f80::,2404:8f80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:9000::,2404:9000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:9080::,2404:9080:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:9100::,2404:9100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:9200::,2404:9200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:9380::,2404:9380:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:9400::,2404:9400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:9480::,2404:9480:ffff:ffff:ffff:ffff:ffff:ffff,US +2404:9580::,2404:9580:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:9600::,2404:9601:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:9680::,2404:9680:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:9700::,2404:9700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:9780::,2404:9780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:9800::,2404:9800:ffff:ffff:ffff:ffff:ffff:ffff,PH +2404:9880::,2404:9880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:9900::,2404:9900:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:9980::,2404:9980:ffff:ffff:ffff:ffff:ffff:ffff,NP +2404:9a00::,2404:9a00:ffff:ffff:ffff:ffff:ffff:ffff,GU +2404:9a80::,2404:9a80:ffff:ffff:ffff:ffff:ffff:ffff,NP +2404:9b00::,2404:9b00:ffff:ffff:ffff:ffff:ffff:ffff,AF +2404:9b80::,2404:9b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:9c00::,2404:9c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:9c80::,2404:9c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:9d00::,2404:9d00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:9d80::,2404:9d80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:9e00::,2404:9e00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:9e80::,2404:9e80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:9f00::,2404:9f00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:9f80::,2404:9f80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:a000::,2404:a000:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:a080::,2404:a080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:a100::,2404:a100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:a180::,2404:a180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:a200::,2404:a200:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:a280::,2404:a280:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:a300::,2404:a300:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:a480::,2404:a480:ffff:ffff:ffff:ffff:ffff:ffff,US +2404:a500::,2404:a500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:a580::,2404:a580:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:a600::,2404:a600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:a680::,2404:a680:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:a700::,2404:a700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:a780::,2404:a780:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:a800::,2404:a800:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:aa00::,2404:aa00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:aa80::,2404:aa80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:ab00::,2404:ab00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:ab80::,2404:ab80:ffff:ffff:ffff:ffff:ffff:ffff,MV +2404:ac00::,2404:ac00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:ae00::,2404:ae00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:ae80::,2404:ae80:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:af00::,2404:af00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:af80::,2404:af80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:b000::,2404:b000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:b100::,2404:b100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:b180::,2404:b180:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:b200::,2404:b200:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:b280::,2404:b280:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:b300::,2404:b300:ffff:ffff:ffff:ffff:ffff:ffff,KH +2404:b380::,2404:b380:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:b500::,2404:b500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:b580::,2404:b580:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:b600::,2404:b600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:b680::,2404:b680:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:b700::,2404:b700:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:b780::,2404:b780:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:b800::,2404:b800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:b880::,2404:b880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:b900::,2404:b900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:b980::,2404:b980:1fff:ffff:ffff:ffff:ffff:ffff,IN +2404:b980:2000::,2404:b980:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:ba00::,2404:ba00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:ba80::,2404:ba80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:bb80::,2404:bb80:ffff:ffff:ffff:ffff:ffff:ffff,KH +2404:bc00::,2404:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:bc80::,2404:bc80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:bd00::,2404:bd00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:bd80::,2404:bd80:ffff:ffff:ffff:ffff:ffff:ffff,MM +2404:be00::,2404:be00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2404:be80::,2404:be80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:bf00::,2404:bf00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:c000::,2404:c000:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:c080::,2404:c080:ffff:ffff:ffff:ffff:ffff:ffff,NP +2404:c100::,2404:c100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:c180::,2404:c180:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:c200::,2404:c200:ffff:ffff:ffff:ffff:ffff:ffff,LA +2404:c280::,2404:c280:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:c300::,2404:c300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:c380::,2404:c380:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:c400::,2404:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:c480::,2404:c480:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:c500::,2404:c500:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:c580::,2404:c580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:c600::,2404:c600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:c680::,2404:c680:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:c700::,2404:c700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:c780::,2404:c780:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:c800::,2404:c807:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:c880::,2404:c880:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:c900::,2404:c900:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:c980::,2404:c980:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:ca00::,2404:ca00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:ca80::,2404:ca80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:cb00::,2404:cb00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:cb80::,2404:cb80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:cc00::,2404:cc00:ffff:ffff:ffff:ffff:ffff:ffff,KH +2404:cc80::,2404:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:cd00::,2404:cd00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:cd80::,2404:cd80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:ce00::,2404:ce00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:ce80::,2404:ce80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:cf00::,2404:cf00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:cf80::,2404:cf80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:d000::,2404:d000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:d080::,2404:d080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:d100::,2404:d100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:d180::,2404:d180:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:d200::,2404:d200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:d280::,2404:d280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:d300::,2404:d300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:d380::,2404:d380:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:d400::,2404:d400:ffff:ffff:ffff:ffff:ffff:ffff,PK +2404:d480::,2404:d480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:d500::,2404:d500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:d580::,2404:d580:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:d600::,2404:d600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:d680::,2404:d680:ffff:ffff:ffff:ffff:ffff:ffff,MY +2404:d700::,2404:d700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:d780::,2404:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:d800::,2404:d800:ffff:ffff:ffff:ffff:ffff:ffff,PH +2404:d880::,2404:d880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:d900::,2404:d900:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:d980::,2404:d980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:da00::,2404:da00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:da80::,2404:da80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:db00::,2404:db00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2404:db80::,2404:db80:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:dc00::,2404:dc00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2404:dc80::,2404:dc80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:dd00::,2404:dd00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:dd80::,2404:dd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:de00::,2404:de00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:de80::,2404:de80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:df00::,2404:df00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:df80::,2404:df80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:e000::,2404:e000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:e100::,2404:e101:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:e180::,2404:e180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:e200::,2404:e200:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2404:e280::,2404:e280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:e300::,2404:e300:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:e380::,2404:e380:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:e400::,2404:e400:ffff:ffff:ffff:ffff:ffff:ffff,NC +2404:e480::,2404:e480:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:e500::,2404:e500:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:e580::,2404:e580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:e600::,2404:e600:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:e680::,2404:e680:ffff:ffff:ffff:ffff:ffff:ffff,TH +2404:e700::,2404:e700:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:e780::,2404:e780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:e800::,2404:e801:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:e880::,2404:e880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:e900::,2404:e900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:e980::,2404:e980:ffff:ffff:ffff:ffff:ffff:ffff,KH +2404:ea00::,2404:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:ea80::,2404:ea80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:eb00::,2404:eb00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:eb80::,2404:eb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2404:ec00::,2404:ec00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:ec80::,2404:ec80:ffff:ffff:ffff:ffff:ffff:ffff,MN +2404:ed80::,2404:ed80:ffff:ffff:ffff:ffff:ffff:ffff,PK +2404:ee00::,2404:ee00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:ee80::,2404:ee80:ffff:ffff:ffff:ffff:ffff:ffff,VN +2404:ef00::,2404:ef00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:ef80::,2404:ef80:ffff:ffff:ffff:ffff:ffff:ffff,VN +2404:f000::,2404:f000:ffff:ffff:ffff:ffff:ffff:ffff,LK +2404:f080::,2404:f080:ffff:ffff:ffff:ffff:ffff:ffff,VN +2404:f100::,2404:f100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:f180::,2404:f180:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:f200::,2404:f200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:f280::,2404:f280:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:f300::,2404:f300:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:f380::,2404:f380:ffff:ffff:ffff:ffff:ffff:ffff,BD +2404:f400::,2404:f400:ffff:ffff:ffff:ffff:ffff:ffff,PK +2404:f480::,2404:f480:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:f500::,2404:f500:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:f580::,2404:f580:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:f600::,2404:f600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:f680::,2404:f680:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:f700::,2404:f700:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:f780::,2404:f780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:f800::,2404:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:f801::,2404:f801::ffff:ffff:ffff:ffff:ffff,IN +2404:f801:1::,2404:f801:8:1010:ffff:ffff:ffff:ffff,SG +2404:f801:8:1011::,2404:f801:8:1011::,AU +2404:f801:8:1011::1,2404:f801:8:1013:ffff:ffff:ffff:ffff,SG +2404:f801:8:1014::,2404:f801:8:1014::,AU +2404:f801:8:1014::1,2404:f801:28:7fff:ffff:ffff:ffff:ffff,SG +2404:f801:28:8000::,2404:f801:28:ffff:ffff:ffff:ffff:ffff,US +2404:f801:29::,2404:f801:2f:ffff:ffff:ffff:ffff:ffff,SG +2404:f801:30::,2404:f801:30::,AU +2404:f801:30::1,2404:f801:8027:ffff:ffff:ffff:ffff:ffff,SG +2404:f801:8028::,2404:f801:8028:ffff:ffff:ffff:ffff:ffff,IN +2404:f801:8029::,2404:f801:8050::ffff:ffff:ffff:ffff,SG +2404:f801:8050:1::,2404:f801:8050:8:ffff:ffff:ffff:ffff,JP +2404:f801:8050:9::,2404:f801:8057:ffff:ffff:ffff:ffff:ffff,SG +2404:f801:8058::,2404:f801:8058:ffff:ffff:ffff:ffff:ffff,IN +2404:f801:8059::,2404:f801:e817:ffff:ffff:ffff:ffff:ffff,SG +2404:f801:e818::,2404:f801:e818:7fff:ffff:ffff:ffff:ffff,AU +2404:f801:e818:8000::,2404:f801:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:f880::,2404:f880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:f900::,2404:f900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:f980::,2404:f980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:fa00::,2404:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:fa80::,2404:fa80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2404:fb00::,2404:fb00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:fb80::,2404:fb80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2404:fc00::,2404:fc00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2404:fc80::,2404:fc80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:fd00::,2404:fd00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:fd80::,2404:fd80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:fe00::,2404:fe00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:ff00::,2404:ff00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2404:ff80::,2404:ff80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405::,2405::ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:80::,2405:80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:100::,2405:100:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:180::,2405:180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:200::,2405:205:4204:563c::1e49:20a4,IN +2405:205:4204:563c::1e49:20a5,2405:205:4204:563c::1e49:20a5,US +2405:205:4204:563c::1e49:20a6,2405:207:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:400::,2405:400:ffff:ffff:ffff:ffff:ffff:ffff,MH +2405:480::,2405:480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:500::,2405:500:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:580::,2405:580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:600::,2405:600:ffff:ffff:ffff:ffff:ffff:ffff,MN +2405:680::,2405:680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:700::,2405:700:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:780::,2405:780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:800::,2405:800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:880::,2405:880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:980::,2405:980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:a00::,2405:a00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2405:a80::,2405:a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:b00::,2405:b00:ffff:ffff:ffff:ffff:ffff:ffff,KH +2405:b80::,2405:b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:c00::,2405:c00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2405:c80::,2405:c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:d80::,2405:d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:e00::,2405:e00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:e80::,2405:e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:f80::,2405:f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:1000::,2405:1000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:1080::,2405:1080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:1180::,2405:1180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:1200::,2405:1200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:1280::,2405:1280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:1300::,2405:1300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:1380::,2405:1380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:1400::,2405:1400:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:1480::,2405:1480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:1500::,2405:1500:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:1580::,2405:1580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:1600::,2405:1600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:1680::,2405:1680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:1700::,2405:1700:ffff:ffff:ffff:ffff:ffff:ffff,BN +2405:1780::,2405:1780:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:1800::,2405:1800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:1880::,2405:1880:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:1a00::,2405:1a00:ffff:ffff:ffff:ffff:ffff:ffff,KH +2405:1a80::,2405:1a80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:1b00::,2405:1b00:ffff:ffff:ffff:ffff:ffff:ffff,NP +2405:1b80::,2405:1b80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:1c00::,2405:1c00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:1c80::,2405:1c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:1d00::,2405:1d00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:1d80::,2405:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:1e00::,2405:1e00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:1e80::,2405:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:1f00::,2405:1f00:ffff:ffff:ffff:ffff:ffff:ffff,TL +2405:1f80::,2405:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2000::,2405:2000:200:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:201::,2405:2000:201:ffff:ffff:ffff:ffff:ffff,SG +2405:2000:202::,2405:2000:400:2ff:ffff:ffff:ffff:ffff,IN +2405:2000:400:300::,2405:2000:400:3ff:ffff:ffff:ffff:ffff,HK +2405:2000:400:400::,2405:2000:400:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:401::,2405:2000:401:ffff:ffff:ffff:ffff:ffff,HK +2405:2000:402::,2405:2000:500:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:501::,2405:2000:501:ffff:ffff:ffff:ffff:ffff,HK +2405:2000:502::,2405:2000:7ff:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:800::,2405:2000:800:ff:ffff:ffff:ffff:ffff,SG +2405:2000:800:100::,2405:2000:8ff:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:900::,2405:2000:900:ff:ffff:ffff:ffff:ffff,JP +2405:2000:900:100::,2405:2000:9ff:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:a00::,2405:2000:a00:ffff:ffff:ffff:ffff:ffff,HK +2405:2000:a01::,2405:2000:aff:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:b00::,2405:2000:b00:ff:ffff:ffff:ffff:ffff,HK +2405:2000:b00:100::,2405:2000:c00:ff:ffff:ffff:ffff:ffff,IN +2405:2000:c00:100::,2405:2000:c00:1ff:ffff:ffff:ffff:ffff,TW +2405:2000:c00:200::,2405:2000:dff:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:e00::,2405:2000:e00:ff:ffff:ffff:ffff:ffff,AU +2405:2000:e00:100::,2405:2000:eff:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:f00::,2405:2000:f00:1ff:ffff:ffff:ffff:ffff,JP +2405:2000:f00:200::,2405:2000:1fff:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:2000::,2405:2000:2000:ff:ffff:ffff:ffff:ffff,AU +2405:2000:2000:100::,2405:2000:2100:ff:ffff:ffff:ffff:ffff,IN +2405:2000:2100:100::,2405:2000:2100:1ff:ffff:ffff:ffff:ffff,SG +2405:2000:2100:200::,2405:2000:21ff:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:2200::,2405:2000:2200:ff:ffff:ffff:ffff:ffff,MY +2405:2000:2200:100::,2405:2000:22ff:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:2300::,2405:2000:2300:ff:ffff:ffff:ffff:ffff,MY +2405:2000:2300:100::,2405:2000:24ff:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:2500::,2405:2000:2500:ffff:ffff:ffff:ffff:ffff,JP +2405:2000:2501::,2405:2000:ffc7:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:ffc8::,2405:2000:ffc8:ffff:ffff:ffff:ffff:ffff,SG +2405:2000:ffc9::,2405:2001::ffff:ffff:ffff:ffff:ffff,IN +2405:2001:1::,2405:2001:1:ff:ffff:ffff:ffff:ffff,SG +2405:2001:1:100::,2405:2001:2ff:ffff:ffff:ffff:ffff:ffff,IN +2405:2001:300::,2405:2001:300:ff:ffff:ffff:ffff:ffff,MY +2405:2001:300:100::,2405:2001:3ff:ffff:ffff:ffff:ffff:ffff,IN +2405:2001:400::,2405:2001:400:ff:ffff:ffff:ffff:ffff,HK +2405:2001:400:100::,2405:2001:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:2080::,2405:2080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2180::,2405:2180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2200::,2405:2200:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:2280::,2405:2280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2300::,2405:2300:ff01:ffff:ffff:ffff:ffff:ffff,SG +2405:2300:ff02::,2405:2300:ff02:ffff:ffff:ffff:ffff:ffff,IN +2405:2300:ff03::,2405:2300:ff04:ffff:ffff:ffff:ffff:ffff,SG +2405:2300:ff05::,2405:2300:ff05:7fff:ffff:ffff:ffff:ffff,IN +2405:2300:ff05:8000::,2405:2300:ff05:ffff:ffff:ffff:ffff:ffff,SG +2405:2300:ff06::,2405:2300:ff06:7fff:ffff:ffff:ffff:ffff,AU +2405:2300:ff06:8000::,2405:2300:ff06:ffff:ffff:ffff:ffff:ffff,SG +2405:2300:ff07::,2405:2300:ff07:7fff:ffff:ffff:ffff:ffff,AU +2405:2300:ff07:8000::,2405:2300:ff09:ffff:ffff:ffff:ffff:ffff,SG +2405:2300:ff0a::,2405:2300:ff0a:7fff:ffff:ffff:ffff:ffff,AU +2405:2300:ff0a:8000::,2405:2300:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:2380::,2405:2380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2400::,2405:2400:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:2480::,2405:2480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2500::,2405:2500:ffff:ffff:ffff:ffff:ffff:ffff,TH +2405:2580::,2405:2580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2600::,2405:2600:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:2680::,2405:2680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2700::,2405:2700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:2780::,2405:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2880::,2405:2880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2900::,2405:2900:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:2980::,2405:2980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2a00::,2405:2a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:2a80::,2405:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2b00::,2405:2b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:2b80::,2405:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2c80::,2405:2c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2d00::,2405:2d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:2d80::,2405:2d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2e00::,2405:2e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:2e80::,2405:2e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:2f00::,2405:2f00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:2f80::,2405:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:3000::,2405:3001:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:3080::,2405:3080:ff:ffff:ffff:ffff:ffff:ffff,TW +2405:3100::,2405:3100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:3180::,2405:3180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:3200::,2405:3200:ffff:ffff:ffff:ffff:ffff:ffff,PH +2405:3280::,2405:3280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:3300::,2405:3300:ffff:ffff:ffff:ffff:ffff:ffff,TW +2405:3380::,2405:3380:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:3400::,2405:3400:ffff:ffff:ffff:ffff:ffff:ffff,PH +2405:3480::,2405:3480:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:3500::,2405:3500:ffff:ffff:ffff:ffff:ffff:ffff,KR +2405:3580::,2405:3580:ffff:ffff:ffff:ffff:ffff:ffff,GB +2405:3600::,2405:3600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:3680::,2405:3680:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:3700::,2405:3700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:3780::,2405:3780:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:3800::,2405:3800:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:3880::,2405:3880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:3900::,2405:3900:ffff:ffff:ffff:ffff:ffff:ffff,KH +2405:3980::,2405:3980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:3a00::,2405:3a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:3a80::,2405:3a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:3b00::,2405:3b00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:3b80::,2405:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:3c00::,2405:3c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:3c80::,2405:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:3d00::,2405:3d00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2405:3d80::,2405:3d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:3e00::,2405:3e00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:3e80::,2405:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:3f00::,2405:3f01:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:3f80::,2405:3f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4000::,2405:4000:ffff:ffff:ffff:ffff:ffff:ffff,TH +2405:4080::,2405:4080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4100::,2405:4100:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:4180::,2405:4180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4200::,2405:4200:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:4280::,2405:4280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4300::,2405:4300:ffff:ffff:ffff:ffff:ffff:ffff,KR +2405:4380::,2405:4380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4400::,2405:4400:ffff:ffff:ffff:ffff:ffff:ffff,LK +2405:4480::,2405:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4500::,2405:4500:ffff:ffff:ffff:ffff:ffff:ffff,TW +2405:4580::,2405:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4600::,2405:4600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:4680::,2405:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4700::,2405:4700:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:4780::,2405:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4800::,2405:4800:ffff:ffff:ffff:ffff:ffff:ffff,VN +2405:4880::,2405:4880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4900::,2405:4900:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:4980::,2405:4980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4a00::,2405:4a00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:4a80::,2405:4a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4b00::,2405:4b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:4b80::,2405:4b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4c00::,2405:4c00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2405:4c80::,2405:4c80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:4d00::,2405:4d00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2405:4d80::,2405:4d80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2405:4e00::,2405:4e00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:4e80::,2405:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:4f00::,2405:4f00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:4f80::,2405:4f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5000::,2405:5000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:5080::,2405:5080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5100::,2405:5100:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:5180::,2405:5180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5200::,2405:5200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:5280::,2405:5280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5300::,2405:5300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:5380::,2405:5380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5400::,2405:5400:ffff:ffff:ffff:ffff:ffff:ffff,LK +2405:5480::,2405:5480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5500::,2405:5500:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:5580::,2405:5580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5600::,2405:5600:ffff:ffff:ffff:ffff:ffff:ffff,TW +2405:5680::,2405:5680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5700::,2405:5700:ffff:ffff:ffff:ffff:ffff:ffff,MN +2405:5780::,2405:5780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5800::,2405:5800:ffff:ffff:ffff:ffff:ffff:ffff,KR +2405:5880::,2405:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5900::,2405:5900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:5980::,2405:5980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5a00::,2405:5a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:5a80::,2405:5a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5b00::,2405:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5b80::,2405:5b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5c00::,2405:5c00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:5c80::,2405:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5d00::,2405:5d00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:5d80::,2405:5d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5e00::,2405:5e00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:5e80::,2405:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:5f00::,2405:5f00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2405:5f80::,2405:5f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:6000::,2405:6000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:6080::,2405:6080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:6100::,2405:6100:ffff:ffff:ffff:ffff:ffff:ffff,TW +2405:6180::,2405:6180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:6200::,2405:6200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:6280::,2405:6280:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:6380::,2405:6380:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:6400::,2405:6400:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:6480::,2405:6480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:6500::,2405:6500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:6580::,2405:6581:e3f:ffff:ffff:ffff:ffff:ffff,JP +2405:6581:e40::,2405:6581:e40:7fff:ffff:ffff:ffff:ffff,US +2405:6581:e40:8000::,2405:6581:417f:ffff:ffff:ffff:ffff:ffff,JP +2405:6581:4180::,2405:6581:4180:7fff:ffff:ffff:ffff:ffff,US +2405:6581:4180:8000::,2405:6587:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:6600::,2405:6600:ffff:ffff:ffff:ffff:ffff:ffff,NP +2405:6680::,2405:6680:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:6780::,2405:6780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:6800::,2405:6800:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:6880::,2405:6880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:6900::,2405:6900:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:6980::,2405:6980:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:6a80::,2405:6a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:6b00::,2405:6b00:ffff:ffff:ffff:ffff:ffff:ffff,LK +2405:6b80::,2405:6b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:6c00::,2405:6c00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:6c80::,2405:6c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:6d00::,2405:6d00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2405:6d80::,2405:6d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:6e00::,2405:6e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:6e80::,2405:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:6f00::,2405:6f00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:6f80::,2405:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7000::,2405:7000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:7080::,2405:7080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7100::,2405:7100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:7180::,2405:7180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7200::,2405:7200:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:7280::,2405:7280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7380::,2405:7380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7400::,2405:7400:ffff:ffff:ffff:ffff:ffff:ffff,GU +2405:7480::,2405:7480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7500::,2405:7500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:7580::,2405:7580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7600::,2405:7600:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:7680::,2405:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7700::,2405:7700:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:7780::,2405:7780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7800::,2405:7800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:7880::,2405:7880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7900::,2405:7900:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:7980::,2405:7980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7a80::,2405:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7b00::,2405:7b00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2405:7b80::,2405:7b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7c00::,2405:7c00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:7c80::,2405:7c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:7d00::,2405:7d00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:7d80::,2405:7d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:7e00::,2405:7e00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2405:7e80::,2405:7e80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:7f00::,2405:7f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:7f80::,2405:7f80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:8000::,2405:8000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:8080::,2405:8080:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:8100::,2405:8100:ffff:ffff:ffff:ffff:ffff:ffff,US +2405:8180::,2405:8180:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:8200::,2405:8200:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:8280::,2405:8280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8300::,2405:8300:ffff:ffff:ffff:ffff:ffff:ffff,SB +2405:8380::,2405:8380:ffff:ffff:ffff:ffff:ffff:ffff,KH +2405:8400::,2405:8400:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:8480::,2405:8480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8500::,2405:8500:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:8580::,2405:8580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8600::,2405:8600:ffff:ffff:ffff:ffff:ffff:ffff,KR +2405:8680::,2405:8680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8700::,2405:8700:ffff:ffff:ffff:ffff:ffff:ffff,TW +2405:8780::,2405:8780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8800::,2405:8800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:8880::,2405:8880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8900::,2405:8900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:8980::,2405:8980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8a00::,2405:8a00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:8a80::,2405:8a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8b00::,2405:8b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:8b80::,2405:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8c00::,2405:8c00:ffff:ffff:ffff:ffff:ffff:ffff,WS +2405:8c80::,2405:8c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8d00::,2405:8d00:ffff:ffff:ffff:ffff:ffff:ffff,GU +2405:8d80::,2405:8d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8e00::,2405:8e00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:8e80::,2405:8e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:8f00::,2405:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:8f80::,2405:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9000::,2405:9000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:9080::,2405:9080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9100::,2405:9100:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:9180::,2405:9180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9200::,2405:9200:ffff:ffff:ffff:ffff:ffff:ffff,TW +2405:9280::,2405:9280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9300::,2405:9300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9380::,2405:9380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9400::,2405:9400:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:9480::,2405:9480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9500::,2405:9500:ffff:ffff:ffff:ffff:ffff:ffff,KR +2405:9580::,2405:9580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9600::,2405:9600:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:9680::,2405:9680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9700::,2405:9700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9780::,2405:9780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9800::,2405:9800:ffff:ffff:ffff:ffff:ffff:ffff,TH +2405:9880::,2405:9880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9900::,2405:9900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9980::,2405:9980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9a80::,2405:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9b00::,2405:9b00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9b80::,2405:9b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9c00::,2405:9c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:9d00::,2405:9d00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:9d80::,2405:9d80:ffff:ffff:ffff:ffff:ffff:ffff,VN +2405:9e00::,2405:9e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:9e80::,2405:9e80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:9f80::,2405:9f80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:a000::,2405:a000:ffff:ffff:ffff:ffff:ffff:ffff,TH +2405:a080::,2405:a080:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:a100::,2405:a100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:a180::,2405:a180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:a200::,2405:a200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:a280::,2405:a280:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:a300::,2405:a300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:a380::,2405:a380:ffff:ffff:ffff:ffff:ffff:ffff,MM +2405:a400::,2405:a400:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:a480::,2405:a480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:a500::,2405:a500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:a580::,2405:a580:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:a680::,2405:a680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:a700::,2405:a700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:a780::,2405:a780:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:a880::,2405:a880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:a900::,2405:a900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:a980::,2405:a980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:aa00::,2405:aa00:ffff:ffff:ffff:ffff:ffff:ffff,KH +2405:aa80::,2405:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:ab00::,2405:ab00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:ab80::,2405:ab80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:ac00::,2405:ac00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:ac80::,2405:ac80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:ad00::,2405:ad00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:ad80::,2405:ad80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:ae00::,2405:ae00:ffff:ffff:ffff:ffff:ffff:ffff,MN +2405:af00::,2405:af00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:af80::,2405:af80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:b000::,2405:b000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:b100::,2405:b100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:b200::,2405:b200:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:b300::,2405:b300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:b380::,2405:b380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:b400::,2405:b400:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:b500::,2405:b500:ffff:ffff:ffff:ffff:ffff:ffff,US +2405:b580::,2405:b580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:b600::,2405:b600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:b680::,2405:b680:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:b780::,2405:b780:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:b800::,2405:b800:ffff:ffff:ffff:ffff:ffff:ffff,PH +2405:b880::,2405:b880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:b900::,2405:b900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:b980::,2405:b980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:ba00::,2405:ba00:8700:ffff:ffff:ffff:ffff:ffff,IN +2405:ba00:8701::,2405:ba00:8701:7fff:ffff:ffff:ffff:ffff,AU +2405:ba00:8701:8000::,2405:ba00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:ba80::,2405:ba80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:bb00::,2405:bb00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:bb80::,2405:bb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:bc00::,2405:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:bc80::,2405:bc80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:bd00::,2405:bd00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:bd80::,2405:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:be00::,2405:be00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:be80::,2405:be80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:bf00::,2405:bf00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:bf80::,2405:bf80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:c000::,2405:c000:ffff:ffff:ffff:ffff:ffff:ffff,KR +2405:c080::,2405:c080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:c100::,2405:c100:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:c180::,2405:c180:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:c200::,2405:c200:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:c280::,2405:c280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:c300::,2405:c300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:c380::,2405:c380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:c400::,2405:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:c480::,2405:c480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:c500::,2405:c500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:c580::,2405:c580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:c600::,2405:c600:ffff:ffff:ffff:ffff:ffff:ffff,TW +2405:c680::,2405:c680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:c700::,2405:c700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:c780::,2405:c780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:c800::,2405:c800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:c880::,2405:c880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:c900::,2405:c900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:c980::,2405:c980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:ca00::,2405:ca00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:ca80::,2405:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:cb00::,2405:cb00:ffff:ffff:ffff:ffff:ffff:ffff,VN +2405:cb80::,2405:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:cc00::,2405:cc00:ffff:ffff:ffff:ffff:ffff:ffff,PF +2405:cc80::,2405:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:cd00::,2405:cd00:ffff:ffff:ffff:ffff:ffff:ffff,VN +2405:cd80::,2405:cd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:ce00::,2405:ce00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:ce80::,2405:ce80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:cf00::,2405:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:cf80::,2405:cf80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:d000::,2405:d000:ffff:ffff:ffff:ffff:ffff:ffff,BT +2405:d100::,2405:d100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:d180::,2405:d180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:d200::,2405:d200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:d280::,2405:d280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:d300::,2405:d300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:d400::,2405:d400:ffff:ffff:ffff:ffff:ffff:ffff,PH +2405:d480::,2405:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:d580::,2405:d580:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:d680::,2405:d680:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:d700::,2405:d700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:d780::,2405:d780:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:d800::,2405:d800:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:d880::,2405:d880:ffff:ffff:ffff:ffff:ffff:ffff,KR +2405:d900::,2405:d900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:d980::,2405:d980:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:da00::,2405:da00:ffff:ffff:ffff:ffff:ffff:ffff,KH +2405:da80::,2405:da80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:db00::,2405:db00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:db80::,2405:db80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2405:dc00::,2405:dc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:de80::,2405:de80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:df80::,2405:df80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2405:e000::,2405:e000:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:e080::,2405:e080:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2405:e100::,2405:e100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:e180::,2405:e180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:e200::,2405:e200:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:e280::,2405:e280:ffff:ffff:ffff:ffff:ffff:ffff,KH +2405:e300::,2405:e300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:e380::,2405:e380:ffff:ffff:ffff:ffff:ffff:ffff,PH +2405:e400::,2405:e400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:e480::,2405:e480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:e500::,2405:e500:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:e580::,2405:e580:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:e600::,2405:e600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:e680::,2405:e680:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:e700::,2405:e700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:e780::,2405:e780:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:e800::,2405:e800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:e980::,2405:e980:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:ea00::,2405:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:ea80::,2405:ea80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2405:eb80::,2405:eb80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:ec00::,2405:ec00:ffff:ffff:ffff:ffff:ffff:ffff,BT +2405:ec80::,2405:ec80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:ed00::,2405:ed00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:ed80::,2405:ed80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:ee00::,2405:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:ee80::,2405:ee80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:ef00::,2405:ef00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:ef80::,2405:ef80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:f000::,2405:f000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:f080::,2405:f080:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:f100::,2405:f100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:f180::,2405:f180:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:f200::,2405:f200:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:f280::,2405:f280:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:f300::,2405:f300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:f380::,2405:f380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:f400::,2405:f400:ffff:ffff:ffff:ffff:ffff:ffff,PH +2405:f480::,2405:f480:ffff:ffff:ffff:ffff:ffff:ffff,BD +2405:f500::,2405:f500:ffff:ffff:ffff:ffff:ffff:ffff,KH +2405:f580::,2405:f580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:f600::,2405:f600:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:f700::,2405:f700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:f780::,2405:f780:ffff:ffff:ffff:ffff:ffff:ffff,MY +2405:f800::,2405:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:f880::,2405:f880:ffff:ffff:ffff:ffff:ffff:ffff,NP +2405:f900::,2405:f900:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2405:f980::,2405:f980:ffff:ffff:ffff:ffff:ffff:ffff,VN +2405:fa00::,2405:fa00:ffff:ffff:ffff:ffff:ffff:ffff,KH +2405:fa80::,2405:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2405:fb00::,2405:fb00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:fb80::,2405:fb80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2405:fc00::,2405:fc00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2405:fc80::,2405:fc80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2405:fd80::,2405:fd80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2405:fe00::,2405:fe00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2405:fe80::,2405:fe80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2405:ff00::,2405:ff00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:ff80::,2405:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406::,2406::ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:80::,2406:80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:100::,2406:100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:180::,2406:180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:200::,2406:200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:280::,2406:280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:300::,2406:300:ffff:ffff:ffff:ffff:ffff:ffff,TW +2406:380::,2406:381:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:400::,2406:400:ffff:ffff:ffff:ffff:ffff:ffff,TH +2406:480::,2406:480:ffff:ffff:ffff:ffff:ffff:ffff,TH +2406:500::,2406:500:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:600::,2406:600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:680::,2406:680:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:700::,2406:700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:780::,2406:780:ffff:ffff:ffff:ffff:ffff:ffff,MM +2406:800::,2406:800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:880::,2406:880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:900::,2406:900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:980::,2406:980:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:a00::,2406:a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:a80::,2406:a80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:b00::,2406:b00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:b80::,2406:b80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:c00::,2406:c00:ffff:ffff:ffff:ffff:ffff:ffff,LK +2406:c80::,2406:c80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:d00::,2406:d00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2406:d80::,2406:d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:e00::,2406:e00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:e80::,2406:e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:f00::,2406:f00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:f80::,2406:f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1000::,2406:1000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:1080::,2406:1080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1100::,2406:1100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1180::,2406:1180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1200::,2406:1200:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:1280::,2406:1280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1300::,2406:1300:ffff:ffff:ffff:ffff:ffff:ffff,PK +2406:1380::,2406:1380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1400::,2406:1400:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:1480::,2406:1480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1500::,2406:1500:ffff:ffff:ffff:ffff:ffff:ffff,TO +2406:1580::,2406:1580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1600::,2406:1600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:1680::,2406:1680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1700::,2406:1700:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:1780::,2406:1780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1880::,2406:1880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1980::,2406:1980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1a00::,2406:1a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:1a80::,2406:1a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1b00::,2406:1b00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:1b80::,2406:1b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1c00::,2406:1c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:1c80::,2406:1c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1d00::,2406:1d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:1d80::,2406:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1e00::,2406:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:1e80::,2406:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:1f00::,2406:1f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:1f80::,2406:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2000::,2406:2000:efb9:ffff:ffff:ffff:ffff:ffff,TW +2406:2000:efba::,2406:2000:efba:7fff:ffff:ffff:ffff:ffff,HK +2406:2000:efba:8000::,2406:2000:ffff:ffff:ffff:ffff:ffff:ffff,TW +2406:2080::,2406:2080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2100::,2406:2100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:2180::,2406:2180:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:2200::,2406:2200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:2280::,2406:2280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:2300::,2406:2300:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:2380::,2406:2380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:2400::,2406:2400:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:2500::,2406:2500:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:2580::,2406:2580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2600::,2406:2600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:2700::,2406:2700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2780::,2406:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2800::,2406:2800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:2880::,2406:2880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2900::,2406:2900:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:2980::,2406:2980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2a00::,2406:2a00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2406:2a80::,2406:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2b00::,2406:2b00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:2b80::,2406:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2c00::,2406:2c00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:2c80::,2406:2c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2d80::,2406:2d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2e00::,2406:2e00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:2e80::,2406:2e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:2f00::,2406:2f00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:2f80::,2406:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3000::,2406:3003:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:3080::,2406:3080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3100::,2406:3100:ffff:ffff:ffff:ffff:ffff:ffff,TH +2406:3180::,2406:3180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3200::,2406:3200:ffff:ffff:ffff:ffff:ffff:ffff,PH +2406:3280::,2406:3280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3300::,2406:3300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3380::,2406:3380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3400::,2406:3400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:3480::,2406:3480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3580::,2406:3580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3600::,2406:3600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:3680::,2406:3680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3700::,2406:3700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3780::,2406:3780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3800::,2406:3800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:3880::,2406:3880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3980::,2406:3980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3a00::,2406:3a00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:3a80::,2406:3a80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:3b00::,2406:3b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:3b80::,2406:3b80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:3c00::,2406:3c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:3c80::,2406:3c80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:3d00::,2406:3d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:3d80::,2406:3d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3e00::,2406:3e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:3e80::,2406:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:3f00::,2406:3f00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:3f80::,2406:3f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4000::,2406:4000:ffff:ffff:ffff:ffff:ffff:ffff,KR +2406:4080::,2406:4080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4100::,2406:4100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:4180::,2406:4180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4200::,2406:4200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:4280::,2406:4280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4300::,2406:4300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:4380::,2406:4380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4400::,2406:4400:ffff:ffff:ffff:ffff:ffff:ffff,PH +2406:4480::,2406:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4500::,2406:4500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4580::,2406:4580:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:4600::,2406:4600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:4680::,2406:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4700::,2406:4700:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:4800::,2406:4800:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:4880::,2406:4880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:4900::,2406:4900:ffff:ffff:ffff:ffff:ffff:ffff,MY +2406:4980::,2406:4980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4a00::,2406:4a00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:4a80::,2406:4a80:ffff:ffff:ffff:ffff:ffff:ffff,NO +2406:4b00::,2406:4b00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:4b80::,2406:4b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4c00::,2406:4c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:4c80::,2406:4c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4d00::,2406:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4d80::,2406:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4e00::,2406:4e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:4e80::,2406:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4f00::,2406:4f00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:4f80::,2406:4f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5000::,2406:5000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:5080::,2406:5080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5100::,2406:5100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:5180::,2406:5180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5200::,2406:5200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:5280::,2406:5280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5300::,2406:5300:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:5380::,2406:5380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5400::,2406:5400:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:5480::,2406:5480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5500::,2406:5500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:5580::,2406:5580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5600::,2406:5600:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:5680::,2406:5680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5700::,2406:5700:ffff:ffff:ffff:ffff:ffff:ffff,AF +2406:5780::,2406:5780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5800::,2406:5800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:5880::,2406:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5900::,2406:5900:ffff:ffff:ffff:ffff:ffff:ffff,KR +2406:5980::,2406:5980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5a00::,2406:5a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:5a80::,2406:5a80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:5b00::,2406:5b00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2406:5c00::,2406:5c00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:5c80::,2406:5c80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:5d00::,2406:5d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:5d80::,2406:5d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5e00::,2406:5e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:5e80::,2406:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:5f00::,2406:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:5f80::,2406:5f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6000::,2406:6000:ffff:ffff:ffff:ffff:ffff:ffff,MY +2406:6080::,2406:6080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6100::,2406:6100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6180::,2406:6180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6200::,2406:6200:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:6280::,2406:6280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6300::,2406:6300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6380::,2406:6380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6400::,2406:6400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:6480::,2406:6480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6500::,2406:6500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6580::,2406:6580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6600::,2406:6600:ffff:ffff:ffff:ffff:ffff:ffff,KR +2406:6680::,2406:6680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6700::,2406:6700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:6780::,2406:6780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6800::,2406:6800:ffff:ffff:ffff:ffff:ffff:ffff,KR +2406:6880::,2406:6880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6900::,2406:6900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:6980::,2406:6980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6a00::,2406:6a00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2406:6a80::,2406:6a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6b00::,2406:6b00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:6b80::,2406:6b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6c00::,2406:6c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:6c80::,2406:6c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6d00::,2406:6d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:6d80::,2406:6d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6e00::,2406:6e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:6e80::,2406:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:6f80::,2406:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7000::,2406:7000:ffff:ffff:ffff:ffff:ffff:ffff,PK +2406:7080::,2406:7080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7100::,2406:7100:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:7180::,2406:7180:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:7280::,2406:7280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7300::,2406:7300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:7380::,2406:7380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7400::,2406:7400:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:7480::,2406:7480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7580::,2406:7580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7600::,2406:7600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:7680::,2406:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7700::,2406:7700:ffff:ffff:ffff:ffff:ffff:ffff,MY +2406:7780::,2406:7780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7800::,2406:7801:ffff:ffff:ffff:ffff:ffff:ffff,BN +2406:7880::,2406:7880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7900::,2406:7900:ffff:ffff:ffff:ffff:ffff:ffff,TH +2406:7980::,2406:7980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7a00::,2406:7a00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:7a80::,2406:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7b80::,2406:7b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7c00::,2406:7c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:7c80::,2406:7c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7d00::,2406:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7d80::,2406:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7e00::,2406:7e00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:7e80::,2406:7e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:7f00::,2406:7f00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:7f80::,2406:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8000::,2406:8000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:8080::,2406:8080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8100::,2406:8100:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:8180::,2406:8180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8200::,2406:8200:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:8280::,2406:8280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8380::,2406:8380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8400::,2406:8400:ffff:ffff:ffff:ffff:ffff:ffff,PK +2406:8480::,2406:8480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8500::,2406:8500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8580::,2406:8580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8600::,2406:8600:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:8680::,2406:8680:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:8700::,2406:8700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:8780::,2406:8780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8800::,2406:8800:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:8880::,2406:8880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8980::,2406:8980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8a00::,2406:8a00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:8a80::,2406:8a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8b00::,2406:8b00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2406:8b80::,2406:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8c00::,2406:8c00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:8c80::,2406:8c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8d00::,2406:8d00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:8d80::,2406:8d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8e00::,2406:8e00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:8e80::,2406:8e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:8f00::,2406:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:8f80::,2406:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:9000::,2406:9000:ffff:ffff:ffff:ffff:ffff:ffff,VN +2406:9080::,2406:9080:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:9100::,2406:9100:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:9180::,2406:9180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:9200::,2406:9200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:9280::,2406:9280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:9300::,2406:9300:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:9380::,2406:9380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:9400::,2406:9400:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:9480::,2406:9480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:9580::,2406:9580:ffff:ffff:ffff:ffff:ffff:ffff,TW +2406:9600::,2406:9600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:9680::,2406:9680:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:9700::,2406:9700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:9780::,2406:9780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:9880::,2406:9880:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:9900::,2406:9900:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:9980::,2406:9980:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:9a00::,2406:9a01:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:9a80::,2406:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2406:9b00::,2406:9b00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:9b80::,2406:9b80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:9c00::,2406:9c00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:9c80::,2406:9c80:ffff:ffff:ffff:ffff:ffff:ffff,VN +2406:9d80::,2406:9d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:9e00::,2406:9e00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:9e80::,2406:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:9f00::,2406:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:9f80::,2406:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:a000::,2406:a000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:a080::,2406:a080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:a100::,2406:a100:ffff:ffff:ffff:ffff:ffff:ffff,AF +2406:a180::,2406:a180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:a200::,2406:a200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:a280::,2406:a280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:a300::,2406:a300:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:a380::,2406:a380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:a400::,2406:a400::ffff:ffff:ffff:ffff:ffff,SG +2406:a400:1::,2406:a400:1:7fff:ffff:ffff:ffff:ffff,ID +2406:a400:1:8000::,2406:a400:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:a480::,2406:a480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:a500::,2406:a500:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:a580::,2406:a580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:a600::,2406:a600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:a680::,2406:a680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:a700::,2406:a700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:a780::,2406:a780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:a800::,2406:a800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:a880::,2406:a880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:a900::,2406:a900:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:a980::,2406:a980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:aa00::,2406:aa00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:aa80::,2406:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:ab00::,2406:ab00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:ab80::,2406:ab80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:ac00::,2406:ac00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2406:ac80::,2406:ac80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:ad00::,2406:ad00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2406:ad80::,2406:ad80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:ae00::,2406:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:ae80::,2406:ae80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:af00::,2406:af00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:af80::,2406:af80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:b000::,2406:b000:ffff:ffff:ffff:ffff:ffff:ffff,KR +2406:b080::,2406:b080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:b100::,2406:b100:ffff:ffff:ffff:ffff:ffff:ffff,KH +2406:b180::,2406:b180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:b200::,2406:b200:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:b280::,2406:b280:ffff:ffff:ffff:ffff:ffff:ffff,PK +2406:b300::,2406:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:b380::,2406:b380:ffff:ffff:ffff:ffff:ffff:ffff,MM +2406:b400::,2406:b400:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:b480::,2406:b480:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:b500::,2406:b500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:b580::,2406:b580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:b600::,2406:b600:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:b680::,2406:b680:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:b700::,2406:b700:ffff:ffff:ffff:ffff:ffff:ffff,NP +2406:b780::,2406:b780:ffff:ffff:ffff:ffff:ffff:ffff,US +2406:b800::,2406:b800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:b880::,2406:b880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:b900::,2406:b900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:b980::,2406:b980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:ba00::,2406:ba00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:ba80::,2406:ba80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:bb00::,2406:bb07:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:bb80::,2406:bb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:bc00::,2406:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:bc80::,2406:bc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:bd00::,2406:bd00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:bd80::,2406:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:be00::,2406:be00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:be80::,2406:be80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:bf00::,2406:bf00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:bf80::,2406:bf80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:c000::,2406:c000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:c080::,2406:c080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:c100::,2406:c100:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:c180::,2406:c180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:c200::,2406:c200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:c280::,2406:c280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:c300::,2406:c300:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:c380::,2406:c380:ffff:ffff:ffff:ffff:ffff:ffff,PK +2406:c400::,2406:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:c480::,2406:c480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:c500::,2406:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:c580::,2406:c580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:c600::,2406:c600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:c680::,2406:c680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:c700::,2406:c700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:c780::,2406:c780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:c800::,2406:c800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:c880::,2406:c880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:c900::,2406:c900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:c980::,2406:c980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:ca00::,2406:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:ca80::,2406:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:cb00::,2406:cb00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:cb80::,2406:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:cc00::,2406:cc00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:cc80::,2406:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:cd00::,2406:cd00:ffff:ffff:ffff:ffff:ffff:ffff,KI +2406:cd80::,2406:cd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:ce00::,2406:ce07:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:ce80::,2406:ce80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:cf00::,2406:cf00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:cf80::,2406:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:d000::,2406:d000:ffff:ffff:ffff:ffff:ffff:ffff,KR +2406:d080::,2406:d080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:d100::,2406:d100:ffff:ffff:ffff:ffff:ffff:ffff,AF +2406:d180::,2406:d180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:d200::,2406:d200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:d280::,2406:d280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:d300::,2406:d300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:d380::,2406:d380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:d400::,2406:d400:ffff:ffff:ffff:ffff:ffff:ffff,TW +2406:d480::,2406:d480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:d500::,2406:d501:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:d580::,2406:d580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:d600::,2406:d600:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:d680::,2406:d680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:d700::,2406:d700:ffff:ffff:ffff:ffff:ffff:ffff,KR +2406:d780::,2406:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:d800::,2406:d800:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:d880::,2406:d880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:d980::,2406:d980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:da00::,2406:da00:1fff:ffff:ffff:ffff:ffff:ffff,US +2406:da00:2000::,2406:da00:20ff:ffff:ffff:ffff:ffff:ffff,KR +2406:da00:2100::,2406:da00:3fff:ffff:ffff:ffff:ffff:ffff,US +2406:da00:4000::,2406:da00:40ff:ffff:ffff:ffff:ffff:ffff,JP +2406:da00:4100::,2406:da00:7fff:ffff:ffff:ffff:ffff:ffff,US +2406:da00:8000::,2406:da00:80ff:ffff:ffff:ffff:ffff:ffff,SG +2406:da00:8100::,2406:da00:9fff:ffff:ffff:ffff:ffff:ffff,US +2406:da00:a000::,2406:da00:a0ff:ffff:ffff:ffff:ffff:ffff,IN +2406:da00:a100::,2406:da00:bfff:ffff:ffff:ffff:ffff:ffff,US +2406:da00:c000::,2406:da00:c0ff:ffff:ffff:ffff:ffff:ffff,AU +2406:da00:c100::,2406:da11:ffff:ffff:ffff:ffff:ffff:ffff,US +2406:da12::,2406:da12:fff:ffff:ffff:ffff:ffff:ffff,KR +2406:da12:1000::,2406:da13:ffff:ffff:ffff:ffff:ffff:ffff,US +2406:da14::,2406:da14:fff:ffff:ffff:ffff:ffff:ffff,JP +2406:da14:1000::,2406:da17:ffff:ffff:ffff:ffff:ffff:ffff,US +2406:da18::,2406:da18:fff:ffff:ffff:ffff:ffff:ffff,SG +2406:da18:1000::,2406:da19:ffff:ffff:ffff:ffff:ffff:ffff,US +2406:da1a::,2406:da1a:fff:ffff:ffff:ffff:ffff:ffff,IN +2406:da1a:1000::,2406:da1b:ffff:ffff:ffff:ffff:ffff:ffff,US +2406:da1c::,2406:da1c:fff:ffff:ffff:ffff:ffff:ffff,AU +2406:da1c:1000::,2406:daa0:1fff:ffff:ffff:ffff:ffff:ffff,US +2406:daa0:2000::,2406:daa0:20ff:ffff:ffff:ffff:ffff:ffff,KR +2406:daa0:2100::,2406:daa0:3fff:ffff:ffff:ffff:ffff:ffff,US +2406:daa0:4000::,2406:daa0:40ff:ffff:ffff:ffff:ffff:ffff,JP +2406:daa0:4100::,2406:daa0:7fff:ffff:ffff:ffff:ffff:ffff,US +2406:daa0:8000::,2406:daa0:80ff:ffff:ffff:ffff:ffff:ffff,SG +2406:daa0:8100::,2406:daa0:9fff:ffff:ffff:ffff:ffff:ffff,US +2406:daa0:a000::,2406:daa0:a0ff:ffff:ffff:ffff:ffff:ffff,IN +2406:daa0:a100::,2406:daa0:bfff:ffff:ffff:ffff:ffff:ffff,US +2406:daa0:c000::,2406:daa0:c0ff:ffff:ffff:ffff:ffff:ffff,AU +2406:daa0:c100::,2406:daf8:1fff:ffff:ffff:ffff:ffff:ffff,US +2406:daf8:2000::,2406:daf8:20ff:ffff:ffff:ffff:ffff:ffff,KR +2406:daf8:2100::,2406:daf8:3fff:ffff:ffff:ffff:ffff:ffff,US +2406:daf8:4000::,2406:daf8:40ff:ffff:ffff:ffff:ffff:ffff,JP +2406:daf8:4100::,2406:daf8:7fff:ffff:ffff:ffff:ffff:ffff,US +2406:daf8:8000::,2406:daf8:80ff:ffff:ffff:ffff:ffff:ffff,SG +2406:daf8:8100::,2406:daf8:9fff:ffff:ffff:ffff:ffff:ffff,US +2406:daf8:a000::,2406:daf8:a0ff:ffff:ffff:ffff:ffff:ffff,IN +2406:daf8:a100::,2406:daf8:bfff:ffff:ffff:ffff:ffff:ffff,US +2406:daf8:c000::,2406:daf8:c0ff:ffff:ffff:ffff:ffff:ffff,AU +2406:daf8:c100::,2406:daf9:1fff:ffff:ffff:ffff:ffff:ffff,US +2406:daf9:2000::,2406:daf9:20ff:ffff:ffff:ffff:ffff:ffff,KR +2406:daf9:2100::,2406:daf9:3fff:ffff:ffff:ffff:ffff:ffff,US +2406:daf9:4000::,2406:daf9:40ff:ffff:ffff:ffff:ffff:ffff,JP +2406:daf9:4100::,2406:daf9:7fff:ffff:ffff:ffff:ffff:ffff,US +2406:daf9:8000::,2406:daf9:80ff:ffff:ffff:ffff:ffff:ffff,SG +2406:daf9:8100::,2406:daf9:9fff:ffff:ffff:ffff:ffff:ffff,US +2406:daf9:a000::,2406:daf9:a0ff:ffff:ffff:ffff:ffff:ffff,IN +2406:daf9:a100::,2406:daf9:bfff:ffff:ffff:ffff:ffff:ffff,US +2406:daf9:c000::,2406:daf9:c0ff:ffff:ffff:ffff:ffff:ffff,AU +2406:daf9:c100::,2406:dafa:1fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafa:2000::,2406:dafa:20ff:ffff:ffff:ffff:ffff:ffff,KR +2406:dafa:2100::,2406:dafa:3fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafa:4000::,2406:dafa:40ff:ffff:ffff:ffff:ffff:ffff,JP +2406:dafa:4100::,2406:dafa:7fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafa:8000::,2406:dafa:80ff:ffff:ffff:ffff:ffff:ffff,SG +2406:dafa:8100::,2406:dafa:9fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafa:a000::,2406:dafa:a0ff:ffff:ffff:ffff:ffff:ffff,IN +2406:dafa:a100::,2406:dafa:bfff:ffff:ffff:ffff:ffff:ffff,US +2406:dafa:c000::,2406:dafa:c0ff:ffff:ffff:ffff:ffff:ffff,AU +2406:dafa:c100::,2406:dafc:1fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafc:2000::,2406:dafc:20ff:ffff:ffff:ffff:ffff:ffff,KR +2406:dafc:2100::,2406:dafc:3fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafc:4000::,2406:dafc:40ff:ffff:ffff:ffff:ffff:ffff,JP +2406:dafc:4100::,2406:dafc:7fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafc:8000::,2406:dafc:80ff:ffff:ffff:ffff:ffff:ffff,SG +2406:dafc:8100::,2406:dafc:9fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafc:a000::,2406:dafc:a0ff:ffff:ffff:ffff:ffff:ffff,IN +2406:dafc:a100::,2406:dafc:bfff:ffff:ffff:ffff:ffff:ffff,US +2406:dafc:c000::,2406:dafc:c0ff:ffff:ffff:ffff:ffff:ffff,AU +2406:dafc:c100::,2406:dafe:1fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafe:2000::,2406:dafe:20ff:ffff:ffff:ffff:ffff:ffff,KR +2406:dafe:2100::,2406:dafe:3fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafe:4000::,2406:dafe:40ff:ffff:ffff:ffff:ffff:ffff,JP +2406:dafe:4100::,2406:dafe:7fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafe:8000::,2406:dafe:80ff:ffff:ffff:ffff:ffff:ffff,SG +2406:dafe:8100::,2406:dafe:9fff:ffff:ffff:ffff:ffff:ffff,US +2406:dafe:a000::,2406:dafe:a0ff:ffff:ffff:ffff:ffff:ffff,IN +2406:dafe:a100::,2406:dafe:bfff:ffff:ffff:ffff:ffff:ffff,US +2406:dafe:c000::,2406:dafe:c0ff:ffff:ffff:ffff:ffff:ffff,AU +2406:dafe:c100::,2406:daff:1fff:ffff:ffff:ffff:ffff:ffff,US +2406:daff:2000::,2406:daff:20ff:ffff:ffff:ffff:ffff:ffff,KR +2406:daff:2100::,2406:daff:3fff:ffff:ffff:ffff:ffff:ffff,US +2406:daff:4000::,2406:daff:40ff:ffff:ffff:ffff:ffff:ffff,JP +2406:daff:4100::,2406:daff:7fff:ffff:ffff:ffff:ffff:ffff,US +2406:daff:8000::,2406:daff:80ff:ffff:ffff:ffff:ffff:ffff,SG +2406:daff:8100::,2406:daff:9fff:ffff:ffff:ffff:ffff:ffff,US +2406:daff:a000::,2406:daff:a0ff:ffff:ffff:ffff:ffff:ffff,IN +2406:daff:a100::,2406:daff:bfff:ffff:ffff:ffff:ffff:ffff,US +2406:daff:c000::,2406:daff:c0ff:ffff:ffff:ffff:ffff:ffff,AU +2406:daff:c100::,2406:daff:ffff:ffff:ffff:ffff:ffff:ffff,US +2406:db00::,2406:db00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:db80::,2406:db80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:dc00::,2406:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:dc80::,2406:dc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:dd00::,2406:dd00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:dd80::,2406:dd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:de00::,2406:de00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:de80::,2406:de80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:df00::,2406:df00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:df80::,2406:df80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:e000::,2406:e007:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:e080::,2406:e080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:e100::,2406:e100:ffff:ffff:ffff:ffff:ffff:ffff,PH +2406:e180::,2406:e180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:e200::,2406:e200:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:e280::,2406:e280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:e300::,2406:e300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:e380::,2406:e380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:e400::,2406:e401:ffff:ffff:ffff:ffff:ffff:ffff,MV +2406:e480::,2406:e480:ffff:ffff:ffff:ffff:ffff:ffff,MM +2406:e500::,2406:e500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:e580::,2406:e580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:e600::,2406:e600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:e680::,2406:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:e700::,2406:e700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:e780::,2406:e780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:e800::,2406:e800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:e880::,2406:e880:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:e900::,2406:e900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:ea00::,2406:ea00:ffff:ffff:ffff:ffff:ffff:ffff,MM +2406:ea80::,2406:ea80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:eb00::,2406:eb00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:eb80::,2406:eb80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:ec00::,2406:ec00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:ec80::,2406:ec80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:ed00::,2406:ed00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:ed80::,2406:ed80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:ee00::,2406:ee00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:ee80::,2406:ee80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:ef00::,2406:ef00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:ef80::,2406:ef80:ffff:ffff:ffff:ffff:ffff:ffff,US +2406:f000::,2406:f000:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:f080::,2406:f080:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:f100::,2406:f100:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:f180::,2406:f180:ffff:ffff:ffff:ffff:ffff:ffff,ID +2406:f200::,2406:f200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:f280::,2406:f280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:f300::,2406:f300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:f380::,2406:f380:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:f400::,2406:f400:12f:ffff:ffff:ffff:ffff:ffff,SG +2406:f400:130::,2406:f400:13f:ffff:ffff:ffff:ffff:ffff,JP +2406:f400:140::,2406:f400:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:f480::,2406:f480:ffff:ffff:ffff:ffff:ffff:ffff,PK +2406:f500::,2406:f500:ffff:ffff:ffff:ffff:ffff:ffff,PK +2406:f580::,2406:f580:ffff:ffff:ffff:ffff:ffff:ffff,PK +2406:f600::,2406:f600:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:f680::,2406:f680:ffff:ffff:ffff:ffff:ffff:ffff,BD +2406:f700::,2406:f700:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:f780::,2406:f780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:f800::,2406:f800:ffff:ffff:ffff:ffff:ffff:ffff,FJ +2406:f880::,2406:f880:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:f900::,2406:f900:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:f980::,2406:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:fa00::,2406:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:fa80::,2406:fa80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:fb00::,2406:fb00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:fb80::,2406:fb80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2406:fc00::,2406:fc00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:fc80::,2406:fc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:fd00::,2406:fd00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2406:fd80::,2406:fd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:fe00::,2406:fe00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2406:fe80::,2406:fe80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:ff00::,2406:ff00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2406:ff80::,2406:ff80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407::,2407::ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:80::,2407:80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:100::,2407:100:ffff:ffff:ffff:ffff:ffff:ffff,VN +2407:180::,2407:180:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:200::,2407:200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:280::,2407:280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:300::,2407:300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:380::,2407:380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:400::,2407:400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:480::,2407:480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:500::,2407:500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:580::,2407:580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:600::,2407:600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:680::,2407:680:ffff:ffff:ffff:ffff:ffff:ffff,TW +2407:700::,2407:700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:780::,2407:780:ffff:ffff:ffff:ffff:ffff:ffff,MM +2407:800::,2407:800:ffff:ffff:ffff:ffff:ffff:ffff,FJ +2407:880::,2407:880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:900::,2407:900:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:980::,2407:980:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:a00::,2407:a00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:a80::,2407:a80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:b00::,2407:b00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:c00::,2407:c00:ffff:ffff:ffff:ffff:ffff:ffff,LK +2407:c80::,2407:c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:d00::,2407:d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:d80::,2407:d80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:e00::,2407:e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:e80::,2407:e80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:f00::,2407:f00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:f80::,2407:f80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:1000::,2407:1000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:1080::,2407:1080:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:1100::,2407:1100:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:1180::,2407:1180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:1200::,2407:1200:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:1280::,2407:1280:ffff:ffff:ffff:ffff:ffff:ffff,PK +2407:1300::,2407:1300:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:1380::,2407:1380:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:1400::,2407:1400:ffff:ffff:ffff:ffff:ffff:ffff,NP +2407:1480::,2407:1480:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:1500::,2407:1500:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:1580::,2407:1580:ffff:ffff:ffff:ffff:ffff:ffff,US +2407:1600::,2407:1600:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:1680::,2407:1680:ffff:ffff:ffff:ffff:ffff:ffff,GB +2407:1700::,2407:1700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:1780::,2407:1780:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:1800::,2407:1800:ffff:ffff:ffff:ffff:ffff:ffff,PG +2407:1880::,2407:1880:ffff:ffff:ffff:ffff:ffff:ffff,GB +2407:1900::,2407:1900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:1980::,2407:1980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:1a80::,2407:1a80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:1b00::,2407:1b00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2407:1b80::,2407:1b80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:1c00::,2407:1c00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:1c80::,2407:1c80:ffff:ffff:ffff:ffff:ffff:ffff,MN +2407:1d00::,2407:1d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:1d80::,2407:1d80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:1e00::,2407:1e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:1e80::,2407:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:1f80::,2407:1f80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:2000::,2407:2000:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:2080::,2407:2080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:2180::,2407:2180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:2200::,2407:2200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:2280::,2407:2280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:2380::,2407:2380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:2400::,2407:2400:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:2480::,2407:2480:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:2500::,2407:2500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:2580::,2407:2580:ffff:ffff:ffff:ffff:ffff:ffff,NL +2407:2680::,2407:2680:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:2780::,2407:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:2800::,2407:2800:ffff:ffff:ffff:ffff:ffff:ffff,WS +2407:2880::,2407:2880:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:2900::,2407:2900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:2980::,2407:2980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:2a00::,2407:2a00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:2a80::,2407:2a80:ffff:ffff:ffff:ffff:ffff:ffff,MM +2407:2b00::,2407:2b00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:2b80::,2407:2b80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:2c80::,2407:2c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:2d00::,2407:2d00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:2d80::,2407:2d80:ffff:ffff:ffff:ffff:ffff:ffff,TH +2407:2e00::,2407:2e01:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:2e80::,2407:2e80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2407:2f00::,2407:2f00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:2f80::,2407:2f80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:3000::,2407:3000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:3080::,2407:3080:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:3100::,2407:3100:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:3180::,2407:3180:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:3280::,2407:3280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:3300::,2407:3300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:3380::,2407:3380:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:3400::,2407:3400:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:3480::,2407:3480:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:3500::,2407:3500:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:3580::,2407:3580:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:3600::,2407:3600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:3680::,2407:3680:ffff:ffff:ffff:ffff:ffff:ffff,MN +2407:3700::,2407:3700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:3780::,2407:3780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:3800::,2407:3800:ffff:ffff:ffff:ffff:ffff:ffff,SB +2407:3880::,2407:3880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:3900::,2407:3900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:3980::,2407:3980:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:3a00::,2407:3a00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:3a80::,2407:3a80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:3b00::,2407:3b00:ffff:ffff:ffff:ffff:ffff:ffff,PG +2407:3b80::,2407:3b80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:3c00::,2407:3c00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:3c80::,2407:3c80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:3d00::,2407:3d00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2407:3d80::,2407:3d80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:3e00::,2407:3e00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:3e80::,2407:3e80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:3f00::,2407:3f00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:3f80::,2407:3f80:ffff:ffff:ffff:ffff:ffff:ffff,PK +2407:4000::,2407:4000:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:4080::,2407:4080:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:4100::,2407:4100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:4180::,2407:4180:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:4200::,2407:4200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:4280::,2407:4280:ffff:ffff:ffff:ffff:ffff:ffff,LA +2407:4300::,2407:4300:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:4380::,2407:4380:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:4400::,2407:4400:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:4480::,2407:4480:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:4500::,2407:4500:ffff:ffff:ffff:ffff:ffff:ffff,PK +2407:4580::,2407:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:4600::,2407:4600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:4680::,2407:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:4700::,2407:4700:ffff:ffff:ffff:ffff:ffff:ffff,TW +2407:4780::,2407:4780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:4800::,2407:4800:ffff:ffff:ffff:ffff:ffff:ffff,FM +2407:4880::,2407:4880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:4900::,2407:4900:ffff:ffff:ffff:ffff:ffff:ffff,TW +2407:4980::,2407:4980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:4a00::,2407:4a00:ffff:ffff:ffff:ffff:ffff:ffff,NC +2407:4a80::,2407:4a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:4b00::,2407:4b00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2407:4b80::,2407:4b80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2407:4c00::,2407:4c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:4c80::,2407:4c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:4d00::,2407:4d00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2407:4d80::,2407:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:4e00::,2407:4e00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:4e80::,2407:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:4f00::,2407:4f00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:4f80::,2407:4f80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:5000::,2407:5000:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:5080::,2407:5080:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:5100::,2407:5100:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:5180::,2407:5180:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:5200::,2407:5200:ffff:ffff:ffff:ffff:ffff:ffff,NP +2407:5280::,2407:5280:ffff:ffff:ffff:ffff:ffff:ffff,NP +2407:5300::,2407:5300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:5380::,2407:5380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:5400::,2407:5400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:5480::,2407:5480:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:5500::,2407:5500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:5580::,2407:5580:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:5600::,2407:5600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:5680::,2407:5680:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:5700::,2407:5700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:5780::,2407:5780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:5800::,2407:5800:ffff:ffff:ffff:ffff:ffff:ffff,CK +2407:5880::,2407:5887:ffff:ffff:ffff:ffff:ffff:ffff,US +2407:5900::,2407:5900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:5980::,2407:5980:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:5a00::,2407:5a00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2407:5a80::,2407:5a80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:5b00::,2407:5b00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:5b80::,2407:5b80:ffff:ffff:ffff:ffff:ffff:ffff,PK +2407:5c00::,2407:5c00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:5c80::,2407:5c80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:5d00::,2407:5d00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:5d80::,2407:5d80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:5e00::,2407:5e00:ffff:ffff:ffff:ffff:ffff:ffff,KH +2407:5e80::,2407:5e80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:5f00::,2407:5f00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:5f80::,2407:5f80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:6000::,2407:6000:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:6080::,2407:6080:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:6100::,2407:6100:ffff:ffff:ffff:ffff:ffff:ffff,MM +2407:6180::,2407:6180:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:6200::,2407:6200:ffff:ffff:ffff:ffff:ffff:ffff,NP +2407:6280::,2407:6280:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:6300::,2407:6300:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:6380::,2407:6380:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:6400::,2407:6400:ffff:ffff:ffff:ffff:ffff:ffff,MN +2407:6480::,2407:6480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:6500::,2407:6500:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:6580::,2407:6580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:6600::,2407:6600:ffff:ffff:ffff:ffff:ffff:ffff,TH +2407:6680::,2407:6680:ffff:ffff:ffff:ffff:ffff:ffff,KH +2407:6700::,2407:6700:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:6780::,2407:6780:ffff:ffff:ffff:ffff:ffff:ffff,SC +2407:6800::,2407:6800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:6880::,2407:6880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:6900::,2407:6900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:6980::,2407:6980:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:6a00::,2407:6a00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:6a80::,2407:6a80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:6b00::,2407:6b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:6b80::,2407:6b80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:6c00::,2407:6c00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:6c80::,2407:6c80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:6d00::,2407:6d00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:6d80::,2407:6d80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:6e00::,2407:6e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:6e80::,2407:6e80:ffff:ffff:ffff:ffff:ffff:ffff,MM +2407:6f00::,2407:6f00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:6f80::,2407:6f80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:7000::,2407:7000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:7080::,2407:7080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:7100::,2407:7100:ffff:ffff:ffff:ffff:ffff:ffff,TW +2407:7180::,2407:7180:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:7200::,2407:7200:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:7280::,2407:7280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:7300::,2407:7300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:7380::,2407:7380:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:7400::,2407:7400:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:7480::,2407:7480:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:7500::,2407:7500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:7580::,2407:7580:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:7600::,2407:7600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:7680::,2407:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:7700::,2407:7700:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:7780::,2407:7780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:7800::,2407:7800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:7880::,2407:7880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:7900::,2407:7900:ffff:ffff:ffff:ffff:ffff:ffff,TH +2407:7980::,2407:7980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:7a00::,2407:7a00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2407:7a80::,2407:7a80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:7b00::,2407:7b00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:7b80::,2407:7b80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:7c00::,2407:7c00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:7c80::,2407:7c80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:7d00::,2407:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:7d80::,2407:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:7e80::,2407:7e80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:7f00::,2407:7f00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:8000::,2407:8001:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:8080::,2407:8080:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:8100::,2407:8100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:8180::,2407:8180:ffff:ffff:ffff:ffff:ffff:ffff,KH +2407:8200::,2407:8200:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:8280::,2407:8280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:8300::,2407:8300:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:8380::,2407:8380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:8400::,2407:8400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:8480::,2407:8480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:8500::,2407:8500:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:8580::,2407:8580:ffff:ffff:ffff:ffff:ffff:ffff,PK +2407:8600::,2407:8600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:8680::,2407:8680:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:8700::,2407:8700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:8780::,2407:8780:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:8800::,2407:8800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:8880::,2407:8880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:8900::,2407:8900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:8980::,2407:8980:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:8a00::,2407:8a00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:8a80::,2407:8a80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:8b00::,2407:8b00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:8b80::,2407:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:8c00::,2407:8c00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:8e00::,2407:8e00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:8e80::,2407:8e80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:8f00::,2407:8f00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:8f80::,2407:8f80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:9000::,2407:9001:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:9080::,2407:9080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:9100::,2407:9100:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:9180::,2407:9180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:9280::,2407:9280:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:9300::,2407:9300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:9380::,2407:9380:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:9400::,2407:9400:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:9480::,2407:9480:ffff:ffff:ffff:ffff:ffff:ffff,TH +2407:9500::,2407:9500:ffff:ffff:ffff:ffff:ffff:ffff,NP +2407:9580::,2407:9580:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:9680::,2407:9680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:9780::,2407:9780:ffff:ffff:ffff:ffff:ffff:ffff,US +2407:9800::,2407:9807:ffff:ffff:ffff:ffff:ffff:ffff,PH +2407:9880::,2407:9880:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:9900::,2407:9900:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:9980::,2407:9980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:9a00::,2407:9a00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:9a80::,2407:9a80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:9b80::,2407:9b80:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:9c00::,2407:9c00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2407:9c80::,2407:9c80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:9d00::,2407:9d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:9d80::,2407:9d80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:9e00::,2407:9e00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2407:9e80::,2407:9e80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:9f00::,2407:9f00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:9f80::,2407:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:a000::,2407:a000:ffff:ffff:ffff:ffff:ffff:ffff,FJ +2407:a080::,2407:a080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:a100::,2407:a100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:a180::,2407:a180:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:a200::,2407:a200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:a280::,2407:a280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:a300::,2407:a300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:a380::,2407:a380:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:a480::,2407:a480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:a500::,2407:a500:ffff:ffff:ffff:ffff:ffff:ffff,TH +2407:a580::,2407:a580:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:a600::,2407:a600:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:a680::,2407:a680:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:a700::,2407:a700:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:a780::,2407:a780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:a800::,2407:a800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:a880::,2407:a880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:a980::,2407:a980:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:aa80::,2407:aa80:ffff:ffff:ffff:ffff:ffff:ffff,PK +2407:ab00::,2407:ab00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:ab80::,2407:ab80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:ac00::,2407:ac00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:ac80::,2407:ac80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:ad00::,2407:ad00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:ad80::,2407:ad80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:ae00::,2407:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:ae80::,2407:ae80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:af00::,2407:af00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:af80::,2407:af80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:b000::,2407:b001:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:b080::,2407:b080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:b100::,2407:b100:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:b180::,2407:b180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:b200::,2407:b200:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:b280::,2407:b280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:b380::,2407:b380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:b400::,2407:b400:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:b480::,2407:b480:ffff:ffff:ffff:ffff:ffff:ffff,US +2407:b500::,2407:b500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:b580::,2407:b580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:b600::,2407:b600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:b680::,2407:b680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:b700::,2407:b700:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:b780::,2407:b780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:b800::,2407:b800:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:b880::,2407:b880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:b900::,2407:b900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:b980::,2407:b980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:ba00::,2407:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:ba80::,2407:ba80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:bb00::,2407:bb00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:bb80::,2407:bb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:bc00::,2407:bc00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:bc80::,2407:bc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:bd00::,2407:bd00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:bd80::,2407:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:be00::,2407:be00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:be80::,2407:be80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:bf00::,2407:bf00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:bf80::,2407:bf80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:c000::,2407:c000:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:c080::,2407:c080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:c100::,2407:c100:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:c180::,2407:c180:ffff:ffff:ffff:ffff:ffff:ffff,KH +2407:c200::,2407:c200:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:c280::,2407:c280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:c300::,2407:c300:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:c380::,2407:c380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:c400::,2407:c400:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:c480::,2407:c480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:c500::,2407:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:c580::,2407:c580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:c600::,2407:c600:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:c680::,2407:c680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:c700::,2407:c700:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:c780::,2407:c780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:c800::,2407:c800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:c880::,2407:c880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:c900::,2407:c900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:c980::,2407:c980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:ca00::,2407:ca00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:ca80::,2407:ca80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:cb00::,2407:cb00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:cb80::,2407:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:cc00::,2407:cc00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:cc80::,2407:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:cd00::,2407:cd00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:cd80::,2407:cd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:ce00::,2407:ce00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:ce80::,2407:ce80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:cf00::,2407:cf00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:cf80::,2407:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:d000::,2407:d000:ffff:ffff:ffff:ffff:ffff:ffff,PK +2407:d080::,2407:d080:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:d100::,2407:d100:ffff:ffff:ffff:ffff:ffff:ffff,KR +2407:d180::,2407:d180:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:d200::,2407:d200:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:d280::,2407:d280:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:d300::,2407:d300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:d380::,2407:d380:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:d400::,2407:d400:ffff:ffff:ffff:ffff:ffff:ffff,NP +2407:d480::,2407:d480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:d500::,2407:d500:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:d580::,2407:d580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:d600::,2407:d600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:d680::,2407:d680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:d700::,2407:d700:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:d780::,2407:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:d800::,2407:d800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:d880::,2407:d880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:d900::,2407:d900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:d980::,2407:d980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:da00::,2407:da00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:da80::,2407:da80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:db00::,2407:db00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:db80::,2407:db80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:dc00::,2407:dc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:dc80::,2407:dc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:dd80::,2407:dd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:de00::,2407:de00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:de80::,2407:de80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:df00::,2407:df00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:df80::,2407:df80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:e000::,2407:e000:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:e080::,2407:e080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:e100::,2407:e100:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:e180::,2407:e180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:e200::,2407:e200:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:e280::,2407:e280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:e300::,2407:e301:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:e380::,2407:e380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:e400::,2407:e400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:e480::,2407:e480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:e500::,2407:e501:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:e580::,2407:e580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:e600::,2407:e600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:e680::,2407:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:e700::,2407:e700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:e780::,2407:e780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:e800::,2407:e800:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:e880::,2407:e880:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:e900:1::,2407:e900:1:7fff:ffff:ffff:ffff:ffff,IN +2407:e980::,2407:e980:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:ea00::,2407:ea00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:ea80::,2407:ea80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:eb00::,2407:eb00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:eb80::,2407:eb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:ec00::,2407:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:ec80::,2407:ec80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:ed00::,2407:ed00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2407:ed80::,2407:ed80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:ee00::,2407:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:ee80::,2407:ee80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:ef00::,2407:ef00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2407:ef80::,2407:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:f000::,2407:f000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:f080::,2407:f080:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:f100::,2407:f100:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2407:f180::,2407:f180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:f200::,2407:f200:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:f280::,2407:f280:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:f300::,2407:f300:ffff:ffff:ffff:ffff:ffff:ffff,MM +2407:f380::,2407:f380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:f400::,2407:f400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:f480::,2407:f480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:f580::,2407:f580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:f600::,2407:f600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2407:f680::,2407:f680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:f700::,2407:f700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:f780::,2407:f780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:f800::,2407:f800:ffff:ffff:ffff:ffff:ffff:ffff,MY +2407:f880::,2407:f880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:f900::,2407:f900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2407:f980::,2407:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:fa00::,2407:fa00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2407:fa80::,2407:fa80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:fb80::,2407:fb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:fc80::,2407:fc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:fd00::,2407:fd00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:fd80::,2407:fd80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2407:fe00::,2407:fe00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2407:fe80::,2407:fe80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2407:ff00::,2407:ff00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2407:ff80::,2407:ff80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2408::,2408:3ff:ffff:ffff:ffff:ffff:ffff:ffff,JP +2408:4000::,2408:43ff:ffff:ffff:ffff:ffff:ffff:ffff,CN +2408:8000::,2408:8fff:ffff:ffff:ffff:ffff:ffff:ffff,CN +2409:10::,2409:1f:ffff:ffff:ffff:ffff:ffff:ffff,JP +2409:250::,2409:25f:ffff:ffff:ffff:ffff:ffff:ffff,JP +2409:4000::,2409:43ff:ffff:ffff:ffff:ffff:ffff:ffff,IN +2409:8000::,2409:8fff:ffff:ffff:ffff:ffff:ffff:ffff,CN +240a::,240a:7f:ffff:ffff:ffff:ffff:ffff:ffff,JP +240a:8000::,240a:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN +240b::,240b:11:4180:9fff:ffff:ffff:ffff:ffff,JP +240b:11:4180:a000::,240b:11:4180:bfff:ffff:ffff:ffff:ffff,US +240b:11:4180:c000::,240b:11:4a00:8fff:ffff:ffff:ffff:ffff,JP +240b:11:4a00:9000::,240b:11:4a00:91ff:ffff:ffff:ffff:ffff,US +240b:11:4a00:9200::,240b:11:519f:ffff:ffff:ffff:ffff:ffff,JP +240b:11:51a0::,240b:11:51a0:7fff:ffff:ffff:ffff:ffff,US +240b:11:51a0:8000::,240b:3f:ffff:ffff:ffff:ffff:ffff:ffff,JP +240b:240::,240b:27f:ffff:ffff:ffff:ffff:ffff:ffff,JP +240b:8000::,240b:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN +240c::,240c:f:ffff:ffff:ffff:ffff:ffff:ffff,CN +240c:8000::,240c:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN +240d::,240d:2:410a:7fff:ffff:ffff:ffff:ffff,JP +240d:2:410a:8000::,240d:2:410a:ffff:ffff:ffff:ffff:ffff,US +240d:2:410b::,240d:1f:ffff:ffff:ffff:ffff:ffff:ffff,JP +240d:8000::,240d:80ff:ffff:ffff:ffff:ffff:ffff:ffff,CN +240e::,240e:fff:ffff:ffff:ffff:ffff:ffff:ffff,CN +240f::,240f:4:c3db:ffff:ffff:ffff:ffff:ffff,JP +240f:4:c3dc::,240f:4:c3dc:7fff:ffff:ffff:ffff:ffff,US +240f:4:c3dc:8000::,240f:6:849:ffff:ffff:ffff:ffff:ffff,JP +240f:6:84a::,240f:6:84a:7fff:ffff:ffff:ffff:ffff,US +240f:6:84a:8000::,240f:8:ef3:ffff:ffff:ffff:ffff:ffff,JP +240f:8:ef4::,240f:8:ef4:7fff:ffff:ffff:ffff:ffff,US +240f:8:ef4:8000::,240f:14:5ff4:ffff:ffff:ffff:ffff:ffff,JP +240f:14:5ff5::,240f:14:5ff5:7fff:ffff:ffff:ffff:ffff,GB +240f:14:5ff5:8000::,240f:31:707d:ffff:ffff:ffff:ffff:ffff,JP +240f:31:707e::,240f:31:707e:7fff:ffff:ffff:ffff:ffff,GB +240f:31:707e:8000::,240f:71:978:ffff:ffff:ffff:ffff:ffff,JP +240f:71:979::,240f:71:979:7fff:ffff:ffff:ffff:ffff,KR +240f:71:979:8000::,240f:77:1908:ffff:ffff:ffff:ffff:ffff,JP +240f:77:1909::,240f:77:1909:7fff:ffff:ffff:ffff:ffff,CN +240f:77:1909:8000::,240f:78:30b1:ffff:ffff:ffff:ffff:ffff,JP +240f:78:30b2::,240f:78:30b2:7fff:ffff:ffff:ffff:ffff,CN +240f:78:30b2:8000::,240f:98:8f77:ffff:ffff:ffff:ffff:ffff,JP +240f:98:8f78::,240f:98:8f78:7fff:ffff:ffff:ffff:ffff,SE +240f:98:8f78:8000::,240f:b5:2520:ffff:ffff:ffff:ffff:ffff,JP +240f:b5:2521::,240f:b5:2521:7fff:ffff:ffff:ffff:ffff,US +240f:b5:2521:8000::,240f:d1:cbc8:ffff:ffff:ffff:ffff:ffff,JP +240f:d1:cbc9::,240f:d1:cbc9:7fff:ffff:ffff:ffff:ffff,AU +240f:d1:cbc9:8000::,240f:1ff:ffff:ffff:ffff:ffff:ffff:ffff,JP +240f:8000::,240f:80ff:ffff:ffff:ffff:ffff:ffff:ffff,CN +2600::,2600:1:d000:ffff:ffff:ffff:ffff:ffff,US +2600:1:d001::,2600:1:d001:7fff:ffff:ffff:ffff:ffff,PR +2600:1:d001:8000::,2600:1:d001:ffff:ffff:ffff:ffff:ffff,US +2600:1:d002::,2600:1:d002:ffff:ffff:ffff:ffff:ffff,PR +2600:1:d003::,2600:1:d004:7fff:ffff:ffff:ffff:ffff,US +2600:1:d004:8000::,2600:1:d005:7fff:ffff:ffff:ffff:ffff,PR +2600:1:d005:8000::,2600:1:d006:ffff:ffff:ffff:ffff:ffff,US +2600:1:d007::,2600:1:d007:ffff:ffff:ffff:ffff:ffff,PR +2600:1:d008::,2600:1:d008:ffff:ffff:ffff:ffff:ffff,VI +2600:1:d009::,2600:1:d009:7fff:ffff:ffff:ffff:ffff,PR +2600:1:d009:8000::,2600:1:d00a:7fff:ffff:ffff:ffff:ffff,US +2600:1:d00a:8000::,2600:1:d00a:ffff:ffff:ffff:ffff:ffff,PR +2600:1:d00b::,2600:1:d00b:ffff:ffff:ffff:ffff:ffff,US +2600:1:d00c::,2600:1:d00c:7fff:ffff:ffff:ffff:ffff,PR +2600:1:d00c:8000::,2600:1:d00d:ffff:ffff:ffff:ffff:ffff,US +2600:1:d00e::,2600:1:d00e:7fff:ffff:ffff:ffff:ffff,PR +2600:1:d00e:8000::,2600:1:d00e:ffff:ffff:ffff:ffff:ffff,US +2600:1:d00f::,2600:1:d00f:7fff:ffff:ffff:ffff:ffff,PR +2600:1:d00f:8000::,2600:1:d00f:ffff:ffff:ffff:ffff:ffff,US +2600:1:d010::,2600:1:d010:7fff:ffff:ffff:ffff:ffff,PR +2600:1:d010:8000::,2600:1:d011:7fff:ffff:ffff:ffff:ffff,US +2600:1:d011:8000::,2600:1:d012:ffff:ffff:ffff:ffff:ffff,PR +2600:1:d013::,2600:1:d013:ffff:ffff:ffff:ffff:ffff,US +2600:1:d014::,2600:1:d015:7fff:ffff:ffff:ffff:ffff,PR +2600:1:d015:8000::,2600:1:d016:7fff:ffff:ffff:ffff:ffff,US +2600:1:d016:8000::,2600:1:d016:ffff:ffff:ffff:ffff:ffff,PR +2600:1:d017::,2600:1:d017:ffff:ffff:ffff:ffff:ffff,US +2600:1:d018::,2600:1:d018:7fff:ffff:ffff:ffff:ffff,PR +2600:1:d018:8000::,2600:1:d018:ffff:ffff:ffff:ffff:ffff,US +2600:1:d019::,2600:1:d019:7fff:ffff:ffff:ffff:ffff,PR +2600:1:d019:8000::,2600:1:d019:ffff:ffff:ffff:ffff:ffff,US +2600:1:d01a::,2600:1:d01a:ffff:ffff:ffff:ffff:ffff,PR +2600:1:d01b::,2600:1:d01c:7fff:ffff:ffff:ffff:ffff,US +2600:1:d01c:8000::,2600:1:d01d:7fff:ffff:ffff:ffff:ffff,PR +2600:1:d01d:8000::,2600:1:d01f:7fff:ffff:ffff:ffff:ffff,US +2600:1:d01f:8000::,2600:1:d01f:ffff:ffff:ffff:ffff:ffff,PR +2600:1:d020::,2600:7:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:100::,2600:10f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:200::,2600:20f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:300::,2600:400:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:800::,2600:81f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:900::,2600:90f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:a00::,2600:a01:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:b00::,2600:b0f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:c00::,2600:c14:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:d00::,2600:d0f:ffff:ffff:ffff:ffff:ffff:ffff,CA +2600:f00::,2600:1017:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1100::,2600:110f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1200::,2600:130f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1400::,2600:150f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1600::,2600:16ff:ffff:ffff:ffff:ffff:ffff:ffff,CA +2600:1700::,2600:170f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1800::,2600:180f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1900::,2600:190f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1a00::,2600:1a0f:ffff:ffff:ffff:ffff:ffff:ffff,GD +2600:1b00::,2600:1bff:ffff:ffff:ffff:ffff:ffff:ffff,JM +2600:1d00::,2600:1d0f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1e00::,2600:1e0f:ffff:ffff:ffff:ffff:ffff:ffff,VC +2600:1f00::,2600:1f00:fff:ffff:ffff:ffff:ffff:ffff,US +2600:1f00:1000::,2600:1f00:10ff:ffff:ffff:ffff:ffff:ffff,CA +2600:1f00:1100::,2600:1f00:dfff:ffff:ffff:ffff:ffff:ffff,US +2600:1f00:e000::,2600:1f00:e0ff:ffff:ffff:ffff:ffff:ffff,BR +2600:1f00:e100::,2600:1f10:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1f11::,2600:1f11:fff:ffff:ffff:ffff:ffff:ffff,CA +2600:1f11:1000::,2600:1f1d:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1f1e::,2600:1f1e:fff:ffff:ffff:ffff:ffff:ffff,BR +2600:1f1e:1000::,2600:1fa0:fff:ffff:ffff:ffff:ffff:ffff,US +2600:1fa0:1000::,2600:1fa0:10ff:ffff:ffff:ffff:ffff:ffff,CA +2600:1fa0:1100::,2600:1fa0:dfff:ffff:ffff:ffff:ffff:ffff,US +2600:1fa0:e000::,2600:1fa0:e0ff:ffff:ffff:ffff:ffff:ffff,BR +2600:1fa0:e100::,2600:1ff8:fff:ffff:ffff:ffff:ffff:ffff,US +2600:1ff8:1000::,2600:1ff8:10ff:ffff:ffff:ffff:ffff:ffff,CA +2600:1ff8:1100::,2600:1ff8:dfff:ffff:ffff:ffff:ffff:ffff,US +2600:1ff8:e000::,2600:1ff8:e0ff:ffff:ffff:ffff:ffff:ffff,BR +2600:1ff8:e100::,2600:1ff9:fff:ffff:ffff:ffff:ffff:ffff,US +2600:1ff9:1000::,2600:1ff9:10ff:ffff:ffff:ffff:ffff:ffff,CA +2600:1ff9:1100::,2600:1ff9:dfff:ffff:ffff:ffff:ffff:ffff,US +2600:1ff9:e000::,2600:1ff9:e0ff:ffff:ffff:ffff:ffff:ffff,BR +2600:1ff9:e100::,2600:1ffa:fff:ffff:ffff:ffff:ffff:ffff,US +2600:1ffa:1000::,2600:1ffa:10ff:ffff:ffff:ffff:ffff:ffff,CA +2600:1ffa:1100::,2600:1ffa:dfff:ffff:ffff:ffff:ffff:ffff,US +2600:1ffa:e000::,2600:1ffa:e0ff:ffff:ffff:ffff:ffff:ffff,BR +2600:1ffa:e100::,2600:1ffc:fff:ffff:ffff:ffff:ffff:ffff,US +2600:1ffc:1000::,2600:1ffc:10ff:ffff:ffff:ffff:ffff:ffff,CA +2600:1ffc:1100::,2600:1ffc:dfff:ffff:ffff:ffff:ffff:ffff,US +2600:1ffc:e000::,2600:1ffc:e0ff:ffff:ffff:ffff:ffff:ffff,BR +2600:1ffc:e100::,2600:1ffe:fff:ffff:ffff:ffff:ffff:ffff,US +2600:1ffe:1000::,2600:1ffe:10ff:ffff:ffff:ffff:ffff:ffff,CA +2600:1ffe:1100::,2600:1ffe:dfff:ffff:ffff:ffff:ffff:ffff,US +2600:1ffe:e000::,2600:1ffe:e0ff:ffff:ffff:ffff:ffff:ffff,BR +2600:1ffe:e100::,2600:1fff:fff:ffff:ffff:ffff:ffff:ffff,US +2600:1fff:1000::,2600:1fff:10ff:ffff:ffff:ffff:ffff:ffff,CA +2600:1fff:1100::,2600:1fff:dfff:ffff:ffff:ffff:ffff:ffff,US +2600:1fff:e000::,2600:1fff:e0ff:ffff:ffff:ffff:ffff:ffff,BR +2600:1fff:e100::,2600:200f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2100::,2600:210f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2200::,2600:220f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2300::,2600:230f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2400::,2600:2407:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2500::,2600:250f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2600::,2600:260f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2700::,2600:270f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2800::,2600:2803:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2900::,2600:290f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2a00::,2600:2a0f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2b00::,2600:2b0f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2c00::,2600:2c03:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2d00::,2600:2d0f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2e00::,2600:2e0f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:3000::,2600:3007:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:3400::,2600:340f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:3800::,2600:380f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:3c00::,2600:3c03:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:4000::,2600:40ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:4400::,2600:4407:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:4800::,2600:480f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:4c00::,2600:4c01:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:5000::,2600:500f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:5400::,2600:541f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:5800::,2600:5801:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:5c00::,2600:5c01:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:6000::,2600:6001:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:6400::,2600:640f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:6800::,2600:68ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:6c00::,2600:6cff:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:7000::,2600:70ff:e810:ffff:ffff:ffff:ffff:ffff,US +2600:70ff:e811::,2600:70ff:e811:7fff:ffff:ffff:ffff:ffff,ZA +2600:70ff:e811:8000::,2600:70ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:7400::,2600:740f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:7800::,2600:780f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:7c00::,2600:7c0f:ffff:ffff:ffff:ffff:ffff:ffff,LC +2600:8000::,2600:80ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:8400::,2600:840f:ffff:ffff:ffff:ffff:ffff:ffff,BB +2600:8800::,2600:8802:3802:afff:ffff:ffff:ffff:ffff,US +2600:8802:3802:b000::,2600:8802:3802:b3ff:ffff:ffff:ffff:ffff,AU +2600:8802:3802:b400::,2600:880f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:8c00::,2600:8c0f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:9000::,2600:900f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:a000::,2600:a00f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:a400::,2600:a40f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:b000::,2600:b00f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:e000::,2600:e00f:ffff:ffff:ffff:ffff:ffff:ffff,CA +2601::,2601:fff:ffff:ffff:ffff:ffff:ffff:ffff,US +2602::,2602:10f:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:200::,2602:200:ffff:ffff:ffff:ffff:ffff:ffff,CA +2602:210::,2602:210:ffff:ffff:ffff:ffff:ffff:ffff,CA +2602:220::,2602:220:ffff:ffff:ffff:ffff:ffff:ffff,CA +2602:230::,2602:231:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:233::,2602:233:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:240::,2602:25f:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:300::,2602:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:fea6::,2602:fea6:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fea7::,2602:fea7:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fea8::,2602:fea8:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fea9::,2602:fea9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feaa::,2602:feaa:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feab::,2602:feab:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:feac::,2602:feac:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fead::,2602:fead:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feae::,2602:feae:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feaf::,2602:feaf:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feb0::,2602:feb0:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:feb1::,2602:feb1:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feb2::,2602:feb2:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feb3::,2602:feb3:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feb4::,2602:feb4:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feb5::,2602:feb5:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feb6::,2602:feb6:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feb7::,2602:feb7:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feb8::,2602:feb8:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feb9::,2602:feb9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feba::,2602:feba:fff:ffff:ffff:ffff:ffff:ffff,US +2602:febb::,2602:febb:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:febc::,2602:febc:fff:ffff:ffff:ffff:ffff:ffff,US +2602:febd::,2602:febd:fff:ffff:ffff:ffff:ffff:ffff,US +2602:febe::,2602:febe:fff:ffff:ffff:ffff:ffff:ffff,US +2602:febf::,2602:febf:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fec0::,2602:fec0:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fec1::,2602:fec1:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fec2::,2602:fec2:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fec3::,2602:fec3:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:fec4::,2602:fec4:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fec5::,2602:fec5:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fec6::,2602:fec6:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fec7::,2602:fec7:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:fec8::,2602:fec8:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fec9::,2602:fec9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feca::,2602:feca:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fecb::,2602:fecb:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fecc::,2602:fecc:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fecd::,2602:fecd:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:fece::,2602:fece:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fecf::,2602:fecf:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fed0::,2602:fed0:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fed1::,2602:fed1:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fed2::,2602:fed2:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:fed3::,2602:fed3:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fed4::,2602:fed4:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fed5::,2602:fed5:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fed6::,2602:fed6:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fed7::,2602:fed7:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fed8::,2602:fed8:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:fed9::,2602:fed9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feda::,2602:feda:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fedb::,2602:fedb:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fedc::,2602:fedc:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fedd::,2602:fedd:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:fede::,2602:fede:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fedf::,2602:fedf:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef0::,2602:fef0:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef1::,2602:fef1:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef2::,2602:fef2:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:fef3::,2602:fef3:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef4::,2602:fef4:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef5::,2602:fef5:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef6::,2602:fef6:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef7::,2602:fef7:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef8::,2602:fef8:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef9::,2602:fef9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fefa::,2602:fefb:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fefc::,2602:fefc:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:fefd::,2602:fefd:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fefe::,2602:fefe:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feff::,2602:feff:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff00::,2602:ff00:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff01::,2602:ff01:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff02::,2602:ff02:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff04::,2602:ff04:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff05::,2602:ff05:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff06::,2602:ff06:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff07::,2602:ff07:fff:ffff:ffff:ffff:ffff:ffff,CW +2602:ff08::,2602:ff08:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff09::,2602:ff09:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff0a::,2602:ff0a:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff0b::,2602:ff0b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff0c::,2602:ff0c:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff0d::,2602:ff0d:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff0e::,2602:ff0e:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff0f::,2602:ff0f:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff10::,2602:ff10:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff11::,2602:ff11:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff12::,2602:ff12:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff13::,2602:ff13:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff14::,2602:ff14:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff15::,2602:ff15:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff16::,2602:ff16:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff17::,2602:ff17:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff18::,2602:ff18:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff19::,2602:ff19:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff1a::,2602:ff1a:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff1b::,2602:ff1b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff1c::,2602:ff1c:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff1d::,2602:ff1d:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff1e::,2602:ff1e:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff1f::,2602:ff1f:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff20::,2602:ff20:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff21::,2602:ff21:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff22::,2602:ff22:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff23::,2602:ff23:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff24::,2602:ff24:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff25::,2602:ff25:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff26::,2602:ff26:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff27::,2602:ff27:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff28::,2602:ff28:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff29::,2602:ff29:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff2a::,2602:ff2b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff2c::,2602:ff2c:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff2d::,2602:ff2d:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff2e::,2602:ff2e:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff2f::,2602:ff2f:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff30::,2602:ff30:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff31::,2602:ff31:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff32::,2602:ff32:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff33::,2602:ff33:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff34::,2602:ff34:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff35::,2602:ff35:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff36::,2602:ff36:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff37::,2602:ff37:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff38::,2602:ff38:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff39::,2602:ff39:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff3a::,2602:ff3a:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff3b::,2602:ff3b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff3c::,2602:ff3c:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff3d::,2602:ff3d:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff3e::,2602:ff3e:7ff:ffff:ffff:ffff:ffff:ffff,US +2602:ff3e:800::,2602:ff3e:800:7fff:ffff:ffff:ffff:ffff,IN +2602:ff3e:800:8000::,2602:ff3e:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff3f::,2602:ff3f:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff40::,2602:ff40:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff41::,2602:ff41:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff42::,2602:ff42:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff43::,2602:ff43:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff44::,2602:ff44:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff45::,2602:ff45:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff46::,2602:ff46:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff47::,2602:ff47:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff48::,2602:ff48:fff:ffff:ffff:ffff:ffff:ffff,TC +2602:ff49::,2602:ff49:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff4a::,2602:ff4a:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff4b::,2602:ff4b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff4c::,2602:ff4c:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff4d::,2602:ff4d:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff4e::,2602:ff4e:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff4f::,2602:ff4f:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff50::,2602:ff50:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff51::,2602:ff51:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff52::,2602:ff52:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff53::,2602:ff53:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff54::,2602:ff54:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff55::,2602:ff55:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff56::,2602:ff56:fff:ffff:ffff:ffff:ffff:ffff,PR +2602:ff57::,2602:ff57:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff58::,2602:ff58:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff59::,2602:ff59:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff5a::,2602:ff5a:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff5b::,2602:ff5b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff5c::,2602:ff5c:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff5d::,2602:ff5d:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff5e::,2602:ff5e:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff5f::,2602:ff5f:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff60::,2602:ff60:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff61::,2602:ff61:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff62::,2602:ff62::ffff:ffff:ffff:ffff:ffff,US +2602:ff62:1::,2602:ff62:1:ffff:ffff:ffff:ffff:ffff,RU +2602:ff62:2::,2602:ff62:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff63::,2602:ff63:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff64::,2602:ff64:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff65::,2602:ff65:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff66::,2602:ff66:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff67::,2602:ff67:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff68::,2602:ff68:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff69::,2602:ff69:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff6b::,2602:ff6b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff6c::,2602:ff6c:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff6d::,2602:ff6d:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff6e::,2602:ff6e:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff6f::,2602:ff6f:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff70::,2602:ff70:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff71::,2602:ff72:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff74::,2602:ff74:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff75::,2602:ff75:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff76::,2602:ff76:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff77::,2602:ff77:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff79::,2602:ff79:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff7a::,2602:ff7b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff7c::,2602:ff7c:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff7d::,2602:ff7d:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff7f::,2602:ff7f:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff80::,2602:ff80:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff81::,2602:ff81:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff82::,2602:ff82:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff83::,2602:ff83:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff84::,2602:ff84:2:ffff:ffff:ffff:ffff:ffff,US +2602:ff84:3::,2602:ff84:3:ffff:ffff:ffff:ffff:ffff,DE +2602:ff84:4::,2602:ff84:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff85::,2602:ff85:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff87::,2602:ff87:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff88::,2602:ff88:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff89::,2602:ff89:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff8a::,2602:ff8a:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff8b::,2602:ff8b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff8c::,2602:ff8c:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff8d::,2602:ff8d:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff8e::,2602:ff8e:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff8f::,2602:ff8f:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff90::,2602:ff90:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff91::,2602:ff91:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff92::,2602:ff92:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff93::,2602:ff93:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff94::,2602:ff94:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff95::,2602:ff95:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff96::,2602:ff96:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff97::,2602:ff97:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff98::,2602:ff98:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff99::,2602:ff99:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff9b::,2602:ff9b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff9c::,2602:ff9c:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff9d::,2602:ff9d:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff9f::,2602:ff9f:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ffa0::,2602:ffa0:fff:ffff:ffff:ffff:ffff:ffff,VG +2602:ffa2::,2602:ffa2:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa3::,2602:ffa3:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa4::,2602:ffa4:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa5::,2602:ffa5:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa6::,2602:ffa7:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa8::,2602:ffa8:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa9::,2602:ffa9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffaa::,2602:ffaa:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffab::,2602:ffab:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffac::,2602:ffac:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffad::,2602:ffad:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffae::,2602:ffae:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffaf::,2602:ffaf:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffb0::,2602:ffb0:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:ffb1::,2602:ffb1:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ffb2::,2602:ffb2:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffb3::,2602:ffb3:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffb4::,2602:ffb4:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffb5::,2602:ffb5:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffb6::,2602:ffb6:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ffb7::,2602:ffb7:eff:ffff:ffff:ffff:ffff:ffff,US +2602:ffb7:f00::,2602:ffb7:fff:ffff:ffff:ffff:ffff:ffff,DE +2602:ffb8::,2602:ffb8:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffb9::,2602:ffb9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffba::,2602:ffba:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffbb::,2602:ffbb:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffbc::,2602:ffbc:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffbd::,2602:ffbd:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffbe::,2602:ffbe:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ffbf::,2602:ffbf:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffc0::,2602:ffc0:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffc1::,2602:ffc1:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ffc2::,2602:ffc2:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffc3::,2602:ffc3:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffc4::,2602:ffc4:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffc5::,2602:ffc5:104:ffff:ffff:ffff:ffff:ffff,US +2602:ffc5:105::,2602:ffc5:105:ffff:ffff:ffff:ffff:ffff,CA +2602:ffc5:106::,2602:ffc6:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffc7::,2602:ffc7:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffc8::,2602:ffc9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffca::,2602:ffca:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffcb::,2602:ffcb:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffcc::,2602:ffcc:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffcd::,2602:ffcd:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ffce::,2602:ffce:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ffcf::,2602:ffcf:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffd0::,2602:ffd0:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffd1::,2602:ffd1:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffd3::,2602:ffd3:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffd4::,2602:ffd4:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffd5::,2602:ffd5:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ffd6::,2602:ffd6:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffd7::,2602:ffd7:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffd8::,2602:ffd8:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffd9::,2602:ffd9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffda::,2602:ffda:aa9:ffff:ffff:ffff:ffff:ffff,US +2602:ffda:aaa::,2602:ffda:aaa:7fff:ffff:ffff:ffff:ffff,NL +2602:ffda:aaa:8000::,2602:ffda:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffdb::,2602:ffdb:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffdc::,2602:ffdc:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffdd::,2602:ffdd:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffde::,2602:ffde:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffdf::,2602:ffdf:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffe0::,2602:ffe0:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffe1::,2602:ffe1:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffe2::,2602:ffe2:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffe3::,2602:ffe3:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffe4::,2602:ffe4:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffe5::,2602:ffe5:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffe7::,2602:ffe7:fff:ffff:ffff:ffff:ffff:ffff,PR +2602:ffe8::,2602:ffe8:3ff:ffff:ffff:ffff:ffff:ffff,US +2602:ffe8:400::,2602:ffe8:4ff:ffff:ffff:ffff:ffff:ffff,AU +2602:ffe8:500::,2602:ffe8:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:ffea::,2602:ffeb:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffec::,2602:ffec:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ffed::,2602:ffed:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffee::,2602:ffee:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffef::,2602:ffef:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fff0::,2602:fff0:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fff1::,2602:fff1:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fff2::,2602:fff2:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fff3::,2602:fff3:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fff4::,2602:fff5:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fff6::,2602:fff6:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fff7::,2602:fff7:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fff8::,2602:fff8:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fff9::,2602:fff9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fffa::,2602:fffa:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fffb::,2602:fffb:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fffc::,2602:fffc:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:fffd::,2602:fffd:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ffff::,2602:ffff:fff:ffff:ffff:ffff:ffff:ffff,US +2603::,2603:100f:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1010::,2603:1010:2ff:ffff:ffff:ffff:ffff:ffff,AU +2603:1010:300::,2603:1015:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1016::,2603:1016::4c:ffff:ffff:ffff:ffff,AU +2603:1016:0:4d::,2603:1016::ffff:ffff:ffff:ffff:ffff,US +2603:1016:1::,2603:1016:1:ffff:ffff:ffff:ffff:ffff,AU +2603:1016:2::,2603:1016:1f:ffff:ffff:ffff:ffff:ffff,US +2603:1016:20::,2603:1016:2f:ffff:ffff:ffff:ffff:ffff,AU +2603:1016:30::,2603:1016:1ff:ffff:ffff:ffff:ffff:ffff,US +2603:1016:200::,2603:1016:200:37:ffff:ffff:ffff:ffff,AU +2603:1016:200:38::,2603:1016:200:ffff:ffff:ffff:ffff:ffff,US +2603:1016:201::,2603:1016:201:3f:ffff:ffff:ffff:ffff,AU +2603:1016:201:40::,2603:1016:227:ffff:ffff:ffff:ffff:ffff,US +2603:1016:228::,2603:1016:228:ffff:ffff:ffff:ffff:ffff,AU +2603:1016:229::,2603:1016:fff:ffff:ffff:ffff:ffff:ffff,US +2603:1016:1000::,2603:1016:13ff:ffff:ffff:ffff:ffff:ffff,AU +2603:1016:1400::,2603:1018:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1019::,2603:1019:100:ffff:ffff:ffff:ffff:ffff,AU +2603:1019:101::,2603:1019:1ff:ffff:ffff:ffff:ffff:ffff,US +2603:1019:200::,2603:1019:2ff:ffff:ffff:ffff:ffff:ffff,AU +2603:1019:300::,2603:101f:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1020::,2603:1020:ff:ffff:ffff:ffff:ffff:ffff,IE +2603:1020:100::,2603:1020:1ff:ffff:ffff:ffff:ffff:ffff,AT +2603:1020:200::,2603:1020:2ff:ffff:ffff:ffff:ffff:ffff,NL +2603:1020:300::,2603:1020:4ff:ffff:ffff:ffff:ffff:ffff,GB +2603:1020:500::,2603:1020:5ff:ffff:ffff:ffff:ffff:ffff,FI +2603:1020:600::,2603:1020:7ff:ffff:ffff:ffff:ffff:ffff,GB +2603:1020:800::,2603:1020:9ff:ffff:ffff:ffff:ffff:ffff,FR +2603:1020:a00::,2603:1023:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1024::,2603:1024:ff:ffff:ffff:ffff:ffff:ffff,IE +2603:1024:100::,2603:1025:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1026::,2603:1026:2:ffff:ffff:ffff:ffff:ffff,IE +2603:1026:3::,2603:1026:3:ffff:ffff:ffff:ffff:ffff,FI +2603:1026:4::,2603:1026:6:ffff:ffff:ffff:ffff:ffff,IE +2603:1026:7::,2603:1026:7:ffff:ffff:ffff:ffff:ffff,FI +2603:1026:8::,2603:1026:8:ffff:ffff:ffff:ffff:ffff,IE +2603:1026:9::,2603:1026:1f:ffff:ffff:ffff:ffff:ffff,US +2603:1026:20::,2603:1026:22:ffff:ffff:ffff:ffff:ffff,IE +2603:1026:23::,2603:1026:23:ffff:ffff:ffff:ffff:ffff,FI +2603:1026:24::,2603:1026:25:ffff:ffff:ffff:ffff:ffff,IE +2603:1026:26::,2603:1026:27:ffff:ffff:ffff:ffff:ffff,US +2603:1026:28::,2603:1026:2a:ffff:ffff:ffff:ffff:ffff,IE +2603:1026:2b::,2603:1026:2b:ffff:ffff:ffff:ffff:ffff,FI +2603:1026:2c::,2603:1026:2d:ffff:ffff:ffff:ffff:ffff,IE +2603:1026:2e::,2603:1026:2e:ffff:ffff:ffff:ffff:ffff,US +2603:1026:2f::,2603:1026:2f:ffff:ffff:ffff:ffff:ffff,FI +2603:1026:30::,2603:1026:ff:ffff:ffff:ffff:ffff:ffff,US +2603:1026:100::,2603:1026:10f:ffff:ffff:ffff:ffff:ffff,FR +2603:1026:110::,2603:1026:11f:ffff:ffff:ffff:ffff:ffff,US +2603:1026:120::,2603:1026:12f:ffff:ffff:ffff:ffff:ffff,FR +2603:1026:130::,2603:1026:1ff:ffff:ffff:ffff:ffff:ffff,US +2603:1026:200::,2603:1026:2ff:ffff:ffff:ffff:ffff:ffff,NL +2603:1026:300::,2603:1026:3ff:ffff:ffff:ffff:ffff:ffff,AT +2603:1026:400::,2603:1026:6ff:ffff:ffff:ffff:ffff:ffff,GB +2603:1026:700::,2603:1026:70f:ffff:ffff:ffff:ffff:ffff,FR +2603:1026:710::,2603:1026:71f:ffff:ffff:ffff:ffff:ffff,US +2603:1026:720::,2603:1026:72f:ffff:ffff:ffff:ffff:ffff,FR +2603:1026:730::,2603:1026:7ff:ffff:ffff:ffff:ffff:ffff,US +2603:1026:800::,2603:1026:8ff:ffff:ffff:ffff:ffff:ffff,GB +2603:1026:900::,2603:1026:fff:ffff:ffff:ffff:ffff:ffff,US +2603:1026:1000::,2603:1026:10ff:ffff:ffff:ffff:ffff:ffff,IE +2603:1026:1100::,2603:1026:12ff:ffff:ffff:ffff:ffff:ffff,FR +2603:1026:1300::,2603:1026:13ff:ffff:ffff:ffff:ffff:ffff,NL +2603:1026:1400::,2603:1027::1:ffff:ffff:ffff:ffff,US +2603:1027:0:2::,2603:1027::3:ffff:ffff:ffff:ffff,NL +2603:1027:0:4::,2603:1027::4:ffff:ffff:ffff:ffff,IE +2603:1027:0:5::,2603:1027::5:ffff:ffff:ffff:ffff,US +2603:1027:0:6::,2603:1027::6:ffff:ffff:ffff:ffff,NL +2603:1027:0:7::,2603:1027::8:ffff:ffff:ffff:ffff,IE +2603:1027:0:9::,2603:1027::a:ffff:ffff:ffff:ffff,NL +2603:1027:0:b::,2603:1027::42:ffff:ffff:ffff:ffff,US +2603:1027:0:43::,2603:1027::43:ffff:ffff:ffff:ffff,NL +2603:1027:0:44::,2603:1027::44:ffff:ffff:ffff:ffff,IE +2603:1027:0:45::,2603:1027::81:ffff:ffff:ffff:ffff,US +2603:1027:0:82::,2603:1027::83:ffff:ffff:ffff:ffff,NL +2603:1027:0:84::,2603:1027::84:ffff:ffff:ffff:ffff,IE +2603:1027:0:85::,2603:1027::85:ffff:ffff:ffff:ffff,US +2603:1027:0:86::,2603:1027::86:ffff:ffff:ffff:ffff,NL +2603:1027:0:87::,2603:1027::88:ffff:ffff:ffff:ffff,IE +2603:1027:0:89::,2603:1027::8a:ffff:ffff:ffff:ffff,NL +2603:1027:0:8b::,2603:1027::c2:ffff:ffff:ffff:ffff,US +2603:1027:0:c3::,2603:1027::c3:ffff:ffff:ffff:ffff,NL +2603:1027:0:c4::,2603:1027::c4:ffff:ffff:ffff:ffff,IE +2603:1027:0:c5::,2603:1029:2ff:ffff:ffff:ffff:ffff:ffff,US +2603:1029:300::,2603:1029:3ff:ffff:ffff:ffff:ffff:ffff,AT +2603:1029:400::,2603:1029:4ff:ffff:ffff:ffff:ffff:ffff,IE +2603:1029:500::,2603:1029:5ff:ffff:ffff:ffff:ffff:ffff,US +2603:1029:600::,2603:1029:605:ffff:ffff:ffff:ffff:ffff,NL +2603:1029:606::,2603:1029:606:ffff:ffff:ffff:ffff:ffff,SE +2603:1029:607::,2603:1029:7ff:ffff:ffff:ffff:ffff:ffff,US +2603:1029:800::,2603:1029:802:ffff:ffff:ffff:ffff:ffff,GB +2603:1029:803::,2603:1029:aff:ffff:ffff:ffff:ffff:ffff,US +2603:1029:b00::,2603:1029:cff:ffff:ffff:ffff:ffff:ffff,GB +2603:1029:d00::,2603:1030:207:ffff:ffff:ffff:ffff:ffff,US +2603:1030:208::,2603:1030:20b:ffff:ffff:ffff:ffff:ffff,CA +2603:1030:20c::,2603:1030:eff:ffff:ffff:ffff:ffff:ffff,US +2603:1030:f00::,2603:1030:10ff:ffff:ffff:ffff:ffff:ffff,CA +2603:1030:1100::,2603:1036:aff:ffff:ffff:ffff:ffff:ffff,US +2603:1036:b00::,2603:1036:cff:ffff:ffff:ffff:ffff:ffff,CA +2603:1036:d00::,2603:1037::d:ffff:ffff:ffff:ffff,US +2603:1037:0:e::,2603:1037::f:ffff:ffff:ffff:ffff,CA +2603:1037:0:10::,2603:1037::8d:ffff:ffff:ffff:ffff,US +2603:1037:0:8e::,2603:1037::8f:ffff:ffff:ffff:ffff,CA +2603:1037:0:90::,2603:1039:dff:ffff:ffff:ffff:ffff:ffff,US +2603:1039:e00::,2603:1039:eff:ffff:ffff:ffff:ffff:ffff,CA +2603:1039:f00::,2603:1039:fff:ffff:ffff:ffff:ffff:ffff,US +2603:1039:1000::,2603:1039:10ff:ffff:ffff:ffff:ffff:ffff,CA +2603:1039:1100::,2603:1039:1100:ffff:ffff:ffff:ffff:ffff,PR +2603:1039:1101::,2603:103f:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1040::,2603:1040:ff:ffff:ffff:ffff:ffff:ffff,SG +2603:1040:100::,2603:1040:1ff:ffff:ffff:ffff:ffff:ffff,MY +2603:1040:200::,2603:1040:2ff:ffff:ffff:ffff:ffff:ffff,HK +2603:1040:300::,2603:1040:3ff:ffff:ffff:ffff:ffff:ffff,US +2603:1040:400::,2603:1040:4ff:ffff:ffff:ffff:ffff:ffff,JP +2603:1040:500::,2603:1040:5ff:ffff:ffff:ffff:ffff:ffff,US +2603:1040:600::,2603:1040:6ff:ffff:ffff:ffff:ffff:ffff,JP +2603:1040:700::,2603:1040:7ff:ffff:ffff:ffff:ffff:ffff,US +2603:1040:800::,2603:1040:8ff:ffff:ffff:ffff:ffff:ffff,IN +2603:1040:900::,2603:1040:9ff:ffff:ffff:ffff:ffff:ffff,US +2603:1040:a00::,2603:1040:aff:ffff:ffff:ffff:ffff:ffff,IN +2603:1040:b00::,2603:1040:bff:ffff:ffff:ffff:ffff:ffff,US +2603:1040:c00::,2603:1040:cff:ffff:ffff:ffff:ffff:ffff,IN +2603:1040:d00::,2603:1040:dff:ffff:ffff:ffff:ffff:ffff,US +2603:1040:e00::,2603:1040:fff:ffff:ffff:ffff:ffff:ffff,KR +2603:1040:1000::,2603:1045:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1046::,2603:1046:ff:ffff:ffff:ffff:ffff:ffff,SG +2603:1046:100::,2603:1046:1ff:ffff:ffff:ffff:ffff:ffff,KR +2603:1046:200::,2603:1046:2ff:ffff:ffff:ffff:ffff:ffff,HK +2603:1046:300::,2603:1046:3ff:ffff:ffff:ffff:ffff:ffff,KR +2603:1046:400::,2603:1046:4ff:ffff:ffff:ffff:ffff:ffff,JP +2603:1046:500::,2603:1046:5ff:ffff:ffff:ffff:ffff:ffff,IN +2603:1046:600::,2603:1046:6ff:ffff:ffff:ffff:ffff:ffff,JP +2603:1046:700::,2603:1046:7ff:ffff:ffff:ffff:ffff:ffff,IN +2603:1046:800::,2603:1046:800:ffff:ffff:ffff:ffff:ffff,MY +2603:1046:801::,2603:1046:801:ffff:ffff:ffff:ffff:ffff,KR +2603:1046:802::,2603:1046:802:ffff:ffff:ffff:ffff:ffff,US +2603:1046:803::,2603:1046:803:ffff:ffff:ffff:ffff:ffff,KR +2603:1046:804::,2603:1046:804:ffff:ffff:ffff:ffff:ffff,MY +2603:1046:805::,2603:1046:805:ffff:ffff:ffff:ffff:ffff,KR +2603:1046:806::,2603:1046:81f:ffff:ffff:ffff:ffff:ffff,US +2603:1046:820::,2603:1046:820:ffff:ffff:ffff:ffff:ffff,MY +2603:1046:821::,2603:1046:821:ffff:ffff:ffff:ffff:ffff,KR +2603:1046:822::,2603:1046:827:ffff:ffff:ffff:ffff:ffff,US +2603:1046:828::,2603:1046:828:ffff:ffff:ffff:ffff:ffff,MY +2603:1046:829::,2603:1046:829:ffff:ffff:ffff:ffff:ffff,KR +2603:1046:82a::,2603:1046:82a:ffff:ffff:ffff:ffff:ffff,US +2603:1046:82b::,2603:1046:82b:ffff:ffff:ffff:ffff:ffff,KR +2603:1046:82c::,2603:1046:8ff:ffff:ffff:ffff:ffff:ffff,US +2603:1046:900::,2603:1046:9ff:ffff:ffff:ffff:ffff:ffff,IN +2603:1046:a00::,2603:1046:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1047::,2603:1047::ffff:ffff:ffff:ffff,KR +2603:1047:0:1::,2603:1047::1:ffff:ffff:ffff:ffff,HK +2603:1047:0:2::,2603:1047::3:ffff:ffff:ffff:ffff,SG +2603:1047:0:4::,2603:1047::4:ffff:ffff:ffff:ffff,US +2603:1047:0:5::,2603:1047::5:ffff:ffff:ffff:ffff,HK +2603:1047:0:6::,2603:1047::6:ffff:ffff:ffff:ffff,SG +2603:1047:0:7::,2603:1047::7:ffff:ffff:ffff:ffff,KR +2603:1047:0:8::,2603:1047::9:ffff:ffff:ffff:ffff,JP +2603:1047:0:a::,2603:1047::b:ffff:ffff:ffff:ffff,AU +2603:1047:0:c::,2603:1047::d:ffff:ffff:ffff:ffff,IN +2603:1047:0:e::,2603:1047::e:ffff:ffff:ffff:ffff,HK +2603:1047:0:f::,2603:1047::f:ffff:ffff:ffff:ffff,SG +2603:1047:0:10::,2603:1047::3f:ffff:ffff:ffff:ffff,US +2603:1047:0:40::,2603:1047::40:ffff:ffff:ffff:ffff,JP +2603:1047:0:41::,2603:1047::41:ffff:ffff:ffff:ffff,SG +2603:1047:0:42::,2603:1047::42:ffff:ffff:ffff:ffff,JP +2603:1047:0:43::,2603:1047::43:ffff:ffff:ffff:ffff,HK +2603:1047:0:44::,2603:1047::44:ffff:ffff:ffff:ffff,AU +2603:1047:0:45::,2603:1047::45:ffff:ffff:ffff:ffff,IN +2603:1047:0:46::,2603:1047::46:ffff:ffff:ffff:ffff,US +2603:1047:0:47::,2603:1047::47:ffff:ffff:ffff:ffff,IN +2603:1047:0:48::,2603:1047::49:ffff:ffff:ffff:ffff,KR +2603:1047:0:4a::,2603:1047::7f:ffff:ffff:ffff:ffff,US +2603:1047:0:80::,2603:1047::80:ffff:ffff:ffff:ffff,KR +2603:1047:0:81::,2603:1047::81:ffff:ffff:ffff:ffff,HK +2603:1047:0:82::,2603:1047::83:ffff:ffff:ffff:ffff,SG +2603:1047:0:84::,2603:1047::84:ffff:ffff:ffff:ffff,US +2603:1047:0:85::,2603:1047::85:ffff:ffff:ffff:ffff,HK +2603:1047:0:86::,2603:1047::86:ffff:ffff:ffff:ffff,SG +2603:1047:0:87::,2603:1047::87:ffff:ffff:ffff:ffff,KR +2603:1047:0:88::,2603:1047::89:ffff:ffff:ffff:ffff,JP +2603:1047:0:8a::,2603:1047::8b:ffff:ffff:ffff:ffff,AU +2603:1047:0:8c::,2603:1047::8d:ffff:ffff:ffff:ffff,IN +2603:1047:0:8e::,2603:1047::8e:ffff:ffff:ffff:ffff,HK +2603:1047:0:8f::,2603:1047::8f:ffff:ffff:ffff:ffff,SG +2603:1047:0:90::,2603:1047::90:ffff:ffff:ffff:ffff,HK +2603:1047:0:91::,2603:1047::91:ffff:ffff:ffff:ffff,SG +2603:1047:0:92::,2603:1047::bf:ffff:ffff:ffff:ffff,US +2603:1047:0:c0::,2603:1047::c0:ffff:ffff:ffff:ffff,JP +2603:1047:0:c1::,2603:1047::c1:ffff:ffff:ffff:ffff,SG +2603:1047:0:c2::,2603:1047::c2:ffff:ffff:ffff:ffff,JP +2603:1047:0:c3::,2603:1047::c3:ffff:ffff:ffff:ffff,HK +2603:1047:0:c4::,2603:1047::c4:ffff:ffff:ffff:ffff,AU +2603:1047:0:c5::,2603:1047::c5:ffff:ffff:ffff:ffff,IN +2603:1047:0:c6::,2603:1047::c6:ffff:ffff:ffff:ffff,US +2603:1047:0:c7::,2603:1047::c7:ffff:ffff:ffff:ffff,IN +2603:1047:0:c8::,2603:1047::c9:ffff:ffff:ffff:ffff,KR +2603:1047:0:ca::,2603:1047:ff:ffff:ffff:ffff:ffff:ffff,US +2603:1047:100::,2603:1047:1ff:ffff:ffff:ffff:ffff:ffff,SG +2603:1047:200::,2603:1047:2ff:ffff:ffff:ffff:ffff:ffff,HK +2603:1047:300::,2603:1047:4ff:ffff:ffff:ffff:ffff:ffff,JP +2603:1047:500::,2603:1047:5ff:ffff:ffff:ffff:ffff:ffff,KR +2603:1047:600::,2603:1048:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1049::,2603:1049:3:ffff:ffff:ffff:ffff:ffff,SG +2603:1049:4::,2603:1049:1ff:ffff:ffff:ffff:ffff:ffff,US +2603:1049:200::,2603:1049:202:ffff:ffff:ffff:ffff:ffff,HK +2603:1049:203::,2603:1049:2ff:ffff:ffff:ffff:ffff:ffff,US +2603:1049:300::,2603:1049:300:ffff:ffff:ffff:ffff:ffff,KR +2603:1049:301::,2603:1049:3ff:ffff:ffff:ffff:ffff:ffff,US +2603:1049:400::,2603:1049:4ff:ffff:ffff:ffff:ffff:ffff,JP +2603:1049:500::,2603:1049:5ff:ffff:ffff:ffff:ffff:ffff,US +2603:1049:600::,2603:1049:6ff:ffff:ffff:ffff:ffff:ffff,JP +2603:1049:700::,2603:1049:bff:ffff:ffff:ffff:ffff:ffff,US +2603:1049:c00::,2603:1049:cff:ffff:ffff:ffff:ffff:ffff,IN +2603:1049:d00::,2603:1049:dff:ffff:ffff:ffff:ffff:ffff,US +2603:1049:e00::,2603:1049:eff:ffff:ffff:ffff:ffff:ffff,IN +2603:1049:f00::,2603:1049:fff:ffff:ffff:ffff:ffff:ffff,US +2603:1049:1000::,2603:1049:10ff:ffff:ffff:ffff:ffff:ffff,IN +2603:1049:1100::,2603:1050::ffff:ffff:ffff:ffff:ffff,US +2603:1050:1::,2603:1050:3:ffff:ffff:ffff:ffff:ffff,BR +2603:1050:4::,2603:1050:ff:ffff:ffff:ffff:ffff:ffff,US +2603:1050:100::,2603:1050:1ff:ffff:ffff:ffff:ffff:ffff,BR +2603:1050:200::,2603:1050:20f:ffff:ffff:ffff:ffff:ffff,US +2603:1050:210::,2603:1050:21f:ffff:ffff:ffff:ffff:ffff,CL +2603:1050:220::,2603:1050:2ff:ffff:ffff:ffff:ffff:ffff,US +2603:1050:300::,2603:1050:3ff:ffff:ffff:ffff:ffff:ffff,CL +2603:1050:400::,2603:1055:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1056::,2603:1056:2:3f:ffff:ffff:ffff:ffff,BR +2603:1056:2:40::,2603:1056:1f:ffff:ffff:ffff:ffff:ffff,US +2603:1056:20::,2603:1056:20:ffff:ffff:ffff:ffff:ffff,BR +2603:1056:21::,2603:1056:27:ffff:ffff:ffff:ffff:ffff,US +2603:1056:28::,2603:1056:28:ffff:ffff:ffff:ffff:ffff,BR +2603:1056:29::,2603:1056:1ff:ffff:ffff:ffff:ffff:ffff,US +2603:1056:200::,2603:1056:20f:ffff:ffff:ffff:ffff:ffff,BR +2603:1056:210::,2603:1056:228:1:ffff:ffff:ffff:ffff,US +2603:1056:228:2::,2603:1056:228:4:ffff:ffff:ffff:ffff,BR +2603:1056:228:5::,2603:1056:3ff:ffff:ffff:ffff:ffff:ffff,US +2603:1056:400::,2603:1056:4ff:ffff:ffff:ffff:ffff:ffff,BR +2603:1056:500::,2603:1056:5ff:ffff:ffff:ffff:ffff:ffff,US +2603:1056:600::,2603:1056:6ff:ffff:ffff:ffff:ffff:ffff,CL +2603:1056:700::,2603:1057:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1058::,2603:1058:1f:ffff:ffff:ffff:ffff:ffff,CL +2603:1058:20::,2603:1058:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1059::,2603:1059::ffff:ffff:ffff:ffff:ffff,BR +2603:1059:1::,2603:1059:1:ffff:ffff:ffff:ffff:ffff,CL +2603:1059:2::,2603:1059:f:ffff:ffff:ffff:ffff:ffff,US +2603:1059:10::,2603:1059:1f:ffff:ffff:ffff:ffff:ffff,CL +2603:1059:20::,2603:1059:ff:ffff:ffff:ffff:ffff:ffff,US +2603:1059:100::,2603:1059:100:ffff:ffff:ffff:ffff:ffff,BR +2603:1059:101::,2603:1059:10f:ffff:ffff:ffff:ffff:ffff,US +2603:1059:110::,2603:1059:11f:ffff:ffff:ffff:ffff:ffff,BR +2603:1059:120::,2603:10ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:2000::,2603:30ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:4000::,2603:40ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:5000::,2603:50ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:6000::,2603:60ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:7000::,2603:70ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:8000::,2603:80ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:9000::,2603:90ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:a000::,2603:a0ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2604::,2604::ffff:ffff:ffff:ffff:ffff:ffff,US +2604:10::,2604:10:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:50::,2604:50:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:90::,2604:90:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:100::,2604:100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:140::,2604:140:ffff:ffff:ffff:ffff:ffff:ffff,BM +2604:180::,2604:180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1c0::,2604:1c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:200::,2604:200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:240::,2604:240:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:280::,2604:280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2c0::,2604:2c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:300::,2604:300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:340::,2604:340:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:380::,2604:380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3c0::,2604:3c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:400::,2604:400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:440::,2604:440:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:480::,2604:480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4c0::,2604:4c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:500::,2604:500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:540::,2604:540:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:580::,2604:580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5c0::,2604:5c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:600::,2604:600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:640::,2604:640:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:680::,2604:680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6c0::,2604:6c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:700::,2604:700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:740::,2604:740:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:780::,2604:780:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:7c0::,2604:7c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:800::,2604:800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:840::,2604:840:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:880::,2604:880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8c0::,2604:8c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:900::,2604:900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:940::,2604:940:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:980::,2604:980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9c0::,2604:9c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a00::,2604:a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a40::,2604:a40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a80::,2604:a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ac0::,2604:ac0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b40::,2604:b40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b80::,2604:b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:bc0::,2604:bc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c00::,2604:c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c40::,2604:c40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c80::,2604:c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:cc0::,2604:cc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d00::,2604:d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d40::,2604:d40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:d80::,2604:d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:dc0::,2604:dc0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:e00::,2604:e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e40::,2604:e40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e80::,2604:e80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:ec0::,2604:ec0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f00::,2604:f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f40::,2604:f40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f80::,2604:f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:fc0::,2604:fc0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1040::,2604:1040:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1080::,2604:1080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:10c0::,2604:10c0:ffff:ffff:ffff:ffff:ffff:ffff,VG +2604:1100::,2604:1100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1140::,2604:1140:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1180::,2604:1180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:11c0::,2604:11c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1200::,2604:1200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1240::,2604:1240:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1280::,2604:1280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:12c0::,2604:12c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1300::,2604:1300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1340::,2604:1340:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1380::,2604:1380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:13c0::,2604:13c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1400::,2604:1400:ffff:ffff:ffff:ffff:ffff:ffff,PR +2604:1440::,2604:1440:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1480::,2604:1480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:14c0::,2604:14c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1500::,2604:1500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1540::,2604:1540:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1580::,2604:1580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:15c0::,2604:15c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1600::,2604:1600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1640::,2604:1640:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1680::,2604:1680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:16c0::,2604:16c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1700::,2604:1700:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1740::,2604:1740:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1780::,2604:1780:ffff:ffff:ffff:ffff:ffff:ffff,KY +2604:17c0::,2604:17c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1800::,2604:1800:ffff:ffff:ffff:ffff:ffff:ffff,GP +2604:1840::,2604:1840:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1880::,2604:1880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:18c0::,2604:18c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1900::,2604:1900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1940::,2604:1940:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1980::,2604:1980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:19c0::,2604:19c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1a00::,2604:1a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1a40::,2604:1a40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1a80::,2604:1a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1ac0::,2604:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1b00::,2604:1b00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1b40::,2604:1b40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1b80::,2604:1b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1bc0::,2604:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1c00::,2604:1c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1c40::,2604:1c40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1c80::,2604:1c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1cc0::,2604:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,PR +2604:1d00::,2604:1d00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1d40::,2604:1d40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1d80::,2604:1d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1dc0::,2604:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1e00::,2604:1e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1e40::,2604:1e40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1e80::,2604:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1ec0::,2604:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1f00::,2604:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1f40::,2604:1f40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1f80::,2604:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1fc0::,2604:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2000::,2604:2000:9143:1fff:ffff:ffff:ffff:ffff,US +2604:2000:9143:2000::,2604:2000:9143:2fff:ffff:ffff:ffff:ffff,NL +2604:2000:9143:3000::,2604:2000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2040::,2604:2040:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2080::,2604:2080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:20c0::,2604:20c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2100::,2604:2100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2140::,2604:2140:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2180::,2604:2180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:21c0::,2604:21c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2200::,2604:2200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2240::,2604:2240:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2280::,2604:2280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:22c0::,2604:22c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2300::,2604:2300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2340::,2604:2340:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2380::,2604:2380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:23c0::,2604:23c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:2400::,2604:2400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2440::,2604:2440:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2480::,2604:2480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:24c0::,2604:24c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2500::,2604:2500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2540::,2604:2540:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2580::,2604:2580:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:25c0::,2604:25c0:ffff:ffff:ffff:ffff:ffff:ffff,CW +2604:2600::,2604:2600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2640::,2604:2640:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2680::,2604:2680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:26c0::,2604:26c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2700::,2604:2700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2740::,2604:2740:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2780::,2604:2780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:27c0::,2604:27c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2800::,2604:2800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2840::,2604:2840:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:2880::,2604:2880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:28c0::,2604:28c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2900::,2604:2900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2940::,2604:2940:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2980::,2604:2980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:29c0::,2604:29c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2a00::,2604:2a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2a40::,2604:2a40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2a80::,2604:2a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2ac0::,2604:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2b00::,2604:2b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2b40::,2604:2b40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2b80::,2604:2b80:fff:ffff:ffff:ffff:ffff:ffff,CA +2604:2bc0::,2604:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2c00::,2604:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2c40::,2604:2c40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2c80::,2604:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2cc0::,2604:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2d00::,2604:2d00:fff:ffff:ffff:ffff:ffff:ffff,US +2604:2d40::,2604:2d40:ffff:ffff:ffff:ffff:ffff:ffff,PR +2604:2d80::,2604:2d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2dc0::,2604:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2e00::,2604:2e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2e40::,2604:2e40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2e80::,2604:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2ec0::,2604:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2f00::,2604:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2f40::,2604:2f40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2f80::,2604:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:2fc0::,2604:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3000::,2604:3000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3040::,2604:3040:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3080::,2604:3080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:30c0::,2604:30c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3100::,2604:3100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3140::,2604:3140:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3180::,2604:3180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:31c0::,2604:31c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3200::,2604:3200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3240::,2604:3240:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3280::,2604:3280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:32c0::,2604:32c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3300::,2604:3300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3340::,2604:3340:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3380::,2604:3380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:33c0::,2604:33c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3400::,2604:3400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3440::,2604:3440:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3480::,2604:3480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:34c0::,2604:34c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3500::,2604:3500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3540::,2604:3540::11b:ffff:ffff:ffff:ffff,US +2604:3540:0:11c::,2604:3540::125:ffff:ffff:ffff:ffff,CA +2604:3540:0:126::,2604:3540:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3580::,2604:3580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:35c0::,2604:35c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3600::,2604:3600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3640::,2604:3640:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3680::,2604:3680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:36c0::,2604:36c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3700::,2604:3700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3740::,2604:3740:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3780::,2604:3780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:37c0::,2604:37c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3800::,2604:3800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3840::,2604:3840:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3880::,2604:3880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:38c0::,2604:38c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3940::,2604:3940:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:39c0::,2604:39c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3a00::,2604:3a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3a40::,2604:3a40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3a80::,2604:3a80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:3ac0::,2604:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3b00::,2604:3b00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:3b40::,2604:3b40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:3b80::,2604:3b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3bc0::,2604:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3c00::,2604:3c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3c40::,2604:3c40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3c80::,2604:3c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3cc0::,2604:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3d00::,2604:3d0f:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:3d40::,2604:3d40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3d80::,2604:3d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3dc0::,2604:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3e00::,2604:3e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3e40::,2604:3e40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:3e80::,2604:3e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3ec0::,2604:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3f00::,2604:3f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3f40::,2604:3f40:fff:ffff:ffff:ffff:ffff:ffff,CA +2604:3f80::,2604:3f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3fc0::,2604:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4000::,2604:4000:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:4040::,2604:4040:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4080::,2604:4080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:40c0::,2604:40c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4100::,2604:4100:fff:ffff:ffff:ffff:ffff:ffff,US +2604:4140::,2604:4140:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:4180::,2604:4180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:41c0::,2604:41c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4200::,2604:4200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4240::,2604:4240:fff:ffff:ffff:ffff:ffff:ffff,CA +2604:4280::,2604:4280:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:4300::,2604:4300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4340::,2604:4340:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:43c0::,2604:43c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4400::,2604:4400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4440::,2604:4440:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4480::,2604:4480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:44c0::,2604:44c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4500::,2604:4500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4540::,2604:4540:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4580::,2604:4580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:45c0::,2604:45c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:4600::,2604:460f:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4640::,2604:4640:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4680::,2604:4680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:46c0::,2604:46c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4700::,2604:4700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4740::,2604:4740:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4780::,2604:4780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:47c0::,2604:47c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4800::,2604:4800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4840::,2604:4840:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4880::,2604:4880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:48c0::,2604:48c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:4900::,2604:4900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4940::,2604:4940:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4980::,2604:4980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:49c0::,2604:49c0:ffff:ffff:ffff:ffff:ffff:ffff,GU +2604:4a00::,2604:4a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4a40::,2604:4a40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:4a80::,2604:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4ac0::,2604:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4b00::,2604:4b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4b40::,2604:4b40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:4b80::,2604:4b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4bc0::,2604:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4c00::,2604:4c00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:4c40::,2604:4c40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4c80::,2604:4c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4cc0::,2604:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4d00::,2604:4d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4d40::,2604:4d40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4d80::,2604:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:4dc0::,2604:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4e00::,2604:4e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4e40::,2604:4e40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4e80::,2604:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:4ec0::,2604:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4f00::,2604:4f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4f40::,2604:4f40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:4f80::,2604:4f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:4fc0::,2604:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5000::,2604:5000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5040::,2604:5040:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5080::,2604:5080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:50c0::,2604:50c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5100::,2604:5100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5140::,2604:5140:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:51c0::,2604:51c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5200::,2604:5200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5240::,2604:5240:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:5280::,2604:5280:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:52c0::,2604:52c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5300::,2604:5300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5340::,2604:5340:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:5380::,2604:5380:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:53c0::,2604:53c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5400::,2604:5400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5440::,2604:5440:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5480::,2604:5480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:54c0::,2604:54c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5500::,2604:5500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5540::,2604:5540:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5580::,2604:5580:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:55c0::,2604:55c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5600::,2604:5600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5640::,2604:5640:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:5680::,2604:5680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:56c0::,2604:56c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5700::,2604:5700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5740::,2604:5740:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:57c0::,2604:57c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5800::,2604:5800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5840::,2604:5840:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5880::,2604:5880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:58c0::,2604:58c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5940::,2604:5940:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:59c0::,2604:59c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5a40::,2604:5a40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:5a80::,2604:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5ac0::,2604:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5b00::,2604:5b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5b40::,2604:5b40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5b80::,2604:5b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5bc0::,2604:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5c00::,2604:5c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5c40::,2604:5c40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:5c80::,2604:5c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5cc0::,2604:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5d00::,2604:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5d40::,2604:5d40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5dc0::,2604:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5e00::,2604:5e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5e40::,2604:5e40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5e80::,2604:5e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5ec0::,2604:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5f00::,2604:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5f40::,2604:5f40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5f80::,2604:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:5fc0::,2604:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6000::,2604:6000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6040::,2604:6040:fff:ffff:ffff:ffff:ffff:ffff,US +2604:6080::,2604:6080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:60c0::,2604:60c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6100::,2604:6100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6140::,2604:6140:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6180::,2604:6180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:61c0::,2604:61c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6200::,2604:6200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6240::,2604:6240:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6280::,2604:6280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:62c0::,2604:62c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6300::,2604:6300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6340::,2604:6340:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6380::,2604:6380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:63c0::,2604:63c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:6400::,2604:6400:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:6440::,2604:6440:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:6480::,2604:6480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:64c0::,2604:64c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:6500::,2604:6500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:6540::,2604:6540:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6580::,2604:6580:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:65c0::,2604:65c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6600::,2604:6600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6640::,2604:6640:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6680::,2604:6680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:66c0::,2604:66c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6700::,2604:6700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6740::,2604:6740:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6780::,2604:6780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:67c0::,2604:67c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6800::,2604:6800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6840::,2604:6840:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6880::,2604:6880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:68c0::,2604:68c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6900::,2604:6900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6940::,2604:6940:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6980::,2604:6980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:69c0::,2604:69c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6a00::,2604:6a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6a40::,2604:6a40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6a80::,2604:6a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6ac0::,2604:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6b00::,2604:6b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6b40::,2604:6b40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:6b80::,2604:6b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6bc0::,2604:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6c00::,2604:6c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6c40::,2604:6c40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6c80::,2604:6c80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:6cc0::,2604:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:6d00::,2604:6d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6d40::,2604:6d40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6d80::,2604:6d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6dc0::,2604:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6e00::,2604:6e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6e40::,2604:6e40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:6e80::,2604:6e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6ec0::,2604:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6f00::,2604:6f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6f40::,2604:6f40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6f80::,2604:6f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6fc0::,2604:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7000::,2604:7000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7040::,2604:7040:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7080::,2604:7080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:70c0::,2604:70c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7100::,2604:7100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7140::,2604:7140:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7180::,2604:7180:fff:ffff:ffff:ffff:ffff:ffff,US +2604:71c0::,2604:71c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7200::,2604:7200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7240::,2604:7240:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7280::,2604:7280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:72c0::,2604:72c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7300::,2604:7300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7340::,2604:7340:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:73c0::,2604:73c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:7400::,2604:7400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7440::,2604:7440:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7480::,2604:7480:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:74c0::,2604:74c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7500::,2604:7500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7540::,2604:7540:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7580::,2604:7580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:75c0::,2604:75c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:7600::,2604:7600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7640::,2604:7640:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7680::,2604:7680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:76c0::,2604:76c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7700::,2604:7700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7740::,2604:7740:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7780::,2604:7780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:77c0::,2604:77c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7800::,2604:7800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7840::,2604:7840:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7880::,2604:7880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:78c0::,2604:78c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:7900::,2604:7900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7940::,2604:7940:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7980::,2604:7980:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:79c0::,2604:79c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7a00::,2604:7a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7a40::,2604:7a40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:7a80::,2604:7a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7ac0::,2604:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7b00::,2604:7b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7b40::,2604:7b40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7b80::,2604:7b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7bc0::,2604:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7c00::,2604:7c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7c40::,2604:7c40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7c80::,2604:7c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7cc0::,2604:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7d40::,2604:7d40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:7d80::,2604:7d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7e00::,2604:7e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7e40::,2604:7e40:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7e80::,2604:7e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7ec0::,2604:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7f00::,2604:7f00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:7f40::,2604:7f40:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:7f80::,2604:7f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:7fc0::,2604:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8000::,2604:8000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8040::,2604:8040:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8080::,2604:8080:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:80c0::,2604:80c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8100::,2604:8100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8140::,2604:8140:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8180::,2604:8181:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:81c0::,2604:81c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8200::,2604:8200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8240::,2604:8240:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8280::,2604:8280:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:82c0::,2604:82c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8300::,2604:8300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8340::,2604:8340:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:8380::,2604:8380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:83c0::,2604:83c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8400::,2604:8400:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:8440::,2604:8440:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8480::,2604:8480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:84c0::,2604:84c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8500::,2604:8500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8540::,2604:8540:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8580::,2604:8580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:85c0::,2604:85c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8600::,2604:8600:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:8640::,2604:8640:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:86c0::,2604:86c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:8700::,2604:8700:fff:ffff:ffff:ffff:ffff:ffff,US +2604:8780::,2604:8780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8800::,2604:8800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8880::,2604:8880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:8900::,2604:8900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8980::,2604:8980:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:8a00::,2604:8a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8a80::,2604:8a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8b00::,2604:8b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8b80::,2604:8b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8c00::,2604:8c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8c80::,2604:8c80:ffff:ffff:ffff:ffff:ffff:ffff,DM +2604:8d00::,2604:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8d80::,2604:8d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8e80::,2604:8e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8f00::,2604:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8f80::,2604:8f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9000::,2604:9000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9080::,2604:9080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9100::,2604:9100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9180::,2604:9180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9200::,2604:9200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9280::,2604:9280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9300::,2604:9300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9380::,2604:9380:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:9480::,2604:9480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9500::,2604:9500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9580::,2604:9580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9600::,2604:9600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9700::,2604:9700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9780::,2604:9780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9800::,2604:9800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9880::,2604:9880:fff:ffff:ffff:ffff:ffff:ffff,CA +2604:9900::,2604:9900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9980::,2604:9980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9a00::,2604:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9a80::,2604:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9b00::,2604:9b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9b80::,2604:9b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9c00::,2604:9c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9c80::,2604:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9d00::,2604:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9d80::,2604:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9e00::,2604:9e0f:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9e80::,2604:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:9f00::,2604:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9f80::,2604:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a000::,2604:a000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a080::,2604:a080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a100::,2604:a100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a180::,2604:a180:ffff:ffff:ffff:ffff:ffff:ffff,BB +2604:a200::,2604:a200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a280::,2604:a280:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:a300::,2604:a300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a400::,2604:a400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a480::,2604:a480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a580::,2604:a580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a600::,2604:a600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a680::,2604:a680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a700::,2604:a700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a780::,2604:a780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a800::,2604:a800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a880::,2604:a880:cac:ffff:ffff:ffff:ffff:ffff,US +2604:a880:cad::,2604:a880:cad:7fff:ffff:ffff:ffff:ffff,CA +2604:a880:cad:8000::,2604:a880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a900::,2604:a900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a980::,2604:a980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:aa00::,2604:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:aa80::,2604:aa80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ab00::,2604:ab00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ab80::,2604:ab80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ac00::,2604:ac00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ac80::,2604:ac80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ad00::,2604:ad00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ad80::,2604:ad80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ae00::,2604:ae00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ae80::,2604:ae80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:af00::,2604:af00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:af80::,2604:af80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b000::,2604:b000:ffff:ffff:ffff:ffff:ffff:ffff,PR +2604:b080::,2604:b080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b100::,2604:b100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b180::,2604:b180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b200::,2604:b200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b280::,2604:b280:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:b300::,2604:b300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b380::,2604:b380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b400::,2604:b400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b480::,2604:b480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b500::,2604:b500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b580::,2604:b580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b600::,2604:b600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b680::,2604:b680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b700::,2604:b700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b780::,2604:b780:fff:ffff:ffff:ffff:ffff:ffff,US +2604:b800::,2604:b800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b880::,2604:b880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b900::,2604:b900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b980::,2604:b980:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:ba00::,2604:ba00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ba80::,2604:ba80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:bb00::,2604:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:bb80::,2604:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:bc00::,2604:bc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:bc80::,2604:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:bd00::,2604:bd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:be00::,2604:be00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:be80::,2604:be80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:bf00::,2604:bf00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:bf80::,2604:bf80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c000::,2604:c000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c080::,2604:c080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c100::,2604:c100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c180::,2604:c180:ffff:ffff:ffff:ffff:ffff:ffff,VI +2604:c200::,2604:c200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c300::,2604:c300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c380::,2604:c380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c400::,2604:c400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c500::,2604:c500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c580::,2604:c580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c600::,2604:c600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c680::,2604:c680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c700::,2604:c700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c780::,2604:c780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c800::,2604:c800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c880::,2604:c880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c900::,2604:c900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c980::,2604:c980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ca00::,2604:ca00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ca80::,2604:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:cb00::,2604:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:cb80::,2604:cb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:cc00::,2604:cc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:cc80::,2604:cc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:cd00::,2604:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:cd80::,2604:cd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ce00::,2604:ce00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ce80::,2604:ce80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:cf00::,2604:cf00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:cf80::,2604:cf80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d000::,2604:d000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d080::,2604:d080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d100::,2604:d100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d180::,2604:d180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d200::,2604:d200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d280::,2604:d280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d300::,2604:d300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d380::,2604:d380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d400::,2604:d400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d480::,2604:d480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d500::,2604:d500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d580::,2604:d580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d600::,2604:d600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d680::,2604:d680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d700::,2604:d700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d780::,2604:d780:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:d800::,2604:d801:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d900::,2604:d900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:d980::,2604:d980:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:da00::,2604:da00:fff:ffff:ffff:ffff:ffff:ffff,US +2604:da80::,2604:da80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:db00::,2604:db00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:dc00::,2604:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:dc80::,2604:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:dd00::,2604:dd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:dd80::,2604:dd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:de00::,2604:de00:fff:ffff:ffff:ffff:ffff:ffff,US +2604:de80::,2604:de80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:df00::,2604:df00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e000::,2604:e000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e080::,2604:e080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e100::,2604:e100:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:e180::,2604:e180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e200::,2604:e200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e280::,2604:e280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e300::,2604:e300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e380::,2604:e380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e400::,2604:e400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e480::,2604:e480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e500::,2604:e500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e580::,2604:e580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e600::,2604:e600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e680::,2604:e680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e700::,2604:e700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e780::,2604:e780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e800::,2604:e800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e880::,2604:e880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e900::,2604:e900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:e980::,2604:e980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ea00::,2604:ea00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ea80::,2604:ea80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:eb00::,2604:eb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:eb80::,2604:eb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ec80::,2604:ec80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ed80::,2604:ed80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ee00::,2604:ee00:fff:ffff:ffff:ffff:ffff:ffff,US +2604:ee80::,2604:ee80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ef00::,2604:ef00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:f000::,2604:f000:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:f080::,2604:f080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f100::,2604:f100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f180::,2604:f180:ffff:ffff:ffff:ffff:ffff:ffff,PR +2604:f200::,2604:f200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f280::,2604:f280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f300::,2604:f300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f380::,2604:f380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f400::,2604:f400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f480::,2604:f480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f500::,2604:f500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f580::,2604:f580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f600::,2604:f600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f680::,2604:f680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:f700::,2604:f700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f800::,2604:f800:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:f880::,2604:f880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f900::,2604:f900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:f980::,2604:f980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:fa00::,2604:fa00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:fa80::,2604:fa80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:fb00::,2604:fb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:fb80::,2604:fb80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:fc00::,2604:fc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:fc80::,2604:fc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:fd00::,2604:fd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:fd80::,2604:fd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:fe00::,2604:fe00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:fe80::,2604:fe80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ff00::,2604:ff00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:ff80::,2604:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605::,2605::ffff:ffff:ffff:ffff:ffff:ffff,US +2605:80::,2605:80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:100::,2605:100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:180::,2605:180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:200::,2605:200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:280::,2605:280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:300::,2605:300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:380::,2605:380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:400::,2605:400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:480::,2605:480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:500::,2605:500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:600::,2605:600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:680::,2605:680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:700::,2605:700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:780::,2605:780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:800::,2605:800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:880::,2605:880:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:900::,2605:900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:980::,2605:980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a00::,2605:a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a80::,2605:a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b80::,2605:b81:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c00::,2605:c00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:d00::,2605:d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d80::,2605:d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e00::,2605:e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e80::,2605:e80:ffff:ffff:ffff:ffff:ffff:ffff,BM +2605:f00::,2605:f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f80::,2605:f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1000::,2605:1000:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:1080::,2605:1080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1100::,2605:1100:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:1180::,2605:1180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1280::,2605:1280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1300::,2605:1300:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:1380::,2605:1380:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:1400::,2605:1400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1480::,2605:1480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1500::,2605:1500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1580::,2605:1580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1600::,2605:1600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1680::,2605:1680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1700::,2605:1700:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:1780::,2605:1780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1800::,2605:1800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1880::,2605:1880:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1900::,2605:1900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1980::,2605:1980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1a00::,2605:1a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1a80::,2605:1a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1b00::,2605:1b00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:1b80::,2605:1b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1c00::,2605:1c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1c80::,2605:1c80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:1d00::,2605:1d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1e00::,2605:1e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1e80::,2605:1e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1f00::,2605:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:1f80::,2605:1f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2000::,2605:2000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2080::,2605:2080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2100::,2605:2100:fff:ffff:ffff:ffff:ffff:ffff,CA +2605:2180::,2605:2180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2200::,2605:2200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2280::,2605:2280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2300::,2605:2300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2380::,2605:2380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2400::,2605:2400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2480::,2605:2480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2500::,2605:2500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2580::,2605:2580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2600::,2605:2600:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:2680::,2605:2680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2700::,2605:2700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2800::,2605:2800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2880::,2605:2880:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2900::,2605:2900:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:2980::,2605:2980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2a00::,2605:2a00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:2a80::,2605:2a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2b00::,2605:2b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2b80::,2605:2b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2c00::,2605:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2c80::,2605:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2e00::,2605:2e00:fff:ffff:ffff:ffff:ffff:ffff,CA +2605:2f00::,2605:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3000::,2605:3000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3080::,2605:3080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3100::,2605:3100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3180::,2605:3180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3200::,2605:3200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3280::,2605:3280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3300::,2605:3300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3380::,2605:3380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3400::,2605:3400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3480::,2605:3480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3500::,2605:3500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3580::,2605:3580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3600::,2605:3600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3680::,2605:3680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3700::,2605:3700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3780::,2605:3780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3800::,2605:3800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3880::,2605:3880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:3900::,2605:3900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3980::,2605:3980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3a00::,2605:3a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3b00::,2605:3b00:fff:ffff:ffff:ffff:ffff:ffff,US +2605:3b80::,2605:3b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3c00::,2605:3c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3c80::,2605:3c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3d00::,2605:3d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3d80::,2605:3d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3e00::,2605:3e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3e80::,2605:3e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:3f00::,2605:3f00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:3f80::,2605:3f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4000::,2605:4000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4080::,2605:4080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4100::,2605:4100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4180::,2605:418f:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4200::,2605:4200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4280::,2605:4280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4300::,2605:4300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4380::,2605:4380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4400::,2605:4400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4480::,2605:4480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4500::,2605:4500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4580::,2605:4580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4600::,2605:4600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4680::,2605:4680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4700::,2605:4700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4780::,2605:4780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4800::,2605:4800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4900::,2605:4900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4980::,2605:4980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4a00::,2605:4a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4a80::,2605:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4b00::,2605:4b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4b80::,2605:4b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4c00::,2605:4c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4c80::,2605:4c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4d00::,2605:4d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4d80::,2605:4d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4e00::,2605:4e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:4f00::,2605:4f00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:4f80::,2605:4f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5000::,2605:5000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5080::,2605:5080:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:5100::,2605:5100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5180::,2605:5180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5200::,2605:5200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5280::,2605:5280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5300::,2605:5300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5380::,2605:5380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5400::,2605:5400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5480::,2605:5480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5580::,2605:5580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5600::,2605:5600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5680::,2605:5680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5700::,2605:5700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5800::,2605:5800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5880::,2605:5880:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5900::,2605:5900:ffff:ffff:ffff:ffff:ffff:ffff,JM +2605:5980::,2605:5980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5a00::,2605:5a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5a80::,2605:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5b00::,2605:5b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5c00::,2605:5c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5d00::,2605:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5d80::,2605:5d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5e00::,2605:5e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5f00::,2605:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:5f80::,2605:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6000::,2605:600f:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6080::,2605:6080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6100::,2605:6100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6180::,2605:6180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6200::,2605:6200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6280::,2605:6280:ffff:ffff:ffff:ffff:ffff:ffff,AI +2605:6300::,2605:6300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6380::,2605:6380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6400::,2605:6400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6480::,2605:6480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6500::,2605:6500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6580::,2605:6580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6600::,2605:6600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6680::,2605:6680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6700::,2605:6700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6780::,2605:6780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6800::,2605:6800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6880::,2605:6880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:6900::,2605:6900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6a00::,2605:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:6a80::,2605:6a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6b00::,2605:6b00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:6b80::,2605:6b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6c00::,2605:6c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6c80::,2605:6c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6d00::,2605:6d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6d80::,2605:6d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6e00::,2605:6e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6f00::,2605:6f00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:6f80::,2605:6f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7000::,2605:7000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7080::,2605:7080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7100::,2605:7100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7180::,2605:7180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7200::,2605:7200:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:7280::,2605:7280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7300::,2605:7301:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7380::,2605:7380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7400::,2605:7400:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:7480::,2605:7480:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:7500::,2605:7500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7580::,2605:7580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7600::,2605:7600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7680::,2605:7680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7700::,2605:7700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7780::,2605:7780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7880::,2605:7880:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7900::,2605:7900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7980::,2605:7980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7a00::,2605:7a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7b00::,2605:7b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7b80::,2605:7b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7c00::,2605:7c00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:7c80::,2605:7c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7d00::,2605:7d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7d80::,2605:7d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7e00::,2605:7e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:7e80::,2605:7e80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:7f80::,2605:7f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8000::,2605:8000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8080::,2605:8080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8100::,2605:8100:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:8200::,2605:8200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8280::,2605:8280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8300::,2605:8300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8380::,2605:8380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8400::,2605:8400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8480::,2605:8480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8500::,2605:8500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8580::,2605:8580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8600::,2605:8600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8680::,2605:868f:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8700::,2605:8700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8780::,2605:8780:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:8800::,2605:8800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8880::,2605:8880:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8900::,2605:8900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8980::,2605:8980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8a00::,2605:8a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8a80::,2605:8a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8b00::,2605:8b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8b80::,2605:8b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8c00::,2605:8c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8c80::,2605:8c80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:8d00::,2605:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8d80::,2605:8d80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:8e00::,2605:8e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8f00::,2605:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:8f80::,2605:8f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9000::,2605:9000:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:9080::,2605:9080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9100::,2605:9100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9180::,2605:9180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9200::,2605:9200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9280::,2605:9280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9300::,2605:9300:2:32::9,CA +2605:9300:2:32::a,2605:9300:2:32::a,US +2605:9300:2:32::b,2605:9300:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:9380::,2605:9380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9400::,2605:9400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9480::,2605:9480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9500::,2605:9500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9580::,2605:9580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9600::,2605:9600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9680::,2605:9680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:9700::,2605:9700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9780::,2605:9780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9800::,2605:9800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9880::,2605:9880:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9900::,2605:9900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9980::,2605:9980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9a00::,2605:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9a80::,2605:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9b00::,2605:9b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9b80::,2605:9b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9c00::,2605:9c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9c80::,2605:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9d00::,2605:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9d80::,2605:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9e00::,2605:9e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9e80::,2605:9e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9f00::,2605:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9f80::,2605:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a000::,2605:a000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a080::,2605:a080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a100::,2605:a100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a180::,2605:a180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a200::,2605:a200:ffff:ffff:ffff:ffff:ffff:ffff,JM +2605:a280::,2605:a280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a300::,2605:a300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a380::,2605:a380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a400::,2605:a40f:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a480::,2605:a480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a500::,2605:a500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a580::,2605:a580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a600::,2605:a601:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a680::,2605:a680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:a700::,2605:a700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a780::,2605:a780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a800::,2605:a800:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:a880::,2605:a880:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a900::,2605:a900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a980::,2605:a980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:aa00::,2605:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:aa80::,2605:aa80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ab00::,2605:ab00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:ab80::,2605:ab80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ac00::,2605:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:ac80::,2605:ac80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ad00::,2605:ad00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ad80::,2605:ad80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ae00::,2605:ae00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ae80::,2605:ae80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:af00::,2605:af00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:af80::,2605:af80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b000::,2605:b000:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:b080::,2605:b080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b100::,2605:b100:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:b180::,2605:b180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b200::,2605:b200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b280::,2605:b280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b380::,2605:b380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b400::,2605:b400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b480::,2605:b480:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:b500::,2605:b500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b580::,2605:b580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b600::,2605:b600:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:b680::,2605:b680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b700::,2605:b700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b780::,2605:b780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b800::,2605:b800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b880::,2605:b880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:b900::,2605:b900:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:b980::,2605:b980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ba00::,2605:ba00:ffff:ffff:ffff:ffff:ffff:ffff,PR +2605:ba80::,2605:ba80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:bb00::,2605:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:bb80::,2605:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:bc00::,2605:bc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:bc80::,2605:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:bd00::,2605:bd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:bd80::,2605:bd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:be00::,2605:be00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:be80::,2605:be80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:bf00::,2605:bf00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:bf80::,2605:bf80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c000::,2605:c000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c080::,2605:c080:ffff:ffff:ffff:ffff:ffff:ffff,GD +2605:c100::,2605:c100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c180::,2605:c180:fff:ffff:ffff:ffff:ffff:ffff,US +2605:c200::,2605:c200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c280::,2605:c280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c300::,2605:c300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c380::,2605:c380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c400::,2605:c400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c480::,2605:c480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c500::,2605:c500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:c580::,2605:c580:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:c600::,2605:c600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c680::,2605:c680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c700::,2605:c700:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:c780::,2605:c780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c800::,2605:c800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c880::,2605:c880:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c900::,2605:c900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ca00::,2605:ca00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ca80::,2605:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:cb00::,2605:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:cb80::,2605:cb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:cc00::,2605:cc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:cc80::,2605:cc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:cd00::,2605:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:cd80::,2605:cd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ce00::,2605:ce00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ce80::,2605:ce80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:cf00::,2605:cf00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:cf80::,2605:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:d000::,2605:d000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d080::,2605:d080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d100::,2605:d100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d180::,2605:d180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d280::,2605:d280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d300::,2605:d300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d380::,2605:d380:fff:ffff:ffff:ffff:ffff:ffff,US +2605:d480::,2605:d480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d500::,2605:d500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:d580::,2605:d580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d600::,2605:d600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d680::,2605:d680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d700::,2605:d700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d780::,2605:d780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d800::,2605:d800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d880::,2605:d880:ffff:ffff:ffff:ffff:ffff:ffff,DM +2605:d900::,2605:d900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d980::,2605:d980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:da00::,2605:da00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:da80::,2605:da80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:db00::,2605:db00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:db80::,2605:db80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:dc00::,2605:dc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:dc80::,2605:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:dd00::,2605:dd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:dd80::,2605:dd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:de00::,2605:de00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:de80::,2605:de80:ffff:ffff:ffff:ffff:ffff:ffff,VI +2605:df00::,2605:df00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:df80::,2605:df80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e000::,2605:e000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e100::,2605:e100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e180::,2605:e180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e200::,2605:e200:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:e300::,2605:e300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e380::,2605:e380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e400::,2605:e400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e480::,2605:e480:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e500::,2605:e500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e580::,2605:e580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e600::,2605:e600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e680::,2605:e680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:e700::,2605:e700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e780::,2605:e780:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e900::,2605:e900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ea00::,2605:ea00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ea80::,2605:ea80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:eb00::,2605:eb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:eb80::,2605:eb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ec00::,2605:ec00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ec80::,2605:ec80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ed00::,2605:ed00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ed80::,2605:ed80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ee00::,2605:ee00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ee80::,2605:ee80:fff:ffff:ffff:ffff:ffff:ffff,US +2605:ef00::,2605:ef00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ef80::,2605:ef80:13f:ffff:ffff:ffff:ffff:ffff,US +2605:ef80:140::,2605:ef80:147:ffff:ffff:ffff:ffff:ffff,CA +2605:ef80:148::,2605:ef80:14f:ffff:ffff:ffff:ffff:ffff,MX +2605:ef80:150::,2605:ef80:157:ffff:ffff:ffff:ffff:ffff,PR +2605:ef80:158::,2605:ef80:15f:ffff:ffff:ffff:ffff:ffff,VI +2605:ef80:160::,2605:ef80:167:ffff:ffff:ffff:ffff:ffff,UM +2605:ef80:168::,2605:ef80:2ff:ffff:ffff:ffff:ffff:ffff,US +2605:ef80:300::,2605:ef80:31f:ffff:ffff:ffff:ffff:ffff,CA +2605:ef80:320::,2605:ef80:33f:ffff:ffff:ffff:ffff:ffff,MX +2605:ef80:340::,2605:ef80:35f:ffff:ffff:ffff:ffff:ffff,PR +2605:ef80:360::,2605:ef80:37f:ffff:ffff:ffff:ffff:ffff,VI +2605:ef80:380::,2605:ef80:39f:ffff:ffff:ffff:ffff:ffff,UM +2605:ef80:3a0::,2605:ef80:5ff:ffff:ffff:ffff:ffff:ffff,US +2605:ef80:600::,2605:ef80:61f:ffff:ffff:ffff:ffff:ffff,CA +2605:ef80:620::,2605:ef80:63f:ffff:ffff:ffff:ffff:ffff,MX +2605:ef80:640::,2605:ef80:65f:ffff:ffff:ffff:ffff:ffff,PR +2605:ef80:660::,2605:ef80:67f:ffff:ffff:ffff:ffff:ffff,VI +2605:ef80:680::,2605:ef80:69f:ffff:ffff:ffff:ffff:ffff,UM +2605:ef80:6a0::,2605:ef80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f000::,2605:f000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f080::,2605:f080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f100::,2605:f100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f180::,2605:f180:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f200::,2605:f200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f280::,2605:f280:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f300::,2605:f300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f380::,2605:f380:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f400::,2605:f400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f480::,2605:f481:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f500::,2605:f500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f580::,2605:f580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f600::,2605:f600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f680::,2605:f680:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f700::,2605:f700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f780::,2605:f780:fff:ffff:ffff:ffff:ffff:ffff,US +2605:f800::,2605:f800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f880::,2605:f880:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f900::,2605:f900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:f980::,2605:f980:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:fa00::,2605:fa00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:fa80::,2605:fa80:fff:ffff:ffff:ffff:ffff:ffff,US +2605:fb00::,2605:fb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:fb80::,2605:fb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:fc80::,2605:fc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:fd00::,2605:fd00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:fd80::,2605:fd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:fe00::,2605:fe00:fff:ffff:ffff:ffff:ffff:ffff,US +2605:fe80::,2605:fe80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ff00::,2605:ff00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ff80::,2605:ff80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:80::,2606:80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:100::,2606:100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:180::,2606:180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:200::,2606:200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:280::,2606:280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:300::,2606:300:107:ffff:ffff:ffff:ffff:ffff,US +2606:300:108::,2606:300:108:7fff:ffff:ffff:ffff:ffff,PR +2606:300:108:8000::,2606:300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:380::,2606:380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:400::,2606:400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:480::,2606:480:ffff:ffff:ffff:ffff:ffff:ffff,BM +2606:500::,2606:500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:580::,2606:580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:600::,2606:600:ffff:ffff:ffff:ffff:ffff:ffff,KY +2606:680::,2606:680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:700::,2606:700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:780::,2606:780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:800::,2606:800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:880::,2606:880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:900::,2606:900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:980::,2606:980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a00::,2606:a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a80::,2606:a80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:b00::,2606:b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b80::,2606:b80:ffff:ffff:ffff:ffff:ffff:ffff,BM +2606:c00::,2606:c00:4:ffff:ffff:ffff:ffff:ffff,US +2606:c00:5::,2606:c00:5:7fff:ffff:ffff:ffff:ffff,CN +2606:c00:5:8000::,2606:c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d00::,2606:d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d80::,2606:d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e00::,2606:e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e80::,2606:e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f00::,2606:f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f80::,2606:f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1000::,2606:1000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1080::,2606:1080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1100::,2606:1100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1180::,2606:1180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1200::,2606:1200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1280::,2606:1280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1300::,2606:1300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1380::,2606:1380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1400::,2606:1400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1500::,2606:1500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1580::,2606:1580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1600::,2606:1600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1680::,2606:1680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1700::,2606:1700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1780::,2606:1780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1800::,2606:1800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1880::,2606:1880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1900::,2606:1900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1980::,2606:1980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1a00::,2606:1a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1a80::,2606:1a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1b00::,2606:1b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1b80::,2606:1b80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:1c00::,2606:1c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1c80::,2606:1c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1d00::,2606:1d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1e00::,2606:1e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1f00::,2606:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:1f80::,2606:1f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2000::,2606:2000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2080::,2606:2080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2100::,2606:2100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2180::,2606:2180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2200::,2606:2200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2280::,2606:2280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2300::,2606:2300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2400::,2606:2400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2480::,2606:2480:ffff:ffff:ffff:ffff:ffff:ffff,GP +2606:2500::,2606:2500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2580::,2606:2580:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:2600::,2606:2600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2680::,2606:2680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2700::,2606:2700:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:2780::,2606:2780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2800::,2606:2800:420a:ffff:ffff:ffff:ffff:ffff,US +2606:2800:420b::,2606:2800:420b:ffff:ffff:ffff:ffff:ffff,BR +2606:2800:420c::,2606:2800:420c:ffff:ffff:ffff:ffff:ffff,US +2606:2800:420d::,2606:2800:420d:ffff:ffff:ffff:ffff:ffff,EC +2606:2800:420e::,2606:2800:5000:ffff:ffff:ffff:ffff:ffff,US +2606:2800:5001::,2606:2800:5001:ffff:ffff:ffff:ffff:ffff,ES +2606:2800:5002::,2606:2800:500f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:5010::,2606:2800:5011:ffff:ffff:ffff:ffff:ffff,GB +2606:2800:5012::,2606:2800:501f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:5020::,2606:2800:5021:ffff:ffff:ffff:ffff:ffff,DE +2606:2800:5022::,2606:2800:5030:ffff:ffff:ffff:ffff:ffff,US +2606:2800:5031::,2606:2800:5033:ffff:ffff:ffff:ffff:ffff,FR +2606:2800:5034::,2606:2800:503f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:5040::,2606:2800:5041:ffff:ffff:ffff:ffff:ffff,NL +2606:2800:5042::,2606:2800:504f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:5050::,2606:2800:5051:ffff:ffff:ffff:ffff:ffff,AT +2606:2800:5052::,2606:2800:505f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:5060::,2606:2800:5061:ffff:ffff:ffff:ffff:ffff,SE +2606:2800:5062::,2606:2800:506f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:5070::,2606:2800:5071:ffff:ffff:ffff:ffff:ffff,DE +2606:2800:5072::,2606:2800:507f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:5080::,2606:2800:5080:ffff:ffff:ffff:ffff:ffff,IT +2606:2800:5081::,2606:2800:508f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:5090::,2606:2800:5090:ffff:ffff:ffff:ffff:ffff,PL +2606:2800:5091::,2606:2800:5fff:ffff:ffff:ffff:ffff:ffff,US +2606:2800:6000::,2606:2800:6001:ffff:ffff:ffff:ffff:ffff,SG +2606:2800:6002::,2606:2800:600f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:6010::,2606:2800:6011:ffff:ffff:ffff:ffff:ffff,HK +2606:2800:6012::,2606:2800:601f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:6020::,2606:2800:6023:ffff:ffff:ffff:ffff:ffff,JP +2606:2800:6024::,2606:2800:6027:ffff:ffff:ffff:ffff:ffff,US +2606:2800:6028::,2606:2800:6029:ffff:ffff:ffff:ffff:ffff,JP +2606:2800:602a::,2606:2800:602a:ffff:ffff:ffff:ffff:ffff,US +2606:2800:602b::,2606:2800:602b:ffff:ffff:ffff:ffff:ffff,JP +2606:2800:602c::,2606:2800:602f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:6030::,2606:2800:6031:ffff:ffff:ffff:ffff:ffff,AU +2606:2800:6032::,2606:2800:6032:ffff:ffff:ffff:ffff:ffff,US +2606:2800:6033::,2606:2800:6033:ffff:ffff:ffff:ffff:ffff,AU +2606:2800:6034::,2606:2800:603f:ffff:ffff:ffff:ffff:ffff,US +2606:2800:6040::,2606:2800:6041:ffff:ffff:ffff:ffff:ffff,HK +2606:2800:6042::,2606:2800:60ef:ffff:ffff:ffff:ffff:ffff,US +2606:2800:60f0::,2606:2800:60f3:ffff:ffff:ffff:ffff:ffff,IN +2606:2800:60f4::,2606:2800:7000:ffff:ffff:ffff:ffff:ffff,US +2606:2800:7001::,2606:2800:7001:ffff:ffff:ffff:ffff:ffff,CO +2606:2800:7002::,2606:2800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2880::,2606:2880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2900::,2606:2900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2980::,2606:2980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2a00::,2606:2a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2b00::,2606:2b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2b80::,2606:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:2c00::,2606:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2c80::,2606:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2d00::,2606:2d00:fff:ffff:ffff:ffff:ffff:ffff,US +2606:2e00::,2606:2e00:8001:ffff:ffff:ffff:ffff:ffff,US +2606:2e00:8002::,2606:2e00:8002:7fff:ffff:ffff:ffff:ffff,JP +2606:2e00:8002:8000::,2606:2e00:8008:ffff:ffff:ffff:ffff:ffff,US +2606:2e00:8009::,2606:2e00:8009:7fff:ffff:ffff:ffff:ffff,DE +2606:2e00:8009:8000::,2606:2e00:800a:2:ffff:ffff:ffff:ffff,US +2606:2e00:800a:3::,2606:2e00:800a:3:ffff:ffff:ffff:ffff,HK +2606:2e00:800a:4::,2606:2e00:800a:4::41c,US +2606:2e00:800a:4::41d,2606:2e00:800a:4::41e,HK +2606:2e00:800a:4::41f,2606:2e00:800a:4::4f0,US +2606:2e00:800a:4::4f1,2606:2e00:800a:4::4f1,HK +2606:2e00:800a:4::4f2,2606:2e00:800c:ffff:ffff:ffff:ffff:ffff,US +2606:2e00:800d::,2606:2e00:800d:7fff:ffff:ffff:ffff:ffff,AU +2606:2e00:800d:8000::,2606:2e00:800d:ffff:ffff:ffff:ffff:ffff,US +2606:2e00:800e::,2606:2e00:800e:7fff:ffff:ffff:ffff:ffff,MX +2606:2e00:800e:8000::,2606:2e00:800e:ffff:ffff:ffff:ffff:ffff,US +2606:2e00:800f::,2606:2e00:800f:7fff:ffff:ffff:ffff:ffff,IT +2606:2e00:800f:8000::,2606:2e00:8010:ffff:ffff:ffff:ffff:ffff,US +2606:2e00:8011::,2606:2e00:8011:7fff:ffff:ffff:ffff:ffff,FR +2606:2e00:8011:8000::,2606:2e00:8014:ffff:ffff:ffff:ffff:ffff,US +2606:2e00:8015::,2606:2e00:8015:7fff:ffff:ffff:ffff:ffff,AU +2606:2e00:8015:8000::,2606:2e00:8015:ffff:ffff:ffff:ffff:ffff,US +2606:2e00:8016::,2606:2e00:8016:7fff:ffff:ffff:ffff:ffff,JP +2606:2e00:8016:8000::,2606:2e00:8016:ffff:ffff:ffff:ffff:ffff,US +2606:2e00:8017::,2606:2e00:8017::ffff:ffff:ffff:ffff,CA +2606:2e00:8017:1::,2606:2e00:8017:ffff:ffff:ffff:ffff:ffff,US +2606:2e00:8018::,2606:2e00:8018:7fff:ffff:ffff:ffff:ffff,BR +2606:2e00:8018:8000::,2606:2e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2e80::,2606:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2f00::,2606:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:2f80::,2606:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:3000::,2606:3000:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:3080::,2606:3080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3100::,2606:3100:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:3180::,2606:3180:ffff:ffff:ffff:ffff:ffff:ffff,GP +2606:3200::,2606:3200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3280::,2606:3280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3300::,2606:3300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3380::,2606:3380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3400::,2606:3400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3480::,2606:3480:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3500::,2606:3500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3580::,2606:3580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3600::,2606:3600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3680::,2606:3680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3700::,2606:3700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3800::,2606:3800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3880::,2606:3880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3900::,2606:3900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3980::,2606:3980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3a00::,2606:3a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3a80::,2606:3a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3b00::,2606:3b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3b80::,2606:3b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3c00::,2606:3c00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:3c80::,2606:3c80:ffff:ffff:ffff:ffff:ffff:ffff,LC +2606:3d00::,2606:3d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3d80::,2606:3d80:ffff:ffff:ffff:ffff:ffff:ffff,PR +2606:3e00::,2606:3e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3e80::,2606:3e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3f00::,2606:3f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:3f80::,2606:3f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4000::,2606:4000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4080::,2606:4080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4100::,2606:4100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4180::,2606:4180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4200::,2606:4200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4280::,2606:4280:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:4300::,2606:4300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4380::,2606:4380:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:4400::,2606:4400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4480::,2606:4480:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4500::,2606:4500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4580::,2606:4580:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:4600::,2606:4600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4680::,2606:4680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4700::,2606:4700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4780::,2606:4780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4800::,2606:4800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4880::,2606:4880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4900::,2606:4900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4980::,2606:4980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4a00::,2606:4a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4a80::,2606:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4b00::,2606:4b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4b80::,2606:4b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4c00::,2606:4c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4c80::,2606:4c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4d00::,2606:4d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4d80::,2606:4d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4e00::,2606:4e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4e80::,2606:4e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4f00::,2606:4f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:4f80::,2606:4f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5000::,2606:5000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5080::,2606:5080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5100::,2606:5100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5180::,2606:5180:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:5200::,2606:5200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5280::,2606:5280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5300::,2606:5300:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:5380::,2606:5380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5400::,2606:5400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5480::,2606:5480:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:5500::,2606:5500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5580::,2606:5580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5600::,2606:5600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5680::,2606:5680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5700::,2606:5700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5780::,2606:5780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5800::,2606:5800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5880::,2606:5880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5980::,2606:5980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5a00::,2606:5a00:ffff:ffff:ffff:ffff:ffff:ffff,VI +2606:5a80::,2606:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5b00::,2606:5b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5b80::,2606:5b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5c00::,2606:5c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5c80::,2606:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:5d00::,2606:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5d80::,2606:5d80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:5e00::,2606:5e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5e80::,2606:5e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:5f00::,2606:5f00:ffff:ffff:ffff:ffff:ffff:ffff,PR +2606:5f80::,2606:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6000::,2606:6000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6080::,2606:6080:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:6100::,2606:6100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6180::,2606:6180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6200::,2606:6200:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:6280::,2606:6280:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:6300::,2606:6300:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:6380::,2606:6380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6400::,2606:6400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6480::,2606:6480:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:6500::,2606:650f:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6580::,2606:6580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6600::,2606:6600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6680::,2606:6680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6700::,2606:6700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6780::,2606:6780:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:6800::,2606:6800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6880::,2606:6880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:6900::,2606:6900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6980::,2606:6980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6a00::,2606:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:6a80::,2606:6a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6b00::,2606:6b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6b80::,2606:6b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6c00::,2606:6c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6d00::,2606:6d00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:6d80::,2606:6d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6e00::,2606:6e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6e80::,2606:6e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6f00::,2606:6f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6f80::,2606:6f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7000::,2606:7000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7080::,2606:7080:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:7100::,2606:7100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7180::,2606:7180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7200::,2606:7200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7280::,2606:7280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7300::,2606:7300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7380::,2606:7380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7400::,2606:7400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7480::,2606:7480:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:7500::,2606:7500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7580::,2606:7580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7600::,2606:7600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7680::,2606:7680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:7700::,2606:7700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7780::,2606:7780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7800::,2606:7800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7880::,2606:7880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:7900::,2606:7900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7980::,2606:7980:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:7a80::,2606:7a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7b00::,2606:7b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7b80::,2606:7b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7c00::,2606:7c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7c80::,2606:7c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7d00::,2606:7d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7d80::,2606:7d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7e00::,2606:7e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7e80::,2606:7e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7f00::,2606:7f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:7f80::,2606:7f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8000::,2606:8000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8080::,2606:8080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8100::,2606:8100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8180::,2606:8180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8200::,2606:8200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8300::,2606:830f:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:8380::,2606:8380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8400::,2606:8400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8480::,2606:8480:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8500::,2606:8500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8580::,2606:8580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8600::,2606:8600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8680::,2606:8680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8700::,2606:8700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8780::,2606:8780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8800::,2606:8800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8880::,2606:8880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8900::,2606:8900:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:8980::,2606:8980:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:8a00::,2606:8a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8a80::,2606:8a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8b00::,2606:8b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8b80::,2606:8b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8c00::,2606:8c00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:8c80::,2606:8c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8d00::,2606:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8e80::,2606:8e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8f00::,2606:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:8f80::,2606:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:9000::,2606:9000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9080::,2606:9080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9100::,2606:9100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9180::,2606:9180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9200::,2606:9200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9280::,2606:9280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9300::,2606:9300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9380::,2606:9380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9400::,2606:9400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9480::,2606:9480:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9500::,2606:9500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9580::,2606:9580:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:9600::,2606:9600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9680::,2606:9680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9700::,2606:9700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9780::,2606:9780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9800::,2606:9800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9880::,2606:9880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9900::,2606:9900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9980::,2606:9980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9a00::,2606:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9a80::,2606:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9b00::,2606:9b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9b80::,2606:9b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9c00::,2606:9c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9c80::,2606:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9d00::,2606:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9d80::,2606:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9e00::,2606:9e00:ffff:ffff:ffff:ffff:ffff:ffff,BM +2606:9e80::,2606:9e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9f00::,2606:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:9f80::,2606:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a000::,2606:a000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a080::,2606:a080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a100::,2606:a100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a180::,2606:a180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a200::,2606:a200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a280::,2606:a280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a300::,2606:a300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a380::,2606:a380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a400::,2606:a400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a480::,2606:a480:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a500::,2606:a500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a580::,2606:a580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a600::,2606:a600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a680::,2606:a680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a700::,2606:a700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a780::,2606:a780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a800::,2606:a800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a880::,2606:a880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a900::,2606:a900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a980::,2606:a980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:aa00::,2606:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:aa80::,2606:aa80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ab00::,2606:ab00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ab80::,2606:ab80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ac00::,2606:ac00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ac80::,2606:ac80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ad00::,2606:ad00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ad80::,2606:ad80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ae00::,2606:ae00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ae80::,2606:ae80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:af00::,2606:af00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:af80::,2606:af80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b000::,2606:b000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b080::,2606:b080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b100::,2606:b100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b180::,2606:b180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b200::,2606:b200:ffff:ffff:ffff:ffff:ffff:ffff,KY +2606:b280::,2606:b280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b300::,2606:b300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b380::,2606:b380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b400::,2606:b400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b480::,2606:b480:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b500::,2606:b500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b580::,2606:b580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b600::,2606:b600:fff:ffff:ffff:ffff:ffff:ffff,US +2606:b680::,2606:b680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b700::,2606:b700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b780::,2606:b780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b800::,2606:b800:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:b880::,2606:b880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b900::,2606:b900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:b980::,2606:b980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ba00::,2606:ba00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ba80::,2606:ba80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:bb00::,2606:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:bb80::,2606:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:bc00::,2606:bc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:bc80::,2606:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:bd00::,2606:bd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:bd80::,2606:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:be00::,2606:be00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:be80::,2606:be80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:bf00::,2606:bf00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:bf80::,2606:bf80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c000::,2606:c000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c080::,2606:c080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c100::,2606:c100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c180::,2606:c180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c280::,2606:c280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c300::,2606:c300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c380::,2606:c380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c480::,2606:c480:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c500::,2606:c500:ffff:ffff:ffff:ffff:ffff:ffff,JM +2606:c580::,2606:c580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c680::,2606:c680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c700::,2606:c700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c780::,2606:c780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c800::,2606:c800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c880::,2606:c880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:c900::,2606:c900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:c980::,2606:c980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ca00::,2606:ca00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:ca80::,2606:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:cb00::,2606:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:cb80::,2606:cb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:cc00::,2606:cc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:cc80::,2606:cc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:cd00::,2606:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:cd80::,2606:cd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ce00::,2606:ce00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ce80::,2606:ce80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:cf00::,2606:cf00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:cf80::,2606:cf80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d000::,2606:d000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d080::,2606:d080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d100::,2606:d101:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d180::,2606:d180:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:d200::,2606:d200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d280::,2606:d280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d300::,2606:d300:fff:ffff:ffff:ffff:ffff:ffff,US +2606:d380::,2606:d380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d400::,2606:d400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d480::,2606:d480:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d500::,2606:d500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d580::,2606:d580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d600::,2606:d600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d680::,2606:d680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:d700::,2606:d700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d780::,2606:d780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d800::,2606:d800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d880::,2606:d880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d900::,2606:d900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d980::,2606:d980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:da00::,2606:da00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:da80::,2606:da80:fff:ffff:ffff:ffff:ffff:ffff,US +2606:db00::,2606:db00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:db80::,2606:db80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:dc00::,2606:dc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:dc80::,2606:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:dd00::,2606:dd00:fff:ffff:ffff:ffff:ffff:ffff,US +2606:dd80::,2606:dd80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:de00::,2606:de00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:de80::,2606:de80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:df00::,2606:df00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:df80::,2606:df80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e000::,2606:e000:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:e080::,2606:e080:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e100::,2606:e100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e180::,2606:e180:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e200::,2606:e200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e280::,2606:e280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e300::,2606:e300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e380::,2606:e380:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:e400::,2606:e400:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e480::,2606:e480:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e500::,2606:e500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e580::,2606:e580:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e600::,2606:e600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e700::,2606:e700:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e780::,2606:e780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e800::,2606:e800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e880::,2606:e880:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e900::,2606:e900:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:e980::,2606:e980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ea00::,2606:ea00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ea80::,2606:ea80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:eb00::,2606:eb00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:eb80::,2606:eb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ec00::,2606:ec00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ed00::,2606:ed00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ed80::,2606:ed80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ee00::,2606:ee00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:ee80::,2606:ee80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ef00::,2606:ef00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ef80::,2606:ef80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f000::,2606:f000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f080::,2606:f080:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:f100::,2606:f100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f180::,2606:f180:2:ffff:ffff:ffff:ffff:ffff,US +2606:f180:3::,2606:f180:3:ffff:ffff:ffff:ffff:ffff,DE +2606:f180:4::,2606:f18f:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f200::,2606:f200:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f280::,2606:f280:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f300::,2606:f300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f380::,2606:f380:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f400::,2606:f40f:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f480::,2606:f480:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f500::,2606:f500:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f580::,2606:f580:ffff:ffff:ffff:ffff:ffff:ffff,KY +2606:f600::,2606:f600:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f680::,2606:f680:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f700::,2606:f700:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:f780::,2606:f780:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f800::,2606:f800:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:f880::,2606:f880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:f900::,2606:f900:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:f980::,2606:f980:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:fa00::,2606:fa00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2606:fa80::,2606:fa80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:fb80::,2606:fb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:fc00::,2606:fc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:fc80::,2606:fc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:fd00::,2606:fd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:fd80::,2606:fd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:fe00::,2606:fe00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:fe80::,2606:fe80:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ff00::,2606:ff00:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:ff80::,2606:ff80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607::,2607::ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:80::,2607:80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:90:44::,2607:90:44:7fff:ffff:ffff:ffff:ffff,US +2607:100::,2607:100:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:180::,2607:180:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:200::,2607:200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:280::,2607:280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:300::,2607:300:ffff:ffff:ffff:ffff:ffff:ffff,BS +2607:380::,2607:380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:400::,2607:400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:480::,2607:480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:500::,2607:500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:580::,2607:580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:600::,2607:600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:680::,2607:680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:700::,2607:700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:780::,2607:780:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:800::,2607:800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:880::,2607:880:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:900::,2607:900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:980::,2607:980:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a00::,2607:a00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:a80::,2607:a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b00::,2607:b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b80::,2607:b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c00::,2607:c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c80::,2607:c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d00::,2607:d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d80::,2607:d80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:e00::,2607:e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e80::,2607:e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f00::,2607:f00:ffff:ffff:ffff:ffff:ffff:ffff,PR +2607:f80::,2607:f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1000::,2607:1000:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1080::,2607:1080:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:1100::,2607:1100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1180::,2607:1180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1200::,2607:1200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1280::,2607:1280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1300::,2607:1300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1380::,2607:1380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1400::,2607:1400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1480::,2607:1480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1500::,2607:1500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1580::,2607:1580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1600::,2607:1600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1680::,2607:1680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1700::,2607:1700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1780::,2607:1780:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1800::,2607:1800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1880::,2607:1880:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1900::,2607:1900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1980::,2607:1980:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1a00::,2607:1a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1a80::,2607:1a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1b00::,2607:1b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1b80::,2607:1b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1c00::,2607:1c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1c80::,2607:1c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1d00::,2607:1d00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:1d80::,2607:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:1e00::,2607:1e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1e80::,2607:1e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1f00::,2607:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:1f80::,2607:1f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2000::,2607:2000:ffff:ffff:ffff:ffff:ffff:ffff,PR +2607:2080::,2607:2080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2100::,2607:2100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2180::,2607:2180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2200::,2607:2200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2280::,2607:2280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2300::,2607:2300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2380::,2607:2380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2400::,2607:2400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2480::,2607:2480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2500::,2607:2500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:2580::,2607:2580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2600::,2607:2600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2680::,2607:2680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2700::,2607:2700:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:2780::,2607:2780:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2800::,2607:2800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2880::,2607:2880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:2900::,2607:2900:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:2980::,2607:2980:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2a00::,2607:2a00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:2a80::,2607:2a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2b00::,2607:2b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2b80::,2607:2b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2c00::,2607:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2c80::,2607:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2d00::,2607:2d00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:2d80::,2607:2d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2e00::,2607:2e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2e80::,2607:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2f00::,2607:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:2f80::,2607:2f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3000::,2607:3000:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3080::,2607:3080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3100::,2607:3100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3180::,2607:3180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3200::,2607:3200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3280::,2607:3280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3300::,2607:3300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3380::,2607:3380:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:3400::,2607:3400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3480::,2607:3480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3500::,2607:3500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3580::,2607:3580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3600::,2607:3600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3680::,2607:3680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3700::,2607:3700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3780::,2607:3780:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3800::,2607:3800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3880::,2607:3880:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3900::,2607:3900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3980::,2607:3980:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3a00::,2607:3a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3a80::,2607:3a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3b00::,2607:3b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3b80::,2607:3b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3c00::,2607:3c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3c80::,2607:3c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3d00::,2607:3d0f:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3d80::,2607:3d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3e00::,2607:3e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3e80::,2607:3e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3f00::,2607:3f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:3f80::,2607:3f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4000::,2607:4000:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4080::,2607:4080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4100::,2607:4100:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:4180::,2607:4180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4200::,2607:4200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4280::,2607:4280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4300::,2607:4300:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:4380::,2607:4380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4400::,2607:4400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4480::,2607:4480:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:4500::,2607:4500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4580::,2607:4580:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:4600::,2607:4600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4680::,2607:4680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4700::,2607:4700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4780::,2607:4780:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4800::,2607:4800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4880::,2607:4880:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4900::,2607:4900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4980::,2607:4980:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:4a00::,2607:4a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4a80::,2607:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4b00::,2607:4b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4b80::,2607:4b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4c00::,2607:4c00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:4d00::,2607:4d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4d80::,2607:4d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4e00::,2607:4e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4e80::,2607:4e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4f00::,2607:4f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:4f80::,2607:4f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5000::,2607:5006:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5080::,2607:5080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5100::,2607:5100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5180::,2607:5180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5200::,2607:5201:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5280::,2607:5280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5300::,2607:5300:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:5380::,2607:5380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5400::,2607:5400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5480::,2607:5480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5500::,2607:5501:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5580::,2607:5580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5600::,2607:5600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5680::,2607:5680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5700::,2607:5700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5780::,2607:5780:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5800::,2607:5800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5880::,2607:5880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:5980::,2607:5980:ffff:ffff:ffff:ffff:ffff:ffff,PR +2607:5a00::,2607:5a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5a80::,2607:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5b00::,2607:5b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5b80::,2607:5b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5c00::,2607:5c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5c80::,2607:5c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5d00::,2607:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5d80::,2607:5d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5e00::,2607:5e00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:5e80::,2607:5e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5f00::,2607:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:5f80::,2607:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6000::,2607:600f:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6100::,2607:6100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6180::,2607:6180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6200::,2607:6200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6280::,2607:6280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6300::,2607:6300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6380::,2607:6380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6400::,2607:6400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6480::,2607:6480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6500::,2607:6500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:6580::,2607:6580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6600::,2607:6600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6680::,2607:6680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:6700::,2607:6700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6780::,2607:6780:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:6800::,2607:6800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6880::,2607:6880:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6900::,2607:6900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6980::,2607:6980:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6a00::,2607:6a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6a80::,2607:6a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6b00::,2607:6b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6b80::,2607:6b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6c00::,2607:6c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6c80::,2607:6c80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:6d00::,2607:6d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6d80::,2607:6d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6e00::,2607:6e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6e80::,2607:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:6f00::,2607:6f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:6f80::,2607:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:7000::,2607:7000:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7080::,2607:7080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7100::,2607:7100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7180::,2607:7180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7200::,2607:7200:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:7280::,2607:7280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7300::,2607:7300:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:7400::,2607:7400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7480::,2607:7480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7500::,2607:7500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7580::,2607:7580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7600::,2607:7600:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:7680::,2607:7680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7700::,2607:7700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7780::,2607:7780:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7800::,2607:7800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7880::,2607:7880:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7900::,2607:7900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7980::,2607:7980:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7a00::,2607:7a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7a80::,2607:7a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7b00::,2607:7b00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:7b80::,2607:7b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7c00::,2607:7c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7c80::,2607:7c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7d00::,2607:7d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7d80::,2607:7d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7e00::,2607:7e00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:7e80::,2607:7e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7f00::,2607:7f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:7f80::,2607:7f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8000::,2607:8000:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8080::,2607:8080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8100::,2607:8100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8180::,2607:8180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8200::,2607:8200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8280::,2607:8280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8300::,2607:8300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8380::,2607:8380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8400::,2607:8400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8480::,2607:8480:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:8500::,2607:8500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8580::,2607:8580:ffff:ffff:ffff:ffff:ffff:ffff,VI +2607:8600::,2607:8600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8680::,2607:8680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8700::,2607:8700:100:ffff:ffff:ffff:ffff:ffff,CA +2607:8700:101::,2607:8700:104:ffff:ffff:ffff:ffff:ffff,US +2607:8700:105::,2607:8700:105:ffff:ffff:ffff:ffff:ffff,NL +2607:8700:106::,2607:8700:109:ffff:ffff:ffff:ffff:ffff,US +2607:8700:10a::,2607:8700:110:7fff:ffff:ffff:ffff:ffff,CA +2607:8700:110:8000::,2607:8700:110:ffff:ffff:ffff:ffff:ffff,US +2607:8700:111::,2607:8700:111:ffff:ffff:ffff:ffff:ffff,CA +2607:8700:112::,2607:8700:112:7fff:ffff:ffff:ffff:ffff,US +2607:8700:112:8000::,2607:8700:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:8780::,2607:8780:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8800::,2607:8800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8880::,2607:8880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:8900::,2607:8900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8980::,2607:8980:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8a00::,2607:8a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8a80::,2607:8a80:ffff:ffff:ffff:ffff:ffff:ffff,PR +2607:8b00::,2607:8b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8b80::,2607:8b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8c00::,2607:8c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8c80::,2607:8c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8d00::,2607:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8d80::,2607:8d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8e00::,2607:8e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8e80::,2607:8e80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:8f00::,2607:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:8f80::,2607:8f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9000::,2607:9000:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9080::,2607:9080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9100::,2607:9100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9180::,2607:9180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9200::,2607:9200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9280::,2607:9280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9380::,2607:9380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9400::,2607:9400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9480::,2607:9480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9500::,2607:9500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:9580::,2607:9580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9600::,2607:9600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9680::,2607:9680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9700::,2607:9700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9800::,2607:9800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9880::,2607:9880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:9980::,2607:9980:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:9a00::,2607:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9a80::,2607:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9b00::,2607:9b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9b80::,2607:9b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9c00::,2607:9c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9c80::,2607:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9d00::,2607:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9d80::,2607:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9e00::,2607:9e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9e80::,2607:9e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9f00::,2607:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:9f80::,2607:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a000::,2607:a000:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:a080::,2607:a080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a100::,2607:a10f:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a180::,2607:a180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a200::,2607:a200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a280::,2607:a280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a300::,2607:a300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a380::,2607:a380:ffff:ffff:ffff:ffff:ffff:ffff,PR +2607:a400::,2607:a400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a480::,2607:a480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a500::,2607:a500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a580::,2607:a580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a600::,2607:a600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a680::,2607:a680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a700::,2607:a700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a780::,2607:a780:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a800::,2607:a800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a880::,2607:a880:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a900::,2607:a900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:a980::,2607:a980:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:aa00::,2607:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:aa80::,2607:aa80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ab00::,2607:ab00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ab80::,2607:ab80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ac00::,2607:ac00:ffff:ffff:ffff:ffff:ffff:ffff,PR +2607:ac80::,2607:ac80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ad00::,2607:ad00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ad80::,2607:ad80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ae00::,2607:ae00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ae80::,2607:ae80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:af00::,2607:af00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:af80::,2607:af80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b000::,2607:b000:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b080::,2607:b080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b100::,2607:b100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b180::,2607:b180:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:b200::,2607:b200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b280::,2607:b280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b300::,2607:b300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b380::,2607:b380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b400::,2607:b400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b480::,2607:b480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b500::,2607:b500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b580::,2607:b580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b600::,2607:b600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b680::,2607:b680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b700::,2607:b700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b800::,2607:b800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b880::,2607:b880:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:b900::,2607:b900:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:b980::,2607:b980:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ba00::,2607:ba00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ba80::,2607:ba80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:bb00::,2607:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:bb80::,2607:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:bc80::,2607:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:bd00::,2607:bd00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:bd80::,2607:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:be00::,2607:be00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2607:be80::,2607:be80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:bf00::,2607:bf00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:bf80::,2607:bf80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:c000::,2607:c000:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:c080::,2607:c080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c100::,2607:c100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c180::,2607:c180:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:c200::,2607:c200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c280::,2607:c280:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:c300::,2607:c300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c380::,2607:c380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c400::,2607:c400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c480::,2607:c480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c500::,2607:c500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c580::,2607:c580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c600::,2607:c600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c680::,2607:c680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c700::,2607:c700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c780::,2607:c780:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c800::,2607:c800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c880::,2607:c880:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:c980::,2607:c980:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ca00::,2607:ca00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ca80::,2607:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:cb00::,2607:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:cb80::,2607:cb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:cc00::,2607:cc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:cc80::,2607:cc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:cd00::,2607:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:cd80::,2607:cd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ce00::,2607:ce00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ce80::,2607:ce80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:cf00::,2607:cf03:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:cf80::,2607:cf80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d000::,2607:d000:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d080::,2607:d080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d100::,2607:d100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d180::,2607:d180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d200::,2607:d200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d280::,2607:d280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d300::,2607:d300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d380::,2607:d380:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:d400::,2607:d400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d480::,2607:d480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d500::,2607:d500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:d580::,2607:d580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d600::,2607:d600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d680::,2607:d680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d700::,2607:d700:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:d780::,2607:d780:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d800::,2607:d800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d880::,2607:d880:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:d900::,2607:d900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:d980::,2607:d980:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:da00::,2607:da00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:da80::,2607:da80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:db80::,2607:db80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:dc00::,2607:dc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:dc80::,2607:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:dd00::,2607:dd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:dd80::,2607:dd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:de00::,2607:de00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:de80::,2607:de80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:df00::,2607:df00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:df80::,2607:df80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e000::,2607:e000:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e080::,2607:e080:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:e100::,2607:e100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e180::,2607:e180:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e200::,2607:e200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e280::,2607:e280:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e300::,2607:e300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e400::,2607:e400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e480::,2607:e480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e500::,2607:e500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e580::,2607:e580:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e600::,2607:e600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e680::,2607:e680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e700::,2607:e700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e780::,2607:e780:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e800::,2607:e800:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e880::,2607:e880:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e900::,2607:e900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:e980::,2607:e980:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ea00::,2607:ea00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ea80::,2607:ea80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:eb00::,2607:eb00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:eb80::,2607:eb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ec00::,2607:ec00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ec80::,2607:ec80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ed00::,2607:ed00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ed80::,2607:ed80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ee00::,2607:ee00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ee80::,2607:ee80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ef00::,2607:ef00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ef80::,2607:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f000::,2607:f000:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f008::,2607:f008:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f010::,2607:f010:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f018::,2607:f018:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f020::,2607:f020:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f028::,2607:f028:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f030::,2607:f030:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f038::,2607:f038:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f040::,2607:f040:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f048::,2607:f048:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f050::,2607:f050:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f058::,2607:f058:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f060::,2607:f060:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f068::,2607:f068:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f070::,2607:f070:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f078::,2607:f078:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f080::,2607:f080:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f088::,2607:f088:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f090::,2607:f090:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f098::,2607:f098:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f0a0::,2607:f0a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f0a8::,2607:f0a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f0b0::,2607:f0b0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f0c0::,2607:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f0c8::,2607:f0c8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f0d0::,2607:f0d0:1c00:ffff:ffff:ffff:ffff:ffff,US +2607:f0d0:1c01::,2607:f0d0:1c01:7fff:ffff:ffff:ffff:ffff,MX +2607:f0d0:1c01:8000::,2607:f0d0:3601:3a:ffff:ffff:ffff:ffff,US +2607:f0d0:3601:3b::,2607:f0d0:3601:3b:ffff:ffff:ffff:ffff,CA +2607:f0d0:3601:3c::,2607:f0d1:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f0d8::,2607:f0e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f0e8::,2607:f0e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f0f8::,2607:f0f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f100::,2607:f100:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f108::,2607:f108:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f110::,2607:f110:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f118::,2607:f118:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f128::,2607:f128:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f130::,2607:f130:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f138::,2607:f138:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f140::,2607:f140:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f148::,2607:f148:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f150::,2607:f150:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f158::,2607:f158:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f160::,2607:f160:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f168::,2607:f168:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f170::,2607:f170:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f178::,2607:f178:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f180::,2607:f181:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f188::,2607:f188:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f190::,2607:f190:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f198::,2607:f198:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f1a0::,2607:f1a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f1a8::,2607:f1a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f1b0::,2607:f1b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f1c0::,2607:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f1c8::,2607:f1c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f1d0::,2607:f1d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f1d8::,2607:f1d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f1e0::,2607:f1e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f1e8::,2607:f1e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f1f0::,2607:f1f0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f200::,2607:f200:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f208::,2607:f208:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f210::,2607:f212:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f218::,2607:f218:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f220::,2607:f220:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f228::,2607:f228:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f230::,2607:f230:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f238::,2607:f238:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f240::,2607:f240:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f248::,2607:f248:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f250::,2607:f250:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f258::,2607:f258:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f260::,2607:f260:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f278::,2607:f278:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f280::,2607:f281:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f288::,2607:f288:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f290::,2607:f290:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f298::,2607:f298:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f2a8::,2607:f2a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f2b0::,2607:f2b1:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f2c0::,2607:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f2c8::,2607:f2c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f2d0::,2607:f2d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f2d8::,2607:f2d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f2e0::,2607:f2e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f2e8::,2607:f2e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f2f0::,2607:f2f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f2f8::,2607:f2f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f300::,2607:f300:fff:ffff:ffff:ffff:ffff:ffff,US +2607:f308::,2607:f308:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f310::,2607:f310:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f318::,2607:f318:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f330::,2607:f330:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f338::,2607:f338:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f340::,2607:f340:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f348::,2607:f348:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f350::,2607:f350:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f358::,2607:f358:7:ffff:ffff:ffff:ffff:ffff,US +2607:f358:8::,2607:f358:8:7fff:ffff:ffff:ffff:ffff,CH +2607:f358:8:8000::,2607:f358:1e:ffff:ffff:ffff:ffff:ffff,US +2607:f358:1f::,2607:f358:1f:ffff:ffff:ffff:ffff:ffff,DE +2607:f358:20::,2607:f358:20:467:3b8c:afeb:b1c4:942b,US +2607:f358:20:467:3b8c:afeb:b1c4:942c,2607:f358:20:467:3b8c:afeb:b1c4:942c,PH +2607:f358:20:467:3b8c:afeb:b1c4:942d,2607:f358:20:ffff:ffff:ffff:ffff:ffff,US +2607:f358:21::,2607:f358:21:ffff:ffff:ffff:ffff:ffff,DE +2607:f358:22::,2607:f358:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f360::,2607:f360:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f368::,2607:f368:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f370::,2607:f370:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f378::,2607:f378:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f380::,2607:f380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f388::,2607:f388:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f390::,2607:f390:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f398::,2607:f398:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3a0::,2607:f3a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3b0::,2607:f3b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3b8::,2607:f3b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3c0::,2607:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3c8::,2607:f3c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3d0::,2607:f3d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3d8::,2607:f3d8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f3e0::,2607:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f3f0::,2607:f3f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3f8::,2607:f3f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f400::,2607:f400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f408::,2607:f408:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f418::,2607:f418:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f420::,2607:f420:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f428::,2607:f428:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f430::,2607:f430:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f438::,2607:f438:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f440::,2607:f441:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f450::,2607:f450:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f458::,2607:f458:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f460::,2607:f460:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f468::,2607:f468:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f470::,2607:f470:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f478::,2607:f478:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f480::,2607:f480:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f488::,2607:f488:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f490::,2607:f490:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f498::,2607:f498:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f4a0::,2607:f4a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f4a8::,2607:f4a8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f4b0::,2607:f4b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f4b8::,2607:f4b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f4c0::,2607:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f4c8::,2607:f4c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f4d0::,2607:f4d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f4d8::,2607:f4d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f4e0::,2607:f4e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f4e8::,2607:f4e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f4f0::,2607:f4f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f4f8::,2607:f4f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f500::,2607:f500:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f508::,2607:f508:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f510::,2607:f510:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f518::,2607:f518:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f520::,2607:f520:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f528::,2607:f528:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f530::,2607:f530:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f538::,2607:f538:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f540::,2607:f540:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f548::,2607:f548:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f550::,2607:f550:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f558::,2607:f558:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f560::,2607:f560:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f568::,2607:f568:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f570::,2607:f570:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f578::,2607:f578:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f588::,2607:f588:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f590::,2607:f590:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f598::,2607:f598:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f5a0::,2607:f5a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f5a8::,2607:f5a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f5b0::,2607:f5b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f5c0::,2607:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f5d0::,2607:f5d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f5d8::,2607:f5d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f5e0::,2607:f5e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f5e8::,2607:f5e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f5f0::,2607:f5f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f5f8::,2607:f5f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f600::,2607:f600:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f608::,2607:f608:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f610::,2607:f610:fff:ffff:ffff:ffff:ffff:ffff,US +2607:f618::,2607:f618:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f620::,2607:f620:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f628::,2607:f628:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f630::,2607:f630:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f638::,2607:f638:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f640::,2607:f640:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f650::,2607:f650:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f660::,2607:f660:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f668::,2607:f668:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f670::,2607:f670:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f678::,2607:f678:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f680::,2607:f680:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f688::,2607:f688:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f690::,2607:f690:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f698::,2607:f699:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f6a0::,2607:f6a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f6a8::,2607:f6a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f6b0::,2607:f6b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f6b8::,2607:f6b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f6c0::,2607:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f6c8::,2607:f6c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f6d0::,2607:f6d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f6d8::,2607:f6d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f6e0::,2607:f6e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f6e8::,2607:f6e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f6f0::,2607:f6f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f6f8::,2607:f6f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f700::,2607:f700:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f708::,2607:f708:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f710::,2607:f710:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f718::,2607:f718:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f720::,2607:f720:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f728::,2607:f728:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f738::,2607:f738:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f740::,2607:f740:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f748::,2607:f748:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f750::,2607:f750:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f758::,2607:f758:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f760::,2607:f760:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f768::,2607:f768:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f770::,2607:f770:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f778::,2607:f778:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f788::,2607:f788:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f790::,2607:f790:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f798::,2607:f798:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f7a0::,2607:f7a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f7a8::,2607:f7a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f7b0::,2607:f7b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f7b8::,2607:f7b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f7c0::,2607:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f7c8::,2607:f7c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f7d0::,2607:f7d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f7d8::,2607:f7d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f7e0::,2607:f7e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f7e8::,2607:f7e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f7f0::,2607:f7f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f7f8::,2607:f7f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f800::,2607:f800:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f808::,2607:f808:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f810::,2607:f810:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f818::,2607:f818:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f820::,2607:f820:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f828::,2607:f828:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f830::,2607:f830:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f838::,2607:f838:ffff:ffff:ffff:ffff:ffff:ffff,VI +2607:f848::,2607:f848:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f858::,2607:f858:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f860::,2607:f860:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f868::,2607:f868:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f870::,2607:f870:ffff:ffff:ffff:ffff:ffff:ffff,PR +2607:f880::,2607:f880:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f888::,2607:f888:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f890::,2607:f890:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f898::,2607:f898:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f8a8::,2607:f8a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f8b0::,2607:f8b0:400c:c08::242,US +2607:f8b0:400c:c08::243,2607:f8b0:400c:c08::243,DO +2607:f8b0:400c:c08::244,2607:f8b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f8b8::,2607:f8b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f8c0::,2607:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f8c8::,2607:f8c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f8d0::,2607:f8d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f8d8::,2607:f8d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f8e0::,2607:f8e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f8e8::,2607:f8e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f8f0::,2607:f8f0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f8f8::,2607:f8f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f900::,2607:f900:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f908::,2607:f908:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f910::,2607:f910:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f920::,2607:f920:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f928::,2607:f928:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f930::,2607:f930:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f938::,2607:f938:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f940::,2607:f940:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f948::,2607:f948:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f950::,2607:f950:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f960::,2607:f960:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f968::,2607:f968:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f978::,2607:f978:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f980::,2607:f980:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f990::,2607:f990:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f998::,2607:f998:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f9a0::,2607:f9a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f9a8::,2607:f9a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f9b0::,2607:f9b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f9b8::,2607:f9b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f9c0::,2607:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f9c8::,2607:f9c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f9d0::,2607:f9d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f9d8::,2607:f9d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f9e0::,2607:f9e0:fff:ffff:ffff:ffff:ffff:ffff,US +2607:f9f0::,2607:f9f1:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa00::,2607:fa00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa08::,2607:fa08:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa10::,2607:fa10:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa18::,2607:fa18:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa20::,2607:fa20:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa28::,2607:fa28:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa38::,2607:fa38:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa40::,2607:fa40:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa48::,2607:fa4f:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fa58::,2607:fa58:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa60::,2607:fa60:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa68::,2607:fa68:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa70::,2607:fa70:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa78::,2607:fa78:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa88::,2607:fa88:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa90::,2607:fa90:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fa98::,2607:fa98:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:faa0::,2607:faa0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:faa8::,2607:faa8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fab0::,2607:fab0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fab8::,2607:fab8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fac0::,2607:fac0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fac8::,2607:fac8:fff:ffff:ffff:ffff:ffff:ffff,US +2607:fad0::,2607:fad0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fad8::,2607:fad8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fae0::,2607:fae0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fae8::,2607:fae8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:faf0::,2607:faf0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:faf8::,2607:faf8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb00::,2607:fb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb08::,2607:fb08:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb10::,2607:fb10:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb18::,2607:fb18:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb20::,2607:fb20:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb28::,2607:fb28:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb30::,2607:fb30:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb38::,2607:fb38:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb40::,2607:fb40:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb48::,2607:fb48:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb50::,2607:fb50:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb58::,2607:fb58:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb60::,2607:fb60:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb70::,2607:fb70:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb78::,2607:fb78:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb80::,2607:fb80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb88::,2607:fb88:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb90::,2607:fb90:c29:7fff:ffff:ffff:ffff:ffff,US +2607:fb90:c29:8000::,2607:fb90:c29:8fff:ffff:ffff:ffff:ffff,PR +2607:fb90:c29:9000::,2607:fb90:1b06:3fff:ffff:ffff:ffff:ffff,US +2607:fb90:1b06:4000::,2607:fb90:1b06:5fff:ffff:ffff:ffff:ffff,PR +2607:fb90:1b06:6000::,2607:fb90:1bc5:3fff:ffff:ffff:ffff:ffff,US +2607:fb90:1bc5:4000::,2607:fb90:1bc5:4fff:ffff:ffff:ffff:ffff,PR +2607:fb90:1bc5:5000::,2607:fb90:75ff:ffff:ffff:ffff:ffff:ffff,US +2607:fb90:7600::,2607:fb90:76ff:ffff:ffff:ffff:ffff:ffff,PR +2607:fb90:7700::,2607:fb90:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fb98::,2607:fb98:1b:ffff:ffff:ffff:ffff:ffff,US +2607:fb98:1c::,2607:fb98:1c:ffff:ffff:ffff:ffff:ffff,CA +2607:fb98:1d::,2607:fb98:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fba0::,2607:fba0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fba8::,2607:fba8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fbb0::,2607:fbb0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fbb8::,2607:fbb8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fbc0::,2607:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fbd0::,2607:fbd0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fbd8::,2607:fbd8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fbe0::,2607:fbe0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fbe8::,2607:fbe8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fbf0::,2607:fbf0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fbf8::,2607:fbf8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc00::,2607:fc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc08::,2607:fc08:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc10::,2607:fc10:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fc18::,2607:fc18:fff:ffff:ffff:ffff:ffff:ffff,US +2607:fc20::,2607:fc20:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc28::,2607:fc28:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc30::,2607:fc30:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc38::,2607:fc38:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc40::,2607:fc40:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc48::,2607:fc48:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc50::,2607:fc50:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc58::,2607:fc58:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc60::,2607:fc60:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc68::,2607:fc68:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc70::,2607:fc70:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fc78::,2607:fc78:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fc88::,2607:fc88:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc90::,2607:fc90:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc98::,2607:fc98:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fca0::,2607:fca0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fca8::,2607:fca8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcb8::,2607:fcb8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcc0::,2607:fcc0:3fff:ffff:ffff:ffff:ffff:ffff,CA +2607:fcc0:4000::,2607:fcc0:5fff:ffff:ffff:ffff:ffff:ffff,GB +2607:fcc0:6000::,2607:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fcc8::,2607:fcc8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcd0::,2607:fcd0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcd8::,2607:fcd8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fce0::,2607:fce0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fce8::,2607:fce8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcf0::,2607:fcf0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcf8::,2607:fcf8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fd00::,2607:fd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd08::,2607:fd08:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd10::,2607:fd10:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd28::,2607:fd28:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd30::,2607:fd30:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd38::,2607:fd38:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd40::,2607:fd40:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd48::,2607:fd48:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd50::,2607:fd50:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd60::,2607:fd60:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd68::,2607:fd68:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd70::,2607:fd70:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd78::,2607:fd78:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fd80::,2607:fd80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd88::,2607:fd88:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fd90::,2607:fd90:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fda0::,2607:fda0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fda8::,2607:fda8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fdb0::,2607:fdb0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fdb8::,2607:fdb8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fdc0::,2607:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fdc8::,2607:fdc8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fdd0::,2607:fdd0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fdd8::,2607:fdd8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fde0::,2607:fde0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fde8::,2607:fde8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fdf0::,2607:fdf0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fdf8::,2607:fdf8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe00::,2607:fe00:ffff:ffff:ffff:ffff:ffff:ffff,JM +2607:fe08::,2607:fe08:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe10::,2607:fe10:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe18::,2607:fe18:fff:ffff:ffff:ffff:ffff:ffff,US +2607:fe20::,2607:fe20:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe28::,2607:fe28:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe30::,2607:fe30:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe38::,2607:fe38:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe40::,2607:fe40:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe48::,2607:fe48:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe50::,2607:fe50:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe58::,2607:fe58:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe60::,2607:fe60:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe68::,2607:fe68:ffff:ffff:ffff:ffff:ffff:ffff,BS +2607:fe70::,2607:fe70:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe78::,2607:fe78:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe80::,2607:fe80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe88::,2607:fe88:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fe90::,2607:fe90:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fe98::,2607:fe98:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fea0::,2607:fea0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fea8::,2607:fea8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:feb0::,2607:feb0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:feb8::,2607:feb8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fec0::,2607:fec0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fec8::,2607:fec8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fed0::,2607:fed0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fed8::,2607:fed8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fee0::,2607:fee0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fee8::,2607:fee8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fef8::,2607:fef8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff00::,2607:ff00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff08::,2607:ff08:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff10::,2607:ff10:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff18::,2607:ff18:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff28::,2607:ff28:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff30::,2607:ff30:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff38::,2607:ff38:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff40::,2607:ff40:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff48::,2607:ff48:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff50::,2607:ff50:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff58::,2607:ff58:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff60::,2607:ff60:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff68::,2607:ff68:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff70::,2607:ff70:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff78::,2607:ff78:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ff80::,2607:ff80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ff90::,2607:ff90:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ffa0::,2607:ffa0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ffa8::,2607:ffa8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ffb0::,2607:ffb0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ffb8::,2607:ffb8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ffc0::,2607:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ffc8::,2607:ffc8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ffd0::,2607:ffd0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:ffd8::,2607:ffd8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ffe0::,2607:ffe0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:ffe8::,2607:ffe8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fff0::,2607:fff0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fff8::,2607:fff8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2608::,2608:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2608:4000::,2608:43ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2608:8000::,2608:83ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2608:c000::,2608:c3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2609::,2609:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2609:4000::,2609:43ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2609:8000::,2609:83ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2609:a000::,2609:a3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2609:c000::,2609:c3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2609:e000::,2609:e3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260c::,260c:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260c:2000::,260c:23ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260c:4000::,260c:43ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260c:6000::,260c:63ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260c:8000::,260c:83ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260c:a000::,260c:a3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260c:c000::,260c:c3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260c:d000::,260c:d3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260c:e000::,260c:e3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260c:f000::,260c:f3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260f:d000::,260f:d3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +260f:f000::,260f:f3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2610::,2610::ffff:ffff:ffff:ffff:ffff:ffff,CA +2610:8::,2610:8:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:10::,2610:10:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:18::,2610:18:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:20::,2610:20:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:28::,2610:28:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:30::,2610:30:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:38::,2610:38:ffff:ffff:ffff:ffff:ffff:ffff,CA +2610:40::,2610:40:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:48::,2610:48:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:50::,2610:50:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:58::,2610:58:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:60::,2610:60:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:68::,2610:68:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:78::,2610:78:ffff:ffff:ffff:ffff:ffff:ffff,CA +2610:80::,2610:87:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:88::,2610:88:ffff:ffff:ffff:ffff:ffff:ffff,PL +2610:98::,2610:98:ffff:ffff:ffff:ffff:ffff:ffff,CA +2610:a0::,2610:a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:b0::,2610:b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:b8::,2610:b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:c0::,2610:c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:c8::,2610:c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:d0::,2610:d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:e0::,2610:e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:e8::,2610:e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:f0::,2610:f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:100::,2610:100:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:108::,2610:108:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:120::,2610:120:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:128::,2610:128:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:130::,2610:130:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:148::,2610:148:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:150::,2610:150:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:158::,2610:158:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:160::,2610:160:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:168::,2610:168:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:170::,2610:170:ffff:ffff:ffff:ffff:ffff:ffff,CA +2610:178::,2610:178:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:180::,2610:180:ffff:ffff:ffff:ffff:ffff:ffff,BS +2610:188::,2610:188:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:190::,2610:190:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:198::,2610:198:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:1a0::,2610:1a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:1a8::,2610:1a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:1b0::,2610:1b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:1c0::,2610:1c2:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:1c8::,2610:1c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:1d0::,2610:1d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:1d8::,2610:1d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:1e0::,2610:1e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:1e8::,2610:1e8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2610:1f0::,2610:1f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2610:1f8::,2610:1f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2620::,2620::ffff:ffff:ffff:ffff:ffff,US +2620:0:10::,2620::10:ffff:ffff:ffff:ffff:ffff,US +2620:0:20::,2620::20:ffff:ffff:ffff:ffff:ffff,US +2620:0:30::,2620::37:ffff:ffff:ffff:ffff:ffff,US +2620:0:60::,2620::60:ffff:ffff:ffff:ffff:ffff,US +2620:0:70::,2620::70:ffff:ffff:ffff:ffff:ffff,US +2620:0:80::,2620::80:ffff:ffff:ffff:ffff:ffff,US +2620:0:90::,2620::90:ffff:ffff:ffff:ffff:ffff,US +2620:0:a0::,2620::a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:b0::,2620::b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:c0::,2620::c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:f0::,2620::f0:ffff:ffff:ffff:ffff:ffff,CA +2620:0:100::,2620::100:ffff:ffff:ffff:ffff:ffff,US +2620:0:110::,2620::110:ffff:ffff:ffff:ffff:ffff,US +2620:0:120::,2620::120:ffff:ffff:ffff:ffff:ffff,US +2620:0:140::,2620::140:ffff:ffff:ffff:ffff:ffff,US +2620:0:150::,2620::150:ffff:ffff:ffff:ffff:ffff,US +2620:0:160::,2620::160:ffff:ffff:ffff:ffff:ffff,CA +2620:0:170::,2620::170:ffff:ffff:ffff:ffff:ffff,US +2620:0:180::,2620::180:ffff:ffff:ffff:ffff:ffff,US +2620:0:190::,2620::190:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a0::,2620::1a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1b0::,2620::1b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1c0::,2620::1c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1d0::,2620::1d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1f0::,2620::1f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:200::,2620::200:ffff:ffff:ffff:ffff:ffff,US +2620:0:210::,2620::210:ffff:ffff:ffff:ffff:ffff,US +2620:0:220::,2620::220:ffff:ffff:ffff:ffff:ffff,US +2620:0:230::,2620::230:ffff:ffff:ffff:ffff:ffff,CA +2620:0:240::,2620::240:ffff:ffff:ffff:ffff:ffff,US +2620:0:250::,2620::250:ffff:ffff:ffff:ffff:ffff,US +2620:0:260::,2620::260:ffff:ffff:ffff:ffff:ffff,US +2620:0:280::,2620::280:ffff:ffff:ffff:ffff:ffff,US +2620:0:290::,2620::290:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b0::,2620::2b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2c0::,2620::2c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2d0::,2620::2d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2f0::,2620::2f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:300::,2620::300:ffff:ffff:ffff:ffff:ffff,US +2620:0:320::,2620::320:ffff:ffff:ffff:ffff:ffff,US +2620:0:350::,2620::353:ffff:ffff:ffff:ffff:ffff,US +2620:0:360::,2620::361:ffff:ffff:ffff:ffff:ffff,US +2620:0:390::,2620::390:ffff:ffff:ffff:ffff:ffff,US +2620:0:3b0::,2620::3b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:3c0::,2620::3c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:3e0::,2620::3e0:ffff:ffff:ffff:ffff:ffff,US +2620:0:3f0::,2620::3f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:400::,2620::57f:ffff:ffff:ffff:ffff:ffff,US +2620:0:600::,2620::600:ffff:ffff:ffff:ffff:ffff,US +2620:0:610::,2620::61f:ffff:ffff:ffff:ffff:ffff,US +2620:0:630::,2620::630:ffff:ffff:ffff:ffff:ffff,US +2620:0:640::,2620::640:ffff:ffff:ffff:ffff:ffff,US +2620:0:650::,2620::650:ffff:ffff:ffff:ffff:ffff,US +2620:0:660::,2620::660:ffff:ffff:ffff:ffff:ffff,US +2620:0:670::,2620::671:ffff:ffff:ffff:ffff:ffff,US +2620:0:680::,2620::680:ffff:ffff:ffff:ffff:ffff,US +2620:0:690::,2620::6a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:6b0::,2620::6b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:6c0::,2620::6c7:ffff:ffff:ffff:ffff:ffff,US +2620:0:6d0::,2620::6d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:6e0::,2620::6e0:ffff:ffff:ffff:ffff:ffff,US +2620:0:6f0::,2620::6f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:700::,2620::77f:ffff:ffff:ffff:ffff:ffff,US +2620:0:800::,2620::802:ffff:ffff:ffff:ffff:ffff,US +2620:0:810::,2620::810:ffff:ffff:ffff:ffff:ffff,CA +2620:0:840::,2620::840:ffff:ffff:ffff:ffff:ffff,US +2620:0:850::,2620::850:ffff:ffff:ffff:ffff:ffff,US +2620:0:860::,2620::863:ffff:ffff:ffff:ffff:ffff,US +2620:0:870::,2620::877:ffff:ffff:ffff:ffff:ffff,US +2620:0:880::,2620::880:ffff:ffff:ffff:ffff:ffff,US +2620:0:890::,2620::890:ffff:ffff:ffff:ffff:ffff,US +2620:0:8a0::,2620::8a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:8d0::,2620::8d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:8e0::,2620::8e0:ffff:ffff:ffff:ffff:ffff,US +2620:0:8f0::,2620::8f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:910::,2620::910:ffff:ffff:ffff:ffff:ffff,US +2620:0:920::,2620::920:ffff:ffff:ffff:ffff:ffff,US +2620:0:930::,2620::930:ffff:ffff:ffff:ffff:ffff,US +2620:0:940::,2620::940:ffff:ffff:ffff:ffff:ffff,US +2620:0:950::,2620::950:ffff:ffff:ffff:ffff:ffff,US +2620:0:960::,2620::960:ffff:ffff:ffff:ffff:ffff,US +2620:0:970::,2620::970:ffff:ffff:ffff:ffff:ffff,US +2620:0:980::,2620::980:ffff:ffff:ffff:ffff:ffff,US +2620:0:990::,2620::990:ffff:ffff:ffff:ffff:ffff,US +2620:0:9a0::,2620::9a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:9b0::,2620::9b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:9c0::,2620::9c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:9e0::,2620::9e0:ffff:ffff:ffff:ffff:ffff,US +2620:0:9f0::,2620::9f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:a00::,2620::a1f:ffff:ffff:ffff:ffff:ffff,US +2620:0:b00::,2620::b00:ffff:ffff:ffff:ffff:ffff,US +2620:0:b10::,2620::b13:ffff:ffff:ffff:ffff:ffff,US +2620:0:b20::,2620::b20:ffff:ffff:ffff:ffff:ffff,US +2620:0:b30::,2620::b30:ffff:ffff:ffff:ffff:ffff,US +2620:0:b40::,2620::b40:ffff:ffff:ffff:ffff:ffff,US +2620:0:b60::,2620::b61:ffff:ffff:ffff:ffff:ffff,US +2620:0:b80::,2620::b80:ffff:ffff:ffff:ffff:ffff,US +2620:0:b90::,2620::b90:ffff:ffff:ffff:ffff:ffff,US +2620:0:ba0::,2620::ba0:ffff:ffff:ffff:ffff:ffff,US +2620:0:bb0::,2620::bb0:ffff:ffff:ffff:ffff:ffff,US +2620:0:bd0::,2620::bd0:ffff:ffff:ffff:ffff:ffff,CA +2620:0:be0::,2620::be0:ffff:ffff:ffff:ffff:ffff,US +2620:0:bf0::,2620::bf0:ffff:ffff:ffff:ffff:ffff,US +2620:0:c10::,2620::c20:ffff:ffff:ffff:ffff:ffff,US +2620:0:c30::,2620::c30:ffff:ffff:ffff:ffff:ffff,US +2620:0:c40::,2620::c40:ffff:ffff:ffff:ffff:ffff,US +2620:0:c60::,2620::c60:ffff:ffff:ffff:ffff:ffff,US +2620:0:c70::,2620::c70:ffff:ffff:ffff:ffff:ffff,US +2620:0:c80::,2620::c80:ffff:ffff:ffff:ffff:ffff,US +2620:0:c90::,2620::ca0:ffff:ffff:ffff:ffff:ffff,US +2620:0:cb0::,2620::cb0:ffff:ffff:ffff:ffff:ffff,US +2620:0:cc0::,2620::cc3:ffff:ffff:ffff:ffff:ffff,US +2620:0:cc4::,2620::cc4:ffff:ffff:ffff:ffff:ffff,NL +2620:0:cc5::,2620::cc6:ffff:ffff:ffff:ffff:ffff,US +2620:0:cc7::,2620::cc7:ffff:ffff:ffff:ffff:ffff,DE +2620:0:cc8::,2620::cc9:ffff:ffff:ffff:ffff:ffff,US +2620:0:cca::,2620::cca:ffff:ffff:ffff:ffff:ffff,SG +2620:0:ccb::,2620::ccd:ffff:ffff:ffff:ffff:ffff,US +2620:0:cce::,2620::cce:ffff:ffff:ffff:ffff:ffff,CN +2620:0:ccf::,2620::ccf:ffff:ffff:ffff:ffff:ffff,AU +2620:0:ce0::,2620::ce0:ffff:ffff:ffff:ffff:ffff,US +2620:0:cf0::,2620::cf0:ffff:ffff:ffff:ffff:ffff,US +2620:0:d20::,2620::d20:ffff:ffff:ffff:ffff:ffff,US +2620:0:d30::,2620::d30:ffff:ffff:ffff:ffff:ffff,US +2620:0:d50::,2620::d50:ffff:ffff:ffff:ffff:ffff,US +2620:0:d60::,2620::d63:ffff:ffff:ffff:ffff:ffff,US +2620:0:d70::,2620::d77:ffff:ffff:ffff:ffff:ffff,US +2620:0:d80::,2620::d80:ffff:ffff:ffff:ffff:ffff,US +2620:0:d90::,2620::d90:ffff:ffff:ffff:ffff:ffff,US +2620:0:dc0::,2620::dc0:ffff:ffff:ffff:ffff:ffff,US +2620:0:dd0::,2620::dd0:ffff:ffff:ffff:ffff:ffff,US +2620:0:de0::,2620::de0:ffff:ffff:ffff:ffff:ffff,US +2620:0:df0::,2620::df0:ffff:ffff:ffff:ffff:ffff,US +2620:0:e00::,2620::e00:ffff:ffff:ffff:ffff:ffff,US +2620:0:e10::,2620::e10:ffff:ffff:ffff:ffff:ffff,US +2620:0:e20::,2620::e23:ffff:ffff:ffff:ffff:ffff,US +2620:0:e30::,2620::e30:ffff:ffff:ffff:ffff:ffff,US +2620:0:e50::,2620::e60:ffff:ffff:ffff:ffff:ffff,US +2620:0:e80::,2620::e80:ffff:ffff:ffff:ffff:ffff,US +2620:0:e90::,2620::e90:ffff:ffff:ffff:ffff:ffff,US +2620:0:ea0::,2620::eb0:ffff:ffff:ffff:ffff:ffff,US +2620:0:ed0::,2620::ed0:7fff:ffff:ffff:ffff:ffff,CN +2620:0:ed0:8000::,2620::ed0:ffff:ffff:ffff:ffff:ffff,US +2620:0:ee0::,2620::ee0:ffff:ffff:ffff:ffff:ffff,US +2620:0:ef0::,2620::ef0:ffff:ffff:ffff:ffff:ffff,US +2620:0:f00::,2620::f7f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1000::,2620::100b:ffff:ffff:ffff:ffff:ffff,US +2620:0:100c::,2620::100c:ffff:ffff:ffff:ffff:ffff,CA +2620:0:100d::,2620::1010:ffff:ffff:ffff:ffff:ffff,US +2620:0:1011::,2620::1011:ffff:ffff:ffff:ffff:ffff,AR +2620:0:1012::,2620::101f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1020::,2620::1020:7fff:ffff:ffff:ffff:ffff,MX +2620:0:1020:8000::,2620::1024:ffff:ffff:ffff:ffff:ffff,US +2620:0:1025::,2620::1025:ffff:ffff:ffff:ffff:ffff,BR +2620:0:1026::,2620::1034:ffff:ffff:ffff:ffff:ffff,US +2620:0:1035::,2620::1035:ffff:ffff:ffff:ffff:ffff,CA +2620:0:1036::,2620::103f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1040::,2620::1040:7fff:ffff:ffff:ffff:ffff,IE +2620:0:1040:8000::,2620::1041:ffff:ffff:ffff:ffff:ffff,US +2620:0:1042::,2620::1042:ffff:ffff:ffff:ffff:ffff,GB +2620:0:1043::,2620::1043:ffff:ffff:ffff:ffff:ffff,SE +2620:0:1044::,2620::1044:ffff:ffff:ffff:ffff:ffff,US +2620:0:1045::,2620::1045:ffff:ffff:ffff:ffff:ffff,IL +2620:0:1046::,2620::1046:ffff:ffff:ffff:ffff:ffff,US +2620:0:1047::,2620::1047:ffff:ffff:ffff:ffff:ffff,PL +2620:0:1048::,2620::1048:ffff:ffff:ffff:ffff:ffff,IL +2620:0:1049::,2620::1049:ffff:ffff:ffff:ffff:ffff,DE +2620:0:104a::,2620::104a:7fff:ffff:ffff:ffff:ffff,AE +2620:0:104a:8000::,2620::104a:ffff:ffff:ffff:ffff:ffff,US +2620:0:104b::,2620::104b:ffff:ffff:ffff:ffff:ffff,NL +2620:0:104c::,2620::104f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1050::,2620::1050:ffff:ffff:ffff:ffff:ffff,GB +2620:0:1051::,2620::1051:ffff:ffff:ffff:ffff:ffff,ES +2620:0:1052::,2620::1052:7fff:ffff:ffff:ffff:ffff,IE +2620:0:1052:8000::,2620::1052:ffff:ffff:ffff:ffff:ffff,US +2620:0:1053::,2620::1053:ffff:ffff:ffff:ffff:ffff,FR +2620:0:1054::,2620::1054:ffff:ffff:ffff:ffff:ffff,US +2620:0:1055::,2620::1055:ffff:ffff:ffff:ffff:ffff,BE +2620:0:1056::,2620::1058:ffff:ffff:ffff:ffff:ffff,US +2620:0:1059::,2620::1059:7fff:ffff:ffff:ffff:ffff,DK +2620:0:1059:8000::,2620::105e:ffff:ffff:ffff:ffff:ffff,US +2620:0:105f::,2620::105f:ffff:ffff:ffff:ffff:ffff,CH +2620:0:1060::,2620::1060:ffff:ffff:ffff:ffff:ffff,US +2620:0:1061::,2620::1061:7fff:ffff:ffff:ffff:ffff,CH +2620:0:1061:8000::,2620::1068:ffff:ffff:ffff:ffff:ffff,US +2620:0:1069::,2620::1069:7fff:ffff:ffff:ffff:ffff,PL +2620:0:1069:8000::,2620::1069:ffff:ffff:ffff:ffff:ffff,US +2620:0:106a::,2620::106a:7fff:ffff:ffff:ffff:ffff,PT +2620:0:106a:8000::,2620::106a:ffff:ffff:ffff:ffff:ffff,US +2620:0:106b::,2620::106b:ffff:ffff:ffff:ffff:ffff,RU +2620:0:106c::,2620::106e:ffff:ffff:ffff:ffff:ffff,US +2620:0:106f::,2620::106f:ffff:ffff:ffff:ffff:ffff,CZ +2620:0:1070::,2620::1070:7fff:ffff:ffff:ffff:ffff,DE +2620:0:1070:8000::,2620::1072:ffff:ffff:ffff:ffff:ffff,US +2620:0:1073::,2620::1073:ffff:ffff:ffff:ffff:ffff,GB +2620:0:1074::,2620::1074:7fff:ffff:ffff:ffff:ffff,IE +2620:0:1074:8000::,2620::1077:ffff:ffff:ffff:ffff:ffff,US +2620:0:1078::,2620::1078:7fff:ffff:ffff:ffff:ffff,NG +2620:0:1078:8000::,2620::1079:ffff:ffff:ffff:ffff:ffff,US +2620:0:107a::,2620::107a:ffff:ffff:ffff:ffff:ffff,IE +2620:0:107b::,2620::107b:ffff:ffff:ffff:ffff:ffff,US +2620:0:107c::,2620::107c:7fff:ffff:ffff:ffff:ffff,GR +2620:0:107c:8000::,2620::107e:ffff:ffff:ffff:ffff:ffff,US +2620:0:107f::,2620::107f:7fff:ffff:ffff:ffff:ffff,FR +2620:0:107f:8000::,2620::107f:ffff:ffff:ffff:ffff:ffff,BE +2620:0:1080::,2620::10cb:ffff:ffff:ffff:ffff:ffff,US +2620:0:10cc::,2620::10cc:7fff:ffff:ffff:ffff:ffff,CN +2620:0:10cc:8000::,2620::10e7:ffff:ffff:ffff:ffff:ffff,US +2620:0:10e8::,2620::10e8:ffff:ffff:ffff:ffff:ffff,AR +2620:0:10e9::,2620::10ff:ffff:ffff:ffff:ffff:ffff,US +2620:0:1400::,2620::143f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1500::,2620::157f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1600::,2620::167f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1700::,2620::170f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1800::,2620::181f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a00::,2620::1a00:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a10::,2620::1a10:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a20::,2620::1a20:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a30::,2620::1a30:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a40::,2620::1a40:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a50::,2620::1a50:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a70::,2620::1a70:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a80::,2620::1a80:ffff:ffff:ffff:ffff:ffff,US +2620:0:1aa0::,2620::1aa0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1ab0::,2620::1ab0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1ac0::,2620::1ac0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1ad0::,2620::1ad7:ffff:ffff:ffff:ffff:ffff,US +2620:0:1ae0::,2620::1ae0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1af0::,2620::1af0:ffff:ffff:ffff:ffff:ffff,CA +2620:0:1b00::,2620::1b07:ffff:ffff:ffff:ffff:ffff,US +2620:0:1c00::,2620::1cff:ffff:ffff:ffff:ffff:ffff,US +2620:0:2000::,2620::203f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2210::,2620::2210:ffff:ffff:ffff:ffff:ffff,US +2620:0:2220::,2620::222f:ffff:ffff:ffff:ffff:ffff,CA +2620:0:2240::,2620::2240:ffff:ffff:ffff:ffff:ffff,US +2620:0:2250::,2620::2250:ffff:ffff:ffff:ffff:ffff,US +2620:0:2260::,2620::2260:ffff:ffff:ffff:ffff:ffff,US +2620:0:2280::,2620::2280:ffff:ffff:ffff:ffff:ffff,US +2620:0:2290::,2620::2290:ffff:ffff:ffff:ffff:ffff,US +2620:0:22a0::,2620::22a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:22b0::,2620::22b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:22c0::,2620::22c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:22d0::,2620::22d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:22e0::,2620::22e0:ffff:ffff:ffff:ffff:ffff,CA +2620:0:22f0::,2620::22f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2300::,2620::230f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2400::,2620::24ff:ffff:ffff:ffff:ffff:ffff,US +2620:0:2800::,2620::2800:ffff:ffff:ffff:ffff:ffff,US +2620:0:2810::,2620::2810:ffff:ffff:ffff:ffff:ffff,US +2620:0:2820::,2620::2820:ffff:ffff:ffff:ffff:ffff,US +2620:0:2830::,2620::2830:ffff:ffff:ffff:ffff:ffff,US +2620:0:2840::,2620::2840:ffff:ffff:ffff:ffff:ffff,US +2620:0:2850::,2620::2850:ffff:ffff:ffff:ffff:ffff,US +2620:0:2880::,2620::2880:ffff:ffff:ffff:ffff:ffff,US +2620:0:28a0::,2620::28b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:28d0::,2620::28d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:28f0::,2620::28f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2900::,2620::290f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2a00::,2620::2a1f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b00::,2620::2b00:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b10::,2620::2b20:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b30::,2620::2b40:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b50::,2620::2b50:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b60::,2620::2b60:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b70::,2620::2b8f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2bc0::,2620::2bc3:ffff:ffff:ffff:ffff:ffff,US +2620:0:2be0::,2620::2be0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2d00::,2620::2d7f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e00::,2620::2e00:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e10::,2620::2e10:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e30::,2620::2e30:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e40::,2620::2e40:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e50::,2620::2e60:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e70::,2620::2e80:ffff:ffff:ffff:ffff:ffff,US +2620:0:2ea0::,2620::2eb0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2ed0::,2620::2ed0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2ee0::,2620::2ee0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2f00::,2620::2f7f:ffff:ffff:ffff:ffff:ffff,US +2620:0:5000::,2620::5000:ffff:ffff:ffff:ffff:ffff,US +2620:0:5010::,2620::5010:ffff:ffff:ffff:ffff:ffff,US +2620:0:5030::,2620::5030:ffff:ffff:ffff:ffff:ffff,US +2620:0:5040::,2620::5040:ffff:ffff:ffff:ffff:ffff,US +2620:0:5050::,2620::5050:ffff:ffff:ffff:ffff:ffff,US +2620:0:5060::,2620::5060:ffff:ffff:ffff:ffff:ffff,CA +2620:0:5070::,2620::5070:ffff:ffff:ffff:ffff:ffff,US +2620:0:5080::,2620::5080:ffff:ffff:ffff:ffff:ffff,US +2620:0:5090::,2620::5090:ffff:ffff:ffff:ffff:ffff,US +2620:0:50a0::,2620::50a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:50b0::,2620::50b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:50c0::,2620::50c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:50d0::,2620::50d1:ffff:ffff:ffff:ffff:ffff,US +2620:0:50e0::,2620::50e0:ffff:ffff:ffff:ffff:ffff,US +2620:0:50f0::,2620::50f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:5100::,2620::510f:ffff:ffff:ffff:ffff:ffff,US +2620:0:5200::,2620::5200:ffff:ffff:ffff:ffff:ffff,US +2620:0:5300::,2620::530f:ffff:ffff:ffff:ffff:ffff,US +2620:0:7f00::,2620::7f00:ffff:ffff:ffff:ffff:ffff,CA +2620:0:aa00::,2620::aa00:ffff:ffff:ffff:ffff:ffff,US +2620:0:d500::,2620::d500:ffff:ffff:ffff:ffff:ffff,US +2620:1::,2620:1::ffff:ffff:ffff:ffff:ffff,US +2620:1:2000::,2620:1:2000:ffff:ffff:ffff:ffff:ffff,US +2620:1:4000::,2620:1:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1:6000::,2620:1:6000:ffff:ffff:ffff:ffff:ffff,US +2620:1:8000::,2620:1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1:a000::,2620:1:a000:ffff:ffff:ffff:ffff:ffff,US +2620:1:c000::,2620:1:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1:e000::,2620:1:e000:ffff:ffff:ffff:ffff:ffff,US +2620:2::,2620:2::ffff:ffff:ffff:ffff:ffff,US +2620:2:2000::,2620:2:2000:ffff:ffff:ffff:ffff:ffff,US +2620:2:4000::,2620:2:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:2:6000::,2620:2:6000:ffff:ffff:ffff:ffff:ffff,US +2620:2:8000::,2620:2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:2:a000::,2620:2:a000:ffff:ffff:ffff:ffff:ffff,US +2620:2:c000::,2620:2:c000:ffff:ffff:ffff:ffff:ffff,US +2620:2:e000::,2620:2:e000:ffff:ffff:ffff:ffff:ffff,US +2620:3::,2620:3::ffff:ffff:ffff:ffff:ffff,US +2620:3:2000::,2620:3:2000:ffff:ffff:ffff:ffff:ffff,CA +2620:3:4000::,2620:3:4000:ffff:ffff:ffff:ffff:ffff,US +2620:3:6000::,2620:3:6000:ffff:ffff:ffff:ffff:ffff,US +2620:3:8000::,2620:3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3:a000::,2620:3:a000:ffff:ffff:ffff:ffff:ffff,CA +2620:3:c000::,2620:3:c000:ffff:ffff:ffff:ffff:ffff,US +2620:3:e000::,2620:3:e000:ffff:ffff:ffff:ffff:ffff,US +2620:4::,2620:4::ffff:ffff:ffff:ffff:ffff,US +2620:4:2000::,2620:4:2000:ffff:ffff:ffff:ffff:ffff,US +2620:4:4000::,2620:4:4000:ffff:ffff:ffff:ffff:ffff,US +2620:4:6000::,2620:4:6000:ffff:ffff:ffff:ffff:ffff,US +2620:4:8000::,2620:4:8000:ffff:ffff:ffff:ffff:ffff,US +2620:4:a000::,2620:4:a000:ffff:ffff:ffff:ffff:ffff,US +2620:4:c000::,2620:4:c000:ffff:ffff:ffff:ffff:ffff,US +2620:4:e000::,2620:4:e000:ffff:ffff:ffff:ffff:ffff,US +2620:5::,2620:5::ffff:ffff:ffff:ffff:ffff,US +2620:5:2000::,2620:5:2000:ffff:ffff:ffff:ffff:ffff,US +2620:5:4000::,2620:5:400f:ffff:ffff:ffff:ffff:ffff,US +2620:5:8000::,2620:5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5:a000::,2620:5:a000:ffff:ffff:ffff:ffff:ffff,US +2620:5:c000::,2620:5:c000:ffff:ffff:ffff:ffff:ffff,US +2620:5:e000::,2620:5:e000:ffff:ffff:ffff:ffff:ffff,US +2620:6::,2620:6::ffff:ffff:ffff:ffff:ffff,CA +2620:6:2000::,2620:6:200f:ffff:ffff:ffff:ffff:ffff,US +2620:6:4000::,2620:6:4000:ffff:ffff:ffff:ffff:ffff,US +2620:6:6000::,2620:6:6000:ffff:ffff:ffff:ffff:ffff,US +2620:6:8000::,2620:6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:6:a000::,2620:6:a000:ffff:ffff:ffff:ffff:ffff,US +2620:6:c000::,2620:6:c000:ffff:ffff:ffff:ffff:ffff,US +2620:6:e000::,2620:6:e000:ffff:ffff:ffff:ffff:ffff,US +2620:7::,2620:7::ffff:ffff:ffff:ffff:ffff,US +2620:7:2000::,2620:7:2000:ffff:ffff:ffff:ffff:ffff,US +2620:7:4000::,2620:7:4000:ffff:ffff:ffff:ffff:ffff,US +2620:7:6000::,2620:7:6000:ffff:ffff:ffff:ffff:ffff,US +2620:7:8000::,2620:7:8000:ffff:ffff:ffff:ffff:ffff,US +2620:7:a000::,2620:7:a000:ffff:ffff:ffff:ffff:ffff,US +2620:7:c000::,2620:7:c000:ffff:ffff:ffff:ffff:ffff,US +2620:7:e000::,2620:7:e000:ffff:ffff:ffff:ffff:ffff,US +2620:8::,2620:8:7f:ffff:ffff:ffff:ffff:ffff,CA +2620:8:4300::,2620:8:4300:ffff:ffff:ffff:ffff:ffff,US +2620:8:8200::,2620:8:8200:ffff:ffff:ffff:ffff:ffff,US +2620:8:c100::,2620:8:c100:ffff:ffff:ffff:ffff:ffff,US +2620:9::,2620:9::ffff:ffff:ffff:ffff:ffff,US +2620:9:2000::,2620:9:2000:ffff:ffff:ffff:ffff:ffff,US +2620:9:4000::,2620:9:4000:ffff:ffff:ffff:ffff:ffff,US +2620:9:6000::,2620:9:6000:ffff:ffff:ffff:ffff:ffff,US +2620:9:8000::,2620:9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9:a000::,2620:9:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:9:c000::,2620:9:c000:ffff:ffff:ffff:ffff:ffff,US +2620:9:e000::,2620:9:e000:ffff:ffff:ffff:ffff:ffff,US +2620:a::,2620:a:f:ffff:ffff:ffff:ffff:ffff,CA +2620:a:2000::,2620:a:2000:ffff:ffff:ffff:ffff:ffff,US +2620:a:4000::,2620:a:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a:6000::,2620:a:6000:ffff:ffff:ffff:ffff:ffff,US +2620:a:8000::,2620:a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a:a000::,2620:a:a000:ffff:ffff:ffff:ffff:ffff,US +2620:a:c000::,2620:a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a:e000::,2620:a:e000:ffff:ffff:ffff:ffff:ffff,US +2620:b::,2620:b::ffff:ffff:ffff:ffff:ffff,US +2620:b:2000::,2620:b:2000:ffff:ffff:ffff:ffff:ffff,US +2620:b:4000::,2620:b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:b:8000::,2620:b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b:c000::,2620:b:c000:ffff:ffff:ffff:ffff:ffff,US +2620:b:e000::,2620:b:e000:ffff:ffff:ffff:ffff:ffff,CA +2620:c::,2620:c:f:ffff:ffff:ffff:ffff:ffff,US +2620:c:2000::,2620:c:2000:ffff:ffff:ffff:ffff:ffff,US +2620:c:4000::,2620:c:4000:ffff:ffff:ffff:ffff:ffff,US +2620:c:6000::,2620:c:6000:ffff:ffff:ffff:ffff:ffff,CA +2620:c:8000::,2620:c:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c:a000::,2620:c:a000:ffff:ffff:ffff:ffff:ffff,US +2620:c:c000::,2620:c:c000:ffff:ffff:ffff:ffff:ffff,US +2620:c:e000::,2620:c:e000:ffff:ffff:ffff:ffff:ffff,US +2620:d::,2620:d::ffff:ffff:ffff:ffff:ffff,US +2620:d:2000::,2620:d:2000:ffff:ffff:ffff:ffff:ffff,US +2620:d:4000::,2620:d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:d:6000::,2620:d:6000:ffff:ffff:ffff:ffff:ffff,US +2620:d:a000::,2620:d:a000:ffff:ffff:ffff:ffff:ffff,US +2620:d:c000::,2620:d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:d:e000::,2620:d:e000:ffff:ffff:ffff:ffff:ffff,US +2620:e::,2620:e::ffff:ffff:ffff:ffff:ffff,US +2620:e:2000::,2620:e:2000:ffff:ffff:ffff:ffff:ffff,US +2620:e:4000::,2620:e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e:6000::,2620:e:6000:ffff:ffff:ffff:ffff:ffff,US +2620:e:8000::,2620:e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e:a000::,2620:e:a000:ffff:ffff:ffff:ffff:ffff,US +2620:e:c000::,2620:e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:e:e000::,2620:e:e000:ffff:ffff:ffff:ffff:ffff,US +2620:f::,2620:f:f:ffff:ffff:ffff:ffff:ffff,US +2620:f:2000::,2620:f:2000:ffff:ffff:ffff:ffff:ffff,US +2620:f:4000::,2620:f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:f:6000::,2620:f:6000:ffff:ffff:ffff:ffff:ffff,US +2620:f:8000::,2620:f:8000:ffff:ffff:ffff:ffff:ffff,AE +2620:f:a000::,2620:f:a000:ffff:ffff:ffff:ffff:ffff,US +2620:f:c000::,2620:f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:f:e000::,2620:f:e000:ffff:ffff:ffff:ffff:ffff,US +2620:10::,2620:10::ffff:ffff:ffff:ffff:ffff,US +2620:10:2000::,2620:10:2000:ffff:ffff:ffff:ffff:ffff,US +2620:10:4000::,2620:10:4000:ffff:ffff:ffff:ffff:ffff,US +2620:10:6000::,2620:10:6000:ffff:ffff:ffff:ffff:ffff,US +2620:10:8000::,2620:10:800f:ffff:ffff:ffff:ffff:ffff,CA +2620:10:a000::,2620:10:a000:ffff:ffff:ffff:ffff:ffff,US +2620:10:c000::,2620:10:c000:ffff:ffff:ffff:ffff:ffff,US +2620:10:e000::,2620:10:e000:ffff:ffff:ffff:ffff:ffff,US +2620:11::,2620:11:ff:ffff:ffff:ffff:ffff:ffff,US +2620:11:4000::,2620:11:4000:ffff:ffff:ffff:ffff:ffff,US +2620:11:6000::,2620:11:6000:ffff:ffff:ffff:ffff:ffff,US +2620:11:8000::,2620:11:8000:ffff:ffff:ffff:ffff:ffff,US +2620:11:a000::,2620:11:a000:ffff:ffff:ffff:ffff:ffff,US +2620:11:c000::,2620:11:c000:ffff:ffff:ffff:ffff:ffff,US +2620:11:e000::,2620:11:e000:ffff:ffff:ffff:ffff:ffff,US +2620:12::,2620:12::ffff:ffff:ffff:ffff:ffff,US +2620:12:2000::,2620:12:2000:ffff:ffff:ffff:ffff:ffff,US +2620:12:4000::,2620:12:4000:ffff:ffff:ffff:ffff:ffff,US +2620:12:6000::,2620:12:6000:ffff:ffff:ffff:ffff:ffff,US +2620:12:8000::,2620:12:8000:ffff:ffff:ffff:ffff:ffff,US +2620:12:a000::,2620:12:a000:ffff:ffff:ffff:ffff:ffff,US +2620:12:c000::,2620:12:c000:ffff:ffff:ffff:ffff:ffff,US +2620:12:e000::,2620:12:e000:ffff:ffff:ffff:ffff:ffff,US +2620:13::,2620:13::ffff:ffff:ffff:ffff:ffff,CA +2620:13:2000::,2620:13:2000:ffff:ffff:ffff:ffff:ffff,CA +2620:13:4000::,2620:13:4000:ffff:ffff:ffff:ffff:ffff,US +2620:13:6000::,2620:13:6000:ffff:ffff:ffff:ffff:ffff,CA +2620:13:8000::,2620:13:8000:ffff:ffff:ffff:ffff:ffff,US +2620:13:a000::,2620:13:a000:ffff:ffff:ffff:ffff:ffff,US +2620:13:c000::,2620:13:c000:ffff:ffff:ffff:ffff:ffff,US +2620:13:e000::,2620:13:e000:ffff:ffff:ffff:ffff:ffff,US +2620:14::,2620:14::ffff:ffff:ffff:ffff:ffff,US +2620:14:2000::,2620:14:2000:ffff:ffff:ffff:ffff:ffff,CA +2620:14:4000::,2620:14:4000:ffff:ffff:ffff:ffff:ffff,US +2620:14:6000::,2620:14:6000:ffff:ffff:ffff:ffff:ffff,CA +2620:14:8000::,2620:14:8000:ffff:ffff:ffff:ffff:ffff,US +2620:14:a000::,2620:14:a000:ffff:ffff:ffff:ffff:ffff,US +2620:14:c000::,2620:14:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:14:e000::,2620:14:e000:ffff:ffff:ffff:ffff:ffff,US +2620:15::,2620:15::ffff:ffff:ffff:ffff:ffff,US +2620:15:2000::,2620:15:2000:ffff:ffff:ffff:ffff:ffff,US +2620:15:6000::,2620:15:6000:ffff:ffff:ffff:ffff:ffff,CA +2620:15:8000::,2620:15:8000:ffff:ffff:ffff:ffff:ffff,US +2620:15:a000::,2620:15:a000:ffff:ffff:ffff:ffff:ffff,US +2620:15:c000::,2620:15:c000:ffff:ffff:ffff:ffff:ffff,US +2620:15:e000::,2620:15:e000:ffff:ffff:ffff:ffff:ffff,US +2620:16::,2620:16::ffff:ffff:ffff:ffff:ffff,CA +2620:16:2000::,2620:16:2000:ffff:ffff:ffff:ffff:ffff,US +2620:16:4000::,2620:16:4000:ffff:ffff:ffff:ffff:ffff,US +2620:16:6000::,2620:16:6000:ffff:ffff:ffff:ffff:ffff,US +2620:16:8000::,2620:16:8000:ffff:ffff:ffff:ffff:ffff,US +2620:16:a000::,2620:16:a000:ffff:ffff:ffff:ffff:ffff,US +2620:16:c000::,2620:16:c000:ffff:ffff:ffff:ffff:ffff,US +2620:16:e000::,2620:16:e000:ffff:ffff:ffff:ffff:ffff,US +2620:17::,2620:17::ffff:ffff:ffff:ffff:ffff,US +2620:17:2000::,2620:17:2000:ffff:ffff:ffff:ffff:ffff,US +2620:17:4000::,2620:17:4000:ffff:ffff:ffff:ffff:ffff,US +2620:17:6000::,2620:17:6000:ffff:ffff:ffff:ffff:ffff,CA +2620:17:8000::,2620:17:800f:ffff:ffff:ffff:ffff:ffff,US +2620:17:a000::,2620:17:a000:ffff:ffff:ffff:ffff:ffff,US +2620:17:c000::,2620:17:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:17:e000::,2620:17:e000:ffff:ffff:ffff:ffff:ffff,US +2620:18::,2620:18::ffff:ffff:ffff:ffff:ffff,US +2620:18:2000::,2620:18:2000:ffff:ffff:ffff:ffff:ffff,US +2620:18:4000::,2620:18:4000:ffff:ffff:ffff:ffff:ffff,US +2620:18:6000::,2620:18:6000:ffff:ffff:ffff:ffff:ffff,CA +2620:18:8000::,2620:18:8000:ffff:ffff:ffff:ffff:ffff,US +2620:18:a000::,2620:18:a000:ffff:ffff:ffff:ffff:ffff,US +2620:18:c000::,2620:18:c000:ffff:ffff:ffff:ffff:ffff,KN +2620:18:e000::,2620:18:e000:ffff:ffff:ffff:ffff:ffff,US +2620:19::,2620:19::ffff:ffff:ffff:ffff:ffff,US +2620:19:2000::,2620:19:2000:ffff:ffff:ffff:ffff:ffff,CA +2620:19:4000::,2620:19:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:19:6000::,2620:19:6000:ffff:ffff:ffff:ffff:ffff,US +2620:19:8000::,2620:19:8000:ffff:ffff:ffff:ffff:ffff,US +2620:19:a000::,2620:19:a000:ffff:ffff:ffff:ffff:ffff,US +2620:19:e000::,2620:19:e00f:ffff:ffff:ffff:ffff:ffff,CA +2620:1a::,2620:1a::ffff:ffff:ffff:ffff:ffff,US +2620:1a:2000::,2620:1a:200f:ffff:ffff:ffff:ffff:ffff,US +2620:1a:4000::,2620:1a:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1a:6000::,2620:1a:6000:ffff:ffff:ffff:ffff:ffff,CA +2620:1a:8000::,2620:1a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1a:a000::,2620:1a:a000:ffff:ffff:ffff:ffff:ffff,US +2620:1a:c000::,2620:1a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1a:e000::,2620:1a:e000:ffff:ffff:ffff:ffff:ffff,US +2620:1b::,2620:1b:f:ffff:ffff:ffff:ffff:ffff,US +2620:1b:2000::,2620:1b:2000:ffff:ffff:ffff:ffff:ffff,US +2620:1b:4000::,2620:1b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1b:6000::,2620:1b:6000:ffff:ffff:ffff:ffff:ffff,US +2620:1b:8000::,2620:1b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1b:a000::,2620:1b:a000:ffff:ffff:ffff:ffff:ffff,US +2620:1b:c000::,2620:1b:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1b:e000::,2620:1b:e000:ffff:ffff:ffff:ffff:ffff,US +2620:1c::,2620:1c::ffff:ffff:ffff:ffff:ffff,US +2620:1c:2000::,2620:1c:2000:ffff:ffff:ffff:ffff:ffff,US +2620:1c:4000::,2620:1c:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1c:6000::,2620:1c:6000:ffff:ffff:ffff:ffff:ffff,US +2620:1c:8000::,2620:1c:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1c:a000::,2620:1c:a000:ffff:ffff:ffff:ffff:ffff,US +2620:1c:c000::,2620:1c:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1c:e000::,2620:1c:e000:ffff:ffff:ffff:ffff:ffff,US +2620:1d::,2620:1d:f:ffff:ffff:ffff:ffff:ffff,US +2620:1d:2000::,2620:1d:2000:ffff:ffff:ffff:ffff:ffff,US +2620:1d:4000::,2620:1d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1d:6000::,2620:1d:6000:ffff:ffff:ffff:ffff:ffff,US +2620:1d:8000::,2620:1d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1d:c000::,2620:1d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1d:e000::,2620:1d:e000:ffff:ffff:ffff:ffff:ffff,US +2620:1e::,2620:1e::ffff:ffff:ffff:ffff:ffff,US +2620:1e:2000::,2620:1e:2000:ffff:ffff:ffff:ffff:ffff,US +2620:1e:4000::,2620:1e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1e:6000::,2620:1e:6000:ffff:ffff:ffff:ffff:ffff,US +2620:1e:8000::,2620:1e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1e:a000::,2620:1e:a000:ffff:ffff:ffff:ffff:ffff,VG +2620:1e:c000::,2620:1e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1e:e000::,2620:1e:e000:ffff:ffff:ffff:ffff:ffff,US +2620:1f::,2620:1f::ffff:ffff:ffff:ffff:ffff,US +2620:1f:2000::,2620:1f:2000:ffff:ffff:ffff:ffff:ffff,US +2620:1f:4000::,2620:1f:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:1f:6000::,2620:1f:6000:ffff:ffff:ffff:ffff:ffff,US +2620:1f:8000::,2620:1f:800f:ffff:ffff:ffff:ffff:ffff,US +2620:1f:a000::,2620:1f:a000:ffff:ffff:ffff:ffff:ffff,US +2620:1f:c000::,2620:1f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1f:e000::,2620:1f:e000:ffff:ffff:ffff:ffff:ffff,US +2620:20::,2620:20::ffff:ffff:ffff:ffff:ffff,US +2620:20:2000::,2620:20:2000:ffff:ffff:ffff:ffff:ffff,US +2620:20:4000::,2620:20:4000:ffff:ffff:ffff:ffff:ffff,US +2620:20:6000::,2620:20:6000:ffff:ffff:ffff:ffff:ffff,US +2620:20:8000::,2620:20:8000:ffff:ffff:ffff:ffff:ffff,US +2620:20:a000::,2620:20:a000:ffff:ffff:ffff:ffff:ffff,US +2620:20:c000::,2620:20:c000:ffff:ffff:ffff:ffff:ffff,US +2620:20:e000::,2620:20:e000:ffff:ffff:ffff:ffff:ffff,US +2620:21::,2620:21::ffff:ffff:ffff:ffff:ffff,US +2620:21:2000::,2620:21:2000:ffff:ffff:ffff:ffff:ffff,US +2620:21:4000::,2620:21:4000:ffff:ffff:ffff:ffff:ffff,US +2620:21:6000::,2620:21:600f:ffff:ffff:ffff:ffff:ffff,US +2620:21:8000::,2620:21:8000:ffff:ffff:ffff:ffff:ffff,US +2620:21:a000::,2620:21:a000:ffff:ffff:ffff:ffff:ffff,US +2620:21:c000::,2620:21:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:21:e000::,2620:21:e000:ffff:ffff:ffff:ffff:ffff,US +2620:22::,2620:22::ffff:ffff:ffff:ffff:ffff,US +2620:22:2000::,2620:22:2000:ffff:ffff:ffff:ffff:ffff,US +2620:22:4000::,2620:22:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:22:6000::,2620:22:6000:ffff:ffff:ffff:ffff:ffff,US +2620:22:8000::,2620:22:8000:ffff:ffff:ffff:ffff:ffff,US +2620:22:a000::,2620:22:a000:ffff:ffff:ffff:ffff:ffff,US +2620:22:c000::,2620:22:c000:ffff:ffff:ffff:ffff:ffff,US +2620:22:e000::,2620:22:e000:ffff:ffff:ffff:ffff:ffff,US +2620:23::,2620:23::ffff:ffff:ffff:ffff:ffff,US +2620:23:4000::,2620:23:4000:ffff:ffff:ffff:ffff:ffff,US +2620:23:6000::,2620:23:6000:ffff:ffff:ffff:ffff:ffff,US +2620:23:8000::,2620:23:8000:ffff:ffff:ffff:ffff:ffff,US +2620:23:a000::,2620:23:a000:ffff:ffff:ffff:ffff:ffff,US +2620:23:c000::,2620:23:c000:ffff:ffff:ffff:ffff:ffff,US +2620:23:e000::,2620:23:e000:ffff:ffff:ffff:ffff:ffff,US +2620:24::,2620:24:1f:ffff:ffff:ffff:ffff:ffff,US +2620:24:40c0::,2620:24:40c0:ffff:ffff:ffff:ffff:ffff,US +2620:24:8080::,2620:24:8080:ffff:ffff:ffff:ffff:ffff,US +2620:24:c040::,2620:24:c040:ffff:ffff:ffff:ffff:ffff,US +2620:25::,2620:25::ffff:ffff:ffff:ffff:ffff,US +2620:25:2000::,2620:25:2000:ffff:ffff:ffff:ffff:ffff,US +2620:25:4000::,2620:25:4000:ffff:ffff:ffff:ffff:ffff,US +2620:25:6000::,2620:25:6000:ffff:ffff:ffff:ffff:ffff,CA +2620:25:8000::,2620:25:8000:ffff:ffff:ffff:ffff:ffff,US +2620:25:a000::,2620:25:a000:ffff:ffff:ffff:ffff:ffff,US +2620:25:c000::,2620:25:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:26::,2620:26::ffff:ffff:ffff:ffff:ffff,US +2620:26:2000::,2620:26:2000:ffff:ffff:ffff:ffff:ffff,US +2620:26:4000::,2620:26:400f:ffff:ffff:ffff:ffff:ffff,US +2620:26:8000::,2620:26:8000:ffff:ffff:ffff:ffff:ffff,US +2620:26:a000::,2620:26:a000:ffff:ffff:ffff:ffff:ffff,US +2620:26:c000::,2620:26:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:27::,2620:27:f:ffff:ffff:ffff:ffff:ffff,US +2620:27:40c0::,2620:27:40c0:ffff:ffff:ffff:ffff:ffff,CA +2620:27:8080::,2620:27:8080:ffff:ffff:ffff:ffff:ffff,US +2620:27:c040::,2620:27:c040:ffff:ffff:ffff:ffff:ffff,US +2620:28::,2620:28::ffff:ffff:ffff:ffff:ffff,US +2620:28:2000::,2620:28:2000:ffff:ffff:ffff:ffff:ffff,US +2620:28:4000::,2620:28:400f:ffff:ffff:ffff:ffff:ffff,US +2620:28:8000::,2620:28:8000:ffff:ffff:ffff:ffff:ffff,US +2620:28:a000::,2620:28:a000:ffff:ffff:ffff:ffff:ffff,US +2620:28:c000::,2620:28:c000:ffff:ffff:ffff:ffff:ffff,US +2620:28:e000::,2620:28:e000:ffff:ffff:ffff:ffff:ffff,US +2620:29::,2620:29::ffff:ffff:ffff:ffff:ffff,US +2620:29:2000::,2620:29:2000:ffff:ffff:ffff:ffff:ffff,US +2620:29:4000::,2620:29:4000:ffff:ffff:ffff:ffff:ffff,US +2620:29:a000::,2620:29:a000:ffff:ffff:ffff:ffff:ffff,US +2620:29:c000::,2620:29:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:2a::,2620:2a::ffff:ffff:ffff:ffff:ffff,US +2620:2a:2000::,2620:2a:2000:ffff:ffff:ffff:ffff:ffff,US +2620:2a:4000::,2620:2a:400f:ffff:ffff:ffff:ffff:ffff,US +2620:2a:8000::,2620:2a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:2a:a000::,2620:2a:a000:ffff:ffff:ffff:ffff:ffff,US +2620:2a:c000::,2620:2a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:2a:e000::,2620:2a:e000:ffff:ffff:ffff:ffff:ffff,US +2620:2b::,2620:2b::ffff:ffff:ffff:ffff:ffff,US +2620:2b:2000::,2620:2b:2000:ffff:ffff:ffff:ffff:ffff,US +2620:2b:4000::,2620:2b:400f:ffff:ffff:ffff:ffff:ffff,US +2620:2b:8000::,2620:2b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:2b:a000::,2620:2b:a000:ffff:ffff:ffff:ffff:ffff,US +2620:2b:e000::,2620:2b:e000:ffff:ffff:ffff:ffff:ffff,US +2620:2c::,2620:2c:f:ffff:ffff:ffff:ffff:ffff,US +2620:2c:40c0::,2620:2c:40c0:ffff:ffff:ffff:ffff:ffff,CA +2620:2c:8080::,2620:2c:8080:ffff:ffff:ffff:ffff:ffff,US +2620:2c:c040::,2620:2c:c040:ffff:ffff:ffff:ffff:ffff,US +2620:2d::,2620:2d::ffff:ffff:ffff:ffff:ffff,US +2620:2d:2000::,2620:2d:2000:ffff:ffff:ffff:ffff:ffff,CA +2620:2d:4000::,2620:2d:400f:ffff:ffff:ffff:ffff:ffff,US +2620:2d:8000::,2620:2d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:2d:a000::,2620:2d:a000:ffff:ffff:ffff:ffff:ffff,US +2620:2d:c000::,2620:2d:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:2e::,2620:2e:3f:ffff:ffff:ffff:ffff:ffff,US +2620:2e:40c0::,2620:2e:40c0:ffff:ffff:ffff:ffff:ffff,US +2620:2e:c040::,2620:2e:c040:ffff:ffff:ffff:ffff:ffff,US +2620:2f::,2620:2f::ffff:ffff:ffff:ffff:ffff,CA +2620:2f:2000::,2620:2f:2000:ffff:ffff:ffff:ffff:ffff,US +2620:2f:4000::,2620:2f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:2f:6000::,2620:2f:6000:ffff:ffff:ffff:ffff:ffff,US +2620:2f:8000::,2620:2f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:2f:a000::,2620:2f:a000:ffff:ffff:ffff:ffff:ffff,US +2620:2f:c000::,2620:2f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:2f:e000::,2620:2f:e000:ffff:ffff:ffff:ffff:ffff,US +2620:30::,2620:30:f:ffff:ffff:ffff:ffff:ffff,US +2620:30:2000::,2620:30:2000:ffff:ffff:ffff:ffff:ffff,US +2620:30:4000::,2620:30:4000:ffff:ffff:ffff:ffff:ffff,US +2620:30:6000::,2620:30:6000:ffff:ffff:ffff:ffff:ffff,US +2620:30:8000::,2620:30:8000:ffff:ffff:ffff:ffff:ffff,US +2620:30:a000::,2620:30:a000:ffff:ffff:ffff:ffff:ffff,CA +2620:30:c000::,2620:30:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:31::,2620:31::ffff:ffff:ffff:ffff:ffff,US +2620:31:2000::,2620:31:200f:ffff:ffff:ffff:ffff:ffff,US +2620:31:4000::,2620:31:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:31:8000::,2620:31:8000:ffff:ffff:ffff:ffff:ffff,US +2620:31:a000::,2620:31:a000:ffff:ffff:ffff:ffff:ffff,US +2620:31:c000::,2620:31:c000:ffff:ffff:ffff:ffff:ffff,US +2620:31:e000::,2620:31:e000:ffff:ffff:ffff:ffff:ffff,US +2620:32::,2620:32::ffff:ffff:ffff:ffff:ffff,US +2620:32:2000::,2620:32:2000:ffff:ffff:ffff:ffff:ffff,US +2620:32:4000::,2620:32:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:32:6000::,2620:32:6000:ffff:ffff:ffff:ffff:ffff,US +2620:32:8000::,2620:32:8000:ffff:ffff:ffff:ffff:ffff,US +2620:32:a000::,2620:32:a000:ffff:ffff:ffff:ffff:ffff,US +2620:32:c000::,2620:32:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:33::,2620:33::ffff:ffff:ffff:ffff:ffff,US +2620:33:2000::,2620:33:2000:ffff:ffff:ffff:ffff:ffff,US +2620:33:4000::,2620:33:400f:ffff:ffff:ffff:ffff:ffff,US +2620:33:8000::,2620:33:8000:ffff:ffff:ffff:ffff:ffff,US +2620:33:a000::,2620:33:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:33:c000::,2620:33:c000:ffff:ffff:ffff:ffff:ffff,US +2620:33:e000::,2620:33:e000:ffff:ffff:ffff:ffff:ffff,US +2620:34::,2620:34::ffff:ffff:ffff:ffff:ffff,US +2620:34:2000::,2620:34:2000:ffff:ffff:ffff:ffff:ffff,US +2620:34:4000::,2620:34:4000:ffff:ffff:ffff:ffff:ffff,US +2620:34:6000::,2620:34:600f:ffff:ffff:ffff:ffff:ffff,US +2620:34:8000::,2620:34:8000:ffff:ffff:ffff:ffff:ffff,US +2620:34:a000::,2620:34:a000:ffff:ffff:ffff:ffff:ffff,US +2620:34:c000::,2620:34:c000:ffff:ffff:ffff:ffff:ffff,US +2620:34:e000::,2620:34:e000:ffff:ffff:ffff:ffff:ffff,US +2620:35:2000::,2620:35:2000:ffff:ffff:ffff:ffff:ffff,US +2620:35:4000::,2620:35:400f:ffff:ffff:ffff:ffff:ffff,CA +2620:35:8000::,2620:35:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:35:a000::,2620:35:a000:ffff:ffff:ffff:ffff:ffff,US +2620:35:c000::,2620:35:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:36::,2620:36::ffff:ffff:ffff:ffff:ffff,US +2620:36:2000::,2620:36:2000:ffff:ffff:ffff:ffff:ffff,US +2620:36:4000::,2620:36:400f:ffff:ffff:ffff:ffff:ffff,CA +2620:36:8000::,2620:36:8000:ffff:ffff:ffff:ffff:ffff,US +2620:36:a000::,2620:36:a000:ffff:ffff:ffff:ffff:ffff,US +2620:36:c000::,2620:36:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:36:e000::,2620:36:e000:ffff:ffff:ffff:ffff:ffff,US +2620:37::,2620:37::ffff:ffff:ffff:ffff:ffff,US +2620:37:2000::,2620:37:2000:ffff:ffff:ffff:ffff:ffff,US +2620:37:4000::,2620:37:400f:ffff:ffff:ffff:ffff:ffff,US +2620:37:8000::,2620:37:8000:ffff:ffff:ffff:ffff:ffff,US +2620:37:a000::,2620:37:a000:ffff:ffff:ffff:ffff:ffff,US +2620:37:c000::,2620:37:c000:ffff:ffff:ffff:ffff:ffff,US +2620:37:e000::,2620:37:e000:ffff:ffff:ffff:ffff:ffff,US +2620:38::,2620:38::ffff:ffff:ffff:ffff:ffff,US +2620:38:2000::,2620:38:2000:ffff:ffff:ffff:ffff:ffff,US +2620:38:4000::,2620:38:400f:ffff:ffff:ffff:ffff:ffff,US +2620:38:8000::,2620:38:8000:ffff:ffff:ffff:ffff:ffff,US +2620:38:a000::,2620:38:a000:ffff:ffff:ffff:ffff:ffff,US +2620:38:c000::,2620:38:c000:ffff:ffff:ffff:ffff:ffff,US +2620:38:e000::,2620:38:e000:ffff:ffff:ffff:ffff:ffff,US +2620:39::,2620:39::ffff:ffff:ffff:ffff:ffff,US +2620:39:2000::,2620:39:2000:ffff:ffff:ffff:ffff:ffff,US +2620:39:4000::,2620:39:4000:ffff:ffff:ffff:ffff:ffff,US +2620:39:6000::,2620:39:6000:ffff:ffff:ffff:ffff:ffff,US +2620:39:8000::,2620:39:8000:ffff:ffff:ffff:ffff:ffff,US +2620:39:a000::,2620:39:a000:ffff:ffff:ffff:ffff:ffff,US +2620:39:c000::,2620:39:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:3a::,2620:3a::ffff:ffff:ffff:ffff:ffff,US +2620:3a:2000::,2620:3a:2000:ffff:ffff:ffff:ffff:ffff,US +2620:3a:4000::,2620:3a:400f:ffff:ffff:ffff:ffff:ffff,US +2620:3a:8000::,2620:3a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3a:a000::,2620:3a:a000:ffff:ffff:ffff:ffff:ffff,US +2620:3a:c000::,2620:3a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:3a:e000::,2620:3a:e000:ffff:ffff:ffff:ffff:ffff,US +2620:3b::,2620:3b::ffff:ffff:ffff:ffff:ffff,US +2620:3b:2000::,2620:3b:2000:ffff:ffff:ffff:ffff:ffff,US +2620:3b:4000::,2620:3b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:3b:6000::,2620:3b:6000:ffff:ffff:ffff:ffff:ffff,US +2620:3b:8000::,2620:3b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3b:a000::,2620:3b:a000:ffff:ffff:ffff:ffff:ffff,US +2620:3b:c000::,2620:3b:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:3c::,2620:3c:3f:ffff:ffff:ffff:ffff:ffff,US +2620:3c:40c0::,2620:3c:40c0:ffff:ffff:ffff:ffff:ffff,US +2620:3c:8080::,2620:3c:8080:ffff:ffff:ffff:ffff:ffff,US +2620:3c:c040::,2620:3c:c040:ffff:ffff:ffff:ffff:ffff,US +2620:3d::,2620:3d::ffff:ffff:ffff:ffff:ffff,US +2620:3d:2000::,2620:3d:2000:ffff:ffff:ffff:ffff:ffff,CA +2620:3d:4000::,2620:3d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:3d:6000::,2620:3d:6000:ffff:ffff:ffff:ffff:ffff,US +2620:3d:8000::,2620:3d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3d:a000::,2620:3d:a000:ffff:ffff:ffff:ffff:ffff,US +2620:3d:c000::,2620:3d:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:3e::,2620:3e::ffff:ffff:ffff:ffff:ffff,US +2620:3e:4000::,2620:3e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:3e:8000::,2620:3e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3e:c000::,2620:3e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:3f::,2620:3f::ffff:ffff:ffff:ffff:ffff,US +2620:3f:4000::,2620:3f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:3f:8000::,2620:3f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3f:c000::,2620:3f:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:40::,2620:40::ffff:ffff:ffff:ffff:ffff,US +2620:40:4000::,2620:40:4000:ffff:ffff:ffff:ffff:ffff,US +2620:40:8000::,2620:40:8000:ffff:ffff:ffff:ffff:ffff,US +2620:40:c000::,2620:40:c000:ffff:ffff:ffff:ffff:ffff,US +2620:41::,2620:41:1:ffff:ffff:ffff:ffff:ffff,US +2620:41:8000::,2620:41:8000:ffff:ffff:ffff:ffff:ffff,US +2620:42::,2620:42::ffff:ffff:ffff:ffff:ffff,US +2620:42:4000::,2620:42:4000:ffff:ffff:ffff:ffff:ffff,US +2620:42:c000::,2620:42:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:43::,2620:43::ffff:ffff:ffff:ffff:ffff,US +2620:43:4000::,2620:43:4000:ffff:ffff:ffff:ffff:ffff,US +2620:43:8000::,2620:43:8000:ffff:ffff:ffff:ffff:ffff,US +2620:44::,2620:44:1:ffff:ffff:ffff:ffff:ffff,US +2620:44:4000::,2620:44:4000:ffff:ffff:ffff:ffff:ffff,US +2620:44:8000::,2620:44:8000:ffff:ffff:ffff:ffff:ffff,US +2620:45::,2620:45::ffff:ffff:ffff:ffff:ffff,CA +2620:45:4000::,2620:45:4000:ffff:ffff:ffff:ffff:ffff,US +2620:45:8000::,2620:45:8000:ffff:ffff:ffff:ffff:ffff,US +2620:45:c000::,2620:45:c000:ffff:ffff:ffff:ffff:ffff,US +2620:46::,2620:46::ffff:ffff:ffff:ffff:ffff,US +2620:46:4000::,2620:46:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:46:8000::,2620:46:8000:ffff:ffff:ffff:ffff:ffff,US +2620:46:c000::,2620:46:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:47::,2620:47::ffff:ffff:ffff:ffff:ffff,US +2620:47:4000::,2620:47:4000:ffff:ffff:ffff:ffff:ffff,US +2620:47:8000::,2620:47:8000:ffff:ffff:ffff:ffff:ffff,US +2620:47:c000::,2620:47:c000:ffff:ffff:ffff:ffff:ffff,US +2620:48::,2620:48::ffff:ffff:ffff:ffff:ffff,US +2620:48:4000::,2620:48:4000:ffff:ffff:ffff:ffff:ffff,US +2620:48:8000::,2620:48:8000:ffff:ffff:ffff:ffff:ffff,US +2620:48:c000::,2620:48:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:49::,2620:49:f:ffff:ffff:ffff:ffff:ffff,CA +2620:49:40c0::,2620:49:40c0:ffff:ffff:ffff:ffff:ffff,US +2620:49:8080::,2620:49:8080:ffff:ffff:ffff:ffff:ffff,US +2620:49:c040::,2620:49:c040:ffff:ffff:ffff:ffff:ffff,US +2620:4a::,2620:4a::ffff:ffff:ffff:ffff:ffff,US +2620:4a:4000::,2620:4a:4000:ffff:ffff:ffff:ffff:ffff,US +2620:4a:8000::,2620:4a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:4a:c000::,2620:4a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:4b::,2620:4b::ffff:ffff:ffff:ffff:ffff,CA +2620:4b:4000::,2620:4b:400f:ffff:ffff:ffff:ffff:ffff,US +2620:4b:8000::,2620:4b:800f:ffff:ffff:ffff:ffff:ffff,US +2620:4b:c000::,2620:4b:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:4c::,2620:4c:1:ffff:ffff:ffff:ffff:ffff,US +2620:4c:4000::,2620:4c:400f:ffff:ffff:ffff:ffff:ffff,US +2620:4c:8080::,2620:4c:8080:ffff:ffff:ffff:ffff:ffff,US +2620:4c:c000::,2620:4c:c000:ffff:ffff:ffff:ffff:ffff,US +2620:4d::,2620:4d::ffff:ffff:ffff:ffff:ffff,US +2620:4d:4000::,2620:4d:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:4d:8000::,2620:4d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:4d:c000::,2620:4d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:4e::,2620:4e::ffff:ffff:ffff:ffff:ffff,US +2620:4e:4000::,2620:4e:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:4e:8000::,2620:4e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:4f::,2620:4f::ffff:ffff:ffff:ffff:ffff,US +2620:4f:4000::,2620:4f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:4f:8000::,2620:4f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:4f:c000::,2620:4f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:50::,2620:50:f:ffff:ffff:ffff:ffff:ffff,US +2620:50:4080::,2620:50:4080:ffff:ffff:ffff:ffff:ffff,US +2620:50:8000::,2620:50:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:50:8080::,2620:50:8080:ffff:ffff:ffff:ffff:ffff,US +2620:50:c040::,2620:50:c040:ffff:ffff:ffff:ffff:ffff,US +2620:51::,2620:51::ffff:ffff:ffff:ffff:ffff,US +2620:51:4000::,2620:51:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:51:8000::,2620:51:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:51:c000::,2620:51:c000:ffff:ffff:ffff:ffff:ffff,US +2620:52::,2620:52:3:ffff:ffff:ffff:ffff:ffff,US +2620:52:4000::,2620:52:4000:ffff:ffff:ffff:ffff:ffff,US +2620:52:8000::,2620:52:800f:ffff:ffff:ffff:ffff:ffff,US +2620:52:c000::,2620:52:c000:ffff:ffff:ffff:ffff:ffff,US +2620:53::,2620:53::ffff:ffff:ffff:ffff:ffff,US +2620:53:4000::,2620:53:400f:ffff:ffff:ffff:ffff:ffff,US +2620:53:8000::,2620:53:8000:ffff:ffff:ffff:ffff:ffff,US +2620:53:c000::,2620:53:c000:ffff:ffff:ffff:ffff:ffff,US +2620:54::,2620:54::ffff:ffff:ffff:ffff:ffff,US +2620:54:4000::,2620:54:4000:ffff:ffff:ffff:ffff:ffff,US +2620:54:8000::,2620:54:8000:ffff:ffff:ffff:ffff:ffff,US +2620:54:c000::,2620:54:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:55::,2620:55::ffff:ffff:ffff:ffff:ffff,US +2620:55:4000::,2620:55:400f:ffff:ffff:ffff:ffff:ffff,US +2620:55:8000::,2620:55:8000:ffff:ffff:ffff:ffff:ffff,US +2620:55:c000::,2620:55:c000:ffff:ffff:ffff:ffff:ffff,US +2620:56::,2620:56::ffff:ffff:ffff:ffff:ffff,US +2620:56:4000::,2620:56:4000:ffff:ffff:ffff:ffff:ffff,US +2620:56:8000::,2620:56:8000:ffff:ffff:ffff:ffff:ffff,US +2620:56:c000::,2620:56:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:57::,2620:57::ffff:ffff:ffff:ffff:ffff,US +2620:57:4000::,2620:57:40ff:ffff:ffff:ffff:ffff:ffff,KY +2620:57:8000::,2620:57:8000:ffff:ffff:ffff:ffff:ffff,US +2620:58::,2620:58:ff:ffff:ffff:ffff:ffff:ffff,US +2620:58:4c00::,2620:58:4c00:ffff:ffff:ffff:ffff:ffff,US +2620:58:8800::,2620:58:8800:ffff:ffff:ffff:ffff:ffff,US +2620:58:c400::,2620:58:c400:ffff:ffff:ffff:ffff:ffff,CA +2620:59::,2620:59::ffff:ffff:ffff:ffff:ffff,US +2620:59:4000::,2620:59:4000:ffff:ffff:ffff:ffff:ffff,US +2620:59:8000::,2620:59:8000:ffff:ffff:ffff:ffff:ffff,US +2620:59:c000::,2620:59:c000:ffff:ffff:ffff:ffff:ffff,US +2620:5a::,2620:5a::ffff:ffff:ffff:ffff:ffff,US +2620:5a:4000::,2620:5a:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:5a:8000::,2620:5a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5a:c000::,2620:5a:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:5b::,2620:5b::ffff:ffff:ffff:ffff:ffff,US +2620:5b:4000::,2620:5b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:5b:8000::,2620:5b:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:5b:c000::,2620:5b:c00f:ffff:ffff:ffff:ffff:ffff,CA +2620:5c::,2620:5c::ffff:ffff:ffff:ffff:ffff,US +2620:5c:8000::,2620:5c:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5c:c000::,2620:5c:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:5d::,2620:5d::ffff:ffff:ffff:ffff:ffff,US +2620:5d:4000::,2620:5d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:5d:8000::,2620:5d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5d:c000::,2620:5d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:5e::,2620:5e::ffff:ffff:ffff:ffff:ffff,US +2620:5e:4000::,2620:5e:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:5e:8000::,2620:5e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5e:c000::,2620:5e:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:5f::,2620:5f::ffff:ffff:ffff:ffff:ffff,US +2620:5f:4000::,2620:5f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:5f:8000::,2620:5f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5f:c000::,2620:5f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:60::,2620:60::ffff:ffff:ffff:ffff:ffff,US +2620:60:4000::,2620:60:400f:ffff:ffff:ffff:ffff:ffff,US +2620:60:8000::,2620:60:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:61::,2620:61::ffff:ffff:ffff:ffff:ffff,CA +2620:61:4000::,2620:61:400f:ffff:ffff:ffff:ffff:ffff,US +2620:61:8000::,2620:61:8000:ffff:ffff:ffff:ffff:ffff,US +2620:61:c000::,2620:61:c000:ffff:ffff:ffff:ffff:ffff,US +2620:62::,2620:62::ffff:ffff:ffff:ffff:ffff,US +2620:62:4000::,2620:62:400f:ffff:ffff:ffff:ffff:ffff,CA +2620:62:8000::,2620:62:8000:ffff:ffff:ffff:ffff:ffff,US +2620:62:c000::,2620:62:c000:ffff:ffff:ffff:ffff:ffff,US +2620:63::,2620:63::ffff:ffff:ffff:ffff:ffff,US +2620:63:4000::,2620:63:4000:ffff:ffff:ffff:ffff:ffff,US +2620:63:8000::,2620:63:8000:ffff:ffff:ffff:ffff:ffff,US +2620:63:c000::,2620:63:c000:ffff:ffff:ffff:ffff:ffff,US +2620:64::,2620:64::ffff:ffff:ffff:ffff:ffff,US +2620:64:4000::,2620:64:4000:ffff:ffff:ffff:ffff:ffff,US +2620:64:c000::,2620:64:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:65::,2620:65::7fff:ffff:ffff:ffff:ffff,MX +2620:65:0:8000::,2620:65:ff:ffff:ffff:ffff:ffff:ffff,US +2620:65:4080::,2620:65:4080:ffff:ffff:ffff:ffff:ffff,US +2620:65:8000::,2620:65:800f:ffff:ffff:ffff:ffff:ffff,US +2620:65:c000::,2620:65:c000:ffff:ffff:ffff:ffff:ffff,US +2620:66::,2620:66::ffff:ffff:ffff:ffff:ffff,CA +2620:66:4000::,2620:66:400f:ffff:ffff:ffff:ffff:ffff,US +2620:66:8000::,2620:66:8000:ffff:ffff:ffff:ffff:ffff,US +2620:66:c000::,2620:66:c000:ffff:ffff:ffff:ffff:ffff,US +2620:67::,2620:67::ffff:ffff:ffff:ffff:ffff,US +2620:67:4000::,2620:67:4000:ffff:ffff:ffff:ffff:ffff,US +2620:67:8000::,2620:67:8000:ffff:ffff:ffff:ffff:ffff,US +2620:67:c000::,2620:67:c000:ffff:ffff:ffff:ffff:ffff,US +2620:68::,2620:68::ffff:ffff:ffff:ffff:ffff,US +2620:68:4000::,2620:68:400f:ffff:ffff:ffff:ffff:ffff,US +2620:68:8000::,2620:68:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:68:c000::,2620:68:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:69:4000::,2620:69:4000:ffff:ffff:ffff:ffff:ffff,US +2620:69:8000::,2620:69:8000:ffff:ffff:ffff:ffff:ffff,US +2620:69:c000::,2620:69:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:6a::,2620:6a::ffff:ffff:ffff:ffff:ffff,US +2620:6a:4000::,2620:6a:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:6a:8000::,2620:6a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:6a:c000::,2620:6a:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:6b::,2620:6b::ffff:ffff:ffff:ffff:ffff,US +2620:6b:4000::,2620:6b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:6b:8000::,2620:6b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:6b:c000::,2620:6b:c000:ffff:ffff:ffff:ffff:ffff,US +2620:6c::,2620:6c:3f:ffff:ffff:ffff:ffff:ffff,US +2620:6c:40c0::,2620:6c:40c0:ffff:ffff:ffff:ffff:ffff,US +2620:6c:8080::,2620:6c:8080:ffff:ffff:ffff:ffff:ffff,US +2620:6c:c060::,2620:6c:c060:ffff:ffff:ffff:ffff:ffff,US +2620:6d:40::,2620:6d:40:ffff:ffff:ffff:ffff:ffff,US +2620:6d:4020::,2620:6d:4020:ffff:ffff:ffff:ffff:ffff,US +2620:6d:8000::,2620:6d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:6d:c000::,2620:6d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:6e::,2620:6e::ffff:ffff:ffff:ffff:ffff,US +2620:6e:4000::,2620:6e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:6e:8000::,2620:6e:800f:ffff:ffff:ffff:ffff:ffff,US +2620:6e:c000::,2620:6e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:6f::,2620:6f::ffff:ffff:ffff:ffff:ffff,US +2620:6f:4000::,2620:6f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:6f:8000::,2620:6f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:6f:c000::,2620:6f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:70:4000::,2620:70:4000:ffff:ffff:ffff:ffff:ffff,US +2620:70:8000::,2620:70:8000:ffff:ffff:ffff:ffff:ffff,US +2620:70:c000::,2620:70:c000:ffff:ffff:ffff:ffff:ffff,US +2620:71::,2620:71::ffff:ffff:ffff:ffff:ffff,US +2620:71:4000::,2620:71:4000:ffff:ffff:ffff:ffff:ffff,US +2620:71:8000::,2620:71:8000:ffff:ffff:ffff:ffff:ffff,US +2620:71:c000::,2620:71:c000:ffff:ffff:ffff:ffff:ffff,US +2620:72::,2620:72::ffff:ffff:ffff:ffff:ffff,US +2620:72:4000::,2620:72:4000:ffff:ffff:ffff:ffff:ffff,US +2620:72:8000::,2620:72:8000:ffff:ffff:ffff:ffff:ffff,US +2620:72:c000::,2620:72:c000:ffff:ffff:ffff:ffff:ffff,US +2620:73::,2620:73::ffff:ffff:ffff:ffff:ffff,US +2620:73:8000::,2620:73:8000:ffff:ffff:ffff:ffff:ffff,US +2620:73:c000::,2620:73:c000:ffff:ffff:ffff:ffff:ffff,US +2620:74::,2620:74:32:ffff:ffff:ffff:ffff:ffff,US +2620:74:33::,2620:74:34:ffff:ffff:ffff:ffff:ffff,NL +2620:74:35::,2620:74:36:ffff:ffff:ffff:ffff:ffff,US +2620:74:37::,2620:74:37:ffff:ffff:ffff:ffff:ffff,NL +2620:74:38::,2620:74:3a:ffff:ffff:ffff:ffff:ffff,GB +2620:74:3b::,2620:74:3b:ffff:ffff:ffff:ffff:ffff,US +2620:74:3c::,2620:74:3e:ffff:ffff:ffff:ffff:ffff,DE +2620:74:3f::,2620:74:3f:ffff:ffff:ffff:ffff:ffff,JP +2620:74:40::,2620:74:ff:ffff:ffff:ffff:ffff:ffff,US +2620:74:40c0::,2620:74:40c0:ffff:ffff:ffff:ffff:ffff,US +2620:74:8080::,2620:74:8080:ffff:ffff:ffff:ffff:ffff,US +2620:74:c040::,2620:74:c040:ffff:ffff:ffff:ffff:ffff,US +2620:75::,2620:75::ffff:ffff:ffff:ffff:ffff,US +2620:75:4000::,2620:75:4000:ffff:ffff:ffff:ffff:ffff,US +2620:75:8000::,2620:75:8000:ffff:ffff:ffff:ffff:ffff,US +2620:75:c000::,2620:75:c000:ffff:ffff:ffff:ffff:ffff,US +2620:76::,2620:76::ffff:ffff:ffff:ffff:ffff,US +2620:76:4000::,2620:76:4000:ffff:ffff:ffff:ffff:ffff,US +2620:76:8000::,2620:76:8000:ffff:ffff:ffff:ffff:ffff,US +2620:76:c000::,2620:76:c000:ffff:ffff:ffff:ffff:ffff,US +2620:77::,2620:77::ffff:ffff:ffff:ffff:ffff,US +2620:77:4000::,2620:77:4000:ffff:ffff:ffff:ffff:ffff,US +2620:77:8000::,2620:77:8000:ffff:ffff:ffff:ffff:ffff,US +2620:78::,2620:78::ffff:ffff:ffff:ffff:ffff,US +2620:78:4000::,2620:78:4000:ffff:ffff:ffff:ffff:ffff,US +2620:78:8000::,2620:78:8000:ffff:ffff:ffff:ffff:ffff,US +2620:78:c000::,2620:78:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:79::,2620:79:f:ffff:ffff:ffff:ffff:ffff,US +2620:79:8000::,2620:79:8000:ffff:ffff:ffff:ffff:ffff,US +2620:79:c000::,2620:79:c000:ffff:ffff:ffff:ffff:ffff,US +2620:7a::,2620:7a::ffff:ffff:ffff:ffff:ffff,US +2620:7a:4000::,2620:7a:4000:ffff:ffff:ffff:ffff:ffff,US +2620:7a:8000::,2620:7a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:7a:c000::,2620:7a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:7b::,2620:7b::ffff:ffff:ffff:ffff:ffff,US +2620:7b:4000::,2620:7b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:7b:8000::,2620:7b:800f:ffff:ffff:ffff:ffff:ffff,US +2620:7b:b000::,2620:7b:b000:ffff:ffff:ffff:ffff:ffff,US +2620:7b:e000::,2620:7b:e000:ffff:ffff:ffff:ffff:ffff,US +2620:7c:1000::,2620:7c:1000:ffff:ffff:ffff:ffff:ffff,US +2620:7c:4000::,2620:7c:4000:ffff:ffff:ffff:ffff:ffff,US +2620:7c:7000::,2620:7c:7000:ffff:ffff:ffff:ffff:ffff,US +2620:7c:a000::,2620:7c:a000:ffff:ffff:ffff:ffff:ffff,US +2620:7c:d000::,2620:7c:d000:ffff:ffff:ffff:ffff:ffff,US +2620:7d::,2620:7d::ffff:ffff:ffff:ffff:ffff,US +2620:7d:4000::,2620:7d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:7d:8000::,2620:7d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:7d:c000::,2620:7d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:7e::,2620:7e:f:ffff:ffff:ffff:ffff:ffff,US +2620:7e:30e0::,2620:7e:30e0:ffff:ffff:ffff:ffff:ffff,US +2620:7e:60c0::,2620:7e:60c0:ffff:ffff:ffff:ffff:ffff,US +2620:7e:90a0::,2620:7e:90a0:ffff:ffff:ffff:ffff:ffff,US +2620:7e:c080::,2620:7e:c080:ffff:ffff:ffff:ffff:ffff,US +2620:7e:f060::,2620:7e:f060:ffff:ffff:ffff:ffff:ffff,CA +2620:7f:8000::,2620:7f:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:7f:c000::,2620:7f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:80:8000::,2620:80:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:80:c000::,2620:80:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:81::,2620:81::ffff:ffff:ffff:ffff:ffff,US +2620:81:4000::,2620:81:4000:ffff:ffff:ffff:ffff:ffff,US +2620:81:8000::,2620:81:8000:ffff:ffff:ffff:ffff:ffff,US +2620:81:c000::,2620:81:c000:ffff:ffff:ffff:ffff:ffff,US +2620:82::,2620:82::ffff:ffff:ffff:ffff:ffff,US +2620:82:4000::,2620:82:4000:ffff:ffff:ffff:ffff:ffff,US +2620:82:8000::,2620:82:8000:ffff:ffff:ffff:ffff:ffff,US +2620:82:c000::,2620:82:c000:ffff:ffff:ffff:ffff:ffff,US +2620:83::,2620:83::ffff:ffff:ffff:ffff:ffff,US +2620:83:4000::,2620:83:4000:ffff:ffff:ffff:ffff:ffff,US +2620:83:8000::,2620:83:800f:ffff:ffff:ffff:ffff:ffff,US +2620:83:c000::,2620:83:c000:ffff:ffff:ffff:ffff:ffff,US +2620:84::,2620:84:1:ffff:ffff:ffff:ffff:ffff,US +2620:84:4000::,2620:84:4000:ffff:ffff:ffff:ffff:ffff,US +2620:84:8000::,2620:84:8000:ffff:ffff:ffff:ffff:ffff,US +2620:84:c000::,2620:84:c000:ffff:ffff:ffff:ffff:ffff,US +2620:85::,2620:85::ffff:ffff:ffff:ffff:ffff,US +2620:85:4000::,2620:85:4000:ffff:ffff:ffff:ffff:ffff,US +2620:85:8000::,2620:85:8000:ffff:ffff:ffff:ffff:ffff,US +2620:85:c000::,2620:85:c000:ffff:ffff:ffff:ffff:ffff,US +2620:86::,2620:86::ffff:ffff:ffff:ffff:ffff,US +2620:86:4000::,2620:86:4000:ffff:ffff:ffff:ffff:ffff,US +2620:86:8000::,2620:86:8000:ffff:ffff:ffff:ffff:ffff,US +2620:86:c000::,2620:86:c000:ffff:ffff:ffff:ffff:ffff,US +2620:87::,2620:87::ffff:ffff:ffff:ffff:ffff,US +2620:87:4000::,2620:87:4000:ffff:ffff:ffff:ffff:ffff,US +2620:87:8000::,2620:87:8000:ffff:ffff:ffff:ffff:ffff,US +2620:87:c000::,2620:87:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:88::,2620:88::ffff:ffff:ffff:ffff:ffff,US +2620:88:4000::,2620:88:4000:ffff:ffff:ffff:ffff:ffff,US +2620:88:8000::,2620:88:800f:ffff:ffff:ffff:ffff:ffff,US +2620:88:c000::,2620:88:c000:ffff:ffff:ffff:ffff:ffff,US +2620:89::,2620:89::ffff:ffff:ffff:ffff:ffff,US +2620:89:8000::,2620:89:8000:ffff:ffff:ffff:ffff:ffff,US +2620:89:c000::,2620:89:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8a::,2620:8a::ffff:ffff:ffff:ffff:ffff,US +2620:8a:4000::,2620:8a:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:8a:8000::,2620:8a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:8a:c000::,2620:8a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8b::,2620:8b::ffff:ffff:ffff:ffff:ffff,US +2620:8b:4000::,2620:8b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:8b:8000::,2620:8b:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:8b:c000::,2620:8b:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8c:4000::,2620:8c:4000:ffff:ffff:ffff:ffff:ffff,US +2620:8c:8000::,2620:8c:8000:ffff:ffff:ffff:ffff:ffff,US +2620:8d::,2620:8d::ffff:ffff:ffff:ffff:ffff,US +2620:8d:4000::,2620:8d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:8d:8000::,2620:8d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:8d:c000::,2620:8d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8e:4000::,2620:8e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:8e:8000::,2620:8e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:8e:c000::,2620:8e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8f::,2620:8f::ffff:ffff:ffff:ffff:ffff,US +2620:8f:4000::,2620:8f:400f:ffff:ffff:ffff:ffff:ffff,US +2620:8f:8000::,2620:8f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:8f:c000::,2620:8f:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:90::,2620:90::ffff:ffff:ffff:ffff:ffff,CA +2620:90:4000::,2620:90:4000:ffff:ffff:ffff:ffff:ffff,US +2620:90:8000::,2620:90:8000:ffff:ffff:ffff:ffff:ffff,US +2620:90:c000::,2620:90:c000:ffff:ffff:ffff:ffff:ffff,US +2620:91::,2620:91::ffff:ffff:ffff:ffff:ffff,US +2620:91:4000::,2620:91:4000:ffff:ffff:ffff:ffff:ffff,US +2620:91:8000::,2620:91:8000:ffff:ffff:ffff:ffff:ffff,US +2620:91:c000::,2620:91:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:92::,2620:92:f:ffff:ffff:ffff:ffff:ffff,US +2620:92:4000::,2620:92:4000:ffff:ffff:ffff:ffff:ffff,US +2620:92:8000::,2620:92:8000:ffff:ffff:ffff:ffff:ffff,US +2620:92:c000::,2620:92:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:93::,2620:93::ffff:ffff:ffff:ffff:ffff,US +2620:93:4000::,2620:93:4000:ffff:ffff:ffff:ffff:ffff,US +2620:93:8000::,2620:93:8000:ffff:ffff:ffff:ffff:ffff,US +2620:93:c000::,2620:93:c000:ffff:ffff:ffff:ffff:ffff,US +2620:94::,2620:94::ffff:ffff:ffff:ffff:ffff,US +2620:94:c000::,2620:94:c000:ffff:ffff:ffff:ffff:ffff,US +2620:95::,2620:95::ffff:ffff:ffff:ffff:ffff,US +2620:95:4000::,2620:95:400f:ffff:ffff:ffff:ffff:ffff,US +2620:95:8000::,2620:95:8000:ffff:ffff:ffff:ffff:ffff,US +2620:95:c000::,2620:95:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:96::,2620:96::ffff:ffff:ffff:ffff:ffff,US +2620:96:4000::,2620:96:400f:ffff:ffff:ffff:ffff:ffff,CA +2620:96:8000::,2620:96:8000:ffff:ffff:ffff:ffff:ffff,US +2620:96:c000::,2620:96:c000:ffff:ffff:ffff:ffff:ffff,US +2620:97::,2620:97::ffff:ffff:ffff:ffff:ffff,US +2620:97:8000::,2620:97:8000:ffff:ffff:ffff:ffff:ffff,US +2620:97:c000::,2620:97:c000:ffff:ffff:ffff:ffff:ffff,US +2620:98::,2620:98::ffff:ffff:ffff:ffff:ffff,US +2620:98:4000::,2620:98:400f:ffff:ffff:ffff:ffff:ffff,CA +2620:98:8000::,2620:98:8000:ffff:ffff:ffff:ffff:ffff,US +2620:98:c000::,2620:98:c000:ffff:ffff:ffff:ffff:ffff,US +2620:99::,2620:99::ffff:ffff:ffff:ffff:ffff,US +2620:99:8000::,2620:99:8000:ffff:ffff:ffff:ffff:ffff,US +2620:99:c000::,2620:99:c000:ffff:ffff:ffff:ffff:ffff,US +2620:9a::,2620:9a::ffff:ffff:ffff:ffff:ffff,CA +2620:9a:8000::,2620:9a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9b::,2620:9b::ffff:ffff:ffff:ffff:ffff,US +2620:9b:4000::,2620:9b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:9b:8000::,2620:9b:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:9b:c000::,2620:9b:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:9c::,2620:9c::ffff:ffff:ffff:ffff:ffff,US +2620:9c:4000::,2620:9c:400f:ffff:ffff:ffff:ffff:ffff,US +2620:9c:8000::,2620:9c:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9c:c000::,2620:9c:c000:ffff:ffff:ffff:ffff:ffff,US +2620:9d::,2620:9d::ffff:ffff:ffff:ffff:ffff,US +2620:9d:4000::,2620:9d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:9d:c000::,2620:9d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:9e::,2620:9e::ffff:ffff:ffff:ffff:ffff,US +2620:9e:4000::,2620:9e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:9e:8000::,2620:9e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9e:c000::,2620:9e:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:9f::,2620:9f:ff:ffff:ffff:ffff:ffff:ffff,US +2620:9f:4080::,2620:9f:4080:ffff:ffff:ffff:ffff:ffff,CA +2620:9f:8000::,2620:9f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9f:c000::,2620:9f:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:a0::,2620:a0::ffff:ffff:ffff:ffff:ffff,US +2620:a0:4000::,2620:a0:400f:ffff:ffff:ffff:ffff:ffff,US +2620:a0:8000::,2620:a0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a0:c000::,2620:a0:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a1::,2620:a1::ffff:ffff:ffff:ffff:ffff,US +2620:a1:4000::,2620:a1:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a1:8000::,2620:a1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a1:c000::,2620:a1:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a2::,2620:a2::ffff:ffff:ffff:ffff:ffff,US +2620:a2:4000::,2620:a2:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a2:8000::,2620:a2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a2:c000::,2620:a2:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a3::,2620:a3::ffff:ffff:ffff:ffff:ffff,US +2620:a3:4000::,2620:a3:400f:ffff:ffff:ffff:ffff:ffff,US +2620:a3:8000::,2620:a3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a3:a010::,2620:a3:a010:ffff:ffff:ffff:ffff:ffff,US +2620:a3:c020::,2620:a3:c020:ffff:ffff:ffff:ffff:ffff,US +2620:a3:e030::,2620:a3:e030:ffff:ffff:ffff:ffff:ffff,US +2620:a4:40::,2620:a4:40:ffff:ffff:ffff:ffff:ffff,US +2620:a4:2050::,2620:a4:205f:ffff:ffff:ffff:ffff:ffff,US +2620:a4:4060::,2620:a4:4060:ffff:ffff:ffff:ffff:ffff,US +2620:a4:6070::,2620:a4:6070:ffff:ffff:ffff:ffff:ffff,US +2620:a4:8080::,2620:a4:8080:ffff:ffff:ffff:ffff:ffff,US +2620:a5::,2620:a5::ffff:ffff:ffff:ffff:ffff,US +2620:a5:4000::,2620:a5:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a5:8000::,2620:a5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a5:c000::,2620:a5:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a6::,2620:a6::ffff:ffff:ffff:ffff:ffff,US +2620:a6:4000::,2620:a6:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a6:8000::,2620:a6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a6:c000::,2620:a6:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a7::,2620:a7::ffff:ffff:ffff:ffff:ffff,US +2620:a7:4000::,2620:a7:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a7:8000::,2620:a7:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a7:c000::,2620:a7:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:a8::,2620:a8::ffff:ffff:ffff:ffff:ffff,US +2620:a8:4000::,2620:a8:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a8:8000::,2620:a8:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a8:c000::,2620:a8:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a9::,2620:a9::ffff:ffff:ffff:ffff:ffff,US +2620:a9:4000::,2620:a9:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a9:8000::,2620:a9:800f:ffff:ffff:ffff:ffff:ffff,US +2620:a9:c080::,2620:a9:c080:ffff:ffff:ffff:ffff:ffff,US +2620:aa::,2620:aa::ffff:ffff:ffff:ffff:ffff,US +2620:aa:4000::,2620:aa:4000:ffff:ffff:ffff:ffff:ffff,US +2620:aa:8000::,2620:aa:8000:ffff:ffff:ffff:ffff:ffff,US +2620:aa:c000::,2620:aa:c000:ffff:ffff:ffff:ffff:ffff,US +2620:ab::,2620:ab::ffff:ffff:ffff:ffff:ffff,US +2620:ab:4000::,2620:ab:4000:ffff:ffff:ffff:ffff:ffff,US +2620:ab:8000::,2620:ab:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ab:c000::,2620:ab:c000:ffff:ffff:ffff:ffff:ffff,US +2620:ac::,2620:ac::ffff:ffff:ffff:ffff:ffff,US +2620:ac:4000::,2620:ac:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:ac:8000::,2620:ac:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ac:c000::,2620:ac:c000:ffff:ffff:ffff:ffff:ffff,US +2620:ad::,2620:ad::ffff:ffff:ffff:ffff:ffff,US +2620:ad:4000::,2620:ad:4000:ffff:ffff:ffff:ffff:ffff,US +2620:ad:8000::,2620:ad:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:ad:c000::,2620:ad:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:ae::,2620:ae::ffff:ffff:ffff:ffff:ffff,CA +2620:ae:4000::,2620:ae:4000:ffff:ffff:ffff:ffff:ffff,US +2620:ae:8000::,2620:ae:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ae:c000::,2620:ae:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:af::,2620:af:f:ffff:ffff:ffff:ffff:ffff,US +2620:af:4000::,2620:af:4000:ffff:ffff:ffff:ffff:ffff,US +2620:af:8000::,2620:af:8000:ffff:ffff:ffff:ffff:ffff,US +2620:af:c000::,2620:af:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:b0::,2620:b0::ffff:ffff:ffff:ffff:ffff,CA +2620:b0:4000::,2620:b0:4000:ffff:ffff:ffff:ffff:ffff,US +2620:b0:8000::,2620:b0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b0:c000::,2620:b0:c000:ffff:ffff:ffff:ffff:ffff,US +2620:b1::,2620:b1::ffff:ffff:ffff:ffff:ffff,US +2620:b1:4000::,2620:b1:4000:ffff:ffff:ffff:ffff:ffff,US +2620:b1:8000::,2620:b1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b1:c000::,2620:b1:c000:ffff:ffff:ffff:ffff:ffff,US +2620:b2::,2620:b2::ffff:ffff:ffff:ffff:ffff,US +2620:b2:4000::,2620:b2:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:b2:8000::,2620:b2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b2:c000::,2620:b2:c000:ffff:ffff:ffff:ffff:ffff,US +2620:b3::,2620:b3::ffff:ffff:ffff:ffff:ffff,US +2620:b3:4000::,2620:b3:4000:ffff:ffff:ffff:ffff:ffff,US +2620:b3:8000::,2620:b3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b3:c000::,2620:b3:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:b4::,2620:b4::ffff:ffff:ffff:ffff:ffff,US +2620:b4:4000::,2620:b4:4000:ffff:ffff:ffff:ffff:ffff,US +2620:b4:8000::,2620:b4:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:b4:c000::,2620:b4:c000:ffff:ffff:ffff:ffff:ffff,US +2620:b5::,2620:b5::ffff:ffff:ffff:ffff:ffff,US +2620:b5:4000::,2620:b5:4000:ffff:ffff:ffff:ffff:ffff,US +2620:b5:8000::,2620:b5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b5:c000::,2620:b5:c000:ffff:ffff:ffff:ffff:ffff,US +2620:b6:4000::,2620:b6:4000:ffff:ffff:ffff:ffff:ffff,US +2620:b6:8000::,2620:b6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b6:c000::,2620:b6:c000:ffff:ffff:ffff:ffff:ffff,US +2620:b7::,2620:b7::ffff:ffff:ffff:ffff:ffff,US +2620:b7:8000::,2620:b7:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:b7:c000::,2620:b7:c000:ffff:ffff:ffff:ffff:ffff,US +2620:b8::,2620:b8::ffff:ffff:ffff:ffff:ffff,US +2620:b8:4000::,2620:b8:4000:fff:ffff:ffff:ffff:ffff,CA +2620:b8:4000:1000::,2620:b8:4000:10ff:ffff:ffff:ffff:ffff,US +2620:b8:4000:1100::,2620:b8:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:b8:8000::,2620:b8:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b8:c000::,2620:b8:c000:ffff:ffff:ffff:ffff:ffff,US +2620:b9::,2620:b9::ffff:ffff:ffff:ffff:ffff,US +2620:b9:4000::,2620:b9:4000:ffff:ffff:ffff:ffff:ffff,US +2620:b9:8000::,2620:b9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b9:c000::,2620:b9:c000:ffff:ffff:ffff:ffff:ffff,US +2620:ba::,2620:ba:ff:ffff:ffff:ffff:ffff:ffff,US +2620:ba:4000::,2620:ba:4000:ffff:ffff:ffff:ffff:ffff,US +2620:ba:8000::,2620:ba:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ba:c000::,2620:ba:c000:ffff:ffff:ffff:ffff:ffff,US +2620:bb::,2620:bb::ffff:ffff:ffff:ffff:ffff,US +2620:bb:8000::,2620:bb:800f:ffff:ffff:ffff:ffff:ffff,US +2620:bb:c000::,2620:bb:c000:ffff:ffff:ffff:ffff:ffff,US +2620:bc:4000::,2620:bc:4000:ffff:ffff:ffff:ffff:ffff,US +2620:bc:8000::,2620:bc:8000:ffff:ffff:ffff:ffff:ffff,US +2620:bc:c000::,2620:bc:c000:ffff:ffff:ffff:ffff:ffff,US +2620:bd::,2620:bd::ffff:ffff:ffff:ffff:ffff,CA +2620:bd:4000::,2620:bd:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:bd:8000::,2620:bd:8000:ffff:ffff:ffff:ffff:ffff,US +2620:bd:c000::,2620:bd:c000:ffff:ffff:ffff:ffff:ffff,US +2620:be::,2620:be::ffff:ffff:ffff:ffff:ffff,US +2620:be:4000::,2620:be:4000:ffff:ffff:ffff:ffff:ffff,US +2620:be:8000::,2620:be:8000:ffff:ffff:ffff:ffff:ffff,US +2620:be:c000::,2620:be:c000:ffff:ffff:ffff:ffff:ffff,US +2620:bf::,2620:bf::ffff:ffff:ffff:ffff:ffff,US +2620:bf:4000::,2620:bf:4000:ffff:ffff:ffff:ffff:ffff,US +2620:bf:8000::,2620:bf:8000:ffff:ffff:ffff:ffff:ffff,US +2620:bf:c000::,2620:bf:c000:ffff:ffff:ffff:ffff:ffff,US +2620:c0::,2620:c0::ffff:ffff:ffff:ffff:ffff,US +2620:c0:4000::,2620:c0:400f:ffff:ffff:ffff:ffff:ffff,US +2620:c0:8000::,2620:c0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c0:c000::,2620:c0:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:c1::,2620:c1::ffff:ffff:ffff:ffff:ffff,US +2620:c1:4000::,2620:c1:4000:ffff:ffff:ffff:ffff:ffff,US +2620:c1:8000::,2620:c1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c1:c000::,2620:c1:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:c2::,2620:c2::ffff:ffff:ffff:ffff:ffff,US +2620:c2:4000::,2620:c2:4000:ffff:ffff:ffff:ffff:ffff,US +2620:c2:8000::,2620:c2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c2:c000::,2620:c2:c000:ffff:ffff:ffff:ffff:ffff,US +2620:c3::,2620:c3::ffff:ffff:ffff:ffff:ffff,US +2620:c3:4000::,2620:c3:4000:ffff:ffff:ffff:ffff:ffff,US +2620:c3:8000::,2620:c3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c3:c000::,2620:c3:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:c4::,2620:c4::ffff:ffff:ffff:ffff:ffff,US +2620:c4:4000::,2620:c4:4000:ffff:ffff:ffff:ffff:ffff,US +2620:c4:8000::,2620:c4:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c4:c000::,2620:c4:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:c5::,2620:c5::ffff:ffff:ffff:ffff:ffff,US +2620:c5:4000::,2620:c5:4000:ffff:ffff:ffff:ffff:ffff,US +2620:c5:c000::,2620:c5:c000:ffff:ffff:ffff:ffff:ffff,US +2620:c6::,2620:c6::ffff:ffff:ffff:ffff:ffff,US +2620:c6:4000::,2620:c6:4000:ffff:ffff:ffff:ffff:ffff,US +2620:c6:8000::,2620:c6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c6:c000::,2620:c6:c000:ffff:ffff:ffff:ffff:ffff,US +2620:c7::,2620:c7::ffff:ffff:ffff:ffff:ffff,US +2620:c7:4000::,2620:c7:4000:ffff:ffff:ffff:ffff:ffff,US +2620:c7:8000::,2620:c7:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c7:c000::,2620:c7:c000:ffff:ffff:ffff:ffff:ffff,US +2620:c8::,2620:c8::ffff:ffff:ffff:ffff:ffff,US +2620:c8:4000::,2620:c8:4000:ffff:ffff:ffff:ffff:ffff,US +2620:c8:c000::,2620:c8:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:c9::,2620:c9::ffff:ffff:ffff:ffff:ffff,US +2620:c9:4000::,2620:c9:4000:ffff:ffff:ffff:ffff:ffff,US +2620:c9:8000::,2620:c9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c9:c000::,2620:c9:c000:ffff:ffff:ffff:ffff:ffff,US +2620:ca::,2620:ca::ffff:ffff:ffff:ffff:ffff,US +2620:ca:4000::,2620:ca:4000:ffff:ffff:ffff:ffff:ffff,US +2620:ca:8000::,2620:ca:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ca:c000::,2620:ca:c000:ffff:ffff:ffff:ffff:ffff,US +2620:cb::,2620:cb:f:ffff:ffff:ffff:ffff:ffff,US +2620:cb:4000::,2620:cb:4000:ffff:ffff:ffff:ffff:ffff,US +2620:cb:8000::,2620:cb:8000:ffff:ffff:ffff:ffff:ffff,US +2620:cb:c000::,2620:cb:c000:ffff:ffff:ffff:ffff:ffff,US +2620:cc::,2620:cc::ffff:ffff:ffff:ffff:ffff,US +2620:cc:4000::,2620:cc:4000:ffff:ffff:ffff:ffff:ffff,US +2620:cc:8000::,2620:cc:8000:ffff:ffff:ffff:ffff:ffff,US +2620:cc:c000::,2620:cc:c000:ffff:ffff:ffff:ffff:ffff,US +2620:cd::,2620:cd::ffff:ffff:ffff:ffff:ffff,US +2620:cd:4000::,2620:cd:4000:ffff:ffff:ffff:ffff:ffff,US +2620:cd:8000::,2620:cd:8000:ffff:ffff:ffff:ffff:ffff,US +2620:cd:c000::,2620:cd:c000:ffff:ffff:ffff:ffff:ffff,US +2620:ce::,2620:ce::ffff:ffff:ffff:ffff:ffff,US +2620:ce:4000::,2620:ce:4000:ffff:ffff:ffff:ffff:ffff,US +2620:ce:8000::,2620:ce:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ce:c000::,2620:ce:c000:ffff:ffff:ffff:ffff:ffff,US +2620:cf:4000::,2620:cf:4000:ffff:ffff:ffff:ffff:ffff,US +2620:cf:8000::,2620:cf:8000:ffff:ffff:ffff:ffff:ffff,US +2620:cf:c000::,2620:cf:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:d0::,2620:d0::ffff:ffff:ffff:ffff:ffff,US +2620:d0:4000::,2620:d0:4000:ffff:ffff:ffff:ffff:ffff,US +2620:d0:8000::,2620:d0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d0:c000::,2620:d0:c000:ffff:ffff:ffff:ffff:ffff,US +2620:d1::,2620:d1::ffff:ffff:ffff:ffff:ffff,US +2620:d1:4000::,2620:d1:4000:ffff:ffff:ffff:ffff:ffff,US +2620:d1:8000::,2620:d1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d1:c000::,2620:d1:c000:ffff:ffff:ffff:ffff:ffff,US +2620:d2::,2620:d2::ffff:ffff:ffff:ffff:ffff,US +2620:d2:4000::,2620:d2:4000:ffff:ffff:ffff:ffff:ffff,US +2620:d2:8000::,2620:d2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d2:c000::,2620:d2:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:d3:4000::,2620:d3:4000:ffff:ffff:ffff:ffff:ffff,US +2620:d3:8000::,2620:d3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d3:c000::,2620:d3:c000:ffff:ffff:ffff:ffff:ffff,US +2620:d4::,2620:d4::ffff:ffff:ffff:ffff:ffff,US +2620:d4:4000::,2620:d4:4000:ffff:ffff:ffff:ffff:ffff,US +2620:d4:8000::,2620:d4:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d5::,2620:d5::ffff:ffff:ffff:ffff:ffff,US +2620:d5:4000::,2620:d5:4000:ffff:ffff:ffff:ffff:ffff,US +2620:d5:8000::,2620:d5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d5:c000::,2620:d5:c000:ffff:ffff:ffff:ffff:ffff,US +2620:d6::,2620:d6::ffff:ffff:ffff:ffff:ffff,US +2620:d6:4000::,2620:d6:4000:ffff:ffff:ffff:ffff:ffff,US +2620:d6:8000::,2620:d6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d6:c000::,2620:d6:c000:ffff:ffff:ffff:ffff:ffff,US +2620:d7::,2620:d7::ffff:ffff:ffff:ffff:ffff,US +2620:d7:4000::,2620:d7:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:d7:8000::,2620:d7:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d7:c000::,2620:d7:c000:ffff:ffff:ffff:ffff:ffff,US +2620:d8::,2620:d8::ffff:ffff:ffff:ffff:ffff,US +2620:d8:4000::,2620:d8:4000:ffff:ffff:ffff:ffff:ffff,US +2620:d8:8000::,2620:d8:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d8:c000::,2620:d8:c000:ffff:ffff:ffff:ffff:ffff,US +2620:d9::,2620:d9::ffff:ffff:ffff:ffff:ffff,US +2620:d9:4000::,2620:d9:4000:ffff:ffff:ffff:ffff:ffff,US +2620:d9:8000::,2620:d9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d9:c000::,2620:d9:c000:ffff:ffff:ffff:ffff:ffff,US +2620:da::,2620:da::ffff:ffff:ffff:ffff:ffff,US +2620:da:4000::,2620:da:4000:ffff:ffff:ffff:ffff:ffff,US +2620:da:c000::,2620:da:c000:ffff:ffff:ffff:ffff:ffff,US +2620:db::,2620:db::ffff:ffff:ffff:ffff:ffff,US +2620:db:4000::,2620:db:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:db:8000::,2620:db:8000:ffff:ffff:ffff:ffff:ffff,US +2620:db:c000::,2620:db:c000:ffff:ffff:ffff:ffff:ffff,US +2620:dc::,2620:dc::ffff:ffff:ffff:ffff:ffff,US +2620:dc:8::,2620:dc:8:ffff:ffff:ffff:ffff:ffff,US +2620:dc:4000::,2620:dc:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:dc:8000::,2620:dc:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:dc:c000::,2620:dc:c000:ffff:ffff:ffff:ffff:ffff,US +2620:dd::,2620:dd::ffff:ffff:ffff:ffff:ffff,CA +2620:dd:4000::,2620:dd:4000:ffff:ffff:ffff:ffff:ffff,US +2620:dd:8000::,2620:dd:8000:ffff:ffff:ffff:ffff:ffff,US +2620:dd:c000::,2620:dd:c000:ffff:ffff:ffff:ffff:ffff,US +2620:de::,2620:de::ffff:ffff:ffff:ffff:ffff,US +2620:de:4000::,2620:de:4000:ffff:ffff:ffff:ffff:ffff,US +2620:de:8000::,2620:de:8000:ffff:ffff:ffff:ffff:ffff,US +2620:de:c000::,2620:de:c000:ffff:ffff:ffff:ffff:ffff,US +2620:df::,2620:df::ffff:ffff:ffff:ffff:ffff,US +2620:df:4000::,2620:df:400f:ffff:ffff:ffff:ffff:ffff,US +2620:df:8000::,2620:df:8000:ffff:ffff:ffff:ffff:ffff,US +2620:df:c000::,2620:df:c000:ffff:ffff:ffff:ffff:ffff,US +2620:e0::,2620:e0::ffff:ffff:ffff:ffff:ffff,US +2620:e0:4000::,2620:e0:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e0:8000::,2620:e0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e0:c000::,2620:e0:c000:ffff:ffff:ffff:ffff:ffff,US +2620:e1::,2620:e1::ffff:ffff:ffff:ffff:ffff,US +2620:e1:4000::,2620:e1:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e1:8000::,2620:e1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e1:c000::,2620:e1:c000:ffff:ffff:ffff:ffff:ffff,VG +2620:e2::,2620:e2::ffff:ffff:ffff:ffff:ffff,US +2620:e2:4000::,2620:e2:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e2:8000::,2620:e2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e2:c000::,2620:e2:c000:ffff:ffff:ffff:ffff:ffff,US +2620:e3::,2620:e3::ffff:ffff:ffff:ffff:ffff,US +2620:e3:4000::,2620:e3:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e3:8000::,2620:e3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e3:c000::,2620:e3:c000:ffff:ffff:ffff:ffff:ffff,US +2620:e4::,2620:e4::ffff:ffff:ffff:ffff:ffff,US +2620:e4:4000::,2620:e4:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e4:8000::,2620:e4:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e4:c000::,2620:e4:c000:ffff:ffff:ffff:ffff:ffff,US +2620:e5::,2620:e5::ffff:ffff:ffff:ffff:ffff,US +2620:e5:4000::,2620:e5:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e5:8000::,2620:e5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e5:c000::,2620:e5:c000:ffff:ffff:ffff:ffff:ffff,US +2620:e6::,2620:e6::ffff:ffff:ffff:ffff:ffff,US +2620:e6:4000::,2620:e6:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e6:8000::,2620:e6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e6:c000::,2620:e6:c000:ffff:ffff:ffff:ffff:ffff,US +2620:e7::,2620:e7::ffff:ffff:ffff:ffff:ffff,US +2620:e7:4000::,2620:e7:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e7:8000::,2620:e7:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:e7:c000::,2620:e7:c000:ffff:ffff:ffff:ffff:ffff,US +2620:e8::,2620:e8::ffff:ffff:ffff:ffff:ffff,US +2620:e8:4000::,2620:e8:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e8:8000::,2620:e8:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e8:c000::,2620:e8:c000:ffff:ffff:ffff:ffff:ffff,US +2620:e9::,2620:e9::ffff:ffff:ffff:ffff:ffff,US +2620:e9:4000::,2620:e9:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e9:8000::,2620:e9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e9:c000::,2620:e9:c000:ffff:ffff:ffff:ffff:ffff,US +2620:ea::,2620:ea:f:ffff:ffff:ffff:ffff:ffff,US +2620:ea:4000::,2620:ea:4000:ffff:ffff:ffff:ffff:ffff,US +2620:ea:8000::,2620:ea:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ea:c000::,2620:ea:c000:ffff:ffff:ffff:ffff:ffff,US +2620:eb::,2620:eb::ffff:ffff:ffff:ffff:ffff,US +2620:eb:4000::,2620:eb:4000:ffff:ffff:ffff:ffff:ffff,US +2620:eb:8000::,2620:eb:8000:ffff:ffff:ffff:ffff:ffff,US +2620:eb:c000::,2620:eb:c000:ffff:ffff:ffff:ffff:ffff,US +2620:ec::,2620:ec::ffff:ffff:ffff:ffff:ffff,US +2620:ec:4000::,2620:ec:4000:ffff:ffff:ffff:ffff:ffff,US +2620:ec:8000::,2620:ec:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ec:c000::,2620:ec:c000:ffff:ffff:ffff:ffff:ffff,US +2620:ed::,2620:ed::ffff:ffff:ffff:ffff:ffff,US +2620:ed:4000::,2620:ed:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:ed:8000::,2620:ed:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ed:c000::,2620:ed:c000:ffff:ffff:ffff:ffff:ffff,US +2620:ee::,2620:ee::ffff:ffff:ffff:ffff:ffff,US +2620:ee:4000::,2620:ee:4000:ffff:ffff:ffff:ffff:ffff,US +2620:ee:8000::,2620:ee:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ee:c000::,2620:ee:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:ef:4000::,2620:ef:4000:ffff:ffff:ffff:ffff:ffff,US +2620:ef:8000::,2620:ef:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ef:c000::,2620:ef:c000:ffff:ffff:ffff:ffff:ffff,US +2620:f0::,2620:f0::ffff:ffff:ffff:ffff:ffff,US +2620:f0:4000::,2620:f0:400f:ffff:ffff:ffff:ffff:ffff,US +2620:f0:8000::,2620:f0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f0:c000::,2620:f0:c002:ffff:ffff:ffff:ffff:ffff,US +2620:f0:c003::,2620:f0:c003:ffff:ffff:ffff:ffff:ffff,NL +2620:f0:c004::,2620:f0:c004:ffff:ffff:ffff:ffff:ffff,US +2620:f0:c005::,2620:f0:c005:ffff:ffff:ffff:ffff:ffff,SG +2620:f0:c006::,2620:f0:c009:ffff:ffff:ffff:ffff:ffff,US +2620:f0:c00a::,2620:f0:c00a:ffff:ffff:ffff:ffff:ffff,CA +2620:f0:c00b::,2620:f0:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:f1:4000::,2620:f1:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:f1:8000::,2620:f1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f1:c000::,2620:f1:c000:ffff:ffff:ffff:ffff:ffff,US +2620:f2::,2620:f2::ffff:ffff:ffff:ffff:ffff,CA +2620:f2:4000::,2620:f2:4000:ffff:ffff:ffff:ffff:ffff,US +2620:f2:8000::,2620:f2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f2:c000::,2620:f2:c000:ffff:ffff:ffff:ffff:ffff,US +2620:f3::,2620:f3::ffff:ffff:ffff:ffff:ffff,US +2620:f3:4000::,2620:f3:4000:ffff:ffff:ffff:ffff:ffff,US +2620:f3:8000::,2620:f3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f3:c000::,2620:f3:c000:ffff:ffff:ffff:ffff:ffff,US +2620:f4::,2620:f4::ffff:ffff:ffff:ffff:ffff,US +2620:f4:4000::,2620:f4:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:f4:8000::,2620:f4:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:f4:c000::,2620:f4:c000:ffff:ffff:ffff:ffff:ffff,US +2620:f5::,2620:f5::ffff:ffff:ffff:ffff:ffff,US +2620:f5:4000::,2620:f5:4000:ffff:ffff:ffff:ffff:ffff,US +2620:f5:8000::,2620:f5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f5:c000::,2620:f5:c000:ffff:ffff:ffff:ffff:ffff,US +2620:f6::,2620:f6::ffff:ffff:ffff:ffff:ffff,CA +2620:f6:4000::,2620:f6:400f:ffff:ffff:ffff:ffff:ffff,US +2620:f6:8000::,2620:f6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f6:c000::,2620:f6:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:f7::,2620:f7::ffff:ffff:ffff:ffff:ffff,US +2620:f7:4000::,2620:f7:4000:ffff:ffff:ffff:ffff:ffff,US +2620:f7:8000::,2620:f7:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f7:c000::,2620:f7:c000:ffff:ffff:ffff:ffff:ffff,US +2620:f8::,2620:f8::ffff:ffff:ffff:ffff:ffff,US +2620:f8:4000::,2620:f8:4000:ffff:ffff:ffff:ffff:ffff,US +2620:f8:8000::,2620:f8:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f8:c000::,2620:f8:c000:ffff:ffff:ffff:ffff:ffff,US +2620:f9::,2620:f9:f:ffff:ffff:ffff:ffff:ffff,US +2620:f9:4000::,2620:f9:4000:ffff:ffff:ffff:ffff:ffff,US +2620:f9:8000::,2620:f9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f9:c000::,2620:f9:c000:ffff:ffff:ffff:ffff:ffff,US +2620:fa::,2620:fa::ffff:ffff:ffff:ffff:ffff,US +2620:fa:4000::,2620:fa:4000:ffff:ffff:ffff:ffff:ffff,US +2620:fa:8000::,2620:fa:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:fa:c000::,2620:fa:c000:ffff:ffff:ffff:ffff:ffff,US +2620:fb::,2620:fb::ffff:ffff:ffff:ffff:ffff,US +2620:fb:4000::,2620:fb:4000:ffff:ffff:ffff:ffff:ffff,US +2620:fb:8000::,2620:fb:8000:ffff:ffff:ffff:ffff:ffff,US +2620:fc::,2620:fc::ffff:ffff:ffff:ffff:ffff,CA +2620:fc:4000::,2620:fc:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:fc:8000::,2620:fc:8000:ffff:ffff:ffff:ffff:ffff,US +2620:fc:c000::,2620:fc:c000:ffff:ffff:ffff:ffff:ffff,US +2620:fd::,2620:fd::ffff:ffff:ffff:ffff:ffff,CA +2620:fd:4000::,2620:fd:4000:ffff:ffff:ffff:ffff:ffff,US +2620:fd:8000::,2620:fd:8000:ffff:ffff:ffff:ffff:ffff,US +2620:fd:c000::,2620:fd:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:fe::,2620:fe::ffff:ffff:ffff:ffff:ffff,US +2620:fe:2040::,2620:fe:2040:ffff:ffff:ffff:ffff:ffff,US +2620:fe:8000::,2620:fe:8000:ffff:ffff:ffff:ffff:ffff,US +2620:fe:c000::,2620:fe:c000:ffff:ffff:ffff:ffff:ffff,US +2620:ff::,2620:ff::ffff:ffff:ffff:ffff:ffff,US +2620:ff:4000::,2620:ff:4000:ffff:ffff:ffff:ffff:ffff,US +2620:ff:8000::,2620:ff:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ff:c000::,2620:ff:c000:ffff:ffff:ffff:ffff:ffff,US +2620:100::,2620:100:f:ffff:ffff:ffff:ffff:ffff,US +2620:100:3000::,2620:100:3007:ffff:ffff:ffff:ffff:ffff,US +2620:100:4000::,2620:100:403f:ffff:ffff:ffff:ffff:ffff,US +2620:100:5000::,2620:100:5007:ffff:ffff:ffff:ffff:ffff,US +2620:100:6000::,2620:100:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:100:7000::,2620:100:700f:ffff:ffff:ffff:ffff:ffff,US +2620:100:8000::,2620:100:8003:ffff:ffff:ffff:ffff:ffff,US +2620:100:9000::,2620:100:900f:ffff:ffff:ffff:ffff:ffff,US +2620:100:a000::,2620:100:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:100:c000::,2620:100:c03f:ffff:ffff:ffff:ffff:ffff,US +2620:100:d000::,2620:100:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:100:e000::,2620:100:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:100:f000::,2620:100:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:101::,2620:101:3:ffff:ffff:ffff:ffff:ffff,US +2620:101:1000::,2620:101:103f:ffff:ffff:ffff:ffff:ffff,US +2620:101:2000::,2620:101:201f:ffff:ffff:ffff:ffff:ffff,US +2620:101:3000::,2620:101:303f:ffff:ffff:ffff:ffff:ffff,US +2620:101:4000::,2620:101:403f:ffff:ffff:ffff:ffff:ffff,US +2620:101:5000::,2620:101:503f:ffff:ffff:ffff:ffff:ffff,US +2620:101:6000::,2620:101:6001:ffff:ffff:ffff:ffff:ffff,US +2620:101:7000::,2620:101:7001:ffff:ffff:ffff:ffff:ffff,US +2620:101:8000::,2620:101:80f1:ffff:ffff:ffff:ffff:ffff,US +2620:101:80f2::,2620:101:80f2:7fff:ffff:ffff:ffff:ffff,CA +2620:101:80f2:8000::,2620:101:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:101:9000::,2620:101:900f:ffff:ffff:ffff:ffff:ffff,US +2620:101:b000::,2620:101:b07f:ffff:ffff:ffff:ffff:ffff,US +2620:101:c000::,2620:101:c0ff:ffff:ffff:ffff:ffff:ffff,CA +2620:101:d000::,2620:101:d007:ffff:ffff:ffff:ffff:ffff,US +2620:101:e000::,2620:101:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:101:f000::,2620:101:f001:ffff:ffff:ffff:ffff:ffff,CA +2620:102::,2620:102:f:ffff:ffff:ffff:ffff:ffff,US +2620:102:2000::,2620:102:200f:ffff:ffff:ffff:ffff:ffff,US +2620:102:3000::,2620:102:300f:ffff:ffff:ffff:ffff:ffff,US +2620:102:4000::,2620:102:403f:ffff:ffff:ffff:ffff:ffff,US +2620:102:5000::,2620:102:501f:ffff:ffff:ffff:ffff:ffff,US +2620:102:6000::,2620:102:6003:ffff:ffff:ffff:ffff:ffff,US +2620:102:7000::,2620:102:700f:ffff:ffff:ffff:ffff:ffff,US +2620:102:8000::,2620:102:800f:ffff:ffff:ffff:ffff:ffff,US +2620:102:9000::,2620:102:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:102:b000::,2620:102:b001:ffff:ffff:ffff:ffff:ffff,US +2620:102:c000::,2620:102:c007:ffff:ffff:ffff:ffff:ffff,US +2620:102:d000::,2620:102:d07f:ffff:ffff:ffff:ffff:ffff,US +2620:102:e000::,2620:102:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:102:f000::,2620:102:f003:ffff:ffff:ffff:ffff:ffff,US +2620:103::,2620:103:7:ffff:ffff:ffff:ffff:ffff,US +2620:103:1000::,2620:103:100f:ffff:ffff:ffff:ffff:ffff,US +2620:103:2000::,2620:103:200f:ffff:ffff:ffff:ffff:ffff,CA +2620:103:3000::,2620:103:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:103:4000::,2620:103:400f:ffff:ffff:ffff:ffff:ffff,US +2620:103:5000::,2620:103:500f:ffff:ffff:ffff:ffff:ffff,US +2620:103:6000::,2620:103:600f:ffff:ffff:ffff:ffff:ffff,US +2620:103:7000::,2620:103:700f:ffff:ffff:ffff:ffff:ffff,US +2620:103:8000::,2620:103:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:103:9000::,2620:103:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:103:a000::,2620:103:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:103:b000::,2620:103:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:103:c000::,2620:103:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:103:d000::,2620:103:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:103:e000::,2620:103:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:104::,2620:104:ff:ffff:ffff:ffff:ffff:ffff,US +2620:104:1000::,2620:104:100f:ffff:ffff:ffff:ffff:ffff,US +2620:104:2000::,2620:104:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:104:3000::,2620:104:300f:ffff:ffff:ffff:ffff:ffff,US +2620:104:4000::,2620:104:4001:ffff:ffff:ffff:ffff:ffff,GB +2620:104:4002::,2620:104:4003:ffff:ffff:ffff:ffff:ffff,US +2620:104:4004::,2620:104:4007:ffff:ffff:ffff:ffff:ffff,GB +2620:104:4008::,2620:104:400f:ffff:ffff:ffff:ffff:ffff,US +2620:104:5000::,2620:104:500f:ffff:ffff:ffff:ffff:ffff,US +2620:104:6000::,2620:104:600f:ffff:ffff:ffff:ffff:ffff,US +2620:104:8000::,2620:104:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:104:9000::,2620:104:900f:ffff:ffff:ffff:ffff:ffff,US +2620:104:a000::,2620:104:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:104:b000::,2620:104:b01f:ffff:ffff:ffff:ffff:ffff,US +2620:104:c000::,2620:104:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:104:d000::,2620:104:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:104:e000::,2620:104:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:104:f000::,2620:104:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:105::,2620:105:f:ffff:ffff:ffff:ffff:ffff,CA +2620:105:1000::,2620:105:100f:ffff:ffff:ffff:ffff:ffff,US +2620:105:2000::,2620:105:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:105:3000::,2620:105:300f:ffff:ffff:ffff:ffff:ffff,US +2620:105:4000::,2620:105:400f:ffff:ffff:ffff:ffff:ffff,US +2620:105:5000::,2620:105:500f:ffff:ffff:ffff:ffff:ffff,US +2620:105:6000::,2620:105:600f:ffff:ffff:ffff:ffff:ffff,US +2620:105:7000::,2620:105:700f:ffff:ffff:ffff:ffff:ffff,US +2620:105:8000::,2620:105:800f:ffff:ffff:ffff:ffff:ffff,US +2620:105:9000::,2620:105:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:105:a000::,2620:105:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:105:b000::,2620:105:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:105:c000::,2620:105:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:105:e000::,2620:105:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:105:f000::,2620:105:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:106::,2620:106:f:ffff:ffff:ffff:ffff:ffff,US +2620:106:1000::,2620:106:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:106:2000::,2620:106:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:106:3000::,2620:106:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:106:4000::,2620:106:400f:ffff:ffff:ffff:ffff:ffff,US +2620:106:5000::,2620:106:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:106:6000::,2620:106:600f:ffff:ffff:ffff:ffff:ffff,US +2620:106:7000::,2620:106:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:106:8000::,2620:106:800f:ffff:ffff:ffff:ffff:ffff,US +2620:106:9000::,2620:106:900f:ffff:ffff:ffff:ffff:ffff,US +2620:106:a000::,2620:106:a000:ffff:ffff:ffff:ffff:ffff,US +2620:106:a001::,2620:106:a001:7fff:ffff:ffff:ffff:ffff,IN +2620:106:a001:8000::,2620:106:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:106:b000::,2620:106:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:106:c000::,2620:106:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:106:d000::,2620:106:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:106:e000::,2620:106:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:106:f000::,2620:106:f00f:ffff:ffff:ffff:ffff:ffff,CA +2620:107::,2620:107:ff:ffff:ffff:ffff:ffff:ffff,US +2620:107:1000::,2620:107:100f:ffff:ffff:ffff:ffff:ffff,US +2620:107:2000::,2620:107:200f:ffff:ffff:ffff:ffff:ffff,US +2620:107:3000::,2620:107:300f:ffff:ffff:ffff:ffff:ffff,US +2620:107:4000::,2620:107:4000:77ff:ffff:ffff:ffff:ffff,US +2620:107:4000:7800::,2620:107:4000:78ff:ffff:ffff:ffff:ffff,CA +2620:107:4000:7900::,2620:107:400f:ffff:ffff:ffff:ffff:ffff,US +2620:107:5000::,2620:107:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:107:6000::,2620:107:600f:ffff:ffff:ffff:ffff:ffff,US +2620:107:7000::,2620:107:700f:ffff:ffff:ffff:ffff:ffff,US +2620:107:8000::,2620:107:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:107:9000::,2620:107:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:107:a000::,2620:107:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:107:c000::,2620:107:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:107:d000::,2620:107:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:107:e000::,2620:107:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:107:f000::,2620:107:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:108::,2620:108:ff:ffff:ffff:ffff:ffff:ffff,US +2620:108:1000::,2620:108:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:108:2000::,2620:108:200f:ffff:ffff:ffff:ffff:ffff,US +2620:108:3000::,2620:108:300f:ffff:ffff:ffff:ffff:ffff,US +2620:108:4000::,2620:108:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:108:5000::,2620:108:500f:ffff:ffff:ffff:ffff:ffff,US +2620:108:6000::,2620:108:700f:ffff:ffff:ffff:ffff:ffff,US +2620:108:8000::,2620:108:800f:ffff:ffff:ffff:ffff:ffff,US +2620:108:9000::,2620:108:900f:ffff:ffff:ffff:ffff:ffff,US +2620:108:a000::,2620:108:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:108:b000::,2620:108:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:108:c000::,2620:108:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:108:d000::,2620:108:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:108:e000::,2620:108:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:108:f000::,2620:108:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:109::,2620:109:ff:ffff:ffff:ffff:ffff:ffff,US +2620:109:1000::,2620:109:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:109:2000::,2620:109:200f:ffff:ffff:ffff:ffff:ffff,US +2620:109:3000::,2620:109:300f:ffff:ffff:ffff:ffff:ffff,US +2620:109:4000::,2620:109:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:109:5000::,2620:109:500f:ffff:ffff:ffff:ffff:ffff,US +2620:109:6000::,2620:109:600f:ffff:ffff:ffff:ffff:ffff,US +2620:109:7000::,2620:109:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:109:8000::,2620:109:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:109:9000::,2620:109:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:109:a000::,2620:109:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:109:b000::,2620:109:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:109:c000::,2620:109:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:109:d000::,2620:109:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:109:e000::,2620:109:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:109:f000::,2620:109:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:10a::,2620:10a:f:ffff:ffff:ffff:ffff:ffff,US +2620:10a:1000::,2620:10a:100f:ffff:ffff:ffff:ffff:ffff,US +2620:10a:2000::,2620:10a:200f:ffff:ffff:ffff:ffff:ffff,US +2620:10a:3000::,2620:10a:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:10a:4000::,2620:10a:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:10a:5000::,2620:10a:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:10a:6000::,2620:10a:600f:ffff:ffff:ffff:ffff:ffff,US +2620:10a:8000::,2620:10a:80ff:ffff:ffff:ffff:ffff:ffff,CA +2620:10a:9000::,2620:10a:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:10a:a000::,2620:10a:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10a:b000::,2620:10a:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10a:c000::,2620:10a:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:10a:d000::,2620:10a:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:10a:e000::,2620:10a:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10a:f000::,2620:10a:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10b::,2620:10b:f:ffff:ffff:ffff:ffff:ffff,US +2620:10b:1000::,2620:10b:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:10b:2000::,2620:10b:200f:ffff:ffff:ffff:ffff:ffff,US +2620:10b:3000::,2620:10b:30ff:ffff:ffff:ffff:ffff:ffff,CA +2620:10b:4000::,2620:10b:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:10b:5000::,2620:10b:500f:ffff:ffff:ffff:ffff:ffff,US +2620:10b:6000::,2620:10b:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:10b:7000::,2620:10b:700f:ffff:ffff:ffff:ffff:ffff,US +2620:10b:8000::,2620:10b:800f:ffff:ffff:ffff:ffff:ffff,US +2620:10b:9000::,2620:10b:900f:ffff:ffff:ffff:ffff:ffff,US +2620:10b:a000::,2620:10b:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:10b:b000::,2620:10b:b00f:ffff:ffff:ffff:ffff:ffff,CA +2620:10b:c000::,2620:10b:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10b:d000::,2620:10b:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:10b:e000::,2620:10b:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10b:f000::,2620:10b:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10c::,2620:10c:f:ffff:ffff:ffff:ffff:ffff,US +2620:10c:1000::,2620:10c:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:10c:2000::,2620:10c:200f:ffff:ffff:ffff:ffff:ffff,US +2620:10c:3000::,2620:10c:300f:ffff:ffff:ffff:ffff:ffff,US +2620:10c:4000::,2620:10c:400f:ffff:ffff:ffff:ffff:ffff,US +2620:10c:5000::,2620:10c:500f:ffff:ffff:ffff:ffff:ffff,US +2620:10c:6000::,2620:10c:600f:ffff:ffff:ffff:ffff:ffff,US +2620:10c:7000::,2620:10c:700f:ffff:ffff:ffff:ffff:ffff,US +2620:10c:9000::,2620:10c:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:10c:a000::,2620:10c:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:10c:b000::,2620:10c:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10c:c000::,2620:10c:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10c:d000::,2620:10c:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:10c:e000::,2620:10c:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10c:f000::,2620:10c:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10d::,2620:10d:f:ffff:ffff:ffff:ffff:ffff,US +2620:10d:1000::,2620:10d:100f:ffff:ffff:ffff:ffff:ffff,US +2620:10d:2000::,2620:10d:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:10d:3000::,2620:10d:300f:ffff:ffff:ffff:ffff:ffff,US +2620:10d:4000::,2620:10d:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:10d:5000::,2620:10d:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:10d:6000::,2620:10d:600f:ffff:ffff:ffff:ffff:ffff,US +2620:10d:7000::,2620:10d:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:10d:8000::,2620:10d:800f:ffff:ffff:ffff:ffff:ffff,US +2620:10d:9000::,2620:10d:900f:ffff:ffff:ffff:ffff:ffff,US +2620:10d:a000::,2620:10d:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10d:b000::,2620:10d:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:10d:c000::,2620:10d:c091:ffff:ffff:ffff:ffff:ffff,US +2620:10d:c092::,2620:10d:c092:7fff:ffff:ffff:ffff:ffff,IE +2620:10d:c092:8000::,2620:10d:c092:ffff:ffff:ffff:ffff:ffff,US +2620:10d:c093::,2620:10d:c093:7fff:ffff:ffff:ffff:ffff,FR +2620:10d:c093:8000::,2620:10d:c099:ffff:ffff:ffff:ffff:ffff,US +2620:10d:c09a::,2620:10d:c09a:7fff:ffff:ffff:ffff:ffff,BR +2620:10d:c09a:8000::,2620:10d:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10d:d000::,2620:10d:d00f:ffff:ffff:ffff:ffff:ffff,CA +2620:10d:e000::,2620:10d:e00f:ffff:ffff:ffff:ffff:ffff,CA +2620:10e::,2620:10e:f:ffff:ffff:ffff:ffff:ffff,US +2620:10e:1000::,2620:10e:100f:ffff:ffff:ffff:ffff:ffff,US +2620:10e:2000::,2620:10e:200f:ffff:ffff:ffff:ffff:ffff,US +2620:10e:3000::,2620:10e:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:10e:4000::,2620:10e:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:10e:5000::,2620:10e:500f:ffff:ffff:ffff:ffff:ffff,US +2620:10e:6000::,2620:10e:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:10e:7000::,2620:10e:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:10e:8000::,2620:10e:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:10e:9000::,2620:10e:900f:ffff:ffff:ffff:ffff:ffff,US +2620:10e:a000::,2620:10e:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:10e:b000::,2620:10e:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10e:c000::,2620:10e:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:10e:d000::,2620:10e:d00f:ffff:ffff:ffff:ffff:ffff,BL +2620:10e:e000::,2620:10e:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:10e:f000::,2620:10e:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:10f::,2620:10f:f:ffff:ffff:ffff:ffff:ffff,US +2620:10f:1000::,2620:10f:100f:ffff:ffff:ffff:ffff:ffff,US +2620:10f:2000::,2620:10f:200f:ffff:ffff:ffff:ffff:ffff,US +2620:10f:3000::,2620:10f:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:10f:4000::,2620:10f:400f:ffff:ffff:ffff:ffff:ffff,US +2620:10f:5000::,2620:10f:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:10f:6000::,2620:10f:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:10f:7000::,2620:10f:700f:ffff:ffff:ffff:ffff:ffff,US +2620:10f:8000::,2620:10f:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:10f:9000::,2620:10f:900f:ffff:ffff:ffff:ffff:ffff,US +2620:10f:a000::,2620:10f:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:10f:b000::,2620:10f:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10f:c000::,2620:10f:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:10f:d000::,2620:10f:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:10f:e000::,2620:10f:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:10f:f000::,2620:10f:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:110::,2620:110:f:ffff:ffff:ffff:ffff:ffff,US +2620:110:1000::,2620:110:100f:ffff:ffff:ffff:ffff:ffff,US +2620:110:2000::,2620:110:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:110:3000::,2620:110:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:110:4000::,2620:110:400f:ffff:ffff:ffff:ffff:ffff,US +2620:110:5000::,2620:110:500f:ffff:ffff:ffff:ffff:ffff,US +2620:110:6000::,2620:110:600f:ffff:ffff:ffff:ffff:ffff,US +2620:110:7000::,2620:110:700f:ffff:ffff:ffff:ffff:ffff,US +2620:110:8000::,2620:110:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:110:9000::,2620:110:900f:ffff:ffff:ffff:ffff:ffff,US +2620:110:a000::,2620:110:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:110:d000::,2620:110:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:110:e000::,2620:110:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:110:f000::,2620:110:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:111::,2620:111:ff:ffff:ffff:ffff:ffff:ffff,US +2620:111:1000::,2620:111:100f:ffff:ffff:ffff:ffff:ffff,US +2620:111:2000::,2620:111:200f:ffff:ffff:ffff:ffff:ffff,US +2620:111:3000::,2620:111:300f:ffff:ffff:ffff:ffff:ffff,US +2620:111:4000::,2620:111:400f:ffff:ffff:ffff:ffff:ffff,US +2620:111:5000::,2620:111:500f:ffff:ffff:ffff:ffff:ffff,US +2620:111:6000::,2620:111:600f:ffff:ffff:ffff:ffff:ffff,US +2620:111:7000::,2620:111:700f:ffff:ffff:ffff:ffff:ffff,US +2620:111:8000::,2620:111:800f:ffff:ffff:ffff:ffff:ffff,US +2620:111:9000::,2620:111:900f:ffff:ffff:ffff:ffff:ffff,US +2620:111:a000::,2620:111:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:111:b000::,2620:111:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:111:c000::,2620:111:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:111:d000::,2620:111:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:111:e000::,2620:111:e00f:ffff:ffff:ffff:ffff:ffff,CA +2620:111:f000::,2620:111:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:112:1000::,2620:112:107f:ffff:ffff:ffff:ffff:ffff,US +2620:112:2000::,2620:112:200f:ffff:ffff:ffff:ffff:ffff,US +2620:112:3000::,2620:112:300f:ffff:ffff:ffff:ffff:ffff,US +2620:112:4000::,2620:112:400f:ffff:ffff:ffff:ffff:ffff,US +2620:112:5000::,2620:112:500f:ffff:ffff:ffff:ffff:ffff,US +2620:112:6000::,2620:112:600f:ffff:ffff:ffff:ffff:ffff,US +2620:112:8000::,2620:112:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:112:9000::,2620:112:900f:ffff:ffff:ffff:ffff:ffff,CA +2620:112:a000::,2620:112:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:112:b000::,2620:112:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:112:c000::,2620:112:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:112:d000::,2620:112:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:112:e000::,2620:112:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:112:f000::,2620:112:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:113::,2620:113:f:ffff:ffff:ffff:ffff:ffff,US +2620:113:1000::,2620:113:100f:ffff:ffff:ffff:ffff:ffff,US +2620:113:2000::,2620:113:200f:ffff:ffff:ffff:ffff:ffff,CA +2620:113:3000::,2620:113:300f:ffff:ffff:ffff:ffff:ffff,US +2620:113:4000::,2620:113:400f:ffff:ffff:ffff:ffff:ffff,US +2620:113:5000::,2620:113:500f:ffff:ffff:ffff:ffff:ffff,US +2620:113:6000::,2620:113:600f:ffff:ffff:ffff:ffff:ffff,US +2620:113:7000::,2620:113:700f:ffff:ffff:ffff:ffff:ffff,US +2620:113:8000::,2620:113:80bf:ffff:ffff:ffff:ffff:ffff,US +2620:113:80c0::,2620:113:80c0:7fff:ffff:ffff:ffff:ffff,DE +2620:113:80c0:8000::,2620:113:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:113:9000::,2620:113:900f:ffff:ffff:ffff:ffff:ffff,US +2620:113:a000::,2620:113:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:113:c000::,2620:113:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:113:d000::,2620:113:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:113:e000::,2620:113:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:113:f000::,2620:113:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:114::,2620:114:f:ffff:ffff:ffff:ffff:ffff,US +2620:114:1000::,2620:114:100f:ffff:ffff:ffff:ffff:ffff,US +2620:114:2000::,2620:114:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:114:3000::,2620:114:300f:ffff:ffff:ffff:ffff:ffff,US +2620:114:5000::,2620:114:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:114:8000::,2620:114:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:114:9000::,2620:114:900f:ffff:ffff:ffff:ffff:ffff,US +2620:114:a000::,2620:114:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:114:b000::,2620:114:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:114:c000::,2620:114:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:114:d000::,2620:114:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:114:e000::,2620:114:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:114:f000::,2620:114:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:115::,2620:115:f:ffff:ffff:ffff:ffff:ffff,US +2620:115:15::,2620:115:15:7fff:ffff:ffff:ffff:ffff,US +2620:115:1000::,2620:115:100f:ffff:ffff:ffff:ffff:ffff,US +2620:115:2000::,2620:115:200f:ffff:ffff:ffff:ffff:ffff,US +2620:115:3000::,2620:115:300f:ffff:ffff:ffff:ffff:ffff,US +2620:115:4000::,2620:115:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:115:5000::,2620:115:500f:ffff:ffff:ffff:ffff:ffff,US +2620:115:6000::,2620:115:600f:ffff:ffff:ffff:ffff:ffff,US +2620:115:7000::,2620:115:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:115:8000::,2620:115:800f:ffff:ffff:ffff:ffff:ffff,US +2620:115:9000::,2620:115:900f:ffff:ffff:ffff:ffff:ffff,US +2620:115:b000::,2620:115:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:115:c000::,2620:115:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:115:d000::,2620:115:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:115:e000::,2620:115:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:115:f000::,2620:115:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:116::,2620:116:f:ffff:ffff:ffff:ffff:ffff,US +2620:116:1000::,2620:116:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:116:2000::,2620:116:200f:ffff:ffff:ffff:ffff:ffff,US +2620:116:3000::,2620:116:300f:ffff:ffff:ffff:ffff:ffff,US +2620:116:4000::,2620:116:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:116:5000::,2620:116:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:116:6000::,2620:116:600f:ffff:ffff:ffff:ffff:ffff,US +2620:116:7000::,2620:116:700f:ffff:ffff:ffff:ffff:ffff,US +2620:116:8000::,2620:116:8086:ffff:ffff:ffff:ffff:ffff,US +2620:116:8087::,2620:116:8087:7fff:ffff:ffff:ffff:ffff,AU +2620:116:8087:8000::,2620:116:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:116:9000::,2620:116:90ff:ffff:ffff:ffff:ffff:ffff,CA +2620:116:a000::,2620:116:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:116:b000::,2620:116:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:116:c000::,2620:116:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:116:d000::,2620:116:d0ff:ffff:ffff:ffff:ffff:ffff,CA +2620:116:e000::,2620:116:e0ff:ffff:ffff:ffff:ffff:ffff,CA +2620:116:f000::,2620:116:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:117::,2620:117:ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:1000::,2620:117:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:2000::,2620:117:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:3000::,2620:117:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:4000::,2620:117:400f:ffff:ffff:ffff:ffff:ffff,US +2620:117:5000::,2620:117:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:6000::,2620:117:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:7000::,2620:117:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:8000::,2620:117:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:9000::,2620:117:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:a000::,2620:117:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:b000::,2620:117:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:c000::,2620:117:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:117:d000::,2620:117:d0ff:ffff:ffff:ffff:ffff:ffff,CA +2620:117:e000::,2620:117:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:118:1000::,2620:118:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:118:2000::,2620:118:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:118:3000::,2620:118:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:118:4000::,2620:118:400f:ffff:ffff:ffff:ffff:ffff,US +2620:118:5000::,2620:118:500f:ffff:ffff:ffff:ffff:ffff,US +2620:118:6000::,2620:118:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:118:7000::,2620:118:700f:ffff:ffff:ffff:ffff:ffff,US +2620:118:8000::,2620:118:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:118:9000::,2620:118:900f:ffff:ffff:ffff:ffff:ffff,US +2620:118:a000::,2620:118:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:118:b000::,2620:118:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:118:c000::,2620:118:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:118:d000::,2620:118:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:118:e000::,2620:118:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:118:f000::,2620:118:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:119::,2620:119:f:ffff:ffff:ffff:ffff:ffff,US +2620:119:10::,2620:119:11:ffff:ffff:ffff:ffff:ffff,CA +2620:119:12::,2620:119:ff:ffff:ffff:ffff:ffff:ffff,US +2620:119:1000::,2620:119:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:119:2000::,2620:119:200f:ffff:ffff:ffff:ffff:ffff,US +2620:119:3000::,2620:119:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:119:4000::,2620:119:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:119:5000::,2620:119:500d:ffff:ffff:ffff:ffff:ffff,US +2620:119:500e::,2620:119:500e:7fff:ffff:ffff:ffff:ffff,BR +2620:119:500e:8000::,2620:119:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:119:6000::,2620:119:600f:ffff:ffff:ffff:ffff:ffff,US +2620:119:7000::,2620:119:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:119:8000::,2620:119:800f:ffff:ffff:ffff:ffff:ffff,US +2620:119:9000::,2620:119:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:119:a000::,2620:119:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:119:b000::,2620:119:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:119:c000::,2620:119:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:119:d000::,2620:119:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:119:e000::,2620:119:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:119:f000::,2620:119:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:11a:1000::,2620:11a:100f:ffff:ffff:ffff:ffff:ffff,CA +2620:11a:3000::,2620:11a:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:11a:4000::,2620:11a:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:11a:6000::,2620:11a:600f:ffff:ffff:ffff:ffff:ffff,US +2620:11a:7000::,2620:11a:700f:ffff:ffff:ffff:ffff:ffff,US +2620:11a:8000::,2620:11a:800f:ffff:ffff:ffff:ffff:ffff,US +2620:11a:9000::,2620:11a:900f:ffff:ffff:ffff:ffff:ffff,US +2620:11a:a000::,2620:11a:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11a:b000::,2620:11a:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:11a:c000::,2620:11a:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11a:d000::,2620:11a:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11a:e000::,2620:11a:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:11a:f000::,2620:11b:ff:ffff:ffff:ffff:ffff:ffff,US +2620:11b:1000::,2620:11b:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:11b:2000::,2620:11b:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:11b:3000::,2620:11b:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:11b:4000::,2620:11b:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:11b:5000::,2620:11b:500f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:7000::,2620:11b:700f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:8000::,2620:11b:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:11b:9000::,2620:11b:900f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:a000::,2620:11b:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:b000::,2620:11b:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:c000::,2620:11b:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:d000::,2620:11b:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11b:e000::,2620:11b:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11b:f000::,2620:11b:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11c::,2620:11c:f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:1000::,2620:11c:10ff:ffff:ffff:ffff:ffff:ffff,BB +2620:11c:2000::,2620:11c:20ff:ffff:ffff:ffff:ffff:ffff,CA +2620:11c:3000::,2620:11c:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:11c:4000::,2620:11c:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:11c:5000::,2620:11c:500f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:6000::,2620:11c:600f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:7000::,2620:11c:700f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:8000::,2620:11c:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:11c:9000::,2620:11c:900f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:a000::,2620:11c:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:b000::,2620:11c:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:c000::,2620:11c:c00f:ffff:ffff:ffff:ffff:ffff,CA +2620:11c:d000::,2620:11c:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:e000::,2620:11c:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:f000::,2620:11c:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:11d::,2620:11d:f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:1000::,2620:11d:100f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:2000::,2620:11d:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:11d:3000::,2620:11d:300f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:4000::,2620:11d:400f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:5000::,2620:11d:500f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:6000::,2620:11d:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:11d:7000::,2620:11d:700f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:8000::,2620:11d:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:11d:9000::,2620:11d:900f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:a000::,2620:11d:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:b000::,2620:11d:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11d:c000::,2620:11d:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:d000::,2620:11d:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11d:e000::,2620:11d:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11d:f000::,2620:11d:f0ff:ffff:ffff:ffff:ffff:ffff,CA +2620:11e::,2620:11e:ff:ffff:ffff:ffff:ffff:ffff,US +2620:11e:1000::,2620:11e:100f:ffff:ffff:ffff:ffff:ffff,US +2620:11e:2000::,2620:11e:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:11e:3000::,2620:11e:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:11e:4000::,2620:11e:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:11e:5000::,2620:11e:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:11e:6000::,2620:11e:600f:ffff:ffff:ffff:ffff:ffff,US +2620:11e:7000::,2620:11e:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:11e:8000::,2620:11e:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:11e:9000::,2620:11e:900f:ffff:ffff:ffff:ffff:ffff,US +2620:11e:a000::,2620:11e:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:11e:b000::,2620:11e:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11e:c000::,2620:11e:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11e:d000::,2620:11e:d00f:ffff:ffff:ffff:ffff:ffff,CA +2620:11e:e000::,2620:11e:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:11e:f000::,2620:11e:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:11f::,2620:11f:f:ffff:ffff:ffff:ffff:ffff,US +2620:11f:1000::,2620:11f:100f:ffff:ffff:ffff:ffff:ffff,US +2620:11f:2000::,2620:11f:200f:ffff:ffff:ffff:ffff:ffff,US +2620:11f:3000::,2620:11f:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:11f:4000::,2620:11f:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:11f:5000::,2620:11f:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:11f:6000::,2620:11f:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:11f:7000::,2620:11f:700f:ffff:ffff:ffff:ffff:ffff,US +2620:11f:8000::,2620:11f:80ff:ffff:ffff:ffff:ffff:ffff,CA +2620:11f:9000::,2620:11f:900f:ffff:ffff:ffff:ffff:ffff,US +2620:11f:a000::,2620:11f:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:11f:b000::,2620:11f:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:11f:c000::,2620:11f:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11f:d000::,2620:11f:d009:ffff:ffff:ffff:ffff:ffff,US +2620:11f:d00a::,2620:11f:d00a:ffff:ffff:ffff:ffff:ffff,GB +2620:11f:d00b::,2620:11f:d00b:ffff:ffff:ffff:ffff:ffff,US +2620:11f:d00c::,2620:11f:d00c:ffff:ffff:ffff:ffff:ffff,GB +2620:11f:d00d::,2620:11f:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:11f:e000::,2620:11f:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11f:f000::,2620:11f:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:120::,2620:120:ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:1000::,2620:120:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:2000::,2620:120:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:3000::,2620:120:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:4000::,2620:120:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:5000::,2620:120:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:6000::,2620:120:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:7000::,2620:120:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:8000::,2620:120:800f:ffff:ffff:ffff:ffff:ffff,CA +2620:120:9000::,2620:120:900f:ffff:ffff:ffff:ffff:ffff,CA +2620:120:a000::,2620:120:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:b000::,2620:120:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:c000::,2620:120:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:d000::,2620:120:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:120:e000::,2620:120:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:120:f000::,2620:120:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:121::,2620:121:f:ffff:ffff:ffff:ffff:ffff,US +2620:121:1000::,2620:121:100f:ffff:ffff:ffff:ffff:ffff,US +2620:121:2000::,2620:121:200f:ffff:ffff:ffff:ffff:ffff,US +2620:121:3000::,2620:121:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:121:4000::,2620:121:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:121:5000::,2620:121:500f:ffff:ffff:ffff:ffff:ffff,US +2620:121:6000::,2620:121:600f:ffff:ffff:ffff:ffff:ffff,US +2620:121:7000::,2620:121:700f:ffff:ffff:ffff:ffff:ffff,US +2620:121:8000::,2620:121:800f:ffff:ffff:ffff:ffff:ffff,US +2620:121:9000::,2620:121:900f:ffff:ffff:ffff:ffff:ffff,US +2620:121:a000::,2620:121:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:121:b000::,2620:121:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:121:c000::,2620:121:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:121:d000::,2620:121:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:121:e000::,2620:121:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:121:f000::,2620:121:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:122::,2620:122:f:ffff:ffff:ffff:ffff:ffff,US +2620:122:1000::,2620:122:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:122:2000::,2620:122:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:122:3000::,2620:122:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:122:4000::,2620:122:400f:ffff:ffff:ffff:ffff:ffff,US +2620:122:6000::,2620:122:600f:ffff:ffff:ffff:ffff:ffff,US +2620:122:7000::,2620:122:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:122:8000::,2620:122:800f:ffff:ffff:ffff:ffff:ffff,US +2620:122:9000::,2620:122:900f:ffff:ffff:ffff:ffff:ffff,US +2620:122:a000::,2620:122:a0ff:ffff:ffff:ffff:ffff:ffff,BL +2620:122:b000::,2620:122:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:122:c000::,2620:122:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:122:d000::,2620:122:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:122:e000::,2620:122:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:122:f000::,2620:122:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:123::,2620:123:f:ffff:ffff:ffff:ffff:ffff,US +2620:123:1000::,2620:123:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:123:2000::,2620:123:200f:ffff:ffff:ffff:ffff:ffff,US +2620:123:3000::,2620:123:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:123:4000::,2620:123:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:123:5000::,2620:123:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:123:6000::,2620:123:600f:ffff:ffff:ffff:ffff:ffff,CA +2620:123:7000::,2620:123:700f:ffff:ffff:ffff:ffff:ffff,CA +2620:123:8000::,2620:123:800f:ffff:ffff:ffff:ffff:ffff,US +2620:123:9000::,2620:123:900f:ffff:ffff:ffff:ffff:ffff,US +2620:123:a000::,2620:123:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:123:b000::,2620:123:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:123:c000::,2620:123:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:123:d000::,2620:123:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:123:e000::,2620:123:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:123:f000::,2620:123:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:124::,2620:124:f:ffff:ffff:ffff:ffff:ffff,US +2620:124:1000::,2620:124:100f:ffff:ffff:ffff:ffff:ffff,US +2620:124:2000::,2620:124:200f:ffff:ffff:ffff:ffff:ffff,US +2620:124:3000::,2620:124:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:124:4000::,2620:124:400f:ffff:ffff:ffff:ffff:ffff,US +2620:124:5000::,2620:124:50ff:ffff:ffff:ffff:ffff:ffff,CA +2620:124:6000::,2620:124:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:124:7000::,2620:124:700f:ffff:ffff:ffff:ffff:ffff,US +2620:124:8000::,2620:124:800f:ffff:ffff:ffff:ffff:ffff,US +2620:124:9000::,2620:124:900f:ffff:ffff:ffff:ffff:ffff,US +2620:124:a000::,2620:124:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:124:b000::,2620:124:b0ff:ffff:ffff:ffff:ffff:ffff,CA +2620:124:c000::,2620:124:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:124:d000::,2620:124:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:124:e000::,2620:124:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:124:f000::,2620:124:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:125::,2620:125:ff:ffff:ffff:ffff:ffff:ffff,US +2620:125:1000::,2620:125:100f:ffff:ffff:ffff:ffff:ffff,US +2620:125:2000::,2620:125:200f:ffff:ffff:ffff:ffff:ffff,US +2620:125:3000::,2620:125:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:125:4000::,2620:125:400f:ffff:ffff:ffff:ffff:ffff,US +2620:125:5000::,2620:125:500f:ffff:ffff:ffff:ffff:ffff,CA +2620:125:6000::,2620:125:600f:ffff:ffff:ffff:ffff:ffff,US +2620:125:7000::,2620:125:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:125:8000::,2620:125:800f:ffff:ffff:ffff:ffff:ffff,US +2620:125:9000::,2620:125:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:125:a000::,2620:125:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:125:b000::,2620:125:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:125:c000::,2620:125:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:125:d000::,2620:125:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:125:e000::,2620:125:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:125:f000::,2620:125:f00f:ffff:ffff:ffff:ffff:ffff,CA +2620:126::,2620:126:f:ffff:ffff:ffff:ffff:ffff,US +2620:126:1000::,2620:126:100f:ffff:ffff:ffff:ffff:ffff,US +2620:126:2000::,2620:126:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:126:3000::,2620:126:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:126:4000::,2620:126:400f:ffff:ffff:ffff:ffff:ffff,US +2620:126:5000::,2620:126:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:126:6000::,2620:126:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:126:7000::,2620:126:700f:ffff:ffff:ffff:ffff:ffff,CA +2620:126:8000::,2620:126:800f:ffff:ffff:ffff:ffff:ffff,US +2620:126:9000::,2620:126:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:126:a000::,2620:126:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:126:b000::,2620:126:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:126:c000::,2620:126:c00f:ffff:ffff:ffff:ffff:ffff,CA +2620:126:d000::,2620:126:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:126:e000::,2620:126:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:126:f000::,2620:126:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:127::,2620:127:f:ffff:ffff:ffff:ffff:ffff,US +2620:127:1000::,2620:127:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:127:2000::,2620:127:200f:ffff:ffff:ffff:ffff:ffff,US +2620:127:3000::,2620:127:300f:ffff:ffff:ffff:ffff:ffff,US +2620:127:4000::,2620:127:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:127:5000::,2620:127:500f:ffff:ffff:ffff:ffff:ffff,US +2620:127:6000::,2620:127:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:127:7000::,2620:127:700f:ffff:ffff:ffff:ffff:ffff,US +2620:127:8000::,2620:127:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:127:9000::,2620:127:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:127:a000::,2620:127:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:127:b000::,2620:127:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:127:c000::,2620:127:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:127:d000::,2620:127:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:127:e000::,2620:127:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:127:f000::,2620:127:f00f:ffff:ffff:ffff:ffff:ffff,CA +2620:128::,2620:128:f:ffff:ffff:ffff:ffff:ffff,US +2620:128:1000::,2620:128:100f:ffff:ffff:ffff:ffff:ffff,US +2620:128:2000::,2620:128:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:128:3000::,2620:128:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:128:4000::,2620:128:400f:ffff:ffff:ffff:ffff:ffff,US +2620:128:5000::,2620:128:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:128:6000::,2620:128:600f:ffff:ffff:ffff:ffff:ffff,US +2620:128:7000::,2620:128:700f:ffff:ffff:ffff:ffff:ffff,US +2620:128:8000::,2620:128:800f:ffff:ffff:ffff:ffff:ffff,US +2620:128:a000::,2620:128:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:128:b000::,2620:128:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:128:c000::,2620:128:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:128:d000::,2620:128:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:128:e000::,2620:128:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:128:f000::,2620:128:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:129::,2620:129:f:ffff:ffff:ffff:ffff:ffff,US +2620:129:1000::,2620:129:100f:ffff:ffff:ffff:ffff:ffff,US +2620:129:2000::,2620:129:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:129:3000::,2620:129:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:129:4000::,2620:129:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:129:5000::,2620:129:500f:ffff:ffff:ffff:ffff:ffff,US +2620:129:6000::,2620:129:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:129:7000::,2620:129:700f:ffff:ffff:ffff:ffff:ffff,CA +2620:129:8000::,2620:129:800f:ffff:ffff:ffff:ffff:ffff,US +2620:129:9000::,2620:129:900f:ffff:ffff:ffff:ffff:ffff,US +2620:129:a000::,2620:129:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:129:b000::,2620:129:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:129:c000::,2620:129:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:129:d000::,2620:129:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:129:e000::,2620:129:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:129:f000::,2620:129:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:12a::,2620:12a:ff:ffff:ffff:ffff:ffff:ffff,CA +2620:12a:1000::,2620:12a:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:12a:2000::,2620:12a:200f:ffff:ffff:ffff:ffff:ffff,US +2620:12a:3000::,2620:12a:300f:ffff:ffff:ffff:ffff:ffff,US +2620:12a:4000::,2620:12a:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:12a:5000::,2620:12a:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:12a:6000::,2620:12a:600f:ffff:ffff:ffff:ffff:ffff,US +2620:12a:7000::,2620:12a:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:12a:8000::,2620:12a:800f:ffff:ffff:ffff:ffff:ffff,US +2620:12a:9000::,2620:12a:900f:ffff:ffff:ffff:ffff:ffff,US +2620:12a:a000::,2620:12a:a00f:ffff:ffff:ffff:ffff:ffff,CA +2620:12a:b000::,2620:12a:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:12a:c000::,2620:12a:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12a:d000::,2620:12a:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12a:e000::,2620:12a:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:12a:f000::,2620:12a:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12b::,2620:12b:f:ffff:ffff:ffff:ffff:ffff,US +2620:12b:1000::,2620:12b:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:12b:2000::,2620:12b:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:12b:3000::,2620:12b:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:12b:4000::,2620:12b:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:12b:5000::,2620:12b:50ff:ffff:ffff:ffff:ffff:ffff,CA +2620:12b:6000::,2620:12b:600f:ffff:ffff:ffff:ffff:ffff,CA +2620:12b:7000::,2620:12b:700f:ffff:ffff:ffff:ffff:ffff,US +2620:12b:8000::,2620:12b:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:12b:9000::,2620:12b:900f:ffff:ffff:ffff:ffff:ffff,US +2620:12b:a000::,2620:12b:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12b:b000::,2620:12b:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:12b:c000::,2620:12b:c0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12b:d000::,2620:12b:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:12b:e000::,2620:12b:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12b:f000::,2620:12b:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12c::,2620:12c:f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:1000::,2620:12c:100f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:2000::,2620:12c:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:12c:3000::,2620:12c:300f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:4000::,2620:12c:400f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:5000::,2620:12c:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:12c:6000::,2620:12c:600f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:7000::,2620:12c:700f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:8000::,2620:12c:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:12c:9000::,2620:12c:900f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:a000::,2620:12c:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:b000::,2620:12c:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12c:c000::,2620:12c:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:d000::,2620:12c:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12c:e000::,2620:12c:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:12c:f000::,2620:12c:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d::,2620:12d:ff:ffff:ffff:ffff:ffff:ffff,US +2620:12d:1000::,2620:12d:100f:ffff:ffff:ffff:ffff:ffff,CA +2620:12d:2000::,2620:12d:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:12d:3000::,2620:12d:300f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:4000::,2620:12d:400f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:5000::,2620:12d:500f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:6000::,2620:12d:600f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:7000::,2620:12d:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:12d:8000::,2620:12d:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:12d:9000::,2620:12d:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:12d:a000::,2620:12d:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:b000::,2620:12d:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:c000::,2620:12d:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:d000::,2620:12d:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:e000::,2620:12d:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12d:f000::,2620:12d:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e::,2620:12e:f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:1000::,2620:12e:100f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:2000::,2620:12e:200f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:3000::,2620:12e:300f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:4000::,2620:12e:400f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:5000::,2620:12e:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e:6000::,2620:12e:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e:7000::,2620:12e:700f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:8000::,2620:12e:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e:9000::,2620:12e:900f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:a000::,2620:12e:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e:b000::,2620:12e:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:c000::,2620:12e:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:d000::,2620:12e:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:e000::,2620:12e:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e:f000::,2620:12e:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12f::,2620:12f:f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:1000::,2620:12f:100f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:2000::,2620:12f:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:12f:3000::,2620:12f:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:12f:4000::,2620:12f:400f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:5000::,2620:12f:500f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:6000::,2620:12f:600f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:7000::,2620:12f:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:12f:8000::,2620:12f:800f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:9000::,2620:12f:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:12f:a000::,2620:12f:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:b000::,2620:12f:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:c000::,2620:12f:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:d000::,2620:12f:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:e000::,2620:12f:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12f:f000::,2620:12f:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:130::,2620:130:f:ffff:ffff:ffff:ffff:ffff,US +2620:130:1000::,2620:130:100f:ffff:ffff:ffff:ffff:ffff,CA +2620:130:2000::,2620:130:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:130:3000::,2620:130:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:130:4000::,2620:130:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:130:5000::,2620:130:500f:ffff:ffff:ffff:ffff:ffff,US +2620:130:6000::,2620:130:600f:ffff:ffff:ffff:ffff:ffff,US +2620:130:7000::,2620:130:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:130:8000::,2620:130:800f:ffff:ffff:ffff:ffff:ffff,US +2620:130:9000::,2620:130:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:130:a000::,2620:130:a00f:ffff:ffff:ffff:ffff:ffff,CA +2620:130:c000::,2620:130:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:130:d000::,2620:130:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:130:e000::,2620:130:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:130:f000::,2620:130:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:131::,2620:131:f:ffff:ffff:ffff:ffff:ffff,US +2620:131:1000::,2620:131:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:131:2000::,2620:131:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:131:3000::,2620:131:300f:ffff:ffff:ffff:ffff:ffff,US +2620:131:4000::,2620:131:40ff:ffff:ffff:ffff:ffff:ffff,CA +2620:131:5000::,2620:131:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:131:6000::,2620:131:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:131:7000::,2620:131:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:131:8000::,2620:131:800f:ffff:ffff:ffff:ffff:ffff,US +2620:131:9000::,2620:131:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:131:a000::,2620:131:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:131:b000::,2620:131:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:131:c000::,2620:131:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:131:d000::,2620:131:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:131:e000::,2620:131:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:131:f000::,2620:131:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:132::,2620:132:f:ffff:ffff:ffff:ffff:ffff,US +2620:132:1000::,2620:132:10ff:ffff:ffff:ffff:ffff:ffff,US +2620:132:2000::,2620:132:20ff:ffff:ffff:ffff:ffff:ffff,CA +2620:132:3000::,2620:132:30ff:ffff:ffff:ffff:ffff:ffff,CA +2620:132:4000::,2620:132:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:132:5000::,2620:132:500f:ffff:ffff:ffff:ffff:ffff,US +2620:132:6000::,2620:132:600f:ffff:ffff:ffff:ffff:ffff,US +2620:132:7000::,2620:132:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:132:8000::,2620:132:800f:ffff:ffff:ffff:ffff:ffff,US +2620:132:9000::,2620:132:900f:ffff:ffff:ffff:ffff:ffff,US +2620:132:a000::,2620:132:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:132:b000::,2620:132:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:132:c000::,2620:132:c0ff:ffff:ffff:ffff:ffff:ffff,CA +2620:132:d000::,2620:132:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:132:e000::,2620:132:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:132:f000::,2620:132:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:133::,2620:133:ff:ffff:ffff:ffff:ffff:ffff,US +2620:133:1000::,2620:133:100f:ffff:ffff:ffff:ffff:ffff,US +2620:133:2000::,2620:133:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:133:3000::,2620:133:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:133:4000::,2620:133:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:133:5000::,2620:133:500f:ffff:ffff:ffff:ffff:ffff,US +2620:133:6000::,2620:133:600f:ffff:ffff:ffff:ffff:ffff,US +2620:133:7000::,2620:133:70ff:ffff:ffff:ffff:ffff:ffff,US +2620:133:8000::,2620:133:800f:ffff:ffff:ffff:ffff:ffff,US +2620:133:9000::,2620:133:900f:ffff:ffff:ffff:ffff:ffff,US +2620:133:a000::,2620:133:a0ff:ffff:ffff:ffff:ffff:ffff,CA +2620:133:b000::,2620:133:b0ff:ffff:ffff:ffff:ffff:ffff,CA +2620:133:c000::,2620:133:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:133:d000::,2620:133:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:133:e000::,2620:133:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:133:f000::,2620:133:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:134::,2620:134:f:ffff:ffff:ffff:ffff:ffff,US +2620:134:1000::,2620:134:100f:ffff:ffff:ffff:ffff:ffff,US +2620:134:2000::,2620:134:200f:ffff:ffff:ffff:ffff:ffff,US +2620:134:3000::,2620:134:300f:ffff:ffff:ffff:ffff:ffff,CA +2620:134:4000::,2620:134:400f:ffff:ffff:ffff:ffff:ffff,US +2620:134:5000::,2620:134:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:134:6000::,2620:134:600f:ffff:ffff:ffff:ffff:ffff,US +2620:134:7000::,2620:134:700f:ffff:ffff:ffff:ffff:ffff,CA +2620:134:8000::,2620:134:800f:ffff:ffff:ffff:ffff:ffff,US +2620:134:9000::,2620:134:90ff:ffff:ffff:ffff:ffff:ffff,US +2620:134:a000::,2620:134:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:134:b000::,2620:134:b0ff:ffff:ffff:ffff:ffff:ffff,US +2620:140::,2620:140:3ff:ffff:ffff:ffff:ffff:ffff,US +2620:141::,2620:141:fff:ffff:ffff:ffff:ffff:ffff,US +2620:143::,2620:143:7ff:ffff:ffff:ffff:ffff:ffff,US +2620:144::,2620:145:fff:ffff:ffff:ffff:ffff:ffff,US +2620:146::,2620:146:fff:ffff:ffff:ffff:ffff:ffff,US +2620:147::,2620:147:fff:ffff:ffff:ffff:ffff:ffff,US +2620:148::,2620:148:fff:ffff:ffff:ffff:ffff:ffff,US +2620:149::,2620:149:a01:ffff:ffff:ffff:ffff:ffff,US +2620:149:a02::,2620:149:a02:ffff:ffff:ffff:ffff:ffff,BR +2620:149:a03::,2620:14a:fff:ffff:ffff:ffff:ffff:ffff,US +2620:14b::,2620:14b:fff:ffff:ffff:ffff:ffff:ffff,US +2620:14c::,2620:14c:fff:ffff:ffff:ffff:ffff:ffff,US +2620:14d::,2620:14d:fff:ffff:ffff:ffff:ffff:ffff,US +2620:14e::,2620:14e:fff:ffff:ffff:ffff:ffff:ffff,US +2620:14f::,2620:14f:fff:ffff:ffff:ffff:ffff:ffff,US +2620:150::,2620:150:fff:ffff:ffff:ffff:ffff:ffff,US +2620:151::,2620:151:fff:ffff:ffff:ffff:ffff:ffff,US +2620:152::,2620:152:fff:ffff:ffff:ffff:ffff:ffff,US +2620:153::,2620:153:fff:ffff:ffff:ffff:ffff:ffff,US +2620:154::,2620:154:fff:ffff:ffff:ffff:ffff:ffff,US +2620:155::,2620:155:fff:ffff:ffff:ffff:ffff:ffff,US +2620:156::,2620:156:fff:ffff:ffff:ffff:ffff:ffff,US +2620:157::,2620:157:fff:ffff:ffff:ffff:ffff:ffff,US +2620:158::,2620:158:fff:ffff:ffff:ffff:ffff:ffff,US +2620:159::,2620:159:fff:ffff:ffff:ffff:ffff:ffff,US +2620:15a::,2620:15a:fff:ffff:ffff:ffff:ffff:ffff,US +2620:15b::,2620:15b:fff:ffff:ffff:ffff:ffff:ffff,US +2620:15c::,2620:15c:1:ffff:ffff:ffff:ffff:ffff,CA +2620:15c:2::,2620:15c:4:ffff:ffff:ffff:ffff:ffff,US +2620:15c:5::,2620:15c:5:ffff:ffff:ffff:ffff:ffff,BR +2620:15c:6::,2620:15c:d:ffff:ffff:ffff:ffff:ffff,US +2620:15c:e::,2620:15c:e:ffff:ffff:ffff:ffff:ffff,MX +2620:15c:f::,2620:15c:2d:ffff:ffff:ffff:ffff:ffff,US +2620:15c:2e::,2620:15c:2e:7fff:ffff:ffff:ffff:ffff,MX +2620:15c:2e:8000::,2620:15c:fff:ffff:ffff:ffff:ffff:ffff,US +2620:15d::,2620:15f:fff:ffff:ffff:ffff:ffff:ffff,US +2620:160::,2620:160:ffff:ffff:ffff:ffff:ffff:ffff,US +2620:162::,2620:162:fff:ffff:ffff:ffff:ffff:ffff,US +2620:163::,2620:163:fff:ffff:ffff:ffff:ffff:ffff,US +2620:164::,2620:164:fff:ffff:ffff:ffff:ffff:ffff,US +2620:165::,2620:165:fff:ffff:ffff:ffff:ffff:ffff,US +2620:166::,2620:166:fff:ffff:ffff:ffff:ffff:ffff,US +2620:167::,2620:167:fff:ffff:ffff:ffff:ffff:ffff,US +2620:168::,2620:169:fff:ffff:ffff:ffff:ffff:ffff,US +2620:16a::,2620:16a:fff:ffff:ffff:ffff:ffff:ffff,US +2620:16b::,2620:16c:fff:ffff:ffff:ffff:ffff:ffff,US +2620:16d::,2620:16f:fff:ffff:ffff:ffff:ffff:ffff,US +2620:170::,2620:170:fff:ffff:ffff:ffff:ffff:ffff,US +2620:171::,2620:171:fff:ffff:ffff:ffff:ffff:ffff,US +2620:172::,2620:172:fff:ffff:ffff:ffff:ffff:ffff,US +2620:173::,2620:173:fff:ffff:ffff:ffff:ffff:ffff,US +2620:174::,2620:174:fff:ffff:ffff:ffff:ffff:ffff,US +2620:175::,2620:175:fff:ffff:ffff:ffff:ffff:ffff,CA +2620:176::,2620:177:fff:ffff:ffff:ffff:ffff:ffff,US +2620:178::,2620:178:fff:ffff:ffff:ffff:ffff:ffff,US +2620:179::,2620:179:fff:ffff:ffff:ffff:ffff:ffff,US +2620:17a::,2620:17a:fff:ffff:ffff:ffff:ffff:ffff,US +2620:17b::,2620:17b:fff:ffff:ffff:ffff:ffff:ffff,US +2620:17c::,2620:17c:fff:ffff:ffff:ffff:ffff:ffff,US +2620:17e::,2620:17e:fff:ffff:ffff:ffff:ffff:ffff,US +2620:17f::,2620:181:fff:ffff:ffff:ffff:ffff:ffff,US +2620:182::,2620:182:fff:ffff:ffff:ffff:ffff:ffff,US +2620:183::,2620:183:fff:ffff:ffff:ffff:ffff:ffff,US +2620:184::,2620:184:fff:ffff:ffff:ffff:ffff:ffff,US +2620:185::,2620:185:fff:ffff:ffff:ffff:ffff:ffff,US +2620:186::,2620:186:fff:ffff:ffff:ffff:ffff:ffff,US +2620:187::,2620:187:fff:ffff:ffff:ffff:ffff:ffff,US +2620:188::,2620:188:fff:ffff:ffff:ffff:ffff:ffff,US +2620:189::,2620:189:fff:ffff:ffff:ffff:ffff:ffff,US +2620:18a::,2620:18a:fff:ffff:ffff:ffff:ffff:ffff,US +2620:18b::,2620:18c:fff:ffff:ffff:ffff:ffff:ffff,US +2620:18d::,2620:18d:fff:ffff:ffff:ffff:ffff:ffff,US +2620:18e::,2620:18e:fff:ffff:ffff:ffff:ffff:ffff,US +2620:18f::,2620:18f:fff:ffff:ffff:ffff:ffff:ffff,US +2620:190::,2620:191:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1a0::,2620:1a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2620:1b0::,2620:1b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2620:1c0::,2620:1c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2620:1d0::,2620:1d1:ffff:ffff:ffff:ffff:ffff:ffff,US +2620:1d2::,2620:1d2:ffff:ffff:ffff:ffff:ffff:ffff,CA +2620:1d3::,2620:1d5:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1d6::,2620:1d6:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1d7::,2620:1d7:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1d8::,2620:1d8:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1d9::,2620:1d9:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1da::,2620:1da:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1db::,2620:1db:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1dc::,2620:1dc:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1dd::,2620:1dd:fff:ffff:ffff:ffff:ffff:ffff,CA +2620:1de::,2620:1de:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1df::,2620:1df:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e0::,2620:1e1:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e2::,2620:1e2:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e3::,2620:1e3:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e4::,2620:1e4:ffff:ffff:ffff:ffff:ffff:ffff,CA +2620:1e5::,2620:1e5:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e6::,2620:1e6:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e7::,2620:1e7:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e8::,2620:1e8:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e9::,2620:1e9:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1ea::,2620:1ea:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1eb::,2620:1eb:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1ec::,2620:1ec:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1ee::,2620:1ee:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1ef::,2620:1ef:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1f0::,2620:1f1:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1f2::,2620:1f4:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1f5::,2620:1f5:fff:ffff:ffff:ffff:ffff:ffff,CA +2620:1f6::,2620:1f6:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1f7::,2620:1f7:3807:ffff:ffff:ffff:ffff:ffff,US +2620:1f7:3808::,2620:1f7:3808:7fff:ffff:ffff:ffff:ffff,AU +2620:1f7:3808:8000::,2620:1f9:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1fa::,2620:1fb:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1fc::,2620:1fc:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1fd::,2620:1fd:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1fe::,2620:1fe:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1ff::,2620:1ff:fff:ffff:ffff:ffff:ffff:ffff,US +2800:8::,2800:8:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:10::,2800:10:ffff:ffff:ffff:ffff:ffff:ffff,NI +2800:18::,2800:18:ffff:ffff:ffff:ffff:ffff:ffff,PE +2800:20::,2800:30:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:38::,2800:38:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:40::,2800:40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:48::,2800:48:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:68::,2800:68:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:70::,2800:70:ffff:ffff:ffff:ffff:ffff:ffff,TT +2800:80::,2800:80:ffff:ffff:ffff:ffff:ffff:ffff,CW +2800:88::,2800:88:ffff:ffff:ffff:ffff:ffff:ffff,BO +2800:90::,2800:90:ffff:ffff:ffff:ffff:ffff:ffff,SV +2800:98::,2800:98:ffff:ffff:ffff:ffff:ffff:ffff,GT +2800:a0::,2800:a4:110:7fff:ffff:ffff:ffff:ffff,UY +2800:a4:110:8000::,2800:a4:110:ffff:ffff:ffff:ffff:ffff,PE +2800:a4:111::,2800:af:ffff:ffff:ffff:ffff:ffff:ffff,UY +2800:e0::,2800:ef:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:f0::,2800:f0:ffff:ffff:ffff:ffff:ffff:ffff,CR +2800:100::,2800:100:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:110::,2800:110:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:120::,2800:120:ffff:ffff:ffff:ffff:ffff:ffff,PE +2800:130::,2800:130:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:140::,2800:140:ffff:ffff:ffff:ffff:ffff:ffff,PA +2800:150::,2800:150:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:160::,2800:160:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:170::,2800:170:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:180::,2800:180:ffff:ffff:ffff:ffff:ffff:ffff,TT +2800:190::,2800:190:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:1a0::,2800:1a0:ffff:ffff:ffff:ffff:ffff:ffff,GT +2800:1b0::,2800:1b0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:1c0::,2800:1c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:1d0::,2800:1d0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:1e0::,2800:1e0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:1f0::,2800:1f0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:200::,2800:200:ffff:ffff:ffff:ffff:ffff:ffff,PE +2800:220::,2800:220:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:230::,2800:230:ffff:ffff:ffff:ffff:ffff:ffff,CU +2800:240::,2800:240:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:250::,2800:250:ffff:ffff:ffff:ffff:ffff:ffff,UY +2800:260::,2800:26f:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:270::,2800:270:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:280::,2800:280:ffff:ffff:ffff:ffff:ffff:ffff,SX +2800:290::,2800:290:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:2a0::,2800:2a0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:2b0::,2800:2b0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:2d0::,2800:2d0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:2e0::,2800:2e0:ffff:ffff:ffff:ffff:ffff:ffff,CW +2800:2f0::,2800:2f0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:300::,2800:300:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:310::,2800:310:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:320::,2800:320:ffff:ffff:ffff:ffff:ffff:ffff,BO +2800:330::,2800:330:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:340::,2800:340:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:350::,2800:357:ffff:ffff:ffff:ffff:ffff:ffff,PA +2800:360::,2800:360:ffff:ffff:ffff:ffff:ffff:ffff,CU +2800:370::,2800:370:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:380::,2800:381:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:390::,2800:390:ffff:ffff:ffff:ffff:ffff:ffff,BO +2800:3a0::,2800:3a0:ffff:ffff:ffff:ffff:ffff:ffff,PY +2800:3b0::,2800:3b0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:3c0::,2800:3c0:ffff:ffff:ffff:ffff:ffff:ffff,GY +2800:3d0::,2800:3d0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:3e0::,2800:3e0:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:3f0::,2800:3f0:4002:ffff:ffff:ffff:ffff:ffff,AR +2800:3f0:4003::,2800:3f0:4003:ffff:ffff:ffff:ffff:ffff,CL +2800:3f0:4004::,2800:3f0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:400::,2800:400:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:410::,2800:410:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2800:420::,2800:423:ffff:ffff:ffff:ffff:ffff:ffff,TT +2800:430::,2800:430:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:440::,2800:440:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:460::,2800:460:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:470::,2800:470:ffff:ffff:ffff:ffff:ffff:ffff,SX +2800:480::,2800:487:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:490::,2800:490:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:4b0::,2800:4b0:ffff:ffff:ffff:ffff:ffff:ffff,PE +2800:4c0::,2800:4c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:4d0::,2800:4d0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:4e0::,2800:4e0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:4f0::,2800:4f0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:500::,2800:500:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:510::,2800:510:ffff:ffff:ffff:ffff:ffff:ffff,CR +2800:530::,2800:530:ffff:ffff:ffff:ffff:ffff:ffff,CW +2800:540::,2800:540:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:550::,2800:550:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:560::,2800:560:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:570::,2800:570:ffff:ffff:ffff:ffff:ffff:ffff,HT +2800:580::,2800:580:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:590::,2800:590:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:5a0::,2800:5a0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:5b0::,2800:5b0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:5c0::,2800:5c0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:5d0::,2800:5d0:ffff:ffff:ffff:ffff:ffff:ffff,PA +2800:5e0::,2800:5e0:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:5f0::,2800:5f0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:600::,2800:600:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:610::,2800:610:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:620::,2800:620:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:630::,2800:630:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:640::,2800:640:ffff:ffff:ffff:ffff:ffff:ffff,CR +2800:650::,2800:650:ffff:ffff:ffff:ffff:ffff:ffff,PE +2800:660::,2800:661:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:670::,2800:670:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:680::,2800:680:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:690::,2800:690:ffff:ffff:ffff:ffff:ffff:ffff,PE +2800:6a0::,2800:6a0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2800:6b0::,2800:6bf:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:6c0::,2800:6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:6d0::,2800:6d0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:6e0::,2800:6e0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:6f0::,2800:6f0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:700::,2800:700:ffff:ffff:ffff:ffff:ffff:ffff,UY +2800:800::,2800:800:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:810::,2800:820:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:830::,2800:831:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:840::,2800:840:ffff:ffff:ffff:ffff:ffff:ffff,UY +2800:850::,2800:850:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:860::,2800:860:ffff:ffff:ffff:ffff:ffff:ffff,CR +2800:870::,2800:870:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:880::,2800:883:ffff:ffff:ffff:ffff:ffff:ffff,SV +2800:890::,2800:890:ffff:ffff:ffff:ffff:ffff:ffff,GT +2800:8a0::,2800:8a0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:8b0::,2800:8b0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:8c0::,2800:8c0:ffff:ffff:ffff:ffff:ffff:ffff,NI +2800:8d0::,2800:8d0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:8e0::,2800:8e0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:8f0::,2800:8f0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:900::,2800:900:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:910::,2800:910:ffff:ffff:ffff:ffff:ffff:ffff,CU +2800:920::,2800:920:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:930::,2800:937:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:940::,2800:940:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:950::,2800:950:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:960::,2800:960:ffff:ffff:ffff:ffff:ffff:ffff,PY +2800:970::,2800:970:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:980::,2800:980:ffff:ffff:ffff:ffff:ffff:ffff,PA +2800:990::,2800:990:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:9a0::,2800:9a7:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:9b0::,2800:9b0:ffff:ffff:ffff:ffff:ffff:ffff,CR +2800:9c0::,2800:9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:9d0::,2800:9d0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:9e0::,2800:9e0:ffff:ffff:ffff:ffff:ffff:ffff,CW +2800:9f0::,2800:9f0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:a00::,2800:a00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:a10::,2800:a10:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:a20::,2800:a20:ffff:ffff:ffff:ffff:ffff:ffff,CW +2800:a30::,2800:a30:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:a40::,2800:a40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:a50::,2800:a50:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:a60::,2800:a60:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:a70::,2800:a70:ffff:ffff:ffff:ffff:ffff:ffff,CR +2800:a80::,2800:a80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:a90::,2800:a90:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:aa0::,2800:aa0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:ab0::,2800:ab0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:ac0::,2800:ac0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:ad0::,2800:ad0:ffff:ffff:ffff:ffff:ffff:ffff,AW +2800:ae0::,2800:ae0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:af0::,2800:af0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:b00::,2800:b00:ffff:ffff:ffff:ffff:ffff:ffff,BQ +2800:b10::,2800:b10:ffff:ffff:ffff:ffff:ffff:ffff,HN +2800:b20::,2800:b23:ffff:ffff:ffff:ffff:ffff:ffff,SV +2800:b30::,2800:b31:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:b40::,2800:b40:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:b60::,2800:b60:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:b70::,2800:b70:ffff:ffff:ffff:ffff:ffff:ffff,CO +2800:b80::,2800:b80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:b90::,2800:b90:ffff:ffff:ffff:ffff:ffff:ffff,CR +2800:ba0::,2800:ba0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:bb0::,2800:bbf:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:bc0::,2800:bc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2800:bd0::,2800:bd0:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:be0::,2800:be0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2800:bf0::,2800:bf0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:c00::,2800:c00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:c10::,2800:c10:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:c20::,2800:c20:ffff:ffff:ffff:ffff:ffff:ffff,CR +2800:c30::,2800:c30:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:c40::,2800:c40:ffff:ffff:ffff:ffff:ffff:ffff,EC +2800:c50::,2800:c50:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:c70::,2800:c70:ffff:ffff:ffff:ffff:ffff:ffff,PY +2800:c80::,2800:c80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:c90::,2800:c90:ffff:ffff:ffff:ffff:ffff:ffff,DO +2800:ca0::,2800:ca0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:cb0::,2800:cb0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:cc0::,2800:cc0:ffff:ffff:ffff:ffff:ffff:ffff,PE +2800:cd0::,2800:cd0:ffff:ffff:ffff:ffff:ffff:ffff,BO +2800:ce0::,2800:ce0:ffff:ffff:ffff:ffff:ffff:ffff,PA +2800:cf0::,2800:cf0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:d00::,2800:d00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:d10::,2800:d10:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:d20::,2800:d20:ffff:ffff:ffff:ffff:ffff:ffff,DO +2800:e00::,2800:eff:ffff:ffff:ffff:ffff:ffff:ffff,TT +2800:1000::,2800:10ff:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:2000::,2800:2fff:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:a000::,2800:a000:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:a008::,2800:a008:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:a010::,2800:a010:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:a018::,2800:a018:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:a020::,2800:a020:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:a028::,2800:a028:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:a030::,2800:a030:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:a038::,2800:a038:ffff:ffff:ffff:ffff:ffff:ffff,VE +2800:b000::,2800:b000:ffff:ffff:ffff:ffff:ffff:ffff,AR +2800:d300::,2800:d307:ffff:ffff:ffff:ffff:ffff:ffff,CR +2801::,2801::ffff:ffff:ffff:ffff:ffff,UY +2801:0:10::,2801::10:ffff:ffff:ffff:ffff:ffff,CL +2801:0:20::,2801::20:ffff:ffff:ffff:ffff:ffff,EC +2801:0:30::,2801::30:ffff:ffff:ffff:ffff:ffff,HN +2801:0:40::,2801::40:ffff:ffff:ffff:ffff:ffff,TT +2801:0:50::,2801::50:ffff:ffff:ffff:ffff:ffff,CL +2801:0:60::,2801::63:ffff:ffff:ffff:ffff:ffff,EC +2801:0:70::,2801::70:ffff:ffff:ffff:ffff:ffff,CO +2801:0:80::,2801::80:ffff:ffff:ffff:ffff:ffff,DO +2801:0:90::,2801::90:ffff:ffff:ffff:ffff:ffff,AR +2801:0:b0::,2801::b7:ffff:ffff:ffff:ffff:ffff,CL +2801:0:c0::,2801::df:ffff:ffff:ffff:ffff:ffff,CR +2801:0:100::,2801::100:ffff:ffff:ffff:ffff:ffff,CO +2801:0:110::,2801::110:ffff:ffff:ffff:ffff:ffff,GT +2801:0:120::,2801::120:ffff:ffff:ffff:ffff:ffff,CL +2801:0:130::,2801::130:ffff:ffff:ffff:ffff:ffff,PY +2801:0:140::,2801::141:ffff:ffff:ffff:ffff:ffff,AR +2801:0:150::,2801::150:ffff:ffff:ffff:ffff:ffff,CL +2801:0:160::,2801::160:ffff:ffff:ffff:ffff:ffff,AR +2801:0:170::,2801::170:ffff:ffff:ffff:ffff:ffff,BO +2801:0:180::,2801::180:ffff:ffff:ffff:ffff:ffff,CO +2801:0:190::,2801::190:ffff:ffff:ffff:ffff:ffff,AR +2801:0:1a0::,2801::1a0:ffff:ffff:ffff:ffff:ffff,HN +2801:0:1b0::,2801::1bf:ffff:ffff:ffff:ffff:ffff,AR +2801:0:1c0::,2801::1c7:ffff:ffff:ffff:ffff:ffff,CO +2801:0:1d0::,2801::1d7:ffff:ffff:ffff:ffff:ffff,AR +2801:0:1f0::,2801::1f0:ffff:ffff:ffff:ffff:ffff,PY +2801:0:200::,2801::200:ffff:ffff:ffff:ffff:ffff,VE +2801:0:210::,2801::210:ffff:ffff:ffff:ffff:ffff,CO +2801:0:220::,2801::22f:ffff:ffff:ffff:ffff:ffff,AR +2801:0:240::,2801::240:ffff:ffff:ffff:ffff:ffff,PA +2801:0:250::,2801::250:ffff:ffff:ffff:ffff:ffff,AR +2801:0:260::,2801::260:ffff:ffff:ffff:ffff:ffff,AR +2801:0:270::,2801::270:ffff:ffff:ffff:ffff:ffff,EC +2801:0:280::,2801::280:ffff:ffff:ffff:ffff:ffff,CO +2801:0:290::,2801::290:ffff:ffff:ffff:ffff:ffff,AR +2801:0:2a0::,2801::2a0:ffff:ffff:ffff:ffff:ffff,CR +2801:0:2b0::,2801::2b0:ffff:ffff:ffff:ffff:ffff,PA +2801:0:2c0::,2801::2c0:ffff:ffff:ffff:ffff:ffff,HN +2801:0:2d0::,2801::2d0:ffff:ffff:ffff:ffff:ffff,PA +2801:0:2e0::,2801::2e0:ffff:ffff:ffff:ffff:ffff,CO +2801:0:2f0::,2801::2f0:ffff:ffff:ffff:ffff:ffff,AR +2801:0:300::,2801::300:ffff:ffff:ffff:ffff:ffff,CO +2801:0:310::,2801::310:ffff:ffff:ffff:ffff:ffff,CW +2801:0:320::,2801::320:ffff:ffff:ffff:ffff:ffff,CO +2801:0:330::,2801::330:ffff:ffff:ffff:ffff:ffff,HT +2801:0:340::,2801::340:ffff:ffff:ffff:ffff:ffff,CO +2801:0:350::,2801::350:ffff:ffff:ffff:ffff:ffff,AR +2801:0:360::,2801::360:ffff:ffff:ffff:ffff:ffff,CO +2801:0:370::,2801::370:ffff:ffff:ffff:ffff:ffff,CO +2801:0:380::,2801::380:ffff:ffff:ffff:ffff:ffff,CL +2801:0:390::,2801::390:ffff:ffff:ffff:ffff:ffff,CO +2801:0:3b0::,2801::3b0:ffff:ffff:ffff:ffff:ffff,CO +2801:0:3c0::,2801::3c0:ffff:ffff:ffff:ffff:ffff,CO +2801:0:3e0::,2801::3e0:ffff:ffff:ffff:ffff:ffff,AR +2801:0:3f0::,2801::3f0:ffff:ffff:ffff:ffff:ffff,AR +2801:0:400::,2801::400:ffff:ffff:ffff:ffff:ffff,CL +2801:0:410::,2801::410:ffff:ffff:ffff:ffff:ffff,EC +2801:0:420::,2801::420:ffff:ffff:ffff:ffff:ffff,EC +2801:0:440::,2801::440:ffff:ffff:ffff:ffff:ffff,AR +2801:0:480::,2801::480:ffff:ffff:ffff:ffff:ffff,CO +2801:0:490::,2801::490:ffff:ffff:ffff:ffff:ffff,PA +2801:0:4a0::,2801::4a0:ffff:ffff:ffff:ffff:ffff,CR +2801:0:4c0::,2801::4c0:ffff:ffff:ffff:ffff:ffff,CO +2801:0:4d0::,2801::4d0:ffff:ffff:ffff:ffff:ffff,EC +2801:0:4e0::,2801::4e0:ffff:ffff:ffff:ffff:ffff,CL +2801:0:2000::,2801::2fff:ffff:ffff:ffff:ffff:ffff,UY +2801:1::,2801:1:ffff:ffff:ffff:ffff:ffff:ffff,CR +2801:2::,2801:2:ffff:ffff:ffff:ffff:ffff:ffff,CL +2801:10::,2801:10:7:ffff:ffff:ffff:ffff:ffff,AR +2801:10:1000::,2801:10:1000:ffff:ffff:ffff:ffff:ffff,AR +2801:10:2000::,2801:10:2000:ffff:ffff:ffff:ffff:ffff,AR +2801:10:3000::,2801:10:3000:ffff:ffff:ffff:ffff:ffff,CO +2801:10:4000::,2801:10:4000:ffff:ffff:ffff:ffff:ffff,AR +2801:10:5000::,2801:10:5000:ffff:ffff:ffff:ffff:ffff,BO +2801:10:6000::,2801:10:6000:ffff:ffff:ffff:ffff:ffff,HN +2801:10:8000::,2801:10:8000:ffff:ffff:ffff:ffff:ffff,AR +2801:10:9000::,2801:10:9000:ffff:ffff:ffff:ffff:ffff,PY +2801:10:a000::,2801:10:a000:ffff:ffff:ffff:ffff:ffff,AR +2801:10:b000::,2801:10:b000:ffff:ffff:ffff:ffff:ffff,SV +2801:10:c000::,2801:10:c000:ffff:ffff:ffff:ffff:ffff,CO +2801:10:d000::,2801:10:d000:ffff:ffff:ffff:ffff:ffff,AR +2801:10:e000::,2801:10:e000:ffff:ffff:ffff:ffff:ffff,AR +2801:11::,2801:11::ffff:ffff:ffff:ffff:ffff,AR +2801:11:1000::,2801:11:1000:ffff:ffff:ffff:ffff:ffff,PY +2801:11:2000::,2801:11:2000:ffff:ffff:ffff:ffff:ffff,AR +2801:11:3000::,2801:11:3000:ffff:ffff:ffff:ffff:ffff,CR +2801:11:4000::,2801:11:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:11:5000::,2801:11:5000:ffff:ffff:ffff:ffff:ffff,CO +2801:11:6000::,2801:11:6000:ffff:ffff:ffff:ffff:ffff,AR +2801:11:8000::,2801:11:8000:ffff:ffff:ffff:ffff:ffff,CO +2801:11:9000::,2801:11:9000:ffff:ffff:ffff:ffff:ffff,CO +2801:11:a000::,2801:11:a000:ffff:ffff:ffff:ffff:ffff,VE +2801:11:b000::,2801:11:b000:ffff:ffff:ffff:ffff:ffff,AR +2801:11:c000::,2801:11:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:11:d000::,2801:11:d000:ffff:ffff:ffff:ffff:ffff,AR +2801:11:e000::,2801:11:e000:ffff:ffff:ffff:ffff:ffff,CO +2801:12::,2801:12::ffff:ffff:ffff:ffff:ffff,PY +2801:12:1000::,2801:12:1000:ffff:ffff:ffff:ffff:ffff,BO +2801:12:2000::,2801:12:2000:ffff:ffff:ffff:ffff:ffff,HN +2801:12:3000::,2801:12:3000:ffff:ffff:ffff:ffff:ffff,CL +2801:12:4000::,2801:12:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:12:5000::,2801:12:5000:ffff:ffff:ffff:ffff:ffff,AR +2801:12:6000::,2801:12:6000:ffff:ffff:ffff:ffff:ffff,SV +2801:12:8000::,2801:12:8000:ffff:ffff:ffff:ffff:ffff,AR +2801:12:9000::,2801:12:9000:ffff:ffff:ffff:ffff:ffff,AR +2801:12:b000::,2801:12:b000:ffff:ffff:ffff:ffff:ffff,AR +2801:12:c000::,2801:12:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:12:d000::,2801:12:d000:ffff:ffff:ffff:ffff:ffff,BO +2801:12:e000::,2801:12:e000:ffff:ffff:ffff:ffff:ffff,PA +2801:13::,2801:13::ffff:ffff:ffff:ffff:ffff,VE +2801:13:1000::,2801:13:1000:ffff:ffff:ffff:ffff:ffff,AR +2801:13:2000::,2801:13:2000:ffff:ffff:ffff:ffff:ffff,AR +2801:13:3000::,2801:13:3000:ffff:ffff:ffff:ffff:ffff,BO +2801:13:4000::,2801:13:4000:ffff:ffff:ffff:ffff:ffff,CL +2801:13:5000::,2801:13:5000:ffff:ffff:ffff:ffff:ffff,AR +2801:13:6000::,2801:13:6000:ffff:ffff:ffff:ffff:ffff,GT +2801:13:8000::,2801:13:8000:ffff:ffff:ffff:ffff:ffff,SV +2801:13:9000::,2801:13:9000:ffff:ffff:ffff:ffff:ffff,AR +2801:13:a000::,2801:13:a000:ffff:ffff:ffff:ffff:ffff,CO +2801:13:c000::,2801:13:c000:ffff:ffff:ffff:ffff:ffff,TT +2801:13:d000::,2801:13:d000:ffff:ffff:ffff:ffff:ffff,AR +2801:13:e000::,2801:13:e000:ffff:ffff:ffff:ffff:ffff,CO +2801:14::,2801:14::ffff:ffff:ffff:ffff:ffff,CO +2801:14:1000::,2801:14:1000:ffff:ffff:ffff:ffff:ffff,CL +2801:14:2000::,2801:14:2000:ffff:ffff:ffff:ffff:ffff,AR +2801:14:3000::,2801:14:3000:ffff:ffff:ffff:ffff:ffff,CO +2801:14:5000::,2801:14:5000:ffff:ffff:ffff:ffff:ffff,NI +2801:14:6000::,2801:14:6000:ffff:ffff:ffff:ffff:ffff,BO +2801:14:8000::,2801:14:8000:ffff:ffff:ffff:ffff:ffff,CO +2801:14:9000::,2801:14:9000:ffff:ffff:ffff:ffff:ffff,CL +2801:14:a000::,2801:14:a001:ffff:ffff:ffff:ffff:ffff,UY +2801:14:b000::,2801:14:b000:ffff:ffff:ffff:ffff:ffff,AR +2801:14:c000::,2801:14:c000:ffff:ffff:ffff:ffff:ffff,BO +2801:14:d000::,2801:14:d00f:ffff:ffff:ffff:ffff:ffff,PA +2801:14:e000::,2801:14:e000:ffff:ffff:ffff:ffff:ffff,PY +2801:15::,2801:15::ffff:ffff:ffff:ffff:ffff,EC +2801:15:1000::,2801:15:1000:ffff:ffff:ffff:ffff:ffff,SV +2801:15:2000::,2801:15:2000:ffff:ffff:ffff:ffff:ffff,CR +2801:15:3000::,2801:15:3000:ffff:ffff:ffff:ffff:ffff,CO +2801:15:4000::,2801:15:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:15:5000::,2801:15:5000:ffff:ffff:ffff:ffff:ffff,CO +2801:15:6000::,2801:15:6000:ffff:ffff:ffff:ffff:ffff,SV +2801:15:8000::,2801:15:8000:ffff:ffff:ffff:ffff:ffff,CR +2801:15:9000::,2801:15:9000:ffff:ffff:ffff:ffff:ffff,AR +2801:15:a000::,2801:15:a000:ffff:ffff:ffff:ffff:ffff,DO +2801:15:c000::,2801:15:c000:ffff:ffff:ffff:ffff:ffff,GT +2801:15:d000::,2801:15:d000:ffff:ffff:ffff:ffff:ffff,CL +2801:15:e000::,2801:15:e000:ffff:ffff:ffff:ffff:ffff,DO +2801:16::,2801:16::ffff:ffff:ffff:ffff:ffff,CW +2801:16:e0::,2801:16:e0:ffff:ffff:ffff:ffff:ffff,GY +2801:16:1000::,2801:16:1000:ffff:ffff:ffff:ffff:ffff,AR +2801:16:2000::,2801:16:2000:ffff:ffff:ffff:ffff:ffff,HN +2801:16:3000::,2801:16:3000:ffff:ffff:ffff:ffff:ffff,PA +2801:16:4000::,2801:16:4000:ffff:ffff:ffff:ffff:ffff,AR +2801:16:5000::,2801:16:5000:ffff:ffff:ffff:ffff:ffff,CO +2801:16:6000::,2801:16:6000:ffff:ffff:ffff:ffff:ffff,AR +2801:16:8000::,2801:16:8000:ffff:ffff:ffff:ffff:ffff,CO +2801:16:9000::,2801:16:9000:ffff:ffff:ffff:ffff:ffff,BO +2801:16:a000::,2801:16:a000:ffff:ffff:ffff:ffff:ffff,CR +2801:16:c000::,2801:16:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:16:d000::,2801:16:d000:ffff:ffff:ffff:ffff:ffff,AR +2801:17::,2801:17::ffff:ffff:ffff:ffff:ffff,CL +2801:17:1000::,2801:17:1000:ffff:ffff:ffff:ffff:ffff,HN +2801:17:2000::,2801:17:2000:ffff:ffff:ffff:ffff:ffff,PY +2801:17:3000::,2801:17:3000:ffff:ffff:ffff:ffff:ffff,CL +2801:17:4000::,2801:17:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:17:5000::,2801:17:5000:ffff:ffff:ffff:ffff:ffff,HT +2801:17:6000::,2801:17:6000:ffff:ffff:ffff:ffff:ffff,AR +2801:17:8000::,2801:17:8000:ffff:ffff:ffff:ffff:ffff,CR +2801:17:9000::,2801:17:9000:ffff:ffff:ffff:ffff:ffff,PA +2801:17:a000::,2801:17:a000:ffff:ffff:ffff:ffff:ffff,HT +2801:17:c000::,2801:17:c000:ffff:ffff:ffff:ffff:ffff,PA +2801:17:d000::,2801:17:d000:ffff:ffff:ffff:ffff:ffff,CO +2801:17:e000::,2801:17:e000:ffff:ffff:ffff:ffff:ffff,AR +2801:18::,2801:18::ffff:ffff:ffff:ffff:ffff,CR +2801:18:1000::,2801:18:1000:ffff:ffff:ffff:ffff:ffff,PA +2801:18:2000::,2801:18:2000:ffff:ffff:ffff:ffff:ffff,CO +2801:18:3000::,2801:18:3000:ffff:ffff:ffff:ffff:ffff,CO +2801:18:5000::,2801:18:5000:ffff:ffff:ffff:ffff:ffff,CO +2801:18:6000::,2801:18:6000:ffff:ffff:ffff:ffff:ffff,AR +2801:18:8000::,2801:18:8000:ffff:ffff:ffff:ffff:ffff,AR +2801:18:9000::,2801:18:900f:ffff:ffff:ffff:ffff:ffff,CO +2801:18:a000::,2801:18:a000:ffff:ffff:ffff:ffff:ffff,BO +2801:18:b000::,2801:18:b000:ffff:ffff:ffff:ffff:ffff,HN +2801:18:c000::,2801:18:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:18:d000::,2801:18:d000:ffff:ffff:ffff:ffff:ffff,BO +2801:18:e000::,2801:18:e000:ffff:ffff:ffff:ffff:ffff,DO +2801:19::,2801:19::ffff:ffff:ffff:ffff:ffff,AR +2801:19:1000::,2801:19:1000:ffff:ffff:ffff:ffff:ffff,PA +2801:19:2000::,2801:19:2000:ffff:ffff:ffff:ffff:ffff,CL +2801:19:3000::,2801:19:3000:ffff:ffff:ffff:ffff:ffff,CO +2801:19:4000::,2801:19:4000:ffff:ffff:ffff:ffff:ffff,PY +2801:19:5000::,2801:19:5000:ffff:ffff:ffff:ffff:ffff,CO +2801:19:6000::,2801:19:6000:ffff:ffff:ffff:ffff:ffff,CW +2801:19:8000::,2801:19:8000:ffff:ffff:ffff:ffff:ffff,EC +2801:19:9000::,2801:19:9000:ffff:ffff:ffff:ffff:ffff,AR +2801:19:a000::,2801:19:a000:ffff:ffff:ffff:ffff:ffff,BO +2801:19:c000::,2801:19:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:19:d000::,2801:19:d000:ffff:ffff:ffff:ffff:ffff,BO +2801:19:e000::,2801:19:e000:ffff:ffff:ffff:ffff:ffff,CO +2801:1a::,2801:1a::ffff:ffff:ffff:ffff:ffff,CO +2801:1a:1000::,2801:1a:1000:ffff:ffff:ffff:ffff:ffff,CL +2801:1a:3000::,2801:1a:3000:ffff:ffff:ffff:ffff:ffff,EC +2801:1a:5000::,2801:1a:5000:ffff:ffff:ffff:ffff:ffff,AR +2801:1a:8000::,2801:1a:8000:ffff:ffff:ffff:ffff:ffff,CL +2801:1a:9000::,2801:1a:9000:ffff:ffff:ffff:ffff:ffff,DO +2801:1a:a000::,2801:1a:a000:ffff:ffff:ffff:ffff:ffff,AR +2801:1a:b000::,2801:1a:b000:ffff:ffff:ffff:ffff:ffff,CO +2801:1a:c000::,2801:1a:c000:ffff:ffff:ffff:ffff:ffff,CO +2801:1a:d000::,2801:1a:d000:ffff:ffff:ffff:ffff:ffff,AR +2801:1a:e000::,2801:1a:e000:ffff:ffff:ffff:ffff:ffff,DO +2801:1b::,2801:1b::ffff:ffff:ffff:ffff:ffff,CR +2801:1b:1000::,2801:1b:1000:ffff:ffff:ffff:ffff:ffff,CL +2801:1b:2000::,2801:1b:2000:ffff:ffff:ffff:ffff:ffff,UY +2801:1b:3000::,2801:1b:3000:ffff:ffff:ffff:ffff:ffff,PE +2801:1b:4000::,2801:1b:4000:ffff:ffff:ffff:ffff:ffff,CL +2801:1b:5000::,2801:1b:5000:ffff:ffff:ffff:ffff:ffff,AR +2801:1b:6000::,2801:1b:6000:ffff:ffff:ffff:ffff:ffff,CL +2801:1b:8000::,2801:1b:8000:ffff:ffff:ffff:ffff:ffff,CL +2801:1b:9000::,2801:1b:9000:ffff:ffff:ffff:ffff:ffff,CL +2801:1b:a000::,2801:1b:a000:ffff:ffff:ffff:ffff:ffff,AR +2801:1b:c000::,2801:1b:c000:ffff:ffff:ffff:ffff:ffff,PA +2801:1b:d000::,2801:1b:d000:ffff:ffff:ffff:ffff:ffff,CO +2801:1b:e000::,2801:1b:e000:ffff:ffff:ffff:ffff:ffff,NI +2801:1c::,2801:1c::ffff:ffff:ffff:ffff:ffff,PY +2801:1c:1000::,2801:1c:1000:ffff:ffff:ffff:ffff:ffff,AR +2801:1c:2000::,2801:1c:2000:ffff:ffff:ffff:ffff:ffff,PE +2801:1c:3000::,2801:1c:3000:ffff:ffff:ffff:ffff:ffff,SV +2801:1c:4000::,2801:1c:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:1c:5000::,2801:1c:5000:ffff:ffff:ffff:ffff:ffff,CL +2801:1c:6000::,2801:1c:6000:ffff:ffff:ffff:ffff:ffff,PA +2801:1c:8000::,2801:1c:8000:ffff:ffff:ffff:ffff:ffff,EC +2801:1c:a000::,2801:1c:a000:ffff:ffff:ffff:ffff:ffff,CO +2801:1c:b000::,2801:1c:b000:ffff:ffff:ffff:ffff:ffff,AR +2801:1c:c000::,2801:1c:c000:ffff:ffff:ffff:ffff:ffff,HN +2801:1c:d000::,2801:1c:d000:ffff:ffff:ffff:ffff:ffff,AR +2801:1c:e000::,2801:1c:e000:ffff:ffff:ffff:ffff:ffff,CO +2801:1d::,2801:1d::ffff:ffff:ffff:ffff:ffff,PY +2801:1d:1000::,2801:1d:1000:ffff:ffff:ffff:ffff:ffff,AR +2801:1d:2000::,2801:1d:2000:ffff:ffff:ffff:ffff:ffff,GT +2801:1d:3000::,2801:1d:3000:ffff:ffff:ffff:ffff:ffff,AR +2801:1d:4000::,2801:1d:4000:ffff:ffff:ffff:ffff:ffff,TT +2801:1d:5000::,2801:1d:5000:ffff:ffff:ffff:ffff:ffff,AR +2801:1d:6000::,2801:1d:6000:ffff:ffff:ffff:ffff:ffff,NI +2801:1d:8000::,2801:1d:8000:ffff:ffff:ffff:ffff:ffff,AR +2801:1d:9000::,2801:1d:9000:ffff:ffff:ffff:ffff:ffff,CO +2801:1d:a000::,2801:1d:a00f:ffff:ffff:ffff:ffff:ffff,CR +2801:1d:c000::,2801:1d:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:1d:d000::,2801:1d:d000:ffff:ffff:ffff:ffff:ffff,BO +2801:1d:e000::,2801:1d:e000:ffff:ffff:ffff:ffff:ffff,CO +2801:1e::,2801:1e::ffff:ffff:ffff:ffff:ffff,EC +2801:1e:1000::,2801:1e:1000:ffff:ffff:ffff:ffff:ffff,AR +2801:1e:2000::,2801:1e:2000:ffff:ffff:ffff:ffff:ffff,AR +2801:1e:3000::,2801:1e:3000:ffff:ffff:ffff:ffff:ffff,CO +2801:1e:4000::,2801:1e:4007:ffff:ffff:ffff:ffff:ffff,AR +2801:1e:5000::,2801:1e:5000:ffff:ffff:ffff:ffff:ffff,EC +2801:1e:6000::,2801:1e:6000:ffff:ffff:ffff:ffff:ffff,CO +2801:1e:8000::,2801:1e:8000:ffff:ffff:ffff:ffff:ffff,CR +2801:1e:9000::,2801:1e:9000:ffff:ffff:ffff:ffff:ffff,SV +2801:1e:a000::,2801:1e:a000:ffff:ffff:ffff:ffff:ffff,AR +2801:1e:b000::,2801:1e:b000:ffff:ffff:ffff:ffff:ffff,AR +2801:1e:d000::,2801:1e:d000:ffff:ffff:ffff:ffff:ffff,CO +2801:1e:e000::,2801:1e:e000:ffff:ffff:ffff:ffff:ffff,SV +2801:1f::,2801:1f::ffff:ffff:ffff:ffff:ffff,AR +2801:1f:1000::,2801:1f:1000:ffff:ffff:ffff:ffff:ffff,HN +2801:1f:2000::,2801:1f:2000:ffff:ffff:ffff:ffff:ffff,CR +2801:1f:3000::,2801:1f:3000:ffff:ffff:ffff:ffff:ffff,AR +2801:1f:5000::,2801:1f:5000:ffff:ffff:ffff:ffff:ffff,CO +2801:1f:6000::,2801:1f:6000:ffff:ffff:ffff:ffff:ffff,AR +2801:1f:8000::,2801:1f:8000:ffff:ffff:ffff:ffff:ffff,AR +2801:1f:9000::,2801:1f:9000:ffff:ffff:ffff:ffff:ffff,AR +2801:1f:a000::,2801:1f:a000:ffff:ffff:ffff:ffff:ffff,CL +2801:1f:c000::,2801:1f:c000:ffff:ffff:ffff:ffff:ffff,CR +2801:1f:d000::,2801:1f:d000:ffff:ffff:ffff:ffff:ffff,CO +2801:1f:e000::,2801:1f:e000:ffff:ffff:ffff:ffff:ffff,AR +2801:80::,2801:80::ffff:ffff:ffff:ffff:ffff,BR +2801:80:10::,2801:80:10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:30::,2801:80:30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:50::,2801:80:50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:60::,2801:80:60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:70::,2801:80:70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:80::,2801:80:80:ffff:ffff:ffff:ffff:ffff,BR +2801:80:90::,2801:80:90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:a0::,2801:80:a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:b0::,2801:80:b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c0::,2801:80:c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d0::,2801:80:d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e0::,2801:80:e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:f0::,2801:80:f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:100::,2801:80:100:ffff:ffff:ffff:ffff:ffff,BR +2801:80:110::,2801:80:110:ffff:ffff:ffff:ffff:ffff,BR +2801:80:120::,2801:80:120:ffff:ffff:ffff:ffff:ffff,BR +2801:80:130::,2801:80:130:ffff:ffff:ffff:ffff:ffff,BR +2801:80:140::,2801:80:140:ffff:ffff:ffff:ffff:ffff,BR +2801:80:150::,2801:80:150:ffff:ffff:ffff:ffff:ffff,BR +2801:80:160::,2801:80:160:ffff:ffff:ffff:ffff:ffff,BR +2801:80:170::,2801:80:170:ffff:ffff:ffff:ffff:ffff,BR +2801:80:180::,2801:80:180:ffff:ffff:ffff:ffff:ffff,BR +2801:80:190::,2801:80:190:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1a0::,2801:80:1a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b0::,2801:80:1b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c0::,2801:80:1c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1d0::,2801:80:1d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1e0::,2801:80:1e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1f0::,2801:80:1f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:200::,2801:80:200:ffff:ffff:ffff:ffff:ffff,BR +2801:80:210::,2801:80:210:ffff:ffff:ffff:ffff:ffff,BR +2801:80:220::,2801:80:220:ffff:ffff:ffff:ffff:ffff,BR +2801:80:230::,2801:80:230:ffff:ffff:ffff:ffff:ffff,BR +2801:80:240::,2801:80:240:ffff:ffff:ffff:ffff:ffff,BR +2801:80:250::,2801:80:250:ffff:ffff:ffff:ffff:ffff,BR +2801:80:260::,2801:80:260:ffff:ffff:ffff:ffff:ffff,BR +2801:80:270::,2801:80:270:ffff:ffff:ffff:ffff:ffff,BR +2801:80:280::,2801:80:280:ffff:ffff:ffff:ffff:ffff,BR +2801:80:290::,2801:80:290:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2a0::,2801:80:2a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2b0::,2801:80:2b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2c0::,2801:80:2c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2d0::,2801:80:2d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2e0::,2801:80:2e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2f0::,2801:80:2f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:300::,2801:80:300:ffff:ffff:ffff:ffff:ffff,BR +2801:80:320::,2801:80:320:ffff:ffff:ffff:ffff:ffff,BR +2801:80:330::,2801:80:330:ffff:ffff:ffff:ffff:ffff,BR +2801:80:340::,2801:80:340:ffff:ffff:ffff:ffff:ffff,BR +2801:80:350::,2801:80:350:ffff:ffff:ffff:ffff:ffff,BR +2801:80:360::,2801:80:360:ffff:ffff:ffff:ffff:ffff,BR +2801:80:370::,2801:80:370:ffff:ffff:ffff:ffff:ffff,BR +2801:80:380::,2801:80:380:ffff:ffff:ffff:ffff:ffff,BR +2801:80:390::,2801:80:390:ffff:ffff:ffff:ffff:ffff,BR +2801:80:3a0::,2801:80:3a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:3b0::,2801:80:3b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:3c0::,2801:80:3c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:3d0::,2801:80:3d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:3e0::,2801:80:3e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:3f0::,2801:80:3f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:400::,2801:80:400:ffff:ffff:ffff:ffff:ffff,BR +2801:80:410::,2801:80:410:ffff:ffff:ffff:ffff:ffff,BR +2801:80:420::,2801:80:420:ffff:ffff:ffff:ffff:ffff,BR +2801:80:430::,2801:80:430:ffff:ffff:ffff:ffff:ffff,BR +2801:80:440::,2801:80:440:ffff:ffff:ffff:ffff:ffff,BR +2801:80:450::,2801:80:450:ffff:ffff:ffff:ffff:ffff,BR +2801:80:460::,2801:80:460:ffff:ffff:ffff:ffff:ffff,BR +2801:80:470::,2801:80:470:ffff:ffff:ffff:ffff:ffff,BR +2801:80:480::,2801:80:480:ffff:ffff:ffff:ffff:ffff,BR +2801:80:490::,2801:80:490:ffff:ffff:ffff:ffff:ffff,BR +2801:80:4b0::,2801:80:4b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:4c0::,2801:80:4c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:4d0::,2801:80:4d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:4e0::,2801:80:4e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:4f0::,2801:80:4f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:500::,2801:80:500:ffff:ffff:ffff:ffff:ffff,BR +2801:80:510::,2801:80:510:ffff:ffff:ffff:ffff:ffff,BR +2801:80:520::,2801:80:520:ffff:ffff:ffff:ffff:ffff,BR +2801:80:530::,2801:80:530:ffff:ffff:ffff:ffff:ffff,BR +2801:80:540::,2801:80:540:ffff:ffff:ffff:ffff:ffff,BR +2801:80:550::,2801:80:550:ffff:ffff:ffff:ffff:ffff,BR +2801:80:560::,2801:80:560:ffff:ffff:ffff:ffff:ffff,BR +2801:80:570::,2801:80:570:ffff:ffff:ffff:ffff:ffff,BR +2801:80:580::,2801:80:581:ffff:ffff:ffff:ffff:ffff,BR +2801:80:590::,2801:80:590:ffff:ffff:ffff:ffff:ffff,BR +2801:80:5b0::,2801:80:5b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:5c0::,2801:80:5c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:5d0::,2801:80:5d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:5e0::,2801:80:5e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:5f0::,2801:80:5f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:600::,2801:80:600:ffff:ffff:ffff:ffff:ffff,BR +2801:80:610::,2801:80:610:ffff:ffff:ffff:ffff:ffff,BR +2801:80:620::,2801:80:620:ffff:ffff:ffff:ffff:ffff,BR +2801:80:630::,2801:80:630:ffff:ffff:ffff:ffff:ffff,BR +2801:80:640::,2801:80:640:ffff:ffff:ffff:ffff:ffff,BR +2801:80:650::,2801:80:651:ffff:ffff:ffff:ffff:ffff,BR +2801:80:660::,2801:80:660:ffff:ffff:ffff:ffff:ffff,BR +2801:80:670::,2801:80:670:ffff:ffff:ffff:ffff:ffff,BR +2801:80:680::,2801:80:680:ffff:ffff:ffff:ffff:ffff,BR +2801:80:690::,2801:80:690:ffff:ffff:ffff:ffff:ffff,BR +2801:80:6b0::,2801:80:6b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:6c0::,2801:80:6c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:6d0::,2801:80:6d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:6e0::,2801:80:6ef:ffff:ffff:ffff:ffff:ffff,BR +2801:80:710::,2801:80:710:ffff:ffff:ffff:ffff:ffff,BR +2801:80:720::,2801:80:720:ffff:ffff:ffff:ffff:ffff,BR +2801:80:730::,2801:80:730:ffff:ffff:ffff:ffff:ffff,BR +2801:80:740::,2801:80:740:ffff:ffff:ffff:ffff:ffff,BR +2801:80:750::,2801:80:750:ffff:ffff:ffff:ffff:ffff,BR +2801:80:760::,2801:80:760:ffff:ffff:ffff:ffff:ffff,BR +2801:80:770::,2801:80:770:ffff:ffff:ffff:ffff:ffff,BR +2801:80:780::,2801:80:780:ffff:ffff:ffff:ffff:ffff,BR +2801:80:790::,2801:80:790:ffff:ffff:ffff:ffff:ffff,BR +2801:80:7a0::,2801:80:7a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:7b0::,2801:80:7b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:7c0::,2801:80:7c3:ffff:ffff:ffff:ffff:ffff,BR +2801:80:7d0::,2801:80:7d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:7e0::,2801:80:7e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:7f0::,2801:80:7f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:800::,2801:80:800:ffff:ffff:ffff:ffff:ffff,BR +2801:80:810::,2801:80:810:ffff:ffff:ffff:ffff:ffff,BR +2801:80:820::,2801:80:820:ffff:ffff:ffff:ffff:ffff,BR +2801:80:830::,2801:80:830:ffff:ffff:ffff:ffff:ffff,BR +2801:80:840::,2801:80:840:ffff:ffff:ffff:ffff:ffff,BR +2801:80:850::,2801:80:850:ffff:ffff:ffff:ffff:ffff,BR +2801:80:860::,2801:80:860:ffff:ffff:ffff:ffff:ffff,BR +2801:80:870::,2801:80:870:ffff:ffff:ffff:ffff:ffff,BR +2801:80:880::,2801:80:880:ffff:ffff:ffff:ffff:ffff,BR +2801:80:890::,2801:80:890:ffff:ffff:ffff:ffff:ffff,BR +2801:80:8a0::,2801:80:8a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:8b0::,2801:80:8b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:8c0::,2801:80:8c1:ffff:ffff:ffff:ffff:ffff,BR +2801:80:8d0::,2801:80:8d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:8e0::,2801:80:8e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:8f0::,2801:80:8f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:900::,2801:80:900:ffff:ffff:ffff:ffff:ffff,BR +2801:80:910::,2801:80:910:ffff:ffff:ffff:ffff:ffff,BR +2801:80:920::,2801:80:920:ffff:ffff:ffff:ffff:ffff,BR +2801:80:930::,2801:80:930:ffff:ffff:ffff:ffff:ffff,BR +2801:80:940::,2801:80:940:ffff:ffff:ffff:ffff:ffff,BR +2801:80:950::,2801:80:950:ffff:ffff:ffff:ffff:ffff,BR +2801:80:960::,2801:80:960:ffff:ffff:ffff:ffff:ffff,BR +2801:80:970::,2801:80:970:ffff:ffff:ffff:ffff:ffff,BR +2801:80:980::,2801:80:980:ffff:ffff:ffff:ffff:ffff,BR +2801:80:990::,2801:80:990:ffff:ffff:ffff:ffff:ffff,BR +2801:80:9a0::,2801:80:9a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:9b0::,2801:80:9b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:9c0::,2801:80:9c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:9e0::,2801:80:9e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:9f0::,2801:80:9f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:a00::,2801:80:a00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:a10::,2801:80:a10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:a20::,2801:80:a20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:a30::,2801:80:a30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:a40::,2801:80:a40:ffff:ffff:ffff:ffff:ffff,BR +2801:80:a50::,2801:80:a50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:a60::,2801:80:a61:ffff:ffff:ffff:ffff:ffff,BR +2801:80:a70::,2801:80:a70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:a80::,2801:80:a8f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:aa0::,2801:80:aa0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ab0::,2801:80:ab0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ac0::,2801:80:ac0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ad0::,2801:80:ad0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ae0::,2801:80:ae0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:af0::,2801:80:af0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:b00::,2801:80:b00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:b10::,2801:80:b10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:b20::,2801:80:b20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:b30::,2801:80:b30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:b50::,2801:80:b50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:b60::,2801:80:b60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:b70::,2801:80:b70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:b80::,2801:80:b80:ffff:ffff:ffff:ffff:ffff,BR +2801:80:b90::,2801:80:b90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ba0::,2801:80:baf:ffff:ffff:ffff:ffff:ffff,BR +2801:80:bc0::,2801:80:bcf:ffff:ffff:ffff:ffff:ffff,BR +2801:80:be0::,2801:80:be0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:bf0::,2801:80:bf0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c00::,2801:80:c00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c10::,2801:80:c10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c20::,2801:80:c20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c30::,2801:80:c30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c40::,2801:80:c40:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c50::,2801:80:c50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c60::,2801:80:c60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c70::,2801:80:c70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c90::,2801:80:c90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ca0::,2801:80:ca0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:cb0::,2801:80:cb0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:cc0::,2801:80:cc0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:cd0::,2801:80:cd0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ce0::,2801:80:ce0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d00::,2801:80:d00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d10::,2801:80:d10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d20::,2801:80:d2f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d40::,2801:80:d40:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d50::,2801:80:d50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d60::,2801:80:d6f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d80::,2801:80:d80:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d90::,2801:80:d90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:da0::,2801:80:daf:ffff:ffff:ffff:ffff:ffff,BR +2801:80:dc0::,2801:80:dcf:ffff:ffff:ffff:ffff:ffff,BR +2801:80:de0::,2801:80:de0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:df0::,2801:80:df0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e00::,2801:80:e00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e10::,2801:80:e10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e20::,2801:80:e20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e30::,2801:80:e30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e40::,2801:80:e40:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e50::,2801:80:e50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e60::,2801:80:e60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e70::,2801:80:e70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e80::,2801:80:e80:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e90::,2801:80:e90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ea0::,2801:80:ea0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:eb0::,2801:80:eb0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ec0::,2801:80:ec0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ed0::,2801:80:ed0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ef0::,2801:80:ef0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:f00::,2801:80:f00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:f10::,2801:80:f10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:f20::,2801:80:f20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:f30::,2801:80:f30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:f40::,2801:80:f4f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:f70::,2801:80:f70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:f80::,2801:80:f8f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:fa0::,2801:80:faf:ffff:ffff:ffff:ffff:ffff,BR +2801:80:fc0::,2801:80:fc0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:fd0::,2801:80:fd0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:fe0::,2801:80:fe0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ff0::,2801:80:ff0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1000::,2801:80:10ff:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1200::,2801:80:1200:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1210::,2801:80:1210:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1220::,2801:80:1220:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1230::,2801:80:1230:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1240::,2801:80:1240:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1250::,2801:80:1250:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1260::,2801:80:126f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1280::,2801:80:1280:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1290::,2801:80:1290:ffff:ffff:ffff:ffff:ffff,BR +2801:80:12a0::,2801:80:12a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:12b0::,2801:80:12b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:12c0::,2801:80:12c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:12d0::,2801:80:12d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:12e0::,2801:80:12e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:12f0::,2801:80:12f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1300::,2801:80:1300:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1310::,2801:80:1310:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1320::,2801:80:1320:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1330::,2801:80:1330:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1340::,2801:80:1340:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1350::,2801:80:1350:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1360::,2801:80:1360:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1370::,2801:80:1370:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1380::,2801:80:1380:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1390::,2801:80:1390:ffff:ffff:ffff:ffff:ffff,BR +2801:80:13a0::,2801:80:13a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:13b0::,2801:80:13b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:13c0::,2801:80:13c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:13d0::,2801:80:13d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:13e0::,2801:80:13e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:13f0::,2801:80:13f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1400::,2801:80:14ff:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1600::,2801:80:1600:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1610::,2801:80:1610:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1620::,2801:80:162f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1640::,2801:80:1640:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1650::,2801:80:1650:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1660::,2801:80:1660:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1670::,2801:80:1670:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1680::,2801:80:1680:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1690::,2801:80:1690:ffff:ffff:ffff:ffff:ffff,BR +2801:80:16a0::,2801:80:16a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:16b0::,2801:80:16b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:16c0::,2801:80:16c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:16d0::,2801:80:16d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:16e0::,2801:80:16e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:16f0::,2801:80:16f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1700::,2801:80:17ff:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1900::,2801:80:1900:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1910::,2801:80:1910:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1920::,2801:80:1920:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1930::,2801:80:1930:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1940::,2801:80:1941:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1950::,2801:80:1950:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1960::,2801:80:1960:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1970::,2801:80:1970:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1980::,2801:80:1981:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1990::,2801:80:1990:ffff:ffff:ffff:ffff:ffff,BR +2801:80:19a0::,2801:80:19a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:19b0::,2801:80:19b0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:19c0::,2801:80:19c0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:19d0::,2801:80:19d0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:19e0::,2801:80:19e0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:19f0::,2801:80:19f0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1a00::,2801:80:1a00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1a10::,2801:80:1a10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1a20::,2801:80:1a20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1a30::,2801:80:1a30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1a40::,2801:80:1a40:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1a50::,2801:80:1a50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1a60::,2801:80:1a60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1a70::,2801:80:1a70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1a80::,2801:80:1a80:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1a90::,2801:80:1a90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1aa0::,2801:80:1aa0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1ab0::,2801:80:1ab0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1ac0::,2801:80:1ac0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1ad0::,2801:80:1ad1:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1ae0::,2801:80:1ae0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1af0::,2801:80:1af0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b00::,2801:80:1b00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b10::,2801:80:1b10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b20::,2801:80:1b20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b30::,2801:80:1b30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b40::,2801:80:1b40:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b50::,2801:80:1b50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b60::,2801:80:1b60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b70::,2801:80:1b70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b80::,2801:80:1b80:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1b90::,2801:80:1b90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1ba0::,2801:80:1ba0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1bb0::,2801:80:1bb0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1bc0::,2801:80:1bc0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1bd0::,2801:80:1bd0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1be0::,2801:80:1be0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1bf0::,2801:80:1bf0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c00::,2801:80:1c00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c10::,2801:80:1c10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c20::,2801:80:1c20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c30::,2801:80:1c30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c40::,2801:80:1c4f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c60::,2801:80:1c60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c70::,2801:80:1c70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c80::,2801:80:1c80:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c90::,2801:80:1c90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1ca0::,2801:80:1ca0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1cb0::,2801:80:1cb0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1cc0::,2801:80:1cc0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1cd0::,2801:80:1cd0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1ce0::,2801:80:1cef:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1d00::,2801:80:1d01:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1d10::,2801:80:1d10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1d20::,2801:80:1d21:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1d30::,2801:80:1d30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1d40::,2801:80:1d40:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1d50::,2801:80:1d50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1d60::,2801:80:1d60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1d70::,2801:80:1d70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1d80::,2801:80:1d80:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1d90::,2801:80:1d90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1da0::,2801:80:1da0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1db0::,2801:80:1db3:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1dc0::,2801:80:1dc0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1dd0::,2801:80:1dd3:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1de0::,2801:80:1de0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1df0::,2801:80:1df0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1e00::,2801:80:1eff:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2000::,2801:80:20ff:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2200::,2801:80:2200:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2210::,2801:80:2210:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2220::,2801:80:2220:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2230::,2801:80:2230:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2240::,2801:80:2240:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2250::,2801:80:2251:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2260::,2801:80:2260:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2270::,2801:80:2270:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2280::,2801:80:2281:ffff:ffff:ffff:ffff:ffff,BR +2801:80:2290::,2801:80:2290:ffff:ffff:ffff:ffff:ffff,BR +2801:80:22a0::,2801:80:22a0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:22b0::,2801:80:22b0:ffff:ffff:ffff:ffff:ffff,BR +2801:82::,2801:82:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:84::,2801:84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:86::,2801:86:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:88::,2801:88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:8a::,2801:8a:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:8c::,2801:8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:8e::,2801:8e:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:90::,2801:90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:92::,2801:92:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:94::,2801:94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:96::,2801:96:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:98::,2801:98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:9a::,2801:9a:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:9c::,2801:9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:9e::,2801:9e:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:a0::,2801:a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:a2::,2801:a2:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:a4::,2801:a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:a6::,2801:a6:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:a8::,2801:a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:aa::,2801:aa:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:ac::,2801:ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:ae::,2801:ae:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:b0::,2801:b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:b2::,2801:b2:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:b4::,2801:b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:b6::,2801:b6:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:b8::,2801:b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:ba::,2801:ba:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:bc::,2801:bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:be::,2801:be:ffff:ffff:ffff:ffff:ffff:ffff,BR +2801:c0::,2801:c0:ffff:ffff:ffff:ffff:ffff:ffff,MX +2801:c4::,2801:c4::ffff:ffff:ffff:ffff:ffff,MX +2801:c4:10::,2801:c4:10:ffff:ffff:ffff:ffff:ffff,MX +2801:c4:12::,2801:c4:15:ffff:ffff:ffff:ffff:ffff,MX +2801:c4:17::,2801:c4:17:ffff:ffff:ffff:ffff:ffff,MX +2801:c4:20::,2801:c4:20:ffff:ffff:ffff:ffff:ffff,MX +2801:c4:30::,2801:c4:30:ffff:ffff:ffff:ffff:ffff,MX +2801:c4:50::,2801:c4:50:ffff:ffff:ffff:ffff:ffff,MX +2801:c4:60::,2801:c4:60:ffff:ffff:ffff:ffff:ffff,MX +2801:c4:80::,2801:c4:80:ffff:ffff:ffff:ffff:ffff,MX +2801:c4:90::,2801:c4:90:ffff:ffff:ffff:ffff:ffff,MX +2801:c4:a0::,2801:c4:a0:ffff:ffff:ffff:ffff:ffff,MX +2801:c4:b0::,2801:c4:b4:ffff:ffff:ffff:ffff:ffff,MX +2801:c5::,2801:c5:ffff:ffff:ffff:ffff:ffff:ffff,MX +2801:d0::,2801:d0:ffff:ffff:ffff:ffff:ffff:ffff,MX +2801:f0::,2801:f0::ffff:ffff:ffff:ffff:ffff,MX +2801:f0:16::,2801:f0:16:ffff:ffff:ffff:ffff:ffff,MX +2801:f0:20::,2801:f0:20:ffff:ffff:ffff:ffff:ffff,MX +2801:f0:28::,2801:f0:28:ffff:ffff:ffff:ffff:ffff,MX +2801:100::,2801:100:ff:ffff:ffff:ffff:ffff:ffff,AR +2801:104::,2801:104:ff:ffff:ffff:ffff:ffff:ffff,BO +2801:108::,2801:108:f:ffff:ffff:ffff:ffff:ffff,CO +2801:110::,2801:110:1fff:ffff:ffff:ffff:ffff:ffff,CO +2801:114::,2801:114:f:ffff:ffff:ffff:ffff:ffff,CO +2801:118::,2801:118:ff:ffff:ffff:ffff:ffff:ffff,AR +2801:120::,2801:120:ffff:ffff:ffff:ffff:ffff:ffff,AR +2801:124::,2801:124:f:ffff:ffff:ffff:ffff:ffff,CO +2801:128::,2801:128:fff:ffff:ffff:ffff:ffff:ffff,UY +2801:130::,2801:130:fff:ffff:ffff:ffff:ffff:ffff,CO +2801:138::,2801:138:ff:ffff:ffff:ffff:ffff:ffff,PA +2801:140::,2801:140:ffff:ffff:ffff:ffff:ffff:ffff,AR +2801:144::,2801:144:3f:ffff:ffff:ffff:ffff:ffff,CO +2801:148::,2801:148:ff:ffff:ffff:ffff:ffff:ffff,AR +2801:150::,2801:150:ffff:ffff:ffff:ffff:ffff:ffff,PE +2801:158::,2801:158:fff:ffff:ffff:ffff:ffff:ffff,PA +2801:160::,2801:160:ff:ffff:ffff:ffff:ffff:ffff,CO +2801:164::,2801:164:ff:ffff:ffff:ffff:ffff:ffff,CO +2801:168::,2801:168:ff:ffff:ffff:ffff:ffff:ffff,AR +2801:170::,2801:170:fff:ffff:ffff:ffff:ffff:ffff,CO +2801:178::,2801:178:1fff:ffff:ffff:ffff:ffff:ffff,CO +2801:180::,2801:180:f:ffff:ffff:ffff:ffff:ffff,PA +2801:184::,2801:184:f:ffff:ffff:ffff:ffff:ffff,DO +2801:188::,2801:188:ff:ffff:ffff:ffff:ffff:ffff,AR +2801:190::,2801:190:fff:ffff:ffff:ffff:ffff:ffff,CO +2801:198::,2801:198:ffff:ffff:ffff:ffff:ffff:ffff,CL +2801:1a0::,2801:1a0:3f:ffff:ffff:ffff:ffff:ffff,CO +2801:1a4::,2801:1a4:f:ffff:ffff:ffff:ffff:ffff,AR +2801:1a8::,2801:1a8:ff:ffff:ffff:ffff:ffff:ffff,AR +2801:1b0::,2801:1b0:ff:ffff:ffff:ffff:ffff:ffff,CO +2801:1b8::,2801:1b8:f:ffff:ffff:ffff:ffff:ffff,UY +2801:1c0::,2801:1c0:1ff:ffff:ffff:ffff:ffff:ffff,AR +2801:1c4::,2801:1c4:f:ffff:ffff:ffff:ffff:ffff,CO +2801:1c8::,2801:1c8:fff:ffff:ffff:ffff:ffff:ffff,CO +2801:1d0::,2801:1d0:f:ffff:ffff:ffff:ffff:ffff,CO +2801:1d8::,2801:1d8:fff:ffff:ffff:ffff:ffff:ffff,CO +2801:1e0::,2801:1e0:7f:ffff:ffff:ffff:ffff:ffff,AR +2801:1e4::,2801:1e4:3f:ffff:ffff:ffff:ffff:ffff,CO +2801:1e8::,2801:1e8:ff:ffff:ffff:ffff:ffff:ffff,AR +2801:1f0::,2801:1f0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2801:1f8::,2801:1f8:f:ffff:ffff:ffff:ffff:ffff,CO +2802::,2802:2:9fff:ffff:ffff:ffff:ffff:ffff,CO +2802:2:a000::,2802:2:afff:ffff:ffff:ffff:ffff:ffff,BR +2802:2:b000::,2802:2:ffff:ffff:ffff:ffff:ffff:ffff,CO +2802:3::,2802:3:1fff:ffff:ffff:ffff:ffff:ffff,PA +2802:3:2000::,2802:3:3fff:ffff:ffff:ffff:ffff:ffff,PE +2802:3:4000::,2802:3:5fff:ffff:ffff:ffff:ffff:ffff,MX +2802:3:6000::,2802:3:7fff:ffff:ffff:ffff:ffff:ffff,EC +2802:3:8000::,2802:3:9fff:ffff:ffff:ffff:ffff:ffff,BR +2802:3:a000::,2802:3:ffff:ffff:ffff:ffff:ffff:ffff,CO +2802:8000::,2802:80ff:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803::,2803::ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:20::,2803:20:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:40::,2803:40:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:80::,2803:80::ffff:ffff:ffff:ffff,BR +2803:80:0:1::,2803:80:fff:ffff:ffff:ffff:ffff:ffff,CL +2803:80:1000::,2803:80:1fff:ffff:ffff:ffff:ffff:ffff,BR +2803:80:2000::,2803:80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:b4::,2803:b4:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:c0::,2803:c0:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:100::,2803:100:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:120::,2803:120:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:140::,2803:140:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:180::,2803:180:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:1c0::,2803:1c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:200::,2803:200:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:220::,2803:220:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:240::,2803:240:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:280::,2803:280:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2c0::,2803:2c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:340::,2803:340:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:380::,2803:380:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:3c0::,2803:3c0:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:400::,2803:400:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:420::,2803:420:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:440::,2803:440:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:480::,2803:480:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:4c0::,2803:4c0:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:500::,2803:500:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:540::,2803:540:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:580::,2803:580:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5c0::,2803:5c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:600::,2803:600:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:620::,2803:620:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:640::,2803:640:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:680::,2803:680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6c0::,2803:6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:700::,2803:700:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:740::,2803:740:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:780::,2803:780:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:7c0::,2803:7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:800::,2803:800:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:820::,2803:820:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:840::,2803:840:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:880::,2803:880:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8c0::,2803:8c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:900::,2803:900:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:940::,2803:940:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:980::,2803:980:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:9c0::,2803:9c0:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:a00::,2803:a00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a20::,2803:a20:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:a40::,2803:a40:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:a80::,2803:a80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:ac0::,2803:ac0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:b00::,2803:b00:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:b40::,2803:b40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b80::,2803:b80:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:bc0::,2803:bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:c00::,2803:c00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c20::,2803:c20:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:c40::,2803:c40:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:c80::,2803:c80:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:cc0::,2803:cc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:d00::,2803:d00:ffff:ffff:ffff:ffff:ffff:ffff,GY +2803:d40::,2803:d40:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:d80::,2803:d87:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:dc0::,2803:dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e00::,2803:e00:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:e20::,2803:e20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e40::,2803:e40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e80::,2803:e80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:ec0::,2803:ec0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:f00::,2803:f00:48a:ffff:ffff:ffff:ffff:ffff,PE +2803:f00:48b::,2803:f00:48e:ffff:ffff:ffff:ffff:ffff,CO +2803:f00:48f::,2803:f00:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:f40::,2803:f40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f80::,2803:f80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:fc0::,2803:fc0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:1000::,2803:1000:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:1020::,2803:1020:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:1040::,2803:1040:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:1080::,2803:1080:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:10c0::,2803:10c0:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:1100::,2803:1100:ffff:ffff:ffff:ffff:ffff:ffff,CW +2803:1120::,2803:1120:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1140::,2803:1140:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:1180::,2803:1180:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:11c0::,2803:11c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1200::,2803:1200:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:1220::,2803:1220:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1240::,2803:1240:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:1280::,2803:1280:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:12c0::,2803:12c0:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:1300::,2803:1300:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:1340::,2803:1340:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:1380::,2803:1380:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:13c0::,2803:13c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1400::,2803:1400:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:1420::,2803:1420:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1440::,2803:1440:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:14c0::,2803:14c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1500::,2803:1500:ffff:ffff:ffff:ffff:ffff:ffff,TT +2803:1540::,2803:1540:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:1580::,2803:1580:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:15c0::,2803:15c0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:1600::,2803:1600:ffff:ffff:ffff:ffff:ffff:ffff,BQ +2803:1620::,2803:1620:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:1640::,2803:1640:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:1680::,2803:1680:ffff:ffff:ffff:ffff:ffff:ffff,GF +2803:16c0::,2803:16c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1700::,2803:1700:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1740::,2803:1740:ffff:ffff:ffff:ffff:ffff:ffff,GF +2803:1780::,2803:1780:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:17c0::,2803:17c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:1800::,2803:1800:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:1820::,2803:1820:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1840::,2803:1840:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:1900::,2803:1900:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1940::,2803:1940:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:19c0::,2803:19c0:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:1a00::,2803:1a00:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:1a20::,2803:1a20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1a40::,2803:1a40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1a80::,2803:1a80:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:1ac0::,2803:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:1b00::,2803:1b00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1b40::,2803:1b40:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:1b80::,2803:1b80:ffff:ffff:ffff:ffff:ffff:ffff,TT +2803:1bc0::,2803:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1c20::,2803:1c20:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:1c40::,2803:1c40:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:1c80::,2803:1c80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1cc0::,2803:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1d00::,2803:1d00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1d40::,2803:1d40:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:1d80::,2803:1d80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1dc0::,2803:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1e00::,2803:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:1e20::,2803:1e20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1e40::,2803:1e40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1e80::,2803:1e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1ec0::,2803:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:1f00::,2803:1f00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1f40::,2803:1f40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1f80::,2803:1f80:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:1fc0::,2803:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2000::,2803:2000:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2020::,2803:2020:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2040::,2803:2040:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:2080::,2803:2080:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:20c0::,2803:20c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2120::,2803:2120:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:2140::,2803:2140:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2180::,2803:2180:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:21c0::,2803:21c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:2200::,2803:2200:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:2220::,2803:2220:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:2240::,2803:2240:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2280::,2803:2280:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:22c0::,2803:22c0:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:2300::,2803:2300:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2340::,2803:2340:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2380::,2803:2380:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:23c0::,2803:23c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2400::,2803:2400:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2420::,2803:2420:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2440::,2803:2440:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2480::,2803:2480:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:24c0::,2803:24c0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:2500::,2803:2500:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:2540::,2803:2540:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:2580::,2803:2580:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:25c0::,2803:25c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:2600::,2803:2600:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2620::,2803:2620:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:2640::,2803:2640:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:2680::,2803:2680:ffff:ffff:ffff:ffff:ffff:ffff,UY +2803:26c0::,2803:26c0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:2700::,2803:2700:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2740::,2803:2740:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2780::,2803:2780:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:27c0::,2803:27c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:2800::,2803:2800:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:2820::,2803:2820:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2840::,2803:2840:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:2880::,2803:2880:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:28c0::,2803:28c0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:2900::,2803:2900:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:2940::,2803:2940:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:2980::,2803:2980:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:29c0::,2803:29c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:2a00::,2803:2a00:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:2a20::,2803:2a20:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:2a40::,2803:2a40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2a80::,2803:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:2ac0::,2803:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2b00::,2803:2b00:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:2b40::,2803:2b40:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:2b80::,2803:2b80:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:2bc0::,2803:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:2c00::,2803:2c00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2c20::,2803:2c20:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:2c80::,2803:2c80:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:2cc0::,2803:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:2d00::,2803:2d00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2d40::,2803:2d40:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:2d80::,2803:2d80:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:2dc0::,2803:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:2e00::,2803:2e00:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:2e20::,2803:2e20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2e40::,2803:2e40:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:2e80::,2803:2e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2ec0::,2803:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:2f00::,2803:2f00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2f40::,2803:2f40:ffff:ffff:ffff:ffff:ffff:ffff,UY +2803:2f80::,2803:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:2fc0::,2803:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:3000::,2803:3000:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:3020::,2803:3020:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:3040::,2803:3040:ffff:ffff:ffff:ffff:ffff:ffff,CW +2803:30c0::,2803:30c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3100::,2803:3100:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:3140::,2803:3140:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:3180::,2803:3180:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:31c0::,2803:31c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3200::,2803:3200:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:3220::,2803:3220:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3240::,2803:3240:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:3280::,2803:3280:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:32c0::,2803:32c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:3300::,2803:3300:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:3340::,2803:3340:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3380::,2803:3380:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:33c0::,2803:33c0:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:3400::,2803:3400:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:3420::,2803:3420:ffff:ffff:ffff:ffff:ffff:ffff,CW +2803:3440::,2803:3440:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:3480::,2803:3480:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:34c0::,2803:34c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:3500::,2803:3500:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3540::,2803:3540:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3580::,2803:3580:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:35c0::,2803:35c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3600::,2803:3600:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:3620::,2803:3620:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:3640::,2803:3640:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:3680::,2803:3680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:36c0::,2803:36c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:3700::,2803:3700:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:3740::,2803:3740:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3780::,2803:3780:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:37c0::,2803:37c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3800::,2803:3800:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:3820::,2803:3820:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:3840::,2803:3840:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3880::,2803:3880:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:38c0::,2803:38c0:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:3900::,2803:3900:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:3940::,2803:3940:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3980::,2803:3980:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:39c0::,2803:39c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:3a00::,2803:3a00:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:3a20::,2803:3a20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3a40::,2803:3a40:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:3a80::,2803:3a80:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:3ac0::,2803:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3b00::,2803:3b00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3b40::,2803:3b40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3b80::,2803:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:3bc0::,2803:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:3c00::,2803:3c00:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:3c20::,2803:3c20:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:3c40::,2803:3c40:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:3c80::,2803:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:3cc0::,2803:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:3d00::,2803:3d00:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:3d40::,2803:3d40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3d80::,2803:3d80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3dc0::,2803:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:3e00::,2803:3e00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3e20::,2803:3e20:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:3e40::,2803:3e40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3e80::,2803:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:3ec0::,2803:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:3f00::,2803:3f00:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:3f40::,2803:3f40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3f80::,2803:3f80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3fc0::,2803:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4000::,2803:4000:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4020::,2803:4020:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4040::,2803:4040:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4080::,2803:4080:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:40c0::,2803:40c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4100::,2803:4100:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4120::,2803:4120:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:4140::,2803:4140:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4180::,2803:4180:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:41c0::,2803:41c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:4200::,2803:4200:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:4220::,2803:4220:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:4240::,2803:4240:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:4280::,2803:4280:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:42c0::,2803:42c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:4300::,2803:4300:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:4340::,2803:4340:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:4380::,2803:4380:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:43c0::,2803:43c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:4400::,2803:4400:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4420::,2803:4420:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4440::,2803:4440:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4480::,2803:4480:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:44c0::,2803:44c0:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:4500::,2803:4500:ffff:ffff:ffff:ffff:ffff:ffff,CW +2803:4540::,2803:4540:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:4580::,2803:4580:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:45c0::,2803:45c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4600::,2803:4600:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:4620::,2803:4620:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:4640::,2803:4640:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:4680::,2803:4680:ffff:ffff:ffff:ffff:ffff:ffff,TT +2803:46c0::,2803:46c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:4700::,2803:4701:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4740::,2803:4740:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:4780::,2803:4780:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:47c0::,2803:47c0:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:4800::,2803:4800:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:4820::,2803:4820:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4840::,2803:4840:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4880::,2803:4880:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:48c0::,2803:48c0:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:4900::,2803:4900:ffff:ffff:ffff:ffff:ffff:ffff,BQ +2803:4940::,2803:4940:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4980::,2803:4980:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:49c0::,2803:49c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4a20::,2803:4a20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4a40::,2803:4a40:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:4a80::,2803:4a80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4ac0::,2803:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:4b00::,2803:4b00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4b40::,2803:4b40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4b80::,2803:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4bc0::,2803:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:4c00::,2803:4c00:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:4c20::,2803:4c20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4c40::,2803:4c40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4c80::,2803:4c80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4cc0::,2803:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4d00::,2803:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:4d40::,2803:4d40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4d80::,2803:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CW +2803:4dc0::,2803:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:4e00::,2803:4e00:ffff:ffff:ffff:ffff:ffff:ffff,UY +2803:4e20::,2803:4e20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4e40::,2803:4e40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4e80::,2803:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:4ec0::,2803:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4f00::,2803:4f00:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:4f40::,2803:4f40:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:4f80::,2803:4f80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4fc0::,2803:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5000::,2803:5000:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5020::,2803:5020:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5040::,2803:5040:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:5080::,2803:5080:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:50c0::,2803:50c0:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:5100::,2803:5100:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:5120::,2803:5120:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:5140::,2803:5140:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5180::,2803:5180:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:51c0::,2803:51c0:ffff:ffff:ffff:ffff:ffff:ffff,SX +2803:5200::,2803:5200:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:5220::,2803:5220:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5240::,2803:5240:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5280::,2803:5280:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:52c0::,2803:52c0:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:5300::,2803:5300:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:5340::,2803:5340:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5380::,2803:5380:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:53c0::,2803:53c0:ffff:ffff:ffff:ffff:ffff:ffff,GF +2803:5400::,2803:5400:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5420::,2803:5420:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:5440::,2803:5440:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5480::,2803:5480:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:54c0::,2803:54c0:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:5500::,2803:5500:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5540::,2803:5540:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5580::,2803:5580:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:55c0::,2803:55c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5600::,2803:5600:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:5620::,2803:5620:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:5640::,2803:5640:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:5680::,2803:5680:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:56c0::,2803:56c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:5700::,2803:5700:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:5740::,2803:5740:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:5780::,2803:5780:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:57c0::,2803:57c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:5820::,2803:5820:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5840::,2803:5840:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:5880::,2803:5880:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:58c0::,2803:58c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5900::,2803:5900:ffff:ffff:ffff:ffff:ffff:ffff,GF +2803:5940::,2803:5940:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:5980::,2803:5980:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:59c0::,2803:59c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:5a00::,2803:5a00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5a20::,2803:5a20:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:5a40::,2803:5a40:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:5a80::,2803:5a80:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:5ac0::,2803:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:5b00::,2803:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:5b40::,2803:5b40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5b80::,2803:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5bc0::,2803:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5c00::,2803:5c00:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:5c20::,2803:5c20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5c40::,2803:5c40:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:5c80::,2803:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:5cc0::,2803:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:5d00::,2803:5d00:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:5d40::,2803:5d40:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:5d80::,2803:5d80:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:5dc0::,2803:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5e00::,2803:5e00:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:5e20::,2803:5e20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5e40::,2803:5e40:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:5e80::,2803:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5ec0::,2803:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:5f40::,2803:5f40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5f80::,2803:5f80:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:5fc0::,2803:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6000::,2803:6000:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:6020::,2803:6020:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6040::,2803:6040:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6080::,2803:6087:ffff:ffff:ffff:ffff:ffff:ffff,US +2803:60c0::,2803:60c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:6100::,2803:6100:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6120::,2803:6120:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:6140::,2803:6140:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6180::,2803:6180:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:61c0::,2803:61c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6200::,2803:6200:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:6220::,2803:6220:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6240::,2803:6240:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:6280::,2803:6280:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:62c0::,2803:62c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:6300::,2803:6300:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:6340::,2803:6340:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:6380::,2803:6380:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:63c0::,2803:63c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6400::,2803:6400:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:6420::,2803:6420:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:6440::,2803:6440:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6480::,2803:6480:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:64c0::,2803:64c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6500::,2803:6500:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:6540::,2803:6540:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6580::,2803:6580:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:65c0::,2803:65c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:6600::,2803:6600:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6620::,2803:6620:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:6680::,2803:6680:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:66c0::,2803:66c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6700::,2803:6700:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:6740::,2803:6740:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6780::,2803:6780:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:67c0::,2803:67c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:6800::,2803:6800:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6820::,2803:6820:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6840::,2803:6840:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6880::,2803:6880:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:68c0::,2803:68c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6900::,2803:6900:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:6940::,2803:6940:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:6980::,2803:6980:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:69c0::,2803:69c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:6a00::,2803:6a00:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:6a20::,2803:6a20:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:6a40::,2803:6a40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6a80::,2803:6a80:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:6ac0::,2803:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6b00::,2803:6b00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6b40::,2803:6b40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6b80::,2803:6b80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6bc0::,2803:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:6c00::,2803:6c00:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:6c20::,2803:6c20:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:6c40::,2803:6c40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6c80::,2803:6c80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6cc0::,2803:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:6d00::,2803:6d00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6d40::,2803:6d40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6d80::,2803:6d80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:6dc0::,2803:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6e00::,2803:6e00:ffff:ffff:ffff:ffff:ffff:ffff,SR +2803:6e20::,2803:6e20:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:6e40::,2803:6e40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6e80::,2803:6e80:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:6ec0::,2803:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:6f00::,2803:6f00:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:6f40::,2803:6f40:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:6f80::,2803:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:6fc0::,2803:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7000::,2803:7000:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:7020::,2803:7020:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7040::,2803:7040:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7080::,2803:7080:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:70c0::,2803:70c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:7100::,2803:7100:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7140::,2803:7140:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:7180::,2803:7180:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:71c0::,2803:71c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7200::,2803:7200:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:7220::,2803:7220:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7240::,2803:7240:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7280::,2803:7280:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:72c0::,2803:72c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7300::,2803:7300:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7340::,2803:7340:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7380::,2803:7380:ffff:ffff:ffff:ffff:ffff:ffff,SX +2803:73c0::,2803:73c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7400::,2803:7400:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7420::,2803:7420:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:7440::,2803:7440:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7480::,2803:7480:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:74c0::,2803:74c0:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:7500::,2803:7500:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:7540::,2803:7540:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7580::,2803:7580:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:75c0::,2803:75c0:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:7600::,2803:7600:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7620::,2803:7620:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7640::,2803:7640:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:7680::,2803:7680:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:76c0::,2803:76c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7700::,2803:7700:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7740::,2803:7740:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7780::,2803:7780:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:77c0::,2803:77c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7800::,2803:7800:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:7820::,2803:7820:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:7840::,2803:7840:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7880::,2803:7880:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:78c0::,2803:78c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7900::,2803:7900:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:7940::,2803:7940:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7980::,2803:7980:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:79c0::,2803:79c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7a00::,2803:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:7a20::,2803:7a20:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:7a40::,2803:7a40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7a80::,2803:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:7ac0::,2803:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7b00::,2803:7b00:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:7b40::,2803:7b40:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:7b80::,2803:7b80:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:7bc0::,2803:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:7c00::,2803:7c00:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:7c20::,2803:7c20:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:7c40::,2803:7c40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7c80::,2803:7c80:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:7cc0::,2803:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:7d00::,2803:7d00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7d40::,2803:7d40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7d80::,2803:7d80:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:7dc0::,2803:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7e00::,2803:7e00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7e20::,2803:7e20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7e40::,2803:7e40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7e80::,2803:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7ec0::,2803:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:7f00::,2803:7f00:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:7f40::,2803:7f40:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:7f80::,2803:7f80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7fc0::,2803:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:8000::,2803:8000:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8020::,2803:8020:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8040::,2803:8040:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:8080::,2803:8080:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:80c0::,2803:80c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8100::,2803:8100:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:8120::,2803:8120:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8140::,2803:8140:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:8180::,2803:8180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:81c0::,2803:81c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:8200::,2803:8200:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:8220::,2803:8220:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:8240::,2803:8240:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:8280::,2803:8280:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:82c0::,2803:82c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8300::,2803:8300:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:8340::,2803:8340:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:8380::,2803:8380:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:83c0::,2803:83c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8400::,2803:8400:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:8420::,2803:8420:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:8440::,2803:8440:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8480::,2803:8480:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:84c0::,2803:84c0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:8500::,2803:8500:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8540::,2803:8540:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:8580::,2803:8580:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:85c0::,2803:85c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:8600::,2803:8600:ffff:ffff:ffff:ffff:ffff:ffff,HT +2803:8620::,2803:8620:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8640::,2803:8640:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8680::,2803:8680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:86c0::,2803:86c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:8700::,2803:8700:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:8740::,2803:8740:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8780::,2803:8780:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:87c0::,2803:87c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:8800::,2803:8800:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:8820::,2803:8820:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:8840::,2803:8840:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:8880::,2803:8880:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:88c0::,2803:88c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8900::,2803:8900:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8940::,2803:8940:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:8980::,2803:8980:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:89c0::,2803:89c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:8a20::,2803:8a20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8a40::,2803:8a40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8a80::,2803:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8ac0::,2803:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:8b00::,2803:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:8b40::,2803:8b40:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:8b80::,2803:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:8bc0::,2803:8bc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8c00::,2803:8c00:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:8c20::,2803:8c20:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:8c40::,2803:8c40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8c80::,2803:8c80:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:8cc0::,2803:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8d00::,2803:8d00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8d43::,2803:8d43:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:8d80::,2803:8d80:ffff:ffff:ffff:ffff:ffff:ffff,UY +2803:8dc0::,2803:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8e00::,2803:8e00:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:8e20::,2803:8e20:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:8e40::,2803:8e40:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:8e80::,2803:8e80:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:8ec0::,2803:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:8f00::,2803:8f00:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:8f40::,2803:8f40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:8f80::,2803:8f80:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:8fc0::,2803:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9000::,2803:9000:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9020::,2803:9020:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9040::,2803:9040:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:9080::,2803:9080:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:90c0::,2803:90c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9100::,2803:9100:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9120::,2803:9120:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9140::,2803:9140:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:9180::,2803:9180:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:91c0::,2803:91c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9200::,2803:9200:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:9220::,2803:9220:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9240::,2803:9240:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9280::,2803:9280:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:92c0::,2803:92c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9300::,2803:9300:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9340::,2803:9340:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:9380::,2803:9380:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:93c0::,2803:93c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9400::,2803:9400:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:9420::,2803:9420:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9440::,2803:9440:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9480::,2803:9480:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:94c0::,2803:94c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9500::,2803:9500:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9540::,2803:9540:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:9580::,2803:9580:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:95c0::,2803:95c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:9600::,2803:9600:ffff:ffff:ffff:ffff:ffff:ffff,CW +2803:9620::,2803:9620:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9640::,2803:9640:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:9680::,2803:9680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:96c0::,2803:96c0:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:9740::,2803:9740:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9780::,2803:9780:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:97c0::,2803:97c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:9800::,2803:9800:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9820::,2803:9820:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9840::,2803:9840:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:9880::,2803:9880:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:98c0::,2803:98c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9900::,2803:9900:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:9940::,2803:9940:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9980::,2803:9980:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:99c0::,2803:99c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9a00::,2803:9a00:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:9a20::,2803:9a20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9a40::,2803:9a40:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:9a80::,2803:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:9ac0::,2803:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:9b00::,2803:9b00:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:9b40::,2803:9b40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9b80::,2803:9b80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9bc0::,2803:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:9c00::,2803:9c00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9c20::,2803:9c20:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:9c40::,2803:9c40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9c80::,2803:9c80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9cc0::,2803:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:9d00::,2803:9d00:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:9d40::,2803:9d40:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:9d80::,2803:9d80:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:9dc0::,2803:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:9e00::,2803:9e00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9e20::,2803:9e20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9e40::,2803:9e40:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:9e80::,2803:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:9ec0::,2803:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:9f00::,2803:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9f40::,2803:9f40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9f80::,2803:9f80:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:9fc0::,2803:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a000::,2803:a000:ffff:ffff:ffff:ffff:ffff:ffff,BQ +2803:a020::,2803:a020:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a040::,2803:a040:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:a080::,2803:a080:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a0c0::,2803:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a100::,2803:a100:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:a120::,2803:a120:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a140::,2803:a140:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:a180::,2803:a180:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:a1c0::,2803:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:a200::,2803:a200:ffff:ffff:ffff:ffff:ffff:ffff,SR +2803:a220::,2803:a220:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a240::,2803:a240:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:a280::,2803:a280:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:a2c0::,2803:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:a340::,2803:a340:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a380::,2803:a380:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:a3c0::,2803:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a400::,2803:a400:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:a420::,2803:a420:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:a440::,2803:a440:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a480::,2803:a480:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a4c0::,2803:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a500::,2803:a500:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a540::,2803:a540:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a580::,2803:a580:ffff:ffff:ffff:ffff:ffff:ffff,HT +2803:a5c0::,2803:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:a600::,2803:a600:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a620::,2803:a620:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a640::,2803:a640:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:a680::,2803:a680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a6c0::,2803:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:a700::,2803:a700:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:a740::,2803:a740:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:a780::,2803:a780:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a7c0::,2803:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a800::,2803:a800:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:a820::,2803:a820:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:a880::,2803:a880:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a8c0::,2803:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:a900::,2803:a900:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a940::,2803:a940:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:a980::,2803:a980:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:a9c0::,2803:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:aa00::,2803:aa00:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:aa20::,2803:aa20:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:aa40::,2803:aa40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:aa80::,2803:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:aac0::,2803:aac0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ab00::,2803:ab00:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:ab40::,2803:ab40:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:ab80::,2803:ab80:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:abc0::,2803:abc0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:ac00::,2803:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:ac20::,2803:ac20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ac40::,2803:ac40:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:ac80::,2803:ac80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:acc0::,2803:acc0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:ad00::,2803:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ad40::,2803:ad40:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:ad80::,2803:ad80:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:adc0::,2803:adc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ae00::,2803:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ae20::,2803:ae20:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:ae40::,2803:ae40:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:ae80::,2803:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:aec0::,2803:aec0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:af00::,2803:af00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:af40::,2803:af40:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:af80::,2803:af80:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:afc0::,2803:afc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b000::,2803:b000:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:b020::,2803:b020:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b080::,2803:b080:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:b0c0::,2803:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:b100::,2803:b100:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:b140::,2803:b140:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:b180::,2803:b180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:b1c0::,2803:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:b200::,2803:b200:ffff:ffff:ffff:ffff:ffff:ffff,UY +2803:b220::,2803:b220:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b240::,2803:b240:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:b280::,2803:b280:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:b2c0::,2803:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:b300::,2803:b300:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:b340::,2803:b340:ffff:ffff:ffff:ffff:ffff:ffff,SX +2803:b380::,2803:b380:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b3c0::,2803:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:b400::,2803:b400:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:b420::,2803:b420:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:b440::,2803:b440:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:b480::,2803:b480:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:b4c0::,2803:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:b500::,2803:b500:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:b540::,2803:b540:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:b580::,2803:b580:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:b5c0::,2803:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:b600::,2803:b600:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b620::,2803:b620:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b640::,2803:b640:ffff:ffff:ffff:ffff:ffff:ffff,AW +2803:b680::,2803:b680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b6c0::,2803:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b700::,2803:b700:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:b740::,2803:b740:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b780::,2803:b780:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:b7c0::,2803:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b800::,2803:b800:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:b820::,2803:b820:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:b840::,2803:b840:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:b880::,2803:b880:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b8c0::,2803:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b900::,2803:b900:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b940::,2803:b940:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:b9c0::,2803:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:ba00::,2803:ba00:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:ba20::,2803:ba20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ba40::,2803:ba40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ba80::,2803:ba80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bac0::,2803:bac0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bb00::,2803:bb00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bb40::,2803:bb40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bb80::,2803:bb80:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:bbc0::,2803:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:bc00::,2803:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bc20::,2803:bc20:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:bc40::,2803:bc40:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:bc80::,2803:bc80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:bcc0::,2803:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bd00::,2803:bd00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bd40::,2803:bd40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bd80::,2803:bd80:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:bdc0::,2803:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:be00::,2803:be00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:be20::,2803:be20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:be40::,2803:be40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:be80::,2803:be80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:bec0::,2803:bec0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bf00::,2803:bf00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bf40::,2803:bf40:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:bf80::,2803:bf80:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:bfc0::,2803:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:c000::,2803:c000:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:c020::,2803:c020:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c040::,2803:c040:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:c080::,2803:c080:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c0c0::,2803:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c100::,2803:c100:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:c120::,2803:c120:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:c140::,2803:c140:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c180::,2803:c180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:c1c0::,2803:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c200::,2803:c200:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:c220::,2803:c220:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:c240::,2803:c240:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:c280::,2803:c280:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:c2c0::,2803:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:c300::,2803:c300:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:c340::,2803:c340:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c380::,2803:c380:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:c3c0::,2803:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:c400::,2803:c400:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c420::,2803:c420:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:c440::,2803:c440:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c480::,2803:c480:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c4c0::,2803:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:c500::,2803:c500:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c540::,2803:c540:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:c580::,2803:c580:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c5c0::,2803:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:c600::,2803:c600:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:c620::,2803:c620:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c640::,2803:c640:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c680::,2803:c680:ffff:ffff:ffff:ffff:ffff:ffff,HT +2803:c6c0::,2803:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c700::,2803:c700:ffff:ffff:ffff:ffff:ffff:ffff,GF +2803:c740::,2803:c740:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c780::,2803:c780:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c7c0::,2803:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:c800::,2803:c800:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:c820::,2803:c820:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:c840::,2803:c840:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:c880::,2803:c880:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:c8c0::,2803:c8c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c900::,2803:c900:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c940::,2803:c940:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:c980::,2803:c980:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:c9c0::,2803:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ca00::,2803:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ca20::,2803:ca20:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:ca40::,2803:ca40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ca80::,2803:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:cac0::,2803:cac0:ffff:ffff:ffff:ffff:ffff:ffff,HT +2803:cb00::,2803:cb00:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:cb40::,2803:cb40:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:cb80::,2803:cb80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cbc0::,2803:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cc00::,2803:cc00:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:cc20::,2803:cc20:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:cc40::,2803:cc40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cc80::,2803:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ccc0::,2803:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cd00::,2803:cd00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cd40::,2803:cd40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cd80::,2803:cd80:ffff:ffff:ffff:ffff:ffff:ffff,TT +2803:cdc0::,2803:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:ce00::,2803:ce00:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:ce20::,2803:ce20:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:ce40::,2803:ce40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ce80::,2803:ce80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cec0::,2803:cec0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:cf00::,2803:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cf40::,2803:cf40:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:cf80::,2803:cf80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cfc0::,2803:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,UY +2803:d000::,2803:d000:fffd:ffff:ffff:ffff:ffff:ffff,BZ +2803:d000:fffe::,2803:d000:fffe:ffff:ffff:ffff:ffff:ffff,US +2803:d000:ffff::,2803:d000:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:d020::,2803:d020:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:d040::,2803:d040:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:d080::,2803:d080:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d0c0::,2803:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d100::,2803:d100:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:d120::,2803:d120:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d140::,2803:d140:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:d180::,2803:d180:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:d1c0::,2803:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:d200::,2803:d200:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:d220::,2803:d220:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:d240::,2803:d240:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d280::,2803:d280:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:d2c0::,2803:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d340::,2803:d340:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d380::,2803:d380:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:d3c0::,2803:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:d400::,2803:d400:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d420::,2803:d420:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d440::,2803:d440:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:d480::,2803:d480:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:d4c0::,2803:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:d500::,2803:d500:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:d540::,2803:d540:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:d580::,2803:d580:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:d5c0::,2803:d5c0:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:d600::,2803:d600:ffff:ffff:ffff:ffff:ffff:ffff,UY +2803:d620::,2803:d620:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d640::,2803:d640:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:d680::,2803:d680:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:d6c0::,2803:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:d700::,2803:d700:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:d740::,2803:d740:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d780::,2803:d780:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:d7c0::,2803:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d800::,2803:d800:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d820::,2803:d820:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d840::,2803:d840:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:d880::,2803:d880:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:d8c0::,2803:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:d900::,2803:d900:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:d940::,2803:d940:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:d980::,2803:d980:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:d9c0::,2803:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:da00::,2803:da00:ffff:ffff:ffff:ffff:ffff:ffff,GY +2803:da20::,2803:da20:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:da40::,2803:da40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:da80::,2803:da80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:dac0::,2803:dac0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:db00::,2803:db00:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:db40::,2803:db40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:db80::,2803:db80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:dbc0::,2803:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:dc00::,2803:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:dc20::,2803:dc20:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:dc40::,2803:dc40:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:dc80::,2803:dc80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:dcc0::,2803:dcc0:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:dd00::,2803:dd00:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:dd40::,2803:dd40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:dd80::,2803:dd80:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:ddc0::,2803:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:de00::,2803:de00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:de20::,2803:de20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:de40::,2803:de40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:de80::,2803:de80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:dec0::,2803:dec0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:df00::,2803:df00:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:df40::,2803:df40:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:df80::,2803:df80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:dfc0::,2803:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:e000::,2803:e000:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:e020::,2803:e020:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:e040::,2803:e040:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e080::,2803:e080:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e0c0::,2803:e0c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e100::,2803:e100:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e120::,2803:e120:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:e140::,2803:e140:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:e180::,2803:e180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:e1c0::,2803:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:e200::,2803:e200:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e220::,2803:e220:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:e240::,2803:e240:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:e280::,2803:e280:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e2c0::,2803:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:e300::,2803:e300:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:e340::,2803:e340:ffff:ffff:ffff:ffff:ffff:ffff,GY +2803:e380::,2803:e380:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:e3c0::,2803:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e400::,2803:e400:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e420::,2803:e420:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e440::,2803:e440:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e480::,2803:e480:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e4c0::,2803:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:e500::,2803:e500:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:e540::,2803:e540:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e580::,2803:e580:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:e5c0::,2803:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e600::,2803:e600:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:e620::,2803:e620:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:e640::,2803:e640:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:e680::,2803:e680:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:e6c0::,2803:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:e700::,2803:e700:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:e740::,2803:e740:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e780::,2803:e780:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:e7c0::,2803:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:e800::,2803:e800:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:e820::,2803:e820:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:e840::,2803:e840:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:e880::,2803:e880:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:e8c0::,2803:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:e900::,2803:e900:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e940::,2803:e940:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e9c0::,2803:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ea00::,2803:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ea20::,2803:ea20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ea40::,2803:ea40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ea80::,2803:ea80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:eac0::,2803:eac0:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:eb00::,2803:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:eb40::,2803:eb40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:eb80::,2803:eb80:7fff:ffff:ffff:ffff:ffff:ffff,AR +2803:eb80:8000::,2803:eb80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:ebc0::,2803:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:ec00::,2803:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ec20::,2803:ec20:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:ec40::,2803:ec40:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:ec80::,2803:ec80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ecc0::,2803:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:ed00::,2803:ed00:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:ed40::,2803:ed40:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:ed80::,2803:ed80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:edc0::,2803:edc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:ee00::,2803:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ee20::,2803:ee20:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:ee40::,2803:ee40:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:ee80::,2803:ee80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:eec0::,2803:eec0:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:ef00::,2803:ef00:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:ef40::,2803:ef40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ef80::,2803:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:efc0::,2803:efc0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:f000::,2803:f000:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f020::,2803:f020:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:f040::,2803:f040:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f080::,2803:f080:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:f0c0::,2803:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:f100::,2803:f100:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f140::,2803:f140:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f180::,2803:f180:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:f1c0::,2803:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:f200::,2803:f200:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f220::,2803:f220:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f240::,2803:f240:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f280::,2803:f280:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:f2c0::,2803:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:f300::,2803:f300:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f340::,2803:f340:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:f380::,2803:f380:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f3c0::,2803:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:f400::,2803:f400:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:f420::,2803:f420:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:f440::,2803:f440:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:f480::,2803:f480:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:f4c0::,2803:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f500::,2803:f500:ffff:ffff:ffff:ffff:ffff:ffff,CW +2803:f540::,2803:f540:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:f580::,2803:f580:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f5c0::,2803:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:f600::,2803:f600:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:f620::,2803:f620:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:f640::,2803:f640:ffff:ffff:ffff:ffff:ffff:ffff,BQ +2803:f680::,2803:f680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f6c0::,2803:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f700::,2803:f700:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f740::,2803:f740:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f780::,2803:f780:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:f7c0::,2803:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f800::,2803:f800:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:f820::,2803:f820:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f840::,2803:f840:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:f8c0::,2803:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:f900::,2803:f900:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:f940::,2803:f940:ffff:ffff:ffff:ffff:ffff:ffff,SX +2803:f980::,2803:f980:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:f9c0::,2803:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:fa00::,2803:fa00:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:fa20::,2803:fa20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:fa40::,2803:fa40:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:fa80::,2803:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:fac0::,2803:fac0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:fb00::,2803:fb00:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:fb40::,2803:fb40:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:fb80::,2803:fb80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:fbc0::,2803:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:fc00::,2803:fc00:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:fc20::,2803:fc20:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:fc40::,2803:fc40:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:fc80::,2803:fc80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:fcc0::,2803:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:fd00::,2803:fd00:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:fd40::,2803:fd40:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:fd80::,2803:fd80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:fdc0::,2803:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:fe00::,2803:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:fe20::,2803:fe20:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:fe40::,2803:fe40:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:fe80::,2803:fe80:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:fec0::,2803:fec0:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ff40::,2803:ff40:ffff:ffff:ffff:ffff:ffff:ffff,SR +2803:ff80::,2803:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:ffc0::,2803:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,CL +2804::,2804::ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4::,2804:4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8::,2804:c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10::,2804:10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14::,2804:14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18::,2804:18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c::,2804:1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20::,2804:20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24::,2804:24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28::,2804:28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30::,2804:30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34::,2804:34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38::,2804:38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c::,2804:3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40::,2804:40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44::,2804:44::ffff:ffff:ffff:ffff:ffff,BR +2804:44:1::,2804:44:1:ffff:ffff:ffff:ffff:ffff,US +2804:44:2::,2804:44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:48::,2804:48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4c::,2804:4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:50::,2804:50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:54::,2804:54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:58::,2804:58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5c::,2804:5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:60::,2804:60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:64::,2804:64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:68::,2804:68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6c::,2804:6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:70::,2804:70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:74::,2804:74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:78::,2804:78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7c::,2804:7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:80::,2804:80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:84::,2804:84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:88::,2804:88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8c::,2804:8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:90::,2804:90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:94::,2804:94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:98::,2804:98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9c::,2804:9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a0::,2804:a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a4::,2804:a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a8::,2804:a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ac::,2804:ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b0::,2804:b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b4::,2804:b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b8::,2804:b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c0::,2804:c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c4::,2804:c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c8::,2804:c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cc::,2804:cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d0::,2804:d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d4::,2804:d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d8::,2804:d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e0::,2804:e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e4::,2804:e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e8::,2804:e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ec::,2804:ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f0::,2804:f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f4::,2804:f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f8::,2804:f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fc::,2804:fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:100::,2804:100:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:104::,2804:104:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10c::,2804:10c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:110::,2804:110:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:114::,2804:114:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:118::,2804:118:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11c::,2804:11c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:120::,2804:120:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:124::,2804:124:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:128::,2804:128:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:130::,2804:130:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:134::,2804:134:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:138::,2804:138:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13c::,2804:13c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:140::,2804:140:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:144::,2804:144:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:148::,2804:148:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14c::,2804:14c:34:1fff:ffff:ffff:ffff:ffff,BR +2804:14c:34:2000::,2804:14c:34:20ff:ffff:ffff:ffff:ffff,BE +2804:14c:34:2100::,2804:14d:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:150::,2804:154:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:158::,2804:158:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15c::,2804:15c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:160::,2804:160:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:164::,2804:164:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:168::,2804:168:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16c::,2804:16c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:170::,2804:170:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:174::,2804:174:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:178::,2804:178:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17c::,2804:17c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:180::,2804:180:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:184::,2804:184:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:188::,2804:188:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18c::,2804:18c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:190::,2804:190:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:194::,2804:194:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:198::,2804:198:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19c::,2804:19c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a0::,2804:1a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a4::,2804:1a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a8::,2804:1a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ac::,2804:1ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b0::,2804:1b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bc::,2804:1bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c0::,2804:1c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c4::,2804:1c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c8::,2804:1c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cc::,2804:1cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d0::,2804:1d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d4::,2804:1d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d8::,2804:1d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dc::,2804:1dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e0::,2804:1e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e8::,2804:1e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ec::,2804:1ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f0::,2804:1f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f4::,2804:1f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f8::,2804:1f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:200::,2804:200:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:204::,2804:204:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:208::,2804:208:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20c::,2804:20c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:210::,2804:210:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:214::,2804:214:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:218::,2804:218:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:220::,2804:220:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:224::,2804:224:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22c::,2804:22c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:230::,2804:230:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:234::,2804:234:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:238::,2804:238:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23c::,2804:23c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:240::,2804:240:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:244::,2804:244:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:248::,2804:248:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24c::,2804:24c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:250::,2804:250:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:254::,2804:254:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:258::,2804:258:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25c::,2804:25c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:260::,2804:260:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:268::,2804:268:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26c::,2804:26c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:270::,2804:270:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:274::,2804:274:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27c::,2804:27c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:280::,2804:280:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:284::,2804:284:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:288::,2804:288:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28c::,2804:28c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:290::,2804:290:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:294::,2804:294:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:298::,2804:298:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a0::,2804:2a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a4::,2804:2a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a8::,2804:2a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ac::,2804:2ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b0::,2804:2b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b4::,2804:2b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b8::,2804:2b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bc::,2804:2bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c0::,2804:2c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c8::,2804:2c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cc::,2804:2cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d0::,2804:2d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d4::,2804:2d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d8::,2804:2d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dc::,2804:2dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e0::,2804:2e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e4::,2804:2e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e8::,2804:2e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ec::,2804:2ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f0::,2804:2f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f4::,2804:2f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f8::,2804:2f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fc::,2804:2fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:300::,2804:303:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:308::,2804:308:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30c::,2804:30c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:310::,2804:310:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:314::,2804:314:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:318::,2804:318:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31c::,2804:31c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:320::,2804:320:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:324::,2804:324:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:328::,2804:328:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:330::,2804:330:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:334::,2804:334:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:338::,2804:338:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33c::,2804:33c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:340::,2804:340:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:344::,2804:344:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:348::,2804:348:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:350::,2804:350:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:354::,2804:354:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:358::,2804:358:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35c::,2804:35c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:360::,2804:360:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:364::,2804:364:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:368::,2804:368:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36c::,2804:36c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:370::,2804:370:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:374::,2804:374:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:378::,2804:378:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37c::,2804:37c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:380::,2804:380:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:388::,2804:38b:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:390::,2804:390:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:394::,2804:394:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39c::,2804:39c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a0::,2804:3a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a4::,2804:3a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a8::,2804:3a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ac::,2804:3ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b0::,2804:3b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b4::,2804:3b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b8::,2804:3b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bc::,2804:3bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c0::,2804:3c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c4::,2804:3c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c8::,2804:3c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cc::,2804:3cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d0::,2804:3d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d4::,2804:3d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d8::,2804:3d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dc::,2804:3dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e0::,2804:3e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e4::,2804:3e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e8::,2804:3e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ec::,2804:3ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f0::,2804:3f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f4::,2804:3f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f8::,2804:3f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fc::,2804:3fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:400::,2804:400:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:404::,2804:404:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40c::,2804:40c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:414::,2804:414:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:418::,2804:418:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41c::,2804:41c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:420::,2804:420:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:424::,2804:424:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:428::,2804:428:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:430::,2804:431:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:438::,2804:438:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43c::,2804:43c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:440::,2804:440:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:444::,2804:444:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:448::,2804:448:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44c::,2804:44c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:450::,2804:450:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:454::,2804:454:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:458::,2804:458:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45c::,2804:45c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:460::,2804:460:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:464::,2804:464:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:468::,2804:468:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46c::,2804:46c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:470::,2804:470:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:474::,2804:474:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:478::,2804:478:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:47c::,2804:47c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:480::,2804:480:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:484::,2804:484:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:488::,2804:488:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:48c::,2804:48c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:490::,2804:490:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:494::,2804:494:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:498::,2804:498:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:49c::,2804:49c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4a0::,2804:4a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4a4::,2804:4a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4a8::,2804:4a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4ac::,2804:4ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4b0::,2804:4b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4b4::,2804:4b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4b8::,2804:4b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4bc::,2804:4bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4c0::,2804:4c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4c4::,2804:4c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4c8::,2804:4c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4cc::,2804:4cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4d4::,2804:4d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4d8::,2804:4d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4dc::,2804:4dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4e0::,2804:4e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4e4::,2804:4e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4e8::,2804:4e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4ec::,2804:4ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4f0::,2804:4f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4f4::,2804:4f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4f8::,2804:4f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4fc::,2804:4fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:500::,2804:500:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:504::,2804:504:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:508::,2804:508:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:50c::,2804:50c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:510::,2804:510:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:514::,2804:514:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:518::,2804:518:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:51c::,2804:51c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:520::,2804:520:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:528::,2804:528:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:52c::,2804:52c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:530::,2804:530:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:534::,2804:534:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:538::,2804:538:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:53c::,2804:53c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:540::,2804:540:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:544::,2804:544:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:548::,2804:548:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:54c::,2804:54c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:550::,2804:550:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:554::,2804:554:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:558::,2804:558:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:55c::,2804:55c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:560::,2804:560:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:564::,2804:564:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:568::,2804:568:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:56c::,2804:56c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:574::,2804:574:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:578::,2804:578:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:57c::,2804:57c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:580::,2804:580:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:584::,2804:584:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:588::,2804:588:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:58c::,2804:58c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:590::,2804:590:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:594::,2804:594:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:598::,2804:598:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:59c::,2804:59c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5a4::,2804:5a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5a8::,2804:5a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5ac::,2804:5ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5b0::,2804:5b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5b4::,2804:5b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5b8::,2804:5b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5bc::,2804:5bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5c0::,2804:5c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5c4::,2804:5c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5c8::,2804:5c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5cc::,2804:5cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5d0::,2804:5d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5d4::,2804:5d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5d8::,2804:5d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5dc::,2804:5dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5e0::,2804:5e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5e4::,2804:5e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5e8::,2804:5e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5ec::,2804:5ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5f0::,2804:5f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5f4::,2804:5f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:5f8::,2804:5f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:600::,2804:600:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:604::,2804:604:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:608::,2804:608:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:60c::,2804:60c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:610::,2804:610:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:614::,2804:614:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:618::,2804:618:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:61c::,2804:61c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:620::,2804:620:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:624::,2804:624:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:628::,2804:628:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:62c::,2804:62c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:630::,2804:630:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:634::,2804:634:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:638::,2804:638:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:63c::,2804:63c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:640::,2804:640:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:644::,2804:644:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:648::,2804:648:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:64c::,2804:64c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:650::,2804:650:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:654::,2804:654:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:658::,2804:658:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:65c::,2804:65c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:660::,2804:660:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:664::,2804:664:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:668::,2804:668:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:66c::,2804:66c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:670::,2804:670:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:674::,2804:674:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:678::,2804:678:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:680::,2804:680:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:684::,2804:684:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:688::,2804:688:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:68c::,2804:68c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:690::,2804:690:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:694::,2804:694:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:698::,2804:698:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:69c::,2804:69c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6a0::,2804:6a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6a4::,2804:6a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6a8::,2804:6a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6ac::,2804:6ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6b0::,2804:6b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6b4::,2804:6b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6b8::,2804:6b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6bc::,2804:6bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6c0::,2804:6c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6c4::,2804:6c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6c8::,2804:6c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6cc::,2804:6cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6d0::,2804:6d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6d4::,2804:6d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6d8::,2804:6d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6dc::,2804:6dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6e0::,2804:6e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6e4::,2804:6e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6e8::,2804:6e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6ec::,2804:6ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6f0::,2804:6f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6f4::,2804:6f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6f8::,2804:6f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:6fc::,2804:6fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:700::,2804:700:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:704::,2804:704:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:70c::,2804:70c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:710::,2804:710:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:714::,2804:714:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:718::,2804:718:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:71c::,2804:71c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:720::,2804:720:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:724::,2804:724:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:728::,2804:728:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:72c::,2804:72c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:730::,2804:730:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:734::,2804:734:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:738::,2804:738:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:73c::,2804:73c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:740::,2804:740:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:744::,2804:744:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:748::,2804:748:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:74c::,2804:74c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:750::,2804:750:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:754::,2804:754:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:758::,2804:758:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:75c::,2804:75c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:760::,2804:760:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:764::,2804:764:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:768::,2804:768:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:76c::,2804:76c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:770::,2804:770:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:774::,2804:774:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:778::,2804:778:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:77c::,2804:77c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:780::,2804:780:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:784::,2804:784:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:788::,2804:788:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:78c::,2804:78c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:790::,2804:790:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:794::,2804:794:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:798::,2804:798:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:79c::,2804:79c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7a0::,2804:7a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7a4::,2804:7a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7a8::,2804:7a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7ac::,2804:7ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7b0::,2804:7b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7b4::,2804:7b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7b8::,2804:7b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7bc::,2804:7bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7c0::,2804:7c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7c4::,2804:7c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7c8::,2804:7c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7cc::,2804:7cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7d0::,2804:7d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7d4::,2804:7d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7dc::,2804:7dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7e0::,2804:7e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7e4::,2804:7e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7e8::,2804:7e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7ec::,2804:7ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:7f0::,2804:7f7:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:800::,2804:800:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:804::,2804:804:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:808::,2804:808:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:80c::,2804:80c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:810::,2804:810:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:814::,2804:814:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:818::,2804:818:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:81c::,2804:81c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:820::,2804:820:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:824::,2804:824:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:828::,2804:828:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:82c::,2804:82c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:830::,2804:830:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:834::,2804:834:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:838::,2804:838:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:840::,2804:840:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:844::,2804:844:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:848::,2804:848:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:84c::,2804:84c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:850::,2804:850:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:854::,2804:854:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:858::,2804:858:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:85c::,2804:85c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:860::,2804:860:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:864::,2804:864:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:868::,2804:868:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:86c::,2804:86c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:870::,2804:870:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:874::,2804:874:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:878::,2804:878:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:87c::,2804:87c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:880::,2804:880:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:884::,2804:884:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:888::,2804:888:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:88c::,2804:88c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:890::,2804:890:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:894::,2804:894:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:898::,2804:898:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:89c::,2804:89c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8a0::,2804:8a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8a8::,2804:8a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8ac::,2804:8ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8b0::,2804:8b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8b4::,2804:8b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8bc::,2804:8bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8c0::,2804:8c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8c8::,2804:8c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8cc::,2804:8cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8d0::,2804:8d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8d4::,2804:8d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8d8::,2804:8d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8dc::,2804:8dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8e0::,2804:8e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8e4::,2804:8e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8e8::,2804:8e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8ec::,2804:8ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8f0::,2804:8f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8f4::,2804:8f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8f8::,2804:8f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:8fc::,2804:8fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:904::,2804:904:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:908::,2804:908:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:90c::,2804:90c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:910::,2804:910:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:918::,2804:918:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:91c::,2804:91c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:920::,2804:920:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:924::,2804:924:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:928::,2804:928:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:92c::,2804:92c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:930::,2804:930:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:934::,2804:934:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:938::,2804:938:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:93c::,2804:93c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:940::,2804:940:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:948::,2804:948:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:94c::,2804:94c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:950::,2804:950:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:954::,2804:954:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:958::,2804:958:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:95c::,2804:95c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:960::,2804:960:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:964::,2804:964:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:968::,2804:968:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:96c::,2804:96c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:970::,2804:970:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:978::,2804:978:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:97c::,2804:97c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:980::,2804:980:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:984::,2804:984:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:988::,2804:988:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:98c::,2804:98c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:990::,2804:990:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:994::,2804:994:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:998::,2804:998:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:99c::,2804:99c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9a0::,2804:9a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9a4::,2804:9a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9a8::,2804:9a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9ac::,2804:9ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9b0::,2804:9b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9b4::,2804:9b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9b8::,2804:9b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9bc::,2804:9bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9c0::,2804:9c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9c4::,2804:9c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9c8::,2804:9c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9cc::,2804:9cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9d0::,2804:9d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9d4::,2804:9d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9d8::,2804:9d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9dc::,2804:9dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9e0::,2804:9e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9e4::,2804:9e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9e8::,2804:9e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9ec::,2804:9ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9f0::,2804:9f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9f4::,2804:9f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9f8::,2804:9f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:9fc::,2804:9fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a00::,2804:a00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a08::,2804:a08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a0c::,2804:a0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a10::,2804:a10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a14::,2804:a14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a18::,2804:a18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a1c::,2804:a1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a20::,2804:a20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a24::,2804:a24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a28::,2804:a28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a2c::,2804:a2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a30::,2804:a30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a34::,2804:a34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a38::,2804:a38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a3c::,2804:a3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a40::,2804:a40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a44::,2804:a44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a48::,2804:a48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a4c::,2804:a4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a50::,2804:a50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a54::,2804:a54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a58::,2804:a58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a5c::,2804:a5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a60::,2804:a60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a64::,2804:a64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a68::,2804:a68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a6c::,2804:a6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a70::,2804:a70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a74::,2804:a74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a78::,2804:a78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a80::,2804:a80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a84::,2804:a84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a88::,2804:a88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a8c::,2804:a8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a90::,2804:a90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a94::,2804:a94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a98::,2804:a98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:a9c::,2804:a9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:aa0::,2804:aa0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:aa4::,2804:aa4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:aa8::,2804:aa8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:aac::,2804:aac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ab0::,2804:ab0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ab4::,2804:ab4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ab8::,2804:ab8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:abc::,2804:abc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ac0::,2804:ac0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ac4::,2804:ac4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ac8::,2804:ac8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:acc::,2804:acc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ad0::,2804:ad0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ad4::,2804:ad4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ad8::,2804:ad8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:adc::,2804:adc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ae0::,2804:ae0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ae4::,2804:ae4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ae8::,2804:ae8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:aec::,2804:aec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:af4::,2804:af4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:af8::,2804:af8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:afc::,2804:afc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b00::,2804:b00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b04::,2804:b04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b08::,2804:b08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b0c::,2804:b0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b10::,2804:b10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b14::,2804:b14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b18::,2804:b18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b1c::,2804:b1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b24::,2804:b24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b28::,2804:b28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b2c::,2804:b2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b30::,2804:b30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b34::,2804:b34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b38::,2804:b38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b3c::,2804:b3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b40::,2804:b40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b44::,2804:b44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b48::,2804:b48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b4c::,2804:b4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b50::,2804:b50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b54::,2804:b54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b58::,2804:b58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b5c::,2804:b5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b60::,2804:b60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b64::,2804:b64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b6c::,2804:b6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b70::,2804:b70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b78::,2804:b78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b7c::,2804:b7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b80::,2804:b80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b84::,2804:b84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b88::,2804:b88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b8c::,2804:b8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b90::,2804:b90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b94::,2804:b94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b98::,2804:b98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:b9c::,2804:b9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ba0::,2804:ba0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ba4::,2804:ba5:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ba8::,2804:ba8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bac::,2804:bac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bb0::,2804:bb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bb4::,2804:bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bb8::,2804:bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bbc::,2804:bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bc4::,2804:bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bc8::,2804:bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bcc::,2804:bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bd0::,2804:bd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bd4::,2804:bd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bd8::,2804:bd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bdc::,2804:bdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:be0::,2804:be0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:be4::,2804:be4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:be8::,2804:be8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bec::,2804:bec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bf0::,2804:bf0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bf4::,2804:bf4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bf8::,2804:bf8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:bfc::,2804:bfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c00::,2804:c00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c04::,2804:c04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c08::,2804:c08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c0c::,2804:c0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c10::,2804:c10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c14::,2804:c14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c18::,2804:c18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c1c::,2804:c1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c20::,2804:c20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c24::,2804:c24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c28::,2804:c28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c2c::,2804:c2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c30::,2804:c30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c34::,2804:c34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c38::,2804:c38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c3c::,2804:c3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c40::,2804:c40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c44::,2804:c44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c48::,2804:c48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c4c::,2804:c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c50::,2804:c50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c54::,2804:c54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c58::,2804:c58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c5c::,2804:c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c60::,2804:c60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c64::,2804:c64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c68::,2804:c68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c6c::,2804:c6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c70::,2804:c70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c74::,2804:c74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c78::,2804:c78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c7c::,2804:c7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c80::,2804:c80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c84::,2804:c84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c88::,2804:c88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c90::,2804:c90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c94::,2804:c94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c98::,2804:c98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:c9c::,2804:c9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ca0::,2804:ca0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ca4::,2804:ca4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ca8::,2804:ca8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cac::,2804:cac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cb0::,2804:cb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cb4::,2804:cb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cb8::,2804:cb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cbc::,2804:cbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cc0::,2804:cc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cc4::,2804:cc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cc8::,2804:cc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ccc::,2804:ccc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cd0::,2804:cd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cd4::,2804:cd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cd8::,2804:cd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cdc::,2804:cdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ce0::,2804:ce0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ce4::,2804:ce4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ce8::,2804:ce8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cec::,2804:cec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cf0::,2804:cf0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cf4::,2804:cf4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cf8::,2804:cf8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:cfc::,2804:cfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d00::,2804:d00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d04::,2804:d04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d08::,2804:d08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d0c::,2804:d0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d10::,2804:d10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d14::,2804:d14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d18::,2804:d18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d1c::,2804:d1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d20::,2804:d20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d24::,2804:d24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d28::,2804:d28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d2c::,2804:d2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d30::,2804:d30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d34::,2804:d34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d38::,2804:d38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d3c::,2804:d3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d40::,2804:d57:1266:7fff:ffff:ffff:ffff:ffff,BR +2804:d57:1266:8000::,2804:d57:1266:ffff:ffff:ffff:ffff:ffff,AU +2804:d57:1267::,2804:d57:12ce:ffff:ffff:ffff:ffff:ffff,BR +2804:d57:12cf::,2804:d57:12cf:7fff:ffff:ffff:ffff:ffff,GB +2804:d57:12cf:8000::,2804:d60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d64::,2804:d64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d68::,2804:d68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d6c::,2804:d6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d70::,2804:d70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d74::,2804:d74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d78::,2804:d78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d7c::,2804:d7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d80::,2804:d80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d84::,2804:d84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d88::,2804:d88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d8c::,2804:d8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d90::,2804:d90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d94::,2804:d94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d98::,2804:d98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:d9c::,2804:d9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:da0::,2804:da0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:da4::,2804:da4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:da8::,2804:da8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:dac::,2804:dac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:db0::,2804:db0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:db4::,2804:db4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:db8::,2804:db8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:dbc::,2804:dbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:dc0::,2804:dc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:dc8::,2804:dc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:dcc::,2804:dcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:dd0::,2804:dd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:dd4::,2804:dd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:dd8::,2804:dd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ddc::,2804:ddc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:de0::,2804:de0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:de4::,2804:de4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:de8::,2804:de8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:dec::,2804:dec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:df0::,2804:df0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:df4::,2804:df4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:df8::,2804:df8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:dfc::,2804:dfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e00::,2804:e00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e04::,2804:e04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e08::,2804:e08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e0c::,2804:e0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e10::,2804:e10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e14::,2804:e14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e18::,2804:e18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e1c::,2804:e1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e20::,2804:e20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e24::,2804:e24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e28::,2804:e28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e2c::,2804:e2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e30::,2804:e30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e34::,2804:e34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e38::,2804:e38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e3c::,2804:e3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e40::,2804:e40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e44::,2804:e44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e48::,2804:e48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e4c::,2804:e4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e50::,2804:e50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e54::,2804:e54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e58::,2804:e58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e5c::,2804:e5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e60::,2804:e60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e64::,2804:e64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e68::,2804:e68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e6c::,2804:e6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e70::,2804:e70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e74::,2804:e74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e78::,2804:e78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e7c::,2804:e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e80::,2804:e80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e84::,2804:e84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e88::,2804:e88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e8c::,2804:e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e90::,2804:e90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e94::,2804:e94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e98::,2804:e98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:e9c::,2804:e9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ea0::,2804:ea0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ea4::,2804:ea4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ea8::,2804:ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:eac::,2804:eac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:eb0::,2804:eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:eb4::,2804:eb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:eb8::,2804:eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ebc::,2804:ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ec0::,2804:ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ec4::,2804:ec4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ec8::,2804:ec8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ecc::,2804:ecc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ed0::,2804:ed0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ed4::,2804:ed4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ed8::,2804:ed8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:edc::,2804:edc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ee0::,2804:ee0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ee4::,2804:ee4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ee8::,2804:ee8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:eec::,2804:eec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ef0::,2804:ef0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ef4::,2804:ef4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ef8::,2804:ef8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:efc::,2804:efc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f00::,2804:f00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f04::,2804:f04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f08::,2804:f08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f0c::,2804:f0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f10::,2804:f10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f14::,2804:f14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f18::,2804:f18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f1c::,2804:f1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f20::,2804:f20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f24::,2804:f24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f28::,2804:f28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f2c::,2804:f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f30::,2804:f30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f34::,2804:f34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f38::,2804:f38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f3c::,2804:f3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f40::,2804:f40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f44::,2804:f44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f48::,2804:f48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f4c::,2804:f4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f50::,2804:f50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f54::,2804:f54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f58::,2804:f58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f60::,2804:f60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f64::,2804:f64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f68::,2804:f68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f6c::,2804:f6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f70::,2804:f70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f74::,2804:f74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f78::,2804:f78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f7c::,2804:f7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f80::,2804:f80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f84::,2804:f84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f88::,2804:f88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f8c::,2804:f8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f90::,2804:f90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f98::,2804:f98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:f9c::,2804:f9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fa0::,2804:fa0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fa4::,2804:fa4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fa8::,2804:fa8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fac::,2804:fac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fb0::,2804:fb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fb4::,2804:fb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fb8::,2804:fb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fbc::,2804:fbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fc0::,2804:fc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fc4::,2804:fc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fc8::,2804:fc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fcc::,2804:fcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fd0::,2804:fd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fd4::,2804:fd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fdc::,2804:fdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fe0::,2804:fe0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fe4::,2804:fe4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:fec::,2804:fec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ff0::,2804:ff0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ff4::,2804:ff4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ff8::,2804:ff8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:ffc::,2804:ffc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1000::,2804:1000:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1004::,2804:1004:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1008::,2804:1008:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:100c::,2804:100c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1010::,2804:1010:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1014::,2804:1014:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1018::,2804:1018:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:101c::,2804:101c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1020::,2804:1020:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1024::,2804:1024:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1028::,2804:1028:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:102c::,2804:102c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1030::,2804:1030:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1034::,2804:1034:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1038::,2804:1038:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:103c::,2804:103c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1040::,2804:1040:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1044::,2804:1044:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1048::,2804:1048:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:104c::,2804:104c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1050::,2804:1050:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1054::,2804:1054:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1058::,2804:1058:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:105c::,2804:105c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1060::,2804:1060:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1064::,2804:1064:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1068::,2804:1068:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:106c::,2804:106c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1070::,2804:1070:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1074::,2804:1074:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1078::,2804:1078:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:107c::,2804:107c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1080::,2804:1080:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1084::,2804:1084:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1088::,2804:1088:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:108c::,2804:108c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1090::,2804:1090:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1094::,2804:1094:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1098::,2804:1098:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:109c::,2804:109c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10a0::,2804:10a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10a4::,2804:10a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10a8::,2804:10a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10ac::,2804:10ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10b0::,2804:10b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10b4::,2804:10b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10b8::,2804:10b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10bc::,2804:10bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10c0::,2804:10c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10c4::,2804:10c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10c8::,2804:10c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10cc::,2804:10cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10d4::,2804:10d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10d8::,2804:10d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10dc::,2804:10dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10e0::,2804:10e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10e4::,2804:10e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10e8::,2804:10e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10ec::,2804:10ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10f0::,2804:10f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10f4::,2804:10f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10f8::,2804:10f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:10fc::,2804:10fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1100::,2804:1100:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1104::,2804:1104:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1108::,2804:1108:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:110c::,2804:110c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1110::,2804:1110:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1114::,2804:1114:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1118::,2804:1118:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:111c::,2804:111c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1120::,2804:1120:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1124::,2804:1124:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1128::,2804:1128:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:112c::,2804:112c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1130::,2804:1130:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1134::,2804:1134:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1138::,2804:1138:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:113c::,2804:113c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1140::,2804:1140:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1144::,2804:1144:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1148::,2804:1148:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:114c::,2804:114c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1150::,2804:1150:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1154::,2804:1154:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1158::,2804:1158:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:115c::,2804:115c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1160::,2804:1160:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1164::,2804:1164:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1168::,2804:1168:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:116c::,2804:116c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1170::,2804:1170:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1174::,2804:1174:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1178::,2804:1178:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:117c::,2804:117c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1180::,2804:1180:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1184::,2804:1184:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1188::,2804:1188:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:118c::,2804:118c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1190::,2804:1190:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1194::,2804:1194:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1198::,2804:1198:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:119c::,2804:119c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11a0::,2804:11a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11a4::,2804:11a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11a8::,2804:11a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11ac::,2804:11ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11b0::,2804:11b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11b4::,2804:11b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11b8::,2804:11b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11bc::,2804:11bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11c0::,2804:11c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11c4::,2804:11c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11c8::,2804:11c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11cc::,2804:11cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11d0::,2804:11d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11d4::,2804:11d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11d8::,2804:11d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11dc::,2804:11dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11e0::,2804:11e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11e4::,2804:11e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11e8::,2804:11e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11ec::,2804:11ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11f0::,2804:11f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11f4::,2804:11f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:11fc::,2804:11fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1200::,2804:1200:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1204::,2804:1204:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1208::,2804:1208:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:120c::,2804:120c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1210::,2804:1210:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1214::,2804:1214:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1218::,2804:1218:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:121c::,2804:121c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1220::,2804:1220:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1224::,2804:1224:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1228::,2804:1228:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:122c::,2804:122c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1230::,2804:1230:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1234::,2804:1234:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1238::,2804:1238:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:123c::,2804:123c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1240::,2804:1240:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1244::,2804:1244:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1248::,2804:1248:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:124c::,2804:124c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1250::,2804:1250:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1254::,2804:1254:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1258::,2804:1258:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:125c::,2804:125c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1260::,2804:1260:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1264::,2804:1264:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1268::,2804:1268:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:126c::,2804:126c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1270::,2804:1270:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1274::,2804:1274:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1278::,2804:1278:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:127c::,2804:127c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1280::,2804:1280:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1284::,2804:1284:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1288::,2804:1288:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:128c::,2804:128c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1290::,2804:1290:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1294::,2804:1294:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1298::,2804:1298:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:129c::,2804:129c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12a0::,2804:12a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12a4::,2804:12a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12a8::,2804:12a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12ac::,2804:12ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12b0::,2804:12b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12b4::,2804:12b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12b8::,2804:12b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12bc::,2804:12bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12c0::,2804:12c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12c4::,2804:12c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12c8::,2804:12c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12cc::,2804:12cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12d0::,2804:12d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12d4::,2804:12d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12d8::,2804:12d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12dc::,2804:12dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12e0::,2804:12e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12e4::,2804:12e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12e8::,2804:12e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12ec::,2804:12ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12f0::,2804:12f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12f4::,2804:12f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12f8::,2804:12f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:12fc::,2804:12fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1300::,2804:1300:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1304::,2804:1304:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1308::,2804:1308:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:130c::,2804:130c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1310::,2804:1310:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1314::,2804:1314:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1318::,2804:1318:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:131c::,2804:131c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1320::,2804:1320:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1324::,2804:1324:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1328::,2804:1328:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:132c::,2804:132c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1330::,2804:1330:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1334::,2804:1334:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1338::,2804:1338:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:133c::,2804:133c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1340::,2804:1340:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1344::,2804:1344:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1348::,2804:1348:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:134c::,2804:134c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1350::,2804:1350:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1354::,2804:1354:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1358::,2804:1358:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:135c::,2804:135c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1360::,2804:1360:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1364::,2804:1364:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1368::,2804:1368:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:136c::,2804:136c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1370::,2804:1370:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1374::,2804:1374:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1378::,2804:1378:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:137c::,2804:137c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1380::,2804:1380:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1384::,2804:1384:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1388::,2804:138b:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1390::,2804:1390:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1394::,2804:1394:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1398::,2804:1398:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:139c::,2804:139c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13a0::,2804:13a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13a4::,2804:13a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13a8::,2804:13a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13ac::,2804:13ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13b0::,2804:13b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13b4::,2804:13b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13b8::,2804:13b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13bc::,2804:13bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13c0::,2804:13c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13c4::,2804:13c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13c8::,2804:13c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13cc::,2804:13cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13d0::,2804:13d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13d4::,2804:13d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13d8::,2804:13d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13dc::,2804:13dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13e0::,2804:13e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13e4::,2804:13e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13e8::,2804:13e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13ec::,2804:13ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13f0::,2804:13f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13f4::,2804:13f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13f8::,2804:13f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:13fc::,2804:13fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1400::,2804:1400:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1404::,2804:1404:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1408::,2804:1408:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:140c::,2804:140c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1410::,2804:1410:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1414::,2804:1414:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1418::,2804:1418:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:141c::,2804:141c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1420::,2804:1420:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1424::,2804:1424:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1428::,2804:1428:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:142c::,2804:142c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1430::,2804:1430:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1434::,2804:1434:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1438::,2804:1438:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:143c::,2804:143c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1440::,2804:1440:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1444::,2804:1444:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1448::,2804:1448:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:144c::,2804:144c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1450::,2804:1450:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1454::,2804:1454:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1458::,2804:1458:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:145c::,2804:145c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1460::,2804:1460:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1464::,2804:1464:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1468::,2804:1468:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:146c::,2804:146c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1470::,2804:1470:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1474::,2804:1474:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1478::,2804:1478:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:147c::,2804:147c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1480::,2804:1480:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1484::,2804:1484:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1488::,2804:1488:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:148c::,2804:148c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1490::,2804:1490:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1494::,2804:1494:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1498::,2804:1498:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:149c::,2804:149c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14a0::,2804:14a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14a4::,2804:14a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14a8::,2804:14a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14ac::,2804:14ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14b0::,2804:14b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14b4::,2804:14b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14b8::,2804:14b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14bc::,2804:14bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14c0::,2804:14c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14c4::,2804:14c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14c8::,2804:14c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14cc::,2804:14cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14d0::,2804:14d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14d4::,2804:14d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14d8::,2804:14d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14dc::,2804:14dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14e0::,2804:14e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14e4::,2804:14e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14e8::,2804:14e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14ec::,2804:14ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14f0::,2804:14f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14f4::,2804:14f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14f8::,2804:14f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:14fc::,2804:14fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1500::,2804:1500:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1504::,2804:1504:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1508::,2804:1508:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:150c::,2804:150c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1510::,2804:1510:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1514::,2804:1514:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1518::,2804:1518:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:151c::,2804:151c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1520::,2804:1520:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1524::,2804:1524:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1528::,2804:1528:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:152c::,2804:152c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1530::,2804:1530:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1534::,2804:1534:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1538::,2804:1538:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:153c::,2804:153c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1540::,2804:1540:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1544::,2804:1544:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1548::,2804:1548:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:154c::,2804:154c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1550::,2804:1550:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1554::,2804:1554:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1558::,2804:1558:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:155c::,2804:155c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1560::,2804:1560:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1564::,2804:1564:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1568::,2804:1568:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:156c::,2804:156c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1570::,2804:1570:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1574::,2804:1574:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1578::,2804:1578:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:157c::,2804:157c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1580::,2804:1580:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1584::,2804:1584:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1588::,2804:1588:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:158c::,2804:158c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1590::,2804:1590:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1594::,2804:1594:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1598::,2804:1598:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:159c::,2804:159c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15a0::,2804:15a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15a4::,2804:15a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15a8::,2804:15a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15ac::,2804:15ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15b0::,2804:15b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15b4::,2804:15b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15b8::,2804:15b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15bc::,2804:15bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15c0::,2804:15c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15c4::,2804:15c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15c8::,2804:15c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15cc::,2804:15cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15d0::,2804:15d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15d4::,2804:15d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15d8::,2804:15d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15dc::,2804:15dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15e0::,2804:15e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15e4::,2804:15e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15e8::,2804:15e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15ec::,2804:15ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15f0::,2804:15f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15f4::,2804:15f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15f8::,2804:15f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:15fc::,2804:15fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1600::,2804:1600:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1604::,2804:1604:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1608::,2804:1608:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:160c::,2804:160c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1610::,2804:1610:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1614::,2804:1614:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1618::,2804:1618:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:161c::,2804:161c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1620::,2804:1620:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1624::,2804:1624:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1628::,2804:1628:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:162c::,2804:162c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1630::,2804:1630:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1634::,2804:1634:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1638::,2804:1638:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:163c::,2804:163c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1644::,2804:1644:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1648::,2804:1648:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:164c::,2804:164c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1650::,2804:1650:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1654::,2804:1654:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1658::,2804:1658:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:165c::,2804:165c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1660::,2804:1660:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1664::,2804:1664:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1668::,2804:1668:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:166c::,2804:166c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1670::,2804:1670:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1674::,2804:1674:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:167c::,2804:167c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1680::,2804:1680:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1684::,2804:1684:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1688::,2804:1688:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:168c::,2804:168c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1690::,2804:1690:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1694::,2804:1694:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1698::,2804:1698:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:169c::,2804:169c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16a0::,2804:16a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16a4::,2804:16a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16a8::,2804:16a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16b0::,2804:16b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16b4::,2804:16b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16b8::,2804:16b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16bc::,2804:16bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16c0::,2804:16c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16c4::,2804:16c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16c8::,2804:16c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16cc::,2804:16cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16d0::,2804:16d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16d4::,2804:16d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16d8::,2804:16d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16dc::,2804:16dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16e0::,2804:16e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16e4::,2804:16e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16e8::,2804:16e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16ec::,2804:16ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16f0::,2804:16f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16f4::,2804:16f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16f8::,2804:16f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:16fc::,2804:16fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1700::,2804:1700:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1704::,2804:1704:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1708::,2804:1708:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:170c::,2804:170c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1710::,2804:1710:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1714::,2804:1714:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1718::,2804:1718:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:171c::,2804:171c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1720::,2804:1720:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1724::,2804:1724:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1728::,2804:1728:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:172c::,2804:172c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1730::,2804:1730:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1734::,2804:1734:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1738::,2804:1738:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:173c::,2804:173c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1740::,2804:1740:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1744::,2804:1744:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1748::,2804:1748:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:174c::,2804:174c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1750::,2804:1750:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1754::,2804:1754:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1758::,2804:1758:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:175c::,2804:175c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1760::,2804:1760:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1764::,2804:1764:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1768::,2804:1768:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:176c::,2804:176c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1770::,2804:1770:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1774::,2804:1774:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1778::,2804:1778:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:177c::,2804:177c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1780::,2804:1780:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1784::,2804:1784:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1788::,2804:1788:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:178c::,2804:178c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1790::,2804:1790:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1794::,2804:1794:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1798::,2804:1798:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:179c::,2804:179c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17a0::,2804:17a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17a4::,2804:17a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17a8::,2804:17a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17ac::,2804:17ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17b0::,2804:17b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17b4::,2804:17b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17b8::,2804:17b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17bc::,2804:17bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17c0::,2804:17c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17c4::,2804:17c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17c8::,2804:17c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17cc::,2804:17cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17d0::,2804:17d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17d4::,2804:17d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17d8::,2804:17d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17dc::,2804:17dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17e0::,2804:17e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17e8::,2804:17e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17ec::,2804:17ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17f0::,2804:17f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17f4::,2804:17f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17f8::,2804:17f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:17fc::,2804:17fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1800::,2804:1800:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1804::,2804:1804:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1808::,2804:1808:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:180c::,2804:180c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1810::,2804:1810:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1814::,2804:1814:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1818::,2804:1818:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:181c::,2804:181c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1820::,2804:1820:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1824::,2804:1824:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1828::,2804:1828:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:182c::,2804:182c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1830::,2804:1830:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1834::,2804:1834:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1838::,2804:1838:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:183c::,2804:183c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1840::,2804:1840:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1844::,2804:1844:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1848::,2804:1848:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:184c::,2804:184c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1850::,2804:1850:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1854::,2804:1854:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1858::,2804:1858:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:185c::,2804:185c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1864::,2804:1864:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1868::,2804:1868:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:186c::,2804:186c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1870::,2804:1870:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1874::,2804:1874:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1878::,2804:1878:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:187c::,2804:187c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1880::,2804:1880:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1884::,2804:1884:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1888::,2804:1888:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:188c::,2804:188c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1890::,2804:1890:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1894::,2804:1894:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1898::,2804:1898:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:189c::,2804:189c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18a0::,2804:18a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18a4::,2804:18a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18a8::,2804:18a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18ac::,2804:18ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18b0::,2804:18b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18b4::,2804:18b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18b8::,2804:18b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18bc::,2804:18bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18c0::,2804:18c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18c4::,2804:18c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18c8::,2804:18c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18cc::,2804:18cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18d0::,2804:18d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18d4::,2804:18d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18d8::,2804:18d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18dc::,2804:18dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18e0::,2804:18e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18e4::,2804:18e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18e8::,2804:18e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18ec::,2804:18ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18f0::,2804:18f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18f4::,2804:18f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18f8::,2804:18f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:18fc::,2804:18fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1900::,2804:1900:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1904::,2804:1904:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1908::,2804:1908:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:190c::,2804:190c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1910::,2804:1910:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1914::,2804:1914:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1918::,2804:1918:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:191c::,2804:191c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1920::,2804:1920:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1924::,2804:1924:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1928::,2804:1928:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:192c::,2804:192c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1930::,2804:1930:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1934::,2804:1934:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1938::,2804:1938:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1940::,2804:1940:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1948::,2804:1948:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:194c::,2804:194c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1950::,2804:1950:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1954::,2804:1954:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1958::,2804:1958:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:195c::,2804:195c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1960::,2804:1960:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1964::,2804:1964:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1968::,2804:1968:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:196c::,2804:196c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1970::,2804:1970:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1974::,2804:1974:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1978::,2804:1978:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:197c::,2804:197c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1980::,2804:1980:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1984::,2804:1984:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1988::,2804:1988:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:198c::,2804:198c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1990::,2804:1990:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1994::,2804:1994:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1998::,2804:1998:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:199c::,2804:199c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19a0::,2804:19a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19a4::,2804:19a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19a8::,2804:19a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19ac::,2804:19ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19b0::,2804:19b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19b4::,2804:19b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19b8::,2804:19b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19c0::,2804:19c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19c4::,2804:19c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19c8::,2804:19c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19cc::,2804:19cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19d0::,2804:19d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19d4::,2804:19d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19d8::,2804:19d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19dc::,2804:19dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19e0::,2804:19e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19e4::,2804:19e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19e8::,2804:19e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19ec::,2804:19ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19f0::,2804:19f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19f4::,2804:19f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19f8::,2804:19f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:19fc::,2804:19fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a00::,2804:1a00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a04::,2804:1a04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a08::,2804:1a08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a0c::,2804:1a0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a10::,2804:1a10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a14::,2804:1a14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a18::,2804:1a18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a1c::,2804:1a1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a20::,2804:1a20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a24::,2804:1a24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a28::,2804:1a28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a2c::,2804:1a2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a30::,2804:1a30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a34::,2804:1a34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a38::,2804:1a38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a3c::,2804:1a3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a40::,2804:1a40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a44::,2804:1a44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a48::,2804:1a48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a4c::,2804:1a4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a50::,2804:1a50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a54::,2804:1a54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a58::,2804:1a58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a5c::,2804:1a5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a60::,2804:1a60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a64::,2804:1a64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a68::,2804:1a68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a6c::,2804:1a6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a70::,2804:1a70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a74::,2804:1a74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a7c::,2804:1a7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a80::,2804:1a80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a84::,2804:1a84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a88::,2804:1a88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a8c::,2804:1a8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a90::,2804:1a90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a94::,2804:1a94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a98::,2804:1a98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1a9c::,2804:1a9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1aa0::,2804:1aa0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1aa4::,2804:1aa4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1aa8::,2804:1aa8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ab0::,2804:1ab0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ab4::,2804:1ab4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ab8::,2804:1ab8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1abc::,2804:1abc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ac0::,2804:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ac4::,2804:1ac4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ac8::,2804:1ac8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1acc::,2804:1acc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ad0::,2804:1ad0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ad4::,2804:1ad4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ad8::,2804:1ad8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1adc::,2804:1adc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ae0::,2804:1ae0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ae4::,2804:1ae4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ae8::,2804:1ae8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1aec::,2804:1aec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1af0::,2804:1af0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1af4::,2804:1af4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1af8::,2804:1af8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1afc::,2804:1afc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b00::,2804:1b00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b04::,2804:1b04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b08::,2804:1b08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b0c::,2804:1b0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b10::,2804:1b10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b14::,2804:1b14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b18::,2804:1b18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b1c::,2804:1b1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b20::,2804:1b20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b24::,2804:1b24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b28::,2804:1b28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b2c::,2804:1b2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b30::,2804:1b30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b34::,2804:1b34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b3c::,2804:1b3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b40::,2804:1b40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b44::,2804:1b44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b48::,2804:1b48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b4c::,2804:1b4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b50::,2804:1b50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b54::,2804:1b54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b58::,2804:1b58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b5c::,2804:1b5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b60::,2804:1b60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b64::,2804:1b64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b68::,2804:1b68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b6c::,2804:1b6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b70::,2804:1b70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b74::,2804:1b74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b78::,2804:1b78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b7c::,2804:1b7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b80::,2804:1b80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b84::,2804:1b84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b8c::,2804:1b8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b90::,2804:1b90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b94::,2804:1b94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b9c::,2804:1b9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ba0::,2804:1ba0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ba4::,2804:1ba4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ba8::,2804:1ba8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bac::,2804:1bac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bb0::,2804:1bb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bb4::,2804:1bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bb8::,2804:1bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bbc::,2804:1bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bc4::,2804:1bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bc8::,2804:1bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bcc::,2804:1bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bd0::,2804:1bd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bd4::,2804:1bd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bd8::,2804:1bd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bdc::,2804:1bdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1be0::,2804:1be0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1be4::,2804:1be4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1be8::,2804:1be8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bec::,2804:1bec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bf0::,2804:1bf0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bf4::,2804:1bf4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bf8::,2804:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bfc::,2804:1bfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c00::,2804:1c00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c04::,2804:1c04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c08::,2804:1c08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c0c::,2804:1c0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c10::,2804:1c10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c14::,2804:1c14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c18::,2804:1c18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c1c::,2804:1c1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c20::,2804:1c20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c24::,2804:1c24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c28::,2804:1c28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c2c::,2804:1c2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c30::,2804:1c30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c34::,2804:1c34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c38::,2804:1c38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c3c::,2804:1c3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c40::,2804:1c40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c44::,2804:1c44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c48::,2804:1c48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c4c::,2804:1c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c50::,2804:1c50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c54::,2804:1c54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c5c::,2804:1c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c60::,2804:1c60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c64::,2804:1c64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c68::,2804:1c68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c6c::,2804:1c6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c70::,2804:1c70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c74::,2804:1c74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c78::,2804:1c78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c7c::,2804:1c7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c80::,2804:1c80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c84::,2804:1c84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c88::,2804:1c88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c8c::,2804:1c8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c90::,2804:1c90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c94::,2804:1c94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c98::,2804:1c98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c9c::,2804:1c9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ca0::,2804:1ca0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ca4::,2804:1ca4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ca8::,2804:1ca8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cac::,2804:1cac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cb0::,2804:1cb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cb4::,2804:1cb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cb8::,2804:1cb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cbc::,2804:1cbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cc0::,2804:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cc4::,2804:1cc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cc8::,2804:1cc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ccc::,2804:1ccc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cd0::,2804:1cd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cd4::,2804:1cd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cd8::,2804:1cd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cdc::,2804:1cdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ce0::,2804:1ce0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ce4::,2804:1ce4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cec::,2804:1cec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cf0::,2804:1cf0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cf4::,2804:1cf4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cf8::,2804:1cf8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cfc::,2804:1cfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d00::,2804:1d00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d04::,2804:1d04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d08::,2804:1d08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d0c::,2804:1d0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d10::,2804:1d10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d14::,2804:1d14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d18::,2804:1d18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d1c::,2804:1d1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d20::,2804:1d20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d24::,2804:1d24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d28::,2804:1d28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d2c::,2804:1d2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d30::,2804:1d30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d34::,2804:1d34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d38::,2804:1d38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d3c::,2804:1d3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d40::,2804:1d40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d48::,2804:1d48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d4c::,2804:1d4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d50::,2804:1d50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d58::,2804:1d58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d5c::,2804:1d5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d60::,2804:1d60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d64::,2804:1d64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d68::,2804:1d68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d6c::,2804:1d6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d70::,2804:1d70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d74::,2804:1d74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d7c::,2804:1d7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d80::,2804:1d80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d84::,2804:1d84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d8c::,2804:1d8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d90::,2804:1d90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d94::,2804:1d94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d98::,2804:1d98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d9c::,2804:1d9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1da0::,2804:1da0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1da4::,2804:1da4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1da8::,2804:1da8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dac::,2804:1dac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1db0::,2804:1db0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1db4::,2804:1db4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1db8::,2804:1db8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dbc::,2804:1dbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dc0::,2804:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dc4::,2804:1dc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dc8::,2804:1dc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dcc::,2804:1dcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dd0::,2804:1dd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dd4::,2804:1dd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dd8::,2804:1dd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ddc::,2804:1ddc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1de0::,2804:1de0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1de4::,2804:1de4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1de8::,2804:1de8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dec::,2804:1dec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1df0::,2804:1df0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1df4::,2804:1df4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1df8::,2804:1df8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dfc::,2804:1dfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e00::,2804:1e00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e04::,2804:1e04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e08::,2804:1e08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e0c::,2804:1e0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e10::,2804:1e10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e14::,2804:1e14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e18::,2804:1e18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e20::,2804:1e20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e24::,2804:1e24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e28::,2804:1e28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e2c::,2804:1e2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e30::,2804:1e30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e34::,2804:1e34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e38::,2804:1e38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e3c::,2804:1e3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e40::,2804:1e40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e44::,2804:1e44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e48::,2804:1e48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e4c::,2804:1e4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e50::,2804:1e50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e54::,2804:1e54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e58::,2804:1e58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e5c::,2804:1e5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e60::,2804:1e60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e64::,2804:1e64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e68::,2804:1e68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e6c::,2804:1e6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e70::,2804:1e70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e74::,2804:1e74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e78::,2804:1e78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e7c::,2804:1e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e84::,2804:1e84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e88::,2804:1e88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e8c::,2804:1e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e90::,2804:1e90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e94::,2804:1e94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e98::,2804:1e98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e9c::,2804:1e9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ea0::,2804:1ea0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ea4::,2804:1ea4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ea8::,2804:1ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1eac::,2804:1eac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1eb0::,2804:1eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1eb8::,2804:1eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ebc::,2804:1ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ec0::,2804:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ec4::,2804:1ec4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ec8::,2804:1ec8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ecc::,2804:1ecc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ed0::,2804:1ed0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ed4::,2804:1ed4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ed8::,2804:1ed8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1edc::,2804:1edc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ee0::,2804:1ee0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ee4::,2804:1ee4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ee8::,2804:1ee8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1eec::,2804:1eec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ef0::,2804:1ef0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ef4::,2804:1ef4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ef8::,2804:1ef8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1efc::,2804:1efc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f00::,2804:1f00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f02::,2804:1f02:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f04::,2804:1f04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f06::,2804:1f06:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f08::,2804:1f08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f0a::,2804:1f0a:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f0e::,2804:1f0e:1fff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f10::,2804:1f10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f12::,2804:1f12:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f14::,2804:1f14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f16::,2804:1f16:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f18::,2804:1f18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f1a::,2804:1f1a:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f1c::,2804:1f1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f1e::,2804:1f1e:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f20::,2804:1f20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f22::,2804:1f22:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f24::,2804:1f24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f26::,2804:1f26:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f28::,2804:1f28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f2a::,2804:1f2a:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f2c::,2804:1f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f2e::,2804:1f2e:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f30::,2804:1f30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f32::,2804:1f32:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2000::,2804:2000:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2004::,2804:2004:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2008::,2804:2008:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:200c::,2804:200c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2010::,2804:2010:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2014::,2804:2014:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2018::,2804:2018:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:201c::,2804:201c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2020::,2804:2020:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2024::,2804:2024:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2028::,2804:2028:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:202c::,2804:202c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2030::,2804:2030:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2034::,2804:2034:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2038::,2804:2038:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:203c::,2804:203c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2040::,2804:2040:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2044::,2804:2044:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2048::,2804:2048:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:204c::,2804:204c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2050::,2804:2050:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2054::,2804:2054:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2058::,2804:2058:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:205c::,2804:205c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2060::,2804:2060:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2064::,2804:2064:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2068::,2804:2068:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:206c::,2804:206c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2070::,2804:2070:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2074::,2804:2074:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2078::,2804:2078:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:207c::,2804:207c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2080::,2804:2080:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2084::,2804:2084:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2088::,2804:2088:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:208c::,2804:208c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2090::,2804:2090:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2094::,2804:2094:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2098::,2804:2098:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20a0::,2804:20a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20a4::,2804:20a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20a8::,2804:20a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20b0::,2804:20b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20b4::,2804:20b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20b8::,2804:20b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20bc::,2804:20bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20c0::,2804:20c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20c4::,2804:20c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20c8::,2804:20c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20cc::,2804:20cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20d0::,2804:20d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20d4::,2804:20d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20d8::,2804:20d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20dc::,2804:20dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20e0::,2804:20e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20e4::,2804:20e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20e8::,2804:20e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20ec::,2804:20ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20f0::,2804:20f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20f4::,2804:20f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20f8::,2804:20f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20fc::,2804:20fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2100::,2804:2100:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2104::,2804:2104:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2108::,2804:2108:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:210c::,2804:210c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2110::,2804:2110:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2114::,2804:2114:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2118::,2804:2118:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:211c::,2804:211c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2120::,2804:2120:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2124::,2804:2124:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2128::,2804:2128:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:212c::,2804:212c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2130::,2804:2130:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2134::,2804:2134:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2138::,2804:2138:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:213c::,2804:213c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2140::,2804:2140:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2144::,2804:2144:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2148::,2804:2148:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:214c::,2804:214c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2150::,2804:2150:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2154::,2804:2154:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2158::,2804:2158:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:215c::,2804:215c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2160::,2804:2160:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2164::,2804:2164:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2168::,2804:2168:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:216c::,2804:216c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2170::,2804:2170:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2174::,2804:2174:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2178::,2804:2178:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:217c::,2804:217c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2180::,2804:2180:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2184::,2804:2184:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2188::,2804:2188:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:218c::,2804:218c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2190::,2804:2190:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2198::,2804:2198:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:219c::,2804:219c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21a0::,2804:21a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21a4::,2804:21a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21a8::,2804:21a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21ac::,2804:21ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21b0::,2804:21b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21b4::,2804:21b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21b8::,2804:21b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21bc::,2804:21bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21c0::,2804:21c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21c4::,2804:21c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21c8::,2804:21c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21cc::,2804:21cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21d0::,2804:21d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21d4::,2804:21d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21d8::,2804:21d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21dc::,2804:21dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21e0::,2804:21e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21e4::,2804:21e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21e8::,2804:21e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21ec::,2804:21ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21f0::,2804:21f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21f4::,2804:21f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21f8::,2804:21f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:21fc::,2804:21fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2200::,2804:2200:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2204::,2804:2204:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2208::,2804:2208:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2210::,2804:2210:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2214::,2804:2214:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2218::,2804:2218:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:221c::,2804:221c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2220::,2804:2220:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2224::,2804:2224:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2228::,2804:2228:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:222c::,2804:222c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2230::,2804:2230:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2234::,2804:2234:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2238::,2804:2238:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:223c::,2804:223c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2240::,2804:2240:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2248::,2804:2248:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:224c::,2804:224c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2250::,2804:2250:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2254::,2804:2254:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2258::,2804:2258:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:225c::,2804:225c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2260::,2804:2260:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2264::,2804:2264:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2268::,2804:2268:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2270::,2804:2270:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2274::,2804:2274:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2278::,2804:2278:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:227c::,2804:227c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2284::,2804:2284:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2288::,2804:2288:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:228c::,2804:228c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2290::,2804:2290:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2298::,2804:2298:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:229c::,2804:229c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22a0::,2804:22a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22a4::,2804:22a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22a8::,2804:22a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22b0::,2804:22b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22b4::,2804:22b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22b8::,2804:22b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22bc::,2804:22bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22c0::,2804:22c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22c4::,2804:22c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22cc::,2804:22cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22d0::,2804:22d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22d4::,2804:22d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22d8::,2804:22d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22dc::,2804:22dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22e0::,2804:22e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22e4::,2804:22e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22e8::,2804:22e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22ec::,2804:22ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22f4::,2804:22f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22f8::,2804:22f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:22fc::,2804:22fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2300::,2804:2300:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2304::,2804:2304:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2308::,2804:2308:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:230c::,2804:230c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2310::,2804:2310:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2314::,2804:2314:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:231c::,2804:231c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2320::,2804:2320:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2324::,2804:2324:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2328::,2804:2328:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:232c::,2804:232c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2330::,2804:2330:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2334::,2804:2334:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2338::,2804:2338:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:233c::,2804:233c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2340::,2804:2340:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2344::,2804:2344:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2348::,2804:2348:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:234c::,2804:234c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2350::,2804:2350:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2354::,2804:2354:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2358::,2804:2358:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:235c::,2804:235c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2360::,2804:2360:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2364::,2804:2364:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2368::,2804:2368:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:236c::,2804:236c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2370::,2804:2370:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2374::,2804:2374:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2378::,2804:2378:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:237c::,2804:237c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2380::,2804:2380:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2384::,2804:2384:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2388::,2804:2388:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:238c::,2804:238c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2390::,2804:2390:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2394::,2804:2394:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2398::,2804:2398:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:239c::,2804:239c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23a0::,2804:23a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23a4::,2804:23a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23a8::,2804:23a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23ac::,2804:23ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23b0::,2804:23b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23b4::,2804:23b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23b8::,2804:23b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23bc::,2804:23bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23c0::,2804:23c1:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23c4::,2804:23c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23c8::,2804:23c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23d4::,2804:23d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23d8::,2804:23d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23dc::,2804:23dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23e0::,2804:23e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23e4::,2804:23e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23e8::,2804:23e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23ec::,2804:23ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23f0::,2804:23f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23f4::,2804:23f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23f8::,2804:23f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:23fc::,2804:23fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2400::,2804:2400:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2404::,2804:2404:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2408::,2804:2408:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:240c::,2804:240c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2414::,2804:2414:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2418::,2804:2418:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:241c::,2804:241c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2420::,2804:2420:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2424::,2804:2424:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2428::,2804:2428:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:242c::,2804:242c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2430::,2804:2430:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2434::,2804:2434:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2438::,2804:2438:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:243c::,2804:243c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2440::,2804:2440:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2444::,2804:2444:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2448::,2804:2448:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:244c::,2804:244c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2450::,2804:2450:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2454::,2804:2454:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2458::,2804:2458:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:245c::,2804:245c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2460::,2804:2460:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2464::,2804:2464:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2468::,2804:2468:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:246c::,2804:246c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2474::,2804:2474:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2478::,2804:2478:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:247c::,2804:247c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2480::,2804:2480:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2484::,2804:2484:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2488::,2804:2488:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:248c::,2804:248c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2490::,2804:2490:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2494::,2804:2494:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2498::,2804:2498:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:249c::,2804:249c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24a0::,2804:24a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24a4::,2804:24a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24a8::,2804:24a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24ac::,2804:24ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24b0::,2804:24b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24b4::,2804:24b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24b8::,2804:24b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24bc::,2804:24bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24c0::,2804:24c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24c4::,2804:24c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24c8::,2804:24c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24cc::,2804:24cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24d0::,2804:24d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24d4::,2804:24d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24d8::,2804:24d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24dc::,2804:24dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24e0::,2804:24e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24e4::,2804:24e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24e8::,2804:24e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24ec::,2804:24ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24f0::,2804:24f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24f4::,2804:24f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24f8::,2804:24f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:24fc::,2804:24fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2500::,2804:2500:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2504::,2804:2504:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2508::,2804:2508:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:250c::,2804:250c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2510::,2804:2510:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2514::,2804:2514:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2518::,2804:2518:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:251c::,2804:251c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2520::,2804:2520:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2524::,2804:2524:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2528::,2804:2528:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:252c::,2804:252c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2530::,2804:2530:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2534::,2804:2534:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2538::,2804:2538:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:253c::,2804:253c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2540::,2804:2540:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2544::,2804:2544:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2548::,2804:2548:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:254c::,2804:254c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2550::,2804:2550:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2554::,2804:2554:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2558::,2804:2558:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:255c::,2804:255c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2560::,2804:2560:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2564::,2804:2564:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2568::,2804:2568:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:256c::,2804:256c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2570::,2804:2570:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2574::,2804:2574:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2578::,2804:2578:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:257c::,2804:257c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2580::,2804:2580:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2584::,2804:2584:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2588::,2804:2588:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2590::,2804:2590:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2594::,2804:2594:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2598::,2804:2598:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:259c::,2804:259c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25a0::,2804:25a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25a4::,2804:25a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25a8::,2804:25a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25ac::,2804:25ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25b0::,2804:25b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25b4::,2804:25b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25b8::,2804:25b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25bc::,2804:25bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25c0::,2804:25c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25c4::,2804:25c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25c8::,2804:25c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25cc::,2804:25cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25d0::,2804:25d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25d4::,2804:25d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25d8::,2804:25d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25e0::,2804:25e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25e4::,2804:25e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25e8::,2804:25e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25ec::,2804:25ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25f0::,2804:25f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25f4::,2804:25f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25f8::,2804:25f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:25fc::,2804:25fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2600::,2804:2600:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2604::,2804:2604:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2608::,2804:2608:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:260c::,2804:260c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2610::,2804:2610:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2614::,2804:2614:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2618::,2804:2618:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:261c::,2804:261c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2620::,2804:2620:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2624::,2804:2624:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2628::,2804:2628:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:262c::,2804:262c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2630::,2804:2630:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2634::,2804:2634:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2638::,2804:2638:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:263c::,2804:263c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2640::,2804:2640:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2644::,2804:2644:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2648::,2804:2648:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:264c::,2804:264c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2650::,2804:2650:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2654::,2804:2654:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2658::,2804:2658:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:265c::,2804:265c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2660::,2804:2660:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2664::,2804:2664:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2668::,2804:2668:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:266c::,2804:266c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2670::,2804:2670:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2674::,2804:2674:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2678::,2804:2678:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:267c::,2804:267c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2680::,2804:2680:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2684::,2804:2684:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2688::,2804:2688:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:268c::,2804:268c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2690::,2804:2690:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2694::,2804:2694:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2698::,2804:2698:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:269c::,2804:269c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26a0::,2804:26a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26a4::,2804:26a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26a8::,2804:26a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26ac::,2804:26ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26b0::,2804:26b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26b8::,2804:26b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26bc::,2804:26bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26c0::,2804:26c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26c4::,2804:26c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26c8::,2804:26c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26cc::,2804:26cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26d0::,2804:26d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26d4::,2804:26d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26d8::,2804:26d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26dc::,2804:26dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26e0::,2804:26e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26e4::,2804:26e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26e8::,2804:26e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26ec::,2804:26ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26f0::,2804:26f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26f4::,2804:26f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26f8::,2804:26f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:26fc::,2804:26fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2700::,2804:2700:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2704::,2804:2704:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:270c::,2804:270c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2710::,2804:2710:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2714::,2804:2714:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:271c::,2804:271c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2720::,2804:2720:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2724::,2804:2724:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2728::,2804:2728:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:272c::,2804:272c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2730::,2804:2730:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2734::,2804:2734:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2738::,2804:2738:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:273c::,2804:273c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2740::,2804:2740:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2744::,2804:2744:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2748::,2804:2748:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:274c::,2804:274c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2750::,2804:2750:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2754::,2804:2754:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2758::,2804:2758:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:275c::,2804:275c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2760::,2804:2760:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2764::,2804:2764:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2768::,2804:2768:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:276c::,2804:276c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2774::,2804:2774:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2778::,2804:2778:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:277c::,2804:277c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2780::,2804:2780:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2784::,2804:2784:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2788::,2804:2788:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:278c::,2804:278c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2790::,2804:2790:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2794::,2804:2794:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2798::,2804:2798:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:279c::,2804:279c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27a0::,2804:27a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27a4::,2804:27a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27a8::,2804:27a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27ac::,2804:27ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27b0::,2804:27b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27b4::,2804:27b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27b8::,2804:27b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27bc::,2804:27bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27c0::,2804:27c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27c4::,2804:27c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27c8::,2804:27c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27cc::,2804:27cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27d0::,2804:27d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27d4::,2804:27d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27d8::,2804:27d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27dc::,2804:27dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27e0::,2804:27e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27e4::,2804:27e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27e8::,2804:27e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27ec::,2804:27ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27f0::,2804:27f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27f4::,2804:27f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27f8::,2804:27f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:27fc::,2804:27fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2800::,2804:2800:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2804::,2804:2804:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2808::,2804:2808:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:280c::,2804:280c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2814::,2804:2814:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2818::,2804:2818:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:281c::,2804:281c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2820::,2804:2820:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2824::,2804:2824:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2828::,2804:2828:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:282c::,2804:282c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2830::,2804:2830:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2834::,2804:2834:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2838::,2804:2838:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:283c::,2804:283c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2840::,2804:2840:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2844::,2804:2844:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2848::,2804:2848:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:284c::,2804:284c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2850::,2804:2850:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2854::,2804:2854:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2858::,2804:2858:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:285c::,2804:285c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2860::,2804:2860:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2864::,2804:2864:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2868::,2804:2868:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:286c::,2804:286c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2870::,2804:2870:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2874::,2804:2874:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2878::,2804:2878:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:287c::,2804:287c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2880::,2804:2880:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2884::,2804:2884:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2888::,2804:2888:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:288c::,2804:288c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2890::,2804:2890:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2894::,2804:2894:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2898::,2804:2898:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:289c::,2804:289c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28a0::,2804:28a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28a4::,2804:28a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28a8::,2804:28a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28ac::,2804:28ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28b0::,2804:28b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28b4::,2804:28b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28b8::,2804:28b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28bc::,2804:28bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28c0::,2804:28c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28c4::,2804:28c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28c8::,2804:28c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28cc::,2804:28cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28d0::,2804:28d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28d4::,2804:28d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28d8::,2804:28d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28dc::,2804:28dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28e0::,2804:28e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28e4::,2804:28e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28e8::,2804:28e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28ec::,2804:28ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28f0::,2804:28f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28f4::,2804:28f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28f8::,2804:28f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:28fc::,2804:28fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2900::,2804:2900:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2904::,2804:2904:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2908::,2804:2908:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:290c::,2804:290c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2910::,2804:2910:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2914::,2804:2914:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2918::,2804:2918:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:291c::,2804:291c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2920::,2804:2920:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2924::,2804:2924:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2928::,2804:2928:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:292c::,2804:292c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2930::,2804:2930:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2934::,2804:2934:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2938::,2804:2938:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:293c::,2804:293c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2940::,2804:2940:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2944::,2804:2944:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2948::,2804:2948:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:294c::,2804:294c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2950::,2804:2950:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2954::,2804:2954:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2958::,2804:2958:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:295c::,2804:295c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2960::,2804:2960:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2964::,2804:2964:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2968::,2804:2968:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:296c::,2804:296c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2970::,2804:2970:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2974::,2804:2974:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2978::,2804:2978:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:297c::,2804:297c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2980::,2804:2980:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2984::,2804:2984:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2988::,2804:2988:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:298c::,2804:298c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2990::,2804:2990:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2994::,2804:2994:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2998::,2804:2998:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:299c::,2804:299c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29a0::,2804:29a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29a4::,2804:29a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29a8::,2804:29a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29ac::,2804:29ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29b0::,2804:29b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29b4::,2804:29b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29b8::,2804:29b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29bc::,2804:29bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29c0::,2804:29c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29c4::,2804:29c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29c8::,2804:29c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29cc::,2804:29cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29d0::,2804:29d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29dc::,2804:29dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29e0::,2804:29e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29e4::,2804:29e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29e8::,2804:29e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29ec::,2804:29ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29f0::,2804:29f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29f4::,2804:29f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29f8::,2804:29f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:29fc::,2804:29fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a00::,2804:2a00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a04::,2804:2a04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a08::,2804:2a08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a0c::,2804:2a0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a10::,2804:2a10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a14::,2804:2a14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a18::,2804:2a18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a1c::,2804:2a1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a20::,2804:2a20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a24::,2804:2a24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a28::,2804:2a28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a2c::,2804:2a2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a30::,2804:2a30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a34::,2804:2a34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a38::,2804:2a38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a3c::,2804:2a3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a40::,2804:2a40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a44::,2804:2a44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a48::,2804:2a48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a4c::,2804:2a4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a50::,2804:2a50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a54::,2804:2a54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a58::,2804:2a58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a5c::,2804:2a5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a60::,2804:2a60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a64::,2804:2a64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a68::,2804:2a68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a6c::,2804:2a6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a70::,2804:2a70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a74::,2804:2a74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a78::,2804:2a78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a7c::,2804:2a7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a80::,2804:2a80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a84::,2804:2a84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a88::,2804:2a88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a8c::,2804:2a8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a90::,2804:2a90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a94::,2804:2a94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a98::,2804:2a98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2a9c::,2804:2a9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2aa0::,2804:2aa0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2aa4::,2804:2aa4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2aa8::,2804:2aa8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2aac::,2804:2aac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ab0::,2804:2ab0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ab4::,2804:2ab4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ab8::,2804:2ab8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2abc::,2804:2abc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ac0::,2804:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ac4::,2804:2ac4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ac8::,2804:2ac8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2acc::,2804:2acc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ad0::,2804:2ad0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ad4::,2804:2ad4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ad8::,2804:2ad8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2adc::,2804:2adc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ae0::,2804:2ae0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ae4::,2804:2ae4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ae8::,2804:2ae8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2aec::,2804:2aec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2af0::,2804:2af0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2af4::,2804:2af4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2af8::,2804:2af8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2afc::,2804:2afc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b00::,2804:2b00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b04::,2804:2b04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b08::,2804:2b08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b0c::,2804:2b0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b10::,2804:2b10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b14::,2804:2b14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b18::,2804:2b18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b1c::,2804:2b1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b20::,2804:2b20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b24::,2804:2b24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b28::,2804:2b28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b2c::,2804:2b2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b30::,2804:2b30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b34::,2804:2b34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b38::,2804:2b38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b3c::,2804:2b3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b40::,2804:2b40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b44::,2804:2b44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b48::,2804:2b48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b4c::,2804:2b4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b50::,2804:2b50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b54::,2804:2b54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b58::,2804:2b58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b5c::,2804:2b5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b60::,2804:2b60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b64::,2804:2b64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b68::,2804:2b68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b6c::,2804:2b6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b70::,2804:2b70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b74::,2804:2b74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b78::,2804:2b78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b7c::,2804:2b7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b80::,2804:2b80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b84::,2804:2b84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b88::,2804:2b88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b8c::,2804:2b8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b90::,2804:2b90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b94::,2804:2b94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b98::,2804:2b98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2b9c::,2804:2b9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ba0::,2804:2ba0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ba4::,2804:2ba4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ba8::,2804:2ba8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bac::,2804:2bac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bb0::,2804:2bb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bb4::,2804:2bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bb8::,2804:2bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bbc::,2804:2bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bc0::,2804:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bc4::,2804:2bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bc8::,2804:2bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bcc::,2804:2bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bd0::,2804:2bd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bd4::,2804:2bd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bd8::,2804:2bd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bdc::,2804:2bdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2be0::,2804:2be0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2be4::,2804:2be4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2be8::,2804:2be8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bec::,2804:2bec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bf0::,2804:2bf0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bf4::,2804:2bf4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bf8::,2804:2bf8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2bfc::,2804:2bfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c00::,2804:2c00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c04::,2804:2c04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c08::,2804:2c08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c0c::,2804:2c0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c10::,2804:2c10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c14::,2804:2c14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c18::,2804:2c18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c20::,2804:2c20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c24::,2804:2c24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c28::,2804:2c28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c2c::,2804:2c2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c30::,2804:2c30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c34::,2804:2c34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c38::,2804:2c38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c3c::,2804:2c3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c40::,2804:2c40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c44::,2804:2c44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c48::,2804:2c48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c4c::,2804:2c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c50::,2804:2c50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c54::,2804:2c54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c58::,2804:2c58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c5c::,2804:2c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c60::,2804:2c60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c64::,2804:2c64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c68::,2804:2c68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c6c::,2804:2c6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c70::,2804:2c70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c74::,2804:2c74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c78::,2804:2c78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c7c::,2804:2c7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c80::,2804:2c80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c84::,2804:2c84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c88::,2804:2c88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c8c::,2804:2c8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c90::,2804:2c90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c94::,2804:2c94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c98::,2804:2c98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2c9c::,2804:2c9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ca0::,2804:2ca0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ca4::,2804:2ca4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ca8::,2804:2ca8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cac::,2804:2cac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cb0::,2804:2cb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cb4::,2804:2cb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cb8::,2804:2cb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cbc::,2804:2cbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cc0::,2804:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cc4::,2804:2cc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cc8::,2804:2cc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ccc::,2804:2ccc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cd0::,2804:2cd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cd4::,2804:2cd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cd8::,2804:2cd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cdc::,2804:2cdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ce0::,2804:2ce0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ce4::,2804:2ce4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ce8::,2804:2ce8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cec::,2804:2cec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cf0::,2804:2cf0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cf4::,2804:2cf4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cf8::,2804:2cf8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2cfc::,2804:2cfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d00::,2804:2d00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d04::,2804:2d04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d08::,2804:2d08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d0c::,2804:2d0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d10::,2804:2d10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d14::,2804:2d14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d18::,2804:2d18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d1c::,2804:2d1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d20::,2804:2d20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d24::,2804:2d24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d28::,2804:2d28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d2c::,2804:2d2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d30::,2804:2d30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d34::,2804:2d34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d38::,2804:2d38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d3c::,2804:2d3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d40::,2804:2d40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d44::,2804:2d44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d48::,2804:2d48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d4c::,2804:2d4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d50::,2804:2d50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d54::,2804:2d54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d58::,2804:2d58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d5c::,2804:2d5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d60::,2804:2d60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d64::,2804:2d64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d68::,2804:2d68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d6c::,2804:2d6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d70::,2804:2d70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d74::,2804:2d74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d78::,2804:2d78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d7c::,2804:2d7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d80::,2804:2d80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d84::,2804:2d84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d88::,2804:2d88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d8c::,2804:2d8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d90::,2804:2d90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d94::,2804:2d94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d98::,2804:2d98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2d9c::,2804:2d9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2da0::,2804:2da0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2da4::,2804:2da4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2da8::,2804:2da8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dac::,2804:2dac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2db0::,2804:2db0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2db4::,2804:2db4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2db8::,2804:2db8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dbc::,2804:2dbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dc0::,2804:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dc4::,2804:2dc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dc8::,2804:2dc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dcc::,2804:2dcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dd0::,2804:2dd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dd4::,2804:2dd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dd8::,2804:2dd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ddc::,2804:2ddc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2de0::,2804:2de0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2de4::,2804:2de4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2de8::,2804:2de8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dec::,2804:2dec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2df0::,2804:2df0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2df4::,2804:2df4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2df8::,2804:2df8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2dfc::,2804:2dfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e00::,2804:2e00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e04::,2804:2e04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e08::,2804:2e08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e0c::,2804:2e0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e10::,2804:2e10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e14::,2804:2e14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e18::,2804:2e18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e1c::,2804:2e1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e20::,2804:2e20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e24::,2804:2e24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e28::,2804:2e28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e2c::,2804:2e2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e30::,2804:2e30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e34::,2804:2e34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e38::,2804:2e38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e3c::,2804:2e3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e40::,2804:2e40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e44::,2804:2e44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e48::,2804:2e48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e4c::,2804:2e4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e50::,2804:2e50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e54::,2804:2e54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e58::,2804:2e58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e5c::,2804:2e5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e60::,2804:2e60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e64::,2804:2e64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e68::,2804:2e68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e6c::,2804:2e6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e70::,2804:2e70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e74::,2804:2e74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e78::,2804:2e78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e7c::,2804:2e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e80::,2804:2e80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e84::,2804:2e84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e88::,2804:2e88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e8c::,2804:2e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e90::,2804:2e90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e94::,2804:2e94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e98::,2804:2e98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2e9c::,2804:2e9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ea0::,2804:2ea0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ea4::,2804:2ea4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ea8::,2804:2ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2eac::,2804:2eac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2eb0::,2804:2eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2eb4::,2804:2eb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2eb8::,2804:2eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ebc::,2804:2ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ec0::,2804:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ec4::,2804:2ec4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ec8::,2804:2ec8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ecc::,2804:2ecc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ed0::,2804:2ed0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ed4::,2804:2ed4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ed8::,2804:2ed8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2edc::,2804:2edc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ee0::,2804:2ee0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ee4::,2804:2ee4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ee8::,2804:2ee8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2eec::,2804:2eec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ef0::,2804:2ef0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ef4::,2804:2ef4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ef8::,2804:2ef8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2efc::,2804:2efc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f00::,2804:2f00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f04::,2804:2f04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f08::,2804:2f08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f0c::,2804:2f0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f10::,2804:2f10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f14::,2804:2f14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f18::,2804:2f18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f1c::,2804:2f1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f20::,2804:2f20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f24::,2804:2f24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f28::,2804:2f28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f2c::,2804:2f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f30::,2804:2f30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f34::,2804:2f34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f38::,2804:2f38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f3c::,2804:2f3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f40::,2804:2f40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f44::,2804:2f44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f48::,2804:2f48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f4c::,2804:2f4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f50::,2804:2f50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f54::,2804:2f54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f58::,2804:2f58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f5c::,2804:2f5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f60::,2804:2f60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f64::,2804:2f64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f68::,2804:2f68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f6c::,2804:2f6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f70::,2804:2f70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f74::,2804:2f74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f78::,2804:2f78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f7c::,2804:2f7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f80::,2804:2f80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f84::,2804:2f84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f88::,2804:2f88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f8c::,2804:2f8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f90::,2804:2f90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f94::,2804:2f94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f98::,2804:2f98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2f9c::,2804:2f9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fa0::,2804:2fa0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fa4::,2804:2fa4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fa8::,2804:2fa8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fac::,2804:2fac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fb0::,2804:2fb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fb4::,2804:2fb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fb8::,2804:2fb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fbc::,2804:2fbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fc0::,2804:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fc4::,2804:2fc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fc8::,2804:2fc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fcc::,2804:2fcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fd0::,2804:2fd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fd4::,2804:2fd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fd8::,2804:2fd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fdc::,2804:2fdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fe0::,2804:2fe0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fe4::,2804:2fe4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fe8::,2804:2fe8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2fec::,2804:2fec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ff0::,2804:2ff0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ff4::,2804:2ff4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ff8::,2804:2ff8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2ffc::,2804:2ffc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3000::,2804:3000:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3004::,2804:3004:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3008::,2804:3008:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:300c::,2804:300c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3010::,2804:3010:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3014::,2804:3014:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3018::,2804:3018:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:301c::,2804:301c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3020::,2804:3020:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3024::,2804:3024:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3028::,2804:3028:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:302c::,2804:302c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3030::,2804:3030:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3034::,2804:3034:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3038::,2804:3038:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:303c::,2804:303c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3040::,2804:3040:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3044::,2804:3044:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3048::,2804:3048:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:304c::,2804:304c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3050::,2804:3050:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3054::,2804:3054:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3058::,2804:3058:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:305c::,2804:305c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3060::,2804:3060:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3064::,2804:3064:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3068::,2804:3068:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:306c::,2804:306c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3070::,2804:3070:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3074::,2804:3074:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3078::,2804:3078:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:307c::,2804:307c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3080::,2804:3080:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3084::,2804:3084:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3088::,2804:3088:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:308c::,2804:308c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3090::,2804:3090:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3094::,2804:3094:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3098::,2804:3098:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:309c::,2804:309c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30a0::,2804:30a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30a4::,2804:30a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30a8::,2804:30a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30ac::,2804:30ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30b0::,2804:30b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30b4::,2804:30b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30b8::,2804:30b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30bc::,2804:30bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30c0::,2804:30c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30c4::,2804:30c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30c8::,2804:30c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30cc::,2804:30cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30d0::,2804:30d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30d4::,2804:30d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30d8::,2804:30d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30dc::,2804:30dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30e0::,2804:30e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30e4::,2804:30e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30e8::,2804:30e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30ec::,2804:30ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30f0::,2804:30f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30f4::,2804:30f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30f8::,2804:30f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:30fc::,2804:30fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3100::,2804:3100:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3104::,2804:3104:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3108::,2804:3108:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:310c::,2804:310c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3110::,2804:3110:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3114::,2804:3114:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3118::,2804:3118:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:311c::,2804:311c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3120::,2804:3120:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3124::,2804:3124:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3128::,2804:3128:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:312c::,2804:312c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3130::,2804:3130:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3134::,2804:3134:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3138::,2804:3138:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:313c::,2804:313c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3140::,2804:3140:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3144::,2804:3144:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3148::,2804:3148:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:314c::,2804:314c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3150::,2804:3150:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3154::,2804:3154:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3158::,2804:3158:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:315c::,2804:315c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3160::,2804:3160:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3164::,2804:3164:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3168::,2804:3168:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:316c::,2804:316c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3170::,2804:3170:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3174::,2804:3174:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3178::,2804:3178:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:317c::,2804:317c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3180::,2804:3180:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3184::,2804:3184:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3188::,2804:3188:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:318c::,2804:318c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3190::,2804:3190:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3194::,2804:3194:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3198::,2804:3198:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:319c::,2804:319c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31a0::,2804:31a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31a4::,2804:31a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31a8::,2804:31a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31ac::,2804:31ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31b0::,2804:31b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31b4::,2804:31b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31b8::,2804:31b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31bc::,2804:31bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31c0::,2804:31c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31c4::,2804:31c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31c8::,2804:31c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31cc::,2804:31cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31d0::,2804:31d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31d4::,2804:31d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31d8::,2804:31d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31dc::,2804:31dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31e0::,2804:31e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31e4::,2804:31e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31e8::,2804:31e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31ec::,2804:31ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31f0::,2804:31f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31f4::,2804:31f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31f8::,2804:31f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:31fc::,2804:31fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3200::,2804:3200:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3204::,2804:3204:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3208::,2804:3208:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:320c::,2804:320c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3210::,2804:3210:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3214::,2804:3214:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3218::,2804:3218:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:321c::,2804:321c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3220::,2804:3220:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3224::,2804:3224:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3228::,2804:3228:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:322c::,2804:322c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3230::,2804:3230:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3234::,2804:3234:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3238::,2804:3238:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:323c::,2804:323c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3240::,2804:3240:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3244::,2804:3244:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3248::,2804:3248:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:324c::,2804:324c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3250::,2804:3250:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3254::,2804:3254:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3258::,2804:3258:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:325c::,2804:325c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3260::,2804:3260:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3264::,2804:3264:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3268::,2804:3268:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:326c::,2804:326c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3270::,2804:3270:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3274::,2804:3274:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3278::,2804:3278:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:327c::,2804:327c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3280::,2804:3280:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3284::,2804:3284:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3288::,2804:3288:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:328c::,2804:328c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3290::,2804:3290:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3294::,2804:3294:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3298::,2804:3298:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:329c::,2804:329c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32a0::,2804:32a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32a4::,2804:32a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32a8::,2804:32a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32ac::,2804:32ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32b0::,2804:32b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32b4::,2804:32b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32b8::,2804:32b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32bc::,2804:32bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32c0::,2804:32c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32c4::,2804:32c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32c8::,2804:32c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32cc::,2804:32cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32d0::,2804:32d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32d4::,2804:32d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32d8::,2804:32d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32dc::,2804:32dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32e0::,2804:32e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32e4::,2804:32e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32e8::,2804:32e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32ec::,2804:32ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32f0::,2804:32f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32f4::,2804:32f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32f8::,2804:32f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:32fc::,2804:32fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3300::,2804:3300:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3304::,2804:3304:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3308::,2804:3308:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:330c::,2804:330c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3310::,2804:3310:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3314::,2804:3314:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3318::,2804:3318:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:331c::,2804:331c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3320::,2804:3320:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3324::,2804:3324:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3328::,2804:3328:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:332c::,2804:332c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3330::,2804:3330:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3334::,2804:3334:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3338::,2804:3338:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:333c::,2804:333c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3340::,2804:3340:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3344::,2804:3344:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3348::,2804:3348:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:334c::,2804:334c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3350::,2804:3350:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3354::,2804:3354:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3358::,2804:3358:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:335c::,2804:335c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3360::,2804:3360:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3364::,2804:3364:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3368::,2804:3368:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:336c::,2804:336c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3370::,2804:3370:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3374::,2804:3374:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3378::,2804:3378:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:337c::,2804:337c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3380::,2804:3380:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3384::,2804:3384:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3388::,2804:3388:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:338c::,2804:338c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3390::,2804:3390:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3394::,2804:3394:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3398::,2804:3398:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:339c::,2804:339c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33a0::,2804:33a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33a4::,2804:33a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33a8::,2804:33a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33ac::,2804:33ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33b0::,2804:33b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33b4::,2804:33b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33b8::,2804:33b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33bc::,2804:33bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33c0::,2804:33c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33c4::,2804:33c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33c8::,2804:33c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33cc::,2804:33cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33d0::,2804:33d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33d4::,2804:33d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33d8::,2804:33d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33dc::,2804:33dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33e0::,2804:33e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33e4::,2804:33e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33e8::,2804:33e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33ec::,2804:33ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33f0::,2804:33f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33f4::,2804:33f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33f8::,2804:33f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:33fc::,2804:33fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3400::,2804:3400:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3404::,2804:3404:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3408::,2804:3408:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:340c::,2804:340c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3410::,2804:3410:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3414::,2804:3414:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3418::,2804:3418:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:341c::,2804:341c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3420::,2804:3420:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3424::,2804:3424:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3428::,2804:3428:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:342c::,2804:342c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3430::,2804:3430:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3434::,2804:3434:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3438::,2804:3438:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:343c::,2804:343c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3440::,2804:3440:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3444::,2804:3444:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3448::,2804:3448:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:344c::,2804:344c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3450::,2804:3450:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3454::,2804:3454:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3458::,2804:3458:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:345c::,2804:345c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3460::,2804:3460:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3464::,2804:3464:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3468::,2804:3468:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:346c::,2804:346c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3470::,2804:3470:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3474::,2804:3474:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3478::,2804:3478:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:347c::,2804:347c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3480::,2804:3480:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3484::,2804:3484:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3488::,2804:3488:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:348c::,2804:348c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3490::,2804:3490:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3494::,2804:3494:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3498::,2804:3498:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:349c::,2804:349c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34a0::,2804:34a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34a4::,2804:34a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34a8::,2804:34a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34ac::,2804:34ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34b0::,2804:34b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34b4::,2804:34b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34b8::,2804:34b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34bc::,2804:34bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34c0::,2804:34c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34c4::,2804:34c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34c8::,2804:34c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34cc::,2804:34cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34d0::,2804:34d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34d4::,2804:34d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34d8::,2804:34d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34dc::,2804:34dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34e0::,2804:34e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34e4::,2804:34e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34e8::,2804:34e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34ec::,2804:34ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34f0::,2804:34f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34f4::,2804:34f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34f8::,2804:34f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:34fc::,2804:34fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3500::,2804:3500:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3504::,2804:3504:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3508::,2804:3508:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:350c::,2804:350c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3510::,2804:3510:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3514::,2804:3514:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3518::,2804:3518:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:351c::,2804:351c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3520::,2804:3520:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3524::,2804:3524:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3528::,2804:3528:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:352c::,2804:352c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3530::,2804:3530:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3534::,2804:3534:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3538::,2804:3538:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:353c::,2804:353c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3540::,2804:3540:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3544::,2804:3544:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3548::,2804:3548:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:354c::,2804:354c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3550::,2804:3550:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3554::,2804:3554:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3558::,2804:3558:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:355c::,2804:355c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3560::,2804:3560:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3564::,2804:3564:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3568::,2804:3568:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:356c::,2804:356c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3570::,2804:3570:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3574::,2804:3574:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3578::,2804:3578:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:357c::,2804:357c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3580::,2804:3580:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3584::,2804:3584:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3588::,2804:3588:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:358c::,2804:358c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3590::,2804:3590:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3594::,2804:3594:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3598::,2804:3598:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:359c::,2804:359c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35a0::,2804:35a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35a4::,2804:35a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35a8::,2804:35a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35ac::,2804:35ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35b0::,2804:35b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35b4::,2804:35b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35b8::,2804:35b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35bc::,2804:35bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35c0::,2804:35c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35c4::,2804:35c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35c8::,2804:35c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35cc::,2804:35cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35d0::,2804:35d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35d4::,2804:35d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35d8::,2804:35d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35dc::,2804:35dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35e0::,2804:35e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35e4::,2804:35e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35e8::,2804:35e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35ec::,2804:35ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35f0::,2804:35f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35f4::,2804:35f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35f8::,2804:35f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:35fc::,2804:35fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3600::,2804:3600:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3604::,2804:3604:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3608::,2804:3608:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:360c::,2804:360c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3610::,2804:3610:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3614::,2804:3614:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3618::,2804:3618:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:361c::,2804:361c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3620::,2804:3620:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3624::,2804:3624:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3628::,2804:3628:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:362c::,2804:362c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3630::,2804:3630:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3634::,2804:3634:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3638::,2804:3638:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:363c::,2804:363c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3640::,2804:3640:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3644::,2804:3644:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3648::,2804:3648:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:364c::,2804:364c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3650::,2804:3650:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3654::,2804:3654:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3658::,2804:3658:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:365c::,2804:365c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3660::,2804:3660:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3664::,2804:3664:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3668::,2804:3668:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:366c::,2804:366c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3670::,2804:3670:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3674::,2804:3674:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3678::,2804:3678:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:367c::,2804:367c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3680::,2804:3680:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3684::,2804:3684:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3688::,2804:3688:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:368c::,2804:368c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3690::,2804:3690:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3694::,2804:3694:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3698::,2804:3698:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:369c::,2804:369c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36a0::,2804:36a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36a4::,2804:36a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36a8::,2804:36a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36ac::,2804:36ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36b0::,2804:36b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36b4::,2804:36b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36b8::,2804:36b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36bc::,2804:36bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36c0::,2804:36c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36c4::,2804:36c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36c8::,2804:36c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36cc::,2804:36cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36d0::,2804:36d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36d4::,2804:36d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36d8::,2804:36d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36dc::,2804:36dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36e0::,2804:36e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36e4::,2804:36e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36e8::,2804:36e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36ec::,2804:36ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36f0::,2804:36f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36f4::,2804:36f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36f8::,2804:36f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:36fc::,2804:36fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3700::,2804:3700:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3704::,2804:3704:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3708::,2804:3708:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:370c::,2804:370c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3710::,2804:3710:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3714::,2804:3714:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3718::,2804:3718:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:371c::,2804:371c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3720::,2804:3720:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3724::,2804:3724:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3728::,2804:3728:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:372c::,2804:372c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3730::,2804:3730:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3734::,2804:3734:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3738::,2804:3738:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:373c::,2804:373c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3740::,2804:3740:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3744::,2804:3744:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3748::,2804:3748:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:374c::,2804:374c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3750::,2804:3750:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3754::,2804:3754:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3758::,2804:3758:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:375c::,2804:375c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3760::,2804:3760:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3764::,2804:3764:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3768::,2804:3768:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:376c::,2804:376c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3770::,2804:3770:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3774::,2804:3774:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3778::,2804:3778:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:377c::,2804:377c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3780::,2804:3780:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3784::,2804:3784:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3788::,2804:3788:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:378c::,2804:378c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3790::,2804:3790:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3794::,2804:3794:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3798::,2804:3798:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:379c::,2804:379c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37a0::,2804:37a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37a4::,2804:37a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37a8::,2804:37a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37ac::,2804:37ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37b0::,2804:37b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37b4::,2804:37b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37b8::,2804:37b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37bc::,2804:37bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37c0::,2804:37c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37c4::,2804:37c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37c8::,2804:37c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37cc::,2804:37cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37d0::,2804:37d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37d4::,2804:37d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37d8::,2804:37d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37dc::,2804:37dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37e0::,2804:37e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37e4::,2804:37e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37e8::,2804:37e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37ec::,2804:37ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37f0::,2804:37f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37f4::,2804:37f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37f8::,2804:37f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:37fc::,2804:37fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3800::,2804:3800:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3804::,2804:3804:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3808::,2804:3808:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:380c::,2804:380c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3810::,2804:3810:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3814::,2804:3814:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3818::,2804:3818:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:381c::,2804:381c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3820::,2804:3820:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3824::,2804:3824:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3828::,2804:3828:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:382c::,2804:382c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3830::,2804:3830:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3834::,2804:3834:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3838::,2804:3838:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:383c::,2804:383c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3840::,2804:3840:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3844::,2804:3844:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3848::,2804:3848:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:384c::,2804:384c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3850::,2804:3850:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3854::,2804:3854:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3858::,2804:3858:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:385c::,2804:385c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3860::,2804:3860:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3864::,2804:3864:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3868::,2804:3868:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:386c::,2804:386c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3870::,2804:3870:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3874::,2804:3874:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3878::,2804:3878:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:387c::,2804:387c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3880::,2804:3880:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3884::,2804:3884:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3888::,2804:3888:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:388c::,2804:388c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3890::,2804:3890:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3894::,2804:3894:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3898::,2804:3898:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:389c::,2804:389c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38a0::,2804:38a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38a4::,2804:38a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38a8::,2804:38a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38ac::,2804:38ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38b0::,2804:38b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38b4::,2804:38b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38b8::,2804:38b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38bc::,2804:38bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38c0::,2804:38c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38c4::,2804:38c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38c8::,2804:38c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38cc::,2804:38cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38d0::,2804:38d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38d4::,2804:38d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38d8::,2804:38d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38dc::,2804:38dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38e0::,2804:38e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38e4::,2804:38e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38e8::,2804:38e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38ec::,2804:38ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38f0::,2804:38f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38f4::,2804:38f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38f8::,2804:38f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:38fc::,2804:38fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3900::,2804:3900:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3904::,2804:3904:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3908::,2804:3908:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:390c::,2804:390c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3910::,2804:3910:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3914::,2804:3914:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3918::,2804:3918:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:391c::,2804:391c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3920::,2804:3920:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3924::,2804:3924:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3928::,2804:3928:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:392c::,2804:392c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3930::,2804:3930:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3934::,2804:3934:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3938::,2804:3938:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:393c::,2804:393c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3940::,2804:3940:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3944::,2804:3944:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3948::,2804:3948:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:394c::,2804:394c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3950::,2804:3950:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3954::,2804:3954:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3958::,2804:3958:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:395c::,2804:395c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3960::,2804:3960:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3964::,2804:3964:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3968::,2804:3968:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:396c::,2804:396c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3970::,2804:3970:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3974::,2804:3974:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3978::,2804:3978:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:397c::,2804:397c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3980::,2804:3980:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3984::,2804:3984:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3988::,2804:3988:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:398c::,2804:398c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3990::,2804:3990:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3994::,2804:3994:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3998::,2804:3998:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:399c::,2804:399c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39a0::,2804:39a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39a4::,2804:39a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39a8::,2804:39a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39ac::,2804:39ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39b0::,2804:39b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39b4::,2804:39b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39b8::,2804:39b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39bc::,2804:39bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39c0::,2804:39c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39c4::,2804:39c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39c8::,2804:39c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39cc::,2804:39cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39d0::,2804:39d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39d4::,2804:39d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39d8::,2804:39d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39dc::,2804:39dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39e0::,2804:39e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39e4::,2804:39e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39e8::,2804:39e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39ec::,2804:39ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39f0::,2804:39f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39f4::,2804:39f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39f8::,2804:39f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39fc::,2804:39fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a00::,2804:3a00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a04::,2804:3a04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a08::,2804:3a08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a0c::,2804:3a0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a10::,2804:3a10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a14::,2804:3a14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a18::,2804:3a18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a1c::,2804:3a1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a20::,2804:3a20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a24::,2804:3a24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a28::,2804:3a28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a2c::,2804:3a2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a30::,2804:3a30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a34::,2804:3a34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a38::,2804:3a38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a3c::,2804:3a3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a40::,2804:3a40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a44::,2804:3a44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a48::,2804:3a48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a4c::,2804:3a4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a50::,2804:3a50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a54::,2804:3a54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a58::,2804:3a58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a5c::,2804:3a5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a60::,2804:3a60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a64::,2804:3a64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a68::,2804:3a68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a6c::,2804:3a6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a70::,2804:3a70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a74::,2804:3a74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a78::,2804:3a78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a7c::,2804:3a7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a80::,2804:3a80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a84::,2804:3a84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a88::,2804:3a88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a8c::,2804:3a8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a90::,2804:3a90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a94::,2804:3a94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a98::,2804:3a98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a9c::,2804:3a9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aa0::,2804:3aa0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aa4::,2804:3aa4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aa8::,2804:3aa8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aac::,2804:3aac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ab0::,2804:3ab0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ab4::,2804:3ab4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ab8::,2804:3ab8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3abc::,2804:3abc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ac0::,2804:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ac4::,2804:3ac4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ac8::,2804:3ac8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3acc::,2804:3acc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ad0::,2804:3ad0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ad4::,2804:3ad4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ad8::,2804:3ad8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3adc::,2804:3adc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ae0::,2804:3ae0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ae4::,2804:3ae4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ae8::,2804:3ae8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aec::,2804:3aec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3af0::,2804:3af0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3af4::,2804:3af4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3af8::,2804:3af8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3afc::,2804:3afc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b00::,2804:3b00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b04::,2804:3b04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b08::,2804:3b08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b0c::,2804:3b0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b10::,2804:3b10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b14::,2804:3b14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b18::,2804:3b18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b1c::,2804:3b1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b20::,2804:3b20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b24::,2804:3b24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b28::,2804:3b28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b2c::,2804:3b2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b30::,2804:3b30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b34::,2804:3b34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b38::,2804:3b38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b3c::,2804:3b3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b40::,2804:3b40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b44::,2804:3b44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b48::,2804:3b48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b4c::,2804:3b4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b50::,2804:3b50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b54::,2804:3b54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b58::,2804:3b58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b5c::,2804:3b5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b60::,2804:3b60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b64::,2804:3b64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b68::,2804:3b68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b6c::,2804:3b6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b70::,2804:3b70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b74::,2804:3b74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b78::,2804:3b78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b7c::,2804:3b7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b80::,2804:3b80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b84::,2804:3b84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b88::,2804:3b88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b8c::,2804:3b8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b90::,2804:3b90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b94::,2804:3b94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b98::,2804:3b98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b9c::,2804:3b9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ba0::,2804:3ba0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ba4::,2804:3ba4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ba8::,2804:3ba8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bac::,2804:3bac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bb0::,2804:3bb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bb4::,2804:3bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bb8::,2804:3bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bbc::,2804:3bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bc0::,2804:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bc4::,2804:3bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bc8::,2804:3bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bcc::,2804:3bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bd0::,2804:3bd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bd4::,2804:3bd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bd8::,2804:3bd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bdc::,2804:3bdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3be0::,2804:3be0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3be4::,2804:3be4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3be8::,2804:3be8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bec::,2804:3bec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bf0::,2804:3bf0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bf4::,2804:3bf4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bf8::,2804:3bf8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bfc::,2804:3bfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c00::,2804:3c00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c04::,2804:3c04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c08::,2804:3c08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c0c::,2804:3c0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c10::,2804:3c10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c14::,2804:3c14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c18::,2804:3c18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c1c::,2804:3c1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c20::,2804:3c20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c24::,2804:3c24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c28::,2804:3c28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c2c::,2804:3c2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c30::,2804:3c30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c34::,2804:3c34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c38::,2804:3c38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c3c::,2804:3c3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c40::,2804:3c40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c44::,2804:3c44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c48::,2804:3c48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c4c::,2804:3c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c50::,2804:3c50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c54::,2804:3c54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c58::,2804:3c58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c5c::,2804:3c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c60::,2804:3c60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c64::,2804:3c64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c68::,2804:3c68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c6c::,2804:3c6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c70::,2804:3c70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c74::,2804:3c74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c78::,2804:3c78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c7c::,2804:3c7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c80::,2804:3c80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c84::,2804:3c84:ffff:ffff:ffff:ffff:ffff:ffff,US +2804:3c88::,2804:3c88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c8c::,2804:3c8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c90::,2804:3c90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c94::,2804:3c94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c98::,2804:3c98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c9c::,2804:3c9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ca0::,2804:3ca0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ca4::,2804:3ca4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ca8::,2804:3ca8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cac::,2804:3cac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cb0::,2804:3cb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cb4::,2804:3cb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cb8::,2804:3cb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cbc::,2804:3cbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cc0::,2804:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cc4::,2804:3cc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cc8::,2804:3cc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ccc::,2804:3ccc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cd0::,2804:3cd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cd4::,2804:3cd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cd8::,2804:3cd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cdc::,2804:3cdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ce0::,2804:3ce0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ce4::,2804:3ce4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ce8::,2804:3ce8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cec::,2804:3cec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cf0::,2804:3cf0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cf4::,2804:3cf4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cf8::,2804:3cf8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cfc::,2804:3cfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d00::,2804:3d00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d04::,2804:3d04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d08::,2804:3d08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d0c::,2804:3d0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d10::,2804:3d10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d14::,2804:3d14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d18::,2804:3d18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d1c::,2804:3d1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d20::,2804:3d20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d24::,2804:3d24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d28::,2804:3d28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d2c::,2804:3d2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d30::,2804:3d30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d34::,2804:3d34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d38::,2804:3d38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d3c::,2804:3d3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d40::,2804:3d40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d44::,2804:3d44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d48::,2804:3d48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d4c::,2804:3d4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d50::,2804:3d50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d54::,2804:3d54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d58::,2804:3d58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d5c::,2804:3d5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d60::,2804:3d60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d64::,2804:3d64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d68::,2804:3d68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d6c::,2804:3d6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d70::,2804:3d70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d74::,2804:3d74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d78::,2804:3d78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d7c::,2804:3d7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d80::,2804:3d80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d84::,2804:3d84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d88::,2804:3d88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d8c::,2804:3d8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d90::,2804:3d90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d94::,2804:3d94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d98::,2804:3d98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3d9c::,2804:3d9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3da0::,2804:3da0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3da4::,2804:3da4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3da8::,2804:3da8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dac::,2804:3dac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3db0::,2804:3db0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3db4::,2804:3db4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3db8::,2804:3db8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dbc::,2804:3dbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dc0::,2804:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dc4::,2804:3dc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dc8::,2804:3dc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dcc::,2804:3dcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dd0::,2804:3dd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dd4::,2804:3dd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dd8::,2804:3dd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ddc::,2804:3ddc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3de0::,2804:3de0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3de4::,2804:3de4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3de8::,2804:3de8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dec::,2804:3dec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3df0::,2804:3df0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3df4::,2804:3df4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3df8::,2804:3df8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3dfc::,2804:3dfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e00::,2804:3e00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e04::,2804:3e04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e08::,2804:3e08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e0c::,2804:3e0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e10::,2804:3e10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e14::,2804:3e14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e18::,2804:3e18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e1c::,2804:3e1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e20::,2804:3e20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e24::,2804:3e24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e28::,2804:3e28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e2c::,2804:3e2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e30::,2804:3e30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e34::,2804:3e34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e38::,2804:3e38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e3c::,2804:3e3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e40::,2804:3e40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e44::,2804:3e44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e48::,2804:3e48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e4c::,2804:3e4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e50::,2804:3e50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e54::,2804:3e54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e58::,2804:3e58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e5c::,2804:3e5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e60::,2804:3e60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e64::,2804:3e64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e68::,2804:3e68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e6c::,2804:3e6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e70::,2804:3e70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e74::,2804:3e74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e78::,2804:3e78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e7c::,2804:3e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e80::,2804:3e80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e84::,2804:3e84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e88::,2804:3e88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e8c::,2804:3e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e90::,2804:3e90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e94::,2804:3e94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e98::,2804:3e98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3e9c::,2804:3e9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ea0::,2804:3ea0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ea4::,2804:3ea4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ea8::,2804:3ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3eac::,2804:3eac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3eb0::,2804:3eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3eb4::,2804:3eb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3eb8::,2804:3eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ebc::,2804:3ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ec0::,2804:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ec4::,2804:3ec4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ec8::,2804:3ec8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ecc::,2804:3ecc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ed0::,2804:3ed0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ed4::,2804:3ed4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ed8::,2804:3ed8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3edc::,2804:3edc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ee0::,2804:3ee0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ee4::,2804:3ee4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ee8::,2804:3ee8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3eec::,2804:3eec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ef0::,2804:3ef0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ef4::,2804:3ef4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ef8::,2804:3ef8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3efc::,2804:3efc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f00::,2804:3f00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f04::,2804:3f04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f08::,2804:3f08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f0c::,2804:3f0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f10::,2804:3f10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f14::,2804:3f14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f18::,2804:3f18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f1c::,2804:3f1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f20::,2804:3f20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f24::,2804:3f24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f28::,2804:3f28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f2c::,2804:3f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f30::,2804:3f30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f34::,2804:3f34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f38::,2804:3f38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f3c::,2804:3f3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f40::,2804:3f40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f44::,2804:3f44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f48::,2804:3f48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f4c::,2804:3f4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f50::,2804:3f50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f54::,2804:3f54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f58::,2804:3f58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f5c::,2804:3f5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f60::,2804:3f60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f64::,2804:3f64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f68::,2804:3f68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f6c::,2804:3f6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f70::,2804:3f70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f74::,2804:3f74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f78::,2804:3f78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f7c::,2804:3f7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f80::,2804:3f80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f84::,2804:3f84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f88::,2804:3f88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f8c::,2804:3f8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f90::,2804:3f90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f94::,2804:3f94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f98::,2804:3f98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3f9c::,2804:3f9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fa0::,2804:3fa0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fa4::,2804:3fa4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fa8::,2804:3fa8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fac::,2804:3fac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fb0::,2804:3fb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fb4::,2804:3fb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fb8::,2804:3fb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fbc::,2804:3fbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fc0::,2804:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fc4::,2804:3fc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fc8::,2804:3fc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fcc::,2804:3fcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fd0::,2804:3fd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fd4::,2804:3fd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fd8::,2804:3fd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fdc::,2804:3fdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fe0::,2804:3fe0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fe4::,2804:3fe4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fe8::,2804:3fe8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3fec::,2804:3fec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ff0::,2804:3ff0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ff4::,2804:3ff4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ff8::,2804:3ff8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ffc::,2804:3ffc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4000::,2804:4000:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4004::,2804:4004:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4008::,2804:4008:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:400c::,2804:400c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4010::,2804:4010:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4014::,2804:4014:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4018::,2804:4018:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:401c::,2804:401c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4020::,2804:4020:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4024::,2804:4024:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4028::,2804:4028:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:402c::,2804:402c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4030::,2804:4030:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4034::,2804:4034:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4038::,2804:4038:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:403c::,2804:403c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4040::,2804:4040:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4044::,2804:4044:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4048::,2804:4048:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:404c::,2804:404c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4050::,2804:4050:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4054::,2804:4054:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4058::,2804:4058:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:405c::,2804:405c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4060::,2804:4060:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4064::,2804:4064:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4068::,2804:4068:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:406c::,2804:406c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4070::,2804:4070:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4074::,2804:4074:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4078::,2804:4078:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:407c::,2804:407c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4080::,2804:4080:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4084::,2804:4084:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4088::,2804:4088:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:408c::,2804:408c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4090::,2804:4090:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4094::,2804:4094:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4098::,2804:4098:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:409c::,2804:409c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40a0::,2804:40a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40a4::,2804:40a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40a8::,2804:40a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40ac::,2804:40ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40b0::,2804:40b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40b4::,2804:40b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40b8::,2804:40b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40bc::,2804:40bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40c0::,2804:40c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40c4::,2804:40c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40c8::,2804:40c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40cc::,2804:40cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40d0::,2804:40d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40d4::,2804:40d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40d8::,2804:40d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40dc::,2804:40dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40e0::,2804:40e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40e4::,2804:40e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40e8::,2804:40e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40ec::,2804:40ec:ffff:ffff:ffff:ffff:ffff:ffff,US +2804:40f0::,2804:40f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40f4::,2804:40f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40f8::,2804:40f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:40fc::,2804:40fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4100::,2804:4100:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4104::,2804:4104:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4108::,2804:4108:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:410c::,2804:410c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4110::,2804:4110:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4114::,2804:4114:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4118::,2804:4118:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:411c::,2804:411c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4120::,2804:4120:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4124::,2804:4124:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4128::,2804:4128:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:412c::,2804:412c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4130::,2804:4130:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4134::,2804:4134:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4138::,2804:4138:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:413c::,2804:413c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4140::,2804:4140:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4144::,2804:4144:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4148::,2804:4148:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:414c::,2804:414c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4150::,2804:4150:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4154::,2804:4154:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4158::,2804:4158:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:415c::,2804:415c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4160::,2804:4160:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4164::,2804:4164:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4168::,2804:4168:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:416c::,2804:416c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4170::,2804:4170:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4174::,2804:4174:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4178::,2804:4178:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:417c::,2804:417c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4180::,2804:4180:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4184::,2804:4184:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4188::,2804:4188:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:418c::,2804:418c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4190::,2804:4190:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4194::,2804:4194:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4198::,2804:4198:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:419c::,2804:419c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41a0::,2804:41a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41a4::,2804:41a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41a8::,2804:41a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41ac::,2804:41ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41b0::,2804:41b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41b4::,2804:41b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41b8::,2804:41b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41bc::,2804:41bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41c0::,2804:41c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41c4::,2804:41c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41c8::,2804:41c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41cc::,2804:41cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41d0::,2804:41d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41d4::,2804:41d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41d8::,2804:41d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41dc::,2804:41dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41e0::,2804:41e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41e4::,2804:41e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41e8::,2804:41e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41ec::,2804:41ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41f0::,2804:41f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41f4::,2804:41f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41f8::,2804:41f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:41fc::,2804:41fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4200::,2804:4200:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4204::,2804:4204:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4208::,2804:4208:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:420c::,2804:420c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4210::,2804:4210:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4214::,2804:4214:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4218::,2804:4218:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:421c::,2804:421c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4220::,2804:4220:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4224::,2804:4224:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4228::,2804:4228:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:422c::,2804:422c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4230::,2804:4230:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4234::,2804:4234:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4238::,2804:4238:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:423c::,2804:423c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4240::,2804:4240:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4244::,2804:4244:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4248::,2804:4248:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:424c::,2804:424c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4250::,2804:4250:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4254::,2804:4254:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4258::,2804:4258:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:425c::,2804:425c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4260::,2804:4260:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4264::,2804:4264:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4268::,2804:4268:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:426c::,2804:426c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4270::,2804:4270:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4274::,2804:4274:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4278::,2804:4278:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:427c::,2804:427c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4280::,2804:4280:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4284::,2804:4284:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4288::,2804:4288:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:428c::,2804:428c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4290::,2804:4290:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4294::,2804:4294:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4298::,2804:4298:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:429c::,2804:429c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42a0::,2804:42a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42a4::,2804:42a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42a8::,2804:42a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42ac::,2804:42ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42b0::,2804:42b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42b4::,2804:42b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42b8::,2804:42b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42bc::,2804:42bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42c0::,2804:42c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42c4::,2804:42c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42c8::,2804:42c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42cc::,2804:42cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42d0::,2804:42d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42d4::,2804:42d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42d8::,2804:42d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42dc::,2804:42dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42e0::,2804:42e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42e4::,2804:42e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42e8::,2804:42e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42ec::,2804:42ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42f0::,2804:42f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42f4::,2804:42f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42f8::,2804:42f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:42fc::,2804:42fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4300::,2804:4300:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4304::,2804:4304:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4308::,2804:4308:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:430c::,2804:430c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4310::,2804:4310:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4314::,2804:4314:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4318::,2804:4318:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:431c::,2804:431c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4320::,2804:4320:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4324::,2804:4324:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4328::,2804:4328:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:432c::,2804:432c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4330::,2804:4330:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4334::,2804:4334:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4338::,2804:4338:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:433c::,2804:433c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4340::,2804:4340:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4344::,2804:4344:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4348::,2804:4348:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:434c::,2804:434c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4350::,2804:4350:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4354::,2804:4354:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4358::,2804:4358:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:435c::,2804:435c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4360::,2804:4360:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4364::,2804:4364:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4368::,2804:4368:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:436c::,2804:436c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4370::,2804:4370:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4374::,2804:4374:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4378::,2804:4378:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:437c::,2804:437c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4380::,2804:4380:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4384::,2804:4384:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4388::,2804:4388:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:438c::,2804:438c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4390::,2804:4390:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4394::,2804:4394:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4398::,2804:4398:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:439c::,2804:439c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43a0::,2804:43a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43a4::,2804:43a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43a8::,2804:43a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43ac::,2804:43ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43b0::,2804:43b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43b4::,2804:43b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43b8::,2804:43b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43bc::,2804:43bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43c0::,2804:43c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43c4::,2804:43c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43c8::,2804:43c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43cc::,2804:43cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43d0::,2804:43d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43d4::,2804:43d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43d8::,2804:43d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43dc::,2804:43dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43e0::,2804:43e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43e4::,2804:43e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43e8::,2804:43e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43ec::,2804:43ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43f0::,2804:43f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43f4::,2804:43f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43f8::,2804:43f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:43fc::,2804:43fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4400::,2804:4400:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4404::,2804:4404:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4408::,2804:4408:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:440c::,2804:440c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4410::,2804:4410:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4414::,2804:4414:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4418::,2804:4418:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:441c::,2804:441c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4420::,2804:4420:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4424::,2804:4424:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4428::,2804:4428:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:442c::,2804:442c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4430::,2804:4430:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4434::,2804:4434:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4438::,2804:4438:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:443c::,2804:443c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4440::,2804:4440:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4444::,2804:4444:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4448::,2804:4448:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:444c::,2804:444c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4450::,2804:4450:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4454::,2804:4454:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4458::,2804:4458:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:445c::,2804:445c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4460::,2804:4460:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4464::,2804:4464:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4468::,2804:4468:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:446c::,2804:446c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4470::,2804:4470:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4474::,2804:4474:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4478::,2804:4478:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:447c::,2804:447c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4480::,2804:4480:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4484::,2804:4484:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4488::,2804:4488:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:448c::,2804:448c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4490::,2804:4490:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4494::,2804:4494:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4498::,2804:4498:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:449c::,2804:449c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44a0::,2804:44a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44a4::,2804:44a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44a8::,2804:44a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44ac::,2804:44ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44b0::,2804:44b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44b4::,2804:44b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44b8::,2804:44b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44bc::,2804:44bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44c0::,2804:44c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44c4::,2804:44c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44c8::,2804:44c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44cc::,2804:44cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44d0::,2804:44d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44d4::,2804:44d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44d8::,2804:44d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44dc::,2804:44dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44e0::,2804:44e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44e4::,2804:44e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44e8::,2804:44e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44ec::,2804:44ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44f0::,2804:44f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44f4::,2804:44f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44f8::,2804:44f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:44fc::,2804:44fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4500::,2804:4500:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4504::,2804:4504:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4508::,2804:4508:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:450c::,2804:450c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4510::,2804:4510:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4514::,2804:4514:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4518::,2804:4518:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:451c::,2804:451c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4520::,2804:4520:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4524::,2804:4524:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4528::,2804:4528:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:452c::,2804:452c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4530::,2804:4530:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4534::,2804:4534:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4538::,2804:4538:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:453c::,2804:453c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4540::,2804:4540:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4544::,2804:4544:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4548::,2804:4548:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:454c::,2804:454c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4550::,2804:4550:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4554::,2804:4554:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4558::,2804:4558:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:455c::,2804:455c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4560::,2804:4560:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4564::,2804:4564:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4568::,2804:4568:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:456c::,2804:456c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4570::,2804:4570:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4574::,2804:4574:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4578::,2804:4578:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:457c::,2804:457c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4580::,2804:4580:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4584::,2804:4584:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4588::,2804:4588:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:458c::,2804:458c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4590::,2804:4590:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4594::,2804:4594:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4598::,2804:4598:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:459c::,2804:459c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45a0::,2804:45a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45a4::,2804:45a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45a8::,2804:45a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45ac::,2804:45ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45b0::,2804:45b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45b4::,2804:45b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45b8::,2804:45b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45bc::,2804:45bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45c0::,2804:45c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45c4::,2804:45c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45c8::,2804:45c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45cc::,2804:45cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45d0::,2804:45d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45d4::,2804:45d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45d8::,2804:45d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45dc::,2804:45dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45e0::,2804:45e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45e4::,2804:45e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45e8::,2804:45e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45ec::,2804:45ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45f0::,2804:45f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45f4::,2804:45f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45f8::,2804:45f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:45fc::,2804:45fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4600::,2804:4600:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4604::,2804:4604:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4608::,2804:4608:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:460c::,2804:460c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4610::,2804:4610:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4614::,2804:4614:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4618::,2804:4618:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:461c::,2804:461c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4620::,2804:4620:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4624::,2804:4624:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4628::,2804:4628:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:462c::,2804:462c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4630::,2804:4630:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4634::,2804:4634:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4638::,2804:4638:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:463c::,2804:463c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4640::,2804:4640:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4644::,2804:4644:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4648::,2804:4648:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:464c::,2804:464c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4650::,2804:4650:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4654::,2804:4654:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4658::,2804:4658:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:465c::,2804:465c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4660::,2804:4660:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4664::,2804:4664:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4668::,2804:4668:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:466c::,2804:466c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4670::,2804:4670:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4674::,2804:4674:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4678::,2804:4678:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:467c::,2804:467c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4680::,2804:4680:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4684::,2804:4684:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4688::,2804:4688:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:468c::,2804:468c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4690::,2804:4690:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4694::,2804:4694:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4698::,2804:4698:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:469c::,2804:469c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46a0::,2804:46a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46a4::,2804:46a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46a8::,2804:46a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46ac::,2804:46ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46b0::,2804:46b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46b4::,2804:46b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46b8::,2804:46b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46bc::,2804:46bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46c0::,2804:46c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46c4::,2804:46c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46c8::,2804:46c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46cc::,2804:46cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46d0::,2804:46d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46d4::,2804:46d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46d8::,2804:46d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46dc::,2804:46dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46e0::,2804:46e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46e4::,2804:46e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46e8::,2804:46e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46ec::,2804:46ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46f0::,2804:46f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46f4::,2804:46f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46f8::,2804:46f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:46fc::,2804:46fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4700::,2804:4700:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4704::,2804:4704:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4708::,2804:4708:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:470c::,2804:470c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4710::,2804:4710:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4714::,2804:4714:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4718::,2804:4718:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:471c::,2804:471c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4720::,2804:4720:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4724::,2804:4724:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4728::,2804:4728:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:472c::,2804:472c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4730::,2804:4730:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4734::,2804:4734:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:4738::,2804:4738:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:473c::,2804:473c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2806::,2806:f:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:200::,2806:216::ffff:ffff:ffff:ffff:ffff,MX +2806:217::,2806:220:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:230::,2806:230:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:238::,2806:238::ffff:ffff:ffff:ffff:ffff,MX +2806:238:10::,2806:238:10:ffff:ffff:ffff:ffff:ffff,MX +2806:239::,2806:240:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:250::,2806:250:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:260::,2806:260:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:270::,2806:270:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:280::,2806:290:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:2a0::,2806:2a0:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:2b0::,2806:2b0:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:2c0::,2806:2c0:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:2d0::,2806:2d0:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:2e0::,2806:2e6:d:ffff:ffff:ffff:ffff:ffff,MX +2806:2e6:e::,2806:2e6:e:7fff:ffff:ffff:ffff:ffff,US +2806:2e6:e:8000::,2806:2ee:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:2f0::,2806:2f0:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:2f4::,2806:2f4:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:300::,2806:300:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:310::,2806:310:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:320::,2806:320:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:330::,2806:330:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:350::,2806:350:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:360::,2806:360:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:370::,2806:370:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:1000::,2806:10ff:ffff:ffff:ffff:ffff:ffff:ffff,MX +2a00::,2a00:3ff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:800::,2a00:865:7d68:7fff:ffff:ffff:ffff:ffff,SE +2a00:865:7d68:8000::,2a00:865:7d68:ffff:ffff:ffff:ffff:ffff,NL +2a00:865:7d69::,2a00:87f:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:c00::,2a00:c00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:c08::,2a00:c08:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c10::,2a00:c10:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:c18::,2a00:c18:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:c20::,2a00:c20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c30::,2a00:c37:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a00:c38::,2a00:c38:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:c40::,2a00:c40:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:c50::,2a00:c57:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:c58::,2a00:c58:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:c60::,2a00:c60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c68::,2a00:c68:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a00:c70::,2a00:c70:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:c78::,2a00:c78:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:c80::,2a00:c80:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:c88::,2a00:c88:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:c90::,2a00:c90:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:c98::,2a00:c98:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:ca0::,2a00:ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:ca8::,2a00:ca8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:cb0::,2a00:cb0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:cb8::,2a00:cb8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:cc0::,2a00:cc0:fffd:ffff:ffff:ffff:ffff:ffff,DE +2a00:cc0:fffe::,2a00:cc0:fffe:7fff:ffff:ffff:ffff:ffff,NL +2a00:cc0:fffe:8000::,2a00:cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:cc8::,2a00:cc8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:cd0::,2a00:cd0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:cd8::,2a00:cd8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:ce0::,2a00:ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ce8::,2a00:ce8:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:cf8::,2a00:cf8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:d00::,2a00:d07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:d08::,2a00:d08:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d10::,2a00:d10:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:d18::,2a00:d18:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:d20::,2a00:d20:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:d28::,2a00:d28:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d30::,2a00:d30:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a00:d40::,2a00:d40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:d50::,2a00:d50:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d58::,2a00:d58:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:d60::,2a00:d60:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:d68::,2a00:d68:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d70::,2a00:d70:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d78::,2a00:d78:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:d80::,2a00:d80:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d88::,2a00:d8f:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:d90::,2a00:d97:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:d98::,2a00:d98:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:da8::,2a00:da9:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:db0::,2a00:db0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:db8::,2a00:db8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:dc0::,2a00:dc0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:dc8::,2a00:dc8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:dd0::,2a00:dd0:fffe:ffff:ffff:ffff:ffff:ffff,NL +2a00:dd0:ffff::,2a00:dd0:ffff:7fff:ffff:ffff:ffff:ffff,SE +2a00:dd0:ffff:8000::,2a00:dd0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:dd8::,2a00:dd8:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a00:de8::,2a00:de8:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:df0::,2a00:df0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:df8::,2a00:df8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:e00::,2a00:e00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:e08::,2a00:e0f:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:e10::,2a00:e10:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:e18::,2a00:e18:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:e20::,2a00:e20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e30::,2a00:e30:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:e38::,2a00:e38:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:e40::,2a00:e40:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:e48::,2a00:e48:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:e50::,2a00:e58:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:e60::,2a00:e68:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:e70::,2a00:e70:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:e78::,2a00:e7b:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:e80::,2a00:e80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:e88::,2a00:e88:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:e90::,2a00:e90:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:e98::,2a00:e98:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:ea0::,2a00:ea7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:ea8::,2a00:eaf:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:eb0::,2a00:eb0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:eb8::,2a00:eb8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ec0::,2a00:ec0:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a00:ec8::,2a00:ec8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:ed0::,2a00:ed0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ed8::,2a00:ed8:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:ee0::,2a00:ee2:2201:7fff:ffff:ffff:ffff:ffff,SI +2a00:ee2:2201:8000::,2a00:ee2:2201:9fff:ffff:ffff:ffff:ffff,FR +2a00:ee2:2201:a000::,2a00:ee7:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:ee8::,2a00:ee8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:ef0::,2a00:ef0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:ef8::,2a00:ef8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:f00::,2a00:f08:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f10::,2a00:f17:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:f18::,2a00:f18:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:f20::,2a00:f20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:f28::,2a00:f2f:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a00:f30::,2a00:f30:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f38::,2a00:f38:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a00:f40::,2a00:f47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:f48::,2a00:f4f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:f50::,2a00:f50:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:f58::,2a00:f58:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:f60::,2a00:f60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:f68::,2a00:f68:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:f70::,2a00:f70:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:f78::,2a00:f78:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:f80::,2a00:f80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:f88::,2a00:f88:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:f90::,2a00:f90:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:f98::,2a00:f98:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:fa0::,2a00:fa7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:fa8::,2a00:fa8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:fb8::,2a00:fb8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:fc0::,2a00:fc0:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:fc8::,2a00:fc8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:fd0::,2a00:fd0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:fd8::,2a00:fd8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:fe0::,2a00:fe0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:fe8::,2a00:fe8:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a00:ff0::,2a00:ff0:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a00:ff8::,2a00:fff:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:1000::,2a00:1000:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1008::,2a00:1008:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1010::,2a00:1010:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1018::,2a00:1018:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1020::,2a00:1020:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1028::,2a00:102f:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:1030::,2a00:1030:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1040::,2a00:1040:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:1048::,2a00:1048:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1050::,2a00:1050:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1058::,2a00:1058:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1060::,2a00:1060:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a00:1068::,2a00:1068:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1070::,2a00:1070:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1078::,2a00:1078:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1080::,2a00:1080:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1088::,2a00:1088:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1098::,2a00:1098:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:10a0::,2a00:10a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:10a8::,2a00:10a8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:10b0::,2a00:10b7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:10b8::,2a00:10b8:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:10c0::,2a00:10c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:10c8::,2a00:10c8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:10d0::,2a00:10d0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:10d8::,2a00:10df:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:10e0::,2a00:10e0:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a00:10e8::,2a00:10f0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:10f8::,2a00:10f8:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a00:1100::,2a00:1107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1108::,2a00:1108:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:1110::,2a00:1117:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:1118::,2a00:1118:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:1120::,2a00:1120:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1128::,2a00:1128:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:1130::,2a00:1130:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1138::,2a00:1138:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1140::,2a00:1140:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:1148::,2a00:1148:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1150::,2a00:1150:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a00:1158::,2a00:1158:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1160::,2a00:1167:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1168::,2a00:116f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1170::,2a00:1170:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:1178::,2a00:1178:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1180::,2a00:1180:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1188::,2a00:1188:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1190::,2a00:1190:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:1198::,2a00:1198:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:11a8::,2a00:11a8:ffff:ffff:ffff:ffff:ffff:ffff,OM +2a00:11b0::,2a00:11b0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:11b8::,2a00:11b8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:11c0::,2a00:11c0:1:ffff:ffff:ffff:ffff:ffff,AT +2a00:11c0:2::,2a00:11c0:2:7fff:ffff:ffff:ffff:ffff,FR +2a00:11c0:2:8000::,2a00:11c0:3:ffff:ffff:ffff:ffff:ffff,AT +2a00:11c0:4::,2a00:11c0:4:7fff:ffff:ffff:ffff:ffff,CZ +2a00:11c0:4:8000::,2a00:11c0:4:ffff:ffff:ffff:ffff:ffff,AT +2a00:11c0:5::,2a00:11c0:5:7fff:ffff:ffff:ffff:ffff,CH +2a00:11c0:5:8000::,2a00:11c0:5:ffff:ffff:ffff:ffff:ffff,AT +2a00:11c0:6::,2a00:11c0:6:7fff:ffff:ffff:ffff:ffff,JP +2a00:11c0:6:8000::,2a00:11c0:7:ffff:ffff:ffff:ffff:ffff,AT +2a00:11c0:8::,2a00:11c0:8:ffff:ffff:ffff:ffff:ffff,GB +2a00:11c0:9::,2a00:11c0:9:7fff:ffff:ffff:ffff:ffff,IE +2a00:11c0:9:8000::,2a00:11c0:a:ffff:ffff:ffff:ffff:ffff,AT +2a00:11c0:b::,2a00:11c0:b:ffff:ffff:ffff:ffff:ffff,IT +2a00:11c0:c::,2a00:11c0:d:ffff:ffff:ffff:ffff:ffff,AT +2a00:11c0:e::,2a00:11c0:e:7fff:ffff:ffff:ffff:ffff,DE +2a00:11c0:e:8000::,2a00:11c0:1f:ffff:ffff:ffff:ffff:ffff,AT +2a00:11c0:20::,2a00:11c0:20:7fff:ffff:ffff:ffff:ffff,US +2a00:11c0:20:8000::,2a00:11c0:33:ffff:ffff:ffff:ffff:ffff,AT +2a00:11c0:34::,2a00:11c0:34:7fff:ffff:ffff:ffff:ffff,SG +2a00:11c0:34:8000::,2a00:11c0:62:ffff:ffff:ffff:ffff:ffff,AT +2a00:11c0:63::,2a00:11c0:63:ffff:ffff:ffff:ffff:ffff,NL +2a00:11c0:64::,2a00:11c0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:11c8::,2a00:11c8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:11d0::,2a00:11d0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:11d8::,2a00:11d8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:11e0::,2a00:11e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:11e8::,2a00:11ef:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:11f0::,2a00:11f0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:11f8::,2a00:11f8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1200::,2a00:1200:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1208::,2a00:1208:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1210::,2a00:1210:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1218::,2a00:1218:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a00:1220::,2a00:1220:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1228::,2a00:1228:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1230::,2a00:1237:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1238::,2a00:1238:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:1240::,2a00:1240:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1248::,2a00:1248:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1258::,2a00:1258:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:1260::,2a00:1260:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1268::,2a00:1268:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:1278::,2a00:1278:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1280::,2a00:1280:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1288::,2a00:1288:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1290::,2a00:1290:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1298::,2a00:1298:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:12a0::,2a00:12a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:12a8::,2a00:12af:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:12b0::,2a00:12b0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:12c0::,2a00:12c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:12c8::,2a00:12c8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:12d0::,2a00:12df:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:12e0::,2a00:12e0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:12e8::,2a00:12e8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:12f0::,2a00:12f0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:12f8::,2a00:12f8:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a00:1300::,2a00:1300:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1308::,2a00:1308:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1318::,2a00:1318:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1320::,2a00:1327:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1328::,2a00:1328:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1338::,2a00:1338:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1340::,2a00:1340:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1348::,2a00:1348:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1350::,2a00:1350:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1358::,2a00:1358:d019:ffff:ffff:ffff:ffff:ffff,GR +2a00:1358:d01a::,2a00:1358:d01a:7fff:ffff:ffff:ffff:ffff,CY +2a00:1358:d01a:8000::,2a00:1358:e03d:ffff:ffff:ffff:ffff:ffff,GR +2a00:1358:e03e::,2a00:1358:e03e:7fff:ffff:ffff:ffff:ffff,CY +2a00:1358:e03e:8000::,2a00:1358:e07b:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e07b:8000::,2a00:1358:e07b:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e07c::,2a00:1358:e0fb:ffff:ffff:ffff:ffff:ffff,GR +2a00:1358:e0fc::,2a00:1358:e0fc:7fff:ffff:ffff:ffff:ffff,CY +2a00:1358:e0fc:8000::,2a00:1358:e10d:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e10d:8000::,2a00:1358:e10d:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e10e::,2a00:1358:e122:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e122:8000::,2a00:1358:e122:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e123::,2a00:1358:e123:ffff:ffff:ffff:ffff:ffff,GR +2a00:1358:e124::,2a00:1358:e124:7fff:ffff:ffff:ffff:ffff,CY +2a00:1358:e124:8000::,2a00:1358:e13f:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e13f:8000::,2a00:1358:e13f:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e140::,2a00:1358:e140:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e140:8000::,2a00:1358:e140:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e141::,2a00:1358:e149:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e149:8000::,2a00:1358:e149:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e14a::,2a00:1358:e150:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e150:8000::,2a00:1358:e150:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e151::,2a00:1358:e158:ffff:ffff:ffff:ffff:ffff,GR +2a00:1358:e159::,2a00:1358:e159:7fff:ffff:ffff:ffff:ffff,CY +2a00:1358:e159:8000::,2a00:1358:e15e:ffff:ffff:ffff:ffff:ffff,GR +2a00:1358:e15f::,2a00:1358:e15f:7fff:ffff:ffff:ffff:ffff,CY +2a00:1358:e15f:8000::,2a00:1358:e167:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e167:8000::,2a00:1358:e167:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e168::,2a00:1358:e17f:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e17f:8000::,2a00:1358:e17f:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e180::,2a00:1358:e186:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e186:8000::,2a00:1358:e186:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e187::,2a00:1358:e198:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e198:8000::,2a00:1358:e198:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e199::,2a00:1358:e19a:ffff:ffff:ffff:ffff:ffff,GR +2a00:1358:e19b::,2a00:1358:e19b:7fff:ffff:ffff:ffff:ffff,CY +2a00:1358:e19b:8000::,2a00:1358:e1b8:ffff:ffff:ffff:ffff:ffff,GR +2a00:1358:e1b9::,2a00:1358:e1b9:7fff:ffff:ffff:ffff:ffff,CY +2a00:1358:e1b9:8000::,2a00:1358:e1f3:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e1f3:8000::,2a00:1358:e1f3:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e1f4::,2a00:1358:e1f5:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e1f5:8000::,2a00:1358:e1f5:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e1f6::,2a00:1358:e1f8:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e1f8:8000::,2a00:1358:e1f8:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e1f9::,2a00:1358:e204:ffff:ffff:ffff:ffff:ffff,GR +2a00:1358:e205::,2a00:1358:e205:7fff:ffff:ffff:ffff:ffff,CY +2a00:1358:e205:8000::,2a00:1358:e263:7fff:ffff:ffff:ffff:ffff,GR +2a00:1358:e263:8000::,2a00:1358:e263:ffff:ffff:ffff:ffff:ffff,CY +2a00:1358:e264::,2a00:135b:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a00:1360::,2a00:1360:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1368::,2a00:1368:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:1370::,2a00:1370:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1378::,2a00:1378:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1388::,2a00:1388:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1390::,2a00:1390:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1398::,2a00:139f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:13a0::,2a00:13a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:13a8::,2a00:13a8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:13b0::,2a00:13b0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:13b8::,2a00:13b8:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a00:13c0::,2a00:13c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:13c8::,2a00:13c8:2:ffff:ffff:ffff:ffff:ffff,DE +2a00:13c8:3::,2a00:13c8:3:ffff:ffff:ffff:ffff:ffff,CH +2a00:13c8:4::,2a00:13c8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:13d0::,2a00:13d0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:13d8::,2a00:13df:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:13e0::,2a00:13e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:13e8::,2a00:13e8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:13f0::,2a00:13f0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:13f8::,2a00:13ff:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1400::,2a00:1400:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1408::,2a00:1408:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1410::,2a00:1410:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1418::,2a00:1418:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1420::,2a00:1420:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:1428::,2a00:1428:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a00:1430::,2a00:1430:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1440::,2a00:1440:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1448::,2a00:144f:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:1450::,2a00:1450:400b:ffff:ffff:ffff:ffff:ffff,IE +2a00:1450:400c::,2a00:1450:400c:ffff:ffff:ffff:ffff:ffff,BE +2a00:1450:400d::,2a00:1450:400f:ffff:ffff:ffff:ffff:ffff,IE +2a00:1450:4010::,2a00:1450:4010:ffff:ffff:ffff:ffff:ffff,FI +2a00:1450:4011::,2a00:1450:4012:ffff:ffff:ffff:ffff:ffff,IE +2a00:1450:4013::,2a00:1450:4013:ffff:ffff:ffff:ffff:ffff,NL +2a00:1450:4014::,2a00:1457:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:1458::,2a00:1458:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:1468::,2a00:1468:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1470::,2a00:1470:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1478::,2a00:147f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1480::,2a00:1480:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a00:1488::,2a00:1488:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1490::,2a00:1490:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1498::,2a00:1498:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:14a0::,2a00:14a7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:14a8::,2a00:14a8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:14b0::,2a00:14b7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:14b8::,2a00:14b8:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:14c0::,2a00:14c0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:14c8::,2a00:14c8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:14d0::,2a00:14d0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:14d8::,2a00:14df:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:14e0::,2a00:14e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:14e8::,2a00:14ef:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:14f0::,2a00:14f0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:14f8::,2a00:14f8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1500::,2a00:1507:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a00:1508::,2a00:1508:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:1510::,2a00:1510:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1518::,2a00:1518:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1520::,2a00:1520:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1528::,2a00:1528:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:1538::,2a00:1538:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1540::,2a00:1540:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1548::,2a00:1548:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1550::,2a00:1550:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1558::,2a00:1558:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1560::,2a00:1560:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:1568::,2a00:1568:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:1570::,2a00:1570:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:1578::,2a00:1578:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1580::,2a00:1587:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a00:1588::,2a00:1588:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1590::,2a00:1590:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a00:1598::,2a00:159f:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:15a0::,2a00:15a0:f:ffff:ffff:ffff:ffff:ffff,NO +2a00:15a0:10::,2a00:15a0:10:7fff:ffff:ffff:ffff:ffff,SE +2a00:15a0:10:8000::,2a00:15a0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:15a8::,2a00:15a8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:15b0::,2a00:15b0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:15b8::,2a00:15b8:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:15c0::,2a00:15c0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:15c8::,2a00:15c8:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:15d0::,2a00:15d0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:15e0::,2a00:15e8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:15f0::,2a00:15f0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:15f8::,2a00:15f8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1600::,2a00:1607:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:1610::,2a00:161f:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1620::,2a00:1620:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1628::,2a00:1628:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1630::,2a00:1637:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1638::,2a00:1638:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1640::,2a00:1640:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1650::,2a00:1657:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a00:1660::,2a00:1660:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:1668::,2a00:1668:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1670::,2a00:1670:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1678::,2a00:1678:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1680::,2a00:1680:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1688::,2a00:1688:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1690::,2a00:1690:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1698::,2a00:1698:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:16a0::,2a00:16a0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:16a8::,2a00:16a8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:16b0::,2a00:16b0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:16c8::,2a00:16c8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:16d0::,2a00:16d0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:16d8::,2a00:16d8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:16e0::,2a00:16e0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a00:16e8::,2a00:16e8:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a00:16f8::,2a00:16f8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1700::,2a00:1700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1708::,2a00:1708:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1718::,2a00:1718:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1720::,2a00:1720:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1728::,2a00:172f:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:1730::,2a00:1730:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1748::,2a00:1748:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1750::,2a00:1750:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1758::,2a00:1758:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:1760::,2a00:1767:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a00:1768::,2a00:176f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1778::,2a00:1778:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:1780::,2a00:1780:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a00:1788::,2a00:1788:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1790::,2a00:1790:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:1798::,2a00:1798:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:17a0::,2a00:17a0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:17a8::,2a00:17a8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:17b0::,2a00:17b0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:17b8::,2a00:17bf:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:17c0::,2a00:17c0:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a00:17c8::,2a00:17d0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:17d8::,2a00:17df:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:17e0::,2a00:17e0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:17e8::,2a00:17ef:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:17f0::,2a00:17f7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:17f8::,2a00:17f8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1800::,2a00:1800:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:1808::,2a00:1808:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:1810::,2a00:1810:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a00:1818::,2a00:1818:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1828::,2a00:1828:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1830::,2a00:1830:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1838::,2a00:1838:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1840::,2a00:1840:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:1848::,2a00:1848:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1850::,2a00:1857:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a00:1858::,2a00:1858:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a00:1860::,2a00:1860:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1868::,2a00:1868:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:1878::,2a00:1878:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:1880::,2a00:1880:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:1888::,2a00:1888:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1890::,2a00:1897:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1898::,2a00:189f:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:18a0::,2a00:18a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:18a8::,2a00:18a8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:18b0::,2a00:18b0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:18b8::,2a00:18b8:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:18c0::,2a00:18c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:18c8::,2a00:18c8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:18d0::,2a00:18d0:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a00:18d8::,2a00:18d8:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a00:18e0::,2a00:18e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:18e8::,2a00:18ef:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a00:18f0::,2a00:18f0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:18f8::,2a00:18f8:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:1900::,2a00:1900:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1908::,2a00:1908:a0:ffff:ffff:ffff:ffff:ffff,UA +2a00:1908:a1::,2a00:1908:a1:7fff:ffff:ffff:ffff:ffff,DE +2a00:1908:a1:8000::,2a00:190f:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1910::,2a00:1917:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1918::,2a00:191f:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:1920::,2a00:1928:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1930::,2a00:1930:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1938::,2a00:1938:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1940::,2a00:1940:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1948::,2a00:1948:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1950::,2a00:1950:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1958::,2a00:1958:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1960::,2a00:1960:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1968::,2a00:196f:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1970::,2a00:1970:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1978::,2a00:1978:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1980::,2a00:1987:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1988::,2a00:1988:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1990::,2a00:1990:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1998::,2a00:1998:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:19a0::,2a00:19a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:19a8::,2a00:19a8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:19b0::,2a00:19b0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:19b8::,2a00:19b8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:19c0::,2a00:19c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:19c8::,2a00:19c8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:19d0::,2a00:19d7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:19d8::,2a00:19d8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:19e0::,2a00:19e7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:19e8::,2a00:19e8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:19f0::,2a00:19f0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:19f8::,2a00:19f8:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:1a00::,2a00:1a00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1a08::,2a00:1a08:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a00:1a10::,2a00:1a17:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1a18::,2a00:1a1f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1a20::,2a00:1a27:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:1a28::,2a00:1a28:200f:ffff:ffff:ffff:ffff:ffff,SE +2a00:1a28:2010::,2a00:1a28:2010:7fff:ffff:ffff:ffff:ffff,NO +2a00:1a28:2010:8000::,2a00:1a28:23ff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1a28:2400::,2a00:1a28:24ff:ffff:ffff:ffff:ffff:ffff,FI +2a00:1a28:2500::,2a00:1a28:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1a30::,2a00:1a30:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1a38::,2a00:1a38:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1a40::,2a00:1a40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1a48::,2a00:1a48:7803:107:65bb:ffff:ffff:ffff,GB +2a00:1a48:7803:107:65bc::,2a00:1a48:7803:107:65bc:ffff:ffff:ffff,DE +2a00:1a48:7803:107:65bd::,2a00:1a48:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1a50::,2a00:1a50:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1a58::,2a00:1a58:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:1a60::,2a00:1a60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1a68::,2a00:1a68:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1a70::,2a00:1a70:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1a78::,2a00:1a78:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1a80::,2a00:1a80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1a88::,2a00:1a88:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:1a90::,2a00:1a90:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1a98::,2a00:1a98:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a00:1aa0::,2a00:1aa0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1aa8::,2a00:1aaf:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:1ab0::,2a00:1ab0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1ab8::,2a00:1ab8:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:1ac0::,2a00:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1ac8::,2a00:1ac8:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1ad0::,2a00:1ad0:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a00:1ad8::,2a00:1ad8:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:1ae0::,2a00:1ae0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1ae8::,2a00:1ae8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1af0::,2a00:1af7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:1af8::,2a00:1af8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1b00::,2a00:1b00:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a00:1b08::,2a00:1b08:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1b10::,2a00:1b17:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1b18::,2a00:1b18:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:1b20::,2a00:1b20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1b28::,2a00:1b28:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1b30::,2a00:1b30:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1b38::,2a00:1b38:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1b40::,2a00:1b40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1b48::,2a00:1b48:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1b50::,2a00:1b50:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1b58::,2a00:1b58:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1b60::,2a00:1b60:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1b68::,2a00:1b68:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1b70::,2a00:1b70:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:1b78::,2a00:1b78:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1b80::,2a00:1b87:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a00:1b88::,2a00:1b88:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1b90::,2a00:1b90:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:1b98::,2a00:1b98:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1ba0::,2a00:1ba0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1ba8::,2a00:1ba8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1bb0::,2a00:1bb0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1bb8::,2a00:1bb8:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a00:1bc0::,2a00:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1bc8::,2a00:1bc8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1bd0::,2a00:1bd0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1bd8::,2a00:1bd8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1be0::,2a00:1be0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1be8::,2a00:1bef:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1bf0::,2a00:1bf0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1bf8::,2a00:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1c00::,2a00:1c00:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1c08::,2a00:1c08:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1c10::,2a00:1c10:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1c18::,2a00:1c1f:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1c20::,2a00:1c20:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1c28::,2a00:1c28:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1c30::,2a00:1c30:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:1c38::,2a00:1c3f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1c40::,2a00:1c40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1c48::,2a00:1c49:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1c50::,2a00:1c50:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1c58::,2a00:1c58:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1c60::,2a00:1c60:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a00:1c68::,2a00:1c68:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1c70::,2a00:1c70:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1c78::,2a00:1c7f:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1c80::,2a00:1c87:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:1c88::,2a00:1c88:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1c90::,2a00:1c90:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1c98::,2a00:1c98:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:1ca0::,2a00:1ca0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1ca8::,2a00:1ca8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1cb0::,2a00:1cb0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1cb8::,2a00:1cb8:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a00:1cc0::,2a00:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a00:1cc8::,2a00:1cc8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1cd0::,2a00:1cd0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1cd8::,2a00:1cdf:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1ce0::,2a00:1ce0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:1ce8::,2a00:1ce8:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1cf0::,2a00:1cf0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:1cf8::,2a00:1cff:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:1d00::,2a00:1d00:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1d08::,2a00:1d08:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1d10::,2a00:1d10:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a00:1d18::,2a00:1d18:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1d20::,2a00:1d27:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1d28::,2a00:1d28:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1d30::,2a00:1d37:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:1d38::,2a00:1d38:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1d40::,2a00:1d40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1d48::,2a00:1d48:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1d50::,2a00:1d50:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:1d58::,2a00:1d58:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:1d60::,2a00:1d60:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1d68::,2a00:1d68:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1d70::,2a00:1d70:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:1d78::,2a00:1d78:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1d80::,2a00:1d80:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1d88::,2a00:1d88:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1d90::,2a00:1d90:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1da0::,2a00:1da0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1da8::,2a00:1da8:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:1db0::,2a00:1db0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1db8::,2a00:1db8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1dc0::,2a00:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a00:1dc8::,2a00:1dc8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1dd0::,2a00:1dd0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:1dd8::,2a00:1ddf:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:1de0::,2a00:1de0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1de8::,2a00:1de8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1df0::,2a00:1df0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1df8::,2a00:1df8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1e00::,2a00:1e00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1e08::,2a00:1e08:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:1e10::,2a00:1e10:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1e18::,2a00:1e1f:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1e20::,2a00:1e27:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1e28::,2a00:1e28:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1e30::,2a00:1e30:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1e38::,2a00:1e38:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1e40::,2a00:1e40:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:1e48::,2a00:1e48:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1e50::,2a00:1e50:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1e58::,2a00:1e58:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:1e60::,2a00:1e60:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:1e68::,2a00:1e6f:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1e70::,2a00:1e70:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1e78::,2a00:1e78:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1e80::,2a00:1e80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1e88::,2a00:1e88:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1e90::,2a00:1e90:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:1e98::,2a00:1e9f:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:1ea0::,2a00:1ea0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1ea8::,2a00:1ea8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1eb0::,2a00:1eb0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:1eb8::,2a00:1eb8:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a00:1ec0::,2a00:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a00:1ec8::,2a00:1ecf:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1ed0::,2a00:1ed0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:1ed8::,2a00:1edf:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:1ee0::,2a00:1ee0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1ee8::,2a00:1ee8:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a00:1ef8::,2a00:1eff:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:1f00::,2a00:1f00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1f08::,2a00:1f08:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1f10::,2a00:1f10:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1f18::,2a00:1f1f:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1f20::,2a00:1f20:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:1f28::,2a00:1f28:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a00:1f30::,2a00:1f37:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1f38::,2a00:1f38:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1f40::,2a00:1f47:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:1f48::,2a00:1f4f:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:1f50::,2a00:1f50:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:1f58::,2a00:1f5f:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1f60::,2a00:1f67:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1f68::,2a00:1f68:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a00:1f70::,2a00:1f70:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1f78::,2a00:1f7f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1f80::,2a00:1f80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:1f88::,2a00:1f88:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1f90::,2a00:1f90:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:1f98::,2a00:1f98:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:1fa0::,2a00:1fa7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1fa8::,2a00:1fa8:ffff:ffff:ffff:ffff:ffff:ffff,GL +2a00:1fb0::,2a00:1fb7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1fb8::,2a00:1fb8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:1fc0::,2a00:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1fd0::,2a00:1fd0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:1fd8::,2a00:1fd8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1fe0::,2a00:1fe0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:1fe8::,2a00:1fe8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1ff0::,2a00:1ff0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1ff8::,2a00:1ff8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:2000::,2a00:23c0:3cb3:7fff:ffff:ffff:ffff:ffff,GB +2a00:23c0:3cb3:8000::,2a00:23c0:3cb3:ffff:ffff:ffff:ffff:ffff,US +2a00:23c0:3cb4::,2a00:23c3:49e9:ffff:ffff:ffff:ffff:ffff,GB +2a00:23c3:49ea::,2a00:23c3:49ea:7fff:ffff:ffff:ffff:ffff,CZ +2a00:23c3:49ea:8000::,2a00:23c3:6956:7fff:ffff:ffff:ffff:ffff,GB +2a00:23c3:6956:8000::,2a00:23c3:6956:ffff:ffff:ffff:ffff:ffff,DE +2a00:23c3:6957::,2a00:23c4:5a1a:ffff:ffff:ffff:ffff:ffff,GB +2a00:23c4:5a1b::,2a00:23c4:5a1b:7fff:ffff:ffff:ffff:ffff,US +2a00:23c4:5a1b:8000::,2a00:23c5:754:ffff:ffff:ffff:ffff:ffff,GB +2a00:23c5:755::,2a00:23c5:755:7fff:ffff:ffff:ffff:ffff,US +2a00:23c5:755:8000::,2a00:23c5:ca6:ffff:ffff:ffff:ffff:ffff,GB +2a00:23c5:ca7::,2a00:23c5:ca7:3fff:ffff:ffff:ffff:ffff,NO +2a00:23c5:ca7:4000::,2a00:23c5:68c3:7fff:ffff:ffff:ffff:ffff,GB +2a00:23c5:68c3:8000::,2a00:23c5:68c3:ffff:ffff:ffff:ffff:ffff,MY +2a00:23c5:68c4::,2a00:23ff:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4000::,2a00:4000:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:4020::,2a00:4020:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:4040::,2a00:4040:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:4060::,2a00:4067:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:4080::,2a00:4087:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a00:40a0::,2a00:40a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:40c0::,2a00:40c0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:40e0::,2a00:40e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:4100::,2a00:4100:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:4120::,2a00:4120:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:4140::,2a00:4147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:4160::,2a00:4160:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:4180::,2a00:4180:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a00:41a0::,2a00:41a0:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a00:41c0::,2a00:41c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:41e0::,2a00:41e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:4200::,2a00:4200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4220::,2a00:4220:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:4240::,2a00:4240:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4260::,2a00:4260:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:4280::,2a00:4280:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:42a0::,2a00:42a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:42c0::,2a00:42c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:42e0::,2a00:42e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:4300::,2a00:4300:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4320::,2a00:4320:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:4340::,2a00:4340:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4360::,2a00:4360:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a00:4380::,2a00:4387:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:43a0::,2a00:43a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:43c0::,2a00:43c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:43e0::,2a00:43e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:4400::,2a00:4400:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:4420::,2a00:4420:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4440::,2a00:4440:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:4460::,2a00:4460:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:4480::,2a00:4480:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:44a0::,2a00:44a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:44c0::,2a00:44c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:44e0::,2a00:44e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4500::,2a00:4500:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4520::,2a00:4527:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a00:4540::,2a00:4540:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:4560::,2a00:4560:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:4580::,2a00:4580:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:45a0::,2a00:45a0:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a00:45c0::,2a00:45c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:45e0::,2a00:45e7:ffff:ffff:ffff:ffff:ffff:ffff,IM +2a00:4600::,2a00:4600:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4620::,2a00:4620:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a00:4640::,2a00:4647:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:4660::,2a00:4660:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:4680::,2a00:4680:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:46a0::,2a00:46a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:46c0::,2a00:46c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:46e0::,2a00:46e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4700::,2a00:4700:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:4720::,2a00:4720:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:4740::,2a00:4740:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:4760::,2a00:4760:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:4780::,2a00:4780:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:47a0::,2a00:47a0:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a00:47c0::,2a00:47c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:47e0::,2a00:47e0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:4800::,2a00:4807:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:4820::,2a00:4820:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:4840::,2a00:4847:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:4860::,2a00:4860:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4880::,2a00:4880:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:48a0::,2a00:48a0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:48c0::,2a00:48c0:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a00:48e0::,2a00:48e0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:4900::,2a00:4900:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4920::,2a00:4920:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:4940::,2a00:4940:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a00:4960::,2a00:4960:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:4980::,2a00:4987:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:49c0::,2a00:49c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:49e0::,2a00:49e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4a00::,2a00:4a00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4a20::,2a00:4a20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:4a40::,2a00:4a40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:4a60::,2a00:4a60:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a00:4a80::,2a00:4a80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4aa0::,2a00:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4ac0::,2a00:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:4ae0::,2a00:4ae7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4b00::,2a00:4b00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:4b20::,2a00:4b20:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:4b40::,2a00:4b40:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:4b60::,2a00:4b60:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a00:4b80::,2a00:4b80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:4ba0::,2a00:4ba0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:4bc0::,2a00:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:4be0::,2a00:4be0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:4c00::,2a00:4c00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4c20::,2a00:4c20:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a00:4c40::,2a00:4c40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:4c60::,2a00:4c60:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:4c80::,2a00:4c87:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a00:4ca0::,2a00:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:4cc0::,2a00:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:4ce0::,2a00:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4d00::,2a00:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:4d20::,2a00:4d20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4d40::,2a00:4d40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4d60::,2a00:4d60:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:4d80::,2a00:4d80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:4da0::,2a00:4da0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4dc0::,2a00:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:4de0::,2a00:4de7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:4e00::,2a00:4e00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:4e20::,2a00:4e20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:4e40::,2a00:4e40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:4e60::,2a00:4e60:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:4e80::,2a00:4e80:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a00:4ea0::,2a00:4ea0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:4ec0::,2a00:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:4ee0::,2a00:4ee0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4f00::,2a00:4f00:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:4f20::,2a00:4f20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:4f40::,2a00:4f40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:4f60::,2a00:4f60:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:4f80::,2a00:4f80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:4fa0::,2a00:4fa7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:4fc0::,2a00:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:4fe0::,2a00:4fe0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:5000::,2a00:5007:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:5020::,2a00:5020:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:5060::,2a00:5060:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:5080::,2a00:5080:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:50a0::,2a00:50a0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:50c0::,2a00:50c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:50e0::,2a00:50e7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a00:5100::,2a00:5100:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:5120::,2a00:5120:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:5140::,2a00:5140:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:5160::,2a00:5160:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:5180::,2a00:5180:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:51a0::,2a00:51a0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:51c0::,2a00:51c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:51e0::,2a00:51e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:5200::,2a00:5200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:5220::,2a00:5220:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:5240::,2a00:5240:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:5260::,2a00:5260:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:5280::,2a00:5280:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:52a0::,2a00:52a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:52c0::,2a00:52c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:52e0::,2a00:52e0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:5300::,2a00:5300:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5320::,2a00:5320:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:5340::,2a00:5340:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:5360::,2a00:5360:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:5380::,2a00:5380:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:53a0::,2a00:53a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:53c0::,2a00:53c0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:5400::,2a00:5400:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:5420::,2a00:5420:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:5440::,2a00:5440:ffff:ffff:ffff:ffff:ffff:ffff,US +2a00:5480::,2a00:5487:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:54a0::,2a00:54a0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:54c0::,2a00:54c0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:54e0::,2a00:54e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:5500::,2a00:5500::7fff:ffff:ffff:ffff:ffff,AX +2a00:5500:0:8000::,2a00:5500:1:ffff:ffff:ffff:ffff:ffff,FI +2a00:5500:2::,2a00:5500:2:7fff:ffff:ffff:ffff:ffff,AX +2a00:5500:2:8000::,2a00:5500:1fff:ffff:ffff:ffff:ffff:ffff,FI +2a00:5500:2000::,2a00:5500:2000:7fff:ffff:ffff:ffff:ffff,AX +2a00:5500:2000:8000::,2a00:5500:80f1:7fff:ffff:ffff:ffff:ffff,FI +2a00:5500:80f1:8000::,2a00:5500:80f1:ffff:ffff:ffff:ffff:ffff,AX +2a00:5500:80f2::,2a00:5500:80f3:ffff:ffff:ffff:ffff:ffff,FI +2a00:5500:80f4::,2a00:5500:80f4:ffff:ffff:ffff:ffff:ffff,AX +2a00:5500:80f5::,2a00:5500:80f5:ffff:ffff:ffff:ffff:ffff,FI +2a00:5500:80f6::,2a00:5500:80f6:7fff:ffff:ffff:ffff:ffff,AX +2a00:5500:80f6:8000::,2a00:5500:80f6:ffff:ffff:ffff:ffff:ffff,FI +2a00:5500:80f7::,2a00:5500:80f7:7fff:ffff:ffff:ffff:ffff,AX +2a00:5500:80f7:8000::,2a00:5500:80f7:ffff:ffff:ffff:ffff:ffff,FI +2a00:5500:80f8::,2a00:5500:80fa:7fff:ffff:ffff:ffff:ffff,AX +2a00:5500:80fa:8000::,2a00:5500:80fa:ffff:ffff:ffff:ffff:ffff,FI +2a00:5500:80fb::,2a00:5500:80fe:ffff:ffff:ffff:ffff:ffff,AX +2a00:5500:80ff::,2a00:5500:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:5520::,2a00:5520:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:5540::,2a00:5540:385:ffff:ffff:ffff:ffff:ffff,GB +2a00:5540:386::,2a00:5540:387:ffff:ffff:ffff:ffff:ffff,SI +2a00:5540:388::,2a00:5540:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:5560::,2a00:5560:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5580::,2a00:5580:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:55a0::,2a00:55a0:e9ff:ffff:ffff:ffff:ffff:ffff,IL +2a00:55a0:ea00::,2a00:55a0:eaff:ffff:ffff:ffff:ffff:ffff,GB +2a00:55a0:eb00::,2a00:55a0:efff:ffff:ffff:ffff:ffff:ffff,IL +2a00:55a0:f000::,2a00:55a0:f0ff:ffff:ffff:ffff:ffff:ffff,GB +2a00:55a0:f100::,2a00:55a0:f8ff:ffff:ffff:ffff:ffff:ffff,IL +2a00:55a0:f900::,2a00:55a0:f9ff:ffff:ffff:ffff:ffff:ffff,GB +2a00:55a0:fa00::,2a00:55a0:feff:ffff:ffff:ffff:ffff:ffff,IL +2a00:55a0:ff00::,2a00:55a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:55c0::,2a00:55c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:55e0::,2a00:55e0:ffff:ffff:ffff:ffff:ffff:ffff,SM +2a00:5600::,2a00:5600:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:5620::,2a00:5620:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:5640::,2a00:5647:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5680::,2a00:5680:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:56a0::,2a00:56a0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:56c0::,2a00:56c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:56e0::,2a00:56e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:5700::,2a00:5700:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a00:5720::,2a00:5720:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:5740::,2a00:5740:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:5760::,2a00:5760:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:5780::,2a00:5780:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:57a0::,2a00:57a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:57e0::,2a00:57e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:5800::,2a00:5800:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:5820::,2a00:5820:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:5840::,2a00:5840:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:5860::,2a00:5860:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:5880::,2a00:5887:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:58c0::,2a00:58c0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:58e0::,2a00:58e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:5900::,2a00:5900:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:5920::,2a00:5920:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:5940::,2a00:5940:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:5960::,2a00:5960:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:5980::,2a00:5980:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a00:59a0::,2a00:59a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:59c0::,2a00:59c0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:59e0::,2a00:59e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5a00::,2a00:5a00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:5a20::,2a00:5a20:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:5a40::,2a00:5a40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:5a60::,2a00:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:5a80::,2a00:5a80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5aa0::,2a00:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:5ac0::,2a00:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:5ae0::,2a00:5ae0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:5b00::,2a00:5b07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:5b20::,2a00:5b20:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:5b40::,2a00:5b40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:5b60::,2a00:5b60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:5b80::,2a00:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:5ba0::,2a00:5ba7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5bc0::,2a00:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:5be0::,2a00:5be0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:5c00::,2a00:5c00:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:5c20::,2a00:5c20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:5c40::,2a00:5c47:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a00:5c60::,2a00:5c60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5c80::,2a00:5c80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:5ca0::,2a00:5ca0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:5cc0::,2a00:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:5ce0::,2a00:5ce0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:5d00::,2a00:5d00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:5d20::,2a00:5d20:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:5d40::,2a00:5d40:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:5d60::,2a00:5d60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:5d80::,2a00:5d80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:5da0::,2a00:5da0:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a00:5dc0::,2a00:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a00:5de0::,2a00:5de0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:5e00::,2a00:5e00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5e40::,2a00:5e40:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:5e60::,2a00:5e60:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a00:5e80::,2a00:5e80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:5ea0::,2a00:5ea7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:5ec0::,2a00:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:5ee0::,2a00:5ee0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:5f00::,2a00:5f00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:5f20::,2a00:5f20:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:5f40::,2a00:5f47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5f80::,2a00:5f80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5fa0::,2a00:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:5fc0::,2a00:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5fe0::,2a00:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:6000::,2a00:6000:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:6020::,2a00:6020:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6040::,2a00:6040:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:6060::,2a00:6060:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:6080::,2a00:6080:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:60a0::,2a00:60a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:60c0::,2a00:60c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:60e0::,2a00:60e0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:6100::,2a00:6100:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6120::,2a00:6120:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:6140::,2a00:6140:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6160::,2a00:6160:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6180::,2a00:6187:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:61a0::,2a00:61a7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:61c0::,2a00:61c7:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:61e0::,2a00:61e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6200::,2a00:6207:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:6220::,2a00:6220:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:6240::,2a00:6240:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:6260::,2a00:6260:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:6280::,2a00:6280:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:62a0::,2a00:62a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:62c0::,2a00:62c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:62e0::,2a00:62e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6300::,2a00:6300:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6320::,2a00:6320:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:6340::,2a00:6340:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:6360::,2a00:6360:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6380::,2a00:6380:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:63a0::,2a00:63a0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:63c0::,2a00:63c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:63e0::,2a00:63e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:6400::,2a00:6400:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6420::,2a00:6420:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:6440::,2a00:6440:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a00:6460::,2a00:6460:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:6480::,2a00:6480:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:64a0::,2a00:64a0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:64c0::,2a00:64c0:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a00:64e0::,2a00:64e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:6500::,2a00:6507:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:6520::,2a00:6520:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:6540::,2a00:6540:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:6560::,2a00:6560:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6580::,2a00:6580:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:65a0::,2a00:65a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:65c0::,2a00:65c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:65e0::,2a00:65e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:6600::,2a00:6600:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a00:6620::,2a00:6620:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a00:6640::,2a00:6647:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:6660::,2a00:6660:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:6680::,2a00:6680:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:66a0::,2a00:66a0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a00:66c0::,2a00:66c0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:66e0::,2a00:66e0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:6700::,2a00:6700:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6720::,2a00:6720:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6740::,2a00:6740:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:6760::,2a00:6760:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:6780::,2a00:6780:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:67a0::,2a00:67a7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:67c0::,2a00:67c0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:67e0::,2a00:67e7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6800::,2a00:6800:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6820::,2a00:6820:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:6860::,2a00:6867:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:6880::,2a00:6880:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a00:68a0::,2a00:68a0:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a00:68c0::,2a00:68c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:68e0::,2a00:68e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:6900::,2a00:6907:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:6920::,2a00:6920:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a00:6940::,2a00:6940:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:6960::,2a00:6960:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:6980::,2a00:6980:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:69a0::,2a00:69a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:69c0::,2a00:69c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:69e0::,2a00:69e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6a00::,2a00:6a00:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a00:6a20::,2a00:6a20:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:6a40::,2a00:6a40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:6a60::,2a00:6a60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:6a80::,2a00:6a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6ac0::,2a00:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:6ae0::,2a00:6ae0:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a00:6b00::,2a00:6b00:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:6b20::,2a00:6b20:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a00:6b40::,2a00:6b40:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:6b80::,2a00:6b87:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a00:6ba0::,2a00:6ba0:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a00:6bc0::,2a00:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:6be0::,2a00:6be0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6c00::,2a00:6c00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:6c20::,2a00:6c20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:6c40::,2a00:6c40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:6c60::,2a00:6c60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6c80::,2a00:6c80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6cc0::,2a00:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a00:6ce0::,2a00:6ce0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:6d00::,2a00:6d00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6d20::,2a00:6d20:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:6d40::,2a00:6d46:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:6d47::,2a00:6d47:fff:ffff:ffff:ffff:ffff:ffff,PL +2a00:6d47:1000::,2a00:6d47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:6d60::,2a00:6d60:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:6d80::,2a00:6d80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:6da0::,2a00:6da0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:6dc0::,2a00:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:6de0::,2a00:6de0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6e00::,2a00:6e00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6e20::,2a00:6e20:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a00:6e40::,2a00:6e40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:6e60::,2a00:6e60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6e80::,2a00:6e80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:6ea0::,2a00:6ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6ec0::,2a00:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:6ee0::,2a00:6ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6f00::,2a00:6f00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:6f20::,2a00:6f20:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:6f40::,2a00:6f40:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:6f60::,2a00:6f60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:6f80::,2a00:6f80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:6fa0::,2a00:6fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:6fc0::,2a00:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:6fe0::,2a00:6fe0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7000::,2a00:7000:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:7020::,2a00:7020:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:7040::,2a00:7040:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:7060::,2a00:7060:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:7080::,2a00:7080:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:70a0::,2a00:70a0:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a00:70c0::,2a00:70c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:70e0::,2a00:70e0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:7100::,2a00:7100:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:7120::,2a00:7120:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:7140::,2a00:7147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7160::,2a00:7160:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a00:7180::,2a00:7180:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:71a0::,2a00:71a7:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a00:71c0::,2a00:71c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:71e0::,2a00:71e0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:7200::,2a00:7200:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7220::,2a00:7220:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:7240::,2a00:7243:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:7260::,2a00:7267:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7280::,2a00:7280:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:72a0::,2a00:72a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:72c0::,2a00:72c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:72e0::,2a00:72e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7300::,2a00:7300:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:7320::,2a00:7327:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:7340::,2a00:7340:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:7360::,2a00:7360:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:7380::,2a00:7387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:73a0::,2a00:73a0:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:73c0::,2a00:73c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:73e0::,2a00:73e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:7400::,2a00:7400:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:7420::,2a00:7420:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7440::,2a00:7447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:7460::,2a00:7460:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:7480::,2a00:7480:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:74a0::,2a00:74a0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:74c0::,2a00:74c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:74e0::,2a00:74e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:7500::,2a00:7500:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7520::,2a00:7520:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:7540::,2a00:7540:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:7560::,2a00:7560:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:7580::,2a00:7580:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:75c0::,2a00:75c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:75e0::,2a00:75e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:7600::,2a00:7600:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a00:7620::,2a00:7620:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:7640::,2a00:7640:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:7660::,2a00:7667:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:7680::,2a00:7680:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:76a0::,2a00:76a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:76c0::,2a00:76c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:76e0::,2a00:76e0:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a00:7700::,2a00:7700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:7720::,2a00:7720:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:7740::,2a00:7740:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7760::,2a00:7767:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:7780::,2a00:7780:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:77a0::,2a00:77a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:77c0::,2a00:77c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:77e0::,2a00:77e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:7800::,2a00:7800:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:7820::,2a00:7820:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7840::,2a00:7840:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:7860::,2a00:7860:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:7880::,2a00:7880:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a00:78a0::,2a00:78a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:78c0::,2a00:78c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:78e0::,2a00:78e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7900::,2a00:7900:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7920::,2a00:7920:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:7940::,2a00:7940:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7960::,2a00:7960:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:79a0::,2a00:79a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:79c0::,2a00:79c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:79e0::,2a00:79e0::ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:1::,2a00:79e0:1:7fff:ffff:ffff:ffff:ffff,CZ +2a00:79e0:1:8000::,2a00:79e0:2:7fff:ffff:ffff:ffff:ffff,PL +2a00:79e0:2:8000::,2a00:79e0:2:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:3::,2a00:79e0:3:7fff:ffff:ffff:ffff:ffff,IE +2a00:79e0:3:8000::,2a00:79e0:3:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:4::,2a00:79e0:4:7fff:ffff:ffff:ffff:ffff,FI +2a00:79e0:4:8000::,2a00:79e0:5:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:6::,2a00:79e0:6:7fff:ffff:ffff:ffff:ffff,GB +2a00:79e0:6:8000::,2a00:79e0:a:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:b::,2a00:79e0:b:ffff:ffff:ffff:ffff:ffff,IT +2a00:79e0:c::,2a00:79e0:c:7fff:ffff:ffff:ffff:ffff,CH +2a00:79e0:c:8000::,2a00:79e0:c:ffff:ffff:ffff:ffff:ffff,IE +2a00:79e0:d::,2a00:79e0:d:ffff:ffff:ffff:ffff:ffff,GB +2a00:79e0:e::,2a00:79e0:13:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:14::,2a00:79e0:14:ffff:ffff:ffff:ffff:ffff,ZA +2a00:79e0:15::,2a00:79e0:15:ffff:ffff:ffff:ffff:ffff,DE +2a00:79e0:16::,2a00:79e0:17:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:18::,2a00:79e0:18:7fff:ffff:ffff:ffff:ffff,NO +2a00:79e0:18:8000::,2a00:79e0:19:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:1a::,2a00:79e0:1a:7fff:ffff:ffff:ffff:ffff,IE +2a00:79e0:1a:8000::,2a00:79e0:1b:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:1c::,2a00:79e0:1c:ffff:ffff:ffff:ffff:ffff,GH +2a00:79e0:1d::,2a00:79e0:1e:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:1f::,2a00:79e0:1f:ffff:ffff:ffff:ffff:ffff,LT +2a00:79e0:20::,2a00:79e0:22:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:23::,2a00:79e0:23:ffff:ffff:ffff:ffff:ffff,GB +2a00:79e0:24::,2a00:79e0:26:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:27::,2a00:79e0:27:ffff:ffff:ffff:ffff:ffff,NL +2a00:79e0:28::,2a00:79e0:30:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:31::,2a00:79e0:31:ffff:ffff:ffff:ffff:ffff,SK +2a00:79e0:32::,2a00:79e0:3f:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:40::,2a00:79e0:40:7fff:ffff:ffff:ffff:ffff,IE +2a00:79e0:40:8000::,2a00:79e0:ffe2:4ff:ffff:ffff:ffff:ffff,CH +2a00:79e0:ffe2:500::,2a00:79e0:ffe2:5ff:ffff:ffff:ffff:ffff,IE +2a00:79e0:ffe2:600::,2a00:79e1:abb:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e1:abc::,2a00:79e1:abc:ff:ffff:ffff:ffff:ffff,GB +2a00:79e1:abc:100::,2a00:79e1:abc:7fff:ffff:ffff:ffff:ffff,US +2a00:79e1:abc:8000::,2a00:79e1:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:7a00::,2a00:7a00:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:7a20::,2a00:7a20:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:7a40::,2a00:7a40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:7a60::,2a00:7a60:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:7a80::,2a00:7a80:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:7aa0::,2a00:7aa0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7ac0::,2a00:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:7ae0::,2a00:7ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:7b00::,2a00:7b07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:7b40::,2a00:7b40:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:7b60::,2a00:7b60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:7b80::,2a00:7b80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7ba0::,2a00:7ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:7bc0::,2a00:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:7be0::,2a00:7be0:ffff:ffff:ffff:ffff:ffff:ffff,QA +2a00:7c00::,2a00:7c00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:7c20::,2a00:7c20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:7c40::,2a00:7c40:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a00:7c60::,2a00:7c60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7c80::,2a00:7c87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7ca0::,2a00:7ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:7cc0::,2a00:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:7ce0::,2a00:7ce0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:7d00::,2a00:7d00:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:7d20::,2a00:7d20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:7d40::,2a00:7d40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:7d80::,2a00:7d87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:7da0::,2a00:7da0:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a00:7dc0::,2a00:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7de0::,2a00:7de0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7e00::,2a00:7e00:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:7e20::,2a00:7e20:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a00:7e40::,2a00:7e40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7e60::,2a00:7e60:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:7e80::,2a00:7e80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:7ea0::,2a00:7ea0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:7ec0::,2a00:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7ee0::,2a00:7ee0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7f00::,2a00:7f00:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:7f20::,2a00:7f20:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:7f40::,2a00:7f40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:7f60::,2a00:7f60:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a00:7f80::,2a00:7f87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:7fc0::,2a00:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:7fe0::,2a00:7fe0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:8000::,2a00:8000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8020::,2a00:8020:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:8040::,2a00:8040:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:8060::,2a00:8060:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8080::,2a00:8080:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:80a0::,2a00:80a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:80c0::,2a00:80c0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:80e0::,2a00:80e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:8100::,2a00:8100:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:8120::,2a00:8120:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:8140::,2a00:8140:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:8160::,2a00:8160:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:8180::,2a00:8180:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:81a0::,2a00:81a7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:81c0::,2a00:81c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:81e0::,2a00:81e0:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a00:8200::,2a00:8200:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:8220::,2a00:8220:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:8240::,2a00:8247:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:8260::,2a00:8260:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:8280::,2a00:8280:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:82a0::,2a00:82a0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:82c0::,2a00:82c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:82e0::,2a00:82e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:8300::,2a00:8300:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8320::,2a00:8320:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:8340::,2a00:8340:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:8360::,2a00:8360:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:8380::,2a00:8380:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:83a0::,2a00:83a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:83c0::,2a00:83c0:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a00:83e0::,2a00:83e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:8400::,2a00:8400:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:8420::,2a00:8420:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8440::,2a00:8440:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:8460::,2a00:8460:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:8480::,2a00:8480:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a00:84a0::,2a00:84a0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:84c0::,2a00:84c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:84e0::,2a00:84e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:8500::,2a00:8500:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:8520::,2a00:8520:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a00:8540::,2a00:8540:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8580::,2a00:8580:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:85a0::,2a00:85a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:85c0::,2a00:85c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:85e0::,2a00:85e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:8600::,2a00:8600:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:8620::,2a00:8620:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a00:8640::,2a00:8647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:8680::,2a00:8680:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:86a0::,2a00:86a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:86c0::,2a00:86c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:86e0::,2a00:86e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:8700::,2a00:8707:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a00:8720::,2a00:8720:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:8740::,2a00:8740:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:8760::,2a00:8760:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:8780::,2a00:8780:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:87a0::,2a00:87a0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:87c0::,2a00:87c0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:87e0::,2a00:87e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8820::,2a00:8820:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:8840::,2a00:8840:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a00:8860:8007::,2a00:8860:8007:7fff:ffff:ffff:ffff:ffff,NL +2a00:8880::,2a00:8880:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:88a0::,2a00:88a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:88c0::,2a00:88c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:88e0::,2a00:88e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:8900::,2a00:8900:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:8920::,2a00:8920:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:8940::,2a00:8947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8960::,2a00:8960:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:8980::,2a00:8980:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:89a0::,2a00:89a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:89c0::,2a00:89c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:89e0::,2a00:89e0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:8a00::,2a00:8a00:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:8a20::,2a00:8a20:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:8a40::,2a00:8a40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:8a60::,2a00:8a60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:8a80::,2a00:8a87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:8aa0::,2a00:8aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8ac0::,2a00:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a00:8ae0::,2a00:8ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8b00::,2a00:8b00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:8b20::,2a00:8b20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8b40::,2a00:8b40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8b60::,2a00:8b60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:8b80::,2a00:8b80:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:8ba0::,2a00:8ba0:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a00:8be0::,2a00:8be7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:8c00::,2a00:8c00:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a00:8c20::,2a00:8c20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:8c40::,2a00:8c40:242:ffff:ffff:ffff:ffff:ffff,GB +2a00:8c40:243::,2a00:8c40:243:7fff:ffff:ffff:ffff:ffff,FR +2a00:8c40:243:8000::,2a00:8c40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8c60::,2a00:8c60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:8c80::,2a00:8c80:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:8ca0::,2a00:8ca0:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a00:8cc0::,2a00:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:8ce0::,2a00:8ce0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:8d00::,2a00:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:8d20::,2a00:8d20:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a00:8d40::,2a00:8d40:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a00:8d60::,2a00:8d60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:8d80::,2a00:8d80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:8da0::,2a00:8da0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:8dc0::,2a00:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:8de0::,2a00:8de7:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a00:8e00::,2a00:8e00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8e20::,2a00:8e20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:8e40::,2a00:8e40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:8e60::,2a00:8e60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:8e80::,2a00:8e80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:8ea0::,2a00:8ea0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:8ec0::,2a00:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:8ee0::,2a00:8ee7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:8f00::,2a00:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:8f20::,2a00:8f20:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:8f40::,2a00:8f40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8f60::,2a00:8f60:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:8f80::,2a00:8f80:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a00:8fa0::,2a00:8fa0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8fc0::,2a00:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:8fe0::,2a00:8fe0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:9000::,2a00:9000:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a00:9020::,2a00:9027:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:9040::,2a00:9047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9060::,2a00:9060:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:9080::,2a00:9080:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:90a0::,2a00:90a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:90c0::,2a00:90c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:9100::,2a00:9100:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a00:9120::,2a00:9120:ffff:ffff:ffff:ffff:ffff:ffff,OM +2a00:9140::,2a00:9140:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:9160::,2a00:9160:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:9180::,2a00:9180:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:91a0::,2a00:91a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:91c0::,2a00:91c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:91e0::,2a00:91e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:9200::,2a00:9200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:9220::,2a00:9220:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:9240::,2a00:9247:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:9260::,2a00:9267:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:9280::,2a00:9280:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:92a0::,2a00:92a7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:92c0::,2a00:92c7:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:92e0::,2a00:92e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9300::,2a00:9300:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:9320::,2a00:9320:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:9340::,2a00:9347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:9360::,2a00:9360:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:9380::,2a00:9380:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:93a0::,2a00:93a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:93c0::,2a00:93c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:93e0::,2a00:93e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:9400::,2a00:9400:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9420::,2a00:9420:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:9440::,2a00:9440:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:9460::,2a00:9467:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9480::,2a00:9480:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:94a0::,2a00:94a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:94c0::,2a00:94c0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:9500::,2a00:9500:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:9520::,2a00:9520:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:9540::,2a00:9540:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:9560::,2a00:9560:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:9580::,2a00:9580:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:95a0::,2a00:95a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:95c0::,2a00:95c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2a00:95e0::,2a00:95e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9600::,2a00:9600:83ff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9600:8400::,2a00:9600:8400:ffff:ffff:ffff:ffff:ffff,US +2a00:9600:8401::,2a00:9600:840f:ffff:ffff:ffff:ffff:ffff,GB +2a00:9600:8410::,2a00:9600:8410:ffff:ffff:ffff:ffff:ffff,US +2a00:9600:8411::,2a00:9600:860f:ffff:ffff:ffff:ffff:ffff,GB +2a00:9600:8610::,2a00:9600:8610:ffff:ffff:ffff:ffff:ffff,DE +2a00:9600:8611::,2a00:9600:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9620::,2a00:9620:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:9640::,2a00:9640:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:9660::,2a00:9660:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:9680::,2a00:9680:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:96c0::,2a00:96c0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:96e0::,2a00:96e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:9700::,2a00:9700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:9720::,2a00:9720:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:9740::,2a00:9740:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:9760::,2a00:9760:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:9780::,2a00:9780:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:97a0::,2a00:97a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:97c0::,2a00:97c0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:97e0::,2a00:97e0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:9800::,2a00:9807:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:9820::,2a00:9820:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:9840::,2a00:9840:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:9860::,2a00:9860:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a00:9880::,2a00:9880:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:98a0::,2a00:98a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:98c0::,2a00:98c0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:98e0::,2a00:98e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:9900::,2a00:9907:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a00:9920::,2a00:9927:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a00:9960::,2a00:9960:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a00:9980::,2a00:9980:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:99a0::,2a00:99a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:99c0::,2a00:99c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:99e0::,2a00:99e7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:9a20::,2a00:9a20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:9a40::,2a00:9a40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:9a60::,2a00:9a60:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:9a80::,2a00:9a80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9aa0::,2a00:9aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9ac0::,2a00:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:9ae0::,2a00:9ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:9b00::,2a00:9b00:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:9b20::,2a00:9b20:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:9b40::,2a00:9b40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9b60::,2a00:9b60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:9b80::,2a00:9b80:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:9ba0::,2a00:9ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9bc0::,2a00:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:9be0::,2a00:9be0:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a00:9c00::,2a00:9c00:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:9c20::,2a00:9c20:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:9c60::,2a00:9c60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9c80::,2a00:9c80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:9ca0::,2a00:9ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:9cc0::,2a00:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:9ce0::,2a00:9ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9d00::,2a00:9d00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9d20::,2a00:9d20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:9d40::,2a00:9d40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:9d60::,2a00:9d60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9d80::,2a00:9d87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:9da0::,2a00:9da0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9dc0::,2a00:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:9de0::,2a00:9de0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9e00::,2a00:9e07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:9e20::,2a00:9e20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:9e40::,2a00:9e40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:9e60::,2a00:9e60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:9e80::,2a00:9e80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:9ea0::,2a00:9ea0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:9ec0::,2a00:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a00:9ee0::,2a00:9ee0:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:9f00::,2a00:9f00:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:9f20::,2a00:9f20:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:9f40::,2a00:9f47:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a00:9f60::,2a00:9f60:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a00:9f80::,2a00:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:9fa0::,2a00:9fa7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:9fc0::,2a00:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:9fe0::,2a00:9fe7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:a000::,2a00:a000:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:a020::,2a00:a020:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:a040::,2a00:a040:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a00:a060::,2a00:a060:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:a080::,2a00:a080:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:a0a0::,2a00:a0a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:a0c0::,2a00:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:a0e0::,2a00:a0e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:a100::,2a00:a100:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:a120::,2a00:a120:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:a140::,2a00:a140:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:a160::,2a00:a160:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:a180::,2a00:a180:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:a1a0::,2a00:a1a0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:a1c0::,2a00:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:a1e0::,2a00:a1e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:a200::,2a00:a200:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:a220::,2a00:a220:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:a240::,2a00:a240:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:a260::,2a00:a260:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a00:a280::,2a00:a280:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:a2a0::,2a00:a2a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:a2c0::,2a00:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:a2e0::,2a00:a2e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:a300::,2a00:a300:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:a320::,2a00:a320:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:a340::,2a00:a340:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:a360::,2a00:a361:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:a380::,2a00:a380:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:a3a0::,2a00:a3a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:a3e0::,2a00:a3e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:a400::,2a00:a400:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:a420::,2a00:a420:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:a440::,2a00:a440:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:a460::,2a00:a460:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:a4a0::,2a00:a4a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:a4c0::,2a00:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:a4e0::,2a00:a4e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:a500::,2a00:a500:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:a520::,2a00:a520:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:a540::,2a00:a540:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:a560::,2a00:a560:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:a580::,2a00:a580:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:a5a0::,2a00:a5a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:a5c0::,2a00:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:a5e0::,2a00:a5e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:a600::,2a00:a607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:a620::,2a00:a620:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:a640::,2a00:a640:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:a660::,2a00:a660:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:a680::,2a00:a680:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:a6a0::,2a00:a6a0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:a6c0::,2a00:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:a6e0::,2a00:a6e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:a700::,2a00:a700:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:a720::,2a00:a720:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:a740::,2a00:a740:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:a760::,2a00:a760:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:a780::,2a00:a780:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:a7a0::,2a00:a7a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:a7c0::,2a00:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:a7e0::,2a00:a7e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:a800::,2a00:a800:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:a820::,2a00:a820:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:a840::,2a00:a840:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:a860::,2a00:a860:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:a880::,2a00:a880:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a00:a8a0::,2a00:a8a0:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:a8c0::,2a00:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:a8e0::,2a00:a8e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:a900::,2a00:a900:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:a920::,2a00:a920:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:a940::,2a00:a940:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:a960::,2a00:a960:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:a980::,2a00:a987:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:a9a0::,2a00:a9a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:a9c0::,2a00:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a00:a9e0::,2a00:a9e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:aa00::,2a00:aa00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:aa20::,2a00:aa20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:aa40::,2a00:aa40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:aa60::,2a00:aa60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:aa80::,2a00:aa80:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a00:aaa0::,2a00:aaa0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:aac0::,2a00:aac0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:aae0::,2a00:aae0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ab00::,2a00:ab00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ab20::,2a00:ab20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:ab40::,2a00:ab40:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a00:ab60::,2a00:ab60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:ab80::,2a00:ab80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:aba0::,2a00:aba0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:abc0::,2a00:abc0:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a00:abe0::,2a00:abe0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:ac00::,2a00:ac07:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:ac20::,2a00:ac20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:ac40::,2a00:ac40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ac60::,2a00:ac60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ac80::,2a00:ac80:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:aca0::,2a00:aca0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:acc0::,2a00:acc0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:ace0::,2a00:ace0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:ad00::,2a00:ad00:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:ad20::,2a00:ad20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:ad40::,2a00:ad47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ad60::,2a00:ad60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ad80::,2a00:ad87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:adc0::,2a00:adc0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:ade0::,2a00:ade0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:ae00::,2a00:ae07:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:ae20::,2a00:ae20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:ae40::,2a00:ae40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ae60::,2a00:ae60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:ae80::,2a00:ae80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:aea0::,2a00:aea0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:aec0::,2a00:aec0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:aee0::,2a00:aee7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:af00::,2a00:af00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:af20::,2a00:af20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:af40::,2a00:af40:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:af60::,2a00:af60:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:af80::,2a00:af80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:afa0::,2a00:afa0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:afc0::,2a00:afc0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:afe0::,2a00:afe0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:b000::,2a00:b000:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:b020::,2a00:b020:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a00:b040::,2a00:b040:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:b060::,2a00:b060:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:b080::,2a00:b080:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:b0a0::,2a00:b0a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:b0c0::,2a00:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:b0e0::,2a00:b0e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:b120::,2a00:b120:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:b140::,2a00:b140:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:b160::,2a00:b160:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b180::,2a00:b180:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:b1a0::,2a00:b1a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:b1c0::,2a00:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b1e0::,2a00:b1e0:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a00:b200::,2a00:b200:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:b220::,2a00:b220:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:b260::,2a00:b260:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:b280::,2a00:b280:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:b2a0::,2a00:b2a0:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:b2c0::,2a00:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:b2e0::,2a00:b2e0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:b300::,2a00:b307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:b320::,2a00:b320:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:b340::,2a00:b340:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:b360::,2a00:b360:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b380::,2a00:b380:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:b3a0::,2a00:b3a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:b3c0::,2a00:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a00:b400::,2a00:b407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:b420::,2a00:b420:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:b440::,2a00:b440:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b460::,2a00:b460:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:b480::,2a00:b480:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:b4a0::,2a00:b4a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b4c0::,2a00:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b500::,2a00:b500:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b520::,2a00:b520:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:b560::,2a00:b560:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b580::,2a00:b580:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:b5a0::,2a00:b5a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:b5c0::,2a00:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:b5e0::,2a00:b5e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:b600::,2a00:b607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:b640::,2a00:b640:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:b660::,2a00:b660:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:b680::,2a00:b680:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:b6a0::,2a00:b6a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b6c0::,2a00:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:b6e0::,2a00:b6e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:b700::,2a00:b707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b720::,2a00:b720:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:b740::,2a00:b740:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:b760::,2a00:b760:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:b780::,2a00:b780:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:b7a0::,2a00:b7a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:b7c0::,2a00:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:b800::,2a00:b800:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a00:b820::,2a00:b820:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:b840::,2a00:b840:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:b860::,2a00:b860:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a00:b880::,2a00:b880:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b8a0::,2a00:b8a0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:b8c0::,2a00:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:b8e0::,2a00:b8e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:b900::,2a00:b900:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:b920::,2a00:b920:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:b940::,2a00:b940:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:b960::,2a00:b960:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:b980::,2a00:b987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:b9a0::,2a00:b9a0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:b9c0::,2a00:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:b9e0::,2a00:b9e0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a00:ba00::,2a00:ba00:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:ba20::,2a00:ba20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ba40::,2a00:ba40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:ba60::,2a00:ba60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:ba80::,2a00:ba80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:baa0::,2a00:baa0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:bac0::,2a00:bac0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:bae0::,2a00:bae0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:bb00::,2a00:bb00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:bb20::,2a00:bb20:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:bb40::,2a00:bb40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:bb60::,2a00:bb60:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:bb80::,2a00:bb80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:bba0::,2a00:bba0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:bbc0::,2a00:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:bbe0::,2a00:bbe7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:bc00::,2a00:bc00:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:bc20::,2a00:bc20:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a00:bc40::,2a00:bc40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:bc60::,2a00:bc60:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:bc80::,2a00:bc80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:bca0::,2a00:bca0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:bcc0::,2a00:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:bce0::,2a00:bce0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:bd00::,2a00:bd00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:bd20::,2a00:bd20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:bd40::,2a00:bd40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:bd60::,2a00:bd60:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:bd80::,2a00:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:bda0::,2a00:bda0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:bdc0::,2a00:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:bde0::,2a00:bde0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:be00::,2a00:be00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:be20::,2a00:be20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:be40::,2a00:be47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:be60::,2a00:be67:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:be80::,2a00:be80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:bea0::,2a00:bea0:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a00:bec0::,2a00:bec7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:bf00::,2a00:bf00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:bf20::,2a00:bf20:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:bf40::,2a00:bf40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:bf60::,2a00:bf60:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:bf80::,2a00:bf80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:bfa0::,2a00:bfa0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:bfc0::,2a00:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:bfe0::,2a00:bfe0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:c000::,2a00:c000:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:c020::,2a00:c020:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:c040::,2a00:c040:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:c060::,2a00:c060:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c080::,2a00:c080:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:c0a0::,2a00:c0a0:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a00:c0c0::,2a00:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:c0e0::,2a00:c0e0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:c100::,2a00:c100:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:c120::,2a00:c120:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:c140::,2a00:c140:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:c160::,2a00:c160:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a00:c180::,2a00:c187:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:c1a0::,2a00:c1a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:c1c0::,2a00:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:c1e0::,2a00:c1e7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:c200::,2a00:c200:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:c220::,2a00:c220:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:c260::,2a00:c260:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:c280::,2a00:c280:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a00:c2a0::,2a00:c2a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c2c0::,2a00:c2c0:fffe:ffff:ffff:ffff:ffff:ffff,NL +2a00:c2c0:ffff::,2a00:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2a00:c2c1::,2a00:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:c2e0::,2a00:c2e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:c300::,2a00:c307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:c320::,2a00:c320:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:c340::,2a00:c340:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:c360::,2a00:c360:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:c380::,2a00:c380:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:c3a0::,2a00:c3a0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a00:c3c0::,2a00:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:c3e0::,2a00:c3e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c400::,2a00:c400:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c420::,2a00:c420:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:c440::,2a00:c447:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:c460::,2a00:c460:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c480::,2a00:c480:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:c4a0::,2a00:c4a0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:c4c0::,2a00:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:c4e0::,2a00:c4e0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:c500::,2a00:c500:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:c520::,2a00:c520:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c540::,2a00:c540:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:c560::,2a00:c567:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a00:c580::,2a00:c580:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:c5a0::,2a00:c5a7:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a00:c5c0::,2a00:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c5e0::,2a00:c5e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:c600::,2a00:c600:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:c620::,2a00:c620:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:c640::,2a00:c640:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:c660::,2a00:c660:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:c680::,2a00:c680:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:c6a0::,2a00:c6a0:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a00:c6c0::,2a00:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:c6e0::,2a00:c6e0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:c700::,2a00:c700:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a00:c720::,2a00:c720:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:c740::,2a00:c740:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:c760::,2a00:c760:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:c780::,2a00:c780:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:c7a0::,2a00:c7a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c7c0::,2a00:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:c800::,2a00:c800:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:c820::,2a00:c820:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a00:c840::,2a00:c840:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:c860::,2a00:c860:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a00:c880::,2a00:c880:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:c8a0::,2a00:c8a7:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a00:c8c0::,2a00:c8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:c8e0::,2a00:c8e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:c900::,2a00:c907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:c920::,2a00:c920:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:c940::,2a00:c940:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:c960::,2a00:c960:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a00:c980::,2a00:c987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c9a0::,2a00:c9a0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:c9c0::,2a00:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:c9e0::,2a00:c9e0:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a00:ca00::,2a00:ca07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:ca20::,2a00:ca20:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:ca40::,2a00:ca40:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:ca60::,2a00:ca67:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a00:ca80::,2a00:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:caa0::,2a00:caa0:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a00:cac0::,2a00:cac0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:cae0::,2a00:cae0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:cb00::,2a00:cb00:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a00:cb20::,2a00:cb20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:cb40::,2a00:cb40:1:ffff:ffff:ffff:ffff:ffff,NL +2a00:cb40:2::,2a00:cb40:2:ffff:ffff:ffff:ffff:ffff,CZ +2a00:cb40:3::,2a00:cb40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:cb60::,2a00:cb60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:cb80::,2a00:cb80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:cba0::,2a00:cba0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:cbc0::,2a00:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:cbe0::,2a00:cbe0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:cc00::,2a00:cc00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:cc20::,2a00:cc20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:cc40::,2a00:cc40:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a00:cc60::,2a00:cc60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:cc80::,2a00:cc80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:cca0::,2a00:cca0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:ccc0::,2a00:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:cce0::,2a00:cce0:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a00:cd00::,2a00:cd00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:cd20::,2a00:cd20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:cd40::,2a00:cd40:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:cd60::,2a00:cd60:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:cd80::,2a00:cd80:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:cda0::,2a00:cda0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:cdc0::,2a00:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:cde0::,2a00:cde0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ce00::,2a00:ce00:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:ce20::,2a00:ce27:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:ce40::,2a00:ce40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ce60::,2a00:ce60:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:ce80::,2a00:ce80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:cea0::,2a00:cea0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:cec0::,2a00:cec0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:cee0::,2a00:cee7:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a00:cf00::,2a00:cf00:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:cf40::,2a00:cf40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:cf60::,2a00:cf60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:cf80::,2a00:cf80:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:cfa0::,2a00:cfa0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:cfc0::,2a00:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:cfe0::,2a00:cfe0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:d000::,2a00:d007:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d020::,2a00:d020:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:d040::,2a00:d040:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:d060::,2a00:d060:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:d080::,2a00:d080:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:d0a0::,2a00:d0a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:d0c0::,2a00:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:d0e0::,2a00:d0e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:d100::,2a00:d100:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:d120::,2a00:d120:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:d140::,2a00:d140:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a00:d160::,2a00:d160:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:d180::,2a00:d180:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a00:d1a0::,2a00:d1a0:f:ffff:ffff:ffff:ffff:ffff,DE +2a00:d1a0:10::,2a00:d1a0:1f:ffff:ffff:ffff:ffff:ffff,GB +2a00:d1a0:20::,2a00:d1a0:1ffe:ffff:ffff:ffff:ffff:ffff,DE +2a00:d1a0:1fff::,2a00:d1a0:1fff:ffff:ffff:ffff:ffff:ffff,US +2a00:d1a0:2000::,2a00:d1a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:d1c0::,2a00:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:d1e0::,2a00:d1e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:d200::,2a00:d207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d220::,2a00:d220:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:d240::,2a00:d240:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:d260::,2a00:d267:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d280::,2a00:d280:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:d2a0::,2a00:d2a7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d2c0::,2a00:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a00:d2e0::,2a00:d2e7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d300::,2a00:d300:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d320::,2a00:d327:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d340::,2a00:d340:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d360::,2a00:d367:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d380::,2a00:d380:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:d3a0::,2a00:d3a7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d3c0::,2a00:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:d3e0::,2a00:d3e7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d400::,2a00:d400:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:d420::,2a00:d427:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d440::,2a00:d447:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:d480::,2a00:d480:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:d4a0::,2a00:d4a7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d4c0::,2a00:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:d4e0::,2a00:d4e7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d500::,2a00:d500:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:d520::,2a00:d527:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d540::,2a00:d547:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:d560::,2a00:d567:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:d580::,2a00:d580:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:d5c0::,2a00:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:d5e0::,2a00:d5e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d600::,2a00:d600:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d620::,2a00:d620:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a00:d640::,2a00:d640:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:d660::,2a00:d660:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:d680::,2a00:d680:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d6a0::,2a00:d6a0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:d6c0::,2a00:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:d6e0::,2a00:d6e0:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a00:d700::,2a00:d700:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d720::,2a00:d727:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d740::,2a00:d747:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:d780::,2a00:d780:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:d7a0::,2a00:d7a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:d7c0::,2a00:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:d7e0::,2a00:d7e0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:d800::,2a00:d800:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a00:d820::,2a00:d820:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:d840::,2a00:d840:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:d860::,2a00:d860:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:d880::,2a00:d880:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:d8a0::,2a00:d8a7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d8c0::,2a00:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:d8e0::,2a00:d8e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:d900::,2a00:d900:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:d920::,2a00:d920:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:d940::,2a00:d940:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:d960::,2a00:d967:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:d980::,2a00:d980:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:d9a0::,2a00:d9a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:d9c0::,2a00:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:d9e0::,2a00:d9e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:da00::,2a00:da00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:da20::,2a00:da20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:da60::,2a00:da60:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a00:da80::,2a00:da80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:daa0::,2a00:daa0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:dac0::,2a00:dac0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:dae0::,2a00:dae0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:db00::,2a00:db00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:db20::,2a00:db20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:db40::,2a00:db40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:db60::,2a00:db60:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:db80::,2a00:db80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:dba0::,2a00:dba0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:dbc0::,2a00:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:dbe0::,2a00:dbe0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:dc00::,2a00:dc00:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:dc20::,2a00:dc20:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a00:dc40::,2a00:dc40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:dc60::,2a00:dc60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:dc80::,2a00:dc80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:dca0::,2a00:dca7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:dcc0::,2a00:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:dd00::,2a00:dd00:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a00:dd20::,2a00:dd20:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:dd40::,2a00:dd40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:dd60::,2a00:dd60:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:dda0::,2a00:dda0:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a00:ddc0::,2a00:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:dde0::,2a00:dde0:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a00:de00::,2a00:de00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:de20::,2a00:de20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:de40::,2a00:de40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:de60::,2a00:de60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:de80::,2a00:de80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:dea0::,2a00:dea0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:dec0::,2a00:dec0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:dee0::,2a00:dee0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:df00::,2a00:df07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:df20::,2a00:df20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:df40::,2a00:df40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:df60::,2a00:df60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:df80::,2a00:df80:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:dfa0::,2a00:dfa0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:dfc0::,2a00:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:dfe0::,2a00:dfe7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:e000::,2a00:e000:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:e020::,2a00:e020:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:e040::,2a00:e040:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:e060::,2a00:e060:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:e080::,2a00:e080:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:e0c0::,2a00:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e100::,2a00:e100:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:e120::,2a00:e120:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e140::,2a00:e140:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:e160::,2a00:e160:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:e180::,2a00:e180:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:e1a0::,2a00:e1a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e1c0::,2a00:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e1e0::,2a00:e1e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:e200::,2a00:e200:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:e220::,2a00:e220:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:e240::,2a00:e240:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:e260::,2a00:e260:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:e280::,2a00:e280:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:e2a0::,2a00:e2a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:e2c0::,2a00:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:e2e0::,2a00:e2e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:e300::,2a00:e300:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:e320::,2a00:e320:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:e340::,2a00:e347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e360::,2a00:e360:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:e380::,2a00:e380:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:e3a0::,2a00:e3a0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:e3c0::,2a00:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2a00:e3e0::,2a00:e3e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e400::,2a00:e407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:e440::,2a00:e440:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:e460::,2a00:e460:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:e480::,2a00:e480:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:e4a0::,2a00:e4a0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:e4c0::,2a00:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:e4e0::,2a00:e4e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e500::,2a00:e500:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:e520::,2a00:e520:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e540::,2a00:e540:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:e560::,2a00:e560:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:e580::,2a00:e587:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:e5a0::,2a00:e5a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:e5c0::,2a00:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:e5e0::,2a00:e5e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:e600::,2a00:e600:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:e620::,2a00:e620:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e640::,2a00:e647:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:e680::,2a00:e680:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:e6a0::,2a00:e6a0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a00:e6c0::,2a00:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:e6e0::,2a00:e6e0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:e700::,2a00:e700:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:e720::,2a00:e720:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:e740::,2a00:e740:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e760::,2a00:e760:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:e780::,2a00:e780:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:e7a0::,2a00:e7a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e7c0::,2a00:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:e7e0::,2a00:e7e0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:e800::,2a00:e807:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:e840::,2a00:e840:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:e860::,2a00:e860:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a00:e880::,2a00:e880:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:e8c0::,2a00:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a00:e8e0::,2a00:e8e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:e900::,2a00:e907:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:e920::,2a00:e920:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:e940::,2a00:e940:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:e960::,2a00:e960:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:e980::,2a00:e980:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:e9a0::,2a00:e9a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:e9c0::,2a00:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:e9e0::,2a00:e9e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ea00::,2a00:ea00:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:ea20::,2a00:ea27:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ea40::,2a00:ea40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ea60::,2a00:ea60:ff:ffff:ffff:ffff:ffff:ffff,LT +2a00:ea60:100::,2a00:ea60:1ff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ea60:200::,2a00:ea60:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a00:ea80::,2a00:ea80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:eaa0::,2a00:eaa0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:eac0::,2a00:eac0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:eae0::,2a00:eae0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:eb00::,2a00:eb00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:eb20::,2a00:eb20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:eb40::,2a00:eb40:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:eb60::,2a00:eb60:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:eb80::,2a00:eb80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:ebc0::,2a00:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:ebe0::,2a00:ebe0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ec00::,2a00:ec00:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:ec20::,2a00:ec23:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:ec40::,2a00:ec47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:ec80::,2a00:ec80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:eca0::,2a00:eca0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:ecc0::,2a00:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:ece0::,2a00:ece7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a00:ed00::,2a00:ed00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ed20::,2a00:ed20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ed40::,2a00:ed40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ed60::,2a00:ed60:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a00:ed80::,2a00:ed80:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:eda0::,2a00:eda0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:edc0::,2a00:edc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:ede0::,2a00:ede7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:ee00::,2a00:ee00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ee20::,2a00:ee20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:ee40::,2a00:ee40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:ee60::,2a00:ee60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ee80::,2a00:ee80:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a00:eea0::,2a00:eea7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:eec0::,2a00:eec0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:eee0::,2a00:eee0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:ef00::,2a00:ef00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ef20::,2a00:ef20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:ef60::,2a00:ef67:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:ef80::,2a00:ef80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:efa0::,2a00:efa0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:efc0::,2a00:efc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:efe0::,2a00:efe7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:f000::,2a00:f000:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a00:f020::,2a00:f020:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:f040::,2a00:f040:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f060::,2a00:f060:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:f080::,2a00:f080:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:f0a0::,2a00:f0a7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:f0c0::,2a00:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:f0e0::,2a00:f0e0:ffff:ffff:ffff:ffff:ffff:ffff,QA +2a00:f100::,2a00:f100:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:f120::,2a00:f120:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:f160::,2a00:f160:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f180::,2a00:f180:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:f1a0::,2a00:f1a0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:f1c0::,2a00:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:f200::,2a00:f200:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:f240::,2a00:f240:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:f260::,2a00:f260:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a00:f280::,2a00:f280:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:f2a0::,2a00:f2a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f2c0::,2a00:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:f2e0::,2a00:f2e0:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a00:f300::,2a00:f300:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:f320::,2a00:f320:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:f340::,2a00:f340:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:f360::,2a00:f360:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:f380::,2a00:f380:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:f3a0::,2a00:f3a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:f3c0::,2a00:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:f3e0::,2a00:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f400::,2a00:f400:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:f420::,2a00:f420:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:f440::,2a00:f440:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f460::,2a00:f460:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f480::,2a00:f480:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f4a0::,2a00:f4a0:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a00:f4c0::,2a00:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:f4e0::,2a00:f4e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:f500::,2a00:f507:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a00:f520::,2a00:f520:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:f540::,2a00:f540:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:f560::,2a00:f560:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:f580::,2a00:f580:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a00:f5a0::,2a00:f5a0:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a00:f5c0::,2a00:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:f5e0::,2a00:f5e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:f600::,2a00:f600:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:f620::,2a00:f620:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:f640::,2a00:f640:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:f660::,2a00:f660:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:f680::,2a00:f680:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:f6a0::,2a00:f6a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f6c0::,2a00:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:f6e0::,2a00:f6e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:f700::,2a00:f707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:f720::,2a00:f720:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:f740::,2a00:f740:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:f760::,2a00:f760:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:f780::,2a00:f780:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:f7a0::,2a00:f7a0:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a00:f7c0::,2a00:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a00:f800::,2a00:f800:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:f820::,2a00:f827:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:f840::,2a00:f840:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f860::,2a00:f860:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:f880::,2a00:f880:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:f8a0::,2a00:f8a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:f8c0::,2a00:f8c0:4000:ffff:ffff:ffff:ffff:ffff,LI +2a00:f8c0:4001::,2a00:f8c0:4001:7fff:ffff:ffff:ffff:ffff,AT +2a00:f8c0:4001:8000::,2a00:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a00:f8e0::,2a00:f8e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:f900::,2a00:f907:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a00:f920::,2a00:f920:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f940::,2a00:f940:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f980::,2a00:f987:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:f9a0::,2a00:f9a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:f9c0::,2a00:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:f9e0::,2a00:f9e0:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a00:fa00::,2a00:fa00:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a00:fa20::,2a00:fa20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:fa40::,2a00:fa40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:fa60::,2a00:fa60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:fa80::,2a00:fa80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:faa0::,2a00:faa0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a00:fac0::,2a00:fac0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:fae0::,2a00:fae0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:fb00::,2a00:fb07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:fb20::,2a00:fb20:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:fb40::,2a00:fb40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:fb60::,2a00:fb60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a00:fb80::,2a00:fb80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:fba0::,2a00:fba0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:fbc0::,2a00:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:fbe0::,2a00:fbe0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:fc00::,2a00:fc00:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:fc20::,2a00:fc20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:fc40::,2a00:fc40:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a00:fc80::,2a00:fc80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:fca0::,2a00:fca0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:fcc0::,2a00:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:fce0::,2a00:fce0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:fd00::,2a00:fd00:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:fd20::,2a00:fd20:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a00:fd40::,2a00:fd40:5:ffff:ffff:ffff:ffff:ffff,NL +2a00:fd40:6::,2a00:fd40:7:ffff:ffff:ffff:ffff:ffff,SK +2a00:fd40:8::,2a00:fd41:5297:ffff:ffff:ffff:ffff:ffff,NL +2a00:fd41:5298::,2a00:fd41:5298:7fff:ffff:ffff:ffff:ffff,GB +2a00:fd41:5298:8000::,2a00:fd47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:fd60::,2a00:fd60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:fd80::,2a00:fd80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:fda0::,2a00:fda0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:fdc0::,2a00:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:fde0::,2a00:fde0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:fe00::,2a00:fe00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:fe20::,2a00:fe20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:fe40::,2a00:fe40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:fe60::,2a00:fe60:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:fe80::,2a00:fe87:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a00:fea0::,2a00:fea7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:fec0::,2a00:fec0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a00:fee0::,2a00:fee0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ff00::,2a00:ff07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a00:ff20::,2a00:ff20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:ff40::,2a00:ff40:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:ff60::,2a00:ff60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ff80::,2a00:ff80:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a00:ffa0::,2a00:ffa0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:ffc0::,2a00:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:ffe0::,2a00:ffe0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01::,2a01::ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:8::,2a01:17:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a01:18::,2a01:18:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:20::,2a01:20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:28::,2a01:28:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:30::,2a01:37:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:38::,2a01:38:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:40::,2a01:40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:48::,2a01:48:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:50::,2a01:50:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:58::,2a01:58:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:68::,2a01:68:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:70::,2a01:70:fffe:ffff:ffff:ffff:ffff:ffff,GB +2a01:70:ffff::,2a01:70:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:78::,2a01:7f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:80::,2a01:80:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a01:88::,2a01:88:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:90::,2a01:90:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:98::,2a01:98:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a0::,2a01:a0:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a01:a8::,2a01:af:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:b0::,2a01:b1:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:b8::,2a01:b8:ffff:ffff:ffff:ffff:ffff:ffff,VA +2a01:c0::,2a01:c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:c8::,2a01:c8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:d0::,2a01:d0:896c:7fff:ffff:ffff:ffff:ffff,UA +2a01:d0:896c:8000::,2a01:d0:896c:ffff:ffff:ffff:ffff:ffff,RU +2a01:d0:896d::,2a01:d0:9637:7fff:ffff:ffff:ffff:ffff,UA +2a01:d0:9637:8000::,2a01:d0:9637:ffff:ffff:ffff:ffff:ffff,NL +2a01:d0:9638::,2a01:d0:e16e:ffff:ffff:ffff:ffff:ffff,UA +2a01:d0:e16f::,2a01:d0:e16f:7fff:ffff:ffff:ffff:ffff,DK +2a01:d0:e16f:8000::,2a01:d0:e314:ffff:ffff:ffff:ffff:ffff,UA +2a01:d0:e315::,2a01:d0:e315:7fff:ffff:ffff:ffff:ffff,RU +2a01:d0:e315:8000::,2a01:d0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:d8::,2a01:d8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:e0::,2a01:e0:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:e8::,2a01:e8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:f0::,2a01:f0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:f8::,2a01:f8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:100::,2a01:100:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:108::,2a01:108:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:110::,2a01:110:8067:ffff:ffff:ffff:ffff:ffff,GB +2a01:110:8068::,2a01:110:8068:ffff:ffff:ffff:ffff:ffff,IL +2a01:110:8069::,2a01:110:9007:ffff:ffff:ffff:ffff:ffff,GB +2a01:110:9008::,2a01:110:9008:7fff:ffff:ffff:ffff:ffff,EE +2a01:110:9008:8000::,2a01:110:a007:ffff:ffff:ffff:ffff:ffff,GB +2a01:110:a008::,2a01:110:a008:7fff:ffff:ffff:ffff:ffff,IE +2a01:110:a008:8000::,2a01:111:2000:3:ffff:ffff:ffff:ffff,GB +2a01:111:2000:4::,2a01:111:2000:4:ffff:ffff:ffff:ffff,US +2a01:111:2000:5::,2a01:111:2000:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2001::,2a01:111:2001:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2002::,2a01:111:2003:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2004::,2a01:111:2006:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2007::,2a01:111:2007:ffff:ffff:ffff:ffff:ffff,AU +2a01:111:2008::,2a01:111:2008:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2009::,2a01:111:2009:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:200a::,2a01:111:2010:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2011::,2a01:111:2011:ffff:ffff:ffff:ffff:ffff,PR +2a01:111:2012::,2a01:111:2013:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2014::,2a01:111:2015:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2016::,2a01:111:2016::ffff:ffff:ffff:ffff,US +2a01:111:2016:1::,2a01:111:2016:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2017::,2a01:111:2017:ffff:ffff:ffff:ffff:ffff,BR +2a01:111:2018::,2a01:111:2019:ffff:ffff:ffff:ffff:ffff,US +2a01:111:201a::,2a01:111:201a:ffff:ffff:ffff:ffff:ffff,SG +2a01:111:201b::,2a01:111:201c:ffff:ffff:ffff:ffff:ffff,US +2a01:111:201d::,2a01:111:201d:ffff:ffff:ffff:ffff:ffff,HK +2a01:111:201e::,2a01:111:201f:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2020::,2a01:111:2020:ffff:ffff:ffff:ffff:ffff,NL +2a01:111:2021::,2a01:111:2022:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2023::,2a01:111:2023::ffff:ffff:ffff:ffff,SE +2a01:111:2023:1::,2a01:111:2025:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2026::,2a01:111:2026:ffff:ffff:ffff:ffff:ffff,IE +2a01:111:2027::,2a01:111:2027:ffff:ffff:ffff:ffff:ffff,NL +2a01:111:2028::,2a01:111:2028:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2029::,2a01:111:2029:ffff:ffff:ffff:ffff:ffff,US +2a01:111:202a::,2a01:111:202a:ffff:ffff:ffff:ffff:ffff,NL +2a01:111:202b::,2a01:111:202b:ffff:ffff:ffff:ffff:ffff,IE +2a01:111:202c::,2a01:111:202f:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2030::,2a01:111:2030:ffff:ffff:ffff:ffff:ffff,JP +2a01:111:2031::,2a01:111:2031:ffff:ffff:ffff:ffff:ffff,SG +2a01:111:2032::,2a01:111:2032:ffff:ffff:ffff:ffff:ffff,HK +2a01:111:2033::,2a01:111:2033:ffff:ffff:ffff:ffff:ffff,IE +2a01:111:2034::,2a01:111:2034:ffff:ffff:ffff:ffff:ffff,AU +2a01:111:2035::,2a01:111:2035:ffff:ffff:ffff:ffff:ffff,SG +2a01:111:2036::,2a01:111:2036:ffff:ffff:ffff:ffff:ffff,JP +2a01:111:2037::,2a01:111:2037:ffff:ffff:ffff:ffff:ffff,NL +2a01:111:2038::,2a01:111:2038:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2039::,2a01:111:2039:ffff:ffff:ffff:ffff:ffff,AU +2a01:111:203a::,2a01:111:203a:ffff:ffff:ffff:ffff:ffff,BR +2a01:111:203b::,2a01:111:203b:ffff:ffff:ffff:ffff:ffff,AT +2a01:111:203c::,2a01:111:203c:ffff:ffff:ffff:ffff:ffff,US +2a01:111:203d::,2a01:111:203d:ffff:ffff:ffff:ffff:ffff,NL +2a01:111:203e::,2a01:111:2040:ffff:ffff:ffff:ffff:ffff,IN +2a01:111:2041::,2a01:111:2041:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2042::,2a01:111:2042:ffff:ffff:ffff:ffff:ffff,FI +2a01:111:2043::,2a01:111:2043:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2044::,2a01:111:2044:ffff:ffff:ffff:ffff:ffff,IE +2a01:111:2045::,2a01:111:2045:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2046::,2a01:111:2046:ffff:ffff:ffff:ffff:ffff,JP +2a01:111:2047::,2a01:111:2048:ffff:ffff:ffff:ffff:ffff,CA +2a01:111:2049::,2a01:111:207f:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2080::,2a01:111:2080:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2081::,2a01:111:f00f:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f010::,2a01:111:f013:ffff:ffff:ffff:ffff:ffff,US +2a01:111:f014::,2a01:111:f0ff:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f100::,2a01:111:f100:4fff:ffff:ffff:ffff:ffff,US +2a01:111:f100:5000::,2a01:111:f100:5fff:ffff:ffff:ffff:ffff,GB +2a01:111:f100:6000::,2a01:111:f100:6fff:ffff:ffff:ffff:ffff,HK +2a01:111:f100:7000::,2a01:111:f100:7fff:ffff:ffff:ffff:ffff,SG +2a01:111:f100:8000::,2a01:111:f100:9fff:ffff:ffff:ffff:ffff,NL +2a01:111:f100:a000::,2a01:111:f100:afff:ffff:ffff:ffff:ffff,IE +2a01:111:f100:b000::,2a01:111:f100:bfff:ffff:ffff:ffff:ffff,US +2a01:111:f100:c000::,2a01:111:f100:cfff:ffff:ffff:ffff:ffff,IE +2a01:111:f100:d000::,2a01:111:f100:dfff:ffff:ffff:ffff:ffff,US +2a01:111:f100:e000::,2a01:111:f100:efff:ffff:ffff:ffff:ffff,GB +2a01:111:f100:f000::,2a01:111:f100:ffff:ffff:ffff:ffff:ffff,US +2a01:111:f101::,2a01:111:f101:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f102::,2a01:111:f102:fff:ffff:ffff:ffff:ffff,BR +2a01:111:f102:1000::,2a01:111:f102:7fff:ffff:ffff:ffff:ffff,US +2a01:111:f102:8000::,2a01:111:f102:8fff:ffff:ffff:ffff:ffff,HK +2a01:111:f102:9000::,2a01:111:f102:afff:ffff:ffff:ffff:ffff,JP +2a01:111:f102:b000::,2a01:111:f102:bfff:ffff:ffff:ffff:ffff,SG +2a01:111:f102:c000::,2a01:111:f102:dfff:ffff:ffff:ffff:ffff,AU +2a01:111:f102:e000::,2a01:111:f102:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f103::,2a01:111:f103:fff:ffff:ffff:ffff:ffff,IE +2a01:111:f103:1000::,2a01:111:f103:1fff:ffff:ffff:ffff:ffff,SG +2a01:111:f103:2000::,2a01:111:f20a:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f20b::,2a01:111:f20b:ffff:ffff:ffff:ffff:ffff,IE +2a01:111:f20c::,2a01:111:f20f:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f210::,2a01:111:f210:ffff:ffff:ffff:ffff:ffff,US +2a01:111:f211::,2a01:111:f306:178f:ffff:ffff:ffff:ffff,GB +2a01:111:f306:1790::,2a01:111:f306:1791:ffff:ffff:ffff:ffff,US +2a01:111:f306:1792::,2a01:111:f30b:178f:ffff:ffff:ffff:ffff,GB +2a01:111:f30b:1790::,2a01:111:f30b:1790:ffff:ffff:ffff:ffff,US +2a01:111:f30b:1791::,2a01:111:f30b:1791:ffff:ffff:ffff:ffff,GB +2a01:111:f30b:1792::,2a01:111:f30b:1793:ffff:ffff:ffff:ffff,US +2a01:111:f30b:1794::,2a01:111:f30e:178f:ffff:ffff:ffff:ffff,GB +2a01:111:f30e:1790::,2a01:111:f30e:1790:ffff:ffff:ffff:ffff,US +2a01:111:f30e:1791::,2a01:111:f330:178f:ffff:ffff:ffff:ffff,GB +2a01:111:f330:1790::,2a01:111:f330:1791:ffff:ffff:ffff:ffff,US +2a01:111:f330:1792::,2a01:111:f330:1792:ffff:ffff:ffff:ffff,GB +2a01:111:f330:1793::,2a01:111:f330:1794:ffff:ffff:ffff:ffff,US +2a01:111:f330:1795::,2a01:111:f330:17cf:ffff:ffff:ffff:ffff,GB +2a01:111:f330:17d0::,2a01:111:f330:17d0:ffff:ffff:ffff:ffff,US +2a01:111:f330:17d1::,2a01:111:f3ff:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f400::,2a01:111:f400:29:ffff:ffff:ffff:ffff,US +2a01:111:f400:2a::,2a01:111:f400:3d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:3e::,2a01:111:f400:5c:ffff:ffff:ffff:ffff,US +2a01:111:f400:5d::,2a01:111:f400:3ff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:400::,2a01:111:f400:1bff:ffff:ffff:ffff:ffff,US +2a01:111:f400:1c00::,2a01:111:f400:1c07:ffff:ffff:ffff:ffff,HK +2a01:111:f400:1c08::,2a01:111:f400:1c1a:ffff:ffff:ffff:ffff,BR +2a01:111:f400:1c1b::,2a01:111:f400:1c1f:ffff:ffff:ffff:ffff,GB +2a01:111:f400:1c20::,2a01:111:f400:1c27:ffff:ffff:ffff:ffff,BR +2a01:111:f400:1c28::,2a01:111:f400:23ff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:2400::,2a01:111:f400:2413:ffff:ffff:ffff:ffff,IE +2a01:111:f400:2414::,2a01:111:f400:247f:ffff:ffff:ffff:ffff,US +2a01:111:f400:2480::,2a01:111:f400:2490:ffff:ffff:ffff:ffff,GB +2a01:111:f400:2491::,2a01:111:f400:2491:ffff:ffff:ffff:ffff,US +2a01:111:f400:2492::,2a01:111:f400:27ff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:2800::,2a01:111:f400:2c00:ffff:ffff:ffff:ffff,US +2a01:111:f400:2c01::,2a01:111:f400:2c02:ffff:ffff:ffff:ffff,GB +2a01:111:f400:2c03::,2a01:111:f400:2c67:ffff:ffff:ffff:ffff,US +2a01:111:f400:2c68::,2a01:111:f400:2c74:ffff:ffff:ffff:ffff,GB +2a01:111:f400:2c75::,2a01:111:f400:2c97:ffff:ffff:ffff:ffff,US +2a01:111:f400:2c98::,2a01:111:f400:2fff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:3000::,2a01:111:f400:3001:ffff:ffff:ffff:ffff,US +2a01:111:f400:3002::,2a01:111:f400:3090:ffff:ffff:ffff:ffff,GB +2a01:111:f400:3091::,2a01:111:f400:3095:ffff:ffff:ffff:ffff,US +2a01:111:f400:3096::,2a01:111:f400:31d1:ffff:ffff:ffff:ffff,GB +2a01:111:f400:31d2::,2a01:111:f400:31e0:ffff:ffff:ffff:ffff,US +2a01:111:f400:31e1::,2a01:111:f400:33ff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:3400::,2a01:111:f400:3432:ffff:ffff:ffff:ffff,US +2a01:111:f400:3433::,2a01:111:f400:3bff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:3c00::,2a01:111:f400:47ff:ffff:ffff:ffff:ffff,US +2a01:111:f400:4800::,2a01:111:f400:4bff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:4c00::,2a01:111:f400:4fff:ffff:ffff:ffff:ffff,US +2a01:111:f400:5000::,2a01:111:f400:5013:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5014::,2a01:111:f400:502a:ffff:ffff:ffff:ffff,US +2a01:111:f400:502b::,2a01:111:f400:502b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:502c::,2a01:111:f400:5033:ffff:ffff:ffff:ffff,US +2a01:111:f400:5034::,2a01:111:f400:503b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:503c::,2a01:111:f400:5045:ffff:ffff:ffff:ffff,IE +2a01:111:f400:5046::,2a01:111:f400:5046:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5047::,2a01:111:f400:504f:ffff:ffff:ffff:ffff,IE +2a01:111:f400:5050::,2a01:111:f400:505e:ffff:ffff:ffff:ffff,GB +2a01:111:f400:505f::,2a01:111:f400:505f:ffff:ffff:ffff:ffff,US +2a01:111:f400:5060::,2a01:111:f400:5062:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5063::,2a01:111:f400:5063:ffff:ffff:ffff:ffff,US +2a01:111:f400:5064::,2a01:111:f400:5064:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5065::,2a01:111:f400:5067:ffff:ffff:ffff:ffff,US +2a01:111:f400:5068::,2a01:111:f400:5069:ffff:ffff:ffff:ffff,GB +2a01:111:f400:506a::,2a01:111:f400:506a:ffff:ffff:ffff:ffff,US +2a01:111:f400:506b::,2a01:111:f400:506c:ffff:ffff:ffff:ffff,GB +2a01:111:f400:506d::,2a01:111:f400:506d:ffff:ffff:ffff:ffff,US +2a01:111:f400:506e::,2a01:111:f400:508d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:508e::,2a01:111:f400:508e:ffff:ffff:ffff:ffff,AT +2a01:111:f400:508f::,2a01:111:f400:5093:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5094::,2a01:111:f400:5095:ffff:ffff:ffff:ffff,AT +2a01:111:f400:5096::,2a01:111:f400:5098:ffff:ffff:ffff:ffff,FI +2a01:111:f400:5099::,2a01:111:f400:5099:ffff:ffff:ffff:ffff,GB +2a01:111:f400:509a::,2a01:111:f400:50a9:ffff:ffff:ffff:ffff,FI +2a01:111:f400:50aa::,2a01:111:f400:50e6:ffff:ffff:ffff:ffff,GB +2a01:111:f400:50e7::,2a01:111:f400:50f7:ffff:ffff:ffff:ffff,US +2a01:111:f400:50f8::,2a01:111:f400:5101:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5102::,2a01:111:f400:5104:ffff:ffff:ffff:ffff,IE +2a01:111:f400:5105::,2a01:111:f400:5105:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5106::,2a01:111:f400:510d:ffff:ffff:ffff:ffff,IE +2a01:111:f400:510e::,2a01:111:f400:5115:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5116::,2a01:111:f400:511e:ffff:ffff:ffff:ffff,US +2a01:111:f400:511f::,2a01:111:f400:513d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:513e::,2a01:111:f400:5140:ffff:ffff:ffff:ffff,IE +2a01:111:f400:5141::,2a01:111:f400:5141:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5142::,2a01:111:f400:514b:ffff:ffff:ffff:ffff,IE +2a01:111:f400:514c::,2a01:111:f400:514c:ffff:ffff:ffff:ffff,GB +2a01:111:f400:514d::,2a01:111:f400:514e:ffff:ffff:ffff:ffff,IE +2a01:111:f400:514f::,2a01:111:f400:5175:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5176::,2a01:111:f400:5176:ffff:ffff:ffff:ffff,IE +2a01:111:f400:5177::,2a01:111:f400:517f:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5180::,2a01:111:f400:518a:ffff:ffff:ffff:ffff,AU +2a01:111:f400:518b::,2a01:111:f400:518c:ffff:ffff:ffff:ffff,US +2a01:111:f400:518d::,2a01:111:f400:518d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:518e::,2a01:111:f400:5199:ffff:ffff:ffff:ffff,US +2a01:111:f400:519a::,2a01:111:f400:51ad:ffff:ffff:ffff:ffff,GB +2a01:111:f400:51ae::,2a01:111:f400:51bf:ffff:ffff:ffff:ffff,US +2a01:111:f400:51c0::,2a01:111:f400:5236:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5237::,2a01:111:f400:5237:ffff:ffff:ffff:ffff,US +2a01:111:f400:5238::,2a01:111:f400:526a:ffff:ffff:ffff:ffff,GB +2a01:111:f400:526b::,2a01:111:f400:5277:ffff:ffff:ffff:ffff,NL +2a01:111:f400:5278::,2a01:111:f400:527b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:527c::,2a01:111:f400:527c:ffff:ffff:ffff:ffff,IE +2a01:111:f400:527d::,2a01:111:f400:529c:ffff:ffff:ffff:ffff,GB +2a01:111:f400:529d::,2a01:111:f400:52a0:ffff:ffff:ffff:ffff,US +2a01:111:f400:52a1::,2a01:111:f400:52a2:ffff:ffff:ffff:ffff,IE +2a01:111:f400:52a3::,2a01:111:f400:52d7:ffff:ffff:ffff:ffff,GB +2a01:111:f400:52d8::,2a01:111:f400:52df:ffff:ffff:ffff:ffff,US +2a01:111:f400:52e0::,2a01:111:f400:52f6:ffff:ffff:ffff:ffff,GB +2a01:111:f400:52f7::,2a01:111:f400:52f8:ffff:ffff:ffff:ffff,US +2a01:111:f400:52f9::,2a01:111:f400:53ff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5400::,2a01:111:f400:57ff:ffff:ffff:ffff:ffff,JP +2a01:111:f400:5800::,2a01:111:f400:6007:ffff:ffff:ffff:ffff,AU +2a01:111:f400:6008::,2a01:111:f400:6009:ffff:ffff:ffff:ffff,GB +2a01:111:f400:600a::,2a01:111:f400:600b:ffff:ffff:ffff:ffff,US +2a01:111:f400:600c::,2a01:111:f400:600d:ffff:ffff:ffff:ffff,NL +2a01:111:f400:600e::,2a01:111:f400:6019:ffff:ffff:ffff:ffff,US +2a01:111:f400:601a::,2a01:111:f400:601d:ffff:ffff:ffff:ffff,IE +2a01:111:f400:601e::,2a01:111:f400:6021:ffff:ffff:ffff:ffff,US +2a01:111:f400:6022::,2a01:111:f400:6023:ffff:ffff:ffff:ffff,IE +2a01:111:f400:6024::,2a01:111:f400:6029:ffff:ffff:ffff:ffff,US +2a01:111:f400:602a::,2a01:111:f400:602b:ffff:ffff:ffff:ffff,KR +2a01:111:f400:602c::,2a01:111:f400:602f:ffff:ffff:ffff:ffff,GB +2a01:111:f400:6030::,2a01:111:f400:6031:ffff:ffff:ffff:ffff,SG +2a01:111:f400:6032::,2a01:111:f400:6033:ffff:ffff:ffff:ffff,MY +2a01:111:f400:6034::,2a01:111:f400:6035:ffff:ffff:ffff:ffff,HK +2a01:111:f400:6036::,2a01:111:f400:6039:ffff:ffff:ffff:ffff,BR +2a01:111:f400:603a::,2a01:111:f400:603d:ffff:ffff:ffff:ffff,US +2a01:111:f400:603e::,2a01:111:f400:6043:ffff:ffff:ffff:ffff,GB +2a01:111:f400:6044::,2a01:111:f400:6045:ffff:ffff:ffff:ffff,US +2a01:111:f400:6046::,2a01:111:f400:6047:ffff:ffff:ffff:ffff,IN +2a01:111:f400:6048::,2a01:111:f400:6049:ffff:ffff:ffff:ffff,GB +2a01:111:f400:604a::,2a01:111:f400:604d:ffff:ffff:ffff:ffff,US +2a01:111:f400:604e::,2a01:111:f400:6055:ffff:ffff:ffff:ffff,GB +2a01:111:f400:6056::,2a01:111:f400:6059:ffff:ffff:ffff:ffff,IN +2a01:111:f400:605a::,2a01:111:f400:605b:ffff:ffff:ffff:ffff,US +2a01:111:f400:605c::,2a01:111:f400:605d:ffff:ffff:ffff:ffff,IN +2a01:111:f400:605e::,2a01:111:f400:605f:ffff:ffff:ffff:ffff,US +2a01:111:f400:6060::,2a01:111:f400:6061:ffff:ffff:ffff:ffff,GB +2a01:111:f400:6062::,2a01:111:f400:6065:ffff:ffff:ffff:ffff,AT +2a01:111:f400:6066::,2a01:111:f400:6069:ffff:ffff:ffff:ffff,FI +2a01:111:f400:606a::,2a01:111:f400:606b:ffff:ffff:ffff:ffff,DE +2a01:111:f400:606c::,2a01:111:f400:606c:ffff:ffff:ffff:ffff,IN +2a01:111:f400:606d::,2a01:111:f400:606e:ffff:ffff:ffff:ffff,DE +2a01:111:f400:606f::,2a01:111:f400:6070:ffff:ffff:ffff:ffff,IE +2a01:111:f400:6071::,2a01:111:f400:6072:ffff:ffff:ffff:ffff,GB +2a01:111:f400:6073::,2a01:111:f400:6076:ffff:ffff:ffff:ffff,US +2a01:111:f400:6077::,2a01:111:f400:607a:ffff:ffff:ffff:ffff,GB +2a01:111:f400:607b::,2a01:111:f400:607b:ffff:ffff:ffff:ffff,US +2a01:111:f400:607c::,2a01:111:f400:607c:ffff:ffff:ffff:ffff,GB +2a01:111:f400:607d::,2a01:111:f400:607e:ffff:ffff:ffff:ffff,NL +2a01:111:f400:607f::,2a01:111:f400:607f:ffff:ffff:ffff:ffff,KR +2a01:111:f400:6080::,2a01:111:f400:6081:ffff:ffff:ffff:ffff,GB +2a01:111:f400:6082::,2a01:111:f400:6082:ffff:ffff:ffff:ffff,IE +2a01:111:f400:6083::,2a01:111:f400:6083:ffff:ffff:ffff:ffff,AU +2a01:111:f400:6084::,2a01:111:f400:6085:ffff:ffff:ffff:ffff,IE +2a01:111:f400:6086::,2a01:111:f400:6087:ffff:ffff:ffff:ffff,GB +2a01:111:f400:6088::,2a01:111:f400:608b:ffff:ffff:ffff:ffff,US +2a01:111:f400:608c::,2a01:111:f400:608c:ffff:ffff:ffff:ffff,JP +2a01:111:f400:608d::,2a01:111:f400:608e:ffff:ffff:ffff:ffff,US +2a01:111:f400:608f::,2a01:111:f400:608f:ffff:ffff:ffff:ffff,SG +2a01:111:f400:6090::,2a01:111:f400:6090:ffff:ffff:ffff:ffff,GB +2a01:111:f400:6091::,2a01:111:f400:6091:ffff:ffff:ffff:ffff,US +2a01:111:f400:6092::,2a01:111:f400:6093:ffff:ffff:ffff:ffff,GB +2a01:111:f400:6094::,2a01:111:f400:6094:ffff:ffff:ffff:ffff,US +2a01:111:f400:6095::,2a01:111:f400:6095:ffff:ffff:ffff:ffff,BR +2a01:111:f400:6096::,2a01:111:f400:6096:ffff:ffff:ffff:ffff,GB +2a01:111:f400:6097::,2a01:111:f400:6098:ffff:ffff:ffff:ffff,US +2a01:111:f400:6099::,2a01:111:f400:6099:ffff:ffff:ffff:ffff,CL +2a01:111:f400:609a::,2a01:111:f400:60a5:ffff:ffff:ffff:ffff,GB +2a01:111:f400:60a6::,2a01:111:f400:60a6:ffff:ffff:ffff:ffff,BR +2a01:111:f400:60a7::,2a01:111:f400:60a8:ffff:ffff:ffff:ffff,CA +2a01:111:f400:60a9::,2a01:111:f400:60a9:ffff:ffff:ffff:ffff,GB +2a01:111:f400:60aa::,2a01:111:f400:60ab:ffff:ffff:ffff:ffff,DE +2a01:111:f400:60ac::,2a01:111:f400:60ac:ffff:ffff:ffff:ffff,US +2a01:111:f400:60ad::,2a01:111:f400:60ad:ffff:ffff:ffff:ffff,CA +2a01:111:f400:60ae::,2a01:111:f400:60ae:ffff:ffff:ffff:ffff,US +2a01:111:f400:60af::,2a01:111:f400:60b5:ffff:ffff:ffff:ffff,CA +2a01:111:f400:60b6::,2a01:111:f400:60b7:ffff:ffff:ffff:ffff,GB +2a01:111:f400:60b8::,2a01:111:f400:60b8:ffff:ffff:ffff:ffff,DE +2a01:111:f400:60b9::,2a01:111:f400:60b9:ffff:ffff:ffff:ffff,GB +2a01:111:f400:60ba::,2a01:111:f400:60bb:ffff:ffff:ffff:ffff,DE +2a01:111:f400:60bc::,2a01:111:f400:60bd:ffff:ffff:ffff:ffff,JP +2a01:111:f400:60be::,2a01:111:f400:60c2:ffff:ffff:ffff:ffff,GB +2a01:111:f400:60c3::,2a01:111:f400:60c4:ffff:ffff:ffff:ffff,IE +2a01:111:f400:60c5::,2a01:111:f400:707f:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7080::,2a01:111:f400:7080:ffff:ffff:ffff:ffff,US +2a01:111:f400:7081::,2a01:111:f400:7081:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7082::,2a01:111:f400:7084:ffff:ffff:ffff:ffff,US +2a01:111:f400:7085::,2a01:111:f400:7087:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7088::,2a01:111:f400:7089:ffff:ffff:ffff:ffff,AU +2a01:111:f400:708a::,2a01:111:f400:708a:ffff:ffff:ffff:ffff,GB +2a01:111:f400:708b::,2a01:111:f400:7091:ffff:ffff:ffff:ffff,US +2a01:111:f400:7092::,2a01:111:f400:70b1:ffff:ffff:ffff:ffff,GB +2a01:111:f400:70b2::,2a01:111:f400:70b5:ffff:ffff:ffff:ffff,HK +2a01:111:f400:70b6::,2a01:111:f400:70b6:ffff:ffff:ffff:ffff,GB +2a01:111:f400:70b7::,2a01:111:f400:70d1:ffff:ffff:ffff:ffff,HK +2a01:111:f400:70d2::,2a01:111:f400:70e6:ffff:ffff:ffff:ffff,GB +2a01:111:f400:70e7::,2a01:111:f400:7116:ffff:ffff:ffff:ffff,IE +2a01:111:f400:7117::,2a01:111:f400:73ff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7400::,2a01:111:f400:742d:ffff:ffff:ffff:ffff,US +2a01:111:f400:742e::,2a01:111:f400:7431:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7432::,2a01:111:f400:7432:ffff:ffff:ffff:ffff,US +2a01:111:f400:7433::,2a01:111:f400:74ff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7500::,2a01:111:f400:77ff:ffff:ffff:ffff:ffff,US +2a01:111:f400:7800::,2a01:111:f400:7c0f:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7c10::,2a01:111:f400:7c17:ffff:ffff:ffff:ffff,US +2a01:111:f400:7c18::,2a01:111:f400:7c18:ffff:ffff:ffff:ffff,HK +2a01:111:f400:7c19::,2a01:111:f400:7e01:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e02::,2a01:111:f400:7e02:ffff:ffff:ffff:ffff,IE +2a01:111:f400:7e03::,2a01:111:f400:7e04:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e05::,2a01:111:f400:7e05:ffff:ffff:ffff:ffff,FI +2a01:111:f400:7e06::,2a01:111:f400:7e06:ffff:ffff:ffff:ffff,AT +2a01:111:f400:7e07::,2a01:111:f400:7e07:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e08::,2a01:111:f400:7e08:ffff:ffff:ffff:ffff,NL +2a01:111:f400:7e09::,2a01:111:f400:7e09:ffff:ffff:ffff:ffff,AT +2a01:111:f400:7e0a::,2a01:111:f400:7e0a:ffff:ffff:ffff:ffff,IE +2a01:111:f400:7e0b::,2a01:111:f400:7e0b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e0c::,2a01:111:f400:7e0c:ffff:ffff:ffff:ffff,IE +2a01:111:f400:7e0d::,2a01:111:f400:7e0d:ffff:ffff:ffff:ffff,FI +2a01:111:f400:7e0e::,2a01:111:f400:7e0e:ffff:ffff:ffff:ffff,AT +2a01:111:f400:7e0f::,2a01:111:f400:7e1d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e1e::,2a01:111:f400:7e1e:ffff:ffff:ffff:ffff,NL +2a01:111:f400:7e1f::,2a01:111:f400:7e40:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e41::,2a01:111:f400:7e41:ffff:ffff:ffff:ffff,US +2a01:111:f400:7e42::,2a01:111:f400:7e44:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e45::,2a01:111:f400:7e45:ffff:ffff:ffff:ffff,US +2a01:111:f400:7e46::,2a01:111:f400:7e47:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e48::,2a01:111:f400:7e4a:ffff:ffff:ffff:ffff,US +2a01:111:f400:7e4b::,2a01:111:f400:7e4b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e4c::,2a01:111:f400:7e4d:ffff:ffff:ffff:ffff,US +2a01:111:f400:7e4e::,2a01:111:f400:7e4f:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e50::,2a01:111:f400:7e50:ffff:ffff:ffff:ffff,US +2a01:111:f400:7e51::,2a01:111:f400:7e51:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e52::,2a01:111:f400:7e52:ffff:ffff:ffff:ffff,US +2a01:111:f400:7e53::,2a01:111:f400:7e53:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e54::,2a01:111:f400:7e57:ffff:ffff:ffff:ffff,US +2a01:111:f400:7e58::,2a01:111:f400:7e5b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e5c::,2a01:111:f400:7e5d:ffff:ffff:ffff:ffff,CA +2a01:111:f400:7e5e::,2a01:111:f400:7ea3:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7ea4::,2a01:111:f400:7ea7:ffff:ffff:ffff:ffff,IN +2a01:111:f400:7ea8::,2a01:111:f400:7eb3:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7eb4::,2a01:111:f400:7eb5:ffff:ffff:ffff:ffff,AU +2a01:111:f400:7eb6::,2a01:111:f400:7eb7:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7eb8::,2a01:111:f400:7eb8:ffff:ffff:ffff:ffff,HK +2a01:111:f400:7eb9::,2a01:111:f400:7eb9:ffff:ffff:ffff:ffff,SG +2a01:111:f400:7eba::,2a01:111:f400:7ebb:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7ebc::,2a01:111:f400:7ebc:ffff:ffff:ffff:ffff,HK +2a01:111:f400:7ebd::,2a01:111:f400:7ebd:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7ebe::,2a01:111:f400:7ebe:ffff:ffff:ffff:ffff,SG +2a01:111:f400:7ebf::,2a01:111:f400:83ff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:8400::,2a01:111:f400:8bff:ffff:ffff:ffff:ffff,NL +2a01:111:f400:8c00::,2a01:111:f400:8fff:ffff:ffff:ffff:ffff,AT +2a01:111:f400:9000::,2a01:111:f400:9fff:ffff:ffff:ffff:ffff,IE +2a01:111:f400:a000::,2a01:111:f400:a7ff:ffff:ffff:ffff:ffff,HK +2a01:111:f400:a800::,2a01:111:f400:abff:ffff:ffff:ffff:ffff,SG +2a01:111:f400:ac00::,2a01:111:f400:b3ff:ffff:ffff:ffff:ffff,JP +2a01:111:f400:b400::,2a01:111:f400:bbff:ffff:ffff:ffff:ffff,SG +2a01:111:f400:bc00::,2a01:111:f400:bfff:ffff:ffff:ffff:ffff,JP +2a01:111:f400:c000::,2a01:111:f400:c3ff:ffff:ffff:ffff:ffff,FI +2a01:111:f400:c400::,2a01:111:f400:dfff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e000::,2a01:111:f400:e003:ffff:ffff:ffff:ffff,US +2a01:111:f400:e004::,2a01:111:f400:e007:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e008::,2a01:111:f400:e008:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e009::,2a01:111:f400:e009:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e00a::,2a01:111:f400:e00b:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e00c::,2a01:111:f400:e021:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e022::,2a01:111:f400:e023:ffff:ffff:ffff:ffff,HK +2a01:111:f400:e024::,2a01:111:f400:e027:ffff:ffff:ffff:ffff,US +2a01:111:f400:e028::,2a01:111:f400:e04f:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e050::,2a01:111:f400:e050:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e051::,2a01:111:f400:e051:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e052::,2a01:111:f400:e052:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e053::,2a01:111:f400:e053:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e054::,2a01:111:f400:e054:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e055::,2a01:111:f400:e055:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e056::,2a01:111:f400:e056:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e057::,2a01:111:f400:e057:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e058::,2a01:111:f400:e058:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e059::,2a01:111:f400:e059:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e05a::,2a01:111:f400:e05a:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e05b::,2a01:111:f400:e05f:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e060::,2a01:111:f400:e060:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e061::,2a01:111:f400:e061:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e062::,2a01:111:f400:e062:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e063::,2a01:111:f400:e063:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e064::,2a01:111:f400:e064:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e065::,2a01:111:f400:e065:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e066::,2a01:111:f400:e066:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e067::,2a01:111:f400:e067:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e068::,2a01:111:f400:e068:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e069::,2a01:111:f400:e069:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e06a::,2a01:111:f400:e06a:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e06b::,2a01:111:f400:e06b:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e06c::,2a01:111:f400:e06c:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e06d::,2a01:111:f400:e06d:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e06e::,2a01:111:f400:e06e:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e06f::,2a01:111:f400:e06f:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e070::,2a01:111:f400:e070:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e071::,2a01:111:f400:e071:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e072::,2a01:111:f400:e072:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e073::,2a01:111:f400:e073:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e074::,2a01:111:f400:e074:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e075::,2a01:111:f400:e075:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e076::,2a01:111:f400:e076:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e077::,2a01:111:f400:e077:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e078::,2a01:111:f400:e086:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e087::,2a01:111:f400:e087:ffff:ffff:ffff:ffff,US +2a01:111:f400:e088::,2a01:111:f400:e0c7:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0c8::,2a01:111:f400:e0c8:ffff:ffff:ffff:ffff,US +2a01:111:f400:e0c9::,2a01:111:f400:e0c9:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0ca::,2a01:111:f400:e0cc:ffff:ffff:ffff:ffff,US +2a01:111:f400:e0cd::,2a01:111:f400:e0cd:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0ce::,2a01:111:f400:e0d0:ffff:ffff:ffff:ffff,US +2a01:111:f400:e0d1::,2a01:111:f400:e0d1:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0d2::,2a01:111:f400:e0d4:ffff:ffff:ffff:ffff,US +2a01:111:f400:e0d5::,2a01:111:f400:e0d5:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0d6::,2a01:111:f400:e0d8:ffff:ffff:ffff:ffff,US +2a01:111:f400:e0d9::,2a01:111:f400:e0d9:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0da::,2a01:111:f400:e0dc:ffff:ffff:ffff:ffff,US +2a01:111:f400:e0dd::,2a01:111:f400:e0dd:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0de::,2a01:111:f400:e0e0:ffff:ffff:ffff:ffff,US +2a01:111:f400:e0e1::,2a01:111:f400:e0e1:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0e2::,2a01:111:f400:e0e4:ffff:ffff:ffff:ffff,US +2a01:111:f400:e0e5::,2a01:111:f400:e0e5:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0e6::,2a01:111:f400:e0e8:ffff:ffff:ffff:ffff,US +2a01:111:f400:e0e9::,2a01:111:f400:e0e9:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0ea::,2a01:111:f400:e0ec:ffff:ffff:ffff:ffff,US +2a01:111:f400:e0ed::,2a01:111:f400:e0ed:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0ee::,2a01:111:f400:e0ef:ffff:ffff:ffff:ffff,US +2a01:111:f400:e0f0::,2a01:111:f400:e0f1:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e0f2::,2a01:111:f400:e0f2:ffff:ffff:ffff:ffff,KR +2a01:111:f400:e0f3::,2a01:111:f400:e0f3:ffff:ffff:ffff:ffff,MY +2a01:111:f400:e0f4::,2a01:111:f400:e0f4:ffff:ffff:ffff:ffff,KR +2a01:111:f400:e0f5::,2a01:111:f400:e0f5:ffff:ffff:ffff:ffff,MY +2a01:111:f400:e0f6::,2a01:111:f400:e147:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e148::,2a01:111:f400:e148:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e149::,2a01:111:f400:e163:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e164::,2a01:111:f400:e164:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e165::,2a01:111:f400:e1bf:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e1c0::,2a01:111:f400:e1c0:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e1c1::,2a01:111:f400:e1d3:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e1d4::,2a01:111:f400:e1d4:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e1d5::,2a01:111:f400:e232:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e233::,2a01:111:f400:e235:ffff:ffff:ffff:ffff,HK +2a01:111:f400:e236::,2a01:111:f400:e237:ffff:ffff:ffff:ffff,SG +2a01:111:f400:e238::,2a01:111:f400:e283:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e284::,2a01:111:f400:e287:ffff:ffff:ffff:ffff,US +2a01:111:f400:e288::,2a01:111:f400:e288:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e289::,2a01:111:f400:e289:ffff:ffff:ffff:ffff,HK +2a01:111:f400:e28a::,2a01:111:f400:e28b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e28c::,2a01:111:f400:e28c:ffff:ffff:ffff:ffff,SG +2a01:111:f400:e28d::,2a01:111:f400:e28d:ffff:ffff:ffff:ffff,HK +2a01:111:f400:e28e::,2a01:111:f400:e28f:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e290::,2a01:111:f400:e2b7:ffff:ffff:ffff:ffff,US +2a01:111:f400:e2b8::,2a01:111:f400:e2b9:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e2ba::,2a01:111:f400:e2cb:ffff:ffff:ffff:ffff,US +2a01:111:f400:e2cc::,2a01:111:f400:e2cd:ffff:ffff:ffff:ffff,HK +2a01:111:f400:e2ce::,2a01:111:f400:e2ce:ffff:ffff:ffff:ffff,US +2a01:111:f400:e2cf::,2a01:111:f400:e2cf:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e2d0::,2a01:111:f400:e2d3:ffff:ffff:ffff:ffff,US +2a01:111:f400:e2d4::,2a01:111:f400:e2d5:ffff:ffff:ffff:ffff,HK +2a01:111:f400:e2d6::,2a01:111:f400:e2d7:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e2d8::,2a01:111:f400:e2d9:ffff:ffff:ffff:ffff,HK +2a01:111:f400:e2da::,2a01:111:f400:e2db:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e2dc::,2a01:111:f400:e2dd:ffff:ffff:ffff:ffff,HK +2a01:111:f400:e2de::,2a01:111:f400:e2df:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e2e0::,2a01:111:f400:e2eb:ffff:ffff:ffff:ffff,US +2a01:111:f400:e2ec::,2a01:111:f400:e2ec:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e2ed::,2a01:111:f400:e2ed:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e2ee::,2a01:111:f400:e2ee:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e2ef::,2a01:111:f400:e2ef:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e2f0::,2a01:111:f400:e2f0:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e2f1::,2a01:111:f400:e2f1:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e2f2::,2a01:111:f400:e2f2:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e2f3::,2a01:111:f400:e2f3:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e2f4::,2a01:111:f400:e2f4:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e2f5::,2a01:111:f400:e2f5:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e2f6::,2a01:111:f400:e2f6:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e2f7::,2a01:111:f400:e2f7:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e2f8::,2a01:111:f400:e2f8:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e2f9::,2a01:111:f400:e2f9:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e2fa::,2a01:111:f400:e2fa:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e2fb::,2a01:111:f400:e2fb:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e2fc::,2a01:111:f400:e2fc:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e2fd::,2a01:111:f400:e2fd:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e2fe::,2a01:111:f400:e2fe:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e2ff::,2a01:111:f400:e2ff:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e300::,2a01:111:f400:e300:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e301::,2a01:111:f400:e301:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e302::,2a01:111:f400:e302:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e303::,2a01:111:f400:e303:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e304::,2a01:111:f400:e304:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e305::,2a01:111:f400:e305:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e306::,2a01:111:f400:e306:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e307::,2a01:111:f400:e307:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e308::,2a01:111:f400:e308:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e309::,2a01:111:f400:e309:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e30a::,2a01:111:f400:e30a:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e30b::,2a01:111:f400:e30b:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e30c::,2a01:111:f400:e30c:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e30d::,2a01:111:f400:e30d:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e30e::,2a01:111:f400:e30e:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e30f::,2a01:111:f400:e30f:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e310::,2a01:111:f400:e310:ffff:ffff:ffff:ffff,FI +2a01:111:f400:e311::,2a01:111:f400:e311:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e312::,2a01:111:f400:e312:ffff:ffff:ffff:ffff,AT +2a01:111:f400:e313::,2a01:111:f400:e313:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e314::,2a01:111:f400:e33f:ffff:ffff:ffff:ffff,US +2a01:111:f400:e340::,2a01:111:f400:e340:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e341::,2a01:111:f400:e341:ffff:ffff:ffff:ffff,US +2a01:111:f400:e342::,2a01:111:f400:e343:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e344::,2a01:111:f400:e344:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e345::,2a01:111:f400:e345:ffff:ffff:ffff:ffff,US +2a01:111:f400:e346::,2a01:111:f400:e347:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e348::,2a01:111:f400:e349:ffff:ffff:ffff:ffff,HK +2a01:111:f400:e34a::,2a01:111:f400:e35b:ffff:ffff:ffff:ffff,US +2a01:111:f400:e35c::,2a01:111:f400:e35c:ffff:ffff:ffff:ffff,NL +2a01:111:f400:e35d::,2a01:111:f400:e35d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:e35e::,2a01:111:f400:e35f:ffff:ffff:ffff:ffff,IE +2a01:111:f400:e360::,2a01:111:f400:f34c:ffff:ffff:ffff:ffff,GB +2a01:111:f400:f34d::,2a01:111:f400:f34d:ffff:ffff:ffff:ffff,US +2a01:111:f400:f34e::,2a01:111:f400:f35a:ffff:ffff:ffff:ffff,GB +2a01:111:f400:f35b::,2a01:111:f400:f361:ffff:ffff:ffff:ffff,US +2a01:111:f400:f362::,2a01:111:f400:f367:ffff:ffff:ffff:ffff,GB +2a01:111:f400:f368::,2a01:111:f400:f36c:ffff:ffff:ffff:ffff,NL +2a01:111:f400:f36d::,2a01:111:f400:f37f:ffff:ffff:ffff:ffff,GB +2a01:111:f400:f380::,2a01:111:f400:f380:ffff:ffff:ffff:ffff,FI +2a01:111:f400:f381::,2a01:111:f400:f381:ffff:ffff:ffff:ffff,AT +2a01:111:f400:f382::,2a01:111:f400:f500:ffff:ffff:ffff:ffff,GB +2a01:111:f400:f501::,2a01:111:f400:f506:ffff:ffff:ffff:ffff,NL +2a01:111:f400:f507::,2a01:111:f400:f510:ffff:ffff:ffff:ffff,GB +2a01:111:f400:f511::,2a01:111:f400:f531:ffff:ffff:ffff:ffff,US +2a01:111:f400:f532::,2a01:111:f400:f53f:ffff:ffff:ffff:ffff,IE +2a01:111:f400:f540::,2a01:111:f400:f543:ffff:ffff:ffff:ffff,US +2a01:111:f400:f544::,2a01:111:f400:f547:ffff:ffff:ffff:ffff,BR +2a01:111:f400:f548::,2a01:111:f400:f54e:ffff:ffff:ffff:ffff,HK +2a01:111:f400:f54f::,2a01:111:f400:f554:ffff:ffff:ffff:ffff,JP +2a01:111:f400:f555::,2a01:111:f400:f556:ffff:ffff:ffff:ffff,SG +2a01:111:f400:f557::,2a01:111:f400:f55e:ffff:ffff:ffff:ffff,GB +2a01:111:f400:f55f::,2a01:111:f400:f566:ffff:ffff:ffff:ffff,US +2a01:111:f400:f567::,2a01:111:f400:f568:ffff:ffff:ffff:ffff,JP +2a01:111:f400:f569::,2a01:111:f400:f56a:ffff:ffff:ffff:ffff,GB +2a01:111:f400:f56b::,2a01:111:f400:f572:ffff:ffff:ffff:ffff,US +2a01:111:f400:f573::,2a01:111:f400:f574:ffff:ffff:ffff:ffff,IE +2a01:111:f400:f575::,2a01:111:f400:f576:ffff:ffff:ffff:ffff,US +2a01:111:f400:f577::,2a01:111:f400:f578:ffff:ffff:ffff:ffff,FI +2a01:111:f400:f579::,2a01:111:f400:f57a:ffff:ffff:ffff:ffff,AT +2a01:111:f400:f57b::,2a01:111:f400:f57c:ffff:ffff:ffff:ffff,BR +2a01:111:f400:f57d::,2a01:111:f400:f57e:ffff:ffff:ffff:ffff,US +2a01:111:f400:f57f::,2a01:111:f400:f580:ffff:ffff:ffff:ffff,HK +2a01:111:f400:f581::,2a01:111:f400:fc0f:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fc10::,2a01:111:f400:fc13:ffff:ffff:ffff:ffff,US +2a01:111:f400:fc14::,2a01:111:f400:fc17:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fc18::,2a01:111:f400:fc1b:ffff:ffff:ffff:ffff,HK +2a01:111:f400:fc1c::,2a01:111:f400:fc1c:ffff:ffff:ffff:ffff,IE +2a01:111:f400:fc1d::,2a01:111:f400:fe01:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fe02::,2a01:111:f400:fe02:ffff:ffff:ffff:ffff,IE +2a01:111:f400:fe03::,2a01:111:f400:fe03:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fe04::,2a01:111:f400:fe04:ffff:ffff:ffff:ffff,IE +2a01:111:f400:fe05::,2a01:111:f400:fe05:ffff:ffff:ffff:ffff,FI +2a01:111:f400:fe06::,2a01:111:f400:fe06:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fe07::,2a01:111:f400:fe08:ffff:ffff:ffff:ffff,NL +2a01:111:f400:fe09::,2a01:111:f400:fe09:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fe0a::,2a01:111:f400:fe0a:ffff:ffff:ffff:ffff,IE +2a01:111:f400:fe0b::,2a01:111:f400:fe40:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fe41::,2a01:111:f400:fe41:ffff:ffff:ffff:ffff,US +2a01:111:f400:fe42::,2a01:111:f400:fe44:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fe45::,2a01:111:f400:fe46:ffff:ffff:ffff:ffff,US +2a01:111:f400:fe47::,2a01:111:f400:fe47:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fe48::,2a01:111:f400:fe57:ffff:ffff:ffff:ffff,US +2a01:111:f400:fe58::,2a01:111:f400:fe5b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fe5c::,2a01:111:f400:fe5d:ffff:ffff:ffff:ffff,CA +2a01:111:f400:fe5e::,2a01:111:f400:fe9b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fe9c::,2a01:111:f400:fe9f:ffff:ffff:ffff:ffff,JP +2a01:111:f400:fea0::,2a01:111:f400:fea3:ffff:ffff:ffff:ffff,GB +2a01:111:f400:fea4::,2a01:111:f400:fea7:ffff:ffff:ffff:ffff,IN +2a01:111:f400:fea8::,2a01:111:f400:feb7:ffff:ffff:ffff:ffff,GB +2a01:111:f400:feb8::,2a01:111:f400:febb:ffff:ffff:ffff:ffff,MY +2a01:111:f400:febc::,2a01:111:f400:febc:ffff:ffff:ffff:ffff,GB +2a01:111:f400:febd::,2a01:111:f400:febd:ffff:ffff:ffff:ffff,SG +2a01:111:f400:febe::,2a01:111:f400:febe:ffff:ffff:ffff:ffff,KR +2a01:111:f400:febf::,2a01:111:f400:feff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ff00::,2a01:111:f400:ff03:ffff:ffff:ffff:ffff,NL +2a01:111:f400:ff04::,2a01:111:f400:ff06:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ff07::,2a01:111:f400:ff07:ffff:ffff:ffff:ffff,IE +2a01:111:f400:ff08::,2a01:111:f400:ff3f:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ff40::,2a01:111:f400:ff42:ffff:ffff:ffff:ffff,US +2a01:111:f400:ff43::,2a01:111:f400:ff43:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ff44::,2a01:111:f400:ff46:ffff:ffff:ffff:ffff,US +2a01:111:f400:ff47::,2a01:111:f400:ff8b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ff8c::,2a01:111:f400:ff8c:ffff:ffff:ffff:ffff,HK +2a01:111:f400:ff8d::,2a01:111:f400:ff8d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ff8e::,2a01:111:f400:ff8e:ffff:ffff:ffff:ffff,HK +2a01:111:f400:ff8f::,2a01:111:f400:ff8f:ffff:ffff:ffff:ffff,SG +2a01:111:f400:ff90::,2a01:111:f400:ffc2:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ffc3::,2a01:111:f400:ffc3:ffff:ffff:ffff:ffff,IE +2a01:111:f400:ffc4::,2a01:111:f400:ffcb:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ffcc::,2a01:111:f400:ffcc:ffff:ffff:ffff:ffff,FI +2a01:111:f400:ffcd::,2a01:111:f400:ffe7:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ffe8::,2a01:111:f400:ffe9:ffff:ffff:ffff:ffff,US +2a01:111:f400:ffea::,2a01:111:f400:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f401::,2a01:111:f401::ffff:ffff:ffff:ffff,US +2a01:111:f401:1::,2a01:111:f401:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f402::,2a01:111:f402:7ff:ffff:ffff:ffff:ffff,US +2a01:111:f402:800::,2a01:111:f402:bff:ffff:ffff:ffff:ffff,JP +2a01:111:f402:c00::,2a01:111:f402:c01:ffff:ffff:ffff:ffff,GB +2a01:111:f402:c02::,2a01:111:f402:c03:ffff:ffff:ffff:ffff,US +2a01:111:f402:c04::,2a01:111:f402:1001:ffff:ffff:ffff:ffff,GB +2a01:111:f402:1002::,2a01:111:f402:1002:ffff:ffff:ffff:ffff,US +2a01:111:f402:1003::,2a01:111:f402:13ff:ffff:ffff:ffff:ffff,GB +2a01:111:f402:1400::,2a01:111:f402:1800:ffff:ffff:ffff:ffff,US +2a01:111:f402:1801::,2a01:111:f402:180b:ffff:ffff:ffff:ffff,GB +2a01:111:f402:180c::,2a01:111:f402:180c:ffff:ffff:ffff:ffff,US +2a01:111:f402:180d::,2a01:111:f402:180d:ffff:ffff:ffff:ffff,GB +2a01:111:f402:180e::,2a01:111:f402:180e:ffff:ffff:ffff:ffff,US +2a01:111:f402:180f::,2a01:111:f402:1fff:ffff:ffff:ffff:ffff,GB +2a01:111:f402:2000::,2a01:111:f402:23ff:ffff:ffff:ffff:ffff,NL +2a01:111:f402:2400::,2a01:111:f402:27ff:ffff:ffff:ffff:ffff,US +2a01:111:f402:2800::,2a01:111:f402:2bff:ffff:ffff:ffff:ffff,IE +2a01:111:f402:2c00::,2a01:111:f402:3bff:ffff:ffff:ffff:ffff,US +2a01:111:f402:3c00::,2a01:111:f402:3fff:ffff:ffff:ffff:ffff,BR +2a01:111:f402:4000::,2a01:111:f402:43ff:ffff:ffff:ffff:ffff,US +2a01:111:f402:4400::,2a01:111:f402:4bff:ffff:ffff:ffff:ffff,KR +2a01:111:f402:4c00::,2a01:111:f402:4fff:ffff:ffff:ffff:ffff,GB +2a01:111:f402:5000::,2a01:111:f402:53ff:ffff:ffff:ffff:ffff,IN +2a01:111:f402:5400::,2a01:111:f402:57ff:ffff:ffff:ffff:ffff,JP +2a01:111:f402:5800::,2a01:111:f402:5bff:ffff:ffff:ffff:ffff,NL +2a01:111:f402:5c00::,2a01:111:f402:5fff:ffff:ffff:ffff:ffff,AU +2a01:111:f402:6000::,2a01:111:f402:63ff:ffff:ffff:ffff:ffff,JP +2a01:111:f402:6400::,2a01:111:f402:6fff:ffff:ffff:ffff:ffff,GB +2a01:111:f402:7000::,2a01:111:f402:77ff:ffff:ffff:ffff:ffff,AU +2a01:111:f402:7800::,2a01:111:f402:7bff:ffff:ffff:ffff:ffff,US +2a01:111:f402:7c00::,2a01:111:f402:7fff:ffff:ffff:ffff:ffff,IE +2a01:111:f402:8000::,2a01:111:f402:83ff:ffff:ffff:ffff:ffff,GB +2a01:111:f402:8400::,2a01:111:f402:8bff:ffff:ffff:ffff:ffff,NL +2a01:111:f402:8c00::,2a01:111:f402:8fff:ffff:ffff:ffff:ffff,US +2a01:111:f402:9000::,2a01:111:f402:93ff:ffff:ffff:ffff:ffff,AU +2a01:111:f402:9400::,2a01:111:f402:97ff:ffff:ffff:ffff:ffff,IE +2a01:111:f402:9800::,2a01:111:f402:9bff:ffff:ffff:ffff:ffff,US +2a01:111:f402:9c00::,2a01:111:f402:9fff:ffff:ffff:ffff:ffff,IE +2a01:111:f402:a000::,2a01:111:f402:a3ff:ffff:ffff:ffff:ffff,HK +2a01:111:f402:a400::,2a01:111:f402:a7ff:ffff:ffff:ffff:ffff,US +2a01:111:f402:a800::,2a01:111:f402:a802:ffff:ffff:ffff:ffff,GB +2a01:111:f402:a803::,2a01:111:f402:a803:ffff:ffff:ffff:ffff,SG +2a01:111:f402:a804::,2a01:111:f402:a805:ffff:ffff:ffff:ffff,GB +2a01:111:f402:a806::,2a01:111:f402:a806:ffff:ffff:ffff:ffff,SG +2a01:111:f402:a807::,2a01:111:f402:abff:ffff:ffff:ffff:ffff,GB +2a01:111:f402:ac00::,2a01:111:f402:afff:ffff:ffff:ffff:ffff,NL +2a01:111:f402:b000::,2a01:111:f402:b3ff:ffff:ffff:ffff:ffff,GB +2a01:111:f402:b400::,2a01:111:f402:b402:ffff:ffff:ffff:ffff,SG +2a01:111:f402:b403::,2a01:111:f402:b404:ffff:ffff:ffff:ffff,GB +2a01:111:f402:b405::,2a01:111:f402:b405:ffff:ffff:ffff:ffff,SG +2a01:111:f402:b406::,2a01:111:f402:b7ff:ffff:ffff:ffff:ffff,GB +2a01:111:f402:b800::,2a01:111:f402:bbff:ffff:ffff:ffff:ffff,FR +2a01:111:f402:bc00::,2a01:111:f402:bfff:ffff:ffff:ffff:ffff,JP +2a01:111:f402:c000::,2a01:111:f402:c3ff:ffff:ffff:ffff:ffff,FR +2a01:111:f402:c400::,2a01:111:f402:cbff:ffff:ffff:ffff:ffff,US +2a01:111:f402:cc00::,2a01:111:f402:cfff:ffff:ffff:ffff:ffff,IN +2a01:111:f402:d000::,2a01:111:f404:c05:ffff:ffff:ffff:ffff,GB +2a01:111:f404:c06::,2a01:111:f404:c0a:ffff:ffff:ffff:ffff,US +2a01:111:f404:c0b::,2a01:111:f404:33ff:ffff:ffff:ffff:ffff,GB +2a01:111:f404:3400::,2a01:111:f404:37ff:ffff:ffff:ffff:ffff,US +2a01:111:f404:3800::,2a01:111:f404:93ff:ffff:ffff:ffff:ffff,GB +2a01:111:f404:9400::,2a01:111:f404:97ff:ffff:ffff:ffff:ffff,IE +2a01:111:f404:9800::,2a01:111:f404:a7ff:ffff:ffff:ffff:ffff,GB +2a01:111:f404:a800::,2a01:111:f404:abff:ffff:ffff:ffff:ffff,SG +2a01:111:f404:ac00::,2a01:111:f405:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f406::,2a01:111:f406:3ff:ffff:ffff:ffff:ffff,IE +2a01:111:f406:400::,2a01:111:f406:7ff:ffff:ffff:ffff:ffff,US +2a01:111:f406:800::,2a01:111:f406:800:ffff:ffff:ffff:ffff,NL +2a01:111:f406:801::,2a01:111:f406:bff:ffff:ffff:ffff:ffff,GB +2a01:111:f406:c00::,2a01:111:f406:fff:ffff:ffff:ffff:ffff,US +2a01:111:f406:1000::,2a01:111:f406:1003:ffff:ffff:ffff:ffff,GB +2a01:111:f406:1004::,2a01:111:f406:1005:ffff:ffff:ffff:ffff,US +2a01:111:f406:1006::,2a01:111:f406:1006:ffff:ffff:ffff:ffff,GB +2a01:111:f406:1007::,2a01:111:f406:1007:ffff:ffff:ffff:ffff,US +2a01:111:f406:1008::,2a01:111:f406:13ff:ffff:ffff:ffff:ffff,GB +2a01:111:f406:1400::,2a01:111:f406:1400:ffff:ffff:ffff:ffff,IE +2a01:111:f406:1401::,2a01:111:f406:1804:ffff:ffff:ffff:ffff,GB +2a01:111:f406:1805::,2a01:111:f406:1805:ffff:ffff:ffff:ffff,US +2a01:111:f406:1806::,2a01:111:f406:1806:ffff:ffff:ffff:ffff,GB +2a01:111:f406:1807::,2a01:111:f406:180b:ffff:ffff:ffff:ffff,US +2a01:111:f406:180c::,2a01:111:f406:1bff:ffff:ffff:ffff:ffff,GB +2a01:111:f406:1c00::,2a01:111:f406:1c00:ffff:ffff:ffff:ffff,US +2a01:111:f406:1c01::,2a01:111:f406:1c01:ffff:ffff:ffff:ffff,BR +2a01:111:f406:1c02::,2a01:111:f406:23ff:ffff:ffff:ffff:ffff,GB +2a01:111:f406:2400::,2a01:111:f406:27ff:ffff:ffff:ffff:ffff,US +2a01:111:f406:2800::,2a01:111:f406:2fff:ffff:ffff:ffff:ffff,GB +2a01:111:f406:3000::,2a01:111:f406:33ff:ffff:ffff:ffff:ffff,US +2a01:111:f406:3400::,2a01:111:f406:3403:ffff:ffff:ffff:ffff,GB +2a01:111:f406:3404::,2a01:111:f406:3404:ffff:ffff:ffff:ffff,US +2a01:111:f406:3405::,2a01:111:f406:87ff:ffff:ffff:ffff:ffff,GB +2a01:111:f406:8800::,2a01:111:f406:8bff:ffff:ffff:ffff:ffff,NL +2a01:111:f406:8c00::,2a01:111:f406:93ff:ffff:ffff:ffff:ffff,GB +2a01:111:f406:9400::,2a01:111:f406:97ff:ffff:ffff:ffff:ffff,IE +2a01:111:f406:9800::,2a01:111:f406:9fff:ffff:ffff:ffff:ffff,GB +2a01:111:f406:a000::,2a01:111:f406:a001:ffff:ffff:ffff:ffff,HK +2a01:111:f406:a002::,2a01:111:f406:a002:ffff:ffff:ffff:ffff,IE +2a01:111:f406:a003::,2a01:111:f406:a003:ffff:ffff:ffff:ffff,HK +2a01:111:f406:a004::,2a01:111:f406:a804:ffff:ffff:ffff:ffff,GB +2a01:111:f406:a805::,2a01:111:f406:a805:ffff:ffff:ffff:ffff,SG +2a01:111:f406:a806::,2a01:111:f406:afff:ffff:ffff:ffff:ffff,GB +2a01:111:f406:b000::,2a01:111:f406:b3ff:ffff:ffff:ffff:ffff,JP +2a01:111:f406:b400::,2a01:111:f406:b7ff:ffff:ffff:ffff:ffff,SG +2a01:111:f406:b800::,2a01:111:f4ff:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f500::,2a01:111:f5ff:ffff:ffff:ffff:ffff:ffff,US +2a01:111:f600::,2a01:111:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:120::,2a01:127:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:130::,2a01:138:a01c:ffff:ffff:ffff:ffff:ffff,DE +2a01:138:a01d::,2a01:138:a01d:ffff:ffff:ffff:ffff:ffff,CH +2a01:138:a01e::,2a01:13f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:140::,2a01:147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:148::,2a01:14f:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:150::,2a01:150:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:158::,2a01:158:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a01:160::,2a01:160:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:168::,2a01:168:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:170::,2a01:170:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:178::,2a01:178:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:180::,2a01:187:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a01:188::,2a01:188:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:190::,2a01:197:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:198::,2a01:198:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:1a0::,2a01:1a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:1a8::,2a01:1a8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:1b0::,2a01:1b0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:1b8::,2a01:1b8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:1c0::,2a01:1c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:1c8::,2a01:1cf:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:1d0::,2a01:1d7:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a01:1d8::,2a01:1df:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:1e0::,2a01:1e0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:1e8::,2a01:1e8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:1f0::,2a01:1f0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:1f8::,2a01:1f8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:200::,2a01:200:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:208::,2a01:208:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:210::,2a01:210:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:220::,2a01:220:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:228::,2a01:228:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:230::,2a01:230:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:238::,2a01:23f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:240::,2a01:240:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:248::,2a01:248:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:250::,2a01:250:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:258::,2a01:258:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:260::,2a01:267:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a01:268::,2a01:268:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:270::,2a01:270:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:278::,2a01:27f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:280::,2a01:287:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:288::,2a01:288:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:290::,2a01:290:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:298::,2a01:29f:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:2a0::,2a01:2a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:2a8::,2a01:2af:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:2b0::,2a01:2b0:2000:112:ffff:ffff:ffff:ffff,SE +2a01:2b0:2000:113::,2a01:2b0:2000:113:ffff:ffff:ffff:ffff,FI +2a01:2b0:2000:114::,2a01:2b7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:2b8::,2a01:2b8:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a01:2c0::,2a01:2c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:2c8::,2a01:2c8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:2d0::,2a01:2d0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:2d8::,2a01:2df:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:2e0::,2a01:2ef:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:300:1::,2a01:300:1:7fff:ffff:ffff:ffff:ffff,FR +2a01:308::,2a01:308:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:310::,2a01:310:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:320::,2a01:327:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a01:328::,2a01:328:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:330::,2a01:330:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:338::,2a01:338:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:348::,2a01:348:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:350::,2a01:350:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:358::,2a01:35f:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:360::,2a01:367:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:368::,2a01:36f:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:378::,2a01:378:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:380::,2a01:380:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:388::,2a01:388:24e:ffff:ffff:ffff:ffff:ffff,GB +2a01:388:24f::,2a01:388:24f:7fff:ffff:ffff:ffff:ffff,NL +2a01:388:24f:8000::,2a01:388:250:ffff:ffff:ffff:ffff:ffff,GB +2a01:388:251::,2a01:388:251:7fff:ffff:ffff:ffff:ffff,NL +2a01:388:251:8000::,2a01:388:473:ffff:ffff:ffff:ffff:ffff,GB +2a01:388:474::,2a01:388:474:7fff:ffff:ffff:ffff:ffff,NL +2a01:388:474:8000::,2a01:38f:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:390::,2a01:397:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:398::,2a01:398:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:3a0::,2a01:3a7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:3a8::,2a01:3a8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:3b8::,2a01:3b8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:3c8::,2a01:3c8:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:3d8::,2a01:3d8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:3e0:402::,2a01:3e0:403:ffff:ffff:ffff:ffff:ffff,FR +2a01:3e0:501::,2a01:3e0:501:ffff:ffff:ffff:ffff:ffff,RU +2a01:3e0:502::,2a01:3e0:502:ffff:ffff:ffff:ffff:ffff,DE +2a01:3e0:701::,2a01:3e0:701:ffff:ffff:ffff:ffff:ffff,GB +2a01:3e0:801::,2a01:3e0:801:ffff:ffff:ffff:ffff:ffff,FR +2a01:3e0:d01::,2a01:3e0:d02:ffff:ffff:ffff:ffff:ffff,GB +2a01:3e0:1101::,2a01:3e0:1101:ffff:ffff:ffff:ffff:ffff,NL +2a01:3e0:1200::,2a01:3e0:1200:1ff:ffff:ffff:ffff:ffff,FR +2a01:3e0:1300::,2a01:3e0:1300:ff:ffff:ffff:ffff:ffff,GB +2a01:3e0:1400::,2a01:3e0:1400:ff:ffff:ffff:ffff:ffff,NL +2a01:3e0:1500::,2a01:3e0:1500:ff:ffff:ffff:ffff:ffff,GB +2a01:3e0:1501::,2a01:3e0:1501:ffff:ffff:ffff:ffff:ffff,GB +2a01:3e0:1600::,2a01:3e0:1600:ffff:ffff:ffff:ffff:ffff,GB +2a01:3e0:1601::,2a01:3e0:1601:ffff:ffff:ffff:ffff:ffff,FI +2a01:3e0:1700::,2a01:3e0:1701:ff:ffff:ffff:ffff:ffff,GB +2a01:3e0:1b00::,2a01:3e0:1b00:ffff:ffff:ffff:ffff:ffff,FI +2a01:3e0:1d00::,2a01:3e0:1d00:ff:ffff:ffff:ffff:ffff,CH +2a01:3e0:3200::,2a01:3e0:3200:ff:ffff:ffff:ffff:ffff,RO +2a01:3e0:3300::,2a01:3e0:3300:ff:ffff:ffff:ffff:ffff,BG +2a01:3e0:3400::,2a01:3e0:3400:ff:ffff:ffff:ffff:ffff,HU +2a01:3e0:3500::,2a01:3e0:3500:ff:ffff:ffff:ffff:ffff,LU +2a01:3e0:3600::,2a01:3e0:3600:1ff:ffff:ffff:ffff:ffff,SA +2a01:3e0:3700::,2a01:3e0:3700:ff:ffff:ffff:ffff:ffff,SA +2a01:3e0:ff24::,2a01:3e0:ff25:ffff:ffff:ffff:ffff:ffff,DE +2a01:3e8::,2a01:3e8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:3f0::,2a01:3f7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:3f8::,2a01:3f8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:400::,2a01:400:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:408::,2a01:408:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:410::,2a01:410:1:ffff:ffff:ffff:ffff:ffff,GB +2a01:410:2::,2a01:410:2:7fff:ffff:ffff:ffff:ffff,ZM +2a01:410:2:8000::,2a01:410:108:ffff:ffff:ffff:ffff:ffff,GB +2a01:410:109::,2a01:410:109:7fff:ffff:ffff:ffff:ffff,ZW +2a01:410:109:8000::,2a01:410:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:418::,2a01:418:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:420::,2a01:420:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:428::,2a01:428:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:430::,2a01:430:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:438::,2a01:438:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:440::,2a01:447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:448::,2a01:448:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:450::,2a01:450:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:458::,2a01:458:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:460::,2a01:460:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:468::,2a01:46f:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:470::,2a01:477:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:478::,2a01:47f:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a01:480::,2a01:480:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:488::,2a01:488:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:490::,2a01:490:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:498::,2a01:498:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:4a0::,2a01:4a0:2c:ffff:ffff:ffff:ffff:ffff,DE +2a01:4a0:2d::,2a01:4a0:2d:7fff:ffff:ffff:ffff:ffff,CH +2a01:4a0:2d:8000::,2a01:4a0:2d:ffff:ffff:ffff:ffff:ffff,DE +2a01:4a0:2e::,2a01:4a0:2e:7fff:ffff:ffff:ffff:ffff,CZ +2a01:4a0:2e:8000::,2a01:4af:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4b0::,2a01:4b0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:4c0::,2a01:4c0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:4c8::,2a01:4cf:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4d0::,2a01:4d0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4d8::,2a01:4d8:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:4e0::,2a01:4e7:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a01:4e8::,2a01:4e8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4f0::,2a01:4f0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:4f8::,2a01:4f8:bc:ffff:ffff:ffff:ffff:ffff,DE +2a01:4f8:bd::,2a01:4f8:bd:7fff:ffff:ffff:ffff:ffff,NL +2a01:4f8:bd:8000::,2a01:4ff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:500::,2a01:500:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:508::,2a01:508:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:510::,2a01:510:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:518::,2a01:518:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:520::,2a01:520:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:528::,2a01:528:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:530::,2a01:530:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:538::,2a01:538:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:540::,2a01:540:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:548::,2a01:548:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:550::,2a01:550:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:558::,2a01:558:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:560::,2a01:567:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:568::,2a01:570:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:578::,2a01:578::6fff:ffff:ffff:ffff:ffff,US +2a01:578:0:7000::,2a01:578::70ff:ffff:ffff:ffff:ffff,IE +2a01:578:0:7100::,2a01:578::71ff:ffff:ffff:ffff:ffff,DE +2a01:578:0:7200::,2a01:578::72ff:ffff:ffff:ffff:ffff,GB +2a01:578:0:7300::,2a01:578:2:ffff:ffff:ffff:ffff:ffff,US +2a01:578:3::,2a01:578:3::ffff:ffff:ffff:ffff,IE +2a01:578:3:1::,2a01:578:12:ffff:ffff:ffff:ffff:ffff,US +2a01:578:13::,2a01:578:13::ffff:ffff:ffff:ffff,DE +2a01:578:13:1::,2a01:578:ffff:ffff:ffff:ffff:ffff:ffff,US +2a01:580::,2a01:580:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:590::,2a01:590:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:598::,2a01:59f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:5a0::,2a01:5a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5a8::,2a01:5a8:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:5b0::,2a01:5b0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:5b8::,2a01:5bf:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a01:5c0::,2a01:5c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:5c8::,2a01:5c8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:5d0::,2a01:5d0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:5d8::,2a01:5df:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:5e0::,2a01:5e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:5f0::,2a01:5f7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:600::,2a01:600:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:608::,2a01:608:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a01:610::,2a01:610:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:618::,2a01:618:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:620::,2a01:620:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:628::,2a01:628:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:630::,2a01:630:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:640::,2a01:647:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a01:648::,2a01:648:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:650::,2a01:650:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:658::,2a01:658:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:660::,2a01:667:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:668::,2a01:668:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:670::,2a01:670:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:678::,2a01:67f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:680::,2a01:680:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:688::,2a01:688:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:690::,2a01:697:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:698::,2a01:698:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:6a0::,2a01:6a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:6a8::,2a01:6a8:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:6b0::,2a01:6b0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:6c0::,2a01:6c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:6c8::,2a01:6c8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6d0::,2a01:6d0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:6d8::,2a01:6d8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:6e0::,2a01:6e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6e8::,2a01:6e8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6f0::,2a01:6f0:fffe:ffff:ffff:ffff:ffff:ffff,DE +2a01:6f0:ffff::,2a01:6f0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:6f8::,2a01:6f8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:700::,2a01:700:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:710::,2a01:710:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:718::,2a01:718:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:720::,2a01:720:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:728::,2a01:72f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:730::,2a01:730:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:738::,2a01:738:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:740::,2a01:740:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:750::,2a01:750:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:758::,2a01:758:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:760::,2a01:760:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:768::,2a01:768:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:770::,2a01:770:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:778::,2a01:778:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:780::,2a01:780:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:788::,2a01:788:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:790::,2a01:790:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:798::,2a01:79e:7be3:7fff:ffff:ffff:ffff:ffff,NO +2a01:79e:7be3:8000::,2a01:79e:7be3:ffff:ffff:ffff:ffff:ffff,DK +2a01:79e:7be4::,2a01:79f:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:7a0::,2a01:7a7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7a8::,2a01:7a8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:7b0::,2a01:7b0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:7b8::,2a01:7b8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:7c0::,2a01:7c0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:7c8::,2a01:7c8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:7d0::,2a01:7d0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:7d8::,2a01:7d8:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a01:7e0::,2a01:7e7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7e8::,2a01:7e8:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:7f0::,2a01:7f0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7f8::,2a01:7f8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:800::,2a01:838:fffe:ffff:ffff:ffff:ffff:ffff,DE +2a01:838:ffff::,2a01:838:ffff:7fff:ffff:ffff:ffff:ffff,MT +2a01:838:ffff:8000::,2a01:8ff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:c00::,2a01:c3f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:e00::,2a01:e3f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:1000::,2a01:17ff:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:2000::,2a01:2fff:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:4000::,2a01:4000:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a01:4020::,2a01:4020:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4040::,2a01:4040:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:4060::,2a01:4060:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4080::,2a01:4080:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:40a0::,2a01:40a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:40c0::,2a01:40c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:40e0::,2a01:40e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:4100::,2a01:4100:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:4120::,2a01:4120:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:4140::,2a01:4140:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:4160::,2a01:4160:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a01:4180::,2a01:4180:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:41a0::,2a01:41a0:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a01:41c0::,2a01:41c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:41e0::,2a01:41e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4200::,2a01:4207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4240::,2a01:4240:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:4260::,2a01:4260:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:4280::,2a01:4280:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a01:42a0::,2a01:42a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:42c0::,2a01:42c0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:42e0::,2a01:42e0:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a01:4300::,2a01:4300:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4320::,2a01:4320:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4340::,2a01:4340:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:4360::,2a01:4360:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4380::,2a01:4380:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:43a0::,2a01:43a0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:43c0::,2a01:43c0:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a01:4400::,2a01:4400:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:4420::,2a01:4420:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4440::,2a01:4440:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4460::,2a01:4460:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4480::,2a01:4480:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:44a0::,2a01:44a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:44c0::,2a01:44c0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a01:44e0::,2a01:44e0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:4500::,2a01:4500:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a01:4520::,2a01:4520:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:4540::,2a01:4547:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:4580::,2a01:4587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:45c0::,2a01:45c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:45e0::,2a01:45e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:4600::,2a01:4600:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a01:4620::,2a01:4620:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:4640::,2a01:4640:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:4660::,2a01:4660:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:4680::,2a01:4680:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a01:46a0::,2a01:46a0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a01:46c0::,2a01:46c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:46e0::,2a01:46e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4700::,2a01:4700:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a01:4720::,2a01:4720:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4740::,2a01:4740:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:4760::,2a01:4760:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4780::,2a01:4780:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a01:47a0::,2a01:47a0:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a01:47c0::,2a01:47c0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:47e0::,2a01:47e0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:4800::,2a01:4800:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4820::,2a01:4820:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:4840::,2a01:4840:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:4860::,2a01:4860:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a01:4880::,2a01:4880:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:48a0::,2a01:48a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:48c0::,2a01:48c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:48e0::,2a01:48e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:4900::,2a01:4900:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a01:4920::,2a01:4920:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4940::,2a01:4940:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4960::,2a01:4960:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:4980::,2a01:4980:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:49a0::,2a01:49a0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a01:49c0::,2a01:49c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:49e0::,2a01:49e0:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a01:4a00::,2a01:4a00:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a01:4a20::,2a01:4a20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:4a40::,2a01:4a40:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:4a60::,2a01:4a60:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:4a80::,2a01:4a80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:4aa0::,2a01:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:4ac0::,2a01:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:4ae0::,2a01:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4b00::,2a01:4b00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4b20::,2a01:4b20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4b40::,2a01:4b40:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a01:4b60::,2a01:4b60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4b80::,2a01:4b80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:4ba0::,2a01:4ba7:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a01:4bc0::,2a01:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4be0::,2a01:4be0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:4c00::,2a01:4c07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:4c20::,2a01:4c20:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:4c40::,2a01:4c40:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:4c60::,2a01:4c60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4c80::,2a01:4c80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4ca0::,2a01:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4cc0::,2a01:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4ce0::,2a01:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a01:4d00::,2a01:4d00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4d20::,2a01:4d20:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:4d40::,2a01:4d40:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a01:4d60::,2a01:4d60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:4d80::,2a01:4d80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4da0::,2a01:4da0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4dc0::,2a01:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4de0::,2a01:4de0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4e00::,2a01:4e00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:4e20::,2a01:4e20:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:4e40::,2a01:4e40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4e60::,2a01:4e60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:4e80::,2a01:4e80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:4ea0::,2a01:4ea0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4ec0::,2a01:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:4ee0::,2a01:4ee0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:4f00::,2a01:4f00:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a01:4f20::,2a01:4f20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:4f40::,2a01:4f40:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:4f60::,2a01:4f60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:4f80::,2a01:4f87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4fc0::,2a01:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4fe0::,2a01:4fe0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:5000::,2a01:5000:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:5020::,2a01:5020:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:5040::,2a01:5047:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:5080::,2a01:5080:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:50a0::,2a01:50a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:50c0::,2a01:50c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:50e0::,2a01:50e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:5100::,2a01:5100:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:5120::,2a01:5120:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a01:5140::,2a01:5140:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:5160::,2a01:5160:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a01:5180::,2a01:5180:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:51a0::,2a01:51a0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:51c0::,2a01:51c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:5200::,2a01:5207:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:5220::,2a01:5220:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5240::,2a01:5247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:5260::,2a01:5260:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5280::,2a01:5280:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:52a0::,2a01:52a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:52c0::,2a01:52c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:52e0::,2a01:52e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:5300::,2a01:5300:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:5320::,2a01:5320:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:5340::,2a01:5340:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5380::,2a01:5380:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:53a0::,2a01:53a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:53c0::,2a01:53c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:53e0::,2a01:53e0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:5400::,2a01:5400:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5420::,2a01:5420:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:5440::,2a01:5440:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:5460::,2a01:5460:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:5480::,2a01:5480:ffff:ffff:ffff:ffff:ffff:ffff,GG +2a01:54a0::,2a01:54a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:54c0::,2a01:54c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:54e0::,2a01:54e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5500::,2a01:5507:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:5540::,2a01:5547:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:5560::,2a01:5560:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5580::,2a01:5580:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:55a0::,2a01:55a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:55c0::,2a01:55c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:55e0::,2a01:55e7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:5600::,2a01:5600:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:5620::,2a01:5627:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:5640::,2a01:5640:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5660::,2a01:5660:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:5680::,2a01:5687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:56a0::,2a01:56a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:56c0::,2a01:56c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:56e0::,2a01:56e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:5700::,2a01:5700:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:5720::,2a01:5720:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:5740::,2a01:5741:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:5760::,2a01:5760:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:5780::,2a01:5780:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:57a0::,2a01:57a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:57c0::,2a01:57c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:57e0::,2a01:57e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:5800::,2a01:5800:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:5820::,2a01:5820:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5840::,2a01:5840:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:5860::,2a01:5860:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:5880::,2a01:5880:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:58a0::,2a01:58a0:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a01:58c0::,2a01:58c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:58e0::,2a01:58e0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a01:5900::,2a01:5900:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:5920::,2a01:5920:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:5940::,2a01:5940:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:5960::,2a01:5960:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:5980::,2a01:5980:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:59a0::,2a01:59a7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:59c0::,2a01:59c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5a00::,2a01:5a00:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:5a20::,2a01:5a20:fff:ffff:ffff:ffff:ffff:ffff,IE +2a01:5a20:1000::,2a01:5a20:1fff:ffff:ffff:ffff:ffff:ffff,US +2a01:5a20:2000::,2a01:5a20:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:5a40::,2a01:5a40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5a60::,2a01:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5a80::,2a01:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2a01:5aa0::,2a01:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5ac0::,2a01:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5ae0::,2a01:5ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5b00::,2a01:5b00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5b20::,2a01:5b20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:5b40::,2a01:5b40:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:5b60::,2a01:5b60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5b80::,2a01:5b80:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:5ba0::,2a01:5ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5bc0::,2a01:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:5be0::,2a01:5be0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:5c00::,2a01:5c00:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:5c20::,2a01:5c20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5c40::,2a01:5c40:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:5c60::,2a01:5c60:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:5c80::,2a01:5c80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5ca0::,2a01:5ca0:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a01:5cc0::,2a01:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:5ce0::,2a01:5ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5d00::,2a01:5d00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5d20::,2a01:5d20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:5d40::,2a01:5d40:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:5d60::,2a01:5d67:ffff:ffff:ffff:ffff:ffff:ffff,TJ +2a01:5d80::,2a01:5d80:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a01:5da0::,2a01:5da0:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a01:5dc0::,2a01:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:5de0::,2a01:5de0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5e00::,2a01:5e00:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:5e20::,2a01:5e20:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:5e40::,2a01:5e40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5e60::,2a01:5e60:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a01:5e80::,2a01:5e80:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:5ea0::,2a01:5ea0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5ec0::,2a01:5ec0::bfff:ffff:ffff:ffff:ffff,GB +2a01:5ec0:0:c000::,2a01:5ec0::efff:ffff:ffff:ffff:ffff,IR +2a01:5ec0:0:f000::,2a01:5ec0:1:1fff:ffff:ffff:ffff:ffff,GB +2a01:5ec0:1:2000::,2a01:5ec0:1:5fff:ffff:ffff:ffff:ffff,IR +2a01:5ec0:1:6000::,2a01:5ec0:1:9fff:ffff:ffff:ffff:ffff,GB +2a01:5ec0:1:a000::,2a01:5ec0:1:bfff:ffff:ffff:ffff:ffff,IR +2a01:5ec0:1:c000::,2a01:5ec0:1:ffff:ffff:ffff:ffff:ffff,GB +2a01:5ec0:2::,2a01:5ec0:2:1fff:ffff:ffff:ffff:ffff,NL +2a01:5ec0:2:2000::,2a01:5ec0:2:3fff:ffff:ffff:ffff:ffff,IR +2a01:5ec0:2:4000::,2a01:5ec0:2:7fff:ffff:ffff:ffff:ffff,NL +2a01:5ec0:2:8000::,2a01:5ec0:8:7fff:ffff:ffff:ffff:ffff,IR +2a01:5ec0:8:8000::,2a01:5ec0:8:ffff:ffff:ffff:ffff:ffff,GB +2a01:5ec0:9::,2a01:5ec0:1000:ffff:ffff:ffff:ffff:ffff,IR +2a01:5ec0:1001::,2a01:5ec0:1001:7fff:ffff:ffff:ffff:ffff,US +2a01:5ec0:1001:8000::,2a01:5ec0:1019:7fff:ffff:ffff:ffff:ffff,IR +2a01:5ec0:1019:8000::,2a01:5ec0:1019:ffff:ffff:ffff:ffff:ffff,GB +2a01:5ec0:101a::,2a01:5ec0:2000:7fff:ffff:ffff:ffff:ffff,IR +2a01:5ec0:2000:8000::,2a01:5ec0:2000:ffff:ffff:ffff:ffff:ffff,GB +2a01:5ec0:2001::,2a01:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:5ee0::,2a01:5ee0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:5f00::,2a01:5f00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5f20::,2a01:5f20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5f40::,2a01:5f40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5f60::,2a01:5f60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:5f80::,2a01:5f80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:5fa0::,2a01:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:5fc0::,2a01:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:5fe0::,2a01:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:6000::,2a01:6000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6020::,2a01:6020:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6040::,2a01:6040:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6060::,2a01:6060:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:6080::,2a01:6080:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:60a0::,2a01:60a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:60c0::,2a01:60c0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:60e0::,2a01:60e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:6100::,2a01:6100:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:6120::,2a01:6120:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6140::,2a01:6140:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:6160::,2a01:6160:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6180::,2a01:6180:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:61a0::,2a01:61a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:61c0::,2a01:61c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:61e0::,2a01:61e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6200::,2a01:6200:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:6220::,2a01:6220:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:6240::,2a01:6247:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6260::,2a01:6260:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:6280::,2a01:6280:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:62a0::,2a01:62a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:62c0::,2a01:62c0:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a01:6300::,2a01:6300:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:6320::,2a01:6320:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a01:6340::,2a01:6347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:6360::,2a01:6360:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:6380::,2a01:6380:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:63a0::,2a01:63a0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:63c0::,2a01:63c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:63e0::,2a01:63e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:6400::,2a01:6400:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:6420::,2a01:6420:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:6440::,2a01:6447:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a01:6460::,2a01:6460:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:6480::,2a01:6480:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a01:64a0::,2a01:64a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:64c0::,2a01:64c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:64e0::,2a01:64e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6500::,2a01:6500:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a01:6520::,2a01:6520:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6540::,2a01:6540:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6560::,2a01:6560:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:6580::,2a01:6580:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:65a0::,2a01:65a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:65c0::,2a01:65c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:65e0::,2a01:65e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6600::,2a01:6600:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:6620::,2a01:6620:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:6640::,2a01:6647:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:6680::,2a01:6680:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:66a0::,2a01:66a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:66c0::,2a01:66c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:66e0::,2a01:66e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:6700::,2a01:6700:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a01:6720::,2a01:6720:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a01:6740::,2a01:6740:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:6760::,2a01:6760:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:6780::,2a01:6780:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:67c0::,2a01:67c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:67e0::,2a01:67e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6800::,2a01:6800:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:6820::,2a01:6820:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6840::,2a01:6840:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:6860::,2a01:6860:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6880::,2a01:6880:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:68a0::,2a01:68a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:68c0::,2a01:68c0:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a01:68e0::,2a01:68e0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:6900::,2a01:6900:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:6920::,2a01:6920:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:6940::,2a01:6940:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:6960::,2a01:6960:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:6980::,2a01:6980:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:69a0::,2a01:69a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:69c0::,2a01:69c0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:69e0::,2a01:69e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:6a00::,2a01:6a07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6a20::,2a01:6a20:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:6a40::,2a01:6a40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:6a60::,2a01:6a60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6a80::,2a01:6a80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:6aa0::,2a01:6aa0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6ac0::,2a01:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:6ae0::,2a01:6ae7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6b00::,2a01:6b00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6b20::,2a01:6b20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:6b40::,2a01:6b40:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:6b60::,2a01:6b60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:6b80::,2a01:6b80:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:6ba0::,2a01:6ba0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6bc0::,2a01:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:6be0::,2a01:6be0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:6c00::,2a01:6c00:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:6c20::,2a01:6c20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6c40::,2a01:6c40:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:6c60::,2a01:6c60:2:ffff:ffff:ffff:ffff:ffff,GB +2a01:6c60:3::,2a01:6c60:3:ffff:ffff:ffff:ffff:ffff,ZA +2a01:6c60:4::,2a01:6c60:4:ffff:ffff:ffff:ffff:ffff,NZ +2a01:6c60:5::,2a01:6c60:11:ffff:ffff:ffff:ffff:ffff,GB +2a01:6c60:12::,2a01:6c60:12:ffff:ffff:ffff:ffff:ffff,ES +2a01:6c60:13::,2a01:6c60:fff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6c60:1000::,2a01:6c60:1fff:ffff:ffff:ffff:ffff:ffff,US +2a01:6c60:2000::,2a01:6c60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6ca0::,2a01:6ca0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6ce0::,2a01:6ce0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:6d00::,2a01:6d00:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:6d20::,2a01:6d20:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:6d40::,2a01:6d40:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:6d60::,2a01:6d67:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:6d80::,2a01:6d80:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:6da0::,2a01:6da0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a01:6dc0::,2a01:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a01:6de0::,2a01:6de0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:6e00::,2a01:6e00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:6e20::,2a01:6e20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:6e40::,2a01:6e40:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a01:6e60::,2a01:6e60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6e80::,2a01:6e80:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:6ea0::,2a01:6ea0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:6ec0::,2a01:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:6ee0::,2a01:6ee0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:6f00::,2a01:6f07:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a01:6f20::,2a01:6f20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6f40::,2a01:6f40:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:6f60::,2a01:6f60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:6f80::,2a01:6f80:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:6fa0::,2a01:6fa0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:6fc0::,2a01:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:6fe0::,2a01:6fe0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:7000::,2a01:7000:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:7020::,2a01:7020:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:7040::,2a01:7040:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:7060::,2a01:7060:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:7080::,2a01:7080:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:70a0::,2a01:70a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:70c0::,2a01:70c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:70e0::,2a01:70e0:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a01:7100::,2a01:7100:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:7120::,2a01:7120:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:7140::,2a01:7140:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:7160::,2a01:7160:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:7180::,2a01:7180:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:71a0::,2a01:71a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:71c0::,2a01:71c1:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:71e0::,2a01:71e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:7200::,2a01:7200:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:7220::,2a01:7220:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a01:7240::,2a01:7240:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:7260::,2a01:7267:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a01:7280::,2a01:7280:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:72a0::,2a01:72a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:72c0::,2a01:72c0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:72e0::,2a01:72e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:7300::,2a01:7300:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:7320::,2a01:7320:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:7340::,2a01:7347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:7360::,2a01:7360:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a01:7380::,2a01:7380:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:73a0::,2a01:73a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:73c0::,2a01:73c0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a01:73e0::,2a01:73e0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:7400::,2a01:7400:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:7420::,2a01:7420:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7440::,2a01:7440:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:7460::,2a01:7460:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:7480::,2a01:7480:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:74a0::,2a01:74a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:74c0::,2a01:74c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:74e0::,2a01:74e7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:7500::,2a01:7500:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:7520::,2a01:7520:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:7540::,2a01:7540:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:7560::,2a01:7560:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:7580::,2a01:7580:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:75a0::,2a01:75a0:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a01:75c0::,2a01:75c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7600::,2a01:7600:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:7620::,2a01:7620:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:7640::,2a01:7640:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a01:7660::,2a01:7660:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7680::,2a01:7680:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:76a0::,2a01:76a0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:76c0::,2a01:76c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:76e0::,2a01:76e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:7700::,2a01:7700:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7720::,2a01:7720:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:7740::,2a01:7740:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:7760::,2a01:7760:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7780::,2a01:7780:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a01:77a0::,2a01:77a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:77c0::,2a01:77c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:77e0::,2a01:77e7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:7800::,2a01:7800:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:7820::,2a01:7820:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7840::,2a01:7840:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7860::,2a01:7860:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:7880::,2a01:7880:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:78a0::,2a01:78a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:78c0::,2a01:78c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:7900::,2a01:7900:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:7920::,2a01:7927:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:7940::,2a01:7940:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:7960::,2a01:7960:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7980::,2a01:7980:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:79a0::,2a01:79a0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:79c0::,2a01:79c0:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a01:79e0::,2a01:79e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:7a00::,2a01:7a07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:7a20::,2a01:7a20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:7a40::,2a01:7a40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7a60::,2a01:7a60:ffff:ffff:ffff:ffff:ffff:ffff,SM +2a01:7a80::,2a01:7a87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:7ac0::,2a01:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:7ae0::,2a01:7ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:7b00::,2a01:7b00:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a01:7b20::,2a01:7b20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:7b40::,2a01:7b40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7b60::,2a01:7b60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:7b80::,2a01:7b80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:7ba0::,2a01:7ba0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:7bc0::,2a01:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:7be0::,2a01:7be0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7c00::,2a01:7c07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:7c20::,2a01:7c20:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a01:7c40::,2a01:7c40:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a01:7c60::,2a01:7c60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:7c80::,2a01:7c80:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a01:7ca0::,2a01:7ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:7cc0::,2a01:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:7ce0::,2a01:7ce0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:7d00::,2a01:7d00:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:7d20::,2a01:7d20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:7d40::,2a01:7d40:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:7d60::,2a01:7d60:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:7d80::,2a01:7d80:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:7dc0::,2a01:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:7de0::,2a01:7de0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7e00::,2a01:7e00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:7e01::,2a01:7e01:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7e20::,2a01:7e27:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:7e60::,2a01:7e60:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:7e80::,2a01:7e80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7ea0::,2a01:7ea0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7ec0::,2a01:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:7ee0::,2a01:7ee0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:7f00::,2a01:7f00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:7f20::,2a01:7f20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:7f40::,2a01:7f40:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a01:7f60::,2a01:7f60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:7f80::,2a01:7f80:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a01:7fa0::,2a01:7fa0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:7fc0::,2a01:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:7fe0::,2a01:7fe7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:8000::,2a01:8000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:8020::,2a01:8020:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a01:8040::,2a01:8047:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:8060::,2a01:8060:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a01:8080::,2a01:8080:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a01:80a0::,2a01:80a0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:80c0::,2a01:80c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:80e0::,2a01:80e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:8100::,2a01:8100:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:8120::,2a01:8120:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:8140::,2a01:8140:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:8160::,2a01:8167:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:8180::,2a01:8180:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:81a0::,2a01:81a0:fe:ffff:ffff:ffff:ffff:ffff,RU +2a01:81a0:ff::,2a01:81a0:ff::ffff:ffff:ffff:ffff,US +2a01:81a0:ff:1::,2a01:81a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:81c0::,2a01:81c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:81e0::,2a01:81e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:8200::,2a01:8200:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:8220::,2a01:8220:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:8240::,2a01:8240:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:8260::,2a01:8260:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:8280::,2a01:8280:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a01:82a0::,2a01:82a0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a01:82c0::,2a01:82c0:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a01:82e0::,2a01:82e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:8300::,2a01:8300:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:8320::,2a01:8320:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:8340::,2a01:8340:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:8360::,2a01:8360:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:8380::,2a01:8380:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:83a0::,2a01:83a0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:83c0::,2a01:83c0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:83e0::,2a01:83e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:8400::,2a01:8400:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:8420::,2a01:8420:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:8440::,2a01:8440:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:8460::,2a01:8460:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:8480::,2a01:8480:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:84a0::,2a01:84a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:84c0::,2a01:84c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:84e0::,2a01:84e0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:8500::,2a01:8500:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:8520::,2a01:8520:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:8540::,2a01:8540:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:8560::,2a01:8560:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:8580::,2a01:8580:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:85a0::,2a01:85a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:85c0::,2a01:85c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:85e0::,2a01:85e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:8600::,2a01:8600:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:8640::,2a01:8640::ffff:ffff:ffff:ffff:ffff,NL +2a01:8640:1::,2a01:8640:1:ffff:ffff:ffff:ffff:ffff,GB +2a01:8640:2::,2a01:8640:2:ffff:ffff:ffff:ffff:ffff,NL +2a01:8640:3::,2a01:8640:3:ffff:ffff:ffff:ffff:ffff,CA +2a01:8640:4::,2a01:8640:5:ffff:ffff:ffff:ffff:ffff,US +2a01:8640:6::,2a01:8640:6:ffff:ffff:ffff:ffff:ffff,SE +2a01:8640:7::,2a01:8640:7:ffff:ffff:ffff:ffff:ffff,GB +2a01:8640:8::,2a01:8640:8:ffff:ffff:ffff:ffff:ffff,CA +2a01:8640:9::,2a01:8640:9:ffff:ffff:ffff:ffff:ffff,SE +2a01:8640:a::,2a01:8640:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:8660::,2a01:8660:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:8680::,2a01:8680:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:86a0::,2a01:86a0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:86c0::,2a01:86c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:86e0::,2a01:86e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:8700::,2a01:8700:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a01:8720::,2a01:8720:ffff:ffff:ffff:ffff:ffff:ffff,US +2a01:8740::,2a01:8740:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:8760::,2a01:8760:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:8780::,2a01:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:87c0::,2a01:87c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:87e0::,2a01:87e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:8800::,2a01:8807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:8820::,2a01:8820:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:8840::,2a01:8840:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:8860::,2a01:8860:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:8880::,2a01:8880:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:88a0::,2a01:88a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:88c0::,2a01:88c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:88e0::,2a01:88e0:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a01:8900::,2a01:8900:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:8920::,2a01:8920:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:8940::,2a01:8940:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:8960::,2a01:8960:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:8980::,2a01:8980:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:89a0::,2a01:89a0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:89c0::,2a01:89c0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:89e0::,2a01:89e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:8a00::,2a01:8a00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:8a20::,2a01:8a20:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:8a40::,2a01:8a40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:8a60::,2a01:8a60:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:8a80::,2a01:8a80:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:8aa0::,2a01:8aa0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:8ac0::,2a01:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:8ae0::,2a01:8ae0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:8b00::,2a01:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:8b20::,2a01:8b20:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a01:8b40::,2a01:8b40:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:8b60::,2a01:8b60:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:8b80::,2a01:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:8ba0::,2a01:8ba7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:8be0::,2a01:8be7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:8c00::,2a01:8c00:ff00:82b0:ffff:ffff:ffff:ffff,CZ +2a01:8c00:ff00:82b1::,2a01:8c00:ff00:82b1:ffff:ffff:ffff:ffff,US +2a01:8c00:ff00:82b2::,2a01:8c00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:8c20::,2a01:8c20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:8c40::,2a01:8c40:ffff:ffff:ffff:ffff:ffff:ffff,GI +2a01:8c60::,2a01:8c60:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a01:8c80::,2a01:8c80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:8ca0::,2a01:8ca0:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a01:8cc0::,2a01:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:8ce0::,2a01:8ce0:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a01:8d00::,2a01:8d03:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:8d20::,2a01:8d20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:8d40::,2a01:8d47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:8d80::,2a01:8d80:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:8da0::,2a01:8da0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:8dc0::,2a01:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:8de0::,2a01:8de0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:8e00::,2a01:8e07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:8e20::,2a01:8e20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:8e40::,2a01:8e40:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a01:8e60::,2a01:8e60:ffff:ffff:ffff:ffff:ffff:ffff,US +2a01:8e80::,2a01:8e87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:8ec0::,2a01:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:8ee0::,2a01:8ee0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:8f00::,2a01:8f00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:8f20::,2a01:8f20:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:8f40::,2a01:8f40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:8f80::,2a01:8f87:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:8fa0::,2a01:8fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:8fc0::,2a01:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:8fe0::,2a01:8fe0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9000::,2a01:9000:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:9040::,2a01:9040:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a01:9060::,2a01:9060:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:9080::,2a01:9080:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:90a0::,2a01:90a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:90c0::,2a01:90c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:90e0::,2a01:90e0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:9100::,2a01:9107:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:9120::,2a01:9120:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:9140::,2a01:9140:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:9160::,2a01:9160:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:9180::,2a01:9180:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:91a0::,2a01:91a0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:91c0::,2a01:91c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:91e0::,2a01:91e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:9200::,2a01:9200:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9220::,2a01:9220:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:9240::,2a01:9240:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a01:9260::,2a01:9260:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9280::,2a01:9280:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:92a0::,2a01:92a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:92c0::,2a01:92c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:92e0::,2a01:92e0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a01:9300::,2a01:9300:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:9320::,2a01:9320:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:9340::,2a01:9340:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:9360::,2a01:9360:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:9380::,2a01:9380:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:93c0::,2a01:93c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:93e0::,2a01:93e0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:9400::,2a01:9400:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:9420::,2a01:9420:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:9440::,2a01:9440:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:9460::,2a01:9460:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a01:9480::,2a01:9480:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:94a0::,2a01:94a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:94c0::,2a01:94c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:94e0::,2a01:94e0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:9500::,2a01:9500:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:9520::,2a01:9527:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9540::,2a01:9540:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9560::,2a01:9560:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:9580::,2a01:9580:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:95a0::,2a01:95a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:95c0::,2a01:95c0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:9600::,2a01:9600:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9620::,2a01:9627:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a01:9640::,2a01:9640:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:9660::,2a01:9660:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:9680::,2a01:9687:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:96a0::,2a01:96a0:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a01:96c0::,2a01:96c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:96e0::,2a01:96e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:9700::,2a01:9700:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a01:9720::,2a01:9720:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:9740::,2a01:9740:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9760::,2a01:9760:ffff:ffff:ffff:ffff:ffff:ffff,KY +2a01:9780::,2a01:9780:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:97a0::,2a01:97a0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a01:97c0::,2a01:97c0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:97e0::,2a01:97e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:9800::,2a01:9800:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:9820::,2a01:9820:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:9840::,2a01:9840:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:9860::,2a01:9860:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:9880::,2a01:9880:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:98a0::,2a01:98a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:98c0::,2a01:98c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:98e0::,2a01:98e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:9900::,2a01:9900:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:9920::,2a01:9920:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:9940::,2a01:9940:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:9960::,2a01:9960:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:9980::,2a01:9980:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:99a0::,2a01:99a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:99c0::,2a01:99c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:99e0::,2a01:99e0:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a01:9a00::,2a01:9a00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:9a20::,2a01:9a20:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:9a40::,2a01:9a40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:9a80::,2a01:9a80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:9aa0::,2a01:9aa0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:9ac0::,2a01:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:9ae0::,2a01:9ae0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:9b00::,2a01:9b00:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:9b20::,2a01:9b20:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a01:9b40::,2a01:9b40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:9b60::,2a01:9b60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:9b80::,2a01:9b80:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:9ba0::,2a01:9ba0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:9bc0::,2a01:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:9be0::,2a01:9be0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9c00::,2a01:9c00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:9c20::,2a01:9c20:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:9c60::,2a01:9c60:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:9c80::,2a01:9c80:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a01:9ca0::,2a01:9ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:9cc0::,2a01:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9ce0::,2a01:9ce0:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a01:9d00::,2a01:9d00:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a01:9d20::,2a01:9d27:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a01:9d40::,2a01:9d40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:9d60::,2a01:9d60:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:9d80::,2a01:9d80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:9da0::,2a01:9da0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:9dc0::,2a01:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:9e00::,2a01:9e00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9e01::,2a01:9e01:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:9e02::,2a01:9e07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9e20::,2a01:9e20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9e40::,2a01:9e40:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:9e60::,2a01:9e60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9e80::,2a01:9e80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:9ea0::,2a01:9ea0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:9ec0::,2a01:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:9f00::,2a01:9f00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:9f20::,2a01:9f20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:9f40::,2a01:9f40:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:9f60::,2a01:9f60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:9f80::,2a01:9f80:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:9fa0::,2a01:9fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:9fc0::,2a01:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:a000::,2a01:a000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a020::,2a01:a020:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a040::,2a01:a040:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:a060::,2a01:a060:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:a080::,2a01:a080:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:a0a0::,2a01:a0a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:a0c0::,2a01:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:a0e0::,2a01:a0e0:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a01:a100::,2a01:a100:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:a120::,2a01:a120:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:a140::,2a01:a140:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a160::,2a01:a160:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:a180::,2a01:a180:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a01:a1a0::,2a01:a1a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:a1c0::,2a01:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a01:a1e0::,2a01:a1e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:a200::,2a01:a200:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a220::,2a01:a220:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a240::,2a01:a240:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:a260::,2a01:a260:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:a280::,2a01:a283:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:a2a0::,2a01:a2a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:a2c0::,2a01:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a2e0::,2a01:a2e0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:a300::,2a01:a300:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:a320::,2a01:a320:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a01:a340::,2a01:a340:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:a360::,2a01:a360:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:a380::,2a01:a380:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:a3a0::,2a01:a3a0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:a3c0::,2a01:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:a3e0::,2a01:a3e0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a01:a400::,2a01:a400:ffff:ffff:ffff:ffff:ffff:ffff,JE +2a01:a420::,2a01:a420:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a01:a440::,2a01:a440:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:a460::,2a01:a460:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:a480::,2a01:a480:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:a4a0::,2a01:a4a0:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a01:a4c0::,2a01:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:a4e0::,2a01:a4e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:a500::,2a01:a500:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a520::,2a01:a520:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:a540::,2a01:a540:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:a560::,2a01:a560:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:a580::,2a01:a580:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:a5a0::,2a01:a5a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a5c0::,2a01:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a5e0::,2a01:a5e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:a600::,2a01:a600:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:a620::,2a01:a620:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:a640::,2a01:a640:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:a660::,2a01:a660:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:a680::,2a01:a687:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:a6a0::,2a01:a6a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:a6c0::,2a01:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:a6e0::,2a01:a6e0:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a01:a700::,2a01:a707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:a740::,2a01:a740:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:a760::,2a01:a760:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a01:a780::,2a01:a780:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:a7a0::,2a01:a7a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:a7c0::,2a01:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:a7e0::,2a01:a7e0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:a800::,2a01:a807:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:a820::,2a01:a820:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:a840::,2a01:a840:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:a860::,2a01:a860:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a880::,2a01:a887:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a01:a8a0::,2a01:a8a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:a8c0::,2a01:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:a8e0::,2a01:a8e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:a920::,2a01:a920:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:a940::,2a01:a940:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:a960::,2a01:a960:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a01:a980::,2a01:a987:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:a9a0::,2a01:a9a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:a9c0::,2a01:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:a9e0::,2a01:a9e7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a01:aa00::,2a01:aa00:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:aa20::,2a01:aa20:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a01:aa40::,2a01:aa40:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:aa60::,2a01:aa60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:aa80::,2a01:aa80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:aaa0::,2a01:aaa0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:aac0::,2a01:aac0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:ab00::,2a01:ab00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:ab20::,2a01:ab20:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:ab40::,2a01:ab40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:ab80::,2a01:ab80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:aba0::,2a01:aba0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:abc0::,2a01:abc0:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a01:abe0::,2a01:abe0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:ac00::,2a01:ac00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:ac40::,2a01:ac40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:ac60::,2a01:ac60:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:ac80::,2a01:ac87:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a01:aca0::,2a01:aca0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:acc0::,2a01:acc0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:ace0::,2a01:ace0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:ad00::,2a01:ad00:2:ffff:ffff:ffff:ffff:ffff,IE +2a01:ad00:3::,2a01:ad00:3:7fff:ffff:ffff:ffff:ffff,UA +2a01:ad00:3:8000::,2a01:ad00:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:ad20::,2a01:ad20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:ad40::,2a01:ad40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:ad60::,2a01:ad60:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a01:ad80::,2a01:ad80:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:ada0::,2a01:ada0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:adc0::,2a01:adc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:ade0::,2a01:ade0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:ae00::,2a01:ae00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:ae20::,2a01:ae20:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:ae40::,2a01:ae40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:ae60::,2a01:ae60:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:ae80::,2a01:ae87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:aea0::,2a01:aea0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:aec0::,2a01:aec0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:aee0::,2a01:aee0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:af00::,2a01:af00:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a01:af20::,2a01:af20:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:af40::,2a01:af40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:af60::,2a01:af60:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:af80::,2a01:af80:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a01:afa0::,2a01:afa0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a01:afc0::,2a01:afc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:afe0::,2a01:afe0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:b000::,2a01:b000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b020::,2a01:b020:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a01:b040::,2a01:b040:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b060::,2a01:b060:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:b080::,2a01:b080:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:b0a0::,2a01:b0a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2a01:b0c0::,2a01:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a01:b0e0::,2a01:b0e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:b100::,2a01:b100:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:b120::,2a01:b120:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:b140::,2a01:b147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:b160::,2a01:b160:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:b180::,2a01:b180:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:b1a0::,2a01:b1a0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:b1c0::,2a01:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:b200::,2a01:b200:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:b220::,2a01:b220:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:b240::,2a01:b240:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b260::,2a01:b260:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:b280::,2a01:b287:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b2a0::,2a01:b2a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b2c0::,2a01:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b2e0::,2a01:b2e7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:b300::,2a01:b307:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:b340::,2a01:b340:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:b360::,2a01:b360:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:b380::,2a01:b380:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:b3a0::,2a01:b3a0:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a01:b3c0::,2a01:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:b3e0::,2a01:b3e0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:b400::,2a01:b400:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:b420::,2a01:b420:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:b440::,2a01:b440:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:b460::,2a01:b460:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:b480::,2a01:b480:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:b4a0::,2a01:b4a0:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a01:b4c0::,2a01:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:b4e0::,2a01:b4e0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a01:b500::,2a01:b500:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a01:b520::,2a01:b520:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:b540::,2a01:b547:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:b580::,2a01:b580:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:b5a0::,2a01:b5a0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:b5c0::,2a01:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:b5e0::,2a01:b5e0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:b600::,2a01:b600:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:b620::,2a01:b620:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a01:b640::,2a01:b640:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:b660::,2a01:b660:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b680::,2a01:b680:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:b6a0::,2a01:b6a0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:b6c0::,2a01:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:b700::,2a01:b700:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:b720::,2a01:b720:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b740::,2a01:b740:9ff:ffff:ffff:ffff:ffff:ffff,IE +2a01:b740:a00::,2a01:b740:a00:ffff:ffff:ffff:ffff:ffff,GB +2a01:b740:a01::,2a01:b740:a01:ffff:ffff:ffff:ffff:ffff,IE +2a01:b740:a02::,2a01:b740:a02:ffff:ffff:ffff:ffff:ffff,NL +2a01:b740:a03::,2a01:b740:a03:ffff:ffff:ffff:ffff:ffff,IE +2a01:b740:a04::,2a01:b740:a04:ffff:ffff:ffff:ffff:ffff,DE +2a01:b740:a05::,2a01:b740:a13:ffff:ffff:ffff:ffff:ffff,IE +2a01:b740:a14::,2a01:b740:a14:ffff:ffff:ffff:ffff:ffff,DK +2a01:b740:a15::,2a01:b740:a15:ffff:ffff:ffff:ffff:ffff,IE +2a01:b740:a16::,2a01:b740:a16:ffff:ffff:ffff:ffff:ffff,DE +2a01:b740:a17::,2a01:b740:a17:ffff:ffff:ffff:ffff:ffff,IE +2a01:b740:a18::,2a01:b740:a18:ffff:ffff:ffff:ffff:ffff,GB +2a01:b740:a19::,2a01:b740:a19:ffff:ffff:ffff:ffff:ffff,IE +2a01:b740:a1a::,2a01:b740:a1a:ffff:ffff:ffff:ffff:ffff,DE +2a01:b740:a1b::,2a01:b740:a1b:ffff:ffff:ffff:ffff:ffff,IE +2a01:b740:a1c::,2a01:b740:a1c:ffff:ffff:ffff:ffff:ffff,NL +2a01:b740:a1d::,2a01:b740:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:b760::,2a01:b760:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a01:b780::,2a01:b780:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a01:b7a0::,2a01:b7a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:b7c0::,2a01:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:b7e0::,2a01:b7e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:b800::,2a01:b800:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a01:b820::,2a01:b820:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b840::,2a01:b840:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b860::,2a01:b860:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b880::,2a01:b880:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:b8a0::,2a01:b8a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:b8c0::,2a01:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:b8e0::,2a01:b8e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:b900::,2a01:b900:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:b920::,2a01:b920:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:b940::,2a01:b940:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:b960::,2a01:b960:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:b980::,2a01:b980:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:b9a0::,2a01:b9a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:b9c0::,2a01:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a01:b9e0::,2a01:b9e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:ba00::,2a01:ba07:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:ba20::,2a01:ba20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:ba40::,2a01:ba40:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:ba60::,2a01:ba60:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a01:ba80::,2a01:ba80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:baa0::,2a01:baa0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:bac0::,2a01:bac0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:bae0::,2a01:bae0:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a01:bb00::,2a01:bb00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:bb20::,2a01:bb20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:bb40::,2a01:bb40:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:bb60::,2a01:bb60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:bb80::,2a01:bb80:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:bba0::,2a01:bba0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:bbc0::,2a01:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a01:bbe0::,2a01:bbe0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:bc00::,2a01:bc07:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:bc40::,2a01:bc40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:bc60::,2a01:bc60:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:bca0::,2a01:bca0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:bcc0::,2a01:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:bce0::,2a01:bce0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:bd00::,2a01:bd00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:bd20::,2a01:bd20:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:bd40::,2a01:bd47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:bd60::,2a01:bd60:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a01:bd80::,2a01:bd80:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a01:bda0::,2a01:bda0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:bdc0::,2a01:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:bde0::,2a01:bde0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:be00::,2a01:be00:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a01:be20::,2a01:be20:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a01:be40::,2a01:be40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:be60::,2a01:be60:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:be80::,2a01:be80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:bea0::,2a01:bea0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:bec0::,2a01:bec0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:bee0::,2a01:bee0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:bf00::,2a01:bf00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:bf20::,2a01:bf20:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:bf40::,2a01:bf40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:bf60::,2a01:bf60:ffff:ffff:ffff:ffff:ffff:ffff,US +2a01:bf80::,2a01:bf80:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a01:bfa0::,2a01:bfa0:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a01:bfc0::,2a01:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:bfe0::,2a01:bfe0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:c000::,2a01:c4ff:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:c500::,2a01:c50f:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:c510::,2a01:c843:fffb:ffff:ffff:ffff:ffff:ffff,FR +2a01:c843:fffc::,2a01:c843:fffc:7fff:ffff:ffff:ffff:ffff,SK +2a01:c843:fffc:8000::,2a01:c844:fff:ffff:ffff:ffff:ffff:ffff,FR +2a01:c844:1000::,2a01:c844:11ff:ffff:ffff:ffff:ffff:ffff,SK +2a01:c844:1200::,2a01:c844:1401:7fff:ffff:ffff:ffff:ffff,FR +2a01:c844:1401:8000::,2a01:c844:1401:ffff:ffff:ffff:ffff:ffff,SK +2a01:c844:1402::,2a01:c844:1402:7fff:ffff:ffff:ffff:ffff,FR +2a01:c844:1402:8000::,2a01:c844:1402:ffff:ffff:ffff:ffff:ffff,SK +2a01:c844:1403::,2a01:c844:140a:e00:50e1:6f6d:63d4:31e,FR +2a01:c844:140a:e00:50e1:6f6d:63d4:31f,2a01:c844:140a:e00:50e1:6f6d:63d4:31f,SK +2a01:c844:140a:e00:50e1:6f6d:63d4:320,2a01:c844:141a:ffff:ffff:ffff:ffff:ffff,FR +2a01:c844:141b::,2a01:c844:141b:7fff:ffff:ffff:ffff:ffff,SK +2a01:c844:141b:8000::,2a01:c844:142b:7fff:ffff:ffff:ffff:ffff,FR +2a01:c844:142b:8000::,2a01:c844:142b:ffff:ffff:ffff:ffff:ffff,SK +2a01:c844:142c::,2a01:c844:1450:7fff:ffff:ffff:ffff:ffff,FR +2a01:c844:1450:8000::,2a01:c844:1450:ffff:ffff:ffff:ffff:ffff,SK +2a01:c844:1451::,2a01:c844:1458:ffff:ffff:ffff:ffff:ffff,FR +2a01:c844:1459::,2a01:c844:1459:7fff:ffff:ffff:ffff:ffff,SK +2a01:c844:1459:8000::,2a01:c844:148e:7fff:ffff:ffff:ffff:ffff,FR +2a01:c844:148e:8000::,2a01:c844:148e:ffff:ffff:ffff:ffff:ffff,SK +2a01:c844:148f::,2a01:c844:149e:ffff:ffff:ffff:ffff:ffff,FR +2a01:c844:149f::,2a01:c844:149f:7fff:ffff:ffff:ffff:ffff,SK +2a01:c844:149f:8000::,2a01:c844:14a3:ffff:ffff:ffff:ffff:ffff,FR +2a01:c844:14a4::,2a01:c844:14a4:7fff:ffff:ffff:ffff:ffff,SK +2a01:c844:14a4:8000::,2a01:c844:14a8:ffff:ffff:ffff:ffff:ffff,FR +2a01:c844:14a9::,2a01:c844:14a9:7fff:ffff:ffff:ffff:ffff,SK +2a01:c844:14a9:8000::,2a01:c844:14c6:7fff:ffff:ffff:ffff:ffff,FR +2a01:c844:14c6:8000::,2a01:c844:14c6:ffff:ffff:ffff:ffff:ffff,SK +2a01:c844:14c7::,2a01:c844:14cd:ffff:ffff:ffff:ffff:ffff,FR +2a01:c844:14ce::,2a01:c844:14ce:7fff:ffff:ffff:ffff:ffff,SK +2a01:c844:14ce:8000::,2a01:c844:14d1:ffff:ffff:ffff:ffff:ffff,FR +2a01:c844:14d2::,2a01:c844:14d2:7fff:ffff:ffff:ffff:ffff,SK +2a01:c844:14d2:8000::,2a01:c844:181f:ffff:ffff:ffff:ffff:ffff,FR +2a01:c844:1820::,2a01:c844:1820:7fff:ffff:ffff:ffff:ffff,SK +2a01:c844:1820:8000::,2a01:cb04::ffff:ffff:ffff:ffff:ffff,FR +2a01:cb04:1::,2a01:cb04:1:7fff:ffff:ffff:ffff:ffff,US +2a01:cb04:1:8000::,2a01:cb05:89d9:7fff:ffff:ffff:ffff:ffff,FR +2a01:cb05:89d9:8000::,2a01:cb05:89d9:ffff:ffff:ffff:ffff:ffff,BG +2a01:cb05:89da::,2a01:cb0c:81bb:3fff:ffff:ffff:ffff:ffff,FR +2a01:cb0c:81bb:4000::,2a01:cb0c:81bb:5fff:ffff:ffff:ffff:ffff,AU +2a01:cb0c:81bb:6000::,2a01:cb11:176:7fff:ffff:ffff:ffff:ffff,FR +2a01:cb11:176:8000::,2a01:cb11:176:ffff:ffff:ffff:ffff:ffff,LU +2a01:cb11:177::,2a01:cb11:65b:ffff:ffff:ffff:ffff:ffff,FR +2a01:cb11:65c::,2a01:cb11:65c:7fff:ffff:ffff:ffff:ffff,DE +2a01:cb11:65c:8000::,2a01:cb15:62:ffff:ffff:ffff:ffff:ffff,FR +2a01:cb15:63::,2a01:cb15:63:7fff:ffff:ffff:ffff:ffff,CH +2a01:cb15:63:8000::,2a01:cb15:6f:bfff:ffff:ffff:ffff:ffff,FR +2a01:cb15:6f:c000::,2a01:cb15:6f:ffff:ffff:ffff:ffff:ffff,NL +2a01:cb15:70::,2a01:cb15:9b:7fff:ffff:ffff:ffff:ffff,FR +2a01:cb15:9b:8000::,2a01:cb15:9b:ffff:ffff:ffff:ffff:ffff,CH +2a01:cb15:9c::,2a01:cb15:1f5:ffff:ffff:ffff:ffff:ffff,FR +2a01:cb15:1f6::,2a01:cb15:1f6:7fff:ffff:ffff:ffff:ffff,CH +2a01:cb15:1f6:8000::,2a01:cb19:5e9:7fff:ffff:ffff:ffff:ffff,FR +2a01:cb19:5e9:8000::,2a01:cb19:5e9:ffff:ffff:ffff:ffff:ffff,GF +2a01:cb19:5ea::,2a01:cb19:8563:7fff:ffff:ffff:ffff:ffff,FR +2a01:cb19:8563:8000::,2a01:cb19:8563:ffff:ffff:ffff:ffff:ffff,ES +2a01:cb19:8564::,2a01:cb19:8742:2000:f154:67e2:3b75:f718,FR +2a01:cb19:8742:2000:f154:67e2:3b75:f719,2a01:cb19:8742:2000:f154:67e2:3b75:f719,US +2a01:cb19:8742:2000:f154:67e2:3b75:f71a,2a01:dfff:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02::,2a02::ffff:ffff:ffff:ffff:ffff:ffff,LU +2a02:10::,2a02:17:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:18::,2a02:18:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:20::,2a02:20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:28::,2a02:2f:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:30::,2a02:30:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:38::,2a02:38:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:40::,2a02:40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:48::,2a02:48:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a02:50::,2a02:50:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:58::,2a02:58:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:60::,2a02:67:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:68::,2a02:68:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:70::,2a02:70:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:78::,2a02:78:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:80::,2a02:87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:88::,2a02:88:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a02:98::,2a02:98:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:a0::,2a02:a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:a8::,2a02:a8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:b8::,2a02:b8:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a02:c0::,2a02:c0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:c8::,2a02:c8:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:d0::,2a02:d0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:d8::,2a02:d8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:e0::,2a02:e0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:e8::,2a02:e8:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:f0::,2a02:f0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:f8::,2a02:f8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:100::,2a02:100:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:108::,2a02:10f:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:110::,2a02:110:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:118::,2a02:118:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a02:120::,2a02:127:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:128::,2a02:128:3:ffff:ffff:ffff:ffff:ffff,CZ +2a02:128:4::,2a02:128:4:ffff:ffff:ffff:ffff:ffff,NL +2a02:128:5::,2a02:128:5:ffff:ffff:ffff:ffff:ffff,CZ +2a02:128:6::,2a02:128:6:ffff:ffff:ffff:ffff:ffff,RU +2a02:128:7::,2a02:128:7:ffff:ffff:ffff:ffff:ffff,CZ +2a02:128:8::,2a02:128:8:ffff:ffff:ffff:ffff:ffff,RU +2a02:128:9::,2a02:128:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:130::,2a02:130:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:138::,2a02:138:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a02:140::,2a02:140:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:148::,2a02:14f:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:150::,2a02:150:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:158::,2a02:158:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:160::,2a02:160:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:168::,2a02:168:2074:ffff:ffff:ffff:ffff:ffff,CH +2a02:168:2075::,2a02:168:2075:7fff:ffff:ffff:ffff:ffff,LI +2a02:168:2075:8000::,2a02:16b:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:170::,2a02:170:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:178::,2a02:178:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:180::,2a02:180:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:188::,2a02:18f:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:190::,2a02:190:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:198::,2a02:198:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:1a8::,2a02:1a8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:1b8::,2a02:1b8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:1c0::,2a02:1c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:1c8::,2a02:1c8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:1d0::,2a02:1d0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:1d8::,2a02:1d8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:1e0::,2a02:1e8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:1f0::,2a02:1f0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:1f8::,2a02:1f8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:200::,2a02:207:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:208::,2a02:208:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:210::,2a02:210:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:218::,2a02:21f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:220::,2a02:220:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:228::,2a02:22f:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:230::,2a02:230:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:238::,2a02:238:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:240::,2a02:240:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:248::,2a02:248:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:250::,2a02:250:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:258::,2a02:25f:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:260::,2a02:260:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:268::,2a02:268:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:270::,2a02:270:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:278::,2a02:278:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:280::,2a02:280:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:288::,2a02:290:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:298::,2a02:298:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2a0::,2a02:2a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2a8::,2a02:2a8:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:2b0::,2a02:2b0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2b8::,2a02:2b8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2c0::,2a02:2c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2c8::,2a02:2c8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2d8::,2a02:2d8::7fff:ffff:ffff:ffff:ffff,RU +2a02:2d8:0:8000::,2a02:2d8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2e0::,2a02:2e7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2e8::,2a02:2e8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:2f0::,2a02:2f7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2f8::,2a02:2f8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:300::,2a02:300:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:308::,2a02:30f:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:310::,2a02:310:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:320::,2a02:32f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:330::,2a02:330:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:338::,2a02:338:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:340::,2a02:340:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:348::,2a02:348:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:350::,2a02:350:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:358::,2a02:358:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:360::,2a02:360:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:368::,2a02:368:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:370::,2a02:370:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:380::,2a02:381:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a02:388::,2a02:388:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:390::,2a02:390:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:398::,2a02:398:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:3a0::,2a02:3a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:3a8::,2a02:3a8:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a02:3b0::,2a02:3b0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:3b8::,2a02:3b8:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:3c0::,2a02:3c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:3c8::,2a02:3c8:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a02:3d0::,2a02:3d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2a02:3d8::,2a02:3d8:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:3e0::,2a02:3e0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:3e8::,2a02:3e8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:3f0::,2a02:3f0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:3f8::,2a02:3f8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:400::,2a02:400:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:408::,2a02:408:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:410::,2a02:410:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:418::,2a02:41f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:420::,2a02:427:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:428::,2a02:428:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:430::,2a02:430:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:438::,2a02:438:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:440::,2a02:440:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:448::,2a02:44f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:450::,2a02:450:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:458::,2a02:458:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:460::,2a02:460:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:468::,2a02:46f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:470::,2a02:470:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:478::,2a02:478:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:480::,2a02:480:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:488::,2a02:488:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:490::,2a02:497:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:498::,2a02:49f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:4a0::,2a02:4a0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:4a8::,2a02:4a8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:4b0::,2a02:4b0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:4b8::,2a02:4bf:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:4c8::,2a02:4c8:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:4d0::,2a02:4d0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4d8::,2a02:4d8:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a02:4e0::,2a02:4e0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:4e8::,2a02:4e8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4f0::,2a02:4f0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:4f8::,2a02:4f8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:500::,2a02:507:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a02:508::,2a02:508:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:518::,2a02:518:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:520::,2a02:520:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:530::,2a02:530:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:538::,2a02:538:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:540::,2a02:540:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a02:548::,2a02:548:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:550::,2a02:550:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:558::,2a02:558:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:560::,2a02:560:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:568::,2a02:568:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:570::,2a02:570:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:578::,2a02:578:5002:7fff:ffff:ffff:ffff:ffff,BE +2a02:578:5002:8000::,2a02:578:5002:ffff:ffff:ffff:ffff:ffff,RU +2a02:578:5003::,2a02:578:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:580::,2a02:587:c40a:bfff:ffff:ffff:ffff:ffff,GR +2a02:587:c40a:c000::,2a02:587:c40a:dfff:ffff:ffff:ffff:ffff,FR +2a02:587:c40a:e000::,2a02:587:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:588::,2a02:588:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:590::,2a02:597:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:598::,2a02:598:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:5a0::,2a02:5a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:5b0::,2a02:5b7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:5b8::,2a02:5bf:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5c0::,2a02:5c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:5d0::,2a02:5d7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:5d8::,2a02:5d8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:5e0::,2a02:5e7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:5f0::,2a02:5f0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:600::,2a02:600:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:608::,2a02:608:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:610::,2a02:610:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a02:618::,2a02:618:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:620::,2a02:620:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:630::,2a02:630:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:638::,2a02:638:ffff:ffff:ffff:ffff:ffff:ffff,GI +2a02:640::,2a02:647:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a02:648::,2a02:648:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:650::,2a02:650:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:658::,2a02:658:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:660::,2a02:660:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a02:668::,2a02:668:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:670::,2a02:670:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:678::,2a02:678:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a02:680::,2a02:680:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:688::,2a02:688:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:690::,2a02:690:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:698::,2a02:698:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6a0::,2a02:6a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:6a8::,2a02:6a8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:6b0::,2a02:6b0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6b8::,2a02:6b8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6c0::,2a02:6c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:6c8::,2a02:6c8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:6d0::,2a02:6d0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6d8::,2a02:6d8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:6e0::,2a02:6e0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:6e8::,2a02:6e8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:6f0::,2a02:6f0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:6f8::,2a02:6f8:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a02:700::,2a02:700:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:708::,2a02:708:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:710::,2a02:710:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:718::,2a02:718:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:720::,2a02:720:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:728::,2a02:728:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:730::,2a02:730:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:738::,2a02:738:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:740::,2a02:740:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a02:748::,2a02:748:afff:ffff:ffff:ffff:ffff:ffff,PL +2a02:748:b000::,2a02:748:b000:7fff:ffff:ffff:ffff:ffff,US +2a02:748:b000:8000::,2a02:748:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:750::,2a02:750:7:ffff:ffff:ffff:ffff:ffff,SE +2a02:750:8::,2a02:750:8:ffff:ffff:ffff:ffff:ffff,US +2a02:750:9::,2a02:757:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:758::,2a02:758:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:760::,2a02:767:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:768::,2a02:768:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:770::,2a02:770:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:778::,2a02:778:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:780::,2a02:787:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:788::,2a02:790:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:798::,2a02:798:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:7a0::,2a02:7a7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:7a8::,2a02:7a8:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:7b0::,2a02:7b0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:7b8::,2a02:7b8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:7c0::,2a02:7c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7c8::,2a02:7c8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:7d0::,2a02:7d0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:7d8::,2a02:7d8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:7e0::,2a02:7e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:7e8::,2a02:7e8:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:7f0::,2a02:7f0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:800::,2a02:807:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:808::,2a02:808:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:810::,2a02:810:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:818::,2a02:81f:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a02:820::,2a02:820:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a02:828::,2a02:828:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:830::,2a02:830:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:838::,2a02:838:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:840::,2a02:840:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:848::,2a02:848:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:850::,2a02:850:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:858::,2a02:85f:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:860::,2a02:860:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:868::,2a02:86f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:870::,2a02:877:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a02:878::,2a02:878:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:880::,2a02:880:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:888::,2a02:888:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:890::,2a02:890:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:898::,2a02:898:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:8a0::,2a02:8a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8a8::,2a02:8a8:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:8b0::,2a02:8b0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:8b8::,2a02:8b8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8c0::,2a02:8c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8c8::,2a02:8c8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:8d0::,2a02:8d8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:8e0::,2a02:8e0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:8e8::,2a02:8e8:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:8f0::,2a02:8f0:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a02:8f8::,2a02:8f8:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:900::,2a02:900:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:908::,2a02:908:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:910::,2a02:910:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:918::,2a02:918:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:920::,2a02:920:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:928::,2a02:928:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:930::,2a02:930:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:938::,2a02:93f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:940::,2a02:947:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:950::,2a02:957:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:958::,2a02:958:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:960::,2a02:960:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:968::,2a02:968:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:970::,2a02:970:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:978::,2a02:978:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:980::,2a02:987:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:988::,2a02:988:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:990::,2a02:990:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:998::,2a02:998:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:9a0::,2a02:9a0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:9a8::,2a02:9a8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:9b0::,2a02:9b0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:9b8::,2a02:9b9:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:9c0::,2a02:9c7:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a02:9c8::,2a02:9cf:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:9d0::,2a02:9d0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:9d8::,2a02:9d8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:9e0::,2a02:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:9e8::,2a02:9e8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:9f0::,2a02:9f0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a02:9f8::,2a02:9f8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:a00::,2a02:a00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:a08::,2a02:a08:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:a10::,2a02:a10::ffff:ffff:ffff:ffff:ffff,US +2a02:a10:1::,2a02:a10:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:a11::,2a02:a17:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:a18::,2a02:a18:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:a20::,2a02:a20:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:a28::,2a02:a28:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:a30::,2a02:a30:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a02:a38::,2a02:a38:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:a40::,2a02:a40:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:a48::,2a02:a4f:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:a50::,2a02:a50:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:a58::,2a02:a58:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:a60::,2a02:a60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:a68::,2a02:a68:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:a70::,2a02:a70:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:a78::,2a02:a78:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:a80::,2a02:a80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:a88::,2a02:a88:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:a90::,2a02:a90:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:a98::,2a02:a98:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a02:aa0::,2a02:aa6:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:aa7::,2a02:aa7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:aa8::,2a02:aaf:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:ab0::,2a02:ab0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:ab8::,2a02:abf:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:ac0::,2a02:ac0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:ac8::,2a02:ac8:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a02:ad0::,2a02:ad7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:ad8::,2a02:ad8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:ae0::,2a02:ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:ae8::,2a02:aef:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:af0::,2a02:af0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:af8::,2a02:af8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:b00::,2a02:b00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:b08::,2a02:b0f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:b10::,2a02:b10:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:b18::,2a02:b18:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:b20::,2a02:b20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:b28::,2a02:b30:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:b48::,2a02:b48:ff:ffff:ffff:ffff:ffff:ffff,US +2a02:b48:100::,2a02:b4f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:b50::,2a02:b50:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:b58::,2a02:b58:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a02:b60::,2a02:b60:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a02:b70::,2a02:b70:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:b78::,2a02:b78:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:b80::,2a02:b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:b88::,2a02:b88:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:b90::,2a02:b90:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:b98::,2a02:b98:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:ba0::,2a02:ba0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:ba8::,2a02:ba8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:bb0::,2a02:bb0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:bb8::,2a02:bb8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:bc0::,2a02:bc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:bc8::,2a02:bcf:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:bd0::,2a02:bd0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:bd8::,2a02:bd8:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:be0::,2a02:be0:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:be8::,2a02:be8:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:bf0::,2a02:bf0:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a02:bf8::,2a02:bf8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:c00::,2a02:c00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:c08::,2a02:c08:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a02:c10::,2a02:c10:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:c18::,2a02:c18:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:c20::,2a02:c20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:c28::,2a02:c2f:ffff:ffff:ffff:ffff:ffff:ffff,JE +2a02:c38::,2a02:c38:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:c40::,2a02:c47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:c48::,2a02:c50:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:c58::,2a02:c58:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:c60::,2a02:c60:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:c68::,2a02:c68:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:c70::,2a02:c70:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:c78::,2a02:c7f:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:c80::,2a02:c80:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:c88::,2a02:c88:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:c90::,2a02:c90:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:c98::,2a02:c9f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:ca0::,2a02:ca0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:ca8::,2a02:ca8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:cb0::,2a02:cb0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:cc0::,2a02:cc9:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:cd0::,2a02:cd0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:cd8::,2a02:cd8:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:ce0::,2a02:ce0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:ce8::,2a02:ce8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:cf0::,2a02:cf0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:d00::,2a02:d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:d08::,2a02:d0f:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:d10::,2a02:d17:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:d18::,2a02:d18:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a02:d20::,2a02:d20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:d28::,2a02:d28:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:d30::,2a02:d30:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:d38::,2a02:d3f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:d40::,2a02:d40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:d48::,2a02:d48:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:d50::,2a02:d50:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:d58::,2a02:d5f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:d60::,2a02:d60:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:d68::,2a02:d6f:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:d70::,2a02:d70:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:d78::,2a02:d78:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:d80::,2a02:d80:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:d88::,2a02:d88:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:d90::,2a02:d97:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:d98::,2a02:d98:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:da8::,2a02:da8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:db0::,2a02:db0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:db8::,2a02:db8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:dc0::,2a02:dc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:dc8::,2a02:dcf:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:dd0::,2a02:dd0:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a02:dd8::,2a02:ddf:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:de0::,2a02:de0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:de8::,2a02:de8:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a02:df0::,2a02:df0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:df8::,2a02:dff:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:e00::,2a02:e00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:e08::,2a02:e08:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:e10::,2a02:e10:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:e20::,2a02:e27:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:e28::,2a02:e28:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:e30::,2a02:e30:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:e38::,2a02:e38:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:e40::,2a02:e40:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a02:e48::,2a02:e48:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a02:e50::,2a02:e50:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:e58::,2a02:e5f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:e60::,2a02:e60:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:e68::,2a02:e68:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:e70::,2a02:e70:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:e80::,2a02:e80:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a02:e88::,2a02:e88:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:e90::,2a02:e90:ffff:ffff:ffff:ffff:ffff:ffff,FO +2a02:e98::,2a02:e98:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:ea0::,2a02:ea7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:ea8::,2a02:ea8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:eb0::,2a02:eb0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:eb8::,2a02:ebf:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:ec0::,2a02:ec0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:ec8::,2a02:ec8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:ed0::,2a02:ed0:431d:7fff:ffff:ffff:ffff:ffff,IL +2a02:ed0:431d:8000::,2a02:ed0:431d:ffff:ffff:ffff:ffff:ffff,RO +2a02:ed0:431e::,2a02:ed0:53f9:ffff:ffff:ffff:ffff:ffff,IL +2a02:ed0:53fa::,2a02:ed0:53fa:7fff:ffff:ffff:ffff:ffff,US +2a02:ed0:53fa:8000::,2a02:ed7:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:ed8::,2a02:ed8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:ee0::,2a02:ee0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:ef0::,2a02:ef0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:ef8::,2a02:ef8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:f00::,2a02:f00:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:f08::,2a02:f08:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:f10::,2a02:f10:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a02:f18::,2a02:f18:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:f20::,2a02:f20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:f28::,2a02:f28:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:f30::,2a02:f30:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:f38::,2a02:f38:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:f40::,2a02:f40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:f48::,2a02:f4f:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a02:f50::,2a02:f50:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a02:f58::,2a02:f5f:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:f60::,2a02:f60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:f68::,2a02:f6f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:f70::,2a02:f70:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:f78::,2a02:f7f:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:f80::,2a02:f80:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:f88::,2a02:f88:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a02:f90::,2a02:f90:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:f98::,2a02:f98:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:fa0::,2a02:fa0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:fa8::,2a02:fa8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:fb0::,2a02:fb0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:fb8::,2a02:fb8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:fc0::,2a02:fc7:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:fc8::,2a02:fc8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:fd0::,2a02:fd0:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a02:fd8::,2a02:fd8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:fe0::,2a02:fe7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:fe8::,2a02:fe9:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:ff0::,2a02:ff0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:1000::,2a02:103f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:1200::,2a02:1206:4559:ffff:ffff:ffff:ffff:ffff,CH +2a02:1206:455a::,2a02:1206:455a:7fff:ffff:ffff:ffff:ffff,FR +2a02:1206:455a:8000::,2a02:1206:45c7:ffff:ffff:ffff:ffff:ffff,CH +2a02:1206:45c8::,2a02:1206:45c8:7fff:ffff:ffff:ffff:ffff,DE +2a02:1206:45c8:8000::,2a02:121e:48d:ffff:ffff:ffff:ffff:ffff,CH +2a02:121e:48e::,2a02:121e:48e:7fff:ffff:ffff:ffff:ffff,DE +2a02:121e:48e:8000::,2a02:121f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:1300::,2a02:1300:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a02:1308::,2a02:1308:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:1310::,2a02:1310:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:1318::,2a02:1318:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:1320::,2a02:1320:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:1328::,2a02:1328:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:1338::,2a02:1338:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:1340::,2a02:1340:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:1348::,2a02:1348:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:1350::,2a02:1350:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:1358::,2a02:1358:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:1360::,2a02:1360:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:1368::,2a02:1368:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:1370::,2a02:1370:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:1378::,2a02:1378:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:1380::,2a02:1380:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:1388::,2a02:138f:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:1390::,2a02:1390:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:1398::,2a02:1398:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:13a0::,2a02:13a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:13a8::,2a02:13a8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:13b0::,2a02:13b0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:13b8::,2a02:13bf:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:13c0::,2a02:13c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:13c8::,2a02:13c8:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:13d0::,2a02:13d0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:13d8::,2a02:13d8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:13e0::,2a02:13e0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:13e8::,2a02:13e8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:13f0::,2a02:13f0:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:13f8::,2a02:13ff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:1400::,2a02:143f:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:1600::,2a02:1600:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:1608::,2a02:1608:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:1610::,2a02:1610:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:1618::,2a02:1618:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a02:1620::,2a02:1620:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:1628::,2a02:1628:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:1630::,2a02:1630:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:1638::,2a02:1638:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:1648::,2a02:164f:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:1650::,2a02:1650:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:1658::,2a02:1658:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:1660::,2a02:1660:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:1668::,2a02:166a:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:166b::,2a02:166b::ffff:ffff:ffff:ffff:ffff,US +2a02:166b:1::,2a02:166f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:1670::,2a02:1670:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:1678::,2a02:1678:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:1680::,2a02:1680:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:1688::,2a02:1688:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:1698::,2a02:1698:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:16a0::,2a02:16a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:16a8::,2a02:16a8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:16b0::,2a02:16b0:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a02:16b8::,2a02:16b8:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:16c0::,2a02:16c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:16c8::,2a02:16c8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:16d0::,2a02:16d0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:16d8::,2a02:16d8:103:ffff:ffff:ffff:ffff:ffff,LV +2a02:16d8:104::,2a02:16d8:104:7fff:ffff:ffff:ffff:ffff,DE +2a02:16d8:104:8000::,2a02:16d8:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a02:16e0::,2a02:16e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:16e8::,2a02:16e8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:16f0::,2a02:16f0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:16f8::,2a02:16f8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:1700::,2a02:1700:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:1710::,2a02:1710:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:1718::,2a02:1718:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a02:1720::,2a02:1720:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:1730::,2a02:1730:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:1738::,2a02:1738:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:1740::,2a02:1740:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:1748::,2a02:1748:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:1750::,2a02:1750:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:1758::,2a02:175f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:1760::,2a02:1760:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:1770::,2a02:1770:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:1778::,2a02:1778:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:1780::,2a02:1780:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:1788::,2a02:1788:4ff:83ff:ffff:ffff:ffff:ffff,GB +2a02:1788:4ff:8400::,2a02:1788:4ff:84ff:ffff:ffff:ffff:ffff,US +2a02:1788:4ff:8500::,2a02:1788:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:1790::,2a02:1790:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:1798::,2a02:179f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:17a0::,2a02:17a7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:17a8::,2a02:17a8:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a02:17b0::,2a02:17b0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:17b8::,2a02:17b8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:17c0::,2a02:17c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:17c8::,2a02:17c8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:17d0::,2a02:17d0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:17d8::,2a02:17d8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:17e0::,2a02:17e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:17e8::,2a02:17e8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:17f0::,2a02:17f0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:17f8::,2a02:17f8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:1800::,2a02:18ff:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:2000::,2a02:2000:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:2008::,2a02:2008:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2010::,2a02:2017:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:2018::,2a02:2018:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2020::,2a02:2020:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:2028::,2a02:2028:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2030::,2a02:2030:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a02:2038::,2a02:2038:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2040::,2a02:2040:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:2048::,2a02:2048:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:2050::,2a02:2050:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2058::,2a02:2058:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:2060::,2a02:2060:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2068::,2a02:206f:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2070::,2a02:2070:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2078::,2a02:2078:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:2080::,2a02:2080:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2088::,2a02:2088:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2090::,2a02:2090:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2098::,2a02:209f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:20a0::,2a02:20a0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:20a8::,2a02:20a8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:20b0::,2a02:20b7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:20b8::,2a02:20b8:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a02:20c0::,2a02:20c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:20c8::,2a02:20c8:3361:ffff:ffff:ffff:ffff:ffff,NO +2a02:20c8:3362::,2a02:20c8:3362:7fff:ffff:ffff:ffff:ffff,DE +2a02:20c8:3362:8000::,2a02:20c8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:20d0::,2a02:20d7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:20d8::,2a02:20df:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:20e0::,2a02:20e7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:20f0::,2a02:20f0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:20f8::,2a02:20f8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2100::,2a02:2100:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2108::,2a02:2108:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:2110::,2a02:2110:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2118::,2a02:211f:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:2120::,2a02:2123:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2140::,2a02:2147:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2148::,2a02:2149:8832:7fff:ffff:ffff:ffff:ffff,GR +2a02:2149:8832:8000::,2a02:2149:8832:ffff:ffff:ffff:ffff:ffff,US +2a02:2149:8833::,2a02:214f:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:2150::,2a02:2150:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:2158::,2a02:215f:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:2160::,2a02:2160:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:2168::,2a02:2168:1770:7fff:ffff:ffff:ffff:ffff,RU +2a02:2168:1770:8000::,2a02:2168:1770:ffff:ffff:ffff:ffff:ffff,CN +2a02:2168:1771::,2a02:2168:284c:7fff:ffff:ffff:ffff:ffff,RU +2a02:2168:284c:8000::,2a02:2168:284c:ffff:ffff:ffff:ffff:ffff,AE +2a02:2168:284d::,2a02:2168:3bc5:ffff:ffff:ffff:ffff:ffff,RU +2a02:2168:3bc6::,2a02:2168:3bc6:7fff:ffff:ffff:ffff:ffff,US +2a02:2168:3bc6:8000::,2a02:2168:3bcb:ffff:ffff:ffff:ffff:ffff,RU +2a02:2168:3bcc::,2a02:2168:3bcc:7fff:ffff:ffff:ffff:ffff,US +2a02:2168:3bcc:8000::,2a02:216f:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2170::,2a02:2170:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2178::,2a02:217f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2180::,2a02:2180:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:2188::,2a02:2188:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2190::,2a02:2190:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:2198::,2a02:219f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:21a0::,2a02:21a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:21a8::,2a02:21a8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:21b0::,2a02:21b7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:21b8::,2a02:21b8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:21c0::,2a02:21c0:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a02:21c8::,2a02:21c8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:21d0::,2a02:21d0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:21d8::,2a02:21d8:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:21e0::,2a02:21e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:21e8::,2a02:21e8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:21f0::,2a02:21f0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:21f8::,2a02:21f8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2200::,2a02:2200:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2208::,2a02:2208:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a02:2210::,2a02:2210:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2218::,2a02:2218:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2220::,2a02:2220:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:2228::,2a02:2228:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2230::,2a02:2230:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:2240::,2a02:2247:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2248::,2a02:2248:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:2250::,2a02:2250:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2258::,2a02:2258:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2260::,2a02:2260:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2268::,2a02:2268:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2270::,2a02:2270:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2278::,2a02:2278:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:2280::,2a02:2280:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2288::,2a02:2288:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2290::,2a02:2297:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a02:2298::,2a02:2298:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:22a0::,2a02:22a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:22a8::,2a02:22a8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:22b0::,2a02:22b0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:22b8::,2a02:22b8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:22c0::,2a02:22c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:22c8::,2a02:22c8:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:22d0::,2a02:22d0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:22d8::,2a02:22d8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:22e0::,2a02:22e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:22e8::,2a02:22e8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:22f0::,2a02:22f0:ff:ffff:ffff:ffff:ffff:ffff,DE +2a02:22f0:100::,2a02:22f0:1ff:ffff:ffff:ffff:ffff:ffff,GB +2a02:22f0:200::,2a02:22f0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2300::,2a02:2300:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2308::,2a02:2308:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2310::,2a02:2310:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2318::,2a02:2318::7fff:ffff:ffff:ffff:ffff,IM +2a02:2318:0:8000::,2a02:231f:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2328::,2a02:2328:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2330::,2a02:2337:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a02:2338::,2a02:233f:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:2340::,2a02:2340:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:2348::,2a02:2348:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:2350::,2a02:2350:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:2358::,2a02:2358:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2360::,2a02:2360:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2368::,2a02:2368:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2378::,2a02:2378:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:2380::,2a02:2380:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:2388::,2a02:2388:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2390::,2a02:2390:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a02:2398::,2a02:239f:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:23a0::,2a02:23a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:23a8::,2a02:23a8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:23b0::,2a02:23b0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:23b8::,2a02:23b8:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:23c0::,2a02:23c0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:23c8::,2a02:23c8:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:23d0::,2a02:23d0:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:23d8::,2a02:23d8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:23e0::,2a02:23e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:23e8::,2a02:23e8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:23f0::,2a02:23f0:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a02:23f8::,2a02:23f8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2400::,2a02:2400:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2408::,2a02:2408:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2410::,2a02:2410:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:2420::,2a02:2420:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:2428::,2a02:2428:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2430::,2a02:2430:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2438::,2a02:2438:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2440::,2a02:2440:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2448::,2a02:2448:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2450::,2a02:2457:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2458::,2a02:2458:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2468::,2a02:2468:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2470::,2a02:2477:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2478::,2a02:2480:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2488::,2a02:2488:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2490::,2a02:2490:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:2498::,2a02:2498:efff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2498:f000::,2a02:2498:f000:7fff:ffff:ffff:ffff:ffff,NL +2a02:2498:f000:8000::,2a02:2498:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:24a0::,2a02:24a0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:24a8::,2a02:24a8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:24b0::,2a02:24b0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:24b8::,2a02:24bf:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:24c0::,2a02:24c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:24c8::,2a02:24c8:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:24d0::,2a02:24d7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:24d8::,2a02:24d8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:24e0::,2a02:24e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:24e8::,2a02:24e8:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:24f0::,2a02:24f0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:24f8::,2a02:24f8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:2500::,2a02:2500:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2510::,2a02:2510:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2518::,2a02:2518:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2520::,2a02:2520:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:2528::,2a02:252f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:2530::,2a02:2530:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:2538::,2a02:2538:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:2540::,2a02:2540:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:2548::,2a02:2548:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2550::,2a02:2550:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2558::,2a02:2558:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a02:2560::,2a02:2560:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2568::,2a02:2568:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2578::,2a02:2578:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a02:2580::,2a02:2587:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:2588::,2a02:258f:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2590::,2a02:2590:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:25a0::,2a02:25a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:25a8::,2a02:25af:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:25b0::,2a02:25b0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:25c0::,2a02:25c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:25c8::,2a02:25c8:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:25d0::,2a02:25d0:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a02:25d8::,2a02:25d8:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a02:25e0::,2a02:25e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:25e8::,2a02:25e8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:25f8::,2a02:25f8:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a02:2600::,2a02:2600:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:2608::,2a02:2608:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a02:2610::,2a02:2610:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:2618::,2a02:2618:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2620::,2a02:2620:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2628::,2a02:2628:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:2630::,2a02:2637:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a02:2638::,2a02:2638:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2640::,2a02:2647:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2648::,2a02:2648:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2650::,2a02:2650:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2658::,2a02:2658:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2660::,2a02:2660:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:2668::,2a02:2668:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2670::,2a02:2670:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2678::,2a02:2678:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2680::,2a02:2680:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2688::,2a02:2688:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2690::,2a02:2690:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2698::,2a02:2698:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:26a0::,2a02:26a7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:26a8::,2a02:26a8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:26b0::,2a02:26b0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:26b8::,2a02:26b8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:26c0::,2a02:26c0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:26c8::,2a02:26c8:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a02:26d0::,2a02:26d0:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a02:26e0::,2a02:26e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:26e8::,2a02:26e8:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:26f0:f3:183::298d,2a02:26f0:f3:183::298d,TW +2a02:26f8::,2a02:26ff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2700::,2a02:2700:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a02:2708::,2a02:2708:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2710::,2a02:2710:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:2718::,2a02:271f:ffff:ffff:ffff:ffff:ffff:ffff,YE +2a02:2720::,2a02:2720:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:2728::,2a02:2728:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2730::,2a02:2730:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2738::,2a02:2738:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2740::,2a02:2740:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2748::,2a02:2748:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2750::,2a02:2750:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:2760::,2a02:2760:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2768::,2a02:2768:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2770::,2a02:2770:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2778::,2a02:2778:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2780::,2a02:2780:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2788::,2a02:2788:a4:132b:b0c0:24cd:a9f2:f7a8,BE +2a02:2788:a4:132b:b0c0:24cd:a9f2:f7a9,2a02:2788:a4:132b:b0c0:24cd:a9f2:f7a9,LU +2a02:2788:a4:132b:b0c0:24cd:a9f2:f7aa,2a02:2788:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:2790::,2a02:2790:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:2798::,2a02:2798:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:27a8::,2a02:27a9:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:27aa::,2a02:27aa:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:27ab::,2a02:27ab:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:27ac::,2a02:27ac:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a02:27ad::,2a02:27af:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:27b0::,2a02:27b0:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a02:27b8::,2a02:27bf:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:27c0::,2a02:27c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:27c8::,2a02:27c8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:27d0::,2a02:27d0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:27d8::,2a02:27d8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:27e0::,2a02:27e0:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a02:27e8::,2a02:27e8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:27f0::,2a02:27f0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:27f8::,2a02:27f8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2800::,2a02:2807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2808::,2a02:2808:2500:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2808:2501::,2a02:2808:2501:7fff:ffff:ffff:ffff:ffff,RU +2a02:2808:2501:8000::,2a02:2808:3000:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2808:3001::,2a02:2808:3001:ffff:ffff:ffff:ffff:ffff,RU +2a02:2808:3002::,2a02:2808:5300:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2808:5301::,2a02:2808:5301:ffff:ffff:ffff:ffff:ffff,RU +2a02:2808:5302::,2a02:2808:5400:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2808:5401::,2a02:2808:5401:ffff:ffff:ffff:ffff:ffff,FI +2a02:2808:5402::,2a02:2808:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2810::,2a02:2810:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2818::,2a02:2818:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:2820::,2a02:2820:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:2828::,2a02:2828:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2830::,2a02:2830:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2838::,2a02:2838:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2840::,2a02:2840:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2848::,2a02:2848:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2858::,2a02:285f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2860::,2a02:2867:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:2868::,2a02:2868:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:2870::,2a02:2870:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2878::,2a02:2878:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2880::,2a02:2880:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a02:2888::,2a02:2888:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:2890::,2a02:2890:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2898::,2a02:2898:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:28a0::,2a02:28a0:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:28a8::,2a02:28a8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:28b0::,2a02:28b7:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:28b8::,2a02:28bf:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a02:28c0::,2a02:28c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:28c8::,2a02:28c8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:28d0::,2a02:28d0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:28d8::,2a02:28d8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:28e8::,2a02:28e8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:28f0::,2a02:28f0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:28f8::,2a02:28f8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2900::,2a02:2900:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2908::,2a02:2908:ffff:ffff:ffff:ffff:ffff:ffff,OM +2a02:2910::,2a02:2910:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2918::,2a02:2920:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2928::,2a02:2928:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2930::,2a02:2930:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2938::,2a02:2938:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2940::,2a02:2940:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2948::,2a02:2948:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2950::,2a02:2950:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:2958::,2a02:2958:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2960::,2a02:2960:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:2968::,2a02:296f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2970::,2a02:2977:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2978::,2a02:2978:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2980::,2a02:2980:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2988::,2a02:2988:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2990::,2a02:2990:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2998::,2a02:2998:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:29a0::,2a02:29a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:29a8::,2a02:29a8:3ff:ffff:ffff:ffff:ffff:ffff,NL +2a02:29a8:400::,2a02:29a8:4ff:ffff:ffff:ffff:ffff:ffff,SG +2a02:29a8:500::,2a02:29a8:7ff:ffff:ffff:ffff:ffff:ffff,NL +2a02:29a8:800::,2a02:29a8:8ff:ffff:ffff:ffff:ffff:ffff,US +2a02:29a8:900::,2a02:29b0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:29b8::,2a02:29b8:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:29c0::,2a02:29c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:29c8::,2a02:29c8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:29d0::,2a02:29d0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:29d8::,2a02:29d8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:29e0::,2a02:29e0::ffff:ffff:ffff:ffff:ffff,IT +2a02:29e0:1::,2a02:29e0:1:7fff:ffff:ffff:ffff:ffff,GB +2a02:29e0:1:8000::,2a02:29e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:29e8::,2a02:29ef:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a02:29f0::,2a02:29f0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:29f8::,2a02:29f8:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a02:2a00::,2a02:2a00:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:2a08::,2a02:2a08:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:2a10::,2a02:2a10:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2a18::,2a02:2a18:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2a20::,2a02:2a20:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2a28::,2a02:2a28:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2a30::,2a02:2a37:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:2a38::,2a02:2a38:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2a40::,2a02:2a40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2a48::,2a02:2a48:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:2a50::,2a02:2a50:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a02:2a58::,2a02:2a58:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:2a60::,2a02:2a60:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a02:2a68::,2a02:2a68:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2a70::,2a02:2a70:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:2a78::,2a02:2a78:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2a80::,2a02:2a80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2a88::,2a02:2a88:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2a90::,2a02:2a90:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:2a98::,2a02:2a98:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:2aa0::,2a02:2aa0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2aa8::,2a02:2aa8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2ab0::,2a02:2ab0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2ab8::,2a02:2ab8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2ac0::,2a02:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2ac8::,2a02:2ac8:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:2ad0::,2a02:2ad0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2ad8::,2a02:2ad8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:2ae0::,2a02:2ae0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:2ae8::,2a02:2ae8:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:2af0::,2a02:2af0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:2af8::,2a02:2af8:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:2b00::,2a02:2b00:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:2b08::,2a02:2b08:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2b10::,2a02:2b10:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:2b18::,2a02:2b18::7fff:ffff:ffff:ffff:ffff,RU +2a02:2b18:0:8000::,2a02:2b18::ffff:ffff:ffff:ffff:ffff,UA +2a02:2b18:1::,2a02:2b18:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2b20::,2a02:2b20:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:2b28::,2a02:2b28:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2b30::,2a02:2b30:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:2b38::,2a02:2b38:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2b40::,2a02:2b47:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:2b48::,2a02:2b4f:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2b50::,2a02:2b50:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2b58::,2a02:2b5f:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:2b60::,2a02:2b60:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2b80::,2a02:2b80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2b88::,2a02:2b88:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2b90::,2a02:2b97:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2b98::,2a02:2b98:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:2ba0::,2a02:2ba0:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a02:2ba8::,2a02:2ba8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2bb0::,2a02:2bb0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:2bb8::,2a02:2bb8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2bc0::,2a02:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2c00::,2a02:2c07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2c40::,2a02:2c40:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:2c60::,2a02:2c60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2c80::,2a02:2c80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:2ca6:2e::,2a02:2ca6:2e:ffff:ffff:ffff:ffff:ffff,GB +2a02:2ca7:2e::,2a02:2ca7:2e:ffff:ffff:ffff:ffff:ffff,US +2a02:2cc0::,2a02:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2ce0::,2a02:2ce0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:2d00::,2a02:2d00:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:2d20::,2a02:2d20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2d40::,2a02:2d40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2d60::,2a02:2d60:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2da0::,2a02:2da0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2dc0::,2a02:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2de0::,2a02:2de0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2e00::,2a02:2e1f:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2f00::,2a02:2f04:d17:7fff:ffff:ffff:ffff:ffff,RO +2a02:2f04:d17:8000::,2a02:2f04:d17:ffff:ffff:ffff:ffff:ffff,HU +2a02:2f04:d18::,2a02:2f0f:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:2f80::,2a02:2f87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2fa0::,2a02:2fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2fc0::,2a02:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2fe0::,2a02:2fe0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:3000::,2a02:31ff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:4000::,2a02:4000:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:4020::,2a02:4020:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:4040::,2a02:4040:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4060::,2a02:4067:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:4080::,2a02:4080:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a02:40a0::,2a02:40a0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:40c0::,2a02:40c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:40e0::,2a02:40e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:4100::,2a02:4100:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4120::,2a02:4120:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:4140::,2a02:4140:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:4160::,2a02:4160:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:4180::,2a02:4180:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a02:41a0::,2a02:41a7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:41c0::,2a02:41c0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:41e0::,2a02:41e0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:4200::,2a02:4200:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:4220::,2a02:4220:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:4240::,2a02:4240:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:4260::,2a02:4267:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:4280::,2a02:4280:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a02:42a0::,2a02:42a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:42c0::,2a02:42c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:42e0::,2a02:42e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:4300::,2a02:4300:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:4320::,2a02:4320:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:4340::,2a02:4340:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4360::,2a02:4360:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:4380::,2a02:4380:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a02:43a0::,2a02:43a0:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a02:43c0::,2a02:43c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:43e0::,2a02:43e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4400::,2a02:4400:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a02:4420::,2a02:4420:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:4440::,2a02:4440:ffff:ffff:ffff:ffff:ffff:ffff,QA +2a02:4460::,2a02:4460:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:4480::,2a02:4480:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:44a0::,2a02:44a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:44c0::,2a02:44c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:44e0::,2a02:44e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4500::,2a02:4500:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:4520::,2a02:4520:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a02:4540::,2a02:4547:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:4560::,2a02:4560:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4580::,2a02:4580:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:45a0::,2a02:45a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:45c0::,2a02:45c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:4600::,2a02:4600:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:4620::,2a02:4620:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:4640::,2a02:4640:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:4660::,2a02:4660:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:4680::,2a02:4680:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:46a0::,2a02:46a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:46c0::,2a02:46c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:46e0::,2a02:46e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4720::,2a02:4720:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4740::,2a02:4740:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4760::,2a02:4760:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:4780::,2a02:4780::ffff:ffff:ffff:ffff:ffff,LT +2a02:4780:1::,2a02:4780:1:ffff:ffff:ffff:ffff:ffff,US +2a02:4780:2::,2a02:4780:2:ffff:ffff:ffff:ffff:ffff,GB +2a02:4780:3::,2a02:4780:bac:ffff:ffff:ffff:ffff:ffff,LT +2a02:4780:bad::,2a02:4780:bad:ffff:ffff:ffff:ffff:ffff,US +2a02:4780:bae::,2a02:4780:deac:ffff:ffff:ffff:ffff:ffff,LT +2a02:4780:dead::,2a02:4780:dead:ffff:ffff:ffff:ffff:ffff,US +2a02:4780:deae::,2a02:4780:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a02:47a0::,2a02:47a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:47c0::,2a02:47c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:47e0::,2a02:47e7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:4800::,2a02:4807:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:4820::,2a02:4820:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:4840::,2a02:4840:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a02:4860::,2a02:4860:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4880::,2a02:4880:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:48a0::,2a02:48a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:48e0::,2a02:48e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:4900::,2a02:4907:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:4940::,2a02:4940:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:4960::,2a02:4960:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:4980::,2a02:4980:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:49a0::,2a02:49a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:49c0::,2a02:49c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:49e0::,2a02:49e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:4a00::,2a02:4a00:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:4a20::,2a02:4a20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:4a40::,2a02:4a40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:4a60::,2a02:4a60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:4a80::,2a02:4a80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:4aa0::,2a02:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4ac0::,2a02:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:4ac1::,2a02:4ac1:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:4ac2::,2a02:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:4ae0::,2a02:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4b00::,2a02:4b07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:4b40::,2a02:4b40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4b60::,2a02:4b60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:4b80::,2a02:4b80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:4ba0::,2a02:4ba0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:4bc0::,2a02:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:4be0::,2a02:4be0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:4c00::,2a02:4c07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:4c20::,2a02:4c20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4c40::,2a02:4c47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4c80::,2a02:4c80:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:4cc0::,2a02:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:4ce0::,2a02:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4d00::,2a02:4d00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:4d20::,2a02:4d20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4d40::,2a02:4d40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:4d60::,2a02:4d60:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a02:4d80::,2a02:4d80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4da0::,2a02:4da0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:4dc0::,2a02:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:4de0::,2a02:4de0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:4e20::,2a02:4e20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4e40::,2a02:4e40:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:4e60::,2a02:4e60:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:4e80::,2a02:4e80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:4ea0::,2a02:4ea0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:4ec0::,2a02:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4ee0::,2a02:4ee0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:4f00::,2a02:4f00:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:4f20::,2a02:4f20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4f40::,2a02:4f40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:4f60::,2a02:4f67:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4f80::,2a02:4f80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:4fa0::,2a02:4fa0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a02:4fc0::,2a02:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:4fe0::,2a02:4fe0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:5000::,2a02:5000:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:5020::,2a02:5020:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5040::,2a02:5040:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:5060::,2a02:5060:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:5080::,2a02:5080:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:50a0::,2a02:50a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:50c0::,2a02:50c7:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a02:50e0::,2a02:50e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:5100::,2a02:5100:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:5120::,2a02:5120:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:5140::,2a02:5140:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5160::,2a02:5160:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:5180::,2a02:5180:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:51a0::,2a02:51a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:51c0::,2a02:51c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:51e0::,2a02:51e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:5200::,2a02:5200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:5220::,2a02:5220:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:5240::,2a02:5240:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:5260::,2a02:5260:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:5280::,2a02:5280:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:52a0::,2a02:52a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:52c0::,2a02:52c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:52e0::,2a02:52e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:5300::,2a02:5300:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5320::,2a02:5320:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a02:5340::,2a02:5340:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:5360::,2a02:5360:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:5380::,2a02:5380:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:53a0::,2a02:53a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:53c0::,2a02:53c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:53e0::,2a02:53e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:5400::,2a02:5400:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5420::,2a02:5420:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:5440::,2a02:5440:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:5460::,2a02:5460:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:5480::,2a02:5480:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:54a0::,2a02:54a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:54c0::,2a02:54c0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:54e0::,2a02:54e7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:5500::,2a02:5507:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:5520::,2a02:5520:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:5540::,2a02:5540:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:5560::,2a02:5560:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:5580::,2a02:5580:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a02:55a0::,2a02:55a0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:55c0::,2a02:55c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:55e0::,2a02:55e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:5600::,2a02:5600:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:5620::,2a02:5620:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:5640::,2a02:5647:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:5660::,2a02:5660:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:5680::,2a02:5680:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:56a0::,2a02:56a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:56c0::,2a02:56c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:56e0::,2a02:56e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5700::,2a02:5700:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a02:5720::,2a02:5720:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a02:5740::,2a02:5740:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a02:5760::,2a02:5767:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:5780::,2a02:5780:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:57a0::,2a02:57a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:57c0::,2a02:57c0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:57e0::,2a02:57e7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:5800::,2a02:5800:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:5820::,2a02:5820:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:5840::,2a02:5840:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:5860::,2a02:5860:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5880::,2a02:5880:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:58a0::,2a02:58a0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:58c0::,2a02:58c0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:58e0::,2a02:58e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:5900::,2a02:5907:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:5920::,2a02:5920:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:5940::,2a02:5940:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:5960::,2a02:5960:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a02:5980::,2a02:5980:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:59a0::,2a02:59a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:59c0::,2a02:59c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:59e0::,2a02:59e0:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:5a20::,2a02:5a20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:5a40::,2a02:5a40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:5a60::,2a02:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:5a80::,2a02:5a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:5aa0::,2a02:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:5ac0::,2a02:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:5ae0::,2a02:5ae0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:5b00::,2a02:5b00:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:5b20::,2a02:5b20:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:5b40::,2a02:5b40:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:5b60::,2a02:5b60:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a02:5b80::,2a02:5b80:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:5ba0::,2a02:5ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5bc0::,2a02:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:5be0::,2a02:5be0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5c00::,2a02:5c07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:5c20::,2a02:5c27:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:5c40::,2a02:5c40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:5c60::,2a02:5c60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:5c80::,2a02:5c80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:5ca0::,2a02:5ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:5cc0::,2a02:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:5ce0::,2a02:5ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5d00::,2a02:5d01:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:5d20::,2a02:5d20:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:5d40::,2a02:5d47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:5d60::,2a02:5d60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:5d80::,2a02:5d87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5da0::,2a02:5da0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:5dc0::,2a02:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:5de0::,2a02:5de0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:5e00::,2a02:5e00:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:5e20::,2a02:5e20:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:5e40::,2a02:5e40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5e60::,2a02:5e60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:5e80::,2a02:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:5ea0::,2a02:5ea0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:5ec0::,2a02:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:5ee0::,2a02:5ee0:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a02:5f00::,2a02:5f00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:5f20::,2a02:5f20:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:5f40::,2a02:5f40:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a02:5f60::,2a02:5f60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:5f80::,2a02:5f87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:5fa0::,2a02:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:5fc0::,2a02:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:5fe0::,2a02:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6000::,2a02:6000:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:6020::,2a02:6027:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a02:6040::,2a02:6040:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:6060::,2a02:6060:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:6080::,2a02:6080:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:60a0::,2a02:60a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:60c0::,2a02:60c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:60e0::,2a02:60e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:6100::,2a02:6100:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:6120::,2a02:6120:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:6160::,2a02:6160:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6180::,2a02:6180:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:61a0::,2a02:61a0:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a02:61c0::,2a02:61c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:61e0::,2a02:61e0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:6200::,2a02:6207:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:6240::,2a02:6240:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:6260::,2a02:6260:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:6280::,2a02:6280:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:62a0::,2a02:62a0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:62c0::,2a02:62c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:6300::,2a02:6300:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:6320::,2a02:6320:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a02:6340::,2a02:6340:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:6360::,2a02:6360:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:6380::,2a02:6380:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:63a0::,2a02:63a0:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:63c0::,2a02:63c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:63e0::,2a02:63e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:6400::,2a02:6400:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:6420::,2a02:6420:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:6440::,2a02:6440:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:6460::,2a02:6460:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:6480::,2a02:6480:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:64a0::,2a02:64a0:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:64c0::,2a02:64c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:64e0::,2a02:64e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6500::,2a02:6500:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:6520::,2a02:6520:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:6540::,2a02:6540:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6560::,2a02:6560:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:6580::,2a02:6580:ffff:ffff:ffff:ffff:ffff:ffff,US +2a02:65a0::,2a02:65a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:65c0::,2a02:65c0:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a02:65e0::,2a02:65e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:6600::,2a02:6600:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:6620::,2a02:6627:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6640::,2a02:6640:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:6660::,2a02:6660:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6680::,2a02:6680:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:66a0::,2a02:66a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:66c0::,2a02:66c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:66e0::,2a02:66e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:6700::,2a02:6700:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:6720::,2a02:6720:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:6740::,2a02:6740:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:6760::,2a02:6760:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:6780::,2a02:6780:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:67a0::,2a02:67a0:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a02:67c0::,2a02:67c0:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a02:67e0::,2a02:67e0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:6800::,2a02:6800:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:6820::,2a02:6820:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:6840::,2a02:6840:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:6860::,2a02:6860:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6880::,2a02:6880:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:68a0::,2a02:68a0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a02:68c0::,2a02:68c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:68e0::,2a02:68e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:6900::,2a02:6900:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:6920::,2a02:6920:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6940::,2a02:6940:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:6960::,2a02:6960:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6980::,2a02:6980:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:69a0::,2a02:69a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:69c0::,2a02:69c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6a00::,2a02:6a00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:6a20::,2a02:6a20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6a40::,2a02:6a40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:6a60::,2a02:6a60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:6a80::,2a02:6a80:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:6aa0::,2a02:6aa0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:6ac0::,2a02:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6ae0::,2a02:6ae0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:6b00::,2a02:6b00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6b20::,2a02:6b20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:6b40::,2a02:6b40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:6b60::,2a02:6b60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6b80::,2a02:6b80:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a02:6ba0::,2a02:6ba7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6bc0::,2a02:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6be0::,2a02:6be0:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a02:6c00::,2a02:6c00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6c20::,2a02:6c20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:6c40::,2a02:6c40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:6c60::,2a02:6c60:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:6c80::,2a02:6c80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6ca0::,2a02:6ca7:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:6cc0::,2a02:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6ce0::,2a02:6ce0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:6d00::,2a02:6d00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6d20::,2a02:6d20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6d40::,2a02:6d40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:6d60::,2a02:6d60:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:6d80::,2a02:6d80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6da0::,2a02:6da0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6dc0::,2a02:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:6de0::,2a02:6de0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:6e20::,2a02:6e20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:6e40::,2a02:6e40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6e60::,2a02:6e60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:6ea0::,2a02:6ea0:bfff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6ea0:c000::,2a02:6ea0:c0ff:ffff:ffff:ffff:ffff:ffff,NL +2a02:6ea0:c100::,2a02:6ea0:c1ff:ffff:ffff:ffff:ffff:ffff,US +2a02:6ea0:c200::,2a02:6ea0:c2ff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:6ea0:c300::,2a02:6ea0:c3ff:ffff:ffff:ffff:ffff:ffff,ES +2a02:6ea0:c400::,2a02:6ea0:c4ff:ffff:ffff:ffff:ffff:ffff,US +2a02:6ea0:c500::,2a02:6ea0:c5ff:ffff:ffff:ffff:ffff:ffff,SE +2a02:6ea0:c600::,2a02:6ea0:c6ff:ffff:ffff:ffff:ffff:ffff,US +2a02:6ea0:c700::,2a02:6ea0:c7ff:ffff:ffff:ffff:ffff:ffff,DE +2a02:6ea0:c800::,2a02:6ea0:c8ff:ffff:ffff:ffff:ffff:ffff,US +2a02:6ea0:c900::,2a02:6ea0:c9ff:ffff:ffff:ffff:ffff:ffff,FR +2a02:6ea0:ca00::,2a02:6ea0:cc00::,GB +2a02:6ea0:cc00::1,2a02:6ea0:cc00::1,US +2a02:6ea0:cc00::2,2a02:6ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6ec0::,2a02:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:6f00::,2a02:6f00:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a02:6f20::,2a02:6f20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:6f40::,2a02:6f40:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:6f60::,2a02:6f60:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:6f80::,2a02:6f80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6fa0::,2a02:6fa0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:6fc0::,2a02:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:6fe0::,2a02:6fe0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:7000::,2a02:7007:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:7040::,2a02:7040:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:7060::,2a02:7060:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:7080::,2a02:7080:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:70a0::,2a02:70a0:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a02:70c0::,2a02:70c0:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a02:70e0::,2a02:70e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:7100::,2a02:7100:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:7120::,2a02:7120:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:7140::,2a02:7140:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7160::,2a02:7160:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:7180::,2a02:7180:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:71a0::,2a02:71a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:71c0::,2a02:71c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:71e0::,2a02:71e0:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:7200::,2a02:7200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:7220::,2a02:7220:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:7240::,2a02:7240:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:7260::,2a02:7260:ffff:ffff:ffff:ffff:ffff:ffff,IM +2a02:7280::,2a02:7280:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:72a0::,2a02:72a7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:72e0::,2a02:72e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:7300::,2a02:7300:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a02:7320::,2a02:7320:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:7340::,2a02:7340:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:7360::,2a02:7360:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:7380::,2a02:7380:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:73a0::,2a02:73a0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:73c0::,2a02:73c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:73e0::,2a02:73e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:7400::,2a02:7400:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:7420::,2a02:7420:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:7440::,2a02:7440:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:7460::,2a02:7460:ffff:ffff:ffff:ffff:ffff:ffff,MQ +2a02:7480::,2a02:7480:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:74a0::,2a02:74a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:74c0::,2a02:74c0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:74e0::,2a02:74e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7500::,2a02:7500:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a02:7520::,2a02:7520:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:7540::,2a02:7540:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:7560::,2a02:7560:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:7580::,2a02:7580:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:75a0::,2a02:75a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:75c0::,2a02:75c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:75e0::,2a02:75e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:7600::,2a02:7600:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:7620::,2a02:7620:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7640::,2a02:7640:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:7660::,2a02:7660:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:7680::,2a02:7680:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:76a0::,2a02:76a0:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a02:76c0::,2a02:76c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:76e0::,2a02:76e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:7700::,2a02:7700:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7720::,2a02:7727:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:7740::,2a02:7740:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a02:7760::,2a02:7760:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:7780::,2a02:7780:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a02:77a0::,2a02:77a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:77c0::,2a02:77c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:77e0::,2a02:77e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7800::,2a02:7800:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:7820::,2a02:7820:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:7840::,2a02:7847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:7860::,2a02:7867:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:7880::,2a02:7880:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:78a0::,2a02:78a7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:78c0::,2a02:78c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:78e0::,2a02:78e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7900::,2a02:7900:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:7920::,2a02:7920:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:7940::,2a02:7940:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:7960::,2a02:7960:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:7980::,2a02:7980:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a02:79a0::,2a02:79a0:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a02:79c0::,2a02:79c0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:79e0::,2a02:79e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:7a00::,2a02:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:7a20::,2a02:7a20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7a40::,2a02:7a40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:7a60::,2a02:7a60:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:7a80::,2a02:7a80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:7aa0::,2a02:7aa0:42:ffff:ffff:ffff:ffff:ffff,LV +2a02:7aa0:43::,2a02:7aa0:43:7fff:ffff:ffff:ffff:ffff,SE +2a02:7aa0:43:8000::,2a02:7aa0:1618:ffff:ffff:ffff:ffff:ffff,LV +2a02:7aa0:1619::,2a02:7aa0:1619:ffff:ffff:ffff:ffff:ffff,SE +2a02:7aa0:161a::,2a02:7aa0:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a02:7ac0::,2a02:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:7ae0::,2a02:7ae0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:7b00::,2a02:7b07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:7b20::,2a02:7b20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:7b40::,2a02:7b40:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a02:7b60::,2a02:7b60:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a02:7b80::,2a02:7b80:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:7ba0::,2a02:7ba0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:7bc0::,2a02:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:7be0::,2a02:7be0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:7c00::,2a02:7c00:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:7c20::,2a02:7c20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:7c40::,2a02:7c40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:7c60::,2a02:7c60:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:7c80::,2a02:7c80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:7ca0::,2a02:7ca0:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a02:7cc0::,2a02:7cc0::ffff:ffff:ffff:ffff:ffff,CY +2a02:7cc0:1::,2a02:7cc0:1:7fff:ffff:ffff:ffff:ffff,RU +2a02:7cc0:1:8000::,2a02:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a02:7ce0::,2a02:7ce0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:7d00::,2a02:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:7d20::,2a02:7d20:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:7d60::,2a02:7d60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:7d80::,2a02:7d80:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:7da0::,2a02:7da0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7dc0::,2a02:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:7de0::,2a02:7de0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7e00::,2a02:7e00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:7e20::,2a02:7e20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:7e40::,2a02:7e40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:7e60::,2a02:7e60:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:7e80::,2a02:7e80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:7ea0::,2a02:7ea0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:7ec0::,2a02:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:7ee0::,2a02:7ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:7f00::,2a02:7f00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7f20::,2a02:7f20:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:7f40::,2a02:7f40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:7f60::,2a02:7f60:ffff:ffff:ffff:ffff:ffff:ffff,SM +2a02:7f80::,2a02:7f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:7fa0::,2a02:7fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:7fc0::,2a02:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:7fe0::,2a02:7fe7:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a02:8000::,2a02:8001:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8010::,2a02:8017:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:8020::,2a02:8023:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8040::,2a02:8043:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:8060::,2a02:8061:ffff:ffff:ffff:ffff:ffff:ffff,AD +2a02:8070::,2a02:8070:88ab:3fff:ffff:ffff:ffff:ffff,DE +2a02:8070:88ab:4000::,2a02:8070:88ab:7fff:ffff:ffff:ffff:ffff,US +2a02:8070:88ab:8000::,2a02:8071:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8080::,2a02:8085:6fff:ffff:ffff:ffff:ffff:ffff,IE +2a02:8085:7000::,2a02:8085:7000:7fff:ffff:ffff:ffff:ffff,GB +2a02:8085:7000:8000::,2a02:8087:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:80c0::,2a02:80c3:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:80e0::,2a02:80e3:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:8100::,2a02:811f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8200::,2a02:821f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8300::,2a02:830f:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:8380::,2a02:838f:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:8400::,2a02:8433:308f:ffff:ffff:ffff:ffff:ffff,FR +2a02:8433:3090::,2a02:8433:3090:7fff:ffff:ffff:ffff:ffff,NL +2a02:8433:3090:8000::,2a02:847f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:8800::,2a02:88ff:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:9000::,2a02:91ff:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:9940::,2a02:9940:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:a000::,2a02:a03f:1e4e:7fff:ffff:ffff:ffff:ffff,BE +2a02:a03f:1e4e:8000::,2a02:a03f:1e4e:ffff:ffff:ffff:ffff:ffff,FR +2a02:a03f:1e4f::,2a02:a03f:24d7:ffff:ffff:ffff:ffff:ffff,BE +2a02:a03f:24d8::,2a02:a03f:24d8:7fff:ffff:ffff:ffff:ffff,FR +2a02:a03f:24d8:8000::,2a02:a03f:40c6:7fff:ffff:ffff:ffff:ffff,BE +2a02:a03f:40c6:8000::,2a02:a03f:40c6:ffff:ffff:ffff:ffff:ffff,LU +2a02:a03f:40c7::,2a02:a03f:6025:ffff:ffff:ffff:ffff:ffff,BE +2a02:a03f:6026::,2a02:a03f:6026:7fff:ffff:ffff:ffff:ffff,FR +2a02:a03f:6026:8000::,2a02:a03f:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:a200::,2a02:a21f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:a300::,2a02:a317:e242:7fff:ffff:ffff:ffff:ffff,PL +2a02:a317:e242:8000::,2a02:a317:e242:ffff:ffff:ffff:ffff:ffff,US +2a02:a317:e243::,2a02:a31f:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:a400::,2a02:a441:813a:ffff:ffff:ffff:ffff:ffff,NL +2a02:a441:813b::,2a02:a441:813b:7fff:ffff:ffff:ffff:ffff,US +2a02:a441:813b:8000::,2a02:a451:6958:ffff:ffff:ffff:ffff:ffff,NL +2a02:a451:6959::,2a02:a451:6959:7fff:ffff:ffff:ffff:ffff,US +2a02:a451:6959:8000::,2a02:a453:3ccc:ffff:ffff:ffff:ffff:ffff,NL +2a02:a453:3ccd::,2a02:a453:3ccd:7fff:ffff:ffff:ffff:ffff,US +2a02:a453:3ccd:8000::,2a02:a453:629a:ffff:ffff:ffff:ffff:ffff,NL +2a02:a453:629b::,2a02:a453:629b:7fff:ffff:ffff:ffff:ffff,DE +2a02:a453:629b:8000::,2a02:a453:bc11:ffff:ffff:ffff:ffff:ffff,NL +2a02:a453:bc12::,2a02:a453:bc12:7fff:ffff:ffff:ffff:ffff,NZ +2a02:a453:bc12:8000::,2a02:a47f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:a800::,2a02:a83f:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:aa00::,2a02:aa11:117e:7fff:ffff:ffff:ffff:ffff,CH +2a02:aa11:117e:8000::,2a02:aa11:117e:ffff:ffff:ffff:ffff:ffff,DE +2a02:aa11:117f::,2a02:aa12:6480:ffff:ffff:ffff:ffff:ffff,CH +2a02:aa12:6481::,2a02:aa12:6481:7fff:ffff:ffff:ffff:ffff,DE +2a02:aa12:6481:8000::,2a02:aa1f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:ab00::,2a02:ab07:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a02:ab40::,2a02:ab47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:ab80::,2a02:ab8f:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:ac00::,2a02:ac07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:ac40::,2a02:ac47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:ac80::,2a02:ac87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:acc0::,2a02:acc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:ad40::,2a02:ad47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:ad80::,2a02:ad87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:adc0::,2a02:adc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:ae00::,2a02:ae07:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a02:ae40::,2a02:ae47:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:ae80::,2a02:ae87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:aec0::,2a02:aec7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:af00::,2a02:af07:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:af40::,2a02:af47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:af80::,2a02:af87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:afc0::,2a02:afc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:b000::,2a02:b1ff:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:c000::,2a02:c007:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:c040::,2a02:c047:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a02:c080::,2a02:c087:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:c0c0::,2a02:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:c100::,2a02:c107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:c140::,2a02:c147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:c180::,2a02:c187:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:c1c0::,2a02:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:c200::,2a02:c207:2013:ffff:ffff:ffff:ffff:ffff,DE +2a02:c207:2014::,2a02:c207:2014:7fff:ffff:ffff:ffff:ffff,US +2a02:c207:2014:8000::,2a02:c207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:c280::,2a02:c287:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:c2c0::,2a02:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:c300::,2a02:c307:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:c340::,2a02:c347:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:c380::,2a02:c383:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:c390::,2a02:c397:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:c3a0::,2a02:c3a3:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:c3c0::,2a02:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a02:c400::,2a02:c407:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a02:c440::,2a02:c447:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:c480::,2a02:c487:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:c4c0::,2a02:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:c500::,2a02:c507:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:c540::,2a02:c547:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:c580::,2a02:c587:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:c5c0::,2a02:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:c600::,2a02:c600:ff:ffff:ffff:ffff:ffff:ffff,CH +2a02:c600:100::,2a02:c600:100:7fff:ffff:ffff:ffff:ffff,CZ +2a02:c600:100:8000::,2a02:c607:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:c640::,2a02:c647:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:c680::,2a02:c681:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:c690::,2a02:c691:ffff:ffff:ffff:ffff:ffff:ffff,AD +2a02:c6a0::,2a02:c6a3:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:c6c0::,2a02:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:c700::,2a02:c707:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:c740::,2a02:c747:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:c780::,2a02:c787:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a02:c7c0::,2a02:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:c800::,2a02:c807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:c840::,2a02:c847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:c880::,2a02:c887:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:c8c0::,2a02:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a02:c900::,2a02:c907:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:c940::,2a02:c947:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:c980::,2a02:c987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:c9c0::,2a02:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:ca00::,2a02:ca07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:ca40::,2a02:ca47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:ca80::,2a02:ca87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:cac0::,2a02:cac7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:cb00::,2a02:cb07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:cb40::,2a02:cb47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:cb80::,2a02:cb87:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:cbc0::,2a02:cbc3:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a02:cbe0::,2a02:cbe1:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:cbf0::,2a02:cbf7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:cc00::,2a02:cc07:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:cc40::,2a02:cc47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:cc80::,2a02:cc87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:ccc0::,2a02:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:cd00::,2a02:cd07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:cd40::,2a02:cd47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:cd80::,2a02:cd87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:cdc0::,2a02:cdc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:ce00::,2a02:ce07:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:ce40::,2a02:ce47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:ce80::,2a02:ce87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:cec0::,2a02:cec3:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:cee0::,2a02:cee3:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:cf00::,2a02:cf07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:cf40::,2a02:cf47:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:cf80::,2a02:cf87:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:cfc0::,2a02:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:d000::,2a02:d007:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:d040::,2a02:d047:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:d080::,2a02:d087:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a02:d0c0::,2a02:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:d100::,2a02:d107:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:d140::,2a02:d147:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:d180::,2a02:d187:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:d1c0::,2a02:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:d200::,2a02:d207:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:d240::,2a02:d247:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a02:d280::,2a02:d287:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:d2c0::,2a02:d2c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:d300::,2a02:d307:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:d340::,2a02:d347:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:d380::,2a02:d387:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:d3c0::,2a02:d3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:d400::,2a02:d407:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:d440::,2a02:d447:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:d480::,2a02:d487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:d4c0::,2a02:d4c3:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:d4e0::,2a02:d4e3:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:d500::,2a02:d507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:d540::,2a02:d547:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:d580::,2a02:d587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:d5c0::,2a02:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:d600::,2a02:d607:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:d640::,2a02:d647:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:d680::,2a02:d683:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:d6a0::,2a02:d6a7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:d6c0::,2a02:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:d700::,2a02:d707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:d740::,2a02:d747:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:d780::,2a02:d787:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:d7c0::,2a02:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:d800::,2a02:d807:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:d840::,2a02:d847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:d880::,2a02:d880:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:d8a0::,2a02:d8a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:d8c0::,2a02:d8c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:d900::,2a02:d907:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:d940::,2a02:d947:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:d980::,2a02:d987:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:d9c0::,2a02:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:da00::,2a02:da07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:da40::,2a02:da47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:da80::,2a02:da87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:dac0::,2a02:dac7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:db00::,2a02:db07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:db40::,2a02:db47:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:db80::,2a02:db87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:dbc0::,2a02:dbc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:dc00::,2a02:dc07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:dc40::,2a02:dc47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:dc80::,2a02:dc87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:dcc0::,2a02:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:dd00::,2a02:dd07:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a02:dd40::,2a02:dd47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:dd80::,2a02:dd87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:ddc0::,2a02:ddc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:de00::,2a02:de07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:de40::,2a02:de47:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:de80::,2a02:de87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:dec0::,2a02:dec7:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a02:df00::,2a02:df07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:df40::,2a02:df47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:df80::,2a02:df87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:dfc0::,2a02:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:e000::,2a02:e007:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:e040::,2a02:e047:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:e080::,2a02:e087:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a02:e0c0::,2a02:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:e100::,2a02:e107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:e140::,2a02:e147:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:e180::,2a02:e187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:e1c0::,2a02:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:e200::,2a02:e203:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:e220::,2a02:e223:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a02:e240::,2a02:e247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:e280::,2a02:e287:ffff:ffff:ffff:ffff:ffff:ffff,YE +2a02:e2c0::,2a02:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:e300::,2a02:e307:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a02:e340::,2a02:e347:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:e380::,2a02:e387:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:e3c0::,2a02:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:e400::,2a02:e407:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:e440::,2a02:e447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:e480::,2a02:e487:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:e4c0::,2a02:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:e500::,2a02:e507:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:e540::,2a02:e547:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a02:e580::,2a02:e587:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:e5c0::,2a02:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:e600::,2a02:e603:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:e620::,2a02:e623:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:e640::,2a02:e647:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:e680::,2a02:e687:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a02:e6c0::,2a02:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:e700::,2a02:e707:ffff:ffff:ffff:ffff:ffff:ffff,LY +2a02:e740::,2a02:e747:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:e780::,2a02:e787:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:e7c0::,2a02:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:e800::,2a02:e807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:e840::,2a02:e847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:e880::,2a02:e887:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:e8c0::,2a02:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:e900::,2a02:e907:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:e940::,2a02:e947:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:e980::,2a02:e987:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a02:e9c0::,2a02:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:ea00::,2a02:ea07:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a02:ea40::,2a02:ea47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:ea80::,2a02:ea87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:eac0::,2a02:eac7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:eb00::,2a02:eb07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:eb40::,2a02:eb47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:eb80::,2a02:eb87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:ebc0::,2a02:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:ec00::,2a02:ec07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:ec40::,2a02:ec47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:ec80::,2a02:ec87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:ecc0::,2a02:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a02:ed00::,2a02:ed01:411f:ffff:ffff:ffff:ffff:ffff,NO +2a02:ed01:4120::,2a02:ed01:4120:ffff:ffff:ffff:ffff:ffff,DK +2a02:ed01:4121::,2a02:ed07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:ed40::,2a02:ed47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:ed80::,2a02:ed87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:edc0::,2a02:edc7:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:ee00::,2a02:ee07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:ee80::,2a02:ee87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:eec0::,2a02:eec7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:ef00::,2a02:ef07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:ef40::,2a02:ef47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:ef80::,2a02:ef87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:efc0::,2a02:efc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:f000::,2a02:f007:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:f040::,2a02:f047:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a02:f080::,2a02:f083:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:f0a0::,2a02:f0a3:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:f0c0::,2a02:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a02:f100::,2a02:f107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:f140::,2a02:f147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:f180::,2a02:f181:fff:ffff:ffff:ffff:ffff:ffff,FR +2a02:f181:1000::,2a02:f181:1000:7fff:ffff:ffff:ffff:ffff,GB +2a02:f181:1000:8000::,2a02:f187:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:f1c0::,2a02:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:f200::,2a02:f207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:f280::,2a02:f287:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:f2c0::,2a02:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:f300::,2a02:f307:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:f340::,2a02:f347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:f380::,2a02:f387:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:f3c0::,2a02:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:f400::,2a02:f407:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a02:f440::,2a02:f447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:f480::,2a02:f487:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:f4c0::,2a02:f4c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:f500::,2a02:f507:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:f540::,2a02:f543:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:f560::,2a02:f563:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:f580::,2a02:f587:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a02:f5c0::,2a02:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:f600::,2a02:f607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:f640::,2a02:f647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:f680::,2a02:f687:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:f6c0::,2a02:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:f700::,2a02:f707:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a02:f740::,2a02:f747:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:f780::,2a02:f787:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:f7c0::,2a02:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a02:f800::,2a02:f807:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:f840::,2a02:f847:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:f880::,2a02:f887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:f8c0::,2a02:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:f900::,2a02:f907:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:f940::,2a02:f947:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:f980::,2a02:f987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:f9c0::,2a02:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:fa00::,2a02:fa07:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:fa40::,2a02:fa47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:fa80::,2a02:fa80:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:faa0::,2a02:faa0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:fac0::,2a02:fac0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:fae0::,2a02:fae7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:fb00::,2a02:fb07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:fb40::,2a02:fb47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:fb80::,2a02:fb87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:fbc0::,2a02:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:fc00::,2a02:fc07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:fc40::,2a02:fc47:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:fc80::,2a02:fc87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:fcc0::,2a02:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:fd00::,2a02:fd07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:fd40::,2a02:fd47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:fd80::,2a02:fd87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:fdc0::,2a02:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:fe00::,2a02:fe07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:fe40::,2a02:fe47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:fe80::,2a02:fe87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:fec0::,2a02:fec7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:ff00::,2a02:ff07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:ff40::,2a02:ff47:ffff:ffff:ffff:ffff:ffff:ffff,IM +2a02:ff80::,2a02:ff87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:ffc0::,2a02:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,GI +2a03::,2a03::ffff:ffff:ffff:ffff:ffff:ffff,PT +2a03:20::,2a03:20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:40::,2a03:40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:60::,2a03:67:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:80::,2a03:80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:c0::,2a03:c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:e0::,2a03:e0:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:100::,2a03:100:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:120::,2a03:120:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:140::,2a03:140:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:160::,2a03:160:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:180::,2a03:180:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:1a0::,2a03:1a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:1c0::,2a03:1c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:1e0::,2a03:1e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:200::,2a03:200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:220::,2a03:220:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:240::,2a03:247:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:280::,2a03:280:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a03:2a0::,2a03:2a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:2c0::,2a03:2c0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:2e0::,2a03:2e7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:300::,2a03:300:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:320::,2a03:320:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a03:340::,2a03:340:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:360::,2a03:360:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:380::,2a03:380:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:3a0::,2a03:3a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3c0::,2a03:3c0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:3e0::,2a03:3e0:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:400::,2a03:407:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:420::,2a03:420:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:440::,2a03:440:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:460::,2a03:460:ffff:ffff:ffff:ffff:ffff:ffff,US +2a03:480::,2a03:480:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4a0::,2a03:4a0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:4c0::,2a03:4c0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:4e0::,2a03:4e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:500::,2a03:500:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:520::,2a03:527:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:540::,2a03:540:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a03:560::,2a03:560:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:580::,2a03:580:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:5a0::,2a03:5a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5c0::,2a03:5c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:5e0::,2a03:5e0:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a03:600::,2a03:600:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:620::,2a03:620:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:640::,2a03:640:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:660::,2a03:660:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:680::,2a03:680:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:6a0::,2a03:6a0:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a03:6c0::,2a03:6c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6e0::,2a03:6e0:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:700::,2a03:700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:720::,2a03:720:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:740::,2a03:740:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:760::,2a03:767:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:780::,2a03:780:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:7a0::,2a03:7a7:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a03:7c0::,2a03:7c0:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a03:7e0::,2a03:7e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:800::,2a03:807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:820::,2a03:820:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:840::,2a03:840:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:860::,2a03:860:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:880::,2a03:880:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:8a0::,2a03:8a0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:8c0::,2a03:8c0:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a03:8e0::,2a03:8e0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:900::,2a03:900:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:920::,2a03:920:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:940::,2a03:940:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:960::,2a03:960:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:980::,2a03:980:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a03:9a0::,2a03:9a0:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a03:9c0::,2a03:9c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:9e0::,2a03:9e0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:a00::,2a03:a00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:a20::,2a03:a20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:a40::,2a03:a40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:a60::,2a03:a60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:a80::,2a03:a80:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a03:aa0::,2a03:aa0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:ac0::,2a03:ac7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:ae0::,2a03:ae0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:b00::,2a03:b00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:b40::,2a03:b40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:b80::,2a03:b80:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:ba0::,2a03:ba7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:bc0::,2a03:bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:c00::,2a03:c00:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:c20::,2a03:c20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:c40::,2a03:c40:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a03:c60::,2a03:c60:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:c80::,2a03:c80:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:ca0::,2a03:ca0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:cc0::,2a03:cc0:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:ce0::,2a03:ce0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:d00::,2a03:d00:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:d20::,2a03:d20:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:d40::,2a03:d40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:d60::,2a03:d60:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:d80::,2a03:d80:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:da0::,2a03:da0:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a03:dc0::,2a03:dc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:de0::,2a03:de0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:e00::,2a03:e00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:e20::,2a03:e20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e40::,2a03:e40:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a03:e60::,2a03:e60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:ea0::,2a03:ea0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:ec0::,2a03:ec0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:ee0::,2a03:ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:f00::,2a03:f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:f40::,2a03:f40:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:f60::,2a03:f60:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:f80::,2a03:f80:3f:ffff:ffff:ffff:ffff:ffff,AT +2a03:f80:40::,2a03:f80:40:7fff:ffff:ffff:ffff:ffff,RO +2a03:f80:40:8000::,2a03:f80:43:ffff:ffff:ffff:ffff:ffff,AT +2a03:f80:44::,2a03:f80:44:ffff:ffff:ffff:ffff:ffff,IM +2a03:f80:45::,2a03:f80:47:ffff:ffff:ffff:ffff:ffff,AT +2a03:f80:48::,2a03:f80:48:7fff:ffff:ffff:ffff:ffff,PL +2a03:f80:48:8000::,2a03:f80:55:ffff:ffff:ffff:ffff:ffff,AT +2a03:f80:56::,2a03:f80:56:ffff:ffff:ffff:ffff:ffff,CL +2a03:f80:57::,2a03:f80:353:ffff:ffff:ffff:ffff:ffff,AT +2a03:f80:354::,2a03:f80:354:ffff:ffff:ffff:ffff:ffff,IS +2a03:f80:355::,2a03:f87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:fc0::,2a03:fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:fe0::,2a03:fe0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:1000::,2a03:1000:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:1020::,2a03:1020:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a03:1040::,2a03:1040:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:1060::,2a03:1060:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:1080::,2a03:1080:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a03:10a0::,2a03:10a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:10c0::,2a03:10c3:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:10e0::,2a03:10e0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a03:1100::,2a03:1100:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:1120::,2a03:1120:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1140::,2a03:1140:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:1160::,2a03:1160:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:1180::,2a03:1180:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:11a0::,2a03:11a0:ffff:ffff:ffff:ffff:ffff:ffff,OM +2a03:11c0::,2a03:11c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:11e0::,2a03:11e0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a03:1200::,2a03:1200:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:1220::,2a03:1220:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:1240::,2a03:1240:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:1260::,2a03:1260:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:1280::,2a03:1280:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:12a0::,2a03:12a0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:12c0::,2a03:12c0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:12e0::,2a03:12e0:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a03:1300::,2a03:1300:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a03:1320::,2a03:1320:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:1340::,2a03:1340:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:1360::,2a03:1360:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:1380::,2a03:1380:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:13a0::,2a03:13a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:13c0::,2a03:13c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:13e0::,2a03:13e0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:1400::,2a03:1400:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:1420::,2a03:1420:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:1440::,2a03:1440:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:1460::,2a03:1460:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:1480::,2a03:1480:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:14a0::,2a03:14a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:14c0::,2a03:14c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:14e0::,2a03:14e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1500::,2a03:1500:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:1520::,2a03:1520:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:1560::,2a03:1560:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:1580::,2a03:1580:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:15c0::,2a03:15c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:15e0::,2a03:15e0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:1600::,2a03:1600:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:1620::,2a03:1620:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1640::,2a03:1640:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:1660::,2a03:1660:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a03:1680::,2a03:1680:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:16a0::,2a03:16a0:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a03:16c0::,2a03:16c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:16e0::,2a03:16e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:1700::,2a03:1707:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:1740::,2a03:1740:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:1760::,2a03:1760:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1780::,2a03:1780:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:17a0::,2a03:17a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:17c0::,2a03:17c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:17e0::,2a03:17e0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:1800::,2a03:1800:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:1820::,2a03:1820:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:1840::,2a03:1840:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:1860::,2a03:1860:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1880::,2a03:1880:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:18a0::,2a03:18a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:18e0::,2a03:18e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:1900::,2a03:1907:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a03:1920::,2a03:1920:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:1940::,2a03:1940:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1960::,2a03:1960:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a03:1980::,2a03:1987:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:19a0::,2a03:19a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:19c0::,2a03:19c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:19e0::,2a03:19e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:1a00::,2a03:1a00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:1a20::,2a03:1a20:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:1a40::,2a03:1a40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:1a60::,2a03:1a60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:1a80::,2a03:1a80:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:1aa0::,2a03:1aa0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2a03:1ac0::,2a03:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:1ae0::,2a03:1ae0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:1b00::,2a03:1b00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:1b20::,2a03:1b20:2:ffff:ffff:ffff:ffff:ffff,SE +2a03:1b20:3::,2a03:1b20:3:ffff:ffff:ffff:ffff:ffff,NL +2a03:1b20:4::,2a03:1b20:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:1b40::,2a03:1b40:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:1b60::,2a03:1b60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1b80::,2a03:1b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1bc0::,2a03:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:1be0::,2a03:1be0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1c00::,2a03:1c00:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a03:1c20::,2a03:1c20:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:1c40::,2a03:1c40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:1c60::,2a03:1c60:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:1c80::,2a03:1c80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:1ca0::,2a03:1ca0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:1cc0::,2a03:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:1ce0::,2a03:1ce0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:1d00::,2a03:1d00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:1d20::,2a03:1d20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:1d40::,2a03:1d40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1d60::,2a03:1d60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:1d80::,2a03:1d80:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:1da0::,2a03:1da0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:1dc0::,2a03:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:1de0::,2a03:1de0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:1e00::,2a03:1e03:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:1e20::,2a03:1e20:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:1e40::,2a03:1e40:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:1e60::,2a03:1e60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:1e80::,2a03:1e87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:1ea0::,2a03:1ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1ec0::,2a03:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:1ee0::,2a03:1ee0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:1f00::,2a03:1f00:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:1f20::,2a03:1f20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:1f40::,2a03:1f40:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:1f60::,2a03:1f60:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:1f80::,2a03:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:1fc0::,2a03:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,US +2a03:1fe0::,2a03:1fe0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2000::,2a03:2000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2020::,2a03:2020:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:2040::,2a03:2047:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:2080::,2a03:2080:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:20a0::,2a03:20a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:20c0::,2a03:20c0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a03:20e0::,2a03:20e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:2100::,2a03:2107:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:2120::,2a03:2120:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:2140::,2a03:2140:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2160::,2a03:2160:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2180::,2a03:2180:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:21a0::,2a03:21a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:21c0::,2a03:21c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:21e0::,2a03:21e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2200::,2a03:2200:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:2220::,2a03:2220:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:2240::,2a03:2240:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:2260::,2a03:2260:116:ffff:ffff:ffff:ffff:ffff,DE +2a03:2260:117::,2a03:2260:117:7fff:ffff:ffff:ffff:ffff,NL +2a03:2260:117:8000::,2a03:2260:3005:7ff:ffff:ffff:ffff:ffff,DE +2a03:2260:3005:800::,2a03:2260:3005:fff:ffff:ffff:ffff:ffff,SI +2a03:2260:3005:1000::,2a03:2267:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2280::,2a03:2280:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:22a0::,2a03:22a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:22c0::,2a03:22c0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:22e0::,2a03:22e7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:2300::,2a03:2307:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a03:2320::,2a03:2320:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:2340::,2a03:2340:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:2360::,2a03:2360:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2380::,2a03:2380:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:23a0::,2a03:23a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:23c0::,2a03:23c0:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a03:23e0::,2a03:23e0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:2400::,2a03:2400:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2420::,2a03:2420:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:2440::,2a03:2440:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2460::,2a03:2460:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:2480::,2a03:2480:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:24a0::,2a03:24a0:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a03:24c0::,2a03:24c0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:24e0::,2a03:24e0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:2500::,2a03:2500:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2520::,2a03:2520:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:2540::,2a03:2540:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2560::,2a03:2560:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a03:2580::,2a03:2580:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:25a0::,2a03:25a0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:25c0::,2a03:25c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:25e0::,2a03:25e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2600::,2a03:2600:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:2620::,2a03:2620:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:2640::,2a03:2640:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2660::,2a03:2660:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:2680::,2a03:2680:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:26a0::,2a03:26a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:26c0::,2a03:26c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:26e0::,2a03:26e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2700::,2a03:2700:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:2720::,2a03:2720:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2740::,2a03:2740:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:2760::,2a03:2760:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:2780::,2a03:2780:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:27a0::,2a03:27a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:27c0::,2a03:27c0:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a03:2800::,2a03:2800:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2820::,2a03:2820:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a03:2840::,2a03:2840:ffff:ffff:ffff:ffff:ffff:ffff,US +2a03:2860::,2a03:2860:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2880::,2a03:2880:10:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:11::,2a03:2880:12:7fff:ffff:ffff:ffff:ffff,US +2a03:2880:12:8000::,2a03:2880:1f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:20::,2a03:2880:21:7fff:ffff:ffff:ffff:ffff,US +2a03:2880:21:8000::,2a03:2880:2f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:30::,2a03:2880:30:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:31::,2a03:2880:100f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:1010::,2a03:2880:1011:7fff:ffff:ffff:ffff:ffff,US +2a03:2880:1011:8000::,2a03:2880:101f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:1020::,2a03:2880:1020:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:1021::,2a03:2880:102f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:1030::,2a03:2880:1030:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:1031::,2a03:2880:10ff:7fff:ffff:ffff:ffff:ffff,IE +2a03:2880:10ff:8000::,2a03:2880:10ff:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:1100::,2a03:2880:110f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:1110::,2a03:2880:1110:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:1111::,2a03:2880:111f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:1120::,2a03:2880:1120:7fff:ffff:ffff:ffff:ffff,US +2a03:2880:1120:8000::,2a03:2880:2010:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:2011::,2a03:2880:2011:7fff:ffff:ffff:ffff:ffff,US +2a03:2880:2011:8000::,2a03:2880:201f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:2020::,2a03:2880:2020:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:2021::,2a03:2880:202f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:2030::,2a03:2880:2030:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:2031::,2a03:2880:2040:7fff:ffff:ffff:ffff:ffff,IE +2a03:2880:2040:8000::,2a03:2880:2040:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:2041::,2a03:2880:204f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:2050::,2a03:2880:2050:7fff:ffff:ffff:ffff:ffff,US +2a03:2880:2050:8000::,2a03:2880:2060:7fff:ffff:ffff:ffff:ffff,IE +2a03:2880:2060:8000::,2a03:2880:2060:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:2061::,2a03:2880:2110:7fff:ffff:ffff:ffff:ffff,IE +2a03:2880:2110:8000::,2a03:2880:2111:bfff:ffff:ffff:ffff:ffff,US +2a03:2880:2111:c000::,2a03:2880:211f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:2120::,2a03:2880:2120:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:2121::,2a03:2880:212f:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:2130::,2a03:2880:2130:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:2131::,2a03:2880:3010:7fff:ffff:ffff:ffff:ffff,IE +2a03:2880:3010:8000::,2a03:2880:3010:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:3011::,2a03:2880:3020:9fff:ffff:ffff:ffff:ffff,IE +2a03:2880:3020:a000::,2a03:2880:3020:afff:ffff:ffff:ffff:ffff,GB +2a03:2880:3020:b000::,2a03:2887:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:28a0::,2a03:28a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:28c0::,2a03:28c0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:28e0::,2a03:28e0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:2900::,2a03:2907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2920::,2a03:2920:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a03:2940::,2a03:2940:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a03:2960::,2a03:2960:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:2980::,2a03:2980:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:29a0::,2a03:29a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:29c0::,2a03:29c0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a03:29e0::,2a03:29e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2a00::,2a03:2a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2a20::,2a03:2a20:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:2a40::,2a03:2a40:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:2a60::,2a03:2a60:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:2a80::,2a03:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:2ac0::,2a03:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2ae0::,2a03:2ae0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:2b00::,2a03:2b00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:2b20::,2a03:2b20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2b40::,2a03:2b40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2b60::,2a03:2b60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2b80::,2a03:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:2ba0::,2a03:2ba0:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:2bc0::,2a03:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2be0::,2a03:2be0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2c00::,2a03:2c00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2c20::,2a03:2c20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2c40::,2a03:2c40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2c60::,2a03:2c60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:2c80::,2a03:2c80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2ca0::,2a03:2ca0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:2cc0::,2a03:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2ce0::,2a03:2ce0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:2d00::,2a03:2d00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2d20::,2a03:2d20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2d40::,2a03:2d40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2d60::,2a03:2d60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2d80::,2a03:2d80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2da0::,2a03:2da0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:2dc0::,2a03:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:2de0::,2a03:2de0:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a03:2e00::,2a03:2e00:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:2e20::,2a03:2e20:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a03:2e40::,2a03:2e40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2e60::,2a03:2e60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:2ea0::,2a03:2ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2ec0::,2a03:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2ee0::,2a03:2ee0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2f00::,2a03:2f00:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:2f20::,2a03:2f20:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:2f40::,2a03:2f40:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:2f60::,2a03:2f60:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:2f80::,2a03:2f80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:2fa0::,2a03:2fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:2fc0::,2a03:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2fe0::,2a03:2fe0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3000::,2a03:3007:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a03:3020::,2a03:3020:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3040::,2a03:3040:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:3060::,2a03:3060:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3080::,2a03:3080:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:30a0::,2a03:30a0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:30c0::,2a03:30c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:30e0::,2a03:30e0:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a03:3100::,2a03:3100:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3120::,2a03:3120:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:3140::,2a03:3140:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:3160::,2a03:3160:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:3180::,2a03:3180:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:31a0::,2a03:31a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:31c0::,2a03:31c0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:31e0::,2a03:31e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:3200::,2a03:3200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3220::,2a03:3220:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:3240::,2a03:3240:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a03:3260::,2a03:3260:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:3280::,2a03:3280:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:32a0::,2a03:32a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:32c0::,2a03:32c0:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a03:32e0::,2a03:32e0:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:3300::,2a03:3300:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3320::,2a03:3320:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a03:3340::,2a03:3340:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:3360::,2a03:3360:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:3380::,2a03:3380:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:33a0::,2a03:33a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:33c0::,2a03:33c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:33e0::,2a03:33e7:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a03:3400::,2a03:3400:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3420::,2a03:3420:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a03:3440::,2a03:3440:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a03:3460::,2a03:3460:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:3480::,2a03:3480:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:34a0::,2a03:34a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:34c0::,2a03:34c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:34e0::,2a03:34e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3500::,2a03:3500:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3520::,2a03:3520:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:3540::,2a03:3547:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:3580::,2a03:3580:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a03:35a0::,2a03:35a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:35c0::,2a03:35c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:35e0::,2a03:35e0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:3600::,2a03:3600:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:3620::,2a03:3620:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3640::,2a03:3640:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3660::,2a03:3660:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:3680::,2a03:3687:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:36a0::,2a03:36a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:36c0::,2a03:36c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:36e0::,2a03:36e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3700::,2a03:3700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3720::,2a03:3720:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a03:3740::,2a03:3740:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3760::,2a03:3760:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:3780::,2a03:3780:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:37a0::,2a03:37a0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:37c0::,2a03:37c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:37e0::,2a03:37e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3800::,2a03:3800:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:3820::,2a03:3820:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3840::,2a03:3847:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:3880::,2a03:3887:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:38a0::,2a03:38a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:38c0::,2a03:38c0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:38e0::,2a03:38e0:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:3900::,2a03:3900:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:3920::,2a03:3920:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3940::,2a03:3940:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3960::,2a03:3960:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3980::,2a03:3980:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a03:39a0::,2a03:39a0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:39c0::,2a03:39c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:39e0::,2a03:39e0:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a03:3a00::,2a03:3a00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:3a20::,2a03:3a20:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a03:3a40::,2a03:3a40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3a60::,2a03:3a60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3a80::,2a03:3a80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3aa0::,2a03:3aa0:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a03:3ac0::,2a03:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:3ae0::,2a03:3ae0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3b00::,2a03:3b00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3b20::,2a03:3b20:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a03:3b40::,2a03:3b40:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:3b60::,2a03:3b60:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:3b80::,2a03:3b80:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:3ba0::,2a03:3ba0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:3bc0::,2a03:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a03:3be0::,2a03:3be0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:3c00::,2a03:3c00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3c20::,2a03:3c20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:3c40::,2a03:3c40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:3c60::,2a03:3c67:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:3c80::,2a03:3c80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3ca0::,2a03:3ca0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3cc0::,2a03:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3d00::,2a03:3d00:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a03:3d20::,2a03:3d20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:3d40::,2a03:3d40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3d60::,2a03:3d60:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:3d80::,2a03:3d80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:3da0::,2a03:3da0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:3dc0::,2a03:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3de0::,2a03:3de0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:3e00::,2a03:3e07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3e40::,2a03:3e40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3e60::,2a03:3e60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:3e80::,2a03:3e80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3ea0::,2a03:3ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3ec0::,2a03:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3ee0::,2a03:3ee0:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a03:3f00::,2a03:3f00:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:3f20::,2a03:3f20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3f40::,2a03:3f40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3f60::,2a03:3f60:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a03:3f80::,2a03:3f80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3fa0::,2a03:3fa0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:3fc0::,2a03:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3fe0::,2a03:3fe0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4000::,2a03:4007:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4020::,2a03:4020:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4040::,2a03:4040:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4060::,2a03:4060:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:4080::,2a03:4080:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:40a0::,2a03:40a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:40c0::,2a03:40c0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:40e0::,2a03:40e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4100::,2a03:4107:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4160::,2a03:4160:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4180::,2a03:4180:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:41a0::,2a03:41a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:41c0::,2a03:41c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:41e0::,2a03:41e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4200::,2a03:4200:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4240::,2a03:4240:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4260::,2a03:4260:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:4280::,2a03:4280:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a03:42c0::,2a03:42c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:42e0::,2a03:42e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4300::,2a03:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4340::,2a03:4340:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4360::,2a03:4360:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a03:4380::,2a03:4380:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:43a0::,2a03:43a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:43c0::,2a03:43c0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:43e0::,2a03:43e0:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a03:4400::,2a03:4400:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:4420::,2a03:4420:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:4440::,2a03:4440:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:4460::,2a03:4460:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:4480::,2a03:4480:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a03:44a0::,2a03:44a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:44c0::,2a03:44c0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:4500::,2a03:4500:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4520::,2a03:4520:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a03:4540::,2a03:4540:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:4560::,2a03:4560:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:4580::,2a03:4580:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:45a0::,2a03:45a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:45c0::,2a03:45c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:45e0::,2a03:45e0:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a03:4600::,2a03:4600:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:4620::,2a03:4620:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:4640::,2a03:4640:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4660::,2a03:4660:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:4680::,2a03:4687:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:46a0::,2a03:46a0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:46c0::,2a03:46c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:46e0::,2a03:46e0:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a03:4700::,2a03:4700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4720::,2a03:4720:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:4740::,2a03:4740:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4760::,2a03:4760:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:4780::,2a03:4787:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a03:47a0::,2a03:47a7:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:47c0::,2a03:47c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a03:4800::,2a03:4800:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4820::,2a03:4820:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a03:4840::,2a03:4847:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a03:4880::,2a03:4880:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:48a0::,2a03:48a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:48c0::,2a03:48c0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:48e0::,2a03:48e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4900::,2a03:4900:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4920::,2a03:4920:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4940::,2a03:4940:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:4960::,2a03:4960:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:4980::,2a03:4987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:49a0::,2a03:49a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:49c0::,2a03:49c0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:49e0::,2a03:49e0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:4a00::,2a03:4a00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4a20::,2a03:4a20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4a40::,2a03:4a40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:4a60::,2a03:4a60:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a03:4a80::,2a03:4a80::ffff:ffff:ffff:ffff,NL +2a03:4a80:0:1::,2a03:4a80::1:ffff:ffff:ffff:ffff,GB +2a03:4a80:0:2::,2a03:4a80::2:ffff:ffff:ffff:ffff,CA +2a03:4a80:0:3::,2a03:4a80::3:ffff:ffff:ffff:ffff,CZ +2a03:4a80:0:4::,2a03:4a80::4:ffff:ffff:ffff:ffff,NL +2a03:4a80:0:5::,2a03:4a80::5:ffff:ffff:ffff:ffff,FR +2a03:4a80:0:6::,2a03:4a80::6:ffff:ffff:ffff:ffff,DK +2a03:4a80:0:7::,2a03:4a80::7:ffff:ffff:ffff:ffff,RU +2a03:4a80:0:8::,2a03:4a80::8:ffff:ffff:ffff:ffff,TR +2a03:4a80:0:9::,2a03:4a80::9:ffff:ffff:ffff:ffff,UA +2a03:4a80:0:a::,2a03:4a80::a:ffff:ffff:ffff:ffff,MX +2a03:4a80:0:b::,2a03:4a80::b:ffff:ffff:ffff:ffff,AE +2a03:4a80:0:c::,2a03:4a80::ffff:ffff:ffff:ffff:ffff,NL +2a03:4a80:1::,2a03:4a80:1:ffff:ffff:ffff:ffff:ffff,GB +2a03:4a80:2::,2a03:4a80:2:ffff:ffff:ffff:ffff:ffff,CA +2a03:4a80:3::,2a03:4a80:3:ffff:ffff:ffff:ffff:ffff,CZ +2a03:4a80:4::,2a03:4a80:4:ffff:ffff:ffff:ffff:ffff,DE +2a03:4a80:5::,2a03:4a80:5:ffff:ffff:ffff:ffff:ffff,FR +2a03:4a80:6::,2a03:4a80:6:ffff:ffff:ffff:ffff:ffff,DK +2a03:4a80:7::,2a03:4a80:7:ffff:ffff:ffff:ffff:ffff,RU +2a03:4a80:8::,2a03:4a80:8:ffff:ffff:ffff:ffff:ffff,TR +2a03:4a80:9::,2a03:4a80:9:ffff:ffff:ffff:ffff:ffff,UA +2a03:4a80:a::,2a03:4a80:a:ffff:ffff:ffff:ffff:ffff,MX +2a03:4a80:b::,2a03:4a80:b:ffff:ffff:ffff:ffff:ffff,AE +2a03:4a80:c::,2a03:4a80:fffe:ffff:ffff:ffff:ffff:ffff,NL +2a03:4a80:ffff::,2a03:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2a03:4a81::,2a03:4a87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4aa0::,2a03:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4ac0::,2a03:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a03:4ae0::,2a03:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:4b00::,2a03:4b00:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:4b20::,2a03:4b20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4b40::,2a03:4b47:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a03:4b60::,2a03:4b60:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:4b80::,2a03:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a03:4ba0::,2a03:4ba0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:4bc0::,2a03:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:4be0::,2a03:4be0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:4c00::,2a03:4c07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:4c40::,2a03:4c40:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:4c60::,2a03:4c60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4c80::,2a03:4c80:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a03:4ca0::,2a03:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:4cc0::,2a03:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4ce0::,2a03:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:4d00::,2a03:4d00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4d20::,2a03:4d27:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:4d40::,2a03:4d47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4d60::,2a03:4d60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4d80::,2a03:4d80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4da0::,2a03:4da0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4dc0::,2a03:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4e00::,2a03:4e00:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:4e20::,2a03:4e20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4e40::,2a03:4e47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:4e60::,2a03:4e60:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:4e80::,2a03:4e80:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a03:4ea0::,2a03:4ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4ec0::,2a03:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4ee0::,2a03:4ee0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:4f00::,2a03:4f00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4f20::,2a03:4f20:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:4f40::,2a03:4f40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4f60::,2a03:4f60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4f80::,2a03:4f80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4fa0::,2a03:4fa0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:4fc0::,2a03:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4fe0::,2a03:4fe0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:5000::,2a03:5000:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:5020::,2a03:5020:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:5040::,2a03:5040:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5060::,2a03:5060:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5080::,2a03:5080:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:50a0::,2a03:50a0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:50c0::,2a03:50c0:ffff:ffff:ffff:ffff:ffff:ffff,GI +2a03:50e0::,2a03:50e0:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a03:5100::,2a03:5100:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:5120::,2a03:5120:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:5140::,2a03:5140:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5160::,2a03:5160:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:5180::,2a03:5180:5:6:ffff:ffff:ffff:ffff,RO +2a03:5180:5:7::,2a03:5180:5:7::f,GB +2a03:5180:5:7::10,2a03:5180:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:51a0::,2a03:51a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:51c0::,2a03:51c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:51e0::,2a03:51e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5200::,2a03:5200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5220::,2a03:5220:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a03:5240::,2a03:5240:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5260::,2a03:5260:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a03:5280::,2a03:5280:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:52a0::,2a03:52a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:52c0::,2a03:52c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:52e0::,2a03:52e7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:5300::,2a03:5307:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:5340::,2a03:5340:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:5360::,2a03:5360:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a03:5380::,2a03:5380:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:53a0::,2a03:53a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:53c0::,2a03:53c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:53e0::,2a03:53e0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:5400::,2a03:5400:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:5420::,2a03:5420:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5440::,2a03:5447:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:5460::,2a03:5460:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5480::,2a03:5480:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a03:54a0::,2a03:54a0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:54c0::,2a03:54c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:54e0::,2a03:54e0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:5500::,2a03:5501:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:5520::,2a03:5520:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:5540::,2a03:5540:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:5560::,2a03:5560:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:5580::,2a03:5587:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:55e0::,2a03:55e0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:5600::,2a03:5600:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5620::,2a03:5620:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a03:5640::,2a03:5640:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:5660::,2a03:5660:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5680::,2a03:5680:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:56a0::,2a03:56a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:56c0::,2a03:56c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:56e0::,2a03:56e0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:5700::,2a03:5700:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:5720::,2a03:5720:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5740::,2a03:5740:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:5760::,2a03:5760:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:5780::,2a03:5780:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a03:57a0::,2a03:57a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:57c0::,2a03:57c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:57e0::,2a03:57e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:5800::,2a03:5800:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5820::,2a03:5820:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a03:5840::,2a03:5840:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:5860::,2a03:5860:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:5880::,2a03:5880:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a03:58a0::,2a03:58a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:58c0::,2a03:58c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5900::,2a03:5907:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:5940::,2a03:5940:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:5960::,2a03:5960:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:5980::,2a03:5980:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:59c0::,2a03:59c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:59e0::,2a03:59e0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:5a00::,2a03:5a00:40:ffff:ffff:ffff:ffff:ffff,RU +2a03:5a00:41::,2a03:5a00:41:ffff:ffff:ffff:ffff:ffff,NL +2a03:5a00:42::,2a03:5a07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5a40::,2a03:5a40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:5a60::,2a03:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5a80::,2a03:5a80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5aa0::,2a03:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:5ac0::,2a03:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:5ae0::,2a03:5ae0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:5b00::,2a03:5b00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5b20::,2a03:5b20:ffff:ffff:ffff:ffff:ffff:ffff,RE +2a03:5b40::,2a03:5b40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5b60::,2a03:5b60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:5b80::,2a03:5b80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5ba0::,2a03:5ba0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:5bc0::,2a03:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5be0::,2a03:5be0:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a03:5c00::,2a03:5c00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:5c20::,2a03:5c20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:5c40::,2a03:5c40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:5c60::,2a03:5c60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:5c80::,2a03:5c80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5ca0::,2a03:5ca0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5cc0::,2a03:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a03:5ce0::,2a03:5ce0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:5d00::,2a03:5d07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:5d40::,2a03:5d40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:5d60::,2a03:5d60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5d80::,2a03:5d80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:5da0::,2a03:5da0:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a03:5dc0::,2a03:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:5de0::,2a03:5de0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:5e00::,2a03:5e00:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:5e20::,2a03:5e20:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:5e40::,2a03:5e40:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:5e60::,2a03:5e60:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:5e80::,2a03:5e80:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:5ea0::,2a03:5ea0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5ec0::,2a03:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:5ee0::,2a03:5ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:5f00::,2a03:5f00:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:5f20::,2a03:5f20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:5f60::,2a03:5f60:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:5f80::,2a03:5f80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5fc0::,2a03:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:5fe0::,2a03:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:6000::,2a03:6007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:6020::,2a03:6020:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a03:6040::,2a03:6040:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6060::,2a03:6060:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6080::,2a03:6087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:60c0::,2a03:60c0::ffff:ffff:ffff:ffff:ffff,US +2a03:60c0:1::,2a03:60c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:60e0::,2a03:60e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6100::,2a03:6100:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a03:6120::,2a03:6120:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:6140::,2a03:6147:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6160::,2a03:6160:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a03:6180::,2a03:6180:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:61a0::,2a03:61a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:61c0::,2a03:61c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:61e0::,2a03:61e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:6200::,2a03:6200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6220::,2a03:6220:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a03:6240::,2a03:6240:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:6260::,2a03:6260:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6280::,2a03:6287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:62a0::,2a03:62a0:3500:ffff:ffff:ffff:ffff:ffff,AU +2a03:62a0:3501::,2a03:62a0:3501:7fff:ffff:ffff:ffff:ffff,FI +2a03:62a0:3501:8000::,2a03:62a0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2a03:62c0::,2a03:62c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:62e0::,2a03:62e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:6300::,2a03:6300:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:6320::,2a03:6320:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:6340::,2a03:6340:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a03:6360::,2a03:6360:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6380::,2a03:6380:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:63a0::,2a03:63a7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:63c0::,2a03:63c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:63e0::,2a03:63e7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:6400::,2a03:6400:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6420::,2a03:6420:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a03:6440::,2a03:6440:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6460::,2a03:6460:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:64a0::,2a03:64a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:64c0::,2a03:64c0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:64e0::,2a03:64e0:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:6500::,2a03:6507:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6520::,2a03:6520:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:6540::,2a03:6540:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:6560::,2a03:6560:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6580::,2a03:6580:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:65a0::,2a03:65a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:65c0::,2a03:65c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:65e0::,2a03:65e0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:6600::,2a03:6607:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:6620::,2a03:6620:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:6640::,2a03:6640:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:6660::,2a03:6660:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6680::,2a03:6680:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:66a0::,2a03:66a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:66c0::,2a03:66c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:66e0::,2a03:66e0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:6700::,2a03:6707:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a03:6740::,2a03:6740:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a03:6760::,2a03:6760:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:6780::,2a03:6780:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:67a0::,2a03:67a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:67c0::,2a03:67c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:67e0::,2a03:67e0:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a03:6800::,2a03:6800:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:6820::,2a03:6820:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a03:6840::,2a03:6840:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6860::,2a03:6860:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:6880::,2a03:6880:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:68a0::,2a03:68a0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:68c0::,2a03:68c0:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a03:68e0::,2a03:68e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6900::,2a03:6900:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:6920::,2a03:6927:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:6940::,2a03:6940:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:6960::,2a03:6960:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:6980::,2a03:6980:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:69a0::,2a03:69a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:69c0::,2a03:69c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:69e0::,2a03:69e0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:6a00::,2a03:6a07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6a40::,2a03:6a40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6a60::,2a03:6a60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6aa0::,2a03:6aa0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:6ac0::,2a03:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a03:6ae0::,2a03:6ae0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:6b00::,2a03:6b07:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a03:6b20::,2a03:6b20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:6b40::,2a03:6b40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6b60::,2a03:6b60:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:6b80::,2a03:6b80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:6ba0::,2a03:6ba0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:6c00::,2a03:6c00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6c20::,2a03:6c20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:6c40::,2a03:6c40:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:6c60::,2a03:6c60:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6c80::,2a03:6c80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6ca0::,2a03:6ca0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:6cc0::,2a03:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:6ce0::,2a03:6ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6d00::,2a03:6d00:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a03:6d20::,2a03:6d20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6d40::,2a03:6d40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6d60::,2a03:6d60:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:6d80::,2a03:6d80:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:6da0::,2a03:6da0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:6dc0::,2a03:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a03:6e00::,2a03:6e00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:6e20::,2a03:6e20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:6e40::,2a03:6e40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6e60::,2a03:6e60:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:6e80::,2a03:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:6ea0::,2a03:6ea0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6ec0::,2a03:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:6ee0::,2a03:6ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:6f00::,2a03:6f00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6f20::,2a03:6f27:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:6f40::,2a03:6f40:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:6f60::,2a03:6f60:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:6f80::,2a03:6f87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6fc0::,2a03:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6fe0::,2a03:6fe0:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:7000::,2a03:7000:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:7020::,2a03:7020:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a03:7040::,2a03:7040:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:7060::,2a03:7060:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:7080::,2a03:7080:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:70a0::,2a03:70a0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:70c0::,2a03:70c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:70e0::,2a03:70e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7100::,2a03:7100:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:7120::,2a03:7120:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:7140::,2a03:7140:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:7160::,2a03:7160:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a03:7180::,2a03:7180:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a03:71a0::,2a03:71a0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:71c0::,2a03:71c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:71e0::,2a03:71e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:7200::,2a03:7207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7220::,2a03:7220:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:7240::,2a03:7240:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:7260::,2a03:7260:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:7280::,2a03:7280:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:72a0::,2a03:72a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:72c0::,2a03:72c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:72e0::,2a03:72e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:7300::,2a03:7300:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:7320::,2a03:7320:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7340::,2a03:7340:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7360::,2a03:7367:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:7380::,2a03:7380:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:73a0::,2a03:73a7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:73c0::,2a03:73c0:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a03:73e0::,2a03:73e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7400::,2a03:7400:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:7420::,2a03:7420:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:7440::,2a03:7440:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:7460::,2a03:7460:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:7480::,2a03:7480:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:74a0::,2a03:74a0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:74c0::,2a03:74c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:74e0::,2a03:74e0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a03:7500::,2a03:7500:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7520::,2a03:7520:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:7540::,2a03:7540:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7560::,2a03:7560:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a03:7580::,2a03:7580:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:75a0::,2a03:75a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:75c0::,2a03:75c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:75e0::,2a03:75e0:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a03:7600::,2a03:7600:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:7620::,2a03:7620:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7640::,2a03:7640:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:7660::,2a03:7660:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:7680::,2a03:7680:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:76a0::,2a03:76a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:76c0::,2a03:76c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:76e0::,2a03:76e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:7700::,2a03:7700:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7720::,2a03:7720:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:7740::,2a03:7740:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a03:7760::,2a03:7760:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:7780::,2a03:7787:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:77a0::,2a03:77a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:77c0::,2a03:77c0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a03:77e0::,2a03:77e0:4401:1098::63,GB +2a03:77e0:4401:1098::64,2a03:77e0:4401:1098::64,ES +2a03:77e0:4401:1098::65,2a03:77e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:7800::,2a03:7800:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:7820::,2a03:7820:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a03:7840::,2a03:7840:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7880::,2a03:7880:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:78a0::,2a03:78a0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:78c0::,2a03:78c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:78e0::,2a03:78e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:7900::,2a03:7900:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:7920::,2a03:7920:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:7940::,2a03:7940:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:7960::,2a03:7960:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7980::,2a03:7980:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:79a0::,2a03:79a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:79c0::,2a03:79c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:79e0::,2a03:79e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:7a00::,2a03:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:7a40::,2a03:7a40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7a80::,2a03:7a80:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a03:7aa0::,2a03:7aa0:ffff:ffff:ffff:ffff:ffff:ffff,IM +2a03:7ac0::,2a03:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,AD +2a03:7ae0::,2a03:7ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7b00::,2a03:7b00:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:7b20::,2a03:7b20:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a03:7b40::,2a03:7b40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:7b60::,2a03:7b60:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a03:7b80::,2a03:7b80:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:7ba0::,2a03:7ba0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:7bc0::,2a03:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7be0::,2a03:7be0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:7c00::,2a03:7c00:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:7c20::,2a03:7c20:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7c40::,2a03:7c40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7c60::,2a03:7c60:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a03:7c80::,2a03:7c80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:7ca0::,2a03:7ca0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7cc0::,2a03:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7ce0::,2a03:7ce0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:7d00::,2a03:7d00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:7d20::,2a03:7d20:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:7d40::,2a03:7d40:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:7d60::,2a03:7d60:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a03:7d80::,2a03:7d80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7da0::,2a03:7da0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7dc0::,2a03:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7de0::,2a03:7de0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:7e00::,2a03:7e00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:7e20::,2a03:7e20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:7e40::,2a03:7e40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:7e60::,2a03:7e60:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a03:7e80::,2a03:7e80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:7ea0::,2a03:7ea0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:7ec0::,2a03:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:7ee0::,2a03:7ee0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:7f00::,2a03:7f00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7f20::,2a03:7f20:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:7f40::,2a03:7f40:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:7f60::,2a03:7f60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:7f80::,2a03:7f80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:7fa0::,2a03:7fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:7fc0::,2a03:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:7fe0::,2a03:7fe0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:8000::,2a03:8000:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:8020::,2a03:8020:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:8040::,2a03:8040:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:8060::,2a03:8060:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:8080::,2a03:8080:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:80a0::,2a03:80a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:80c0::,2a03:80c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:80e0::,2a03:80e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8100::,2a03:8100:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:8120::,2a03:8120:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:8140::,2a03:8140:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8160::,2a03:8160:ffff:ffff:ffff:ffff:ffff:ffff,US +2a03:8180::,2a03:8180:1100:ffff:ffff:ffff:ffff:ffff,NL +2a03:8180:1101::,2a03:8180:1101:7fff:ffff:ffff:ffff:ffff,GB +2a03:8180:1101:8000::,2a03:8180:1300:ffff:ffff:ffff:ffff:ffff,NL +2a03:8180:1301::,2a03:8180:1301:7fff:ffff:ffff:ffff:ffff,FR +2a03:8180:1301:8000::,2a03:8180:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:81a0::,2a03:81a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:81e0::,2a03:81e0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:8200::,2a03:8200:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8220::,2a03:8220:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:8240::,2a03:8240:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:8260::,2a03:8260:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:8280::,2a03:8280:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:82a0::,2a03:82a0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:82c0::,2a03:82c0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:82e0::,2a03:82e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:8300::,2a03:8300:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:8320::,2a03:8320:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:8340::,2a03:8340:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:8360::,2a03:8360:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:8380::,2a03:8380:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:83a0::,2a03:83a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:83c0::,2a03:83c0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:83e0::,2a03:83e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8400::,2a03:8400:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:8420::,2a03:8420:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:8440::,2a03:8440:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:8460::,2a03:8460:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:8480::,2a03:8480:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a03:84a0::,2a03:84a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:84c0::,2a03:84c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:84e0::,2a03:84e0:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a03:8500::,2a03:8500:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:8520::,2a03:8520:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8540::,2a03:8540:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:8560::,2a03:8560:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:8580::,2a03:8580:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:85c0::,2a03:85c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:85e0::,2a03:85e0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:8600::,2a03:8600:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:8620::,2a03:8620:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:8640::,2a03:8640:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:8660::,2a03:8660:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:8680::,2a03:8680:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:86a0::,2a03:86a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:86c0::,2a03:86c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:86e0::,2a03:86e0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:8700::,2a03:8700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:8720::,2a03:8720:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:8740::,2a03:8740:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:8760::,2a03:8760:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:8780::,2a03:8780:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:87a0::,2a03:87a0:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a03:87c0::,2a03:87c7:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:87e0::,2a03:87e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8800::,2a03:8800:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:8820::,2a03:8820:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a03:8840::,2a03:8840:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8860::,2a03:8860:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:8880::,2a03:8880:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:88c0::,2a03:88c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:88e0::,2a03:88e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8900::,2a03:8900:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:8920::,2a03:8920:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8940::,2a03:8940:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:8960::,2a03:8960:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a03:8980::,2a03:8980:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:89a0::,2a03:89a0:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:89c0::,2a03:89c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:8a00::,2a03:8a00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8a20::,2a03:8a20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8a40::,2a03:8a40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:8a60::,2a03:8a60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:8a80::,2a03:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:8aa0::,2a03:8aa0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:8ac0::,2a03:8ac0:24f:ffff:ffff:ffff:ffff:ffff,US +2a03:8ac0:250::,2a03:8ac0:250:ffff:ffff:ffff:ffff:ffff,SG +2a03:8ac0:251::,2a03:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,US +2a03:8ae0::,2a03:8ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:8b00::,2a03:8b00:ffff:ffff:ffff:ffff:ffff:ffff,SM +2a03:8b20::,2a03:8b20:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a03:8b40::,2a03:8b40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:8b60::,2a03:8b60:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a03:8b80::,2a03:8b80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:8ba0::,2a03:8ba0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:8bc0::,2a03:8bc0:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a03:8be0::,2a03:8be0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:8c00::,2a03:8c00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8c20::,2a03:8c20:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:8c40::,2a03:8c40:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:8c60::,2a03:8c60:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:8c80::,2a03:8c87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:8cc0::,2a03:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8ce0::,2a03:8ce0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:8d00::,2a03:8d00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8d20::,2a03:8d20:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:8d40::,2a03:8d47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:8d60::,2a03:8d60:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a03:8d80::,2a03:8d80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:8da0::,2a03:8da0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:8dc0::,2a03:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:8de0::,2a03:8de0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:8e00::,2a03:8e00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8e20::,2a03:8e20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:8e40::,2a03:8e40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:8e60::,2a03:8e60:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:8e80::,2a03:8e80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:8ea0::,2a03:8ea0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:8ec0::,2a03:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:8ee0::,2a03:8ee0:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a03:8f00::,2a03:8f07:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:8f40::,2a03:8f40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:8f60::,2a03:8f60:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:8f80::,2a03:8f87:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:8fa0::,2a03:8fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:8fc0::,2a03:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:8fe0::,2a03:8fe0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:9000::,2a03:9000:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:9020::,2a03:9020:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:9040::,2a03:9040:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:9060::,2a03:9060:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:9080::,2a03:9080:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:90a0::,2a03:90a0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:90c0::,2a03:90c0:f:ffff:ffff:ffff:ffff:ffff,AT +2a03:90c0:10::,2a03:90c0:1f:ffff:ffff:ffff:ffff:ffff,NL +2a03:90c0:20::,2a03:90c0:3f:ffff:ffff:ffff:ffff:ffff,US +2a03:90c0:40::,2a03:90c0:4f:ffff:ffff:ffff:ffff:ffff,DE +2a03:90c0:50::,2a03:90c0:5f:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:60::,2a03:90c0:6f:ffff:ffff:ffff:ffff:ffff,SG +2a03:90c0:70::,2a03:90c0:7f:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:80::,2a03:90c0:8f:ffff:ffff:ffff:ffff:ffff,LU +2a03:90c0:90::,2a03:90c0:9f:ffff:ffff:ffff:ffff:ffff,CY +2a03:90c0:a0::,2a03:90c0:bf:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:c0::,2a03:90c0:cf:ffff:ffff:ffff:ffff:ffff,US +2a03:90c0:d0::,2a03:90c0:df:ffff:ffff:ffff:ffff:ffff,PL +2a03:90c0:e0::,2a03:90c0:12f:ffff:ffff:ffff:ffff:ffff,AT +2a03:90c0:130::,2a03:90c0:13f:ffff:ffff:ffff:ffff:ffff,US +2a03:90c0:140::,2a03:90c0:998f:ffff:ffff:ffff:ffff:ffff,AT +2a03:90c0:9990::,2a03:90c0:9994:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:9995::,2a03:90c0:9995:ffff:ffff:ffff:ffff:ffff,SG +2a03:90c0:9996::,2a03:90c0:9996:ffff:ffff:ffff:ffff:ffff,US +2a03:90c0:9997::,2a03:90c0:9997:ffff:ffff:ffff:ffff:ffff,DE +2a03:90c0:9998::,2a03:90c0:999f:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:99a0::,2a03:90c0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:90e0::,2a03:90e0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a03:9100::,2a03:9100:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:9120::,2a03:9120:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a03:9140::,2a03:9140:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:9160::,2a03:9160:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:9180::,2a03:9180:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:91a0::,2a03:91a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:91c0::,2a03:91c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:91e0::,2a03:91e0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:9200::,2a03:9200:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:9220::,2a03:9220:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:9240::,2a03:9240:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a03:9260::,2a03:9260:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:9280::,2a03:9280:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:92c0::,2a03:92c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:92e0::,2a03:92e0:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:9300::,2a03:9300:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:9320::,2a03:9320:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:9340::,2a03:9340:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:9360::,2a03:9360:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a03:9380::,2a03:9380:3fff:ffff:ffff:ffff:ffff:ffff,IR +2a03:9380:4000::,2a03:9380:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:93a0::,2a03:93a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:93c0::,2a03:93c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:93e0::,2a03:93e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:9400::,2a03:9400:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:9420::,2a03:9420:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:9440::,2a03:9440:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:9460::,2a03:9460:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:9480::,2a03:9480:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:94a0::,2a03:94a0:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:94c0::,2a03:94c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:94e0::,2a03:94e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:9500::,2a03:9500:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:9520::,2a03:9520:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:9540::,2a03:9540:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:9560::,2a03:9567:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:9580::,2a03:9580:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:95a0::,2a03:95a0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:95c0::,2a03:95c0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a03:95e0::,2a03:95e0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:9600::,2a03:9600:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:9620::,2a03:9620:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:9640::,2a03:9640:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a03:9660::,2a03:9660:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:9680::,2a03:9680:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:96a0::,2a03:96a0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:96c0::,2a03:96c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:96e0::,2a03:96e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:9700::,2a03:9700:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:9720::,2a03:9720:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:9740::,2a03:9740:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:9760::,2a03:9760:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:9780::,2a03:9780:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:97a0::,2a03:97a0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:97c0::,2a03:97c1:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:97e0::,2a03:97e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:9800::,2a03:9807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:9840::,2a03:9840:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:9860::,2a03:9860:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:9880::,2a03:9880:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:98a0::,2a03:98a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:98c0::,2a03:98c7:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:9900::,2a03:9900:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:9920::,2a03:9920:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:9940::,2a03:9940:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:9960::,2a03:9960:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:9980::,2a03:9980:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:99a0::,2a03:99a0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:99c0::,2a03:99c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:99e0::,2a03:99e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:9a00::,2a03:9a07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:9a40::,2a03:9a40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:9a60::,2a03:9a60:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:9a80::,2a03:9a80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:9aa0::,2a03:9aa0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:9ac0::,2a03:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:9ae0::,2a03:9ae0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:9b00::,2a03:9b00:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:9b20::,2a03:9b20:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:9b40::,2a03:9b40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:9b60::,2a03:9b60:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a03:9b80::,2a03:9b80:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:9ba0::,2a03:9ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:9bc0::,2a03:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:9be0::,2a03:9be0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:9c00::,2a03:9c00:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:9c20::,2a03:9c20:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:9c40::,2a03:9c40:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:9c60::,2a03:9c60:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:9c80::,2a03:9c80:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a03:9ca0::,2a03:9ca0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:9cc0::,2a03:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:9d00::,2a03:9d00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:9d20::,2a03:9d20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:9d40::,2a03:9d40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:9d60::,2a03:9d60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:9d80::,2a03:9d80:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:9da0::,2a03:9da0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:9dc0::,2a03:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:9de0::,2a03:9de0:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:9e00::,2a03:9e00:ffff:ffff:ffff:ffff:ffff:ffff,IM +2a03:9e20::,2a03:9e20:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:9e40::,2a03:9e47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:9e80::,2a03:9e80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:9ea0::,2a03:9ea0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:9ec0::,2a03:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:9ee0::,2a03:9ee0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:9f00::,2a03:9f00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:9f60::,2a03:9f60:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a03:9f80::,2a03:9f80:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:9fa0::,2a03:9fa0:ffff:ffff:ffff:ffff:ffff:ffff,US +2a03:9fc0::,2a03:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:9fe0::,2a03:9fe0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a000::,2a03:a000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:a020::,2a03:a020:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:a040::,2a03:a040:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a060::,2a03:a060:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a080::,2a03:a080:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:a0a0::,2a03:a0a0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:a0c0::,2a03:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:a0e0::,2a03:a0e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a100::,2a03:a100:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a03:a120::,2a03:a120:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a03:a140::,2a03:a140:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:a160::,2a03:a160:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:a180::,2a03:a180:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a1a0::,2a03:a1a0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:a1c0::,2a03:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a1e0::,2a03:a1e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a200::,2a03:a200:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:a220::,2a03:a220:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:a240::,2a03:a240:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:a260::,2a03:a260:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:a280::,2a03:a280:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:a2a0::,2a03:a2a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a2c0::,2a03:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:a2e0::,2a03:a2e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:a300::,2a03:a300:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a03:a320::,2a03:a320:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:a340::,2a03:a340:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:a360::,2a03:a360:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:a380::,2a03:a380:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:a3a0::,2a03:a3a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:a3c0::,2a03:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:a3e0::,2a03:a3e0:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:a400::,2a03:a400:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a420::,2a03:a420:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:a440::,2a03:a440:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:a460::,2a03:a460:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:a480::,2a03:a480:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:a4a0::,2a03:a4a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a4c0::,2a03:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:a4e0::,2a03:a4e0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:a500::,2a03:a500:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:a520::,2a03:a520:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:a540::,2a03:a540:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:a560::,2a03:a560:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:a580::,2a03:a580:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:a5a0::,2a03:a5a0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:a5c0::,2a03:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:a5e0::,2a03:a5e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:a600::,2a03:a600:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:a620::,2a03:a620:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:a640::,2a03:a640:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:a660::,2a03:a660:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:a680::,2a03:a680:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:a6c0::,2a03:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:a6e0::,2a03:a6e0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:a700::,2a03:a700:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:a720::,2a03:a727:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:a740::,2a03:a740:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:a760::,2a03:a760:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:a780::,2a03:a780:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:a7a0::,2a03:a7a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a7c0::,2a03:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:a7e0::,2a03:a7e7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:a800::,2a03:a800:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:a820::,2a03:a820:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:a840::,2a03:a840:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:a860::,2a03:a860:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:a880::,2a03:a880:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:a8a0::,2a03:a8a7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:a8c0::,2a03:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:a8e0::,2a03:a8e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:a900::,2a03:a900:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:a920::,2a03:a920:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:a940::,2a03:a940:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:a960::,2a03:a960:1f:ffff:ffff:ffff:ffff:ffff,DE +2a03:a960:20::,2a03:a960:2f:ffff:ffff:ffff:ffff:ffff,US +2a03:a960:30::,2a03:a960:fff:ffff:ffff:ffff:ffff:ffff,DE +2a03:a960:1000::,2a03:a960:1000:ffff:ffff:ffff:ffff:ffff,RU +2a03:a960:1001::,2a03:a967:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:a980::,2a03:a980:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:a9a0::,2a03:a9a0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:a9c0::,2a03:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:a9e0::,2a03:a9e0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:aa00::,2a03:aa00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:aa20::,2a03:aa20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:aa40::,2a03:aa40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:aa60::,2a03:aa60:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:aa80::,2a03:aa80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:aaa0::,2a03:aaa7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:aac0::,2a03:aac0:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:aae0::,2a03:aae0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:ab00::,2a03:ab00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:ab20::,2a03:ab20:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:ab40::,2a03:ab40:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:ab60::,2a03:ab60:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:ab80::,2a03:ab80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:aba0::,2a03:aba7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:abc0::,2a03:abc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:abe0::,2a03:abe7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:ac00::,2a03:ac00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:ac40::,2a03:ac40:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:ac60::,2a03:ac60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:ac80::,2a03:ac80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:aca0::,2a03:aca0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:acc0::,2a03:acc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:ace0::,2a03:ace0:ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:ace0:100::,2a03:ace0:101:ffff:ffff:ffff:ffff:ffff,DE +2a03:ace0:102::,2a03:ace0:103:ffff:ffff:ffff:ffff:ffff,FR +2a03:ace0:104::,2a03:ace0:105:ffff:ffff:ffff:ffff:ffff,GB +2a03:ace0:106::,2a03:ace0:107:ffff:ffff:ffff:ffff:ffff,IT +2a03:ace0:108::,2a03:ace0:109:ffff:ffff:ffff:ffff:ffff,ES +2a03:ace0:10a::,2a03:ace0:10b:ffff:ffff:ffff:ffff:ffff,NL +2a03:ace0:10c::,2a03:ace0:10d:ffff:ffff:ffff:ffff:ffff,BE +2a03:ace0:10e::,2a03:ace0:10f:ffff:ffff:ffff:ffff:ffff,GR +2a03:ace0:110::,2a03:ace0:111:ffff:ffff:ffff:ffff:ffff,PT +2a03:ace0:112::,2a03:ace0:113:ffff:ffff:ffff:ffff:ffff,SE +2a03:ace0:114::,2a03:ace0:115:ffff:ffff:ffff:ffff:ffff,AT +2a03:ace0:116::,2a03:ace0:117:ffff:ffff:ffff:ffff:ffff,CH +2a03:ace0:118::,2a03:ace0:119:ffff:ffff:ffff:ffff:ffff,DK +2a03:ace0:11a::,2a03:ace0:11b:ffff:ffff:ffff:ffff:ffff,FI +2a03:ace0:11c::,2a03:ace0:11d:ffff:ffff:ffff:ffff:ffff,NO +2a03:ace0:11e::,2a03:ace0:11f:ffff:ffff:ffff:ffff:ffff,IE +2a03:ace0:120::,2a03:ace0:121:ffff:ffff:ffff:ffff:ffff,IS +2a03:ace0:122::,2a03:ace0:123:ffff:ffff:ffff:ffff:ffff,FO +2a03:ace0:124::,2a03:ace0:1ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:ace0:200::,2a03:ace0:201:ffff:ffff:ffff:ffff:ffff,DE +2a03:ace0:202::,2a03:ace0:203:ffff:ffff:ffff:ffff:ffff,FR +2a03:ace0:204::,2a03:ace0:205:ffff:ffff:ffff:ffff:ffff,GB +2a03:ace0:206::,2a03:ace0:207:ffff:ffff:ffff:ffff:ffff,IT +2a03:ace0:208::,2a03:ace0:209:ffff:ffff:ffff:ffff:ffff,ES +2a03:ace0:20a::,2a03:ace0:20b:ffff:ffff:ffff:ffff:ffff,NL +2a03:ace0:20c::,2a03:ace0:20d:ffff:ffff:ffff:ffff:ffff,BE +2a03:ace0:20e::,2a03:ace0:20f:ffff:ffff:ffff:ffff:ffff,GR +2a03:ace0:210::,2a03:ace0:211:ffff:ffff:ffff:ffff:ffff,PT +2a03:ace0:212::,2a03:ace0:213:ffff:ffff:ffff:ffff:ffff,SE +2a03:ace0:214::,2a03:ace0:215:ffff:ffff:ffff:ffff:ffff,AT +2a03:ace0:216::,2a03:ace0:217:ffff:ffff:ffff:ffff:ffff,CH +2a03:ace0:218::,2a03:ace0:219:ffff:ffff:ffff:ffff:ffff,DK +2a03:ace0:21a::,2a03:ace0:21b:ffff:ffff:ffff:ffff:ffff,FI +2a03:ace0:21c::,2a03:ace0:21d:ffff:ffff:ffff:ffff:ffff,NO +2a03:ace0:21e::,2a03:ace0:21f:ffff:ffff:ffff:ffff:ffff,IE +2a03:ace0:220::,2a03:ace0:221:ffff:ffff:ffff:ffff:ffff,IS +2a03:ace0:222::,2a03:ace0:223:ffff:ffff:ffff:ffff:ffff,FO +2a03:ace0:224::,2a03:ace0:2ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:ace0:300::,2a03:ace0:301:ffff:ffff:ffff:ffff:ffff,DE +2a03:ace0:302::,2a03:ace0:303:ffff:ffff:ffff:ffff:ffff,FR +2a03:ace0:304::,2a03:ace0:305:ffff:ffff:ffff:ffff:ffff,GB +2a03:ace0:306::,2a03:ace0:307:ffff:ffff:ffff:ffff:ffff,IT +2a03:ace0:308::,2a03:ace0:309:ffff:ffff:ffff:ffff:ffff,ES +2a03:ace0:30a::,2a03:ace0:30b:ffff:ffff:ffff:ffff:ffff,NL +2a03:ace0:30c::,2a03:ace0:30d:ffff:ffff:ffff:ffff:ffff,BE +2a03:ace0:30e::,2a03:ace0:30f:ffff:ffff:ffff:ffff:ffff,GR +2a03:ace0:310::,2a03:ace0:311:ffff:ffff:ffff:ffff:ffff,PT +2a03:ace0:312::,2a03:ace0:313:ffff:ffff:ffff:ffff:ffff,SE +2a03:ace0:314::,2a03:ace0:315:ffff:ffff:ffff:ffff:ffff,AT +2a03:ace0:316::,2a03:ace0:317:ffff:ffff:ffff:ffff:ffff,CH +2a03:ace0:318::,2a03:ace0:319:ffff:ffff:ffff:ffff:ffff,DK +2a03:ace0:31a::,2a03:ace0:31b:ffff:ffff:ffff:ffff:ffff,FI +2a03:ace0:31c::,2a03:ace0:31d:ffff:ffff:ffff:ffff:ffff,NO +2a03:ace0:31e::,2a03:ace0:31f:ffff:ffff:ffff:ffff:ffff,IE +2a03:ace0:320::,2a03:ace0:321:ffff:ffff:ffff:ffff:ffff,IS +2a03:ace0:322::,2a03:ace0:323:ffff:ffff:ffff:ffff:ffff,FO +2a03:ace0:324::,2a03:ace0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:ad00::,2a03:ad07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:ad20::,2a03:ad27:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:ad40::,2a03:ad40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:ad60::,2a03:ad60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:ad80::,2a03:ad87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:ada0::,2a03:ada0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:adc0::,2a03:adc0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:ade0::,2a03:ade0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:ae00::,2a03:ae00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:ae20::,2a03:ae20:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:ae40::,2a03:ae40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:ae60::,2a03:ae60:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:ae80::,2a03:ae80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:aea0::,2a03:aea0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:aec0::,2a03:aec0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:aee0::,2a03:aee0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:af00::,2a03:af00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:af20::,2a03:af20:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:af40::,2a03:af40:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a03:af60::,2a03:af60:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:af80::,2a03:af80:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:afa0::,2a03:afa0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:afc0::,2a03:afc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:afe0::,2a03:afe7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:b000::,2a03:b000:9ff:ffff:ffff:ffff:ffff:ffff,SE +2a03:b000:a00::,2a03:b000:a00:7fff:ffff:ffff:ffff:ffff,GB +2a03:b000:a00:8000::,2a03:b000:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:b020::,2a03:b027:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:b040::,2a03:b040:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b060::,2a03:b060:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:b080::,2a03:b080:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:b0a0::,2a03:b0a0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:b0c0::,2a03:b0c0::ffff:ffff:ffff:ffff:ffff,NL +2a03:b0c0:1::,2a03:b0c0:1:ffff:ffff:ffff:ffff:ffff,GB +2a03:b0c0:2::,2a03:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:b0e0::,2a03:b0e0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:b100::,2a03:b100:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:b140::,2a03:b140:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:b180::,2a03:b180:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a03:b1c0::,2a03:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:b200::,2a03:b207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b240::,2a03:b247:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:b280::,2a03:b280:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:b2c0::,2a03:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:b300::,2a03:b300:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b340::,2a03:b340:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:b380::,2a03:b380:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:b3c0::,2a03:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:b400::,2a03:b400:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:b440::,2a03:b440:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b480::,2a03:b480:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:b4c0::,2a03:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:b500::,2a03:b500:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:b540::,2a03:b540:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:b580::,2a03:b580:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:b5c0::,2a03:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:b600::,2a03:b600::ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:1::,2a03:b600:1::3fff:ffff,US +2a03:b600:1::4000:0,2a03:b600:1:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:2::,2a03:b600:2::3fff:ffff,US +2a03:b600:2::4000:0,2a03:b600:2:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:3::,2a03:b600:3::3fff:ffff,US +2a03:b600:3::4000:0,2a03:b600:3:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:4::,2a03:b600:4::3fff:ffff,US +2a03:b600:4::4000:0,2a03:b600:4:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:5::,2a03:b600:5::3fff:ffff,US +2a03:b600:5::4000:0,2a03:b600:5:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:6::,2a03:b600:6::3fff:ffff,US +2a03:b600:6::4000:0,2a03:b600:6:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:7::,2a03:b600:7::3fff:ffff,US +2a03:b600:7::4000:0,2a03:b600:7:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:8::,2a03:b600:8::3fff:ffff,US +2a03:b600:8::4000:0,2a03:b600:8:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:9::,2a03:b600:9::3fff:ffff,US +2a03:b600:9::4000:0,2a03:b600:f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:10::,2a03:b600:10::3fff:ffff,US +2a03:b600:10::4000:0,2a03:b600:10:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:11::,2a03:b600:11::3fff:ffff,US +2a03:b600:11::4000:0,2a03:b600:11:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:12::,2a03:b600:12::3fff:ffff,US +2a03:b600:12::4000:0,2a03:b600:12:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:13::,2a03:b600:13::3fff:ffff,US +2a03:b600:13::4000:0,2a03:b600:13:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:14::,2a03:b600:14::3fff:ffff,US +2a03:b600:14::4000:0,2a03:b600:14:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:15::,2a03:b600:15::3fff:ffff,US +2a03:b600:15::4000:0,2a03:b600:15:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:16::,2a03:b600:16::3fff:ffff,US +2a03:b600:16::4000:0,2a03:b600:16:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:17::,2a03:b600:17::3fff:ffff,US +2a03:b600:17::4000:0,2a03:b600:17:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:18::,2a03:b600:18::3fff:ffff,US +2a03:b600:18::4000:0,2a03:b600:18:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:19::,2a03:b600:19::3fff:ffff,US +2a03:b600:19::4000:0,2a03:b600:1f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:20::,2a03:b600:20::3fff:ffff,US +2a03:b600:20::4000:0,2a03:b600:20:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:21::,2a03:b600:21::3fff:ffff,US +2a03:b600:21::4000:0,2a03:b600:21:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:22::,2a03:b600:22::3fff:ffff,US +2a03:b600:22::4000:0,2a03:b600:22:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:23::,2a03:b600:23::3fff:ffff,US +2a03:b600:23::4000:0,2a03:b600:23:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:24::,2a03:b600:24::3fff:ffff,US +2a03:b600:24::4000:0,2a03:b600:24:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:25::,2a03:b600:25::3fff:ffff,US +2a03:b600:25::4000:0,2a03:b600:25:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:26::,2a03:b600:26::3fff:ffff,US +2a03:b600:26::4000:0,2a03:b600:26:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:27::,2a03:b600:27::3fff:ffff,US +2a03:b600:27::4000:0,2a03:b600:27:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:28::,2a03:b600:28::3fff:ffff,US +2a03:b600:28::4000:0,2a03:b600:28:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:29::,2a03:b600:29::3fff:ffff,US +2a03:b600:29::4000:0,2a03:b600:2f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:30::,2a03:b600:30::3fff:ffff,US +2a03:b600:30::4000:0,2a03:b600:30:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:31::,2a03:b600:31::3fff:ffff,US +2a03:b600:31::4000:0,2a03:b600:31:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:32::,2a03:b600:32::3fff:ffff,US +2a03:b600:32::4000:0,2a03:b600:32:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:33::,2a03:b600:33::3fff:ffff,US +2a03:b600:33::4000:0,2a03:b600:33:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:34::,2a03:b600:34::3fff:ffff,US +2a03:b600:34::4000:0,2a03:b600:34:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:35::,2a03:b600:35::3fff:ffff,US +2a03:b600:35::4000:0,2a03:b600:35:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:36::,2a03:b600:36::3fff:ffff,US +2a03:b600:36::4000:0,2a03:b600:36:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:37::,2a03:b600:37::3fff:ffff,US +2a03:b600:37::4000:0,2a03:b600:37:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:38::,2a03:b600:38::3fff:ffff,US +2a03:b600:38::4000:0,2a03:b600:38:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:39::,2a03:b600:39::3fff:ffff,US +2a03:b600:39::4000:0,2a03:b600:3f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:40::,2a03:b600:40::3fff:ffff,US +2a03:b600:40::4000:0,2a03:b600:40:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:41::,2a03:b600:41::3fff:ffff,US +2a03:b600:41::4000:0,2a03:b600:41:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:42::,2a03:b600:42::3fff:ffff,US +2a03:b600:42::4000:0,2a03:b600:42:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:43::,2a03:b600:43::3fff:ffff,US +2a03:b600:43::4000:0,2a03:b600:43:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:44::,2a03:b600:44::3fff:ffff,US +2a03:b600:44::4000:0,2a03:b600:45:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:46::,2a03:b600:46::3fff:ffff,US +2a03:b600:46::4000:0,2a03:b600:46:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:47::,2a03:b600:47::3fff:ffff,US +2a03:b600:47::4000:0,2a03:b600:47:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:48::,2a03:b600:48::3fff:ffff,US +2a03:b600:48::4000:0,2a03:b600:48:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:49::,2a03:b600:49::3fff:ffff,US +2a03:b600:49::4000:0,2a03:b600:4f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:50::,2a03:b600:50::3fff:ffff,US +2a03:b600:50::4000:0,2a03:b600:50:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:51::,2a03:b600:51::3fff:ffff,US +2a03:b600:51::4000:0,2a03:b600:51:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:52::,2a03:b600:52::3fff:ffff,US +2a03:b600:52::4000:0,2a03:b600:52:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:53::,2a03:b600:53::3fff:ffff,US +2a03:b600:53::4000:0,2a03:b600:53:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:54::,2a03:b600:54::3fff:ffff,US +2a03:b600:54::4000:0,2a03:b600:54:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:55::,2a03:b600:55::3fff:ffff,US +2a03:b600:55::4000:0,2a03:b600:55:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:56::,2a03:b600:56::3fff:ffff,US +2a03:b600:56::4000:0,2a03:b600:56:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:57::,2a03:b600:57::3fff:ffff,US +2a03:b600:57::4000:0,2a03:b600:57:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:58::,2a03:b600:58::3fff:ffff,US +2a03:b600:58::4000:0,2a03:b600:58:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:59::,2a03:b600:59::3fff:ffff,US +2a03:b600:59::4000:0,2a03:b600:5f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:60::,2a03:b600:60::3fff:ffff,US +2a03:b600:60::4000:0,2a03:b600:60:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:61::,2a03:b600:61::3fff:ffff,US +2a03:b600:61::4000:0,2a03:b600:61:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:62::,2a03:b600:62::3fff:ffff,US +2a03:b600:62::4000:0,2a03:b600:62:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:63::,2a03:b600:63::3fff:ffff,US +2a03:b600:63::4000:0,2a03:b600:63:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:64::,2a03:b600:64::3fff:ffff,US +2a03:b600:64::4000:0,2a03:b600:64:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:65::,2a03:b600:65::3fff:ffff,US +2a03:b600:65::4000:0,2a03:b600:65:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:66::,2a03:b600:66::3fff:ffff,US +2a03:b600:66::4000:0,2a03:b600:66:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:67::,2a03:b600:67::3fff:ffff,US +2a03:b600:67::4000:0,2a03:b600:67:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:68::,2a03:b600:68::3fff:ffff,US +2a03:b600:68::4000:0,2a03:b600:68:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:69::,2a03:b600:69::3fff:ffff,US +2a03:b600:69::4000:0,2a03:b600:6f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:70::,2a03:b600:70::3fff:ffff,US +2a03:b600:70::4000:0,2a03:b600:70:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:71::,2a03:b600:71::3fff:ffff,US +2a03:b600:71::4000:0,2a03:b600:71:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:72::,2a03:b600:72::3fff:ffff,US +2a03:b600:72::4000:0,2a03:b600:72:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:73::,2a03:b600:73::3fff:ffff,US +2a03:b600:73::4000:0,2a03:b600:73:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:74::,2a03:b600:74::3fff:ffff,US +2a03:b600:74::4000:0,2a03:b600:74:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:75::,2a03:b600:75::3fff:ffff,US +2a03:b600:75::4000:0,2a03:b600:75:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:76::,2a03:b600:76::3fff:ffff,US +2a03:b600:76::4000:0,2a03:b600:76:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:77::,2a03:b600:77::3fff:ffff,US +2a03:b600:77::4000:0,2a03:b600:77:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:78::,2a03:b600:78::3fff:ffff,US +2a03:b600:78::4000:0,2a03:b600:78:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:79::,2a03:b600:79::3fff:ffff,US +2a03:b600:79::4000:0,2a03:b600:7f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:80::,2a03:b600:80::3fff:ffff,US +2a03:b600:80::4000:0,2a03:b600:80:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:81::,2a03:b600:81::3fff:ffff,US +2a03:b600:81::4000:0,2a03:b600:81:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:82::,2a03:b600:82::3fff:ffff,US +2a03:b600:82::4000:0,2a03:b600:82:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:83::,2a03:b600:83::3fff:ffff,US +2a03:b600:83::4000:0,2a03:b600:83:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:84::,2a03:b600:84::3fff:ffff,US +2a03:b600:84::4000:0,2a03:b600:84:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:85::,2a03:b600:85::3fff:ffff,US +2a03:b600:85::4000:0,2a03:b600:85:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:86::,2a03:b600:86::3fff:ffff,US +2a03:b600:86::4000:0,2a03:b600:86:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:87::,2a03:b600:87::3fff:ffff,US +2a03:b600:87::4000:0,2a03:b600:87:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:88::,2a03:b600:88::3fff:ffff,US +2a03:b600:88::4000:0,2a03:b600:88:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:89::,2a03:b600:89::3fff:ffff,US +2a03:b600:89::4000:0,2a03:b600:8f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:90::,2a03:b600:90::3fff:ffff,US +2a03:b600:90::4000:0,2a03:b600:90:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:91::,2a03:b600:91::3fff:ffff,US +2a03:b600:91::4000:0,2a03:b600:91:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:92::,2a03:b600:92::3fff:ffff,US +2a03:b600:92::4000:0,2a03:b600:92:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:93::,2a03:b600:93::3fff:ffff,US +2a03:b600:93::4000:0,2a03:b600:93:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:94::,2a03:b600:94::3fff:ffff,US +2a03:b600:94::4000:0,2a03:b600:94:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:95::,2a03:b600:95::3fff:ffff,US +2a03:b600:95::4000:0,2a03:b600:95:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:96::,2a03:b600:96::3fff:ffff,US +2a03:b600:96::4000:0,2a03:b600:96:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:97::,2a03:b600:97::3fff:ffff,US +2a03:b600:97::4000:0,2a03:b600:97:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:98::,2a03:b600:98::3fff:ffff,US +2a03:b600:98::4000:0,2a03:b600:98:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:99::,2a03:b600:99::3fff:ffff,US +2a03:b600:99::4000:0,2a03:b600:ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:100::,2a03:b600:100::3fff:ffff,US +2a03:b600:100::4000:0,2a03:b600:100:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:101::,2a03:b600:101::3fff:ffff,US +2a03:b600:101::4000:0,2a03:b600:101:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:102::,2a03:b600:102::3fff:ffff,US +2a03:b600:102::4000:0,2a03:b600:102:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:103::,2a03:b600:103::3fff:ffff,US +2a03:b600:103::4000:0,2a03:b600:103:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:104::,2a03:b600:104::3fff:ffff,US +2a03:b600:104::4000:0,2a03:b600:104:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:105::,2a03:b600:105::3fff:ffff,US +2a03:b600:105::4000:0,2a03:b600:105:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:106::,2a03:b600:106::3fff:ffff,US +2a03:b600:106::4000:0,2a03:b600:106:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:107::,2a03:b600:107::3fff:ffff,US +2a03:b600:107::4000:0,2a03:b600:107:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:108::,2a03:b600:108::3fff:ffff,US +2a03:b600:108::4000:0,2a03:b600:108:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:109::,2a03:b600:109::3fff:ffff,US +2a03:b600:109::4000:0,2a03:b600:12f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:130::,2a03:b600:130::3fff:ffff,US +2a03:b600:130::4000:0,2a03:b600:130:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:131::,2a03:b600:131::3fff:ffff,US +2a03:b600:131::4000:0,2a03:b600:131:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:132::,2a03:b600:132::3fff:ffff,US +2a03:b600:132::4000:0,2a03:b600:132:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:133::,2a03:b600:133::3fff:ffff,US +2a03:b600:133::4000:0,2a03:b600:133:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:134::,2a03:b600:134::3fff:ffff,US +2a03:b600:134::4000:0,2a03:b600:134:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:135::,2a03:b600:135::3fff:ffff,US +2a03:b600:135::4000:0,2a03:b600:135:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:136::,2a03:b600:136::3fff:ffff,US +2a03:b600:136::4000:0,2a03:b600:136:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:137::,2a03:b600:137::3fff:ffff,US +2a03:b600:137::4000:0,2a03:b600:137:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:138::,2a03:b600:138::3fff:ffff,US +2a03:b600:138::4000:0,2a03:b600:138:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:139::,2a03:b600:139::3fff:ffff,US +2a03:b600:139::4000:0,2a03:b600:13f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:140::,2a03:b600:140::3fff:ffff,US +2a03:b600:140::4000:0,2a03:b600:140:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:141::,2a03:b600:141::3fff:ffff,US +2a03:b600:141::4000:0,2a03:b600:141:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:142::,2a03:b600:142::3fff:ffff,US +2a03:b600:142::4000:0,2a03:b600:142:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:143::,2a03:b600:143::3fff:ffff,US +2a03:b600:143::4000:0,2a03:b600:143:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:144::,2a03:b600:144::3fff:ffff,US +2a03:b600:144::4000:0,2a03:b600:144:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:145::,2a03:b600:145::3fff:ffff,US +2a03:b600:145::4000:0,2a03:b600:145:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:146::,2a03:b600:146::3fff:ffff,US +2a03:b600:146::4000:0,2a03:b600:146:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:147::,2a03:b600:147::3fff:ffff,US +2a03:b600:147::4000:0,2a03:b600:147:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:148::,2a03:b600:148::3fff:ffff,US +2a03:b600:148::4000:0,2a03:b600:148:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:149::,2a03:b600:149::3fff:ffff,US +2a03:b600:149::4000:0,2a03:b600:14f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:150::,2a03:b600:150::3fff:ffff,US +2a03:b600:150::4000:0,2a03:b600:150:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:151::,2a03:b600:151::3fff:ffff,US +2a03:b600:151::4000:0,2a03:b600:151:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:152::,2a03:b600:152::3fff:ffff,US +2a03:b600:152::4000:0,2a03:b600:152:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:153::,2a03:b600:153::3fff:ffff,US +2a03:b600:153::4000:0,2a03:b600:153:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:154::,2a03:b600:154::3fff:ffff,US +2a03:b600:154::4000:0,2a03:b600:154:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:155::,2a03:b600:155::3fff:ffff,US +2a03:b600:155::4000:0,2a03:b600:155:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:156::,2a03:b600:156::3fff:ffff,US +2a03:b600:156::4000:0,2a03:b600:156:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:157::,2a03:b600:157::3fff:ffff,US +2a03:b600:157::4000:0,2a03:b600:157:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:158::,2a03:b600:158::3fff:ffff,US +2a03:b600:158::4000:0,2a03:b600:158:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:159::,2a03:b600:159::3fff:ffff,US +2a03:b600:159::4000:0,2a03:b600:15f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:160::,2a03:b600:160::3fff:ffff,US +2a03:b600:160::4000:0,2a03:b600:160:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:161::,2a03:b600:161::3fff:ffff,US +2a03:b600:161::4000:0,2a03:b600:161:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:162::,2a03:b600:162::3fff:ffff,US +2a03:b600:162::4000:0,2a03:b600:162:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:163::,2a03:b600:163::3fff:ffff,US +2a03:b600:163::4000:0,2a03:b600:163:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:164::,2a03:b600:164::3fff:ffff,US +2a03:b600:164::4000:0,2a03:b600:164:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:165::,2a03:b600:165::3fff:ffff,US +2a03:b600:165::4000:0,2a03:b600:165:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:166::,2a03:b600:166::3fff:ffff,US +2a03:b600:166::4000:0,2a03:b600:166:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:167::,2a03:b600:167::3fff:ffff,US +2a03:b600:167::4000:0,2a03:b600:167:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:168::,2a03:b600:168::3fff:ffff,US +2a03:b600:168::4000:0,2a03:b600:168:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:169::,2a03:b600:169::3fff:ffff,US +2a03:b600:169::4000:0,2a03:b600:16f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:170::,2a03:b600:170::3fff:ffff,CA +2a03:b600:170::4000:0,2a03:b600:170:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:171::,2a03:b600:171::3fff:ffff,CA +2a03:b600:171::4000:0,2a03:b600:171:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:172::,2a03:b600:172::3fff:ffff,CA +2a03:b600:172::4000:0,2a03:b600:172:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:173::,2a03:b600:173::3fff:ffff,CA +2a03:b600:173::4000:0,2a03:b600:173:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:174::,2a03:b600:174::3fff:ffff,CA +2a03:b600:174::4000:0,2a03:b600:174:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:175::,2a03:b600:175::3fff:ffff,CA +2a03:b600:175::4000:0,2a03:b600:175:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:176::,2a03:b600:176::3fff:ffff,CA +2a03:b600:176::4000:0,2a03:b600:176:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:177::,2a03:b600:177::3fff:ffff,CA +2a03:b600:177::4000:0,2a03:b600:177:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:178::,2a03:b600:178::3fff:ffff,CA +2a03:b600:178::4000:0,2a03:b600:178:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:179::,2a03:b600:179::3fff:ffff,CA +2a03:b600:179::4000:0,2a03:b600:17f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:180::,2a03:b600:180::3fff:ffff,IT +2a03:b600:180::4000:0,2a03:b600:180:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:181::,2a03:b600:181::3fff:ffff,IT +2a03:b600:181::4000:0,2a03:b600:181:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:182::,2a03:b600:182::3fff:ffff,IT +2a03:b600:182::4000:0,2a03:b600:182:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:183::,2a03:b600:183::3fff:ffff,IT +2a03:b600:183::4000:0,2a03:b600:183:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:184::,2a03:b600:184::3fff:ffff,IT +2a03:b600:184::4000:0,2a03:b600:184:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:185::,2a03:b600:185::3fff:ffff,IT +2a03:b600:185::4000:0,2a03:b600:185:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:186::,2a03:b600:186::3fff:ffff,IT +2a03:b600:186::4000:0,2a03:b600:186:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:187::,2a03:b600:187::3fff:ffff,IT +2a03:b600:187::4000:0,2a03:b600:187:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:188::,2a03:b600:188::3fff:ffff,IT +2a03:b600:188::4000:0,2a03:b600:188:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:189::,2a03:b600:189::3fff:ffff,IT +2a03:b600:189::4000:0,2a03:b600:18f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:190::,2a03:b600:190::3fff:ffff,AU +2a03:b600:190::4000:0,2a03:b600:190:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:191::,2a03:b600:191::3fff:ffff,AU +2a03:b600:191::4000:0,2a03:b600:191:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:192::,2a03:b600:192::3fff:ffff,AU +2a03:b600:192::4000:0,2a03:b600:192:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:193::,2a03:b600:193::3fff:ffff,AU +2a03:b600:193::4000:0,2a03:b600:193:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:194::,2a03:b600:194::3fff:ffff,AU +2a03:b600:194::4000:0,2a03:b600:194:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:195::,2a03:b600:195::3fff:ffff,AU +2a03:b600:195::4000:0,2a03:b600:195:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:196::,2a03:b600:196::3fff:ffff,AU +2a03:b600:196::4000:0,2a03:b600:196:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:197::,2a03:b600:197::3fff:ffff,AU +2a03:b600:197::4000:0,2a03:b600:197:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:198::,2a03:b600:198::3fff:ffff,AU +2a03:b600:198::4000:0,2a03:b600:198:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:199::,2a03:b600:199::3fff:ffff,AU +2a03:b600:199::4000:0,2a03:b600:1ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:200::,2a03:b600:200::3fff:ffff,BR +2a03:b600:200::4000:0,2a03:b600:200:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:201::,2a03:b600:201::3fff:ffff,BR +2a03:b600:201::4000:0,2a03:b600:201:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:202::,2a03:b600:202::3fff:ffff,BR +2a03:b600:202::4000:0,2a03:b600:202:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:203::,2a03:b600:203::3fff:ffff,BR +2a03:b600:203::4000:0,2a03:b600:203:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:204::,2a03:b600:204::3fff:ffff,BR +2a03:b600:204::4000:0,2a03:b600:204:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:205::,2a03:b600:205::3fff:ffff,BR +2a03:b600:205::4000:0,2a03:b600:205:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:206::,2a03:b600:206::3fff:ffff,BR +2a03:b600:206::4000:0,2a03:b600:206:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:207::,2a03:b600:207::3fff:ffff,BR +2a03:b600:207::4000:0,2a03:b600:207:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:208::,2a03:b600:208::3fff:ffff,BR +2a03:b600:208::4000:0,2a03:b600:208:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:209::,2a03:b600:209::3fff:ffff,BR +2a03:b600:209::4000:0,2a03:b600:20f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:210::,2a03:b600:210::3fff:ffff,CR +2a03:b600:210::4000:0,2a03:b600:210:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:211::,2a03:b600:211::3fff:ffff,CR +2a03:b600:211::4000:0,2a03:b600:211:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:212::,2a03:b600:212::3fff:ffff,CR +2a03:b600:212::4000:0,2a03:b600:212:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:213::,2a03:b600:213::3fff:ffff,CR +2a03:b600:213::4000:0,2a03:b600:213:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:214::,2a03:b600:214::3fff:ffff,CR +2a03:b600:214::4000:0,2a03:b600:214:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:215::,2a03:b600:215::3fff:ffff,CR +2a03:b600:215::4000:0,2a03:b600:215:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:216::,2a03:b600:216::3fff:ffff,CR +2a03:b600:216::4000:0,2a03:b600:216:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:217::,2a03:b600:217::3fff:ffff,CR +2a03:b600:217::4000:0,2a03:b600:217:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:218::,2a03:b600:218::3fff:ffff,CR +2a03:b600:218::4000:0,2a03:b600:218:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:219::,2a03:b600:219::3fff:ffff,CR +2a03:b600:219::4000:0,2a03:b600:21f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:220::,2a03:b600:220::3fff:ffff,DE +2a03:b600:220::4000:0,2a03:b600:220:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:221::,2a03:b600:221::3fff:ffff,DE +2a03:b600:221::4000:0,2a03:b600:221:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:222::,2a03:b600:222::3fff:ffff,DE +2a03:b600:222::4000:0,2a03:b600:222:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:223::,2a03:b600:223::3fff:ffff,DE +2a03:b600:223::4000:0,2a03:b600:223:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:224::,2a03:b600:224::3fff:ffff,DE +2a03:b600:224::4000:0,2a03:b600:224:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:225::,2a03:b600:225::3fff:ffff,DE +2a03:b600:225::4000:0,2a03:b600:225:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:226::,2a03:b600:226::3fff:ffff,DE +2a03:b600:226::4000:0,2a03:b600:226:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:227::,2a03:b600:227::3fff:ffff,DE +2a03:b600:227::4000:0,2a03:b600:227:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:228::,2a03:b600:228::3fff:ffff,DE +2a03:b600:228::4000:0,2a03:b600:228:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:229::,2a03:b600:229::3fff:ffff,DE +2a03:b600:229::4000:0,2a03:b600:23f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:240::,2a03:b600:240::3fff:ffff,MX +2a03:b600:240::4000:0,2a03:b600:240:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:241::,2a03:b600:241::3fff:ffff,MX +2a03:b600:241::4000:0,2a03:b600:241:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:242::,2a03:b600:242::3fff:ffff,MX +2a03:b600:242::4000:0,2a03:b600:242:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:243::,2a03:b600:243::3fff:ffff,MX +2a03:b600:243::4000:0,2a03:b600:243:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:244::,2a03:b600:244::3fff:ffff,MX +2a03:b600:244::4000:0,2a03:b600:244:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:245::,2a03:b600:245::3fff:ffff,MX +2a03:b600:245::4000:0,2a03:b600:245:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:246::,2a03:b600:246::3fff:ffff,MX +2a03:b600:246::4000:0,2a03:b600:246:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:247::,2a03:b600:247::3fff:ffff,MX +2a03:b600:247::4000:0,2a03:b600:247:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:248::,2a03:b600:248::3fff:ffff,MX +2a03:b600:248::4000:0,2a03:b600:248:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:249::,2a03:b600:249::3fff:ffff,MX +2a03:b600:249::4000:0,2a03:b600:24f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:250::,2a03:b600:250::3fff:ffff,FR +2a03:b600:250::4000:0,2a03:b600:250:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:251::,2a03:b600:251::3fff:ffff,FR +2a03:b600:251::4000:0,2a03:b600:251:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:252::,2a03:b600:252::3fff:ffff,FR +2a03:b600:252::4000:0,2a03:b600:252:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:253::,2a03:b600:253::3fff:ffff,FR +2a03:b600:253::4000:0,2a03:b600:253:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:254::,2a03:b600:254::3fff:ffff,FR +2a03:b600:254::4000:0,2a03:b600:254:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:255::,2a03:b600:255::3fff:ffff,FR +2a03:b600:255::4000:0,2a03:b600:255:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:256::,2a03:b600:256::3fff:ffff,FR +2a03:b600:256::4000:0,2a03:b600:256:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:257::,2a03:b600:257::3fff:ffff,FR +2a03:b600:257::4000:0,2a03:b600:257:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:258::,2a03:b600:258::3fff:ffff,FR +2a03:b600:258::4000:0,2a03:b600:258:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:259::,2a03:b600:259::3fff:ffff,FR +2a03:b600:259::4000:0,2a03:b600:25f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:260::,2a03:b600:260::3fff:ffff,BS +2a03:b600:260::4000:0,2a03:b600:260:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:261::,2a03:b600:261::3fff:ffff,BS +2a03:b600:261::4000:0,2a03:b600:261:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:262::,2a03:b600:262::3fff:ffff,BS +2a03:b600:262::4000:0,2a03:b600:262:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:263::,2a03:b600:263::3fff:ffff,BS +2a03:b600:263::4000:0,2a03:b600:263:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:264::,2a03:b600:264::3fff:ffff,BS +2a03:b600:264::4000:0,2a03:b600:264:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:265::,2a03:b600:265::3fff:ffff,BS +2a03:b600:265::4000:0,2a03:b600:265:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:266::,2a03:b600:266::3fff:ffff,BS +2a03:b600:266::4000:0,2a03:b600:266:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:267::,2a03:b600:267::3fff:ffff,BS +2a03:b600:267::4000:0,2a03:b600:267:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:268::,2a03:b600:268::3fff:ffff,BS +2a03:b600:268::4000:0,2a03:b600:268:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:269::,2a03:b600:269::3fff:ffff,BS +2a03:b600:269::4000:0,2a03:b600:26f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:270::,2a03:b600:270::3fff:ffff,BS +2a03:b600:270::4000:0,2a03:b600:270:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:271::,2a03:b600:271::3fff:ffff,BS +2a03:b600:271::4000:0,2a03:b600:271:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:272::,2a03:b600:272::3fff:ffff,BS +2a03:b600:272::4000:0,2a03:b600:272:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:273::,2a03:b600:273::3fff:ffff,BS +2a03:b600:273::4000:0,2a03:b600:273:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:274::,2a03:b600:274::3fff:ffff,BS +2a03:b600:274::4000:0,2a03:b600:274:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:275::,2a03:b600:275::3fff:ffff,JM +2a03:b600:275::4000:0,2a03:b600:275:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:276::,2a03:b600:276::3fff:ffff,JM +2a03:b600:276::4000:0,2a03:b600:276:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:277::,2a03:b600:277::3fff:ffff,JM +2a03:b600:277::4000:0,2a03:b600:277:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:278::,2a03:b600:278::3fff:ffff,JM +2a03:b600:278::4000:0,2a03:b600:278:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:279::,2a03:b600:279::3fff:ffff,JM +2a03:b600:279::4000:0,2a03:b600:27f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:280::,2a03:b600:280::3fff:ffff,CO +2a03:b600:280::4000:0,2a03:b600:280:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:281::,2a03:b600:281::3fff:ffff,CO +2a03:b600:281::4000:0,2a03:b600:281:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:282::,2a03:b600:282::3fff:ffff,CO +2a03:b600:282::4000:0,2a03:b600:282:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:283::,2a03:b600:283::3fff:ffff,CO +2a03:b600:283::4000:0,2a03:b600:283:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:284::,2a03:b600:284::3fff:ffff,CO +2a03:b600:284::4000:0,2a03:b600:284:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:285::,2a03:b600:285::3fff:ffff,NL +2a03:b600:285::4000:0,2a03:b600:285:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:286::,2a03:b600:286::3fff:ffff,NL +2a03:b600:286::4000:0,2a03:b600:286:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:287::,2a03:b600:287::3fff:ffff,NL +2a03:b600:287::4000:0,2a03:b600:287:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:288::,2a03:b600:288::3fff:ffff,NL +2a03:b600:288::4000:0,2a03:b600:288:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:289::,2a03:b600:289::3fff:ffff,NL +2a03:b600:289::4000:0,2a03:b600:28f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:290::,2a03:b600:290::3fff:ffff,CZ +2a03:b600:290::4000:0,2a03:b600:290:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:291::,2a03:b600:291::3fff:ffff,CZ +2a03:b600:291::4000:0,2a03:b600:291:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:292::,2a03:b600:292::3fff:ffff,CZ +2a03:b600:292::4000:0,2a03:b600:292:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:293::,2a03:b600:293::3fff:ffff,CZ +2a03:b600:293::4000:0,2a03:b600:293:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:294::,2a03:b600:294::3fff:ffff,CZ +2a03:b600:294::4000:0,2a03:b600:294:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:295::,2a03:b600:295::3fff:ffff,CU +2a03:b600:295::4000:0,2a03:b600:295:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:296::,2a03:b600:296::3fff:ffff,CU +2a03:b600:296::4000:0,2a03:b600:296:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:297::,2a03:b600:297::3fff:ffff,CU +2a03:b600:297::4000:0,2a03:b600:297:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:298::,2a03:b600:298::3fff:ffff,CU +2a03:b600:298::4000:0,2a03:b600:298:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:299::,2a03:b600:299::3fff:ffff,CU +2a03:b600:299::4000:0,2a03:b600:2ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:300::,2a03:b600:300::3fff:ffff,PR +2a03:b600:300::4000:0,2a03:b600:300:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:301::,2a03:b600:301::3fff:ffff,PR +2a03:b600:301::4000:0,2a03:b600:301:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:302::,2a03:b600:302::3fff:ffff,PR +2a03:b600:302::4000:0,2a03:b600:302:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:303::,2a03:b600:303::3fff:ffff,PR +2a03:b600:303::4000:0,2a03:b600:303:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:304::,2a03:b600:304::3fff:ffff,PR +2a03:b600:304::4000:0,2a03:b600:304:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:305::,2a03:b600:305::3fff:ffff,RU +2a03:b600:305::4000:0,2a03:b600:305:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:306::,2a03:b600:306::3fff:ffff,RU +2a03:b600:306::4000:0,2a03:b600:306:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:307::,2a03:b600:307::3fff:ffff,RU +2a03:b600:307::4000:0,2a03:b600:307:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:308::,2a03:b600:308::3fff:ffff,RU +2a03:b600:308::4000:0,2a03:b600:308:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:309::,2a03:b600:309::3fff:ffff,RU +2a03:b600:309::4000:0,2a03:b600:30f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:310::,2a03:b600:310::3fff:ffff,CN +2a03:b600:310::4000:0,2a03:b600:310:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:311::,2a03:b600:311::3fff:ffff,CN +2a03:b600:311::4000:0,2a03:b600:311:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:312::,2a03:b600:312::3fff:ffff,CN +2a03:b600:312::4000:0,2a03:b600:312:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:313::,2a03:b600:313::3fff:ffff,CN +2a03:b600:313::4000:0,2a03:b600:313:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:314::,2a03:b600:314::3fff:ffff,CN +2a03:b600:314::4000:0,2a03:b600:314:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:315::,2a03:b600:315::3fff:ffff,JP +2a03:b600:315::4000:0,2a03:b600:315:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:316::,2a03:b600:316::3fff:ffff,JP +2a03:b600:316::4000:0,2a03:b600:316:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:317::,2a03:b600:317::3fff:ffff,JP +2a03:b600:317::4000:0,2a03:b600:317:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:318::,2a03:b600:318::3fff:ffff,JP +2a03:b600:318::4000:0,2a03:b600:318:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:319::,2a03:b600:319::3fff:ffff,JP +2a03:b600:319::4000:0,2a03:b600:31f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:320::,2a03:b600:320::3fff:ffff,MT +2a03:b600:320::4000:0,2a03:b600:320:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:321::,2a03:b600:321::3fff:ffff,MT +2a03:b600:321::4000:0,2a03:b600:321:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:322::,2a03:b600:322::3fff:ffff,MT +2a03:b600:322::4000:0,2a03:b600:322:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:323::,2a03:b600:323::3fff:ffff,MT +2a03:b600:323::4000:0,2a03:b600:323:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:324::,2a03:b600:324::3fff:ffff,MT +2a03:b600:324::4000:0,2a03:b600:324:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:325::,2a03:b600:325::3fff:ffff,CY +2a03:b600:325::4000:0,2a03:b600:325:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:326::,2a03:b600:326::3fff:ffff,CY +2a03:b600:326::4000:0,2a03:b600:326:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:327::,2a03:b600:327::3fff:ffff,CY +2a03:b600:327::4000:0,2a03:b600:327:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:328::,2a03:b600:328::3fff:ffff,CY +2a03:b600:328::4000:0,2a03:b600:328:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:329::,2a03:b600:329::3fff:ffff,CY +2a03:b600:329::4000:0,2a03:b600:32f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:330::,2a03:b600:330::3fff:ffff,PT +2a03:b600:330::4000:0,2a03:b600:330:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:331::,2a03:b600:331::3fff:ffff,PT +2a03:b600:331::4000:0,2a03:b600:331:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:332::,2a03:b600:332::3fff:ffff,PT +2a03:b600:332::4000:0,2a03:b600:332:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:333::,2a03:b600:333::3fff:ffff,PT +2a03:b600:333::4000:0,2a03:b600:333:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:334::,2a03:b600:334::3fff:ffff,PT +2a03:b600:334::4000:0,2a03:b600:33f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:340::,2a03:b600:340::3fff:ffff,NO +2a03:b600:340::4000:0,2a03:b600:340:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:341::,2a03:b600:341::3fff:ffff,NO +2a03:b600:341::4000:0,2a03:b600:341:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:342::,2a03:b600:342::3fff:ffff,NO +2a03:b600:342::4000:0,2a03:b600:342:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:343::,2a03:b600:343::3fff:ffff,NO +2a03:b600:343::4000:0,2a03:b600:343:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:344::,2a03:b600:344::3fff:ffff,NO +2a03:b600:344::4000:0,2a03:b600:344:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:345::,2a03:b600:345::3fff:ffff,SE +2a03:b600:345::4000:0,2a03:b600:345:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:346::,2a03:b600:346::3fff:ffff,SE +2a03:b600:346::4000:0,2a03:b600:346:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:347::,2a03:b600:347::3fff:ffff,SE +2a03:b600:347::4000:0,2a03:b600:347:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:348::,2a03:b600:348::3fff:ffff,SE +2a03:b600:348::4000:0,2a03:b600:348:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:349::,2a03:b600:349::3fff:ffff,SE +2a03:b600:349::4000:0,2a03:b600:34f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:350::,2a03:b600:350::3fff:ffff,FI +2a03:b600:350::4000:0,2a03:b600:350:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:351::,2a03:b600:351::3fff:ffff,FI +2a03:b600:351::4000:0,2a03:b600:351:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:352::,2a03:b600:352::3fff:ffff,FI +2a03:b600:352::4000:0,2a03:b600:352:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:353::,2a03:b600:353::3fff:ffff,FI +2a03:b600:353::4000:0,2a03:b600:353:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:354::,2a03:b600:354::3fff:ffff,FI +2a03:b600:354::4000:0,2a03:b600:354:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:355::,2a03:b600:355::3fff:ffff,AT +2a03:b600:355::4000:0,2a03:b600:355:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:356::,2a03:b600:356::3fff:ffff,AT +2a03:b600:356::4000:0,2a03:b600:356:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:357::,2a03:b600:357::3fff:ffff,AT +2a03:b600:357::4000:0,2a03:b600:357:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:358::,2a03:b600:358::3fff:ffff,AT +2a03:b600:358::4000:0,2a03:b600:358:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:359::,2a03:b600:359::3fff:ffff,AT +2a03:b600:359::4000:0,2a03:b600:35f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:360::,2a03:b600:360::3fff:ffff,PL +2a03:b600:360::4000:0,2a03:b600:360:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:361::,2a03:b600:361::3fff:ffff,PL +2a03:b600:361::4000:0,2a03:b600:361:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:362::,2a03:b600:362::3fff:ffff,PL +2a03:b600:362::4000:0,2a03:b600:362:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:363::,2a03:b600:363::3fff:ffff,PL +2a03:b600:363::4000:0,2a03:b600:363:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:364::,2a03:b600:364::3fff:ffff,PL +2a03:b600:364::4000:0,2a03:b600:364:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:365::,2a03:b600:365::3fff:ffff,BY +2a03:b600:365::4000:0,2a03:b600:365:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:366::,2a03:b600:366::3fff:ffff,BY +2a03:b600:366::4000:0,2a03:b600:366:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:367::,2a03:b600:367::3fff:ffff,BY +2a03:b600:367::4000:0,2a03:b600:367:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:368::,2a03:b600:368::3fff:ffff,BY +2a03:b600:368::4000:0,2a03:b600:368:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:369::,2a03:b600:369::3fff:ffff,BY +2a03:b600:369::4000:0,2a03:b600:53f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:540::,2a03:b600:540::3fff:ffff,US +2a03:b600:540::4000:0,2a03:b600:540:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:541::,2a03:b600:541::3fff:ffff,US +2a03:b600:541::4000:0,2a03:b600:541:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:542::,2a03:b600:542::3fff:ffff,US +2a03:b600:542::4000:0,2a03:b600:542:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:543::,2a03:b600:543::3fff:ffff,US +2a03:b600:543::4000:0,2a03:b600:543:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:544::,2a03:b600:544::3fff:ffff,US +2a03:b600:544::4000:0,2a03:b600:544:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:545::,2a03:b600:545::3fff:ffff,US +2a03:b600:545::4000:0,2a03:b600:545:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:546::,2a03:b600:546::3fff:ffff,US +2a03:b600:546::4000:0,2a03:b600:546:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:547::,2a03:b600:547::3fff:ffff,US +2a03:b600:547::4000:0,2a03:b600:547:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:548::,2a03:b600:548::3fff:ffff,US +2a03:b600:548::4000:0,2a03:b600:548:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:549::,2a03:b600:549::3fff:ffff,US +2a03:b600:549::4000:0,2a03:b600:54f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:550::,2a03:b600:550::3fff:ffff,US +2a03:b600:550::4000:0,2a03:b600:550:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:551::,2a03:b600:551::3fff:ffff,US +2a03:b600:551::4000:0,2a03:b600:551:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:552::,2a03:b600:552::3fff:ffff,US +2a03:b600:552::4000:0,2a03:b600:552:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:553::,2a03:b600:553::3fff:ffff,US +2a03:b600:553::4000:0,2a03:b600:553:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:554::,2a03:b600:554::3fff:ffff,US +2a03:b600:554::4000:0,2a03:b600:554:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:555::,2a03:b600:555::3fff:ffff,US +2a03:b600:555::4000:0,2a03:b600:555:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:556::,2a03:b600:556::3fff:ffff,US +2a03:b600:556::4000:0,2a03:b600:556:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:557::,2a03:b600:557::3fff:ffff,US +2a03:b600:557::4000:0,2a03:b600:557:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:558::,2a03:b600:558::3fff:ffff,US +2a03:b600:558::4000:0,2a03:b600:558:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:559::,2a03:b600:559::3fff:ffff,US +2a03:b600:559::4000:0,2a03:b600:55f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:560::,2a03:b600:560::3fff:ffff,US +2a03:b600:560::4000:0,2a03:b600:560:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:561::,2a03:b600:561::3fff:ffff,US +2a03:b600:561::4000:0,2a03:b600:561:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:562::,2a03:b600:562::3fff:ffff,US +2a03:b600:562::4000:0,2a03:b600:562:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:563::,2a03:b600:563::3fff:ffff,US +2a03:b600:563::4000:0,2a03:b600:563:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:564::,2a03:b600:564::3fff:ffff,US +2a03:b600:564::4000:0,2a03:b600:564:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:565::,2a03:b600:565::3fff:ffff,US +2a03:b600:565::4000:0,2a03:b600:565:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:566::,2a03:b600:566::3fff:ffff,US +2a03:b600:566::4000:0,2a03:b600:566:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:567::,2a03:b600:567::3fff:ffff,US +2a03:b600:567::4000:0,2a03:b600:567:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:568::,2a03:b600:568::3fff:ffff,US +2a03:b600:568::4000:0,2a03:b600:568:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:569::,2a03:b600:569::3fff:ffff,US +2a03:b600:569::4000:0,2a03:b600:56f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:570::,2a03:b600:570::3fff:ffff,US +2a03:b600:570::4000:0,2a03:b600:570:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:571::,2a03:b600:571::3fff:ffff,US +2a03:b600:571::4000:0,2a03:b600:571:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:572::,2a03:b600:572::3fff:ffff,US +2a03:b600:572::4000:0,2a03:b600:572:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:573::,2a03:b600:573::3fff:ffff,US +2a03:b600:573::4000:0,2a03:b600:573:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:574::,2a03:b600:574::3fff:ffff,US +2a03:b600:574::4000:0,2a03:b600:574:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:575::,2a03:b600:575::3fff:ffff,US +2a03:b600:575::4000:0,2a03:b600:575:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:576::,2a03:b600:576::3fff:ffff,US +2a03:b600:576::4000:0,2a03:b600:576:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:577::,2a03:b600:577::3fff:ffff,US +2a03:b600:577::4000:0,2a03:b600:577:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:578::,2a03:b600:578::3fff:ffff,US +2a03:b600:578::4000:0,2a03:b600:578:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:579::,2a03:b600:579::3fff:ffff,US +2a03:b600:579::4000:0,2a03:b600:57f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:580::,2a03:b600:580::3fff:ffff,US +2a03:b600:580::4000:0,2a03:b600:580:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:581::,2a03:b600:581::3fff:ffff,US +2a03:b600:581::4000:0,2a03:b600:581:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:582::,2a03:b600:582::3fff:ffff,US +2a03:b600:582::4000:0,2a03:b600:582:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:583::,2a03:b600:583::3fff:ffff,US +2a03:b600:583::4000:0,2a03:b600:583:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:584::,2a03:b600:584::3fff:ffff,US +2a03:b600:584::4000:0,2a03:b600:584:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:585::,2a03:b600:585::3fff:ffff,US +2a03:b600:585::4000:0,2a03:b600:585:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:586::,2a03:b600:586::3fff:ffff,US +2a03:b600:586::4000:0,2a03:b600:586:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:587::,2a03:b600:587::3fff:ffff,US +2a03:b600:587::4000:0,2a03:b600:587:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:588::,2a03:b600:588::3fff:ffff,US +2a03:b600:588::4000:0,2a03:b600:588:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:589::,2a03:b600:589::3fff:ffff,US +2a03:b600:589::4000:0,2a03:b600:58f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:590::,2a03:b600:590::3fff:ffff,US +2a03:b600:590::4000:0,2a03:b600:590:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:591::,2a03:b600:591::3fff:ffff,US +2a03:b600:591::4000:0,2a03:b600:591:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:592::,2a03:b600:592::3fff:ffff,US +2a03:b600:592::4000:0,2a03:b600:592:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:593::,2a03:b600:593::3fff:ffff,US +2a03:b600:593::4000:0,2a03:b600:593:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:594::,2a03:b600:594::3fff:ffff,US +2a03:b600:594::4000:0,2a03:b600:594:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:595::,2a03:b600:595::3fff:ffff,US +2a03:b600:595::4000:0,2a03:b600:595:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:596::,2a03:b600:596::3fff:ffff,US +2a03:b600:596::4000:0,2a03:b600:596:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:597::,2a03:b600:597::3fff:ffff,US +2a03:b600:597::4000:0,2a03:b600:597:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:598::,2a03:b600:598::3fff:ffff,US +2a03:b600:598::4000:0,2a03:b600:598:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:599::,2a03:b600:599::3fff:ffff,US +2a03:b600:599::4000:0,2a03:b600:5ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:600::,2a03:b600:600::3fff:ffff,US +2a03:b600:600::4000:0,2a03:b600:600:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:601::,2a03:b600:601::3fff:ffff,US +2a03:b600:601::4000:0,2a03:b600:601:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:602::,2a03:b600:602::3fff:ffff,US +2a03:b600:602::4000:0,2a03:b600:602:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:603::,2a03:b600:603::3fff:ffff,US +2a03:b600:603::4000:0,2a03:b600:603:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:604::,2a03:b600:604::3fff:ffff,US +2a03:b600:604::4000:0,2a03:b600:604:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:605::,2a03:b600:605::3fff:ffff,US +2a03:b600:605::4000:0,2a03:b600:605:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:606::,2a03:b600:606::3fff:ffff,US +2a03:b600:606::4000:0,2a03:b600:606:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:607::,2a03:b600:607::3fff:ffff,US +2a03:b600:607::4000:0,2a03:b600:607:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:608::,2a03:b600:608::3fff:ffff,US +2a03:b600:608::4000:0,2a03:b600:608:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:609::,2a03:b600:609::3fff:ffff,US +2a03:b600:609::4000:0,2a03:b600:60f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:610::,2a03:b600:610::3fff:ffff,US +2a03:b600:610::4000:0,2a03:b600:610:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:611::,2a03:b600:611::3fff:ffff,US +2a03:b600:611::4000:0,2a03:b600:611:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:612::,2a03:b600:612::3fff:ffff,US +2a03:b600:612::4000:0,2a03:b600:612:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:613::,2a03:b600:613::3fff:ffff,US +2a03:b600:613::4000:0,2a03:b600:613:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:614::,2a03:b600:614::3fff:ffff,US +2a03:b600:614::4000:0,2a03:b600:614:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:615::,2a03:b600:615::3fff:ffff,US +2a03:b600:615::4000:0,2a03:b600:615:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:616::,2a03:b600:616::3fff:ffff,US +2a03:b600:616::4000:0,2a03:b600:616:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:617::,2a03:b600:617::3fff:ffff,US +2a03:b600:617::4000:0,2a03:b600:617:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:618::,2a03:b600:618::3fff:ffff,US +2a03:b600:618::4000:0,2a03:b600:618:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:619::,2a03:b600:619::3fff:ffff,US +2a03:b600:619::4000:0,2a03:b600:61f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:620::,2a03:b600:620::3fff:ffff,US +2a03:b600:620::4000:0,2a03:b600:620:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:621::,2a03:b600:621::3fff:ffff,US +2a03:b600:621::4000:0,2a03:b600:621:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:622::,2a03:b600:622::3fff:ffff,US +2a03:b600:622::4000:0,2a03:b600:622:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:623::,2a03:b600:623::3fff:ffff,US +2a03:b600:623::4000:0,2a03:b600:623:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:624::,2a03:b600:624::3fff:ffff,US +2a03:b600:624::4000:0,2a03:b600:624:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:625::,2a03:b600:625::3fff:ffff,US +2a03:b600:625::4000:0,2a03:b600:625:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:626::,2a03:b600:626::3fff:ffff,US +2a03:b600:626::4000:0,2a03:b600:626:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:627::,2a03:b600:627::3fff:ffff,US +2a03:b600:627::4000:0,2a03:b600:627:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:628::,2a03:b600:628::3fff:ffff,US +2a03:b600:628::4000:0,2a03:b600:628:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:629::,2a03:b600:629::3fff:ffff,US +2a03:b600:629::4000:0,2a03:b600:62f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:630::,2a03:b600:630::3fff:ffff,US +2a03:b600:630::4000:0,2a03:b600:630:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:631::,2a03:b600:631::3fff:ffff,US +2a03:b600:631::4000:0,2a03:b600:631:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:632::,2a03:b600:632::3fff:ffff,US +2a03:b600:632::4000:0,2a03:b600:632:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:633::,2a03:b600:633::3fff:ffff,US +2a03:b600:633::4000:0,2a03:b600:633:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:634::,2a03:b600:634::3fff:ffff,US +2a03:b600:634::4000:0,2a03:b600:63f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:640::,2a03:b600:640::3fff:ffff,US +2a03:b600:640::4000:0,2a03:b600:640:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:641::,2a03:b600:641::3fff:ffff,US +2a03:b600:641::4000:0,2a03:b600:641:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:642::,2a03:b600:642::3fff:ffff,US +2a03:b600:642::4000:0,2a03:b600:642:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:643::,2a03:b600:643::3fff:ffff,US +2a03:b600:643::4000:0,2a03:b600:643:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:644::,2a03:b600:644::3fff:ffff,US +2a03:b600:644::4000:0,2a03:b600:644:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:645::,2a03:b600:645::3fff:ffff,US +2a03:b600:645::4000:0,2a03:b600:646:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:647::,2a03:b600:647::3fff:ffff,US +2a03:b600:647::4000:0,2a03:b600:647:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:648::,2a03:b600:648::3fff:ffff,US +2a03:b600:648::4000:0,2a03:b600:648:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:649::,2a03:b600:649::3fff:ffff,US +2a03:b600:649::4000:0,2a03:b600:650:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:651::,2a03:b600:651::3fff:ffff,US +2a03:b600:651::4000:0,2a03:b600:651:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:652::,2a03:b600:652::3fff:ffff,US +2a03:b600:652::4000:0,2a03:b600:652:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:653::,2a03:b600:653::3fff:ffff,US +2a03:b600:653::4000:0,2a03:b600:653:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:654::,2a03:b600:654::3fff:ffff,US +2a03:b600:654::4000:0,2a03:b600:654:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:655::,2a03:b600:655::3fff:ffff,US +2a03:b600:655::4000:0,2a03:b600:655:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:656::,2a03:b600:656::3fff:ffff,US +2a03:b600:656::4000:0,2a03:b600:656:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:657::,2a03:b600:657::3fff:ffff,US +2a03:b600:657::4000:0,2a03:b600:657:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:658::,2a03:b600:658::3fff:ffff,US +2a03:b600:658::4000:0,2a03:b600:658:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:659::,2a03:b600:659::3fff:ffff,US +2a03:b600:659::4000:0,2a03:b600:65f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:660::,2a03:b600:660::3fff:ffff,CA +2a03:b600:660::4000:0,2a03:b600:660:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:661::,2a03:b600:661::3fff:ffff,CA +2a03:b600:661::4000:0,2a03:b600:661:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:662::,2a03:b600:662::3fff:ffff,CA +2a03:b600:662::4000:0,2a03:b600:662:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:663::,2a03:b600:663::3fff:ffff,CA +2a03:b600:663::4000:0,2a03:b600:663:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:664::,2a03:b600:664::3fff:ffff,CA +2a03:b600:664::4000:0,2a03:b600:664:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:665::,2a03:b600:665::3fff:ffff,CA +2a03:b600:665::4000:0,2a03:b600:665:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:666::,2a03:b600:666::3fff:ffff,CA +2a03:b600:666::4000:0,2a03:b600:666:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:667::,2a03:b600:667::3fff:ffff,CA +2a03:b600:667::4000:0,2a03:b600:667:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:668::,2a03:b600:668::3fff:ffff,CA +2a03:b600:668::4000:0,2a03:b600:668:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:669::,2a03:b600:669::3fff:ffff,CA +2a03:b600:669::4000:0,2a03:b600:66f:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:670::,2a03:b600:670::3fff:ffff,IT +2a03:b600:670::4000:0,2a03:b600:670:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:671::,2a03:b600:671::3fff:ffff,IT +2a03:b600:671::4000:0,2a03:b600:671:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:672::,2a03:b600:672::3fff:ffff,IT +2a03:b600:672::4000:0,2a03:b600:672:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:673::,2a03:b600:673::3fff:ffff,IT +2a03:b600:673::4000:0,2a03:b600:673:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:674::,2a03:b600:674::3fff:ffff,IT +2a03:b600:674::4000:0,2a03:b600:674:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:675::,2a03:b600:675::3fff:ffff,IN +2a03:b600:675::4000:0,2a03:b600:675:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:676::,2a03:b600:676::3fff:ffff,IN +2a03:b600:676::4000:0,2a03:b600:676:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:677::,2a03:b600:677::3fff:ffff,IN +2a03:b600:677::4000:0,2a03:b600:677:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:678::,2a03:b600:678::3fff:ffff,IN +2a03:b600:678::4000:0,2a03:b600:678:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:679::,2a03:b600:679::3fff:ffff,IN +2a03:b600:679::4000:0,2a03:b600:9fff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:a000::,2a03:b600:a000::3fff:ffff,US +2a03:b600:a000::4000:0,2a03:b600:a9ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:aa00::,2a03:b600:aa00::3fff:ffff,US +2a03:b600:aa00::4000:0,2a03:b600:aaff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ab00::,2a03:b600:ab00::3fff:ffff,US +2a03:b600:ab00::4000:0,2a03:b600:abff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ac00::,2a03:b600:ac00::3fff:ffff,US +2a03:b600:ac00::4000:0,2a03:b600:acff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ad00::,2a03:b600:ad00::3fff:ffff,US +2a03:b600:ad00::4000:0,2a03:b600:adff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ae00::,2a03:b600:ae00::3fff:ffff,US +2a03:b600:ae00::4000:0,2a03:b600:aeff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:af00::,2a03:b600:af00::3fff:ffff,US +2a03:b600:af00::4000:0,2a03:b600:b9ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ba00::,2a03:b600:ba00::3fff:ffff,US +2a03:b600:ba00::4000:0,2a03:b600:baff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:bb00::,2a03:b600:bb00::3fff:ffff,US +2a03:b600:bb00::4000:0,2a03:b600:bcff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:bd00::,2a03:b600:bd00::3fff:ffff,US +2a03:b600:bd00::4000:0,2a03:b600:bdff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:be00::,2a03:b600:be00::3fff:ffff,US +2a03:b600:be00::4000:0,2a03:b600:beff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:bf00::,2a03:b600:bf00::3fff:ffff,US +2a03:b600:bf00::4000:0,2a03:b600:c9ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ca00::,2a03:b600:ca00::3fff:ffff,US +2a03:b600:ca00::4000:0,2a03:b600:caff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:cb00::,2a03:b600:cb00::3fff:ffff,US +2a03:b600:cb00::4000:0,2a03:b600:cbff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:cc00::,2a03:b600:cc00::3fff:ffff,US +2a03:b600:cc00::4000:0,2a03:b600:ccff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:cd00::,2a03:b600:cd00::3fff:ffff,US +2a03:b600:cd00::4000:0,2a03:b600:cdff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ce00::,2a03:b600:ce00::3fff:ffff,US +2a03:b600:ce00::4000:0,2a03:b600:ceff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:cf00::,2a03:b600:cf00::3fff:ffff,US +2a03:b600:cf00::4000:0,2a03:b600:d9ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:da00::,2a03:b600:da00::3fff:ffff,US +2a03:b600:da00::4000:0,2a03:b600:daff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:db00::,2a03:b600:db00::3fff:ffff,US +2a03:b600:db00::4000:0,2a03:b600:dbff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:dc00::,2a03:b600:dc00::3fff:ffff,US +2a03:b600:dc00::4000:0,2a03:b600:dcff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:dd00::,2a03:b600:dd00::3fff:ffff,US +2a03:b600:dd00::4000:0,2a03:b600:ddff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:de00::,2a03:b600:de00::3fff:ffff,US +2a03:b600:de00::4000:0,2a03:b600:deff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:df00::,2a03:b600:df00::3fff:ffff,US +2a03:b600:df00::4000:0,2a03:b600:e9ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ea00::,2a03:b600:ea00::3fff:ffff,US +2a03:b600:ea00::4000:0,2a03:b600:eaff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:eb00::,2a03:b600:eb00::3fff:ffff,US +2a03:b600:eb00::4000:0,2a03:b600:ebff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ec00::,2a03:b600:ec00::3fff:ffff,US +2a03:b600:ec00::4000:0,2a03:b600:ecff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ed00::,2a03:b600:ed00::3fff:ffff,US +2a03:b600:ed00::4000:0,2a03:b600:edff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ee00::,2a03:b600:ee00::3fff:ffff,US +2a03:b600:ee00::4000:0,2a03:b600:eeff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600:ef00::,2a03:b600:ef00::3fff:ffff,US +2a03:b600:ef00::4000:0,2a03:b607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b640::,2a03:b640:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a03:b680::,2a03:b680:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:b6c0::,2a03:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:b700::,2a03:b700:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:b740::,2a03:b740:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:b780::,2a03:b780:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:b7c0::,2a03:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:b800::,2a03:b800:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b840::,2a03:b840:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:b880::,2a03:b887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:b8c0::,2a03:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a03:b900::,2a03:b900:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:b940::,2a03:b940:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:b980::,2a03:b980:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b9c0::,2a03:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:ba00::,2a03:ba07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:ba40::,2a03:ba40:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a03:ba80::,2a03:ba80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:bac0::,2a03:bac0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:bb00::,2a03:bb07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:bb40::,2a03:bb40:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a03:bb80::,2a03:bb80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:bbc0::,2a03:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:bc00::,2a03:bc00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:bc40::,2a03:bc47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:bc80::,2a03:bc80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:bcc0::,2a03:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a03:bd00::,2a03:bd00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:bd40::,2a03:bd47:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a03:bd80::,2a03:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:bdc0::,2a03:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:be00::,2a03:be00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:be40::,2a03:be40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:be80::,2a03:be80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:bec0::,2a03:bec0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:bf00::,2a03:bf00:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:bf40::,2a03:bf40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:bf80::,2a03:bf80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:bfc0::,2a03:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:c000::,2a03:c007:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:c040::,2a03:c040:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:c080::,2a03:c080:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a03:c0c0::,2a03:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:c100::,2a03:c100:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:c140::,2a03:c140:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a03:c180::,2a03:c180:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:c1c0::,2a03:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:c200::,2a03:c207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:c240::,2a03:c240:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a03:c280::,2a03:c280:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:c2c0::,2a03:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:c300::,2a03:c300:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:c340::,2a03:c340:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a03:c380::,2a03:c380:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:c3c0::,2a03:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:c400::,2a03:c400:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:c440::,2a03:c440:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:c480::,2a03:c480:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:c4c0::,2a03:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:c500::,2a03:c500:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:c540::,2a03:c540:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:c580::,2a03:c580:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:c5c0::,2a03:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a03:c600::,2a03:c600:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:c640::,2a03:c640:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:c680::,2a03:c687:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:c6c0::,2a03:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:c700::,2a03:c700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:c740::,2a03:c740:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a03:c780::,2a03:c780:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:c7c0::,2a03:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:c800::,2a03:c800:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a03:c840::,2a03:c840:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a03:c880::,2a03:c880:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:c900::,2a03:c900:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:c940::,2a03:c940:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:c980::,2a03:c980:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:c9c0::,2a03:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:ca00::,2a03:ca00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:ca40::,2a03:ca40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:ca80::,2a03:ca87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:cac0::,2a03:cac0:f022:ffff:ffff:ffff:ffff:ffff,IL +2a03:cac0:f023::,2a03:cac0:f023:7fff:ffff:ffff:ffff:ffff,UA +2a03:cac0:f023:8000::,2a03:cac0:f061:ffff:ffff:ffff:ffff:ffff,IL +2a03:cac0:f062::,2a03:cac0:f062:7fff:ffff:ffff:ffff:ffff,UA +2a03:cac0:f062:8000::,2a03:cac0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a03:cb00::,2a03:cb00:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a03:cb40::,2a03:cb40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:cb80::,2a03:cb87:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a03:cbc0::,2a03:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:cc00::,2a03:cc00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:cc40::,2a03:cc40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:cc80::,2a03:cc87:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a03:ccc0::,2a03:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:cd00::,2a03:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2a03:cd40::,2a03:cd40:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:cd80::,2a03:cd80:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:cdc0::,2a03:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:ce00::,2a03:ce00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:ce40::,2a03:ce47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:ce80::,2a03:ce80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:cec0::,2a03:cec0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:cf00::,2a03:cf00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:cf40::,2a03:cf40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:cf80::,2a03:cf80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:cfc0::,2a03:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:d000::,2a03:d007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:d040::,2a03:d040:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:d080::,2a03:d080:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:d0c0::,2a03:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:d100::,2a03:d100:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:d140::,2a03:d140:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:d180::,2a03:d180:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:d1c0::,2a03:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:d200::,2a03:d200:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:d240::,2a03:d240:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:d280::,2a03:d280:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:d2c0::,2a03:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:d300::,2a03:d300:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:d340::,2a03:d340:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:d380::,2a03:d380:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:d3c0::,2a03:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:d400::,2a03:d400:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:d440::,2a03:d440:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:d480::,2a03:d480:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:d4c0::,2a03:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:d500::,2a03:d500:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:d540::,2a03:d540:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:d580::,2a03:d587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:d5c0::,2a03:d5c0:1c20:ffff:ffff:ffff:ffff:ffff,IL +2a03:d5c0:1c21::,2a03:d5c0:1c21:ffff:ffff:ffff:ffff:ffff,NL +2a03:d5c0:1c22::,2a03:d5c0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a03:d600::,2a03:d607:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:d640::,2a03:d640:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:d680::,2a03:d680:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:d6c0::,2a03:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a03:d700::,2a03:d700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:d740::,2a03:d740:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:d780::,2a03:d780:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:d7c0::,2a03:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:d800::,2a03:d800:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:d840::,2a03:d840:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:d880::,2a03:d887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:d8c0::,2a03:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:d900::,2a03:d900:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:d940::,2a03:d940:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:d980::,2a03:d980:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:da00::,2a03:da00:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:da40::,2a03:da40:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:da80::,2a03:da80:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:dac0::,2a03:dac0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a03:db00::,2a03:db07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:db40::,2a03:db47:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a03:db80::,2a03:db80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:dbc0::,2a03:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:dc00::,2a03:dc00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:dc40::,2a03:dc40:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a03:dc80::,2a03:dc80:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:dcc0::,2a03:dcc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:dd00::,2a03:dd00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:dd40::,2a03:dd40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:dd80::,2a03:dd87:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:ddc0::,2a03:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:de00::,2a03:de00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:de40::,2a03:de40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:de80::,2a03:de80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:dec0::,2a03:dec7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:df00::,2a03:df00:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:df40::,2a03:df40:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:df80::,2a03:df80:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a03:dfc0::,2a03:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:e000::,2a03:e000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:e040::,2a03:e040:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e080::,2a03:e080:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:e0c0::,2a03:e0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:e140::,2a03:e140:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e180::,2a03:e180:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a03:e1c0::,2a03:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:e200::,2a03:e200:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:e240::,2a03:e240:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:e280::,2a03:e280:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:e2c0::,2a03:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e300::,2a03:e300:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:e340::,2a03:e340:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e380::,2a03:e380:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a03:e3c0::,2a03:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:e400::,2a03:e401:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e440::,2a03:e440:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:e480::,2a03:e480:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e4c0::,2a03:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e500::,2a03:e500:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a03:e540::,2a03:e540:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e580::,2a03:e587:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:e5c0::,2a03:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:e600::,2a03:e600:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:e640::,2a03:e640:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:e680::,2a03:e680:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:e6c0::,2a03:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e700::,2a03:e700:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:e740::,2a03:e740:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:e780::,2a03:e780:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e7c0::,2a03:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a03:e800::,2a03:e800:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:e840::,2a03:e847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:e880::,2a03:e880:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:e8c0::,2a03:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:e900::,2a03:e900:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:e940::,2a03:e940:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:e980::,2a03:e980:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a03:e9c0::,2a03:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:ea00::,2a03:ea00:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:ea40::,2a03:ea40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:ea80::,2a03:ea80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:eac0::,2a03:eac0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:eb00::,2a03:eb00:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:eb40::,2a03:eb40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:eb80::,2a03:eb80:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a03:ebc0::,2a03:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:ec00::,2a03:ec00:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a03:ec40::,2a03:ec47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:ec80::,2a03:ec80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:ecc0::,2a03:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:ed00::,2a03:ed00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:ed40::,2a03:ed40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:ed80::,2a03:ed80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:edc0::,2a03:edc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:ee00::,2a03:ee00:ffff:ffff:ffff:ffff:ffff:ffff,FO +2a03:ee40::,2a03:ee40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:ee80::,2a03:ee80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:eec0::,2a03:eec0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:ef00::,2a03:ef00:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:ef40::,2a03:ef41:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:ef42::,2a03:ef42::1fff:ffff:ffff:ffff:ffff,GB +2a03:ef42:0:2000::,2a03:ef47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:ef80::,2a03:ef80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:efc0::,2a03:efc0:4ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:efc0:500::,2a03:efc0:500:7fff:ffff:ffff:ffff:ffff,SE +2a03:efc0:500:8000::,2a03:efc0:6ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:efc0:700::,2a03:efc0:7ff:ffff:ffff:ffff:ffff:ffff,FR +2a03:efc0:800::,2a03:efc0:8ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:efc0:900::,2a03:efc0:9ff:ffff:ffff:ffff:ffff:ffff,ES +2a03:efc0:a00::,2a03:efc0:10ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:efc0:1100::,2a03:efc0:11ff:ffff:ffff:ffff:ffff:ffff,DE +2a03:efc0:1200::,2a03:efc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:f000::,2a03:f007:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a03:f040::,2a03:f040:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:f080::,2a03:f080:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:f0c0::,2a03:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:f100::,2a03:f100:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:f140::,2a03:f140:ffff:ffff:ffff:ffff:ffff:ffff,NC +2a03:f180::,2a03:f180:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a03:f1c0::,2a03:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:f200::,2a03:f200:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:f240::,2a03:f240:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:f280::,2a03:f280:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:f2c0::,2a03:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:f300::,2a03:f300:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:f340::,2a03:f347:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:f380::,2a03:f380:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:f400::,2a03:f400:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:f440::,2a03:f440:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:f480::,2a03:f480:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a03:f4c0::,2a03:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:f500::,2a03:f500:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:f540::,2a03:f540:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:f580::,2a03:f580:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:f5c0::,2a03:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:f600::,2a03:f600:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:f640::,2a03:f640:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:f680::,2a03:f680:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a03:f6c0::,2a03:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:f700::,2a03:f700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:f740::,2a03:f740:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a03:f780::,2a03:f780:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:f7c0::,2a03:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:f800::,2a03:f800:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a03:f840::,2a03:f840:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:f880::,2a03:f880:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:f8c0::,2a03:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:f900::,2a03:f907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:f940::,2a03:f940:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a03:f980::,2a03:f980:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:f9c0::,2a03:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:fa00::,2a03:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:fa40::,2a03:fa40:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:fa80::,2a03:fa80:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:fac0::,2a03:fac7:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a03:fb00::,2a03:fb00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:fb40::,2a03:fb47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:fb80::,2a03:fb80:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:fbc0::,2a03:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:fc00::,2a03:fc07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:fc40::,2a03:fc40:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a03:fc80::,2a03:fc87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:fcc0::,2a03:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:fd00::,2a03:fd00:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a03:fd40::,2a03:fd40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:fd80::,2a03:fd80:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:fdc0::,2a03:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,GL +2a03:fe00::,2a03:fe00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:fe40::,2a03:fe40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:fe80::,2a03:fe80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:fec0::,2a03:fec0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:ff00::,2a03:ff00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:ff40::,2a03:ff40:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a03:ffc0::,2a03:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a04::,2a04:7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:40::,2a04:47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:80::,2a04:87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:c0::,2a04:c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:100::,2a04:107:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:140::,2a04:147:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:180::,2a04:187:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:1c0::,2a04:1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:200::,2a04:207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:240::,2a04:247:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:280::,2a04:287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:2c0::,2a04:2c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:300::,2a04:307:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:340::,2a04:347:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:380::,2a04:387:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:3c0::,2a04:3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:400::,2a04:407:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:440::,2a04:447:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:480::,2a04:487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:4c0::,2a04:4c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:500::,2a04:507:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:540::,2a04:547:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:580::,2a04:587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:5c0::,2a04:5c3:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:5e0::,2a04:5e7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:600::,2a04:607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:640::,2a04:647:ffff:ffff:ffff:ffff:ffff:ffff,VA +2a04:680::,2a04:687:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:6c0::,2a04:6c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:700::,2a04:707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:740::,2a04:747:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:780::,2a04:787:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:7c0::,2a04:7c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:800::,2a04:807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:840::,2a04:847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:880::,2a04:887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:8c0::,2a04:8c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:900::,2a04:907:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a04:940::,2a04:947:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a04:980::,2a04:987:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:9c0::,2a04:9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:a00::,2a04:a07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:a40::,2a04:a47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:a80::,2a04:a87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:ac0::,2a04:ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:b00::,2a04:b07:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:b40::,2a04:b47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:b80::,2a04:b87:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:bc0::,2a04:bc7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:c00::,2a04:c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:c40::,2a04:c47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:c80::,2a04:c87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:cc0::,2a04:cc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:d00::,2a04:d07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:d40::,2a04:d47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:d80::,2a04:d87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:dc0::,2a04:dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:e00::,2a04:e07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:e40::,2a04:e47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:e80::,2a04:e87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:ec0::,2a04:ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:f00::,2a04:f07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:f40::,2a04:f47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:f80::,2a04:f87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:1000::,2a04:1007:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:1040::,2a04:1047:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:1080::,2a04:1087:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:10c0::,2a04:10c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:1100::,2a04:1103:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:1120::,2a04:1123:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:1140::,2a04:1143:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:1160::,2a04:1161:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a04:1170::,2a04:1171:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:1180::,2a04:1187:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:11c0::,2a04:11c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:1200::,2a04:1207:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:1240::,2a04:1247:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:1280::,2a04:1287:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:12c0::,2a04:12c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:1300::,2a04:1307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:1340::,2a04:1347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:1380::,2a04:1387:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:13c0::,2a04:13c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:1400::,2a04:1407:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:1440::,2a04:1447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:1480::,2a04:1487:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a04:14c0::,2a04:14c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:1500::,2a04:1507:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:1540::,2a04:1547:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:1580::,2a04:1587:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:15c0::,2a04:15c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:1600::,2a04:1607:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:1640::,2a04:1647:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:1680::,2a04:1687:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:16c0::,2a04:16c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:1700::,2a04:1707:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:1740::,2a04:1747:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:1780::,2a04:1787:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:17c0::,2a04:17c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:1800::,2a04:1807:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:1840::,2a04:1847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:1880::,2a04:1887:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:18c0::,2a04:18c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:1900::,2a04:1907:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:1940::,2a04:1947:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:1980::,2a04:1987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:19c0::,2a04:19c7:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a04:1a00::,2a04:1a07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:1a40::,2a04:1a47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:1a80::,2a04:1a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:1ac0::,2a04:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:1b00::,2a04:1b07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:1b40::,2a04:1b47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:1bc0::,2a04:1bc7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:1c00::,2a04:1c07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:1c40::,2a04:1c47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:1c80::,2a04:1c87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:1cc0::,2a04:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:1d00::,2a04:1d07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:1d40::,2a04:1d47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:1d80::,2a04:1d87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:1dc0::,2a04:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a04:1e00::,2a04:1e07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:1e40::,2a04:1e47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:1e80::,2a04:1e87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:1ec0::,2a04:1ec7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:1f00::,2a04:1f03:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:1f20::,2a04:1f23:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:1f40::,2a04:1f47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:1f80::,2a04:1f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:1fc0::,2a04:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:2000::,2a04:2007:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:2040::,2a04:2047:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:2080::,2a04:2087:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:20c0::,2a04:20c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:2100::,2a04:2107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:2140::,2a04:2147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:2180::,2a04:2187:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a04:21c0::,2a04:21c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:2200::,2a04:2207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:2240::,2a04:2247:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:2280::,2a04:2287:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:22c0::,2a04:22c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:2300::,2a04:2307:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:2340::,2a04:2347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:2380::,2a04:2387:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a04:23c0::,2a04:23c7:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a04:2400::,2a04:241f:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:2500::,2a04:2507:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:2540::,2a04:2547:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:2580::,2a04:2587:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:25c0::,2a04:25c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:2600::,2a04:2607:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a04:2640::,2a04:2647:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:2680::,2a04:2687:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:26c0::,2a04:26c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:2700::,2a04:2707:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:2740::,2a04:2747:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:27c0::,2a04:27c7:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a04:2800::,2a04:2807:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:2840::,2a04:2847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:2880::,2a04:2883:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:28a0::,2a04:28a0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a04:28b0::,2a04:28b1:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:28c0::,2a04:28c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:2940::,2a04:2947:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:2980::,2a04:2987:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a04:29c0::,2a04:29c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:2a00::,2a04:2a07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:2a40::,2a04:2a47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:2a80::,2a04:2a87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:2ac0::,2a04:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:2b00::,2a04:2b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:2b40::,2a04:2b47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:2b80::,2a04:2b87:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:2bc0::,2a04:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:2c00::,2a04:2c07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:2c80::,2a04:2c87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:2cc0::,2a04:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:2d00::,2a04:2d07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:2d40::,2a04:2d47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:2d80::,2a04:2d87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:2dc0::,2a04:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a04:2e00::,2a04:2e07:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:2e40::,2a04:2e47:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a04:2e80::,2a04:2e87:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a04:2ec0::,2a04:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a04:2f00::,2a04:2f07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:2f40::,2a04:2f47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:2f80::,2a04:2f87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:2fc0::,2a04:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:3000::,2a04:3007:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:3040::,2a04:3047:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a04:3080::,2a04:3087:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a04:30c0::,2a04:30c2:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:30c3::,2a04:30c3::ffff:ffff:ffff:ffff:ffff,US +2a04:30c3:1::,2a04:30c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:3100::,2a04:3107:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:3140::,2a04:3147:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:3180::,2a04:3187:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:31c0::,2a04:31c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:3200::,2a04:3207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:3240::,2a04:3247:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:3280::,2a04:3287:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:32c0::,2a04:32c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:3300::,2a04:3307:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:3340::,2a04:3347:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a04:3380::,2a04:3387:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:33c0::,2a04:33c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:3400::,2a04:3407:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:3440::,2a04:3447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:3480::,2a04:3487:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:34c0::,2a04:34c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:3500::,2a04:3507:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:3540::,2a04:3542:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:3543::,2a04:3543:ffff:ffff:ffff:ffff:ffff:ffff,SG +2a04:3544::,2a04:3547:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:3580::,2a04:3587:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:35c0::,2a04:35c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:3600::,2a04:3607:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:3640::,2a04:3647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:3680::,2a04:3687:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:36c0::,2a04:36c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:3700::,2a04:3707:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:3740::,2a04:3747:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:3780::,2a04:3787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:3800::,2a04:3807:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:3840::,2a04:3847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:3880::,2a04:3883:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:38a0::,2a04:38a3:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:38c0::,2a04:38c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:3900::,2a04:3907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:3940::,2a04:3947:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:3980::,2a04:3987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:39c0::,2a04:39c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:3a00::,2a04:3a07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:3a40::,2a04:3a40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:3a50::,2a04:3a51:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:3a60::,2a04:3a63:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:3a80::,2a04:3a87:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a04:3ac0::,2a04:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:3b00::,2a04:3b07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:3b40::,2a04:3b47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:3b80::,2a04:3b87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:3bc0::,2a04:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:3c00::,2a04:3c07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:3c40::,2a04:3c47:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a04:3c80::,2a04:3c87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:3cc0::,2a04:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:3d00::,2a04:3d07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:3d40::,2a04:3d47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:3d80::,2a04:3d87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:3dc0::,2a04:3dc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:3e00::,2a04:3e07:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a04:3e40::,2a04:3e47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:3e80::,2a04:3e87:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a04:3ec0::,2a04:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:3f00::,2a04:3f07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:3f40::,2a04:3f47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:3f80::,2a04:3f87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:3fc0::,2a04:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:4000::,2a04:4007:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:4040::,2a04:4047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:4080::,2a04:4087:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:40c0::,2a04:40c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:4100::,2a04:4107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:4140::,2a04:4147:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:4180::,2a04:4187:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:41c0::,2a04:41c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:4200::,2a04:4207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:4240::,2a04:4247:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:4280::,2a04:4287:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:42c0::,2a04:42c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:4300::,2a04:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:4340::,2a04:4347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:4380::,2a04:4387:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:43c0::,2a04:43c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a04:4400::,2a04:4407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:4440::,2a04:4447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:4480::,2a04:4487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:44c0::,2a04:44c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:4500::,2a04:4507:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:4540::,2a04:4547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:4580::,2a04:4587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:45c0::,2a04:45c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:4600::,2a04:4607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:4640::,2a04:4647:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:4680::,2a04:4687:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:46c0::,2a04:46c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:4700::,2a04:4703:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:4720::,2a04:4723:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:4740::,2a04:4747:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:4780::,2a04:4787:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a04:47c0::,2a04:47c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:4800::,2a04:4807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:4840::,2a04:4847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:4880::,2a04:4887:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:48c0::,2a04:48c7:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a04:4900::,2a04:4907:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:4940::,2a04:4947:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:4980::,2a04:4987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:49c0::,2a04:49c7:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a04:4a00::,2a04:4a07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:4a40::,2a04:4a47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:4a80::,2a04:4a87:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:4ac0::,2a04:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:4b00::,2a04:4b07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:4b40::,2a04:4b47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:4b80::,2a04:4b87:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a04:4bc0::,2a04:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:4c40::,2a04:4c47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:4c80::,2a04:4c87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:4cc0::,2a04:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:4d00::,2a04:4d07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:4d40::,2a04:4d47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:4d80::,2a04:4d87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:4dc0::,2a04:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:4e00::,2a04:4e07:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a04:4e80::,2a04:4e87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:4f00::,2a04:4f07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:4f40::,2a04:4f47:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a04:4f80::,2a04:4f87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:4fc0::,2a04:4fc3:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:4fe0::,2a04:4fe3:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:5000::,2a04:5007:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:5040::,2a04:5047:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:50c0::,2a04:50c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:5100::,2a04:5107:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:5180::,2a04:5187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:51c0::,2a04:51c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:5200::,2a04:5207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:5240::,2a04:5247:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:5280::,2a04:5287:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:52c0::,2a04:52c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:5300::,2a04:5307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:5340::,2a04:5347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:53c0::,2a04:53c7:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a04:5400::,2a04:5407:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:5440::,2a04:5447:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:5480::,2a04:5487:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:54c0::,2a04:54c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:5500::,2a04:5507:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:5540::,2a04:5547:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:5580::,2a04:5587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:55c0::,2a04:55c7:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a04:5600::,2a04:5607:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a04:5640::,2a04:5647:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:5680::,2a04:5687:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:56c0::,2a04:56c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:5700::,2a04:5707:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a04:5740::,2a04:5747:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:5780::,2a04:5787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:57c0::,2a04:57c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:5800::,2a04:5807:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:5880::,2a04:5887:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:58c0::,2a04:58c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:5900::,2a04:5907:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a04:5940::,2a04:5947:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:5980::,2a04:5987:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:59c0::,2a04:59c7:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a04:5a00::,2a04:5a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:5a40::,2a04:5a47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:5a80::,2a04:5a87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a04:5ac0::,2a04:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:5b00::,2a04:5b07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:5b40::,2a04:5b47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:5bc0::,2a04:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:5c00::,2a04:5c07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:5c40::,2a04:5c47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:5c80::,2a04:5c85:3fff:ffff:ffff:ffff:ffff:ffff,CH +2a04:5c85:4000::,2a04:5c85:4fff:ffff:ffff:ffff:ffff:ffff,US +2a04:5c85:5000::,2a04:5c87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:5cc0::,2a04:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:5d00::,2a04:5d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:5d40::,2a04:5d47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:5d80::,2a04:5d87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:5dc0::,2a04:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:5e00::,2a04:5e07:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a04:5e40::,2a04:5e47:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a04:5e80::,2a04:5e87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:5ec0::,2a04:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:5f00::,2a04:5f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:5f40::,2a04:5f47:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a04:5f80::,2a04:5f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:5fc0::,2a04:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:6000::,2a04:6007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:6040::,2a04:6047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:6080::,2a04:6087:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:60c0::,2a04:60c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:6100::,2a04:6107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:6140::,2a04:6147:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:6180::,2a04:6187:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:61c0::,2a04:61c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:6200::,2a04:6207:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a04:6240::,2a04:6247:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:6280::,2a04:6287:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:62c0::,2a04:62c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:6300::,2a04:6307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:6340::,2a04:6347:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:6380::,2a04:6387:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:63c0::,2a04:63c7:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a04:6400::,2a04:6407:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:6440::,2a04:6447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:6480::,2a04:6487:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:64c0::,2a04:64c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:6500::,2a04:6507:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a04:6540::,2a04:6547:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:6580::,2a04:6587:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:65c0::,2a04:65c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:6600::,2a04:6607:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:6640::,2a04:6647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:6650::,2a04:6651:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:6680::,2a04:6687:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:66c0::,2a04:66c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:6700::,2a04:6707:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a04:6740::,2a04:6747:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:6780::,2a04:6787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:67c0::,2a04:67c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:6800::,2a04:6807:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:6840::,2a04:6847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:6880::,2a04:6887:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:68c0::,2a04:68c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:6900::,2a04:6907:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:6940::,2a04:6947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:69c0::,2a04:69c7:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a04:6a00::,2a04:6a07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:6a40::,2a04:6a47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:6a80::,2a04:6a87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:6ac0::,2a04:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a04:6b00::,2a04:6b07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:6b40::,2a04:6b47:ffff:ffff:ffff:ffff:ffff:ffff,GG +2a04:6b80::,2a04:6b87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:6bc0::,2a04:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:6c00::,2a04:6c07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:6c40::,2a04:6c47:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:6c80::,2a04:6c87:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:6cc0::,2a04:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:6d00::,2a04:6d07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:6d40::,2a04:6d47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:6d80::,2a04:6d87:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a04:6dc0::,2a04:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:6e00::,2a04:6e07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:6e40::,2a04:6e47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:6e80::,2a04:6e80:1:ffff:ffff:ffff:ffff:ffff,DK +2a04:6e80:2::,2a04:6e80:2:ffff:ffff:ffff:ffff:ffff,GB +2a04:6e80:3::,2a04:6e87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:6ec0::,2a04:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:6f00::,2a04:6f07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:6f40::,2a04:6f47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:6f80::,2a04:6f83:ffff:ffff:ffff:ffff:ffff:ffff,QA +2a04:6fa0::,2a04:6fa1:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:6fb0::,2a04:6fb1:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:6fc0::,2a04:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:7000::,2a04:7007:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a04:7040::,2a04:7047:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:7080::,2a04:7087:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a04:70c0::,2a04:70c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:7100::,2a04:7107:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:7140::,2a04:7147:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:7180::,2a04:7187:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:71c0::,2a04:71c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:7200::,2a04:7207:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:7240::,2a04:7247:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:7280::,2a04:7287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:72c0::,2a04:72c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:7300::,2a04:7307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:7340::,2a04:7347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:7380::,2a04:7387:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:73c0::,2a04:73c7:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a04:7400::,2a04:7407:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a04:7440::,2a04:7447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:7480::,2a04:7487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:74c0::,2a04:74c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:7500::,2a04:7507:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:7580::,2a04:7587:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a04:75c0::,2a04:75c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:7600::,2a04:7607:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:7640::,2a04:7647:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:7680::,2a04:7687:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:76c0::,2a04:76c7:ff:ffff:ffff:ffff:ffff:ffff,NL +2a04:76c7:100::,2a04:76c7:100:ffff:ffff:ffff:ffff:ffff,US +2a04:76c7:101::,2a04:76c7:1ff:ffff:ffff:ffff:ffff:ffff,NL +2a04:76c7:200::,2a04:76c7:200:ffff:ffff:ffff:ffff:ffff,GB +2a04:76c7:201::,2a04:76c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:7700::,2a04:7707:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:7740::,2a04:7747:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a04:7780::,2a04:7787:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:77c0::,2a04:77c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:7800::,2a04:7807:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a04:7840::,2a04:7847:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:7880::,2a04:7887:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:78c0::,2a04:78c3:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:78e0::,2a04:78e3:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:7900::,2a04:7907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:7940::,2a04:7947:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:7980::,2a04:7987:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:79c0::,2a04:79c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:7a00::,2a04:7a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:7a40::,2a04:7a47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:7a80::,2a04:7a87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:7ac0::,2a04:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:7b00::,2a04:7b07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:7b40::,2a04:7b47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:7b80::,2a04:7b87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:7c00::,2a04:7c07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:7c40::,2a04:7c47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:7c80::,2a04:7c87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:7cc0::,2a04:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:7d40::,2a04:7d47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:7d80::,2a04:7d87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:7dc0::,2a04:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:7e00::,2a04:7e07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:7e40::,2a04:7e47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:7e80::,2a04:7e87:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a04:7ec0::,2a04:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:7f00::,2a04:7f07:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:7f40::,2a04:7f47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:7f80::,2a04:7f87:ffff:ffff:ffff:ffff:ffff:ffff,QA +2a04:7fc0::,2a04:7fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:8000::,2a04:8007:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:8040::,2a04:8047:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:8080::,2a04:8087:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:80c0::,2a04:80c7:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a04:8100::,2a04:8107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:8140::,2a04:8147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:8180::,2a04:8181:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a04:8190::,2a04:8191:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:81a0::,2a04:81a7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:81c0::,2a04:81c7:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a04:8200::,2a04:8207:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:8240::,2a04:8247:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:8280::,2a04:8287:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:82c0::,2a04:82c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:8300::,2a04:8307:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a04:8340::,2a04:8347:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:8380::,2a04:8387:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a04:83c0::,2a04:83c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:8400::,2a04:8407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:8440::,2a04:8447:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:8480::,2a04:8487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:84c0::,2a04:84c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:8500::,2a04:8507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:8540::,2a04:8547:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:8580::,2a04:8587:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:85c0::,2a04:85c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:8600::,2a04:8607:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:8640::,2a04:8647:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:8680::,2a04:8687:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:86c0::,2a04:86c7:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a04:8700::,2a04:8707:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a04:8740::,2a04:8747:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:8780::,2a04:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:87c0::,2a04:87c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:8840::,2a04:8847:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:8880::,2a04:8887:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:88c0::,2a04:88c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:8900::,2a04:8907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:8940::,2a04:8947:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a04:8980::,2a04:8987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:89c0::,2a04:89c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:8a00::,2a04:8a07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:8a40::,2a04:8a47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:8a80::,2a04:8a87:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a04:8ac0::,2a04:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,BH +2a04:8b00::,2a04:8b07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:8b80::,2a04:8b87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:8bc0::,2a04:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:8c00::,2a04:8c07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:8c40::,2a04:8c47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:8c80::,2a04:8c87:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a04:8cc0::,2a04:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:8d00::,2a04:8d07:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a04:8d40::,2a04:8d47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:8d80::,2a04:8d87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:8dc0::,2a04:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a04:8e00::,2a04:8e07:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a04:8e40::,2a04:8e47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:8e80::,2a04:8e81:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:8e90::,2a04:8e91:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:8ea0::,2a04:8ea3:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:8f00::,2a04:8f07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:8f40::,2a04:8f47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:8f80::,2a04:8f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:8fc0::,2a04:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:9000::,2a04:9007:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:9040::,2a04:9047:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:9080::,2a04:9087:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a04:90c0::,2a04:90c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:9100::,2a04:9107:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a04:9140::,2a04:9147:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:9180::,2a04:9187:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:91c0::,2a04:91c7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:9240::,2a04:9247:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:9280::,2a04:9287:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:92c0::,2a04:92c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:9300::,2a04:9307:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:9340::,2a04:9347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:9380::,2a04:9387:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:93c0::,2a04:93c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:9400::,2a04:9407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:9440::,2a04:9447:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:9480::,2a04:9487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:94e0::,2a04:94e3:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:9500::,2a04:9507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:9540::,2a04:9547:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:9580::,2a04:9587:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:95c0::,2a04:95c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:9600::,2a04:9607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:9640::,2a04:9647:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a04:9680::,2a04:9687:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:96c0::,2a04:96c7:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a04:9700::,2a04:9707:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:9740::,2a04:9747:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:9780::,2a04:9787:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:97c0::,2a04:97c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:9800::,2a04:9807:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:9840::,2a04:9847:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a04:9880::,2a04:9887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:98c0::,2a04:98c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:9900::,2a04:9907:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:9940::,2a04:9947:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a04:9980::,2a04:9987:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:99c0::,2a04:99c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:9a00::,2a04:9a07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:9a40::,2a04:9a47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:9a80::,2a04:9a87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:9ac0::,2a04:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:9b00::,2a04:9b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:9b40::,2a04:9b47:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a04:9b80::,2a04:9b87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:9bc0::,2a04:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:9c00::,2a04:9c07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:9c40::,2a04:9c47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:9c80::,2a04:9c87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:9cc0::,2a04:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a04:9d40::,2a04:9d47:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:9d80::,2a04:9d87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:9dc0::,2a04:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:9e00::,2a04:9e07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:9e40::,2a04:9e47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:9e80::,2a04:9e87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:9ec0::,2a04:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:9f00::,2a04:9f07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:9f80::,2a04:9f87:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:9fc0::,2a04:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:a000::,2a04:a007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:a040::,2a04:a047:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a04:a080::,2a04:a087:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:a0c0::,2a04:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:a100::,2a04:a107:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:a140::,2a04:a140:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:a141::,2a04:a141::ffff:ffff:ffff:ffff:ffff,US +2a04:a141:1::,2a04:a146:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:a147::,2a04:a147:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:a180::,2a04:a187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:a1c0::,2a04:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:a200::,2a04:a207:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:a280::,2a04:a287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:a2c0::,2a04:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:a300::,2a04:a307:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:a340::,2a04:a347:ffff:ffff:ffff:ffff:ffff:ffff,SM +2a04:a380::,2a04:a387:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:a3c0::,2a04:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:a400::,2a04:a407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:a440::,2a04:a440:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:a450::,2a04:a451:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:a460::,2a04:a461:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:a470::,2a04:a471:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:a480::,2a04:a487:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:a4c0::,2a04:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:a500::,2a04:a507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:a540::,2a04:a547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:a580::,2a04:a587:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:a600::,2a04:a607:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:a640::,2a04:a647:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:a680::,2a04:a687:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:a6c0::,2a04:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:a700::,2a04:a707:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:a740::,2a04:a747:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:a7c0::,2a04:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a04:a800::,2a04:a807:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:a840::,2a04:a847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:a880::,2a04:a887:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:a8c0::,2a04:a8c7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a04:a900::,2a04:a907:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:a940::,2a04:a947:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:a980::,2a04:a987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:a9c0::,2a04:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:aa00::,2a04:aa07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:aa40::,2a04:aa47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:aa80::,2a04:aa87:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a04:aac0::,2a04:aac7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:ab00::,2a04:ab07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:ab40::,2a04:ab47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:ab80::,2a04:ab87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:abc0::,2a04:abc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:ac00::,2a04:ac07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:ac40::,2a04:ac47:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a04:ac80::,2a04:ac87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:acc0::,2a04:acc7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:ad00::,2a04:ad07:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a04:ad40::,2a04:ad47:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:ad80::,2a04:ad80::7fff:ffff:ffff:ffff:ffff,NL +2a04:ad80:0:8000::,2a04:ad87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:adc0::,2a04:adc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:ae00::,2a04:ae3f:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:b000::,2a04:b007:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:b040::,2a04:b047:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:b080::,2a04:b087:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:b0c0::,2a04:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:b100::,2a04:b107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:b140::,2a04:b147:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:b180::,2a04:b187:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:b1c0::,2a04:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:b200::,2a04:b207:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:b240::,2a04:b247:ffff:ffff:ffff:ffff:ffff:ffff,IM +2a04:b280::,2a04:b287:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:b2c0::,2a04:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:b300::,2a04:b307:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:b340::,2a04:b347:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a04:b380::,2a04:b387:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:b3c0::,2a04:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:b400::,2a04:b407:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:b440::,2a04:b447:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:b480::,2a04:b487:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:b4c0::,2a04:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:b500::,2a04:b507:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:b540::,2a04:b547:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a04:b580::,2a04:b587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:b5c0::,2a04:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:b600::,2a04:b607:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:b640::,2a04:b647:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:b680::,2a04:b687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:b6c0::,2a04:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:b700::,2a04:b707:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:b740::,2a04:b747:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:b780::,2a04:b787:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:b7c0::,2a04:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:b800::,2a04:b807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:b840::,2a04:b847:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:b880::,2a04:b887:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:b8c0::,2a04:b8c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:b900::,2a04:b907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:b940::,2a04:b947:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:b980::,2a04:b987:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a04:b9c0::,2a04:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:ba00::,2a04:ba07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:ba40::,2a04:ba47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:ba80::,2a04:ba87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:bac0::,2a04:bac7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:bb40::,2a04:bb47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:bb80::,2a04:bb87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:bbc0::,2a04:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:bc00::,2a04:bc07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:bc40::,2a04:bc40:1dc0:ffff:ffff:ffff:ffff:ffff,UA +2a04:bc40:1dc1::,2a04:bc40:1dc1:ffff:ffff:ffff:ffff:ffff,NL +2a04:bc40:1dc2::,2a04:bc40:1dc2:ffff:ffff:ffff:ffff:ffff,RU +2a04:bc40:1dc3::,2a04:bc40:1dc3:ffff:ffff:ffff:ffff:ffff,UA +2a04:bc40:1dc4::,2a04:bc40:1dc4:ffff:ffff:ffff:ffff:ffff,RO +2a04:bc40:1dc5::,2a04:bc40:1dc5:ffff:ffff:ffff:ffff:ffff,SE +2a04:bc40:1dc6::,2a04:bc40:1dc6:ffff:ffff:ffff:ffff:ffff,NL +2a04:bc40:1dc7::,2a04:bc40:1dc7:ffff:ffff:ffff:ffff:ffff,DK +2a04:bc40:1dc8::,2a04:bc40:2dc0:ffff:ffff:ffff:ffff:ffff,UA +2a04:bc40:2dc1::,2a04:bc40:2dc1:ffff:ffff:ffff:ffff:ffff,US +2a04:bc40:2dc2::,2a04:bc40:2dc2:ffff:ffff:ffff:ffff:ffff,FR +2a04:bc40:2dc3::,2a04:bc40:2dc3:ffff:ffff:ffff:ffff:ffff,ES +2a04:bc40:2dc4::,2a04:bc47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:bc80::,2a04:bc87:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:bcc0::,2a04:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:bd00::,2a04:bd07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:bd40::,2a04:bd47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:bd80::,2a04:bd87:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:be00::,2a04:be03:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:be20::,2a04:be23:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:be40::,2a04:be47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:be80::,2a04:be87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:bec0::,2a04:bec7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:bf00::,2a04:bf07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:bf40::,2a04:bf47:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a04:bf80::,2a04:bf87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:bfc0::,2a04:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:c000::,2a04:c007:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:c040::,2a04:c047:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:c080::,2a04:c087:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:c0c0::,2a04:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:c100::,2a04:c107:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:c140::,2a04:c147:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:c180::,2a04:c187:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:c1c0::,2a04:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:c200::,2a04:c207:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a04:c240::,2a04:c247:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:c280::,2a04:c287:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a04:c2c0::,2a04:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:c300::,2a04:c307:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:c340::,2a04:c347:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:c380::,2a04:c387:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:c3c0::,2a04:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:c400::,2a04:c407:ffff:ffff:ffff:ffff:ffff:ffff,OM +2a04:c440::,2a04:c447:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:c480::,2a04:c487:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:c4c0::,2a04:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:c500::,2a04:c507:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:c540::,2a04:c547:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:c580::,2a04:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:c5c0::,2a04:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a04:c600::,2a04:c607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:c640::,2a04:c647:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:c680::,2a04:c687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:c6c0::,2a04:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:c700::,2a04:c707:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:c740::,2a04:c747:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:c780::,2a04:c787:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:c7c0::,2a04:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:c800::,2a04:c807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:c840::,2a04:c847:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a04:c8c0::,2a04:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:c900::,2a04:c907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:c940::,2a04:c947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:c980::,2a04:c987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:c9c0::,2a04:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:ca00::,2a04:ca07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:ca40::,2a04:ca47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:cac0::,2a04:cac7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:cb00::,2a04:cb07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:cb40::,2a04:cb47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:cb80::,2a04:cb87:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a04:cc00::,2a04:cc07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:cc40::,2a04:cc47:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a04:cc80::,2a04:cc87:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:ccc0::,2a04:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:cd00::,2a04:cd07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:cd40::,2a04:cd47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:cd80::,2a04:cd87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:cdc0::,2a04:cdc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:ce00::,2a04:ce07:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a04:ce40::,2a04:ce47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:ce80::,2a04:ce87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:cec0::,2a04:cec7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:cf00::,2a04:cf07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:cf40::,2a04:cf47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:cf80::,2a04:cf87:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a04:cfc0::,2a04:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:d000::,2a04:d007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:d080::,2a04:d087:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a04:d0c0::,2a04:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:d100::,2a04:d107:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a04:d140::,2a04:d147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:d180::,2a04:d187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:d1c0::,2a04:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a04:d200::,2a04:d207:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:d240::,2a04:d247:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:d280::,2a04:d287:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:d2c0::,2a04:d2c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:d340::,2a04:d347:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:d380::,2a04:d387:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a04:d3c0::,2a04:d3c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:d400::,2a04:d407:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a04:d440::,2a04:d447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:d480::,2a04:d487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:d4c0::,2a04:d4c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:d500::,2a04:d507:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:d540::,2a04:d547:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:d580::,2a04:d587:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a04:d5c0::,2a04:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:d600::,2a04:d607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:d640::,2a04:d647:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:d680::,2a04:d687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:d6c0::,2a04:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:d700::,2a04:d707:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:d740::,2a04:d747:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:d780::,2a04:d787:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:d7c0::,2a04:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:d800::,2a04:d807:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:d840::,2a04:d847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:d880::,2a04:d887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:d8c0::,2a04:d8c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:d900::,2a04:d907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:d940::,2a04:d947:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:d980::,2a04:d987:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a04:d9c0::,2a04:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:da00::,2a04:da07:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a04:da40::,2a04:da47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:da80::,2a04:da87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:dac0::,2a04:dac7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:db00::,2a04:db07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:db40::,2a04:db47:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a04:db80::,2a04:db87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:dbc0::,2a04:dbc3:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:dbe0::,2a04:dbe3:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a04:dc00::,2a04:dc07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:dc40::,2a04:dc47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:dc80::,2a04:dc87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a04:dcc0::,2a04:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:dd00::,2a04:dd07:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a04:dd40::,2a04:dd47:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a04:ddc0::,2a04:ddc7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:de00::,2a04:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:de40::,2a04:de47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:de80::,2a04:de87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:dec0::,2a04:dec7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:df00::,2a04:df07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a04:df40::,2a04:df47:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a04:df80::,2a04:df87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:dfc0::,2a04:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:e040::,2a04:e047:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a04:e080::,2a04:e087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:e100::,2a04:e107:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:e140::,2a04:e147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:e180::,2a04:e187:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:e1c0::,2a04:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:e200::,2a04:e207:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:e240::,2a04:e247:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:e280::,2a04:e287:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:e2c0::,2a04:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:e300::,2a04:e307:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:e340::,2a04:e347:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a04:e380::,2a04:e387:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:e3c0::,2a04:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a04:e400::,2a04:e407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:e440::,2a04:e447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:e480::,2a04:e487:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:e4c0:10::,2a04:e4c0:10:ffff:ffff:ffff:ffff:ffff,GB +2a04:e4c0:11::,2a04:e4c0:11:ffff:ffff:ffff:ffff:ffff,DE +2a04:e4c0:12::,2a04:e4c0:12:ffff:ffff:ffff:ffff:ffff,FR +2a04:e4c0:13::,2a04:e4c0:13:ffff:ffff:ffff:ffff:ffff,DK +2a04:e4c0:14::,2a04:e4c0:14:ffff:ffff:ffff:ffff:ffff,RO +2a04:e4c0:15::,2a04:e4c0:15:ffff:ffff:ffff:ffff:ffff,CZ +2a04:e4c0:16::,2a04:e4c0:16:ffff:ffff:ffff:ffff:ffff,PL +2a04:e4c0:20::,2a04:e4c0:20:ffff:ffff:ffff:ffff:ffff,JP +2a04:e4c0:21::,2a04:e4c0:21:ffff:ffff:ffff:ffff:ffff,AU +2a04:e4c0:30::,2a04:e4c0:30:ffff:ffff:ffff:ffff:ffff,ZA +2a04:e4c0:31::,2a04:e4c0:31:ffff:ffff:ffff:ffff:ffff,AE +2a04:e500::,2a04:e507:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:e540::,2a04:e547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:e580::,2a04:e587:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:e5c0::,2a04:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:e600::,2a04:e607:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:e640::,2a04:e647:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:e680::,2a04:e687:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:e6c0::,2a04:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a04:e700::,2a04:e707:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:e740::,2a04:e747:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:e780::,2a04:e787:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:e7c0::,2a04:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:e800::,2a04:e807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:e840::,2a04:e847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:e880::,2a04:e887:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:e8c0::,2a04:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:e900::,2a04:e907:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:e940::,2a04:e947:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:e980::,2a04:e987:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a04:e9c0::,2a04:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:ea40::,2a04:ea47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:ea80::,2a04:ea87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a04:eac0::,2a04:eac7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:eb00::,2a04:eb07:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a04:eb40::,2a04:eb47:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a04:eb80::,2a04:eb87:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a04:ebc0::,2a04:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:ec00::,2a04:ec01:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:ec10::,2a04:ec11:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:ec20::,2a04:ec23:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a04:ec40::,2a04:ec47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:ec80::,2a04:ec87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:ecc0::,2a04:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:ed00::,2a04:ed07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:ed40::,2a04:ed47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:ed80::,2a04:ed87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:ee00::,2a04:ee07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:ee40::,2a04:ee47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:ee80::,2a04:ee87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:eec0::,2a04:eec7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:ef00::,2a04:ef07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:ef40::,2a04:ef47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:ef80::,2a04:ef87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:efc0::,2a04:efc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:f000::,2a04:f007:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:f040::,2a04:f047:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a04:f080::,2a04:f087:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:f0c0::,2a04:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a04:f100::,2a04:f107:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:f140::,2a04:f147:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a04:f180::,2a04:f187:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a04:f1c0::,2a04:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a04:f200::,2a04:f207:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:f240::,2a04:f247:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:f280::,2a04:f287:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a04:f2c0::,2a04:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a04:f300::,2a04:f300:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:f310::,2a04:f311:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:f320::,2a04:f323:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a04:f340::,2a04:f347:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a04:f380::,2a04:f387:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:f3c0::,2a04:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:f440::,2a04:f447:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:f480::,2a04:f487:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a04:f4c0::,2a04:f4c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:f500::,2a04:f507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:f540::,2a04:f547:ffff:ffff:ffff:ffff:ffff:ffff,US +2a04:f580::,2a04:f587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:f5c0::,2a04:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:f600::,2a04:f607:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a04:f640:1::,2a04:f640:1:7fff:ffff:ffff:ffff:ffff,GB +2a04:f680::,2a04:f687:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:f6c0::,2a04:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:f700::,2a04:f707:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a04:f740::,2a04:f747:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:f780::,2a04:f787:ffff:ffff:ffff:ffff:ffff:ffff,IN +2a04:f7c0::,2a04:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:f800::,2a04:f807:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:f840::,2a04:f847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:f880::,2a04:f887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:f8c0::,2a04:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:f900::,2a04:f907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a04:f940::,2a04:f947:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a04:f980::,2a04:f987:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:f9c0::,2a04:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:fa00::,2a04:fa07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:fa40::,2a04:fa47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:fa80::,2a04:fa87:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:fb00::,2a04:fb07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:fb40::,2a04:fb47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a04:fb80::,2a04:fb87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:fbc0::,2a04:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:fc00::,2a04:fc07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a04:fc40::,2a04:fc47:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a04:fc80::,2a04:fc87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a04:fcc0::,2a04:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:fd00::,2a04:fd07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:fd40::,2a04:fd47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a04:fd80::,2a04:fd87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:fdc0::,2a04:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a04:fe40::,2a04:fe47:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a04:fe80::,2a04:fe87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a04:fec0::,2a04:fec0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a04:fee0::,2a04:fee3:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a04:ff00::,2a04:ff07:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a04:ff40::,2a04:ff47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a04:ff80::,2a04:ff87:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a04:ffc0::,2a04:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a05::,2a05:7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:40::,2a05:47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:80::,2a05:87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:c0::,2a05:c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:100::,2a05:107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:140::,2a05:147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:1c0::,2a05:1c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:200::,2a05:207:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:240::,2a05:247:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2c0::,2a05:2c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:300::,2a05:307:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:340::,2a05:347:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:380::,2a05:387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3c0::,2a05:3c7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:400::,2a05:407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:440::,2a05:447:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:480::,2a05:487:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:4c0::,2a05:4c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a05:500::,2a05:507:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:540::,2a05:547:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:580::,2a05:587:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a05:5c0::,2a05:5c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:640::,2a05:647:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:680::,2a05:687:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:6c0::,2a05:6c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:700::,2a05:707:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a05:740::,2a05:747:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:780::,2a05:787:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:7c0::,2a05:7c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:800::,2a05:807:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:840::,2a05:843:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:860::,2a05:863:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:880::,2a05:887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:8c0::,2a05:8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:900::,2a05:907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:940::,2a05:947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:980::,2a05:987:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a05:9c0::,2a05:9c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:a00::,2a05:a07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:a40::,2a05:a47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:a80::,2a05:a87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:ac0::,2a05:ac7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:b00::,2a05:b07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:b40::,2a05:b47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:b80::,2a05:b87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:bc0::,2a05:bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:c00::,2a05:c07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:c80::,2a05:c87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:cc0::,2a05:cc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d00::,2a05:d07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:d40::,2a05:d47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d80::,2a05:d87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:dc0::,2a05:dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:e00::,2a05:e07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:e40::,2a05:e47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:e80::,2a05:e87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:ec0::,2a05:ec7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:f00::,2a05:f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:f40::,2a05:f47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:f80::,2a05:f87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1000::,2a05:1007:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:1040::,2a05:1047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:10c0::,2a05:10c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:1100::,2a05:1107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:1140::,2a05:1147:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:1180::,2a05:1187:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:11c0::,2a05:11c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1200::,2a05:1203:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:1220::,2a05:1223:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:1240::,2a05:1247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:1280::,2a05:1287:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:12c0::,2a05:12c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:1300::,2a05:1307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1340::,2a05:1347:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:13c0::,2a05:13c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1400::,2a05:1407:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:1440::,2a05:1447:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:1480::,2a05:1487:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:14c0::,2a05:14c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:1500::,2a05:1507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:1540::,2a05:1547:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:1580::,2a05:1587:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a05:15c0::,2a05:15c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:1600::,2a05:1607:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a05:1640::,2a05:1647:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:1680::,2a05:1687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:16c0::,2a05:16c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:1700::,2a05:1707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:1740::,2a05:1747:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:17c0::,2a05:17c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:1800::,2a05:1807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:1840::,2a05:1847:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a05:1880::,2a05:1887:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:18c0::,2a05:18c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:1900::,2a05:1907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:1940::,2a05:1947:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:1980::,2a05:1987:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:19c0::,2a05:19c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:1a00::,2a05:1a3f:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:1c00::,2a05:1c07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:1c40::,2a05:1c47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:1c80::,2a05:1c87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1cc0::,2a05:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a05:1d00::,2a05:1d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1d40::,2a05:1d43:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:1d80::,2a05:1d87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:1dc0::,2a05:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:1e00::,2a05:1e07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:1e40::,2a05:1e47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:1e80::,2a05:1e87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:1ec0::,2a05:1ec7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:1f00::,2a05:1f07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1f40::,2a05:1f47:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:1f80::,2a05:1f87:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a05:1fc0::,2a05:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:2000::,2a05:2007:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:2040::,2a05:2047:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:2080::,2a05:2087:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:20c0::,2a05:20c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2100::,2a05:2107:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:2140::,2a05:2147:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a05:2180::,2a05:2187:ffff:ffff:ffff:ffff:ffff:ffff,TM +2a05:21c0::,2a05:21c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:2200::,2a05:2207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2240::,2a05:2247:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:2280::,2a05:2287:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a05:22c0::,2a05:22c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2300::,2a05:2307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2340::,2a05:2347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2380::,2a05:2387:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:23c0::,2a05:23c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:2400::,2a05:2407:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:2440::,2a05:2447:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:2480::,2a05:2487:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a05:24c0::,2a05:24c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2500::,2a05:2507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2540::,2a05:2547:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:2580::,2a05:2587:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:25c0::,2a05:25c7:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a05:2600::,2a05:2607:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:2640::,2a05:2647:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:2680::,2a05:2687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:26c0::,2a05:26c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2700::,2a05:2707:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:2740::,2a05:2747:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:2780::,2a05:2787:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:2800::,2a05:2807:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:2840::,2a05:2847:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:2880::,2a05:2887:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:28c0::,2a05:28c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:2900::,2a05:2907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2940::,2a05:2947:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:2980::,2a05:2987:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:29c0::,2a05:29c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:2a00::,2a05:2a07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2a40::,2a05:2a47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:2a80::,2a05:2a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2ac0::,2a05:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:2b00::,2a05:2b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2b40::,2a05:2b47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2bc0::,2a05:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2c00::,2a05:2c03:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:2c20::,2a05:2c23:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:2c40::,2a05:2c47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2c80::,2a05:2c87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:2cc0::,2a05:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2d00::,2a05:2d00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2d01::,2a05:2d01::ffff:ffff:ffff:ffff:ffff,US +2a05:2d01:1::,2a05:2d01:2016:ffff:ffff:ffff:ffff:ffff,NL +2a05:2d01:2017::,2a05:2d01:2017:7fff:ffff:ffff:ffff:ffff,NO +2a05:2d01:2017:8000::,2a05:2d01:8fff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2d01:9000::,2a05:2d01:9000:ffff:ffff:ffff:ffff:ffff,GB +2a05:2d01:9001::,2a05:2d06:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2d07::,2a05:2d07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:2d40::,2a05:2d47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:2d80::,2a05:2d87:ffff:ffff:ffff:ffff:ffff:ffff,US +2a05:2dc0::,2a05:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:2e40::,2a05:2e47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:2e80::,2a05:2e87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2ec0::,2a05:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:2f00::,2a05:2f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2f40::,2a05:2f47:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a05:2f80::,2a05:2f87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:2fc0::,2a05:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3000::,2a05:3007:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:3040::,2a05:3047:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:3080::,2a05:3087:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a05:30c0::,2a05:30c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3140::,2a05:3147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:3180::,2a05:3187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:31c0::,2a05:31c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:3200::,2a05:3207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:3240::,2a05:3247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3280::,2a05:3287:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a05:32c0::,2a05:32c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3300::,2a05:3307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:3340::,2a05:3347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:3380::,2a05:3387:ffff:ffff:ffff:ffff:ffff:ffff,YE +2a05:33c0::,2a05:33c7:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a05:3400::,2a05:3407:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:3440::,2a05:3447:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:3480::,2a05:3487:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:34c0::,2a05:34c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:3500::,2a05:3507:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:3540::,2a05:3547:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:3580::,2a05:3587:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:35c0::,2a05:35c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:3600::,2a05:3607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:3640::,2a05:3647:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:3680::,2a05:3687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:36c0::,2a05:36c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:3700::,2a05:3707:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:3740::,2a05:3747:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:37c0::,2a05:37c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:3800::,2a05:3807:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:3840::,2a05:3847:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:3880::,2a05:3887:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:38c0::,2a05:38c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:3900::,2a05:3907:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:3940::,2a05:3941:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:3950::,2a05:3951:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:3980::,2a05:3987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:39c0::,2a05:39c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:3a00::,2a05:3a07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:3a40::,2a05:3a47:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:3a80::,2a05:3a87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:3ac0::,2a05:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a05:3b00::,2a05:3b07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a05:3b40::,2a05:3b47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:3b80::,2a05:3b87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:3bc0::,2a05:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3c00::,2a05:3c07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:3c40::,2a05:3c47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:3c80::,2a05:3c87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:3d00::,2a05:3d07:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:3d80::,2a05:3d87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:3dc0::,2a05:3dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:3e00::,2a05:3e07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3e40::,2a05:3e47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:3e80::,2a05:3e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:3ec0::,2a05:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:3f00::,2a05:3f07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:3f40::,2a05:3f47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:3f80::,2a05:3f87:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a05:3fc0::,2a05:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:4000::,2a05:4007:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4040::,2a05:4047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4080::,2a05:4087:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a05:40c0::,2a05:40c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:4100::,2a05:4107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:4180::,2a05:4187:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:41c0::,2a05:41c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:4200::,2a05:4207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4240::,2a05:4247:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:4280::,2a05:4287:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a05:42c0::,2a05:42c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:4300::,2a05:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4340::,2a05:4347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:43c0::,2a05:43c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:4400::,2a05:4407:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:4440::,2a05:4447:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:4480::,2a05:4487:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:44c0::,2a05:44c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:4500::,2a05:4507:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:4540::,2a05:4547:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:4580::,2a05:4587:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:45c0::,2a05:45c7:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a05:4600::,2a05:4607:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:4640::,2a05:4647:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:4680::,2a05:4687:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:46c0::,2a05:46c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:4700::,2a05:4707:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:4740::,2a05:4747:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:4780::,2a05:4787:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:47c0::,2a05:47c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:4800::,2a05:4807:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:4840::,2a05:4847:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:4880::,2a05:4887:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:48c0::,2a05:48c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:4900::,2a05:4907:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:4940::,2a05:4947:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a05:4980::,2a05:4987:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a05:49c0::,2a05:49c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:4a00::,2a05:4a07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:4a40::,2a05:4a47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:4ac0::,2a05:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:4b00::,2a05:4b07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:4b80::,2a05:4b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4bc0::,2a05:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4c00::,2a05:4c07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:4c40::,2a05:4c47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4c80::,2a05:4c87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:4cc0::,2a05:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:4d00::,2a05:4d07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:4d40::,2a05:4d47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:4d80::,2a05:4d87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:4dc0::,2a05:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:4e00::,2a05:4e07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:4e40::,2a05:4e47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:4e80::,2a05:4e87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:4ec0::,2a05:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:4f00::,2a05:4f07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:4f40::,2a05:4f47:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a05:4fc0::,2a05:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5000::,2a05:5007:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5040::,2a05:5047:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:5080::,2a05:5080:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:50a0::,2a05:50a3:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:50c0::,2a05:50c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a05:5100::,2a05:5107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5140::,2a05:5147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:5180::,2a05:5187:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:51c0::,2a05:51c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:5200::,2a05:5207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5240::,2a05:5247:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5280::,2a05:5283:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:52a0::,2a05:52a3:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:52c0::,2a05:52c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5300::,2a05:5307:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:5340::,2a05:5347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:5380::,2a05:5387:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:53c0::,2a05:53c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5400::,2a05:5407:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:5440::,2a05:5447:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:5480::,2a05:5487:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:54c0::,2a05:54c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5500::,2a05:5507:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:5540::,2a05:5547:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a05:5580::,2a05:5587:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:55c0::,2a05:55c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a05:5600::,2a05:5607:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5640::,2a05:5647:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5680::,2a05:5687:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:56c0::,2a05:56c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5700::,2a05:5707:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:5740::,2a05:5747:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:5780::,2a05:5787:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:57c0::,2a05:57c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5800::,2a05:5807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5840::,2a05:5847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5880::,2a05:5887:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:58c0::,2a05:58c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5900::,2a05:5907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5940::,2a05:5947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5980::,2a05:5987:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:59c0::,2a05:59c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5a00::,2a05:5a07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5a40::,2a05:5a47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5a80::,2a05:5a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5ac0::,2a05:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:5b00::,2a05:5b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5b40::,2a05:5b47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5b80::,2a05:5b87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:5bc0::,2a05:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a05:5c00::,2a05:5c07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5c40::,2a05:5c47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5c80::,2a05:5c87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:5cc0::,2a05:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:5d00::,2a05:5d07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5d40::,2a05:5d47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:5d80::,2a05:5d87:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a05:5dc0::,2a05:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5e00::,2a05:5e07:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a05:5e40::,2a05:5e47:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:5e80::,2a05:5e87:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:5ec0::,2a05:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:5f00::,2a05:5f07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:5f40::,2a05:5f47:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:5f80::,2a05:5f87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5fc0::,2a05:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:6000::,2a05:6007:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a05:6040::,2a05:6047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6080::,2a05:6087:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:60c0::,2a05:60c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:6100::,2a05:6107:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:6140::,2a05:6147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6180::,2a05:6187:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:61c0::,2a05:61c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:6200::,2a05:6207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:6240::,2a05:6247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:6280::,2a05:6287:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a05:62c0::,2a05:62c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:6300::,2a05:6307:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a05:6340::,2a05:6347:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:6380::,2a05:6387:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:63c0::,2a05:63c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6400::,2a05:6407:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:6440::,2a05:6447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:6480::,2a05:6487:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:64c0::,2a05:64c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:6500::,2a05:6507:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:6540::,2a05:6547:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6580::,2a05:6587:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:65c0::,2a05:65c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:6600::,2a05:6607:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:6640::,2a05:6647:ffff:ffff:ffff:ffff:ffff:ffff,VA +2a05:6680::,2a05:6687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:6700::,2a05:6707:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:6740::,2a05:6747:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:6780::,2a05:6787:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:67c0::,2a05:67c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:6800::,2a05:6807:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:6840::,2a05:6847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6880::,2a05:6887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:68c0::,2a05:68c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:6900::,2a05:6907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6940::,2a05:6947:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:6980::,2a05:6987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:69c0::,2a05:69c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6a00::,2a05:6a07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:6a40::,2a05:6a47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6a80::,2a05:6a87:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:6ac0::,2a05:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:6b00::,2a05:6b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6b40::,2a05:6b47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:6b80::,2a05:6b87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:6bc0::,2a05:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:6c00::,2a05:6c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6c40::,2a05:6c47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6c80::,2a05:6c87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:6cc0::,2a05:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:6d40::,2a05:6d47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:6d80::,2a05:6d87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6dc0::,2a05:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:6e00::,2a05:6e07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:6e40::,2a05:6e47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6e80::,2a05:6e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6ec0::,2a05:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:6f00::,2a05:6f07:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a05:6f40::,2a05:6f47:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a05:6f80::,2a05:6f87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:6fc0::,2a05:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:7000::,2a05:7007:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:7040::,2a05:7047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7080::,2a05:7087:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:70c0::,2a05:70c7:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a05:7100::,2a05:7107:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:7140::,2a05:7147:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a05:7180::,2a05:7187:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:7200::,2a05:7207:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:7240::,2a05:7247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:7280::,2a05:7287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:72c0::,2a05:72c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7340::,2a05:7347:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a05:7380::,2a05:7387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:73c0::,2a05:73c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:7400::,2a05:7407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:7440::,2a05:7447:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:7480::,2a05:7487:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:74c0::,2a05:74c7:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a05:7500::,2a05:7507:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a05:7540::,2a05:7547:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a05:7580::,2a05:7587:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:75c0::,2a05:75c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:7600::,2a05:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7640::,2a05:7647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:7680::,2a05:7687:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:76c0::,2a05:76c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7700::,2a05:7707:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:7740::,2a05:7747:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a05:7780::,2a05:7787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:77c0::,2a05:77c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:7800::,2a05:7807:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a05:7840::,2a05:7847:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a05:78c0::,2a05:78c7:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a05:7900::,2a05:7907:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:7940::,2a05:7947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7980::,2a05:7987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:79c0::,2a05:79c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:7a00::,2a05:7a07:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a05:7a40::,2a05:7a47:ffff:ffff:ffff:ffff:ffff:ffff,YE +2a05:7a80::,2a05:7a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7ac0::,2a05:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:7b00::,2a05:7b07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:7b40::,2a05:7b47:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a05:7b80::,2a05:7b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7bc0::,2a05:7bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7c00::,2a05:7c07:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a05:7c40::,2a05:7c47:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a05:7c80::,2a05:7c87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7cc0::,2a05:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a05:7d00::,2a05:7d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7d40::,2a05:7d47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:7d80::,2a05:7d87:ffff:ffff:ffff:ffff:ffff:ffff,YE +2a05:7dc0::,2a05:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:7de0::,2a05:7de3:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:7e00::,2a05:7e07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:7e40::,2a05:7e47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:7e80::,2a05:7e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:7ec0::,2a05:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:7f00::,2a05:7f07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:7f40::,2a05:7f47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:7f80::,2a05:7f87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:8000::,2a05:8007:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:8040::,2a05:8047:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:8080::,2a05:8087:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:80c0::,2a05:80c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8100::,2a05:8107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:8140::,2a05:8147:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:8180::,2a05:8187:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:81c0::,2a05:81c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:8200::,2a05:8207:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a05:8240::,2a05:8247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:8280::,2a05:8287:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:82c0::,2a05:82c7:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a05:8300::,2a05:8307:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a05:8340::,2a05:8347:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a05:8380::,2a05:8387:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:83c0::,2a05:83c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:8400::,2a05:8407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:8440::,2a05:8447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8480::,2a05:8487:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a05:84c0::,2a05:84c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:8500::,2a05:8507:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a05:8540::,2a05:8547:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:8580::,2a05:8587:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:85c0::,2a05:85c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:8600::,2a05:8607:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:8640::,2a05:8647:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:86c0::,2a05:86c7:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a05:8700::,2a05:8707:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a05:8740::,2a05:8747:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:8780::,2a05:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:87c0::,2a05:87c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8800::,2a05:8807:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:8840::,2a05:8847:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:8880::,2a05:8883:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:88a0::,2a05:88a3:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:88c0::,2a05:88c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:8900::,2a05:8907:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:8940::,2a05:8947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8980::,2a05:8987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:89c0::,2a05:89c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8a00::,2a05:8a07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:8a40::,2a05:8a47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8a80::,2a05:8a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8ac0::,2a05:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:8b00::,2a05:8b07:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:8b40::,2a05:8b47:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a05:8b80::,2a05:8b87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:8c00::,2a05:8c07:ffff:ffff:ffff:ffff:ffff:ffff,GI +2a05:8c40::,2a05:8c47:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:8c80::,2a05:8c87:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:8cc0::,2a05:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:8d00::,2a05:8d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8d40::,2a05:8d47:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a05:8d80::,2a05:8d87:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:8dc0::,2a05:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8e00::,2a05:8e07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:8e40::,2a05:8e47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:8e80::,2a05:8e87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8ec0::,2a05:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:8f00::,2a05:8f07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:8f40::,2a05:8f47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:8f80::,2a05:8f87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:8fc0::,2a05:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a05:9000::,2a05:9007:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a05:9040::,2a05:9047:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:9080::,2a05:9087:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:90c0::,2a05:90c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:9100::,2a05:9107:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:9140::,2a05:9147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:9180::,2a05:9187:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:91c0::,2a05:91c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:9200::,2a05:9207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:9240::,2a05:9247:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:9280::,2a05:9287:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:92c0::,2a05:92c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:9340::,2a05:9347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:93c0::,2a05:93c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:9400::,2a05:9407:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:9440::,2a05:9447:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:94c0::,2a05:94c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:9500::,2a05:9507:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:9540::,2a05:9547:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:9580::,2a05:9587:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a05:95c0::,2a05:95c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:9600::,2a05:9607:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:9680::,2a05:9687:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:96c0::,2a05:96c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:9700::,2a05:9707:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:9740::,2a05:9747:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:9780::,2a05:9787:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:97c0::,2a05:97c7:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a05:9800::,2a05:9807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:9840::,2a05:9847:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:9880::,2a05:9887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:98c0::,2a05:98c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:9900::,2a05:9907:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a05:9940::,2a05:9947:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:9980::,2a05:9987:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:99c0::,2a05:99c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:9a00::,2a05:9a07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:9a80::,2a05:9a87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:9ac0::,2a05:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:9b00::,2a05:9b07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:9b40::,2a05:9b47:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a05:9b80::,2a05:9b87:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:9bc0::,2a05:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:9c40::,2a05:9c47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:9c80::,2a05:9c87:ffff:ffff:ffff:ffff:ffff:ffff,US +2a05:9cc0::,2a05:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:9d00::,2a05:9d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:9d40::,2a05:9d47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:9d80::,2a05:9d87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:9dc0::,2a05:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:9e00::,2a05:9e07:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a05:9e40::,2a05:9e47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:9e80::,2a05:9e87:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:9ec0::,2a05:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:9f00::,2a05:9f07:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a05:9f80::,2a05:9f87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:9fc0::,2a05:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:a000::,2a05:a007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:a040::,2a05:a047:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a05:a080::,2a05:a087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:a0c0::,2a05:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:a100::,2a05:a107:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a05:a140::,2a05:a147:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:a180::,2a05:a187:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:a1c0::,2a05:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:a200::,2a05:a207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:a240::,2a05:a247:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:a280::,2a05:a287:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:a2c0::,2a05:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a05:a300::,2a05:a307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:a340::,2a05:a347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:a380::,2a05:a387:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:a3c0::,2a05:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:a400::,2a05:a407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:a440::,2a05:a447:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:a480::,2a05:a487:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:a4c0::,2a05:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:a500::,2a05:a507:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:a540::,2a05:a547:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:a580::,2a05:a587:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:a5c0::,2a05:a5c7:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a05:a600::,2a05:a607:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:a640::,2a05:a647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:a680::,2a05:a687:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:a6c0::,2a05:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:a700::,2a05:a707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:a740::,2a05:a747:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:a780::,2a05:a787:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:a7c0::,2a05:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:a800::,2a05:a807:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:a840::,2a05:a847:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:a880::,2a05:a887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:a8c0::,2a05:a8c7:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a05:a900::,2a05:a907:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:a940::,2a05:a947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:a980::,2a05:a987:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:aa00::,2a05:aa07:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a05:aa40::,2a05:aa47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:aa80::,2a05:aa87:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:aac0::,2a05:aac7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:ab00::,2a05:ab07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:ab40::,2a05:ab47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:ab80::,2a05:ab87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:abc0::,2a05:abc7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:ac00::,2a05:ac07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:ac40::,2a05:ac47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:ac80::,2a05:ac87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:acc0::,2a05:acc7:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a05:ad00::,2a05:ad07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:ad40::,2a05:ad47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:ad80::,2a05:ad87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:adc0::,2a05:adc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:ae00::,2a05:ae07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:ae40::,2a05:ae47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:ae80::,2a05:ae87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:aec0::,2a05:aec7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:af00::,2a05:af07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:af40::,2a05:af47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:afc0::,2a05:afc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:b000::,2a05:b007:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:b040::,2a05:b047:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:b080::,2a05:b087:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:b0c0::,2a05:b0c6:1ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:b0c6:200::,2a05:b0c6:2ff:ffff:ffff:ffff:ffff:ffff,US +2a05:b0c6:300::,2a05:b0c6:4ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:b0c6:500::,2a05:b0c6:5ff:ffff:ffff:ffff:ffff:ffff,DE +2a05:b0c6:600::,2a05:b0c6:6ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:b0c6:700::,2a05:b0c6:7ff:ffff:ffff:ffff:ffff:ffff,AT +2a05:b0c6:800::,2a05:b0c6:13ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:b0c6:1400::,2a05:b0c6:14ff:ffff:ffff:ffff:ffff:ffff,AT +2a05:b0c6:1500::,2a05:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:b100::,2a05:b107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:b140::,2a05:b147:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:b180::,2a05:b187:ffff:ffff:ffff:ffff:ffff:ffff,GI +2a05:b200::,2a05:b207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:b240::,2a05:b247:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:b280::,2a05:b287:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:b2c0::,2a05:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:b300::,2a05:b307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:b340::,2a05:b347:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:b380::,2a05:b387:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:b3c0::,2a05:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:b440::,2a05:b447:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:b480::,2a05:b487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:b4c0::,2a05:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a05:b500::,2a05:b507:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:b540::,2a05:b547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:b580::,2a05:b587:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:b5c0::,2a05:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:b600::,2a05:b607:ffff:ffff:ffff:ffff:ffff:ffff,SM +2a05:b640::,2a05:b647:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:b680::,2a05:b687:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:b700::,2a05:b707:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:b740::,2a05:b747:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:b780::,2a05:b787:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:b7c0::,2a05:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:b800::,2a05:b807:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:b840::,2a05:b847:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:b880::,2a05:b887:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:b8c0::,2a05:b8c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:b900::,2a05:b907:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:b940::,2a05:b947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:b980::,2a05:b987:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:b9c0::,2a05:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:ba00::,2a05:ba07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:ba40::,2a05:ba47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:ba80::,2a05:ba87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:bac0::,2a05:bac7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:bb00::,2a05:bb07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:bb40::,2a05:bb47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:bb80::,2a05:bb87:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a05:bbc0::,2a05:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:bc00::,2a05:bc07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:bcc0::,2a05:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:bd00::,2a05:bd07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:bd40::,2a05:bd47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:bd80::,2a05:bd87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:bdc0::,2a05:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:be00::,2a05:be07:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:be40::,2a05:be47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:bec0::,2a05:bec7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:bf00::,2a05:bf07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:bf40::,2a05:bf47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:bf80::,2a05:bf87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:bfc0::,2a05:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:c040::,2a05:c047:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:c080::,2a05:c087:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:c0c0::,2a05:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:c100::,2a05:c107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:c140::,2a05:c147:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:c180::,2a05:c187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:c200::,2a05:c207:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:c280::,2a05:c287:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:c2c0::,2a05:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:c300::,2a05:c307:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:c340::,2a05:c347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:c380::,2a05:c387:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:c3c0::,2a05:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:c480::,2a05:c487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:c4c0::,2a05:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:c500::,2a05:c507:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:c540::,2a05:c547:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:c580::,2a05:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:c5c0::,2a05:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:c600::,2a05:c607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:c640::,2a05:c647:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:c680::,2a05:c687:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:c6c0::,2a05:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:c700::,2a05:c707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:c740::,2a05:c747:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:c7c0::,2a05:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:c800::,2a05:c807:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a05:c840::,2a05:c847:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a05:c880::,2a05:c887:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a05:c8c0::,2a05:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:c900::,2a05:c907:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:c940::,2a05:c947:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:c980::,2a05:c987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:c9c0::,2a05:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:ca00::,2a05:ca07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:ca40::,2a05:ca47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:ca80::,2a05:ca87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:cac0::,2a05:cac7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:cb00::,2a05:cb07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:cb40::,2a05:cb47:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:cb80::,2a05:cb87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:cbc0::,2a05:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:cc00::,2a05:cc07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:cc40::,2a05:cc47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:cc80::,2a05:cc87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:ccc0::,2a05:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:cd00::,2a05:cd07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:cd80::,2a05:cd87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:cdc0::,2a05:cdc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:ce00::,2a05:ce07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:ce40::,2a05:ce47:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:ce80::,2a05:ce87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:cec0::,2a05:cec7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:cf00::,2a05:cf07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:cf40::,2a05:cf47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:cf80::,2a05:cf87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:cfc0::,2a05:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:d000::,2a05:d000:1fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d000:2000::,2a05:d000:20ff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d000:2100::,2a05:d000:3fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d000:4000::,2a05:d000:40ff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d000:4100::,2a05:d000:bfff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d000:c000::,2a05:d000:c0ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d000:c100::,2a05:d011:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d012::,2a05:d012:fff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d012:1000::,2a05:d013:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d014::,2a05:d014:fff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d014:1000::,2a05:d01b:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d01c::,2a05:d01c:fff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d01c:1000::,2a05:d050:1fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d050:2000::,2a05:d050:20ff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d050:2100::,2a05:d050:3fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d050:4000::,2a05:d050:40ff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d050:4100::,2a05:d050:bfff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d050:c000::,2a05:d050:c0ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d050:c100::,2a05:d078:1fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d078:2000::,2a05:d078:20ff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d078:2100::,2a05:d078:3fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d078:4000::,2a05:d078:40ff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d078:4100::,2a05:d078:bfff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d078:c000::,2a05:d078:c0ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d078:c100::,2a05:d079:1fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d079:2000::,2a05:d079:20ff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d079:2100::,2a05:d079:3fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d079:4000::,2a05:d079:40ff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d079:4100::,2a05:d079:bfff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d079:c000::,2a05:d079:c0ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d079:c100::,2a05:d07a:1fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07a:2000::,2a05:d07a:20ff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d07a:2100::,2a05:d07a:3fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07a:4000::,2a05:d07a:40ff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d07a:4100::,2a05:d07a:bfff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07a:c000::,2a05:d07a:c0ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d07a:c100::,2a05:d07c:1fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07c:2000::,2a05:d07c:20ff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d07c:2100::,2a05:d07c:3fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07c:4000::,2a05:d07c:40ff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d07c:4100::,2a05:d07c:bfff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07c:c000::,2a05:d07c:c0ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d07c:c100::,2a05:d07e:1fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07e:2000::,2a05:d07e:20ff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d07e:2100::,2a05:d07e:3fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07e:4000::,2a05:d07e:40ff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d07e:4100::,2a05:d07e:bfff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07e:c000::,2a05:d07e:c0ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d07e:c100::,2a05:d07f:1fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07f:2000::,2a05:d07f:20ff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d07f:2100::,2a05:d07f:3fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07f:4000::,2a05:d07f:40ff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d07f:4100::,2a05:d07f:bfff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07f:c000::,2a05:d07f:c0ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d07f:c100::,2a05:d07f:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d400::,2a05:d407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:d440::,2a05:d447:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:d480::,2a05:d487:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:d4c0::,2a05:d4c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d500::,2a05:d507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d540::,2a05:d547:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:d580::,2a05:d587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d5c0::,2a05:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a05:d600::,2a05:d607:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:d640::,2a05:d647:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a05:d680::,2a05:d687:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:d6c0::,2a05:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:d740::,2a05:d747:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:d780::,2a05:d787:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:d7c0::,2a05:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a05:d800::,2a05:d807:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a05:d840::,2a05:d847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d880::,2a05:d887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d900::,2a05:d907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:d940::,2a05:d947:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:d980::,2a05:d987:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d9c0::,2a05:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:da00::,2a05:da07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:da40::,2a05:da47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:da80::,2a05:da87:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:dac0::,2a05:dac7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:db00::,2a05:db07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:db40::,2a05:db47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:db80::,2a05:db87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:dbc0::,2a05:dbc7:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a05:dc00::,2a05:dc07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:dc40::,2a05:dc47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:dc80::,2a05:dc87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:dcc0::,2a05:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:dd00::,2a05:dd07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:dd40::,2a05:dd47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:dd80::,2a05:dd87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:ddc0::,2a05:ddc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:de00::,2a05:de07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:de40::,2a05:de47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:de80::,2a05:de87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:dec0::,2a05:dec7:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a05:df00::,2a05:df07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:df40::,2a05:df47:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a05:df80::,2a05:df87:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a05:dfc0::,2a05:dfc0:1ee3:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc0:1ee4::,2a05:dfc0:1ee4:ffff:ffff:ffff:ffff:ffff,CA +2a05:dfc0:1ee5::,2a05:dfc0:6938:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc0:6939::,2a05:dfc0:6939:ffff:ffff:ffff:ffff:ffff,NL +2a05:dfc0:693a::,2a05:dfc7:4:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:5::,2a05:dfc7:5:ffff:ffff:ffff:ffff:ffff,AQ +2a05:dfc7:6::,2a05:dfc7:7:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:8::,2a05:dfc7:8:7fff:ffff:ffff:ffff:ffff,SG +2a05:dfc7:8:8000::,2a05:dfc7:f:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:10::,2a05:dfc7:10:ffff:ffff:ffff:ffff:ffff,NL +2a05:dfc7:11::,2a05:dfc7:19:ffff:ffff:ffff:ffff:ffff,CH +2a05:dfc7:1a::,2a05:dfc7:1a::,AT +2a05:dfc7:1a::1,2a05:dfc7:1f:ffff:ffff:ffff:ffff:ffff,CH +2a05:dfc7:20::,2a05:dfc7:2f:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:30::,2a05:dfc7:30:ffff:ffff:ffff:ffff:ffff,US +2a05:dfc7:31::,2a05:dfc7:3f:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:40::,2a05:dfc7:40:ffff:ffff:ffff:ffff:ffff,BY +2a05:dfc7:41::,2a05:dfc7:5352:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:5353::,2a05:dfc7:5353:ffff:ffff:ffff:ffff:ffff,AQ +2a05:dfc7:5354::,2a05:dfc7:beee:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:beef::,2a05:dfc7:beef:ffff:ffff:ffff:ffff:ffff,AQ +2a05:dfc7:bef0::,2a05:dfc7:dfc6:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:dfc7::,2a05:dfc7:dfc7:ffff:ffff:ffff:ffff:ffff,UA +2a05:dfc7:dfc8::,2a05:dfc7:dfc8:ffff:ffff:ffff:ffff:ffff,US +2a05:dfc7:dfc9::,2a05:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:e000::,2a05:e007:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:e040::,2a05:e047:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a05:e080::,2a05:e087:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:e0c0::,2a05:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:e100::,2a05:e107:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:e140::,2a05:e147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:e180::,2a05:e187:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:e1c0::,2a05:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:e200::,2a05:e207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:e240::,2a05:e247:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:e280::,2a05:e287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:e2c0::,2a05:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:e300::,2a05:e307:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a05:e340::,2a05:e347:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:e380::,2a05:e387:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:e3c0::,2a05:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:e400::,2a05:e407:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:e440::,2a05:e447:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:e480::,2a05:e487:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:e4c0::,2a05:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:e500::,2a05:e507:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a05:e540::,2a05:e547:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:e580::,2a05:e587:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:e5c0::,2a05:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:e640::,2a05:e647:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:e680::,2a05:e687:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:e6c0::,2a05:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:e700::,2a05:e707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:e740::,2a05:e747:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:e780::,2a05:e787:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:e7c0::,2a05:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:e800::,2a05:e807:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a05:e840::,2a05:e847:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:e880::,2a05:e887:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:e8c0::,2a05:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:e940::,2a05:e947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:e980::,2a05:e987:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:e9c0::,2a05:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:ea00::,2a05:ea07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:ea40::,2a05:ea47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:ea80::,2a05:ea87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:eb20::,2a05:eb23:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:eb40::,2a05:eb47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:eb80::,2a05:eb87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:ebc0::,2a05:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:ec00::,2a05:ec07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:ec40::,2a05:ec47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:ec80::,2a05:ec87:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a05:ecc0::,2a05:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:ed00::,2a05:ed07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:ed40::,2a05:ed47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:ed80::,2a05:ed87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:edc0::,2a05:edc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:ee00::,2a05:ee07:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a05:ee40::,2a05:ee47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:ee80::,2a05:ee87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:ef00::,2a05:ef07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:ef40::,2a05:ef47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:ef80::,2a05:ef87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:efc0::,2a05:efc7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:f000::,2a05:f007:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:f040::,2a05:f047:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a05:f080::,2a05:f087:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:f0c0::,2a05:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:f100::,2a05:f107:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:f140::,2a05:f147:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a05:f180::,2a05:f187:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:f1c0::,2a05:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:f200::,2a05:f207:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a05:f240::,2a05:f247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:f280::,2a05:f287:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:f2c0::,2a05:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:f300::,2a05:f307:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:f340::,2a05:f347:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:f380::,2a05:f387:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:f3c0::,2a05:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:f400::,2a05:f407:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:f440::,2a05:f447:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:f480::,2a05:f487:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:f4c0::,2a05:f4c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:f500::,2a05:f507:1:ffff:ffff:ffff:ffff:ffff,IE +2a05:f507:2::,2a05:f507:2:7fff:ffff:ffff:ffff:ffff,DE +2a05:f507:2:8000::,2a05:f507:2:ffff:ffff:ffff:ffff:ffff,IE +2a05:f507:3::,2a05:f507:3:7fff:ffff:ffff:ffff:ffff,ES +2a05:f507:3:8000::,2a05:f507:5:ffff:ffff:ffff:ffff:ffff,IE +2a05:f507:6::,2a05:f507:6:7fff:ffff:ffff:ffff:ffff,GB +2a05:f507:6:8000::,2a05:f507:8:ffff:ffff:ffff:ffff:ffff,IE +2a05:f507:9::,2a05:f507:9:7fff:ffff:ffff:ffff:ffff,FR +2a05:f507:9:8000::,2a05:f507:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:f540::,2a05:f547:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:f580::,2a05:f587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:f5c0::,2a05:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a05:f600::,2a05:f607:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:f640::,2a05:f647:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:f6c0::,2a05:f6c2:4837:ffff:ffff:ffff:ffff:ffff,DK +2a05:f6c2:4838::,2a05:f6c2:4838:7fff:ffff:ffff:ffff:ffff,SE +2a05:f6c2:4838:8000::,2a05:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:f700::,2a05:f707:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:f740::,2a05:f747:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:f780::,2a05:f787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:f7c0::,2a05:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:f800::,2a05:f807:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:f840::,2a05:f847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:f900::,2a05:f907:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:f940::,2a05:f947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:f980::,2a05:f987:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:f9c0::,2a05:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:fa00::,2a05:fa07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:fa40::,2a05:fa47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:fac0::,2a05:fac7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:fb00::,2a05:fb07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:fb40::,2a05:fb47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:fb80::,2a05:fb87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:fbc0::,2a05:fbc3:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:fbe0::,2a05:fbe3:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:fc00::,2a05:fc07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:fc40::,2a05:fc47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:fc80::,2a05:fc87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:fcc0::,2a05:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:fd00::,2a05:fd07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:fd40::,2a05:fd47:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:fd80::,2a05:fd87:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:fdc0::,2a05:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a05:fe00::,2a05:fe07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:fe40::,2a05:fe47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:fe80::,2a05:fe87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:ff00::,2a05:ff07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:ff40::,2a05:ff47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:ff80::,2a05:ff87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:ffc0::,2a05:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06::,2a06:7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:40::,2a06:47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:80::,2a06:87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:c0::,2a06:c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:100::,2a06:107:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:140::,2a06:147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:180::,2a06:187:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a06:1c0::,2a06:1c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:200::,2a06:207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:240::,2a06:247:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a06:280::,2a06:287:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a06:2c0::,2a06:2c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:300::,2a06:307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:340::,2a06:347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:380::,2a06:387:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:3c0::,2a06:3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:400::,2a06:407:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:440::,2a06:447:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:480::,2a06:487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:4c0::,2a06:4c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:500::,2a06:507:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:540::,2a06:547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:580::,2a06:587:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a06:5c0::,2a06:5c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:600::,2a06:607:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a06:640::,2a06:647:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:680::,2a06:687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:6c0::,2a06:6c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:700::,2a06:707:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:740::,2a06:747:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:780::,2a06:787:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a06:7c0::,2a06:7c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:800::,2a06:807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:840::,2a06:847:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:880::,2a06:887:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:8c0::,2a06:8c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:900::,2a06:907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:940::,2a06:947:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a06:980::,2a06:987:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:9c0::,2a06:9c7:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a06:a00::,2a06:a07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:a40::,2a06:a47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:a80::,2a06:a87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:ac0::,2a06:ac7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:b00::,2a06:b07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:b40::,2a06:b47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:b80::,2a06:b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:c00::,2a06:c07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:c40::,2a06:c47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:c80::,2a06:c87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:cc0::,2a06:cc7:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a06:d00::,2a06:d07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:d40::,2a06:d47:ffff:ffff:ffff:ffff:ffff:ffff,US +2a06:d80::,2a06:d87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:dc0::,2a06:dc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:e00::,2a06:e07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:e40::,2a06:e47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:e80::,2a06:e87:ffff:ffff:ffff:ffff:ffff:ffff,IN +2a06:ec0::,2a06:ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:f00::,2a06:f07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:f40::,2a06:f47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:f80::,2a06:f87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:fc0::,2a06:fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:1000::,2a06:1007:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:1040::,2a06:1047:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:1080::,2a06:1087:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:10c0::,2a06:10c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:1100::,2a06:1107:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a06:1180::,2a06:1187:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a06:11c0::,2a06:11c0:f:ffff:ffff:ffff:ffff:ffff,GB +2a06:11c0:10::,2a06:11c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:1200::,2a06:1207:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:1240::,2a06:1247:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:1280::,2a06:1280:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2a06:1281::,2a06:1287:1f:ffff:ffff:ffff:ffff:ffff,BY +2a06:1287:20::,2a06:1287:2f:ffff:ffff:ffff:ffff:ffff,AT +2a06:1287:30::,2a06:1287:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a06:12c0::,2a06:12c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:1300::,2a06:1307:ffff:ffff:ffff:ffff:ffff:ffff,NC +2a06:1340::,2a06:1347:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:1380::,2a06:1387:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:13c0::,2a06:13c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:1400::,2a06:1407:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:1440::,2a06:1447:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:1480::,2a06:1487:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:1500::,2a06:1507:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:1540::,2a06:1547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:1580::,2a06:1587:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a06:15c0::,2a06:15c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:1640::,2a06:1647:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:1680::,2a06:1687:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:16c0::,2a06:16c7:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a06:1700::,2a06:1707:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:1740::,2a06:1747:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:1780::,2a06:1787:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a06:17c0::,2a06:17c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:1800::,2a06:1807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:1840::,2a06:1847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:1880::,2a06:1887:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:18c0::,2a06:18c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:1900::,2a06:1907:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:1940::,2a06:1947:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a06:1980::,2a06:1987:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:19c0::,2a06:19c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:1a00::,2a06:1a07:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a06:1a40::,2a06:1a47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:1a80::,2a06:1a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:1ac0::,2a06:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:1b00::,2a06:1b07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:1b40::,2a06:1b47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:1b80::,2a06:1b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:1bc0::,2a06:1bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:1c00::,2a06:1c07:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a06:1c40::,2a06:1c47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:1c80::,2a06:1c87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:1cc0::,2a06:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:1d00::,2a06:1d07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:1d40::,2a06:1d47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:1d80::,2a06:1d87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:1dc0::,2a06:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:1e00::,2a06:1e07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:1e40::,2a06:1e47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:1e80::,2a06:1e87:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a06:1ec0::,2a06:1ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:1f00::,2a06:1f07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:1f40::,2a06:1f47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:1f80::,2a06:1f87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:1fc0::,2a06:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:2000::,2a06:2007:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a06:2040::,2a06:2047:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:2080::,2a06:2087:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:20c0::,2a06:20c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:2100::,2a06:2107:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a06:2140::,2a06:2147:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:21c0::,2a06:21c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:2240::,2a06:2247:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:2280::,2a06:2287:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:22c0::,2a06:22c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:2300::,2a06:2307:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:2340::,2a06:2347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:2380::,2a06:2387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:23c0::,2a06:23c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:2400::,2a06:2407:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:2480::,2a06:2487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:24c0::,2a06:24c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:2500::,2a06:2507:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:2540::,2a06:2547:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:2580::,2a06:2587:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:25c0::,2a06:25c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:25c1::,2a06:25c1::ffff:ffff:ffff:ffff:ffff,US +2a06:25c1:1::,2a06:25c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:2600::,2a06:2600:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:2601::,2a06:2601:ffff:ffff:ffff:ffff:ffff:ffff,US +2a06:2602::,2a06:2607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:2640::,2a06:2647:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:2680::,2a06:2687:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:2700::,2a06:2707:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:2740::,2a06:2747:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:2780::,2a06:2787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:27c0::,2a06:27c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:2800::,2a06:2807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:2840::,2a06:2847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:2880::,2a06:2887:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:28c0::,2a06:28c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:2900::,2a06:2907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:2940::,2a06:2947:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:2980::,2a06:2987:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:29c0::,2a06:29c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:2a00::,2a06:2a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:2a40::,2a06:2a47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:2a80::,2a06:2a87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:2ac0::,2a06:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:2b00::,2a06:2b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:2b40::,2a06:2b47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:2bc0::,2a06:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:2c00::,2a06:2c07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:2c40::,2a06:2c47:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a06:2c80::,2a06:2c87:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:2cc0::,2a06:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:2d00::,2a06:2d07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:2d40::,2a06:2d47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:2d80::,2a06:2d87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:2dc0::,2a06:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:2e00::,2a06:2e05:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:2e06::,2a06:2e06:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:2e07::,2a06:2e07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:2e40::,2a06:2e47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:2e80::,2a06:2e87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:2ec0::,2a06:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:2f00::,2a06:2f07:ffff:ffff:ffff:ffff:ffff:ffff,QA +2a06:2f40::,2a06:2f47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:2f80::,2a06:2f87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:2fc0::,2a06:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:3000::,2a06:3007:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:3040::,2a06:3047:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a06:3080::,2a06:3087:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:30c0::,2a06:30c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:3100::,2a06:3107:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:3140::,2a06:3147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:3180::,2a06:3187:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a06:31c0::,2a06:31c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:3200::,2a06:3207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:3240::,2a06:3247:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:3280::,2a06:3287:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:32c0::,2a06:32c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:3300::,2a06:3307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:3340::,2a06:3347:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:3380::,2a06:3387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:3400::,2a06:3407:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:3480::,2a06:3487:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a06:34c0::,2a06:34c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:3500::,2a06:3507:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a06:3540::,2a06:3547:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:3580::,2a06:3587:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:35c0::,2a06:35c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:3600::,2a06:3607:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:3640::,2a06:3647:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:3680::,2a06:3687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:36c0::,2a06:36c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:3700::,2a06:3707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:3740::,2a06:3747:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:3780::,2a06:3787:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:37c0::,2a06:37c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:3800::,2a06:3807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:3840::,2a06:3847:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a06:3880::,2a06:3887:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:38c0::,2a06:38c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:3940::,2a06:3947:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:3980::,2a06:3987:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:3a00::,2a06:3a07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:3a40::,2a06:3a47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:3a80::,2a06:3a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:3ac0::,2a06:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a06:3b00::,2a06:3b07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:3b40::,2a06:3b47:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a06:3b80::,2a06:3b87:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a06:3bc0::,2a06:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:3c00::,2a06:3c07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:3c40::,2a06:3c47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:3c80::,2a06:3c87:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a06:3cc0::,2a06:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:3d00::,2a06:3d07:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a06:3d40::,2a06:3d47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:3d80::,2a06:3d87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:3dc0::,2a06:3dc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:3e00::,2a06:3e07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:3e40::,2a06:3e47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:3e80::,2a06:3e80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:3e81::,2a06:3e81::ffff:ffff:ffff:ffff:ffff,US +2a06:3e81:1::,2a06:3e86:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:3e87::,2a06:3e87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:3ec0::,2a06:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:3f00::,2a06:3f07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:3f40::,2a06:3f47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:3f80::,2a06:3f87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:3fc0::,2a06:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:4000::,2a06:4007:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:4040::,2a06:4047:ff:ffff:ffff:ffff:ffff:ffff,DK +2a06:4047:100::,2a06:4047:100:ffff:ffff:ffff:ffff:ffff,US +2a06:4047:101::,2a06:4047:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:4080::,2a06:4087:ff:ffff:ffff:ffff:ffff:ffff,ES +2a06:4087:100::,2a06:4087:100:ffff:ffff:ffff:ffff:ffff,US +2a06:4087:101::,2a06:4087:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:40c0::,2a06:40c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:4100::,2a06:4107:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:4140::,2a06:4147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:4180::,2a06:4187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:41c0::,2a06:41c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:4200::,2a06:4207:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a06:4240::,2a06:4247:ffff:ffff:ffff:ffff:ffff:ffff,QA +2a06:4280::,2a06:4287:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:42c0::,2a06:42c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:4300::,2a06:4307:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:4340::,2a06:4347:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a06:4380::,2a06:4387:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:43c0::,2a06:43c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:4400::,2a06:4407:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:4440::,2a06:4447:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:4480::,2a06:4487:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:44c0::,2a06:44c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:4500::,2a06:4507:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:4540::,2a06:4547:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:4580::,2a06:4587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:45c0::,2a06:45c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:4600::,2a06:4607:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:4680::,2a06:4687:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:46c0::,2a06:46c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:4700::,2a06:4707:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:4740::,2a06:4747:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:47c0::,2a06:47c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:4840::,2a06:4847:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a06:48c0::,2a06:48c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:4900::,2a06:4907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:4940::,2a06:4947:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a06:4980::,2a06:4987:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a06:49c0::,2a06:49c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:4a00::,2a06:4a07:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a06:4a40::,2a06:4a47:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:4a80::,2a06:4a87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:4ac0::,2a06:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:4b00::,2a06:4b07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:4b40::,2a06:4b47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:4b80::,2a06:4b87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:4bc0::,2a06:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:4c00::,2a06:4c00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:4c01::,2a06:4c01::ffff:ffff:ffff:ffff:ffff,US +2a06:4c01:1::,2a06:4c07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:4c40::,2a06:4c47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:4c80::,2a06:4c87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:4cc0::,2a06:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:4d00::,2a06:4d07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:4d40::,2a06:4d47:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a06:4d80::,2a06:4d87:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:4dc0::,2a06:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:4e00::,2a06:4e07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:4e40::,2a06:4e47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:4e80::,2a06:4e87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:4ec0::,2a06:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:4f00::,2a06:4f07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:4f40::,2a06:4f47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:4f80::,2a06:4f87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:4fc0::,2a06:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a06:5000::,2a06:5007:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:5040::,2a06:5047:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:5080::,2a06:5087:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a06:50c0::,2a06:50c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:5100::,2a06:5107:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:5140::,2a06:5147:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:5180::,2a06:5187:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:51c0::,2a06:51c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:5200::,2a06:5207:ff:ffff:ffff:ffff:ffff:ffff,IE +2a06:5207:100::,2a06:5207:100:ffff:ffff:ffff:ffff:ffff,US +2a06:5207:101::,2a06:5207:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a06:5240::,2a06:5247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:5280::,2a06:5287:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:5300::,2a06:5307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:5340::,2a06:5347:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:5380::,2a06:5387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:53c0::,2a06:53c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:5400::,2a06:5407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:5440::,2a06:5447:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:5480::,2a06:5487:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:54c0::,2a06:54c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:5500::,2a06:5507:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:5540::,2a06:5547:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a06:5580::,2a06:5587:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a06:55c0::,2a06:55c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:5600::,2a06:5607:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:5640::,2a06:5647:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:5680::,2a06:5687:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:56c0::,2a06:56c0:10:ffff:ffff:ffff:ffff:ffff,CH +2a06:56c0:11::,2a06:56c0:11:7fff:ffff:ffff:ffff:ffff,EE +2a06:56c0:11:8000::,2a06:56c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:5700::,2a06:5707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:5740::,2a06:5747:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a06:5780::,2a06:5787:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:5800::,2a06:5807:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:5840::,2a06:5847:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:5880::,2a06:5887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:58c0::,2a06:58c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:5900::,2a06:5907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:5940::,2a06:5947:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:5980::,2a06:5987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:59c0::,2a06:59c7:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a06:5a00::,2a06:5a07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:5a40::,2a06:5a47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:5a80::,2a06:5a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:5ac0::,2a06:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:5b00::,2a06:5b07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:5b40::,2a06:5b47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:5b80::,2a06:5b87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:5bc0::,2a06:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:5c40::,2a06:5c47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:5c80::,2a06:5c87:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a06:5cc0::,2a06:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:5d00::,2a06:5d07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:5d40::,2a06:5d47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:5d80::,2a06:5d87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:5dc0::,2a06:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:5e00::,2a06:5e07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:5e40::,2a06:5e47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:5e80::,2a06:5e87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:5ec0::,2a06:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a06:5f00::,2a06:5f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:5f80::,2a06:5f87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:5fc0::,2a06:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:6000::,2a06:6007:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:6040::,2a06:6047:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:6080::,2a06:6087:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:60c0::,2a06:60c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:6100::,2a06:6107:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:6140::,2a06:6147:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:6180::,2a06:6187:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:61c0::,2a06:61c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:6200::,2a06:6207:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:6240::,2a06:6247:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:6280::,2a06:6287:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:62c0::,2a06:62c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:6300::,2a06:6307:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:6340::,2a06:6347:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:6380::,2a06:6387:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:63c0::,2a06:63c7:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a06:6400::,2a06:6407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:6440::,2a06:6447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:6480::,2a06:6487:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:64c0::,2a06:64c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:6500::,2a06:6507:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:6540::,2a06:6547:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:6580::,2a06:6587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:65c0::,2a06:65c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:6600::,2a06:6607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:6640::,2a06:6647:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:6680::,2a06:6687:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:66c0::,2a06:66c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:6700::,2a06:6707:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:6740::,2a06:6747:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:6780::,2a06:6787:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a06:67c0::,2a06:67c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:6800::,2a06:6807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:6840::,2a06:6847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:6880::,2a06:6887:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:68c0::,2a06:68c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:6900::,2a06:6907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:6940::,2a06:6947:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:6980::,2a06:6987:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:69c0::,2a06:69c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:6a00::,2a06:6a07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:6a40::,2a06:6a47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:6ac0::,2a06:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:6b00::,2a06:6b07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:6b80::,2a06:6b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:6bc0::,2a06:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a06:6c00::,2a06:6c07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:6c80::,2a06:6c87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:6cc0::,2a06:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:6d00::,2a06:6d07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:6d40::,2a06:6d47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:6d80::,2a06:6d87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:6dc0::,2a06:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:6e00::,2a06:6e07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:6e40::,2a06:6e47:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a06:6e80::,2a06:6e87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:6ec0::,2a06:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:6f00::,2a06:6f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:6f40::,2a06:6f47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:6f80::,2a06:6f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:6fc0::,2a06:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a06:7000::,2a06:7007:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:7040::,2a06:7047:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:7080::,2a06:7087:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a06:70c0::,2a06:70c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:7100::,2a06:7107:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:7140::,2a06:7147:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:7180::,2a06:7187:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:71c0::,2a06:71c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:7200::,2a06:7207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:7240::,2a06:7240:2:ffff:ffff:ffff:ffff:ffff,AT +2a06:7240:3::,2a06:7240:3:ffff:ffff:ffff:ffff:ffff,GB +2a06:7240:4::,2a06:7240:4:ffff:ffff:ffff:ffff:ffff,AT +2a06:7240:5::,2a06:7240:6:ffff:ffff:ffff:ffff:ffff,NL +2a06:7240:7::,2a06:7242:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:7243::,2a06:7243:1f:ffff:ffff:ffff:ffff:ffff,TR +2a06:7243:20::,2a06:7247:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:7280::,2a06:7287:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:72c0::,2a06:72c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:7300::,2a06:7307:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:7340::,2a06:7347:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:7380::,2a06:7387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:73c0::,2a06:73c7:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a06:7400::,2a06:7407:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:7440::,2a06:7447:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:7480::,2a06:7487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:74c0::,2a06:74c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:7500::,2a06:7507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:7540::,2a06:7547:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:7580::,2a06:7587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:75c0::,2a06:75c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:7600::,2a06:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:7640::,2a06:7647:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:7680::,2a06:7687:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:76c0::,2a06:76c7:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a06:7700::,2a06:7707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:7740::,2a06:7747:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:7780::,2a06:7787:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:77c0::,2a06:77c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:7800::,2a06:7807:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a06:7840::,2a06:7847:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:7880::,2a06:7887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:78c0::,2a06:78c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:7900::,2a06:7907:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:7940::,2a06:7947:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:7980::,2a06:7987:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:79c0::,2a06:79c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:7a00::,2a06:7a07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:7a40::,2a06:7a47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:7a80::,2a06:7a87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:7ac0::,2a06:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:7b00::,2a06:7b07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:7b40::,2a06:7b47:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:7b80::,2a06:7b87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:7bc0::,2a06:7bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:7c00::,2a06:7c07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:7c40::,2a06:7c47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:7c80::,2a06:7c87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:7cc0::,2a06:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:7d00::,2a06:7d07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:7d40::,2a06:7d47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:7d80::,2a06:7d87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:7dc0::,2a06:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:7e00::,2a06:7e07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:7e40::,2a06:7e47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:7e80::,2a06:7e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:7ec0::,2a06:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:7f00::,2a06:7f07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:7f40::,2a06:7f47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:7f80::,2a06:7f87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:7fc0::,2a06:7fc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:8000::,2a06:8007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:8040::,2a06:8047:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:8080::,2a06:8087:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:80c0::,2a06:80c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:8100::,2a06:8107:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:8140::,2a06:8147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:8180::,2a06:8180::7fff:ffff:ffff:ffff:ffff,DE +2a06:8180:0:8000::,2a06:8181:fdf:ffff:ffff:ffff:ffff:ffff,GB +2a06:8181:fe0::,2a06:8181:fff:ffff:ffff:ffff:ffff:ffff,AT +2a06:8181:1000::,2a06:8181:1fcf:ffff:ffff:ffff:ffff:ffff,GB +2a06:8181:1fd0::,2a06:8181:1fdf:ffff:ffff:ffff:ffff:ffff,AT +2a06:8181:1fe0::,2a06:8184:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:8185::,2a06:8185:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:8186::,2a06:8187:fbb9:ffff:ffff:ffff:ffff:ffff,GB +2a06:8187:fbba::,2a06:8187:fbba:7fff:ffff:ffff:ffff:ffff,DE +2a06:8187:fbba:8000::,2a06:8187:fcff:ffff:ffff:ffff:ffff:ffff,GB +2a06:8187:fd00::,2a06:8187:fd02:ffff:ffff:ffff:ffff:ffff,FR +2a06:8187:fd03::,2a06:8187:fd03:ffff:ffff:ffff:ffff:ffff,IE +2a06:8187:fd04::,2a06:8187:fd98:ffff:ffff:ffff:ffff:ffff,FR +2a06:8187:fd99::,2a06:8187:fd99:ffff:ffff:ffff:ffff:ffff,LI +2a06:8187:fd9a::,2a06:8187:fdff:ffff:ffff:ffff:ffff:ffff,FR +2a06:8187:fe00::,2a06:8187:fe00:ffff:ffff:ffff:ffff:ffff,GB +2a06:8187:fe01::,2a06:8187:fe01:7fff:ffff:ffff:ffff:ffff,DE +2a06:8187:fe01:8000::,2a06:8187:fe12:ffff:ffff:ffff:ffff:ffff,GB +2a06:8187:fe13::,2a06:8187:fe13:7fff:ffff:ffff:ffff:ffff,DO +2a06:8187:fe13:8000::,2a06:8187:fe16:ffff:ffff:ffff:ffff:ffff,GB +2a06:8187:fe17::,2a06:8187:fe17:ffff:ffff:ffff:ffff:ffff,CA +2a06:8187:fe18::,2a06:8187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:81c0::,2a06:81c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:8200::,2a06:8207:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:8240::,2a06:8247:ffff:ffff:ffff:ffff:ffff:ffff,MY +2a06:8280::,2a06:8280:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:8281::,2a06:8281:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:8282::,2a06:8287:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:82c0::,2a06:82c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:82c1::,2a06:82c1::ffff:ffff:ffff:ffff:ffff,US +2a06:82c1:1::,2a06:82c1:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:82c2::,2a06:82c2:f:ffff:ffff:ffff:ffff:ffff,GB +2a06:82c2:10::,2a06:82c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:8300::,2a06:8307:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a06:8340::,2a06:8347:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:8380::,2a06:8387:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:83c0::,2a06:83c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:8400::,2a06:8407:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:8440::,2a06:8447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:8480::,2a06:8487:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a06:84c0::,2a06:84c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:8500::,2a06:8507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:8540::,2a06:8547:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:8580::,2a06:8587:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:85c0::,2a06:85c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:8600::,2a06:8607:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:8640::,2a06:8647:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:8680::,2a06:8687:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:86c0::,2a06:86c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:8700::,2a06:8707:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:8740::,2a06:8747:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:8780::,2a06:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:8800::,2a06:8807:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a06:8840::,2a06:8847:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:8880::,2a06:8887:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:88c0::,2a06:88c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:8900::,2a06:8907:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a06:8940::,2a06:8947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:8980::,2a06:8987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:89c0::,2a06:89c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:8a00::,2a06:8a07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:8a40::,2a06:8a47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:8a80::,2a06:8a87:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:8ac0::,2a06:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:8b00::,2a06:8b07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:8b40::,2a06:8b47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:8b80::,2a06:8b87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:8bc0::,2a06:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:8c00::,2a06:8c07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:8c40::,2a06:8c47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:8c80::,2a06:8c87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:8cc0::,2a06:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:8d00::,2a06:8d07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:8d40::,2a06:8d47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:8d80::,2a06:8d87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:8dc0::,2a06:8dc0:f:ffff:ffff:ffff:ffff:ffff,RO +2a06:8dc0:10::,2a06:8dc2::ffff:ffff:ffff:ffff:ffff,GB +2a06:8dc2:1::,2a06:8dc2:1:7fff:ffff:ffff:ffff:ffff,NL +2a06:8dc2:1:8000::,2a06:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:8e00::,2a06:8e07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:8e40::,2a06:8e47:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:8e80::,2a06:8e87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:8ec0::,2a06:8ec0:1:ffff:ffff:ffff:ffff:ffff,GB +2a06:8ec0:2::,2a06:8ec0:2:ffff:ffff:ffff:ffff:ffff,CH +2a06:8ec0:3::,2a06:8ec0:3:ffff:ffff:ffff:ffff:ffff,GB +2a06:8ec0:4::,2a06:8ec0:4:ffff:ffff:ffff:ffff:ffff,NL +2a06:8ec0:5::,2a06:8ec0:5:ffff:ffff:ffff:ffff:ffff,GB +2a06:8ec0:6::,2a06:8ec0:6:ffff:ffff:ffff:ffff:ffff,SE +2a06:8ec0:7::,2a06:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:8f00::,2a06:8f07:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a06:8f40::,2a06:8f47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:8f80::,2a06:8f87:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:8fc0::,2a06:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:9000::,2a06:9007:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:9040::,2a06:9047:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:9080::,2a06:9087:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:90c0::,2a06:90c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:9100::,2a06:9107:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a06:9140::,2a06:9147:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:9180::,2a06:9187:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:91c0::,2a06:91c7:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a06:9200::,2a06:9207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:9240::,2a06:9247:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:9280::,2a06:9287:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:9340::,2a06:9347:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:9380::,2a06:9387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:93c0::,2a06:93c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:9400::,2a06:9407:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a06:9440::,2a06:9447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:9480::,2a06:9487:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:94c0::,2a06:94c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:9500::,2a06:9507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:9540::,2a06:9547:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a06:9580::,2a06:9587:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:95c0::,2a06:95c7:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a06:9600::,2a06:9607:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a06:9640::,2a06:9647:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:9680::,2a06:9687:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:96c0::,2a06:96c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:9700::,2a06:9707:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:9740::,2a06:9747:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:9780::,2a06:9787:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:97c0::,2a06:97c7:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a06:9800::,2a06:9807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:9840::,2a06:9847:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:9880::,2a06:9887:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:98c0::,2a06:98c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:9900::,2a06:9907:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:9940::,2a06:9947:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:99c0::,2a06:99c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:9a00::,2a06:9a07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:9a40::,2a06:9a47:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a06:9a80::,2a06:9a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:9ac0::,2a06:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:9b00::,2a06:9b07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:9b40::,2a06:9b47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:9b80::,2a06:9b87:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a06:9bc0::,2a06:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:9c00::,2a06:9c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:9c40::,2a06:9c47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:9c80::,2a06:9c87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:9cc0::,2a06:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:9d00::,2a06:9d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:9d40::,2a06:9d47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:9d80::,2a06:9d87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:9dc0::,2a06:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:9e00::,2a06:9e07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:9e40::,2a06:9e47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:9e80::,2a06:9e87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:9f00::,2a06:9f07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:9f40::,2a06:9f47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:9f80::,2a06:9f87:ff:ffff:ffff:ffff:ffff:ffff,VA +2a06:9f87:100::,2a06:9f87:1ff:ffff:ffff:ffff:ffff:ffff,AT +2a06:9f87:200::,2a06:9f87:ffff:ffff:ffff:ffff:ffff:ffff,VA +2a06:9fc0::,2a06:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:a000::,2a06:a005:ff:ffff:ffff:ffff:ffff:ffff,IS +2a06:a005:100::,2a06:a005:1ff:ffff:ffff:ffff:ffff:ffff,AT +2a06:a005:200::,2a06:a006:c2:ffff:ffff:ffff:ffff:ffff,IS +2a06:a006:c3::,2a06:a006:c3:7fff:ffff:ffff:ffff:ffff,NL +2a06:a006:c3:8000::,2a06:a006:c4:ffff:ffff:ffff:ffff:ffff,IS +2a06:a006:c5::,2a06:a006:c5:7fff:ffff:ffff:ffff:ffff,US +2a06:a006:c5:8000::,2a06:a007:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a06:a040::,2a06:a047:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:a080::,2a06:a087:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:a0c0::,2a06:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:a100::,2a06:a107:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a06:a140::,2a06:a147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:a180::,2a06:a187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:a1c0::,2a06:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a06:a200::,2a06:a207:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:a240::,2a06:a247:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:a280::,2a06:a287:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a06:a2c0::,2a06:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:a300::,2a06:a307:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:a340::,2a06:a347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:a3c0::,2a06:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:a400::,2a06:a407:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:a440::,2a06:a447:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:a480::,2a06:a487:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:a4c0::,2a06:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:a500::,2a06:a507:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:a540::,2a06:a547:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:a580::,2a06:a587:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:a5c0::,2a06:a5c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:a600::,2a06:a600::7fff:ffff:ffff:ffff:ffff,PT +2a06:a600:0:8000::,2a06:a607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:a640::,2a06:a647:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:a680::,2a06:a687:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:a6c0::,2a06:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:a700::,2a06:a707:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:a740::,2a06:a747:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:a7c0::,2a06:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:a800::,2a06:a807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:a840::,2a06:a847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:a880::,2a06:a887:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:a8c0::,2a06:a8c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:a940::,2a06:a947:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:a980::,2a06:a987:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:a9c0::,2a06:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:aa00::,2a06:aa07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:aa40::,2a06:aa47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:aa80::,2a06:aa87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:aac0::,2a06:aac7:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a06:ab00::,2a06:ab07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:ab80::,2a06:ab87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:abc0::,2a06:abc7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:ac00::,2a06:ac07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:ac40::,2a06:ac47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:ac80::,2a06:ac87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:acc0::,2a06:acc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:ad00::,2a06:ad07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:ad40::,2a06:ad47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:ad80::,2a06:ad87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:adc0::,2a06:adc7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:ae00::,2a06:ae07:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:ae40::,2a06:ae47:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:ae80::,2a06:ae87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:aec0::,2a06:aec7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:af00::,2a06:af07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:af40::,2a06:af47:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a06:af80::,2a06:af87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:afc0::,2a06:afc7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:b000::,2a06:b007:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:b040::,2a06:b047:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:b080::,2a06:b087:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:b0c0::,2a06:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:b100::,2a06:b107:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:b140::,2a06:b147:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:b180::,2a06:b187:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:b1c0::,2a06:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:b200::,2a06:b207:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:b240::,2a06:b247:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:b280::,2a06:b287:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:b2c0::,2a06:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a06:b300::,2a06:b307:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:b340::,2a06:b347:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:b380::,2a06:b387:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:b3c0::,2a06:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:b400::,2a06:b407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:b440::,2a06:b447:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:b480::,2a06:b487:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:b4c0::,2a06:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:b500::,2a06:b507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:b540::,2a06:b547:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a06:b580::,2a06:b587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:b5c0::,2a06:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:b600::,2a06:b607:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:b640::,2a06:b647:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:b680::,2a06:b687:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:b6c0::,2a06:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:b740::,2a06:b747:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:b780::,2a06:b787:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:b7c0::,2a06:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:b800::,2a06:b807:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a06:b840::,2a06:b847:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:b880::,2a06:b887:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a06:b8c0::,2a06:b8c7:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a06:b900::,2a06:b907:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a06:b940::,2a06:b947:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a06:b980::,2a06:b987:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:b9c0::,2a06:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:ba00::,2a06:ba07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:ba40::,2a06:ba47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:ba80::,2a06:ba87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:bac0::,2a06:bac7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:bb00::,2a06:bb07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:bb80::,2a06:bb87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:bbc0::,2a06:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:bc00::,2a06:bc07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:bc40::,2a06:bc47:ffff:ffff:ffff:ffff:ffff:ffff,US +2a06:bc80::,2a06:bc87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:bcc0::,2a06:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:bd00::,2a06:bd07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:bd40::,2a06:bd47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:bd80::,2a06:bd87:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a06:bdc0::,2a06:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:be00::,2a06:be07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:be40::,2a06:be47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:be80::,2a06:be87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:bec0::,2a06:bec7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:bf00::,2a06:bf07:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a06:bf40::,2a06:bf47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:bf80::,2a06:bf87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:bfc0::,2a06:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a06:c000::,2a06:c007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:c040::,2a06:c047:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:c080::,2a06:c087:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:c0c0::,2a06:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:c100::,2a06:c107:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:c140::,2a06:c147:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:c180::,2a06:c187:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a06:c1c0::,2a06:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:c200::,2a06:c207:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:c240::,2a06:c247:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:c280::,2a06:c287:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:c2c0::,2a06:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:c300::,2a06:c307:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:c340::,2a06:c347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:c380::,2a06:c387:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:c3c0::,2a06:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:c400::,2a06:c407:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:c440::,2a06:c447:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:c480::,2a06:c487:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:c4c0::,2a06:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:c500::,2a06:c507:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:c580::,2a06:c587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:c5c0::,2a06:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:c600::,2a06:c607:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:c640::,2a06:c647:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:c680::,2a06:c687:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:c6c0::,2a06:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:c700::,2a06:c707:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a06:c740::,2a06:c747:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:c780::,2a06:c787:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:c7c0::,2a06:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:c800::,2a06:c807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:c840::,2a06:c847:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:c880::,2a06:c887:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:c8c0::,2a06:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:c900::,2a06:c907:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:c940::,2a06:c947:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:c980::,2a06:c987:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:c9c0::,2a06:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:ca00::,2a06:ca07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:ca40::,2a06:ca47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:ca80::,2a06:ca87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:cac0::,2a06:cac7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:cb00::,2a06:cb07:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a06:cb40::,2a06:cb47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:cb80::,2a06:cb87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:cbc0::,2a06:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:cc00::,2a06:cc07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:cc40::,2a06:cc47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:cc80::,2a06:cc87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:ccc0::,2a06:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:cd00::,2a06:cd07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:cd40::,2a06:cd47:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:cd80::,2a06:cd87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:cdc0::,2a06:cdc7:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a06:ce00::,2a06:ce07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:ce40::,2a06:ce47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:ce80::,2a06:ce87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:cec0::,2a06:cec7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:cf00::,2a06:cf07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:cf40::,2a06:cf47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:cf80::,2a06:cf87:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:cfc0::,2a06:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:d000::,2a06:d007:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:d040::,2a06:d047:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:d080::,2a06:d087:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:d0c0::,2a06:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:d100::,2a06:d107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:d140::,2a06:d147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:d180::,2a06:d187:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:d1c0::,2a06:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:d200::,2a06:d207:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:d240::,2a06:d247:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:d280::,2a06:d287:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:d2c0::,2a06:d2c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:d300::,2a06:d307:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a06:d340::,2a06:d347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:d380::,2a06:d387:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:d3c0::,2a06:d3c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:d400::,2a06:d407:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:d440::,2a06:d447:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:d480::,2a06:d487:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:d500::,2a06:d507:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:d540::,2a06:d547:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:d580::,2a06:d587:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:d5c0::,2a06:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:d600::,2a06:d607:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:d640::,2a06:d647:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:d680::,2a06:d687:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:d700::,2a06:d707:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a06:d740::,2a06:d747:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:d780::,2a06:d787:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:d7c0::,2a06:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a06:d800::,2a06:d807:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:d840::,2a06:d847:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a06:d880::,2a06:d887:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:d8c0::,2a06:d8c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:d900::,2a06:d907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:d940::,2a06:d947:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:d980::,2a06:d987:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a06:d9c0::,2a06:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:da00::,2a06:da07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:da40::,2a06:da47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:da80::,2a06:da87:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a06:dac0::,2a06:dac7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:db00::,2a06:db07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:db40::,2a06:db47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:db80::,2a06:db87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:dbc0::,2a06:dbc7:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a06:dc00::,2a06:dc07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:dc40::,2a06:dc47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:dc80::,2a06:dc87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:dcc0::,2a06:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:dd00::,2a06:dd07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:dd40::,2a06:dd47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:dd80::,2a06:dd87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:ddc0::,2a06:ddc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:de00::,2a06:de07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:de40::,2a06:de47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:dec0::,2a06:dec7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:df00::,2a06:df07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:df40::,2a06:df47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:df80::,2a06:df87:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:dfc0::,2a06:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:e000::,2a06:e007:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:e040::,2a06:e047:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:e080::,2a06:e087:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:e0c0::,2a06:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:e100::,2a06:e107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:e140::,2a06:e147:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:e180::,2a06:e187:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:e1c0::,2a06:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:e200::,2a06:e207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:e240::,2a06:e247:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:e280::,2a06:e287:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:e2c0::,2a06:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:e300::,2a06:e307:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a06:e340::,2a06:e347:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a06:e380::,2a06:e387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:e3c0::,2a06:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:e400::,2a06:e407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:e440::,2a06:e447:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a06:e480::,2a06:e487:ffff:ffff:ffff:ffff:ffff:ffff,US +2a06:e4c0::,2a06:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:e500::,2a06:e507:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a06:e540::,2a06:e547:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:e580::,2a06:e587:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:e600::,2a06:e607:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:e640::,2a06:e647:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a06:e680::,2a06:e687:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:e6c0::,2a06:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a06:e700::,2a06:e707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:e740::,2a06:e747:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:e780::,2a06:e787:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:e7c0::,2a06:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:e800::,2a06:e807:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:e840::,2a06:e847:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:e880::,2a06:e881:105:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:106::,2a06:e881:106:ffff:ffff:ffff:ffff:ffff,FR +2a06:e881:107::,2a06:e881:107:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:108::,2a06:e881:108:7fff:ffff:ffff:ffff:ffff,LT +2a06:e881:108:8000::,2a06:e881:1ff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:200::,2a06:e881:2ff:ffff:ffff:ffff:ffff:ffff,AT +2a06:e881:300::,2a06:e881:10ff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:1100::,2a06:e881:110f:ffff:ffff:ffff:ffff:ffff,FR +2a06:e881:1110::,2a06:e881:14ff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:1500::,2a06:e881:150f:ffff:ffff:ffff:ffff:ffff,GB +2a06:e881:1510::,2a06:e881:16ff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:1700::,2a06:e881:170f:ffff:ffff:ffff:ffff:ffff,DE +2a06:e881:1710::,2a06:e881:1fff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:2000::,2a06:e881:200f:ffff:ffff:ffff:ffff:ffff,DE +2a06:e881:2010::,2a06:e881:20ff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:2100::,2a06:e881:210f:ffff:ffff:ffff:ffff:ffff,DE +2a06:e881:2110::,2a06:e881:2502:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:2503::,2a06:e881:2503:7fff:ffff:ffff:ffff:ffff,JP +2a06:e881:2503:8000::,2a06:e881:f000:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:f001::,2a06:e881:f001:7fff:ffff:ffff:ffff:ffff,GB +2a06:e881:f001:8000::,2a06:e887:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e8c0::,2a06:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a06:e900::,2a06:e907:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:e940::,2a06:e947:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:e980::,2a06:e987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:e9c0::,2a06:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:ea00::,2a06:ea07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:ea40::,2a06:ea47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a06:ea80::,2a06:ea87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:eac0::,2a06:eac7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:eb00::,2a06:eb07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:eb40::,2a06:eb47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:eb80::,2a06:eb87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a06:ebc0::,2a06:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a06:ec00::,2a06:ec07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:ec40::,2a06:ec47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:ec80::,2a06:ec87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:ecc0::,2a06:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:ed00::,2a06:ed07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:ed40::,2a06:ed47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:edc0::,2a06:edc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:ee00::,2a06:ee07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:ee40::,2a06:ee47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:ee80::,2a06:ee87:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a06:eec0::,2a06:eec7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:ef40::,2a06:ef47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:ef80::,2a06:ef87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:efc0::,2a06:efc7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a06:f000::,2a06:f007:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a06:f040::,2a06:f047:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a06:f080::,2a06:f087:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:f0c0::,2a06:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:f100::,2a06:f107:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a06:f140::,2a06:f147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:f180::,2a06:f187:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:f1c0::,2a06:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:f200::,2a06:f207:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:f240::,2a06:f247:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:f280::,2a06:f287:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:f2c0::,2a06:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:f300::,2a06:f307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:f340::,2a06:f347:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:f380::,2a06:f387:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:f3c0::,2a06:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:f400::,2a06:f407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:f440::,2a06:f447:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:f500::,2a06:f507:ffff:ffff:ffff:ffff:ffff:ffff,IN +2a06:f540::,2a06:f547:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:f580::,2a06:f587:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:f5c0::,2a06:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:f600::,2a06:f607:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a06:f640::,2a06:f647:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a06:f680::,2a06:f687:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:f6c0::,2a06:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:f700::,2a06:f707:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:f740::,2a06:f747:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a06:f780::,2a06:f787:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:f7c0::,2a06:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:f800::,2a06:f807:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:f840::,2a06:f847:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:f880::,2a06:f887:ffff:ffff:ffff:ffff:ffff:ffff,US +2a06:f8c0::,2a06:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:f900::,2a06:f907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:f940::,2a06:f947:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:f980::,2a06:f987:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a06:f9c0::,2a06:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a06:fa00::,2a06:fa07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:fa40::,2a06:fa47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a06:fa80::,2a06:fa87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a06:fac0::,2a06:fac7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a06:fb00::,2a06:fb07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a06:fb40::,2a06:fb47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:fb80::,2a06:fb87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a06:fbc0::,2a06:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:fc00::,2a06:fc07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a06:fc40::,2a06:fc47:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a06:fc80::,2a06:fc87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a06:fcc0::,2a06:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:fd00::,2a06:fd07:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a06:fd40::,2a06:fd47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a06:fd80::,2a06:fd87:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a06:fdc0::,2a06:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a06:fe00::,2a06:fe07:ffff:ffff:ffff:ffff:ffff:ffff,MA +2a06:fe40::,2a06:fe47:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a06:fe80::,2a06:fe87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a06:fec0::,2a06:fec7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a06:ff00::,2a06:ff07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a06:ff40::,2a06:ff47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a06:ff80::,2a06:ff87:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a06:ffc0::,2a06:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07::,2a07:7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:40::,2a07:47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:80::,2a07:87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:c0::,2a07:c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:100::,2a07:107:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:140::,2a07:147:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a07:180::,2a07:187:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:1c0::,2a07:1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:200::,2a07:207:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a07:240::,2a07:247:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:280::,2a07:287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:2c0::,2a07:2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:300::,2a07:307:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a07:340::,2a07:347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:380::,2a07:387:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:3c0::,2a07:3c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:440::,2a07:447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:480::,2a07:487:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:4c0::,2a07:4c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:500::,2a07:507:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:540::,2a07:547:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:580::,2a07:587:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:5c0::,2a07:5c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:600::,2a07:607:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:640::,2a07:647:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:680::,2a07:687:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:6c0::,2a07:6c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:700::,2a07:707:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:740::,2a07:747:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a07:780::,2a07:787:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:7c0::,2a07:7c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:800::,2a07:807:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:840::,2a07:847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:880::,2a07:887:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:8c0::,2a07:8c7:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a07:900::,2a07:907:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:940::,2a07:947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:980::,2a07:987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:9c0::,2a07:9c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:a00::,2a07:a07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:a40::,2a07:a47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:a80::,2a07:a87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:ac0::,2a07:ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:b00::,2a07:b07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:b40::,2a07:b47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:b80::,2a07:b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:bc0::,2a07:bc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:c00::,2a07:c07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:c40::,2a07:c47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:c80::,2a07:c87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:cc0::,2a07:cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:d00::,2a07:d07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:d40::,2a07:d47:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a07:d80::,2a07:d87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:dc0::,2a07:dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:e00::,2a07:e07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:e40::,2a07:e47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:e80::,2a07:e87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:ec0::,2a07:ec7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:f00::,2a07:f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:f40::,2a07:f47:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:f80::,2a07:f87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:fc0::,2a07:fc7:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a07:1000::,2a07:1007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:1040::,2a07:1047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:1080::,2a07:1087:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:10c0::,2a07:10c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:1100::,2a07:1107:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a07:1140::,2a07:1147:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:1180::,2a07:1187:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a07:11c0::,2a07:11c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:1200::,2a07:1207:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:1240::,2a07:1247:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:1280::,2a07:1287:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:12c0::,2a07:12c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:1300::,2a07:1307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:1340::,2a07:1347:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:1380::,2a07:1387:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:13c0::,2a07:13c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:1400::,2a07:1407:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:1440::,2a07:1447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:1480::,2a07:1487:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:14c0::,2a07:14c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:1500::,2a07:1507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:1540::,2a07:1547:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:1580::,2a07:1587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:15c0::,2a07:15c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:1600::,2a07:1607:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:1640::,2a07:1647:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:1680::,2a07:1687:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:16c0::,2a07:16c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:1700::,2a07:1707:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:1740::,2a07:1747:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:1780::,2a07:1787:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:17c0::,2a07:17c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:1800::,2a07:1807:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:1840::,2a07:1847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:1880::,2a07:1887:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:18c0::,2a07:18c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:1900::,2a07:1907:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:1940::,2a07:1947:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:1980::,2a07:1987:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a07:19c0::,2a07:19c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:1a00::,2a07:1a07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:1a40::,2a07:1a47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:1a80::,2a07:1a80:6fff:ffff:ffff:ffff:ffff:ffff,SE +2a07:1a80:7000::,2a07:1a80:70ff:ffff:ffff:ffff:ffff:ffff,AT +2a07:1a80:7100::,2a07:1a87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:1ac0::,2a07:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:1b00::,2a07:1b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:1b40::,2a07:1b47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:1b80::,2a07:1b87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:1bc0::,2a07:1bc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:1c00::,2a07:1c07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:1c40::,2a07:1c44:3ff:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c44:400::,2a07:1c44:4ff:ffff:ffff:ffff:ffff:ffff,DE +2a07:1c44:500::,2a07:1c44:609:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c44:60a::,2a07:1c44:60a:ffff:ffff:ffff:ffff:ffff,DE +2a07:1c44:60b::,2a07:1c44:619:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c44:61a::,2a07:1c44:61a:ffff:ffff:ffff:ffff:ffff,KR +2a07:1c44:61b::,2a07:1c44:67f:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c44:680::,2a07:1c44:6bf:ffff:ffff:ffff:ffff:ffff,KR +2a07:1c44:6c0::,2a07:1c44:6c0:7fff:ffff:ffff:ffff:ffff,AT +2a07:1c44:6c0:8000::,2a07:1c44:6c0:ffff:ffff:ffff:ffff:ffff,KR +2a07:1c44:6c1::,2a07:1c44:6ff:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c44:700::,2a07:1c44:70f:ffff:ffff:ffff:ffff:ffff,US +2a07:1c44:710::,2a07:1c44:1800:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c44:1801::,2a07:1c44:1802:ffff:ffff:ffff:ffff:ffff,US +2a07:1c44:1803::,2a07:1c44:35ff:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c44:3600::,2a07:1c44:36ff:ffff:ffff:ffff:ffff:ffff,GB +2a07:1c44:3700::,2a07:1c44:3fff:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c44:4000::,2a07:1c44:40ff:ffff:ffff:ffff:ffff:ffff,US +2a07:1c44:4100::,2a07:1c47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c80::,2a07:1c87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:1cc0::,2a07:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:1d00::,2a07:1d07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:1d40::,2a07:1d47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:1d80::,2a07:1d87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:1dc0::,2a07:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:1e00::,2a07:1e07:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a07:1e40::,2a07:1e47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:1e80::,2a07:1e87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:1ec0::,2a07:1ec7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:1f00::,2a07:1f07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:1f40::,2a07:1f47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:1f80::,2a07:1f87:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:1fc0::,2a07:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:2000::,2a07:2007:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a07:2040::,2a07:2047:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:2080::,2a07:2087:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:20c0::,2a07:20c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:2100::,2a07:2107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:2140::,2a07:2147:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:2180::,2a07:2187:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:21c0::,2a07:21c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:2200::,2a07:2207:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:2240::,2a07:2247:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:2280::,2a07:2287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:2300::,2a07:2307:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:2340::,2a07:2347:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:2380::,2a07:2387:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:23c0::,2a07:23c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:2400::,2a07:2407:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:2440::,2a07:2447:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:2480::,2a07:2487:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:24c0::,2a07:24c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:2500::,2a07:2507:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:2540::,2a07:2547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:2580::,2a07:2587:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:25c0::,2a07:25c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:2600::,2a07:2607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:2640::,2a07:2647:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:2680::,2a07:2687:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:26c0::,2a07:26c7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a07:2700::,2a07:2707:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:2740::,2a07:2747:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:2780::,2a07:2787:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:27c0::,2a07:27c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:2800::,2a07:2807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:2840::,2a07:2847:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:2880::,2a07:2887:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:28c0::,2a07:28c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:2900::,2a07:291f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:2a00::,2a07:2a07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:2a40::,2a07:2a47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:2a80::,2a07:2a87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:2ac0::,2a07:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:2b00::,2a07:2b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:2b40::,2a07:2b47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:2b80::,2a07:2b87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:2bc0::,2a07:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:2c00::,2a07:2c07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:2c40::,2a07:2c47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:2c80::,2a07:2c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:2cc0::,2a07:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:2d00::,2a07:2d07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:2d40::,2a07:2d47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:2d80::,2a07:2d87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:2dc0::,2a07:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a07:2e00::,2a07:2e07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:2e40::,2a07:2e47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:2e80::,2a07:2e87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:2ec0::,2a07:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:2f00::,2a07:2f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:2f40::,2a07:2f47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:2f80::,2a07:2f87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:2fc0::,2a07:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:3000::,2a07:3007:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:3040::,2a07:3047:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:3080::,2a07:3087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:30c0::,2a07:30c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:3100::,2a07:3107:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:3140::,2a07:3147:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a07:3180::,2a07:3187:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:31c0::,2a07:31c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:3200::,2a07:3207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:3240::,2a07:3247:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:3280::,2a07:3287:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:32c0::,2a07:32c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:3300::,2a07:3307:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:3340::,2a07:3347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:3380::,2a07:3387:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:33c0::,2a07:33c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:3400::,2a07:3407:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:3440::,2a07:3447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:3480::,2a07:3487:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:3500::,2a07:3507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:3540::,2a07:3547:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:3580::,2a07:3587:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:35c0::,2a07:35c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:3600::,2a07:3607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:3640::,2a07:3647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:3680::,2a07:3687:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a07:36c0::,2a07:36c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:3700::,2a07:3707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:3740::,2a07:3747:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:3780::,2a07:3787:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a07:37c0::,2a07:37c7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a07:3800::,2a07:3807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:3840::,2a07:3847:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a07:3880::,2a07:3887:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:38c0::,2a07:38c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:3900::,2a07:3907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:3940::,2a07:3947:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:3980::,2a07:3987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:39c0::,2a07:39c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:3a00::,2a07:3a07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:3a80::,2a07:3a87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:3ac0::,2a07:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:3b00::,2a07:3b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:3b40::,2a07:3b47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:3b80::,2a07:3b87:ffff:ffff:ffff:ffff:ffff:ffff,GI +2a07:3bc0::,2a07:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:3c00::,2a07:3c07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:3c40::,2a07:3c47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:3c80::,2a07:3c87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:3d00::,2a07:3d07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:3d80::,2a07:3d87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:3dc0::,2a07:3dc7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:3e00::,2a07:3e07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:3e40::,2a07:3e47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:3e80::,2a07:3e87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:3ec0::,2a07:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:3f00::,2a07:3f07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:3f40::,2a07:3f47:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a07:3f80::,2a07:3f87:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a07:3fc0::,2a07:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:4000::,2a07:4007:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:4040::,2a07:4047:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:4080::,2a07:4087:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:40c0::,2a07:40c7:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a07:4100::,2a07:4107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:4140::,2a07:4147:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a07:4180::,2a07:4187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:41c0::,2a07:41c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:4200::,2a07:4207:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:4240::,2a07:4247:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:4280::,2a07:4287:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:42c0::,2a07:42c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:4340::,2a07:4347:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a07:4380::,2a07:4387:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:43c0::,2a07:43c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:4400::,2a07:4407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:4440::,2a07:4447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:4480::,2a07:4487:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:44c0::,2a07:44c7:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a07:4500::,2a07:4507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:4540::,2a07:4547:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a07:4580::,2a07:4587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:45c0::,2a07:45c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:4600::,2a07:4607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:4640::,2a07:4647:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:4680::,2a07:4687:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:46c0::,2a07:46c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:4700::,2a07:4707:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:4740::,2a07:4747:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:4780::,2a07:4787:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:47c0::,2a07:47c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:4800::,2a07:4807:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:4840::,2a07:4847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:4880::,2a07:4887:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:48c0::,2a07:48c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:4900::,2a07:4907:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a07:4940::,2a07:4947:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:4980::,2a07:4987:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:4a00::,2a07:4a07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:4a40::,2a07:4a47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:4a80::,2a07:4a87:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a07:4ac0::,2a07:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:4b00::,2a07:4b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:4b40::,2a07:4b47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:4b80::,2a07:4b87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:4bc0::,2a07:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:4c00::,2a07:4c07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:4c40::,2a07:4c47:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:4c80::,2a07:4c87:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:4cc0::,2a07:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:4d00::,2a07:4d07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:4d40::,2a07:4d47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:4d80::,2a07:4d87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:4dc0::,2a07:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:4e00::,2a07:4e07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:4e40::,2a07:4e47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:4e80::,2a07:4e87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:4ec0::,2a07:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:4f00::,2a07:4f07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:4f40::,2a07:4f47:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a07:4f80::,2a07:4f87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:4fc0::,2a07:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a07:5000::,2a07:5007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:5040::,2a07:5047:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:5080::,2a07:5087:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:50c0::,2a07:50c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:5100::,2a07:5107:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:5140::,2a07:5147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:5180::,2a07:5187:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:51c0::,2a07:51c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:5200::,2a07:5207:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:5240::,2a07:5247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:5280::,2a07:5287:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:52c0::,2a07:52c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:5300::,2a07:5307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:5340::,2a07:5347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:5380::,2a07:5387:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:53c0::,2a07:53c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:5400::,2a07:5407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:5440::,2a07:5447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:5480::,2a07:5487:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a07:54c0::,2a07:54c7:ffff:ffff:ffff:ffff:ffff:ffff,IM +2a07:5500::,2a07:5507:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:5540::,2a07:5547:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a07:5580::,2a07:5587:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:55c0::,2a07:55c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:5600::,2a07:5607:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:5640::,2a07:5647:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:5680::,2a07:5687:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:56c0::,2a07:56c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:5700::,2a07:5707:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:5740::,2a07:5747:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:5780::,2a07:5787:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:57c0::,2a07:57c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:5800::,2a07:5807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:5840::,2a07:5847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:5880::,2a07:5887:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:58c0::,2a07:58c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:5900::,2a07:5907:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a07:5940::,2a07:5947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:5980::,2a07:5987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:59c0::,2a07:59c6:edff:ffff:ffff:ffff:ffff:ffff,IT +2a07:59c6:ee00::,2a07:59c6:eeff:ffff:ffff:ffff:ffff:ffff,DE +2a07:59c6:ef00::,2a07:59c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:5a00::,2a07:5a07:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a07:5a40::,2a07:5a47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:5a80::,2a07:5a87:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a07:5ac0::,2a07:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a07:5b00::,2a07:5b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:5b40::,2a07:5b47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:5b80::,2a07:5b87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:5bc0::,2a07:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:5c00::,2a07:5c07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:5c40::,2a07:5c47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:5c80::,2a07:5c87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:5cc0::,2a07:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:5d00::,2a07:5d07:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a07:5d40::,2a07:5d47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:5d80::,2a07:5d87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:5dc0::,2a07:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:5e00::,2a07:5e07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:5e40::,2a07:5e47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:5e80::,2a07:5e87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:5ec0::,2a07:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:5f00::,2a07:5f07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:5f40::,2a07:5f47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:5f80::,2a07:5f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:5fc0::,2a07:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:6000::,2a07:6007:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:6040::,2a07:6047:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a07:6080::,2a07:6087:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:60c0::,2a07:60c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:6100::,2a07:6107:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:6140::,2a07:6147:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:6180::,2a07:6187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:61c0::,2a07:61c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:6200::,2a07:6207:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:6240::,2a07:6247:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:6280::,2a07:6287:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:62c0::,2a07:62c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:6300::,2a07:6307:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:6340::,2a07:6347:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:6380::,2a07:6387:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:63c0::,2a07:63c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:6400::,2a07:6407:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a07:6440::,2a07:6447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:6480::,2a07:6487:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:64c0::,2a07:64c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:6500::,2a07:6507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:6540::,2a07:6547:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:6580::,2a07:6587:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:65c0::,2a07:65c7:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a07:6600::,2a07:6607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:6640::,2a07:6647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:6680::,2a07:6687:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:66c0::,2a07:66c7:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a07:6700::,2a07:6707:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a07:6780::,2a07:6787:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a07:67c0::,2a07:67c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:6800::,2a07:6807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:6840::,2a07:6847:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:6880::,2a07:6887:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:68c0::,2a07:68c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:6900::,2a07:6907:ffff:ffff:ffff:ffff:ffff:ffff,PA +2a07:6940::,2a07:6947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:6980::,2a07:6987:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a07:69c0::,2a07:69c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:6a00::,2a07:6a07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:6a40::,2a07:6a47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:6a80::,2a07:6a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:6ac0::,2a07:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:6b00::,2a07:6b07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:6b40::,2a07:6b47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:6b80::,2a07:6b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:6bc0::,2a07:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:6c00::,2a07:6c07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:6c40::,2a07:6c47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:6c80::,2a07:6c87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:6cc0::,2a07:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:6d00::,2a07:6d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:6d40::,2a07:6d47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:6d80::,2a07:6d87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:6dc0::,2a07:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:6e00::,2a07:6e07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:6e40::,2a07:6e47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:6e80::,2a07:6e87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:6ec0::,2a07:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:6f00::,2a07:6f07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:6f40::,2a07:6f47:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:6f80::,2a07:6f87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:6fc0::,2a07:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:7000::,2a07:7007:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:7040::,2a07:7047:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:7080::,2a07:7087:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a07:70c0::,2a07:70c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:7100::,2a07:7107:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:7140::,2a07:7147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:7180::,2a07:7187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:71c0::,2a07:71c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:7200::,2a07:7207:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:7280::,2a07:7287:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:72c0::,2a07:72c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:7300::,2a07:7307:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:7340::,2a07:7347:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:7380::,2a07:7387:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:73c0::,2a07:73c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:7400::,2a07:7407:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a07:7440::,2a07:7447:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:7480::,2a07:7487:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:74c0::,2a07:74c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:7500::,2a07:7507:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:7540::,2a07:7547:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:7580::,2a07:7587:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:75c0::,2a07:75c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:7600::,2a07:7607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:7640::,2a07:7647:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:7680::,2a07:7687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:76c0::,2a07:76c7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:7700::,2a07:7707:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:7740::,2a07:7747:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:7780::,2a07:7787:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:77c0::,2a07:77c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:7800::,2a07:7807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:7840::,2a07:7847:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a07:7880::,2a07:7887:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:78c0::,2a07:78c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:7900::,2a07:7907:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a07:7940::,2a07:7947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:7980::,2a07:7987:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:79c0::,2a07:79c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:7a00::,2a07:7a07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:7a40::,2a07:7a47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:7a80::,2a07:7a87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:7ac0::,2a07:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:7b00::,2a07:7b07:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a07:7b40::,2a07:7b47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:7b80::,2a07:7b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:7bc0::,2a07:7bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:7c00::,2a07:7c07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:7c40::,2a07:7c47:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a07:7c80::,2a07:7c87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:7cc0::,2a07:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:7d00::,2a07:7d07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:7d40::,2a07:7d47:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a07:7d80::,2a07:7d87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:7dc0::,2a07:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:7e00::,2a07:7e07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:7e40::,2a07:7e47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:7e80::,2a07:7e87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:7ec0::,2a07:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:7f00::,2a07:7f07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:7f40::,2a07:7f47:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:7f80::,2a07:7f87:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a07:7fc0::,2a07:7fc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:8000::,2a07:8007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:8040::,2a07:8047:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a07:8080::,2a07:8087:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:80c0::,2a07:80c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:8100::,2a07:8107:ffff:ffff:ffff:ffff:ffff:ffff,VA +2a07:8140::,2a07:8147:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:8180::,2a07:8187:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:81c0::,2a07:81c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:8200::,2a07:8207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:8240::,2a07:8247:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:8280::,2a07:8287:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:82c0::,2a07:82c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:8300::,2a07:8307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:8340::,2a07:8347:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:8380::,2a07:8387:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:83c0::,2a07:83c7:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a07:8400::,2a07:8407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:8440::,2a07:8447:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:8480::,2a07:8487:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:84c0::,2a07:84c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:8500::,2a07:8507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:8580::,2a07:8587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:85c0::,2a07:85c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:8600::,2a07:8607:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a07:8640::,2a07:8647:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:8680::,2a07:8687:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:86c0::,2a07:86c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:8700::,2a07:8707:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:8740::,2a07:8747:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:8780::,2a07:8787:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a07:87c0::,2a07:87c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:8800::,2a07:8807:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:8840::,2a07:8847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:8880::,2a07:8887:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a07:88c0::,2a07:88c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:8900::,2a07:8907:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:8940::,2a07:8947:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:8980::,2a07:8980:43:ffff:ffff:ffff:ffff:ffff,LT +2a07:8980:44::,2a07:8980:44:7fff:ffff:ffff:ffff:ffff,GB +2a07:8980:44:8000::,2a07:8987:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a07:89c0::,2a07:89c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:8a00::,2a07:8a07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:8a40::,2a07:8a47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:8a80::,2a07:8a87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:8ac0::,2a07:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:8b00::,2a07:8b07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:8b40::,2a07:8b47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:8b80::,2a07:8b83:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a07:8bc0::,2a07:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a07:8c00::,2a07:8c07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:8c40::,2a07:8c47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:8c80::,2a07:8c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:8cc0::,2a07:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:8d00::,2a07:8d07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:8d40::,2a07:8d47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:8d80::,2a07:8d87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:8dc0::,2a07:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:8e00::,2a07:8e07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:8e40::,2a07:8e47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:8e80::,2a07:8e87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:8ec0::,2a07:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a07:8f00::,2a07:8f07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:8f40::,2a07:8f47:ffff:ffff:ffff:ffff:ffff:ffff,AU +2a07:8f80::,2a07:8f87:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:8fc0::,2a07:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:9000::,2a07:9007:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a07:9040::,2a07:9047:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:9080::,2a07:9087:ffff:ffff:ffff:ffff:ffff:ffff,MC +2a07:90c0::,2a07:90c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:9100::,2a07:9107:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:9140::,2a07:9147:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a07:9180::,2a07:9187:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:91c0::,2a07:91c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:9200::,2a07:9207:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:9240::,2a07:9247:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:9280::,2a07:9287:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a07:92c0::,2a07:92c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:9300::,2a07:9307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:9340::,2a07:9347:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:9380::,2a07:9387:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:93c0::,2a07:93c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:9400::,2a07:9407:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:9440::,2a07:9447:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:9480::,2a07:9487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:94c0::,2a07:94c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:9500::,2a07:9507:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a07:9540::,2a07:9547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:9580::,2a07:9587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:95c0::,2a07:95c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:9600::,2a07:9607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:9640::,2a07:9647:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a07:9680::,2a07:9687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:96c0::,2a07:96c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:9700::,2a07:9707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:9740::,2a07:9747:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a07:9780::,2a07:9787:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:97c0::,2a07:97c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:9800::,2a07:9807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:9840::,2a07:9847:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:9880::,2a07:9887:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a07:98c0::,2a07:98c7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:9900::,2a07:9907:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a07:9940::,2a07:9944:f:ffff:ffff:ffff:ffff:ffff,GB +2a07:9944:10::,2a07:9944:10:ffff:ffff:ffff:ffff:ffff,US +2a07:9944:11::,2a07:9944:1f:ffff:ffff:ffff:ffff:ffff,GB +2a07:9944:20::,2a07:9944:20:ffff:ffff:ffff:ffff:ffff,US +2a07:9944:21::,2a07:9944:2f:ffff:ffff:ffff:ffff:ffff,GB +2a07:9944:30::,2a07:9944:30:ffff:ffff:ffff:ffff:ffff,US +2a07:9944:31::,2a07:9944:3f:ffff:ffff:ffff:ffff:ffff,GB +2a07:9944:40::,2a07:9944:40:ffff:ffff:ffff:ffff:ffff,US +2a07:9944:41::,2a07:9947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:9980::,2a07:9987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:99c0::,2a07:99c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:9a00::,2a07:9a07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:9a40::,2a07:9a47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:9a80::,2a07:9a87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:9ac0::,2a07:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:9b00::,2a07:9b07:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a07:9b40::,2a07:9b47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:9b80::,2a07:9b87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:9bc0::,2a07:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a07:9c00::,2a07:9c07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:9c40::,2a07:9c47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:9c80::,2a07:9c87:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:9cc0::,2a07:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:9d00::,2a07:9d07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:9d40::,2a07:9d47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:9d80::,2a07:9d87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:9dc0::,2a07:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:9e00::,2a07:9e07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:9e40::,2a07:9e47:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a07:9e80::,2a07:9e87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:9ec0::,2a07:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:9f00::,2a07:9f07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:9f40::,2a07:9f47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:9f80::,2a07:9f87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:9fc0::,2a07:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:a000::,2a07:a007:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a07:a040::,2a07:a047:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:a080::,2a07:a087:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:a0c0::,2a07:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:a100::,2a07:a107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:a140::,2a07:a147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:a180::,2a07:a187:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:a1c0::,2a07:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:a200::,2a07:a207:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:a240::,2a07:a247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:a280::,2a07:a287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:a2c0::,2a07:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:a300::,2a07:a307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:a340::,2a07:a347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:a380::,2a07:a387:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:a3c0::,2a07:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:a400::,2a07:a407:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:a440::,2a07:a447:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:a480::,2a07:a487:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:a4c0::,2a07:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:a500::,2a07:a507:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:a540::,2a07:a547:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:a580::,2a07:a587:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:a5c0::,2a07:a5c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:a600::,2a07:a607:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:a640::,2a07:a647:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:a680::,2a07:a687:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:a6c0::,2a07:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:a700::,2a07:a707:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a07:a740::,2a07:a747:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:a780::,2a07:a787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:a7c0::,2a07:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:a800::,2a07:a807:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a07:a840::,2a07:a847:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:a880::,2a07:a887:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:a8c0::,2a07:a8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:a900::,2a07:a905:ffef:ffff:ffff:ffff:ffff:ffff,GB +2a07:a905:fff0::,2a07:a905:fff0:ffff:ffff:ffff:ffff:ffff,US +2a07:a905:fff1::,2a07:a907:50b:ffff:ffff:ffff:ffff:ffff,GB +2a07:a907:50c::,2a07:a907:50c:7fff:ffff:ffff:ffff:ffff,DE +2a07:a907:50c:8000::,2a07:a907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:a940::,2a07:a947:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:a980::,2a07:a987:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:a9c0::,2a07:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:aa00::,2a07:aa07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:aa40::,2a07:aa47:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:aa80::,2a07:aa87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:aac0::,2a07:aac7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:ab00::,2a07:ab07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:ab40::,2a07:ab47:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a07:ab80::,2a07:ab87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:abc0::,2a07:abc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:ac00::,2a07:ac07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:ac40::,2a07:ac47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:ac80::,2a07:ac87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:acc0::,2a07:acc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:ad00::,2a07:ad07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:ad40::,2a07:ad47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:ad80::,2a07:ad87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:adc0::,2a07:adc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:ae00::,2a07:ae07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:ae40::,2a07:ae47:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a07:ae80::,2a07:ae87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:aec0::,2a07:aec7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:af00::,2a07:af07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:af40::,2a07:af47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:af80::,2a07:af87:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a07:afc0::,2a07:afc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:b000::,2a07:b007:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:b040::,2a07:b047:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:b080::,2a07:b087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:b0c0::,2a07:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:b100::,2a07:b107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:b140::,2a07:b147:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:b180::,2a07:b187:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:b1c0::,2a07:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:b200::,2a07:b207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:b240::,2a07:b247:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:b280::,2a07:b287:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:b2c0::,2a07:b2c5:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:b2c6::,2a07:b2c6:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2a07:b2c7::,2a07:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:b300::,2a07:b307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:b340::,2a07:b347:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:b380::,2a07:b387:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:b3c0::,2a07:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:b400::,2a07:b407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:b440::,2a07:b447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:b480::,2a07:b487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:b4c0::,2a07:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:b500::,2a07:b507:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:b540::,2a07:b547:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:b580::,2a07:b587:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:b5c0::,2a07:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:b600::,2a07:b607:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:b640::,2a07:b647:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:b680::,2a07:b687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:b6c0::,2a07:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:b700::,2a07:b707:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:b740::,2a07:b747:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:b780::,2a07:b787:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:b7c0::,2a07:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a07:b800::,2a07:b807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:b840::,2a07:b847:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:b880::,2a07:b887:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:b8c0::,2a07:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a07:b8c1::,2a07:b8c1:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:b8c2::,2a07:b8c2:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a07:b8c3::,2a07:b8c3:ffff:ffff:ffff:ffff:ffff:ffff,BR +2a07:b8c4::,2a07:b8c7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a07:b900::,2a07:b907:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:b940::,2a07:b947:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:b980::,2a07:b987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:b9c0::,2a07:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:ba00::,2a07:ba07:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a07:ba40::,2a07:ba47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:ba80::,2a07:ba87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:bac0::,2a07:bac7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:bb00::,2a07:bb07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:bb40::,2a07:bb47:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:bb80::,2a07:bb87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:bbc0::,2a07:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:bc00::,2a07:bc07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:bc40::,2a07:bc47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:bc80::,2a07:bc87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:bcc0::,2a07:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:bd00::,2a07:bd07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:bd40::,2a07:bd47:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:bd80::,2a07:bd87:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:bdc0::,2a07:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:be00::,2a07:be07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:be40::,2a07:be47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:be80::,2a07:be87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:bec0::,2a07:bec7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:bf00::,2a07:bf07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:bf40::,2a07:bf47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:bf80::,2a07:bf87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:bfc0::,2a07:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:c000::,2a07:c007:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:c040::,2a07:c047:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:c080::,2a07:c087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:c0c0::,2a07:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:c100::,2a07:c107:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:c140::,2a07:c147:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a07:c180::,2a07:c187:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a07:c1c0::,2a07:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:c200::,2a07:c207:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a07:c240::,2a07:c247:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:c280::,2a07:c287:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a07:c2c0::,2a07:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:c300::,2a07:c307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:c340::,2a07:c347:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:c380::,2a07:c387:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a07:c3c0::,2a07:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a07:c400::,2a07:c407:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:c440::,2a07:c447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:c480::,2a07:c487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:c4c0::,2a07:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:c500::,2a07:c507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:c540::,2a07:c547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:c580::,2a07:c587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:c5c0::,2a07:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:c600::,2a07:c607:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:c640::,2a07:c647:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:c680::,2a07:c687:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a07:c6c0::,2a07:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:c700::,2a07:c707:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:c780::,2a07:c787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:c7c0::,2a07:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a07:c800::,2a07:c807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a07:c840::,2a07:c847:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a07:c880::,2a07:c887:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a07:c8c0::,2a07:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a07:c900::,2a07:c907:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a07:c940::,2a07:c947:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:c980::,2a07:c987:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:c9c0::,2a07:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a07:ca00::,2a07:ca07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a07:ca40::,2a07:ca47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:ca80::,2a07:ca87:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a07:cac0::,2a07:cac7:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a07:cb00::,2a07:cb00:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a07:cb40::,2a07:cb47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:d000::,2a07:d0ff:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a08::,2a08:1fff:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a::,2a0a:7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:40::,2a0a:47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:80::,2a0a:87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:c0::,2a0a:c7:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:100::,2a0a:107:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:140::,2a0a:147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:180::,2a0a:187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1c0::,2a0a:1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:200::,2a0a:200:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0a:240::,2a0a:247:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:280::,2a0a:287:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:2c0::,2a0a:2c0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:300::,2a0a:307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:340::,2a0a:347:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:380::,2a0a:387:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:3c0::,2a0a:3c0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:400::,2a0a:400:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:440::,2a0a:447:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:480::,2a0a:487:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:4c0::,2a0a:4c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:500::,2a0a:507:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:540::,2a0a:547:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:580::,2a0a:580:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:5c0::,2a0a:5c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:600::,2a0a:607:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:640::,2a0a:647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:680::,2a0a:687:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:6c0::,2a0a:6c7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:700::,2a0a:707:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:740::,2a0a:747:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:780::,2a0a:780:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:7c0::,2a0a:7c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:800::,2a0a:807:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:840::,2a0a:847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:880::,2a0a:880:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:8c0::,2a0a:8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:900::,2a0a:907:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:940::,2a0a:947:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:980::,2a0a:987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:9c0::,2a0a:9c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a00::,2a0a:a00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a40::,2a0a:a43:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:a80::,2a0a:a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:ac0::,2a0a:ac0:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a0a:b00::,2a0a:b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:b40::,2a0a:b47:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:b80::,2a0a:b87:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0a:bc0::,2a0a:bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:c00::,2a0a:c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:c40::,2a0a:c47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:c80::,2a0a:c87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:cc0::,2a0a:cc7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:d00::,2a0a:d07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:d40::,2a0a:d40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:d80::,2a0a:d87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:dc0::,2a0a:dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:e00::,2a0a:e07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:e40::,2a0a:e47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:e80::,2a0a:e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:ec0::,2a0a:ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:f00::,2a0a:f07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:f40::,2a0a:f40:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:f80::,2a0a:f87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:fc0::,2a0a:fc7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:1000::,2a0a:1007:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:1040::,2a0a:1047:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:10c0::,2a0a:10c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:1100::,2a0a:1107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1140::,2a0a:1147:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:1180::,2a0a:1187:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:11c0::,2a0a:11c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:1200::,2a0a:1207:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1240::,2a0a:1247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:1280::,2a0a:1287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:12c0::,2a0a:12c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:1300::,2a0a:1307:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1340::,2a0a:1347:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0a:1380::,2a0a:1387:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:13c0::,2a0a:13c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:1400::,2a0a:1407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:1440::,2a0a:1447:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:1480::,2a0a:1487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:14c0::,2a0a:14c0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:1500::,2a0a:1507:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1540::,2a0a:1547:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:1580::,2a0a:1587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:15c0::,2a0a:15c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1600::,2a0a:1607:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:1640::,2a0a:1647:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:1680::,2a0a:1687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:16c0::,2a0a:16c0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:1700::,2a0a:1707:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:1740::,2a0a:1747:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1780::,2a0a:1787:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:17c0::,2a0a:17c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:1800::,2a0a:1800:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1840::,2a0a:1847:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:1880::,2a0a:1887:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:18c0::,2a0a:18c7:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:1900::,2a0a:1907:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0a:1940::,2a0a:1947:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:1980::,2a0a:1987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:19c0::,2a0a:19c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:1a00::,2a0a:1a07:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:1a40::,2a0a:1a40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:1a80::,2a0a:1a87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:1ac0::,2a0a:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:1b00::,2a0a:1b07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:1b40::,2a0a:1b40:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0a:1b80::,2a0a:1b87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:1bc0::,2a0a:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:1c00::,2a0a:1c07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:1c40::,2a0a:1c47:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:1c80::,2a0a:1c87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:1cc0::,2a0a:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:1d00::,2a0a:1d00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:1d40::,2a0a:1d40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:1d80::,2a0a:1d87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1dc0::,2a0a:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0a:1e00::,2a0a:1e07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:1e40::,2a0a:1e40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1e80::,2a0a:1e87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:1ec0::,2a0a:1ec1:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:1f00::,2a0a:1f07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:1f40::,2a0a:1f42:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:1f43::,2a0a:1f44:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:1f45::,2a0a:1f47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:1f80::,2a0a:1f87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:1fc0::,2a0a:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2000::,2a0a:2007:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:2040::,2a0a:2047:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:2080::,2a0a:2087:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:20c0::,2a0a:20c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:2100::,2a0a:2107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:2140::,2a0a:2147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2180::,2a0a:2187:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:21c0::,2a0a:21c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:2200::,2a0a:2200:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:2240::,2a0a:2247:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:2280::,2a0a:2287:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:22c0::,2a0a:22c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:2340::,2a0a:2347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2380::,2a0a:2380:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0a:23c0::,2a0a:23c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:2400::,2a0a:2400:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:2440::,2a0a:2440:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:2480::,2a0a:2487:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:24c0::,2a0a:24c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:2500::,2a0a:2500:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:2540::,2a0a:2547:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:2580::,2a0a:2587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:25c0::,2a0a:25c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:2600::,2a0a:2607:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0a:2640::,2a0a:2647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2680::,2a0a:2687:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:26c0::,2a0a:26c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:2700::,2a0a:2707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:2740::,2a0a:2747:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a0a:2780::,2a0a:2783:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:2784::,2a0a:2784:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:2785::,2a0a:2787:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:27c0::,2a0a:27c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:2800::,2a0a:2807:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:2840::,2a0a:2847:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a0a:2880::,2a0a:2887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:28c0::,2a0a:28c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:2900::,2a0a:2907:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:2940::,2a0a:2947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:2980::,2a0a:2987:ffff:ffff:ffff:ffff:ffff:ffff,TJ +2a0a:29c0::,2a0a:29c0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:2a00::,2a0a:2a00:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:2a40::,2a0a:2a47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:2a80::,2a0a:2a87:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:2ac0::,2a0a:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:2b00::,2a0a:2b00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2b40::,2a0a:2b47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:2b80::,2a0a:2b87:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:2bc0::,2a0a:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2c00::,2a0a:2c07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:2c40::,2a0a:2c47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2c80::,2a0a:2c87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:2cc0::,2a0a:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:2d00::,2a0a:2d07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2d40::,2a0a:2d47:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:2d80::,2a0a:2d87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2dc0::,2a0a:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:2e00::,2a0a:2e07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:2e40::,2a0a:2e47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:2e80::,2a0a:2e87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:2ec0::,2a0a:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:2f00::,2a0a:2f07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:2f40::,2a0a:2f40:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:2f80::,2a0a:2f80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:2fc0::,2a0a:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:3000::,2a0a:3000:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3040::,2a0a:3047:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:3080::,2a0a:3087:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:30c0::,2a0a:30c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:3100::,2a0a:3107:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:3140::,2a0a:3147:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:3180::,2a0a:3187:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:31c0::,2a0a:31c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:3200::,2a0a:3207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:3240::,2a0a:3240:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0a:3280::,2a0a:3287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:32c0::,2a0a:32c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3300::,2a0a:3307:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:3340::,2a0a:3347:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:3380::,2a0a:3387:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:33c0::,2a0a:33c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3400::,2a0a:3407:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:3440::,2a0a:3447:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a0a:3480::,2a0a:3487:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:34c0::,2a0a:34c3:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:3500::,2a0a:3507:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:3540::,2a0a:3547:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:3580::,2a0a:3587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:35c0::,2a0a:35c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:3600::,2a0a:3607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:3640::,2a0a:3647:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:3680::,2a0a:3687:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0a:36c0::,2a0a:36c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:3700::,2a0a:3707:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:3740::,2a0a:3747:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:3780::,2a0a:3787:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:37c0::,2a0a:37c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:3800::,2a0a:3807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:3840::,2a0a:3847:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:3880::,2a0a:3887:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a0a:38c0::,2a0a:38c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:3900::,2a0a:3907:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:3940::,2a0a:3947:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a0a:3980::,2a0a:3980:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:39c0::,2a0a:39c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:3a00::,2a0a:3a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:3a40::,2a0a:3a40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:3a80::,2a0a:3a87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:3ac0::,2a0a:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3b00::,2a0a:3b00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:3b40::,2a0a:3b47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3bc0::,2a0a:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:3c00::,2a0a:3c00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:3c40::,2a0a:3c47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:3c80::,2a0a:3c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:3cc0::,2a0a:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:3d00::,2a0a:3d00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:3d40::,2a0a:3d47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:3d80::,2a0a:3d87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:3dc0::,2a0a:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:3e00::,2a0a:3e07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3e40::,2a0a:3e47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:3e80::,2a0a:3e87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:3ec0::,2a0a:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:3f00::,2a0a:3f00:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a0a:3f40::,2a0a:3f40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:3f80::,2a0a:3f80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:3fc0::,2a0a:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0a:4000::,2a0a:4007:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0a:4040::,2a0a:4047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:4080::,2a0a:4087:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:40c0::,2a0a:40c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:4100::,2a0a:4107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4140::,2a0a:4147:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:4180::,2a0a:4187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:41c0::,2a0a:41c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:4200::,2a0a:4207:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:4240::,2a0a:4247:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4280::,2a0a:4287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:42c0::,2a0a:42c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:4300::,2a0a:4307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4340::,2a0a:4347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4380::,2a0a:4387:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:43c0::,2a0a:43c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:4400::,2a0a:4407:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:4440::,2a0a:4440:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:4480::,2a0a:4487:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:44c0::,2a0a:44c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:4500::,2a0a:4507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4540::,2a0a:4540:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:4580::,2a0a:4587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:45c0::,2a0a:45c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:4600::,2a0a:4607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4640::,2a0a:4647:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:4680::,2a0a:4687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:46c0::,2a0a:46c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:4700::,2a0a:4707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:4740::,2a0a:4747:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:4780::,2a0a:4787:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:47c0::,2a0a:47c7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:4800::,2a0a:4807:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:4840::,2a0a:4847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4880::,2a0a:4887:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:48c0::,2a0a:48c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:4900::,2a0a:4907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:4940::,2a0a:4947:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:4980::,2a0a:4987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:49c0::,2a0a:49c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:4a00::,2a0a:4a07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:4a40::,2a0a:4a47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:4a80::,2a0a:4a87:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:4ac0::,2a0a:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:4b00::,2a0a:4b07:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0a:4b40::,2a0a:4b47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:4b80::,2a0a:4b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:4bc0::,2a0a:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4c00::,2a0a:4c06:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4c07::,2a0a:4c07::ffff:ffff:ffff:ffff:ffff,CA +2a0a:4c07:1::,2a0a:4c07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4c40::,2a0a:4c40:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a0a:4c80::,2a0a:4c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4cc0::,2a0a:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4d00::,2a0a:4d07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:4d40::,2a0a:4d40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:4d80::,2a0a:4d87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:4dc0::,2a0a:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4e00::,2a0a:4e07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:4e40::,2a0a:4e47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:4e80::,2a0a:4e82:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4e83::,2a0a:4e83:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:4e84::,2a0a:4e87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4ec0::,2a0a:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:4f00::,2a0a:4f07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:4f40::,2a0a:4f40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:4f80::,2a0a:4f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4fc0::,2a0a:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:5000::,2a0a:5007:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:5040::,2a0a:5040:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:5080::,2a0a:5087:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:50c0::,2a0a:50c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:5100::,2a0a:5107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:5140::,2a0a:5147:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:5180::,2a0a:5187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:51c0::,2a0a:51c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:5200::,2a0a:5200:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:5240::,2a0a:5247:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0a:5280::,2a0a:5287:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:52c0::,2a0a:52c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:5300::,2a0a:5307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:5340::,2a0a:5347:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:5380::,2a0a:5387:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:53c0::,2a0a:53c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:5400::,2a0a:5407:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:5440::,2a0a:5447:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:5480::,2a0a:5487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:54c0::,2a0a:54c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:5500::,2a0a:5507:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:5540::,2a0a:5547:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:5580::,2a0a:5587:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:55c0::,2a0a:55c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:5600::,2a0a:5607:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:5640::,2a0a:5640:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:5680::,2a0a:5687:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:56c0::,2a0a:56c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:5700::,2a0a:5707:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0a:5740::,2a0a:5740:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:5780::,2a0a:5780:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:57c0::,2a0a:57c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:5800::,2a0a:5807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:5840::,2a0a:5840:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:5880::,2a0a:5887:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:58c0::,2a0a:58c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:5900::,2a0a:5907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:5940::,2a0a:5947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:5980::,2a0a:5987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:59c0::,2a0a:59c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:5a00::,2a0a:5a07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:5a40::,2a0a:5a47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:5a80::,2a0a:5a87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:5ac0::,2a0a:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:5b00::,2a0a:5b07:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0a:5b40::,2a0a:5b47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:5b80::,2a0a:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:5bc0::,2a0a:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:5c00::,2a0a:5c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:5c40::,2a0a:5c47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:5c80::,2a0a:5c87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:5cc0::,2a0a:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:5d00::,2a0a:5d00:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:5d40::,2a0a:5d47:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:5d80::,2a0a:5d87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:5dc0::,2a0a:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:5e00::,2a0a:5e07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:5e40::,2a0a:5e40:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:5e80::,2a0a:5e87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:5ec0::,2a0a:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:5f00::,2a0a:5f07:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:5f40::,2a0a:5f40:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:5f80::,2a0a:5f87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:5fc0::,2a0a:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:6000::,2a0a:6007:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:6040::,2a0a:6047:ffff:ffff:ffff:ffff:ffff:ffff,GL +2a0a:6080::,2a0a:6087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:60c0::,2a0a:60c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:6100::,2a0a:6107:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:6140::,2a0a:6147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:6180::,2a0a:6187:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:61c0::,2a0a:61c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:6200::,2a0a:6200:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6240::,2a0a:6247:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:6280::,2a0a:6287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:62c0::,2a0a:62c0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:6300::,2a0a:6307:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:6340::,2a0a:6347:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:6380::,2a0a:6387:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:63c0::,2a0a:63c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6400::,2a0a:6407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:6440::,2a0a:6447:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:6480::,2a0a:6487:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:64c0::,2a0a:64c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:6500::,2a0a:6507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6540::,2a0a:6547:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:6580::,2a0a:6580:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:65c0::,2a0a:65c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:6600::,2a0a:6607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6640::,2a0a:6647:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:6680::,2a0a:6680:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:66c0::,2a0a:66c0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0a:6700::,2a0a:6707:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6740::,2a0a:6747:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:6780::,2a0a:6787:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:67c0::,2a0a:67c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:6800::,2a0a:6807:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:6840::,2a0a:6847:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6880::,2a0a:6887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:68c0::,2a0a:68c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:6900::,2a0a:6907:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:6940::,2a0a:6947:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:6980::,2a0a:6980:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:69c0::,2a0a:69c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:6a00::,2a0a:6a07:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0a:6a40::,2a0a:6a47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:6a80::,2a0a:6a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6ac0::,2a0a:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:6b00::,2a0a:6b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:6b40::,2a0a:6b47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:6b80::,2a0a:6b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6bc0::,2a0a:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:6c00::,2a0a:6c07:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:6c40::,2a0a:6c47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:6c80::,2a0a:6c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6cc0::,2a0a:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:6d00::,2a0a:6d07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:6d40::,2a0a:6d47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:6d80::,2a0a:6d87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:6dc0::,2a0a:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:6e00::,2a0a:6e00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6e40::,2a0a:6e47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:6e80::,2a0a:6e87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:6ec0::,2a0a:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6f00::,2a0a:6f07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:6f40::,2a0a:6f47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:6f80::,2a0a:6f80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:6fc0::,2a0a:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:7000::,2a0a:7007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:7040::,2a0a:7047:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:7080::,2a0a:7087:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:70c0::,2a0a:70c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:7100::,2a0a:7107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7140::,2a0a:7147:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:7180::,2a0a:7187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:71c0::,2a0a:71c0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:7200::,2a0a:7207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7240::,2a0a:7240:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7280::,2a0a:7287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:72c0::,2a0a:72c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7300::,2a0a:7300:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:7340::,2a0a:7347:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:7380::,2a0a:7387:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a0a:73c0::,2a0a:73c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:7400::,2a0a:7407:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:7440::,2a0a:7447:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:7480::,2a0a:7487:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:74c0::,2a0a:74c0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:7500::,2a0a:7500:ffff:ffff:ffff:ffff:ffff:ffff,TJ +2a0a:7540::,2a0a:7547:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:7580::,2a0a:7587:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:75c0::,2a0a:75c0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:7600::,2a0a:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7640::,2a0a:7647:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7680::,2a0a:7687:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:76c0::,2a0a:76c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:7700::,2a0a:7707:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7740::,2a0a:7747:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:7780::,2a0a:7787:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:77c0::,2a0a:77c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:7800::,2a0a:7807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:7840::,2a0a:7847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:7880::,2a0a:7887:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:78c0::,2a0a:78c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:7900::,2a0a:7907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7940::,2a0a:7940:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:7980::,2a0a:7987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:79c0::,2a0a:79c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:7a00::,2a0a:7a04:7fff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:7a04:8000::,2a0a:7a04:8000:ffff:ffff:ffff:ffff:ffff,US +2a0a:7a04:8001::,2a0a:7a04:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:7a05::,2a0a:7a05:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:7a06::,2a0a:7a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:7a40::,2a0a:7a47:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:7a80::,2a0a:7a80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:7ac0::,2a0a:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:7b00::,2a0a:7b07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:7b40::,2a0a:7b47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7b80::,2a0a:7b87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:7bc0::,2a0a:7bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:7c00::,2a0a:7c07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:7c40::,2a0a:7c40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:7c80::,2a0a:7c80:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:7cc0::,2a0a:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:7d00::,2a0a:7d07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:7d40::,2a0a:7d40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:7d80::,2a0a:7d87:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a0a:7dc0::,2a0a:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:7e00::,2a0a:7e03:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:7e04::,2a0a:7e04::ffff:ffff:ffff:ffff:ffff,US +2a0a:7e04:1::,2a0a:7e07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:7e40::,2a0a:7e47:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0a:7e80::,2a0a:7e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:7ec0::,2a0a:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:7f00::,2a0a:7f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:7f40::,2a0a:7f47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:7f80::,2a0a:7f87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:7fc0::,2a0a:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8000::,2a0a:8007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:8040::,2a0a:8047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:8080::,2a0a:8087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:80c0::,2a0a:80c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:8140::,2a0a:8140:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:8180::,2a0a:8187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:81c0::,2a0a:81c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:8200::,2a0a:8207:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0a:8240::,2a0a:8247:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:8280::,2a0a:8287:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:82c0::,2a0a:82c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:8300::,2a0a:8307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:8340::,2a0a:8347:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:8380::,2a0a:8387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:83c0::,2a0a:83c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:8400::,2a0a:8407:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:8440::,2a0a:8447:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:8480::,2a0a:8480:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:84c0::,2a0a:84c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:8500::,2a0a:8507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8540::,2a0a:8547:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:8580::,2a0a:8587:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:85c0::,2a0a:85c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:8600::,2a0a:8604:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8605::,2a0a:8605::ffff:ffff:ffff:ffff:ffff,US +2a0a:8605:1::,2a0a:8605:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8606::,2a0a:8606:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:8607::,2a0a:8607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:8640::,2a0a:8647:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:8680::,2a0a:8687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:86c0::,2a0a:86c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:8700::,2a0a:8707:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:8740::,2a0a:8747:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:8780::,2a0a:8787:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:87c0::,2a0a:87c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:8800::,2a0a:8807:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:8840::,2a0a:8847:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:8880::,2a0a:8887:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:88c0::,2a0a:88c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:8900::,2a0a:8907:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:8940::,2a0a:8947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8980::,2a0a:8987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:89c0::,2a0a:89c7:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0a:8a00::,2a0a:8a00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:8a40::,2a0a:8a40:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:8a80::,2a0a:8a87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:8ac0::,2a0a:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:8b00::,2a0a:8b07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:8b40::,2a0a:8b47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:8b80::,2a0a:8b87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8bc0::,2a0a:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:8c00::,2a0a:8c07:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:8c40::,2a0a:8c47:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:8c80::,2a0a:8c87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:8cc0::,2a0a:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:8d00::,2a0a:8d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:8d40::,2a0a:8d47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:8d80::,2a0a:8d87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:8dc0::,2a0a:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:8e00::,2a0a:8e01:1236:ffff:ffff:ffff:ffff:ffff,US +2a0a:8e01:1237::,2a0a:8e01:1237:ffff:ffff:ffff:ffff:ffff,CA +2a0a:8e01:1238::,2a0a:8e07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:8e40::,2a0a:8e47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:8e80::,2a0a:8e87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:8ec0::,2a0a:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8f00::,2a0a:8f00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8f40::,2a0a:8f47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8f80::,2a0a:8f87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:8fc0::,2a0a:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:9000::,2a0a:9007:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0a:9040::,2a0a:9047:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:9080::,2a0a:9087:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:90c0::,2a0a:90c7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:9100::,2a0a:9107:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:9140::,2a0a:9140:ffff:ffff:ffff:ffff:ffff:ffff,CA +2a0a:9141::,2a0a:9147:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9180::,2a0a:9180:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:91c0::,2a0a:91c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:9200::,2a0a:9200:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:9201::,2a0a:9201:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:9202::,2a0a:9202:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:9203::,2a0a:9203:ffff:ffff:ffff:ffff:ffff:ffff,CA +2a0a:9204::,2a0a:9204:ab6c:ffff:ffff:ffff:ffff:ffff,US +2a0a:9204:ab6d::,2a0a:9204:ab6d:ffff:ffff:ffff:ffff:ffff,CA +2a0a:9204:ab6e::,2a0a:9207:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9240::,2a0a:9247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:9280::,2a0a:9287:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:92c0::,2a0a:92c7:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0a:9300::,2a0a:9307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:9340::,2a0a:9340:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:9380::,2a0a:9387:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:93c0::,2a0a:93c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:9400::,2a0a:9407:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:9440::,2a0a:9447:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:9480::,2a0a:9480:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0a:94c0::,2a0a:94c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:9500::,2a0a:9507:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:9540::,2a0a:9547:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:9580::,2a0a:9587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:95c0::,2a0a:95c0:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:9600::,2a0a:9603:49cd:ffff:ffff:ffff:ffff:ffff,US +2a0a:9603:49ce::,2a0a:9603:49ce:ffff:ffff:ffff:ffff:ffff,CA +2a0a:9603:49cf::,2a0a:9607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9640::,2a0a:9647:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:9680::,2a0a:9687:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:96c0::,2a0a:96c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:9700::,2a0a:9700:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:9740::,2a0a:9740:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:9780::,2a0a:9787:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:97c0::,2a0a:97c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:9800::,2a0a:9807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:9840::,2a0a:9847:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:9880::,2a0a:9887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:98c0::,2a0a:98c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:9900::,2a0a:9907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:9940::,2a0a:9947:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:9980::,2a0a:9987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:99c0::,2a0a:99c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:9a00::,2a0a:9a02:b3d1:ffff:ffff:ffff:ffff:ffff,US +2a0a:9a02:b3d2::,2a0a:9a02:b3d2:ffff:ffff:ffff:ffff:ffff,CA +2a0a:9a02:b3d3::,2a0a:9a07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9a40::,2a0a:9a47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:9a80::,2a0a:9a80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:9ac0::,2a0a:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:9b00::,2a0a:9b07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9b40::,2a0a:9b47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:9b80::,2a0a:9b80:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:9bc0::,2a0a:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:9c00::,2a0a:9c07:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:9c40::,2a0a:9c47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:9c80::,2a0a:9c80:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:9cc0::,2a0a:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:9d00::,2a0a:9d00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:9d40::,2a0a:9d47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:9d80::,2a0a:9d87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:9dc0::,2a0a:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:9e00::,2a0a:9e07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9e40::,2a0a:9e47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:9e80::,2a0a:9e87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:9ec0::,2a0a:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:9f00::,2a0a:9f07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9f40::,2a0a:9f47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:9f80::,2a0a:9f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:9fc0::,2a0a:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:a000::,2a0a:a000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a040::,2a0a:a047:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:a080::,2a0a:a087:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:a0c0::,2a0a:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a0a:a100::,2a0a:a100:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:a140::,2a0a:a147:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0a:a180::,2a0a:a180:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:a1c0::,2a0a:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:a200::,2a0a:a207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a280::,2a0a:a280:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a2c0::,2a0a:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:a300::,2a0a:a307:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:a340::,2a0a:a347:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:a380::,2a0a:a387:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:a3c0::,2a0a:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:a400::,2a0a:a407:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:a440::,2a0a:a447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:a480::,2a0a:a487:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:a4c0::,2a0a:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:a500::,2a0a:a507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a540::,2a0a:a540:29df:ffff:ffff:ffff:ffff:ffff,DE +2a0a:a540:29e0::,2a0a:a540:29e0:7fff:ffff:ffff:ffff:ffff,US +2a0a:a540:29e0:8000::,2a0a:a547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:a580::,2a0a:a587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:a5c0::,2a0a:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a600::,2a0a:a607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:a640::,2a0a:a640:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:a680::,2a0a:a687:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:a6c0::,2a0a:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a700::,2a0a:a707:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:a740::,2a0a:a747:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a0a:a780::,2a0a:a787:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:a7c0::,2a0a:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:a800::,2a0a:a807:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:a840::,2a0a:a847:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:a880::,2a0a:a887:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:a8c0::,2a0a:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:a900::,2a0a:a900:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:a940::,2a0a:a947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:a980::,2a0a:a987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a9c0::,2a0a:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:aa00::,2a0a:aa03:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0a:aa40::,2a0a:aa47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:aa80::,2a0a:aa87:ffff:ffff:ffff:ffff:ffff:ffff,IM +2a0a:aac0::,2a0a:aac0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:ab00::,2a0a:ab07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:ab40::,2a0a:ab47:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a0a:ab80::,2a0a:ab80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:abc0::,2a0a:abc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:ac00::,2a0a:ac07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:ac40::,2a0a:ac40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:ac80::,2a0a:ac87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:acc0::,2a0a:acc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:ad00::,2a0a:ad07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:ad40::,2a0a:ad47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:ad80::,2a0a:ad87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:adc0::,2a0a:adc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:ae00::,2a0a:ae07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:ae40::,2a0a:ae47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:ae80::,2a0a:ae87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:aec0::,2a0a:aec7:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a0a:af00::,2a0a:af07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:af40::,2a0a:af47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:af80::,2a0a:af87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:afc0::,2a0a:afc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:b000::,2a0a:b000:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b040::,2a0a:b047:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:b080::,2a0a:b087:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:b0c0::,2a0a:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:b100::,2a0a:b107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:b140::,2a0a:b140:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a0a:b180::,2a0a:b187:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:b1c0::,2a0a:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:b200::,2a0a:b207:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:b240::,2a0a:b247:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:b280::,2a0a:b287:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:b2c0::,2a0a:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:b300::,2a0a:b307:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:b340::,2a0a:b347:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:b380::,2a0a:b387:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:b3c0::,2a0a:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:b400::,2a0a:b407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:b440::,2a0a:b447:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:b480::,2a0a:b487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b4c0::,2a0a:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:b500::,2a0a:b507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:b540::,2a0a:b540:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:b580::,2a0a:b587:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:b5c0::,2a0a:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0a:b600::,2a0a:b607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:b640::,2a0a:b640::ffff:ffff:ffff:ffff:ffff,GB +2a0a:b640:1::,2a0a:b640:1:ffff:ffff:ffff:ffff:ffff,SG +2a0a:b640:2::,2a0a:b647:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:b680::,2a0a:b687:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:b6c0::,2a0a:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:b740::,2a0a:b747:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:b780::,2a0a:b787:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:b7c0::,2a0a:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:b800::,2a0a:b807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b840::,2a0a:b847:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:b880::,2a0a:b887:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:b8c0::,2a0a:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:b900::,2a0a:b907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b940::,2a0a:b947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b980::,2a0a:b980:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b9c0::,2a0a:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:ba00::,2a0a:ba07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:ba40::,2a0a:ba47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:ba80::,2a0a:ba87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:bac0::,2a0a:bac7:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a0a:bb00::,2a0a:bb07:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a0a:bb40::,2a0a:bb47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:bb80::,2a0a:bb87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:bbc0::,2a0a:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:bc00::,2a0a:bc07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:bc40::,2a0a:bc40:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:bc80::,2a0a:bc87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:bcc0::,2a0a:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:bd00::,2a0a:bd00:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:bd40::,2a0a:bd47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:bd80::,2a0a:bd80:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:bdc0::,2a0a:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:be00::,2a0a:be07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:be40::,2a0a:be47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:be80::,2a0a:be87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:bec0::,2a0a:bec7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:bf00::,2a0a:bf07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:bf40::,2a0a:bf47:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0a:bf80::,2a0a:bf87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:bfc0::,2a0a:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:c000::,2a0a:c007:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:c040::,2a0a:c047:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:c080::,2a0a:c087:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:c0c0::,2a0a:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:c100::,2a0a:c107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:c140::,2a0a:c140:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:c180::,2a0a:c187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:c1c0::,2a0a:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:c200::,2a0a:c207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:c240::,2a0a:c240:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:c280::,2a0a:c287:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:c2c0::,2a0a:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:c300::,2a0a:c307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:c340::,2a0a:c340:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:c380::,2a0a:c387:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:c3c0::,2a0a:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:c400::,2a0a:c407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:c440::,2a0a:c447:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:c480::,2a0a:c487:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:c4c0::,2a0a:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:c500::,2a0a:c507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:c540::,2a0a:c547:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:c580::,2a0a:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:c5c0::,2a0a:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:c600::,2a0a:c607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:c640::,2a0a:c647:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:c680::,2a0a:c687:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:c6c0::,2a0a:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:c700::,2a0a:c707:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:c740::,2a0a:c747:ffff:ffff:ffff:ffff:ffff:ffff,OM +2a0a:c780::,2a0a:c787:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:c7c0::,2a0a:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:c800::,2a0a:c800:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:c801::,2a0a:c807:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:c840::,2a0a:c847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:c880::,2a0a:c880:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:c8c0::,2a0a:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0a:c900::,2a0a:c907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:c940::,2a0a:c940:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:c980::,2a0a:c987:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:c9c0::,2a0a:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a0a:ca00::,2a0a:ca00:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:ca40::,2a0a:ca47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:ca80::,2a0a:ca87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:cac0::,2a0a:cac7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:cb00::,2a0a:cb07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:cb40::,2a0a:cb47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:cb80::,2a0a:cb80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:cbc0::,2a0a:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:cc00::,2a0a:cc07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:cc40::,2a0a:cc47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:cc80::,2a0a:cc87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:ccc0::,2a0a:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:cd00::,2a0a:cd00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:cd40::,2a0a:cd47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:cd80::,2a0a:cd87:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:cdc0::,2a0a:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:ce00::,2a0a:ce07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:ce40::,2a0a:ce47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:ce80::,2a0a:ce87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:cec0::,2a0a:cec7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:cf00::,2a0a:cf07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:cf40::,2a0a:cf47:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a0a:cf80::,2a0a:cf87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:cfc0::,2a0a:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:d000::,2a0a:d007:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:d040::,2a0a:d047:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:d080::,2a0a:d087:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:d0c0::,2a0a:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:d100::,2a0a:d107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:d140::,2a0a:d147:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:d180::,2a0a:d187:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a0a:d1c0::,2a0a:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:d200::,2a0a:d207:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:d240::,2a0a:d247:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:d280::,2a0a:d287:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:d2c0::,2a0a:d2c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:d300::,2a0a:d307:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:d340::,2a0a:d347:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:d380::,2a0a:d387:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:d3c0::,2a0a:d3c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:d400::,2a0a:d407:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:d440::,2a0a:d447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:d480::,2a0a:d487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:d4c0::,2a0a:d4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:d500::,2a0a:d507:ffff:ffff:ffff:ffff:ffff:ffff,FO +2a0a:d540::,2a0a:d547:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:d580::,2a0a:d587:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:d5c0::,2a0a:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:d600::,2a0a:d607:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:d640::,2a0a:d647:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:d6c0::,2a0a:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:d700::,2a0a:d707:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:d740::,2a0a:d747:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:d780::,2a0a:d787:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:d7c0::,2a0a:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:d800::,2a0a:d807:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:d840::,2a0a:d847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:d880::,2a0a:d887:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:d8c0::,2a0a:d8c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0a:d900::,2a0a:d900:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:d940::,2a0a:d947:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0a:d980::,2a0a:d987:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:d9c0::,2a0a:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:da00::,2a0a:da00:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a0a:da40::,2a0a:da47:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:da80::,2a0a:da87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:dac0::,2a0a:dac7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:db00::,2a0a:db00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:db40::,2a0a:db47:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:db80::,2a0a:db87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:dbc0::,2a0a:dbc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:dc00::,2a0a:dc07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:dc40::,2a0a:dc47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:dc80::,2a0a:dc87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:dcc0::,2a0a:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:dd00::,2a0a:dd07:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:dd40::,2a0a:dd47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:dd80::,2a0a:dd87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:ddc0::,2a0a:ddc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:de00::,2a0a:de00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:de40::,2a0a:de40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:de80::,2a0a:de80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:dec0::,2a0a:dec7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:df00::,2a0a:df07:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:df40::,2a0a:df47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:df80::,2a0a:df87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:dfc0::,2a0a:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:e000::,2a0a:e007:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:e040::,2a0a:e047:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:e080::,2a0a:e087:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:e0c0::,2a0a:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:e100::,2a0a:e107:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:e140::,2a0a:e147:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:e180::,2a0a:e187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:e1c0::,2a0a:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:e240::,2a0a:e247:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:e280::,2a0a:e287:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:e2c0::,2a0a:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:e300::,2a0a:e303:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a0a:e340::,2a0a:e347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:e380::,2a0a:e387:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:e3c0::,2a0a:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:e400::,2a0a:e407:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:e440::,2a0a:e447:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:e480::,2a0a:e487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:e4c0::,2a0a:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:e500::,2a0a:e500:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:e540::,2a0a:e547:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:e580::,2a0a:e587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:e5c0::,2a0a:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:e600::,2a0a:e600:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:e640::,2a0a:e647:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:e680::,2a0a:e687:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:e6c0::,2a0a:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:e700::,2a0a:e700:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:e740::,2a0a:e747:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:e780::,2a0a:e787:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:e7c0::,2a0a:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:e800::,2a0a:e807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:e840::,2a0a:e847:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:e880::,2a0a:e887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:e8c0::,2a0a:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:e900::,2a0a:e907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:e940::,2a0a:e947:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:e980::,2a0a:e987:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:e9c0::,2a0a:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:ea00::,2a0a:ea00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:ea40::,2a0a:ea47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:ea80::,2a0a:ea87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:eac0::,2a0a:eac7:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a0a:eb00::,2a0a:eb07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:eb40::,2a0a:eb47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:eb80::,2a0a:eb80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:ebc0::,2a0a:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:ec00::,2a0a:ec07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:ec40::,2a0a:ec40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:ec80::,2a0a:ec87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:ecc0::,2a0a:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:ed00::,2a0a:ed07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:ed40::,2a0a:ed47:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:edc0::,2a0a:edc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:ee00::,2a0a:ee07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:ee40::,2a0a:ee40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:ee80::,2a0a:ee87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:eec0::,2a0a:eec0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:ef00::,2a0a:ef07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:ef40::,2a0a:ef47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:ef80::,2a0a:ef87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:efc0::,2a0a:efc7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:f000::,2a0a:f000:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:f040::,2a0a:f047:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:f080::,2a0a:f087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:f0c0::,2a0a:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:f100::,2a0a:f100:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0a:f140::,2a0a:f140:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:f180::,2a0a:f187:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:f1c0::,2a0a:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:f200::,2a0a:f207:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:f240::,2a0a:f247:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a0a:f280::,2a0a:f287:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:f2c0::,2a0a:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:f300::,2a0a:f307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:f340::,2a0a:f347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:f380::,2a0a:f387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:f3c0::,2a0a:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:f400::,2a0a:f407:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:f440::,2a0a:f447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:f480::,2a0a:f487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:f4c0::,2a0a:f4c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:f500::,2a0a:f500:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:f540::,2a0a:f547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:f580::,2a0a:f587:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:f5c0::,2a0a:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0a:f600::,2a0a:f607:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:f640::,2a0a:f647:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:f680::,2a0a:f687:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:f6c0::,2a0a:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:f700::,2a0a:f707:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:f740::,2a0a:f747:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:f780::,2a0a:f787:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:f7c0::,2a0a:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a0a:f800::,2a0a:f807:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:f840::,2a0a:f847:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:f880::,2a0a:f887:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:f8c0::,2a0a:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:f900::,2a0a:f907:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:f940::,2a0a:f940:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:f980::,2a0a:f987:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:fa00::,2a0a:fa07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:fa40::,2a0a:fa47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:fa80::,2a0a:fa87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:fac0::,2a0a:fac7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:fb00::,2a0a:fb00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:fb40::,2a0a:fb47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:fb80::,2a0a:fb87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:fbc0::,2a0a:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:fc00::,2a0a:fc07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:fc40::,2a0a:fc47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:fc80::,2a0a:fc80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:fcc0::,2a0a:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:fd00::,2a0a:fd00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:fd40::,2a0a:fd40:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:fd80::,2a0a:fd87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:fdc0::,2a0a:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:fe00::,2a0a:fe03:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:fe40::,2a0a:fe47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:fe80::,2a0a:fe87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:fec0::,2a0a:fec7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:ff00::,2a0a:ff00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:ff40::,2a0a:ff47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:ff80::,2a0a:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:ffc0::,2a0a:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b::,2a0b:7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:40::,2a0b:47:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a0b:80::,2a0b:87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:c0::,2a0b:c7:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0b:100::,2a0b:107:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:140::,2a0b:147:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:180::,2a0b:187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:1c0::,2a0b:1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:200::,2a0b:207:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:240::,2a0b:247:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:280::,2a0b:287:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0b:2c0::,2a0b:2c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:300::,2a0b:307:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:340::,2a0b:347:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:380::,2a0b:387:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:3c0::,2a0b:3c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:400::,2a0b:407:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:440::,2a0b:447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:480::,2a0b:487:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:4c0::,2a0b:4c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:500::,2a0b:507:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:540::,2a0b:547:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:580::,2a0b:580:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:5c0::,2a0b:5c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:600::,2a0b:600:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:640::,2a0b:643:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:680::,2a0b:687:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:6c0::,2a0b:6c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:700::,2a0b:707:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:740::,2a0b:747:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:780::,2a0b:787:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:7c0::,2a0b:7c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:800::,2a0b:807:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:840::,2a0b:847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:880::,2a0b:880:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a0b:8c0::,2a0b:8c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:900::,2a0b:900:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:940::,2a0b:947:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:980::,2a0b:980:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:9c0::,2a0b:9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:a00::,2a0b:a07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:a40::,2a0b:a47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:a80::,2a0b:a87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:ac0::,2a0b:ac7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:b00::,2a0b:b07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:b40::,2a0b:b47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:b80::,2a0b:b87:ffe6:ffff:ffff:ffff:ffff:ffff,GB +2a0b:b87:ffe7::,2a0b:b87:ffe7:7fff:ffff:ffff:ffff:ffff,BE +2a0b:b87:ffe7:8000::,2a0b:b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:bc0::,2a0b:bc7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:c00::,2a0b:c00:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a0b:c40::,2a0b:c47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:c80::,2a0b:c87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:cc0::,2a0b:cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:d00::,2a0b:d07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:d40::,2a0b:d47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:d80::,2a0b:d87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:dc0::,2a0b:dc7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:e00::,2a0b:e07:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:e40::,2a0b:e47:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a0b:e80::,2a0b:e87:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0b:ec0::,2a0b:ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:f00::,2a0b:f07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:f40::,2a0b:f47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:f80::,2a0b:f87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:fc0::,2a0b:fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:1000::,2a0b:1007:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:1040::,2a0b:1047:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:1080::,2a0b:1087:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:10c0::,2a0b:10c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0b:1100::,2a0b:1107:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0b:1140::,2a0b:1147:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:1180::,2a0b:1187:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:11c0::,2a0b:11c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:1200::,2a0b:1207:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:1240::,2a0b:1247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:1280::,2a0b:1287:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:12c0::,2a0b:12c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:1300::,2a0b:1307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:1340::,2a0b:1347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:1380::,2a0b:1387:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:13c0::,2a0b:13c7:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a0b:1400::,2a0b:1407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:1440::,2a0b:1440:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:1480::,2a0b:1480:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:14c0::,2a0b:14c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:1500::,2a0b:1507:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:1540::,2a0b:1547:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:1580::,2a0b:1587:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:15c0::,2a0b:15c7:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a0b:1600::,2a0b:1607:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:1640::,2a0b:1647:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:1680::,2a0b:1680:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:16c0::,2a0b:16c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:1700::,2a0b:1707:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:1740::,2a0b:1747:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:1780::,2a0b:1787:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0b:17c0::,2a0b:17c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:1800::,2a0b:1807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:1840::,2a0b:1847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:1880::,2a0b:1887:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0b:18c0::,2a0b:18c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:1900::,2a0b:1907:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:1940::,2a0b:1940:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0b:1980::,2a0b:1987:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a0b:19c0::,2a0b:19c7:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:1a00::,2a0b:1a07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:1a40::,2a0b:1a40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:1a80::,2a0b:1a87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:1ac0::,2a0b:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:1b00::,2a0b:1b07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:1b40::,2a0b:1b47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:1b80::,2a0b:1b87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:1bc0::,2a0b:1bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:1c00::,2a0b:1c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:1c40::,2a0b:1c47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:1c80::,2a0b:1c87:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a0b:1cc0::,2a0b:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:1d00::,2a0b:1d07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:1d40::,2a0b:1d40:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a0b:1d80::,2a0b:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:1dc0::,2a0b:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:1e00::,2a0b:1e07:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0b:1e40::,2a0b:1e47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:1e80::,2a0b:1e87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:1ec0::,2a0b:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:1f00::,2a0b:1f07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:1f40::,2a0b:1f47:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0b:1f80::,2a0b:1f87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:1fc0::,2a0b:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:2000::,2a0b:2007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:2040::,2a0b:2047:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:2080::,2a0b:2087:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:20c0::,2a0b:20c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:2100::,2a0b:2107:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:2140::,2a0b:2147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:2180::,2a0b:2180:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:21c0::,2a0b:21c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:2200::,2a0b:2207:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:2240::,2a0b:2247:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:2280::,2a0b:2287:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:22c0::,2a0b:22c7:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a0b:2300::,2a0b:2300:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:2340::,2a0b:2347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:2380::,2a0b:2387:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:23c0::,2a0b:23c7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:2400::,2a0b:2400:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:2440::,2a0b:2447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:2480::,2a0b:2480:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:24c0::,2a0b:24c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:2500::,2a0b:2507:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:2540::,2a0b:2547:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:2580::,2a0b:2587:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:25c0::,2a0b:25c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:2600::,2a0b:2607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:2640::,2a0b:2647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:2680::,2a0b:2687:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:26c0::,2a0b:26c7:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0b:2700::,2a0b:2707:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:2740::,2a0b:2747:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:2780::,2a0b:2787:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:27c0::,2a0b:27c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:2800::,2a0b:2807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:2840::,2a0b:2847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:2880::,2a0b:2887:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:28c0::,2a0b:28c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:2900::,2a0b:2900:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:2940::,2a0b:2947:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:2980::,2a0b:2980:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:29c0::,2a0b:29c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:2a00::,2a0b:2a07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:2a40::,2a0b:2a47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:2a80::,2a0b:2a87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:2ac0::,2a0b:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:2b00::,2a0b:2b07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:2b40::,2a0b:2b47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:2b80::,2a0b:2b87:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a0b:2bc0::,2a0b:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:2c00::,2a0b:2c07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:2c40::,2a0b:2c47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:2c80::,2a0b:2c87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:2cc0::,2a0b:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0b:2d00::,2a0b:2d07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:2d40::,2a0b:2d40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:2d80::,2a0b:2d87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:2dc0::,2a0b:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:2e00::,2a0b:2e07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:2e40::,2a0b:2e47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:2e80::,2a0b:2e87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:2ec0::,2a0b:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:2f00::,2a0b:2f00:bd:ffff:ffff:ffff:ffff:ffff,RO +2a0b:2f00:be::,2a0b:2f00:be:7fff:ffff:ffff:ffff:ffff,BE +2a0b:2f00:be:8000::,2a0b:2f07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0b:2f40::,2a0b:2f40:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:2f80::,2a0b:2f87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:2fc0::,2a0b:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:3000::,2a0b:3007:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:3040::,2a0b:3040:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:3080::,2a0b:3080:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:30c0::,2a0b:30c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:3100::,2a0b:3107:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:3140::,2a0b:3147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:3180::,2a0b:3187:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:31c0::,2a0b:31c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:3200::,2a0b:3207:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:3240::,2a0b:3240:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:3280::,2a0b:3280:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:32c0::,2a0b:32c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:3300::,2a0b:3307:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:3340::,2a0b:3347:ffff:ffff:ffff:ffff:ffff:ffff,TJ +2a0b:3380::,2a0b:3387:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:33c0::,2a0b:33c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:3400::,2a0b:3407:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:3440::,2a0b:3447:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:3480::,2a0b:3487:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:34c0::,2a0b:34c7:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a0b:3500::,2a0b:3500:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:3580::,2a0b:3587:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:35c0::,2a0b:35c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:3600::,2a0b:3607:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:3640::,2a0b:3647:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:3680::,2a0b:3687:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:36c0::,2a0b:36c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:3700::,2a0b:3707:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:3740::,2a0b:3747:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:3780::,2a0b:3780:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:37c0::,2a0b:37c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:3800::,2a0b:3807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:3840::,2a0b:3847:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:3880::,2a0b:3880:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:38c0::,2a0b:38c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:3900::,2a0b:3907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:3940::,2a0b:3947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:3980::,2a0b:3980:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:39c0::,2a0b:39c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:3a00::,2a0b:3a07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:3a40::,2a0b:3a40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:3a80::,2a0b:3a80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:3ac0::,2a0b:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:3b00::,2a0b:3b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:3b40::,2a0b:3b47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:3b80::,2a0b:3b87:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a0b:3bc0::,2a0b:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:3c00::,2a0b:3c07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:3c40::,2a0b:3c47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:3c80::,2a0b:3c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:3cc0::,2a0b:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:3d00::,2a0b:3d07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:3d40::,2a0b:3d47:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a0b:3d80::,2a0b:3d87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:3dc0::,2a0b:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0b:3e00::,2a0b:3e00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:3e40::,2a0b:3e47:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a0b:3e80::,2a0b:3e87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:3ec0::,2a0b:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0b:3f00::,2a0b:3f07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:3f40::,2a0b:3f47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:3f80::,2a0b:3f87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0b:3fc0::,2a0b:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:4000::,2a0b:4007:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0b:4040::,2a0b:4047:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4080::,2a0b:4080:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:40c0::,2a0b:40c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:4100::,2a0b:4107:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:4140::,2a0b:4147:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0b:4180::,2a0b:4187:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a0b:41c0::,2a0b:41c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:4200::,2a0b:4207:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:4240::,2a0b:4247:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:4280::,2a0b:4287:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:42c0::,2a0b:42c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:4300::,2a0b:4307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:4340::,2a0b:4340:98:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4340:99::,2a0b:4340:99:7fff:ffff:ffff:ffff:ffff,CN +2a0b:4340:99:8000::,2a0b:4342:1fff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4342:2000::,2a0b:4342:2000:7fff:ffff:ffff:ffff:ffff,RU +2a0b:4342:2000:8000::,2a0b:4347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4380::,2a0b:4387:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:43c0::,2a0b:43c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:4400::,2a0b:4407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4440::,2a0b:4447:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a0b:4480::,2a0b:4487:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0b:44c0::,2a0b:44c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:4500::,2a0b:4507:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:4540::,2a0b:4547:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4580::,2a0b:4587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:45c0::,2a0b:45c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:4600::,2a0b:4600:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0b:4640::,2a0b:4647:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:4680::,2a0b:4687:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:46c0::,2a0b:46c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:4700::,2a0b:4707:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:4740::,2a0b:4740:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:47c0::,2a0b:47c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:4800::,2a0b:4807:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:4840::,2a0b:4847:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4880::,2a0b:4887:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:48c0::,2a0b:48c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:4900::,2a0b:4907:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0b:4940::,2a0b:4947:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:4980::,2a0b:4987:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:49c0::,2a0b:49c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:4a00::,2a0b:4a07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:4a40::,2a0b:4a47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:4a80::,2a0b:4a87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:4ac0::,2a0b:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:4b00::,2a0b:4b07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:4b40::,2a0b:4b40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:4b80::,2a0b:4b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:4bc0::,2a0b:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:4c00::,2a0b:4c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:4c40::,2a0b:4c47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:4c80::,2a0b:4c87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:4cc0::,2a0b:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4d00::,2a0b:4d07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4d40::,2a0b:4d47:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a0b:4d80::,2a0b:4d87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:4dc0::,2a0b:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4e00::,2a0b:4e07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:4e40::,2a0b:4e47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:4e80::,2a0b:4e87:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a0b:4ec0::,2a0b:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:4f00::,2a0b:4f07:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:4f40::,2a0b:4f47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:4f80::,2a0b:4f80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:4fc0::,2a0b:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a0b:5000::,2a0b:5007:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0b:5040::,2a0b:5047:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:5080::,2a0b:5087:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:50c0::,2a0b:50c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:5100::,2a0b:5107:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:5140::,2a0b:5147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:5180::,2a0b:5187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:51c0::,2a0b:51c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:5200::,2a0b:5207:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:5240::,2a0b:5247:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:5280::,2a0b:5287:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:52c0::,2a0b:52c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:5300::,2a0b:5307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:5340::,2a0b:5347:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:5380::,2a0b:5387:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:53c0::,2a0b:53c0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:5400::,2a0b:5400:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:5440::,2a0b:5447:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:5480::,2a0b:5487:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:5500::,2a0b:5507:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:5540::,2a0b:5547:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:5580::,2a0b:5587:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:55c0::,2a0b:55c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:5600::,2a0b:5600:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a0b:5640::,2a0b:5647:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:5680::,2a0b:5687:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:56c0::,2a0b:56c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:5700::,2a0b:5707:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:5740::,2a0b:5747:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:5780::,2a0b:5787:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:57c0::,2a0b:57c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:5800::,2a0b:5800:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:5840::,2a0b:5847:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:5880::,2a0b:5887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:58c0::,2a0b:58c7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:5900::,2a0b:5900:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:5940::,2a0b:5947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:5980::,2a0b:5987:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a0b:59c0::,2a0b:59c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:5a00::,2a0b:5a07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:5a40::,2a0b:5a47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:5a80::,2a0b:5a87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:5ac0::,2a0b:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:5b00::,2a0b:5b07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0b:5b40::,2a0b:5b47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:5b80::,2a0b:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:5bc0::,2a0b:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:5c00::,2a0b:5c07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:5c40::,2a0b:5c47:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:5c80::,2a0b:5c87:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:5cc0::,2a0b:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:5d00::,2a0b:5d07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:5d40::,2a0b:5d47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:5d80::,2a0b:5d87:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0b:5dc0::,2a0b:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:5e00::,2a0b:5e07:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0b:5e80::,2a0b:5e87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0b:5ec0::,2a0b:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:5f00::,2a0b:5f07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:5f40::,2a0b:5f47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:5f80::,2a0b:5f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:5fc0::,2a0b:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:6000::,2a0b:6007:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:6040::,2a0b:6040:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:6080::,2a0b:6087:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:60c0::,2a0b:60c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:6100::,2a0b:6107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:6140::,2a0b:6147:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a0b:6180::,2a0b:6187:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:61c0::,2a0b:61c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:6200::,2a0b:6207:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0b:6240::,2a0b:6247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:6280::,2a0b:6287:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:62c0::,2a0b:62c7:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0b:6300::,2a0b:6307:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a0b:6340::,2a0b:6347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:6380::,2a0b:6387:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:63c0::,2a0b:63c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:6400::,2a0b:6407:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:6440::,2a0b:6447:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:6480::,2a0b:6487:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:64c0::,2a0b:64c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:6500::,2a0b:6507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:6540::,2a0b:6547:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:6580::,2a0b:6587:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:65c0::,2a0b:65c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:6600::,2a0b:6607:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:6640::,2a0b:6647:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:6680::,2a0b:6680:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:66c0::,2a0b:66c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:6700::,2a0b:6700:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:6740::,2a0b:6747:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:6780::,2a0b:6787:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:67c0::,2a0b:67c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:6800::,2a0b:6807:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:6840::,2a0b:6847:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:6880::,2a0b:6880:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:68c0::,2a0b:68c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:6900::,2a0b:6907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:6940::,2a0b:6947:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:6980::,2a0b:6987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:69c0::,2a0b:69c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:6a00::,2a0b:6a07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:6a40::,2a0b:6a47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:6a80::,2a0b:6a87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:6ac0::,2a0b:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:6b00::,2a0b:6b07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:6b40::,2a0b:6b47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:6b80::,2a0b:6b87:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:6bc0::,2a0b:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,TJ +2a0b:6c00::,2a0b:6c07:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a0b:6c40::,2a0b:6c47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:6c80::,2a0b:6c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:6cc0::,2a0b:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:6d00::,2a0b:6d07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:6d40::,2a0b:6d47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:6d80::,2a0b:6d87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:6dc0::,2a0b:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:6e00::,2a0b:6e07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:6e40::,2a0b:6e47:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a0b:6e80::,2a0b:6e80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:6ec0::,2a0b:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:6f00::,2a0b:6f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:6f40::,2a0b:6f40:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:6f80::,2a0b:6f87:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0b:6fc0::,2a0b:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:7000::,2a0b:7007:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:7040::,2a0b:7047:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:7080::,2a0b:7087:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:70c0::,2a0b:70c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:7100::,2a0b:7107:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:7140::,2a0b:7147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:7180::,2a0b:7187:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:71c0::,2a0b:71c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:7200::,2a0b:7207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:7280::,2a0b:7287:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:72c0::,2a0b:72c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:7300::,2a0b:7307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:7340::,2a0b:7347:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:7380::,2a0b:7387:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:73c0::,2a0b:73c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:7400::,2a0b:7400:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:7440::,2a0b:7440:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:7480::,2a0b:7480:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:74c0::,2a0b:74c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:7500::,2a0b:7507:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:7540::,2a0b:7547:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:7580::,2a0b:7587:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:75c0::,2a0b:75c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:7600::,2a0b:7607:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:7640::,2a0b:7647:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:7680::,2a0b:7687:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:76c0::,2a0b:76c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:7700::,2a0b:7707:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:7740::,2a0b:7747:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:7780::,2a0b:7787:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:77c0::,2a0b:77c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:7800::,2a0b:7807:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:7840::,2a0b:7847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:7880::,2a0b:7880:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:78c0::,2a0b:78c0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:7900::,2a0b:7907:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0b:7940::,2a0b:7947:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:7980::,2a0b:7987:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:79c0::,2a0b:79c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:7a00::,2a0b:7a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:7a40::,2a0b:7a47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:7a80::,2a0b:7a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:7ac0::,2a0b:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:7b00::,2a0b:7b07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:7b40::,2a0b:7b47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:7b80::,2a0b:7b87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:7bc0::,2a0b:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:7c00::,2a0b:7c00:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:7c40::,2a0b:7c47:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0b:7c80::,2a0b:7c87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:7cc0::,2a0b:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:7d00::,2a0b:7d07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:7d40::,2a0b:7d47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:7d80::,2a0b:7d87:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0b:7dc0::,2a0b:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:7e00::,2a0b:7e07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:7e40::,2a0b:7e40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:7e80::,2a0b:7e87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:7ec0::,2a0b:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:7f00::,2a0b:7f07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:7f40::,2a0b:7f47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:7f80::,2a0b:7f87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:7fc0::,2a0b:7fc7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:8000::,2a0b:8007:ffff:ffff:ffff:ffff:ffff:ffff,MC +2a0b:8040::,2a0b:8047:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:8080::,2a0b:8087:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:80c0::,2a0b:80c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:8100::,2a0b:8107:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:8140::,2a0b:8147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:8180::,2a0b:8187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:81c0::,2a0b:81c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:8200::,2a0b:8207:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:8240::,2a0b:8247:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:8280::,2a0b:8280:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:82c0::,2a0b:82c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:8300::,2a0b:8307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:8340::,2a0b:8347:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:8380::,2a0b:8387:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:83c0::,2a0b:83c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:8400::,2a0b:8407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:8440::,2a0b:8440:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a0b:8480::,2a0b:8487:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:84c0::,2a0b:84c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:8500::,2a0b:8507:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a0b:8540::,2a0b:8547:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:8580::,2a0b:8587:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:85c0::,2a0b:85c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:8600::,2a0b:8607:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0b:8640::,2a0b:8647:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:8680::,2a0b:8687:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a0b:86c0::,2a0b:86c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:8700::,2a0b:8707:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:8740::,2a0b:8747:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:8780::,2a0b:8787:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0b:87c0::,2a0b:87c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:8800::,2a0b:8807:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0b:8840::,2a0b:8847:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:8880::,2a0b:8887:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:88c0::,2a0b:88c7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:8900::,2a0b:8900:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0b:8940::,2a0b:8947:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0b:8980::,2a0b:8987:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:89c0::,2a0b:89c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:8a00::,2a0b:8a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:8a40::,2a0b:8a47:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:8a80::,2a0b:8a87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:8ac0::,2a0b:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:8b00::,2a0b:8b07:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0b:8b40::,2a0b:8b47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:8b80::,2a0b:8b87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:8bc0::,2a0b:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:8c00::,2a0b:8c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:8c40::,2a0b:8c47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:8c80::,2a0b:8c87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:8cc0::,2a0b:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:8d00::,2a0b:8d07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:8d40::,2a0b:8d47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:8d80::,2a0b:8d87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:8dc0::,2a0b:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:8e00::,2a0b:8e07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:8e40::,2a0b:8e40:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0b:8e80::,2a0b:8e87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0b:8ec0::,2a0b:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:8f00::,2a0b:8f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:8f40::,2a0b:8f47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:8f80::,2a0b:8f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:8fc0::,2a0b:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:9000::,2a0b:9007:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:9040::,2a0b:9047:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:9080::,2a0b:9087:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:90c0::,2a0b:90c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:9100::,2a0b:9100:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:9140::,2a0b:9147:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:9180::,2a0b:9180:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:91c0::,2a0b:91c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:9200::,2a0b:9200:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a0b:9240::,2a0b:9247:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:9280::,2a0b:9287:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:92c0::,2a0b:92c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:9300::,2a0b:9307:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:9340::,2a0b:9347:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:9380::,2a0b:9380:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:93c0::,2a0b:93c7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:9440::,2a0b:9447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:9480::,2a0b:9480:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:94c0::,2a0b:94c0:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0b:9500::,2a0b:9507:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:9540::,2a0b:9547:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a0b:9580::,2a0b:9580:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:95c0::,2a0b:95c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:9600::,2a0b:9607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:9640::,2a0b:9647:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:9680::,2a0b:9687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:96c0::,2a0b:96c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:9700::,2a0b:9707:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:9740::,2a0b:9747:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:9780::,2a0b:9787:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:97c0::,2a0b:97c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:9800::,2a0b:9807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:9840::,2a0b:9847:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:9880::,2a0b:9887:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:98c0::,2a0b:98c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:9900::,2a0b:9907:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:9940::,2a0b:9940:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:9980::,2a0b:9980:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:99c0::,2a0b:99c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:9a00::,2a0b:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:9a01::,2a0b:9a01:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:9a02::,2a0b:9a02::ffff:ffff:ffff:ffff:ffff,CA +2a0b:9a02:1::,2a0b:9a07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:9a40::,2a0b:9a47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:9a80::,2a0b:9a80:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0b:9ac0::,2a0b:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:9b00::,2a0b:9b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:9b40::,2a0b:9b47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:9b80::,2a0b:9b87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:9bc0::,2a0b:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:9c00::,2a0b:9c07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:9c40::,2a0b:9c47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:9c80::,2a0b:9c87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:9cc0::,2a0b:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:9d00::,2a0b:9d07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:9d40::,2a0b:9d47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:9d80::,2a0b:9d80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:9dc0::,2a0b:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:9e00::,2a0b:9e07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:9e40::,2a0b:9e47:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a0b:9e80::,2a0b:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:9ec0::,2a0b:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a0b:9f00::,2a0b:9f07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:9f40::,2a0b:9f47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:9f80::,2a0b:9f87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:9fc0::,2a0b:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:a000::,2a0b:a007:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:a040::,2a0b:a047:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:a080::,2a0b:a087:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:a0c0::,2a0b:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:a100::,2a0b:a100:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0b:a140::,2a0b:a147:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:a180::,2a0b:a187:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:a1c0::,2a0b:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:a200::,2a0b:a207:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:a240::,2a0b:a247:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:a280::,2a0b:a280:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:a2c0::,2a0b:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:a300::,2a0b:a307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:a340::,2a0b:a347:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0b:a380::,2a0b:a380:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:a3c0::,2a0b:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a0b:a440::,2a0b:a447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:a480::,2a0b:a480:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0b:a4c0::,2a0b:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a0b:a500::,2a0b:a507:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:a540::,2a0b:a547:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:a580::,2a0b:a587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:a5c0::,2a0b:a5c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:a600::,2a0b:a600:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:a640::,2a0b:a647:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:a680::,2a0b:a680:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:a6c0::,2a0b:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:a700::,2a0b:a707:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:a740::,2a0b:a740:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:a780::,2a0b:a787:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:a7c0::,2a0b:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:a800::,2a0b:a800:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a0b:a840::,2a0b:a840:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:a880::,2a0b:a887:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:a8c0::,2a0b:a8c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:a900::,2a0b:a907:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:a940::,2a0b:a947:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:a980::,2a0b:a980:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:a9c0::,2a0b:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:aa00::,2a0b:aa07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:aa40::,2a0b:aa40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:aa80::,2a0b:aa87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:aac0::,2a0b:aac7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:ab00::,2a0b:ab07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:ab40::,2a0b:ab40:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:ab80::,2a0b:ab80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:abc0::,2a0b:abc7:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a0b:ac00::,2a0b:ac07:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a0b:ac40::,2a0b:ac47:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a0b:ac80::,2a0b:ac87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:acc0::,2a0b:acc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:ad00::,2a0b:ad07:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:ad40::,2a0b:ad47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:ad80::,2a0b:ad87:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0b:adc0::,2a0b:adc7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:ae00::,2a0b:ae07:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:ae40::,2a0b:ae47:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:ae80::,2a0b:ae87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:aec0::,2a0b:aec7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:af00::,2a0b:af07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:af40::,2a0b:af47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:af80::,2a0b:af87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:afc0::,2a0b:afc0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:b000::,2a0b:b007:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:b040::,2a0b:b047:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0b:b080::,2a0b:b087:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:b0c0::,2a0b:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:b100::,2a0b:b107:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:b140::,2a0b:b147:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:b180::,2a0b:b187:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:b1c0::,2a0b:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:b200::,2a0b:b200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:b240::,2a0b:b247:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a0b:b280::,2a0b:b287:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:b2c0::,2a0b:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a0b:b300::,2a0b:b307:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0b:b340::,2a0b:b347:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:b380::,2a0b:b387:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:b3c0::,2a0b:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:b400::,2a0b:b407:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:b440::,2a0b:b447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:b480::,2a0b:b487:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:b4c0::,2a0b:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:b500::,2a0b:b503:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:b540::,2a0b:b547:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:b580::,2a0b:b587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:b5c0::,2a0b:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:b600::,2a0b:b607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:b640::,2a0b:b647:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:b680::,2a0b:b680:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:b6c0::,2a0b:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a0b:b700::,2a0b:b707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:b740::,2a0b:b747:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0b:b780::,2a0b:b787:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:b7c0::,2a0b:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:b800::,2a0b:b807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:b840::,2a0b:b847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:b880::,2a0b:b887:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a0b:b8c0::,2a0b:b8c7:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0b:b900::,2a0b:b907:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:b940::,2a0b:b940:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:b980::,2a0b:b980:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0b:b9c0::,2a0b:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:ba00::,2a0b:ba07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:ba40::,2a0b:ba47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:ba80::,2a0b:ba87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:bac0::,2a0b:bac7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:bb00::,2a0b:bb07:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:bb40::,2a0b:bb47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:bb80::,2a0b:bb80:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:bbc0::,2a0b:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:bc00::,2a0b:bc07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:bc40::,2a0b:bc47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:bc80::,2a0b:bc87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:bcc0::,2a0b:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:bd00::,2a0b:bd07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:bd40::,2a0b:bd47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:bd80::,2a0b:bd87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:bdc0::,2a0b:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:be00::,2a0b:be07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:be40::,2a0b:be47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:be80::,2a0b:be87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:bec0::,2a0b:bec0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:bf00::,2a0b:bf07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:bf40::,2a0b:bf47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:bf80::,2a0b:bf80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:bfc0::,2a0b:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:c000::,2a0b:c007:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:c040::,2a0b:c047:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:c080::,2a0b:c087:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:c0c0::,2a0b:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:c100::,2a0b:c107:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:c140::,2a0b:c147:ffff:ffff:ffff:ffff:ffff:ffff,AX +2a0b:c180::,2a0b:c180:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:c1c0::,2a0b:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0b:c200::,2a0b:c207:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:c240::,2a0b:c247:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:c280::,2a0b:c287:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:c2c0::,2a0b:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:c300::,2a0b:c307:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a0b:c340::,2a0b:c347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:c380::,2a0b:c387:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:c3c0::,2a0b:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:c400::,2a0b:c407:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:c440::,2a0b:c440:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:c480::,2a0b:c487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:c4c0::,2a0b:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:c500::,2a0b:c500:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:c540::,2a0b:c547:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:c580::,2a0b:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:c5c0::,2a0b:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0b:c600::,2a0b:c607:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:c640::,2a0b:c647:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0b:c680::,2a0b:c687:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:c6c0::,2a0b:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:c740::,2a0b:c747:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:c780::,2a0b:c787:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:c7c0::,2a0b:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:c800::,2a0b:c807:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:c840::,2a0b:c847:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:c880::,2a0b:c887:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:c8c0::,2a0b:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:c900::,2a0b:c907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:c940::,2a0b:c947:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:c980::,2a0b:c987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:c9c0::,2a0b:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a0b:ca00::,2a0b:ca07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:ca40::,2a0b:ca47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:ca80::,2a0b:ca80:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:cac0::,2a0b:cac7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:cb00::,2a0b:cb07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:cb40::,2a0b:cb47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:cb80::,2a0b:cb80:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0b:cbc0::,2a0b:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:cc00::,2a0b:cc00:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:cc40::,2a0b:cc47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:cc80::,2a0b:cc87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:ccc0::,2a0b:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:cd00::,2a0b:cd07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:cd40::,2a0b:cd40:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:cd80::,2a0b:cd87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:cdc0::,2a0b:cdc7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:ce00::,2a0b:ce07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:ce40::,2a0b:ce40:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:ce80::,2a0b:ce87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:cec0::,2a0b:cec7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:cf00::,2a0b:cf07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:cf40::,2a0b:cf47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:cf80::,2a0b:cf87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:cfc0::,2a0b:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:d000::,2a0b:d007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d040::,2a0b:d047:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:d080::,2a0b:d080:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:d0c0::,2a0b:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d100::,2a0b:d107:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:d140::,2a0b:d147:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0b:d180::,2a0b:d180:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:d1c0::,2a0b:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:d200::,2a0b:d207:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:d240::,2a0b:d240:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:d280::,2a0b:d287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d2c0::,2a0b:d2c7:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:d300::,2a0b:d307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:d340::,2a0b:d347:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:d380::,2a0b:d387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:d3c0::,2a0b:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0b:d400::,2a0b:d407:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:d440::,2a0b:d447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:d480::,2a0b:d487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:d4c0::,2a0b:d4c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:d500::,2a0b:d507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:d540::,2a0b:d540:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d580::,2a0b:d580:ffff:ffff:ffff:ffff:ffff:ffff,OM +2a0b:d5c0::,2a0b:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:d600::,2a0b:d607:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d640::,2a0b:d640:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:d680::,2a0b:d680:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:d6c0::,2a0b:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:d700::,2a0b:d707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d740::,2a0b:d747:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:d780::,2a0b:d787:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:d7c0::,2a0b:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,KG +2a0b:d800::,2a0b:d807:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:d840::,2a0b:d847:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:d880::,2a0b:d887:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:d8c0::,2a0b:d8c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:d900::,2a0b:d907:ffff:ffff:ffff:ffff:ffff:ffff,HK +2a0b:d940::,2a0b:d947:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:d980::,2a0b:d987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:d9c0::,2a0b:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:da00::,2a0b:da07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:da40::,2a0b:da47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:da80::,2a0b:da87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:dac0::,2a0b:dac7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:db00::,2a0b:db07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:db40::,2a0b:db47:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0b:db80::,2a0b:db87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:dbc0::,2a0b:dbc7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:dc00::,2a0b:dc07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:dc40::,2a0b:dc47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:dc80::,2a0b:dc87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:dcc0::,2a0b:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:dd00::,2a0b:dd07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0b:dd40::,2a0b:dd47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:dd80::,2a0b:dd87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:ddc0::,2a0b:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:de00::,2a0b:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:de40::,2a0b:de47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:de80::,2a0b:de87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0b:dec0::,2a0b:dec7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:df00::,2a0b:df00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:df40::,2a0b:df40:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:df80::,2a0b:df87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:dfc0::,2a0b:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:e000::,2a0b:e007:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:e040::,2a0b:e047:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:e080::,2a0b:e081:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0b:e0c0::,2a0b:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0b:e100::,2a0b:e107:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:e140::,2a0b:e147:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:e180::,2a0b:e187:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:e1c0::,2a0b:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:e200::,2a0b:e207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:e240::,2a0b:e247:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:e280::,2a0b:e287:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:e2c0::,2a0b:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:e300::,2a0b:e300:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:e340::,2a0b:e347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:e380::,2a0b:e387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:e3c0::,2a0b:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:e400::,2a0b:e407:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:e440::,2a0b:e447:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:e480::,2a0b:e487:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:e4c0::,2a0b:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:e500::,2a0b:e501:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:e540::,2a0b:e547:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:e580::,2a0b:e587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:e5c0::,2a0b:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0b:e600::,2a0b:e607:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a0b:e640::,2a0b:e647:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0b:e680::,2a0b:e687:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:e6c0::,2a0b:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:e700::,2a0b:e707:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:e740::,2a0b:e747:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:e780::,2a0b:e787:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:e7c0::,2a0b:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:e800::,2a0b:e807:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:e840::,2a0b:e847:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:e880::,2a0b:e887:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:e8c0::,2a0b:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:e900::,2a0b:e907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:e940::,2a0b:e940:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0b:e980::,2a0b:e987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:e9c0::,2a0b:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:ea00::,2a0b:ea00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:ea40::,2a0b:ea47:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a0b:ea80::,2a0b:ea80:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:eac0::,2a0b:eac0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:eb00::,2a0b:eb07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:eb40::,2a0b:eb47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:eb80::,2a0b:eb87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:ebc0::,2a0b:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:ec00::,2a0b:ec07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:ec40::,2a0b:ec47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:ec80::,2a0b:ec87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:ecc0::,2a0b:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:ed00::,2a0b:ed07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:ed40::,2a0b:ed47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:ed80::,2a0b:ed87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:edc0::,2a0b:edc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:ee00::,2a0b:ee07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:ee40::,2a0b:ee47:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a0b:ee80::,2a0b:ee87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:eec0::,2a0b:eec0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:ef00::,2a0b:ef07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:ef40::,2a0b:ef47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:ef80::,2a0b:ef87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:efc0::,2a0b:efc0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:f000::,2a0b:f000:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:f040::,2a0b:f040:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:f080::,2a0b:f080:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:f0c0::,2a0b:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:f100::,2a0b:f107:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0b:f140::,2a0b:f147:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:f180::,2a0b:f180:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:f1c0::,2a0b:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:f200::,2a0b:f200:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:f240::,2a0b:f247:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0b:f280::,2a0b:f287:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:f2c0::,2a0b:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:f300::,2a0b:f307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:f340::,2a0b:f340:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0b:f380::,2a0b:f387:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:f3c0::,2a0b:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0b:f400::,2a0b:f400:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:f440::,2a0b:f447:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:f480::,2a0b:f480:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:f4c0::,2a0b:f4c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:f500::,2a0b:f507:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:f540::,2a0b:f547:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:f580::,2a0b:f587:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0b:f5c0::,2a0b:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:f600::,2a0b:f607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:f640::,2a0b:f647:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0b:f680::,2a0b:f687:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0b:f6c0::,2a0b:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0b:f700::,2a0b:f707:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:f740::,2a0b:f747:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a0b:f780::,2a0b:f787:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:f7c0::,2a0b:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0b:f800::,2a0b:f807:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:f840::,2a0b:f840:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:f880::,2a0b:f887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:f8c0::,2a0b:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:f900::,2a0b:f907:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:f940::,2a0b:f940:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:f980::,2a0b:f987:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:f9c0::,2a0b:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:fa00::,2a0b:fa07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:fa40::,2a0b:fa47:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a0b:fa80::,2a0b:fa87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:fac0::,2a0b:fac7:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0b:fb00::,2a0b:fb07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:fb40::,2a0b:fb47:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0b:fb80::,2a0b:fb87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:fbc0::,2a0b:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0b:fc00::,2a0b:fc07:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0b:fc40::,2a0b:fc47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:fc80::,2a0b:fc87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0b:fcc0::,2a0b:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:fd00::,2a0b:fd00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:fd40::,2a0b:fd47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0b:fd80::,2a0b:fd87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:fdc0::,2a0b:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0b:fe00::,2a0b:fe07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:fe40::,2a0b:fe47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:fe80::,2a0b:fe87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:fec0::,2a0b:fec7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:ff00::,2a0b:ff07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:ff40::,2a0b:ff47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:ff80::,2a0b:ff87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:ffc0::,2a0b:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0c::,2a0c:7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0c:100::,2a0c:107:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0c:200::,2a0c:207:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:300::,2a0c:307:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0c:400::,2a0c:407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:500::,2a0c:503:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:600::,2a0c:607:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:700::,2a0c:700:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:800::,2a0c:807:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a0c:900::,2a0c:907:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0c:a00::,2a0c:a07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0c:b00::,2a0c:b00:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:c00::,2a0c:c07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:d00::,2a0c:d07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:e00::,2a0c:e07:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a0c:f00::,2a0c:f07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:1000::,2a0c:1007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:1100::,2a0c:1107:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:1200::,2a0c:1207:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0c:1300::,2a0c:1307:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0c:1400::,2a0c:1407:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0c:1500::,2a0c:1507:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0c:1600::,2a0c:1600:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a0c:1700::,2a0c:1707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:1800::,2a0c:1807:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:1900::,2a0c:1907:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0c:1a00::,2a0c:1a00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:1b00::,2a0c:1b07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0c:1c00::,2a0c:1c07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0c:1d00::,2a0c:1d03:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:1e00::,2a0c:1e07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:1f00::,2a0c:1f07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0c:2000::,2a0c:2007:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:2100::,2a0c:2107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:2200::,2a0c:2207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:2300::,2a0c:2307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:2400::,2a0c:2407:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0c:2500::,2a0c:2507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:2600::,2a0c:2607:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:2700::,2a0c:2707:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0c:2800::,2a0c:2800:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:2900::,2a0c:2907:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0c:2a00::,2a0c:2a07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0c:2b00::,2a0c:2b07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:2c00::,2a0c:2c07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:2d00::,2a0c:2d07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0c:2e00::,2a0c:2e07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:2f00::,2a0c:2f07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:3000::,2a0c:3000:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:3100::,2a0c:3107:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0c:3200::,2a0c:3207:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0c:3300::,2a0c:3307:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0c:3400::,2a0c:3407:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:3500::,2a0c:3507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:3600::,2a0c:3600:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0c:3700::,2a0c:3700:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0c:3800::,2a0c:3800:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0c:3900::,2a0c:3907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:3a00::,2a0c:3a07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:3b00::,2a0c:3b07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0c:3c00::,2a0c:3c07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:3d00::,2a0c:3d07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:3e00::,2a0c:3e07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0c:3f00::,2a0c:3f07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0c:4000::,2a0c:4000:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0c:4100::,2a0c:4107:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0c:4200::,2a0c:4207:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0c:4300::,2a0c:4300:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:4400::,2a0c:4400:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:4500::,2a0c:4507:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0c:4600::,2a0c:4607:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0c:4700::,2a0c:4707:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:4800::,2a0c:4807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:4900::,2a0c:4907:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0c:4a00::,2a0c:4a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:4b00::,2a0c:4b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:4c00::,2a0c:4c07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0c:4d00::,2a0c:4d07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:4e00::,2a0c:4e00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:4f00::,2a0c:4f07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0c:5000::,2a0c:5003:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:5100::,2a0c:5107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:5200::,2a0c:5207:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0c:5300::,2a0c:5307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:5400::,2a0c:5407:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0c:5500::,2a0c:5500:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0c:5600::,2a0c:5607:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:5700::,2a0c:5707:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0c:5800::,2a0c:5807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:5900::,2a0c:5907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:5a00::,2a0c:5a07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0c:5b00::,2a0c:5b07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0c:5c00::,2a0c:5c07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0c:5d00::,2a0c:5d07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0c:5e00::,2a0c:5e00:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a0c:5f00::,2a0c:5f00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:6000::,2a0c:6007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:6100::,2a0c:6107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:6200::,2a0c:6207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:6300::,2a0c:6307:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a0c:6400::,2a0c:6400:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:6500::,2a0c:6507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:6600::,2a0c:6607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0c:6700::,2a0c:6707:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0c:6800::,2a0c:6800:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0c:6900::,2a0c:6907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:6a00::,2a0c:6a07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0c:6b00::,2a0c:6b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:6c00::,2a0c:6c00:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0c:6d00::,2a0c:6d00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:6e00::,2a0c:6e07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0c:6f00::,2a0c:6f07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:7000::,2a0c:7007:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0c:7100::,2a0c:7107:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:7200::,2a0c:7207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:7300::,2a0c:7300:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0c:7400::,2a0c:7407:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0c:7500::,2a0c:7507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:7600::,2a0c:7607:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0c:7700::,2a0c:7700:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0c:7800::,2a0c:7807:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0c:7900::,2a0c:7907:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0c:7a00::,2a0c:7a07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0c:7b00::,2a0c:7b07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:7c00::,2a0c:7c07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0c:7d00::,2a0c:7d07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:7e00::,2a0c:7e07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0c:7f00::,2a0c:7f07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0c:8000::,2a0c:8007:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0c:8100::,2a0c:8107:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0c:8200::,2a0c:8207:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0c:8300::,2a0c:8307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:8400::,2a0c:8407:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:8500::,2a0c:8507:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:8600::,2a0c:8607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0c:8700::,2a0c:8707:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a0c:8800::,2a0c:8807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:8900::,2a0c:8900:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0c:8a00::,2a0c:8a07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0c:8b00::,2a0c:8b00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0c:8c00::,2a0c:8c07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0c:8d00::,2a0c:8d07:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0c:8e00::,2a0c:8e07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:8f00::,2a0c:8f07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0c:9000::,2a0c:9007:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0c:9100::,2a0c:9107:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0c:9200::,2a0c:9207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:9300::,2a0c:9307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:9400::,2a0c:9407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:9500::,2a0c:9500:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0c:9600::,2a0c:9607:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0c:9700::,2a0c:9700:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:9800::,2a0c:9807:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0c:9900::,2a0c:9900:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:9a00::,2a0c:9a00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:9b00::,2a0c:9b07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:9c00::,2a0c:9c07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:9d00::,2a0c:9d07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0c:9e00::,2a0c:9e07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:9f00::,2a0c:9f07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0c:a000::,2a0c:a007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:a100::,2a0c:a107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:a200::,2a0c:a207:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0c:a300::,2a0c:a307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:a400::,2a0c:a407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:a500::,2a0c:a500:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:a600::,2a0c:a607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:a700::,2a0c:a707:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0c:a800::,2a0c:a807:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0c:a900::,2a0c:a900:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:aa00::,2a0c:aa07:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0c:ab00::,2a0c:ab07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:ac00::,2a0c:ac07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:ad00::,2a0c:ad07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0c:ae00::,2a0c:ae07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:af00::,2a0c:af07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:b000::,2a0c:b007:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0c:b100::,2a0c:b107:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0c:b200::,2a0c:b207:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0c:b300::,2a0c:b307:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0c:b400::,2a0c:b407:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0c:b500::,2a0c:b507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:b600::,2a0c:b607:ffff:ffff:ffff:ffff:ffff:ffff,AU +2a0c:b700::,2a0c:b707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:b800::,2a0c:b807:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:b900::,2a0c:b907:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0c:ba00::,2a0c:ba07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:bb00::,2a0c:bb07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:bc00::,2a0c:bc07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:bd00::,2a0c:bd07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:be00::,2a0c:be00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:bf00::,2a0c:bf07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:c000::,2a0c:c007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:c100::,2a0c:c107:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:c200::,2a0c:c200:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0c:c300::,2a0c:c307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:c400::,2a0c:c400:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0c:c500::,2a0c:c500:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0c:c600::,2a0c:c600:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:c700::,2a0c:c707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:c800::,2a0c:c807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:c900::,2a0c:c907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:ca00::,2a0c:ca07:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a0c:cb00::,2a0c:cb07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:cc00::,2a0c:cc00:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0c:cd00::,2a0c:cd00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0c:ce00::,2a0c:ce07:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0c:cf00::,2a0c:cf07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0c:d000::,2a0c:d007:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0c:d100::,2a0c:d107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:d200::,2a0c:d207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:d300::,2a0c:d307:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0c:d400::,2a0c:d407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:d500::,2a0c:d507:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0c:d600::,2a0c:d607:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0c:d700::,2a0c:d707:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0c:d800::,2a0c:d807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:d900::,2a0c:d907:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0c:da00::,2a0c:da07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:db00::,2a0c:db07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0c:dc00::,2a0c:dc00:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0c:dd00::,2a0c:dd07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:de00::,2a0c:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:df00::,2a0c:df07:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0c:e000::,2a0c:e007:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:e100::,2a0c:e107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:e200::,2a0c:e207:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0c:e300::,2a0c:e307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:e400::,2a0c:e407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:e500::,2a0c:e507:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0c:e600::,2a0c:e607:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0c:e700::,2a0c:e707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:e800::,2a0c:e807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:e900::,2a0c:e907:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:ea00::,2a0c:ea07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0c:eb00::,2a0c:eb00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:ec00::,2a0c:ec07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0c:ed00::,2a0c:ed07:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a0c:ee00::,2a0c:ee07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:ef00::,2a0c:ef07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:f000::,2a0c:f000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0c:f100::,2a0c:f107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:f200::,2a0c:f207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:f300::,2a0c:f307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0c:f400::,2a0c:f407:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0c:f500::,2a0c:f507:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0c:f600::,2a0c:f607:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0c:f700::,2a0c:f707:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0c:f800::,2a0c:f807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:f900::,2a0c:f907:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0c:fa00::,2a0c:fa00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0c:fb00::,2a0c:fb07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0c:fc00::,2a0c:fc07:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0c:fd00::,2a0c:fd07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0c:fe00::,2a0c:fe07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0c:ff00::,2a0c:ff07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d::,2a0d:7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0d:100::,2a0d:107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d:200::,2a0d:207:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d:300::,2a0d:307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:400::,2a0d:407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:500::,2a0d:507:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d:600::,2a0d:607:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0d:700::,2a0d:707:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d:800::,2a0d:807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:900::,2a0d:900:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0d:a00::,2a0d:a07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0d:b00::,2a0d:b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d:c00::,2a0d:c07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0d:d00::,2a0d:d07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:e00::,2a0d:e07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:f00::,2a0d:f07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0d:1000::,2a0d:1007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:1100::,2a0d:1107:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0d:1200::,2a0d:1207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:1300::,2a0d:1307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d:1400::,2a0d:1403:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:1500::,2a0d:1500:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:1600::,2a0d:1600:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:1700::,2a0d:1707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:1800::,2a0d:1807:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0d:1900::,2a0d:1907:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0d:1a00::,2a0d:1a07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0d:1b00::,2a0d:1b07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0d:1c00::,2a0d:1c07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0d:1d00::,2a0d:1d07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0d:1e00::,2a0d:1e07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:1f00::,2a0d:1f07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:2000::,2a0d:2007:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d:2100::,2a0d:2107:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0d:2200::,2a0d:2207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:2300::,2a0d:2307:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0d:2400::,2a0d:2407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:2500::,2a0d:2507:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0d:2600::,2a0d:2607:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0d:2700::,2a0d:2707:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a0d:2800::,2a0d:2807:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0d:2900::,2a0d:2907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:2a00::,2a0d:2a07:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0d:2b00::,2a0d:2b07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0d:2c00::,2a0d:2c07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0d:2d00::,2a0d:2d00:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a0d:2e00::,2a0d:2e07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0d:2f00::,2a0d:2f07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0d:3000::,2a0d:3007:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:3100::,2a0d:3107:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0d:3200::,2a0d:3207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:3300::,2a0d:3307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:3400::,2a0d:3400:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:3500::,2a0d:3507:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0d:3600::,2a0d:3607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:3700::,2a0d:3707:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0d:3800::,2a0d:3807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:3900::,2a0d:3907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:3a00::,2a0d:3a07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:3b00::,2a0d:3b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:3c00::,2a0d:3c07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0d:3d00::,2a0d:3d07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0d:3e00::,2a0d:3e07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0d:3f00::,2a0d:3f00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:4000::,2a0d:4007:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:4100::,2a0d:4100:ffff:ffff:ffff:ffff:ffff:ffff,SY +2a0d:4200::,2a0d:4207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:4300::,2a0d:4307:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0d:4400::,2a0d:4407:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:4500::,2a0d:4507:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a0d:4600::,2a0d:4607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:4800::,2a0d:4807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:4a00::,2a0d:4a00:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0d:4c00::,2a0d:4c07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0d:4e00::,2a0d:4e07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:5000::,2a0d:5007:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a0d:5200::,2a0d:5207:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0d:5400::,2a0d:5407:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:5600::,2a0d:5600:c:ffff:ffff:ffff:ffff:ffff,US +2a0d:5600:d::,2a0d:5600:d:ffff:ffff:ffff:ffff:ffff,SG +2a0d:5600:e::,2a0d:5600:f:ffff:ffff:ffff:ffff:ffff,JP +2a0d:5600:10::,2a0d:5607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0d:5800::,2a0d:5807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d:5a00::,2a0d:5a07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:5c00::,2a0d:5c07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0d:5e00::,2a0d:5e07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:6000::,2a0d:6007:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d:6200::,2a0d:6207:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0d:6400::,2a0d:6400:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:6600::,2a0d:6607:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0d:6800::,2a0d:6807:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:6a00::,2a0d:6a07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:6c00::,2a0d:6c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:6e00::,2a0d:6e07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:7000::,2a0d:7000:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0d:7200::,2a0d:7207:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0d:7400::,2a0d:7407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:7600::,2a0d:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:7800::,2a0d:7807:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0d:7a00::,2a0d:7a07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0d:7c00::,2a0d:7c07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0d:7e00::,2a0d:7e00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:8000::,2a0d:8007:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:8200::,2a0d:8207:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0d:8400::,2a0d:8400:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:8600::,2a0d:8607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:8800::,2a0d:8807:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0d:8a00::,2a0d:8a00:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0d:8c00::,2a0d:8c07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0d:8e00::,2a0d:8e07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:9000::,2a0d:9007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:9200::,2a0d:9207:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0d:9400::,2a0d:9407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:9600::,2a0d:9600:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0d:9800::,2a0d:9807:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0d:9a00::,2a0d:9a07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0d:9c00::,2a0d:9c00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0d:9e00::,2a0d:9e07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0d:a000::,2a0d:a007:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0d:a200::,2a0d:a207:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0d:a400::,2a0d:a407:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0d:a600::,2a0d:a603:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0d:a800::,2a0d:a807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:aa00::,2a0d:aa07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0d:ac00::,2a0d:ac07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0d:ae00::,2a0d:ae07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0d:b000::,2a0d:b007:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0d:b200::,2a0d:b207:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a0d:b400::,2a0d:b407:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0d:b600::,2a0d:b607:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:b800::,2a0d:b807:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a0d:ba00::,2a0d:ba07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:bc00::,2a0d:bc07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0d:be00::,2a0d:be07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:c000::,2a0d:c007:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0d:c200::,2a0d:c207:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:c400::,2a0d:c407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:c600::,2a0d:c607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:c800::,2a0d:c807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:ca00::,2a0d:ca07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:cc00::,2a0d:cc07:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a0d:ce00::,2a0d:ce07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:d000::,2a0d:d007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:d200::,2a0d:d207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:d400::,2a0d:d407:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:d600::,2a0d:d607:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0d:d800::,2a0d:d807:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0d:da00::,2a0d:da07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:dc00::,2a0d:dc07:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a0d:de00::,2a0d:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0d:e000::,2a0d:e007:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0d:e200::,2a0d:e207:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0d:e400::,2a0d:e400:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0d:e600::,2a0d:e607:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0d:e800::,2a0d:e807:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0d:ea00::,2a0d:ea07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:ec00::,2a0d:ec07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0d:ee00::,2a0d:ee00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d:f000::,2a0d:f007:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0d:f200::,2a0d:f207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0d:f400::,2a0d:f407:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:f600::,2a0d:f607:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0d:f800::,2a0d:f807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:fa00::,2a0d:fa07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0d:fc00::,2a0d:fc07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0d:fe00::,2a0d:fe07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2c0e::,2c0e:fff:ffff:ffff:ffff:ffff:ffff:ffff,EG +2c0e:2000::,2c0e:2fff:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0e:4000::,2c0e:40ff:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0e:7f80::,2c0e:7f9f:ffff:ffff:ffff:ffff:ffff:ffff,CI +2c0f:ee00::,2c0f:ee00:ffff:ffff:ffff:ffff:ffff:ffff,BF +2c0f:ee08::,2c0f:ee08:ffff:ffff:ffff:ffff:ffff:ffff,CD +2c0f:ee10::,2c0f:ee10:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:ee18::,2c0f:ee18:ffff:ffff:ffff:ffff:ffff:ffff,MZ +2c0f:ee20::,2c0f:ee20:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f000::,2c0f:f000:ffff:ffff:ffff:ffff:ffff:ffff,DZ +2c0f:f008::,2c0f:f008:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f010::,2c0f:f010:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f018::,2c0f:f018:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2c0f:f020::,2c0f:f020:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f028::,2c0f:f028:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f030::,2c0f:f030:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f038::,2c0f:f038:ffff:ffff:ffff:ffff:ffff:ffff,GA +2c0f:f040::,2c0f:f040:ffff:ffff:ffff:ffff:ffff:ffff,SN +2c0f:f048::,2c0f:f048:ffff:ffff:ffff:ffff:ffff:ffff,CG +2c0f:f050::,2c0f:f050:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f058::,2c0f:f058:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f060::,2c0f:f060:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:f068::,2c0f:f068:ffff:ffff:ffff:ffff:ffff:ffff,SO +2c0f:f070::,2c0f:f070:ffff:ffff:ffff:ffff:ffff:ffff,CM +2c0f:f078::,2c0f:f078:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f080::,2c0f:f080:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f088::,2c0f:f088:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f090::,2c0f:f090:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f098::,2c0f:f098:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f0a0::,2c0f:f0a0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f0a8::,2c0f:f0a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f0b0::,2c0f:f0b0:ffff:ffff:ffff:ffff:ffff:ffff,EG +2c0f:f0b8::,2c0f:f0b8:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f0c0::,2c0f:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f0c8::,2c0f:f0c8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f0d0::,2c0f:f0d0:ffff:ffff:ffff:ffff:ffff:ffff,SC +2c0f:f0d8::,2c0f:f0d8:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f0e0::,2c0f:f0e0:ffff:ffff:ffff:ffff:ffff:ffff,SD +2c0f:f0e8::,2c0f:f0e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f0f0::,2c0f:f0f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f0f8::,2c0f:f0f8:ffff:ffff:ffff:ffff:ffff:ffff,TG +2c0f:f100::,2c0f:f100:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f108::,2c0f:f108:ffff:ffff:ffff:ffff:ffff:ffff,RW +2c0f:f110::,2c0f:f110:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f118::,2c0f:f118:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f120::,2c0f:f120:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f128::,2c0f:f128:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f130::,2c0f:f130:ffff:ffff:ffff:ffff:ffff:ffff,LS +2c0f:f138::,2c0f:f138:ffff:ffff:ffff:ffff:ffff:ffff,BF +2c0f:f140::,2c0f:f140:ffff:ffff:ffff:ffff:ffff:ffff,MZ +2c0f:f148::,2c0f:f148:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f158::,2c0f:f158:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f160::,2c0f:f160:ffff:ffff:ffff:ffff:ffff:ffff,BW +2c0f:f168::,2c0f:f168:ffff:ffff:ffff:ffff:ffff:ffff,RW +2c0f:f170::,2c0f:f170:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:f178::,2c0f:f178:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f180::,2c0f:f180:ffff:ffff:ffff:ffff:ffff:ffff,GN +2c0f:f188::,2c0f:f188:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2c0f:f190::,2c0f:f190:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f198::,2c0f:f198:ffff:ffff:ffff:ffff:ffff:ffff,BI +2c0f:f1a0::,2c0f:f1a0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f1a8::,2c0f:f1a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f1b0::,2c0f:f1b0:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f1b8::,2c0f:f1b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f1c0::,2c0f:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f1c8::,2c0f:f1c8:ffff:ffff:ffff:ffff:ffff:ffff,MG +2c0f:f1d0::,2c0f:f1d0:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2c0f:f1d8::,2c0f:f1d8:ffff:ffff:ffff:ffff:ffff:ffff,LR +2c0f:f1e0::,2c0f:f1e0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f1e8::,2c0f:f1e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f1f0::,2c0f:f1f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f1f8::,2c0f:f1f8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f200::,2c0f:f200:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:f208::,2c0f:f208:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f210::,2c0f:f210:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f218::,2c0f:f218:ffff:ffff:ffff:ffff:ffff:ffff,CM +2c0f:f220::,2c0f:f220:ffff:ffff:ffff:ffff:ffff:ffff,CG +2c0f:f228::,2c0f:f228:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f230::,2c0f:f230:ffff:ffff:ffff:ffff:ffff:ffff,CI +2c0f:f238::,2c0f:f238:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f240::,2c0f:f240:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f248::,2c0f:f248:ffff:ffff:ffff:ffff:ffff:ffff,SC +2c0f:f250::,2c0f:f250:ffff:ffff:ffff:ffff:ffff:ffff,BW +2c0f:f258::,2c0f:f258:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f260::,2c0f:f260:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2c0f:f268::,2c0f:f268:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f270::,2c0f:f270:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f278::,2c0f:f278:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f280::,2c0f:f280:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:f288::,2c0f:f288:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f290::,2c0f:f290:ffff:ffff:ffff:ffff:ffff:ffff,TN +2c0f:f298::,2c0f:f298:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:f2a0::,2c0f:f2a0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f2a8::,2c0f:f2a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f2b0::,2c0f:f2b0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f2b8::,2c0f:f2b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f2c0::,2c0f:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f2c8::,2c0f:f2c8:ffff:ffff:ffff:ffff:ffff:ffff,KM +2c0f:f2d0::,2c0f:f2d0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f2d8::,2c0f:f2d8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f2e0::,2c0f:f2e0:ffff:ffff:ffff:ffff:ffff:ffff,MA +2c0f:f2e8::,2c0f:f2e8:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f2f0::,2c0f:f2f0:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f2f8::,2c0f:f2f8:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f300::,2c0f:f300:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f308::,2c0f:f308:ffff:ffff:ffff:ffff:ffff:ffff,MZ +2c0f:f310::,2c0f:f310:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f318::,2c0f:f318:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f320::,2c0f:f320:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f328::,2c0f:f328:ffff:ffff:ffff:ffff:ffff:ffff,BW +2c0f:f330::,2c0f:f330:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f338::,2c0f:f338:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f340::,2c0f:f340:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f348::,2c0f:f348:ffff:ffff:ffff:ffff:ffff:ffff,ET +2c0f:f350::,2c0f:f350:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f358::,2c0f:f358:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f360::,2c0f:f360:ffff:ffff:ffff:ffff:ffff:ffff,SC +2c0f:f368::,2c0f:f368:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f370::,2c0f:f370:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f378::,2c0f:f378:ffff:ffff:ffff:ffff:ffff:ffff,MA +2c0f:f380::,2c0f:f380:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f388::,2c0f:f388:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f390::,2c0f:f390:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f398::,2c0f:f398:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f3a0::,2c0f:f3a0:ffff:ffff:ffff:ffff:ffff:ffff,TN +2c0f:f3a8::,2c0f:f3a8:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f3b0::,2c0f:f3b0:ffff:ffff:ffff:ffff:ffff:ffff,CI +2c0f:f3b8::,2c0f:f3b8:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f3c0::,2c0f:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f3c8::,2c0f:f3c8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f3d0::,2c0f:f3d0:ffff:ffff:ffff:ffff:ffff:ffff,MZ +2c0f:f3d8::,2c0f:f3d8:ffff:ffff:ffff:ffff:ffff:ffff,CM +2c0f:f3e0::,2c0f:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,GA +2c0f:f3e8::,2c0f:f3e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f3f0::,2c0f:f3f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f3f8::,2c0f:f3f8:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f400::,2c0f:f400:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f408::,2c0f:f408:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f410::,2c0f:f410:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f418::,2c0f:f418:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f420::,2c0f:f420:ffff:ffff:ffff:ffff:ffff:ffff,CV +2c0f:f428::,2c0f:f428:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f430::,2c0f:f430:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:f438::,2c0f:f438:ffff:ffff:ffff:ffff:ffff:ffff,CV +2c0f:f440::,2c0f:f440:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f448::,2c0f:f448:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f450::,2c0f:f450:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f458::,2c0f:f458:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f460::,2c0f:f460:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f468::,2c0f:f468:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f470::,2c0f:f470:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f478::,2c0f:f478:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f480::,2c0f:f480:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f488::,2c0f:f488:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f490::,2c0f:f490:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:f498::,2c0f:f498:ffff:ffff:ffff:ffff:ffff:ffff,CV +2c0f:f4a0::,2c0f:f4a0:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f4a8::,2c0f:f4a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f4b0::,2c0f:f4b0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f4b8::,2c0f:f4b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f4c0::,2c0f:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f4c8::,2c0f:f4c8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f4d0::,2c0f:f4d0:ffff:ffff:ffff:ffff:ffff:ffff,CI +2c0f:f4d8::,2c0f:f4d8:ffff:ffff:ffff:ffff:ffff:ffff,CM +2c0f:f4e0::,2c0f:f4e0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f4e8::,2c0f:f4e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f4f0::,2c0f:f4f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f4f8::,2c0f:f4f8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f500::,2c0f:f500:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f508::,2c0f:f508:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f510::,2c0f:f510:ffff:ffff:ffff:ffff:ffff:ffff,MW +2c0f:f518::,2c0f:f518:ffff:ffff:ffff:ffff:ffff:ffff,LY +2c0f:f520::,2c0f:f520:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f528::,2c0f:f528:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f530::,2c0f:f530:ffff:ffff:ffff:ffff:ffff:ffff,SC +2c0f:f538::,2c0f:f538:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f540::,2c0f:f540:ffff:ffff:ffff:ffff:ffff:ffff,MZ +2c0f:f548::,2c0f:f548:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f550::,2c0f:f550:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:f558::,2c0f:f558:ffff:ffff:ffff:ffff:ffff:ffff,CD +2c0f:f560::,2c0f:f560:ffff:ffff:ffff:ffff:ffff:ffff,KM +2c0f:f568::,2c0f:f568:ffff:ffff:ffff:ffff:ffff:ffff,CG +2c0f:f570::,2c0f:f570:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f578::,2c0f:f578:ffff:ffff:ffff:ffff:ffff:ffff,TG +2c0f:f580::,2c0f:f580:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f588::,2c0f:f588:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f590::,2c0f:f590:ffff:ffff:ffff:ffff:ffff:ffff,CI +2c0f:f598::,2c0f:f598:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f5a0::,2c0f:f5a0:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f5a8::,2c0f:f5a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f5b0::,2c0f:f5b0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f5b8::,2c0f:f5b8:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f5c0::,2c0f:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f5c8::,2c0f:f5c8:ffff:ffff:ffff:ffff:ffff:ffff,TD +2c0f:f5d0::,2c0f:f5d0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f5d8::,2c0f:f5d8:ffff:ffff:ffff:ffff:ffff:ffff,CI +2c0f:f5e0::,2c0f:f5e0:ffff:ffff:ffff:ffff:ffff:ffff,MZ +2c0f:f5e8::,2c0f:f5e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f5f0::,2c0f:f5f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f5f8::,2c0f:f5f8:ffff:ffff:ffff:ffff:ffff:ffff,TN +2c0f:f600::,2c0f:f600:ffff:ffff:ffff:ffff:ffff:ffff,GN +2c0f:f608::,2c0f:f608:ffff:ffff:ffff:ffff:ffff:ffff,RE +2c0f:f610::,2c0f:f610:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f618::,2c0f:f618:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:f620::,2c0f:f620:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f628::,2c0f:f628:ffff:ffff:ffff:ffff:ffff:ffff,RW +2c0f:f630::,2c0f:f630:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2c0f:f638::,2c0f:f638:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f640::,2c0f:f640:ffff:ffff:ffff:ffff:ffff:ffff,GA +2c0f:f648::,2c0f:f648:ffff:ffff:ffff:ffff:ffff:ffff,TD +2c0f:f650::,2c0f:f650:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f658::,2c0f:f658:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:f660::,2c0f:f660:ffff:ffff:ffff:ffff:ffff:ffff,CM +2c0f:f668::,2c0f:f668:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f670::,2c0f:f670:ffff:ffff:ffff:ffff:ffff:ffff,ZM +2c0f:f678::,2c0f:f678:ffff:ffff:ffff:ffff:ffff:ffff,BW +2c0f:f680::,2c0f:f680:ffff:ffff:ffff:ffff:ffff:ffff,SC +2c0f:f690::,2c0f:f690:ffff:ffff:ffff:ffff:ffff:ffff,SS +2c0f:f698::,2c0f:f698:ffff:ffff:ffff:ffff:ffff:ffff,TN +2c0f:f6a0::,2c0f:f6a0:ffff:ffff:ffff:ffff:ffff:ffff,CM +2c0f:f6a8::,2c0f:f6a8:ffff:ffff:ffff:ffff:ffff:ffff,BI +2c0f:f6b0::,2c0f:f6b0:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f6b8::,2c0f:f6b8:ffff:ffff:ffff:ffff:ffff:ffff,SO +2c0f:f6c0::,2c0f:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,CG +2c0f:f6c8::,2c0f:f6c8:ffff:ffff:ffff:ffff:ffff:ffff,CM +2c0f:f6d0::,2c0f:f6d0:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:f6d8::,2c0f:f6d8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f6e0::,2c0f:f6e0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f6e8::,2c0f:f6e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f6f0::,2c0f:f6f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f6f8::,2c0f:f6f8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f700::,2c0f:f700:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f708::,2c0f:f708:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f710::,2c0f:f710:ffff:ffff:ffff:ffff:ffff:ffff,SO +2c0f:f718::,2c0f:f718:ffff:ffff:ffff:ffff:ffff:ffff,BW +2c0f:f720::,2c0f:f720:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f728::,2c0f:f728:ffff:ffff:ffff:ffff:ffff:ffff,BW +2c0f:f730::,2c0f:f730:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f738::,2c0f:f738::ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f738:1::,2c0f:f738:1:ffff:ffff:ffff:ffff:ffff,RU +2c0f:f738:2::,2c0f:f738:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f740::,2c0f:f740:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:f748::,2c0f:f748:3e7:ffff:ffff:ffff:ffff:ffff,MU +2c0f:f748:3e8::,2c0f:f748:3e8:7fff:ffff:ffff:ffff:ffff,ZA +2c0f:f748:3e8:8000::,2c0f:f748:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:f750::,2c0f:f750:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:f758::,2c0f:f758:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f760::,2c0f:f760:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f768::,2c0f:f768:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f770::,2c0f:f770:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2c0f:f778::,2c0f:f778:ffff:ffff:ffff:ffff:ffff:ffff,NA +2c0f:f780::,2c0f:f780:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f788::,2c0f:f788:ffff:ffff:ffff:ffff:ffff:ffff,BI +2c0f:f798::,2c0f:f798:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f7a0::,2c0f:f7a0:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f7a8::,2c0f:f7af:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f7b0::,2c0f:f7b0:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f7b8::,2c0f:f7b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f7c0::,2c0f:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:f7c8::,2c0f:f7c8:ffff:ffff:ffff:ffff:ffff:ffff,TN +2c0f:f7d0::,2c0f:f7d0:ffff:ffff:ffff:ffff:ffff:ffff,CM +2c0f:f7d8::,2c0f:f7d8:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f7e0::,2c0f:f7e0:ffff:ffff:ffff:ffff:ffff:ffff,TN +2c0f:f7e8::,2c0f:f7e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f7f0::,2c0f:f7f0:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f7f8::,2c0f:f7f8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f800::,2c0f:f80f:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f810::,2c0f:f810:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:f818::,2c0f:f818:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2c0f:f820::,2c0f:f820:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:f828::,2c0f:f828:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:f830::,2c0f:f830:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:f838::,2c0f:f838:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f840::,2c0f:f840:ffff:ffff:ffff:ffff:ffff:ffff,GQ +2c0f:f848::,2c0f:f848:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:f850::,2c0f:f850:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f858::,2c0f:f858:ffff:ffff:ffff:ffff:ffff:ffff,DZ +2c0f:f860::,2c0f:f860:ffff:ffff:ffff:ffff:ffff:ffff,RW +2c0f:f878::,2c0f:f878:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f880::,2c0f:f880:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f888::,2c0f:f888:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:f890::,2c0f:f890:ffff:ffff:ffff:ffff:ffff:ffff,GM +2c0f:f898::,2c0f:f898:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:f8a0::,2c0f:f8a0:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:f8b0::,2c0f:f8b0:ffff:ffff:ffff:ffff:ffff:ffff,BF +2c0f:f8b8::,2c0f:f8b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f8c0::,2c0f:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,GQ +2c0f:f8c8::,2c0f:f8c8:ffff:ffff:ffff:ffff:ffff:ffff,NE +2c0f:f8d8::,2c0f:f8d8:ffff:ffff:ffff:ffff:ffff:ffff,BW +2c0f:f8e0::,2c0f:f8e0:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:f8e8::,2c0f:f8e8:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:f8f0::,2c0f:f8f0:f0ab:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f8f0:f0ac::,2c0f:f8f0:f0ac:7fff:ffff:ffff:ffff:ffff,GB +2c0f:f8f0:f0ac:8000::,2c0f:f8f0:f907:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f8f0:f908::,2c0f:f8f0:f908:7fff:ffff:ffff:ffff:ffff,DE +2c0f:f8f0:f908:8000::,2c0f:f8f0:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f8f8::,2c0f:f8f8:ffff:ffff:ffff:ffff:ffff:ffff,SO +2c0f:f900::,2c0f:f900:ffff:ffff:ffff:ffff:ffff:ffff,ML +2c0f:f908::,2c0f:f908:ffff:ffff:ffff:ffff:ffff:ffff,BI +2c0f:f918::,2c0f:f918:ffff:ffff:ffff:ffff:ffff:ffff,RE +2c0f:f920::,2c0f:f920:ffff:ffff:ffff:ffff:ffff:ffff,CG +2c0f:f928::,2c0f:f928:ffff:ffff:ffff:ffff:ffff:ffff,GW +2c0f:f930::,2c0f:f930:ffff:ffff:ffff:ffff:ffff:ffff,LR +2c0f:f938::,2c0f:f938:ffff:ffff:ffff:ffff:ffff:ffff,ZM +2c0f:f940::,2c0f:f940:ffff:ffff:ffff:ffff:ffff:ffff,DZ +2c0f:f948::,2c0f:f948:ffff:ffff:ffff:ffff:ffff:ffff,GA +2c0f:f950::,2c0f:f950:ffff:ffff:ffff:ffff:ffff:ffff,SS +2c0f:f958::,2c0f:f958:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f960::,2c0f:f960:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f968::,2c0f:f968:ffff:ffff:ffff:ffff:ffff:ffff,MZ +2c0f:f970::,2c0f:f970:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f978::,2c0f:f978:ffff:ffff:ffff:ffff:ffff:ffff,CD +2c0f:f980::,2c0f:f980:ffff:ffff:ffff:ffff:ffff:ffff,NA +2c0f:f988::,2c0f:f988:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f990::,2c0f:f990:ffff:ffff:ffff:ffff:ffff:ffff,GN +2c0f:f998::,2c0f:f998:ffff:ffff:ffff:ffff:ffff:ffff,MR +2c0f:f9a0::,2c0f:f9a0:ffff:ffff:ffff:ffff:ffff:ffff,MW +2c0f:f9a8::,2c0f:f9a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f9b0::,2c0f:f9b0:ffff:ffff:ffff:ffff:ffff:ffff,GA +2c0f:f9b8::,2c0f:f9b8:1:ffff:ffff:ffff:ffff:ffff,MU +2c0f:f9b8:2::,2c0f:f9b8:2:ffff:ffff:ffff:ffff:ffff,US +2c0f:f9b8:3::,2c0f:f9b8:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:f9c0::,2c0f:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,BW +2c0f:f9c8::,2c0f:f9c8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f9d0::,2c0f:f9d0:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f9d8::,2c0f:f9d8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f9e0::,2c0f:f9e0:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f9e8::,2c0f:f9e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f9f0::,2c0f:f9f0:ffff:ffff:ffff:ffff:ffff:ffff,MG +2c0f:f9f8::,2c0f:f9f8:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2c0f:fa00::,2c0f:fa00:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:fa08::,2c0f:fa08:ffff:ffff:ffff:ffff:ffff:ffff,CD +2c0f:fa10::,2c0f:fa10:fffc:ffff:ffff:ffff:ffff:ffff,MU +2c0f:fa10:fffd::,2c0f:fa10:fffd:7fff:ffff:ffff:ffff:ffff,ZM +2c0f:fa10:fffd:8000::,2c0f:fa10:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:fa18::,2c0f:fa18:ffff:ffff:ffff:ffff:ffff:ffff,MA +2c0f:fa20::,2c0f:fa20:ffff:ffff:ffff:ffff:ffff:ffff,SS +2c0f:fa28::,2c0f:fa28:ffff:ffff:ffff:ffff:ffff:ffff,MG +2c0f:fa38::,2c0f:fa38:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:fa40::,2c0f:fa40:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fa48::,2c0f:fa48:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fa58::,2c0f:fa58:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fa60::,2c0f:fa60:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:fa68::,2c0f:fa68:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:fa70::,2c0f:fa70:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:fa78::,2c0f:fa78:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fa80::,2c0f:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:fa88::,2c0f:fa88:ffff:ffff:ffff:ffff:ffff:ffff,ST +2c0f:fa90::,2c0f:fa90:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fa98::,2c0f:fa98:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:faa0::,2c0f:faa7:ffff:ffff:ffff:ffff:ffff:ffff,SD +2c0f:fab0::,2c0f:fabf:ffff:ffff:ffff:ffff:ffff:ffff,TN +2c0f:fac0::,2c0f:fac0:ffff:ffff:ffff:ffff:ffff:ffff,MW +2c0f:fac8::,2c0f:fac8:ffff:ffff:ffff:ffff:ffff:ffff,BW +2c0f:fad8::,2c0f:fad8:ffff:ffff:ffff:ffff:ffff:ffff,CM +2c0f:fae0::,2c0f:fae0:ffff:ffff:ffff:ffff:ffff:ffff,CM +2c0f:fae8::,2c0f:fae8:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:faf0::,2c0f:faf0:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:faf8::,2c0f:faf8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fb00::,2c0f:fb00:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:fb08::,2c0f:fb08:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fb10::,2c0f:fb10:ffff:ffff:ffff:ffff:ffff:ffff,LY +2c0f:fb18::,2c0f:fb18:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fb20::,2c0f:fb20:ffff:ffff:ffff:ffff:ffff:ffff,MA +2c0f:fb30::,2c0f:fb30:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fb38::,2c0f:fb38:ffff:ffff:ffff:ffff:ffff:ffff,SO +2c0f:fb40::,2c0f:fb40:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fb48::,2c0f:fb48:ffff:ffff:ffff:ffff:ffff:ffff,MZ +2c0f:fb50::,2c0f:fb50:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:fb58::,2c0f:fb58:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:fb60::,2c0f:fb60:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:fb68::,2c0f:fb68:ffff:ffff:ffff:ffff:ffff:ffff,LS +2c0f:fb70::,2c0f:fb70:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:fb78::,2c0f:fb78:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:fb80::,2c0f:fb80:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fb88::,2c0f:fb88:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:fb90::,2c0f:fb90:ffff:ffff:ffff:ffff:ffff:ffff,MZ +2c0f:fb98::,2c0f:fb98:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:fba0::,2c0f:fba0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fba8::,2c0f:fba8:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:fbb0::,2c0f:fbb0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fbb8::,2c0f:fbb8:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:fbc0::,2c0f:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fbc8::,2c0f:fbc8:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:fbd0::,2c0f:fbd0:ffff:ffff:ffff:ffff:ffff:ffff,GN +2c0f:fbd8::,2c0f:fbd8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fbe0::,2c0f:fc1f:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fc40::,2c0f:fc40:ffff:ffff:ffff:ffff:ffff:ffff,EG +2c0f:fc48::,2c0f:fc48:ffff:ffff:ffff:ffff:ffff:ffff,MW +2c0f:fc58::,2c0f:fc58:ffff:ffff:ffff:ffff:ffff:ffff,MW +2c0f:fc60::,2c0f:fc61:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:fc68::,2c0f:fc68:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fc70::,2c0f:fc70:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:fc80::,2c0f:fc80:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:fc88::,2c0f:fc89:ffff:ffff:ffff:ffff:ffff:ffff,EG +2c0f:fc90::,2c0f:fc90:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:fc98::,2c0f:fc98:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:fca0::,2c0f:fca0:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:fca8::,2c0f:fca8:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:fcb0::,2c0f:fcb0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fcb8::,2c0f:fcb8:ffff:ffff:ffff:ffff:ffff:ffff,GM +2c0f:fcc8::,2c0f:fcc8:ffff:ffff:ffff:ffff:ffff:ffff,ZM +2c0f:fcd0::,2c0f:fcd0:ffff:ffff:ffff:ffff:ffff:ffff,ZM +2c0f:fcd8::,2c0f:fcd8:ffff:ffff:ffff:ffff:ffff:ffff,SO +2c0f:fce0::,2c0f:fce0:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:fce8::,2c0f:fce8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fcf0::,2c0f:fcf0:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:fcf8::,2c0f:fcf8:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:fd00::,2c0f:fd00:ffff:ffff:ffff:ffff:ffff:ffff,LS +2c0f:fd08::,2c0f:fd08:ffff:ffff:ffff:ffff:ffff:ffff,GM +2c0f:fd10::,2c0f:fd10:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:fd18::,2c0f:fd18:ffff:ffff:ffff:ffff:ffff:ffff,SC +2c0f:fd20::,2c0f:fd20:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:fd28::,2c0f:fd28:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:fd30::,2c0f:fd30:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:fd38::,2c0f:fd38:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:fd40::,2c0f:fd40:ffff:ffff:ffff:ffff:ffff:ffff,ZM +2c0f:fd48::,2c0f:fd48:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:fd50::,2c0f:fd50:ffff:ffff:ffff:ffff:ffff:ffff,MW +2c0f:fd58::,2c0f:fd58:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fd60::,2c0f:fd60:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:fd68::,2c0f:fd68:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fd78::,2c0f:fd78:ffff:ffff:ffff:ffff:ffff:ffff,BI +2c0f:fd80::,2c0f:fd80:ffff:ffff:ffff:ffff:ffff:ffff,BF +2c0f:fd88::,2c0f:fd88:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:fd90::,2c0f:fd90:ffff:ffff:ffff:ffff:ffff:ffff,ZM +2c0f:fd98::,2c0f:fd98:ffff:ffff:ffff:ffff:ffff:ffff,ZM +2c0f:fda0::,2c0f:fda0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fda8::,2c0f:fda8:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:fdb0::,2c0f:fdb0:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:fdb8::,2c0f:fdb8:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:fdc0::,2c0f:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:fdc8::,2c0f:fdc8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fdd0::,2c0f:fdd0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fdd8::,2c0f:fdd8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fde8::,2c0f:fde8:ffff:ffff:ffff:ffff:ffff:ffff,MW +2c0f:fdf0::,2c0f:fdf0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fdf8::,2c0f:fdf8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fe08::,2c0f:fe08:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:fe10::,2c0f:fe10:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:fe18::,2c0f:fe18:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fe20::,2c0f:fe20:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fe28::,2c0f:fe28:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fe30::,2c0f:fe30:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:fe38::,2c0f:fe38:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:fe40::,2c0f:fe40:8001:f:ffff:ffff:ffff:ffff,MU +2c0f:fe40:8001:10::,2c0f:fe40:8001:10:ffff:ffff:ffff:ffff,KE +2c0f:fe40:8001:11::,2c0f:fe40:80fe:ffff:ffff:ffff:ffff:ffff,MU +2c0f:fe40:80ff::,2c0f:fe40:80ff:7fff:ffff:ffff:ffff:ffff,KE +2c0f:fe40:80ff:8000::,2c0f:fe40:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:fe50::,2c0f:fe50:ffff:ffff:ffff:ffff:ffff:ffff,DZ +2c0f:fe58::,2c0f:fe58:ffff:ffff:ffff:ffff:ffff:ffff,LS +2c0f:fe60::,2c0f:fe60:ffff:ffff:ffff:ffff:ffff:ffff,RW +2c0f:fe68::,2c0f:fe68:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:fe70::,2c0f:fe70:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:fe78::,2c0f:fe78:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fe80::,2c0f:fe80:ffff:ffff:ffff:ffff:ffff:ffff,ZM +2c0f:fe88::,2c0f:fe88:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:fe90::,2c0f:fe90:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fe98::,2c0f:fe98:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:fea0::,2c0f:fea0:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:fea8::,2c0f:fea8:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:feb0::,2c0f:feb0:16:ffff:ffff:ffff:ffff:ffff,MU +2c0f:feb0:17::,2c0f:feb0:17:7fff:ffff:ffff:ffff:ffff,KE +2c0f:feb0:17:8000::,2c0f:feb0:1e:ffff:ffff:ffff:ffff:ffff,MU +2c0f:feb0:1f::,2c0f:feb0:1f:7fff:ffff:ffff:ffff:ffff,ZA +2c0f:feb0:1f:8000::,2c0f:feb0:1f:ffff:ffff:ffff:ffff:ffff,MU +2c0f:feb0:20::,2c0f:feb0:20:7fff:ffff:ffff:ffff:ffff,ZA +2c0f:feb0:20:8000::,2c0f:feb0:2f:7fff:ffff:ffff:ffff:ffff,MU +2c0f:feb0:2f:8000::,2c0f:feb0:2f:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:feb0:30::,2c0f:feb1:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:feb8::,2c0f:feb8:ffff:ffff:ffff:ffff:ffff:ffff,ZM +2c0f:fec0::,2c0f:fec0:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:fec8::,2c0f:fec8:ffff:ffff:ffff:ffff:ffff:ffff,SD +2c0f:fed8::,2c0f:fed8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:fee0::,2c0f:fee0:ffff:ffff:ffff:ffff:ffff:ffff,EG +2c0f:fef0::,2c0f:fef0:ffff:ffff:ffff:ffff:ffff:ffff,SC +2c0f:fef8::,2c0f:fef8:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:ff00::,2c0f:ff00:ffff:ffff:ffff:ffff:ffff:ffff,BW +2c0f:ff08::,2c0f:ff08:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:ff10::,2c0f:ff10:ffff:ffff:ffff:ffff:ffff:ffff,CD +2c0f:ff18::,2c0f:ff18:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:ff20::,2c0f:ff20:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:ff28::,2c0f:ff28:ffff:ffff:ffff:ffff:ffff:ffff,SD +2c0f:ff30::,2c0f:ff30:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:ff40::,2c0f:ff80:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:ff88::,2c0f:ff88:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:ff90::,2c0f:ff90:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:ff98::,2c0f:ff98:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:ffa0::,2c0f:ffa0:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:ffa8::,2c0f:ffa8:ffff:ffff:ffff:ffff:ffff:ffff,LS +2c0f:ffb0::,2c0f:ffb0:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:ffb8::,2c0f:ffb8:ffff:ffff:ffff:ffff:ffff:ffff,SD +2c0f:ffc0::,2c0f:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:ffc8::,2c0f:ffc8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:ffd0::,2c0f:ffd0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:ffd8::,2c0f:ffd8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:ffe8::,2c0f:ffe8:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:fff0::,2c0f:fff0:ffff:ffff:ffff:ffff:ffff:ffff,NG diff --git a/src/wraith/src/config/include.am b/src/wraith/src/config/include.am new file mode 100644 index 000000000..ee3893493 --- /dev/null +++ b/src/wraith/src/config/include.am @@ -0,0 +1,20 @@ +confdir = $(sysconfdir)/tor + +tordatadir = $(datadir)/tor + +EXTRA_DIST+= \ + src/config/geoip \ + src/config/geoip6 \ + src/config/torrc.minimal.in \ + src/config/torrc.sample.in \ + src/config/README + +conf_DATA = src/config/torrc.sample + +tordata_DATA = src/config/geoip src/config/geoip6 +# fallback_consensus + +# If we don't have it, fake it. +src_config_fallback-consensus: + touch src/config/fallback-consensus + diff --git a/src/wraith/src/config/mmdb-convert.py b/src/wraith/src/config/mmdb-convert.py new file mode 100644 index 000000000..3a454a3fc --- /dev/null +++ b/src/wraith/src/config/mmdb-convert.py @@ -0,0 +1,466 @@ +#!/usr/bin/python3 + +# This software has been dedicated to the public domain under the CC0 +# public domain dedication. +# +# To the extent possible under law, the person who associated CC0 +# with mmdb-convert.py has waived all copyright and related or +# neighboring rights to mmdb-convert.py. +# +# You should have received a copy of the CC0 legalcode along with this +# work in doc/cc0.txt. If not, see +# . + +# Nick Mathewson is responsible for this kludge, but takes no +# responsibility for it. + +"""This kludge is meant to + parse mmdb files in sufficient detail to dump out the old format + that Tor expects. It's also meant to be pure-python. + + When given a simplicity/speed tradeoff, it opts for simplicity. + + You will not understand the code without understanding the MaxMind-DB + file format. It is specified at: + https://github.com/maxmind/MaxMind-DB/blob/master/MaxMind-DB-spec.md. + + This isn't so much tested. When it breaks, you get to keep both + pieces. +""" + +import struct +import bisect +import socket +import binascii +import sys +import time + +METADATA_MARKER = b'\xab\xcd\xefMaxMind.com' + +# Here's some python2/python3 junk. Better solutions wanted. +try: + ord(b"1"[0]) +except TypeError: + def byte_to_int(b): + "convert a single element of a bytestring to an integer." + return b +else: + byte_to_int = ord + +# Here's some more python2/python3 junk. Better solutions wanted. +try: + str(b"a", "utf8") +except TypeError: + bytesToStr = str +else: + def bytesToStr(b): + "convert a bytestring in utf8 to a string." + return str(b, 'utf8') + +def to_int(s): + "Parse a big-endian integer from bytestring s." + result = 0 + for c in s: + result *= 256 + result += byte_to_int(c) + return result + +def to_int24(s): + "Parse a pair of big-endian 24-bit integers from bytestring s." + a, b, c = struct.unpack("!HHH", s) + return ((a <<8)+(b>>8)), (((b&0xff)<<16)+c) + +def to_int32(s): + "Parse a pair of big-endian 32-bit integers from bytestring s." + a, b = struct.unpack("!LL", s) + return a, b + +def to_int28(s): + "Parse a pair of big-endian 28-bit integers from bytestring s." + a, b = unpack("!LL", s + b'\x00') + return (((a & 0xf0) << 20) + (a >> 8)), ((a & 0x0f) << 24) + (b >> 8) + +class Tree(object): + "Holds a node in the tree" + def __init__(self, left, right): + self.left = left + self.right = right + +def resolve_tree(tree, data): + """Fill in the left_item and right_item fields for all values in the tree + so that they point to another Tree, or to a Datum, or to None.""" + d = Datum(None, None, None, None) + def resolve_item(item): + "Helper: resolve a single index." + if item < len(tree): + return tree[item] + elif item == len(tree): + return None + else: + d.pos = (item - len(tree) - 16) + p = bisect.bisect_left(data, d) + assert data[p].pos == d.pos + return data[p] + + for t in tree: + t.left_item = resolve_item(t.left) + t.right_item = resolve_item(t.right) + +def parse_search_tree(s, record_size): + """Given a bytestring and a record size in bits, parse the tree. + Return a list of nodes.""" + record_bytes = (record_size*2) // 8 + nodes = [] + p = 0 + try: + to_leftright = { 24: to_int24, + 28: to_int28, + 32: to_int32 }[ record_size ] + except KeyError: + raise NotImplementedError("Unsupported record size in bits: %d" % + record_size) + while p < len(s): + left, right = to_leftright(s[p:p+record_bytes]) + p += record_bytes + + nodes.append( Tree(left, right ) ) + + return nodes + +class Datum(object): + """Holds a single entry from the Data section""" + def __init__(self, pos, kind, ln, data): + self.pos = pos # Position of this record within data section + self.kind = kind # Type of this record. one of TP_* + self.ln = ln # Length field, which might be overloaded. + self.data = data # Raw bytes data. + self.children = None # Used for arrays and maps. + + def __repr__(self): + return "Datum(%r,%r,%r,%r)" % (self.pos, self.kind, self.ln, self.data) + + # Comparison functions used for bsearch + def __lt__(self, other): + return self.pos < other.pos + + def __gt__(self, other): + return self.pos > other.pos + + def __eq__(self, other): + return self.pos == other.pos + + def build_maps(self): + """If this is a map or array, fill in its 'map' field if it's a map, + and the 'map' field of all its children.""" + + if not hasattr(self, 'nChildren'): + return + + if self.kind == TP_ARRAY: + del self.nChildren + for c in self.children: + c.build_maps() + + elif self.kind == TP_MAP: + del self.nChildren + self.map = {} + for i in range(0, len(self.children), 2): + k = self.children[i].deref() + v = self.children[i+1].deref() + v.build_maps() + if k.kind != TP_UTF8: + raise ValueError("Bad dictionary key type %d"% k.kind) + self.map[bytesToStr(k.data)] = v + + def int_val(self): + """If this is an integer type, return its value""" + assert self.kind in (TP_UINT16, TP_UINT32, TP_UINT64, + TP_UINT128, TP_SINT32) + i = to_int(self.data) + if self.kind == TP_SINT32: + if i & 0x80000000: + i = i - 0x100000000 + return i + + def deref(self): + """If this value is a pointer, return its pointed-to-value. Chase + through multiple layers of pointers if need be. If this isn't + a pointer, return it.""" + n = 0 + s = self + while s.kind == TP_PTR: + s = s.ptr + n += 1 + assert n < 100 + return s + +def resolve_pointers(data): + """Fill in the ptr field of every pointer in data.""" + search = Datum(None, None, None, None) + for d in data: + if d.kind == TP_PTR: + search.pos = d.ln + p = bisect.bisect_left(data, search) + assert data[p].pos == d.ln + d.ptr = data[p] + +TP_PTR = 1 +TP_UTF8 = 2 +TP_DBL = 3 +TP_BYTES = 4 +TP_UINT16 = 5 +TP_UINT32 = 6 +TP_MAP = 7 +TP_SINT32 = 8 +TP_UINT64 = 9 +TP_UINT128 = 10 +TP_ARRAY = 11 +TP_DCACHE = 12 +TP_END = 13 +TP_BOOL = 14 +TP_FLOAT = 15 + +def get_type_and_len(s): + """Data parsing helper: decode the type value and much-overloaded 'length' + field for the value starting at s. Return a 3-tuple of type, length, + and number of bytes used to encode type-plus-length.""" + c = byte_to_int(s[0]) + tp = c >> 5 + skip = 1 + if tp == 0: + tp = byte_to_int(s[1])+7 + skip = 2 + ln = c & 31 + + # I'm sure I don't know what they were thinking here... + if tp == TP_PTR: + len_len = (ln >> 3) + 1 + if len_len < 4: + ln &= 7 + ln <<= len_len * 8 + else: + ln = 0 + ln += to_int(s[skip:skip+len_len]) + ln += (0, 0, 2048, 526336, 0)[len_len] + skip += len_len + elif ln >= 29: + len_len = ln - 28 + ln = to_int(s[skip:skip+len_len]) + ln += (0, 29, 285, 65821)[len_len] + skip += len_len + + return tp, ln, skip + +# Set of types for which 'length' doesn't mean length. +IGNORE_LEN_TYPES = set([ + TP_MAP, # Length is number of key-value pairs that follow. + TP_ARRAY, # Length is number of members that follow. + TP_PTR, # Length is index to pointed-to data element. + TP_BOOL, # Length is 0 or 1. + TP_DCACHE, # Length is number of members that follow +]) + +def parse_data_section(s): + """Given a data section encoded in a bytestring, return a list of + Datum items.""" + + # Stack of possibly nested containers. We use the 'nChildren' member of + # the last one to tell how many more items nest directly inside. + stack = [] + + # List of all items, including nested ones. + data = [] + + # Byte index within the data section. + pos = 0 + + while s: + tp, ln, skip = get_type_and_len(s) + if tp in IGNORE_LEN_TYPES: + real_len = 0 + else: + real_len = ln + + d = Datum(pos, tp, ln, s[skip:skip+real_len]) + data.append(d) + pos += skip+real_len + s = s[skip+real_len:] + + if stack: + stack[-1].children.append(d) + stack[-1].nChildren -= 1 + if stack[-1].nChildren == 0: + del stack[-1] + + if d.kind == TP_ARRAY: + d.nChildren = d.ln + d.children = [] + stack.append(d) + elif d.kind == TP_MAP: + d.nChildren = d.ln * 2 + d.children = [] + stack.append(d) + + return data + +def parse_mm_file(s): + """Parse a MaxMind-DB file.""" + try: + metadata_ptr = s.rindex(METADATA_MARKER) + except ValueError: + raise ValueError("No metadata!") + + metadata = parse_data_section(s[metadata_ptr+len(METADATA_MARKER):]) + + if metadata[0].kind != TP_MAP: + raise ValueError("Bad map") + + metadata[0].build_maps() + mm = metadata[0].map + + tree_size = (((mm['record_size'].int_val() * 2) // 8 ) * + mm['node_count'].int_val()) + + if s[tree_size:tree_size+16] != b'\x00'*16: + raise ValueError("Missing section separator!") + + tree = parse_search_tree(s[:tree_size], mm['record_size'].int_val()) + + data = parse_data_section(s[tree_size+16:metadata_ptr]) + + resolve_pointers(data) + resolve_tree(tree, data) + + for d in data: + d.build_maps() + + return metadata, tree, data + +def format_datum(datum): + """Given a Datum at a leaf of the tree, return the string that we should + write as its value. + + We first try country->iso_code which is the two-character ISO 3166-1 + country code of the country where MaxMind believes the end user is + located. If there's no such key, we try registered_country->iso_code + which is the country in which the ISP has registered the IP address. + Without falling back to registered_country, we'd leave out all ranges + that MaxMind thinks belong to anonymous proxies, because those ranges + don't contain country but only registered_country. In short: let's + fill all A1 entries with what ARIN et. al think. + """ + try: + return bytesToStr(datum.map['country'].map['iso_code'].data) + except KeyError: + pass + try: + return bytesToStr(datum.map['registered_country'].map['iso_code'].data) + except KeyError: + pass + return None + +IPV4_PREFIX = "0"*96 + +def dump_item_ipv4(entries, prefix, val): + """Dump the information for an IPv4 address to entries, where 'prefix' + is a string holding a binary prefix for the address, and 'val' is the + value to dump. If the prefix is not an IPv4 address (it does not start + with 96 bits of 0), then print nothing. + """ + if not prefix.startswith(IPV4_PREFIX): + return + prefix = prefix[96:] + v = int(prefix, 2) + shift = 32 - len(prefix) + lo = v << shift + hi = ((v+1) << shift) - 1 + entries.append((lo, hi, val)) + +def fmt_item_ipv4(entry): + """Format an IPv4 range with lo and hi addresses in decimal form.""" + return "%d,%d,%s\n"%(entry[0], entry[1], entry[2]) + +def fmt_ipv6_addr(v): + """Given a 128-bit integer representing an ipv6 address, return a + string for that ipv6 address.""" + return socket.inet_ntop(socket.AF_INET6, binascii.unhexlify("%032x"%v)) + +def fmt_item_ipv6(entry): + """Format an IPv6 range with lo and hi addresses in hex form.""" + return "%s,%s,%s\n"%(fmt_ipv6_addr(entry[0]), + fmt_ipv6_addr(entry[1]), + entry[2]) + +IPV4_MAPPED_IPV6_PREFIX = "0"*80 + "1"*16 +IPV6_6TO4_PREFIX = "0010000000000010" +TEREDO_IPV6_PREFIX = "0010000000000001" + "0"*16 + +def dump_item_ipv6(entries, prefix, val): + """Dump the information for an IPv6 address prefix to entries, where + 'prefix' is a string holding a binary prefix for the address, + and 'val' is the value to dump. If the prefix is an IPv4 address + (starts with 96 bits of 0), is an IPv4-mapped IPv6 address + (::ffff:0:0/96), or is in the 6to4 mapping subnet (2002::/16), then + print nothing. + """ + if prefix.startswith(IPV4_PREFIX) or \ + prefix.startswith(IPV4_MAPPED_IPV6_PREFIX) or \ + prefix.startswith(IPV6_6TO4_PREFIX) or \ + prefix.startswith(TEREDO_IPV6_PREFIX): + return + v = int(prefix, 2) + shift = 128 - len(prefix) + lo = v << shift + hi = ((v+1) << shift) - 1 + entries.append((lo, hi, val)) + +def dump_tree(entries, node, dump_item, prefix=""): + """Walk the tree rooted at 'node', and call dump_item on the + format_datum output of every leaf of the tree.""" + + if isinstance(node, Tree): + dump_tree(entries, node.left_item, dump_item, prefix+"0") + dump_tree(entries, node.right_item, dump_item, prefix+"1") + elif isinstance(node, Datum): + assert node.kind == TP_MAP + code = format_datum(node) + if code: + dump_item(entries, prefix, code) + else: + assert node == None + +GEOIP_FILE_HEADER = """\ +# Last updated based on %s Maxmind GeoLite2 Country +# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz +# gunzip GeoLite2-Country.mmdb.gz +# python mmdb-convert.py GeoLite2-Country.mmdb +""" + +def write_geoip_file(filename, metadata, the_tree, dump_item, fmt_item): + """Write the entries in the_tree to filename.""" + entries = [] + dump_tree(entries, the_tree[0], dump_item) + fobj = open(filename, 'w') + + build_epoch = metadata[0].map['build_epoch'].int_val() + fobj.write(GEOIP_FILE_HEADER % + time.strftime('%B %-d %Y', time.gmtime(build_epoch))) + + unwritten = None + for entry in entries: + if not unwritten: + unwritten = entry + elif unwritten[1] + 1 == entry[0] and unwritten[2] == entry[2]: + unwritten = (unwritten[0], entry[1], unwritten[2]) + else: + fobj.write(fmt_item(unwritten)) + unwritten = entry + if unwritten: + fobj.write(fmt_item(unwritten)) + fobj.close() + +content = open(sys.argv[1], 'rb').read() +metadata, the_tree, _ = parse_mm_file(content) + +write_geoip_file('geoip', metadata, the_tree, dump_item_ipv4, fmt_item_ipv4) +write_geoip_file('geoip6', metadata, the_tree, dump_item_ipv6, fmt_item_ipv6) diff --git a/src/wraith/src/config/torrc.minimal.in b/src/wraith/src/config/torrc.minimal.in new file mode 100644 index 000000000..d842fbcaf --- /dev/null +++ b/src/wraith/src/config/torrc.minimal.in @@ -0,0 +1,192 @@ +## Configuration file for a typical Tor user +## Last updated 9 October 2013 for Tor 0.2.5.2-alpha. +## (may or may not work for much older or much newer versions of Tor.) +## +## Lines that begin with "## " try to explain what's going on. Lines +## that begin with just "#" are disabled commands: you can enable them +## by removing the "#" symbol. +## +## See 'man tor', or https://www.torproject.org/docs/tor-manual.html, +## for more options you can use in this file. +## +## Tor will look for this file in various places based on your platform: +## https://www.torproject.org/docs/faq#torrc + +## Tor opens a socks proxy on port 9050 by default -- even if you don't +## configure one below. Set "SocksPort 0" if you plan to run Tor only +## as a relay, and not make any local application connections yourself. +#SocksPort 9050 # Default: Bind to localhost:9050 for local connections. +#SocksPort 192.168.0.1:9100 # Bind to this address:port too. + +## Entry policies to allow/deny SOCKS requests based on IP address. +## First entry that matches wins. If no SocksPolicy is set, we accept +## all (and only) requests that reach a SocksPort. Untrusted users who +## can access your SocksPort may be able to learn about the connections +## you make. +#SocksPolicy accept 192.168.0.0/16 +#SocksPolicy reject * + +## Logs go to stdout at level "notice" unless redirected by something +## else, like one of the below lines. You can have as many Log lines as +## you want. +## +## We advise using "notice" in most cases, since anything more verbose +## may provide sensitive information to an attacker who obtains the logs. +## +## Send all messages of level 'notice' or higher to @LOCALSTATEDIR@/log/tor/notices.log +#Log notice file @LOCALSTATEDIR@/log/tor/notices.log +## Send every possible message to @LOCALSTATEDIR@/log/tor/debug.log +#Log debug file @LOCALSTATEDIR@/log/tor/debug.log +## Use the system log instead of Tor's logfiles +#Log notice syslog +## To send all messages to stderr: +#Log debug stderr + +## Uncomment this to start the process in the background... or use +## --runasdaemon 1 on the command line. This is ignored on Windows; +## see the FAQ entry if you want Tor to run as an NT service. +#RunAsDaemon 1 + +## The directory for keeping all the keys/etc. By default, we store +## things in $HOME/.tor on Unix, and in Application Data\tor on Windows. +#DataDirectory @LOCALSTATEDIR@/lib/tor + +## The port on which Tor will listen for local connections from Tor +## controller applications, as documented in control-spec.txt. +#ControlPort 9051 +## If you enable the controlport, be sure to enable one of these +## authentication methods, to prevent attackers from accessing it. +#HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C +#CookieAuthentication 1 + +############### This section is just for location-hidden services ### + +## Once you have configured a hidden service, you can look at the +## contents of the file ".../hidden_service/hostname" for the address +## to tell people. +## +## HiddenServicePort x y:z says to redirect requests on port x to the +## address y:z. + +#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/hidden_service/ +#HiddenServicePort 80 127.0.0.1:80 + +#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/other_hidden_service/ +#HiddenServicePort 80 127.0.0.1:80 +#HiddenServicePort 22 127.0.0.1:22 + +################ This section is just for relays ##################### +# +## See https://www.torproject.org/docs/tor-doc-relay for details. + +## Required: what port to advertise for incoming Tor connections. +#ORPort 9001 +## If you want to listen on a port other than the one advertised in +## ORPort (e.g. to advertise 443 but bind to 9090), you can do it as +## follows. You'll need to do ipchains or other port forwarding +## yourself to make this work. +#ORPort 443 NoListen +#ORPort 127.0.0.1:9090 NoAdvertise + +## The IP address or full DNS name for incoming connections to your +## relay. Leave commented out and Tor will guess. +#Address noname.example.com + +## If you have multiple network interfaces, you can specify one for +## outgoing traffic to use. +# OutboundBindAddress 10.0.0.5 + +## A handle for your relay, so people don't have to refer to it by key. +#Nickname ididnteditheconfig + +## Define these to limit how much relayed traffic you will allow. Your +## own traffic is still unthrottled. Note that RelayBandwidthRate must +## be at least 20 KB. +## Note that units for these config options are bytes per second, not bits +## per second, and that prefixes are binary prefixes, i.e. 2^10, 2^20, etc. +#RelayBandwidthRate 100 KB # Throttle traffic to 100KB/s (800Kbps) +#RelayBandwidthBurst 200 KB # But allow bursts up to 200KB/s (1600Kbps) + +## Use these to restrict the maximum traffic per day, week, or month. +## Note that this threshold applies separately to sent and received bytes, +## not to their sum: setting "4 GB" may allow up to 8 GB total before +## hibernating. +## +## Set a maximum of 4 gigabytes each way per period. +#AccountingMax 4 GB +## Each period starts daily at midnight (AccountingMax is per day) +#AccountingStart day 00:00 +## Each period starts on the 3rd of the month at 15:00 (AccountingMax +## is per month) +#AccountingStart month 3 15:00 + +## Administrative contact information for this relay or bridge. This line +## can be used to contact you if your relay or bridge is misconfigured or +## something else goes wrong. Note that we archive and publish all +## descriptors containing these lines and that Google indexes them, so +## spammers might also collect them. You may want to obscure the fact that +## it's an email address and/or generate a new address for this purpose. +#ContactInfo Random Person +## You might also include your PGP or GPG fingerprint if you have one: +#ContactInfo 0xFFFFFFFF Random Person + +## Uncomment this to mirror directory information for others. Please do +## if you have enough bandwidth. +#DirPort 9030 # what port to advertise for directory connections +## If you want to listen on a port other than the one advertised in +## DirPort (e.g. to advertise 80 but bind to 9091), you can do it as +## follows. below too. You'll need to do ipchains or other port +## forwarding yourself to make this work. +#DirPort 80 NoListen +#DirPort 127.0.0.1:9091 NoAdvertise +## Uncomment to return an arbitrary blob of html on your DirPort. Now you +## can explain what Tor is if anybody wonders why your IP address is +## contacting them. See contrib/tor-exit-notice.html in Tor's source +## distribution for a sample. +#DirPortFrontPage @CONFDIR@/tor-exit-notice.html + +## Uncomment this if you run more than one Tor relay, and add the identity +## key fingerprint of each Tor relay you control, even if they're on +## different networks. You declare it here so Tor clients can avoid +## using more than one of your relays in a single circuit. See +## https://www.torproject.org/docs/faq#MultipleRelays +## However, you should never include a bridge's fingerprint here, as it would +## break its concealability and potentionally reveal its IP/TCP address. +#MyFamily $keyid,$keyid,... + +## A comma-separated list of exit policies. They're considered first +## to last, and the first match wins. If you want to _replace_ +## the default exit policy, end this with either a reject *:* or an +## accept *:*. Otherwise, you're _augmenting_ (prepending to) the +## default exit policy. Leave commented to just use the default, which is +## described in the man page or at +## https://www.torproject.org/documentation.html +## +## Look at https://www.torproject.org/faq-abuse.html#TypicalAbuses +## for issues you might encounter if you use the default exit policy. +## +## If certain IPs and ports are blocked externally, e.g. by your firewall, +## you should update your exit policy to reflect this -- otherwise Tor +## users will be told that those destinations are down. +## +## For security, by default Tor rejects connections to private (local) +## networks, including to your public IP address. See the man page entry +## for ExitPolicyRejectPrivate if you want to allow "exit enclaving". +## +#ExitPolicy accept *:6660-6667,reject *:* # allow irc ports but no more +#ExitPolicy accept *:119 # accept nntp as well as default exit policy +#ExitPolicy reject *:* # no exits allowed + +## Bridge relays (or "bridges") are Tor relays that aren't listed in the +## main directory. Since there is no complete public list of them, even an +## ISP that filters connections to all the known Tor relays probably +## won't be able to block all the bridges. Also, websites won't treat you +## differently because they won't know you're running Tor. If you can +## be a real relay, please do; but if not, be a bridge! +#BridgeRelay 1 +## By default, Tor will advertise your bridge to users through various +## mechanisms like https://bridges.torproject.org/. If you want to run +## a private bridge, for example because you'll give out your bridge +## address manually to your friends, uncomment this line: +#PublishServerDescriptor 0 + diff --git a/src/wraith/src/config/torrc.minimal.in-staging b/src/wraith/src/config/torrc.minimal.in-staging new file mode 100644 index 000000000..c537c51f9 --- /dev/null +++ b/src/wraith/src/config/torrc.minimal.in-staging @@ -0,0 +1,210 @@ +## Configuration file for a typical Tor user +## Last updated 22 September 2015 for Tor 0.2.7.3-alpha. +## (may or may not work for much older or much newer versions of Tor.) +## +## Lines that begin with "## " try to explain what's going on. Lines +## that begin with just "#" are disabled commands: you can enable them +## by removing the "#" symbol. +## +## See 'man tor', or https://www.torproject.org/docs/tor-manual.html, +## for more options you can use in this file. +## +## Tor will look for this file in various places based on your platform: +## https://www.torproject.org/docs/faq#torrc + +## Tor opens a SOCKS proxy on port 9050 by default -- even if you don't +## configure one below. Set "SOCKSPort 0" if you plan to run Tor only +## as a relay, and not make any local application connections yourself. +#SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections. +#SOCKSPort 192.168.0.1:9100 # Bind to this address:port too. + +## Entry policies to allow/deny SOCKS requests based on IP address. +## First entry that matches wins. If no SOCKSPolicy is set, we accept +## all (and only) requests that reach a SOCKSPort. Untrusted users who +## can access your SOCKSPort may be able to learn about the connections +## you make. +#SOCKSPolicy accept 192.168.0.0/16 +#SOCKSPolicy accept6 FC00::/7 +#SOCKSPolicy reject * + +## Logs go to stdout at level "notice" unless redirected by something +## else, like one of the below lines. You can have as many Log lines as +## you want. +## +## We advise using "notice" in most cases, since anything more verbose +## may provide sensitive information to an attacker who obtains the logs. +## +## Send all messages of level 'notice' or higher to @LOCALSTATEDIR@/log/tor/notices.log +#Log notice file @LOCALSTATEDIR@/log/tor/notices.log +## Send every possible message to @LOCALSTATEDIR@/log/tor/debug.log +#Log debug file @LOCALSTATEDIR@/log/tor/debug.log +## Use the system log instead of Tor's logfiles +#Log notice syslog +## To send all messages to stderr: +#Log debug stderr + +## Uncomment this to start the process in the background... or use +## --runasdaemon 1 on the command line. This is ignored on Windows; +## see the FAQ entry if you want Tor to run as an NT service. +#RunAsDaemon 1 + +## The directory for keeping all the keys/etc. By default, we store +## things in $HOME/.tor on Unix, and in Application Data\tor on Windows. +#DataDirectory @LOCALSTATEDIR@/lib/tor + +## The port on which Tor will listen for local connections from Tor +## controller applications, as documented in control-spec.txt. +#ControlPort 9051 +## If you enable the controlport, be sure to enable one of these +## authentication methods, to prevent attackers from accessing it. +#HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C +#CookieAuthentication 1 + +############### This section is just for location-hidden services ### + +## Once you have configured a hidden service, you can look at the +## contents of the file ".../hidden_service/hostname" for the address +## to tell people. +## +## HiddenServicePort x y:z says to redirect requests on port x to the +## address y:z. + +#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/hidden_service/ +#HiddenServicePort 80 127.0.0.1:80 + +#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/other_hidden_service/ +#HiddenServicePort 80 127.0.0.1:80 +#HiddenServicePort 22 127.0.0.1:22 + +################ This section is just for relays ##################### +# +## See https://www.torproject.org/docs/tor-doc-relay for details. + +## Required: what port to advertise for incoming Tor connections. +#ORPort 9001 +## If you want to listen on a port other than the one advertised in +## ORPort (e.g. to advertise 443 but bind to 9090), you can do it as +## follows. You'll need to do ipchains or other port forwarding +## yourself to make this work. +#ORPort 443 NoListen +#ORPort 127.0.0.1:9090 NoAdvertise + +## The IP address or full DNS name for incoming connections to your +## relay. Leave commented out and Tor will guess. +#Address noname.example.com + +## If you have multiple network interfaces, you can specify one for +## outgoing traffic to use. +# OutboundBindAddress 10.0.0.5 + +## A handle for your relay, so people don't have to refer to it by key. +## Nicknames must be between 1 and 19 characters inclusive, and must +## contain only the alphanumeric characters (a-z, A-Z, 0-9). No unicode, +## no emoji. +#Nickname ididnteditheconfig + +## Define these to limit how much relayed traffic you will allow. Your +## own traffic is still unthrottled. Note that RelayBandwidthRate must +## be at least 75 kilobytes per second. +## Note that units for these config options are bytes (per second), not +## bits (per second), and that prefixes are binary prefixes, i.e. 2^10, +## 2^20, etc. +#RelayBandwidthRate 100 KBytes # Throttle traffic to 100KB/s (800Kbps) +#RelayBandwidthBurst 200 KBytes # But allow bursts up to 200KB (1600Kb) + +## Use these to restrict the maximum traffic per day, week, or month. +## Note that this threshold applies separately to sent and received bytes, +## not to their sum: setting "40 GB" may allow up to 80 GB total before +## hibernating. +## +## Set a maximum of 40 gigabytes each way per period. +#AccountingMax 40 GBytes +## Each period starts daily at midnight (AccountingMax is per day) +#AccountingStart day 00:00 +## Each period starts on the 3rd of the month at 15:00 (AccountingMax +## is per month) +#AccountingStart month 3 15:00 + +## Administrative contact information for this relay or bridge. This line +## can be used to contact you if your relay or bridge is misconfigured or +## something else goes wrong. Note that we archive and publish all +## descriptors containing these lines and that Google indexes them, so +## spammers might also collect them. You may want to obscure the fact that +## it's an email address and/or generate a new address for this purpose. +## Notice that "<" and ">" are recommended. +#ContactInfo Random Person +## You might also include your PGP or GPG fingerprint if you have one. +## Use the full fingerprint, not just a (short) KeyID: KeyIDs are easy +## to forge. +#ContactInfo FFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF Random Person + +## Uncomment this to mirror directory information for others. Please do +## if you have enough bandwidth. +#DirPort 9030 # what port to advertise for directory connections +## If you want to listen on a port other than the one advertised in +## DirPort (e.g. to advertise 80 but bind to 9091), you can do it as +## follows. below too. You'll need to do ipchains or other port +## forwarding yourself to make this work. +#DirPort 80 NoListen +#DirPort 127.0.0.1:9091 NoAdvertise +## Uncomment to return an arbitrary blob of html on your DirPort. Now you +## can explain what Tor is if anybody wonders why your IP address is +## contacting them. See contrib/tor-exit-notice.html in Tor's source +## distribution for a sample. +#DirPortFrontPage @CONFDIR@/tor-exit-notice.html + +## Uncomment this if you run more than one Tor relay, and add the +## identity key fingerprint of each Tor relay you control, even if +## they're on different networks. Include "$" with each key id. You +## declare it here so Tor clients can avoid using more than one of +## your relays in a single circuit. +## See https://www.torproject.org/docs/faq#MultipleRelays +## However, you should never include a bridge's fingerprint here, as it would +## break its concealability and potentially reveal its IP/TCP address. +#MyFamily $keyid,$keyid,... + +## A comma-separated list of exit policies. They're considered first +## to last, and the first match wins. +## +## If you want to allow the same ports on IPv4 and IPv6, write your rules +## using accept/reject *. If you want to allow different ports on IPv4 and +## IPv6, write your IPv6 rules using accept6/reject6 *6, and your IPv4 rules +## using accept/reject *4. +## +## If you want to _replace_ the default exit policy, end this with either a +## reject *:* or an accept *:*. Otherwise, you're _augmenting_ (prepending to) +## the default exit policy. Leave commented to just use the default, which is +## described in the man page or at +## https://www.torproject.org/documentation.html +## +## Look at https://www.torproject.org/faq-abuse.html#TypicalAbuses +## for issues you might encounter if you use the default exit policy. +## +## If certain IPs and ports are blocked externally, e.g. by your firewall, +## you should update your exit policy to reflect this -- otherwise Tor +## users will be told that those destinations are down. +## +## For security, by default Tor rejects connections to private (local) +## networks, including to the configured primary public IPv4 and IPv6 addresses, +## and any public IPv4 and IPv6 addresses on any interface on the relay. +## See the man page entry for ExitPolicyRejectPrivate if you want to allow +## "exit enclaving". +## +#ExitPolicy accept *:6660-6667,reject *:* # allow irc ports on IPv4 and IPv6 but no more +#ExitPolicy accept *:119 # accept nntp ports on IPv4 and IPv6 as well as default exit policy +#ExitPolicy accept *4:119 # accept nntp ports on IPv4 only as well as default exit policy +#ExitPolicy accept6 *6:119 # accept nntp ports on IPv6 only as well as default exit policy +#ExitPolicy reject *:* # no exits allowed + +## Bridge relays (or "bridges") are Tor relays that aren't listed in the +## main directory. Since there is no complete public list of them, even an +## ISP that filters connections to all the known Tor relays probably +## won't be able to block all the bridges. Also, websites won't treat you +## differently because they won't know you're running Tor. If you can +## be a real relay, please do; but if not, be a bridge! +#BridgeRelay 1 +## By default, Tor will advertise your bridge to users through various +## mechanisms like https://bridges.torproject.org/. If you want to run +## a private bridge, for example because you'll give out your bridge +## address manually to your friends, uncomment this line: +#PublishServerDescriptor 0 diff --git a/src/wraith/src/config/torrc.sample.in b/src/wraith/src/config/torrc.sample.in new file mode 100644 index 000000000..8f3597f3f --- /dev/null +++ b/src/wraith/src/config/torrc.sample.in @@ -0,0 +1,220 @@ +## Configuration file for a typical Tor user +## Last updated 22 September 2015 for Tor 0.2.7.3-alpha. +## (may or may not work for much older or much newer versions of Tor.) +## +## Lines that begin with "## " try to explain what's going on. Lines +## that begin with just "#" are disabled commands: you can enable them +## by removing the "#" symbol. +## +## See 'man tor', or https://www.torproject.org/docs/tor-manual.html, +## for more options you can use in this file. +## +## Tor will look for this file in various places based on your platform: +## https://www.torproject.org/docs/faq#torrc + +## Tor opens a SOCKS proxy on port 9050 by default -- even if you don't +## configure one below. Set "SOCKSPort 0" if you plan to run Tor only +## as a relay, and not make any local application connections yourself. +#SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections. +#SOCKSPort 192.168.0.1:9100 # Bind to this address:port too. + +## Entry policies to allow/deny SOCKS requests based on IP address. +## First entry that matches wins. If no SOCKSPolicy is set, we accept +## all (and only) requests that reach a SOCKSPort. Untrusted users who +## can access your SOCKSPort may be able to learn about the connections +## you make. +#SOCKSPolicy accept 192.168.0.0/16 +#SOCKSPolicy accept6 FC00::/7 +#SOCKSPolicy reject * + +## Logs go to stdout at level "notice" unless redirected by something +## else, like one of the below lines. You can have as many Log lines as +## you want. +## +## We advise using "notice" in most cases, since anything more verbose +## may provide sensitive information to an attacker who obtains the logs. +## +## Send all messages of level 'notice' or higher to @LOCALSTATEDIR@/log/tor/notices.log +#Log notice file @LOCALSTATEDIR@/log/tor/notices.log +## Send every possible message to @LOCALSTATEDIR@/log/tor/debug.log +#Log debug file @LOCALSTATEDIR@/log/tor/debug.log +## Use the system log instead of Tor's logfiles +#Log notice syslog +## To send all messages to stderr: +#Log debug stderr + +## Uncomment this to start the process in the background... or use +## --runasdaemon 1 on the command line. This is ignored on Windows; +## see the FAQ entry if you want Tor to run as an NT service. +#RunAsDaemon 1 + +## The directory for keeping all the keys/etc. By default, we store +## things in $HOME/.tor on Unix, and in Application Data\tor on Windows. +#DataDirectory @LOCALSTATEDIR@/lib/tor + +## The port on which Tor will listen for local connections from Tor +## controller applications, as documented in control-spec.txt. +#ControlPort 9051 +## If you enable the controlport, be sure to enable one of these +## authentication methods, to prevent attackers from accessing it. +#HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C +#CookieAuthentication 1 + +############### This section is just for location-hidden services ### + +## Once you have configured a hidden service, you can look at the +## contents of the file ".../hidden_service/hostname" for the address +## to tell people. +## +## HiddenServicePort x y:z says to redirect requests on port x to the +## address y:z. + +#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/hidden_service/ +#HiddenServicePort 80 127.0.0.1:80 + +#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/other_hidden_service/ +#HiddenServicePort 80 127.0.0.1:80 +#HiddenServicePort 22 127.0.0.1:22 + +################ This section is just for relays ##################### +# +## See https://www.torproject.org/docs/tor-doc-relay for details. + +## Required: what port to advertise for incoming Tor connections. +#ORPort 9001 +## If you want to listen on a port other than the one advertised in +## ORPort (e.g. to advertise 443 but bind to 9090), you can do it as +## follows. You'll need to do ipchains or other port forwarding +## yourself to make this work. +#ORPort 443 NoListen +#ORPort 127.0.0.1:9090 NoAdvertise + +## The IP address or full DNS name for incoming connections to your +## relay. Leave commented out and Tor will guess. +#Address noname.example.com + +## If you have multiple network interfaces, you can specify one for +## outgoing traffic to use. +## OutboundBindAddressExit will be used for all exit traffic, while +## OutboundBindAddressOR will be used for all other connections. +## If you do not wish to differentiate, use OutboundBindAddress to +## specify the same address for both in a single line. +#OutboundBindAddressExit 10.0.0.4 +#OutboundBindAddressOR 10.0.0.5 + +## A handle for your relay, so people don't have to refer to it by key. +## Nicknames must be between 1 and 19 characters inclusive, and must +## contain only the characters [a-zA-Z0-9]. +#Nickname ididnteditheconfig + +## Define these to limit how much relayed traffic you will allow. Your +## own traffic is still unthrottled. Note that RelayBandwidthRate must +## be at least 75 kilobytes per second. +## Note that units for these config options are bytes (per second), not +## bits (per second), and that prefixes are binary prefixes, i.e. 2^10, +## 2^20, etc. +#RelayBandwidthRate 100 KBytes # Throttle traffic to 100KB/s (800Kbps) +#RelayBandwidthBurst 200 KBytes # But allow bursts up to 200KB (1600Kb) + +## Use these to restrict the maximum traffic per day, week, or month. +## Note that this threshold applies separately to sent and received bytes, +## not to their sum: setting "40 GB" may allow up to 80 GB total before +## hibernating. +## +## Set a maximum of 40 gigabytes each way per period. +#AccountingMax 40 GBytes +## Each period starts daily at midnight (AccountingMax is per day) +#AccountingStart day 00:00 +## Each period starts on the 3rd of the month at 15:00 (AccountingMax +## is per month) +#AccountingStart month 3 15:00 + +## Administrative contact information for this relay or bridge. This line +## can be used to contact you if your relay or bridge is misconfigured or +## something else goes wrong. Note that we archive and publish all +## descriptors containing these lines and that Google indexes them, so +## spammers might also collect them. You may want to obscure the fact that +## it's an email address and/or generate a new address for this purpose. +#ContactInfo Random Person +## You might also include your PGP or GPG fingerprint if you have one: +#ContactInfo 0xFFFFFFFF Random Person + +## Uncomment this to mirror directory information for others. Please do +## if you have enough bandwidth. +#DirPort 9030 # what port to advertise for directory connections +## If you want to listen on a port other than the one advertised in +## DirPort (e.g. to advertise 80 but bind to 9091), you can do it as +## follows. below too. You'll need to do ipchains or other port +## forwarding yourself to make this work. +#DirPort 80 NoListen +#DirPort 127.0.0.1:9091 NoAdvertise +## Uncomment to return an arbitrary blob of html on your DirPort. Now you +## can explain what Tor is if anybody wonders why your IP address is +## contacting them. See contrib/tor-exit-notice.html in Tor's source +## distribution for a sample. +#DirPortFrontPage @CONFDIR@/tor-exit-notice.html + +## Uncomment this if you run more than one Tor relay, and add the identity +## key fingerprint of each Tor relay you control, even if they're on +## different networks. You declare it here so Tor clients can avoid +## using more than one of your relays in a single circuit. See +## https://www.torproject.org/docs/faq#MultipleRelays +## However, you should never include a bridge's fingerprint here, as it would +## break its concealability and potentially reveal its IP/TCP address. +#MyFamily $keyid,$keyid,... + +## A comma-separated list of exit policies. They're considered first +## to last, and the first match wins. +## +## If you want to allow the same ports on IPv4 and IPv6, write your rules +## using accept/reject *. If you want to allow different ports on IPv4 and +## IPv6, write your IPv6 rules using accept6/reject6 *6, and your IPv4 rules +## using accept/reject *4. +## +## If you want to _replace_ the default exit policy, end this with either a +## reject *:* or an accept *:*. Otherwise, you're _augmenting_ (prepending to) +## the default exit policy. Leave commented to just use the default, which is +## described in the man page or at +## https://www.torproject.org/documentation.html +## +## Look at https://www.torproject.org/faq-abuse.html#TypicalAbuses +## for issues you might encounter if you use the default exit policy. +## +## If certain IPs and ports are blocked externally, e.g. by your firewall, +## you should update your exit policy to reflect this -- otherwise Tor +## users will be told that those destinations are down. +## +## For security, by default Tor rejects connections to private (local) +## networks, including to the configured primary public IPv4 and IPv6 addresses, +## and any public IPv4 and IPv6 addresses on any interface on the relay. +## See the man page entry for ExitPolicyRejectPrivate if you want to allow +## "exit enclaving". +## +#ExitPolicy accept *:6660-6667,reject *:* # allow irc ports on IPv4 and IPv6 but no more +#ExitPolicy accept *:119 # accept nntp ports on IPv4 and IPv6 as well as default exit policy +#ExitPolicy accept *4:119 # accept nntp ports on IPv4 only as well as default exit policy +#ExitPolicy accept6 *6:119 # accept nntp ports on IPv6 only as well as default exit policy +#ExitPolicy reject *:* # no exits allowed + +## Bridge relays (or "bridges") are Tor relays that aren't listed in the +## main directory. Since there is no complete public list of them, even an +## ISP that filters connections to all the known Tor relays probably +## won't be able to block all the bridges. Also, websites won't treat you +## differently because they won't know you're running Tor. If you can +## be a real relay, please do; but if not, be a bridge! +#BridgeRelay 1 +## By default, Tor will advertise your bridge to users through various +## mechanisms like https://bridges.torproject.org/. If you want to run +## a private bridge, for example because you'll give out your bridge +## address manually to your friends, uncomment this line: +#PublishServerDescriptor 0 + +## Configuration options can be imported from files or folders using the %include +## option with the value being a path. If the path is a file, the options from the +## file will be parsed as if they were written where the %include option is. If +## the path is a folder, all files on that folder will be parsed following lexical +## order. Files starting with a dot are ignored. Files on subfolders are ignored. +## The %include option can be used recursively. +#%include /etc/torrc.d/ +#%include /etc/torrc.custom + diff --git a/src/wraith/src/ext/Makefile.nmake b/src/wraith/src/ext/Makefile.nmake new file mode 100644 index 000000000..d02d03bf4 --- /dev/null +++ b/src/wraith/src/ext/Makefile.nmake @@ -0,0 +1,12 @@ +all: csiphash.lib + +CFLAGS = /O2 /MT /I ..\win32 /I ..\..\..\build-alpha\include /I ..\common \ + /I ..\ext + +CSIPHASH_OBJECTS = csiphash.obj + +csiphash.lib: $(CSIPHASH_OBJECTS) + lib $(CSIPHASH_OBJECTS) $(CURVE25519_DONNA_OBJECTS) /out:csiphash.lib + +clean: + del *.obj *.lib diff --git a/src/wraith/src/ext/OpenBSD_malloc_Linux.c b/src/wraith/src/ext/OpenBSD_malloc_Linux.c new file mode 100644 index 000000000..855c91231 --- /dev/null +++ b/src/wraith/src/ext/OpenBSD_malloc_Linux.c @@ -0,0 +1,2047 @@ +/* Version 1.83 for Linux. + * Compilation: gcc -shared -fPIC -O2 OpenBSD_malloc_Linux.c -o malloc.so + * Launching: LD_PRELOAD=/path/to/malloc.so firefox + */ + +/* $OpenBSD: malloc.c,v 1.83 2006/05/14 19:53:40 otto Exp $ */ + +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + */ + +/* We use this macro to remove some code that we don't actually want, + * rather than to fix its warnings. */ +#define BUILDING_FOR_TOR + +/* + * Defining MALLOC_EXTRA_SANITY will enable extra checks which are + * related to internal conditions and consistency in malloc.c. This has + * a noticeable runtime performance hit, and generally will not do you + * any good unless you fiddle with the internals of malloc or want + * to catch random pointer corruption as early as possible. + */ +#ifndef MALLOC_EXTRA_SANITY +#undef MALLOC_EXTRA_SANITY +#endif + +/* + * Defining MALLOC_STATS will enable you to call malloc_dump() and set + * the [dD] options in the MALLOC_OPTIONS environment variable. + * It has no run-time performance hit, but does pull in stdio... + */ +#ifndef MALLOC_STATS +#undef MALLOC_STATS +#endif + +/* + * What to use for Junk. This is the byte value we use to fill with + * when the 'J' option is enabled. + */ +#define SOME_JUNK 0xd0 /* as in "Duh" :-) */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +/* For SIZE_MAX */ +#include "torint.h" + +//#include "thread_private.h" + +/* + * The basic parameters you can tweak. + * + * malloc_pageshift pagesize = 1 << malloc_pageshift + * It's probably best if this is the native + * page size, but it shouldn't have to be. + * + * malloc_minsize minimum size of an allocation in bytes. + * If this is too small it's too much work + * to manage them. This is also the smallest + * unit of alignment used for the storage + * returned by malloc/realloc. + * + */ + +static int align = 0; +static size_t g_alignment = 0; + +extern int __libc_enable_secure; + +#ifndef HAVE_ISSETUGID +static int issetugid(void) +{ + if (__libc_enable_secure) return 1; + if (getuid() != geteuid()) return 1; + if (getgid() != getegid()) return 1; + return 0; +} +#endif + +#define PGSHIFT 12 +#undef MADV_FREE +#define MADV_FREE MADV_DONTNEED +#include +static pthread_mutex_t gen_mutex = PTHREAD_MUTEX_INITIALIZER; + +#define _MALLOC_LOCK_INIT() {;} +#define _MALLOC_LOCK() {pthread_mutex_lock(&gen_mutex);} +#define _MALLOC_UNLOCK() {pthread_mutex_unlock(&gen_mutex);} + +#if defined(__sparc__) || defined(__alpha__) +#define malloc_pageshift 13U +#endif +#if defined(__ia64__) +#define malloc_pageshift 14U +#endif + +#ifndef malloc_pageshift +#define malloc_pageshift (PGSHIFT) +#endif + +/* + * No user serviceable parts behind this point. + * + * This structure describes a page worth of chunks. + */ +struct pginfo { + struct pginfo *next; /* next on the free list */ + void *page; /* Pointer to the page */ + u_short size; /* size of this page's chunks */ + u_short shift; /* How far to shift for this size chunks */ + u_short free; /* How many free chunks */ + u_short total; /* How many chunk */ + u_long bits[1];/* Which chunks are free */ +}; + +/* How many bits per u_long in the bitmap */ +#define MALLOC_BITS (int)((NBBY * sizeof(u_long))) + +/* + * This structure describes a number of free pages. + */ +struct pgfree { + struct pgfree *next; /* next run of free pages */ + struct pgfree *prev; /* prev run of free pages */ + void *page; /* pointer to free pages */ + void *pdir; /* pointer to the base page's dir */ + size_t size; /* number of bytes free */ +}; + +/* + * Magic values to put in the page_directory + */ +#define MALLOC_NOT_MINE ((struct pginfo*) 0) +#define MALLOC_FREE ((struct pginfo*) 1) +#define MALLOC_FIRST ((struct pginfo*) 2) +#define MALLOC_FOLLOW ((struct pginfo*) 3) +#define MALLOC_MAGIC ((struct pginfo*) 4) + +#ifndef malloc_minsize +#define malloc_minsize 16UL +#endif + +#if !defined(malloc_pagesize) +#define malloc_pagesize (1UL<>1) +#endif + +/* A mask for the offset inside a page. */ +#define malloc_pagemask ((malloc_pagesize)-1) + +#define pageround(foo) (((foo) + (malloc_pagemask)) & ~malloc_pagemask) +#define ptr2index(foo) (((u_long)(foo) >> malloc_pageshift)+malloc_pageshift) +#define index2ptr(idx) ((void*)(((idx)-malloc_pageshift)<dirnum) == pidx) + *pdi = last_dir; + else if (prev_dir != NULL && PD_IDX(prev_dir->dirnum) == pidx) + *pdi = prev_dir; + else if (last_dir != NULL && prev_dir != NULL) { + if ((PD_IDX(last_dir->dirnum) > pidx) ? + (PD_IDX(last_dir->dirnum) - pidx) : + (pidx - PD_IDX(last_dir->dirnum)) + < (PD_IDX(prev_dir->dirnum) > pidx) ? + (PD_IDX(prev_dir->dirnum) - pidx) : + (pidx - PD_IDX(prev_dir->dirnum))) + *pdi = last_dir; + else + *pdi = prev_dir; + + if (PD_IDX((*pdi)->dirnum) > pidx) { + for (spi = (*pdi)->prev; + spi != NULL && PD_IDX(spi->dirnum) > pidx; + spi = spi->prev) + *pdi = spi; + if (spi != NULL) + *pdi = spi; + } else + for (spi = (*pdi)->next; + spi != NULL && PD_IDX(spi->dirnum) <= pidx; + spi = spi->next) + *pdi = spi; + } else { + *pdi = (struct pdinfo *) ((caddr_t) page_dir + pdi_off); + for (spi = *pdi; + spi != NULL && PD_IDX(spi->dirnum) <= pidx; + spi = spi->next) + *pdi = spi; + } + + return ((PD_IDX((*pdi)->dirnum) == pidx) ? 0 : + (PD_IDX((*pdi)->dirnum) > pidx) ? 1 : -1); +} + +#ifdef MALLOC_STATS +void +malloc_dump(int fd) +{ + char buf[1024]; + struct pginfo **pd; + struct pgfree *pf; + struct pdinfo *pi; + u_long j; + + pd = page_dir; + pi = (struct pdinfo *) ((caddr_t) pd + pdi_off); + + /* print out all the pages */ + for (j = 0; j <= last_index;) { + snprintf(buf, sizeof buf, "%08lx %5lu ", j << malloc_pageshift, j); + write(fd, buf, strlen(buf)); + if (pd[PI_OFF(j)] == MALLOC_NOT_MINE) { + for (j++; j <= last_index && pd[PI_OFF(j)] == MALLOC_NOT_MINE;) { + if (!PI_OFF(++j)) { + if ((pi = pi->next) == NULL || + PD_IDX(pi->dirnum) != PI_IDX(j)) + break; + pd = pi->base; + j += pdi_mod; + } + } + j--; + snprintf(buf, sizeof buf, ".. %5lu not mine\n", j); + write(fd, buf, strlen(buf)); + } else if (pd[PI_OFF(j)] == MALLOC_FREE) { + for (j++; j <= last_index && pd[PI_OFF(j)] == MALLOC_FREE;) { + if (!PI_OFF(++j)) { + if ((pi = pi->next) == NULL || + PD_IDX(pi->dirnum) != PI_IDX(j)) + break; + pd = pi->base; + j += pdi_mod; + } + } + j--; + snprintf(buf, sizeof buf, ".. %5lu free\n", j); + write(fd, buf, strlen(buf)); + } else if (pd[PI_OFF(j)] == MALLOC_FIRST) { + for (j++; j <= last_index && pd[PI_OFF(j)] == MALLOC_FOLLOW;) { + if (!PI_OFF(++j)) { + if ((pi = pi->next) == NULL || + PD_IDX(pi->dirnum) != PI_IDX(j)) + break; + pd = pi->base; + j += pdi_mod; + } + } + j--; + snprintf(buf, sizeof buf, ".. %5lu in use\n", j); + write(fd, buf, strlen(buf)); + } else if (pd[PI_OFF(j)] < MALLOC_MAGIC) { + snprintf(buf, sizeof buf, "(%p)\n", pd[PI_OFF(j)]); + write(fd, buf, strlen(buf)); + } else { + snprintf(buf, sizeof buf, "%p %d (of %d) x %d @ %p --> %p\n", + pd[PI_OFF(j)], pd[PI_OFF(j)]->free, + pd[PI_OFF(j)]->total, pd[PI_OFF(j)]->size, + pd[PI_OFF(j)]->page, pd[PI_OFF(j)]->next); + write(fd, buf, strlen(buf)); + } + if (!PI_OFF(++j)) { + if ((pi = pi->next) == NULL) + break; + pd = pi->base; + j += (1 + PD_IDX(pi->dirnum) - PI_IDX(j)) * pdi_mod; + } + } + + for (pf = free_list.next; pf; pf = pf->next) { + snprintf(buf, sizeof buf, "Free: @%p [%p...%p[ %ld ->%p <-%p\n", + pf, pf->page, (char *)pf->page + pf->size, + pf->size, pf->prev, pf->next); + write(fd, buf, strlen(buf)); + if (pf == pf->next) { + snprintf(buf, sizeof buf, "Free_list loops\n"); + write(fd, buf, strlen(buf)); + break; + } + } + + /* print out various info */ + snprintf(buf, sizeof buf, "Minsize\t%lu\n", malloc_minsize); + write(fd, buf, strlen(buf)); + snprintf(buf, sizeof buf, "Maxsize\t%lu\n", malloc_maxsize); + write(fd, buf, strlen(buf)); + snprintf(buf, sizeof buf, "Pagesize\t%lu\n", malloc_pagesize); + write(fd, buf, strlen(buf)); + snprintf(buf, sizeof buf, "Pageshift\t%u\n", malloc_pageshift); + write(fd, buf, strlen(buf)); + snprintf(buf, sizeof buf, "In use\t%lu\n", (u_long) malloc_used); + write(fd, buf, strlen(buf)); + snprintf(buf, sizeof buf, "Guarded\t%lu\n", (u_long) malloc_guarded); + write(fd, buf, strlen(buf)); +} +#endif /* MALLOC_STATS */ + +extern char *__progname; + +static void +wrterror(const char *p) +{ +#ifndef BUILDING_FOR_TOR + const char *q = " error: "; + struct iovec iov[5]; + + iov[0].iov_base = __progname; + iov[0].iov_len = strlen(__progname); + iov[1].iov_base = (char*)malloc_func; + iov[1].iov_len = strlen(malloc_func); + iov[2].iov_base = (char*)q; + iov[2].iov_len = strlen(q); + iov[3].iov_base = (char*)p; + iov[3].iov_len = strlen(p); + iov[4].iov_base = (char*)"\n"; + iov[4].iov_len = 1; + writev(STDERR_FILENO, iov, 5); +#else + (void)p; +#endif + suicide = 1; +#ifdef MALLOC_STATS + if (malloc_stats) + malloc_dump(STDERR_FILENO); +#endif /* MALLOC_STATS */ + malloc_active--; + if (malloc_abort) + abort(); +} + +static void +wrtwarning(const char *p) +{ +#ifndef BUILDING_FOR_TOR + const char *q = " warning: "; + struct iovec iov[5]; +#endif + + if (malloc_abort) + wrterror(p); + else if (malloc_silent) + return; + +#ifndef BUILDING_FOR_TOR + iov[0].iov_base = __progname; + iov[0].iov_len = strlen(__progname); + iov[1].iov_base = (char*)malloc_func; + iov[1].iov_len = strlen(malloc_func); + iov[2].iov_base = (char*)q; + iov[2].iov_len = strlen(q); + iov[3].iov_base = (char*)p; + iov[3].iov_len = strlen(p); + iov[4].iov_base = (char*)"\n"; + iov[4].iov_len = 1; + + (void) writev(STDERR_FILENO, iov, 5); +#else + (void)p; +#endif +} + +#ifdef MALLOC_STATS +static void +malloc_exit(void) +{ + char *q = "malloc() warning: Couldn't dump stats\n"; + int save_errno = errno, fd; + + fd = open("malloc.out", O_RDWR|O_APPEND); + if (fd != -1) { + malloc_dump(fd); + close(fd); + } else + write(STDERR_FILENO, q, strlen(q)); + errno = save_errno; +} +#endif /* MALLOC_STATS */ + +/* + * Allocate aligned mmaped chunk + */ + +static void *MMAP_A(size_t pages, size_t alignment) +{ + void *j, *p; + size_t first_size, rest, begin, end; + if (pages%malloc_pagesize != 0) + pages = pages - pages%malloc_pagesize + malloc_pagesize; + first_size = pages + alignment - malloc_pagesize; + p = MMAP(first_size); + rest = ((size_t)p) % alignment; + j = (rest == 0) ? p : (void*) ((size_t)p + alignment - rest); + begin = (size_t)j - (size_t)p; + if (begin != 0) munmap(p, begin); + end = (size_t)p + first_size - ((size_t)j + pages); + if(end != 0) munmap( (void*) ((size_t)j + pages), end); + + return j; +} + + +/* + * Allocate a number of pages from the OS + */ +static void * +map_pages(size_t pages) +{ + struct pdinfo *pi, *spi; + struct pginfo **pd; + u_long idx, pidx, lidx; + caddr_t result, tail; + u_long index, lindex; + void *pdregion = NULL; + size_t dirs, cnt; + + pages <<= malloc_pageshift; + if (!align) + result = MMAP(pages + malloc_guard); + else { + result = MMAP_A(pages + malloc_guard, g_alignment); + } + if (result == MAP_FAILED) { +#ifdef MALLOC_EXTRA_SANITY + wrtwarning("(ES): map_pages fails"); +#endif /* MALLOC_EXTRA_SANITY */ + errno = ENOMEM; + return (NULL); + } + index = ptr2index(result); + tail = result + pages + malloc_guard; + lindex = ptr2index(tail) - 1; + if (malloc_guard) + mprotect(result + pages, malloc_guard, PROT_NONE); + + pidx = PI_IDX(index); + lidx = PI_IDX(lindex); + + if (tail > malloc_brk) { + malloc_brk = tail; + last_index = lindex; + } + + dirs = lidx - pidx; + + /* Insert directory pages, if needed. */ + if (pdir_lookup(index, &pi) != 0) + dirs++; + + if (dirs > 0) { + pdregion = MMAP(malloc_pagesize * dirs); + if (pdregion == MAP_FAILED) { + munmap(result, tail - result); +#ifdef MALLOC_EXTRA_SANITY + wrtwarning("(ES): map_pages fails"); +#endif + errno = ENOMEM; + return (NULL); + } + } + + cnt = 0; + for (idx = pidx, spi = pi; idx <= lidx; idx++) { + if (pi == NULL || PD_IDX(pi->dirnum) != idx) { + pd = (struct pginfo **)((char *)pdregion + + cnt * malloc_pagesize); + cnt++; + memset(pd, 0, malloc_pagesize); + pi = (struct pdinfo *) ((caddr_t) pd + pdi_off); + pi->base = pd; + pi->prev = spi; + pi->next = spi->next; + pi->dirnum = idx * (malloc_pagesize / + sizeof(struct pginfo *)); + + if (spi->next != NULL) + spi->next->prev = pi; + spi->next = pi; + } + if (idx > pidx && idx < lidx) { + pi->dirnum += pdi_mod; + } else if (idx == pidx) { + if (pidx == lidx) { + pi->dirnum += (u_long)(tail - result) >> + malloc_pageshift; + } else { + pi->dirnum += pdi_mod - PI_OFF(index); + } + } else { + pi->dirnum += PI_OFF(ptr2index(tail - 1)) + 1; + } +#ifdef MALLOC_EXTRA_SANITY + if (PD_OFF(pi->dirnum) > pdi_mod || PD_IDX(pi->dirnum) > idx) { + wrterror("(ES): pages directory overflow"); + errno = EFAULT; + return (NULL); + } +#endif /* MALLOC_EXTRA_SANITY */ + if (idx == pidx && pi != last_dir) { + prev_dir = last_dir; + last_dir = pi; + } + spi = pi; + pi = spi->next; + } +#ifdef MALLOC_EXTRA_SANITY + if (cnt > dirs) + wrtwarning("(ES): cnt > dirs"); +#endif /* MALLOC_EXTRA_SANITY */ + if (cnt < dirs) + munmap((char *)pdregion + cnt * malloc_pagesize, + (dirs - cnt) * malloc_pagesize); + + return (result); +} + +/* + * Initialize the world + */ +static void +malloc_init(void) +{ + char *p, b[64]; + int i, j, save_errno = errno; + + _MALLOC_LOCK_INIT(); + +#ifdef MALLOC_EXTRA_SANITY + malloc_junk = 1; +#endif /* MALLOC_EXTRA_SANITY */ + + for (i = 0; i < 3; i++) { + switch (i) { + case 0: + j = (int) readlink("/etc/malloc.conf", b, sizeof b - 1); + if (j <= 0) + continue; + b[j] = '\0'; + p = b; + break; + case 1: + if (issetugid() == 0) + p = getenv("MALLOC_OPTIONS"); + else + continue; + break; + case 2: + p = malloc_options; + break; + default: + p = NULL; + } + + for (; p != NULL && *p != '\0'; p++) { + switch (*p) { + case '>': + malloc_cache <<= 1; + break; + case '<': + malloc_cache >>= 1; + break; + case 'a': + malloc_abort = 0; + break; + case 'A': + malloc_abort = 1; + break; +#ifdef MALLOC_STATS + case 'd': + malloc_stats = 0; + break; + case 'D': + malloc_stats = 1; + break; +#endif /* MALLOC_STATS */ + case 'f': + malloc_freeprot = 0; + break; + case 'F': + malloc_freeprot = 1; + break; + case 'g': + malloc_guard = 0; + break; + case 'G': + malloc_guard = malloc_pagesize; + break; + case 'h': + malloc_hint = 0; + break; + case 'H': + malloc_hint = 1; + break; + case 'j': + malloc_junk = 0; + break; + case 'J': + malloc_junk = 1; + break; + case 'n': + malloc_silent = 0; + break; + case 'N': + malloc_silent = 1; + break; + case 'p': + malloc_ptrguard = 0; + break; + case 'P': + malloc_ptrguard = 1; + break; + case 'r': + malloc_realloc = 0; + break; + case 'R': + malloc_realloc = 1; + break; +#ifdef __FreeBSD__ + case 'u': + malloc_utrace = 0; + break; + case 'U': + malloc_utrace = 1; + break; +#endif /* __FreeBSD__ */ + case 'x': + malloc_xmalloc = 0; + break; + case 'X': + malloc_xmalloc = 1; + break; + case 'z': + malloc_zero = 0; + break; + case 'Z': + malloc_zero = 1; + break; + default: + j = malloc_abort; + malloc_abort = 0; + wrtwarning("unknown char in MALLOC_OPTIONS"); + malloc_abort = j; + break; + } + } + } + + UTRACE(0, 0, 0); + + /* + * We want junk in the entire allocation, and zero only in the part + * the user asked for. + */ + if (malloc_zero) + malloc_junk = 1; + +#ifdef MALLOC_STATS + if (malloc_stats && (atexit(malloc_exit) == -1)) + wrtwarning("atexit(2) failed." + " Will not be able to dump malloc stats on exit"); +#endif /* MALLOC_STATS */ + + if (malloc_pagesize != getpagesize()) { + wrterror("malloc() replacement compiled with a different " + "page size from what we're running with. Failing."); + errno = ENOMEM; + return; + } + + /* Allocate one page for the page directory. */ + page_dir = (struct pginfo **)MMAP(malloc_pagesize); + + if (page_dir == MAP_FAILED) { + wrterror("mmap(2) failed, check limits"); + errno = ENOMEM; + return; + } + pdi_off = (malloc_pagesize - sizeof(struct pdinfo)) & ~(malloc_minsize - 1); + pdi_mod = pdi_off / sizeof(struct pginfo *); + + last_dir = (struct pdinfo *) ((caddr_t) page_dir + pdi_off); + last_dir->base = page_dir; + last_dir->prev = last_dir->next = NULL; + last_dir->dirnum = malloc_pageshift; + + /* Been here, done that. */ + malloc_started++; + + /* Recalculate the cache size in bytes, and make sure it's nonzero. */ + if (!malloc_cache) + malloc_cache++; + malloc_cache <<= malloc_pageshift; + errno = save_errno; +} + +/* + * Allocate a number of complete pages + */ +static void * +malloc_pages(size_t size) +{ + void *p, *delay_free = NULL, *tp; + size_t i; + struct pginfo **pd; + struct pdinfo *pi; + u_long pidx, index; + struct pgfree *pf; + + size = pageround(size) + malloc_guard; + + p = NULL; + /* Look for free pages before asking for more */ + if (!align) + for (pf = free_list.next; pf; pf = pf->next) { + +#ifdef MALLOC_EXTRA_SANITY + if (pf->size & malloc_pagemask) { + wrterror("(ES): junk length entry on free_list"); + errno = EFAULT; + return (NULL); + } + if (!pf->size) { + wrterror("(ES): zero length entry on free_list"); + errno = EFAULT; + return (NULL); + } + if (pf->page > (pf->page + pf->size)) { + wrterror("(ES): sick entry on free_list"); + errno = EFAULT; + return (NULL); + } + if ((pi = pf->pdir) == NULL) { + wrterror("(ES): invalid page directory on free-list"); + errno = EFAULT; + return (NULL); + } + if ((pidx = PI_IDX(ptr2index(pf->page))) != PD_IDX(pi->dirnum)) { + wrterror("(ES): directory index mismatch on free-list"); + errno = EFAULT; + return (NULL); + } + pd = pi->base; + if (pd[PI_OFF(ptr2index(pf->page))] != MALLOC_FREE) { + wrterror("(ES): non-free first page on free-list"); + errno = EFAULT; + return (NULL); + } + pidx = PI_IDX(ptr2index((pf->page) + (pf->size)) - 1); + for (pi = pf->pdir; pi != NULL && PD_IDX(pi->dirnum) < pidx; + pi = pi->next) + ; + if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { + wrterror("(ES): last page not referenced in page directory"); + errno = EFAULT; + return (NULL); + } + pd = pi->base; + if (pd[PI_OFF(ptr2index((pf->page) + (pf->size)) - 1)] != MALLOC_FREE) { + wrterror("(ES): non-free last page on free-list"); + errno = EFAULT; + return (NULL); + } +#endif /* MALLOC_EXTRA_SANITY */ + + if (pf->size < size) + continue; + + if (pf->size == size) { + p = pf->page; + pi = pf->pdir; + if (pf->next != NULL) + pf->next->prev = pf->prev; + pf->prev->next = pf->next; + delay_free = pf; + break; + } + p = pf->page; + pf->page = (char *) pf->page + size; + pf->size -= size; + pidx = PI_IDX(ptr2index(pf->page)); + for (pi = pf->pdir; pi != NULL && PD_IDX(pi->dirnum) < pidx; + pi = pi->next) + ; + if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { + wrterror("(ES): hole in directories"); + errno = EFAULT; + return (NULL); + } + tp = pf->pdir; + pf->pdir = pi; + pi = tp; + break; + } + + size -= malloc_guard; + +#ifdef MALLOC_EXTRA_SANITY + if (p != NULL && pi != NULL) { + pidx = PD_IDX(pi->dirnum); + pd = pi->base; + } + if (p != NULL && pd[PI_OFF(ptr2index(p))] != MALLOC_FREE) { + wrterror("(ES): allocated non-free page on free-list"); + errno = EFAULT; + return (NULL); + } +#endif /* MALLOC_EXTRA_SANITY */ + + if (p != NULL && (malloc_guard || malloc_freeprot)) + mprotect(p, size, PROT_READ | PROT_WRITE); + + size >>= malloc_pageshift; + + /* Map new pages */ + if (p == NULL) + p = map_pages(size); + + if (p != NULL) { + index = ptr2index(p); + pidx = PI_IDX(index); + pdir_lookup(index, &pi); +#ifdef MALLOC_EXTRA_SANITY + if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { + wrterror("(ES): mapped pages not found in directory"); + errno = EFAULT; + return (NULL); + } +#endif /* MALLOC_EXTRA_SANITY */ + if (pi != last_dir) { + prev_dir = last_dir; + last_dir = pi; + } + pd = pi->base; + pd[PI_OFF(index)] = MALLOC_FIRST; + + for (i = 1; i < size; i++) { + if (!PI_OFF(index + i)) { + pidx++; + pi = pi->next; +#ifdef MALLOC_EXTRA_SANITY + if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { + wrterror("(ES): hole in mapped pages directory"); + errno = EFAULT; + return (NULL); + } +#endif /* MALLOC_EXTRA_SANITY */ + pd = pi->base; + } + pd[PI_OFF(index + i)] = MALLOC_FOLLOW; + } + if (malloc_guard) { + if (!PI_OFF(index + i)) { + pidx++; + pi = pi->next; +#ifdef MALLOC_EXTRA_SANITY + if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { + wrterror("(ES): hole in mapped pages directory"); + errno = EFAULT; + return (NULL); + } +#endif /* MALLOC_EXTRA_SANITY */ + pd = pi->base; + } + pd[PI_OFF(index + i)] = MALLOC_FIRST; + } + + malloc_used += size << malloc_pageshift; + malloc_guarded += malloc_guard; + + if (malloc_junk) + memset(p, SOME_JUNK, size << malloc_pageshift); + } + if (delay_free) { + if (px == NULL) + px = delay_free; + else + ifree(delay_free); + } + return (p); +} + +/* + * Allocate a page of fragments + */ + +static __inline__ int +malloc_make_chunks(int bits) +{ + struct pginfo *bp, **pd; + struct pdinfo *pi; +#ifdef MALLOC_EXTRA_SANITY + u_long pidx; +#endif /* MALLOC_EXTRA_SANITY */ + void *pp; + long i, k; + size_t l; + + /* Allocate a new bucket */ + pp = malloc_pages((size_t) malloc_pagesize); + if (pp == NULL) + return (0); + + /* Find length of admin structure */ + l = sizeof *bp - sizeof(u_long); + l += sizeof(u_long) * + (((malloc_pagesize >> bits) + MALLOC_BITS - 1) / MALLOC_BITS); + + /* Don't waste more than two chunks on this */ + + /* + * If we are to allocate a memory protected page for the malloc(0) + * case (when bits=0), it must be from a different page than the + * pginfo page. + * --> Treat it like the big chunk alloc, get a second data page. + */ + if (bits != 0 && (1UL << (bits)) <= l + l) { + bp = (struct pginfo *) pp; + } else { + bp = (struct pginfo *) imalloc(l); + if (bp == NULL) { + ifree(pp); + return (0); + } + } + + /* memory protect the page allocated in the malloc(0) case */ + if (bits == 0) { + bp->size = 0; + bp->shift = 1; + i = malloc_minsize - 1; + while (i >>= 1) + bp->shift++; + bp->total = bp->free = malloc_pagesize >> bp->shift; + bp->page = pp; + + k = mprotect(pp, malloc_pagesize, PROT_NONE); + if (k < 0) { + ifree(pp); + ifree(bp); + return (0); + } + } else { + bp->size = (1UL << bits); + bp->shift = bits; + bp->total = bp->free = malloc_pagesize >> bits; + bp->page = pp; + } + + /* set all valid bits in the bitmap */ + k = bp->total; + i = 0; + + /* Do a bunch at a time */ + for (; (k - i) >= MALLOC_BITS; i += MALLOC_BITS) + bp->bits[i / MALLOC_BITS] = ~0UL; + + for (; i < k; i++) + bp->bits[i / MALLOC_BITS] |= 1UL << (i % MALLOC_BITS); + + k = (long)l; + if (bp == bp->page) { + /* Mark the ones we stole for ourselves */ + for (i = 0; k > 0; i++) { + bp->bits[i / MALLOC_BITS] &= ~(1UL << (i % MALLOC_BITS)); + bp->free--; + bp->total--; + k -= (1 << bits); + } + } + /* MALLOC_LOCK */ + + pdir_lookup(ptr2index(pp), &pi); +#ifdef MALLOC_EXTRA_SANITY + pidx = PI_IDX(ptr2index(pp)); + if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { + wrterror("(ES): mapped pages not found in directory"); + errno = EFAULT; + return (0); + } +#endif /* MALLOC_EXTRA_SANITY */ + if (pi != last_dir) { + prev_dir = last_dir; + last_dir = pi; + } + pd = pi->base; + pd[PI_OFF(ptr2index(pp))] = bp; + + bp->next = page_dir[bits]; + page_dir[bits] = bp; + + /* MALLOC_UNLOCK */ + return (1); +} + +/* + * Allocate a fragment + */ +static void * +malloc_bytes(size_t size) +{ + int i, j; + size_t k; + u_long u, *lp; + struct pginfo *bp; + + /* Don't bother with anything less than this */ + /* unless we have a malloc(0) requests */ + if (size != 0 && size < malloc_minsize) + size = malloc_minsize; + + /* Find the right bucket */ + if (size == 0) + j = 0; + else { + size_t ii; + j = 1; + ii = size - 1; + while (ii >>= 1) + j++; + } + + /* If it's empty, make a page more of that size chunks */ + if (page_dir[j] == NULL && !malloc_make_chunks(j)) + return (NULL); + + bp = page_dir[j]; + + /* Find first word of bitmap which isn't empty */ + for (lp = bp->bits; !*lp; lp++); + + /* Find that bit, and tweak it */ + u = 1; + k = 0; + while (!(*lp & u)) { + u += u; + k++; + } + + if (malloc_guard) { + /* Walk to a random position. */ +// i = arc4random() % bp->free; + i = rand() % bp->free; + while (i > 0) { + u += u; + k++; + if (k >= MALLOC_BITS) { + lp++; + u = 1; + k = 0; + } +#ifdef MALLOC_EXTRA_SANITY + if (lp - bp->bits > (bp->total - 1) / MALLOC_BITS) { + wrterror("chunk overflow"); + errno = EFAULT; + return (NULL); + } +#endif /* MALLOC_EXTRA_SANITY */ + if (*lp & u) + i--; + } + } + *lp ^= u; + + /* If there are no more free, remove from free-list */ + if (!--bp->free) { + page_dir[j] = bp->next; + bp->next = NULL; + } + /* Adjust to the real offset of that chunk */ + k += (lp - bp->bits) * MALLOC_BITS; + k <<= bp->shift; + + if (malloc_junk && bp->size != 0) + memset((char *)bp->page + k, SOME_JUNK, (size_t)bp->size); + + return ((u_char *) bp->page + k); +} + +/* + * Magic so that malloc(sizeof(ptr)) is near the end of the page. + */ +#define PTR_GAP (malloc_pagesize - sizeof(void *)) +#define PTR_SIZE (sizeof(void *)) +#define PTR_ALIGNED(p) (((unsigned long)p & malloc_pagemask) == PTR_GAP) + +/* + * Allocate a piece of memory + */ +static void * +imalloc(size_t size) +{ + void *result; + int ptralloc = 0; + + if (!malloc_started) + malloc_init(); + + if (suicide) + abort(); + + /* does not matter if malloc_bytes fails */ + if (px == NULL) + px = malloc_bytes(sizeof *px); + + if (malloc_ptrguard && size == PTR_SIZE) { + ptralloc = 1; + size = malloc_pagesize; + } + if (size > SIZE_MAX - malloc_pagesize) { /* Check for overflow */ + result = NULL; + errno = ENOMEM; + } else if (size <= malloc_maxsize) + result = malloc_bytes(size); + else + result = malloc_pages(size); + + if (malloc_abort == 1 && result == NULL) + wrterror("allocation failed"); + + if (malloc_zero && result != NULL) + memset(result, 0, size); + + if (result && ptralloc) + return ((char *) result + PTR_GAP); + return (result); +} + +/* + * Change the size of an allocation. + */ +static void * +irealloc(void *ptr, size_t size) +{ + void *p; + size_t osize; + u_long index, i; + struct pginfo **mp; + struct pginfo **pd; + struct pdinfo *pi; +#ifdef MALLOC_EXTRA_SANITY + u_long pidx; +#endif /* MALLOC_EXTRA_SANITY */ + + if (suicide) + abort(); + + if (!malloc_started) { + wrtwarning("malloc() has never been called"); + return (NULL); + } + if (malloc_ptrguard && PTR_ALIGNED(ptr)) { + if (size <= PTR_SIZE) + return (ptr); + + p = imalloc(size); + if (p) + memcpy(p, ptr, PTR_SIZE); + ifree(ptr); + return (p); + } + index = ptr2index(ptr); + + if (index < malloc_pageshift) { + wrtwarning("junk pointer, too low to make sense"); + return (NULL); + } + if (index > last_index) { + wrtwarning("junk pointer, too high to make sense"); + return (NULL); + } + pdir_lookup(index, &pi); +#ifdef MALLOC_EXTRA_SANITY + pidx = PI_IDX(index); + if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { + wrterror("(ES): mapped pages not found in directory"); + errno = EFAULT; + return (NULL); + } +#endif /* MALLOC_EXTRA_SANITY */ + if (pi != last_dir) { + prev_dir = last_dir; + last_dir = pi; + } + pd = pi->base; + mp = &pd[PI_OFF(index)]; + + if (*mp == MALLOC_FIRST) { /* Page allocation */ + + /* Check the pointer */ + if ((u_long) ptr & malloc_pagemask) { + wrtwarning("modified (page-) pointer"); + return (NULL); + } + /* Find the size in bytes */ + i = index; + if (!PI_OFF(++i)) { + pi = pi->next; + if (pi != NULL && PD_IDX(pi->dirnum) != PI_IDX(i)) + pi = NULL; + if (pi != NULL) + pd = pi->base; + } + for (osize = malloc_pagesize; + pi != NULL && pd[PI_OFF(i)] == MALLOC_FOLLOW;) { + osize += malloc_pagesize; + if (!PI_OFF(++i)) { + pi = pi->next; + if (pi != NULL && PD_IDX(pi->dirnum) != PI_IDX(i)) + pi = NULL; + if (pi != NULL) + pd = pi->base; + } + } + + if (!malloc_realloc && size <= osize && + size > osize - malloc_pagesize) { + if (malloc_junk) + memset((char *)ptr + size, SOME_JUNK, osize - size); + return (ptr); /* ..don't do anything else. */ + } + } else if (*mp >= MALLOC_MAGIC) { /* Chunk allocation */ + + /* Check the pointer for sane values */ + if ((u_long) ptr & ((1UL << ((*mp)->shift)) - 1)) { + wrtwarning("modified (chunk-) pointer"); + return (NULL); + } + /* Find the chunk index in the page */ + i = ((u_long) ptr & malloc_pagemask) >> (*mp)->shift; + + /* Verify that it isn't a free chunk already */ + if ((*mp)->bits[i / MALLOC_BITS] & (1UL << (i % MALLOC_BITS))) { + wrtwarning("chunk is already free"); + return (NULL); + } + osize = (*mp)->size; + + if (!malloc_realloc && size <= osize && + (size > osize / 2 || osize == malloc_minsize)) { + if (malloc_junk) + memset((char *) ptr + size, SOME_JUNK, osize - size); + return (ptr); /* ..don't do anything else. */ + } + } else { + wrtwarning("irealloc: pointer to wrong page"); + return (NULL); + } + + p = imalloc(size); + + if (p != NULL) { + /* copy the lesser of the two sizes, and free the old one */ + /* Don't move from/to 0 sized region !!! */ + if (osize != 0 && size != 0) { + if (osize < size) + memcpy(p, ptr, osize); + else + memcpy(p, ptr, size); + } + ifree(ptr); + } + return (p); +} + +/* + * Free a sequence of pages + */ +static __inline__ void +free_pages(void *ptr, u_long index, struct pginfo * info) +{ + u_long i, pidx, lidx; + size_t l, cachesize = 0; + struct pginfo **pd; + struct pdinfo *pi, *spi; + struct pgfree *pf, *pt = NULL; + caddr_t tail; + + if (info == MALLOC_FREE) { + wrtwarning("page is already free"); + return; + } + if (info != MALLOC_FIRST) { + wrtwarning("free_pages: pointer to wrong page"); + return; + } + if ((u_long) ptr & malloc_pagemask) { + wrtwarning("modified (page-) pointer"); + return; + } + /* Count how many pages and mark them free at the same time */ + pidx = PI_IDX(index); + pdir_lookup(index, &pi); +#ifdef MALLOC_EXTRA_SANITY + if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { + wrterror("(ES): mapped pages not found in directory"); + errno = EFAULT; + return; + } +#endif /* MALLOC_EXTRA_SANITY */ + + spi = pi; /* Save page index for start of region. */ + + pd = pi->base; + pd[PI_OFF(index)] = MALLOC_FREE; + i = 1; + if (!PI_OFF(index + i)) { + pi = pi->next; + if (pi == NULL || PD_IDX(pi->dirnum) != PI_IDX(index + i)) + pi = NULL; + else + pd = pi->base; + } + while (pi != NULL && pd[PI_OFF(index + i)] == MALLOC_FOLLOW) { + pd[PI_OFF(index + i)] = MALLOC_FREE; + i++; + if (!PI_OFF(index + i)) { + if ((pi = pi->next) == NULL || + PD_IDX(pi->dirnum) != PI_IDX(index + i)) + pi = NULL; + else + pd = pi->base; + } + } + + l = i << malloc_pageshift; + + if (malloc_junk) + memset(ptr, SOME_JUNK, l); + + malloc_used -= l; + malloc_guarded -= malloc_guard; + if (malloc_guard) { +#ifdef MALLOC_EXTRA_SANITY + if (pi == NULL || PD_IDX(pi->dirnum) != PI_IDX(index + i)) { + wrterror("(ES): hole in mapped pages directory"); + errno = EFAULT; + return; + } +#endif /* MALLOC_EXTRA_SANITY */ + pd[PI_OFF(index + i)] = MALLOC_FREE; + l += malloc_guard; + } + tail = (caddr_t)ptr + l; + + if (malloc_hint) + madvise(ptr, l, MADV_FREE); + + if (malloc_freeprot) + mprotect(ptr, l, PROT_NONE); + + /* Add to free-list. */ + if (px == NULL && (px = malloc_bytes(sizeof *px)) == NULL) + goto not_return; + px->page = ptr; + px->pdir = spi; + px->size = l; + + if (free_list.next == NULL) { + /* Nothing on free list, put this at head. */ + px->next = NULL; + px->prev = &free_list; + free_list.next = px; + pf = px; + px = NULL; + } else { + /* + * Find the right spot, leave pf pointing to the modified + * entry. + */ + + /* Race ahead here, while calculating cache size. */ + for (pf = free_list.next; + (caddr_t)ptr > ((caddr_t)pf->page + pf->size) + && pf->next != NULL; + pf = pf->next) + cachesize += pf->size; + + /* Finish cache size calculation. */ + pt = pf; + while (pt) { + cachesize += pt->size; + pt = pt->next; + } + + if ((caddr_t)pf->page > tail) { + /* Insert before entry */ + px->next = pf; + px->prev = pf->prev; + pf->prev = px; + px->prev->next = px; + pf = px; + px = NULL; + } else if (((caddr_t)pf->page + pf->size) == ptr) { + /* Append to the previous entry. */ + cachesize -= pf->size; + pf->size += l; + if (pf->next != NULL && + pf->next->page == ((caddr_t)pf->page + pf->size)) { + /* And collapse the next too. */ + pt = pf->next; + pf->size += pt->size; + pf->next = pt->next; + if (pf->next != NULL) + pf->next->prev = pf; + } + } else if (pf->page == tail) { + /* Prepend to entry. */ + cachesize -= pf->size; + pf->size += l; + pf->page = ptr; + pf->pdir = spi; + } else if (pf->next == NULL) { + /* Append at tail of chain. */ + px->next = NULL; + px->prev = pf; + pf->next = px; + pf = px; + px = NULL; + } else { + wrterror("freelist is destroyed"); + errno = EFAULT; + return; + } + } + + if (pf->pdir != last_dir) { + prev_dir = last_dir; + last_dir = pf->pdir; + } + + /* Return something to OS ? */ + if (pf->size > (malloc_cache - cachesize)) { + + /* + * Keep the cache intact. Notice that the '>' above guarantees that + * the pf will always have at least one page afterwards. + */ + if (munmap((char *) pf->page + (malloc_cache - cachesize), + pf->size - (malloc_cache - cachesize)) != 0) + goto not_return; + tail = (caddr_t)pf->page + pf->size; + lidx = ptr2index(tail) - 1; + pf->size = malloc_cache - cachesize; + + index = ptr2index((caddr_t)pf->page + pf->size); + + pidx = PI_IDX(index); + if (prev_dir != NULL && PD_IDX(prev_dir->dirnum) >= pidx) + prev_dir = NULL; /* Will be wiped out below ! */ + + for (pi = pf->pdir; pi != NULL && PD_IDX(pi->dirnum) < pidx; + pi = pi->next) + ; + + spi = pi; + if (pi != NULL && PD_IDX(pi->dirnum) == pidx) { + pd = pi->base; + + for (i = index; i <= lidx;) { + if (pd[PI_OFF(i)] != MALLOC_NOT_MINE) { + pd[PI_OFF(i)] = MALLOC_NOT_MINE; +#ifdef MALLOC_EXTRA_SANITY + if (!PD_OFF(pi->dirnum)) { + wrterror("(ES): pages directory underflow"); + errno = EFAULT; + return; + } +#endif /* MALLOC_EXTRA_SANITY */ + pi->dirnum--; + } +#ifdef MALLOC_EXTRA_SANITY + else + wrtwarning("(ES): page already unmapped"); +#endif /* MALLOC_EXTRA_SANITY */ + i++; + if (!PI_OFF(i)) { + /* + * If no page in that dir, free + * directory page. + */ + if (!PD_OFF(pi->dirnum)) { + /* Remove from list. */ + if (spi == pi) + spi = pi->prev; + if (pi->prev != NULL) + pi->prev->next = pi->next; + if (pi->next != NULL) + pi->next->prev = pi->prev; + pi = pi->next; + munmap(pd, malloc_pagesize); + } else + pi = pi->next; + if (pi == NULL || + PD_IDX(pi->dirnum) != PI_IDX(i)) + break; + pd = pi->base; + } + } + if (pi && !PD_OFF(pi->dirnum)) { + /* Resulting page dir is now empty. */ + /* Remove from list. */ + if (spi == pi) /* Update spi only if first. */ + spi = pi->prev; + if (pi->prev != NULL) + pi->prev->next = pi->next; + if (pi->next != NULL) + pi->next->prev = pi->prev; + pi = pi->next; + munmap(pd, malloc_pagesize); + } + } + if (pi == NULL && malloc_brk == tail) { + /* Resize down the malloc upper boundary. */ + last_index = index - 1; + malloc_brk = index2ptr(index); + } + + /* XXX: We could realloc/shrink the pagedir here I guess. */ + if (pf->size == 0) { /* Remove from free-list as well. */ + if (px) + ifree(px); + if ((px = pf->prev) != &free_list) { + if (pi == NULL && last_index == (index - 1)) { + if (spi == NULL) { + malloc_brk = NULL; + i = 11; + } else { + pd = spi->base; + if (PD_IDX(spi->dirnum) < pidx) + index = + ((PD_IDX(spi->dirnum) + 1) * + pdi_mod) - 1; + for (pi = spi, i = index; + pd[PI_OFF(i)] == MALLOC_NOT_MINE; + i--) +#ifdef MALLOC_EXTRA_SANITY + if (!PI_OFF(i)) { + pi = pi->prev; + if (pi == NULL || i == 0) + break; + pd = pi->base; + i = (PD_IDX(pi->dirnum) + 1) * pdi_mod; + } +#else /* !MALLOC_EXTRA_SANITY */ + { + } +#endif /* MALLOC_EXTRA_SANITY */ + malloc_brk = index2ptr(i + 1); + } + last_index = i; + } + if ((px->next = pf->next) != NULL) + px->next->prev = px; + } else { + if ((free_list.next = pf->next) != NULL) + free_list.next->prev = &free_list; + } + px = pf; + last_dir = prev_dir; + prev_dir = NULL; + } + } +not_return: + if (pt != NULL) + ifree(pt); +} + +/* + * Free a chunk, and possibly the page it's on, if the page becomes empty. + */ + +/* ARGSUSED */ +static __inline__ void +free_bytes(void *ptr, u_long index, struct pginfo * info) +{ + struct pginfo **mp, **pd; + struct pdinfo *pi; +#ifdef MALLOC_EXTRA_SANITY + u_long pidx; +#endif /* MALLOC_EXTRA_SANITY */ + void *vp; + long i; + (void) index; + + /* Find the chunk number on the page */ + i = ((u_long) ptr & malloc_pagemask) >> info->shift; + + if ((u_long) ptr & ((1UL << (info->shift)) - 1)) { + wrtwarning("modified (chunk-) pointer"); + return; + } + if (info->bits[i / MALLOC_BITS] & (1UL << (i % MALLOC_BITS))) { + wrtwarning("chunk is already free"); + return; + } + if (malloc_junk && info->size != 0) + memset(ptr, SOME_JUNK, (size_t)info->size); + + info->bits[i / MALLOC_BITS] |= 1UL << (i % MALLOC_BITS); + info->free++; + + if (info->size != 0) + mp = page_dir + info->shift; + else + mp = page_dir; + + if (info->free == 1) { + /* Page became non-full */ + + /* Insert in address order */ + while (*mp != NULL && (*mp)->next != NULL && + (*mp)->next->page < info->page) + mp = &(*mp)->next; + info->next = *mp; + *mp = info; + return; + } + if (info->free != info->total) + return; + + /* Find & remove this page in the queue */ + while (*mp != info) { + mp = &((*mp)->next); +#ifdef MALLOC_EXTRA_SANITY + if (!*mp) { + wrterror("(ES): Not on queue"); + errno = EFAULT; + return; + } +#endif /* MALLOC_EXTRA_SANITY */ + } + *mp = info->next; + + /* Free the page & the info structure if need be */ + pdir_lookup(ptr2index(info->page), &pi); +#ifdef MALLOC_EXTRA_SANITY + pidx = PI_IDX(ptr2index(info->page)); + if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { + wrterror("(ES): mapped pages not found in directory"); + errno = EFAULT; + return; + } +#endif /* MALLOC_EXTRA_SANITY */ + if (pi != last_dir) { + prev_dir = last_dir; + last_dir = pi; + } + pd = pi->base; + pd[PI_OFF(ptr2index(info->page))] = MALLOC_FIRST; + + /* If the page was mprotected, unprotect it before releasing it */ + if (info->size == 0) + mprotect(info->page, malloc_pagesize, PROT_READ | PROT_WRITE); + + vp = info->page; /* Order is important ! */ + if (vp != (void *) info) + ifree(info); + ifree(vp); +} + +static void +ifree(void *ptr) +{ + struct pginfo *info, **pd; + u_long index; +#ifdef MALLOC_EXTRA_SANITY + u_long pidx; +#endif /* MALLOC_EXTRA_SANITY */ + struct pdinfo *pi; + + if (!malloc_started) { + wrtwarning("malloc() has never been called"); + return; + } + /* If we're already sinking, don't make matters any worse. */ + if (suicide) + return; + + if (malloc_ptrguard && PTR_ALIGNED(ptr)) + ptr = (char *) ptr - PTR_GAP; + + index = ptr2index(ptr); + + if (index < malloc_pageshift) { + warnx("(%p)", ptr); + wrtwarning("ifree: junk pointer, too low to make sense"); + return; + } + if (index > last_index) { + warnx("(%p)", ptr); + wrtwarning("ifree: junk pointer, too high to make sense"); + return; + } + pdir_lookup(index, &pi); +#ifdef MALLOC_EXTRA_SANITY + pidx = PI_IDX(index); + if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { + wrterror("(ES): mapped pages not found in directory"); + errno = EFAULT; + return; + } +#endif /* MALLOC_EXTRA_SANITY */ + if (pi != last_dir) { + prev_dir = last_dir; + last_dir = pi; + } + pd = pi->base; + info = pd[PI_OFF(index)]; + + if (info < MALLOC_MAGIC) + free_pages(ptr, index, info); + else + free_bytes(ptr, index, info); + + /* does not matter if malloc_bytes fails */ + if (px == NULL) + px = malloc_bytes(sizeof *px); + + return; +} + +/* + * Common function for handling recursion. Only + * print the error message once, to avoid making the problem + * potentially worse. + */ +static void +malloc_recurse(void) +{ + static int noprint; + + if (noprint == 0) { + noprint = 1; + wrtwarning("recursive call"); + } + malloc_active--; + _MALLOC_UNLOCK(); + errno = EDEADLK; +} + +/* + * These are the public exported interface routines. + */ +void * +malloc(size_t size) +{ + void *r; + + if (!align) + _MALLOC_LOCK(); + malloc_func = " in malloc():"; + if (malloc_active++) { + malloc_recurse(); + return (NULL); + } + r = imalloc(size); + UTRACE(0, size, r); + malloc_active--; + if (!align) + _MALLOC_UNLOCK(); + if (malloc_xmalloc && r == NULL) { + wrterror("out of memory"); + errno = ENOMEM; + } + return (r); +} + +void +free(void *ptr) +{ + /* This is legal. XXX quick path */ + if (ptr == NULL) + return; + + _MALLOC_LOCK(); + malloc_func = " in free():"; + if (malloc_active++) { + malloc_recurse(); + return; + } + ifree(ptr); + UTRACE(ptr, 0, 0); + malloc_active--; + _MALLOC_UNLOCK(); + return; +} + +void * +realloc(void *ptr, size_t size) +{ + void *r; + + _MALLOC_LOCK(); + malloc_func = " in realloc():"; + if (malloc_active++) { + malloc_recurse(); + return (NULL); + } + + if (ptr == NULL) + r = imalloc(size); + else + r = irealloc(ptr, size); + + UTRACE(ptr, size, r); + malloc_active--; + _MALLOC_UNLOCK(); + if (malloc_xmalloc && r == NULL) { + wrterror("out of memory"); + errno = ENOMEM; + } + return (r); +} + +void * +calloc(size_t num, size_t size) +{ + void *p; + + if (num && SIZE_MAX / num < size) { + fprintf(stderr,"OOOOPS"); + errno = ENOMEM; + return NULL; + } + size *= num; + p = malloc(size); + if (p) + memset(p, 0, size); + return(p); +} + +#ifndef BUILDING_FOR_TOR +static int ispowerof2 (size_t a) { + size_t b; + for (b = 1ULL << (sizeof(size_t)*NBBY - 1); b > 1; b >>= 1) + if (b == a) + return 1; + return 0; +} +#endif + +#ifndef BUILDING_FOR_TOR +int posix_memalign(void **memptr, size_t alignment, size_t size) +{ + void *r; + size_t max; + if ((alignment < PTR_SIZE) || (alignment%PTR_SIZE != 0)) return EINVAL; + if (!ispowerof2(alignment)) return EINVAL; + if (alignment < malloc_minsize) alignment = malloc_minsize; + max = alignment > size ? alignment : size; + if (alignment <= malloc_pagesize) + r = malloc(max); + else { + _MALLOC_LOCK(); + align = 1; + g_alignment = alignment; + r = malloc(size); + align=0; + _MALLOC_UNLOCK(); + } + *memptr = r; + if (!r) return ENOMEM; + return 0; +} + +void *memalign(size_t boundary, size_t size) +{ + void *r; + posix_memalign(&r, boundary, size); + return r; +} + +void *valloc(size_t size) +{ + void *r; + posix_memalign(&r, malloc_pagesize, size); + return r; +} +#endif + +size_t malloc_good_size(size_t size) +{ + if (size == 0) { + return 1; + } else if (size <= malloc_maxsize) { + int j; + size_t ii; + /* round up to the nearest power of 2, with same approach + * as malloc_bytes() uses. */ + j = 1; + ii = size - 1; + while (ii >>= 1) + j++; + return ((size_t)1) << j; + } else { + return pageround(size); + } +} diff --git a/src/wraith/src/ext/README b/src/wraith/src/ext/README new file mode 100644 index 000000000..d7e5439c7 --- /dev/null +++ b/src/wraith/src/ext/README @@ -0,0 +1,79 @@ + +OpenBSD_malloc_Linux.c: + + The OpenBSD malloc implementation, ported to Linux. Used only when + --enable-openbsd-malloc is passed to the configure script. + +strlcat.c +strlcpy.c + + Implementations of strlcat and strlcpy, the more sane replacements + for strcat and strcpy. These are nonstandard, and some libc + implementations refuse to add them for religious reasons. + +ht.h + + An implementation of a hash table in the style of Niels Provos's + tree.h. Shared with Libevent. + +tinytest.[ch] +tinytest_demos.c +tinytest_macros.h + + A unit testing framework. https://github.com/nmathewson/tinytest + +tor_queue.h + + A copy of sys/queue.h from OpenBSD. We keep our own copy rather + than using sys/queue.h, since some platforms don't have a + sys/queue.h, and the ones that do have diverged in incompatible + ways. (CIRCLEQ or no CIRCLEQ? SIMPLQ or STAILQ?) We also rename + the identifiers with a TOR_ prefix to avoid conflicts with + the system headers. + +curve25519_donna/*.c + + A copy of Adam Langley's curve25519-donna mostly-portable + implementations of curve25519. + +csiphash.c +siphash.h + + Marek Majkowski's implementation of siphash 2-4, a secure keyed + hash algorithm to avoid collision-based DoS attacks against hash + tables. + +trunnel/*.[ch] + + Headers and runtime code for Trunnel, a system for generating + code to encode and decode binary formats. + +ed25519/ref10/* + + Daniel Bernsten's portable ref10 implementation of ed25519. + Public domain. + +ed25519/donna/* + + Andrew Moon's semi-portable ed25519-donna implementation of + ed25519. Public domain. + +keccak-tiny/ + + David Leon Gil's portable Keccak implementation. CC0. + +readpassphrase.[ch] + + Portable readpassphrase implementation from OpenSSH portable, version + 6.8p1. + +timeouts/ + + William Ahern's hierarchical timer-wheel implementation. MIT license. + +mulodi/ + + Contains an overflow-checking 64-bit signed integer multiply + from LLVM's compiler_rt. For some reason, this is missing from + 32-bit libclang in many places. Dual licensed MIT-license and + BSD-like license; see mulodi/LICENSE.TXT. diff --git a/src/wraith/src/ext/byteorder.h b/src/wraith/src/ext/byteorder.h new file mode 100644 index 000000000..c8ba52184 --- /dev/null +++ b/src/wraith/src/ext/byteorder.h @@ -0,0 +1,67 @@ +/* + Copyright (c) 2013-2014 Marek Majkowski + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + + Original location: + https://github.com/majek/csiphash/ + + Solution inspired by code from: + Samuel Neves (supercop/crypto_auth/siphash24/little) + djb (supercop/crypto_auth/siphash24/little2) + Jean-Philippe Aumasson (https://131002.net/siphash/siphash24.c) +*/ + +/* This code is extracted from csiphash.h */ + +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define _le64toh(x) ((uint64_t)(x)) +#elif defined(_WIN32) +/* Windows is always little endian, unless you're on xbox360 + http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx */ +# define _le64toh(x) ((uint64_t)(x)) +#elif defined(__APPLE__) +# include +# define _le64toh(x) OSSwapLittleToHostInt64(x) +#elif defined(sun) || defined(__sun) +# include +# define _le64toh(x) LE_64(x) + +#else + +/* See: http://sourceforge.net/p/predef/wiki/Endianness/ */ +# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) +# include +# else +# include +# endif +# if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ + __BYTE_ORDER == __LITTLE_ENDIAN +# define _le64toh(x) ((uint64_t)(x)) +# else +# if defined(OpenBSD) +# define _le64toh(x) letoh64(x) +# else +# define _le64toh(x) le64toh(x) +# endif +# endif + +#endif diff --git a/src/wraith/src/ext/csiphash.c b/src/wraith/src/ext/csiphash.c new file mode 100644 index 000000000..508e4f6ce --- /dev/null +++ b/src/wraith/src/ext/csiphash.c @@ -0,0 +1,125 @@ +/* + Copyright (c) 2013-2014 Marek Majkowski + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + + Original location: + https://github.com/majek/csiphash/ + + Solution inspired by code from: + Samuel Neves (supercop/crypto_auth/siphash24/little) + djb (supercop/crypto_auth/siphash24/little2) + Jean-Philippe Aumasson (https://131002.net/siphash/siphash24.c) +*/ + +#include "torint.h" +#include "siphash.h" +/* for tor_assert */ +#include "util.h" +/* for memcpy */ +#include +#include "byteorder.h" + +#define ROTATE(x, b) (uint64_t)( ((x) << (b)) | ( (x) >> (64 - (b))) ) + +#define HALF_ROUND(a,b,c,d,s,t) \ + a += b; c += d; \ + b = ROTATE(b, s) ^ a; \ + d = ROTATE(d, t) ^ c; \ + a = ROTATE(a, 32); + +#define DOUBLE_ROUND(v0,v1,v2,v3) \ + HALF_ROUND(v0,v1,v2,v3,13,16); \ + HALF_ROUND(v2,v1,v0,v3,17,21); \ + HALF_ROUND(v0,v1,v2,v3,13,16); \ + HALF_ROUND(v2,v1,v0,v3,17,21); + +#if 0 +/* This does not seem to save very much runtime in the fast case, and it's + * potentially a big loss in the slow case where we're misaligned and we cross + * a cache line. */ +#if (defined(__i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(__INTEL__)) +# define UNALIGNED_OK 1 +#endif +#endif + +uint64_t siphash24(const void *src, unsigned long src_sz, const struct sipkey *key) { + const uint8_t *m = src; + uint64_t k0 = key->k0; + uint64_t k1 = key->k1; + uint64_t last7 = (uint64_t)(src_sz & 0xff) << 56; + size_t i, blocks; + + uint64_t v0 = k0 ^ 0x736f6d6570736575ULL; + uint64_t v1 = k1 ^ 0x646f72616e646f6dULL; + uint64_t v2 = k0 ^ 0x6c7967656e657261ULL; + uint64_t v3 = k1 ^ 0x7465646279746573ULL; + + for (i = 0, blocks = (src_sz & ~7); i < blocks; i+= 8) { +#ifdef UNALIGNED_OK + uint64_t mi = _le64toh(*(m + i)); +#else + uint64_t mi; + memcpy(&mi, m + i, 8); + mi = _le64toh(mi); +#endif + v3 ^= mi; + DOUBLE_ROUND(v0,v1,v2,v3); + v0 ^= mi; + } + + switch (src_sz - blocks) { + case 7: last7 |= (uint64_t)m[i + 6] << 48; /* Falls through. */ + case 6: last7 |= (uint64_t)m[i + 5] << 40; /* Falls through. */ + case 5: last7 |= (uint64_t)m[i + 4] << 32; /* Falls through. */ + case 4: last7 |= (uint64_t)m[i + 3] << 24; /* Falls through. */ + case 3: last7 |= (uint64_t)m[i + 2] << 16; /* Falls through. */ + case 2: last7 |= (uint64_t)m[i + 1] << 8; /* Falls through. */ + case 1: last7 |= (uint64_t)m[i + 0] ; /* Falls through. */ + case 0: + default:; + } + v3 ^= last7; + DOUBLE_ROUND(v0,v1,v2,v3); + v0 ^= last7; + v2 ^= 0xff; + DOUBLE_ROUND(v0,v1,v2,v3); + DOUBLE_ROUND(v0,v1,v2,v3); + return v0 ^ v1 ^ v2 ^ v3; +} + + +static int the_siphash_key_is_set = 0; +static struct sipkey the_siphash_key; + +uint64_t siphash24g(const void *src, unsigned long src_sz) { + tor_assert(the_siphash_key_is_set); + return siphash24(src, src_sz, &the_siphash_key); +} + +void siphash_set_global_key(const struct sipkey *key) +{ + tor_assert(! the_siphash_key_is_set); + the_siphash_key.k0 = key->k0; + the_siphash_key.k1 = key->k1; + the_siphash_key_is_set = 1; +} diff --git a/src/wraith/src/ext/curve25519_donna/README b/src/wraith/src/ext/curve25519_donna/README new file mode 100644 index 000000000..9f77bd7d9 --- /dev/null +++ b/src/wraith/src/ext/curve25519_donna/README @@ -0,0 +1,44 @@ +See http://code.google.com/p/curve25519-donna/ for details. + +BUILDING: + +If you run `make`, two .a archives will be built, similar to djb's curve25519 +code. Alternatively, read on: + +The C implementation is contained within curve25519-donna.c. It has no external +dependancies and is BSD licenced. You can copy/include/link it directly in with +your program. Recommended C flags: -O2 + +The x86-64 bit implementation is contained within curve25519-donna-x86-64.c and +curve25519-donna-x86-64.s. Build like this: + +% cpp curve25519-donna-x86-64.s > curve25519-donna-x86-64.s.pp +% as -o curve25519-donna-x86-64.s.o curve25519-donna-x86-64.s.pp +% gcc -O2 -c curve25519-donna-x86-64.c + +Then the two .o files can be linked in + +USAGE: + +The usage is exactly the same as djb's code (as described at +http://cr.yp.to/ecdh.html) expect that the function is called curve25519_donna. + +In short, + +To generate a private key, generate 32 random bytes and: + + mysecret[0] &= 248; + mysecret[31] &= 127; + mysecret[31] |= 64; + +To generate the public key, just do + + static const uint8_t basepoint[32] = {9}; + curve25519_donna(mypublic, mysecret, basepoint); + +To generate an agreed key do: + uint8_t shared_key[32]; + curve25519_donna(shared_key, mysecret, theirpublic); + +And hash the shared_key with a cryptographic hash function before using. + diff --git a/src/wraith/src/ext/curve25519_donna/curve25519-donna-c64.c b/src/wraith/src/ext/curve25519_donna/curve25519-donna-c64.c new file mode 100644 index 000000000..b68ff3695 --- /dev/null +++ b/src/wraith/src/ext/curve25519_donna/curve25519-donna-c64.c @@ -0,0 +1,451 @@ +/* Copyright 2008, Google Inc. + * All rights reserved. + * + * Code released into the public domain. + * + * curve25519-donna: Curve25519 elliptic curve, public key function + * + * http://code.google.com/p/curve25519-donna/ + * + * Adam Langley + * + * Derived from public domain C code by Daniel J. Bernstein + * + * More information about curve25519 can be found here + * http://cr.yp.to/ecdh.html + * + * djb's sample implementation of curve25519 is written in a special assembly + * language called qhasm and uses the floating point registers. + * + * This is, almost, a clean room reimplementation from the curve25519 paper. It + * uses many of the tricks described therein. Only the crecip function is taken + * from the sample implementation. + */ + +#include "orconfig.h" + +#include +#include "torint.h" + +typedef uint8_t u8; +typedef uint64_t limb; +typedef limb felem[5]; +// This is a special gcc mode for 128-bit integers. It's implemented on 64-bit +// platforms only as far as I know. +typedef unsigned uint128_t __attribute__((mode(TI))); + +#undef force_inline +#define force_inline __attribute__((always_inline)) + +/* Sum two numbers: output += in */ +static inline void force_inline +fsum(limb *output, const limb *in) { + output[0] += in[0]; + output[1] += in[1]; + output[2] += in[2]; + output[3] += in[3]; + output[4] += in[4]; +} + +/* Find the difference of two numbers: output = in - output + * (note the order of the arguments!) + * + * Assumes that out[i] < 2**52 + * On return, out[i] < 2**55 + */ +static inline void force_inline +fdifference_backwards(felem out, const felem in) { + /* 152 is 19 << 3 */ + static const limb two54m152 = (((limb)1) << 54) - 152; + static const limb two54m8 = (((limb)1) << 54) - 8; + + out[0] = in[0] + two54m152 - out[0]; + out[1] = in[1] + two54m8 - out[1]; + out[2] = in[2] + two54m8 - out[2]; + out[3] = in[3] + two54m8 - out[3]; + out[4] = in[4] + two54m8 - out[4]; +} + +/* Multiply a number by a scalar: output = in * scalar */ +static inline void force_inline +fscalar_product(felem output, const felem in, const limb scalar) { + uint128_t a; + + a = ((uint128_t) in[0]) * scalar; + output[0] = ((limb)a) & 0x7ffffffffffff; + + a = ((uint128_t) in[1]) * scalar + ((limb) (a >> 51)); + output[1] = ((limb)a) & 0x7ffffffffffff; + + a = ((uint128_t) in[2]) * scalar + ((limb) (a >> 51)); + output[2] = ((limb)a) & 0x7ffffffffffff; + + a = ((uint128_t) in[3]) * scalar + ((limb) (a >> 51)); + output[3] = ((limb)a) & 0x7ffffffffffff; + + a = ((uint128_t) in[4]) * scalar + ((limb) (a >> 51)); + output[4] = ((limb)a) & 0x7ffffffffffff; + + output[0] += (a >> 51) * 19; +} + +/* Multiply two numbers: output = in2 * in + * + * output must be distinct to both inputs. The inputs are reduced coefficient + * form, the output is not. + * + * Assumes that in[i] < 2**55 and likewise for in2. + * On return, output[i] < 2**52 + */ +static inline void force_inline +fmul(felem output, const felem in2, const felem in) { + uint128_t t[5]; + limb r0,r1,r2,r3,r4,s0,s1,s2,s3,s4,c; + + r0 = in[0]; + r1 = in[1]; + r2 = in[2]; + r3 = in[3]; + r4 = in[4]; + + s0 = in2[0]; + s1 = in2[1]; + s2 = in2[2]; + s3 = in2[3]; + s4 = in2[4]; + + t[0] = ((uint128_t) r0) * s0; + t[1] = ((uint128_t) r0) * s1 + ((uint128_t) r1) * s0; + t[2] = ((uint128_t) r0) * s2 + ((uint128_t) r2) * s0 + ((uint128_t) r1) * s1; + t[3] = ((uint128_t) r0) * s3 + ((uint128_t) r3) * s0 + ((uint128_t) r1) * s2 + ((uint128_t) r2) * s1; + t[4] = ((uint128_t) r0) * s4 + ((uint128_t) r4) * s0 + ((uint128_t) r3) * s1 + ((uint128_t) r1) * s3 + ((uint128_t) r2) * s2; + + r4 *= 19; + r1 *= 19; + r2 *= 19; + r3 *= 19; + + t[0] += ((uint128_t) r4) * s1 + ((uint128_t) r1) * s4 + ((uint128_t) r2) * s3 + ((uint128_t) r3) * s2; + t[1] += ((uint128_t) r4) * s2 + ((uint128_t) r2) * s4 + ((uint128_t) r3) * s3; + t[2] += ((uint128_t) r4) * s3 + ((uint128_t) r3) * s4; + t[3] += ((uint128_t) r4) * s4; + + r0 = (limb)t[0] & 0x7ffffffffffff; c = (limb)(t[0] >> 51); + t[1] += c; r1 = (limb)t[1] & 0x7ffffffffffff; c = (limb)(t[1] >> 51); + t[2] += c; r2 = (limb)t[2] & 0x7ffffffffffff; c = (limb)(t[2] >> 51); + t[3] += c; r3 = (limb)t[3] & 0x7ffffffffffff; c = (limb)(t[3] >> 51); + t[4] += c; r4 = (limb)t[4] & 0x7ffffffffffff; c = (limb)(t[4] >> 51); + r0 += c * 19; c = r0 >> 51; r0 = r0 & 0x7ffffffffffff; + r1 += c; c = r1 >> 51; r1 = r1 & 0x7ffffffffffff; + r2 += c; + + output[0] = r0; + output[1] = r1; + output[2] = r2; + output[3] = r3; + output[4] = r4; +} + +static inline void force_inline +fsquare_times(felem output, const felem in, limb count) { + uint128_t t[5]; + limb r0,r1,r2,r3,r4,c; + limb d0,d1,d2,d4,d419; + + r0 = in[0]; + r1 = in[1]; + r2 = in[2]; + r3 = in[3]; + r4 = in[4]; + + do { + d0 = r0 * 2; + d1 = r1 * 2; + d2 = r2 * 2 * 19; + d419 = r4 * 19; + d4 = d419 * 2; + + t[0] = ((uint128_t) r0) * r0 + ((uint128_t) d4) * r1 + (((uint128_t) d2) * (r3 )); + t[1] = ((uint128_t) d0) * r1 + ((uint128_t) d4) * r2 + (((uint128_t) r3) * (r3 * 19)); + t[2] = ((uint128_t) d0) * r2 + ((uint128_t) r1) * r1 + (((uint128_t) d4) * (r3 )); + t[3] = ((uint128_t) d0) * r3 + ((uint128_t) d1) * r2 + (((uint128_t) r4) * (d419 )); + t[4] = ((uint128_t) d0) * r4 + ((uint128_t) d1) * r3 + (((uint128_t) r2) * (r2 )); + + r0 = (limb)t[0] & 0x7ffffffffffff; c = (limb)(t[0] >> 51); + t[1] += c; r1 = (limb)t[1] & 0x7ffffffffffff; c = (limb)(t[1] >> 51); + t[2] += c; r2 = (limb)t[2] & 0x7ffffffffffff; c = (limb)(t[2] >> 51); + t[3] += c; r3 = (limb)t[3] & 0x7ffffffffffff; c = (limb)(t[3] >> 51); + t[4] += c; r4 = (limb)t[4] & 0x7ffffffffffff; c = (limb)(t[4] >> 51); + r0 += c * 19; c = r0 >> 51; r0 = r0 & 0x7ffffffffffff; + r1 += c; c = r1 >> 51; r1 = r1 & 0x7ffffffffffff; + r2 += c; + } while(--count); + + output[0] = r0; + output[1] = r1; + output[2] = r2; + output[3] = r3; + output[4] = r4; +} + +/* Load a little-endian 64-bit number */ +static limb +load_limb(const u8 *in) { + return + ((limb)in[0]) | + (((limb)in[1]) << 8) | + (((limb)in[2]) << 16) | + (((limb)in[3]) << 24) | + (((limb)in[4]) << 32) | + (((limb)in[5]) << 40) | + (((limb)in[6]) << 48) | + (((limb)in[7]) << 56); +} + +static void +store_limb(u8 *out, limb in) { + out[0] = in & 0xff; + out[1] = (in >> 8) & 0xff; + out[2] = (in >> 16) & 0xff; + out[3] = (in >> 24) & 0xff; + out[4] = (in >> 32) & 0xff; + out[5] = (in >> 40) & 0xff; + out[6] = (in >> 48) & 0xff; + out[7] = (in >> 56) & 0xff; +} + +/* Take a little-endian, 32-byte number and expand it into polynomial form */ +static void +fexpand(limb *output, const u8 *in) { + output[0] = load_limb(in) & 0x7ffffffffffff; + output[1] = (load_limb(in+6) >> 3) & 0x7ffffffffffff; + output[2] = (load_limb(in+12) >> 6) & 0x7ffffffffffff; + output[3] = (load_limb(in+19) >> 1) & 0x7ffffffffffff; + output[4] = (load_limb(in+24) >> 12) & 0x7ffffffffffff; +} + +/* Take a fully reduced polynomial form number and contract it into a + * little-endian, 32-byte array + */ +static void +fcontract(u8 *output, const felem input) { + uint128_t t[5]; + + t[0] = input[0]; + t[1] = input[1]; + t[2] = input[2]; + t[3] = input[3]; + t[4] = input[4]; + + t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; + t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; + t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; + t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; + t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff; + + t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; + t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; + t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; + t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; + t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff; + + /* now t is between 0 and 2^255-1, properly carried. */ + /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */ + + t[0] += 19; + + t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; + t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; + t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; + t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; + t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff; + + /* now between 19 and 2^255-1 in both cases, and offset by 19. */ + + t[0] += 0x8000000000000 - 19; + t[1] += 0x8000000000000 - 1; + t[2] += 0x8000000000000 - 1; + t[3] += 0x8000000000000 - 1; + t[4] += 0x8000000000000 - 1; + + /* now between 2^255 and 2^256-20, and offset by 2^255. */ + + t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; + t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; + t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; + t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; + t[4] &= 0x7ffffffffffff; + + store_limb(output, t[0] | (t[1] << 51)); + store_limb(output+8, (t[1] >> 13) | (t[2] << 38)); + store_limb(output+16, (t[2] >> 26) | (t[3] << 25)); + store_limb(output+24, (t[3] >> 39) | (t[4] << 12)); +} + +/* Input: Q, Q', Q-Q' + * Output: 2Q, Q+Q' + * + * x2 z3: long form + * x3 z3: long form + * x z: short form, destroyed + * xprime zprime: short form, destroyed + * qmqp: short form, preserved + */ +static void +fmonty(limb *x2, limb *z2, /* output 2Q */ + limb *x3, limb *z3, /* output Q + Q' */ + limb *x, limb *z, /* input Q */ + limb *xprime, limb *zprime, /* input Q' */ + const limb *qmqp /* input Q - Q' */) { + limb origx[5], origxprime[5], zzz[5], xx[5], zz[5], xxprime[5], + zzprime[5], zzzprime[5]; + + memcpy(origx, x, 5 * sizeof(limb)); + fsum(x, z); + fdifference_backwards(z, origx); // does x - z + + memcpy(origxprime, xprime, sizeof(limb) * 5); + fsum(xprime, zprime); + fdifference_backwards(zprime, origxprime); + fmul(xxprime, xprime, z); + fmul(zzprime, x, zprime); + memcpy(origxprime, xxprime, sizeof(limb) * 5); + fsum(xxprime, zzprime); + fdifference_backwards(zzprime, origxprime); + fsquare_times(x3, xxprime, 1); + fsquare_times(zzzprime, zzprime, 1); + fmul(z3, zzzprime, qmqp); + + fsquare_times(xx, x, 1); + fsquare_times(zz, z, 1); + fmul(x2, xx, zz); + fdifference_backwards(zz, xx); // does zz = xx - zz + fscalar_product(zzz, zz, 121665); + fsum(zzz, xx); + fmul(z2, zz, zzz); +} + +// ----------------------------------------------------------------------------- +// Maybe swap the contents of two limb arrays (@a and @b), each @len elements +// long. Perform the swap iff @swap is non-zero. +// +// This function performs the swap without leaking any side-channel +// information. +// ----------------------------------------------------------------------------- +static void +swap_conditional(limb a[5], limb b[5], limb iswap) { + unsigned i; + const limb swap = -iswap; + + for (i = 0; i < 5; ++i) { + const limb x = swap & (a[i] ^ b[i]); + a[i] ^= x; + b[i] ^= x; + } +} + +/* Calculates nQ where Q is the x-coordinate of a point on the curve + * + * resultx/resultz: the x coordinate of the resulting curve point (short form) + * n: a little endian, 32-byte number + * q: a point of the curve (short form) + */ +static void +cmult(limb *resultx, limb *resultz, const u8 *n, const limb *q) { + limb a[5] = {0}, b[5] = {1}, c[5] = {1}, d[5] = {0}; + limb *nqpqx = a, *nqpqz = b, *nqx = c, *nqz = d, *t; + limb e[5] = {0}, f[5] = {1}, g[5] = {0}, h[5] = {1}; + limb *nqpqx2 = e, *nqpqz2 = f, *nqx2 = g, *nqz2 = h; + + unsigned i, j; + + memcpy(nqpqx, q, sizeof(limb) * 5); + + for (i = 0; i < 32; ++i) { + u8 byte = n[31 - i]; + for (j = 0; j < 8; ++j) { + const limb bit = byte >> 7; + + swap_conditional(nqx, nqpqx, bit); + swap_conditional(nqz, nqpqz, bit); + fmonty(nqx2, nqz2, + nqpqx2, nqpqz2, + nqx, nqz, + nqpqx, nqpqz, + q); + swap_conditional(nqx2, nqpqx2, bit); + swap_conditional(nqz2, nqpqz2, bit); + + t = nqx; + nqx = nqx2; + nqx2 = t; + t = nqz; + nqz = nqz2; + nqz2 = t; + t = nqpqx; + nqpqx = nqpqx2; + nqpqx2 = t; + t = nqpqz; + nqpqz = nqpqz2; + nqpqz2 = t; + + byte <<= 1; + } + } + + memcpy(resultx, nqx, sizeof(limb) * 5); + memcpy(resultz, nqz, sizeof(limb) * 5); +} + + +// ----------------------------------------------------------------------------- +// Shamelessly copied from djb's code, tightened a little +// ----------------------------------------------------------------------------- +static void +crecip(felem out, const felem z) { + felem a,t0,b,c; + + /* 2 */ fsquare_times(a, z, 1); // a = 2 + /* 8 */ fsquare_times(t0, a, 2); + /* 9 */ fmul(b, t0, z); // b = 9 + /* 11 */ fmul(a, b, a); // a = 11 + /* 22 */ fsquare_times(t0, a, 1); + /* 2^5 - 2^0 = 31 */ fmul(b, t0, b); + /* 2^10 - 2^5 */ fsquare_times(t0, b, 5); + /* 2^10 - 2^0 */ fmul(b, t0, b); + /* 2^20 - 2^10 */ fsquare_times(t0, b, 10); + /* 2^20 - 2^0 */ fmul(c, t0, b); + /* 2^40 - 2^20 */ fsquare_times(t0, c, 20); + /* 2^40 - 2^0 */ fmul(t0, t0, c); + /* 2^50 - 2^10 */ fsquare_times(t0, t0, 10); + /* 2^50 - 2^0 */ fmul(b, t0, b); + /* 2^100 - 2^50 */ fsquare_times(t0, b, 50); + /* 2^100 - 2^0 */ fmul(c, t0, b); + /* 2^200 - 2^100 */ fsquare_times(t0, c, 100); + /* 2^200 - 2^0 */ fmul(t0, t0, c); + /* 2^250 - 2^50 */ fsquare_times(t0, t0, 50); + /* 2^250 - 2^0 */ fmul(t0, t0, b); + /* 2^255 - 2^5 */ fsquare_times(t0, t0, 5); + /* 2^255 - 21 */ fmul(out, t0, a); +} + +int curve25519_donna(u8 *, const u8 *, const u8 *); + +int +curve25519_donna(u8 *mypublic, const u8 *secret, const u8 *basepoint) { + limb bp[5], x[5], z[5], zmone[5]; + uint8_t e[32]; + int i; + + for (i = 0;i < 32;++i) e[i] = secret[i]; + e[0] &= 248; + e[31] &= 127; + e[31] |= 64; + + fexpand(bp, basepoint); + cmult(x, z, e, bp); + crecip(zmone, z); + fmul(z, x, zmone); + fcontract(mypublic, z); + return 0; +} diff --git a/src/wraith/src/ext/curve25519_donna/curve25519-donna.c b/src/wraith/src/ext/curve25519_donna/curve25519-donna.c new file mode 100644 index 000000000..1c5a27ab8 --- /dev/null +++ b/src/wraith/src/ext/curve25519_donna/curve25519-donna.c @@ -0,0 +1,871 @@ +/* Copyright 2008, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * curve25519-donna: Curve25519 elliptic curve, public key function + * + * http://code.google.com/p/curve25519-donna/ + * + * Adam Langley + * + * Derived from public domain C code by Daniel J. Bernstein + * + * More information about curve25519 can be found here + * http://cr.yp.to/ecdh.html + * + * djb's sample implementation of curve25519 is written in a special assembly + * language called qhasm and uses the floating point registers. + * + * This is, almost, a clean room reimplementation from the curve25519 paper. It + * uses many of the tricks described therein. Only the crecip function is taken + * from the sample implementation. */ + +#include "orconfig.h" + +#include +#include "torint.h" + +typedef uint8_t u8; +typedef int32_t s32; +typedef int64_t limb; + +/* Field element representation: + * + * Field elements are written as an array of signed, 64-bit limbs, least + * significant first. The value of the field element is: + * x[0] + 2^26·x[1] + x^51·x[2] + 2^102·x[3] + ... + * + * i.e. the limbs are 26, 25, 26, 25, ... bits wide. */ + +/* Sum two numbers: output += in */ +static void fsum(limb *output, const limb *in) { + unsigned i; + for (i = 0; i < 10; i += 2) { + output[0+i] = output[0+i] + in[0+i]; + output[1+i] = output[1+i] + in[1+i]; + } +} + +/* Find the difference of two numbers: output = in - output + * (note the order of the arguments!). */ +static void fdifference(limb *output, const limb *in) { + unsigned i; + for (i = 0; i < 10; ++i) { + output[i] = in[i] - output[i]; + } +} + +/* Multiply a number by a scalar: output = in * scalar */ +static void fscalar_product(limb *output, const limb *in, const limb scalar) { + unsigned i; + for (i = 0; i < 10; ++i) { + output[i] = in[i] * scalar; + } +} + +/* Multiply two numbers: output = in2 * in + * + * output must be distinct to both inputs. The inputs are reduced coefficient + * form, the output is not. + * + * output[x] <= 14 * the largest product of the input limbs. */ +static void fproduct(limb *output, const limb *in2, const limb *in) { + output[0] = ((limb) ((s32) in2[0])) * ((s32) in[0]); + output[1] = ((limb) ((s32) in2[0])) * ((s32) in[1]) + + ((limb) ((s32) in2[1])) * ((s32) in[0]); + output[2] = 2 * ((limb) ((s32) in2[1])) * ((s32) in[1]) + + ((limb) ((s32) in2[0])) * ((s32) in[2]) + + ((limb) ((s32) in2[2])) * ((s32) in[0]); + output[3] = ((limb) ((s32) in2[1])) * ((s32) in[2]) + + ((limb) ((s32) in2[2])) * ((s32) in[1]) + + ((limb) ((s32) in2[0])) * ((s32) in[3]) + + ((limb) ((s32) in2[3])) * ((s32) in[0]); + output[4] = ((limb) ((s32) in2[2])) * ((s32) in[2]) + + 2 * (((limb) ((s32) in2[1])) * ((s32) in[3]) + + ((limb) ((s32) in2[3])) * ((s32) in[1])) + + ((limb) ((s32) in2[0])) * ((s32) in[4]) + + ((limb) ((s32) in2[4])) * ((s32) in[0]); + output[5] = ((limb) ((s32) in2[2])) * ((s32) in[3]) + + ((limb) ((s32) in2[3])) * ((s32) in[2]) + + ((limb) ((s32) in2[1])) * ((s32) in[4]) + + ((limb) ((s32) in2[4])) * ((s32) in[1]) + + ((limb) ((s32) in2[0])) * ((s32) in[5]) + + ((limb) ((s32) in2[5])) * ((s32) in[0]); + output[6] = 2 * (((limb) ((s32) in2[3])) * ((s32) in[3]) + + ((limb) ((s32) in2[1])) * ((s32) in[5]) + + ((limb) ((s32) in2[5])) * ((s32) in[1])) + + ((limb) ((s32) in2[2])) * ((s32) in[4]) + + ((limb) ((s32) in2[4])) * ((s32) in[2]) + + ((limb) ((s32) in2[0])) * ((s32) in[6]) + + ((limb) ((s32) in2[6])) * ((s32) in[0]); + output[7] = ((limb) ((s32) in2[3])) * ((s32) in[4]) + + ((limb) ((s32) in2[4])) * ((s32) in[3]) + + ((limb) ((s32) in2[2])) * ((s32) in[5]) + + ((limb) ((s32) in2[5])) * ((s32) in[2]) + + ((limb) ((s32) in2[1])) * ((s32) in[6]) + + ((limb) ((s32) in2[6])) * ((s32) in[1]) + + ((limb) ((s32) in2[0])) * ((s32) in[7]) + + ((limb) ((s32) in2[7])) * ((s32) in[0]); + output[8] = ((limb) ((s32) in2[4])) * ((s32) in[4]) + + 2 * (((limb) ((s32) in2[3])) * ((s32) in[5]) + + ((limb) ((s32) in2[5])) * ((s32) in[3]) + + ((limb) ((s32) in2[1])) * ((s32) in[7]) + + ((limb) ((s32) in2[7])) * ((s32) in[1])) + + ((limb) ((s32) in2[2])) * ((s32) in[6]) + + ((limb) ((s32) in2[6])) * ((s32) in[2]) + + ((limb) ((s32) in2[0])) * ((s32) in[8]) + + ((limb) ((s32) in2[8])) * ((s32) in[0]); + output[9] = ((limb) ((s32) in2[4])) * ((s32) in[5]) + + ((limb) ((s32) in2[5])) * ((s32) in[4]) + + ((limb) ((s32) in2[3])) * ((s32) in[6]) + + ((limb) ((s32) in2[6])) * ((s32) in[3]) + + ((limb) ((s32) in2[2])) * ((s32) in[7]) + + ((limb) ((s32) in2[7])) * ((s32) in[2]) + + ((limb) ((s32) in2[1])) * ((s32) in[8]) + + ((limb) ((s32) in2[8])) * ((s32) in[1]) + + ((limb) ((s32) in2[0])) * ((s32) in[9]) + + ((limb) ((s32) in2[9])) * ((s32) in[0]); + output[10] = 2 * (((limb) ((s32) in2[5])) * ((s32) in[5]) + + ((limb) ((s32) in2[3])) * ((s32) in[7]) + + ((limb) ((s32) in2[7])) * ((s32) in[3]) + + ((limb) ((s32) in2[1])) * ((s32) in[9]) + + ((limb) ((s32) in2[9])) * ((s32) in[1])) + + ((limb) ((s32) in2[4])) * ((s32) in[6]) + + ((limb) ((s32) in2[6])) * ((s32) in[4]) + + ((limb) ((s32) in2[2])) * ((s32) in[8]) + + ((limb) ((s32) in2[8])) * ((s32) in[2]); + output[11] = ((limb) ((s32) in2[5])) * ((s32) in[6]) + + ((limb) ((s32) in2[6])) * ((s32) in[5]) + + ((limb) ((s32) in2[4])) * ((s32) in[7]) + + ((limb) ((s32) in2[7])) * ((s32) in[4]) + + ((limb) ((s32) in2[3])) * ((s32) in[8]) + + ((limb) ((s32) in2[8])) * ((s32) in[3]) + + ((limb) ((s32) in2[2])) * ((s32) in[9]) + + ((limb) ((s32) in2[9])) * ((s32) in[2]); + output[12] = ((limb) ((s32) in2[6])) * ((s32) in[6]) + + 2 * (((limb) ((s32) in2[5])) * ((s32) in[7]) + + ((limb) ((s32) in2[7])) * ((s32) in[5]) + + ((limb) ((s32) in2[3])) * ((s32) in[9]) + + ((limb) ((s32) in2[9])) * ((s32) in[3])) + + ((limb) ((s32) in2[4])) * ((s32) in[8]) + + ((limb) ((s32) in2[8])) * ((s32) in[4]); + output[13] = ((limb) ((s32) in2[6])) * ((s32) in[7]) + + ((limb) ((s32) in2[7])) * ((s32) in[6]) + + ((limb) ((s32) in2[5])) * ((s32) in[8]) + + ((limb) ((s32) in2[8])) * ((s32) in[5]) + + ((limb) ((s32) in2[4])) * ((s32) in[9]) + + ((limb) ((s32) in2[9])) * ((s32) in[4]); + output[14] = 2 * (((limb) ((s32) in2[7])) * ((s32) in[7]) + + ((limb) ((s32) in2[5])) * ((s32) in[9]) + + ((limb) ((s32) in2[9])) * ((s32) in[5])) + + ((limb) ((s32) in2[6])) * ((s32) in[8]) + + ((limb) ((s32) in2[8])) * ((s32) in[6]); + output[15] = ((limb) ((s32) in2[7])) * ((s32) in[8]) + + ((limb) ((s32) in2[8])) * ((s32) in[7]) + + ((limb) ((s32) in2[6])) * ((s32) in[9]) + + ((limb) ((s32) in2[9])) * ((s32) in[6]); + output[16] = ((limb) ((s32) in2[8])) * ((s32) in[8]) + + 2 * (((limb) ((s32) in2[7])) * ((s32) in[9]) + + ((limb) ((s32) in2[9])) * ((s32) in[7])); + output[17] = ((limb) ((s32) in2[8])) * ((s32) in[9]) + + ((limb) ((s32) in2[9])) * ((s32) in[8]); + output[18] = 2 * ((limb) ((s32) in2[9])) * ((s32) in[9]); +} + +/* Reduce a long form to a short form by taking the input mod 2^255 - 19. + * + * On entry: |output[i]| < 14*2^54 + * On exit: |output[0..8]| < 280*2^54 */ +static void freduce_degree(limb *output) { + /* Each of these shifts and adds ends up multiplying the value by 19. + * + * For output[0..8], the absolute entry value is < 14*2^54 and we add, at + * most, 19*14*2^54 thus, on exit, |output[0..8]| < 280*2^54. */ + output[8] += output[18] << 4; + output[8] += output[18] << 1; + output[8] += output[18]; + output[7] += output[17] << 4; + output[7] += output[17] << 1; + output[7] += output[17]; + output[6] += output[16] << 4; + output[6] += output[16] << 1; + output[6] += output[16]; + output[5] += output[15] << 4; + output[5] += output[15] << 1; + output[5] += output[15]; + output[4] += output[14] << 4; + output[4] += output[14] << 1; + output[4] += output[14]; + output[3] += output[13] << 4; + output[3] += output[13] << 1; + output[3] += output[13]; + output[2] += output[12] << 4; + output[2] += output[12] << 1; + output[2] += output[12]; + output[1] += output[11] << 4; + output[1] += output[11] << 1; + output[1] += output[11]; + output[0] += output[10] << 4; + output[0] += output[10] << 1; + output[0] += output[10]; +} + +#if (-1 & 3) != 3 +#error "This code only works on a two's complement system" +#endif + +/* return v / 2^26, using only shifts and adds. + * + * On entry: v can take any value. */ +static inline limb +div_by_2_26(const limb v) +{ + /* High word of v; no shift needed. */ + const uint32_t highword = (uint32_t) (((uint64_t) v) >> 32); + /* Set to all 1s if v was negative; else set to 0s. */ + const int32_t sign = ((int32_t) highword) >> 31; + /* Set to 0x3ffffff if v was negative; else set to 0. */ + const int32_t roundoff = ((uint32_t) sign) >> 6; + /* Should return v / (1<<26) */ + return (v + roundoff) >> 26; +} + +/* return v / (2^25), using only shifts and adds. + * + * On entry: v can take any value. */ +static inline limb +div_by_2_25(const limb v) +{ + /* High word of v; no shift needed*/ + const uint32_t highword = (uint32_t) (((uint64_t) v) >> 32); + /* Set to all 1s if v was negative; else set to 0s. */ + const int32_t sign = ((int32_t) highword) >> 31; + /* Set to 0x1ffffff if v was negative; else set to 0. */ + const int32_t roundoff = ((uint32_t) sign) >> 7; + /* Should return v / (1<<25) */ + return (v + roundoff) >> 25; +} + +#if 0 +/* return v / (2^25), using only shifts and adds. + * + * On entry: v can take any value. */ +static inline s32 +div_s32_by_2_25(const s32 v) +{ + const s32 roundoff = ((uint32_t)(v >> 31)) >> 7; + return (v + roundoff) >> 25; +} +#endif + +/* Reduce all coefficients of the short form input so that |x| < 2^26. + * + * On entry: |output[i]| < 280*2^54 */ +static void freduce_coefficients(limb *output) { + unsigned i; + + output[10] = 0; + + for (i = 0; i < 10; i += 2) { + limb over = div_by_2_26(output[i]); + /* The entry condition (that |output[i]| < 280*2^54) means that over is, at + * most, 280*2^28 in the first iteration of this loop. This is added to the + * next limb and we can approximate the resulting bound of that limb by + * 281*2^54. */ + output[i] -= over << 26; + output[i+1] += over; + + /* For the first iteration, |output[i+1]| < 281*2^54, thus |over| < + * 281*2^29. When this is added to the next limb, the resulting bound can + * be approximated as 281*2^54. + * + * For subsequent iterations of the loop, 281*2^54 remains a conservative + * bound and no overflow occurs. */ + over = div_by_2_25(output[i+1]); + output[i+1] -= over << 25; + output[i+2] += over; + } + /* Now |output[10]| < 281*2^29 and all other coefficients are reduced. */ + output[0] += output[10] << 4; + output[0] += output[10] << 1; + output[0] += output[10]; + + output[10] = 0; + + /* Now output[1..9] are reduced, and |output[0]| < 2^26 + 19*281*2^29 + * So |over| will be no more than 2^16. */ + { + limb over = div_by_2_26(output[0]); + output[0] -= over << 26; + output[1] += over; + } + + /* Now output[0,2..9] are reduced, and |output[1]| < 2^25 + 2^16 < 2^26. The + * bound on |output[1]| is sufficient to meet our needs. */ +} + +/* A helpful wrapper around fproduct: output = in * in2. + * + * On entry: |in[i]| < 2^27 and |in2[i]| < 2^27. + * + * output must be distinct to both inputs. The output is reduced degree + * (indeed, one need only provide storage for 10 limbs) and |output[i]| < 2^26. */ +static void +fmul(limb *output, const limb *in, const limb *in2) { + limb t[19]; + fproduct(t, in, in2); + /* |t[i]| < 14*2^54 */ + freduce_degree(t); + freduce_coefficients(t); + /* |t[i]| < 2^26 */ + memcpy(output, t, sizeof(limb) * 10); +} + +/* Square a number: output = in**2 + * + * output must be distinct from the input. The inputs are reduced coefficient + * form, the output is not. + * + * output[x] <= 14 * the largest product of the input limbs. */ +static void fsquare_inner(limb *output, const limb *in) { + output[0] = ((limb) ((s32) in[0])) * ((s32) in[0]); + output[1] = 2 * ((limb) ((s32) in[0])) * ((s32) in[1]); + output[2] = 2 * (((limb) ((s32) in[1])) * ((s32) in[1]) + + ((limb) ((s32) in[0])) * ((s32) in[2])); + output[3] = 2 * (((limb) ((s32) in[1])) * ((s32) in[2]) + + ((limb) ((s32) in[0])) * ((s32) in[3])); + output[4] = ((limb) ((s32) in[2])) * ((s32) in[2]) + + 4 * ((limb) ((s32) in[1])) * ((s32) in[3]) + + 2 * ((limb) ((s32) in[0])) * ((s32) in[4]); + output[5] = 2 * (((limb) ((s32) in[2])) * ((s32) in[3]) + + ((limb) ((s32) in[1])) * ((s32) in[4]) + + ((limb) ((s32) in[0])) * ((s32) in[5])); + output[6] = 2 * (((limb) ((s32) in[3])) * ((s32) in[3]) + + ((limb) ((s32) in[2])) * ((s32) in[4]) + + ((limb) ((s32) in[0])) * ((s32) in[6]) + + 2 * ((limb) ((s32) in[1])) * ((s32) in[5])); + output[7] = 2 * (((limb) ((s32) in[3])) * ((s32) in[4]) + + ((limb) ((s32) in[2])) * ((s32) in[5]) + + ((limb) ((s32) in[1])) * ((s32) in[6]) + + ((limb) ((s32) in[0])) * ((s32) in[7])); + output[8] = ((limb) ((s32) in[4])) * ((s32) in[4]) + + 2 * (((limb) ((s32) in[2])) * ((s32) in[6]) + + ((limb) ((s32) in[0])) * ((s32) in[8]) + + 2 * (((limb) ((s32) in[1])) * ((s32) in[7]) + + ((limb) ((s32) in[3])) * ((s32) in[5]))); + output[9] = 2 * (((limb) ((s32) in[4])) * ((s32) in[5]) + + ((limb) ((s32) in[3])) * ((s32) in[6]) + + ((limb) ((s32) in[2])) * ((s32) in[7]) + + ((limb) ((s32) in[1])) * ((s32) in[8]) + + ((limb) ((s32) in[0])) * ((s32) in[9])); + output[10] = 2 * (((limb) ((s32) in[5])) * ((s32) in[5]) + + ((limb) ((s32) in[4])) * ((s32) in[6]) + + ((limb) ((s32) in[2])) * ((s32) in[8]) + + 2 * (((limb) ((s32) in[3])) * ((s32) in[7]) + + ((limb) ((s32) in[1])) * ((s32) in[9]))); + output[11] = 2 * (((limb) ((s32) in[5])) * ((s32) in[6]) + + ((limb) ((s32) in[4])) * ((s32) in[7]) + + ((limb) ((s32) in[3])) * ((s32) in[8]) + + ((limb) ((s32) in[2])) * ((s32) in[9])); + output[12] = ((limb) ((s32) in[6])) * ((s32) in[6]) + + 2 * (((limb) ((s32) in[4])) * ((s32) in[8]) + + 2 * (((limb) ((s32) in[5])) * ((s32) in[7]) + + ((limb) ((s32) in[3])) * ((s32) in[9]))); + output[13] = 2 * (((limb) ((s32) in[6])) * ((s32) in[7]) + + ((limb) ((s32) in[5])) * ((s32) in[8]) + + ((limb) ((s32) in[4])) * ((s32) in[9])); + output[14] = 2 * (((limb) ((s32) in[7])) * ((s32) in[7]) + + ((limb) ((s32) in[6])) * ((s32) in[8]) + + 2 * ((limb) ((s32) in[5])) * ((s32) in[9])); + output[15] = 2 * (((limb) ((s32) in[7])) * ((s32) in[8]) + + ((limb) ((s32) in[6])) * ((s32) in[9])); + output[16] = ((limb) ((s32) in[8])) * ((s32) in[8]) + + 4 * ((limb) ((s32) in[7])) * ((s32) in[9]); + output[17] = 2 * ((limb) ((s32) in[8])) * ((s32) in[9]); + output[18] = 2 * ((limb) ((s32) in[9])) * ((s32) in[9]); +} + +/* fsquare sets output = in^2. + * + * On entry: The |in| argument is in reduced coefficients form and |in[i]| < + * 2^27. + * + * On exit: The |output| argument is in reduced coefficients form (indeed, one + * need only provide storage for 10 limbs) and |out[i]| < 2^26. */ +static void +fsquare(limb *output, const limb *in) { + limb t[19]; + fsquare_inner(t, in); + /* |t[i]| < 14*2^54 because the largest product of two limbs will be < + * 2^(27+27) and fsquare_inner adds together, at most, 14 of those + * products. */ + freduce_degree(t); + freduce_coefficients(t); + /* |t[i]| < 2^26 */ + memcpy(output, t, sizeof(limb) * 10); +} + +/* Take a little-endian, 32-byte number and expand it into polynomial form */ +static void +fexpand(limb *output, const u8 *input) { +#define F(n,start,shift,mask) \ + output[n] = ((((limb) input[start + 0]) | \ + ((limb) input[start + 1]) << 8 | \ + ((limb) input[start + 2]) << 16 | \ + ((limb) input[start + 3]) << 24) >> shift) & mask; + F(0, 0, 0, 0x3ffffff); + F(1, 3, 2, 0x1ffffff); + F(2, 6, 3, 0x3ffffff); + F(3, 9, 5, 0x1ffffff); + F(4, 12, 6, 0x3ffffff); + F(5, 16, 0, 0x1ffffff); + F(6, 19, 1, 0x3ffffff); + F(7, 22, 3, 0x1ffffff); + F(8, 25, 4, 0x3ffffff); + F(9, 28, 6, 0x1ffffff); +#undef F +} + +#if (-32 >> 1) != -16 +#error "This code only works when >> does sign-extension on negative numbers" +#endif + +/* s32_eq returns 0xffffffff iff a == b and zero otherwise. */ +static s32 s32_eq(s32 a, s32 b) { + a = ~(a ^ b); + a &= a << 16; + a &= a << 8; + a &= a << 4; + a &= a << 2; + a &= a << 1; + return a >> 31; +} + +/* s32_gte returns 0xffffffff if a >= b and zero otherwise, where a and b are + * both non-negative. */ +static s32 s32_gte(s32 a, s32 b) { + a -= b; + /* a >= 0 iff a >= b. */ + return ~(a >> 31); +} + +/* Take a fully reduced polynomial form number and contract it into a + * little-endian, 32-byte array. + * + * On entry: |input_limbs[i]| < 2^26 */ +static void +fcontract(u8 *output, limb *input_limbs) { + int i; + int j; + s32 input[10]; + + /* |input_limbs[i]| < 2^26, so it's valid to convert to an s32. */ + for (i = 0; i < 10; i++) { + input[i] = (s32) input_limbs[i]; + } + + for (j = 0; j < 2; ++j) { + for (i = 0; i < 9; ++i) { + if ((i & 1) == 1) { + /* This calculation is a time-invariant way to make input[i] + * non-negative by borrowing from the next-larger limb. */ + const s32 mask = input[i] >> 31; + const s32 carry = -((input[i] & mask) >> 25); + input[i] = input[i] + (carry << 25); + input[i+1] = input[i+1] - carry; + } else { + const s32 mask = input[i] >> 31; + const s32 carry = -((input[i] & mask) >> 26); + input[i] = input[i] + (carry << 26); + input[i+1] = input[i+1] - carry; + } + } + + /* There's no greater limb for input[9] to borrow from, but we can multiply + * by 19 and borrow from input[0], which is valid mod 2^255-19. */ + { + const s32 mask = input[9] >> 31; + const s32 carry = -((input[9] & mask) >> 25); + input[9] = input[9] + (carry << 25); + input[0] = input[0] - (carry * 19); + } + + /* After the first iteration, input[1..9] are non-negative and fit within + * 25 or 26 bits, depending on position. However, input[0] may be + * negative. */ + } + + /* The first borrow-propagation pass above ended with every limb + except (possibly) input[0] non-negative. + + If input[0] was negative after the first pass, then it was because of a + carry from input[9]. On entry, input[9] < 2^26 so the carry was, at most, + one, since (2**26-1) >> 25 = 1. Thus input[0] >= -19. + + In the second pass, each limb is decreased by at most one. Thus the second + borrow-propagation pass could only have wrapped around to decrease + input[0] again if the first pass left input[0] negative *and* input[1] + through input[9] were all zero. In that case, input[1] is now 2^25 - 1, + and this last borrow-propagation step will leave input[1] non-negative. */ + { + const s32 mask = input[0] >> 31; + const s32 carry = -((input[0] & mask) >> 26); + input[0] = input[0] + (carry << 26); + input[1] = input[1] - carry; + } + + /* All input[i] are now non-negative. However, there might be values between + * 2^25 and 2^26 in a limb which is, nominally, 25 bits wide. */ + for (j = 0; j < 2; j++) { + for (i = 0; i < 9; i++) { + if ((i & 1) == 1) { + const s32 carry = input[i] >> 25; + input[i] &= 0x1ffffff; + input[i+1] += carry; + } else { + const s32 carry = input[i] >> 26; + input[i] &= 0x3ffffff; + input[i+1] += carry; + } + } + + { + const s32 carry = input[9] >> 25; + input[9] &= 0x1ffffff; + input[0] += 19*carry; + } + } + + /* If the first carry-chain pass, just above, ended up with a carry from + * input[9], and that caused input[0] to be out-of-bounds, then input[0] was + * < 2^26 + 2*19, because the carry was, at most, two. + * + * If the second pass carried from input[9] again then input[0] is < 2*19 and + * the input[9] -> input[0] carry didn't push input[0] out of bounds. */ + + /* It still remains the case that input might be between 2^255-19 and 2^255. + * In this case, input[1..9] must take their maximum value and input[0] must + * be >= (2^255-19) & 0x3ffffff, which is 0x3ffffed. */ + s32 mask = s32_gte(input[0], 0x3ffffed); + for (i = 1; i < 10; i++) { + if ((i & 1) == 1) { + mask &= s32_eq(input[i], 0x1ffffff); + } else { + mask &= s32_eq(input[i], 0x3ffffff); + } + } + + /* mask is either 0xffffffff (if input >= 2^255-19) and zero otherwise. Thus + * this conditionally subtracts 2^255-19. */ + input[0] -= mask & 0x3ffffed; + + for (i = 1; i < 10; i++) { + if ((i & 1) == 1) { + input[i] -= mask & 0x1ffffff; + } else { + input[i] -= mask & 0x3ffffff; + } + } + + input[1] <<= 2; + input[2] <<= 3; + input[3] <<= 5; + input[4] <<= 6; + input[6] <<= 1; + input[7] <<= 3; + input[8] <<= 4; + input[9] <<= 6; +#define F(i, s) \ + output[s+0] |= input[i] & 0xff; \ + output[s+1] = (input[i] >> 8) & 0xff; \ + output[s+2] = (input[i] >> 16) & 0xff; \ + output[s+3] = (input[i] >> 24) & 0xff; + output[0] = 0; + output[16] = 0; + F(0,0); + F(1,3); + F(2,6); + F(3,9); + F(4,12); + F(5,16); + F(6,19); + F(7,22); + F(8,25); + F(9,28); +#undef F +} + +/* Input: Q, Q', Q-Q' + * Output: 2Q, Q+Q' + * + * x2 z3: long form + * x3 z3: long form + * x z: short form, destroyed + * xprime zprime: short form, destroyed + * qmqp: short form, preserved + * + * On entry and exit, the absolute value of the limbs of all inputs and outputs + * are < 2^26. */ +static void fmonty(limb *x2, limb *z2, /* output 2Q */ + limb *x3, limb *z3, /* output Q + Q' */ + limb *x, limb *z, /* input Q */ + limb *xprime, limb *zprime, /* input Q' */ + const limb *qmqp /* input Q - Q' */) { + limb origx[10], origxprime[10], zzz[19], xx[19], zz[19], xxprime[19], + zzprime[19], zzzprime[19], xxxprime[19]; + + memcpy(origx, x, 10 * sizeof(limb)); + fsum(x, z); + /* |x[i]| < 2^27 */ + fdifference(z, origx); /* does x - z */ + /* |z[i]| < 2^27 */ + + memcpy(origxprime, xprime, sizeof(limb) * 10); + fsum(xprime, zprime); + /* |xprime[i]| < 2^27 */ + fdifference(zprime, origxprime); + /* |zprime[i]| < 2^27 */ + fproduct(xxprime, xprime, z); + /* |xxprime[i]| < 14*2^54: the largest product of two limbs will be < + * 2^(27+27) and fproduct adds together, at most, 14 of those products. + * (Approximating that to 2^58 doesn't work out.) */ + fproduct(zzprime, x, zprime); + /* |zzprime[i]| < 14*2^54 */ + freduce_degree(xxprime); + freduce_coefficients(xxprime); + /* |xxprime[i]| < 2^26 */ + freduce_degree(zzprime); + freduce_coefficients(zzprime); + /* |zzprime[i]| < 2^26 */ + memcpy(origxprime, xxprime, sizeof(limb) * 10); + fsum(xxprime, zzprime); + /* |xxprime[i]| < 2^27 */ + fdifference(zzprime, origxprime); + /* |zzprime[i]| < 2^27 */ + fsquare(xxxprime, xxprime); + /* |xxxprime[i]| < 2^26 */ + fsquare(zzzprime, zzprime); + /* |zzzprime[i]| < 2^26 */ + fproduct(zzprime, zzzprime, qmqp); + /* |zzprime[i]| < 14*2^52 */ + freduce_degree(zzprime); + freduce_coefficients(zzprime); + /* |zzprime[i]| < 2^26 */ + memcpy(x3, xxxprime, sizeof(limb) * 10); + memcpy(z3, zzprime, sizeof(limb) * 10); + + fsquare(xx, x); + /* |xx[i]| < 2^26 */ + fsquare(zz, z); + /* |zz[i]| < 2^26 */ + fproduct(x2, xx, zz); + /* |x2[i]| < 14*2^52 */ + freduce_degree(x2); + freduce_coefficients(x2); + /* |x2[i]| < 2^26 */ + fdifference(zz, xx); // does zz = xx - zz + /* |zz[i]| < 2^27 */ + memset(zzz + 10, 0, sizeof(limb) * 9); + fscalar_product(zzz, zz, 121665); + /* |zzz[i]| < 2^(27+17) */ + /* No need to call freduce_degree here: + fscalar_product doesn't increase the degree of its input. */ + freduce_coefficients(zzz); + /* |zzz[i]| < 2^26 */ + fsum(zzz, xx); + /* |zzz[i]| < 2^27 */ + fproduct(z2, zz, zzz); + /* |z2[i]| < 14*2^(26+27) */ + freduce_degree(z2); + freduce_coefficients(z2); + /* |z2|i| < 2^26 */ +} + +/* Conditionally swap two reduced-form limb arrays if 'iswap' is 1, but leave + * them unchanged if 'iswap' is 0. Runs in data-invariant time to avoid + * side-channel attacks. + * + * NOTE that this function requires that 'iswap' be 1 or 0; other values give + * wrong results. Also, the two limb arrays must be in reduced-coefficient, + * reduced-degree form: the values in a[10..19] or b[10..19] aren't swapped, + * and all all values in a[0..9],b[0..9] must have magnitude less than + * INT32_MAX. */ +static void +swap_conditional(limb a[19], limb b[19], limb iswap) { + unsigned i; + const s32 swap = (s32) -iswap; + + for (i = 0; i < 10; ++i) { + const s32 x = swap & ( ((s32)a[i]) ^ ((s32)b[i]) ); + a[i] = ((s32)a[i]) ^ x; + b[i] = ((s32)b[i]) ^ x; + } +} + +/* Calculates nQ where Q is the x-coordinate of a point on the curve + * + * resultx/resultz: the x coordinate of the resulting curve point (short form) + * n: a little endian, 32-byte number + * q: a point of the curve (short form) */ +static void +cmult(limb *resultx, limb *resultz, const u8 *n, const limb *q) { + limb a[19] = {0}, b[19] = {1}, c[19] = {1}, d[19] = {0}; + limb *nqpqx = a, *nqpqz = b, *nqx = c, *nqz = d, *t; + limb e[19] = {0}, f[19] = {1}, g[19] = {0}, h[19] = {1}; + limb *nqpqx2 = e, *nqpqz2 = f, *nqx2 = g, *nqz2 = h; + + unsigned i, j; + + memcpy(nqpqx, q, sizeof(limb) * 10); + + for (i = 0; i < 32; ++i) { + u8 byte = n[31 - i]; + for (j = 0; j < 8; ++j) { + const limb bit = byte >> 7; + + swap_conditional(nqx, nqpqx, bit); + swap_conditional(nqz, nqpqz, bit); + fmonty(nqx2, nqz2, + nqpqx2, nqpqz2, + nqx, nqz, + nqpqx, nqpqz, + q); + swap_conditional(nqx2, nqpqx2, bit); + swap_conditional(nqz2, nqpqz2, bit); + + t = nqx; + nqx = nqx2; + nqx2 = t; + t = nqz; + nqz = nqz2; + nqz2 = t; + t = nqpqx; + nqpqx = nqpqx2; + nqpqx2 = t; + t = nqpqz; + nqpqz = nqpqz2; + nqpqz2 = t; + + byte <<= 1; + } + } + + memcpy(resultx, nqx, sizeof(limb) * 10); + memcpy(resultz, nqz, sizeof(limb) * 10); +} + +// ----------------------------------------------------------------------------- +// Shamelessly copied from djb's code +// ----------------------------------------------------------------------------- +static void +crecip(limb *out, const limb *z) { + limb z2[10]; + limb z9[10]; + limb z11[10]; + limb z2_5_0[10]; + limb z2_10_0[10]; + limb z2_20_0[10]; + limb z2_50_0[10]; + limb z2_100_0[10]; + limb t0[10]; + limb t1[10]; + int i; + + /* 2 */ fsquare(z2,z); + /* 4 */ fsquare(t1,z2); + /* 8 */ fsquare(t0,t1); + /* 9 */ fmul(z9,t0,z); + /* 11 */ fmul(z11,z9,z2); + /* 22 */ fsquare(t0,z11); + /* 2^5 - 2^0 = 31 */ fmul(z2_5_0,t0,z9); + + /* 2^6 - 2^1 */ fsquare(t0,z2_5_0); + /* 2^7 - 2^2 */ fsquare(t1,t0); + /* 2^8 - 2^3 */ fsquare(t0,t1); + /* 2^9 - 2^4 */ fsquare(t1,t0); + /* 2^10 - 2^5 */ fsquare(t0,t1); + /* 2^10 - 2^0 */ fmul(z2_10_0,t0,z2_5_0); + + /* 2^11 - 2^1 */ fsquare(t0,z2_10_0); + /* 2^12 - 2^2 */ fsquare(t1,t0); + /* 2^20 - 2^10 */ for (i = 2;i < 10;i += 2) { fsquare(t0,t1); fsquare(t1,t0); } + /* 2^20 - 2^0 */ fmul(z2_20_0,t1,z2_10_0); + + /* 2^21 - 2^1 */ fsquare(t0,z2_20_0); + /* 2^22 - 2^2 */ fsquare(t1,t0); + /* 2^40 - 2^20 */ for (i = 2;i < 20;i += 2) { fsquare(t0,t1); fsquare(t1,t0); } + /* 2^40 - 2^0 */ fmul(t0,t1,z2_20_0); + + /* 2^41 - 2^1 */ fsquare(t1,t0); + /* 2^42 - 2^2 */ fsquare(t0,t1); + /* 2^50 - 2^10 */ for (i = 2;i < 10;i += 2) { fsquare(t1,t0); fsquare(t0,t1); } + /* 2^50 - 2^0 */ fmul(z2_50_0,t0,z2_10_0); + + /* 2^51 - 2^1 */ fsquare(t0,z2_50_0); + /* 2^52 - 2^2 */ fsquare(t1,t0); + /* 2^100 - 2^50 */ for (i = 2;i < 50;i += 2) { fsquare(t0,t1); fsquare(t1,t0); } + /* 2^100 - 2^0 */ fmul(z2_100_0,t1,z2_50_0); + + /* 2^101 - 2^1 */ fsquare(t1,z2_100_0); + /* 2^102 - 2^2 */ fsquare(t0,t1); + /* 2^200 - 2^100 */ for (i = 2;i < 100;i += 2) { fsquare(t1,t0); fsquare(t0,t1); } + /* 2^200 - 2^0 */ fmul(t1,t0,z2_100_0); + + /* 2^201 - 2^1 */ fsquare(t0,t1); + /* 2^202 - 2^2 */ fsquare(t1,t0); + /* 2^250 - 2^50 */ for (i = 2;i < 50;i += 2) { fsquare(t0,t1); fsquare(t1,t0); } + /* 2^250 - 2^0 */ fmul(t0,t1,z2_50_0); + + /* 2^251 - 2^1 */ fsquare(t1,t0); + /* 2^252 - 2^2 */ fsquare(t0,t1); + /* 2^253 - 2^3 */ fsquare(t1,t0); + /* 2^254 - 2^4 */ fsquare(t0,t1); + /* 2^255 - 2^5 */ fsquare(t1,t0); + /* 2^255 - 21 */ fmul(out,t1,z11); +} + +int curve25519_donna(u8 *mypublic, const u8 *secret, const u8 *basepoint); + +int +curve25519_donna(u8 *mypublic, const u8 *secret, const u8 *basepoint) { + limb bp[10], x[10], z[11], zmone[10]; + uint8_t e[32]; + int i; + + for (i = 0; i < 32; ++i) e[i] = secret[i]; + e[0] &= 248; + e[31] &= 127; + e[31] |= 64; + + fexpand(bp, basepoint); + cmult(x, z, e, bp); + crecip(zmone, z); + fmul(z, x, zmone); + fcontract(mypublic, z); + return 0; +} diff --git a/src/wraith/src/ext/ed25519/donna/README.md b/src/wraith/src/ext/ed25519/donna/README.md new file mode 100644 index 000000000..e09fc27e3 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/README.md @@ -0,0 +1,183 @@ +[ed25519](http://ed25519.cr.yp.to/) is an +[Elliptic Curve Digital Signature Algortithm](http://en.wikipedia.org/wiki/Elliptic_Curve_DSA), +developed by [Dan Bernstein](http://cr.yp.to/djb.html), +[Niels Duif](http://www.nielsduif.nl/), +[Tanja Lange](http://hyperelliptic.org/tanja), +[Peter Schwabe](http://www.cryptojedi.org/users/peter/), +and [Bo-Yin Yang](http://www.iis.sinica.edu.tw/pages/byyang/). + +This project provides performant, portable 32-bit & 64-bit implementations. All implementations are +of course constant time in regard to secret data. + +#### Performance + +SSE2 code and benches have not been updated yet. I will do those next. + +Compilers versions are gcc 4.6.3, icc 13.1.1, clang 3.4-1~exp1. + +Batch verification time (in parentheses) is the average time per 1 verification in a batch of 64 signatures. Counts are in thousands of cycles. + +Note that SSE2 performance may be less impressive on AMD & older CPUs with slower SSE ops! + +Visual Studio performance for `ge25519_scalarmult_base_niels` will lag behind a bit until optimized assembler versions of `ge25519_scalarmult_base_choose_niels` +are made. + +##### E5200 @ 2.5ghz, march=core2 + + + + + + + + + + + +
      ImplementationSigngcciccclangVerifygcciccclang
      ed25519-donna 64bit 100k110k137k327k (144k) 342k (163k) 422k (194k)
      amd64-64-24k 102k 355k (158k)
      ed25519-donna-sse2 64bit108k111k116k353k (155k) 345k (154k) 360k (161k)
      amd64-51-32k 116k 380k (175k)
      ed25519-donna-sse2 32bit147k147k156k380k (178k) 381k (173k) 430k (192k)
      ed25519-donna 32bit 597k335k380k1693k (720k)1052k (453k)1141k (493k)
      + +##### E3-1270 @ 3.4ghz, march=corei7-avx + + + + + + + + + + + +
      ImplementationSigngcciccclangVerifygcciccclang
      amd64-64-24k 68k 225k (104k)
      ed25519-donna 64bit 71k 75k 90k226k (105k) 226k (112k) 277k (125k)
      amd64-51-32k 72k 218k (107k)
      ed25519-donna-sse2 64bit 79k 82k 92k252k (122k) 259k (124k) 282k (131k)
      ed25519-donna-sse2 32bit 94k 95k103k296k (146k) 294k (137k) 306k (147k)
      ed25519-donna 32bit 525k299k316k1502k (645k)959k (418k) 954k (416k)
      + +#### Compilation + +No configuration is needed **if you are compiling against OpenSSL**. + +##### Hash Options + +If you are not compiling aginst OpenSSL, you will need a hash function. + +To use a simple/**slow** implementation of SHA-512, use `-DED25519_REFHASH` when compiling `ed25519.c`. +This should never be used except to verify the code works when OpenSSL is not available. + +To use a custom hash function, use `-DED25519_CUSTOMHASH` when compiling `ed25519.c` and put your +custom hash implementation in ed25519-hash-custom.h. The hash must have a 512bit digest and implement + + struct ed25519_hash_context; + + void ed25519_hash_init(ed25519_hash_context *ctx); + void ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen); + void ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash); + void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen); + +##### Random Options + +If you are not compiling aginst OpenSSL, you will need a random function for batch verification. + +To use a custom random function, use `-DED25519_CUSTOMRANDOM` when compiling `ed25519.c` and put your +custom hash implementation in ed25519-randombytes-custom.h. The random function must implement: + + void ED25519_FN(ed25519_randombytes_unsafe) (void *p, size_t len); + +Use `-DED25519_TEST` when compiling `ed25519.c` to use a deterministically seeded, non-thread safe CSPRNG +variant of Bob Jenkins [ISAAC](http://en.wikipedia.org/wiki/ISAAC_%28cipher%29) + +##### Minor options + +Use `-DED25519_INLINE_ASM` to disable the use of custom assembler routines and instead rely on portable C. + +Use `-DED25519_FORCE_32BIT` to force the use of 32 bit routines even when compiling for 64 bit. + +##### 32-bit + + gcc ed25519.c -m32 -O3 -c + +##### 64-bit + + gcc ed25519.c -m64 -O3 -c + +##### SSE2 + + gcc ed25519.c -m32 -O3 -c -DED25519_SSE2 -msse2 + gcc ed25519.c -m64 -O3 -c -DED25519_SSE2 + +clang and icc are also supported + + +#### Usage + +To use the code, link against `ed25519.o -mbits` and: + + #include "ed25519.h" + +Add `-lssl -lcrypto` when using OpenSSL (Some systems don't need -lcrypto? It might be trial and error). + +To generate a private key, simply generate 32 bytes from a secure +cryptographic source: + + ed25519_secret_key sk; + randombytes(sk, sizeof(ed25519_secret_key)); + +To generate a public key: + + ed25519_public_key pk; + ed25519_publickey(sk, pk); + +To sign a message: + + ed25519_signature sig; + ed25519_sign(message, message_len, sk, pk, signature); + +To verify a signature: + + int valid = ed25519_sign_open(message, message_len, pk, signature) == 0; + +To batch verify signatures: + + const unsigned char *mp[num] = {message1, message2..} + size_t ml[num] = {message_len1, message_len2..} + const unsigned char *pkp[num] = {pk1, pk2..} + const unsigned char *sigp[num] = {signature1, signature2..} + int valid[num] + + /* valid[i] will be set to 1 if the individual signature was valid, 0 otherwise */ + int all_valid = ed25519_sign_open_batch(mp, ml, pkp, sigp, num, valid) == 0; + +**Note**: Batch verification uses `ed25519_randombytes_unsafe`, implemented in +`ed25519-randombytes.h`, to generate random scalars for the verification code. +The default implementation now uses OpenSSLs `RAND_bytes`. + +Unlike the [SUPERCOP](http://bench.cr.yp.to/supercop.html) version, signatures are +not appended to messages, and there is no need for padding in front of messages. +Additionally, the secret key does not contain a copy of the public key, so it is +32 bytes instead of 64 bytes, and the public key must be provided to the signing +function. + +##### Curve25519 + +Curve25519 public keys can be generated thanks to +[Adam Langley](http://www.imperialviolet.org/2013/05/10/fastercurve25519.html) +leveraging Ed25519's precomputed basepoint scalar multiplication. + + curved25519_key sk, pk; + randombytes(sk, sizeof(curved25519_key)); + curved25519_scalarmult_basepoint(pk, sk); + +Note the name is curved25519, a combination of curve and ed25519, to prevent +name clashes. Performance is slightly faster than short message ed25519 +signing due to both using the same code for the scalar multiply. + +#### Testing + +Fuzzing against reference implemenations is now available. See [fuzz/README](fuzz/README.md). + +Building `ed25519.c` with `-DED25519_TEST` and linking with `test.c` will run basic sanity tests +and benchmark each function. `test-batch.c` has been incorporated in to `test.c`. + +`test-internals.c` is standalone and built the same way as `ed25519.c`. It tests the math primitives +with extreme values to ensure they function correctly. SSE2 is now supported. + +#### Papers + +[Available on the Ed25519 website](http://ed25519.cr.yp.to/papers.html) \ No newline at end of file diff --git a/src/wraith/src/ext/ed25519/donna/README.tor b/src/wraith/src/ext/ed25519/donna/README.tor new file mode 100644 index 000000000..026d180c2 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/README.tor @@ -0,0 +1,46 @@ + +We've made the following changes to the stock ed25519-donna from +as of 8757bd4cd209cb032853ece0ce413f122eef212c. + + * Tor uses copies of `ed25519-donna.h` and `ed25519.c`, named + `ed25519_donna_tor.h` and `ed25591_tor.c`. + + The main functional differences between the standard ed25519-donna + and the Tor specific version are: + + * The external interface has been reworked to match that provided + by Tor's copy of the SUPERCOP `ref10` code. + + * The secret (aka private) key is now stored/used in expanded form. + + * The internal math tests from `test-internals.c` have been wrapped + in a function and the entire file is included to allow for + runtime validation. + + * There's an implementation of multiplicative key blinding so we + can use it for next-gen hidden service descriptors. + + * There's an implementation of 'convert a curve25519 key to an + ed25519 key' so we can do cross-certification with curve25519 + keys. + + * `ED25519_FN(ed25519_randombytes_unsafe)` is now static. + + * `ed25519-randombytes-custom.h` has the appropriate code to call + Tor's `crypto_rand()` routine, instead of directly using OpenSSL's + CSPRNG. + + * OSX pollutes the global namespace with an `ALIGN` macro, which is + undef-ed right before the donna `ALIGN` macro is defined. + + * If building with Clang's AddressSanitizer, disable inline assembly + since the compilation will fail in `ge25519_scalarmult_base_choose_niels` + on x86_64 targets due to running out of registers. + + * On non-x86 targets, GCC's Stack Protector dislikes variables that have + alignment constraints greater than that of other primitive types. + The `ALIGN` macro is thus no-oped for all non-SSE2 builds. + + * On 32 bit x86 targets that the compiler thinks supports SSE2, always + enable SSE2 support by force defining ED25519_SSE2 (x86_64 would also + always support this, but that code path is slower). diff --git a/src/wraith/src/ext/ed25519/donna/curve25519-donna-32bit.h b/src/wraith/src/ext/ed25519/donna/curve25519-donna-32bit.h new file mode 100644 index 000000000..b0861acf0 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/curve25519-donna-32bit.h @@ -0,0 +1,579 @@ +/* + Public domain by Andrew M. + See: https://github.com/floodyberry/curve25519-donna + + 32 bit integer curve25519 implementation +*/ + +typedef uint32_t bignum25519[10]; +typedef uint32_t bignum25519align16[12]; + +static const uint32_t reduce_mask_25 = (1 << 25) - 1; +static const uint32_t reduce_mask_26 = (1 << 26) - 1; + + +/* out = in */ +DONNA_INLINE static void +curve25519_copy(bignum25519 out, const bignum25519 in) { + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; + out[3] = in[3]; + out[4] = in[4]; + out[5] = in[5]; + out[6] = in[6]; + out[7] = in[7]; + out[8] = in[8]; + out[9] = in[9]; +} + +/* out = a + b */ +DONNA_INLINE static void +curve25519_add(bignum25519 out, const bignum25519 a, const bignum25519 b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; + out[5] = a[5] + b[5]; + out[6] = a[6] + b[6]; + out[7] = a[7] + b[7]; + out[8] = a[8] + b[8]; + out[9] = a[9] + b[9]; +} + +DONNA_INLINE static void +curve25519_add_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b) { + uint32_t c; + out[0] = a[0] + b[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; + out[1] = a[1] + b[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; + out[2] = a[2] + b[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; + out[3] = a[3] + b[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; + out[4] = a[4] + b[4] + c; c = (out[4] >> 26); out[4] &= reduce_mask_26; + out[5] = a[5] + b[5] + c; c = (out[5] >> 25); out[5] &= reduce_mask_25; + out[6] = a[6] + b[6] + c; c = (out[6] >> 26); out[6] &= reduce_mask_26; + out[7] = a[7] + b[7] + c; c = (out[7] >> 25); out[7] &= reduce_mask_25; + out[8] = a[8] + b[8] + c; c = (out[8] >> 26); out[8] &= reduce_mask_26; + out[9] = a[9] + b[9] + c; c = (out[9] >> 25); out[9] &= reduce_mask_25; + out[0] += 19 * c; +} + +DONNA_INLINE static void +curve25519_add_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { + uint32_t c; + out[0] = a[0] + b[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; + out[1] = a[1] + b[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; + out[2] = a[2] + b[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; + out[3] = a[3] + b[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; + out[4] = a[4] + b[4] + c; c = (out[4] >> 26); out[4] &= reduce_mask_26; + out[5] = a[5] + b[5] + c; c = (out[5] >> 25); out[5] &= reduce_mask_25; + out[6] = a[6] + b[6] + c; c = (out[6] >> 26); out[6] &= reduce_mask_26; + out[7] = a[7] + b[7] + c; c = (out[7] >> 25); out[7] &= reduce_mask_25; + out[8] = a[8] + b[8] + c; c = (out[8] >> 26); out[8] &= reduce_mask_26; + out[9] = a[9] + b[9] + c; c = (out[9] >> 25); out[9] &= reduce_mask_25; + out[0] += 19 * c; +} + +/* multiples of p */ +static const uint32_t twoP0 = 0x07ffffda; +static const uint32_t twoP13579 = 0x03fffffe; +static const uint32_t twoP2468 = 0x07fffffe; +static const uint32_t fourP0 = 0x0fffffb4; +static const uint32_t fourP13579 = 0x07fffffc; +static const uint32_t fourP2468 = 0x0ffffffc; + +/* out = a - b */ +DONNA_INLINE static void +curve25519_sub(bignum25519 out, const bignum25519 a, const bignum25519 b) { + uint32_t c; + out[0] = twoP0 + a[0] - b[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; + out[1] = twoP13579 + a[1] - b[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; + out[2] = twoP2468 + a[2] - b[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; + out[3] = twoP13579 + a[3] - b[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; + out[4] = twoP2468 + a[4] - b[4] + c; + out[5] = twoP13579 + a[5] - b[5] ; + out[6] = twoP2468 + a[6] - b[6] ; + out[7] = twoP13579 + a[7] - b[7] ; + out[8] = twoP2468 + a[8] - b[8] ; + out[9] = twoP13579 + a[9] - b[9] ; +} + +/* out = a - b, where a is the result of a basic op (add,sub) */ +DONNA_INLINE static void +curve25519_sub_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b) { + uint32_t c; + out[0] = fourP0 + a[0] - b[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; + out[1] = fourP13579 + a[1] - b[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; + out[2] = fourP2468 + a[2] - b[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; + out[3] = fourP13579 + a[3] - b[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; + out[4] = fourP2468 + a[4] - b[4] + c; c = (out[4] >> 26); out[4] &= reduce_mask_26; + out[5] = fourP13579 + a[5] - b[5] + c; c = (out[5] >> 25); out[5] &= reduce_mask_25; + out[6] = fourP2468 + a[6] - b[6] + c; c = (out[6] >> 26); out[6] &= reduce_mask_26; + out[7] = fourP13579 + a[7] - b[7] + c; c = (out[7] >> 25); out[7] &= reduce_mask_25; + out[8] = fourP2468 + a[8] - b[8] + c; c = (out[8] >> 26); out[8] &= reduce_mask_26; + out[9] = fourP13579 + a[9] - b[9] + c; c = (out[9] >> 25); out[9] &= reduce_mask_25; + out[0] += 19 * c; +} + +DONNA_INLINE static void +curve25519_sub_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { + uint32_t c; + out[0] = fourP0 + a[0] - b[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; + out[1] = fourP13579 + a[1] - b[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; + out[2] = fourP2468 + a[2] - b[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; + out[3] = fourP13579 + a[3] - b[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; + out[4] = fourP2468 + a[4] - b[4] + c; c = (out[4] >> 26); out[4] &= reduce_mask_26; + out[5] = fourP13579 + a[5] - b[5] + c; c = (out[5] >> 25); out[5] &= reduce_mask_25; + out[6] = fourP2468 + a[6] - b[6] + c; c = (out[6] >> 26); out[6] &= reduce_mask_26; + out[7] = fourP13579 + a[7] - b[7] + c; c = (out[7] >> 25); out[7] &= reduce_mask_25; + out[8] = fourP2468 + a[8] - b[8] + c; c = (out[8] >> 26); out[8] &= reduce_mask_26; + out[9] = fourP13579 + a[9] - b[9] + c; c = (out[9] >> 25); out[9] &= reduce_mask_25; + out[0] += 19 * c; +} + +/* out = -a */ +DONNA_INLINE static void +curve25519_neg(bignum25519 out, const bignum25519 a) { + uint32_t c; + out[0] = twoP0 - a[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; + out[1] = twoP13579 - a[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; + out[2] = twoP2468 - a[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; + out[3] = twoP13579 - a[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; + out[4] = twoP2468 - a[4] + c; c = (out[4] >> 26); out[4] &= reduce_mask_26; + out[5] = twoP13579 - a[5] + c; c = (out[5] >> 25); out[5] &= reduce_mask_25; + out[6] = twoP2468 - a[6] + c; c = (out[6] >> 26); out[6] &= reduce_mask_26; + out[7] = twoP13579 - a[7] + c; c = (out[7] >> 25); out[7] &= reduce_mask_25; + out[8] = twoP2468 - a[8] + c; c = (out[8] >> 26); out[8] &= reduce_mask_26; + out[9] = twoP13579 - a[9] + c; c = (out[9] >> 25); out[9] &= reduce_mask_25; + out[0] += 19 * c; +} + +/* out = a * b */ +#define curve25519_mul_noinline curve25519_mul +static void +curve25519_mul(bignum25519 out, const bignum25519 a, const bignum25519 b) { + uint32_t r0,r1,r2,r3,r4,r5,r6,r7,r8,r9; + uint32_t s0,s1,s2,s3,s4,s5,s6,s7,s8,s9; + uint64_t m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,c; + uint32_t p; + + r0 = b[0]; + r1 = b[1]; + r2 = b[2]; + r3 = b[3]; + r4 = b[4]; + r5 = b[5]; + r6 = b[6]; + r7 = b[7]; + r8 = b[8]; + r9 = b[9]; + + s0 = a[0]; + s1 = a[1]; + s2 = a[2]; + s3 = a[3]; + s4 = a[4]; + s5 = a[5]; + s6 = a[6]; + s7 = a[7]; + s8 = a[8]; + s9 = a[9]; + + m1 = mul32x32_64(r0, s1) + mul32x32_64(r1, s0); + m3 = mul32x32_64(r0, s3) + mul32x32_64(r1, s2) + mul32x32_64(r2, s1) + mul32x32_64(r3, s0); + m5 = mul32x32_64(r0, s5) + mul32x32_64(r1, s4) + mul32x32_64(r2, s3) + mul32x32_64(r3, s2) + mul32x32_64(r4, s1) + mul32x32_64(r5, s0); + m7 = mul32x32_64(r0, s7) + mul32x32_64(r1, s6) + mul32x32_64(r2, s5) + mul32x32_64(r3, s4) + mul32x32_64(r4, s3) + mul32x32_64(r5, s2) + mul32x32_64(r6, s1) + mul32x32_64(r7, s0); + m9 = mul32x32_64(r0, s9) + mul32x32_64(r1, s8) + mul32x32_64(r2, s7) + mul32x32_64(r3, s6) + mul32x32_64(r4, s5) + mul32x32_64(r5, s4) + mul32x32_64(r6, s3) + mul32x32_64(r7, s2) + mul32x32_64(r8, s1) + mul32x32_64(r9, s0); + + r1 *= 2; + r3 *= 2; + r5 *= 2; + r7 *= 2; + + m0 = mul32x32_64(r0, s0); + m2 = mul32x32_64(r0, s2) + mul32x32_64(r1, s1) + mul32x32_64(r2, s0); + m4 = mul32x32_64(r0, s4) + mul32x32_64(r1, s3) + mul32x32_64(r2, s2) + mul32x32_64(r3, s1) + mul32x32_64(r4, s0); + m6 = mul32x32_64(r0, s6) + mul32x32_64(r1, s5) + mul32x32_64(r2, s4) + mul32x32_64(r3, s3) + mul32x32_64(r4, s2) + mul32x32_64(r5, s1) + mul32x32_64(r6, s0); + m8 = mul32x32_64(r0, s8) + mul32x32_64(r1, s7) + mul32x32_64(r2, s6) + mul32x32_64(r3, s5) + mul32x32_64(r4, s4) + mul32x32_64(r5, s3) + mul32x32_64(r6, s2) + mul32x32_64(r7, s1) + mul32x32_64(r8, s0); + + r1 *= 19; + r2 *= 19; + r3 = (r3 / 2) * 19; + r4 *= 19; + r5 = (r5 / 2) * 19; + r6 *= 19; + r7 = (r7 / 2) * 19; + r8 *= 19; + r9 *= 19; + + m1 += (mul32x32_64(r9, s2) + mul32x32_64(r8, s3) + mul32x32_64(r7, s4) + mul32x32_64(r6, s5) + mul32x32_64(r5, s6) + mul32x32_64(r4, s7) + mul32x32_64(r3, s8) + mul32x32_64(r2, s9)); + m3 += (mul32x32_64(r9, s4) + mul32x32_64(r8, s5) + mul32x32_64(r7, s6) + mul32x32_64(r6, s7) + mul32x32_64(r5, s8) + mul32x32_64(r4, s9)); + m5 += (mul32x32_64(r9, s6) + mul32x32_64(r8, s7) + mul32x32_64(r7, s8) + mul32x32_64(r6, s9)); + m7 += (mul32x32_64(r9, s8) + mul32x32_64(r8, s9)); + + r3 *= 2; + r5 *= 2; + r7 *= 2; + r9 *= 2; + + m0 += (mul32x32_64(r9, s1) + mul32x32_64(r8, s2) + mul32x32_64(r7, s3) + mul32x32_64(r6, s4) + mul32x32_64(r5, s5) + mul32x32_64(r4, s6) + mul32x32_64(r3, s7) + mul32x32_64(r2, s8) + mul32x32_64(r1, s9)); + m2 += (mul32x32_64(r9, s3) + mul32x32_64(r8, s4) + mul32x32_64(r7, s5) + mul32x32_64(r6, s6) + mul32x32_64(r5, s7) + mul32x32_64(r4, s8) + mul32x32_64(r3, s9)); + m4 += (mul32x32_64(r9, s5) + mul32x32_64(r8, s6) + mul32x32_64(r7, s7) + mul32x32_64(r6, s8) + mul32x32_64(r5, s9)); + m6 += (mul32x32_64(r9, s7) + mul32x32_64(r8, s8) + mul32x32_64(r7, s9)); + m8 += (mul32x32_64(r9, s9)); + + r0 = (uint32_t)m0 & reduce_mask_26; c = (m0 >> 26); + m1 += c; r1 = (uint32_t)m1 & reduce_mask_25; c = (m1 >> 25); + m2 += c; r2 = (uint32_t)m2 & reduce_mask_26; c = (m2 >> 26); + m3 += c; r3 = (uint32_t)m3 & reduce_mask_25; c = (m3 >> 25); + m4 += c; r4 = (uint32_t)m4 & reduce_mask_26; c = (m4 >> 26); + m5 += c; r5 = (uint32_t)m5 & reduce_mask_25; c = (m5 >> 25); + m6 += c; r6 = (uint32_t)m6 & reduce_mask_26; c = (m6 >> 26); + m7 += c; r7 = (uint32_t)m7 & reduce_mask_25; c = (m7 >> 25); + m8 += c; r8 = (uint32_t)m8 & reduce_mask_26; c = (m8 >> 26); + m9 += c; r9 = (uint32_t)m9 & reduce_mask_25; p = (uint32_t)(m9 >> 25); + m0 = r0 + mul32x32_64(p,19); r0 = (uint32_t)m0 & reduce_mask_26; p = (uint32_t)(m0 >> 26); + r1 += p; + + out[0] = r0; + out[1] = r1; + out[2] = r2; + out[3] = r3; + out[4] = r4; + out[5] = r5; + out[6] = r6; + out[7] = r7; + out[8] = r8; + out[9] = r9; +} + +/* out = in*in */ +static void +curve25519_square(bignum25519 out, const bignum25519 in) { + uint32_t r0,r1,r2,r3,r4,r5,r6,r7,r8,r9; + uint32_t d6,d7,d8,d9; + uint64_t m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,c; + uint32_t p; + + r0 = in[0]; + r1 = in[1]; + r2 = in[2]; + r3 = in[3]; + r4 = in[4]; + r5 = in[5]; + r6 = in[6]; + r7 = in[7]; + r8 = in[8]; + r9 = in[9]; + + m0 = mul32x32_64(r0, r0); + r0 *= 2; + m1 = mul32x32_64(r0, r1); + m2 = mul32x32_64(r0, r2) + mul32x32_64(r1, r1 * 2); + r1 *= 2; + m3 = mul32x32_64(r0, r3) + mul32x32_64(r1, r2 ); + m4 = mul32x32_64(r0, r4) + mul32x32_64(r1, r3 * 2) + mul32x32_64(r2, r2); + r2 *= 2; + m5 = mul32x32_64(r0, r5) + mul32x32_64(r1, r4 ) + mul32x32_64(r2, r3); + m6 = mul32x32_64(r0, r6) + mul32x32_64(r1, r5 * 2) + mul32x32_64(r2, r4) + mul32x32_64(r3, r3 * 2); + r3 *= 2; + m7 = mul32x32_64(r0, r7) + mul32x32_64(r1, r6 ) + mul32x32_64(r2, r5) + mul32x32_64(r3, r4 ); + m8 = mul32x32_64(r0, r8) + mul32x32_64(r1, r7 * 2) + mul32x32_64(r2, r6) + mul32x32_64(r3, r5 * 2) + mul32x32_64(r4, r4 ); + m9 = mul32x32_64(r0, r9) + mul32x32_64(r1, r8 ) + mul32x32_64(r2, r7) + mul32x32_64(r3, r6 ) + mul32x32_64(r4, r5 * 2); + + d6 = r6 * 19; + d7 = r7 * 2 * 19; + d8 = r8 * 19; + d9 = r9 * 2 * 19; + + m0 += (mul32x32_64(d9, r1 ) + mul32x32_64(d8, r2 ) + mul32x32_64(d7, r3 ) + mul32x32_64(d6, r4 * 2) + mul32x32_64(r5, r5 * 2 * 19)); + m1 += (mul32x32_64(d9, r2 / 2) + mul32x32_64(d8, r3 ) + mul32x32_64(d7, r4 ) + mul32x32_64(d6, r5 * 2)); + m2 += (mul32x32_64(d9, r3 ) + mul32x32_64(d8, r4 * 2) + mul32x32_64(d7, r5 * 2) + mul32x32_64(d6, r6 )); + m3 += (mul32x32_64(d9, r4 ) + mul32x32_64(d8, r5 * 2) + mul32x32_64(d7, r6 )); + m4 += (mul32x32_64(d9, r5 * 2) + mul32x32_64(d8, r6 * 2) + mul32x32_64(d7, r7 )); + m5 += (mul32x32_64(d9, r6 ) + mul32x32_64(d8, r7 * 2)); + m6 += (mul32x32_64(d9, r7 * 2) + mul32x32_64(d8, r8 )); + m7 += (mul32x32_64(d9, r8 )); + m8 += (mul32x32_64(d9, r9 )); + + r0 = (uint32_t)m0 & reduce_mask_26; c = (m0 >> 26); + m1 += c; r1 = (uint32_t)m1 & reduce_mask_25; c = (m1 >> 25); + m2 += c; r2 = (uint32_t)m2 & reduce_mask_26; c = (m2 >> 26); + m3 += c; r3 = (uint32_t)m3 & reduce_mask_25; c = (m3 >> 25); + m4 += c; r4 = (uint32_t)m4 & reduce_mask_26; c = (m4 >> 26); + m5 += c; r5 = (uint32_t)m5 & reduce_mask_25; c = (m5 >> 25); + m6 += c; r6 = (uint32_t)m6 & reduce_mask_26; c = (m6 >> 26); + m7 += c; r7 = (uint32_t)m7 & reduce_mask_25; c = (m7 >> 25); + m8 += c; r8 = (uint32_t)m8 & reduce_mask_26; c = (m8 >> 26); + m9 += c; r9 = (uint32_t)m9 & reduce_mask_25; p = (uint32_t)(m9 >> 25); + m0 = r0 + mul32x32_64(p,19); r0 = (uint32_t)m0 & reduce_mask_26; p = (uint32_t)(m0 >> 26); + r1 += p; + + out[0] = r0; + out[1] = r1; + out[2] = r2; + out[3] = r3; + out[4] = r4; + out[5] = r5; + out[6] = r6; + out[7] = r7; + out[8] = r8; + out[9] = r9; +} + + +/* out = in ^ (2 * count) */ +static void +curve25519_square_times(bignum25519 out, const bignum25519 in, int count) { + uint32_t r0,r1,r2,r3,r4,r5,r6,r7,r8,r9; + uint32_t d6,d7,d8,d9; + uint64_t m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,c; + uint32_t p; + + r0 = in[0]; + r1 = in[1]; + r2 = in[2]; + r3 = in[3]; + r4 = in[4]; + r5 = in[5]; + r6 = in[6]; + r7 = in[7]; + r8 = in[8]; + r9 = in[9]; + + do { + m0 = mul32x32_64(r0, r0); + r0 *= 2; + m1 = mul32x32_64(r0, r1); + m2 = mul32x32_64(r0, r2) + mul32x32_64(r1, r1 * 2); + r1 *= 2; + m3 = mul32x32_64(r0, r3) + mul32x32_64(r1, r2 ); + m4 = mul32x32_64(r0, r4) + mul32x32_64(r1, r3 * 2) + mul32x32_64(r2, r2); + r2 *= 2; + m5 = mul32x32_64(r0, r5) + mul32x32_64(r1, r4 ) + mul32x32_64(r2, r3); + m6 = mul32x32_64(r0, r6) + mul32x32_64(r1, r5 * 2) + mul32x32_64(r2, r4) + mul32x32_64(r3, r3 * 2); + r3 *= 2; + m7 = mul32x32_64(r0, r7) + mul32x32_64(r1, r6 ) + mul32x32_64(r2, r5) + mul32x32_64(r3, r4 ); + m8 = mul32x32_64(r0, r8) + mul32x32_64(r1, r7 * 2) + mul32x32_64(r2, r6) + mul32x32_64(r3, r5 * 2) + mul32x32_64(r4, r4 ); + m9 = mul32x32_64(r0, r9) + mul32x32_64(r1, r8 ) + mul32x32_64(r2, r7) + mul32x32_64(r3, r6 ) + mul32x32_64(r4, r5 * 2); + + d6 = r6 * 19; + d7 = r7 * 2 * 19; + d8 = r8 * 19; + d9 = r9 * 2 * 19; + + m0 += (mul32x32_64(d9, r1 ) + mul32x32_64(d8, r2 ) + mul32x32_64(d7, r3 ) + mul32x32_64(d6, r4 * 2) + mul32x32_64(r5, r5 * 2 * 19)); + m1 += (mul32x32_64(d9, r2 / 2) + mul32x32_64(d8, r3 ) + mul32x32_64(d7, r4 ) + mul32x32_64(d6, r5 * 2)); + m2 += (mul32x32_64(d9, r3 ) + mul32x32_64(d8, r4 * 2) + mul32x32_64(d7, r5 * 2) + mul32x32_64(d6, r6 )); + m3 += (mul32x32_64(d9, r4 ) + mul32x32_64(d8, r5 * 2) + mul32x32_64(d7, r6 )); + m4 += (mul32x32_64(d9, r5 * 2) + mul32x32_64(d8, r6 * 2) + mul32x32_64(d7, r7 )); + m5 += (mul32x32_64(d9, r6 ) + mul32x32_64(d8, r7 * 2)); + m6 += (mul32x32_64(d9, r7 * 2) + mul32x32_64(d8, r8 )); + m7 += (mul32x32_64(d9, r8 )); + m8 += (mul32x32_64(d9, r9 )); + + r0 = (uint32_t)m0 & reduce_mask_26; c = (m0 >> 26); + m1 += c; r1 = (uint32_t)m1 & reduce_mask_25; c = (m1 >> 25); + m2 += c; r2 = (uint32_t)m2 & reduce_mask_26; c = (m2 >> 26); + m3 += c; r3 = (uint32_t)m3 & reduce_mask_25; c = (m3 >> 25); + m4 += c; r4 = (uint32_t)m4 & reduce_mask_26; c = (m4 >> 26); + m5 += c; r5 = (uint32_t)m5 & reduce_mask_25; c = (m5 >> 25); + m6 += c; r6 = (uint32_t)m6 & reduce_mask_26; c = (m6 >> 26); + m7 += c; r7 = (uint32_t)m7 & reduce_mask_25; c = (m7 >> 25); + m8 += c; r8 = (uint32_t)m8 & reduce_mask_26; c = (m8 >> 26); + m9 += c; r9 = (uint32_t)m9 & reduce_mask_25; p = (uint32_t)(m9 >> 25); + m0 = r0 + mul32x32_64(p,19); r0 = (uint32_t)m0 & reduce_mask_26; p = (uint32_t)(m0 >> 26); + r1 += p; + } while (--count); + + out[0] = r0; + out[1] = r1; + out[2] = r2; + out[3] = r3; + out[4] = r4; + out[5] = r5; + out[6] = r6; + out[7] = r7; + out[8] = r8; + out[9] = r9; +} + +/* Take a little-endian, 32-byte number and expand it into polynomial form */ +static void +curve25519_expand(bignum25519 out, const unsigned char in[32]) { + static const union { uint8_t b[2]; uint16_t s; } endian_check = {{1,0}}; + uint32_t x0,x1,x2,x3,x4,x5,x6,x7; + + if (endian_check.s == 1) { + x0 = *(uint32_t *)(in + 0); + x1 = *(uint32_t *)(in + 4); + x2 = *(uint32_t *)(in + 8); + x3 = *(uint32_t *)(in + 12); + x4 = *(uint32_t *)(in + 16); + x5 = *(uint32_t *)(in + 20); + x6 = *(uint32_t *)(in + 24); + x7 = *(uint32_t *)(in + 28); + } else { + #define F(s) \ + ((((uint32_t)in[s + 0]) ) | \ + (((uint32_t)in[s + 1]) << 8) | \ + (((uint32_t)in[s + 2]) << 16) | \ + (((uint32_t)in[s + 3]) << 24)) + x0 = F(0); + x1 = F(4); + x2 = F(8); + x3 = F(12); + x4 = F(16); + x5 = F(20); + x6 = F(24); + x7 = F(28); + #undef F + } + + out[0] = ( x0 ) & 0x3ffffff; + out[1] = ((((uint64_t)x1 << 32) | x0) >> 26) & 0x1ffffff; + out[2] = ((((uint64_t)x2 << 32) | x1) >> 19) & 0x3ffffff; + out[3] = ((((uint64_t)x3 << 32) | x2) >> 13) & 0x1ffffff; + out[4] = (( x3) >> 6) & 0x3ffffff; + out[5] = ( x4 ) & 0x1ffffff; + out[6] = ((((uint64_t)x5 << 32) | x4) >> 25) & 0x3ffffff; + out[7] = ((((uint64_t)x6 << 32) | x5) >> 19) & 0x1ffffff; + out[8] = ((((uint64_t)x7 << 32) | x6) >> 12) & 0x3ffffff; + out[9] = (( x7) >> 6) & 0x1ffffff; +} + +/* Take a fully reduced polynomial form number and contract it into a + * little-endian, 32-byte array + */ +static void +curve25519_contract(unsigned char out[32], const bignum25519 in) { + bignum25519 f; + curve25519_copy(f, in); + + #define carry_pass() \ + f[1] += f[0] >> 26; f[0] &= reduce_mask_26; \ + f[2] += f[1] >> 25; f[1] &= reduce_mask_25; \ + f[3] += f[2] >> 26; f[2] &= reduce_mask_26; \ + f[4] += f[3] >> 25; f[3] &= reduce_mask_25; \ + f[5] += f[4] >> 26; f[4] &= reduce_mask_26; \ + f[6] += f[5] >> 25; f[5] &= reduce_mask_25; \ + f[7] += f[6] >> 26; f[6] &= reduce_mask_26; \ + f[8] += f[7] >> 25; f[7] &= reduce_mask_25; \ + f[9] += f[8] >> 26; f[8] &= reduce_mask_26; + + #define carry_pass_full() \ + carry_pass() \ + f[0] += 19 * (f[9] >> 25); f[9] &= reduce_mask_25; + + #define carry_pass_final() \ + carry_pass() \ + f[9] &= reduce_mask_25; + + carry_pass_full() + carry_pass_full() + + /* now t is between 0 and 2^255-1, properly carried. */ + /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */ + f[0] += 19; + carry_pass_full() + + /* now between 19 and 2^255-1 in both cases, and offset by 19. */ + f[0] += (reduce_mask_26 + 1) - 19; + f[1] += (reduce_mask_25 + 1) - 1; + f[2] += (reduce_mask_26 + 1) - 1; + f[3] += (reduce_mask_25 + 1) - 1; + f[4] += (reduce_mask_26 + 1) - 1; + f[5] += (reduce_mask_25 + 1) - 1; + f[6] += (reduce_mask_26 + 1) - 1; + f[7] += (reduce_mask_25 + 1) - 1; + f[8] += (reduce_mask_26 + 1) - 1; + f[9] += (reduce_mask_25 + 1) - 1; + + /* now between 2^255 and 2^256-20, and offset by 2^255. */ + carry_pass_final() + + #undef carry_pass + #undef carry_full + #undef carry_final + + f[1] <<= 2; + f[2] <<= 3; + f[3] <<= 5; + f[4] <<= 6; + f[6] <<= 1; + f[7] <<= 3; + f[8] <<= 4; + f[9] <<= 6; + + #define F(i, s) \ + out[s+0] |= (unsigned char )(f[i] & 0xff); \ + out[s+1] = (unsigned char )((f[i] >> 8) & 0xff); \ + out[s+2] = (unsigned char )((f[i] >> 16) & 0xff); \ + out[s+3] = (unsigned char )((f[i] >> 24) & 0xff); + + out[0] = 0; + out[16] = 0; + F(0,0); + F(1,3); + F(2,6); + F(3,9); + F(4,12); + F(5,16); + F(6,19); + F(7,22); + F(8,25); + F(9,28); + #undef F +} + + +/* out = (flag) ? in : out */ +DONNA_INLINE static void +curve25519_move_conditional_bytes(uint8_t out[96], const uint8_t in[96], uint32_t flag) { + const uint32_t nb = flag - 1, b = ~nb; + const uint32_t *inl = (const uint32_t *)in; + uint32_t *outl = (uint32_t *)out; + outl[0] = (outl[0] & nb) | (inl[0] & b); + outl[1] = (outl[1] & nb) | (inl[1] & b); + outl[2] = (outl[2] & nb) | (inl[2] & b); + outl[3] = (outl[3] & nb) | (inl[3] & b); + outl[4] = (outl[4] & nb) | (inl[4] & b); + outl[5] = (outl[5] & nb) | (inl[5] & b); + outl[6] = (outl[6] & nb) | (inl[6] & b); + outl[7] = (outl[7] & nb) | (inl[7] & b); + outl[8] = (outl[8] & nb) | (inl[8] & b); + outl[9] = (outl[9] & nb) | (inl[9] & b); + outl[10] = (outl[10] & nb) | (inl[10] & b); + outl[11] = (outl[11] & nb) | (inl[11] & b); + outl[12] = (outl[12] & nb) | (inl[12] & b); + outl[13] = (outl[13] & nb) | (inl[13] & b); + outl[14] = (outl[14] & nb) | (inl[14] & b); + outl[15] = (outl[15] & nb) | (inl[15] & b); + outl[16] = (outl[16] & nb) | (inl[16] & b); + outl[17] = (outl[17] & nb) | (inl[17] & b); + outl[18] = (outl[18] & nb) | (inl[18] & b); + outl[19] = (outl[19] & nb) | (inl[19] & b); + outl[20] = (outl[20] & nb) | (inl[20] & b); + outl[21] = (outl[21] & nb) | (inl[21] & b); + outl[22] = (outl[22] & nb) | (inl[22] & b); + outl[23] = (outl[23] & nb) | (inl[23] & b); + +} + +/* if (iswap) swap(a, b) */ +DONNA_INLINE static void +curve25519_swap_conditional(bignum25519 a, bignum25519 b, uint32_t iswap) { + const uint32_t swap = (uint32_t)(-(int32_t)iswap); + uint32_t x0,x1,x2,x3,x4,x5,x6,x7,x8,x9; + + x0 = swap & (a[0] ^ b[0]); a[0] ^= x0; b[0] ^= x0; + x1 = swap & (a[1] ^ b[1]); a[1] ^= x1; b[1] ^= x1; + x2 = swap & (a[2] ^ b[2]); a[2] ^= x2; b[2] ^= x2; + x3 = swap & (a[3] ^ b[3]); a[3] ^= x3; b[3] ^= x3; + x4 = swap & (a[4] ^ b[4]); a[4] ^= x4; b[4] ^= x4; + x5 = swap & (a[5] ^ b[5]); a[5] ^= x5; b[5] ^= x5; + x6 = swap & (a[6] ^ b[6]); a[6] ^= x6; b[6] ^= x6; + x7 = swap & (a[7] ^ b[7]); a[7] ^= x7; b[7] ^= x7; + x8 = swap & (a[8] ^ b[8]); a[8] ^= x8; b[8] ^= x8; + x9 = swap & (a[9] ^ b[9]); a[9] ^= x9; b[9] ^= x9; +} diff --git a/src/wraith/src/ext/ed25519/donna/curve25519-donna-64bit.h b/src/wraith/src/ext/ed25519/donna/curve25519-donna-64bit.h new file mode 100644 index 000000000..50c991676 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/curve25519-donna-64bit.h @@ -0,0 +1,413 @@ +/* + Public domain by Adam Langley & + Andrew M. + See: https://github.com/floodyberry/curve25519-donna + + 64bit integer curve25519 implementation +*/ + +typedef uint64_t bignum25519[5]; + +//static const uint64_t reduce_mask_40 = ((uint64_t)1 << 40) - 1; +static const uint64_t reduce_mask_51 = ((uint64_t)1 << 51) - 1; +//static const uint64_t reduce_mask_56 = ((uint64_t)1 << 56) - 1; + +/* out = in */ +DONNA_INLINE static void +curve25519_copy(bignum25519 out, const bignum25519 in) { + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; + out[3] = in[3]; + out[4] = in[4]; +} + +/* out = a + b */ +DONNA_INLINE static void +curve25519_add(bignum25519 out, const bignum25519 a, const bignum25519 b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; +} + +/* out = a + b, where a and/or b are the result of a basic op (add,sub) */ +DONNA_INLINE static void +curve25519_add_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; +} + +DONNA_INLINE static void +curve25519_add_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { + uint64_t c; + out[0] = a[0] + b[0] ; c = (out[0] >> 51); out[0] &= reduce_mask_51; + out[1] = a[1] + b[1] + c; c = (out[1] >> 51); out[1] &= reduce_mask_51; + out[2] = a[2] + b[2] + c; c = (out[2] >> 51); out[2] &= reduce_mask_51; + out[3] = a[3] + b[3] + c; c = (out[3] >> 51); out[3] &= reduce_mask_51; + out[4] = a[4] + b[4] + c; c = (out[4] >> 51); out[4] &= reduce_mask_51; + out[0] += c * 19; +} + +/* multiples of p */ +static const uint64_t twoP0 = 0x0fffffffffffda; +static const uint64_t twoP1234 = 0x0ffffffffffffe; +static const uint64_t fourP0 = 0x1fffffffffffb4; +static const uint64_t fourP1234 = 0x1ffffffffffffc; + +/* out = a - b */ +DONNA_INLINE static void +curve25519_sub(bignum25519 out, const bignum25519 a, const bignum25519 b) { + out[0] = a[0] + twoP0 - b[0]; + out[1] = a[1] + twoP1234 - b[1]; + out[2] = a[2] + twoP1234 - b[2]; + out[3] = a[3] + twoP1234 - b[3]; + out[4] = a[4] + twoP1234 - b[4]; +} + +/* out = a - b, where a and/or b are the result of a basic op (add,sub) */ +DONNA_INLINE static void +curve25519_sub_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b) { + out[0] = a[0] + fourP0 - b[0]; + out[1] = a[1] + fourP1234 - b[1]; + out[2] = a[2] + fourP1234 - b[2]; + out[3] = a[3] + fourP1234 - b[3]; + out[4] = a[4] + fourP1234 - b[4]; +} + +DONNA_INLINE static void +curve25519_sub_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { + uint64_t c; + out[0] = a[0] + fourP0 - b[0] ; c = (out[0] >> 51); out[0] &= reduce_mask_51; + out[1] = a[1] + fourP1234 - b[1] + c; c = (out[1] >> 51); out[1] &= reduce_mask_51; + out[2] = a[2] + fourP1234 - b[2] + c; c = (out[2] >> 51); out[2] &= reduce_mask_51; + out[3] = a[3] + fourP1234 - b[3] + c; c = (out[3] >> 51); out[3] &= reduce_mask_51; + out[4] = a[4] + fourP1234 - b[4] + c; c = (out[4] >> 51); out[4] &= reduce_mask_51; + out[0] += c * 19; +} + +/* out = -a */ +DONNA_INLINE static void +curve25519_neg(bignum25519 out, const bignum25519 a) { + uint64_t c; + out[0] = twoP0 - a[0] ; c = (out[0] >> 51); out[0] &= reduce_mask_51; + out[1] = twoP1234 - a[1] + c; c = (out[1] >> 51); out[1] &= reduce_mask_51; + out[2] = twoP1234 - a[2] + c; c = (out[2] >> 51); out[2] &= reduce_mask_51; + out[3] = twoP1234 - a[3] + c; c = (out[3] >> 51); out[3] &= reduce_mask_51; + out[4] = twoP1234 - a[4] + c; c = (out[4] >> 51); out[4] &= reduce_mask_51; + out[0] += c * 19; +} + +/* out = a * b */ +DONNA_INLINE static void +curve25519_mul(bignum25519 out, const bignum25519 in2, const bignum25519 in) { +#if !defined(HAVE_NATIVE_UINT128) + uint128_t mul; +#endif + uint128_t t[5]; + uint64_t r0,r1,r2,r3,r4,s0,s1,s2,s3,s4,c; + + r0 = in[0]; + r1 = in[1]; + r2 = in[2]; + r3 = in[3]; + r4 = in[4]; + + s0 = in2[0]; + s1 = in2[1]; + s2 = in2[2]; + s3 = in2[3]; + s4 = in2[4]; + +#if defined(HAVE_NATIVE_UINT128) + t[0] = ((uint128_t) r0) * s0; + t[1] = ((uint128_t) r0) * s1 + ((uint128_t) r1) * s0; + t[2] = ((uint128_t) r0) * s2 + ((uint128_t) r2) * s0 + ((uint128_t) r1) * s1; + t[3] = ((uint128_t) r0) * s3 + ((uint128_t) r3) * s0 + ((uint128_t) r1) * s2 + ((uint128_t) r2) * s1; + t[4] = ((uint128_t) r0) * s4 + ((uint128_t) r4) * s0 + ((uint128_t) r3) * s1 + ((uint128_t) r1) * s3 + ((uint128_t) r2) * s2; +#else + mul64x64_128(t[0], r0, s0) + mul64x64_128(t[1], r0, s1) mul64x64_128(mul, r1, s0) add128(t[1], mul) + mul64x64_128(t[2], r0, s2) mul64x64_128(mul, r2, s0) add128(t[2], mul) mul64x64_128(mul, r1, s1) add128(t[2], mul) + mul64x64_128(t[3], r0, s3) mul64x64_128(mul, r3, s0) add128(t[3], mul) mul64x64_128(mul, r1, s2) add128(t[3], mul) mul64x64_128(mul, r2, s1) add128(t[3], mul) + mul64x64_128(t[4], r0, s4) mul64x64_128(mul, r4, s0) add128(t[4], mul) mul64x64_128(mul, r3, s1) add128(t[4], mul) mul64x64_128(mul, r1, s3) add128(t[4], mul) mul64x64_128(mul, r2, s2) add128(t[4], mul) +#endif + + r1 *= 19; + r2 *= 19; + r3 *= 19; + r4 *= 19; + +#if defined(HAVE_NATIVE_UINT128) + t[0] += ((uint128_t) r4) * s1 + ((uint128_t) r1) * s4 + ((uint128_t) r2) * s3 + ((uint128_t) r3) * s2; + t[1] += ((uint128_t) r4) * s2 + ((uint128_t) r2) * s4 + ((uint128_t) r3) * s3; + t[2] += ((uint128_t) r4) * s3 + ((uint128_t) r3) * s4; + t[3] += ((uint128_t) r4) * s4; +#else + mul64x64_128(mul, r4, s1) add128(t[0], mul) mul64x64_128(mul, r1, s4) add128(t[0], mul) mul64x64_128(mul, r2, s3) add128(t[0], mul) mul64x64_128(mul, r3, s2) add128(t[0], mul) + mul64x64_128(mul, r4, s2) add128(t[1], mul) mul64x64_128(mul, r2, s4) add128(t[1], mul) mul64x64_128(mul, r3, s3) add128(t[1], mul) + mul64x64_128(mul, r4, s3) add128(t[2], mul) mul64x64_128(mul, r3, s4) add128(t[2], mul) + mul64x64_128(mul, r4, s4) add128(t[3], mul) +#endif + + + r0 = lo128(t[0]) & reduce_mask_51; shr128(c, t[0], 51); + add128_64(t[1], c) r1 = lo128(t[1]) & reduce_mask_51; shr128(c, t[1], 51); + add128_64(t[2], c) r2 = lo128(t[2]) & reduce_mask_51; shr128(c, t[2], 51); + add128_64(t[3], c) r3 = lo128(t[3]) & reduce_mask_51; shr128(c, t[3], 51); + add128_64(t[4], c) r4 = lo128(t[4]) & reduce_mask_51; shr128(c, t[4], 51); + r0 += c * 19; c = r0 >> 51; r0 = r0 & reduce_mask_51; + r1 += c; + + out[0] = r0; + out[1] = r1; + out[2] = r2; + out[3] = r3; + out[4] = r4; +} + +DONNA_NOINLINE static void +curve25519_mul_noinline(bignum25519 out, const bignum25519 in2, const bignum25519 in) { + curve25519_mul(out, in2, in); +} + +/* out = in^(2 * count) */ +DONNA_NOINLINE static void +curve25519_square_times(bignum25519 out, const bignum25519 in, uint64_t count) { +#if !defined(HAVE_NATIVE_UINT128) + uint128_t mul; +#endif + uint128_t t[5]; + uint64_t r0,r1,r2,r3,r4,c; + uint64_t d0,d1,d2,d4,d419; + + r0 = in[0]; + r1 = in[1]; + r2 = in[2]; + r3 = in[3]; + r4 = in[4]; + + do { + d0 = r0 * 2; + d1 = r1 * 2; + d2 = r2 * 2 * 19; + d419 = r4 * 19; + d4 = d419 * 2; + +#if defined(HAVE_NATIVE_UINT128) + t[0] = ((uint128_t) r0) * r0 + ((uint128_t) d4) * r1 + (((uint128_t) d2) * (r3 )); + t[1] = ((uint128_t) d0) * r1 + ((uint128_t) d4) * r2 + (((uint128_t) r3) * (r3 * 19)); + t[2] = ((uint128_t) d0) * r2 + ((uint128_t) r1) * r1 + (((uint128_t) d4) * (r3 )); + t[3] = ((uint128_t) d0) * r3 + ((uint128_t) d1) * r2 + (((uint128_t) r4) * (d419 )); + t[4] = ((uint128_t) d0) * r4 + ((uint128_t) d1) * r3 + (((uint128_t) r2) * (r2 )); +#else + mul64x64_128(t[0], r0, r0) mul64x64_128(mul, d4, r1) add128(t[0], mul) mul64x64_128(mul, d2, r3) add128(t[0], mul) + mul64x64_128(t[1], d0, r1) mul64x64_128(mul, d4, r2) add128(t[1], mul) mul64x64_128(mul, r3, r3 * 19) add128(t[1], mul) + mul64x64_128(t[2], d0, r2) mul64x64_128(mul, r1, r1) add128(t[2], mul) mul64x64_128(mul, d4, r3) add128(t[2], mul) + mul64x64_128(t[3], d0, r3) mul64x64_128(mul, d1, r2) add128(t[3], mul) mul64x64_128(mul, r4, d419) add128(t[3], mul) + mul64x64_128(t[4], d0, r4) mul64x64_128(mul, d1, r3) add128(t[4], mul) mul64x64_128(mul, r2, r2) add128(t[4], mul) +#endif + + r0 = lo128(t[0]) & reduce_mask_51; + r1 = lo128(t[1]) & reduce_mask_51; shl128(c, t[0], 13); r1 += c; + r2 = lo128(t[2]) & reduce_mask_51; shl128(c, t[1], 13); r2 += c; + r3 = lo128(t[3]) & reduce_mask_51; shl128(c, t[2], 13); r3 += c; + r4 = lo128(t[4]) & reduce_mask_51; shl128(c, t[3], 13); r4 += c; + shl128(c, t[4], 13); r0 += c * 19; + c = r0 >> 51; r0 &= reduce_mask_51; + r1 += c ; c = r1 >> 51; r1 &= reduce_mask_51; + r2 += c ; c = r2 >> 51; r2 &= reduce_mask_51; + r3 += c ; c = r3 >> 51; r3 &= reduce_mask_51; + r4 += c ; c = r4 >> 51; r4 &= reduce_mask_51; + r0 += c * 19; + } while(--count); + + out[0] = r0; + out[1] = r1; + out[2] = r2; + out[3] = r3; + out[4] = r4; +} + +DONNA_INLINE static void +curve25519_square(bignum25519 out, const bignum25519 in) { +#if !defined(HAVE_NATIVE_UINT128) + uint128_t mul; +#endif + uint128_t t[5]; + uint64_t r0,r1,r2,r3,r4,c; + uint64_t d0,d1,d2,d4,d419; + + r0 = in[0]; + r1 = in[1]; + r2 = in[2]; + r3 = in[3]; + r4 = in[4]; + + d0 = r0 * 2; + d1 = r1 * 2; + d2 = r2 * 2 * 19; + d419 = r4 * 19; + d4 = d419 * 2; + +#if defined(HAVE_NATIVE_UINT128) + t[0] = ((uint128_t) r0) * r0 + ((uint128_t) d4) * r1 + (((uint128_t) d2) * (r3 )); + t[1] = ((uint128_t) d0) * r1 + ((uint128_t) d4) * r2 + (((uint128_t) r3) * (r3 * 19)); + t[2] = ((uint128_t) d0) * r2 + ((uint128_t) r1) * r1 + (((uint128_t) d4) * (r3 )); + t[3] = ((uint128_t) d0) * r3 + ((uint128_t) d1) * r2 + (((uint128_t) r4) * (d419 )); + t[4] = ((uint128_t) d0) * r4 + ((uint128_t) d1) * r3 + (((uint128_t) r2) * (r2 )); +#else + mul64x64_128(t[0], r0, r0) mul64x64_128(mul, d4, r1) add128(t[0], mul) mul64x64_128(mul, d2, r3) add128(t[0], mul) + mul64x64_128(t[1], d0, r1) mul64x64_128(mul, d4, r2) add128(t[1], mul) mul64x64_128(mul, r3, r3 * 19) add128(t[1], mul) + mul64x64_128(t[2], d0, r2) mul64x64_128(mul, r1, r1) add128(t[2], mul) mul64x64_128(mul, d4, r3) add128(t[2], mul) + mul64x64_128(t[3], d0, r3) mul64x64_128(mul, d1, r2) add128(t[3], mul) mul64x64_128(mul, r4, d419) add128(t[3], mul) + mul64x64_128(t[4], d0, r4) mul64x64_128(mul, d1, r3) add128(t[4], mul) mul64x64_128(mul, r2, r2) add128(t[4], mul) +#endif + + r0 = lo128(t[0]) & reduce_mask_51; shr128(c, t[0], 51); + add128_64(t[1], c) r1 = lo128(t[1]) & reduce_mask_51; shr128(c, t[1], 51); + add128_64(t[2], c) r2 = lo128(t[2]) & reduce_mask_51; shr128(c, t[2], 51); + add128_64(t[3], c) r3 = lo128(t[3]) & reduce_mask_51; shr128(c, t[3], 51); + add128_64(t[4], c) r4 = lo128(t[4]) & reduce_mask_51; shr128(c, t[4], 51); + r0 += c * 19; c = r0 >> 51; r0 = r0 & reduce_mask_51; + r1 += c; + + out[0] = r0; + out[1] = r1; + out[2] = r2; + out[3] = r3; + out[4] = r4; +} + +/* Take a little-endian, 32-byte number and expand it into polynomial form */ +DONNA_INLINE static void +curve25519_expand(bignum25519 out, const unsigned char *in) { + static const union { uint8_t b[2]; uint16_t s; } endian_check = {{1,0}}; + uint64_t x0,x1,x2,x3; + + if (endian_check.s == 1) { + x0 = *(uint64_t *)(in + 0); + x1 = *(uint64_t *)(in + 8); + x2 = *(uint64_t *)(in + 16); + x3 = *(uint64_t *)(in + 24); + } else { + #define F(s) \ + ((((uint64_t)in[s + 0]) ) | \ + (((uint64_t)in[s + 1]) << 8) | \ + (((uint64_t)in[s + 2]) << 16) | \ + (((uint64_t)in[s + 3]) << 24) | \ + (((uint64_t)in[s + 4]) << 32) | \ + (((uint64_t)in[s + 5]) << 40) | \ + (((uint64_t)in[s + 6]) << 48) | \ + (((uint64_t)in[s + 7]) << 56)) + + x0 = F(0); + x1 = F(8); + x2 = F(16); + x3 = F(24); + } + + out[0] = x0 & reduce_mask_51; x0 = (x0 >> 51) | (x1 << 13); + out[1] = x0 & reduce_mask_51; x1 = (x1 >> 38) | (x2 << 26); + out[2] = x1 & reduce_mask_51; x2 = (x2 >> 25) | (x3 << 39); + out[3] = x2 & reduce_mask_51; x3 = (x3 >> 12); + out[4] = x3 & reduce_mask_51; +} + +/* Take a fully reduced polynomial form number and contract it into a + * little-endian, 32-byte array + */ +DONNA_INLINE static void +curve25519_contract(unsigned char *out, const bignum25519 input) { + uint64_t t[5]; + uint64_t f, i; + + t[0] = input[0]; + t[1] = input[1]; + t[2] = input[2]; + t[3] = input[3]; + t[4] = input[4]; + + #define curve25519_contract_carry() \ + t[1] += t[0] >> 51; t[0] &= reduce_mask_51; \ + t[2] += t[1] >> 51; t[1] &= reduce_mask_51; \ + t[3] += t[2] >> 51; t[2] &= reduce_mask_51; \ + t[4] += t[3] >> 51; t[3] &= reduce_mask_51; + + #define curve25519_contract_carry_full() curve25519_contract_carry() \ + t[0] += 19 * (t[4] >> 51); t[4] &= reduce_mask_51; + + #define curve25519_contract_carry_final() curve25519_contract_carry() \ + t[4] &= reduce_mask_51; + + curve25519_contract_carry_full() + curve25519_contract_carry_full() + + /* now t is between 0 and 2^255-1, properly carried. */ + /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */ + t[0] += 19; + curve25519_contract_carry_full() + + /* now between 19 and 2^255-1 in both cases, and offset by 19. */ + t[0] += (reduce_mask_51 + 1) - 19; + t[1] += (reduce_mask_51 + 1) - 1; + t[2] += (reduce_mask_51 + 1) - 1; + t[3] += (reduce_mask_51 + 1) - 1; + t[4] += (reduce_mask_51 + 1) - 1; + + /* now between 2^255 and 2^256-20, and offset by 2^255. */ + curve25519_contract_carry_final() + + #define write51full(n,shift) \ + f = ((t[n] >> shift) | (t[n+1] << (51 - shift))); \ + for (i = 0; i < 8; i++, f >>= 8) *out++ = (unsigned char)f; + #define write51(n) write51full(n,13*n) + write51(0) + write51(1) + write51(2) + write51(3) +} + +#if !defined(ED25519_GCC_64BIT_CHOOSE) + +/* out = (flag) ? in : out */ +DONNA_INLINE static void +curve25519_move_conditional_bytes(uint8_t out[96], const uint8_t in[96], uint64_t flag) { + const uint64_t nb = flag - 1, b = ~nb; + const uint64_t *inq = (const uint64_t *)in; + uint64_t *outq = (uint64_t *)out; + outq[0] = (outq[0] & nb) | (inq[0] & b); + outq[1] = (outq[1] & nb) | (inq[1] & b); + outq[2] = (outq[2] & nb) | (inq[2] & b); + outq[3] = (outq[3] & nb) | (inq[3] & b); + outq[4] = (outq[4] & nb) | (inq[4] & b); + outq[5] = (outq[5] & nb) | (inq[5] & b); + outq[6] = (outq[6] & nb) | (inq[6] & b); + outq[7] = (outq[7] & nb) | (inq[7] & b); + outq[8] = (outq[8] & nb) | (inq[8] & b); + outq[9] = (outq[9] & nb) | (inq[9] & b); + outq[10] = (outq[10] & nb) | (inq[10] & b); + outq[11] = (outq[11] & nb) | (inq[11] & b); +} + +/* if (iswap) swap(a, b) */ +DONNA_INLINE static void +curve25519_swap_conditional(bignum25519 a, bignum25519 b, uint64_t iswap) { + const uint64_t swap = (uint64_t)(-(int64_t)iswap); + uint64_t x0,x1,x2,x3,x4; + + x0 = swap & (a[0] ^ b[0]); a[0] ^= x0; b[0] ^= x0; + x1 = swap & (a[1] ^ b[1]); a[1] ^= x1; b[1] ^= x1; + x2 = swap & (a[2] ^ b[2]); a[2] ^= x2; b[2] ^= x2; + x3 = swap & (a[3] ^ b[3]); a[3] ^= x3; b[3] ^= x3; + x4 = swap & (a[4] ^ b[4]); a[4] ^= x4; b[4] ^= x4; +} + +#endif /* ED25519_GCC_64BIT_CHOOSE */ + +#define ED25519_64BIT_TABLES + diff --git a/src/wraith/src/ext/ed25519/donna/curve25519-donna-helpers.h b/src/wraith/src/ext/ed25519/donna/curve25519-donna-helpers.h new file mode 100644 index 000000000..ca442fa24 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/curve25519-donna-helpers.h @@ -0,0 +1,84 @@ +/* + Public domain by Andrew M. + See: https://github.com/floodyberry/curve25519-donna + + Curve25519 implementation agnostic helpers +*/ + +#ifdef __GNUC__ +#define ED_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +#endif + +#if __GNUC__ && ED_GCC_VERSION >= 401 +#if ED_GCC_VERSION >= 406 +#pragma GCC diagnostic push +#endif +/* Some versions of GCC (particularly on arm) give us bogus warnings here. + * Suppress the GCC warning so we can build Tor with -Wstack-protector. */ +#pragma GCC diagnostic ignored "-Wstack-protector" +#endif + +/* + * In: b = 2^5 - 2^0 + * Out: b = 2^250 - 2^0 + */ +static void +curve25519_pow_two5mtwo0_two250mtwo0(bignum25519 b) { + bignum25519 ALIGN(16) t0,c; + + /* 2^5 - 2^0 */ /* b */ + /* 2^10 - 2^5 */ curve25519_square_times(t0, b, 5); + /* 2^10 - 2^0 */ curve25519_mul_noinline(b, t0, b); + /* 2^20 - 2^10 */ curve25519_square_times(t0, b, 10); + /* 2^20 - 2^0 */ curve25519_mul_noinline(c, t0, b); + /* 2^40 - 2^20 */ curve25519_square_times(t0, c, 20); + /* 2^40 - 2^0 */ curve25519_mul_noinline(t0, t0, c); + /* 2^50 - 2^10 */ curve25519_square_times(t0, t0, 10); + /* 2^50 - 2^0 */ curve25519_mul_noinline(b, t0, b); + /* 2^100 - 2^50 */ curve25519_square_times(t0, b, 50); + /* 2^100 - 2^0 */ curve25519_mul_noinline(c, t0, b); + /* 2^200 - 2^100 */ curve25519_square_times(t0, c, 100); + /* 2^200 - 2^0 */ curve25519_mul_noinline(t0, t0, c); + /* 2^250 - 2^50 */ curve25519_square_times(t0, t0, 50); + /* 2^250 - 2^0 */ curve25519_mul_noinline(b, t0, b); +} + +/* + * z^(p - 2) = z(2^255 - 21) + */ +static void +curve25519_recip(bignum25519 out, const bignum25519 z) { + bignum25519 ALIGN(16) a,t0,b; + + /* 2 */ curve25519_square_times(a, z, 1); /* a = 2 */ + /* 8 */ curve25519_square_times(t0, a, 2); + /* 9 */ curve25519_mul_noinline(b, t0, z); /* b = 9 */ + /* 11 */ curve25519_mul_noinline(a, b, a); /* a = 11 */ + /* 22 */ curve25519_square_times(t0, a, 1); + /* 2^5 - 2^0 = 31 */ curve25519_mul_noinline(b, t0, b); + /* 2^250 - 2^0 */ curve25519_pow_two5mtwo0_two250mtwo0(b); + /* 2^255 - 2^5 */ curve25519_square_times(b, b, 5); + /* 2^255 - 21 */ curve25519_mul_noinline(out, b, a); +} + +/* + * z^((p-5)/8) = z^(2^252 - 3) + */ +static void +curve25519_pow_two252m3(bignum25519 two252m3, const bignum25519 z) { + bignum25519 ALIGN(16) b,c,t0; + + /* 2 */ curve25519_square_times(c, z, 1); /* c = 2 */ + /* 8 */ curve25519_square_times(t0, c, 2); /* t0 = 8 */ + /* 9 */ curve25519_mul_noinline(b, t0, z); /* b = 9 */ + /* 11 */ curve25519_mul_noinline(c, b, c); /* c = 11 */ + /* 22 */ curve25519_square_times(t0, c, 1); + /* 2^5 - 2^0 = 31 */ curve25519_mul_noinline(b, t0, b); + /* 2^250 - 2^0 */ curve25519_pow_two5mtwo0_two250mtwo0(b); + /* 2^252 - 2^2 */ curve25519_square_times(b, b, 2); + /* 2^252 - 3 */ curve25519_mul_noinline(two252m3, b, z); +} + +#if __GNUC__ && ED_GCC_VERSION >= 406 +#pragma GCC diagnostic pop +#endif diff --git a/src/wraith/src/ext/ed25519/donna/curve25519-donna-sse2.h b/src/wraith/src/ext/ed25519/donna/curve25519-donna-sse2.h new file mode 100644 index 000000000..1123cb1e9 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/curve25519-donna-sse2.h @@ -0,0 +1,1105 @@ +/* + Public domain by Andrew M. + See: https://github.com/floodyberry/curve25519-donna + + SSE2 curve25519 implementation +*/ + +#include +typedef __m128i xmmi; + +typedef union packedelem8_t { + unsigned char u[16]; + xmmi v; +} packedelem8; + +typedef union packedelem32_t { + uint32_t u[4]; + xmmi v; +} packedelem32; + +typedef union packedelem64_t { + uint64_t u[2]; + xmmi v; +} packedelem64; + +/* 10 elements + an extra 2 to fit in 3 xmm registers */ +typedef uint32_t bignum25519[12]; +typedef packedelem32 packed32bignum25519[5]; +typedef packedelem64 packed64bignum25519[10]; + +static const packedelem32 bot32bitmask = {{0xffffffff, 0x00000000, 0xffffffff, 0x00000000}}; +static const packedelem32 top64bitmask = {{0x00000000, 0x00000000, 0xffffffff, 0xffffffff}}; +static const packedelem32 bot64bitmask = {{0xffffffff, 0xffffffff, 0x00000000, 0x00000000}}; + +/* reduction masks */ +static const packedelem64 packedmask26 = {{0x03ffffff, 0x03ffffff}}; +static const packedelem64 packedmask25 = {{0x01ffffff, 0x01ffffff}}; +static const packedelem32 packedmask26262626 = {{0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff}}; +static const packedelem32 packedmask25252525 = {{0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff}}; + +/* multipliers */ +static const packedelem64 packednineteen = {{19, 19}}; +static const packedelem64 packedthirtyeight = {{38, 38}}; +static const packedelem64 packed3819 = {{19*2,19}}; + +/* 2*(2^255 - 19) = 0 mod p */ +static const packedelem32 packed2p0 = {{0x7ffffda,0x3fffffe,0x7fffffe,0x3fffffe}}; +static const packedelem32 packed2p1 = {{0x7fffffe,0x3fffffe,0x7fffffe,0x3fffffe}}; +static const packedelem32 packed2p2 = {{0x7fffffe,0x3fffffe,0x0000000,0x0000000}}; + +static const packedelem32 packed32packed2p0 = {{0x7ffffda,0x7ffffda,0x3fffffe,0x3fffffe}}; +static const packedelem32 packed32packed2p1 = {{0x7fffffe,0x7fffffe,0x3fffffe,0x3fffffe}}; + +/* 4*(2^255 - 19) = 0 mod p */ +static const packedelem32 packed4p0 = {{0xfffffb4,0x7fffffc,0xffffffc,0x7fffffc}}; +static const packedelem32 packed4p1 = {{0xffffffc,0x7fffffc,0xffffffc,0x7fffffc}}; +static const packedelem32 packed4p2 = {{0xffffffc,0x7fffffc,0x0000000,0x0000000}}; + +static const packedelem32 packed32packed4p0 = {{0xfffffb4,0xfffffb4,0x7fffffc,0x7fffffc}}; +static const packedelem32 packed32packed4p1 = {{0xffffffc,0xffffffc,0x7fffffc,0x7fffffc}}; + +/* out = in */ +DONNA_INLINE static void +curve25519_copy(bignum25519 out, const bignum25519 in) { + xmmi x0,x1,x2; + x0 = _mm_load_si128((xmmi*)in + 0); + x1 = _mm_load_si128((xmmi*)in + 1); + x2 = _mm_load_si128((xmmi*)in + 2); + _mm_store_si128((xmmi*)out + 0, x0); + _mm_store_si128((xmmi*)out + 1, x1); + _mm_store_si128((xmmi*)out + 2, x2); +} + +/* out = a + b */ +DONNA_INLINE static void +curve25519_add(bignum25519 out, const bignum25519 a, const bignum25519 b) { + xmmi a0,a1,a2,b0,b1,b2; + a0 = _mm_load_si128((xmmi*)a + 0); + a1 = _mm_load_si128((xmmi*)a + 1); + a2 = _mm_load_si128((xmmi*)a + 2); + b0 = _mm_load_si128((xmmi*)b + 0); + b1 = _mm_load_si128((xmmi*)b + 1); + b2 = _mm_load_si128((xmmi*)b + 2); + a0 = _mm_add_epi32(a0, b0); + a1 = _mm_add_epi32(a1, b1); + a2 = _mm_add_epi32(a2, b2); + _mm_store_si128((xmmi*)out + 0, a0); + _mm_store_si128((xmmi*)out + 1, a1); + _mm_store_si128((xmmi*)out + 2, a2); +} + +#define curve25519_add_after_basic curve25519_add_reduce +DONNA_INLINE static void +curve25519_add_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { + xmmi a0,a1,a2,b0,b1,b2; + xmmi c1,c2,c3; + xmmi r0,r1,r2,r3,r4,r5; + + a0 = _mm_load_si128((xmmi*)a + 0); + a1 = _mm_load_si128((xmmi*)a + 1); + a2 = _mm_load_si128((xmmi*)a + 2); + b0 = _mm_load_si128((xmmi*)b + 0); + b1 = _mm_load_si128((xmmi*)b + 1); + b2 = _mm_load_si128((xmmi*)b + 2); + a0 = _mm_add_epi32(a0, b0); + a1 = _mm_add_epi32(a1, b1); + a2 = _mm_add_epi32(a2, b2); + + r0 = _mm_and_si128(_mm_unpacklo_epi64(a0, a1), bot32bitmask.v); + r1 = _mm_srli_epi64(_mm_unpacklo_epi64(a0, a1), 32); + r2 = _mm_and_si128(_mm_unpackhi_epi64(a0, a1), bot32bitmask.v); + r3 = _mm_srli_epi64(_mm_unpackhi_epi64(a0, a1), 32); + r4 = _mm_and_si128(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), bot32bitmask.v); + r5 = _mm_srli_epi64(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), 32); + + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); + c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); + c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + + _mm_store_si128((xmmi*)out + 0, _mm_unpacklo_epi64(_mm_unpacklo_epi32(r0, r1), _mm_unpacklo_epi32(r2, r3))); + _mm_store_si128((xmmi*)out + 1, _mm_unpacklo_epi64(_mm_unpackhi_epi32(r0, r1), _mm_unpackhi_epi32(r2, r3))); + _mm_store_si128((xmmi*)out + 2, _mm_unpackhi_epi32(r4, r5)); +} + +DONNA_INLINE static void +curve25519_sub(bignum25519 out, const bignum25519 a, const bignum25519 b) { + xmmi a0,a1,a2,b0,b1,b2; + xmmi c1,c2; + xmmi r0,r1; + + a0 = _mm_load_si128((xmmi*)a + 0); + a1 = _mm_load_si128((xmmi*)a + 1); + a2 = _mm_load_si128((xmmi*)a + 2); + a0 = _mm_add_epi32(a0, packed2p0.v); + a1 = _mm_add_epi32(a1, packed2p1.v); + a2 = _mm_add_epi32(a2, packed2p2.v); + b0 = _mm_load_si128((xmmi*)b + 0); + b1 = _mm_load_si128((xmmi*)b + 1); + b2 = _mm_load_si128((xmmi*)b + 2); + a0 = _mm_sub_epi32(a0, b0); + a1 = _mm_sub_epi32(a1, b1); + a2 = _mm_sub_epi32(a2, b2); + + r0 = _mm_and_si128(_mm_shuffle_epi32(a0, _MM_SHUFFLE(2,2,0,0)), bot32bitmask.v); + r1 = _mm_and_si128(_mm_shuffle_epi32(a0, _MM_SHUFFLE(3,3,1,1)), bot32bitmask.v); + + c1 = _mm_srli_epi32(r0, 26); + c2 = _mm_srli_epi32(r1, 25); + r0 = _mm_and_si128(r0, packedmask26.v); + r1 = _mm_and_si128(r1, packedmask25.v); + r0 = _mm_add_epi32(r0, _mm_slli_si128(c2, 8)); + r1 = _mm_add_epi32(r1, c1); + + a0 = _mm_unpacklo_epi64(_mm_unpacklo_epi32(r0, r1), _mm_unpackhi_epi32(r0, r1)); + a1 = _mm_add_epi32(a1, _mm_srli_si128(c2, 8)); + + _mm_store_si128((xmmi*)out + 0, a0); + _mm_store_si128((xmmi*)out + 1, a1); + _mm_store_si128((xmmi*)out + 2, a2); +} + +DONNA_INLINE static void +curve25519_sub_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b) { + xmmi a0,a1,a2,b0,b1,b2; + xmmi c1,c2,c3; + xmmi r0,r1,r2,r3,r4,r5; + + a0 = _mm_load_si128((xmmi*)a + 0); + a1 = _mm_load_si128((xmmi*)a + 1); + a2 = _mm_load_si128((xmmi*)a + 2); + a0 = _mm_add_epi32(a0, packed4p0.v); + a1 = _mm_add_epi32(a1, packed4p1.v); + a2 = _mm_add_epi32(a2, packed4p2.v); + b0 = _mm_load_si128((xmmi*)b + 0); + b1 = _mm_load_si128((xmmi*)b + 1); + b2 = _mm_load_si128((xmmi*)b + 2); + a0 = _mm_sub_epi32(a0, b0); + a1 = _mm_sub_epi32(a1, b1); + a2 = _mm_sub_epi32(a2, b2); + + r0 = _mm_and_si128(_mm_unpacklo_epi64(a0, a1), bot32bitmask.v); + r1 = _mm_srli_epi64(_mm_unpacklo_epi64(a0, a1), 32); + r2 = _mm_and_si128(_mm_unpackhi_epi64(a0, a1), bot32bitmask.v); + r3 = _mm_srli_epi64(_mm_unpackhi_epi64(a0, a1), 32); + r4 = _mm_and_si128(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), bot32bitmask.v); + r5 = _mm_srli_epi64(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), 32); + + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); + c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); + c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + + _mm_store_si128((xmmi*)out + 0, _mm_unpacklo_epi64(_mm_unpacklo_epi32(r0, r1), _mm_unpacklo_epi32(r2, r3))); + _mm_store_si128((xmmi*)out + 1, _mm_unpacklo_epi64(_mm_unpackhi_epi32(r0, r1), _mm_unpackhi_epi32(r2, r3))); + _mm_store_si128((xmmi*)out + 2, _mm_unpackhi_epi32(r4, r5)); +} + +DONNA_INLINE static void +curve25519_sub_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { + xmmi a0,a1,a2,b0,b1,b2; + xmmi c1,c2,c3; + xmmi r0,r1,r2,r3,r4,r5; + + a0 = _mm_load_si128((xmmi*)a + 0); + a1 = _mm_load_si128((xmmi*)a + 1); + a2 = _mm_load_si128((xmmi*)a + 2); + a0 = _mm_add_epi32(a0, packed2p0.v); + a1 = _mm_add_epi32(a1, packed2p1.v); + a2 = _mm_add_epi32(a2, packed2p2.v); + b0 = _mm_load_si128((xmmi*)b + 0); + b1 = _mm_load_si128((xmmi*)b + 1); + b2 = _mm_load_si128((xmmi*)b + 2); + a0 = _mm_sub_epi32(a0, b0); + a1 = _mm_sub_epi32(a1, b1); + a2 = _mm_sub_epi32(a2, b2); + + r0 = _mm_and_si128(_mm_unpacklo_epi64(a0, a1), bot32bitmask.v); + r1 = _mm_srli_epi64(_mm_unpacklo_epi64(a0, a1), 32); + r2 = _mm_and_si128(_mm_unpackhi_epi64(a0, a1), bot32bitmask.v); + r3 = _mm_srli_epi64(_mm_unpackhi_epi64(a0, a1), 32); + r4 = _mm_and_si128(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), bot32bitmask.v); + r5 = _mm_srli_epi64(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), 32); + + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); + c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); + c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + + _mm_store_si128((xmmi*)out + 0, _mm_unpacklo_epi64(_mm_unpacklo_epi32(r0, r1), _mm_unpacklo_epi32(r2, r3))); + _mm_store_si128((xmmi*)out + 1, _mm_unpacklo_epi64(_mm_unpackhi_epi32(r0, r1), _mm_unpackhi_epi32(r2, r3))); + _mm_store_si128((xmmi*)out + 2, _mm_unpackhi_epi32(r4, r5)); +} + + +DONNA_INLINE static void +curve25519_neg(bignum25519 out, const bignum25519 b) { + xmmi a0,a1,a2,b0,b1,b2; + xmmi c1,c2,c3; + xmmi r0,r1,r2,r3,r4,r5; + + a0 = packed2p0.v; + a1 = packed2p1.v; + a2 = packed2p2.v; + b0 = _mm_load_si128((xmmi*)b + 0); + b1 = _mm_load_si128((xmmi*)b + 1); + b2 = _mm_load_si128((xmmi*)b + 2); + a0 = _mm_sub_epi32(a0, b0); + a1 = _mm_sub_epi32(a1, b1); + a2 = _mm_sub_epi32(a2, b2); + + r0 = _mm_and_si128(_mm_unpacklo_epi64(a0, a1), bot32bitmask.v); + r1 = _mm_srli_epi64(_mm_unpacklo_epi64(a0, a1), 32); + r2 = _mm_and_si128(_mm_unpackhi_epi64(a0, a1), bot32bitmask.v); + r3 = _mm_srli_epi64(_mm_unpackhi_epi64(a0, a1), 32); + r4 = _mm_and_si128(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), bot32bitmask.v); + r5 = _mm_srli_epi64(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), 32); + + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); + c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); + c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + + _mm_store_si128((xmmi*)out + 0, _mm_unpacklo_epi64(_mm_unpacklo_epi32(r0, r1), _mm_unpacklo_epi32(r2, r3))); + _mm_store_si128((xmmi*)out + 1, _mm_unpacklo_epi64(_mm_unpackhi_epi32(r0, r1), _mm_unpackhi_epi32(r2, r3))); + _mm_store_si128((xmmi*)out + 2, _mm_unpackhi_epi32(r4, r5)); +} + + +/* Multiply two numbers: out = in2 * in */ +static void +curve25519_mul(bignum25519 out, const bignum25519 r, const bignum25519 s) { + xmmi m01,m23,m45,m67,m89; + xmmi m0123,m4567; + xmmi s0123,s4567; + xmmi s01,s23,s45,s67,s89; + xmmi s12,s34,s56,s78,s9; + xmmi r0,r2,r4,r6,r8; + xmmi r1,r3,r5,r7,r9; + xmmi r119,r219,r319,r419,r519,r619,r719,r819,r919; + xmmi c1,c2,c3; + + s0123 = _mm_load_si128((xmmi*)s + 0); + s01 = _mm_shuffle_epi32(s0123,_MM_SHUFFLE(3,1,2,0)); + s12 = _mm_shuffle_epi32(s0123, _MM_SHUFFLE(2,2,1,1)); + s23 = _mm_shuffle_epi32(s0123,_MM_SHUFFLE(3,3,2,2)); + s4567 = _mm_load_si128((xmmi*)s + 1); + s34 = _mm_unpacklo_epi64(_mm_srli_si128(s0123,12),s4567); + s45 = _mm_shuffle_epi32(s4567,_MM_SHUFFLE(3,1,2,0)); + s56 = _mm_shuffle_epi32(s4567, _MM_SHUFFLE(2,2,1,1)); + s67 = _mm_shuffle_epi32(s4567,_MM_SHUFFLE(3,3,2,2)); + s89 = _mm_load_si128((xmmi*)s + 2); + s78 = _mm_unpacklo_epi64(_mm_srli_si128(s4567,12),s89); + s89 = _mm_shuffle_epi32(s89,_MM_SHUFFLE(3,1,2,0)); + s9 = _mm_shuffle_epi32(s89, _MM_SHUFFLE(3,3,2,2)); + + r0 = _mm_load_si128((xmmi*)r + 0); + r1 = _mm_shuffle_epi32(r0, _MM_SHUFFLE(1,1,1,1)); + r1 = _mm_add_epi64(r1, _mm_and_si128(r1, top64bitmask.v)); + r2 = _mm_shuffle_epi32(r0, _MM_SHUFFLE(2,2,2,2)); + r3 = _mm_shuffle_epi32(r0, _MM_SHUFFLE(3,3,3,3)); + r3 = _mm_add_epi64(r3, _mm_and_si128(r3, top64bitmask.v)); + r0 = _mm_shuffle_epi32(r0, _MM_SHUFFLE(0,0,0,0)); + r4 = _mm_load_si128((xmmi*)r + 1); + r5 = _mm_shuffle_epi32(r4, _MM_SHUFFLE(1,1,1,1)); + r5 = _mm_add_epi64(r5, _mm_and_si128(r5, top64bitmask.v)); + r6 = _mm_shuffle_epi32(r4, _MM_SHUFFLE(2,2,2,2)); + r7 = _mm_shuffle_epi32(r4, _MM_SHUFFLE(3,3,3,3)); + r7 = _mm_add_epi64(r7, _mm_and_si128(r7, top64bitmask.v)); + r4 = _mm_shuffle_epi32(r4, _MM_SHUFFLE(0,0,0,0)); + r8 = _mm_load_si128((xmmi*)r + 2); + r9 = _mm_shuffle_epi32(r8, _MM_SHUFFLE(3,1,3,1)); + r9 = _mm_add_epi64(r9, _mm_and_si128(r9, top64bitmask.v)); + r8 = _mm_shuffle_epi32(r8, _MM_SHUFFLE(3,0,3,0)); + + m01 = _mm_mul_epu32(r1,s01); + m23 = _mm_mul_epu32(r1,s23); + m45 = _mm_mul_epu32(r1,s45); + m67 = _mm_mul_epu32(r1,s67); + m23 = _mm_add_epi64(m23,_mm_mul_epu32(r3,s01)); + m45 = _mm_add_epi64(m45,_mm_mul_epu32(r3,s23)); + m67 = _mm_add_epi64(m67,_mm_mul_epu32(r3,s45)); + m89 = _mm_mul_epu32(r1,s89); + m45 = _mm_add_epi64(m45,_mm_mul_epu32(r5,s01)); + m67 = _mm_add_epi64(m67,_mm_mul_epu32(r5,s23)); + m89 = _mm_add_epi64(m89,_mm_mul_epu32(r3,s67)); + m67 = _mm_add_epi64(m67,_mm_mul_epu32(r7,s01)); + m89 = _mm_add_epi64(m89,_mm_mul_epu32(r5,s45)); + m89 = _mm_add_epi64(m89,_mm_mul_epu32(r7,s23)); + m89 = _mm_add_epi64(m89,_mm_mul_epu32(r9,s01)); + + /* shift up */ + m89 = _mm_unpackhi_epi64(m67,_mm_slli_si128(m89,8)); + m67 = _mm_unpackhi_epi64(m45,_mm_slli_si128(m67,8)); + m45 = _mm_unpackhi_epi64(m23,_mm_slli_si128(m45,8)); + m23 = _mm_unpackhi_epi64(m01,_mm_slli_si128(m23,8)); + m01 = _mm_unpackhi_epi64(_mm_setzero_si128(),_mm_slli_si128(m01,8)); + + m01 = _mm_add_epi64(m01,_mm_mul_epu32(r0,s01)); + m23 = _mm_add_epi64(m23,_mm_mul_epu32(r0,s23)); + m45 = _mm_add_epi64(m45,_mm_mul_epu32(r0,s45)); + m67 = _mm_add_epi64(m67,_mm_mul_epu32(r0,s67)); + m23 = _mm_add_epi64(m23,_mm_mul_epu32(r2,s01)); + m45 = _mm_add_epi64(m45,_mm_mul_epu32(r2,s23)); + m67 = _mm_add_epi64(m67,_mm_mul_epu32(r4,s23)); + m89 = _mm_add_epi64(m89,_mm_mul_epu32(r0,s89)); + m45 = _mm_add_epi64(m45,_mm_mul_epu32(r4,s01)); + m67 = _mm_add_epi64(m67,_mm_mul_epu32(r2,s45)); + m89 = _mm_add_epi64(m89,_mm_mul_epu32(r2,s67)); + m67 = _mm_add_epi64(m67,_mm_mul_epu32(r6,s01)); + m89 = _mm_add_epi64(m89,_mm_mul_epu32(r4,s45)); + m89 = _mm_add_epi64(m89,_mm_mul_epu32(r6,s23)); + m89 = _mm_add_epi64(m89,_mm_mul_epu32(r8,s01)); + + r219 = _mm_mul_epu32(r2, packednineteen.v); + r419 = _mm_mul_epu32(r4, packednineteen.v); + r619 = _mm_mul_epu32(r6, packednineteen.v); + r819 = _mm_mul_epu32(r8, packednineteen.v); + r119 = _mm_shuffle_epi32(r1,_MM_SHUFFLE(0,0,2,2)); r119 = _mm_mul_epu32(r119, packednineteen.v); + r319 = _mm_shuffle_epi32(r3,_MM_SHUFFLE(0,0,2,2)); r319 = _mm_mul_epu32(r319, packednineteen.v); + r519 = _mm_shuffle_epi32(r5,_MM_SHUFFLE(0,0,2,2)); r519 = _mm_mul_epu32(r519, packednineteen.v); + r719 = _mm_shuffle_epi32(r7,_MM_SHUFFLE(0,0,2,2)); r719 = _mm_mul_epu32(r719, packednineteen.v); + r919 = _mm_shuffle_epi32(r9,_MM_SHUFFLE(0,0,2,2)); r919 = _mm_mul_epu32(r919, packednineteen.v); + + m01 = _mm_add_epi64(m01,_mm_mul_epu32(r919,s12)); + m23 = _mm_add_epi64(m23,_mm_mul_epu32(r919,s34)); + m45 = _mm_add_epi64(m45,_mm_mul_epu32(r919,s56)); + m67 = _mm_add_epi64(m67,_mm_mul_epu32(r919,s78)); + m01 = _mm_add_epi64(m01,_mm_mul_epu32(r719,s34)); + m23 = _mm_add_epi64(m23,_mm_mul_epu32(r719,s56)); + m45 = _mm_add_epi64(m45,_mm_mul_epu32(r719,s78)); + m67 = _mm_add_epi64(m67,_mm_mul_epu32(r719,s9)); + m01 = _mm_add_epi64(m01,_mm_mul_epu32(r519,s56)); + m23 = _mm_add_epi64(m23,_mm_mul_epu32(r519,s78)); + m45 = _mm_add_epi64(m45,_mm_mul_epu32(r519,s9)); + m67 = _mm_add_epi64(m67,_mm_mul_epu32(r819,s89)); + m01 = _mm_add_epi64(m01,_mm_mul_epu32(r319,s78)); + m23 = _mm_add_epi64(m23,_mm_mul_epu32(r319,s9)); + m45 = _mm_add_epi64(m45,_mm_mul_epu32(r619,s89)); + m89 = _mm_add_epi64(m89,_mm_mul_epu32(r919,s9)); + m01 = _mm_add_epi64(m01,_mm_mul_epu32(r819,s23)); + m23 = _mm_add_epi64(m23,_mm_mul_epu32(r819,s45)); + m45 = _mm_add_epi64(m45,_mm_mul_epu32(r819,s67)); + m01 = _mm_add_epi64(m01,_mm_mul_epu32(r619,s45)); + m23 = _mm_add_epi64(m23,_mm_mul_epu32(r619,s67)); + m01 = _mm_add_epi64(m01,_mm_mul_epu32(r419,s67)); + m23 = _mm_add_epi64(m23,_mm_mul_epu32(r419,s89)); + m01 = _mm_add_epi64(m01,_mm_mul_epu32(r219,s89)); + m01 = _mm_add_epi64(m01,_mm_mul_epu32(r119,s9)); + + r0 = _mm_unpacklo_epi64(m01, m45); + r1 = _mm_unpackhi_epi64(m01, m45); + r2 = _mm_unpacklo_epi64(m23, m67); + r3 = _mm_unpackhi_epi64(m23, m67); + r4 = _mm_unpacklo_epi64(m89, m89); + r5 = _mm_unpackhi_epi64(m89, m89); + + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); + c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); + c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + + m0123 = _mm_unpacklo_epi32(r0, r1); + m4567 = _mm_unpackhi_epi32(r0, r1); + m0123 = _mm_unpacklo_epi64(m0123, _mm_unpacklo_epi32(r2, r3)); + m4567 = _mm_unpacklo_epi64(m4567, _mm_unpackhi_epi32(r2, r3)); + m89 = _mm_unpackhi_epi32(r4, r5); + + _mm_store_si128((xmmi*)out + 0, m0123); + _mm_store_si128((xmmi*)out + 1, m4567); + _mm_store_si128((xmmi*)out + 2, m89); +} + +DONNA_NOINLINE static void +curve25519_mul_noinline(bignum25519 out, const bignum25519 r, const bignum25519 s) { + curve25519_mul(out, r, s); +} + +#define curve25519_square(r, n) curve25519_square_times(r, n, 1) +static void +curve25519_square_times(bignum25519 r, const bignum25519 in, int count) { + xmmi m01,m23,m45,m67,m89; + xmmi r0,r1,r2,r3,r4,r5,r6,r7,r8,r9; + xmmi r0a,r1a,r2a,r3a,r7a,r9a; + xmmi r0123,r4567; + xmmi r01,r23,r45,r67,r6x,r89,r8x; + xmmi r12,r34,r56,r78,r9x; + xmmi r5619; + xmmi c1,c2,c3; + + r0123 = _mm_load_si128((xmmi*)in + 0); + r01 = _mm_shuffle_epi32(r0123,_MM_SHUFFLE(3,1,2,0)); + r23 = _mm_shuffle_epi32(r0123,_MM_SHUFFLE(3,3,2,2)); + r4567 = _mm_load_si128((xmmi*)in + 1); + r45 = _mm_shuffle_epi32(r4567,_MM_SHUFFLE(3,1,2,0)); + r67 = _mm_shuffle_epi32(r4567,_MM_SHUFFLE(3,3,2,2)); + r89 = _mm_load_si128((xmmi*)in + 2); + r89 = _mm_shuffle_epi32(r89,_MM_SHUFFLE(3,1,2,0)); + + do { + r12 = _mm_unpackhi_epi64(r01, _mm_slli_si128(r23, 8)); + r0 = _mm_shuffle_epi32(r01, _MM_SHUFFLE(0,0,0,0)); + r0 = _mm_add_epi64(r0, _mm_and_si128(r0, top64bitmask.v)); + r0a = _mm_shuffle_epi32(r0,_MM_SHUFFLE(3,2,1,2)); + r1 = _mm_shuffle_epi32(r01, _MM_SHUFFLE(2,2,2,2)); + r2 = _mm_shuffle_epi32(r23, _MM_SHUFFLE(0,0,0,0)); + r2 = _mm_add_epi64(r2, _mm_and_si128(r2, top64bitmask.v)); + r2a = _mm_shuffle_epi32(r2,_MM_SHUFFLE(3,2,1,2)); + r3 = _mm_shuffle_epi32(r23, _MM_SHUFFLE(2,2,2,2)); + r34 = _mm_unpackhi_epi64(r23, _mm_slli_si128(r45, 8)); + r4 = _mm_shuffle_epi32(r45, _MM_SHUFFLE(0,0,0,0)); + r4 = _mm_add_epi64(r4, _mm_and_si128(r4, top64bitmask.v)); + r56 = _mm_unpackhi_epi64(r45, _mm_slli_si128(r67, 8)); + r5619 = _mm_mul_epu32(r56, packednineteen.v); + r5 = _mm_shuffle_epi32(r5619, _MM_SHUFFLE(1,1,1,0)); + r6 = _mm_shuffle_epi32(r5619, _MM_SHUFFLE(3,2,3,2)); + r78 = _mm_unpackhi_epi64(r67, _mm_slli_si128(r89, 8)); + r6x = _mm_unpacklo_epi64(r67, _mm_setzero_si128()); + r7 = _mm_shuffle_epi32(r67, _MM_SHUFFLE(2,2,2,2)); + r7 = _mm_mul_epu32(r7, packed3819.v); + r7a = _mm_shuffle_epi32(r7, _MM_SHUFFLE(3,3,3,2)); + r8x = _mm_unpacklo_epi64(r89, _mm_setzero_si128()); + r8 = _mm_shuffle_epi32(r89, _MM_SHUFFLE(0,0,0,0)); + r8 = _mm_mul_epu32(r8, packednineteen.v); + r9 = _mm_shuffle_epi32(r89, _MM_SHUFFLE(2,2,2,2)); + r9x = _mm_slli_epi32(_mm_shuffle_epi32(r89, _MM_SHUFFLE(3,3,3,2)), 1); + r9 = _mm_mul_epu32(r9, packed3819.v); + r9a = _mm_shuffle_epi32(r9, _MM_SHUFFLE(2,2,2,2)); + + m01 = _mm_mul_epu32(r01, r0); + m23 = _mm_mul_epu32(r23, r0a); + m45 = _mm_mul_epu32(r45, r0a); + m45 = _mm_add_epi64(m45, _mm_mul_epu32(r23, r2)); + r23 = _mm_slli_epi32(r23, 1); + m67 = _mm_mul_epu32(r67, r0a); + m67 = _mm_add_epi64(m67, _mm_mul_epu32(r45, r2a)); + m89 = _mm_mul_epu32(r89, r0a); + m89 = _mm_add_epi64(m89, _mm_mul_epu32(r67, r2a)); + r67 = _mm_slli_epi32(r67, 1); + m89 = _mm_add_epi64(m89, _mm_mul_epu32(r45, r4)); + r45 = _mm_slli_epi32(r45, 1); + + r1 = _mm_slli_epi32(r1, 1); + r3 = _mm_slli_epi32(r3, 1); + r1a = _mm_add_epi64(r1, _mm_and_si128(r1, bot64bitmask.v)); + r3a = _mm_add_epi64(r3, _mm_and_si128(r3, bot64bitmask.v)); + + m23 = _mm_add_epi64(m23, _mm_mul_epu32(r12, r1)); + m45 = _mm_add_epi64(m45, _mm_mul_epu32(r34, r1a)); + m67 = _mm_add_epi64(m67, _mm_mul_epu32(r56, r1a)); + m67 = _mm_add_epi64(m67, _mm_mul_epu32(r34, r3)); + r34 = _mm_slli_epi32(r34, 1); + m89 = _mm_add_epi64(m89, _mm_mul_epu32(r78, r1a)); + r78 = _mm_slli_epi32(r78, 1); + m89 = _mm_add_epi64(m89, _mm_mul_epu32(r56, r3a)); + r56 = _mm_slli_epi32(r56, 1); + + m01 = _mm_add_epi64(m01, _mm_mul_epu32(_mm_slli_epi32(r12, 1), r9)); + m01 = _mm_add_epi64(m01, _mm_mul_epu32(r34, r7)); + m23 = _mm_add_epi64(m23, _mm_mul_epu32(r34, r9)); + m01 = _mm_add_epi64(m01, _mm_mul_epu32(r56, r5)); + m23 = _mm_add_epi64(m23, _mm_mul_epu32(r56, r7)); + m45 = _mm_add_epi64(m45, _mm_mul_epu32(r56, r9)); + m01 = _mm_add_epi64(m01, _mm_mul_epu32(r23, r8)); + m01 = _mm_add_epi64(m01, _mm_mul_epu32(r45, r6)); + m23 = _mm_add_epi64(m23, _mm_mul_epu32(r45, r8)); + m23 = _mm_add_epi64(m23, _mm_mul_epu32(r6x, r6)); + m45 = _mm_add_epi64(m45, _mm_mul_epu32(r78, r7a)); + m67 = _mm_add_epi64(m67, _mm_mul_epu32(r78, r9)); + m45 = _mm_add_epi64(m45, _mm_mul_epu32(r67, r8)); + m67 = _mm_add_epi64(m67, _mm_mul_epu32(r8x, r8)); + m89 = _mm_add_epi64(m89, _mm_mul_epu32(r9x, r9a)); + + r0 = _mm_unpacklo_epi64(m01, m45); + r1 = _mm_unpackhi_epi64(m01, m45); + r2 = _mm_unpacklo_epi64(m23, m67); + r3 = _mm_unpackhi_epi64(m23, m67); + r4 = _mm_unpacklo_epi64(m89, m89); + r5 = _mm_unpackhi_epi64(m89, m89); + + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); + c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); + c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); + c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); + + r01 = _mm_unpacklo_epi64(r0, r1); + r45 = _mm_unpackhi_epi64(r0, r1); + r23 = _mm_unpacklo_epi64(r2, r3); + r67 = _mm_unpackhi_epi64(r2, r3); + r89 = _mm_unpackhi_epi64(r4, r5); + } while (--count); + + r0123 = _mm_shuffle_epi32(r23, _MM_SHUFFLE(2,0,3,3)); + r4567 = _mm_shuffle_epi32(r67, _MM_SHUFFLE(2,0,3,3)); + r0123 = _mm_or_si128(r0123, _mm_shuffle_epi32(r01, _MM_SHUFFLE(3,3,2,0))); + r4567 = _mm_or_si128(r4567, _mm_shuffle_epi32(r45, _MM_SHUFFLE(3,3,2,0))); + r89 = _mm_shuffle_epi32(r89, _MM_SHUFFLE(3,3,2,0)); + + _mm_store_si128((xmmi*)r + 0, r0123); + _mm_store_si128((xmmi*)r + 1, r4567); + _mm_store_si128((xmmi*)r + 2, r89); +} + +DONNA_INLINE static void +curve25519_tangle32(packedelem32 *out, const bignum25519 x, const bignum25519 z) { + xmmi x0,x1,x2,z0,z1,z2; + + x0 = _mm_load_si128((xmmi *)(x + 0)); + x1 = _mm_load_si128((xmmi *)(x + 4)); + x2 = _mm_load_si128((xmmi *)(x + 8)); + z0 = _mm_load_si128((xmmi *)(z + 0)); + z1 = _mm_load_si128((xmmi *)(z + 4)); + z2 = _mm_load_si128((xmmi *)(z + 8)); + + out[0].v = _mm_unpacklo_epi32(x0, z0); + out[1].v = _mm_unpackhi_epi32(x0, z0); + out[2].v = _mm_unpacklo_epi32(x1, z1); + out[3].v = _mm_unpackhi_epi32(x1, z1); + out[4].v = _mm_unpacklo_epi32(x2, z2); +} + +DONNA_INLINE static void +curve25519_untangle32(bignum25519 x, bignum25519 z, const packedelem32 *in) { + xmmi t0,t1,t2,t3,t4,zero; + + t0 = _mm_shuffle_epi32(in[0].v, _MM_SHUFFLE(3,1,2,0)); + t1 = _mm_shuffle_epi32(in[1].v, _MM_SHUFFLE(3,1,2,0)); + t2 = _mm_shuffle_epi32(in[2].v, _MM_SHUFFLE(3,1,2,0)); + t3 = _mm_shuffle_epi32(in[3].v, _MM_SHUFFLE(3,1,2,0)); + t4 = _mm_shuffle_epi32(in[4].v, _MM_SHUFFLE(3,1,2,0)); + zero = _mm_setzero_si128(); + _mm_store_si128((xmmi *)x + 0, _mm_unpacklo_epi64(t0, t1)); + _mm_store_si128((xmmi *)x + 1, _mm_unpacklo_epi64(t2, t3)); + _mm_store_si128((xmmi *)x + 2, _mm_unpacklo_epi64(t4, zero)); + _mm_store_si128((xmmi *)z + 0, _mm_unpackhi_epi64(t0, t1)); + _mm_store_si128((xmmi *)z + 1, _mm_unpackhi_epi64(t2, t3)); + _mm_store_si128((xmmi *)z + 2, _mm_unpackhi_epi64(t4, zero)); +} + +DONNA_INLINE static void +curve25519_add_reduce_packed32(packedelem32 *out, const packedelem32 *r, const packedelem32 *s) { + xmmi r0,r1,r2,r3,r4; + xmmi s0,s1,s2,s3,s4,s5; + xmmi c1,c2; + + r0 = _mm_add_epi32(r[0].v, s[0].v); + r1 = _mm_add_epi32(r[1].v, s[1].v); + r2 = _mm_add_epi32(r[2].v, s[2].v); + r3 = _mm_add_epi32(r[3].v, s[3].v); + r4 = _mm_add_epi32(r[4].v, s[4].v); + + s0 = _mm_unpacklo_epi64(r0, r2); /* 00 44 */ + s1 = _mm_unpackhi_epi64(r0, r2); /* 11 55 */ + s2 = _mm_unpacklo_epi64(r1, r3); /* 22 66 */ + s3 = _mm_unpackhi_epi64(r1, r3); /* 33 77 */ + s4 = _mm_unpacklo_epi64(_mm_setzero_si128(), r4); /* 00 88 */ + s5 = _mm_unpackhi_epi64(_mm_setzero_si128(), r4); /* 00 99 */ + + c1 = _mm_srli_epi32(s0, 26); c2 = _mm_srli_epi32(s2, 26); s0 = _mm_and_si128(s0, packedmask26262626.v); s2 = _mm_and_si128(s2, packedmask26262626.v); s1 = _mm_add_epi32(s1, c1); s3 = _mm_add_epi32(s3, c2); + c1 = _mm_srli_epi32(s1, 25); c2 = _mm_srli_epi32(s3, 25); s1 = _mm_and_si128(s1, packedmask25252525.v); s3 = _mm_and_si128(s3, packedmask25252525.v); s2 = _mm_add_epi32(s2, c1); s4 = _mm_add_epi32(s4, _mm_unpackhi_epi64(_mm_setzero_si128(), c2)); s0 = _mm_add_epi32(s0, _mm_unpacklo_epi64(_mm_setzero_si128(), c2)); + c1 = _mm_srli_epi32(s2, 26); c2 = _mm_srli_epi32(s4, 26); s2 = _mm_and_si128(s2, packedmask26262626.v); s4 = _mm_and_si128(s4, packedmask26262626.v); s3 = _mm_add_epi32(s3, c1); s5 = _mm_add_epi32(s5, c2); + c1 = _mm_srli_epi32(s3, 25); c2 = _mm_srli_epi32(s5, 25); s3 = _mm_and_si128(s3, packedmask25252525.v); s5 = _mm_and_si128(s5, packedmask25252525.v); s4 = _mm_add_epi32(s4, c1); s0 = _mm_add_epi32(s0, _mm_or_si128(_mm_slli_si128(c1, 8), _mm_srli_si128(_mm_add_epi32(_mm_add_epi32(_mm_slli_epi32(c2, 4), _mm_slli_epi32(c2, 1)), c2), 8))); + c1 = _mm_srli_epi32(s0, 26); c2 = _mm_srli_epi32(s2, 26); s0 = _mm_and_si128(s0, packedmask26262626.v); s2 = _mm_and_si128(s2, packedmask26262626.v); s1 = _mm_add_epi32(s1, c1); s3 = _mm_add_epi32(s3, c2); + + out[0].v = _mm_unpacklo_epi64(s0, s1); /* 00 11 */ + out[1].v = _mm_unpacklo_epi64(s2, s3); /* 22 33 */ + out[2].v = _mm_unpackhi_epi64(s0, s1); /* 44 55 */ + out[3].v = _mm_unpackhi_epi64(s2, s3); /* 66 77 */ + out[4].v = _mm_unpackhi_epi64(s4, s5); /* 88 99 */ +} + +DONNA_INLINE static void +curve25519_add_packed32(packedelem32 *out, const packedelem32 *r, const packedelem32 *s) { + out[0].v = _mm_add_epi32(r[0].v, s[0].v); + out[1].v = _mm_add_epi32(r[1].v, s[1].v); + out[2].v = _mm_add_epi32(r[2].v, s[2].v); + out[3].v = _mm_add_epi32(r[3].v, s[3].v); + out[4].v = _mm_add_epi32(r[4].v, s[4].v); +} + +DONNA_INLINE static void +curve25519_sub_packed32(packedelem32 *out, const packedelem32 *r, const packedelem32 *s) { + xmmi r0,r1,r2,r3,r4; + xmmi s0,s1,s2,s3; + xmmi c1,c2; + + r0 = _mm_add_epi32(r[0].v, packed32packed2p0.v); + r1 = _mm_add_epi32(r[1].v, packed32packed2p1.v); + r2 = _mm_add_epi32(r[2].v, packed32packed2p1.v); + r3 = _mm_add_epi32(r[3].v, packed32packed2p1.v); + r4 = _mm_add_epi32(r[4].v, packed32packed2p1.v); + r0 = _mm_sub_epi32(r0, s[0].v); /* 00 11 */ + r1 = _mm_sub_epi32(r1, s[1].v); /* 22 33 */ + r2 = _mm_sub_epi32(r2, s[2].v); /* 44 55 */ + r3 = _mm_sub_epi32(r3, s[3].v); /* 66 77 */ + r4 = _mm_sub_epi32(r4, s[4].v); /* 88 99 */ + + s0 = _mm_unpacklo_epi64(r0, r2); /* 00 44 */ + s1 = _mm_unpackhi_epi64(r0, r2); /* 11 55 */ + s2 = _mm_unpacklo_epi64(r1, r3); /* 22 66 */ + s3 = _mm_unpackhi_epi64(r1, r3); /* 33 77 */ + + c1 = _mm_srli_epi32(s0, 26); c2 = _mm_srli_epi32(s2, 26); s0 = _mm_and_si128(s0, packedmask26262626.v); s2 = _mm_and_si128(s2, packedmask26262626.v); s1 = _mm_add_epi32(s1, c1); s3 = _mm_add_epi32(s3, c2); + c1 = _mm_srli_epi32(s1, 25); c2 = _mm_srli_epi32(s3, 25); s1 = _mm_and_si128(s1, packedmask25252525.v); s3 = _mm_and_si128(s3, packedmask25252525.v); s2 = _mm_add_epi32(s2, c1); r4 = _mm_add_epi32(r4, _mm_srli_si128(c2, 8)); s0 = _mm_add_epi32(s0, _mm_slli_si128(c2, 8)); + + out[0].v = _mm_unpacklo_epi64(s0, s1); /* 00 11 */ + out[1].v = _mm_unpacklo_epi64(s2, s3); /* 22 33 */ + out[2].v = _mm_unpackhi_epi64(s0, s1); /* 44 55 */ + out[3].v = _mm_unpackhi_epi64(s2, s3); /* 66 77 */ + out[4].v = r4; +} + +DONNA_INLINE static void +curve25519_sub_after_basic_packed32(packedelem32 *out, const packedelem32 *r, const packedelem32 *s) { + xmmi r0,r1,r2,r3,r4; + xmmi s0,s1,s2,s3,s4,s5; + xmmi c1,c2; + + r0 = _mm_add_epi32(r[0].v, packed32packed4p0.v); + r1 = _mm_add_epi32(r[1].v, packed32packed4p1.v); + r2 = _mm_add_epi32(r[2].v, packed32packed4p1.v); + r3 = _mm_add_epi32(r[3].v, packed32packed4p1.v); + r4 = _mm_add_epi32(r[4].v, packed32packed4p1.v); + r0 = _mm_sub_epi32(r0, s[0].v); /* 00 11 */ + r1 = _mm_sub_epi32(r1, s[1].v); /* 22 33 */ + r2 = _mm_sub_epi32(r2, s[2].v); /* 44 55 */ + r3 = _mm_sub_epi32(r3, s[3].v); /* 66 77 */ + r4 = _mm_sub_epi32(r4, s[4].v); /* 88 99 */ + + s0 = _mm_unpacklo_epi64(r0, r2); /* 00 44 */ + s1 = _mm_unpackhi_epi64(r0, r2); /* 11 55 */ + s2 = _mm_unpacklo_epi64(r1, r3); /* 22 66 */ + s3 = _mm_unpackhi_epi64(r1, r3); /* 33 77 */ + s4 = _mm_unpacklo_epi64(_mm_setzero_si128(), r4); /* 00 88 */ + s5 = _mm_unpackhi_epi64(_mm_setzero_si128(), r4); /* 00 99 */ + + c1 = _mm_srli_epi32(s0, 26); c2 = _mm_srli_epi32(s2, 26); s0 = _mm_and_si128(s0, packedmask26262626.v); s2 = _mm_and_si128(s2, packedmask26262626.v); s1 = _mm_add_epi32(s1, c1); s3 = _mm_add_epi32(s3, c2); + c1 = _mm_srli_epi32(s1, 25); c2 = _mm_srli_epi32(s3, 25); s1 = _mm_and_si128(s1, packedmask25252525.v); s3 = _mm_and_si128(s3, packedmask25252525.v); s2 = _mm_add_epi32(s2, c1); s4 = _mm_add_epi32(s4, _mm_unpackhi_epi64(_mm_setzero_si128(), c2)); s0 = _mm_add_epi32(s0, _mm_unpacklo_epi64(_mm_setzero_si128(), c2)); + c1 = _mm_srli_epi32(s2, 26); c2 = _mm_srli_epi32(s4, 26); s2 = _mm_and_si128(s2, packedmask26262626.v); s4 = _mm_and_si128(s4, packedmask26262626.v); s3 = _mm_add_epi32(s3, c1); s5 = _mm_add_epi32(s5, c2); + c1 = _mm_srli_epi32(s3, 25); c2 = _mm_srli_epi32(s5, 25); s3 = _mm_and_si128(s3, packedmask25252525.v); s5 = _mm_and_si128(s5, packedmask25252525.v); s4 = _mm_add_epi32(s4, c1); s0 = _mm_add_epi32(s0, _mm_or_si128(_mm_slli_si128(c1, 8), _mm_srli_si128(_mm_add_epi32(_mm_add_epi32(_mm_slli_epi32(c2, 4), _mm_slli_epi32(c2, 1)), c2), 8))); + c1 = _mm_srli_epi32(s0, 26); c2 = _mm_srli_epi32(s2, 26); s0 = _mm_and_si128(s0, packedmask26262626.v); s2 = _mm_and_si128(s2, packedmask26262626.v); s1 = _mm_add_epi32(s1, c1); s3 = _mm_add_epi32(s3, c2); + + out[0].v = _mm_unpacklo_epi64(s0, s1); /* 00 11 */ + out[1].v = _mm_unpacklo_epi64(s2, s3); /* 22 33 */ + out[2].v = _mm_unpackhi_epi64(s0, s1); /* 44 55 */ + out[3].v = _mm_unpackhi_epi64(s2, s3); /* 66 77 */ + out[4].v = _mm_unpackhi_epi64(s4, s5); /* 88 99 */ +} + +DONNA_INLINE static void +curve25519_tangle64_from32(packedelem64 *a, packedelem64 *b, const packedelem32 *c, const packedelem32 *d) { + xmmi c0,c1,c2,c3,c4,c5,t; + xmmi d0,d1,d2,d3,d4,d5; + xmmi t0,t1,t2,t3,t4,zero; + + t0 = _mm_shuffle_epi32(c[0].v, _MM_SHUFFLE(3,1,2,0)); + t1 = _mm_shuffle_epi32(c[1].v, _MM_SHUFFLE(3,1,2,0)); + t2 = _mm_shuffle_epi32(d[0].v, _MM_SHUFFLE(3,1,2,0)); + t3 = _mm_shuffle_epi32(d[1].v, _MM_SHUFFLE(3,1,2,0)); + c0 = _mm_unpacklo_epi64(t0, t1); + c3 = _mm_unpackhi_epi64(t0, t1); + d0 = _mm_unpacklo_epi64(t2, t3); + d3 = _mm_unpackhi_epi64(t2, t3); + t = _mm_unpacklo_epi64(c0, d0); a[0].v = t; a[1].v = _mm_srli_epi64(t, 32); + t = _mm_unpackhi_epi64(c0, d0); a[2].v = t; a[3].v = _mm_srli_epi64(t, 32); + t = _mm_unpacklo_epi64(c3, d3); b[0].v = t; b[1].v = _mm_srli_epi64(t, 32); + t = _mm_unpackhi_epi64(c3, d3); b[2].v = t; b[3].v = _mm_srli_epi64(t, 32); + + t0 = _mm_shuffle_epi32(c[2].v, _MM_SHUFFLE(3,1,2,0)); + t1 = _mm_shuffle_epi32(c[3].v, _MM_SHUFFLE(3,1,2,0)); + t2 = _mm_shuffle_epi32(d[2].v, _MM_SHUFFLE(3,1,2,0)); + t3 = _mm_shuffle_epi32(d[3].v, _MM_SHUFFLE(3,1,2,0)); + c1 = _mm_unpacklo_epi64(t0, t1); + c4 = _mm_unpackhi_epi64(t0, t1); + d1 = _mm_unpacklo_epi64(t2, t3); + d4 = _mm_unpackhi_epi64(t2, t3); + t = _mm_unpacklo_epi64(c1, d1); a[4].v = t; a[5].v = _mm_srli_epi64(t, 32); + t = _mm_unpackhi_epi64(c1, d1); a[6].v = t; a[7].v = _mm_srli_epi64(t, 32); + t = _mm_unpacklo_epi64(c4, d4); b[4].v = t; b[5].v = _mm_srli_epi64(t, 32); + t = _mm_unpackhi_epi64(c4, d4); b[6].v = t; b[7].v = _mm_srli_epi64(t, 32); + + t4 = _mm_shuffle_epi32(c[4].v, _MM_SHUFFLE(3,1,2,0)); + zero = _mm_setzero_si128(); + c2 = _mm_unpacklo_epi64(t4, zero); + c5 = _mm_unpackhi_epi64(t4, zero); + t4 = _mm_shuffle_epi32(d[4].v, _MM_SHUFFLE(3,1,2,0)); + d2 = _mm_unpacklo_epi64(t4, zero); + d5 = _mm_unpackhi_epi64(t4, zero); + t = _mm_unpacklo_epi64(c2, d2); a[8].v = t; a[9].v = _mm_srli_epi64(t, 32); + t = _mm_unpacklo_epi64(c5, d5); b[8].v = t; b[9].v = _mm_srli_epi64(t, 32); +} + +DONNA_INLINE static void +curve25519_tangle64(packedelem64 *out, const bignum25519 x, const bignum25519 z) { + xmmi x0,x1,x2,z0,z1,z2,t; + + x0 = _mm_load_si128((xmmi *)x + 0); + x1 = _mm_load_si128((xmmi *)x + 1); + x2 = _mm_load_si128((xmmi *)x + 2); + z0 = _mm_load_si128((xmmi *)z + 0); + z1 = _mm_load_si128((xmmi *)z + 1); + z2 = _mm_load_si128((xmmi *)z + 2); + + t = _mm_unpacklo_epi64(x0, z0); out[0].v = t; out[1].v = _mm_srli_epi64(t, 32); + t = _mm_unpackhi_epi64(x0, z0); out[2].v = t; out[3].v = _mm_srli_epi64(t, 32); + t = _mm_unpacklo_epi64(x1, z1); out[4].v = t; out[5].v = _mm_srli_epi64(t, 32); + t = _mm_unpackhi_epi64(x1, z1); out[6].v = t; out[7].v = _mm_srli_epi64(t, 32); + t = _mm_unpacklo_epi64(x2, z2); out[8].v = t; out[9].v = _mm_srli_epi64(t, 32); +} + +DONNA_INLINE static void +curve25519_tangleone64(packedelem64 *out, const bignum25519 x) { + xmmi x0,x1,x2; + + x0 = _mm_load_si128((xmmi *)(x + 0)); + x1 = _mm_load_si128((xmmi *)(x + 4)); + x2 = _mm_load_si128((xmmi *)(x + 8)); + + out[0].v = _mm_shuffle_epi32(x0, _MM_SHUFFLE(0,0,0,0)); + out[1].v = _mm_shuffle_epi32(x0, _MM_SHUFFLE(1,1,1,1)); + out[2].v = _mm_shuffle_epi32(x0, _MM_SHUFFLE(2,2,2,2)); + out[3].v = _mm_shuffle_epi32(x0, _MM_SHUFFLE(3,3,3,3)); + out[4].v = _mm_shuffle_epi32(x1, _MM_SHUFFLE(0,0,0,0)); + out[5].v = _mm_shuffle_epi32(x1, _MM_SHUFFLE(1,1,1,1)); + out[6].v = _mm_shuffle_epi32(x1, _MM_SHUFFLE(2,2,2,2)); + out[7].v = _mm_shuffle_epi32(x1, _MM_SHUFFLE(3,3,3,3)); + out[8].v = _mm_shuffle_epi32(x2, _MM_SHUFFLE(0,0,0,0)); + out[9].v = _mm_shuffle_epi32(x2, _MM_SHUFFLE(1,1,1,1)); +} + +DONNA_INLINE static void +curve25519_swap64(packedelem64 *out) { + out[0].v = _mm_shuffle_epi32(out[0].v, _MM_SHUFFLE(1,0,3,2)); + out[1].v = _mm_shuffle_epi32(out[1].v, _MM_SHUFFLE(1,0,3,2)); + out[2].v = _mm_shuffle_epi32(out[2].v, _MM_SHUFFLE(1,0,3,2)); + out[3].v = _mm_shuffle_epi32(out[3].v, _MM_SHUFFLE(1,0,3,2)); + out[4].v = _mm_shuffle_epi32(out[4].v, _MM_SHUFFLE(1,0,3,2)); + out[5].v = _mm_shuffle_epi32(out[5].v, _MM_SHUFFLE(1,0,3,2)); + out[6].v = _mm_shuffle_epi32(out[6].v, _MM_SHUFFLE(1,0,3,2)); + out[7].v = _mm_shuffle_epi32(out[7].v, _MM_SHUFFLE(1,0,3,2)); + out[8].v = _mm_shuffle_epi32(out[8].v, _MM_SHUFFLE(1,0,3,2)); + out[9].v = _mm_shuffle_epi32(out[9].v, _MM_SHUFFLE(1,0,3,2)); +} + +DONNA_INLINE static void +curve25519_untangle64(bignum25519 x, bignum25519 z, const packedelem64 *in) { + _mm_store_si128((xmmi *)(x + 0), _mm_unpacklo_epi64(_mm_unpacklo_epi32(in[0].v, in[1].v), _mm_unpacklo_epi32(in[2].v, in[3].v))); + _mm_store_si128((xmmi *)(x + 4), _mm_unpacklo_epi64(_mm_unpacklo_epi32(in[4].v, in[5].v), _mm_unpacklo_epi32(in[6].v, in[7].v))); + _mm_store_si128((xmmi *)(x + 8), _mm_unpacklo_epi32(in[8].v, in[9].v) ); + _mm_store_si128((xmmi *)(z + 0), _mm_unpacklo_epi64(_mm_unpackhi_epi32(in[0].v, in[1].v), _mm_unpackhi_epi32(in[2].v, in[3].v))); + _mm_store_si128((xmmi *)(z + 4), _mm_unpacklo_epi64(_mm_unpackhi_epi32(in[4].v, in[5].v), _mm_unpackhi_epi32(in[6].v, in[7].v))); + _mm_store_si128((xmmi *)(z + 8), _mm_unpackhi_epi32(in[8].v, in[9].v) ); +} + +DONNA_INLINE static void +curve25519_mul_packed64(packedelem64 *out, const packedelem64 *r, const packedelem64 *s) { + xmmi r1,r2,r3,r4,r5,r6,r7,r8,r9; + xmmi r1_2,r3_2,r5_2,r7_2,r9_2; + xmmi c1,c2; + + out[0].v = _mm_mul_epu32(r[0].v, s[0].v); + out[1].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[1].v), _mm_mul_epu32(r[1].v, s[0].v)); + r1_2 = _mm_slli_epi32(r[1].v, 1); + out[2].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r1_2 , s[1].v), _mm_mul_epu32(r[2].v, s[0].v))); + out[3].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[3].v), _mm_add_epi64(_mm_mul_epu32(r[1].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[1].v), _mm_mul_epu32(r[3].v, s[0].v)))); + r3_2 = _mm_slli_epi32(r[3].v, 1); + out[4].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r1_2 , s[3].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r3_2 , s[1].v), _mm_mul_epu32(r[4].v, s[0].v))))); + out[5].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[5].v), _mm_add_epi64(_mm_mul_epu32(r[1].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[3].v), _mm_add_epi64(_mm_mul_epu32(r[3].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r[4].v, s[1].v), _mm_mul_epu32(r[5].v, s[0].v)))))); + r5_2 = _mm_slli_epi32(r[5].v, 1); + out[6].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[6].v), _mm_add_epi64(_mm_mul_epu32(r1_2 , s[5].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r3_2 , s[3].v), _mm_add_epi64(_mm_mul_epu32(r[4].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r5_2 , s[1].v), _mm_mul_epu32(r[6].v, s[0].v))))))); + out[7].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[7].v), _mm_add_epi64(_mm_mul_epu32(r[1].v, s[6].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[5].v), _mm_add_epi64(_mm_mul_epu32(r[3].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r[4].v, s[3].v), _mm_add_epi64(_mm_mul_epu32(r[5].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r[6].v, s[1].v), _mm_mul_epu32(r[7].v , s[0].v)))))))); + r7_2 = _mm_slli_epi32(r[7].v, 1); + out[8].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[8].v), _mm_add_epi64(_mm_mul_epu32(r1_2 , s[7].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[6].v), _mm_add_epi64(_mm_mul_epu32(r3_2 , s[5].v), _mm_add_epi64(_mm_mul_epu32(r[4].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r5_2 , s[3].v), _mm_add_epi64(_mm_mul_epu32(r[6].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r7_2 , s[1].v), _mm_mul_epu32(r[8].v, s[0].v))))))))); + out[9].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[9].v), _mm_add_epi64(_mm_mul_epu32(r[1].v, s[8].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[7].v), _mm_add_epi64(_mm_mul_epu32(r[3].v, s[6].v), _mm_add_epi64(_mm_mul_epu32(r[4].v, s[5].v), _mm_add_epi64(_mm_mul_epu32(r[5].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r[6].v, s[3].v), _mm_add_epi64(_mm_mul_epu32(r[7].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r[8].v, s[1].v), _mm_mul_epu32(r[9].v, s[0].v)))))))))); + + r1 = _mm_mul_epu32(r[1].v, packednineteen.v); + r2 = _mm_mul_epu32(r[2].v, packednineteen.v); + r1_2 = _mm_slli_epi32(r1, 1); + r3 = _mm_mul_epu32(r[3].v, packednineteen.v); + r4 = _mm_mul_epu32(r[4].v, packednineteen.v); + r3_2 = _mm_slli_epi32(r3, 1); + r5 = _mm_mul_epu32(r[5].v, packednineteen.v); + r6 = _mm_mul_epu32(r[6].v, packednineteen.v); + r5_2 = _mm_slli_epi32(r5, 1); + r7 = _mm_mul_epu32(r[7].v, packednineteen.v); + r8 = _mm_mul_epu32(r[8].v, packednineteen.v); + r7_2 = _mm_slli_epi32(r7, 1); + r9 = _mm_mul_epu32(r[9].v, packednineteen.v); + r9_2 = _mm_slli_epi32(r9, 1); + + out[0].v = _mm_add_epi64(out[0].v, _mm_add_epi64(_mm_mul_epu32(r9_2, s[1].v), _mm_add_epi64(_mm_mul_epu32(r8, s[2].v), _mm_add_epi64(_mm_mul_epu32(r7_2, s[3].v), _mm_add_epi64(_mm_mul_epu32(r6, s[4].v), _mm_add_epi64(_mm_mul_epu32(r5_2, s[5].v), _mm_add_epi64(_mm_mul_epu32(r4, s[6].v), _mm_add_epi64(_mm_mul_epu32(r3_2, s[7].v), _mm_add_epi64(_mm_mul_epu32(r2, s[8].v), _mm_mul_epu32(r1_2, s[9].v)))))))))); + out[1].v = _mm_add_epi64(out[1].v, _mm_add_epi64(_mm_mul_epu32(r9 , s[2].v), _mm_add_epi64(_mm_mul_epu32(r8, s[3].v), _mm_add_epi64(_mm_mul_epu32(r7 , s[4].v), _mm_add_epi64(_mm_mul_epu32(r6, s[5].v), _mm_add_epi64(_mm_mul_epu32(r5 , s[6].v), _mm_add_epi64(_mm_mul_epu32(r4, s[7].v), _mm_add_epi64(_mm_mul_epu32(r3 , s[8].v), _mm_mul_epu32(r2, s[9].v))))))))); + out[2].v = _mm_add_epi64(out[2].v, _mm_add_epi64(_mm_mul_epu32(r9_2, s[3].v), _mm_add_epi64(_mm_mul_epu32(r8, s[4].v), _mm_add_epi64(_mm_mul_epu32(r7_2, s[5].v), _mm_add_epi64(_mm_mul_epu32(r6, s[6].v), _mm_add_epi64(_mm_mul_epu32(r5_2, s[7].v), _mm_add_epi64(_mm_mul_epu32(r4, s[8].v), _mm_mul_epu32(r3_2, s[9].v)))))))); + out[3].v = _mm_add_epi64(out[3].v, _mm_add_epi64(_mm_mul_epu32(r9 , s[4].v), _mm_add_epi64(_mm_mul_epu32(r8, s[5].v), _mm_add_epi64(_mm_mul_epu32(r7 , s[6].v), _mm_add_epi64(_mm_mul_epu32(r6, s[7].v), _mm_add_epi64(_mm_mul_epu32(r5 , s[8].v), _mm_mul_epu32(r4, s[9].v))))))); + out[4].v = _mm_add_epi64(out[4].v, _mm_add_epi64(_mm_mul_epu32(r9_2, s[5].v), _mm_add_epi64(_mm_mul_epu32(r8, s[6].v), _mm_add_epi64(_mm_mul_epu32(r7_2, s[7].v), _mm_add_epi64(_mm_mul_epu32(r6, s[8].v), _mm_mul_epu32(r5_2, s[9].v)))))); + out[5].v = _mm_add_epi64(out[5].v, _mm_add_epi64(_mm_mul_epu32(r9 , s[6].v), _mm_add_epi64(_mm_mul_epu32(r8, s[7].v), _mm_add_epi64(_mm_mul_epu32(r7 , s[8].v), _mm_mul_epu32(r6, s[9].v))))); + out[6].v = _mm_add_epi64(out[6].v, _mm_add_epi64(_mm_mul_epu32(r9_2, s[7].v), _mm_add_epi64(_mm_mul_epu32(r8, s[8].v), _mm_mul_epu32(r7_2, s[9].v)))); + out[7].v = _mm_add_epi64(out[7].v, _mm_add_epi64(_mm_mul_epu32(r9 , s[8].v), _mm_mul_epu32(r8, s[9].v))); + out[8].v = _mm_add_epi64(out[8].v, _mm_mul_epu32(r9_2, s[9].v)); + + c1 = _mm_srli_epi64(out[0].v, 26); c2 = _mm_srli_epi64(out[4].v, 26); out[0].v = _mm_and_si128(out[0].v, packedmask26.v); out[4].v = _mm_and_si128(out[4].v, packedmask26.v); out[1].v = _mm_add_epi64(out[1].v, c1); out[5].v = _mm_add_epi64(out[5].v, c2); + c1 = _mm_srli_epi64(out[1].v, 25); c2 = _mm_srli_epi64(out[5].v, 25); out[1].v = _mm_and_si128(out[1].v, packedmask25.v); out[5].v = _mm_and_si128(out[5].v, packedmask25.v); out[2].v = _mm_add_epi64(out[2].v, c1); out[6].v = _mm_add_epi64(out[6].v, c2); + c1 = _mm_srli_epi64(out[2].v, 26); c2 = _mm_srli_epi64(out[6].v, 26); out[2].v = _mm_and_si128(out[2].v, packedmask26.v); out[6].v = _mm_and_si128(out[6].v, packedmask26.v); out[3].v = _mm_add_epi64(out[3].v, c1); out[7].v = _mm_add_epi64(out[7].v, c2); + c1 = _mm_srli_epi64(out[3].v, 25); c2 = _mm_srli_epi64(out[7].v, 25); out[3].v = _mm_and_si128(out[3].v, packedmask25.v); out[7].v = _mm_and_si128(out[7].v, packedmask25.v); out[4].v = _mm_add_epi64(out[4].v, c1); out[8].v = _mm_add_epi64(out[8].v, c2); + c2 = _mm_srli_epi64(out[8].v, 26); out[8].v = _mm_and_si128(out[8].v, packedmask26.v); out[9].v = _mm_add_epi64(out[9].v, c2); + c2 = _mm_srli_epi64(out[9].v, 25); out[9].v = _mm_and_si128(out[9].v, packedmask25.v); out[0].v = _mm_add_epi64(out[0].v, _mm_mul_epu32(c2, packednineteen.v)); + c1 = _mm_srli_epi64(out[0].v, 26); c2 = _mm_srli_epi64(out[4].v, 26); out[0].v = _mm_and_si128(out[0].v, packedmask26.v); out[4].v = _mm_and_si128(out[4].v, packedmask26.v); out[1].v = _mm_add_epi64(out[1].v, c1); out[5].v = _mm_add_epi64(out[5].v, c2); +} + +DONNA_INLINE static void +curve25519_square_packed64(packedelem64 *out, const packedelem64 *r) { + xmmi r0,r1,r2,r3; + xmmi r1_2,r3_2,r4_2,r5_2,r6_2,r7_2; + xmmi d5,d6,d7,d8,d9; + xmmi c1,c2; + + r0 = r[0].v; + r1 = r[1].v; + r2 = r[2].v; + r3 = r[3].v; + + out[0].v = _mm_mul_epu32(r0, r0); + r0 = _mm_slli_epi32(r0, 1); + out[1].v = _mm_mul_epu32(r0, r1); + r1_2 = _mm_slli_epi32(r1, 1); + out[2].v = _mm_add_epi64(_mm_mul_epu32(r0, r2 ), _mm_mul_epu32(r1, r1_2)); + r1 = r1_2; + out[3].v = _mm_add_epi64(_mm_mul_epu32(r0, r3 ), _mm_mul_epu32(r1, r2 )); + r3_2 = _mm_slli_epi32(r3, 1); + out[4].v = _mm_add_epi64(_mm_mul_epu32(r0, r[4].v), _mm_add_epi64(_mm_mul_epu32(r1, r3_2 ), _mm_mul_epu32(r2, r2))); + r2 = _mm_slli_epi32(r2, 1); + out[5].v = _mm_add_epi64(_mm_mul_epu32(r0, r[5].v), _mm_add_epi64(_mm_mul_epu32(r1, r[4].v), _mm_mul_epu32(r2, r3))); + r5_2 = _mm_slli_epi32(r[5].v, 1); + out[6].v = _mm_add_epi64(_mm_mul_epu32(r0, r[6].v), _mm_add_epi64(_mm_mul_epu32(r1, r5_2 ), _mm_add_epi64(_mm_mul_epu32(r2, r[4].v), _mm_mul_epu32(r3, r3_2 )))); + r3 = r3_2; + out[7].v = _mm_add_epi64(_mm_mul_epu32(r0, r[7].v), _mm_add_epi64(_mm_mul_epu32(r1, r[6].v), _mm_add_epi64(_mm_mul_epu32(r2, r[5].v), _mm_mul_epu32(r3, r[4].v)))); + r7_2 = _mm_slli_epi32(r[7].v, 1); + out[8].v = _mm_add_epi64(_mm_mul_epu32(r0, r[8].v), _mm_add_epi64(_mm_mul_epu32(r1, r7_2 ), _mm_add_epi64(_mm_mul_epu32(r2, r[6].v), _mm_add_epi64(_mm_mul_epu32(r3, r5_2 ), _mm_mul_epu32(r[4].v, r[4].v))))); + out[9].v = _mm_add_epi64(_mm_mul_epu32(r0, r[9].v), _mm_add_epi64(_mm_mul_epu32(r1, r[8].v), _mm_add_epi64(_mm_mul_epu32(r2, r[7].v), _mm_add_epi64(_mm_mul_epu32(r3, r[6].v), _mm_mul_epu32(r[4].v, r5_2 ))))); + + d5 = _mm_mul_epu32(r[5].v, packedthirtyeight.v); + d6 = _mm_mul_epu32(r[6].v, packednineteen.v); + d7 = _mm_mul_epu32(r[7].v, packedthirtyeight.v); + d8 = _mm_mul_epu32(r[8].v, packednineteen.v); + d9 = _mm_mul_epu32(r[9].v, packedthirtyeight.v); + + r4_2 = _mm_slli_epi32(r[4].v, 1); + r6_2 = _mm_slli_epi32(r[6].v, 1); + out[0].v = _mm_add_epi64(out[0].v, _mm_add_epi64(_mm_mul_epu32(d9, r1 ), _mm_add_epi64(_mm_mul_epu32(d8, r2 ), _mm_add_epi64(_mm_mul_epu32(d7, r3 ), _mm_add_epi64(_mm_mul_epu32(d6, r4_2), _mm_mul_epu32(d5, r[5].v)))))); + out[1].v = _mm_add_epi64(out[1].v, _mm_add_epi64(_mm_mul_epu32(d9, _mm_srli_epi32(r2, 1)), _mm_add_epi64(_mm_mul_epu32(d8, r3 ), _mm_add_epi64(_mm_mul_epu32(d7, r[4].v), _mm_mul_epu32(d6, r5_2 ))))); + out[2].v = _mm_add_epi64(out[2].v, _mm_add_epi64(_mm_mul_epu32(d9, r3 ), _mm_add_epi64(_mm_mul_epu32(d8, r4_2), _mm_add_epi64(_mm_mul_epu32(d7, r5_2 ), _mm_mul_epu32(d6, r[6].v))))); + out[3].v = _mm_add_epi64(out[3].v, _mm_add_epi64(_mm_mul_epu32(d9, r[4].v ), _mm_add_epi64(_mm_mul_epu32(d8, r5_2), _mm_mul_epu32(d7, r[6].v)))); + out[4].v = _mm_add_epi64(out[4].v, _mm_add_epi64(_mm_mul_epu32(d9, r5_2 ), _mm_add_epi64(_mm_mul_epu32(d8, r6_2), _mm_mul_epu32(d7, r[7].v)))); + out[5].v = _mm_add_epi64(out[5].v, _mm_add_epi64(_mm_mul_epu32(d9, r[6].v ), _mm_mul_epu32(d8, r7_2 ))); + out[6].v = _mm_add_epi64(out[6].v, _mm_add_epi64(_mm_mul_epu32(d9, r7_2 ), _mm_mul_epu32(d8, r[8].v))); + out[7].v = _mm_add_epi64(out[7].v, _mm_mul_epu32(d9, r[8].v)); + out[8].v = _mm_add_epi64(out[8].v, _mm_mul_epu32(d9, r[9].v)); + + c1 = _mm_srli_epi64(out[0].v, 26); c2 = _mm_srli_epi64(out[4].v, 26); out[0].v = _mm_and_si128(out[0].v, packedmask26.v); out[4].v = _mm_and_si128(out[4].v, packedmask26.v); out[1].v = _mm_add_epi64(out[1].v, c1); out[5].v = _mm_add_epi64(out[5].v, c2); + c1 = _mm_srli_epi64(out[1].v, 25); c2 = _mm_srli_epi64(out[5].v, 25); out[1].v = _mm_and_si128(out[1].v, packedmask25.v); out[5].v = _mm_and_si128(out[5].v, packedmask25.v); out[2].v = _mm_add_epi64(out[2].v, c1); out[6].v = _mm_add_epi64(out[6].v, c2); + c1 = _mm_srli_epi64(out[2].v, 26); c2 = _mm_srli_epi64(out[6].v, 26); out[2].v = _mm_and_si128(out[2].v, packedmask26.v); out[6].v = _mm_and_si128(out[6].v, packedmask26.v); out[3].v = _mm_add_epi64(out[3].v, c1); out[7].v = _mm_add_epi64(out[7].v, c2); + c1 = _mm_srli_epi64(out[3].v, 25); c2 = _mm_srli_epi64(out[7].v, 25); out[3].v = _mm_and_si128(out[3].v, packedmask25.v); out[7].v = _mm_and_si128(out[7].v, packedmask25.v); out[4].v = _mm_add_epi64(out[4].v, c1); out[8].v = _mm_add_epi64(out[8].v, c2); + c2 = _mm_srli_epi64(out[8].v, 26); out[8].v = _mm_and_si128(out[8].v, packedmask26.v); out[9].v = _mm_add_epi64(out[9].v, c2); + c2 = _mm_srli_epi64(out[9].v, 25); out[9].v = _mm_and_si128(out[9].v, packedmask25.v); out[0].v = _mm_add_epi64(out[0].v, _mm_mul_epu32(c2, packednineteen.v)); + c1 = _mm_srli_epi64(out[0].v, 26); c2 = _mm_srli_epi64(out[4].v, 26); out[0].v = _mm_and_si128(out[0].v, packedmask26.v); out[4].v = _mm_and_si128(out[4].v, packedmask26.v); out[1].v = _mm_add_epi64(out[1].v, c1); out[5].v = _mm_add_epi64(out[5].v, c2); +} + + +/* Take a little-endian, 32-byte number and expand it into polynomial form */ +static void +curve25519_expand(bignum25519 out, const unsigned char in[32]) { + uint32_t x0,x1,x2,x3,x4,x5,x6,x7; + + x0 = *(uint32_t *)(in + 0); + x1 = *(uint32_t *)(in + 4); + x2 = *(uint32_t *)(in + 8); + x3 = *(uint32_t *)(in + 12); + x4 = *(uint32_t *)(in + 16); + x5 = *(uint32_t *)(in + 20); + x6 = *(uint32_t *)(in + 24); + x7 = *(uint32_t *)(in + 28); + + out[0] = ( x0 ) & 0x3ffffff; + out[1] = ((((uint64_t)x1 << 32) | x0) >> 26) & 0x1ffffff; + out[2] = ((((uint64_t)x2 << 32) | x1) >> 19) & 0x3ffffff; + out[3] = ((((uint64_t)x3 << 32) | x2) >> 13) & 0x1ffffff; + out[4] = (( x3) >> 6) & 0x3ffffff; + out[5] = ( x4 ) & 0x1ffffff; + out[6] = ((((uint64_t)x5 << 32) | x4) >> 25) & 0x3ffffff; + out[7] = ((((uint64_t)x6 << 32) | x5) >> 19) & 0x1ffffff; + out[8] = ((((uint64_t)x7 << 32) | x6) >> 12) & 0x3ffffff; + out[9] = (( x7) >> 6) & 0x1ffffff; + out[10] = 0; + out[11] = 0; +} + +/* Take a fully reduced polynomial form number and contract it into a + * little-endian, 32-byte array + */ +static void +curve25519_contract(unsigned char out[32], const bignum25519 in) { + bignum25519 ALIGN(16) f; + curve25519_copy(f, in); + + #define carry_pass() \ + f[1] += f[0] >> 26; f[0] &= 0x3ffffff; \ + f[2] += f[1] >> 25; f[1] &= 0x1ffffff; \ + f[3] += f[2] >> 26; f[2] &= 0x3ffffff; \ + f[4] += f[3] >> 25; f[3] &= 0x1ffffff; \ + f[5] += f[4] >> 26; f[4] &= 0x3ffffff; \ + f[6] += f[5] >> 25; f[5] &= 0x1ffffff; \ + f[7] += f[6] >> 26; f[6] &= 0x3ffffff; \ + f[8] += f[7] >> 25; f[7] &= 0x1ffffff; \ + f[9] += f[8] >> 26; f[8] &= 0x3ffffff; + + #define carry_pass_full() \ + carry_pass() \ + f[0] += 19 * (f[9] >> 25); f[9] &= 0x1ffffff; + + #define carry_pass_final() \ + carry_pass() \ + f[9] &= 0x1ffffff; + + carry_pass_full() + carry_pass_full() + + /* now t is between 0 and 2^255-1, properly carried. */ + /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */ + f[0] += 19; + carry_pass_full() + + /* now between 19 and 2^255-1 in both cases, and offset by 19. */ + f[0] += (1 << 26) - 19; + f[1] += (1 << 25) - 1; + f[2] += (1 << 26) - 1; + f[3] += (1 << 25) - 1; + f[4] += (1 << 26) - 1; + f[5] += (1 << 25) - 1; + f[6] += (1 << 26) - 1; + f[7] += (1 << 25) - 1; + f[8] += (1 << 26) - 1; + f[9] += (1 << 25) - 1; + + /* now between 2^255 and 2^256-20, and offset by 2^255. */ + carry_pass_final() + + #undef carry_pass + #undef carry_full + #undef carry_final + + f[1] <<= 2; + f[2] <<= 3; + f[3] <<= 5; + f[4] <<= 6; + f[6] <<= 1; + f[7] <<= 3; + f[8] <<= 4; + f[9] <<= 6; + + #define F(i, s) \ + out[s+0] |= (unsigned char )(f[i] & 0xff); \ + out[s+1] = (unsigned char )((f[i] >> 8) & 0xff); \ + out[s+2] = (unsigned char )((f[i] >> 16) & 0xff); \ + out[s+3] = (unsigned char )((f[i] >> 24) & 0xff); + + out[0] = 0; + out[16] = 0; + F(0,0); + F(1,3); + F(2,6); + F(3,9); + F(4,12); + F(5,16); + F(6,19); + F(7,22); + F(8,25); + F(9,28); + #undef F +} + +/* if (iswap) swap(a, b) */ +DONNA_INLINE static void +curve25519_swap_conditional(bignum25519 a, bignum25519 b, uint32_t iswap) { + const uint32_t swap = (uint32_t)(-(int32_t)iswap); + xmmi a0,a1,a2,b0,b1,b2,x0,x1,x2; + xmmi mask = _mm_cvtsi32_si128(swap); + mask = _mm_shuffle_epi32(mask, 0); + a0 = _mm_load_si128((xmmi *)a + 0); + a1 = _mm_load_si128((xmmi *)a + 1); + b0 = _mm_load_si128((xmmi *)b + 0); + b1 = _mm_load_si128((xmmi *)b + 1); + b0 = _mm_xor_si128(a0, b0); + b1 = _mm_xor_si128(a1, b1); + x0 = _mm_and_si128(b0, mask); + x1 = _mm_and_si128(b1, mask); + x0 = _mm_xor_si128(x0, a0); + x1 = _mm_xor_si128(x1, a1); + a0 = _mm_xor_si128(x0, b0); + a1 = _mm_xor_si128(x1, b1); + _mm_store_si128((xmmi *)a + 0, x0); + _mm_store_si128((xmmi *)a + 1, x1); + _mm_store_si128((xmmi *)b + 0, a0); + _mm_store_si128((xmmi *)b + 1, a1); + + a2 = _mm_load_si128((xmmi *)a + 2); + b2 = _mm_load_si128((xmmi *)b + 2); + b2 = _mm_xor_si128(a2, b2); + x2 = _mm_and_si128(b2, mask); + x2 = _mm_xor_si128(x2, a2); + a2 = _mm_xor_si128(x2, b2); + _mm_store_si128((xmmi *)b + 2, a2); + _mm_store_si128((xmmi *)a + 2, x2); +} + +/* out = (flag) ? out : in */ +DONNA_INLINE static void +curve25519_move_conditional_bytes(uint8_t out[96], const uint8_t in[96], uint32_t flag) { + xmmi a0,a1,a2,a3,a4,a5,b0,b1,b2,b3,b4,b5; + const uint32_t nb = flag - 1; + xmmi masknb = _mm_shuffle_epi32(_mm_cvtsi32_si128(nb),0); + a0 = _mm_load_si128((xmmi *)in + 0); + a1 = _mm_load_si128((xmmi *)in + 1); + a2 = _mm_load_si128((xmmi *)in + 2); + b0 = _mm_load_si128((xmmi *)out + 0); + b1 = _mm_load_si128((xmmi *)out + 1); + b2 = _mm_load_si128((xmmi *)out + 2); + a0 = _mm_andnot_si128(masknb, a0); + a1 = _mm_andnot_si128(masknb, a1); + a2 = _mm_andnot_si128(masknb, a2); + b0 = _mm_and_si128(masknb, b0); + b1 = _mm_and_si128(masknb, b1); + b2 = _mm_and_si128(masknb, b2); + a0 = _mm_or_si128(a0, b0); + a1 = _mm_or_si128(a1, b1); + a2 = _mm_or_si128(a2, b2); + _mm_store_si128((xmmi*)out + 0, a0); + _mm_store_si128((xmmi*)out + 1, a1); + _mm_store_si128((xmmi*)out + 2, a2); + + a3 = _mm_load_si128((xmmi *)in + 3); + a4 = _mm_load_si128((xmmi *)in + 4); + a5 = _mm_load_si128((xmmi *)in + 5); + b3 = _mm_load_si128((xmmi *)out + 3); + b4 = _mm_load_si128((xmmi *)out + 4); + b5 = _mm_load_si128((xmmi *)out + 5); + a3 = _mm_andnot_si128(masknb, a3); + a4 = _mm_andnot_si128(masknb, a4); + a5 = _mm_andnot_si128(masknb, a5); + b3 = _mm_and_si128(masknb, b3); + b4 = _mm_and_si128(masknb, b4); + b5 = _mm_and_si128(masknb, b5); + a3 = _mm_or_si128(a3, b3); + a4 = _mm_or_si128(a4, b4); + a5 = _mm_or_si128(a5, b5); + _mm_store_si128((xmmi*)out + 3, a3); + _mm_store_si128((xmmi*)out + 4, a4); + _mm_store_si128((xmmi*)out + 5, a5); +} + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-32bit-sse2.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-32bit-sse2.h new file mode 100644 index 000000000..db04a13d3 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-32bit-sse2.h @@ -0,0 +1,513 @@ +#if defined(ED25519_GCC_32BIT_SSE_CHOOSE) + +#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS + +DONNA_NOINLINE static void +ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { + int32_t breg = (int32_t)b; + uint32_t sign = (uint32_t)breg >> 31; + uint32_t mask = ~(sign - 1); + uint32_t u = (breg + mask) ^ mask; + + __asm__ __volatile__ ( + /* ysubx+xaddy */ + "movl %0, %%eax ;\n" + "movd %%eax, %%xmm6 ;\n" + "pshufd $0x00, %%xmm6, %%xmm6 ;\n" + "pxor %%xmm0, %%xmm0 ;\n" + "pxor %%xmm1, %%xmm1 ;\n" + "pxor %%xmm2, %%xmm2 ;\n" + "pxor %%xmm3, %%xmm3 ;\n" + + /* 0 */ + "movl $0, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movl $1, %%ecx ;\n" + "movd %%ecx, %%xmm4 ;\n" + "pxor %%xmm5, %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm0 ;\n" + "por %%xmm5, %%xmm1 ;\n" + "por %%xmm4, %%xmm2 ;\n" + "por %%xmm5, %%xmm3 ;\n" + + /* 1 */ + "movl $1, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 0(%1), %%xmm4 ;\n" + "movdqa 16(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm0 ;\n" + "por %%xmm5, %%xmm1 ;\n" + "movdqa 32(%1), %%xmm4 ;\n" + "movdqa 48(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm2 ;\n" + "por %%xmm5, %%xmm3 ;\n" + + /* 2 */ + "movl $2, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 96(%1), %%xmm4 ;\n" + "movdqa 112(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm0 ;\n" + "por %%xmm5, %%xmm1 ;\n" + "movdqa 128(%1), %%xmm4 ;\n" + "movdqa 144(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm2 ;\n" + "por %%xmm5, %%xmm3 ;\n" + + /* 3 */ + "movl $3, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 192(%1), %%xmm4 ;\n" + "movdqa 208(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm0 ;\n" + "por %%xmm5, %%xmm1 ;\n" + "movdqa 224(%1), %%xmm4 ;\n" + "movdqa 240(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm2 ;\n" + "por %%xmm5, %%xmm3 ;\n" + + /* 4 */ + "movl $4, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 288(%1), %%xmm4 ;\n" + "movdqa 304(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm0 ;\n" + "por %%xmm5, %%xmm1 ;\n" + "movdqa 320(%1), %%xmm4 ;\n" + "movdqa 336(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm2 ;\n" + "por %%xmm5, %%xmm3 ;\n" + + /* 5 */ + "movl $5, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 384(%1), %%xmm4 ;\n" + "movdqa 400(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm0 ;\n" + "por %%xmm5, %%xmm1 ;\n" + "movdqa 416(%1), %%xmm4 ;\n" + "movdqa 432(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm2 ;\n" + "por %%xmm5, %%xmm3 ;\n" + + /* 6 */ + "movl $6, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 480(%1), %%xmm4 ;\n" + "movdqa 496(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm0 ;\n" + "por %%xmm5, %%xmm1 ;\n" + "movdqa 512(%1), %%xmm4 ;\n" + "movdqa 528(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm2 ;\n" + "por %%xmm5, %%xmm3 ;\n" + + /* 7 */ + "movl $7, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 576(%1), %%xmm4 ;\n" + "movdqa 592(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm0 ;\n" + "por %%xmm5, %%xmm1 ;\n" + "movdqa 608(%1), %%xmm4 ;\n" + "movdqa 624(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm2 ;\n" + "por %%xmm5, %%xmm3 ;\n" + + /* 8 */ + "movl $8, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 672(%1), %%xmm4 ;\n" + "movdqa 688(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm0 ;\n" + "por %%xmm5, %%xmm1 ;\n" + "movdqa 704(%1), %%xmm4 ;\n" + "movdqa 720(%1), %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "por %%xmm4, %%xmm2 ;\n" + "por %%xmm5, %%xmm3 ;\n" + + /* conditional swap based on sign */ + "movl %3, %%ecx ;\n" + "movl %2, %%eax ;\n" + "xorl $1, %%ecx ;\n" + "movd %%ecx, %%xmm6 ;\n" + "pxor %%xmm7, %%xmm7 ;\n" + "pshufd $0x00, %%xmm6, %%xmm6 ;\n" + "pxor %%xmm0, %%xmm2 ;\n" + "pxor %%xmm1, %%xmm3 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa %%xmm2, %%xmm4 ;\n" + "movdqa %%xmm3, %%xmm5 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "pand %%xmm7, %%xmm5 ;\n" + "pxor %%xmm4, %%xmm0 ;\n" + "pxor %%xmm5, %%xmm1 ;\n" + "pxor %%xmm0, %%xmm2 ;\n" + "pxor %%xmm1, %%xmm3 ;\n" + + /* store ysubx */ + "movd %%xmm0, %%ecx ;\n" + "movl %%ecx, %%edx ;\n" + "pshufd $0x39, %%xmm0, %%xmm0 ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 0(%%eax) ;\n" + "movd %%xmm0, %%ecx ;\n" + "pshufd $0x39, %%xmm0, %%xmm0 ;\n" + "shrdl $26, %%ecx, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 4(%%eax) ;\n" + "movd %%xmm0, %%edx ;\n" + "pshufd $0x39, %%xmm0, %%xmm0 ;\n" + "shrdl $19, %%edx, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 8(%%eax) ;\n" + "movd %%xmm0, %%ecx ;\n" + "shrdl $13, %%ecx, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 12(%%eax) ;\n" + "movd %%xmm1, %%edx ;\n" + "pshufd $0x39, %%xmm1, %%xmm1 ;\n" + "shrl $6, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 16(%%eax) ;\n" + "movl %%edx, %%ecx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 20(%%eax) ;\n" + "movd %%xmm1, %%edx ;\n" + "pshufd $0x39, %%xmm1, %%xmm1 ;\n" + "shrdl $25, %%edx, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 24(%%eax) ;\n" + "movd %%xmm1, %%ecx ;\n" + "pshufd $0x39, %%xmm1, %%xmm1 ;\n" + "shrdl $19, %%ecx, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 28(%%eax) ;\n" + "movd %%xmm1, %%edx ;\n" + "shrdl $12, %%edx, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 32(%%eax) ;\n" + "shrl $6, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "xorl %%ecx, %%ecx ;\n" + "movl %%edx, 36(%%eax) ;\n" + "movl %%ecx, 40(%%eax) ;\n" + "movl %%ecx, 44(%%eax) ;\n" + + /* store xaddy */ + "addl $48, %%eax ;\n" + "movdqa %%xmm2, %%xmm0 ;\n" + "movdqa %%xmm3, %%xmm1 ;\n" + "movd %%xmm0, %%ecx ;\n" + "movl %%ecx, %%edx ;\n" + "pshufd $0x39, %%xmm0, %%xmm0 ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 0(%%eax) ;\n" + "movd %%xmm0, %%ecx ;\n" + "pshufd $0x39, %%xmm0, %%xmm0 ;\n" + "shrdl $26, %%ecx, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 4(%%eax) ;\n" + "movd %%xmm0, %%edx ;\n" + "pshufd $0x39, %%xmm0, %%xmm0 ;\n" + "shrdl $19, %%edx, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 8(%%eax) ;\n" + "movd %%xmm0, %%ecx ;\n" + "shrdl $13, %%ecx, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 12(%%eax) ;\n" + "movd %%xmm1, %%edx ;\n" + "pshufd $0x39, %%xmm1, %%xmm1 ;\n" + "shrl $6, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 16(%%eax) ;\n" + "movl %%edx, %%ecx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 20(%%eax) ;\n" + "movd %%xmm1, %%edx ;\n" + "pshufd $0x39, %%xmm1, %%xmm1 ;\n" + "shrdl $25, %%edx, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 24(%%eax) ;\n" + "movd %%xmm1, %%ecx ;\n" + "pshufd $0x39, %%xmm1, %%xmm1 ;\n" + "shrdl $19, %%ecx, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 28(%%eax) ;\n" + "movd %%xmm1, %%edx ;\n" + "shrdl $12, %%edx, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 32(%%eax) ;\n" + "shrl $6, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "xorl %%ecx, %%ecx ;\n" + "movl %%edx, 36(%%eax) ;\n" + "movl %%ecx, 40(%%eax) ;\n" + "movl %%ecx, 44(%%eax) ;\n" + + /* t2d */ + "movl %0, %%eax ;\n" + "movd %%eax, %%xmm6 ;\n" + "pshufd $0x00, %%xmm6, %%xmm6 ;\n" + "pxor %%xmm0, %%xmm0 ;\n" + "pxor %%xmm1, %%xmm1 ;\n" + + /* 0 */ + "movl $0, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "pxor %%xmm0, %%xmm0 ;\n" + "pxor %%xmm1, %%xmm1 ;\n" + + /* 1 */ + "movl $1, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 64(%1), %%xmm3 ;\n" + "movdqa 80(%1), %%xmm4 ;\n" + "pand %%xmm7, %%xmm3 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "por %%xmm3, %%xmm0 ;\n" + "por %%xmm4, %%xmm1 ;\n" + + /* 2 */ + "movl $2, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 160(%1), %%xmm3 ;\n" + "movdqa 176(%1), %%xmm4 ;\n" + "pand %%xmm7, %%xmm3 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "por %%xmm3, %%xmm0 ;\n" + "por %%xmm4, %%xmm1 ;\n" + + /* 3 */ + "movl $3, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 256(%1), %%xmm3 ;\n" + "movdqa 272(%1), %%xmm4 ;\n" + "pand %%xmm7, %%xmm3 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "por %%xmm3, %%xmm0 ;\n" + "por %%xmm4, %%xmm1 ;\n" + + /* 4 */ + "movl $4, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 352(%1), %%xmm3 ;\n" + "movdqa 368(%1), %%xmm4 ;\n" + "pand %%xmm7, %%xmm3 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "por %%xmm3, %%xmm0 ;\n" + "por %%xmm4, %%xmm1 ;\n" + + /* 5 */ + "movl $5, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 448(%1), %%xmm3 ;\n" + "movdqa 464(%1), %%xmm4 ;\n" + "pand %%xmm7, %%xmm3 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "por %%xmm3, %%xmm0 ;\n" + "por %%xmm4, %%xmm1 ;\n" + + /* 6 */ + "movl $6, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 544(%1), %%xmm3 ;\n" + "movdqa 560(%1), %%xmm4 ;\n" + "pand %%xmm7, %%xmm3 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "por %%xmm3, %%xmm0 ;\n" + "por %%xmm4, %%xmm1 ;\n" + + /* 7 */ + "movl $7, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 640(%1), %%xmm3 ;\n" + "movdqa 656(%1), %%xmm4 ;\n" + "pand %%xmm7, %%xmm3 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "por %%xmm3, %%xmm0 ;\n" + "por %%xmm4, %%xmm1 ;\n" + + /* 8 */ + "movl $8, %%eax ;\n" + "movd %%eax, %%xmm7 ;\n" + "pshufd $0x00, %%xmm7, %%xmm7 ;\n" + "pcmpeqd %%xmm6, %%xmm7 ;\n" + "movdqa 736(%1), %%xmm3 ;\n" + "movdqa 752(%1), %%xmm4 ;\n" + "pand %%xmm7, %%xmm3 ;\n" + "pand %%xmm7, %%xmm4 ;\n" + "por %%xmm3, %%xmm0 ;\n" + "por %%xmm4, %%xmm1 ;\n" + + /* store t2d */ + "movl %2, %%eax ;\n" + "addl $96, %%eax ;\n" + "movd %%xmm0, %%ecx ;\n" + "movl %%ecx, %%edx ;\n" + "pshufd $0x39, %%xmm0, %%xmm0 ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 0(%%eax) ;\n" + "movd %%xmm0, %%ecx ;\n" + "pshufd $0x39, %%xmm0, %%xmm0 ;\n" + "shrdl $26, %%ecx, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 4(%%eax) ;\n" + "movd %%xmm0, %%edx ;\n" + "pshufd $0x39, %%xmm0, %%xmm0 ;\n" + "shrdl $19, %%edx, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 8(%%eax) ;\n" + "movd %%xmm0, %%ecx ;\n" + "shrdl $13, %%ecx, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 12(%%eax) ;\n" + "movd %%xmm1, %%edx ;\n" + "pshufd $0x39, %%xmm1, %%xmm1 ;\n" + "shrl $6, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 16(%%eax) ;\n" + "movl %%edx, %%ecx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 20(%%eax) ;\n" + "movd %%xmm1, %%edx ;\n" + "pshufd $0x39, %%xmm1, %%xmm1 ;\n" + "shrdl $25, %%edx, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 24(%%eax) ;\n" + "movd %%xmm1, %%ecx ;\n" + "pshufd $0x39, %%xmm1, %%xmm1 ;\n" + "shrdl $19, %%ecx, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "movl %%edx, 28(%%eax) ;\n" + "movd %%xmm1, %%edx ;\n" + "movd %%xmm1, %%edx ;\n" + "shrdl $12, %%edx, %%ecx ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "movl %%ecx, 32(%%eax) ;\n" + "shrl $6, %%edx ;\n" + "andl $0x1ffffff, %%edx ;\n" + "xorl %%ecx, %%ecx ;\n" + "movl %%edx, 36(%%eax) ;\n" + "movl %%ecx, 40(%%eax) ;\n" + "movl %%ecx, 44(%%eax) ;\n" + "movdqa 0(%%eax), %%xmm0 ;\n" + "movdqa 16(%%eax), %%xmm1 ;\n" + "movdqa 32(%%eax), %%xmm2 ;\n" + + /* conditionally negate t2d */ + + /* set up 2p in to 3/4 */ + "movl $0x7ffffda, %%ecx ;\n" + "movl $0x3fffffe, %%edx ;\n" + "movd %%ecx, %%xmm3 ;\n" + "movd %%edx, %%xmm5 ;\n" + "movl $0x7fffffe, %%ecx ;\n" + "movd %%ecx, %%xmm4 ;\n" + "punpckldq %%xmm5, %%xmm3 ;\n" + "punpckldq %%xmm5, %%xmm4 ;\n" + "punpcklqdq %%xmm4, %%xmm3 ;\n" + "movdqa %%xmm4, %%xmm5 ;\n" + "punpcklqdq %%xmm4, %%xmm4 ;\n" + + /* subtract and conditionally move */ + "movl %3, %%ecx ;\n" + "sub $1, %%ecx ;\n" + "movd %%ecx, %%xmm6 ;\n" + "pshufd $0x00, %%xmm6, %%xmm6 ;\n" + "movdqa %%xmm6, %%xmm7 ;\n" + "psubd %%xmm0, %%xmm3 ;\n" + "psubd %%xmm1, %%xmm4 ;\n" + "psubd %%xmm2, %%xmm5 ;\n" + "pand %%xmm6, %%xmm0 ;\n" + "pand %%xmm6, %%xmm1 ;\n" + "pand %%xmm6, %%xmm2 ;\n" + "pandn %%xmm3, %%xmm6 ;\n" + "movdqa %%xmm7, %%xmm3 ;\n" + "pandn %%xmm4, %%xmm7 ;\n" + "pandn %%xmm5, %%xmm3 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm3, %%xmm2 ;\n" + + /* store */ + "movdqa %%xmm0, 0(%%eax) ;\n" + "movdqa %%xmm1, 16(%%eax) ;\n" + "movdqa %%xmm2, 32(%%eax) ;\n" + : + : "m"(u), "r"(&table[pos * 8]), "m"(t), "m"(sign) /* %0 = u, %1 = table, %2 = t, %3 = sign */ + : "%eax", "%ecx", "%edx", "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "cc", "memory" + ); +} + +#endif /* defined(ED25519_GCC_32BIT_SSE_CHOOSE) */ + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-32bit-tables.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-32bit-tables.h new file mode 100644 index 000000000..c977c26eb --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-32bit-tables.h @@ -0,0 +1,61 @@ +static const ge25519 ALIGN(16) ge25519_basepoint = { + {0x0325d51a,0x018b5823,0x00f6592a,0x0104a92d,0x01a4b31d,0x01d6dc5c,0x027118fe,0x007fd814,0x013cd6e5,0x0085a4db}, + {0x02666658,0x01999999,0x00cccccc,0x01333333,0x01999999,0x00666666,0x03333333,0x00cccccc,0x02666666,0x01999999}, + {0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000}, + {0x01b7dda3,0x01a2ace9,0x025eadbb,0x0003ba8a,0x0083c27e,0x00abe37d,0x01274732,0x00ccacdd,0x00fd78b7,0x019e1d7c} +}; + +/* + d +*/ + +static const bignum25519 ALIGN(16) ge25519_ecd = { + 0x035978a3,0x00d37284,0x03156ebd,0x006a0a0e,0x0001c029,0x0179e898,0x03a03cbb,0x01ce7198,0x02e2b6ff,0x01480db3 +}; + +static const bignum25519 ALIGN(16) ge25519_ec2d = { + 0x02b2f159,0x01a6e509,0x022add7a,0x00d4141d,0x00038052,0x00f3d130,0x03407977,0x019ce331,0x01c56dff,0x00901b67 +}; + +/* + sqrt(-1) +*/ + +static const bignum25519 ALIGN(16) ge25519_sqrtneg1 = { + 0x020ea0b0,0x0186c9d2,0x008f189d,0x0035697f,0x00bd0c60,0x01fbd7a7,0x02804c9e,0x01e16569,0x0004fc1d,0x00ae0c92 +}; + +static const ge25519_niels ALIGN(16) ge25519_niels_sliding_multiples[32] = { + {{0x0340913e,0x000e4175,0x03d673a2,0x002e8a05,0x03f4e67c,0x008f8a09,0x00c21a34,0x004cf4b8,0x01298f81,0x0113f4be},{0x018c3b85,0x0124f1bd,0x01c325f7,0x0037dc60,0x033e4cb7,0x003d42c2,0x01a44c32,0x014ca4e1,0x03a33d4b,0x001f3e74},{0x037aaa68,0x00448161,0x0093d579,0x011e6556,0x009b67a0,0x0143598c,0x01bee5ee,0x00b50b43,0x0289f0c6,0x01bc45ed}}, + {{0x00fcd265,0x0047fa29,0x034faacc,0x01ef2e0d,0x00ef4d4f,0x014bd6bd,0x00f98d10,0x014c5026,0x007555bd,0x00aae456},{0x00ee9730,0x016c2a13,0x017155e4,0x01874432,0x00096a10,0x01016732,0x01a8014f,0x011e9823,0x01b9a80f,0x01e85938},{0x01d0d889,0x01a4cfc3,0x034c4295,0x0110e1ae,0x0162508c,0x00f2db4c,0x0072a2c6,0x0098da2e,0x02f12b9b,0x0168a09a}}, + {{0x0047d6ba,0x0060b0e9,0x0136eff2,0x008a5939,0x03540053,0x0064a087,0x02788e5c,0x00be7c67,0x033eb1b5,0x005529f9},{0x00a5bb33,0x00af1102,0x01a05442,0x001e3af7,0x02354123,0x00bfec44,0x01f5862d,0x00dd7ba3,0x03146e20,0x00a51733},{0x012a8285,0x00f6fc60,0x023f9797,0x003e85ee,0x009c3820,0x01bda72d,0x01b3858d,0x00d35683,0x0296b3bb,0x010eaaf9}}, + {{0x023221b1,0x01cb26aa,0x0074f74d,0x0099ddd1,0x01b28085,0x00192c3a,0x013b27c9,0x00fc13bd,0x01d2e531,0x0075bb75},{0x004ea3bf,0x00973425,0x001a4d63,0x01d59cee,0x01d1c0d4,0x00542e49,0x01294114,0x004fce36,0x029283c9,0x01186fa9},{0x01b8b3a2,0x00db7200,0x00935e30,0x003829f5,0x02cc0d7d,0x0077adf3,0x0220dd2c,0x0014ea53,0x01c6a0f9,0x01ea7eec}}, + {{0x039d8064,0x01885f80,0x00337e6d,0x01b7a902,0x02628206,0x015eb044,0x01e30473,0x0191f2d9,0x011fadc9,0x01270169},{0x02a8632f,0x0199e2a9,0x00d8b365,0x017a8de2,0x02994279,0x0086f5b5,0x0119e4e3,0x01eb39d6,0x0338add7,0x00d2e7b4},{0x0045af1b,0x013a2fe4,0x0245e0d6,0x014538ce,0x038bfe0f,0x01d4cf16,0x037e14c9,0x0160d55e,0x0021b008,0x01cf05c8}}, + {{0x01864348,0x01d6c092,0x0070262b,0x014bb844,0x00fb5acd,0x008deb95,0x003aaab5,0x00eff474,0x00029d5c,0x0062ad66},{0x02802ade,0x01c02122,0x01c4e5f7,0x00781181,0x039767fb,0x01703406,0x0342388b,0x01f5e227,0x022546d8,0x0109d6ab},{0x016089e9,0x00cb317f,0x00949b05,0x01099417,0x000c7ad2,0x011a8622,0x0088ccda,0x01290886,0x022b53df,0x00f71954}}, + {{0x027fbf93,0x01c04ecc,0x01ed6a0d,0x004cdbbb,0x02bbf3af,0x00ad5968,0x01591955,0x0094f3a2,0x02d17602,0x00099e20},{0x02007f6d,0x003088a8,0x03db77ee,0x00d5ade6,0x02fe12ce,0x0107ba07,0x0107097d,0x00482a6f,0x02ec346f,0x008d3f5f},{0x032ea378,0x0028465c,0x028e2a6c,0x018efc6e,0x0090df9a,0x01a7e533,0x039bfc48,0x010c745d,0x03daa097,0x0125ee9b}}, + {{0x028ccf0b,0x00f36191,0x021ac081,0x012154c8,0x034e0a6e,0x01b25192,0x00180403,0x01d7eea1,0x00218d05,0x010ed735},{0x03cfeaa0,0x01b300c4,0x008da499,0x0068c4e1,0x0219230a,0x01f2d4d0,0x02defd60,0x00e565b7,0x017f12de,0x018788a4},{0x03d0b516,0x009d8be6,0x03ddcbb3,0x0071b9fe,0x03ace2bd,0x01d64270,0x032d3ec9,0x01084065,0x0210ae4d,0x01447584}}, + {{0x0020de87,0x00e19211,0x01b68102,0x00b5ac97,0x022873c0,0x01942d25,0x01271394,0x0102073f,0x02fe2482,0x01c69ff9},{0x010e9d81,0x019dbbe5,0x0089f258,0x006e06b8,0x02951883,0x018f1248,0x019b3237,0x00bc7553,0x024ddb85,0x01b4c964},{0x01c8c854,0x0060ae29,0x01406d8e,0x01cff2f9,0x00cff451,0x01778d0c,0x03ac8c41,0x01552e59,0x036559ee,0x011d1b12}}, + {{0x00741147,0x0151b219,0x01092690,0x00e877e6,0x01f4d6bb,0x0072a332,0x01cd3b03,0x00dadff2,0x0097db5e,0x0086598d},{0x01c69a2b,0x01decf1b,0x02c2fa6e,0x013b7c4f,0x037beac8,0x013a16b5,0x028e7bda,0x01f6e8ac,0x01e34fe9,0x01726947},{0x01f10e67,0x003c73de,0x022b7ea2,0x010f32c2,0x03ff776a,0x00142277,0x01d38b88,0x00776138,0x03c60822,0x01201140}}, + {{0x0236d175,0x0008748e,0x03c6476d,0x013f4cdc,0x02eed02a,0x00838a47,0x032e7210,0x018bcbb3,0x00858de4,0x01dc7826},{0x00a37fc7,0x0127b40b,0x01957884,0x011d30ad,0x02816683,0x016e0e23,0x00b76be4,0x012db115,0x02516506,0x0154ce62},{0x00451edf,0x00bd749e,0x03997342,0x01cc2c4c,0x00eb6975,0x01a59508,0x03a516cf,0x00c228ef,0x0168ff5a,0x01697b47}}, + {{0x00527359,0x01783156,0x03afd75c,0x00ce56dc,0x00e4b970,0x001cabe9,0x029e0f6d,0x0188850c,0x0135fefd,0x00066d80},{0x02150e83,0x01448abf,0x02bb0232,0x012bf259,0x033c8268,0x00711e20,0x03fc148f,0x005e0e70,0x017d8bf9,0x0112b2e2},{0x02134b83,0x001a0517,0x0182c3cc,0x00792182,0x0313d799,0x001a3ed7,0x0344547e,0x01f24a0d,0x03de6ad2,0x00543127}}, + {{0x00dca868,0x00618f27,0x015a1709,0x00ddc38a,0x0320fd13,0x0036168d,0x0371ab06,0x01783fc7,0x0391e05f,0x01e29b5d},{0x01471138,0x00fca542,0x00ca31cf,0x01ca7bad,0x0175bfbc,0x01a708ad,0x03bce212,0x01244215,0x0075bb99,0x01acad68},{0x03a0b976,0x01dc12d1,0x011aab17,0x00aba0ba,0x029806cd,0x0142f590,0x018fd8ea,0x01a01545,0x03c4ad55,0x01c971ff}}, + {{0x00d098c0,0x000afdc7,0x006cd230,0x01276af3,0x03f905b2,0x0102994c,0x002eb8a4,0x015cfbeb,0x025f855f,0x01335518},{0x01cf99b2,0x0099c574,0x01a69c88,0x00881510,0x01cd4b54,0x0112109f,0x008abdc5,0x0074647a,0x0277cb1f,0x01e53324},{0x02ac5053,0x01b109b0,0x024b095e,0x016997b3,0x02f26bb6,0x00311021,0x00197885,0x01d0a55a,0x03b6fcc8,0x01c020d5}}, + {{0x02584a34,0x00e7eee0,0x03257a03,0x011e95a3,0x011ead91,0x00536202,0x00b1ce24,0x008516c6,0x03669d6d,0x004ea4a8},{0x00773f01,0x0019c9ce,0x019f6171,0x01d4afde,0x02e33323,0x01ad29b6,0x02ead1dc,0x01ed51a5,0x01851ad0,0x001bbdfa},{0x00577de5,0x00ddc730,0x038b9952,0x00f281ae,0x01d50390,0x0002e071,0x000780ec,0x010d448d,0x01f8a2af,0x00f0a5b7}}, + {{0x031f2541,0x00d34bae,0x0323ff9d,0x003a056d,0x02e25443,0x00a1ad05,0x00d1bee8,0x002f7f8e,0x03007477,0x002a24b1},{0x0114a713,0x01457e76,0x032255d5,0x01cc647f,0x02a4bdef,0x0153d730,0x00118bcf,0x00f755ff,0x013490c7,0x01ea674e},{0x02bda3e8,0x00bb490d,0x00f291ea,0x000abf40,0x01dea321,0x002f9ce0,0x00b2b193,0x00fa54b5,0x0128302f,0x00a19d8b}}, + {{0x022ef5bd,0x01638af3,0x038c6f8a,0x01a33a3d,0x039261b2,0x01bb89b8,0x010bcf9d,0x00cf42a9,0x023d6f17,0x01da1bca},{0x00e35b25,0x000d824f,0x0152e9cf,0x00ed935d,0x020b8460,0x01c7b83f,0x00c969e5,0x01a74198,0x0046a9d9,0x00cbc768},{0x01597c6a,0x0144a99b,0x00a57551,0x0018269c,0x023c464c,0x0009b022,0x00ee39e1,0x0114c7f2,0x038a9ad2,0x01584c17}}, + {{0x03b0c0d5,0x00b30a39,0x038a6ce4,0x01ded83a,0x01c277a6,0x01010a61,0x0346d3eb,0x018d995e,0x02f2c57c,0x000c286b},{0x0092aed1,0x0125e37b,0x027ca201,0x001a6b6b,0x03290f55,0x0047ba48,0x018d916c,0x01a59062,0x013e35d4,0x0002abb1},{0x003ad2aa,0x007ddcc0,0x00c10f76,0x0001590b,0x002cfca6,0x000ed23e,0x00ee4329,0x00900f04,0x01c24065,0x0082fa70}}, + {{0x02025e60,0x003912b8,0x0327041c,0x017e5ee5,0x02c0ecec,0x015a0d1c,0x02b1ce7c,0x0062220b,0x0145067e,0x01a5d931},{0x009673a6,0x00e1f609,0x00927c2a,0x016faa37,0x01650ef0,0x016f63b5,0x03cd40e1,0x003bc38f,0x0361f0ac,0x01d42acc},{0x02f81037,0x008ca0e8,0x017e23d1,0x011debfe,0x01bcbb68,0x002e2563,0x03e8add6,0x000816e5,0x03fb7075,0x0153e5ac}}, + {{0x02b11ecd,0x016bf185,0x008f22ef,0x00e7d2bb,0x0225d92e,0x00ece785,0x00508873,0x017e16f5,0x01fbe85d,0x01e39a0e},{0x01669279,0x017c810a,0x024941f5,0x0023ebeb,0x00eb7688,0x005760f1,0x02ca4146,0x0073cde7,0x0052bb75,0x00f5ffa7},{0x03b8856b,0x00cb7dcd,0x02f14e06,0x001820d0,0x01d74175,0x00e59e22,0x03fba550,0x00484641,0x03350088,0x01c3c9a3}}, + {{0x00dcf355,0x0104481c,0x0022e464,0x01f73fe7,0x00e03325,0x0152b698,0x02ef769a,0x00973663,0x00039b8c,0x0101395b},{0x01805f47,0x019160ec,0x03832cd0,0x008b06eb,0x03d4d717,0x004cb006,0x03a75b8f,0x013b3d30,0x01cfad88,0x01f034d1},{0x0078338a,0x01c7d2e3,0x02bc2b23,0x018b3f05,0x0280d9aa,0x005f3d44,0x0220a95a,0x00eeeb97,0x0362aaec,0x00835d51}}, + {{0x01b9f543,0x013fac4d,0x02ad93ae,0x018ef464,0x0212cdf7,0x01138ba9,0x011583ab,0x019c3d26,0x028790b4,0x00e2e2b6},{0x033bb758,0x01f0dbf1,0x03734bd1,0x0129b1e5,0x02b3950e,0x003bc922,0x01a53ec8,0x018c5532,0x006f3cee,0x00ae3c79},{0x0351f95d,0x0012a737,0x03d596b8,0x017658fe,0x00ace54a,0x008b66da,0x0036c599,0x012a63a2,0x032ceba1,0x00126bac}}, + {{0x03dcfe7e,0x019f4f18,0x01c81aee,0x0044bc2b,0x00827165,0x014f7c13,0x03b430f0,0x00bf96cc,0x020c8d62,0x01471997},{0x01fc7931,0x001f42dd,0x00ba754a,0x005bd339,0x003fbe49,0x016b3930,0x012a159c,0x009f83b0,0x03530f67,0x01e57b85},{0x02ecbd81,0x0096c294,0x01fce4a9,0x017701a5,0x0175047d,0x00ee4a31,0x012686e5,0x008efcd4,0x0349dc54,0x01b3466f}}, + {{0x02179ca3,0x01d86414,0x03f0afd0,0x00305964,0x015c7428,0x0099711e,0x015d5442,0x00c71014,0x01b40b2e,0x01d483cf},{0x01afc386,0x01984859,0x036203ff,0x0045c6a8,0x0020a8aa,0x00990baa,0x03313f10,0x007ceede,0x027429e4,0x017806ce},{0x039357a1,0x0142f8f4,0x0294a7b6,0x00eaccf4,0x0259edb3,0x01311e6e,0x004d326f,0x0130c346,0x01ccef3c,0x01c424b2}}, + {{0x0364918c,0x00148fc0,0x01638a7b,0x01a1fd5b,0x028ad013,0x0081e5a4,0x01a54f33,0x0174e101,0x003d0257,0x003a856c},{0x00051dcf,0x00f62b1d,0x0143d0ad,0x0042adbd,0x000fda90,0x01743ceb,0x0173e5e4,0x017bc749,0x03b7137a,0x0105ce96},{0x00f9218a,0x015b8c7c,0x00e102f8,0x0158d7e2,0x0169a5b8,0x00b2f176,0x018b347a,0x014cfef2,0x0214a4e3,0x017f1595}}, + {{0x006d7ae5,0x0195c371,0x0391e26d,0x0062a7c6,0x003f42ab,0x010dad86,0x024f8198,0x01542b2a,0x0014c454,0x0189c471},{0x0390988e,0x00b8799d,0x02e44912,0x0078e2e6,0x00075654,0x01923eed,0x0040cd72,0x00a37c76,0x0009d466,0x00c8531d},{0x02651770,0x00609d01,0x0286c265,0x0134513c,0x00ee9281,0x005d223c,0x035c760c,0x00679b36,0x0073ecb8,0x016faa50}}, + {{0x02c89be4,0x016fc244,0x02f38c83,0x018beb72,0x02b3ce2c,0x0097b065,0x034f017b,0x01dd957f,0x00148f61,0x00eab357},{0x0343d2f8,0x003398fc,0x011e368e,0x00782a1f,0x00019eea,0x00117b6f,0x0128d0d1,0x01a5e6bb,0x01944f1b,0x012b41e1},{0x03318301,0x018ecd30,0x0104d0b1,0x0038398b,0x03726701,0x019da88c,0x002d9769,0x00a7a681,0x031d9028,0x00ebfc32}}, + {{0x0220405e,0x0171face,0x02d930f8,0x017f6d6a,0x023b8c47,0x0129d5f9,0x02972456,0x00a3a524,0x006f4cd2,0x004439fa},{0x00c53505,0x0190c2fd,0x00507244,0x009930f9,0x01a39270,0x01d327c6,0x0399bc47,0x01cfe13d,0x0332bd99,0x00b33e7d},{0x0203f5e4,0x003627b5,0x00018af8,0x01478581,0x004a2218,0x002e3bb7,0x039384d0,0x0146ea62,0x020b9693,0x0017155f}}, + {{0x03c97e6f,0x00738c47,0x03b5db1f,0x01808fcf,0x01e8fc98,0x01ed25dd,0x01bf5045,0x00eb5c2b,0x0178fe98,0x01b85530},{0x01c20eb0,0x01aeec22,0x030b9eee,0x01b7d07e,0x0187e16f,0x014421fb,0x009fa731,0x0040b6d7,0x00841861,0x00a27fbc},{0x02d69abf,0x0058cdbf,0x0129f9ec,0x013c19ae,0x026c5b93,0x013a7fe7,0x004bb2ba,0x0063226f,0x002a95ca,0x01abefd9}}, + {{0x02f5d2c1,0x00378318,0x03734fb5,0x01258073,0x0263f0f6,0x01ad70e0,0x01b56d06,0x01188fbd,0x011b9503,0x0036d2e1},{0x0113a8cc,0x01541c3e,0x02ac2bbc,0x01d95867,0x01f47459,0x00ead489,0x00ab5b48,0x01db3b45,0x00edb801,0x004b024f},{0x00b8190f,0x011fe4c2,0x00621f82,0x010508d7,0x001a5a76,0x00c7d7fd,0x03aab96d,0x019cd9dc,0x019c6635,0x00ceaa1e}}, + {{0x01085cf2,0x01fd47af,0x03e3f5e1,0x004b3e99,0x01e3d46a,0x0060033c,0x015ff0a8,0x0150cdd8,0x029e8e21,0x008cf1bc},{0x00156cb1,0x003d623f,0x01a4f069,0x00d8d053,0x01b68aea,0x01ca5ab6,0x0316ae43,0x0134dc44,0x001c8d58,0x0084b343},{0x0318c781,0x0135441f,0x03a51a5e,0x019293f4,0x0048bb37,0x013d3341,0x0143151e,0x019c74e1,0x00911914,0x0076ddde}}, + {{0x006bc26f,0x00d48e5f,0x00227bbe,0x00629ea8,0x01ea5f8b,0x0179a330,0x027a1d5f,0x01bf8f8e,0x02d26e2a,0x00c6b65e},{0x01701ab6,0x0051da77,0x01b4b667,0x00a0ce7c,0x038ae37b,0x012ac852,0x03a0b0fe,0x0097c2bb,0x00a017d2,0x01eb8b2a},{0x0120b962,0x0005fb42,0x0353b6fd,0x0061f8ce,0x007a1463,0x01560a64,0x00e0a792,0x01907c92,0x013a6622,0x007b47f1}} +}; diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-sse2.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-sse2.h new file mode 100644 index 000000000..ca08651d6 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-sse2.h @@ -0,0 +1,436 @@ +#if defined(ED25519_GCC_64BIT_SSE_CHOOSE) + +#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS + +DONNA_NOINLINE static void +ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { + int64_t breg = (int64_t)b; + uint64_t sign = (uint64_t)breg >> 63; + uint64_t mask = ~(sign - 1); + uint64_t u = (breg + mask) ^ mask; + + __asm__ __volatile__ ( + /* ysubx+xaddy+t2d */ + "movq %0, %%rax ;\n" + "movd %%rax, %%xmm14 ;\n" + "pshufd $0x00, %%xmm14, %%xmm14 ;\n" + "pxor %%xmm0, %%xmm0 ;\n" + "pxor %%xmm1, %%xmm1 ;\n" + "pxor %%xmm2, %%xmm2 ;\n" + "pxor %%xmm3, %%xmm3 ;\n" + "pxor %%xmm4, %%xmm4 ;\n" + "pxor %%xmm5, %%xmm5 ;\n" + + /* 0 */ + "movq $0, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movq $1, %%rax ;\n" + "movd %%rax, %%xmm6 ;\n" + "pxor %%xmm7, %%xmm7 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm6, %%xmm2 ;\n" + "por %%xmm7, %%xmm3 ;\n" + + /* 1 */ + "movq $1, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 0(%1), %%xmm6 ;\n" + "movdqa 16(%1), %%xmm7 ;\n" + "movdqa 32(%1), %%xmm8 ;\n" + "movdqa 48(%1), %%xmm9 ;\n" + "movdqa 64(%1), %%xmm10 ;\n" + "movdqa 80(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 2 */ + "movq $2, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 96(%1), %%xmm6 ;\n" + "movdqa 112(%1), %%xmm7 ;\n" + "movdqa 128(%1), %%xmm8 ;\n" + "movdqa 144(%1), %%xmm9 ;\n" + "movdqa 160(%1), %%xmm10 ;\n" + "movdqa 176(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 3 */ + "movq $3, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 192(%1), %%xmm6 ;\n" + "movdqa 208(%1), %%xmm7 ;\n" + "movdqa 224(%1), %%xmm8 ;\n" + "movdqa 240(%1), %%xmm9 ;\n" + "movdqa 256(%1), %%xmm10 ;\n" + "movdqa 272(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 4 */ + "movq $4, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 288(%1), %%xmm6 ;\n" + "movdqa 304(%1), %%xmm7 ;\n" + "movdqa 320(%1), %%xmm8 ;\n" + "movdqa 336(%1), %%xmm9 ;\n" + "movdqa 352(%1), %%xmm10 ;\n" + "movdqa 368(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 5 */ + "movq $5, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 384(%1), %%xmm6 ;\n" + "movdqa 400(%1), %%xmm7 ;\n" + "movdqa 416(%1), %%xmm8 ;\n" + "movdqa 432(%1), %%xmm9 ;\n" + "movdqa 448(%1), %%xmm10 ;\n" + "movdqa 464(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 6 */ + "movq $6, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 480(%1), %%xmm6 ;\n" + "movdqa 496(%1), %%xmm7 ;\n" + "movdqa 512(%1), %%xmm8 ;\n" + "movdqa 528(%1), %%xmm9 ;\n" + "movdqa 544(%1), %%xmm10 ;\n" + "movdqa 560(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 7 */ + "movq $7, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 576(%1), %%xmm6 ;\n" + "movdqa 592(%1), %%xmm7 ;\n" + "movdqa 608(%1), %%xmm8 ;\n" + "movdqa 624(%1), %%xmm9 ;\n" + "movdqa 640(%1), %%xmm10 ;\n" + "movdqa 656(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 8 */ + "movq $8, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 672(%1), %%xmm6 ;\n" + "movdqa 688(%1), %%xmm7 ;\n" + "movdqa 704(%1), %%xmm8 ;\n" + "movdqa 720(%1), %%xmm9 ;\n" + "movdqa 736(%1), %%xmm10 ;\n" + "movdqa 752(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* conditionally swap ysubx and xaddy */ + "movq %3, %%rax ;\n" + "xorq $1, %%rax ;\n" + "movd %%rax, %%xmm14 ;\n" + "pxor %%xmm15, %%xmm15 ;\n" + "pshufd $0x00, %%xmm14, %%xmm14 ;\n" + "pxor %%xmm0, %%xmm2 ;\n" + "pxor %%xmm1, %%xmm3 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa %%xmm2, %%xmm6 ;\n" + "movdqa %%xmm3, %%xmm7 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pxor %%xmm6, %%xmm0 ;\n" + "pxor %%xmm7, %%xmm1 ;\n" + "pxor %%xmm0, %%xmm2 ;\n" + "pxor %%xmm1, %%xmm3 ;\n" + + /* store ysubx */ + "xorq %%rax, %%rax ;\n" + "movd %%xmm0, %%rcx ;\n" + "movd %%xmm0, %%r8 ;\n" + "movd %%xmm1, %%rsi ;\n" + "pshufd $0xee, %%xmm0, %%xmm0 ;\n" + "pshufd $0xee, %%xmm1, %%xmm1 ;\n" + "movd %%xmm0, %%rdx ;\n" + "movd %%xmm1, %%rdi ;\n" + "shrdq $51, %%rdx, %%r8 ;\n" + "shrdq $38, %%rsi, %%rdx ;\n" + "shrdq $25, %%rdi, %%rsi ;\n" + "shrq $12, %%rdi ;\n" + "movq %%rcx, %%r9 ;\n" + "movq %%r8, %%r10 ;\n" + "movq %%rdx, %%r11 ;\n" + "movq %%rsi, %%r12 ;\n" + "movq %%rdi, %%r13 ;\n" + "shrq $26, %%r9 ;\n" + "shrq $26, %%r10 ;\n" + "shrq $26, %%r11 ;\n" + "shrq $26, %%r12 ;\n" + "shrq $26, %%r13 ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "andl $0x1ffffff, %%r9d ;\n" + "andl $0x3ffffff, %%r8d ;\n" + "andl $0x1ffffff, %%r10d ;\n" + "andl $0x3ffffff, %%edx ;\n" + "andl $0x1ffffff, %%r11d ;\n" + "andl $0x3ffffff, %%esi ;\n" + "andl $0x1ffffff, %%r12d ;\n" + "andl $0x3ffffff, %%edi ;\n" + "andl $0x1ffffff, %%r13d ;\n" + "movl %%ecx, 0(%2) ;\n" + "movl %%r9d, 4(%2) ;\n" + "movl %%r8d, 8(%2) ;\n" + "movl %%r10d, 12(%2) ;\n" + "movl %%edx, 16(%2) ;\n" + "movl %%r11d, 20(%2) ;\n" + "movl %%esi, 24(%2) ;\n" + "movl %%r12d, 28(%2) ;\n" + "movl %%edi, 32(%2) ;\n" + "movl %%r13d, 36(%2) ;\n" + "movq %%rax, 40(%2) ;\n" + + /* store xaddy */ + "movd %%xmm2, %%rcx ;\n" + "movd %%xmm2, %%r8 ;\n" + "movd %%xmm3, %%rsi ;\n" + "pshufd $0xee, %%xmm2, %%xmm2 ;\n" + "pshufd $0xee, %%xmm3, %%xmm3 ;\n" + "movd %%xmm2, %%rdx ;\n" + "movd %%xmm3, %%rdi ;\n" + "shrdq $51, %%rdx, %%r8 ;\n" + "shrdq $38, %%rsi, %%rdx ;\n" + "shrdq $25, %%rdi, %%rsi ;\n" + "shrq $12, %%rdi ;\n" + "movq %%rcx, %%r9 ;\n" + "movq %%r8, %%r10 ;\n" + "movq %%rdx, %%r11 ;\n" + "movq %%rsi, %%r12 ;\n" + "movq %%rdi, %%r13 ;\n" + "shrq $26, %%r9 ;\n" + "shrq $26, %%r10 ;\n" + "shrq $26, %%r11 ;\n" + "shrq $26, %%r12 ;\n" + "shrq $26, %%r13 ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "andl $0x1ffffff, %%r9d ;\n" + "andl $0x3ffffff, %%r8d ;\n" + "andl $0x1ffffff, %%r10d ;\n" + "andl $0x3ffffff, %%edx ;\n" + "andl $0x1ffffff, %%r11d ;\n" + "andl $0x3ffffff, %%esi ;\n" + "andl $0x1ffffff, %%r12d ;\n" + "andl $0x3ffffff, %%edi ;\n" + "andl $0x1ffffff, %%r13d ;\n" + "movl %%ecx, 48(%2) ;\n" + "movl %%r9d, 52(%2) ;\n" + "movl %%r8d, 56(%2) ;\n" + "movl %%r10d, 60(%2) ;\n" + "movl %%edx, 64(%2) ;\n" + "movl %%r11d, 68(%2) ;\n" + "movl %%esi, 72(%2) ;\n" + "movl %%r12d, 76(%2) ;\n" + "movl %%edi, 80(%2) ;\n" + "movl %%r13d, 84(%2) ;\n" + "movq %%rax, 88(%2) ;\n" + + /* extract t2d */ + "xorq %%rax, %%rax ;\n" + "movd %%xmm4, %%rcx ;\n" + "movd %%xmm4, %%r8 ;\n" + "movd %%xmm5, %%rsi ;\n" + "pshufd $0xee, %%xmm4, %%xmm4 ;\n" + "pshufd $0xee, %%xmm5, %%xmm5 ;\n" + "movd %%xmm4, %%rdx ;\n" + "movd %%xmm5, %%rdi ;\n" + "shrdq $51, %%rdx, %%r8 ;\n" + "shrdq $38, %%rsi, %%rdx ;\n" + "shrdq $25, %%rdi, %%rsi ;\n" + "shrq $12, %%rdi ;\n" + "movq %%rcx, %%r9 ;\n" + "movq %%r8, %%r10 ;\n" + "movq %%rdx, %%r11 ;\n" + "movq %%rsi, %%r12 ;\n" + "movq %%rdi, %%r13 ;\n" + "shrq $26, %%r9 ;\n" + "shrq $26, %%r10 ;\n" + "shrq $26, %%r11 ;\n" + "shrq $26, %%r12 ;\n" + "shrq $26, %%r13 ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "andl $0x1ffffff, %%r9d ;\n" + "andl $0x3ffffff, %%r8d ;\n" + "andl $0x1ffffff, %%r10d ;\n" + "andl $0x3ffffff, %%edx ;\n" + "andl $0x1ffffff, %%r11d ;\n" + "andl $0x3ffffff, %%esi ;\n" + "andl $0x1ffffff, %%r12d ;\n" + "andl $0x3ffffff, %%edi ;\n" + "andl $0x1ffffff, %%r13d ;\n" + "movd %%ecx, %%xmm0 ;\n" + "movd %%r9d, %%xmm4 ;\n" + "movd %%r8d, %%xmm8 ;\n" + "movd %%r10d, %%xmm3 ;\n" + "movd %%edx, %%xmm1 ;\n" + "movd %%r11d, %%xmm5 ;\n" + "movd %%esi, %%xmm6 ;\n" + "movd %%r12d, %%xmm7 ;\n" + "movd %%edi, %%xmm2 ;\n" + "movd %%r13d, %%xmm9 ;\n" + "punpckldq %%xmm4, %%xmm0 ;\n" + "punpckldq %%xmm3, %%xmm8 ;\n" + "punpckldq %%xmm5, %%xmm1 ;\n" + "punpckldq %%xmm7, %%xmm6 ;\n" + "punpckldq %%xmm9, %%xmm2 ;\n" + "punpcklqdq %%xmm8, %%xmm0 ;\n" + "punpcklqdq %%xmm6, %%xmm1 ;\n" + + /* set up 2p in to 3/4 */ + "movl $0x7ffffda, %%ecx ;\n" + "movl $0x3fffffe, %%edx ;\n" + "movl $0x7fffffe, %%eax ;\n" + "movd %%ecx, %%xmm3 ;\n" + "movd %%edx, %%xmm5 ;\n" + "movd %%eax, %%xmm4 ;\n" + "punpckldq %%xmm5, %%xmm3 ;\n" + "punpckldq %%xmm5, %%xmm4 ;\n" + "punpcklqdq %%xmm4, %%xmm3 ;\n" + "movdqa %%xmm4, %%xmm5 ;\n" + "punpcklqdq %%xmm4, %%xmm4 ;\n" + + /* subtract and conditionally move */ + "movl %3, %%ecx ;\n" + "sub $1, %%ecx ;\n" + "movd %%ecx, %%xmm6 ;\n" + "pshufd $0x00, %%xmm6, %%xmm6 ;\n" + "movdqa %%xmm6, %%xmm7 ;\n" + "psubd %%xmm0, %%xmm3 ;\n" + "psubd %%xmm1, %%xmm4 ;\n" + "psubd %%xmm2, %%xmm5 ;\n" + "pand %%xmm6, %%xmm0 ;\n" + "pand %%xmm6, %%xmm1 ;\n" + "pand %%xmm6, %%xmm2 ;\n" + "pandn %%xmm3, %%xmm6 ;\n" + "movdqa %%xmm7, %%xmm3 ;\n" + "pandn %%xmm4, %%xmm7 ;\n" + "pandn %%xmm5, %%xmm3 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm3, %%xmm2 ;\n" + + /* store t2d */ + "movdqa %%xmm0, 96(%2) ;\n" + "movdqa %%xmm1, 112(%2) ;\n" + "movdqa %%xmm2, 128(%2) ;\n" + : + : "m"(u), "r"(&table[pos * 8]), "r"(t), "m"(sign) /* %0 = u, %1 = table, %2 = t, %3 = sign */ + : + "%rax", "%rcx", "%rdx", "%rdi", "%rsi", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", + "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm14", "%xmm14", + "cc", "memory" + ); +} + +#endif /* defined(ED25519_GCC_64BIT_SSE_CHOOSE) */ + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-tables.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-tables.h new file mode 100644 index 000000000..4a6ff9eda --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-tables.h @@ -0,0 +1,53 @@ +static const ge25519 ge25519_basepoint = { + {0x00062d608f25d51a,0x000412a4b4f6592a,0x00075b7171a4b31d,0x0001ff60527118fe,0x000216936d3cd6e5}, + {0x0006666666666658,0x0004cccccccccccc,0x0001999999999999,0x0003333333333333,0x0006666666666666}, + {0x0000000000000001,0x0000000000000000,0x0000000000000000,0x0000000000000000,0x0000000000000000}, + {0x00068ab3a5b7dda3,0x00000eea2a5eadbb,0x0002af8df483c27e,0x000332b375274732,0x00067875f0fd78b7} +}; + +static const bignum25519 ge25519_ecd = { + 0x00034dca135978a3,0x0001a8283b156ebd,0x0005e7a26001c029,0x000739c663a03cbb,0x00052036cee2b6ff +}; + +static const bignum25519 ge25519_ec2d = { + 0x00069b9426b2f159,0x00035050762add7a,0x0003cf44c0038052,0x0006738cc7407977,0x0002406d9dc56dff +}; + +static const bignum25519 ge25519_sqrtneg1 = { + 0x00061b274a0ea0b0,0x0000d5a5fc8f189d,0x0007ef5e9cbd0c60,0x00078595a6804c9e,0x0002b8324804fc1d +}; + +static const ge25519_niels ge25519_niels_sliding_multiples[32] = { + {{0x00003905d740913e,0x0000ba2817d673a2,0x00023e2827f4e67c,0x000133d2e0c21a34,0x00044fd2f9298f81},{0x000493c6f58c3b85,0x0000df7181c325f7,0x0000f50b0b3e4cb7,0x0005329385a44c32,0x00007cf9d3a33d4b},{0x00011205877aaa68,0x000479955893d579,0x00050d66309b67a0,0x0002d42d0dbee5ee,0x0006f117b689f0c6}}, + {{0x00011fe8a4fcd265,0x0007bcb8374faacc,0x00052f5af4ef4d4f,0x0005314098f98d10,0x0002ab91587555bd},{0x0005b0a84cee9730,0x00061d10c97155e4,0x0004059cc8096a10,0x00047a608da8014f,0x0007a164e1b9a80f},{0x0006933f0dd0d889,0x00044386bb4c4295,0x0003cb6d3162508c,0x00026368b872a2c6,0x0005a2826af12b9b}}, + {{0x000182c3a447d6ba,0x00022964e536eff2,0x000192821f540053,0x0002f9f19e788e5c,0x000154a7e73eb1b5},{0x0002bc4408a5bb33,0x000078ebdda05442,0x0002ffb112354123,0x000375ee8df5862d,0x0002945ccf146e20},{0x0003dbf1812a8285,0x0000fa17ba3f9797,0x0006f69cb49c3820,0x00034d5a0db3858d,0x00043aabe696b3bb}}, + {{0x00072c9aaa3221b1,0x000267774474f74d,0x000064b0e9b28085,0x0003f04ef53b27c9,0x0001d6edd5d2e531},{0x00025cd0944ea3bf,0x00075673b81a4d63,0x000150b925d1c0d4,0x00013f38d9294114,0x000461bea69283c9},{0x00036dc801b8b3a2,0x0000e0a7d4935e30,0x0001deb7cecc0d7d,0x000053a94e20dd2c,0x0007a9fbb1c6a0f9}}, + {{0x0006217e039d8064,0x0006dea408337e6d,0x00057ac112628206,0x000647cb65e30473,0x00049c05a51fadc9},{0x0006678aa6a8632f,0x0005ea3788d8b365,0x00021bd6d6994279,0x0007ace75919e4e3,0x00034b9ed338add7},{0x0004e8bf9045af1b,0x000514e33a45e0d6,0x0007533c5b8bfe0f,0x000583557b7e14c9,0x00073c172021b008}}, + {{0x00075b0249864348,0x00052ee11070262b,0x000237ae54fb5acd,0x0003bfd1d03aaab5,0x00018ab598029d5c},{0x000700848a802ade,0x0001e04605c4e5f7,0x0005c0d01b9767fb,0x0007d7889f42388b,0x0004275aae2546d8},{0x00032cc5fd6089e9,0x000426505c949b05,0x00046a18880c7ad2,0x0004a4221888ccda,0x0003dc65522b53df}}, + {{0x0007013b327fbf93,0x0001336eeded6a0d,0x0002b565a2bbf3af,0x000253ce89591955,0x0000267882d17602},{0x0000c222a2007f6d,0x000356b79bdb77ee,0x00041ee81efe12ce,0x000120a9bd07097d,0x000234fd7eec346f},{0x0000a119732ea378,0x00063bf1ba8e2a6c,0x00069f94cc90df9a,0x000431d1779bfc48,0x000497ba6fdaa097}}, + {{0x0003cd86468ccf0b,0x00048553221ac081,0x0006c9464b4e0a6e,0x00075fba84180403,0x00043b5cd4218d05},{0x0006cc0313cfeaa0,0x0001a313848da499,0x0007cb534219230a,0x00039596dedefd60,0x00061e22917f12de},{0x0002762f9bd0b516,0x0001c6e7fbddcbb3,0x00075909c3ace2bd,0x00042101972d3ec9,0x000511d61210ae4d}}, + {{0x000386484420de87,0x0002d6b25db68102,0x000650b4962873c0,0x0004081cfd271394,0x00071a7fe6fe2482},{0x000676ef950e9d81,0x0001b81ae089f258,0x00063c4922951883,0x0002f1d54d9b3237,0x0006d325924ddb85},{0x000182b8a5c8c854,0x00073fcbe5406d8e,0x0005de3430cff451,0x000554b967ac8c41,0x0004746c4b6559ee}}, + {{0x000546c864741147,0x0003a1df99092690,0x0001ca8cc9f4d6bb,0x00036b7fc9cd3b03,0x000219663497db5e},{0x00077b3c6dc69a2b,0x0004edf13ec2fa6e,0x0004e85ad77beac8,0x0007dba2b28e7bda,0x0005c9a51de34fe9},{0x0000f1cf79f10e67,0x00043ccb0a2b7ea2,0x00005089dfff776a,0x0001dd84e1d38b88,0x0004804503c60822}}, + {{0x000021d23a36d175,0x0004fd3373c6476d,0x00020e291eeed02a,0x00062f2ecf2e7210,0x000771e098858de4},{0x00049ed02ca37fc7,0x000474c2b5957884,0x0005b8388e816683,0x0004b6c454b76be4,0x000553398a516506},{0x0002f5d278451edf,0x000730b133997342,0x0006965420eb6975,0x000308a3bfa516cf,0x0005a5ed1d68ff5a}}, + {{0x0005e0c558527359,0x0003395b73afd75c,0x000072afa4e4b970,0x00062214329e0f6d,0x000019b60135fefd},{0x0005122afe150e83,0x0004afc966bb0232,0x0001c478833c8268,0x00017839c3fc148f,0x00044acb897d8bf9},{0x000068145e134b83,0x0001e4860982c3cc,0x000068fb5f13d799,0x0007c9283744547e,0x000150c49fde6ad2}}, + {{0x0001863c9cdca868,0x0003770e295a1709,0x0000d85a3720fd13,0x0005e0ff1f71ab06,0x00078a6d7791e05f},{0x0003f29509471138,0x000729eeb4ca31cf,0x00069c22b575bfbc,0x0004910857bce212,0x0006b2b5a075bb99},{0x0007704b47a0b976,0x0002ae82e91aab17,0x00050bd6429806cd,0x00068055158fd8ea,0x000725c7ffc4ad55}}, + {{0x00002bf71cd098c0,0x00049dabcc6cd230,0x00040a6533f905b2,0x000573efac2eb8a4,0x0004cd54625f855f},{0x00026715d1cf99b2,0x0002205441a69c88,0x000448427dcd4b54,0x0001d191e88abdc5,0x000794cc9277cb1f},{0x0006c426c2ac5053,0x0005a65ece4b095e,0x0000c44086f26bb6,0x0007429568197885,0x0007008357b6fcc8}}, + {{0x00039fbb82584a34,0x00047a568f257a03,0x00014d88091ead91,0x0002145b18b1ce24,0x00013a92a3669d6d},{0x0000672738773f01,0x000752bf799f6171,0x0006b4a6dae33323,0x0007b54696ead1dc,0x00006ef7e9851ad0},{0x0003771cc0577de5,0x0003ca06bb8b9952,0x00000b81c5d50390,0x00043512340780ec,0x0003c296ddf8a2af}}, + {{0x00034d2ebb1f2541,0x0000e815b723ff9d,0x000286b416e25443,0x0000bdfe38d1bee8,0x0000a892c7007477},{0x000515f9d914a713,0x00073191ff2255d5,0x00054f5cc2a4bdef,0x0003dd57fc118bcf,0x0007a99d393490c7},{0x0002ed2436bda3e8,0x00002afd00f291ea,0x0000be7381dea321,0x0003e952d4b2b193,0x000286762d28302f}}, + {{0x00058e2bce2ef5bd,0x00068ce8f78c6f8a,0x0006ee26e39261b2,0x00033d0aa50bcf9d,0x0007686f2a3d6f17},{0x000036093ce35b25,0x0003b64d7552e9cf,0x00071ee0fe0b8460,0x00069d0660c969e5,0x00032f1da046a9d9},{0x000512a66d597c6a,0x0000609a70a57551,0x000026c08a3c464c,0x0004531fc8ee39e1,0x000561305f8a9ad2}}, + {{0x0002cc28e7b0c0d5,0x00077b60eb8a6ce4,0x0004042985c277a6,0x000636657b46d3eb,0x000030a1aef2c57c},{0x0004978dec92aed1,0x000069adae7ca201,0x00011ee923290f55,0x00069641898d916c,0x00000aaec53e35d4},{0x0001f773003ad2aa,0x000005642cc10f76,0x00003b48f82cfca6,0x0002403c10ee4329,0x00020be9c1c24065}}, + {{0x0000e44ae2025e60,0x0005f97b9727041c,0x0005683472c0ecec,0x000188882eb1ce7c,0x00069764c545067e},{0x000387d8249673a6,0x0005bea8dc927c2a,0x0005bd8ed5650ef0,0x0000ef0e3fcd40e1,0x000750ab3361f0ac},{0x00023283a2f81037,0x000477aff97e23d1,0x0000b8958dbcbb68,0x0000205b97e8add6,0x00054f96b3fb7075}}, + {{0x0005afc616b11ecd,0x00039f4aec8f22ef,0x0003b39e1625d92e,0x0005f85bd4508873,0x00078e6839fbe85d},{0x0005f20429669279,0x00008fafae4941f5,0x00015d83c4eb7688,0x0001cf379eca4146,0x0003d7fe9c52bb75},{0x00032df737b8856b,0x0000608342f14e06,0x0003967889d74175,0x0001211907fba550,0x00070f268f350088}}, + {{0x0004112070dcf355,0x0007dcff9c22e464,0x00054ada60e03325,0x00025cd98eef769a,0x000404e56c039b8c},{0x00064583b1805f47,0x00022c1baf832cd0,0x000132c01bd4d717,0x0004ecf4c3a75b8f,0x0007c0d345cfad88},{0x00071f4b8c78338a,0x00062cfc16bc2b23,0x00017cf51280d9aa,0x0003bbae5e20a95a,0x00020d754762aaec}}, + {{0x0004feb135b9f543,0x00063bd192ad93ae,0x00044e2ea612cdf7,0x000670f4991583ab,0x00038b8ada8790b4},{0x0007c36fc73bb758,0x0004a6c797734bd1,0x0000ef248ab3950e,0x00063154c9a53ec8,0x0002b8f1e46f3cee},{0x00004a9cdf51f95d,0x0005d963fbd596b8,0x00022d9b68ace54a,0x0004a98e8836c599,0x000049aeb32ceba1}}, + {{0x00067d3c63dcfe7e,0x000112f0adc81aee,0x00053df04c827165,0x0002fe5b33b430f0,0x00051c665e0c8d62},{0x00007d0b75fc7931,0x00016f4ce4ba754a,0x0005ace4c03fbe49,0x00027e0ec12a159c,0x000795ee17530f67},{0x00025b0a52ecbd81,0x0005dc0695fce4a9,0x0003b928c575047d,0x00023bf3512686e5,0x0006cd19bf49dc54}}, + {{0x0007619052179ca3,0x0000c16593f0afd0,0x000265c4795c7428,0x00031c40515d5442,0x0007520f3db40b2e},{0x0006612165afc386,0x0001171aa36203ff,0x0002642ea820a8aa,0x0001f3bb7b313f10,0x0005e01b3a7429e4},{0x00050be3d39357a1,0x0003ab33d294a7b6,0x0004c479ba59edb3,0x0004c30d184d326f,0x00071092c9ccef3c}}, + {{0x0000523f0364918c,0x000687f56d638a7b,0x00020796928ad013,0x0005d38405a54f33,0x0000ea15b03d0257},{0x0003d8ac74051dcf,0x00010ab6f543d0ad,0x0005d0f3ac0fda90,0x0005ef1d2573e5e4,0x0004173a5bb7137a},{0x00056e31f0f9218a,0x0005635f88e102f8,0x0002cbc5d969a5b8,0x000533fbc98b347a,0x0005fc565614a4e3}}, + {{0x0006570dc46d7ae5,0x00018a9f1b91e26d,0x000436b6183f42ab,0x000550acaa4f8198,0x00062711c414c454},{0x0002e1e67790988e,0x0001e38b9ae44912,0x000648fbb4075654,0x00028df1d840cd72,0x0003214c7409d466},{0x0001827406651770,0x0004d144f286c265,0x00017488f0ee9281,0x00019e6cdb5c760c,0x0005bea94073ecb8}}, + {{0x0005bf0912c89be4,0x00062fadcaf38c83,0x00025ec196b3ce2c,0x00077655ff4f017b,0x0003aacd5c148f61},{0x0000ce63f343d2f8,0x0001e0a87d1e368e,0x000045edbc019eea,0x0006979aed28d0d1,0x0004ad0785944f1b},{0x00063b34c3318301,0x0000e0e62d04d0b1,0x000676a233726701,0x00029e9a042d9769,0x0003aff0cb1d9028}}, + {{0x0005c7eb3a20405e,0x0005fdb5aad930f8,0x0004a757e63b8c47,0x00028e9492972456,0x000110e7e86f4cd2},{0x0006430bf4c53505,0x000264c3e4507244,0x00074c9f19a39270,0x00073f84f799bc47,0x0002ccf9f732bd99},{0x0000d89ed603f5e4,0x00051e1604018af8,0x0000b8eedc4a2218,0x00051ba98b9384d0,0x00005c557e0b9693}}, + {{0x0001ce311fc97e6f,0x0006023f3fb5db1f,0x0007b49775e8fc98,0x0003ad70adbf5045,0x0006e154c178fe98},{0x0006bbb089c20eb0,0x0006df41fb0b9eee,0x00051087ed87e16f,0x000102db5c9fa731,0x000289fef0841861},{0x00016336fed69abf,0x0004f066b929f9ec,0x0004e9ff9e6c5b93,0x00018c89bc4bb2ba,0x0006afbf642a95ca}}, + {{0x0000de0c62f5d2c1,0x00049601cf734fb5,0x0006b5c38263f0f6,0x0004623ef5b56d06,0x0000db4b851b9503},{0x00055070f913a8cc,0x000765619eac2bbc,0x0003ab5225f47459,0x00076ced14ab5b48,0x00012c093cedb801},{0x00047f9308b8190f,0x000414235c621f82,0x00031f5ff41a5a76,0x0006736773aab96d,0x00033aa8799c6635}}, + {{0x0007f51ebd085cf2,0x00012cfa67e3f5e1,0x0001800cf1e3d46a,0x00054337615ff0a8,0x000233c6f29e8e21},{0x0000f588fc156cb1,0x000363414da4f069,0x0007296ad9b68aea,0x0004d3711316ae43,0x000212cd0c1c8d58},{0x0004d5107f18c781,0x00064a4fd3a51a5e,0x0004f4cd0448bb37,0x000671d38543151e,0x0001db7778911914}}, + {{0x000352397c6bc26f,0x00018a7aa0227bbe,0x0005e68cc1ea5f8b,0x0006fe3e3a7a1d5f,0x00031ad97ad26e2a},{0x00014769dd701ab6,0x00028339f1b4b667,0x0004ab214b8ae37b,0x00025f0aefa0b0fe,0x0007ae2ca8a017d2},{0x000017ed0920b962,0x000187e33b53b6fd,0x00055829907a1463,0x000641f248e0a792,0x0001ed1fc53a6622}} +}; diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-x86-32bit.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-x86-32bit.h new file mode 100644 index 000000000..1ce109c5b --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-x86-32bit.h @@ -0,0 +1,435 @@ +#if defined(ED25519_GCC_64BIT_32BIT_CHOOSE) + +#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS + +DONNA_NOINLINE static void +ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { + int64_t breg = (int64_t)b; + uint64_t sign = (uint64_t)breg >> 63; + uint64_t mask = ~(sign - 1); + uint64_t u = (breg + mask) ^ mask; + + __asm__ __volatile__ ( + /* ysubx+xaddy+t2d */ + "movq %0, %%rax ;\n" + "movd %%rax, %%xmm14 ;\n" + "pshufd $0x00, %%xmm14, %%xmm14 ;\n" + "pxor %%xmm0, %%xmm0 ;\n" + "pxor %%xmm1, %%xmm1 ;\n" + "pxor %%xmm2, %%xmm2 ;\n" + "pxor %%xmm3, %%xmm3 ;\n" + "pxor %%xmm4, %%xmm4 ;\n" + "pxor %%xmm5, %%xmm5 ;\n" + + /* 0 */ + "movq $0, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movq $1, %%rax ;\n" + "movd %%rax, %%xmm6 ;\n" + "pxor %%xmm7, %%xmm7 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm6, %%xmm2 ;\n" + "por %%xmm7, %%xmm3 ;\n" + + /* 1 */ + "movq $1, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 0(%1), %%xmm6 ;\n" + "movdqa 16(%1), %%xmm7 ;\n" + "movdqa 32(%1), %%xmm8 ;\n" + "movdqa 48(%1), %%xmm9 ;\n" + "movdqa 64(%1), %%xmm10 ;\n" + "movdqa 80(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 2 */ + "movq $2, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 96(%1), %%xmm6 ;\n" + "movdqa 112(%1), %%xmm7 ;\n" + "movdqa 128(%1), %%xmm8 ;\n" + "movdqa 144(%1), %%xmm9 ;\n" + "movdqa 160(%1), %%xmm10 ;\n" + "movdqa 176(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 3 */ + "movq $3, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 192(%1), %%xmm6 ;\n" + "movdqa 208(%1), %%xmm7 ;\n" + "movdqa 224(%1), %%xmm8 ;\n" + "movdqa 240(%1), %%xmm9 ;\n" + "movdqa 256(%1), %%xmm10 ;\n" + "movdqa 272(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 4 */ + "movq $4, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 288(%1), %%xmm6 ;\n" + "movdqa 304(%1), %%xmm7 ;\n" + "movdqa 320(%1), %%xmm8 ;\n" + "movdqa 336(%1), %%xmm9 ;\n" + "movdqa 352(%1), %%xmm10 ;\n" + "movdqa 368(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 5 */ + "movq $5, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 384(%1), %%xmm6 ;\n" + "movdqa 400(%1), %%xmm7 ;\n" + "movdqa 416(%1), %%xmm8 ;\n" + "movdqa 432(%1), %%xmm9 ;\n" + "movdqa 448(%1), %%xmm10 ;\n" + "movdqa 464(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 6 */ + "movq $6, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 480(%1), %%xmm6 ;\n" + "movdqa 496(%1), %%xmm7 ;\n" + "movdqa 512(%1), %%xmm8 ;\n" + "movdqa 528(%1), %%xmm9 ;\n" + "movdqa 544(%1), %%xmm10 ;\n" + "movdqa 560(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 7 */ + "movq $7, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 576(%1), %%xmm6 ;\n" + "movdqa 592(%1), %%xmm7 ;\n" + "movdqa 608(%1), %%xmm8 ;\n" + "movdqa 624(%1), %%xmm9 ;\n" + "movdqa 640(%1), %%xmm10 ;\n" + "movdqa 656(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 8 */ + "movq $8, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 672(%1), %%xmm6 ;\n" + "movdqa 688(%1), %%xmm7 ;\n" + "movdqa 704(%1), %%xmm8 ;\n" + "movdqa 720(%1), %%xmm9 ;\n" + "movdqa 736(%1), %%xmm10 ;\n" + "movdqa 752(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* conditionally swap ysubx and xaddy */ + "movq %3, %%rax ;\n" + "xorq $1, %%rax ;\n" + "movd %%rax, %%xmm14 ;\n" + "pxor %%xmm15, %%xmm15 ;\n" + "pshufd $0x00, %%xmm14, %%xmm14 ;\n" + "pxor %%xmm0, %%xmm2 ;\n" + "pxor %%xmm1, %%xmm3 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa %%xmm2, %%xmm6 ;\n" + "movdqa %%xmm3, %%xmm7 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pxor %%xmm6, %%xmm0 ;\n" + "pxor %%xmm7, %%xmm1 ;\n" + "pxor %%xmm0, %%xmm2 ;\n" + "pxor %%xmm1, %%xmm3 ;\n" + + /* store ysubx */ + "xorq %%rax, %%rax ;\n" + "movd %%xmm0, %%rcx ;\n" + "movd %%xmm0, %%r8 ;\n" + "movd %%xmm1, %%rsi ;\n" + "pshufd $0xee, %%xmm0, %%xmm0 ;\n" + "pshufd $0xee, %%xmm1, %%xmm1 ;\n" + "movd %%xmm0, %%rdx ;\n" + "movd %%xmm1, %%rdi ;\n" + "shrdq $51, %%rdx, %%r8 ;\n" + "shrdq $38, %%rsi, %%rdx ;\n" + "shrdq $25, %%rdi, %%rsi ;\n" + "shrq $12, %%rdi ;\n" + "movq %%rcx, %%r9 ;\n" + "movq %%r8, %%r10 ;\n" + "movq %%rdx, %%r11 ;\n" + "movq %%rsi, %%r12 ;\n" + "movq %%rdi, %%r13 ;\n" + "shrq $26, %%r9 ;\n" + "shrq $26, %%r10 ;\n" + "shrq $26, %%r11 ;\n" + "shrq $26, %%r12 ;\n" + "shrq $26, %%r13 ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "andl $0x1ffffff, %%r9d ;\n" + "andl $0x3ffffff, %%r8d ;\n" + "andl $0x1ffffff, %%r10d ;\n" + "andl $0x3ffffff, %%edx ;\n" + "andl $0x1ffffff, %%r11d ;\n" + "andl $0x3ffffff, %%esi ;\n" + "andl $0x1ffffff, %%r12d ;\n" + "andl $0x3ffffff, %%edi ;\n" + "andl $0x1ffffff, %%r13d ;\n" + "movl %%ecx, 0(%2) ;\n" + "movl %%r9d, 4(%2) ;\n" + "movl %%r8d, 8(%2) ;\n" + "movl %%r10d, 12(%2) ;\n" + "movl %%edx, 16(%2) ;\n" + "movl %%r11d, 20(%2) ;\n" + "movl %%esi, 24(%2) ;\n" + "movl %%r12d, 28(%2) ;\n" + "movl %%edi, 32(%2) ;\n" + "movl %%r13d, 36(%2) ;\n" + + /* store xaddy */ + "movd %%xmm2, %%rcx ;\n" + "movd %%xmm2, %%r8 ;\n" + "movd %%xmm3, %%rsi ;\n" + "pshufd $0xee, %%xmm2, %%xmm2 ;\n" + "pshufd $0xee, %%xmm3, %%xmm3 ;\n" + "movd %%xmm2, %%rdx ;\n" + "movd %%xmm3, %%rdi ;\n" + "shrdq $51, %%rdx, %%r8 ;\n" + "shrdq $38, %%rsi, %%rdx ;\n" + "shrdq $25, %%rdi, %%rsi ;\n" + "shrq $12, %%rdi ;\n" + "movq %%rcx, %%r9 ;\n" + "movq %%r8, %%r10 ;\n" + "movq %%rdx, %%r11 ;\n" + "movq %%rsi, %%r12 ;\n" + "movq %%rdi, %%r13 ;\n" + "shrq $26, %%r9 ;\n" + "shrq $26, %%r10 ;\n" + "shrq $26, %%r11 ;\n" + "shrq $26, %%r12 ;\n" + "shrq $26, %%r13 ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "andl $0x1ffffff, %%r9d ;\n" + "andl $0x3ffffff, %%r8d ;\n" + "andl $0x1ffffff, %%r10d ;\n" + "andl $0x3ffffff, %%edx ;\n" + "andl $0x1ffffff, %%r11d ;\n" + "andl $0x3ffffff, %%esi ;\n" + "andl $0x1ffffff, %%r12d ;\n" + "andl $0x3ffffff, %%edi ;\n" + "andl $0x1ffffff, %%r13d ;\n" + "movl %%ecx, 40(%2) ;\n" + "movl %%r9d, 44(%2) ;\n" + "movl %%r8d, 48(%2) ;\n" + "movl %%r10d, 52(%2) ;\n" + "movl %%edx, 56(%2) ;\n" + "movl %%r11d, 60(%2) ;\n" + "movl %%esi, 64(%2) ;\n" + "movl %%r12d, 68(%2) ;\n" + "movl %%edi, 72(%2) ;\n" + "movl %%r13d, 76(%2) ;\n" + + /* extract t2d */ + "xorq %%rax, %%rax ;\n" + "movd %%xmm4, %%rcx ;\n" + "movd %%xmm4, %%r8 ;\n" + "movd %%xmm5, %%rsi ;\n" + "pshufd $0xee, %%xmm4, %%xmm4 ;\n" + "pshufd $0xee, %%xmm5, %%xmm5 ;\n" + "movd %%xmm4, %%rdx ;\n" + "movd %%xmm5, %%rdi ;\n" + "shrdq $51, %%rdx, %%r8 ;\n" + "shrdq $38, %%rsi, %%rdx ;\n" + "shrdq $25, %%rdi, %%rsi ;\n" + "shrq $12, %%rdi ;\n" + "movq %%rcx, %%r9 ;\n" + "movq %%r8, %%r10 ;\n" + "movq %%rdx, %%r11 ;\n" + "movq %%rsi, %%r12 ;\n" + "movq %%rdi, %%r13 ;\n" + "shrq $26, %%r9 ;\n" + "shrq $26, %%r10 ;\n" + "shrq $26, %%r11 ;\n" + "shrq $26, %%r12 ;\n" + "shrq $26, %%r13 ;\n" + "andl $0x3ffffff, %%ecx ;\n" + "andl $0x1ffffff, %%r9d ;\n" + "andl $0x3ffffff, %%r8d ;\n" + "andl $0x1ffffff, %%r10d ;\n" + "andl $0x3ffffff, %%edx ;\n" + "andl $0x1ffffff, %%r11d ;\n" + "andl $0x3ffffff, %%esi ;\n" + "andl $0x1ffffff, %%r12d ;\n" + "andl $0x3ffffff, %%edi ;\n" + "andl $0x1ffffff, %%r13d ;\n" + "movd %%ecx, %%xmm0 ;\n" + "movd %%r9d, %%xmm4 ;\n" + "movd %%r8d, %%xmm8 ;\n" + "movd %%r10d, %%xmm3 ;\n" + "movd %%edx, %%xmm1 ;\n" + "movd %%r11d, %%xmm5 ;\n" + "movd %%esi, %%xmm6 ;\n" + "movd %%r12d, %%xmm7 ;\n" + "movd %%edi, %%xmm2 ;\n" + "movd %%r13d, %%xmm9 ;\n" + "punpckldq %%xmm4, %%xmm0 ;\n" + "punpckldq %%xmm3, %%xmm8 ;\n" + "punpckldq %%xmm5, %%xmm1 ;\n" + "punpckldq %%xmm7, %%xmm6 ;\n" + "punpckldq %%xmm9, %%xmm2 ;\n" + "punpcklqdq %%xmm8, %%xmm0 ;\n" + "punpcklqdq %%xmm6, %%xmm1 ;\n" + + /* set up 2p in to 3/4 */ + "movl $0x7ffffda, %%ecx ;\n" + "movl $0x3fffffe, %%edx ;\n" + "movl $0x7fffffe, %%eax ;\n" + "movd %%ecx, %%xmm3 ;\n" + "movd %%edx, %%xmm5 ;\n" + "movd %%eax, %%xmm4 ;\n" + "punpckldq %%xmm5, %%xmm3 ;\n" + "punpckldq %%xmm5, %%xmm4 ;\n" + "punpcklqdq %%xmm4, %%xmm3 ;\n" + "movdqa %%xmm4, %%xmm5 ;\n" + "punpcklqdq %%xmm4, %%xmm4 ;\n" + + /* subtract and conditionally move */ + "movl %3, %%ecx ;\n" + "sub $1, %%ecx ;\n" + "movd %%ecx, %%xmm6 ;\n" + "pshufd $0x00, %%xmm6, %%xmm6 ;\n" + "movdqa %%xmm6, %%xmm7 ;\n" + "psubd %%xmm0, %%xmm3 ;\n" + "psubd %%xmm1, %%xmm4 ;\n" + "psubd %%xmm2, %%xmm5 ;\n" + "pand %%xmm6, %%xmm0 ;\n" + "pand %%xmm6, %%xmm1 ;\n" + "pand %%xmm6, %%xmm2 ;\n" + "pandn %%xmm3, %%xmm6 ;\n" + "movdqa %%xmm7, %%xmm3 ;\n" + "pandn %%xmm4, %%xmm7 ;\n" + "pandn %%xmm5, %%xmm3 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm3, %%xmm2 ;\n" + + /* store t2d */ + "movdqa %%xmm0, 80(%2) ;\n" + "movdqa %%xmm1, 96(%2) ;\n" + "movd %%xmm2, %%rax ;\n" + "movq %%rax, 112(%2) ;\n" + : + : "m"(u), "r"(&table[pos * 8]), "r"(t), "m"(sign) /* %0 = u, %1 = table, %2 = t, %3 = sign */ + : + "%rax", "%rcx", "%rdx", "%rdi", "%rsi", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", + "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm14", "%xmm14", + "cc", "memory" + ); +} + +#endif /* defined(ED25519_GCC_64BIT_32BIT_CHOOSE) */ + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-x86.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-x86.h new file mode 100644 index 000000000..f6b557029 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-64bit-x86.h @@ -0,0 +1,360 @@ +#if defined(ED25519_GCC_64BIT_X86_CHOOSE) + +#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Woverlength-strings" +#endif + +DONNA_NOINLINE static void +ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { + int64_t breg = (int64_t)b; + uint64_t sign = (uint64_t)breg >> 63; + uint64_t mask = ~(sign - 1); + uint64_t u = (breg + mask) ^ mask; + + __asm__ __volatile__ ( + /* ysubx+xaddy+t2d */ + "movq %0, %%rax ;\n" + "movd %%rax, %%xmm14 ;\n" + "pshufd $0x00, %%xmm14, %%xmm14 ;\n" + "pxor %%xmm0, %%xmm0 ;\n" + "pxor %%xmm1, %%xmm1 ;\n" + "pxor %%xmm2, %%xmm2 ;\n" + "pxor %%xmm3, %%xmm3 ;\n" + "pxor %%xmm4, %%xmm4 ;\n" + "pxor %%xmm5, %%xmm5 ;\n" + + /* 0 */ + "movq $0, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movq $1, %%rax ;\n" + "movd %%rax, %%xmm6 ;\n" + "pxor %%xmm7, %%xmm7 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm6, %%xmm2 ;\n" + "por %%xmm7, %%xmm3 ;\n" + + /* 1 */ + "movq $1, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 0(%1), %%xmm6 ;\n" + "movdqa 16(%1), %%xmm7 ;\n" + "movdqa 32(%1), %%xmm8 ;\n" + "movdqa 48(%1), %%xmm9 ;\n" + "movdqa 64(%1), %%xmm10 ;\n" + "movdqa 80(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 2 */ + "movq $2, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 96(%1), %%xmm6 ;\n" + "movdqa 112(%1), %%xmm7 ;\n" + "movdqa 128(%1), %%xmm8 ;\n" + "movdqa 144(%1), %%xmm9 ;\n" + "movdqa 160(%1), %%xmm10 ;\n" + "movdqa 176(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 3 */ + "movq $3, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 192(%1), %%xmm6 ;\n" + "movdqa 208(%1), %%xmm7 ;\n" + "movdqa 224(%1), %%xmm8 ;\n" + "movdqa 240(%1), %%xmm9 ;\n" + "movdqa 256(%1), %%xmm10 ;\n" + "movdqa 272(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 4 */ + "movq $4, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 288(%1), %%xmm6 ;\n" + "movdqa 304(%1), %%xmm7 ;\n" + "movdqa 320(%1), %%xmm8 ;\n" + "movdqa 336(%1), %%xmm9 ;\n" + "movdqa 352(%1), %%xmm10 ;\n" + "movdqa 368(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 5 */ + "movq $5, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 384(%1), %%xmm6 ;\n" + "movdqa 400(%1), %%xmm7 ;\n" + "movdqa 416(%1), %%xmm8 ;\n" + "movdqa 432(%1), %%xmm9 ;\n" + "movdqa 448(%1), %%xmm10 ;\n" + "movdqa 464(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 6 */ + "movq $6, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 480(%1), %%xmm6 ;\n" + "movdqa 496(%1), %%xmm7 ;\n" + "movdqa 512(%1), %%xmm8 ;\n" + "movdqa 528(%1), %%xmm9 ;\n" + "movdqa 544(%1), %%xmm10 ;\n" + "movdqa 560(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 7 */ + "movq $7, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 576(%1), %%xmm6 ;\n" + "movdqa 592(%1), %%xmm7 ;\n" + "movdqa 608(%1), %%xmm8 ;\n" + "movdqa 624(%1), %%xmm9 ;\n" + "movdqa 640(%1), %%xmm10 ;\n" + "movdqa 656(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* 8 */ + "movq $8, %%rax ;\n" + "movd %%rax, %%xmm15 ;\n" + "pshufd $0x00, %%xmm15, %%xmm15 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa 672(%1), %%xmm6 ;\n" + "movdqa 688(%1), %%xmm7 ;\n" + "movdqa 704(%1), %%xmm8 ;\n" + "movdqa 720(%1), %%xmm9 ;\n" + "movdqa 736(%1), %%xmm10 ;\n" + "movdqa 752(%1), %%xmm11 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pand %%xmm15, %%xmm8 ;\n" + "pand %%xmm15, %%xmm9 ;\n" + "pand %%xmm15, %%xmm10 ;\n" + "pand %%xmm15, %%xmm11 ;\n" + "por %%xmm6, %%xmm0 ;\n" + "por %%xmm7, %%xmm1 ;\n" + "por %%xmm8, %%xmm2 ;\n" + "por %%xmm9, %%xmm3 ;\n" + "por %%xmm10, %%xmm4 ;\n" + "por %%xmm11, %%xmm5 ;\n" + + /* conditionally swap ysubx and xaddy */ + "movq %3, %%rax ;\n" + "xorq $1, %%rax ;\n" + "movd %%rax, %%xmm14 ;\n" + "pxor %%xmm15, %%xmm15 ;\n" + "pshufd $0x00, %%xmm14, %%xmm14 ;\n" + "pxor %%xmm0, %%xmm2 ;\n" + "pxor %%xmm1, %%xmm3 ;\n" + "pcmpeqd %%xmm14, %%xmm15 ;\n" + "movdqa %%xmm2, %%xmm6 ;\n" + "movdqa %%xmm3, %%xmm7 ;\n" + "pand %%xmm15, %%xmm6 ;\n" + "pand %%xmm15, %%xmm7 ;\n" + "pxor %%xmm6, %%xmm0 ;\n" + "pxor %%xmm7, %%xmm1 ;\n" + "pxor %%xmm0, %%xmm2 ;\n" + "pxor %%xmm1, %%xmm3 ;\n" + + /* store ysubx */ + "movq $0x7ffffffffffff, %%rax ;\n" + "movd %%xmm0, %%rcx ;\n" + "movd %%xmm0, %%r8 ;\n" + "movd %%xmm1, %%rsi ;\n" + "pshufd $0xee, %%xmm0, %%xmm0 ;\n" + "pshufd $0xee, %%xmm1, %%xmm1 ;\n" + "movd %%xmm0, %%rdx ;\n" + "movd %%xmm1, %%rdi ;\n" + "shrdq $51, %%rdx, %%r8 ;\n" + "shrdq $38, %%rsi, %%rdx ;\n" + "shrdq $25, %%rdi, %%rsi ;\n" + "shrq $12, %%rdi ;\n" + "andq %%rax, %%rcx ;\n" + "andq %%rax, %%r8 ;\n" + "andq %%rax, %%rdx ;\n" + "andq %%rax, %%rsi ;\n" + "andq %%rax, %%rdi ;\n" + "movq %%rcx, 0(%2) ;\n" + "movq %%r8, 8(%2) ;\n" + "movq %%rdx, 16(%2) ;\n" + "movq %%rsi, 24(%2) ;\n" + "movq %%rdi, 32(%2) ;\n" + + /* store xaddy */ + "movq $0x7ffffffffffff, %%rax ;\n" + "movd %%xmm2, %%rcx ;\n" + "movd %%xmm2, %%r8 ;\n" + "movd %%xmm3, %%rsi ;\n" + "pshufd $0xee, %%xmm2, %%xmm2 ;\n" + "pshufd $0xee, %%xmm3, %%xmm3 ;\n" + "movd %%xmm2, %%rdx ;\n" + "movd %%xmm3, %%rdi ;\n" + "shrdq $51, %%rdx, %%r8 ;\n" + "shrdq $38, %%rsi, %%rdx ;\n" + "shrdq $25, %%rdi, %%rsi ;\n" + "shrq $12, %%rdi ;\n" + "andq %%rax, %%rcx ;\n" + "andq %%rax, %%r8 ;\n" + "andq %%rax, %%rdx ;\n" + "andq %%rax, %%rsi ;\n" + "andq %%rax, %%rdi ;\n" + "movq %%rcx, 40(%2) ;\n" + "movq %%r8, 48(%2) ;\n" + "movq %%rdx, 56(%2) ;\n" + "movq %%rsi, 64(%2) ;\n" + "movq %%rdi, 72(%2) ;\n" + + /* extract t2d */ + "movq $0x7ffffffffffff, %%rax ;\n" + "movd %%xmm4, %%rcx ;\n" + "movd %%xmm4, %%r8 ;\n" + "movd %%xmm5, %%rsi ;\n" + "pshufd $0xee, %%xmm4, %%xmm4 ;\n" + "pshufd $0xee, %%xmm5, %%xmm5 ;\n" + "movd %%xmm4, %%rdx ;\n" + "movd %%xmm5, %%rdi ;\n" + "shrdq $51, %%rdx, %%r8 ;\n" + "shrdq $38, %%rsi, %%rdx ;\n" + "shrdq $25, %%rdi, %%rsi ;\n" + "shrq $12, %%rdi ;\n" + "andq %%rax, %%rcx ;\n" + "andq %%rax, %%r8 ;\n" + "andq %%rax, %%rdx ;\n" + "andq %%rax, %%rsi ;\n" + "andq %%rax, %%rdi ;\n" + + /* conditionally negate t2d */ + "movq %3, %%rax ;\n" + "movq $0xfffffffffffda, %%r9 ;\n" + "movq $0xffffffffffffe, %%r10 ;\n" + "movq %%r10, %%r11 ;\n" + "movq %%r10, %%r12 ;\n" + "movq %%r10, %%r13 ;\n" + "subq %%rcx, %%r9 ;\n" + "subq %%r8, %%r10 ;\n" + "subq %%rdx, %%r11 ;\n" + "subq %%rsi, %%r12 ;\n" + "subq %%rdi, %%r13 ;\n" + "cmpq $1, %%rax ;\n" + "cmove %%r9, %%rcx ;\n" + "cmove %%r10, %%r8 ;\n" + "cmove %%r11, %%rdx ;\n" + "cmove %%r12, %%rsi ;\n" + "cmove %%r13, %%rdi ;\n" + + /* store t2d */ + "movq %%rcx, 80(%2) ;\n" + "movq %%r8, 88(%2) ;\n" + "movq %%rdx, 96(%2) ;\n" + "movq %%rsi, 104(%2) ;\n" + "movq %%rdi, 112(%2) ;\n" + : + : "m"(u), "r"(&table[pos * 8]), "r"(t), "m"(sign) /* %0 = u, %1 = table, %2 = t, %3 = sign */ + : + "%rax", "%rcx", "%rdx", "%rdi", "%rsi", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", + "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm14", "%xmm14", + "cc", "memory" + ); +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#endif /* defined(ED25519_GCC_64BIT_X86_CHOOSE) */ + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-basepoint-table.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-basepoint-table.h new file mode 100644 index 000000000..41dcd526a --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-basepoint-table.h @@ -0,0 +1,259 @@ +/* multiples of the base point in packed {ysubx, xaddy, t2d} form */ +static const uint8_t ALIGN(16) ge25519_niels_base_multiples[256][96] = { + {0x3e,0x91,0x40,0xd7,0x05,0x39,0x10,0x9d,0xb3,0xbe,0x40,0xd1,0x05,0x9f,0x39,0xfd,0x09,0x8a,0x8f,0x68,0x34,0x84,0xc1,0xa5,0x67,0x12,0xf8,0x98,0x92,0x2f,0xfd,0x44,0x85,0x3b,0x8c,0xf5,0xc6,0x93,0xbc,0x2f,0x19,0x0e,0x8c,0xfb,0xc6,0x2d,0x93,0xcf,0xc2,0x42,0x3d,0x64,0x98,0x48,0x0b,0x27,0x65,0xba,0xd4,0x33,0x3a,0x9d,0xcf,0x07,0x59,0xbb,0x6f,0x4b,0x67,0x15,0xbd,0xdb,0xea,0xa5,0xa2,0xee,0x00,0x3f,0xe1,0x41,0xfa,0xc6,0x57,0xc9,0x1c,0x9d,0xd4,0xcd,0xca,0xec,0x16,0xaf,0x1f,0xbe,0x0e,0x4f}, + {0xa8,0xd5,0xb4,0x42,0x60,0xa5,0x99,0x8a,0xf6,0xac,0x60,0x4e,0x0c,0x81,0x2b,0x8f,0xaa,0x37,0x6e,0xb1,0x6b,0x23,0x9e,0xe0,0x55,0x25,0xc9,0x69,0xa6,0x95,0xb5,0x6b,0xd7,0x71,0x3c,0x93,0xfc,0xe7,0x24,0x92,0xb5,0xf5,0x0f,0x7a,0x96,0x9d,0x46,0x9f,0x02,0x07,0xd6,0xe1,0x65,0x9a,0xa6,0x5a,0x2e,0x2e,0x7d,0xa8,0x3f,0x06,0x0c,0x59,0x02,0x68,0xd3,0xda,0xaa,0x7e,0x34,0x6e,0x05,0x48,0xee,0x83,0x93,0x59,0xf3,0xba,0x26,0x68,0x07,0xe6,0x10,0xbe,0xca,0x3b,0xb8,0xd1,0x5e,0x16,0x0a,0x4f,0x31,0x49}, + {0x65,0xd2,0xfc,0xa4,0xe8,0x1f,0x61,0x56,0x7d,0xba,0xc1,0xe5,0xfd,0x53,0xd3,0x3b,0xbd,0xd6,0x4b,0x21,0x1a,0xf3,0x31,0x81,0x62,0xda,0x5b,0x55,0x87,0x15,0xb9,0x2a,0x30,0x97,0xee,0x4c,0xa8,0xb0,0x25,0xaf,0x8a,0x4b,0x86,0xe8,0x30,0x84,0x5a,0x02,0x32,0x67,0x01,0x9f,0x02,0x50,0x1b,0xc1,0xf4,0xf8,0x80,0x9a,0x1b,0x4e,0x16,0x7a,0x34,0x48,0x67,0xf1,0xf4,0x11,0xf2,0x9b,0x95,0xf8,0x2d,0xf6,0x17,0x6b,0x4e,0xb8,0x4e,0x2a,0x72,0x5b,0x07,0x6f,0xde,0xd7,0x21,0x2a,0xbb,0x63,0xb9,0x04,0x9a,0x54}, + {0xbf,0x18,0x68,0x05,0x0a,0x05,0xfe,0x95,0xa9,0xfa,0x60,0x56,0x71,0x89,0x7e,0x32,0x73,0x50,0xa0,0x06,0xcd,0xe3,0xe8,0xc3,0x9a,0xa4,0x45,0x74,0x4c,0x3f,0x93,0x27,0x9f,0x09,0xfc,0x8e,0xb9,0x51,0x73,0x28,0x38,0x25,0xfd,0x7d,0xf4,0xc6,0x65,0x67,0x65,0x92,0x0a,0xfb,0x3d,0x8d,0x34,0xca,0x27,0x87,0xe5,0x21,0x03,0x91,0x0e,0x68,0xb0,0x26,0x14,0xe5,0xec,0x45,0x1e,0xbf,0x94,0x0f,0xba,0x6d,0x3d,0xc6,0x2b,0xe3,0xc0,0x52,0xf8,0x8c,0xd5,0x74,0x29,0xe4,0x18,0x4c,0xe6,0xb0,0xb1,0x79,0xf0,0x44}, + {0xba,0xd6,0x47,0xa4,0xc3,0x82,0x91,0x7f,0xb7,0x29,0x27,0x4b,0xd1,0x14,0x00,0xd5,0x87,0xa0,0x64,0xb8,0x1c,0xf1,0x3c,0xe3,0xf3,0x55,0x1b,0xeb,0x73,0x7e,0x4a,0x15,0x33,0xbb,0xa5,0x08,0x44,0xbc,0x12,0xa2,0x02,0xed,0x5e,0xc7,0xc3,0x48,0x50,0x8d,0x44,0xec,0xbf,0x5a,0x0c,0xeb,0x1b,0xdd,0xeb,0x06,0xe2,0x46,0xf1,0xcc,0x45,0x29,0xb3,0x03,0xd0,0xe7,0x79,0xa1,0x32,0xc8,0x7e,0x4d,0x12,0x00,0x0a,0x9d,0x72,0x5f,0xf3,0x8f,0x6d,0x0e,0xa1,0xd4,0xc1,0x62,0x98,0x7a,0xb2,0x38,0x59,0xac,0xb8,0x68}, + {0xa4,0x8c,0x7d,0x7b,0xb6,0x06,0x98,0x49,0x39,0x27,0xd2,0x27,0x84,0xe2,0x5b,0x57,0xb9,0x53,0x45,0x20,0xe7,0x5c,0x08,0xbb,0x84,0x78,0x41,0xae,0x41,0x4c,0xb6,0x38,0x31,0x71,0x15,0x77,0xeb,0xee,0x0c,0x3a,0x88,0xaf,0xc8,0x00,0x89,0x15,0x27,0x9b,0x36,0xa7,0x59,0xda,0x68,0xb6,0x65,0x80,0xbd,0x38,0xcc,0xa2,0xb6,0x7b,0xe5,0x51,0xa4,0xe3,0x9d,0x68,0x91,0xad,0x9d,0x8f,0x37,0x91,0xfb,0xf8,0x28,0x24,0x5f,0x17,0x88,0xb9,0xcf,0x9f,0x32,0xb5,0x0a,0x05,0x9f,0xc0,0x54,0x13,0xa2,0xdf,0x65,0x78}, + {0xb1,0x21,0x32,0xaa,0x9a,0x2c,0x6f,0xba,0xa7,0x23,0xba,0x3b,0x53,0x21,0xa0,0x6c,0x3a,0x2c,0x19,0x92,0x4f,0x76,0xea,0x9d,0xe0,0x17,0x53,0x2e,0x5d,0xdd,0x6e,0x1d,0xbf,0xa3,0x4e,0x94,0xd0,0x5c,0x1a,0x6b,0xd2,0xc0,0x9d,0xb3,0x3a,0x35,0x70,0x74,0x49,0x2e,0x54,0x28,0x82,0x52,0xb2,0x71,0x7e,0x92,0x3c,0x28,0x69,0xea,0x1b,0x46,0x36,0xda,0x0f,0xab,0xac,0x8a,0x7a,0x21,0xc8,0x49,0x35,0x3d,0x54,0xc6,0x28,0xa5,0x68,0x75,0xab,0x13,0x8b,0x5b,0xd0,0x37,0x37,0xbc,0x2c,0x3a,0x62,0xef,0x3c,0x23}, + {0xd9,0x34,0x92,0xf3,0xed,0x5d,0xa7,0xe2,0xf9,0x58,0xb5,0xe1,0x80,0x76,0x3d,0x96,0xfb,0x23,0x3c,0x6e,0xac,0x41,0x27,0x2c,0xc3,0x01,0x0e,0x32,0xa1,0x24,0x90,0x3a,0x8f,0x3e,0xdd,0x04,0x66,0x59,0xb7,0x59,0x2c,0x70,0x88,0xe2,0x77,0x03,0xb3,0x6c,0x23,0xc3,0xd9,0x5e,0x66,0x9c,0x33,0xb1,0x2f,0xe5,0xbc,0x61,0x60,0xe7,0x15,0x09,0x7e,0xa3,0x34,0xa8,0x35,0xe8,0x7d,0xdf,0xea,0x57,0x98,0x68,0xda,0x9c,0xe1,0x8b,0x26,0xb3,0x67,0x71,0x36,0x85,0x11,0x2c,0xc2,0xd5,0xef,0xdb,0xd9,0xb3,0x9e,0x58}, + {0x5e,0x51,0xaa,0x49,0x54,0x63,0x5b,0xed,0x3a,0x82,0xc6,0x0b,0x9f,0xc4,0x65,0xa8,0xc4,0xd1,0x42,0x5b,0xe9,0x1f,0x0c,0x85,0xb9,0x15,0xd3,0x03,0x6f,0x6d,0xd7,0x30,0x1d,0x9c,0x2f,0x63,0x0e,0xdd,0xcc,0x2e,0x15,0x31,0x89,0x76,0x96,0xb6,0xd0,0x51,0x58,0x7a,0x63,0xa8,0x6b,0xb7,0xdf,0x52,0x39,0xef,0x0e,0xa0,0x49,0x7d,0xd3,0x6d,0xc7,0xe4,0x06,0x21,0x17,0x44,0x44,0x6c,0x69,0x7f,0x8d,0x92,0x80,0xd6,0x53,0xfb,0x26,0x3f,0x4d,0x69,0xa4,0x9e,0x73,0xb4,0xb0,0x4b,0x86,0x2e,0x11,0x97,0xc6,0x10}, + {0xde,0x5f,0xbe,0x7d,0x27,0xc4,0x93,0x64,0xa2,0x7e,0xad,0x19,0xad,0x4f,0x5d,0x26,0x90,0x45,0x30,0x46,0xc8,0xdf,0x00,0x0e,0x09,0xfe,0x66,0xed,0xab,0x1c,0xe6,0x25,0x05,0xc8,0x58,0x83,0xa0,0x2a,0xa6,0x0c,0x47,0x42,0x20,0x7a,0xe3,0x4a,0x3d,0x6a,0xdc,0xed,0x11,0x3b,0xa6,0xd3,0x64,0x74,0xef,0x06,0x08,0x55,0xaf,0x9b,0xbf,0x03,0x04,0x66,0x58,0xcc,0x28,0xe1,0x13,0x3f,0x7e,0x74,0x59,0xb4,0xec,0x73,0x58,0x6f,0xf5,0x68,0x12,0xcc,0xed,0x3d,0xb6,0xa0,0x2c,0xe2,0x86,0x45,0x63,0x78,0x6d,0x56}, + {0x34,0x08,0xc1,0x9c,0x9f,0xa4,0x37,0x16,0x51,0xc4,0x9b,0xa8,0xd5,0x56,0x8e,0xbc,0xdb,0xd2,0x7f,0x7f,0x0f,0xec,0xb5,0x1c,0xd9,0x35,0xcc,0x5e,0xca,0x5b,0x97,0x33,0xd0,0x2f,0x5a,0xc6,0x85,0x42,0x05,0xa1,0xc3,0x67,0x16,0xf3,0x2a,0x11,0x64,0x6c,0x58,0xee,0x1a,0x73,0x40,0xe2,0x0a,0x68,0x2a,0xb2,0x93,0x47,0xf3,0xa5,0xfb,0x14,0xd4,0xf7,0x85,0x69,0x16,0x46,0xd7,0x3c,0x57,0x00,0xc8,0xc9,0x84,0x5e,0x3e,0x59,0x1e,0x13,0x61,0x7b,0xb6,0xf2,0xc3,0x2f,0x6c,0x52,0xfc,0x83,0xea,0x9c,0x82,0x14}, + {0xc2,0x95,0xdd,0x97,0x84,0x7b,0x43,0xff,0xa7,0xb5,0x4e,0xaa,0x30,0x4e,0x74,0x6c,0x8b,0xe8,0x85,0x3c,0x61,0x5d,0x0c,0x9e,0x73,0x81,0x75,0x5f,0x1e,0xc7,0xd9,0x2f,0xb8,0xec,0x71,0x4e,0x2f,0x0b,0xe7,0x21,0xe3,0x77,0xa4,0x40,0xb9,0xdd,0x56,0xe6,0x80,0x4f,0x1d,0xce,0xce,0x56,0x65,0xbf,0x7e,0x7b,0x5d,0x53,0xc4,0x3b,0xfc,0x05,0xdd,0xde,0xaf,0x52,0xae,0xb3,0xb8,0x24,0xcf,0x30,0x3b,0xed,0x8c,0x63,0x95,0x34,0x95,0x81,0xbe,0xa9,0x83,0xbc,0xa4,0x33,0x04,0x1f,0x65,0x5c,0x47,0x67,0x37,0x37}, + {0xd9,0xad,0xd1,0x40,0xfd,0x99,0xba,0x2f,0x27,0xd0,0xf4,0x96,0x6f,0x16,0x07,0xb3,0xae,0x3b,0xf0,0x15,0x52,0xf0,0x63,0x43,0x99,0xf9,0x18,0x3b,0x6c,0xa5,0xbe,0x1f,0x90,0x65,0x24,0x14,0xcb,0x95,0x40,0x63,0x35,0x55,0xc1,0x16,0x40,0x14,0x12,0xef,0x60,0xbc,0x10,0x89,0x0c,0x14,0x38,0x9e,0x8c,0x7c,0x90,0x30,0x57,0x90,0xf5,0x6b,0x8a,0x5b,0x41,0xe1,0xf1,0x78,0xa7,0x0f,0x7e,0xa7,0xc3,0xba,0xf7,0x9f,0x40,0x06,0x50,0x9a,0xa2,0x9a,0xb8,0xd7,0x52,0x6f,0x56,0x5a,0x63,0x7a,0xf6,0x1c,0x52,0x02}, + {0x94,0x52,0x9d,0x0a,0x0b,0xee,0x3f,0x51,0x66,0x5a,0xdf,0x0f,0x5c,0xe7,0x98,0x8f,0xce,0x07,0xe1,0xbf,0x88,0x86,0x61,0xd4,0xed,0x2c,0x38,0x71,0x7e,0x0a,0xa0,0x3f,0xe4,0x5e,0x2f,0x77,0x20,0x67,0x14,0xb1,0xce,0x9a,0x07,0x96,0xb1,0x94,0xf8,0xe8,0x4a,0x82,0xac,0x00,0x4d,0x22,0xf8,0x4a,0xc4,0x6c,0xcd,0xf7,0xd9,0x53,0x17,0x00,0x34,0xdb,0x3d,0x96,0x2d,0x23,0x69,0x3c,0x58,0x38,0x97,0xb4,0xda,0x87,0xde,0x1d,0x85,0xf2,0x91,0xa0,0xf9,0xd1,0xd7,0xaa,0xb6,0xed,0x48,0xa0,0x2f,0xfe,0xb5,0x12}, + {0x4d,0xe3,0xfc,0x96,0xc4,0xfb,0xf0,0x71,0xed,0x5b,0xf3,0xad,0x6b,0x82,0xb9,0x73,0x61,0xc5,0x28,0xff,0x61,0x72,0x04,0xd2,0x6f,0x20,0xb1,0x6f,0xf9,0x76,0x9b,0x74,0x92,0x1e,0x6f,0xad,0x26,0x7c,0x2b,0xdf,0x13,0x89,0x4b,0x50,0x23,0xd3,0x66,0x4b,0xc3,0x8b,0x1c,0x75,0xc0,0x9d,0x40,0x8c,0xb8,0xc7,0x96,0x07,0xc2,0x93,0x7e,0x6f,0x05,0xae,0xa6,0xae,0x04,0xf6,0x5a,0x1f,0x99,0x9c,0xe4,0xbe,0xf1,0x51,0x23,0xc1,0x66,0x6b,0xff,0xee,0xb5,0x08,0xa8,0x61,0x51,0x21,0xe0,0x01,0x0f,0xc1,0xce,0x0f}, + {0x44,0x1e,0xfe,0x49,0xa6,0x58,0x4d,0x64,0x7e,0x77,0xad,0x31,0xa2,0xae,0xfc,0x21,0xd2,0xd0,0x7f,0x88,0x5a,0x1c,0x44,0x02,0xf3,0x11,0xc5,0x83,0x71,0xaa,0x01,0x49,0x45,0x4e,0x24,0xc4,0x9d,0xd2,0xf2,0x3d,0x0a,0xde,0xd8,0x93,0x74,0x0e,0x02,0x2b,0x4d,0x21,0x0c,0x82,0x7e,0x06,0xc8,0x6c,0x0a,0xb9,0xea,0x6f,0x16,0x79,0x37,0x41,0xf0,0xf8,0x1a,0x8c,0x54,0xb7,0xb1,0x08,0xb4,0x99,0x62,0x24,0x7c,0x7a,0x0f,0xce,0x39,0xd9,0x06,0x1e,0xf9,0xb0,0x60,0xf7,0x13,0x12,0x6d,0x72,0x7b,0x88,0xbb,0x41}, + {0xbe,0x46,0x43,0x74,0x44,0x7d,0xe8,0x40,0x25,0x2b,0xb5,0x15,0xd4,0xda,0x48,0x1d,0x3e,0x60,0x3b,0xa1,0x18,0x8a,0x3a,0x7c,0xf7,0xbd,0xcd,0x2f,0xc1,0x28,0xb7,0x4e,0xae,0x91,0x66,0x7c,0x59,0x4c,0x23,0x7e,0xc8,0xb4,0x85,0x0a,0x3d,0x9d,0x88,0x64,0xe7,0xfa,0x4a,0x35,0x0c,0xc9,0xe2,0xda,0x1d,0x9e,0x6a,0x0c,0x07,0x1e,0x87,0x0a,0x89,0x89,0xbc,0x4b,0x99,0xb5,0x01,0x33,0x60,0x42,0xdd,0x5b,0x3a,0xae,0x6b,0x73,0x3c,0x9e,0xd5,0x19,0xe2,0xad,0x61,0x0d,0x64,0xd4,0x85,0x26,0x0f,0x30,0xe7,0x3e}, + {0xb7,0xd6,0x7d,0x9e,0xe4,0x55,0xd2,0xf5,0xac,0x1e,0x0b,0x61,0x5c,0x11,0x16,0x80,0xca,0x87,0xe1,0x92,0x5d,0x97,0x99,0x3c,0xc2,0x25,0x91,0x97,0x62,0x57,0x81,0x13,0x18,0x75,0x1e,0x84,0x47,0x79,0xfa,0x43,0xd7,0x46,0x9c,0x63,0x59,0xfa,0xc6,0xe5,0x74,0x2b,0x05,0xe3,0x1d,0x5e,0x06,0xa1,0x30,0x90,0xb8,0xcf,0xa2,0xc6,0x47,0x7d,0xe0,0xd6,0xf0,0x8e,0x14,0xd0,0xda,0x3f,0x3c,0x6f,0x54,0x91,0x9a,0x74,0x3e,0x9d,0x57,0x81,0xbb,0x26,0x10,0x62,0xec,0x71,0x80,0xec,0xc9,0x34,0x8d,0xf5,0x8c,0x14}, + {0x27,0xf0,0x34,0x79,0xf6,0x92,0xa4,0x46,0xa9,0x0a,0x84,0xf6,0xbe,0x84,0x99,0x46,0x54,0x18,0x61,0x89,0x2a,0xbc,0xa1,0x5c,0xd4,0xbb,0x5d,0xbd,0x1e,0xfa,0xf2,0x3f,0x6d,0x75,0xe4,0x9a,0x7d,0x2f,0x57,0xe2,0x7f,0x48,0xf3,0x88,0xbb,0x45,0xc3,0x56,0x8d,0xa8,0x60,0x69,0x6d,0x0b,0xd1,0x9f,0xb9,0xa1,0xae,0x4e,0xad,0xeb,0x8f,0x27,0x66,0x39,0x93,0x8c,0x1f,0x68,0xaa,0xb1,0x98,0x0c,0x29,0x20,0x9c,0x94,0x21,0x8c,0x52,0x3c,0x9d,0x21,0x91,0x52,0x11,0x39,0x7b,0x67,0x9c,0xfe,0x02,0xdd,0x04,0x41}, + {0x2a,0x42,0x24,0x11,0x5e,0xbf,0xb2,0x72,0xb5,0x3a,0xa3,0x98,0x33,0x0c,0xfa,0xa1,0x66,0xb6,0x52,0xfa,0x01,0x61,0xcb,0x94,0xd5,0x53,0xaf,0xaf,0x00,0x3b,0x86,0x2c,0xb8,0x6a,0x09,0xdb,0x06,0x4e,0x21,0x81,0x35,0x4f,0xe4,0x0c,0xc9,0xb6,0xa8,0x21,0xf5,0x2a,0x9e,0x40,0x2a,0xc1,0x24,0x65,0x81,0xa4,0xfc,0x8e,0xa4,0xb5,0x65,0x01,0x76,0x6a,0x84,0xa0,0x74,0xa4,0x90,0xf1,0xc0,0x7c,0x2f,0xcd,0x84,0xf9,0xef,0x12,0x8f,0x2b,0xaa,0x58,0x06,0x29,0x5e,0x69,0xb8,0xc8,0xfe,0xbf,0xd9,0x67,0x1b,0x59}, + {0xfa,0x9b,0xb4,0x80,0x1c,0x0d,0x2f,0x31,0x8a,0xec,0xf3,0xab,0x5e,0x51,0x79,0x59,0x88,0x1c,0xf0,0x9e,0xc0,0x33,0x70,0x72,0xcb,0x7b,0x8f,0xca,0xc7,0x2e,0xe0,0x3d,0x5d,0xb5,0x18,0x9f,0x71,0xb3,0xb9,0x99,0x1e,0x64,0x8c,0xa1,0xfa,0xe5,0x65,0xe4,0xed,0x05,0x9f,0xc2,0x36,0x11,0x08,0x61,0x8b,0x12,0x30,0x70,0x86,0x4f,0x9b,0x48,0xef,0x92,0xeb,0x3a,0x2d,0x10,0x32,0xd2,0x61,0xa8,0x16,0x61,0xb4,0x53,0x62,0xe1,0x24,0xaa,0x0b,0x19,0xe7,0xab,0x7e,0x3d,0xbf,0xbe,0x6c,0x49,0xba,0xfb,0xf5,0x49}, + {0xd4,0xcf,0x5b,0x8a,0x10,0x9a,0x94,0x30,0xeb,0x73,0x64,0xbc,0x70,0xdd,0x40,0xdc,0x1c,0x0d,0x7c,0x30,0xc1,0x94,0xc2,0x92,0x74,0x6e,0xfa,0xcb,0x6d,0xa8,0x04,0x56,0x2e,0x57,0x9c,0x1e,0x8c,0x62,0x5d,0x15,0x41,0x47,0x88,0xc5,0xac,0x86,0x4d,0x8a,0xeb,0x63,0x57,0x51,0xf6,0x52,0xa3,0x91,0x5b,0x51,0x67,0x88,0xc2,0xa6,0xa1,0x06,0xb6,0x64,0x17,0x7c,0xd4,0xd1,0x88,0x72,0x51,0x8b,0x41,0xe0,0x40,0x11,0x54,0x72,0xd1,0xf6,0xac,0x18,0x60,0x1a,0x03,0x9f,0xc6,0x42,0x27,0xfe,0x89,0x9e,0x98,0x20}, + {0x7f,0xcc,0x2d,0x3a,0xfd,0x77,0x97,0x49,0x92,0xd8,0x4f,0xa5,0x2c,0x7c,0x85,0x32,0xa0,0xe3,0x07,0xd2,0x64,0xd8,0x79,0xa2,0x29,0x7e,0xa6,0x0c,0x1d,0xed,0x03,0x04,0x2e,0xec,0xea,0x85,0x8b,0x27,0x74,0x16,0xdf,0x2b,0xcb,0x7a,0x07,0xdc,0x21,0x56,0x5a,0xf4,0xcb,0x61,0x16,0x4c,0x0a,0x64,0xd3,0x95,0x05,0xf7,0x50,0x99,0x0b,0x73,0x52,0xc5,0x4e,0x87,0x35,0x2d,0x4b,0xc9,0x8d,0x6f,0x24,0x98,0xcf,0xc8,0xe6,0xc5,0xce,0x35,0xc0,0x16,0xfa,0x46,0xcb,0xf7,0xcc,0x3d,0x30,0x08,0x43,0x45,0xd7,0x5b}, + {0xc2,0x4c,0xb2,0x28,0x95,0xd1,0x9a,0x7f,0x81,0xc1,0x35,0x63,0x65,0x54,0x6b,0x7f,0x36,0x72,0xc0,0x4f,0x6e,0xb6,0xb8,0x66,0x83,0xad,0x80,0x73,0x00,0x78,0x3a,0x13,0x2a,0x79,0xe7,0x15,0x21,0x93,0xc4,0x85,0xc9,0xdd,0xcd,0xbd,0xa2,0x89,0x4c,0xc6,0x62,0xd7,0xa3,0xad,0xa8,0x3d,0x1e,0x9d,0x2c,0xf8,0x67,0x30,0x12,0xdb,0xb7,0x5b,0xbe,0x62,0xca,0xc6,0x67,0xf4,0x61,0x09,0xee,0x52,0x19,0x21,0xd6,0x21,0xec,0x04,0x70,0x47,0xd5,0x9b,0x77,0x60,0x23,0x18,0xd2,0xe0,0xf0,0x58,0x6d,0xca,0x0d,0x74}, + {0x4e,0xce,0xcf,0x52,0x07,0xee,0x48,0xdf,0xb7,0x08,0xec,0x06,0xf3,0xfa,0xff,0xc3,0xc4,0x59,0x54,0xb9,0x2a,0x0b,0x71,0x05,0x8d,0xa3,0x3e,0x96,0xfa,0x25,0x1d,0x16,0x3c,0x43,0x78,0x04,0x57,0x8c,0x1a,0x23,0x9d,0x43,0x81,0xc2,0x0e,0x27,0xb5,0xb7,0x9f,0x07,0xd9,0xe3,0xea,0x99,0xaa,0xdb,0xd9,0x03,0x2b,0x6c,0x25,0xf5,0x03,0x2c,0x7d,0xa4,0x53,0x7b,0x75,0x18,0x0f,0x79,0x79,0x58,0x0c,0xcf,0x30,0x01,0x7b,0x30,0xf9,0xf7,0x7e,0x25,0x77,0x3d,0x90,0x31,0xaf,0xbb,0x96,0xbd,0xbd,0x68,0x94,0x69}, + {0xcf,0xfe,0xda,0xf4,0x46,0x2f,0x1f,0xbd,0xf7,0xd6,0x7f,0xa4,0x14,0x01,0xef,0x7c,0x7f,0xb3,0x47,0x4a,0xda,0xfd,0x1f,0xd3,0x85,0x57,0x90,0x73,0xa4,0x19,0x52,0x52,0x48,0x19,0xa9,0x6a,0xe6,0x3d,0xdd,0xd8,0xcc,0xd2,0xc0,0x2f,0xc2,0x64,0x50,0x48,0x2f,0xea,0xfd,0x34,0x66,0x24,0x48,0x9b,0x3a,0x2e,0x4a,0x6c,0x4e,0x1c,0x3e,0x29,0xe1,0x12,0x51,0x92,0x4b,0x13,0x6e,0x37,0xa0,0x5d,0xa1,0xdc,0xb5,0x78,0x37,0x70,0x11,0x31,0x1c,0x46,0xaf,0x89,0x45,0xb0,0x23,0x28,0x03,0x7f,0x44,0x5c,0x60,0x5b}, + {0x89,0x7c,0xc4,0x20,0x59,0x80,0x65,0xb9,0xcc,0x8f,0x3b,0x92,0x0c,0x10,0xf0,0xe7,0x77,0xef,0xe2,0x02,0x65,0x25,0x01,0x00,0xee,0xb3,0xae,0xa8,0xce,0x6d,0xa7,0x24,0x4c,0xf0,0xe7,0xf0,0xc6,0xfe,0xe9,0x3b,0x62,0x49,0xe3,0x75,0x9e,0x57,0x6a,0x86,0x1a,0xe6,0x1d,0x1e,0x16,0xef,0x42,0x55,0xd5,0xbd,0x5a,0xcc,0xf4,0xfe,0x12,0x2f,0x40,0xc7,0xc0,0xdf,0xb2,0x22,0x45,0x0a,0x07,0xa4,0xc9,0x40,0x7f,0x6e,0xd0,0x10,0x68,0xf6,0xcf,0x78,0x41,0x14,0xcf,0xc6,0x90,0x37,0xa4,0x18,0x25,0x7b,0x60,0x5e}, + {0x18,0x18,0xdf,0x6c,0x8f,0x1d,0xb3,0x58,0xa2,0x58,0x62,0xc3,0x4f,0xa7,0xcf,0x35,0x6e,0x1d,0xe6,0x66,0x4f,0xff,0xb3,0xe1,0xf7,0xd5,0xcd,0x6c,0xab,0xac,0x67,0x50,0x14,0xcf,0x96,0xa5,0x1c,0x43,0x2c,0xa0,0x00,0xe4,0xd3,0xae,0x40,0x2d,0xc4,0xe3,0xdb,0x26,0x0f,0x2e,0x80,0x26,0x45,0xd2,0x68,0x70,0x45,0x9e,0x13,0x33,0x1f,0x20,0x51,0x9d,0x03,0x08,0x6b,0x7f,0x52,0xfd,0x06,0x00,0x7c,0x01,0x64,0x49,0xb1,0x18,0xa8,0xa4,0x25,0x2e,0xb0,0x0e,0x22,0xd5,0x75,0x03,0x46,0x62,0x88,0xba,0x7c,0x39}, + {0xb2,0x59,0x59,0xf0,0x93,0x30,0xc1,0x30,0x76,0x79,0xa9,0xe9,0x8d,0xa1,0x3a,0xe2,0x26,0x5e,0x1d,0x72,0x91,0xd4,0x2f,0x22,0x3a,0x6c,0x6e,0x76,0x20,0xd3,0x39,0x23,0xe7,0x79,0x13,0xc8,0xfb,0xc3,0x15,0x78,0xf1,0x2a,0xe1,0xdd,0x20,0x94,0x61,0xa6,0xd5,0xfd,0xa8,0x85,0xf8,0xc0,0xa9,0xff,0x52,0xc2,0xe1,0xc1,0x22,0x40,0x1b,0x77,0xa7,0x2f,0x3a,0x51,0x86,0xd9,0x7d,0xd8,0x08,0xcf,0xd4,0xf9,0x71,0x9b,0xac,0xf5,0xb3,0x83,0xa2,0x1e,0x1b,0xc3,0x6b,0xd0,0x76,0x1a,0x97,0x19,0x92,0x18,0x1a,0x33}, + {0xc6,0x80,0x4f,0xfb,0x45,0x6f,0x16,0xf5,0xcf,0x75,0xc7,0x61,0xde,0xc7,0x36,0x9c,0x1c,0xd9,0x41,0x90,0x1b,0xe8,0xd4,0xe3,0x21,0xfe,0xbd,0x83,0x6b,0x7c,0x16,0x31,0xaf,0x72,0x75,0x9d,0x3a,0x2f,0x51,0x26,0x9e,0x4a,0x07,0x68,0x88,0xe2,0xcb,0x5b,0xc4,0xf7,0x80,0x11,0xc1,0xc1,0xed,0x84,0x7b,0xa6,0x49,0xf6,0x9f,0x61,0xc9,0x1a,0x68,0x10,0x4b,0x52,0x42,0x38,0x2b,0xf2,0x87,0xe9,0x9c,0xee,0x3b,0x34,0x68,0x50,0xc8,0x50,0x62,0x4a,0x84,0x71,0x9d,0xfc,0x11,0xb1,0x08,0x1f,0x34,0x36,0x24,0x61}, + {0x8d,0x89,0x4e,0x87,0xdb,0x41,0x9d,0xd9,0x20,0xdc,0x07,0x6c,0xf1,0xa5,0xfe,0x09,0xbc,0x9b,0x0f,0xd0,0x67,0x2c,0x3d,0x79,0x40,0xff,0x5e,0x9e,0x30,0xe2,0xeb,0x46,0x38,0x26,0x2d,0x1a,0xe3,0x49,0x63,0x8b,0x35,0xfd,0xd3,0x9b,0x00,0xb7,0xdf,0x9d,0xa4,0x6b,0xa0,0xa3,0xb8,0xf1,0x8b,0x7f,0x45,0x04,0xd9,0x78,0x31,0xaa,0x22,0x15,0x38,0x49,0x61,0x69,0x53,0x2f,0x38,0x2c,0x10,0x6d,0x2d,0xb7,0x9a,0x40,0xfe,0xda,0x27,0xf2,0x46,0xb6,0x91,0x33,0xc8,0xe8,0x6c,0x30,0x24,0x05,0xf5,0x70,0xfe,0x45}, + {0x8c,0x0b,0x0c,0x96,0xa6,0x75,0x48,0xda,0x20,0x2f,0x0e,0xef,0x76,0xd0,0x68,0x5b,0xd4,0x8f,0x0b,0x3d,0xcf,0x51,0xfb,0x07,0xd4,0x92,0xe3,0xa0,0x23,0x16,0x8d,0x42,0x91,0x14,0x95,0xc8,0x20,0x49,0xf2,0x62,0xa2,0x0c,0x63,0x3f,0xc8,0x07,0xf0,0x05,0xb8,0xd4,0xc9,0xf5,0xd2,0x45,0xbb,0x6f,0x45,0x22,0x7a,0xb5,0x6d,0x9f,0x61,0x16,0xfd,0x08,0xa3,0x01,0x44,0x4a,0x4f,0x08,0xac,0xca,0xa5,0x76,0xc3,0x19,0x22,0xa8,0x7d,0xbc,0xd1,0x43,0x46,0xde,0xb8,0xde,0xc6,0x38,0xbd,0x60,0x2d,0x59,0x81,0x1d}, + {0x5f,0xac,0x0d,0xa6,0x56,0x87,0x36,0x61,0x57,0xdc,0xab,0xeb,0x6a,0x2f,0xe0,0x17,0x7d,0x0f,0xce,0x4c,0x2d,0x3f,0x19,0x7f,0xf0,0xdc,0xec,0x89,0x77,0x4a,0x23,0x20,0xe8,0xc5,0x85,0x7b,0x9f,0xb6,0x65,0x87,0xb2,0xba,0x68,0xd1,0x8b,0x67,0xf0,0x6f,0x9b,0x0f,0x33,0x1d,0x7c,0xe7,0x70,0x3a,0x7c,0x8e,0xaf,0xb0,0x51,0x6d,0x5f,0x3a,0x52,0xb2,0x78,0x71,0xb6,0x0d,0xd2,0x76,0x60,0xd1,0x1e,0xd5,0xf9,0x34,0x1c,0x07,0x70,0x11,0xe4,0xb3,0x20,0x4a,0x2a,0xf6,0x66,0xe3,0xff,0x3c,0x35,0x82,0xd6,0x7c}, + {0xb6,0xfa,0x87,0xd8,0x5b,0xa4,0xe1,0x0b,0x6e,0x3b,0x40,0xba,0x32,0x6a,0x84,0x2a,0x00,0x60,0x6e,0xe9,0x12,0x10,0x92,0xd9,0x43,0x09,0xdc,0x3b,0x86,0xc8,0x38,0x28,0xf3,0xf4,0xac,0x68,0x60,0xcd,0x65,0xa6,0xd3,0xe3,0xd7,0x3c,0x18,0x2d,0xd9,0x42,0xd9,0x25,0x60,0x33,0x9d,0x38,0x59,0x57,0xff,0xd8,0x2c,0x2b,0x3b,0x25,0xf0,0x3e,0x30,0x50,0x46,0x4a,0xcf,0xb0,0x6b,0xd1,0xab,0x77,0xc5,0x15,0x41,0x6b,0x49,0xfa,0x9d,0x41,0xab,0xf4,0x8a,0xae,0xcf,0x82,0x12,0x28,0xa8,0x06,0xa6,0xb8,0xdc,0x21}, + {0xc8,0x9f,0x9d,0x8c,0x46,0x04,0x60,0x5c,0xcb,0xa3,0x2a,0xd4,0x6e,0x09,0x40,0x25,0x9c,0x2f,0xee,0x12,0x4c,0x4d,0x5b,0x12,0xab,0x1d,0xa3,0x94,0x81,0xd0,0xc3,0x0b,0xba,0x31,0x77,0xbe,0xfa,0x00,0x8d,0x9a,0x89,0x18,0x9e,0x62,0x7e,0x60,0x03,0x82,0x7f,0xd9,0xf3,0x43,0x37,0x02,0xcc,0xb2,0x8b,0x67,0x6f,0x6c,0xbf,0x0d,0x84,0x5d,0x8b,0xe1,0x9f,0x30,0x0d,0x38,0x6e,0x70,0xc7,0x65,0xe1,0xb9,0xa6,0x2d,0xb0,0x6e,0xab,0x20,0xae,0x7d,0x99,0xba,0xbb,0x57,0xdd,0x96,0xc1,0x2a,0x23,0x76,0x42,0x3a}, + {0xfa,0x84,0x70,0x8a,0x2c,0x43,0x42,0x4b,0x45,0xe5,0xb9,0xdf,0xe3,0x19,0x8a,0x89,0x5d,0xe4,0x58,0x9c,0x21,0x00,0x9f,0xbe,0xd1,0xeb,0x6d,0xa1,0xce,0x77,0xf1,0x1f,0xcb,0x7e,0x44,0xdb,0x72,0xc1,0xf8,0x3b,0xbd,0x2d,0x28,0xc6,0x1f,0xc4,0xcf,0x5f,0xfe,0x15,0xaa,0x75,0xc0,0xff,0xac,0x80,0xf9,0xa9,0xe1,0x24,0xe8,0xc9,0x70,0x07,0xfd,0xb5,0xb5,0x45,0x9a,0xd9,0x61,0xcf,0x24,0x79,0x3a,0x1b,0xe9,0x84,0x09,0x86,0x89,0x3e,0x3e,0x30,0x19,0x09,0x30,0xe7,0x1e,0x0b,0x50,0x41,0xfd,0x64,0xf2,0x39}, + {0x9c,0xe2,0xe7,0xdb,0x17,0x34,0xad,0xa7,0x9c,0x13,0x9c,0x2b,0x6a,0x37,0x94,0xbd,0xa9,0x7b,0x59,0x93,0x8e,0x1b,0xe9,0xa0,0x40,0x98,0x88,0x68,0x34,0xd7,0x12,0x17,0xe1,0x7b,0x09,0xfe,0xab,0x4a,0x9b,0xd1,0x29,0x19,0xe0,0xdf,0xe1,0xfc,0x6d,0xa4,0xff,0xf1,0xa6,0x2c,0x94,0x08,0xc9,0xc3,0x4e,0xf1,0x35,0x2c,0x27,0x21,0xc6,0x65,0xdd,0x93,0x31,0xce,0xf8,0x89,0x2b,0xe7,0xbb,0xc0,0x25,0xa1,0x56,0x33,0x10,0x4d,0x83,0xfe,0x1c,0x2e,0x3d,0xa9,0x19,0x04,0x72,0xe2,0x9c,0xb1,0x0a,0x80,0xf9,0x22}, + {0xcb,0xf8,0x9e,0x3e,0x8a,0x36,0x5a,0x60,0x15,0x47,0x50,0xa5,0x22,0xc0,0xe9,0xe3,0x8f,0x24,0x24,0x5f,0xb0,0x48,0x3d,0x55,0xe5,0x26,0x76,0x64,0xcd,0x16,0xf4,0x13,0xac,0xfd,0x6e,0x9a,0xdd,0x9f,0x02,0x42,0x41,0x49,0xa5,0x34,0xbe,0xce,0x12,0xb9,0x7b,0xf3,0xbd,0x87,0xb9,0x64,0x0f,0x64,0xb4,0xca,0x98,0x85,0xd3,0xa4,0x71,0x41,0x8c,0x4c,0xc9,0x99,0xaa,0x58,0x27,0xfa,0x07,0xb8,0x00,0xb0,0x6f,0x6f,0x00,0x23,0x92,0x53,0xda,0xad,0xdd,0x91,0xd2,0xfb,0xab,0xd1,0x4b,0x57,0xfa,0x14,0x82,0x50}, + {0x4b,0xfe,0xd6,0x3e,0x15,0x69,0x02,0xc2,0xc4,0x77,0x1d,0x51,0x39,0x67,0x5a,0xa6,0x94,0xaf,0x14,0x2c,0x46,0x26,0xde,0xcb,0x4b,0xa7,0xab,0x6f,0xec,0x60,0xf9,0x22,0xd6,0x03,0xd0,0x53,0xbb,0x15,0x1a,0x46,0x65,0xc9,0xf3,0xbc,0x88,0x28,0x10,0xb2,0x5a,0x3a,0x68,0x6c,0x75,0x76,0xc5,0x27,0x47,0xb4,0x6c,0xc8,0xa4,0x58,0x77,0x3a,0x76,0x50,0xae,0x93,0xf6,0x11,0x81,0x54,0xa6,0x54,0xfd,0x1d,0xdf,0x21,0xae,0x1d,0x65,0x5e,0x11,0xf3,0x90,0x8c,0x24,0x12,0x94,0xf4,0xe7,0x8d,0x5f,0xd1,0x9f,0x5d}, + {0x7f,0x72,0x63,0x6d,0xd3,0x08,0x14,0x03,0x33,0xb5,0xc7,0xd7,0xef,0x9a,0x37,0x6a,0x4b,0xe2,0xae,0xcc,0xc5,0x8f,0xe1,0xa9,0xd3,0xbe,0x8f,0x4f,0x91,0x35,0x2f,0x33,0x1e,0x52,0xd7,0xee,0x2a,0x4d,0x24,0x3f,0x15,0x96,0x2e,0x43,0x28,0x90,0x3a,0x8e,0xd4,0x16,0x9c,0x2e,0x77,0xba,0x64,0xe1,0xd8,0x98,0xeb,0x47,0xfa,0x87,0xc1,0x3b,0x0c,0xc2,0x86,0xea,0x15,0x01,0x47,0x6d,0x25,0xd1,0x46,0x6c,0xcb,0xb7,0x8a,0x99,0x88,0x01,0x66,0x3a,0xb5,0x32,0x78,0xd7,0x03,0xba,0x6f,0x90,0xce,0x81,0x0d,0x45}, + {0x75,0x52,0x20,0xa6,0xa1,0xb6,0x7b,0x6e,0x83,0x8e,0x3c,0x41,0xd7,0x21,0x4f,0xaa,0xb2,0x5c,0x8f,0xe8,0x55,0xd1,0x56,0x6f,0xe1,0x5b,0x34,0xa6,0x4b,0x5d,0xe2,0x2d,0x3f,0x74,0xae,0x1c,0x96,0xd8,0x74,0xd0,0xed,0x63,0x1c,0xee,0xf5,0x18,0x6d,0xf8,0x29,0xed,0xf4,0xe7,0x5b,0xc5,0xbd,0x97,0x08,0xb1,0x3a,0x66,0x79,0xd2,0xba,0x4c,0xcd,0x1f,0xd7,0xa0,0x24,0x90,0xd1,0x80,0xf8,0x8a,0x28,0xfb,0x0a,0xc2,0x25,0xc5,0x19,0x64,0x3a,0x5f,0x4b,0x97,0xa3,0xb1,0x33,0x72,0x00,0xe2,0xef,0xbc,0x7f,0x7d}, + {0x01,0x28,0x6b,0x26,0x6a,0x1e,0xef,0xfa,0x16,0x9f,0x73,0xd5,0xc4,0x68,0x6c,0x86,0x2c,0x76,0x03,0x1b,0xbc,0x2f,0x8a,0xf6,0x8d,0x5a,0xb7,0x87,0x5e,0x43,0x75,0x59,0x94,0x90,0xc2,0xf3,0xc5,0x5d,0x7c,0xcd,0xab,0x05,0x91,0x2a,0x9a,0xa2,0x81,0xc7,0x58,0x30,0x1c,0x42,0x36,0x1d,0xc6,0x80,0xd7,0xd4,0xd8,0xdc,0x96,0xd1,0x9c,0x4f,0x68,0x37,0x7b,0x6a,0xd8,0x97,0x92,0x19,0x63,0x7a,0xd1,0x1a,0x24,0x58,0xd0,0xd0,0x17,0x0c,0x1c,0x5c,0xad,0x9c,0x02,0xba,0x07,0x03,0x7a,0x38,0x84,0xd0,0xcd,0x7c}, + {0x17,0x04,0x26,0x6d,0x2c,0x42,0xa6,0xdc,0xbd,0x40,0x82,0x94,0x50,0x3d,0x15,0xae,0x77,0xc6,0x68,0xfb,0xb4,0xc1,0xc0,0xa9,0x53,0xcf,0xd0,0x61,0xed,0xd0,0x8b,0x42,0x93,0xcc,0x60,0x67,0x18,0x84,0x0c,0x9b,0x99,0x2a,0xb3,0x1a,0x7a,0x00,0xae,0xcd,0x18,0xda,0x0b,0x62,0x86,0xec,0x8d,0xa8,0x44,0xca,0x90,0x81,0x84,0xca,0x93,0x35,0xa7,0x9a,0x84,0x5e,0x9a,0x18,0x13,0x92,0xcd,0xfa,0xd8,0x65,0x35,0xc3,0xd8,0xd4,0xd1,0xbb,0xfd,0x53,0x5b,0x54,0x52,0x8c,0xe6,0x63,0x2d,0xda,0x08,0x83,0x39,0x27}, + {0x13,0xd4,0x5e,0x43,0x28,0x8d,0xc3,0x42,0xc9,0xcc,0x78,0x32,0x60,0xf3,0x50,0xbd,0xef,0x03,0xda,0x79,0x1a,0xab,0x07,0xbb,0x55,0x33,0x8c,0xbe,0xae,0x97,0x95,0x26,0x53,0x24,0x70,0x0a,0x4c,0x0e,0xa1,0xb9,0xde,0x1b,0x7d,0xd5,0x66,0x58,0xa2,0x0f,0xf7,0xda,0x27,0xcd,0xb5,0xd9,0xb9,0xff,0xfd,0x33,0x2c,0x49,0x45,0x29,0x2c,0x57,0xbe,0x30,0xcd,0xd6,0x45,0xc7,0x7f,0xc7,0xfb,0xae,0xba,0xe3,0xd3,0xe8,0xdf,0xe4,0x0c,0xda,0x5d,0xaa,0x30,0x88,0x2c,0xa2,0x80,0xca,0x5b,0xc0,0x98,0x54,0x98,0x7f}, + {0x17,0xe1,0x0b,0x9f,0x88,0xce,0x49,0x38,0x88,0xa2,0x54,0x7b,0x1b,0xad,0x05,0x80,0x1c,0x92,0xfc,0x23,0x9f,0xc3,0xa3,0x3d,0x04,0xf3,0x31,0x0a,0x47,0xec,0xc2,0x76,0x63,0x63,0xbf,0x0f,0x52,0x15,0x56,0xd3,0xa6,0xfb,0x4d,0xcf,0x45,0x5a,0x04,0x08,0xc2,0xa0,0x3f,0x87,0xbc,0x4f,0xc2,0xee,0xe7,0x12,0x9b,0xd6,0x3c,0x65,0xf2,0x30,0x85,0x0c,0xc1,0xaa,0x38,0xc9,0x08,0x8a,0xcb,0x6b,0x27,0xdb,0x60,0x9b,0x17,0x46,0x70,0xac,0x6f,0x0e,0x1e,0xc0,0x20,0xa9,0xda,0x73,0x64,0x59,0xf1,0x73,0x12,0x2f}, + {0x11,0x1e,0xe0,0x8a,0x7c,0xfc,0x39,0x47,0x9f,0xab,0x6a,0x4a,0x90,0x74,0x52,0xfd,0x2e,0x8f,0x72,0x87,0x82,0x8a,0xd9,0x41,0xf2,0x69,0x5b,0xd8,0x2a,0x57,0x9e,0x5d,0xc0,0x0b,0xa7,0x55,0xd7,0x8b,0x48,0x30,0xe7,0x42,0xd4,0xf1,0xa4,0xb5,0xd6,0x06,0x62,0x61,0x59,0xbc,0x9e,0xa6,0xd1,0xea,0x84,0xf7,0xc5,0xed,0x97,0x19,0xac,0x38,0x3b,0xb1,0x51,0xa7,0x17,0xb5,0x66,0x06,0x8c,0x85,0x9b,0x7e,0x86,0x06,0x7d,0x74,0x49,0xde,0x4d,0x45,0x11,0xc0,0xac,0xac,0x9c,0xe6,0xe9,0xbf,0x9c,0xcd,0xdf,0x22}, + {0xd9,0x0c,0x0d,0xc3,0xe0,0xd2,0xdb,0x8d,0x33,0x43,0xbb,0xac,0x5f,0x66,0x8e,0xad,0x1f,0x96,0x2a,0x32,0x8c,0x25,0x6b,0x8f,0xc7,0xc1,0x48,0x54,0xc0,0x16,0x29,0x6b,0xa1,0xe0,0x3b,0x10,0xb4,0x59,0xec,0x56,0x69,0xf9,0x59,0xd2,0xec,0xba,0xe3,0x2e,0x32,0xcd,0xf5,0x13,0x94,0xb2,0x7c,0x79,0x72,0xe4,0xcd,0x24,0x78,0x87,0xe9,0x0f,0x3b,0x91,0xba,0x0a,0xd1,0x34,0xdb,0x7e,0x0e,0xac,0x6d,0x2e,0x82,0xcd,0xa3,0x4e,0x15,0xf8,0x78,0x65,0xff,0x3d,0x08,0x66,0x17,0x0a,0xf0,0x7f,0x30,0x3f,0x30,0x4c}, + {0x85,0x8c,0xb2,0x17,0xd6,0x3b,0x0a,0xd3,0xea,0x3b,0x77,0x39,0xb7,0x77,0xd3,0xc5,0xbf,0x5c,0x6a,0x1e,0x8c,0xe7,0xc6,0xc6,0xc4,0xb7,0x2a,0x8b,0xf7,0xb8,0x61,0x0d,0x00,0x45,0xd9,0x0d,0x58,0x03,0xfc,0x29,0x93,0xec,0xbb,0x6f,0xa4,0x7a,0xd2,0xec,0xf8,0xa7,0xe2,0xc2,0x5f,0x15,0x0a,0x13,0xd5,0xa1,0x06,0xb7,0x1a,0x15,0x6b,0x41,0xb0,0x36,0xc1,0xe9,0xef,0xd7,0xa8,0x56,0x20,0x4b,0xe4,0x58,0xcd,0xe5,0x07,0xbd,0xab,0xe0,0x57,0x1b,0xda,0x2f,0xe6,0xaf,0xd2,0xe8,0x77,0x42,0xf7,0x2a,0x1a,0x19}, + {0x31,0x14,0x3c,0xc5,0x4b,0xf7,0x16,0xce,0xde,0xed,0x72,0x20,0xce,0x25,0x97,0x2b,0xe7,0x3e,0xb2,0xb5,0x6f,0xc3,0xb9,0xb8,0x08,0xc9,0x5c,0x0b,0x45,0x0e,0x2e,0x7e,0xfb,0x0e,0x46,0x4f,0x43,0x2b,0xe6,0x9f,0xd6,0x07,0x36,0xa6,0xd4,0x03,0xd3,0xde,0x24,0xda,0xa0,0xb7,0x0e,0x21,0x52,0xf0,0x93,0x5b,0x54,0x00,0xbe,0x7d,0x7e,0x23,0x30,0xb4,0x01,0x67,0xed,0x75,0x35,0x01,0x10,0xfd,0x0b,0x9f,0xe6,0x94,0x10,0x23,0x22,0x7f,0xe4,0x83,0x15,0x0f,0x32,0x75,0xe3,0x55,0x11,0xb1,0x99,0xa6,0xaf,0x71}, + {0x1d,0xb6,0x53,0x39,0x9b,0x6f,0xce,0x65,0xe6,0x41,0xa1,0xaf,0xea,0x39,0x58,0xc6,0xfe,0x59,0xf7,0xa9,0xfd,0x5f,0x43,0x0f,0x8e,0xc2,0xb1,0xc2,0xe9,0x42,0x11,0x02,0xd6,0x50,0x3b,0x47,0x1c,0x3c,0x42,0xea,0x10,0xef,0x38,0x3b,0x1f,0x7a,0xe8,0x51,0x95,0xbe,0xc9,0xb2,0x5f,0xbf,0x84,0x9b,0x1c,0x9a,0xf8,0x78,0xbc,0x1f,0x73,0x00,0x80,0x18,0xf8,0x48,0x18,0xc7,0x30,0xe4,0x19,0xc1,0xce,0x5e,0x22,0x0c,0x96,0xbf,0xe3,0x15,0xba,0x6b,0x83,0xe0,0xda,0xb6,0x08,0x58,0xe1,0x47,0x33,0x6f,0x4d,0x4c}, + {0xc9,0x1f,0x7d,0xc1,0xcf,0xec,0xf7,0x18,0x14,0x3c,0x40,0x51,0xa6,0xf5,0x75,0x6c,0xdf,0x0c,0xee,0xf7,0x2b,0x71,0xde,0xdb,0x22,0x7a,0xe4,0xa7,0xaa,0xdd,0x3f,0x19,0x70,0x19,0x8f,0x98,0xfc,0xdd,0x0c,0x2f,0x1b,0xf5,0xb9,0xb0,0x27,0x62,0x91,0x6b,0xbe,0x76,0x91,0x77,0xc4,0xb6,0xc7,0x6e,0xa8,0x9f,0x8f,0xa8,0x00,0x95,0xbf,0x38,0x6f,0x87,0xe8,0x37,0x3c,0xc9,0xd2,0x1f,0x2c,0x46,0xd1,0x18,0x5a,0x1e,0xf6,0xa2,0x76,0x12,0x24,0x39,0x82,0xf5,0x80,0x50,0x69,0x49,0x0d,0xbf,0x9e,0xb9,0x6f,0x6a}, + {0xeb,0x55,0x08,0x56,0xbb,0xc1,0x46,0x6a,0x9d,0xf0,0x93,0xf8,0x38,0xbb,0x16,0x24,0xc1,0xac,0x71,0x8f,0x37,0x11,0x1d,0xd7,0xea,0x96,0x18,0xa3,0x14,0x69,0xf7,0x75,0xc6,0x23,0xe4,0xb6,0xb5,0x22,0xb1,0xee,0x8e,0xff,0x86,0xf2,0x10,0x70,0x9d,0x93,0x8c,0x5d,0xcf,0x1d,0x83,0x2a,0xa9,0x90,0x10,0xeb,0xc5,0x42,0x9f,0xda,0x6f,0x13,0xd1,0xbd,0x05,0xa3,0xb1,0xdf,0x4c,0xf9,0x08,0x2c,0xf8,0x9f,0x9d,0x4b,0x36,0x0f,0x8a,0x58,0xbb,0xc3,0xa5,0xd8,0x87,0x2a,0xba,0xdc,0xe8,0x0b,0x51,0x83,0x21,0x02}, + {0x14,0x2d,0xad,0x5e,0x38,0x66,0xf7,0x4a,0x30,0x58,0x7c,0xca,0x80,0xd8,0x8e,0xa0,0x3d,0x1e,0x21,0x10,0xe6,0xa6,0x13,0x0d,0x03,0x6c,0x80,0x7b,0xe1,0x1c,0x07,0x6a,0x7f,0x7a,0x30,0x43,0x01,0x71,0x5a,0x9d,0x5f,0xa4,0x7d,0xc4,0x9e,0xde,0x63,0xb0,0xd3,0x7a,0x92,0xbe,0x52,0xfe,0xbb,0x22,0x6c,0x42,0x40,0xfd,0x41,0xc4,0x87,0x13,0xf8,0x8a,0x97,0x87,0xd1,0xc3,0xd3,0xb5,0x13,0x44,0x0e,0x7f,0x3d,0x5a,0x2b,0x72,0xa0,0x7c,0x47,0xbb,0x48,0x48,0x7b,0x0d,0x92,0xdc,0x1e,0xaf,0x6a,0xb2,0x71,0x31}, + {0xa8,0x4c,0x56,0x97,0x90,0x31,0x2f,0xa9,0x19,0xe1,0x75,0x22,0x4c,0xb8,0x7b,0xff,0x50,0x51,0x87,0xa4,0x37,0xfe,0x55,0x4f,0x5a,0x83,0xf0,0x3c,0x87,0xd4,0x1f,0x22,0xd1,0x47,0x8a,0xb2,0xd8,0xb7,0x0d,0xa6,0xf1,0xa4,0x70,0x17,0xd6,0x14,0xbf,0xa6,0x58,0xbd,0xdd,0x53,0x93,0xf8,0xa1,0xd4,0xe9,0x43,0x42,0x34,0x63,0x4a,0x51,0x6c,0x41,0x63,0x15,0x3a,0x4f,0x20,0x22,0x23,0x2d,0x03,0x0a,0xba,0xe9,0xe0,0x73,0xfb,0x0e,0x03,0x0f,0x41,0x4c,0xdd,0xe0,0xfc,0xaa,0x4a,0x92,0xfb,0x96,0xa5,0xda,0x48}, + {0xc7,0x9c,0xa5,0x5c,0x66,0x8e,0xca,0x6e,0xa0,0xac,0x38,0x2e,0x4b,0x25,0x47,0xa8,0xce,0x17,0x1e,0xd2,0x08,0xc7,0xaf,0x31,0xf7,0x4a,0xd8,0xca,0xfc,0xd6,0x6d,0x67,0x93,0x97,0x4c,0xc8,0x5d,0x1d,0xf6,0x14,0x06,0x82,0x41,0xef,0xe3,0xf9,0x41,0x99,0xac,0x77,0x62,0x34,0x8f,0xb8,0xf5,0xcd,0xa9,0x79,0x8a,0x0e,0xfa,0x37,0xc8,0x58,0x58,0x90,0xfc,0x96,0x85,0x68,0xf9,0x0c,0x1b,0xa0,0x56,0x7b,0xf3,0xbb,0xdc,0x1d,0x6a,0xd6,0x35,0x49,0x7d,0xe7,0xc2,0xdc,0x0a,0x7f,0xa5,0xc6,0xf2,0x73,0x4f,0x1c}, + {0xbb,0xa0,0x5f,0x30,0xbd,0x4f,0x7a,0x0e,0xad,0x63,0xc6,0x54,0xe0,0x4c,0x9d,0x82,0x48,0x38,0xe3,0x2f,0x83,0xc3,0x21,0xf4,0x42,0x4c,0xf6,0x1b,0x0d,0xc8,0x5a,0x79,0x84,0x34,0x7c,0xfc,0x6e,0x70,0x6e,0xb3,0x61,0xcf,0xc1,0xc3,0xb4,0xc9,0xdf,0x73,0xe5,0xc7,0x1c,0x78,0xc9,0x79,0x1d,0xeb,0x5c,0x67,0xaf,0x7d,0xdb,0x9a,0x45,0x70,0xb3,0x2b,0xb4,0x91,0x49,0xdb,0x91,0x1b,0xca,0xdc,0x02,0x4b,0x23,0x96,0x26,0x57,0xdc,0x78,0x8c,0x1f,0xe5,0x9e,0xdf,0x9f,0xd3,0x1f,0xe2,0x8c,0x84,0x62,0xe1,0x5f}, + {0x1a,0x96,0x94,0xe1,0x4f,0x21,0x59,0x4e,0x4f,0xcd,0x71,0x0d,0xc7,0x7d,0xbe,0x49,0x2d,0xf2,0x50,0x3b,0xd2,0xcf,0x00,0x93,0x32,0x72,0x91,0xfc,0x46,0xd4,0x89,0x47,0x08,0xb2,0x7c,0x5d,0x2d,0x85,0x79,0x28,0xe7,0xf2,0x7d,0x68,0x70,0xdd,0xde,0xb8,0x91,0x78,0x68,0x21,0xab,0xff,0x0b,0xdc,0x35,0xaa,0x7d,0x67,0x43,0xc0,0x44,0x2b,0x8e,0xb7,0x4e,0x07,0xab,0x87,0x1c,0x1a,0x67,0xf4,0xda,0x99,0x8e,0xd1,0xc6,0xfa,0x67,0x90,0x4f,0x48,0xcd,0xbb,0xac,0x3e,0xe4,0xa4,0xb9,0x2b,0xef,0x2e,0xc5,0x60}, + {0xf1,0x8b,0xfd,0x3b,0xbc,0x89,0x5d,0x0b,0x1a,0x55,0xf3,0xc9,0x37,0x92,0x6b,0xb0,0xf5,0x28,0x30,0xd5,0xb0,0x16,0x4c,0x0e,0xab,0xca,0xcf,0x2c,0x31,0x9c,0xbc,0x10,0x11,0x6d,0xae,0x7c,0xc2,0xc5,0x2b,0x70,0xab,0x8c,0xa4,0x54,0x9b,0x69,0xc7,0x44,0xb2,0x2e,0x49,0xba,0x56,0x40,0xbc,0xef,0x6d,0x67,0xb6,0xd9,0x48,0x72,0xd7,0x70,0x5b,0xa0,0xc2,0x3e,0x4b,0xe8,0x8a,0xaa,0xe0,0x81,0x17,0xed,0xf4,0x9e,0x69,0x98,0xd1,0x85,0x8e,0x70,0xe4,0x13,0x45,0x79,0x13,0xf4,0x76,0xa9,0xd3,0x5b,0x75,0x63}, + {0x53,0x08,0xd1,0x2a,0x3e,0xa0,0x5f,0xb5,0x69,0x35,0xe6,0x9e,0x90,0x75,0x6f,0x35,0x90,0xb8,0x69,0xbe,0xfd,0xf1,0xf9,0x9f,0x84,0x6f,0xc1,0x8b,0xc4,0xc1,0x8c,0x0d,0xb7,0xac,0xf1,0x97,0x18,0x10,0xc7,0x3d,0xd8,0xbb,0x65,0xc1,0x5e,0x7d,0xda,0x5d,0x0f,0x02,0xa1,0x0f,0x9c,0x5b,0x8e,0x50,0x56,0x2a,0xc5,0x37,0x17,0x75,0x63,0x27,0xa9,0x19,0xb4,0x6e,0xd3,0x02,0x94,0x02,0xa5,0x60,0xb4,0x77,0x7e,0x4e,0xb4,0xf0,0x56,0x49,0x3c,0xd4,0x30,0x62,0xa8,0xcf,0xe7,0x66,0xd1,0x7a,0x8a,0xdd,0xc2,0x70}, + {0x0e,0xec,0x6f,0x9f,0x50,0x94,0x61,0x65,0x8d,0x51,0xc6,0x46,0xa9,0x7e,0x2e,0xee,0x5c,0x9b,0xe0,0x67,0xf3,0xc1,0x33,0x97,0x95,0x84,0x94,0x63,0x63,0xac,0x0f,0x2e,0x13,0x7e,0xed,0xb8,0x7d,0x96,0xd4,0x91,0x7a,0x81,0x76,0xd7,0x0a,0x2f,0x25,0x74,0x64,0x25,0x85,0x0d,0xe0,0x82,0x09,0xe4,0xe5,0x3c,0xa5,0x16,0x38,0x61,0xb8,0x32,0x64,0xcd,0x48,0xe4,0xbe,0xf7,0xe7,0x79,0xd0,0x86,0x78,0x08,0x67,0x3a,0xc8,0x6a,0x2e,0xdb,0xe4,0xa0,0xd9,0xd4,0x9f,0xf8,0x41,0x4f,0x5a,0x73,0x5c,0x21,0x79,0x41}, + {0x2a,0xed,0xdc,0xd7,0xe7,0x94,0x70,0x8c,0x70,0x9c,0xd3,0x47,0xc3,0x8a,0xfb,0x97,0x02,0xd9,0x06,0xa9,0x33,0xe0,0x3b,0xe1,0x76,0x9d,0xd9,0x0c,0xa3,0x44,0x03,0x70,0x34,0xcd,0x6b,0x28,0xb9,0x33,0xae,0xe4,0xdc,0xd6,0x9d,0x55,0xb6,0x7e,0xef,0xb7,0x1f,0x8e,0xd3,0xb3,0x1f,0x14,0x8b,0x27,0x86,0xc2,0x41,0x22,0x66,0x85,0xfa,0x31,0xf4,0x22,0x36,0x2e,0x42,0x6c,0x82,0xaf,0x2d,0x50,0x33,0x98,0x87,0x29,0x20,0xc1,0x23,0x91,0x38,0x2b,0xe1,0xb7,0xc1,0x9b,0x89,0x24,0x95,0xa9,0x12,0x23,0xbb,0x24}, + {0xc3,0x67,0xde,0x32,0x17,0xed,0xa8,0xb1,0x48,0x49,0x1b,0x46,0x18,0x94,0xb4,0x3c,0xd2,0xbc,0xcf,0x76,0x43,0x43,0xbd,0x8e,0x08,0x80,0x18,0x1e,0x87,0x3e,0xee,0x0f,0x6b,0x5c,0xf8,0xf5,0x2a,0x0c,0xf8,0x41,0x94,0x67,0xfa,0x04,0xc3,0x84,0x72,0x68,0xad,0x1b,0xba,0xa3,0x99,0xdf,0x45,0x89,0x16,0x5d,0xeb,0xff,0xf9,0x2a,0x1d,0x0d,0xdf,0x1e,0x62,0x32,0xa1,0x8a,0xda,0xa9,0x79,0x65,0x22,0x59,0xa1,0x22,0xb8,0x30,0x93,0xc1,0x9a,0xa7,0x7b,0x19,0x04,0x40,0x76,0x1d,0x53,0x18,0x97,0xd7,0xac,0x16}, + {0x3d,0x1d,0x9b,0x2d,0xaf,0x72,0xdf,0x72,0x5a,0x24,0x32,0xa4,0x36,0x2a,0x46,0x63,0x37,0x96,0xb3,0x16,0x79,0xa0,0xce,0x3e,0x09,0x23,0x30,0xb9,0xf6,0x0e,0x3e,0x12,0xad,0xb6,0x87,0x78,0xc5,0xc6,0x59,0xc9,0xba,0xfe,0x90,0x5f,0xad,0x9e,0xe1,0x94,0x04,0xf5,0x42,0xa3,0x62,0x4e,0xe2,0x16,0x00,0x17,0x16,0x18,0x4b,0xd3,0x4e,0x16,0x9a,0xe6,0x2f,0x19,0x4c,0xd9,0x7e,0x48,0x13,0x15,0x91,0x3a,0xea,0x2c,0xae,0x61,0x27,0xde,0xa4,0xb9,0xd3,0xf6,0x7b,0x87,0xeb,0xf3,0x73,0x10,0xc6,0x0f,0xda,0x78}, + {0x6a,0xc6,0x2b,0xe5,0x28,0x5d,0xf1,0x5b,0x8e,0x1a,0xf0,0x70,0x18,0xe3,0x47,0x2c,0xdd,0x8b,0xc2,0x06,0xbc,0xaf,0x19,0x24,0x3a,0x17,0x6b,0x25,0xeb,0xde,0x25,0x2d,0x94,0x3a,0x0c,0x68,0xf1,0x80,0x9f,0xa2,0xe6,0xe7,0xe9,0x1a,0x15,0x7e,0xf7,0x71,0x73,0x79,0x01,0x48,0x58,0xf1,0x00,0x11,0xdd,0x8d,0xb3,0x16,0xb3,0xa4,0x4a,0x05,0xb8,0x7c,0x26,0x19,0x8d,0x46,0xc8,0xdf,0xaf,0x4d,0xe5,0x66,0x9c,0x78,0x28,0x0b,0x17,0xec,0x6e,0x66,0x2a,0x1d,0xeb,0x2a,0x60,0xa7,0x7d,0xab,0xa6,0x10,0x46,0x13}, + {0xfe,0xb0,0xf6,0x8d,0xc7,0x8e,0x13,0x51,0x1b,0xf5,0x75,0xe5,0x89,0xda,0x97,0x53,0xb9,0xf1,0x7a,0x71,0x1d,0x7a,0x20,0x09,0x50,0xd6,0x20,0x2b,0xba,0xfd,0x02,0x21,0x15,0xf5,0xd1,0x77,0xe7,0x65,0x2a,0xcd,0xf1,0x60,0xaa,0x8f,0x87,0x91,0x89,0x54,0xe5,0x06,0xbc,0xda,0xbc,0x3b,0xb7,0xb1,0xfb,0xc9,0x7c,0xa9,0xcb,0x78,0x48,0x65,0xa1,0xe6,0x5c,0x05,0x05,0xe4,0x9e,0x96,0x29,0xad,0x51,0x12,0x68,0xa7,0xbc,0x36,0x15,0xa4,0x7d,0xaa,0x17,0xf5,0x1a,0x3a,0xba,0xb2,0xec,0x29,0xdb,0x25,0xd7,0x0a}, + {0x57,0x24,0x4e,0x83,0xb1,0x67,0x42,0xdc,0xc5,0x1b,0xce,0x70,0xb5,0x44,0x75,0xb6,0xd7,0x5e,0xd1,0xf7,0x0b,0x7a,0xf0,0x1a,0x50,0x36,0xa0,0x71,0xfb,0xcf,0xef,0x4a,0x85,0x6f,0x05,0x9b,0x0c,0xbc,0xc7,0xfe,0xd7,0xff,0xf5,0xe7,0x68,0x52,0x7d,0x53,0xfa,0xae,0x12,0x43,0x62,0xc6,0xaf,0x77,0xd9,0x9f,0x39,0x02,0x53,0x5f,0x67,0x4f,0x1e,0x17,0x15,0x04,0x36,0x36,0x2d,0xc3,0x3b,0x48,0x98,0x89,0x11,0xef,0x2b,0xcd,0x10,0x51,0x94,0xd0,0xad,0x6e,0x0a,0x87,0x61,0x65,0xa8,0xa2,0x72,0xbb,0xcc,0x0b}, + {0xc8,0xa9,0xb1,0xea,0x2f,0x96,0x5e,0x18,0xcd,0x7d,0x14,0x65,0x35,0xe6,0xe7,0x86,0xf2,0x6d,0x5b,0xbb,0x31,0xe0,0x92,0xb0,0x3e,0xb7,0xd6,0x59,0xab,0xf0,0x24,0x40,0x96,0x12,0xfe,0x50,0x4c,0x5e,0x6d,0x18,0x7e,0x9f,0xe8,0xfe,0x82,0x7b,0x39,0xe0,0xb0,0x31,0x70,0x50,0xc5,0xf6,0xc7,0x3b,0xc2,0x37,0x8f,0x10,0x69,0xfd,0x78,0x66,0xc2,0x63,0x68,0x63,0x31,0xfa,0x86,0x15,0xf2,0x33,0x2d,0x57,0x48,0x8c,0xf6,0x07,0xfc,0xae,0x9e,0x78,0x9f,0xcc,0x73,0x4f,0x01,0x47,0xad,0x8e,0x10,0xe2,0x42,0x2d}, + {0x9b,0xd2,0xdf,0x94,0x15,0x13,0xf5,0x97,0x6a,0x4c,0x3f,0x31,0x5d,0x98,0x55,0x61,0x10,0x50,0x45,0x08,0x07,0x3f,0xa1,0xeb,0x22,0xd3,0xd2,0xb8,0x08,0x26,0x6b,0x67,0x93,0x75,0x53,0x0f,0x0d,0x7b,0x71,0x21,0x4c,0x06,0x1e,0x13,0x0b,0x69,0x4e,0x91,0x9f,0xe0,0x2a,0x75,0xae,0x87,0xb6,0x1b,0x6e,0x3c,0x42,0x9b,0xa7,0xf3,0x0b,0x42,0x47,0x2b,0x5b,0x1c,0x65,0xba,0x38,0x81,0x80,0x1b,0x1b,0x31,0xec,0xb6,0x71,0x86,0xb0,0x35,0x31,0xbc,0xb1,0x0c,0xff,0x7b,0xe0,0xf1,0x0c,0x9c,0xfa,0x2f,0x5d,0x74}, + {0xbd,0xc8,0xc9,0x2b,0x1e,0x5a,0x52,0xbf,0x81,0x9d,0x47,0x26,0x08,0x26,0x5b,0xea,0xdb,0x55,0x01,0xdf,0x0e,0xc7,0x11,0xd5,0xd0,0xf5,0x0c,0x96,0xeb,0x3c,0xe2,0x1a,0x6a,0x4e,0xd3,0x21,0x57,0xdf,0x36,0x60,0xd0,0xb3,0x7b,0x99,0x27,0x88,0xdb,0xb1,0xfa,0x6a,0x75,0xc8,0xc3,0x09,0xc2,0xd3,0x39,0xc8,0x1d,0x4c,0xe5,0x5b,0xe1,0x06,0x4a,0x99,0x32,0x19,0x87,0x5d,0x72,0x5b,0xb0,0xda,0xb1,0xce,0xb5,0x1c,0x35,0x32,0x05,0xca,0xb7,0xda,0x49,0x15,0xc4,0x7d,0xf7,0xc1,0x8e,0x27,0x61,0xd8,0xde,0x58}, + {0x5c,0xc5,0x66,0xf2,0x93,0x37,0x17,0xd8,0x49,0x4e,0x45,0xcc,0xc5,0x76,0xc9,0xc8,0xa8,0xc3,0x26,0xbc,0xf8,0x82,0xe3,0x5c,0xf9,0xf6,0x85,0x54,0xe8,0x9d,0xf3,0x2f,0xa8,0xc9,0xc2,0xb6,0xa8,0x5b,0xfb,0x2d,0x8c,0x59,0x2c,0xf5,0x8e,0xef,0xee,0x48,0x73,0x15,0x2d,0xf1,0x07,0x91,0x80,0x33,0xd8,0x5b,0x1d,0x53,0x6b,0x69,0xba,0x08,0x7a,0xc5,0xef,0xc3,0xee,0x3e,0xed,0x77,0x11,0x48,0xff,0xd4,0x17,0x55,0xe0,0x04,0xcb,0x71,0xa6,0xf1,0x3f,0x7a,0x3d,0xea,0x54,0xfe,0x7c,0x94,0xb4,0x33,0x06,0x12}, + {0x42,0x00,0x61,0x91,0x78,0x98,0x94,0x0b,0xe8,0xfa,0xeb,0xec,0x3c,0xb1,0xe7,0x4e,0xc0,0xa4,0xf0,0x94,0x95,0x73,0xbe,0x70,0x85,0x91,0xd5,0xb4,0x99,0x0a,0xd3,0x35,0x0a,0x10,0x12,0x49,0x47,0x31,0xbd,0x82,0x06,0xbe,0x6f,0x7e,0x6d,0x7b,0x23,0xde,0xc6,0x79,0xea,0x11,0x19,0x76,0x1e,0xe1,0xde,0x3b,0x39,0xcb,0xe3,0x3b,0x43,0x07,0xf4,0x97,0xe9,0x5c,0xc0,0x44,0x79,0xff,0xa3,0x51,0x5c,0xb0,0xe4,0x3d,0x5d,0x57,0x7c,0x84,0x76,0x5a,0xfd,0x81,0x33,0x58,0x9f,0xda,0xf6,0x7a,0xde,0x3e,0x87,0x2d}, + {0x09,0x34,0x37,0x43,0x64,0x31,0x7a,0x15,0xd9,0x81,0xaa,0xf4,0xee,0xb7,0xb8,0xfa,0x06,0x48,0xa6,0xf5,0xe6,0xfe,0x93,0xb0,0xb6,0xa7,0x7f,0x70,0x54,0x36,0x77,0x2e,0x81,0xf9,0x5d,0x4e,0xe1,0x02,0x62,0xaa,0xf5,0xe1,0x15,0x50,0x17,0x59,0x0d,0xa2,0x6c,0x1d,0xe2,0xba,0xd3,0x75,0xa2,0x18,0x53,0x02,0x60,0x01,0x8a,0x61,0x43,0x05,0xc1,0x23,0x4c,0x97,0xf4,0xbd,0xea,0x0d,0x93,0x46,0xce,0x9d,0x25,0x0a,0x6f,0xaa,0x2c,0xba,0x9a,0xa2,0xb8,0x2c,0x20,0x04,0x0d,0x96,0x07,0x2d,0x36,0x43,0x14,0x4b}, + {0x7a,0x1f,0x6e,0xb6,0xc7,0xb7,0xc4,0xcc,0x7e,0x2f,0x0c,0xf5,0x25,0x7e,0x15,0x44,0x1c,0xaf,0x3e,0x71,0xfc,0x6d,0xf0,0x3e,0xf7,0x63,0xda,0x52,0x67,0x44,0x2f,0x58,0xcb,0x9c,0x52,0x1c,0xe9,0x54,0x7c,0x96,0xfb,0x35,0xc6,0x64,0x92,0x26,0xf6,0x30,0x65,0x19,0x12,0x78,0xf4,0xaf,0x47,0x27,0x5c,0x6f,0xf6,0xea,0x18,0x84,0x03,0x17,0xe4,0x4c,0x32,0x20,0xd3,0x7b,0x31,0xc6,0xc4,0x8b,0x48,0xa4,0xe8,0x42,0x10,0xa8,0x64,0x13,0x5a,0x4e,0x8b,0xf1,0x1e,0xb2,0xc9,0x8d,0xa2,0xcd,0x4b,0x1c,0x2a,0x0c}, + {0x47,0x04,0x1f,0x6f,0xd0,0xc7,0x4d,0xd2,0x59,0xc0,0x87,0xdb,0x3e,0x9e,0x26,0xb2,0x8f,0xd2,0xb2,0xfb,0x72,0x02,0x5b,0xd1,0x77,0x48,0xf6,0xc6,0xd1,0x8b,0x55,0x7c,0x45,0x69,0xbd,0x69,0x48,0x81,0xc4,0xed,0x22,0x8d,0x1c,0xbe,0x7d,0x90,0x6d,0x0d,0xab,0xc5,0x5c,0xd5,0x12,0xd2,0x3b,0xc6,0x83,0xdc,0x14,0xa3,0x30,0x9b,0x6a,0x5a,0x3d,0x46,0x96,0xd3,0x24,0x15,0xec,0xd0,0xf0,0x24,0x5a,0xc3,0x8a,0x62,0xbb,0x12,0xa4,0x5f,0xbc,0x1c,0x79,0x3a,0x0c,0xa5,0xc3,0xaf,0xfb,0x0a,0xca,0xa5,0x04,0x04}, + {0xd6,0x43,0xa7,0x0a,0x07,0x40,0x1f,0x8c,0xe8,0x5e,0x26,0x5b,0xcb,0xd0,0xba,0xcc,0xde,0xd2,0x8f,0x66,0x6b,0x04,0x4b,0x57,0x33,0x96,0xdd,0xca,0xfd,0x5b,0x39,0x46,0xd1,0x6f,0x41,0x2a,0x1b,0x9e,0xbc,0x62,0x8b,0x59,0x50,0xe3,0x28,0xf7,0xc6,0xb5,0x67,0x69,0x5d,0x3d,0xd8,0x3f,0x34,0x04,0x98,0xee,0xf8,0xe7,0x16,0x75,0x52,0x39,0x9c,0x9a,0x5d,0x1a,0x2d,0xdb,0x7f,0x11,0x2a,0x5c,0x00,0xd1,0xbc,0x45,0x77,0x9c,0xea,0x6f,0xd5,0x54,0xf1,0xbe,0xd4,0xef,0x16,0xd0,0x22,0xe8,0x29,0x9a,0x57,0x76}, + {0x17,0x2a,0xc0,0x49,0x7e,0x8e,0xb6,0x45,0x7f,0xa3,0xa9,0xbc,0xa2,0x51,0xcd,0x23,0x1b,0x4c,0x22,0xec,0x11,0x5f,0xd6,0x3e,0xb1,0xbd,0x05,0x9e,0xdc,0x84,0xa3,0x43,0xf2,0x34,0xb4,0x52,0x13,0xb5,0x3c,0x33,0xe1,0x80,0xde,0x93,0x49,0x28,0x32,0xd8,0xce,0x35,0x0d,0x75,0x87,0x28,0x51,0xb5,0xc1,0x77,0x27,0x2a,0xbb,0x14,0xc5,0x02,0x45,0xb6,0xf1,0x8b,0xda,0xd5,0x4b,0x68,0x53,0x4b,0xb5,0xf6,0x7e,0xd3,0x8b,0xfb,0x53,0xd2,0xb0,0xa9,0xd7,0x16,0x39,0x31,0x59,0x80,0x54,0x61,0x09,0x92,0x60,0x11}, + {0xaa,0xcf,0xda,0x29,0x69,0x16,0x4d,0xb4,0x8f,0x59,0x13,0x84,0x4c,0x9f,0x52,0xda,0x59,0x55,0x3d,0x45,0xca,0x63,0xef,0xe9,0x0b,0x8e,0x69,0xc5,0x5b,0x12,0x1e,0x35,0xcd,0x4d,0x9b,0x36,0x16,0x56,0x38,0x7a,0x63,0x35,0x5c,0x65,0xa7,0x2c,0xc0,0x75,0x21,0x80,0xf1,0xd4,0xf9,0x1b,0xc2,0x7d,0x42,0xe0,0xe6,0x91,0x74,0x7d,0x63,0x2f,0xbe,0x7b,0xf6,0x1a,0x46,0x9b,0xb4,0xd4,0x61,0x89,0xab,0xc8,0x7a,0x03,0x03,0xd6,0xfb,0x99,0xa6,0xf9,0x9f,0xe1,0xde,0x71,0x9a,0x2a,0xce,0xe7,0x06,0x2d,0x18,0x7f}, + {0xec,0x68,0x01,0xab,0x64,0x8e,0x7c,0x7a,0x43,0xc5,0xed,0x15,0x55,0x4a,0x5a,0xcb,0xda,0x0e,0xcd,0x47,0xd3,0x19,0x55,0x09,0xb0,0x93,0x3e,0x34,0x8c,0xac,0xd4,0x67,0x22,0x75,0x21,0x8e,0x72,0x4b,0x45,0x09,0xd8,0xb8,0x84,0xd4,0xf4,0xe8,0x58,0xaa,0x3c,0x90,0x46,0x7f,0x4d,0x25,0x58,0xd3,0x17,0x52,0x1c,0x24,0x43,0xc0,0xac,0x44,0x77,0x57,0x7a,0x4f,0xbb,0x6b,0x7d,0x1c,0xe1,0x13,0x83,0x91,0xd4,0xfe,0x35,0x8b,0x84,0x46,0x6b,0xc9,0xc6,0xa1,0xdc,0x4a,0xbd,0x71,0xad,0x12,0x83,0x1c,0x6d,0x55}, + {0x82,0x39,0x8d,0x0c,0xe3,0x40,0xef,0x17,0x34,0xfa,0xa3,0x15,0x3e,0x07,0xf7,0x31,0x6e,0x64,0x73,0x07,0xcb,0xf3,0x21,0x4f,0xff,0x4e,0x82,0x1d,0x6d,0x6c,0x6c,0x74,0x21,0xe8,0x1b,0xb1,0x56,0x67,0xf0,0x81,0xdd,0xf3,0xa3,0x10,0x23,0xf8,0xaf,0x0f,0x5d,0x46,0x99,0x6a,0x55,0xd0,0xb2,0xf8,0x05,0x7f,0x8c,0xcc,0x38,0xbe,0x7a,0x09,0xa4,0x2d,0xa5,0x7e,0x87,0xc9,0x49,0x0c,0x43,0x1d,0xdc,0x9b,0x55,0x69,0x43,0x4c,0xd2,0xeb,0xcc,0xf7,0x09,0x38,0x2c,0x02,0xbd,0x84,0xee,0x4b,0xa3,0x14,0x7e,0x57}, + {0x0a,0x3b,0xa7,0x61,0xac,0x68,0xe2,0xf0,0xf5,0xa5,0x91,0x37,0x10,0xfa,0xfa,0xf2,0xe9,0x00,0x6d,0x6b,0x82,0x3e,0xe1,0xc1,0x42,0x8f,0xd7,0x6f,0xe9,0x7e,0xfa,0x60,0x2b,0xd7,0x4d,0xbd,0xbe,0xce,0xfe,0x94,0x11,0x22,0x0f,0x06,0xda,0x4f,0x6a,0xf4,0xff,0xd1,0xc8,0xc0,0x77,0x59,0x4a,0x12,0x95,0x92,0x00,0xfb,0xb8,0x04,0x53,0x70,0xc6,0x6e,0x29,0x4d,0x35,0x1d,0x3d,0xb6,0xd8,0x31,0xad,0x5f,0x3e,0x05,0xc3,0xf3,0xec,0x42,0xbd,0xb4,0x8c,0x95,0x0b,0x67,0xfd,0x53,0x63,0xa1,0x0c,0x8e,0x39,0x21}, + {0xf3,0x33,0x2b,0x38,0x8a,0x05,0xf5,0x89,0xb4,0xc0,0x48,0xad,0x0b,0xba,0xe2,0x5a,0x6e,0xb3,0x3d,0xa5,0x03,0xb5,0x93,0x8f,0xe6,0x32,0xa2,0x95,0x9d,0xed,0xa3,0x5a,0x01,0x56,0xb7,0xb4,0xf9,0xaa,0x98,0x27,0x72,0xad,0x8d,0x5c,0x13,0x72,0xac,0x5e,0x23,0xa0,0xb7,0x61,0x61,0xaa,0xce,0xd2,0x4e,0x7d,0x8f,0xe9,0x84,0xb2,0xbf,0x1b,0x61,0x65,0xd9,0xc7,0xe9,0x77,0x67,0x65,0x36,0x80,0xc7,0x72,0x54,0x12,0x2b,0xcb,0xee,0x6e,0x50,0xd9,0x99,0x32,0x05,0x65,0xcc,0x57,0x89,0x5e,0x4e,0xe1,0x07,0x4a}, + {0x99,0xf9,0x0d,0x98,0xcb,0x12,0xe4,0x4e,0x71,0xc7,0x6e,0x3c,0x6f,0xd7,0x15,0xa3,0xfd,0x77,0x5c,0x92,0xde,0xed,0xa5,0xbb,0x02,0x34,0x31,0x1d,0x39,0xac,0x0b,0x3f,0x9b,0xa4,0x77,0xc4,0xcd,0x58,0x0b,0x24,0x17,0xf0,0x47,0x64,0xde,0xda,0x38,0xfd,0xad,0x6a,0xc8,0xa7,0x32,0x8d,0x92,0x19,0x81,0xa0,0xaf,0x84,0xed,0x7a,0xaf,0x50,0xe5,0x5b,0xf6,0x15,0x01,0xde,0x4f,0x6e,0xb2,0x09,0x61,0x21,0x21,0x26,0x98,0x29,0xd9,0xd6,0xad,0x0b,0x81,0x05,0x02,0x78,0x06,0xd0,0xeb,0xba,0x16,0xa3,0x21,0x19}, + {0xfc,0x70,0xb8,0xdf,0x7e,0x2f,0x42,0x89,0xbd,0xb3,0x76,0x4f,0xeb,0x6b,0x29,0x2c,0xf7,0x4d,0xc2,0x36,0xd4,0xf1,0x38,0x07,0xb0,0xae,0x73,0xe2,0x41,0xdf,0x58,0x64,0x8b,0xc1,0xf3,0xd9,0x9a,0xad,0x5a,0xd7,0x9c,0xc1,0xb1,0x60,0xef,0x0e,0x6a,0x56,0xd9,0x0e,0x5c,0x25,0xac,0x0b,0x9a,0x3e,0xf5,0xc7,0x62,0xa0,0xec,0x9d,0x04,0x7b,0x83,0x44,0x44,0x35,0x7a,0xe3,0xcb,0xdc,0x93,0xbe,0xed,0x0f,0x33,0x79,0x88,0x75,0x87,0xdd,0xc5,0x12,0xc3,0x04,0x60,0x78,0x64,0x0e,0x95,0xc2,0xcb,0xdc,0x93,0x60}, + {0x6d,0x70,0xe0,0x85,0x85,0x9a,0xf3,0x1f,0x33,0x39,0xe7,0xb3,0xd8,0xa5,0xd0,0x36,0x3b,0x45,0x8f,0x71,0xe1,0xf2,0xb9,0x43,0x7c,0xa9,0x27,0x48,0x08,0xea,0xd1,0x57,0x4b,0x03,0x84,0x60,0xbe,0xee,0xde,0x6b,0x54,0xb8,0x0f,0x78,0xb6,0xc2,0x99,0x31,0x95,0x06,0x2d,0xb6,0xab,0x76,0x33,0x97,0x90,0x7d,0x64,0x8b,0xc9,0x80,0x31,0x6e,0x71,0xb0,0x28,0xa1,0xe7,0xb6,0x7a,0xee,0xaa,0x8b,0xa8,0x93,0x6d,0x59,0xc1,0xa4,0x30,0x61,0x21,0xb2,0x82,0xde,0xb4,0xf7,0x18,0xbd,0x97,0xdd,0x9d,0x99,0x3e,0x36}, + {0xc4,0x1f,0xee,0x35,0xc1,0x43,0xa8,0x96,0xcf,0xc8,0xe4,0x08,0x55,0xb3,0x6e,0x97,0x30,0xd3,0x8c,0xb5,0x01,0x68,0x2f,0xb4,0x2b,0x05,0x3a,0x69,0x78,0x9b,0xee,0x48,0xc6,0xae,0x4b,0xe2,0xdc,0x48,0x18,0x2f,0x60,0xaf,0xbc,0xba,0x55,0x72,0x9b,0x76,0x31,0xe9,0xef,0x3c,0x6e,0x3c,0xcb,0x90,0x55,0xb3,0xf9,0xc6,0x9b,0x97,0x1f,0x23,0xc6,0xf3,0x2a,0xcc,0x4b,0xde,0x31,0x5c,0x1f,0x8d,0x20,0xfe,0x30,0xb0,0x4b,0xb0,0x66,0xb4,0x4f,0xc1,0x09,0x70,0x8d,0xb7,0x13,0x24,0x79,0x08,0x9b,0xfa,0x9b,0x07}, + {0xf4,0x0d,0x30,0xda,0x51,0x3a,0x90,0xe3,0xb0,0x5a,0xa9,0x3d,0x23,0x64,0x39,0x84,0x80,0x64,0x35,0x0b,0x2d,0xf1,0x3c,0xed,0x94,0x71,0x81,0x84,0xf6,0x77,0x8c,0x03,0x45,0x42,0xd5,0xa2,0x80,0xed,0xc9,0xf3,0x52,0x39,0xf6,0x77,0x78,0x8b,0xa0,0x0a,0x75,0x54,0x08,0xd1,0x63,0xac,0x6d,0xd7,0x6b,0x63,0x70,0x94,0x15,0xfb,0xf4,0x1e,0xec,0x7b,0x16,0x5b,0xe6,0x5e,0x4e,0x85,0xc2,0xcd,0xd0,0x96,0x42,0x0a,0x59,0x59,0x99,0x21,0x10,0x98,0x34,0xdf,0xb2,0x72,0x56,0xff,0x0b,0x4a,0x2a,0xe9,0x5e,0x57}, + {0xcf,0x2f,0x18,0x8a,0x90,0x80,0xc0,0xd4,0xbd,0x9d,0x48,0x99,0xc2,0x70,0xe1,0x30,0xde,0x33,0xf7,0x52,0x57,0xbd,0xba,0x05,0x00,0xfd,0xd3,0x2c,0x11,0xe7,0xd4,0x43,0x01,0xd8,0xa4,0x0a,0x45,0xbc,0x46,0x5d,0xd8,0xb9,0x33,0xa5,0x27,0x12,0xaf,0xc3,0xc2,0x06,0x89,0x2b,0x26,0x3b,0x9e,0x38,0x1b,0x58,0x2f,0x38,0x7e,0x1e,0x0a,0x20,0xc5,0x3a,0xf9,0xea,0x67,0xb9,0x8d,0x51,0xc0,0x52,0x66,0x05,0x9b,0x98,0xbc,0x71,0xf5,0x97,0x71,0x56,0xd9,0x85,0x2b,0xfe,0x38,0x4e,0x1e,0x65,0x52,0xca,0x0e,0x05}, + {0x9c,0x0c,0x3f,0x45,0xde,0x1a,0x43,0xc3,0x9b,0x3b,0x70,0xff,0x5e,0x04,0xf5,0xe9,0x3d,0x7b,0x84,0xed,0xc9,0x7a,0xd9,0xfc,0xc6,0xf4,0x58,0x1c,0xc2,0xe6,0x0e,0x4b,0xea,0x68,0xe6,0x60,0x76,0x39,0xac,0x97,0x97,0xb4,0x3a,0x15,0xfe,0xbb,0x19,0x9b,0x9f,0xa7,0xec,0x34,0xb5,0x79,0xb1,0x4c,0x57,0xae,0x31,0xa1,0x9f,0xc0,0x51,0x61,0x96,0x5d,0xf0,0xfd,0x0d,0x5c,0xf5,0x3a,0x7a,0xee,0xb4,0x2a,0xe0,0x2e,0x26,0xdd,0x09,0x17,0x17,0x12,0x87,0xbb,0xb2,0x11,0x0b,0x03,0x0f,0x80,0xfa,0x24,0xef,0x1f}, + {0x96,0x31,0xa7,0x1a,0xfb,0x53,0xd6,0x37,0x18,0x64,0xd7,0x3f,0x30,0x95,0x94,0x0f,0xb2,0x17,0x3a,0xfb,0x09,0x0b,0x20,0xad,0x3e,0x61,0xc8,0x2f,0x29,0x49,0x4d,0x54,0x86,0x6b,0x97,0x30,0xf5,0xaf,0xd2,0x22,0x04,0x46,0xd2,0xc2,0x06,0xb8,0x90,0x8d,0xe5,0xba,0xe5,0x4d,0x6c,0x89,0xa1,0xdc,0x17,0x0c,0x34,0xc8,0xe6,0x5f,0x00,0x28,0x88,0x86,0x52,0x34,0x9f,0xba,0xef,0x6a,0xa1,0x7d,0x10,0x25,0x94,0xff,0x1b,0x5c,0x36,0x4b,0xd9,0x66,0xcd,0xbb,0x5b,0xf7,0xfa,0x6d,0x31,0x0f,0x93,0x72,0xe4,0x72}, + {0x4f,0x08,0x81,0x97,0x8c,0x20,0x95,0x26,0xe1,0x0e,0x45,0x23,0x0b,0x2a,0x50,0xb1,0x02,0xde,0xef,0x03,0xa6,0xae,0x9d,0xfd,0x4c,0xa3,0x33,0x27,0x8c,0x2e,0x9d,0x5a,0x27,0x76,0x2a,0xd3,0x35,0xf6,0xf3,0x07,0xf0,0x66,0x65,0x5f,0x86,0x4d,0xaa,0x7a,0x50,0x44,0xd0,0x28,0x97,0xe7,0x85,0x3c,0x38,0x64,0xe0,0x0f,0x00,0x7f,0xee,0x1f,0xe5,0xf7,0xdb,0x03,0xda,0x05,0x53,0x76,0xbd,0xcd,0x34,0x14,0x49,0xf2,0xda,0xa4,0xec,0x88,0x4a,0xd2,0xcd,0xd5,0x4a,0x7b,0x43,0x05,0x04,0xee,0x51,0x40,0xf9,0x00}, + {0xb2,0x30,0xd3,0xc3,0x23,0x6b,0x35,0x8d,0x06,0x1b,0x47,0xb0,0x9b,0x8b,0x1c,0xf2,0x3c,0xb8,0x42,0x6e,0x6c,0x31,0x6c,0xb3,0x0d,0xb1,0xea,0x8b,0x7e,0x9c,0xd7,0x07,0x53,0x97,0xaf,0x07,0xbb,0x93,0xef,0xd7,0xa7,0x66,0xb7,0x3d,0xcf,0xd0,0x3e,0x58,0xc5,0x1e,0x0b,0x6e,0xbf,0x98,0x69,0xce,0x52,0x04,0xd4,0x5d,0xd2,0xff,0xb7,0x47,0x12,0xdd,0x08,0xbc,0x9c,0xfb,0xfb,0x87,0x9b,0xc2,0xee,0xe1,0x3a,0x6b,0x06,0x8a,0xbf,0xc1,0x1f,0xdb,0x2b,0x24,0x57,0x0d,0xb6,0x4b,0xa6,0x5e,0xa3,0x20,0x35,0x1c}, + {0x4a,0xa3,0xcb,0xbc,0xa6,0x53,0xd2,0x80,0x9b,0x21,0x38,0x38,0xa1,0xc3,0x61,0x3e,0x96,0xe3,0x82,0x98,0x01,0xb6,0xc3,0x90,0x6f,0xe6,0x0e,0x5d,0x77,0x05,0x3d,0x1c,0x59,0xc0,0x6b,0x21,0x40,0x6f,0xa8,0xcd,0x7e,0xd8,0xbc,0x12,0x1d,0x23,0xbb,0x1f,0x90,0x09,0xc7,0x17,0x9e,0x6a,0x95,0xb4,0x55,0x2e,0xd1,0x66,0x3b,0x0c,0x75,0x38,0x1a,0xe5,0x22,0x94,0x40,0xf1,0x2e,0x69,0x71,0xf6,0x5d,0x2b,0x3c,0xc7,0xc0,0xcb,0x29,0xe0,0x4c,0x74,0xe7,0x4f,0x01,0x21,0x7c,0x48,0x30,0xd3,0xc7,0xe2,0x21,0x06}, + {0x8d,0x83,0x59,0x82,0xcc,0x60,0x98,0xaf,0xdc,0x9a,0x9f,0xc6,0xc1,0x48,0xea,0x90,0x30,0x1e,0x58,0x65,0x37,0x48,0x26,0x65,0xbc,0xa5,0xd3,0x7b,0x09,0xd6,0x07,0x00,0xf3,0xf0,0xdb,0xb0,0x96,0x17,0xae,0xb7,0x96,0xe1,0x7c,0xe1,0xb9,0xaf,0xdf,0x54,0xb4,0xa3,0xaa,0xe9,0x71,0x30,0x92,0x25,0x9d,0x2e,0x00,0xa1,0x9c,0x58,0x8e,0x5d,0x4b,0xa9,0x42,0x08,0x95,0x1d,0xbf,0xc0,0x3e,0x2e,0x8f,0x58,0x63,0xc3,0xd3,0xb2,0xef,0xe2,0x51,0xbb,0x38,0x14,0x96,0x0a,0x86,0xbf,0x1c,0x3c,0x78,0xd7,0x83,0x15}, + {0xe1,0x7a,0xa2,0x5d,0xef,0xa2,0xee,0xec,0x74,0x01,0x67,0x55,0x14,0x3a,0x7c,0x59,0x7a,0x16,0x09,0x66,0x12,0x2a,0xa6,0xc9,0x70,0x8f,0xed,0x81,0x2e,0x5f,0x2a,0x25,0xc7,0x28,0x9d,0xcc,0x04,0x47,0x03,0x90,0x8f,0xc5,0x2c,0xf7,0x9e,0x67,0x1b,0x1d,0x26,0x87,0x5b,0xbe,0x5f,0x2b,0xe1,0x16,0x0a,0x58,0xc5,0x83,0x4e,0x06,0x58,0x49,0x0d,0xe8,0x66,0x50,0x26,0x94,0x28,0x0d,0x6b,0x8c,0x7c,0x30,0x85,0xf7,0xc3,0xfc,0xfd,0x12,0x11,0x0c,0x78,0xda,0x53,0x1b,0x88,0xb3,0x43,0xd8,0x0b,0x17,0x9c,0x07}, + {0xff,0x6f,0xfa,0x64,0xe4,0xec,0x06,0x05,0x23,0xe5,0x05,0x62,0x1e,0x43,0xe3,0xbe,0x42,0xea,0xb8,0x51,0x24,0x42,0x79,0x35,0x00,0xfb,0xc9,0x4a,0xe3,0x05,0xec,0x6d,0x56,0xd0,0xd5,0xc0,0x50,0xcd,0xd6,0xcd,0x3b,0x57,0x03,0xbb,0x6d,0x68,0xf7,0x9a,0x48,0xef,0xc3,0xf3,0x3f,0x72,0xa6,0x3c,0xcc,0x8a,0x7b,0x31,0xd7,0xc0,0x68,0x67,0xb3,0xc1,0x55,0xf1,0xe5,0x25,0xb6,0x94,0x91,0x7b,0x7b,0x99,0xa7,0xf3,0x7b,0x41,0x00,0x26,0x6b,0x6d,0xdc,0xbd,0x2c,0xc2,0xf4,0x52,0xcd,0xdd,0x14,0x5e,0x44,0x51}, + {0x51,0x49,0x14,0x3b,0x4b,0x2b,0x50,0x57,0xb3,0xbc,0x4b,0x44,0x6b,0xff,0x67,0x8e,0xdb,0x85,0x63,0x16,0x27,0x69,0xbd,0xb8,0xc8,0x95,0x92,0xe3,0x31,0x6f,0x18,0x13,0x55,0xa4,0xbe,0x2b,0xab,0x47,0x31,0x89,0x29,0x91,0x07,0x92,0x4f,0xa2,0x53,0x8c,0xa7,0xf7,0x30,0xbe,0x48,0xf9,0x49,0x4b,0x3d,0xd4,0x4f,0x6e,0x08,0x90,0xe9,0x12,0x2e,0xbb,0xdf,0x7f,0xb3,0x96,0x0c,0xf1,0xf9,0xea,0x1c,0x12,0x5e,0x93,0x9a,0x9f,0x3f,0x98,0x5b,0x3a,0xc4,0x36,0x11,0xdf,0xaf,0x99,0x3e,0x5d,0xf0,0xe3,0xb2,0x77}, + {0xde,0xc4,0x2e,0x9c,0xc5,0xa9,0x6f,0x29,0xcb,0xf3,0x84,0x4f,0xbf,0x61,0x8b,0xbc,0x08,0xf9,0xa8,0x17,0xd9,0x06,0x77,0x1c,0x5d,0x25,0xd3,0x7a,0xfc,0x95,0xb7,0x63,0xa4,0xb0,0xdd,0x12,0x9c,0x63,0x98,0xd5,0x6b,0x86,0x24,0xc0,0x30,0x9f,0xd1,0xa5,0x60,0xe4,0xfc,0x58,0x03,0x2f,0x7c,0xd1,0x8a,0x5e,0x09,0x2e,0x15,0x95,0xa1,0x07,0xc8,0x5f,0x9e,0x38,0x02,0x8f,0x36,0xa8,0x3b,0xe4,0x8d,0xcf,0x02,0x3b,0x43,0x90,0x43,0x26,0x41,0xc5,0x5d,0xfd,0xa1,0xaf,0x37,0x01,0x2f,0x03,0x3d,0xe8,0x8f,0x3e}, + {0x94,0xa2,0x70,0x05,0xb9,0x15,0x8b,0x2f,0x49,0x45,0x08,0x67,0x70,0x42,0xf2,0x94,0x84,0xfd,0xbb,0x61,0xe1,0x5a,0x1c,0xde,0x07,0x40,0xac,0x7f,0x79,0x3b,0xba,0x75,0x3c,0xd1,0xef,0xe8,0x8d,0x4c,0x70,0x08,0x31,0x37,0xe0,0x33,0x8e,0x1a,0xc5,0xdf,0xe3,0xcd,0x60,0x12,0xa5,0x5d,0x9d,0xa5,0x86,0x8c,0x25,0xa6,0x99,0x08,0xd6,0x22,0x96,0xd1,0xcd,0x70,0xc0,0xdb,0x39,0x62,0x9a,0x8a,0x7d,0x6c,0x8b,0x8a,0xfe,0x60,0x60,0x12,0x40,0xeb,0xbc,0x47,0x88,0xb3,0x5e,0x9e,0x77,0x87,0x7b,0xd0,0x04,0x09}, + {0x9c,0x91,0xba,0xdd,0xd4,0x1f,0xce,0xb4,0xaa,0x8d,0x4c,0xc7,0x3e,0xdb,0x31,0xcf,0x51,0xcc,0x86,0xad,0x63,0xcc,0x63,0x2c,0x07,0xde,0x1d,0xbc,0x3f,0x14,0xe2,0x43,0xb9,0x40,0xf9,0x48,0x66,0x2d,0x32,0xf4,0x39,0x0c,0x2d,0xbd,0x0c,0x2f,0x95,0x06,0x31,0xf9,0x81,0xa0,0xad,0x97,0x76,0x16,0x6c,0x2a,0xf7,0xba,0xce,0xaa,0x40,0x62,0xa0,0x95,0xa2,0x5b,0x9c,0x74,0x34,0xf8,0x5a,0xd2,0x37,0xca,0x5b,0x7c,0x94,0xd6,0x6a,0x31,0xc9,0xe7,0xa7,0x3b,0xf1,0x66,0xac,0x0c,0xb4,0x8d,0x23,0xaf,0xbd,0x56}, + {0xeb,0x33,0x35,0xf5,0xe3,0xb9,0x2a,0x36,0x40,0x3d,0xb9,0x6e,0xd5,0x68,0x85,0x33,0x72,0x55,0x5a,0x1d,0x52,0x14,0x0e,0x9e,0x18,0x13,0x74,0x83,0x6d,0xa8,0x24,0x1d,0xb2,0x3b,0x9d,0xc1,0x6c,0xd3,0x10,0x13,0xb9,0x86,0x23,0x62,0xb7,0x6b,0x2a,0x06,0x5c,0x4f,0xa1,0xd7,0x91,0x85,0x9b,0x7c,0x54,0x57,0x1e,0x7e,0x50,0x31,0xaa,0x03,0x1f,0xce,0xd4,0xff,0x48,0x76,0xec,0xf4,0x1c,0x8c,0xac,0x54,0xf0,0xea,0x45,0xe0,0x7c,0x35,0x09,0x1d,0x82,0x25,0xd2,0x88,0x59,0x48,0xeb,0x9a,0xdc,0x61,0xb2,0x43}, + {0xbb,0x79,0xbb,0x88,0x19,0x1e,0x5b,0xe5,0x9d,0x35,0x7a,0xc1,0x7d,0xd0,0x9e,0xa0,0x33,0xea,0x3d,0x60,0xe2,0x2e,0x2c,0xb0,0xc2,0x6b,0x27,0x5b,0xcf,0x55,0x60,0x32,0x64,0x13,0x95,0x6c,0x8b,0x3d,0x51,0x19,0x7b,0xf4,0x0b,0x00,0x26,0x71,0xfe,0x94,0x67,0x95,0x4f,0xd5,0xdd,0x10,0x8d,0x02,0x64,0x09,0x94,0x42,0xe2,0xd5,0xb4,0x02,0xf2,0x8d,0xd1,0x28,0xcb,0x55,0xa1,0xb4,0x08,0xe5,0x6c,0x18,0x46,0x46,0xcc,0xea,0x89,0x43,0x82,0x6c,0x93,0xf4,0x9c,0xc4,0x10,0x34,0x5d,0xae,0x09,0xc8,0xa6,0x27}, + {0x88,0xb1,0x0d,0x1f,0xcd,0xeb,0xa6,0x8b,0xe8,0x5b,0x5a,0x67,0x3a,0xd7,0xd3,0x37,0x5a,0x58,0xf5,0x15,0xa3,0xdf,0x2e,0xf2,0x7e,0xa1,0x60,0xff,0x74,0x71,0xb6,0x2c,0x54,0x69,0x3d,0xc4,0x0a,0x27,0x2c,0xcd,0xb2,0xca,0x66,0x6a,0x57,0x3e,0x4a,0xdd,0x6c,0x03,0xd7,0x69,0x24,0x59,0xfa,0x79,0x99,0x25,0x8c,0x3d,0x60,0x03,0x15,0x22,0xd0,0xe1,0x0b,0x39,0xf9,0xcd,0xee,0x59,0xf1,0xe3,0x8c,0x72,0x44,0x20,0x42,0xa9,0xf4,0xf0,0x94,0x7a,0x66,0x1c,0x89,0x82,0x36,0xf4,0x90,0x38,0xb7,0xf4,0x1d,0x7b}, + {0x24,0xa2,0xb2,0xb3,0xe0,0xf2,0x92,0xe4,0x60,0x11,0x55,0x2b,0x06,0x9e,0x6c,0x7c,0x0e,0x7b,0x7f,0x0d,0xe2,0x8f,0xeb,0x15,0x92,0x59,0xfc,0x58,0x26,0xef,0xfc,0x61,0x8c,0xf5,0xf8,0x07,0x18,0x22,0x2e,0x5f,0xd4,0x09,0x94,0xd4,0x9f,0x5c,0x55,0xe3,0x30,0xa6,0xb6,0x1f,0x8d,0xa8,0xaa,0xb2,0x3d,0xe0,0x52,0xd3,0x45,0x82,0x69,0x68,0x7a,0x18,0x18,0x2a,0x85,0x5d,0xb1,0xdb,0xd7,0xac,0xdd,0x86,0xd3,0xaa,0xe4,0xf3,0x82,0xc4,0xf6,0x0f,0x81,0xe2,0xba,0x44,0xcf,0x01,0xaf,0x3d,0x47,0x4c,0xcf,0x46}, + {0xf9,0xe5,0xc4,0x9e,0xed,0x25,0x65,0x42,0x03,0x33,0x90,0x16,0x01,0xda,0x5e,0x0e,0xdc,0xca,0xe5,0xcb,0xf2,0xa7,0xb1,0x72,0x40,0x5f,0xeb,0x14,0xcd,0x7b,0x38,0x29,0x40,0x81,0x49,0xf1,0xa7,0x6e,0x3c,0x21,0x54,0x48,0x2b,0x39,0xf8,0x7e,0x1e,0x7c,0xba,0xce,0x29,0x56,0x8c,0xc3,0x88,0x24,0xbb,0xc5,0x8c,0x0d,0xe5,0xaa,0x65,0x10,0x57,0x0d,0x20,0xdf,0x25,0x45,0x2c,0x1c,0x4a,0x67,0xca,0xbf,0xd6,0x2d,0x3b,0x5c,0x30,0x40,0x83,0xe1,0xb1,0xe7,0x07,0x0a,0x16,0xe7,0x1c,0x4f,0xe6,0x98,0xa1,0x69}, + {0xbc,0x78,0x1a,0xd9,0xe0,0xb2,0x62,0x90,0x67,0x96,0x50,0xc8,0x9c,0x88,0xc9,0x47,0xb8,0x70,0x50,0x40,0x66,0x4a,0xf5,0x9d,0xbf,0xa1,0x93,0x24,0xa9,0xe6,0x69,0x73,0xed,0xca,0xc5,0xdc,0x34,0x44,0x01,0xe1,0x33,0xfb,0x84,0x3c,0x96,0x5d,0xed,0x47,0xe7,0xa0,0x86,0xed,0x76,0x95,0x01,0x70,0xe4,0xf9,0x67,0xd2,0x7b,0x69,0xb2,0x25,0x64,0x68,0x98,0x13,0xfb,0x3f,0x67,0x9d,0xb8,0xc7,0x5d,0x41,0xd9,0xfb,0xa5,0x3c,0x5e,0x3b,0x27,0xdf,0x3b,0xcc,0x4e,0xe0,0xd2,0x4c,0x4e,0xb5,0x3d,0x68,0x20,0x14}, + {0x97,0xd1,0x9d,0x24,0x1e,0xbd,0x78,0xb4,0x02,0xc1,0x58,0x5e,0x00,0x35,0x0c,0x62,0x5c,0xac,0xba,0xcc,0x2f,0xd3,0x02,0xfb,0x2d,0xa7,0x08,0xf5,0xeb,0x3b,0xb6,0x60,0xd0,0x5a,0xcc,0xc1,0x6f,0xbb,0xee,0x34,0x8b,0xac,0x46,0x96,0xe9,0x0c,0x1b,0x6a,0x53,0xde,0x6b,0xa6,0x49,0xda,0xb0,0xd3,0xc1,0x81,0xd0,0x61,0x41,0x3b,0xe8,0x31,0x4f,0x2b,0x06,0x9e,0x12,0xc7,0xe8,0x97,0xd8,0x0a,0x32,0x29,0x4f,0x8f,0xe4,0x49,0x3f,0x68,0x18,0x6f,0x4b,0xe1,0xec,0x5b,0x17,0x03,0x55,0x2d,0xb6,0x1e,0xcf,0x55}, + {0x58,0x3d,0xc2,0x65,0x10,0x10,0x79,0x58,0x9c,0x81,0x94,0x50,0x6d,0x08,0x9d,0x8b,0xa7,0x5f,0xc5,0x12,0xa9,0x2f,0x40,0xe2,0xd4,0x91,0x08,0x57,0x64,0x65,0x9a,0x66,0x52,0x8c,0xf5,0x7d,0xe3,0xb5,0x76,0x30,0x36,0xcc,0x99,0xe7,0xdd,0xb9,0x3a,0xd7,0x20,0xee,0x13,0x49,0xe3,0x1c,0x83,0xbd,0x33,0x01,0xba,0x62,0xaa,0xfb,0x56,0x1a,0xec,0xc9,0x9d,0x5c,0x50,0x6b,0x3e,0x94,0x1a,0x37,0x7c,0xa7,0xbb,0x57,0x25,0x30,0x51,0x76,0x34,0x41,0x56,0xae,0x73,0x98,0x5c,0x8a,0xc5,0x99,0x67,0x83,0xc4,0x13}, + {0xb9,0xe1,0xb3,0x5a,0x46,0x5d,0x3a,0x42,0x61,0x3f,0xf1,0xc7,0x87,0xc1,0x13,0xfc,0xb6,0xb9,0xb5,0xec,0x64,0x36,0xf8,0x19,0x07,0xb6,0x37,0xa6,0x93,0x0c,0xf8,0x66,0x80,0xd0,0x8b,0x5d,0x6a,0xfb,0xdc,0xc4,0x42,0x48,0x1a,0x57,0xec,0xc4,0xeb,0xde,0x65,0x53,0xe5,0xb8,0x83,0xe8,0xb2,0xd4,0x27,0xb8,0xe5,0xc8,0x7d,0xc8,0xbd,0x50,0x11,0xe1,0xdf,0x6e,0x83,0x37,0x6d,0x60,0xd9,0xab,0x11,0xf0,0x15,0x3e,0x35,0x32,0x96,0x3b,0xb7,0x25,0xc3,0x3a,0xb0,0x64,0xae,0xd5,0x5f,0x72,0x44,0x64,0xd5,0x1d}, + {0x7d,0x12,0x62,0x33,0xf8,0x7f,0xa4,0x8f,0x15,0x7c,0xcd,0x71,0xc4,0x6a,0x9f,0xbc,0x8b,0x0c,0x22,0x49,0x43,0x45,0x71,0x6e,0x2e,0x73,0x9f,0x21,0x12,0x59,0x64,0x0e,0x9a,0xc8,0xba,0x08,0x00,0xe6,0x97,0xc2,0xe0,0xc3,0xe1,0xea,0x11,0xea,0x4c,0x7d,0x7c,0x97,0xe7,0x9f,0xe1,0x8b,0xe3,0xf3,0xcd,0x05,0xa3,0x63,0x0f,0x45,0x3a,0x3a,0x27,0x46,0x39,0xd8,0x31,0x2f,0x8f,0x07,0x10,0xa5,0x94,0xde,0x83,0x31,0x9d,0x38,0x80,0x6f,0x99,0x17,0x6d,0x6c,0xe3,0xd1,0x7b,0xa8,0xa9,0x93,0x93,0x8d,0x8c,0x31}, + {0x19,0xfe,0xff,0x2a,0x03,0x5d,0x74,0xf2,0x66,0xdb,0x24,0x7f,0x49,0x3c,0x9f,0x0c,0xef,0x98,0x85,0xba,0xe3,0xd3,0x98,0xbc,0x14,0x53,0x1d,0x9a,0x67,0x7c,0x4c,0x22,0x98,0xd3,0x1d,0xab,0x29,0x9e,0x66,0x5d,0x3b,0x9e,0x2d,0x34,0x58,0x16,0x92,0xfc,0xcd,0x73,0x59,0xf3,0xfd,0x1d,0x85,0x55,0xf6,0x0a,0x95,0x25,0xc3,0x41,0x9a,0x50,0xe9,0x25,0xf9,0xa6,0xdc,0x6e,0xc0,0xbd,0x33,0x1f,0x1b,0x64,0xf4,0xf3,0x3e,0x79,0x89,0x3e,0x83,0x9d,0x80,0x12,0xec,0x82,0x89,0x13,0xa1,0x28,0x23,0xf0,0xbf,0x05}, + {0x0b,0xe0,0xca,0x23,0x70,0x13,0x32,0x36,0x59,0xcf,0xac,0xd1,0x0a,0xcf,0x4a,0x54,0x88,0x1c,0x1a,0xd2,0x49,0x10,0x74,0x96,0xa7,0x44,0x2a,0xfa,0xc3,0x8c,0x0b,0x78,0xe4,0x12,0xc5,0x0d,0xdd,0xa0,0x81,0x68,0xfe,0xfa,0xa5,0x44,0xc8,0x0d,0xe7,0x4f,0x40,0x52,0x4a,0x8f,0x6b,0x8e,0x74,0x1f,0xea,0xa3,0x01,0xee,0xcd,0x77,0x62,0x57,0x5f,0x30,0x4f,0x23,0xbc,0x8a,0xf3,0x1e,0x08,0xde,0x05,0x14,0xbd,0x7f,0x57,0x9a,0x0d,0x2a,0xe6,0x34,0x14,0xa5,0x82,0x5e,0xa1,0xb7,0x71,0x62,0x72,0x18,0xf4,0x5f}, + {0x9d,0xdb,0x89,0x17,0x0c,0x08,0x8e,0x39,0xf5,0x78,0xe7,0xf3,0x25,0x20,0x60,0xa7,0x5d,0x03,0xbd,0x06,0x4c,0x89,0x98,0xfa,0xbe,0x66,0xa9,0x25,0xdc,0x03,0x6a,0x10,0x40,0x95,0xb6,0x13,0xe8,0x47,0xdb,0xe5,0xe1,0x10,0x26,0x43,0x3b,0x2a,0x5d,0xf3,0x76,0x12,0x78,0x38,0xe9,0x26,0x1f,0xac,0x69,0xcb,0xa0,0xa0,0x8c,0xdb,0xd4,0x29,0xd0,0x53,0x33,0x33,0xaf,0x0a,0xad,0xd9,0xe5,0x09,0xd3,0xac,0xa5,0x9d,0x66,0x38,0xf0,0xf7,0x88,0xc8,0x8a,0x65,0x57,0x3c,0xfa,0xbe,0x2c,0x05,0x51,0x8a,0xb3,0x4a}, + {0x93,0xd5,0x68,0x67,0x25,0x2b,0x7c,0xda,0x13,0xca,0x22,0x44,0x57,0xc0,0xc1,0x98,0x1d,0xce,0x0a,0xca,0xd5,0x0b,0xa8,0xf1,0x90,0xa6,0x88,0xc0,0xad,0xd1,0xcd,0x29,0x9c,0xc0,0xdd,0x5f,0xef,0xd1,0xcf,0xd6,0xce,0x5d,0x57,0xf7,0xfd,0x3e,0x2b,0xe8,0xc2,0x34,0x16,0x20,0x5d,0x6b,0xd5,0x25,0x9b,0x2b,0xed,0x04,0xbb,0xc6,0x41,0x30,0x48,0xe1,0x56,0xd9,0xf9,0xf2,0xf2,0x0f,0x2e,0x6b,0x35,0x9f,0x75,0x97,0xe7,0xad,0x5c,0x02,0x6c,0x5f,0xbb,0x98,0x46,0x1a,0x7b,0x9a,0x04,0x14,0x68,0xbd,0x4b,0x10}, + {0x67,0xed,0xf1,0x68,0x31,0xfd,0xf0,0x51,0xc2,0x3b,0x6f,0xd8,0xcd,0x1d,0x81,0x2c,0xde,0xf2,0xd2,0x04,0x43,0x5c,0xdc,0x44,0x49,0x71,0x2a,0x09,0x57,0xcc,0xe8,0x5b,0x63,0xf1,0x7f,0xd6,0x5f,0x9a,0x5d,0xa9,0x81,0x56,0xc7,0x4c,0x9d,0xe6,0x2b,0xe9,0x57,0xf2,0x20,0xde,0x4c,0x02,0xf8,0xb7,0xf5,0x2d,0x07,0xfb,0x20,0x2a,0x4f,0x20,0x79,0xb0,0xeb,0x30,0x3d,0x3b,0x14,0xc8,0x30,0x2e,0x65,0xbd,0x5a,0x15,0x89,0x75,0x31,0x5c,0x6d,0x8f,0x31,0x3c,0x3c,0x65,0x1f,0x16,0x79,0xc2,0x17,0xfb,0x70,0x25}, + {0x75,0x15,0xb6,0x2c,0x7f,0x36,0xfa,0x3e,0x6c,0x02,0xd6,0x1c,0x76,0x6f,0xf9,0xf5,0x62,0x25,0xb5,0x65,0x2a,0x14,0xc7,0xe8,0xcd,0x0a,0x03,0x53,0xea,0x65,0xcb,0x3d,0x5a,0x24,0xb8,0x0b,0x55,0xa9,0x2e,0x19,0xd1,0x50,0x90,0x8f,0xa8,0xfb,0xe6,0xc8,0x35,0xc9,0xa4,0x88,0x2d,0xea,0x86,0x79,0x68,0x86,0x01,0xde,0x91,0x5f,0x1c,0x24,0xaa,0x6c,0xde,0x40,0x29,0x17,0xd8,0x28,0x3a,0x73,0xd9,0x22,0xf0,0x2c,0xbf,0x8f,0xd1,0x01,0x5b,0x23,0xdd,0xfc,0xd7,0x16,0xe5,0xf0,0xcd,0x5f,0xdd,0x0e,0x42,0x08}, + {0x4a,0xfa,0x62,0x83,0xab,0x20,0xff,0xcd,0x6e,0x3e,0x1a,0xe2,0xd4,0x18,0xe1,0x57,0x2b,0xe6,0x39,0xfc,0x17,0x96,0x17,0xe3,0xfd,0x69,0x17,0xbc,0xef,0x53,0x9a,0x0d,0xce,0x10,0xf4,0x04,0x4e,0xc3,0x58,0x03,0x85,0x06,0x6e,0x27,0x5a,0x5b,0x13,0xb6,0x21,0x15,0xb9,0xeb,0xc7,0x70,0x96,0x5d,0x9c,0x88,0xdb,0x21,0xf3,0x54,0xd6,0x04,0xd5,0xb5,0xbd,0xdd,0x16,0xc1,0x7d,0x5e,0x2d,0xdd,0xa5,0x8d,0xb6,0xde,0x54,0x29,0x92,0xa2,0x34,0x33,0x17,0x08,0xb6,0x1c,0xd7,0x1a,0x99,0x18,0x26,0x4f,0x7a,0x4a}, + {0x95,0x5f,0xb1,0x5f,0x02,0x18,0xa7,0xf4,0x8f,0x1b,0x5c,0x6b,0x34,0x5f,0xf6,0x3d,0x12,0x11,0xe0,0x00,0x85,0xf0,0xfc,0xcd,0x48,0x18,0xd3,0xdd,0x4c,0x0c,0xb5,0x11,0x4b,0x2a,0x37,0xaf,0x91,0xb2,0xc3,0x24,0xf2,0x47,0x81,0x71,0x70,0x82,0xda,0x93,0xf2,0x9e,0x89,0x86,0x64,0x85,0x84,0xdd,0x33,0xee,0xe0,0x23,0x42,0x31,0x96,0x4a,0xd6,0xff,0xa4,0x08,0x44,0x27,0xe8,0xa6,0xd9,0x76,0x15,0x9c,0x7e,0x17,0x8e,0x73,0xf2,0xb3,0x02,0x3d,0xb6,0x48,0x33,0x77,0x51,0xcc,0x6b,0xce,0x4d,0xce,0x4b,0x4f}, + {0x84,0x25,0x24,0xe2,0x5a,0xce,0x1f,0xa7,0x9e,0x8a,0xf5,0x92,0x56,0x72,0xea,0x26,0xf4,0x3c,0xea,0x1c,0xd7,0x09,0x1a,0xd2,0xe6,0x01,0x1c,0xb7,0x14,0xdd,0xfc,0x73,0x6f,0x0b,0x9d,0xc4,0x6e,0x61,0xe2,0x30,0x17,0x23,0xec,0xca,0x8f,0x71,0x56,0xe4,0xa6,0x4f,0x6b,0xf2,0x9b,0x40,0xeb,0x48,0x37,0x5f,0x59,0x61,0xe5,0xce,0x42,0x30,0x41,0xac,0x9b,0x44,0x79,0x70,0x7e,0x42,0x0a,0x31,0xe2,0xbc,0x6d,0xe3,0x5a,0x85,0x7c,0x1a,0x84,0x5f,0x21,0x76,0xae,0x4c,0xd6,0xe1,0x9c,0x9a,0x0c,0x74,0x9e,0x38}, + {0xce,0xb9,0xdc,0x34,0xae,0xb3,0xfc,0x64,0xad,0xd0,0x48,0xe3,0x23,0x03,0x50,0x97,0x1b,0x38,0xc6,0x62,0x7d,0xf0,0xb3,0x45,0x88,0x67,0x5a,0x46,0x79,0x53,0x54,0x61,0x28,0xac,0x0e,0x57,0xf6,0x78,0xbd,0xc9,0xe1,0x9c,0x91,0x27,0x32,0x0b,0x5b,0xe5,0xed,0x91,0x9b,0xa1,0xab,0x3e,0xfc,0x65,0x90,0x36,0x26,0xd6,0xe5,0x25,0xc4,0x25,0x6e,0xde,0xd7,0xf1,0xa6,0x06,0x3e,0x3f,0x08,0x23,0x06,0x8e,0x27,0x76,0xf9,0x3e,0x77,0x6c,0x8a,0x4e,0x26,0xf6,0x14,0x8c,0x59,0x47,0x48,0x15,0x89,0xa0,0x39,0x65}, + {0x73,0xf7,0xd2,0xc3,0x74,0x1f,0xd2,0xe9,0x45,0x68,0xc4,0x25,0x41,0x54,0x50,0xc1,0x33,0x9e,0xb9,0xf9,0xe8,0x5c,0x4e,0x62,0x6c,0x18,0xcd,0xc5,0xaa,0xe4,0xc5,0x11,0x19,0x4a,0xbb,0x14,0xd4,0xdb,0xc4,0xdd,0x8e,0x4f,0x42,0x98,0x3c,0xbc,0xb2,0x19,0x69,0x71,0xca,0x36,0xd7,0x9f,0xa8,0x48,0x90,0xbd,0x19,0xf0,0x0e,0x32,0x65,0x0f,0xc6,0xe0,0xfd,0xca,0xb1,0xd1,0x86,0xd4,0x81,0x51,0x3b,0x16,0xe3,0xe6,0x3f,0x4f,0x9a,0x93,0xf2,0xfa,0x0d,0xaf,0xa8,0x59,0x2a,0x07,0x33,0xec,0xbd,0xc7,0xab,0x4c}, + {0x2e,0x0a,0x9c,0x08,0x24,0x96,0x9e,0x23,0x38,0x47,0xfe,0x3a,0xc0,0xc4,0x48,0xc7,0x2a,0xa1,0x4f,0x76,0x2a,0xed,0xdb,0x17,0x82,0x85,0x1c,0x32,0xf0,0x93,0x9b,0x63,0x89,0xd2,0x78,0x3f,0x8f,0x78,0x8f,0xc0,0x9f,0x4d,0x40,0xa1,0x2c,0xa7,0x30,0xfe,0x9d,0xcc,0x65,0xcf,0xfc,0x8b,0x77,0xf2,0x21,0x20,0xcb,0x5a,0x16,0x98,0xe4,0x7e,0xc3,0xa1,0x11,0x91,0xe3,0x08,0xd5,0x7b,0x89,0x74,0x90,0x80,0xd4,0x90,0x2b,0x2b,0x19,0xfd,0x72,0xae,0xc2,0xae,0xd2,0xe7,0xa6,0x02,0xb6,0x85,0x3c,0x49,0xdf,0x0e}, + {0x68,0x5a,0x9b,0x59,0x58,0x81,0xcc,0xae,0x0e,0xe2,0xad,0xeb,0x0f,0x4f,0x57,0xea,0x07,0x7f,0xb6,0x22,0x74,0x1d,0xe4,0x4f,0xb4,0x4f,0x9d,0x01,0xe3,0x92,0x3b,0x40,0x13,0x41,0x76,0x84,0xd2,0xc4,0x67,0x67,0x35,0xf8,0xf5,0xf7,0x3f,0x40,0x90,0xa0,0xde,0xbe,0xe6,0xca,0xfa,0xcf,0x8f,0x1c,0x69,0xa3,0xdf,0xd1,0x54,0x0c,0xc0,0x04,0xf8,0x5c,0x46,0x8b,0x81,0x2f,0xc2,0x4d,0xf8,0xef,0x80,0x14,0x5a,0xf3,0xa0,0x71,0x57,0xd6,0xc7,0x04,0xad,0xbf,0xe8,0xae,0xf4,0x76,0x61,0xb2,0x2a,0xb1,0x5b,0x35}, + {0xf4,0xbb,0x93,0x74,0xcc,0x64,0x1e,0xa7,0xc3,0xb0,0xa3,0xec,0xd9,0x84,0xbd,0xe5,0x85,0xe7,0x05,0xfa,0x0c,0xc5,0x6b,0x0a,0x12,0xc3,0x2e,0x18,0x32,0x81,0x9b,0x0f,0x18,0x73,0x8c,0x5a,0xc7,0xda,0x01,0xa3,0x11,0xaa,0xce,0xb3,0x9d,0x03,0x90,0xed,0x2d,0x3f,0xae,0x3b,0xbf,0x7c,0x07,0x6f,0x8e,0xad,0x52,0xe0,0xf8,0xea,0x18,0x75,0x32,0x6c,0x7f,0x1b,0xc4,0x59,0x88,0xa4,0x98,0x32,0x38,0xf4,0xbc,0x60,0x2d,0x0f,0xd9,0xd1,0xb1,0xc9,0x29,0xa9,0x15,0x18,0xc4,0x55,0x17,0xbb,0x1b,0x87,0xc3,0x47}, + {0x48,0x4f,0xec,0x71,0x97,0x53,0x44,0x51,0x6e,0x5d,0x8c,0xc9,0x7d,0xb1,0x05,0xf8,0x6b,0xc6,0xc3,0x47,0x1a,0xc1,0x62,0xf7,0xdc,0x99,0x46,0x76,0x85,0x9b,0xb8,0x00,0xb0,0x66,0x50,0xc8,0x50,0x5d,0xe6,0xfb,0xb0,0x99,0xa2,0xb3,0xb0,0xc4,0xec,0x62,0xe0,0xe8,0x1a,0x44,0xea,0x54,0x37,0xe5,0x5f,0x8d,0xd4,0xe8,0x2c,0xa0,0xfe,0x08,0xd0,0xea,0xde,0x68,0x76,0xdd,0x4d,0x82,0x23,0x5d,0x68,0x4b,0x20,0x45,0x64,0xc8,0x65,0xd6,0x89,0x5d,0xcd,0xcf,0x14,0xb5,0x37,0xd5,0x75,0x4f,0xa7,0x29,0x38,0x47}, + {0x18,0xc4,0x79,0x46,0x75,0xda,0xd2,0x82,0xf0,0x8d,0x61,0xb2,0xd8,0xd7,0x3b,0xe6,0x0a,0xeb,0x47,0xac,0x24,0xef,0x5e,0x35,0xb4,0xc6,0x33,0x48,0x4c,0x68,0x78,0x20,0xc9,0x02,0x39,0xad,0x3a,0x53,0xd9,0x23,0x8f,0x58,0x03,0xef,0xce,0xdd,0xc2,0x64,0xb4,0x2f,0xe1,0xcf,0x90,0x73,0x25,0x15,0x90,0xd3,0xe4,0x44,0x4d,0x8b,0x66,0x6c,0x0c,0x82,0x78,0x7a,0x21,0xcf,0x48,0x3b,0x97,0x3e,0x27,0x81,0xb2,0x0a,0x6a,0xf7,0x7b,0xed,0x8e,0x8c,0xa7,0x65,0x6c,0xa9,0x3f,0x43,0x8a,0x4f,0x05,0xa6,0x11,0x74}, + {0x6d,0xc8,0x9d,0xb9,0x32,0x9d,0x65,0x4d,0x15,0xf1,0x3a,0x60,0x75,0xdc,0x4c,0x04,0x88,0xe4,0xc2,0xdc,0x2c,0x71,0x4c,0xb3,0xff,0x34,0x81,0xfb,0x74,0x65,0x13,0x7c,0xb4,0x75,0xb1,0x18,0x3d,0xe5,0x9a,0x57,0x02,0xa1,0x92,0xf3,0x59,0x31,0x71,0x68,0xf5,0x35,0xef,0x1e,0xba,0xec,0x55,0x84,0x8f,0x39,0x8c,0x45,0x72,0xa8,0xc9,0x1e,0x9b,0x50,0xa2,0x00,0xd4,0xa4,0xe6,0xb8,0xb4,0x82,0xc8,0x0b,0x02,0xd7,0x81,0x9b,0x61,0x75,0x95,0xf1,0x9b,0xcc,0xe7,0x57,0x60,0x64,0xcd,0xc7,0xa5,0x88,0xdd,0x3a}, + {0xf2,0xdc,0x35,0xb6,0x70,0x57,0x89,0xab,0xbc,0x1f,0x6c,0xf6,0x6c,0xef,0xdf,0x02,0x87,0xd1,0xb6,0xbe,0x68,0x02,0x53,0x85,0x74,0x9e,0x87,0xcc,0xfc,0x29,0x99,0x24,0x46,0x30,0x39,0x59,0xd4,0x98,0xc2,0x85,0xec,0x59,0xf6,0x5f,0x98,0x35,0x7e,0x8f,0x3a,0x6e,0xf6,0xf2,0x2a,0xa2,0x2c,0x1d,0x20,0xa7,0x06,0xa4,0x31,0x11,0xba,0x61,0x29,0x90,0x95,0x16,0xf1,0xa0,0xd0,0xa3,0x89,0xbd,0x7e,0xba,0x6c,0x6b,0x3b,0x02,0x07,0x33,0x78,0x26,0x3e,0x5a,0xf1,0x7b,0xe7,0xec,0xd8,0xbb,0x0c,0x31,0x20,0x56}, + {0x43,0xd6,0x34,0x49,0x43,0x93,0x89,0x52,0xf5,0x22,0x12,0xa5,0x06,0xf8,0xdb,0xb9,0x22,0x1c,0xf4,0xc3,0x8f,0x87,0x6d,0x8f,0x30,0x97,0x9d,0x4d,0x2a,0x6a,0x67,0x37,0xd6,0x85,0xe2,0x77,0xf4,0xb5,0x46,0x66,0x93,0x61,0x8f,0x6c,0x67,0xff,0xe8,0x40,0xdd,0x94,0xb5,0xab,0x11,0x73,0xec,0xa6,0x4d,0xec,0x8c,0x65,0xf3,0x46,0xc8,0x7e,0xc7,0x2e,0xa2,0x1d,0x3f,0x8f,0x5e,0x9b,0x13,0xcd,0x01,0x6c,0x77,0x1d,0x0f,0x13,0xb8,0x9f,0x98,0xa2,0xcf,0x8f,0x4c,0x21,0xd5,0x9d,0x9b,0x39,0x23,0xf7,0xaa,0x6d}, + {0x47,0xbe,0x3d,0xeb,0x62,0x75,0x3a,0x5f,0xb8,0xa0,0xbd,0x8e,0x54,0x38,0xea,0xf7,0x99,0x72,0x74,0x45,0x31,0xe5,0xc3,0x00,0x51,0xd5,0x27,0x16,0xe7,0xe9,0x04,0x13,0xa2,0x8e,0xad,0xac,0xbf,0x04,0x3b,0x58,0x84,0xe8,0x8b,0x14,0xe8,0x43,0xb7,0x29,0xdb,0xc5,0x10,0x08,0x3b,0x58,0x1e,0x2b,0xaa,0xbb,0xb3,0x8e,0xe5,0x49,0x54,0x2b,0xfe,0x9c,0xdc,0x6a,0xd2,0x14,0x98,0x78,0x0b,0xdd,0x48,0x8b,0x3f,0xab,0x1b,0x3c,0x0a,0xc6,0x79,0xf9,0xff,0xe1,0x0f,0xda,0x93,0xd6,0x2d,0x7c,0x2d,0xde,0x68,0x44}, + {0x9e,0x46,0x19,0x94,0x5e,0x35,0xbb,0x51,0x54,0xc7,0xdd,0x23,0x4c,0xdc,0xe6,0x33,0x62,0x99,0x7f,0x44,0xd6,0xb6,0xa5,0x93,0x63,0xbd,0x44,0xfb,0x6f,0x7c,0xce,0x6c,0xce,0x07,0x63,0xf8,0xc6,0xd8,0x9a,0x4b,0x28,0x0c,0x5d,0x43,0x31,0x35,0x11,0x21,0x2c,0x77,0x7a,0x65,0xc5,0x66,0xa8,0xd4,0x52,0x73,0x24,0x63,0x7e,0x42,0xa6,0x5d,0xca,0x22,0xac,0xde,0x88,0xc6,0x94,0x1a,0xf8,0x1f,0xae,0xbb,0xf7,0x6e,0x06,0xb9,0x0f,0x58,0x59,0x8d,0x38,0x8c,0xad,0x88,0xa8,0x2c,0x9f,0xe7,0xbf,0x9a,0xf2,0x58}, + {0x68,0x3e,0xe7,0x8d,0xab,0xcf,0x0e,0xe9,0xa5,0x76,0x7e,0x37,0x9f,0x6f,0x03,0x54,0x82,0x59,0x01,0xbe,0x0b,0x5b,0x49,0xf0,0x36,0x1e,0xf4,0xa7,0xc4,0x29,0x76,0x57,0xf6,0xcd,0x0e,0x71,0xbf,0x64,0x5a,0x4b,0x3c,0x29,0x2c,0x46,0x38,0xe5,0x4c,0xb1,0xb9,0x3a,0x0b,0xd5,0x56,0xd0,0x43,0x36,0x70,0x48,0x5b,0x18,0x24,0x37,0xf9,0x6a,0x88,0xa8,0xc6,0x09,0x45,0x02,0x20,0x32,0x73,0x89,0x55,0x4b,0x13,0x36,0xe0,0xd2,0x9f,0x28,0x33,0x3c,0x23,0x36,0xe2,0x83,0x8f,0xc1,0xae,0x0c,0xbb,0x25,0x1f,0x70}, + {0xed,0x6c,0x61,0xe4,0xf8,0xb0,0xa8,0xc3,0x7d,0xa8,0x25,0x9e,0x0e,0x66,0x00,0xf7,0x9c,0xa5,0xbc,0xf4,0x1f,0x06,0xe3,0x61,0xe9,0x0b,0xc4,0xbd,0xbf,0x92,0x0c,0x2e,0x13,0xc1,0xbe,0x7c,0xd9,0xf6,0x18,0x9d,0xe4,0xdb,0xbf,0x74,0xe6,0x06,0x4a,0x84,0xd6,0x60,0x4e,0xac,0x22,0xb5,0xf5,0x20,0x51,0x5e,0x95,0x50,0xc0,0x5b,0x0a,0x72,0x35,0x5a,0x80,0x9b,0x43,0x09,0x3f,0x0c,0xfc,0xab,0x42,0x62,0x37,0x8b,0x4e,0xe8,0x46,0x93,0x22,0x5c,0xf3,0x17,0x14,0x69,0xec,0xf0,0x4e,0x14,0xbb,0x9c,0x9b,0x0e}, + {0xad,0x20,0x57,0xfb,0x8f,0xd4,0xba,0xfb,0x0e,0x0d,0xf9,0xdb,0x6b,0x91,0x81,0xee,0xbf,0x43,0x55,0x63,0x52,0x31,0x81,0xd4,0xd8,0x7b,0x33,0x3f,0xeb,0x04,0x11,0x22,0xee,0xbe,0xb1,0x5d,0xd5,0x9b,0xee,0x8d,0xb9,0x3f,0x72,0x0a,0x37,0xab,0xc3,0xc9,0x91,0xd7,0x68,0x1c,0xbf,0xf1,0xa8,0x44,0xde,0x3c,0xfd,0x1c,0x19,0x44,0x6d,0x36,0x14,0x8c,0xbc,0xf2,0x43,0x17,0x3c,0x9e,0x3b,0x6c,0x85,0xb5,0xfc,0x26,0xda,0x2e,0x97,0xfb,0xa7,0x68,0x0e,0x2f,0xb8,0xcc,0x44,0x32,0x59,0xbc,0xe6,0xa4,0x67,0x41}, + {0x00,0x27,0xf6,0x76,0x28,0x9d,0x3b,0x64,0xeb,0x68,0x76,0x0e,0x40,0x9d,0x1d,0x5d,0x84,0x06,0xfc,0x21,0x03,0x43,0x4b,0x1b,0x6a,0x24,0x55,0x22,0x7e,0xbb,0x38,0x79,0xee,0x8f,0xce,0xf8,0x65,0x26,0xbe,0xc2,0x2c,0xd6,0x80,0xe8,0x14,0xff,0x67,0xe9,0xee,0x4e,0x36,0x2f,0x7e,0x6e,0x2e,0xf1,0xf6,0xd2,0x7e,0xcb,0x70,0x33,0xb3,0x34,0xcc,0xd6,0x81,0x86,0xee,0x91,0xc5,0xcd,0x53,0xa7,0x85,0xed,0x9c,0x10,0x02,0xce,0x83,0x88,0x80,0x58,0xc1,0x85,0x74,0xed,0xe4,0x65,0xfe,0x2d,0x6e,0xfc,0x76,0x11}, + {0x9b,0x61,0x9c,0x5b,0xd0,0x6c,0xaf,0xb4,0x80,0x84,0xa5,0xb2,0xf4,0xc9,0xdf,0x2d,0xc4,0x4d,0xe9,0xeb,0x02,0xa5,0x4f,0x3d,0x34,0x5f,0x7d,0x67,0x4c,0x3a,0xfc,0x08,0xb8,0x0e,0x77,0x49,0x89,0xe2,0x90,0xdb,0xa3,0x40,0xf4,0xac,0x2a,0xcc,0xfb,0x98,0x9b,0x87,0xd7,0xde,0xfe,0x4f,0x35,0x21,0xb6,0x06,0x69,0xf2,0x54,0x3e,0x6a,0x1f,0xea,0x34,0x07,0xd3,0x99,0xc1,0xa4,0x60,0xd6,0x5c,0x16,0x31,0xb6,0x85,0xc0,0x40,0x95,0x82,0x59,0xf7,0x23,0x3e,0x33,0xe2,0xd1,0x00,0xb9,0x16,0x01,0xad,0x2f,0x4f}, + {0x54,0x4e,0xae,0x94,0x41,0xb2,0xbe,0x44,0x6c,0xef,0x57,0x18,0x51,0x1c,0x54,0x5f,0x98,0x04,0x8d,0x36,0x2d,0x6b,0x1e,0xa6,0xab,0xf7,0x2e,0x97,0xa4,0x84,0x54,0x44,0x38,0xb6,0x3b,0xb7,0x1d,0xd9,0x2c,0x96,0x08,0x9c,0x12,0xfc,0xaa,0x77,0x05,0xe6,0x89,0x16,0xb6,0xf3,0x39,0x9b,0x61,0x6f,0x81,0xee,0x44,0x29,0x5f,0x99,0x51,0x34,0x7c,0x7d,0xea,0x9f,0xd0,0xfc,0x52,0x91,0xf6,0x5c,0x93,0xb0,0x94,0x6c,0x81,0x4a,0x40,0x5c,0x28,0x47,0xaa,0x9a,0x8e,0x25,0xb7,0x93,0x28,0x04,0xa6,0x9c,0xb8,0x10}, + {0x9c,0x28,0x18,0x97,0x49,0x47,0x59,0x3d,0x26,0x3f,0x53,0x24,0xc5,0xf8,0xeb,0x12,0x15,0xef,0xc3,0x14,0xcb,0xbf,0x62,0x02,0x8e,0x51,0xb7,0x77,0xd5,0x78,0xb8,0x20,0x6e,0xf0,0x45,0x5a,0xbe,0x41,0x39,0x75,0x65,0x5f,0x9c,0x6d,0xed,0xae,0x7c,0xd0,0xb6,0x51,0xff,0x72,0x9c,0x6b,0x77,0x11,0xa9,0x4d,0x0d,0xef,0xd9,0xd1,0xd2,0x17,0x6a,0x3e,0x3f,0x07,0x18,0xaf,0xf2,0x27,0x69,0x10,0x52,0xd7,0x19,0xe5,0x3f,0xfd,0x22,0x00,0xa6,0x3c,0x2c,0xb7,0xe3,0x22,0xa7,0xc6,0x65,0xcc,0x63,0x4f,0x21,0x72}, + {0x93,0xa6,0x07,0x53,0x40,0x7f,0xe3,0xb4,0x95,0x67,0x33,0x2f,0xd7,0x14,0xa7,0xab,0x99,0x10,0x76,0x73,0xa7,0xd0,0xfb,0xd6,0xc9,0xcb,0x71,0x81,0xc5,0x48,0xdf,0x5f,0xc9,0x29,0x3b,0xf4,0xb9,0xb7,0x9d,0x1d,0x75,0x8f,0x51,0x4f,0x4a,0x82,0x05,0xd6,0xc4,0x9d,0x2f,0x31,0xbd,0x72,0xc0,0xf2,0xb0,0x45,0x15,0x5a,0x85,0xac,0x24,0x1f,0xaa,0x05,0x95,0x8e,0x32,0x08,0xd6,0x24,0xee,0x20,0x14,0x0c,0xd1,0xc1,0x48,0x47,0xa2,0x25,0xfb,0x06,0x5c,0xe4,0xff,0xc7,0xe6,0x95,0xe3,0x2a,0x9e,0x73,0xba,0x00}, + {0xd6,0x90,0x87,0x5c,0xde,0x98,0x2e,0x59,0xdf,0xa2,0xc2,0x45,0xd3,0xb7,0xbf,0xe5,0x22,0x99,0xb4,0xf9,0x60,0x3b,0x5a,0x11,0xf3,0x78,0xad,0x67,0x3e,0x3a,0x28,0x03,0x26,0xbb,0x88,0xea,0xf5,0x26,0x44,0xae,0xfb,0x3b,0x97,0x84,0xd9,0x79,0x06,0x36,0x50,0x4e,0x69,0x26,0x0c,0x03,0x9f,0x5c,0x26,0xd2,0x18,0xd5,0xe7,0x7d,0x29,0x72,0x39,0xb9,0x0c,0xbe,0xc7,0x1d,0x24,0x48,0x80,0x30,0x63,0x8b,0x4d,0x9b,0xf1,0x32,0x08,0x93,0x28,0x02,0x0d,0xc9,0xdf,0xd3,0x45,0x19,0x27,0x46,0x68,0x29,0xe1,0x05}, + {0x5a,0x49,0x9c,0x2d,0xb3,0xee,0x82,0xba,0x7c,0xb9,0x2b,0xf1,0xfc,0xc8,0xef,0xce,0xe0,0xd1,0xb5,0x93,0xae,0xab,0x2d,0xb0,0x9b,0x8d,0x69,0x13,0x9c,0x0c,0xc0,0x39,0x50,0x45,0x2c,0x24,0xc8,0xbb,0xbf,0xad,0xd9,0x81,0x30,0xd0,0xec,0x0c,0xc8,0xbc,0x92,0xdf,0xc8,0xf5,0xa6,0x66,0x35,0x84,0x4c,0xce,0x58,0x82,0xd3,0x25,0xcf,0x78,0x68,0x9d,0x48,0x31,0x8e,0x6b,0xae,0x15,0x87,0xf0,0x2b,0x9c,0xab,0x1c,0x85,0xaa,0x05,0xfa,0x4e,0xf0,0x97,0x5a,0xa7,0xc9,0x32,0xf8,0x3f,0x6b,0x07,0x52,0x6b,0x00}, + {0x1c,0x78,0x95,0x9d,0xe1,0xcf,0xe0,0x29,0xe2,0x10,0x63,0x96,0x18,0xdf,0x81,0xb6,0x39,0x6b,0x51,0x70,0xd3,0x39,0xdf,0x57,0x22,0x61,0xc7,0x3b,0x44,0xe3,0x57,0x4d,0x2d,0x08,0xce,0xb9,0x16,0x7e,0xcb,0xf5,0x29,0xbc,0x7a,0x41,0x4c,0xf1,0x07,0x34,0xab,0xa7,0xf4,0x2b,0xce,0x6b,0xb3,0xd4,0xce,0x75,0x9f,0x1a,0x56,0xe9,0xe2,0x7d,0xcb,0x5e,0xa5,0xb6,0xf4,0xd4,0x70,0xde,0x99,0xdb,0x85,0x5d,0x7f,0x52,0x01,0x48,0x81,0x9a,0xee,0xd3,0x40,0xc4,0xc9,0xdb,0xed,0x29,0x60,0x1a,0xaf,0x90,0x2a,0x6b}, + {0x97,0x1e,0xe6,0x9a,0xfc,0xf4,0x23,0x69,0xd1,0x5f,0x3f,0xe0,0x1d,0x28,0x35,0x57,0x2d,0xd1,0xed,0xe6,0x43,0xae,0x64,0xa7,0x4a,0x3e,0x2d,0xd1,0xe9,0xf4,0xd8,0x5f,0x0a,0xd8,0xb2,0x5b,0x24,0xf3,0xeb,0x77,0x9b,0x07,0xb9,0x2f,0x47,0x1b,0x30,0xd8,0x33,0x73,0xee,0x4c,0xf2,0xe6,0x47,0xc6,0x09,0x21,0x6c,0x27,0xc8,0x12,0x58,0x46,0xd9,0x62,0x10,0x2a,0xb2,0xbe,0x43,0x4d,0x16,0xdc,0x31,0x38,0x75,0xfb,0x65,0x70,0xd7,0x68,0x29,0xde,0x7b,0x4a,0x0d,0x18,0x90,0x67,0xb1,0x1c,0x2b,0x2c,0xb3,0x05}, + {0xfd,0xa8,0x4d,0xd2,0xcc,0x5e,0xc0,0xc8,0x83,0xef,0xdf,0x05,0xac,0x1a,0xcf,0xa1,0x61,0xcd,0xf9,0x7d,0xf2,0xef,0xbe,0xdb,0x99,0x1e,0x47,0x7b,0xa3,0x56,0x55,0x3b,0x95,0x81,0xd5,0x7a,0x2c,0xa4,0xfc,0xf7,0xcc,0xf3,0x33,0x43,0x6e,0x28,0x14,0x32,0x9d,0x97,0x0b,0x34,0x0d,0x9d,0xc2,0xb6,0xe1,0x07,0x73,0x56,0x48,0x1a,0x77,0x31,0x82,0xd4,0x4d,0xe1,0x24,0xc5,0xb0,0x32,0xb6,0xa4,0x2b,0x1a,0x54,0x51,0xb3,0xed,0xf3,0x5a,0x2b,0x28,0x48,0x60,0xd1,0xa3,0xeb,0x36,0x73,0x7a,0xd2,0x79,0xc0,0x4f}, + {0x7f,0x2f,0xbf,0x89,0xb0,0x38,0xc9,0x51,0xa7,0xe9,0xdf,0x02,0x65,0xbd,0x97,0x24,0x53,0xe4,0x80,0x78,0x9c,0xc0,0xff,0xff,0x92,0x8e,0xf9,0xca,0xce,0x67,0x45,0x12,0x0d,0xc5,0x86,0x0c,0x44,0x8b,0x34,0xdc,0x51,0xe6,0x94,0xcc,0xc9,0xcb,0x37,0x13,0xb9,0x3c,0x3e,0x64,0x4d,0xf7,0x22,0x64,0x08,0xcd,0xe3,0xba,0xc2,0x70,0x11,0x24,0xb4,0x73,0xc4,0x0a,0x86,0xab,0xf9,0x3f,0x35,0xe4,0x13,0x01,0xee,0x1d,0x91,0xf0,0xaf,0xc4,0xc6,0xeb,0x60,0x50,0xe7,0x4a,0x0d,0x00,0x87,0x6c,0x96,0x12,0x86,0x3f}, + {0xde,0x0d,0x2a,0x78,0xc9,0x0c,0x9a,0x55,0x85,0x83,0x71,0xea,0xb2,0xcd,0x1d,0x55,0x8c,0x23,0xef,0x31,0x5b,0x86,0x62,0x7f,0x3d,0x61,0x73,0x79,0x76,0xa7,0x4a,0x50,0x13,0x8d,0x04,0x36,0xfa,0xfc,0x18,0x9c,0xdd,0x9d,0x89,0x73,0xb3,0x9d,0x15,0x29,0xaa,0xd0,0x92,0x9f,0x0b,0x35,0x9f,0xdc,0xd4,0x19,0x8a,0x87,0xee,0x7e,0xf5,0x26,0xb1,0xef,0x87,0x56,0xd5,0x2c,0xab,0x0c,0x7b,0xf1,0x7a,0x24,0x62,0xd1,0x80,0x51,0x67,0x24,0x5a,0x4f,0x34,0x5a,0xc1,0x85,0x69,0x30,0xba,0x9d,0x3d,0x94,0x41,0x40}, + {0x96,0xcc,0xeb,0x43,0xba,0xee,0xc0,0xc3,0xaf,0x9c,0xea,0x26,0x9c,0x9c,0x74,0x8d,0xc6,0xcc,0x77,0x1c,0xee,0x95,0xfa,0xd9,0x0f,0x34,0x84,0x76,0xd9,0xa1,0x20,0x14,0xdd,0xaa,0x6c,0xa2,0x43,0x77,0x21,0x4b,0xce,0xb7,0x8a,0x64,0x24,0xb4,0xa6,0x47,0xe3,0xc9,0xfb,0x03,0x7a,0x4f,0x1d,0xcb,0x19,0xd0,0x00,0x98,0x42,0x31,0xd9,0x12,0x4f,0x59,0x37,0xd3,0x99,0x77,0xc6,0x00,0x7b,0xa4,0x3a,0xb2,0x40,0x51,0x3c,0x5e,0x95,0xf3,0x5f,0xe3,0x54,0x28,0x18,0x44,0x12,0xa0,0x59,0x43,0x31,0x92,0x4f,0x1b}, + {0x51,0x09,0x15,0x89,0x9d,0x10,0x5c,0x3e,0x6a,0x69,0xe9,0x2d,0x91,0xfa,0xce,0x39,0x20,0x30,0x5f,0x97,0x3f,0xe4,0xea,0x20,0xae,0x2d,0x13,0x7f,0x2a,0x57,0x9b,0x23,0xb1,0x66,0x98,0xa4,0x30,0x30,0xcf,0x33,0x59,0x48,0x5f,0x21,0xd2,0x73,0x1f,0x25,0xf6,0xf4,0xde,0x51,0x40,0xaa,0x82,0xab,0xf6,0x23,0x9a,0x6f,0xd5,0x91,0xf1,0x5f,0x68,0x90,0x2d,0xac,0x33,0xd4,0x9e,0x81,0x23,0x85,0xc9,0x5f,0x79,0xab,0x83,0x28,0x3d,0xeb,0x93,0x55,0x80,0x72,0x45,0xef,0xcb,0x36,0x8f,0x75,0x6a,0x52,0x0c,0x02}, + {0xbc,0xdb,0xd8,0x9e,0xf8,0x34,0x98,0x77,0x6c,0xa4,0x7c,0xdc,0xf9,0xaa,0xf2,0xc8,0x74,0xb0,0xe1,0xa3,0xdc,0x4c,0x52,0xa9,0x77,0x38,0x31,0x15,0x46,0xcc,0xaa,0x02,0x89,0xcc,0x42,0xf0,0x59,0xef,0x31,0xe9,0xb6,0x4b,0x12,0x8e,0x9d,0x9c,0x58,0x2c,0x97,0x59,0xc7,0xae,0x8a,0xe1,0xc8,0xad,0x0c,0xc5,0x02,0x56,0x0a,0xfe,0x2c,0x45,0xdf,0x77,0x78,0x64,0xa0,0xf7,0xa0,0x86,0x9f,0x7c,0x60,0x0e,0x27,0x64,0xc4,0xbb,0xc9,0x11,0xfb,0xf1,0x25,0xea,0x17,0xab,0x7b,0x87,0x4b,0x30,0x7b,0x7d,0xfb,0x4c}, + {0xfe,0x75,0x9b,0xb8,0x6c,0x3d,0xb4,0x72,0x80,0xdc,0x6a,0x9c,0xd9,0x94,0xc6,0x54,0x9f,0x4c,0xe3,0x3e,0x37,0xaa,0xc3,0xb8,0x64,0x53,0x07,0x39,0x2b,0x62,0xb4,0x14,0x12,0xef,0x89,0x97,0xc2,0x99,0x86,0xe2,0x0d,0x19,0x57,0xdf,0x71,0xcd,0x6e,0x2b,0xd0,0x70,0xc9,0xec,0x57,0xc8,0x43,0xc3,0xc5,0x3a,0x4d,0x43,0xbc,0x4c,0x1d,0x5b,0x26,0x9f,0x0a,0xcc,0x15,0x26,0xfb,0xb6,0xe5,0xcc,0x8d,0xb8,0x2b,0x0e,0x4f,0x3a,0x05,0xa7,0x69,0x33,0x8b,0x49,0x01,0x13,0xd1,0x2d,0x59,0x58,0x12,0xf7,0x98,0x2f}, + {0x56,0x9e,0x0f,0xb5,0x4c,0xa7,0x94,0x0c,0x20,0x13,0x8e,0x8e,0xa9,0xf4,0x1f,0x5b,0x67,0x0f,0x30,0x82,0x21,0xcc,0x2a,0x9a,0xf9,0xaa,0x06,0xd8,0x49,0xe2,0x6a,0x3a,0x01,0xa7,0x54,0x4f,0x44,0xae,0x12,0x2e,0xde,0xd7,0xcb,0xa9,0xf0,0x3e,0xfe,0xfc,0xe0,0x5d,0x83,0x75,0x0d,0x89,0xbf,0xce,0x54,0x45,0x61,0xe7,0xe9,0x62,0x80,0x1d,0x5a,0x7c,0x90,0xa9,0x85,0xda,0x7a,0x65,0x62,0x0f,0xb9,0x91,0xb5,0xa8,0x0e,0x1a,0xe9,0xb4,0x34,0xdf,0xfb,0x1d,0x0e,0x8d,0xf3,0x5f,0xf2,0xae,0xe8,0x8c,0x8b,0x29}, + {0xb2,0x0c,0xf7,0xef,0x53,0x79,0x92,0x2a,0x76,0x70,0x15,0x79,0x2a,0xc9,0x89,0x4b,0x6a,0xcf,0xa7,0x30,0x7a,0x45,0x18,0x94,0x85,0xe4,0x5c,0x4d,0x40,0xa8,0xb8,0x34,0xde,0x65,0x21,0x0a,0xea,0x72,0x7a,0x83,0xf6,0x79,0xcf,0x0b,0xb4,0x07,0xab,0x3f,0x70,0xae,0x38,0x77,0xc7,0x36,0x16,0x52,0xdc,0xd7,0xa7,0x03,0x18,0x27,0xa6,0x6b,0x35,0x33,0x69,0x83,0xb5,0xec,0x6e,0xc2,0xfd,0xfe,0xb5,0x63,0xdf,0x13,0xa8,0xd5,0x73,0x25,0xb2,0xa4,0x9a,0xaa,0x93,0xa2,0x6a,0x1c,0x5e,0x46,0xdd,0x2b,0xd6,0x71}, + {0x80,0xdf,0x78,0xd3,0x28,0xcc,0x33,0x65,0xb4,0xa4,0x0f,0x0a,0x79,0x43,0xdb,0xf6,0x5a,0xda,0x01,0xf7,0xf9,0x5f,0x64,0xe3,0xa4,0x2b,0x17,0xf3,0x17,0xf3,0xd5,0x74,0xf5,0x5e,0xf7,0xb1,0xda,0xb5,0x2d,0xcd,0xf5,0x65,0xb0,0x16,0xcf,0x95,0x7f,0xd7,0x85,0xf0,0x49,0x3f,0xea,0x1f,0x57,0x14,0x3d,0x2b,0x2b,0x26,0x21,0x36,0x33,0x1c,0x81,0xca,0xd9,0x67,0x54,0xe5,0x6f,0xa8,0x37,0x8c,0x29,0x2b,0x75,0x7c,0x8b,0x39,0x3b,0x62,0xac,0xe3,0x92,0x08,0x6d,0xda,0x8c,0xd9,0xe9,0x47,0x45,0xcc,0xeb,0x4a}, + {0xc9,0x01,0x6d,0x27,0x1b,0x07,0xf0,0x12,0x70,0x8c,0xc4,0x86,0xc5,0xba,0xb8,0xe7,0xa9,0xfb,0xd6,0x71,0x9b,0x12,0x08,0x53,0x92,0xb7,0x3d,0x5a,0xf9,0xfb,0x88,0x5d,0x10,0xb6,0x54,0x73,0x9e,0x8d,0x40,0x0b,0x6e,0x5b,0xa8,0x5b,0x53,0x32,0x6b,0x80,0x07,0xa2,0x58,0x4a,0x03,0x3a,0xe6,0xdb,0x2c,0xdf,0xa1,0xc9,0xdd,0xd9,0x3b,0x17,0xdf,0x72,0x58,0xfe,0x1e,0x0f,0x50,0x2b,0xc1,0x18,0x39,0xd4,0x2e,0x58,0xd6,0x58,0xe0,0x3a,0x67,0xc9,0x8e,0x27,0xed,0xe6,0x19,0xa3,0x9e,0xb1,0x13,0xcd,0xe1,0x06}, + {0x23,0x6f,0x16,0x6f,0x51,0xad,0xd0,0x40,0xbe,0x6a,0xab,0x1f,0x93,0x32,0x8e,0x11,0x8e,0x08,0x4d,0xa0,0x14,0x5e,0xe3,0x3f,0x66,0x62,0xe1,0x26,0x35,0x60,0x80,0x30,0x53,0x03,0x5b,0x9e,0x62,0xaf,0x2b,0x47,0x47,0x04,0x8d,0x27,0x90,0x0b,0xaa,0x3b,0x27,0xbf,0x43,0x96,0x46,0x5f,0x78,0x0c,0x13,0x7b,0x83,0x8d,0x1a,0x6a,0x3a,0x7f,0x0b,0x80,0x3d,0x5d,0x39,0x44,0xe6,0xf7,0xf6,0xed,0x01,0xc9,0x55,0xd5,0xa8,0x95,0x39,0x63,0x2c,0x59,0x30,0x78,0xcd,0x68,0x7e,0x30,0x51,0x2e,0xed,0xfd,0xd0,0x30}, + {0xb3,0x33,0x12,0xf2,0x1a,0x4d,0x59,0xe0,0x9c,0x4d,0xcc,0xf0,0x8e,0xe7,0xdb,0x1b,0x77,0x9a,0x49,0x8f,0x7f,0x18,0x65,0x69,0x68,0x98,0x09,0x2c,0x20,0x14,0x92,0x0a,0x50,0x47,0xb8,0x68,0x1e,0x97,0xb4,0x9c,0xcf,0xbb,0x64,0x66,0x29,0x72,0x95,0xa0,0x2b,0x41,0xfa,0x72,0x26,0xe7,0x8d,0x5c,0xd9,0x89,0xc5,0x51,0x43,0x08,0x15,0x46,0x2e,0xa0,0xb9,0xae,0xc0,0x19,0x90,0xbc,0xae,0x4c,0x03,0x16,0x0d,0x11,0xc7,0x55,0xec,0x32,0x99,0x65,0x01,0xf5,0x6d,0x0e,0xfe,0x5d,0xca,0x95,0x28,0x0d,0xca,0x3b}, + {0xa4,0x62,0x5d,0x3c,0xbc,0x31,0xf0,0x40,0x60,0x7a,0xf0,0xcf,0x3e,0x8b,0xfc,0x19,0x45,0xb5,0x0f,0x13,0xa2,0x3d,0x18,0x98,0xcd,0x13,0x8f,0xae,0xdd,0xde,0x31,0x56,0xbf,0x01,0xcc,0x9e,0xb6,0x8e,0x68,0x9c,0x6f,0x89,0x44,0xa6,0xad,0x83,0xbc,0xf0,0xe2,0x9f,0x7a,0x5f,0x5f,0x95,0x2d,0xca,0x41,0x82,0xf2,0x8d,0x03,0xb4,0xa8,0x4e,0x02,0xd2,0xca,0xf1,0x0a,0x46,0xed,0x2a,0x83,0xee,0x8c,0xa4,0x05,0x53,0x30,0x46,0x5f,0x1a,0xf1,0x49,0x45,0x77,0x21,0x91,0x63,0xa4,0x2c,0x54,0x30,0x09,0xce,0x24}, + {0x06,0xc1,0x06,0xfd,0xf5,0x90,0xe8,0x1f,0xf2,0x10,0x88,0x5d,0x35,0x68,0xc4,0xb5,0x3e,0xaf,0x8c,0x6e,0xfe,0x08,0x78,0x82,0x4b,0xd7,0x06,0x8a,0xc2,0xe3,0xd4,0x41,0x85,0x0b,0xf3,0xfd,0x55,0xa1,0xcf,0x3f,0xa4,0x2e,0x37,0x36,0x8e,0x16,0xf7,0xd2,0x44,0xf8,0x92,0x64,0xde,0x64,0xe0,0xb2,0x80,0x42,0x4f,0x32,0xa7,0x28,0x99,0x54,0x2e,0x1a,0xee,0x63,0xa7,0x32,0x6e,0xf2,0xea,0xfd,0x5f,0xd2,0xb7,0xe4,0x91,0xae,0x69,0x4d,0x7f,0xd1,0x3b,0xd3,0x3b,0xbc,0x6a,0xff,0xdc,0xc0,0xde,0x66,0x1b,0x49}, + {0xa7,0x32,0xea,0xc7,0x3d,0xb1,0xf5,0x98,0x98,0xdb,0x16,0x7e,0xcc,0xf8,0xd5,0xe3,0x47,0xd9,0xf8,0xcb,0x52,0xbf,0x0a,0xac,0xac,0xe4,0x5e,0xc8,0xd0,0x38,0xf3,0x08,0xa1,0x64,0xda,0xd0,0x8e,0x4a,0xf0,0x75,0x4b,0x28,0xe2,0x67,0xaf,0x2c,0x22,0xed,0xa4,0x7b,0x7b,0x1f,0x79,0xa3,0x34,0x82,0x67,0x8b,0x01,0xb7,0xb0,0xb8,0xf6,0x4c,0xbd,0x73,0x1a,0x99,0x21,0xa8,0x83,0xc3,0x7a,0x0c,0x32,0xdf,0x01,0xbc,0x27,0xab,0x63,0x70,0x77,0x84,0x1b,0x33,0x3d,0xc1,0x99,0x8a,0x07,0xeb,0x82,0x4a,0x0d,0x53}, + {0x25,0x48,0xf9,0xe1,0x30,0x36,0x4c,0x00,0x5a,0x53,0xab,0x8c,0x26,0x78,0x2d,0x7e,0x8b,0xff,0x84,0xcc,0x23,0x23,0x48,0xc7,0xb9,0x70,0x17,0x10,0x3f,0x75,0xea,0x65,0x9e,0xbf,0x9a,0x6c,0x45,0x73,0x69,0x6d,0x80,0xa8,0x00,0x49,0xfc,0xb2,0x7f,0x25,0x50,0xb8,0xcf,0xc8,0x12,0xf4,0xac,0x2b,0x5b,0xbd,0xbf,0x0c,0xe0,0xe7,0xb3,0x0d,0x63,0x63,0x09,0xe2,0x3e,0xfc,0x66,0x3d,0x6b,0xcb,0xb5,0x61,0x7f,0x2c,0xd6,0x81,0x1a,0x3b,0x44,0x13,0x42,0x04,0xbe,0x0f,0xdb,0xa1,0xe1,0x21,0x19,0xec,0xa4,0x02}, + {0xa2,0xb8,0x24,0x3b,0x9a,0x25,0xe6,0x5c,0xb8,0xa0,0xaf,0x45,0xcc,0x7a,0x57,0xb8,0x37,0x70,0xa0,0x8b,0xe8,0xe6,0xcb,0xcc,0xbf,0x09,0x78,0x12,0x51,0x3c,0x14,0x3d,0x5f,0x79,0xcf,0xf1,0x62,0x61,0xc8,0xf5,0xf2,0x57,0xee,0x26,0x19,0x86,0x8c,0x11,0x78,0x35,0x06,0x1c,0x85,0x24,0x21,0x17,0xcf,0x7f,0x06,0xec,0x5d,0x2b,0xd1,0x36,0x57,0x45,0x15,0x79,0x91,0x27,0x6d,0x12,0x0a,0x3a,0x78,0xfc,0x5c,0x8f,0xe4,0xd5,0xac,0x9b,0x17,0xdf,0xe8,0xb6,0xbd,0x36,0x59,0x28,0xa8,0x5b,0x88,0x17,0xf5,0x2e}, + {0xdc,0xae,0x58,0x8c,0x4e,0x97,0x37,0x46,0xa4,0x41,0xf0,0xab,0xfb,0x22,0xef,0xb9,0x8a,0x71,0x80,0xe9,0x56,0xd9,0x85,0xe1,0xa6,0xa8,0x43,0xb1,0xfa,0x78,0x1b,0x2f,0x51,0x2f,0x5b,0x30,0xfb,0xbf,0xee,0x96,0xb8,0x96,0x95,0x88,0xad,0x38,0xf9,0xd3,0x25,0xdd,0xd5,0x46,0xc7,0x2d,0xf5,0xf0,0x95,0x00,0x3a,0xbb,0x90,0x82,0x96,0x57,0x01,0xe1,0x20,0x0a,0x43,0xb8,0x1a,0xf7,0x47,0xec,0xf0,0x24,0x8d,0x65,0x93,0xf3,0xd1,0xee,0xe2,0x6e,0xa8,0x09,0x75,0xcf,0xe1,0xa3,0x2a,0xdc,0x35,0x3e,0xc4,0x7d}, + {0xc3,0xd9,0x7d,0x88,0x65,0x66,0x96,0x85,0x55,0x53,0xb0,0x4b,0x31,0x9b,0x0f,0xc9,0xb1,0x79,0x20,0xef,0xf8,0x8d,0xe0,0xc6,0x2f,0xc1,0x8c,0x75,0x16,0x20,0xf7,0x7e,0x18,0x97,0x3e,0x27,0x5c,0x2a,0x78,0x5a,0x94,0xfd,0x4e,0x5e,0x99,0xc6,0x76,0x35,0x3e,0x7d,0x23,0x1f,0x05,0xd8,0x2e,0x0f,0x99,0x0a,0xd5,0x82,0x1d,0xb8,0x4f,0x04,0xd9,0xe3,0x07,0xa9,0xc5,0x18,0xdf,0xc1,0x59,0x63,0x4c,0xce,0x1d,0x37,0xb3,0x57,0x49,0xbb,0x01,0xb2,0x34,0x45,0x70,0xca,0x2e,0xdd,0x30,0x9c,0x3f,0x82,0x79,0x7f}, + {0xe8,0x13,0xb5,0xa3,0x39,0xd2,0x34,0x83,0xd8,0xa8,0x1f,0xb9,0xd4,0x70,0x36,0xc1,0x33,0xbd,0x90,0xf5,0x36,0x41,0xb5,0x12,0xb4,0xd9,0x84,0xd7,0x73,0x03,0x4e,0x0a,0xba,0x87,0xf5,0x68,0xf0,0x1f,0x9c,0x6a,0xde,0xc8,0x50,0x00,0x4e,0x89,0x27,0x08,0xe7,0x5b,0xed,0x7d,0x55,0x99,0xbf,0x3c,0xf0,0xd6,0x06,0x1c,0x43,0xb0,0xa9,0x64,0x19,0x29,0x7d,0x5b,0xa1,0xd6,0xb3,0x2e,0x35,0x82,0x3a,0xd5,0xa0,0xf6,0xb4,0xb0,0x47,0x5d,0xa4,0x89,0x43,0xce,0x56,0x71,0x6c,0x34,0x18,0xce,0x0a,0x7d,0x1a,0x07}, + {0x0b,0xba,0x87,0xc8,0xaa,0x2d,0x07,0xd3,0xee,0x62,0xa5,0xbf,0x05,0x29,0x26,0x01,0x8b,0x76,0xef,0xc0,0x02,0x30,0x54,0xcf,0x9c,0x7e,0xea,0x46,0x71,0xcc,0x3b,0x2c,0x31,0x44,0xe1,0x20,0x52,0x35,0x0c,0xcc,0x41,0x51,0xb1,0x09,0x07,0x95,0x65,0x0d,0x36,0x5f,0x9d,0x20,0x1b,0x62,0xf5,0x9a,0xd3,0x55,0x77,0x61,0xf7,0xbc,0x69,0x7c,0x5f,0x29,0xe8,0x04,0xeb,0xd7,0xf0,0x07,0x7d,0xf3,0x50,0x2f,0x25,0x18,0xdb,0x10,0xd7,0x98,0x17,0x17,0xa3,0xa9,0x51,0xe9,0x1d,0xa5,0xac,0x22,0x73,0x9a,0x5a,0x6f}, + {0xc5,0xc6,0x41,0x2f,0x0c,0x00,0xa1,0x8b,0x9b,0xfb,0xfe,0x0c,0xc1,0x79,0x9f,0xc4,0x9f,0x1c,0xc5,0x3c,0x70,0x47,0xfa,0x4e,0xca,0xaf,0x47,0xe1,0xa2,0x21,0x4e,0x49,0xbe,0x44,0xd9,0xa3,0xeb,0xd4,0x29,0xe7,0x9e,0xaf,0x78,0x80,0x40,0x09,0x9e,0x8d,0x03,0x9c,0x86,0x47,0x7a,0x56,0x25,0x45,0x24,0x3b,0x8d,0xee,0x80,0x96,0xab,0x02,0x9a,0x0d,0xe5,0xdd,0x85,0x8a,0xa4,0xef,0x49,0xa2,0xb9,0x0f,0x4e,0x22,0x9a,0x21,0xd9,0xf6,0x1e,0xd9,0x1d,0x1f,0x09,0xfa,0x34,0xbb,0x46,0xea,0xcb,0x76,0x5d,0x6b}, + {0x94,0xd9,0x0c,0xec,0x6c,0x55,0x57,0x88,0xba,0x1d,0xd0,0x5c,0x6f,0xdc,0x72,0x64,0x77,0xb4,0x42,0x8f,0x14,0x69,0x01,0xaf,0x54,0x73,0x27,0x85,0xf6,0x33,0xe3,0x0a,0x22,0x25,0x78,0x1e,0x17,0x41,0xf9,0xe0,0xd3,0x36,0x69,0x03,0x74,0xae,0xe6,0xf1,0x46,0xc7,0xfc,0xd0,0xa2,0x3e,0x8b,0x40,0x3e,0x31,0xdd,0x03,0x9c,0x86,0xfb,0x16,0x62,0x09,0xb6,0x33,0x97,0x19,0x8e,0x28,0x33,0xe1,0xab,0xd8,0xb4,0x72,0xfc,0x24,0x3e,0xd0,0x91,0x09,0xed,0xf7,0x11,0x48,0x75,0xd0,0x70,0x8f,0x8b,0xe3,0x81,0x3f}, + {0xfe,0xaf,0xd9,0x7e,0xcc,0x0f,0x91,0x7f,0x4b,0x87,0x65,0x24,0xa1,0xb8,0x5c,0x54,0x04,0x47,0x0c,0x4b,0xd2,0x7e,0x39,0xa8,0x93,0x09,0xf5,0x04,0xc1,0x0f,0x51,0x50,0x24,0xc8,0x17,0x5f,0x35,0x7f,0xdb,0x0a,0xa4,0x99,0x42,0xd7,0xc3,0x23,0xb9,0x74,0xf7,0xea,0xf8,0xcb,0x8b,0x3e,0x7c,0xd5,0x3d,0xdc,0xde,0x4c,0xd3,0xe2,0xd3,0x0a,0x9d,0x24,0x6e,0x33,0xc5,0x0f,0x0c,0x6f,0xd9,0xcf,0x31,0xc3,0x19,0xde,0x5e,0x74,0x1c,0xfe,0xee,0x09,0x00,0xfd,0xd6,0xf2,0xbe,0x1e,0xfa,0xf0,0x8b,0x15,0x7c,0x12}, + {0xa2,0x79,0x98,0x2e,0x42,0x7c,0x19,0xf6,0x47,0x36,0xca,0x52,0xd4,0xdd,0x4a,0xa4,0xcb,0xac,0x4e,0x4b,0xc1,0x3f,0x41,0x9b,0x68,0x4f,0xef,0x07,0x7d,0xf8,0x4e,0x35,0x74,0xb9,0x51,0xae,0xc4,0x8f,0xa2,0xde,0x96,0xfe,0x4d,0x74,0xd3,0x73,0x99,0x1d,0xa8,0x48,0x38,0x87,0x0b,0x68,0x40,0x62,0x95,0xdf,0x67,0xd1,0x79,0x24,0xd8,0x4e,0x75,0xd9,0xc5,0x60,0x22,0xb5,0xe3,0xfe,0xb8,0xb0,0x41,0xeb,0xfc,0x2e,0x35,0x50,0x3c,0x65,0xf6,0xa9,0x30,0xac,0x08,0x88,0x6d,0x23,0x39,0x05,0xd2,0x92,0x2d,0x30}, + {0x3d,0x28,0xa4,0xbc,0xa2,0xc1,0x13,0x78,0xd9,0x3d,0x86,0xa1,0x91,0xf0,0x62,0xed,0x86,0xfa,0x68,0xc2,0xb8,0xbc,0xc7,0xae,0x4c,0xae,0x1c,0x6f,0xb7,0xd3,0xe5,0x10,0x77,0xf1,0xe0,0xe4,0xb6,0x6f,0xbc,0x2d,0x93,0x6a,0xbd,0xa4,0x29,0xbf,0xe1,0x04,0xe8,0xf6,0x7a,0x78,0xd4,0x66,0x19,0x5e,0x60,0xd0,0x26,0xb4,0x5e,0x5f,0xdc,0x0e,0x67,0x8e,0xda,0x53,0xd6,0xbf,0x53,0x54,0x41,0xf6,0xa9,0x24,0xec,0x1e,0xdc,0xe9,0x23,0x8a,0x57,0x03,0x3b,0x26,0x87,0xbf,0x72,0xba,0x1c,0x36,0x51,0x6c,0xb4,0x45}, + {0xa1,0x7f,0x4f,0x31,0xbf,0x2a,0x40,0xa9,0x50,0xf4,0x8c,0x8e,0xdc,0xf1,0x57,0xe2,0x84,0xbe,0xa8,0x23,0x4b,0xd5,0xbb,0x1d,0x3b,0x71,0xcb,0x6d,0xa3,0xbf,0x77,0x21,0xe4,0xe3,0x7f,0x8a,0xdd,0x4d,0x9d,0xce,0x30,0x0e,0x62,0x76,0x56,0x64,0x13,0xab,0x58,0x99,0x0e,0xb3,0x7b,0x4f,0x59,0x4b,0xdf,0x29,0x12,0x32,0xef,0x0a,0x1c,0x5c,0x8f,0xdb,0x79,0xfa,0xbc,0x1b,0x08,0x37,0xb3,0x59,0x5f,0xc2,0x1e,0x81,0x48,0x60,0x87,0x24,0x83,0x9c,0x65,0x76,0x7a,0x08,0xbb,0xb5,0x8a,0x7d,0x38,0x19,0xe6,0x4a}, + {0x2e,0xa3,0x44,0x53,0xaa,0xf6,0xdb,0x8d,0x78,0x40,0x1b,0xb4,0xb4,0xea,0x88,0x7d,0x60,0x0d,0x13,0x4a,0x97,0xeb,0xb0,0x5e,0x03,0x3e,0xbf,0x17,0x1b,0xd9,0x00,0x1a,0x83,0xfb,0x5b,0x98,0x44,0x7e,0x11,0x61,0x36,0x31,0x96,0x71,0x2a,0x46,0xe0,0xfc,0x4b,0x90,0x25,0xd4,0x48,0x34,0xac,0x83,0x64,0x3d,0xa4,0x5b,0xbe,0x5a,0x68,0x75,0xb2,0xf2,0x61,0xeb,0x33,0x09,0x96,0x6e,0x52,0x49,0xff,0xc9,0xa8,0x0f,0x3d,0x54,0x69,0x65,0xf6,0x7a,0x10,0x75,0x72,0xdf,0xaa,0xe6,0xb0,0x23,0xb6,0x29,0x55,0x13}, + {0x18,0xd5,0xd1,0xad,0xd7,0xdb,0xf0,0x18,0x11,0x1f,0xc1,0xcf,0x88,0x78,0x9f,0x97,0x9b,0x75,0x14,0x71,0xf0,0xe1,0x32,0x87,0x01,0x3a,0xca,0x65,0x1a,0xb8,0xb5,0x79,0xfe,0x83,0x2e,0xe2,0xbc,0x16,0xc7,0xf5,0xc1,0x85,0x09,0xe8,0x19,0xeb,0x2b,0xb4,0xae,0x4a,0x25,0x14,0x37,0xa6,0x9d,0xec,0x13,0xa6,0x90,0x15,0x05,0xea,0x72,0x59,0x11,0x78,0x8f,0xdc,0x20,0xac,0xd4,0x0f,0xa8,0x4f,0x4d,0xac,0x94,0xd2,0x9a,0x9a,0x34,0x04,0x36,0xb3,0x64,0x2d,0x1b,0xc0,0xdb,0x3b,0x5f,0x90,0x95,0x9c,0x7e,0x4f}, + {0x2e,0x30,0x81,0x57,0xbc,0x4b,0x67,0x62,0x0f,0xdc,0xad,0x89,0x39,0x0f,0x52,0xd8,0xc6,0xd9,0xfb,0x53,0xae,0x99,0x29,0x8c,0x4c,0x8e,0x63,0x2e,0xd9,0x3a,0x99,0x31,0xfe,0x99,0x52,0x35,0x3d,0x44,0xc8,0x71,0xd7,0xea,0xeb,0xdb,0x1c,0x3b,0xcd,0x8b,0x66,0x94,0xa4,0xf1,0x9e,0x49,0x92,0x80,0xc8,0xad,0x44,0xa1,0xc4,0xee,0x42,0x19,0x92,0x49,0x23,0xae,0x19,0x53,0xac,0x7d,0x92,0x3e,0xea,0x0c,0x91,0x3d,0x1b,0x2c,0x22,0x11,0x3c,0x25,0x94,0xe4,0x3c,0x55,0x75,0xca,0xf9,0x4e,0x31,0x65,0x0a,0x2a}, + {0xc2,0x27,0xf9,0xf7,0x7f,0x93,0xb7,0x2d,0x35,0xa6,0xd0,0x17,0x06,0x1f,0x74,0xdb,0x76,0xaf,0x55,0x11,0xa2,0xf3,0x82,0x59,0xed,0x2d,0x7c,0x64,0x18,0xe2,0xf6,0x4c,0x3a,0x79,0x1c,0x3c,0xcd,0x1a,0x36,0xcf,0x3b,0xbc,0x35,0x5a,0xac,0xbc,0x9e,0x2f,0xab,0xa6,0xcd,0xa8,0xe9,0x60,0xe8,0x60,0x13,0x1a,0xea,0x6d,0x9b,0xc3,0x5d,0x05,0xb6,0x5b,0x8d,0xc2,0x7c,0x22,0x19,0xb1,0xab,0xff,0x4d,0x77,0xbc,0x4e,0xe2,0x07,0x89,0x2c,0xa3,0xe4,0xce,0x78,0x3c,0xa8,0xb6,0x24,0xaa,0x10,0x77,0x30,0x1a,0x12}, + {0x97,0x4a,0x03,0x9f,0x5e,0x5d,0xdb,0xe4,0x2d,0xbc,0x34,0x30,0x09,0xfc,0x53,0xe1,0xb1,0xd3,0x51,0x95,0x91,0x46,0x05,0x46,0x2d,0xe5,0x40,0x7a,0x6c,0xc7,0x3f,0x33,0xc9,0x83,0x74,0xc7,0x3e,0x71,0x59,0xd6,0xaf,0x96,0x2b,0xb8,0x77,0xe0,0xbf,0x88,0xd3,0xbc,0x97,0x10,0x23,0x28,0x9e,0x28,0x9b,0x3a,0xed,0x6c,0x4a,0xb9,0x7b,0x52,0x2e,0x48,0x5b,0x99,0x2a,0x99,0x3d,0x56,0x01,0x38,0x38,0x6e,0x7c,0xd0,0x05,0x34,0xe5,0xd8,0x64,0x2f,0xde,0x35,0x50,0x48,0xf7,0xa9,0xa7,0x20,0x9b,0x06,0x89,0x6b}, + {0x0d,0x22,0x70,0x62,0x41,0xa0,0x2a,0x81,0x4e,0x5b,0x24,0xf9,0xfa,0x89,0x5a,0x99,0x05,0xef,0x72,0x50,0xce,0xc4,0xad,0xff,0x73,0xeb,0x73,0xaa,0x03,0x21,0xbc,0x23,0x77,0xdb,0xc7,0xb5,0x8c,0xfa,0x82,0x40,0x55,0xc1,0x34,0xc7,0xf8,0x86,0x86,0x06,0x7e,0xa5,0xe7,0xf6,0xd9,0xc8,0xe6,0x29,0xcf,0x9b,0x63,0xa7,0x08,0xd3,0x73,0x04,0x05,0x9e,0x58,0x03,0x26,0x79,0xee,0xca,0x92,0xc4,0xdc,0x46,0x12,0x42,0x4b,0x2b,0x4f,0xa9,0x01,0xe6,0x74,0xef,0xa1,0x02,0x1a,0x34,0x04,0xde,0xbf,0x73,0x2f,0x10}, + {0xc6,0x45,0x57,0x7f,0xab,0xb9,0x18,0xeb,0x90,0xc6,0x87,0x57,0xee,0x8a,0x3a,0x02,0xa9,0xaf,0xf7,0x2d,0xda,0x12,0x27,0xb7,0x3d,0x01,0x5c,0xea,0x25,0x7d,0x59,0x36,0x9a,0x1c,0x51,0xb5,0xe0,0xda,0xb4,0xa2,0x06,0xff,0xff,0x2b,0x29,0x60,0xc8,0x7a,0x34,0x42,0x50,0xf5,0x5d,0x37,0x1f,0x98,0x2d,0xa1,0x4e,0xda,0x25,0xd7,0x6b,0x3f,0xac,0x58,0x60,0x10,0x7b,0x8d,0x4d,0x73,0x5f,0x90,0xc6,0x6f,0x9e,0x57,0x40,0xd9,0x2d,0x93,0x02,0x92,0xf9,0xf8,0x66,0x64,0xd0,0xd6,0x60,0xda,0x19,0xcc,0x7e,0x7b}, + {0x0d,0x69,0x5c,0x69,0x3c,0x37,0xc2,0x78,0x6e,0x90,0x42,0x06,0x66,0x2e,0x25,0xdd,0xd2,0x2b,0xe1,0x4a,0x44,0x44,0x1d,0x95,0x56,0x39,0x74,0x01,0x76,0xad,0x35,0x42,0x9b,0xfa,0x7c,0xa7,0x51,0x4a,0xae,0x6d,0x50,0x86,0xa3,0xe7,0x54,0x36,0x26,0x82,0xdb,0x82,0x2d,0x8f,0xcd,0xff,0xbb,0x09,0xba,0xca,0xf5,0x1b,0x66,0xdc,0xbe,0x03,0xf5,0x75,0x89,0x07,0x0d,0xcb,0x58,0x62,0x98,0xf2,0x89,0x91,0x54,0x42,0x29,0x49,0xe4,0x6e,0xe3,0xe2,0x23,0xb4,0xca,0xa0,0xa1,0x66,0xf0,0xcd,0xb0,0xe2,0x7c,0x0e}, + {0xa3,0x85,0x8c,0xc4,0x3a,0x64,0x94,0xc4,0xad,0x39,0x61,0x3c,0xf4,0x1d,0x36,0xfd,0x48,0x4d,0xe9,0x3a,0xdd,0x17,0xdb,0x09,0x4a,0x67,0xb4,0x8f,0x5d,0x0a,0x6e,0x66,0xf9,0x70,0x4b,0xd9,0xdf,0xfe,0xa6,0xfe,0x2d,0xba,0xfc,0xc1,0x51,0xc0,0x30,0xf1,0x89,0xab,0x2f,0x7f,0x7e,0xd4,0x82,0x48,0xb5,0xee,0xec,0x8a,0x13,0x56,0x52,0x61,0x0d,0xcb,0x70,0x48,0x4e,0xf6,0xbb,0x2a,0x6b,0x8b,0x45,0xaa,0xf0,0xbc,0x65,0xcd,0x5d,0x98,0xe8,0x75,0xba,0x4e,0xbe,0x9a,0xe4,0xde,0x14,0xd5,0x10,0xc8,0x0b,0x7f}, + {0x6f,0x13,0xf4,0x26,0xa4,0x6b,0x00,0xb9,0x35,0x30,0xe0,0x57,0x9e,0x36,0x67,0x8d,0x28,0x3c,0x46,0x4f,0xd9,0xdf,0xc8,0xcb,0xf5,0xdb,0xee,0xf8,0xbc,0x8d,0x1f,0x0d,0xa0,0x13,0x72,0x73,0xad,0x9d,0xac,0x83,0x98,0x2e,0xf7,0x2e,0xba,0xf8,0xf6,0x9f,0x57,0x69,0xec,0x43,0xdd,0x2e,0x1e,0x31,0x75,0xab,0xc5,0xde,0x7d,0x90,0x3a,0x1d,0xdc,0x81,0xd0,0x3e,0x31,0x93,0x16,0xba,0x80,0x34,0x1b,0x85,0xad,0x9f,0x32,0x29,0xcb,0x21,0x03,0x03,0x3c,0x01,0x28,0x01,0xe3,0xfd,0x1b,0xa3,0x44,0x1b,0x01,0x00}, + {0x0c,0x6c,0xc6,0x3f,0x6c,0xa0,0xdf,0x3f,0xd2,0x0d,0xd6,0x4d,0x8e,0xe3,0x40,0x5d,0x71,0x4d,0x8e,0x26,0x38,0x8b,0xe3,0x7a,0xe1,0x57,0x83,0x6e,0x91,0x8d,0xc4,0x3a,0x5c,0xa7,0x0a,0x6a,0x69,0x1f,0x56,0x16,0x6a,0xbd,0x52,0x58,0x5c,0x72,0xbf,0xc1,0xad,0x66,0x79,0x9a,0x7f,0xdd,0xa8,0x11,0x26,0x10,0x85,0xd2,0xa2,0x88,0xd9,0x63,0x2e,0x23,0xbd,0xaf,0x53,0x07,0x12,0x00,0x83,0xf6,0xd8,0xfd,0xb8,0xce,0x2b,0xe9,0x91,0x2b,0xe7,0x84,0xb3,0x69,0x16,0xf8,0x66,0xa0,0x68,0x23,0x2b,0xd5,0xfa,0x33}, + {0x16,0x1e,0xe4,0xc5,0xc6,0x49,0x06,0x54,0x35,0x77,0x3f,0x33,0x30,0x64,0xf8,0x0a,0x46,0xe7,0x05,0xf3,0xd2,0xfc,0xac,0xb2,0xa7,0xdc,0x56,0xa2,0x29,0xf4,0xc0,0x16,0xe8,0xcf,0x22,0xc4,0xd0,0xc8,0x2c,0x8d,0xcb,0x3a,0xa1,0x05,0x7b,0x4f,0x2b,0x07,0x6f,0xa5,0xf6,0xec,0xe6,0xb6,0xfe,0xa3,0xe2,0x71,0x0a,0xb9,0xcc,0x55,0xc3,0x3c,0x31,0x91,0x3e,0x90,0x43,0x94,0xb6,0xe9,0xce,0x37,0x56,0x7a,0xcb,0x94,0xa4,0xb8,0x44,0x92,0xba,0xba,0xa4,0xd1,0x7c,0xc8,0x68,0x75,0xae,0x6b,0x42,0xaf,0x1e,0x63}, + {0x9f,0xfe,0x66,0xda,0x10,0x04,0xe9,0xb3,0xa6,0xe5,0x16,0x6c,0x52,0x4b,0xdd,0x85,0x83,0xbf,0xf9,0x1e,0x61,0x97,0x3d,0xbc,0xb5,0x19,0xa9,0x1e,0x8b,0x64,0x99,0x55,0xe8,0x0d,0x70,0xa3,0xb9,0x75,0xd9,0x47,0x52,0x05,0xf8,0xe2,0xfb,0xc5,0x80,0x72,0xe1,0x5d,0xe4,0x32,0x27,0x8f,0x65,0x53,0xb5,0x80,0x5f,0x66,0x7f,0x2c,0x1f,0x43,0x19,0x7b,0x8f,0x85,0x44,0x63,0x02,0xd6,0x4a,0x51,0xea,0xa1,0x2f,0x35,0xab,0x14,0xd7,0xa9,0x90,0x20,0x1a,0x44,0x00,0x89,0x26,0x3b,0x25,0x91,0x5f,0x71,0x04,0x7b}, + {0x43,0xae,0xf6,0xac,0x28,0xbd,0xed,0x83,0xb4,0x7a,0x5c,0x7d,0x8b,0x7c,0x35,0x86,0x44,0x2c,0xeb,0xb7,0x69,0x47,0x40,0xc0,0x3f,0x58,0xf6,0xc2,0xf5,0x7b,0xb3,0x59,0xc6,0xba,0xe6,0xc4,0x80,0xc2,0x76,0xb3,0x0b,0x9b,0x1d,0x6d,0xdd,0xd3,0x0e,0x97,0x44,0xf9,0x0b,0x45,0x58,0x95,0x9a,0xb0,0x23,0xe2,0xcd,0x57,0xfa,0xac,0xd0,0x48,0x71,0xe6,0xab,0x7d,0xe4,0x26,0x0f,0xb6,0x37,0x3a,0x2f,0x62,0x97,0xa1,0xd1,0xf1,0x94,0x03,0x96,0xe9,0x7e,0xce,0x08,0x42,0xdb,0x3b,0x6d,0x33,0x91,0x41,0x23,0x16}, + {0xf6,0x7f,0x26,0xf6,0xde,0x99,0xe4,0xb9,0x43,0x08,0x2c,0x74,0x7b,0xca,0x72,0x77,0xb1,0xf2,0xa4,0xe9,0x3f,0x15,0xa0,0x23,0x06,0x50,0xd0,0xd5,0xec,0xdf,0xdf,0x2c,0x40,0x86,0xf3,0x1f,0xd6,0x9c,0x49,0xdd,0xa0,0x25,0x36,0x06,0xc3,0x9b,0xcd,0x29,0xc3,0x3d,0xd7,0x3d,0x02,0xd8,0xe2,0x51,0x31,0x92,0x3b,0x20,0x7a,0x70,0x25,0x4a,0x6a,0xed,0xf6,0x53,0x8a,0x66,0xb7,0x2a,0xa1,0x70,0xd1,0x1d,0x58,0x42,0x42,0x30,0x61,0x01,0xe2,0x3a,0x4c,0x14,0x00,0x40,0xfc,0x49,0x8e,0x24,0x6d,0x89,0x21,0x57}, + {0xae,0x1b,0x18,0xfd,0x17,0x55,0x6e,0x0b,0xb4,0x63,0xb9,0x2b,0x9f,0x62,0x22,0x90,0x25,0x46,0x06,0x32,0xe9,0xbc,0x09,0x55,0xda,0x13,0x3c,0xf6,0x74,0xdd,0x8e,0x57,0x4e,0xda,0xd0,0xa1,0x91,0x50,0x5d,0x28,0x08,0x3e,0xfe,0xb5,0xa7,0x6f,0xaa,0x4b,0xb3,0x93,0x93,0xe1,0x7c,0x17,0xe5,0x63,0xfd,0x30,0xb0,0xc4,0xaf,0x35,0xc9,0x03,0x3d,0x0c,0x2b,0x49,0xc6,0x76,0x72,0x99,0xfc,0x05,0xe2,0xdf,0xc4,0xc2,0xcc,0x47,0x3c,0x3a,0x62,0xdd,0x84,0x9b,0xd2,0xdc,0xa2,0xc7,0x88,0x02,0x59,0xab,0xc2,0x3e}, + {0xb9,0x7b,0xd8,0xe4,0x7b,0xd2,0xa0,0xa1,0xed,0x1a,0x39,0x61,0xeb,0x4d,0x8b,0xa9,0x83,0x9b,0xcb,0x73,0xd0,0xdd,0xa0,0x99,0xce,0xca,0x0f,0x20,0x5a,0xc2,0xd5,0x2d,0xcb,0xd1,0x32,0xae,0x09,0x3a,0x21,0xa7,0xd5,0xc2,0xf5,0x40,0xdf,0x87,0x2b,0x0f,0x29,0xab,0x1e,0xe8,0xc6,0xa4,0xae,0x0b,0x5e,0xac,0xdb,0x6a,0x6c,0xf6,0x1b,0x0e,0x7e,0x88,0x2c,0x79,0xe9,0xd5,0xab,0xe2,0x5d,0x6d,0x92,0xcb,0x18,0x00,0x02,0x1a,0x1e,0x5f,0xae,0xba,0xcd,0x69,0xba,0xbf,0x5f,0x8f,0xe8,0x5a,0xb3,0x48,0x05,0x73}, + {0xee,0xb8,0xa8,0xcb,0xa3,0x51,0x35,0xc4,0x16,0x5f,0x11,0xb2,0x1d,0x6f,0xa2,0x65,0x50,0x38,0x8c,0xab,0x52,0x4f,0x0f,0x76,0xca,0xb8,0x1d,0x41,0x3b,0x44,0x43,0x30,0x34,0xe3,0xd6,0xa1,0x4b,0x09,0x5b,0x80,0x19,0x3f,0x35,0x09,0x77,0xf1,0x3e,0xbf,0x2b,0x70,0x22,0x06,0xcb,0x06,0x3f,0x42,0xdd,0x45,0x78,0xd8,0x77,0x22,0x5a,0x58,0x62,0x89,0xd4,0x33,0x82,0x5f,0x8a,0xa1,0x7f,0x25,0x78,0xec,0xb5,0xc4,0x98,0x66,0xff,0x41,0x3e,0x37,0xa5,0x6f,0x8e,0xa7,0x1f,0x98,0xef,0x50,0x89,0x27,0x56,0x76}, + {0xc0,0xc8,0x1f,0xd5,0x59,0xcf,0xc3,0x38,0xf2,0xb6,0x06,0x05,0xfd,0xd2,0xed,0x9b,0x8f,0x0e,0x57,0xab,0x9f,0x10,0xbf,0x26,0xa6,0x46,0xb8,0xc1,0xa8,0x60,0x41,0x3f,0x9d,0xcf,0x86,0xea,0xa3,0x73,0x70,0xe1,0xdc,0x5f,0x15,0x07,0xb7,0xfb,0x8c,0x3a,0x8e,0x8a,0x83,0x31,0xfc,0xe7,0x53,0x48,0x16,0xf6,0x13,0xb6,0x84,0xf4,0xbb,0x28,0x7c,0x6c,0x13,0x6f,0x5c,0x2f,0x61,0xf2,0xbe,0x11,0xdd,0xf6,0x07,0xd1,0xea,0xaf,0x33,0x6f,0xde,0x13,0xd2,0x9a,0x7e,0x52,0x5d,0xf7,0x88,0x81,0x35,0xcb,0x79,0x1e}, + {0xf1,0xe3,0xf7,0xee,0xc3,0x36,0x34,0x01,0xf8,0x10,0x9e,0xfe,0x7f,0x6a,0x8b,0x82,0xfc,0xde,0xf9,0xbc,0xe5,0x08,0xf9,0x7f,0x31,0x38,0x3b,0x3a,0x1b,0x95,0xd7,0x65,0x81,0x81,0xe0,0xf5,0xd8,0x53,0xe9,0x77,0xd9,0xde,0x9d,0x29,0x44,0x0c,0xa5,0x84,0xe5,0x25,0x45,0x86,0x0c,0x2d,0x6c,0xdc,0xf4,0xf2,0xd1,0x39,0x2d,0xb5,0x8a,0x47,0x59,0xd1,0x52,0x92,0xd3,0xa4,0xa6,0x66,0x07,0xc8,0x1a,0x87,0xbc,0xe1,0xdd,0xe5,0x6f,0xc9,0xc1,0xa6,0x40,0x6b,0x2c,0xb8,0x14,0x22,0x21,0x1a,0x41,0x7a,0xd8,0x16}, + {0x15,0x62,0x06,0x42,0x5a,0x7e,0xbd,0xb3,0xc1,0x24,0x5a,0x0c,0xcd,0xe3,0x9b,0x87,0xb7,0x94,0xf9,0xd6,0xb1,0x5d,0xc0,0x57,0xa6,0x8c,0xf3,0x65,0x81,0x7c,0xf8,0x28,0x83,0x05,0x4e,0xd5,0xe2,0xd5,0xa4,0xfb,0xfa,0x99,0xbd,0x2e,0xd7,0xaf,0x1f,0xe2,0x8f,0x77,0xe9,0x6e,0x73,0xc2,0x7a,0x49,0xde,0x6d,0x5a,0x7a,0x57,0x0b,0x99,0x1f,0xd6,0xf7,0xe8,0x1b,0xad,0x4e,0x34,0xa3,0x8f,0x79,0xea,0xac,0xeb,0x50,0x1e,0x7d,0x52,0xe0,0x0d,0x52,0x9e,0x56,0xc6,0x77,0x3e,0x6d,0x4d,0x53,0xe1,0x2f,0x88,0x45}, + {0xd6,0x83,0x79,0x75,0x5d,0x34,0x69,0x66,0xa6,0x11,0xaa,0x17,0x11,0xed,0xb6,0x62,0x8f,0x12,0x5e,0x98,0x57,0x18,0xdd,0x7d,0xdd,0xf6,0x26,0xf6,0xb8,0xe5,0x8f,0x68,0xe4,0x6f,0x3c,0x94,0x29,0x99,0xac,0xd8,0xa2,0x92,0x83,0xa3,0x61,0xf1,0xf9,0xb5,0xf3,0x9a,0xc8,0xbe,0x13,0xdb,0x99,0x26,0x74,0xf0,0x05,0xe4,0x3c,0x84,0xcf,0x7d,0xc0,0x32,0x47,0x4a,0x48,0xd6,0x90,0x6c,0x99,0x32,0x56,0xca,0xfd,0x43,0x21,0xd5,0xe1,0xc6,0x5d,0x91,0xc3,0x28,0xbe,0xb3,0x1b,0x19,0x27,0x73,0x7e,0x68,0x39,0x67}, + {0xa6,0x75,0x56,0x38,0x14,0x20,0x78,0xef,0xe8,0xa9,0xfd,0xaa,0x30,0x9f,0x64,0xa2,0xcb,0xa8,0xdf,0x5c,0x50,0xeb,0xd1,0x4c,0xb3,0xc0,0x4d,0x1d,0xba,0x5a,0x11,0x46,0xc0,0x1a,0x0c,0xc8,0x9d,0xcc,0x6d,0xa6,0x36,0xa4,0x38,0x1b,0xf4,0x5c,0xa0,0x97,0xc6,0xd7,0xdb,0x95,0xbe,0xf3,0xeb,0xa7,0xab,0x7d,0x7e,0x8d,0xf6,0xb8,0xa0,0x7d,0x76,0xda,0xb5,0xc3,0x53,0x19,0x0f,0xd4,0x9b,0x9e,0x11,0x21,0x73,0x6f,0xac,0x1d,0x60,0x59,0xb2,0xfe,0x21,0x60,0xcc,0x03,0x4b,0x4b,0x67,0x83,0x7e,0x88,0x5f,0x5a}, + {0x11,0x3d,0xa1,0x70,0xcf,0x01,0x63,0x8f,0xc4,0xd0,0x0d,0x35,0x15,0xb8,0xce,0xcf,0x7e,0xa4,0xbc,0xa4,0xd4,0x97,0x02,0xf7,0x34,0x14,0x4d,0xe4,0x56,0xb6,0x69,0x36,0xb9,0x43,0xa6,0xa0,0xd3,0x28,0x96,0x9e,0x64,0x20,0xc3,0xe6,0x00,0xcb,0xc3,0xb5,0x32,0xec,0x2d,0x7c,0x89,0x02,0x53,0x9b,0x0c,0xc7,0xd1,0xd5,0xe2,0x7a,0xe3,0x43,0x33,0xe1,0xa6,0xed,0x06,0x3f,0x7e,0x38,0xc0,0x3a,0xa1,0x99,0x51,0x1d,0x30,0x67,0x11,0x38,0x26,0x36,0xf8,0xd8,0x5a,0xbd,0xbe,0xe9,0xd5,0x4f,0xcd,0xe6,0x21,0x6a}, + {0x5f,0xe6,0x46,0x30,0x0a,0x17,0xc6,0xf1,0x24,0x35,0xd2,0x00,0x2a,0x2a,0x71,0x58,0x55,0xb7,0x82,0x8c,0x3c,0xbd,0xdb,0x69,0x57,0xff,0x95,0xa1,0xf1,0xf9,0x6b,0x58,0xe3,0xb2,0x99,0x66,0x12,0x29,0x41,0xef,0x01,0x13,0x8d,0x70,0x47,0x08,0xd3,0x71,0xbd,0xb0,0x82,0x11,0xd0,0x32,0x54,0x32,0x36,0x8b,0x1e,0x00,0x07,0x1b,0x37,0x45,0x0b,0x79,0xf8,0x5e,0x8d,0x08,0xdb,0xa6,0xe5,0x37,0x09,0x61,0xdc,0xf0,0x78,0x52,0xb8,0x6e,0xa1,0x61,0xd2,0x49,0x03,0xac,0x79,0x21,0xe5,0x90,0x37,0xb0,0xaf,0x0e}, + {0x2f,0x04,0x48,0x37,0xc1,0x55,0x05,0x96,0x11,0xaa,0x0b,0x82,0xe6,0x41,0x9a,0x21,0x0c,0x6d,0x48,0x73,0x38,0xf7,0x81,0x1c,0x61,0xc6,0x02,0x5a,0x67,0xcc,0x9a,0x30,0x1d,0xae,0x75,0x0f,0x5e,0x80,0x40,0x51,0x30,0xcc,0x62,0x26,0xe3,0xfb,0x02,0xec,0x6d,0x39,0x92,0xea,0x1e,0xdf,0xeb,0x2c,0xb3,0x5b,0x43,0xc5,0x44,0x33,0xae,0x44,0xee,0x43,0xa5,0xbb,0xb9,0x89,0xf2,0x9c,0x42,0x71,0xc9,0x5a,0x9d,0x0e,0x76,0xf3,0xaa,0x60,0x93,0x4f,0xc6,0xe5,0x82,0x1d,0x8f,0x67,0x94,0x7f,0x1b,0x22,0xd5,0x62}, + {0x6d,0x93,0xd0,0x18,0x9c,0x29,0x4c,0x52,0x0c,0x1a,0x0c,0x8a,0x6c,0xb5,0x6b,0xc8,0x31,0x86,0x4a,0xdb,0x2e,0x05,0x75,0xa3,0x62,0x45,0x75,0xbc,0xe4,0xfd,0x0e,0x5c,0x3c,0x7a,0xf7,0x3a,0x26,0xd4,0x85,0x75,0x4d,0x14,0xe9,0xfe,0x11,0x7b,0xae,0xdf,0x3d,0x19,0xf7,0x59,0x80,0x70,0x06,0xa5,0x37,0x20,0x92,0x83,0x53,0x9a,0xf2,0x14,0xf5,0xd7,0xb2,0x25,0xdc,0x7e,0x71,0xdf,0x40,0x30,0xb5,0x99,0xdb,0x70,0xf9,0x21,0x62,0x4c,0xed,0xc3,0xb7,0x34,0x92,0xda,0x3e,0x09,0xee,0x7b,0x5c,0x36,0x72,0x5e}, + {0x7f,0x21,0x71,0x45,0x07,0xfc,0x5b,0x57,0x5b,0xd9,0x94,0x06,0x5d,0x67,0x79,0x37,0x33,0x1e,0x19,0xf4,0xbb,0x37,0x0a,0x9a,0xbc,0xea,0xb4,0x47,0x4c,0x10,0xf1,0x77,0x3e,0xb3,0x08,0x2f,0x06,0x39,0x93,0x7d,0xbe,0x32,0x9f,0xdf,0xe5,0x59,0x96,0x5b,0xfd,0xbd,0x9e,0x1f,0xad,0x3d,0xff,0xac,0xb7,0x49,0x73,0xcb,0x55,0x05,0xb2,0x70,0x4c,0x2c,0x11,0x55,0xc5,0x13,0x51,0xbe,0xcd,0x1f,0x88,0x9a,0x3a,0x42,0x88,0x66,0x47,0x3b,0x50,0x5e,0x85,0x77,0x66,0x44,0x4a,0x40,0x06,0x4a,0x8f,0x39,0x34,0x0e}, + {0xe8,0xbd,0xce,0x3e,0xd9,0x22,0x7d,0xb6,0x07,0x2f,0x82,0x27,0x41,0xe8,0xb3,0x09,0x8d,0x6d,0x5b,0xb0,0x1f,0xa6,0x3f,0x74,0x72,0x23,0x36,0x8a,0x36,0x05,0x54,0x5e,0x28,0x19,0x4b,0x3e,0x09,0x0b,0x93,0x18,0x40,0xf6,0xf3,0x73,0x0e,0xe1,0xe3,0x7d,0x6f,0x5d,0x39,0x73,0xda,0x17,0x32,0xf4,0x3e,0x9c,0x37,0xca,0xd6,0xde,0x8a,0x6f,0x9a,0xb2,0xb7,0xfd,0x3d,0x12,0x40,0xe3,0x91,0xb2,0x1a,0xa2,0xe1,0x97,0x7b,0x48,0x9e,0x94,0xe6,0xfd,0x02,0x7d,0x96,0xf9,0x97,0xde,0xd3,0xc8,0x2e,0xe7,0x0d,0x78}, + {0xbc,0xe7,0x9a,0x08,0x45,0x85,0xe2,0x0a,0x06,0x4d,0x7f,0x1c,0xcf,0xde,0x8d,0x38,0xb8,0x11,0x48,0x0a,0x51,0x15,0xac,0x38,0xe4,0x8c,0x92,0x71,0xf6,0x8b,0xb2,0x0e,0x72,0x27,0xf4,0x00,0xf3,0xea,0x1f,0x67,0xaa,0x41,0x8c,0x2a,0x2a,0xeb,0x72,0x8f,0x92,0x32,0x37,0x97,0xd7,0x7f,0xa1,0x29,0xa6,0x87,0xb5,0x32,0xad,0xc6,0xef,0x1d,0xa7,0x95,0x51,0xef,0x1a,0xbe,0x5b,0xaf,0xed,0x15,0x7b,0x91,0x77,0x12,0x8c,0x14,0x2e,0xda,0xe5,0x7a,0xfb,0xf7,0x91,0x29,0x67,0x28,0xdd,0xf8,0x1b,0x20,0x7d,0x46}, + {0xad,0x4f,0xef,0x74,0x9a,0x91,0xfe,0x95,0xa2,0x08,0xa3,0xf6,0xec,0x7b,0x82,0x3a,0x01,0x7b,0xa4,0x09,0xd3,0x01,0x4e,0x96,0x97,0xc7,0xa3,0x5b,0x4f,0x3c,0xc4,0x71,0xa9,0xe7,0x7a,0x56,0xbd,0xf4,0x1e,0xbc,0xbd,0x98,0x44,0xd6,0xb2,0x4c,0x62,0x3f,0xc8,0x4e,0x1f,0x2c,0xd2,0x64,0x10,0xe4,0x01,0x40,0x38,0xba,0xa5,0xc5,0xf9,0x2e,0xcd,0x74,0x9e,0xfa,0xf6,0x6d,0xfd,0xb6,0x7a,0x26,0xaf,0xe4,0xbc,0x78,0x82,0xf1,0x0e,0x99,0xef,0xf1,0xd0,0xb3,0x55,0x82,0x93,0xf2,0xc5,0x90,0xa3,0x8c,0x75,0x5a}, + {0x95,0x24,0x46,0xd9,0x10,0x27,0xb7,0xa2,0x03,0x50,0x7d,0xd5,0xd2,0xc6,0xa8,0x3a,0xca,0x87,0xb4,0xa0,0xbf,0x00,0xd4,0xe3,0xec,0x72,0xeb,0xb3,0x44,0xe2,0xba,0x2d,0x94,0xdc,0x61,0x1d,0x8b,0x91,0xe0,0x8c,0x66,0x30,0x81,0x9a,0x46,0x36,0xed,0x8d,0xd3,0xaa,0xe8,0xaf,0x29,0xa8,0xe6,0xd4,0x3f,0xd4,0x39,0xf6,0x27,0x80,0x73,0x0a,0xcc,0xe1,0xff,0x57,0x2f,0x4a,0x0f,0x98,0x43,0x98,0x83,0xe1,0x0d,0x0d,0x67,0x00,0xfd,0x15,0xfb,0x49,0x4a,0x3f,0x5c,0x10,0x9c,0xa6,0x26,0x51,0x63,0xca,0x98,0x26}, + {0x78,0xba,0xb0,0x32,0x88,0x31,0x65,0xe7,0x8b,0xff,0x5c,0x92,0xf7,0x31,0x18,0x38,0xcc,0x1f,0x29,0xa0,0x91,0x1b,0xa8,0x08,0x07,0xeb,0xca,0x49,0xcc,0x3d,0xb4,0x1f,0x0e,0xd9,0x3d,0x5e,0x2f,0x70,0x3d,0x2e,0x86,0x53,0xd2,0xe4,0x18,0x09,0x3f,0x9e,0x6a,0xa9,0x4d,0x02,0xf6,0x3e,0x77,0x5e,0x32,0x33,0xfa,0x4a,0x0c,0x4b,0x00,0x3c,0x2b,0xb8,0xf4,0x06,0xac,0x46,0xa9,0x9a,0xf3,0xc4,0x06,0xa8,0xa5,0x84,0xa2,0x1c,0x87,0x47,0xcd,0xc6,0x5f,0x26,0xd3,0x3e,0x17,0xd2,0x1f,0xcd,0x01,0xfd,0x43,0x6b}, + {0x44,0xc5,0x97,0x46,0x4b,0x5d,0xa7,0xc7,0xbf,0xff,0x0f,0xdf,0x48,0xf8,0xfd,0x15,0x5a,0x78,0x46,0xaa,0xeb,0xb9,0x68,0x28,0x14,0xf7,0x52,0x5b,0x10,0xd7,0x68,0x5a,0xf3,0x0e,0x76,0x3e,0x58,0x42,0xc7,0xb5,0x90,0xb9,0x0a,0xee,0xb9,0x52,0xdc,0x75,0x3f,0x92,0x2b,0x07,0xc2,0x27,0x14,0xbf,0xf0,0xd9,0xf0,0x6f,0x2d,0x0b,0x42,0x73,0x06,0x1e,0x85,0x9e,0xcb,0xf6,0x2c,0xaf,0xc4,0x38,0x22,0xc6,0x13,0x39,0x59,0x8f,0x73,0xf3,0xfb,0x99,0x96,0xb8,0x8a,0xda,0x9e,0xbc,0x34,0xea,0x2f,0x63,0xb5,0x3d}, + {0xd8,0xd9,0x5d,0xf7,0x2b,0xee,0x6e,0xf4,0xa5,0x59,0x67,0x39,0xf6,0xb1,0x17,0x0d,0x73,0x72,0x9e,0x49,0x31,0xd1,0xf2,0x1b,0x13,0x5f,0xd7,0x49,0xdf,0x1a,0x32,0x04,0xd5,0x25,0x98,0x82,0xb1,0x90,0x49,0x2e,0x91,0x89,0x9a,0x3e,0x87,0xeb,0xea,0xed,0xf8,0x4a,0x70,0x4c,0x39,0x3d,0xf0,0xee,0x0e,0x2b,0xdf,0x95,0xa4,0x7e,0x19,0x59,0xae,0x5a,0xe5,0xe4,0x19,0x60,0xe1,0x04,0xe9,0x92,0x2f,0x7e,0x7a,0x43,0x7b,0xe7,0xa4,0x9a,0x15,0x6f,0xc1,0x2d,0xce,0xc7,0xc0,0x0c,0xd7,0xf4,0xc1,0xfd,0xea,0x45}, + {0x2b,0xd7,0x45,0x80,0x85,0x01,0x84,0x69,0x51,0x06,0x2f,0xcf,0xa2,0xfa,0x22,0x4c,0xc6,0x2d,0x22,0x6b,0x65,0x36,0x1a,0x94,0xde,0xda,0x62,0x03,0xc8,0xeb,0x5e,0x5a,0xed,0xb1,0xcc,0xcf,0x24,0x46,0x0e,0xb6,0x95,0x03,0x5c,0xbd,0x92,0xc2,0xdb,0x59,0xc9,0x81,0x04,0xdc,0x1d,0x9d,0xa0,0x31,0x40,0xd9,0x56,0x5d,0xea,0xce,0x73,0x3f,0xc6,0x8d,0x4e,0x0a,0xd1,0xbf,0xa7,0xb7,0x39,0xb3,0xc9,0x44,0x7e,0x00,0x57,0xbe,0xfa,0xae,0x57,0x15,0x7f,0x20,0xc1,0x60,0xdb,0x18,0x62,0x26,0x91,0x88,0x05,0x26}, + {0x04,0xff,0x60,0x83,0xa6,0x04,0xf7,0x59,0xf4,0xe6,0x61,0x76,0xde,0x3f,0xd9,0xc3,0x51,0x35,0x87,0x12,0x73,0x2a,0x1b,0x83,0x57,0x5d,0x61,0x4e,0x2e,0x0c,0xad,0x54,0x42,0xe5,0x76,0xc6,0x3c,0x8e,0x81,0x4c,0xad,0xcc,0xce,0x03,0x93,0x2c,0x42,0x5e,0x08,0x9f,0x12,0xb4,0xca,0xcc,0x07,0xec,0xb8,0x43,0x44,0xb2,0x10,0xfa,0xed,0x0d,0x2a,0x52,0x2b,0xb8,0xd5,0x67,0x3b,0xee,0xeb,0xc1,0xa5,0x9f,0x46,0x63,0xf1,0x36,0xd3,0x9f,0xc1,0x6e,0xf2,0xd2,0xb4,0xa5,0x08,0x94,0x7a,0xa7,0xba,0xb2,0xec,0x62}, + {0x3d,0x2b,0x15,0x61,0x52,0x79,0xed,0xe5,0xd1,0xd7,0xdd,0x0e,0x7d,0x35,0x62,0x49,0x71,0x4c,0x6b,0xb9,0xd0,0xc8,0x82,0x74,0xbe,0xd8,0x66,0xa9,0x19,0xf9,0x59,0x2e,0x74,0x28,0xb6,0xaf,0x36,0x28,0x07,0x92,0xa5,0x04,0xe1,0x79,0x85,0x5e,0xcd,0x5f,0x4a,0xa1,0x30,0xc6,0xad,0x01,0xad,0x5a,0x98,0x3f,0x66,0x75,0x50,0x3d,0x91,0x61,0xda,0x31,0x32,0x1a,0x36,0x2d,0xc6,0x0d,0x70,0x02,0x20,0x94,0x32,0x58,0x47,0xfa,0xce,0x94,0x95,0x3f,0x51,0x01,0xd8,0x02,0x5c,0x5d,0xc0,0x31,0xa1,0xc2,0xdb,0x3d}, + {0x4b,0xc5,0x5e,0xce,0xf9,0x0f,0xdc,0x9a,0x0d,0x13,0x2f,0x8c,0x6b,0x2a,0x9c,0x03,0x15,0x95,0xf8,0xf0,0xc7,0x07,0x80,0x02,0x6b,0xb3,0x04,0xac,0x14,0x83,0x96,0x78,0x14,0xbb,0x96,0x27,0xa2,0x57,0xaa,0xf3,0x21,0xda,0x07,0x9b,0xb7,0xba,0x3a,0x88,0x1c,0x39,0xa0,0x31,0x18,0xe2,0x4b,0xe5,0xf9,0x05,0x32,0xd8,0x38,0xfb,0xe7,0x5e,0x8e,0x6a,0x44,0x41,0xcb,0xfd,0x8d,0x53,0xf9,0x37,0x49,0x43,0xa9,0xfd,0xac,0xa5,0x78,0x8c,0x3c,0x26,0x8d,0x90,0xaf,0x46,0x09,0x0d,0xca,0x9b,0x3c,0x63,0xd0,0x61}, + {0x66,0x25,0xdb,0xff,0x35,0x49,0x74,0x63,0xbb,0x68,0x0b,0x78,0x89,0x6b,0xbd,0xc5,0x03,0xec,0x3e,0x55,0x80,0x32,0x1b,0x6f,0xf5,0xd7,0xae,0x47,0xd8,0x5f,0x96,0x6e,0xdf,0x73,0xfc,0xf8,0xbc,0x28,0xa3,0xad,0xfc,0x37,0xf0,0xa6,0x5d,0x69,0x84,0xee,0x09,0xa9,0xc2,0x38,0xdb,0xb4,0x7f,0x63,0xdc,0x7b,0x06,0xf8,0x2d,0xac,0x23,0x5b,0x7b,0x52,0x80,0xee,0x53,0xb9,0xd2,0x9a,0x8d,0x6d,0xde,0xfa,0xaa,0x19,0x8f,0xe8,0xcf,0x82,0x0e,0x15,0x04,0x17,0x71,0x0e,0xdc,0xde,0x95,0xdd,0xb9,0xbb,0xb9,0x79}, + {0xc2,0x26,0x31,0x6a,0x40,0x55,0xb3,0xeb,0x93,0xc3,0xc8,0x68,0xa8,0x83,0x63,0xd2,0x82,0x7a,0xb9,0xe5,0x29,0x64,0x0c,0x6c,0x47,0x21,0xfd,0xc9,0x58,0xf1,0x65,0x50,0x74,0x73,0x9f,0x8e,0xae,0x7d,0x99,0xd1,0x16,0x08,0xbb,0xcf,0xf8,0xa2,0x32,0xa0,0x0a,0x5f,0x44,0x6d,0x12,0xba,0x6c,0xcd,0x34,0xb8,0xcc,0x0a,0x46,0x11,0xa8,0x1b,0x54,0x99,0x42,0x0c,0xfb,0x69,0x81,0x70,0x67,0xcf,0x6e,0xd7,0xac,0x00,0x46,0xe1,0xba,0x45,0xe6,0x70,0x8a,0xb9,0xaa,0x2e,0xf2,0xfa,0xa4,0x58,0x9e,0xf3,0x81,0x39}, + {0x93,0x0a,0x23,0x59,0x75,0x8a,0xfb,0x18,0x5d,0xf4,0xe6,0x60,0x69,0x8f,0x16,0x1d,0xb5,0x3c,0xa9,0x14,0x45,0xa9,0x85,0x3a,0xfd,0xd0,0xac,0x05,0x37,0x08,0xdc,0x38,0xde,0x6f,0xe6,0x6d,0xa5,0xdf,0x45,0xc8,0x3a,0x48,0x40,0x2c,0x00,0xa5,0x52,0xe1,0x32,0xf6,0xb4,0xc7,0x63,0xe1,0xd2,0xe9,0x65,0x1b,0xbc,0xdc,0x2e,0x45,0xf4,0x30,0x40,0x97,0x75,0xc5,0x82,0x27,0x6d,0x85,0xcc,0xbe,0x9c,0xf9,0x69,0x45,0x13,0xfa,0x71,0x4e,0xea,0xc0,0x73,0xfc,0x44,0x88,0x69,0x24,0x3f,0x59,0x1a,0x9a,0x2d,0x63}, + {0xa6,0xcb,0x07,0xb8,0x15,0x6b,0xbb,0xf6,0xd7,0xf0,0x54,0xbc,0xdf,0xc7,0x23,0x18,0x0b,0x67,0x29,0x6e,0x03,0x97,0x1d,0xbb,0x57,0x4a,0xed,0x47,0x88,0xf4,0x24,0x0b,0xa7,0x84,0x0c,0xed,0x11,0xfd,0x09,0xbf,0x3a,0x69,0x9f,0x0d,0x81,0x71,0xf0,0x63,0x79,0x87,0xcf,0x57,0x2d,0x8c,0x90,0x21,0xa2,0x4b,0xf6,0x8a,0xf2,0x7d,0x5a,0x3a,0xc7,0xea,0x1b,0x51,0xbe,0xd4,0xda,0xdc,0xf2,0xcc,0x26,0xed,0x75,0x80,0x53,0xa4,0x65,0x9a,0x5f,0x00,0x9f,0xff,0x9c,0xe1,0x63,0x1f,0x48,0x75,0x44,0xf7,0xfc,0x34}, + {0xca,0x67,0x97,0x78,0x4c,0xe0,0x97,0xc1,0x7d,0x46,0xd9,0x38,0xcb,0x4d,0x71,0xb8,0xa8,0x5f,0xf9,0x83,0x82,0x88,0xde,0x55,0xf7,0x63,0xfa,0x4d,0x16,0xdc,0x3b,0x3d,0x98,0xaa,0xcf,0x78,0xab,0x1d,0xbb,0xa5,0xf2,0x72,0x0b,0x19,0x67,0xa2,0xed,0x5c,0x8e,0x60,0x92,0x0a,0x11,0xc9,0x09,0x93,0xb0,0x74,0xb3,0x2f,0x04,0xa3,0x19,0x01,0x7d,0x17,0xc2,0xe8,0x9c,0xd8,0xa2,0x67,0xc1,0xd0,0x95,0x68,0xf6,0xa5,0x9d,0x66,0xb0,0xa2,0x82,0xb2,0xe5,0x98,0x65,0xf5,0x73,0x0a,0xe2,0xed,0xf1,0x88,0xc0,0x56}, + {0x17,0x6e,0xa8,0x10,0x11,0x3d,0x6d,0x33,0xfa,0xb2,0x75,0x0b,0x32,0x88,0xf3,0xd7,0x88,0x29,0x07,0x25,0x76,0x33,0x15,0xf9,0x87,0x8b,0x10,0x99,0x6b,0x4c,0x67,0x09,0x02,0x8f,0xf3,0x24,0xac,0x5f,0x1b,0x58,0xbd,0x0c,0xe3,0xba,0xfe,0xe9,0x0b,0xa9,0xf0,0x92,0xcf,0x8a,0x02,0x69,0x21,0x9a,0x8f,0x03,0x59,0x83,0xa4,0x7e,0x8b,0x03,0xf8,0x6f,0x31,0x99,0x21,0xf8,0x4e,0x9f,0x4f,0x8d,0xa7,0xea,0x82,0xd2,0x49,0x2f,0x74,0x31,0xef,0x5a,0xab,0xa5,0x71,0x09,0x65,0xeb,0x69,0x59,0x02,0x31,0x5e,0x6e}, + {0xfb,0x93,0xe5,0x87,0xf5,0x62,0x6c,0xb1,0x71,0x3e,0x5d,0xca,0xde,0xed,0x99,0x49,0x6d,0x3e,0xcc,0x14,0xe0,0xc1,0x91,0xb4,0xa8,0xdb,0xa8,0x89,0x47,0x11,0xf5,0x08,0x22,0x62,0x06,0x63,0x0e,0xfb,0x04,0x33,0x3f,0xba,0xac,0x87,0x89,0x06,0x35,0xfb,0xa3,0x61,0x10,0x8c,0x77,0x24,0x19,0xbd,0x20,0x86,0x83,0xd1,0x43,0xad,0x58,0x30,0xd0,0x63,0x76,0xe5,0xfd,0x0f,0x3c,0x32,0x10,0xa6,0x2e,0xa2,0x38,0xdf,0xc3,0x05,0x9a,0x4f,0x99,0xac,0xbd,0x8a,0xc7,0xbd,0x99,0xdc,0xe3,0xef,0xa4,0x9f,0x54,0x26}, + {0xd6,0xf9,0x6b,0x1e,0x46,0x5a,0x1d,0x74,0x81,0xa5,0x77,0x77,0xfc,0xb3,0x05,0x23,0xd9,0xd3,0x74,0x64,0xa2,0x74,0x55,0xd4,0xff,0xe0,0x01,0x64,0xdc,0xe1,0x26,0x19,0x6e,0x66,0x3f,0xaf,0x49,0x85,0x46,0xdb,0xa5,0x0e,0x4a,0xf1,0x04,0xcf,0x7f,0xd7,0x47,0x0c,0xba,0xa4,0xf7,0x3f,0xf2,0x3d,0x85,0x3c,0xce,0x32,0xe1,0xdf,0x10,0x3a,0xa0,0xce,0x17,0xea,0x8a,0x4e,0x7f,0xe0,0xfd,0xc1,0x1f,0x3a,0x46,0x15,0xd5,0x2f,0xf1,0xc0,0xf2,0x31,0xfd,0x22,0x53,0x17,0x15,0x5d,0x1e,0x86,0x1d,0xd0,0xa1,0x1f}, + {0x32,0x98,0x59,0x7d,0x94,0x55,0x80,0xcc,0x20,0x55,0xf1,0x37,0xda,0x56,0x46,0x1e,0x20,0x93,0x05,0x4e,0x74,0xf7,0xf6,0x99,0x33,0xcf,0x75,0x6a,0xbc,0x63,0x35,0x77,0xab,0x94,0xdf,0xd1,0x00,0xac,0xdc,0x38,0xe9,0x0d,0x08,0xd1,0xdd,0x2b,0x71,0x2e,0x62,0xe2,0xd5,0xfd,0x3e,0xe9,0x13,0x7f,0xe5,0x01,0x9a,0xee,0x18,0xed,0xfc,0x73,0xb3,0x9c,0x13,0x63,0x08,0xe9,0xb1,0x06,0xcd,0x3e,0xa0,0xc5,0x67,0xda,0x93,0xa4,0x32,0x89,0x63,0xad,0xc8,0xce,0x77,0x8d,0x44,0x4f,0x86,0x1b,0x70,0x6b,0x42,0x1f}, + {0x01,0x1c,0x91,0x41,0x4c,0x26,0xc9,0xef,0x25,0x2c,0xa2,0x17,0xb8,0xb7,0xa3,0xf1,0x47,0x14,0x0f,0xf3,0x6b,0xda,0x75,0x58,0x90,0xb0,0x31,0x1d,0x27,0xf5,0x1a,0x4e,0x52,0x25,0xa1,0x91,0xc8,0x35,0x7e,0xf1,0x76,0x9c,0x5e,0x57,0x53,0x81,0x6b,0xb7,0x3e,0x72,0x9b,0x0d,0x6f,0x40,0x83,0xfa,0x38,0xe4,0xa7,0x3f,0x1b,0xbb,0x76,0x0b,0x9b,0x93,0x92,0x7f,0xf9,0xc1,0xb8,0x08,0x6e,0xab,0x44,0xd4,0xcb,0x71,0x67,0xbe,0x17,0x80,0xbb,0x99,0x63,0x64,0xe5,0x22,0x55,0xa9,0x72,0xb7,0x1e,0xd6,0x6d,0x7b}, + {0x92,0x3d,0xf3,0x50,0xe8,0xc1,0xad,0xb7,0xcf,0xd5,0x8c,0x60,0x4f,0xfa,0x98,0x79,0xdb,0x5b,0xfc,0x8d,0xbd,0x2d,0x96,0xad,0x4f,0x2f,0x1d,0xaf,0xce,0x9b,0x3e,0x70,0xc7,0xd2,0x01,0xab,0xf9,0xab,0x30,0x57,0x18,0x3b,0x14,0x40,0xdc,0x76,0xfb,0x16,0x81,0xb2,0xcb,0xa0,0x65,0xbe,0x6c,0x86,0xfe,0x6a,0xff,0x9b,0x65,0x9b,0xfa,0x53,0x55,0x54,0x88,0x94,0xe9,0xc8,0x14,0x6c,0xe5,0xd4,0xae,0x65,0x66,0x5d,0x3a,0x84,0xf1,0x5a,0xd6,0xbc,0x3e,0xb7,0x1b,0x18,0x50,0x1f,0xc6,0xc4,0xe5,0x93,0x8d,0x39}, + {0xf3,0x48,0xe2,0x33,0x67,0xd1,0x4b,0x1c,0x5f,0x0a,0xbf,0x15,0x87,0x12,0x9e,0xbd,0x76,0x03,0x0b,0xa1,0xf0,0x8c,0x3f,0xd4,0x13,0x1b,0x19,0xdf,0x5d,0x9b,0xb0,0x53,0xf2,0xe3,0xe7,0xd2,0x60,0x7c,0x87,0xc3,0xb1,0x8b,0x82,0x30,0xa0,0xaa,0x34,0x3b,0x38,0xf1,0x9e,0x73,0xe7,0x26,0x3e,0x28,0x77,0x05,0xc3,0x02,0x90,0x9c,0x9c,0x69,0xcc,0xf1,0x46,0x59,0x23,0xa7,0x06,0xf3,0x7d,0xd9,0xe5,0xcc,0xb5,0x18,0x17,0x92,0x75,0xe9,0xb4,0x81,0x47,0xd2,0xcd,0x28,0x07,0xd9,0xcd,0x6f,0x0c,0xf3,0xca,0x51}, + {0x0a,0xe0,0x74,0x76,0x42,0xa7,0x0b,0xa6,0xf3,0x7b,0x7a,0xa1,0x70,0x85,0x0e,0x63,0xcc,0x24,0x33,0xcf,0x3d,0x56,0x58,0x37,0xaa,0xfd,0x83,0x23,0x29,0xaa,0x04,0x55,0xc7,0x54,0xac,0x18,0x9a,0xf9,0x7a,0x73,0x0f,0xb3,0x1c,0xc5,0xdc,0x78,0x33,0x90,0xc7,0x0c,0xe1,0x4c,0x33,0xbc,0x89,0x2b,0x9a,0xe9,0xf8,0x89,0xc1,0x29,0xae,0x12,0xcf,0x01,0x0d,0x1f,0xcb,0xc0,0x9e,0xa9,0xae,0xf7,0x34,0x3a,0xcc,0xef,0xd1,0x0d,0x22,0x4e,0x9c,0xd0,0x21,0x75,0xca,0x55,0xea,0xa5,0xeb,0x58,0xe9,0x4f,0xd1,0x5f}, + {0x2c,0xab,0x45,0x28,0xdf,0x2d,0xdc,0xb5,0x93,0xe9,0x7f,0x0a,0xb1,0x91,0x94,0x06,0x46,0xe3,0x02,0x40,0xd6,0xf3,0xaa,0x4d,0xd1,0x74,0x64,0x58,0x6e,0xf2,0x3f,0x09,0x8e,0xcb,0x93,0xbf,0x5e,0xfe,0x42,0x3c,0x5f,0x56,0xd4,0x36,0x51,0xa8,0xdf,0xbe,0xe8,0x20,0x42,0x88,0x9e,0x85,0xf0,0xe0,0x28,0xd1,0x25,0x07,0x96,0x3f,0xd7,0x7d,0x29,0x98,0x05,0x68,0xfe,0x24,0x0d,0xb1,0xe5,0x23,0xaf,0xdb,0x72,0x06,0x73,0x75,0x29,0xac,0x57,0xb4,0x3a,0x25,0x67,0x13,0xa4,0x70,0xb4,0x86,0xbc,0xbc,0x59,0x2f}, + {0x5f,0x13,0x17,0x99,0x42,0x7d,0x84,0x83,0xd7,0x03,0x7d,0x56,0x1f,0x91,0x1b,0xad,0xd1,0xaa,0x77,0xbe,0xd9,0x48,0x77,0x7e,0x4a,0xaf,0x51,0x2e,0x2e,0xb4,0x58,0x54,0x01,0xc3,0x91,0xb6,0x60,0xd5,0x41,0x70,0x1e,0xe7,0xd7,0xad,0x3f,0x1b,0x20,0x85,0x85,0x55,0x33,0x11,0x63,0xe1,0xc2,0x16,0xb1,0x28,0x08,0x01,0x3d,0x5e,0xa5,0x2a,0x4f,0x44,0x07,0x0c,0xe6,0x92,0x51,0xed,0x10,0x1d,0x42,0x74,0x2d,0x4e,0xc5,0x42,0x64,0xc8,0xb5,0xfd,0x82,0x4c,0x2b,0x35,0x64,0x86,0x76,0x8a,0x4a,0x00,0xe9,0x13}, + {0xdb,0xce,0x2f,0x83,0x45,0x88,0x9d,0x73,0x63,0xf8,0x6b,0xae,0xc9,0xd6,0x38,0xfa,0xf7,0xfe,0x4f,0xb7,0xca,0x0d,0xbc,0x32,0x5e,0xe4,0xbc,0x14,0x88,0x7e,0x93,0x73,0x7f,0x87,0x3b,0x19,0xc9,0x00,0x2e,0xbb,0x6b,0x50,0xdc,0xe0,0x90,0xa8,0xe3,0xec,0x9f,0x64,0xde,0x36,0xc0,0xb7,0xf3,0xec,0x1a,0x9e,0xde,0x98,0x08,0x04,0x46,0x5f,0x8d,0xf4,0x7b,0x29,0x16,0x71,0x03,0xb9,0x34,0x68,0xf0,0xd4,0x22,0x3b,0xd1,0xa9,0xc6,0xbd,0x96,0x46,0x57,0x15,0x97,0xe1,0x35,0xe8,0xd5,0x91,0xe8,0xa4,0xf8,0x2c}, + {0x67,0x0f,0x11,0x07,0x87,0xfd,0x93,0x6d,0x49,0xb5,0x38,0x7c,0xd3,0x09,0x4c,0xdd,0x86,0x6a,0x73,0xc2,0x4c,0x6a,0xb1,0x7c,0x09,0x2a,0x25,0x58,0x6e,0xbd,0x49,0x20,0xa2,0x6b,0xd0,0x17,0x7e,0x48,0xb5,0x2c,0x6b,0x19,0x50,0x39,0x1c,0x38,0xd2,0x24,0x30,0x8a,0x97,0x85,0x81,0x9c,0x65,0xd7,0xf6,0xa4,0xd6,0x91,0x28,0x7f,0x6f,0x7a,0x49,0xef,0x9a,0x6a,0x8d,0xfd,0x09,0x7d,0x0b,0xb9,0x3d,0x5b,0xbe,0x60,0xee,0xf0,0xd4,0xbf,0x9e,0x51,0x2c,0xb5,0x21,0x4c,0x1d,0x94,0x45,0xc5,0xdf,0xaa,0x11,0x60}, + {0x3c,0xf8,0x95,0xcf,0x6d,0x92,0x67,0x5f,0x71,0x90,0x28,0x71,0x61,0x85,0x7e,0x7c,0x5b,0x7a,0x8f,0x99,0xf3,0xe7,0xa1,0xd6,0xe0,0xf9,0x62,0x0b,0x1b,0xcc,0xc5,0x6f,0x90,0xf8,0xcb,0x02,0xc8,0xd0,0xde,0x63,0xaa,0x6a,0xff,0x0d,0xca,0x98,0xd0,0xfb,0x99,0xed,0xb6,0xb9,0xfd,0x0a,0x4d,0x62,0x1e,0x0b,0x34,0x79,0xb7,0x18,0xce,0x69,0xcb,0x79,0x98,0xb2,0x28,0x55,0xef,0xd1,0x92,0x90,0x7e,0xd4,0x3c,0xae,0x1a,0xdd,0x52,0x23,0x9f,0x18,0x42,0x04,0x7e,0x12,0xf1,0x01,0x71,0xe5,0x3a,0x6b,0x59,0x15}, + {0xa2,0x79,0x91,0x3f,0xd2,0x39,0x27,0x46,0xcf,0xdd,0xd6,0x97,0x31,0x12,0x83,0xff,0x8a,0x14,0xf2,0x53,0xb5,0xde,0x07,0x13,0xda,0x4d,0x5f,0x7b,0x68,0x37,0x22,0x0d,0xca,0x24,0x51,0x7e,0x16,0x31,0xff,0x09,0xdf,0x45,0xc7,0xd9,0x8b,0x15,0xe4,0x0b,0xe5,0x56,0xf5,0x7e,0x22,0x7d,0x2b,0x29,0x38,0xd1,0xb6,0xaf,0x41,0xe2,0xa4,0x3a,0xf5,0x05,0x33,0x2a,0xbf,0x38,0xc1,0x2c,0xc3,0x26,0xe9,0xa2,0x8f,0x3f,0x58,0x48,0xeb,0xd2,0x49,0x55,0xa2,0xb1,0x3a,0x08,0x6c,0xa3,0x87,0x46,0x6e,0xaa,0xfc,0x32}, + {0xf5,0x9a,0x7d,0xc5,0x8d,0x6e,0xc5,0x7b,0xf2,0xbd,0xf0,0x9d,0xed,0xd2,0x0b,0x3e,0xa3,0xe4,0xef,0x22,0xde,0x14,0xc0,0xaa,0x5c,0x6a,0xbd,0xfe,0xce,0xe9,0x27,0x46,0xdf,0xcc,0x87,0x27,0x73,0xa4,0x07,0x32,0xf8,0xe3,0x13,0xf2,0x08,0x19,0xe3,0x17,0x4e,0x96,0x0d,0xf6,0xd7,0xec,0xb2,0xd5,0xe9,0x0b,0x60,0xc2,0x36,0x63,0x6f,0x74,0x1c,0x97,0x6c,0xab,0x45,0xf3,0x4a,0x3f,0x1f,0x73,0x43,0x99,0x72,0xeb,0x88,0xe2,0x6d,0x18,0x44,0x03,0x8a,0x6a,0x59,0x33,0x93,0x62,0xd6,0x7e,0x00,0x17,0x49,0x7b}, + {0x64,0xb0,0x84,0xab,0x5c,0xfb,0x85,0x2d,0x14,0xbc,0xf3,0x89,0xd2,0x10,0x78,0x49,0x0c,0xce,0x15,0x7b,0x44,0xdc,0x6a,0x47,0x7b,0xfd,0x44,0xf8,0x76,0xa3,0x2b,0x12,0xdd,0xa2,0x53,0xdd,0x28,0x1b,0x34,0x54,0x3f,0xfc,0x42,0xdf,0x5b,0x90,0x17,0xaa,0xf4,0xf8,0xd2,0x4d,0xd9,0x92,0xf5,0x0f,0x7d,0xd3,0x8c,0xe0,0x0f,0x62,0x03,0x1d,0x54,0xe5,0xb4,0xa2,0xcd,0x32,0x02,0xc2,0x7f,0x18,0x5d,0x11,0x42,0xfd,0xd0,0x9e,0xd9,0x79,0xd4,0x7d,0xbe,0xb4,0xab,0x2e,0x4c,0xec,0x68,0x2b,0xf5,0x0b,0xc7,0x02}, + {0xbb,0x2f,0x0b,0x5d,0x4b,0xec,0x87,0xa2,0xca,0x82,0x48,0x07,0x90,0x57,0x5c,0x41,0x5c,0x81,0xd0,0xc1,0x1e,0xa6,0x44,0xe0,0xe0,0xf5,0x9e,0x40,0x0a,0x4f,0x33,0x26,0xe1,0x72,0x8d,0x45,0xbf,0x32,0xe5,0xac,0xb5,0x3c,0xb7,0x7c,0xe0,0x68,0xe7,0x5b,0xe7,0xbd,0x8b,0xee,0x94,0x7d,0xcf,0x56,0x03,0x3a,0xb4,0xfe,0xe3,0x97,0x06,0x6b,0xc0,0xa3,0x62,0xdf,0x4a,0xf0,0xc8,0xb6,0x5d,0xa4,0x6d,0x07,0xef,0x00,0xf0,0x3e,0xa9,0xd2,0xf0,0x49,0x58,0xb9,0x9c,0x9c,0xae,0x2f,0x1b,0x44,0x43,0x7f,0xc3,0x1c}, + {0x4f,0x32,0xc7,0x5c,0x5a,0x56,0x8f,0x50,0x22,0xa9,0x06,0xe5,0xc0,0xc4,0x61,0xd0,0x19,0xac,0x45,0x5c,0xdb,0xab,0x18,0xfb,0x4a,0x31,0x80,0x03,0xc1,0x09,0x68,0x6c,0xb9,0xae,0xce,0xc9,0xf1,0x56,0x66,0xd7,0x6a,0x65,0xe5,0x18,0xf8,0x15,0x5b,0x1c,0x34,0x23,0x4c,0x84,0x32,0x28,0xe7,0x26,0x38,0x68,0x19,0x2f,0x77,0x6f,0x34,0x3a,0xc8,0x6a,0xda,0xe2,0x12,0x51,0xd5,0xd2,0xed,0x51,0xe8,0xb1,0x31,0x03,0xbd,0xe9,0x62,0x72,0xc6,0x8e,0xdd,0x46,0x07,0x96,0xd0,0xc5,0xf7,0x6e,0x9f,0x1b,0x91,0x05}, + {0xbb,0x0e,0xdf,0xf5,0x83,0x99,0x33,0xc1,0xac,0x4c,0x2c,0x51,0x8f,0x75,0xf3,0xc0,0xe1,0x98,0xb3,0x0b,0x0a,0x13,0xf1,0x2c,0x62,0x0c,0x27,0xaa,0xf9,0xec,0x3c,0x6b,0xef,0xea,0x2e,0x51,0xf3,0xac,0x49,0x53,0x49,0xcb,0xc1,0x1c,0xd3,0x41,0xc1,0x20,0x8d,0x68,0x9a,0xa9,0x07,0x0c,0x18,0x24,0x17,0x2d,0x4b,0xc6,0xd1,0xf9,0x5e,0x55,0x08,0xbd,0x73,0x3b,0xba,0x70,0xa7,0x36,0x0c,0xbf,0xaf,0xa3,0x08,0xef,0x4a,0x62,0xf2,0x46,0x09,0xb4,0x98,0xff,0x37,0x57,0x9d,0x74,0x81,0x33,0xe1,0x4d,0x5f,0x67}, + {0xfc,0x82,0x17,0x6b,0x03,0x52,0x2c,0x0e,0xb4,0x83,0xad,0x6c,0x81,0x6c,0x81,0x64,0x3e,0x07,0x64,0x69,0xd9,0xbd,0xdc,0xd0,0x20,0xc5,0x64,0x01,0xf7,0x9d,0xd9,0x13,0x1d,0xb3,0xda,0x3b,0xd9,0xf6,0x2f,0xa1,0xfe,0x2d,0x65,0x9d,0x0f,0xd8,0x25,0x07,0x87,0x94,0xbe,0x9a,0xf3,0x4f,0x9c,0x01,0x43,0x3c,0xcd,0x82,0xb8,0x50,0xf4,0x60,0xca,0xc0,0xe5,0x21,0xc3,0x5e,0x4b,0x01,0xa2,0xbf,0x19,0xd7,0xc9,0x69,0xcb,0x4f,0xa0,0x23,0x00,0x75,0x18,0x1c,0x5f,0x4e,0x80,0xac,0xed,0x55,0x9e,0xde,0x06,0x1c}, + {0xe2,0xc4,0x3e,0xa3,0xd6,0x7a,0x0f,0x99,0x8e,0xe0,0x2e,0xbe,0x38,0xf9,0x08,0x66,0x15,0x45,0x28,0x63,0xc5,0x43,0xa1,0x9c,0x0d,0xb6,0x2d,0xec,0x1f,0x8a,0xf3,0x4c,0xaa,0x69,0x6d,0xff,0x40,0x2b,0xd5,0xff,0xbb,0x49,0x40,0xdc,0x18,0x0b,0x53,0x34,0x97,0x98,0x4d,0xa3,0x2f,0x5c,0x4a,0x5e,0x2d,0xba,0x32,0x7d,0x8e,0x6f,0x09,0x78,0xe7,0x5c,0xfa,0x0d,0x65,0xaa,0xaa,0xa0,0x8c,0x47,0xb5,0x48,0x2a,0x9e,0xc4,0xf9,0x5b,0x72,0x03,0x70,0x7d,0xcc,0x09,0x4f,0xbe,0x1a,0x09,0x26,0x3a,0xad,0x3c,0x37}, + {0x7c,0xf5,0xc9,0x82,0x4d,0x63,0x94,0xb2,0x36,0x45,0x93,0x24,0xe1,0xfd,0xcb,0x1f,0x5a,0xdb,0x8c,0x41,0xb3,0x4d,0x9c,0x9e,0xfc,0x19,0x44,0x45,0xd9,0xf3,0x40,0x00,0xad,0xbb,0xdd,0x89,0xfb,0xa8,0xbe,0xf1,0xcb,0xae,0xae,0x61,0xbc,0x2c,0xcb,0x3b,0x9d,0x8d,0x9b,0x1f,0xbb,0xa7,0x58,0x8f,0x86,0xa6,0x12,0x51,0xda,0x7e,0x54,0x21,0xd3,0x86,0x59,0xfd,0x39,0xe9,0xfd,0xde,0x0c,0x38,0x0a,0x51,0x89,0x2c,0x27,0xf4,0xb9,0x19,0x31,0xbb,0x07,0xa4,0x2b,0xb7,0xf4,0x4d,0x25,0x4a,0x33,0x0a,0x55,0x63}, + {0x37,0xcf,0x69,0xb5,0xed,0xd6,0x07,0x65,0xe1,0x2e,0xa5,0x0c,0xb0,0x29,0x84,0x17,0x5d,0xd6,0x6b,0xeb,0x90,0x00,0x7c,0xea,0x51,0x8f,0xf7,0xda,0xc7,0x62,0xea,0x3e,0x49,0x7b,0x54,0x72,0x45,0x58,0xba,0x9b,0xe0,0x08,0xc4,0xe2,0xfa,0xc6,0x05,0xf3,0x8d,0xf1,0x34,0xc7,0x69,0xfa,0xe8,0x60,0x7a,0x76,0x7d,0xaa,0xaf,0x2b,0xa9,0x39,0x4e,0x27,0x93,0xe6,0x13,0xc7,0x24,0x9d,0x75,0xd3,0xdb,0x68,0x77,0x85,0x63,0x5f,0x9a,0xb3,0x8a,0xeb,0x60,0x55,0x52,0x70,0xcd,0xc4,0xc9,0x65,0x06,0x6a,0x43,0x68}, + {0x27,0x3f,0x2f,0x20,0xe8,0x35,0x02,0xbc,0xb0,0x75,0xf9,0x64,0xe2,0x00,0x5c,0xc7,0x16,0x24,0x8c,0xa3,0xd5,0xe9,0xa4,0x91,0xf9,0x89,0xb7,0x8a,0xf6,0xe7,0xb6,0x17,0x7c,0x10,0x20,0xe8,0x17,0xd3,0x56,0x1e,0x65,0xe9,0x0a,0x84,0x44,0x68,0x26,0xc5,0x7a,0xfc,0x0f,0x32,0xc6,0xa1,0xe0,0xc1,0x72,0x14,0x61,0x91,0x9c,0x66,0x73,0x53,0x57,0x52,0x0e,0x9a,0xab,0x14,0x28,0x5d,0xfc,0xb3,0xca,0xc9,0x84,0x20,0x8f,0x90,0xca,0x1e,0x2d,0x5b,0x88,0xf5,0xca,0xaf,0x11,0x7d,0xf8,0x78,0xa6,0xb5,0xb4,0x1c}, + {0x6c,0xfc,0x4a,0x39,0x6b,0xc0,0x64,0xb6,0xb1,0x5f,0xda,0x98,0x24,0xde,0x88,0x0c,0x34,0xd8,0xca,0x4b,0x16,0x03,0x8d,0x4f,0xa2,0x34,0x74,0xde,0x78,0xca,0x0b,0x33,0xe7,0x07,0xa0,0xa2,0x62,0xaa,0x74,0x6b,0xb1,0xc7,0x71,0xf0,0xb0,0xe0,0x11,0xf3,0x23,0xe2,0x0b,0x00,0x38,0xe4,0x07,0x57,0xac,0x6e,0xef,0x82,0x2d,0xfd,0xc0,0x2d,0x4e,0x74,0x19,0x11,0x84,0xff,0x2e,0x98,0x24,0x47,0x07,0x2b,0x96,0x5e,0x69,0xf9,0xfb,0x53,0xc9,0xbf,0x4f,0xc1,0x8a,0xc5,0xf5,0x1c,0x9f,0x36,0x1b,0xbe,0x31,0x3c}, + {0xee,0x8a,0x94,0x08,0x4d,0x86,0xf4,0xb0,0x6f,0x1c,0xba,0x91,0xee,0x19,0xdc,0x07,0x58,0xa1,0xac,0xa6,0xae,0xcd,0x75,0x79,0xbb,0xd4,0x62,0x42,0x13,0x61,0x0b,0x33,0x72,0x42,0xcb,0xf9,0x93,0xbc,0x68,0xc1,0x98,0xdb,0xce,0xc7,0x1f,0x71,0xb8,0xae,0x7a,0x8d,0xac,0x34,0xaa,0x52,0x0e,0x7f,0xbb,0x55,0x7d,0x7e,0x09,0xc1,0xce,0x41,0x8a,0x80,0x6d,0xa2,0xd7,0x19,0x96,0xf7,0x6d,0x15,0x9e,0x1d,0x9e,0xd4,0x1f,0xbb,0x27,0xdf,0xa1,0xdb,0x6c,0xc3,0xd7,0x73,0x7d,0x77,0x28,0x1f,0xd9,0x4c,0xb4,0x26}, + {0x75,0x74,0x38,0x8f,0x47,0x48,0xf0,0x51,0x3c,0xcb,0xbe,0x9c,0xf4,0xbc,0x5d,0xb2,0x55,0x20,0x9f,0xd9,0x44,0x12,0xab,0x9a,0xd6,0xa5,0x10,0x1c,0x6c,0x9e,0x70,0x2c,0x83,0x03,0x73,0x62,0x93,0xf2,0xb7,0xe1,0x2c,0x8a,0xca,0xeb,0xff,0x79,0x52,0x4b,0x14,0x13,0xd4,0xbf,0x8a,0x77,0xfc,0xda,0x0f,0x61,0x72,0x9c,0x14,0x10,0xeb,0x7d,0x7a,0xee,0x66,0x87,0x6a,0xaf,0x62,0xcb,0x0e,0xcd,0x53,0x55,0x04,0xec,0xcb,0x66,0xb5,0xe4,0x0b,0x0f,0x38,0x01,0x80,0x58,0xea,0xe2,0x2c,0xf6,0x9f,0x8e,0xe6,0x08}, + {0xad,0x30,0xc1,0x4b,0x0a,0x50,0xad,0x34,0x9c,0xd4,0x0b,0x3d,0x49,0xdb,0x38,0x8d,0xbe,0x89,0x0a,0x50,0x98,0x3d,0x5c,0xa2,0x09,0x3b,0xba,0xee,0x87,0x3f,0x1f,0x2f,0xf9,0xf2,0xb8,0x0a,0xd5,0x09,0x2d,0x2f,0xdf,0x23,0x59,0xc5,0x8d,0x21,0xb9,0xac,0xb9,0x6c,0x76,0x73,0x26,0x34,0x8f,0x4a,0xf5,0x19,0xf7,0x38,0xd7,0x3b,0xb1,0x4c,0x4a,0xb6,0x15,0xe5,0x75,0x8c,0x84,0xf7,0x38,0x90,0x4a,0xdb,0xba,0x01,0x95,0xa5,0x50,0x1b,0x75,0x3f,0x3f,0x31,0x0d,0xc2,0xe8,0x2e,0xae,0xc0,0x53,0xe3,0xa1,0x19}, + {0xc3,0x05,0xfa,0xba,0x60,0x75,0x1c,0x7d,0x61,0x5e,0xe5,0xc6,0xa0,0xa0,0xe1,0xb3,0x73,0x64,0xd6,0xc0,0x18,0x97,0x52,0xe3,0x86,0x34,0x0c,0xc2,0x11,0x6b,0x54,0x41,0xbd,0xbd,0x96,0xd5,0xcd,0x72,0x21,0xb4,0x40,0xfc,0xee,0x98,0x43,0x45,0xe0,0x93,0xb5,0x09,0x41,0xb4,0x47,0x53,0xb1,0x9f,0x34,0xae,0x66,0x02,0x99,0xd3,0x6b,0x73,0xb4,0xb3,0x34,0x93,0x50,0x2d,0x53,0x85,0x73,0x65,0x81,0x60,0x4b,0x11,0xfd,0x46,0x75,0x83,0x5c,0x42,0x30,0x5f,0x5f,0xcc,0x5c,0xab,0x7f,0xb8,0xa2,0x95,0x22,0x41}, + {0xe9,0xd6,0x7e,0xf5,0x88,0x9b,0xc9,0x19,0x25,0xc8,0xf8,0x6d,0x26,0xcb,0x93,0x53,0x73,0xd2,0x0a,0xb3,0x13,0x32,0xee,0x5c,0x34,0x2e,0x2d,0xb5,0xeb,0x53,0xe1,0x14,0xc6,0xea,0x93,0xe2,0x61,0x52,0x65,0x2e,0xdb,0xac,0x33,0x21,0x03,0x92,0x5a,0x84,0x6b,0x99,0x00,0x79,0xcb,0x75,0x09,0x46,0x80,0xdd,0x5a,0x19,0x8d,0xbb,0x60,0x07,0x8a,0x81,0xe6,0xcd,0x17,0x1a,0x3e,0x41,0x84,0xa0,0x69,0xed,0xa9,0x6d,0x15,0x57,0xb1,0xcc,0xca,0x46,0x8f,0x26,0xbf,0x2c,0xf2,0xc5,0x3a,0xc3,0x9b,0xbe,0x34,0x6b}, + {0xb2,0xc0,0x78,0x3a,0x64,0x2f,0xdf,0xf3,0x7c,0x02,0x2e,0xf2,0x1e,0x97,0x3e,0x4c,0xa3,0xb5,0xc1,0x49,0x5e,0x1c,0x7d,0xec,0x2d,0xdd,0x22,0x09,0x8f,0xc1,0x12,0x20,0xd3,0xf2,0x71,0x65,0x65,0x69,0xfc,0x11,0x7a,0x73,0x0e,0x53,0x45,0xe8,0xc9,0xc6,0x35,0x50,0xfe,0xd4,0xa2,0xe7,0x3a,0xe3,0x0b,0xd3,0x6d,0x2e,0xb6,0xc7,0xb9,0x01,0x29,0x9d,0xc8,0x5a,0xe5,0x55,0x0b,0x88,0x63,0xa7,0xa0,0x45,0x1f,0x24,0x83,0x14,0x1f,0x6c,0xe7,0xc2,0xdf,0xef,0x36,0x3d,0xe8,0xad,0x4b,0x4e,0x78,0x5b,0xaf,0x08}, + {0x33,0x25,0x1f,0x88,0xdc,0x99,0x34,0x28,0xb6,0x23,0x93,0x77,0xda,0x25,0x05,0x9d,0xf4,0x41,0x34,0x67,0xfb,0xdd,0x7a,0x89,0x8d,0x16,0x3a,0x16,0x71,0x9d,0xb7,0x32,0x4b,0x2c,0xcc,0x89,0xd2,0x14,0x73,0xe2,0x8d,0x17,0x87,0xa2,0x11,0xbd,0xe4,0x4b,0xce,0x64,0x33,0xfa,0xd6,0x28,0xd5,0x18,0x6e,0x82,0xd9,0xaf,0xd5,0xc1,0x23,0x64,0x6a,0xb3,0xfc,0xed,0xd9,0xf8,0x85,0xcc,0xf9,0xe5,0x46,0x37,0x8f,0xc2,0xbc,0x22,0xcd,0xd3,0xe5,0xf9,0x38,0xe3,0x9d,0xe4,0xcc,0x2d,0x3e,0xc1,0xfb,0x5e,0x0a,0x48}, + {0x71,0x20,0x62,0x01,0x0b,0xe7,0x51,0x0b,0xc5,0xaf,0x1d,0x8b,0xcf,0x05,0xb5,0x06,0xcd,0xab,0x5a,0xef,0x61,0xb0,0x6b,0x2c,0x31,0xbf,0xb7,0x0c,0x60,0x27,0xaa,0x47,0x1f,0x22,0xce,0x42,0xe4,0x4c,0x61,0xb6,0x28,0x39,0x05,0x4c,0xcc,0x9d,0x19,0x6e,0x03,0xbe,0x1c,0xdc,0xa4,0xb4,0x3f,0x66,0x06,0x8e,0x1c,0x69,0x47,0x1d,0xb3,0x24,0xc3,0xf8,0x15,0xc0,0xed,0x1e,0x54,0x2a,0x7c,0x3f,0x69,0x7c,0x7e,0xfe,0xa4,0x11,0xd6,0x78,0xa2,0x4e,0x13,0x66,0xaf,0xf0,0x94,0xa0,0xdd,0x14,0x5d,0x58,0x5b,0x54}, + {0x0f,0x3a,0xd4,0xa0,0x5e,0x27,0xbf,0x67,0xbe,0xee,0x9b,0x08,0x34,0x8e,0xe6,0xad,0x2e,0xe7,0x79,0xd4,0x4c,0x13,0x89,0x42,0x54,0x54,0xba,0x32,0xc3,0xf9,0x62,0x0f,0xe1,0x21,0xb3,0xe3,0xd0,0xe4,0x04,0x62,0x95,0x1e,0xff,0x28,0x7a,0x63,0xaa,0x3b,0x9e,0xbd,0x99,0x5b,0xfd,0xcf,0x0c,0x0b,0x71,0xd0,0xc8,0x64,0x3e,0xdc,0x22,0x4d,0x39,0x5f,0x3b,0xd6,0x89,0x65,0xb4,0xfc,0x61,0xcf,0xcb,0x57,0x3f,0x6a,0xae,0x5c,0x05,0xfa,0x3a,0x95,0xd2,0xc2,0xba,0xfe,0x36,0x14,0x37,0x36,0x1a,0xa0,0x0f,0x1c}, + {0xff,0x3d,0x94,0x22,0xb6,0x04,0xc6,0xd2,0xa0,0xb3,0xcf,0x44,0xce,0xbe,0x8c,0xbc,0x78,0x86,0x80,0x97,0xf3,0x4f,0x25,0x5d,0xbf,0xa6,0x1c,0x3b,0x4f,0x61,0xa3,0x0f,0x50,0x6a,0x93,0x8c,0x0e,0x2b,0x08,0x69,0xb6,0xc5,0xda,0xc1,0x35,0xa0,0xc9,0xf9,0x34,0xb6,0xdf,0xc4,0x54,0x3e,0xb7,0x6f,0x40,0xc1,0x2b,0x1d,0x9b,0x41,0x05,0x40,0xf0,0x82,0xbe,0xb9,0xbd,0xfe,0x03,0xa0,0x90,0xac,0x44,0x3a,0xaf,0xc1,0x89,0x20,0x8e,0xfa,0x54,0x19,0x91,0x9f,0x49,0xf8,0x42,0xab,0x40,0xef,0x8a,0x21,0xba,0x1f}, + {0x3e,0xf5,0xc8,0xfa,0x48,0x94,0x54,0xab,0x41,0x37,0xa6,0x7b,0x9a,0xe8,0xf6,0x81,0x01,0x5e,0x2b,0x6c,0x7d,0x6c,0xfd,0x74,0x42,0x6e,0xc8,0xa8,0xca,0x3a,0x2e,0x39,0x94,0x01,0x7b,0x3e,0x04,0x57,0x3e,0x4f,0x7f,0xaf,0xda,0x08,0xee,0x3e,0x1d,0xa8,0xf1,0xde,0xdc,0x99,0xab,0xc6,0x39,0xc8,0xd5,0x61,0x77,0xff,0x13,0x5d,0x53,0x6c,0xaf,0x35,0x8a,0x3e,0xe9,0x34,0xbd,0x4c,0x16,0xe8,0x87,0x58,0x44,0x81,0x07,0x2e,0xab,0xb0,0x9a,0xf2,0x76,0x9c,0x31,0x19,0x3b,0xc1,0x0a,0xd5,0xe4,0x7f,0xe1,0x25}, + {0x76,0xf6,0x04,0x1e,0xd7,0x9b,0x28,0x0a,0x95,0x0f,0x42,0xd6,0x52,0x1c,0x8e,0x20,0xab,0x1f,0x69,0x34,0xb0,0xd8,0x86,0x51,0x51,0xb3,0x9f,0x2a,0x44,0x51,0x57,0x25,0xa7,0x21,0xf1,0x76,0xf5,0x7f,0x5f,0x91,0xe3,0x87,0xcd,0x2f,0x27,0x32,0x4a,0xc3,0x26,0xe5,0x1b,0x4d,0xde,0x2f,0xba,0xcc,0x9b,0x89,0x69,0x89,0x8f,0x82,0xba,0x6b,0x01,0x39,0xfe,0x90,0x66,0xbc,0xd1,0xe2,0xd5,0x7a,0x99,0xa0,0x18,0x4a,0xb5,0x4c,0xd4,0x60,0x84,0xaf,0x14,0x69,0x1d,0x97,0xe4,0x7b,0x6b,0x7f,0x4f,0x50,0x9d,0x55}, + {0xd5,0x54,0xeb,0xb3,0x78,0x83,0x73,0xa7,0x7c,0x3c,0x55,0xa5,0x66,0xd3,0x69,0x1d,0xba,0x00,0x28,0xf9,0x62,0xcf,0x26,0x0a,0x17,0x32,0x7e,0x80,0xd5,0x12,0xab,0x01,0xfd,0x66,0xd2,0xf6,0xe7,0x91,0x48,0x9c,0x1b,0x78,0x07,0x03,0x9b,0xa1,0x44,0x07,0x3b,0xe2,0x61,0x60,0x1d,0x8f,0x38,0x88,0x0e,0xd5,0x4b,0x35,0xa3,0xa6,0x3e,0x12,0x96,0x2d,0xe3,0x41,0x90,0x18,0x8d,0x11,0x48,0x58,0x31,0xd8,0xc2,0xe3,0xed,0xb9,0xd9,0x45,0x32,0xd8,0x71,0x42,0xab,0x1e,0x54,0xa1,0x18,0xc9,0xe2,0x61,0x39,0x4a}, + {0xa0,0xbb,0xe6,0xf8,0xe0,0x3b,0xdc,0x71,0x0a,0xe3,0xff,0x7e,0x34,0xf8,0xce,0xd6,0x6a,0x47,0x3a,0xe1,0x5f,0x42,0x92,0xa9,0x63,0xb7,0x1d,0xfb,0xe3,0xbc,0xd6,0x2c,0x1e,0x3f,0x23,0xf3,0x44,0xd6,0x27,0x03,0x16,0xf0,0xfc,0x34,0x0e,0x26,0x9a,0x49,0x79,0xb9,0xda,0xf2,0x16,0xa7,0xb5,0x83,0x1f,0x11,0xd4,0x9b,0xad,0xee,0xac,0x68,0x10,0xc2,0xd7,0xf3,0x0e,0xc9,0xb4,0x38,0x0c,0x04,0xad,0xb7,0x24,0x6e,0x8e,0x30,0x23,0x3e,0xe7,0xb7,0xf1,0xd9,0x60,0x38,0x97,0xf5,0x08,0xb5,0xd5,0x60,0x57,0x59}, + {0x97,0x63,0xaa,0x04,0xe1,0xbf,0x29,0x61,0xcb,0xfc,0xa7,0xa4,0x08,0x00,0x96,0x8f,0x58,0x94,0x90,0x7d,0x89,0xc0,0x8b,0x3f,0xa9,0x91,0xb2,0xdc,0x3e,0xa4,0x9f,0x70,0x90,0x27,0x02,0xfd,0xeb,0xcb,0x2a,0x88,0x60,0x57,0x11,0xc4,0x05,0x33,0xaf,0x89,0xf4,0x73,0x34,0x7d,0xe3,0x92,0xf4,0x65,0x2b,0x5a,0x51,0x54,0xdf,0xc5,0xb2,0x2c,0xca,0x2a,0xfd,0x63,0x8c,0x5d,0x0a,0xeb,0xff,0x4e,0x69,0x2e,0x66,0xc1,0x2b,0xd2,0x3a,0xb0,0xcb,0xf8,0x6e,0xf3,0x23,0x27,0x1f,0x13,0xc8,0xf0,0xec,0x29,0xf0,0x70}, + {0x33,0x3e,0xed,0x2e,0xb3,0x07,0x13,0x46,0xe7,0x81,0x55,0xa4,0x33,0x2f,0x04,0xae,0x66,0x03,0x5f,0x19,0xd3,0x49,0x44,0xc9,0x58,0x48,0x31,0x6c,0x8a,0x5d,0x7d,0x0b,0xb9,0xb0,0x10,0x5e,0xaa,0xaf,0x6a,0x2a,0xa9,0x1a,0x04,0xef,0x70,0xa3,0xf0,0x78,0x1f,0xd6,0x3a,0xaa,0x77,0xfb,0x3e,0x77,0xe1,0xd9,0x4b,0xa7,0xa2,0xa5,0xec,0x44,0x43,0xd5,0x95,0x7b,0x32,0x48,0xd4,0x25,0x1d,0x0f,0x34,0xa3,0x00,0x83,0xd3,0x70,0x2b,0xc5,0xe1,0x60,0x1c,0x53,0x1c,0xde,0xe4,0xe9,0x7d,0x2c,0x51,0x24,0x22,0x27}, + {0x2e,0x34,0xc5,0x49,0xaf,0x92,0xbc,0x1a,0xd0,0xfa,0xe6,0xb2,0x11,0xd8,0xee,0xff,0x29,0x4e,0xc8,0xfc,0x8d,0x8c,0xa2,0xef,0x43,0xc5,0x4c,0xa4,0x18,0xdf,0xb5,0x11,0xfc,0x75,0xa9,0x42,0x8a,0xbb,0x7b,0xbf,0x58,0xa3,0xad,0x96,0x77,0x39,0x5c,0x8c,0x48,0xaa,0xed,0xcd,0x6f,0xc7,0x7f,0xe2,0xa6,0x20,0xbc,0xf6,0xd7,0x5f,0x73,0x19,0x66,0x42,0xc8,0x42,0xd0,0x90,0xab,0xe3,0x7e,0x54,0x19,0x7f,0x0f,0x8e,0x84,0xeb,0xb9,0x97,0xa4,0x65,0xd0,0xa1,0x03,0x25,0x5f,0x89,0xdf,0x91,0x11,0x91,0xef,0x0f} +}; diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-batchverify.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-batchverify.h new file mode 100644 index 000000000..7c64cce78 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-batchverify.h @@ -0,0 +1,275 @@ +/* + Ed25519 batch verification +*/ + +#define max_batch_size 64 +#define heap_batch_size ((max_batch_size * 2) + 1) + +/* which limb is the 128th bit in? */ +static const size_t limb128bits = (128 + bignum256modm_bits_per_limb - 1) / bignum256modm_bits_per_limb; + +typedef size_t heap_index_t; + +typedef struct batch_heap_t { + unsigned char r[heap_batch_size][16]; /* 128 bit random values */ + ge25519 points[heap_batch_size]; + bignum256modm scalars[heap_batch_size]; + heap_index_t heap[heap_batch_size]; + size_t size; +} batch_heap; + +/* swap two values in the heap */ +static void +heap_swap(heap_index_t *heap, size_t a, size_t b) { + heap_index_t temp; + temp = heap[a]; + heap[a] = heap[b]; + heap[b] = temp; +} + +/* add the scalar at the end of the list to the heap */ +static void +heap_insert_next(batch_heap *heap) { + size_t node = heap->size, parent; + heap_index_t *pheap = heap->heap; + bignum256modm *scalars = heap->scalars; + + /* insert at the bottom */ + pheap[node] = (heap_index_t)node; + + /* sift node up to its sorted spot */ + parent = (node - 1) / 2; + while (node && lt256_modm_batch(scalars[pheap[parent]], scalars[pheap[node]], bignum256modm_limb_size - 1)) { + heap_swap(pheap, parent, node); + node = parent; + parent = (node - 1) / 2; + } + heap->size++; +} + +/* update the heap when the root element is updated */ +static void +heap_updated_root(batch_heap *heap, size_t limbsize) { + size_t node, parent, childr, childl; + heap_index_t *pheap = heap->heap; + bignum256modm *scalars = heap->scalars; + + /* sift root to the bottom */ + parent = 0; + node = 1; + childl = 1; + childr = 2; + while ((childr < heap->size)) { + node = lt256_modm_batch(scalars[pheap[childl]], scalars[pheap[childr]], limbsize) ? childr : childl; + heap_swap(pheap, parent, node); + parent = node; + childl = (parent * 2) + 1; + childr = childl + 1; + } + + /* sift root back up to its sorted spot */ + parent = (node - 1) / 2; + while (node && lte256_modm_batch(scalars[pheap[parent]], scalars[pheap[node]], limbsize)) { + heap_swap(pheap, parent, node); + node = parent; + parent = (node - 1) / 2; + } +} + +/* build the heap with count elements, count must be >= 3 */ +static void +heap_build(batch_heap *heap, size_t count) { + heap->heap[0] = 0; + heap->size = 0; + while (heap->size < count) + heap_insert_next(heap); +} + +/* extend the heap to contain new_count elements */ +static void +heap_extend(batch_heap *heap, size_t new_count) { + while (heap->size < new_count) + heap_insert_next(heap); +} + +/* get the top 2 elements of the heap */ +static void +heap_get_top2(batch_heap *heap, heap_index_t *max1, heap_index_t *max2, size_t limbsize) { + heap_index_t h0 = heap->heap[0], h1 = heap->heap[1], h2 = heap->heap[2]; + if (lt256_modm_batch(heap->scalars[h1], heap->scalars[h2], limbsize)) + h1 = h2; + *max1 = h0; + *max2 = h1; +} + +/* */ +static void +ge25519_multi_scalarmult_vartime_final(ge25519 *r, ge25519 *point, bignum256modm scalar) { + const bignum256modm_element_t topbit = ((bignum256modm_element_t)1 << (bignum256modm_bits_per_limb - 1)); + size_t limb = limb128bits; + bignum256modm_element_t flag; + + if (isone256_modm_batch(scalar)) { + /* this will happen most of the time after bos-carter */ + *r = *point; + return; + } else if (iszero256_modm_batch(scalar)) { + /* this will only happen if all scalars == 0 */ + memset(r, 0, sizeof(*r)); + r->y[0] = 1; + r->z[0] = 1; + return; + } + + *r = *point; + + /* find the limb where first bit is set */ + while (!scalar[limb]) + limb--; + + /* find the first bit */ + flag = topbit; + while ((scalar[limb] & flag) == 0) + flag >>= 1; + + /* exponentiate */ + for (;;) { + ge25519_double(r, r); + if (scalar[limb] & flag) + ge25519_add(r, r, point); + + flag >>= 1; + if (!flag) { + if (!limb--) + break; + flag = topbit; + } + } +} + +/* count must be >= 5 */ +static void +ge25519_multi_scalarmult_vartime(ge25519 *r, batch_heap *heap, size_t count) { + heap_index_t max1, max2; + + /* start with the full limb size */ + size_t limbsize = bignum256modm_limb_size - 1; + + /* whether the heap has been extended to include the 128 bit scalars */ + int extended = 0; + + /* grab an odd number of scalars to build the heap, unknown limb sizes */ + heap_build(heap, ((count + 1) / 2) | 1); + + for (;;) { + heap_get_top2(heap, &max1, &max2, limbsize); + + /* only one scalar remaining, we're done */ + if (iszero256_modm_batch(heap->scalars[max2])) + break; + + /* exhausted another limb? */ + if (!heap->scalars[max1][limbsize]) + limbsize -= 1; + + /* can we extend to the 128 bit scalars? */ + if (!extended && isatmost128bits256_modm_batch(heap->scalars[max1])) { + heap_extend(heap, count); + heap_get_top2(heap, &max1, &max2, limbsize); + extended = 1; + } + + sub256_modm_batch(heap->scalars[max1], heap->scalars[max1], heap->scalars[max2], limbsize); + ge25519_add(&heap->points[max2], &heap->points[max2], &heap->points[max1]); + heap_updated_root(heap, limbsize); + } + + ge25519_multi_scalarmult_vartime_final(r, &heap->points[max1], heap->scalars[max1]); +} + +/* not actually used for anything other than testing */ +static unsigned char batch_point_buffer[3][32]; + +static int +ge25519_is_neutral_vartime(const ge25519 *p) { + static const unsigned char zero[32] = {0}; + unsigned char point_buffer[3][32]; + curve25519_contract(point_buffer[0], p->x); + curve25519_contract(point_buffer[1], p->y); + curve25519_contract(point_buffer[2], p->z); + memcpy(batch_point_buffer[1], point_buffer[1], 32); + return (memcmp(point_buffer[0], zero, 32) == 0) && (memcmp(point_buffer[1], point_buffer[2], 32) == 0); +} + +int +ED25519_FN(ed25519_sign_open_batch) (const unsigned char **m, size_t *mlen, const unsigned char **pk, const unsigned char **RS, size_t num, int *valid) { + batch_heap ALIGN(16) batch; + ge25519 ALIGN(16) p; + bignum256modm *r_scalars; + size_t i, batchsize; + unsigned char hram[64]; + int ret = 0; + + for (i = 0; i < num; i++) + valid[i] = 1; + + while (num > 3) { + batchsize = (num > max_batch_size) ? max_batch_size : num; + + /* generate r (scalars[batchsize+1]..scalars[2*batchsize] */ + ED25519_FN(ed25519_randombytes_unsafe) (batch.r, batchsize * 16); + r_scalars = &batch.scalars[batchsize + 1]; + for (i = 0; i < batchsize; i++) + expand256_modm(r_scalars[i], batch.r[i], 16); + + /* compute scalars[0] = ((r1s1 + r2s2 + ...)) */ + for (i = 0; i < batchsize; i++) { + expand256_modm(batch.scalars[i], RS[i] + 32, 32); + mul256_modm(batch.scalars[i], batch.scalars[i], r_scalars[i]); + } + for (i = 1; i < batchsize; i++) + add256_modm(batch.scalars[0], batch.scalars[0], batch.scalars[i]); + + /* compute scalars[1]..scalars[batchsize] as r[i]*H(R[i],A[i],m[i]) */ + for (i = 0; i < batchsize; i++) { + ed25519_hram(hram, RS[i], pk[i], m[i], mlen[i]); + expand256_modm(batch.scalars[i+1], hram, 64); + mul256_modm(batch.scalars[i+1], batch.scalars[i+1], r_scalars[i]); + } + + /* compute points */ + batch.points[0] = ge25519_basepoint; + for (i = 0; i < batchsize; i++) + if (!ge25519_unpack_negative_vartime(&batch.points[i+1], pk[i])) + goto fallback; + for (i = 0; i < batchsize; i++) + if (!ge25519_unpack_negative_vartime(&batch.points[batchsize+i+1], RS[i])) + goto fallback; + + ge25519_multi_scalarmult_vartime(&p, &batch, (batchsize * 2) + 1); + if (!ge25519_is_neutral_vartime(&p)) { + ret |= 2; + + fallback: + for (i = 0; i < batchsize; i++) { + valid[i] = ED25519_FN(ed25519_sign_open) (m[i], mlen[i], pk[i], RS[i]) ? 0 : 1; + ret |= (valid[i] ^ 1); + } + } + + m += batchsize; + mlen += batchsize; + pk += batchsize; + RS += batchsize; + num -= batchsize; + valid += batchsize; + } + + for (i = 0; i < num; i++) { + valid[i] = ED25519_FN(ed25519_sign_open) (m[i], mlen[i], pk[i], RS[i]) ? 0 : 1; + ret |= (valid[i] ^ 1); + } + + return ret; +} + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-impl-base.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-impl-base.h new file mode 100644 index 000000000..48913edcb --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-impl-base.h @@ -0,0 +1,364 @@ +/* + conversions +*/ + +DONNA_INLINE static void +ge25519_p1p1_to_partial(ge25519 *r, const ge25519_p1p1 *p) { + curve25519_mul(r->x, p->x, p->t); + curve25519_mul(r->y, p->y, p->z); + curve25519_mul(r->z, p->z, p->t); +} + +DONNA_INLINE static void +ge25519_p1p1_to_full(ge25519 *r, const ge25519_p1p1 *p) { + curve25519_mul(r->x, p->x, p->t); + curve25519_mul(r->y, p->y, p->z); + curve25519_mul(r->z, p->z, p->t); + curve25519_mul(r->t, p->x, p->y); +} + +static void +ge25519_full_to_pniels(ge25519_pniels *p, const ge25519 *r) { + curve25519_sub(p->ysubx, r->y, r->x); + curve25519_add(p->xaddy, r->y, r->x); + curve25519_copy(p->z, r->z); + curve25519_mul(p->t2d, r->t, ge25519_ec2d); +} + +/* + adding & doubling +*/ + +static void +ge25519_add_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519 *q) { + bignum25519 a,b,c,d,t,u; + + curve25519_sub(a, p->y, p->x); + curve25519_add(b, p->y, p->x); + curve25519_sub(t, q->y, q->x); + curve25519_add(u, q->y, q->x); + curve25519_mul(a, a, t); + curve25519_mul(b, b, u); + curve25519_mul(c, p->t, q->t); + curve25519_mul(c, c, ge25519_ec2d); + curve25519_mul(d, p->z, q->z); + curve25519_add(d, d, d); + curve25519_sub(r->x, b, a); + curve25519_add(r->y, b, a); + curve25519_add_after_basic(r->z, d, c); + curve25519_sub_after_basic(r->t, d, c); +} + + +static void +ge25519_double_p1p1(ge25519_p1p1 *r, const ge25519 *p) { + bignum25519 a,b,c; + + curve25519_square(a, p->x); + curve25519_square(b, p->y); + curve25519_square(c, p->z); + curve25519_add_reduce(c, c, c); + curve25519_add(r->x, p->x, p->y); + curve25519_square(r->x, r->x); + curve25519_add(r->y, b, a); + curve25519_sub(r->z, b, a); + curve25519_sub_after_basic(r->x, r->x, r->y); + curve25519_sub_after_basic(r->t, c, r->z); +} + +static void +ge25519_nielsadd2_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519_niels *q, unsigned char signbit) { + const bignum25519 *qb = (const bignum25519 *)q; + bignum25519 *rb = (bignum25519 *)r; + bignum25519 a,b,c; + + curve25519_sub(a, p->y, p->x); + curve25519_add(b, p->y, p->x); + curve25519_mul(a, a, qb[signbit]); /* x for +, y for - */ + curve25519_mul(r->x, b, qb[signbit^1]); /* y for +, x for - */ + curve25519_add(r->y, r->x, a); + curve25519_sub(r->x, r->x, a); + curve25519_mul(c, p->t, q->t2d); + curve25519_add_reduce(r->t, p->z, p->z); + curve25519_copy(r->z, r->t); + curve25519_add(rb[2+signbit], rb[2+signbit], c); /* z for +, t for - */ + curve25519_sub(rb[2+(signbit^1)], rb[2+(signbit^1)], c); /* t for +, z for - */ +} + +static void +ge25519_pnielsadd_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519_pniels *q, unsigned char signbit) { + const bignum25519 *qb = (const bignum25519 *)q; + bignum25519 *rb = (bignum25519 *)r; + bignum25519 a,b,c; + + curve25519_sub(a, p->y, p->x); + curve25519_add(b, p->y, p->x); + curve25519_mul(a, a, qb[signbit]); /* ysubx for +, xaddy for - */ + curve25519_mul(r->x, b, qb[signbit^1]); /* xaddy for +, ysubx for - */ + curve25519_add(r->y, r->x, a); + curve25519_sub(r->x, r->x, a); + curve25519_mul(c, p->t, q->t2d); + curve25519_mul(r->t, p->z, q->z); + curve25519_add_reduce(r->t, r->t, r->t); + curve25519_copy(r->z, r->t); + curve25519_add(rb[2+signbit], rb[2+signbit], c); /* z for +, t for - */ + curve25519_sub(rb[2+(signbit^1)], rb[2+(signbit^1)], c); /* t for +, z for - */ +} + +static void +ge25519_double_partial(ge25519 *r, const ge25519 *p) { + ge25519_p1p1 t; + ge25519_double_p1p1(&t, p); + ge25519_p1p1_to_partial(r, &t); +} + +static void +ge25519_double(ge25519 *r, const ge25519 *p) { + ge25519_p1p1 t; + ge25519_double_p1p1(&t, p); + ge25519_p1p1_to_full(r, &t); +} + +static void +ge25519_add(ge25519 *r, const ge25519 *p, const ge25519 *q) { + ge25519_p1p1 t; + ge25519_add_p1p1(&t, p, q); + ge25519_p1p1_to_full(r, &t); +} + +static void +ge25519_nielsadd2(ge25519 *r, const ge25519_niels *q) { + bignum25519 a,b,c,e,f,g,h; + + curve25519_sub(a, r->y, r->x); + curve25519_add(b, r->y, r->x); + curve25519_mul(a, a, q->ysubx); + curve25519_mul(e, b, q->xaddy); + curve25519_add(h, e, a); + curve25519_sub(e, e, a); + curve25519_mul(c, r->t, q->t2d); + curve25519_add(f, r->z, r->z); + curve25519_add_after_basic(g, f, c); + curve25519_sub_after_basic(f, f, c); + curve25519_mul(r->x, e, f); + curve25519_mul(r->y, h, g); + curve25519_mul(r->z, g, f); + curve25519_mul(r->t, e, h); +} + +static void +ge25519_pnielsadd(ge25519_pniels *r, const ge25519 *p, const ge25519_pniels *q) { + bignum25519 a,b,c,x,y,z,t; + + curve25519_sub(a, p->y, p->x); + curve25519_add(b, p->y, p->x); + curve25519_mul(a, a, q->ysubx); + curve25519_mul(x, b, q->xaddy); + curve25519_add(y, x, a); + curve25519_sub(x, x, a); + curve25519_mul(c, p->t, q->t2d); + curve25519_mul(t, p->z, q->z); + curve25519_add(t, t, t); + curve25519_add_after_basic(z, t, c); + curve25519_sub_after_basic(t, t, c); + curve25519_mul(r->xaddy, x, t); + curve25519_mul(r->ysubx, y, z); + curve25519_mul(r->z, z, t); + curve25519_mul(r->t2d, x, y); + curve25519_copy(y, r->ysubx); + curve25519_sub(r->ysubx, r->ysubx, r->xaddy); + curve25519_add(r->xaddy, r->xaddy, y); + curve25519_mul(r->t2d, r->t2d, ge25519_ec2d); +} + + +/* + pack & unpack +*/ + +static void +ge25519_pack(unsigned char r[32], const ge25519 *p) { + bignum25519 tx, ty, zi; + unsigned char parity[32]; + curve25519_recip(zi, p->z); + curve25519_mul(tx, p->x, zi); + curve25519_mul(ty, p->y, zi); + curve25519_contract(r, ty); + curve25519_contract(parity, tx); + r[31] ^= ((parity[0] & 1) << 7); +} + +static int +ge25519_unpack_negative_vartime(ge25519 *r, const unsigned char p[32]) { + static const unsigned char zero[32] = {0}; + static const bignum25519 one = {1}; + unsigned char parity = p[31] >> 7; + unsigned char check[32]; + bignum25519 t, root, num, den, d3; + + curve25519_expand(r->y, p); + curve25519_copy(r->z, one); + curve25519_square(num, r->y); /* x = y^2 */ + curve25519_mul(den, num, ge25519_ecd); /* den = dy^2 */ + curve25519_sub_reduce(num, num, r->z); /* x = y^1 - 1 */ + curve25519_add(den, den, r->z); /* den = dy^2 + 1 */ + + /* Computation of sqrt(num/den) */ + /* 1.: computation of num^((p-5)/8)*den^((7p-35)/8) = (num*den^7)^((p-5)/8) */ + curve25519_square(t, den); + curve25519_mul(d3, t, den); + curve25519_square(r->x, d3); + curve25519_mul(r->x, r->x, den); + curve25519_mul(r->x, r->x, num); + curve25519_pow_two252m3(r->x, r->x); + + /* 2. computation of r->x = num * den^3 * (num*den^7)^((p-5)/8) */ + curve25519_mul(r->x, r->x, d3); + curve25519_mul(r->x, r->x, num); + + /* 3. Check if either of the roots works: */ + curve25519_square(t, r->x); + curve25519_mul(t, t, den); + curve25519_sub_reduce(root, t, num); + curve25519_contract(check, root); + if (!ed25519_verify(check, zero, 32)) { + curve25519_add_reduce(t, t, num); + curve25519_contract(check, t); + if (!ed25519_verify(check, zero, 32)) + return 0; + curve25519_mul(r->x, r->x, ge25519_sqrtneg1); + } + + curve25519_contract(check, r->x); + if ((check[0] & 1) == parity) { + curve25519_copy(t, r->x); + curve25519_neg(r->x, t); + } + curve25519_mul(r->t, r->x, r->y); + return 1; +} + + +/* + scalarmults +*/ + +#define S1_SWINDOWSIZE 5 +#define S1_TABLE_SIZE (1<<(S1_SWINDOWSIZE-2)) +#define S2_SWINDOWSIZE 7 +#define S2_TABLE_SIZE (1<<(S2_SWINDOWSIZE-2)) + +/* computes [s1]p1 + [s2]basepoint */ +static void +ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const bignum256modm s1, const bignum256modm s2) { + signed char slide1[256], slide2[256]; + ge25519_pniels pre1[S1_TABLE_SIZE]; + ge25519 d1; + ge25519_p1p1 t; + int32_t i; + + contract256_slidingwindow_modm(slide1, s1, S1_SWINDOWSIZE); + contract256_slidingwindow_modm(slide2, s2, S2_SWINDOWSIZE); + + ge25519_double(&d1, p1); + ge25519_full_to_pniels(pre1, p1); + for (i = 0; i < S1_TABLE_SIZE - 1; i++) + ge25519_pnielsadd(&pre1[i+1], &d1, &pre1[i]); + + /* set neutral */ + memset(r, 0, sizeof(ge25519)); + r->y[0] = 1; + r->z[0] = 1; + + i = 255; + while ((i >= 0) && !(slide1[i] | slide2[i])) + i--; + + for (; i >= 0; i--) { + ge25519_double_p1p1(&t, r); + + if (slide1[i]) { + ge25519_p1p1_to_full(r, &t); + ge25519_pnielsadd_p1p1(&t, r, &pre1[abs(slide1[i]) / 2], (unsigned char)slide1[i] >> 7); + } + + if (slide2[i]) { + ge25519_p1p1_to_full(r, &t); + ge25519_nielsadd2_p1p1(&t, r, &ge25519_niels_sliding_multiples[abs(slide2[i]) / 2], (unsigned char)slide2[i] >> 7); + } + + ge25519_p1p1_to_partial(r, &t); + } +} + + + +#if !defined(HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS) + +static uint32_t +ge25519_windowb_equal(uint32_t b, uint32_t c) { + return ((b ^ c) - 1) >> 31; +} + +static void +ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { + bignum25519 neg; + uint32_t sign = (uint32_t)((unsigned char)b >> 7); + uint32_t mask = ~(sign - 1); + uint32_t u = (b + mask) ^ mask; + uint32_t i; + + /* ysubx, xaddy, t2d in packed form. initialize to ysubx = 1, xaddy = 1, t2d = 0 */ + uint8_t packed[96] = {0}; + packed[0] = 1; + packed[32] = 1; + + for (i = 0; i < 8; i++) + curve25519_move_conditional_bytes(packed, table[(pos * 8) + i], ge25519_windowb_equal(u, i + 1)); + + /* expand in to t */ + curve25519_expand(t->ysubx, packed + 0); + curve25519_expand(t->xaddy, packed + 32); + curve25519_expand(t->t2d , packed + 64); + + /* adjust for sign */ + curve25519_swap_conditional(t->ysubx, t->xaddy, sign); + curve25519_neg(neg, t->t2d); + curve25519_swap_conditional(t->t2d, neg, sign); +} + +#endif /* HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS */ + + +/* computes [s]basepoint */ +static void +ge25519_scalarmult_base_niels(ge25519 *r, const uint8_t basepoint_table[256][96], const bignum256modm s) { + signed char b[64]; + uint32_t i; + ge25519_niels t; + + contract256_window4_modm(b, s); + + ge25519_scalarmult_base_choose_niels(&t, basepoint_table, 0, b[1]); + curve25519_sub_reduce(r->x, t.xaddy, t.ysubx); + curve25519_add_reduce(r->y, t.xaddy, t.ysubx); + memset(r->z, 0, sizeof(bignum25519)); + curve25519_copy(r->t, t.t2d); + r->z[0] = 2; + for (i = 3; i < 64; i += 2) { + ge25519_scalarmult_base_choose_niels(&t, basepoint_table, i / 2, b[i]); + ge25519_nielsadd2(r, &t); + } + ge25519_double_partial(r, r); + ge25519_double_partial(r, r); + ge25519_double_partial(r, r); + ge25519_double(r, r); + ge25519_scalarmult_base_choose_niels(&t, basepoint_table, 0, b[0]); + curve25519_mul(t.t2d, t.t2d, ge25519_ecd); + ge25519_nielsadd2(r, &t); + for(i = 2; i < 64; i += 2) { + ge25519_scalarmult_base_choose_niels(&t, basepoint_table, i / 2, b[i]); + ge25519_nielsadd2(r, &t); + } +} + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-impl-sse2.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-impl-sse2.h new file mode 100644 index 000000000..5fe341638 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-impl-sse2.h @@ -0,0 +1,390 @@ +/* + conversions +*/ + +static void +ge25519_p1p1_to_partial(ge25519 *r, const ge25519_p1p1 *p) { + packed64bignum25519 ALIGN(16) xz, tt, xzout; + curve25519_mul(r->y, p->y, p->z); + curve25519_tangle64(xz, p->x, p->z); + curve25519_tangleone64(tt, p->t); + curve25519_mul_packed64(xzout, xz, tt); + curve25519_untangle64(r->x, r->z, xzout); +} + +static void +ge25519_p1p1_to_full(ge25519 *r, const ge25519_p1p1 *p) { + packed64bignum25519 ALIGN(16) zy, xt, xx, zz, ty; + curve25519_tangle64(ty, p->t, p->y); + curve25519_tangleone64(xx, p->x); + curve25519_mul_packed64(xt, xx, ty); + curve25519_untangle64(r->x, r->t, xt); + curve25519_tangleone64(zz, p->z); + curve25519_mul_packed64(zy, zz, ty); + curve25519_untangle64(r->z, r->y, zy); +} + +static void +ge25519_full_to_pniels(ge25519_pniels *p, const ge25519 *r) { + curve25519_sub(p->ysubx, r->y, r->x); + curve25519_add(p->xaddy, r->x, r->y); + curve25519_copy(p->z, r->z); + curve25519_mul(p->t2d, r->t, ge25519_ec2d); +} + +/* + adding & doubling +*/ + +static void +ge25519_add_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519 *q) { + bignum25519 ALIGN(16) a,b,c,d; + packed32bignum25519 ALIGN(16) xx, yy, yypxx, yymxx, bd, ac, bdmac, bdpac; + packed64bignum25519 ALIGN(16) at, bu, atbu, ptz, qtz, cd; + + curve25519_tangle32(yy, p->y, q->y); + curve25519_tangle32(xx, p->x, q->x); + curve25519_add_packed32(yypxx, yy, xx); + curve25519_sub_packed32(yymxx, yy, xx); + curve25519_tangle64_from32(at, bu, yymxx, yypxx); + curve25519_mul_packed64(atbu, at, bu); + curve25519_untangle64(a, b, atbu); + curve25519_tangle64(ptz, p->t, p->z); + curve25519_tangle64(qtz, q->t, q->z); + curve25519_mul_packed64(cd, ptz, qtz); + curve25519_untangle64(c, d, cd); + curve25519_mul(c, c, ge25519_ec2d); + curve25519_add_reduce(d, d, d); + /* reduce, so no after_basic is needed later */ + curve25519_tangle32(bd, b, d); + curve25519_tangle32(ac, a, c); + curve25519_sub_packed32(bdmac, bd, ac); + curve25519_add_packed32(bdpac, bd, ac); + curve25519_untangle32(r->x, r->t, bdmac); + curve25519_untangle32(r->y, r->z, bdpac); +} + + +static void +ge25519_double_p1p1(ge25519_p1p1 *r, const ge25519 *p) { + bignum25519 ALIGN(16) a,b,c,x; + packed64bignum25519 ALIGN(16) xy, zx, ab, cx; + packed32bignum25519 ALIGN(16) xc, yz, xt, yc, ac, bc; + + curve25519_add(x, p->x, p->y); + curve25519_tangle64(xy, p->x, p->y); + curve25519_square_packed64(ab, xy); + curve25519_untangle64(a, b, ab); + curve25519_tangle64(zx, p->z, x); + curve25519_square_packed64(cx, zx); + curve25519_untangle64(c, x, cx); + curve25519_tangle32(bc, b, c); + curve25519_tangle32(ac, a, c); + curve25519_add_reduce_packed32(yc, bc, ac); + curve25519_untangle32(r->y, c, yc); + curve25519_sub(r->z, b, a); + curve25519_tangle32(yz, r->y, r->z); + curve25519_tangle32(xc, x, c); + curve25519_sub_after_basic_packed32(xt, xc, yz); + curve25519_untangle32(r->x, r->t, xt); +} + +static void +ge25519_nielsadd2_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519_niels *q, unsigned char signbit) { + const bignum25519 *qb = (const bignum25519 *)q; + bignum25519 *rb = (bignum25519 *)r; + bignum25519 ALIGN(16) a,b,c; + packed64bignum25519 ALIGN(16) ab, yx, aybx; + packed32bignum25519 ALIGN(16) bd, ac, bdac; + + curve25519_sub(a, p->y, p->x); + curve25519_add(b, p->y, p->x); + curve25519_tangle64(ab, a, b); + curve25519_tangle64(yx, qb[signbit], qb[signbit^1]); + curve25519_mul_packed64(aybx, ab, yx); + curve25519_untangle64(a, b, aybx); + curve25519_add(r->y, b, a); + curve25519_add_reduce(r->t, p->z, p->z); + curve25519_mul(c, p->t, q->t2d); + curve25519_copy(r->z, r->t); + curve25519_add(rb[2+signbit], rb[2+signbit], c); + curve25519_tangle32(bd, b, rb[2+(signbit^1)]); + curve25519_tangle32(ac, a, c); + curve25519_sub_packed32(bdac, bd, ac); + curve25519_untangle32(r->x, rb[2+(signbit^1)], bdac); +} + +static void +ge25519_pnielsadd_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519_pniels *q, unsigned char signbit) { + const bignum25519 *qb = (const bignum25519 *)q; + bignum25519 *rb = (bignum25519 *)r; + bignum25519 ALIGN(16) a,b,c; + packed64bignum25519 ALIGN(16) ab, yx, aybx, zt, zt2d, tc; + packed32bignum25519 ALIGN(16) bd, ac, bdac; + + curve25519_sub(a, p->y, p->x); + curve25519_add(b, p->y, p->x); + curve25519_tangle64(ab, a, b); + curve25519_tangle64(yx, qb[signbit], qb[signbit^1]); + curve25519_mul_packed64(aybx, ab, yx); + curve25519_untangle64(a, b, aybx); + curve25519_add(r->y, b, a); + curve25519_tangle64(zt, p->z, p->t); + curve25519_tangle64(zt2d, q->z, q->t2d); + curve25519_mul_packed64(tc, zt, zt2d); + curve25519_untangle64(r->t, c, tc); + curve25519_add_reduce(r->t, r->t, r->t); + curve25519_copy(r->z, r->t); + curve25519_add(rb[2+signbit], rb[2+signbit], c); + curve25519_tangle32(bd, b, rb[2+(signbit^1)]); + curve25519_tangle32(ac, a, c); + curve25519_sub_packed32(bdac, bd, ac); + curve25519_untangle32(r->x, rb[2+(signbit^1)], bdac); +} + +static void +ge25519_double(ge25519 *r, const ge25519 *p) { + ge25519_p1p1 ALIGN(16) t; + ge25519_double_p1p1(&t, p); + ge25519_p1p1_to_full(r, &t); +} + +static void +ge25519_add(ge25519 *r, const ge25519 *p, const ge25519 *q) { + ge25519_p1p1 ALIGN(16) t; + ge25519_add_p1p1(&t, p, q); + ge25519_p1p1_to_full(r, &t); +} + +static void +ge25519_double_partial(ge25519 *r, const ge25519 *p) { + ge25519_p1p1 ALIGN(16) t; + ge25519_double_p1p1(&t, p); + ge25519_p1p1_to_partial(r, &t); +} + +static void +ge25519_nielsadd2(ge25519 *r, const ge25519_niels *q) { + packed64bignum25519 ALIGN(16) ab, yx, aybx, eg, ff, hh, xz, ty; + packed32bignum25519 ALIGN(16) bd, ac, bdac; + bignum25519 ALIGN(16) a,b,c,d,e,f,g,h; + + curve25519_sub(a, r->y, r->x); + curve25519_add(b, r->y, r->x); + curve25519_tangle64(ab, a, b); + curve25519_tangle64(yx, q->ysubx, q->xaddy); + curve25519_mul_packed64(aybx, ab, yx); + curve25519_untangle64(a, b, aybx); + curve25519_add(h, b, a); + curve25519_add_reduce(d, r->z, r->z); + curve25519_mul(c, r->t, q->t2d); + curve25519_add(g, d, c); /* d is reduced, so no need for after_basic */ + curve25519_tangle32(bd, b, d); + curve25519_tangle32(ac, a, c); + curve25519_sub_packed32(bdac, bd, ac); /* d is reduced, so no need for after_basic */ + curve25519_untangle32(e, f, bdac); + curve25519_tangle64(eg, e, g); + curve25519_tangleone64(ff, f); + curve25519_mul_packed64(xz, eg, ff); + curve25519_untangle64(r->x, r->z, xz); + curve25519_tangleone64(hh, h); + curve25519_mul_packed64(ty, eg, hh); + curve25519_untangle64(r->t, r->y, ty); +} + +static void +ge25519_pnielsadd(ge25519_pniels *r, const ge25519 *p, const ge25519_pniels *q) { + ge25519_p1p1 ALIGN(16) t; + ge25519 ALIGN(16) f; + ge25519_pnielsadd_p1p1(&t, p, q, 0); + ge25519_p1p1_to_full(&f, &t); + ge25519_full_to_pniels(r, &f); +} + +/* + pack & unpack +*/ + +static void +ge25519_pack(unsigned char r[32], const ge25519 *p) { + bignum25519 ALIGN(16) tx, ty, zi; + unsigned char parity[32]; + curve25519_recip(zi, p->z); + curve25519_mul(tx, p->x, zi); + curve25519_mul(ty, p->y, zi); + curve25519_contract(r, ty); + curve25519_contract(parity, tx); + r[31] ^= ((parity[0] & 1) << 7); +} + + +static int +ge25519_unpack_negative_vartime(ge25519 *r, const unsigned char p[32]) { + static const bignum25519 ALIGN(16) one = {1}; + static const unsigned char zero[32] = {0}; + unsigned char parity = p[31] >> 7; + unsigned char check[32]; + bignum25519 ALIGN(16) t, root, num, den, d3; + + curve25519_expand(r->y, p); + curve25519_copy(r->z, one); + curve25519_square_times(num, r->y, 1); /* x = y^2 */ + curve25519_mul(den, num, ge25519_ecd); /* den = dy^2 */ + curve25519_sub_reduce(num, num, r->z); /* x = y^2 - 1 */ + curve25519_add(den, den, r->z); /* den = dy^2 + 1 */ + + /* Computation of sqrt(num/den) */ + /* 1.: computation of num^((p-5)/8)*den^((7p-35)/8) = (num*den^7)^((p-5)/8) */ + curve25519_square_times(t, den, 1); + curve25519_mul(d3, t, den); + curve25519_square_times(r->x, d3, 1); + curve25519_mul(r->x, r->x, den); + curve25519_mul(r->x, r->x, num); + curve25519_pow_two252m3(r->x, r->x); + + /* 2. computation of r->x = t * num * den^3 */ + curve25519_mul(r->x, r->x, d3); + curve25519_mul(r->x, r->x, num); + + /* 3. Check if either of the roots works: */ + curve25519_square_times(t, r->x, 1); + curve25519_mul(t, t, den); + curve25519_copy(root, t); + curve25519_sub_reduce(root, root, num); + curve25519_contract(check, root); + if (!ed25519_verify(check, zero, 32)) { + curve25519_add_reduce(t, t, num); + curve25519_contract(check, t); + if (!ed25519_verify(check, zero, 32)) + return 0; + curve25519_mul(r->x, r->x, ge25519_sqrtneg1); + } + + curve25519_contract(check, r->x); + if ((check[0] & 1) == parity) { + curve25519_copy(t, r->x); + curve25519_neg(r->x, t); + } + curve25519_mul(r->t, r->x, r->y); + return 1; +} + + + +/* + scalarmults +*/ + +#define S1_SWINDOWSIZE 5 +#define S1_TABLE_SIZE (1<<(S1_SWINDOWSIZE-2)) +#define S2_SWINDOWSIZE 7 +#define S2_TABLE_SIZE (1<<(S2_SWINDOWSIZE-2)) + +static void +ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const bignum256modm s1, const bignum256modm s2) { + signed char slide1[256], slide2[256]; + ge25519_pniels ALIGN(16) pre1[S1_TABLE_SIZE]; + ge25519 ALIGN(16) d1; + ge25519_p1p1 ALIGN(16) t; + int32_t i; + + contract256_slidingwindow_modm(slide1, s1, S1_SWINDOWSIZE); + contract256_slidingwindow_modm(slide2, s2, S2_SWINDOWSIZE); + + ge25519_double(&d1, p1); + ge25519_full_to_pniels(pre1, p1); + for (i = 0; i < S1_TABLE_SIZE - 1; i++) + ge25519_pnielsadd(&pre1[i+1], &d1, &pre1[i]); + + /* set neutral */ + memset(r, 0, sizeof(ge25519)); + r->y[0] = 1; + r->z[0] = 1; + + i = 255; + while ((i >= 0) && !(slide1[i] | slide2[i])) + i--; + + for (; i >= 0; i--) { + ge25519_double_p1p1(&t, r); + + if (slide1[i]) { + ge25519_p1p1_to_full(r, &t); + ge25519_pnielsadd_p1p1(&t, r, &pre1[abs(slide1[i]) / 2], (unsigned char)slide1[i] >> 7); + } + + if (slide2[i]) { + ge25519_p1p1_to_full(r, &t); + ge25519_nielsadd2_p1p1(&t, r, &ge25519_niels_sliding_multiples[abs(slide2[i]) / 2], (unsigned char)slide2[i] >> 7); + } + + ge25519_p1p1_to_partial(r, &t); + } +} + +#if !defined(HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS) + +static uint32_t +ge25519_windowb_equal(uint32_t b, uint32_t c) { + return ((b ^ c) - 1) >> 31; +} + +static void +ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { + bignum25519 ALIGN(16) neg; + uint32_t sign = (uint32_t)((unsigned char)b >> 7); + uint32_t mask = ~(sign - 1); + uint32_t u = (b + mask) ^ mask; + uint32_t i; + + /* ysubx, xaddy, t2d in packed form. initialize to ysubx = 1, xaddy = 1, t2d = 0 */ + uint8_t ALIGN(16) packed[96] = {0}; + packed[0] = 1; + packed[32] = 1; + + for (i = 0; i < 8; i++) + curve25519_move_conditional_bytes(packed, table[(pos * 8) + i], ge25519_windowb_equal(u, i + 1)); + + /* expand in to t */ + curve25519_expand(t->ysubx, packed + 0); + curve25519_expand(t->xaddy, packed + 32); + curve25519_expand(t->t2d , packed + 64); + + /* adjust for sign */ + curve25519_swap_conditional(t->ysubx, t->xaddy, sign); + curve25519_neg(neg, t->t2d); + curve25519_swap_conditional(t->t2d, neg, sign); +} + +#endif /* HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS */ + +static void +ge25519_scalarmult_base_niels(ge25519 *r, const uint8_t table[256][96], const bignum256modm s) { + signed char b[64]; + uint32_t i; + ge25519_niels ALIGN(16) t; + + contract256_window4_modm(b, s); + + ge25519_scalarmult_base_choose_niels(&t, table, 0, b[1]); + curve25519_sub_reduce(r->x, t.xaddy, t.ysubx); + curve25519_add_reduce(r->y, t.xaddy, t.ysubx); + memset(r->z, 0, sizeof(bignum25519)); + r->z[0] = 2; + curve25519_copy(r->t, t.t2d); + for (i = 3; i < 64; i += 2) { + ge25519_scalarmult_base_choose_niels(&t, table, i / 2, b[i]); + ge25519_nielsadd2(r, &t); + } + ge25519_double_partial(r, r); + ge25519_double_partial(r, r); + ge25519_double_partial(r, r); + ge25519_double(r, r); + ge25519_scalarmult_base_choose_niels(&t, table, 0, b[0]); + curve25519_mul(t.t2d, t.t2d, ge25519_ecd); + ge25519_nielsadd2(r, &t); + for(i = 2; i < 64; i += 2) { + ge25519_scalarmult_base_choose_niels(&t, table, i / 2, b[i]); + ge25519_nielsadd2(r, &t); + } +} diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-portable-identify.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-portable-identify.h new file mode 100644 index 000000000..26a264cf9 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-portable-identify.h @@ -0,0 +1,103 @@ +/* os */ +#if defined(_WIN32) || defined(_WIN64) || defined(__TOS_WIN__) || defined(__WINDOWS__) + #define OS_WINDOWS +#elif defined(sun) || defined(__sun) || defined(__SVR4) || defined(__svr4__) + #define OS_SOLARIS +#else + #include /* need this to define BSD */ + #define OS_NIX + #if defined(__linux__) + #define OS_LINUX + #elif defined(BSD) + #define OS_BSD + #if defined(MACOS_X) || (defined(__APPLE__) & defined(__MACH__)) + #define OS_OSX + #elif defined(macintosh) || defined(Macintosh) + #define OS_MAC + #elif defined(__OpenBSD__) + #define OS_OPENBSD + #endif + #endif +#endif + + +/* compiler */ +#if defined(_MSC_VER) + #define COMPILER_MSVC +#endif +#if defined(__ICC) + #define COMPILER_INTEL +#endif +#if defined(__GNUC__) + #if (__GNUC__ >= 3) + #define COMPILER_GCC ((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) + (__GNUC_PATCHLEVEL__)) + #else + #define COMPILER_GCC ((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) ) + #endif +#endif +#if defined(__PATHCC__) + #define COMPILER_PATHCC +#endif +#if defined(__clang__) + #define COMPILER_CLANG ((__clang_major__ * 10000) + (__clang_minor__ * 100) + (__clang_patchlevel__)) +#endif + + + +/* cpu */ +#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__ ) || defined(_M_X64) + #define CPU_X86_64 +#elif defined(__i586__) || defined(__i686__) || (defined(_M_IX86) && (_M_IX86 >= 500)) + #define CPU_X86 500 +#elif defined(__i486__) || (defined(_M_IX86) && (_M_IX86 >= 400)) + #define CPU_X86 400 +#elif defined(__i386__) || (defined(_M_IX86) && (_M_IX86 >= 300)) || defined(__X86__) || defined(_X86_) || defined(__I86__) + #define CPU_X86 300 +#elif defined(__ia64__) || defined(_IA64) || defined(__IA64__) || defined(_M_IA64) || defined(__ia64) + #define CPU_IA64 +#endif + +#if defined(__sparc__) || defined(__sparc) || defined(__sparcv9) + #define CPU_SPARC + #if defined(__sparcv9) + #define CPU_SPARC64 + #endif +#endif + +#if defined(powerpc) || defined(__PPC__) || defined(__ppc__) || defined(_ARCH_PPC) || defined(__powerpc__) || defined(__powerpc) || defined(POWERPC) || defined(_M_PPC) + #define CPU_PPC + #if defined(_ARCH_PWR7) + #define CPU_POWER7 + #elif defined(__64BIT__) + #define CPU_PPC64 + #else + #define CPU_PPC32 + #endif +#endif + +#if defined(__hppa__) || defined(__hppa) + #define CPU_HPPA +#endif + +#if defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) + #define CPU_ALPHA +#endif + +/* 64 bit cpu */ +#if defined(CPU_X86_64) || defined(CPU_IA64) || defined(CPU_SPARC64) || defined(__64BIT__) || defined(__LP64__) || defined(_LP64) || (defined(_MIPS_SZLONG) && (_MIPS_SZLONG == 64)) + #define CPU_64BITS +#endif + +#if defined(COMPILER_MSVC) + typedef signed char int8_t; + typedef unsigned char uint8_t; + typedef signed short int16_t; + typedef unsigned short uint16_t; + typedef signed int int32_t; + typedef unsigned int uint32_t; + typedef signed __int64 int64_t; + typedef unsigned __int64 uint64_t; +#else + #include +#endif + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna-portable.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna-portable.h new file mode 100644 index 000000000..75a53a570 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna-portable.h @@ -0,0 +1,174 @@ +#include "ed25519-donna-portable-identify.h" + +#define mul32x32_64(a,b) (((uint64_t)(a))*(b)) + +/* platform */ +#if defined(COMPILER_MSVC) + #include + #if !defined(_DEBUG) + #undef mul32x32_64 + #define mul32x32_64(a,b) __emulu(a,b) + #endif + #undef inline + #define inline __forceinline + #define DONNA_INLINE __forceinline + #define DONNA_NOINLINE __declspec(noinline) + #define ALIGN(x) __declspec(align(x)) + #define ROTL32(a,b) _rotl(a,b) + #define ROTR32(a,b) _rotr(a,b) +#else + #include + #define DONNA_INLINE inline __attribute__((always_inline)) + #define DONNA_NOINLINE __attribute__((noinline)) + /* Tor: OSX pollutes the global namespace with an ALIGN macro. */ + #undef ALIGN + #define ALIGN(x) __attribute__((aligned(x))) + #define ROTL32(a,b) (((a) << (b)) | ((a) >> (32 - b))) + #define ROTR32(a,b) (((a) >> (b)) | ((a) << (32 - b))) +#endif + +/* uint128_t */ +#if defined(CPU_64BITS) && !defined(ED25519_FORCE_32BIT) + #if defined(COMPILER_CLANG) && (COMPILER_CLANG >= 30100) + #define HAVE_NATIVE_UINT128 + typedef unsigned __int128 uint128_t; + #elif defined(COMPILER_MSVC) + #define HAVE_UINT128 + typedef struct uint128_t { + uint64_t lo, hi; + } uint128_t; + #define mul64x64_128(out,a,b) out.lo = _umul128(a,b,&out.hi); + #define shr128_pair(out,hi,lo,shift) out = __shiftright128(lo, hi, shift); + #define shl128_pair(out,hi,lo,shift) out = __shiftleft128(lo, hi, shift); + #define shr128(out,in,shift) shr128_pair(out, in.hi, in.lo, shift) + #define shl128(out,in,shift) shl128_pair(out, in.hi, in.lo, shift) + #define add128(a,b) { uint64_t p = a.lo; a.lo += b.lo; a.hi += b.hi + (a.lo < p); } + #define add128_64(a,b) { uint64_t p = a.lo; a.lo += b; a.hi += (a.lo < p); } + #define lo128(a) (a.lo) + #define hi128(a) (a.hi) + #elif defined(COMPILER_GCC) && !defined(HAVE_NATIVE_UINT128) + #if defined(__SIZEOF_INT128__) + #define HAVE_NATIVE_UINT128 + typedef unsigned __int128 uint128_t; + #elif (COMPILER_GCC >= 40400) + #define HAVE_NATIVE_UINT128 + typedef unsigned uint128_t __attribute__((mode(TI))); + #elif defined(CPU_X86_64) + #define HAVE_UINT128 + typedef struct uint128_t { + uint64_t lo, hi; + } uint128_t; + #define mul64x64_128(out,a,b) __asm__ ("mulq %3" : "=a" (out.lo), "=d" (out.hi) : "a" (a), "rm" (b)); + #define shr128_pair(out,hi,lo,shift) __asm__ ("shrdq %2,%1,%0" : "+r" (lo) : "r" (hi), "J" (shift)); out = lo; + #define shl128_pair(out,hi,lo,shift) __asm__ ("shldq %2,%1,%0" : "+r" (hi) : "r" (lo), "J" (shift)); out = hi; + #define shr128(out,in,shift) shr128_pair(out,in.hi, in.lo, shift) + #define shl128(out,in,shift) shl128_pair(out,in.hi, in.lo, shift) + #define add128(a,b) __asm__ ("addq %4,%2; adcq %5,%3" : "=r" (a.hi), "=r" (a.lo) : "1" (a.lo), "0" (a.hi), "rm" (b.lo), "rm" (b.hi) : "cc"); + #define add128_64(a,b) __asm__ ("addq %4,%2; adcq $0,%3" : "=r" (a.hi), "=r" (a.lo) : "1" (a.lo), "0" (a.hi), "rm" (b) : "cc"); + #define lo128(a) (a.lo) + #define hi128(a) (a.hi) + #endif + #endif + + #if defined(HAVE_NATIVE_UINT128) + #define HAVE_UINT128 + #define mul64x64_128(out,a,b) out = (uint128_t)a * b; + #define shr128_pair(out,hi,lo,shift) out = (uint64_t)((((uint128_t)hi << 64) | lo) >> (shift)); + #define shl128_pair(out,hi,lo,shift) out = (uint64_t)(((((uint128_t)hi << 64) | lo) << (shift)) >> 64); + #define shr128(out,in,shift) out = (uint64_t)(in >> (shift)); + #define shl128(out,in,shift) out = (uint64_t)((in << shift) >> 64); + #define add128(a,b) a += b; + #define add128_64(a,b) a += (uint64_t)b; + #define lo128(a) ((uint64_t)a) + #define hi128(a) ((uint64_t)(a >> 64)) + #endif + + #if !defined(HAVE_UINT128) + #error Need a uint128_t implementation! + #endif +#endif + +/* endian */ +#if !defined(ED25519_OPENSSLRNG) +static inline void U32TO8_LE(unsigned char *p, const uint32_t v) { + p[0] = (unsigned char)(v ); + p[1] = (unsigned char)(v >> 8); + p[2] = (unsigned char)(v >> 16); + p[3] = (unsigned char)(v >> 24); +} +#endif + +#if !defined(HAVE_UINT128) +static inline uint32_t U8TO32_LE(const unsigned char *p) { + return + (((uint32_t)(p[0]) ) | + ((uint32_t)(p[1]) << 8) | + ((uint32_t)(p[2]) << 16) | + ((uint32_t)(p[3]) << 24)); +} +#else +static inline uint64_t U8TO64_LE(const unsigned char *p) { + return + (((uint64_t)(p[0]) ) | + ((uint64_t)(p[1]) << 8) | + ((uint64_t)(p[2]) << 16) | + ((uint64_t)(p[3]) << 24) | + ((uint64_t)(p[4]) << 32) | + ((uint64_t)(p[5]) << 40) | + ((uint64_t)(p[6]) << 48) | + ((uint64_t)(p[7]) << 56)); +} + +static inline void U64TO8_LE(unsigned char *p, const uint64_t v) { + p[0] = (unsigned char)(v ); + p[1] = (unsigned char)(v >> 8); + p[2] = (unsigned char)(v >> 16); + p[3] = (unsigned char)(v >> 24); + p[4] = (unsigned char)(v >> 32); + p[5] = (unsigned char)(v >> 40); + p[6] = (unsigned char)(v >> 48); + p[7] = (unsigned char)(v >> 56); +} +#endif + +/* Tor: Detect and disable inline assembly when clang's AddressSanitizer + * is present, due to compilation failing because it runs out of registers. + * + * The alternative is to annotate `ge25519_scalarmult_base_choose_niels` + * and selectively disable AddressSanitizer insturmentation, however doing + * things this way results in a "more sanitized" binary. + */ +#if defined(__has_feature) + #if __has_feature(address_sanitizer) + #define ED25519_NO_INLINE_ASM + #endif +#endif + +/* Tor: Force enable SSE2 on 32 bit x86 systems if the compile target + * architecture supports it. This is not done on x86-64 as the non-SSE2 + * code benchmarks better, at least on Haswell. + */ +#if defined(__SSE2__) && !defined(CPU_X86_64) + /* undef in case it's manually specified... */ + #undef ED25519_SSE2 + #define ED25519_SSE2 +#endif + +/* Tor: GCC's Stack Protector freaks out and produces variable length + * buffer warnings when alignment is requested that is greater than + * STACK_BOUNDARY (x86 has special code to deal with this for SSE2). + * + * Since the only reason things are 16 byte aligned in the first place + * is for SSE2, only request variable alignment for SSE2 builds. + * + * See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59674 + */ +#if !defined(ED25519_SSE2) + #undef ALIGN + #define ALIGN(x) +#endif + +#include +#include + + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-donna.h b/src/wraith/src/ext/ed25519/donna/ed25519-donna.h new file mode 100644 index 000000000..299c8d90f --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-donna.h @@ -0,0 +1,126 @@ +/* + Public domain by Andrew M. + Modified from the amd64-51-30k implementation by + Daniel J. Bernstein + Niels Duif + Tanja Lange + Peter Schwabe + Bo-Yin Yang +*/ + + +#include "ed25519-donna-portable.h" +#include "orconfig.h" + +#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS +/* Some of the ASM here is very long strings. */ +#ifdef __clang__ +#pragma clang diagnostic ignored "-Woverlength-strings" +#else +#pragma GCC diagnostic ignored "-Woverlength-strings" +#endif +#endif + +#if defined(ED25519_SSE2) +#else + #if defined(HAVE_UINT128) && !defined(ED25519_FORCE_32BIT) + #define ED25519_64BIT + #else + #define ED25519_32BIT + #endif +#endif + +#if !defined(ED25519_NO_INLINE_ASM) + /* detect extra features first so un-needed functions can be disabled throughout */ + #if defined(ED25519_SSE2) + #if defined(COMPILER_GCC) && defined(CPU_X86) + #define ED25519_GCC_32BIT_SSE_CHOOSE + #elif defined(COMPILER_GCC) && defined(CPU_X86_64) + #define ED25519_GCC_64BIT_SSE_CHOOSE + #endif + #else + #if defined(CPU_X86_64) + #if defined(COMPILER_GCC) + #if defined(ED25519_64BIT) + #define ED25519_GCC_64BIT_X86_CHOOSE + #else + #define ED25519_GCC_64BIT_32BIT_CHOOSE + #endif + #endif + #endif + #endif +#endif + +#if defined(ED25519_SSE2) + #include "curve25519-donna-sse2.h" +#elif defined(ED25519_64BIT) + #include "curve25519-donna-64bit.h" +#else + #include "curve25519-donna-32bit.h" +#endif + +#include "curve25519-donna-helpers.h" + +/* separate uint128 check for 64 bit sse2 */ +#if defined(HAVE_UINT128) && !defined(ED25519_FORCE_32BIT) + #include "modm-donna-64bit.h" +#else + #include "modm-donna-32bit.h" +#endif + +typedef unsigned char hash_512bits[64]; + +/* + Timing safe memory compare +*/ +static int +ed25519_verify(const unsigned char *x, const unsigned char *y, size_t len) { + size_t differentbits = 0; + while (len--) + differentbits |= (*x++ ^ *y++); + /*coverity[overflow]*/ + return (int) (1 & ((differentbits - 1) >> 8)); +} + + +/* + * Arithmetic on the twisted Edwards curve -x^2 + y^2 = 1 + dx^2y^2 + * with d = -(121665/121666) = 37095705934669439343138083508754565189542113879843219016388785533085940283555 + * Base point: (15112221349535400772501151409588531511454012693041857206046113283949847762202,46316835694926478169428394003475163141307993866256225615783033603165251855960); + */ + +typedef struct ge25519_t { + bignum25519 x, y, z, t; +} ge25519; + +typedef struct ge25519_p1p1_t { + bignum25519 x, y, z, t; +} ge25519_p1p1; + +typedef struct ge25519_niels_t { + bignum25519 ysubx, xaddy, t2d; +} ge25519_niels; + +typedef struct ge25519_pniels_t { + bignum25519 ysubx, xaddy, z, t2d; +} ge25519_pniels; + +#include "ed25519-donna-basepoint-table.h" + +#if defined(ED25519_64BIT) + #include "ed25519-donna-64bit-tables.h" + #include "ed25519-donna-64bit-x86.h" +#else + #include "ed25519-donna-32bit-tables.h" + #include "ed25519-donna-64bit-x86-32bit.h" +#endif + + +#if defined(ED25519_SSE2) + #include "ed25519-donna-32bit-sse2.h" + #include "ed25519-donna-64bit-sse2.h" + #include "ed25519-donna-impl-sse2.h" +#else + #include "ed25519-donna-impl-base.h" +#endif + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-hash-custom.h b/src/wraith/src/ext/ed25519/donna/ed25519-hash-custom.h new file mode 100644 index 000000000..609451abd --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-hash-custom.h @@ -0,0 +1,42 @@ +/* + a custom hash must have a 512bit digest and implement: + + struct ed25519_hash_context; + + void ed25519_hash_init(ed25519_hash_context *ctx); + void ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen); + void ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash); + void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen); +*/ + +#include "crypto.h" + +typedef struct ed25519_hash_context { + crypto_digest_t *ctx; +} ed25519_hash_context; + + +static void +ed25519_hash_init(ed25519_hash_context *ctx) +{ + ctx->ctx = crypto_digest512_new(DIGEST_SHA512); +} +static void +ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen) +{ + crypto_digest_add_bytes(ctx->ctx, (const char *)in, inlen); +} +static void +ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash) +{ + crypto_digest_get_digest(ctx->ctx, (char *)hash, DIGEST512_LEN); + crypto_digest_free(ctx->ctx); + ctx->ctx = NULL; +} +static void +ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen) +{ + crypto_digest512((char *)hash, (const char *)in, inlen, + DIGEST_SHA512); +} + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-hash.h b/src/wraith/src/ext/ed25519/donna/ed25519-hash.h new file mode 100644 index 000000000..6ba8f5238 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-hash.h @@ -0,0 +1,219 @@ +#if defined(ED25519_REFHASH) + +/* reference/slow SHA-512. really, do not use this */ + +#define HASH_BLOCK_SIZE 128 +#define HASH_DIGEST_SIZE 64 + +typedef struct sha512_state_t { + uint64_t H[8]; + uint64_t T[2]; + uint32_t leftover; + uint8_t buffer[HASH_BLOCK_SIZE]; +} sha512_state; + +typedef sha512_state ed25519_hash_context; + +static const uint64_t sha512_constants[80] = { + 0x428a2f98d728ae22ull, 0x7137449123ef65cdull, 0xb5c0fbcfec4d3b2full, 0xe9b5dba58189dbbcull, + 0x3956c25bf348b538ull, 0x59f111f1b605d019ull, 0x923f82a4af194f9bull, 0xab1c5ed5da6d8118ull, + 0xd807aa98a3030242ull, 0x12835b0145706fbeull, 0x243185be4ee4b28cull, 0x550c7dc3d5ffb4e2ull, + 0x72be5d74f27b896full, 0x80deb1fe3b1696b1ull, 0x9bdc06a725c71235ull, 0xc19bf174cf692694ull, + 0xe49b69c19ef14ad2ull, 0xefbe4786384f25e3ull, 0x0fc19dc68b8cd5b5ull, 0x240ca1cc77ac9c65ull, + 0x2de92c6f592b0275ull, 0x4a7484aa6ea6e483ull, 0x5cb0a9dcbd41fbd4ull, 0x76f988da831153b5ull, + 0x983e5152ee66dfabull, 0xa831c66d2db43210ull, 0xb00327c898fb213full, 0xbf597fc7beef0ee4ull, + 0xc6e00bf33da88fc2ull, 0xd5a79147930aa725ull, 0x06ca6351e003826full, 0x142929670a0e6e70ull, + 0x27b70a8546d22ffcull, 0x2e1b21385c26c926ull, 0x4d2c6dfc5ac42aedull, 0x53380d139d95b3dfull, + 0x650a73548baf63deull, 0x766a0abb3c77b2a8ull, 0x81c2c92e47edaee6ull, 0x92722c851482353bull, + 0xa2bfe8a14cf10364ull, 0xa81a664bbc423001ull, 0xc24b8b70d0f89791ull, 0xc76c51a30654be30ull, + 0xd192e819d6ef5218ull, 0xd69906245565a910ull, 0xf40e35855771202aull, 0x106aa07032bbd1b8ull, + 0x19a4c116b8d2d0c8ull, 0x1e376c085141ab53ull, 0x2748774cdf8eeb99ull, 0x34b0bcb5e19b48a8ull, + 0x391c0cb3c5c95a63ull, 0x4ed8aa4ae3418acbull, 0x5b9cca4f7763e373ull, 0x682e6ff3d6b2b8a3ull, + 0x748f82ee5defb2fcull, 0x78a5636f43172f60ull, 0x84c87814a1f0ab72ull, 0x8cc702081a6439ecull, + 0x90befffa23631e28ull, 0xa4506cebde82bde9ull, 0xbef9a3f7b2c67915ull, 0xc67178f2e372532bull, + 0xca273eceea26619cull, 0xd186b8c721c0c207ull, 0xeada7dd6cde0eb1eull, 0xf57d4f7fee6ed178ull, + 0x06f067aa72176fbaull, 0x0a637dc5a2c898a6ull, 0x113f9804bef90daeull, 0x1b710b35131c471bull, + 0x28db77f523047d84ull, 0x32caab7b40c72493ull, 0x3c9ebe0a15c9bebcull, 0x431d67c49c100d4cull, + 0x4cc5d4becb3e42b6ull, 0x597f299cfc657e2aull, 0x5fcb6fab3ad6faecull, 0x6c44198c4a475817ull +}; + +static uint64_t +sha512_ROTR64(uint64_t x, int k) { + return (x >> k) | (x << (64 - k)); +} + +static uint64_t +sha512_LOAD64_BE(const uint8_t *p) { + return + ((uint64_t)p[0] << 56) | + ((uint64_t)p[1] << 48) | + ((uint64_t)p[2] << 40) | + ((uint64_t)p[3] << 32) | + ((uint64_t)p[4] << 24) | + ((uint64_t)p[5] << 16) | + ((uint64_t)p[6] << 8) | + ((uint64_t)p[7] ); +} + +static void +sha512_STORE64_BE(uint8_t *p, uint64_t v) { + p[0] = (uint8_t)(v >> 56); + p[1] = (uint8_t)(v >> 48); + p[2] = (uint8_t)(v >> 40); + p[3] = (uint8_t)(v >> 32); + p[4] = (uint8_t)(v >> 24); + p[5] = (uint8_t)(v >> 16); + p[6] = (uint8_t)(v >> 8); + p[7] = (uint8_t)(v ); +} + +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S0(x) (sha512_ROTR64(x, 28) ^ sha512_ROTR64(x, 34) ^ sha512_ROTR64(x, 39)) +#define S1(x) (sha512_ROTR64(x, 14) ^ sha512_ROTR64(x, 18) ^ sha512_ROTR64(x, 41)) +#define G0(x) (sha512_ROTR64(x, 1) ^ sha512_ROTR64(x, 8) ^ (x >> 7)) +#define G1(x) (sha512_ROTR64(x, 19) ^ sha512_ROTR64(x, 61) ^ (x >> 6)) +#define W0(in,i) (sha512_LOAD64_BE(&in[i * 8])) +#define W1(i) (G1(w[i - 2]) + w[i - 7] + G0(w[i - 15]) + w[i - 16]) +#define STEP(i) \ + t1 = S0(r[0]) + Maj(r[0], r[1], r[2]); \ + t0 = r[7] + S1(r[4]) + Ch(r[4], r[5], r[6]) + sha512_constants[i] + w[i]; \ + r[7] = r[6]; \ + r[6] = r[5]; \ + r[5] = r[4]; \ + r[4] = r[3] + t0; \ + r[3] = r[2]; \ + r[2] = r[1]; \ + r[1] = r[0]; \ + r[0] = t0 + t1; + +static void +sha512_blocks(sha512_state *S, const uint8_t *in, size_t blocks) { + uint64_t r[8], w[80], t0, t1; + size_t i; + + for (i = 0; i < 8; i++) r[i] = S->H[i]; + + while (blocks--) { + for (i = 0; i < 16; i++) { w[i] = W0(in, i); } + for (i = 16; i < 80; i++) { w[i] = W1(i); } + for (i = 0; i < 80; i++) { STEP(i); } + for (i = 0; i < 8; i++) { r[i] += S->H[i]; S->H[i] = r[i]; } + S->T[0] += HASH_BLOCK_SIZE * 8; + S->T[1] += (!S->T[0]) ? 1 : 0; + in += HASH_BLOCK_SIZE; + } +} + +static void +ed25519_hash_init(sha512_state *S) { + S->H[0] = 0x6a09e667f3bcc908ull; + S->H[1] = 0xbb67ae8584caa73bull; + S->H[2] = 0x3c6ef372fe94f82bull; + S->H[3] = 0xa54ff53a5f1d36f1ull; + S->H[4] = 0x510e527fade682d1ull; + S->H[5] = 0x9b05688c2b3e6c1full; + S->H[6] = 0x1f83d9abfb41bd6bull; + S->H[7] = 0x5be0cd19137e2179ull; + S->T[0] = 0; + S->T[1] = 0; + S->leftover = 0; +} + +static void +ed25519_hash_update(sha512_state *S, const uint8_t *in, size_t inlen) { + size_t blocks, want; + + /* handle the previous data */ + if (S->leftover) { + want = (HASH_BLOCK_SIZE - S->leftover); + want = (want < inlen) ? want : inlen; + memcpy(S->buffer + S->leftover, in, want); + S->leftover += (uint32_t)want; + if (S->leftover < HASH_BLOCK_SIZE) + return; + in += want; + inlen -= want; + sha512_blocks(S, S->buffer, 1); + } + + /* handle the current data */ + blocks = (inlen & ~(HASH_BLOCK_SIZE - 1)); + S->leftover = (uint32_t)(inlen - blocks); + if (blocks) { + sha512_blocks(S, in, blocks / HASH_BLOCK_SIZE); + in += blocks; + } + + /* handle leftover data */ + if (S->leftover) + memcpy(S->buffer, in, S->leftover); +} + +static void +ed25519_hash_final(sha512_state *S, uint8_t *hash) { + uint64_t t0 = S->T[0] + (S->leftover * 8), t1 = S->T[1]; + + S->buffer[S->leftover] = 0x80; + if (S->leftover <= 111) { + memset(S->buffer + S->leftover + 1, 0, 111 - S->leftover); + } else { + memset(S->buffer + S->leftover + 1, 0, 127 - S->leftover); + sha512_blocks(S, S->buffer, 1); + memset(S->buffer, 0, 112); + } + + sha512_STORE64_BE(S->buffer + 112, t1); + sha512_STORE64_BE(S->buffer + 120, t0); + sha512_blocks(S, S->buffer, 1); + + sha512_STORE64_BE(&hash[ 0], S->H[0]); + sha512_STORE64_BE(&hash[ 8], S->H[1]); + sha512_STORE64_BE(&hash[16], S->H[2]); + sha512_STORE64_BE(&hash[24], S->H[3]); + sha512_STORE64_BE(&hash[32], S->H[4]); + sha512_STORE64_BE(&hash[40], S->H[5]); + sha512_STORE64_BE(&hash[48], S->H[6]); + sha512_STORE64_BE(&hash[56], S->H[7]); +} + +static void +ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen) { + ed25519_hash_context ctx; + ed25519_hash_init(&ctx); + ed25519_hash_update(&ctx, in, inlen); + ed25519_hash_final(&ctx, hash); +} + +#elif defined(ED25519_CUSTOMHASH) + +#include "ed25519-hash-custom.h" + +#else + +#include + +typedef SHA512_CTX ed25519_hash_context; + +static void +ed25519_hash_init(ed25519_hash_context *ctx) { + SHA512_Init(ctx); +} + +static void +ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen) { + SHA512_Update(ctx, in, inlen); +} + +static void +ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash) { + SHA512_Final(hash, ctx); +} + +static void +ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen) { + SHA512(in, inlen, hash); +} + +#endif + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-randombytes-custom.h b/src/wraith/src/ext/ed25519/donna/ed25519-randombytes-custom.h new file mode 100644 index 000000000..3fb0959fc --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-randombytes-custom.h @@ -0,0 +1,17 @@ +/* + a custom randombytes must implement: + + void ED25519_FN(ed25519_randombytes_unsafe) (void *p, size_t len); + + ed25519_randombytes_unsafe is used by the batch verification function + to create random scalars +*/ + +/* Tor: Instead of calling OpenSSL's CSPRNG directly, call the wrapper. */ +#include "crypto.h" + +static void +ED25519_FN(ed25519_randombytes_unsafe) (void *p, size_t len) +{ + crypto_rand_unmocked(p, len); +} diff --git a/src/wraith/src/ext/ed25519/donna/ed25519-randombytes.h b/src/wraith/src/ext/ed25519/donna/ed25519-randombytes.h new file mode 100644 index 000000000..1dc629028 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519-randombytes.h @@ -0,0 +1,91 @@ +#if defined(ED25519_TEST) +/* + ISAAC+ "variant", the paper is not clear on operator precedence and other + things. This is the "first in, first out" option! + + Not threadsafe or securely initialized, only for deterministic testing +*/ +typedef struct isaacp_state_t { + uint32_t state[256]; + unsigned char buffer[1024]; + uint32_t a, b, c; + size_t left; +} isaacp_state; + +#define isaacp_step(offset, mix) \ + x = mm[i + offset]; \ + a = (a ^ (mix)) + (mm[(i + offset + 128) & 0xff]); \ + y = (a ^ b) + mm[(x >> 2) & 0xff]; \ + mm[i + offset] = y; \ + b = (x + a) ^ mm[(y >> 10) & 0xff]; \ + U32TO8_LE(out + (i + offset) * 4, b); + +static void +isaacp_mix(isaacp_state *st) { + uint32_t i, x, y; + uint32_t a = st->a, b = st->b, c = st->c; + uint32_t *mm = st->state; + unsigned char *out = st->buffer; + + c = c + 1; + b = b + c; + + for (i = 0; i < 256; i += 4) { + isaacp_step(0, ROTL32(a,13)) + isaacp_step(1, ROTR32(a, 6)) + isaacp_step(2, ROTL32(a, 2)) + isaacp_step(3, ROTR32(a,16)) + } + + st->a = a; + st->b = b; + st->c = c; + st->left = 1024; +} + +static void +isaacp_random(isaacp_state *st, void *p, size_t len) { + size_t use; + unsigned char *c = (unsigned char *)p; + while (len) { + use = (len > st->left) ? st->left : len; + memcpy(c, st->buffer + (sizeof(st->buffer) - st->left), use); + + st->left -= use; + c += use; + len -= use; + + if (!st->left) + isaacp_mix(st); + } +} + +void +ED25519_FN(ed25519_randombytes_unsafe) (void *p, size_t len) { + static int initialized = 0; + static isaacp_state rng; + + if (!initialized) { + memset(&rng, 0, sizeof(rng)); + isaacp_mix(&rng); + isaacp_mix(&rng); + initialized = 1; + } + + isaacp_random(&rng, p, len); +} +#elif defined(ED25519_CUSTOMRANDOM) + +#include "ed25519-randombytes-custom.h" + +#else + +#include + +void +ED25519_FN(ed25519_randombytes_unsafe) (void *p, size_t len) { + + RAND_bytes(p, (int) len); + +} +#endif diff --git a/src/wraith/src/ext/ed25519/donna/ed25519.c b/src/wraith/src/ext/ed25519/donna/ed25519.c new file mode 100644 index 000000000..58a755b8d --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519.c @@ -0,0 +1,150 @@ +/* + Public domain by Andrew M. + + Ed25519 reference implementation using Ed25519-donna +*/ + + +/* define ED25519_SUFFIX to have it appended to the end of each public function */ +#if !defined(ED25519_SUFFIX) +#define ED25519_SUFFIX +#endif + +#define ED25519_FN3(fn,suffix) fn##suffix +#define ED25519_FN2(fn,suffix) ED25519_FN3(fn,suffix) +#define ED25519_FN(fn) ED25519_FN2(fn,ED25519_SUFFIX) + +#include "ed25519-donna.h" +#include "ed25519.h" +#include "ed25519-randombytes.h" +#include "ed25519-hash.h" + +/* + Generates a (extsk[0..31]) and aExt (extsk[32..63]) +*/ + +DONNA_INLINE static void +ed25519_extsk(hash_512bits extsk, const ed25519_secret_key sk) { + ed25519_hash(extsk, sk, 32); + extsk[0] &= 248; + extsk[31] &= 127; + extsk[31] |= 64; +} + +static void +ed25519_hram(hash_512bits hram, const ed25519_signature RS, const ed25519_public_key pk, const unsigned char *m, size_t mlen) { + ed25519_hash_context ctx; + ed25519_hash_init(&ctx); + ed25519_hash_update(&ctx, RS, 32); + ed25519_hash_update(&ctx, pk, 32); + ed25519_hash_update(&ctx, m, mlen); + ed25519_hash_final(&ctx, hram); +} + +void +ED25519_FN(ed25519_publickey) (const ed25519_secret_key sk, ed25519_public_key pk) { + bignum256modm a; + ge25519 ALIGN(16) A; + hash_512bits extsk; + + /* A = aB */ + ed25519_extsk(extsk, sk); + expand256_modm(a, extsk, 32); + ge25519_scalarmult_base_niels(&A, ge25519_niels_base_multiples, a); + ge25519_pack(pk, &A); +} + + +void +ED25519_FN(ed25519_sign) (const unsigned char *m, size_t mlen, const ed25519_secret_key sk, const ed25519_public_key pk, ed25519_signature RS) { + ed25519_hash_context ctx; + bignum256modm r, S, a; + ge25519 ALIGN(16) R; + hash_512bits extsk, hashr, hram; + + ed25519_extsk(extsk, sk); + + /* r = H(aExt[32..64], m) */ + ed25519_hash_init(&ctx); + ed25519_hash_update(&ctx, extsk + 32, 32); + ed25519_hash_update(&ctx, m, mlen); + ed25519_hash_final(&ctx, hashr); + expand256_modm(r, hashr, 64); + + /* R = rB */ + ge25519_scalarmult_base_niels(&R, ge25519_niels_base_multiples, r); + ge25519_pack(RS, &R); + + /* S = H(R,A,m).. */ + ed25519_hram(hram, RS, pk, m, mlen); + expand256_modm(S, hram, 64); + + /* S = H(R,A,m)a */ + expand256_modm(a, extsk, 32); + mul256_modm(S, S, a); + + /* S = (r + H(R,A,m)a) */ + add256_modm(S, S, r); + + /* S = (r + H(R,A,m)a) mod L */ + contract256_modm(RS + 32, S); +} + +int +ED25519_FN(ed25519_sign_open) (const unsigned char *m, size_t mlen, const ed25519_public_key pk, const ed25519_signature RS) { + ge25519 ALIGN(16) R, A; + hash_512bits hash; + bignum256modm hram, S; + unsigned char checkR[32]; + + if ((RS[63] & 224) || !ge25519_unpack_negative_vartime(&A, pk)) + return -1; + + /* hram = H(R,A,m) */ + ed25519_hram(hash, RS, pk, m, mlen); + expand256_modm(hram, hash, 64); + + /* S */ + expand256_modm(S, RS + 32, 32); + + /* SB - H(R,A,m)A */ + ge25519_double_scalarmult_vartime(&R, &A, hram, S); + ge25519_pack(checkR, &R); + + /* check that R = SB - H(R,A,m)A */ + return ed25519_verify(RS, checkR, 32) ? 0 : -1; +} + +#include "ed25519-donna-batchverify.h" + +/* + Fast Curve25519 basepoint scalar multiplication +*/ + +void +ED25519_FN(curved25519_scalarmult_basepoint) (curved25519_key pk, const curved25519_key e) { + curved25519_key ec; + bignum256modm s; + bignum25519 ALIGN(16) yplusz, zminusy; + ge25519 ALIGN(16) p; + size_t i; + + /* clamp */ + for (i = 0; i < 32; i++) ec[i] = e[i]; + ec[0] &= 248; + ec[31] &= 127; + ec[31] |= 64; + + expand_raw256_modm(s, ec); + + /* scalar * basepoint */ + ge25519_scalarmult_base_niels(&p, ge25519_niels_base_multiples, s); + + /* u = (y + z) / (z - y) */ + curve25519_add(yplusz, p.y, p.z); + curve25519_sub(zminusy, p.z, p.y); + curve25519_recip(zminusy, zminusy); + curve25519_mul(yplusz, yplusz, zminusy); + curve25519_contract(pk, yplusz); +} + diff --git a/src/wraith/src/ext/ed25519/donna/ed25519.h b/src/wraith/src/ext/ed25519/donna/ed25519.h new file mode 100644 index 000000000..dc86675cd --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519.h @@ -0,0 +1,30 @@ +#ifndef ED25519_H +#define ED25519_H + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef unsigned char ed25519_signature[64]; +typedef unsigned char ed25519_public_key[32]; +typedef unsigned char ed25519_secret_key[32]; + +typedef unsigned char curved25519_key[32]; + +void ed25519_publickey(const ed25519_secret_key sk, ed25519_public_key pk); +int ed25519_sign_open(const unsigned char *m, size_t mlen, const ed25519_public_key pk, const ed25519_signature RS); +void ed25519_sign(const unsigned char *m, size_t mlen, const ed25519_secret_key sk, const ed25519_public_key pk, ed25519_signature RS); + +int ed25519_sign_open_batch(const unsigned char **m, size_t *mlen, const unsigned char **pk, const unsigned char **RS, size_t num, int *valid); + +void ed25519_randombytes_unsafe(void *out, size_t count); + +void curved25519_scalarmult_basepoint(curved25519_key pk, const curved25519_key e); + +#if defined(__cplusplus) +} +#endif + +#endif // ED25519_H diff --git a/src/wraith/src/ext/ed25519/donna/ed25519_donna_tor.h b/src/wraith/src/ext/ed25519/donna/ed25519_donna_tor.h new file mode 100644 index 000000000..7d7b8c062 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519_donna_tor.h @@ -0,0 +1,38 @@ +/* Added for Tor. */ +#ifndef SRC_EXT_ED25519_DONNA_H_INCLUDED_ +#define SRC_EXT_ED25519_DONNA_H_INCLUDED_ +#include + +typedef unsigned char curved25519_key[32]; + +int ed25519_sign_open_batch_donna(const unsigned char **m, size_t *mlen, const unsigned char **pk, const unsigned char **RS, size_t num, int *valid); +void curved25519_scalarmult_basepoint_donna(curved25519_key pk, const curved25519_key e); + +/* Tor specific interface to match the `ref10` glue code. */ +int ed25519_donna_selftest(void); +int ed25519_donna_seckey(unsigned char *sk); +int ed25519_donna_seckey_expand(unsigned char *sk, const unsigned char *sk_seed); +int ed25519_donna_pubkey(unsigned char *pk, const unsigned char *sk); +int ed25519_donna_keygen(unsigned char *pk, unsigned char *sk); + +int ed25519_donna_open(const unsigned char *signature, const unsigned char *m, + size_t mlen, const unsigned char *pk); + +int ed25519_donna_sign(unsigned char *sig, const unsigned char *m, size_t mlen, + const unsigned char *sk, const unsigned char *pk); + +int ed25519_donna_blind_secret_key(unsigned char *out, const unsigned char *inp, + const unsigned char *param); + +int ed25519_donna_blind_public_key(unsigned char *out, const unsigned char *inp, + const unsigned char *param); + +int ed25519_donna_pubkey_from_curve25519_pubkey(unsigned char *out, + const unsigned char *inp, int signbit); + + +int +ed25519_donna_scalarmult_with_group_order(unsigned char *out, + const unsigned char *pubkey); + +#endif diff --git a/src/wraith/src/ext/ed25519/donna/ed25519_tor.c b/src/wraith/src/ext/ed25519/donna/ed25519_tor.c new file mode 100644 index 000000000..44ec562f0 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/ed25519_tor.c @@ -0,0 +1,367 @@ +/* + Public domain by Andrew M. + + Ed25519 reference implementation using Ed25519-donna +*/ + +/* + Tor specific notes: + + This file is used by Tor instead of `ed25519.c` as the number of + changes/additions is non-trivial. + + Tor modifications to `ed25519.c`: + * 'Tab` -> ' '. + * Include `ed25519_donna_tor.h` instead of `ed25519.h`. + + * The external interface has been reworked to match that provided + by Tor's copy of the SUPERCOP `ref10` code. + + * The secret (aka private) key is now stored/used in expanded form. + + * The internal math tests from `test-internals.c` have been wrapped + in a function and the entire file is included to allow for + runtime validation. + */ + + +/* define ED25519_SUFFIX to have it appended to the end of each public function */ +#if !defined(ED25519_SUFFIX) +#define ED25519_SUFFIX +#endif + +#define ED25519_FN3(fn,suffix) fn##suffix +#define ED25519_FN2(fn,suffix) ED25519_FN3(fn,suffix) +#define ED25519_FN(fn) ED25519_FN2(fn,ED25519_SUFFIX) + +#include "orconfig.h" +#include "ed25519-donna.h" +#include "ed25519_donna_tor.h" +#include "ed25519-randombytes.h" +#include "ed25519-hash.h" + +typedef unsigned char ed25519_signature[64]; +typedef unsigned char ed25519_public_key[32]; +typedef unsigned char ed25519_secret_key[32]; + +static void ed25519_donna_gettweak(unsigned char *out, + const unsigned char *param); + +static int ED25519_FN(ed25519_sign_open) (const unsigned char *m, size_t mlen, + const ed25519_public_key pk, const ed25519_signature RS); + + +/* + Generates a (extsk[0..31]) and aExt (extsk[32..63]) +*/ + +DONNA_INLINE static void +ed25519_extsk(hash_512bits extsk, const ed25519_secret_key sk) { + ed25519_hash(extsk, sk, 32); + extsk[0] &= 248; + extsk[31] &= 127; + extsk[31] |= 64; +} + +static void +ed25519_hram(hash_512bits hram, const ed25519_signature RS, const ed25519_public_key pk, const unsigned char *m, size_t mlen) { + ed25519_hash_context ctx; + ed25519_hash_init(&ctx); + ed25519_hash_update(&ctx, RS, 32); + ed25519_hash_update(&ctx, pk, 32); + ed25519_hash_update(&ctx, m, mlen); + ed25519_hash_final(&ctx, hram); +} + +static int +ED25519_FN(ed25519_sign_open) (const unsigned char *m, size_t mlen, const ed25519_public_key pk, const ed25519_signature RS) { + ge25519 ALIGN(16) R, A; + hash_512bits hash; + bignum256modm hram, S; + unsigned char checkR[32]; + + if ((RS[63] & 224) || !ge25519_unpack_negative_vartime(&A, pk)) + return -1; + + /* hram = H(R,A,m) */ + ed25519_hram(hash, RS, pk, m, mlen); + expand256_modm(hram, hash, 64); + + /* S */ + expand256_modm(S, RS + 32, 32); + + /* SB - H(R,A,m)A */ + ge25519_double_scalarmult_vartime(&R, &A, hram, S); + ge25519_pack(checkR, &R); + + /* check that R = SB - H(R,A,m)A */ + return ed25519_verify(RS, checkR, 32) ? 0 : -1; +} + +#include "ed25519-donna-batchverify.h" + +/* + Fast Curve25519 basepoint scalar multiplication +*/ + +void +ED25519_FN(curved25519_scalarmult_basepoint) (curved25519_key pk, const curved25519_key e) { + curved25519_key ec; + bignum256modm s; + bignum25519 ALIGN(16) yplusz, zminusy; + ge25519 ALIGN(16) p; + size_t i; + + /* clamp */ + for (i = 0; i < 32; i++) ec[i] = e[i]; + ec[0] &= 248; + ec[31] &= 127; + ec[31] |= 64; + + expand_raw256_modm(s, ec); + + /* scalar * basepoint */ + ge25519_scalarmult_base_niels(&p, ge25519_niels_base_multiples, s); + + /* u = (y + z) / (z - y) */ + curve25519_add(yplusz, p.y, p.z); + curve25519_sub(zminusy, p.z, p.y); + curve25519_recip(zminusy, zminusy); + curve25519_mul(yplusz, yplusz, zminusy); + curve25519_contract(pk, yplusz); +} + +/* + Tor has a specific idea of how an Ed25519 implementaion should behave. + Implement such a beast using the ed25519-donna primitives/internals. + + * Private key generation using Tor's CSPRNG. + + * Routines that deal with the private key now use the expanded form. + + * Support for multiplicative key blinding has been added. + + * Support for converting a Curve25519 key to an Ed25519 key has been added. + */ + +int +ed25519_donna_seckey(unsigned char *sk) +{ + ed25519_secret_key seed; + + crypto_strongest_rand(seed, 32); + + ed25519_extsk(sk, seed); + + memwipe(seed, 0, sizeof(seed)); + + return 0; +} + +int +ed25519_donna_seckey_expand(unsigned char *sk, const unsigned char *skseed) +{ + ed25519_extsk(sk, skseed); + + return 0; +} + +int +ed25519_donna_pubkey(unsigned char *pk, const unsigned char *sk) +{ + bignum256modm a = {0}; + ge25519 ALIGN(16) A = {{0}, {0}, {0}, {0}}; + + /* A = aB */ + expand256_modm(a, sk, 32); + ge25519_scalarmult_base_niels(&A, ge25519_niels_base_multiples, a); + ge25519_pack(pk, &A); + + return 0; +} + +int +ed25519_donna_keygen(unsigned char *pk, unsigned char *sk) +{ + int ok; + ok = ed25519_donna_seckey(sk); + ed25519_donna_pubkey(pk, sk); + + return ok; +} + +int +ed25519_donna_open(const unsigned char *signature, const unsigned char *m, + size_t mlen, const unsigned char *pk) +{ + /* Wrap the ed25519-donna routine, since it is also used by the batch + * verification code. + */ + return ED25519_FN(ed25519_sign_open)(m, mlen, pk, signature); +} + +int +ed25519_donna_sign(unsigned char *sig, const unsigned char *m, size_t mlen, + const unsigned char *sk, const unsigned char *pk) +{ + ed25519_hash_context ctx; + bignum256modm r = {0}, S, a; + ge25519 ALIGN(16) R = {{0}, {0}, {0}, {0}}; + hash_512bits hashr, hram; + + /* This is equivalent to the removed `ED25519_FN(ed25519_sign)` routine, + * except that the key expansion step is omitted as sk already is in expanded + * form. + */ + + /* r = H(aExt[32..64], m) */ + ed25519_hash_init(&ctx); + ed25519_hash_update(&ctx, sk + 32, 32); + ed25519_hash_update(&ctx, m, mlen); + ed25519_hash_final(&ctx, hashr); + expand256_modm(r, hashr, 64); + + /* R = rB */ + ge25519_scalarmult_base_niels(&R, ge25519_niels_base_multiples, r); + ge25519_pack(sig, &R); + + /* S = H(R,A,m).. */ + ed25519_hram(hram, sig, pk, m, mlen); + expand256_modm(S, hram, 64); + + /* S = H(R,A,m)a */ + expand256_modm(a, sk, 32); + mul256_modm(S, S, a); + + /* S = (r + H(R,A,m)a) */ + add256_modm(S, S, r); + + /* S = (r + H(R,A,m)a) mod L */ + contract256_modm(sig + 32, S); + + return 0; +} + +static void +ed25519_donna_gettweak(unsigned char *out, const unsigned char *param) +{ + memcpy(out, param, 32); + + out[0] &= 248; /* Is this necessary ? */ + out[31] &= 63; + out[31] |= 64; +} + +int +ed25519_donna_blind_secret_key(unsigned char *out, const unsigned char *inp, + const unsigned char *param) +{ + static const char str[] = "Derive temporary signing key hash input"; + unsigned char tweak[64]; + ed25519_hash_context ctx; + bignum256modm ALIGN(16) sk, t; + + ed25519_donna_gettweak(tweak, param); + expand256_modm(t, tweak, 32); + + expand256_modm(sk, inp, 32); + mul256_modm(sk, sk, t); + contract256_modm(out, sk); + + ed25519_hash_init(&ctx); + ed25519_hash_update(&ctx, (const unsigned char*)str, strlen(str)); + ed25519_hash_update(&ctx, inp + 32, 32); + ed25519_hash_final(&ctx, tweak); + + memcpy(out + 32, tweak, 32); + + memwipe(sk, 0, sizeof(sk)); + memwipe(t, 0, sizeof(t)); + memwipe(tweak, 0, sizeof(tweak)); + + return 0; +} + +int +ed25519_donna_blind_public_key(unsigned char *out, const unsigned char *inp, + const unsigned char *param) +{ + static const bignum256modm zero = { 0 }; + unsigned char tweak[64]; + unsigned char pkcopy[32]; + ge25519 ALIGN(16) A, Aprime; + bignum256modm ALIGN(16) t; + + ed25519_donna_gettweak(tweak, param); + expand256_modm(t, tweak, 32); + + /* No "ge25519_unpack", negate the public key. */ + memcpy(pkcopy, inp, 32); + pkcopy[31] ^= (1<<7); + if (!ge25519_unpack_negative_vartime(&A, pkcopy)) { + return -1; + } + + /* A' = [tweak] * A + [0] * basepoint. */ + ge25519_double_scalarmult_vartime(&Aprime, &A, t, zero); + ge25519_pack(out, &Aprime); + + memwipe(tweak, 0, sizeof(tweak)); + memwipe(pkcopy, 0, sizeof(pkcopy)); + memwipe(&A, 0, sizeof(A)); + memwipe(&Aprime, 0, sizeof(Aprime)); + memwipe(t, 0, sizeof(t)); + + return 0; +} + +int +ed25519_donna_pubkey_from_curve25519_pubkey(unsigned char *out, + const unsigned char *inp, int signbit) +{ + static const bignum25519 ALIGN(16) one = { 1 }; + bignum25519 ALIGN(16) u, uminus1, uplus1, inv_uplus1, y; + + /* Prop228: y = (u-1)/(u+1) */ + curve25519_expand(u, inp); + curve25519_sub(uminus1, u, one); + curve25519_add(uplus1, u, one); + curve25519_recip(inv_uplus1, uplus1); + curve25519_mul(y, uminus1, inv_uplus1); + curve25519_contract(out, y); + + /* Propagate sign. */ + out[31] |= (!!signbit) << 7; + + return 0; +} + +/* Do the scalar multiplication of pubkey with the group order + * modm_m. Place the result in out which must be at least 32 + * bytes long. */ +int +ed25519_donna_scalarmult_with_group_order(unsigned char *out, + const unsigned char *pubkey) +{ + static const bignum256modm ALIGN(16) zero = { 0 }; + unsigned char pkcopy[32]; + ge25519 ALIGN(16) Point, Result; + + /* No "ge25519_unpack", negate the public key and unpack it back. + * See ed25519_donna_blind_public_key() */ + memcpy(pkcopy, pubkey, 32); + pkcopy[31] ^= (1<<7); + if (!ge25519_unpack_negative_vartime(&Point, pkcopy)) { + return -1; /* error: bail out */ + } + + /* There is no regular scalarmult function so we have to do: + * Result = l*P + 0*B */ + ge25519_double_scalarmult_vartime(&Result, &Point, modm_m, zero); + ge25519_pack(out, &Result); + + return 0; +} + +#include "test-internals.c" + diff --git a/src/wraith/src/ext/ed25519/donna/fuzz/README.md b/src/wraith/src/ext/ed25519/donna/fuzz/README.md new file mode 100644 index 000000000..306ddfe08 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/fuzz/README.md @@ -0,0 +1,173 @@ +This code fuzzes ed25519-donna (and optionally ed25519-donna-sse2) against the ref10 implementations of +[curve25519](https://github.com/floodyberry/supercop/tree/master/crypto_scalarmult/curve25519/ref10) and +[ed25519](https://github.com/floodyberry/supercop/tree/master/crypto_sign/ed25519/ref10). + +Curve25519 tests that generating a public key from a secret key + +# Building + +## *nix + PHP + +`php build-nix.php (required parameters) (optional parameters)` + +Required parameters: + +* `--function=[curve25519,ed25519]` +* `--bits=[32,64]` + +Optional parameters: + +* `--with-sse2` + + Also fuzz against ed25519-donna-sse2 +* `--with-openssl` + + Build with OpenSSL's SHA-512. + + Default: Reference SHA-512 implementation (slow!) + +* `--compiler=[gcc,clang,icc]` + + Default: gcc + +* `--no-asm` + + Do not use platform specific assembler + + +example: + + php build-nix.php --bits=64 --function=ed25519 --with-sse2 --compiler=icc + +## Windows + +Create a project with access to the ed25519 files. + +If you are not using OpenSSL, add the `ED25519_REFHASH` define to the projects +"Properties/Preprocessor/Preprocessor Definitions" option + +Add the following files to the project: + +* `fuzz/curve25519-ref10.c` +* `fuzz/ed25519-ref10.c` +* `fuzz/ed25519-donna.c` +* `fuzz/ed25519-donna-sse2.c` (optional) +* `fuzz-[curve25519/ed25519].c` (depending on which you want to fuzz) + +If you are also fuzzing against ed25519-donna-sse2, add the `ED25519_SSE2` define for `fuzz-[curve25519/ed25519].c` under +its "Properties/Preprocessor/Preprocessor Definitions" option. + +# Running + +If everything agrees, the program will only output occasional status dots (every 0x1000 passes) +and a 64bit progress count (every 0x20000 passes): + + fuzzing: ref10 curved25519 curved25519-sse2 + + ................................ [0000000000020000] + ................................ [0000000000040000] + ................................ [0000000000060000] + ................................ [0000000000080000] + ................................ [00000000000a0000] + ................................ [00000000000c0000] + +If any of the implementations do not agree with the ref10 implementation, the program will dump +the random data that was used, the data generated by the ref10 implementation, and diffs of the +ed25519-donna data against the ref10 data. + +## Example errors + +These are example error dumps (with intentionally introduced errors). + +### Ed25519 + +Random data: + +* sk, or Secret Key +* m, or Message + +Generated data: + +* pk, or Public Key +* sig, or Signature +* valid, or if the signature of the message is valid with the public key + +Dump: + + sk: + 0x3b,0xb7,0x17,0x7a,0x66,0xdc,0xb7,0x9a,0x90,0x25,0x07,0x99,0x96,0xf3,0x92,0xef, + 0x78,0xf8,0xad,0x6c,0x35,0x87,0x81,0x67,0x03,0xe6,0x95,0xba,0x06,0x18,0x7c,0x9c, + + m: + 0x7c,0x8d,0x3d,0xe1,0x92,0xee,0x7a,0xb8,0x4d,0xc9,0xfb,0x02,0x34,0x1e,0x5a,0x91, + 0xee,0x01,0xa6,0xb8,0xab,0x37,0x3f,0x3d,0x6d,0xa2,0x47,0xe3,0x27,0x93,0x7c,0xb7, + 0x77,0x07,0xb6,0x88,0x41,0x22,0xf3,0x3f,0xce,0xcb,0x6b,0x3e,0x2b,0x23,0x68,0x7f, + 0x5b,0xb9,0xda,0x04,0xbb,0xae,0x42,0x50,0xf5,0xe9,0xc5,0x11,0xbd,0x52,0x76,0x98, + 0xf1,0x87,0x09,0xb9,0x89,0x0a,0x52,0x69,0x01,0xce,0xe0,0x4a,0xa6,0x46,0x5a,0xe1, + 0x63,0x14,0xe0,0x81,0x52,0xec,0xcd,0xcf,0x70,0x54,0x7d,0xa3,0x49,0x8b,0xf0,0x89, + 0x70,0x07,0x12,0x2a,0xd9,0xaa,0x16,0x01,0xb2,0x16,0x3a,0xbb,0xfc,0xfa,0x13,0x5b, + 0x69,0x83,0x92,0x70,0x95,0x76,0xa0,0x8e,0x16,0x79,0xcc,0xaa,0xb5,0x7c,0xf8,0x7a, + + ref10: + pk: + 0x71,0xb0,0x5e,0x62,0x1b,0xe3,0xe7,0x36,0x91,0x8b,0xc0,0x13,0x36,0x0c,0xc9,0x04, + 0x16,0xf5,0xff,0x48,0x0c,0x83,0x6b,0x88,0x53,0xa2,0xc6,0x0f,0xf7,0xac,0x42,0x04, + + sig: + 0x3e,0x05,0xc5,0x37,0x16,0x0b,0x29,0x30,0x89,0xa3,0xe7,0x83,0x08,0x16,0xdd,0x96, + 0x02,0xfa,0x0d,0x44,0x2c,0x43,0xaa,0x80,0x93,0x04,0x58,0x22,0x09,0xbf,0x11,0xa5, + 0xcc,0xa5,0x3c,0x9f,0xa0,0xa4,0x64,0x5a,0x4a,0xdb,0x20,0xfb,0xc7,0x9b,0xfd,0x3f, + 0x08,0xae,0xc4,0x3c,0x1e,0xd8,0xb6,0xb4,0xd2,0x6d,0x80,0x92,0xcb,0x71,0xf3,0x02, + + valid: yes + + ed25519-donna: + pk diff: + ____,____,____,____,____,____,____,____,____,____,____,____,____,____,____,____, + ____,____,____,____,____,____,____,____,____,____,____,____,____,____,____,____, + + sig diff: + 0x2c,0xb9,0x25,0x14,0xd0,0x94,0xeb,0xfe,0x46,0x02,0xc2,0xe8,0xa3,0xeb,0xbf,0xb5, + 0x72,0x84,0xbf,0xc1,0x8a,0x32,0x30,0x99,0xf7,0x58,0xfe,0x06,0xa8,0xdc,0xdc,0xab, + 0xb5,0x57,0x03,0x33,0x87,0xce,0x54,0x55,0x6a,0x69,0x8a,0xc4,0xb7,0x2a,0xed,0x97, + 0xb4,0x68,0xe7,0x52,0x7a,0x07,0x55,0x3b,0xa2,0x94,0xd6,0x5e,0xa1,0x61,0x80,0x08, + + valid: no + +In this case, the generated public key matches, but the generated signature is completely +different and does not validate. + +### Curve25519 + +Random data: + +* sk, or Secret Key + +Generated data: + +* pk, or Public Key + +Dump: + + sk: + 0x44,0xec,0x0b,0x0e,0xa2,0x0e,0x9c,0x5b,0x8c,0xce,0x7b,0x1d,0x68,0xae,0x0f,0x9e, + 0x81,0xe2,0x04,0x76,0xda,0x87,0xa4,0x9e,0xc9,0x4f,0x3b,0xf9,0xc3,0x89,0x63,0x70, + + + ref10: + 0x24,0x55,0x55,0xc0,0xf9,0x80,0xaf,0x02,0x43,0xee,0x8c,0x7f,0xc1,0xad,0x90,0x95, + 0x57,0x91,0x14,0x2e,0xf2,0x14,0x22,0x80,0xdd,0x4e,0x3c,0x85,0x71,0x84,0x8c,0x62, + + + curved25519 diff: + 0x12,0xd1,0x61,0x2b,0x16,0xb3,0xd8,0x29,0xf8,0xa3,0xba,0x70,0x4e,0x49,0x4f,0x43, + 0xa1,0x3c,0x6b,0x42,0x11,0x61,0xcc,0x30,0x87,0x73,0x46,0xfb,0x85,0xc7,0x9a,0x35, + + + curved25519-sse2 diff: + ____,____,____,____,____,____,____,____,____,____,____,____,____,____,____,____, + ____,____,____,____,____,____,____,____,____,____,____,____,____,____,____,____, + + +In this case, curved25519 is totally wrong, while curved25519-sse2 matches the reference +implementation. \ No newline at end of file diff --git a/src/wraith/src/ext/ed25519/donna/fuzz/build-nix.php b/src/wraith/src/ext/ed25519/donna/fuzz/build-nix.php new file mode 100644 index 000000000..c69144ebc --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/fuzz/build-nix.php @@ -0,0 +1,134 @@ +set = false; + + $map = array(); + foreach($legal_values as $value) + $map[$value] = true; + + for ($i = 1; $i < $argc; $i++) { + if (!preg_match("!--".$flag."=(.*)!", $argv[$i], $m)) + continue; + if (isset($map[$m[1]])) { + $this->value = $m[1]; + $this->set = true; + return; + } else { + usage("{$m[1]} is not a valid parameter to --{$flag}!"); + exit(1); + } + } + } + } + + class flag extends argument { + function flag($flag) { + global $argc, $argv; + + $this->set = false; + + $flag = "--{$flag}"; + for ($i = 1; $i < $argc; $i++) { + if ($argv[$i] !== $flag) + continue; + $this->value = true; + $this->set = true; + return; + } + } + } + + $bits = new multiargument("bits", array("32", "64")); + $function = new multiargument("function", array("curve25519", "ed25519")); + $compiler = new multiargument("compiler", array("gcc", "clang", "icc")); + $with_sse2 = new flag("with-sse2"); + $with_openssl = new flag("with-openssl"); + $no_asm = new flag("no-asm"); + + $err = ""; + if (!$bits->set) + $err .= "--bits not set\n"; + if (!$function->set) + $err .= "--function not set\n"; + + if ($err !== "") { + usage($err); + exit; + } + + $compile = ($compiler->set) ? $compiler->value : "gcc"; + $link = ""; + $flags = "-O3 -m{$bits->value}"; + $ret = 0; + + if ($with_openssl->set) $link .= " -lssl -lcrypto"; + if (!$with_openssl->set) $flags .= " -DED25519_REFHASH -DED25519_TEST"; + if ($no_asm->set) $flags .= " -DED25519_NO_INLINE_ASM"; + + if ($function->value === "curve25519") { + runcmd("building ref10..", "{$compile} {$flags} curve25519-ref10.c -c -o curve25519-ref10.o"); + runcmd("building ed25519..", "{$compile} {$flags} ed25519-donna.c -c -o ed25519.o"); + if ($with_sse2->set) { + runcmd("building ed25519-sse2..", "{$compile} {$flags} ed25519-donna-sse2.c -c -o ed25519-sse2.o -msse2"); + $flags .= " -DED25519_SSE2"; + $link .= " ed25519-sse2.o"; + } + runcmd("linking..", "{$compile} {$flags} {$link} fuzz-curve25519.c ed25519.o curve25519-ref10.o -o fuzz-curve25519"); + echoln("fuzz-curve25519 built."); + } else if ($function->value === "ed25519") { + runcmd("building ref10..", "{$compile} {$flags} ed25519-ref10.c -c -o ed25519-ref10.o"); + runcmd("building ed25519..", "{$compile} {$flags} ed25519-donna.c -c -o ed25519.o"); + if ($with_sse2->set) { + runcmd("building ed25519-sse2..", "{$compile} {$flags} ed25519-donna-sse2.c -c -o ed25519-sse2.o -msse2"); + $flags .= " -DED25519_SSE2"; + $link .= " ed25519-sse2.o"; + } + runcmd("linking..", "{$compile} {$flags} {$link} fuzz-ed25519.c ed25519.o ed25519-ref10.o -o fuzz-ed25519"); + echoln("fuzz-ed25519 built."); + } + + + cleanup(); +?> diff --git a/src/wraith/src/ext/ed25519/donna/fuzz/curve25519-ref10.c b/src/wraith/src/ext/ed25519/donna/fuzz/curve25519-ref10.c new file mode 100644 index 000000000..efefce6fd --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/fuzz/curve25519-ref10.c @@ -0,0 +1,1272 @@ +#include + +typedef int32_t crypto_int32; +typedef int64_t crypto_int64; +typedef uint64_t crypto_uint64; + +typedef crypto_int32 fe[10]; + +/* +h = 0 +*/ + +void fe_0(fe h) +{ + h[0] = 0; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + +/* +h = 1 +*/ + +void fe_1(fe h) +{ + h[0] = 1; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + +/* +h = f + g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +void fe_add(fe h,fe f,fe g) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 h0 = f0 + g0; + crypto_int32 h1 = f1 + g1; + crypto_int32 h2 = f2 + g2; + crypto_int32 h3 = f3 + g3; + crypto_int32 h4 = f4 + g4; + crypto_int32 h5 = f5 + g5; + crypto_int32 h6 = f6 + g6; + crypto_int32 h7 = f7 + g7; + crypto_int32 h8 = f8 + g8; + crypto_int32 h9 = f9 + g9; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* +h = f +*/ + +void fe_copy(fe h,fe f) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + h[0] = f0; + h[1] = f1; + h[2] = f2; + h[3] = f3; + h[4] = f4; + h[5] = f5; + h[6] = f6; + h[7] = f7; + h[8] = f8; + h[9] = f9; +} + + +/* +Replace (f,g) with (g,f) if b == 1; +replace (f,g) with (f,g) if b == 0. + +Preconditions: b in {0,1}. +*/ + +void fe_cswap(fe f,fe g,unsigned int b) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 x0 = f0 ^ g0; + crypto_int32 x1 = f1 ^ g1; + crypto_int32 x2 = f2 ^ g2; + crypto_int32 x3 = f3 ^ g3; + crypto_int32 x4 = f4 ^ g4; + crypto_int32 x5 = f5 ^ g5; + crypto_int32 x6 = f6 ^ g6; + crypto_int32 x7 = f7 ^ g7; + crypto_int32 x8 = f8 ^ g8; + crypto_int32 x9 = f9 ^ g9; + b = -b; + x0 &= b; + x1 &= b; + x2 &= b; + x3 &= b; + x4 &= b; + x5 &= b; + x6 &= b; + x7 &= b; + x8 &= b; + x9 &= b; + f[0] = f0 ^ x0; + f[1] = f1 ^ x1; + f[2] = f2 ^ x2; + f[3] = f3 ^ x3; + f[4] = f4 ^ x4; + f[5] = f5 ^ x5; + f[6] = f6 ^ x6; + f[7] = f7 ^ x7; + f[8] = f8 ^ x8; + f[9] = f9 ^ x9; + g[0] = g0 ^ x0; + g[1] = g1 ^ x1; + g[2] = g2 ^ x2; + g[3] = g3 ^ x3; + g[4] = g4 ^ x4; + g[5] = g5 ^ x5; + g[6] = g6 ^ x6; + g[7] = g7 ^ x7; + g[8] = g8 ^ x8; + g[9] = g9 ^ x9; +} + +static crypto_uint64 load_3(const unsigned char *in) +{ + crypto_uint64 result; + result = (crypto_uint64) in[0]; + result |= ((crypto_uint64) in[1]) << 8; + result |= ((crypto_uint64) in[2]) << 16; + return result; +} + +static crypto_uint64 load_4(const unsigned char *in) +{ + crypto_uint64 result; + result = (crypto_uint64) in[0]; + result |= ((crypto_uint64) in[1]) << 8; + result |= ((crypto_uint64) in[2]) << 16; + result |= ((crypto_uint64) in[3]) << 24; + return result; +} + +void fe_frombytes(fe h,const unsigned char *s) +{ + crypto_int64 h0 = load_4(s); + crypto_int64 h1 = load_3(s + 4) << 6; + crypto_int64 h2 = load_3(s + 7) << 5; + crypto_int64 h3 = load_3(s + 10) << 3; + crypto_int64 h4 = load_3(s + 13) << 2; + crypto_int64 h5 = load_4(s + 16); + crypto_int64 h6 = load_3(s + 20) << 7; + crypto_int64 h7 = load_3(s + 23) << 5; + crypto_int64 h8 = load_3(s + 26) << 4; + crypto_int64 h9 = load_3(s + 29) << 2; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + +/* +h = f * g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +/* +Notes on implementation strategy: + +Using schoolbook multiplication. +Karatsuba would save a little in some cost models. + +Most multiplications by 2 and 19 are 32-bit precomputations; +cheaper than 64-bit postcomputations. + +There is one remaining multiplication by 19 in the carry chain; +one *19 precomputation can be merged into this, +but the resulting data flow is considerably less clean. + +There are 12 carries below. +10 of them are 2-way parallelizable and vectorizable. +Can get away with 11 carries, but then data flow is much deeper. + +With tighter constraints on inputs can squeeze carries into int32. +*/ + +void fe_mul(fe h,fe f,fe g) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 g1_19 = 19 * g1; /* 1.4*2^29 */ + crypto_int32 g2_19 = 19 * g2; /* 1.4*2^30; still ok */ + crypto_int32 g3_19 = 19 * g3; + crypto_int32 g4_19 = 19 * g4; + crypto_int32 g5_19 = 19 * g5; + crypto_int32 g6_19 = 19 * g6; + crypto_int32 g7_19 = 19 * g7; + crypto_int32 g8_19 = 19 * g8; + crypto_int32 g9_19 = 19 * g9; + crypto_int32 f1_2 = 2 * f1; + crypto_int32 f3_2 = 2 * f3; + crypto_int32 f5_2 = 2 * f5; + crypto_int32 f7_2 = 2 * f7; + crypto_int32 f9_2 = 2 * f9; + crypto_int64 f0g0 = f0 * (crypto_int64) g0; + crypto_int64 f0g1 = f0 * (crypto_int64) g1; + crypto_int64 f0g2 = f0 * (crypto_int64) g2; + crypto_int64 f0g3 = f0 * (crypto_int64) g3; + crypto_int64 f0g4 = f0 * (crypto_int64) g4; + crypto_int64 f0g5 = f0 * (crypto_int64) g5; + crypto_int64 f0g6 = f0 * (crypto_int64) g6; + crypto_int64 f0g7 = f0 * (crypto_int64) g7; + crypto_int64 f0g8 = f0 * (crypto_int64) g8; + crypto_int64 f0g9 = f0 * (crypto_int64) g9; + crypto_int64 f1g0 = f1 * (crypto_int64) g0; + crypto_int64 f1g1_2 = f1_2 * (crypto_int64) g1; + crypto_int64 f1g2 = f1 * (crypto_int64) g2; + crypto_int64 f1g3_2 = f1_2 * (crypto_int64) g3; + crypto_int64 f1g4 = f1 * (crypto_int64) g4; + crypto_int64 f1g5_2 = f1_2 * (crypto_int64) g5; + crypto_int64 f1g6 = f1 * (crypto_int64) g6; + crypto_int64 f1g7_2 = f1_2 * (crypto_int64) g7; + crypto_int64 f1g8 = f1 * (crypto_int64) g8; + crypto_int64 f1g9_38 = f1_2 * (crypto_int64) g9_19; + crypto_int64 f2g0 = f2 * (crypto_int64) g0; + crypto_int64 f2g1 = f2 * (crypto_int64) g1; + crypto_int64 f2g2 = f2 * (crypto_int64) g2; + crypto_int64 f2g3 = f2 * (crypto_int64) g3; + crypto_int64 f2g4 = f2 * (crypto_int64) g4; + crypto_int64 f2g5 = f2 * (crypto_int64) g5; + crypto_int64 f2g6 = f2 * (crypto_int64) g6; + crypto_int64 f2g7 = f2 * (crypto_int64) g7; + crypto_int64 f2g8_19 = f2 * (crypto_int64) g8_19; + crypto_int64 f2g9_19 = f2 * (crypto_int64) g9_19; + crypto_int64 f3g0 = f3 * (crypto_int64) g0; + crypto_int64 f3g1_2 = f3_2 * (crypto_int64) g1; + crypto_int64 f3g2 = f3 * (crypto_int64) g2; + crypto_int64 f3g3_2 = f3_2 * (crypto_int64) g3; + crypto_int64 f3g4 = f3 * (crypto_int64) g4; + crypto_int64 f3g5_2 = f3_2 * (crypto_int64) g5; + crypto_int64 f3g6 = f3 * (crypto_int64) g6; + crypto_int64 f3g7_38 = f3_2 * (crypto_int64) g7_19; + crypto_int64 f3g8_19 = f3 * (crypto_int64) g8_19; + crypto_int64 f3g9_38 = f3_2 * (crypto_int64) g9_19; + crypto_int64 f4g0 = f4 * (crypto_int64) g0; + crypto_int64 f4g1 = f4 * (crypto_int64) g1; + crypto_int64 f4g2 = f4 * (crypto_int64) g2; + crypto_int64 f4g3 = f4 * (crypto_int64) g3; + crypto_int64 f4g4 = f4 * (crypto_int64) g4; + crypto_int64 f4g5 = f4 * (crypto_int64) g5; + crypto_int64 f4g6_19 = f4 * (crypto_int64) g6_19; + crypto_int64 f4g7_19 = f4 * (crypto_int64) g7_19; + crypto_int64 f4g8_19 = f4 * (crypto_int64) g8_19; + crypto_int64 f4g9_19 = f4 * (crypto_int64) g9_19; + crypto_int64 f5g0 = f5 * (crypto_int64) g0; + crypto_int64 f5g1_2 = f5_2 * (crypto_int64) g1; + crypto_int64 f5g2 = f5 * (crypto_int64) g2; + crypto_int64 f5g3_2 = f5_2 * (crypto_int64) g3; + crypto_int64 f5g4 = f5 * (crypto_int64) g4; + crypto_int64 f5g5_38 = f5_2 * (crypto_int64) g5_19; + crypto_int64 f5g6_19 = f5 * (crypto_int64) g6_19; + crypto_int64 f5g7_38 = f5_2 * (crypto_int64) g7_19; + crypto_int64 f5g8_19 = f5 * (crypto_int64) g8_19; + crypto_int64 f5g9_38 = f5_2 * (crypto_int64) g9_19; + crypto_int64 f6g0 = f6 * (crypto_int64) g0; + crypto_int64 f6g1 = f6 * (crypto_int64) g1; + crypto_int64 f6g2 = f6 * (crypto_int64) g2; + crypto_int64 f6g3 = f6 * (crypto_int64) g3; + crypto_int64 f6g4_19 = f6 * (crypto_int64) g4_19; + crypto_int64 f6g5_19 = f6 * (crypto_int64) g5_19; + crypto_int64 f6g6_19 = f6 * (crypto_int64) g6_19; + crypto_int64 f6g7_19 = f6 * (crypto_int64) g7_19; + crypto_int64 f6g8_19 = f6 * (crypto_int64) g8_19; + crypto_int64 f6g9_19 = f6 * (crypto_int64) g9_19; + crypto_int64 f7g0 = f7 * (crypto_int64) g0; + crypto_int64 f7g1_2 = f7_2 * (crypto_int64) g1; + crypto_int64 f7g2 = f7 * (crypto_int64) g2; + crypto_int64 f7g3_38 = f7_2 * (crypto_int64) g3_19; + crypto_int64 f7g4_19 = f7 * (crypto_int64) g4_19; + crypto_int64 f7g5_38 = f7_2 * (crypto_int64) g5_19; + crypto_int64 f7g6_19 = f7 * (crypto_int64) g6_19; + crypto_int64 f7g7_38 = f7_2 * (crypto_int64) g7_19; + crypto_int64 f7g8_19 = f7 * (crypto_int64) g8_19; + crypto_int64 f7g9_38 = f7_2 * (crypto_int64) g9_19; + crypto_int64 f8g0 = f8 * (crypto_int64) g0; + crypto_int64 f8g1 = f8 * (crypto_int64) g1; + crypto_int64 f8g2_19 = f8 * (crypto_int64) g2_19; + crypto_int64 f8g3_19 = f8 * (crypto_int64) g3_19; + crypto_int64 f8g4_19 = f8 * (crypto_int64) g4_19; + crypto_int64 f8g5_19 = f8 * (crypto_int64) g5_19; + crypto_int64 f8g6_19 = f8 * (crypto_int64) g6_19; + crypto_int64 f8g7_19 = f8 * (crypto_int64) g7_19; + crypto_int64 f8g8_19 = f8 * (crypto_int64) g8_19; + crypto_int64 f8g9_19 = f8 * (crypto_int64) g9_19; + crypto_int64 f9g0 = f9 * (crypto_int64) g0; + crypto_int64 f9g1_38 = f9_2 * (crypto_int64) g1_19; + crypto_int64 f9g2_19 = f9 * (crypto_int64) g2_19; + crypto_int64 f9g3_38 = f9_2 * (crypto_int64) g3_19; + crypto_int64 f9g4_19 = f9 * (crypto_int64) g4_19; + crypto_int64 f9g5_38 = f9_2 * (crypto_int64) g5_19; + crypto_int64 f9g6_19 = f9 * (crypto_int64) g6_19; + crypto_int64 f9g7_38 = f9_2 * (crypto_int64) g7_19; + crypto_int64 f9g8_19 = f9 * (crypto_int64) g8_19; + crypto_int64 f9g9_38 = f9_2 * (crypto_int64) g9_19; + crypto_int64 h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38; + crypto_int64 h1 = f0g1+f1g0 +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19; + crypto_int64 h2 = f0g2+f1g1_2 +f2g0 +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38; + crypto_int64 h3 = f0g3+f1g2 +f2g1 +f3g0 +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19; + crypto_int64 h4 = f0g4+f1g3_2 +f2g2 +f3g1_2 +f4g0 +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38; + crypto_int64 h5 = f0g5+f1g4 +f2g3 +f3g2 +f4g1 +f5g0 +f6g9_19+f7g8_19+f8g7_19+f9g6_19; + crypto_int64 h6 = f0g6+f1g5_2 +f2g4 +f3g3_2 +f4g2 +f5g1_2 +f6g0 +f7g9_38+f8g8_19+f9g7_38; + crypto_int64 h7 = f0g7+f1g6 +f2g5 +f3g4 +f4g3 +f5g2 +f6g1 +f7g0 +f8g9_19+f9g8_19; + crypto_int64 h8 = f0g8+f1g7_2 +f2g6 +f3g5_2 +f4g4 +f5g3_2 +f6g2 +f7g1_2 +f8g0 +f9g9_38; + crypto_int64 h9 = f0g9+f1g8 +f2g7 +f3g6 +f4g5 +f5g4 +f6g3 +f7g2 +f8g1 +f9g0 ; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + /* + |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) + i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 + |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) + i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 + */ + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + /* |h0| <= 2^25 */ + /* |h4| <= 2^25 */ + /* |h1| <= 1.51*2^58 */ + /* |h5| <= 1.51*2^58 */ + + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + /* |h1| <= 2^24; from now on fits into int32 */ + /* |h5| <= 2^24; from now on fits into int32 */ + /* |h2| <= 1.21*2^59 */ + /* |h6| <= 1.21*2^59 */ + + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + /* |h2| <= 2^25; from now on fits into int32 unchanged */ + /* |h6| <= 2^25; from now on fits into int32 unchanged */ + /* |h3| <= 1.51*2^58 */ + /* |h7| <= 1.51*2^58 */ + + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + /* |h3| <= 2^24; from now on fits into int32 unchanged */ + /* |h7| <= 2^24; from now on fits into int32 unchanged */ + /* |h4| <= 1.52*2^33 */ + /* |h8| <= 1.52*2^33 */ + + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + /* |h4| <= 2^25; from now on fits into int32 unchanged */ + /* |h8| <= 2^25; from now on fits into int32 unchanged */ + /* |h5| <= 1.01*2^24 */ + /* |h9| <= 1.51*2^58 */ + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + /* |h9| <= 2^24; from now on fits into int32 unchanged */ + /* |h0| <= 1.8*2^37 */ + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + /* |h0| <= 2^25; from now on fits into int32 unchanged */ + /* |h1| <= 1.01*2^24 */ + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* +h = f * 121666 +Can overlap h with f. + +Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +void fe_mul121666(fe h,fe f) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int64 h0 = f0 * (crypto_int64) 121666; + crypto_int64 h1 = f1 * (crypto_int64) 121666; + crypto_int64 h2 = f2 * (crypto_int64) 121666; + crypto_int64 h3 = f3 * (crypto_int64) 121666; + crypto_int64 h4 = f4 * (crypto_int64) 121666; + crypto_int64 h5 = f5 * (crypto_int64) 121666; + crypto_int64 h6 = f6 * (crypto_int64) 121666; + crypto_int64 h7 = f7 * (crypto_int64) 121666; + crypto_int64 h8 = f8 * (crypto_int64) 121666; + crypto_int64 h9 = f9 * (crypto_int64) 121666; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* +h = f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +void fe_sq(fe h,fe f) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 f0_2 = 2 * f0; + crypto_int32 f1_2 = 2 * f1; + crypto_int32 f2_2 = 2 * f2; + crypto_int32 f3_2 = 2 * f3; + crypto_int32 f4_2 = 2 * f4; + crypto_int32 f5_2 = 2 * f5; + crypto_int32 f6_2 = 2 * f6; + crypto_int32 f7_2 = 2 * f7; + crypto_int32 f5_38 = 38 * f5; /* 1.31*2^30 */ + crypto_int32 f6_19 = 19 * f6; /* 1.31*2^30 */ + crypto_int32 f7_38 = 38 * f7; /* 1.31*2^30 */ + crypto_int32 f8_19 = 19 * f8; /* 1.31*2^30 */ + crypto_int32 f9_38 = 38 * f9; /* 1.31*2^30 */ + crypto_int64 f0f0 = f0 * (crypto_int64) f0; + crypto_int64 f0f1_2 = f0_2 * (crypto_int64) f1; + crypto_int64 f0f2_2 = f0_2 * (crypto_int64) f2; + crypto_int64 f0f3_2 = f0_2 * (crypto_int64) f3; + crypto_int64 f0f4_2 = f0_2 * (crypto_int64) f4; + crypto_int64 f0f5_2 = f0_2 * (crypto_int64) f5; + crypto_int64 f0f6_2 = f0_2 * (crypto_int64) f6; + crypto_int64 f0f7_2 = f0_2 * (crypto_int64) f7; + crypto_int64 f0f8_2 = f0_2 * (crypto_int64) f8; + crypto_int64 f0f9_2 = f0_2 * (crypto_int64) f9; + crypto_int64 f1f1_2 = f1_2 * (crypto_int64) f1; + crypto_int64 f1f2_2 = f1_2 * (crypto_int64) f2; + crypto_int64 f1f3_4 = f1_2 * (crypto_int64) f3_2; + crypto_int64 f1f4_2 = f1_2 * (crypto_int64) f4; + crypto_int64 f1f5_4 = f1_2 * (crypto_int64) f5_2; + crypto_int64 f1f6_2 = f1_2 * (crypto_int64) f6; + crypto_int64 f1f7_4 = f1_2 * (crypto_int64) f7_2; + crypto_int64 f1f8_2 = f1_2 * (crypto_int64) f8; + crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38; + crypto_int64 f2f2 = f2 * (crypto_int64) f2; + crypto_int64 f2f3_2 = f2_2 * (crypto_int64) f3; + crypto_int64 f2f4_2 = f2_2 * (crypto_int64) f4; + crypto_int64 f2f5_2 = f2_2 * (crypto_int64) f5; + crypto_int64 f2f6_2 = f2_2 * (crypto_int64) f6; + crypto_int64 f2f7_2 = f2_2 * (crypto_int64) f7; + crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19; + crypto_int64 f2f9_38 = f2 * (crypto_int64) f9_38; + crypto_int64 f3f3_2 = f3_2 * (crypto_int64) f3; + crypto_int64 f3f4_2 = f3_2 * (crypto_int64) f4; + crypto_int64 f3f5_4 = f3_2 * (crypto_int64) f5_2; + crypto_int64 f3f6_2 = f3_2 * (crypto_int64) f6; + crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38; + crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19; + crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38; + crypto_int64 f4f4 = f4 * (crypto_int64) f4; + crypto_int64 f4f5_2 = f4_2 * (crypto_int64) f5; + crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19; + crypto_int64 f4f7_38 = f4 * (crypto_int64) f7_38; + crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19; + crypto_int64 f4f9_38 = f4 * (crypto_int64) f9_38; + crypto_int64 f5f5_38 = f5 * (crypto_int64) f5_38; + crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19; + crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38; + crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19; + crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38; + crypto_int64 f6f6_19 = f6 * (crypto_int64) f6_19; + crypto_int64 f6f7_38 = f6 * (crypto_int64) f7_38; + crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19; + crypto_int64 f6f9_38 = f6 * (crypto_int64) f9_38; + crypto_int64 f7f7_38 = f7 * (crypto_int64) f7_38; + crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19; + crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38; + crypto_int64 f8f8_19 = f8 * (crypto_int64) f8_19; + crypto_int64 f8f9_38 = f8 * (crypto_int64) f9_38; + crypto_int64 f9f9_38 = f9 * (crypto_int64) f9_38; + crypto_int64 h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; + crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; + crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; + crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; + crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; + crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; + crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; + crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; + crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; + crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* +h = f - g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +void fe_sub(fe h,fe f,fe g) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 h0 = f0 - g0; + crypto_int32 h1 = f1 - g1; + crypto_int32 h2 = f2 - g2; + crypto_int32 h3 = f3 - g3; + crypto_int32 h4 = f4 - g4; + crypto_int32 h5 = f5 - g5; + crypto_int32 h6 = f6 - g6; + crypto_int32 h7 = f7 - g7; + crypto_int32 h8 = f8 - g8; + crypto_int32 h9 = f9 - g9; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* +Preconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Write p=2^255-19; q=floor(h/p). +Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). + +Proof: + Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. + Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. + + Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). + Then 0> 25; + q = (h0 + q) >> 26; + q = (h1 + q) >> 25; + q = (h2 + q) >> 26; + q = (h3 + q) >> 25; + q = (h4 + q) >> 26; + q = (h5 + q) >> 25; + q = (h6 + q) >> 26; + q = (h7 + q) >> 25; + q = (h8 + q) >> 26; + q = (h9 + q) >> 25; + + /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ + h0 += 19 * q; + /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ + + carry0 = h0 >> 26; h1 += carry0; h0 -= carry0 << 26; + carry1 = h1 >> 25; h2 += carry1; h1 -= carry1 << 25; + carry2 = h2 >> 26; h3 += carry2; h2 -= carry2 << 26; + carry3 = h3 >> 25; h4 += carry3; h3 -= carry3 << 25; + carry4 = h4 >> 26; h5 += carry4; h4 -= carry4 << 26; + carry5 = h5 >> 25; h6 += carry5; h5 -= carry5 << 25; + carry6 = h6 >> 26; h7 += carry6; h6 -= carry6 << 26; + carry7 = h7 >> 25; h8 += carry7; h7 -= carry7 << 25; + carry8 = h8 >> 26; h9 += carry8; h8 -= carry8 << 26; + carry9 = h9 >> 25; h9 -= carry9 << 25; + /* h10 = carry9 */ + + /* + Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. + Have h0+...+2^230 h9 between 0 and 2^255-1; + evidently 2^255 h10-2^255 q = 0. + Goal: Output h0+...+2^230 h9. + */ + + s[0] = h0 >> 0; + s[1] = h0 >> 8; + s[2] = h0 >> 16; + s[3] = (h0 >> 24) | (h1 << 2); + s[4] = h1 >> 6; + s[5] = h1 >> 14; + s[6] = (h1 >> 22) | (h2 << 3); + s[7] = h2 >> 5; + s[8] = h2 >> 13; + s[9] = (h2 >> 21) | (h3 << 5); + s[10] = h3 >> 3; + s[11] = h3 >> 11; + s[12] = (h3 >> 19) | (h4 << 6); + s[13] = h4 >> 2; + s[14] = h4 >> 10; + s[15] = h4 >> 18; + s[16] = h5 >> 0; + s[17] = h5 >> 8; + s[18] = h5 >> 16; + s[19] = (h5 >> 24) | (h6 << 1); + s[20] = h6 >> 7; + s[21] = h6 >> 15; + s[22] = (h6 >> 23) | (h7 << 3); + s[23] = h7 >> 5; + s[24] = h7 >> 13; + s[25] = (h7 >> 21) | (h8 << 4); + s[26] = h8 >> 4; + s[27] = h8 >> 12; + s[28] = (h8 >> 20) | (h9 << 6); + s[29] = h9 >> 2; + s[30] = h9 >> 10; + s[31] = h9 >> 18; +} + +void fe_invert(fe out,fe z) +{ + fe t0; + fe t1; + fe t2; + fe t3; + int i; + + +/* qhasm: fe z1 */ + +/* qhasm: fe z2 */ + +/* qhasm: fe z8 */ + +/* qhasm: fe z9 */ + +/* qhasm: fe z11 */ + +/* qhasm: fe z22 */ + +/* qhasm: fe z_5_0 */ + +/* qhasm: fe z_10_5 */ + +/* qhasm: fe z_10_0 */ + +/* qhasm: fe z_20_10 */ + +/* qhasm: fe z_20_0 */ + +/* qhasm: fe z_40_20 */ + +/* qhasm: fe z_40_0 */ + +/* qhasm: fe z_50_10 */ + +/* qhasm: fe z_50_0 */ + +/* qhasm: fe z_100_50 */ + +/* qhasm: fe z_100_0 */ + +/* qhasm: fe z_200_100 */ + +/* qhasm: fe z_200_0 */ + +/* qhasm: fe z_250_50 */ + +/* qhasm: fe z_250_0 */ + +/* qhasm: fe z_255_5 */ + +/* qhasm: fe z_255_21 */ + +/* qhasm: enter pow225521 */ + +/* qhasm: z2 = z1^2^1 */ +/* asm 1: fe_sq(>z2=fe#1,z2=fe#1,>z2=fe#1); */ +/* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ +fe_sq(t0,z); for (i = 1;i < 1;++i) fe_sq(t0,t0); + +/* qhasm: z8 = z2^2^2 */ +/* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ +/* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ +fe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1); + +/* qhasm: z9 = z1*z8 */ +/* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#3,z22=fe#3,>z22=fe#3); */ +/* asm 2: fe_sq(>z22=t2,z22=t2,>z22=t2); */ +fe_sq(t2,t0); for (i = 1;i < 1;++i) fe_sq(t2,t2); + +/* qhasm: z_5_0 = z9*z22 */ +/* asm 1: fe_mul(>z_5_0=fe#2,z_5_0=t1,z_10_5=fe#3,z_10_5=fe#3,>z_10_5=fe#3); */ +/* asm 2: fe_sq(>z_10_5=t2,z_10_5=t2,>z_10_5=t2); */ +fe_sq(t2,t1); for (i = 1;i < 5;++i) fe_sq(t2,t2); + +/* qhasm: z_10_0 = z_10_5*z_5_0 */ +/* asm 1: fe_mul(>z_10_0=fe#2,z_10_0=t1,z_20_10=fe#3,z_20_10=fe#3,>z_20_10=fe#3); */ +/* asm 2: fe_sq(>z_20_10=t2,z_20_10=t2,>z_20_10=t2); */ +fe_sq(t2,t1); for (i = 1;i < 10;++i) fe_sq(t2,t2); + +/* qhasm: z_20_0 = z_20_10*z_10_0 */ +/* asm 1: fe_mul(>z_20_0=fe#3,z_20_0=t2,z_40_20=fe#4,z_40_20=fe#4,>z_40_20=fe#4); */ +/* asm 2: fe_sq(>z_40_20=t3,z_40_20=t3,>z_40_20=t3); */ +fe_sq(t3,t2); for (i = 1;i < 20;++i) fe_sq(t3,t3); + +/* qhasm: z_40_0 = z_40_20*z_20_0 */ +/* asm 1: fe_mul(>z_40_0=fe#3,z_40_0=t2,z_50_10=fe#3,z_50_10=fe#3,>z_50_10=fe#3); */ +/* asm 2: fe_sq(>z_50_10=t2,z_50_10=t2,>z_50_10=t2); */ +fe_sq(t2,t2); for (i = 1;i < 10;++i) fe_sq(t2,t2); + +/* qhasm: z_50_0 = z_50_10*z_10_0 */ +/* asm 1: fe_mul(>z_50_0=fe#2,z_50_0=t1,z_100_50=fe#3,z_100_50=fe#3,>z_100_50=fe#3); */ +/* asm 2: fe_sq(>z_100_50=t2,z_100_50=t2,>z_100_50=t2); */ +fe_sq(t2,t1); for (i = 1;i < 50;++i) fe_sq(t2,t2); + +/* qhasm: z_100_0 = z_100_50*z_50_0 */ +/* asm 1: fe_mul(>z_100_0=fe#3,z_100_0=t2,z_200_100=fe#4,z_200_100=fe#4,>z_200_100=fe#4); */ +/* asm 2: fe_sq(>z_200_100=t3,z_200_100=t3,>z_200_100=t3); */ +fe_sq(t3,t2); for (i = 1;i < 100;++i) fe_sq(t3,t3); + +/* qhasm: z_200_0 = z_200_100*z_100_0 */ +/* asm 1: fe_mul(>z_200_0=fe#3,z_200_0=t2,z_250_50=fe#3,z_250_50=fe#3,>z_250_50=fe#3); */ +/* asm 2: fe_sq(>z_250_50=t2,z_250_50=t2,>z_250_50=t2); */ +fe_sq(t2,t2); for (i = 1;i < 50;++i) fe_sq(t2,t2); + +/* qhasm: z_250_0 = z_250_50*z_50_0 */ +/* asm 1: fe_mul(>z_250_0=fe#2,z_250_0=t1,z_255_5=fe#2,z_255_5=fe#2,>z_255_5=fe#2); */ +/* asm 2: fe_sq(>z_255_5=t1,z_255_5=t1,>z_255_5=t1); */ +fe_sq(t1,t1); for (i = 1;i < 5;++i) fe_sq(t1,t1); + +/* qhasm: z_255_21 = z_255_5*z11 */ +/* asm 1: fe_mul(>z_255_21=fe#12,z_255_21=out,= 0;--pos) { + b = e[pos / 8] >> (pos & 7); + b &= 1; + swap ^= b; + fe_cswap(x2,x3,swap); + fe_cswap(z2,z3,swap); + swap = b; +/* qhasm: fe X2 */ + +/* qhasm: fe Z2 */ + +/* qhasm: fe X3 */ + +/* qhasm: fe Z3 */ + +/* qhasm: fe X4 */ + +/* qhasm: fe Z4 */ + +/* qhasm: fe X5 */ + +/* qhasm: fe Z5 */ + +/* qhasm: fe A */ + +/* qhasm: fe B */ + +/* qhasm: fe C */ + +/* qhasm: fe D */ + +/* qhasm: fe E */ + +/* qhasm: fe AA */ + +/* qhasm: fe BB */ + +/* qhasm: fe DA */ + +/* qhasm: fe CB */ + +/* qhasm: fe t0 */ + +/* qhasm: fe t1 */ + +/* qhasm: fe t2 */ + +/* qhasm: fe t3 */ + +/* qhasm: fe t4 */ + +/* qhasm: enter ladder */ + +/* qhasm: D = X3-Z3 */ +/* asm 1: fe_sub(>D=fe#5,D=tmp0,B=fe#6,B=tmp1,A=fe#1,A=x2,C=fe#2,C=z2,DA=fe#4,DA=z3,CB=fe#2,CB=z2,BB=fe#5,BB=tmp0,AA=fe#6,AA=tmp1,t0=fe#3,t0=x3,t1=fe#2,t1=z2,X4=fe#1,X4=x2,E=fe#6,E=tmp1,t2=fe#2,t2=z2,t3=fe#4,t3=z3,X5=fe#3,X5=x3,t4=fe#5,t4=tmp0,Z5=fe#4,x1,Z5=z3,x1,Z4=fe#2,Z4=z2, + +typedef unsigned char ed25519_signature[64]; +typedef unsigned char ed25519_public_key[32]; +typedef unsigned char ed25519_secret_key[32]; + +typedef unsigned char curved25519_key[32]; + +void ed25519_publickey(const ed25519_secret_key sk, ed25519_public_key pk); +int ed25519_sign_open(const unsigned char *m, size_t mlen, const ed25519_public_key pk, const ed25519_signature RS); +void ed25519_sign(const unsigned char *m, size_t mlen, const ed25519_secret_key sk, const ed25519_public_key pk, ed25519_signature RS); + +int ed25519_sign_open_batch(const unsigned char **m, size_t *mlen, const unsigned char **pk, const unsigned char **RS, size_t num, int *valid); + +void ed25519_randombytes_unsafe(void *out, size_t count); + +void curved25519_scalarmult_basepoint(curved25519_key pk, const curved25519_key e); + +#if defined(ED25519_SSE2) +void ed25519_publickey_sse2(const ed25519_secret_key sk, ed25519_public_key pk); +int ed25519_sign_open_sse2(const unsigned char *m, size_t mlen, const ed25519_public_key pk, const ed25519_signature RS); +void ed25519_sign_sse2(const unsigned char *m, size_t mlen, const ed25519_secret_key sk, const ed25519_public_key pk, ed25519_signature RS); + +int ed25519_sign_open_batch_sse2(const unsigned char **m, size_t *mlen, const unsigned char **pk, const unsigned char **RS, size_t num, int *valid); + +void ed25519_randombytes_unsafe_sse2(void *out, size_t count); + +void curved25519_scalarmult_basepoint_sse2(curved25519_key pk, const curved25519_key e); +#endif + +#endif // ED25519_H diff --git a/src/wraith/src/ext/ed25519/donna/fuzz/ed25519-ref10.c b/src/wraith/src/ext/ed25519/donna/fuzz/ed25519-ref10.c new file mode 100644 index 000000000..a8e802df2 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/fuzz/ed25519-ref10.c @@ -0,0 +1,4647 @@ +#include +#include +#include + +static int crypto_verify_32(const unsigned char *x,const unsigned char *y) +{ + unsigned int differentbits = 0; +#define F(i) differentbits |= x[i] ^ y[i]; + F(0) + F(1) + F(2) + F(3) + F(4) + F(5) + F(6) + F(7) + F(8) + F(9) + F(10) + F(11) + F(12) + F(13) + F(14) + F(15) + F(16) + F(17) + F(18) + F(19) + F(20) + F(21) + F(22) + F(23) + F(24) + F(25) + F(26) + F(27) + F(28) + F(29) + F(30) + F(31) + return (1 & ((differentbits - 1) >> 8)) - 1; +} + +#if defined(ED25519_REFHASH) + +/* reference/slow SHA-512. really, do not use this */ + +#define HASH_BLOCK_SIZE 128 +#define HASH_DIGEST_SIZE 64 + +typedef struct sha512_state_t { + uint64_t H[8]; + uint64_t T[2]; + uint32_t leftover; + uint8_t buffer[HASH_BLOCK_SIZE]; +} sha512_state; + +typedef sha512_state ed25519_hash_context; + +static const uint64_t sha512_constants[80] = { + 0x428a2f98d728ae22ull, 0x7137449123ef65cdull, 0xb5c0fbcfec4d3b2full, 0xe9b5dba58189dbbcull, + 0x3956c25bf348b538ull, 0x59f111f1b605d019ull, 0x923f82a4af194f9bull, 0xab1c5ed5da6d8118ull, + 0xd807aa98a3030242ull, 0x12835b0145706fbeull, 0x243185be4ee4b28cull, 0x550c7dc3d5ffb4e2ull, + 0x72be5d74f27b896full, 0x80deb1fe3b1696b1ull, 0x9bdc06a725c71235ull, 0xc19bf174cf692694ull, + 0xe49b69c19ef14ad2ull, 0xefbe4786384f25e3ull, 0x0fc19dc68b8cd5b5ull, 0x240ca1cc77ac9c65ull, + 0x2de92c6f592b0275ull, 0x4a7484aa6ea6e483ull, 0x5cb0a9dcbd41fbd4ull, 0x76f988da831153b5ull, + 0x983e5152ee66dfabull, 0xa831c66d2db43210ull, 0xb00327c898fb213full, 0xbf597fc7beef0ee4ull, + 0xc6e00bf33da88fc2ull, 0xd5a79147930aa725ull, 0x06ca6351e003826full, 0x142929670a0e6e70ull, + 0x27b70a8546d22ffcull, 0x2e1b21385c26c926ull, 0x4d2c6dfc5ac42aedull, 0x53380d139d95b3dfull, + 0x650a73548baf63deull, 0x766a0abb3c77b2a8ull, 0x81c2c92e47edaee6ull, 0x92722c851482353bull, + 0xa2bfe8a14cf10364ull, 0xa81a664bbc423001ull, 0xc24b8b70d0f89791ull, 0xc76c51a30654be30ull, + 0xd192e819d6ef5218ull, 0xd69906245565a910ull, 0xf40e35855771202aull, 0x106aa07032bbd1b8ull, + 0x19a4c116b8d2d0c8ull, 0x1e376c085141ab53ull, 0x2748774cdf8eeb99ull, 0x34b0bcb5e19b48a8ull, + 0x391c0cb3c5c95a63ull, 0x4ed8aa4ae3418acbull, 0x5b9cca4f7763e373ull, 0x682e6ff3d6b2b8a3ull, + 0x748f82ee5defb2fcull, 0x78a5636f43172f60ull, 0x84c87814a1f0ab72ull, 0x8cc702081a6439ecull, + 0x90befffa23631e28ull, 0xa4506cebde82bde9ull, 0xbef9a3f7b2c67915ull, 0xc67178f2e372532bull, + 0xca273eceea26619cull, 0xd186b8c721c0c207ull, 0xeada7dd6cde0eb1eull, 0xf57d4f7fee6ed178ull, + 0x06f067aa72176fbaull, 0x0a637dc5a2c898a6ull, 0x113f9804bef90daeull, 0x1b710b35131c471bull, + 0x28db77f523047d84ull, 0x32caab7b40c72493ull, 0x3c9ebe0a15c9bebcull, 0x431d67c49c100d4cull, + 0x4cc5d4becb3e42b6ull, 0x597f299cfc657e2aull, 0x5fcb6fab3ad6faecull, 0x6c44198c4a475817ull +}; + +static uint64_t +sha512_ROTR64(uint64_t x, int k) { + return (x >> k) | (x << (64 - k)); +} + +static uint64_t +sha512_LOAD64_BE(const uint8_t *p) { + return + ((uint64_t)p[0] << 56) | + ((uint64_t)p[1] << 48) | + ((uint64_t)p[2] << 40) | + ((uint64_t)p[3] << 32) | + ((uint64_t)p[4] << 24) | + ((uint64_t)p[5] << 16) | + ((uint64_t)p[6] << 8) | + ((uint64_t)p[7] ); +} + +static void +sha512_STORE64_BE(uint8_t *p, uint64_t v) { + p[0] = (uint8_t)(v >> 56); + p[1] = (uint8_t)(v >> 48); + p[2] = (uint8_t)(v >> 40); + p[3] = (uint8_t)(v >> 32); + p[4] = (uint8_t)(v >> 24); + p[5] = (uint8_t)(v >> 16); + p[6] = (uint8_t)(v >> 8); + p[7] = (uint8_t)(v ); +} + +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S0(x) (sha512_ROTR64(x, 28) ^ sha512_ROTR64(x, 34) ^ sha512_ROTR64(x, 39)) +#define S1(x) (sha512_ROTR64(x, 14) ^ sha512_ROTR64(x, 18) ^ sha512_ROTR64(x, 41)) +#define G0(x) (sha512_ROTR64(x, 1) ^ sha512_ROTR64(x, 8) ^ (x >> 7)) +#define G1(x) (sha512_ROTR64(x, 19) ^ sha512_ROTR64(x, 61) ^ (x >> 6)) +#define W0(in,i) (sha512_LOAD64_BE(&in[i * 8])) +#define W1(i) (G1(w[i - 2]) + w[i - 7] + G0(w[i - 15]) + w[i - 16]) +#define STEP(i) \ + t1 = S0(r[0]) + Maj(r[0], r[1], r[2]); \ + t0 = r[7] + S1(r[4]) + Ch(r[4], r[5], r[6]) + sha512_constants[i] + w[i]; \ + r[7] = r[6]; \ + r[6] = r[5]; \ + r[5] = r[4]; \ + r[4] = r[3] + t0; \ + r[3] = r[2]; \ + r[2] = r[1]; \ + r[1] = r[0]; \ + r[0] = t0 + t1; + +static void +sha512_blocks(sha512_state *S, const uint8_t *in, size_t blocks) { + uint64_t r[8], w[80], t0, t1; + size_t i; + + for (i = 0; i < 8; i++) r[i] = S->H[i]; + + while (blocks--) { + for (i = 0; i < 16; i++) { w[i] = W0(in, i); } + for (i = 16; i < 80; i++) { w[i] = W1(i); } + for (i = 0; i < 80; i++) { STEP(i); } + for (i = 0; i < 8; i++) { r[i] += S->H[i]; S->H[i] = r[i]; } + S->T[0] += HASH_BLOCK_SIZE * 8; + S->T[1] += (!S->T[0]) ? 1 : 0; + in += HASH_BLOCK_SIZE; + } +} + +static void +ed25519_hash_init(sha512_state *S) { + S->H[0] = 0x6a09e667f3bcc908ull; + S->H[1] = 0xbb67ae8584caa73bull; + S->H[2] = 0x3c6ef372fe94f82bull; + S->H[3] = 0xa54ff53a5f1d36f1ull; + S->H[4] = 0x510e527fade682d1ull; + S->H[5] = 0x9b05688c2b3e6c1full; + S->H[6] = 0x1f83d9abfb41bd6bull; + S->H[7] = 0x5be0cd19137e2179ull; + S->T[0] = 0; + S->T[1] = 0; + S->leftover = 0; +} + +static void +ed25519_hash_update(sha512_state *S, const uint8_t *in, size_t inlen) { + size_t blocks, want; + + /* handle the previous data */ + if (S->leftover) { + want = (HASH_BLOCK_SIZE - S->leftover); + want = (want < inlen) ? want : inlen; + memcpy(S->buffer + S->leftover, in, want); + S->leftover += (uint32_t)want; + if (S->leftover < HASH_BLOCK_SIZE) + return; + in += want; + inlen -= want; + sha512_blocks(S, S->buffer, 1); + } + + /* handle the current data */ + blocks = (inlen & ~(HASH_BLOCK_SIZE - 1)); + S->leftover = (uint32_t)(inlen - blocks); + if (blocks) { + sha512_blocks(S, in, blocks / HASH_BLOCK_SIZE); + in += blocks; + } + + /* handle leftover data */ + if (S->leftover) + memcpy(S->buffer, in, S->leftover); +} + +static void +ed25519_hash_final(sha512_state *S, uint8_t *hash) { + uint64_t t0 = S->T[0] + (S->leftover * 8), t1 = S->T[1]; + + S->buffer[S->leftover] = 0x80; + if (S->leftover <= 111) { + memset(S->buffer + S->leftover + 1, 0, 111 - S->leftover); + } else { + memset(S->buffer + S->leftover + 1, 0, 127 - S->leftover); + sha512_blocks(S, S->buffer, 1); + memset(S->buffer, 0, 112); + } + + sha512_STORE64_BE(S->buffer + 112, t1); + sha512_STORE64_BE(S->buffer + 120, t0); + sha512_blocks(S, S->buffer, 1); + + sha512_STORE64_BE(&hash[ 0], S->H[0]); + sha512_STORE64_BE(&hash[ 8], S->H[1]); + sha512_STORE64_BE(&hash[16], S->H[2]); + sha512_STORE64_BE(&hash[24], S->H[3]); + sha512_STORE64_BE(&hash[32], S->H[4]); + sha512_STORE64_BE(&hash[40], S->H[5]); + sha512_STORE64_BE(&hash[48], S->H[6]); + sha512_STORE64_BE(&hash[56], S->H[7]); +} + +static void +crypto_hash_sha512(unsigned char *hash, const unsigned char *in, size_t inlen) { + ed25519_hash_context ctx; + ed25519_hash_init(&ctx); + ed25519_hash_update(&ctx, in, inlen); + ed25519_hash_final(&ctx, hash); +} + +#else + +#include + +static void +crypto_hash_sha512(unsigned char *hash, const unsigned char *in, size_t inlen) { + SHA512(in, inlen, hash); +} + +#endif + + + + +typedef int32_t crypto_int32; +typedef uint32_t crypto_uint32; +typedef int64_t crypto_int64; +typedef uint64_t crypto_uint64; + +typedef crypto_int32 fe[10]; + +/* +h = 0 +*/ + +static void fe_0(fe h) +{ + h[0] = 0; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + +/* +h = 1 +*/ + +static void fe_1(fe h) +{ + h[0] = 1; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + +/* +h = f + g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +static void fe_add(fe h,const fe f,const fe g) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 h0 = f0 + g0; + crypto_int32 h1 = f1 + g1; + crypto_int32 h2 = f2 + g2; + crypto_int32 h3 = f3 + g3; + crypto_int32 h4 = f4 + g4; + crypto_int32 h5 = f5 + g5; + crypto_int32 h6 = f6 + g6; + crypto_int32 h7 = f7 + g7; + crypto_int32 h8 = f8 + g8; + crypto_int32 h9 = f9 + g9; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + +/* +Replace (f,g) with (g,g) if b == 1; +replace (f,g) with (f,g) if b == 0. + +Preconditions: b in {0,1}. +*/ + +static void fe_cmov(fe f,const fe g,unsigned int b) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 x0 = f0 ^ g0; + crypto_int32 x1 = f1 ^ g1; + crypto_int32 x2 = f2 ^ g2; + crypto_int32 x3 = f3 ^ g3; + crypto_int32 x4 = f4 ^ g4; + crypto_int32 x5 = f5 ^ g5; + crypto_int32 x6 = f6 ^ g6; + crypto_int32 x7 = f7 ^ g7; + crypto_int32 x8 = f8 ^ g8; + crypto_int32 x9 = f9 ^ g9; + b = -b; + x0 &= b; + x1 &= b; + x2 &= b; + x3 &= b; + x4 &= b; + x5 &= b; + x6 &= b; + x7 &= b; + x8 &= b; + x9 &= b; + f[0] = f0 ^ x0; + f[1] = f1 ^ x1; + f[2] = f2 ^ x2; + f[3] = f3 ^ x3; + f[4] = f4 ^ x4; + f[5] = f5 ^ x5; + f[6] = f6 ^ x6; + f[7] = f7 ^ x7; + f[8] = f8 ^ x8; + f[9] = f9 ^ x9; +} + + +/* +h = f +*/ + +static void fe_copy(fe h,const fe f) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + h[0] = f0; + h[1] = f1; + h[2] = f2; + h[3] = f3; + h[4] = f4; + h[5] = f5; + h[6] = f6; + h[7] = f7; + h[8] = f8; + h[9] = f9; +} + + +static crypto_uint64 load_3(const unsigned char *in) +{ + crypto_uint64 result; + result = (crypto_uint64) in[0]; + result |= ((crypto_uint64) in[1]) << 8; + result |= ((crypto_uint64) in[2]) << 16; + return result; +} + +static crypto_uint64 load_4(const unsigned char *in) +{ + crypto_uint64 result; + result = (crypto_uint64) in[0]; + result |= ((crypto_uint64) in[1]) << 8; + result |= ((crypto_uint64) in[2]) << 16; + result |= ((crypto_uint64) in[3]) << 24; + return result; +} + +/* +Ignores top bit of h. +*/ + +static void fe_frombytes(fe h,const unsigned char *s) +{ + crypto_int64 h0 = load_4(s); + crypto_int64 h1 = load_3(s + 4) << 6; + crypto_int64 h2 = load_3(s + 7) << 5; + crypto_int64 h3 = load_3(s + 10) << 3; + crypto_int64 h4 = load_3(s + 13) << 2; + crypto_int64 h5 = load_4(s + 16); + crypto_int64 h6 = load_3(s + 20) << 7; + crypto_int64 h7 = load_3(s + 23) << 5; + crypto_int64 h8 = load_3(s + 26) << 4; + crypto_int64 h9 = (load_3(s + 29) & 8388607) << 2; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* +Preconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Write p=2^255-19; q=floor(h/p). +Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). + +Proof: + Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. + Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4. + + Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). + Then 0> 25; + q = (h0 + q) >> 26; + q = (h1 + q) >> 25; + q = (h2 + q) >> 26; + q = (h3 + q) >> 25; + q = (h4 + q) >> 26; + q = (h5 + q) >> 25; + q = (h6 + q) >> 26; + q = (h7 + q) >> 25; + q = (h8 + q) >> 26; + q = (h9 + q) >> 25; + + /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ + h0 += 19 * q; + /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ + + carry0 = h0 >> 26; h1 += carry0; h0 -= carry0 << 26; + carry1 = h1 >> 25; h2 += carry1; h1 -= carry1 << 25; + carry2 = h2 >> 26; h3 += carry2; h2 -= carry2 << 26; + carry3 = h3 >> 25; h4 += carry3; h3 -= carry3 << 25; + carry4 = h4 >> 26; h5 += carry4; h4 -= carry4 << 26; + carry5 = h5 >> 25; h6 += carry5; h5 -= carry5 << 25; + carry6 = h6 >> 26; h7 += carry6; h6 -= carry6 << 26; + carry7 = h7 >> 25; h8 += carry7; h7 -= carry7 << 25; + carry8 = h8 >> 26; h9 += carry8; h8 -= carry8 << 26; + carry9 = h9 >> 25; h9 -= carry9 << 25; + /* h10 = carry9 */ + + /* + Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. + Have h0+...+2^230 h9 between 0 and 2^255-1; + evidently 2^255 h10-2^255 q = 0. + Goal: Output h0+...+2^230 h9. + */ + + s[0] = h0 >> 0; + s[1] = h0 >> 8; + s[2] = h0 >> 16; + s[3] = (h0 >> 24) | (h1 << 2); + s[4] = h1 >> 6; + s[5] = h1 >> 14; + s[6] = (h1 >> 22) | (h2 << 3); + s[7] = h2 >> 5; + s[8] = h2 >> 13; + s[9] = (h2 >> 21) | (h3 << 5); + s[10] = h3 >> 3; + s[11] = h3 >> 11; + s[12] = (h3 >> 19) | (h4 << 6); + s[13] = h4 >> 2; + s[14] = h4 >> 10; + s[15] = h4 >> 18; + s[16] = h5 >> 0; + s[17] = h5 >> 8; + s[18] = h5 >> 16; + s[19] = (h5 >> 24) | (h6 << 1); + s[20] = h6 >> 7; + s[21] = h6 >> 15; + s[22] = (h6 >> 23) | (h7 << 3); + s[23] = h7 >> 5; + s[24] = h7 >> 13; + s[25] = (h7 >> 21) | (h8 << 4); + s[26] = h8 >> 4; + s[27] = h8 >> 12; + s[28] = (h8 >> 20) | (h9 << 6); + s[29] = h9 >> 2; + s[30] = h9 >> 10; + s[31] = h9 >> 18; +} + + +/* +h = f - g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +static void fe_sub(fe h,const fe f,const fe g) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 h0 = f0 - g0; + crypto_int32 h1 = f1 - g1; + crypto_int32 h2 = f2 - g2; + crypto_int32 h3 = f3 - g3; + crypto_int32 h4 = f4 - g4; + crypto_int32 h5 = f5 - g5; + crypto_int32 h6 = f6 - g6; + crypto_int32 h7 = f7 - g7; + crypto_int32 h8 = f8 - g8; + crypto_int32 h9 = f9 - g9; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + +/* +h = f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +static void fe_sq(fe h,const fe f) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 f0_2 = 2 * f0; + crypto_int32 f1_2 = 2 * f1; + crypto_int32 f2_2 = 2 * f2; + crypto_int32 f3_2 = 2 * f3; + crypto_int32 f4_2 = 2 * f4; + crypto_int32 f5_2 = 2 * f5; + crypto_int32 f6_2 = 2 * f6; + crypto_int32 f7_2 = 2 * f7; + crypto_int32 f5_38 = 38 * f5; /* 1.959375*2^30 */ + crypto_int32 f6_19 = 19 * f6; /* 1.959375*2^30 */ + crypto_int32 f7_38 = 38 * f7; /* 1.959375*2^30 */ + crypto_int32 f8_19 = 19 * f8; /* 1.959375*2^30 */ + crypto_int32 f9_38 = 38 * f9; /* 1.959375*2^30 */ + crypto_int64 f0f0 = f0 * (crypto_int64) f0; + crypto_int64 f0f1_2 = f0_2 * (crypto_int64) f1; + crypto_int64 f0f2_2 = f0_2 * (crypto_int64) f2; + crypto_int64 f0f3_2 = f0_2 * (crypto_int64) f3; + crypto_int64 f0f4_2 = f0_2 * (crypto_int64) f4; + crypto_int64 f0f5_2 = f0_2 * (crypto_int64) f5; + crypto_int64 f0f6_2 = f0_2 * (crypto_int64) f6; + crypto_int64 f0f7_2 = f0_2 * (crypto_int64) f7; + crypto_int64 f0f8_2 = f0_2 * (crypto_int64) f8; + crypto_int64 f0f9_2 = f0_2 * (crypto_int64) f9; + crypto_int64 f1f1_2 = f1_2 * (crypto_int64) f1; + crypto_int64 f1f2_2 = f1_2 * (crypto_int64) f2; + crypto_int64 f1f3_4 = f1_2 * (crypto_int64) f3_2; + crypto_int64 f1f4_2 = f1_2 * (crypto_int64) f4; + crypto_int64 f1f5_4 = f1_2 * (crypto_int64) f5_2; + crypto_int64 f1f6_2 = f1_2 * (crypto_int64) f6; + crypto_int64 f1f7_4 = f1_2 * (crypto_int64) f7_2; + crypto_int64 f1f8_2 = f1_2 * (crypto_int64) f8; + crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38; + crypto_int64 f2f2 = f2 * (crypto_int64) f2; + crypto_int64 f2f3_2 = f2_2 * (crypto_int64) f3; + crypto_int64 f2f4_2 = f2_2 * (crypto_int64) f4; + crypto_int64 f2f5_2 = f2_2 * (crypto_int64) f5; + crypto_int64 f2f6_2 = f2_2 * (crypto_int64) f6; + crypto_int64 f2f7_2 = f2_2 * (crypto_int64) f7; + crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19; + crypto_int64 f2f9_38 = f2 * (crypto_int64) f9_38; + crypto_int64 f3f3_2 = f3_2 * (crypto_int64) f3; + crypto_int64 f3f4_2 = f3_2 * (crypto_int64) f4; + crypto_int64 f3f5_4 = f3_2 * (crypto_int64) f5_2; + crypto_int64 f3f6_2 = f3_2 * (crypto_int64) f6; + crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38; + crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19; + crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38; + crypto_int64 f4f4 = f4 * (crypto_int64) f4; + crypto_int64 f4f5_2 = f4_2 * (crypto_int64) f5; + crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19; + crypto_int64 f4f7_38 = f4 * (crypto_int64) f7_38; + crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19; + crypto_int64 f4f9_38 = f4 * (crypto_int64) f9_38; + crypto_int64 f5f5_38 = f5 * (crypto_int64) f5_38; + crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19; + crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38; + crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19; + crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38; + crypto_int64 f6f6_19 = f6 * (crypto_int64) f6_19; + crypto_int64 f6f7_38 = f6 * (crypto_int64) f7_38; + crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19; + crypto_int64 f6f9_38 = f6 * (crypto_int64) f9_38; + crypto_int64 f7f7_38 = f7 * (crypto_int64) f7_38; + crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19; + crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38; + crypto_int64 f8f8_19 = f8 * (crypto_int64) f8_19; + crypto_int64 f8f9_38 = f8 * (crypto_int64) f9_38; + crypto_int64 f9f9_38 = f9 * (crypto_int64) f9_38; + crypto_int64 h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; + crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; + crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; + crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; + crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; + crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; + crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; + crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; + crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; + crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* +h = 2 * f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +static void fe_sq2(fe h,const fe f) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 f0_2 = 2 * f0; + crypto_int32 f1_2 = 2 * f1; + crypto_int32 f2_2 = 2 * f2; + crypto_int32 f3_2 = 2 * f3; + crypto_int32 f4_2 = 2 * f4; + crypto_int32 f5_2 = 2 * f5; + crypto_int32 f6_2 = 2 * f6; + crypto_int32 f7_2 = 2 * f7; + crypto_int32 f5_38 = 38 * f5; /* 1.959375*2^30 */ + crypto_int32 f6_19 = 19 * f6; /* 1.959375*2^30 */ + crypto_int32 f7_38 = 38 * f7; /* 1.959375*2^30 */ + crypto_int32 f8_19 = 19 * f8; /* 1.959375*2^30 */ + crypto_int32 f9_38 = 38 * f9; /* 1.959375*2^30 */ + crypto_int64 f0f0 = f0 * (crypto_int64) f0; + crypto_int64 f0f1_2 = f0_2 * (crypto_int64) f1; + crypto_int64 f0f2_2 = f0_2 * (crypto_int64) f2; + crypto_int64 f0f3_2 = f0_2 * (crypto_int64) f3; + crypto_int64 f0f4_2 = f0_2 * (crypto_int64) f4; + crypto_int64 f0f5_2 = f0_2 * (crypto_int64) f5; + crypto_int64 f0f6_2 = f0_2 * (crypto_int64) f6; + crypto_int64 f0f7_2 = f0_2 * (crypto_int64) f7; + crypto_int64 f0f8_2 = f0_2 * (crypto_int64) f8; + crypto_int64 f0f9_2 = f0_2 * (crypto_int64) f9; + crypto_int64 f1f1_2 = f1_2 * (crypto_int64) f1; + crypto_int64 f1f2_2 = f1_2 * (crypto_int64) f2; + crypto_int64 f1f3_4 = f1_2 * (crypto_int64) f3_2; + crypto_int64 f1f4_2 = f1_2 * (crypto_int64) f4; + crypto_int64 f1f5_4 = f1_2 * (crypto_int64) f5_2; + crypto_int64 f1f6_2 = f1_2 * (crypto_int64) f6; + crypto_int64 f1f7_4 = f1_2 * (crypto_int64) f7_2; + crypto_int64 f1f8_2 = f1_2 * (crypto_int64) f8; + crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38; + crypto_int64 f2f2 = f2 * (crypto_int64) f2; + crypto_int64 f2f3_2 = f2_2 * (crypto_int64) f3; + crypto_int64 f2f4_2 = f2_2 * (crypto_int64) f4; + crypto_int64 f2f5_2 = f2_2 * (crypto_int64) f5; + crypto_int64 f2f6_2 = f2_2 * (crypto_int64) f6; + crypto_int64 f2f7_2 = f2_2 * (crypto_int64) f7; + crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19; + crypto_int64 f2f9_38 = f2 * (crypto_int64) f9_38; + crypto_int64 f3f3_2 = f3_2 * (crypto_int64) f3; + crypto_int64 f3f4_2 = f3_2 * (crypto_int64) f4; + crypto_int64 f3f5_4 = f3_2 * (crypto_int64) f5_2; + crypto_int64 f3f6_2 = f3_2 * (crypto_int64) f6; + crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38; + crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19; + crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38; + crypto_int64 f4f4 = f4 * (crypto_int64) f4; + crypto_int64 f4f5_2 = f4_2 * (crypto_int64) f5; + crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19; + crypto_int64 f4f7_38 = f4 * (crypto_int64) f7_38; + crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19; + crypto_int64 f4f9_38 = f4 * (crypto_int64) f9_38; + crypto_int64 f5f5_38 = f5 * (crypto_int64) f5_38; + crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19; + crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38; + crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19; + crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38; + crypto_int64 f6f6_19 = f6 * (crypto_int64) f6_19; + crypto_int64 f6f7_38 = f6 * (crypto_int64) f7_38; + crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19; + crypto_int64 f6f9_38 = f6 * (crypto_int64) f9_38; + crypto_int64 f7f7_38 = f7 * (crypto_int64) f7_38; + crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19; + crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38; + crypto_int64 f8f8_19 = f8 * (crypto_int64) f8_19; + crypto_int64 f8f9_38 = f8 * (crypto_int64) f9_38; + crypto_int64 f9f9_38 = f9 * (crypto_int64) f9_38; + crypto_int64 h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; + crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; + crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; + crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; + crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; + crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; + crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; + crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; + crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; + crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + h0 += h0; + h1 += h1; + h2 += h2; + h3 += h3; + h4 += h4; + h5 += h5; + h6 += h6; + h7 += h7; + h8 += h8; + h9 += h9; + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* +h = f * g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +Notes on implementation strategy: + +Using schoolbook multiplication. +Karatsuba would save a little in some cost models. + +Most multiplications by 2 and 19 are 32-bit precomputations; +cheaper than 64-bit postcomputations. + +There is one remaining multiplication by 19 in the carry chain; +one *19 precomputation can be merged into this, +but the resulting data flow is considerably less clean. + +There are 12 carries below. +10 of them are 2-way parallelizable and vectorizable. +Can get away with 11 carries, but then data flow is much deeper. + +With tighter constraints on inputs can squeeze carries into int32. +*/ + +static void fe_mul(fe h,const fe f,const fe g) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 g1_19 = 19 * g1; /* 1.959375*2^29 */ + crypto_int32 g2_19 = 19 * g2; /* 1.959375*2^30; still ok */ + crypto_int32 g3_19 = 19 * g3; + crypto_int32 g4_19 = 19 * g4; + crypto_int32 g5_19 = 19 * g5; + crypto_int32 g6_19 = 19 * g6; + crypto_int32 g7_19 = 19 * g7; + crypto_int32 g8_19 = 19 * g8; + crypto_int32 g9_19 = 19 * g9; + crypto_int32 f1_2 = 2 * f1; + crypto_int32 f3_2 = 2 * f3; + crypto_int32 f5_2 = 2 * f5; + crypto_int32 f7_2 = 2 * f7; + crypto_int32 f9_2 = 2 * f9; + crypto_int64 f0g0 = f0 * (crypto_int64) g0; + crypto_int64 f0g1 = f0 * (crypto_int64) g1; + crypto_int64 f0g2 = f0 * (crypto_int64) g2; + crypto_int64 f0g3 = f0 * (crypto_int64) g3; + crypto_int64 f0g4 = f0 * (crypto_int64) g4; + crypto_int64 f0g5 = f0 * (crypto_int64) g5; + crypto_int64 f0g6 = f0 * (crypto_int64) g6; + crypto_int64 f0g7 = f0 * (crypto_int64) g7; + crypto_int64 f0g8 = f0 * (crypto_int64) g8; + crypto_int64 f0g9 = f0 * (crypto_int64) g9; + crypto_int64 f1g0 = f1 * (crypto_int64) g0; + crypto_int64 f1g1_2 = f1_2 * (crypto_int64) g1; + crypto_int64 f1g2 = f1 * (crypto_int64) g2; + crypto_int64 f1g3_2 = f1_2 * (crypto_int64) g3; + crypto_int64 f1g4 = f1 * (crypto_int64) g4; + crypto_int64 f1g5_2 = f1_2 * (crypto_int64) g5; + crypto_int64 f1g6 = f1 * (crypto_int64) g6; + crypto_int64 f1g7_2 = f1_2 * (crypto_int64) g7; + crypto_int64 f1g8 = f1 * (crypto_int64) g8; + crypto_int64 f1g9_38 = f1_2 * (crypto_int64) g9_19; + crypto_int64 f2g0 = f2 * (crypto_int64) g0; + crypto_int64 f2g1 = f2 * (crypto_int64) g1; + crypto_int64 f2g2 = f2 * (crypto_int64) g2; + crypto_int64 f2g3 = f2 * (crypto_int64) g3; + crypto_int64 f2g4 = f2 * (crypto_int64) g4; + crypto_int64 f2g5 = f2 * (crypto_int64) g5; + crypto_int64 f2g6 = f2 * (crypto_int64) g6; + crypto_int64 f2g7 = f2 * (crypto_int64) g7; + crypto_int64 f2g8_19 = f2 * (crypto_int64) g8_19; + crypto_int64 f2g9_19 = f2 * (crypto_int64) g9_19; + crypto_int64 f3g0 = f3 * (crypto_int64) g0; + crypto_int64 f3g1_2 = f3_2 * (crypto_int64) g1; + crypto_int64 f3g2 = f3 * (crypto_int64) g2; + crypto_int64 f3g3_2 = f3_2 * (crypto_int64) g3; + crypto_int64 f3g4 = f3 * (crypto_int64) g4; + crypto_int64 f3g5_2 = f3_2 * (crypto_int64) g5; + crypto_int64 f3g6 = f3 * (crypto_int64) g6; + crypto_int64 f3g7_38 = f3_2 * (crypto_int64) g7_19; + crypto_int64 f3g8_19 = f3 * (crypto_int64) g8_19; + crypto_int64 f3g9_38 = f3_2 * (crypto_int64) g9_19; + crypto_int64 f4g0 = f4 * (crypto_int64) g0; + crypto_int64 f4g1 = f4 * (crypto_int64) g1; + crypto_int64 f4g2 = f4 * (crypto_int64) g2; + crypto_int64 f4g3 = f4 * (crypto_int64) g3; + crypto_int64 f4g4 = f4 * (crypto_int64) g4; + crypto_int64 f4g5 = f4 * (crypto_int64) g5; + crypto_int64 f4g6_19 = f4 * (crypto_int64) g6_19; + crypto_int64 f4g7_19 = f4 * (crypto_int64) g7_19; + crypto_int64 f4g8_19 = f4 * (crypto_int64) g8_19; + crypto_int64 f4g9_19 = f4 * (crypto_int64) g9_19; + crypto_int64 f5g0 = f5 * (crypto_int64) g0; + crypto_int64 f5g1_2 = f5_2 * (crypto_int64) g1; + crypto_int64 f5g2 = f5 * (crypto_int64) g2; + crypto_int64 f5g3_2 = f5_2 * (crypto_int64) g3; + crypto_int64 f5g4 = f5 * (crypto_int64) g4; + crypto_int64 f5g5_38 = f5_2 * (crypto_int64) g5_19; + crypto_int64 f5g6_19 = f5 * (crypto_int64) g6_19; + crypto_int64 f5g7_38 = f5_2 * (crypto_int64) g7_19; + crypto_int64 f5g8_19 = f5 * (crypto_int64) g8_19; + crypto_int64 f5g9_38 = f5_2 * (crypto_int64) g9_19; + crypto_int64 f6g0 = f6 * (crypto_int64) g0; + crypto_int64 f6g1 = f6 * (crypto_int64) g1; + crypto_int64 f6g2 = f6 * (crypto_int64) g2; + crypto_int64 f6g3 = f6 * (crypto_int64) g3; + crypto_int64 f6g4_19 = f6 * (crypto_int64) g4_19; + crypto_int64 f6g5_19 = f6 * (crypto_int64) g5_19; + crypto_int64 f6g6_19 = f6 * (crypto_int64) g6_19; + crypto_int64 f6g7_19 = f6 * (crypto_int64) g7_19; + crypto_int64 f6g8_19 = f6 * (crypto_int64) g8_19; + crypto_int64 f6g9_19 = f6 * (crypto_int64) g9_19; + crypto_int64 f7g0 = f7 * (crypto_int64) g0; + crypto_int64 f7g1_2 = f7_2 * (crypto_int64) g1; + crypto_int64 f7g2 = f7 * (crypto_int64) g2; + crypto_int64 f7g3_38 = f7_2 * (crypto_int64) g3_19; + crypto_int64 f7g4_19 = f7 * (crypto_int64) g4_19; + crypto_int64 f7g5_38 = f7_2 * (crypto_int64) g5_19; + crypto_int64 f7g6_19 = f7 * (crypto_int64) g6_19; + crypto_int64 f7g7_38 = f7_2 * (crypto_int64) g7_19; + crypto_int64 f7g8_19 = f7 * (crypto_int64) g8_19; + crypto_int64 f7g9_38 = f7_2 * (crypto_int64) g9_19; + crypto_int64 f8g0 = f8 * (crypto_int64) g0; + crypto_int64 f8g1 = f8 * (crypto_int64) g1; + crypto_int64 f8g2_19 = f8 * (crypto_int64) g2_19; + crypto_int64 f8g3_19 = f8 * (crypto_int64) g3_19; + crypto_int64 f8g4_19 = f8 * (crypto_int64) g4_19; + crypto_int64 f8g5_19 = f8 * (crypto_int64) g5_19; + crypto_int64 f8g6_19 = f8 * (crypto_int64) g6_19; + crypto_int64 f8g7_19 = f8 * (crypto_int64) g7_19; + crypto_int64 f8g8_19 = f8 * (crypto_int64) g8_19; + crypto_int64 f8g9_19 = f8 * (crypto_int64) g9_19; + crypto_int64 f9g0 = f9 * (crypto_int64) g0; + crypto_int64 f9g1_38 = f9_2 * (crypto_int64) g1_19; + crypto_int64 f9g2_19 = f9 * (crypto_int64) g2_19; + crypto_int64 f9g3_38 = f9_2 * (crypto_int64) g3_19; + crypto_int64 f9g4_19 = f9 * (crypto_int64) g4_19; + crypto_int64 f9g5_38 = f9_2 * (crypto_int64) g5_19; + crypto_int64 f9g6_19 = f9 * (crypto_int64) g6_19; + crypto_int64 f9g7_38 = f9_2 * (crypto_int64) g7_19; + crypto_int64 f9g8_19 = f9 * (crypto_int64) g8_19; + crypto_int64 f9g9_38 = f9_2 * (crypto_int64) g9_19; + crypto_int64 h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38; + crypto_int64 h1 = f0g1+f1g0 +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19; + crypto_int64 h2 = f0g2+f1g1_2 +f2g0 +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38; + crypto_int64 h3 = f0g3+f1g2 +f2g1 +f3g0 +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19; + crypto_int64 h4 = f0g4+f1g3_2 +f2g2 +f3g1_2 +f4g0 +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38; + crypto_int64 h5 = f0g5+f1g4 +f2g3 +f3g2 +f4g1 +f5g0 +f6g9_19+f7g8_19+f8g7_19+f9g6_19; + crypto_int64 h6 = f0g6+f1g5_2 +f2g4 +f3g3_2 +f4g2 +f5g1_2 +f6g0 +f7g9_38+f8g8_19+f9g7_38; + crypto_int64 h7 = f0g7+f1g6 +f2g5 +f3g4 +f4g3 +f5g2 +f6g1 +f7g0 +f8g9_19+f9g8_19; + crypto_int64 h8 = f0g8+f1g7_2 +f2g6 +f3g5_2 +f4g4 +f5g3_2 +f6g2 +f7g1_2 +f8g0 +f9g9_38; + crypto_int64 h9 = f0g9+f1g8 +f2g7 +f3g6 +f4g5 +f5g4 +f6g3 +f7g2 +f8g1 +f9g0 ; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + /* + |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38)) + i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8 + |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19)) + i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9 + */ + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + /* |h0| <= 2^25 */ + /* |h4| <= 2^25 */ + /* |h1| <= 1.71*2^59 */ + /* |h5| <= 1.71*2^59 */ + + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + /* |h1| <= 2^24; from now on fits into int32 */ + /* |h5| <= 2^24; from now on fits into int32 */ + /* |h2| <= 1.41*2^60 */ + /* |h6| <= 1.41*2^60 */ + + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + /* |h2| <= 2^25; from now on fits into int32 unchanged */ + /* |h6| <= 2^25; from now on fits into int32 unchanged */ + /* |h3| <= 1.71*2^59 */ + /* |h7| <= 1.71*2^59 */ + + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + /* |h3| <= 2^24; from now on fits into int32 unchanged */ + /* |h7| <= 2^24; from now on fits into int32 unchanged */ + /* |h4| <= 1.72*2^34 */ + /* |h8| <= 1.41*2^60 */ + + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + /* |h4| <= 2^25; from now on fits into int32 unchanged */ + /* |h8| <= 2^25; from now on fits into int32 unchanged */ + /* |h5| <= 1.01*2^24 */ + /* |h9| <= 1.71*2^59 */ + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + /* |h9| <= 2^24; from now on fits into int32 unchanged */ + /* |h0| <= 1.1*2^39 */ + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + /* |h0| <= 2^25; from now on fits into int32 unchanged */ + /* |h1| <= 1.01*2^24 */ + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + +/* +return 1 if f is in {1,3,5,...,q-2} +return 0 if f is in {0,2,4,...,q-1} + +Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +static int fe_isnegative(const fe f) +{ + unsigned char s[32]; + fe_tobytes(s,f); + return s[0] & 1; +} + + +/* +return 1 if f == 0 +return 0 if f != 0 + +Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +static const unsigned char zero[32] = {0}; + +static int fe_isnonzero(const fe f) +{ + unsigned char s[32]; + fe_tobytes(s,f); + return crypto_verify_32(s,zero); +} + +/* +h = -f + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +static void fe_neg(fe h,const fe f) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 h0 = -f0; + crypto_int32 h1 = -f1; + crypto_int32 h2 = -f2; + crypto_int32 h3 = -f3; + crypto_int32 h4 = -f4; + crypto_int32 h5 = -f5; + crypto_int32 h6 = -f6; + crypto_int32 h7 = -f7; + crypto_int32 h8 = -f8; + crypto_int32 h9 = -f9; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +static void fe_invert(fe out,const fe z) +{ + fe t0; + fe t1; + fe t2; + fe t3; + int i; + + +/* qhasm: fe z1 */ + +/* qhasm: fe z2 */ + +/* qhasm: fe z8 */ + +/* qhasm: fe z9 */ + +/* qhasm: fe z11 */ + +/* qhasm: fe z22 */ + +/* qhasm: fe z_5_0 */ + +/* qhasm: fe z_10_5 */ + +/* qhasm: fe z_10_0 */ + +/* qhasm: fe z_20_10 */ + +/* qhasm: fe z_20_0 */ + +/* qhasm: fe z_40_20 */ + +/* qhasm: fe z_40_0 */ + +/* qhasm: fe z_50_10 */ + +/* qhasm: fe z_50_0 */ + +/* qhasm: fe z_100_50 */ + +/* qhasm: fe z_100_0 */ + +/* qhasm: fe z_200_100 */ + +/* qhasm: fe z_200_0 */ + +/* qhasm: fe z_250_50 */ + +/* qhasm: fe z_250_0 */ + +/* qhasm: fe z_255_5 */ + +/* qhasm: fe z_255_21 */ + +/* qhasm: enter pow225521 */ + +/* qhasm: z2 = z1^2^1 */ +/* asm 1: fe_sq(>z2=fe#1,z2=fe#1,>z2=fe#1); */ +/* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ +fe_sq(t0,z); for (i = 1;i < 1;++i) fe_sq(t0,t0); + +/* qhasm: z8 = z2^2^2 */ +/* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ +/* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ +fe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1); + +/* qhasm: z9 = z1*z8 */ +/* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#3,z22=fe#3,>z22=fe#3); */ +/* asm 2: fe_sq(>z22=t2,z22=t2,>z22=t2); */ +fe_sq(t2,t0); for (i = 1;i < 1;++i) fe_sq(t2,t2); + +/* qhasm: z_5_0 = z9*z22 */ +/* asm 1: fe_mul(>z_5_0=fe#2,z_5_0=t1,z_10_5=fe#3,z_10_5=fe#3,>z_10_5=fe#3); */ +/* asm 2: fe_sq(>z_10_5=t2,z_10_5=t2,>z_10_5=t2); */ +fe_sq(t2,t1); for (i = 1;i < 5;++i) fe_sq(t2,t2); + +/* qhasm: z_10_0 = z_10_5*z_5_0 */ +/* asm 1: fe_mul(>z_10_0=fe#2,z_10_0=t1,z_20_10=fe#3,z_20_10=fe#3,>z_20_10=fe#3); */ +/* asm 2: fe_sq(>z_20_10=t2,z_20_10=t2,>z_20_10=t2); */ +fe_sq(t2,t1); for (i = 1;i < 10;++i) fe_sq(t2,t2); + +/* qhasm: z_20_0 = z_20_10*z_10_0 */ +/* asm 1: fe_mul(>z_20_0=fe#3,z_20_0=t2,z_40_20=fe#4,z_40_20=fe#4,>z_40_20=fe#4); */ +/* asm 2: fe_sq(>z_40_20=t3,z_40_20=t3,>z_40_20=t3); */ +fe_sq(t3,t2); for (i = 1;i < 20;++i) fe_sq(t3,t3); + +/* qhasm: z_40_0 = z_40_20*z_20_0 */ +/* asm 1: fe_mul(>z_40_0=fe#3,z_40_0=t2,z_50_10=fe#3,z_50_10=fe#3,>z_50_10=fe#3); */ +/* asm 2: fe_sq(>z_50_10=t2,z_50_10=t2,>z_50_10=t2); */ +fe_sq(t2,t2); for (i = 1;i < 10;++i) fe_sq(t2,t2); + +/* qhasm: z_50_0 = z_50_10*z_10_0 */ +/* asm 1: fe_mul(>z_50_0=fe#2,z_50_0=t1,z_100_50=fe#3,z_100_50=fe#3,>z_100_50=fe#3); */ +/* asm 2: fe_sq(>z_100_50=t2,z_100_50=t2,>z_100_50=t2); */ +fe_sq(t2,t1); for (i = 1;i < 50;++i) fe_sq(t2,t2); + +/* qhasm: z_100_0 = z_100_50*z_50_0 */ +/* asm 1: fe_mul(>z_100_0=fe#3,z_100_0=t2,z_200_100=fe#4,z_200_100=fe#4,>z_200_100=fe#4); */ +/* asm 2: fe_sq(>z_200_100=t3,z_200_100=t3,>z_200_100=t3); */ +fe_sq(t3,t2); for (i = 1;i < 100;++i) fe_sq(t3,t3); + +/* qhasm: z_200_0 = z_200_100*z_100_0 */ +/* asm 1: fe_mul(>z_200_0=fe#3,z_200_0=t2,z_250_50=fe#3,z_250_50=fe#3,>z_250_50=fe#3); */ +/* asm 2: fe_sq(>z_250_50=t2,z_250_50=t2,>z_250_50=t2); */ +fe_sq(t2,t2); for (i = 1;i < 50;++i) fe_sq(t2,t2); + +/* qhasm: z_250_0 = z_250_50*z_50_0 */ +/* asm 1: fe_mul(>z_250_0=fe#2,z_250_0=t1,z_255_5=fe#2,z_255_5=fe#2,>z_255_5=fe#2); */ +/* asm 2: fe_sq(>z_255_5=t1,z_255_5=t1,>z_255_5=t1); */ +fe_sq(t1,t1); for (i = 1;i < 5;++i) fe_sq(t1,t1); + +/* qhasm: z_255_21 = z_255_5*z11 */ +/* asm 1: fe_mul(>z_255_21=fe#12,z_255_21=out,z2=fe#1,z2=fe#1,>z2=fe#1); */ +/* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ +fe_sq(t0,z); for (i = 1;i < 1;++i) fe_sq(t0,t0); + +/* qhasm: z8 = z2^2^2 */ +/* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ +/* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ +fe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1); + +/* qhasm: z9 = z1*z8 */ +/* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#1,z22=fe#1,>z22=fe#1); */ +/* asm 2: fe_sq(>z22=t0,z22=t0,>z22=t0); */ +fe_sq(t0,t0); for (i = 1;i < 1;++i) fe_sq(t0,t0); + +/* qhasm: z_5_0 = z9*z22 */ +/* asm 1: fe_mul(>z_5_0=fe#1,z_5_0=t0,z_10_5=fe#2,z_10_5=fe#2,>z_10_5=fe#2); */ +/* asm 2: fe_sq(>z_10_5=t1,z_10_5=t1,>z_10_5=t1); */ +fe_sq(t1,t0); for (i = 1;i < 5;++i) fe_sq(t1,t1); + +/* qhasm: z_10_0 = z_10_5*z_5_0 */ +/* asm 1: fe_mul(>z_10_0=fe#1,z_10_0=t0,z_20_10=fe#2,z_20_10=fe#2,>z_20_10=fe#2); */ +/* asm 2: fe_sq(>z_20_10=t1,z_20_10=t1,>z_20_10=t1); */ +fe_sq(t1,t0); for (i = 1;i < 10;++i) fe_sq(t1,t1); + +/* qhasm: z_20_0 = z_20_10*z_10_0 */ +/* asm 1: fe_mul(>z_20_0=fe#2,z_20_0=t1,z_40_20=fe#3,z_40_20=fe#3,>z_40_20=fe#3); */ +/* asm 2: fe_sq(>z_40_20=t2,z_40_20=t2,>z_40_20=t2); */ +fe_sq(t2,t1); for (i = 1;i < 20;++i) fe_sq(t2,t2); + +/* qhasm: z_40_0 = z_40_20*z_20_0 */ +/* asm 1: fe_mul(>z_40_0=fe#2,z_40_0=t1,z_50_10=fe#2,z_50_10=fe#2,>z_50_10=fe#2); */ +/* asm 2: fe_sq(>z_50_10=t1,z_50_10=t1,>z_50_10=t1); */ +fe_sq(t1,t1); for (i = 1;i < 10;++i) fe_sq(t1,t1); + +/* qhasm: z_50_0 = z_50_10*z_10_0 */ +/* asm 1: fe_mul(>z_50_0=fe#1,z_50_0=t0,z_100_50=fe#2,z_100_50=fe#2,>z_100_50=fe#2); */ +/* asm 2: fe_sq(>z_100_50=t1,z_100_50=t1,>z_100_50=t1); */ +fe_sq(t1,t0); for (i = 1;i < 50;++i) fe_sq(t1,t1); + +/* qhasm: z_100_0 = z_100_50*z_50_0 */ +/* asm 1: fe_mul(>z_100_0=fe#2,z_100_0=t1,z_200_100=fe#3,z_200_100=fe#3,>z_200_100=fe#3); */ +/* asm 2: fe_sq(>z_200_100=t2,z_200_100=t2,>z_200_100=t2); */ +fe_sq(t2,t1); for (i = 1;i < 100;++i) fe_sq(t2,t2); + +/* qhasm: z_200_0 = z_200_100*z_100_0 */ +/* asm 1: fe_mul(>z_200_0=fe#2,z_200_0=t1,z_250_50=fe#2,z_250_50=fe#2,>z_250_50=fe#2); */ +/* asm 2: fe_sq(>z_250_50=t1,z_250_50=t1,>z_250_50=t1); */ +fe_sq(t1,t1); for (i = 1;i < 50;++i) fe_sq(t1,t1); + +/* qhasm: z_250_0 = z_250_50*z_50_0 */ +/* asm 1: fe_mul(>z_250_0=fe#1,z_250_0=t0,z_252_2=fe#1,z_252_2=fe#1,>z_252_2=fe#1); */ +/* asm 2: fe_sq(>z_252_2=t0,z_252_2=t0,>z_252_2=t0); */ +fe_sq(t0,t0); for (i = 1;i < 2;++i) fe_sq(t0,t0); + +/* qhasm: z_252_3 = z_252_2*z1 */ +/* asm 1: fe_mul(>z_252_3=fe#12,z_252_3=out,X); + fe_1(h->Y); + fe_1(h->Z); +} + +static void ge_p3_0(ge_p3 *h) +{ + fe_0(h->X); + fe_1(h->Y); + fe_1(h->Z); + fe_0(h->T); +} + +static void ge_precomp_0(ge_precomp *h) +{ + fe_1(h->yplusx); + fe_1(h->yminusx); + fe_0(h->xy2d); +} + +/* +r = p +*/ + +static void ge_p1p1_to_p2(ge_p2 *r,const ge_p1p1 *p) +{ + fe_mul(r->X,p->X,p->T); + fe_mul(r->Y,p->Y,p->Z); + fe_mul(r->Z,p->Z,p->T); +} + +/* +r = p +*/ + +static void ge_p1p1_to_p3(ge_p3 *r,const ge_p1p1 *p) +{ + fe_mul(r->X,p->X,p->T); + fe_mul(r->Y,p->Y,p->Z); + fe_mul(r->Z,p->Z,p->T); + fe_mul(r->T,p->X,p->Y); +} + +/* +r = p +*/ + +static void ge_p3_to_p2(ge_p2 *r,const ge_p3 *p) +{ + fe_copy(r->X,p->X); + fe_copy(r->Y,p->Y); + fe_copy(r->Z,p->Z); +} + + +/* +r = 2 * p +*/ + +static void ge_p2_dbl(ge_p1p1 *r,const ge_p2 *p) +{ + fe t0; +/* qhasm: enter ge_p2_dbl */ + +/* qhasm: fe X1 */ + +/* qhasm: fe Y1 */ + +/* qhasm: fe Z1 */ + +/* qhasm: fe A */ + +/* qhasm: fe AA */ + +/* qhasm: fe XX */ + +/* qhasm: fe YY */ + +/* qhasm: fe B */ + +/* qhasm: fe X3 */ + +/* qhasm: fe Y3 */ + +/* qhasm: fe Z3 */ + +/* qhasm: fe T3 */ + +/* qhasm: XX=X1^2 */ +/* asm 1: fe_sq(>XX=fe#1,XX=r->X,X); */ +fe_sq(r->X,p->X); + +/* qhasm: YY=Y1^2 */ +/* asm 1: fe_sq(>YY=fe#3,YY=r->Z,Y); */ +fe_sq(r->Z,p->Y); + +/* qhasm: B=2*Z1^2 */ +/* asm 1: fe_sq2(>B=fe#4,B=r->T,Z); */ +fe_sq2(r->T,p->Z); + +/* qhasm: A=X1+Y1 */ +/* asm 1: fe_add(>A=fe#2,A=r->Y,X,Y); */ +fe_add(r->Y,p->X,p->Y); + +/* qhasm: AA=A^2 */ +/* asm 1: fe_sq(>AA=fe#5,AA=t0,Y); */ +fe_sq(t0,r->Y); + +/* qhasm: Y3=YY+XX */ +/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,X); */ +fe_add(r->Y,r->Z,r->X); + +/* qhasm: Z3=YY-XX */ +/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,Z,X); */ +fe_sub(r->Z,r->Z,r->X); + +/* qhasm: X3=AA-Y3 */ +/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Y); */ +fe_sub(r->X,t0,r->Y); + +/* qhasm: T3=B-Z3 */ +/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T,Z); */ +fe_sub(r->T,r->T,r->Z); + +/* qhasm: return */ +} + + +/* +r = 2 * p +*/ + +static void ge_p3_dbl(ge_p1p1 *r,const ge_p3 *p) +{ + ge_p2 q; + ge_p3_to_p2(&q,p); + ge_p2_dbl(r,&q); +} + + +/* +r = p +*/ + +static void ge_p3_to_cached(ge_cached *r,const ge_p3 *p) +{ + fe_add(r->YplusX,p->Y,p->X); + fe_sub(r->YminusX,p->Y,p->X); + fe_copy(r->Z,p->Z); + fe_mul(r->T2d,p->T,d2); +} + +/* +r = p + q +*/ + +static void ge_add(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q) +{ + fe t0; +/* qhasm: enter ge_add */ + +/* qhasm: fe X1 */ + +/* qhasm: fe Y1 */ + +/* qhasm: fe Z1 */ + +/* qhasm: fe Z2 */ + +/* qhasm: fe T1 */ + +/* qhasm: fe ZZ */ + +/* qhasm: fe YpX2 */ + +/* qhasm: fe YmX2 */ + +/* qhasm: fe T2d2 */ + +/* qhasm: fe X3 */ + +/* qhasm: fe Y3 */ + +/* qhasm: fe Z3 */ + +/* qhasm: fe T3 */ + +/* qhasm: fe YpX1 */ + +/* qhasm: fe YmX1 */ + +/* qhasm: fe A */ + +/* qhasm: fe B */ + +/* qhasm: fe C */ + +/* qhasm: fe D */ + +/* qhasm: YpX1 = Y1+X1 */ +/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ +fe_add(r->X,p->Y,p->X); + +/* qhasm: YmX1 = Y1-X1 */ +/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ +fe_sub(r->Y,p->Y,p->X); + +/* qhasm: A = YpX1*YpX2 */ +/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,YplusX); */ +fe_mul(r->Z,r->X,q->YplusX); + +/* qhasm: B = YmX1*YmX2 */ +/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,YminusX); */ +fe_mul(r->Y,r->Y,q->YminusX); + +/* qhasm: C = T2d2*T1 */ +/* asm 1: fe_mul(>C=fe#4,C=r->T,T2d,T); */ +fe_mul(r->T,q->T2d,p->T); + +/* qhasm: ZZ = Z1*Z2 */ +/* asm 1: fe_mul(>ZZ=fe#1,ZZ=r->X,Z,Z); */ +fe_mul(r->X,p->Z,q->Z); + +/* qhasm: D = 2*ZZ */ +/* asm 1: fe_add(>D=fe#5,D=t0,X,X); */ +fe_add(t0,r->X,r->X); + +/* qhasm: X3 = A-B */ +/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ +fe_sub(r->X,r->Z,r->Y); + +/* qhasm: Y3 = A+B */ +/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ +fe_add(r->Y,r->Z,r->Y); + +/* qhasm: Z3 = D+C */ +/* asm 1: fe_add(>Z3=fe#3,Z3=r->Z,T); */ +fe_add(r->Z,t0,r->T); + +/* qhasm: T3 = D-C */ +/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T); */ +fe_sub(r->T,t0,r->T); + +/* qhasm: return */ +} + + +/* +r = p - q +*/ + +static void ge_sub(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q) +{ + fe t0; +/* qhasm: enter ge_sub */ + +/* qhasm: fe X1 */ + +/* qhasm: fe Y1 */ + +/* qhasm: fe Z1 */ + +/* qhasm: fe Z2 */ + +/* qhasm: fe T1 */ + +/* qhasm: fe ZZ */ + +/* qhasm: fe YpX2 */ + +/* qhasm: fe YmX2 */ + +/* qhasm: fe T2d2 */ + +/* qhasm: fe X3 */ + +/* qhasm: fe Y3 */ + +/* qhasm: fe Z3 */ + +/* qhasm: fe T3 */ + +/* qhasm: fe YpX1 */ + +/* qhasm: fe YmX1 */ + +/* qhasm: fe A */ + +/* qhasm: fe B */ + +/* qhasm: fe C */ + +/* qhasm: fe D */ + +/* qhasm: YpX1 = Y1+X1 */ +/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ +fe_add(r->X,p->Y,p->X); + +/* qhasm: YmX1 = Y1-X1 */ +/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ +fe_sub(r->Y,p->Y,p->X); + +/* qhasm: A = YpX1*YmX2 */ +/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,YminusX); */ +fe_mul(r->Z,r->X,q->YminusX); + +/* qhasm: B = YmX1*YpX2 */ +/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,YplusX); */ +fe_mul(r->Y,r->Y,q->YplusX); + +/* qhasm: C = T2d2*T1 */ +/* asm 1: fe_mul(>C=fe#4,C=r->T,T2d,T); */ +fe_mul(r->T,q->T2d,p->T); + +/* qhasm: ZZ = Z1*Z2 */ +/* asm 1: fe_mul(>ZZ=fe#1,ZZ=r->X,Z,Z); */ +fe_mul(r->X,p->Z,q->Z); + +/* qhasm: D = 2*ZZ */ +/* asm 1: fe_add(>D=fe#5,D=t0,X,X); */ +fe_add(t0,r->X,r->X); + +/* qhasm: X3 = A-B */ +/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ +fe_sub(r->X,r->Z,r->Y); + +/* qhasm: Y3 = A+B */ +/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ +fe_add(r->Y,r->Z,r->Y); + +/* qhasm: Z3 = D-C */ +/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,T); */ +fe_sub(r->Z,t0,r->T); + +/* qhasm: T3 = D+C */ +/* asm 1: fe_add(>T3=fe#4,T3=r->T,T); */ +fe_add(r->T,t0,r->T); + +/* qhasm: return */ +} + + +/* +r = p + q +*/ + +static void ge_madd(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q) +{ + fe t0; +/* qhasm: enter ge_madd */ + +/* qhasm: fe X1 */ + +/* qhasm: fe Y1 */ + +/* qhasm: fe Z1 */ + +/* qhasm: fe T1 */ + +/* qhasm: fe ypx2 */ + +/* qhasm: fe ymx2 */ + +/* qhasm: fe xy2d2 */ + +/* qhasm: fe X3 */ + +/* qhasm: fe Y3 */ + +/* qhasm: fe Z3 */ + +/* qhasm: fe T3 */ + +/* qhasm: fe YpX1 */ + +/* qhasm: fe YmX1 */ + +/* qhasm: fe A */ + +/* qhasm: fe B */ + +/* qhasm: fe C */ + +/* qhasm: fe D */ + +/* qhasm: YpX1 = Y1+X1 */ +/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ +fe_add(r->X,p->Y,p->X); + +/* qhasm: YmX1 = Y1-X1 */ +/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ +fe_sub(r->Y,p->Y,p->X); + +/* qhasm: A = YpX1*ypx2 */ +/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,yplusx); */ +fe_mul(r->Z,r->X,q->yplusx); + +/* qhasm: B = YmX1*ymx2 */ +/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,yminusx); */ +fe_mul(r->Y,r->Y,q->yminusx); + +/* qhasm: C = xy2d2*T1 */ +/* asm 1: fe_mul(>C=fe#4,C=r->T,xy2d,T); */ +fe_mul(r->T,q->xy2d,p->T); + +/* qhasm: D = 2*Z1 */ +/* asm 1: fe_add(>D=fe#5,D=t0,Z,Z); */ +fe_add(t0,p->Z,p->Z); + +/* qhasm: X3 = A-B */ +/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ +fe_sub(r->X,r->Z,r->Y); + +/* qhasm: Y3 = A+B */ +/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ +fe_add(r->Y,r->Z,r->Y); + +/* qhasm: Z3 = D+C */ +/* asm 1: fe_add(>Z3=fe#3,Z3=r->Z,T); */ +fe_add(r->Z,t0,r->T); + +/* qhasm: T3 = D-C */ +/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T); */ +fe_sub(r->T,t0,r->T); + +/* qhasm: return */ +} + + +/* +r = p - q +*/ + +static void ge_msub(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q) +{ + fe t0; +/* qhasm: enter ge_msub */ + +/* qhasm: fe X1 */ + +/* qhasm: fe Y1 */ + +/* qhasm: fe Z1 */ + +/* qhasm: fe T1 */ + +/* qhasm: fe ypx2 */ + +/* qhasm: fe ymx2 */ + +/* qhasm: fe xy2d2 */ + +/* qhasm: fe X3 */ + +/* qhasm: fe Y3 */ + +/* qhasm: fe Z3 */ + +/* qhasm: fe T3 */ + +/* qhasm: fe YpX1 */ + +/* qhasm: fe YmX1 */ + +/* qhasm: fe A */ + +/* qhasm: fe B */ + +/* qhasm: fe C */ + +/* qhasm: fe D */ + +/* qhasm: YpX1 = Y1+X1 */ +/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ +fe_add(r->X,p->Y,p->X); + +/* qhasm: YmX1 = Y1-X1 */ +/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ +fe_sub(r->Y,p->Y,p->X); + +/* qhasm: A = YpX1*ymx2 */ +/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,yminusx); */ +fe_mul(r->Z,r->X,q->yminusx); + +/* qhasm: B = YmX1*ypx2 */ +/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,yplusx); */ +fe_mul(r->Y,r->Y,q->yplusx); + +/* qhasm: C = xy2d2*T1 */ +/* asm 1: fe_mul(>C=fe#4,C=r->T,xy2d,T); */ +fe_mul(r->T,q->xy2d,p->T); + +/* qhasm: D = 2*Z1 */ +/* asm 1: fe_add(>D=fe#5,D=t0,Z,Z); */ +fe_add(t0,p->Z,p->Z); + +/* qhasm: X3 = A-B */ +/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ +fe_sub(r->X,r->Z,r->Y); + +/* qhasm: Y3 = A+B */ +/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ +fe_add(r->Y,r->Z,r->Y); + +/* qhasm: Z3 = D-C */ +/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,T); */ +fe_sub(r->Z,t0,r->T); + +/* qhasm: T3 = D+C */ +/* asm 1: fe_add(>T3=fe#4,T3=r->T,T); */ +fe_add(r->T,t0,r->T); + +/* qhasm: return */ +} + + +static void ge_p3_tobytes(unsigned char *s,const ge_p3 *h) +{ + fe recip; + fe x; + fe y; + + fe_invert(recip,h->Z); + fe_mul(x,h->X,recip); + fe_mul(y,h->Y,recip); + fe_tobytes(s,y); + s[31] ^= fe_isnegative(x) << 7; +} + +static void ge_tobytes(unsigned char *s,const ge_p2 *h) +{ + fe recip; + fe x; + fe y; + + fe_invert(recip,h->Z); + fe_mul(x,h->X,recip); + fe_mul(y,h->Y,recip); + fe_tobytes(s,y); + s[31] ^= fe_isnegative(x) << 7; +} + +static int ge_frombytes_negate_vartime(ge_p3 *h,const unsigned char *s) +{ + fe u; + fe v; + fe v3; + fe vxx; + fe check; + + fe_frombytes(h->Y,s); + fe_1(h->Z); + fe_sq(u,h->Y); + fe_mul(v,u,d); + fe_sub(u,u,h->Z); /* u = y^2-1 */ + fe_add(v,v,h->Z); /* v = dy^2+1 */ + + fe_sq(v3,v); + fe_mul(v3,v3,v); /* v3 = v^3 */ + fe_sq(h->X,v3); + fe_mul(h->X,h->X,v); + fe_mul(h->X,h->X,u); /* x = uv^7 */ + + fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */ + fe_mul(h->X,h->X,v3); + fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */ + + fe_sq(vxx,h->X); + fe_mul(vxx,vxx,v); + fe_sub(check,vxx,u); /* vx^2-u */ + if (fe_isnonzero(check)) { + fe_add(check,vxx,u); /* vx^2+u */ + if (fe_isnonzero(check)) return -1; + fe_mul(h->X,h->X,sqrtm1); + } + + if (fe_isnegative(h->X) == (s[31] >> 7)) + fe_neg(h->X,h->X); + + fe_mul(h->T,h->X,h->Y); + return 0; +} + + +static void slide(signed char *r,const unsigned char *a) +{ + int i; + int b; + int k; + + for (i = 0;i < 256;++i) + r[i] = 1 & (a[i >> 3] >> (i & 7)); + + for (i = 0;i < 256;++i) + if (r[i]) { + for (b = 1;b <= 6 && i + b < 256;++b) { + if (r[i + b]) { + if (r[i] + (r[i + b] << b) <= 15) { + r[i] += r[i + b] << b; r[i + b] = 0; + } else if (r[i] - (r[i + b] << b) >= -15) { + r[i] -= r[i + b] << b; + for (k = i + b;k < 256;++k) { + if (!r[k]) { + r[k] = 1; + break; + } + r[k] = 0; + } + } else + break; + } + } + } + +} + + +/* +r = a * A + b * B +where a = a[0]+256*a[1]+...+256^31 a[31]. +and b = b[0]+256*b[1]+...+256^31 b[31]. +B is the Ed25519 base point (x,4/5) with x positive. +*/ + +static void ge_double_scalarmult_vartime(ge_p2 *r,const unsigned char *a,const ge_p3 *A,const unsigned char *b) +{ + signed char aslide[256]; + signed char bslide[256]; + ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */ + ge_p1p1 t; + ge_p3 u; + ge_p3 A2; + int i; + + slide(aslide,a); + slide(bslide,b); + + ge_p3_to_cached(&Ai[0],A); + ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t); + ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u); + ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u); + ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u); + ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u); + ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u); + ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u); + ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u); + + ge_p2_0(r); + + for (i = 255;i >= 0;--i) { + if (aslide[i] || bslide[i]) break; + } + + for (;i >= 0;--i) { + ge_p2_dbl(&t,r); + + if (aslide[i] > 0) { + ge_p1p1_to_p3(&u,&t); + ge_add(&t,&u,&Ai[aslide[i]/2]); + } else if (aslide[i] < 0) { + ge_p1p1_to_p3(&u,&t); + ge_sub(&t,&u,&Ai[(-aslide[i])/2]); + } + + if (bslide[i] > 0) { + ge_p1p1_to_p3(&u,&t); + ge_madd(&t,&u,&Bi[bslide[i]/2]); + } else if (bslide[i] < 0) { + ge_p1p1_to_p3(&u,&t); + ge_msub(&t,&u,&Bi[(-bslide[i])/2]); + } + + ge_p1p1_to_p2(r,&t); + } +} + +static unsigned char equal(signed char b,signed char c) +{ + unsigned char ub = b; + unsigned char uc = c; + unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */ + crypto_uint32 y = x; /* 0: yes; 1..255: no */ + y -= 1; /* 4294967295: yes; 0..254: no */ + y >>= 31; /* 1: yes; 0: no */ + return y; +} + +static unsigned char negative(signed char b) +{ + unsigned long long x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */ + x >>= 63; /* 1: yes; 0: no */ + return x; +} + +static void cmov(ge_precomp *t,ge_precomp *u,unsigned char b) +{ + fe_cmov(t->yplusx,u->yplusx,b); + fe_cmov(t->yminusx,u->yminusx,b); + fe_cmov(t->xy2d,u->xy2d,b); +} + + + +static void select(ge_precomp *t,int pos,signed char b) +{ + ge_precomp minust; + unsigned char bnegative = negative(b); + unsigned char babs = b - (((-bnegative) & b) << 1); + + ge_precomp_0(t); + cmov(t,&base[pos][0],equal(babs,1)); + cmov(t,&base[pos][1],equal(babs,2)); + cmov(t,&base[pos][2],equal(babs,3)); + cmov(t,&base[pos][3],equal(babs,4)); + cmov(t,&base[pos][4],equal(babs,5)); + cmov(t,&base[pos][5],equal(babs,6)); + cmov(t,&base[pos][6],equal(babs,7)); + cmov(t,&base[pos][7],equal(babs,8)); + fe_copy(minust.yplusx,t->yminusx); + fe_copy(minust.yminusx,t->yplusx); + fe_neg(minust.xy2d,t->xy2d); + cmov(t,&minust,bnegative); +} + +/* +h = a * B +where a = a[0]+256*a[1]+...+256^31 a[31] +B is the Ed25519 base point (x,4/5) with x positive. + +Preconditions: + a[31] <= 127 +*/ + +static void ge_scalarmult_base(ge_p3 *h,const unsigned char *a) +{ + signed char e[64]; + signed char carry; + ge_p1p1 r; + ge_p2 s; + ge_precomp t; + int i; + + for (i = 0;i < 32;++i) { + e[2 * i + 0] = (a[i] >> 0) & 15; + e[2 * i + 1] = (a[i] >> 4) & 15; + } + /* each e[i] is between 0 and 15 */ + /* e[63] is between 0 and 7 */ + + carry = 0; + for (i = 0;i < 63;++i) { + e[i] += carry; + carry = e[i] + 8; + carry >>= 4; + e[i] -= carry << 4; + } + e[63] += carry; + /* each e[i] is between -8 and 8 */ + + ge_p3_0(h); + for (i = 1;i < 64;i += 2) { + select(&t,i / 2,e[i]); + ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r); + } + + ge_p3_dbl(&r,h); ge_p1p1_to_p2(&s,&r); + ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r); + ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r); + ge_p2_dbl(&r,&s); ge_p1p1_to_p3(h,&r); + + for (i = 0;i < 64;i += 2) { + select(&t,i / 2,e[i]); + ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r); + } +} + +/* +Input: + s[0]+256*s[1]+...+256^63*s[63] = s + +Output: + s[0]+256*s[1]+...+256^31*s[31] = s mod l + where l = 2^252 + 27742317777372353535851937790883648493. + Overwrites s in place. +*/ + +static void sc_reduce(unsigned char *s) +{ + crypto_int64 s0 = 2097151 & load_3(s); + crypto_int64 s1 = 2097151 & (load_4(s + 2) >> 5); + crypto_int64 s2 = 2097151 & (load_3(s + 5) >> 2); + crypto_int64 s3 = 2097151 & (load_4(s + 7) >> 7); + crypto_int64 s4 = 2097151 & (load_4(s + 10) >> 4); + crypto_int64 s5 = 2097151 & (load_3(s + 13) >> 1); + crypto_int64 s6 = 2097151 & (load_4(s + 15) >> 6); + crypto_int64 s7 = 2097151 & (load_3(s + 18) >> 3); + crypto_int64 s8 = 2097151 & load_3(s + 21); + crypto_int64 s9 = 2097151 & (load_4(s + 23) >> 5); + crypto_int64 s10 = 2097151 & (load_3(s + 26) >> 2); + crypto_int64 s11 = 2097151 & (load_4(s + 28) >> 7); + crypto_int64 s12 = 2097151 & (load_4(s + 31) >> 4); + crypto_int64 s13 = 2097151 & (load_3(s + 34) >> 1); + crypto_int64 s14 = 2097151 & (load_4(s + 36) >> 6); + crypto_int64 s15 = 2097151 & (load_3(s + 39) >> 3); + crypto_int64 s16 = 2097151 & load_3(s + 42); + crypto_int64 s17 = 2097151 & (load_4(s + 44) >> 5); + crypto_int64 s18 = 2097151 & (load_3(s + 47) >> 2); + crypto_int64 s19 = 2097151 & (load_4(s + 49) >> 7); + crypto_int64 s20 = 2097151 & (load_4(s + 52) >> 4); + crypto_int64 s21 = 2097151 & (load_3(s + 55) >> 1); + crypto_int64 s22 = 2097151 & (load_4(s + 57) >> 6); + crypto_int64 s23 = (load_4(s + 60) >> 3); + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + crypto_int64 carry10; + crypto_int64 carry11; + crypto_int64 carry12; + crypto_int64 carry13; + crypto_int64 carry14; + crypto_int64 carry15; + crypto_int64 carry16; + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= carry12 << 21; + carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= carry14 << 21; + carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= carry16 << 21; + + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= carry13 << 21; + carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= carry15 << 21; + + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + + s[0] = s0 >> 0; + s[1] = s0 >> 8; + s[2] = (s0 >> 16) | (s1 << 5); + s[3] = s1 >> 3; + s[4] = s1 >> 11; + s[5] = (s1 >> 19) | (s2 << 2); + s[6] = s2 >> 6; + s[7] = (s2 >> 14) | (s3 << 7); + s[8] = s3 >> 1; + s[9] = s3 >> 9; + s[10] = (s3 >> 17) | (s4 << 4); + s[11] = s4 >> 4; + s[12] = s4 >> 12; + s[13] = (s4 >> 20) | (s5 << 1); + s[14] = s5 >> 7; + s[15] = (s5 >> 15) | (s6 << 6); + s[16] = s6 >> 2; + s[17] = s6 >> 10; + s[18] = (s6 >> 18) | (s7 << 3); + s[19] = s7 >> 5; + s[20] = s7 >> 13; + s[21] = s8 >> 0; + s[22] = s8 >> 8; + s[23] = (s8 >> 16) | (s9 << 5); + s[24] = s9 >> 3; + s[25] = s9 >> 11; + s[26] = (s9 >> 19) | (s10 << 2); + s[27] = s10 >> 6; + s[28] = (s10 >> 14) | (s11 << 7); + s[29] = s11 >> 1; + s[30] = s11 >> 9; + s[31] = s11 >> 17; +} + +/* +Input: + a[0]+256*a[1]+...+256^31*a[31] = a + b[0]+256*b[1]+...+256^31*b[31] = b + c[0]+256*c[1]+...+256^31*c[31] = c + +Output: + s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l + where l = 2^252 + 27742317777372353535851937790883648493. +*/ + +static void sc_muladd(unsigned char *s,const unsigned char *a,const unsigned char *b,const unsigned char *c) +{ + crypto_int64 a0 = 2097151 & load_3(a); + crypto_int64 a1 = 2097151 & (load_4(a + 2) >> 5); + crypto_int64 a2 = 2097151 & (load_3(a + 5) >> 2); + crypto_int64 a3 = 2097151 & (load_4(a + 7) >> 7); + crypto_int64 a4 = 2097151 & (load_4(a + 10) >> 4); + crypto_int64 a5 = 2097151 & (load_3(a + 13) >> 1); + crypto_int64 a6 = 2097151 & (load_4(a + 15) >> 6); + crypto_int64 a7 = 2097151 & (load_3(a + 18) >> 3); + crypto_int64 a8 = 2097151 & load_3(a + 21); + crypto_int64 a9 = 2097151 & (load_4(a + 23) >> 5); + crypto_int64 a10 = 2097151 & (load_3(a + 26) >> 2); + crypto_int64 a11 = (load_4(a + 28) >> 7); + crypto_int64 b0 = 2097151 & load_3(b); + crypto_int64 b1 = 2097151 & (load_4(b + 2) >> 5); + crypto_int64 b2 = 2097151 & (load_3(b + 5) >> 2); + crypto_int64 b3 = 2097151 & (load_4(b + 7) >> 7); + crypto_int64 b4 = 2097151 & (load_4(b + 10) >> 4); + crypto_int64 b5 = 2097151 & (load_3(b + 13) >> 1); + crypto_int64 b6 = 2097151 & (load_4(b + 15) >> 6); + crypto_int64 b7 = 2097151 & (load_3(b + 18) >> 3); + crypto_int64 b8 = 2097151 & load_3(b + 21); + crypto_int64 b9 = 2097151 & (load_4(b + 23) >> 5); + crypto_int64 b10 = 2097151 & (load_3(b + 26) >> 2); + crypto_int64 b11 = (load_4(b + 28) >> 7); + crypto_int64 c0 = 2097151 & load_3(c); + crypto_int64 c1 = 2097151 & (load_4(c + 2) >> 5); + crypto_int64 c2 = 2097151 & (load_3(c + 5) >> 2); + crypto_int64 c3 = 2097151 & (load_4(c + 7) >> 7); + crypto_int64 c4 = 2097151 & (load_4(c + 10) >> 4); + crypto_int64 c5 = 2097151 & (load_3(c + 13) >> 1); + crypto_int64 c6 = 2097151 & (load_4(c + 15) >> 6); + crypto_int64 c7 = 2097151 & (load_3(c + 18) >> 3); + crypto_int64 c8 = 2097151 & load_3(c + 21); + crypto_int64 c9 = 2097151 & (load_4(c + 23) >> 5); + crypto_int64 c10 = 2097151 & (load_3(c + 26) >> 2); + crypto_int64 c11 = (load_4(c + 28) >> 7); + crypto_int64 s0; + crypto_int64 s1; + crypto_int64 s2; + crypto_int64 s3; + crypto_int64 s4; + crypto_int64 s5; + crypto_int64 s6; + crypto_int64 s7; + crypto_int64 s8; + crypto_int64 s9; + crypto_int64 s10; + crypto_int64 s11; + crypto_int64 s12; + crypto_int64 s13; + crypto_int64 s14; + crypto_int64 s15; + crypto_int64 s16; + crypto_int64 s17; + crypto_int64 s18; + crypto_int64 s19; + crypto_int64 s20; + crypto_int64 s21; + crypto_int64 s22; + crypto_int64 s23; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + crypto_int64 carry10; + crypto_int64 carry11; + crypto_int64 carry12; + crypto_int64 carry13; + crypto_int64 carry14; + crypto_int64 carry15; + crypto_int64 carry16; + crypto_int64 carry17; + crypto_int64 carry18; + crypto_int64 carry19; + crypto_int64 carry20; + crypto_int64 carry21; + crypto_int64 carry22; + + s0 = c0 + a0*b0; + s1 = c1 + a0*b1 + a1*b0; + s2 = c2 + a0*b2 + a1*b1 + a2*b0; + s3 = c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0; + s4 = c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0; + s5 = c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0; + s6 = c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0; + s7 = c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0; + s8 = c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0; + s9 = c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0; + s10 = c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0; + s11 = c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0; + s12 = a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1; + s13 = a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2; + s14 = a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3; + s15 = a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4; + s16 = a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5; + s17 = a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6; + s18 = a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7; + s19 = a8*b11 + a9*b10 + a10*b9 + a11*b8; + s20 = a9*b11 + a10*b10 + a11*b9; + s21 = a10*b11 + a11*b10; + s22 = a11*b11; + s23 = 0; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= carry12 << 21; + carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= carry14 << 21; + carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= carry16 << 21; + carry18 = (s18 + (1<<20)) >> 21; s19 += carry18; s18 -= carry18 << 21; + carry20 = (s20 + (1<<20)) >> 21; s21 += carry20; s20 -= carry20 << 21; + carry22 = (s22 + (1<<20)) >> 21; s23 += carry22; s22 -= carry22 << 21; + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= carry13 << 21; + carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= carry15 << 21; + carry17 = (s17 + (1<<20)) >> 21; s18 += carry17; s17 -= carry17 << 21; + carry19 = (s19 + (1<<20)) >> 21; s20 += carry19; s19 -= carry19 << 21; + carry21 = (s21 + (1<<20)) >> 21; s22 += carry21; s21 -= carry21 << 21; + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= carry12 << 21; + carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= carry14 << 21; + carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= carry16 << 21; + + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= carry13 << 21; + carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= carry15 << 21; + + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + + s[0] = s0 >> 0; + s[1] = s0 >> 8; + s[2] = (s0 >> 16) | (s1 << 5); + s[3] = s1 >> 3; + s[4] = s1 >> 11; + s[5] = (s1 >> 19) | (s2 << 2); + s[6] = s2 >> 6; + s[7] = (s2 >> 14) | (s3 << 7); + s[8] = s3 >> 1; + s[9] = s3 >> 9; + s[10] = (s3 >> 17) | (s4 << 4); + s[11] = s4 >> 4; + s[12] = s4 >> 12; + s[13] = (s4 >> 20) | (s5 << 1); + s[14] = s5 >> 7; + s[15] = (s5 >> 15) | (s6 << 6); + s[16] = s6 >> 2; + s[17] = s6 >> 10; + s[18] = (s6 >> 18) | (s7 << 3); + s[19] = s7 >> 5; + s[20] = s7 >> 13; + s[21] = s8 >> 0; + s[22] = s8 >> 8; + s[23] = (s8 >> 16) | (s9 << 5); + s[24] = s9 >> 3; + s[25] = s9 >> 11; + s[26] = (s9 >> 19) | (s10 << 2); + s[27] = s10 >> 6; + s[28] = (s10 >> 14) | (s11 << 7); + s[29] = s11 >> 1; + s[30] = s11 >> 9; + s[31] = s11 >> 17; +} + +/* +int crypto_sign_keypair(unsigned char *pk,unsigned char *sk) +{ + unsigned char h[64]; + ge_p3 A; + int i; + + randombytes(sk,32); + crypto_hash_sha512(h,sk,32); + h[0] &= 248; + h[31] &= 63; + h[31] |= 64; + + ge_scalarmult_base(&A,h); + ge_p3_tobytes(pk,&A); + + for (i = 0;i < 32;++i) sk[32 + i] = pk[i]; + return 0; +} +*/ + +int crypto_sign_pk_ref10(unsigned char *pk,unsigned char *sk) +{ + unsigned char h[64]; + ge_p3 A; + int i; + + crypto_hash_sha512(h,sk,32); + h[0] &= 248; + h[31] &= 63; + h[31] |= 64; + + ge_scalarmult_base(&A,h); + ge_p3_tobytes(pk,&A); + + for (i = 0;i < 32;++i) sk[32 + i] = pk[i]; + return 0; +} + +int crypto_sign_ref10( + unsigned char *sm,unsigned long long *smlen, + const unsigned char *m,unsigned long long mlen, + const unsigned char *sk +) +{ + unsigned char az[64]; + unsigned char r[64]; + unsigned char hram[64]; + ge_p3 R; + unsigned long long i; + + crypto_hash_sha512(az,sk,32); + az[0] &= 248; + az[31] &= 63; + az[31] |= 64; + + *smlen = mlen + 64; + for (i = 0;i < mlen;++i) sm[64 + i] = m[i]; + for (i = 0;i < 32;++i) sm[32 + i] = az[32 + i]; + crypto_hash_sha512(r,sm + 32,mlen + 32); + for (i = 0;i < 32;++i) sm[32 + i] = sk[32 + i]; + + sc_reduce(r); + ge_scalarmult_base(&R,r); + ge_p3_tobytes(sm,&R); + + crypto_hash_sha512(hram,sm,mlen + 64); + sc_reduce(hram); + sc_muladd(sm + 32,hram,az,r); + + return 0; +} + +int crypto_sign_open_ref10( + unsigned char *m,unsigned long long *mlen, + const unsigned char *sm,unsigned long long smlen, + const unsigned char *pk +) +{ + unsigned char h[64]; + unsigned char checkr[32]; + ge_p3 A; + ge_p2 R; + unsigned long long i; + + *mlen = -1; + if (smlen < 64) return -1; + if (sm[63] & 224) return -1; + if (ge_frombytes_negate_vartime(&A,pk) != 0) return -1; + + for (i = 0;i < smlen;++i) m[i] = sm[i]; + for (i = 0;i < 32;++i) m[32 + i] = pk[i]; + crypto_hash_sha512(h,m,smlen); + sc_reduce(h); + + ge_double_scalarmult_vartime(&R,h,&A,sm + 32); + ge_tobytes(checkr,&R); + if (crypto_verify_32(checkr,sm) != 0) { + for (i = 0;i < smlen;++i) m[i] = 0; + return -1; + } + + for (i = 0;i < smlen - 64;++i) m[i] = sm[64 + i]; + for (i = smlen - 64;i < smlen;++i) m[i] = 0; + *mlen = smlen - 64; + return 0; +} + diff --git a/src/wraith/src/ext/ed25519/donna/fuzz/ed25519-ref10.h b/src/wraith/src/ext/ed25519/donna/fuzz/ed25519-ref10.h new file mode 100644 index 000000000..c8a0f69b6 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/fuzz/ed25519-ref10.h @@ -0,0 +1,9 @@ +#ifndef ED25519_REF10_H +#define ED25519_REF10_H + +int crypto_sign_pk_ref10(unsigned char *pk,unsigned char *sk); +int crypto_sign_ref10(unsigned char *sm,unsigned long long *smlen,const unsigned char *m,unsigned long long mlen,const unsigned char *sk); +int crypto_sign_open_ref10(unsigned char *m,unsigned long long *mlen,const unsigned char *sm,unsigned long long smlen,const unsigned char *pk); + +#endif /* ED25519_REF10_H */ + diff --git a/src/wraith/src/ext/ed25519/donna/fuzz/fuzz-curve25519.c b/src/wraith/src/ext/ed25519/donna/fuzz/fuzz-curve25519.c new file mode 100644 index 000000000..43017014c --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/fuzz/fuzz-curve25519.c @@ -0,0 +1,172 @@ +#if defined(_WIN32) + #include + #include + typedef unsigned int uint32_t; + typedef unsigned __int64 uint64_t; +#else + #include +#endif + +#include +#include + +#include "ed25519-donna.h" +#include "curve25519-ref10.h" + +static void +print_diff(const char *desc, const unsigned char *a, const unsigned char *b, size_t len) { + size_t p = 0; + unsigned char diff; + printf("%s diff:\n", desc); + while (len--) { + diff = *a++ ^ *b++; + if (!diff) + printf("____,"); + else + printf("0x%02x,", diff); + if ((++p & 15) == 0) + printf("\n"); + } + printf("\n\n"); +} + +static void +print_bytes(const char *desc, const unsigned char *bytes, size_t len) { + size_t p = 0; + printf("%s:\n", desc); + while (len--) { + printf("0x%02x,", *bytes++); + if ((++p & 15) == 0) + printf("\n"); + } + printf("\n\n"); +} + + +/* chacha20/12 prng */ +void +prng(unsigned char *out, size_t bytes) { + static uint32_t state[16]; + static int init = 0; + uint32_t x[16], t; + size_t i; + + if (!init) { + #if defined(_WIN32) + HCRYPTPROV csp; + if (!CryptAcquireContext(&csp, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + printf("CryptAcquireContext failed\n"); + exit(1); + } + if (!CryptGenRandom(csp, (DWORD)sizeof(state), (BYTE*)state)) { + printf("CryptGenRandom failed\n"); + exit(1); + } + CryptReleaseContext(csp, 0); + #else + FILE *f = NULL; + f = fopen("/dev/urandom", "rb"); + if (!f) { + printf("failed to open /dev/urandom\n"); + exit(1); + } + if (fread(state, sizeof(state), 1, f) != 1) { + printf("read error on /dev/urandom\n"); + exit(1); + } + #endif + init = 1; + } + + while (bytes) { + for (i = 0; i < 16; i++) x[i] = state[i]; + + #define rotl32(x,k) ((x << k) | (x >> (32 - k))) + #define quarter(a,b,c,d) \ + x[a] += x[b]; t = x[d]^x[a]; x[d] = rotl32(t,16); \ + x[c] += x[d]; t = x[b]^x[c]; x[b] = rotl32(t,12); \ + x[a] += x[b]; t = x[d]^x[a]; x[d] = rotl32(t, 8); \ + x[c] += x[d]; t = x[b]^x[c]; x[b] = rotl32(t, 7); + + for (i = 0; i < 12; i += 2) { + quarter( 0, 4, 8,12) + quarter( 1, 5, 9,13) + quarter( 2, 6,10,14) + quarter( 3, 7,11,15) + quarter( 0, 5,10,15) + quarter( 1, 6,11,12) + quarter( 2, 7, 8,13) + quarter( 3, 4, 9,14) + }; + + if (bytes <= 64) { + memcpy(out, x, bytes); + bytes = 0; + } else { + memcpy(out, x, 64); + bytes -= 64; + out += 64; + } + + /* don't need a nonce, so last 4 words are the counter. 2^136 bytes can be generated */ + if (!++state[12]) if (!++state[13]) if (!++state[14]) ++state[15]; + } +} + + + +int main() { + const size_t skmax = 1024; + static unsigned char sk[1024][32]; + unsigned char pk[3][32]; + unsigned char *skp; + size_t ski, pki, i; + uint64_t ctr; + + printf("fuzzing: "); + printf(" ref10"); + printf(" curved25519"); +#if defined(ED25519_SSE2) + printf(" curved25519-sse2"); +#endif + printf("\n\n"); + + for (ctr = 0, ski = skmax;;ctr++) { + if (ski == skmax) { + prng((unsigned char *)sk, sizeof(sk)); + ski = 0; + } + skp = sk[ski++]; + + pki = 0; + crypto_scalarmult_base_ref10(pk[pki++], skp); + curved25519_scalarmult_basepoint(pk[pki++], skp); + #if defined(ED25519_SSE2) + curved25519_scalarmult_basepoint_sse2(pk[pki++], skp); + #endif + + for (i = 1; i < pki; i++) { + if (memcmp(pk[0], pk[i], 32) != 0) { + printf("\n\n"); + print_bytes("sk", skp, 32); + print_bytes("ref10", pk[0], 32); + print_diff("curved25519", pk[0], pk[1], 32); + #if defined(ED25519_SSE2) + print_diff("curved25519-sse2", pk[0], pk[2], 32); + #endif + exit(1); + } + } + + if (ctr && (ctr % 0x1000 == 0)) { + printf("."); + if ((ctr % 0x20000) == 0) { + printf(" ["); + for (i = 0; i < 8; i++) + printf("%02x", (unsigned char)(ctr >> ((7 - i) * 8))); + printf("]\n"); + } + } + } +} + diff --git a/src/wraith/src/ext/ed25519/donna/fuzz/fuzz-ed25519.c b/src/wraith/src/ext/ed25519/donna/fuzz/fuzz-ed25519.c new file mode 100644 index 000000000..b242e8e5d --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/fuzz/fuzz-ed25519.c @@ -0,0 +1,219 @@ +#if defined(_WIN32) + #include + #include + typedef unsigned int uint32_t; +#else + #include +#endif + +#include +#include + +#include "ed25519-donna.h" +#include "ed25519-ref10.h" + +static void +print_diff(const char *desc, const unsigned char *a, const unsigned char *b, size_t len) { + size_t p = 0; + unsigned char diff; + printf("%s diff:\n", desc); + while (len--) { + diff = *a++ ^ *b++; + if (!diff) + printf("____,"); + else + printf("0x%02x,", diff); + if ((++p & 15) == 0) + printf("\n"); + } + printf("\n"); +} + +static void +print_bytes(const char *desc, const unsigned char *bytes, size_t len) { + size_t p = 0; + printf("%s:\n", desc); + while (len--) { + printf("0x%02x,", *bytes++); + if ((++p & 15) == 0) + printf("\n"); + } + printf("\n"); +} + + +/* chacha20/12 prng */ +void +prng(unsigned char *out, size_t bytes) { + static uint32_t state[16]; + static int init = 0; + uint32_t x[16], t; + size_t i; + + if (!init) { + #if defined(_WIN32) + HCRYPTPROV csp = NULL; + if (!CryptAcquireContext(&csp, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + printf("CryptAcquireContext failed\n"); + exit(1); + } + if (!CryptGenRandom(csp, (DWORD)sizeof(state), (BYTE*)state)) { + printf("CryptGenRandom failed\n"); + exit(1); + } + CryptReleaseContext(csp, 0); + #else + FILE *f = NULL; + f = fopen("/dev/urandom", "rb"); + if (!f) { + printf("failed to open /dev/urandom\n"); + exit(1); + } + if (fread(state, sizeof(state), 1, f) != 1) { + printf("read error on /dev/urandom\n"); + exit(1); + } + #endif + init = 1; + } + + while (bytes) { + for (i = 0; i < 16; i++) x[i] = state[i]; + + #define rotl32(x,k) ((x << k) | (x >> (32 - k))) + #define quarter(a,b,c,d) \ + x[a] += x[b]; t = x[d]^x[a]; x[d] = rotl32(t,16); \ + x[c] += x[d]; t = x[b]^x[c]; x[b] = rotl32(t,12); \ + x[a] += x[b]; t = x[d]^x[a]; x[d] = rotl32(t, 8); \ + x[c] += x[d]; t = x[b]^x[c]; x[b] = rotl32(t, 7); + + for (i = 0; i < 12; i += 2) { + quarter( 0, 4, 8,12) + quarter( 1, 5, 9,13) + quarter( 2, 6,10,14) + quarter( 3, 7,11,15) + quarter( 0, 5,10,15) + quarter( 1, 6,11,12) + quarter( 2, 7, 8,13) + quarter( 3, 4, 9,14) + }; + + if (bytes <= 64) { + memcpy(out, x, bytes); + bytes = 0; + } else { + memcpy(out, x, 64); + bytes -= 64; + out += 64; + } + + /* don't need a nonce, so last 4 words are the counter. 2^136 bytes can be generated */ + if (!++state[12]) if (!++state[13]) if (!++state[14]) ++state[15]; + } +} + +typedef struct random_data_t { + unsigned char sk[32]; + unsigned char m[128]; +} random_data; + +typedef struct generated_data_t { + unsigned char pk[32]; + unsigned char sig[64]; + int valid; +} generated_data; + +static void +print_generated(const char *desc, generated_data *g) { + printf("%s:\n", desc); + print_bytes("pk", g->pk, 32); + print_bytes("sig", g->sig, 64); + printf("valid: %s\n\n", g->valid ? "no" : "yes"); +} + +static void +print_generated_diff(const char *desc, const generated_data *base, generated_data *g) { + printf("%s:\n", desc); + print_diff("pk", base->pk, g->pk, 32); + print_diff("sig", base->sig, g->sig, 64); + printf("valid: %s\n\n", (base->valid == g->valid) ? "___" : (g->valid ? "no" : "yes")); +} + +int main() { + const size_t rndmax = 128; + static random_data rnd[128]; + static generated_data gen[3]; + random_data *r; + generated_data *g; + unsigned long long dummylen; + unsigned char dummysk[64]; + unsigned char dummymsg[2][128+64]; + size_t rndi, geni, i, j; + uint64_t ctr; + + printf("fuzzing: "); + printf(" ref10"); + printf(" ed25519-donna"); +#if defined(ED25519_SSE2) + printf(" ed25519-donna-sse2"); +#endif + printf("\n\n"); + + for (ctr = 0, rndi = rndmax;;ctr++) { + if (rndi == rndmax) { + prng((unsigned char *)rnd, sizeof(rnd)); + rndi = 0; + } + r = &rnd[rndi++]; + + /* ref10, lots of horrible gymnastics to work around the wonky api */ + geni = 0; + g = &gen[geni++]; + memcpy(dummysk, r->sk, 32); /* pk is appended to the sk, need to copy the sk to a larger buffer */ + crypto_sign_pk_ref10(dummysk + 32, dummysk); + memcpy(g->pk, dummysk + 32, 32); + crypto_sign_ref10(dummymsg[0], &dummylen, r->m, 128, dummysk); + memcpy(g->sig, dummymsg[0], 64); /* sig is placed in front of the signed message */ + g->valid = crypto_sign_open_ref10(dummymsg[1], &dummylen, dummymsg[0], 128 + 64, g->pk); + + /* ed25519-donna */ + g = &gen[geni++]; + ed25519_publickey(r->sk, g->pk); + ed25519_sign(r->m, 128, r->sk, g->pk, g->sig); + g->valid = ed25519_sign_open(r->m, 128, g->pk, g->sig); + + #if defined(ED25519_SSE2) + /* ed25519-donna-sse2 */ + g = &gen[geni++]; + ed25519_publickey_sse2(r->sk, g->pk); + ed25519_sign_sse2(r->m, 128, r->sk, g->pk, g->sig); + g->valid = ed25519_sign_open_sse2(r->m, 128, g->pk, g->sig); + #endif + + /* compare implementations 1..geni against the reference */ + for (i = 1; i < geni; i++) { + if (memcmp(&gen[0], &gen[i], sizeof(generated_data)) != 0) { + printf("\n\n"); + print_bytes("sk", r->sk, 32); + print_bytes("m", r->m, 128); + print_generated("ref10", &gen[0]); + print_generated_diff("ed25519-donna", &gen[0], &gen[1]); + #if defined(ED25519_SSE2) + print_generated_diff("ed25519-donna-sse2", &gen[0], &gen[2]); + #endif + exit(1); + } + } + + /* print out status */ + if (ctr && (ctr % 0x1000 == 0)) { + printf("."); + if ((ctr % 0x20000) == 0) { + printf(" ["); + for (i = 0; i < 8; i++) + printf("%02x", (unsigned char)(ctr >> ((7 - i) * 8))); + printf("]\n"); + } + } + } +} \ No newline at end of file diff --git a/src/wraith/src/ext/ed25519/donna/modm-donna-32bit.h b/src/wraith/src/ext/ed25519/donna/modm-donna-32bit.h new file mode 100644 index 000000000..0ef9e58fa --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/modm-donna-32bit.h @@ -0,0 +1,470 @@ +/* + Public domain by Andrew M. +*/ + + +/* + Arithmetic modulo the group order n = 2^252 + 27742317777372353535851937790883648493 = 7237005577332262213973186563042994240857116359379907606001950938285454250989 + + k = 32 + b = 1 << 8 = 256 + m = 2^252 + 27742317777372353535851937790883648493 = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed + mu = floor( b^(k*2) / m ) = 0xfffffffffffffffffffffffffffffffeb2106215d086329a7ed9ce5a30a2c131b +*/ + +#define bignum256modm_bits_per_limb 30 +#define bignum256modm_limb_size 9 + +typedef uint32_t bignum256modm_element_t; +typedef bignum256modm_element_t bignum256modm[9]; + +static const bignum256modm modm_m = { + 0x1cf5d3ed, 0x20498c69, 0x2f79cd65, 0x37be77a8, + 0x00000014, 0x00000000, 0x00000000, 0x00000000, + 0x00001000 +}; + +static const bignum256modm modm_mu = { + 0x0a2c131b, 0x3673968c, 0x06329a7e, 0x01885742, + 0x3fffeb21, 0x3fffffff, 0x3fffffff, 0x3fffffff, + 0x000fffff +}; + +static bignum256modm_element_t +lt_modm(bignum256modm_element_t a, bignum256modm_element_t b) { + return (a - b) >> 31; +} + +/* see HAC, Alg. 14.42 Step 4 */ +static void +reduce256_modm(bignum256modm r) { + bignum256modm t; + bignum256modm_element_t b = 0, pb, mask; + + /* t = r - m */ + pb = 0; + pb += modm_m[0]; b = lt_modm(r[0], pb); t[0] = (r[0] - pb + (b << 30)); pb = b; + pb += modm_m[1]; b = lt_modm(r[1], pb); t[1] = (r[1] - pb + (b << 30)); pb = b; + pb += modm_m[2]; b = lt_modm(r[2], pb); t[2] = (r[2] - pb + (b << 30)); pb = b; + pb += modm_m[3]; b = lt_modm(r[3], pb); t[3] = (r[3] - pb + (b << 30)); pb = b; + pb += modm_m[4]; b = lt_modm(r[4], pb); t[4] = (r[4] - pb + (b << 30)); pb = b; + pb += modm_m[5]; b = lt_modm(r[5], pb); t[5] = (r[5] - pb + (b << 30)); pb = b; + pb += modm_m[6]; b = lt_modm(r[6], pb); t[6] = (r[6] - pb + (b << 30)); pb = b; + pb += modm_m[7]; b = lt_modm(r[7], pb); t[7] = (r[7] - pb + (b << 30)); pb = b; + pb += modm_m[8]; b = lt_modm(r[8], pb); t[8] = (r[8] - pb + (b << 16)); + + /* keep r if r was smaller than m */ + mask = b - 1; + r[0] ^= mask & (r[0] ^ t[0]); + r[1] ^= mask & (r[1] ^ t[1]); + r[2] ^= mask & (r[2] ^ t[2]); + r[3] ^= mask & (r[3] ^ t[3]); + r[4] ^= mask & (r[4] ^ t[4]); + r[5] ^= mask & (r[5] ^ t[5]); + r[6] ^= mask & (r[6] ^ t[6]); + r[7] ^= mask & (r[7] ^ t[7]); + r[8] ^= mask & (r[8] ^ t[8]); +} + +/* + Barrett reduction, see HAC, Alg. 14.42 + + Instead of passing in x, pre-process in to q1 and r1 for efficiency +*/ +static void +barrett_reduce256_modm(bignum256modm r, const bignum256modm q1, const bignum256modm r1) { + bignum256modm q3, r2; + uint64_t c; + bignum256modm_element_t f, b, pb; + + /* q1 = x >> 248 = 264 bits = 9 30 bit elements + q2 = mu * q1 + q3 = (q2 / 256(32+1)) = q2 / (2^8)^(32+1) = q2 >> 264 */ + c = mul32x32_64(modm_mu[0], q1[7]) + mul32x32_64(modm_mu[1], q1[6]) + mul32x32_64(modm_mu[2], q1[5]) + mul32x32_64(modm_mu[3], q1[4]) + mul32x32_64(modm_mu[4], q1[3]) + mul32x32_64(modm_mu[5], q1[2]) + mul32x32_64(modm_mu[6], q1[1]) + mul32x32_64(modm_mu[7], q1[0]); + c >>= 30; + c += mul32x32_64(modm_mu[0], q1[8]) + mul32x32_64(modm_mu[1], q1[7]) + mul32x32_64(modm_mu[2], q1[6]) + mul32x32_64(modm_mu[3], q1[5]) + mul32x32_64(modm_mu[4], q1[4]) + mul32x32_64(modm_mu[5], q1[3]) + mul32x32_64(modm_mu[6], q1[2]) + mul32x32_64(modm_mu[7], q1[1]) + mul32x32_64(modm_mu[8], q1[0]); + f = (bignum256modm_element_t)c; q3[0] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[1], q1[8]) + mul32x32_64(modm_mu[2], q1[7]) + mul32x32_64(modm_mu[3], q1[6]) + mul32x32_64(modm_mu[4], q1[5]) + mul32x32_64(modm_mu[5], q1[4]) + mul32x32_64(modm_mu[6], q1[3]) + mul32x32_64(modm_mu[7], q1[2]) + mul32x32_64(modm_mu[8], q1[1]); + f = (bignum256modm_element_t)c; q3[0] |= (f << 6) & 0x3fffffff; q3[1] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[2], q1[8]) + mul32x32_64(modm_mu[3], q1[7]) + mul32x32_64(modm_mu[4], q1[6]) + mul32x32_64(modm_mu[5], q1[5]) + mul32x32_64(modm_mu[6], q1[4]) + mul32x32_64(modm_mu[7], q1[3]) + mul32x32_64(modm_mu[8], q1[2]); + f = (bignum256modm_element_t)c; q3[1] |= (f << 6) & 0x3fffffff; q3[2] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[3], q1[8]) + mul32x32_64(modm_mu[4], q1[7]) + mul32x32_64(modm_mu[5], q1[6]) + mul32x32_64(modm_mu[6], q1[5]) + mul32x32_64(modm_mu[7], q1[4]) + mul32x32_64(modm_mu[8], q1[3]); + f = (bignum256modm_element_t)c; q3[2] |= (f << 6) & 0x3fffffff; q3[3] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[4], q1[8]) + mul32x32_64(modm_mu[5], q1[7]) + mul32x32_64(modm_mu[6], q1[6]) + mul32x32_64(modm_mu[7], q1[5]) + mul32x32_64(modm_mu[8], q1[4]); + f = (bignum256modm_element_t)c; q3[3] |= (f << 6) & 0x3fffffff; q3[4] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[5], q1[8]) + mul32x32_64(modm_mu[6], q1[7]) + mul32x32_64(modm_mu[7], q1[6]) + mul32x32_64(modm_mu[8], q1[5]); + f = (bignum256modm_element_t)c; q3[4] |= (f << 6) & 0x3fffffff; q3[5] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[6], q1[8]) + mul32x32_64(modm_mu[7], q1[7]) + mul32x32_64(modm_mu[8], q1[6]); + f = (bignum256modm_element_t)c; q3[5] |= (f << 6) & 0x3fffffff; q3[6] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[7], q1[8]) + mul32x32_64(modm_mu[8], q1[7]); + f = (bignum256modm_element_t)c; q3[6] |= (f << 6) & 0x3fffffff; q3[7] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[8], q1[8]); + f = (bignum256modm_element_t)c; q3[7] |= (f << 6) & 0x3fffffff; q3[8] = (bignum256modm_element_t)(c >> 24); + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) + r2 = (q3 * m) mod (256^(32+1)) = (q3 * m) & ((1 << 264) - 1) */ + c = mul32x32_64(modm_m[0], q3[0]); + r2[0] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[1]) + mul32x32_64(modm_m[1], q3[0]); + r2[1] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[2]) + mul32x32_64(modm_m[1], q3[1]) + mul32x32_64(modm_m[2], q3[0]); + r2[2] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[3]) + mul32x32_64(modm_m[1], q3[2]) + mul32x32_64(modm_m[2], q3[1]) + mul32x32_64(modm_m[3], q3[0]); + r2[3] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[4]) + mul32x32_64(modm_m[1], q3[3]) + mul32x32_64(modm_m[2], q3[2]) + mul32x32_64(modm_m[3], q3[1]) + mul32x32_64(modm_m[4], q3[0]); + r2[4] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[5]) + mul32x32_64(modm_m[1], q3[4]) + mul32x32_64(modm_m[2], q3[3]) + mul32x32_64(modm_m[3], q3[2]) + mul32x32_64(modm_m[4], q3[1]) + mul32x32_64(modm_m[5], q3[0]); + r2[5] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[6]) + mul32x32_64(modm_m[1], q3[5]) + mul32x32_64(modm_m[2], q3[4]) + mul32x32_64(modm_m[3], q3[3]) + mul32x32_64(modm_m[4], q3[2]) + mul32x32_64(modm_m[5], q3[1]) + mul32x32_64(modm_m[6], q3[0]); + r2[6] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[7]) + mul32x32_64(modm_m[1], q3[6]) + mul32x32_64(modm_m[2], q3[5]) + mul32x32_64(modm_m[3], q3[4]) + mul32x32_64(modm_m[4], q3[3]) + mul32x32_64(modm_m[5], q3[2]) + mul32x32_64(modm_m[6], q3[1]) + mul32x32_64(modm_m[7], q3[0]); + r2[7] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[8]) + mul32x32_64(modm_m[1], q3[7]) + mul32x32_64(modm_m[2], q3[6]) + mul32x32_64(modm_m[3], q3[5]) + mul32x32_64(modm_m[4], q3[4]) + mul32x32_64(modm_m[5], q3[3]) + mul32x32_64(modm_m[6], q3[2]) + mul32x32_64(modm_m[7], q3[1]) + mul32x32_64(modm_m[8], q3[0]); + r2[8] = (bignum256modm_element_t)(c & 0xffffff); + + /* r = r1 - r2 + if (r < 0) r += (1 << 264) */ + pb = 0; + pb += r2[0]; b = lt_modm(r1[0], pb); r[0] = (r1[0] - pb + (b << 30)); pb = b; + pb += r2[1]; b = lt_modm(r1[1], pb); r[1] = (r1[1] - pb + (b << 30)); pb = b; + pb += r2[2]; b = lt_modm(r1[2], pb); r[2] = (r1[2] - pb + (b << 30)); pb = b; + pb += r2[3]; b = lt_modm(r1[3], pb); r[3] = (r1[3] - pb + (b << 30)); pb = b; + pb += r2[4]; b = lt_modm(r1[4], pb); r[4] = (r1[4] - pb + (b << 30)); pb = b; + pb += r2[5]; b = lt_modm(r1[5], pb); r[5] = (r1[5] - pb + (b << 30)); pb = b; + pb += r2[6]; b = lt_modm(r1[6], pb); r[6] = (r1[6] - pb + (b << 30)); pb = b; + pb += r2[7]; b = lt_modm(r1[7], pb); r[7] = (r1[7] - pb + (b << 30)); pb = b; + pb += r2[8]; b = lt_modm(r1[8], pb); r[8] = (r1[8] - pb + (b << 24)); + + reduce256_modm(r); + reduce256_modm(r); +} + +/* addition modulo m */ +static void +add256_modm(bignum256modm r, const bignum256modm x, const bignum256modm y) { + bignum256modm_element_t c; + + c = x[0] + y[0]; r[0] = c & 0x3fffffff; c >>= 30; + c += x[1] + y[1]; r[1] = c & 0x3fffffff; c >>= 30; + c += x[2] + y[2]; r[2] = c & 0x3fffffff; c >>= 30; + c += x[3] + y[3]; r[3] = c & 0x3fffffff; c >>= 30; + c += x[4] + y[4]; r[4] = c & 0x3fffffff; c >>= 30; + c += x[5] + y[5]; r[5] = c & 0x3fffffff; c >>= 30; + c += x[6] + y[6]; r[6] = c & 0x3fffffff; c >>= 30; + c += x[7] + y[7]; r[7] = c & 0x3fffffff; c >>= 30; + c += x[8] + y[8]; r[8] = c; + + reduce256_modm(r); +} + +/* multiplication modulo m */ +static void +mul256_modm(bignum256modm r, const bignum256modm x, const bignum256modm y) { + bignum256modm r1, q1; + uint64_t c; + bignum256modm_element_t f; + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) + q1 = x >> 248 = 264 bits = 9 30 bit elements */ + c = mul32x32_64(x[0], y[0]); + f = (bignum256modm_element_t)c; r1[0] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[1]) + mul32x32_64(x[1], y[0]); + f = (bignum256modm_element_t)c; r1[1] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[2]) + mul32x32_64(x[1], y[1]) + mul32x32_64(x[2], y[0]); + f = (bignum256modm_element_t)c; r1[2] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[3]) + mul32x32_64(x[1], y[2]) + mul32x32_64(x[2], y[1]) + mul32x32_64(x[3], y[0]); + f = (bignum256modm_element_t)c; r1[3] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[4]) + mul32x32_64(x[1], y[3]) + mul32x32_64(x[2], y[2]) + mul32x32_64(x[3], y[1]) + mul32x32_64(x[4], y[0]); + f = (bignum256modm_element_t)c; r1[4] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[5]) + mul32x32_64(x[1], y[4]) + mul32x32_64(x[2], y[3]) + mul32x32_64(x[3], y[2]) + mul32x32_64(x[4], y[1]) + mul32x32_64(x[5], y[0]); + f = (bignum256modm_element_t)c; r1[5] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[6]) + mul32x32_64(x[1], y[5]) + mul32x32_64(x[2], y[4]) + mul32x32_64(x[3], y[3]) + mul32x32_64(x[4], y[2]) + mul32x32_64(x[5], y[1]) + mul32x32_64(x[6], y[0]); + f = (bignum256modm_element_t)c; r1[6] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[7]) + mul32x32_64(x[1], y[6]) + mul32x32_64(x[2], y[5]) + mul32x32_64(x[3], y[4]) + mul32x32_64(x[4], y[3]) + mul32x32_64(x[5], y[2]) + mul32x32_64(x[6], y[1]) + mul32x32_64(x[7], y[0]); + f = (bignum256modm_element_t)c; r1[7] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[8]) + mul32x32_64(x[1], y[7]) + mul32x32_64(x[2], y[6]) + mul32x32_64(x[3], y[5]) + mul32x32_64(x[4], y[4]) + mul32x32_64(x[5], y[3]) + mul32x32_64(x[6], y[2]) + mul32x32_64(x[7], y[1]) + mul32x32_64(x[8], y[0]); + f = (bignum256modm_element_t)c; r1[8] = (f & 0x00ffffff); q1[0] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[1], y[8]) + mul32x32_64(x[2], y[7]) + mul32x32_64(x[3], y[6]) + mul32x32_64(x[4], y[5]) + mul32x32_64(x[5], y[4]) + mul32x32_64(x[6], y[3]) + mul32x32_64(x[7], y[2]) + mul32x32_64(x[8], y[1]); + f = (bignum256modm_element_t)c; q1[0] = (q1[0] | (f << 22)) & 0x3fffffff; q1[1] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[2], y[8]) + mul32x32_64(x[3], y[7]) + mul32x32_64(x[4], y[6]) + mul32x32_64(x[5], y[5]) + mul32x32_64(x[6], y[4]) + mul32x32_64(x[7], y[3]) + mul32x32_64(x[8], y[2]); + f = (bignum256modm_element_t)c; q1[1] = (q1[1] | (f << 22)) & 0x3fffffff; q1[2] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[3], y[8]) + mul32x32_64(x[4], y[7]) + mul32x32_64(x[5], y[6]) + mul32x32_64(x[6], y[5]) + mul32x32_64(x[7], y[4]) + mul32x32_64(x[8], y[3]); + f = (bignum256modm_element_t)c; q1[2] = (q1[2] | (f << 22)) & 0x3fffffff; q1[3] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[4], y[8]) + mul32x32_64(x[5], y[7]) + mul32x32_64(x[6], y[6]) + mul32x32_64(x[7], y[5]) + mul32x32_64(x[8], y[4]); + f = (bignum256modm_element_t)c; q1[3] = (q1[3] | (f << 22)) & 0x3fffffff; q1[4] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[5], y[8]) + mul32x32_64(x[6], y[7]) + mul32x32_64(x[7], y[6]) + mul32x32_64(x[8], y[5]); + f = (bignum256modm_element_t)c; q1[4] = (q1[4] | (f << 22)) & 0x3fffffff; q1[5] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[6], y[8]) + mul32x32_64(x[7], y[7]) + mul32x32_64(x[8], y[6]); + f = (bignum256modm_element_t)c; q1[5] = (q1[5] | (f << 22)) & 0x3fffffff; q1[6] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[7], y[8]) + mul32x32_64(x[8], y[7]); + f = (bignum256modm_element_t)c; q1[6] = (q1[6] | (f << 22)) & 0x3fffffff; q1[7] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[8], y[8]); + f = (bignum256modm_element_t)c; q1[7] = (q1[7] | (f << 22)) & 0x3fffffff; q1[8] = (f >> 8) & 0x3fffff; + + barrett_reduce256_modm(r, q1, r1); +} + +static void +expand256_modm(bignum256modm out, const unsigned char *in, size_t len) { + unsigned char work[64] = {0}; + bignum256modm_element_t x[16]; + bignum256modm q1; + + memcpy(work, in, len); + x[0] = U8TO32_LE(work + 0); + x[1] = U8TO32_LE(work + 4); + x[2] = U8TO32_LE(work + 8); + x[3] = U8TO32_LE(work + 12); + x[4] = U8TO32_LE(work + 16); + x[5] = U8TO32_LE(work + 20); + x[6] = U8TO32_LE(work + 24); + x[7] = U8TO32_LE(work + 28); + x[8] = U8TO32_LE(work + 32); + x[9] = U8TO32_LE(work + 36); + x[10] = U8TO32_LE(work + 40); + x[11] = U8TO32_LE(work + 44); + x[12] = U8TO32_LE(work + 48); + x[13] = U8TO32_LE(work + 52); + x[14] = U8TO32_LE(work + 56); + x[15] = U8TO32_LE(work + 60); + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) */ + out[0] = ( x[0]) & 0x3fffffff; + out[1] = ((x[ 0] >> 30) | (x[ 1] << 2)) & 0x3fffffff; + out[2] = ((x[ 1] >> 28) | (x[ 2] << 4)) & 0x3fffffff; + out[3] = ((x[ 2] >> 26) | (x[ 3] << 6)) & 0x3fffffff; + out[4] = ((x[ 3] >> 24) | (x[ 4] << 8)) & 0x3fffffff; + out[5] = ((x[ 4] >> 22) | (x[ 5] << 10)) & 0x3fffffff; + out[6] = ((x[ 5] >> 20) | (x[ 6] << 12)) & 0x3fffffff; + out[7] = ((x[ 6] >> 18) | (x[ 7] << 14)) & 0x3fffffff; + out[8] = ((x[ 7] >> 16) | (x[ 8] << 16)) & 0x00ffffff; + + /* 8*31 = 248 bits, no need to reduce */ + if (len < 32) + return; + + /* q1 = x >> 248 = 264 bits = 9 30 bit elements */ + q1[0] = ((x[ 7] >> 24) | (x[ 8] << 8)) & 0x3fffffff; + q1[1] = ((x[ 8] >> 22) | (x[ 9] << 10)) & 0x3fffffff; + q1[2] = ((x[ 9] >> 20) | (x[10] << 12)) & 0x3fffffff; + q1[3] = ((x[10] >> 18) | (x[11] << 14)) & 0x3fffffff; + q1[4] = ((x[11] >> 16) | (x[12] << 16)) & 0x3fffffff; + q1[5] = ((x[12] >> 14) | (x[13] << 18)) & 0x3fffffff; + q1[6] = ((x[13] >> 12) | (x[14] << 20)) & 0x3fffffff; + q1[7] = ((x[14] >> 10) | (x[15] << 22)) & 0x3fffffff; + q1[8] = ((x[15] >> 8) ); + + barrett_reduce256_modm(out, q1, out); +} + +static void +expand_raw256_modm(bignum256modm out, const unsigned char in[32]) { + bignum256modm_element_t x[8]; + + x[0] = U8TO32_LE(in + 0); + x[1] = U8TO32_LE(in + 4); + x[2] = U8TO32_LE(in + 8); + x[3] = U8TO32_LE(in + 12); + x[4] = U8TO32_LE(in + 16); + x[5] = U8TO32_LE(in + 20); + x[6] = U8TO32_LE(in + 24); + x[7] = U8TO32_LE(in + 28); + + out[0] = ( x[0]) & 0x3fffffff; + out[1] = ((x[ 0] >> 30) | (x[ 1] << 2)) & 0x3fffffff; + out[2] = ((x[ 1] >> 28) | (x[ 2] << 4)) & 0x3fffffff; + out[3] = ((x[ 2] >> 26) | (x[ 3] << 6)) & 0x3fffffff; + out[4] = ((x[ 3] >> 24) | (x[ 4] << 8)) & 0x3fffffff; + out[5] = ((x[ 4] >> 22) | (x[ 5] << 10)) & 0x3fffffff; + out[6] = ((x[ 5] >> 20) | (x[ 6] << 12)) & 0x3fffffff; + out[7] = ((x[ 6] >> 18) | (x[ 7] << 14)) & 0x3fffffff; + out[8] = ((x[ 7] >> 16) ) & 0x0000ffff; +} + +static void +contract256_modm(unsigned char out[32], const bignum256modm in) { + U32TO8_LE(out + 0, (in[0] ) | (in[1] << 30)); + U32TO8_LE(out + 4, (in[1] >> 2) | (in[2] << 28)); + U32TO8_LE(out + 8, (in[2] >> 4) | (in[3] << 26)); + U32TO8_LE(out + 12, (in[3] >> 6) | (in[4] << 24)); + U32TO8_LE(out + 16, (in[4] >> 8) | (in[5] << 22)); + U32TO8_LE(out + 20, (in[5] >> 10) | (in[6] << 20)); + U32TO8_LE(out + 24, (in[6] >> 12) | (in[7] << 18)); + U32TO8_LE(out + 28, (in[7] >> 14) | (in[8] << 16)); +} + + + +static void +contract256_window4_modm(signed char r[64], const bignum256modm in) { + char carry; + signed char *quads = r; + bignum256modm_element_t i, j, v; + + for (i = 0; i < 8; i += 2) { + v = in[i]; + for (j = 0; j < 7; j++) { + *quads++ = (v & 15); + v >>= 4; + } + v |= (in[i+1] << 2); + for (j = 0; j < 8; j++) { + *quads++ = (v & 15); + v >>= 4; + } + } + v = in[8]; + *quads++ = (v & 15); v >>= 4; + *quads++ = (v & 15); v >>= 4; + *quads++ = (v & 15); v >>= 4; + *quads++ = (v & 15); v >>= 4; + + /* making it signed */ + carry = 0; + for(i = 0; i < 63; i++) { + r[i] += carry; + r[i+1] += (r[i] >> 4); + r[i] &= 15; + carry = (r[i] >> 3); + r[i] -= (carry << 4); + } + r[63] += carry; +} + +static void +contract256_slidingwindow_modm(signed char r[256], const bignum256modm s, int windowsize) { + int i,j,k,b; + int m = (1 << (windowsize - 1)) - 1; + const int soplen = 256; + signed char *bits = r; + bignum256modm_element_t v; + + /* first put the binary expansion into r */ + for (i = 0; i < 8; i++) { + v = s[i]; + for (j = 0; j < 30; j++, v >>= 1) + *bits++ = (v & 1); + } + v = s[8]; + for (j = 0; j < 16; j++, v >>= 1) + *bits++ = (v & 1); + + /* Making it sliding window */ + for (j = 0; j < soplen; j++) { + if (!r[j]) + continue; + + for (b = 1; (b < (soplen - j)) && (b <= 6); b++) { + if ((r[j] + (r[j + b] << b)) <= m) { + r[j] += r[j + b] << b; + r[j + b] = 0; + } else if ((r[j] - (r[j + b] << b)) >= -m) { + r[j] -= r[j + b] << b; + for (k = j + b; k < soplen; k++) { + if (!r[k]) { + r[k] = 1; + break; + } + r[k] = 0; + } + } else if (r[j + b]) { + break; + } + } + } +} + + +/* + helpers for batch verifcation, are allowed to be vartime +*/ + +/* out = a - b, a must be larger than b */ +static void +sub256_modm_batch(bignum256modm out, const bignum256modm a, const bignum256modm b, size_t limbsize) { + size_t i = 0; + bignum256modm_element_t carry = 0; + switch (limbsize) { + case 8: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ + case 7: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ + case 6: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ + case 5: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ + case 4: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ + case 3: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ + case 2: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ + case 1: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ + case 0: + default: out[i] = (a[i] - b[i]) - carry; + } +} + + +/* is a < b */ +static int +lt256_modm_batch(const bignum256modm a, const bignum256modm b, size_t limbsize) { + switch (limbsize) { + case 8: if (a[8] > b[8]) return 0; if (a[8] < b[8]) return 1; /* Falls through. */ + case 7: if (a[7] > b[7]) return 0; if (a[7] < b[7]) return 1; /* Falls through. */ + case 6: if (a[6] > b[6]) return 0; if (a[6] < b[6]) return 1; /* Falls through. */ + case 5: if (a[5] > b[5]) return 0; if (a[5] < b[5]) return 1; /* Falls through. */ + case 4: if (a[4] > b[4]) return 0; if (a[4] < b[4]) return 1; /* Falls through. */ + case 3: if (a[3] > b[3]) return 0; if (a[3] < b[3]) return 1; /* Falls through. */ + case 2: if (a[2] > b[2]) return 0; if (a[2] < b[2]) return 1; /* Falls through. */ + case 1: if (a[1] > b[1]) return 0; if (a[1] < b[1]) return 1; /* Falls through. */ + case 0: if (a[0] > b[0]) return 0; if (a[0] < b[0]) return 1; + } + return 0; +} + +/* is a <= b */ +static int +lte256_modm_batch(const bignum256modm a, const bignum256modm b, size_t limbsize) { + switch (limbsize) { + case 8: if (a[8] > b[8]) return 0; if (a[8] < b[8]) return 1; /* Falls through. */ + case 7: if (a[7] > b[7]) return 0; if (a[7] < b[7]) return 1; /* Falls through. */ + case 6: if (a[6] > b[6]) return 0; if (a[6] < b[6]) return 1; /* Falls through. */ + case 5: if (a[5] > b[5]) return 0; if (a[5] < b[5]) return 1; /* Falls through. */ + case 4: if (a[4] > b[4]) return 0; if (a[4] < b[4]) return 1; /* Falls through. */ + case 3: if (a[3] > b[3]) return 0; if (a[3] < b[3]) return 1; /* Falls through. */ + case 2: if (a[2] > b[2]) return 0; if (a[2] < b[2]) return 1; /* Falls through. */ + case 1: if (a[1] > b[1]) return 0; if (a[1] < b[1]) return 1; /* Falls through. */ + case 0: if (a[0] > b[0]) return 0; if (a[0] < b[0]) return 1; + } + return 1; +} + + +/* is a == 0 */ +static int +iszero256_modm_batch(const bignum256modm a) { + size_t i; + for (i = 0; i < 9; i++) + if (a[i]) + return 0; + return 1; +} + +/* is a == 1 */ +static int +isone256_modm_batch(const bignum256modm a) { + size_t i; + if (a[0] != 1) + return 0; + for (i = 1; i < 9; i++) + if (a[i]) + return 0; + return 1; +} + +/* can a fit in to (at most) 128 bits */ +static int +isatmost128bits256_modm_batch(const bignum256modm a) { + uint32_t mask = + ((a[8] ) | /* 16 */ + (a[7] ) | /* 46 */ + (a[6] ) | /* 76 */ + (a[5] ) | /* 106 */ + (a[4] & 0x3fffff00)); /* 128 */ + + return (mask == 0); +} diff --git a/src/wraith/src/ext/ed25519/donna/modm-donna-64bit.h b/src/wraith/src/ext/ed25519/donna/modm-donna-64bit.h new file mode 100644 index 000000000..06c98e303 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/modm-donna-64bit.h @@ -0,0 +1,366 @@ +/* + Public domain by Andrew M. +*/ + + +/* + Arithmetic modulo the group order n = 2^252 + 27742317777372353535851937790883648493 = 7237005577332262213973186563042994240857116359379907606001950938285454250989 + + k = 32 + b = 1 << 8 = 256 + m = 2^252 + 27742317777372353535851937790883648493 = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed + mu = floor( b^(k*2) / m ) = 0xfffffffffffffffffffffffffffffffeb2106215d086329a7ed9ce5a30a2c131b +*/ + +#define bignum256modm_bits_per_limb 56 +#define bignum256modm_limb_size 5 + +typedef uint64_t bignum256modm_element_t; +typedef bignum256modm_element_t bignum256modm[5]; + +static const bignum256modm modm_m = { + 0x12631a5cf5d3ed, + 0xf9dea2f79cd658, + 0x000000000014de, + 0x00000000000000, + 0x00000010000000 +}; + +static const bignum256modm modm_mu = { + 0x9ce5a30a2c131b, + 0x215d086329a7ed, + 0xffffffffeb2106, + 0xffffffffffffff, + 0x00000fffffffff +}; + +static bignum256modm_element_t +lt_modm(bignum256modm_element_t a, bignum256modm_element_t b) { + return (a - b) >> 63; +} + +static void +reduce256_modm(bignum256modm r) { + bignum256modm t; + bignum256modm_element_t b = 0, pb, mask; + + /* t = r - m */ + pb = 0; + pb += modm_m[0]; b = lt_modm(r[0], pb); t[0] = (r[0] - pb + (b << 56)); pb = b; + pb += modm_m[1]; b = lt_modm(r[1], pb); t[1] = (r[1] - pb + (b << 56)); pb = b; + pb += modm_m[2]; b = lt_modm(r[2], pb); t[2] = (r[2] - pb + (b << 56)); pb = b; + pb += modm_m[3]; b = lt_modm(r[3], pb); t[3] = (r[3] - pb + (b << 56)); pb = b; + pb += modm_m[4]; b = lt_modm(r[4], pb); t[4] = (r[4] - pb + (b << 32)); + + /* keep r if r was smaller than m */ + mask = b - 1; + + r[0] ^= mask & (r[0] ^ t[0]); + r[1] ^= mask & (r[1] ^ t[1]); + r[2] ^= mask & (r[2] ^ t[2]); + r[3] ^= mask & (r[3] ^ t[3]); + r[4] ^= mask & (r[4] ^ t[4]); +} + +static void +barrett_reduce256_modm(bignum256modm r, const bignum256modm q1, const bignum256modm r1) { + bignum256modm q3, r2; + uint128_t c, mul; + bignum256modm_element_t f, b, pb; + + /* q1 = x >> 248 = 264 bits = 5 56 bit elements + q2 = mu * q1 + q3 = (q2 / 256(32+1)) = q2 / (2^8)^(32+1) = q2 >> 264 */ + mul64x64_128(c, modm_mu[0], q1[3]) mul64x64_128(mul, modm_mu[3], q1[0]) add128(c, mul) mul64x64_128(mul, modm_mu[1], q1[2]) add128(c, mul) mul64x64_128(mul, modm_mu[2], q1[1]) add128(c, mul) shr128(f, c, 56); + mul64x64_128(c, modm_mu[0], q1[4]) add128_64(c, f) mul64x64_128(mul, modm_mu[4], q1[0]) add128(c, mul) mul64x64_128(mul, modm_mu[3], q1[1]) add128(c, mul) mul64x64_128(mul, modm_mu[1], q1[3]) add128(c, mul) mul64x64_128(mul, modm_mu[2], q1[2]) add128(c, mul) + f = lo128(c); q3[0] = (f >> 40) & 0xffff; shr128(f, c, 56); + mul64x64_128(c, modm_mu[4], q1[1]) add128_64(c, f) mul64x64_128(mul, modm_mu[1], q1[4]) add128(c, mul) mul64x64_128(mul, modm_mu[2], q1[3]) add128(c, mul) mul64x64_128(mul, modm_mu[3], q1[2]) add128(c, mul) + f = lo128(c); q3[0] |= (f << 16) & 0xffffffffffffff; q3[1] = (f >> 40) & 0xffff; shr128(f, c, 56); + mul64x64_128(c, modm_mu[4], q1[2]) add128_64(c, f) mul64x64_128(mul, modm_mu[2], q1[4]) add128(c, mul) mul64x64_128(mul, modm_mu[3], q1[3]) add128(c, mul) + f = lo128(c); q3[1] |= (f << 16) & 0xffffffffffffff; q3[2] = (f >> 40) & 0xffff; shr128(f, c, 56); + mul64x64_128(c, modm_mu[4], q1[3]) add128_64(c, f) mul64x64_128(mul, modm_mu[3], q1[4]) add128(c, mul) + f = lo128(c); q3[2] |= (f << 16) & 0xffffffffffffff; q3[3] = (f >> 40) & 0xffff; shr128(f, c, 56); + mul64x64_128(c, modm_mu[4], q1[4]) add128_64(c, f) + f = lo128(c); q3[3] |= (f << 16) & 0xffffffffffffff; q3[4] = (f >> 40) & 0xffff; shr128(f, c, 56); + q3[4] |= (f << 16); + + mul64x64_128(c, modm_m[0], q3[0]) + r2[0] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, modm_m[0], q3[1]) add128_64(c, f) mul64x64_128(mul, modm_m[1], q3[0]) add128(c, mul) + r2[1] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, modm_m[0], q3[2]) add128_64(c, f) mul64x64_128(mul, modm_m[2], q3[0]) add128(c, mul) mul64x64_128(mul, modm_m[1], q3[1]) add128(c, mul) + r2[2] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, modm_m[0], q3[3]) add128_64(c, f) mul64x64_128(mul, modm_m[3], q3[0]) add128(c, mul) mul64x64_128(mul, modm_m[1], q3[2]) add128(c, mul) mul64x64_128(mul, modm_m[2], q3[1]) add128(c, mul) + r2[3] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, modm_m[0], q3[4]) add128_64(c, f) mul64x64_128(mul, modm_m[4], q3[0]) add128(c, mul) mul64x64_128(mul, modm_m[3], q3[1]) add128(c, mul) mul64x64_128(mul, modm_m[1], q3[3]) add128(c, mul) mul64x64_128(mul, modm_m[2], q3[2]) add128(c, mul) + r2[4] = lo128(c) & 0x0000ffffffffff; + + pb = 0; + pb += r2[0]; b = lt_modm(r1[0], pb); r[0] = (r1[0] - pb + (b << 56)); pb = b; + pb += r2[1]; b = lt_modm(r1[1], pb); r[1] = (r1[1] - pb + (b << 56)); pb = b; + pb += r2[2]; b = lt_modm(r1[2], pb); r[2] = (r1[2] - pb + (b << 56)); pb = b; + pb += r2[3]; b = lt_modm(r1[3], pb); r[3] = (r1[3] - pb + (b << 56)); pb = b; + pb += r2[4]; b = lt_modm(r1[4], pb); r[4] = (r1[4] - pb + (b << 40)); + + reduce256_modm(r); + reduce256_modm(r); +} + + +static void +add256_modm(bignum256modm r, const bignum256modm x, const bignum256modm y) { + bignum256modm_element_t c; + + c = x[0] + y[0]; r[0] = c & 0xffffffffffffff; c >>= 56; + c += x[1] + y[1]; r[1] = c & 0xffffffffffffff; c >>= 56; + c += x[2] + y[2]; r[2] = c & 0xffffffffffffff; c >>= 56; + c += x[3] + y[3]; r[3] = c & 0xffffffffffffff; c >>= 56; + c += x[4] + y[4]; r[4] = c; + + reduce256_modm(r); +} + +static void +mul256_modm(bignum256modm r, const bignum256modm x, const bignum256modm y) { + bignum256modm q1, r1; + uint128_t c, mul; + bignum256modm_element_t f; + + mul64x64_128(c, x[0], y[0]) + f = lo128(c); r1[0] = f & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, x[0], y[1]) add128_64(c, f) mul64x64_128(mul, x[1], y[0]) add128(c, mul) + f = lo128(c); r1[1] = f & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, x[0], y[2]) add128_64(c, f) mul64x64_128(mul, x[2], y[0]) add128(c, mul) mul64x64_128(mul, x[1], y[1]) add128(c, mul) + f = lo128(c); r1[2] = f & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, x[0], y[3]) add128_64(c, f) mul64x64_128(mul, x[3], y[0]) add128(c, mul) mul64x64_128(mul, x[1], y[2]) add128(c, mul) mul64x64_128(mul, x[2], y[1]) add128(c, mul) + f = lo128(c); r1[3] = f & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, x[0], y[4]) add128_64(c, f) mul64x64_128(mul, x[4], y[0]) add128(c, mul) mul64x64_128(mul, x[3], y[1]) add128(c, mul) mul64x64_128(mul, x[1], y[3]) add128(c, mul) mul64x64_128(mul, x[2], y[2]) add128(c, mul) + f = lo128(c); r1[4] = f & 0x0000ffffffffff; q1[0] = (f >> 24) & 0xffffffff; shr128(f, c, 56); + mul64x64_128(c, x[4], y[1]) add128_64(c, f) mul64x64_128(mul, x[1], y[4]) add128(c, mul) mul64x64_128(mul, x[2], y[3]) add128(c, mul) mul64x64_128(mul, x[3], y[2]) add128(c, mul) + f = lo128(c); q1[0] |= (f << 32) & 0xffffffffffffff; q1[1] = (f >> 24) & 0xffffffff; shr128(f, c, 56); + mul64x64_128(c, x[4], y[2]) add128_64(c, f) mul64x64_128(mul, x[2], y[4]) add128(c, mul) mul64x64_128(mul, x[3], y[3]) add128(c, mul) + f = lo128(c); q1[1] |= (f << 32) & 0xffffffffffffff; q1[2] = (f >> 24) & 0xffffffff; shr128(f, c, 56); + mul64x64_128(c, x[4], y[3]) add128_64(c, f) mul64x64_128(mul, x[3], y[4]) add128(c, mul) + f = lo128(c); q1[2] |= (f << 32) & 0xffffffffffffff; q1[3] = (f >> 24) & 0xffffffff; shr128(f, c, 56); + mul64x64_128(c, x[4], y[4]) add128_64(c, f) + f = lo128(c); q1[3] |= (f << 32) & 0xffffffffffffff; q1[4] = (f >> 24) & 0xffffffff; shr128(f, c, 56); + q1[4] |= (f << 32); + + barrett_reduce256_modm(r, q1, r1); +} + +static void +expand256_modm(bignum256modm out, const unsigned char *in, size_t len) { + unsigned char work[64] = {0}; + bignum256modm_element_t x[16]; + bignum256modm q1; + + memcpy(work, in, len); + x[0] = U8TO64_LE(work + 0); + x[1] = U8TO64_LE(work + 8); + x[2] = U8TO64_LE(work + 16); + x[3] = U8TO64_LE(work + 24); + x[4] = U8TO64_LE(work + 32); + x[5] = U8TO64_LE(work + 40); + x[6] = U8TO64_LE(work + 48); + x[7] = U8TO64_LE(work + 56); + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) */ + out[0] = ( x[0]) & 0xffffffffffffff; + out[1] = ((x[ 0] >> 56) | (x[ 1] << 8)) & 0xffffffffffffff; + out[2] = ((x[ 1] >> 48) | (x[ 2] << 16)) & 0xffffffffffffff; + out[3] = ((x[ 2] >> 40) | (x[ 3] << 24)) & 0xffffffffffffff; + out[4] = ((x[ 3] >> 32) | (x[ 4] << 32)) & 0x0000ffffffffff; + + /* under 252 bits, no need to reduce */ + if (len < 32) + return; + + /* q1 = x >> 248 = 264 bits */ + q1[0] = ((x[ 3] >> 56) | (x[ 4] << 8)) & 0xffffffffffffff; + q1[1] = ((x[ 4] >> 48) | (x[ 5] << 16)) & 0xffffffffffffff; + q1[2] = ((x[ 5] >> 40) | (x[ 6] << 24)) & 0xffffffffffffff; + q1[3] = ((x[ 6] >> 32) | (x[ 7] << 32)) & 0xffffffffffffff; + q1[4] = ((x[ 7] >> 24) ); + + barrett_reduce256_modm(out, q1, out); +} + +static void +expand_raw256_modm(bignum256modm out, const unsigned char in[32]) { + bignum256modm_element_t x[4]; + + x[0] = U8TO64_LE(in + 0); + x[1] = U8TO64_LE(in + 8); + x[2] = U8TO64_LE(in + 16); + x[3] = U8TO64_LE(in + 24); + + out[0] = ( x[0]) & 0xffffffffffffff; + out[1] = ((x[ 0] >> 56) | (x[ 1] << 8)) & 0xffffffffffffff; + out[2] = ((x[ 1] >> 48) | (x[ 2] << 16)) & 0xffffffffffffff; + out[3] = ((x[ 2] >> 40) | (x[ 3] << 24)) & 0xffffffffffffff; + out[4] = ((x[ 3] >> 32) ) & 0x000000ffffffff; +} + +static void +contract256_modm(unsigned char out[32], const bignum256modm in) { + U64TO8_LE(out + 0, (in[0] ) | (in[1] << 56)); + U64TO8_LE(out + 8, (in[1] >> 8) | (in[2] << 48)); + U64TO8_LE(out + 16, (in[2] >> 16) | (in[3] << 40)); + U64TO8_LE(out + 24, (in[3] >> 24) | (in[4] << 32)); +} + +static void +contract256_window4_modm(signed char r[64], const bignum256modm in) { + char carry; + signed char *quads = r; + bignum256modm_element_t i, j, v, m; + + for (i = 0; i < 5; i++) { + v = in[i]; + m = (i == 4) ? 8 : 14; + for (j = 0; j < m; j++) { + *quads++ = (v & 15); + v >>= 4; + } + } + + /* making it signed */ + carry = 0; + for(i = 0; i < 63; i++) { + r[i] += carry; + r[i+1] += (r[i] >> 4); + r[i] &= 15; + carry = (r[i] >> 3); + r[i] -= (carry << 4); + } + r[63] += carry; +} + +static void +contract256_slidingwindow_modm(signed char r[256], const bignum256modm s, int windowsize) { + int i,j,k,b; + int m = (1 << (windowsize - 1)) - 1; + const int soplen = 256; + signed char *bits = r; + bignum256modm_element_t v; + + /* first put the binary expansion into r */ + for (i = 0; i < 4; i++) { + v = s[i]; + for (j = 0; j < 56; j++, v >>= 1) + *bits++ = (v & 1); + } + v = s[4]; + for (j = 0; j < 32; j++, v >>= 1) + *bits++ = (v & 1); + + /* Making it sliding window */ + for (j = 0; j < soplen; j++) { + if (!r[j]) + continue; + + for (b = 1; (b < (soplen - j)) && (b <= 6); b++) { + /* XXX Tor: coverity scan says that r[j+b] can + * overflow, but that's not possible: b < (soplen-j) + * guarantees that b + j < soplen, so b+j < 256, + * so the index doesn't overflow. */ + if ((r[j] + (r[j + b] << b)) <= m) { + r[j] += r[j + b] << b; + r[j + b] = 0; + } else if ((r[j] - (r[j + b] << b)) >= -m) { + r[j] -= r[j + b] << b; + for (k = j + b; k < soplen; k++) { + if (!r[k]) { + r[k] = 1; + break; + } + r[k] = 0; + } + } else if (r[j + b]) { + break; + } + } + } +} + +/* + helpers for batch verifcation, are allowed to be vartime +*/ + +/* out = a - b, a must be larger than b */ +static void +sub256_modm_batch(bignum256modm out, const bignum256modm a, const bignum256modm b, size_t limbsize) { + size_t i = 0; + bignum256modm_element_t carry = 0; + switch (limbsize) { + case 4: out[i] = (a[i] - b[i]) ; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; /* Falls through. */ + case 3: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; /* Falls through. */ + case 2: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; /* Falls through. */ + case 1: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; /* Falls through. */ + case 0: + default: out[i] = (a[i] - b[i]) - carry; + } +} + + +/* is a < b */ +static int +lt256_modm_batch(const bignum256modm a, const bignum256modm b, size_t limbsize) { + size_t i = 0; + bignum256modm_element_t t, carry = 0; + switch (limbsize) { + case 4: t = (a[i] - b[i]) ; carry = (t >> 63); i++; /* Falls through. */ + case 3: t = (a[i] - b[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ + case 2: t = (a[i] - b[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ + case 1: t = (a[i] - b[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ + case 0: t = (a[i] - b[i]) - carry; carry = (t >> 63); + } + return (int)carry; +} + +/* is a <= b */ +static int +lte256_modm_batch(const bignum256modm a, const bignum256modm b, size_t limbsize) { + size_t i = 0; + bignum256modm_element_t t, carry = 0; + switch (limbsize) { + case 4: t = (b[i] - a[i]) ; carry = (t >> 63); i++; /* Falls through. */ + case 3: t = (b[i] - a[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ + case 2: t = (b[i] - a[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ + case 1: t = (b[i] - a[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ + case 0: t = (b[i] - a[i]) - carry; carry = (t >> 63); + } + return (int)!carry; +} + +/* is a == 0 */ +static int +iszero256_modm_batch(const bignum256modm a) { + size_t i; + for (i = 0; i < 5; i++) + if (a[i]) + return 0; + return 1; +} + +/* is a == 1 */ +static int +isone256_modm_batch(const bignum256modm a) { + size_t i; + for (i = 0; i < 5; i++) + if (a[i] != ((i) ? 0 : 1)) + return 0; + return 1; +} + +/* can a fit in to (at most) 128 bits */ +static int +isatmost128bits256_modm_batch(const bignum256modm a) { + uint64_t mask = + ((a[4] ) | /* 32 */ + (a[3] ) | /* 88 */ + (a[2] & 0xffffffffff0000)); + + return (mask == 0); +} diff --git a/src/wraith/src/ext/ed25519/donna/regression.h b/src/wraith/src/ext/ed25519/donna/regression.h new file mode 100644 index 000000000..b4c2e62c0 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/regression.h @@ -0,0 +1,1024 @@ +{{0x9d,0x61,0xb1,0x9d,0xef,0xfd,0x5a,0x60,0xba,0x84,0x4a,0xf4,0x92,0xec,0x2c,0xc4,0x44,0x49,0xc5,0x69,0x7b,0x32,0x69,0x19,0x70,0x3b,0xac,0x03,0x1c,0xae,0x7f,0x60,},{0xd7,0x5a,0x98,0x01,0x82,0xb1,0x0a,0xb7,0xd5,0x4b,0xfe,0xd3,0xc9,0x64,0x07,0x3a,0x0e,0xe1,0x72,0xf3,0xda,0xa6,0x23,0x25,0xaf,0x02,0x1a,0x68,0xf7,0x07,0x51,0x1a,},{0xe5,0x56,0x43,0x00,0xc3,0x60,0xac,0x72,0x90,0x86,0xe2,0xcc,0x80,0x6e,0x82,0x8a,0x84,0x87,0x7f,0x1e,0xb8,0xe5,0xd9,0x74,0xd8,0x73,0xe0,0x65,0x22,0x49,0x01,0x55,0x5f,0xb8,0x82,0x15,0x90,0xa3,0x3b,0xac,0xc6,0x1e,0x39,0x70,0x1c,0xf9,0xb4,0x6b,0xd2,0x5b,0xf5,0xf0,0x59,0x5b,0xbe,0x24,0x65,0x51,0x41,0x43,0x8e,0x7a,0x10,0x0b,},""}, +{{0x4c,0xcd,0x08,0x9b,0x28,0xff,0x96,0xda,0x9d,0xb6,0xc3,0x46,0xec,0x11,0x4e,0x0f,0x5b,0x8a,0x31,0x9f,0x35,0xab,0xa6,0x24,0xda,0x8c,0xf6,0xed,0x4f,0xb8,0xa6,0xfb,},{0x3d,0x40,0x17,0xc3,0xe8,0x43,0x89,0x5a,0x92,0xb7,0x0a,0xa7,0x4d,0x1b,0x7e,0xbc,0x9c,0x98,0x2c,0xcf,0x2e,0xc4,0x96,0x8c,0xc0,0xcd,0x55,0xf1,0x2a,0xf4,0x66,0x0c,},{0x92,0xa0,0x09,0xa9,0xf0,0xd4,0xca,0xb8,0x72,0x0e,0x82,0x0b,0x5f,0x64,0x25,0x40,0xa2,0xb2,0x7b,0x54,0x16,0x50,0x3f,0x8f,0xb3,0x76,0x22,0x23,0xeb,0xdb,0x69,0xda,0x08,0x5a,0xc1,0xe4,0x3e,0x15,0x99,0x6e,0x45,0x8f,0x36,0x13,0xd0,0xf1,0x1d,0x8c,0x38,0x7b,0x2e,0xae,0xb4,0x30,0x2a,0xee,0xb0,0x0d,0x29,0x16,0x12,0xbb,0x0c,0x00,},"\x72"}, +{{0xc5,0xaa,0x8d,0xf4,0x3f,0x9f,0x83,0x7b,0xed,0xb7,0x44,0x2f,0x31,0xdc,0xb7,0xb1,0x66,0xd3,0x85,0x35,0x07,0x6f,0x09,0x4b,0x85,0xce,0x3a,0x2e,0x0b,0x44,0x58,0xf7,},{0xfc,0x51,0xcd,0x8e,0x62,0x18,0xa1,0xa3,0x8d,0xa4,0x7e,0xd0,0x02,0x30,0xf0,0x58,0x08,0x16,0xed,0x13,0xba,0x33,0x03,0xac,0x5d,0xeb,0x91,0x15,0x48,0x90,0x80,0x25,},{0x62,0x91,0xd6,0x57,0xde,0xec,0x24,0x02,0x48,0x27,0xe6,0x9c,0x3a,0xbe,0x01,0xa3,0x0c,0xe5,0x48,0xa2,0x84,0x74,0x3a,0x44,0x5e,0x36,0x80,0xd7,0xdb,0x5a,0xc3,0xac,0x18,0xff,0x9b,0x53,0x8d,0x16,0xf2,0x90,0xae,0x67,0xf7,0x60,0x98,0x4d,0xc6,0x59,0x4a,0x7c,0x15,0xe9,0x71,0x6e,0xd2,0x8d,0xc0,0x27,0xbe,0xce,0xea,0x1e,0xc4,0x0a,},"\xaf\x82"}, +{{0x0d,0x4a,0x05,0xb0,0x73,0x52,0xa5,0x43,0x6e,0x18,0x03,0x56,0xda,0x0a,0xe6,0xef,0xa0,0x34,0x5f,0xf7,0xfb,0x15,0x72,0x57,0x57,0x72,0xe8,0x00,0x5e,0xd9,0x78,0xe9,},{0xe6,0x1a,0x18,0x5b,0xce,0xf2,0x61,0x3a,0x6c,0x7c,0xb7,0x97,0x63,0xce,0x94,0x5d,0x3b,0x24,0x5d,0x76,0x11,0x4d,0xd4,0x40,0xbc,0xf5,0xf2,0xdc,0x1a,0xa5,0x70,0x57,},{0xd9,0x86,0x8d,0x52,0xc2,0xbe,0xbc,0xe5,0xf3,0xfa,0x5a,0x79,0x89,0x19,0x70,0xf3,0x09,0xcb,0x65,0x91,0xe3,0xe1,0x70,0x2a,0x70,0x27,0x6f,0xa9,0x7c,0x24,0xb3,0xa8,0xe5,0x86,0x06,0xc3,0x8c,0x97,0x58,0x52,0x9d,0xa5,0x0e,0xe3,0x1b,0x82,0x19,0xcb,0xa4,0x52,0x71,0xc6,0x89,0xaf,0xa6,0x0b,0x0e,0xa2,0x6c,0x99,0xdb,0x19,0xb0,0x0c,},"\xcb\xc7\x7b"}, +{{0x6d,0xf9,0x34,0x0c,0x13,0x8c,0xc1,0x88,0xb5,0xfe,0x44,0x64,0xeb,0xaa,0x3f,0x7f,0xc2,0x06,0xa2,0xd5,0x5c,0x34,0x34,0x70,0x7e,0x74,0xc9,0xfc,0x04,0xe2,0x0e,0xbb,},{0xc0,0xda,0xc1,0x02,0xc4,0x53,0x31,0x86,0xe2,0x5d,0xc4,0x31,0x28,0x47,0x23,0x53,0xea,0xab,0xdb,0x87,0x8b,0x15,0x2a,0xeb,0x8e,0x00,0x1f,0x92,0xd9,0x02,0x33,0xa7,},{0x12,0x4f,0x6f,0xc6,0xb0,0xd1,0x00,0x84,0x27,0x69,0xe7,0x1b,0xd5,0x30,0x66,0x4d,0x88,0x8d,0xf8,0x50,0x7d,0xf6,0xc5,0x6d,0xed,0xfd,0xb5,0x09,0xae,0xb9,0x34,0x16,0xe2,0x6b,0x91,0x8d,0x38,0xaa,0x06,0x30,0x5d,0xf3,0x09,0x56,0x97,0xc1,0x8b,0x2a,0xa8,0x32,0xea,0xa5,0x2e,0xdc,0x0a,0xe4,0x9f,0xba,0xe5,0xa8,0x5e,0x15,0x0c,0x07,},"\x5f\x4c\x89\x89"}, +{{0xb7,0x80,0x38,0x1a,0x65,0xed,0xf8,0xb7,0x8f,0x69,0x45,0xe8,0xdb,0xec,0x79,0x41,0xac,0x04,0x9f,0xd4,0xc6,0x10,0x40,0xcf,0x0c,0x32,0x43,0x57,0x97,0x5a,0x29,0x3c,},{0xe2,0x53,0xaf,0x07,0x66,0x80,0x4b,0x86,0x9b,0xb1,0x59,0x5b,0xe9,0x76,0x5b,0x53,0x48,0x86,0xbb,0xaa,0xb8,0x30,0x5b,0xf5,0x0d,0xbc,0x7f,0x89,0x9b,0xfb,0x5f,0x01,},{0xb2,0xfc,0x46,0xad,0x47,0xaf,0x46,0x44,0x78,0xc1,0x99,0xe1,0xf8,0xbe,0x16,0x9f,0x1b,0xe6,0x32,0x7c,0x7f,0x9a,0x0a,0x66,0x89,0x37,0x1c,0xa9,0x4c,0xaf,0x04,0x06,0x4a,0x01,0xb2,0x2a,0xff,0x15,0x20,0xab,0xd5,0x89,0x51,0x34,0x16,0x03,0xfa,0xed,0x76,0x8c,0xf7,0x8c,0xe9,0x7a,0xe7,0xb0,0x38,0xab,0xfe,0x45,0x6a,0xa1,0x7c,0x09,},"\x18\xb6\xbe\xc0\x97"}, +{{0x78,0xae,0x9e,0xff,0xe6,0xf2,0x45,0xe9,0x24,0xa7,0xbe,0x63,0x04,0x11,0x46,0xeb,0xc6,0x70,0xdb,0xd3,0x06,0x0c,0xba,0x67,0xfb,0xc6,0x21,0x6f,0xeb,0xc4,0x45,0x46,},{0xfb,0xcf,0xbf,0xa4,0x05,0x05,0xd7,0xf2,0xbe,0x44,0x4a,0x33,0xd1,0x85,0xcc,0x54,0xe1,0x6d,0x61,0x52,0x60,0xe1,0x64,0x0b,0x2b,0x50,0x87,0xb8,0x3e,0xe3,0x64,0x3d,},{0x6e,0xd6,0x29,0xfc,0x1d,0x9c,0xe9,0xe1,0x46,0x87,0x55,0xff,0x63,0x6d,0x5a,0x3f,0x40,0xa5,0xd9,0xc9,0x1a,0xfd,0x93,0xb7,0x9d,0x24,0x18,0x30,0xf7,0xe5,0xfa,0x29,0x85,0x4b,0x8f,0x20,0xcc,0x6e,0xec,0xbb,0x24,0x8d,0xbd,0x8d,0x16,0xd1,0x4e,0x99,0x75,0x21,0x94,0xe4,0x90,0x4d,0x09,0xc7,0x4d,0x63,0x95,0x18,0x83,0x9d,0x23,0x00,},"\x89\x01\x0d\x85\x59\x72"}, +{{0x69,0x18,0x65,0xbf,0xc8,0x2a,0x1e,0x4b,0x57,0x4e,0xec,0xde,0x4c,0x75,0x19,0x09,0x3f,0xaf,0x0c,0xf8,0x67,0x38,0x02,0x34,0xe3,0x66,0x46,0x45,0xc6,0x1c,0x5f,0x79,},{0x98,0xa5,0xe3,0xa3,0x6e,0x67,0xaa,0xba,0x89,0x88,0x8b,0xf0,0x93,0xde,0x1a,0xd9,0x63,0xe7,0x74,0x01,0x3b,0x39,0x02,0xbf,0xab,0x35,0x6d,0x8b,0x90,0x17,0x8a,0x63,},{0x6e,0x0a,0xf2,0xfe,0x55,0xae,0x37,0x7a,0x6b,0x7a,0x72,0x78,0xed,0xfb,0x41,0x9b,0xd3,0x21,0xe0,0x6d,0x0d,0xf5,0xe2,0x70,0x37,0xdb,0x88,0x12,0xe7,0xe3,0x52,0x98,0x10,0xfa,0x55,0x52,0xf6,0xc0,0x02,0x09,0x85,0xca,0x17,0xa0,0xe0,0x2e,0x03,0x6d,0x7b,0x22,0x2a,0x24,0xf9,0x9b,0x77,0xb7,0x5f,0xdd,0x16,0xcb,0x05,0x56,0x81,0x07,},"\xb4\xa8\xf3\x81\xe7\x0e\x7a"}, +{{0x3b,0x26,0x51,0x6f,0xb3,0xdc,0x88,0xeb,0x18,0x1b,0x9e,0xd7,0x3f,0x0b,0xcd,0x52,0xbc,0xd6,0xb4,0xc7,0x88,0xe4,0xbc,0xaf,0x46,0x05,0x7f,0xd0,0x78,0xbe,0xe0,0x73,},{0xf8,0x1f,0xb5,0x4a,0x82,0x5f,0xce,0xd9,0x5e,0xb0,0x33,0xaf,0xcd,0x64,0x31,0x40,0x75,0xab,0xfb,0x0a,0xbd,0x20,0xa9,0x70,0x89,0x25,0x03,0x43,0x6f,0x34,0xb8,0x63,},{0xd6,0xad,0xde,0xc5,0xaf,0xb0,0x52,0x8a,0xc1,0x7b,0xb1,0x78,0xd3,0xe7,0xf2,0x88,0x7f,0x9a,0xdb,0xb1,0xad,0x16,0xe1,0x10,0x54,0x5e,0xf3,0xbc,0x57,0xf9,0xde,0x23,0x14,0xa5,0xc8,0x38,0x8f,0x72,0x3b,0x89,0x07,0xbe,0x0f,0x3a,0xc9,0x0c,0x62,0x59,0xbb,0xe8,0x85,0xec,0xc1,0x76,0x45,0xdf,0x3d,0xb7,0xd4,0x88,0xf8,0x05,0xfa,0x08,},"\x42\x84\xab\xc5\x1b\xb6\x72\x35"}, +{{0xed,0xc6,0xf5,0xfb,0xdd,0x1c,0xee,0x4d,0x10,0x1c,0x06,0x35,0x30,0xa3,0x04,0x90,0xb2,0x21,0xbe,0x68,0xc0,0x36,0xf5,0xb0,0x7d,0x0f,0x95,0x3b,0x74,0x5d,0xf1,0x92,},{0xc1,0xa4,0x9c,0x66,0xe6,0x17,0xf9,0xef,0x5e,0xc6,0x6b,0xc4,0xc6,0x56,0x4c,0xa3,0x3d,0xe2,0xa5,0xfb,0x5e,0x14,0x64,0x06,0x2e,0x6d,0x6c,0x62,0x19,0x15,0x5e,0xfd,},{0x2c,0x76,0xa0,0x4a,0xf2,0x39,0x1c,0x14,0x70,0x82,0xe3,0x3f,0xaa,0xcd,0xbe,0x56,0x64,0x2a,0x1e,0x13,0x4b,0xd3,0x88,0x62,0x0b,0x85,0x2b,0x90,0x1a,0x6b,0xc1,0x6f,0xf6,0xc9,0xcc,0x94,0x04,0xc4,0x1d,0xea,0x12,0xed,0x28,0x1d,0xa0,0x67,0xa1,0x51,0x38,0x66,0xf9,0xd9,0x64,0xf8,0xbd,0xd2,0x49,0x53,0x85,0x6c,0x50,0x04,0x29,0x01,},"\x67\x2b\xf8\x96\x5d\x04\xbc\x51\x46"}, +{{0x4e,0x7d,0x21,0xfb,0x3b,0x18,0x97,0x57,0x1a,0x44,0x58,0x33,0xbe,0x0f,0x9f,0xd4,0x1c,0xd6,0x2b,0xe3,0xaa,0x04,0x04,0x0f,0x89,0x34,0xe1,0xfc,0xbd,0xca,0xcd,0x45,},{0x31,0xb2,0x52,0x4b,0x83,0x48,0xf7,0xab,0x1d,0xfa,0xfa,0x67,0x5c,0xc5,0x38,0xe9,0xa8,0x4e,0x3f,0xe5,0x81,0x9e,0x27,0xc1,0x2a,0xd8,0xbb,0xc1,0xa3,0x6e,0x4d,0xff,},{0x28,0xe4,0x59,0x8c,0x41,0x5a,0xe9,0xde,0x01,0xf0,0x3f,0x9f,0x3f,0xab,0x4e,0x91,0x9e,0x8b,0xf5,0x37,0xdd,0x2b,0x0c,0xdf,0x6e,0x79,0xb9,0xe6,0x55,0x9c,0x94,0x09,0xd9,0x15,0x1a,0x4c,0x40,0xf0,0x83,0x19,0x39,0x37,0x62,0x7c,0x36,0x94,0x88,0x25,0x9e,0x99,0xda,0x5a,0x9f,0x0a,0x87,0x49,0x7f,0xa6,0x69,0x6a,0x5d,0xd6,0xce,0x08,},"\x33\xd7\xa7\x86\xad\xed\x8c\x1b\xf6\x91"}, +{{0xa9,0x80,0xf8,0x92,0xdb,0x13,0xc9,0x9a,0x3e,0x89,0x71,0xe9,0x65,0xb2,0xff,0x3d,0x41,0xea,0xfd,0x54,0x09,0x3b,0xc9,0xf3,0x4d,0x1f,0xd2,0x2d,0x84,0x11,0x5b,0xb6,},{0x44,0xb5,0x7e,0xe3,0x0c,0xdb,0x55,0x82,0x9d,0x0a,0x5d,0x4f,0x04,0x6b,0xae,0xf0,0x78,0xf1,0xe9,0x7a,0x7f,0x21,0xb6,0x2d,0x75,0xf8,0xe9,0x6e,0xa1,0x39,0xc3,0x5f,},{0x77,0xd3,0x89,0xe5,0x99,0x63,0x0d,0x93,0x40,0x76,0x32,0x95,0x83,0xcd,0x41,0x05,0xa6,0x49,0xa9,0x29,0x2a,0xbc,0x44,0xcd,0x28,0xc4,0x00,0x00,0xc8,0xe2,0xf5,0xac,0x76,0x60,0xa8,0x1c,0x85,0xb7,0x2a,0xf8,0x45,0x2d,0x7d,0x25,0xc0,0x70,0x86,0x1d,0xae,0x91,0x60,0x1c,0x78,0x03,0xd6,0x56,0x53,0x16,0x50,0xdd,0x4e,0x5c,0x41,0x00,},"\x34\x86\xf6\x88\x48\xa6\x5a\x0e\xb5\x50\x7d"}, +{{0x5b,0x5a,0x61,0x9f,0x8c,0xe1,0xc6,0x6d,0x7c,0xe2,0x6e,0x5a,0x2a,0xe7,0xb0,0xc0,0x4f,0xeb,0xcd,0x34,0x6d,0x28,0x6c,0x92,0x9e,0x19,0xd0,0xd5,0x97,0x3b,0xfe,0xf9,},{0x6f,0xe8,0x36,0x93,0xd0,0x11,0xd1,0x11,0x13,0x1c,0x4f,0x3f,0xba,0xaa,0x40,0xa9,0xd3,0xd7,0x6b,0x30,0x01,0x2f,0xf7,0x3b,0xb0,0xe3,0x9e,0xc2,0x7a,0xb1,0x82,0x57,},{0x0f,0x9a,0xd9,0x79,0x30,0x33,0xa2,0xfa,0x06,0x61,0x4b,0x27,0x7d,0x37,0x38,0x1e,0x6d,0x94,0xf6,0x5a,0xc2,0xa5,0xa9,0x45,0x58,0xd0,0x9e,0xd6,0xce,0x92,0x22,0x58,0xc1,0xa5,0x67,0x95,0x2e,0x86,0x3a,0xc9,0x42,0x97,0xae,0xc3,0xc0,0xd0,0xc8,0xdd,0xf7,0x10,0x84,0xe5,0x04,0x86,0x0b,0xb6,0xba,0x27,0x44,0x9b,0x55,0xad,0xc4,0x0e,},"\x5a\x8d\x9d\x0a\x22\x35\x7e\x66\x55\xf9\xc7\x85"}, +{{0x94,0x0c,0x89,0xfe,0x40,0xa8,0x1d,0xaf,0xbd,0xb2,0x41,0x6d,0x14,0xae,0x46,0x91,0x19,0x86,0x97,0x44,0x41,0x0c,0x33,0x03,0xbf,0xaa,0x02,0x41,0xda,0xc5,0x78,0x00,},{0xa2,0xeb,0x8c,0x05,0x01,0xe3,0x0b,0xae,0x0c,0xf8,0x42,0xd2,0xbd,0xe8,0xde,0xc7,0x38,0x6f,0x6b,0x7f,0xc3,0x98,0x1b,0x8c,0x57,0xc9,0x79,0x2b,0xb9,0x4c,0xf2,0xdd,},{0xd8,0xbb,0x64,0xaa,0xd8,0xc9,0x95,0x5a,0x11,0x5a,0x79,0x3a,0xdd,0xd2,0x4f,0x7f,0x2b,0x07,0x76,0x48,0x71,0x4f,0x49,0xc4,0x69,0x4e,0xc9,0x95,0xb3,0x30,0xd0,0x9d,0x64,0x0d,0xf3,0x10,0xf4,0x47,0xfd,0x7b,0x6c,0xb5,0xc1,0x4f,0x9f,0xe9,0xf4,0x90,0xbc,0xf8,0xcf,0xad,0xbf,0xd2,0x16,0x9c,0x8a,0xc2,0x0d,0x3b,0x8a,0xf4,0x9a,0x0c,},"\xb8\x7d\x38\x13\xe0\x3f\x58\xcf\x19\xfd\x0b\x63\x95"}, +{{0x9a,0xca,0xd9,0x59,0xd2,0x16,0x21,0x2d,0x78,0x9a,0x11,0x92,0x52,0xeb,0xfe,0x0c,0x96,0x51,0x2a,0x23,0xc7,0x3b,0xd9,0xf3,0xb2,0x02,0x29,0x2d,0x69,0x16,0xa7,0x38,},{0xcf,0x3a,0xf8,0x98,0x46,0x7a,0x5b,0x7a,0x52,0xd3,0x3d,0x53,0xbc,0x03,0x7e,0x26,0x42,0xa8,0xda,0x99,0x69,0x03,0xfc,0x25,0x22,0x17,0xe9,0xc0,0x33,0xe2,0xf2,0x91,},{0x6e,0xe3,0xfe,0x81,0xe2,0x3c,0x60,0xeb,0x23,0x12,0xb2,0x00,0x6b,0x3b,0x25,0xe6,0x83,0x8e,0x02,0x10,0x66,0x23,0xf8,0x44,0xc4,0x4e,0xdb,0x8d,0xaf,0xd6,0x6a,0xb0,0x67,0x10,0x87,0xfd,0x19,0x5d,0xf5,0xb8,0xf5,0x8a,0x1d,0x6e,0x52,0xaf,0x42,0x90,0x80,0x53,0xd5,0x5c,0x73,0x21,0x01,0x00,0x92,0x74,0x87,0x95,0xef,0x94,0xcf,0x06,},"\x55\xc7\xfa\x43\x4f\x5e\xd8\xcd\xec\x2b\x7a\xea\xc1\x73"}, +{{0xd5,0xae,0xee,0x41,0xee,0xb0,0xe9,0xd1,0xbf,0x83,0x37,0xf9,0x39,0x58,0x7e,0xbe,0x29,0x61,0x61,0xe6,0xbf,0x52,0x09,0xf5,0x91,0xec,0x93,0x9e,0x14,0x40,0xc3,0x00,},{0xfd,0x2a,0x56,0x57,0x23,0x16,0x3e,0x29,0xf5,0x3c,0x9d,0xe3,0xd5,0xe8,0xfb,0xe3,0x6a,0x7a,0xb6,0x6e,0x14,0x39,0xec,0x4e,0xae,0x9c,0x0a,0x60,0x4a,0xf2,0x91,0xa5,},{0xf6,0x8d,0x04,0x84,0x7e,0x5b,0x24,0x97,0x37,0x89,0x9c,0x01,0x4d,0x31,0xc8,0x05,0xc5,0x00,0x7a,0x62,0xc0,0xa1,0x0d,0x50,0xbb,0x15,0x38,0xc5,0xf3,0x55,0x03,0x95,0x1f,0xbc,0x1e,0x08,0x68,0x2f,0x2c,0xc0,0xc9,0x2e,0xfe,0x8f,0x49,0x85,0xde,0xc6,0x1d,0xcb,0xd5,0x4d,0x4b,0x94,0xa2,0x25,0x47,0xd2,0x44,0x51,0x27,0x1c,0x8b,0x00,},"\x0a\x68\x8e\x79\xbe\x24\xf8\x66\x28\x6d\x46\x46\xb5\xd8\x1c"}, +{{0x0a,0x47,0xd1,0x04,0x52,0xae,0x2f,0xeb,0xec,0x51,0x8a,0x1c,0x7c,0x36,0x28,0x90,0xc3,0xfc,0x1a,0x49,0xd3,0x4b,0x03,0xb6,0x46,0x7d,0x35,0xc9,0x04,0xa8,0x36,0x2d,},{0x34,0xe5,0xa8,0x50,0x8c,0x47,0x43,0x74,0x69,0x62,0xc0,0x66,0xe4,0xba,0xde,0xa2,0x20,0x1b,0x8a,0xb4,0x84,0xde,0x5c,0x4f,0x94,0x47,0x6c,0xcd,0x21,0x43,0x95,0x5b,},{0x2a,0x3d,0x27,0xdc,0x40,0xd0,0xa8,0x12,0x79,0x49,0xa3,0xb7,0xf9,0x08,0xb3,0x68,0x8f,0x63,0xb7,0xf1,0x4f,0x65,0x1a,0xac,0xd7,0x15,0x94,0x0b,0xdb,0xe2,0x7a,0x08,0x09,0xaa,0xc1,0x42,0xf4,0x7a,0xb0,0xe1,0xe4,0x4f,0xa4,0x90,0xba,0x87,0xce,0x53,0x92,0xf3,0x3a,0x89,0x15,0x39,0xca,0xf1,0xef,0x4c,0x36,0x7c,0xae,0x54,0x50,0x0c,},"\xc9\x42\xfa\x7a\xc6\xb2\x3a\xb7\xff\x61\x2f\xdc\x8e\x68\xef\x39"}, +{{0xf8,0x14,0x8f,0x75,0x06,0xb7,0x75,0xef,0x46,0xfd,0xc8,0xe8,0xc7,0x56,0x51,0x68,0x12,0xd4,0x7d,0x6c,0xfb,0xfa,0x31,0x8c,0x27,0xc9,0xa2,0x26,0x41,0xe5,0x6f,0x17,},{0x04,0x45,0xe4,0x56,0xda,0xcc,0x7d,0x5b,0x0b,0xbe,0xd2,0x3c,0x82,0x00,0xcd,0xb7,0x4b,0xdc,0xb0,0x3e,0x4c,0x7b,0x73,0xf0,0xa2,0xb9,0xb4,0x6e,0xac,0x5d,0x43,0x72,},{0x36,0x53,0xcc,0xb2,0x12,0x19,0x20,0x2b,0x84,0x36,0xfb,0x41,0xa3,0x2b,0xa2,0x61,0x8c,0x4a,0x13,0x34,0x31,0xe6,0xe6,0x34,0x63,0xce,0xb3,0xb6,0x10,0x6c,0x4d,0x56,0xe1,0xd2,0xba,0x16,0x5b,0xa7,0x6e,0xaa,0xd3,0xdc,0x39,0xbf,0xfb,0x13,0x0f,0x1d,0xe3,0xd8,0xe6,0x42,0x7d,0xb5,0xb7,0x19,0x38,0xdb,0x4e,0x27,0x2b,0xc3,0xe2,0x0b,},"\x73\x68\x72\x4a\x5b\x0e\xfb\x57\xd2\x8d\x97\x62\x2d\xbd\xe7\x25\xaf"}, +{{0x77,0xf8,0x86,0x91,0xc4,0xef,0xf2,0x3e,0xbb,0x73,0x64,0x94,0x70,0x92,0x95,0x1a,0x5f,0xf3,0xf1,0x07,0x85,0xb4,0x17,0xe9,0x18,0x82,0x3a,0x55,0x2d,0xab,0x7c,0x75,},{0x74,0xd2,0x91,0x27,0xf1,0x99,0xd8,0x6a,0x86,0x76,0xae,0xc3,0x3b,0x4c,0xe3,0xf2,0x25,0xcc,0xb1,0x91,0xf5,0x2c,0x19,0x1c,0xcd,0x1e,0x8c,0xca,0x65,0x21,0x3a,0x6b,},{0xfb,0xe9,0x29,0xd7,0x43,0xa0,0x3c,0x17,0x91,0x05,0x75,0x49,0x2f,0x30,0x92,0xee,0x2a,0x2b,0xf1,0x4a,0x60,0xa3,0xfc,0xac,0xec,0x74,0xa5,0x8c,0x73,0x34,0x51,0x0f,0xc2,0x62,0xdb,0x58,0x27,0x91,0x32,0x2d,0x6c,0x8c,0x41,0xf1,0x70,0x0a,0xdb,0x80,0x02,0x7e,0xca,0xbc,0x14,0x27,0x0b,0x70,0x34,0x44,0xae,0x3e,0xe7,0x62,0x3e,0x0a,},"\xbd\x8e\x05\x03\x3f\x3a\x8b\xcd\xcb\xf4\xbe\xce\xb7\x09\x01\xc8\x2e\x31"}, +{{0xab,0x6f,0x7a,0xee,0x6a,0x08,0x37,0xb3,0x34,0xba,0x5e,0xb1,0xb2,0xad,0x7f,0xce,0xcf,0xab,0x7e,0x32,0x3c,0xab,0x18,0x7f,0xe2,0xe0,0xa9,0x5d,0x80,0xef,0xf1,0x32,},{0x5b,0x96,0xdc,0xa4,0x97,0x87,0x5b,0xf9,0x66,0x4c,0x5e,0x75,0xfa,0xcf,0x3f,0x9b,0xc5,0x4b,0xae,0x91,0x3d,0x66,0xca,0x15,0xee,0x85,0xf1,0x49,0x1c,0xa2,0x4d,0x2c,},{0x73,0xbc,0xa6,0x4e,0x9d,0xd0,0xdb,0x88,0x13,0x8e,0xed,0xfa,0xfc,0xea,0x8f,0x54,0x36,0xcf,0xb7,0x4b,0xfb,0x0e,0x77,0x33,0xcf,0x34,0x9b,0xaa,0x0c,0x49,0x77,0x5c,0x56,0xd5,0x93,0x4e,0x1d,0x38,0xe3,0x6f,0x39,0xb7,0xc5,0xbe,0xb0,0xa8,0x36,0x51,0x0c,0x45,0x12,0x6f,0x8e,0xc4,0xb6,0x81,0x05,0x19,0x90,0x5b,0x0c,0xa0,0x7c,0x09,},"\x81\x71\x45\x6f\x8b\x90\x71\x89\xb1\xd7\x79\xe2\x6b\xc5\xaf\xbb\x08\xc6\x7a"}, +{{0x8d,0x13,0x5d,0xe7,0xc8,0x41,0x1b,0xbd,0xbd,0x1b,0x31,0xe5,0xdc,0x67,0x8f,0x2a,0xc7,0x10,0x9e,0x79,0x2b,0x60,0xf3,0x8c,0xd2,0x49,0x36,0xe8,0xa8,0x98,0xc3,0x2d,},{0x1c,0xa2,0x81,0x93,0x85,0x29,0x89,0x65,0x35,0xa7,0x71,0x4e,0x35,0x84,0x08,0x5b,0x86,0xef,0x9f,0xec,0x72,0x3f,0x42,0x81,0x9f,0xc8,0xdd,0x5d,0x8c,0x00,0x81,0x7f,},{0xa1,0xad,0xc2,0xbc,0x6a,0x2d,0x98,0x06,0x62,0x67,0x7e,0x7f,0xdf,0xf6,0x42,0x4d,0xe7,0xdb,0xa5,0x0f,0x57,0x95,0xca,0x90,0xfd,0xf3,0xe9,0x6e,0x25,0x6f,0x32,0x85,0xca,0xc7,0x1d,0x33,0x60,0x48,0x2e,0x99,0x3d,0x02,0x94,0xba,0x4e,0xc7,0x44,0x0c,0x61,0xaf,0xfd,0xf3,0x5f,0xe8,0x3e,0x6e,0x04,0x26,0x39,0x37,0xdb,0x93,0xf1,0x05,},"\x8b\xa6\xa4\xc9\xa1\x5a\x24\x4a\x9c\x26\xbb\x2a\x59\xb1\x02\x6f\x21\x34\x8b\x49"}, +{{0x0e,0x76,0x5d,0x72,0x0e,0x70,0x5f,0x93,0x66,0xc1,0xab,0x8c,0x3f,0xa8,0x4c,0x9a,0x44,0x37,0x0c,0x06,0x96,0x9f,0x80,0x32,0x96,0x88,0x4b,0x28,0x46,0xa6,0x52,0xa4,},{0x7f,0xae,0x45,0xdd,0x0a,0x05,0x97,0x10,0x26,0xd4,0x10,0xbc,0x49,0x7a,0xf5,0xbe,0x7d,0x08,0x27,0xa8,0x2a,0x14,0x5c,0x20,0x3f,0x62,0x5d,0xfc,0xb8,0xb0,0x3b,0xa8,},{0xbb,0x61,0xcf,0x84,0xde,0x61,0x86,0x22,0x07,0xc6,0xa4,0x55,0x25,0x8b,0xc4,0xdb,0x4e,0x15,0xee,0xa0,0x31,0x7f,0xf8,0x87,0x18,0xb8,0x82,0xa0,0x6b,0x5c,0xf6,0xec,0x6f,0xd2,0x0c,0x5a,0x26,0x9e,0x5d,0x5c,0x80,0x5b,0xaf,0xbc,0xc5,0x79,0xe2,0x59,0x0a,0xf4,0x14,0xc7,0xc2,0x27,0x27,0x3c,0x10,0x2a,0x10,0x07,0x0c,0xdf,0xe8,0x0f,},"\x1d\x56\x6a\x62\x32\xbb\xaa\xb3\xe6\xd8\x80\x4b\xb5\x18\xa4\x98\xed\x0f\x90\x49\x86"}, +{{0xdb,0x36,0xe3,0x26,0xd6,0x76,0xc2,0xd1,0x9c,0xc8,0xfe,0x0c,0x14,0xb7,0x09,0x20,0x2e,0xcf,0xc7,0x61,0xd2,0x70,0x89,0xeb,0x6e,0xa4,0xb1,0xbb,0x02,0x1e,0xcf,0xa7,},{0x48,0x35,0x9b,0x85,0x0d,0x23,0xf0,0x71,0x5d,0x94,0xbb,0x8b,0xb7,0x5e,0x7e,0x14,0x32,0x2e,0xaf,0x14,0xf0,0x6f,0x28,0xa8,0x05,0x40,0x3f,0xbd,0xa0,0x02,0xfc,0x85,},{0xb6,0xdc,0xd0,0x99,0x89,0xdf,0xba,0xc5,0x43,0x22,0xa3,0xce,0x87,0x87,0x6e,0x1d,0x62,0x13,0x4d,0xa9,0x98,0xc7,0x9d,0x24,0xb5,0x0b,0xd7,0xa6,0xa7,0x97,0xd8,0x6a,0x0e,0x14,0xdc,0x9d,0x74,0x91,0xd6,0xc1,0x4a,0x67,0x3c,0x65,0x2c,0xfb,0xec,0x9f,0x96,0x2a,0x38,0xc9,0x45,0xda,0x3b,0x2f,0x08,0x79,0xd0,0xb6,0x8a,0x92,0x13,0x00,},"\x1b\x0a\xfb\x0a\xc4\xba\x9a\xb7\xb7\x17\x2c\xdd\xc9\xeb\x42\xbb\xa1\xa6\x4b\xce\x47\xd4"}, +{{0xc8,0x99,0x55,0xe0,0xf7,0x74,0x1d,0x90,0x5d,0xf0,0x73,0x0b,0x3d,0xc2,0xb0,0xce,0x1a,0x13,0x13,0x4e,0x44,0xfe,0xf3,0xd4,0x0d,0x60,0xc0,0x20,0xef,0x19,0xdf,0x77,},{0xfd,0xb3,0x06,0x73,0x40,0x2f,0xaf,0x1c,0x80,0x33,0x71,0x4f,0x35,0x17,0xe4,0x7c,0xc0,0xf9,0x1f,0xe7,0x0c,0xf3,0x83,0x6d,0x6c,0x23,0x63,0x6e,0x3f,0xd2,0x28,0x7c,},{0x7e,0xf6,0x6e,0x5e,0x86,0xf2,0x36,0x08,0x48,0xe0,0x01,0x4e,0x94,0x88,0x0a,0xe2,0x92,0x0a,0xd8,0xa3,0x18,0x5a,0x46,0xb3,0x5d,0x1e,0x07,0xde,0xa8,0xfa,0x8a,0xe4,0xf6,0xb8,0x43,0xba,0x17,0x4d,0x99,0xfa,0x79,0x86,0x65,0x4a,0x08,0x91,0xc1,0x2a,0x79,0x44,0x55,0x66,0x93,0x75,0xbf,0x92,0xaf,0x4c,0xc2,0x77,0x0b,0x57,0x9e,0x0c,},"\x50\x7c\x94\xc8\x82\x0d\x2a\x57\x93\xcb\xf3\x44\x2b\x3d\x71\x93\x6f\x35\xfe\x3a\xfe\xf3\x16"}, +{{0x4e,0x62,0x62,0x7f,0xc2,0x21,0x14,0x24,0x78,0xae,0xe7,0xf0,0x07,0x81,0xf8,0x17,0xf6,0x62,0xe3,0xb7,0x5d,0xb2,0x9b,0xb1,0x4a,0xb4,0x7c,0xf8,0xe8,0x41,0x04,0xd6,},{0xb1,0xd3,0x98,0x01,0x89,0x20,0x27,0xd5,0x8a,0x8c,0x64,0x33,0x51,0x63,0x19,0x58,0x93,0xbf,0xc1,0xb6,0x1d,0xbe,0xca,0x32,0x60,0x49,0x7e,0x1f,0x30,0x37,0x11,0x07,},{0x83,0x6a,0xfa,0x76,0x4d,0x9c,0x48,0xaa,0x47,0x70,0xa4,0x38,0x8b,0x65,0x4e,0x97,0xb3,0xc1,0x6f,0x08,0x29,0x67,0xfe,0xbc,0xa2,0x7f,0x2f,0xc4,0x7d,0xdf,0xd9,0x24,0x4b,0x03,0xcf,0xc7,0x29,0x69,0x8a,0xcf,0x51,0x09,0x70,0x43,0x46,0xb6,0x0b,0x23,0x0f,0x25,0x54,0x30,0x08,0x9d,0xdc,0x56,0x91,0x23,0x99,0xd1,0x12,0x2d,0xe7,0x0a,},"\xd3\xd6\x15\xa8\x47\x2d\x99\x62\xbb\x70\xc5\xb5\x46\x6a\x3d\x98\x3a\x48\x11\x04\x6e\x2a\x0e\xf5"}, +{{0x6b,0x83,0xd7,0xda,0x89,0x08,0xc3,0xe7,0x20,0x5b,0x39,0x86,0x4b,0x56,0xe5,0xf3,0xe1,0x71,0x96,0xa3,0xfc,0x9c,0x2f,0x58,0x05,0xaa,0xd0,0xf5,0x55,0x4c,0x14,0x2d,},{0xd0,0xc8,0x46,0xf9,0x7f,0xe2,0x85,0x85,0xc0,0xee,0x15,0x90,0x15,0xd6,0x4c,0x56,0x31,0x1c,0x88,0x6e,0xdd,0xcc,0x18,0x5d,0x29,0x6d,0xbb,0x16,0x5d,0x26,0x25,0xd6,},{0x16,0xe4,0x62,0xa2,0x9a,0x6d,0xd4,0x98,0x68,0x5a,0x37,0x18,0xb3,0xee,0xd0,0x0c,0xc1,0x59,0x86,0x01,0xee,0x47,0x82,0x04,0x86,0x03,0x2d,0x6b,0x9a,0xcc,0x9b,0xf8,0x9f,0x57,0x68,0x4e,0x08,0xd8,0xc0,0xf0,0x55,0x89,0xcd,0xa2,0x88,0x2a,0x05,0xdc,0x4c,0x63,0xf9,0xd0,0x43,0x1d,0x65,0x52,0x71,0x08,0x12,0x43,0x30,0x03,0xbc,0x08,},"\x6a\xda\x80\xb6\xfa\x84\xf7\x03\x49\x20\x78\x9e\x85\x36\xb8\x2d\x5e\x46\x78\x05\x9a\xed\x27\xf7\x1c"}, +{{0x19,0xa9,0x1f,0xe2,0x3a,0x4e,0x9e,0x33,0xec,0xc4,0x74,0x87,0x8f,0x57,0xc6,0x4c,0xf1,0x54,0xb3,0x94,0x20,0x34,0x87,0xa7,0x03,0x5e,0x1a,0xd9,0xcd,0x69,0x7b,0x0d,},{0x2b,0xf3,0x2b,0xa1,0x42,0xba,0x46,0x22,0xd8,0xf3,0xe2,0x9e,0xcd,0x85,0xee,0xa0,0x7b,0x9c,0x47,0xbe,0x9d,0x64,0x41,0x2c,0x9b,0x51,0x0b,0x27,0xdd,0x21,0x8b,0x23,},{0x88,0x1f,0x5b,0x8c,0x5a,0x03,0x0d,0xf0,0xf7,0x5b,0x66,0x34,0xb0,0x70,0xdd,0x27,0xbd,0x1e,0xe3,0xc0,0x87,0x38,0xae,0x34,0x93,0x38,0xb3,0xee,0x64,0x69,0xbb,0xf9,0x76,0x0b,0x13,0x57,0x8a,0x23,0x7d,0x51,0x82,0x53,0x5e,0xde,0x12,0x12,0x83,0x02,0x7a,0x90,0xb5,0xf8,0x65,0xd6,0x3a,0x65,0x37,0xdc,0xa0,0x7b,0x44,0x04,0x9a,0x0f,},"\x82\xcb\x53\xc4\xd5\xa0\x13\xba\xe5\x07\x07\x59\xec\x06\xc3\xc6\x95\x5a\xb7\xa4\x05\x09\x58\xec\x32\x8c"}, +{{0x1d,0x5b,0x8c,0xb6,0x21,0x5c,0x18,0x14,0x16,0x66,0xba,0xee,0xfc,0xf5,0xd6,0x9d,0xad,0x5b,0xea,0x9a,0x34,0x93,0xdd,0xda,0xa3,0x57,0xa4,0x39,0x7a,0x13,0xd4,0xde,},{0x94,0xd2,0x3d,0x97,0x7c,0x33,0xe4,0x9e,0x5e,0x49,0x92,0xc6,0x8f,0x25,0xec,0x99,0xa2,0x7c,0x41,0xce,0x6b,0x91,0xf2,0xbf,0xa0,0xcd,0x82,0x92,0xfe,0x96,0x28,0x35,},{0x3a,0xcd,0x39,0xbe,0xc8,0xc3,0xcd,0x2b,0x44,0x29,0x97,0x22,0xb5,0x85,0x0a,0x04,0x00,0xc1,0x44,0x35,0x90,0xfd,0x48,0x61,0xd5,0x9a,0xae,0x74,0x96,0xac,0xb3,0xdf,0x73,0xfc,0x3f,0xdf,0x79,0x69,0xae,0x5f,0x50,0xba,0x47,0xdd,0xdc,0x43,0x52,0x46,0xe5,0xfd,0x37,0x6f,0x6b,0x89,0x1c,0xd4,0xc2,0xca,0xf5,0xd6,0x14,0xb6,0x17,0x0c,},"\xa9\xa8\xcb\xb0\xad\x58\x51\x24\xe5\x22\xab\xbf\xb4\x05\x33\xbd\xd6\xf4\x93\x47\xb5\x5b\x18\xe8\x55\x8c\xb0"}, +{{0x6a,0x91,0xb3,0x22,0x7c,0x47,0x22,0x99,0x08,0x9b,0xdc,0xe9,0x35,0x6e,0x72,0x6a,0x40,0xef,0xd8,0x40,0xf1,0x10,0x02,0x70,0x8b,0x7e,0xe5,0x5b,0x64,0x10,0x5a,0xc2,},{0x9d,0x08,0x4a,0xa8,0xb9,0x7a,0x6b,0x9b,0xaf,0xa4,0x96,0xdb,0xc6,0xf7,0x6f,0x33,0x06,0xa1,0x16,0xc9,0xd9,0x17,0xe6,0x81,0x52,0x0a,0x0f,0x91,0x43,0x69,0x42,0x7e,},{0xf5,0x87,0x54,0x23,0x78,0x1b,0x66,0x21,0x6c,0xb5,0xe8,0x99,0x8d,0xe5,0xd9,0xff,0xc2,0x9d,0x1d,0x67,0x10,0x70,0x54,0xac,0xe3,0x37,0x45,0x03,0xa9,0xc3,0xef,0x81,0x15,0x77,0xf2,0x69,0xde,0x81,0x29,0x67,0x44,0xbd,0x70,0x6f,0x1a,0xc4,0x78,0xca,0xf0,0x9b,0x54,0xcd,0xf8,0x71,0xb3,0xf8,0x02,0xbd,0x57,0xf9,0xa6,0xcb,0x91,0x01,},"\x5c\xb6\xf9\xaa\x59\xb8\x0e\xca\x14\xf6\xa6\x8f\xb4\x0c\xf0\x7b\x79\x4e\x75\x17\x1f\xba\x96\x26\x2c\x1c\x6a\xdc"}, +{{0x93,0xea,0xa8,0x54,0xd7,0x91,0xf0,0x53,0x72,0xce,0x72,0xb9,0x4f,0xc6,0x50,0x3b,0x2f,0xf8,0xae,0x68,0x19,0xe6,0xa2,0x1a,0xfe,0x82,0x5e,0x27,0xad,0xa9,0xe4,0xfb,},{0x16,0xce,0xe8,0xa3,0xf2,0x63,0x18,0x34,0xc8,0x8b,0x67,0x08,0x97,0xff,0x0b,0x08,0xce,0x90,0xcc,0x14,0x7b,0x45,0x93,0xb3,0xf1,0xf4,0x03,0x72,0x7f,0x7e,0x7a,0xd5,},{0xd8,0x34,0x19,0x7c,0x1a,0x30,0x80,0x61,0x4e,0x0a,0x5f,0xa0,0xaa,0xaa,0x80,0x88,0x24,0xf2,0x1c,0x38,0xd6,0x92,0xe6,0xff,0xbd,0x20,0x0f,0x7d,0xfb,0x3c,0x8f,0x44,0x40,0x2a,0x73,0x82,0x18,0x0b,0x98,0xad,0x0a,0xfc,0x8e,0xec,0x1a,0x02,0xac,0xec,0xf3,0xcb,0x7f,0xde,0x62,0x7b,0x9f,0x18,0x11,0x1f,0x26,0x0a,0xb1,0xdb,0x9a,0x07,},"\x32\xfe\x27\x99\x41\x24\x20\x21\x53\xb5\xc7\x0d\x38\x13\xfd\xee\x9c\x2a\xa6\xe7\xdc\x74\x3d\x4d\x53\x5f\x18\x40\xa5"}, +{{0x94,0x1c,0xac,0x69,0xfb,0x7b,0x18,0x15,0xc5,0x7b,0xb9,0x87,0xc4,0xd6,0xc2,0xad,0x2c,0x35,0xd5,0xf9,0xa3,0x18,0x2a,0x79,0xd4,0xba,0x13,0xea,0xb2,0x53,0xa8,0xad,},{0x23,0xbe,0x32,0x3c,0x56,0x2d,0xfd,0x71,0xce,0x65,0xf5,0xbb,0xa5,0x6a,0x74,0xa3,0xa6,0xdf,0xc3,0x6b,0x57,0x3d,0x2f,0x94,0xf6,0x35,0xc7,0xf9,0xb4,0xfd,0x5a,0x5b,},{0x0f,0x8f,0xad,0x1e,0x6b,0xde,0x77,0x1b,0x4f,0x54,0x20,0xea,0xc7,0x5c,0x37,0x8b,0xae,0x6d,0xb5,0xac,0x66,0x50,0xcd,0x2b,0xc2,0x10,0xc1,0x82,0x3b,0x43,0x2b,0x48,0xe0,0x16,0xb1,0x05,0x95,0x45,0x8f,0xfa,0xb9,0x2f,0x7a,0x89,0x89,0xb2,0x93,0xce,0xb8,0xdf,0xed,0x6c,0x24,0x3a,0x20,0x38,0xfc,0x06,0x65,0x2a,0xaa,0xf1,0x6f,0x02,},"\xbb\x31\x72\x79\x57\x10\xfe\x00\x05\x4d\x3b\x5d\xfe\xf8\xa1\x16\x23\x58\x2d\xa6\x8b\xf8\xe4\x6d\x72\xd2\x7c\xec\xe2\xaa"}, +{{0x1a,0xcd,0xbb,0x79,0x3b,0x03,0x84,0x93,0x46,0x27,0x47,0x0d,0x79,0x5c,0x3d,0x1d,0xd4,0xd7,0x9c,0xea,0x59,0xef,0x98,0x3f,0x29,0x5b,0x9b,0x59,0x17,0x9c,0xbb,0x28,},{0x3f,0x60,0xc7,0x54,0x1a,0xfa,0x76,0xc0,0x19,0xcf,0x5a,0xa8,0x2d,0xcd,0xb0,0x88,0xed,0x9e,0x4e,0xd9,0x78,0x05,0x14,0xae,0xfb,0x37,0x9d,0xab,0xc8,0x44,0xf3,0x1a,},{0xbe,0x71,0xef,0x48,0x06,0xcb,0x04,0x1d,0x88,0x5e,0xff,0xd9,0xe6,0xb0,0xfb,0xb7,0x3d,0x65,0xd7,0xcd,0xec,0x47,0xa8,0x9c,0x8a,0x99,0x48,0x92,0xf4,0xe5,0x5a,0x56,0x8c,0x4c,0xc7,0x8d,0x61,0xf9,0x01,0xe8,0x0d,0xbb,0x62,0x8b,0x86,0xa2,0x3c,0xcd,0x59,0x4e,0x71,0x2b,0x57,0xfa,0x94,0xc2,0xd6,0x7e,0xc2,0x66,0x34,0x87,0x85,0x07,},"\x7c\xf3\x4f\x75\xc3\xda\xc9\xa8\x04\xd0\xfc\xd0\x9e\xba\x9b\x29\xc9\x48\x4e\x8a\x01\x8f\xa9\xe0\x73\x04\x2d\xf8\x8e\x3c\x56"}, +{{0x8e,0xd7,0xa7,0x97,0xb9,0xce,0xa8,0xa8,0x37,0x0d,0x41,0x91,0x36,0xbc,0xdf,0x68,0x3b,0x75,0x9d,0x2e,0x3c,0x69,0x47,0xf1,0x7e,0x13,0xe2,0x48,0x5a,0xa9,0xd4,0x20,},{0xb4,0x9f,0x3a,0x78,0xb1,0xc6,0xa7,0xfc,0xa8,0xf3,0x46,0x6f,0x33,0xbc,0x0e,0x92,0x9f,0x01,0xfb,0xa0,0x43,0x06,0xc2,0xa7,0x46,0x5f,0x46,0xc3,0x75,0x93,0x16,0xd9,},{0x04,0x26,0x6c,0x03,0x3b,0x91,0xc1,0x32,0x2c,0xeb,0x34,0x46,0xc9,0x01,0xff,0xcf,0x3c,0xc4,0x0c,0x40,0x34,0xe8,0x87,0xc9,0x59,0x7c,0xa1,0x89,0x3b,0xa7,0x33,0x0b,0xec,0xbb,0xd8,0xb4,0x81,0x42,0xef,0x35,0xc0,0x12,0xc6,0xba,0x51,0xa6,0x6d,0xf9,0x30,0x8c,0xb6,0x26,0x8a,0xd6,0xb1,0xe4,0xb0,0x3e,0x70,0x10,0x24,0x95,0x79,0x0b,},"\xa7\x50\xc2\x32\x93\x3d\xc1\x4b\x11\x84\xd8\x6d\x8b\x4c\xe7\x2e\x16\xd6\x97\x44\xba\x69\x81\x8b\x6a\xc3\x3b\x1d\x82\x3b\xb2\xc3"}, +{{0xf2,0xab,0x39,0x6f,0xe8,0x90,0x6e,0x3e,0x56,0x33,0xe9,0x9c,0xab,0xcd,0x5b,0x09,0xdf,0x08,0x59,0xb5,0x16,0x23,0x0b,0x1e,0x04,0x50,0xb5,0x80,0xb6,0x5f,0x61,0x6c,},{0x8e,0xa0,0x74,0x24,0x51,0x59,0xa1,0x16,0xaa,0x71,0x22,0xa2,0x5e,0xc1,0x6b,0x89,0x1d,0x62,0x5a,0x68,0xf3,0x36,0x60,0x42,0x39,0x08,0xf6,0xbd,0xc4,0x4f,0x8c,0x1b,},{0xa0,0x6a,0x23,0xd9,0x82,0xd8,0x1a,0xb8,0x83,0xaa,0xe2,0x30,0xad,0xbc,0x36,0x8a,0x6a,0x99,0x77,0xf0,0x03,0xce,0xbb,0x00,0xd4,0xc2,0xe4,0x01,0x84,0x90,0x19,0x1a,0x84,0xd3,0xa2,0x82,0xfd,0xbf,0xb2,0xfc,0x88,0x04,0x6e,0x62,0xde,0x43,0xe1,0x5f,0xb5,0x75,0x33,0x6b,0x3c,0x8b,0x77,0xd1,0x9c,0xe6,0xa0,0x09,0xce,0x51,0xf5,0x0c,},"\x5a\x44\xe3\x4b\x74\x6c\x5f\xd1\x89\x8d\x55\x2a\xb3\x54\xd2\x8f\xb4\x71\x38\x56\xd7\x69\x7d\xd6\x3e\xb9\xbd\x6b\x99\xc2\x80\xe1\x87"}, +{{0x55,0x0a,0x41,0xc0,0x13,0xf7,0x9b,0xab,0x8f,0x06,0xe4,0x3a,0xd1,0x83,0x6d,0x51,0x31,0x27,0x36,0xa9,0x71,0x38,0x06,0xfa,0xfe,0x66,0x45,0x21,0x9e,0xaa,0x1f,0x9d,},{0xaf,0x6b,0x71,0x45,0x47,0x4d,0xc9,0x95,0x4b,0x9a,0xf9,0x3a,0x9c,0xdb,0x34,0x44,0x9d,0x5b,0x7c,0x65,0x1c,0x82,0x4d,0x24,0xe2,0x30,0xb9,0x00,0x33,0xce,0x59,0xc0,},{0x16,0xdc,0x1e,0x2b,0x9f,0xa9,0x09,0xee,0xfd,0xc2,0x77,0xba,0x16,0xeb,0xe2,0x07,0xb8,0xda,0x5e,0x91,0x14,0x3c,0xde,0x78,0xc5,0x04,0x7a,0x89,0xf6,0x81,0xc3,0x3c,0x4e,0x4e,0x34,0x28,0xd5,0xc9,0x28,0x09,0x59,0x03,0xa8,0x11,0xec,0x00,0x2d,0x52,0xa3,0x9e,0xd7,0xf8,0xb3,0xfe,0x19,0x27,0x20,0x0c,0x6d,0xd0,0xb9,0xab,0x3e,0x04,},"\x8b\xc4\x18\x5e\x50\xe5\x7d\x5f\x87\xf4\x75\x15\xfe\x2b\x18\x37\xd5\x85\xf0\xaa\xe9\xe1\xca\x38\x3b\x3e\xc9\x08\x88\x4b\xb9\x00\xff\x27"}, +{{0x19,0xac,0x3e,0x27,0x24,0x38,0xc7,0x2d,0xdf,0x7b,0x88,0x19,0x64,0x86,0x7c,0xb3,0xb3,0x1f,0xf4,0xc7,0x93,0xbb,0x7e,0xa1,0x54,0x61,0x3c,0x1d,0xb0,0x68,0xcb,0x7e,},{0xf8,0x5b,0x80,0xe0,0x50,0xa1,0xb9,0x62,0x0d,0xb1,0x38,0xbf,0xc9,0xe1,0x00,0x32,0x7e,0x25,0xc2,0x57,0xc5,0x92,0x17,0xb6,0x01,0xf1,0xf6,0xac,0x9a,0x41,0x3d,0x3f,},{0xea,0x85,0x5d,0x78,0x1c,0xbe,0xa4,0x68,0x2e,0x35,0x01,0x73,0xcb,0x89,0xe8,0x61,0x9c,0xcf,0xdd,0xb9,0x7c,0xdc,0xe1,0x6f,0x9a,0x2f,0x6f,0x68,0x92,0xf4,0x6d,0xbe,0x68,0xe0,0x4b,0x12,0xb8,0xd8,0x86,0x89,0xa7,0xa3,0x16,0x70,0xcd,0xff,0x40,0x9a,0xf9,0x8a,0x93,0xb4,0x9a,0x34,0x53,0x7b,0x6a,0xa0,0x09,0xd2,0xeb,0x8b,0x47,0x01,},"\x95\x87\x2d\x5f\x78\x9f\x95\x48\x4e\x30\xcb\xb0\xe1\x14\x02\x89\x53\xb1\x6f\x5c\x6a\x8d\x9f\x65\xc0\x03\xa8\x35\x43\xbe\xaa\x46\xb3\x86\x45"}, +{{0xca,0x26,0x7d,0xe9,0x6c,0x93,0xc2,0x38,0xfa,0xfb,0x12,0x79,0x81,0x20,0x59,0xab,0x93,0xac,0x03,0x05,0x96,0x57,0xfd,0x99,0x4f,0x8f,0xa5,0xa0,0x92,0x39,0xc8,0x21,},{0x01,0x73,0x70,0xc8,0x79,0x09,0x0a,0x81,0xc7,0xf2,0x72,0xc2,0xfc,0x80,0xe3,0xaa,0xc2,0xbc,0x60,0x3f,0xcb,0x37,0x9a,0xfc,0x98,0x69,0x11,0x60,0xab,0x74,0x5b,0x26,},{0xac,0x95,0x7f,0x82,0x33,0x5a,0xa7,0x14,0x1e,0x96,0xb5,0x9d,0x63,0xe3,0xcc,0xee,0x95,0xc3,0xa2,0xc4,0x7d,0x02,0x65,0x40,0xc2,0xaf,0x42,0xdc,0x95,0x33,0xd5,0xfd,0x81,0x82,0x7d,0x16,0x79,0xad,0x18,0x7a,0xea,0xf3,0x78,0x34,0x91,0x5e,0x75,0xb1,0x47,0xa9,0x28,0x68,0x06,0xc8,0x01,0x75,0x16,0xba,0x43,0xdd,0x05,0x1a,0x5e,0x0c,},"\xe0\x5f\x71\xe4\xe4\x9a\x72\xec\x55\x0c\x44\xa3\xb8\x5a\xca\x8f\x20\xff\x26\xc3\xee\x94\xa8\x0f\x1b\x43\x1c\x7d\x15\x4e\xc9\x60\x3e\xe0\x25\x31"}, +{{0x3d,0xff,0x5e,0x89,0x94,0x75,0xe7,0xe9,0x1d,0xd2,0x61,0x32,0x2f,0xab,0x09,0x98,0x0c,0x52,0x97,0x0d,0xe1,0xda,0x6e,0x2e,0x20,0x16,0x60,0xcc,0x4f,0xce,0x70,0x32,},{0xf3,0x01,0x62,0xba,0xc9,0x84,0x47,0xc4,0x04,0x2f,0xac,0x05,0xda,0x44,0x80,0x34,0x62,0x9b,0xe2,0xc6,0xa5,0x8d,0x30,0xdf,0xd5,0x78,0xba,0x9f,0xb5,0xe3,0x93,0x0b,},{0x5e,0xfe,0x7a,0x92,0xff,0x96,0x23,0x08,0x9b,0x3e,0x3b,0x78,0xf3,0x52,0x11,0x53,0x66,0xe2,0x6b,0xa3,0xfb,0x1a,0x41,0x62,0x09,0xbc,0x02,0x9e,0x9c,0xad,0xcc,0xd9,0xf4,0xaf,0xfa,0x33,0x35,0x55,0xa8,0xf3,0xa3,0x5a,0x9d,0x0f,0x7c,0x34,0xb2,0x92,0xca,0xe7,0x7e,0xc9,0x6f,0xa3,0xad,0xfc,0xaa,0xde,0xe2,0xd9,0xce,0xd8,0xf8,0x05,},"\x93\x8f\x0e\x77\x62\x1b\xf3\xea\x52\xc7\xc4\x91\x1c\x51\x57\xc2\xd8\xa2\xa8\x58\x09\x3e\xf1\x6a\xa9\xb1\x07\xe6\x9d\x98\x03\x7b\xa1\x39\xa3\xc3\x82"}, +{{0x9a,0x6b,0x84,0x78,0x64,0xe7,0x0c,0xfe,0x8b,0xa6,0xab,0x22,0xfa,0x0c,0xa3,0x08,0xc0,0xcc,0x8b,0xec,0x71,0x41,0xfb,0xca,0xa3,0xb8,0x1f,0x5d,0x1e,0x1c,0xfc,0xfc,},{0x34,0xad,0x0f,0xbd,0xb2,0x56,0x65,0x07,0xa8,0x1c,0x2b,0x1f,0x8a,0xa8,0xf5,0x3d,0xcc,0xaa,0x64,0xcc,0x87,0xad,0xa9,0x1b,0x90,0x3e,0x90,0x0d,0x07,0xee,0xe9,0x30,},{0x2a,0xb2,0x55,0x16,0x9c,0x48,0x9c,0x54,0xc7,0x32,0x23,0x2e,0x37,0xc8,0x73,0x49,0xd4,0x86,0xb1,0xeb,0xa2,0x05,0x09,0xdb,0xab,0xe7,0xfe,0xd3,0x29,0xef,0x08,0xfd,0x75,0xba,0x1c,0xd1,0x45,0xe6,0x7b,0x2e,0xa2,0x6c,0xb5,0xcc,0x51,0xca,0xb3,0x43,0xee,0xb0,0x85,0xfe,0x1f,0xd7,0xb0,0xec,0x4c,0x6a,0xfc,0xd9,0xb9,0x79,0xf9,0x05,},"\x83\x83\x67\x47\x11\x83\xc7\x1f\x7e\x71\x77\x24\xf8\x9d\x40\x1c\x3a\xd9\x86\x3f\xd9\xcc\x7a\xa3\xcf\x33\xd3\xc5\x29\x86\x0c\xb5\x81\xf3\x09\x3d\x87\xda"}, +{{0x57,0x5b,0xe0,0x7a,0xfc,0xa5,0xd0,0x63,0xc2,0x38,0xcd,0x9b,0x80,0x28,0x77,0x2c,0xc4,0x9c,0xda,0x34,0x47,0x14,0x32,0xa2,0xe1,0x66,0xe0,0x96,0xe2,0x21,0x9e,0xfc,},{0x94,0xe5,0xeb,0x4d,0x50,0x24,0xf4,0x9d,0x7e,0xbf,0x79,0x81,0x7c,0x8d,0xe1,0x14,0x97,0xdc,0x2b,0x55,0x62,0x2a,0x51,0xae,0x12,0x3f,0xfc,0x74,0x9d,0xbb,0x16,0xe0,},{0x58,0x27,0x1d,0x44,0x23,0x6f,0x3b,0x98,0xc5,0x8f,0xd7,0xae,0x0d,0x2f,0x49,0xef,0x2b,0x6e,0x3a,0xff,0xdb,0x22,0x5a,0xa3,0xba,0x55,0x5f,0x0e,0x11,0xcc,0x53,0xc2,0x3a,0xd1,0x9b,0xaf,0x24,0x34,0x65,0x90,0xd0,0x5d,0x7d,0x53,0x90,0x58,0x20,0x82,0xcf,0x94,0xd3,0x9c,0xad,0x65,0x30,0xab,0x93,0xd1,0x3e,0xfb,0x39,0x27,0x95,0x06,},"\x33\xe5\x91\x8b\x66\xd3\x3d\x55\xfe\x71\x7c\xa3\x43\x83\xea\xe7\x8f\x0a\xf8\x28\x89\xca\xf6\x69\x6e\x1a\xc9\xd9\x5d\x1f\xfb\x32\xcb\xa7\x55\xf9\xe3\x50\x3e"}, +{{0x15,0xff,0xb4,0x55,0x14,0xd4,0x34,0x44,0xd6,0x1f,0xcb,0x10,0x5e,0x30,0xe1,0x35,0xfd,0x26,0x85,0x23,0xdd,0xa2,0x0b,0x82,0x75,0x8b,0x17,0x94,0x23,0x11,0x04,0x41,},{0x17,0x72,0xc5,0xab,0xc2,0xd2,0x3f,0xd2,0xf9,0xd1,0xc3,0x25,0x7b,0xe7,0xbc,0x3c,0x1c,0xd7,0x9c,0xee,0x40,0x84,0x4b,0x74,0x9b,0x3a,0x77,0x43,0xd2,0xf9,0x64,0xb8,},{0x68,0x28,0xcd,0x76,0x24,0xe7,0x93,0xb8,0xa4,0xce,0xb9,0x6d,0x3c,0x2a,0x97,0x5b,0xf7,0x73,0xe5,0xff,0x66,0x45,0xf3,0x53,0x61,0x40,0x58,0x62,0x1e,0x58,0x83,0x52,0x89,0xe7,0xf3,0x1f,0x42,0xdf,0xe6,0xaf,0x6d,0x73,0x6f,0x26,0x44,0x51,0x1e,0x32,0x0c,0x0f,0xa6,0x98,0x58,0x2a,0x79,0x77,0x8d,0x18,0x73,0x0e,0xd3,0xe8,0xcb,0x08,},"\xda\x9c\x55\x59\xd0\xea\x51\xd2\x55\xb6\xbd\x9d\x76\x38\xb8\x76\x47\x2f\x94\x2b\x33\x0f\xc0\xe2\xb3\x0a\xea\x68\xd7\x73\x68\xfc\xe4\x94\x82\x72\x99\x1d\x25\x7e"}, +{{0xfe,0x05,0x68,0x64,0x29,0x43,0xb2,0xe1,0xaf,0xbf,0xd1,0xf1,0x0f,0xe8,0xdf,0x87,0xa4,0x23,0x6b,0xea,0x40,0xdc,0xe7,0x42,0x07,0x2c,0xb2,0x18,0x86,0xee,0xc1,0xfa,},{0x29,0x9e,0xbd,0x1f,0x13,0x17,0x7d,0xbd,0xb6,0x6a,0x91,0x2b,0xbf,0x71,0x20,0x38,0xfd,0xf7,0x3b,0x06,0xc3,0xac,0x02,0x0c,0x7b,0x19,0x12,0x67,0x55,0xd4,0x7f,0x61,},{0xd5,0x9e,0x6d,0xfc,0xc6,0xd7,0xe3,0xe2,0xc5,0x8d,0xec,0x81,0xe9,0x85,0xd2,0x45,0xe6,0x81,0xac,0xf6,0x59,0x4a,0x23,0xc5,0x92,0x14,0xf7,0xbe,0xd8,0x01,0x5d,0x81,0x3c,0x76,0x82,0xb6,0x0b,0x35,0x83,0x44,0x03,0x11,0xe7,0x2a,0x86,0x65,0xba,0x2c,0x96,0xde,0xc2,0x3c,0xe8,0x26,0xe1,0x60,0x12,0x7e,0x18,0x13,0x2b,0x03,0x04,0x04,},"\xc5\x9d\x08\x62\xec\x1c\x97\x46\xab\xcc\x3c\xf8\x3c\x9e\xeb\xa2\xc7\x08\x2a\x03\x6a\x8c\xb5\x7c\xe4\x87\xe7\x63\x49\x27\x96\xd4\x7e\x6e\x06\x3a\x0c\x1f\xec\xcc\x2d"}, +{{0x5e,0xcb,0x16,0xc2,0xdf,0x27,0xc8,0xcf,0x58,0xe4,0x36,0xa9,0xd3,0xaf,0xfb,0xd5,0x8e,0x95,0x38,0xa9,0x26,0x59,0xa0,0xf9,0x7c,0x4c,0x4f,0x99,0x46,0x35,0xa8,0xca,},{0xda,0x76,0x8b,0x20,0xc4,0x37,0xdd,0x3a,0xa5,0xf8,0x4b,0xb6,0xa0,0x77,0xff,0xa3,0x4a,0xb6,0x85,0x01,0xc5,0x35,0x2b,0x5c,0xc3,0xfd,0xce,0x7f,0xe6,0xc2,0x39,0x8d,},{0x1c,0x72,0x3a,0x20,0xc6,0x77,0x24,0x26,0xa6,0x70,0xe4,0xd5,0xc4,0xa9,0x7c,0x6e,0xbe,0x91,0x47,0xf7,0x1b,0xb0,0xa4,0x15,0x63,0x1e,0x44,0x40,0x6e,0x29,0x03,0x22,0xe4,0xca,0x97,0x7d,0x34,0x8f,0xe7,0x85,0x6a,0x8e,0xdc,0x23,0x5d,0x0f,0xe9,0x5f,0x7e,0xd9,0x1a,0xef,0xdd,0xf2,0x8a,0x77,0xe2,0xc7,0xdb,0xfd,0x8f,0x55,0x2f,0x0a,},"\x56\xf1\x32\x9d\x9a\x6b\xe2\x5a\x61\x59\xc7\x2f\x12\x68\x8d\xc8\x31\x4e\x85\xdd\x9e\x7e\x4d\xc0\x5b\xbe\xcb\x77\x29\xe0\x23\xc8\x6f\x8e\x09\x37\x35\x3f\x27\xc7\xed\xe9"}, +{{0xd5,0x99,0xd6,0x37,0xb3,0xc3,0x0a,0x82,0xa9,0x98,0x4e,0x2f,0x75,0x84,0x97,0xd1,0x44,0xde,0x6f,0x06,0xb9,0xfb,0xa0,0x4d,0xd4,0x0f,0xd9,0x49,0x03,0x9d,0x7c,0x84,},{0x67,0x91,0xd8,0xce,0x50,0xa4,0x46,0x89,0xfc,0x17,0x87,0x27,0xc5,0xc3,0xa1,0xc9,0x59,0xfb,0xee,0xd7,0x4e,0xf7,0xd8,0xe7,0xbd,0x3c,0x1a,0xb4,0xda,0x31,0xc5,0x1f,},{0xeb,0xf1,0x0d,0x9a,0xc7,0xc9,0x61,0x08,0x14,0x0e,0x7d,0xef,0x6f,0xe9,0x53,0x3d,0x72,0x76,0x46,0xff,0x5b,0x3a,0xf2,0x73,0xc1,0xdf,0x95,0x76,0x2a,0x66,0xf3,0x2b,0x65,0xa0,0x96,0x34,0xd0,0x13,0xf5,0x4b,0x5d,0xd6,0x01,0x1f,0x91,0xbc,0x33,0x6c,0xa8,0xb3,0x55,0xce,0x33,0xf8,0xcf,0xbe,0xc2,0x53,0x5a,0x4c,0x42,0x7f,0x82,0x05,},"\xa7\xc0\x4e\x8b\xa7\x5d\x0a\x03\xd8\xb1\x66\xad\x7a\x1d\x77\xe1\xb9\x1c\x7a\xaf\x7b\xef\xdd\x99\x31\x1f\xc3\xc5\x4a\x68\x4d\xdd\x97\x1d\x5b\x32\x11\xc3\xee\xaf\xf1\xe5\x4e"}, +{{0x30,0xab,0x82,0x32,0xfa,0x70,0x18,0xf0,0xce,0x6c,0x39,0xbd,0x8f,0x78,0x2f,0xe2,0xe1,0x59,0x75,0x8b,0xb0,0xf2,0xf4,0x38,0x6c,0x7f,0x28,0xcf,0xd2,0xc8,0x58,0x98,},{0xec,0xfb,0x6a,0x2b,0xd4,0x2f,0x31,0xb6,0x12,0x50,0xba,0x5d,0xe7,0xe4,0x6b,0x47,0x19,0xaf,0xdf,0xbc,0x66,0x0d,0xb7,0x1a,0x7b,0xd1,0xdf,0x7b,0x0a,0x3a,0xbe,0x37,},{0x9a,0xf8,0x85,0x34,0x4c,0xc7,0x23,0x94,0x98,0xf7,0x12,0xdf,0x80,0xbc,0x01,0xb8,0x06,0x38,0x29,0x1e,0xd4,0xa1,0xd2,0x8b,0xaa,0x55,0x45,0x01,0x7a,0x72,0xe2,0xf6,0x56,0x49,0xcc,0xf9,0x60,0x3d,0xa6,0xeb,0x5b,0xfa,0xb9,0xf5,0x54,0x3a,0x6c,0xa4,0xa7,0xaf,0x38,0x66,0x15,0x3c,0x76,0xbf,0x66,0xbf,0x95,0xde,0xf6,0x15,0xb0,0x0c,},"\x63\xb8\x0b\x79\x56\xac\xbe\xcf\x0c\x35\xe9\xab\x06\xb9\x14\xb0\xc7\x01\x4f\xe1\xa4\xbb\xc0\x21\x72\x40\xc1\xa3\x30\x95\xd7\x07\x95\x3e\xd7\x7b\x15\xd2\x11\xad\xaf\x9b\x97\xdc"}, +{{0x0d,0xdc,0xdc,0x87,0x2c,0x7b,0x74,0x8d,0x40,0xef,0xe9,0x6c,0x28,0x81,0xae,0x18,0x9d,0x87,0xf5,0x61,0x48,0xed,0x8a,0xf3,0xeb,0xbb,0xc8,0x03,0x24,0xe3,0x8b,0xdd,},{0x58,0x8d,0xda,0xdc,0xbc,0xed,0xf4,0x0d,0xf0,0xe9,0x69,0x7d,0x8b,0xb2,0x77,0xc7,0xbb,0x14,0x98,0xfa,0x1d,0x26,0xce,0x0a,0x83,0x5a,0x76,0x0b,0x92,0xca,0x7c,0x85,},{0xc1,0x79,0xc0,0x94,0x56,0xe2,0x35,0xfe,0x24,0x10,0x5a,0xfa,0x6e,0x8e,0xc0,0x46,0x37,0xf8,0xf9,0x43,0x81,0x7c,0xd0,0x98,0xba,0x95,0x38,0x7f,0x96,0x53,0xb2,0xad,0xd1,0x81,0xa3,0x14,0x47,0xd9,0x2d,0x1a,0x1d,0xdf,0x1c,0xeb,0x0d,0xb6,0x21,0x18,0xde,0x9d,0xff,0xb7,0xdc,0xd2,0x42,0x40,0x57,0xcb,0xdf,0xf5,0xd4,0x1d,0x04,0x03,},"\x65\x64\x1c\xd4\x02\xad\xd8\xbf\x3d\x1d\x67\xdb\xeb\x6d\x41\xde\xbf\xbe\xf6\x7e\x43\x17\xc3\x5b\x0a\x6d\x5b\xbb\xae\x0e\x03\x4d\xe7\xd6\x70\xba\x14\x13\xd0\x56\xf2\xd6\xf1\xde\x12"}, +{{0x89,0xf0,0xd6,0x82,0x99,0xba,0x0a,0x5a,0x83,0xf2,0x48,0xae,0x0c,0x16,0x9f,0x8e,0x38,0x49,0xa9,0xb4,0x7b,0xd4,0x54,0x98,0x84,0x30,0x5c,0x99,0x12,0xb4,0x66,0x03,},{0xab,0xa3,0xe7,0x95,0xaa,0xb2,0x01,0x2a,0xcc,0xea,0xdd,0x7b,0x3b,0xd9,0xda,0xee,0xed,0x6f,0xf5,0x25,0x8b,0xdc,0xd7,0xc9,0x36,0x99,0xc2,0xa3,0x83,0x6e,0x38,0x32,},{0x2c,0x69,0x1f,0xa8,0xd4,0x87,0xce,0x20,0xd5,0xd2,0xfa,0x41,0x55,0x91,0x16,0xe0,0xbb,0xf4,0x39,0x7c,0xf5,0x24,0x0e,0x15,0x25,0x56,0x18,0x35,0x41,0xd6,0x6c,0xf7,0x53,0x58,0x24,0x01,0xa4,0x38,0x8d,0x39,0x03,0x39,0xdb,0xef,0x4d,0x38,0x47,0x43,0xca,0xa3,0x46,0xf5,0x5f,0x8d,0xab,0xa6,0x8b,0xa7,0xb9,0x13,0x1a,0x8a,0x6e,0x0b,},"\x4f\x18\x46\xdd\x7a\xd5\x0e\x54\x5d\x4c\xfb\xff\xbb\x1d\xc2\xff\x14\x5d\xc1\x23\x75\x4d\x08\xaf\x4e\x44\xec\xc0\xbc\x8c\x91\x41\x13\x88\xbc\x76\x53\xe2\xd8\x93\xd1\xea\xc2\x10\x7d\x05"}, +{{0x0a,0x3c,0x18,0x44,0xe2,0xdb,0x07,0x0f,0xb2,0x4e,0x3c,0x95,0xcb,0x1c,0xc6,0x71,0x4e,0xf8,0x4e,0x2c,0xcd,0x2b,0x9d,0xd2,0xf1,0x46,0x0e,0xbf,0x7e,0xcf,0x13,0xb1,},{0x72,0xe4,0x09,0x93,0x7e,0x06,0x10,0xeb,0x5c,0x20,0xb3,0x26,0xdc,0x6e,0xa1,0xbb,0xbc,0x04,0x06,0x70,0x1c,0x5c,0xd6,0x7d,0x1f,0xbd,0xe0,0x91,0x92,0xb0,0x7c,0x01,},{0x87,0xf7,0xfd,0xf4,0x60,0x95,0x20,0x1e,0x87,0x7a,0x58,0x8f,0xe3,0xe5,0xaa,0xf4,0x76,0xbd,0x63,0x13,0x8d,0x8a,0x87,0x8b,0x89,0xd6,0xac,0x60,0x63,0x1b,0x34,0x58,0xb9,0xd4,0x1a,0x3c,0x61,0xa5,0x88,0xe1,0xdb,0x8d,0x29,0xa5,0x96,0x89,0x81,0xb0,0x18,0x77,0x6c,0x58,0x87,0x80,0x92,0x2f,0x5a,0xa7,0x32,0xba,0x63,0x79,0xdd,0x05,},"\x4c\x82\x74\xd0\xed\x1f\x74\xe2\xc8\x6c\x08\xd9\x55\xbd\xe5\x5b\x2d\x54\x32\x7e\x82\x06\x2a\x1f\x71\xf7\x0d\x53\x6f\xdc\x87\x22\xcd\xea\xd7\xd2\x2a\xae\xad\x2b\xfa\xa1\xad\x00\xb8\x29\x57"}, +{{0xc8,0xd7,0xa8,0x81,0x8b,0x98,0xdf,0xdb,0x20,0x83,0x9c,0x87,0x1c,0xb5,0xc4,0x8e,0x9e,0x94,0x70,0xca,0x3a,0xd3,0x5b,0xa2,0x61,0x3a,0x5d,0x31,0x99,0xc8,0xab,0x23,},{0x90,0xd2,0xef,0xbb,0xa4,0xd4,0x3e,0x6b,0x2b,0x99,0x2c,0xa1,0x60,0x83,0xdb,0xcf,0xa2,0xb3,0x22,0x38,0x39,0x07,0xb0,0xee,0x75,0xf3,0xe9,0x58,0x45,0xd3,0xc4,0x7f,},{0xfa,0x2e,0x99,0x44,0x21,0xae,0xf1,0xd5,0x85,0x66,0x74,0x81,0x3d,0x05,0xcb,0xd2,0xcf,0x84,0xef,0x5e,0xb4,0x24,0xaf,0x6e,0xcd,0x0d,0xc6,0xfd,0xbd,0xc2,0xfe,0x60,0x5f,0xe9,0x85,0x88,0x33,0x12,0xec,0xf3,0x4f,0x59,0xbf,0xb2,0xf1,0xc9,0x14,0x9e,0x5b,0x9c,0xc9,0xec,0xda,0x05,0xb2,0x73,0x11,0x30,0xf3,0xed,0x28,0xdd,0xae,0x0b,},"\x78\x3e\x33\xc3\xac\xbd\xbb\x36\xe8\x19\xf5\x44\xa7\x78\x1d\x83\xfc\x28\x3d\x33\x09\xf5\xd3\xd1\x2c\x8d\xcd\x6b\x0b\x3d\x0e\x89\xe3\x8c\xfd\x3b\x4d\x08\x85\x66\x1c\xa5\x47\xfb\x97\x64\xab\xff"}, +{{0xb4,0x82,0x70,0x36,0x12,0xd0,0xc5,0x86,0xf7,0x6c,0xfc,0xb2,0x1c,0xfd,0x21,0x03,0xc9,0x57,0x25,0x15,0x04,0xa8,0xc0,0xac,0x4c,0x86,0xc9,0xc6,0xf3,0xe4,0x29,0xff,},{0xfd,0x71,0x1d,0xc7,0xdd,0x3b,0x1d,0xfb,0x9d,0xf9,0x70,0x4b,0xe3,0xe6,0xb2,0x6f,0x58,0x7f,0xe7,0xdd,0x7b,0xa4,0x56,0xa9,0x1b,0xa4,0x3f,0xe5,0x1a,0xec,0x09,0xad,},{0x58,0x83,0x2b,0xde,0xb2,0x6f,0xea,0xfc,0x31,0xb4,0x62,0x77,0xcf,0x3f,0xb5,0xd7,0xa1,0x7d,0xfb,0x7c,0xcd,0x9b,0x1f,0x58,0xec,0xbe,0x6f,0xeb,0x97,0x96,0x66,0x82,0x8f,0x23,0x9b,0xa4,0xd7,0x52,0x19,0x26,0x0e,0xca,0xc0,0xac,0xf4,0x0f,0x0e,0x5e,0x25,0x90,0xf4,0xca,0xa1,0x6b,0xbb,0xcd,0x8a,0x15,0x5d,0x34,0x79,0x67,0xa6,0x07,},"\x29\xd7\x7a\xcf\xd9\x9c\x7a\x00\x70\xa8\x8f\xeb\x62\x47\xa2\xbc\xe9\x98\x4f\xe3\xe6\xfb\xf1\x9d\x40\x45\x04\x2a\x21\xab\x26\xcb\xd7\x71\xe1\x84\xa9\xa7\x5f\x31\x6b\x64\x8c\x69\x20\xdb\x92\xb8\x7b"}, +{{0x84,0xe5,0x0d,0xd9,0xa0,0xf1,0x97,0xe3,0x89,0x3c,0x38,0xdb,0xd9,0x1f,0xaf,0xc3,0x44,0xc1,0x77,0x6d,0x3a,0x40,0x0e,0x2f,0x0f,0x0e,0xe7,0xaa,0x82,0x9e,0xb8,0xa2,},{0x2c,0x50,0xf8,0x70,0xee,0x48,0xb3,0x6b,0x0a,0xc2,0xf8,0xa5,0xf3,0x36,0xfb,0x09,0x0b,0x11,0x30,0x50,0xdb,0xcc,0x25,0xe0,0x78,0x20,0x0a,0x6e,0x16,0x15,0x3e,0xea,},{0x69,0xe6,0xa4,0x49,0x1a,0x63,0x83,0x73,0x16,0xe8,0x6a,0x5f,0x4b,0xa7,0xcd,0x0d,0x73,0x1e,0xcc,0x58,0xf1,0xd0,0xa2,0x64,0xc6,0x7c,0x89,0xbe,0xfd,0xd8,0xd3,0x82,0x9d,0x8d,0xe1,0x3b,0x33,0xcc,0x0b,0xf5,0x13,0x93,0x17,0x15,0xc7,0x80,0x96,0x57,0xe2,0xbf,0xb9,0x60,0xe5,0xc7,0x64,0xc9,0x71,0xd7,0x33,0x74,0x60,0x93,0xe5,0x00,},"\xf3\x99\x2c\xde\x64\x93\xe6\x71\xf1\xe1\x29\xdd\xca\x80\x38\xb0\xab\xdb\x77\xbb\x90\x35\xf9\xf8\xbe\x54\xbd\x5d\x68\xc1\xae\xff\x72\x4f\xf4\x7d\x29\x34\x43\x91\xdc\x53\x61\x66\xb8\x67\x1c\xbb\xf1\x23"}, +{{0xb3,0x22,0xd4,0x65,0x77,0xa2,0xa9,0x91,0xa4,0xd1,0x69,0x82,0x87,0x83,0x2a,0x39,0xc4,0x87,0xef,0x77,0x6b,0x4b,0xff,0x03,0x7a,0x05,0xc7,0xf1,0x81,0x2b,0xde,0xec,},{0xeb,0x2b,0xca,0xdf,0xd3,0xee,0xc2,0x98,0x6b,0xaf,0xf3,0x2b,0x98,0xe7,0xc4,0xdb,0xf0,0x3f,0xf9,0x5d,0x8a,0xd5,0xff,0x9a,0xa9,0x50,0x6e,0x54,0x72,0xff,0x84,0x5f,},{0xc7,0xb5,0x51,0x37,0x31,0x7c,0xa2,0x1e,0x33,0x48,0x9f,0xf6,0xa9,0xbf,0xab,0x97,0xc8,0x55,0xdc,0x6f,0x85,0x68,0x4a,0x70,0xa9,0x12,0x5a,0x26,0x1b,0x56,0xd5,0xe6,0xf1,0x49,0xc5,0x77,0x4d,0x73,0x4f,0x2d,0x8d,0xeb,0xfc,0x77,0xb7,0x21,0x89,0x6a,0x82,0x67,0xc2,0x37,0x68,0xe9,0xba,0xdb,0x91,0x0e,0xef,0x83,0xec,0x25,0x88,0x02,},"\x19\xf1\xbf\x5d\xcf\x17\x50\xc6\x11\xf1\xc4\xa2\x86\x52\x00\x50\x4d\x82\x29\x8e\xdd\x72\x67\x1f\x62\xa7\xb1\x47\x1a\xc3\xd4\xa3\x0f\x7d\xe9\xe5\xda\x41\x08\xc5\x2a\x4c\xe7\x0a\x3e\x11\x4a\x52\xa3\xb3\xc5"}, +{{0x96,0x0c,0xab,0x50,0x34,0xb9,0x83,0x8d,0x09,0x8d,0x2d,0xcb,0xf4,0x36,0x4b,0xec,0x16,0xd3,0x88,0xf6,0x37,0x6d,0x73,0xa6,0x27,0x3b,0x70,0xf8,0x2b,0xbc,0x98,0xc0,},{0x5e,0x3c,0x19,0xf2,0x41,0x5a,0xcf,0x72,0x9f,0x82,0x9a,0x4e,0xbd,0x5c,0x40,0xe1,0xa6,0xbc,0x9f,0xbc,0xa9,0x57,0x03,0xa9,0x37,0x60,0x87,0xed,0x09,0x37,0xe5,0x1a,},{0x27,0xd4,0xc3,0xa1,0x81,0x1e,0xf9,0xd4,0x36,0x0b,0x3b,0xdd,0x13,0x3c,0x2c,0xcc,0x30,0xd0,0x2c,0x2f,0x24,0x82,0x15,0x77,0x6c,0xb0,0x7e,0xe4,0x17,0x7f,0x9b,0x13,0xfc,0x42,0xdd,0x70,0xa6,0xc2,0xfe,0xd8,0xf2,0x25,0xc7,0x66,0x3c,0x7f,0x18,0x2e,0x7e,0xe8,0xec,0xcf,0xf2,0x0d,0xc7,0xb0,0xe1,0xd5,0x83,0x4e,0xc5,0xb1,0xea,0x01,},"\xf8\xb2\x19\x62\x44\x7b\x0a\x8f\x2e\x42\x79\xde\x41\x1b\xea\x12\x8e\x0b\xe4\x4b\x69\x15\xe6\xcd\xa8\x83\x41\xa6\x8a\x0d\x81\x83\x57\xdb\x93\x8e\xac\x73\xe0\xaf\x6d\x31\x20\x6b\x39\x48\xf8\xc4\x8a\x44\x73\x08"}, +{{0xeb,0x77,0xb2,0x63,0x8f,0x23,0xee,0xbc,0x82,0xef,0xe4,0x5e,0xe9,0xe5,0xa0,0x32,0x66,0x37,0x40,0x1e,0x66,0x3e,0xd0,0x29,0x69,0x9b,0x21,0xe6,0x44,0x3f,0xb4,0x8e,},{0x9e,0xf2,0x76,0x08,0x96,0x1a,0xc7,0x11,0xde,0x71,0xa6,0xe2,0xd4,0xd4,0x66,0x3e,0xa3,0xec,0xd4,0x2f,0xb7,0xe4,0xe8,0x62,0x7c,0x39,0x62,0x2d,0xf4,0xaf,0x0b,0xbc,},{0x18,0xdc,0x56,0xd7,0xbd,0x9a,0xcd,0x4f,0x4d,0xaa,0x78,0x54,0x0b,0x4a,0xc8,0xff,0x7a,0xa9,0x81,0x5f,0x45,0xa0,0xbb,0xa3,0x70,0x73,0x1a,0x14,0xea,0xab,0xe9,0x6d,0xf8,0xb5,0xf3,0x7d,0xbf,0x8e,0xae,0x4c,0xb1,0x5a,0x64,0xb2,0x44,0x65,0x1e,0x59,0xd6,0xa3,0xd6,0x76,0x1d,0x9e,0x3c,0x50,0xf2,0xd0,0xcb,0xb0,0x9c,0x05,0xec,0x06,},"\x99\xe3\xd0\x09\x34\x00\x3e\xba\xfc\x3e\x9f\xdb\x68\x7b\x0f\x5f\xf9\xd5\x78\x2a\x4b\x1f\x56\xb9\x70\x00\x46\xc0\x77\x91\x56\x02\xc3\x13\x4e\x22\xfc\x90\xed\x7e\x69\x0f\xdd\xd4\x43\x3e\x20\x34\xdc\xb2\xdc\x99\xab"}, +{{0xb6,0x25,0xaa,0x89,0xd3,0xf7,0x30,0x87,0x15,0x42,0x7b,0x6c,0x39,0xbb,0xac,0x58,0xef,0xfd,0x3a,0x0f,0xb7,0x31,0x6f,0x7a,0x22,0xb9,0x9e,0xe5,0x92,0x2f,0x2d,0xc9,},{0x65,0xa9,0x9c,0x3e,0x16,0xfe,0xa8,0x94,0xec,0x33,0xc6,0xb2,0x0d,0x91,0x05,0xe2,0xa0,0x4e,0x27,0x64,0xa4,0x76,0x9d,0x9b,0xbd,0x4d,0x8b,0xac,0xfe,0xab,0x4a,0x2e,},{0x01,0xbb,0x90,0x1d,0x83,0xb8,0xb6,0x82,0xd3,0x61,0x4a,0xf4,0x6a,0x80,0x7b,0xa2,0x69,0x13,0x58,0xfe,0xb7,0x75,0x32,0x5d,0x34,0x23,0xf5,0x49,0xff,0x0a,0xa5,0x75,0x7e,0x4e,0x1a,0x74,0xe9,0xc7,0x0f,0x97,0x21,0xd8,0xf3,0x54,0xb3,0x19,0xd4,0xf4,0xa1,0xd9,0x14,0x45,0xc8,0x70,0xfd,0x0f,0xfb,0x94,0xfe,0xd6,0x46,0x64,0x73,0x0d,},"\xe0\x72\x41\xdb\xd3\xad\xbe\x61\x0b\xbe\x4d\x00\x5d\xd4\x67\x32\xa4\xc2\x50\x86\xec\xb8\xec\x29\xcd\x7b\xca\x11\x6e\x1b\xf9\xf5\x3b\xfb\xf3\xe1\x1f\xa4\x90\x18\xd3\x9f\xf1\x15\x4a\x06\x66\x8e\xf7\xdf\x5c\x67\x8e\x6a"}, +{{0xb1,0xc9,0xf8,0xbd,0x03,0xfe,0x82,0xe7,0x8f,0x5c,0x0f,0xb0,0x64,0x50,0xf2,0x7d,0xac,0xdf,0x71,0x64,0x34,0xdb,0x26,0x82,0x75,0xdf,0x3e,0x1d,0xc1,0x77,0xaf,0x42,},{0x7f,0xc8,0x8b,0x1f,0x7b,0x3f,0x11,0xc6,0x29,0xbe,0x67,0x1c,0x21,0x62,0x1f,0x5c,0x10,0x67,0x2f,0xaf,0xc8,0x49,0x2d,0xa8,0x85,0x74,0x20,0x59,0xee,0x67,0x74,0xcf,},{0x4b,0x22,0x99,0x51,0xef,0x26,0x2f,0x16,0x97,0x8f,0x79,0x14,0xbc,0x67,0x2e,0x72,0x26,0xc5,0xf8,0x37,0x9d,0x27,0x78,0xc5,0xa2,0xdc,0x0a,0x26,0x50,0x86,0x9f,0x7a,0xcf,0xbd,0x0b,0xcd,0x30,0xfd,0xb0,0x61,0x9b,0xb4,0x4f,0xc1,0xae,0x59,0x39,0xb8,0x7c,0xc3,0x18,0x13,0x30,0x09,0xc2,0x03,0x95,0xb6,0xc7,0xeb,0x98,0x10,0x77,0x01,},"\x33\x1d\xa7\xa9\xc1\xf8\x7b\x2a\xc9\x1e\xe3\xb8\x6d\x06\xc2\x91\x63\xc0\x5e\xd6\xf8\xd8\xa9\x72\x5b\x47\x1b\x7d\xb0\xd6\xac\xec\x7f\x0f\x70\x24\x87\x16\x3f\x5e\xda\x02\x0c\xa5\xb4\x93\xf3\x99\xe1\xc8\xd3\x08\xc3\xc0\xc2"}, +{{0x6d,0x8c,0xdb,0x2e,0x07,0x5f,0x3a,0x2f,0x86,0x13,0x72,0x14,0xcb,0x23,0x6c,0xeb,0x89,0xa6,0x72,0x8b,0xb4,0xa2,0x00,0x80,0x6b,0xf3,0x55,0x7f,0xb7,0x8f,0xac,0x69,},{0x57,0xa0,0x4c,0x7a,0x51,0x13,0xcd,0xdf,0xe4,0x9a,0x4c,0x12,0x46,0x91,0xd4,0x6c,0x1f,0x9c,0xdc,0x8f,0x34,0x3f,0x9d,0xcb,0x72,0xa1,0x33,0x0a,0xec,0xa7,0x1f,0xda,},{0xa6,0xcb,0xc9,0x47,0xf9,0xc8,0x7d,0x14,0x55,0xcf,0x1a,0x70,0x85,0x28,0xc0,0x90,0xf1,0x1e,0xce,0xe4,0x85,0x5d,0x1d,0xba,0xad,0xf4,0x74,0x54,0xa4,0xde,0x55,0xfa,0x4c,0xe8,0x4b,0x36,0xd7,0x3a,0x5b,0x5f,0x8f,0x59,0x29,0x8c,0xcf,0x21,0x99,0x2d,0xf4,0x92,0xef,0x34,0x16,0x3d,0x87,0x75,0x3b,0x7e,0x9d,0x32,0xf2,0xc3,0x66,0x0b,},"\x7f\x31\x8d\xbd\x12\x1c\x08\xbf\xdd\xfe\xff\x4f\x6a\xff\x4e\x45\x79\x32\x51\xf8\xab\xf6\x58\x40\x33\x58\x23\x89\x84\x36\x00\x54\xf2\xa8\x62\xc5\xbb\x83\xed\x89\x02\x5d\x20\x14\xa7\xa0\xce\xe5\x0d\xa3\xcb\x0e\x76\xbb\xb6\xbf"}, +{{0x47,0xad,0xc6,0xd6,0xbf,0x57,0x1e,0xe9,0x57,0x0c,0xa0,0xf7,0x5b,0x60,0x4a,0xc4,0x3e,0x30,0x3e,0x4a,0xb3,0x39,0xca,0x9b,0x53,0xca,0xcc,0x5b,0xe4,0x5b,0x2c,0xcb,},{0xa3,0xf5,0x27,0xa1,0xc1,0xf1,0x7d,0xfe,0xed,0x92,0x27,0x73,0x47,0xc9,0xf9,0x8a,0xb4,0x75,0xde,0x17,0x55,0xb0,0xab,0x54,0x6b,0x8a,0x15,0xd0,0x1b,0x9b,0xd0,0xbe,},{0x4e,0x8c,0x31,0x83,0x43,0xc3,0x06,0xad,0xbb,0xa6,0x0c,0x92,0xb7,0x5c,0xb0,0x56,0x9b,0x92,0x19,0xd8,0xa8,0x6e,0x5d,0x57,0x75,0x2e,0xd2,0x35,0xfc,0x10,0x9a,0x43,0xc2,0xcf,0x4e,0x94,0x2c,0xac,0xf2,0x97,0x27,0x9f,0xbb,0x28,0x67,0x53,0x47,0xe0,0x80,0x27,0x72,0x2a,0x4e,0xb7,0x39,0x5e,0x00,0xa1,0x74,0x95,0xd3,0x2e,0xdf,0x0b,},"\xce\x49\x7c\x5f\xf5\xa7\x79\x90\xb7\xd8\xf8\x69\x9e\xb1\xf5\xd8\xc0\x58\x2f\x70\xcb\x7a\xc5\xc5\x4d\x9d\x92\x49\x13\x27\x8b\xc6\x54\xd3\x7e\xa2\x27\x59\x0e\x15\x20\x22\x17\xfc\x98\xda\xc4\xc0\xf3\xbe\x21\x83\xd1\x33\x31\x57\x39"}, +{{0x3c,0x19,0xb5,0x0b,0x0f,0xe4,0x79,0x61,0x71,0x9c,0x38,0x1d,0x0d,0x8d,0xa9,0xb9,0x86,0x9d,0x31,0x2f,0x13,0xe3,0x29,0x8b,0x97,0xfb,0x22,0xf0,0xaf,0x29,0xcb,0xbe,},{0x0f,0x7e,0xda,0x09,0x14,0x99,0x62,0x5e,0x2b,0xae,0x85,0x36,0xea,0x35,0xcd,0xa5,0x48,0x3b,0xd1,0x6a,0x9c,0x7e,0x41,0x6b,0x34,0x1d,0x6f,0x2c,0x83,0x34,0x36,0x12,},{0xef,0xbd,0x41,0xf2,0x6a,0x5d,0x62,0x68,0x55,0x16,0xf8,0x82,0xb6,0xec,0x74,0xe0,0xd5,0xa7,0x18,0x30,0xd2,0x03,0xc2,0x31,0x24,0x8f,0x26,0xe9,0x9a,0x9c,0x65,0x78,0xec,0x90,0x0d,0x68,0xcd,0xb8,0xfa,0x72,0x16,0xad,0x0d,0x24,0xf9,0xec,0xbc,0x9f,0xfa,0x65,0x53,0x51,0x66,0x65,0x82,0xf6,0x26,0x64,0x53,0x95,0xa3,0x1f,0xa7,0x04,},"\x8d\xdc\xd6\x30\x43\xf5\x5e\xc3\xbf\xc8\x3d\xce\xae\x69\xd8\xf8\xb3\x2f\x4c\xdb\x6e\x2a\xeb\xd9\x4b\x43\x14\xf8\xfe\x72\x87\xdc\xb6\x27\x32\xc9\x05\x2e\x75\x57\xfe\x63\x53\x43\x38\xef\xb5\xb6\x25\x4c\x5d\x41\xd2\x69\x0c\xf5\x14\x4f"}, +{{0x34,0xe1,0xe9,0xd5,0x39,0x10,0x7e,0xb8,0x6b,0x39,0x3a,0x5c,0xce,0xa1,0x49,0x6d,0x35,0xbc,0x7d,0x5e,0x9a,0x8c,0x51,0x59,0xd9,0x57,0xe4,0xe5,0x85,0x2b,0x3e,0xb0,},{0x0e,0xcb,0x26,0x01,0xd5,0xf7,0x04,0x74,0x28,0xe9,0xf9,0x09,0x88,0x3a,0x12,0x42,0x00,0x85,0xf0,0x4e,0xe2,0xa8,0x8b,0x6d,0x95,0xd3,0xd7,0xf2,0xc9,0x32,0xbd,0x76,},{0x32,0xd2,0x29,0x04,0xd3,0xe7,0x01,0x2d,0x6f,0x5a,0x44,0x1b,0x0b,0x42,0x28,0x06,0x4a,0x5c,0xf9,0x5b,0x72,0x3a,0x66,0xb0,0x48,0xa0,0x87,0xec,0xd5,0x59,0x20,0xc3,0x1c,0x20,0x4c,0x3f,0x20,0x06,0x89,0x1a,0x85,0xdd,0x19,0x32,0xe3,0xf1,0xd6,0x14,0xcf,0xd6,0x33,0xb5,0xe6,0x32,0x91,0xc6,0xd8,0x16,0x6f,0x30,0x11,0x43,0x1e,0x09,},"\xa6\xd4\xd0\x54\x2c\xfe\x0d\x24\x0a\x90\x50\x7d\xeb\xac\xab\xce\x7c\xbb\xd4\x87\x32\x35\x3f\x4f\xad\x82\xc7\xbb\x7d\xbd\x9d\xf8\xe7\xd9\xa1\x69\x80\xa4\x51\x86\xd8\x78\x6c\x5e\xf6\x54\x45\xbc\xc5\xb2\xad\x5f\x66\x0f\xfc\x7c\x8e\xaa\xc0"}, +{{0x49,0xdd,0x47,0x3e,0xde,0x6a,0xa3,0xc8,0x66,0x82,0x4a,0x40,0xad,0xa4,0x99,0x6c,0x23,0x9a,0x20,0xd8,0x4c,0x93,0x65,0xe4,0xf0,0xa4,0x55,0x4f,0x80,0x31,0xb9,0xcf,},{0x78,0x8d,0xe5,0x40,0x54,0x4d,0x3f,0xeb,0x0c,0x91,0x92,0x40,0xb3,0x90,0x72,0x9b,0xe4,0x87,0xe9,0x4b,0x64,0xad,0x97,0x3e,0xb6,0x5b,0x46,0x69,0xec,0xf2,0x35,0x01,},{0xd2,0xfd,0xe0,0x27,0x91,0xe7,0x20,0x85,0x25,0x07,0xfa,0xa7,0xc3,0x78,0x90,0x40,0xd9,0xef,0x86,0x64,0x63,0x21,0xf3,0x13,0xac,0x55,0x7f,0x40,0x02,0x49,0x15,0x42,0xdd,0x67,0xd0,0x5c,0x69,0x90,0xcd,0xb0,0xd4,0x95,0x50,0x1f,0xbc,0x5d,0x51,0x88,0xbf,0xbb,0x84,0xdc,0x1b,0xf6,0x09,0x8b,0xee,0x06,0x03,0xa4,0x7f,0xc2,0x69,0x0f,},"\x3a\x53\x59\x4f\x3f\xba\x03\x02\x93\x18\xf5\x12\xb0\x84\xa0\x71\xeb\xd6\x0b\xae\xc7\xf5\x5b\x02\x8d\xc7\x3b\xfc\x9c\x74\xe0\xca\x49\x6b\xf8\x19\xdd\x92\xab\x61\xcd\x8b\x74\xbe\x3c\x0d\x6d\xcd\x12\x8e\xfc\x5e\xd3\x34\x2c\xba\x12\x4f\x72\x6c"}, +{{0x33,0x1c,0x64,0xda,0x48,0x2b,0x6b,0x55,0x13,0x73,0xc3,0x64,0x81,0xa0,0x2d,0x81,0x36,0xec,0xad,0xbb,0x01,0xab,0x11,0x4b,0x44,0x70,0xbf,0x41,0x60,0x7a,0xc5,0x71,},{0x52,0xa0,0x0d,0x96,0xa3,0x14,0x8b,0x47,0x26,0x69,0x2d,0x9e,0xff,0x89,0x16,0x0e,0xa9,0xf9,0x9a,0x5c,0xc4,0x38,0x9f,0x36,0x1f,0xed,0x0b,0xb1,0x6a,0x42,0xd5,0x21,},{0x22,0xc9,0x9a,0xa9,0x46,0xea,0xd3,0x9a,0xc7,0x99,0x75,0x62,0x81,0x0c,0x01,0xc2,0x0b,0x46,0xbd,0x61,0x06,0x45,0xbd,0x2d,0x56,0xdc,0xdc,0xba,0xac,0xc5,0x45,0x2c,0x74,0xfb,0xf4,0xb8,0xb1,0x81,0x3b,0x0e,0x94,0xc3,0x0d,0x80,0x8c,0xe5,0x49,0x8e,0x61,0xd4,0xf7,0xcc,0xbb,0x4c,0xc5,0xf0,0x4d,0xfc,0x61,0x40,0x82,0x5a,0x96,0x00,},"\x20\xe1\xd0\x5a\x0d\x5b\x32\xcc\x81\x50\xb8\x11\x6c\xef\x39\x65\x9d\xd5\xfb\x44\x3a\xb1\x56\x00\xf7\x8e\x5b\x49\xc4\x53\x26\xd9\x32\x3f\x28\x50\xa6\x3c\x38\x08\x85\x94\x95\xae\x27\x3f\x58\xa5\x1e\x9d\xe9\xa1\x45\xd7\x74\xb4\x0b\xa9\xd7\x53\xd3"}, +{{0x5c,0x0b,0x96,0xf2,0xaf,0x87,0x12,0x12,0x2c,0xf7,0x43,0xc8,0xf8,0xdc,0x77,0xb6,0xcd,0x55,0x70,0xa7,0xde,0x13,0x29,0x7b,0xb3,0xdd,0xe1,0x88,0x62,0x13,0xcc,0xe2,},{0x05,0x10,0xea,0xf5,0x7d,0x73,0x01,0xb0,0xe1,0xd5,0x27,0x03,0x9b,0xf4,0xc6,0xe2,0x92,0x30,0x0a,0x3a,0x61,0xb4,0x76,0x54,0x34,0xf3,0x20,0x3c,0x10,0x03,0x51,0xb1,},{0x06,0xe5,0xd8,0x43,0x6a,0xc7,0x70,0x5b,0x3a,0x90,0xf1,0x63,0x1c,0xdd,0x38,0xec,0x1a,0x3f,0xa4,0x97,0x78,0xa9,0xb9,0xf2,0xfa,0x5e,0xbe,0xa4,0xe7,0xd5,0x60,0xad,0xa7,0xdd,0x26,0xff,0x42,0xfa,0xfa,0x8b,0xa4,0x20,0x32,0x37,0x42,0x76,0x1a,0xca,0x69,0x04,0x94,0x0d,0xc2,0x1b,0xbe,0xf6,0x3f,0xf7,0x2d,0xaa,0xb4,0x5d,0x43,0x0b,},"\x54\xe0\xca\xa8\xe6\x39\x19\xca\x61\x4b\x2b\xfd\x30\x8c\xcf\xe5\x0c\x9e\xa8\x88\xe1\xee\x44\x46\xd6\x82\xcb\x50\x34\x62\x7f\x97\xb0\x53\x92\xc0\x4e\x83\x55\x56\xc3\x1c\x52\x81\x6a\x48\xe4\xfb\x19\x66\x93\x20\x6b\x8a\xfb\x44\x08\x66\x2b\x3c\xb5\x75"}, +{{0xde,0x84,0xf2,0x43,0x5f,0x78,0xde,0xdb,0x87,0xda,0x18,0x19,0x4f,0xf6,0xa3,0x36,0xf0,0x81,0x11,0x15,0x0d,0xef,0x90,0x1c,0x1a,0xc4,0x18,0x14,0x6e,0xb7,0xb5,0x4a,},{0xd3,0xa9,0x2b,0xba,0xa4,0xd6,0x3a,0xf7,0x9c,0x22,0x26,0xa7,0x23,0x6e,0x64,0x27,0x42,0x8d,0xf8,0xb3,0x62,0x42,0x7f,0x87,0x30,0x23,0xb2,0x2d,0x2f,0x5e,0x03,0xf2,},{0x47,0x1e,0xbc,0x97,0x3c,0xfd,0xac,0xee,0xc0,0x72,0x79,0x30,0x73,0x68,0xb7,0x3b,0xe3,0x5b,0xc6,0xf8,0xd8,0x31,0x2b,0x70,0x15,0x05,0x67,0x36,0x90,0x96,0x70,0x6d,0xc4,0x71,0x12,0x6c,0x35,0x76,0xf9,0xf0,0xeb,0x55,0x0d,0xf5,0xac,0x6a,0x52,0x51,0x81,0x11,0x00,0x29,0xdd,0x1f,0xc1,0x11,0x74,0xd1,0xaa,0xce,0xd4,0x8d,0x63,0x0f,},"\x20\x51\x35\xec\x7f\x41\x7c\x85\x80\x72\xd5\x23\x3f\xb3\x64\x82\xd4\x90\x6a\xbd\x60\xa7\x4a\x49\x8c\x34\x7f\xf2\x48\xdf\xa2\x72\x2c\xa7\x4e\x87\x9d\xe3\x31\x69\xfa\xdc\x7c\xd4\x4d\x6c\x94\xa1\x7d\x16\xe1\xe6\x30\x82\x4b\xa3\xe0\xdf\x22\xed\x68\xea\xab"}, +{{0xba,0x4d,0x6e,0x67,0xb2,0xce,0x67,0xa1,0xe4,0x43,0x26,0x49,0x40,0x44,0xf3,0x7a,0x44,0x2f,0x3b,0x81,0x72,0x5b,0xc1,0xf9,0x34,0x14,0x62,0x71,0x8b,0x55,0xee,0x20,},{0xf7,0x3f,0xa0,0x76,0xf8,0x4b,0x6d,0xb6,0x75,0xa5,0xfd,0xa5,0xad,0x67,0xe3,0x51,0xa4,0x1e,0x8e,0x7f,0x29,0xad,0xd1,0x68,0x09,0xca,0x01,0x03,0x87,0xe9,0xc6,0xcc,},{0x57,0xb9,0xd2,0xa7,0x11,0x20,0x7f,0x83,0x74,0x21,0xba,0xe7,0xdd,0x48,0xea,0xa1,0x8e,0xab,0x1a,0x9a,0x70,0xa0,0xf1,0x30,0x58,0x06,0xfe,0xe1,0x7b,0x45,0x8f,0x3a,0x09,0x64,0xb3,0x02,0xd1,0x83,0x4d,0x3e,0x0a,0xc9,0xe8,0x49,0x6f,0x00,0x0b,0x77,0xf0,0x08,0x3b,0x41,0xf8,0xa9,0x57,0xe6,0x32,0xfb,0xc7,0x84,0x0e,0xee,0x6a,0x06,},"\x4b\xaf\xda\xc9\x09\x9d\x40\x57\xed\x6d\xd0\x8b\xca\xee\x87\x56\xe9\xa4\x0f\x2c\xb9\x59\x80\x20\xeb\x95\x01\x95\x28\x40\x9b\xbe\xa3\x8b\x38\x4a\x59\xf1\x19\xf5\x72\x97\xbf\xb2\xfa\x14\x2f\xc7\xbb\x1d\x90\xdb\xdd\xde\x77\x2b\xcd\xe4\x8c\x56\x70\xd5\xfa\x13"}, +{{0x0d,0x13,0x1c,0x45,0xae,0xa6,0xf3,0xa4,0xe1,0xb9,0xa2,0xcf,0x60,0xc5,0x51,0x04,0x58,0x7e,0xfa,0xa8,0x46,0xb2,0x22,0xbf,0x0a,0x7b,0x74,0xce,0x7a,0x3f,0x63,0xb6,},{0x3c,0x67,0x29,0xdb,0xe9,0x3b,0x49,0x9c,0x4e,0x61,0x4a,0x2f,0x21,0xbe,0xb7,0x29,0x43,0x8d,0x49,0x8e,0x1a,0xc8,0xd1,0x4c,0xba,0xd9,0x71,0x7a,0x5d,0xbd,0x97,0xcd,},{0xa9,0xc5,0xee,0x86,0xfb,0x06,0xd9,0xe4,0x6b,0x37,0x9c,0x32,0xdd,0xa7,0xc9,0x2c,0x9c,0x13,0xdb,0x27,0x4d,0xc2,0x41,0x16,0xfb,0xdd,0x87,0x86,0x96,0x04,0x54,0x88,0xcc,0x75,0xa5,0x2f,0xff,0x67,0xd1,0xa5,0x11,0x3d,0x06,0xe3,0x33,0xac,0x67,0xff,0x66,0x4b,0x3f,0x2a,0x40,0x5f,0xa1,0xd1,0x4d,0xd5,0xbb,0xb9,0x74,0x09,0xb6,0x06,},"\xb4\x29\x1d\x08\xb8\x8f\xb2\xf7\xb8\xf9\x9d\x0d\xce\x40\x07\x9f\xcb\xab\x71\x8b\xbd\x8f\x4e\x8e\xab\xc3\xc1\x42\x8b\x6a\x07\x1f\xb2\xa3\xc8\xeb\xa1\xca\xcc\xcf\xa8\x71\xb3\x65\xc7\x08\xbe\xf2\x68\x5b\xc1\x3e\x6b\x80\xbc\x14\xa5\xf2\x49\x17\x0f\xfc\x56\xd0\x14"}, +{{0xa7,0x5e,0x3b,0x6b,0x41,0x70,0xe4,0x44,0x78,0x1b,0xe4,0xee,0xac,0x3e,0x0f,0xda,0xa4,0xb4,0x35,0x6f,0x70,0x54,0x86,0xbc,0xb0,0x71,0xa3,0x25,0xae,0x07,0x1f,0xba,},{0x99,0x3d,0x38,0xa7,0xd7,0x2f,0x0a,0xee,0x15,0xff,0x6f,0x4f,0xdc,0x37,0xca,0x77,0x24,0xfd,0x13,0x73,0xa3,0x76,0x6b,0x27,0x5d,0xbc,0x77,0xe6,0x47,0x98,0x0e,0x0a,},{0xa5,0xdb,0x4d,0x3d,0x33,0x29,0xab,0xe3,0x69,0x79,0x59,0xe6,0xb5,0x94,0x7e,0xa8,0x60,0x1b,0x03,0xef,0x8e,0x1d,0x6f,0xe2,0x02,0x14,0x49,0x31,0x27,0x2c,0xa0,0xa0,0x9b,0x5e,0xb0,0xf3,0x90,0x57,0x2e,0xa7,0xef,0x03,0xc6,0x13,0x1e,0x9d,0xe5,0xf1,0x6b,0xf0,0xb0,0x34,0x24,0x4f,0x7e,0x10,0x4f,0xf5,0x31,0x1b,0xbf,0x66,0x3a,0x0d,},"\x40\x37\x86\x6f\x65\x48\xb0\x1c\xc6\xbc\xf3\xa9\x40\xe3\x94\x5a\xa2\xd1\x88\xb4\xb7\xf1\x82\xaa\x77\xec\x4d\x6b\x04\x28\xab\x5b\x84\xd8\x5d\xf1\x92\xa5\xa3\x8a\xda\x08\x9d\x76\xfa\x26\xbf\x67\x73\x6a\x70\x41\xa5\xeb\x8f\x0c\x57\x19\xeb\x39\x66\x93\xc4\x51\x60\xf8"}, +{{0xbc,0xbc,0xf5,0x61,0xec,0xc0,0x5a,0x41,0xc7,0xd7,0xe5,0x5e,0x69,0x6d,0x32,0xce,0x39,0xb4,0xd0,0x3c,0x1f,0x5f,0x3f,0x3a,0x89,0x27,0xfe,0x5e,0x62,0xe8,0x44,0xb2,},{0x4d,0xdf,0x53,0xfa,0xd6,0xa7,0xa9,0xed,0x30,0xf3,0xaf,0xec,0xca,0x13,0x6f,0xd7,0x84,0x3b,0x72,0xc2,0x43,0x09,0x08,0x91,0xae,0x40,0x21,0xa3,0x2c,0xad,0xff,0x1a,},{0x9f,0xf1,0x51,0x15,0xf6,0x66,0x1f,0x32,0x11,0xd7,0xa4,0x07,0x64,0x96,0x76,0x29,0xba,0x6a,0x52,0x63,0x95,0x1b,0xdc,0x3c,0x6a,0x4c,0x90,0xd0,0x70,0xf7,0xbe,0x00,0x02,0x4b,0x80,0xd8,0x3b,0x6b,0xc2,0x75,0x87,0xfc,0xff,0x5f,0x5c,0xcc,0x0e,0xb3,0xcd,0xe1,0x49,0x7c,0xf5,0x68,0x95,0x14,0x7a,0x06,0x3f,0x61,0xf0,0x8a,0xdf,0x0b,},"\x6f\x67\x16\xb6\x78\x47\x40\x98\x0a\xeb\xc3\x24\x88\x07\xe3\x1c\x12\x86\xac\x7b\x68\x1c\x00\xb6\x6c\x88\xff\x7a\x33\x6d\x44\x1f\xa5\xc3\xeb\x25\x6d\x20\xcf\x6d\x1a\xc9\x2c\xcf\xe4\xbe\x6d\xcc\x41\xb1\xaf\xf8\x46\xd3\x60\xc2\x43\x00\x1c\xab\xdf\xbf\x1a\x9b\x24\x04\x55"}, +{{0x21,0x05,0x32,0x80,0x5f,0xa9,0xcc,0x9b,0xe9,0x16,0xd2,0x13,0xca,0xc3,0x74,0xe3,0xcd,0x6f,0xc2,0x60,0x2a,0x54,0x4d,0x0c,0x1c,0xe2,0x9d,0x30,0x10,0x5d,0x69,0xab,},{0x10,0x69,0x9e,0x49,0x9b,0xe9,0x9e,0x2b,0x11,0xb9,0x8f,0x6f,0x86,0xb6,0x7c,0xdc,0x4c,0xcf,0x69,0xf3,0xc5,0x3c,0xe0,0x94,0x87,0x56,0x47,0xd2,0xd0,0xd0,0xec,0xc5,},{0x4c,0x2d,0x31,0xd5,0xbb,0xc4,0x2e,0x02,0x6d,0xc1,0xe0,0x79,0xec,0xc4,0xdd,0x07,0x2c,0x5d,0x2c,0xce,0x65,0xe3,0xdb,0x8d,0x8a,0x1d,0xd9,0x05,0x7f,0xaa,0x03,0x71,0x72,0x7f,0x72,0x72,0x31,0xa0,0xf0,0x60,0xfa,0x27,0x09,0x75,0x33,0xb6,0xdb,0x3b,0x8f,0x62,0x52,0xf2,0x79,0x3d,0x75,0x66,0x2c,0xaa,0xdf,0x5f,0x0f,0xcc,0x71,0x0e,},"\x9f\xc4\xd2\x8c\xfd\x25\xe6\xc0\xc5\xe7\x24\xe1\x9c\xa3\x9d\x71\xe5\x3b\xf4\xaa\x27\x96\xc5\x4c\x33\x51\xf1\x08\xfc\x70\xf2\x61\x1a\x62\xe0\xab\x90\xaf\x6a\xde\x52\x16\x78\x8e\x9e\xb2\xa8\x73\x05\x9b\x1e\x79\xd7\xd5\x9d\xeb\xd6\x8f\x2d\x4d\x80\xff\xe3\x1b\xf7\x4b\x92\x8c"}, +{{0x18,0x5d,0x64,0xb6,0x94,0x79,0xe0,0xba,0x0a,0x58,0x44,0xa1,0x0a,0xd8,0x41,0x25,0xba,0x11,0xc4,0xb4,0x0d,0x63,0xed,0xa2,0xc5,0x7a,0xfc,0x7e,0x01,0x9c,0x8e,0x0c,},{0xa5,0x76,0x4f,0x63,0x98,0xa5,0xae,0x22,0x66,0xa3,0x8f,0x97,0x14,0x53,0x3c,0x4b,0xbd,0x8d,0x07,0x82,0x6f,0x63,0xe2,0x04,0xcb,0xac,0x37,0x4b,0x0a,0xce,0xf1,0xbd,},{0x43,0xe0,0x38,0x7d,0xa5,0xba,0x09,0xa1,0x90,0xf6,0xe7,0xb2,0x68,0x05,0x78,0xd8,0x89,0x76,0x9b,0xcc,0x44,0x5e,0x5e,0xf5,0x71,0xb4,0x92,0x87,0x1c,0x15,0x5c,0x5b,0x9f,0x62,0x0b,0xfa,0xcf,0xbf,0x2d,0xf1,0xfd,0x87,0x44,0x46,0x04,0xb7,0x1b,0x2e,0x23,0x7b,0xaa,0xa7,0xee,0x20,0x93,0xed,0xe4,0xa6,0x01,0xed,0xf8,0x83,0xe3,0x07,},"\x4a\x08\x24\xfe\x70\xd4\x31\x54\x13\xd0\xa0\xca\xfb\xf4\xf5\xfe\x11\x7d\x5e\x07\xe1\xc3\xa4\xef\xfb\x9d\x0a\xe9\x14\x90\x23\x48\x78\xcc\xf6\x79\x2a\x91\xf6\x8c\x6a\x52\x0d\xe1\x60\x71\xf0\x8a\xbe\x35\xdc\x5e\xa4\x28\xf1\x95\x7b\x66\x33\x71\xce\x24\xc6\x09\xdd\x55\xb8\xf4\x93"}, +{{0xcf,0xa9,0xd9,0x16,0x4b,0x3c,0x4f,0x6f,0x72,0x26,0x35,0xd2,0x06,0x6c,0xd7,0xea,0x5e,0x55,0x33,0xd2,0xc7,0x4f,0x8a,0xdd,0x66,0x9c,0x37,0x1f,0xaa,0x47,0x64,0x26,},{0x41,0x16,0x9a,0x66,0xf9,0xa6,0x3f,0x28,0x57,0x82,0xa6,0xc2,0xdb,0x81,0xcc,0x3f,0x70,0xb3,0xad,0xa2,0x1a,0x68,0xc8,0x47,0x45,0xc8,0x8a,0x74,0xc3,0xb0,0xa2,0xde,},{0x01,0xd7,0xc9,0xb5,0x70,0x1a,0xf7,0x1e,0x2f,0x48,0x77,0xff,0xc9,0xb7,0xb5,0x30,0x5f,0x52,0x81,0x6d,0x44,0x58,0xe3,0x7e,0x41,0xc7,0x71,0x9f,0xac,0x1d,0x76,0xa0,0x1f,0xff,0x3f,0x50,0xfe,0x1a,0x58,0x75,0xcc,0xc3,0xfb,0x70,0x00,0x1c,0x94,0x7a,0x33,0xfc,0x8b,0x20,0x7d,0xe1,0x35,0x72,0xcc,0xdb,0x8b,0xa9,0x89,0x33,0xab,0x01,},"\x75\x76\x21\xb1\x67\x5d\xb7\xca\xce\xf7\xf2\x78\x25\x87\xff\x3a\xf5\x1a\x3e\xf2\xf4\xbc\xf9\x27\x9c\x4c\xe9\x40\x02\xe1\xf0\x04\x24\xbf\x0e\xb6\x21\x98\x2c\xc8\x5c\xb4\xd1\x71\xe5\x64\xa0\xc2\xf6\xe3\x56\x7a\x1a\xae\x2c\xdd\xb7\xe9\xb2\x5f\x47\xdc\x20\xa5\x10\x50\x54\x29\x69\xca"}, +{{0x1a,0xcb,0x4a,0x25,0x6c,0x2f,0x89,0x93,0xca,0x24,0xde,0x1e,0x00,0x14,0x60,0x6d,0x66,0x8b,0x5e,0x75,0x60,0x32,0xd2,0x69,0xf1,0xd2,0x4d,0x35,0x1c,0x8e,0xea,0x4a,},{0xcb,0xbd,0xcd,0x8c,0xbc,0x88,0x5a,0xb4,0x3a,0x05,0x7e,0x5f,0x95,0x79,0xf1,0x16,0x19,0x54,0x15,0x9e,0x7b,0x56,0x2e,0xa2,0x6c,0xd9,0xa4,0x3c,0x88,0xd3,0xf9,0x6d,},{0x05,0xaa,0x76,0xf7,0xfe,0x51,0x89,0x23,0x03,0xd7,0x89,0x14,0x71,0x59,0x95,0xe7,0xd7,0x68,0xff,0x77,0x14,0xce,0x27,0x0f,0x17,0x5e,0x56,0xaf,0x17,0xae,0x01,0x8d,0x3f,0xa9,0x39,0xf5,0xf6,0x20,0xde,0x82,0xbc,0xd1,0x54,0x96,0x87,0xb2,0x05,0xc7,0x87,0x12,0x03,0xe6,0x24,0x23,0x8c,0x4e,0x30,0x9f,0xab,0x7f,0x92,0xfb,0xaa,0x05,},"\xc4\x6a\x6d\x61\xaa\x0a\xed\x1c\x1d\x85\x47\xa7\x0b\x89\xb7\x19\x64\x75\xd5\xa4\x87\x08\x81\xb1\xec\xd0\xf0\xcb\x9c\x74\x5f\x8a\x2a\xdc\x80\x24\xe2\xdc\x55\xb5\x3a\xa5\xd3\x83\xa8\x1a\xab\xc1\xa4\x7e\x8d\x07\xd0\x0b\x7f\x0b\x56\xce\xdd\xbf\xb1\xf4\x24\xbb\x5c\x02\x18\x46\x78\xa6\x66"}, +{{0xac,0xe3,0xc4,0x64,0x24,0x82,0x36,0x22,0x97,0x9f,0xc3,0xa8,0x4a,0x7d,0xa6,0x9c,0x1d,0x52,0x7d,0x83,0x12,0xe8,0xfb,0x01,0x83,0x75,0xbd,0x3a,0x96,0xc2,0x9c,0x18,},{0x93,0x7c,0xf3,0x41,0x36,0xd9,0xe1,0xcc,0xe0,0xde,0x11,0xb1,0x2c,0x70,0xcb,0xfb,0x74,0x55,0x44,0x84,0x21,0xe9,0x2c,0x82,0xe7,0xc4,0x09,0x34,0xbf,0xf8,0xc6,0x76,},{0xfe,0xb8,0x89,0x6d,0xd3,0xfe,0x60,0x01,0xff,0xea,0x17,0x1b,0x37,0xb7,0x88,0xa6,0x9f,0x7f,0x85,0x01,0x93,0xa6,0x34,0x06,0xf5,0x63,0x76,0xdd,0x26,0x3d,0x09,0x9a,0xef,0x80,0xec,0xe6,0x7e,0x2c,0x43,0xf4,0x0e,0xca,0x46,0x2c,0x6b,0x71,0xe7,0x94,0x06,0xb1,0x8d,0xb7,0x4a,0xe5,0xd4,0x98,0x44,0xe3,0xb1,0x32,0xbc,0x2a,0x13,0x07,},"\xa9\xf1\x37\xbc\x90\x21\xbf\x10\x5a\xee\x25\xbe\x21\xcd\x9e\xe5\xb3\x54\x7c\xf1\x0c\xc5\xf9\x84\x76\xfb\x58\x8b\xd7\x0e\x2d\x6d\x6b\x08\x34\xe8\x42\xe4\xee\x94\x30\x3c\xf9\x6b\x09\xc1\x71\x53\x81\xb3\x6e\x14\xa4\x91\xb8\x0f\x89\x5e\xa4\x21\xb8\xec\x2b\x1d\x3c\x18\x7e\x02\x93\x5c\x55\x26"}, +{{0x88,0xf6,0x81,0x93,0x4e,0x33,0xc3,0x5c,0x07,0xdc,0x6e,0x5a,0x83,0x29,0x42,0xae,0x3d,0x59,0x90,0x3c,0xcd,0xe2,0xf7,0x6c,0xcb,0x75,0x87,0xce,0xa7,0xec,0x41,0xb6,},{0x6a,0x4e,0x8a,0xa5,0xad,0xb6,0x3d,0x22,0xfd,0x7b,0x14,0xa2,0x6f,0xdb,0x03,0xb7,0xc8,0xaa,0x6c,0xcd,0x5a,0x19,0x6f,0x2c,0x54,0xb0,0x46,0x5a,0xdb,0x50,0x92,0xe1,},{0x45,0xb2,0x7b,0xf1,0xb9,0xea,0xc0,0x6b,0x62,0xb6,0x86,0xf6,0xd5,0x46,0x56,0x3b,0x2d,0xfe,0x5b,0x17,0x5d,0xbe,0xf3,0x2b,0xf7,0x8c,0x35,0xa1,0x6c,0x95,0x8a,0x9d,0x4f,0x26,0xd2,0x91,0xde,0x9b,0xb2,0x06,0x6c,0x0a,0x28,0x61,0x13,0xcc,0x09,0x17,0x2d,0x40,0xa3,0x6d,0x4c,0xbd,0x95,0x17,0x08,0x86,0x02,0x26,0xeb,0x30,0xcd,0x05,},"\x6e\x8b\xac\x1f\x85\x3b\x81\xfe\xf9\x47\x07\xe1\x8c\xc6\x1c\x6f\x0a\x9c\xbc\x2a\x41\xd0\x78\xdc\xc8\x3f\xc0\x22\x9c\x7f\x8d\xbe\x6d\xbd\xd9\x08\x54\xb1\xf1\xae\x2b\x9f\x2b\x12\x0b\x86\xa8\x78\x6b\x4e\x78\xce\x23\xab\x86\xba\xaf\x88\x75\x4a\xf0\xf3\xd8\x88\x81\xda\xe0\xbc\x52\x61\xbf\xd0\x38"}, +{{0x48,0x05,0x0a,0x6e,0x01,0x58,0xf6,0xad,0x25,0x34,0x12,0xe4,0x49,0x7c,0xff,0x62,0xd5,0xee,0x55,0x5e,0xdf,0xfe,0x59,0xe4,0xdc,0x40,0x15,0x22,0x81,0x32,0x95,0xce,},{0x97,0x5e,0x01,0x0a,0xbb,0x9a,0x3e,0x56,0x65,0x91,0x37,0xb0,0x50,0x60,0x57,0xf2,0x83,0x98,0x2f,0x88,0x6c,0xa1,0x72,0xc7,0xbc,0x2c,0x50,0x0e,0xd9,0xbd,0x26,0xc1,},{0x72,0x16,0xab,0x60,0xc3,0x51,0x68,0x18,0x7d,0x0f,0xce,0x47,0x53,0xc8,0x6e,0x80,0x05,0x8d,0x54,0x0b,0x76,0xbf,0x95,0x84,0x3a,0x58,0x98,0x84,0x10,0x60,0xa9,0x9a,0x44,0xde,0x6f,0x43,0x96,0x25,0xa3,0xf6,0x36,0x5f,0x59,0xc3,0x77,0xbf,0x45,0x90,0x9b,0xbf,0xef,0x5c,0x50,0xb2,0x5f,0x31,0x94,0xe5,0xfb,0xd3,0x4e,0xa5,0xe7,0x06,},"\xed\x6e\xec\x29\xfb\x70\x49\xdf\xf7\x07\xf0\xa4\x42\x6e\xbc\x8f\x5b\x35\x0e\x95\x87\x0b\x9d\x61\x98\xc8\x13\x9e\x9c\x3e\x1e\x40\x99\x37\xd1\xa8\x58\xa0\xde\xa4\x82\xa5\xcb\x1a\x85\x4e\xd3\xb5\xa9\x39\x7a\xcb\x63\xbf\xf6\xb6\x40\x39\xef\x2e\xb1\x15\x9e\x99\x85\x83\x10\xbb\xbd\x86\x12\x5c\x3e\x0e"}, +{{0x18,0xd1,0x3d,0x0c,0x00,0xe8,0xe3,0x38,0x6a,0x5c,0xfb,0x30,0xa9,0xe7,0x9f,0xe8,0x8b,0x18,0x61,0xed,0x2d,0x12,0x01,0xeb,0x17,0x00,0x38,0xe1,0x94,0x77,0x04,0x03,},{0xa4,0xaf,0xc8,0x33,0x40,0x18,0x76,0x09,0x0d,0x9b,0x88,0x0c,0x41,0x26,0x7d,0x68,0xcb,0xbe,0xea,0xa3,0x8a,0xfb,0x20,0x88,0x4e,0x27,0x32,0x8f,0x3b,0x7f,0x53,0x5e,},{0x03,0x39,0x88,0x15,0x4c,0x5d,0x79,0xd2,0x51,0x0b,0xe8,0x3e,0x77,0x80,0x15,0xdf,0xe2,0xfb,0x85,0xb8,0x11,0x1f,0x7e,0xc1,0x39,0x91,0x8b,0x54,0x00,0xe3,0xd6,0x56,0xee,0x80,0xa9,0xf5,0xc9,0x07,0x2b,0x5b,0x46,0x7a,0x5c,0xc5,0xa5,0x7c,0xc8,0xad,0x10,0x62,0xb5,0xbf,0xf1,0x08,0x62,0xd9,0xd3,0x69,0xdd,0xe2,0xcc,0x96,0x67,0x01,},"\x91\x0f\x6c\x27\x2d\xd9\x79\x31\xac\x47\x31\x0d\x24\x4c\xad\xb4\x32\x51\x36\x5e\x02\xba\x9f\x6a\x5b\x3c\x32\x26\xbe\x9d\x7d\x3a\x74\xa2\xba\x49\x06\xe8\xe7\x1a\x4b\xf3\xd3\x55\x6e\xbd\xfc\x66\x6c\xd6\xb1\x2f\x20\xc4\xa0\x08\x34\xb8\x8f\xbb\x24\x45\x75\x19\x92\x86\xb0\xb9\x34\x4c\xf3\x34\xaf\xf0\x07"}, +{{0x4a,0xdc,0x8c,0x28,0x64,0x6a,0x93,0xa8,0x17,0x29,0x3a,0x14,0xd2,0x9b,0x48,0xe2,0xc6,0xd7,0x12,0xa6,0x89,0x93,0x54,0x7a,0x5c,0x5e,0x4d,0x14,0x52,0xac,0xbc,0x3a,},{0x7f,0x40,0x47,0x36,0x28,0xf2,0x3f,0xc0,0xdf,0xf0,0x02,0x1a,0xfd,0x48,0x77,0x40,0xd4,0x91,0x6a,0x91,0x22,0xe6,0xc9,0x7d,0x36,0x43,0x3e,0x5e,0xbf,0x04,0xf8,0x8c,},{0x6d,0x3b,0x4e,0x90,0xec,0x40,0x83,0x11,0xf9,0xb1,0x5b,0x92,0x53,0xd3,0xd9,0x5c,0x5d,0x15,0x26,0x20,0xc2,0x60,0xd5,0x63,0x02,0x55,0x5a,0x88,0x04,0xa5,0x10,0x4b,0xa5,0xe8,0xd2,0x9e,0xe1,0x08,0xe7,0x64,0xa6,0x42,0x19,0x29,0x72,0x98,0xab,0x76,0x74,0xbb,0xca,0x78,0x4d,0xee,0x28,0x77,0x3b,0x34,0xe1,0x85,0xa3,0x86,0xc2,0x08,},"\x09\xfb\x55\x01\xf1\x68\x8f\x80\xa0\xab\x9e\x22\xd7\x78\xae\x13\x0a\xca\xf7\x4d\x7f\x51\x85\xb4\xda\x19\x8c\x6b\x9e\xda\xc4\x30\x2e\x2b\x75\x3e\x57\x87\x66\xe1\x7d\x40\x56\xdc\x40\xd9\x5c\xf4\xca\x8b\xcc\x65\x65\x79\x5e\x97\xd6\x8b\xcd\xa7\x9f\xa7\x7c\x49\x33\x97\x71\x63\x56\x16\x4c\xaa\xb5\xd1\x9c\xfd"}, +{{0xf2,0x6e,0x1c,0x84,0x69,0x7a,0x49,0x08,0x15,0x1b,0x44,0x7d,0xcf,0x6c,0x7c,0x7a,0x38,0xb0,0x40,0x81,0xdb,0x9e,0x7c,0x77,0x38,0xe6,0xfe,0xc9,0x00,0xbe,0xd0,0xc1,},{0xa8,0x6e,0x14,0x22,0xc1,0x23,0x5f,0xf8,0xe1,0xaa,0x08,0x34,0x70,0xd5,0xe4,0x22,0x88,0xcb,0x00,0x7a,0xb5,0x0e,0x79,0x5d,0xd0,0xb4,0xff,0x87,0x39,0x49,0x66,0xc4,},{0x44,0xf3,0x34,0x4b,0x95,0x66,0xc9,0xdf,0xd2,0x2d,0x61,0x98,0xe1,0xcb,0xf9,0x5d,0x9e,0x28,0xf2,0x98,0x2f,0xc7,0xf1,0x66,0xab,0x25,0xdd,0xa3,0x0c,0x46,0xf7,0x68,0xc5,0x58,0xe0,0x39,0x4f,0xb9,0xab,0x3e,0x1d,0x4d,0xb4,0xcf,0x48,0x7c,0x17,0x64,0x1a,0x13,0xf3,0xf4,0x89,0x39,0xe0,0xc6,0x48,0x27,0xa7,0x51,0x03,0xc5,0x74,0x06,},"\x54\xed\x47\x60\x6a\x14\x87\xc2\xf9\x00\xce\xfb\x6e\x89\x9d\xba\xf6\xc3\x1c\xc8\x8e\xbe\x35\x58\xb8\x3b\x93\xf6\xd4\x22\xc3\x1e\x88\x8e\x48\xe5\x20\xee\xae\xdd\x7e\x55\x4a\x9c\xd4\x0c\x2c\x51\x9d\x53\x3b\x61\x44\xce\xe4\x84\xc3\x89\xe9\x76\xb1\xe4\x02\x2b\x50\xe7\xdb\xb8\x7e\xad\x7e\x54\x1a\x20\x04\xda\xf7"}, +{{0xcc,0x0c,0x33,0xf3,0xa8,0x6f,0x5a,0x17,0xd3,0x0c,0x18,0x6c,0xe0,0xf3,0xb7,0x40,0xba,0xfa,0x5f,0xe3,0xc7,0x09,0x0f,0x14,0x35,0x41,0xe2,0xb2,0xc1,0xe5,0x34,0xbc,},{0x96,0x7a,0x71,0xc7,0xcf,0x9b,0x82,0xcc,0x78,0xcb,0xe1,0x09,0x10,0x4d,0x8b,0x43,0x8a,0x8d,0x1f,0xd7,0x1d,0x26,0x0d,0x02,0x90,0x46,0xa9,0xa4,0x52,0x68,0x66,0xff,},{0xe2,0x77,0xb3,0xdd,0x65,0x5c,0x33,0xff,0x75,0xfa,0x92,0x0a,0xf1,0xfc,0xc8,0x59,0x40,0x1e,0x6c,0x7a,0x6e,0xf4,0xc6,0xbf,0xbf,0xac,0x50,0x69,0x63,0x8f,0x19,0xca,0x11,0x5b,0xaf,0x13,0xc0,0x9c,0x82,0xaf,0x79,0x3f,0xac,0xb6,0xab,0xd0,0xcd,0x58,0xe8,0x48,0x1b,0x08,0xc1,0xb6,0x8a,0xd7,0xa2,0x66,0x5c,0x4a,0x61,0x4a,0x28,0x06,},"\x19\x44\xe5\xe1\x55\xd7\x5e\x0d\x0b\xe9\x2e\x1b\xe1\x4c\xec\x37\x0a\xd1\x37\x91\xf2\xbf\xd4\x0f\x27\x12\x14\xe9\x4f\xcf\x21\x3c\x71\xbc\x20\xd7\xce\x0c\x75\x84\x42\x1a\xc4\xef\xc4\x51\x88\x3c\xc3\xf4\x95\x6f\x21\xf7\x3a\x42\x16\x72\x04\x38\xbc\x38\xff\x2c\xfd\xf3\x70\x99\x05\xa5\x0a\x9d\x94\xb1\xd9\xe7\x93\x2b"}, +{{0xf0,0xbc,0x97,0x93,0x75,0xa7,0x07,0x30,0x68,0xdb,0xa7,0xf6,0xc0,0x94,0xdb,0x65,0x98,0xb4,0xe4,0x5d,0xf7,0xd5,0x49,0x58,0x3c,0x22,0xfd,0xed,0x80,0x48,0xfa,0x2e,},{0xb4,0x2b,0x6c,0x57,0xa7,0x8f,0x1d,0x90,0x09,0x0a,0x71,0x81,0xab,0x2a,0xe0,0x9f,0x42,0x6c,0xbc,0x2b,0xe9,0x6e,0xb2,0xcf,0x27,0xab,0xc7,0x0d,0x7d,0x32,0xa4,0xb3,},{0x19,0xdb,0xc3,0x02,0x7f,0x9f,0xae,0x70,0x7d,0xeb,0x76,0xf5,0x88,0xf9,0xfd,0x07,0xaa,0x8e,0xae,0x29,0xbd,0x4e,0x1d,0x04,0xc2,0xc9,0x84,0x38,0x82,0x86,0xb3,0xb1,0x22,0x24,0x8a,0x6c,0x03,0xed,0x67,0xec,0xa3,0x5d,0xf4,0xdb,0x3d,0xc1,0xe4,0x23,0x7f,0x26,0x78,0x92,0x51,0x84,0x97,0xd9,0x55,0x2a,0x21,0xde,0x19,0xb5,0x14,0x0f,},"\x27\xab\x30\x49\xb5\xc6\x35\x1f\x6c\xfe\x38\xb1\x3a\x05\x9f\x50\x37\x25\x7e\xe3\xd6\x5d\x60\x79\x65\x68\x56\xed\xc8\x76\xea\x08\x1f\xd8\xa9\x48\x04\x66\xf8\x83\x94\x78\x08\x84\x66\xf5\x1e\xcb\xfa\xf2\xd6\x5d\xef\x25\xf0\xc4\xdd\x8d\x08\x58\x82\x02\x81\x22\x32\xf5\x79\x45\xdf\x8a\x6f\xa1\x61\xed\x8c\x03\x43\xb5\x83"}, +{{0x30,0x22,0x97,0x5f,0x29,0x8c,0x0a,0xd5,0xdd,0xbe,0x90,0x95,0x4f,0x20,0xe6,0x3a,0xe0,0xc0,0xd2,0x70,0x4c,0xf1,0x3c,0x22,0x1f,0x5b,0x37,0x20,0xaf,0x4d,0xba,0x32,},{0xb8,0x45,0xbc,0xe3,0x8e,0x26,0xab,0x02,0x7b,0x82,0x47,0x46,0x3d,0x43,0x7a,0x71,0xbb,0xdd,0xca,0x2a,0x23,0x81,0xd8,0x1f,0xad,0x4c,0x29,0x7d,0xf9,0x14,0x0b,0xd5,},{0xae,0x14,0xa8,0x60,0xfa,0xd0,0x05,0x1b,0x3e,0xb7,0x2b,0x37,0x21,0xa8,0x2f,0x7b,0x95,0x46,0xb2,0x86,0x72,0x61,0xe2,0xb7,0xb6,0x38,0x97,0x9e,0x25,0x61,0xbd,0xeb,0x89,0xb6,0x00,0x76,0x8f,0x82,0x45,0x0a,0x66,0xc8,0xb0,0x48,0x12,0x83,0xfa,0x21,0xcb,0x6c,0x53,0xbd,0xe3,0x50,0xef,0xfb,0x68,0xa7,0xd1,0x11,0x4b,0xfd,0xb2,0x03,},"\x9a\xa1\x9a\x59\x5d\x98\x93\x78\xcd\xc0\x68\x91\x88\x7e\xf5\xf9\xc2\x46\xe5\xf8\x3c\x0b\x65\x87\x10\x67\x3e\x4e\x7d\xb7\x60\xc7\x63\x54\xc4\xf5\xd1\xe9\x0d\xb0\x4a\x23\xb4\xfb\x43\x4c\x69\x38\x45\x93\xd0\x10\xe3\x12\xb1\x1d\x29\x9c\x9f\x97\x48\x2d\xe8\x87\xce\xcf\xe8\x2e\xa7\x23\xbc\xa7\x9a\x1b\xd6\x4d\x03\xef\x19\xee"}, +{{0x0f,0x71,0x0b,0x6c,0x48,0x1f,0x71,0x44,0x95,0x89,0x75,0x33,0x12,0xef,0x64,0x93,0x2b,0x46,0x52,0xeb,0xe0,0xe0,0x75,0x97,0xf7,0xda,0x1c,0x4f,0x3d,0xcf,0xfb,0x80,},{0x69,0x73,0xff,0x29,0x32,0xcc,0xdd,0xfc,0x1d,0x16,0xc4,0xc0,0xda,0x50,0xc8,0xb2,0x9f,0xe6,0x45,0x2d,0x1e,0xe8,0x4d,0x52,0x06,0x4e,0xbf,0x3d,0x62,0x8d,0x40,0x3e,},{0x02,0xa8,0xd2,0x6a,0xee,0x11,0x42,0x0f,0xb4,0xf0,0x9d,0x11,0x63,0xe1,0x4b,0x86,0x7d,0xf7,0xc6,0xf6,0xc8,0xf8,0xdc,0x7a,0x78,0x03,0x46,0x59,0xf0,0x40,0x1c,0xad,0x0a,0xa9,0x03,0x97,0xef,0xdd,0x07,0x04,0xb7,0x98,0xdb,0x19,0x36,0x50,0x30,0x26,0xe2,0xa1,0xad,0xc2,0x97,0xe2,0x79,0x74,0xd4,0xbe,0x31,0x2a,0x37,0x53,0xf8,0x04,},"\x85\xd8\x57\x44\xad\x55\xe9\xef\x9a\x65\xca\x91\xe8\x5c\x8a\x4f\x80\xe4\xc5\x8f\x8e\x4e\x93\x54\xe8\x33\x98\x60\x98\xb7\xd9\xfe\x9f\xdc\x0d\xed\xb0\xd7\x5d\x25\x39\xfb\xa0\x00\x34\xfc\x0c\x2e\x84\x34\x4d\x1e\xda\xa0\x9d\x4f\x63\xd5\x54\x6d\x67\x80\x3d\xd6\xb5\x4d\xdc\xc0\xb1\xd3\xf2\x58\x2d\xd7\x52\x89\xe3\x1d\xe4\x2e\x69"}, +{{0x7a,0x05,0xf1,0x21,0xf6,0x01,0x12,0xdd,0x16,0xfe,0xe8,0xc9,0x1b,0xc2,0xa1,0x14,0x79,0xf4,0xb6,0x7e,0xe3,0x34,0x56,0x04,0x2c,0x8d,0xe1,0x67,0xfc,0x58,0x80,0x17,},{0xb3,0xb0,0x5b,0xe9,0x89,0xce,0xa7,0x19,0x75,0x05,0xd4,0xb5,0x43,0x35,0xe5,0xe1,0xd7,0x7a,0x4b,0x52,0xba,0x72,0x82,0x60,0x4b,0xbc,0x1c,0xf6,0xc4,0xe8,0x7a,0x6c,},{0xd3,0x0c,0xe8,0xa3,0x22,0xb4,0x50,0xa2,0xfb,0x1a,0xfd,0x32,0x9c,0xec,0x85,0x59,0xcc,0xf1,0x12,0xbd,0x83,0x96,0x5f,0x9e,0xc4,0x73,0x62,0x70,0xa0,0x91,0x4e,0x06,0x11,0x96,0xbf,0x52,0x09,0x77,0x8c,0x9f,0x8c,0xcf,0x39,0xc4,0x66,0x8b,0xbf,0x0e,0x13,0x63,0xf8,0x1a,0xfe,0x45,0xdd,0x74,0xe8,0x0d,0x58,0x75,0xdd,0xbf,0x6f,0x01,},"\xd9\xc5\x9e\x8c\xc4\xed\xe5\x37\xbe\x21\x22\xab\x49\x2a\x5b\x91\x5a\x9b\x0a\x11\x4b\x2a\xde\x35\x6f\xc0\x45\x7e\xf9\x87\x22\xd5\xf5\x67\xb8\x62\x11\xe2\x83\x69\xd1\x41\x68\xec\x4a\x3c\x80\x40\x76\xe1\x54\xad\xc7\x0a\x66\x8c\xf6\x4a\x20\xd1\x3c\xf1\x90\xd1\x15\xcd\x68\x8d\x03\x6e\x46\x93\x82\x51\xdf\x49\x64\xdc\x35\x17\xb1\x0c"}, +{{0xbf,0x38,0x1f,0x8d,0xfb,0x5d,0x0c,0x6d,0x64,0xe4,0x16,0xac,0x23,0xe0,0xd0,0xfc,0xb8,0x6e,0xbb,0x89,0x9b,0x1d,0x14,0x6a,0xbd,0x91,0x1b,0x92,0xa7,0x80,0x8e,0xb6,},{0x86,0x3f,0xad,0x8d,0x1f,0x1b,0xc6,0x30,0xa1,0x5f,0x6f,0xe8,0xec,0xef,0xe6,0xb4,0x49,0x7b,0x60,0xb2,0x1a,0xe8,0x83,0x0d,0xa4,0x67,0x42,0x04,0x5f,0xef,0x15,0x6f,},{0x99,0xb7,0x53,0x78,0x73,0x8f,0xca,0xc8,0x06,0x76,0x69,0xe8,0x50,0x9b,0x5d,0x26,0x07,0xe1,0xef,0x76,0xaf,0x90,0x04,0xe1,0x3f,0xe5,0xd3,0x93,0x2d,0xf6,0x0b,0x16,0x82,0x16,0xf5,0x85,0x65,0x34,0x0f,0xa4,0xd6,0x38,0x05,0x5a,0x89,0x04,0x4e,0xe7,0xd4,0x5e,0x2b,0xd0,0x82,0xa5,0x33,0x82,0x28,0x9a,0x34,0x70,0x06,0x48,0x98,0x0e,},"\x86\x54\xf2\xf5\xc6\xdc\xd2\xcf\xcb\xb6\xed\x8d\x2b\xc5\xfb\x5f\xec\x53\xe3\xef\xfb\x0d\xe6\x5a\xac\x50\x7f\xa5\x6c\x89\x77\x32\x39\x5a\xa0\x99\x46\xd3\xb6\x58\x6a\x92\xed\xd6\xdc\x99\x31\x5e\x1b\xa7\x4c\x6a\x02\x47\xc4\xba\x77\x60\xb9\x48\xeb\x3c\x09\x32\xd9\xfe\x1f\x0e\x9f\xea\x6e\xb6\x1a\x54\x8a\x9a\xb4\x8f\xfd\xf1\x54\x73\x29"}, +{{0x36,0x98,0x32,0x41,0xa0,0xa8,0xe6,0x0c,0xe0,0x2a,0x61,0xb3,0xfa,0xfa,0xb1,0x5a,0x73,0x13,0xa5,0xa2,0x70,0xd0,0x15,0xb9,0xc9,0xec,0x07,0x0d,0xc4,0x2d,0xee,0xda,},{0x66,0x47,0x98,0x4d,0x42,0xb9,0xa5,0xb3,0xb1,0xaf,0xa3,0xb7,0xf8,0xf4,0x9d,0x4c,0x2b,0x05,0xe3,0x89,0x84,0xe9,0x9c,0xea,0x8f,0xd6,0x82,0x35,0xd2,0xae,0x46,0x27,},{0xee,0x37,0xdf,0x8a,0xf4,0x22,0xf9,0x1f,0x85,0xdf,0xe4,0x3e,0xfe,0x79,0xf6,0x23,0x78,0x06,0x8c,0xcd,0xba,0xf3,0x91,0x6e,0xec,0xbc,0x3a,0xdf,0xed,0x05,0x08,0xbd,0xeb,0xaf,0x5c,0xe0,0x6b,0x3b,0xc2,0x79,0xf7,0x80,0x87,0xf0,0xdb,0x8d,0xb3,0xc6,0x82,0x3e,0xdf,0xb3,0x2c,0x12,0x21,0x78,0x30,0xbe,0x72,0x3d,0x88,0x72,0xb3,0x0c,},"\xce\xbb\x9e\x40\x44\x51\x81\x82\x53\xc0\x39\x2a\x45\x54\xee\x73\x23\xc5\xd5\xb8\xb2\x26\x77\x57\x00\xb8\x06\xed\x5b\x91\x33\x79\x16\xea\x7e\xcb\xc3\xd4\x10\x3f\xc6\x5e\x53\x72\xae\x7e\x5f\x9b\xa2\xd8\xf5\xae\xe2\x4c\xcf\x6e\x63\x1a\xe2\x0c\x4a\xf9\xb5\xf7\x28\xcd\xf8\x9e\x81\x89\xde\xf1\xa5\xb3\xd3\x53\x47\xaa\x20\x35\x25\xea\x1d\x2e"}, +{{0xd0,0x68,0x99,0xf9,0x3a,0x40,0x8d,0xac,0xb4,0x1c,0x96,0x97,0x18,0x34,0x6f,0x1e,0x28,0x9b,0xb5,0xea,0x65,0xe2,0x83,0xff,0x79,0xc7,0x05,0xa0,0x74,0x51,0x7c,0x35,},{0x46,0xbf,0x2a,0x08,0xa0,0x76,0xc4,0x7d,0x7f,0x11,0xb7,0x33,0xf8,0x14,0x1c,0x35,0x53,0x63,0xed,0x85,0xd7,0xde,0xf2,0x6b,0xa6,0xa0,0xce,0x15,0xac,0x5f,0x2b,0xe8,},{0x6f,0x89,0xde,0x92,0xa6,0x6b,0xc5,0xf4,0x14,0x43,0x39,0x12,0x49,0x50,0xbd,0xf5,0x88,0x14,0x4c,0xb3,0x72,0xf6,0x73,0x62,0x45,0x35,0x1c,0x94,0x76,0xbe,0xcc,0x59,0xa2,0x58,0xf9,0xa9,0x33,0xff,0xff,0x2b,0xef,0x4b,0x46,0xcd,0x10,0x57,0x39,0x52,0x25,0x79,0x9f,0xd0,0x9d,0xed,0xe6,0x82,0x3d,0xb0,0xe3,0x25,0xdb,0xc8,0x14,0x0d,},"\x08\x64\xc3\x9a\xc4\xfd\xa8\xeb\x90\x48\x59\x7b\xd4\x0b\xe0\x40\x10\x21\xfd\x2d\xd3\xa3\x39\x0a\x8f\xac\xce\x98\x4b\x26\x0a\x13\xfa\x2c\x7c\xfc\x00\xd1\x92\xfa\xdf\x13\x4a\x0a\xd5\xa1\x81\xee\x89\xef\xf0\xc7\x95\xea\xa0\xfb\xfe\x2f\x3b\x26\x11\x5d\x07\x16\x8d\xb4\x2e\xd2\x1a\x51\x30\x3b\x19\x58\xe4\xa4\x2d\xc0\x65\xb2\x2c\xe4\x8f\x17\xa6"}, +{{0xee,0xbc,0xa7,0x96,0x69,0x70,0xee,0x9f,0x2c,0xc4,0xd7,0x4c,0x6f,0x1d,0x8e,0x0e,0xbf,0xf7,0xc4,0x5a,0xeb,0xad,0x34,0x9f,0xb9,0xf8,0x6d,0xf6,0x28,0xdf,0xff,0x0e,},{0x89,0x10,0x1e,0x03,0x09,0xf7,0x67,0xe6,0x4a,0xe9,0xc9,0x8c,0x4a,0x5d,0x8d,0x23,0x28,0xfb,0x3e,0xf2,0x62,0xd0,0x82,0xf4,0x9b,0x64,0xca,0x20,0x9e,0x19,0x90,0xf6,},{0x7d,0x44,0x7e,0xe5,0x32,0x8c,0x9f,0xe7,0xf1,0x19,0x36,0xcc,0x42,0x99,0x87,0x54,0xa5,0x6c,0xd1,0xd2,0xa6,0x95,0x1a,0xf4,0xfe,0xe7,0xc4,0xa8,0xeb,0x31,0x9d,0x49,0x23,0x70,0x7c,0x79,0x3c,0x55,0xd7,0x90,0x67,0xf8,0x22,0xd5,0xb1,0x6b,0xb5,0x77,0x6e,0x38,0xdf,0xfa,0xbc,0x67,0x23,0x7a,0x91,0x6a,0x81,0xa6,0x33,0x39,0xb0,0x03,},"\x0f\xac\x79\x0a\xdb\x9f\x59\xe5\xcb\x0d\xdc\xb2\xb6\x67\x17\x2f\x2a\x21\x03\x4d\x93\xbc\xad\xdf\x18\x86\x06\xfa\x9e\x77\x6d\xb3\x3a\x8f\xcc\x6b\xd7\xf5\x56\x78\x83\xfc\x0d\xe3\x51\xaa\x9a\xfa\xa3\x6d\x20\x75\xb1\xba\x85\x3b\xad\xa8\x49\xb8\x66\x1d\x5c\x81\x54\xe7\xb0\xaf\xea\x65\x6d\xd1\x5e\x01\xa9\xc5\xba\x21\x58\x9b\x02\xf8\xfc\x54\x81\xc2"}, +{{0x38,0x20,0xb6,0xb1,0x59,0x39,0xd0,0xaf,0xe1,0x8c,0x9c,0xb3,0xd9,0xa2,0xa0,0x8f,0x16,0x7d,0xd4,0x58,0xeb,0x6c,0x7e,0x3f,0x15,0x58,0xb0,0xc6,0xdb,0x4c,0x68,0x90,},{0x80,0xb8,0x5c,0x65,0x59,0xfe,0xa8,0xb4,0x00,0xe1,0x99,0x9c,0xc5,0xbf,0xed,0x50,0x7a,0xd7,0xfc,0x29,0x4c,0xd9,0xba,0x0c,0xe2,0xdd,0x25,0x84,0xa9,0x10,0x89,0xb0,},{0x82,0x3e,0xe2,0xc0,0xc8,0xd8,0x7f,0xaa,0x0e,0xc0,0x14,0x1e,0x9c,0xe0,0x8b,0x51,0xe5,0x7c,0x83,0x97,0x92,0xd1,0xfb,0xd9,0x7a,0x96,0x72,0x07,0xfd,0x41,0x58,0x49,0xeb,0xfb,0x5d,0xad,0xb5,0xa1,0xdc,0x2c,0x0a,0x8b,0x7f,0xc6,0x3f,0xc3,0x54,0x85,0x7b,0x8c,0x90,0xc4,0x47,0x20,0xe1,0x3f,0x45,0xcd,0x01,0xe7,0xaa,0x23,0x14,0x0c,},"\x3e\x5a\xd9\x2d\x44\xb4\x0e\x86\x14\xd8\x08\x7c\x9c\x74\x3d\xe0\xc0\x86\x1a\x07\xf1\xf5\x14\x6d\x71\xca\xc2\xf3\x74\x00\x24\xe8\x41\xcc\x2d\x46\x02\x7c\xf5\xd2\x61\xd3\xee\x7c\x18\x75\xb3\x95\x51\x01\x7b\x5f\xb1\x46\x81\x14\xfc\x3e\x09\x8a\x89\x9c\xdb\xd5\x58\xb3\x9f\x09\x8e\x15\x6b\x6e\x98\x01\xeb\xcd\xd6\x5f\xed\x56\xdb\xfc\xaf\x2c\x8c\x78\x7b"}, +{{0x0d,0x20,0xfa,0x4a,0x37,0xff,0x30,0xc4,0xdc,0xc3,0xe4,0x4e,0xa7,0xac,0x50,0x11,0x37,0xe5,0x80,0x7e,0x97,0x81,0x33,0x0a,0xc3,0x10,0x98,0x2c,0xc3,0xd3,0x9d,0xbd,},{0x67,0xbb,0x0a,0x01,0xbc,0x86,0x17,0xb4,0x91,0xef,0xf1,0xa3,0x26,0xc1,0xc7,0x0f,0x7d,0x0c,0x5b,0x95,0xa5,0xad,0x48,0x24,0x1a,0xed,0xce,0x1c,0x6f,0x08,0x83,0xcf,},{0xde,0xab,0x12,0xed,0x82,0xba,0x94,0xb4,0x69,0xca,0x98,0xb6,0x6f,0xa2,0x04,0x44,0xb4,0xb7,0x88,0x1c,0x4f,0x0f,0x85,0x34,0x09,0xc9,0xa1,0x50,0x4a,0x5b,0x2b,0x6d,0x78,0x60,0xf2,0x6a,0xda,0x6b,0xf7,0x34,0x59,0xb9,0xcd,0xb5,0x73,0xc8,0x01,0x71,0x21,0x33,0x8e,0xfa,0x60,0xf4,0x14,0x80,0x86,0xd7,0xa3,0xa8,0xed,0x59,0xbb,0x07,},"\x35\xe0\xf4\xb4\xa5\x17\xf9\xc7\xaa\x45\x14\xf0\x3e\x6d\x65\xf1\x9b\x27\xc6\x2c\xc0\x69\xf6\xbf\x07\xdd\x63\x78\xbd\x6a\xfe\x2b\x76\x65\x60\x00\x6c\xbd\x57\x30\xa0\x09\x19\xed\x11\x19\x1f\xb0\xc8\xda\xc5\x6e\x15\x3f\xc1\xce\xa4\xbd\xce\x50\x46\xcc\xcb\x71\x77\x59\xa4\x08\x3e\x1c\x16\xf7\x40\x76\x32\x64\xcc\x80\x4d\xe0\xd0\xe1\xa4\xb5\xa2\x30\x67\xaf"}, +{{0xbe,0xe1,0x61,0x88,0x1d,0x81,0x9b,0x37,0x0d,0x24,0x0d,0x50,0x9b,0xa4,0x6b,0x06,0xfb,0x82,0x8e,0x20,0x31,0x0d,0x9f,0x6b,0x30,0x97,0x80,0x70,0x3e,0x98,0x92,0x7b,},{0x10,0x85,0x43,0x80,0xde,0x89,0x16,0x2b,0xfb,0x9f,0x78,0x35,0xa2,0x71,0x6a,0x3a,0x6e,0x02,0x65,0x67,0x1b,0x25,0x0b,0x38,0x9d,0x01,0xc3,0xbc,0xc0,0x37,0x36,0xb8,},{0xb0,0x7d,0x07,0x2e,0xb3,0x83,0x1f,0xae,0x8a,0x06,0xef,0xfa,0x92,0x01,0x79,0x74,0x96,0xdc,0xe1,0x26,0xb8,0xe1,0x1f,0xef,0x2f,0xa0,0x7f,0x66,0x4d,0xc5,0xcf,0x3d,0x4b,0xf9,0xc3,0x8a,0x8b,0x3c,0x09,0xfb,0x5f,0x14,0xfa,0x2d,0xeb,0x21,0x9e,0x7d,0x85,0x2f,0xdd,0x27,0xc7,0xba,0x32,0xd3,0x09,0x94,0x2f,0x27,0x46,0xdf,0xe4,0x04,},"\x5a\x6f\xe5\x99\xb6\xb0\x9b\x05\xc0\xba\x6a\x62\x2d\xf3\xa9\x2b\x3d\x37\x6d\x24\xd0\x4e\xa8\x5e\xbe\x76\x7b\xc2\xec\x4d\x14\xe8\x3e\x69\x37\xdc\x0b\x91\x4b\x48\x09\xfd\xb6\x07\x90\x68\x41\xa6\xfd\x1d\xcd\xf6\x1a\xae\xa8\xf9\xbb\x81\xb2\xcc\xaa\x32\xdf\x41\x29\x89\xae\x53\x64\x66\x80\xa7\x1a\x21\x1c\x84\x40\xea\xb0\xf1\xae\xc5\xe4\xfc\x00\xe6\xa2\xc9\x6d"}, +{{0x70,0x15,0x0e,0x95,0x16,0x16,0x4a,0x3d,0x7b,0x7e,0x8b,0x6f,0x25,0x5b,0x65,0xca,0xc9,0xf0,0x74,0x59,0xb3,0x2d,0x11,0xbb,0x94,0xb3,0xd2,0x77,0x20,0x8a,0xbc,0x99,},{0x23,0x28,0xbe,0xc8,0xe4,0x03,0x51,0x04,0x78,0x82,0xe8,0xb4,0x3b,0xc1,0xab,0x08,0x53,0x86,0xfa,0x47,0x98,0x7e,0x46,0xea,0x87,0x60,0x88,0x14,0xc5,0xda,0x71,0x3c,},{0xed,0xa3,0xf5,0x03,0x3e,0xa7,0x95,0x3a,0x0d,0x58,0x3c,0x64,0x57,0x52,0x2e,0x84,0xad,0x78,0x44,0x53,0x04,0xd4,0x8e,0x57,0x7d,0x4d,0x69,0xe8,0x64,0x1f,0xeb,0xe1,0x52,0x48,0xd8,0xd9,0x0c,0xe0,0x94,0x4a,0x8f,0x80,0x1d,0x39,0x09,0x9b,0xc7,0x74,0x94,0xba,0xc4,0xce,0x2a,0x20,0xb3,0x83,0x69,0xc6,0xad,0xfb,0x71,0xe0,0x3d,0x0f,},"\x77\xbe\x8e\xce\xaa\xb4\x31\xa1\x3c\x2a\x28\xd0\xd1\x55\x64\x89\xd8\xc3\x92\xfd\x7a\xe4\x11\x57\xf7\xca\xf0\x82\xcb\x54\xe4\x5f\x08\x62\x6b\xe0\x07\x6b\xe8\x44\xd3\x8f\xde\x90\x1a\x5e\xab\x0e\x88\x32\xd6\x9d\xac\x22\xfb\x85\x07\xfb\x8e\xc4\xfa\xf7\xc8\x8f\xd2\x6d\xa3\x08\x46\x1a\xfe\x38\x59\x87\x97\x2b\x5e\x76\x0a\x34\xa5\xe1\x8b\x9a\x82\xb4\xaa\xa5\x29\xb7"}, +{{0x3f,0x87,0xfc,0xfd,0xb4,0x21,0x42,0x2a,0x9c,0x5f,0xb9,0x82,0x68,0x31,0x3c,0x15,0x12,0x8c,0x78,0x84,0x4e,0xf9,0xeb,0x3b,0x37,0x13,0xfa,0x77,0xb6,0x71,0x89,0x03,},{0x53,0x3e,0xc5,0x92,0x28,0x37,0x4b,0xd0,0x3a,0x46,0x99,0xe3,0xa8,0x89,0x6b,0x86,0x18,0x2f,0xcf,0x8f,0xc3,0x08,0x5f,0xdb,0x8f,0x5c,0x46,0x71,0x52,0x4d,0x6f,0xe0,},{0xf6,0x51,0x9d,0x7e,0xdb,0x61,0x34,0x11,0x19,0x74,0x03,0x3f,0x03,0xb8,0xd8,0x9e,0x9c,0x76,0xca,0xec,0x89,0x65,0xa8,0xe1,0x7c,0xd4,0x5f,0xff,0x19,0xde,0x26,0x15,0xd7,0x3e,0xcc,0xdb,0x4a,0x66,0x64,0xa8,0xf0,0xe2,0x3a,0xdf,0x98,0x98,0x8e,0x96,0x25,0x1b,0xf2,0x6e,0xb7,0xa4,0xcc,0xaa,0xc1,0x07,0x9f,0x0a,0x77,0x2f,0x9b,0x05,},"\xc0\x0f\xed\x2d\x68\x94\x68\xbc\xba\xcc\xcd\x44\x6e\x8d\x8f\x29\x9e\x2a\x86\x92\x5e\x62\xe5\x97\x09\xaf\xaf\x48\x57\x46\x9f\xf1\xe0\x06\xd0\x0f\xa3\xe1\x8a\x36\x15\xf8\xf0\x6b\x6e\xbd\xff\x78\x5d\xde\x58\x85\x1d\x2c\x23\x90\x38\xa0\xc3\x44\xdc\xe9\x85\xbd\x1f\xc8\xde\xb4\x77\x9a\xe5\xf8\x93\x2e\x2f\x9e\xd5\x99\x0b\x64\x72\xdb\xe4\xe6\xfe\xf6\x91\x76\x57\xe0\xb5"}, +{{0x44,0xce,0xef,0x04,0x4f,0xf9,0x98,0xd4,0xab,0xea,0xaf,0x37,0x4e,0xb4,0x1d,0x08,0x67,0x18,0xb6,0x30,0x97,0xb1,0xe3,0x5f,0x89,0x63,0x4c,0x14,0x89,0x71,0x32,0xea,},{0xe8,0x3c,0x86,0x67,0x7d,0x03,0xed,0x3a,0x5e,0x8c,0x95,0xf4,0x1f,0x0b,0x32,0x5f,0xf4,0x33,0x37,0x02,0xf2,0xff,0x69,0x36,0xf5,0x7f,0xf3,0x0a,0xa3,0x14,0x85,0xc7,},{0x55,0x45,0x52,0xd6,0xb7,0x90,0xd4,0x21,0xd0,0x6b,0x0a,0x67,0xf8,0xe0,0x02,0xad,0x7a,0x1e,0xd0,0x1c,0x06,0xcf,0x00,0xcb,0xea,0xec,0x2a,0x26,0x8b,0xda,0x29,0xf1,0x18,0x3f,0x0c,0xea,0xfc,0x62,0x5f,0xa5,0xfd,0xb8,0x47,0xdc,0x86,0xfa,0xe1,0xa2,0x04,0x06,0xe4,0x59,0xd4,0xa0,0x17,0x7c,0xb5,0x15,0x22,0x0a,0x56,0x8e,0x08,0x00,},"\x8d\x3e\x2d\xec\x46\x44\xc7\xb5\x16\x33\xb1\x3e\x63\x75\xca\x42\xff\x91\x38\x46\x5f\x43\xd7\x80\x0c\x73\x13\x19\x9f\x67\xc9\xcf\x1b\x52\x0b\x18\x20\xbd\x63\x0e\xcf\x1c\x99\x2e\x27\x67\xb3\x8e\xb5\xbb\xc4\x41\xa4\xab\x8d\x31\x7d\xb4\x41\xdb\x35\xa0\xfe\x3a\xbe\x7a\x9e\x45\x41\x88\x1c\x2d\x7b\x1a\x26\x12\x30\x69\x59\x81\x5d\x1d\xa4\x12\x67\xd9\x64\x9d\xd4\x49\x4a\xce"}, +{{0x98,0xef,0x2a,0x44,0xd4,0xc8,0x47,0x6d,0xff,0x05,0xaa,0x78,0xdc,0xf9,0xc6,0xdc,0x08,0x6c,0xb2,0xf6,0x22,0xa0,0x67,0x45,0xd6,0x0c,0xbf,0x22,0x3f,0xaa,0xba,0x66,},{0x42,0xfd,0xb1,0xda,0xa3,0x9f,0x01,0x59,0x11,0x9b,0xee,0xc1,0xbe,0xdf,0x6f,0x03,0x94,0xb2,0x6a,0x2a,0x29,0xbd,0x1f,0xde,0x08,0x1e,0xcc,0xda,0xde,0xcc,0x22,0x6a,},{0xab,0x5e,0x87,0x24,0xa3,0xe6,0xff,0x76,0x05,0x8c,0xfb,0x21,0x4d,0x57,0x4e,0x04,0xd0,0x55,0x74,0xec,0xdd,0x4f,0xfe,0x8c,0x07,0xc7,0xaf,0x39,0x6e,0x88,0x26,0x87,0xc5,0xd7,0x9e,0xf1,0xe6,0x2f,0xbb,0x4c,0x5f,0x1b,0xd0,0x6b,0x9b,0xd8,0x97,0x82,0x6e,0xdd,0xe0,0xd1,0x11,0xd9,0x18,0xe8,0xef,0x96,0x1f,0xf2,0xa0,0x0d,0x77,0x00,},"\xc8\xb5\xfc\xfc\x3c\x18\xc7\xd9\x59\x57\xb6\x68\xe9\x1c\x73\x1d\x50\xc7\xfc\xea\x4f\x95\x75\xbb\xf7\x84\x62\x58\x70\xe2\x38\xdf\x54\x6e\x2c\xb1\xa1\x9d\x28\x08\xdd\x5b\x23\x0d\x38\x71\xfd\xec\x16\x10\x0e\xe1\xfb\xf9\xb7\x22\xfa\x37\x44\xa7\x50\xa3\xb3\x96\xb0\x5f\x9c\x21\xb8\xc0\xf6\x1e\xad\x57\xa7\x8c\x5e\xcf\x72\xb5\x79\xcf\xe8\x8a\x3f\x40\x4c\x8a\xcf\x52\x4f\x9a\xb9"}, +{{0x93,0xa8,0xc7,0x92,0xa2,0x39,0xc9,0x31,0x91,0x7c,0x11,0x48,0x24,0xa0,0x17,0x4f,0x8b,0xc4,0xeb,0xbf,0x98,0xaf,0x8c,0x7e,0x32,0x1e,0x0f,0x5b,0xea,0x40,0x15,0xec,},{0x9b,0x2e,0xaa,0x8a,0x9c,0x2c,0x25,0xff,0x4f,0x6e,0x13,0xbb,0x12,0xba,0xe5,0xd0,0x6f,0xda,0x0e,0xb1,0x10,0x5f,0xaf,0xae,0x58,0x80,0xff,0x16,0x87,0x40,0xbb,0x74,},{0xcf,0xe3,0x2c,0x44,0x35,0xd9,0x11,0xd7,0x72,0xdc,0x07,0x27,0xe7,0x8d,0x68,0x9d,0x01,0x64,0xc5,0x06,0x95,0x97,0xcb,0x44,0x1b,0x22,0xc1,0xd2,0x62,0x36,0x47,0x9f,0x1a,0xfd,0x70,0x89,0x12,0x1b,0x9a,0xb4,0xf6,0x1b,0xbb,0x1f,0xae,0x1a,0xb4,0x2f,0x76,0x35,0xa9,0x2a,0x53,0x78,0x4d,0x71,0x70,0x91,0x6b,0x70,0x3a,0xa5,0xcc,0x09,},"\x90\x1b\xf4\xe0\x41\xca\xf1\x6e\x04\xf2\xff\xde\x8d\x6f\xe9\x7e\x93\xd0\x90\x0f\x6b\xc0\xfc\x09\xa9\xa0\x17\x9d\x13\x7b\x4b\x77\x88\xe5\x7e\xb9\x27\x66\xa9\xc6\x34\xf3\x5a\xdb\x5c\x29\x88\xaf\x1e\x86\x20\x8f\x46\x19\x98\xf5\x9c\xfe\xc9\x92\x04\xb4\x84\xfb\xca\xd3\x95\x1e\x7e\xe4\x40\x55\x23\x70\x5d\x97\x39\xb4\x43\x07\xdb\x03\xf7\x13\xfd\xa7\x8d\xb4\x21\xef\x31\x21\xb3\xba"}, +{{0x70,0x01,0xfa,0x0c,0x44,0x04,0xc2,0x8a,0xa5,0xb5,0xfc,0xff,0x30,0xa9,0x61,0xf2,0x1a,0x22,0xf5,0xb8,0x5a,0x9e,0x38,0x2e,0x07,0xae,0xa8,0xa8,0x92,0x4d,0x0e,0xc1,},{0xda,0xeb,0xb6,0x3c,0x4d,0x8f,0x40,0xce,0xba,0x8e,0xc3,0x5e,0x3d,0xd9,0x46,0xa6,0xb7,0x5b,0xc7,0x4f,0xcb,0x29,0xad,0xe7,0xb5,0x5e,0xee,0x3c,0xc3,0xae,0xa5,0xca,},{0x64,0xea,0xc9,0xce,0x87,0x46,0x06,0x18,0x63,0x6b,0x41,0xfd,0x2d,0xec,0xc1,0x67,0x3b,0xfc,0x48,0xc5,0xf4,0x79,0xdf,0xac,0xb5,0x1e,0x86,0x68,0x64,0x07,0x37,0x4b,0x1d,0x10,0xbf,0x65,0xd6,0xd7,0x47,0x42,0x14,0xd7,0x77,0x0c,0x9e,0x5c,0x7f,0x80,0x6c,0x80,0xd5,0x3d,0x48,0xb7,0x20,0x87,0x0e,0x5e,0x78,0xf3,0x2e,0x3a,0x7e,0x05,},"\x44\xf4\x8c\xfb\x02\xf0\x87\x77\xa5\x78\x73\x85\x5f\x96\xbe\x4c\x02\x91\x32\x3f\x27\x39\xb2\x75\xd9\x07\x57\xa1\x54\x72\xe5\x75\x04\x36\xe0\x10\x74\x08\xfe\x30\x26\xc0\x06\x25\x68\x99\x83\xf9\x90\xeb\xa9\xbe\xcb\xfc\xe4\x03\xcc\xd5\x63\x56\xad\x27\x41\xfd\x21\x44\x5d\xfb\x23\xd7\x61\x12\xe5\x78\xb3\x39\x5c\xf9\xd9\x60\x95\x5f\x1d\xa8\xf3\x99\xca\x28\x6f\x21\x39\x0e\x25\xa5\x9a"}, +{{0x3a,0xdc,0xe3,0xa3,0xd3,0xfb,0xc9,0x77,0xdd,0x4b,0x30,0x0a,0x74,0x74,0x9f,0x13,0xa3,0xb0,0x4a,0x5d,0x73,0xa2,0xcd,0x75,0xa9,0x94,0xe3,0x19,0x5e,0xfe,0xbd,0xac,},{0x6f,0xf1,0x9b,0x1f,0x18,0xd6,0x48,0x51,0xd5,0xc7,0x48,0x45,0xc6,0x40,0x7f,0x0b,0xf5,0x96,0xa5,0x2e,0x38,0x5e,0x02,0x01,0x27,0xe8,0x3e,0x54,0xcf,0xf5,0xac,0x19,},{0x7d,0xda,0x89,0xf8,0x5b,0x40,0x53,0x9f,0x5a,0xd8,0xc6,0xde,0x49,0x53,0xf7,0x09,0x4a,0x71,0x5b,0x63,0xdd,0xa3,0x0e,0xc7,0xcf,0x65,0xa7,0x85,0xce,0xae,0x5f,0xc6,0x88,0x70,0x7e,0xe0,0x0b,0xe6,0x82,0xce,0xcb,0xe7,0xee,0x37,0xd8,0xfc,0x39,0xee,0x6d,0x83,0xc6,0x44,0x09,0x68,0x17,0x08,0xa0,0x89,0x8a,0x18,0x3b,0x28,0x8a,0x06,},"\xfe\x6c\x1a\x31\x06\x8e\x33\x2d\x12\xaa\xb3\x7d\x99\x40\x65\x68\xde\xaa\x36\xbd\xb2\x77\xce\xe5\x53\x04\x63\x3b\xd0\xa2\x67\xa8\x50\xe2\x03\xbb\x3f\xab\xe5\x11\x0b\xcc\x1c\xa4\x31\x66\x98\xab\x1c\xf0\x0f\x0b\x0f\x1d\x97\xef\x21\x80\x88\x7f\x0e\xc0\x99\x1e\x8c\x11\x11\xf0\xc0\xe1\xd2\xb7\x12\x43\x3a\xd2\xb3\x07\x1b\xd6\x6e\x1d\x81\xf7\xfa\x47\xbb\x4b\xb3\x1a\xc0\xf0\x59\xbb\x3c\xb8"}, +{{0x14,0x80,0x3c,0x1f,0x23,0xa4,0x7f,0xcd,0xd3,0x5e,0x5d,0x14,0x6e,0x20,0xca,0x63,0x0c,0xd7,0x12,0xc0,0x47,0xd5,0x33,0x0b,0x65,0x2e,0x31,0x85,0x7a,0xcb,0xc9,0xe8,},{0x36,0xf2,0xd5,0xbd,0x6d,0x83,0x24,0xfa,0x6e,0x9d,0xb7,0xf7,0xd8,0x54,0xeb,0xe4,0x8c,0x0e,0x62,0x99,0x99,0x81,0x22,0xe9,0xd4,0x4b,0x8a,0xdb,0xef,0x54,0xf0,0x93,},{0x07,0xa7,0xde,0x6c,0xe9,0x76,0x64,0xb3,0xea,0x09,0x28,0xe1,0x38,0x5c,0x33,0x09,0xbe,0x08,0xa4,0x7c,0xbf,0x4d,0xaa,0x91,0x86,0xa1,0xb9,0x48,0xc8,0x6f,0xbb,0xa3,0x9c,0x4e,0xfc,0xfc,0xb7,0xa0,0xa3,0x86,0x6b,0xc9,0x4c,0x67,0x88,0xff,0xe6,0xbe,0x0d,0x49,0x72,0xe5,0x6d,0x0c,0x32,0x92,0xd1,0xcc,0x6e,0x25,0x44,0x7b,0x99,0x04,},"\x55\x59\x83\x67\x9d\x02\x6e\x53\x54\xb4\xcc\x05\x5a\xe1\xbc\x14\x65\x3c\x72\x81\xec\x72\x23\x72\xf3\xfe\xb7\x78\xe8\x41\xda\x82\x1b\x3d\x0b\x8e\xe7\xa9\xa9\x12\x9e\xa0\x68\x24\xbe\x83\x79\xfb\xbd\xcb\x07\x48\xf4\x23\x72\x1c\xcb\x17\x2a\x1b\xaf\xa1\xd5\xae\x9f\xc1\xc5\x1e\x93\xd4\x1d\xd5\x51\xc3\x08\x60\x79\xb6\x20\x28\x6c\x1c\x40\xc1\x22\x3b\xbc\xbb\x76\x72\x2e\x92\xca\x21\xd8\x41\x0a"}, +{{0x1a,0x61,0x15,0x4d,0x34,0x72,0xcd,0x96,0xb3,0x28,0xee,0x67,0x4b,0xeb,0x4f,0xc8,0x67,0x63,0xa9,0x69,0xfb,0x41,0x04,0x94,0xe0,0x67,0x84,0x14,0xe3,0x1a,0x46,0xa6,},{0x75,0x76,0xd9,0x3a,0xc8,0x5d,0x0f,0xc6,0x1f,0x25,0x8c,0x55,0xcf,0x90,0xbd,0x87,0xa6,0x35,0x09,0x9c,0x0e,0x81,0x0e,0xd0,0xb9,0x37,0x25,0x8d,0x13,0xb4,0x25,0x59,},{0xad,0xa1,0x66,0x6c,0x9c,0x3b,0x82,0x84,0xb8,0xa2,0x1c,0x4f,0x26,0x18,0xef,0x08,0x08,0xa6,0x46,0xf3,0xf1,0x09,0x41,0xe4,0x70,0xf7,0x38,0xe1,0x78,0x5e,0x2d,0xe9,0xfd,0xd9,0xc8,0xcb,0x52,0x6f,0x94,0x5c,0x7a,0x8c,0x69,0x94,0xf1,0x51,0xb7,0xd0,0x66,0x58,0x1b,0x1d,0x75,0x53,0x07,0x94,0x7c,0x62,0xbe,0xfc,0x8a,0xb7,0x07,0x0f,},"\x64\xc5\x65\xef\xbc\xb8\xb9\x52\x8e\xd4\x72\x53\xf3\xc6\xa4\x03\x5d\xb7\x81\xd6\xf0\x97\x6b\x5e\x5b\xa8\x44\x7d\x4e\xd5\x4b\x04\x10\x52\x93\xef\x4c\x00\x0d\x8b\x2e\x1b\x5b\x75\xe7\x27\xe5\xd2\xa0\x77\x74\x3b\x50\xd1\x83\xb4\x91\x76\x48\x01\xa2\x50\x4d\x16\xee\x6d\x7d\x8a\xc4\xfe\x40\xe6\xbf\xc2\xa8\x12\x9c\x72\x85\xa5\xac\x69\x1c\x35\xe6\x42\xed\x16\x2c\xf7\xfb\xc6\x45\x16\x73\x3a\x23\xb3"}, +{{0xf2,0x15,0xd3,0x4f,0xe2,0xd7,0x57,0xcf,0xf9,0xcf,0x5c,0x05,0x43,0x09,0x94,0xde,0x58,0x79,0x87,0xce,0x45,0xcb,0x04,0x59,0xf6,0x1e,0xc6,0xc8,0x25,0xc6,0x22,0x59,},{0x1e,0xd5,0x06,0x48,0x5b,0x09,0xa6,0x45,0x0b,0xe7,0xc9,0x33,0x7d,0x9f,0xe8,0x7e,0xf9,0x9c,0x96,0xf8,0xbd,0x11,0xcd,0x63,0x1c,0xa1,0x60,0xd0,0xfd,0x73,0x06,0x7e,},{0xcb,0xef,0x65,0xb6,0xf3,0xfd,0x58,0x09,0x69,0xfc,0x33,0x40,0xcf,0xae,0x4f,0x7c,0x99,0xdf,0x13,0x40,0xcc,0xe5,0x46,0x26,0x18,0x31,0x44,0xef,0x46,0x88,0x71,0x63,0x4b,0x0a,0x5c,0x00,0x33,0x53,0x41,0x08,0xe1,0xc6,0x7c,0x0d,0xc9,0x9d,0x30,0x14,0xf0,0x10,0x84,0xe9,0x8c,0x95,0xe1,0x01,0x4b,0x30,0x9b,0x1d,0xbb,0x2e,0x67,0x04,},"\xfb\xed\x2a\x7d\xf4\x18\xec\x0e\x80\x36\x31\x2e\xc2\x39\xfc\xee\x6e\xf9\x7d\xc8\xc2\xdf\x1f\x2e\x14\xad\xee\x28\x78\x08\xb7\x88\xa6\x07\x21\x43\xb8\x51\xd9\x75\xc8\xe8\xa0\x29\x9d\xf8\x46\xb1\x91\x13\xe3\x8c\xee\x83\xda\x71\xea\x8e\x9b\xd6\xf5\x7b\xdc\xd3\x55\x75\x23\xf4\xfe\xb6\x16\xca\xa5\x95\xae\xa0\x1e\xb0\xb3\xd4\x90\xb9\x9b\x52\x5e\xa4\xfb\xb9\x25\x8b\xc7\xfb\xb0\xde\xea\x8f\x56\x8c\xb2"}, +{{0x8c,0x9f,0x95,0x08,0x30,0x75,0xa4,0x3f,0xe4,0x26,0xd1,0x9f,0x1e,0x87,0x71,0x9b,0x40,0x04,0x3d,0xe8,0x8e,0xb0,0xee,0x97,0x1f,0x70,0xe1,0x0c,0x76,0x94,0xce,0x4e,},{0xe9,0x1d,0x16,0x7a,0xa3,0xeb,0xc2,0x3e,0x70,0xaa,0xb4,0x5d,0xab,0xe9,0x05,0xe4,0x16,0x26,0x2f,0x91,0x0e,0x2a,0x95,0x5d,0xd8,0x61,0x9e,0xfc,0x74,0xc2,0x4e,0x85,},{0xca,0xc5,0x55,0x22,0x2d,0xaf,0xec,0x76,0xa0,0xb4,0x7b,0x9d,0x2c,0x58,0x6b,0x3b,0x3b,0x9b,0x3b,0x9c,0x83,0x64,0xbe,0xb3,0xca,0xe1,0xe8,0xdd,0x7f,0x1a,0xe9,0xdd,0x74,0xf2,0x2b,0x8d,0xd4,0xad,0x2b,0x29,0x0f,0x81,0x35,0x1a,0x41,0x5a,0x99,0xf0,0x30,0xf1,0x07,0x78,0xbe,0x4c,0xda,0x85,0xd1,0xd3,0x53,0x33,0x1e,0x70,0xf1,0x09,},"\xb6\x9d\x70\xe8\x60\xf5\x5c\x42\x7e\xf2\xa7\x1d\xf3\x6e\x05\xbb\xc4\x3b\xb2\xe0\x64\x63\xaa\x5d\xe3\x44\x19\xc6\xa6\x14\xee\xa6\x69\x53\x35\xa8\x75\x26\xc1\x22\x64\x88\xd8\x42\x89\x1d\x05\x74\xdf\x34\x3c\x9c\x1e\x17\xae\xd6\x95\x8e\xce\xe8\x74\x74\x22\x1e\xb7\x7a\x59\x9e\xcb\x05\x93\x44\xc0\xd0\x52\xc0\x00\x2a\x66\xe5\xa6\x01\x31\x85\xaf\x69\xa0\x1b\xa5\xdb\xc6\x60\xd3\x6c\xae\x23\x5f\x67\xfe\x0e"}, +{{0xd7,0xeb,0x1f,0xba,0x42,0x4f,0xee,0xd1,0x00,0x77,0x7e,0xed,0xb4,0x87,0x4b,0xf2,0x08,0x10,0xad,0x68,0x6b,0x67,0xe3,0x1d,0x27,0xec,0xf6,0x10,0x60,0x9a,0x33,0xf5,},{0xa2,0x5a,0xcb,0x11,0xa6,0xc8,0x25,0x71,0x3a,0x08,0x5f,0xa7,0x54,0x69,0x28,0x86,0xa8,0x7d,0x07,0xfb,0x9b,0xe1,0xa5,0x3e,0xb9,0x61,0x72,0x8b,0xb6,0x6c,0x90,0x60,},{0x2b,0xf7,0x19,0x68,0x2b,0x07,0xcc,0x5e,0xcc,0x04,0x80,0xf3,0x7e,0x9d,0x12,0x3f,0xf6,0xf4,0x4c,0x26,0xe6,0x95,0x8e,0x59,0xf0,0x80,0x46,0x6f,0x9c,0xd3,0x73,0xa1,0x65,0x00,0xda,0xf1,0x23,0xdc,0x3f,0x13,0x34,0x77,0x4b,0xfc,0x9f,0xa8,0x45,0x03,0xb1,0x6d,0xbf,0x21,0xa8,0x15,0xc1,0xad,0xa6,0xeb,0xef,0x49,0x20,0x46,0x17,0x02,},"\xa1\xd0\xf8\x1e\x3d\x59\x08\x9c\xc2\xb1\x9e\x07\xd2\xfc\xe4\x3d\xb4\xcf\x17\x1f\xaa\x64\x2f\x3b\x0b\xbd\xe7\x7a\xe3\xd5\x3a\xf5\xc0\x2b\xf8\xfc\x12\xff\xb4\xe5\x7f\x7c\x8a\x01\x5d\x6c\x2d\x17\x89\x44\xfa\xe9\xf7\xc8\xfc\x96\x9d\x4b\x77\xbe\xa5\x18\x76\xae\x99\xd5\x9e\x94\xad\x24\x56\xe0\xed\x72\xc5\x2c\xf4\xe5\x34\x0d\xa1\x7c\x44\xdb\xff\x86\x45\x7a\x51\x9b\x6f\xff\xe2\x69\x06\x62\x90\xd6\x29\xfe\x69"}, +{{0x4f,0x6a,0xeb,0x35,0xfc,0xe1,0x4f,0xbc,0xbb,0x9a,0xa8,0xa4,0xf6,0x45,0x1b,0xf9,0x5b,0x98,0xdf,0x04,0x7f,0xa8,0xc4,0x3f,0x1e,0xad,0x3b,0x40,0x4d,0x3f,0x92,0x8f,},{0xbf,0x66,0xa9,0xed,0xd0,0x94,0x81,0xdb,0x84,0x44,0xa1,0x76,0xc8,0xce,0x05,0x78,0xd2,0x93,0x4f,0x0c,0xdc,0x97,0x34,0xe8,0x6f,0xca,0xac,0x05,0xbf,0x33,0x30,0xf1,},{0x6a,0xdb,0x07,0xe3,0x64,0xf2,0xa4,0x55,0xcb,0x05,0x86,0x7a,0xbc,0x51,0x1a,0xcd,0x9d,0x65,0x89,0x77,0xf0,0xca,0xca,0xfc,0x92,0x82,0x8e,0x7b,0x72,0x4f,0x6b,0xbf,0x98,0xbf,0x0b,0xfb,0x29,0xf4,0xe5,0xe6,0xc7,0x47,0x38,0xd4,0xfd,0xd8,0x16,0xd9,0x25,0x24,0x07,0xae,0x4f,0x3a,0xfc,0x57,0x4c,0x4f,0x00,0x61,0x48,0x24,0xe2,0x03,},"\x2d\xfb\xb3\xf5\x9e\x19\xea\x17\xd4\x4a\x5b\xde\x4a\xd2\x27\xa1\xa3\x51\xdd\xa1\x7a\xf8\x40\xee\x0a\x75\xda\x21\xa5\xcc\xa8\x9b\x6d\x1c\x56\x7c\x33\x3e\x9c\xc9\x10\xe2\x15\x7e\x05\xe8\x6a\xd5\xd9\x31\x14\x50\x64\x59\x4c\x47\xba\xee\xa8\x66\x3a\x34\x64\x9c\x43\xe9\x0e\xb9\x5c\xa1\x0f\x7d\x51\x59\x7b\x37\x8a\x72\x2f\x1f\x70\x4a\xdf\x9f\x22\xe9\xf8\x85\xb8\x9d\x1f\x93\x80\x06\xa2\xef\xcd\xb4\x2a\xaf\xf5\xe3"}, +{{0xef,0x4a,0x67,0x62,0xb4,0x00,0x97,0x52,0x04,0xcc,0xc1,0x3a,0xbb,0x47,0x34,0x40,0x15,0x45,0x49,0x06,0x85,0x0f,0xf1,0x49,0x40,0xcb,0xb8,0x3a,0xa2,0x24,0x14,0xae,},{0xea,0xca,0x45,0x09,0x96,0xf5,0x0c,0xfa,0xf2,0xbd,0x7f,0x9d,0x7f,0xa7,0x08,0x7f,0x09,0xad,0x49,0x66,0x42,0x06,0xa8,0x0b,0xc2,0xe5,0xbb,0xbb,0x85,0xbb,0x66,0x8e,},{0x02,0x69,0x7d,0x44,0xca,0xd8,0x62,0xf1,0xda,0xf5,0x70,0x82,0x05,0xf4,0x50,0xd4,0x08,0x52,0x5b,0x10,0xc0,0x1f,0xfd,0x06,0xcf,0xee,0x80,0x37,0x4f,0x3d,0xb1,0x6f,0xa9,0xa4,0x9c,0x19,0xa9,0x84,0x4b,0x34,0x5f,0x2f,0x95,0x59,0xea,0x74,0xaa,0xb1,0x73,0xba,0xa0,0x78,0xc5,0x43,0x70,0xa5,0x16,0x67,0x00,0xc6,0xda,0xfb,0x78,0x0a,},"\xa4\xb6\x3e\xae\xd5\xa6\x4a\x94\xf2\xca\xd2\x12\xce\x2a\xe7\x10\x92\xfd\x3e\xa7\x44\xf5\xbd\x89\x56\x2b\x2f\xc2\xa6\xc9\xe4\xd7\xaa\x27\xad\xd5\x62\x64\xa5\xa5\x50\x16\x61\x0b\xe6\xc1\x9f\xf7\xd4\x98\x9e\x95\x04\x74\x08\x53\x01\x27\x15\xa7\x9e\xce\x9e\x12\xc3\x01\xb3\x31\x7c\x7d\x9b\x67\x30\xdb\x86\x2a\x4a\x1d\x28\x05\x8e\x0f\x8b\x5d\xdd\x97\x38\xc7\xc6\x2e\xa5\x72\xcf\xe5\x9e\xae\x08\xe2\xb8\xb6\x59\x3b\x58"}, +{{0x55,0x01,0x7e,0x5f,0x61,0xf0,0xc5,0xba,0xfb,0xcd,0xe6,0xf8,0x49,0xf4,0x2a,0x31,0xe5,0xe7,0xa8,0x78,0xc1,0xd3,0xf9,0x12,0x6f,0xc5,0x69,0xfd,0x41,0x7e,0xa9,0xf2,},{0x66,0x91,0x4f,0x74,0xed,0x93,0x2f,0xc8,0x81,0xff,0x01,0x66,0x68,0x3f,0x67,0x5a,0x7c,0x28,0xa9,0x26,0xfd,0xdd,0x64,0x69,0xcd,0xb3,0xf2,0x8e,0x6d,0xec,0x42,0xcc,},{0xb1,0xa5,0xe7,0xc4,0x9b,0x8f,0xc6,0xb4,0x33,0x1e,0x04,0x16,0xce,0x7e,0x4e,0xd5,0x9e,0xdd,0x56,0x30,0x0b,0x80,0x2e,0x0d,0x72,0xab,0xca,0x4a,0x6f,0xcb,0x87,0x6c,0x03,0xbf,0x33,0x15,0x79,0x12,0x4a,0xe0,0xd3,0xfe,0x43,0xf7,0x89,0x8b,0xc8,0x7e,0x93,0xfc,0x2d,0xa3,0x97,0x0f,0xc8,0x63,0x89,0x57,0xd1,0x8c,0x66,0x13,0xc8,0x08,},"\x2f\xc8\x4a\x09\x98\xfa\x6e\x16\x8a\x86\x64\x10\xbb\x68\x10\x5d\xf2\x49\xa2\x8c\xfc\x76\x60\x4b\xe9\x4f\xd7\xdf\xff\xf2\xfc\x1d\xed\xd2\x20\x19\x94\x65\x57\x5e\x8d\xf8\x60\x19\x0f\x16\xac\xa4\x08\x41\x69\xbe\x16\xc6\xba\x32\xeb\x67\x04\x2f\xfd\x4f\x23\x03\x16\xa2\x6b\x26\x24\xa4\x2f\x8f\x90\xad\x57\xf6\x91\x64\x86\xfa\x91\xfd\x94\xed\x68\xad\xed\x4e\x63\x24\x30\xef\x71\x94\x46\x97\x9b\xfa\xf3\x45\x40\x9c\x38\x7f"}, +{{0x05,0x53,0xfb,0xa8,0x66,0x94,0x23,0x41,0x21,0x7c,0xf2,0x78,0xac,0x57,0xcb,0x21,0xac,0xd0,0x9d,0x99,0x16,0xcc,0x6a,0xf0,0xac,0x46,0x94,0x1e,0xa1,0x39,0xd5,0x45,},{0x84,0x0c,0x66,0xe5,0x7c,0x2d,0x4f,0x52,0xa4,0xa2,0x79,0x6d,0x2a,0x53,0xc5,0x70,0x9b,0x96,0xa6,0x28,0xc2,0xe0,0x63,0xfe,0x6e,0xfd,0x47,0xf2,0x83,0xef,0x5e,0x82,},{0xbc,0x33,0x64,0xc1,0x52,0xee,0x5c,0x80,0x8a,0xc3,0x40,0xf4,0x9e,0xa2,0xcc,0x40,0x4e,0x93,0x51,0x71,0x21,0x22,0x0c,0xce,0x6f,0x7c,0x30,0xa2,0x25,0x00,0xe4,0x1b,0xcd,0xb6,0xe8,0x20,0x48,0x0f,0x8f,0xcc,0xdd,0x22,0xff,0x9a,0xd9,0x6d,0xa5,0x32,0x80,0x2f,0x43,0x1e,0x94,0x24,0x0f,0xb8,0x3d,0x4b,0xce,0xaa,0x09,0xb9,0x2b,0x0d,},"\xc1\xfa\xe6\x26\x2a\x0e\x98\xa6\xb1\x23\x5f\xcb\x62\x28\x3b\x7f\x0a\x09\x7f\x9d\x00\x24\x16\xd3\x18\xfe\xfc\x60\xc5\xa1\x58\x4f\x90\x0a\xd0\xab\x26\xcc\xfa\xe0\xd6\xd8\x4a\xa9\xaa\x2d\xf1\x6d\x4c\x11\x7e\xa2\x72\x46\x76\xcb\x86\x6d\x48\x70\xa8\x72\xfc\x82\x9a\x7c\x2a\x5d\x21\xba\x83\x34\x0a\xdb\x33\x9a\x34\xc5\x18\x4c\x7f\x5e\xad\x0f\x07\x72\x89\xb3\x36\x77\xed\x6a\x1b\xa3\x4b\xe1\x99\x4e\x25\x76\x3b\xd1\xd9\xfa\xec"}, +{{0x7a,0x5a,0xc6,0x02,0xde,0x19,0xf3,0xc2,0x10,0x40,0xbc,0xdd,0xbf,0xf4,0x2f,0x6a,0xee,0x6f,0x95,0xc1,0xb0,0x93,0x86,0x8f,0x48,0xe5,0x04,0x82,0xdb,0xf4,0xf9,0xc7,},{0xfb,0xb6,0xc7,0x53,0x1c,0xda,0x21,0xe7,0xd1,0x7e,0xa9,0x03,0xc4,0xd1,0x4b,0xe6,0xc6,0x8b,0x4c,0xa8,0x03,0xa1,0x6b,0xd8,0x71,0x20,0xf5,0xaa,0xf7,0xdc,0xe1,0xd4,},{0x84,0x10,0x1d,0xd4,0xb5,0xe8,0xca,0x3e,0xd9,0x8c,0x1e,0x8a,0x06,0xe1,0x1d,0x7e,0x42,0x4b,0x0d,0x12,0xca,0x71,0x4e,0xe7,0x37,0x4b,0x64,0xc2,0x9d,0x51,0xa2,0x02,0x1c,0xc7,0x7a,0xc7,0x53,0x89,0xd9,0xb0,0xa6,0x46,0xa4,0x47,0x62,0x3d,0x7d,0x04,0xd1,0x24,0x18,0x66,0xb0,0xca,0x6e,0xdd,0x1b,0x7a,0xc0,0x15,0x66,0x6b,0x70,0x0d,},"\xbd\x16\x85\x41\x92\x79\xeb\x81\xe4\xcf\x3c\x90\x90\x31\xf0\xf0\x9c\x5f\xfa\xe7\xe2\xce\x6b\xa9\xd9\x6c\x2b\xce\x87\xb8\xba\x0d\xd7\x63\x23\x10\x01\xe5\x32\xc7\xdd\xd6\x21\x03\xab\xf7\x01\x28\x8e\x19\xdd\x8f\x53\x02\xe8\xf5\xd3\x1b\x64\xcc\x33\x9b\xd8\xb7\xa9\x55\x50\xc8\xa1\x16\xfd\x48\x69\x48\x77\x2b\xd5\xaf\x8d\xfd\x46\x00\x1c\x59\x76\x7b\x0d\x6b\xdc\xe3\x83\xa7\x07\x89\x92\xd1\x02\x2f\xbc\xaf\x90\x71\x06\x87\xb9\xaa"}, +{{0x50,0x41,0x4c,0xf5,0x49,0xbc,0xc5,0x5b,0x5b,0x6b,0x75,0xea,0x37,0x82,0xb2,0xea,0x7c,0x08,0x7b,0x6a,0x01,0x06,0x17,0x5e,0x46,0x9c,0xa2,0xcc,0x76,0x4a,0xeb,0x01,},{0xd0,0xf3,0x0c,0x12,0xe9,0x97,0xf9,0x6e,0x7a,0xee,0xcd,0x1b,0xff,0x6a,0x01,0x2e,0xc3,0x88,0xeb,0xf8,0xf3,0xf4,0xaf,0x66,0x48,0x04,0xd1,0x63,0x8e,0x4c,0x34,0x6a,},{0xb3,0x09,0x80,0x01,0x60,0xde,0x43,0xa6,0x3a,0x89,0xa0,0xac,0xb8,0xa6,0x05,0x00,0x59,0x58,0x9b,0x3e,0xae,0xca,0xc2,0x0b,0x25,0x6f,0xec,0xe4,0x38,0x04,0x2f,0x69,0x41,0x5d,0x8a,0x56,0x88,0x3e,0xe3,0x83,0x6d,0x31,0x34,0xa7,0xfc,0x1d,0xe6,0x4f,0xa8,0xc8,0xce,0xcc,0x3c,0xe2,0x75,0x89,0xf6,0x06,0x05,0x88,0x20,0x85,0x7a,0x0c,},"\x75\xad\x77\xe8\xc5\x4b\x0b\x05\xfb\x2d\x16\x2e\x7c\xad\xb8\xa7\x52\x80\x81\xb8\x63\xf7\x6a\x44\x1b\x37\x44\x69\x41\x3e\x57\x14\xed\xf5\x4f\x80\x04\x96\xaf\x01\x57\xc1\x7e\x42\x55\x83\x41\x4d\x43\x61\xf2\x13\x41\x71\xc0\xb8\x7c\x22\xce\x68\x20\xa4\x85\x0a\xb4\x9d\x99\xa9\xba\xdc\xe9\xe3\x61\x10\xe7\xf3\x06\x01\x18\xb3\x59\x0f\x82\xb4\x37\x71\xe9\xfb\xb0\x81\xaf\xe6\x22\x27\xe0\x24\xd9\x8d\xe6\xcd\xec\x02\x8d\x7c\x49\x49\x0d"}, +{{0x93,0xcb,0x00,0xd8,0xfe,0x9c,0x97,0x77,0xa6,0x83,0x63,0x1f,0x39,0xba,0x0f,0x48,0x76,0x14,0x82,0xcf,0x1c,0x36,0x6b,0xd8,0x63,0xcf,0x71,0x51,0x01,0x53,0x25,0x55,},{0x87,0xe9,0x4a,0x1e,0xa5,0x25,0x8d,0x61,0x18,0x0c,0xb8,0x28,0x59,0x0f,0xf1,0x41,0x8a,0x87,0xd0,0x1e,0x70,0x26,0x86,0xba,0x8a,0xbc,0x26,0x92,0xc8,0xdc,0x3c,0x91,},{0x09,0x82,0x4f,0xa2,0xdf,0xbc,0x4d,0x6e,0xf7,0x6a,0x9e,0x41,0x45,0x96,0x11,0x16,0x76,0x91,0x30,0x55,0x3b,0x3e,0xdf,0xfa,0x50,0xd0,0x4f,0x39,0xb8,0xb7,0x9f,0xac,0xbd,0x23,0x7a,0xcf,0x71,0x35,0x4a,0x53,0xa6,0xe5,0xfe,0xe7,0x54,0xe8,0x23,0xb0,0xb2,0x90,0xf9,0x61,0x93,0x20,0xa1,0x3d,0x56,0x12,0x69,0xa2,0x21,0x63,0x9f,0x03,},"\x88\xd8\x53\x8d\x31\x86\x78\x13\xd8\x8f\xef\x72\x28\xd4\x9a\x7e\x95\x0d\x73\x83\x96\xf1\x16\xdd\xa1\x02\x5f\x79\x13\x54\x7c\x5d\x1d\xc5\x67\x7a\x6d\xe4\xb4\xa5\x88\x05\x07\xb3\x61\x78\x0b\x61\xb4\x3f\x77\x95\x26\x3d\xb2\x2f\xf3\x41\x64\x5f\x2f\x59\x14\xfd\x60\x88\xc2\x81\x12\x11\xed\x47\x56\xac\x01\x9a\x60\x35\xd6\x6e\x31\x70\xc1\xd8\x2b\xfa\xa3\x05\x96\xb3\x96\xb3\x26\x0c\xc1\xd1\x0d\x41\x3d\xd4\x7e\xbe\x6d\xaa\x0c\x30\xdc\x42"}, +{{0x2b,0x4c,0xae,0x38,0x0e,0x95,0xce,0x69,0x4c,0x26,0xac,0x79,0x57,0x44,0x73,0x47,0xf9,0x8e,0x31,0xb4,0xbf,0x02,0xd7,0x44,0xe1,0x31,0x52,0x90,0x71,0xe2,0x30,0x1d,},{0xe6,0xfc,0x70,0x5a,0x79,0xc9,0x8e,0x11,0x5b,0x4e,0x28,0xd3,0xaa,0x15,0x06,0xb7,0x4e,0xe7,0x42,0x76,0xc5,0xfc,0x11,0x09,0xa7,0xf4,0xd8,0x9c,0x6f,0xaf,0xb8,0x89,},{0x55,0x5e,0x45,0x65,0x6b,0xa9,0xcf,0xbf,0x51,0x55,0xd0,0xe5,0x25,0x76,0xe5,0x19,0x7a,0xbb,0xbc,0x9d,0xd2,0x33,0x99,0x3e,0xec,0x2a,0x1e,0xe7,0xf6,0xa8,0x64,0x09,0xc0,0xb7,0x1b,0x0a,0x66,0x19,0x78,0xff,0x5e,0x0a,0xcd,0xc9,0x46,0x3d,0xc4,0x49,0x90,0x6f,0x47,0x4f,0x8e,0x79,0xbb,0x86,0x16,0x8b,0xf7,0x07,0x41,0xe3,0x4b,0x02,},"\xe0\xb8\x25\x0e\x27\xb7\xc0\x29\x1d\xbc\x47\xa6\xda\x6f\x12\x68\x98\x7a\xfd\xf0\xa1\xe9\x0b\xe6\x9b\xcb\xc4\x37\x08\x65\x21\x78\x30\xd5\x20\x86\x93\xbe\x7b\x70\x45\x09\x9a\x22\xea\x27\xf9\x52\xeb\x3f\x79\xa9\xa0\xf1\xb5\xa8\x7b\x19\x36\x77\x90\x78\x8d\x34\xc2\x19\xc2\xe2\xa6\xb8\x34\x02\x0f\xb4\xfd\x14\x9d\xc5\x6b\x54\x4f\xdd\xbb\x42\x07\x1a\x16\x2f\xc7\xcb\x33\xc1\x46\xca\xc0\x5a\x31\xb1\x83\xe9\xda\xad\xc6\x16\xf3\xaf\x44\x9b\x17"}, +{{0xb5,0x64,0x91,0xe5,0x49,0x99,0xbb,0x5a,0x17,0x15,0xeb,0xfa,0x2f,0xeb,0x14,0xa5,0x45,0xa3,0xa4,0x3c,0x2f,0xdf,0xd4,0xbe,0x0c,0x95,0xfc,0x11,0x81,0x9a,0xd6,0x95,},{0xcd,0x42,0xbf,0x41,0x4f,0x9b,0xfc,0x72,0xec,0x06,0x98,0x82,0xa8,0x00,0x55,0x7c,0xdf,0x31,0xbc,0x34,0x64,0xfb,0x10,0x2c,0x31,0x0e,0x6d,0xbd,0x3a,0xe2,0x08,0x63,},{0xe3,0xbe,0x3e,0x71,0xa8,0x98,0x52,0xdf,0x3c,0xff,0xd7,0x2d,0x68,0x20,0x78,0x69,0xdd,0x3e,0xce,0xb4,0x9b,0x1f,0x02,0x94,0x93,0xec,0xcb,0xb9,0x32,0x44,0x4e,0xbe,0x8c,0x8c,0x6d,0xb5,0xf0,0xa5,0xa6,0x7e,0x21,0x94,0x40,0x8d,0xf9,0x84,0x19,0x13,0xa5,0xac,0x1a,0x60,0x68,0x96,0x41,0x9a,0x66,0x8f,0x4f,0x47,0xc5,0x6c,0x2b,0x08,},"\xeb\x44\x18\xba\x30\x68\x3e\xc7\x95\x9b\xdb\x1e\xc7\xb2\x63\xf8\x3e\x81\xf0\x54\xdd\xcd\xbe\x0a\x67\x38\xca\x77\x63\xe2\x46\x93\x5b\xac\x41\x90\x26\xc2\x2b\xfb\xdd\x12\x36\x33\x6c\xc1\x61\x07\xc5\x35\x13\xe3\xdd\xf3\x4e\x12\x08\x46\x96\x2c\x3b\xdd\x54\xf5\xad\x57\x49\x59\x72\x08\xf1\x5a\x8b\xb5\x66\x67\xba\xa8\x95\xf0\x83\x40\xdb\x89\xb8\x5c\x43\x5e\x77\x09\x31\x92\x8d\x8a\xbc\x99\x26\x2f\x83\x9a\xed\xd9\xbe\x2a\xa1\x38\xc9\x25\x9a\xdf"}, +{{0x65,0x79,0xc2,0x47,0xdd,0x2c,0xd0,0x2b,0xa2,0xf7,0xd7,0xa9,0x50,0xa3,0x30,0x75,0x26,0x81,0xe9,0x2c,0x0d,0xc6,0x29,0x84,0xbb,0xea,0x27,0x9e,0xa5,0x21,0xc3,0x81,},{0x0b,0x08,0x7b,0xea,0x1a,0x1b,0x3d,0x15,0x80,0x5c,0xb6,0x04,0xf4,0xbb,0x8d,0x68,0xed,0xde,0x27,0x4f,0xaf,0x52,0x1f,0xe6,0xdf,0x50,0xc5,0x5f,0x8a,0xd4,0xa7,0x0d,},{0xec,0xca,0xf8,0x01,0xae,0x0a,0x91,0x2e,0x21,0xc6,0xb8,0x3a,0x5f,0x0e,0x4e,0x88,0xd4,0xb2,0x71,0x34,0x59,0xff,0x93,0x44,0x9f,0xc0,0xb2,0x1a,0x9f,0x41,0x60,0x50,0x11,0x3c,0xba,0xe4,0xe8,0x14,0xd2,0x0c,0x0a,0x79,0x8f,0x76,0xd2,0xf9,0xd3,0x26,0xed,0x83,0x95,0x9e,0xa0,0x2a,0xbd,0xc1,0xab,0x35,0x0a,0x46,0x71,0x23,0xf7,0x09,},"\xdf\x7c\x55\x2f\xfc\x89\x37\x4b\x95\x71\xa6\x02\x4a\x8d\x04\x71\xd7\xeb\x6b\xe8\xdf\xca\x6f\x41\x66\xb5\x81\xb6\x54\x79\x01\x5a\x05\x68\x12\x90\x74\xcc\x04\xd6\x34\x2c\x75\x8c\xa1\x8f\x79\x87\xde\xc5\x36\xb7\x03\x3d\x5f\x96\x81\x50\x43\x40\xe2\x09\x86\xf0\x27\xb8\xcf\x1f\x26\x3b\xe7\x6d\xb3\x52\x5d\x17\x34\x22\x95\x0e\xa8\xdc\xed\xdc\x58\x56\x40\x91\x8a\xa9\xd2\x5c\xa8\x9c\xba\x70\x1c\x20\x20\x15\x38\x73\xf4\x61\x08\xc7\x72\xcb\x38\x8d\x55"}, +{{0x18,0xfb,0xa6,0x0c,0x50,0x26,0xf3,0xc9,0xdd,0x7a,0xed,0xc0,0x42,0x09,0xd5,0x26,0x03,0x61,0xde,0x40,0x0e,0x19,0x0a,0xeb,0x60,0x16,0x9e,0x05,0xa3,0x36,0x7c,0x9f,},{0xdf,0xff,0x34,0x7f,0x3d,0xd2,0x55,0x53,0x0b,0xf7,0xfb,0x34,0xd0,0x2b,0xa4,0x86,0xd1,0x12,0xbb,0x46,0xe9,0x50,0xe2,0xef,0x80,0xe5,0x17,0x01,0x4c,0xc9,0x57,0x34,},{0x4b,0xc0,0x11,0xe4,0x0f,0x0f,0x59,0xc6,0x18,0xf6,0xbb,0xe2,0x30,0xb6,0xf7,0xbc,0x2f,0x50,0xe3,0x61,0x7c,0x7f,0xaa,0xb7,0xf4,0xc2,0x1c,0xb8,0x4f,0x77,0xeb,0xa9,0x94,0xcb,0x7c,0x2a,0x1b,0xf1,0x0b,0x01,0xbb,0x20,0x08,0x44,0x97,0xfd,0xf0,0xa6,0xab,0x5d,0x9b,0xcd,0x22,0xc4,0xa2,0xc5,0xa7,0x8f,0x79,0x92,0x68,0x25,0x94,0x0f,},"\x34\xf0\x8a\x80\x4d\x78\x29\xcc\x39\x14\xf0\x00\xce\x1a\x32\x88\xac\xce\x21\x49\xc8\xa0\x20\x86\xb9\xf6\x7a\xfc\xcd\x83\xa1\x78\xb0\xbc\xfd\x49\x70\xc0\x56\x99\x7d\xa7\xdc\x3d\x47\x56\x2f\x16\x66\x3c\xed\xc5\x2f\x82\xd7\x10\x85\x0c\xf4\x05\x03\x79\xef\xda\xc2\x3b\xee\x17\xc3\x30\xa3\x83\xad\x13\x7f\x78\x84\x73\xb2\xb0\x72\x36\x03\xb6\xde\xb1\xfd\xbf\x6c\x52\x3f\xc9\x48\xa0\xcc\xc4\xff\x10\x0f\xb9\x46\xd8\x74\xc1\xf9\x90\x43\x6a\xe8\xc4\xf3\xb2"}, +{{0x07,0x3c,0xc1,0x5b,0x05,0x36,0x28,0x59,0x33,0xb2,0xbe,0x39,0x25,0x3c,0xf4,0xfd,0x69,0x6b,0x81,0x61,0x0f,0x5d,0xd3,0xad,0xac,0x2e,0x9c,0xbf,0x33,0x8e,0xf2,0xf6,},{0x00,0xb5,0x51,0xd3,0x71,0x54,0x43,0x75,0xda,0xc5,0xc4,0xe9,0x6c,0xd1,0xf0,0x21,0x52,0x07,0xe8,0xe1,0x66,0xa1,0xfe,0x49,0xd5,0xb0,0xa5,0x1a,0xc1,0x84,0x43,0xec,},{0x3a,0xa5,0x2a,0x83,0x06,0x2a,0x8f,0x28,0xa5,0xd6,0xb7,0x60,0x7f,0x48,0x4b,0x66,0xcc,0x37,0x48,0x96,0xb7,0x66,0x12,0x31,0x26,0x33,0x3c,0x57,0x95,0x81,0x31,0x6c,0x74,0x28,0x06,0xf6,0x27,0xb5,0xbc,0x55,0xca,0xd7,0x05,0xcc,0x1d,0x47,0x82,0xb0,0x44,0x08,0x0c,0x8a,0xc8,0x40,0xf3,0x8c,0x0c,0x50,0xd3,0x5e,0x34,0x5c,0x78,0x03,},"\xc2\x85\x36\x2b\xc8\xef\x62\x8f\x7a\xed\xf6\x54\x23\x1e\xe5\x1a\xcd\xf2\xcf\x69\xa8\x86\xb9\x42\xbb\x9b\xfe\xd8\x15\x51\x05\xd9\x20\x9d\xed\x2a\xf2\x4f\x16\x9a\xd5\xfc\xd4\x51\x37\x0f\x58\x27\xa8\x51\x11\xc7\xa5\x2e\x03\x2c\x50\x38\x61\x7c\x0c\x01\x70\xe2\xa6\xc2\x31\xdc\x40\x1d\x12\x06\x2e\xdb\x18\x60\x36\x11\x4e\x38\x79\x3b\x79\x08\x90\x77\x58\x1b\x97\x83\xf4\x00\x07\x10\x3e\xf1\x74\x72\x49\x1c\x00\xe7\x13\x8a\xec\xc5\x08\x4d\x3c\x85\x01\x04\x70"}, +{{0xfd,0x89,0x4a,0x1e,0x82,0x32,0x20,0x3b,0x28,0x95,0x05,0xd5,0xc6,0x8c,0x68,0x79,0x1f,0xfc,0x0e,0x54,0xf2,0xa8,0x75,0x30,0xfb,0xba,0x5b,0x3a,0x3f,0x2c,0xaf,0x00,},{0xe9,0x5a,0xb5,0x65,0x94,0x5c,0x7a,0xe5,0xd5,0x33,0xdf,0x5d,0x0c,0xcc,0xc7,0xe9,0xab,0xbc,0x83,0x8e,0x20,0xa0,0xb6,0x1c,0x93,0x0f,0x5d,0x41,0xd8,0x1a,0x6f,0xe7,},{0xf5,0x11,0x02,0x21,0x9e,0x88,0x04,0xbe,0x71,0x3e,0x55,0x6d,0xf4,0xe4,0xaf,0xa2,0xf8,0x86,0x6f,0xe8,0x65,0x41,0xa1,0xc2,0xa0,0x93,0x4d,0x24,0xc3,0xc9,0xbe,0xb2,0x80,0xa7,0x0d,0xd8,0xd5,0x27,0xfe,0x8b,0x7e,0x0b,0x94,0x82,0x14,0xd5,0xf2,0xf9,0x63,0x86,0x19,0x91,0x4b,0x72,0xd5,0x5d,0xc1,0x98,0xb0,0x22,0x9a,0x84,0x87,0x08,},"\x26\x69\x62\x4a\x94\xf2\xc4\x4a\x05\xb7\xdc\x3e\xbf\x93\xe5\x8a\x4b\xf3\xa0\x1c\x27\x36\x57\xe7\xe7\x87\x89\x76\xf6\xb6\xea\x73\x7f\xa3\xf2\x2c\xc8\x36\x5b\x8b\x22\x0c\x00\x7d\x5b\x64\x27\x26\xa4\x08\xfe\x2f\xab\x69\xeb\xb3\xbd\x07\x2b\x34\x9f\x4d\xc3\x37\x7e\xe7\xcc\x75\x29\x34\x25\x42\x15\xd2\x39\x89\xbd\x3c\xd0\x2c\xe9\x99\xad\xec\x97\x84\x99\x3f\x4c\x19\x94\x08\x15\xf3\x9c\x9e\x22\x92\x47\xf5\x20\x5c\x36\xcb\xa4\x4e\x71\x42\x66\x36\x92\x89\xb4\xa7"}, +{{0x18,0xef,0x46,0x4e,0x28,0xf8,0x7f,0xfc,0xfa,0x4d,0x3a,0x9c,0x09,0xa2,0x29,0x10,0x95,0x1b,0x8c,0x71,0x9f,0xda,0xcd,0xb5,0x6d,0xe6,0x2c,0x4b,0x40,0x6d,0xf0,0x0c,},{0xc5,0x06,0x4c,0x9d,0x43,0xee,0x2d,0xa7,0x5b,0x06,0xbb,0x09,0xc7,0x72,0x67,0xdb,0xd0,0xd3,0x91,0x28,0xf1,0xcd,0xc6,0xbf,0xa4,0x51,0xa0,0x3e,0x93,0xaf,0x4a,0x70,},{0xd1,0xe7,0xf1,0x6e,0x8e,0x59,0x7d,0x42,0x8a,0xde,0xa6,0x55,0x91,0xd5,0x51,0xb5,0x4b,0x66,0x7a,0xff,0x20,0x20,0xc4,0x64,0xf7,0xf4,0xe5,0x3c,0x47,0x73,0xf7,0x04,0x33,0x24,0x9a,0x3c,0x71,0xb4,0xd1,0x1c,0x89,0xc3,0xfa,0xa8,0x92,0x80,0x92,0x27,0xb9,0xf2,0x9e,0xf4,0xf7,0xf5,0xd0,0x20,0xd4,0x67,0x4d,0x40,0x21,0x35,0x94,0x05,},"\x9c\x82\x57\x07\xd9\x35\x83\x65\xab\x9d\x38\xf7\xe7\x28\xd6\x28\xaa\x72\x2a\x4f\x1a\x20\xa3\x8e\x47\xc9\x99\xff\xf8\xfc\x32\x41\x7f\xbe\x07\x2f\x96\xeb\x6a\x0e\x11\xe4\xda\x9b\x6d\xe9\x61\x54\x45\x28\x0e\x93\xc7\x7a\x36\x34\xd3\xd2\xc6\x87\x98\x56\xc2\x48\xf9\x80\x0f\x60\xa0\xd3\x8d\xc1\xce\xa8\xb7\xf3\x1f\x28\x6c\xb0\x37\x48\x27\xb4\xc6\xba\x14\x4a\x66\x94\xf2\xb9\x08\xea\xd6\x8d\x18\x34\x01\x24\xcb\x59\xcf\x17\x01\x86\x3b\xd4\xf3\xef\xc7\x09\xf3\x62\x7a"}, +{{0xc9,0x11,0xbd,0xf2,0xf9,0xe7,0xcc,0x5f,0xff,0x35,0xc9,0x6e,0x15,0xcc,0x12,0xea,0xfd,0x05,0xab,0x0d,0xb3,0x1f,0x64,0x9f,0x74,0x08,0xac,0xd0,0xca,0xda,0x76,0xe0,},{0xde,0x44,0x69,0x6c,0xd6,0xbd,0x2c,0xbe,0x9b,0x11,0xa0,0xef,0x18,0xb8,0x81,0x64,0x80,0x1a,0x96,0x9d,0x5e,0x06,0xed,0x45,0x3e,0xb4,0x00,0x8c,0xce,0x9a,0x57,0x25,},{0xd5,0x84,0xb5,0xda,0x37,0x1a,0xe4,0xf5,0xc9,0x85,0x9b,0x25,0xf7,0x0d,0xc5,0x6c,0x1b,0x7b,0x4e,0x02,0xd1,0xae,0x66,0x36,0x28,0x3b,0x1b,0x7b,0x11,0x21,0x7a,0xfd,0xcd,0xf6,0x5d,0x1b,0x49,0xca,0x2c,0x8e,0xf1,0x79,0x66,0xe9,0xbc,0x65,0xf1,0x0c,0x31,0x0b,0x77,0xbb,0x5d,0xf7,0xaf,0xf5,0xec,0x1b,0x37,0x9a,0x2c,0xe5,0x5d,0x0d,},"\x76\xc4\x71\x24\x1d\x17\x19\x29\x84\xb0\x03\x62\x69\x6e\x4d\x9d\x4d\x2b\x7f\x83\x9c\x20\x64\x11\x7e\x50\xa1\x59\x8f\x3a\x11\x72\xb1\x6c\x55\xe5\x39\x68\x66\x08\x47\x52\x02\x4f\x3a\x7e\xb6\x8b\xb3\xff\xdb\x80\x97\x9a\x0a\xf6\xd0\xf6\xaf\x26\xb6\xf0\xbc\x0c\x03\x84\x43\x3b\xcf\xd4\x4c\x75\xeb\x65\x4a\x8a\x82\x25\xcb\x9c\x4a\x7f\xb3\xc8\x24\xc3\xaf\x61\x25\xfd\x46\xdb\x28\x7e\x70\x49\x2d\x15\x46\x32\xcb\x8f\x62\x43\x26\x59\xd9\x58\xd6\x28\x1d\x04\xa5\x4f\x5f\x5f"}, +{{0xd3,0x70,0x32,0x99,0xc4,0x1d,0xb3,0x6d,0x77,0xdd,0x3a,0x49,0x54,0x1f,0x3f,0xb2,0x1d,0x0b,0x2b,0xad,0x1f,0x6e,0x07,0x4a,0xff,0xd9,0x6f,0x1c,0x40,0xd0,0xf9,0x27,},{0x86,0x2c,0x5e,0xf6,0x16,0xa5,0xf0,0x66,0xfd,0x87,0x75,0x8a,0x56,0xab,0x45,0x05,0x6f,0xea,0x4b,0xd3,0x3f,0x00,0x8b,0xe2,0x4f,0x7b,0x54,0x0e,0x09,0x5e,0x14,0x8e,},{0xdf,0x28,0x27,0x71,0x21,0xea,0xc4,0x46,0x30,0x08,0x4c,0xce,0x75,0x91,0x7a,0xe9,0xf6,0xbe,0xc6,0x5a,0xf5,0x57,0x2d,0xc3,0x07,0x19,0xbd,0xe6,0x61,0xcf,0x69,0x6b,0x85,0xb8,0x67,0x2d,0xd4,0x98,0x3c,0xab,0x30,0xbd,0x05,0xcc,0x3a,0x11,0x9d,0x7d,0xb9,0xba,0xbd,0x52,0x2d,0x7b,0x3a,0x6b,0xcf,0x38,0x86,0xec,0xd2,0x5e,0x08,0x0f,},"\xac\x92\xed\xbe\x22\x25\x7b\xb0\x6d\x94\xaa\x95\x0e\x62\xd1\x8c\xa2\xac\x0a\x8f\xc1\x06\x00\x0d\x22\x31\xf8\xa1\x3b\x8d\x7a\x20\x9c\xcd\x8c\xc4\x9a\x6c\xd6\x8a\x7f\x36\xc0\x2f\xb8\xf7\x28\xd1\x55\x95\x16\x7f\x0b\xa8\xcf\xe9\x5c\x8a\x1e\x43\x5f\x32\x75\x13\x01\x4a\xc4\x28\xb7\x5d\x4f\x72\xe7\xc8\x34\xdd\x70\xe1\xa4\x48\xf1\x84\x7d\x34\x98\x47\x5f\x74\xe3\xd9\x33\x4d\xc7\xdc\xc4\xfe\xd7\x2b\xf6\xc7\xfe\x3b\x1d\x4f\x53\xd4\x29\x61\x6f\x1d\xf4\x4f\x19\x73\x31\x58\xb6"}, +{{0xd4,0x11,0xcd,0x33,0x57,0x6d,0x0e,0xfe,0x9e,0xc4,0x13,0xcc,0xda,0xab,0xd4,0xfc,0xba,0xfe,0xc0,0x1a,0x3a,0xf4,0xb3,0xcb,0xe3,0x4f,0x8b,0x05,0xef,0x8b,0x59,0xba,},{0xe8,0x70,0x34,0x4d,0xf9,0x8d,0xd3,0xa8,0x70,0x2c,0x45,0x19,0xbf,0x9e,0x8b,0x35,0xa9,0xd1,0x89,0xe7,0x46,0xf7,0x20,0x3d,0xbb,0xf9,0xbb,0xfa,0xb2,0x2d,0x6f,0x63,},{0x83,0x46,0x0d,0x15,0x46,0x1d,0x67,0x17,0x71,0x0b,0xaf,0xd6,0xa4,0x7a,0x1e,0xaa,0x90,0x0a,0x80,0xf2,0xbf,0x8b,0x8a,0xae,0x24,0x68,0x77,0x36,0x14,0xee,0x84,0xbd,0x62,0x8c,0x97,0x17,0x47,0x63,0x68,0xef,0x36,0x40,0xcf,0x76,0x0a,0xca,0xc8,0x3a,0xd6,0x02,0x32,0xa7,0x69,0x63,0xb7,0xd5,0x25,0x88,0xb1,0x1d,0xc0,0x04,0xd7,0x0d,},"\x11\xd2\xc2\xa7\xf0\x19\x09\x88\x12\x66\x96\x43\x1b\x4b\xbc\xd9\x0a\xb7\xb5\x6a\x32\xda\x64\x04\xae\x44\x6a\xa7\x62\xa4\xdd\xc6\x60\x94\x97\x15\x38\xee\xb8\x5b\xde\x04\x70\xa5\x10\xbe\x0d\x6d\x85\x78\x0e\xe7\x30\xa9\x85\x41\x38\x72\x8a\xe6\x81\x61\x62\x26\x8d\xa8\x52\x85\x8e\xae\xd4\xec\x74\xc7\xac\x62\xe6\xe7\x09\x6d\xc0\x02\xdf\x0b\xdf\x5f\xa4\x0d\xa5\x65\xb4\x1d\x18\x1a\x3f\x0a\xd0\xc5\xe0\xb9\x76\x74\x3e\x31\x5d\x9d\xb8\xed\x41\x60\xab\xe6\x9c\x13\xa2\xb3\xf0\x9a"}, +{{0xe1,0x0a,0x2f,0x13,0x80,0xc3,0xe4,0x72,0x0e,0x8a,0x87,0x07,0xa9,0xbc,0xb2,0x5a,0x0f,0x58,0x27,0x0d,0x70,0x59,0xcd,0x76,0x26,0xc7,0x15,0x34,0x47,0xed,0xfb,0x87,},{0xa3,0xc7,0x17,0xac,0xab,0x36,0x6a,0x40,0xb5,0x11,0x87,0xbb,0xf3,0x5b,0x2d,0x15,0xe9,0x7c,0xfe,0xac,0xd7,0x34,0x9c,0x06,0xef,0x1c,0x91,0xac,0x93,0xe9,0x06,0x56,},{0x09,0x4b,0xf6,0xf9,0x53,0xca,0x0e,0xb7,0x7d,0xf4,0x51,0x29,0xb7,0xbf,0x10,0xd1,0x92,0xcf,0x6d,0xde,0xae,0x94,0xad,0x62,0x02,0xb8,0xea,0xcf,0xbe,0xc1,0x19,0xe5,0x29,0x15,0x78,0xfe,0x64,0xa0,0x84,0xae,0x60,0x0f,0xe0,0x7e,0xfd,0xb8,0xa7,0x82,0x61,0x0d,0xbd,0xb0,0xb4,0x9e,0xb5,0xf2,0xa4,0x6c,0x43,0x23,0x55,0x55,0x2f,0x01,},"\x13\x52\x12\xa9\xcf\x00\xd0\xa0\x52\x20\xbe\x73\x23\xbf\xa4\xa5\xba\x7f\xc5\x46\x55\x14\x00\x77\x02\x12\x1a\x9c\x92\xe4\x6b\xd4\x73\x06\x2f\x00\x84\x1a\xf8\x3c\xb7\xbc\x4b\x2c\xd5\x8d\xc4\xd5\xb1\x51\x24\x4c\xc8\x29\x3e\x79\x57\x96\x83\x5e\xd3\x68\x22\xc6\xe0\x98\x93\xec\x99\x1b\x38\xad\xa4\xb2\x1a\x06\xe6\x91\xaf\xa8\x87\xdb\x4e\x9d\x7b\x1d\x2a\xfc\x65\xba\x8d\x2f\x5e\x69\x26\xff\x53\xd2\xd4\x4d\x55\xfa\x09\x5f\x3f\xad\x62\x54\x5c\x71\x4f\x0f\x3f\x59\xe4\xbf\xe9\x1a\xf8"}, +{{0xb2,0xe6,0x97,0xb3,0xd3,0xef,0xec,0x97,0x6e,0xf3,0x36,0x95,0x30,0xc7,0x92,0x71,0x7b,0xdb,0xb4,0x28,0xd9,0xed,0x0c,0x11,0xec,0x0e,0xa9,0xb2,0xe5,0xf3,0x9f,0x82,},{0xc4,0xd2,0xe4,0xb3,0xc2,0x36,0xd6,0xc9,0xb8,0xc7,0x4f,0xa3,0x84,0x61,0x2c,0x47,0x10,0xd8,0x3a,0xa1,0x6a,0xd7,0xef,0x01,0xfb,0xb7,0x42,0x1d,0x4f,0xb3,0xf0,0xf6,},{0x50,0x47,0xfa,0x38,0x19,0x7b,0x83,0x28,0xe7,0x8d,0xd8,0xa1,0x0e,0x96,0x6a,0xfb,0x7b,0xd3,0xd4,0x36,0x08,0x28,0x0f,0x1c,0x25,0x7d,0x25,0xca,0x43,0xbc,0x1c,0x06,0xe9,0x4a,0x57,0x47,0xab,0x62,0x15,0xec,0xe5,0x4c,0xde,0xff,0x8c,0x56,0x56,0x7d,0x70,0xd2,0xf9,0x1f,0x9e,0xc8,0xc2,0x60,0xaa,0x10,0x80,0xa6,0xab,0x5a,0x7a,0x02,},"\x7b\x43\x62\x32\xac\x21\x11\xa8\x40\x59\x51\x0c\x48\x36\x25\x88\xfc\xb7\x38\x34\x26\xbe\x5e\x6f\x62\xf3\x72\xe4\xf7\xcc\xa8\x3c\x81\xc2\x35\x7f\x9b\x54\xf4\xa1\x52\x91\x06\x5b\x6d\x41\xaa\xd1\xea\x93\xcf\xfa\x77\x6b\x9a\xca\xa5\x8a\xfe\x2b\x51\x64\x4b\x97\xaf\x9a\x3e\x53\xf8\x4e\x40\xaa\x6d\x86\x05\x1e\x69\x14\xcd\x03\x9d\x41\x70\xa9\xa5\x26\xdd\x69\x95\x5f\xf5\x07\xc3\x3f\x74\xe2\x17\x65\x91\xfb\x0b\x3c\xd7\xf0\x0e\xe4\x18\xf2\xc2\x58\xa9\x98\x1c\xcc\xee\x72\xf0\x1c\x84\x30"}, +{{0x19,0xa6,0x79,0xa7,0xa9,0x05,0xa1,0xe2,0xb3,0x03,0x8e,0x6e,0x41,0x8b,0x3d,0xa9,0x7c,0x30,0x89,0xc7,0xcd,0x35,0x1e,0xa0,0x7b,0xc8,0xd1,0xaf,0x64,0xea,0xcc,0x46,},{0x19,0xf0,0x83,0x61,0xf4,0x69,0xb4,0xae,0x1e,0x0c,0xeb,0x94,0xf4,0x7a,0x7d,0xe7,0x31,0x74,0x10,0xa9,0x2d,0xd0,0x13,0xb1,0x6a,0xe0,0xd0,0x53,0x2f,0xa4,0xb3,0xef,},{0x43,0x47,0xb7,0xb4,0xf7,0xc3,0xc4,0xdd,0x31,0x5b,0x83,0x84,0xa0,0xb0,0xca,0xee,0xd8,0x4b,0xda,0xbe,0x24,0xb2,0x91,0x5f,0x12,0x51,0x2d,0xfd,0x04,0x77,0x0f,0xc9,0x96,0xa1,0xbf,0xb7,0x29,0xaf,0xef,0x9e,0xdd,0x61,0x14,0x47,0x08,0x1a,0x53,0x30,0x61,0x7e,0xae,0xa1,0xc1,0xda,0xb1,0xbf,0x13,0xce,0xa8,0x99,0x72,0x04,0x91,0x0c,},"\x98\x0c\x7b\x4d\x29\x39\x06\x1a\xc7\xb9\xba\x44\x11\x17\xa1\x94\x85\x66\x17\x81\xa4\x08\x30\x67\xc5\x5a\xcf\x93\x02\x6c\x08\x2a\x93\xcc\x12\x4f\x09\x5e\x1b\x4f\x2c\x3f\x6c\x13\x54\x12\xa5\x09\x62\x28\xe8\xa0\x71\xe8\xb4\xb6\x68\xba\x9d\x96\x44\xea\x9f\x4d\xab\xfc\x54\xa9\x85\x6c\x3e\x96\x5e\x63\x63\x39\x5a\xb7\x09\x03\x7d\xda\x22\x9b\xaf\x92\x7c\xd0\x1f\x9a\xf5\xe0\x39\xaf\xc4\x2f\x3c\xec\x63\x4f\x5d\x83\x2d\x2a\xb7\xc7\xca\xd3\xad\x7b\x8c\xf2\x7e\xbd\xac\x69\x84\x31\xad\x82\x36"}, +{{0xf0,0x3b,0x83,0x63,0xee,0x5b,0x0e,0xef,0x70,0x18,0xa4,0x9b,0xc0,0x2a,0xdf,0x73,0x1d,0xa5,0x4e,0xe5,0x0a,0x7f,0x03,0xb8,0x8a,0x29,0xa2,0x08,0x2b,0x18,0x9c,0x43,},{0x31,0x28,0x7e,0xf5,0xa2,0xe6,0x41,0x04,0xab,0x77,0x90,0xb3,0x12,0xf3,0x5c,0x7a,0xd4,0xaf,0x6b,0xeb,0x0d,0x7c,0xeb,0x8a,0x58,0xf3,0x6a,0x54,0xce,0x27,0x2c,0x3e,},{0xe8,0xfa,0x96,0x7e,0x6a,0xfa,0xdf,0x6a,0x87,0x7d,0x87,0xe5,0xf5,0xc5,0x2b,0xb6,0x34,0xb7,0x5a,0x78,0x04,0x19,0x9a,0x2b,0xc9,0xd0,0x27,0xb6,0x3a,0x35,0x65,0x4d,0x9d,0xdd,0x06,0x83,0x04,0x55,0x64,0x1d,0xbf,0xb4,0x9e,0xdc,0xe4,0x2e,0x20,0xe7,0xd4,0x10,0x4a,0x07,0x1c,0x2c,0xbb,0xec,0x23,0x01,0x8c,0x29,0x7c,0xed,0x99,0x08,},"\x24\x19\x1b\x54\x64\xb3\x5a\xc7\xbc\xf4\xa3\x75\xf0\x33\xef\xba\x89\x43\xb0\x9b\x9f\xf0\xfc\x40\x3c\xa7\xaa\xe7\x02\xa3\xcb\xf3\x96\xc5\x13\x1b\xc0\x08\x13\x2c\xf5\xf1\x29\x10\xd5\x86\xdc\x1d\xb9\xc0\x84\x57\x4a\x96\xba\xbe\xe9\x56\x42\xf9\x22\x37\x1c\x03\x82\xec\x04\x02\xa2\x6f\xeb\x14\x2e\x41\x46\xbb\xd3\x36\x0c\x2b\x36\x83\x4f\xe4\x5a\xf5\xe2\x86\x8d\x4d\x56\xfd\xd5\x04\xce\xbf\x0c\x2d\x7f\x57\x91\xb4\x42\x94\x17\xc8\xb6\x5a\x98\xe0\xb1\x5c\x46\x6c\x13\x7f\x41\x05\x24\xfc\xe7\x37"}, +{{0x11,0x08,0x6b,0x0d,0x11,0xe4,0x15,0xab,0x1c,0xe0,0x2a,0xaf,0x8f,0x06,0x21,0xb5,0x44,0x30,0xf6,0xfb,0x13,0x5c,0x74,0xf4,0x0d,0x38,0xe8,0xc6,0x47,0x37,0x06,0x4b,},{0x71,0x66,0xdf,0xbc,0x69,0x1e,0xb8,0xc2,0x01,0x11,0x4b,0xa0,0xd1,0xa2,0xc7,0xb8,0x7f,0x7a,0x1f,0xd8,0xd0,0xb3,0x60,0x58,0xb0,0xd7,0xdc,0xab,0xe1,0xae,0x30,0xda,},{0xe9,0x07,0x45,0x9d,0x5a,0xdc,0xd0,0xd0,0xc3,0x64,0x18,0x58,0x1f,0x19,0xd0,0xee,0xbd,0xa7,0x13,0x8e,0xbd,0x9f,0xaa,0x0b,0x26,0x22,0x01,0xf4,0x58,0xc8,0x56,0x31,0x0b,0xb7,0x7f,0x4c,0x7d,0xe9,0x22,0x49,0x5d,0xcf,0xe8,0xb2,0x48,0xed,0xa2,0xad,0x0d,0xf6,0xa7,0x3f,0x47,0xbb,0xfb,0x89,0x4b,0xaa,0x7d,0x88,0x69,0x87,0x58,0x02,},"\x4b\x5b\x29\x36\xc5\xe3\x60\xa3\x84\x55\x50\x37\x21\x07\x8f\x8a\xdb\x40\x4a\x7e\xe7\xec\xc1\x48\x01\xdc\x87\xa6\x7a\x15\x2b\x76\x95\x69\xfb\xea\xc0\xaf\xa2\x5a\x20\x70\xa1\x68\x6b\x90\x0a\xc1\x63\x3d\x49\x98\x08\xcd\xb2\xe8\x1c\xe3\x91\x6d\x5a\x3c\x04\xd1\x9c\x5b\xb2\x69\x9a\x66\x2b\x8a\xba\x4a\xf9\x4d\x39\x0b\xac\x7c\xcc\x8e\xc9\x10\xed\x2a\xcd\xf8\x6e\xbb\x71\xad\xb6\x01\x87\x78\x85\xee\xf3\xc9\x16\x62\xfc\x30\x73\x8e\x35\x2c\xc7\x43\x53\xcc\xf8\xd8\xed\xee\xfa\xcc\x04\x2c\x10\xa0\xe5"}, +{{0xef,0xce,0x76,0x67,0xa8,0xef,0x91,0x22,0x8c,0xae,0xd1,0x4e,0xb4,0x77,0xa3,0x45,0xe5,0xe8,0x23,0x92,0x34,0x08,0x08,0x48,0x76,0x0e,0xd0,0x97,0x07,0x13,0xfa,0x86,},{0x91,0x93,0x05,0x5a,0x84,0xdf,0x1e,0xac,0xca,0x28,0xce,0x2a,0x08,0xc2,0xa0,0x7a,0x50,0xf0,0x4c,0x02,0x4e,0xcf,0x1f,0xe4,0xa4,0x7d,0x2e,0xfb,0xaf,0x63,0xed,0x58,},{0xe5,0xa6,0x31,0x24,0xdb,0x16,0x96,0xb6,0x41,0x40,0xb6,0xe9,0x61,0x2f,0xa9,0x58,0x7b,0x3e,0xef,0x71,0x01,0x09,0x39,0x8d,0x44,0xba,0x0c,0xa6,0x3c,0x0e,0xba,0xd0,0x6f,0x0a,0x6c,0x89,0x94,0xea,0x34,0xb3,0xa2,0xaf,0x91,0xa8,0x9b,0xf4,0x1a,0xe6,0x14,0xd7,0x72,0x7d,0x71,0x6f,0xd4,0x2f,0x8b,0x92,0xe1,0xac,0x64,0xfd,0xbf,0x03,},"\xaa\x1b\xc8\x0d\x7b\xcc\x1d\x94\xa2\x3a\x57\xce\xdf\x50\x27\x48\x24\x77\xdc\x46\xb8\x68\x90\xbc\x0e\x5a\xc2\x9a\xe6\xc9\x1b\xbc\x43\x13\x03\x48\x79\x73\x05\xf7\x55\x43\x58\x0a\x8a\x06\x9b\x34\x8a\x7b\xd8\xfc\x3e\x01\x52\x30\xb7\xc1\x94\x0c\x7f\x80\xa8\x2b\x12\x90\x09\x10\xdb\xcf\x06\x30\xda\x03\xf0\x81\xd4\x4c\x7f\x95\x5d\x4a\x11\x72\xf5\x6e\xcc\x7c\x5a\xc6\x46\x69\x6b\xff\xdf\x4e\xb6\xd8\x8b\xdd\x9c\xc3\x84\x35\x28\xb7\x25\x83\xab\xb3\xba\xd0\x2e\x56\xef\x76\x46\xee\xd5\x13\x95\x51\xcd\xeb"}, +{{0x88,0xfc,0xca,0xa9,0x6a,0xd8,0x84,0xd1,0x16,0x5b,0xe7,0x1d,0xd0,0xc4,0xf5,0xf8,0xf4,0x42,0x1c,0x60,0xfb,0xfa,0x49,0x8b,0xfe,0xe9,0xb9,0x67,0x46,0x24,0x43,0xbd,},{0xc7,0x5c,0xb0,0xe0,0x23,0x7b,0x45,0xb8,0x65,0x6e,0xea,0x9f,0x3d,0x1a,0x9d,0x4a,0xcd,0x01,0xa1,0x03,0xaa,0x26,0x9b,0xb2,0x4f,0xd5,0x41,0x22,0xfd,0x81,0xf2,0xac,},{0x27,0xd3,0xa1,0x97,0xcc,0x99,0x94,0x21,0x20,0x63,0xbc,0xe8,0xd7,0x99,0xe7,0x7b,0x68,0x53,0xb7,0x35,0x5e,0xbe,0x36,0x9b,0xcf,0x18,0x89,0xa4,0x18,0xa8,0x2c,0xaa,0x3a,0x79,0x87,0xa6,0x63,0xf6,0x21,0xde,0xfe,0x86,0xb3,0xac,0x4a,0xd4,0x4f,0xae,0xed,0x16,0xc9,0x11,0x6a,0xce,0x28,0xfc,0xcf,0x91,0x55,0x57,0xfa,0x77,0x99,0x03,},"\x9d\x0e\xac\x98\x55\x6b\xfa\x86\x72\xc3\x57\x05\xd1\xd6\x1a\xc4\xd0\xfc\xa1\x9d\xc0\xd9\x93\x01\x58\x77\x85\x7d\x27\xfd\x80\xf7\x4a\xca\xce\x66\x6c\x56\x34\x85\xd8\x1e\x53\x60\x3a\x6a\xef\x40\x87\x5f\xa5\x51\xcc\x10\x5f\x2c\xc1\x0b\x39\x69\x46\x79\xcd\xf4\xa6\xb0\x73\xbc\x88\x64\x5f\xc5\x1a\x36\xda\x17\x9d\x3d\x1e\x3c\x77\x22\x45\x4c\x5e\x73\x57\x7c\x61\xaa\x7d\x14\x8c\x4b\xa5\x0e\xa4\x6c\x56\xa1\xc3\xb3\xb3\xc4\x70\xf9\x31\x00\x49\x4e\x08\xbc\x55\x14\xac\x76\x3a\x85\x48\x3c\x42\xc7\xcd\xc2\x7c"}, +{{0x67,0x0b,0x30,0x62,0x6f,0xe3,0x67,0xd8,0xb4,0x5f,0x43,0x73,0x3d,0x6f,0x25,0xb3,0x7e,0xcc,0xbc,0xb5,0x51,0x96,0x3f,0x0a,0xc8,0xb6,0x66,0xb4,0x80,0x41,0xc7,0x2d,},{0x65,0xaa,0x4c,0x6d,0x4b,0xa0,0xab,0x34,0xbc,0x75,0xb3,0x9f,0x09,0x52,0x7c,0xa6,0xf2,0x42,0x5f,0x52,0x41,0x5c,0xdf,0xfd,0xf2,0xdf,0xf2,0x73,0xf8,0xea,0x61,0x2c,},{0x1b,0x6b,0x43,0x77,0xd2,0xb9,0x8e,0x0f,0x9d,0x24,0xae,0x8d,0xfe,0x30,0xe2,0x39,0x6e,0x20,0x04,0x38,0x0d,0x34,0x31,0x48,0x8e,0x58,0x43,0xcf,0x8d,0x2d,0x7a,0x00,0x70,0xab,0x21,0xf8,0xa3,0xb5,0x1c,0xe8,0x4d,0x2f,0x4b,0xa2,0x09,0xf7,0x39,0xf9,0x22,0xbe,0xbf,0x79,0x80,0x96,0x69,0x3f,0x56,0x22,0x87,0x3d,0x79,0xae,0x6f,0x04,},"\xd0\x0b\xcc\xa7\xe1\x84\xd1\x0e\x1f\x1f\xe4\x20\xb5\x06\x39\xe1\xd5\xde\xba\x52\xa7\x51\x23\x6e\x68\xc5\x9b\xb4\xbf\xf9\x80\x2f\x5f\xc1\x65\xed\x42\xfd\x6d\x53\x46\x70\xa7\xc6\xfb\x60\xe4\x30\x7d\x94\x79\x15\xa2\x48\xbf\x2f\x93\x46\x5c\x2c\xb4\x4d\x8f\x45\x3d\x2c\x01\x5a\xfb\xc8\xed\x58\x81\x8e\xa5\x17\x26\xa2\x51\x77\x93\x0e\x9e\xa1\x92\xef\x45\x14\xf4\xbb\x0e\xb4\xe0\xf5\xd4\xae\x3c\x46\xe3\x57\xc8\x11\x87\xf7\xed\x17\x47\x33\xff\xf9\x59\xc3\xf9\xfa\xe6\x48\x6c\xfa\x13\x56\xa9\x56\x99\x21\x1d\xe5"}, +{{0x81,0x3c,0x4d,0xae,0xd6,0x7a,0x19,0x0d,0x68,0xbb,0x63,0x5d,0x73,0xaf,0x6d,0xa7,0x4f,0x32,0xfd,0xf7,0xc4,0x8c,0xca,0x6e,0x59,0x26,0x29,0x46,0xb8,0xe8,0xc7,0x1f,},{0xa2,0x09,0x54,0x57,0xd7,0x69,0x70,0x20,0xe2,0xb8,0x84,0xd9,0x5a,0x96,0x57,0x8c,0x2a,0x90,0x0a,0x76,0x66,0xac,0x0d,0xc7,0xbd,0x38,0xf1,0x93,0x1d,0x79,0x45,0xd8,},{0xb4,0x46,0x57,0x4f,0xf6,0xa4,0xbd,0x2b,0x57,0x2e,0x48,0x7c,0x4a,0xb4,0x43,0xca,0x64,0x10,0x75,0x16,0x8a,0xa4,0xe1,0x09,0x2f,0x71,0xf3,0x0b,0xdb,0x06,0x8c,0xe4,0x6a,0x39,0x5e,0xfe,0xe1,0xee,0x66,0x0b,0x9f,0xac,0x26,0xd5,0x41,0x09,0x72,0x2c,0x15,0xcd,0xb7,0x91,0xbf,0xb8,0x7f,0xff,0x63,0xc6,0x59,0x6a,0xd4,0xf2,0x27,0x0c,},"\xce\x54\xcb\x04\x50\xe6\x89\xa0\xdb\xef\x78\x53\x08\xb3\x17\x74\x72\xfc\xd6\xd3\x82\x03\xe5\x8a\x05\x90\xb3\x1f\xa2\x53\xf9\xea\x59\x0b\xe5\x36\x8a\x92\x2d\xe8\x8b\x63\x45\x01\x02\x68\x44\x43\xfb\x81\x89\xe6\x01\x28\x20\x03\x32\x3b\x89\xc8\x1e\x92\xea\xef\x2b\x5d\xdc\x4a\x55\xc5\x3f\xa3\xcf\xad\x41\x60\x24\x8b\x3c\x28\x6f\xf8\x0d\x31\xd1\x61\xb7\xb8\xde\xe7\x13\x55\x2b\x56\xf1\x50\x7f\xb7\x2e\xad\xfa\x89\x05\x4e\x9d\x16\x00\xac\x87\x4c\x4b\x0a\x96\x10\x04\xeb\x6d\x0d\x4b\xfd\x2e\xcb\x9c\x73\x4f\x00\xba"}, +{{0x84,0x00,0x96,0x2b,0xb7,0x69,0xf6,0x38,0x68,0xca,0xe5,0xa3,0xfe,0xc8,0xdb,0x6a,0x9c,0x8d,0x3f,0x1c,0x84,0x6c,0x8d,0xce,0xeb,0x64,0x2b,0x69,0x46,0xef,0xa8,0xe3,},{0x98,0xbe,0x21,0x00,0x19,0x93,0xa7,0xeb,0x1a,0x12,0x77,0xff,0x74,0xc1,0x55,0x04,0x18,0x3d,0x25,0xfd,0xfc,0xc0,0x5f,0x0d,0x4d,0xea,0x89,0x2f,0x6e,0x30,0x18,0x90,},{0x0a,0xd7,0x1b,0x00,0x25,0xf3,0xd9,0xa5,0x0d,0xb3,0x38,0x41,0x4d,0x6d,0x67,0x0e,0x77,0x99,0xb7,0x27,0x0a,0x84,0x44,0xf6,0xae,0x7f,0x12,0xae,0x7e,0xb7,0x1b,0xd0,0x3f,0xfd,0x3c,0x4f,0x36,0x63,0x1f,0x69,0xfd,0xcc,0x40,0x61,0x46,0x8f,0xf5,0x82,0xed,0xe4,0x95,0x24,0x3e,0xf1,0x36,0x1a,0x3b,0x32,0x95,0xfa,0x81,0x3b,0xa2,0x05,},"\xf7\xe6\x7d\x98\x2a\x2f\xf9\x3e\xcd\xa4\x08\x71\x52\xb4\x86\x4c\x94\x3b\x1b\xa7\x02\x1f\x54\x07\x04\x3c\xcb\x42\x53\xd3\x48\xc2\x7b\x92\x83\xac\xb2\x6c\x19\x4f\xd1\xcb\xb7\x9e\x6a\xfc\x32\xff\x68\x6b\x55\xb0\xb3\x61\x72\x18\xdc\xf3\x93\x16\xb4\xb6\x6b\x3c\x8c\x0d\x67\x26\x7a\x86\xdb\x8a\xdf\x37\x50\x80\x1b\xcf\x93\x27\xd4\xc2\x54\x41\xb9\x61\x97\x83\x2b\x4c\xde\x0e\xac\x3f\xf2\x28\x92\xa2\xf0\xbc\x17\xc2\xc2\x13\xc0\x23\x77\xa3\x33\xe3\x08\xed\x27\x16\x58\x04\x93\x83\xb7\xe2\xe5\x7b\x6b\x8b\x12\x55\x12\xe0"}, +{{0x62,0x88,0x72,0x20,0x35,0xd1,0xea,0x69,0x9b,0xc7,0xcf,0xdf,0x18,0xd8,0x96,0x25,0x42,0x31,0x80,0xb6,0x83,0xfa,0x74,0x63,0x9f,0x4f,0x30,0xf1,0x53,0x59,0xcc,0x85,},{0xe1,0x7f,0xaa,0x01,0x95,0x72,0x86,0x1a,0x06,0x4e,0x1b,0xc5,0x71,0x25,0x6d,0xea,0x14,0x68,0xf3,0xa4,0x85,0x90,0xa8,0x91,0x38,0xaa,0xa8,0x59,0x25,0x08,0x0c,0xd7,},{0x9d,0xec,0x92,0xb6,0xe8,0x9a,0xdb,0xe8,0xf4,0xe1,0xb5,0xe9,0x3a,0xc4,0xfc,0xf9,0x57,0xde,0x7d,0x19,0x70,0xa2,0x26,0x77,0x0e,0xc4,0xed,0xa6,0x47,0xc8,0xe3,0xb3,0xdf,0xfb,0x27,0x31,0xa3,0x9e,0x16,0xe4,0xa0,0x11,0x9d,0x36,0x62,0xa9,0x37,0xe5,0x60,0x52,0x24,0x91,0xec,0x7a,0x16,0x96,0xbe,0x04,0xc0,0x76,0xb1,0x2e,0x35,0x01,},"\x8b\x6c\xaa\xca\xc5\x1d\x89\x49\xfb\x86\xac\xbc\xb1\xb9\x9d\x85\x9f\xf6\x7c\x64\x14\x7b\xc1\x21\x69\x09\xdc\xab\x07\xee\x6e\xf0\x9f\x40\x38\x63\x32\x73\x94\x68\x9d\xc3\x4a\xbc\x77\x8f\xcb\x5c\x1f\x50\x91\xac\xf5\xa0\x8f\x9d\x84\x22\x11\xd1\xae\x2e\xb4\x0b\xe9\xbb\x8d\x66\x79\x07\x74\x71\x54\x7a\x6c\x71\xff\x77\xb5\x19\xd4\xb7\x10\x8e\x32\xbc\x46\x25\x1c\x60\xde\xe8\xe3\x32\xb6\x22\x93\x16\xe6\xd5\x7c\x22\xab\x82\x6f\xf1\xbc\x33\xf2\xb0\x21\x38\x07\xc1\x92\x80\xaf\x11\x0f\xd2\x6e\xe2\x74\x68\x20\x1c\xff\x49\xcb"}, +{{0x13,0x03,0x8a,0x3a,0x65,0xef,0x32,0x75,0x9a,0x9c,0xd9,0x03,0xac,0xb5,0x54,0xb2,0x52,0xde,0x00,0xe7,0xcd,0xb7,0x7b,0xbe,0xd1,0x97,0x0b,0x20,0x68,0x0e,0xe1,0x7b,},{0xb6,0xa3,0x08,0xe6,0x7f,0x9b,0x46,0xc6,0x64,0x99,0x45,0x6a,0xb5,0xcd,0x13,0x5c,0xb2,0xfe,0x84,0xa3,0x2e,0xb0,0x45,0x35,0x86,0x26,0x60,0x4d,0xa4,0x12,0x2c,0x8f,},{0x52,0x61,0x55,0x8e,0xcc,0x3c,0x98,0xff,0x36,0x35,0x1f,0x42,0xf5,0x04,0xca,0xd4,0xa3,0x2f,0xfd,0xa5,0xa7,0x44,0x56,0x09,0x60,0xb4,0xc1,0x06,0xe4,0x49,0x2f,0x02,0xe2,0x04,0x78,0x88,0x7a,0xfe,0xe4,0xf7,0x70,0xf0,0x55,0x97,0xa7,0xe3,0x88,0xca,0xce,0xae,0x80,0x5a,0xe3,0x51,0xe0,0xe4,0x5e,0x8e,0x57,0x8e,0x6a,0x6f,0xf2,0x0c,},"\xdd\xf0\x0b\x40\x33\xa2\xa0\x88\x02\x2d\xab\xe9\x33\x56\x43\x2f\x50\xdd\xc6\xc6\xe1\xa6\x59\xdc\x1a\x93\x12\x4a\x4c\x2f\xff\xfd\x18\x27\x65\xa2\xf5\x6c\x43\xea\x0b\xfd\x8d\xe8\x01\x50\x60\x88\x9a\xe6\x94\x1c\x3f\x3e\x25\x5d\x44\x21\xa1\xc3\x62\x01\xbe\x84\x6a\x27\x38\xa7\x1f\x12\x0c\xad\x59\x8c\xa8\x52\x7d\x70\xff\x8d\x5a\x09\x93\xb5\x5c\xb5\x15\x35\x17\x11\x0a\x41\x96\x2d\xaf\xf4\x22\x50\x15\x8f\x20\x96\xd1\xdd\xaf\x71\x86\xe5\x02\x98\xcb\xe5\x1f\xcb\x42\x9c\xbe\xa4\x11\x29\x3f\x8a\x7b\xd9\xcf\x06\x9f\xa2\x37\xe4"}, +{{0xb9,0xde,0x5b,0x06,0x3d,0x3c,0xa3,0xa7,0x73,0xf1,0x14,0x94,0x1b,0x2e,0x42,0x27,0xc0,0x75,0x11,0xc0,0xf5,0xc0,0x60,0x17,0xb9,0xc8,0x84,0x50,0x18,0xf2,0x34,0x32,},{0x52,0x95,0x24,0x3c,0x86,0x46,0xe0,0x96,0x67,0x4d,0xda,0x15,0x97,0x9b,0x32,0x2b,0x9d,0xd0,0xfa,0xf2,0x7d,0x02,0x4a,0x0e,0xd5,0x77,0x13,0x34,0xe1,0x17,0x9e,0xd2,},{0x92,0xba,0x76,0x0d,0x14,0xd1,0x41,0x5c,0xfa,0xf2,0x18,0xca,0x84,0x70,0x14,0x08,0x8a,0xe5,0x1a,0xd8,0x21,0x11,0x3a,0x6f,0x86,0x30,0x35,0x6f,0x7b,0xa8,0x5c,0x00,0x5e,0x23,0x30,0xf1,0x06,0x6d,0x0d,0xf4,0x64,0x80,0x60,0x52,0xa4,0x17,0x46,0x10,0x05,0x04,0x62,0xf3,0xe0,0x13,0xd7,0x02,0xe7,0xc7,0x71,0x85,0xa0,0x32,0x58,0x0b,},"\x94\x93\xcc\x23\x89\x6b\x84\x09\x60\x46\xae\x10\x53\xaf\xe3\x94\x99\xe9\x42\x42\x54\xb3\x66\xfe\x14\x3f\x4d\xa3\x21\xe2\xdc\x9e\x47\x84\x20\x8e\x12\xa5\x42\xd8\x99\x82\x8d\xde\x7e\xff\x62\x5a\x7f\x12\x41\x69\x90\xc2\x84\x1f\xfb\x09\x5b\xf9\x4c\x0c\x61\x0e\x5a\x66\x39\x18\xb6\x89\x03\x1c\xcd\x6b\x51\x93\x49\xd0\x4d\xe1\xc2\x12\xca\x2a\x9d\x7a\xbf\x52\xe1\xb4\xfd\x46\x7b\xb6\x65\xb6\x91\x9e\xf8\xf9\x16\x17\xe2\x05\x56\x5b\xf5\x66\x47\xe5\xf8\xd5\x08\xea\x20\x0a\x84\x46\x7f\x8f\xa1\x22\xe7\x4b\xc3\xb9\x97\x9f\x11\x74\xe5"}, +{{0x8f,0xf0,0x29,0x7c,0xc0,0x88,0x42,0xb5,0xe6,0x75,0x52,0xec,0x28,0x43,0xe0,0x43,0x53,0xa3,0x4d,0x74,0xef,0x89,0xb8,0x56,0x5d,0x97,0x20,0x5b,0x74,0xca,0x13,0x3a,},{0x0f,0x7e,0xf9,0x8c,0x5b,0xa4,0xaf,0x98,0x4d,0xfb,0x77,0xbc,0x4e,0x53,0x7b,0x2b,0x39,0xe6,0x27,0x3b,0xb3,0xe7,0xb9,0x5f,0xe1,0xb7,0xe6,0x78,0x19,0x52,0xbd,0x4a,},{0x07,0x83,0x73,0x7f,0x70,0x6e,0x6f,0xf3,0x66,0x14,0xf8,0x50,0x07,0x4f,0xca,0x1f,0x48,0x5f,0x24,0xfc,0xde,0x2a,0x28,0xaf,0x54,0x4f,0x37,0xab,0xd6,0x9b,0x7a,0x58,0x1d,0xef,0xd8,0xc7,0x71,0xb0,0x31,0xe1,0x08,0xd1,0x9d,0x78,0x8c,0x74,0xc5,0xf2,0x0b,0xb3,0xf1,0xc2,0x1c,0xd9,0x2b,0xe3,0x17,0xba,0xcd,0x8f,0x65,0x0b,0x49,0x05,},"\x2b\xdc\x3a\x48\x6c\x5e\x4e\xa6\x2d\xcf\xec\x8a\x9d\x4f\xcf\x9e\xa9\x49\x0d\xbc\xc7\x15\x61\x5d\x58\x49\x0a\x72\xce\x83\x3f\xa2\x23\x87\xca\x50\xa0\x05\x25\x08\xcf\x0a\xff\x1c\xa7\x27\xf0\xfe\xd4\x6f\xfa\x7d\x3c\x8e\x23\xc5\xbb\x01\xd4\x7e\x90\xff\x06\xd3\x85\x8a\x55\x7d\x99\x26\x48\x15\x79\xda\xf4\x38\x4a\xea\x50\xe9\x6e\xc6\x15\xd2\xa3\xbf\x3c\x11\x22\xf1\xf2\x4d\xd6\xed\x98\xa5\xde\x42\x18\x83\x58\x9c\x21\x39\x98\xca\x54\x32\x37\x3e\x68\xbb\xbe\x89\x42\x8c\xa9\x88\x5d\x05\x93\xd5\xe6\x21\x51\x16\xb8\x26\x63\x86\x45\x2b"}, +{{0x05,0x0d,0x55,0x3d,0x28,0x2d,0xca,0x32,0x69,0xc8,0x3c,0x18,0x17,0x68,0xec,0x06,0x7b,0x81,0xc9,0xfe,0x0c,0x94,0xf2,0xa0,0xeb,0xbb,0x0c,0x94,0x2d,0x0f,0xcd,0x7c,},{0x63,0xe2,0x30,0xb0,0x03,0xc5,0x3a,0x56,0x72,0xe8,0x32,0xff,0x7f,0x24,0x43,0x0b,0xe2,0x23,0xe4,0x97,0xde,0x84,0x02,0x33,0xf5,0x95,0xa3,0xe2,0x00,0xc7,0x12,0x7e,},{0x3f,0x0e,0x83,0x76,0x5b,0x31,0xbb,0xe8,0xe1,0xfb,0x92,0xe9,0x67,0x8d,0x6c,0xde,0x57,0x1a,0x03,0xba,0x7f,0x1d,0xcc,0x11,0x28,0x46,0x1f,0x70,0x85,0x25,0x45,0x7f,0x4e,0x0e,0x23,0x53,0xaa,0x2b,0x59,0x8c,0x06,0x3f,0xf1,0xbf,0xfd,0xac,0x91,0x6b,0x5a,0x22,0x00,0x65,0x51,0x56,0x90,0x4b,0x05,0x85,0x57,0x7a,0x16,0x28,0x56,0x0d,},"\x15\xe1\x3b\x8c\x01\x00\x4f\x6a\xa5\xb2\x36\xdb\xb2\x81\x67\x7f\x74\x6d\x81\xe5\x48\xe0\xaa\x80\xf0\xe4\x14\x52\x15\x21\xd8\x56\xcd\x69\x4e\x7c\x91\x52\xbb\x5e\x43\x77\x6b\x60\xf6\xb5\x60\xed\x1a\xd3\xe4\xb3\x90\xdb\xf3\xe4\x6e\xf9\x25\x74\x43\xf3\x9c\x14\x9e\x02\x40\xa0\x2d\x02\x1e\x1e\x3d\x7d\x04\x6b\x26\xfd\x00\x4e\xee\x7c\xa1\x6a\x80\x59\xe1\x26\xc7\x4c\xb3\xf2\x19\x4d\xb4\x7b\xf6\x04\x65\xec\xef\x5c\x70\x4d\x2e\x2c\x75\xe2\xe5\x00\x60\xea\x2a\x31\xcb\x72\xb7\xb3\xc6\xb1\xb5\xec\x72\xab\x38\x00\x40\x85\x28\x1a\x22\xfe\x86"}, +{{0x69,0x49,0x7c,0xd7,0xb4,0xe8,0x68,0xcf,0xa0,0x32,0x8d,0x92,0xbd,0x60,0x52,0xd7,0x72,0xb2,0x76,0x73,0x95,0xc1,0x45,0x95,0xb2,0x79,0x85,0x1a,0x9c,0xdd,0x31,0xaa,},{0x5d,0x27,0x6d,0x62,0x6e,0x23,0x0d,0x18,0xe7,0xbc,0xd6,0x11,0x41,0xcb,0x93,0xc9,0x0e,0xf0,0xf7,0x9e,0x01,0x32,0x12,0x12,0xd8,0x38,0xec,0x71,0x45,0x7b,0x1a,0xac,},{0xbe,0xaf,0xa5,0x83,0x40,0x96,0x09,0x08,0xe8,0xd8,0x6e,0x40,0x32,0x9e,0x3a,0x45,0x23,0xfc,0x7b,0xe7,0x70,0xad,0xdb,0x86,0xe3,0x4c,0x37,0x72,0xf8,0x4c,0xd9,0xfb,0x33,0x8d,0x1f,0x3b,0x65,0xbf,0xcd,0xb0,0x9f,0x35,0xc6,0xda,0x36,0xd1,0xa3,0xad,0xf8,0xf9,0x1f,0x1f,0xfd,0x57,0x82,0xcc,0x83,0x02,0x06,0x43,0x3a,0x08,0x41,0x0d,},"\x53\xcd\x08\x0a\x0c\x61\xf1\xa0\x93\xd3\xb3\xa7\x45\x71\xc2\x96\x30\x3f\x36\x3b\x41\x07\xed\xbe\x88\x0b\x7a\xa9\xdf\xe4\x4a\xb5\xd5\xdc\x5f\x74\xbe\x9c\x8d\x87\x6f\x04\xd7\x54\x65\x34\x91\xab\x51\xb1\x35\xfc\x95\x3f\x71\x28\x7b\x62\xff\x41\xb6\x7c\x74\x2b\xd3\x44\x56\x71\xa9\xd4\xf2\xdc\x17\x4c\xa1\xb0\x33\x5f\x78\x62\x7a\x0d\xd4\xb3\x06\x50\x50\x41\x78\x03\x9e\x73\x93\x63\x85\x10\xff\xe8\x40\x91\xb5\x72\x98\xd3\xac\x90\x01\xc3\x67\xc1\x45\x2f\xbc\xb3\x3d\xc5\x4a\x5d\xc3\x16\xfb\x2a\x52\x70\x76\x4a\x2a\xc8\x20\xa0\xb6\x3f\xbd\xc6"}, +{{0x21,0x65,0xa4,0x86,0xb6,0x12,0xbb,0xff,0x52,0x9c,0xd0,0x03,0x46,0x96,0x4a,0x3c,0xb8,0xcd,0xcf,0xfa,0x51,0xdc,0x3d,0x52,0x4d,0xd5,0xad,0xc5,0xac,0x93,0x6d,0x68,},{0x7e,0xbc,0x83,0x9a,0x46,0x5e,0x14,0xf5,0x89,0x24,0x76,0xe4,0xa1,0x3b,0x39,0x88,0xf8,0x3b,0x3c,0xd2,0x7e,0xf7,0x9e,0x19,0x3f,0x86,0xfa,0x16,0xf3,0x4a,0x1c,0xe1,},{0x7e,0xc6,0xfb,0xa5,0x6b,0xa5,0x24,0x60,0xa1,0xb4,0xf2,0x73,0x86,0x89,0xc1,0x88,0x3d,0xda,0x9a,0xaf,0xfc,0x8b,0xde,0x17,0xcb,0x60,0x29,0xbd,0xce,0x3a,0x0e,0xbe,0x2f,0xff,0xda,0x55,0x93,0x9b,0x70,0xbb,0xd0,0x7f,0xdb,0xf6,0xfc,0x5c,0xda,0x87,0xfe,0xd8,0xba,0x58,0x57,0x5f,0x89,0x4a,0x36,0x6e,0x45,0xe5,0x70,0x5e,0xea,0x09,},"\xb7\x28\xda\x7a\x36\x16\x7c\x60\x85\xbd\x2d\x96\x2c\xf6\x39\x59\xfa\xcd\x95\xc9\xad\x45\x42\x02\x8a\xfb\xa9\x0e\xc9\xc6\xc0\x76\x0b\xda\xe9\x35\x42\x9c\x3f\xeb\x39\x33\xe2\xf0\x00\x42\xc6\x72\xad\x2c\xd7\x34\x8d\x92\xbc\x33\xf8\x17\x51\xe2\x94\xae\x91\x71\xb9\x45\xb1\x93\x14\x4e\xf8\xac\xb9\xa1\xbd\x9a\xbf\x04\x75\xce\x0d\x0a\xc7\x89\xb2\x00\xc3\x2e\x9c\x9a\x27\x36\xb1\x68\x36\x9c\xe5\xf9\x7b\x1e\x8d\x2e\x79\x00\xe1\xa7\x59\x17\x84\x41\xf1\xfc\x43\x05\x64\xae\x12\x9b\xae\x78\x57\x74\x05\x11\xa6\x68\xf3\x2c\x0a\x3b\x07\x7a\x9d\x8b\x19"}, +{{0x1c,0x64,0xad,0x63,0xdd,0x14,0x70,0x34,0x59,0x8e,0x12,0x8f,0x74,0x06,0xec,0x05,0x30,0x74,0x6e,0xa1,0xc5,0xb7,0x2e,0xcf,0x79,0xe8,0x88,0x06,0x54,0x86,0xfa,0x1b,},{0xba,0xa6,0xbc,0xc1,0xc3,0xd8,0xd3,0xb1,0x1f,0xfc,0x15,0x87,0xad,0xdd,0xc5,0x8b,0xfd,0x96,0xc2,0xb9,0x92,0xb6,0xc6,0xf5,0x9f,0xcc,0x50,0xcc,0xbc,0xdd,0x0e,0xb9,},{0x74,0x77,0xe5,0x41,0x58,0xf1,0x3b,0x71,0x28,0xc0,0xa1,0x10,0xca,0x6b,0x65,0xf4,0x25,0x14,0xfb,0x70,0xcd,0x5c,0xf2,0x8a,0x8b,0x1c,0xc6,0x11,0x0e,0xa0,0x6f,0xcf,0x94,0x29,0x0d,0xa1,0x3f,0x85,0xa1,0x1c,0x23,0x51,0xd3,0xbb,0xcc,0xbb,0x4c,0x64,0xe0,0x21,0x5d,0x6d,0x0f,0x00,0x99,0xe7,0xf2,0x7b,0xc9,0x4e,0x94,0x9b,0x15,0x0b,},"\x9e\xbd\x8e\x33\x78\x93\xbb\x05\x3e\xf2\xb9\xe3\x26\x9d\xf5\x48\x48\x49\x4f\x03\xcd\x63\x57\x6b\x33\xe6\x4b\x10\x80\xbe\x4b\xe0\x15\x26\x4a\x40\x3f\xb9\x60\x2b\xbf\x90\xca\x19\xb2\x41\xa9\xb6\x68\x63\x90\x9b\x90\x08\xce\x1b\x2f\xfc\xf2\x36\xef\xa4\xc2\x66\x8f\x0f\x47\xdb\x9f\xf5\xfa\x15\x7d\x9c\xb6\x05\x41\x2b\xe7\xdd\x8b\x07\xea\x87\x8c\xcc\xae\x6b\xf5\x0f\x93\x5b\x86\xd1\x9e\x1b\x64\x8b\x69\xe5\x28\x55\x3a\x56\xd8\xaf\xb7\x82\x21\xad\x53\x30\x7b\x7a\x4e\xc8\xd2\xfd\x48\x61\xb5\x5d\xc5\xda\xe8\xe9\x3e\xf3\x87\xfb\xbe\x0b\x4c\xe7\xf7\x88"}, +{{0x55,0xab,0xbc,0x5d,0xac,0x41,0x28,0x13,0x4d,0xc8,0xc6,0x01,0x8a,0x21,0x3e,0xd4,0xb6,0x0f,0xcc,0x8e,0x90,0xcb,0xd4,0x1d,0xb2,0xd2,0x1e,0xda,0x53,0x73,0xe9,0x36,},{0x25,0x1a,0xfa,0xa2,0x64,0x69,0x26,0xb2,0xa3,0x71,0xf2,0xa0,0x9d,0x58,0x65,0xb9,0x8c,0x9a,0x5e,0xb6,0xca,0x04,0x7c,0xd0,0xd8,0xee,0x36,0xe5,0xe0,0x41,0x69,0x74,},{0xf6,0xa6,0x1c,0x2e,0x66,0x1a,0x9e,0xb7,0xbd,0xe1,0x82,0xe3,0x8e,0xc9,0x9a,0xf9,0x85,0xf6,0x16,0x98,0xa5,0xd7,0xfa,0x43,0x0d,0x16,0xe3,0xf1,0xa9,0x37,0x09,0xb7,0x55,0x22,0x32,0x0d,0xe4,0x8a,0xfc,0xc5,0x95,0xab,0x20,0x91,0x22,0xae,0x0c,0xe1,0x32,0xcd,0xf4,0xb0,0x39,0x17,0x46,0xe7,0xff,0x34,0x11,0x77,0x57,0x0c,0x81,0x08,},"\x47\x01\x0e\x13\x98\xad\x55\xfa\xbe\x37\x1d\xd8\x64\x8f\x76\x8d\x90\xdf\x4b\x96\x5a\x3b\x39\x61\x00\xb3\x03\xb4\x0a\x17\x51\x8b\xed\x6d\x86\xb0\x9f\x73\x4a\xb7\xc1\x0b\x5f\x3a\x01\xb5\x3d\xee\xc5\xf8\x53\x4b\x70\xc7\x9f\x3f\x29\xb2\x84\xfd\xec\x48\x6f\x22\xf4\x4c\x22\xcc\xd5\xc6\x46\x35\x94\x41\x52\x67\xba\xa6\x11\xf7\x0b\x1b\x31\x6c\xaa\x1b\x68\xb5\xe0\xe9\x9b\x31\xc5\xbb\x0c\xe1\x36\x79\xa2\x3c\x31\xa6\x39\x99\x69\x81\x64\xcb\xf3\x7d\x10\x3b\xa9\x24\x90\x18\x8b\xe5\x99\x37\xf1\x23\x04\x3e\xc7\x86\xef\xe3\xd4\x11\xf9\xb0\x62\x3a\x6a\xd9\x72"}, +{{0xf2,0xdc,0xf4,0xa1,0xa0,0xd4,0x6d,0xdb,0x2d,0x72,0xf8,0xfd,0xd8,0x0b,0xbe,0xc5,0xb7,0xde,0xa5,0x91,0x3d,0xa4,0x96,0x6c,0x2f,0x4d,0x12,0xc2,0x61,0xf0,0xbf,0x98,},{0xd3,0x95,0x70,0xa2,0x5c,0xa5,0x9f,0x22,0x57,0xf9,0x3f,0x96,0x60,0x0d,0xf4,0xf6,0x3e,0x68,0x4b,0xf6,0x3a,0xe8,0xdf,0xfd,0x91,0x4e,0x46,0x29,0xc3,0xd5,0x09,0x5f,},{0x42,0x88,0x2a,0x81,0x1d,0xad,0x2d,0x85,0x18,0x85,0xe4,0xcb,0xe9,0x04,0x47,0x08,0xd9,0x1a,0x86,0xf1,0x5d,0xfa,0x1d,0x66,0xc3,0xeb,0x30,0x43,0x14,0x53,0x1f,0x30,0x15,0x20,0x8c,0x71,0x1b,0x9b,0xdb,0xc5,0xfb,0x23,0x39,0x51,0xe5,0x69,0xb5,0x9d,0x34,0xe4,0x15,0xee,0xc4,0xb3,0x7f,0xfd,0x37,0x4d,0x41,0x2c,0x9a,0x36,0x0d,0x0c,},"\x3b\x00\xe8\x08\xfc\xa4\xc1\x16\x51\xd8\x53\xd6\xb9\x0f\x95\x2c\xcf\x56\x47\xe1\x02\xd4\xee\x0a\xd7\xa5\xd1\x81\xd5\xb4\x25\x8c\x52\x3c\xd3\x9e\x3d\x98\x25\x29\x8d\x84\xc8\xcb\xa0\x9f\x43\xdb\xba\x11\x99\x88\x22\x2c\x76\x05\x9c\xaf\x17\xb4\xbf\x99\x31\xc4\x5e\x61\x74\x48\xae\xad\xe1\x51\x18\x14\x97\xb2\x45\x52\x36\x7e\x52\xbc\x45\xac\x79\x08\x88\x06\xd3\x36\x82\x07\xaa\xfe\xfd\x30\x57\x84\x5d\xce\x81\x9d\x5a\xaa\xa7\x7b\x21\x8e\x2a\xed\x3d\xa7\x6d\x40\xc1\xf0\x76\x99\xf8\x17\x2e\x4a\x5c\x80\x3f\x7a\x2a\xce\xb9\xa4\x7a\x89\x52\xe1\xb2\xf0\x53\xf2"}, +{{0x22,0x46,0xbf,0xb0,0x61,0x55,0x85,0x9e,0x10,0xa7,0x48,0xff,0x8f,0x59,0x19,0xad,0x5d,0x1d,0xaa,0xb7,0x56,0xf0,0x10,0x57,0xb7,0x90,0xd0,0x74,0x74,0x77,0x5f,0x4f,},{0xfa,0x63,0x49,0xb6,0x2d,0xc8,0xc6,0xa2,0xfe,0xee,0xf6,0xff,0xc3,0x3a,0xe0,0x85,0xc6,0x49,0x79,0x5c,0x1c,0x9d,0x98,0x98,0xe7,0x5c,0x13,0xae,0x16,0x25,0xdb,0x34,},{0x2b,0xe4,0x91,0x5a,0x35,0x2f,0x77,0x85,0x48,0x30,0x46,0xd8,0xae,0x96,0x25,0xb8,0xb6,0x32,0x57,0xaf,0x57,0xc0,0x73,0x69,0x12,0x56,0xee,0x07,0x6d,0x6e,0x1b,0x97,0x2a,0x10,0x1f,0x55,0x1c,0x70,0x5d,0x3f,0x96,0x15,0x7c,0x33,0xb5,0x6e,0xa0,0x49,0xbe,0x4a,0xf4,0xdc,0x56,0x1c,0xbe,0x3c,0x1e,0xc5,0x07,0x2d,0x7f,0x13,0x4e,0x07,},"\x63\xee\x1c\x7b\xbb\x15\xce\xbe\x1c\x22\x53\x2d\x48\x16\x82\x75\x4b\xda\xf5\x8b\x8b\xc9\x97\xae\x30\xa3\x4c\x9d\x23\xc3\x3f\x16\x90\xc3\x46\xab\x0a\x73\x65\xff\x62\x45\x74\x24\xb6\x10\x5f\x84\x21\xec\xa0\xce\x3c\x63\x0a\xcf\xeb\x9a\x1c\xc4\x16\x39\x0e\xdf\x49\x20\xe2\x2b\x23\x67\xe9\xfb\x5d\x2a\xb2\x5b\xee\x56\xda\x03\xea\x55\xe3\xf5\x78\x82\xd4\x8b\x89\x22\x93\x14\xd7\x34\xcb\x83\xc7\x9f\x4e\x17\xee\x64\xba\xe6\xf7\xad\xdb\xe9\xb5\x25\xfc\xd0\x3a\x91\x40\x9a\x2d\xde\x90\x77\x51\xdb\x8c\xc9\x7e\x08\xd0\xea\x89\xc4\xd1\x87\x18\xd2\x6d\x0b\x89\x7b\x64"}, +{{0xc0,0x88,0xa3,0xdd,0x2c,0xb8,0xbd,0x5d,0x68,0x4d,0xb8,0x53,0x8d,0xc2,0x24,0x73,0xb6,0xf0,0x14,0xf6,0x4f,0xe8,0x6a,0xf1,0x68,0xb4,0xbb,0x01,0xb9,0x0a,0x1d,0xd0,},{0xaa,0xd6,0x15,0xa9,0xc2,0x87,0x59,0xf0,0x3d,0x37,0x3a,0xbe,0x66,0x66,0x91,0xde,0xad,0x8b,0x84,0xf9,0xb8,0xb5,0x0a,0x67,0xf8,0xf0,0xaa,0x4a,0x70,0x15,0x80,0xd1,},{0x3b,0xb4,0x59,0xd1,0xac,0x57,0x5a,0x18,0x0c,0x17,0x28,0xd8,0xb8,0x92,0x49,0x70,0x49,0x2a,0x0c,0x8d,0x2a,0x37,0x8c,0x29,0xd1,0xd4,0x17,0x85,0xc8,0x37,0x9a,0x58,0xe2,0xba,0x36,0x06,0x78,0x5e,0x1c,0x5d,0xa2,0x9e,0x55,0x27,0x55,0x2b,0xc6,0xdc,0x89,0xa2,0xb6,0x9c,0x27,0xfe,0x51,0xed,0x25,0x3a,0x9f,0x3b,0x56,0x5b,0x27,0x00,},"\x74\x90\x6a\xe0\x5a\x5a\xf8\xe9\x96\x8b\x6f\xeb\x49\x85\x69\xd6\x34\x5a\x24\xf9\x71\x1b\xef\xb1\x36\xe6\xc3\xb5\xed\x49\x33\x9e\x59\xa7\x93\x8b\x4b\xa1\xa1\x18\xf1\x69\xb9\xac\xe0\xf7\x84\x2a\x26\xa6\x45\xf1\x4c\x0a\xd2\x2e\xbb\xcd\xa9\x3e\x67\xe4\xc3\x48\xef\xc3\xd9\xec\xbb\x14\x19\xe6\x26\x2d\x04\x36\xa5\x8e\xa8\x2c\x22\x02\x38\x90\x65\xcc\xf6\x7c\x4f\x55\x0e\x45\xb5\xf6\xa1\x2a\x6c\x01\x1b\x2e\x0a\x30\x10\x1d\x5c\x62\x32\x8b\xbf\x99\xc8\xc9\x55\x63\xa6\xe3\x3b\xdd\x9c\xce\x72\xb1\xf7\x20\x13\x9c\x2f\xd3\xe0\x49\x13\x14\x6a\xe5\xba\xc5\x28\x8e\x0e\x3e"}, +{{0x45,0x66,0x7d,0x1e,0x7b,0x59,0x10,0x97,0x9c,0x4a,0x32,0x83,0x17,0x96,0x83,0x71,0xc8,0x64,0xd5,0x64,0xa6,0x61,0xc5,0xcc,0xe5,0x57,0xc9,0xec,0xc6,0x1b,0xab,0x9e,},{0xed,0xcd,0xf5,0xe1,0xa1,0x70,0xe0,0x0c,0x8c,0x68,0x7e,0x7e,0x9c,0x18,0xf9,0x89,0x3b,0x5f,0xe4,0x95,0xcd,0x29,0x77,0xce,0xb7,0xf4,0x46,0xc0,0x14,0x9a,0xa9,0xd3,},{0x6d,0xe6,0x68,0xf1,0xca,0x6f,0x29,0x28,0x14,0x62,0x52,0x89,0xa0,0x80,0x80,0x20,0xc8,0x7c,0x89,0xac,0x94,0xf5,0xb0,0x50,0x8e,0x55,0x7b,0xdf,0x80,0x00,0xa5,0xca,0x80,0x8f,0x02,0x1c,0x96,0x79,0xb5,0x0e,0xe2,0xf3,0x20,0x06,0x4c,0x95,0xa4,0x64,0xa8,0x43,0x93,0x79,0x82,0x8c,0x3b,0x76,0xcf,0xa7,0x66,0x45,0x5e,0x12,0x8c,0x0b,},"\xcd\x66\xce\xc4\x76\xc8\x7c\x8d\xbf\x47\xec\x91\xda\xc4\x8f\xb5\xb4\x2d\xb1\x28\x2a\x57\x3e\x0a\x5c\xf0\xb9\x17\x68\x98\x66\x08\xe1\xd7\xeb\xd0\x5f\x52\x51\xbc\xf8\xb4\x7a\x17\x09\x32\x29\xac\xef\xbd\x44\xbe\xb2\x1c\x0c\x0c\x92\x8d\xd3\xcd\x3f\x89\x66\xec\xce\x69\x10\x33\x1c\x50\x8e\xa7\x6b\xaf\x90\x4d\x8c\x21\xf6\xc1\x7c\x2c\x58\xd0\x0a\xfd\x32\x59\xb8\xbf\x79\x4c\x14\x6b\x12\xb9\x95\xcd\xdd\x1c\x42\x89\xc5\xbe\x31\x68\xeb\xd6\x16\xb3\x84\xc2\x81\xce\x1b\x38\xa1\x0e\x18\x07\x80\x88\x53\xc6\x81\xa6\x40\xa0\x09\xb4\xd2\xac\xd7\x93\x4f\x8c\x6d\x07\x57\x81\x61"}, +{{0x24,0x89,0x74,0x28,0xae,0x65,0x46,0xd8,0x5b,0x31,0x90,0xeb,0xe3,0xf1,0xf7,0xbf,0x7c,0x71,0x25,0x28,0xac,0x85,0x1a,0x58,0x8b,0x07,0xd5,0xc8,0xf9,0x4e,0xec,0xd1,},{0x5f,0x34,0x8f,0xe3,0xea,0x5b,0x2c,0x02,0x3d,0x0a,0xf7,0xed,0xe6,0x0e,0x55,0xf9,0x1a,0xa5,0x51,0x99,0x69,0x9d,0xa1,0x5a,0x11,0xc3,0x79,0x1d,0x68,0xd7,0x10,0xbd,},{0x1b,0x5e,0x75,0xde,0xf4,0x9f,0x51,0xd6,0xb2,0xde,0x00,0x8c,0x71,0xfc,0x1a,0x90,0x9b,0xd4,0x2c,0xa8,0x13,0x29,0x8d,0xce,0x4e,0xee,0xf7,0x17,0x81,0x5d,0x7a,0x6c,0x07,0x8c,0x2f,0x3d,0x9a,0x3f,0xce,0x1a,0xb5,0xb3,0xad,0x8e,0xf8,0xd4,0x5c,0xdf,0x2e,0xb4,0x90,0x1c,0x32,0xee,0xa2,0xd5,0xe0,0x18,0xdc,0xf2,0x83,0x3c,0xad,0x0c,},"\x52\x01\xd9\x72\x5f\x1d\xff\xa1\x86\x3f\xa4\xd8\x4c\x30\x18\x61\x14\x1a\xcd\xfb\x64\xbe\x1f\xbf\xdd\x5b\x93\x86\xdb\x20\xef\x39\x40\x99\xee\xbc\xfd\xfe\xcc\x62\xc6\x26\x86\x07\xa8\x4d\x55\xc5\x5c\xd0\xef\xdc\x37\x2e\xcf\x30\x67\x34\x3e\x7b\x07\x31\xc2\x68\x54\x61\xe2\x4b\x95\x3f\x99\x94\x9e\x59\xba\x3e\x67\xed\x0f\x08\x48\x31\x37\x93\x96\x2a\x29\x2c\x45\x98\x14\xc5\xe2\x86\x90\xec\x1f\x45\x17\x1f\x1a\xba\xb8\x6f\xdd\x14\x56\x8b\x00\xca\xf4\x85\x81\x11\x5e\xe5\xea\x83\xb0\x00\x28\x2f\xbb\xf0\xc0\xb2\xa1\x11\x60\x39\xa3\x5c\xfa\x3f\x20\x14\x22\x20\x7a\x3d\x49\x48"}, +{{0x7b,0x04,0xac,0xa7,0xcf,0x92,0x62,0x16,0xcb,0x96,0x0a,0x38,0x90,0x78,0x63,0x39,0xd0,0xa6,0x15,0x96,0x76,0x80,0x19,0x01,0x23,0xfd,0xa3,0xb6,0x0c,0x6a,0xeb,0x11,},{0xcd,0xbc,0x3e,0x70,0xe4,0xe8,0xfd,0x13,0xd0,0xcc,0xe2,0x85,0x2a,0x3b,0x93,0x72,0xc3,0xa6,0x16,0x0c,0xd6,0xde,0xab,0xa9,0x0f,0x9b,0x30,0x22,0xf7,0x0c,0x91,0xf9,},{0x25,0xd2,0xd3,0x61,0x75,0x1d,0x52,0xb4,0xfe,0x66,0xea,0x18,0xe4,0xb9,0x86,0x6b,0xde,0x3d,0x12,0x1a,0x73,0x12,0xfd,0x9e,0x28,0xa1,0xe2,0x95,0xe0,0x87,0xe3,0x17,0x6c,0x94,0xc8,0x74,0xa2,0xe8,0x16,0x00,0xf2,0x4c,0x46,0x54,0xf4,0x3d,0x1b,0x67,0xd4,0x7b,0x64,0x82,0x26,0x48,0x59,0x0c,0xe5,0xce,0x44,0xf3,0xb5,0xdd,0xc5,0x02,},"\x1c\xb0\x96\x24\xb1\xf1\x4a\x02\x60\xc7\xf5\x6d\x8c\x60\xb5\xfe\x45\x83\x71\x14\x23\x25\x51\xef\x59\x66\x38\x6e\x0c\x2b\x44\x1b\x75\xcf\xdb\x8d\xf2\x18\x57\x85\xd2\x2c\xf5\x26\xfa\x9d\xf7\xfd\x45\xd9\xd8\x38\x81\xb6\x6c\x1f\xee\xe0\x91\x3e\x23\x81\x21\xee\xdb\xb7\xab\x50\x4d\xa0\xbe\xe8\x99\x80\x16\x68\x45\x35\x03\x19\x91\xf1\x1b\xfc\xd9\xb9\x56\x90\xaa\xd2\xd1\x9b\xd6\xa9\xde\x18\x44\xed\x13\x62\x30\x2d\xf4\x21\x72\x30\xb2\x5c\x05\x52\xce\x27\x75\x34\xc6\x50\xca\xe5\x26\x57\x7f\x25\xd8\xb1\xfe\x9f\x9f\xeb\xca\x2c\x81\x46\x70\xd4\x80\x5b\x21\xad\xef\x85\x2d\xaf\x94"}, +{{0xea,0x73,0xbf,0x64,0xa1,0xa9,0x78,0x77,0xc3,0xc3,0xe7,0xca,0x46,0x44,0xb7,0x1a,0xaa,0x66,0x31,0x4c,0x8f,0x1b,0x66,0xba,0xfa,0xeb,0xd5,0xed,0xfb,0x88,0x8b,0xcd,},{0xca,0xac,0x93,0x90,0x2e,0x57,0x64,0xad,0xe4,0x72,0x94,0xed,0xd5,0x1f,0xaa,0x14,0x62,0x09,0x40,0xc6,0x68,0xb5,0xc1,0xc3,0x92,0xa6,0x92,0x83,0x25,0xd4,0xc3,0xfd,},{0xbd,0x86,0xcb,0x9c,0x70,0xa0,0x55,0x27,0x9a,0x86,0xa9,0xe6,0x48,0x70,0x98,0x8b,0x8a,0x73,0x45,0xc3,0xcd,0x29,0x48,0xa0,0xfa,0xbc,0xfb,0x38,0xab,0xce,0x3c,0x42,0x0b,0x4d,0x55,0x21,0x61,0x8e,0x11,0xd2,0xde,0x82,0x7d,0x9d,0xe5,0x69,0xf6,0xbc,0x3b,0xe6,0x6a,0xad,0x40,0x63,0x6c,0xda,0xa6,0x47,0x60,0xde,0xd3,0xb7,0xc2,0x09,},"\x36\x2e\xec\x68\xb9\x12\x85\x27\x86\xbb\x4f\x9a\xff\xf9\xec\xf7\xcb\x28\xc9\xde\x6b\x18\x42\x2a\x8c\xa9\x40\xb0\xd7\xe6\xdc\xb8\x3a\xa4\x4b\xe0\xaf\xb5\xf1\x80\x6d\x43\xf0\xe3\x1d\x71\xf9\x22\xf8\x53\x61\x5a\x26\xe2\x87\xa2\x7f\x08\xa0\x4f\xbc\xe3\xd4\x5a\x0c\x6c\x31\x1d\x4b\x7c\xb1\x7e\x42\x5b\xbe\xb0\xa6\xb4\x10\xb5\xd6\xdb\xb7\xac\x11\xdf\x98\x50\xa1\x31\xa6\x91\xe3\xb6\x0b\x0b\x21\x4e\xbe\x04\x41\x06\xe9\x82\x43\x32\x87\x59\x52\x67\xb0\x31\xb5\xd4\xa0\x92\x62\xde\xd8\x93\x4f\xdf\xdf\x96\x4d\x86\x8e\xf9\xa2\xc8\x42\xf8\x04\xea\xfd\xde\xfc\xb7\x1d\x9f\x16\xa5\x9b\xf8"}, +{{0xb8,0x12,0x3c,0x11,0x6b,0x33,0xba,0xd0,0xdc,0xbc,0x2c,0x4d,0xc0,0x6a,0x3d,0x66,0x85,0x0d,0xab,0x36,0x0c,0xdb,0x5a,0x03,0x3c,0x14,0x89,0x5c,0x4e,0xe3,0x1b,0xfb,},{0xbd,0xca,0x15,0x1b,0xa3,0x2c,0x6b,0xb3,0x15,0x31,0xb0,0x5f,0xdf,0x86,0xc6,0xd7,0x8c,0x8c,0xd1,0x93,0x56,0x11,0xd5,0xff,0x11,0x1a,0x0f,0x00,0x63,0x5b,0x18,0x85,},{0x9c,0xf1,0x3e,0xba,0x3d,0xcc,0x37,0xb8,0xfc,0x70,0xcc,0xb2,0x32,0x74,0x36,0xb9,0xf0,0x88,0x55,0xe7,0x26,0xaa,0x7e,0xd8,0x2b,0xd5,0xcb,0x7d,0xf4,0x5f,0xdf,0x9e,0xc1,0xf9,0x6a,0xfa,0xd1,0x93,0xf4,0x75,0x72,0xd7,0x70,0x44,0x4b,0x65,0xb7,0x4a,0x37,0xcc,0x03,0x4f,0xc5,0x14,0xcb,0x3f,0x91,0xb2,0xd8,0xad,0xa5,0xb0,0x20,0x06,},"\x79\x70\xf6\x66\x66\x34\x54\x8c\x84\x8b\xb5\x23\x38\x81\x7b\x26\xa4\xd0\xca\x68\xdf\x3d\x28\xaf\xff\x20\x7c\x2d\x02\x80\x67\xa1\x8e\x4c\x95\x43\x02\x5f\x5b\x02\x28\xaa\x69\x1e\x50\x88\x51\x31\x51\xa9\x44\x94\xe1\x5d\x1f\x54\x21\x03\x28\xe0\xdf\x15\x9b\x35\x2c\x30\xaa\xa7\xa8\x44\xf1\x8a\x9f\x4c\x39\x5d\xcb\xb3\xfb\x9f\xcf\xbe\xd1\x10\x3e\x07\x06\xfb\xf9\xc3\x5f\xe2\x66\x68\x48\xfa\x35\xdc\x2c\xf5\x22\x7e\xbe\xe8\x9e\x7d\x3b\xcf\xae\x27\x21\xb2\x5f\xde\xc3\xd3\x17\x4e\xa7\xce\x26\x7a\x55\xdd\x61\xd5\x82\x01\xe9\x6b\xda\x30\x3c\xf4\x18\xed\xf6\xe3\x2f\xb9\x2f\x5d\xc1\xa0\xb1"}, +{{0xb1,0x8e,0x1d,0x00,0x45,0x99,0x5e,0xc3,0xd0,0x10,0xc3,0x87,0xcc,0xfe,0xb9,0x84,0xd7,0x83,0xaf,0x8f,0xbb,0x0f,0x40,0xfa,0x7d,0xb1,0x26,0xd8,0x89,0xf6,0xda,0xdd,},{0x77,0xf4,0x8b,0x59,0xca,0xed,0xa7,0x77,0x51,0xed,0x13,0x8b,0x0e,0xc6,0x67,0xff,0x50,0xf8,0x76,0x8c,0x25,0xd4,0x83,0x09,0xa8,0xf3,0x86,0xa2,0xba,0xd1,0x87,0xfb,},{0x6b,0xd7,0x10,0xa3,0x68,0xc1,0x24,0x99,0x23,0xfc,0x7a,0x16,0x10,0x74,0x74,0x03,0x04,0x0f,0x0c,0xc3,0x08,0x15,0xa0,0x0f,0x9f,0xf5,0x48,0xa8,0x96,0xbb,0xda,0x0b,0x4e,0xb2,0xca,0x19,0xeb,0xcf,0x91,0x7f,0x0f,0x34,0x20,0x0a,0x9e,0xdb,0xad,0x39,0x01,0xb6,0x4a,0xb0,0x9c,0xc5,0xef,0x7b,0x9b,0xcc,0x3c,0x40,0xc0,0xff,0x75,0x09,},"\x91\x6c\x7d\x1d\x26\x8f\xc0\xe7\x7c\x1b\xef\x23\x84\x32\x57\x3c\x39\xbe\x57\x7b\xbe\xa0\x99\x89\x36\xad\xd2\xb5\x0a\x65\x31\x71\xce\x18\xa5\x42\xb0\xb7\xf9\x6c\x16\x91\xa3\xbe\x60\x31\x52\x28\x94\xa8\x63\x41\x83\xed\xa3\x87\x98\xa0\xc5\xd5\xd7\x9f\xbd\x01\xdd\x04\xa8\x64\x6d\x71\x87\x3b\x77\xb2\x21\x99\x8a\x81\x92\x2d\x81\x05\xf8\x92\x31\x63\x69\xd5\x22\x4c\x99\x83\x37\x2d\x23\x13\xc6\xb1\xf4\x55\x6e\xa2\x6b\xa4\x9d\x46\xe8\xb5\x61\xe0\xfc\x76\x63\x3a\xc9\x76\x6e\x68\xe2\x1f\xba\x7e\xdc\xa9\x3c\x4c\x74\x60\x37\x6d\x7f\x3a\xc2\x2f\xf3\x72\xc1\x8f\x61\x3f\x2a\xe2\xe8\x56\xaf\x40"}, +{{0x93,0x64,0x9c,0x63,0x91,0x0b,0x35,0x71,0x8e,0x48,0xc5,0x90,0xd2,0x61,0xc4,0x8e,0x4e,0xf8,0x33,0x66,0x13,0xf6,0xaa,0x07,0x7b,0x46,0x26,0x76,0xb3,0xba,0x88,0x29,},{0x06,0xa6,0x85,0x89,0x8b,0x85,0x52,0x12,0xeb,0xc2,0x89,0x91,0x5d,0x10,0x5a,0x43,0x20,0xd6,0x20,0xd8,0x57,0x71,0xb8,0xc6,0xb1,0x5b,0xf1,0x0a,0x1b,0xe6,0xe9,0xb8,},{0x62,0x74,0xf2,0xd4,0xf4,0x31,0xd5,0xaf,0xfe,0xfa,0x35,0xe7,0xcf,0x58,0x4a,0x59,0x90,0x17,0x19,0x3d,0xa9,0x90,0x94,0xca,0x90,0x8b,0x75,0xac,0xb6,0x08,0xd1,0xbf,0x98,0x18,0x57,0xbe,0x93,0xa7,0xda,0xfb,0x0f,0xad,0xb3,0xff,0x09,0x06,0xf4,0x8a,0x5e,0xe9,0x50,0x45,0x6f,0x78,0x2c,0x2d,0x60,0x5b,0x14,0x09,0x5b,0xa0,0xff,0x0f,},"\x2c\xd1\xa9\x51\x05\x6c\x9e\xba\xe1\x39\x9b\x6b\xd2\xd8\x2c\x0a\xe2\x77\x85\x62\x90\xd0\x69\x20\xac\x56\xca\xc8\xfb\x42\x43\x51\x01\xc7\x2a\xa9\xc0\x8d\xd2\xd1\x24\x26\x32\x55\x62\xc2\xf0\xa4\x9c\xd8\x21\xb1\x1b\x93\x9a\xaf\xa5\x93\xb4\x09\x5c\x02\x1b\xcb\x48\x27\xb1\x07\xb9\x66\x4d\x68\x28\x28\x88\xbc\x4a\x44\xaf\x3e\x3b\xdc\x86\x1b\xe6\xaf\x30\x90\x44\xc3\xda\xab\x57\xb7\x70\x23\xdc\x90\x2d\x47\xeb\xc3\x26\xf9\xbd\xd0\x2d\xbc\x02\xcd\x54\x0f\xf8\x1b\x2d\xdf\x7c\xf6\x79\xa4\x11\x93\xdf\xe5\xf8\xc8\xca\x1a\xae\xfc\x41\xef\x74\x02\x80\xd9\x82\x3e\x30\xa3\x54\x71\x7c\x84\x31\xf5\xd8"}, +{{0x1c,0x15,0xcb,0xeb,0x89,0x36,0x2d,0x69,0x47,0x6a,0x2a,0xa4,0xa5,0xf3,0xef,0x20,0x89,0xcf,0x87,0x28,0x63,0x49,0xe0,0xdf,0xe0,0xe7,0x2d,0x9e,0x3e,0x5a,0x66,0xc7,},{0x13,0xa8,0x82,0xa1,0x06,0x41,0x82,0x58,0x2c,0x21,0x18,0x47,0xe1,0x9b,0x4d,0xac,0x59,0x72,0x2c,0x9f,0xfd,0x34,0x82,0x6d,0x96,0xf3,0x31,0x13,0x40,0x0f,0xac,0x7a,},{0x59,0x98,0xb2,0x80,0x8a,0xdf,0xde,0xea,0xeb,0xe2,0xc3,0xea,0xc0,0x26,0xd3,0xf8,0x25,0xf9,0xc7,0xf2,0xaf,0x97,0xca,0x32,0x4f,0xbd,0x57,0xaa,0xc1,0xbe,0xdf,0xf7,0x8a,0x8e,0xe6,0x21,0xd0,0x37,0xee,0x3a,0xd2,0xa7,0x12,0xe9,0xa0,0x09,0xc5,0x8e,0xa3,0xe6,0xf2,0xa8,0x28,0xf7,0x4b,0x86,0xda,0x27,0x5a,0x44,0xa4,0xb1,0xe5,0x0b,},"\x09\x1c\x9b\x9b\x11\x6a\xe8\x3d\x23\xd0\x1a\x62\x95\x21\x17\x85\xd4\x46\xb6\x22\x8d\xd6\x87\xdd\xf7\x9b\xd0\xd5\xa4\xda\xa8\xc7\x9d\x2c\xbf\xc3\x73\x65\xf1\xf2\x85\xe3\x61\x73\x81\x23\xe3\x4e\x2b\xcb\xfc\x66\x4c\xe1\x25\x3a\x11\xd9\xe4\xa7\x98\x2e\x58\xcf\x94\x68\xe1\x01\x7e\xa1\x4d\x2c\xc6\xd0\x86\x5d\x40\xfd\xe8\xcb\x56\x02\x41\xe9\x6a\xc1\x61\x7c\x79\x1f\x0c\xa7\xc6\x41\x0c\xad\xf3\x28\x61\x1b\x18\xae\xf3\x33\xd8\x35\x0a\xc4\x97\xf0\xa4\xae\x2d\x03\xfd\xf0\xe2\x3e\x42\x6d\x34\xf4\x51\x47\x80\xd1\x47\x4e\x11\x35\x83\x54\x1f\x3c\x04\x36\x72\x05\x71\x72\x61\x8c\xb2\x05\x9e\xaa\xed\x56"}, +{{0x11,0x24,0x1f,0xfd,0xf3,0x4a,0xe8,0xab,0x87,0x54,0x75,0xe9,0x4c,0x6c,0xc3,0x29,0x1f,0x0b,0x88,0x20,0xdc,0x85,0xe2,0x0f,0x32,0xfc,0x53,0xb2,0x4a,0xe6,0x89,0x78,},{0x09,0xc0,0x45,0xe4,0xbd,0x51,0x37,0x31,0x4c,0x0e,0xc1,0xd0,0x31,0xfa,0xf9,0x14,0x91,0x0c,0x45,0xa4,0x67,0x6f,0x5a,0x3c,0xd8,0xf5,0x81,0xbc,0xcc,0xb0,0x3c,0x97,},{0x72,0xce,0x9f,0x91,0xbe,0x2e,0x66,0xcf,0xc9,0x0f,0x95,0x25,0x95,0x94,0x6f,0xfc,0x90,0xbf,0xce,0x53,0x08,0x7d,0x49,0xe5,0xdd,0x7c,0x08,0x7f,0x3f,0xaa,0x8f,0x18,0xf2,0x35,0x6d,0xe9,0x71,0xe4,0x42,0x9d,0x98,0x5a,0x99,0x19,0x4b,0x4f,0x92,0xce,0xd3,0xef,0x47,0xcd,0x71,0x14,0x37,0x9e,0x0b,0x32,0x67,0xa9,0xf8,0xb1,0xe7,0x06,},"\x3b\x89\xde\xcc\xb7\x02\x3e\x4b\x2b\x7a\xff\x2c\x39\x51\x87\x0a\xf4\x13\xa9\xb0\x4d\xd8\x6a\xc7\x8b\x7c\x8f\xd8\x87\x49\x2d\x8d\xde\x49\xd8\xfd\xa1\x49\xed\xd5\x47\x81\xae\x2b\x50\x80\x30\xd1\x44\x16\xa9\xa3\x8b\xed\x2b\x9a\xeb\xbb\xb2\x02\x50\xb3\xc9\x31\xac\xd4\xe3\x2f\xbe\xee\xc5\xa2\x65\x01\xbe\xab\x72\x68\xd1\x44\xfc\xe8\x95\x1a\x10\x1c\x4b\x51\x78\x16\x6f\xbb\x59\x27\xb1\xdf\xb1\xe1\xce\x90\xd1\xd1\x23\x06\x8e\x3f\x47\x2c\x88\x8f\xdb\x01\xfd\xf7\x0e\x7f\x8d\xe9\xb0\xad\xb2\x84\xb7\x11\x9f\x55\x35\x43\x16\xf8\x4e\xd0\x90\x03\x0f\x9c\x26\x62\x06\x1c\xa4\x84\x47\xcc\x0a\xef\x96\x41\x26"}, +{{0x3b,0xdb,0x16,0x24,0x65,0xea,0xce,0xff,0x98,0xd6,0x9c,0x86,0xf7,0x00,0x39,0xc5,0x17,0xd1,0x68,0xae,0xfe,0x6b,0xb1,0x01,0xb4,0xf7,0x69,0xa8,0x6b,0x17,0xc9,0x72,},{0xd7,0x6c,0xb7,0xbe,0x74,0x32,0x82,0x89,0xfd,0x1c,0x64,0xbe,0x74,0x7c,0xca,0x5b,0xb3,0x02,0x95,0xdf,0xac,0xcd,0x0f,0x2e,0x43,0xf5,0x17,0x03,0xfd,0x5d,0x36,0x83,},{0x6f,0x13,0x62,0xa4,0x02,0x06,0x37,0x91,0xf9,0x50,0x98,0x4f,0x54,0x49,0x28,0xe6,0x16,0xa4,0xef,0x79,0xbb,0xeb,0x68,0x54,0xe9,0x61,0x5a,0xab,0x9c,0xdb,0xae,0xc4,0x83,0xfb,0x9a,0x04,0xbf,0x22,0xde,0x5d,0x97,0xa1,0x5b,0xda,0x2d,0x39,0x04,0x83,0xc7,0xf6,0x1d,0xbe,0xe0,0x7b,0xb5,0x14,0x1f,0xc1,0x73,0xb1,0xaa,0x47,0x65,0x0d,},"\xfb\xf3\x68\xfe\xae\xba\x87\x91\x8b\x1b\x8c\x7b\x8a\x26\x83\x2b\xe6\xe7\xfc\x1c\xbd\xb8\x90\x25\x19\x28\x1a\x06\x54\xec\x73\xde\x0b\xb0\x71\x01\xa9\xd6\x03\xf7\x45\xd4\xec\x23\x57\xae\xe9\x87\x0c\xb1\x9a\x56\xcb\x44\xfb\xd9\xc9\x1f\xc3\x47\x52\x61\x2f\xbd\x83\xd6\xfc\x1a\x16\xbf\x8a\x85\xa2\x15\xd0\x14\x8e\x4a\xf3\x7d\x29\x84\x67\xe5\xcc\x48\x6b\x13\x13\x52\xce\x09\x21\x82\xce\x82\x84\x15\x9a\x38\x12\xb3\x0b\xac\xbf\xf5\x95\x86\x38\x11\xbf\x9a\x30\xa9\xda\x49\x45\x65\xc3\xac\x18\x14\x43\x00\x18\xea\x0e\xee\xd3\x9c\xdb\xca\x27\xf9\x31\x40\xe4\x69\x49\xdb\x57\x0b\xfa\x2e\xd4\xf4\x07\x3f\x88\x33"}, +{{0xd5,0xef,0xe5,0x1d,0x5c,0xd8,0xe1,0x08,0xbd,0x92,0x2f,0xc0,0xea,0x12,0x61,0x90,0xa9,0x46,0x28,0xff,0xa5,0x3c,0x43,0x3a,0x51,0x80,0x22,0x79,0x2d,0xdc,0x78,0xef,},{0x42,0x6b,0x01,0xcc,0x61,0xff,0x5e,0x0e,0x72,0x4d,0xa1,0xd3,0xb2,0x97,0xf5,0x32,0x5c,0x18,0xc6,0x2f,0x64,0xd5,0xeb,0x48,0xd4,0xa5,0x21,0x6a,0x8e,0x9a,0x40,0x73,},{0x23,0x06,0xf5,0x8f,0xcd,0x4c,0xff,0x22,0x22,0xd8,0x1b,0x05,0xa4,0x75,0x53,0x2b,0x8b,0x19,0xdc,0x67,0xe6,0xd7,0x8d,0xdb,0x42,0x05,0xa3,0xb7,0x62,0x1c,0xc5,0xae,0xf0,0xb3,0x93,0xd5,0xd2,0x4d,0xd9,0x6c,0x88,0xcc,0xbc,0x53,0xa3,0x20,0x8d,0xa3,0x23,0xbe,0x45,0x87,0xd5,0xec,0x06,0x7c,0x82,0x0f,0x07,0x23,0xaa,0x44,0xe9,0x0e,},"\x9d\x17\xbc\xfe\x2d\xfc\x74\x2f\x41\x1c\xb5\x3a\x94\xf3\x59\xc0\x01\xab\xf0\x96\xc7\x41\xf3\x4a\xf4\x86\x79\xf2\x81\xe7\xce\x6b\xbd\x9e\x87\x70\x9f\xc0\x72\x8a\x56\x3d\xb2\xb9\xcf\x8e\xa4\xfb\xdc\xc3\x44\xc1\x84\x8e\x65\x3c\xe9\x70\xc6\xce\x29\xde\x2c\xcd\x52\x03\x00\x64\x9a\xdc\xdd\xfc\x75\x39\x71\xf8\x46\xaa\xc1\xba\x42\xae\x45\x28\x95\x2d\x94\x98\x0a\xa7\xc6\xcf\xa2\x14\x29\x07\x64\x7f\x89\x4a\xe9\x74\xa7\x4d\x59\x03\x5a\x73\xef\x56\xa1\x0b\x66\x12\x62\x48\x09\x52\x01\x90\xac\xe6\x61\xc3\xa4\x70\x95\xe0\x32\x2e\xfd\x78\x1d\x50\xd1\x16\x35\x98\xf2\xda\x32\xf3\x1b\xc9\xc4\xf9\x13\xd1\xb1\x48\x61"}, +{{0x18,0xaf,0x89,0x02,0x5e,0xbf,0xa7,0x6b,0xd5,0x57,0xcf,0xb2,0xdf,0xf1,0x48,0x24,0x52,0x14,0x64,0x1f,0xd5,0xbd,0xa1,0x59,0xf7,0x3d,0xa0,0x4b,0x08,0xe8,0x7c,0x88,},{0x0c,0x58,0x44,0x59,0xb9,0xeb,0xcc,0xca,0xd5,0x87,0xb2,0x72,0x16,0x0b,0xc6,0x0b,0x27,0xf4,0xf7,0x72,0xb4,0x32,0x1d,0xe7,0x72,0x3a,0xfe,0xf5,0x77,0xed,0xc7,0xb4,},{0x26,0xbb,0x08,0x82,0x29,0x7c,0x2c,0x08,0xa7,0x52,0xd3,0x98,0x11,0x45,0xdc,0xde,0x55,0x89,0x3a,0x11,0xdf,0x77,0xf8,0xaa,0x4c,0x19,0xd0,0xb9,0xed,0x6e,0x52,0x20,0xed,0x12,0xe9,0xfa,0xc3,0xaf,0x13,0xd0,0xf0,0xc7,0x15,0x68,0xf4,0xa5,0x47,0xd3,0x01,0x14,0xa6,0x59,0x9a,0x23,0x68,0x06,0xc4,0xbe,0xee,0x67,0x65,0x28,0x44,0x08,},"\xe8\x2f\x46\x65\x2a\xb9\x14\xaf\x53\x5d\x8f\xb7\x20\xb5\x57\xac\x95\x01\x8d\x9f\x2a\x3f\xcc\xe8\x57\x71\xbb\x40\xab\x14\xcb\x9a\x98\x6e\x09\x6f\x3a\xfe\x5b\xee\x82\x9d\xfd\x8b\x97\x33\x5c\x53\x6a\xc9\x71\xa2\x16\x55\xaf\x16\xa2\xf8\xfd\xba\x18\x3a\x4e\x18\x56\x4c\x21\x49\x29\x56\x53\x7a\x41\x9a\xbb\xbb\xb0\x2a\x4b\xbd\xc0\x14\x81\xf5\xc6\xe6\x58\xec\xf3\xc3\x4f\x01\x1a\xd8\x46\xf5\xed\xcd\x49\x39\x19\x5d\xf8\x5e\x41\x30\x3f\xb9\xa8\x8f\xdf\xbd\x70\x43\x96\xf7\x55\x9a\x32\x73\x18\xb9\x52\xb3\xe6\x0c\xe8\xdd\xde\x56\x37\x85\x79\x23\x2f\xaf\x95\x0c\x78\xe7\xf0\xb1\x7c\x3b\x8d\xec\xe3\x6b\x78\x8a\x84\x73"}, +{{0x0c,0x93,0xd9,0x98,0x15,0xff,0xf8,0xfe,0x22,0xb9,0xe4,0x5a,0xa0,0x2b,0x3e,0x64,0x45,0xce,0x1d,0x6b,0xf5,0xa6,0x5d,0xce,0x3d,0xa1,0x07,0xaa,0x10,0x55,0x94,0x0e,},{0x4d,0x27,0xa4,0x7b,0x0f,0xc8,0x08,0x00,0xd8,0x4d,0x24,0x4e,0xeb,0xb1,0xde,0xb4,0x43,0x6d,0x97,0x63,0x3a,0x83,0xe6,0x71,0x25,0xad,0x52,0xea,0x01,0x68,0x50,0x57,},{0x7d,0xc4,0x46,0x7a,0xbc,0xf6,0x43,0x1a,0xdb,0x7c,0xcf,0xe8,0x68,0xea,0xc8,0xcd,0x8a,0x61,0x5a,0x0f,0xf6,0x5f,0x6a,0x9e,0x33,0x83,0x75,0xb1,0xaa,0xe3,0xc4,0x9a,0x12,0x6c,0x9e,0xba,0x79,0x42,0x6d,0x16,0x41,0xc6,0xb9,0x7c,0x3e,0x92,0xc1,0x94,0xe5,0xee,0x44,0x31,0xef,0xa2,0x43,0x9f,0xd4,0x50,0xf2,0xcd,0x01,0x8c,0x87,0x00,},"\x11\xe8\x77\xde\x58\xc1\x34\xea\xf4\xc9\xf1\xb5\x3c\x3d\xc4\x51\xd3\xc0\x55\xf1\x6b\x09\x62\x27\x25\xb2\x79\x76\x85\x12\xfe\x10\xa7\xad\xb0\x76\x5b\x68\x9e\xc2\x1d\x5b\x6e\xfa\xa1\x9f\x1b\x9d\x36\x25\x4d\xf0\xa9\x36\x7f\x44\x1b\x26\xbd\xb9\x0b\x28\xcb\xc4\x03\xe5\x07\x40\x82\xfa\x1f\xed\x58\xe1\x40\xda\xc9\x7a\xea\xf4\x83\xe2\xc1\x3f\x3c\xc5\x60\xab\xff\xab\xa0\x5b\x76\x3f\xee\xdb\x51\xe6\x06\x98\x15\x1c\xf5\x6e\xfd\xf1\xd3\x7d\x6c\xe0\x56\x44\x86\x21\x0f\x05\x2e\x93\x7f\x2e\xa2\x6f\x63\xef\xa5\xd2\x47\xff\x18\x83\x29\xbb\x1a\xa8\x3c\xe3\xf4\xf3\x5a\x3d\x7d\xec\x14\x59\x9e\x5f\xeb\x7b\x6d\x5f\xe4\x29\x6a"}, +{{0x98,0x9e,0x99,0x94,0x56,0x35,0x19,0x2c,0x02,0x3c,0xc5,0x18,0x6f,0xc2,0x5b,0xba,0xef,0x47,0x24,0x07,0x75,0xd1,0x5a,0x56,0x19,0x5d,0x88,0xcd,0x07,0xc3,0x74,0x8e,},{0xca,0x0b,0xea,0xfd,0xf7,0x31,0xd8,0x93,0x01,0xf7,0x72,0x3c,0x5b,0xb7,0xe5,0xa1,0xc3,0xff,0x3e,0xab,0x27,0xc9,0x7d,0x71,0x1b,0xcd,0x76,0xe4,0x20,0x54,0xbe,0xe4,},{0xae,0xf7,0x56,0xbf,0xb8,0xa7,0x26,0x6e,0x17,0xd1,0x5f,0x3f,0x11,0xee,0x50,0xed,0x25,0xbe,0x42,0x0e,0x95,0xa0,0x74,0x22,0x71,0xeb,0xd1,0x22,0x94,0xe2,0xcb,0x96,0xea,0xd0,0x83,0xb8,0xff,0x0b,0x82,0x9d,0x2e,0xde,0xb1,0x4d,0xa8,0x6e,0x40,0x2e,0xf2,0x5e,0x6d,0x4a,0x5a,0x79,0x58,0xc1,0x84,0xed,0x10,0xc1,0x76,0xcb,0x57,0x0b,},"\xc4\x84\x14\xf5\xc7\x57\xd0\x3c\x52\x3e\xf3\xf3\xb8\x51\x07\x71\xb0\xff\x3b\x4b\x97\xde\x27\x96\x25\xd3\x49\xec\x18\x5a\x29\x92\x7a\x66\xb9\x59\x3b\xa1\x93\x38\xc2\xf5\xe4\x13\x1f\x1a\xc0\x7e\xa4\x6d\x2c\x1b\x6e\x4a\xb5\x22\x92\x80\xb2\xe2\xbb\x9d\x14\x0d\x1e\xf7\xaf\x7b\x16\x92\xbf\x2d\x09\x7b\x80\xf8\x11\xad\xcf\xa9\x5d\x5c\xbf\x9e\xee\x92\xa1\x64\x1c\x55\x2b\x4b\xe4\xa0\xd7\x34\xf0\xaf\xd4\x70\xb9\xd7\xf4\xe4\x57\x78\x95\x1e\x21\xfc\x53\x4f\x20\x0a\x12\x8b\x96\xad\xb8\x37\x3f\x10\xce\xce\xc2\xda\xc2\x99\x6a\x06\x2f\xb3\xc2\x94\x31\x59\x65\xa9\xd5\xd7\xb0\x77\xc4\xb0\x13\xc6\x4a\x38\x42\x97\x69\xd2\x3e\xab"}, +{{0x6b,0xdb,0xbe,0x06,0xd9,0xf4,0x21,0x9e,0xea,0x64,0x03,0xa3,0x57,0xb2,0x5e,0x56,0x19,0x92,0xfa,0xe0,0xf0,0xf6,0x14,0x56,0x1d,0xd8,0x6d,0x23,0xde,0x41,0x5a,0x43,},{0xed,0x52,0xdd,0x1c,0xce,0x32,0xd9,0xb4,0x85,0xe0,0x94,0x07,0x46,0x42,0x1d,0x36,0xb9,0xfd,0xe6,0xcd,0xf0,0x21,0x15,0x45,0xb6,0x34,0x04,0x4d,0x4b,0x3c,0xb8,0xf1,},{0x95,0x02,0x06,0x60,0x5b,0x0f,0x41,0x7c,0x90,0x84,0x3e,0x2c,0x8d,0x8e,0x66,0xc8,0x28,0xbb,0x10,0xb9,0x9b,0x36,0xee,0xee,0xe8,0xca,0xf2,0xe0,0xe5,0x48,0x4d,0x93,0xfe,0x02,0xbf,0x53,0x34,0x05,0xf4,0xbb,0x74,0xa5,0x0e,0x55,0x85,0xfa,0x0d,0xae,0xf4,0x82,0x1f,0x03,0x01,0xd0,0x1b,0x46,0x32,0x1b,0xaa,0x31,0xe1,0xf0,0x8d,0x03,},"\x58\x2a\xda\x13\xd6\x92\x93\xe4\x9b\xbd\x46\x10\x32\xdf\xea\x1c\xa2\x02\x5b\x52\xe0\x13\xa3\x3a\x03\x87\xfc\xfc\x5f\x7c\x0b\x8e\xc9\x55\x98\x26\x07\xfc\x90\x1e\x1b\x7f\x63\x6a\x9d\x37\x1e\x1f\x91\xfe\x47\x6b\xdd\x44\x85\x6e\x27\x5d\x67\xef\xa1\x42\x38\x16\x43\x54\xc2\x31\x12\x4c\x84\xde\x8f\x5b\x89\xd5\xa5\x8e\xa6\x74\x4b\x4d\x3b\x3d\x79\x06\x90\x52\x33\xcc\xe6\x94\xa6\x4d\x69\x6f\x5a\x70\x24\xfc\x90\x33\xb1\xce\x39\x08\x99\xa3\xb4\x41\xa4\x8e\x53\xc7\xc9\xb3\x0b\xa1\x2e\x7d\x61\xf3\x5f\x15\xe6\x58\xc7\xcc\x44\x07\xe2\xf6\x89\xea\x8a\x55\xd0\x1b\xf5\xdb\xac\xb1\x19\x54\x75\x4f\x92\x0f\x09\xdb\xd4\x84\x09\xbb\xb5"}, +{{0xd7,0x61,0xc8,0xc5,0xa9,0x60,0x1b,0x91,0x45,0xb7,0xd0,0x51,0x24,0x9b,0x00,0x41,0x07,0xe4,0x52,0xe5,0x63,0x10,0x0c,0x6c,0x78,0x80,0x38,0xc9,0xee,0x8a,0xda,0xd7,},{0xe6,0x48,0x87,0x75,0xd6,0x40,0x7e,0xfc,0x7b,0x2b,0xca,0x89,0x0a,0x7f,0xc6,0x22,0x66,0xfc,0x54,0xcd,0xac,0x89,0x33,0x43,0xb4,0xf5,0x9a,0x19,0x6d,0x94,0x88,0x98,},{0x7a,0xb7,0x8b,0x64,0xe6,0xdb,0x35,0x9a,0x2d,0xc8,0x30,0x2e,0x10,0x92,0xed,0x66,0xfa,0x73,0x6b,0x53,0x62,0x53,0xa1,0xcd,0x90,0xfd,0xb8,0xc1,0x0e,0xfd,0x78,0x30,0x02,0x25,0xe1,0x91,0x96,0x35,0x99,0xba,0x54,0x9c,0xc8,0x59,0x20,0x9d,0xf0,0xff,0x61,0xcd,0x06,0x9b,0x03,0xd2,0x54,0xe6,0xe7,0xd7,0x6c,0x79,0x84,0x40,0xf9,0x07,},"\x84\xea\xd5\xea\xbd\x2f\xd4\xb7\xc7\x9a\x9a\x92\x8a\xb8\xee\x0a\x16\xa5\xfd\x66\x7a\x05\x7f\x8a\x25\x46\x63\xd5\x6d\xaa\xe1\x56\xd1\xa4\x9a\xff\xb2\x99\x61\x37\xb9\xd8\xb3\x40\xe6\x35\x73\x2f\x9d\x2b\x4c\x60\x21\x84\x42\x54\x1e\x72\xd2\xb0\x0e\x1e\xe7\xa7\x3c\x3f\x67\xca\xa4\x99\xfa\x9d\x07\x0b\x57\xd0\x76\xdc\xde\x96\xb0\x76\x47\x23\xc3\xc6\x59\xc7\xa0\x0c\x1b\x78\xb1\x5c\xcc\x22\x23\x89\x0b\x51\x06\x7f\xc8\x1e\x23\xe9\x45\x8a\xb0\x68\x3b\xa6\x26\xa5\x3d\x0c\x37\x93\xa5\x8a\x98\x57\xbb\x44\xb3\xbd\x85\xbb\x6c\xe5\x3a\x85\x69\x4e\x7f\x53\xcc\x1b\xd4\x6d\x50\xed\xa3\x7d\x81\xf5\x38\x1b\x51\x3d\x1f\x38\x33\x9d\x29\x1b"}, +{{0xc5,0xe0,0xc7,0xa7,0xbb,0x8b,0x7c,0xa0,0x7b,0xf0,0xa0,0x5e,0xa6,0x7e,0xff,0x6d,0xee,0xbf,0xe3,0x71,0x4e,0xe3,0xe1,0xa2,0x27,0xf4,0xdc,0x8e,0x24,0x2a,0x2f,0xa0,},{0x51,0x35,0xef,0xcd,0x90,0x52,0xbe,0xc5,0x7a,0x44,0x31,0xca,0xab,0xe8,0x26,0x80,0xee,0xc0,0xa3,0x3a,0xfd,0x59,0xb3,0x02,0x03,0xb2,0x80,0xba,0x12,0xbe,0x48,0x5c,},{0x2e,0x7f,0xde,0xb3,0x48,0x4d,0x0a,0x5e,0x8d,0xce,0x94,0x44,0x89,0x79,0x49,0x6b,0x06,0x42,0xca,0xbc,0x37,0x33,0xa5,0x1f,0x8c,0x3c,0x5c,0x51,0xc1,0x9a,0xe3,0x19,0x01,0x8d,0xa9,0x10,0x91,0xc2,0x38,0x5f,0x2f,0x4e,0x9a,0x59,0xed,0xbc,0xa2,0xab,0xd0,0xd0,0x85,0xee,0x40,0xd3,0xf0,0xd4,0x20,0x61,0xa5,0xa9,0x83,0x2a,0x37,0x0c,},"\x37\x70\xa6\x78\x66\x52\xc4\xb7\x8a\x04\x3e\xdc\xe0\x7f\x3e\x20\x4d\x81\x99\x7c\x42\xaf\xc2\x23\x31\xf7\x5a\x54\x94\xa8\x26\xd7\xcb\x69\xab\x43\x14\xa4\x73\x72\x10\x58\xa1\x83\x99\x81\xd5\xb7\x02\x2d\x0c\xd8\x67\x03\x77\xda\xf3\x32\x04\x76\xd2\x5b\x9f\x55\x95\x61\xd6\x6e\xe0\xa7\x09\xfe\x17\x36\x1e\x2a\x52\x89\x8f\x57\x53\xc4\xfb\x43\xbd\x0c\x98\xb3\x68\xf5\x12\xad\xc0\x9c\xd9\x27\xc6\x62\x26\x76\x92\x6d\x8c\x2d\x91\xa1\x4a\xca\x32\xf2\x26\xf7\x00\x36\xc1\xc8\x58\xbc\xff\xc2\xb5\x9f\x54\xc1\xc3\x7b\xf8\x1e\xb5\x2e\xcb\x3f\x00\xda\x60\x2c\x94\x36\x1b\x52\xa5\xaf\xdd\xbf\xd7\xe0\x50\x36\xe3\x77\x50\x30\x50\x33\x3b\xe5\x12"}, +{{0x11,0xbb,0x47,0x48,0xd2,0x54,0x7e,0x61,0x96,0xbe,0x82,0x3c,0x9b,0xe7,0xaa,0x18,0x15,0x0c,0x20,0x4b,0x12,0xca,0x8d,0x73,0xc1,0xbd,0x46,0xb1,0x1a,0x54,0xb4,0x75,},{0xef,0xeb,0x42,0xda,0x28,0xd7,0x64,0x96,0x64,0x03,0xdd,0x30,0x0d,0x9f,0x94,0x51,0xb2,0x58,0xab,0x1c,0x80,0xdf,0x06,0xfe,0x59,0x43,0x15,0x3f,0x53,0x01,0xcc,0xcb,},{0x44,0xc5,0x8d,0xa4,0x9d,0x23,0x65,0xd2,0x70,0x29,0xd1,0xee,0xbb,0x3b,0xeb,0xf7,0xc0,0x32,0xd8,0x58,0xaa,0x07,0xe0,0x75,0x6b,0x1c,0x26,0xa5,0x41,0x2d,0x22,0x69,0x11,0x76,0x03,0x13,0x41,0xad,0x37,0xd7,0xbb,0x78,0x43,0x28,0x9e,0xb3,0x9d,0xb4,0x91,0x58,0x4c,0x1b,0x2a,0x1d,0xa2,0xe4,0xa2,0x64,0x9c,0x22,0x93,0x82,0x66,0x06,},"\xf4\xb7\x65\xb2\x58\xba\x35\xb4\x27\x52\x5c\x7f\x10\xa4\x6f\x0b\xcc\xd3\x57\xec\x1a\xd5\x2a\x5b\x13\x94\x17\xa9\xd3\x89\x4c\x51\x2d\x89\xeb\x88\xe6\x81\xb1\xf3\x0a\xac\x4c\x11\x5c\xcf\x36\x54\x5e\x83\xf3\x78\x34\xc8\x2e\x83\x00\xcc\x1e\xb2\x89\xaf\x43\x75\x96\x8c\x29\xc0\xff\xef\xb4\x0e\x15\x6c\x20\xc0\x43\x26\x69\xac\x8d\xc0\xa8\x3c\x13\xb1\xe8\x55\xa8\x4a\xd0\x13\x3c\x40\xc8\x2c\x87\xee\x1e\x7d\xd4\x08\x4d\x74\x1c\x80\xde\x8a\x7a\x9f\x77\x59\xe8\x43\xa5\x62\x09\x9c\x4d\x7d\xf8\x75\x35\x20\x39\xff\x4d\x38\x24\x65\x13\x86\xc9\x77\x59\xff\x7d\xba\x52\x06\x4e\x6d\x31\x12\xe0\x80\x81\x9a\xee\x8c\xe7\x23\xa1\xa2\xaa\x46\x4d\x8a"}, +{{0x74,0x52,0xa0,0x01,0x56,0xd7,0x94,0xed,0xeb,0xff,0x4a,0xdb,0x1f,0x7a,0x7e,0xec,0x26,0x21,0x7f,0xef,0x67,0xc3,0xd2,0x68,0x35,0x2b,0x2b,0x54,0x60,0xa7,0xdc,0x25,},{0x5f,0x4d,0xc3,0x38,0xcf,0xbd,0x38,0x4b,0x5f,0x1c,0x14,0xc2,0x26,0x70,0x14,0x46,0xb5,0x2b,0x1e,0x3e,0x2a,0x3c,0xba,0x1a,0x40,0xee,0x28,0x25,0x08,0x0d,0x1d,0xe6,},{0xa8,0xf9,0xfa,0x24,0xa3,0xde,0xa1,0x02,0x2e,0x73,0xf0,0xd8,0x8b,0x1c,0x37,0xd0,0x6d,0x0f,0x0b,0x20,0xbb,0xff,0x0e,0xcd,0xb4,0xa4,0x0c,0x86,0xd7,0xe4,0x75,0x61,0x7c,0x03,0x57,0x0a,0x74,0x19,0xd7,0x4b,0xa0,0xf1,0x32,0x70,0x96,0xbf,0x19,0xf0,0xd0,0xcf,0x9f,0x51,0xd4,0x83,0x11,0x2f,0x26,0x92,0x23,0x78,0x68,0x2f,0x48,0x07,},"\x8c\x4e\xe2\x86\x76\x56\xe3\x3f\x52\x69\x41\x4d\x77\xb4\x2d\x8e\x47\x50\xdb\xa9\x3c\x41\x8b\xac\xca\x10\x93\x8c\xc3\xb5\x70\xc6\x60\x3d\x52\xc2\x34\x44\x88\x60\x7b\x2f\x93\x4f\x6d\x26\x9f\xcb\x2a\xd9\x66\x21\x9b\x1a\xb1\x14\x72\xf4\x2c\x67\x2c\xe2\x05\x92\x49\x0e\xc5\xba\xf6\xa2\xd2\xfc\x8a\x3e\xe3\x53\x74\xb1\x90\x2f\xde\xfc\x78\x70\xb1\xb6\x26\xfa\x46\xb1\x2b\x6c\xee\x24\x1f\x60\x1a\x9b\x3f\xe4\xc5\x08\x12\xe5\x73\xe6\x75\x2c\xe2\xc7\x64\x4e\x33\x67\xa6\xa6\xb7\x77\x58\xd8\xe4\x93\x4b\x58\xaf\x23\xab\xae\x8f\xec\xac\x25\xed\xd7\x34\x03\x0e\xe7\xcf\x39\x90\x7e\x3e\xed\x81\x86\xa1\x9a\x80\x71\x03\xa9\xfc\x49\xd3\x8f\x4c\x84\x60"}, +{{0x88,0x0e,0xf1,0x06,0x73,0x3f,0x04,0xe7,0x61,0x95,0xeb,0xa2,0x80,0xb3,0xfa,0xdd,0xa0,0xf2,0x5d,0xcf,0x96,0xa6,0xa9,0x9c,0x8c,0xcf,0x84,0x2c,0x68,0xaf,0xda,0xe5,},{0x70,0xce,0xe3,0x3d,0x41,0xc7,0x28,0xce,0x7b,0x14,0x19,0x31,0xe6,0xe8,0x52,0x45,0x67,0xd7,0x60,0x1e,0xb7,0x9f,0x67,0xfd,0xcd,0x07,0xb9,0xd6,0x82,0xc6,0x50,0xf0,},{0xff,0x6c,0xae,0xdd,0x8a,0x46,0x8a,0xa0,0x7d,0x4c,0x6e,0x71,0x31,0xbb,0xda,0x76,0x18,0x2b,0xa9,0x58,0x64,0x93,0x76,0xe7,0x11,0xf4,0x4c,0x7b,0xba,0xcb,0xa6,0x07,0x7b,0xea,0x87,0x8b,0xa5,0x94,0x9c,0xde,0xee,0xf0,0x5c,0xfd,0x49,0x83,0xb0,0x05,0x7d,0x27,0x5e,0xa3,0xe1,0x8c,0x32,0x65,0x94,0x68,0xc3,0x0c,0x47,0xac,0x8f,0x0b,},"\xf4\xf3\x8d\x07\x7f\x2b\x03\xda\x82\x1b\xd3\x6f\xde\x67\x3d\x66\x6e\x52\xf4\x83\x2e\x1c\x0d\xcf\xee\xf0\x49\x32\x8a\xcb\x7b\xd7\x1a\xd2\xbf\xc4\x9c\x12\x35\x16\xe1\x96\xc4\x70\xdf\x08\x47\xb3\x84\x8a\x45\xa2\xc6\x9b\xea\x03\xe2\xaf\xa7\xe5\x82\x05\xb6\x3b\x52\x38\x14\xfc\x8e\x24\x2f\x05\x9c\x69\xff\x7e\x40\xf9\x7b\xe8\x12\x5b\x70\xa5\x4f\xda\xf3\x5a\xea\xfa\xc7\x91\x14\xa7\xb4\x19\xe6\xbb\x9e\x70\xbf\x07\xad\xb5\x59\x81\x96\x00\xdc\x25\xe5\x1b\x4b\x70\x0d\x27\xca\x54\x72\xa0\xe7\xcb\xbf\xd1\x4e\x09\x9f\xaa\x3a\x72\x00\x2d\xa5\x38\xcb\xe4\x5d\x62\x1e\xf0\xd5\x25\x2b\xa2\x9d\x83\xf8\xb3\xec\x83\x89\xc9\xce\xb6\xc6\xb2\xe8\xd8\xa2\x0f"}, +{{0xa2,0xd8,0x8f,0x37,0xec,0xc2,0xb2,0xc0,0x5d,0xd6,0xcb,0x31,0x59,0x96,0x2c,0x5f,0x64,0x6a,0x98,0x15,0xb2,0xfb,0x37,0x79,0x1f,0xc7,0xb6,0x06,0xe2,0x91,0x3e,0xd5,},{0x58,0xdd,0x67,0xd7,0xa1,0x5d,0x4c,0xa0,0x34,0x1a,0x4c,0x86,0x95,0x66,0xca,0xd8,0xc4,0xee,0x16,0xe5,0x83,0xa1,0x0b,0x48,0x24,0x17,0x3b,0x08,0x29,0x0d,0x92,0xd1,},{0xcc,0xf2,0x40,0x0c,0xd6,0x73,0xe1,0xef,0xfd,0x20,0x16,0x1d,0x7b,0x68,0xa5,0xfb,0x87,0xc1,0xe9,0x9d,0x36,0x35,0xd7,0x8c,0x2d,0xa1,0xb5,0x09,0xfa,0xc3,0x33,0x46,0xc0,0x69,0x16,0x3a,0x6c,0x46,0xc7,0x82,0x6a,0x48,0xbb,0xbd,0x03,0xb0,0x5e,0x6e,0x23,0x51,0xfa,0x62,0xbf,0x89,0xbf,0x7c,0xcf,0x9a,0x90,0x24,0xbd,0x15,0x7d,0x07,},"\xd1\xb8\x7e\x9e\x88\x6d\xfb\xbd\xc8\xca\x8a\xb9\x01\x0e\xcf\x9b\xba\xf2\x3f\x72\xab\x3c\xbe\x76\x9d\xb1\xd4\x3c\x2a\x47\x4a\x81\x65\x1c\x46\x4e\x9f\xb9\x27\x34\x63\x46\x41\xc9\x48\x5a\x02\x39\xb3\x11\x07\x71\xe7\xf7\x5e\x05\x25\x2e\x4d\x8f\x4c\x0a\xa1\xba\x08\x62\x6d\x7e\x96\x31\x7c\x20\xac\xde\x2a\xd9\x9b\x23\xbd\xad\xfd\x6f\x17\x46\x8e\xb4\x02\xec\x5e\xef\xa5\x7b\x47\xca\xf9\x72\xb3\xdd\x21\xd8\x9f\x0e\x29\x89\xff\x87\xd5\x1e\xd2\xe2\xd6\x39\xc1\x64\x4e\x69\x8c\xbe\x02\x21\xb8\xe1\x79\xf3\xcf\xb0\x4a\x20\xcb\x24\x70\x21\x6a\x68\x82\xfb\x4f\xf7\x99\xe1\x15\x36\xcf\x64\x21\x9f\x0c\x07\x51\x76\xbc\x7c\xf0\xf6\xc5\xb7\x92\x5f\xcd\x61\x55"}, +{{0x42,0xaa,0xfd,0x0a,0xe2,0x6d,0xf1,0xe7,0xaa,0x02,0x76,0x86,0x0d,0x75,0x27,0x83,0xaf,0x97,0x28,0x04,0x39,0xbb,0x23,0xea,0xe4,0x6e,0x3f,0x84,0xca,0xac,0x78,0xde,},{0xda,0xa2,0x35,0x0a,0xdb,0x55,0xdb,0xa9,0xdf,0x7d,0x7a,0xf5,0x10,0x19,0x98,0xfe,0x51,0x5d,0x31,0x1c,0x3c,0xba,0x3e,0xea,0xb9,0x13,0x82,0x33,0x19,0x0c,0x3b,0x4e,},{0x11,0x61,0x43,0x65,0x0b,0x6c,0x13,0x3d,0x61,0x78,0x59,0xdb,0x24,0x29,0xc2,0x91,0x35,0x79,0x79,0x0b,0x21,0x97,0xd7,0xb7,0xb1,0xb4,0x96,0x2b,0x32,0x87,0x21,0x03,0x2c,0xee,0xca,0x58,0xb2,0xd5,0x64,0x39,0xe2,0x33,0xbb,0x84,0xdc,0x52,0x5e,0x28,0x4f,0xf8,0xdf,0x2b,0xde,0x1d,0xb4,0x98,0x6f,0xaf,0xd2,0x1b,0x3d,0x7d,0x6a,0x0a,},"\x72\x13\x1b\x80\xad\x59\x9b\x6f\x5f\xf6\x98\x54\x7d\x16\xe7\x49\x9d\x71\x27\x5e\x4e\x9b\x30\x52\x6a\x5a\xac\x0b\x0c\x8b\x14\xfa\x4a\x54\x0c\xfb\x11\x45\xfc\x00\x44\x18\xbc\xd3\x18\xc1\xa7\x0e\x62\x69\xa3\xfb\x69\xba\xed\x86\xf3\x63\xf5\xb8\xf9\x7f\x56\x9c\x20\xd4\xf4\x99\x0e\x7b\xb4\xd0\xc3\x99\x21\x26\x8d\x63\x6e\xd0\x55\x4b\xd6\x2a\xcf\xca\xcd\x3b\x8e\x03\x02\x17\xaa\xfa\xc3\x04\x4c\x03\x7e\x0f\x94\xda\x18\xc6\xb9\xa0\x93\x2c\x3c\x58\x75\xd3\xa9\x3f\xbd\xad\xcf\x67\x96\x4e\xec\x9e\xc2\xbe\x69\xb4\x8f\x02\x0f\x6c\x98\x74\xde\x5f\x8a\x51\x67\xb5\xee\x02\x4a\x2c\x2e\xfd\x0c\xdc\xd2\xac\xd8\xc1\xf7\x87\x81\x41\x41\xe3\x0b\x38\xb1\x63\x17\x5b"}, +{{0xb6,0x9c,0x33,0xb1,0x1b,0xa6,0x78,0x41,0xc3,0xd4,0xe6,0xf9,0x23,0x4e,0x35,0x37,0x0a,0x28,0xb4,0x76,0x62,0xac,0x56,0x0b,0x27,0xc0,0x78,0xb6,0x6a,0xb1,0xb0,0x21,},{0x9d,0xf6,0x8e,0x9a,0xcf,0x67,0x37,0x92,0x61,0x74,0x4d,0xb5,0xd1,0xe3,0x77,0x89,0x2f,0x2b,0x69,0x2e,0xd5,0xa3,0x8b,0x37,0x07,0x3c,0x04,0xde,0x5d,0x22,0x67,0x37,},{0x24,0x36,0x8f,0xee,0x5b,0xd8,0x48,0xb4,0xc6,0x61,0xa3,0xbe,0x4f,0x31,0x0c,0xfc,0x43,0x6e,0x79,0xec,0x4a,0x78,0x50,0x1b,0x81,0x09,0x5f,0xe5,0x16,0x14,0x23,0x1b,0x6c,0xa1,0xab,0x12,0x69,0x99,0x6a,0xd2,0xe9,0x8e,0x29,0x97,0x81,0xaf,0x8e,0x29,0x80,0x4b,0x24,0xfe,0x56,0x79,0xca,0x3b,0xa6,0x50,0xc5,0xc4,0xcc,0x58,0xce,0x01,},"\xf9\xea\x12\x6d\x3a\xb2\x19\x61\xaa\x24\x33\x90\x0a\x39\x82\xb8\x3e\x0e\xf8\x6d\x52\xd1\x34\x40\xaf\xa4\x81\x7f\x9b\x82\x2f\xb5\x82\xcc\x39\x32\xbf\x45\x0d\x46\x77\xc9\x18\x81\x81\xfe\x75\x26\xad\x6f\xe5\xab\xc6\x1d\x0a\xe7\x59\xf2\x15\x01\x3c\x0b\x2b\x41\x06\x4c\xb6\x27\x8b\xa7\xe3\x9e\x2f\x4c\x10\xd6\xcc\x96\x05\xb3\x86\x9e\x16\x9d\x7d\xa4\x2e\x88\xeb\x85\x78\x70\xfe\x61\x18\xbb\x02\xbc\x08\xc8\x05\x5f\x0c\x18\x9b\x62\xf7\x9f\xb1\x46\xb4\xc5\x43\xaa\x30\xcc\x0c\xd5\x7f\x03\x7e\x9e\xf7\xa6\x37\x11\xf6\x6e\x6f\x28\x78\x93\x17\x02\x20\x27\x02\x61\x42\x77\xd5\x13\xf0\x85\x0b\x75\x85\x49\x33\x6b\x30\xcf\x40\xab\x8b\xd4\x60\xe6\x0e\x12\xde\xed\x04"}, +{{0x7b,0x63,0x61,0x3f,0x6d,0xae,0x01,0xcd,0xcd,0x5e,0x6b,0x37,0x68,0x69,0x71,0xcd,0x8d,0x8a,0x99,0x54,0x2f,0x63,0x29,0xa1,0x28,0x54,0xa9,0xd8,0xff,0x81,0x05,0xac,},{0x72,0xec,0x43,0xfa,0xf3,0x4d,0x87,0x30,0x17,0x7d,0x1f,0x07,0x43,0xc7,0x4c,0x20,0xbf,0x72,0xc2,0x39,0x4b,0x8a,0x7d,0x47,0x1f,0xfe,0x2a,0x04,0xab,0x00,0x81,0x1c,},{0x76,0xf5,0x0b,0x2b,0x9c,0x2a,0xd9,0x7b,0xfb,0x94,0x99,0xee,0x41,0x92,0x8a,0xc0,0x72,0xda,0x5e,0x8b,0xc7,0x1d,0x02,0x12,0x55,0x09,0x42,0x33,0x2b,0x62,0xe7,0x0c,0x8b,0xfe,0x1c,0x72,0x25,0x42,0x39,0x46,0x88,0xde,0xcd,0x91,0x7a,0xec,0x8f,0x95,0x35,0x3e,0x1d,0x72,0x62,0x4b,0x70,0xeb,0xed,0x5d,0x17,0xf6,0xc5,0x49,0x77,0x02,},"\x18\x16\x48\x8f\x1f\xc8\x3e\x1e\xd5\x91\x16\x37\xdd\x42\xba\x20\x77\x65\x7d\xfe\x1a\xe4\x22\xad\x0a\xee\x59\xdf\x9d\xd5\x6a\x27\x63\xc2\xdd\x0e\xf6\x1a\x12\xbb\x82\x5b\x0d\xac\x1e\xda\x5f\xbb\x69\x1c\x5e\xd5\x8f\x3f\xb3\x25\x05\x0b\x45\x63\xa4\x04\x20\x99\x98\x2f\xff\xa5\xd6\xed\x74\x2d\x95\x82\x3d\xa8\xe1\x78\x7c\xf7\x46\xef\x63\xb3\xfb\xb0\xe8\x8a\x6c\x0b\xea\xe4\xf7\x31\x83\x66\x93\x6b\x49\x17\xf5\x07\x33\x60\x68\xb1\x94\x68\x09\x00\xa7\xbf\x4a\x6f\xb6\x9a\x5c\x38\x7b\x97\xe3\x1b\xc7\xf9\xbe\x53\xc2\xa8\x9e\x36\x51\xce\x1d\xe4\x1b\x10\xe9\x21\xb2\x06\xeb\xf3\x2e\x56\x21\xef\x80\x81\x61\x6d\xcd\x7a\x20\x59\x43\x7e\xfa\xd0\x14\xbb\x8e\x2c\x82\x21"}, +{{0x35,0x58,0xd3,0xa7,0x43,0x95,0xbd,0xcb,0xa5,0x60,0xe2,0xc4,0x5a,0x91,0x96,0x0c,0xec,0x6c,0xb3,0xed,0xbc,0xd3,0x0e,0x72,0x2f,0x7f,0x05,0x52,0x10,0xf3,0x7b,0x51,},{0x53,0x4f,0x43,0xeb,0xa4,0x03,0xa8,0x4f,0x25,0x96,0x7c,0x15,0x2d,0x93,0xa0,0x17,0x5e,0xc8,0x29,0x3e,0x6f,0x43,0x75,0x31,0x9e,0xad,0xf9,0x57,0x40,0x1f,0xbb,0xd2,},{0xb3,0x65,0xb5,0x56,0x1a,0x13,0xa5,0x45,0x17,0xcf,0x90,0xd8,0x8b,0x35,0xeb,0x09,0x67,0xd6,0xd5,0x84,0x14,0xb8,0xc1,0x54,0x7e,0x69,0x31,0x59,0xe0,0x13,0x78,0x56,0x36,0x54,0xc5,0x0f,0xb4,0x23,0x23,0xf0,0x9d,0xd7,0x8f,0xfe,0x28,0x05,0x6d,0xdf,0xa5,0x4f,0xeb,0xf4,0x48,0x91,0xe8,0xa7,0x41,0xb6,0xa1,0x68,0x7d,0x72,0x86,0x05,},"\xbe\x75\x44\x4f\x9c\xe6\xbe\x1d\x83\xaf\x62\x2a\x8c\x47\x8d\x51\x01\x27\xdb\x56\xf1\xde\x6e\xb8\xa5\x12\x65\x22\xb0\x9f\xdc\x6c\xa0\x86\x2c\xec\x0b\x8b\x2a\xaf\xa3\x1c\x17\xa2\xcc\x47\x7d\xa5\x33\xd2\x76\xa1\xae\x4f\x8e\x07\x59\xd6\xaf\xa0\xb1\x74\x11\xb5\x17\x0b\x52\xf2\x05\x47\xc7\x2f\x3e\x88\xd4\x8c\xb4\x56\xfe\x62\x5b\x62\xfe\xb0\xf8\x13\x17\xed\xf1\xec\x09\xec\xe5\x34\xb9\xf5\x00\xd4\xe1\xb1\xbd\xa2\xdb\x21\x98\x2a\xa9\x50\x94\x22\x6e\xe9\xf5\xb0\xa6\x5d\xa8\x3f\x91\x12\x1c\x96\xb3\xb4\x01\x0a\xe7\x82\x6c\x9e\x80\x63\x6c\xba\x00\xf7\x0c\x3c\x8a\x27\x9b\x01\xb9\x52\x94\xcb\x85\x0f\x91\x70\x9f\x43\x76\x66\x2a\x58\x0b\x15\xac\x29\x81\xaf\xe9\xf8\x54"}, +{{0xa3,0x5b,0x92,0xf2,0x44,0x06,0x3a,0x19,0xbb,0x5e,0x3e,0xd4,0xd6,0x99,0xed,0x20,0x69,0x60,0x71,0x16,0xd2,0xbd,0x08,0x11,0x3f,0x0d,0x83,0x73,0x61,0x3f,0x35,0xb7,},{0x7e,0xc9,0x36,0x01,0x86,0x4e,0xe4,0x99,0x5a,0x4f,0x7a,0xbc,0xd3,0xdf,0xc1,0x01,0xe9,0xe7,0xf3,0x69,0xe6,0x3d,0xe1,0xae,0x68,0xa0,0x7a,0xa7,0xf0,0x75,0xb3,0x29,},{0xa2,0x3d,0xbe,0x37,0x57,0xe4,0x78,0xdb,0xc8,0x4d,0x3d,0xb3,0xa9,0x33,0xb0,0x42,0x8c,0xed,0xb6,0xb0,0x1b,0x86,0xd8,0xd7,0x3f,0x39,0x59,0x87,0x8d,0xae,0x6f,0x05,0x88,0xf5,0x05,0xcd,0x4d,0x39,0xf2,0xab,0x46,0x77,0xb6,0x48,0x05,0xd6,0x29,0x65,0x2a,0x22,0x52,0x98,0x25,0xc3,0xa9,0x1d,0x04,0x37,0x49,0xfc,0x71,0xf0,0x37,0x06,},"\x65\xcd\x36\xda\xe0\x16\x8d\x69\x97\x4f\x95\xf0\x9d\xd9\xa5\x9d\xb7\x99\xf9\x11\xe1\xa1\x5b\x85\xa0\x08\x93\xb8\xc9\xa3\xd4\x8a\x2f\x58\xac\x12\x6b\xfa\xa0\xa6\x06\xc0\x5d\x94\x70\x1d\x27\x3a\xbf\x7d\x68\x81\x7f\x2c\x71\xb1\xc5\x41\x79\x5c\x4f\x60\x95\xe2\x6c\x9d\xff\x80\x3f\x03\x2f\x75\x66\x3f\xd1\x69\x8e\xdd\x97\xff\x3a\x0e\x72\xe1\xb7\xc9\x94\x8b\x08\xba\xcb\x5f\x7d\xe5\x02\xb2\xfe\xa6\x7c\xa2\xfe\xf1\x90\xd6\x0e\xae\x92\xd1\x51\x58\xda\x44\x4a\x49\xd2\xe9\xd5\xa5\x73\xe8\xe1\x77\xe8\xbb\xf7\xe6\xc4\x9f\x90\x71\x36\xe7\x1d\x2a\x66\xcb\x07\x63\x6d\x48\x76\x8f\xf4\x17\xc8\xbe\xcc\xf4\x32\x31\x81\xfe\xfb\x31\x24\xe4\x34\x04\x9e\xa4\x5d\xd5\x01\x9e\x40\xb4"}, +{{0x72,0xd4,0xa5,0x64,0xca,0x15,0x49,0x9b,0x5e,0x4e,0x75,0xd8,0xac,0x0f,0x28,0x21,0x7d,0x32,0x11,0x4a,0x0c,0x64,0x9a,0x7c,0x8e,0xaa,0xdd,0x0c,0xc7,0x8c,0x52,0x0b,},{0xc7,0x66,0xbd,0x73,0x83,0x7c,0x4f,0xaa,0x52,0x15,0x50,0x2f,0x1e,0xfc,0x90,0xc0,0x03,0xf7,0x11,0xbb,0xef,0x55,0x17,0x00,0x91,0x02,0x8a,0x34,0x49,0x34,0x08,0xa9,},{0x8f,0xc4,0xf1,0x79,0x33,0x0b,0x64,0x2d,0xd8,0x6c,0xa9,0x36,0x26,0x51,0xb8,0x3b,0x00,0x6d,0x83,0x75,0xcc,0xef,0x81,0x1d,0x3c,0x67,0x06,0xf9,0x15,0x94,0x65,0x1d,0xf2,0x76,0x99,0x53,0x72,0x30,0x46,0xcc,0xb9,0xbf,0xe6,0x6a,0x66,0x7e,0x0d,0x11,0xfc,0x3e,0xa2,0xd8,0x22,0x62,0x34,0xfd,0xd5,0x16,0x47,0x65,0x26,0x0f,0x7b,0x05,},"\x6c\x7e\x7b\x62\xeb\x24\x4a\x45\xd7\x84\x36\xe2\x97\x0d\xcd\x6c\x0f\x7d\xb8\x22\x97\xa8\x61\x40\xea\x58\xdd\x22\xc2\x19\x5a\xdb\xc9\x56\xd4\xc4\xec\x05\x35\x4b\x21\xef\xe2\x4c\xfc\xfe\x10\xe1\x76\x22\x36\x88\x48\x18\x0d\x2c\x46\x80\xcc\x21\x5e\x8c\xee\xa6\xcc\xe2\x22\x16\x1f\x1e\x09\x22\x39\x25\x3b\x97\x46\xf7\x88\x7d\xf2\x42\x5a\xb5\xa8\x80\xbd\xba\x98\x15\x3b\xe7\x86\xdc\x83\x8c\xbe\xca\x01\x6b\x1d\x06\x52\x4b\xd6\xbf\xba\x80\x9a\x8b\xb3\x7a\xda\xb1\x5d\x42\x41\x5f\x86\xec\x03\x58\x36\x5e\xa8\x7b\x81\x50\xb0\x54\x41\xd9\xd4\x98\x46\x87\x14\x85\xca\xae\x6d\xe3\x59\x73\x6c\x27\x18\x97\x36\xd8\xf1\x76\x5f\x3e\x5c\x5f\x6b\x92\x16\x83\x96\x39\x0b\xee\x94\xcf\xbd"}, +{{0x2e,0x5a,0xaa,0xb2,0x98,0xe6,0x6c,0x2d,0xc1,0xd7,0x7e,0xa7,0x42,0x1f,0xf8,0x95,0x25,0x5f,0x9d,0x90,0x0d,0xb0,0x45,0x0d,0x63,0xf9,0xf7,0x9c,0x1a,0x70,0x13,0xcf,},{0x03,0x81,0xf3,0xf1,0x90,0x45,0x71,0x9b,0x9e,0x8c,0xeb,0x56,0x2f,0x0e,0x96,0x5d,0xc0,0x7b,0x09,0xf3,0x71,0xa9,0x63,0xa2,0x81,0xc7,0x49,0xc2,0x53,0x2f,0x65,0x4a,},{0x7c,0x74,0x30,0x30,0x5b,0x36,0x1a,0x9e,0x35,0xb2,0x78,0x0c,0x4d,0x44,0x08,0x07,0x1b,0x21,0x30,0x93,0x1d,0x39,0x83,0x0e,0xc8,0xd3,0x13,0xaa,0xfb,0xc8,0x3a,0x65,0xda,0xe1,0x9c,0xb7,0x47,0xd9,0xd1,0xc4,0xce,0x3f,0x35,0x9c,0xc8,0x24,0xea,0x8c,0x92,0xf6,0x6a,0x42,0xb8,0x61,0x4e,0x78,0x48,0xb8,0x84,0xac,0x8a,0xa4,0xae,0x02,},"\x3d\xf0\xe5\x4c\x71\x1e\x31\x32\xd7\xae\x95\x3d\xeb\x7b\x66\x86\x9e\xe5\x31\xee\x40\xb6\x3c\xe6\x93\x20\x6c\xdb\x2f\x4b\xda\x0a\x25\x69\xe9\x13\xac\x3e\x65\x32\xc5\xd9\x64\x8e\xfd\x46\x27\x78\x0f\xb8\xa3\x1d\x10\x7e\x03\x3f\x05\x4d\x19\xed\x8b\x7c\x49\xdc\x40\x7d\x2e\x94\x9d\xe2\x5f\x99\x30\x72\x21\xd3\x58\x43\xf6\xd5\xeb\x7d\xe5\xcd\xf4\x1b\x91\xdb\xbf\x34\xcb\x6c\x9c\x53\x00\x21\x01\x4b\x56\xab\xc4\x4a\xc2\x30\x03\x13\x61\x56\x08\xa7\xb4\xa2\x35\xe9\x9c\x14\xce\xf8\x05\x08\x87\x03\x22\x09\x48\x8b\x9e\xae\xaa\x82\xc0\x94\x05\xfc\x75\xbe\xc9\x4d\xd4\x2d\x6f\xf1\xb5\x99\xa6\x3e\xe5\x74\x2f\x33\x64\x09\x3a\xc9\x2c\xab\xab\x30\x35\x82\x2a\xa8\x67\xae\x56\xdc\xc9\x9d"}, +{{0xb6,0x36,0xa0,0x24,0x48,0x00,0x35,0x43,0xdb,0x86,0x4b,0x40,0xb5,0xd8,0xd6,0xdd,0x9a,0xd6,0x11,0x62,0x4c,0x9b,0x0f,0xc6,0x89,0x0c,0x51,0xea,0x55,0x92,0xc7,0x90,},{0x1e,0xf3,0x60,0x49,0x59,0x68,0xe5,0x6e,0x6d,0x3f,0xe7,0x40,0xb1,0xc8,0x4c,0x4e,0x44,0x90,0xed,0x68,0x2d,0xeb,0x43,0x05,0xaf,0xd5,0x96,0xef,0xb2,0x80,0x22,0x3b,},{0xd4,0xba,0x80,0x30,0x0d,0x5c,0xb5,0x13,0x53,0xc0,0x3f,0x28,0xc4,0x4f,0xd0,0xa4,0x24,0xff,0xe1,0xe4,0x0d,0x78,0xed,0x7b,0xb1,0x13,0x3e,0x8f,0xe4,0xe1,0x87,0x50,0x52,0x93,0xb2,0x0a,0x39,0x1d,0xa9,0x62,0xc6,0xa8,0xac,0x0a,0xce,0xc9,0xc6,0x72,0x26,0xaf,0x3b,0x61,0x95,0xda,0xbe,0x39,0xb3,0x66,0x22,0x94,0xda,0x3e,0x0e,0x09,},"\x4a\xa8\x5a\xac\x25\x03\x4f\x61\x4e\xd4\x4f\x7a\xdc\xdb\xee\xec\x25\xfc\xc2\xa9\xee\xa3\x2a\xb6\xa8\x69\x95\x06\xf7\xa1\xca\xd3\xbc\x89\x2e\x9d\xce\x93\x4e\x75\xb0\xa8\xcd\x14\x64\x2b\x77\x85\x99\x28\x6c\xfd\x8f\x50\xa9\xe4\xf2\xed\xf9\xf9\xd6\x29\x1a\x2e\x29\x79\xcf\x18\x06\xb9\x3e\xd8\xc9\xa7\x8f\xae\x19\x9b\x28\x54\xa0\x3e\xc4\x06\xab\x3f\x72\x08\x35\xee\x26\x3f\xbb\xc9\x1c\xb4\xef\x07\x58\xd7\x75\xfc\x78\x4c\x7d\x5b\x25\x1a\xc8\x93\x79\x19\xa9\xe6\x7b\xe8\x8c\x9e\x44\xcf\x2e\xc7\xf5\x60\x26\x9a\xa0\xf1\x11\x3d\x91\xb8\x44\x01\xdb\x15\xa3\xc4\x8c\x7d\xac\xff\x49\x39\xee\x01\xba\xbb\x98\x2f\xb9\x56\x25\xc6\xc3\xad\x78\x74\x90\x60\x55\x1b\xfd\xe8\xcc\xe4\xfb\x8a\x29"}, +{{0x5c,0xa0,0x54,0x3c,0x71,0xf5,0x68,0xa0,0x0e,0xed,0xf5,0x0a,0x95,0x20,0xf4,0xc1,0x5b,0x52,0x6e,0x3f,0xb0,0xda,0x81,0x6c,0x29,0xea,0x3d,0x50,0xb2,0xf6,0x2a,0x12,},{0xd4,0xa2,0x93,0x3c,0xe1,0x94,0x54,0xe3,0x31,0xb5,0x28,0x01,0x00,0x20,0x9a,0x6c,0xe8,0xe5,0x69,0xf9,0x93,0xc2,0xac,0xab,0x51,0xdb,0xe8,0x64,0xc5,0xcb,0x25,0x63,},{0x43,0x68,0x23,0xee,0xff,0x3e,0xdc,0xe5,0xd8,0x58,0x7d,0x68,0xe5,0x47,0x3e,0xf3,0xd8,0xdc,0x94,0x65,0xb5,0x58,0xb6,0xe8,0xe7,0xcd,0x31,0x37,0xec,0xcc,0x80,0xb4,0xc4,0xe8,0x06,0xed,0xf1,0x36,0x19,0xd8,0xe7,0x17,0xe6,0x9f,0x48,0xd7,0x06,0x1b,0x68,0xde,0x02,0xc8,0x20,0x9b,0xe1,0xf7,0xac,0x26,0xba,0x8e,0xdf,0x60,0x6d,0x02,},"\x4e\xf8\x49\x69\x78\xd2\x8c\x10\xab\xd5\x4a\x26\x35\x6e\xe5\x59\x21\xce\xb3\x50\xdd\x4b\x74\x2c\x41\x61\xfb\xeb\xa8\xa1\x60\x1f\x8a\xd0\x48\x4b\x21\xa8\xcf\x5a\x29\x4f\xac\x00\xec\x8a\x6f\x59\xe3\x36\x2e\x47\xbf\xae\x1e\x28\xa2\xe6\xd0\x17\xc5\xca\xa7\x5f\xb0\xf4\x84\x82\x80\x80\x37\xca\x21\x47\x69\x54\xd7\x78\xff\x1a\x05\x86\xda\x3e\xf6\x9d\x6c\xef\x6d\x2d\x8d\xf4\xae\x7a\x85\x44\x2a\x1e\x46\xc9\x98\xcf\x40\x7a\x6a\xd4\xc5\x46\x3a\x43\xc2\x48\xf3\xb6\x93\x7f\xdb\xc8\x45\xb6\x0c\x6d\x85\xe0\x56\x3c\xc1\x6b\xa9\x67\x5d\x36\x4f\x52\x5f\x66\x9a\xaa\xc9\x5f\x42\x8b\xb5\x82\x05\x09\x9f\x9e\x4a\x6d\xbb\xd0\x15\x1f\xb6\x5b\xab\xe1\x23\xe5\x39\x3a\xd6\x40\x26\x93\x5c\xb4\x88\xaa"}, +{{0x5f,0x87,0x11,0x7d,0xa9,0xbb,0xb6,0x09,0x1c,0x94,0xda,0x6b,0x23,0x0b,0x7d,0x8f,0x6d,0xe0,0xed,0x2a,0x07,0x64,0x13,0xb9,0x2e,0xac,0xdc,0x43,0xab,0xbc,0x68,0x97,},{0xaa,0x78,0x6a,0x14,0x62,0x26,0x83,0x2a,0xa7,0x3c,0x43,0x4b,0x0e,0xdc,0x2d,0x41,0xd2,0x55,0x8f,0x82,0x0a,0xb8,0xf8,0x7e,0x09,0xe6,0xcd,0xa9,0x10,0x72,0xb9,0xb6,},{0x0f,0x19,0xe6,0xea,0x0c,0x05,0xf3,0x81,0x85,0xc0,0x1c,0x2d,0x64,0x77,0x99,0x5d,0xaf,0x50,0x65,0xba,0x9d,0x80,0x17,0x3f,0xa6,0xbb,0x23,0xa7,0x74,0xdc,0x88,0xb3,0xaa,0xe8,0x79,0xd8,0xa6,0x24,0x71,0xd2,0xd3,0x04,0xcc,0x3d,0xc6,0x62,0x78,0xa7,0xab,0xcb,0x0b,0xb0,0x77,0x1c,0xd2,0x78,0xe1,0x1e,0x7b,0x93,0x2e,0x9f,0x9b,0x0f,},"\x22\x97\xc4\x0a\x2e\x83\x65\xba\xe4\xc5\xf0\x63\x0c\x50\xb1\x3b\xdd\x9a\xd9\x77\x0a\x5d\x9a\x94\x51\xd0\x08\x74\xb0\x23\xd2\x5e\xcd\x46\x8b\x96\x57\x1b\x2f\x16\xdc\xb1\xb0\xd3\xd7\x56\xc1\xf0\x44\xfc\xdd\xd1\xc5\x1f\x27\x72\x7a\x03\x69\xc9\xcf\x25\xbd\x6a\xa5\x95\x51\xb5\xb0\x7c\xf8\xf8\x07\xd9\x2b\x15\x91\x98\x63\x97\x04\x74\x0f\xe6\xed\xa0\xf2\x6d\xba\x7e\x75\xd4\x53\x0b\x28\x00\xf0\x3f\xb6\xaa\x67\x7d\x84\xdf\x75\xd6\x8d\x4f\xbb\x64\xad\x21\x00\x1e\x3f\xc8\x7b\x60\x9b\x9c\x25\x1e\x8c\xcb\x12\xbb\xca\x92\x74\x47\xe2\x05\x4e\x07\x68\x8e\xb8\xa2\x05\x21\xa5\x22\x49\xe7\xb9\x43\xbe\xd6\x0e\x6a\x93\xc0\x1e\x3e\xb6\x21\xf0\x46\x0c\x18\xa6\x90\xb6\xf6\xb6\x6e\xdc\x6e\x87\x43\xa6"}, +{{0xb5,0x3a,0x64,0x4c,0x92,0xba,0x2d,0xc7,0x10,0x8b,0x16,0x83,0x3f,0x09,0xad,0x59,0x17,0x84,0x64,0x37,0x22,0x5a,0x77,0x3d,0x32,0xd7,0x9c,0x97,0x73,0x3c,0x0a,0x58,},{0x51,0x58,0x18,0xc6,0x9c,0x0e,0x0a,0x17,0x06,0xb0,0x41,0x43,0x84,0x2f,0x3e,0x9e,0x27,0x14,0x48,0xfb,0xaf,0x3a,0x89,0x91,0x19,0xc3,0x2f,0x42,0x56,0x6f,0xfd,0x33,},{0x13,0xd2,0xcb,0xac,0x79,0x76,0xad,0x27,0xf0,0xbf,0x66,0x9a,0xd5,0x88,0xef,0xb2,0xc9,0x1b,0xab,0x85,0x07,0xd5,0x7f,0xb1,0x6b,0xfe,0xa9,0xca,0xff,0x2b,0x09,0x64,0xe7,0x56,0x25,0xc4,0xd8,0x08,0xd7,0xbb,0xb7,0x8c,0x5b,0x46,0x4e,0xdf,0xfe,0x49,0x49,0xec,0xfb,0xc8,0xb9,0x5f,0xf6,0xfd,0xb1,0xbd,0xca,0x27,0x42,0x06,0x81,0x00,},"\x13\x03\x6d\xaa\xee\x45\xfc\xfd\xe0\xc5\x3e\x06\xd0\x5a\xa9\xc0\x1e\xa9\x4a\x67\xe8\x6c\x6c\x53\x8c\xcb\x28\x3b\x36\x8d\xaf\x70\x78\xd3\xfb\xab\x58\x0c\x76\xec\xf8\x2b\x4e\x96\x60\xf0\x68\xdc\xbb\x50\x0b\x80\x59\x50\x17\xc5\xbe\x3c\x44\x8f\xbd\x8a\x17\xd9\x7c\x56\x43\x19\x78\x90\xe1\x67\xb3\x53\x45\xbf\x65\xe7\x5b\x82\xc8\xd6\x52\x29\xf2\xf6\x0a\xae\x27\x72\x58\x1b\xc9\x9c\x49\xd4\x16\xbc\x3d\x78\x74\x6e\xf8\x30\xf1\xaf\x94\x4f\x4a\x67\x15\xab\x4f\xfb\x01\x59\x1b\xac\x28\x57\xf1\xa9\xc9\xd1\x70\x08\x88\x78\x00\x06\xa3\x16\x07\x33\x8f\x7a\xf7\xbe\xdf\x6e\xfe\x0b\x57\x29\x9a\xc9\x15\x52\x6f\xe5\xe1\xe1\x01\x29\x87\x08\xc6\xe6\x1b\x84\x22\x0a\xfe\x95\xb5\x3f\x89\x59\x87\x45\x61\x52"}, +{{0xd2,0x7c,0x9e,0xaf,0xcf,0x88,0x15,0x19,0x90,0xbb,0x5b,0x2f,0xa8,0x44,0x3e,0x70,0x9b,0x5f,0xd8,0xd7,0x8d,0x23,0x38,0x03,0x32,0x2d,0xc8,0x6d,0x93,0xd9,0x32,0x95,},{0x08,0xe0,0xef,0xf5,0x29,0x77,0x67,0x14,0x68,0x61,0x96,0xd8,0x17,0xfd,0xf7,0x1e,0xb5,0xb6,0xe8,0x32,0x65,0x16,0xef,0x48,0x9b,0xfe,0x18,0x6a,0xc5,0xc5,0xbf,0x6d,},{0xc2,0x54,0xe3,0x71,0x44,0x56,0x33,0x13,0x74,0x42,0xee,0xfe,0x40,0xad,0x4a,0x82,0xe6,0x9b,0x1e,0xbf,0x48,0xa6,0x85,0xa2,0xbc,0x6f,0xfb,0xac,0x12,0x6d,0x22,0x84,0x87,0xb2,0xe3,0x53,0x7c,0x97,0xef,0x74,0x10,0x34,0x20,0x91,0x96,0x2e,0x50,0xc0,0xcb,0x85,0xde,0x7b,0x39,0xce,0xb4,0x1a,0xc4,0x07,0x8d,0x40,0xf3,0x40,0x71,0x06,},"\x77\xc3\x5b\xda\x32\xa5\x96\x7d\x8b\x30\x2f\xa7\xa4\x75\x83\xce\xab\x89\xc9\xa6\x09\xa6\x67\xb7\x53\x15\x5f\xa6\x99\x6f\x86\x31\xd0\xeb\xed\xfe\x0a\xc3\x64\xc7\x7e\x85\xba\x37\x31\x1f\x0d\xe5\x7a\x0d\xc2\xc1\xe9\xe4\x00\xd5\x8b\x42\x4a\x32\x2e\x1d\x57\x71\xe0\xa9\xfd\x95\x02\xad\x02\x32\xce\x54\x4f\x07\xd8\xc6\x6e\x7c\x31\x47\xf8\x60\x7a\xc6\x18\x9b\xb6\x90\x66\xf2\xfa\xd6\x31\x18\x5f\x45\x7f\x46\x7e\xba\x33\x22\x8e\xcc\x40\xe8\x94\xa7\x7b\x57\x16\x98\xa9\xbf\xac\x84\x1a\x54\xea\xc5\x21\x9d\xa9\x9c\x6a\x91\x25\xc4\x69\xa2\x2f\xe8\x1f\x3b\x95\x14\x33\x89\x6f\x19\xce\x39\xb3\x73\xfd\x7e\x5c\x7b\x65\x0a\x5e\xf2\x36\x5a\xe7\x51\x0b\x0d\xa5\xe4\x9d\x7c\x07\x07\x3c\xf1\x66\xa9\x83\x87\xe8"}, +{{0x70,0x21,0x3d,0x3a,0x79,0xc6,0x5d,0x6d,0xbb,0xa5,0x42,0xa3,0x67,0x96,0x35,0x00,0x3a,0x68,0x2a,0xf5,0xfa,0x58,0xde,0x6b,0x0d,0x65,0xbf,0xa2,0x41,0x84,0x90,0x1c,},{0x44,0x02,0xfb,0x92,0xcc,0x12,0x49,0xdd,0x1a,0xe1,0x69,0x0f,0x03,0xb3,0xec,0x4f,0x1e,0x9b,0xda,0xb0,0xde,0x5b,0xfd,0x28,0x9f,0x10,0x29,0x68,0x30,0xfd,0x40,0x3e,},{0x5b,0x6c,0xe2,0x77,0x4d,0x40,0x0e,0xce,0xa8,0xa8,0x08,0xf5,0xfd,0x0a,0x79,0x7f,0xfc,0x61,0x16,0x75,0x23,0x76,0xcd,0x7b,0xfa,0x3b,0x2c,0xca,0x3a,0x84,0xd5,0x59,0x3f,0x5c,0x03,0xad,0x3e,0xec,0x1d,0x89,0x53,0x22,0x75,0xc4,0x7b,0x7c,0xe2,0xa0,0xe9,0xc5,0x9c,0xc4,0x02,0x8a,0x8a,0x65,0xe5,0xbb,0x90,0x97,0xea,0x71,0xc2,0x08,},"\xcd\x6e\x1c\xd9\xc9\x0f\x56\x6d\xe0\x43\xd7\x5d\x72\x44\xec\xfd\xb3\x8e\x8b\xde\x2f\x9a\x6c\xd5\xa4\xfd\xac\x72\xb5\xed\xe6\xaf\x62\xd9\x81\x91\x8c\x5e\x61\x0a\x38\x78\x92\x74\xfa\x10\xe5\x27\xf8\x5f\xad\x20\x9b\x76\xca\x1c\x28\x1a\xd5\x89\x0f\x9c\x96\xd3\x5d\xe5\x22\xf1\xdd\xcc\xb5\x39\xb8\x79\x8a\x00\x67\xac\xdd\x45\xb6\xe3\x44\xa5\xd9\xa9\x77\x31\xf5\x45\xff\xa4\xb1\x7b\x87\x5c\x67\xb4\x8e\x9d\x4c\x4b\xa7\x2c\x98\xa4\x50\x55\x83\xfd\xbf\x1e\x12\xf2\x2b\x5a\x7a\x49\x47\x46\xcc\x9b\x6c\x1b\x57\x19\x06\xc6\x7f\xcc\x88\x3a\x9c\x15\xa3\x80\x68\x75\xb6\x59\xe5\x81\x6b\x42\x76\xc3\x19\x0e\x25\xcc\x1a\xc3\xde\x47\xbf\x99\xc4\x99\x65\x38\x8f\x54\xf3\xef\x8e\xb5\x69\x90\x6c\x60\x08\xe5\xfb\xbd"}, +{{0x5d,0x54,0x0b,0x3b,0x14,0xf0,0xc0,0x17,0x5c,0x04,0x7e,0xaf,0x02,0x6c,0x90,0x70,0x65,0x9e,0xf1,0x3e,0x9d,0x28,0xe0,0xc5,0xc5,0x16,0xa4,0x28,0x26,0x9b,0x14,0xeb,},{0x1d,0x2d,0x4d,0x55,0x1a,0x57,0xc6,0xfb,0x2b,0x04,0x18,0x10,0x49,0xd4,0x03,0x9d,0x57,0x5c,0xf8,0x0c,0x0b,0xc6,0xec,0x70,0x33,0x06,0x7f,0x27,0x30,0x93,0x44,0xde,},{0x32,0x52,0x7d,0xa7,0x55,0x31,0x28,0x89,0x93,0x5d,0xd5,0xee,0x91,0xb1,0xbb,0x11,0x7a,0x5d,0x37,0x7d,0xd2,0x3e,0xf5,0xb7,0xe1,0x5b,0xaf,0xfa,0xe9,0xa5,0x43,0x91,0xa3,0xfd,0x23,0x4b,0xdc,0xe0,0x73,0xe0,0x98,0xc5,0x8d,0x05,0xbf,0x19,0x5b,0x4c,0x3c,0xc6,0x39,0x72,0x38,0x3b,0xa4,0xb5,0x10,0x72,0x97,0x1a,0xeb,0xcb,0x62,0x0d,},"\xe4\xc9\xe8\x70\x68\x98\xca\xd4\xac\x68\xd7\x3c\x13\x0e\xfa\x04\xa5\x4f\x8c\xa2\x59\x19\xea\x6b\xfa\xa5\x4c\x8c\x72\x0c\xed\x85\x4c\x5e\x95\x09\x10\x2c\x7b\x88\x5a\xed\xdf\xfb\xd1\xb7\xf2\xc5\x92\x25\x83\x67\x7a\xc9\xee\xa9\xa1\x08\xc7\xe8\x3e\x88\x71\xae\xd5\xa0\x84\xf5\x44\x0b\x0f\x39\x1a\xd7\xff\xc6\xba\xb4\x57\x4a\xf1\xb9\x67\x70\xf4\x37\x0e\x8e\x98\x8e\x85\xec\xb1\xa8\xd6\x03\x4f\xc3\xd7\xf4\x9f\x74\x22\x02\x3b\x9d\xab\x5d\x0c\x16\xbe\xab\x5f\x5d\x37\xb0\xa4\xd7\xde\x19\x7a\xd8\x7c\xd4\xff\x8c\xe7\x8e\xb1\x2e\x1d\xaf\x73\x9d\x8b\x47\xab\x38\x0a\xbe\x90\x93\x35\x6d\xb5\xb5\x97\x17\x75\x1a\x49\xe1\x94\x84\x72\xfd\xac\xc2\x59\xff\xff\xc8\xc1\xdb\xae\x59\x26\x07\xd4\xec\x71\xcc\x6a\x8f\x6b"}, +{{0xca,0x41,0x76,0x9c,0xaf,0x17,0x17,0xb4,0xe4,0x5c,0x93,0xc1,0x21,0xdc,0x82,0xa5,0x34,0xfb,0xc6,0xec,0x09,0x86,0x66,0x2c,0x32,0x22,0xd7,0x14,0x92,0xbd,0x11,0x76,},{0xaf,0x3f,0x89,0xf6,0x18,0x7d,0xbc,0xf9,0x21,0x77,0x50,0xc6,0x7e,0xf8,0x9e,0xd4,0x7b,0x03,0x9f,0x9e,0xb0,0x62,0xff,0xec,0x9d,0xf6,0x4a,0xb5,0x2b,0x0b,0x45,0xcb,},{0x5c,0xda,0x87,0x2f,0x7e,0xd6,0xd7,0xc9,0x02,0x18,0xac,0x10,0xbe,0xe8,0xe2,0x14,0xf3,0xb3,0x4d,0x15,0xd2,0x5c,0x39,0x25,0x5e,0xc9,0xe6,0xb0,0x17,0x7a,0xa3,0xcb,0x73,0x68,0xd1,0x1c,0xb8,0xed,0x6f,0xf5,0xcf,0x0c,0x04,0x28,0x1d,0x06,0xbc,0x42,0x72,0xb8,0xbc,0x09,0xc2,0x3f,0x6f,0x4c,0xd5,0xa8,0x10,0xdd,0xc7,0xb9,0xc1,0x03,},"\x9d\xe8\x47\x6c\x58\x13\x84\x8a\xb1\x45\x15\x37\x84\x1c\xc1\x78\x00\x21\x81\xa2\x18\x2a\xf3\x05\xb1\x2e\x5f\x7c\x3b\x1d\x56\xb2\x2c\xf4\x6a\xe6\x27\x6d\x18\x26\xec\x0a\x8c\x9a\x7d\x9f\x68\x08\x3b\x72\x25\xbb\xfa\xef\xce\x82\xb3\xb6\x45\x94\x05\x2a\x77\x00\xf3\x09\x23\x3a\x79\xff\xfd\xfc\xcc\x5c\x21\x40\x0c\x91\xcc\x0e\x41\x8d\x51\x41\xd4\x86\xb5\x21\x99\x01\xd6\xdd\x24\x47\xc1\xf7\xb7\xcf\x5a\x08\x79\xe7\x0e\x1d\xd6\x58\xd0\xf2\xec\xf3\x1e\xbe\xee\x11\xa5\xc7\x44\x40\xc6\x3b\x9d\x8b\x45\x31\x8c\x34\x65\xd7\xff\x03\x36\x5e\xdd\x03\x85\xed\xf8\x0d\x4f\xde\xd5\x1f\x0f\x75\x33\xee\x40\x99\xf1\x9e\x93\xbc\x9d\x08\xda\xdc\xd1\x34\x85\xdb\x23\x95\x22\xff\xc8\x1e\x2c\x05\x1f\x87\x96\xd6\x2e\x97\x9f\xcf"}, +{{0xfe,0xdd,0x63,0xff,0xd4,0xcf,0xbf,0x61,0x88,0x94,0x96,0x2e,0x12,0x1a,0x90,0x25,0xee,0xa3,0x18,0xa8,0x0a,0x1a,0xdf,0x16,0x9d,0x64,0x90,0x44,0x5d,0x2e,0x02,0xa0,},{0x54,0x2f,0x22,0x44,0xbd,0xb7,0xd8,0x4b,0x87,0xe6,0x28,0xa8,0xe6,0xa1,0x2f,0x17,0xbf,0x74,0xa9,0xa6,0xd0,0xea,0x46,0xc5,0x95,0xdb,0xfd,0xc6,0x80,0xc0,0x4b,0x26,},{0xed,0x59,0xd9,0xe2,0x3d,0xec,0x34,0x94,0xb0,0xfb,0xc5,0xd1,0x0c,0xd0,0x2b,0xab,0x86,0xb3,0xeb,0x35,0xab,0xbf,0x9e,0x4d,0x4a,0x92,0x64,0x79,0xf1,0x34,0x58,0x3a,0x44,0xce,0x72,0xdc,0x41,0x22,0xac,0xa3,0x77,0xa4,0x07,0x2b,0x71,0x56,0x46,0x2b,0x74,0xe8,0xdf,0x46,0xb6,0x86,0x69,0x86,0x36,0x83,0x6e,0xf2,0x03,0x17,0x9c,0x07,},"\x2e\x2a\xe5\x84\x64\x1b\xe0\x3d\xd4\x8f\x9c\x61\x80\x77\xae\xaa\x18\x21\x2a\x42\x41\xf0\xc0\x19\x4e\xd2\x3e\x37\x0d\x74\x1a\x3a\xe1\x1a\x5f\xec\x3b\x04\x0c\x16\xea\xfa\x4a\xc8\xd1\x8a\xba\xa7\xce\x8f\x28\x69\x67\x33\x71\x89\xf0\x49\x5f\xfd\xd6\x19\x95\xcd\xe3\x1d\xd8\xdf\xc3\xdf\x57\x00\xb5\x7a\x7a\x29\x98\x0e\x9c\x82\x3f\xee\x85\xd6\x14\x51\x17\x67\x29\xe7\x27\x87\xc6\x10\x9b\x47\x35\x9b\x93\xdf\xd6\x2e\x1e\x5a\x2d\x64\x2c\x05\x72\x42\xda\xe5\x00\xa9\x4c\xa1\xa9\x3b\xc5\x7b\xe1\xad\xe7\x6f\xe4\x50\x1c\x0f\x63\x77\xed\x0e\x92\x46\x17\x9a\xec\xdd\x99\x46\xb6\x71\xe8\x19\x0e\x1e\xd2\x3f\x96\x6e\x96\x40\x9b\x94\x82\x22\xd8\xea\x58\x39\xde\x90\x4f\xc5\x13\x48\x07\x3b\x8f\x40\xed\xbd\x9b\x4a\x4b\x22\x75"}, +{{0x38,0xf2,0x18,0x4e,0xaa,0x55,0x36,0x56,0xee,0x29,0x02,0x70,0x6b,0xce,0xc4,0xac,0xb5,0xaf,0x25,0x15,0x7c,0xa0,0xf6,0xa2,0xd4,0x8d,0xe8,0x52,0x85,0xfa,0x3b,0xc0,},{0x7f,0xf0,0x3f,0xb4,0xc8,0x2e,0x9c,0x15,0xd6,0x59,0xdf,0x42,0x4b,0x3e,0x73,0xed,0x1d,0x78,0x00,0x6f,0x3e,0x0b,0x79,0xeb,0x64,0xd9,0x8c,0x13,0xae,0xc6,0xba,0x37,},{0x4a,0x64,0x13,0xc2,0xc8,0x7f,0x2b,0x38,0x56,0xa8,0xde,0xcb,0xce,0x49,0x3a,0xde,0xae,0x0c,0x69,0xc9,0x41,0x34,0x70,0x7f,0xb0,0xf1,0x8f,0x30,0x49,0xfd,0x3e,0x3d,0x05,0x1a,0xbd,0xb9,0xd4,0xbe,0xe2,0x53,0xc6,0x10,0x7c,0x02,0xd5,0x7a,0xd7,0xcc,0x9f,0x31,0x01,0xdb,0x66,0x0a,0xfa,0xc2,0xb7,0x98,0x19,0x38,0xe9,0x56,0x4f,0x01,},"\xc2\xdf\x77\xc9\xe4\x79\xf6\x19\x83\xb6\xc7\x48\x3e\xf9\x3f\xb8\x5a\x10\x3b\x21\x39\x23\x92\x65\x23\x06\x5e\xbf\xf2\x25\x7e\x85\x42\x7e\x05\xcd\xc2\x75\x82\xef\x6c\x16\xbe\x35\x3a\x3b\x25\x03\x72\xd6\x37\x0e\xec\xb6\xc8\x96\x29\x17\xeb\x65\x6f\x26\x41\x69\x01\x89\xd1\x72\xa1\x11\x05\x15\x57\xab\xc2\x49\x4e\x32\xca\xb6\x5e\xd0\x63\x3a\xff\xe9\x24\x08\xb5\x5c\x4e\xd8\xaf\x65\xe2\xc5\xe7\xaa\xb8\x87\xa3\xcc\x8d\x28\xc5\x2e\x9e\x13\x36\xd0\xb7\xbb\x3f\xe2\xcd\x84\x3e\x7f\xa1\x68\x03\x42\xf8\xa4\xaa\xfa\x02\xc4\xab\x25\x2f\x08\xc3\xd4\x6d\x5f\x00\xfd\x01\x48\x42\x63\xee\x63\x52\x84\xf6\xdb\x26\xd6\x29\x8d\xe5\xb0\xdd\x23\x8d\xa4\x0a\x8d\x2a\x93\x37\x6d\xa0\x30\x27\x83\xa0\xe3\xbe\x23\xd9\xe7\xf9\x90\xd2\x5b"}, +{{0x8b,0xfc,0xa4,0x84,0x62,0xd2,0x53,0x6f,0x74,0xb8,0x4f,0x6a,0xf5,0x9f,0x5d,0x85,0x82,0xff,0x8f,0x7e,0xc2,0x87,0x45,0xd6,0x72,0xe7,0x2e,0xb7,0x2e,0x79,0xd3,0xe9,},{0x9d,0x10,0xd2,0x75,0xc3,0xd3,0xfe,0x45,0x9f,0x7f,0xe2,0x90,0x1b,0xce,0x38,0x91,0x91,0xcc,0x84,0x83,0xc0,0xf5,0x11,0x40,0xd9,0xc6,0x2b,0x08,0xfa,0xde,0x81,0xbb,},{0x44,0xd7,0x7e,0x43,0x9e,0xf6,0xca,0x5e,0xb9,0x40,0xc6,0x0f,0xf8,0x73,0x2d,0xdc,0x16,0x26,0x9e,0xa0,0x23,0xbb,0x26,0x13,0xbd,0x44,0x7e,0xba,0x7f,0xd6,0x98,0x51,0x22,0x6c,0x48,0x19,0xce,0x8d,0x44,0x98,0x5a,0x49,0xf3,0xf4,0x1a,0xc7,0xaf,0x33,0xc4,0x7f,0xfe,0x5f,0x89,0x30,0x4a,0x32,0x56,0xe4,0x45,0xf8,0xd6,0x86,0xe3,0x07,},"\x81\xee\x4c\xb9\xc4\x5d\xa6\x91\xda\xcd\x7d\xd0\x9a\xff\x59\x73\x72\x67\xbb\x55\xc3\xad\xe1\xba\x32\xc1\x7b\x7d\x0d\x2d\x0c\x60\x79\xc3\x9d\x5f\xd5\xb2\x9b\xa5\xf9\xc1\x76\x20\x97\x70\x98\x43\xee\xe5\x61\x2b\xd2\x0b\xc8\x18\x5b\xf6\x4d\x5c\x93\x41\x84\xe1\x36\x24\xe6\xf8\x77\xa2\xa5\xdd\xa1\x5c\x0d\xf6\x2a\xfb\xb9\x70\x57\xcc\x91\xca\xc9\xa1\x84\x06\xa0\xe0\x10\x9c\xc3\x9b\x2e\x3f\x81\x2e\x22\x7a\x40\x62\xd5\xef\x81\xc9\x2c\x22\xa7\xdc\x79\x7c\x84\x5d\x71\xeb\x6e\xa9\xe4\x2e\xc8\x41\x7f\xba\x90\xa9\x6d\x2b\xb1\x43\x94\x18\x33\x0b\x4b\xb2\xf9\x9c\x6d\x63\xd3\x04\xa0\xe5\x06\xdc\xa9\x65\x3e\x5d\xe0\xdd\x56\xe3\x09\xdb\x1a\x76\xa0\xfa\xab\xab\x16\x37\x74\xf0\x00\x08\x8c\xef\x3d\x1b\x7a\x6c\xf6\x61\xd2\xe1\xd9"}, +{{0xd7,0x48,0x0d,0x42,0x72,0xbc,0xb1,0x55,0x7b,0x1b,0xbe,0xe0,0x49,0x15,0xc1,0x26,0xa5,0x2c,0xa6,0xd6,0xa8,0xbb,0x53,0x14,0xa0,0xe1,0xa5,0x2b,0x59,0xbf,0xc9,0x9c,},{0x99,0xc8,0x39,0xd3,0x6d,0x8f,0x5b,0x86,0x52,0x61,0x8e,0xd7,0xb0,0xfe,0x9e,0xc3,0xd9,0x4e,0xff,0xf4,0xc4,0x53,0xc5,0x40,0x63,0x14,0x76,0xa5,0x97,0x9b,0xbb,0xe0,},{0xe0,0x4d,0xc8,0x44,0x2d,0x35,0x21,0x73,0xe9,0x31,0x81,0x8e,0x29,0x08,0x58,0xde,0x85,0x68,0x8a,0x46,0x49,0xea,0x3e,0x3c,0x3a,0xe7,0x4e,0xda,0xa5,0x4a,0xd0,0x1b,0x64,0x62,0x2a,0xd8,0xa0,0x90,0xb6,0xad,0x60,0xad,0xfd,0x01,0x88,0x18,0x82,0x82,0x8d,0x39,0x07,0x8b,0xb5,0xb2,0x71,0x4f,0xd3,0xea,0x83,0x97,0xa3,0x42,0xfd,0x04,},"\x61\x5c\xc1\x9f\x94\x20\x17\x36\x5b\xa8\xbf\xa2\x56\xce\xcc\xc8\x5e\xe2\x89\xa1\xc3\x4b\xb1\x44\x2a\xcc\x07\x16\xc7\xfc\x2c\xae\xb7\x6a\x9d\xe1\x9a\xde\xc1\x06\x37\x1e\x47\xa3\x0d\x2e\x12\x39\xce\x1f\x7d\xca\x25\x52\x6d\x60\x4b\xdd\x64\x76\x59\xd9\x42\xbc\xba\xc3\x68\x91\x13\x49\xc3\xb9\x46\xa9\x7d\xa1\x0a\x42\xdb\xcf\x3c\x73\x41\x6d\x2e\x6b\xa2\x2b\xd2\x9d\x9f\x70\x56\x72\xe9\xe3\x38\x94\x4c\xef\x01\xad\x21\xf0\x09\x74\x2e\x07\xbc\xd8\x88\xca\x31\xe1\xee\x95\x3e\x8c\x1b\x1f\xd9\x54\xb7\xdc\xf1\xa0\xb1\xd5\xa0\x69\x06\x5a\x66\xcb\x72\x1a\xdc\x02\x0f\x4e\xfe\x1a\xbd\xd1\x67\x42\x74\x69\x39\x28\x57\x80\xd7\x53\x13\x7a\xe0\x14\x0b\xb4\x10\xfb\x6c\xe3\x36\x76\xc2\x7a\xee\xc5\x93\xa8\x8c\xbc\x73\xaf\xd9\xf4\x05\x11"}, +{{0x3c,0x2d,0x36,0x50,0x73,0x5b,0x41,0xef,0x90,0x06,0xbb,0x45,0xe4,0xbe,0x2e,0x0a,0xa5,0xcd,0xe8,0x51,0xae,0xac,0x42,0x1e,0xe9,0xc1,0xb4,0x92,0xd8,0x7a,0xa1,0x8a,},{0x3e,0x46,0xdd,0xce,0x29,0x88,0x44,0xfc,0xaf,0xa0,0x0a,0x1b,0x47,0xea,0xf3,0xde,0x70,0x59,0x6d,0xf1,0xbb,0xee,0x3c,0x80,0x9d,0x1b,0xe7,0xdd,0x94,0x08,0x0e,0x34,},{0x3f,0x2a,0xf0,0x1a,0xd5,0x37,0x7a,0xc3,0x90,0x40,0xd4,0x1a,0x41,0xe3,0x6e,0x7b,0x93,0xfa,0x72,0x35,0xb8,0x41,0x79,0x1f,0x43,0x2e,0xcd,0x7f,0x91,0xa3,0xb2,0x1a,0xb7,0x19,0x6c,0x88,0x3a,0xd5,0xa7,0xdb,0x44,0x6f,0x6c,0x06,0x67,0x24,0x60,0xf3,0xf6,0x3e,0xf8,0x63,0xd9,0x43,0x2b,0xe9,0xca,0xea,0xbb,0x79,0xe8,0x7e,0x22,0x08,},"\x14\x25\xd8\xd2\x18\xda\x1a\x10\xa8\x0b\x6a\x9c\x3c\x27\x50\xef\xe4\x16\x57\x98\x4a\xbd\x51\x00\xf4\x51\xba\x94\x9d\xb0\x10\x46\xb7\x12\x6b\xe8\x40\x23\x34\xed\x57\x52\x8b\xac\x05\x62\x25\x53\xa8\x6b\x72\x67\x22\x69\x5a\x8f\xb3\x31\xd8\x56\x54\x17\xc4\xff\x0f\x25\x1a\x32\x0a\xd0\x6d\xed\xbb\x75\x0d\xef\x35\xd5\x21\xc3\xc4\xcd\x57\x1a\x45\xad\xa8\x45\x06\x53\xd5\xe8\x1f\xe0\xbe\xb5\x3a\xaa\xe7\x87\xb3\xeb\x65\x3c\x23\x81\xed\x55\xaa\xf2\x59\x0e\xe5\xed\x8b\x66\x26\xf1\xc4\xb0\x43\x0a\x54\xf3\x96\x58\x62\x4e\x66\x35\xfe\xfc\x98\xfe\xe8\xfc\x3e\x1c\xc7\xff\x3d\xd4\x20\xde\x9d\xa1\x1a\x62\xfc\xae\x0e\x0c\xb4\x54\xfc\x6f\x7d\xf0\x39\x54\x29\x1d\x26\x20\x2f\x1b\x18\x8b\x65\x7b\x3b\xae\x07\x38\x94\x49\xb7\x5e\x67\x42\x2f"}, +{{0x74,0x96,0x59,0x96,0x26,0x8c,0xdc,0x4c,0x09,0x22,0x0b,0xd3,0x1c,0xe0,0x7b,0x21,0x7a,0x03,0x82,0x6e,0xe9,0x81,0xfa,0x89,0xf3,0xa2,0x35,0x9c,0xed,0x09,0x5e,0xf1,},{0x40,0x96,0xd0,0x27,0xc1,0xc5,0xee,0x4c,0xbf,0xc0,0x4b,0x9d,0x53,0x41,0x74,0x02,0x9f,0xdb,0x50,0xcf,0x56,0x10,0xd3,0x02,0x1e,0xf9,0x33,0xb4,0xca,0xf3,0x39,0x85,},{0x8c,0x66,0x28,0x34,0x43,0x17,0xa6,0x3a,0xca,0x6f,0x78,0xcf,0xae,0xa9,0x65,0xb3,0xaa,0x55,0x22,0xce,0x91,0x41,0x95,0x14,0x1c,0x08,0x87,0x0a,0x1b,0x8d,0xac,0xf3,0x4b,0x79,0xc7,0xab,0xc6,0x93,0xcd,0x9e,0x5e,0xbe,0x1a,0x2e,0x86,0xf0,0x33,0x2d,0x20,0x48,0xdb,0x3c,0xbd,0xef,0x01,0x68,0x79,0x62,0xd6,0xdf,0x24,0x9e,0x38,0x00,},"\x45\xb2\xf0\x64\x61\x5b\xf7\x74\xfc\xe9\x7f\x51\xc4\x64\x68\x5d\x7b\x3e\x4f\xef\xff\x92\x31\x24\x0a\x71\x9b\x3b\x06\x21\xcd\x4a\xd8\x33\x05\x67\x5c\xd6\xea\xae\xbf\xf7\x91\x00\x0b\x0b\x1f\xa3\x1d\x82\xd8\x18\x1b\x7f\xe5\x7c\x5e\x00\xce\xc5\x6f\xf9\x02\x2e\x9c\xe8\xdb\x66\x35\x6e\x40\x8e\x3e\xe2\x62\xfe\x62\x77\x89\xe6\x55\x35\xef\x1a\x63\xe8\xfe\xc9\x33\xbe\x3d\xee\x34\xd2\xfa\xcd\xb8\x92\x8c\xc4\x56\xab\xf2\xf3\xe8\xca\xb4\x7e\xff\x1c\xa4\x2e\x8b\x0e\x48\xd2\xc7\x3e\x7b\xcc\x5d\xe3\xf1\x05\x6f\xc5\x23\xdf\xef\x6b\x00\x23\xf3\x28\x89\xed\x39\x4e\xed\xa0\x32\xab\xf6\xbc\xaa\xda\xa7\xf3\xee\x74\x11\x87\x60\xab\x6d\x91\xdf\x52\x8b\xdc\x58\x07\x97\x2c\x85\xfa\x7c\xb5\x6e\x38\x7d\x73\x32\xe7\x79\xe5\x2d\x0d\xd7\xdb\x0c\xfb"}, +{{0x0a,0xbf,0x06,0x9c,0x08,0xb2,0x69,0x1c,0x3a,0x26,0xf7,0x9d,0xc8,0xed,0x05,0xcb,0x71,0xd2,0x20,0xff,0x78,0xf3,0xa5,0xc5,0x78,0x0a,0xe9,0xda,0x18,0xe4,0x56,0x43,},{0x9e,0xf3,0xb5,0xcc,0x01,0x6c,0xc8,0x2d,0xbd,0xda,0x70,0x57,0x66,0xaa,0x44,0x8b,0xd6,0x1f,0xa1,0xaa,0xf1,0x17,0x0e,0xfe,0x91,0x49,0xda,0xa9,0xfe,0x64,0xa1,0xae,},{0xc7,0x56,0x6f,0xb3,0xb4,0xd8,0xde,0xf6,0x67,0xe0,0x40,0xf2,0x76,0xd3,0xed,0x98,0xd3,0x6d,0xff,0x46,0x01,0x26,0xa7,0x5b,0x4c,0xc2,0x10,0x03,0x86,0xbb,0x01,0xc6,0x42,0xf6,0xd8,0xde,0x7e,0x64,0x9b,0xe6,0xe0,0x81,0x8b,0x08,0xd7,0x7c,0xe6,0x0f,0x4e,0xe5,0xe7,0x71,0x7a,0x50,0x88,0x4b,0xde,0xe0,0x20,0x34,0xec,0xf1,0xcd,0x0c,},"\x0d\x05\x52\x91\xb2\xe8\x61\xea\xe1\x9e\xa0\xfb\x20\x69\xd8\xc9\xee\xf4\xf1\x34\x7f\x35\x76\xd7\x84\x11\xae\x7c\x0b\x1c\x1c\xaf\x31\xfd\xe7\x36\xdc\x8a\xcc\xac\xb6\x62\xdf\x76\xb6\x20\xb6\x2c\xe9\x0b\x9f\x92\xc8\x33\x09\x12\x86\x21\xd0\x57\xcf\x84\x58\x05\x94\x90\x88\xe9\x38\xdd\xbc\x3d\x41\xc5\xe5\x54\x1f\xec\x82\x98\x68\x7a\xd2\xf7\x9a\xcd\xa0\x1a\xa2\x15\xd2\x58\x21\x43\x6e\xac\x9d\x26\x87\x16\xd4\xcd\x60\x50\x26\x0c\xb4\xef\x6a\xad\xa4\x83\x5e\x07\x3a\x84\x58\x21\xff\x21\x1a\xe2\xba\xad\xce\xb6\xe5\x7f\x06\xf8\x83\x45\xed\xbf\x93\xbf\xdf\x54\xfb\x74\x12\x3b\x57\xc0\xfb\x4a\x79\x60\x8d\x8d\xb6\x74\x08\x89\xe1\x57\x33\x50\x77\x99\xf7\xa1\xfd\x30\x17\xbc\xd7\x7b\x28\xa2\xbb\x6c\x91\xec\xd1\x54\xe9\xc5\xa5\xff\xa0\xeb\x62"}, +{{0xf3,0xfd,0x5e,0xc5,0xe2,0x30,0xb6,0xda,0xd1,0xac,0x3d,0x3a,0xeb,0xad,0xc7,0x86,0x3f,0xf8,0x9d,0xe2,0xa1,0x31,0x7f,0x42,0x4d,0x15,0x98,0x9a,0x3e,0xfb,0x0a,0xfd,},{0xf9,0x9e,0x5d,0x5e,0xee,0xae,0xd1,0x20,0x5c,0xfb,0x5c,0x2c,0xc4,0xe5,0xe9,0xf6,0xb4,0xe7,0xf6,0x41,0x29,0xf8,0x60,0x10,0x4c,0xa6,0x24,0x4e,0xb9,0xfe,0xb5,0x64,},{0x44,0xb0,0x12,0x46,0x63,0xad,0xb0,0xc7,0x3a,0xed,0x49,0xf7,0x34,0x03,0x46,0x1f,0xcb,0x19,0x11,0x1b,0x0b,0xa1,0x7a,0xa9,0x96,0x56,0x6f,0x47,0x7e,0x37,0xd5,0x24,0xb0,0xe1,0xf1,0x07,0x61,0x2f,0xc5,0x2a,0x7c,0x76,0x7b,0x18,0x1f,0xbf,0x4d,0x62,0x9b,0xdd,0xc0,0x8f,0x30,0x58,0x4d,0xec,0x61,0x24,0xc5,0xd3,0x9d,0x42,0x31,0x02,},"\x71\xf2\x89\x73\xed\x3d\xf0\x59\x45\xfa\x0b\xdb\x23\xe9\xbe\xca\x65\x1d\x3e\xe6\xbf\x9f\xa4\x5f\xfd\xc6\x06\x1e\x42\xfa\x2e\x8d\x76\x23\x5f\x0e\x9e\x2d\xaa\x65\xe5\x26\x31\xfc\x3b\xea\xd3\x3d\xa0\x55\xbb\x49\x2e\x47\x58\xe5\x98\xa0\x30\xa3\x3b\x3c\x40\xb3\x43\x71\x45\x9b\x23\x3c\xcc\x04\x3c\xcc\xc3\xa3\xcb\xce\x54\x9e\x20\xe0\xb2\xb4\x33\x05\xb6\x4a\xec\x66\x1a\xad\xba\x65\x56\xb1\x7d\x76\xe3\xbb\xed\x62\xc4\xa4\xea\xc4\xf8\x86\x03\x99\x67\x52\xd2\x36\x3c\x8d\x4a\x27\x89\xd1\x28\xf6\xe9\x59\x94\x5c\x68\xc3\x01\x46\xd1\x94\xcc\xb6\x83\x9e\xc6\x53\x44\x60\x16\x52\xc1\x8b\x00\x74\xe2\xbc\x76\x68\x31\x16\x97\xd9\x60\xc7\x06\x65\x97\x92\x4d\x70\x4d\x02\xa0\x19\x3f\xaf\xbf\xdf\x57\x1e\xe0\xdf\xe4\x14\xdc\x2f\x52\x89\x69\x12\xbc\x32"}, +{{0x73,0x8f,0x13,0x10,0xa4,0xe0,0x8f,0x91,0x7a,0x0a,0x5c,0x1f,0xba,0xf4,0xef,0x72,0xf9,0x5e,0xe6,0x2f,0xcd,0xed,0x50,0x86,0x8a,0x3d,0xaf,0x98,0x85,0x6a,0x44,0x8d,},{0x42,0x27,0x2c,0x2c,0x8b,0x08,0x47,0x0e,0xe5,0xdd,0x8a,0xf8,0x84,0x9c,0x01,0xb7,0x50,0x8d,0x3a,0x3c,0x65,0xb0,0x33,0x0e,0x69,0x5c,0x84,0x1d,0x5d,0xcc,0xb2,0xf5,},{0xce,0x1e,0x35,0x77,0xb6,0xa2,0x10,0x16,0xb9,0xdd,0x0b,0x51,0x7b,0xaa,0x0c,0xcb,0x10,0x7b,0xc1,0x99,0xb8,0xbb,0xae,0xf6,0x8f,0x95,0x0c,0x8e,0xd5,0x80,0x13,0xc8,0x53,0xb4,0xd3,0x38,0xee,0xdc,0x67,0x50,0x79,0xab,0x13,0x90,0x46,0x2f,0xfe,0xfa,0x6a,0x95,0x9b,0x04,0x3f,0x8b,0x56,0x51,0xc6,0xca,0x37,0x5c,0xe0,0xb4,0xa4,0x03,},"\xf0\xe7\xef\x67\x82\xd0\x4c\x69\x43\xb1\x9e\xb6\x6f\xf6\x22\x6b\x73\x6e\x3b\x09\x40\xc0\x9b\xb1\x26\xbf\xc4\xc4\xca\x7a\x5e\x70\x16\xc2\x86\xb7\xbf\xd7\x3a\xa6\xa7\x9a\x96\x03\x1b\xc8\x1c\xb5\xda\x68\xce\xc7\x1a\x6a\x0d\x39\x78\x0c\xbe\x6a\x0c\xd4\x77\x4d\x3a\xa0\x6a\x88\x16\x10\x44\x4a\x8c\x9d\x19\x10\x22\x94\xe5\xf6\x35\x18\x7a\xa6\xf4\x8d\x11\x91\x2c\x70\x94\xb3\x88\x33\x02\x8d\x57\x0c\xb1\x10\xdb\x60\x62\x5b\xb1\xbd\xc3\x7a\xff\xa2\x5e\xa3\xc8\xf8\xdb\xfc\x25\x14\xf4\x36\x5c\x62\xb2\x98\x9a\x66\xd2\x7c\x80\x38\x4e\x74\xae\x5f\xba\x8c\x1c\x2a\xf9\xc7\x2c\x49\x71\xe6\x4f\xa6\xa1\xdc\x25\x17\xb3\x1e\xa5\x7c\xcb\x08\x15\xa7\xfe\x2d\xa0\xf1\x46\xca\xa0\x84\x31\xd2\x5d\x15\x16\x62\xd9\xd2\x6e\x95\x22\x9d\x0c\x62\x82\x36\x64\x12\x3c"}, +{{0x88,0x41,0xd2,0x2a,0xde,0xd6,0x9c,0x13,0x1e,0xf5,0xee,0x0a,0x10,0xab,0x0a,0x9b,0x77,0xcb,0x75,0x4e,0xde,0x8d,0x25,0x7a,0x53,0x72,0x72,0x6e,0x2b,0x49,0x9c,0x6e,},{0x71,0x5e,0xcc,0xa6,0x36,0x81,0xbc,0x6e,0x9e,0x31,0xd1,0x88,0x48,0x90,0x2f,0x4d,0x96,0xfe,0xaf,0x43,0xb9,0x5d,0x00,0x86,0x42,0x90,0x3b,0x17,0x63,0xbc,0x9f,0xb8,},{0xbb,0x2b,0xab,0x70,0x03,0xf1,0x31,0x1b,0xe9,0xb8,0xc8,0x83,0xfc,0x4f,0xd5,0x28,0xad,0xfd,0x51,0xa9,0xc9,0x9d,0xb3,0xdc,0xa8,0xda,0x0f,0xca,0x95,0x8d,0xa1,0x9a,0x10,0xeb,0x22,0x33,0x26,0x67,0xb1,0xa0,0x06,0x5d,0x3d,0xbc,0x0d,0x06,0x26,0x9a,0x12,0x59,0xb6,0xa8,0x90,0x48,0x4a,0xa2,0x14,0x3a,0x52,0x69,0x5f,0x14,0x5b,0x0a,},"\x08\x7c\xa6\xbe\x2a\x95\x0c\x02\x4b\x3e\x74\x67\xfe\x00\xa7\xd3\x64\x55\x5d\x5d\xc6\x77\x0f\x5e\xbd\x26\x06\x42\x52\x5b\xd3\xc0\xf9\x65\xdb\x36\xd7\xb2\x29\xa5\x74\x21\xee\xc6\x4e\x4d\x99\x1c\xdd\xe5\x91\x23\x03\x44\x70\x55\x3f\x4e\xb0\xbe\x81\xad\x29\x36\xc8\xca\x26\xbc\xab\x4e\x5d\x79\x04\x0e\x29\x79\x87\x28\x60\x16\x84\xa4\x68\x32\x3c\xf3\xba\xae\x4d\x94\x8d\x0a\x1f\xd9\x05\xef\xfe\x16\xdc\x44\x64\x20\x88\xdf\x53\xf6\x38\x8b\xc4\x80\xed\xf4\xaa\x20\x7d\x0e\xd1\x61\xed\xa3\x45\x71\x2b\x4c\x00\xcb\x05\xfc\xf6\x35\xec\x25\x88\x78\x5b\xfb\x8a\x27\xcd\xc2\x89\x96\xa1\xdb\x3e\x67\x87\x02\x33\x93\xc0\x75\xd8\x3c\x90\x38\xfe\xd7\x89\x9c\x55\xfe\xc3\x07\xde\x32\x49\xc1\x4b\xda\x49\xe8\xb8\x95\x86\x09\x42\xc3\x6d\x64\x0b\xb8\x93\x77\x91\x42"}, +{{0xc0,0x21,0x35,0xe7,0xb6,0x5a,0xac,0x72,0xf6,0x3c,0x32,0xbf,0x5b,0xef,0x5b,0x68,0xc7,0xf3,0xb8,0xed,0x56,0x20,0x8e,0x59,0xe4,0x75,0x20,0x70,0xe9,0xd0,0x70,0x95,},{0xdc,0xf6,0x00,0xf2,0x44,0x03,0x7a,0x75,0x20,0x3a,0xe1,0x1a,0xc3,0x16,0xe8,0xdb,0xe9,0x98,0x6f,0x0d,0xce,0x23,0x47,0x39,0x39,0x33,0x4b,0xf5,0xce,0xa4,0x8b,0x0d,},{0xdd,0x5c,0xba,0xe4,0x79,0xeb,0x5e,0x22,0x95,0x74,0xc2,0x1e,0xc3,0xbe,0xd9,0x11,0x11,0x3a,0x57,0xa1,0x91,0x6d,0x33,0x13,0x45,0x75,0x15,0xd5,0x5c,0xc5,0xb6,0xe6,0xeb,0xc5,0x2c,0x93,0xf8,0x21,0xd1,0x39,0x88,0xdb,0xba,0x8d,0xf5,0x09,0x6d,0x55,0xff,0x9c,0x39,0xe7,0xf9,0xd5,0x61,0xcb,0x58,0x93,0x0c,0x96,0xa7,0xa5,0xd6,0x0b,},"\x86\xd9\x49\x13\x50\xd2\x56\x6e\x70\x8e\xd3\x56\x18\x5d\x61\x0c\x73\x46\x5b\x2a\x5c\x70\x12\x91\x99\x58\xaf\x2c\xf7\x6a\xf9\x95\x23\x0d\x36\x0d\xe4\x00\xb7\x13\x71\x70\xdd\x08\x35\xf1\x0f\xcb\xec\x22\x4e\xe4\xe4\x2c\x7d\x1c\xeb\xb7\xf5\x80\xfe\xa8\xed\x62\x23\x16\x3b\xac\xdd\x19\x23\xa5\x72\xcb\xb6\xdc\x26\xca\x8b\x17\xad\xe6\x8c\x6d\x28\x08\xc4\xca\x1e\xca\x28\xea\xe9\xa1\x45\xf6\x8d\x40\x79\xd8\xd5\x9d\x14\x0e\x95\x82\x28\xe7\xe9\x95\x20\xe3\x42\xdb\xd7\x45\x7a\x91\x59\x74\x0f\x48\xbd\xc2\x7b\x93\xbd\xab\xeb\xa4\x65\xcb\xf0\xc8\xdf\x5e\xf2\xc0\xf9\x38\x6e\xeb\xe6\x56\xf5\xd7\x49\xd5\xf9\x14\x7f\x52\x52\x66\x91\x0d\x7b\x80\x39\x6a\x90\xbe\x5c\xc1\x88\xa9\xa9\x45\xf9\x3e\x75\x3f\xc9\x9b\xaf\xa1\x8e\xe0\xa6\xdf\xf7\x9b\xf8\x48\x48\x98\xef"}, +{{0x15,0x4a,0x47,0xeb,0xa1,0xb8,0xc3,0x83,0x62,0xea,0x61,0xfa,0xeb,0x0c,0x0a,0xd7,0xe6,0x1e,0x41,0x2a,0x3c,0xba,0x46,0x88,0xaf,0x0d,0xb2,0xa4,0x87,0x20,0x8b,0x1c,},{0x16,0xde,0x2c,0x89,0x4a,0x50,0xcb,0xd4,0xca,0x90,0x41,0x9a,0x4c,0xa6,0x49,0x42,0xcb,0x14,0xbd,0x33,0x5c,0x5d,0x3f,0x4a,0x53,0xe2,0x39,0xc2,0x80,0xbd,0xa7,0x25,},{0xf4,0xb6,0xeb,0x1a,0x8d,0x95,0x0e,0x88,0x7f,0xd2,0xf3,0x0f,0x70,0xa2,0x3b,0x41,0x87,0x14,0x95,0xbf,0xa5,0xb8,0xa4,0xad,0x39,0x96,0xcd,0x9b,0xf5,0x1e,0xb7,0x42,0xe0,0x7f,0x4c,0x4d,0x2d,0xa4,0xb0,0x1a,0xb0,0x87,0x36,0x7a,0x50,0xe2,0xb6,0x5b,0x3c,0xef,0x51,0x4e,0x40,0xd8,0x37,0x54,0x0b,0x8c,0x89,0x96,0x64,0x85,0x91,0x0f,},"\xbf\x60\x7e\x8b\x6e\x14\xd9\xc8\xac\xd9\x68\x15\xaf\x0c\x03\x5a\xc7\x3c\x41\x04\xc9\x37\x86\xcc\xc1\xc9\xf8\x59\x39\x5d\xd7\x81\x90\x03\x20\xeb\xf3\x56\xaa\x99\x1c\xdc\x9f\x50\x3f\xce\xe9\xf8\x36\x75\x88\x8a\x7d\x59\x20\x02\xd2\xa5\x4a\x57\x3a\x96\x99\x4b\x3f\xa8\x65\x53\x8c\x61\x7e\xd8\xad\x1f\xf6\x20\x18\x28\x8a\x67\x4f\x44\x9b\xe0\xaa\xb5\x22\x2f\x74\xc4\xfd\x47\x5e\xd6\xa8\xdf\xb2\x7f\x45\x28\x7b\x22\xb2\xb6\xc3\xbd\x15\x17\x9f\x26\x7d\x15\x7d\x7d\x8a\x41\x59\x67\x9b\xe8\x5b\x25\xc2\xbb\x2b\xa8\x50\xaa\xed\x9a\xe3\xae\x57\x1b\xe4\xf7\x58\x36\x32\x9c\xf3\x6f\x41\x2c\x1c\x80\xf1\x41\x3b\x76\x61\xea\xb4\xa8\xe1\x1b\x60\x24\x24\x4f\xc6\x23\x23\xff\x02\xe3\x8a\xce\xb1\x73\x7b\xd4\x74\xbf\x1e\x98\x01\x5d\xbc\x78\x8b\x02\x7b\xbe\x21\x7c\xf4\xe7"}, +{{0xd3,0x02,0x84,0x31,0xce,0x2e,0xef,0x73,0xbd,0x94,0x0a,0xb8,0x4c,0xa2,0x9f,0x13,0xfb,0x26,0x43,0x6a,0xa2,0x5e,0x1b,0x7b,0xf2,0x6c,0xb3,0x3f,0x17,0xfd,0xf8,0x17,},{0x63,0xdf,0x20,0x3e,0x28,0x60,0xba,0xc4,0xd3,0x52,0xe7,0x22,0xc1,0xc9,0x1f,0xe3,0x77,0x6e,0x1c,0xbc,0xae,0x85,0x53,0xa4,0xf1,0x98,0x90,0x26,0x0b,0xf0,0xe4,0x57,},{0xce,0x97,0x29,0xa9,0x6c,0x3e,0xd2,0x89,0x43,0xb2,0x78,0x39,0xc7,0x33,0x82,0xec,0xd5,0x72,0x96,0x0c,0x1f,0x9e,0x90,0xc5,0xef,0xf9,0xdd,0x49,0x9f,0xf4,0x8f,0x17,0xd2,0x5e,0xdd,0x12,0x68,0xef,0xfe,0x41,0xee,0x6a,0x81,0xce,0x48,0xd8,0x4d,0xe5,0x13,0xdf,0x9c,0x41,0x44,0x26,0x21,0xb2,0xf5,0x49,0x1e,0x34,0x6b,0xe1,0x8c,0x04,},"\x08\x63\x35\xd6\x12\x75\xd1\x68\xea\xac\x05\x40\x47\x7f\x50\xd4\xb1\x5f\x9e\x50\xb9\xbe\x69\x39\x21\xed\x54\xa9\x94\x1b\xc4\x06\x43\xcd\xa6\x2e\x1d\x80\x5d\x02\x50\xa8\x11\x46\xbd\x5f\xe2\xd3\x9e\x81\x44\x4d\x21\xe2\xb2\x1b\x03\x1c\x11\x13\x06\xca\xcb\xf5\x27\x17\xf6\xfb\x4c\xd3\x41\x6f\x12\x15\xf8\xdd\xdc\xed\xd2\xf0\x09\x6b\x0f\xcf\xa0\xa6\xcc\x2c\xde\x7a\x2b\xab\x7f\x1e\x32\x79\x0b\x53\x61\xdf\x36\x71\x42\x4c\xc7\x22\xf2\x31\xbf\x71\x89\x5b\xcd\xcb\x7b\x22\xee\x07\x4e\x8f\xb4\xa9\x67\x85\x04\xe7\x35\x36\x6c\x17\x2f\x07\x63\x7b\x7a\x93\x14\x9b\xb2\x1f\x38\x88\x33\x78\xa1\xdb\x27\x3f\xc2\x32\x39\xe3\x53\x37\xf9\xce\x56\x6d\x8d\xdf\x3b\x31\x33\xca\xd7\xf2\xce\x81\xed\xb5\x03\xce\x1d\x27\xc5\xa6\x57\x16\x0b\x78\xdc\xa9\xae\xae\xa3\x79\xbe\x9c\x85"}, +{{0xee,0x89,0x85,0xdc,0x27,0x50,0x44,0x40,0xa8,0x75,0x8d,0x4c,0x53,0xe4,0x22,0x52,0x15,0x79,0x7a,0x00,0xcd,0x86,0x31,0xd5,0x9b,0xd9,0x3b,0xc6,0x6f,0x37,0x3d,0x5e,},{0xcd,0x64,0x7b,0xb0,0x65,0x69,0x3d,0x48,0x65,0x89,0x15,0x6a,0x9f,0xa2,0x61,0x43,0x75,0x34,0xdc,0x86,0xf4,0x6f,0x72,0xd0,0xa8,0x00,0x39,0x9a,0x7a,0xf0,0x10,0xf7,},{0x5b,0xd6,0x0a,0xd5,0xe9,0xba,0xd9,0x93,0x2c,0xa9,0xc7,0x5f,0x23,0x1a,0x76,0x88,0x9a,0xe7,0xa8,0xb8,0x64,0xb9,0x1d,0x1f,0xcb,0xa5,0xc5,0xd4,0xbf,0xa1,0xd9,0x28,0x38,0xad,0xb9,0x74,0x84,0x2a,0x07,0x10,0x77,0x9b,0x3e,0x30,0x94,0x04,0x49,0x09,0xe9,0x2c,0x7c,0xf0,0x46,0xce,0x51,0x9f,0x4c,0x68,0xe8,0xf1,0x9e,0xc0,0x3c,0x02,},"\xf2\x22\x04\x85\xad\xdf\xeb\xce\x02\xa8\x33\xac\xa3\x33\x81\xd1\xdf\x91\x7e\xd6\x09\x95\x0e\xd2\x4f\x85\xe3\xb0\x2b\x2b\x99\x4b\x4d\x93\x97\x84\xe3\x32\xf4\x10\x64\xc8\xb4\xa2\x63\x0a\xb3\x69\x61\x74\x2a\xa1\xcf\xfd\xcb\x08\xc1\x44\xee\xae\xde\xaf\xd4\x8b\x5d\xbe\x96\xbf\x24\x35\x0e\x14\xfd\x68\x28\x6b\xc0\x8e\xea\xef\x8b\xc6\xad\x9e\x19\x5d\x14\x84\xaf\xcd\x30\xaf\xa8\xce\xd4\x84\x81\x26\xd5\x6c\x81\xb4\x3c\x27\xa5\xdb\xbd\xec\x1a\x50\xc1\x10\x62\xce\x21\xc6\x1d\x86\x0c\x25\xa8\x62\xfb\xb7\x5c\x3b\xd5\x1c\x8d\xc0\x76\x36\x66\x86\x69\xbb\xf7\x51\xea\xca\xcc\xb3\xb5\x1d\x2c\x0d\x41\x40\x31\x6c\xfc\xe2\xeb\x18\xd2\x90\x8c\xec\xd5\xa1\x88\x67\x9b\xc5\xf5\xde\x29\x0f\x54\x8e\x7e\xbc\x57\xd4\x1b\x58\x9a\x24\xce\x88\xee\x48\xd9\x7e\x8d\x0c\x7c\x76\x99\x60"}, +{{0x80,0xdf,0xe2,0xbf,0x73,0x87,0xba,0xd4,0x65,0x4e,0xb0,0x76,0xf8,0xda,0xe9,0x59,0x51,0x63,0xe4,0x01,0x27,0xf5,0xdf,0x49,0x2d,0xad,0x7d,0xf0,0x4c,0x72,0x21,0xc4,},{0xd1,0x78,0x3c,0xee,0xb9,0xcf,0x8e,0x4d,0x07,0x76,0x4c,0x47,0x3f,0xa4,0x06,0x1b,0x82,0x74,0x39,0x71,0x03,0xf2,0x07,0x6d,0x70,0x32,0x49,0xd7,0x58,0xb8,0xfb,0xd5,},{0x27,0x27,0x9e,0x3c,0xdc,0xb0,0x3e,0xf5,0x57,0xa5,0xde,0xfc,0x2f,0x6c,0x58,0x12,0x8a,0x6d,0xc3,0xf8,0xb0,0x38,0x59,0x58,0x01,0x4e,0x70,0x9c,0x1f,0x61,0xb0,0xae,0x6b,0x40,0x35,0x76,0xf0,0xe4,0x54,0xd5,0xe4,0xc6,0x4c,0x17,0x31,0x38,0xee,0x4b,0xbd,0x5f,0xe7,0xb6,0x0d,0x06,0xc5,0xab,0xe2,0x3f,0xe9,0x9e,0xe3,0xb4,0x6a,0x00,},"\xaa\x09\xd7\x84\xbb\x09\xdc\x99\x99\x31\xeb\xb4\xc0\x0e\x42\x4c\xef\xec\xa1\x04\x81\x8d\x8e\xaf\x06\x61\xf0\x97\x28\xad\x02\x5e\xf4\x73\x93\x21\x05\x71\xf1\x74\x04\xe9\xaa\x6d\x8c\xbd\x5f\xd8\x8c\xd7\xdf\xb8\xe2\xe8\xa1\x08\xc0\x5d\xe2\x06\xf3\x40\x82\x34\xa3\xb4\x63\xdb\xe7\x1a\x07\xd0\x55\x87\x32\x45\x24\xb7\x32\x6e\xe7\x9d\x33\x48\xdd\xbe\xd7\x87\x1b\x86\xfc\xb4\x88\x03\x1d\xc9\xea\x93\xf6\xb8\xd7\xfd\xa6\x23\x93\x48\xa5\x62\x44\x4f\xaf\x1e\x72\xd3\x1a\xf3\x54\x43\xe9\xdf\x53\xe7\x62\xf3\xe5\x6b\x48\x66\x8f\x97\x84\xb3\x36\x8a\xb2\x78\xa4\x8e\xf4\x54\x6a\x26\xcf\xad\x0d\x0a\x51\x61\x69\x8f\x26\xee\x8d\x34\xfc\x2b\x3d\x6d\xfb\x93\xb0\x09\xac\x29\x6f\x6a\xfe\x48\x7e\xe3\x35\xea\xc9\xf0\x2c\xfc\xae\x5f\xcb\xd1\xa1\x6b\xa4\xe7\x1b\xe1\xb1\x12\x56\x2f\xc2"}, +{{0xda,0x1f,0x86,0x85,0x42,0xcd,0x7c,0xce,0x7a,0x5c,0xa3,0xfa,0x3c,0x24,0x08,0x1b,0x4d,0x23,0x44,0xb2,0x1a,0x15,0x7f,0x02,0x64,0xa3,0x47,0x13,0x2d,0x19,0x65,0x9d,},{0xcb,0x3a,0x25,0xa5,0x3f,0x27,0x2e,0xa8,0x13,0x80,0x44,0x68,0xd6,0x50,0x0e,0x96,0xa1,0xea,0xf8,0x22,0x70,0x5b,0x77,0x90,0xa8,0xac,0x3e,0x98,0xcc,0x4e,0x52,0x4b,},{0x75,0xc5,0x17,0xad,0xe4,0xf0,0x8d,0x77,0x46,0x30,0x57,0x43,0xd1,0xa7,0x76,0xc3,0xc5,0x5e,0xb5,0xee,0xdf,0xdf,0xcb,0x5e,0xb1,0xd5,0x63,0x4a,0x1b,0xda,0xf7,0xa4,0xb8,0xd2,0x41,0x87,0xd6,0xc8,0x85,0x0e,0x3c,0xed,0x65,0x67,0xa0,0x3c,0x4c,0x59,0x38,0x9a,0x4c,0xf4,0x71,0x14,0xce,0x54,0x73,0x16,0x0f,0x23,0x05,0x46,0xe6,0x0d,},"\xc6\x98\x7e\xf3\x80\xd5\xd0\xe7\x41\x96\x44\x3a\xaa\x3a\x32\x35\x6c\xbc\x02\x63\x6c\x5a\x4b\x6d\x62\xa8\x11\x4b\x21\x11\xbc\x1a\xbd\xdd\x9e\x44\xb3\x67\x2c\x18\xb5\x8d\x4e\xf5\x91\xaf\x45\x62\xe0\x20\x04\x9f\x8e\x12\x74\x68\x8e\x1f\x8e\x52\x96\xd2\xf9\x25\x2e\x7f\xc8\x4c\xd1\xd0\xc5\x8e\x98\xf0\xf1\x60\x53\x0a\xa2\x2c\x87\x1e\xef\x65\x2e\x71\x97\x4c\xe9\x1b\x4a\x65\xfc\x25\xfd\x09\xfa\x1b\x6c\x32\x08\x6e\x98\xec\x70\x8d\x9a\xbc\xb1\xd9\xcc\x8e\x1a\x08\x9e\xd8\xdb\x22\x06\xee\x95\x70\x23\x6a\xd6\x9b\x3d\xe6\x82\x18\x62\xfd\x2c\x70\xcd\x83\xa3\x2a\x68\xb0\x48\x62\x29\x55\x3d\x92\x8d\xe4\x8d\x03\xa1\x04\xe8\x73\x81\x96\x4a\xbe\xa7\x66\x83\x97\x6d\x52\x7c\x84\x16\x3a\x12\xee\xe0\xa5\x59\x86\xcf\x14\x31\xe9\xc8\x6c\xba\x81\x82\xca\x94\x68\x9b\xac\xd1\x65\xfb\xce"}, +{{0xf1,0x3d,0xae,0xc0,0xef,0x33,0xdd,0xd1,0x33,0xc7,0xd2,0x44,0xd1,0x0f,0xd2,0x7d,0xdb,0x23,0x70,0x52,0x80,0xff,0x5f,0x18,0x15,0xf0,0xf6,0x56,0xd8,0x36,0xfe,0x84,},{0x2d,0xc7,0xf1,0x36,0x7d,0xe6,0x72,0xc5,0x1e,0x00,0x5c,0x74,0xf8,0x76,0xf9,0x82,0x59,0x39,0x96,0x87,0x3a,0xcb,0xa0,0x79,0x29,0x27,0x34,0xc2,0x09,0xc2,0xb1,0x11,},{0xdb,0x77,0x18,0x33,0xf7,0xfd,0xba,0xcd,0xab,0x2b,0x5c,0xc8,0x0e,0xed,0x50,0xaf,0xdf,0x13,0x78,0x3b,0x7f,0xe5,0xe9,0x03,0xd5,0xdb,0xb4,0xc2,0xe5,0x35,0x31,0x6a,0x6e,0xef,0x4c,0x34,0xf0,0x04,0xd2,0xb9,0xa4,0xe2,0x70,0x0b,0xd6,0xe2,0xac,0xdd,0x56,0x4c,0x3c,0x80,0xcc,0x68,0xa3,0x03,0xf5,0xfb,0x09,0x1c,0xb4,0x34,0x0f,0x0a,},"\xec\x02\xff\x18\x04\xb2\xb3\x09\xaf\x31\x58\xb6\x62\x72\xa1\x4a\x3a\xad\x83\xc4\x1a\x71\x98\x46\xf7\x08\x8c\xa9\x79\x2a\xf5\x75\xc7\x89\x13\xc4\x32\x75\x9f\x0b\x9a\x74\x8b\xdc\x55\x68\x49\x6e\x41\x65\x8c\xc1\xcd\xb8\xda\x6c\x91\xd0\x7c\x3e\xc2\xf4\xaf\x50\x42\x49\xb9\x96\xaa\x00\xc0\x07\x1c\xdf\xa7\x93\xf8\x2d\x0e\xc5\xd2\x67\x26\x2f\x51\x8f\xc0\x29\xb8\x8e\x20\xb6\x20\x1f\xb9\xe0\x5a\xbd\x3f\x95\x24\xc5\xda\x2f\xa8\x97\x8f\xf2\xef\xd4\x81\x20\xcf\x00\x82\x2d\x1b\xee\x90\xdf\x81\x61\x25\xd8\xed\xc0\xcf\xb5\xde\x66\xd1\x6b\xe6\x38\x96\xa4\x12\xa6\x2b\x03\x1b\x71\x18\xac\x13\xfe\x2c\x9f\xaa\x6b\x1a\x33\x42\xf9\xcc\xf7\x88\x41\x66\xcf\x48\x9a\x84\xde\x26\xb5\xce\x5b\x21\x85\x6a\x3a\xf2\x89\xbc\x66\x22\xc0\xaa\xb9\xf2\x14\x2d\x39\x3f\x5d\x4b\x23\x67\x79\xdb\xb0\x66"}, +{{0x42,0xdc,0x16,0xc5,0x7f,0xb6,0xf1,0x28,0x94,0x5f,0xa1,0x01,0xe0,0x5b,0xbf,0x54,0x8e,0xf7,0xd9,0x77,0x26,0xb6,0x92,0xfe,0x40,0x40,0x69,0xcc,0x57,0xcc,0xef,0xa0,},{0x0a,0x1b,0xa5,0xdf,0x52,0x39,0x96,0xf9,0x54,0xb3,0x4d,0xdc,0xfa,0xba,0xd3,0xf3,0xde,0xe2,0x1a,0x5f,0xa7,0xa4,0xce,0x32,0x2d,0x21,0x6b,0xd8,0xcc,0xaf,0x43,0x8c,},{0xc7,0x59,0x77,0xe8,0x3b,0xcf,0xe9,0xdf,0x72,0x92,0xa8,0x60,0xed,0x97,0x25,0x55,0xb5,0xc2,0x44,0x16,0xfd,0x4b,0x7e,0xe3,0x28,0x53,0x88,0xfa,0x5b,0x14,0x47,0x60,0x8e,0x4a,0x34,0x78,0x13,0xcf,0xe0,0x93,0x51,0x2a,0x76,0x51,0xe4,0x22,0xe9,0x86,0x7d,0xb7,0xb9,0x7c,0x0b,0x08,0x67,0xf0,0xb8,0xc7,0xb7,0xf4,0xf0,0x2c,0x31,0x0d,},"\xf2\x71\x4c\x23\xa3\xa6\xfc\x11\xad\x15\xc9\x80\xb7\x35\x0f\xc8\x42\x17\x87\x76\x61\x18\x80\x55\xff\x75\x0d\x82\xc4\x9c\x5f\xef\x7b\xc8\xe6\xaa\xc5\x74\xa1\xb7\x9a\x3f\x26\xd1\x69\x69\xc0\xf4\x06\xee\xab\x3e\x9e\x12\x85\x0a\x55\x70\x97\x45\xe3\x0d\xff\xa6\x2a\x69\xdf\xb2\xb6\x4b\x3c\x1b\xd2\xbc\x35\x86\xe2\x6d\x4e\xea\x71\x4d\x2a\x7b\x71\xcf\x79\xfb\x8f\xfb\xf2\xaa\xad\x00\xca\x3e\x4f\x2b\x6f\x50\x3c\xc1\xfe\xf2\xea\xb3\x65\x6f\xb4\x4f\x8d\x62\xa8\xdb\x8a\xb5\x8f\x39\x46\x93\x94\x9e\xea\x57\xfa\xfe\xcf\x00\x5f\x6e\xbf\x12\x87\xdb\xa4\xd2\xd6\x23\xc0\x2e\xa1\x71\xf5\x67\xe5\x26\xad\xd2\x07\x09\xeb\xca\xb9\x62\xf8\x3d\x98\xef\x66\x8e\xbd\x01\xef\x20\x48\x8b\x36\x65\xe3\xa4\x46\xfb\xfb\x13\xd3\x40\x50\x94\x2c\x74\x9b\xb2\xdf\xfc\x76\x63\x67\xfd\x45\x2e\x68\xe5\xb0\xc6"}, +{{0x90,0xb4,0x55,0xc6,0xbb,0x9c,0xec,0x83,0xe1,0x37,0x35,0x70,0x65,0x33,0x9d,0x03,0x05,0x25,0xd0,0xea,0x7f,0x5b,0x92,0x3a,0x2d,0x59,0x72,0xc3,0xc1,0x2a,0xa3,0x7b,},{0x5c,0xef,0x03,0x8c,0x16,0xbf,0xa4,0xb4,0xc9,0x23,0xa0,0xfe,0x70,0xcd,0x7f,0x25,0xc8,0xbc,0x83,0x7f,0xdf,0x5a,0x7e,0xfb,0x9d,0x95,0xf2,0x1b,0x96,0xbe,0x92,0x5a,},{0xc9,0x34,0x5e,0xec,0x2c,0x4a,0x0a,0xec,0x73,0x23,0x86,0x49,0x4a,0x69,0xa3,0xfc,0xe8,0xb8,0xa1,0xbe,0x36,0x6b,0xbe,0xd1,0x65,0x9f,0x13,0x1f,0xe9,0x7c,0xc0,0x37,0xfb,0x1b,0x7c,0x1b,0x68,0xb0,0xf3,0x02,0x39,0x45,0xd2,0x00,0x90,0xa0,0xcd,0x2c,0x15,0x53,0xa4,0x7f,0xae,0xc4,0xd6,0x6f,0xd8,0x16,0xce,0x12,0x11,0x68,0xf3,0x09,},"\xc6\x2c\xfd\xb9\xd2\x1e\xee\x6b\xe4\x7f\x30\x72\x7a\xae\xe5\x1f\x07\x03\x78\x9a\x43\x1d\x32\x22\x85\x33\x35\x02\x17\xa9\x3a\x18\x90\x06\x69\xc9\x59\x56\xf3\xf2\xae\x90\xdc\x74\x5a\x71\xe1\x83\x40\xd0\x58\xd1\x6b\x4c\x6f\xe3\x3b\x64\xaf\x8d\xad\x97\x3f\xe5\xdc\x02\xe8\x52\x07\x05\xc7\xa8\xbb\x3c\xcb\xe1\x83\x8c\x6c\x24\x93\x37\xf9\xb6\xa4\xc0\xe1\xf8\xa4\xe5\xd1\x03\x19\x6f\xa7\x99\x98\x92\x3d\x04\x22\xe9\xd0\x79\xa7\x2c\xc2\xa8\xf8\x6d\x65\x90\x31\xa6\x07\xd4\xcc\xa0\xb9\x47\xb3\xab\xee\xee\xf6\x4c\x28\xda\x42\x0d\x05\xde\x66\x5a\x55\x10\xfe\x55\xf7\x75\x98\xec\xad\x7f\xaa\x0a\xc2\x84\x80\x0b\x53\x82\x93\x94\xc4\xae\x90\xbe\x66\x67\x8f\xf0\x4a\xb4\x6d\xa2\x65\xae\x06\x40\x2d\x8c\x83\xca\xd8\x4d\x61\xa0\x51\xde\x02\x60\x55\x98\x88\xe7\x79\xf7\x4b\x72\xa5\xd7\x1c\x13\x2f"}, +{{0xdc,0x18,0x5c,0x2b,0xa0,0xb3,0x78,0xdf,0xe5,0xdd,0xa5,0x10,0xc3,0x2f,0xef,0xf5,0x35,0xca,0x2e,0x8a,0x02,0x43,0x4b,0x32,0x6e,0x01,0x58,0xbc,0x87,0x8e,0x88,0x48,},{0x33,0xd6,0xcc,0x05,0xa4,0x34,0xe4,0x19,0x28,0x0d,0x58,0x64,0xa1,0xaf,0x20,0x9a,0x2c,0x67,0x68,0x14,0xb7,0x0f,0x72,0xf8,0x14,0x1a,0xc7,0xe0,0x57,0x3e,0xe6,0x3e,},{0xf1,0xe4,0x45,0x14,0xd2,0xec,0xbc,0xc8,0xd1,0xa7,0xe8,0x4b,0xf5,0x84,0xce,0x73,0x18,0x35,0xe9,0x89,0x4f,0x88,0x97,0x4f,0x09,0x8d,0x45,0x6b,0x60,0x71,0x8f,0x57,0x5e,0xf4,0xd8,0x06,0x2f,0x21,0x82,0x50,0x42,0x50,0xcf,0x83,0xbb,0x2a,0xf2,0xa7,0x9b,0x1f,0x58,0xa6,0xa9,0x7b,0xd9,0x8d,0xa4,0x67,0x13,0x2d,0x7b,0xec,0x2f,0x05,},"\xe2\x76\xb1\x19\x12\xcc\xa5\xa8\x4b\xba\x65\x0c\x17\x2a\xef\x3a\x4d\x5f\x91\xac\x72\x29\x13\xbb\x89\x1a\x3a\xb0\x42\x4a\xb0\x7e\xa7\x09\xcb\x8b\xba\x3a\x3d\x11\xf8\x2f\x51\xc2\xaf\x01\x62\xa8\x2f\x72\x19\xce\x27\xb3\x5a\x30\x50\x7d\x53\x6a\x93\x08\x17\xe4\x0f\x85\xa2\x2a\x5a\x43\x2b\x94\xd1\x92\xc3\xc8\x91\x17\x77\xcf\xdb\x7f\xe9\x37\xa6\x75\x02\x77\x0d\x6d\x75\x75\x3d\x3a\xe8\x82\x29\xe0\x8f\x1e\xd2\x3b\x43\x28\xd8\x62\xac\x61\x86\x3c\x06\x3e\xa9\x84\x8f\x8a\xb9\x6a\x02\x13\xd7\xb9\x36\xc4\x8f\xe7\x54\x83\x6c\x98\x48\x78\x59\xd1\x99\xb3\xd9\x40\x39\x27\x16\xa1\xd5\x69\xe6\xc0\xcb\x1b\xa9\x18\x93\x2c\xf8\x85\x25\xe2\x56\xc8\xab\xb1\x1a\xaf\x0b\x45\x46\x55\xd5\xdb\x55\x71\x3c\xeb\xba\x28\x7a\xe2\x02\x65\x1a\xc8\x72\xbf\xc8\x0f\xea\xa7\xe0\x0d\x47\xc0\xbe\x38\xe6\x58\xf7\xc5"}, +{{0x90,0x72,0x1c,0x43,0xbc,0x36,0x6f,0x24,0xbf,0x4e,0x8c,0x99,0x3e,0x13,0x80,0x24,0x68,0x2f,0x10,0x29,0xdb,0xa3,0x5a,0xbe,0xb0,0xd6,0x0c,0x7f,0xa7,0x10,0x02,0x1c,},{0x7c,0x63,0xa2,0xf1,0x3b,0x7b,0x22,0x0a,0x0b,0xb7,0x52,0xe3,0x80,0x07,0x53,0xb8,0xb6,0xb3,0x26,0x69,0x37,0x8c,0xe1,0x31,0xbb,0x77,0xa9,0xa8,0xd2,0x30,0xe9,0xae,},{0xd2,0x06,0x4a,0x6d,0x6c,0x99,0xc6,0xc3,0xf1,0x52,0xd2,0xd4,0x35,0xf2,0x4e,0x34,0xb5,0x45,0x9b,0x08,0x2e,0xf1,0x1e,0x94,0x4a,0x77,0xff,0x54,0xdd,0xf9,0x86,0x27,0x37,0xec,0xb2,0xac,0x8d,0x54,0x20,0x7d,0x36,0xc5,0x1a,0xd4,0x1f,0x36,0x49,0x0a,0x11,0x1b,0xa8,0x0e,0x12,0x6b,0xfe,0xcb,0x09,0xde,0xf6,0xac,0xcb,0xdf,0x88,0x0e,},"\x65\x1c\x96\x17\xca\xc9\x58\xc7\xed\xd4\xa5\xf3\xfe\xdf\xb8\x3d\xc9\x71\xab\xfb\xb6\x9a\x31\xe8\x98\xcc\xa8\x47\x2e\xf0\x68\x03\x4a\x6d\x23\x76\xee\x0e\x72\xd0\xa9\xbf\xee\x27\x57\x96\xc3\x79\x5a\xda\xc8\xeb\xe1\xd1\x2b\x66\xec\x26\x8f\x6b\x75\xfa\x39\x41\x15\x4f\x99\xe2\x23\xfa\xf2\xcb\xab\x5b\x92\xe2\xb3\xba\x7b\x79\xbe\x77\x00\xef\x9d\xba\x69\x25\x3c\xce\x53\x56\xb0\xc4\xe7\x47\x03\xcf\xca\xfd\xb5\x54\x68\x50\xb4\x62\x32\x67\x5c\x90\xc0\x2d\x5e\x42\x6d\x33\xd6\x0c\xeb\xf0\xc7\x93\x01\x82\x37\x9d\xbb\x00\x7f\x53\x61\x63\xc8\xdd\xbb\xd3\x15\x7b\xb2\xda\x62\x34\x01\x33\xf0\x0a\xe2\x68\x2e\xc6\xba\xa6\x41\x6b\x5a\x01\x52\x1c\xc1\x0e\x04\x69\x52\x95\xf2\xe5\xb9\x4c\x05\xf0\x03\x83\xff\xe9\x54\x83\x07\x97\xf6\xdf\x82\x31\x72\x53\x2f\x98\x16\x5f\xe3\x14\xab\x32\x59\x29\xaf\x83\x85"}, +{{0x9c,0xec,0x24,0x67,0x58,0xe4,0x12,0xe7,0x37,0x8b,0x45,0x79,0xea,0xfe,0x9f,0xac,0x5a,0x25,0xd5,0x40,0x5f,0x92,0x70,0xb5,0xd7,0xe5,0x43,0x41,0x4e,0xc3,0xd5,0xda,},{0x97,0x5a,0x9e,0x6a,0x15,0x2c,0xae,0xbb,0x2f,0x9d,0xd0,0xde,0xb7,0x6d,0xd9,0x22,0xb6,0xdc,0x77,0x05,0x5d,0xda,0x03,0xfb,0xae,0x9e,0x7c,0x68,0x5d,0x07,0x3a,0xa1,},{0x9b,0xad,0x1e,0x3b,0x12,0x79,0xef,0x65,0x8f,0x4d,0x07,0x16,0x44,0xc6,0x3a,0xe2,0xb7,0xa7,0x80,0x35,0x7e,0x9d,0xc4,0x26,0xf1,0x65,0x0e,0xc0,0x63,0x4d,0xfc,0x52,0x0f,0x8e,0xda,0x9d,0xc8,0xf1,0x0a,0xa7,0x32,0x4c,0x59,0x42,0xd2,0x34,0x7f,0xf8,0x80,0x2b,0xd9,0x0e,0x95,0xfc,0xec,0x31,0x33,0x52,0xcd,0xae,0x64,0xf3,0x2a,0x04,},"\x17\xec\x9b\xd4\x7a\xdd\x6c\xcf\xbd\x78\x7a\xf0\xd9\x01\x3e\x9c\xc9\x79\xaa\xf8\x50\xe0\x94\x26\xd3\xb2\x8e\xdf\xd7\x12\x96\xeb\x31\xff\x8b\x21\xc5\xfe\x7b\xe0\x50\xf5\x36\x32\x4c\x3e\xc4\x88\x50\xe0\xb5\x08\xa3\x6b\xb4\xcb\x7e\x75\x4b\x32\x71\x83\xa1\xb3\x94\xd8\x8a\x79\x41\xd1\xce\x8d\xac\x62\xa5\xd8\x29\x18\x74\xd7\x84\x85\xe5\x1f\x29\xed\x05\x86\x5a\x20\x6e\x52\xec\xb1\x2c\x5d\x10\x7d\x4f\xf9\x6f\x25\xd3\xc5\xd1\x81\xd2\xc4\xba\x64\x63\x60\x0d\xb1\xcc\xa3\x28\x57\xfc\xf5\x97\xcb\xdf\xb2\xfd\xa2\x70\x8a\x8a\xba\x28\x1b\x43\xc3\xd2\x8c\x4a\x4e\x79\x83\x36\x15\x09\xf6\x1a\x10\x74\xe6\xf0\xad\x61\x01\xc7\xb5\x67\xee\x40\x78\xe9\x83\x9c\x47\xf4\x65\x31\xb7\x29\xff\x0e\xfe\xef\x7c\x9d\x1a\x8d\x83\x3d\x9c\x0f\x42\x81\x2a\x34\x18\x7c\x3a\x77\x8c\x16\x5c\x09\xd6\x45\x9c\x9c\x7c\xea\xa2"}, +{{0xd1,0x40,0x3f,0x63,0x20,0x2e,0x08,0x05,0x25,0x84,0x3b,0xde,0x25,0x5e,0xeb,0x6b,0x67,0x83,0xc1,0xca,0xae,0x9d,0x6e,0xd0,0x0b,0xa6,0x08,0x05,0xbe,0xd1,0x94,0x1f,},{0x23,0x8a,0xea,0x3a,0xd6,0xd6,0xf2,0x77,0x83,0xe7,0x05,0x16,0xbb,0xfc,0xca,0x47,0x70,0x36,0x6b,0x50,0xed,0x0f,0xe6,0xa4,0xe9,0x66,0xb5,0x3a,0xf1,0x21,0xa7,0x21,},{0x8e,0x60,0xe7,0x3c,0x06,0x38,0x16,0x79,0x5e,0x29,0xf5,0xd6,0x4e,0xce,0x11,0x59,0xf1,0xb5,0xd5,0x02,0x1a,0x6f,0x8f,0x65,0x5e,0x26,0x1a,0x4d,0x00,0x26,0xf5,0xb9,0x4f,0xf2,0x92,0x32,0x50,0x49,0x9d,0x99,0x52,0x98,0x48,0x05,0x12,0xe4,0x12,0x62,0x76,0xaa,0x4a,0x22,0x6d,0x01,0x5a,0x95,0x82,0x7b,0x3c,0xe6,0x92,0xe2,0x33,0x02,},"\xc4\xf1\x7d\x44\x2f\xba\x4c\xa0\xdf\x8d\xc1\xd0\x62\x8d\x7d\x7f\x36\xb6\x0b\x57\x58\xd7\xc1\x3b\x80\xb8\xf9\x7a\x62\x12\x4d\x96\xa2\x3b\x27\x95\x65\x49\x5a\x8a\xcc\xab\x59\x97\x11\x5b\x13\xa4\xba\x22\x0a\x73\x95\x7e\xb7\x93\x05\x20\xac\xbb\xfb\x6f\x54\xcf\x68\x72\x6b\x64\x50\xc6\xff\xa9\x47\x0b\x05\x5e\xa2\x62\x91\x4e\x2b\xc6\x12\x63\x3f\x1a\xc3\xd0\x61\x8a\x23\xdf\xf1\x88\xa7\x33\xd7\x6b\xcb\xcc\x46\x0f\x52\xab\x61\xe1\x99\x38\xf9\xc8\xca\xaa\x79\x2c\x20\x8d\x1f\x6c\x75\x47\x28\x90\x5f\xda\x51\xd8\x81\xa3\x47\xa5\x3d\xa7\x44\xd3\xba\xad\xc0\xa7\x6c\x47\x4c\x55\x86\x80\x26\x90\x95\xf9\x08\x4a\x74\x47\x1d\x5c\x09\xff\xc2\x91\x41\xb5\xbf\xaf\x49\x54\xdf\xac\xbc\xa6\x63\xd0\x37\xb1\x7e\xbf\x95\x59\x88\x22\x33\xe5\xca\x5a\x8b\xf7\x5c\xca\x4f\xc9\xc5\xa4\x10\x9f\x32\xe1\x45\xf3\x85\x3b\x17"}, +{{0xbd,0xf6,0xbd,0xc3,0x1a,0xb0,0xb5,0x31,0x37,0x84,0x48,0x3a,0xbe,0xca,0x6e,0xa5,0xe9,0xcd,0xc6,0x8f,0x81,0xb2,0x1f,0x35,0x0d,0x09,0xc3,0x90,0x7b,0xb9,0xb6,0xa1,},{0x03,0x62,0x77,0x12,0xb7,0x55,0xe5,0x06,0x9f,0xb9,0xab,0x8f,0x9e,0x89,0x97,0x24,0x02,0x9a,0x7f,0x26,0x8a,0xf9,0x39,0x88,0x21,0xee,0xec,0x93,0x60,0xc9,0x28,0x5b,},{0x38,0xfa,0xc6,0x03,0xed,0x24,0x6f,0x83,0x3f,0x1c,0x0f,0xd4,0x58,0x56,0x98,0xb0,0xa7,0x13,0x05,0xef,0xf0,0xd1,0x4a,0x00,0x49,0xb3,0xce,0xf0,0x73,0xbd,0x03,0x6d,0xd4,0x51,0xb3,0xda,0xba,0xda,0xae,0xae,0xa2,0xae,0xaf,0x83,0xd3,0x95,0x74,0x6f,0x4e,0x86,0x86,0x6a,0xda,0x97,0x1c,0xbe,0x48,0x2e,0xdb,0x04,0x19,0x33,0x2f,0x0e,},"\x90\xa6\x6a\xaf\xa5\x64\x2a\x98\xe7\x9f\x0d\x88\x14\x70\x80\x16\x7b\x11\xe4\x46\x65\x18\xf1\x95\xcd\xdd\x89\x40\xd1\x2e\xe4\x91\x8d\x31\xa6\xd4\xcb\x77\xd0\xbf\x5a\xf2\x99\x83\xbb\xe5\x08\x56\x10\xa7\x9d\xaf\x0c\x75\xa7\x8c\xcb\xcf\xfb\xbd\xab\x21\x89\xc3\x94\xae\x24\xe2\x65\xbd\x8c\x55\xfd\x3f\x40\x98\xe1\xb1\x75\x57\x75\x49\x51\x8e\x7a\x4d\xcf\x74\x52\x08\x6d\xd1\x27\x8d\xd5\x8e\xa4\xc0\xaa\x69\x0e\x91\x79\x51\xef\x39\xfc\xff\x60\xcb\xfa\x1e\x90\x91\x0b\xab\x53\x74\x92\x8d\x47\x22\xf7\x02\xbf\x5a\xd6\x02\x8f\xfd\xa6\x54\x1f\xa5\xba\x1a\x37\x79\xec\x78\xb0\xa9\x5f\xe3\x85\x0c\x74\x8b\x6c\x8f\x42\xf3\x30\xec\x79\x54\x1a\x52\xa1\xcf\x57\xdb\x72\xdf\x4f\x92\xce\x7f\x74\x8a\xee\xf1\xaf\x33\xbc\x5a\xe0\xa8\x2c\x89\xdf\xf2\x16\xf2\x3a\xec\x16\x8a\x7d\xbb\x51\x0a\xa6\x32\xda\xab\xcc\x97\x1b\x3f"}, +{{0x57,0xb3,0xb1,0x4a,0xce,0x1c,0xd0,0xcd,0x60,0x3e,0x63,0x28,0xbd,0x21,0x9e,0xe7,0xd9,0xd0,0x94,0x48,0x7f,0xa6,0x68,0xf2,0x8a,0xee,0xc0,0x2b,0x43,0xc9,0x09,0xa7,},{0x24,0xe6,0xb6,0x39,0x5f,0x97,0xea,0x0e,0x23,0x71,0x86,0xd4,0x69,0xb7,0x19,0x23,0xd2,0x11,0x3a,0xdf,0x40,0x3b,0xee,0xeb,0x4a,0x2d,0x27,0x90,0x9a,0xaf,0x3e,0xda,},{0xfc,0x79,0xfd,0xc6,0xd0,0x90,0x88,0x7a,0x61,0xe4,0x3c,0x6b,0x91,0x87,0xb6,0x57,0xd2,0xe4,0xd9,0xcb,0xaf,0xd6,0xe7,0xca,0xeb,0x7e,0xbd,0xea,0x84,0x28,0x25,0xb7,0x8f,0xb9,0x49,0xd2,0xc4,0x9a,0x0c,0xf3,0x8b,0x6c,0x73,0x29,0x6d,0x82,0xc8,0xdd,0xeb,0x1f,0xe2,0xd4,0x0a,0xad,0xdd,0x79,0x64,0xda,0x68,0xac,0xf8,0xc6,0x6f,0x0e,},"\xb2\xe0\xde\xdd\x80\x2e\xed\x99\x6d\xbd\x58\x36\xbf\x86\x88\xb0\xd1\x20\x1b\xf5\x44\x2f\xf9\xbb\xd3\x51\xae\xef\xe1\xa0\xc2\x1f\xea\x2b\x5c\x9f\xe5\xed\xee\x47\xe9\x21\x09\x9b\x05\xae\xda\xa8\x03\x67\xc1\xce\x08\x82\x1d\x78\x3a\x5b\x64\xcf\x05\x9c\x0f\x43\x35\x08\x39\x86\xa5\xa6\xec\xff\x8c\x84\xfd\x40\xe0\xba\x5d\xd5\xe5\xd2\xf0\x11\x12\xa8\x4c\xe5\xcf\x8e\x0d\xb7\x8b\xeb\x18\x2d\x91\x39\xc0\xb0\xf3\xe0\x06\x0a\x3f\xa7\x38\x69\xe9\x64\x23\xf1\x70\xdf\x9a\xf1\xcb\x9c\x35\x56\x6d\x87\xdf\xf5\x42\x22\x3f\x6d\x43\x9b\xdb\x54\x72\x9d\x36\x6a\xff\x63\x7b\x0f\x36\xa5\xd1\x4b\x15\xd6\x12\xbd\x03\x07\x6c\xc4\xd0\x4c\x1f\x25\xb3\xba\x84\xe0\xd1\xfe\x47\x4e\x57\x18\xd1\xa1\x7d\x5a\x48\x84\x65\x66\x2e\xe4\xc3\xf6\x64\xb4\xc9\x27\x4b\x64\x9d\x78\xce\xa4\xe8\x52\x43\xf3\x71\x32\x39\x04\x8a\x90\x8c\xe3\xe1"}, +{{0x01,0x8a,0x2c,0x3d,0xee,0xa5,0x0a,0xb5,0x06,0x75,0x1f,0x9c,0x2a,0xda,0xad,0xfd,0x9e,0x21,0x92,0x12,0x16,0x09,0x93,0x16,0x84,0xeb,0x26,0x5e,0x19,0x3e,0x7f,0x89,},{0xaf,0x41,0x0b,0xdd,0xde,0xfc,0x64,0x4e,0xf1,0x2c,0x98,0x99,0xff,0x71,0xb9,0xe1,0xd0,0xdf,0xa3,0xd6,0x9d,0x8c,0x2c,0xd6,0x76,0xc1,0x91,0x6b,0x34,0x59,0x1c,0xfd,},{0x7a,0x44,0xe6,0xa3,0x19,0x32,0xde,0xe6,0xdc,0x2d,0x83,0x94,0xe2,0x9a,0x65,0x51,0xd1,0x3e,0x6c,0x6f,0xfd,0xfa,0x21,0x8f,0xa5,0xb9,0x98,0x66,0x8d,0x84,0x39,0xdb,0x5e,0x05,0x37,0x9f,0xbf,0xa0,0xda,0x5b,0x56,0x3e,0xd9,0x66,0x43,0x5a,0xe2,0xc5,0x4e,0x3a,0xd1,0x6e,0x1a,0x9f,0xca,0x1f,0x5a,0x15,0x7a,0x08,0x07,0x04,0xab,0x03,},"\xcf\x78\x13\xef\xac\x12\xad\x1c\x7c\x73\x22\xcc\xbe\x54\xaa\x0e\x9a\x8b\xa4\xfd\x43\x45\xb0\x6e\x4c\xe7\xa3\x5c\x8b\x1c\xd5\xe3\xf7\xf0\x68\x85\x33\x84\x9b\xa2\xcf\x4c\x75\xb6\xf2\x09\x26\xa1\x19\x4a\x72\xdf\x0e\x1b\x1b\x34\x45\x6a\x21\x33\x11\x2d\x00\x67\x22\xfe\x81\x1d\x5e\x40\xc4\x12\x11\x59\xde\xd8\x89\x90\xc0\xac\x2b\xfd\x34\xf3\x5a\xf4\xf0\x7c\xc4\x02\xe9\xa3\x81\xa6\x75\xd0\x3f\xec\x7e\xc4\x38\xc4\xad\x9d\x92\x9a\xec\x8f\x24\x2d\xef\x02\x3c\x99\x3c\x9e\x8b\xa1\x8c\x74\x28\xe8\x8f\xde\x68\xa4\x71\x1e\x50\x6d\x79\x69\xf6\x3c\x8e\x0b\xc8\x3f\xf0\xde\x4e\x13\x36\x10\x6c\x05\xe0\x9d\x59\x22\x40\x0e\x8a\x81\xbf\x54\x88\x56\x67\x89\x97\x85\x88\x2b\x70\xf2\x0d\xd8\xfb\x1e\x75\xf5\x85\x5b\x76\x5a\x25\x6d\xa4\x34\x1b\xf2\x3e\xa0\xff\xa1\x8a\xad\xda\x38\x18\x16\x94\x60\x01\x04\x56\x69\xc8\xd0\x4d\xf0"}, +{{0xbe,0xa4,0x45,0xe9,0xb6,0xd3,0xf2,0x12,0x35,0x91,0x2c,0xd6,0xc4,0x2e,0xc0,0x57,0x72,0x97,0xca,0x20,0xa1,0x03,0x57,0x88,0x0c,0x2b,0x84,0x6d,0xd8,0xe2,0xcc,0x77,},{0x02,0x41,0x74,0x96,0x62,0x21,0x69,0x9e,0xa4,0xb0,0xa3,0x7e,0x51,0x7f,0xf9,0xb1,0x65,0x98,0xae,0x4d,0x4e,0x83,0xbf,0xa3,0xca,0x50,0xbc,0x61,0x68,0x41,0xf5,0x95,},{0x69,0x64,0xb9,0xc5,0x90,0x3e,0x74,0xe9,0x93,0x28,0xac,0xef,0x03,0x65,0x58,0xee,0xcd,0x33,0x69,0x15,0x0a,0x52,0xe2,0xcb,0xad,0x4b,0xbb,0x97,0xd4,0x61,0xb3,0xdf,0xc6,0xb3,0xe8,0x45,0x58,0x13,0xa4,0xf4,0xbd,0xca,0x46,0x30,0x2e,0x02,0xe6,0x83,0xec,0xea,0x18,0x20,0x17,0x1c,0x53,0x8e,0x54,0xc3,0xde,0x6c,0x95,0x4a,0xa4,0x07,},"\x47\x43\xc7\xc0\x99\xab\x81\x59\x27\xb3\x67\x4d\x00\x54\xb6\xde\x59\xaf\x28\x11\xab\xc2\xcf\x7f\xde\x08\xf6\x29\x29\x18\x5a\xdc\x23\x8f\xad\xd5\xe7\x5a\xe3\xba\x00\x36\xff\x56\x5a\x79\x40\x5b\x42\x4f\x65\x52\x33\x1e\x27\x89\xd9\x70\x9a\xc1\xec\xbd\x83\x9a\xa1\xe9\x1c\x85\x48\x17\x59\x79\x58\xcc\x4b\xd9\x1d\x07\x37\x75\x07\xc2\xc8\xd3\xc0\x06\xcf\xeb\x6c\x0a\x6c\x5a\x50\xee\xe1\x15\xe2\x11\x53\xdd\x19\x8e\xa0\xa3\xaf\xf6\x2b\x70\x75\xd5\xa4\x61\x78\x87\x83\xf0\x50\xe6\x59\xc5\x72\x96\x3d\x7a\x59\xe5\xaf\xaa\x2b\x9c\x50\x1f\x43\xc6\xac\x08\xab\x47\x97\xc4\x56\x6d\x22\xb9\x3c\xdf\x65\xa9\x9a\x2a\x1d\x63\x8e\x79\xf7\x2b\x5f\x46\x31\xfe\x5e\x9e\x5f\x96\x8f\x6d\xb7\xa1\x88\x0d\xf5\x1d\x8f\xeb\xc1\x49\x42\x67\x2f\x8e\xa6\xfc\x3a\x72\x81\x4a\x44\xd6\x6d\x14\x84\x20\xa6\x90\x00\xf6\x8c\x33\x0d\xe5\xb8\x0f\xc6"}, +{{0x64,0x47,0x54,0x0e,0xd7,0xbe,0x0a,0x11,0xc2,0xa8,0xde,0x79,0x3d,0x83,0xc6,0xe2,0x44,0x98,0x3d,0xb1,0x8d,0x78,0xec,0x9d,0x75,0xf1,0x72,0x9c,0x92,0xe0,0xfd,0xf1,},{0x39,0x12,0x12,0xc8,0xed,0xc4,0xd3,0x34,0xa5,0xbe,0xc8,0x60,0xef,0x0f,0x5e,0xbb,0x5e,0xc4,0x4e,0x8b,0xb5,0x1c,0x0f,0x67,0x41,0x99,0x89,0x59,0xb2,0xb3,0x79,0xfc,},{0x3a,0xb5,0xf8,0x8e,0x2f,0x72,0x76,0xb5,0xb6,0x58,0x3d,0xff,0xba,0x56,0x39,0x99,0x3a,0x90,0x5d,0xbf,0x9b,0x88,0xce,0xea,0xaa,0xae,0x33,0x35,0x80,0x0e,0x4a,0x5f,0x10,0xf8,0x3d,0xa6,0xd6,0x22,0x5a,0x8d,0xbe,0x99,0xae,0x80,0x07,0x50,0x09,0xdd,0x50,0x87,0x86,0xb3,0x97,0x51,0x13,0xdb,0x47,0x8e,0x14,0xba,0x10,0x1b,0xee,0x0f,},"\xa4\x38\x1c\x76\x38\xc4\x87\x99\xe9\xb5\xc4\x3f\x67\xfc\x3a\xa3\xcb\xb5\xec\x42\x34\xf3\x7e\x70\xcc\xcc\xce\xd1\x62\x7a\x57\x68\x3d\x1e\x53\xf4\xe0\x88\x3d\x8b\x46\x2b\xf8\x3f\x13\x08\x63\x03\x68\xc8\x9b\x49\x15\x33\xdd\xb8\xc9\xa5\xb9\xe8\x15\x50\x02\xfd\xd5\x81\xa9\xa5\xbe\x0e\x43\x0b\x90\x86\xa6\xbe\xac\x47\x20\x21\x0f\x87\xb1\x4e\x86\x2d\x97\xe5\xcc\x69\x28\x67\x86\xa7\x58\x67\x23\xf2\x31\xef\x0e\x3e\x1b\x93\x2d\xbb\xa3\xa1\x8a\x0c\xb2\x21\xcb\x07\xf8\x0e\x6a\x8e\x13\x00\x05\x6c\x13\xe7\x02\xb2\x3b\xfb\x32\x50\xec\x7c\xc8\x64\xd5\xc7\xec\x57\x86\x24\x07\x09\xc5\x60\x24\xea\x6b\xe5\xf7\xb1\x5a\x4f\xa5\x55\x5e\x39\xa7\x44\xa1\xdc\x55\x7d\xf5\xb9\x48\xdb\x22\x0b\x3d\x57\x45\x74\x66\x91\xda\xcb\x44\x21\x64\x1c\xdc\xc1\x2e\x7e\xc0\x45\x02\x93\xf1\x9e\xc5\x7b\x09\xcf\xf1\x35\x84\x7a\xab\xe4\x46\xa6\x13\x32"}, +{{0x0c,0x58,0x7a,0x81,0x1a,0xdd,0x88,0xb9,0x94,0x45,0x8c,0x3c,0x80,0x8a,0xc4,0xe3,0xa8,0x3a,0xfa,0xb2,0x6d,0x4c,0xff,0x5c,0x96,0x1b,0x9d,0xf0,0xb5,0xc8,0x33,0x44,},{0x06,0x78,0x3b,0x0c,0xdc,0xc5,0x02,0x8c,0x56,0x38,0xbd,0x74,0x8f,0x0b,0xc7,0x6f,0x7e,0x94,0xd1,0xaa,0x20,0x15,0xca,0x94,0x87,0x38,0xa3,0x50,0x04,0x60,0xac,0xa0,},{0x33,0xb4,0xf4,0x27,0x4f,0x20,0x00,0x8a,0x72,0x1d,0x1e,0x8d,0x05,0x4a,0x2b,0x4e,0x95,0x32,0x7e,0x38,0xbb,0x07,0xb3,0x3c,0x4b,0xee,0x7e,0x1c,0xe0,0x20,0xa4,0x42,0xfb,0x26,0x27,0xed,0xa3,0xb7,0xac,0x93,0xcd,0x3a,0xb0,0xb1,0x2b,0x99,0x93,0x5a,0x1a,0x92,0x33,0x11,0x16,0x04,0xda,0x4a,0xcf,0xfb,0x53,0x15,0xb9,0x07,0x12,0x0b,},"\xf5\x6d\xc6\xb7\x60\x76\x32\x5b\x21\x26\xed\x11\xd1\xf0\x9d\xec\xef\x9d\x15\xc3\x1d\x0e\x90\xcd\xb1\xa2\x7e\x08\x9c\xc5\x63\x29\xf6\xec\x3f\x66\x5e\xb6\x73\x9e\xc5\x67\x8b\x3f\x37\xee\x1f\xb3\x7d\xeb\x9e\x24\x00\x92\xb7\xa8\x8f\xd2\x55\x25\xac\xd5\x5e\x29\x4e\xb1\x04\x6f\x9b\x1b\x69\xa8\x47\xeb\x9c\xeb\x7b\x15\x93\xb9\xf6\x97\x8e\xf6\x18\xc1\x5d\xe4\xe0\x59\xec\xc3\xbf\xda\x32\x97\xa1\x9c\x2d\xf2\x02\xad\xf7\x21\x55\xcf\x21\xea\xbd\x03\x94\x8d\xf1\x51\x98\xe8\xa6\x8b\x08\x84\xf9\x3a\xd5\xe3\x6e\xb0\x98\x3c\xca\x30\xe4\x5a\x8b\x4b\x5f\xb8\x13\x6f\xde\xa8\xa3\x34\x1d\xd7\x87\x75\x40\xa5\x57\xde\xbf\x75\x30\xcc\x33\xae\xee\xf6\x27\x1c\x3f\x0a\xf6\xd0\x97\x87\xe8\x15\xf2\xf1\xdd\x25\xce\x4d\x2f\xd0\x9f\xfa\x9f\x53\x08\x1b\x46\x9c\x50\x0d\xa4\xd4\x41\x80\xc0\x4e\xb1\x86\x93\x29\xcb\xf2\xd8\x23\x18\x7e\x83\x1c\x24"}, +{{0x66,0xcf,0x40,0x1a,0x21,0x42,0xfc,0xf4,0xa8,0x01,0x80,0x46,0xcf,0x41,0x40,0xbc,0xa1,0x8d,0x76,0xef,0x62,0x66,0xe7,0xa0,0x24,0x75,0x7d,0xf1,0x72,0xa5,0xd6,0x53,},{0x67,0xd4,0x8d,0xfd,0x23,0x74,0x3c,0xc2,0xca,0x40,0xe4,0xdf,0xd6,0xb8,0xcc,0x5d,0x84,0xbe,0x82,0xdd,0x2b,0x11,0x20,0xcc,0x47,0x6e,0x6a,0xf6,0xf2,0x5e,0xcc,0x98,},{0xd6,0xb0,0xe8,0x0e,0x60,0xbc,0x1b,0x29,0xab,0x8f,0x74,0x80,0x8f,0xc4,0x60,0x84,0x77,0x95,0xcc,0xb8,0x87,0xba,0xc0,0xec,0xaa,0x8e,0x13,0x52,0x97,0xa8,0x50,0x97,0x71,0x2b,0x24,0xb0,0xa1,0xfb,0xaf,0x7a,0x67,0xc5,0xd5,0x30,0xa4,0x7d,0x06,0x43,0xfc,0x87,0x02,0xc0,0x59,0xd2,0x15,0xfb,0x11,0x2d,0xbe,0x47,0x5e,0x5b,0xca,0x0d,},"\xda\xa8\xef\xb3\xfd\x41\xf1\x2f\xbc\x55\xbd\x60\x46\x41\x57\xa2\x6d\x71\x86\x32\xd8\x82\xae\xdb\x6b\xf9\x8e\x47\xdd\x23\x37\x87\x9e\x0b\x46\x45\x2e\x06\x2e\x6d\xfb\xff\x3e\x7b\xca\x72\x89\xe4\xef\x6b\x3f\x41\xd4\xb0\x3b\xdc\x2c\x84\x2a\xfe\x97\xf3\x02\x98\x83\xed\x45\xf6\x05\x4d\xde\x96\x90\x64\x9a\xbb\x2b\x8d\xc2\x8f\x5f\xe8\xce\xcf\x80\xfc\x1e\xa4\x11\xbf\xc4\x0b\xbf\x4f\xd2\x0b\x21\x8c\xf4\x7e\xa8\xee\x11\x8d\x4d\x5a\xef\xa5\xc1\xbf\xa0\x8a\x8f\xb1\xb3\x0d\x6d\xe0\x97\x7c\xd1\x5e\x50\x29\x2c\x50\x1f\x2e\x71\xce\x27\x40\xff\x82\x8b\x84\x32\xda\x5a\x59\x4b\xab\x52\x23\x76\x0b\x64\x79\x2e\xd3\xa6\x9d\xd7\x5e\x28\x29\x23\x49\x43\x65\x65\x13\xdf\x1a\x17\xa2\xa0\x67\xa9\xa8\xea\xa6\x4e\x19\x56\x9f\x46\x93\x9d\x34\xb9\x92\x71\xae\x50\xa4\x7d\x7d\xbc\xa3\x62\x0c\x81\x25\x5b\x0e\x1f\xd1\xf3\xce\xc8\x51\xf1\xb1\x1b\x35"}, +{{0x5d,0xbf,0x88,0x5a,0xa5,0x98,0xe8,0x95,0x57,0x1f,0x5f,0x65,0x09,0x0b,0x72,0x32,0x3e,0x9d,0x70,0xb0,0xf5,0x81,0x10,0x68,0x7a,0xfb,0xbc,0x38,0x3a,0xfe,0xdc,0xac,},{0xfa,0x17,0xeb,0xa7,0x6e,0x3b,0xc3,0xea,0x6d,0xab,0x3a,0x5b,0x12,0x0d,0xc5,0xec,0xb9,0xae,0x6f,0x00,0x13,0x8f,0x7d,0x36,0xdd,0xa9,0x26,0x8b,0xc4,0x72,0x21,0x74,},{0xe1,0x42,0x9d,0xab,0x2e,0x42,0xcd,0x03,0x5b,0x7f,0xc6,0x02,0xef,0xd6,0xba,0xf9,0x47,0x06,0xf1,0x6e,0xaf,0x2f,0x8b,0x5f,0xed,0x32,0x92,0x39,0xe8,0x75,0x60,0x5f,0xb1,0x72,0xf5,0xdd,0x9a,0xe2,0xbc,0x2e,0xb4,0x2e,0xb4,0x74,0x56,0x7e,0x29,0x2f,0x52,0x06,0xe8,0x2e,0x69,0x4b,0xca,0x0d,0x6d,0x43,0x3b,0x86,0x76,0x34,0xcb,0x0d,},"\x1e\x0b\x6c\xf1\x5c\xe0\x33\x37\x17\x9c\x02\xd6\x54\x08\xdf\x5b\xe9\x20\x0c\x37\x82\xb6\x00\x4a\xf9\x4e\xa4\xde\xcb\x25\x79\x99\xd6\xfd\xff\x30\x1d\x11\xd0\x0c\x98\xc3\x72\xfa\xc0\xd0\x26\xcb\x56\xdf\xef\xe3\xde\xf7\xeb\x99\xac\x68\xd6\x96\x8e\x17\x12\x4d\x84\x46\xf5\x3e\x8d\x2d\x3d\xd8\x90\xd3\x7a\x23\xc7\xe0\xb8\x3a\x48\x4b\x3c\x93\xbd\xdf\x6c\x11\x8e\x02\x81\x95\x9d\x27\xbd\x87\xd3\x7e\x84\x3d\x57\x85\xf4\xa4\x07\x71\x39\x84\x94\xe6\xc4\x32\x2f\xbb\x67\x5c\x1d\x47\x93\x21\x03\x21\x48\xf7\xfe\x52\x56\x4d\xdf\x7a\xe7\xac\x26\x9d\x0c\xd2\xe5\x52\xfe\xc5\x89\xae\xae\x0f\xb9\x3f\xe3\xee\xae\xf0\x85\x60\x96\xcf\x4f\x6b\x34\x97\xe7\x23\x5c\xc8\x49\x4d\x81\x0a\x0b\x46\xc5\xea\xc8\x7f\x18\x7e\x50\x5b\xb7\x76\x4f\x80\x45\xc9\x54\x19\x83\xf7\xb0\x25\x69\x80\x09\xa2\x3d\x9d\xf0\xbd\x1a\x47\x3c\xbe\xe4\xcf\x5e\x94\x88\xec\xbc"}, +{{0x84,0xb3,0xae,0xdd,0x47,0x97,0xa5,0x65,0xc3,0x51,0xde,0x7d,0xfa,0x07,0x00,0xb9,0xff,0x7c,0x4d,0x72,0x91,0xc8,0x80,0x8d,0x8a,0x8a,0xe5,0x05,0xcd,0xd2,0x25,0x90,},{0xd7,0xad,0x72,0xca,0xa7,0xc2,0x22,0x09,0xec,0x46,0x78,0xd1,0x1d,0x55,0x90,0xa6,0xcb,0x28,0xa0,0x71,0x17,0xfe,0x5a,0xef,0x57,0xb5,0x07,0x51,0x58,0x32,0x01,0xa5,},{0x92,0x20,0xf0,0xed,0xaa,0xae,0xe1,0xb8,0x76,0x35,0x0d,0xbe,0x92,0x66,0x06,0x17,0x67,0xb8,0x62,0x96,0xc3,0x51,0xd4,0xca,0xc9,0x9d,0x07,0xcd,0x61,0x2c,0x6e,0xfb,0x24,0xf8,0xf9,0xb0,0xb9,0x75,0xf9,0x5c,0x42,0xc5,0xb6,0xaf,0xed,0xc8,0x92,0xf8,0x7e,0xfe,0xdd,0x39,0xd5,0x16,0x02,0x94,0xc2,0x76,0x58,0xbd,0xcf,0x42,0x85,0x0b,},"\x53\x25\x67\xff\xa5\x3b\x5c\x0f\xcd\x29\xc3\x94\x99\xd2\xe7\x8e\xcd\x20\xe6\x31\x23\x49\x92\x40\xe7\x75\x08\x8b\x39\x4d\xc6\x5c\x8b\xaa\xa0\xfe\x8f\x6a\xa7\xe7\x01\x81\xf9\xe1\x0a\xdd\x8b\x4a\x8b\xeb\x0b\x2e\xc3\x8a\x43\x30\x9f\x10\x0c\xd4\xbe\x91\xc6\xf4\x8e\x79\xdc\x0a\xee\x93\xa1\x5c\x94\x03\x77\x3b\x35\x4a\x8d\x42\xed\x48\xd8\xf2\x76\x23\x0f\xa6\xde\x5a\xda\x50\x1e\xe0\xa6\x53\xb4\x45\x8f\x0e\xcf\x6d\x5b\x3c\x33\xe2\x14\x1c\x66\x2f\x6e\xa0\x55\xf7\x41\xe5\x45\x86\x91\x7d\x2e\x0c\x4e\xb2\xb5\x66\x21\xf9\x66\x5f\xef\x32\x46\xf0\xbd\x80\x0b\x53\x3e\x3b\xc6\x15\xc4\x02\x1f\x8d\x0e\x2a\xd2\x33\xa1\x1e\x77\x36\xc4\x93\xac\xc3\x1f\xae\xe7\x6a\x09\x7d\xc4\x0d\xb9\xef\xc2\x24\x46\xea\xcf\x1c\xc1\x8f\x51\xfd\x10\x23\x6a\x2f\x94\x2d\x0a\x53\xc3\xce\x20\x91\x08\xb5\x93\x8c\x0a\x9e\x53\x6b\x89\xef\x0a\xd6\xb4\x05\xa1\x0f\x22\xc3"}, +{{0x69,0x50,0xbf,0xcf,0x48,0x0b,0x98,0xea,0x18,0xa2,0xd5,0xae,0x5b,0xa6,0xe7,0x66,0x8f,0x4c,0x28,0x3f,0xf2,0x71,0x13,0x57,0x74,0x0f,0xfe,0x32,0xcf,0x25,0x81,0x9a,},{0x8e,0x4c,0x6f,0x23,0x3f,0x7b,0x86,0x32,0x1c,0x9d,0x67,0x99,0xba,0xc2,0x8a,0xaf,0xcd,0x25,0x03,0xd7,0xaa,0x0a,0x7b,0xde,0xd8,0x72,0x27,0x27,0xfb,0xbc,0xae,0xb8,},{0x94,0xde,0x5d,0xf7,0xa2,0x5e,0xcd,0x70,0x20,0x5d,0x40,0xbc,0x94,0x99,0xfc,0x7c,0xd7,0x13,0x65,0x68,0x06,0x0a,0x41,0x9a,0x93,0xbe,0x6e,0x31,0x86,0x64,0xbb,0x6d,0xfc,0xe6,0x0e,0x2d,0x4e,0x63,0x3f,0x7e,0xc1,0x48,0xfe,0x4f,0x83,0x4e,0xd2,0x77,0xc1,0xfe,0xc4,0xc4,0xe2,0xa8,0x6f,0x44,0xc4,0x58,0x9c,0x81,0x78,0x88,0xdb,0x00,},"\xa4\x01\xb9\x22\xab\xa5\x7e\xe0\xc6\xac\x1c\x8f\x1b\x48\x29\x6a\x85\x62\xee\xf1\x37\x52\x68\x93\x88\x6a\x08\x30\x6e\x22\x03\x66\x77\x88\x61\x8b\x93\x98\x64\x46\x7a\x31\xf1\x6e\xdc\xe1\x52\xa4\x2c\x25\x54\x6b\x64\x0e\xa8\xbe\xd1\x89\xa4\xf8\x98\x86\xa3\x7f\x10\x69\x11\xea\xe1\xf5\x00\x81\xbf\x79\x5e\x70\xc6\x50\x44\x37\xd2\xa8\x0c\xb8\x39\x47\x9e\xcb\xb8\x7c\x12\x9b\xcc\x5f\xe3\x1d\x71\x6e\xf9\x78\xc2\x06\xd7\xf0\x8a\x79\x34\x66\x59\x4f\x4d\x75\xe2\x15\xbb\x63\x74\x59\x6f\x8e\x7d\x00\xee\xa7\x24\x78\x09\x43\xe8\x9b\xd3\x86\x3c\x95\x1b\xbd\x24\xef\xee\x23\xc9\x7c\x2c\x79\x7c\x7f\xaf\xbf\x8f\x2c\x8b\x43\xf3\x7a\x5f\x88\x11\x29\xa0\x95\x73\xfa\x7a\x03\x4a\x28\x5e\x80\xdc\x4b\xa4\xbc\x95\x64\xa4\xdc\xed\xeb\x33\x16\x7e\x0b\x30\xc5\xa0\x0b\x9a\x10\x9a\x22\x31\xcf\xa0\x01\x2b\x29\xb2\xb3\x45\x0b\x89\x2e\xcc\xef\x08\x08\xe5\x03\xf8"}, +{{0x61,0xb2,0x60,0xf5,0xb8,0x48,0xb2,0x71,0xef,0x48,0xe5,0xa5,0x6d,0x29,0x74,0x32,0xd8,0x9f,0x2a,0xb8,0x5b,0xd5,0x38,0xfa,0x66,0x88,0x70,0xd0,0x56,0x02,0x20,0xe5,},{0x60,0x86,0xfe,0x87,0x35,0xf3,0x99,0xf1,0xaf,0x2e,0x39,0x5e,0x0f,0xdf,0xb5,0x62,0x9e,0xbc,0xb0,0x4b,0x6e,0xd4,0xa5,0x4a,0x9e,0x47,0x05,0x2c,0x6e,0x81,0x91,0xd4,},{0x98,0x28,0xfe,0xc8,0xff,0x5c,0xf8,0x5a,0x98,0xf4,0x50,0x77,0x0b,0x5b,0xdb,0x4b,0x80,0xda,0xca,0x44,0x37,0x9d,0x8f,0x53,0xc9,0x1c,0x34,0x8e,0x22,0xdf,0x64,0xac,0x48,0xf2,0xb6,0xe2,0xa7,0xb3,0xb6,0x42,0xbc,0x81,0x93,0xa1,0x94,0x31,0x62,0x29,0xe6,0x94,0x47,0xed,0x24,0x1c,0xd4,0x23,0xd8,0x3b,0x6f,0xe7,0xb2,0xd4,0x4b,0x00,},"\x28\x26\x29\x5d\x79\x94\x5f\x67\x54\x76\xbc\x4d\x45\xef\x80\x0d\x80\xb1\xf0\x39\x8e\x4b\xe6\x0e\x3d\xe4\x57\x1e\xd1\x08\xdf\x98\x9f\x03\x2d\xe6\xc2\x34\x5d\x99\x48\xd6\x77\x92\x7e\xa0\xb8\xcf\x1a\x5c\xa3\x6f\xd5\xf2\x3c\x25\xdc\x0d\x2a\xb5\xbd\x56\x5a\x54\xaf\x46\xfd\x97\xd3\x38\xd7\x70\xe3\xa7\xb4\x7e\xfb\x54\xc0\x7a\x16\x64\x70\x77\x71\xeb\x4e\x37\xd9\xd7\x0b\xa7\x79\x25\x1d\xcd\xcd\x3b\xf6\xd1\x24\x8a\xde\xc5\x3f\x78\x72\x59\xc4\xd5\x94\xd5\xfd\x4c\xed\x8e\x3d\xb7\x62\x1d\x49\x65\xd4\x82\x98\x17\x81\x24\x93\x1a\x3d\x0c\xd2\x69\xb2\xd5\x3b\x7c\xd2\x61\xb9\x6d\x37\x0c\x5d\x96\x93\xc8\xad\x13\x3e\xd5\x89\x45\xee\x35\x40\xe1\x06\x25\xd9\x24\xae\xba\x9b\xda\xfc\x65\x61\x00\xaa\xb2\x76\xfa\x99\x6b\x1d\xb4\x77\xbf\x85\xea\x55\x90\x81\xd5\xb4\xc7\x30\x7d\xc1\x59\x56\x54\xac\xa8\x2f\x7b\x6d\x2d\xda\xf7\x35\x7c\x15\xa4\xd7\xd8\xb9\x08"}, +{{0x93,0x6d,0xc1,0xce,0xf6,0xa3,0x10,0x74,0x7f,0x35,0x00,0x88,0x05,0x5a,0x39,0xaa,0x76,0x2d,0x9a,0x4b,0x52,0xc8,0xc8,0xe4,0xc6,0x82,0x79,0x43,0x80,0xc2,0x72,0x5c,},{0x03,0xb3,0x18,0x00,0x41,0x2d,0xf4,0xd5,0x6f,0x15,0x32,0xc0,0x58,0x28,0xc0,0xb7,0x25,0x28,0xa6,0x7a,0x78,0x1b,0xef,0x4c,0x06,0xc1,0xfb,0x6f,0xf2,0xce,0x32,0x4b,},{0x3f,0x99,0x4b,0x8e,0xf5,0x28,0xf6,0x42,0x1c,0x6a,0x6a,0x22,0xe9,0x77,0xad,0xe5,0xce,0xe8,0x87,0x26,0x3d,0xe3,0x8b,0x71,0x9a,0xcd,0x12,0xd4,0x69,0xbf,0xd8,0xc3,0xf6,0x8e,0x7a,0xc0,0x7d,0x2f,0xae,0x80,0xa2,0x09,0x27,0x78,0xdf,0x0b,0x46,0x35,0x37,0xad,0x3a,0x05,0x51,0x99,0x7a,0x3d,0x5b,0x51,0xf8,0x32,0xd9,0xc8,0x23,0x0b,},"\xeb\x58\xfe\x86\xc4\xef\x34\x9c\x29\xae\x6f\xb0\x4f\x10\x85\x0e\x38\xc6\x82\x3d\xbe\x64\xa0\x9a\x5b\xf1\xe0\xce\x60\x0d\x39\x4e\xfa\x6f\xb9\x6e\xd6\xa8\xf2\xc9\xd4\xbe\xc0\x5e\x6a\x5e\xbd\x5a\x1b\xf4\xd0\xc5\x1d\xb9\x34\xe5\x7b\x79\xe5\xc6\xa8\x79\xd9\x75\x19\x7d\xbb\x10\x47\x5f\x65\xc7\xf8\xa8\xc6\xa7\x7a\x42\x03\x84\xb5\x06\x2a\x27\x40\xf1\x40\x17\x40\xee\x0f\x5e\x04\x3a\xad\x7a\x2a\x2b\x42\x60\xc5\xd9\x07\xf7\x05\xed\xaf\x65\xb0\xe3\x75\xdf\xc7\xb0\x0b\xd6\x60\xdb\x61\x47\xf2\xeb\xe8\x70\xa0\xee\x18\xdc\x2b\xa3\xc9\x2b\x0b\x76\xfa\xe2\xb9\x09\x32\xcd\xb6\xc1\x49\xe4\x6f\x3f\xee\xcf\x4c\x26\xf0\x44\x1f\x3a\x9e\x00\x66\x78\xae\xcf\xf8\xcc\xae\xca\xed\xa7\x3a\x18\xa6\x8a\xc9\x88\xb6\x2e\x83\xa9\xbb\x51\x88\xae\xde\x38\xdf\x77\xa9\xa1\x64\xab\xbd\xd9\xd5\x8e\x52\xa6\xca\xf7\x22\x23\x89\xf1\x98\xe8\x5f\xbf\x96\x62\x36\xdc\xdb\xd4\xc1"}, +{{0xf8,0x9e,0xed,0x09,0xde,0xc5,0x51,0x36,0x1f,0xa4,0x6f,0x37,0x59,0x73,0xd4,0xfb,0xfa,0x5c,0x5c,0x12,0xf1,0xb5,0xe5,0xab,0xf4,0x5c,0xfa,0x05,0xff,0x31,0xa3,0x40,},{0x3e,0x0e,0xfd,0xca,0x39,0x19,0xfa,0x10,0xd4,0xa8,0x49,0xce,0xf1,0xde,0x42,0x88,0x51,0xbd,0x08,0xef,0xd2,0x48,0x59,0x4f,0xd8,0x9c,0xde,0xb9,0xde,0xee,0x43,0xb0,},{0x89,0x7e,0x6f,0x27,0x97,0xc3,0xf3,0x26,0xd2,0xcd,0xb1,0xd2,0x67,0x3d,0x36,0x06,0x31,0xf0,0x63,0x30,0x45,0x80,0xff,0x5b,0x4e,0xb4,0x3d,0x39,0xad,0x68,0x51,0x83,0x4c,0x9c,0xf8,0x91,0xd9,0xf0,0x90,0x5b,0xf8,0xde,0x07,0x5f,0x76,0x35,0xdf,0xca,0x60,0x1a,0xdc,0x0f,0x14,0xe7,0xb2,0xc7,0x6f,0x75,0x71,0xbf,0xa4,0x68,0xed,0x0c,},"\x4c\xf9\x77\x3d\xa0\x5f\xd3\x22\xfc\x14\x7b\xe9\x00\xef\x5c\xf2\x56\xc8\x8a\xfd\xad\x4b\x08\xc2\x30\xdf\xc8\x98\x1f\xb6\x9f\x47\x6f\x7d\x45\xef\x7c\x90\x06\xbc\x10\x03\x2b\xa5\x34\x36\xac\x22\x84\x3e\x0d\x76\x28\x9c\xf6\x8f\x98\x18\xfa\x64\x03\x1d\x4b\x40\x95\x50\x59\xaa\x69\x11\x09\x15\x88\x9f\x5e\x22\x73\x2a\x13\x43\x91\x25\x81\xab\x3b\x11\xa3\xba\xe7\xa4\x71\x35\x95\x08\x59\x65\x75\xf8\x88\x16\x0b\xee\xf9\x66\xe5\x70\x8f\x0e\x31\x47\xea\xcf\xce\xc1\xca\xa3\xef\x24\x0c\x5e\x0a\x14\xc1\x86\x54\x6c\x8e\xeb\x64\x65\x83\x50\xb1\xaf\xfc\x0c\xfd\x2a\xc2\x13\xaf\x67\x0a\xfc\xa7\xbb\xc9\xdd\xdd\x28\xa4\x65\xb5\x86\xe6\x9c\x38\x8c\xd7\x34\x78\xd6\x8e\xfb\x32\x2b\xdf\x86\xd9\x21\x30\x11\xe7\x11\xb2\xb9\x5f\xef\xa7\xbb\x9b\x59\x39\x76\x17\x06\xaa\x71\x21\x02\x49\x06\x42\x0b\xdd\xf1\xd8\x80\x0a\x43\x38\xd9\x38\xfa\x13\x7c\xf2\x7e\x9f\xfc\x51\xc6"}, +{{0x40,0x07,0x96,0xef,0x60,0xc5,0xcf,0x40,0x84,0xde,0xe1,0x80,0x1c,0x4a,0x19,0x75,0xe4,0x82,0xe7,0x0a,0xef,0x96,0x1c,0xd4,0x2e,0x2f,0xd5,0xa3,0xfa,0x1a,0x0f,0xbe,},{0xf4,0x7d,0xa3,0x81,0x28,0xf2,0xd0,0x12,0xcc,0x57,0x97,0x57,0x1d,0x47,0x9c,0x83,0xe7,0xd8,0xa3,0x40,0x98,0x02,0xf9,0xa7,0xd9,0x76,0xc2,0x70,0x67,0xcb,0xbe,0x43,},{0x84,0xd3,0xaa,0x3f,0x36,0x18,0x44,0x39,0x67,0x54,0xd8,0x0d,0x9f,0xa0,0x5b,0x8b,0x2f,0xa4,0xab,0xf3,0xa0,0xf3,0x6b,0x63,0x9b,0xee,0x9c,0xfb,0x5c,0x85,0x30,0xa3,0xa9,0xcc,0x34,0x67,0x7f,0x92,0xa9,0x13,0xc4,0x1e,0x80,0x0f,0x2e,0x80,0x41,0xf7,0x66,0x6d,0x07,0xed,0x85,0xf1,0x6a,0x57,0xd8,0x17,0xb1,0x24,0x1f,0xc5,0xee,0x04,},"\xc4\x73\x32\x5e\x78\x5b\x27\xdf\x44\x71\xee\xfb\x9e\xbe\xbd\x64\x61\xd5\x70\x80\x01\x81\x10\x0f\xf3\x6c\xaf\x3c\x38\xf6\x7c\x19\x21\xb1\x57\xec\x8e\x61\x26\xf9\x55\xae\xbd\x90\xea\x3f\xe5\x38\x5f\x80\x42\xcd\x70\x4b\x27\xcc\x1d\x69\x78\xc0\xe2\xa2\x96\x69\x5f\x5e\xf9\x7b\x7c\x2e\x16\xae\x4f\xf4\xd0\x63\xc6\x88\xd7\xf4\x6e\x96\x4e\x1f\x0a\x00\x50\x3f\x35\x73\x45\x97\x76\x83\xd6\xe4\xc3\x42\x3d\x56\xbd\xb6\xce\x86\x4b\x69\x87\xe0\x85\xe8\x3e\x70\xc7\xc1\xa1\x4e\x0e\x41\x3f\x59\x2a\x72\xa7\x1e\x01\x7d\x50\x5b\x64\xc2\x4f\x1a\x1a\x6b\x81\x3e\x06\x4e\x6e\x0c\xf8\xbd\x45\x71\xd0\xff\x2f\x26\x7a\x6a\x13\xe0\xcd\x43\x04\x63\xb6\xca\x3b\x88\xf0\xcd\x40\xb0\xfb\x83\xd5\xbe\xdf\x6f\x7d\x47\xe1\x70\xe8\x7d\x0a\x75\x00\x93\x69\x3e\xda\x23\x2a\x6d\xaf\x98\x12\x57\x27\xb9\x58\x8e\xcb\x89\x4a\xe3\x73\xba\xe3\xa4\x45\xa1\x06\x30\x64\x69\xa4\xc2\xcd\x77\xff"}, +{{0x67,0x03,0xa6,0x23,0x2c,0x5e,0x2e,0x65,0xe0,0xab,0x3b,0x92,0xe2,0xaa,0xf9,0xf5,0xfb,0xd3,0x3f,0xb4,0x69,0x88,0x04,0x7d,0x6f,0x4d,0x0f,0xf5,0x38,0x7f,0xa0,0x29,},{0x04,0x7c,0xff,0xca,0x8b,0x7b,0x11,0xac,0x6e,0xac,0xc0,0xea,0xa0,0xc5,0xb7,0x3c,0x75,0xb9,0xc6,0x37,0x95,0x69,0x73,0xaf,0x9d,0x97,0xb2,0xdd,0x5b,0x60,0x5d,0x6f,},{0xca,0xe9,0x68,0x79,0xe5,0xb6,0x03,0xbe,0x86,0x66,0x09,0xd4,0xa0,0x53,0xbf,0xa1,0x2a,0x51,0x37,0x8e,0x99,0xb2,0xa2,0x81,0x2e,0x47,0x89,0x26,0x7d,0x8f,0x32,0xf4,0x73,0x24,0x3f,0x8a,0xf7,0x4b,0x9b,0xe7,0x3f,0x47,0xde,0xa5,0x0f,0x0d,0x16,0x5e,0xbf,0x49,0x45,0x8b,0x73,0xe5,0x3d,0x88,0x58,0x0c,0x19,0x1a,0x18,0x2d,0x19,0x04,},"\xa2\x6b\x30\xa7\x69\x19\x79\x32\xa3\xa6\x28\x54\x96\x8d\x76\x01\x51\x61\x23\x66\x77\x8d\xc9\x94\x57\x6a\x2e\x0e\x03\x55\x49\x6b\x46\x20\x0e\x50\x69\x48\xa0\xd1\x02\xb6\x65\x1b\x2e\x73\x34\xca\x6c\x6e\xae\xf8\xbc\xa4\x4b\x42\x59\x70\xa0\xb3\x7d\x6b\xde\x0d\xa9\xd3\xc1\xb9\xf5\x1c\xbb\x25\xbc\x33\x5c\xd6\xfa\x92\x8a\x74\xf2\xc0\xdc\x2c\x6e\x99\xd3\x7a\x12\x86\x3a\x47\x4d\x4d\xf4\x3a\xad\x35\x41\x5f\xfc\xaa\x24\xd8\xc2\x9f\x91\x45\x72\xab\x2a\xbe\xc3\x89\x2d\xb4\x9e\x67\x9c\x5e\xa2\x20\xc2\xf5\x19\xa7\xd0\x33\xac\x1a\x2c\x5a\x46\x78\x69\xe3\x0e\xda\x3d\x26\x35\xca\x86\x34\x31\x47\x3f\x95\x8d\x55\x2b\xdc\x55\x82\x35\x2c\x29\x0d\x0c\xe4\xfa\x9c\xfd\x0a\xd4\x27\x99\xc2\x27\xec\x90\xb7\xc9\xe5\xdb\x9f\x5a\x7b\x6d\x56\x92\x12\xee\xd9\x4d\x32\x33\x26\x80\x5f\x2b\x3a\x00\x10\xd6\xc1\x1e\xb4\x10\x7c\x82\x83\x03\x76\x52\xf5\x0d\xc0\x67\xb6\xdc\x81\xf4\xdb"}, +{{0xe0,0xe7,0x2f,0x8f,0x17,0x86,0x33,0x62,0x67,0x33,0xbc,0xbd,0xa2,0xad,0x2a,0x50,0xe6,0x53,0x89,0x0f,0x15,0x35,0x9b,0x6c,0x22,0xfc,0x73,0x45,0xad,0x33,0x31,0x09,},{0xd1,0x3c,0xee,0x54,0x0d,0x84,0xb5,0x66,0x7d,0x51,0x6f,0xe7,0xec,0x72,0x39,0xbf,0x8d,0xa9,0x15,0x46,0xee,0x79,0x1f,0x84,0xed,0xd8,0xff,0xcf,0x3a,0x08,0x3e,0x76,},{0x14,0x55,0x21,0x71,0xb9,0x52,0x45,0xac,0x0f,0x0e,0x5a,0x6e,0x7a,0x2f,0x54,0x17,0x21,0x06,0x8d,0xb6,0x50,0xc6,0xda,0xda,0x04,0xc2,0x8c,0xab,0x7c,0x49,0x19,0x5f,0x64,0x36,0x71,0x21,0x44,0xcb,0x31,0x91,0x3c,0x56,0x2e,0x30,0xc3,0x9d,0x8a,0x85,0x49,0xfb,0x64,0xff,0xea,0x81,0xc7,0x44,0x51,0x43,0xb5,0xf2,0x32,0x86,0xda,0x05,},"\x79\x1f\xd6\x13\xc1\x09\x52\x92\xc8\xa4\xa2\xc8\x6b\x47\xae\x02\x61\x55\xb8\x46\x5b\x60\x7d\xbb\x41\x64\x77\xef\x79\xa2\x97\xc9\xd7\x75\x8c\xe3\x4a\xf9\xdc\xbf\x1c\x68\x47\x4f\x30\x90\x9f\xbe\x74\xb7\xba\x42\x96\x32\xf2\x40\x3a\xad\x83\x2b\x48\x6b\x72\xc2\x30\x54\xad\x42\xf7\x65\x3a\x9d\xdb\x45\x6c\xc7\x91\xf3\x48\x88\x6a\x7a\xe5\xdc\xec\x7c\x0b\xa8\x15\xf7\xa9\x3a\x10\xfe\x33\x1e\x90\x3b\x97\x0f\x7b\x50\x28\xbe\x49\xd1\x4b\xc5\x62\x0d\x63\x79\x26\x72\xb9\x8b\x94\x88\xc6\x7a\xe1\x66\x46\x69\x3e\x11\x20\x47\xf0\xac\x89\x21\xff\x56\x1c\x92\xdd\x05\x96\xd3\x2d\xf0\xa6\xe5\x07\xac\x1b\x07\xde\x51\x6c\x98\x42\x8d\x57\x0a\x37\xdb\x9b\xcd\x7c\x7e\x61\xc6\x94\x8a\xb3\xfe\x91\x25\x0d\xd1\xd5\xbd\x67\x12\x75\xdf\x9a\x97\x2f\x22\xc2\xba\x36\x80\x47\x47\xae\xc1\xea\x24\x16\xc1\xf4\x1a\xb8\x7b\xef\xde\x31\x62\x9b\x2d\x43\x31\x7c\xe4\x1c\xda\x03\x62\x62\x86\xc0"}, +{{0x54,0x4d,0xaf,0xd9,0x96,0x0d,0x82,0x97,0x56,0xc6,0xd4,0xb3,0xea,0xdd,0x44,0x37,0x5f,0xe7,0x80,0x51,0x87,0x6b,0xf9,0x78,0xa3,0x81,0xb0,0xde,0xca,0xaa,0x80,0x96,},{0xae,0x4f,0x64,0x25,0xc1,0xb6,0x7c,0xcb,0x77,0xf9,0xaa,0xcf,0xea,0x28,0xea,0xef,0x76,0x9c,0x8c,0xac,0xee,0x03,0x52,0x05,0xcd,0xcd,0x78,0x7e,0x8d,0x07,0x62,0x9d,},{0xa2,0xae,0x11,0x7c,0x8d,0xe4,0xca,0x6d,0x6f,0xe7,0x5e,0x46,0x60,0x23,0xbd,0x55,0x0c,0x26,0xfe,0xdd,0x3e,0x74,0xca,0x13,0xad,0xb6,0x25,0xf2,0x72,0xe1,0x75,0xf1,0x4d,0x5d,0xf5,0x50,0xac,0xe7,0xd8,0x22,0x88,0xef,0xef,0xab,0xf9,0x63,0x11,0xa1,0x23,0xbe,0xe2,0x38,0x89,0xad,0x37,0x11,0xbf,0xf2,0xb8,0x08,0x79,0x46,0xbf,0x0e,},"\x44\x7f\xe7\x34\x4c\xad\x1f\xae\x09\xd6\xa7\xd0\x5f\x09\xd5\x03\xc1\xb3\xd3\xd5\xdf\xa5\x84\x81\x0c\x35\xbc\x41\xe4\x95\x56\x93\x70\x61\x54\xe2\xd7\x51\xb2\xf1\xb5\x25\xe1\xa1\x45\x47\xba\x7f\x8b\x23\x20\x88\xa6\xfc\x92\x27\x02\xd9\x3a\x11\xcd\x82\x94\x9c\x27\xbe\xd6\x45\xdc\x35\x1f\xb4\xc1\x24\x2c\xf4\x1d\x01\x57\x54\x12\xe7\x92\xae\xd2\x14\x53\x1d\x94\xfd\x66\xe0\x3d\xd3\x2e\x97\x2f\xd7\x7f\x69\x47\xa3\x53\xe1\xae\x5e\x00\xf5\xa6\xca\x77\x99\x24\x72\xf0\x96\xb6\xe7\x47\x5f\xe5\x34\xe9\x13\xa7\x7b\xcb\x0d\x68\x1f\xdf\xb3\xa7\xa0\xdc\xb5\x6d\x27\x4d\xf4\xaa\x10\x9d\x4a\x8a\x37\x79\x4a\x92\x76\xf5\x00\x06\x69\x6f\xf1\x2c\xa4\xd0\x25\x40\x39\xdf\x0f\xb3\xf7\x2a\x96\x0d\xa0\x5c\x98\x72\xf2\xe3\x3e\xe8\x1d\x1c\xf7\xa6\xf4\x8b\xbc\xe0\xaa\x18\xc7\xc0\xf0\x6b\xa5\x5e\x67\x68\x9e\x0a\xf5\x87\xb5\x00\xea\xb7\x9c\xc7\xf9\x64\x0b\xca\x10\x4b\x7f\xbf\x31\xf0\x8e"}, +{{0xbf,0xbc,0xd8,0x67,0x02,0x7a,0x19,0x99,0x78,0xd5,0x3e,0x35,0x9d,0x70,0x31,0x8f,0xc7,0x8c,0x7c,0xc7,0xbb,0x5c,0x79,0x96,0xba,0x79,0x7c,0x85,0x54,0xf3,0xf0,0xf0,},{0x7c,0x5a,0xe3,0xba,0xb9,0x20,0x11,0x99,0xdf,0xbe,0x74,0xb7,0xd1,0xec,0x15,0x71,0x25,0xbd,0xba,0xa4,0x52,0x0f,0x50,0x1d,0xa3,0xf2,0x48,0x57,0x9d,0xc6,0xc2,0x2d,},{0xe4,0x86,0x15,0xb6,0x56,0x33,0xe6,0x19,0x93,0xb0,0xaa,0xa1,0xfa,0xfb,0x74,0xb9,0x62,0x9c,0x38,0x4f,0xd5,0x92,0xbd,0x73,0x5f,0xa1,0xf6,0x2c,0x5c,0xad,0x11,0x29,0x1f,0xcd,0x8c,0x2e,0x91,0xa5,0x0b,0xfe,0x0b,0x03,0xb4,0x35,0x02,0xff,0xf3,0xa5,0xc3,0x82,0xb9,0xc2,0x82,0x19,0x07,0xef,0xc3,0x4d,0xa5,0xba,0x05,0x4a,0xf0,0x0e,},"\x11\x7f\xae\x13\xe7\x87\x77\xb6\x21\x9f\x02\x02\x14\xc1\xb8\x7c\x57\x04\x6d\x1c\x09\xce\x82\xee\x2b\x56\x29\x89\x8d\x9b\x0d\xe7\x4a\x15\xcf\xe9\x9f\x80\x54\x8b\xa9\x13\xd7\x03\x6c\x56\x28\x5a\x4c\xba\x49\x3b\x52\xd2\xcb\x70\xd6\x36\x5a\xce\x3d\xa1\x2b\x1f\x34\xa2\x77\x8a\xf3\x6e\xf5\x2a\xb8\x2e\xde\x04\xca\xca\xf2\x79\x3f\x5f\x89\x83\x1e\x3b\x20\x5a\x9e\xe4\xc1\xd6\xfb\xda\xb4\xba\x4d\x9f\xae\x65\xdd\x79\xa5\xfe\x76\xb4\xb3\x9a\x30\x92\xcc\x71\x48\xd2\x11\xe8\x5e\xe8\x2a\xb4\x63\xd3\x4d\xce\xe9\x06\x1d\x9c\x21\xde\xd2\x05\x1b\xbd\x50\xb4\x13\xf0\xe2\x1a\x0e\x48\xd1\xff\xa8\xdc\xae\x24\x0b\x34\x95\xbe\x25\xd9\x31\x51\xb5\x7a\xa2\x71\xab\x99\xaa\x70\x8c\xa2\x80\x80\xca\xb4\x80\x4f\xce\xfa\x92\x9f\x5f\x1e\xf3\xf4\xc6\xc0\xfb\xfb\x40\xbe\xf7\xea\x1b\x50\x9b\x36\xba\x12\x60\x32\x35\x12\x37\x9d\x7b\xc3\xfd\xbb\x5d\x3f\xaa\xc9\xb0\x0e\x21\xf1\x2e\xa1\xca\x2e\x29"}, +{{0xdf,0x2d,0xf8,0xa9,0xd6,0x6d,0x56,0x38,0xcd,0xee,0x09,0x32,0x4e,0x7b,0x10,0xf8,0xed,0x29,0xab,0x91,0x38,0x7e,0x31,0x47,0xb7,0xdc,0x03,0xf7,0xcd,0x80,0x05,0x08,},{0x5c,0x04,0x2e,0x15,0x7f,0xb7,0xfb,0x12,0xd4,0xd4,0xfe,0xf2,0x84,0x71,0x41,0xec,0xfb,0x57,0xc1,0x25,0x3e,0x14,0xea,0xf3,0x00,0x4d,0x65,0x13,0xf5,0x2f,0xe6,0x25,},{0x9a,0x10,0x74,0x53,0x1e,0xd4,0x3d,0x07,0xbf,0xfc,0x7f,0x2b,0x6c,0x13,0xb8,0x83,0x8f,0xc7,0x5c,0xba,0x02,0xc7,0xd1,0xec,0x7b,0xa3,0x8b,0xca,0x3c,0xef,0x20,0xdc,0x9b,0xad,0xf3,0xa3,0x06,0x4a,0x2c,0x93,0xb1,0x84,0x24,0x41,0x42,0x0b,0x6a,0x8d,0x42,0x1a,0x96,0x0d,0x70,0xdf,0xb7,0xc7,0x0e,0xec,0x29,0x5f,0x21,0xf8,0x3f,0x0a,},"\x21\x57\x66\x15\xc9\x34\x6a\x63\xdc\xcf\x0c\x50\xec\xbd\x7c\x6d\x72\xad\x45\x2c\xfe\xd4\x3e\xa7\x32\x02\xcc\x7a\x98\x57\x60\x56\xb9\x66\x4b\x54\x62\x29\x05\xa1\xe7\x22\x17\x20\x73\x0a\xc6\x85\xd3\xbd\x39\x77\xec\x39\x59\xd4\x46\xbf\xa9\x41\xe7\x25\xb6\xfe\x16\xaf\xe5\x43\x2c\x4b\x4b\xde\xe7\xaa\x0f\xd8\x03\x09\x48\xed\x6f\xcb\xa7\xc0\xbd\xb4\x0c\x2e\x51\x7d\xa9\x74\x56\xe7\x4e\x1f\x93\xd5\xed\x67\x6d\xe0\xf4\xa8\xb0\xae\xa4\x49\x40\x4b\xd1\x5b\x6d\xa7\x9d\xc1\xb8\x13\x96\x5f\xe5\x57\x24\x10\xd7\x6f\x5b\x5e\xac\x66\x30\x50\x57\x03\x11\xdc\x98\x42\xb6\xfb\xf8\x80\x6a\xec\x03\x15\x17\x15\xca\xcf\x7f\x21\x80\x2e\x8b\xf5\xe9\x8a\x89\xc0\xd7\xd0\xd0\x98\xb7\x3c\x6e\xfc\x09\x96\x2e\x36\xb4\xe0\x30\xc1\xa6\x4b\x5d\x34\x9f\x5f\x20\x42\xc7\x44\x28\x67\x1e\x4a\x2c\x7f\xea\x0c\xae\xe2\x42\x2d\x85\xc4\xfc\xdd\xfe\xd3\x22\x13\x85\x9a\x69\x95\x5d\x4e\x3e\xbb\x7e\x1b\x20\x22"}, +{{0xe8,0xee,0x06,0x5f,0x99,0x07,0xf1,0xef,0xa2,0xda,0xec,0xb2,0x3a,0x04,0x25,0xf3,0x53,0x09,0x4d,0xa0,0x2b,0xc2,0xc9,0x31,0xf0,0xa5,0x87,0xef,0xc0,0xd1,0x3d,0xe1,},{0xc7,0x26,0x51,0xb7,0xfb,0x7a,0xc0,0x33,0x7a,0x17,0x29,0x77,0x49,0x6f,0xd7,0xf2,0xa7,0x2a,0xea,0x88,0x93,0x85,0x83,0x5e,0x56,0x3c,0x6b,0x60,0x53,0xa3,0x2d,0xc1,},{0xa5,0x10,0xdf,0xf4,0x2d,0x45,0x59,0xa1,0x9a,0x7b,0xf0,0xfe,0x0b,0xea,0x53,0xd3,0xe1,0xf2,0x2d,0xfa,0x6b,0xe5,0x50,0x39,0x89,0x5e,0x12,0xa5,0xd0,0x7d,0xa5,0xf2,0xe3,0x77,0x13,0xcc,0xb2,0xeb,0x21,0x60,0x11,0x62,0x8f,0x69,0x83,0xf8,0x71,0xfe,0xe2,0x86,0xe6,0x6f,0xff,0x4b,0xe7,0x58,0x2c,0x96,0x1a,0x1e,0xd7,0x56,0x84,0x04,},"\xa2\xf0\xc1\x37\x34\x73\xa3\x05\xd8\xf1\xd9\x91\x38\xb0\x6b\x9a\x96\x94\xff\xaa\x8a\x88\x22\x2d\xe9\xf7\x29\xbe\xe1\x30\x51\x75\xdf\xb1\x70\x01\xcc\x77\xf6\x7b\x6d\x40\xc9\x0c\x1a\x28\xfb\x22\x6c\x11\x28\x6d\xb4\xa1\x3e\x45\xe6\x92\x11\x24\x2b\xcd\xd0\x1c\xb6\xe2\xc4\x54\xe7\x6c\x0c\xab\x88\x1b\x4d\x2d\x9d\x3a\xb1\x00\xa5\xd6\x1d\x17\x25\xd8\x66\xe4\xfd\xb6\x6d\x93\xd7\x7f\x5b\x30\x86\x93\xb9\xb5\xa3\x33\xe5\x7f\xa2\x5d\x1e\x5d\x2e\x38\xdf\x6e\x4e\x9e\xc8\x41\x59\xbb\xee\x1f\xfe\xa9\x26\x83\x6a\x01\x01\xc9\x14\x83\xbd\x5b\xc8\x8a\x6f\x1c\xc4\xd4\xe7\xf0\x08\xad\x08\x45\x3a\x01\x23\x42\x9d\xd3\x35\x78\x1c\x7c\xbf\x8d\x68\x5a\x89\x99\xed\x11\x77\x60\x70\x04\xa1\x3c\x4c\xb5\xea\x49\x08\xc5\x42\x60\x7d\x3f\x2c\xd6\x69\x0c\xf1\xf2\xa7\x45\x5b\xbd\x38\xf5\x38\xf0\x7a\x10\x39\x64\x31\x7e\xfb\xce\xe3\x7e\xb4\x69\x31\xc0\x27\xcf\x15\x3e\xf8\x6e\x43\xd7\x82\x81\xeb\xd7\x10"}, +{{0xc7,0x2e,0x67,0xd8,0xc3,0xfe,0xc0,0x04,0xff,0x61,0x87,0x18,0xa9,0x09,0x9e,0xb8,0xad,0x7b,0x06,0xff,0x3b,0x8c,0x54,0x2a,0x7e,0x8b,0x98,0x47,0x31,0x34,0x75,0xe1,},{0x4e,0xb0,0x02,0xd3,0xcc,0xeb,0x18,0x8c,0x66,0x58,0xfe,0xc5,0x1c,0xb4,0x79,0xa6,0x52,0x64,0xac,0x55,0x5c,0x75,0xcd,0xc2,0x24,0x9c,0xf1,0xce,0x3d,0xef,0xc1,0x6d,},{0x2d,0x7b,0xab,0x8e,0xbd,0xa7,0xfc,0xa5,0xbb,0x3c,0x25,0xf5,0x1d,0xc5,0x1b,0x73,0xe6,0xff,0x6a,0x3b,0xb1,0xb5,0x2a,0xcc,0x78,0x11,0xa7,0xd2,0x59,0x5c,0xd6,0xfd,0xaf,0x73,0x04,0x94,0x41,0x8e,0x2f,0x57,0xef,0xdc,0x56,0x17,0xb0,0x66,0xfd,0x7b,0x62,0x07,0x68,0x0d,0x94,0xfb,0x8c,0x43,0xd3,0xd4,0x74,0x0b,0x41,0xcb,0x69,0x01,},"\xa8\xf3\x41\x35\xc0\x13\x2e\xc9\x5b\x64\xb0\xcb\xf5\x1d\x66\x90\x01\x43\x37\x04\x06\x79\x1f\xbb\x55\xf2\xb8\xca\x95\x3c\xc7\x4a\x46\xe0\x8b\x00\x2f\xa2\xda\x21\xb9\x51\xb8\x87\x1f\x7a\x29\xbc\x6d\x38\x79\x0a\xfc\x66\xa3\x29\xc3\x97\xd9\xf9\x25\x0b\xae\x0e\x30\xae\x34\x26\xe0\x8d\x8e\xad\x01\x79\xa3\xb3\x13\xc9\x08\x83\x91\x92\xf2\x89\xa3\xf3\xb6\xe9\x60\xb4\xc5\xce\xbe\xf0\xa0\x9d\xaa\x9c\x7a\x15\xc1\x9d\x4e\xbc\x6f\xc2\xac\x3c\xd0\x22\x32\xe8\x32\xb2\x34\xed\xd7\x96\x5d\x68\x7b\xfe\xb7\x58\xf7\x0f\xa7\x96\x38\x41\xb7\x85\x9b\xb9\x7c\x97\x1b\xd5\x57\xbc\x87\x69\x52\x4a\xc4\xc6\xee\xb3\x57\x97\x93\x33\x4b\x52\x2d\x17\x6b\xc6\x2f\x86\xb4\xd5\xc0\xd4\x01\x70\x36\xd2\xb6\xbd\x4e\x43\x84\x41\x6e\xf8\x26\x31\x39\x69\x1a\x86\x06\x17\x0d\x73\xc9\x3d\x64\x17\xdc\xc1\xa0\x8a\x53\x7c\x9e\xd4\x40\x04\x71\xa4\x6f\x52\x90\x7b\x46\xb1\x0a\x8b\x68\x89\xdb\xb4\x64\x7a\x8b\xbc\x71\x49"}, +{{0x69,0x64,0x50,0xb5,0x57,0xec,0x3c,0x94,0xcf,0x1a,0xf1,0x32,0x64,0x75,0x63,0x4a,0xa8,0x1d,0xef,0x38,0x14,0xff,0x30,0xa0,0x2b,0xa7,0xf2,0x04,0x4b,0x59,0xc0,0xfe,},{0x85,0x84,0x77,0x3c,0x56,0x6b,0x0e,0xed,0x3f,0x43,0x28,0x17,0x05,0xb5,0x75,0xa4,0x34,0xe4,0x7d,0x6c,0xf6,0xb2,0x51,0xb8,0x98,0x03,0xfe,0xf5,0x35,0x34,0xcb,0x29,},{0xce,0x8b,0x0a,0x57,0x79,0xf4,0xf5,0xf4,0x01,0xe8,0x4d,0x65,0x92,0x7a,0x0c,0x28,0xdf,0x82,0x9e,0x95,0xd0,0x9b,0xfa,0x97,0x11,0x1b,0x87,0x00,0x07,0x8f,0xf8,0x94,0xcf,0x72,0x77,0xe3,0x4a,0x71,0x61,0x44,0xd5,0x53,0x06,0xfc,0x9e,0x2f,0x64,0xcd,0x28,0x75,0x83,0xcc,0x80,0x03,0xbe,0x0e,0x8f,0xaf,0x26,0xaf,0x76,0x40,0x14,0x0e,},"\xcc\x25\x78\x29\xf3\x0a\x5f\x90\xdf\xdb\xc2\x47\xd4\x2e\x38\x87\x38\xb7\x6c\x41\xef\x8a\x82\xa5\xe0\x22\x5d\xdf\x1e\x38\x6d\x77\x08\x0b\x3b\x9d\xf8\x6c\x54\xb8\x5c\xdf\x2c\x32\xf3\x67\xab\xa0\xc3\xb6\xbf\x88\x8a\x5a\x69\x03\x52\x9b\x6a\xeb\x4d\x54\x07\xa1\x01\x80\x14\x91\x14\x13\x02\x28\xfc\x43\x56\xcc\xf3\x66\xb7\x7b\xe8\x97\x96\xa9\xe7\x1a\x0c\x69\x3f\x31\xe5\x84\xa4\xf1\x43\x09\x7b\xa3\x70\x36\x3b\x67\xb2\xf2\xe2\xfd\x8d\x6f\xe8\xb4\xe8\xdb\xf0\xd7\xdc\xc1\xa8\x36\x00\x41\x15\x8a\xa2\xaf\xf7\xe2\xa3\x25\xb8\xe5\x18\xf1\x93\xa2\x8b\xae\x05\xe3\xd5\x2b\x26\x62\x1a\xf4\x02\x02\x6d\x7f\x25\x0e\x86\xdc\xee\x30\x1a\x58\xb6\x31\xea\xdf\x45\x27\xe9\x58\xf0\x2a\x61\x58\x7f\x0b\xb5\x16\xce\xfa\xc0\x09\xfe\x51\x05\x2f\xff\x53\x33\x6d\xbd\x94\xe7\x26\x6d\x3b\x43\xca\xba\x8a\x1b\x38\xe5\xd8\x71\xc2\xa2\x4a\x4c\x41\x2f\xff\x3f\x7a\x9a\x52\xa8\xab\x23\xba\xc9\x79\x1b\x2b\x5a\x66\x9a"}, +{{0xa8,0xdd,0x35,0xf0,0x54,0xfb,0x6f,0xf6,0xf0,0xab,0x09,0x4a,0x0d,0x3d,0x1c,0x26,0x28,0x32,0x18,0x1d,0xf3,0x5c,0xcd,0x51,0x92,0x54,0x5e,0xbd,0x6a,0x9c,0xf5,0x29,},{0xca,0x41,0x23,0x38,0xd3,0x81,0x4b,0x88,0x6d,0x96,0x4b,0x71,0x92,0x5e,0x1a,0xab,0xb3,0xff,0xd0,0x78,0x34,0xdb,0xe7,0xdc,0x51,0x25,0x68,0x88,0x2b,0x53,0xe4,0xa3,},{0xfa,0x70,0x9f,0xbc,0x83,0x82,0xaf,0x83,0xd1,0x18,0x12,0x61,0x8d,0xfa,0xca,0x45,0x2e,0xab,0x83,0xe4,0xc5,0x3f,0xe9,0xe5,0x85,0x84,0x67,0xd0,0x7b,0x67,0x67,0xe1,0x79,0x75,0xc1,0xe0,0x63,0x93,0xd6,0xdd,0xe1,0x5a,0x34,0xd9,0x47,0x3d,0x1c,0xf4,0xd6,0xd8,0xc2,0xd5,0x73,0x94,0x52,0x00,0x80,0xfa,0xc4,0xe4,0x34,0x48,0xbe,0x07,},"\x55\xa7\xad\x91\x32\xd6\x3a\xc1\x61\xe7\xad\xb1\x32\xb9\x18\x9f\xdd\x84\xc3\x61\xc1\xe4\xf5\x41\x9a\x6d\xf7\x3d\xf4\xd7\xae\xb2\x9a\x8d\xc4\xbf\x01\x49\x0d\x4f\x48\x4e\x2d\x12\x07\x75\x17\xf5\xfc\x7a\xd0\xbd\xed\xa2\x0a\x6c\xb0\x22\x79\x42\x29\x0b\x08\xc3\xfe\x33\xab\x9b\x21\x35\xbc\x38\xa6\x57\x9a\x54\xbd\x98\x2f\x7d\x14\x17\xce\x86\x71\x17\xae\xa9\x18\xdb\xd3\xdd\x47\x6e\x7e\xb5\xb5\xd3\xc3\xe4\x8a\x86\x4a\x2f\x94\x2a\x31\x50\x1a\xa2\xb2\x9b\x53\xb8\x05\x13\xc9\x5d\x6a\x41\x18\x44\xf0\xde\xdf\x16\xa2\x9a\xc2\x67\xd3\x31\xe5\x3b\xdc\x25\x39\xbf\xcf\x32\xdc\x9b\x5d\x64\x0f\x12\x31\xe2\xca\xfb\x0a\xe9\x4b\xb5\x18\x94\x26\x86\x33\x64\x26\x2e\xfb\x47\xb5\xb5\xcc\xdb\xbc\x93\x32\x42\x16\xa7\x99\xb6\xf5\x0d\x37\x04\xf1\x5e\xd5\x9a\xf6\xcc\x7d\x91\x0c\xf0\x62\xd1\xbe\x63\x2d\xca\x5d\xf2\x13\xd4\x87\xd8\x56\x4f\x2b\x2b\xd7\xd8\x18\xbb\xa2\x7c\x36\x40\x13\xd9\x2d\x7f\x72\x62\x54\x62"}, +{{0xae,0x1d,0x2c,0x6b,0x17,0x1b,0xe2,0x4c,0x2e,0x41,0x3d,0x36,0x4d,0xcd,0xa9,0x7f,0xa4,0x76,0xaa,0xf9,0x12,0x3d,0x33,0x66,0xb0,0xbe,0x03,0xa1,0x42,0xfe,0x6e,0x7d,},{0xd4,0x37,0xf5,0x75,0x42,0xc6,0x81,0xdd,0x54,0x34,0x87,0x40,0x8e,0xc7,0xa4,0x4b,0xd4,0x2a,0x5f,0xd5,0x45,0xce,0x2f,0x4c,0x82,0x97,0xd6,0x7b,0xb0,0xb3,0xaa,0x7b,},{0x90,0x90,0x08,0xf3,0xfc,0xff,0xf4,0x39,0x88,0xae,0xe1,0x31,0x4b,0x15,0xb1,0x82,0x2c,0xaa,0xa8,0xda,0xb1,0x20,0xbd,0x45,0x2a,0xf4,0x94,0xe0,0x83,0x35,0xb4,0x4a,0x94,0xc3,0x13,0xc4,0xb1,0x45,0xea,0xdd,0x51,0x66,0xea,0xac,0x03,0x4e,0x29,0xb7,0xe6,0xac,0x79,0x41,0xd5,0x96,0x1f,0xc4,0x9d,0x26,0x0e,0x1c,0x48,0x20,0xb0,0x0e,},"\x9e\x6c\x2f\xc7\x6e\x30\xf1\x7c\xd8\xb4\x98\x84\x5d\xa4\x4f\x22\xd5\x5b\xec\x15\x0c\x61\x30\xb4\x11\xc6\x33\x9d\x14\xb3\x99\x69\xab\x10\x33\xbe\x68\x75\x69\xa9\x91\xa0\x6f\x70\xb2\xa8\xa6\x93\x1a\x77\x7b\x0e\x4b\xe6\x72\x3c\xd7\x5e\x5a\xa7\x53\x28\x13\xef\x50\xb3\xd3\x72\x71\x64\x0f\xa2\xfb\x28\x7c\x03\x55\x25\x76\x41\xea\x93\x5c\x85\x1c\x0b\x6a\xc6\x8b\xe7\x2c\x88\xdf\xc5\x85\x6f\xb5\x35\x43\xfb\x37\x7b\x0d\xbf\x64\x80\x8a\xfc\xc4\x27\x4a\xa4\x56\x85\x5a\xd2\x8f\x61\x26\x7a\x41\x9b\xc7\x21\x66\xb9\xca\x73\xcd\x3b\xb7\x9b\xf7\xdd\x25\x9b\xaa\x75\x91\x14\x40\x97\x4b\x68\xe8\xba\x95\xa7\x8c\xbb\xe1\xcb\x6a\xd8\x07\xa3\x3a\x1c\xce\x2f\x40\x6f\xf7\xbc\xbd\x05\x8b\x44\xa3\x11\xb3\x8a\xb4\xd4\xe6\x14\x16\xc4\xa7\x4d\x88\x3d\x6a\x6a\x79\x4a\xbd\x9c\xf1\xc0\x39\x02\x8b\xf1\xb2\x0e\x3d\x49\x90\xaa\xe8\x6f\x32\xbf\x06\xcd\x83\x49\xa7\xa8\x84\xcc\xe0\x16\x5e\x36\xa0\x64\x0e\x98\x7b\x9d\x51"}, +{{0x02,0x65,0xa7,0x94,0x4b,0xac,0xcf,0xeb,0xf4,0x17,0xb8,0x7a,0xe1,0xe6,0xdf,0x2f,0xf2,0xa5,0x44,0xff,0xb5,0x82,0x25,0xa0,0x8e,0x09,0x2b,0xe0,0x3f,0x02,0x60,0x97,},{0x63,0xd3,0x27,0x61,0x5e,0xa0,0x13,0x9b,0xe0,0x74,0x0b,0x61,0x8a,0xff,0x1a,0xcf,0xa8,0x18,0xd4,0xb0,0xc2,0xcf,0xea,0xf0,0xda,0x93,0xcd,0xd5,0x24,0x5f,0xb5,0xa9,},{0xb6,0xc4,0x45,0xb7,0xed,0xdc,0xa5,0x93,0x5c,0x61,0x70,0x8d,0x44,0xea,0x59,0x06,0xbd,0x19,0xcc,0x54,0x22,0x4e,0xae,0x3c,0x8e,0x46,0xce,0x99,0xf5,0xcb,0xbd,0x34,0x1f,0x26,0x62,0x39,0x38,0xf5,0xfe,0x04,0x07,0x0b,0x1b,0x02,0xe7,0x1f,0xbb,0x7c,0x78,0xa9,0x0c,0x0d,0xda,0x66,0xcb,0x14,0x3f,0xab,0x02,0xe6,0xa0,0xba,0xe3,0x06,},"\x87\x4e\xd7\x12\xa2\xc4\x1c\x26\xa2\xd9\x52\x7c\x55\x23\x3f\xde\x0a\x4f\xfb\x86\xaf\x8e\x8a\x1d\xd0\xa8\x20\x50\x2c\x5a\x26\x93\x2b\xf8\x7e\xe0\xde\x72\xa8\x87\x4e\xf2\xee\xbf\x83\x38\x4d\x44\x3f\x7a\x5f\x46\xa1\x23\x3b\x4f\xb5\x14\xa2\x46\x99\x81\x82\x48\x94\xf3\x25\xbf\x86\xaa\x0f\xe1\x21\x71\x53\xd4\x0f\x35\x56\xc4\x3a\x8e\xa9\x26\x94\x44\xe1\x49\xfb\x70\xe9\x41\x5a\xe0\x76\x6c\x56\x5d\x93\xd1\xd6\x36\x8f\x9a\x23\xa0\xad\x76\xf9\xa0\x9d\xbf\x79\x63\x4a\xa9\x71\x78\x67\x77\x34\xd0\x4e\xf1\xa5\xb3\xf8\x7c\xe1\xee\x9f\xc5\xa9\xac\x4e\x7a\x72\xc9\xd7\xd3\x1e\xc8\x9e\x28\xa8\x45\xd2\xe1\x10\x3c\x15\xd6\x41\x0c\xe3\xc7\x23\xb0\xcc\x22\x09\xf6\x98\xaa\x9f\xa2\x88\xbb\xbe\xcf\xd9\xe5\xf8\x9c\xdc\xb0\x9d\x3c\x21\x5f\xeb\x47\xa5\x8b\x71\xea\x70\xe2\xab\xea\xd6\x7f\x1b\x08\xea\x6f\x56\x1f\xb9\x3e\xf0\x52\x32\xee\xda\xbf\xc1\xc7\x70\x2a\xb0\x39\xbc\x46\x5c\xf5\x7e\x20\x7f\x10\x93\xfc\x82\x08"}, +{{0x6b,0xce,0x4d,0xfd,0x53,0xbf,0xa5,0x50,0x6f,0x2f,0x55,0x4d,0x2d,0x99,0x4a,0x0d,0xc4,0x0c,0xaf,0xcd,0xec,0x7e,0x1b,0xe0,0x50,0x00,0x6e,0x5c,0x5a,0x4b,0x38,0xa1,},{0xc8,0x90,0x02,0x37,0x28,0xd8,0x39,0x70,0x70,0x29,0x17,0x71,0xe6,0x5e,0x03,0x4d,0x34,0xd4,0xaa,0xe5,0xe2,0x47,0x65,0x3e,0x4f,0xf4,0xc0,0x74,0x59,0x1d,0xa7,0x02,},{0x99,0xae,0x67,0x82,0xff,0x27,0x64,0x6c,0x27,0xf6,0x1e,0x23,0x63,0x6a,0xe1,0x88,0x15,0x21,0xcf,0xa5,0xed,0x25,0x6f,0x70,0xbc,0xe7,0xce,0x00,0xb6,0x82,0x80,0xce,0x8e,0x0c,0x82,0xaa,0x76,0x5a,0xfb,0x8b,0x5a,0x1f,0xf2,0xfe,0x42,0xc5,0x74,0x41,0xe4,0x58,0xe4,0x43,0xdc,0x8b,0x12,0x34,0x77,0xae,0x33,0xd8,0x84,0x88,0x8c,0x0b,},"\x32\x39\x19\x07\x47\xee\x33\xd4\x0b\xf8\x70\xac\x9a\xd4\x9d\x88\xee\x32\x0f\x63\xc0\x52\x57\xe8\xab\x2c\x60\x30\x65\x97\xce\x76\xd1\xf1\xe7\x92\xab\x6a\x65\xca\xa5\x44\xfb\xec\x20\x89\x2f\xd4\x96\x05\x94\xf3\x1b\x37\x63\xef\x07\xd4\x98\x2e\xae\x4a\x2d\xbf\x33\x77\xdc\xc1\xe3\xf9\x5e\x46\xed\x39\xb7\xf0\x22\x2f\x04\xbb\x5c\x3b\x43\x4c\x8f\x9f\x31\x0d\xe9\xf1\x22\xa2\x9f\x82\x41\xe8\x1e\x20\x65\x49\xae\x62\x8d\x2b\x8a\xd7\x68\x97\x2c\x98\x84\x7c\x11\x88\xad\x04\xc8\x35\x35\x63\x78\xbe\xf7\x9c\xd1\x26\x86\x94\x05\xb1\x29\xfd\xbd\xc3\xbc\x48\x9c\xbd\x13\x99\x50\x5d\xad\xef\x76\x17\xb5\xbe\x5d\xa1\x73\xd3\xe8\x0e\x58\x38\xc9\x9e\x34\x92\x76\x24\x27\x29\xe0\x21\x9b\xd7\x47\x6a\xe5\xc4\xf8\x1a\x12\x87\x8f\xb4\x83\xa6\xc0\xe9\xb0\xdf\x29\x62\xeb\x0b\xf0\x01\x57\x78\x2c\xf7\x68\xa1\xb7\x1c\x01\x01\x69\xee\x85\x22\xde\xf0\x02\x4a\xd7\xe4\x57\x75\xa2\x90\x63\x9c\x53\xaa\xf4\x81\x98\xc4\x2d\xe7\x5c"}, +{{0x17,0x86,0x1a,0x8d,0x41,0x54,0xac,0xd4,0xfa,0x9c,0x8f,0xc9,0x47,0xc1,0x88,0x6c,0x11,0x29,0x0b,0xe2,0x22,0x87,0x2f,0xf4,0xf8,0xcd,0x25,0x93,0x9e,0x4d,0x13,0x61,},{0x43,0x77,0x3f,0x44,0x49,0x06,0x5e,0xae,0xba,0xf8,0x93,0x7b,0xaf,0x75,0x85,0x60,0xb0,0xc4,0xd2,0xde,0x46,0x97,0x78,0x39,0xb3,0xb8,0x73,0xd5,0xd7,0xd5,0xfd,0x8f,},{0xa5,0xee,0x02,0x4c,0xcd,0xbd,0xd4,0xc2,0x1a,0x24,0x70,0x9e,0xc5,0x3d,0xcc,0xb7,0xee,0x17,0x62,0x6d,0xd0,0x0a,0x09,0x3d,0x08,0x84,0xf5,0xb4,0x5c,0x4c,0x9d,0x16,0x91,0x84,0x01,0x51,0xc3,0x3c,0x8a,0xa0,0x7b,0x69,0xb3,0x4e,0x16,0xf6,0x16,0x47,0xeb,0xe7,0x93,0xae,0x4d,0xaa,0x70,0xcf,0xf4,0x8e,0x6a,0xb4,0x2f,0xfd,0xbc,0x00,},"\x18\x4d\xf5\xea\x32\x15\xeb\xe1\x80\x39\x0b\x0f\xf0\x42\xba\x23\x81\x15\x5a\x03\x8d\xc7\x32\xf7\x6a\x01\xc7\xe7\x0f\x82\xd1\xcc\xc9\xde\x9a\x05\x96\xb3\xfe\xe4\x47\x20\x9c\x99\x26\x84\xf6\x43\xdf\x21\xf4\xcf\x9d\x17\x92\x62\x79\x0e\x86\x23\xe4\x24\x72\xdc\x35\x19\x97\xe6\xda\x18\x9c\x07\xe1\xe8\x88\x2c\x07\xf8\x6c\x63\x37\xec\x01\x13\x91\x2c\xf9\x22\x15\xc8\xde\x19\x82\xb8\xfc\x57\xbf\xab\xc5\x5a\x3e\x87\x36\xf7\x36\x10\x42\x9d\x97\xfe\xb5\x1d\x79\x4f\x50\x5d\x0c\x5a\x0b\x3a\xbd\x48\xef\x7f\x55\xa6\x28\xf9\x0b\x85\x67\xa1\xc1\x5e\xa9\xd1\x90\xd7\xbf\x4e\xc2\xbc\x93\x34\xad\xa6\xcb\x92\x80\x8d\xfc\x20\x64\x83\x6f\xcf\xa4\x6b\x96\xfd\x7a\x5d\x6f\x4b\x05\x4d\xab\x09\xb7\x35\x95\xfe\xb8\x9e\xd0\x05\xb9\xec\x9d\x31\x88\x12\x1d\xe6\x96\x96\xd6\x4e\x7c\x7b\xbd\xfc\x1c\x46\x9f\xaf\x14\x8c\x38\xa7\x78\x59\x70\xaf\xe1\xac\xd0\x6a\x92\xc9\x94\x78\xfe\x44\x97\x4e\x3b\xb2\x09\x5e\x44\x67\xe9\xb2\xe9\x96"}, +{{0x0a,0x84,0xba,0xa5,0x4f,0x11,0xcf,0x17,0x09,0x0f,0xec,0x61,0xf3,0xf9,0x40,0x15,0x08,0xa3,0xa0,0x38,0x87,0xac,0xa1,0xa7,0x93,0x93,0x94,0xb1,0xee,0x40,0xa9,0x25,},{0x30,0x9a,0x73,0xc6,0x2d,0x23,0xd7,0x40,0xf2,0xe9,0x3c,0x18,0x58,0x7a,0xc1,0x5e,0x7e,0xc4,0x80,0xd2,0x5a,0xc0,0x79,0x4e,0x10,0xf8,0xcd,0x46,0x1c,0xc2,0xb1,0x30,},{0x4d,0x87,0x0b,0xd5,0x3a,0xf8,0xf1,0x3f,0x21,0x4d,0x99,0x34,0xec,0x90,0x3a,0xc4,0x82,0x84,0x09,0x2c,0xd9,0xb1,0x62,0xa4,0x4c,0xce,0xc8,0x51,0xfa,0x94,0x2d,0xe7,0x15,0xcc,0xda,0x07,0xb7,0x99,0x1d,0x71,0x27,0x23,0xe7,0xa4,0xd5,0xb4,0xf0,0x37,0x4a,0xb8,0x5a,0xc3,0x86,0x7e,0x0b,0x53,0xeb,0xc4,0x6b,0x53,0x0f,0x9f,0xed,0x05,},"\xfe\x70\x01\x7b\x14\x67\x8b\x0d\x3a\xd0\x3e\x18\x3d\x6f\x53\x31\x43\x78\x37\x9a\xb3\xda\x65\xb3\x51\x12\x57\xb3\xd5\x40\x86\xe8\x6f\x20\x31\x13\x90\x21\x39\x1a\xf9\xd7\x20\x85\xff\x7c\x3d\xc8\xc1\xe2\xd9\x1e\x53\x33\x38\x55\x42\x3d\x0f\x78\x5e\x2c\xc5\xf8\xb7\x79\x9f\xcf\x1b\x70\xe6\xbe\xcb\x78\x8e\x53\xe9\x02\x0f\x29\x95\xdd\xb0\xc3\x83\xa1\xf8\x10\x38\xfc\x3d\x54\x3c\xe0\xa3\x8c\x9c\x28\x8a\x9b\xc4\x07\x7f\x42\x77\xdc\xc6\xc5\x64\x22\x63\xfc\xfe\x19\x68\x80\x05\xa6\x03\xf5\x76\x75\xd2\x43\x4f\x3e\xd1\xf4\x6d\x32\xf1\x4e\xae\xb0\x73\xe8\x3e\xe7\x08\x6d\xa2\xfb\x67\x65\x9d\x3f\xb6\x8c\x62\x32\x0b\x77\x27\xb3\xb8\xea\x00\x65\x76\xbc\x2c\x7e\x6b\x5f\x1e\xce\xfa\x8b\x92\xe7\x0c\x92\xc8\x89\x51\xd0\xc1\x2d\x91\xde\x80\x1c\x38\xb7\xca\x5a\x0a\x04\xb4\xc3\x42\x9a\xba\x86\x38\x6e\x96\xe0\x6a\xfd\x20\xd4\xc5\xc2\xfe\x2b\x9b\x42\x73\xeb\x05\x20\x1a\x79\x27\x3a\xbd\xbe\xb3\x7e\xd1\x83\x0d\x22\x6b\x6b\xdb"}, +{{0x38,0x37,0x94,0x23,0xda,0xfd,0xbf,0x25,0xe1,0x9d,0x72,0x31,0xbd,0xdd,0x80,0xb4,0xce,0xfc,0xfe,0x2a,0xed,0x93,0x25,0x84,0xdf,0xa0,0xcc,0x3c,0x9f,0x92,0x32,0xde,},{0x59,0x7e,0x81,0xdc,0xee,0x94,0x48,0xb7,0x7d,0xe6,0x82,0x9e,0x79,0x21,0xc8,0xa3,0x90,0x53,0x5d,0x89,0xa0,0x84,0x94,0x30,0xae,0xd6,0x63,0x64,0xee,0x14,0x0d,0x8b,},{0xd8,0xb5,0x0a,0x88,0xae,0xd6,0xf2,0xa9,0x6d,0x08,0x22,0x13,0xad,0xf8,0xb2,0x51,0x9f,0x6a,0x0b,0xbd,0x30,0xdd,0x3c,0xb0,0xf3,0xfd,0x3c,0xe1,0xc6,0x43,0xfc,0x02,0x99,0x46,0xcd,0x43,0x46,0x2e,0xd2,0x25,0x13,0xf1,0xd6,0x5f,0xca,0x24,0xbd,0xe3,0x81,0x81,0x66,0xba,0xa8,0x6d,0xaa,0x79,0x87,0x92,0xaf,0xaf,0xe0,0xc1,0xa1,0x0a,},"\x36\x12\x5c\xa6\x66\x68\x80\x29\x06\x23\x7e\x63\xa2\xfe\x5a\xe6\x10\xf1\x1a\x7c\xf9\x25\x20\xd1\x9e\x66\x90\xa3\xad\xfa\xfd\x5d\x07\xa7\x84\xbc\x1a\x0e\x18\x52\x73\xd1\x1d\x34\x0d\x5e\xff\x90\x15\x97\xde\xdf\x45\x0c\x46\x99\xd4\x3f\x3f\xb1\x68\xd5\x57\xf6\xc9\xc0\x30\x77\xc3\xcd\xc3\x70\xd3\x48\x32\xcc\xdf\x2a\x8e\x3d\x75\x79\x64\x90\xed\x02\x42\x89\x9d\x25\xdd\xf4\x4b\xfc\x66\xf3\x29\xcf\x4c\x45\x16\x87\x03\xc3\x1b\xc9\x20\x2d\x89\x0f\x39\x69\xff\xd3\xac\x35\xa1\x28\x18\xdc\xa7\x51\xce\xb8\x80\x8f\xe8\x1e\xfa\x26\xa5\xe0\xd2\x00\xc5\xec\x1d\x94\xa5\x09\x7e\xa7\x4b\x64\x98\xfe\x28\x8f\x30\xc4\x8d\x72\x7e\x9d\x3d\x35\xc8\xe1\x2d\x85\x42\x07\x02\x55\x6f\x28\x61\x48\x4f\xfd\x09\xb4\xf1\x22\x65\xcc\x9a\xba\xfe\xb8\x2c\xf5\x90\x02\x88\x95\xa7\xd0\x50\xff\x57\xcc\xf5\xf2\x80\x22\xd0\x16\xab\x40\x94\xb0\x62\xe4\x8b\x66\xfd\x36\xd1\xe1\x96\x26\xe5\x21\x5e\xfa\x40\xfb\x7e\x3b\x70\x62\xf8\x1e\x95\x48\x30\xc9"}, +{{0xf9,0x25,0xd2,0x74,0xaa,0xf1,0xfe,0x1a,0x21,0x65,0x62,0x37,0x38,0x5e,0x97,0xf7,0x78,0x3e,0x78,0x09,0x0c,0x5d,0x42,0x17,0xfe,0xce,0x70,0x57,0xc8,0x0f,0x42,0x6d,},{0x3b,0x0f,0xc3,0x70,0xbe,0x3a,0x4b,0x19,0xa8,0x8a,0xb9,0x98,0xc5,0x95,0x04,0xff,0xb5,0x9a,0x87,0x60,0x63,0x38,0xe6,0x73,0xdf,0x5b,0x3f,0xab,0x4d,0x9b,0xfb,0x8d,},{0x79,0x54,0x9a,0x31,0x7d,0x10,0xa0,0xbe,0x32,0x2a,0x94,0xa1,0x51,0xad,0x11,0xe7,0x7e,0xfc,0x48,0x36,0xcc,0x80,0x06,0xa8,0x50,0x81,0x27,0x3d,0x76,0x02,0xa6,0x38,0x96,0x3a,0x9c,0xaf,0x19,0xc3,0xed,0xf1,0xe2,0x5f,0xad,0x1e,0x9d,0x68,0x70,0x1a,0x71,0xde,0xa7,0x27,0xda,0x6a,0x5c,0x5b,0xca,0xc9,0x33,0x95,0x89,0x22,0x4b,0x05,},"\x14\x3c\xaa\xfa\x5f\x62\xb1\x3e\x43\xdf\xfa\x49\xd4\x20\xfa\x99\xf7\x71\xb1\x92\x6d\x40\xd6\xcb\x2b\xbb\x42\x7f\x27\xb6\xc2\x66\xeb\x3d\xeb\x2d\x8b\xbb\xd4\x7b\x82\x14\xad\x40\x25\x1c\xb1\x90\x7a\xd6\x5e\xb9\x41\x93\xe5\x4a\xd8\x5c\x67\x00\xb4\x18\x9e\x80\xf1\xcc\x01\x54\xc6\x3e\xd1\x51\xa8\xbb\xbd\x30\xe0\x16\x37\xca\x58\xe7\x0a\xa3\xee\x52\xef\x75\xd0\x87\x30\x78\xa4\x05\x01\x4f\x78\x6e\xb2\xd7\x7b\x7f\x44\x22\xf9\x27\x82\x3e\x47\x5e\x05\xb2\x42\x45\xf9\x06\x8a\x67\xf1\x4f\x4f\x3c\xfb\x1e\xb3\x0b\xfe\xde\x7b\x32\x62\x23\x0c\xed\x9e\x31\x36\x1d\xb1\x96\x36\xb2\xc1\x2f\xdf\x1b\x9c\x14\x51\x0a\xcd\x5b\xc1\x8c\x0d\xdf\x76\x35\xe0\x03\x50\x3e\x6f\x71\xe1\xc3\x65\xcd\xfb\x4c\x65\xee\x75\xb4\xde\x06\x94\xaf\x87\x07\x63\x74\xd6\x31\xe6\xc4\xb8\xe2\x40\xfa\x51\xda\xb5\xe1\xf8\x0c\xa2\xa0\x6c\x49\xf4\x2e\xa0\x9e\x04\x75\xde\xfb\x18\x4d\x9c\xde\x9f\x58\xf9\x59\xe6\x40\x92\xaa\xc8\xf2\x02\x7e\x46\x81\x26\xf2\xfb"}, +{{0x97,0x1f,0x80,0x6b,0xe6,0xf0,0x7d,0x41,0xbe,0x88,0x30,0xff,0x8d,0xae,0x70,0x4b,0x08,0x63,0x8a,0xd6,0xcf,0xf7,0x22,0xd8,0x43,0x25,0x38,0x12,0x7b,0x76,0x96,0x25,},{0xaf,0x6a,0xc9,0x8d,0xce,0x20,0x78,0xa6,0xc7,0x3f,0x60,0x97,0xba,0xb6,0x3f,0x20,0x5c,0xaf,0x69,0x53,0xaf,0xa2,0x84,0xd0,0x42,0xbd,0x50,0xa4,0xfc,0xe9,0x6c,0xb4,},{0x20,0x37,0xa0,0xa7,0x67,0x4b,0x84,0xff,0x27,0xd0,0xb2,0x2f,0x62,0xb4,0xba,0xc6,0x5e,0x2d,0xc0,0xf5,0xfd,0xc8,0x99,0xfe,0xb7,0x80,0x0f,0x25,0xc2,0x99,0x81,0xde,0xe6,0x41,0xc5,0xa5,0x0f,0x8b,0x94,0x10,0x97,0x0b,0x49,0xd2,0xd5,0x36,0x58,0xc8,0x9e,0xe1,0x69,0x61,0xdc,0xcf,0x53,0x91,0xa6,0x91,0x8f,0x2a,0x84,0xea,0xda,0x0b,},"\x01\x34\x55\xd0\x49\xaa\x54\xed\x99\x5f\xbd\x94\xe6\x36\x99\x55\x49\x53\x95\xe4\x43\x88\x22\x25\x9b\x10\x60\xe9\xa3\x47\x79\x04\x2a\x1a\x69\x21\x1f\x6e\xa2\x07\x73\x99\xdd\x23\x48\x06\xba\x0b\x35\x3c\xd7\x9a\x57\xe1\xc4\x9b\x25\x0a\xb2\x71\x06\xdc\xde\x57\x6e\xcf\xa1\x15\xea\xe4\x61\xfe\xbb\x12\xd2\xda\x25\xff\xcf\x17\xb7\x15\xf8\xd9\x5c\x2f\x0c\x42\x5d\x5a\x81\xf7\x00\x11\x5b\x70\xd4\x9e\x1c\xfe\x49\xfc\xaa\x14\xfa\x20\x5e\x28\xec\x85\x24\x7f\x1a\x6e\x71\x28\xbf\x3b\xb3\x06\x0d\xc0\x84\x64\xbd\xa6\x53\x85\x40\xd0\xac\x47\x20\x93\xe5\xa0\x72\x0f\xde\x2f\x3d\xc4\x78\x8e\x0e\x9b\x0d\xbf\xe2\xa2\xb5\xf1\xa0\xf3\xf8\x0d\xe9\x84\x02\x5b\x15\xc6\x5a\xf7\x7f\x67\x1e\x1c\x5e\x28\x40\x44\x4d\xe5\xc7\xed\xa0\x25\xe6\xdc\x1a\x3f\xf1\x6e\x26\xcc\x54\xcd\xee\xd5\x6b\xe7\x3f\x9b\x01\xab\x2b\x1b\xc1\x6c\x8e\xf5\x8a\x5b\x76\xdd\x47\x28\x78\x07\xe5\xc5\x0f\x0d\x7c\x0a\x5b\x81\x20\xdf\xde\x64\x5a\x01\x2c\x5c\xf1\x14\x91\xbc"}, +{{0x2b,0xb0,0x65,0x2f,0x8f,0xff,0x69,0x01,0x99,0x11,0x48,0xc6,0x8a,0x32,0x67,0x87,0x72,0x71,0x00,0x6a,0xe9,0x58,0x91,0x49,0xbb,0x20,0x68,0x50,0xcd,0xf5,0x2f,0xb0,},{0xc0,0x3b,0x77,0xbe,0x98,0x3e,0x74,0xa2,0x34,0xc1,0x98,0x64,0x96,0xb2,0x92,0xe1,0x39,0x99,0x2e,0xb7,0x52,0x9e,0x70,0xb3,0xaf,0xad,0x7a,0xe4,0xfd,0xcf,0x8a,0x66,},{0x4e,0x15,0x8d,0xea,0xae,0xc3,0xd8,0x89,0x41,0x29,0x6a,0xf2,0xd2,0x73,0x41,0x01,0x2b,0x02,0x41,0xd4,0xe0,0xf4,0x6e,0x43,0x5e,0x37,0x5c,0x98,0x75,0xe8,0x9f,0x5e,0x32,0xc0,0x57,0xb5,0x27,0xbc,0x34,0x11,0xaf,0x09,0x6a,0x77,0xbf,0xce,0xb4,0x5b,0x98,0x3e,0xfe,0x45,0x5e,0x3f,0x03,0x15,0x5d,0x6b,0xc7,0xb0,0xac,0xc8,0xe6,0x0c,},"\xb9\x23\xca\x67\xe3\x96\xd8\x65\x6f\xa3\xdb\xce\x82\x89\xa3\x8b\xd3\xc1\x28\xce\xfb\x30\xef\xc1\x86\x2b\xb9\x44\xb4\x50\x78\x05\x41\x98\x24\xce\x2b\x83\xd6\x90\xef\x4c\xf1\x07\x49\x28\x17\x14\x3b\xf6\x4c\x02\x49\x89\xaf\x1a\x7d\x2e\x1f\x5a\xc9\x78\x74\xf8\x6b\xb0\xd3\x77\x3f\xf8\x40\xf5\x14\xd9\xa1\x39\x4a\x39\x59\xb0\x11\xd3\xa6\xb8\x16\xa3\xfa\xe5\xde\x17\xb2\xa9\xff\x34\x98\x63\xd2\x7f\xbb\xb5\x0c\xca\x73\x41\x08\x75\x10\x00\xd6\x35\x8c\xa0\x64\x7a\x93\xeb\x49\xe2\xe7\xaf\x06\x28\x7d\x48\xf2\xc0\x9d\x5c\x1c\x73\xe4\xd8\xf7\x7e\xa2\xbc\xaa\x73\x56\x79\x5b\x26\x72\x87\x19\xbe\xd5\xff\xdb\x82\x15\x78\xbd\x5d\x66\xbf\x92\xed\xaf\x8b\x23\x8b\x2b\xbd\x7d\x1e\x2c\x30\xa7\x87\xf9\x01\xa3\x3d\x0a\x76\x66\x9a\x9c\x3c\x7f\x2b\x55\x2c\xcb\x83\x49\xc7\xde\xd5\xe1\xa4\x61\x70\xcf\x28\xe3\x59\xe2\xfd\xd5\x4b\x05\xa5\x62\xf5\x28\xc6\x8a\x56\x97\x4d\xf8\x2d\x46\x66\x37\xc8\xe5\x32\x46\xa7\x21\x7e\x43\x86\x80\x1e\x0e\x32\x66"}, +{{0xdb,0x9b,0x81,0x2c,0xb3,0xc7,0xc0,0x3b,0x97,0x7f,0x48,0x7d,0x3d,0x65,0xcc,0xd9,0xcd,0x2f,0x3d,0xee,0x11,0x60,0x20,0x67,0xdb,0xfb,0x72,0xb5,0x89,0xff,0x3f,0x79,},{0xff,0xa0,0x38,0xad,0x8c,0x3b,0x37,0x8c,0xe7,0x5d,0x65,0x84,0x4d,0x08,0xe3,0xd6,0xa9,0x2d,0x19,0x4a,0x1b,0x78,0x62,0xe9,0xd9,0x72,0x0d,0x20,0x67,0x9b,0x29,0x44,},{0xa6,0x28,0xa7,0x74,0x21,0xb2,0xab,0xab,0x57,0x6e,0xed,0x35,0xd2,0xee,0x3d,0x14,0x56,0x1b,0x21,0xfa,0x14,0xa6,0xe2,0xfa,0xc2,0x63,0xc3,0xea,0xdd,0x79,0xf2,0xfc,0x06,0x69,0xf9,0x42,0x9b,0x91,0x0b,0x84,0x22,0xb4,0xb2,0x9a,0xc0,0x26,0xa4,0x2e,0x98,0xd1,0x81,0xbe,0x35,0x07,0xc5,0xed,0x7c,0x74,0x8a,0x1f,0xdc,0xf1,0xd8,0x07,},"\xa7\x00\x92\xc7\x69\x7c\xd4\xa2\x09\x56\x7c\x38\xba\x7f\xb7\x1a\xa8\xf1\x5e\x58\x27\xa2\x08\x76\x92\x39\x43\xfd\x6a\xdc\x65\x9c\x98\x67\xac\x6f\x58\xa6\x1d\xc7\xce\xc3\xd3\x62\x41\x16\x82\x00\x0c\x1a\x9a\xd1\x29\x5e\xb8\xb7\x0f\x24\x2d\x86\xb5\x86\x5e\xb7\x6b\x87\xe3\xf2\xc6\x94\x1d\x26\x12\xee\x3b\xcd\xe8\xf1\x97\x65\x56\x67\x33\x15\x2e\xf5\x4e\x95\x69\x09\x43\x28\x5f\x78\xb3\x75\xf4\x03\x65\x85\xd4\x73\x9d\xee\xde\xef\x6d\x94\x6d\xb6\x1c\xa4\x58\xef\x4f\x65\x0d\xa9\x63\xc3\x85\xe2\x9d\xfd\xee\x41\x5f\xe4\x95\x84\x5f\x55\x19\x7a\x87\x0f\x8c\xde\xb5\xa0\x10\xba\x6b\xbb\x32\xbf\x1a\x58\x8c\xc7\x74\xd4\x89\x01\x84\xc4\xb2\x92\x4a\x5b\x80\x73\x31\x3b\xce\x22\x65\x85\xf1\xad\xfc\x22\x9c\x90\xbc\x6c\xc9\xd2\x12\xe6\x2f\x05\xd3\x3b\xed\xac\x96\x1d\x77\xcf\x8c\x26\x20\xe4\x51\xde\x81\x7f\x8c\x1b\xb1\x6a\x2c\x59\xff\x80\x4b\x63\x5a\x73\xa8\xcf\x8c\x18\x1b\x3f\x94\x01\xc3\xb6\x43\xd1\x8a\x2f\x70\x6e\xa9\xca\xe4\x70\x71\xa6"}, +{{0xce,0x37,0x9b,0xbe,0x2f,0xa8,0xab,0xcb,0xa5,0x1c,0x7a,0x75,0x43,0xde,0x5b,0x71,0x80,0x77,0x1b,0x3c,0x44,0xbc,0x6b,0x41,0x89,0x2e,0x7b,0x88,0x97,0x9b,0xab,0x90,},{0x7f,0x3c,0xff,0x89,0xf4,0x1b,0xab,0xf4,0xfa,0x64,0xcb,0xa3,0x3a,0x5b,0xb1,0x7f,0x41,0x3b,0xbf,0x2a,0x1e,0x11,0x2b,0x50,0xa8,0xe9,0xb1,0xf8,0x21,0xd8,0x49,0xbf,},{0xda,0x98,0xdf,0xb1,0x89,0x38,0x5b,0x2c,0x85,0x3b,0x6c,0xf3,0x75,0x73,0x80,0x46,0xa8,0xf2,0x7e,0xf2,0x79,0x74,0xab,0xce,0xce,0xa1,0xdb,0x02,0x98,0x9b,0x95,0x1f,0xe4,0x33,0xa6,0xce,0x1e,0x22,0x5b,0x3f,0xa8,0x20,0x32,0xfe,0x06,0x0a,0x7d,0x3f,0x6c,0x18,0x3f,0xd1,0x15,0x7f,0x79,0x1a,0x06,0x4b,0x40,0x76,0x50,0x57,0x16,0x00,},"\x00\x1a\x74\xf0\x95\xc8\x14\xd3\xbe\xed\x67\xa8\xd1\x5f\xc1\x8e\xfe\x23\x5d\xc3\xf6\x45\x78\x12\xa4\x03\x9b\x7a\x46\xfe\x9a\x0e\x9d\xe8\x1a\x7a\x4e\x5f\xba\xb5\xeb\xe9\xe1\xe4\x80\x1b\xd1\x1b\x45\xc9\xf7\xad\x06\x36\xa0\x9b\xff\x42\x16\x4b\xe5\x74\x9a\x04\xc0\x2f\x0a\xb6\x1f\x0e\xcf\xdf\xef\x79\x9b\x82\x7d\xa6\xa2\x74\xc8\xd3\xb3\x9f\x2e\x38\x05\xa6\x79\x12\x87\xee\xdb\x23\x14\xd3\xf8\x42\xb5\x58\xb9\xb4\x89\xaf\xe1\xed\x37\xbb\xbc\xfc\x5e\x60\xa4\x31\xd5\xac\x60\xb3\x9e\x94\x6d\x90\x3d\x6b\xf6\xb1\x40\xe1\x2c\x7e\x07\xf9\xed\x7a\xc4\x6a\x39\x99\xc6\x24\x5c\x8a\xb1\xbd\xb2\x18\x79\xa3\x17\xa3\xdc\xd2\x57\xa5\xc4\xf3\x49\xb7\xf5\x9e\x4e\x43\xd6\x2d\x9f\x1c\xd1\x6f\x51\x8f\x1c\xa6\xca\xd3\x7e\x2c\xb2\x0f\x25\x98\xc4\x13\x42\x91\xc6\xb8\xa9\x8a\xae\x52\x47\xe2\x6e\xef\xb7\x6a\xa3\x8c\x9c\x82\x31\xc1\x7e\x9d\xbf\x27\x1c\xec\x80\xfb\xa5\xb4\xa8\x34\xbd\x9b\xe8\x1e\xa8\x41\x63\x7a\xa9\xcd\xd4\xc4\xbf\x26\xd7\xad\x24\xca\x3c"}, +{{0x2b,0x2e,0xe8,0x09,0xd6,0x47,0x02,0x3e,0x7b,0x77,0xfc,0x54,0x1f,0x44,0x87,0x5a,0x35,0xfa,0x94,0x1d,0x37,0xf7,0xc5,0xb2,0x1f,0xd3,0x49,0x34,0xd2,0x39,0x19,0x35,},{0x2c,0x29,0xd5,0x3e,0x1b,0xf2,0xc7,0x87,0x9d,0x73,0xd2,0x0b,0xa8,0x8c,0xa0,0x7a,0x0b,0x21,0x6d,0x7f,0x6d,0x05,0xd9,0x36,0x63,0xa6,0x5c,0x3d,0x9e,0x10,0x63,0x3a,},{0x12,0xd9,0x06,0x85,0x77,0x55,0x72,0xc9,0xea,0xbc,0x9b,0xe2,0x57,0x4c,0xa9,0xae,0x66,0xf0,0xe6,0x52,0xe5,0x78,0xb2,0x17,0x36,0xcd,0x6e,0x65,0x4f,0x7c,0x6b,0x15,0x45,0x88,0x3d,0x56,0xbf,0x76,0x0c,0xcf,0xc3,0xcf,0x87,0x54,0x4e,0x00,0x04,0xc7,0x98,0x06,0x12,0x57,0xe1,0x30,0x03,0x0c,0xb9,0x97,0xa7,0x88,0x36,0x9a,0x9a,0x05,},"\xc4\x14\x7d\x64\xeb\xfd\xa4\x1a\x1b\xe5\x97\x72\x62\x95\x81\x04\xe9\x40\xc3\x87\x6b\xcd\x5b\x69\x56\xac\xfd\xec\x32\xc6\x60\x91\x4d\x62\x62\x3c\x21\x06\x63\xcb\x2c\xbe\x62\x49\xd7\xf5\x27\x49\x91\xc6\x0e\x95\x0e\x8e\x28\x09\x04\x99\x53\xc6\x95\x81\xd2\x46\x9f\x4f\xe9\x82\xc7\x43\x4f\xed\xd9\xd4\xe0\x0a\xe0\x88\x96\xd6\x2c\xc1\xfb\x98\x4d\xd2\x33\x15\x0c\xc2\x48\x3e\x15\x9c\xff\x40\x97\xdf\x8c\x03\x6b\xb6\x33\x00\x3a\xbb\xfb\xe1\x8c\x8f\xa7\x9b\x5a\x22\x27\x08\x38\x12\x3f\xc9\xbe\x39\xb8\x89\x2c\x80\x38\x4a\x38\x50\x28\xc1\xa8\x1e\xc5\x8c\x8f\x21\x06\x0e\x78\xaf\xd2\xc0\x4b\xfd\x2d\x30\xca\x39\x77\xc6\xed\xad\x51\x8c\xc1\xe2\x00\x4c\xdc\x14\xbf\x3d\x15\xf5\xf5\x28\xe5\xaf\x27\x7f\xa1\x82\x27\x58\x70\xe5\xc0\x12\xf5\xf8\x2f\xb1\xaf\xd0\x4e\xdd\xe4\x57\x8d\xdd\x21\x60\xa1\xa3\xdb\xc0\x50\xe8\x0b\xdd\x81\x1b\xc8\x8e\xad\x79\xbf\x93\xf0\x10\xcd\x0f\xd4\x43\x3d\x0b\xc3\x48\xda\xcf\xd0\x94\x7c\xce\xda\x62\xbf\xa4\x97\x11\xd0\x13"}, +{{0x4e,0xa1,0x8d,0x6b,0x4a,0xf8,0x05,0x3b,0x88,0x5e,0xc1,0x88,0xbe,0x48,0xde,0xb8,0x6f,0xfb,0x2a,0x69,0xa4,0xce,0xc8,0x66,0x37,0xbb,0xd7,0xb4,0x1b,0x80,0x7c,0x46,},{0xe5,0x98,0x60,0x59,0x97,0x62,0x33,0xed,0x77,0x38,0x2c,0x3d,0x99,0x59,0xf3,0x4e,0x31,0x79,0x62,0x69,0x65,0x53,0xe8,0x6e,0xd1,0xe5,0x90,0x2c,0x4b,0xed,0xd1,0x67,},{0x27,0x57,0x0c,0x00,0x2a,0x48,0x7d,0x00,0x0c,0xa3,0x92,0x8b,0x83,0xcb,0x43,0x19,0x72,0x2c,0x46,0xdf,0xb4,0xcc,0xa2,0x60,0xde,0x79,0x0e,0xc0,0xe3,0xc1,0x93,0x26,0x88,0xf8,0x73,0x62,0x95,0x28,0x18,0xb5,0x4f,0x51,0xbc,0x7a,0xee,0xb2,0x63,0xf9,0x60,0xbc,0x0d,0xa8,0x96,0x4b,0xf3,0x12,0xef,0x93,0xe8,0x1f,0x06,0xc8,0x0b,0x04,},"\xe9\xc8\x9a\x1a\x11\x19\x37\x32\x06\xce\x40\xed\xe3\xb8\x9a\x82\xf8\x94\x62\xa1\xde\xe9\xe7\x89\xe9\x84\x5e\xec\x21\xf5\x71\xc0\xfa\xef\xd4\x30\xad\x33\x8e\x4a\x72\xc0\x47\xa3\x9a\x42\x59\x58\x03\x87\xfb\x9a\xac\xad\xdc\x36\xa2\xb5\x1e\x7b\x60\xa8\x7c\xa1\x32\x1f\xf8\x06\x79\x4c\xd6\xdd\x45\x49\xa4\xdf\x45\xc2\xda\xe3\xe5\x39\xc4\xd7\xd0\x6b\x6e\x6e\x9f\x46\x6f\xfc\xa2\xfa\x49\x78\xce\x3d\xc7\x92\xe4\x4a\x62\x83\x88\x0c\xd1\x38\xa7\x5a\x22\x6f\x98\x5d\xa4\x1f\xfd\xc0\xe3\x2a\x5a\x85\xc8\x5f\xe9\xa4\x3a\xe7\x8f\xcf\xe5\x7f\x4d\xd7\x54\x0a\x6d\xd3\x92\x4a\x49\xab\x39\xeb\x69\x95\x0d\x42\x11\x51\xd9\x6b\x1e\x4f\xd3\x93\x58\x90\xf6\x34\xcd\x52\xa7\x3a\x75\x5f\x5c\x2f\xb7\x2f\x9c\xd5\xa2\xe6\x7e\xa9\x30\x91\x5e\x13\x3b\x47\xcf\x6b\x7c\x10\xa9\xd8\x89\xc6\xaf\x6b\x5f\x1f\x4f\x51\x09\x4d\x27\xfb\xba\x22\x8a\xc2\x26\x8b\x34\x40\x27\xfd\x49\xe4\x26\x34\x3c\xc0\x13\x43\x99\xb4\xb5\x10\xaa\xea\x50\x23\x4d\xf4\x2c\x37\xfa\x1c\x4f\x4d\x0e"}, +{{0xfc,0x1b,0x75,0xd1,0x7d,0x38,0x07,0x21,0x73,0x51,0xd2,0xaa,0x40,0xd9,0xb0,0x4f,0x52,0x5b,0x89,0xed,0x3f,0x5f,0xcd,0xb3,0x11,0xbe,0xc2,0xae,0xc5,0xcb,0x7e,0xce,},{0x55,0xe4,0x84,0xe7,0x74,0xa4,0x39,0x2a,0x9d,0x6e,0xef,0xf8,0x35,0xa8,0xfb,0xb2,0x32,0xcf,0x62,0x76,0xa8,0x9c,0x74,0xfc,0x0d,0x1b,0xb2,0x04,0x5a,0x8b,0x21,0xbe,},{0x9a,0x68,0xd1,0x51,0xfe,0xa3,0x90,0x98,0x93,0x35,0x9e,0x60,0xb9,0x6b,0x68,0xb2,0xa3,0xe2,0x94,0x6f,0x2b,0x47,0xb8,0x75,0x39,0x8a,0x1e,0x39,0xeb,0x01,0x46,0x3d,0x35,0xea,0xe7,0xd9,0x76,0xf8,0x33,0xa7,0x62,0xb5,0x1f,0x27,0x26,0xee,0x0d,0xcc,0xad,0x5c,0xe3,0x60,0x05,0x64,0xfd,0x9d,0xd5,0x8c,0x23,0x80,0x7f,0xdf,0xfd,0x05,},"\xd0\x31\xbd\x11\xda\x30\x80\x97\xe3\xbe\xb6\xff\xdb\x26\x00\xee\x6a\x19\x3c\xa6\xd8\x32\x45\x01\xc9\x72\xb1\xa2\x51\x66\xfa\x7a\x36\x9f\x5b\xc8\x82\xea\x45\x61\x2c\xf0\x25\x80\x25\x4d\x21\xb4\x0b\x03\x63\x23\x7e\x83\x5d\xae\x26\x56\xc1\xb7\xf4\x73\x6e\x88\xbe\x53\xd6\xb1\x19\xc0\x7f\x57\x29\xbb\xd8\x2f\x67\xde\x03\x58\x83\x22\x87\x92\x43\xc5\x99\x0a\x7e\x61\xf5\x69\x07\xb2\x41\x71\xa5\x7c\xbb\x0b\xbe\xfb\xa2\x31\x62\x77\xaf\x93\x26\xf9\xcb\xf3\x53\x8b\xcb\xf6\x78\x0b\xe4\x18\x25\xa2\xca\x77\x4b\x41\xbd\xb1\xcd\x5c\x60\x88\x51\xec\x23\x39\xeb\x2f\x4f\xee\xdd\xaa\x89\x1a\x63\x26\xb2\x9d\x97\xd7\xfb\xf3\x11\xe3\xbb\x74\x9c\x5d\x4c\x05\x8d\xcc\x14\xf4\x52\xf9\x33\x49\x91\xe2\x71\xc1\x6d\x65\x08\xc8\x18\x63\x39\x27\xf4\x29\x80\x4c\xa7\xa3\x81\x70\xf1\xb9\xf6\xbd\x73\xed\x67\x5e\x11\xe8\xc0\xd3\x21\xfa\xc9\x12\x73\x0b\x4b\xa2\xf7\xc4\x28\x53\x4a\xdc\xaa\x4d\xad\x31\x4c\x55\x80\x7e\x6c\x64\x2d\x49\x4c\x6b\x2f\x0e\x8c\xd1\x29\x77\x5c\xc0"}, +{{0x0d,0x0b,0xf4,0xd4,0x2e,0xf8,0x10,0xb1,0x79,0xeb,0x84,0x17,0x71,0xde,0x6d,0xbd,0xe7,0x63,0x61,0xca,0xf8,0x94,0xe4,0x2a,0x14,0xb1,0xe0,0x97,0x87,0xea,0x3e,0x06,},{0x71,0x71,0x51,0x0b,0x43,0xfc,0x17,0xef,0xa8,0x0b,0x15,0xe3,0x20,0xb1,0xb0,0xa4,0x08,0x33,0x25,0x42,0xe0,0xd3,0x6e,0x4a,0xb9,0xa6,0x49,0xcd,0x94,0x1b,0x5a,0xed,},{0x24,0x44,0x6b,0xdf,0x03,0x41,0x6a,0x4d,0x08,0x61,0x44,0x66,0xfb,0x85,0x1d,0xb5,0x0e,0x91,0xa6,0x23,0xca,0xcd,0x1b,0x0b,0x35,0x66,0x0f,0x3c,0xf9,0x33,0x20,0x0e,0x15,0x30,0x87,0x08,0xda,0x34,0x99,0xa5,0xad,0x25,0xf0,0xf0,0x30,0x6b,0x79,0x42,0x76,0x2e,0x20,0xa7,0x65,0xb7,0xca,0x9b,0x90,0x1c,0x75,0x0b,0x3a,0x95,0x32,0x0a,},"\x8e\x21\x79\x97\x5d\x0a\x8e\x5a\x69\xfe\x87\x5a\x3c\xb1\xe7\x9a\xec\x49\xc3\x85\x3e\x30\xdd\x03\x20\xfe\x3e\xbf\xb6\x38\xb8\x2f\x89\xad\x16\x43\x03\x6b\x37\xe5\x6e\x0b\x55\xe0\xa9\xe2\x2a\x4e\x28\x3d\x7a\x27\x48\x5c\xe9\x10\x2d\xb6\x78\x7d\x66\x28\xb7\x79\x13\xe1\x08\x96\x77\x4e\x49\x5c\x26\xe8\xba\xb2\x6e\x7f\x9a\x94\xd2\x9a\xaa\x36\xae\xc9\xc2\x6a\xd3\xf5\x0e\x5d\x8c\x0b\x76\x98\xbb\x5f\x01\xb8\x76\xd0\xd6\x5f\xcf\x5e\x9e\x32\xcd\x7b\x89\x82\x9e\xd0\x5b\x0b\x8f\x63\xa9\x38\x58\x98\x5b\xc9\x56\x9f\xce\x42\x9f\xd3\x7a\x21\x1a\xbe\xd6\x50\xf5\x85\xc3\xb5\x59\x00\x44\x3b\x6c\x5d\x6e\x8a\x48\xba\x67\xde\xee\xd0\x7b\x76\xe9\x69\xfc\x88\x43\x0f\xce\x27\x09\xc0\xbb\x5c\xe9\x26\xab\x7f\x44\xe0\xcd\x79\xf4\xec\x35\x9e\xf7\x67\x48\x88\x3f\xcc\x3d\x02\x6e\xdd\x06\xc8\xb9\xcb\xa5\x4b\x99\x0d\x30\xaa\x41\xf1\x44\x8a\x10\x89\x3f\xb0\x53\x92\x80\xc5\x99\xd4\x23\x61\x43\x3a\x34\xcd\xaf\xd8\xeb\xdd\x92\xef\xb9\xc3\x8a\x36\xda\xf4\xc7\x40\x60\xc6\x96"}, +{{0x57,0xb5,0x19,0x4d,0x26,0xab,0xe4,0xab,0x21,0x16,0xc0,0xf0,0x3d,0x23,0xdb,0xe1,0x16,0xd4,0x88,0x25,0xa2,0x5e,0x77,0xd6,0x46,0x48,0xb4,0x36,0x92,0xae,0x25,0xbf,},{0x49,0x9c,0x02,0xdb,0xad,0x2a,0x4e,0xab,0x3b,0x6f,0xf1,0xab,0xa3,0x94,0x4b,0x91,0xc3,0xf2,0x73,0xa3,0x82,0xc5,0x48,0xa6,0xf3,0xa1,0x9c,0x83,0xf0,0xa8,0x67,0x24,},{0x4c,0x73,0x45,0x96,0x0c,0x8f,0xd4,0x8a,0x7d,0xea,0xd7,0x1d,0xbd,0x61,0x90,0x84,0x68,0xef,0xa8,0x65,0xa1,0x35,0x56,0x8c,0x8f,0x9c,0xa0,0x05,0x54,0x83,0x46,0x86,0x17,0xa7,0xe3,0x35,0x84,0x0f,0x57,0xc6,0xcd,0x8f,0x2c,0x98,0x05,0xcd,0x47,0xa9,0xd7,0xcd,0xfd,0xe5,0x3d,0xa8,0xef,0x4f,0x1a,0xdb,0xb6,0xf6,0x98,0xaa,0xf1,0x00,},"\xb4\x81\x3c\x9d\x13\x21\x5f\xe9\xf6\x3a\x78\xff\x7a\xc9\x51\x73\xeb\x81\x0b\x46\x13\xf0\xf4\x8d\x68\x76\xb2\xbd\x3b\x2c\x72\xbc\x7d\x98\xcb\x1a\xc3\x2b\xc4\x1c\xa4\x7f\x09\x89\x6f\x79\x20\x4e\xcf\xb8\x26\x4c\xe8\xf3\xc3\xe7\x6d\xc1\x24\xda\x8d\xdc\x6e\x0d\xfc\x1e\x13\xb5\xa5\x29\xf2\x0c\x82\x61\x3f\xb9\xa8\x2e\x5f\x5d\x77\x32\x6a\x86\x1f\xae\xda\xbc\x73\x25\xc5\x9a\xf3\x3d\xae\x67\x44\x02\x5e\x64\x97\x74\xfc\x4f\x79\x13\x4b\xf9\xf6\xe3\xd5\x87\x5d\xd9\x1b\xc8\xa1\x4c\xc3\x6a\x66\x28\x3d\x01\xd8\xd1\x08\xc1\x33\x27\xec\xa5\x30\x57\xba\x50\xbf\x21\x0c\x19\xf1\x39\xde\x64\x94\x98\x26\x46\x19\x8a\x12\x46\xc2\x71\xb0\xa3\x68\xc1\x0a\xab\x95\xcd\x89\x61\x23\x5d\x74\x2d\xf4\x54\x5b\xe6\x8b\xd0\x10\xdc\x0d\xb2\x3b\x67\x3e\x62\x36\x09\xe4\x20\xee\x76\xb1\x05\x6c\x52\x0f\x9c\xe8\xfb\xe8\xee\x18\x63\xdf\x97\xd1\x7b\x71\x74\x63\x6c\x3a\x2b\x61\x22\x95\x09\x19\x48\x81\x0d\x1d\x4b\x8a\x58\x43\x76\x0a\x28\x87\xdc\x55\xef\x51\x2a\xf0\x41\xec\x54\xfa\xd3"}, +{{0x06,0x8d,0x27,0xb2,0x1e,0x2a,0xcf,0xcc,0x19,0xc3,0xe9,0x67,0x3d,0xd4,0x41,0x42,0xd9,0x8a,0xac,0xae,0x89,0x49,0x30,0xe2,0x0c,0xa0,0x67,0x43,0x9e,0x74,0x9a,0x79,},{0xe2,0x2d,0xdd,0x39,0x6f,0x95,0x5b,0xb9,0x0e,0x28,0x47,0x76,0xaa,0x76,0xe9,0x21,0xe5,0x06,0x99,0xd0,0xca,0x89,0x14,0xa9,0xb7,0xb8,0x41,0xeb,0x5f,0xf4,0x7d,0x6d,},{0x0c,0x17,0x3c,0x48,0x8a,0xd0,0x01,0xcb,0xb9,0xc4,0x3d,0x7b,0x30,0xa7,0xc0,0x71,0xa2,0xfd,0xb0,0x8c,0xf7,0xf3,0x7d,0xaf,0x71,0xd7,0xae,0x71,0x28,0xdc,0x0d,0x43,0xf0,0xf0,0x95,0xb2,0x92,0x9c,0x54,0xb7,0x73,0xed,0x4a,0x1f,0x0b,0xf0,0xdc,0x4f,0x36,0x4f,0x06,0x01,0xe8,0xd5,0xae,0x06,0x2f,0x5b,0x78,0xc0,0x5b,0xfb,0xc7,0x02,},"\x1c\x68\x15\x42\x3d\x1a\x2c\x5e\xbe\x88\x28\xd1\x64\x65\x27\xc1\x7b\x20\x06\xe5\x47\xf0\x16\xb5\x35\x0f\x01\x0d\x79\xb1\x3d\xf4\xfb\x8c\x6e\xd5\x7b\xa9\xc2\x6c\x3c\xb0\xe0\xa6\x41\x78\xb6\x50\xa3\xea\x54\x44\xa4\xfa\xd5\xb2\x0a\x3e\xb8\xca\xa7\x02\x63\x40\x11\xcf\x78\x92\xa0\x72\x7b\x6e\x81\x50\xb0\x77\x04\x29\xa3\x7a\x8a\x0b\xb3\xa7\xed\xb8\x91\xa7\xc9\x02\x40\xbc\x03\x60\xb1\x4e\x6d\xd7\x70\xa9\x90\xb3\x1b\x31\xf3\x3d\xdb\xf6\x53\x98\x8f\x82\x74\x2e\x5e\xec\x31\xb2\x73\x68\xeb\x0e\x4f\x1e\xcf\x4d\x67\x6f\x49\x21\x4a\x52\x0d\x1e\x5b\x2b\xbb\x59\xac\x2e\x13\x26\x7e\x07\xa0\xcb\xac\xbe\xd9\xf9\x4d\x74\x73\xed\x69\x78\x28\xb0\x92\x8f\xcc\x61\x6e\xe0\x2e\x51\xfc\xd8\xdb\x4d\x8f\x75\x33\xb7\xb1\x39\xa0\x5e\x06\xf9\xe0\xea\xe3\x29\x93\xe3\x02\x5a\xef\x05\x90\xb3\xfb\xb4\x29\x2a\x3a\xc4\x07\x65\xe8\x58\x4e\xad\x00\x26\x6a\xcd\xcb\xdd\xe1\x45\x7a\x03\xb7\xd5\x7b\xd5\xc9\xe6\x4f\xb0\x6b\x64\xa5\x0f\x35\xf0\xa1\xec\x34\xb6\xdd\xbd\xe7\x67\xb9\x6f\xfd"}, +{{0xa3,0x4d,0x52,0x56,0x31,0x59,0xe0,0x72,0x3e,0x9f,0x3f,0xd1,0x33,0xbd,0x96,0xe2,0x0a,0xda,0xe6,0x23,0xf8,0xc7,0x98,0x01,0x3b,0xc3,0x6b,0x44,0x14,0x89,0xbd,0xc2,},{0x1f,0xb6,0x58,0xe6,0x45,0xde,0x6d,0x3e,0xfd,0xb0,0x83,0xa7,0x3f,0xbd,0x59,0x2f,0xcd,0x4b,0x80,0x0e,0x03,0xc7,0xbd,0x68,0x1a,0xea,0xe6,0x57,0x6b,0xfb,0xbe,0x2f,},{0x5f,0xab,0x5a,0x71,0x40,0xd4,0x78,0x73,0x68,0x43,0x05,0xaa,0x63,0x53,0xd3,0x86,0x2f,0x5f,0xc1,0x3e,0x54,0xa4,0x0c,0x95,0x63,0xcc,0xea,0xc8,0xf7,0x40,0x08,0xc6,0xc4,0x45,0x63,0x1f,0xa8,0x64,0xe0,0xf1,0xc3,0x45,0xb5,0x95,0x4f,0x80,0x05,0x6a,0xeb,0xa2,0x56,0x62,0xb7,0x88,0x27,0xb5,0xe8,0xe3,0xa9,0x43,0x78,0x13,0x72,0x0f,},"\x1d\x21\x5f\x85\xc0\x89\xf3\x5f\x30\x7a\x74\x6c\x66\xc7\xc1\xe4\x1d\x6b\xa3\x77\x30\xd7\x59\xe6\xe5\x62\x2d\x6c\x6a\x19\x8e\x40\xf6\x3d\x37\x87\x3b\x71\x5d\xf7\x51\x8b\x3c\x6b\xb5\xe9\x5a\x46\x77\x26\xb9\x7c\x9a\x0f\x8f\x5d\xfc\xdb\xfd\x1e\x0d\xe3\x57\x66\x1d\xde\xab\x55\x50\x42\xb9\x45\xfd\x89\x9f\xad\x6d\x38\x2d\x79\x17\xda\x9e\x12\xdf\xbd\xa0\xd6\x99\x00\xb3\x97\x51\x65\xa7\x3d\x0a\xc9\xde\x01\xfd\x30\x48\xb8\xfe\x5f\x0b\x90\xbe\x67\xe0\x3d\xc2\x2f\x65\x3a\x0a\x13\xeb\x4b\x0b\x75\x3f\x3f\x3b\xbf\x78\x73\x69\xeb\xd8\xbf\x5e\x00\xeb\x78\xbf\x0b\x35\x15\xa9\x1e\x68\xb1\xd5\xfc\x69\x20\xbf\x4f\x42\x59\xf8\xa7\x30\xef\xc7\xf1\x01\x6d\x50\x1e\xf6\xfb\x7c\xb8\x36\x6f\xc8\xe7\x16\xcf\xa5\x0e\xa8\xb2\x03\xcc\xa1\xa3\x16\x70\x7e\x0b\x0f\xc5\x7e\xaf\xce\x82\xd6\x2f\x7f\xf3\xae\x04\xac\x8f\xd0\x41\xb5\x5b\x19\xa3\x52\xa6\x9e\x6d\x4b\x79\xd0\xe6\x50\x17\x51\x68\xe3\x4f\xa3\x35\x8e\xac\x81\x6c\xec\xf2\xc8\xdd\x1b\xf2\xa5\x89\x11\x3e\x91\xbb\x81\x8f\x91\xf8"}, +{{0x58,0xdf,0xe7,0x68,0xbf,0x52,0x11,0x84,0x94,0xb2,0x99,0x75,0x15,0x4c,0xf4,0x52,0xbd,0x97,0x46,0xdc,0x7d,0xe1,0xd6,0xbc,0xd1,0x8e,0xe6,0xa0,0x5a,0xcf,0xd8,0x58,},{0x0f,0x14,0x76,0xc6,0xcc,0x2a,0x1b,0x47,0x64,0xaf,0x75,0x80,0x5e,0x77,0x34,0x1f,0x14,0xa0,0xd8,0xb0,0x9c,0x6a,0x5b,0x2e,0xa2,0x87,0xfd,0x51,0x7c,0x3f,0xa6,0xb9,},{0x97,0x71,0x37,0xa3,0x8a,0xf4,0x4f,0x4b,0x26,0x2a,0xbf,0xf7,0xe0,0x72,0x82,0x43,0x3c,0x58,0x92,0x6d,0x56,0x2f,0xbc,0x61,0x80,0xbd,0xe6,0xcd,0x94,0x97,0x86,0x1f,0xb6,0xd9,0x55,0xcf,0x38,0x3d,0x99,0x9f,0xa1,0x03,0x7b,0x8b,0x17,0x54,0xce,0x88,0x8c,0x9f,0xfc,0x15,0x60,0xa4,0x51,0xd0,0xe9,0xdb,0x8d,0x74,0xd2,0x94,0x06,0x04,},"\x60\x97\x94\x20\x1c\x4f\x6f\xaf\x48\x87\x90\xd6\x1d\xbf\xf3\xf4\x1b\x32\x8c\x5b\x06\x95\xcb\xe9\xaa\x8a\x13\x6d\x72\xb4\x97\x7b\x21\xb5\x00\xf2\x16\xe9\xf3\x21\x68\xad\xa8\xc1\x3b\xff\x25\x32\x76\x47\xe3\x0d\x8a\x24\x4d\x74\xd8\x83\x03\xab\xc9\x0b\x7f\x71\xaa\x07\xca\x04\xd1\x7b\xc8\xa0\x16\x7d\x6e\x63\xfb\x88\xba\xa1\xda\xb8\x1d\x50\xf1\xe9\x1f\x46\xf5\xaf\x77\xf2\xe8\x40\x8b\x82\x63\x36\xa3\x50\x52\xef\xff\xdf\x4a\xf7\x95\x96\xaf\x1b\xb2\x25\x9f\x83\xc1\xbc\x10\x9c\xfd\xc3\xdd\x50\xfd\x96\xd3\x10\xf2\x7e\xa4\xc6\xc7\x69\x0f\x21\x81\x5e\xa9\x2b\xd7\x93\x89\x68\x0c\xfe\x3e\xd4\x0c\x80\x18\x11\x90\x68\x8d\x24\x22\x2d\x9a\x1e\xd5\x2c\xe6\xa1\x6b\x41\xdb\xd9\x10\x7e\xb6\xd2\xe3\x59\x4e\x44\x94\xd7\x5d\xd7\xc0\x89\xe3\xb2\x6f\xfd\x00\xd1\x00\x3c\x92\xc4\xc3\x9a\xe5\x38\x2e\xf9\x29\x14\x91\xa8\x80\xca\x4e\xc3\xac\x2b\x86\xe6\x67\x19\xb9\x2b\x6f\x7c\xea\x2c\xb0\xbb\xb1\xcf\x62\x4d\x0d\x1a\xbe\xae\x55\x6e\x5f\x73\x90\x9d\xd5\x46\x27\x70\x37\xec\x97\x2f\xd4"}, +{{0x5a,0x63,0xef,0x9b,0xd7,0xdb,0xf0,0xe8,0x9f,0xef,0x15,0x59,0x83,0x65,0x9e,0x8a,0x0a,0x6c,0xa0,0x02,0xbc,0x42,0xfa,0xd5,0xa4,0x5a,0xf8,0xe0,0x28,0x19,0x23,0xf4,},{0xe6,0x32,0xf4,0xdc,0x99,0x42,0x31,0xcc,0x17,0x90,0xc2,0x1a,0xfa,0xda,0xa9,0x77,0xa5,0x89,0xb0,0xeb,0x0d,0xa1,0x9f,0xcb,0x27,0x92,0x91,0x1b,0x15,0xec,0xf8,0xaf,},{0x75,0x46,0x1f,0x99,0x65,0x0c,0x03,0x68,0x05,0x81,0x13,0xa1,0x5b,0xa1,0x6b,0xd2,0x33,0x7b,0x2e,0x63,0x3d,0xa3,0x81,0x12,0x87,0x8c,0x48,0x34,0xfa,0xc9,0xba,0x2e,0x30,0x7c,0x86,0x6c,0x02,0xaf,0x79,0xbe,0xa3,0x36,0x59,0x61,0x4c,0xbb,0x44,0x65,0xc5,0x7e,0xc3,0xef,0xfd,0x4c,0x47,0x8a,0xe3,0x8a,0x34,0xa0,0x5c,0xf1,0xed,0x07,},"\x79\x6b\xc8\x36\x1c\x6e\x8e\xec\x39\x83\x8b\x24\xf5\x39\x71\xe8\x20\xf8\x23\x61\xe0\x51\x0e\xb4\xde\xf1\xdb\x25\x12\x38\x7d\x6b\xf3\x5b\xbd\xfa\x31\x88\x79\x20\x94\x35\xd6\x88\x7b\x14\x10\xb3\xeb\xc1\x45\x5f\x91\xf9\x85\xe0\xfa\xb1\xce\x1c\x50\x5c\x45\x55\x76\xbc\xa0\x35\x39\xd0\x48\xad\x3a\x0e\xd1\xf1\x1c\x73\xba\xc6\x80\x9e\x2e\xa1\x47\x97\x5b\xee\x27\xc6\x52\x61\xac\xa1\x17\xdf\x0f\xae\x70\x08\xe2\xc3\xc1\x30\xbe\xc5\x53\x3a\xb8\x93\x51\xc2\x14\x0c\x9d\x1a\x62\xbd\xf6\x88\x62\x97\x87\xf9\x54\xe1\xc6\x10\xcb\xb7\x5e\xdb\x86\x20\x9d\x7c\x35\x7c\xd0\x6e\xf4\x19\x31\xdd\x5d\xfd\x1c\x7d\x40\x7f\xa4\xee\x1e\xf2\x93\x93\xbe\xab\x57\x13\x17\x38\x02\xcc\xe2\xd5\x62\x29\xcf\xa7\x6b\x60\x16\x62\xc4\xd9\xa8\x4a\x49\x36\xc5\x2a\xbb\x19\x81\x37\x8b\x71\x7e\xb5\x5c\xb6\x04\xa6\x8d\x34\xf0\x3b\x21\x9f\x32\x22\x6c\xa0\xe6\x69\x34\x8a\x2d\x8d\x24\x53\x93\x0e\xb6\xe9\xc2\xbf\x66\xfa\x4e\x92\xc7\x51\x36\xe1\x48\xcd\xb0\x34\x13\x0d\x3f\x64\x63\x82\xe1\xc7\x15\x79\xac\x70"}, +{{0x8b,0x2f,0x06,0x14,0x1e,0x40,0x11,0x63,0xf9,0x0f,0x67,0x4b,0x04,0xdc,0x90,0xdc,0xb6,0xdd,0x33,0x86,0x41,0x93,0x39,0x66,0x2e,0xcb,0x0d,0xff,0xad,0xf2,0x50,0x0b,},{0x54,0xda,0x93,0x4a,0x65,0x91,0x19,0x19,0x85,0x53,0xfd,0x45,0x66,0xb6,0x60,0xd8,0xd6,0x10,0xad,0xc3,0x29,0x0c,0xb8,0x48,0x29,0xc8,0x94,0x14,0x8c,0xf3,0xf6,0x7e,},{0xd6,0x8e,0x37,0x50,0xdc,0x56,0x43,0x23,0x97,0x40,0x1c,0x98,0xff,0x15,0x29,0xdb,0x9e,0xd4,0x8f,0xea,0x24,0x6d,0xd4,0xed,0x38,0x3e,0xc7,0x4c,0x1a,0x46,0x3a,0xeb,0x78,0x4c,0x87,0xb1,0xfd,0xa8,0xbb,0xce,0x97,0x0f,0xc9,0x7a,0xa9,0x80,0x7d,0xdb,0xe9,0x5d,0x41,0xfb,0x02,0x2e,0xa6,0x8c,0x1e,0x31,0x16,0x54,0xfa,0x1d,0xa2,0x07,},"\x1d\xeb\x25\xd4\x34\x58\x69\x03\x23\xa7\xd2\x6a\x26\x69\x50\x90\x99\x34\x74\xf4\x67\xc6\xfd\xe5\xdd\xb3\x4d\xa9\x45\xbe\x3c\xea\x2f\x6b\x75\x65\x2a\xe2\x1c\xbc\x4f\xd2\x27\x63\xa1\xb4\x55\x83\xe1\xc3\xe8\x8b\xbb\x5f\xea\x20\x49\xb7\x33\x6c\x91\x15\x99\x88\xc0\x15\x26\x82\x4c\xa3\xbe\xf1\x6b\x36\x2b\x92\x02\xb8\xb9\x75\x41\x85\xbd\x61\xbe\xa8\xf5\x39\xaa\xdf\x4a\x1a\xb1\x35\xfb\xc3\x1d\x2a\x8e\x33\x17\x80\x73\x10\x6c\xbb\xc0\x2d\x4c\xd0\xd3\xc8\xfe\xaa\x8e\xb7\x33\x08\x43\x56\x25\x17\x95\xaf\xbd\x78\xac\x3c\x4f\x8a\x3b\xa1\x9a\xed\x75\x5c\x64\x6f\x35\x56\x9c\x7a\x6c\x67\x5b\x6d\x69\x18\xe8\x34\x96\x9a\xca\x03\xf7\x1a\x2e\x72\xcc\xb1\x70\x03\xbb\x75\xb6\x2e\x85\x2a\xaf\x58\xb3\xba\xea\x89\xbc\xd6\x4a\x32\xeb\x14\xa6\xb9\xe1\x0d\xe4\x89\x71\xe5\x3d\x0e\x9a\xc9\x9a\x78\xf4\x2d\xe0\x38\x2e\xf0\xe8\x0e\xd3\xcf\xa3\x43\xf3\x5e\x4a\x99\x83\xb9\xae\xed\x98\x6d\x3a\x57\xf4\x7e\x5e\x46\xd4\x0e\x9d\x67\x73\x02\x80\x9a\x2d\x37\xe4\xec\x01\x1f\x05\x1b\x4d\x03\x1e\xd6\x00"}, +{{0xdc,0x64,0x9f,0xbb,0x1b,0xee,0x0a,0x44,0x81,0x4d,0x6d,0x9e,0x90,0x80,0xd5,0xd9,0x0c,0x1f,0xc1,0x73,0xab,0x5f,0xef,0xed,0x82,0x6a,0x74,0x72,0x3a,0x77,0x4e,0x0a,},{0x02,0x14,0xc8,0x9f,0x38,0x67,0xad,0x2e,0x88,0x70,0xe5,0x0f,0x8c,0x2a,0x62,0x54,0x98,0x6d,0x9c,0x22,0x0e,0x33,0x38,0x41,0x13,0x00,0xcd,0x9c,0x64,0x04,0xd4,0xb1,},{0x0e,0x0c,0x5e,0x4e,0x18,0x43,0x75,0xda,0x4e,0xf7,0xe2,0xa2,0xe4,0x88,0x80,0x50,0xcd,0x84,0xe2,0xfe,0x21,0xd0,0x8e,0x84,0xa8,0x52,0xdb,0x2b,0xe3,0xfb,0xc3,0x72,0xc4,0x72,0xde,0x09,0x54,0xdc,0xd1,0xdc,0x11,0xae,0xc4,0x93,0xc5,0x69,0xf4,0x0f,0xc6,0xf7,0x7f,0x03,0xee,0x52,0x4f,0xb0,0x6e,0xc4,0x0f,0xaa,0x1d,0x6c,0xc1,0x0f,},"\x32\x87\x00\xa8\xae\x58\x1c\x1e\xdc\x4e\x2c\x00\xc7\x8b\xf4\x60\x60\x97\xf9\xbd\x75\xaa\xde\x20\x5a\x24\x3c\x5f\xd7\x43\x4d\x62\x22\xda\x93\x7e\x28\x81\xa2\xe3\xc5\x74\x35\x6d\x4d\x56\x79\x30\x1d\xa9\x9e\x11\xcf\x74\x9c\x27\x92\x1c\x8c\xaa\x2a\xb2\xa5\x64\xd8\x7c\x5d\xf8\xec\xf1\xa7\x2b\x68\x01\x84\x82\x4f\x69\x86\x02\x2e\x3f\xc9\x8b\xd2\xa2\x1c\x34\x55\xab\xf1\x15\x49\x54\xfb\x30\xc8\x98\x82\x94\x7b\x02\xf3\x5a\xf7\xb1\xbf\xad\x05\x23\x7d\x24\x2e\x2b\x74\x83\x2f\xc5\x36\x19\x6f\x2e\x59\xd1\xac\xd0\xc1\xdb\x6f\x19\x43\xd0\xf6\x04\x3b\xbd\x6a\x76\x90\x83\xed\x66\xba\x0e\x05\xa5\x0f\xeb\x0a\xcf\x72\xb6\xc1\x6b\xa9\xaf\x03\x9a\xfb\x7f\xe2\xa4\xaa\xeb\x4d\x06\x18\x1c\x5a\x18\x78\x68\x9e\x67\xa3\xf5\xd0\xad\x39\xe7\x94\xd6\x23\x9a\x7e\x0a\x12\xce\x82\x0c\x5b\xe6\x0f\xd5\xf1\xdd\x79\x70\x2f\x49\xd0\x2b\x79\x75\x5f\xe8\x73\xf5\x78\x5c\x72\xf7\x46\x25\xcd\x7e\x24\x28\x26\x25\x97\xd3\x14\x82\xc2\xc0\x50\x88\x01\xfd\x96\x31\x9d\x61\xb9\x1b\xa2\x53\xa5\xe7\x22\xf4\x14\xcf"}, +{{0x39,0xb8,0x06,0x2d,0xa4,0x3e,0x64,0xe1,0x67,0x67,0x65,0xd6,0x2c,0x7f,0xb8,0xe0,0xa9,0x9c,0x4f,0xd4,0x17,0xd6,0xf7,0xe3,0x31,0x9b,0xb1,0x30,0x44,0x20,0x5f,0x3b,},{0x62,0x27,0xce,0xfe,0x88,0xea,0x4f,0xb2,0x7b,0x37,0xb5,0xf7,0x97,0x77,0x8b,0xd7,0x2f,0xda,0xfe,0xad,0xcc,0xd9,0xae,0xb6,0x7a,0xd4,0x37,0xce,0x08,0xfb,0xa6,0xa8,},{0xc5,0xf6,0x26,0x49,0x0c,0x0e,0xf4,0xe1,0xef,0xc3,0xed,0xeb,0x0c,0xbc,0x3f,0x7d,0xe2,0x67,0x05,0x7f,0xb7,0xb6,0xeb,0x8f,0x0c,0x81,0x35,0x84,0x96,0x5b,0xc5,0xc4,0x21,0xfe,0xed,0xf5,0x42,0x41,0xca,0xe0,0x01,0xec,0x6d,0x5e,0x25,0xc9,0xb1,0xfb,0xa0,0x38,0x5e,0x5d,0xbd,0x95,0xa0,0x6e,0xc1,0xd8,0xae,0x51,0x91,0x44,0x96,0x0d,},"\x74\x0a\xf6\x79\xe3\x06\x9f\xad\x05\x9f\xa4\x82\x5f\xa4\x1c\x59\xfb\xd4\x84\xaa\x64\x93\x03\xc2\x7c\x4f\x7a\x94\x71\x1c\x5b\x71\x3b\x2a\x6b\x89\x87\x85\x9e\x22\x71\xa6\xa7\x1e\xb0\xb4\xa1\x5a\xbd\xe4\xf5\x16\x8f\x6c\xb9\xdb\xdc\x6a\x27\xa2\xa1\x3d\x52\xc9\x72\x08\x96\xa1\xf4\xce\x3a\x53\x45\xee\x79\x3b\x6c\xc3\xad\x80\xd7\xd5\x81\x63\xd5\x45\x5b\x9c\xbd\x07\x3e\x2b\x7a\xdb\xff\x95\x59\x0c\x71\x72\x27\x1b\xd9\x1f\xef\xdb\xd0\x16\x57\xee\x17\x50\x65\x10\x36\xcd\xc3\x56\x0b\x44\x4c\xa2\x18\x4b\xf4\xf3\xea\x89\xfc\x97\x3a\xab\x6f\xb4\xa8\xee\x57\x04\xbb\xe5\xa7\x1c\x99\xfa\x3b\x5e\xf0\xd0\x39\x62\x49\x75\x82\x97\x69\x9a\xe2\x02\xb8\x19\x69\x0d\xc7\xac\x46\x92\x77\x03\x46\x90\x78\x45\xe2\x21\x0d\x53\x63\xad\xee\xc0\x3f\x0f\xc7\x76\x1b\x7e\x0e\xc0\xfe\xa1\xbc\xf6\xb0\x4f\xc5\x4b\x3e\x4c\x40\xd1\x9b\x8f\xa6\x49\xac\x84\x79\xe8\xf8\x07\x30\xc0\xc9\x4e\x9f\x4a\x1a\xd5\x06\xf2\xbc\xab\x0c\x49\x54\x0f\x6d\xec\xaa\x77\xb3\xd6\x57\xdc\x38\xa0\x2b\x28\xa9\x77\xec\xe4\x82\x54\x5a"}, +{{0x52,0xf4,0x67,0x5d,0x8c,0xcd,0x0e,0xb9,0x09,0xdf,0x0a,0x51,0x66,0x48,0xdb,0x26,0xfa,0x03,0x3b,0xa4,0x1d,0x43,0xfc,0x38,0x45,0x89,0x6d,0x45,0x6e,0x14,0x26,0x5f,},{0xf3,0x9e,0x7d,0xaf,0xc9,0x7b,0x0a,0x84,0xdc,0xbf,0x7f,0xa1,0x4a,0x94,0x03,0xee,0x1f,0xa9,0x2b,0x85,0xe5,0xa7,0xe5,0xd0,0x5f,0x03,0x1b,0x44,0xdd,0xf1,0xf7,0x94,},{0x4b,0xf6,0x68,0x82,0x7a,0x72,0x0a,0xf6,0x88,0x98,0xa0,0x6e,0xa7,0xb4,0x45,0x45,0xa3,0x4c,0xa8,0x96,0xec,0xf3,0x11,0xfe,0xea,0x47,0xe0,0x68,0x6d,0x91,0x1f,0xad,0xaa,0x03,0x11,0x89,0x97,0x15,0x3c,0x65,0x36,0x1f,0xea,0x15,0xde,0x9b,0xb8,0x91,0xb8,0x90,0x98,0x72,0x04,0x55,0x08,0xff,0xad,0x0c,0xd9,0xea,0xb2,0x1a,0x97,0x02,},"\x74\x42\x71\x10\x85\x7c\xb4\xaf\x0a\x33\x42\xc2\xb5\x29\x97\xbc\xe1\xa0\xdb\x64\x05\xc7\x4e\x96\x51\xc5\xb8\x59\x79\xac\xb0\x71\xe5\x67\xfe\x70\x41\x2c\x4e\x0d\x8c\x9f\xa4\x21\x91\x4f\x6a\x62\xf2\xae\x42\x0b\x7b\x2f\x4c\xf8\x0c\x90\x57\x42\x21\x22\x22\x88\xb6\x58\x67\xea\xa6\x6e\x7e\x0a\x05\x57\xa2\x6c\x54\x9f\x9a\x7a\x4e\x70\x83\x8b\xa4\x07\x4b\x4c\xd7\xa9\xd7\x58\xb3\x78\xb8\x8d\xd4\x94\x41\xdf\x80\x2a\x44\x4d\xcb\xc3\x06\x24\x93\x3b\x59\x92\x2f\x33\xc2\x0f\x01\x9f\xe7\x8e\xe2\x4b\x8f\xba\x79\xa6\x82\xf3\x88\x50\x5a\xc9\xc9\x7f\x4e\xb8\x7c\x61\x18\x80\x02\x6b\x4c\x23\x30\x6b\x86\x51\x73\xf5\xd7\x16\xab\xc6\xcd\x9a\x99\x06\xdb\x34\x30\x13\x6f\x75\x41\x29\xc4\x43\xb2\x0c\x42\xbe\x2f\xbc\xbc\xd4\x40\x34\xd7\x14\xf5\x8a\x4b\xa8\xe7\x56\x60\x7a\x02\xb6\x08\xef\x49\x64\x8f\x2a\xd0\xce\xa9\x9e\x7a\xb3\x0a\x8d\xd7\x81\x40\x04\xf7\x25\xf4\x93\x01\xd7\xb3\x04\xdc\xda\x62\x5c\x29\x6d\x92\x8c\xb5\x81\x73\x6a\xb7\x39\xc8\x6b\x46\x92\x41\xa8\x25\x93\x51\xfd\x37\xb4\x78\x0a\x99\x93"}, +{{0xba,0xd7,0x3c,0x9f,0xda,0x4c,0xeb,0x9d,0xa6,0xc7,0x01,0xc2,0xa6,0xe2,0xef,0xc0,0x46,0x7a,0xfa,0x0a,0x74,0xf8,0x75,0x0c,0x52,0xcf,0x1f,0xd4,0xc8,0xe7,0x48,0x9a,},{0xbb,0x0f,0x02,0x7a,0x90,0x35,0x37,0x6e,0x1a,0xa3,0x20,0x6c,0x3d,0x77,0x44,0x75,0xe3,0x51,0xf5,0x76,0x7e,0xf8,0x6e,0xf4,0x8a,0x72,0xc0,0x37,0xc2,0x4c,0xce,0x62,},{0x19,0x7d,0x6b,0x6c,0xc8,0x8a,0x98,0xc0,0x6d,0xfc,0xa0,0xc0,0x12,0x25,0xed,0xfe,0x38,0xa0,0xb2,0x28,0x9f,0x29,0xf8,0xa4,0x4e,0xc0,0x81,0x6a,0x95,0x2d,0x58,0x5e,0x2d,0x59,0xb5,0xb0,0x8d,0xe1,0x00,0xc0,0x60,0x62,0x96,0xcc,0xf5,0xe9,0x2a,0x99,0xe0,0x93,0x62,0x31,0x44,0xb8,0xb2,0x2d,0xb8,0x7d,0x92,0x92,0x25,0x54,0x60,0x05,},"\x74\xb9\x66\xcb\x78\x07\x71\xae\xe6\x3d\x73\x4d\xf3\x75\x67\x02\xd1\xd5\xfd\xed\xdf\x32\x13\x6c\x63\x58\xb8\x36\x31\x8a\x4f\x98\x4f\xe7\x1e\x77\x16\xad\xdd\xbd\x64\x9e\xba\x44\xcd\x42\x82\xe0\x05\x5d\x8c\x1e\xd2\xd3\x51\x23\xd6\x6e\x5a\x98\xf1\xc0\x83\x8d\xed\x56\x3b\x9a\x20\xeb\x80\x07\x53\x8f\xc7\xb0\x71\x3e\x7e\x48\x5e\x3c\x28\xf6\xeb\xc4\x21\xa2\x9d\xce\x25\x24\xdb\x7f\x29\x20\x57\x61\x03\x6a\xda\x62\xe5\xb0\xb7\xd5\xb7\xf2\x94\xff\x17\xf3\x38\x23\x2f\xa5\xfd\x42\xb6\xf7\x25\x33\x04\x09\x2d\x84\x8f\x50\x73\x52\x48\x59\x5d\xa0\xf7\xef\x28\xe5\x68\xe9\x91\x6b\xfc\x56\xd7\xed\x0d\x81\x1b\x59\xd5\xd8\x91\xae\x43\xe1\xb1\x98\x07\x13\x06\xbf\x52\x5c\x67\x8c\x63\x43\x99\x80\x05\xfb\xb7\x86\x9d\x1c\x40\xf8\xca\xc8\x07\xfe\x2e\xf0\x3f\x3d\x5b\x93\x3f\x58\x97\x8e\xf2\x90\x6f\xcc\xf7\x44\x4a\x29\x36\xe6\x3d\x92\x8c\x69\x09\x26\xc9\xc9\x94\xed\x3d\x66\x62\x63\xe9\x56\xfd\xfe\xa2\x77\x64\xbc\x5f\x74\x12\x5b\xc4\x6b\xc1\x02\xdd\x3e\x5f\xf9\x3b\x5e\x12\x3e\x4b\x38\xbd\xef\x69\x7e\x15"}, +{{0x70,0x73,0x27,0xa4,0x31,0xdb,0xa7,0x76,0x39,0xb3,0x96,0x6b,0x2b,0xc0,0x95,0xf8,0xee,0xdf,0x57,0xf7,0xa2,0x00,0xe3,0xb0,0x07,0x7c,0xe4,0x20,0x38,0x9c,0x92,0xfe,},{0xee,0x24,0x96,0x91,0x08,0x64,0x18,0x9f,0xda,0xa3,0xc7,0x75,0x7e,0xb3,0xcd,0xa9,0xab,0x1e,0x70,0xfc,0x9e,0x7f,0x71,0xa3,0x8a,0x0b,0xfc,0x84,0x59,0x31,0xc9,0x5a,},{0xfb,0x99,0x02,0x9f,0xec,0xa3,0x87,0xa5,0xd7,0x65,0x96,0x1e,0x36,0x1d,0x71,0x72,0xb9,0x8b,0x7e,0x0f,0x11,0x29,0x0b,0xb1,0xe5,0xb5,0x7b,0x51,0xbc,0x21,0x23,0xd0,0xbc,0xe2,0x90,0x20,0x39,0x2a,0x4f,0xec,0x9a,0xe6,0xa7,0x2c,0x4c,0x38,0x6c,0xea,0x18,0x57,0xcb,0x8f,0x9c,0x50,0xaa,0x9a,0x76,0xd7,0xf1,0x68,0x7f,0xcf,0x29,0x00,},"\x32\xef\x31\xb6\x4e\xee\x70\x0f\xca\x2a\xb2\x1a\x26\x7f\x8d\x9d\x3b\xdc\x68\x9c\x75\x38\xfe\x95\x9b\xf7\x13\xfa\x99\x5d\xb2\xc0\xad\x36\xdd\xe4\x30\xa8\x41\x7d\x43\x7b\x72\xc7\x4e\x26\xdb\xe3\x1d\x93\x70\x1d\x46\x17\xfe\x51\x82\x5c\xff\x7a\x54\x4f\xc9\xf4\x4e\x43\x45\xe1\x4b\x4b\x11\xe1\x5f\x26\xff\xc2\xaf\x80\x35\xf3\xf9\x70\xe4\xdd\xa4\x4c\x0e\xbc\x03\x63\xc2\xb5\x6f\xde\x21\x86\x63\xbf\x78\x83\x90\x92\x53\x8f\xc2\xf3\x91\x53\xd4\xeb\x29\xda\x0c\x1a\x08\xaa\x96\x66\x01\xcc\x68\xca\x96\xe9\x93\xb0\x1b\x17\x3a\x26\x1b\x2e\xf3\x27\x65\x03\x82\xf5\x68\xfe\x94\x48\x55\xb0\xf4\xfd\x9d\x15\xe7\x52\xac\x74\xdc\xfd\x37\xb3\x78\x6f\xff\xce\xf2\x33\x39\xc2\x1e\x92\x70\xdc\xe8\x89\x1d\xd5\xee\xeb\xa9\x60\x8f\xdc\x7b\x6f\xbc\xc9\x9f\xa1\xb5\x90\x3d\xaa\x09\x68\xe1\xb6\x91\xd1\x9d\x06\xf2\x15\xde\xd0\x47\xef\x9d\x76\x61\x0f\x5d\xe2\x20\xf5\x04\x1b\x31\x3f\xaf\x9e\x96\xc9\xfd\x7d\xb5\x4b\x52\x25\x72\x6a\xf4\x35\xf9\xcb\xd9\xfd\x87\xab\x40\xce\x8f\x2c\x69\x40\xb5\x5f\x0f\xaa\xe8\x78\x50\xca"}, +{{0x6a,0xa5,0xc9,0xf0,0x08,0xf9,0x90,0x47,0x3b,0xa4,0xa6,0x28,0x6a,0x41,0x66,0x14,0x02,0x66,0x61,0xf1,0x1e,0x1a,0x24,0xef,0xa8,0x1a,0xc3,0x58,0x52,0xd1,0xd0,0x70,},{0x60,0x5a,0xc9,0xb4,0xdb,0xdd,0x50,0x33,0xd6,0xc8,0x28,0xbf,0xaf,0xa9,0x3c,0x00,0x39,0x44,0x0a,0xa1,0x1c,0xa7,0x24,0xae,0x83,0x40,0x43,0xe0,0x7b,0xd0,0x32,0xd5,},{0x97,0x56,0x30,0x3b,0x90,0x65,0x5e,0x93,0x52,0x51,0x03,0x2a,0xb1,0x9c,0xfc,0x95,0xca,0x1c,0x2a,0x2c,0x3e,0xa2,0x8b,0x03,0x3b,0xd4,0x70,0x66,0xcb,0xd4,0xc7,0xd8,0x98,0x2a,0x8b,0x98,0x86,0xf1,0xb9,0xcd,0x02,0xe8,0x8a,0x65,0x56,0x4d,0xa8,0xdc,0xc3,0x4f,0x30,0x8b,0xa9,0xf1,0x01,0x44,0xba,0x46,0x9c,0x2e,0xfa,0x49,0xe0,0x04,},"\xb5\x16\x5d\x39\x63\xf6\xe6\xf9\xea\x56\x57\xe9\xf0\x7f\xf3\xa3\x21\xeb\x33\x8f\x9a\x8c\x3d\x3c\x42\x30\x6b\x2b\x27\x89\x78\xb3\x1c\x62\x3a\x63\x1b\xe3\xb0\x4c\x41\xed\xfd\xed\xdf\x53\x8e\x1b\x76\x5b\xc8\x78\x54\x01\xc1\xaf\x29\xd0\x46\x7a\x64\x41\x1c\x49\x73\x95\xd7\x55\xdc\xa0\x3a\xe3\x27\x2f\x4b\xc1\xfb\x19\x18\xdc\xc1\xed\x6f\x04\xd6\x49\x84\x04\xa8\xce\x14\x09\xd4\x47\xf5\x70\xa4\x35\x95\x22\xcc\x54\x62\x92\x02\xeb\xe5\x07\xab\x69\x38\x43\x14\x1b\xd5\xea\x05\x73\xb2\x0f\x32\x1a\x48\x3f\xf3\x83\xa4\x68\x97\xf5\x92\x6f\xe0\xb8\xaf\xc2\x55\x72\x70\x7b\x63\xee\xed\x28\x35\x32\x92\x8a\x41\x44\x19\x64\x97\x94\x2c\x57\x2a\xc5\x47\x60\x51\x39\x25\x6b\x0a\xa0\xea\xf0\x4d\xb1\xa2\x56\x01\x2e\xd4\x53\xb1\x73\xee\x19\xad\x6e\x9b\x1a\xf3\xf4\x5f\xf3\x04\x4a\x64\x1f\x8c\x8e\xb0\xac\x7b\xb4\x5a\xbb\xde\xd4\x72\x86\xb2\xa0\x69\xd3\x90\x86\x94\xee\x06\xf2\xfb\xd0\xef\x60\x5a\x79\x11\x02\x6e\xa9\xea\x3c\x49\x13\xf3\x8c\x04\xd8\xb6\x95\x65\xa7\x02\x78\x67\xab\x30\x92\xd0\x5f\x4c\xfb\x18\xfc\x7c"}, +{{0x8e,0xfb,0x8b,0x79,0x74,0x2b,0xe2,0x1e,0x6d,0x31,0xde,0x67,0x8b,0xc8,0x14,0x50,0xba,0x86,0x21,0x08,0x2c,0xd6,0xf0,0x00,0x3e,0x22,0x86,0x1e,0x22,0x91,0xc4,0x81,},{0x33,0x38,0x1e,0x35,0x6c,0x4f,0xd3,0x86,0xa3,0xf7,0xb9,0x69,0xaf,0xd9,0xf5,0xc0,0x0d,0x20,0x67,0xb6,0x98,0xb3,0xf1,0xf0,0x0f,0x37,0x84,0x20,0x2d,0x30,0x84,0xcf,},{0x92,0x30,0x05,0xcb,0x48,0x48,0x40,0x2a,0xa8,0xf9,0xd5,0xda,0x74,0x03,0x0b,0x00,0x94,0x44,0x92,0x4c,0x21,0x4a,0xd6,0x00,0xdd,0xba,0xb4,0xc1,0x53,0xa6,0xff,0x02,0x2b,0x53,0xcf,0x63,0x64,0xcd,0x7e,0xe9,0x9b,0xef,0x34,0xfe,0x14,0x4d,0xa9,0x64,0xed,0xfc,0x38,0xa0,0xba,0x63,0x33,0x12,0x65,0x0e,0xbf,0x0e,0x55,0xa0,0x60,0x09,},"\x6b\x75\x03\x25\xd3\xa0\xf0\x8a\x14\x77\x00\xb5\x1a\x9b\x37\x25\x57\x10\x94\x81\x8e\xd6\x9d\x1f\x76\x10\x13\xeb\x86\xf3\x23\xf7\x3c\x49\xf5\xe4\x39\x87\x7c\x27\x83\xb3\x36\xd1\xf1\xa6\x74\xef\x3e\x43\x1f\xc1\xae\x01\x80\x08\x2d\xf5\xfc\xa6\x9f\x84\x81\x39\xfe\x6a\xb6\x73\x9a\x05\x92\xeb\xd6\xd4\x70\x5c\x7f\x01\x36\xb2\x21\x89\xa1\x1d\x60\xd4\xd3\xc9\xbc\x80\xfe\x7d\x7c\x00\x95\x2d\x57\x42\xf9\xc0\xc2\x12\x1f\xe7\x92\xdf\x13\x3f\x22\x1d\xb9\x91\xfc\x96\x0e\xe6\x4b\x9d\x32\xe0\x17\x8e\x54\x2b\xce\x8e\xfa\x8d\x03\xac\x80\x26\xcd\x77\xba\x8b\xf0\xb2\x42\x15\xb9\xfa\xed\x2e\xae\xc9\x20\xe9\x25\xd5\xec\x46\xff\xf6\xbd\xe7\x25\xe9\x1c\x82\x80\xe4\xad\xa2\x32\xa5\x43\x3a\xe9\x68\x0e\xbb\x53\xeb\x55\x55\x31\x47\xc9\x33\x70\x57\x48\x54\x89\x61\x54\x51\x42\x99\xc0\x93\x21\x9a\x11\x1d\xca\x4e\x63\x7a\xd5\x00\x13\x38\xc6\xd4\xd5\xee\x90\x98\xc6\x58\x32\xf7\xaf\x83\x5b\xcb\x62\x21\x28\x42\x30\x36\xc7\x9a\x57\x37\x73\x8a\x75\x39\xf8\xd4\xa6\xb8\xb2\x21\xb5\x6d\x14\x01\xae\xb7\x4d\x45\x71\xbc\x00\x9d"}, +{{0xed,0x04,0x6d,0x68,0x8b,0x2b,0x0a,0x1b,0xc3,0xda,0xf2,0x11,0x9d,0xd3,0x21,0xa6,0x07,0xb1,0x6d,0x2a,0x2d,0x1d,0x96,0x3a,0xdd,0x12,0x09,0xc6,0x65,0xb5,0xcc,0xba,},{0x87,0x34,0xf1,0xff,0xcb,0xd7,0x1c,0xfd,0xe2,0x90,0x01,0x7e,0xa6,0x25,0x3e,0x58,0x0d,0x59,0xe6,0x5b,0x54,0x1b,0x46,0x52,0x1f,0x5e,0x5e,0xc1,0x45,0x1e,0xae,0xc6,},{0x72,0x1b,0xfd,0x47,0x76,0xcf,0xba,0x13,0x33,0x0f,0xd3,0x72,0x69,0xe9,0x79,0xc1,0xd7,0xb6,0xce,0x54,0xa5,0x1b,0x82,0xf4,0x56,0xe1,0x37,0x37,0x8e,0x58,0x2f,0x19,0x2a,0x12,0x08,0x9d,0xa5,0xab,0xa7,0x6a,0x7b,0x16,0x18,0x13,0xdc,0xe5,0x6b,0x72,0x89,0x2a,0x35,0x33,0x0c,0x94,0xf7,0xff,0x21,0xd0,0x9c,0xf0,0x9e,0x55,0x35,0x04,},"\xb9\xcc\x90\xfd\x8d\xe2\xa1\x41\xf9\x51\x16\xdb\x3b\x04\xbe\x83\xe9\x85\x22\x59\x7e\xc2\x17\x49\x64\x24\x51\x80\xb9\xa4\x73\x76\x7d\x6d\x47\x0a\x21\x7d\xb5\xff\x5a\x1a\xb7\x77\xe1\xe2\x8a\x0b\x16\x97\x5e\x2b\xac\xb8\x73\x02\x04\x44\xb4\x7e\xd8\x32\x64\x21\xb9\x0e\xbb\x50\x36\x88\xf0\x90\xc1\x1b\x3b\x13\x61\x7c\x5c\x50\x52\xc2\x97\xa4\x1e\x28\x93\x77\x5e\x34\xd5\x9a\xda\x49\xd9\x94\xc0\xe4\xa9\xf5\x22\x0e\x9f\x03\x15\xa6\x77\x05\xa3\xec\x08\xaf\x0d\xc7\x24\xb5\xcf\x67\xff\x34\xfa\xda\x8b\xa7\x10\x9e\xd2\xb5\xa8\x90\x7b\xb4\x03\xfb\x1a\x83\x8b\x4b\x05\x9f\x18\xc7\x92\xd7\xbf\xec\x05\xde\xe0\xc9\xcb\xbf\x17\x53\x40\x9d\x7d\xb3\xac\xea\xf4\x7b\x4c\x61\x39\x84\x97\xb0\xec\xa6\xc1\xf8\xac\x08\xa7\xea\x1e\xb9\xc4\x0b\xc4\xe9\x2e\x88\x82\x12\xf7\xd9\xee\x14\xfd\xb7\x31\x58\x16\x09\x44\xff\x9b\xcd\xfe\xf1\xa7\x46\x9c\xc7\x0f\x94\x74\xe5\xf2\x4d\xff\xfe\xa5\x85\xf0\x9e\xaa\xab\x4b\xe2\xaf\xeb\xbe\x8e\x6c\xf8\x6d\x35\x68\x0d\xc5\xd1\xb9\x29\x13\xe8\x48\x25\x6e\xc7\x36\x31\x6f\xd0\xa2\x14\x20\x63\xb0"}, +{{0x76,0xac,0x8e,0x57,0x0a,0x39,0xb3,0xa0,0x23,0x2c,0x45,0x49,0x75,0x37,0xfb,0x21,0x55,0xac,0xec,0x36,0x17,0x86,0x5e,0xd1,0xdf,0x21,0x0f,0x00,0xb4,0x9d,0x1b,0x8d,},{0x31,0x2a,0x3a,0xd8,0x99,0xae,0x6a,0x25,0x50,0x7a,0xe6,0xe4,0x52,0x4e,0x10,0xb6,0x3a,0x6e,0x7a,0xe5,0x3d,0x9c,0xff,0xd3,0x9c,0xf2,0x85,0x21,0xd9,0x35,0x33,0xd6,},{0xcf,0x03,0xf5,0x25,0x91,0x3c,0x44,0x30,0x3b,0x2f,0x80,0x07,0x93,0x93,0xc2,0x1c,0x11,0x58,0x14,0x6e,0xcf,0x99,0x63,0x6f,0x5d,0x97,0xad,0xfd,0xd9,0xf3,0x58,0x39,0x80,0x4c,0x23,0x80,0x4c,0xbf,0x1e,0x55,0x3c,0xfd,0x4b,0x73,0xf6,0x89,0xa9,0x14,0x3a,0xec,0x29,0x8f,0x82,0x76,0xe1,0xe4,0xee,0x08,0x91,0xf1,0xba,0x75,0xde,0x04,},"\x53\xce\xd9\xdb\x2b\x47\x9e\x59\xd3\xed\x64\x3f\x7c\xc3\x78\x4c\x24\xb8\xbd\x4c\x63\x20\x6c\x72\xe2\x3f\xa8\x50\x02\x88\x99\xa4\x1c\xe1\xa8\xbd\xc0\x03\xf1\x2b\x7c\x29\x97\x2c\x9a\x08\xbc\xd2\x31\xfe\x0e\x1a\x0f\xef\x0b\xaf\xbf\xa4\xe0\xe0\x27\xd7\x20\x04\x07\x5b\xa3\x7d\x49\x0e\xb9\x96\x4e\x78\x3b\xb9\x8f\x9e\x50\x3e\x9c\x1f\xd3\xd2\x3f\xb0\x01\x7c\xc7\xc7\xa9\xf8\x6d\x17\x1f\x04\x1e\x23\x55\xd8\xc5\xe6\x22\x9d\x34\xc7\xee\xac\xb6\x35\x8c\xf3\x06\x0d\x5d\x26\x5b\xae\x20\x04\xa5\x58\x87\x86\x59\xa3\x0d\xfe\xd5\xf2\xec\x78\x8b\x4e\x14\x39\x7b\x5d\x00\xc2\x9d\xb5\xd4\xeb\xf1\x66\x39\xa8\xdf\x29\x2a\x3d\x24\xf6\x98\x3c\xbc\xa7\x60\xd9\x03\xe9\x76\xf5\xb6\x98\x64\x2b\xa1\xfe\xd4\x9e\x79\xc3\x8f\x4b\xb3\x94\x6e\xfc\xcc\x9d\x6a\xef\xad\x33\x6d\x55\x8f\x78\xe4\xf2\x05\x42\x2e\x10\x38\x4a\x4e\x53\x1e\x75\x80\x7e\xfb\x38\x9d\x2a\xf4\xca\xb4\x38\x25\xfb\x87\xf1\x96\xa9\x08\x07\x69\xfe\x75\x85\x78\x29\x70\xa6\x91\x8a\xff\xe1\x0d\x20\xd6\x29\xb7\x05\x84\x55\x97\x41\x8d\x69\x9d\xe3\xf1\xde\x85\x4f\x94\xbd"}, +{{0xf6,0x4a,0x66,0xba,0x0f,0x08,0x19,0xf3,0x00,0x14,0x16,0xc2,0x20,0xbf,0x52,0xd8,0x60,0x13,0x0a,0x19,0x76,0x4a,0xa8,0xab,0x38,0xd1,0x5b,0x2a,0xa7,0x5a,0xc0,0x22,},{0x81,0x25,0x25,0x3c,0xd3,0x37,0xe0,0x0d,0x45,0xb4,0x50,0x79,0xb5,0x85,0x34,0x95,0x61,0xe5,0xf5,0x42,0xa8,0x1f,0x6d,0x2f,0xcf,0xd9,0x85,0xc1,0x0f,0xea,0xb2,0xaf,},{0x4d,0xe6,0xf5,0x25,0x08,0x22,0xd7,0xc9,0xd5,0xbb,0x98,0x58,0x25,0x00,0xb5,0xc0,0x85,0xf5,0x41,0xeb,0xdc,0x45,0x0e,0xd1,0xac,0xaf,0x83,0x68,0x48,0x27,0xed,0x1d,0xc7,0x71,0x47,0xaa,0xe4,0xb1,0x9e,0x14,0xa7,0xdc,0x5b,0xbe,0x1f,0x1e,0x4f,0x57,0x71,0xd8,0xa6,0xe4,0xf2,0x35,0x17,0x39,0xaf,0xb0,0x8c,0x80,0x6d,0x55,0x87,0x01,},"\x80\x72\x86\x2e\xd0\xab\x35\x92\x1d\xb5\xec\x2c\xba\x8e\x6a\xed\xb0\x44\x1f\xdf\x47\x49\x10\x06\xc0\x1e\x64\x56\xad\x70\xfa\xe3\xc4\x15\x2d\xcf\xbf\xdb\xb8\xf0\xfd\xde\xc5\xe9\x6b\x12\xbf\x67\x98\x9b\xa9\x67\x93\xf4\x86\x1a\x11\xb6\x39\x09\xce\x8d\x19\xb8\xca\x64\xa5\x44\xb3\x1c\xe0\x51\xfb\xc8\x8e\x06\x28\x06\xd9\x96\x5c\xbd\x29\x67\xb0\x16\x14\xe8\x6b\x53\x2f\xbf\x59\x84\x32\x18\xdc\x9c\x19\xc8\x03\x15\xf0\x44\x73\x17\x19\x37\x10\x92\xa3\xda\x38\x87\x8b\xc4\xcf\x77\xde\x97\x2e\x86\x04\x66\xb8\xfc\x45\xe4\x65\xdc\x3d\x0e\xbf\x94\xbd\xea\x60\xef\x0b\x98\x91\xce\xd4\x1b\x99\x7b\x11\xb3\x1e\xe4\x16\x7d\xb6\x0c\x9c\xfc\x8b\x85\xbe\xac\xfe\x22\x3c\xc1\x82\x92\x13\x77\x40\x85\xd7\xc0\x6d\x2b\x2e\x63\x2c\xc2\x1c\xd9\x66\x0d\xf4\x7c\x4f\xa9\x18\xbd\xd5\x96\xdd\xf6\x22\xdc\xb6\x52\x64\x2b\x67\x52\x7b\xa8\xed\x15\xa8\x19\xa8\xe2\x1f\x48\xd7\xee\x70\x24\x7f\x52\x00\xe3\x7c\x25\x9d\xff\xd1\x7e\xec\x8c\x23\x2f\x97\x0c\xb0\x31\x82\xfe\x39\x64\x13\x29\x93\xf6\xec\xb7\xc4\xdb\x18\xcc\xef\x39\x0c\x9e\xb3\x63\x9e"}, +{{0x84,0x39,0xb1,0xd6,0x0a,0xa4,0x84,0x60,0x13,0x5e,0xb1,0x00,0x2c,0xc1,0x12,0x79,0x29,0x95,0x07,0x9a,0x77,0xe6,0xe8,0xab,0x02,0x0b,0x9a,0xba,0xca,0x89,0x20,0xb4,},{0xea,0xdc,0x3e,0x0c,0x5b,0xdd,0xbc,0x30,0x52,0xc3,0xb2,0xf8,0xb0,0xa9,0x45,0x66,0xc2,0xb2,0xc8,0x79,0xed,0x17,0x03,0x4a,0xc0,0xe6,0xa4,0x5f,0x2b,0x3e,0x32,0xd2,},{0x62,0xda,0x81,0xe1,0x64,0x40,0x82,0x1b,0x59,0x3b,0x6e,0xe6,0x54,0x0e,0x15,0xd1,0xae,0xa7,0x5d,0x23,0xe0,0xa1,0xbb,0xfe,0xdc,0x80,0x8c,0x95,0x48,0xf8,0x7e,0x8b,0xbf,0x36,0x91,0x5a,0x39,0xa7,0x47,0x16,0xf6,0x45,0xcc,0xa5,0x71,0x4d,0x17,0x0a,0xf9,0x07,0x57,0x6d,0x4f,0x37,0x05,0xe5,0x43,0xd2,0xad,0xdd,0xc5,0xff,0x23,0x03,},"\x54\x19\xf6\xd2\x4e\xb4\x66\x35\xd4\xa7\xf8\xea\xb8\x03\xcf\xd0\xd0\x4d\xe0\x92\xaf\xbd\x86\xf2\xa6\x96\x1a\x8d\x1e\xb8\xc0\xd1\x97\xba\x55\xee\x08\xc9\x91\x82\x2a\x5a\xa7\x02\xba\xe0\x33\x7a\xbd\x5c\xa7\xfa\xa1\x5e\x1f\x1a\xe3\x69\x94\x6e\x9b\x81\x21\x6c\x0f\x5f\xc2\x2b\xbd\x44\x33\xc3\xde\x93\xc5\xca\xa2\x74\x16\x83\xbb\xd0\xe1\xa7\x8d\xf2\x8d\xda\x19\x17\x41\x01\x87\x63\x34\xd4\x03\x39\x65\x9f\x02\x1a\xe7\x66\x16\x2c\x6c\xc5\x42\x1b\x79\xcf\x9d\x5c\x09\x0e\xd4\xaf\x07\xec\x84\x49\x30\x35\xbd\x0b\x24\x21\xb5\x33\x68\x42\x95\xbb\xe7\x6a\x70\xfe\xc5\x96\xef\x8c\x89\xc5\xc9\xdd\xa3\xc3\x3b\x77\x35\xd2\xd2\xf2\x0b\x28\xf1\xa5\x40\x2e\x72\xd0\x4b\xa2\x91\xdd\x59\xf1\x4a\xf0\x8a\xdf\x56\xee\xb0\x86\xd7\x69\xc6\xbe\xc3\x45\x18\x91\x37\x23\x45\xfd\x6b\xd0\x2d\xcf\x95\xe8\x03\xaf\x03\x53\x15\x0e\x18\x2e\x32\x3a\xaf\x68\x3e\x03\x6d\x9a\x13\x5d\x2e\x6f\x98\xcb\x4d\x32\x7e\x2c\xe7\xd5\x42\x47\xf3\x59\x2e\xd0\x67\xb4\xce\x76\x27\x17\x4f\x99\x6f\x28\x16\x5c\x9c\x11\xf0\x7e\x5e\xe9\xce\xe6\x38\x51\xc6\xb6\x8e\xa2"}, +{{0x3a,0x04,0x63,0x97,0xf0,0xaf,0xc0,0x72,0xbc,0x7f,0x90,0x7c,0x74,0xd3,0x8f,0xd1,0xb9,0xaf,0xdf,0x27,0xe1,0x4a,0x35,0x34,0x76,0x8b,0x0d,0xd2,0xdf,0x3a,0x1c,0x22,},{0x99,0xcd,0x70,0xef,0x3b,0xe3,0x42,0x49,0x33,0x93,0x87,0x2f,0x54,0xc4,0x7d,0xea,0xa0,0x81,0x02,0x18,0x92,0xd1,0x1a,0x32,0x68,0xf3,0x14,0x5e,0xd4,0xf3,0xab,0xe5,},{0x50,0x24,0xce,0x60,0x25,0x79,0x65,0x68,0x70,0x80,0xc5,0xb1,0xfc,0x7d,0x13,0x01,0xc3,0x2a,0xa6,0xfc,0xc8,0x35,0x49,0x7d,0x9c,0xb2,0x3a,0x74,0xa6,0xca,0x27,0x24,0xf5,0x53,0x53,0xc1,0xb7,0x57,0x82,0x7c,0xa5,0x44,0x0c,0x9e,0xf8,0xf8,0xc1,0x05,0x09,0x13,0xe2,0x0a,0xab,0xec,0x35,0xc4,0x97,0xb5,0x60,0x41,0xb5,0xde,0xb2,0x09,},"\xf0\x8d\xde\xf4\x6c\xc6\xc3\x41\x79\x82\x0c\x98\x61\x37\x51\x72\xfd\xdf\x77\x4f\x8d\xc3\xf7\xd6\x4a\xa4\x32\xda\x8e\x5f\xae\x64\x4c\x0a\x8a\x9e\x69\x08\x51\x7d\x50\x5d\xeb\xd6\x12\x86\x8a\xc6\xda\xf9\x5c\xd7\xe1\x69\x97\x50\x02\x2c\xcd\x4b\x88\xdb\xae\x2b\xbf\x73\x54\x6e\xe4\xb8\x35\xd3\x19\xa8\x42\xda\xe8\xb9\xed\x68\x33\x23\xf3\x1e\x5c\xc5\x79\x19\xbc\x9d\xbe\x3b\xcf\xff\xb2\xad\xa4\x80\x72\x69\x7f\xf4\xa7\xd3\x10\xc9\x1a\xdb\xca\x81\xfa\xf2\x6a\x0e\xb7\xbb\x0c\x40\x4a\xc9\xd8\xdf\xec\x63\xe9\xc6\x4e\x2f\x42\x0c\x07\xd3\x23\xb7\xc0\xdc\x3b\x73\x50\x72\x83\xae\xb1\xce\xe5\x1d\xb4\xe1\xa8\x3a\x69\x2c\x7c\x1e\xa3\x98\xf6\xf3\x09\x40\xfa\xb8\x5e\x21\x38\xd4\xb8\x5a\xa4\xe2\x31\xe5\x42\x4f\x5b\x06\x4e\xd0\x26\xf0\xcc\xb9\x9d\x1c\x85\xa9\xeb\x15\xf5\x93\x4a\x11\x35\x9d\x41\x1c\xf9\x4a\xe8\xff\xa3\x36\x1a\x22\x4f\x46\xba\xb8\x52\xd1\x84\xa2\x48\xb4\xc3\x1f\xe3\xa7\xe7\xf5\x13\x4c\x05\x10\x31\xa9\xf3\x28\xa7\xbe\x4a\x7c\xbb\xb1\xd8\xd8\x63\xa4\x00\xfd\x2d\x58\xda\xa4\x4f\x1b\x9d\x8e\x9d\xdf\x96\x1c\xe6\x32\x2f"}, +{{0x12,0x4f,0x74,0x16,0xa8,0x04,0x53,0xe4,0xcf,0x1c,0xd7,0xb5,0xe0,0x50,0xa9,0x76,0x14,0x18,0x25,0x8b,0xf7,0xd2,0x7b,0xeb,0x7f,0x23,0x23,0x8c,0x45,0x40,0xbe,0x2d,},{0x0d,0xa3,0x4a,0xb1,0x73,0x99,0x01,0x50,0xdf,0x73,0x99,0xb6,0xbc,0xdd,0xba,0x93,0xc6,0xdb,0xcb,0xf4,0xd1,0x76,0x94,0x1c,0xb5,0x07,0x1e,0x87,0x34,0xc5,0xdc,0x92,},{0xb0,0x57,0x21,0x04,0xaa,0x69,0xe5,0x29,0xe3,0x46,0x5a,0x6f,0xd2,0x8f,0x40,0x4a,0x4e,0xc2,0x02,0x76,0xa9,0x93,0xb1,0x72,0x5e,0xb8,0xc5,0xf6,0x50,0xb4,0xa2,0x16,0xf1,0x87,0x1b,0x24,0xe3,0x68,0xcc,0x46,0xcd,0x1e,0xe0,0x17,0x4c,0xda,0x1b,0x5e,0x4a,0xe2,0x20,0x0a,0xa9,0xfc,0x44,0x52,0x2d,0x97,0x5a,0x9c,0x51,0x81,0x49,0x08,},"\x9d\xcb\x98\x73\xff\x05\x4d\xb1\x1d\x0a\x9b\x19\xde\x68\x85\xff\xba\x7f\x0e\x68\x1c\xf7\xfb\x8f\x6c\xd9\x50\xc4\x83\x28\xd1\xf9\x19\xca\x46\x05\x4e\xee\xe6\xc9\xe5\x78\x43\xeb\xdd\xa7\xb2\x4b\xc3\x50\x3c\x4d\x61\x2a\xbb\x1a\x31\x4f\x39\xf5\x82\x21\xd2\xb5\x4d\xc7\x55\xac\xca\x79\x69\x74\x0e\x7f\xa8\xb1\xa9\x52\x3b\x8c\x73\x79\xfd\x39\x52\x53\xf4\xe6\xcd\x05\x4e\xe2\x4b\x75\x61\x3c\x35\x81\xd4\x9e\x19\x24\x6a\x7b\x3b\xe1\xce\xcb\x33\x4b\xe4\x4f\x3d\x62\x6f\xe3\xb7\xb2\x69\xe6\x28\xd4\x45\x80\xc2\x06\x36\xeb\xa2\x64\x2f\x27\x44\xb9\x59\xe6\x57\x57\xd0\xee\x60\x18\x43\xf1\x88\xe9\x5d\x17\x25\x3f\xef\x56\x70\x68\xa5\x40\x5a\x3a\x9e\x67\x7f\xea\x3d\x7d\x55\xf7\xea\xd1\x9a\x3f\x30\xc5\xf9\x85\x67\x1b\x55\xfa\x12\x0c\xb9\xd0\x5f\x47\x1b\x6e\x1e\x8d\x77\x9a\x2c\x80\x3a\x19\xe6\xd0\xd7\xcd\x50\x78\x87\xed\x64\x7c\x2a\x95\x48\x3f\x93\x39\x91\xed\x45\xae\x30\x1a\x2b\x0e\x95\x4a\x57\x03\xd2\x48\xc7\x88\x10\xaa\x0b\x19\x9c\xc2\xbe\xbb\x2f\x1d\x71\xcc\x40\x48\x7d\xbd\x42\xee\xe0\xf7\x45\xf7\xd2\x85\x68\x5b\x1f\xb3\x1b\x15"}, +{{0x25,0xd1,0x3b,0x38,0x37,0x60,0x1b,0x07,0xa9,0x75,0x69,0x3e,0x5a,0x33,0xd5,0x33,0x7c,0x34,0xc1,0x12,0x7f,0xe4,0xc2,0x74,0x90,0x61,0x2a,0xaf,0x7f,0x64,0x2e,0x9a,},{0x3a,0x07,0xcd,0x68,0xee,0x26,0x92,0xd5,0x1c,0xfa,0xd1,0xa8,0x0e,0x77,0x63,0xb1,0x8a,0x04,0x3c,0x74,0xf4,0xe1,0xb0,0x1e,0xdc,0x55,0xba,0x9a,0x9e,0x07,0x79,0x5a,},{0x20,0xcb,0xf0,0x83,0x92,0xfe,0xa6,0xa9,0x9c,0xf4,0x46,0xa9,0x5c,0x19,0x9c,0xaa,0x0c,0x0f,0x98,0x13,0xcc,0x21,0x7b,0x8d,0x22,0x8e,0x2e,0xd9,0x0b,0xab,0x95,0xea,0x92,0xcd,0x73,0xac,0x95,0x83,0x47,0x64,0xd3,0x3e,0x42,0x24,0x3c,0x80,0xa7,0x60,0x34,0x91,0xc8,0xd3,0xe4,0x9a,0xc7,0x15,0xfd,0x8a,0x5b,0x9e,0x47,0x89,0xbb,0x03,},"\x11\x5b\x32\x20\xb4\x5c\xa8\xf3\x6c\x7f\xf5\xb5\x38\x87\xd4\x7e\x66\x9b\x78\xda\xc1\x3b\x98\xcc\x7a\xac\xa5\xc2\xe1\x9f\xce\x81\xec\x86\x17\xca\x41\x0e\x11\xc9\xa9\x11\x8a\x66\x84\x53\xb3\x29\xff\xb7\x18\xea\xec\x73\x91\x72\xf0\xa8\x49\xa0\x84\x81\x92\xa5\xbd\xea\x18\xab\x4f\x60\xd8\xd1\xa0\xd3\x38\x95\x2d\x77\xb2\xcc\x13\xef\xe8\x3c\x76\xe8\xdd\x58\x80\x3b\x1d\x8b\x3c\x97\x29\xef\x10\x2b\x20\x83\x5b\x7d\xe8\x72\xbe\xf3\x01\x0f\x15\xa4\xca\xdd\xf0\x7c\xf7\xbd\xd2\x22\xd8\x4b\x17\x4b\xc2\x15\x27\xcf\xfb\x1b\x7f\xfd\xe8\x1e\x28\x1d\x30\xcb\x7b\xce\x25\xea\x3d\xff\xb6\xea\x1f\xbb\x06\xcb\x70\x56\x9a\x95\xed\x1a\x07\xe9\x7c\xa4\x2d\xe7\x0a\xa2\x18\x15\x9e\xfd\x60\x8f\xa9\xb0\x89\x6e\x0b\x58\x51\x8a\x32\x2f\x25\x1d\x13\x3e\x58\xc8\xfc\x14\x28\xab\x0a\x17\x0e\xd8\x45\xc7\x5f\xb4\x03\xf1\xff\xb9\x7d\x2d\x2a\x6d\x4f\x27\x79\x11\xd3\x26\xc1\xca\xbb\xb8\x51\x6c\xbc\x17\x90\x8a\xb8\x1f\xf8\xd7\x9a\xf4\x46\x11\xea\x1d\x05\x87\x9c\x1e\xc8\x1d\x06\x93\x6e\x0f\x4a\x0a\xef\x6d\x57\x48\xe1\x81\xd3\x0e\xc2\x52\x36\x59\x7a\x97\x3d"}, +{{0x7b,0x3a,0x76,0xde,0xca,0xea,0x60,0xc4,0x1e,0x95,0xb0,0x58,0x77,0xa7,0xda,0x82,0x06,0x4c,0x27,0x27,0x8c,0x8d,0x7d,0xf5,0xf0,0xbb,0x95,0xf0,0xad,0x2d,0x04,0x35,},{0xf8,0x0d,0xb5,0xc2,0x87,0x21,0xb1,0xc6,0x11,0xbd,0x87,0xeb,0x14,0x5a,0x98,0xbb,0xf3,0x83,0xb0,0x68,0x04,0x5d,0xf2,0x45,0x8d,0x1a,0x6f,0xda,0x09,0x9f,0x7f,0xc2,},{0x2c,0xd2,0x6f,0xb3,0xc4,0xf7,0x44,0x0a,0x72,0xaf,0xfe,0x93,0x56,0x4f,0x6f,0x65,0x59,0xad,0xb1,0x5c,0xc7,0xa2,0xba,0x10,0x87,0x9f,0xb7,0xd6,0x7e,0x47,0xd4,0xeb,0xd0,0x2f,0xe4,0x82,0x36,0x98,0xa5,0xfb,0xd4,0xa9,0x07,0xfd,0x69,0x18,0x4c,0x25,0x5a,0x17,0x0e,0x5f,0x17,0x47,0xfc,0xe9,0x68,0x10,0x2d,0xc2,0x19,0xb5,0x0d,0x02,},"\x37\x5f\xad\xae\xdd\x9c\xac\x49\xb6\x4e\x15\x74\x02\x80\x46\x06\x9f\x4c\x83\x65\x4c\x8a\x70\x11\xab\xdb\x64\xdb\x16\xb4\x7f\xa3\x11\x79\x81\x72\xf9\x07\x22\x17\xb0\xa6\xa4\x3e\x5d\xf6\xff\xcc\x11\x54\xbc\xec\x1c\x68\xe1\xd3\x5e\xc0\x58\x80\xd0\x12\xce\x76\xe4\xce\xbf\x30\x1b\xb2\xec\x98\x3d\x00\xb4\xa0\x54\x0c\x93\x7f\xf1\xc6\xdf\x94\x41\xc6\x1b\xdb\x3b\xe8\xe0\xc7\xc1\x1a\x35\xd4\x9b\x6f\x55\xc3\x81\x26\x9a\x0e\x76\x8e\xfb\xd4\x53\x44\x7f\xe4\x8b\x75\xac\x39\x64\x6c\xa8\x2e\xca\x7d\x14\x93\x04\x42\x34\x91\x87\x1c\x10\xdb\xcf\xc5\x97\x3a\x57\xfa\xb8\x37\x1c\x30\xcb\xc4\xe9\x0b\xec\xc0\xb6\x71\x52\x22\x6e\xe1\x77\xb4\xff\x36\x8e\xc8\x79\xb3\x91\xeb\x95\xe3\x6d\xcb\xb0\x7b\x2c\x16\xba\x39\x55\x45\xd4\x52\x9f\x72\x7b\x1a\x11\xef\x65\xd1\x20\x97\x6b\x7c\xcc\x86\xaf\x4b\xd2\x04\xcb\x94\x89\xc9\x21\xe4\x3b\xa5\xe8\x50\xcf\xe5\x98\x99\xf1\xc1\xec\x4a\xa5\xc9\x2b\x6d\xac\x69\x14\xb1\x95\x2b\x53\xdc\xb5\x40\xb4\x09\x23\x13\x81\x56\x89\x87\xbb\x22\x36\xbc\x40\x89\x5d\xf3\xf1\x7e\xab\x7c\x02\x74\xf2\x24\x4f\x95\x86\x12\xe8\x8e"}, +{{0x5f,0xf8,0xd4,0x05,0x26,0x08,0xeb,0x03,0x3a,0x5e,0x94,0xb6,0x03,0xce,0x38,0x4d,0x84,0x52,0xf6,0x0a,0x26,0x49,0x8b,0x91,0x12,0x56,0x7f,0x34,0x10,0xc1,0x86,0x66,},{0xc4,0x90,0x0d,0xe2,0x4d,0x9a,0xf2,0x48,0x27,0x63,0x10,0x99,0x26,0xaf,0x7c,0x48,0x13,0x80,0xfa,0xbc,0xda,0x94,0x40,0xc1,0xa5,0x3e,0xa1,0xcd,0xc2,0x7e,0x65,0x68,},{0xb7,0x37,0xd4,0xe5,0xbe,0x27,0xde,0xb6,0xd8,0x77,0x29,0xc6,0x36,0xdf,0xf7,0xa4,0x06,0xc0,0x13,0xf3,0x13,0xc3,0x8c,0xf6,0x83,0xfe,0x14,0xf7,0x5a,0x3b,0x30,0x05,0xd9,0x53,0x5d,0x7e,0x58,0x15,0xc8,0xf8,0xb3,0x7c,0x51,0xd6,0x92,0x71,0x11,0xc9,0x79,0xf7,0xd9,0xd8,0x1a,0x34,0x7a,0xa9,0xcc,0x09,0xed,0x4e,0x6c,0x18,0xe9,0x0f,},"\x13\x8c\x60\x55\x7c\x2e\x90\x08\xaf\xc0\x3d\x45\xbe\xc7\x1f\x96\x11\x49\xa0\x83\x59\x26\x75\x1c\x8f\xf3\x93\x5c\x7d\x65\x2d\x83\xe1\xb0\xb1\xda\x7d\x5b\xbe\x0b\x8e\x17\x1a\x4e\x49\xaa\xe0\x6f\xd8\xa9\xde\xff\x78\xdc\xde\x4d\x25\xb1\xaa\x89\x99\x98\xa0\xf9\x9e\x1d\xf6\xf9\x33\x7a\x3e\xa2\xf2\x4b\x76\xc3\x17\xa7\x01\x4d\xb4\xe5\x28\x31\x91\x79\x5a\x70\xd8\x82\x1d\x21\x78\x46\x49\x0f\x95\x87\x01\xd3\x9d\xc2\xc8\xce\x47\xd9\x28\x93\x88\x74\xd8\x7b\x35\x58\x98\x9b\xc7\x7a\xf8\x20\x97\x9a\x35\x1e\xef\x95\x94\xaa\x5b\x94\xf3\x34\x1e\xde\xd4\xea\x20\xb0\x8c\x3e\x7c\x56\x10\xd4\x32\x67\x81\x8d\xfa\xc0\xa8\x7d\xdf\x52\x7f\xbc\xe8\x51\x2b\xbf\x85\xb6\x6c\x9b\xb5\xd6\x2f\x0f\xe8\x40\x48\xf2\x3b\x19\x60\x4a\x5c\x8d\x82\xb1\xf2\x5a\x8d\xa0\x27\x31\xfe\xb2\xec\xae\x48\x9b\x84\x75\xf7\xbd\x32\x6d\xdf\x1a\x08\x18\x9e\x46\xc0\x8c\xf5\x05\x38\xc2\xa3\x63\xe2\xf4\xeb\x2c\x01\xa2\x04\xc7\xff\xbc\x0b\x98\x1a\xdc\x0f\xd9\x97\xaa\xfd\xf2\xa2\x22\xee\x84\xc3\x09\xf6\xe9\x5e\xc7\xde\x4f\xa8\x5d\x47\x68\xd5\xc0\x03\x16\x50\x28\x22\x5e\x22\xe0\x9e"}, +{{0xee,0xde,0xfc,0x17,0x57,0xe3,0xa7,0xe5,0xed,0x39,0x46,0xdb,0xed,0xc3,0x96,0xa3,0x62,0xf6,0x83,0xd2,0xc5,0x1b,0x0b,0x9f,0x60,0x76,0x5d,0x4b,0xfc,0x51,0x34,0xde,},{0xa9,0x87,0x2b,0xc2,0x19,0x2f,0xc0,0x2b,0x18,0x9c,0xee,0xd4,0x03,0xab,0x9f,0x27,0x0a,0x03,0x2a,0x83,0x5f,0xde,0xbf,0xaf,0x1c,0x9d,0x69,0x34,0xed,0x83,0x04,0xbc,},{0xd5,0xbe,0xa8,0xea,0x9a,0x5f,0xe9,0xed,0x6d,0x2b,0xf8,0x39,0x93,0x0c,0x0c,0x6c,0xd5,0x03,0x9e,0x98,0x8f,0x55,0x1f,0xde,0xdb,0x54,0x37,0xe1,0xc1,0xaf,0x0e,0xd7,0xb3,0x89,0x7c,0x03,0x57,0x11,0xc3,0xc5,0x19,0x26,0xbe,0x8d,0x1b,0x32,0x02,0x4d,0x5c,0xd5,0x82,0xf5,0xf8,0x36,0x9a,0xd8,0x4d,0x18,0xb1,0x25,0x02,0x65,0x2f,0x07,},"\xb1\x94\xdb\x73\xf9\x94\xcb\xdc\x3c\xbe\x63\x0b\xa7\x2c\x47\xc2\x24\x9b\xc0\x59\x2a\xb5\x47\x94\x2b\x1d\x1b\x88\x2b\x44\xf5\xb3\x85\x5e\x56\x8b\xdd\xdf\x92\xef\x05\x02\x2d\x88\xfc\xfc\x29\x4e\x76\xb6\x4a\x00\xe9\xc7\x43\x55\x37\x37\x63\xe4\x9a\x4e\xbc\x47\x24\x3d\x48\xa9\xad\x58\x89\x94\xa5\x18\xf8\x0f\x86\x15\xc2\xb3\x1d\xa5\x87\xa5\x3e\x52\x9d\x43\x5a\x86\x97\x35\x0d\xfc\xde\x02\xd2\x0c\xce\x7d\x5e\xee\xfe\x3f\x5a\xb2\xaa\xc6\x01\x25\x9c\xda\x38\x53\x8a\x1b\x83\x01\xf9\x83\x2e\x75\xab\x90\xf8\xa9\x32\xf2\x67\xea\xc1\x81\x00\x39\x65\xd5\x26\x6f\x20\x61\x80\xc6\xc3\x80\xec\xe8\x03\x57\x7c\xcb\x46\x17\x6b\xf6\x07\x15\x94\x86\xf2\x42\x59\x74\x7e\x2c\xa6\xfb\x19\x12\xdb\x7b\x78\xa9\x73\xb2\x84\x63\x87\xc1\x20\x80\x30\xee\x1f\x40\x0d\x0c\x5b\x5e\x8b\xde\x96\x35\xae\x55\x63\x8b\xa1\x7c\x73\x4d\xe8\x63\x8b\xb8\x5d\xfc\xd7\x66\x29\xa7\xf9\xf4\x0d\x6a\xb9\x54\xd5\x5b\xf8\x57\x5f\xc9\xc9\xa5\x95\x09\x7e\x08\x93\xdb\x5a\x7b\x8a\x6c\x45\x5e\xcb\xd3\xd2\x2d\x72\x5e\x19\xde\x29\x41\xf4\x67\xf9\xeb\x93\xd6\x6a\x0e\x2b\xbd\xbf\x92\xed\x1c"}, +{{0x09,0xd2,0x2b,0xba,0xa5,0x95,0x6c,0xfa,0xcb,0xbf,0x9f,0xd5,0x51,0x09,0x75,0x12,0x86,0x86,0xc4,0x0c,0x6e,0xa9,0x6b,0x89,0xef,0x4c,0x0f,0x0c,0x64,0x9b,0xcd,0x7f,},{0xe5,0x59,0xea,0x8a,0xcb,0xdc,0x61,0xb6,0x70,0x9a,0x7d,0x83,0xae,0x15,0x84,0x9a,0x6c,0x78,0xb2,0x03,0x92,0x3d,0xd0,0xa2,0x99,0x23,0x9e,0xe4,0x88,0x69,0x30,0xba,},{0xe6,0x52,0x75,0xc4,0x32,0x8a,0x70,0xad,0x62,0x40,0x8e,0xd7,0xfb,0x17,0x28,0xbe,0x87,0xa7,0x3a,0x81,0x4f,0xee,0x8e,0xbd,0x94,0xf2,0x66,0x5c,0x71,0xbc,0x66,0xab,0x0c,0x1b,0x07,0xa6,0x00,0xb3,0x0b,0xc0,0x81,0xa7,0x4c,0x53,0x68,0x57,0xc2,0x06,0x10,0x38,0x4b,0xe2,0x68,0xd9,0xaf,0x3e,0x3e,0xcd,0xdd,0x3e,0xb0,0xc1,0x4c,0x0c,},"\x1c\x26\xa0\xf3\xa1\xa5\xb2\xd7\xd5\xb2\x97\xaf\x8a\x6a\x68\x9d\x7c\x62\xa2\x52\x67\xe1\x97\xd2\x3b\xec\xd2\xf2\xb8\x16\xc4\xde\x92\xfb\xda\xff\xb9\x41\xc3\xfc\x8d\xb7\xa8\x43\x35\xa8\x4c\xfb\xc9\x2c\xb3\xac\x80\x6e\xd5\x8d\xf1\x6b\x6b\x8e\x11\x9a\x48\xdf\x4f\x27\xc7\x1e\x93\x1a\x59\x38\xe7\xd0\x02\x73\x48\x85\xe1\x3a\x25\x8a\x15\xb6\xe1\x13\x6e\xfb\xa7\x2f\x1d\x09\x6b\x68\x9f\x76\x18\xf4\x9c\x96\x80\x63\xe8\xf9\x91\xfa\x0b\x55\x60\x1e\x43\x0e\xee\x13\x49\x2a\x1b\x09\x41\x3e\xb2\x38\x13\x59\x1a\x7a\x9f\x07\x0c\xc3\x96\xca\x9d\x1f\xac\xdd\x4f\x4c\xe3\x7c\x40\xf7\x24\x5f\x55\x03\x5e\x10\xfa\xd6\xb8\x5b\x5f\x01\xa1\xda\xac\xc0\xdf\x94\x06\x9f\x7d\xe8\xf6\x46\x7f\x96\xd1\xfb\x98\x64\x8e\x8a\x05\x20\xa8\xcd\x72\x3c\x98\xe9\xdc\x2d\xd4\xb2\x93\x4d\x82\x28\xf0\xae\x1a\x41\x5b\xd3\xa7\xcd\xa3\x8d\x7a\x99\x83\xce\x1a\xf6\xf8\xc9\x70\xa2\xa5\x91\x63\x5f\xe1\x2b\x91\x75\x36\xef\x81\x5e\xaf\x1a\x31\x38\xd7\x0c\xe7\x0a\x79\x42\x64\xd7\xc9\x86\xd9\xee\x32\x90\x44\x5f\x15\xa9\x24\x8f\x27\x65\x27\x1e\x5a\x99\x21\x96\xae\x33\x1a\xbd\x41\x64\xbf"}, +{{0x77,0x82,0x6e,0xd3,0x51,0xa3,0xf0,0x92,0x54,0xae,0x56,0x92,0x88,0x5d,0x77,0x4c,0xb3,0xf2,0x44,0x10,0xa4,0x80,0x9f,0xd9,0x0f,0x8a,0x00,0xda,0x9a,0xee,0x99,0x03,},{0x3e,0xac,0x8f,0x41,0xee,0x73,0xe6,0xef,0x13,0x68,0x21,0xf7,0x95,0x7a,0x1c,0x27,0xe1,0x56,0x38,0xd0,0xe3,0x91,0x6e,0x6c,0xaa,0xc6,0xfb,0x7b,0xeb,0x7b,0xcf,0xb0,},{0x97,0x7a,0xdc,0xcd,0xb8,0x29,0xb4,0x0b,0xbd,0x8e,0x53,0x85,0x6a,0x78,0x3d,0xb3,0x46,0xa3,0x9d,0xff,0x62,0x04,0x1a,0x29,0x72,0xd2,0x90,0x09,0xf1,0xc9,0xff,0x81,0xb8,0xad,0x54,0xcb,0x90,0x1e,0x49,0x7c,0x1d,0x30,0x21,0xb5,0x0b,0x6c,0x69,0xee,0x73,0x55,0x8f,0xd7,0xbe,0x05,0xd6,0x25,0xf5,0x72,0x7f,0x9a,0xf2,0xce,0x87,0x02,},"\x1f\xf0\x6c\x0b\x39\x99\xce\xcb\x19\x00\xa4\x7d\x26\x7b\xea\xfb\xb3\x5d\x93\xd1\x4c\xb2\xc8\x92\x5e\x3e\x3f\xe5\xd9\x67\x58\x69\x25\xee\x4b\xaa\x41\x99\x8e\xdd\x01\x03\x20\x58\x10\xaa\xd5\xc0\xbb\xdc\x77\x87\x44\x76\x81\x02\x46\xd1\x30\x89\xa6\x4d\xb5\x76\x42\x4f\xae\x0b\xed\x96\x64\xa4\x2a\x49\x11\x47\xd1\xee\x3b\x9c\x3b\x1b\xa4\x87\x5b\xe1\x54\x62\x39\x25\x40\xf9\x97\x8d\x9a\x46\x30\xba\x4c\x52\x54\x99\x75\x1a\x45\xef\xc2\x99\xec\x7d\x73\xb1\x7f\x9a\xd2\x75\xee\x71\xa6\x87\xe7\x26\x90\xd7\x32\x02\x42\xd2\xdc\x2b\xd4\xd5\xc5\xcf\x0f\x17\xa4\x65\x18\x5d\xcf\x60\xf8\xef\xff\x53\x90\x3f\x20\xb0\xc2\xab\x21\x92\xd4\x43\x68\xf2\xf2\xfb\x36\x04\x8a\xf0\x71\xf7\xaa\x85\x7b\x14\xad\x1d\x11\x46\x12\x05\xbe\xbe\x17\xe0\x2b\xe2\xe3\xcc\xb6\x09\x28\x21\x88\x5c\x4e\x0d\x48\x11\xbe\x3f\x45\xb1\xfe\xa0\x88\x45\x3e\x02\x24\x32\xf5\x62\x56\x2b\x43\xa3\x55\xcb\x56\x27\x0c\xed\xb6\xc2\xc4\x2d\xbf\x9b\xe8\x50\xe7\x71\x92\xfd\xc6\x5c\xfd\x36\x83\x4b\xe9\x88\xdb\xe9\xa9\x3e\x25\x18\xc1\x38\xb0\x90\xfb\x9d\xa8\x27\xcb\x1c\x91\xc8\xfe\x52\xfe\x7c\x57\xf7"}, +{{0x99,0xa9,0x95,0x31,0xc3,0xcd,0x6e,0x3e,0x9c,0x90,0x0a,0x9e,0xeb,0x26,0x26,0x7e,0x72,0xf0,0x9d,0x11,0xb6,0x51,0xa8,0x97,0xeb,0xb7,0x9b,0xe0,0x16,0xf6,0x4c,0x6e,},{0x9b,0xf9,0xf8,0xb4,0x8a,0x27,0x28,0xe0,0x26,0x08,0xfc,0x19,0x89,0x9d,0x21,0x96,0x56,0x83,0x9d,0x1c,0xc1,0xe9,0xa8,0x98,0x4d,0xf6,0x74,0xec,0x26,0x66,0x2f,0x41,},{0x0e,0x89,0xda,0x5d,0x94,0x9c,0xf2,0xbf,0x40,0xc7,0xe1,0x7c,0x2d,0x0f,0x9c,0xea,0xbc,0x88,0xa0,0x92,0xeb,0x4d,0x49,0xcf,0xbf,0xea,0xb7,0xc8,0xbf,0xf4,0x32,0x45,0xc6,0x7b,0x9e,0x2e,0x92,0xf9,0xbc,0xb9,0xb3,0x4b,0x3f,0xcf,0x8b,0x01,0xfa,0x2e,0xa7,0xa9,0x64,0x9f,0x81,0x4c,0x3a,0xa9,0x8b,0x3d,0xd0,0x45,0x40,0xc3,0x1d,0x09,},"\x7a\x89\xc0\xc1\x95\x2f\xdc\x42\x98\xdc\xae\xa8\x54\xef\xc1\x34\x65\x6b\xe1\x47\xe9\xe8\xe8\x2f\xc9\xa4\x49\x05\x9d\x80\x57\x0f\x75\x67\x6b\x81\xc4\xa9\x4f\x76\xa9\x68\x20\x0c\xde\xb0\x98\x8c\x73\xf5\x9a\xfc\x72\xad\x4c\x31\x03\xe1\x9f\xe6\x3b\x7e\x95\xe1\x40\xb5\xcb\x2e\xfc\x7b\x97\xa6\xff\xbb\x6c\x29\x8d\xda\xce\x3b\xe6\xd2\xed\x3d\x59\x8b\x8b\xdf\x0c\x2f\xe6\xc9\x76\x02\x14\x2a\x76\xe9\x78\x51\x4c\x19\x6c\x1b\x9a\x88\xef\xdc\x19\x25\xfc\x50\x61\x55\xcf\xf9\xa2\xf2\x1a\xb6\x34\xe2\xb9\x3e\x96\x92\x8a\x5d\x8f\x7c\xe4\xcb\x73\x26\xd9\x68\x94\x69\x24\x2b\xa9\xc6\xa0\x1b\x77\x49\x6b\xad\xef\x87\x57\x8f\x5a\x17\x28\x4e\x90\x0a\x72\xdf\x14\x1c\x61\x99\xb0\xe7\x1a\xb5\xda\x43\x75\x03\x76\x17\xec\x61\x96\xd4\xf4\xe2\x3a\xe2\x91\x6a\x72\xd0\xfc\xe7\x96\x02\x23\x05\xac\x9f\xbb\xbb\xe4\x70\x5b\x34\x0e\x42\xb7\x8e\x1c\x02\xbb\x10\x01\x86\x0c\xdc\xaf\x71\xed\x89\x25\x5d\xd5\x6c\xc0\xb3\x1c\x59\xd4\x59\x6d\xce\xf8\x4e\x22\x23\x4b\xe5\x62\xbd\x80\x1e\x94\x11\x1d\x83\xa7\x80\x64\xc9\x0f\x9d\x82\xfc\xe9\x1f\x68\xab\xb0\x3c\x73\xb6\xbd\x8d\x7e\x02\xd4"}, +{{0xaa,0x58,0x40,0x3e,0x76,0x3b,0xac,0x40,0x5d,0xb0,0x65,0xeb,0x11,0xeb,0x6b,0xe3,0xe3,0xb6,0xcf,0x00,0xec,0x4a,0x22,0x2b,0x52,0xbf,0xf4,0xb6,0xe3,0xd1,0x56,0xac,},{0x16,0x7f,0x9b,0x9a,0x46,0x65,0xf9,0x3f,0x5d,0x7d,0x30,0x16,0xac,0xe6,0xfb,0xd1,0x34,0x20,0xb2,0xe5,0x1e,0x72,0xbd,0xe5,0x9e,0xed,0xf2,0x69,0x93,0xb6,0x6c,0xae,},{0x64,0xb5,0x98,0xca,0x5b,0x8f,0x9a,0xe7,0x42,0xe4,0x6e,0xe0,0xd8,0xc1,0xaa,0xf3,0x14,0x58,0xb5,0x0c,0x25,0xd2,0x67,0xa6,0x77,0xe4,0x4b,0xe5,0xb7,0x55,0xf1,0x4d,0x51,0x80,0x1a,0x30,0x39,0x9b,0xfc,0xc3,0x8d,0x14,0x07,0x1a,0xa0,0xae,0x93,0xda,0x82,0x5a,0x58,0x1a,0xb6,0xc2,0x07,0x25,0xa0,0xa9,0x10,0xb4,0x73,0x5d,0xfa,0x0b,},"\x3b\xaa\x09\x98\xff\x02\xb3\x2b\x90\xb5\x1f\x9a\x84\x0c\x7b\x5c\x58\x70\xcf\xb1\x81\x0a\x9b\x0f\x77\xb5\x59\x09\xd4\x7a\xd3\x35\x14\x7a\x99\x1c\x29\xfb\xeb\xfc\x59\x2e\x93\x07\x17\x5c\x19\x64\x12\x9a\x2d\x5e\xfc\x62\x15\x80\x74\x53\xbc\xd7\x26\x96\x97\x81\x22\x2b\xca\xd1\xc9\x9a\x49\x74\x8b\x9e\xe6\x67\xc4\xd0\xc8\x28\x89\xe2\xf5\x00\x64\xc1\x15\xdb\xd8\xfb\x48\x3d\x72\xab\x0c\xca\xdf\x76\xbd\xdb\x2d\xc7\x27\xdb\xc3\xfa\x5c\x46\x24\xc2\x83\xd8\x92\x1c\x8a\xa4\x42\x51\x10\xdc\xdd\x69\xc0\x5e\x5e\xd5\x9b\x35\x96\x25\xee\xaa\xec\x1e\x27\xea\xfe\x9d\x9a\x5c\xe7\x36\xc3\xf9\xc5\x27\xea\x54\x78\x18\xb9\xbc\xa6\x81\x1b\xe4\xcc\x15\x05\x8a\x6f\x5b\x68\x33\x03\xb8\x0c\x90\xc9\x4a\x83\xb8\xb1\x58\x69\x71\x3a\x66\xb1\xe0\xf6\x56\x33\x1b\x28\x6d\x1e\xf7\x69\x88\x34\xab\x3e\x13\x84\x17\xaa\xd6\xbb\x3a\xb3\xbd\x9f\xc7\x87\x61\xa4\x82\xdf\xc6\x54\xf3\xf8\x62\x8c\x8d\x9f\xc1\x60\x18\x89\x8f\x16\x41\xe8\x62\x2b\xd2\x72\xe3\x8d\x41\x70\x6c\xb9\xce\xbe\x6e\xe5\xe1\x73\x57\x6b\xf6\x1b\xb1\x18\x8c\xf2\xf3\x9c\x62\x22\x0b\xba\x88\xfc\xb4\xde\x48\x98\xb2\x5b\x04"}, +{{0x10,0x44,0xee,0x37,0x08,0xc0,0xb0,0xe9,0x09,0xa8,0xcb,0x2b,0xa2,0xcd,0x0a,0xf8,0xd2,0x8a,0x5d,0xe0,0x1d,0x96,0x2e,0x82,0x60,0x87,0xfb,0x23,0x2d,0xf7,0xb2,0xd2,},{0x46,0xd2,0x41,0xea,0x0c,0x70,0x2c,0x18,0x89,0xd4,0x46,0x55,0x82,0x46,0x29,0xb6,0x72,0x84,0xd4,0xe6,0x44,0xa4,0x8f,0xa4,0x54,0x55,0xd2,0x7a,0xc5,0xf6,0x25,0x29,},{0x7d,0x6b,0xed,0x7f,0x87,0xd0,0x90,0xab,0xe0,0x13,0xc3,0x1e,0x12,0x03,0x90,0x3b,0xac,0x9c,0x93,0x44,0x5d,0x06,0xc7,0xb5,0x3d,0x31,0xd1,0x5f,0x97,0x0d,0x88,0x64,0x7a,0x7e,0xd2,0xc3,0xa6,0x30,0x50,0xba,0x19,0xd6,0x80,0x43,0xaa,0xdd,0x18,0xbd,0x86,0x1d,0xe1,0xac,0x47,0x15,0xb8,0xe8,0x28,0xb2,0xb1,0x6f,0x8a,0x92,0xb0,0x01,},"\xb8\xa4\x45\x45\x5f\xb6\x6e\x17\xe3\x14\x3d\x35\x20\x4c\x9e\xa9\x34\x74\xee\xbe\xef\x93\x96\x3e\xe5\xc1\xd3\x77\xca\x21\x7a\xcd\x4c\xa6\x3e\x57\x55\xda\x08\xfb\xff\xdb\xd4\x35\x2b\xf1\x65\x19\x38\x96\xc8\xd6\xf7\x6b\xb4\xcd\x3b\xc2\xd3\xa4\x76\xa4\xe3\x20\x82\x4a\x12\x10\xce\x74\xd0\x01\x4d\x74\x7f\x11\x1e\xec\x31\x0c\x5c\x89\xed\x4d\x08\x50\xe8\x11\xf8\x0a\x8b\xb2\x8d\xca\xf6\xf4\x11\xdf\x83\xe2\xc1\xdf\xd9\x0c\x4a\xd2\x35\x61\x45\x4e\xb5\xd7\x56\xb6\x3b\x4e\xa7\xf3\x7d\xc5\xd4\x66\xc1\x6e\xf7\x0d\x11\x19\x0c\x4f\x53\x16\xfe\x2a\xa8\x59\x74\x40\xe8\x8b\xbe\xba\xeb\x35\xea\x5f\x04\xf0\x7b\x03\x39\x26\x41\x58\xef\x90\x9a\xd5\x16\x3b\xfc\x24\x8c\xd7\x24\x13\x3e\x27\x4f\x81\x26\x95\xf2\x90\xe5\x71\x76\xa9\x6b\x93\x93\xd0\x7b\xb3\x10\x29\x9f\x5d\x2a\x6b\x6d\xd1\xda\xbc\xb5\x1b\xf2\x9c\x5a\xfa\x7e\xbb\x07\x01\xc6\xc8\x47\x67\xac\x13\x77\x93\x09\x1f\xe0\xed\x6e\x47\xd7\x80\x62\x8a\x32\xc8\x4f\x83\xe0\x0e\x9c\x16\x74\x2a\x52\x3e\xcb\x63\xc2\x4f\x4a\x33\x8e\xd2\x99\xa0\x61\x94\x92\x4f\x44\xc5\xa5\xd3\xc9\x37\xff\x9b\x09\x45\x98\x2a\xd2\x4a\x2d\x1c\x79"}, +{{0x95,0xdd,0x1a,0x5e,0x65,0x8f,0xa6,0xc8,0xd4,0x25,0x07,0xb3,0xe5,0xb8,0xed,0xb5,0xba,0xec,0xa6,0x2d,0xeb,0x00,0xfc,0x5d,0x4d,0xca,0x8e,0x1a,0xb5,0x83,0x5e,0x59,},{0x3a,0x53,0x23,0xdd,0x1e,0x07,0xf3,0x23,0xbb,0x6d,0x83,0xe9,0xc2,0xdb,0x92,0xa2,0x9f,0x62,0xe2,0xe0,0x03,0xee,0x0d,0xea,0xcd,0x7e,0x2e,0x4e,0x03,0x0d,0x8d,0x27,},{0xd0,0x2a,0x75,0x23,0xdc,0xbd,0x29,0x57,0x6b,0xa8,0x09,0xb5,0x31,0x03,0x77,0x74,0xdf,0x41,0x73,0x4a,0x41,0x17,0x58,0x13,0x11,0x9c,0x6a,0x6a,0x78,0x8c,0xd9,0xb8,0xad,0x78,0x08,0x65,0x67,0x86,0x67,0x69,0x9a,0xe6,0x6d,0x01,0x09,0x19,0xa9,0x66,0xa0,0x51,0xc0,0x81,0x63,0xdf,0x67,0xa9,0x77,0xee,0x6e,0x22,0x0d,0x0d,0xc3,0x0f,},"\x9b\x7a\xfd\x48\xc4\x74\x60\x4c\x26\x36\x75\x31\x55\x68\x40\xc3\x88\x66\x8b\x0f\x38\x40\x06\x3d\xfc\x98\x69\xad\x5b\x90\x12\x74\xb9\x31\x29\x3d\x04\xf3\xc8\xe8\xf7\xf8\xea\xb8\x15\xa6\x41\xd7\xc3\x51\x28\x4e\x8b\xb0\x43\x7a\xc5\x51\xbb\x29\x43\x89\x64\xe6\xa7\xc7\xba\x77\x23\x44\xb3\x33\xf9\xed\xa5\xa7\x75\x68\xc8\x93\x1d\xdc\xaf\x21\xe3\x2e\x07\xb1\x0b\xf4\x82\x0f\xb8\x59\xbc\xf8\x7b\x81\xc4\xbf\xf4\x26\xf2\x4a\x4d\x46\x8f\x2e\x9a\xed\xa8\xf1\x7d\x93\x97\x09\x97\x0d\xb1\x1d\xf7\x62\x47\xe9\x8a\x39\xeb\x8b\x38\xf5\x94\x9f\x34\x9f\x2a\xe0\x5a\xb4\x8c\x01\x85\x17\xc4\x8f\xa0\x20\x5d\xc7\xf1\x56\x64\x53\xe1\x05\xe4\x8c\x52\xeb\x45\x5c\x0c\x40\x80\x2f\x79\x7b\x3e\xef\xb1\xe2\xf3\xb1\xf8\x43\x15\xae\xd5\xb0\x71\x1c\x64\x99\xa6\x91\xb7\x4b\x91\xf1\x2e\xf7\x0f\x76\xc4\xc0\x5c\x1a\xa1\xa9\x93\xe2\xf3\xe5\x28\xab\x34\x3d\xd2\x36\x81\x62\xf4\x03\x6a\x61\xa1\x3a\x88\x04\x5d\xcd\xef\xa8\x5d\x68\x53\x22\x75\xbc\xf5\xb8\xf5\xf0\x0e\xfd\xea\x99\x9a\x95\x78\x31\x75\xd9\xee\x95\xa9\x25\xd4\x8a\x54\x49\x34\xd8\xc6\xb2\x62\x22\x5b\x6e\xbe\xa3\x54\x15\xdd\x44\xdf\x1f"}, +{{0x1a,0xbc,0x0b,0x9a,0xa0,0x1d,0xc5,0x7c,0xa5,0x3e,0xfe,0x73,0x80,0x96,0x2b,0x1a,0x88,0xd5,0x0a,0x96,0x4f,0x5c,0xd9,0x86,0x40,0x98,0x2c,0x74,0x39,0x3f,0x29,0x26,},{0x8d,0x4f,0xd1,0x43,0x94,0xd7,0xc1,0x40,0x57,0x00,0x30,0x69,0x83,0xfb,0xf7,0x6e,0xa9,0xf1,0x71,0xb1,0x5a,0x6b,0x56,0x61,0x2a,0x1f,0xeb,0x1c,0xbd,0xae,0x5d,0xd5,},{0xf7,0x38,0xaf,0x2d,0x3e,0x29,0x0b,0x3d,0x23,0xd9,0xaf,0xf7,0x41,0x4b,0xfc,0x5f,0xfa,0x47,0x23,0x5d,0xc0,0x53,0x68,0x7a,0x8b,0xa5,0xc8,0x54,0x1b,0x85,0x11,0xf7,0x81,0x56,0x6c,0xda,0xa1,0x30,0xe0,0x67,0x7d,0xb5,0x5f,0xa8,0xbe,0x9d,0x81,0xa0,0x92,0xcb,0x58,0x92,0x3a,0x86,0x28,0x49,0x4d,0x2f,0x62,0xd9,0x5c,0x16,0x71,0x00,},"\xda\x2d\xd9\x40\xd5\xe1\xdb\x6e\x80\xbf\x7e\x2b\x78\x2e\x7e\x74\x5c\xd4\xfd\x25\x2e\x98\x15\x17\x97\x58\x87\xdd\x05\xac\x77\xed\x83\x7d\x08\x29\x61\x57\x5e\xfe\xdf\x30\x1f\xdf\x24\xb7\x07\x18\xb9\x91\xb8\xd9\x2b\xdd\x2e\x6b\xee\x17\xc8\xaa\x4b\xc6\x94\xa7\x27\xbc\xfc\x78\xfd\x85\x19\x5c\x42\xca\xf8\x83\xa2\xc3\x8d\x16\x1c\xad\xd7\x9c\xfd\xa9\xa3\x91\x10\xe1\x26\x4d\x30\xbd\x4c\x5c\x4a\x58\x76\x77\x7f\x23\x3b\x07\x1b\x1b\x0b\x40\x89\x35\xf0\x46\x89\x54\xcc\x74\x4a\xf8\x06\x3b\x00\x4e\xde\x56\xcd\x98\x1c\x4d\xd5\x60\x8a\xbf\xfe\xae\xc9\xe5\x8f\x3f\xaf\xaa\x67\x14\x67\x80\x4b\x7f\xa2\x55\x8f\x4f\x95\x17\x42\x01\xf1\x83\xd8\x0a\x59\x14\x06\x5f\xed\x53\x11\x5b\x41\xeb\xc3\x38\xf7\x8d\xf0\x50\x05\x3b\x8a\x4e\x75\xea\x7c\x6f\xdc\x35\x4d\xad\x27\xbf\xd8\xa2\xe6\x6f\xcd\x7a\xe2\xf5\x87\xd2\x4b\xe0\xd4\xa3\x3d\xa3\x0a\x22\x0e\x51\xbc\x05\xfa\x4e\x41\x2b\x95\x9f\xd9\x5d\x89\xea\x6e\xc0\x16\x25\x16\xc0\x96\xa9\x43\x3a\x9e\x7c\xf5\x99\xc9\x28\xbd\x53\x05\xc2\x17\x3b\xf7\x49\x3e\xd0\xc1\xc6\x03\xcd\x03\xf0\x82\xcc\xe4\x42\x37\xa7\x9f\xfd\x8b\xe9\xa6\x72\xc2\xeb\xaa"}, +{{0xcb,0xff,0xce,0x2c,0x9b,0xd3,0xe2,0x3e,0x40,0x6e,0x5f,0x66,0xe6,0x32,0xdc,0xfa,0x72,0x66,0x54,0xd2,0x9a,0x95,0x5c,0xec,0x98,0x31,0x73,0x23,0x5f,0xa3,0x59,0xd0,},{0x49,0x65,0x3e,0xdd,0x64,0xa5,0x5f,0x7c,0xd4,0x0e,0xaf,0x3f,0x8e,0x72,0xeb,0x96,0xdb,0xcd,0xee,0x39,0x8f,0x34,0x81,0x7f,0x2c,0x95,0x86,0x79,0x49,0x71,0x0b,0x14,},{0xe7,0xce,0xd4,0xfa,0x2a,0x7d,0xff,0x73,0xf1,0x06,0x8b,0xba,0xd0,0xec,0x9a,0x11,0x09,0x04,0x3c,0x97,0xa6,0x2e,0xff,0xa1,0x48,0x87,0x6f,0x09,0x69,0xed,0x4d,0xc6,0x08,0xe2,0x8b,0xce,0x79,0x7a,0xf3,0xb8,0x25,0x32,0xc9,0x4d,0xec,0x4d,0x68,0x11,0xb7,0xf5,0x63,0x67,0x91,0x29,0xfa,0xcf,0x17,0xbb,0x73,0xd6,0x93,0x75,0xeb,0x05,},"\x1f\xfd\xe6\x82\x6e\x4f\x0c\x24\xa7\x96\x1f\x19\x1e\x74\xcc\x0b\xbc\x92\x8e\x3f\x1a\xec\x3e\xfa\xb3\x27\x65\xc2\x50\x1c\xbc\x16\x20\xe7\xee\x6f\x61\xfc\xcf\xb0\x0c\xfc\xa9\xfb\x98\x14\x3b\x52\x9b\xcc\x8c\x3d\x0f\xdf\x89\xee\x7c\x34\x2f\x10\x18\x15\xfa\xbf\x7d\xea\xf9\xf3\x02\xa2\x88\xfe\x17\x58\x26\xd5\x90\xd9\x9e\xe6\xfd\x92\xda\x74\xf9\x59\x6b\x78\x3c\x0e\x7d\x47\xd7\x11\xa3\x2f\x39\xea\x41\x65\xe5\x21\x24\x31\x44\x1b\x49\x8c\x6b\x70\xdb\x3b\x09\xd1\xf4\xe4\xa1\x4a\x6b\xae\x39\xda\x50\x88\xbb\x85\xb3\x28\x5c\xe9\xdf\x2f\x90\x68\x1a\xf2\xc7\x4d\xec\xe4\x39\xae\xb9\x1e\x1c\x1b\x07\x12\xed\xdb\xee\x8d\x72\x56\x98\x28\xf3\x7c\xb7\x20\xc5\x09\xd0\x2a\xec\x47\x60\x70\x48\x4e\x9b\x16\xec\x71\x79\x94\x7a\xc9\x6c\xaf\x0e\x1b\xe8\xb6\xb7\x4f\x37\x2d\x72\x35\xfe\x6e\x39\x99\xdf\x73\x3b\xcc\xd4\x82\xdf\xe2\xe6\x31\xf5\x6b\x58\x26\x67\xdc\xe5\xe3\x12\x17\x63\xad\xfa\xcf\x3b\x18\xcf\x20\x95\xf7\x39\x4d\xee\x49\x27\xfc\x2b\xea\x6b\x58\x24\xd9\x0c\xd5\x9e\x85\x4e\xc5\x87\x2b\x45\x51\xb0\x2e\xfa\xba\x5a\xd5\x4a\x9b\x7a\x8f\x6d\xe5\xd7\xcd\xa5\x82\x5b\x32\x5b\x07\x6d\xed"}, +{{0x9f,0x91,0x23,0x14,0x97,0x48,0x4c,0xab,0x39,0xb9,0xe2,0x0f,0x86,0x11,0x81,0xd3,0x97,0x90,0x85,0x77,0xbb,0xb2,0x96,0x82,0x42,0xd0,0x71,0xbc,0xa4,0x81,0x3f,0xfb,},{0x88,0x24,0xbc,0x6c,0xd6,0xa6,0xf1,0x5a,0x5f,0x41,0x66,0x8f,0x2b,0x3b,0xae,0x8f,0xc4,0x96,0x73,0x83,0x07,0x8d,0x08,0xb5,0x1d,0x6d,0x1b,0x2b,0x93,0xa1,0x07,0x1f,},{0x0a,0x1c,0x70,0x6d,0xd8,0xa1,0x30,0x77,0xab,0x18,0x38,0x6c,0x65,0xfa,0x97,0xcf,0x9d,0xfc,0x43,0x54,0x2d,0x18,0x46,0xec,0xbd,0xde,0xb7,0xb3,0xc9,0x3f,0x3c,0x66,0xf3,0xcc,0xd0,0x44,0x7a,0xac,0xdd,0x4d,0xad,0x8f,0xbf,0x73,0x6c,0x4f,0xf9,0xdb,0xdb,0x62,0xbf,0xc1,0x4d,0x88,0x83,0xe3,0x85,0xbc,0xe9,0xba,0xc5,0x6a,0x35,0x0c,},"\x21\xd4\xfb\xc9\x81\x63\xc3\xfb\x6e\x09\xf7\x75\xc2\xab\x7b\x18\xb1\x87\x92\x34\x0b\xaf\xed\xac\xb4\x96\x05\x62\x2e\x3c\x08\xaa\x3b\x2b\x8d\x0e\x09\x02\xf3\x61\xaa\x1c\x0f\x65\x2e\x27\x32\xb1\x0a\x0c\x5c\x6a\x05\x09\x89\x96\xb5\x88\x26\x7c\xc8\x95\x1a\x78\xb5\xd4\x31\xe7\x22\x2b\xbb\x50\x8e\xee\xf1\xb5\xe8\xb8\xd0\x1d\x39\x91\xe1\x8d\xdd\xc6\xca\x8d\x22\x2e\xf1\x77\xce\x62\x93\x8d\x18\x10\xee\xcf\x06\xf4\x73\x8b\x28\xf4\x40\x94\x6c\xca\xd2\xa1\x2e\x39\xd3\x86\x11\xbe\xd3\xa3\x9f\x93\x41\x9a\x17\x9e\xc2\xb1\xb5\x2d\x5f\xe5\xc8\x0c\x23\xb8\x4d\x88\x03\x75\x5f\x51\x46\x09\x2c\xc1\x99\xb4\xbd\xce\xa5\xbc\xf2\x03\x7b\xd5\x3f\xf6\x34\x66\x94\x15\x5f\x02\x7d\x8c\xe2\xba\xff\xe3\x0a\x56\x66\x59\x6c\x00\x78\x3a\xae\xad\xe9\xc7\x7f\xc8\x63\x79\x42\xec\xe0\x17\xd6\x48\x4c\x28\x99\xb1\x91\x8d\x3a\x48\x0b\xd5\x15\x76\x78\xd4\x77\x2d\x27\x1f\x9b\x99\x76\x8e\xe1\xbc\xc4\x6b\x24\x89\xae\x87\xcd\x03\x0f\x47\xd1\x33\x3c\x76\x72\xcb\x90\x2c\xb4\xf5\xfe\x74\x6e\x85\x3d\xe5\x79\x40\xba\x22\x64\xd3\xe6\x29\x64\x4d\x65\x3a\x5b\x7a\xf7\x8c\xe6\x4a\x99\x3f\x36\x25\x0f\x8c\xb7\xcb\x45"}, +{{0x1e,0x2b,0xd5,0x48,0x7c,0x5f,0x5c,0xed,0x46,0x1f,0x60,0x4d,0xcc,0xb4,0xe7,0x8e,0xb9,0x16,0x08,0xf0,0xb8,0x21,0xf5,0xaf,0xc4,0xe3,0xe5,0x34,0xf7,0x96,0x03,0x92,},{0xef,0x82,0x54,0x75,0xcf,0x20,0x51,0xa2,0x01,0x7a,0xe5,0x32,0xf0,0x77,0xd9,0x67,0x74,0x34,0x7d,0x27,0x67,0xea,0x7b,0x45,0xf9,0xc1,0xb8,0x60,0xab,0x99,0x35,0x06,},{0x4d,0x33,0xc9,0x6a,0x2e,0x3a,0x5d,0xb7,0x39,0x1a,0xdf,0x65,0xc1,0xcc,0x35,0x65,0xfe,0x76,0xee,0xaf,0xd0,0xb5,0xc7,0xab,0xb0,0xb4,0x92,0xa0,0xb5,0x1e,0x1f,0xa3,0x36,0x39,0x94,0x6a,0x24,0x3b,0x2d,0xde,0xf3,0x57,0x55,0x22,0x98,0xce,0x0a,0xa9,0x5e,0xac,0x6f,0xbf,0xe6,0x60,0x98,0x82,0x71,0x87,0x7e,0xb2,0xa7,0xda,0x18,0x06,},"\x1d\xbb\xbb\x13\xcd\xad\x88\x85\x4b\x80\x9c\xed\xed\x27\x33\x43\xd3\x06\xa8\xde\xab\xf3\xff\x02\xc9\xce\xc6\xf0\x02\xb8\xe9\xe1\x0e\xf5\xd1\xb0\xf5\x71\x1f\x33\x26\x7a\xa9\x1c\x17\x1b\x61\xe9\x60\xf7\x40\x45\x7b\x81\xd7\x51\xa4\x73\xf4\x4f\x75\x0a\x08\x0c\xab\x80\xaf\x7c\xcc\xa7\xdf\xfc\xfa\xc9\xee\x4c\x39\xdc\x85\xcb\xdf\x51\x25\x9c\xcd\x34\x70\xd9\xba\xd3\xad\x30\xf4\xee\x5d\xbd\x4f\xac\x6b\xd5\xc6\xc4\xdf\x73\x11\xa4\x70\x04\x46\x95\xa7\xe1\xa7\xe1\x85\x72\x20\x75\x88\xaf\xa5\x7e\xeb\xcd\x4d\x57\x5b\x6d\x42\x44\x57\xee\x92\x46\x5c\xe1\x86\x3e\x3c\x67\x7c\xf8\x75\xfd\xb9\x8d\x40\x78\xeb\xe7\x14\x42\x60\x80\x70\x52\x57\x71\x44\xcb\x8e\x03\x59\xaa\x42\xad\x15\x5d\x79\xda\xe3\xde\xb9\x9c\x46\x32\xc1\x91\xc7\x99\xcb\xfe\x58\x7d\x95\x47\x87\x06\x8d\x66\x3b\xdf\xc0\xfa\xb1\x33\x4f\x18\x76\xbf\x49\x8c\x4d\xb5\xc5\x3d\xb7\xb0\x20\x4e\xd5\xa5\x21\xc6\x2f\x09\xea\xca\x8d\x01\x89\xf3\xb3\x94\x14\x3f\x29\xc4\x21\xcb\x5c\x8d\x07\xbd\x75\x1b\xaf\x4c\xbe\x3b\xf4\xbe\x17\x01\xdf\x4b\x22\x07\xdf\xb2\x90\x4d\x84\xf4\xdb\xda\x51\xcb\xa5\x76\xd5\xa5\xbb\x16\xef\xe6\x98\xed\xd6\x08"}, +{{0xf7,0x8d,0xb1,0x4d,0x6d,0x1a,0x64,0x3d,0xd7,0x73,0x5b,0xaf,0x26,0x35,0x32,0x12,0x44,0xe7,0xec,0x8c,0xa7,0x2c,0x5c,0x38,0xc9,0x8c,0x80,0x9d,0xb9,0xcb,0x5a,0x55,},{0x54,0x14,0xf7,0x5f,0x52,0xf3,0x86,0x4a,0xfb,0x0c,0x79,0xc2,0xc5,0xc1,0xd0,0x6b,0x4b,0xce,0x40,0x0f,0xbd,0xdf,0x17,0xfe,0x9c,0xfb,0x2a,0x8b,0xac,0x47,0xa0,0xdd,},{0xd7,0xcb,0xd4,0x18,0x1f,0x67,0x71,0x20,0x07,0xb7,0xf0,0xe1,0x84,0x52,0xe0,0xa0,0x24,0x46,0x4d,0x9d,0xc9,0xb5,0xff,0x9c,0xf6,0x69,0xd1,0xb9,0x11,0x69,0xd7,0x57,0x32,0x62,0xf8,0x33,0x36,0xb9,0x7c,0x86,0x1b,0xfa,0xb3,0xfc,0xf6,0x69,0x22,0x3c,0xe8,0xca,0xf3,0x19,0xf2,0x1d,0x23,0xf1,0xfa,0x33,0x1a,0x2d,0x89,0xb6,0xca,0x0b,},"\x05\xca\xf1\xb8\xed\xc3\xb1\x73\xfb\xc1\xed\x29\xb9\x5e\x2b\xf0\x6d\x81\x4b\xa2\x40\x7d\x4b\x31\xc7\x28\xd0\x4e\xc2\x73\xd2\x53\x94\x42\x3a\xc7\xd4\xff\xf2\xca\x36\xee\x90\x27\x30\x93\xc7\x56\xe2\xbd\x13\xc9\x6d\x4a\x3d\xc7\xf5\xbe\x17\x59\xfc\xd3\x28\xeb\x66\xc5\x88\x2b\x58\xfa\x45\x88\xe5\xb2\xa3\x71\x3a\x41\x54\xa2\x34\x0d\x0b\x06\xad\x01\x96\x01\xb0\xe0\x28\xe4\x97\xf8\x98\x25\x6b\x02\x8a\xf9\x5c\xd8\x16\x8d\xf5\xe5\x8a\x57\xcd\x1e\xbf\xc0\xa0\xc9\x1c\xed\x61\xdb\xb4\x80\xac\xa7\xdf\x8d\xca\x91\xeb\x16\xe9\x80\x07\xcd\x2c\xd1\xa2\x04\x5b\x0e\x44\x77\xd1\x2d\x5a\x40\x72\xf3\x65\x42\x65\x67\xc9\xd6\x15\x77\xf3\x48\x5c\x8f\x46\x60\x5e\x7f\x47\x5e\xf0\x4a\x39\x48\xf6\x0d\xba\x8c\x55\x08\xd1\x4b\xfd\xdb\x9b\x11\xdd\x04\x4e\xf2\xd8\x4c\x16\xb9\xa9\x03\x8d\x8e\x78\xed\xa4\x3b\x91\x29\x7d\xf3\x5f\x43\x61\xa3\x83\xb4\x1d\x49\x67\x7a\x68\x7d\x5b\x34\x4a\xd1\xab\x0f\xc7\x30\x17\xb3\xbe\xbf\x32\x30\x6f\xb3\xfd\x7b\x3d\x50\x71\xf3\xab\x5f\x6e\x49\xaa\x15\x54\x0c\xad\x65\x03\xbe\xa7\x78\x4c\xf9\x42\x18\x01\xce\x13\x85\x83\x98\x93\x36\x2a\x97\xfa\xe1\x21\x30\x0d\x67\x83\xaf\x0f"}, +{{0x7d,0xfa,0x32,0x8e,0x90,0xa1,0xb8,0x49,0xc2,0x19,0xe3,0xda,0x83,0x2d,0xf9,0xed,0x77,0x44,0x82,0x34,0xf0,0xd8,0x9e,0xa5,0xd1,0x7a,0x3d,0x64,0xe7,0x88,0x3d,0xaf,},{0xe3,0x0c,0xe6,0xfd,0x5f,0x58,0x00,0x38,0x9a,0x70,0xcd,0x11,0x73,0x64,0xf5,0x99,0x45,0xaf,0xb1,0x80,0xf2,0x29,0x92,0x73,0x60,0xb0,0x6b,0x48,0x35,0xf8,0xdc,0x91,},{0x1c,0x61,0xd5,0x3b,0x87,0x2f,0x8c,0xde,0x59,0x86,0x09,0x68,0x2c,0x79,0xf6,0xc5,0xdf,0x00,0x7c,0x51,0x3a,0x71,0xcf,0xb3,0xa0,0x6d,0xcb,0x82,0xd8,0x5c,0x4b,0x00,0xcc,0xc4,0x0b,0x00,0xe5,0x9f,0x59,0x53,0x93,0x08,0x8b,0x4c,0xd0,0x43,0x28,0x55,0xc6,0x7a,0x20,0x7d,0xa7,0x1f,0x87,0xe7,0x2c,0x40,0x9b,0x3e,0x50,0x27,0x95,0x07,},"\xe5\xe4\x95\xd6\x63\xf4\x72\x36\x71\x45\x32\x68\x7a\x24\x30\x8f\x94\x2c\xa9\xc3\x3e\x08\x8f\x7f\x10\x6a\x5a\x72\x35\x18\xca\xcb\xbe\xf4\xa6\x8c\x93\x9a\x69\x50\xb2\xdc\x25\x89\xf8\x2d\x35\x4e\x57\x52\x72\xd4\x2b\x13\x83\xd3\x15\xab\x8a\x20\xaa\x0c\xdc\x9d\x4d\xf6\x78\xab\x3b\x26\x61\x2b\x5d\xca\x66\xe7\x1f\x9f\x3f\xa7\xd9\xe7\x31\xdc\x48\x1e\x2b\xc7\x12\x7c\xea\x3b\x62\x03\xca\x6c\xd8\x16\x2e\x90\x88\x6a\x73\xdc\x46\xc8\x3d\xde\xfc\x4b\x9e\x2d\x53\xd2\x9d\xd3\x87\xc6\x24\xe0\x8b\xd8\xd5\x3b\xe9\x28\xa4\x0a\x9a\xa8\xae\x8b\x1c\x8d\x0f\xb6\xa7\xbd\x6d\xce\x5f\x62\x31\x5b\x7a\x21\x81\xf6\x27\xf2\x56\xbb\xe7\xe2\xa9\x5b\xf4\x64\xe6\x13\x22\x04\xc1\x74\x20\x96\x29\x84\x02\x35\xb2\xc3\x99\x13\x30\x1a\x4b\x40\x32\x5d\x11\x8d\x38\x4b\xc7\xac\x02\x8c\xd4\xf1\x27\x02\xe1\x61\x19\x1b\x14\x9e\x42\x09\x05\x8a\x55\x12\x2b\xbb\x8b\x22\xb2\x46\x83\xba\x4f\x8e\x2e\x6c\xcf\xc0\x8d\xc8\xc8\xb1\xbc\xfb\x6d\x60\xbd\x8f\x06\x21\x96\x93\x3d\xf3\x19\xab\x16\x90\x6d\x08\x57\x30\xeb\xa1\x72\x0d\x4b\x02\xc6\x7d\xaf\x38\xcc\xe6\xab\xa3\x8e\x25\xd6\x8e\xf9\x5b\x2f\x52\x19\x13\xa1\xd7\x7d\x5e\xb6\x50"}, +{{0x6c,0xe1,0x3d,0x3c,0x2e,0xc7,0x1f,0xed,0x83,0x13,0x1a,0x69,0xd5,0xd0,0x30,0x31,0x4a,0xb4,0x9e,0x65,0x65,0xef,0x68,0x16,0x3f,0xff,0x09,0xac,0x5d,0x9b,0x47,0xe7,},{0x9c,0x7b,0x11,0x18,0xfa,0xb9,0x1e,0x0e,0x7b,0x19,0x2a,0x23,0xd9,0x5f,0xb8,0x77,0xcb,0x79,0x36,0xcc,0x6c,0x8a,0x33,0x05,0x92,0xf4,0x8e,0x67,0x84,0xed,0xc2,0x92,},{0x60,0x8b,0x2b,0xf6,0xf6,0xda,0x05,0xc2,0xac,0x5b,0xbf,0xd7,0x95,0xa2,0xac,0x32,0xc7,0x9c,0x74,0x15,0x3f,0x94,0x31,0xde,0xa5,0x97,0x68,0xff,0x4c,0x22,0x5e,0x3b,0x69,0x3b,0x64,0x5a,0x50,0x67,0x66,0xb8,0x60,0x85,0x0e,0xe9,0x7e,0xa4,0x30,0x32,0xb0,0x5b,0x69,0xe5,0x67,0x67,0xe8,0xeb,0x9d,0x19,0x18,0xdf,0x9a,0xfb,0xa8,0x05,},"\x10\xbb\xc3\x11\xeb\x2a\x76\x5e\x01\x67\xff\x37\x61\x8f\xf7\x0e\x13\xf0\x2d\x7b\x06\x17\xae\x4a\xc0\x6b\xef\xbb\xe1\x49\xc9\x72\xa9\x94\xf6\x80\xca\x4d\xc9\xa9\x2e\xc7\xef\xa5\x39\x97\xfa\xd3\x56\xb9\xff\x4e\xbd\xee\x62\x95\x41\xd1\xf4\xde\xa6\x2e\xd0\xd2\x49\x4f\x9c\xcf\xdf\x07\xa9\x31\x04\x91\xf6\x1c\x4b\x3e\x27\x00\xb4\xa3\xc6\x68\xd6\x78\x32\x9a\x38\xc2\xef\xf9\xd8\xcb\xa4\x31\xfb\x95\x9e\x7f\x76\x55\xbd\x0f\xbd\x77\xd5\x3b\xbb\xc2\xeb\x8d\xc5\x1d\xd7\x18\xed\x98\x72\x8a\x18\x16\x86\xbe\x12\x2b\x84\x4d\x3d\xa3\x31\xe3\x29\xd3\x95\x9b\x59\x23\xf7\x73\x43\x25\xa0\x21\x02\x6e\x27\x54\xe1\x7a\x15\x10\x8b\xe8\x01\x46\x5a\xd9\x58\xdb\xcf\x21\xdf\x89\x0c\xfe\x5d\x5b\x88\x3c\xa4\x3c\x61\xce\xdc\xcb\xdb\x58\xb8\x49\xea\x75\x37\x4f\x1e\x91\x8e\x80\x3e\x57\x7a\x5d\xc7\xa1\xc1\x79\x36\xec\xcf\xcd\x34\x81\xbd\x2b\x1e\xb0\x75\xb8\x32\x37\xca\x6f\x3c\x07\xc1\x9e\x9a\xf9\x73\x12\x67\xbe\x82\xd4\x89\x8e\xee\x96\xeb\xc9\x00\xd4\x8b\x05\x9d\x51\xb0\xdd\x41\x5b\x1c\x89\x06\x60\xa8\x8d\x25\xf5\xc5\xf3\x5d\x8e\x45\xe5\x23\xe0\xce\x33\x36\x92\x3a\xb4\x36\x70\xe3\x5c\x50\x57\xd5\x6c\x75\x88\x76"}, +{{0xd4,0x5e,0xe6,0x9a,0x5f,0x1a,0x7c,0xfd,0xd0,0x34,0x3f,0x87,0x70,0xd1,0xc6,0xbc,0x02,0x6f,0x06,0x7a,0x70,0xdb,0xe8,0x39,0xa8,0x6f,0x2a,0xa0,0x68,0xc3,0x3f,0x81,},{0xfc,0x8d,0x9f,0xb0,0xe4,0xf3,0x47,0x93,0x09,0x07,0x55,0xe0,0x32,0x80,0x96,0xe0,0x1e,0x28,0x1e,0xa3,0x51,0xb8,0xd9,0x5c,0xd9,0x11,0x6e,0x13,0x1a,0x5c,0xa5,0x4e,},{0x15,0x6c,0x51,0xc5,0xf9,0x15,0xd8,0x9b,0x8d,0x14,0x00,0x35,0x0f,0x8f,0x21,0x7a,0x5c,0x02,0xe2,0x62,0x9e,0xde,0x9f,0x4a,0x30,0xb6,0xe7,0x1d,0x1e,0xa7,0xa9,0x53,0xcc,0x6d,0xb3,0x1b,0xa5,0xc7,0x78,0xc2,0x69,0x92,0x0b,0x64,0x9f,0xb4,0x22,0x1c,0x6d,0x38,0xcf,0x2c,0xea,0x2a,0x7d,0xe3,0xad,0x42,0x3e,0x04,0xfa,0xaa,0x06,0x07,},"\xeb\x5e\xd8\xab\x79\xcb\xfe\x61\xc2\x59\x81\xb9\xd1\xd6\xb7\x0f\x10\xb6\x01\x94\xb4\x16\x1f\xe1\x7d\x11\xaf\xf1\x76\x79\x94\xaa\x08\x13\xe9\xec\xe2\xf4\xc5\xd5\x31\xb9\x9e\x8a\xdf\x18\x88\xc3\x0a\x63\x89\x3e\xb4\x51\xaa\xf5\x5a\xcd\x5a\x52\xad\x8c\x40\x1f\xaa\x88\xd6\xea\xcf\x3e\x49\x47\x05\x66\x11\x4f\xd0\xc6\xa2\x74\xe9\x54\x48\x46\xb0\xae\x9b\xfa\x12\x4d\x79\x51\xeb\x26\x71\x5e\x19\x25\x3f\xf7\xed\xc8\xa7\x09\x65\x77\x6f\x23\xce\x46\x03\x1e\x03\x4a\x20\x07\x23\xba\x3d\x11\xe1\x1d\x35\x3d\x7e\x7c\xd8\x4a\xed\xe2\x67\xff\x64\xbe\xd4\x18\xcb\x9f\x28\xc6\x1c\xd0\xf6\x3b\x6c\xe2\xec\xae\x14\xb2\x0b\xc6\xbd\xae\xd8\xc4\x28\xba\xd1\x8b\xe4\xb7\xd6\x63\x38\x36\x4a\xcd\x80\x42\xa8\x25\x6f\x25\x8a\x69\x96\x9b\x8d\x3c\xa2\xea\xb3\xae\xa3\x70\x6e\x5f\x21\xc3\xb1\xef\xcc\x25\x4a\x82\x4b\xb4\xe7\xea\x7a\xba\x88\x27\xc8\xeb\x82\x78\x6c\x66\x5a\xa9\x73\x82\x19\x31\xff\x99\x0a\x63\xfd\x34\xa7\x4a\x6d\x8c\x22\xa8\x82\xb0\xb9\x35\x15\x2c\xcb\x36\xfc\xc7\x6f\x4e\xca\x65\xd6\x7c\x86\x80\x94\x2f\x75\xdf\xad\x07\x34\x39\xc0\x91\x60\x65\xe8\x38\x77\xf7\xba\x20\x93\x03\xf3\x35\x48\xd9\xe4\x0d\x4a\x6b"}, +{{0x8a,0x76,0xea,0xab,0x3a,0x21,0xec,0x5a,0x97,0x5c,0x8b,0x9e,0x19,0x7a,0x98,0x9e,0x8e,0x03,0x08,0x99,0xeb,0x45,0xd7,0x89,0x68,0xd0,0xfb,0x69,0x7b,0x92,0xe4,0x6d,},{0x2d,0x9c,0x81,0x3d,0x2d,0x81,0xe2,0x73,0x0b,0x0d,0x17,0xd8,0x51,0x2b,0xb8,0xb5,0xd3,0x3f,0x43,0x6c,0xab,0xaa,0x13,0xe1,0x41,0xca,0x1c,0xb7,0x85,0x01,0x43,0x44,},{0xfc,0xee,0xcc,0xa4,0xb0,0x14,0xfe,0xcd,0x90,0xb9,0x21,0xb0,0xfa,0x3b,0x15,0xae,0xaa,0x4e,0x62,0xca,0xa1,0xfb,0x22,0x72,0x9c,0x70,0x26,0x92,0x32,0xc3,0x3c,0xef,0x0d,0x0a,0xee,0xa6,0x64,0x32,0xc1,0x28,0xaf,0xb9,0xa3,0x64,0x6b,0xc7,0xf0,0x3a,0x12,0x77,0x4d,0xa8,0x75,0x83,0x98,0xc2,0xa0,0xdc,0xce,0x0b,0xbb,0xf6,0x74,0x0a,},"\xc6\xc7\x8f\x2e\x20\x80\x46\x1a\xed\x9f\x12\xb4\xf7\x7c\x98\x9b\x19\x71\x67\x80\xfa\xb6\x0e\x6e\xcb\x97\x93\xb4\xbc\x7e\xd6\x9e\x5f\x70\xfa\x6b\xdb\xa1\x6e\x9b\xd3\x19\x49\x69\xee\xa6\x66\x5a\xbf\xd6\x30\xde\xee\xfa\x3d\x71\x7b\x6d\x25\x4d\xd2\x4b\xc9\x7d\xde\x21\xf0\xf2\x9f\x9e\xd3\x4b\x8b\xd7\xa0\x13\x38\x0f\x4f\x82\xc9\x84\xfd\xbd\x95\xaf\x98\x05\xb7\x44\xbc\xd9\x52\xc5\xa7\x1f\xbb\x57\xd1\x1f\x41\x1c\x18\xcc\x30\xbc\x35\x94\xf7\xad\x82\x28\xcb\x60\x99\x39\x4a\x1b\x6b\x0a\x81\x85\x81\xbd\xf9\x3c\xce\x58\xf3\xa4\xa2\x3e\x55\xdb\x3e\x69\xca\x9d\x60\xcf\xb3\xa9\x07\xfb\x68\x32\x9e\x2f\xfb\x6c\x65\xf1\xe8\x28\xd2\x81\x27\x10\x9c\x9e\x9f\xb7\x01\x60\xf2\xef\x82\xa2\xee\x9f\x9b\xd1\x70\xc5\x1e\x13\xfd\x3f\xc1\x86\x6b\x22\xc7\x9f\xe6\xd5\x10\x12\x17\x97\x9d\xbe\x27\x24\xdc\xad\x8a\x9b\xc6\x9a\xcc\x42\xc1\x12\xdc\x69\x7b\xd2\x71\xee\xa5\x50\xe9\xe5\x04\x06\xbf\xd2\x82\x45\xb8\x3b\x8f\x01\x2d\x34\xdb\x6d\xbd\xd5\x5a\xe6\xe5\x75\x74\x5c\x15\x3d\x6e\x75\x34\x90\x10\x27\xea\xdc\x2f\xcc\x33\xa5\x28\x7d\xdb\xca\x6d\x3a\xea\xb8\x97\x22\x94\xdc\x6c\x71\x2b\x99\x42\x54\x72\x77\x34\x0e\x7a\xd1\x9e"}, +{{0x18,0xa8,0xf9,0x36,0x48,0xcd,0xcf,0x47,0x13,0x36,0x30,0xaf,0x1e,0x11,0xc0,0xce,0xea,0x3d,0xe0,0x73,0x27,0x31,0x4c,0x96,0x58,0x0d,0xf7,0x75,0x59,0x7d,0x7a,0x9c,},{0x29,0x12,0xf4,0x1a,0xb4,0xc8,0x7e,0x39,0x37,0xa0,0x33,0x31,0x80,0x2c,0xba,0x87,0x71,0x6b,0x4e,0xea,0x14,0xb9,0xfb,0xa6,0xf5,0x46,0xd0,0xac,0x2c,0x09,0x73,0xdf,},{0x3b,0x77,0x39,0x4c,0xd6,0x9f,0x8b,0x45,0xd0,0x0c,0xfe,0x3a,0x79,0xa7,0x90,0x06,0x28,0xa5,0x65,0x18,0xb3,0x79,0xed,0x8a,0x11,0x58,0x1f,0xc3,0xa3,0x76,0xe5,0xd6,0x68,0x07,0xdf,0x11,0xe7,0x09,0x04,0xf6,0x96,0xc7,0x41,0xd2,0x1d,0x13,0x93,0x10,0xfa,0x1b,0x89,0xa9,0x3b,0xdc,0x4d,0x2c,0x39,0x97,0x99,0x1f,0x52,0x20,0xee,0x00,},"\x59\x20\x93\xac\x7c\xd6\x71\xd6\x07\x0b\x00\x27\xed\xac\x1f\xb0\x15\xcc\x20\x5d\x78\xbb\x60\x3f\x37\x8e\xb9\xf8\xaa\x38\x8c\xa8\x30\xdb\x3c\xb2\x34\x20\xc7\xe8\x52\xdb\x0b\x55\x24\x1e\xb8\x8a\x02\xcc\x62\x7a\xa9\x41\x43\xbe\x43\x9a\xab\x4b\xf2\x63\x47\x57\x47\x04\x06\xe8\x42\xf2\x0e\xb1\x0f\x07\x00\xe3\xc2\xda\x36\x4f\x58\x8a\x80\x00\xf2\x38\x50\xc1\x2c\xe9\x76\xf3\x26\xd2\xdf\x1b\xac\x13\xe9\x50\x20\xb4\x12\xb1\x75\xbf\x74\xbd\x7e\xbb\xac\xf3\xae\x55\xc0\xda\xeb\xb5\xc0\x10\xbf\x80\x4f\xee\xe1\xd7\xd4\x9f\xae\x05\x0b\xea\x55\x99\x6f\x53\xcf\xe1\xf1\x5a\x0c\xf2\x07\x27\xdb\x4e\xe3\x11\xc2\x60\xba\xd9\x68\x2d\x7b\x96\x5e\x27\xa9\x49\x1f\x47\x1d\x4a\x47\x3a\xff\x64\x6c\x7d\x42\x4d\x5a\x0b\xdc\xbb\x8a\x02\x33\xf4\xb3\x06\x0d\xd0\x4c\x98\xec\x98\xdf\xd0\x5e\xc7\x24\x78\x84\xe2\xd8\xe1\x52\xd4\xae\x52\xb3\xd5\x86\x5d\x9e\xfd\x67\x06\xa6\x0e\x08\x8e\x1e\x7c\x9f\x62\x45\x10\xab\xc7\xa2\x04\x5a\x2c\x7a\x75\x88\xe2\x53\x5e\x73\x19\x1d\xd5\xcf\x05\x42\x15\x63\xf5\x56\xa1\x3e\x82\x36\x67\x03\x43\xcd\x5b\xa4\xd4\x66\xe2\x45\xc4\xee\x3b\x5a\x41\xe7\x0c\x9a\x0f\x5e\x6e\xa2\xc5\x59\xeb\xe6\x1b\xa8\x1e"}, +{{0x20,0x6c,0xd2,0xb8,0x11,0x4a,0xae,0x18,0x8d,0x81,0x86,0x2c,0xce,0xc4,0xcb,0x92,0xc4,0xef,0x5f,0xc7,0x8c,0x24,0x43,0x5a,0x19,0xf9,0xed,0x9b,0x8a,0x22,0xf4,0x7e,},{0x97,0xa6,0x7a,0xc2,0x81,0x1f,0x52,0x94,0x56,0xdf,0x53,0x27,0x37,0xd7,0x6b,0xed,0x7e,0x38,0x7d,0xa8,0x3b,0xd5,0x54,0x59,0x37,0x2f,0xdf,0xb2,0x7f,0xfa,0xcf,0xf3,},{0x73,0xa4,0x0d,0x9d,0xa0,0x8f,0xb9,0x8e,0xa2,0x5b,0x67,0xe7,0x21,0x55,0x7a,0x1a,0x51,0x22,0x52,0x94,0xd3,0x16,0xb5,0x31,0x49,0xaf,0x89,0x5f,0xa4,0xd6,0x3c,0xb4,0xa3,0xf5,0x6f,0x68,0x85,0x66,0xef,0x6d,0xa4,0x2f,0xd2,0x94,0x1d,0xff,0xa0,0x6d,0x49,0x7a,0xa9,0x02,0x16,0x5d,0x50,0x21,0x3a,0x62,0x14,0x11,0x62,0x99,0xa9,0x0c,},"\x48\x0c\x48\x00\xf6\x8c\x79\xf5\xdf\xc0\xc3\x66\x6c\x0a\xc4\x29\xb3\x0f\xe0\xc5\xfe\x84\x87\x50\xdb\x21\x71\x38\x0b\x80\xc8\xe9\xfe\xc0\xa0\x54\xb1\x6d\x08\x67\x4c\xef\xe2\xf6\x4e\xc2\x8b\xb6\xb0\x59\x6b\x35\x23\x55\x75\xf1\x89\xbe\xe2\x59\xac\xa7\x66\xc2\x22\xac\x0a\x46\xcf\x2a\xf7\x57\x74\xda\x4e\x34\xa0\xb5\x4f\xc2\xac\x49\xec\x8b\xed\xf4\x88\x7c\xd9\xb7\xbe\x4f\xdb\x7f\x68\x69\x02\xdd\xfa\xb0\x46\x27\xe2\x6e\xa2\xdc\x3d\x97\xd6\x2a\x4b\x15\x46\x18\x02\x18\xed\x8f\xa1\x13\x33\x48\x19\xb5\x27\x5c\xc5\x4a\xfd\xee\x44\x30\x90\x08\x59\x65\x07\x97\x16\x75\xe6\xd8\xb8\xa8\xed\xec\x47\x18\xf2\xd4\xbd\x73\x52\x13\xcb\xbd\x18\x79\x1f\xaa\x80\x54\x17\x49\x07\xa7\xac\x17\xd7\x14\x3a\x47\x57\xe4\x93\xbe\xee\xc4\x84\x9d\x0b\x83\x6f\x18\xbb\x2b\x3c\x90\x16\xf2\x5a\xf4\x7f\xb9\x61\x99\x25\x17\x20\x54\x9f\x15\xd1\x49\x50\x3d\x41\x09\x5e\x25\xf2\x62\x09\xda\xac\x39\x15\x44\x85\xc3\xde\xd7\xcb\x1a\x8c\x3e\x83\xa5\x2f\x5a\x06\xec\x09\xcf\x83\xdf\x00\x72\x6b\x79\x68\xf6\x4c\x0c\xba\xe2\x99\x51\x2f\xb4\x38\x56\x0f\x04\xb3\xb6\x44\x34\x6f\x93\x8a\xc8\xe9\x04\x86\x61\x4c\xd8\x44\xb5\x4e\xae\x07\x8b\xf6\x78\xb3"}, +{{0x59,0xb1,0x44,0xa7,0x08,0xab,0xec,0x97,0x27,0x29,0xa0,0x4a,0x6c,0x13,0xf0,0xea,0x02,0x0b,0x4e,0xd4,0xa4,0x82,0x98,0x02,0x3a,0x56,0x89,0x58,0xc2,0x12,0x15,0xec,},{0xc4,0xf4,0x72,0x00,0x92,0xed,0x61,0x79,0xa0,0x82,0xae,0x4d,0x61,0x45,0xdf,0x37,0x71,0x78,0x6e,0xfc,0xa9,0xbd,0x9b,0xb7,0x9c,0x9f,0x66,0x67,0xd2,0xcb,0x56,0xb3,},{0x1a,0x80,0x85,0x0f,0xcb,0xd6,0xe6,0x43,0xc6,0xba,0x8e,0xb6,0x84,0xdb,0xef,0x7d,0xf0,0x15,0x15,0x92,0x28,0xda,0xed,0xcf,0x06,0x04,0x70,0x91,0x86,0x05,0x4d,0xb1,0x85,0xaa,0x7b,0xaa,0xcb,0x09,0xd6,0xca,0xad,0x01,0x63,0x8e,0xff,0x8e,0x46,0x87,0x35,0xa6,0x01,0x24,0xde,0x0c,0x53,0x76,0xe9,0x43,0x40,0xe5,0x41,0xa9,0x80,0x07,},"\x38\x57\xbd\x26\x0b\x8a\xad\x9d\x07\x3f\x06\x76\x5d\x37\xfe\x89\x3a\x3f\x53\xe2\x3d\xe8\x66\xdd\xac\x33\x49\x5a\x39\xad\x33\xee\x9e\x9d\x5c\x22\x50\x2b\xc1\xc4\xb5\x47\x0d\x0e\x3f\x3a\x58\x52\x23\xfe\x4c\xb9\x3c\xc4\xad\x2b\x5b\xa6\xd7\x88\x26\xa5\x3f\xc0\x25\x3d\xc5\x80\xa2\x01\x8c\xc9\xff\x1c\xfe\xdb\xd3\xac\x0b\x53\x29\x2d\xee\xfb\xc1\x4e\x58\x9a\xcf\x49\x6c\xb5\xf7\x67\x01\x30\xfd\xbb\x6c\xf3\x8d\x20\x89\x53\xc0\x15\xa0\x47\x46\x75\xb7\x24\xbd\x10\x9f\x7c\xb8\x9c\x33\x01\x67\x51\xfe\x7a\xa7\x85\xd0\x99\xd0\x9a\xb2\x0d\xd5\x25\x8c\xd7\x64\xac\x8d\xaf\x34\x3c\xe4\x79\x0e\xad\x08\x63\xaf\x43\x12\x1a\xa5\x27\xa3\x7a\x11\x62\x8f\x47\x86\x96\x68\xf8\xea\xc0\x0d\x80\xb6\xbf\x99\x06\x66\x3d\x7a\x28\x99\xc1\xcb\x67\x8c\xd7\xb3\xeb\x3b\xc8\x02\x26\xb8\xb1\x3b\x6e\x46\x87\x7f\x38\xf0\x7c\x3d\x9c\x86\xd3\x36\x8b\xaa\xc4\xa6\xf6\xb9\x3c\xce\xbc\xec\x98\x11\x47\x4b\x6a\x6a\x4d\xa5\xc3\xa5\x96\x65\x71\xee\xd0\x5e\xdc\xc0\xe3\xfe\x7c\xd1\x59\x15\xc9\x1f\x44\xee\xe8\xc1\x49\xae\x45\x1f\x37\x55\x18\xa7\x9f\xb6\x00\xa9\x71\xa3\x9b\x94\x33\xdf\xa1\x9f\x91\x93\x1b\x19\x32\x27\x57\x47\xc2\x62\xee\xdc\xbd\x27\xf1"}, +{{0x8d,0x16,0x21,0xee,0xab,0x83,0x27,0x0d,0xe8,0x57,0x33,0x5c,0x66,0x5b,0xbf,0x57,0x26,0xe3,0x72,0x22,0x25,0xfd,0x01,0x6e,0x23,0xbf,0x90,0xab,0x47,0xae,0xec,0x3d,},{0xbe,0xcd,0xbc,0x02,0x4d,0xae,0x6a,0x94,0xed,0x4e,0x29,0xc8,0x0f,0x2a,0xff,0x79,0x6a,0xed,0x8f,0xeb,0x2c,0x1b,0x37,0x90,0xa8,0xc7,0x2d,0x7b,0x04,0x8a,0x2c,0x61,},{0xe0,0x8d,0x6c,0xaa,0x5f,0x39,0x32,0x7d,0x6e,0x66,0x52,0xed,0x74,0xdd,0x1a,0x37,0x84,0x4b,0x97,0x9f,0x5c,0xce,0x74,0x7a,0x60,0x6f,0x56,0x79,0xf4,0x89,0x8b,0xbb,0x76,0x43,0xdf,0x7e,0x93,0x1b,0x54,0xa2,0xb4,0x0e,0xbd,0xef,0xe8,0x30,0x03,0xf6,0x1c,0xa0,0xf1,0x11,0x12,0xf0,0x23,0xc6,0xa3,0xe8,0xcc,0x18,0xca,0xfe,0x5f,0x0d,},"\x97\xfa\xcd\xdc\x82\xcc\xcc\xcf\x78\x8c\x31\xb3\x30\x5e\x93\xeb\xa9\x56\xf8\x96\x13\xe6\xe5\x35\x42\xb0\x43\x26\x7f\xee\x54\x4c\x2b\x0a\x8a\xe8\x88\x6a\x31\xb9\xd3\x21\xa6\x3c\x27\x62\x3b\xae\xfe\xa8\x40\xb2\xa8\xaf\x5b\x23\x30\x19\x3f\xfb\x5b\xaf\x87\x3c\x33\x55\x28\xaf\xea\xe2\x16\x01\x63\xc8\x51\xc5\xa2\xe5\x81\x54\xa1\xb0\x56\x9c\x2d\x13\x66\xc0\x71\x04\x37\x62\x3b\x0e\x08\xc6\x86\xe5\x4f\xc2\x79\xed\x4c\x45\xf3\xe8\x56\x86\x83\x75\xf7\x82\x24\xc7\x77\xb1\x3d\x75\xde\x10\xd7\x91\x73\x55\x24\x25\xd1\x5a\x56\x19\x04\x15\x5f\x21\x17\xb2\xf1\x47\x13\xeb\x0b\x04\x64\x8a\x3b\xde\xb3\x30\x21\x67\xd1\x97\x3e\x78\x8a\x06\xcb\x00\xd4\x8c\xcb\x26\x9f\xa7\x1a\xf8\xba\x68\xea\xe5\x5d\xbb\xfd\x95\x94\xd5\xc2\xb4\xdc\x13\xae\x03\x21\x71\x85\x61\xac\xdf\x67\xdc\x8c\xfc\xc2\x5b\xc4\x6b\xb6\x6e\x09\x6a\x19\x41\xd9\x33\x52\x07\xd3\xf7\xd1\x1e\x89\x04\x90\x4f\xab\xe3\xa5\x0a\x38\x83\xe7\x07\x80\x47\xdf\x25\x2f\x38\xb6\x7c\xd2\x8a\x6a\xc4\x5c\x7d\x7a\x1d\x2a\x1d\xe8\xd4\x57\x47\xcf\x09\x30\x1e\x01\xcd\xaf\xd0\xcd\x99\xa6\xe9\x1b\x70\x4d\x50\x9f\xce\x69\x2f\xbd\xef\x2f\x71\xa5\xce\x0b\x35\xbc\x15\xc6\x5f\x87\x68\x24"}, +{{0xf2,0x73,0x5d,0x50,0xee,0x3a,0x9a,0x65,0xb5,0x8c,0x8a,0xcf,0x55,0x16,0x63,0xe9,0x88,0x09,0xec,0x40,0x6f,0x73,0xe3,0xe7,0xf4,0xe7,0x3b,0xc4,0xea,0x92,0x38,0x74,},{0xdf,0x48,0xa5,0xb9,0x4a,0x07,0xaf,0x3c,0x2c,0x99,0xb8,0x38,0x87,0x62,0x24,0x32,0x33,0xc8,0x50,0xdc,0x17,0x53,0x17,0xd6,0x02,0x63,0x8e,0x5b,0x86,0xab,0x49,0xed,},{0x69,0x42,0xa7,0x69,0x64,0x17,0xef,0xaa,0x59,0x1b,0x95,0xe1,0x1f,0x02,0xd7,0x63,0xbe,0xf5,0x27,0x9b,0x93,0x2a,0x8e,0x2a,0x7c,0xbb,0x9f,0x58,0x36,0x95,0xc1,0x4c,0xe5,0xcc,0x55,0x6b,0xec,0x66,0x79,0x9b,0x33,0xcb,0x59,0x2d,0xa4,0xdf,0x27,0x35,0xf9,0xee,0xf2,0xc3,0xce,0xca,0x43,0x62,0x16,0x4b,0x6c,0xc9,0x3d,0xa4,0xe1,0x05,},"\xae\x31\xe9\x4e\x71\x97\xe4\xe4\xd0\x23\x93\x48\x02\x5e\xd6\x68\x1e\x51\x3c\xe1\xa6\xe0\xaa\x0e\x5b\x97\x93\x73\x91\x21\x50\xef\x11\x3e\x50\xef\x05\x69\xc4\x83\xf7\x56\x8c\x4b\xbc\x47\x03\xc5\xda\xca\xa8\x0a\x0d\xe4\xe7\x38\x38\x3f\xa1\xf1\x0d\x6d\x40\x71\xa3\x1b\x99\xe6\x48\x51\x43\x97\x23\x16\xc8\x65\x22\xe3\x7c\x68\x87\xa1\xc3\x07\xb2\x9b\x0d\xd6\xf9\xf1\xb4\x38\x31\x0a\xf9\xd8\xd7\x34\x6f\xb4\x1f\x9b\x2d\xd2\xe8\x0b\x14\xc4\x5e\xb8\x7d\x4e\xd4\x8e\x37\xa5\x26\x0b\x52\x25\x7b\x3e\x99\x78\x7a\x13\xc5\x53\x92\xba\x93\x0c\x08\xe0\x24\x0e\x96\x0d\xef\x0c\x29\xb8\x55\x07\x45\xcf\x14\x9d\xee\x53\xa5\xd1\x74\xec\x06\x5d\x2d\x66\x77\xde\xe1\xfc\x42\x05\x70\x62\xc3\x4e\x27\xea\x5d\xbc\xdb\x86\x1b\x9f\x67\x0c\x60\x32\xc7\x84\x6c\xec\x8e\x87\xa7\xc9\x52\x0e\x27\x96\x7b\x01\x86\xee\x71\xb7\x7e\xd6\xd0\x29\xbb\xdd\x70\x94\x9c\xec\x4a\x70\x93\x29\xfa\x37\xfe\xe0\x02\x49\x0c\xc1\xbc\x4c\x2d\xf6\xf7\x63\xf9\x85\x8f\x33\xd7\x50\xc5\xb5\x05\xa6\x7e\x23\x70\x63\xc0\x48\x6f\x94\x56\xd3\xc6\x20\xd9\xac\x7c\x98\xf1\x38\x1d\xe0\xef\xfe\x41\xc1\x82\x59\x50\x4a\x15\x0d\x68\xa6\xa2\x8b\x0a\x3e\xea\x80\x3b\x85\x53\x15\xc9\xe0"}, +{{0xca,0xd9,0xd2,0x1a,0x01,0xc7,0xe1,0xd1,0x5d,0xf2,0xfb,0xd7,0x9c,0x51,0x6e,0xb8,0xc3,0x40,0x1e,0x9f,0xe2,0x84,0x67,0xcc,0x7b,0x21,0x67,0x9d,0x4e,0x33,0x1a,0x3d,},{0xa7,0xb5,0x5c,0x15,0xd6,0x79,0x0b,0x40,0x53,0x6f,0xca,0xe5,0xad,0x28,0x92,0xcd,0x66,0xb1,0x86,0x89,0xf4,0x99,0xc1,0xfd,0xee,0xa6,0x6d,0x4a,0x7d,0xf3,0x94,0x24,},{0x31,0x92,0x7d,0x01,0xdb,0x9f,0x24,0x72,0xf4,0xdf,0x6f,0x63,0xc1,0x8e,0xbd,0x83,0xc2,0xb1,0xaa,0xf8,0x8d,0x58,0x0e,0x84,0x88,0x54,0xdf,0x8c,0xba,0x63,0x95,0xd3,0xda,0x7b,0xd6,0xbb,0x9e,0xdc,0x1f,0xce,0x1c,0x7d,0x7e,0x13,0x60,0x55,0x8f,0xcd,0xdf,0xa9,0x39,0x15,0xbe,0x07,0x6e,0xfb,0x8e,0xa2,0xdc,0x5e,0xa7,0xb2,0x0d,0x0a,},"\x70\x70\x2b\xf1\x9c\x91\x9f\x98\x36\xde\xfd\x7b\x84\x6f\xd9\x99\x2d\x8b\x7e\xb2\xe1\x06\xae\xb7\x1e\x60\xa3\x1b\x4e\xa2\x5a\x41\xb2\x12\xdc\x7d\xe7\xc9\x1c\xbd\x61\x3d\x58\xd0\x59\x5d\xb8\x33\xcf\xe7\xe5\x05\x84\xf2\x55\x69\x60\x2c\x77\x44\xfa\x67\x5d\x15\x6d\x0f\x63\xcd\x2b\x7c\x08\x9c\x8a\x00\x68\x6a\x43\x71\x69\x82\x6a\x12\xdc\x48\x5b\x38\xc0\x68\xa8\x00\x71\x42\xe5\x16\x37\x47\x01\x1a\x07\xa4\x15\x68\x36\x22\xab\x1e\x23\xce\x57\x7c\x73\x2b\xa1\x4f\x40\x1f\xbc\x30\x43\xe0\x69\x3a\x92\x05\xc1\x9a\x92\x29\x8a\x3d\x9b\x08\xfb\x7a\xfa\xfa\xe0\xa9\xf0\x16\xbc\x75\x0e\xe6\x31\xa5\xf5\xda\x5d\xb6\xf9\xba\x26\x92\xc7\x4c\xaa\xae\xb4\xd0\x97\xe9\x0e\x3c\x02\xd2\xe3\xa7\xfb\x3a\xa0\x00\x04\x0b\x7c\x17\xb7\x45\x64\xe6\x46\xbe\xa1\x6b\xad\x61\x1e\xbc\x08\x59\xa3\x82\x88\x04\xab\x4f\x5c\xfb\xa4\x17\xd2\x54\x51\x5c\xa3\x62\x0a\x3a\xd6\x83\xc4\x6c\xa6\x26\x7b\xb4\x95\x39\xbb\x30\xe3\x69\x08\x7e\x67\x43\x8e\x94\x89\x56\x27\x50\xdc\xcb\xa3\xaa\x0b\x1b\x0a\x6c\x26\x70\x32\xd2\x0c\x2a\xdb\x75\xe6\x8d\xf1\x12\x3b\x52\x59\xbf\xe4\xea\xc6\xca\xdc\xa6\x77\x81\x38\xa3\x73\x18\xad\xb3\x0e\x8d\x66\x9f\x3b\xc9\x69\x2c\xc7\x4b\x68"}, +{{0xd9,0xbe,0x84,0x22,0x55,0xe9,0xa1,0x6b,0x0a,0x51,0xa8,0x67,0x42,0x18,0xce,0xe7,0xcd,0x9a,0x8b,0xdf,0x34,0x35,0x08,0x39,0x7f,0x4d,0xdb,0x05,0xf3,0xfa,0x00,0x82,},{0x79,0x31,0xbc,0x6d,0xfa,0x33,0x24,0x94,0x3a,0xab,0x18,0x3d,0x12,0x85,0x51,0x59,0x19,0x39,0x9f,0xfe,0x0b,0x71,0x06,0x77,0xf0,0x91,0x5d,0x3a,0x5b,0xe5,0x1e,0x92,},{0xc9,0x38,0x45,0x65,0x8c,0x95,0x60,0xd2,0xc0,0xe2,0x8f,0x28,0x2a,0xdb,0xd4,0x65,0x2b,0xaf,0xd3,0xbb,0x2e,0xde,0xc1,0x7c,0x94,0x87,0x8f,0x7b,0x94,0xd3,0xc7,0x7a,0xfe,0xc9,0x06,0xed,0x29,0x2a,0x8d,0xfb,0xf5,0xf8,0xe7,0xc1,0x18,0xe8,0xf2,0xca,0x33,0xdd,0xa7,0x90,0x9d,0x9b,0x69,0x5b,0x8f,0xf5,0xa1,0xc0,0xe9,0x7a,0xc8,0x07,},"\xac\x6c\x55\xb1\x34\x66\x3e\x41\xf0\x2a\x6d\xcb\x85\x49\xea\xa1\xc0\x13\xf5\x96\x58\xd8\x1d\x81\x2f\x95\xb7\x40\x09\x51\x37\x23\x67\x19\x45\xe1\x32\x4f\x90\xf8\xa3\xf9\x71\x36\x91\x81\xb5\x87\xba\xb4\x56\x65\xf7\x88\xd6\x63\xab\x78\x14\x0c\x5a\x22\xc1\xc1\x8d\x4a\xfe\xdc\x74\x48\xa7\x48\xaf\xe5\xbf\x23\x87\x00\x3c\x1d\x65\xab\x18\x48\x2e\xf9\x89\x22\xb4\x70\xda\x80\xad\x14\xc9\x44\x95\x1c\xe4\xae\xd3\x73\x90\xcc\xe7\x9a\x8e\x01\xb2\x4c\x7d\xfc\x11\x41\xc0\xec\xa2\xc7\xf7\x73\xed\x4b\x11\x80\x6a\x34\x61\x55\x13\x48\x6e\x4e\xe1\x1a\xf0\x80\x78\xa1\xb4\x05\x4c\xf9\x88\x02\x98\x60\x8d\xd9\xb3\xfa\xa1\xa2\x42\xa4\x52\xfe\x51\x16\x04\xb3\x10\x2c\x31\x3d\x14\xcc\x27\xc6\xf0\xf8\x47\x1d\x94\x55\x53\x17\xea\xa2\x64\xcd\xf5\x2c\x69\xe1\x8f\x46\x1e\x47\x90\x3d\x21\x29\x87\x16\xb1\x72\xee\x9c\xb1\x78\xf0\x8f\xf2\xd3\xc9\xc1\x62\x12\x1c\x2e\xd2\x1d\x87\x34\xb2\xf0\x63\x0d\x39\x91\x46\xcb\xf7\x6e\x02\x8a\x14\x3f\x2b\xf7\xbb\x50\xaf\x0f\x57\xb9\xba\x80\x21\xd2\x64\xb0\x0c\x66\x62\xf8\x4c\x86\xcb\x6d\x59\x52\xb3\xd2\x41\xf7\xdc\x3e\x70\x0c\x96\x61\x6c\xbc\xfb\x0d\x0e\x75\x3f\xfd\x5d\x21\xee\x32\x0e\x65\xe9\x7e\x25\xcb\x86\x09"}, +{{0xcf,0xc4,0x8c,0xc6,0xf6,0x58,0x11,0xfe,0x7d,0x7b,0xba,0x85,0xd1,0xcd,0x84,0x85,0x8f,0xd6,0xf7,0xed,0xd6,0x38,0xf4,0xf5,0x52,0x36,0x3e,0xe7,0x68,0x5f,0x69,0xca,},{0xd2,0x9c,0x10,0x69,0x4c,0x5e,0x8e,0x3f,0x34,0x47,0xed,0x78,0xd3,0x4d,0xbd,0x74,0xa2,0xb3,0x01,0x37,0x3b,0xa8,0x71,0xb5,0x85,0x0c,0x33,0x3d,0xff,0x7b,0xf8,0xd0,},{0x80,0xc5,0xd5,0x1e,0x96,0xd1,0xca,0xc8,0xef,0xd3,0x45,0x98,0x25,0xe7,0x9c,0x1e,0x9f,0x65,0xaf,0x70,0x1d,0x1d,0x29,0xe1,0xf9,0x5b,0x03,0x67,0x07,0x11,0x3b,0x77,0x98,0x4b,0x7b,0x33,0x50,0xf0,0x40,0x77,0x33,0x3c,0x95,0x7f,0x8f,0xbc,0x7d,0x9b,0x04,0x0c,0x36,0x26,0x51,0x41,0x7b,0x98,0x99,0x02,0x7c,0xd3,0x3e,0xdb,0x11,0x03,},"\x8e\x7d\xef\xb9\xd1\x6d\x03\x6b\xd6\x42\xcf\x22\x6e\x32\x77\x3e\x60\x53\x61\xc5\xec\x4b\x95\x12\x55\x78\x8d\xb0\xa0\x42\xc6\x3e\x5a\x43\x67\xd6\x15\x24\xf1\x0e\x62\x58\x99\x13\x25\xa3\x9a\xb6\xb0\x36\x12\x26\x0c\x3f\xe3\xdf\x20\xb3\x42\x02\xd3\x43\x95\xbd\x4e\xd4\x0b\xd6\x13\x73\xdf\x78\x1a\x4c\x8b\xcf\xbd\x15\x30\x10\x60\xf0\x74\x37\x73\x23\x33\xd8\xe4\x97\x36\x32\x2d\xee\x6b\x22\x43\x8e\x78\x7d\x88\x56\xb7\x0c\x26\xec\x57\xd6\xda\xde\x9c\x3c\x28\xe2\x72\x20\xc5\x67\x0e\x39\x35\x44\xed\x09\x59\x37\x29\x8d\xc3\xad\xc7\x38\x65\xf7\x77\xe9\x00\x37\xbd\xef\x83\x47\x16\x47\x6d\x78\xf4\xe6\xcb\x49\x61\xa4\xc6\x8a\x8a\x83\x63\x38\xa9\xf5\xda\x17\x9c\x4d\x5e\x93\xc3\xf7\x0d\xd3\x5e\xec\x70\x96\x53\xdd\x8d\xe3\x79\x96\xb1\x20\x56\xd4\xee\xfc\xb4\xb6\xb3\xc1\x3b\xa9\x84\xd8\x32\x27\x5c\x43\x86\xeb\xf4\xa8\xff\x7f\x07\x8b\xe3\xd4\x28\xc1\xe0\xd9\xb1\x62\x38\x1f\x06\xa5\xb7\xbb\x12\x70\x40\x03\xd9\x1f\x25\xd1\xd8\xfd\x43\x62\x6c\xe7\x0f\xff\x59\xd2\x92\x77\x68\xa7\x6b\xf7\xf9\xef\x76\xff\x95\x48\x9f\x38\xed\xcd\x1c\x9e\x9b\x8a\x8b\x0e\xf6\x6c\x32\x80\x57\x76\xd5\xae\x9f\xbd\x84\xa7\xaf\x4f\xa6\x56\x3e\xc7\x0a\xc5\x73\x3a\x44"}, +{{0x15,0xc9,0xf7,0xc4,0xd8,0x4a,0x5a,0x47,0x90,0x41,0x95,0x2e,0x6a,0x8c,0xac,0x24,0xe7,0x6f,0xd2,0xd2,0x75,0xc1,0x97,0xe6,0xb5,0x21,0x92,0x9b,0x43,0xba,0x6c,0x5d,},{0x86,0x33,0xc1,0x82,0x9d,0x29,0x09,0x1d,0xf7,0x1f,0xd5,0xc0,0xef,0x64,0x05,0x72,0xe4,0xb6,0x49,0x74,0xcd,0x09,0x7d,0xbe,0xbb,0xcd,0xde,0xba,0x04,0x16,0x47,0xc0,},{0x1e,0x36,0xbe,0xa5,0xa5,0x83,0x76,0x7e,0xbd,0x80,0x30,0x6c,0xab,0x23,0x31,0x55,0xb7,0xb4,0x28,0x14,0xb4,0x34,0x73,0xcf,0x45,0xcd,0xc5,0x03,0x9c,0x93,0x97,0x44,0xa9,0x69,0x4b,0x87,0x22,0x0d,0xaf,0x4c,0xcd,0x29,0xf2,0x5c,0xea,0x40,0x5e,0x7c,0x08,0xdb,0x2e,0xf1,0x7f,0x3f,0x03,0x4d,0xbb,0x49,0xcf,0xf6,0x02,0x83,0xe3,0x06,},"\x11\x73\x0d\xd4\x5d\xda\x80\xd8\x4d\x08\x0d\x92\xe9\xbd\xda\xee\xa6\x87\x8e\x4a\x0b\x3b\x51\x2d\x9e\xa7\x33\x80\x8e\x1c\xef\x51\xd4\x90\x48\xd6\xc7\x81\x16\xa4\xbd\xe3\xc6\x4a\xce\xaa\x52\xbe\xca\x86\xb3\x31\xab\x59\xe9\x18\x5c\x70\x28\x6a\x02\xbb\x5d\xd0\x4f\x5c\x7f\x4e\x9c\x7e\x44\x5e\x77\x45\x85\x65\xf1\x59\xc7\x83\xdf\xd4\xd9\x76\xa9\x10\xe9\x37\x78\x9d\x21\x41\xd4\x16\xed\x3a\x7f\x60\x8d\x26\x73\x7a\x86\xb2\x0b\x62\x4e\x3c\x36\xaf\x18\xd2\x5c\x7d\x59\xb8\xd7\x42\x7e\xc6\xc4\xd3\xd4\x38\xd7\xae\x09\x49\xdd\x7d\x74\x8c\x1f\xfd\x6f\x28\xe8\x28\x5d\x44\x04\x22\xd2\x2a\x37\x61\x20\x2e\x95\x84\xf5\xcd\xb3\x50\x45\x47\xaa\x4b\x68\x57\x30\xc9\x82\xcb\xa2\x13\xde\x08\x02\x0a\x5e\x4e\x46\xa9\x5f\xac\x4b\x48\x1b\xea\x0b\x63\x0a\xbd\x03\x0d\xdd\x33\x5a\x20\xfe\x2c\xf7\x09\x4a\xef\x48\x13\x95\x69\x91\x91\x3c\x68\x21\xf4\xb5\x41\x0d\xf4\xf1\x33\xfe\x63\xe2\x2c\x08\x09\x2a\x0a\x65\x97\x27\x22\xa2\x7a\xe4\x20\x11\xa8\x07\xc3\x27\xb4\x17\x23\x7c\x54\x01\x14\xee\xcb\x9f\x0e\x96\xcd\xa5\xdc\xf0\x24\x6f\x1d\x27\x17\xf4\x9b\x9c\xea\x9d\xc6\xa3\xda\x9b\x39\x6f\x02\x70\x52\x92\x26\xf5\xdc\xba\x64\x99\x91\x8a\x6c\x28\x9f\xe0\x55\xfe\xc8"}, +{{0x6d,0x2d,0x0d,0x82,0x3f,0x29,0x47,0x46,0xb9,0xa5,0x51,0x2e,0x14,0xe7,0x3c,0x1d,0x85,0x5b,0x5e,0x4b,0xca,0x65,0xfe,0x81,0x77,0x29,0x81,0x0c,0xc5,0xef,0x84,0x0d,},{0x1b,0x64,0x80,0xa6,0xa9,0x0d,0xfb,0x47,0x29,0x84,0x85,0x5c,0xef,0x6f,0x1a,0xb3,0x1e,0xb7,0xb3,0xf1,0x3c,0x8a,0xc0,0x0f,0xa5,0x56,0xd2,0x0b,0x53,0xe5,0xae,0x17,},{0xb5,0x15,0xf4,0x9e,0xb3,0x2a,0xd4,0x78,0x69,0x2d,0xf8,0x8f,0x07,0xb7,0x80,0x2c,0x6e,0x0e,0x53,0x27,0xaa,0x08,0xa6,0x36,0x6e,0x4c,0xb1,0xd1,0xe2,0x6f,0x9e,0x65,0xfc,0x81,0xab,0xeb,0xe2,0x21,0x5d,0x64,0x91,0x00,0xf2,0x75,0x98,0x27,0x3a,0x41,0x2b,0x62,0x4e,0x84,0x2d,0x81,0x30,0x40,0x37,0x97,0xe5,0x7d,0xec,0x97,0x5a,0x0a,},"\x87\x72\x72\x1f\x72\xea\xf7\xf7\x30\x40\xc0\x68\xa7\xc3\x75\x3b\xff\xca\x7d\xc2\xd0\x93\x0c\x65\x25\xf4\x25\xe6\x00\x5c\x25\xcd\x4c\x0f\xf5\x09\x5c\x9c\x61\xa5\xd8\xa1\x96\x7b\x8c\x86\x01\x0c\x88\x4e\x50\x9e\x6b\x16\x70\xf7\x90\x46\xe2\x29\x79\xeb\xd3\x54\x73\x40\x90\xd3\xad\xa2\x14\x35\xc1\xf8\x25\x4f\x7b\x52\x22\xcd\x55\x64\xf0\x64\xe9\x77\x64\x03\x66\x44\x9f\x4e\x50\x08\xf8\x70\xf9\xc4\x84\x05\x65\xbf\x4f\xb5\xf5\x74\xc9\x77\x4b\xa2\x56\x8e\x71\xa9\xcc\xd8\x2f\xfc\x59\xb6\x94\xf2\x6e\x7d\xe4\xce\x2e\x3f\xd8\x80\xa0\xee\xf3\x87\x93\x13\x33\xed\xe0\x0d\xcb\x06\x5e\x6d\x0f\x79\x59\x1a\x2a\xa9\x56\xdf\x19\x48\xa2\x65\xcb\x95\x75\x0d\x8a\x23\x3b\x15\xc2\x88\xa0\x54\x87\xc5\x15\x66\x3f\x93\xe7\x40\xfb\x15\x70\xfb\xe4\xbd\x80\xc6\x8e\x8d\x92\x97\x34\x5a\x8a\x01\xcd\xbd\x88\xf4\xa3\x9b\xed\x9c\x5e\xf0\x9f\x14\x4b\xce\x5d\xe5\x68\xbf\x37\x33\xbc\x53\xb2\x03\x9a\x29\xcb\x3e\x19\x45\x01\xad\xc1\xc1\x0e\x86\x38\x3a\xac\x8b\x0f\x85\xc6\x7a\x66\x89\xbb\xe1\x47\x0a\x39\x24\x76\x31\x34\x39\xca\x88\xd9\x8c\x02\x1c\x0e\xae\xc2\x5f\xb2\xf9\xa1\x60\xce\x5c\x78\x61\x70\xbe\x02\x38\xfb\x87\x85\xdd\x33\xbf\xa9\x05\x9a\x6c\x37\x02\xd0\xde\x05"}, +{{0xc0,0xcf,0x79,0x9a,0xf7,0x39,0x5b,0xf2,0x7b,0xaf,0xa3,0x6c,0xab,0x43,0x70,0x45,0xe3,0x9c,0x90,0x3b,0xf8,0x07,0x54,0x83,0x19,0xce,0x44,0xf2,0x87,0x49,0x4f,0xbb,},{0xaf,0xbf,0x55,0x0c,0xa2,0x90,0xc9,0x05,0xbd,0xd9,0x2f,0xc8,0x83,0x1e,0xbe,0x3d,0xfe,0xb6,0xda,0xae,0x4f,0x56,0x00,0x52,0x53,0xcc,0x50,0x95,0x1e,0x50,0xed,0xc2,},{0x5b,0xba,0x01,0xa4,0xc7,0xb2,0x55,0x42,0xd0,0x69,0x12,0xde,0x70,0xaa,0x1e,0x22,0x04,0x23,0xfd,0xf8,0x33,0x8a,0x9e,0x69,0x33,0x95,0xcb,0x6f,0x0d,0xc1,0xfb,0xfd,0x01,0x8e,0x3c,0x77,0xe5,0x0a,0xef,0x90,0xa9,0x08,0x0f,0x30,0xf1,0xf5,0x79,0x2b,0x24,0x31,0x07,0x8f,0xe6,0xe3,0xe0,0x04,0x64,0x24,0x5e,0x17,0xcd,0x8d,0xc1,0x07,},"\xdb\xe6\x57\x80\xe9\x68\xde\x9e\x40\xff\xb5\x7c\xf5\x9a\x60\xfd\x93\xb3\xf9\xa5\xe7\xd8\xed\x51\x80\xad\xbc\x57\x8c\xa1\xbc\x48\xbd\x9f\xb6\x0a\x13\x24\xc9\xc2\xc1\x14\x14\x79\xa0\xdc\xf0\xf1\xd0\x7e\x84\x93\x65\x26\xdf\x42\x33\x3c\x0d\x77\x3e\x3f\xed\x9e\x40\x38\xde\x5b\x95\xad\x90\x5c\x92\xcb\xe0\x40\x48\x7b\xf5\x5e\x10\xe1\xed\xb4\x29\xa0\xec\xc4\xe0\xe8\xd0\x0a\x98\x8a\x9c\xd5\x3e\x2e\xb3\x72\xf4\xfc\x4c\xd9\x53\x7b\x26\x9b\xa3\xa2\x3c\xef\xbc\x8d\xf6\x47\x6e\x75\x43\x4b\x81\xd9\x3e\x88\x91\xbf\x41\x7c\x82\xe3\x63\xf3\xe4\xab\xf8\x0a\x4f\x73\xac\xa8\x4a\xc7\xdf\x63\x37\xf5\x36\xd6\x3d\x93\x9d\x92\xcb\xa6\x4b\xe7\x42\x22\x11\x16\x06\x9e\xf2\x51\xab\xba\x0b\x00\xaf\x01\x71\x8b\xb5\x80\xdd\xbe\xb7\x99\x73\xef\x10\xa6\x8b\x4d\x0f\xa0\x23\xd6\xeb\xd3\x07\x9d\x6b\x32\xa1\xaa\x20\xa2\x1e\x92\x02\xf2\x75\x90\xc3\xf0\xc0\xcc\x25\x30\x73\xc3\xf8\x22\xaa\xc4\x59\xd3\x9f\x50\x75\x8b\x70\xc0\x07\x10\xa3\xc9\x84\x38\x41\x65\x08\x52\x2e\x51\x2a\xda\xa0\xaf\xd5\x03\xa7\xce\xb0\x4f\xb9\x4a\x4a\x93\x2c\xe8\x0c\xd5\xa7\xf1\x1b\xb8\x61\x26\x3f\x58\xe5\x74\x9d\x54\x2a\x11\x0d\xe7\xc7\x68\x9d\xfc\xb0\xc5\x1a\xfa\x9d\x54\xa5\x8f\xf8\x9f\x3f\x67"}, +{{0xcd,0xaa,0x50,0xe8,0x52,0x7d,0xc7,0xa5,0x0f,0xb3,0x7e,0x28,0xfa,0x8b,0x95,0x68,0xc3,0x7e,0x85,0x67,0xe0,0xb4,0x99,0x99,0x7b,0x9a,0xed,0x67,0x61,0x80,0xc3,0xb0,},{0x7c,0x56,0xe1,0x64,0x51,0x02,0x68,0xc1,0x82,0xb4,0x23,0x74,0x79,0x04,0xf1,0xd3,0xa5,0x80,0x93,0x30,0xf6,0xe1,0xb2,0x92,0x66,0xec,0x46,0xe7,0x3b,0xe1,0x55,0x0f,},{0x13,0x7b,0xd1,0x0a,0x50,0xef,0x60,0x93,0x84,0xfe,0x66,0x87,0x68,0xfb,0x87,0x1d,0xe7,0x41,0xca,0x0f,0x53,0xff,0x84,0x77,0xd7,0xeb,0xfa,0x90,0xaa,0xfd,0x5e,0x26,0x81,0xfd,0xf1,0xb8,0x92,0x50,0x46,0x3c,0x15,0xdb,0x8e,0x17,0xa5,0x88,0x25,0xfe,0x94,0x27,0xde,0x08,0x9c,0x34,0xde,0x13,0xcd,0x07,0xbb,0xa1,0x8d,0x4a,0xa4,0x0d,},"\x94\xfc\xfb\xaa\xa3\x03\xde\xce\x7b\x90\x8f\x87\x4c\xc5\xf0\x95\x06\x1f\x17\x54\xbb\x35\x78\x0d\xb6\x66\xb6\x3a\xb8\x29\x08\x11\xbf\x1c\x52\x1a\x7f\x8f\x78\x5e\xa2\x70\xdf\xb3\x9d\x0d\x6e\xd9\x5a\xb7\x19\x55\xa1\x1f\xfa\xea\xa2\x68\xe0\x81\xff\x3e\x4f\x24\x25\xb4\x18\x80\xa9\x87\x15\x1e\x67\x8e\x89\x11\x13\x50\x94\x2d\x82\x0c\x3e\xec\x36\x21\x24\x26\x66\x3b\xe1\x75\xe5\x28\x6b\x4a\xd1\xcc\x80\x4e\x3e\x3a\x03\xb9\xfa\x3e\x82\x83\x8e\xbb\xc2\x61\x5a\x64\x5f\x2c\xa1\x46\x8a\xc4\xa1\xcd\xbe\x52\x37\x61\xe8\x3f\x43\x81\xb0\xc8\x55\x0a\xe5\xe8\xc8\xcd\x1f\xda\x57\x19\x14\x36\xe2\x7c\xb8\x83\xbc\x64\xbe\x86\xa9\xdc\x61\x10\xef\x34\x01\xd8\x8a\x7d\xeb\xd1\xb7\x01\xd9\xc2\x57\xa6\x82\x6c\xf0\x1e\x9e\x29\x22\xe3\xae\x57\x7f\x28\x34\x27\x5f\xb0\xec\xda\x80\xed\x8c\xf1\x80\x1e\x0b\xc5\xe0\x1e\x26\xa7\x7c\x48\xbd\xf4\x6a\x5c\x48\x94\xd2\x2a\xb5\x3e\x74\x18\x27\xe2\x4b\xed\x5f\x07\x50\xff\xad\x05\xe5\x3f\x1d\x5e\x61\xdf\xd3\x16\xb1\x91\xd9\x79\x7e\xf7\x13\x13\x1a\x8b\x43\x0a\xbe\x3f\xac\x5f\x3c\x4a\x2c\xa0\x21\x87\x8b\x15\xad\xc8\xc5\xf5\x42\x11\x42\x60\xe6\x87\xa9\xd1\x99\xd2\x30\xc4\xe0\xd3\xfc\x69\x69\x93\xb5\x9c\xcf\xa3\xff\xa9\xd8\xd2\xfb"}, +{{0x0f,0xde,0xa9,0xbe,0xe6,0x28,0x8f,0x94,0x7e,0x0a,0xdb,0xdd,0xa4,0xdf,0xb2,0xba,0xa0,0x38,0x91,0xaf,0x25,0x02,0x4a,0x5e,0x13,0x8a,0xc7,0x79,0x84,0xd0,0x05,0x07,},{0x70,0xab,0xd8,0x64,0x30,0xd7,0xe8,0xd6,0x32,0x09,0xc8,0xb3,0x73,0xec,0x4e,0x4b,0x79,0xe9,0x89,0xe6,0x72,0x5f,0xac,0xef,0xba,0xde,0x3c,0x75,0x74,0xd2,0x3c,0xd0,},{0x80,0xc4,0x2d,0xd5,0xdf,0x03,0xb2,0x85,0xa8,0x6a,0xc9,0x5c,0xe6,0x66,0x9f,0x78,0x6a,0x97,0x8a,0x81,0x3a,0x9d,0x7b,0x8c,0x6a,0x23,0xde,0x76,0xfb,0xd0,0x9b,0xdb,0x66,0xc5,0xdd,0x1c,0xc9,0xf1,0xa1,0x76,0xcb,0xa3,0x88,0xd5,0x05,0x17,0x64,0xa3,0x2f,0xa2,0x7f,0x00,0x28,0xba,0x48,0x98,0x06,0x8b,0xd0,0x1a,0x3e,0xe1,0x72,0x08,},"\xcf\x72\xc1\xa1\x80\xa2\xbc\x37\xd8\x47\x8d\x9a\x7a\x39\xac\xf0\x3b\xf2\xa5\x07\x90\xf7\x90\x2f\x81\x12\x12\x22\xd3\x1d\x3e\xc9\x16\xf4\xf2\x4c\xef\x9d\x7c\x41\xdc\x02\x1b\x0e\x84\x87\xbb\x89\x2e\x47\x30\x5e\x54\x52\x03\x03\xe8\x9b\x30\xb2\x63\xda\xc4\xa9\xba\x37\x5d\x46\xc4\x0f\xcf\x40\x05\x35\xc9\x59\xd2\xb7\x46\xa7\xfc\x97\x0c\xf6\x5b\x47\x2e\x84\xb5\xf1\xd0\xeb\xad\xcf\xa1\xae\xd6\xfc\x47\xfa\xcc\xe1\x6a\x36\x6a\x3b\x1d\x6e\x51\x68\x13\xc1\x96\x09\x75\xf8\xf2\xb4\x30\x42\xfb\x4e\xea\xab\xe6\x3c\x6f\x65\xdb\x45\xdd\xb7\xdb\x88\x8a\x19\xa9\xd7\xba\x6c\xa4\x79\xfc\xd7\x0c\x5d\x1e\x97\x0f\x12\xc1\x4f\x4d\x24\xfb\x7e\x2f\x35\x7b\xd3\xa9\x4a\xa1\xb8\x68\xcc\xc0\x84\x7f\x2e\xef\x21\x85\x3e\x25\x3b\xaf\xbf\x07\xc4\xe6\x17\x6a\x1e\xf0\x77\x16\x78\x41\xeb\xbe\x56\x29\x33\x71\x57\xf3\x9f\x75\xc7\x1d\x21\xe7\xe9\x6c\x51\xa1\xb1\x6f\xa8\xdc\x60\xf0\xb1\x27\x9f\xcd\xa2\x64\x1f\xc8\x59\x1e\x3c\x49\x2f\x15\xbf\x83\xca\xf1\xd9\x5b\x2c\xd9\x13\x32\xf1\xb4\x20\x2f\xe7\x28\x62\xca\x2e\xa2\xef\x92\xc1\x1d\xb8\x31\xd8\x2f\x8f\xc3\xd4\x1f\xe2\x9a\x76\xc2\x11\xa7\x58\xe2\xf7\x1b\xd8\x9d\x2c\x66\x10\xf2\x01\x42\x9f\x34\x8d\x56\xe1\x0e\x3b\x7a\xf5\x3e\x27"}, +{{0x03,0xd5,0xe4,0x66,0xf8,0x29,0x8a,0xb5,0x43,0x8a,0x30,0x97,0x6d,0x13,0x22,0xa7,0x21,0x5a,0x64,0x2d,0xd5,0xfb,0x4c,0x3f,0x85,0x19,0x40,0x9a,0x75,0x22,0xf0,0x92,},{0x4b,0x3e,0xd4,0xdb,0x08,0x0e,0x2a,0x45,0x2e,0x16,0x91,0x2c,0x14,0x50,0x44,0x24,0x92,0x0a,0x60,0x97,0x56,0x04,0xe4,0xf3,0x79,0x25,0x8d,0x1c,0x8b,0x19,0x3d,0x6f,},{0x6d,0x7e,0x46,0x58,0xf2,0x6f,0x33,0x7c,0x98,0xe0,0x3f,0x13,0x54,0x2e,0x2f,0x39,0x44,0x0f,0xf7,0xbf,0x8d,0x88,0xf3,0xf6,0xdf,0xa4,0xd6,0x49,0x48,0xcd,0x96,0xb7,0x90,0x51,0x49,0x2f,0xc2,0x8f,0x65,0xf2,0xcc,0x0d,0x23,0xa0,0xc4,0xd5,0xe2,0x30,0x7b,0xb1,0xc4,0x7e,0x11,0xe5,0x3b,0x37,0x1f,0x09,0x1b,0x69,0xf8,0x0d,0xbd,0x05,},"\x1b\x47\xb7\x00\x13\xcb\x53\xe1\xf8\xf4\x97\x1e\x0f\x39\x56\x3c\xe8\x7e\xdb\xc2\xce\xdd\x99\xe5\xa3\x55\x85\xdf\x8b\x00\xa8\x52\xf7\xb9\xc9\x7c\x7e\x4a\x54\x65\xfc\x56\x05\xae\x8c\x5c\x36\x57\x0a\x99\x20\x1a\x7a\xd6\x03\x12\x87\xef\x0c\x7b\x2b\xa6\xe5\x7b\x05\x6d\x0f\xc8\xd6\xca\x43\xbf\x6c\xbd\xab\x09\x89\x34\xb4\x03\x19\x7b\x52\x5d\x22\xd4\x5e\x6b\x29\xc7\x8f\x8d\x61\x83\xe4\x1f\xfe\x19\x7d\xae\x25\xba\x22\xb0\x66\x69\xae\x05\xba\xdd\x7e\x1d\xa6\x93\x2a\x7d\x05\x4c\xba\xb3\xf5\x4e\x51\x46\x22\x3a\xd8\x67\x12\x31\xbc\x16\xfe\x62\x67\x9b\xd2\x81\x7a\x6b\x80\xe6\x53\x99\x8c\x49\x49\xf8\x1f\xf5\x3b\x61\x73\x16\x3e\x11\xda\x3e\x6d\x3c\x76\xd8\x4c\x71\x32\x25\xb4\x17\x3d\x6b\xf0\x6a\x85\xb6\x98\x8a\x48\xbe\x43\x59\xcb\x51\x55\x03\xca\x56\x3f\x43\x53\xf8\xe7\xd4\x5e\x4d\x94\x46\x2c\x89\xa0\x4a\x00\xf1\xb3\xb0\xca\x64\x22\xd5\xdb\x02\x9c\x50\x7d\x46\x48\x34\xa2\x0c\x78\xa7\x13\x66\x1d\x84\xed\xff\xc4\x96\xd6\x92\x82\x61\x98\x94\x43\x7b\x44\x87\x95\x4c\xbe\xa2\xaa\x72\x61\xe6\xa6\x2b\x68\x51\x15\x4a\x5d\x25\xfb\x6b\x4f\x09\xc5\x94\x73\xd3\x85\xce\x03\xe9\x1b\xa8\x65\xea\xb6\x6c\x58\xc0\xab\xb0\xb7\xa7\x8e\x4b\xe9\x27\xe5\x54\x60\xcc\xd7\x0d\x82"}, +{{0x76,0xcc,0x18,0xa1,0xda,0xff,0xfa,0x10,0x05,0x86,0xc0,0x6a,0x7b,0x40,0xf7,0x9c,0x35,0xfe,0x55,0x8c,0x33,0x9c,0x29,0x99,0xa5,0xf4,0x38,0x75,0xcf,0xad,0xe0,0x3e,},{0x4b,0x9d,0xa8,0xd2,0xf1,0x37,0xdc,0x6c,0x85,0x7a,0x99,0xa5,0x99,0x8d,0xd8,0x9d,0xd5,0xf0,0x59,0x71,0xa2,0x1e,0x8c,0x77,0x66,0x70,0xeb,0x47,0xbc,0x12,0x70,0xa5,},{0xdb,0x74,0x75,0x1c,0x66,0xe6,0xb1,0x86,0x60,0x44,0xdd,0x9a,0xe9,0x9f,0x19,0xe6,0x33,0x4f,0x17,0x9e,0x79,0xd8,0xb8,0xe0,0xc8,0xcd,0x71,0xd2,0x2c,0xef,0xb9,0xea,0xb7,0xe3,0xe7,0xa9,0xc2,0xda,0x22,0x5f,0x2a,0x9d,0x93,0xa3,0x13,0xd1,0xcb,0xf1,0xb7,0xfe,0x25,0x97,0xb8,0xd7,0x02,0xbf,0x30,0x17,0xa6,0xa6,0xbc,0x7b,0x7b,0x06,},"\x45\x22\xb1\xd8\x23\x73\xf7\xa3\x18\x22\x1e\x7e\x57\x61\x75\x03\xdd\xf4\x4f\xd5\x39\x97\x52\x2a\x1d\x96\x3c\x85\xb7\x08\xd0\xb2\x45\xde\x37\x2a\xd5\x2e\xc7\xf5\x4f\x62\x13\xd2\x71\xf7\xc9\x1d\x5a\x1d\x36\xd1\x34\xdb\x38\x9d\xf0\xb0\x81\xa0\x6b\xc0\xc7\xa4\x87\x5f\x72\x40\x92\x79\x31\x72\xc9\x11\x56\x41\xc6\xd0\x54\xf1\xd9\x92\xe0\xfa\xe4\xdf\x58\x69\x5f\x0e\xa3\x44\x9d\x7a\x4b\x3a\x88\x57\xe1\x98\x03\xfe\x49\xb6\xd5\x2c\x9f\xf3\x74\x6a\x57\x4a\x27\x56\x95\x65\x79\xf9\xfb\x80\x9a\x0e\xde\xc9\x2c\x55\xe9\x5f\xfe\xfa\x3d\x05\xf1\x65\x82\x2f\x46\x4a\x21\x99\x9f\x29\x69\x1f\x67\x44\xac\x5a\x3e\xe4\x90\x17\x88\x06\x45\xe8\x37\xed\xeb\xfd\x2e\x0f\x24\x99\x7f\x04\x11\x45\xa7\x2e\x23\x76\xad\xa2\x83\x18\x6c\xa2\xb8\x36\x36\x29\x77\x19\x5b\xae\xe3\x0a\x3a\xcc\x81\xb2\x43\xf3\xee\x37\x6a\x2c\x47\x64\xc7\x83\x66\x7a\x4b\x11\x77\xe7\x95\x1d\x3e\x3c\x7b\xe4\xf1\xbd\x7a\xe8\xc6\x0f\xd5\xfb\x0f\xd9\x1f\x0c\x1c\x14\xd0\xd2\x32\x7e\x8f\x20\xd9\x2c\x0d\xfc\xc5\x38\x70\xe9\xd9\x9f\xdb\xf9\xdd\x9a\x17\xe8\x82\x50\x9a\xe7\xba\xa8\x65\x3e\x39\xed\xc8\xee\x56\x90\x00\xd6\x24\xcb\x93\xa0\x75\x4a\x79\x8d\x1f\x81\x1f\x6a\x0e\xf5\x50\x1a\x17\xbc\xf2\x5f\xd0\xf9\x16\x26"}, +{{0x71,0xad,0x98,0x0d,0x58,0xad,0x8e,0x7d,0x33,0x30,0x66,0x89,0x35,0x89,0x36,0xa3,0x72,0xd5,0x19,0x0b,0x24,0xec,0x7f,0x9b,0xde,0x74,0x9c,0xb8,0x11,0x50,0xef,0xda,},{0xfd,0x35,0xa7,0x5f,0xe5,0xab,0xc2,0x01,0x04,0x69,0x1a,0x24,0xa4,0x65,0x94,0x40,0xb5,0x5a,0xea,0xea,0x90,0x2a,0xc3,0xbe,0x27,0x4a,0xf2,0x7a,0xa8,0x31,0x28,0x69,},{0x81,0x67,0x0b,0x10,0x29,0xe4,0x81,0xe9,0xff,0x3c,0x17,0x1f,0x05,0xc1,0x68,0x61,0xc8,0x46,0xee,0x79,0xcd,0xf2,0xe2,0x1e,0x3b,0xf9,0x52,0xbc,0xfa,0xc9,0x75,0x65,0xf2,0xb1,0xdc,0xed,0xf6,0x9d,0x2e,0x7e,0xb3,0x5c,0xaf,0x56,0x62,0xe8,0xbc,0x67,0x1f,0xbb,0x96,0x75,0x6a,0x63,0xa5,0x96,0x26,0x4d,0x1b,0x7f,0x4a,0xf9,0x7e,0x06,},"\xe8\x7a\xe0\x73\xff\x5d\xcc\x54\x85\xa1\x99\x40\xe4\xe3\xff\x26\x3a\x06\x18\xa9\x02\x5a\xd4\x03\x2d\xfb\x36\xd1\x71\xce\x88\x1f\x71\xc1\x8a\x49\x21\x0e\xb4\x58\x19\x80\x61\x42\xe2\xf0\x0d\xb3\x04\x18\x35\xbf\x2c\x3b\xcc\xf1\xdb\xa0\x2b\x8b\x5a\x5b\xda\xf8\xfe\xa3\x16\xc0\x62\x3d\xd4\x8a\x56\x4e\xc1\x66\xf0\x37\xd5\x87\xc8\xc0\x16\x84\xe5\xe5\xc0\xba\x9d\xba\x4d\x23\xb4\x9a\x03\x09\x24\x4e\x28\x2a\x51\x40\x86\x22\xed\xb0\x57\x04\x74\x7e\x0c\xde\xec\x97\x68\x93\x77\x70\x71\x09\x89\x72\xc1\x13\xa8\xab\x63\x9c\x31\xf1\x61\x32\x33\xee\x46\x0e\xea\x8a\x8c\x10\xe1\xe6\xe1\x52\x21\x45\x29\x87\x8c\xf1\xad\xae\xaf\x78\xcf\x19\xba\xc7\x13\x61\x81\x5b\xf5\x79\x55\x49\x8f\xab\x4f\x0f\x2b\x75\x86\xc8\x6f\x9f\x4c\x2d\xdf\x89\x72\xf9\xb9\xe0\xeb\x63\x6d\x84\xbc\xc1\x43\x85\xb2\xd0\x38\xbe\x55\xa9\x63\x70\x2e\xfe\x22\x5a\x50\xbd\xd0\xc4\xda\x92\xa2\xa6\xa0\x91\x00\xea\x04\xa2\x11\xd3\x96\x45\x8d\xce\xb4\x48\x71\x16\x83\x7d\x13\x9e\xb0\xf1\x22\x53\x8e\xd3\x98\x6a\xd0\xaf\x4d\xa2\xdf\xfc\x89\xf3\x26\x9c\xa8\x85\x38\x08\x6e\x69\x1e\x5b\xea\xe9\x58\x1e\x7c\x63\xd8\xe6\x12\xda\x2c\x47\xf7\x4d\xde\x1d\x94\x95\x1e\xad\xb0\xdf\x60\xc3\x89\x7d\x2a\x30\x95\xc5\x06\x09\x3b"}, +{{0x61,0x59,0x4e,0x24,0xe7,0x5f,0x99,0x6b,0x4f,0xb6,0xb3,0xe5,0x63,0xf6,0xa4,0xf9,0x91,0x5c,0xfa,0x65,0xdd,0xb1,0x99,0xb0,0x1f,0xed,0x7f,0x8e,0xd7,0x82,0x4e,0xcb,},{0x86,0x27,0xd2,0x14,0x15,0x79,0xcd,0x25,0x21,0xaa,0x07,0x68,0x00,0xac,0x35,0x4b,0x9e,0x3a,0x47,0xd7,0x1c,0xed,0xc8,0x54,0x74,0x34,0x26,0x82,0x25,0xe3,0x30,0x05,},{0x63,0x02,0xb3,0xff,0x27,0x10,0xbe,0x30,0x6c,0x92,0xb9,0xaa,0xe3,0x0d,0x23,0xc3,0xd4,0xbe,0xff,0x39,0x4e,0x63,0x20,0x1e,0x6a,0xd1,0x17,0x13,0x34,0x5c,0x4f,0xcb,0x5c,0xc8,0xd3,0xdd,0x10,0xad,0xfb,0x82,0xbb,0x11,0xa1,0x89,0xce,0x7e,0xc3,0xe4,0x22,0x27,0x27,0x62,0x4f,0xc1,0x78,0x81,0xc1,0x47,0x88,0xd2,0x71,0x0e,0x16,0x08,},"\xbc\x01\xb0\x8c\x7c\xaa\x23\x61\x00\xa0\x12\xa7\x26\x47\x7d\x0e\xc3\x89\xdb\xfa\xda\xc7\x3d\x51\x06\x42\x4c\x5d\x1f\x3d\x1c\xef\x16\x95\xcf\xd9\x3a\x70\x62\xec\x8b\xf1\x06\x70\x47\x85\x49\x20\x16\x2f\x65\x13\x57\xbe\xdf\x1c\xd5\xa9\x2e\xc2\x9b\xdb\x5d\xff\x71\x6e\x8f\x60\x25\x51\x5a\x95\x49\xba\x36\xcd\xc3\x5c\xed\x7c\x5c\x0c\x36\x8e\x6c\xd9\x2f\x2f\x10\xae\x14\x6a\x20\x72\x8c\x37\x4b\xba\x50\x96\x41\xce\x88\xcb\x42\xff\xf0\xce\xdf\xd9\xfd\x67\xf3\x10\xf9\xd0\x1a\x3f\x36\x90\xeb\x21\xdb\x17\xbc\xe6\x7a\xe3\x5c\x4c\xd2\x4c\x20\x9f\x09\xf0\x44\x75\x9d\x8d\x5a\x7d\x24\x8e\x2b\xd9\x66\x52\x4b\xa8\xc0\xc2\x89\x74\x72\x6b\x43\xbd\x05\xde\x84\x34\x33\xcc\x40\x05\x98\x92\x29\x74\x62\x3d\x9a\xcb\xfd\xc7\x61\xc4\xc0\x43\x75\xa9\x52\xce\x54\xca\xff\xaa\x96\xac\xff\x6d\x9d\xc2\x78\x74\x2a\xf4\x76\xe1\x86\x5c\xb8\xc2\x0d\x13\xd1\xc1\x90\x08\x63\xbc\xa2\x31\xe4\x4c\x6b\x0d\x47\xcb\x41\xd5\x10\xf7\x95\x8f\x48\xf3\x04\xd0\x3d\xa0\x33\x48\x4a\x3e\x1f\x27\x3f\xaf\x69\x83\x37\x5b\x7d\x3b\xe0\x3d\x8a\x0a\x00\x2d\xef\x63\x65\xbe\xb2\xfa\x8c\xcf\x1a\x94\x98\x7a\xdc\xd3\x3d\x0d\xa1\x17\x7f\xc5\x15\x9b\x6e\x56\xd0\x04\x30\x1e\x92\x1d\xbc\x12\xec\x0a\x73\xf4\x13\xcf\x2c\x48"}, +{{0x54,0xe6,0xbb,0xfb,0xf8,0xc0,0x6f,0xf2,0xc0,0x66,0x31,0x8c,0x2e,0xbf,0x03,0xd5,0x06,0x54,0x7b,0xf4,0x3c,0x2d,0x7a,0x5d,0x4d,0xf3,0x05,0xa3,0x03,0x2b,0x71,0x38,},{0x3b,0x71,0xaa,0x1d,0xef,0x66,0x6d,0x91,0x88,0xf4,0x03,0xf8,0x2e,0xd3,0x04,0x54,0xab,0xa5,0xbc,0x9f,0x47,0x0f,0x6e,0xb9,0x88,0xda,0x18,0x7c,0x92,0x52,0x32,0x84,},{0x3d,0xf4,0xd0,0x90,0x79,0xf8,0x30,0xe3,0xf9,0x82,0x28,0x36,0x81,0xba,0x37,0xb5,0x0f,0x3c,0x73,0xde,0x2c,0x5d,0x22,0xa2,0x91,0x35,0x8e,0xbb,0x1f,0xb8,0x54,0xe5,0x10,0xf6,0x3f,0x9a,0x48,0xe9,0xff,0xf7,0xfd,0x83,0x11,0x30,0x2e,0xa3,0xe9,0x69,0x39,0x4e,0x6d,0x49,0xc9,0xe3,0x18,0x20,0x54,0x94,0x2f,0x6a,0x74,0x4c,0xee,0x03,},"\x03\x18\xd7\xcb\x48\x05\xaf\x98\x21\xdd\x3f\x91\x4b\x0e\x07\x6f\xea\x04\xa7\xd2\xdb\x3a\x59\xa0\x0a\xff\xea\xd3\x32\x5a\x2b\xe4\x0c\x1f\x87\xf5\x32\x76\xa8\x55\x26\x04\xf2\x28\xb9\x76\xe2\x88\xb9\xbe\x90\x6a\x7b\xd2\x5b\x2f\xfa\xb8\xa8\xaf\x5d\x0f\x6e\x08\x78\x6f\xd0\x34\xe2\xfe\x1e\xb7\xee\x03\x39\x79\x86\x0d\xd1\xe5\x32\x72\x87\xe9\xe6\x15\xf5\xdc\x5a\x96\x0f\x17\x02\x6b\x56\x84\x2f\xc8\xd4\x4c\xad\x00\x2e\xdc\x85\x01\xcf\xb9\x56\x00\x15\x02\xe4\xdd\xc8\x1a\x77\x00\xd9\xc0\xbe\x88\xeb\x4a\xaa\x64\xa6\xcb\xc3\x9d\xe8\x2f\x13\xc1\x10\x86\xde\x1a\x42\x70\xd3\xaf\x97\x28\x4b\xac\x1c\xae\xf1\xd3\xed\xaa\x10\x71\x66\x6b\xd8\x3b\x2e\xde\x39\x62\xd9\x8b\x9d\x93\x49\x7d\xdf\xd8\xe9\x7d\xab\x30\x89\x95\x0c\xf3\x0e\xd1\x1d\xb7\x7a\xd1\x43\x7a\x0a\xf5\x88\x9d\x8e\xfc\x44\xe6\x12\x42\x0e\x39\x07\x26\x7d\xf3\xac\xff\x4b\xd3\xfb\x6e\x8c\xa5\xba\xdf\x8e\x72\xf9\xde\x39\x52\x86\x53\x05\x85\x24\x45\x6a\x81\xda\x5f\x84\x98\x2a\xfa\xc3\x4b\xef\x5f\x71\xe9\x1f\x8f\x90\x93\x8a\x6f\x5f\x1f\x28\x77\x16\xde\x56\xa0\x94\x6d\x26\x1e\x87\xbc\x77\x5c\xe1\x89\xe4\x1a\x77\xba\xed\xe7\x32\x0a\x3c\x60\x8f\xc9\x71\xe5\x5d\x0a\x77\x3c\x4d\x84\x8d\x42\x86\x37\xf1\x1b\x4e\x44\x60\x39\x0c"}, +{{0x68,0x62,0x06,0x1b,0xe0,0xde,0x9d,0xfd,0x99,0x81,0x18,0x20,0x4b,0x2b,0x98,0xdb,0x3c,0xe7,0xd7,0xe8,0x19,0xdb,0xc1,0x07,0x94,0xaf,0x0a,0xb2,0xb0,0x6e,0x84,0x34,},{0x9c,0x5f,0x7c,0x22,0x65,0xdd,0xe1,0xb2,0x5e,0x4f,0x27,0xec,0x71,0x58,0x0d,0x52,0xdc,0x89,0xf2,0xc3,0xa7,0x12,0xbc,0x1a,0xd5,0xd6,0xd6,0x9e,0x71,0x1e,0x08,0xd4,},{0x96,0x5e,0xdb,0x34,0xe8,0xab,0x8b,0xc3,0x20,0x4a,0x32,0x01,0xd2,0x21,0x86,0x37,0x2d,0xe4,0x24,0x26,0x00,0x29,0x7c,0xfd,0xb5,0x7a,0xa1,0xdf,0x07,0x4e,0xc5,0x0d,0xdf,0x10,0x10,0x5e,0x9d,0x4c,0x89,0xa2,0x66,0xc3,0x4d,0xb7,0x77,0x2a,0xa9,0x4c,0xba,0x94,0x64,0x29,0xe6,0x8b,0xa6,0x2b,0xf9,0xa0,0xac,0x90,0xf5,0xf0,0x5b,0x02,},"\x17\x40\xdd\xe8\x43\x4a\x0d\x68\x99\x25\x67\x9b\x0c\x18\x03\x00\xcd\xbd\x0c\xf6\xa8\x9a\xd8\xfd\xe3\x46\x53\x31\x6c\xee\x4c\x57\x1a\x41\x05\xc9\xe9\xe0\x28\x42\x38\xfe\xf2\xc3\x8a\x09\x15\x7c\x5d\xb9\x43\x40\x57\x1b\x39\x0a\xdf\xb6\x9f\xf4\xc0\xdc\x50\x53\x25\x3a\x67\x9d\x42\xcc\x1f\x1b\xf1\xff\x42\x92\x29\xea\x0a\x50\x44\xc6\xf7\x95\x64\xe0\xdd\x28\x7f\x53\xf0\x15\xb8\x31\x87\xd9\xad\x27\xd9\x10\x39\xaf\x06\x2c\x43\x7b\x15\x75\xa0\xea\xb6\xae\xb8\xaa\x0d\x27\xb2\x76\x65\xd6\xde\xa9\x04\x1f\xf9\x96\x3a\x31\x18\xb3\x29\x8a\x85\x44\xe3\xfd\x69\xac\x68\x77\xe3\xe4\x05\x2f\xe4\x42\x2b\xf0\x35\x60\xb2\xc5\x7e\xc5\x31\xee\x8b\x5f\xf5\x3c\x28\xdb\xde\x35\xbb\x45\xc3\x50\x77\x63\x6e\x6f\x84\x1b\x59\xd7\xeb\x77\xbc\x77\x91\xb6\x09\x38\x58\xa3\xa8\x0a\x3a\xa6\xd7\x78\xdb\xf5\x3d\xb9\xd0\x61\x19\xc5\x0b\x71\xc7\x91\xc0\x49\x5c\x57\x6d\x1b\x59\xd3\x96\x87\x3e\xd8\x71\x48\x53\x52\xc8\x29\x9a\x35\x9d\xa5\xee\x9d\x7f\x36\xed\x14\x55\xf8\x98\x51\xa3\x08\x51\xbe\xa7\x19\x68\x5a\xec\xd0\x8f\x25\x56\x26\x09\xdd\x10\x66\x30\x73\x52\x77\xe1\xd6\x51\x9b\xb1\x68\x7d\xe8\xb8\xc6\x8b\x96\x71\x45\x2e\xdb\xb3\x49\x1d\xa2\x64\xcd\xfa\x00\x17\xc5\x12\xd2\x76\x97\x59\xcb\x92\x5f\xb6\x64"}, +{{0xb2,0x25,0x0b,0xbc,0xb2,0x68,0xd2,0x47,0x7c,0x83,0x12,0xb1,0x90,0x0f,0xd9,0x99,0x82,0xba,0xa2,0x9a,0x68,0x97,0x4f,0xbf,0x87,0x78,0xa1,0x22,0x8d,0xc9,0x75,0x50,},{0x44,0xaa,0x8d,0xf1,0x18,0x16,0x74,0xb0,0x5a,0xde,0x98,0x0f,0x7e,0xdd,0xba,0xf3,0xbd,0x74,0x22,0xa9,0x20,0x28,0x7c,0xb2,0xd2,0xdb,0x59,0xa0,0x63,0xee,0xbf,0x74,},{0xf2,0xb8,0xd9,0x2e,0xd5,0x1e,0xbd,0x10,0x00,0xbf,0x9d,0xd3,0x41,0x1a,0x9f,0xa9,0xe7,0xae,0xe5,0x4c,0x4c,0x86,0xe2,0x4a,0xd0,0xf9,0xad,0x5c,0x55,0x64,0x3a,0x12,0xd6,0x80,0x01,0x9c,0xa0,0x3f,0x21,0x6b,0xd4,0xbd,0x32,0xc9,0xce,0x1c,0xd8,0xa5,0x28,0xc3,0xff,0xaa,0x5d,0x5b,0x1d,0xc9,0x1a,0x4b,0xe5,0x6f,0x0e,0x2c,0x5e,0x06,},"\x7e\xf0\xae\x13\x36\xa6\xfa\xb3\x7f\x99\xda\x5f\xa7\xd0\xde\xc7\x40\x9c\x07\x26\x23\xea\xd8\x4f\x24\x1d\x53\xd0\x59\x6b\x46\x17\x05\xfb\x1b\x3c\x53\x7d\x36\xb8\x9e\x89\x60\xfe\xbb\x4c\xdc\x0d\x42\x7c\xe2\xfc\x1b\xe5\x8d\xbb\xce\x15\x1e\x35\xac\xd8\xb6\xac\xe4\x0a\x19\x82\x29\x14\xa4\xbd\x8c\x4a\xf6\x32\xf1\x36\x41\x8a\xc4\x9b\x18\x4d\x55\x19\x3e\xbc\xc3\x2d\x0d\x79\x87\x09\xb1\xa8\xfe\x29\x4f\xba\x8a\x1f\xe7\x2d\x97\x6b\x44\x00\xd4\xa3\x93\x24\x23\x11\xb0\xf8\xcc\x99\x4e\x89\x47\x5b\x00\x38\xae\x5d\x89\x14\x93\x8e\x8f\x6e\x87\xc6\xf5\x0b\x9d\x65\x6c\x45\xd7\xb1\x42\x31\xef\xed\x97\xf3\xc9\x06\x68\x91\x36\x70\xbf\x5b\xe2\xef\xd5\xc2\x70\xc7\xcb\xaf\x01\xe8\x57\x2e\x98\x00\x97\x8d\xfe\x2e\x10\xa2\xfc\x04\x40\xb8\x55\x62\x9b\xf9\xcd\x40\x9e\xa9\x41\xcb\x69\x22\x6c\xac\x77\x1b\x15\xea\x77\xc0\x32\x68\x48\x80\x6f\xf8\xd2\xe2\x01\xe6\xe2\x6c\xd5\xf4\x54\x30\xda\xdc\xff\x8f\x59\xc3\x21\xc1\xc9\xc6\xa2\x9b\x94\x88\x29\x35\x44\x7d\x3e\x6c\x2e\x88\x04\xb1\x16\x15\x76\xbd\xf0\x32\x0f\xe5\x3c\x30\x7d\x9c\xde\x42\x60\x77\xa7\x67\x7c\xde\x3c\x1b\xc8\x3e\x18\xe6\x0a\x0c\x4e\xe6\xdc\xcd\x87\x7c\x21\x3a\x8e\x4c\xca\x64\x0e\xe0\x49\x29\x80\x45\x70\xae\x1f\x96\x15\x7c\x04\x35\x7a"}, +{{0xb8,0x09,0x36,0x1f,0x55,0xcf,0xe8,0x13,0x7f,0xbd,0xa8,0x80,0xfc,0x62,0xcb,0xe4,0x4c,0x21,0x6e,0x14,0x18,0x93,0x34,0x63,0x02,0xb3,0x36,0x04,0x5d,0xe2,0x18,0x78,},{0xfd,0x23,0xe4,0x2f,0xf0,0x66,0x44,0xea,0xd3,0x47,0xab,0xcc,0x1b,0x3e,0x03,0xb0,0xe8,0x85,0x93,0xb6,0x12,0x54,0x98,0x1d,0xd8,0xae,0x59,0x45,0x4e,0x61,0xb3,0xe0,},{0xb5,0xb5,0x95,0x0d,0x37,0x72,0xd2,0xee,0xf8,0x8e,0x1b,0x0f,0x5d,0xf5,0xff,0xae,0x2f,0x21,0x03,0x88,0x5e,0x71,0x44,0x6d,0x34,0x6f,0xbb,0x5d,0xae,0xf9,0x49,0x67,0xa6,0xb7,0xb6,0xe4,0xbe,0x88,0x51,0x10,0x06,0x58,0x76,0xc6,0x65,0xb7,0x81,0x2d,0xe4,0x6a,0xd3,0x1e,0xc3,0xbf,0xcb,0xea,0xee,0x13,0xed,0x0c,0x1e,0x0b,0x30,0x0e,},"\x17\xac\xe1\x97\xd0\x83\xaa\xf1\x72\x6f\x53\xe5\xef\x81\xb5\xa8\xc0\x92\x22\xf2\x60\xee\x5f\x1f\x54\x04\xab\x78\xd9\x00\xd4\x89\x68\x84\x49\xb8\x43\xba\xd3\xc4\x98\xaa\xc6\xd8\x0b\x46\x39\xb7\x6e\x6e\x81\xc5\x52\x76\xa6\xf9\xc7\xce\xcd\x70\xb7\x1a\xaa\xf2\x01\x8e\xf7\x6c\x0e\x30\x15\x4a\xae\x86\xa5\xc8\x6d\x4e\x8d\x0e\x4e\xc6\x8c\xc4\x27\x06\x0b\xd5\x65\x14\xf7\x23\x80\x86\xbb\xef\x5b\xfc\xa1\xf5\x67\x1b\x18\x04\x18\x38\xfd\x01\x35\x72\x44\x3d\xba\x48\xfb\xdd\x95\xca\x74\x0b\x0d\xaa\x43\x27\x16\x4a\x1e\x34\x67\x72\x49\x70\x8f\x77\xbd\x79\x3e\x7c\xaa\x66\x38\xb5\xdc\x9f\xbe\x6f\x0d\xfd\x41\x20\x20\x90\x97\x20\x9c\x93\xce\xdf\xaf\x21\xb6\xbf\x59\xca\x6e\x99\xe6\x20\x96\x39\x44\x4f\x0e\x82\x7b\xbc\xc0\xa6\x1c\x3a\x23\x7c\xa2\x2a\x28\x32\x13\x22\x3a\xb6\x58\xe7\x12\xc7\x55\x62\x38\xd3\xa5\xfe\x31\x72\x2d\x65\xf5\x70\x6e\xf6\xd6\x4d\x73\x23\x2d\x30\x43\x22\x0f\x14\xe5\xcf\xd3\xc2\xc8\x3a\x83\xd6\x8e\x20\x27\x4b\x6f\x96\xb2\x9d\xe0\x40\xce\xc8\x47\x50\x30\xb6\xa8\xa8\x7d\x29\x80\x8d\xd3\x81\x79\x5c\x3d\x22\xac\xf5\xdc\x19\x3b\x72\x0d\x95\xa7\x52\xd9\xf1\x23\xc2\x09\xff\xba\x00\x4e\x48\xdd\x06\xdd\x8c\x9e\x17\x2b\xc9\xe0\x87\xd8\x0b\xc5\x21\x6c\x0b\x0b\x6e\x77\x03\x12\x41"}, +{{0xee,0xef,0x80,0x74,0xc2,0xeb,0x9a,0x1c,0xee,0x2f,0x2d,0x3b,0xb0,0x53,0x25,0x54,0x6a,0x9f,0xb7,0xcb,0xe4,0x4b,0x59,0x94,0x61,0xfc,0x58,0x85,0xf5,0xfd,0x9c,0xac,},{0x9b,0x89,0x29,0x41,0xa0,0x57,0x3b,0x7a,0x16,0x73,0xef,0x48,0x0f,0x08,0x11,0x68,0xd9,0xb7,0x49,0x6a,0x81,0xf9,0x17,0x7d,0xc4,0x27,0xca,0x1f,0x84,0xcb,0xbf,0x7d,},{0x6f,0x71,0x01,0x98,0x4f,0xd6,0x89,0x2e,0x21,0x44,0xb7,0xd4,0x56,0x19,0x83,0x0c,0xae,0xb6,0x71,0x3b,0xfa,0xb4,0xee,0xbb,0xe2,0x17,0xc5,0xbe,0xcd,0x24,0x9b,0xd9,0xd7,0x52,0xeb,0x76,0xe9,0xfa,0x99,0x5e,0x7c,0x71,0xff,0x7d,0xf8,0x6b,0xb2,0x60,0xcd,0xda,0x17,0x3f,0xf5,0xde,0xec,0x6a,0xf2,0x04,0xb7,0xdd,0xe0,0x11,0xde,0x09,},"\x9a\xe3\x9f\xea\xde\x90\x5a\xff\xcb\xed\xd2\xe7\x2a\x6f\x24\x29\xb3\xd1\x10\x8e\x5b\xc1\xa9\xdb\xaf\x49\x0a\x62\x99\xbc\xcd\x94\xac\xc4\x13\xad\xac\xc9\x18\xb1\x4a\xfa\x85\xc7\x8b\xc1\x68\xcc\x00\x74\x0c\x3d\xa0\xe0\x81\x83\x91\x5f\x79\xb7\xfe\x38\x68\xce\x2a\x7e\x88\x6b\x32\xad\x45\x00\x98\x05\xbf\xb8\x1b\x8c\x07\xb3\xb1\x02\x24\x20\xc0\xf0\x09\xb8\x89\xd7\xfc\x22\xfd\x19\x97\xae\x34\x19\x84\x38\xca\x94\x77\x85\x75\x12\x2f\xca\xaf\x96\xe6\x50\x2c\x33\xa7\x5a\x12\x9a\x2d\x0d\xbb\x07\x3d\x93\x82\x0d\x9c\x96\x68\x3d\xb3\x18\x99\x0b\xe3\xfe\xf4\xca\xfc\x89\x0a\xfb\xd9\xb1\x50\x4c\x74\x39\xa0\x8a\x06\x5e\x78\x14\xee\x4f\x9b\x6f\x57\xee\x16\xba\xed\x3f\x0e\x3a\xa3\x5d\xd2\x3d\x35\x28\xa4\x58\x91\x9a\xd7\x70\x48\xb4\xe2\xe6\x17\x23\x46\xbe\x24\x9a\x50\xaf\x02\xbc\x6c\x85\x33\x04\xc2\x08\xae\x0b\xa0\x27\x71\x26\x2a\x0d\x8a\x46\x5f\x71\xfa\x06\x35\xe5\x3e\xb2\xef\x0a\x84\x7d\x56\xa0\xbc\xd7\xdd\x3f\xe0\x77\xc9\x2b\xcd\xca\x30\x69\xa4\xa6\x82\xa2\x85\x99\x28\x31\x5c\xe3\xeb\x44\x5c\x60\x72\xa7\x14\x92\xee\x82\xe1\x72\xa2\x0b\xe0\xb6\x48\xb7\x56\xe6\xc7\x75\x37\x6f\x0c\x7c\x3d\xf8\xe6\x42\x88\x08\x9c\x2f\x81\xce\x95\x93\xc6\xe0\x8b\xb1\xcc\x1b\x27\xfc\xbd\x39\x2f\xc7\x95\x2c\x55"}, +{{0x61,0xfa,0xeb,0x15,0xf8,0x57,0xf6,0x55,0x78,0x62,0xc8,0xb8,0xc7,0xef,0x41,0xf8,0x05,0x45,0x52,0x09,0x96,0xfc,0xc1,0x12,0x7b,0x8c,0x24,0x91,0x82,0x22,0x01,0xae,},{0x60,0xa2,0x90,0xc0,0xfc,0x42,0x5a,0x08,0x74,0x67,0x3d,0x94,0xf9,0xbb,0x14,0x00,0xf9,0xda,0xcd,0xe9,0x95,0x4f,0x9f,0x5b,0x05,0xdd,0x48,0xab,0x74,0x7a,0x39,0x50,},{0x31,0xf9,0x0f,0x50,0xb2,0xdc,0x70,0x5f,0x1d,0x92,0xf1,0x2c,0xa9,0x97,0x5d,0x76,0xf1,0xb2,0x82,0x6a,0xda,0x3c,0xc1,0x85,0xb0,0xed,0x6c,0x83,0x86,0x07,0x77,0xbd,0x8c,0x48,0x9b,0x59,0x85,0x5a,0x91,0xf6,0x48,0x39,0xd4,0x9b,0xa4,0x67,0x98,0x5a,0xbb,0x37,0x6c,0x47,0xa4,0x90,0x8b,0x27,0x1b,0x8f,0x77,0xc5,0x8d,0x01,0xfd,0x04,},"\x25\x3b\x56\x6e\xcc\xb5\x63\xbd\x6e\x48\x0c\x69\x73\x9b\x8e\x37\x25\x19\xa3\x43\x72\x54\xe0\xe5\x02\x9c\xac\x86\xc7\x16\x38\xf2\xdf\x2a\x6c\xf9\xe5\x6d\xb2\x56\x99\x34\xde\xba\x90\xdb\x75\x54\x7e\x36\x71\x74\x7d\xf6\x4d\x6f\x2a\xaf\x3c\x11\x0f\xa6\x7a\x70\x94\xcc\xbe\x4c\xc5\x35\x5f\x0d\x43\x23\x51\x36\xee\x26\xdb\xe3\x7f\x42\x25\xd3\xbb\xfe\x24\x55\x95\x28\x05\x85\xfb\x54\x8f\x89\x4e\x86\xc5\x16\x10\x25\x80\x29\x1f\xa7\xa0\x28\x59\x55\x7f\xb9\x8e\xb5\x88\x87\x08\x28\xb0\x99\x0a\xe9\xd7\x4f\x38\x31\xda\x58\x94\x6b\xc7\xa5\xce\x1b\xa4\x98\xb4\xe8\xbe\x89\x89\xa3\xb5\x0d\x7e\x87\x89\xf5\x6b\x8b\x4f\xec\xbc\x2a\x33\xbf\xa3\xef\x59\x1a\x0f\xbc\xd9\x32\xfa\x93\xe1\x9f\x3a\x81\x2a\xe5\xe4\xe3\xb4\xb2\x42\xbe\x77\x05\xa5\x87\x4a\xf7\x3b\xe3\x10\xb0\x05\x82\x66\xa3\x78\xf2\x3c\x13\x48\x52\x47\x15\xb0\xcc\xc1\x8d\x66\x34\xb2\x36\x36\xc3\x16\xba\x6a\x1d\xd2\xfd\x50\x92\xc0\x67\x16\xa7\x17\xb5\x4d\x0e\xb9\xfc\x7f\x63\x6f\x85\xbb\xf2\x25\xa2\xcf\x03\x5b\x4b\x7c\xfd\xdd\x75\x35\x16\x82\xc0\x57\x6c\x6b\x3b\xa5\xa1\xc0\xb2\x5e\xc5\x94\xe7\x70\x9d\xd0\x9a\x00\x79\x77\x2f\xf3\xac\xc6\x7f\xb6\xc1\xb3\x7b\xb3\x74\x2b\x72\x6e\x77\xe8\x05\x61\xd9\xab\x73\x16\x0b\x73\x36\x25\x81\xda\x5b\x9c\x7f"}, +{{0xe6,0xb9,0xcd,0x4d,0xa0,0x7c,0xb3,0x4f,0x30,0x39,0x1c,0xf6,0x8f,0x0d,0x87,0xc7,0xcf,0xcf,0x68,0xf8,0x10,0xff,0xa4,0x0f,0x97,0x39,0xc9,0x5d,0xeb,0x03,0x7f,0x71,},{0x56,0x9e,0xde,0x0f,0x04,0x63,0x0b,0x43,0xa0,0x4c,0x5a,0x66,0xb6,0xa5,0x63,0x6b,0x76,0x6c,0x75,0x96,0x59,0x84,0xa7,0x47,0x7e,0x15,0x49,0x19,0x60,0xfd,0xd8,0x64,},{0x1e,0x37,0x5c,0x94,0xbd,0x80,0x9c,0xa0,0xcd,0xd0,0x2f,0x89,0xec,0xec,0x4e,0x43,0x77,0x32,0xdd,0x20,0xa0,0xa8,0x4b,0x25,0x4e,0xae,0x88,0x9d,0x80,0x70,0xe6,0x82,0xd1,0x13,0xb0,0xbe,0x22,0xe4,0x1e,0x6c,0xdc,0x3b,0xe8,0x77,0x68,0x0e,0x7e,0xeb,0x7f,0x09,0x95,0xe6,0x62,0x2d,0xc0,0xb4,0x34,0xfb,0x09,0x49,0xdd,0x99,0x4b,0x0c,},"\x69\xde\xf0\x52\x3a\xfd\xa6\x96\xf8\x44\x8f\x9c\x11\x43\xab\xc2\x65\x33\xe6\x86\x95\xa0\x90\xdf\x0d\x9e\x43\xd0\xc0\xef\xf4\x35\x83\xe6\xf7\x09\xd2\x04\x3c\x81\x5f\xbb\x3f\x96\xba\x2b\x0d\xc3\xbe\x6f\xec\xad\x5d\xd3\x81\x48\x78\x8e\x4a\x03\x85\xa9\xfe\x7a\x92\x1f\xcb\x8c\xce\xe0\xe4\xd3\xae\xd4\xbc\x3d\x21\x6d\x84\xb4\x14\xf9\x58\x0b\x02\x82\x0c\x03\xd9\x2e\x67\x5e\x68\x5c\x4b\x58\x51\xf3\x63\xbb\x4d\xf9\x7b\x41\x7c\x3f\xd9\x00\x22\xee\xaf\xa2\x0d\xfb\xe8\x29\x64\xf2\xff\x07\x3d\x25\x57\x58\xfb\xe5\x67\xc7\x6b\x2c\x35\xe2\xb0\x9f\x8a\x8d\x7a\xfa\x32\xc6\xf5\xad\x01\xbc\x3e\xbf\x6e\x21\x06\x06\xdb\x03\x8e\xcb\x68\x20\xce\x1e\xa4\xdd\x52\x9f\xc1\xad\xfb\xc2\xa1\x38\x56\x5a\xc6\xd0\xf4\xa4\x10\x9b\xdd\x47\xb8\xaa\x6e\xf4\xb8\xbe\xde\x45\x46\x80\xd1\xdb\xdb\x75\xfe\x1e\xb2\xe5\x48\xd5\xde\x7c\xb6\xd7\x92\xfe\xf3\xaa\x0d\x84\x80\xa6\x03\x0b\x30\xf1\x04\xd7\xe7\x6b\x58\xe9\xf4\x76\xeb\xf2\xcc\x83\x29\x23\xb5\x0c\x50\xc1\x11\xc3\x51\x5f\xc5\x18\x85\x23\x23\x42\x6c\xa7\x78\xa5\x96\xd3\x19\x5d\xa8\x58\x5d\x8c\x3a\xa9\x20\x83\x31\x3a\x6e\x65\x85\xb7\x0c\x98\xb1\x85\xb4\x72\x79\x8a\x61\xcd\xe7\x7e\x62\xec\x27\x2f\x14\xb0\xd9\xeb\x4f\x22\xf9\xc7\xc0\x58\x17\xda\x6f\xde\xfe\x78\x79\xa5\x84"}, +{{0x4d,0x90,0x44,0xf1,0x7b,0x5a,0x09,0x77,0xdc,0x5a,0xa9,0x91,0x6a,0x92,0x43,0x00,0xa2,0x44,0xa1,0xef,0x7f,0x06,0x02,0x77,0xad,0x49,0x78,0x35,0x1e,0xa6,0x42,0x91,},{0xab,0x9c,0x06,0x92,0xa6,0x06,0xb2,0x56,0x7c,0x19,0xc3,0x0f,0x9f,0xaa,0x3b,0x4c,0xfe,0x72,0xfb,0x23,0x70,0x77,0x76,0x7b,0x76,0xd3,0xb2,0xae,0x14,0x90,0xa6,0xd4,},{0x6f,0xa4,0x8a,0xea,0x4d,0x5b,0x9a,0xf6,0x5a,0xf9,0x64,0xcd,0xb7,0x09,0x44,0x3a,0x11,0xfa,0x84,0xf7,0xd4,0x4a,0xcd,0xda,0xb1,0x6e,0x04,0xa6,0xfc,0xef,0xb2,0x7a,0xe3,0x3c,0x05,0xb3,0x6d,0xa1,0x3c,0x23,0xde,0x51,0x7d,0x6e,0x6a,0xc5,0x74,0xa0,0x3e,0xa6,0x30,0xba,0x4f,0xbb,0x95,0x81,0x31,0x12,0x9a,0xa7,0xf1,0x35,0x4c,0x01,},"\x7c\x8c\x71\x89\xaf\x67\x32\x7a\xf1\xc6\xdd\x2c\x30\xe9\x75\xf1\x90\xe3\xb3\x8d\x00\x8b\x45\x85\x16\x7e\x0d\x45\x07\x40\xd4\x67\x34\x58\x7f\x6d\x20\x87\x84\x24\x5c\xc5\xcb\x06\x2a\x2a\x27\x7f\x17\xeb\xb2\x74\x6f\x9b\xdf\x4a\x82\x37\xca\x47\x9a\xb0\xa4\x30\x17\x7e\x19\xed\x7d\xd3\x62\x25\x76\xb1\x4c\xdc\x08\x28\x22\x14\xfe\x5e\xe4\xd7\x6b\x43\xc1\x6a\xc9\x08\x64\xc5\x1b\xe8\xae\xd4\x5d\x7b\x98\x0d\xf7\x91\x7f\x29\x0f\xdf\x79\x58\x46\x46\x5f\x27\xfc\xb7\xe5\x73\x06\x37\x94\x4f\x05\x77\xc9\x2f\x32\x37\x5e\x99\x5b\xc0\xcd\xa9\xd7\x19\x6f\x2c\x0c\x1a\xc8\xb8\x0d\x12\xa0\x43\x99\x63\xeb\xd2\x25\x4c\x34\x77\x03\x57\x58\x16\xe7\x96\x4c\x13\xd4\x4d\x62\x92\x80\xc3\x12\xea\x26\x53\x44\xde\x38\xf3\xb1\x8d\x91\x50\xf8\xf9\x24\xaf\xb4\x4b\x6b\xfb\x9e\xda\x51\x3d\x59\xe6\x5e\x2e\xf1\x86\x66\xe6\xc2\xa2\x1c\x40\x18\x66\x5b\xef\xe9\x2c\xae\x58\x1d\x3c\xb1\x4e\x23\xe9\x7d\x83\x00\x02\xcb\x90\x93\x1a\xe0\x21\x00\x68\xaf\x39\x4e\xbe\x35\x1b\xe5\xb8\x17\xf3\x67\x4b\xfb\xf4\x00\x49\x03\x0e\x4f\xe5\x05\xd3\x4a\x1d\x50\x2a\x2c\x50\xd8\xe6\x38\xe9\x26\xc2\x30\x67\x6b\x7e\xde\xfb\x6b\xec\x77\xb1\xc0\xce\x60\x93\x25\x28\x7b\xa5\xfd\xd7\xa9\x97\x69\x87\xbd\x07\xfc\x6a\x43\x44\x95\x6e\xbf\x81\x8f\x08\x58\x6c"}, +{{0x75,0xad,0x76,0xbb,0x4c,0x0c,0x22,0x9a,0x5a,0xdc,0x79,0xe4,0x44,0xb1,0x3f,0x88,0xa9,0x64,0x59,0x86,0x2c,0x8c,0xf0,0xba,0x49,0x8d,0x0c,0x99,0x6a,0xf9,0x4a,0x7a,},{0xf0,0x74,0xdd,0x2b,0x9c,0x1c,0x30,0x91,0x05,0xec,0x95,0x1b,0xb5,0x81,0x2a,0x91,0xdd,0xb5,0x40,0x23,0xb3,0x80,0x9a,0xb3,0x79,0xc5,0x6a,0xf0,0x46,0x1a,0xf6,0x17,},{0x0c,0x46,0x43,0xa8,0xbe,0x6d,0xc2,0x2f,0x4b,0xeb,0x6b,0xcc,0x70,0xc6,0x17,0x2e,0xc7,0x60,0x83,0x78,0x65,0x3c,0xb4,0xe9,0x9f,0x3a,0xe7,0x95,0xea,0xdf,0x4e,0x98,0x2a,0x29,0x76,0x09,0xca,0x79,0x38,0xf5,0xdf,0x63,0x2b,0x09,0x56,0x28,0xcb,0x75,0x06,0x2d,0x3d,0x51,0xfc,0x0f,0x33,0x23,0xbf,0xa7,0xb2,0x2e,0xc4,0xd4,0x72,0x05,},"\x0c\xa8\xc1\xc7\x41\x28\xd7\x4e\x9d\x0a\x7b\xf8\x96\x42\x91\xd0\x74\x91\x7f\x2f\x99\x20\xef\xb9\x11\x52\x05\x67\x64\x2a\x50\xa6\x15\xab\xcb\xd0\x0a\xed\x4a\xbb\xfe\xf1\xa9\x83\xcc\xe3\x33\xe1\xd0\xdf\x3e\x64\x04\xfb\x90\x43\xc6\x80\x39\x14\xcd\x5f\xff\xbc\x66\xa0\x79\x0c\x78\x78\xa2\x40\x89\xa5\x71\xf8\x95\x66\x2a\x1d\x18\xbe\x3f\x01\xff\x97\xfb\x33\x23\x33\x4b\x6f\x5b\xaf\x96\x55\x14\x48\xe4\x09\x0d\x03\x3c\x46\x42\x94\xd0\x91\x33\xb1\x51\xd5\xb5\xc6\x32\x1b\x50\xe2\x24\x1d\xe0\xef\x6f\x88\x28\x89\xcc\xf4\xad\x35\x40\xd5\xa1\xe3\xf7\x54\x8f\xb1\x3b\xe7\x1c\x16\x51\x66\x06\xe7\x9d\x04\x49\xc2\xa0\x8e\x5d\xc2\x31\x48\x84\x3c\x84\xe9\x7e\xd2\x40\x69\x16\x1c\x8e\x75\x20\x8f\x33\xe9\x5b\x3e\x10\xd1\xd4\x9a\x2f\xae\xf9\xd9\x86\xab\x62\x80\x9f\x62\xad\x39\xc7\xcc\x87\x1f\x37\x5a\x4f\x5a\x6f\xaf\x10\x4d\x7e\x11\xb8\x90\xcf\xb0\x58\x99\x02\x68\x52\x16\xec\x07\xcb\x8e\x8e\x9e\x7a\x7c\x43\x63\x5e\x23\x21\x2b\x69\xca\x3b\x7e\xd5\x4f\x0b\x97\x94\x9e\x3d\x9a\x66\x62\xf8\xe4\xb3\xab\x09\xcd\x49\x52\x94\xc3\x31\xc0\x47\xd8\x6e\xe7\x85\xff\x65\x8b\xcd\x7f\xcf\x9c\x48\x06\x05\xce\x05\xe8\x10\x06\x8d\x60\xfc\x9b\x26\xb5\xf0\x63\xeb\x90\x00\xd2\x65\x7a\x50\x94\x28\x4a\xc8\x0f\x13\x75\xd0\xb6\x6d\x6f\x5f"}, +{{0xad,0xc6,0xe9,0xb2,0xe1,0x03,0xb6,0x2c,0x24,0xad,0x43,0x46,0x41,0x0e,0x83,0xa1,0xa0,0xbd,0x25,0x3e,0x4a,0xbf,0x77,0x91,0x18,0x50,0xc6,0xd9,0x66,0x6e,0x09,0xf9,},{0xfc,0xe3,0x16,0xe3,0x3c,0x91,0x08,0x21,0xbe,0xed,0xdd,0x63,0x4b,0xed,0xc5,0x8e,0xe5,0x79,0x99,0xa7,0x6e,0xce,0x38,0x46,0x05,0x28,0x3b,0x99,0xb5,0x43,0xb7,0x8b,},{0xcb,0x01,0x7d,0x6d,0x26,0x82,0xc9,0x85,0x43,0x66,0x25,0x9a,0xa3,0x5f,0x30,0xd4,0x91,0xcf,0xaa,0x93,0x09,0x98,0xc2,0x97,0xdb,0xdd,0xc6,0xad,0xed,0x5b,0x3d,0x40,0x1c,0xf7,0x6d,0x80,0xd8,0xa2,0x76,0x4d,0xe1,0x31,0x71,0x8b,0x6e,0x0c,0x48,0x1d,0x71,0x96,0xbc,0x72,0x57,0x97,0x16,0xb0,0xc0,0xf6,0xff,0x05,0x3e,0x68,0xc5,0x0c,},"\x8c\xcc\xd9\x8e\xbb\xf2\x43\x9f\xfd\xfa\xc4\x16\x87\x63\x8f\xaa\x44\x4e\x1c\xa4\xb6\x3d\x13\xe8\x98\xea\xa8\x35\x54\x92\xf2\x88\x13\xab\x81\x3f\xd0\x15\x10\xe1\x12\xbe\x10\x6b\x20\x45\xd3\x0f\x63\x33\x5d\x24\x89\x04\xd5\x21\xde\x18\x1a\xba\xc0\x3e\x3d\x2c\xb2\xd1\x6c\x44\xb3\xb0\x12\xa0\xc5\x1f\x99\x01\xae\xf9\x05\x6c\x72\x4d\x7a\x2c\x6b\x2a\xcb\x0a\x07\x55\x59\x40\xe4\xc6\xe2\x11\x54\x89\x06\x11\xad\xeb\x64\x89\xf4\x61\xd3\xe5\xec\xd1\xaf\x5a\x4d\x2b\x0a\xda\xf4\x17\x47\x43\x6e\xb4\x14\x75\x7a\x8f\xe4\x77\x56\x74\xe3\xc6\xe5\xde\x45\x69\xd6\xfc\x6c\x78\x8e\x10\x90\x5e\xba\x32\xc2\x70\xa3\x93\xe6\xf7\x21\xa7\x65\x29\x4e\x2a\xc9\x9a\x9b\x6e\x53\x4d\x3d\xf0\x8d\x1d\xb9\x7d\x60\x2a\xc3\x19\x5c\xb0\xb7\x7f\x5b\xd4\xac\xaf\x73\x7f\xad\xd6\x99\x1f\x06\x88\xab\xc7\x49\x18\x04\x75\x74\xea\xc2\x82\x89\x73\x9a\x66\x4e\x0e\x0e\x20\x57\x4a\x2c\x25\xfd\xe4\x9d\x14\x53\x9d\xb1\xce\xdd\x4a\x92\x04\xa7\x0a\xcf\xf0\xa6\x2c\x8f\x25\xcd\x76\x8f\xfa\xb1\x5c\x4d\xb3\x16\x84\x0a\x4d\x1b\xc9\x2e\x21\x26\x70\xbe\x07\xc5\xbd\xcf\x53\x75\x90\x60\x7d\xfb\xbb\xb4\xd9\xf9\x8b\x89\xda\x0b\x4d\xf7\xd8\x8f\x3e\xca\x48\x14\xd1\x6b\xfa\x20\xc8\xd2\xfa\x94\xf9\xf2\x59\xf2\xee\x2d\x3a\x83\xc9\xe4\x17\x1b\x1a\x26\x2c\x4b\x99"}, +{{0x37,0xfc,0x1b,0xed,0xa4,0x06,0x0b,0x6c,0x57,0x88,0x3d,0xdb,0xa0,0x77,0x6c,0x2b,0xcf,0x5a,0xc2,0x8a,0x65,0x13,0x26,0x02,0x1c,0xca,0x97,0x72,0x37,0x30,0xfb,0xb0,},{0x7b,0xd7,0xbf,0x1c,0x99,0xdc,0x82,0xe0,0x6f,0x08,0xbb,0x45,0x4d,0x8f,0xb2,0x88,0xa5,0x79,0x27,0xe0,0x7f,0xf1,0xb1,0x2a,0xf1,0x5e,0xe2,0xc1,0x2f,0xbb,0x6b,0x3d,},{0xa0,0x1d,0xd6,0x5f,0xad,0xa2,0x70,0x39,0xf1,0x68,0xb1,0x23,0x41,0x9d,0x8a,0xbf,0xbd,0xa4,0x8c,0x57,0x2e,0xce,0x24,0xfd,0xa0,0x6e,0x1a,0x5e,0xc3,0x1e,0x08,0x4f,0x4e,0xe1,0xcb,0xf9,0x96,0x1e,0x88,0xed,0x51,0xe1,0x89,0xfc,0xb7,0xf5,0xf2,0x35,0xde,0x1e,0x5b,0x28,0xd0,0x8f,0x2b,0xfc,0xa1,0x90,0xb0,0xf0,0x19,0xec,0xc2,0x07,},"\x3d\xfc\xac\x02\x65\xa0\x24\xa8\x3c\xb9\x32\x67\x44\x89\xa1\x63\xaa\xc3\x14\xbf\x3d\x96\x9f\x27\x59\x6e\x45\x17\x33\xb9\x9d\xeb\xa5\xee\xb7\x79\x21\x0b\xaf\x95\xbf\x54\x5a\x1a\xe6\xb8\xa9\x15\x86\x06\x93\xee\x89\x0f\x93\x93\x20\xe0\x6a\x84\x44\x83\xd1\x8c\x6a\x1b\xcd\x03\xc6\x38\xbb\x7d\x1f\xe2\xa8\x2e\xb4\x48\xa3\x11\xb1\x30\x2e\xa6\x42\x8f\x54\xa3\x9f\x45\xa4\xd5\x60\xbe\x15\x57\xa2\xb2\x54\xc4\x5c\x13\x7f\x45\xcc\x68\x35\x68\x36\xe2\x1b\xed\x0b\x7f\x73\xa5\x18\xce\x09\xdb\x0b\xe3\x93\x92\x7c\x33\x9b\xf2\xa4\xb5\x98\x75\x39\x40\x4c\xe6\x50\x28\x4d\xe1\x2e\x3b\x55\x3b\x26\x2e\xfe\x23\x84\x83\x32\xcc\xfd\xc3\x5e\x79\x1a\x0a\xb4\x3f\x13\x9c\x71\xed\x0f\xcb\x2d\x17\x3b\xb3\x77\xee\x46\xb1\xa9\xdc\xa9\x27\x7e\x77\xdf\x85\x5f\x28\x30\x25\x1e\x31\xe2\x6a\xcd\x86\x76\x3c\x8d\x7e\xac\x22\xc8\x82\xfc\x17\x4f\x2b\x5e\x75\xca\x6a\xd1\xad\xe0\x3f\x94\x2b\xb2\xa1\x3b\xf5\x41\x90\x61\x59\x15\x8c\x68\x36\x3c\x74\x80\xc5\xb2\x7a\x99\x32\x0f\x82\x83\xa2\x69\x9d\x43\x69\xc0\x71\xc5\x0d\xbd\x90\xb7\x79\x2e\x47\x72\xef\xbc\x0b\x19\x5b\xce\x84\xcc\x4d\xcf\xff\x70\x72\xa4\x89\x68\xdb\x69\xf9\xfe\xdd\xd0\xf9\xce\xd6\x59\xeb\x5d\xb7\x16\x7f\x35\xf9\x88\xce\xc1\x14\x88\x7d\xcb\xfd\xf2\x7d\x02\xd3\x00\xb3\xe1\xab\xec"}, +{{0x8d,0x42,0xf4,0xdd,0xd2,0xbb,0xd2,0xb8,0x27,0xb0,0xa0,0xd3,0x1d,0x8f,0x75,0x8e,0xbd,0x13,0xa1,0xb9,0xb3,0x71,0x22,0x28,0x94,0x8c,0xa6,0x10,0xbb,0x88,0x58,0xe5,},{0xb7,0x35,0x48,0x98,0x79,0x4f,0x9d,0xb0,0xa8,0xaf,0x6e,0xea,0xfc,0xdb,0xdf,0x01,0x1d,0x3f,0xbe,0xf0,0x21,0x2a,0xd9,0x38,0xa4,0xa4,0xad,0x27,0xab,0x16,0xeb,0xbf,},{0x70,0x76,0x4b,0xe3,0x9c,0x6d,0xca,0x0f,0x06,0x7a,0xbe,0x1e,0xca,0x49,0x0f,0xda,0x95,0x1f,0xd4,0xe9,0x49,0x96,0x95,0x26,0x6e,0x27,0x0b,0x9b,0x05,0xea,0xe7,0x06,0xca,0x8d,0x1c,0xa6,0xa9,0x2d,0x7c,0x48,0x8e,0xc6,0xad,0x8b,0xa1,0x14,0x57,0xa4,0x2a,0x5e,0x31,0x70,0x2a,0x9c,0x2b,0xce,0x89,0x2d,0xc4,0x05,0x35,0xc0,0x9f,0x01,},"\xe3\xa2\xbe\xbc\x04\x96\xd8\x97\x4a\x8f\x40\x61\x88\x03\x69\x31\x4e\xd9\xe4\x40\xc1\xb7\x7e\x26\xfe\x50\x71\xce\x69\x4f\xfd\x21\x36\xdb\x0c\x4d\x5e\x88\x0e\x60\x00\x08\x3a\x75\xc9\x0d\x3c\xf7\x2b\x9c\xf5\xa2\xb1\xa9\x00\x2c\x27\x01\xa2\xff\x59\xb0\x69\x9a\x8f\x42\xd7\x9d\xd8\xa5\xfb\x71\xa8\x12\x54\x53\xd9\x1f\xb8\x00\x80\xa3\xf0\xa1\x65\x84\x28\x2f\x17\xec\x7d\xfd\xc2\xe5\xc6\x9c\x4d\x9b\xdf\x48\x4d\x55\x94\x4d\xae\x27\x3f\x21\x1c\xfb\x76\xad\x37\xda\x45\x87\x13\x65\x43\x9a\xf3\x5e\xea\x1f\xbe\xcd\x4c\xa6\x79\xb5\x9b\x5e\x01\xba\xcf\x49\xc7\xf4\xe5\xef\xaa\x40\x6b\xa1\xda\xeb\x08\x54\x82\xaf\x5d\xed\x89\xdc\x68\x85\xff\xbe\x3d\x14\xd2\x93\x1b\x83\x89\x7e\x28\xad\x06\xe5\x56\x4e\x27\x89\xba\xea\x81\xbd\x93\x2a\xa2\x79\xfe\x8e\x32\x4b\x9a\x8e\xf1\x11\xc2\xab\xe2\xf1\x37\xd4\xbb\x50\xd8\xab\x76\xce\xbc\x0b\xd9\x82\xa2\x39\x19\x75\x1a\xd4\xd4\x9e\x88\xeb\x14\x17\x3d\x33\x10\x28\x9a\x87\x23\x17\xe4\xa4\x51\xe8\x8d\x54\x32\x08\x91\x87\x0f\x15\xb2\xd5\x33\x24\x43\x08\x77\xa9\xfb\x5b\x49\xbb\x92\x9f\x21\x1c\x5b\x89\x76\x4d\xd9\xc3\xa5\x95\xa1\x45\x1e\x9f\x85\xa2\x38\x54\x00\x02\x56\x6e\x53\xa9\x9e\xd1\xe6\xdd\xc9\xb4\x85\x3f\x45\x5e\xdb\x4c\xf1\x98\x0d\x56\xbb\xdc\x13\x13\xa3\x6e\x76\xea\x9c\xbb\x04\x8a"}, +{{0xb6,0x2d,0xe5,0xa1,0xac,0xfe,0x4c,0xa2,0xd1,0xf0,0xc1,0x32,0xaf,0xcb,0xda,0xe6,0x6f,0xb2,0x9a,0x02,0xf2,0x97,0xfb,0xc2,0x40,0x7f,0xad,0xbb,0xf2,0x45,0x42,0x00,},{0xb6,0x3b,0x2d,0x0b,0xf3,0x55,0xf7,0xb6,0xd0,0xba,0xc0,0x74,0x03,0x41,0x1c,0x40,0xaf,0xbb,0xb2,0xf7,0x07,0x50,0x3b,0x3f,0xc2,0xce,0xe8,0xa1,0xc7,0xd0,0xa8,0x38,},{0x5c,0xdb,0x00,0xe9,0x8d,0xe7,0x3e,0xab,0x48,0x0b,0xe4,0x2f,0x8a,0x8a,0x61,0x63,0x80,0x9a,0x0d,0x37,0x10,0x1b,0x6a,0x5a,0x4e,0xed,0x6a,0x0c,0x92,0x03,0x0d,0x09,0xa5,0x56,0x2c,0x72,0x90,0x80,0xce,0x6f,0x65,0x94,0xc8,0xfa,0xfb,0x1f,0x59,0x47,0x72,0xdb,0x7a,0x90,0xa9,0xe7,0xda,0x15,0x89,0x6e,0x82,0xf7,0x05,0x69,0x39,0x0d,},"\xe6\x59\xe5\x1d\x7b\x19\x3c\x4b\x8e\x2b\x3e\xd7\x3a\x9d\x75\x57\xed\x2b\xab\x61\x53\x88\x3a\xb7\x23\x59\x2f\x73\x0a\x91\x45\x67\x14\x2b\x3f\xa4\x35\xdb\x32\x19\xf8\x3a\x54\x2d\xc7\xa4\xbd\x80\x5a\xf6\x66\xea\x86\x5b\x85\x31\x46\xf8\xe3\xa9\xfe\x87\x07\x11\xf9\x0d\x12\xb0\x69\x34\x92\xaf\x2a\x1e\xdf\x99\xa1\x64\x58\xf7\x81\xf1\x26\x6e\xc4\x37\xa5\x29\x6a\x82\x2c\xa9\xd6\x9c\xe8\x44\xb5\xc5\x90\x97\xa2\xa5\x6f\x3e\xb8\xfd\x27\x3a\x63\x61\x16\xdb\x77\x43\x00\x92\x2d\x45\xb7\x44\x65\x7a\x69\x2f\x5e\x8b\xfb\xcb\x06\xd2\x42\x28\x18\xae\xb5\x1e\x7c\xda\x68\xac\xfb\xed\xa1\x6e\x7c\x79\x58\x0d\xcc\xcd\xe2\x4e\x8e\x3d\x60\x1b\x16\xe0\x63\xb4\x3a\x6d\x0d\x14\x07\x55\x2f\x75\x04\xf5\xbe\x19\x88\x2e\x4f\xfe\x32\x34\x4f\x5f\x47\x3e\x73\xa8\xf6\xed\x37\xb0\xd8\xd9\xe5\xe0\xa0\xdc\x98\x28\x39\x5b\xcb\xd8\xf3\xa4\xe3\x12\x48\x69\x24\x9d\x05\x8b\xe0\xe0\x45\xde\x0b\x1e\x12\xb1\xc8\x3b\xa0\xaa\x22\x7c\x95\xb8\x2b\xf7\x42\xc3\xea\xc0\x15\x2b\x33\xe6\xd1\x9b\xe8\xb3\x3a\x35\xbf\x70\x5d\xaa\xb1\x06\x22\xa9\x0a\xed\x02\x2e\xa6\xe4\x39\xed\x50\xa9\x30\x84\x37\x92\x99\x24\xba\x3a\xb1\x11\xad\x0c\xaa\x6f\xeb\x0a\x6e\xb1\x65\x82\x4e\xbd\xb0\x86\x65\x71\xef\xc0\x7e\x52\x22\xed\x86\x86\xb1\x4d\x92\x70\xbf\x76\xb9\x45\xd5\x20\x14"}, +{{0x97,0x32,0x05,0x9d,0x7b,0xf0,0x20,0x0f,0x5f,0x30,0x41,0x24,0x30,0x33,0x6b,0xe4,0xef,0x1e,0x3c,0xae,0x62,0x93,0x8a,0xd0,0x87,0x29,0xce,0x3b,0xa7,0x14,0xcf,0xd4,},{0x0d,0xe8,0x42,0x5f,0x5e,0x30,0xb2,0xb8,0xae,0xbb,0x80,0x72,0x00,0x9a,0x30,0xcf,0x04,0x11,0xc3,0xc8,0x23,0x8f,0x4e,0x42,0x08,0x76,0x0c,0x56,0xc3,0x3e,0x43,0x4f,},{0xfb,0xa1,0x74,0x9b,0x64,0x1d,0xd4,0xdf,0x34,0x66,0x4b,0xc4,0x3c,0x00,0x46,0x8c,0x7d,0x75,0xe8,0x4a,0xfa,0xd7,0x2d,0xe4,0x73,0xfd,0x1e,0x9c,0x87,0xda,0x15,0xea,0x60,0x4f,0xc2,0x54,0x9a,0x1a,0x86,0x7f,0xa8,0x08,0x50,0xe9,0xc2,0xa5,0x9c,0xd9,0x90,0x53,0x88,0x67,0x60,0xa8,0xd9,0x76,0x4b,0x84,0xdd,0x67,0x26,0x76,0x72,0x0d,},"\x1a\x13\xe7\xab\x60\x3b\x48\xeb\x89\x6f\xe1\x71\x73\xfb\x31\x95\x0b\x0d\xcd\x5a\x35\xff\xdb\xe1\x37\x1c\x7a\x5b\xfb\xa5\x93\x31\x75\x89\xd9\x65\x2d\x88\x79\x77\x29\x18\x0b\x8d\x0e\x51\x5a\xbf\xe6\x54\x8f\x16\x04\x21\xe5\x37\xd5\xc9\x4a\xef\x2b\x34\xc7\xeb\xb0\x97\x42\x00\x03\xbc\x0f\x36\x1b\x42\x3e\x7e\x14\x63\x0a\x80\x3c\x11\x82\x02\x54\x00\x49\xf6\x8c\x9c\xf4\x6f\xae\x03\x68\xd1\x62\xe4\x00\xd7\x7b\xb4\x52\x3c\xf6\xc7\x53\xb9\x75\xc2\x45\xbc\x99\xed\x2f\x41\x3a\x9d\x06\xc2\xda\x6c\xe0\xcc\x09\x87\xb6\x40\x6b\x80\x9e\x8e\xb3\x19\x03\x3d\x2d\xe9\x13\x1d\xee\x3b\x1b\x7b\x5c\x95\xd6\x53\xce\xd8\xfc\xcf\x99\x8d\xa1\x76\x85\x11\xec\xa4\xd3\xc5\xf7\x35\xad\xab\x96\x50\x3b\x35\x51\x80\x3e\x49\x22\x63\x50\x95\xef\x81\x1b\xe4\xc0\x8a\x6c\xba\xc9\x17\xcb\xe6\xcd\x91\xa4\xae\x5a\x33\x0c\xce\xc0\xe8\xe8\x15\x37\x12\x17\xa3\xde\x62\xf2\xd2\xd6\x14\x66\x21\x98\x33\xf3\x34\x47\x13\x2f\x4d\x43\x35\x0c\x58\xcb\xaf\x42\x24\x75\xed\xb1\x28\xc5\x6d\x80\xa4\x95\x72\x6b\x1f\xdb\xc5\x65\x51\xeb\x72\xd0\xf4\xfe\xc2\x6b\xa8\xbf\xf5\xee\xd6\x77\x4b\x85\x03\x9a\x52\x92\x83\x4b\x5d\x1c\xc1\xb0\x9b\xa0\xa3\x95\x4d\x29\x32\x36\x73\xf5\xe7\x12\x76\xa1\x2a\xc4\xc5\x79\x35\x5b\xf1\xec\xca\x48\xe6\xa7\x16\xb9\xfc\xec\xdc\x56\x5c\x51\xb9"}, +{{0x9c,0x7f,0x6f,0x37,0x9e,0x38,0x57,0x00,0x7e,0x2a,0xc6,0x32,0x4c,0xbb,0xce,0xd5,0x7a,0xc9,0xee,0xe4,0x47,0x78,0x13,0xf8,0x3a,0x81,0xfc,0x8c,0xef,0xa9,0x64,0xd5,},{0xa5,0x4b,0xa3,0x96,0xd6,0x87,0x63,0x4d,0x3e,0xcc,0xf4,0x1c,0x57,0x82,0x49,0x4f,0x5f,0x10,0xa5,0x21,0xa1,0xe5,0xd3,0x88,0x52,0x3d,0x80,0xee,0xba,0x5b,0x0b,0x2b,},{0x65,0x68,0x5f,0x9c,0xa5,0x98,0x2e,0x15,0xa2,0x2b,0xa3,0xc8,0x3a,0x03,0x48,0x34,0x84,0x82,0xdf,0xae,0x57,0xce,0xa1,0x78,0xf0,0x78,0x0c,0x05,0x7b,0xae,0xbe,0x4a,0xf6,0x32,0xf9,0x84,0x54,0x0a,0x26,0x01,0x9a,0x7f,0xb3,0x42,0x53,0xc9,0xec,0xe7,0xff,0x30,0x8a,0xda,0x23,0x3c,0xe0,0x68,0x63,0x47,0xab,0x5b,0x21,0xce,0x57,0x0b,},"\x3f\x2d\x30\x72\xfe\x73\x83\xe5\x41\x55\x1e\xa9\xab\xdb\xae\xae\x6a\x46\x4a\xe6\xb9\xf0\xba\x78\x6a\x44\x1b\x2d\x08\xda\x5b\xca\xda\x3c\x54\x24\xdc\x69\x31\xd6\xb3\x95\x23\xe2\xde\x0a\x0c\x2e\x4e\x6b\x5b\x8c\xda\x92\x5e\x5e\xac\x93\x84\x16\xa2\xc5\x1b\xf1\x3d\x49\x53\x1d\x7e\xc7\x11\x4b\x1c\x82\xfe\xaf\x90\xf3\xf8\x75\x91\xe3\x97\xd0\x27\x02\xf8\xec\x1b\x30\xd9\x9f\x5b\xe7\xd2\x20\x3e\x4f\xe4\xdb\x2e\xa4\x7e\x7b\x45\x89\xd8\xac\x50\x62\x48\xd7\x34\x74\x66\xed\xbc\x96\xea\x32\xbf\x3a\x6e\xa7\x50\x2d\xd6\x0c\x9e\x84\x90\x27\x15\xab\x2c\x6c\xa6\x8f\x5b\x00\xe1\xd9\x09\xd8\x3a\xa6\xab\x66\x2d\x8a\xea\x87\x0e\xcd\x86\x1f\xec\x69\xf2\xee\xc0\xae\x67\x7d\x29\x95\xb0\xed\x68\x8f\xaa\x8e\xf7\x82\x44\xe0\xd1\x19\x56\x97\xb0\x71\x22\xce\xaa\x11\xf5\xa6\xea\x58\xfb\xdf\xa2\xe2\xec\x2d\xf9\xd1\x86\x93\xae\x96\xd4\x71\x27\x55\x6e\x91\xf0\x86\x49\x82\xc1\x34\x19\xb0\x4a\x63\xf2\x08\xe7\x30\xd2\x69\x51\x88\x2a\xef\xe0\x01\xbc\xa3\x40\x8b\xd9\x86\x27\x48\xc6\xcc\x87\x6c\x28\xca\xc3\xbb\x2e\xb3\x39\x58\x18\xc2\x09\x1e\x0f\xbd\x7a\x0b\x44\x68\xc6\xb0\xd0\x0c\xd0\x08\xc1\x1c\x3c\x3a\xd0\x10\x80\xa1\xf5\xa4\x0a\xe2\xe4\xb0\xc3\xa0\x71\xef\xc8\xe1\xd1\xba\x6a\xce\x6d\x4d\xf0\xff\x19\x82\x9b\x0c\x68\x0b\x3a\xeb\x75\x91\x77\xed\x34"}, +{{0xa4,0x78,0xf3,0x5a,0xbb,0x73,0x72,0x7b,0x6b,0xe6,0xee,0x5e,0x56,0xee,0xc3,0x23,0xc9,0x51,0x78,0x82,0xfd,0x69,0x19,0x36,0x0e,0xbb,0xbf,0x5d,0x5c,0xb8,0xb8,0x3a,},{0x7a,0x6e,0x26,0x6a,0x54,0xd1,0x35,0xdd,0xa0,0x00,0x9c,0xcd,0xa8,0xa9,0x4a,0x47,0x12,0xae,0x5c,0xb1,0x47,0x61,0xe8,0x43,0x6e,0x97,0xc4,0xb7,0x81,0x4d,0x8e,0x8c,},{0x9d,0x16,0xfd,0x40,0xb9,0xf8,0xdd,0x9b,0x4a,0x1a,0x8c,0x6d,0x70,0x3b,0x9f,0xcc,0xbb,0x94,0x0b,0x1e,0x0a,0xe7,0x7a,0x59,0x70,0x37,0x4a,0xf0,0xcf,0x72,0x6f,0x44,0x79,0xfd,0x30,0xd7,0xdf,0xf5,0xcf,0x53,0x49,0x4d,0x9a,0x29,0x6a,0xb6,0xb9,0xe4,0x6e,0xa6,0xc1,0x36,0xb4,0xdb,0x2c,0x71,0xc2,0x1b,0x97,0xc1,0xc8,0x25,0x4d,0x0a,},"\x01\x73\xa3\x40\x50\xb4\x37\x48\x06\x1f\xf8\xf5\xa3\xd7\xc4\x3b\x63\x60\x84\x77\x86\xe8\xbb\x75\xe5\x36\xfb\x47\xb6\x45\xb2\x14\xf2\x21\xba\x24\xd8\x3d\x28\xbc\x02\x50\x24\x66\x3e\x53\x4f\x90\xf6\xe8\x3a\x93\xd8\xbd\xde\xda\x2c\xd8\x80\x81\x55\x65\x2a\x90\x8c\x43\x7c\x2d\xb6\xf3\xed\x49\x12\xf5\x7c\xa5\xb9\x79\x28\xa7\x3b\xe9\x64\xaf\x59\xdf\x44\x39\x85\x4b\xb0\x06\xfc\x29\x5a\x87\xb7\xb7\x22\x39\xc7\xfa\xdf\xec\x40\x71\x55\x09\xd9\x85\x79\xda\xad\xfb\x8d\x52\x4b\x4c\xec\x66\x20\x70\x5e\xfd\x41\x04\xc2\x97\x14\x4a\xea\x72\x29\x74\xe1\x2c\x5e\xce\xe5\x39\x1e\xf2\xd9\x3a\xc2\xb1\x24\xe4\xac\x49\x61\x47\xc8\xb7\x03\x63\x58\x5d\x70\x78\xcc\xc5\x3e\x2a\xe5\x93\x35\x0b\xc2\x55\x48\xa0\x54\x25\x26\xab\x00\xaf\xe4\x77\xa0\xf4\xb2\x73\x97\xc7\x2b\xc7\x4a\x8a\x8a\xb1\x56\xe6\x2b\x8b\xb4\x7c\x3f\xbb\x4b\x34\x91\x3e\x45\x96\x87\x47\x6b\xf3\x31\x42\xc6\x14\x70\x21\x07\xff\xe2\xcc\x01\xe2\x5f\xa3\x02\x75\xe1\xe2\xe6\x3c\xea\x91\x68\xe4\xa4\x7c\x02\xde\x09\x7d\x4d\x85\x3b\x27\x67\x5c\x5b\xb3\x30\xb9\x4a\x97\x4e\xad\x85\xe2\xbd\xee\x8e\xe1\x7c\xbb\x56\x53\x34\x66\x58\xdf\x2f\x91\xf6\xbd\x73\x94\x91\xdd\x71\x98\x8b\x3a\x97\x6a\x3e\x2e\x7a\x9d\x13\x74\x10\xf4\xac\xba\x9f\xeb\x5f\x11\x79\x8c\x9a\x43\xb6\xad\xce\x14\x36\x5a\x7c\x6d"}, +{{0xff,0xe8,0x25,0x14,0x8c,0x09,0x59,0xb3,0xa6,0x8d,0xe8,0x6a,0xd8,0xe8,0xaf,0x7f,0xa5,0xe0,0x78,0xf3,0x63,0xdc,0x12,0x42,0x13,0xc9,0x00,0x20,0xda,0x0c,0x90,0x89,},{0x13,0x91,0x52,0xa0,0xbd,0x22,0x96,0x2d,0xd9,0x19,0xae,0x3e,0x0b,0x16,0x20,0xe0,0x3c,0x03,0x3c,0x2a,0xd0,0xa3,0x97,0x9e,0xc6,0xbc,0xd1,0x70,0x5e,0x23,0xd5,0x98,},{0xfe,0x4e,0x89,0xee,0x31,0x78,0x6c,0x0a,0x3d,0x3d,0xe3,0x64,0x9b,0xb9,0x3f,0x0b,0x8a,0xef,0x1c,0xaf,0x5a,0x83,0x2e,0xc5,0xe4,0x06,0x78,0x10,0x70,0x5a,0xdd,0xdf,0x53,0x9b,0x8f,0x4e,0x05,0xad,0x08,0xcf,0x34,0x79,0xe4,0x5b,0x42,0xc9,0x65,0x28,0xf6,0xd5,0x9a,0x46,0x25,0x70,0x3d,0xdb,0xf1,0x5b,0x63,0x09,0x39,0x65,0xd8,0x0d,},"\xf1\x25\x78\x0d\x0c\xd0\x88\x53\x0f\x0c\x87\xb7\x0b\xd4\x2e\xba\xb5\x6a\xdb\x5a\xd4\x34\x5f\x92\x9a\xe5\xde\xae\x07\xfb\x55\x32\x21\x53\xa8\xf0\x23\xd3\x88\x43\xbf\x5d\x6a\x93\xfe\x99\x3e\xee\x71\xbc\x2e\xe5\x63\xb2\x5a\x50\x91\x8f\x03\xef\xdb\x5d\xbf\x72\x69\xad\xd6\x9d\xed\x3e\x66\x95\x38\x95\x62\x0d\x9b\x6c\xf4\x6b\xa2\x34\x8f\x8d\x66\xd7\xf0\x92\x23\x5e\x37\x8c\x1e\x3e\xdf\xeb\xeb\x78\x08\x4b\xc8\xde\xa0\x13\xf9\x93\x3a\xae\x14\xa0\x41\x94\x82\x76\xd0\x1f\x1c\xb5\x83\x4b\x0e\x59\x0e\x13\xd9\x31\xd1\x92\x92\xbb\x1d\x80\x41\xff\x2f\xe2\xe1\x17\x1a\x2e\x0b\x9a\x05\x98\x21\xd0\x92\x4d\xde\x7f\x3b\x1b\xb5\x98\x13\xf5\xe3\xc6\x35\x20\xaa\xfb\x88\x01\xba\x62\xc7\x09\x7d\x4d\x8c\xf4\x37\xa5\x68\xa7\xf0\x08\x7c\x6e\xa0\xfc\xe6\xe5\x68\xc4\x88\x3f\x1c\xd1\x2c\x74\x9d\x06\xa6\xfe\xb2\x78\xf1\x08\x6a\x8b\x04\x76\x99\x21\xf7\x8a\x99\x59\x06\x2a\xb0\x6f\x98\xee\x80\xc2\xc7\x85\x4f\xfa\x76\x0f\x86\xa8\x9e\xe1\xa5\x12\x66\x05\x3d\x19\x5e\x61\xbb\x1d\xbd\x18\xdd\x89\xff\x39\x4e\x40\x8a\xce\x0f\x64\x1a\x39\x5d\x56\x11\x8e\xa7\x2b\x7d\x8a\xdf\x78\xb1\x65\x5e\xce\xce\x7e\x82\x50\xe8\xa3\xa9\x1c\xb8\xfc\xa0\xd9\xce\x0b\xaf\x89\x80\xa3\x87\xc5\xed\x43\x18\x66\x32\x80\xe5\xb4\x53\x1f\x31\x87\xc4\x7e\xae\xa7\xc3\x29\x72\x8d\xdd\x0e\x40"}, +{{0x49,0xaf,0xf4,0x21,0xa7,0xcd,0x12,0x72,0x2a,0xa8,0x4c,0x48,0xc1,0xfb,0x1c,0x5f,0x8d,0x9e,0x27,0x7d,0x0a,0x99,0xec,0xbc,0x93,0x48,0xc3,0xaa,0xa7,0x4b,0xe4,0x22,},{0x88,0xd2,0xc2,0x62,0x66,0xf4,0x93,0xbc,0x67,0x57,0x8c,0xa0,0xb1,0xf5,0x11,0x60,0xcf,0x0f,0xdb,0x6a,0x09,0xa9,0x06,0xdb,0x9f,0xaa,0x68,0x6f,0x11,0xf8,0x20,0x8d,},{0x74,0x91,0x81,0x28,0x4d,0xf0,0x5d,0xbe,0x59,0x74,0xb9,0x17,0x82,0xa1,0xa7,0x6e,0xa0,0x86,0x42,0xcb,0x0f,0x0c,0x98,0xdb,0x58,0x6c,0x57,0x5c,0x21,0x0c,0xdc,0x8b,0x65,0x1b,0xd3,0x4b,0x75,0x7a,0xe3,0x8e,0x4b,0x6b,0xe9,0x46,0x52,0x35,0xbd,0x0e,0xca,0x43,0x0e,0x26,0xc3,0xee,0xde,0x56,0x1c,0x6e,0x82,0x4d,0xfa,0x20,0x0e,0x0a,},"\x70\xa1\xac\x14\x4b\x75\xfd\xa7\x55\x86\xa7\x9c\x36\xfd\x39\xcc\xe5\xf5\xca\xe2\xe6\x37\x58\x52\xd3\xb6\x2a\x96\x30\x33\x6a\x29\x3e\xa6\xd2\xac\x6e\x5b\x57\xda\x21\xef\x36\x4a\x59\x5b\xb0\x75\x0f\x5b\xf4\xd2\xb3\x20\x67\x64\x23\x87\x0e\x4b\x8e\x08\x69\x60\x1f\x16\x68\x06\x19\x04\x8c\x4e\xde\x27\x6d\xa6\x9f\x20\x5a\x70\x17\x6e\x25\xea\x04\xbd\x08\x97\x63\xe7\x09\xba\x34\x3f\xc8\x83\x1e\x52\x04\x4e\xab\xf9\x44\x1e\x69\x97\xf8\xba\x1a\xeb\x9e\xf0\xf4\x91\x17\x06\x67\xa7\xf5\xfc\x96\x27\xcb\xd0\x55\x1b\x76\xbe\x27\x28\x3a\x4b\x0c\x5f\x66\x78\x46\x68\x82\x26\xa1\x15\xee\x80\x20\xdf\x08\x04\x2b\x19\xb5\x9f\xe5\x51\x31\x6a\x6c\xb6\x91\x68\x60\xb9\xec\xd7\x41\x54\xb4\x05\x10\x38\xa1\x73\x52\x37\x2e\xc1\x4d\x3c\x95\x7d\x2e\xf5\x0f\xf7\x86\x18\x9a\x8a\xeb\x9c\x08\xf4\x5e\xeb\x5e\xb8\xb0\x40\x33\x99\x74\xaa\x97\x98\xc4\x25\xd7\xbe\xcb\x22\x8c\x44\x7a\x6d\x0b\x3c\xef\x27\x18\x93\xe0\xf7\x07\x6e\x22\x3a\x7e\x87\xc6\xa3\xd2\x70\xa0\x33\xbc\x97\xa4\x56\x5e\xdc\xe0\xaa\x91\xff\xc3\xf7\x80\x17\x75\xa6\xf2\x9b\x23\x02\x45\xbd\x71\xfa\x03\x43\x53\xde\x37\x23\x95\xd1\xbf\xcb\xde\xbb\xa0\x81\x33\x0f\x7c\x07\x6b\xe9\x9c\x2c\xf4\x86\x7f\x15\xb7\x8d\x52\xf4\x6f\xc7\x39\x1c\x9c\xb9\x5e\x5d\x64\x64\x3b\xaf\xfe\x72\xa8\xe3\xa6\x50\x66\x7f\xbb\x3e"}, +{{0x70,0x3a,0x6e,0x2b,0x62,0xd0,0x09,0x0c,0x61,0xd8,0x65,0x9b,0x6a,0x96,0x3e,0x03,0xc9,0xd6,0x2c,0x1b,0x38,0xf7,0xd7,0x0e,0x5f,0x9f,0xf0,0x55,0x90,0xcd,0x03,0x60,},{0x37,0x0c,0x21,0xde,0x6e,0xf2,0xfa,0xb5,0x34,0xad,0xa9,0x99,0x86,0x9c,0x90,0xbc,0x9b,0x92,0xcc,0xbf,0x24,0x9b,0x79,0xd3,0x9d,0x95,0x44,0x1d,0x1e,0xde,0x21,0x0a,},{0xe5,0xfd,0x64,0xda,0x02,0x88,0x00,0xc6,0xce,0xed,0x06,0x8a,0x5e,0x59,0x6f,0x16,0x21,0xc7,0x0a,0x8c,0xb1,0x38,0xb3,0x1b,0x32,0x64,0x7e,0xb4,0xb0,0x7b,0xd2,0xec,0xc5,0x94,0x2c,0x18,0x84,0x4f,0x36,0x70,0x33,0xf6,0x73,0x98,0xe3,0x14,0xba,0x2c,0x7c,0xcf,0x29,0x9c,0x06,0x97,0x87,0x77,0x70,0x25,0xd8,0x45,0xf2,0xaa,0xd6,0x0e,},"\xd4\x2a\x17\x56\xe8\x4d\xf4\xb4\xe9\x77\x3f\x86\xf7\x67\x4a\x2c\xd7\x8e\x71\xe4\x0a\xa8\xf6\x44\xe6\x70\x2d\xfb\xc2\xc2\xc5\xca\x90\xfc\x24\x2e\x9c\xb0\x09\x9c\xc8\xf2\xc2\xd3\x13\x6b\xaa\xfc\x0f\xf6\x95\x48\x2f\xda\xcd\xef\x9f\x56\x56\x10\xb6\xe1\x90\x07\x22\xf4\x35\xc6\x38\x5b\x35\xe9\xf6\xc4\x36\xca\x03\x7e\x03\xf6\x4e\x22\x33\xdf\xfa\x58\xdb\x3b\x91\xcc\x1d\xaa\x0b\xb0\xc5\x4c\x8a\x43\xe4\x69\xd2\xcf\xf7\xfa\x2b\xf8\xf5\xd1\xd8\x77\x93\x10\x89\xc8\x2e\xd8\x9a\xba\x42\xf2\xee\x2b\x86\xe4\x45\xcf\xd0\x9f\x4c\xd7\x8b\x35\x19\x1b\xf4\x67\xe7\x84\xee\xf7\x5d\xc9\x87\xe0\x46\xd3\x7d\x4d\x4e\x8e\x9b\xbe\x14\xaf\x80\xd0\x3a\x1f\x40\x89\x83\x84\xb9\xd3\x27\x9f\xac\x9c\x57\xfd\x9c\x7e\xec\xbe\x19\xa5\xac\xc1\x50\x33\xb8\x4e\x07\xfd\x0e\x40\x9b\xdb\xd5\xa5\x7f\x65\x64\x11\x83\xa6\xc0\xa8\xec\x42\x6d\x1f\x1d\x22\x31\x66\xff\x0a\x19\x00\xb2\xe9\x2b\x7d\x85\x83\x5d\x01\x9d\x17\x77\x5e\x50\x93\xcc\xd1\x26\xf9\x0f\x63\xcb\x7d\x15\xcb\xeb\x53\x13\x24\x21\x9c\xd6\x4d\xed\x67\x14\xb2\x1a\x65\x37\x1a\xf0\x72\x10\xdf\xdf\x0e\x4e\x58\xdd\xc7\xd5\x9f\x4c\xfa\x65\xc4\x21\xd8\x14\xee\x2c\x9b\xf6\xdb\xf6\x48\x73\xd5\x79\xb0\x9e\xe5\xdc\xed\xd7\x33\x06\x3e\x03\x9a\xc9\xa5\xf9\xca\x4c\x25\x25\xa4\xcc\x8e\x98\x4d\xa7\x18\x5e\x2d\x64\xfa\xd8\x1c\x8a"}, +{{0x76,0x84,0x9c,0x18,0x8e,0x3e,0xdd,0x0f,0xf5,0xf8,0xfb,0x87,0x4d,0xc0,0x45,0x66,0x45,0x51,0x84,0x45,0xe4,0x1a,0x7d,0x68,0x33,0xe6,0x16,0xc3,0xc4,0x8c,0x98,0x68,},{0xd6,0x70,0xe2,0xea,0x07,0xdb,0x60,0xc2,0x2a,0xb7,0x9a,0x93,0xeb,0xf4,0x9d,0x22,0xa6,0x24,0x5e,0xe3,0xaf,0x07,0xb3,0xbe,0x58,0x4e,0xda,0x69,0x4c,0x37,0x72,0x9e,},{0x71,0x41,0x39,0x9d,0x51,0xda,0xa6,0xeb,0x45,0x19,0xbf,0x3f,0x01,0xb2,0x33,0x92,0x0f,0xa9,0x08,0xfe,0xfa,0x61,0x2f,0x0c,0xd7,0xd5,0xaf,0x8a,0x9a,0x3c,0x44,0x19,0x0e,0x3f,0x63,0x84,0xa8,0xd1,0x4d,0x37,0xc9,0x70,0x30,0xef,0x50,0x18,0xcf,0x8a,0xee,0x8a,0xeb,0x15,0x69,0xa7,0x3d,0x84,0x86,0x2a,0x59,0xb7,0xdf,0x72,0xfe,0x09,},"\x1e\xcc\xb0\xbc\x8e\xca\x3a\xb5\xbe\xe6\x8c\x5f\x8c\xaa\x34\x53\x67\x66\xc7\x05\xf5\x08\x27\xdb\x7a\xc3\x75\xd4\xfe\x30\xb5\x8f\xfb\x7e\x2f\xe4\x90\xcc\x71\xa8\xff\x86\xc0\x06\xd6\x17\x4d\x05\x79\x3a\xb8\xa5\x5d\xd5\x1b\x06\xde\x41\x7b\xc0\xac\x45\x2c\xdc\x7c\xfb\x0b\xb0\x03\x62\xb6\x76\x5d\x20\xdb\x23\xeb\x18\x48\x02\x70\x64\xa1\xd9\x09\x1d\x3b\x10\xed\x77\x6f\x28\xb7\x67\x68\xbd\xfc\x08\xf0\xbc\x51\x1f\x76\xfa\xeb\xa7\x6c\xfc\x4c\xb5\xc8\x3d\xc9\xeb\xe8\xa8\xd7\x9e\xdc\xa9\x23\xec\xcd\x52\x40\x09\xca\xfe\xdc\x90\xe3\xad\x87\xd1\x39\x2e\x1f\xcc\xf4\xe6\x0c\xca\xb9\x5d\xc0\xab\x54\xbf\x44\x24\x5a\x00\x7a\x96\xd4\x66\x34\xb1\xb2\x96\x5b\x82\x9c\x3d\x7d\xaa\x76\x59\x72\xb5\x4a\x7b\x36\x5b\x6f\x34\xd7\x7d\x71\x76\xac\xd8\xd8\x94\xf6\xb4\x17\x09\x1b\x6c\x00\xed\xb7\xa4\xe8\x13\x79\x98\x8b\xfc\xec\xb6\x92\xe9\xc3\xc4\x31\x0a\x7e\x24\x0e\x5c\x10\x63\xcd\xe1\x13\xf2\x2a\x68\x4a\x50\xa1\x12\xff\x47\xd3\x89\x88\x12\xef\xb9\x26\x37\x07\x2b\x86\x16\x3a\xd8\x93\x16\xd2\x21\x19\x5a\xcb\xfa\xd0\xa0\x3a\x1f\xbc\x2d\x96\x7f\xe8\x3f\x84\xc8\x45\x9f\xcc\xd4\x90\xb9\xc5\xb3\xe5\x5d\x27\xe9\x48\x4e\x94\x3c\x41\x7f\x21\x28\xd7\x37\x01\xda\x28\xf4\x9f\xd3\x68\x3f\x33\xa3\x9c\xde\xe2\x34\xbd\x30\x5b\x94\x91\xe2\xf3\xeb\x62\x1b\xe3\xdd\x1d\xbb\xb3\x1b"}, +{{0x83,0xae,0x48,0xad,0x70,0xda,0x0b,0xb3,0xcd,0xf8,0x74,0x81,0xee,0x2c,0x0c,0x85,0x71,0xc2,0xca,0x98,0x67,0x12,0xf8,0xbc,0x23,0x29,0xe9,0xa3,0xe3,0x33,0x83,0xc5,},{0xb7,0x85,0x30,0x90,0x00,0xdf,0x95,0xf5,0xa0,0x4f,0x7d,0x89,0xc4,0x11,0x33,0x01,0x05,0x7a,0xda,0xee,0xb2,0x9b,0xcd,0x28,0xd9,0x93,0x71,0xb5,0x37,0xbb,0xa2,0xf6,},{0x43,0x33,0x23,0x51,0xd3,0xfb,0x7b,0x45,0xfc,0xf3,0x7c,0x60,0x7d,0x44,0x2e,0xa8,0x0d,0xbd,0xa2,0xcb,0x69,0xc2,0x88,0x4f,0x42,0x4e,0x65,0xea,0x3a,0x33,0x1e,0xd8,0x47,0x2d,0x43,0x68,0x40,0x5c,0xb7,0x36,0xb2,0xd6,0x68,0x5a,0xd7,0x82,0xe2,0x39,0xfe,0x83,0x3e,0xd7,0x89,0xa2,0x92,0x31,0x85,0x16,0x6f,0x60,0x83,0x42,0xee,0x05,},"\xb7\x52\x1d\x3f\x71\xc6\x79\xfa\x70\x37\xfe\x74\x88\xa6\x41\xf6\xb9\x7c\x49\x45\x4a\xcc\x8e\x36\xb9\x03\xd8\xf9\xeb\xb5\x4d\x89\xcb\x56\xef\xd1\x9e\x04\xba\x6a\x7c\x8f\x48\xa7\xd3\xec\x9d\xec\xd3\xf1\xcd\x0f\xaf\x6e\x97\x81\x18\xe6\xad\xce\x9c\x6c\x6b\xe6\x3c\x6a\x6a\x1a\xe2\x16\x51\x82\x84\x79\xa4\x6b\xc9\xa0\xf7\x94\x30\x40\xf9\x40\xa0\xd4\x70\xc8\xe5\x77\xc5\xd5\x75\xcb\x53\xc1\xbf\x3a\xb1\xfe\xb0\x50\xdc\xb6\xfe\xf0\xba\x44\x47\xf2\x99\xfd\xb9\xf2\x7e\xcb\x07\x14\xec\xfe\xfd\x74\xba\xd7\xb1\x22\xa4\x62\xc2\x4a\x20\x98\x48\xa0\x33\x89\x07\x45\x78\xc5\xbd\xc3\x63\x96\xd8\x09\xb0\xf1\x40\x18\xda\x64\x91\x7e\x6b\xf8\x7e\xf4\x05\xc8\xf3\xe3\x33\xff\x9c\x3b\xaf\x63\x39\x66\x76\x20\x79\x4b\xb4\x74\x3f\x05\x14\xb5\xde\x7d\x7f\xdd\x94\x7a\x7e\x35\x01\xee\x88\xef\xad\x15\x9e\x33\xa1\x07\x2f\xbb\x99\xc7\xc7\x1e\x9d\x13\xa5\x02\xd5\xa0\x7c\x4f\x81\x7e\xeb\x7f\x0c\x53\x19\xaa\x41\xa9\x6d\x5f\xf4\xf1\x5a\x73\xc2\x9b\x57\x1f\xe2\x11\x09\x0e\x17\x2c\x8d\xb5\x18\x62\x46\x12\xa5\xc3\x71\xa9\xd7\xce\xf6\xde\x35\xeb\xef\x96\xe8\x8e\x1a\x78\xaf\x3b\xd5\xdd\x35\x25\x1a\xb5\x4d\x73\x71\x8f\x3e\x70\xd2\xd5\x90\x21\x53\x1d\xc7\x31\x84\xf0\xfc\x69\xc2\xe9\x29\x65\x84\x4e\xc2\x7c\x1c\x02\xaf\x5e\x9a\x34\x69\xde\x35\x5d\xb2\x25\x6e\x0e\xc2\xa4\xeb\xa3\x0a"}, +{{0x39,0xe5,0x6a,0x65,0x62,0x3a,0x0a,0xeb,0xad,0xe0,0xda,0x12,0xce,0x1d,0xf3,0x78,0xbc,0x92,0x40,0x73,0xf7,0x3a,0x54,0x9e,0xff,0xae,0xbc,0x46,0x5d,0x1a,0x78,0xe2,},{0x83,0xda,0x8a,0xd5,0x0b,0xad,0x09,0xeb,0x3e,0x94,0xc7,0x25,0xdf,0x3c,0xc3,0xa1,0x19,0x73,0x6a,0xdc,0x85,0x9c,0xa1,0xa1,0x05,0x03,0xf4,0x8f,0xf2,0xfe,0xc5,0x96,},{0x39,0x8e,0x82,0x60,0x01,0x1f,0x57,0xd8,0xac,0x8c,0x58,0xd5,0x45,0x7b,0xc6,0x52,0xc7,0x41,0x4a,0xaf,0x6f,0xb2,0xf4,0x26,0xb7,0x89,0x90,0x56,0x60,0x5c,0x0a,0xfc,0x28,0x39,0x24,0x23,0xb2,0xb5,0x71,0xf5,0xe6,0xc3,0xc7,0xf6,0xd6,0x02,0x45,0xe5,0x3e,0xbd,0x03,0xbd,0xc5,0xad,0x3c,0x1a,0xd8,0x73,0x8c,0xb3,0x22,0x14,0xd0,0x0f,},"\xa9\x6d\xc2\xea\x3f\xa1\x35\x14\x92\xa4\x61\x9d\x91\x94\x68\x1f\x8e\xc4\x00\xa9\x71\x58\x24\x44\x82\x65\x38\x38\xcc\xb7\xe1\x56\xa8\x2d\x56\x43\x68\xf8\x3a\x6e\xe1\xbe\x46\xbc\x34\xb8\x17\x20\x0e\x84\x64\xc3\xd1\x2b\x5e\xf2\xc5\x0b\x19\x56\x5b\x88\x1c\x4c\x3d\x45\x63\xfb\x94\x7e\xb4\x7c\x3e\xe9\xc1\xee\x78\x53\x26\x98\x74\x45\x5b\xfa\xcb\xa3\x05\xf3\x07\xd1\xac\x53\x09\xee\xae\x5c\x07\xfa\x5c\x4d\x42\x8e\xdb\xc8\xb9\x52\x8c\x44\x15\x24\x3a\x9e\xf5\x80\xaf\xf8\xfc\xfb\x12\x00\x0a\x71\xfc\xee\xe8\x9d\xe9\x7f\x90\x27\x95\x29\xbc\xc8\x22\xed\x3c\xb3\x4c\x82\xba\x5f\xec\x15\xf4\x94\x56\x63\x63\x6d\x67\xb5\xfe\xce\xac\xc3\x1d\x25\xf9\x8a\xea\x07\xf7\x80\x0d\x5a\x10\x34\x25\x1c\xb9\x1d\xd0\x96\x3e\xc2\xc1\xa5\x47\x73\xa4\xd9\x6c\x18\x35\x7f\x8d\x10\x1d\xe5\x8e\x93\x2f\x8c\x6c\xdd\xe8\xe3\xcf\xce\xf5\xa7\x44\x3f\xdb\xa7\xb7\x83\x20\x40\x3c\x01\x96\x84\x47\x24\xa6\x12\x18\x3e\x34\xbd\xd8\x08\xce\x7b\x95\x88\x61\xca\x37\x11\x57\x30\xea\xed\xe1\xfd\x0b\xaa\xbe\x97\x6e\xfe\xfd\x03\x65\xfd\xf9\x26\x77\x6c\x53\x6f\x47\xff\x80\xde\x5c\x18\x29\x1b\xb7\xe9\xf1\xb9\x13\xff\xd1\xd9\x44\x68\xb7\x89\x75\x2f\xae\x6c\xa8\x97\xc0\xcc\xa5\x3e\xf1\xe7\x31\xd0\x0c\x8b\xdb\xe8\x92\x9e\xa6\xb1\xdc\xe1\xf3\x1a\x20\x68\x8d\x37\xb0\xf3\xa2\xb4\x15\x3b\x30\x6b\xdb\xa1"}, +{{0x4b,0x99,0x21,0x85,0x2f,0x40,0x9a,0x32,0x3a,0xe3,0x81,0x75,0xe8,0xd7,0x6a,0x21,0x1f,0xc4,0xd9,0xc6,0x54,0x17,0x8e,0xea,0x3b,0xaa,0x7a,0x76,0x7a,0x6f,0xda,0x06,},{0x4c,0x72,0x3e,0x43,0x6b,0x6b,0xd9,0x7f,0x44,0xaf,0x52,0x50,0x3b,0x21,0xcc,0x50,0xd5,0xf6,0xad,0x6c,0xfc,0x82,0x88,0x34,0x5d,0xde,0x80,0x54,0xe9,0x95,0x58,0x2e,},{0xcb,0xf1,0xf1,0x64,0x2d,0xf9,0x50,0xeb,0x71,0xfd,0x09,0x59,0x0d,0x34,0xc2,0x65,0x92,0x2c,0x58,0xbd,0x80,0x26,0xbb,0xa3,0xfc,0x0e,0x59,0x4a,0x6b,0xb1,0xf2,0xb9,0x0d,0xa3,0xdc,0x1d,0x5f,0x6b,0x6d,0x5b,0x40,0x5a,0x89,0x6d,0x1d,0xbb,0x71,0xb8,0x68,0x5c,0x4d,0xfc,0x44,0x4a,0xca,0xff,0xe6,0x5a,0xb8,0x33,0x17,0x89,0xf5,0x07,},"\x3f\x33\xd8\xfb\x83\xe6\x87\x41\x09\x0a\x37\xbe\xdd\x74\x5c\xf1\x41\xaa\xae\xd8\xc9\x2f\xfa\x74\x2a\x52\x56\x17\x77\x88\x58\x05\xac\xe1\x42\x46\xab\x98\xa8\xcb\x59\x8c\x9c\xe3\xde\x9b\x29\xba\xe5\xfa\x04\xb1\xcf\x82\x8d\xe1\x1a\xff\x80\xa7\xef\x8a\x3a\x38\xae\xde\x4f\x3c\x35\x63\xa2\x5d\x04\x9b\xad\xca\xd5\xed\x7e\x47\xfd\xbb\xa6\xe1\x11\x30\x7e\xeb\xe9\xef\x49\x06\xbc\x98\x97\x28\xb7\x6e\x84\xaf\xe8\x08\xe6\x65\x3b\x27\x1e\x21\x10\x4a\xa6\x65\xf1\x89\x8d\xd2\xaa\xb2\x30\x90\xe2\x2b\x4e\x34\x4a\x26\x16\xfb\xd8\xee\x4a\xd8\xed\x81\x08\x39\x5e\xba\x81\x7f\xbd\x14\xfe\xc5\xc1\x7d\xcf\x56\xb8\x22\x08\x56\xb2\xb8\x33\xe0\x91\x40\x7d\x50\x89\xb3\x5d\xdf\x34\xb8\x6f\xf7\xdc\x9f\xde\x52\xb2\x1e\xf1\x21\x76\xef\x33\x70\xb7\xf3\xa0\xa8\xcb\x1b\x05\x8a\x51\xae\xff\xf3\xd2\x79\xd8\x0f\x51\xa6\x8b\xfb\x59\x25\x87\xb4\x5c\x5c\x63\xa7\xe4\xd6\x25\xb8\x87\xde\x48\x6a\x11\x83\x16\xc3\xb6\xa2\x38\x57\x5f\x92\xac\x5b\x1c\x94\xc3\xf5\xdb\xbd\x96\x68\x60\x00\xd6\xd3\x9c\xcc\xd5\x58\xd4\x20\xe4\xd4\x47\xa8\xcb\xc4\xbc\x7b\x8c\x6a\x03\xaf\x0f\x00\x34\xfb\x35\x18\xd9\x38\x00\xf0\xf7\x13\xe4\xb1\x37\x32\xe1\x6a\xda\x51\x80\x1d\x7e\x55\x9c\xf8\x39\xd1\x05\x8f\x64\x95\x56\x98\x31\x13\x99\x34\x54\x16\x85\x0d\xdd\xcc\x56\x01\xa6\x84\xfd\x09\xe6\xaf\xd3\x94\x4f\x5e\x19"}, +{{0x1b,0xff,0x65,0x2a,0x2c,0x83,0x09,0xa3,0x93,0xac,0x11,0xda,0x3a,0xa9,0x7f,0xb0,0x78,0xbb,0x28,0x4e,0xd5,0xe1,0xb8,0xcc,0xc9,0x83,0x65,0x2e,0xf8,0x55,0x6c,0xd0,},{0xaa,0xab,0xdc,0x09,0x1f,0xc3,0x68,0x23,0x54,0x20,0x17,0x44,0xe9,0xb7,0x3f,0xd2,0xa6,0xcf,0xb2,0x81,0x91,0x4b,0xf2,0xc7,0x0e,0xc3,0xdc,0x1d,0xec,0x72,0x16,0xb0,},{0x93,0xc9,0xc3,0x34,0x93,0xfc,0x64,0x17,0x2d,0x51,0xe1,0x6a,0x0a,0x1c,0xd7,0x29,0xa0,0xd9,0x9e,0x3c,0xb8,0x64,0xe8,0x9a,0x42,0x98,0x7f,0x39,0xdd,0x8c,0xd2,0x65,0x45,0xfd,0xfe,0x37,0x58,0x19,0x11,0xe8,0x03,0x67,0x7d,0xa4,0xc5,0x5b,0x0a,0x68,0x3d,0xdf,0x62,0xb7,0x28,0xf8,0xf3,0x06,0x85,0xae,0x58,0xf6,0x28,0xeb,0xe6,0x09,},"\x48\xd0\x26\x98\xa9\x7b\xdc\xb3\xef\x07\x8d\xcf\xcf\x57\x50\x00\x5f\x17\x02\xd3\x00\xe7\xe8\x9b\xc4\x36\xe3\x81\x11\x34\x01\xf8\x52\xb8\xb4\xac\xff\x60\xff\xbd\x4a\xb4\x6d\x20\x21\x68\xd9\x8b\x87\x35\xe7\x9c\xb3\x50\xe3\x5b\x07\x0f\xf6\xbd\xca\xfd\x95\x4b\x55\x19\x69\xb6\xb1\xa7\x0c\x91\x31\xeb\xd4\x0d\x96\x14\x02\x91\xd8\xd2\xb0\x91\x54\x0a\x8b\x18\xd8\xe5\x46\x59\x15\xc2\x5d\xbc\x6b\x5c\x9a\x68\x79\x42\x53\x3c\x37\x2c\x8b\x4e\x95\xa9\x53\x67\x71\x69\xb9\x50\xed\xd3\x46\x43\x75\xcd\x43\x13\x2f\xf9\xbd\x54\x1e\xe2\x2b\xd4\x18\xce\x23\x19\x5f\x65\xd8\xb2\x89\xf6\x33\xec\x8d\x71\xe1\xa8\x01\xb0\x6c\x3c\x82\x7f\x62\x7e\x72\x3d\x21\x99\x10\x0c\xe7\x3e\x8e\x4a\x44\x40\xe7\x78\x31\x7a\x47\x49\x10\x79\x3b\x47\xb1\x0f\xfb\x55\xdb\x7f\x28\x1c\x7d\x7a\x03\x3b\xd8\x00\x48\xb8\x26\x73\xb8\x7c\xf9\x5e\x99\x42\x2b\xa6\x28\x68\x8f\x3c\x97\x18\x90\xca\x15\xd1\x2f\x57\x2f\xa1\x97\x7a\x17\x30\x70\x69\xda\x30\x4e\xad\x30\x26\xeb\x01\x04\x26\x68\x89\x0d\x17\x00\x8c\xd1\xe9\x2c\x46\xcb\xe9\xc8\x57\xe7\x19\x3d\xe3\xab\xa3\x91\x1e\x4f\x86\xfe\x0a\x16\x98\xab\x7c\xdb\x92\x51\xa8\x42\x4b\x28\x48\xb9\x6a\xd8\x1e\xa2\x39\xd3\x65\xfd\xea\x92\xea\x5c\x04\x73\xd0\xa6\xbb\x1e\x37\x13\x56\xbd\xfa\xd2\xd0\x35\x03\x36\xd3\xe1\x94\x7c\x93\x6f\xd0\xc2\x51\x95\x44\x50\x11\x73\x1b"}, +{{0x00,0x2f,0xdd,0x1f,0x76,0x41,0x79,0x3a,0xb0,0x64,0xbb,0x7a,0xa8,0x48,0xf7,0x62,0xe7,0xec,0x6e,0x33,0x2f,0xfc,0x26,0xee,0xac,0xda,0x14,0x1a,0xe3,0x3b,0x17,0x83,},{0x77,0xd1,0xd8,0xeb,0xac,0xd1,0x3f,0x4e,0x2f,0x8a,0x40,0xe2,0x8c,0x4a,0x63,0xbc,0x9c,0xe3,0xbf,0xb6,0x97,0x16,0x33,0x4b,0xcb,0x28,0xa3,0x3e,0xb1,0x34,0x08,0x6c,},{0x0d,0xf3,0xaa,0x0d,0x09,0x99,0xad,0x3d,0xc5,0x80,0x37,0x8f,0x52,0xd1,0x52,0x70,0x0d,0x5b,0x3b,0x05,0x7f,0x56,0xa6,0x6f,0x92,0x11,0x2e,0x44,0x1e,0x1c,0xb9,0x12,0x3c,0x66,0xf1,0x87,0x12,0xc8,0x7e,0xfe,0x22,0xd2,0x57,0x37,0x77,0x29,0x62,0x41,0x21,0x69,0x04,0xd7,0xcd,0xd7,0xd5,0xea,0x43,0x39,0x28,0xbd,0x28,0x72,0xfa,0x0c,},"\x5a\xc1\xdf\xc3\x24\xf4\x3e\x6c\xb7\x9a\x87\xab\x04\x70\xfa\x85\x7b\x51\xfb\x94\x49\x82\xe1\x90\x74\xca\x44\xb1\xe4\x00\x82\xc1\xd0\x7b\x92\xef\xa7\xea\x55\xad\x42\xb7\xc0\x27\xe0\xb9\xe3\x37\x56\xd9\x5a\x2c\x17\x96\xa7\xc2\x06\x68\x11\xdc\x41\x85\x83\x77\xd4\xb8\x35\xc1\x68\x8d\x63\x88\x84\xcd\x2a\xd8\x97\x0b\x74\xc1\xa5\x4a\xad\xd2\x70\x64\x16\x39\x28\xa7\x79\x88\xb2\x44\x03\xaa\x85\xaf\x82\xce\xab\x6b\x72\x8e\x55\x47\x61\xaf\x71\x75\xae\xb9\x92\x15\xb7\x42\x1e\x44\x74\xc0\x4d\x21\x3e\x01\xff\x03\xe3\x52\x9b\x11\x07\x7c\xdf\x28\x96\x4b\x8c\x49\xc5\x64\x9e\x3a\x46\xfa\x0a\x09\xdc\xd5\x9d\xca\xd5\x8b\x9b\x92\x2a\x83\x21\x0a\xcd\x5e\x65\x06\x55\x31\x40\x02\x34\xf5\xe4\x0c\xdd\xcf\x98\x04\x96\x8e\x3e\x9a\xc6\xf5\xc4\x4a\xf6\x50\x01\xe1\x58\x06\x7f\xc3\xa6\x60\x50\x2d\x13\xfa\x88\x74\xfa\x93\x33\x21\x38\xd9\x60\x6b\xc4\x1b\x4c\xee\x7e\xdc\x39\xd7\x53\xda\xe1\x2a\x87\x39\x41\xbb\x35\x7f\x7e\x92\xa4\x49\x88\x47\xd6\x60\x54\x56\xcb\x8c\x0b\x42\x5a\x47\xd7\xd3\xca\x37\xe5\x4e\x90\x3a\x41\xe6\x45\x0a\x35\xeb\xe5\x23\x7c\x6f\x0c\x1b\xbb\xc1\xfd\x71\xfb\x7c\xd8\x93\xd1\x89\x85\x02\x95\xc1\x99\xb7\xd8\x8a\xf2\x6b\xc8\x54\x89\x75\xfd\xa1\x09\x9f\xfe\xfe\xe4\x2a\x52\xf3\x42\x8d\xdf\xf3\x5e\x01\x73\xd3\x33\x95\x62\x50\x7a\xc5\xd2\xc4\x5b\xbd\x2c\x19\xcf\xe8\x9b"}, +{{0x25,0xb0,0xf0,0xbb,0x3d,0xcb,0x42,0x2a,0x6f,0x3c,0x6c,0x22,0x0e,0xaa,0xdb,0x11,0xdb,0xfe,0x48,0x9c,0x2d,0x45,0x5b,0x27,0x6c,0xef,0xe8,0xcb,0xa0,0x57,0xf9,0xf3,},{0xfe,0x03,0xc9,0xc4,0x39,0x4a,0xdc,0x74,0xb1,0x3f,0x47,0x65,0x4b,0xea,0xd8,0xbc,0x85,0x59,0x58,0xb4,0x19,0x4f,0xda,0xb2,0x09,0x7a,0xc1,0xb1,0x57,0x93,0x3c,0x05,},{0xda,0x50,0xd5,0x24,0x2b,0xf5,0x1c,0x39,0x51,0x78,0x0c,0xaf,0xd9,0x26,0xd6,0x7b,0xdf,0x56,0x40,0xd5,0xd3,0xbb,0x08,0x43,0x38,0x31,0xd5,0x6e,0x48,0xe2,0x59,0x2a,0x1c,0x37,0x59,0x68,0xbb,0x4d,0x2f,0xbe,0xa5,0x61,0x45,0xab,0xf2,0xd8,0x29,0x91,0x36,0x3b,0x15,0x65,0xfa,0x1e,0xff,0xe2,0x14,0x01,0x1a,0x68,0x6e,0x39,0x95,0x0e,},"\x54\xd9\x9f\x96\x9e\xfa\x88\x70\xfc\x20\xfa\x9a\x96\x2b\xb3\x72\x61\x9c\x32\x44\x39\x72\x8a\xf3\x13\x9c\x2a\x07\xe8\xc1\xb2\x9c\x1e\x4e\xed\xc2\xd4\x0b\xa7\x22\xf6\x3c\xe3\x76\x70\x36\x2a\xf6\xf5\x20\x2a\xdd\x66\x8c\x4f\xb4\xd6\x2f\xa8\xba\xcb\xc7\xd0\x7f\xf3\xbd\x38\xc1\x5a\x01\x06\x42\x59\xcc\x34\x13\x48\x61\x63\x29\x67\x46\x05\x41\xa9\x9b\x8d\x51\x82\xbf\x59\x34\x7b\x5a\x59\x87\x9a\xa3\xb0\x91\xa1\xf3\xe0\x41\x35\xbd\x63\x01\xbe\x52\x26\xd4\x89\x5e\x5e\x9c\x2b\x15\xe4\x8e\x5e\xcd\xf4\x41\x29\xe6\x12\x28\x53\xa6\x06\xfc\x11\x84\x66\xfa\x72\x0b\x5a\xb1\x65\x63\x5c\x3b\xde\x04\xd7\x42\x89\x27\x4f\xa0\x35\x47\xac\xcb\xde\x78\x0e\x1f\xa0\xbf\x2c\x56\xf8\x43\x6a\x53\xe7\x38\x78\xa4\x24\xa2\x9a\xa9\xde\x38\x5d\xba\x41\x9a\xe6\xa5\xd1\x2e\x00\x42\x76\x15\x2b\x58\xd3\x25\xb3\x02\x40\x0a\x55\x33\x3c\x38\xcd\xe4\x90\x8a\xe1\xd0\x12\x1c\xbe\xca\x95\x08\x09\xc5\x43\x31\x42\x77\xc1\x48\x5e\x68\xd9\xf9\xc0\xa9\x62\xd1\xb1\xe0\xdd\xa1\xd4\xa5\x2b\x56\xf8\x30\x8a\x80\xb9\x2a\xcc\x9f\x4e\xbc\x3e\xd4\x5d\x91\xa1\x29\xda\x86\x75\x62\x1a\xf6\x76\x70\x3d\xef\x3b\x84\x11\x31\x83\xb2\xe3\xa8\xc5\x61\x57\xf2\x43\xf1\x39\x80\xf3\xd1\x75\x6f\xea\x76\x68\xc9\x15\x03\xd3\x5c\x83\x9a\x21\x20\xc7\x9e\xc9\x54\xfb\x54\x6d\x7b\x54\x2f\x98\x72\x89\x53\x4f\xfd\xef\x62\xd4\x7f\xd5\xec"}, +{{0xbf,0x5b,0xa5,0xd6,0xa4,0x9d,0xd5,0xef,0x7b,0x4d,0x5d,0x7d,0x3e,0x4e,0xcc,0x50,0x5c,0x01,0xf6,0xcc,0xee,0x4c,0x54,0xb5,0xef,0x7b,0x40,0xaf,0x6a,0x45,0x41,0x40,},{0x1b,0xe0,0x34,0xf8,0x13,0x01,0x7b,0x90,0x0d,0x89,0x90,0xaf,0x45,0xfa,0xd5,0xb5,0x21,0x4b,0x57,0x3b,0xd3,0x03,0xef,0x7a,0x75,0xef,0x4b,0x8c,0x5c,0x5b,0x98,0x42,},{0x27,0x9c,0xac,0xe6,0xfd,0xaf,0x39,0x45,0xe3,0x83,0x7d,0xf4,0x74,0xb2,0x86,0x46,0x14,0x37,0x47,0x63,0x2b,0xed,0xe9,0x3e,0x7a,0x66,0xf5,0xca,0x29,0x1d,0x2c,0x24,0x97,0x85,0x12,0xca,0x0c,0xb8,0x82,0x7c,0x8c,0x32,0x26,0x85,0xbd,0x60,0x55,0x03,0xa5,0xec,0x94,0xdb,0xae,0x61,0xbb,0xdc,0xae,0x1e,0x49,0x65,0x06,0x02,0xbc,0x07,},"\x16\x15\x2c\x2e\x03\x7b\x1c\x0d\x32\x19\xce\xd8\xe0\x67\x4a\xee\x6b\x57\x83\x4b\x55\x10\x6c\x53\x44\x62\x53\x22\xda\x63\x8e\xce\xa2\xfc\x9a\x42\x4a\x05\xee\x95\x12\xd4\x8f\xcf\x75\xdd\x8b\xd4\x69\x1b\x3c\x10\xc2\x8e\xc9\x8e\xe1\xaf\xa5\xb8\x63\xd1\xc3\x67\x95\xed\x18\x10\x5d\xb3\xa9\xaa\xbd\x9d\x2b\x4c\x17\x47\xad\xba\xf1\xa5\x6f\xfc\xc0\xc5\x33\xc1\xc0\xfa\xef\x33\x1c\xdb\x79\xd9\x61\xfa\x39\xf8\x80\xa1\xb8\xb1\x16\x47\x41\x82\x2e\xfb\x15\xa7\x25\x9a\x46\x5b\xef\x21\x28\x55\x75\x1f\xab\x66\xa8\x97\xbf\xa2\x11\xab\xe0\xea\x2f\x2e\x1c\xd8\xa1\x1d\x80\xe1\x42\xcd\xe1\x26\x3e\xec\x26\x7a\x31\x38\xae\x1f\xcf\x40\x99\xdb\x0a\xb5\x3d\x64\xf3\x36\xf4\xbc\xd7\xa3\x63\xf6\xdb\x11\x2c\x0a\x24\x53\x05\x1a\x00\x06\xf8\x13\xaa\xf4\xae\x94\x8a\x20\x90\x61\x93\x74\xfa\x58\x05\x24\x09\xc2\x8e\xf7\x62\x25\x68\x7d\xf3\xcb\x2d\x1b\x0b\xfb\x43\xb0\x9f\x47\xf1\x23\x2f\x79\x0e\x6d\x8d\xea\x75\x9e\x57\x94\x20\x99\xf4\xc4\xbd\x33\x90\xf2\x8a\xfc\x20\x98\x24\x49\x61\x46\x5c\x64\x3f\xc8\xb2\x97\x66\xaf\x2b\xcb\xc5\x44\x0b\x86\xe8\x36\x08\xcf\xc9\x37\xbe\x98\xbb\x48\x27\xfd\x5e\x6b\x68\x9a\xdc\x2e\x26\x51\x3d\xb5\x31\x07\x6a\x65\x64\x39\x62\x55\xa0\x99\x75\xb7\x03\x4d\xac\x06\x46\x1b\x25\x56\x42\xe3\xa7\xed\x75\xfa\x9f\xc2\x65\x01\x1f\x5f\x62\x50\x38\x2a\x84\xac\x26\x8d\x63\xba\x64"}, +{{0x65,0xde,0x29,0x7b,0x70,0xcb,0xe8,0x09,0x80,0x50,0x0a,0xf0,0x56,0x1a,0x24,0xdb,0x50,0x00,0x10,0x00,0x12,0x5f,0x44,0x90,0x36,0x6d,0x83,0x00,0xd3,0x12,0x85,0x92,},{0xba,0x8e,0x2a,0xd9,0x29,0xbd,0xce,0xa5,0x38,0x74,0x10,0x42,0xb5,0x7f,0x20,0x67,0xd3,0x15,0x37,0x07,0xa4,0x53,0x77,0x0d,0xb9,0xf3,0xc4,0xca,0x75,0x50,0x4d,0x24,},{0x7a,0x9b,0x73,0x6b,0x01,0xcc,0x92,0xa3,0x34,0x9f,0x1a,0x3c,0x32,0xdb,0xd9,0x19,0x59,0x82,0x53,0x94,0xff,0x44,0x3c,0x56,0x74,0x05,0xe8,0x99,0xc8,0x18,0x5c,0xe8,0xfa,0xd9,0x50,0x0e,0x1f,0xce,0x89,0xd9,0x5a,0x62,0x53,0xc0,0x04,0x77,0x43,0x5a,0xcf,0x04,0xbf,0xf9,0x93,0xde,0x1b,0x00,0x49,0x5d,0xef,0x08,0x34,0xee,0x1f,0x07,},"\x13\x1d\x8f\x4c\x2c\x94\xb1\x53\x56\x5b\x86\x59\x2e\x77\x0c\x98\x7a\x44\x34\x61\xb3\x9a\xa2\x40\x8b\x29\xe2\x13\xab\x05\x7a\xff\xc5\x98\xb5\x83\x73\x9d\x66\x03\xa8\x3f\xef\x0a\xfc\x51\x47\x21\xdb\x0e\x76\xf9\xbd\x1b\x72\xb9\x8c\x56\x5c\xc8\x88\x1a\xf5\x74\x7c\x0b\xa6\xf5\x8c\x53\xdd\x23\x77\xda\x6c\x0d\x3a\xa8\x05\x62\x0c\xc4\xe7\x5d\x52\xaa\xbc\xba\x1f\x9b\x28\x49\xe0\x8b\xd1\xb6\xb9\x2e\x6f\x06\x61\x5b\x81\x45\x19\x60\x6a\x02\xdc\x65\xa8\x60\x9f\x5b\x29\xe9\xc2\xaf\x5a\x89\x4f\x71\x16\xef\x28\xcf\xd1\xe7\xb7\x6b\x64\x06\x17\x32\xf7\xa5\xa3\xf8\xaa\x4c\x2e\x56\x9e\x62\x7a\x3f\x97\x49\xaa\x59\x7b\xe4\x9d\x6b\x94\x43\x6c\x35\x2d\xd5\xfa\x7b\x83\xc9\x2d\x26\x10\xfa\xa3\x20\x95\xca\x30\x21\x52\xd9\x1a\x3c\x97\x76\x75\x0e\x75\x8e\xe8\xe9\xe4\x02\xc6\xf5\x38\x5e\xaa\x5d\xf2\x38\x50\xe5\x4b\xeb\x1b\xe4\x37\xa4\x16\xc7\x11\x5e\xd6\xaa\x6d\xe1\x3b\x55\x48\x25\x32\x78\x7e\x0b\xee\x34\xb8\x3f\x30\x84\x40\x67\x65\x63\x54\x97\xc9\x31\xb6\x2a\x05\x18\xf1\xfb\xc2\xb8\x91\xdc\x72\x62\xc7\xc6\xb6\x7e\xda\x59\x4f\xa5\x30\xd7\x4c\x93\x29\xba\xd5\xbe\x94\xc2\x87\xfb\xcd\xe5\x3a\xa8\x02\x72\xb8\x33\x22\x61\x3d\x93\x68\xe5\x90\x40\x76\xfd\xbc\xc8\x8b\x2c\x0e\x59\xc1\x0b\x02\xc4\x48\xe0\x0d\x1b\x3e\x7a\x9c\x96\x40\xfe\xff\xb9\x52\x3a\x8a\x60\xe1\xd8\x3f\x04\xa4\xb8\xdf\x69\x15\x3b"}, +{{0x08,0x26,0xe7,0x33,0x33,0x24,0xe7,0xec,0x8c,0x76,0x42,0x92,0xf6,0x01,0x5d,0x46,0x70,0xe9,0xb8,0xd7,0xc4,0xa8,0x9e,0x8d,0x90,0x9e,0x8e,0xf4,0x35,0xd1,0x8d,0x15,},{0xff,0xb2,0x34,0x8c,0xa8,0xa0,0x18,0x05,0x8b,0xe7,0x1d,0x15,0x12,0xf3,0x76,0xf9,0x1e,0x8b,0x0d,0x55,0x25,0x81,0x25,0x4e,0x10,0x76,0x02,0x21,0x73,0x95,0xe6,0x62,},{0x4b,0xac,0x7f,0xab,0xec,0x87,0x24,0xd8,0x1a,0xb0,0x9a,0xe1,0x30,0x87,0x4d,0x70,0xb5,0x21,0x34,0x92,0x10,0x43,0x72,0xf6,0x01,0xae,0x5a,0xbb,0x10,0x53,0x27,0x99,0x37,0x3c,0x4d,0xad,0x21,0x58,0x76,0x44,0x1f,0x47,0x4e,0x2c,0x00,0x6b,0xe3,0x7c,0x3c,0x8f,0x5f,0x6f,0x01,0x7d,0x08,0x70,0x41,0x4f,0xd2,0x76,0xa8,0xf4,0x28,0x08,},"\x7f\x9e\x3e\x2f\x03\xc9\xdf\x3d\x21\xb9\x90\xf5\xa4\xaf\x82\x95\x73\x4a\xfe\x78\x3a\xcc\xc3\x4f\xb1\xe9\xb8\xe9\x5a\x0f\xd8\x37\xaf\x7e\x05\xc1\x3c\xda\x0d\xe8\xfa\xda\xc9\x20\x52\x65\xa0\x79\x2b\x52\x56\x3b\xdc\x2f\xee\x76\x63\x48\xbe\xfc\xc5\x6b\x88\xbb\xb9\x5f\x15\x44\x14\xfb\x18\x6e\xc4\x36\xaa\x62\xea\x6f\xca\xbb\x11\xc0\x17\xa9\xd2\xd1\x5f\x67\xe5\x95\x98\x0e\x04\xc9\x31\x3b\xc9\x4f\xbc\x8c\x11\x34\xc2\xf4\x03\x32\xbc\x7e\x31\x1a\xc1\xce\x11\xb5\x05\xf8\x57\x2a\xda\x7f\xbe\x19\x6f\xba\x82\x2d\x9a\x91\x44\x92\xfa\x71\x85\xe9\xf3\xbe\xa4\x68\x72\x00\xa5\x24\xc6\x73\xa1\xcd\xf8\x7e\xb3\xa1\x40\xdc\xdb\x6a\x88\x75\x61\x34\x88\xa2\xb0\x0a\xdf\x71\x75\x34\x1c\x1c\x25\x76\x35\xfa\x1a\x53\xa3\xe2\x1d\x60\xc2\x28\x39\x9e\xea\x09\x91\xf1\x12\xc6\x0f\x65\x3d\x71\x48\xe2\xc5\xce\xb9\x8f\x94\x08\x31\xf0\x70\xdb\x10\x84\xd7\x91\x56\xcc\x82\xc4\x6b\xc9\xb8\xe8\x84\xf3\xfa\x81\xbe\x2d\xa4\xcd\xda\x46\xbc\xaa\x24\xcc\x46\x1f\x76\xee\x64\x7b\xb0\xf0\xf8\xc1\x5a\xc5\xda\xa7\x95\xb9\x45\xe6\xf8\x5b\xb3\x10\x36\x2e\x48\xd8\x09\x5c\x78\x2c\x61\xc5\x2b\x48\x1b\x4b\x00\x2a\xd0\x6e\xa7\x4b\x8d\x30\x6e\xff\x71\xab\xf2\x1d\xb7\x10\xa8\x91\x3c\xbe\x48\x33\x2b\xe0\xa0\xb3\xf3\x1e\x0c\x7a\x6e\xba\x85\xce\x33\xf3\x57\xc7\xae\xcc\xd3\x0b\xfb\x1a\x65\x74\x40\x8b\x66\xfe\x40\x4d\x31\xc3\xc5"}, +{{0x00,0xad,0x62,0x27,0x97,0x7b,0x5f,0x38,0xcc,0xda,0x99,0x4d,0x92,0x8b,0xba,0x90,0x86,0xd2,0xda,0xeb,0x01,0x3f,0x86,0x90,0xdb,0x98,0x66,0x48,0xb9,0x0c,0x1d,0x45,},{0x91,0xa4,0xea,0x00,0x57,0x52,0xb9,0x2c,0xbe,0xbf,0x99,0xa8,0xa5,0xcb,0xec,0xd2,0x40,0xae,0x3f,0x01,0x6c,0x44,0xad,0x14,0x1b,0x2e,0x57,0xdd,0xc7,0x73,0xdc,0x8e,},{0xdc,0x50,0x1d,0xb7,0x9f,0xd7,0x82,0xbc,0x88,0xca,0xe7,0x92,0x55,0x7d,0x5d,0x27,0x3f,0x9b,0xa5,0x60,0xc7,0xd9,0x00,0x37,0xfe,0x84,0xac,0x87,0x9d,0x68,0x4f,0x61,0x2a,0x77,0x45,0x2c,0x44,0x43,0xe9,0x5c,0x07,0xb8,0xbe,0x19,0x2c,0x35,0x76,0x9b,0x17,0xbb,0xdf,0xca,0x42,0x28,0x0d,0xe7,0x96,0xd9,0x21,0x19,0xd8,0x33,0x67,0x0d,},"\xcb\x5b\xc5\xb9\x8b\x2e\xfc\xe4\x35\x43\xe9\x1d\xf0\x41\xe0\xdb\xb5\x3e\xd8\xf6\x7b\xf0\xf1\x97\xc5\x2b\x22\x11\xe7\xa4\x5e\x2e\x1e\xc8\x18\xc1\xa8\x0e\x10\xab\xf6\xa4\x35\x35\xf5\xb7\x9d\x97\x4d\x8a\xe2\x8a\x22\x95\xc0\xa6\x52\x17\x63\xb6\x07\xd5\x10\x3c\x6a\xef\x3b\x27\x86\xbd\x5a\xfd\x75\x63\x69\x56\x60\x68\x43\x37\xbc\x30\x90\x73\x9f\xb1\xcd\x53\xa9\xd6\x44\x13\x9b\x6d\x4c\xae\xc7\x5b\xda\x7f\x25\x21\xfb\xfe\x67\x6a\xb4\x5b\x98\xcb\x31\x7a\xa7\xca\x79\xfc\x54\xa3\xd7\xc5\x78\x46\x6a\x6a\xa6\x4e\x43\x4e\x92\x34\x65\xa7\xf2\x11\xaa\x0c\x61\x68\x1b\xb8\x48\x6e\x90\x20\x6a\x25\x25\x0d\x3f\xda\xe6\xfb\x03\x29\x97\x21\xe9\x9e\x2a\x91\x49\x10\xd9\x17\x60\x08\x9b\x5d\x28\x1e\x13\x1e\x6c\x83\x6b\xc2\xde\x08\xf7\xe0\x2c\x48\xd3\x23\xc6\x47\xe9\x53\x6c\x00\xec\x10\x39\x20\x1c\x03\x62\x61\x8c\x7d\x47\xaa\x8e\x7b\x97\x15\xff\xc4\x39\x98\x7a\xe1\xd3\x11\x54\xa6\x19\x8c\x5a\xa1\x1c\x12\x8f\x40\x82\xf5\x56\xc9\x9b\xaf\x10\x3e\xca\xdc\x3b\x2f\x3b\x2e\xc5\xb4\x69\x62\x3b\xc0\x3a\x53\xca\xf3\x81\x4b\x16\x30\x0a\xed\xbd\xa5\x38\xd6\x76\xd1\xf6\x07\x10\x26\x39\xdb\x2a\x62\xc4\x46\x70\x7c\xe6\x46\x9b\xd8\x73\xa0\x46\x82\x25\xbe\x88\xb0\xae\xf5\xd4\x02\x04\x59\xb9\x4b\x32\xfe\x2b\x01\x33\xe9\x2e\x7b\xa5\x4d\xd2\xa5\x39\x7e\xd8\x5f\x96\x6a\xb3\x9e\xd0\x73\x0c\xca\x8e\x7d\xac\xb8\xa3\x36"}, +{{0x15,0x21,0xc6,0xdb,0xd6,0xf7,0x24,0xde,0x73,0xea,0xf7,0xb5,0x62,0x64,0xf0,0x10,0x35,0xc0,0x4e,0x01,0xc1,0xf3,0xeb,0x3c,0xbe,0x83,0xef,0xd2,0x6c,0x43,0x9a,0xda,},{0x2f,0x61,0xa2,0x6f,0xfb,0x68,0xba,0x4f,0x6e,0x14,0x15,0x29,0xdc,0x26,0x17,0xe8,0x53,0x1c,0x71,0x51,0x40,0x48,0x08,0x09,0x3b,0x4f,0xa7,0xfe,0xda,0xea,0x25,0x5d,},{0xa8,0x17,0xed,0x23,0xec,0x39,0x8a,0x12,0x86,0x01,0xc1,0x83,0x2d,0xc6,0xaf,0x76,0x43,0xbf,0x3a,0x5f,0x51,0x7b,0xcc,0x57,0x94,0x50,0xfd,0xb4,0x75,0x90,0x28,0xf4,0x96,0x61,0x64,0x12,0x5f,0x6e,0xbd,0x0d,0x6b,0xf8,0x6f,0xf2,0x98,0xa3,0x9c,0x76,0x6d,0x0c,0x21,0xfd,0xb0,0xcb,0xfd,0xf8,0x1c,0xd0,0xeb,0x1f,0x03,0xcd,0x8a,0x08,},"\x3e\x3c\x7c\x49\x07\x88\xe4\xb1\xd4\x2f\x5c\xbc\xae\x3a\x99\x30\xbf\x61\x7e\xbd\xff\x44\x7f\x7b\xe2\xac\x2b\xa7\xcd\x5b\xcf\xc0\x15\x76\x09\x63\xe6\xfe\x5b\x95\x6f\xb7\xcd\xb3\x5b\xd5\xa1\x7f\x54\x29\xca\x66\x4f\x43\x7f\x08\x75\x3a\x74\x1c\x2b\xc8\x69\x2b\x71\xa9\x11\x5c\x58\x2a\x25\xb2\xf7\x4d\x32\x98\x54\xd6\x0b\x78\x17\xc0\x79\xb3\x52\x3a\xaf\xf8\x79\x3c\x2f\x72\xff\xf8\xcd\x10\x59\x2c\x54\xe7\x38\xdf\x1d\x64\x52\xfb\x72\xda\x13\x1c\x67\x31\xea\x5c\x95\x3c\x62\xea\x17\x7a\xc1\xf4\x73\x5e\x51\x54\x47\x73\x87\x10\x9a\xfa\xe1\x5f\x3e\xd6\xee\xb0\x86\x06\xe2\x8c\x81\xd4\x38\x6f\x03\xb9\x37\x69\x24\xb6\xef\x8d\x22\x1e\xe2\x95\x47\xf8\x2a\x7e\xde\x48\xe1\xdc\x17\x72\x3e\x3d\x42\x17\x1e\xea\xf9\x6a\xc8\x4b\xed\xc2\xa0\x1d\xd8\x6f\x4d\x08\x57\x34\xfd\x69\xf9\x1b\x52\x63\xe4\x39\x08\x3f\xf0\x31\x85\x36\xad\xff\x41\x47\x30\x8e\x3a\xaf\xd1\xb5\x8b\xb7\x4f\x6f\xb0\x21\x4a\x46\xfd\xcd\x35\x24\xf1\x8d\xf5\xa7\x19\xce\x57\x31\x9e\x79\x1b\x4e\xa6\x06\xb4\x99\xbf\xa5\x7a\x60\xe7\x07\xf9\x4e\x18\xf1\xfe\xd2\x2f\x91\xbc\x79\xe6\x36\x4a\x84\x3f\x9c\xbf\x93\x82\x5c\x46\x5e\x9c\xae\x90\x72\xbc\x9d\x3e\xc4\x47\x1f\x21\xab\x2f\x7e\x99\xa6\x33\xf5\x87\xaa\xc3\xdb\x78\xae\x96\x66\xa8\x9a\x18\x00\x8d\xd6\x1d\x60\x21\x85\x54\x41\x1a\x65\x74\x0f\xfd\x1a\xe3\xad\xc0\x65\x95\xe3\xb7\x87\x64\x07\xb6"}, +{{0x17,0xe5,0xf0,0xa8,0xf3,0x47,0x51,0xba,0xbc,0x5c,0x72,0x3e,0xcf,0x33,0x93,0x06,0x99,0x2f,0x39,0xea,0x06,0x5a,0xc1,0x40,0xfc,0xbc,0x39,0x7d,0x2d,0xd3,0x2c,0x4b,},{0x4f,0x1e,0x23,0xcc,0x0f,0x2f,0x69,0xc8,0x8e,0xf9,0x16,0x2a,0xb5,0xf8,0xc5,0x9f,0xb3,0xb8,0xab,0x20,0x96,0xb7,0x7e,0x78,0x2c,0x63,0xc0,0x7c,0x8c,0x4f,0x2b,0x60,},{0xef,0xe2,0xcb,0x63,0xfe,0x7b,0x4f,0xc9,0x89,0x46,0xdc,0x82,0xfb,0x69,0x98,0xe7,0x41,0xed,0x9c,0xe6,0xb9,0xc1,0xa9,0x3b,0xb4,0x5b,0xc0,0xa7,0xd8,0x39,0x6d,0x74,0x05,0x28,0x2b,0x43,0xfe,0x36,0x3b,0xa5,0xb2,0x35,0x89,0xf8,0xe1,0xfa,0xe1,0x30,0xe1,0x57,0xce,0x88,0x8c,0xd7,0x2d,0x05,0x3d,0x0c,0xc1,0x9d,0x25,0x7a,0x43,0x00,},"\xc0\xfa\xd7\x90\x02\x40\x19\xbd\x6f\xc0\x8a\x7a\x92\xf5\xf2\xac\x35\xcf\x64\x32\xe2\xea\xa5\x3d\x48\x2f\x6e\x12\x04\x93\x53\x36\xcb\x3a\xe6\x5a\x63\xc2\x4d\x0e\xc6\x53\x9a\x10\xee\x18\x76\x0f\x2f\x52\x05\x37\x77\x4c\xde\xc6\xe9\x6b\x55\x53\x60\x11\xda\xa8\xf8\xbc\xb9\xcd\xaf\x6d\xf5\xb3\x46\x48\x44\x8a\xc7\xd7\xcb\x7c\x6b\xd8\x0d\x67\xfb\xf3\x30\xf8\x76\x52\x97\x76\x60\x46\xa9\x25\xab\x52\x41\x1d\x16\x04\xc3\xed\x6a\x85\x17\x30\x40\x12\x56\x58\xa3\x2c\xf4\xc8\x54\xef\x28\x13\xdf\x2b\xe6\xf3\x83\x0e\x5e\xee\x5a\x61\x63\xa8\x3c\xa8\x84\x9f\x61\x29\x91\xa3\x1e\x9f\x88\x02\x8e\x50\xbf\x85\x35\xe1\x17\x55\xfa\xd0\x29\xd9\x4c\xf2\x59\x59\xf6\x69\x5d\x09\xc1\xba\x43\x15\xd4\x0f\x7c\xf5\x1b\x3f\x81\x66\xd0\x2f\xab\xa7\x51\x1e\xcd\x8b\x1d\xde\xd5\xf1\x0c\xd6\x84\x34\x55\xcf\xf7\x07\xed\x22\x53\x96\xc6\x1d\x08\x20\xd2\x0a\xda\x70\xd0\xc3\x61\x9f\xf6\x79\x42\x20\x61\xc9\xf7\xc7\x6e\x97\xd5\xa3\x7a\xf6\x1f\xd6\x22\x12\xd2\xda\xfc\x64\x7e\xbb\xb9\x79\xe6\x1d\x90\x70\xec\x03\x60\x9a\x07\xf5\xfc\x57\xd1\x19\xae\x64\xb7\xa6\xef\x92\xa5\xaf\xae\x66\x0a\x30\xed\x48\xd7\x02\xcc\x31\x28\xc6\x33\xb4\xf1\x90\x60\xa0\x57\x81\x01\x72\x9e\xe9\x79\xf7\x90\xf4\x5b\xdb\xb5\xfe\x1a\x8a\x62\xf0\x1a\x61\xa3\x1d\x61\xaf\x07\x03\x04\x50\xfa\x04\x17\x32\x3e\x94\x07\xbc\x76\xe7\x31\x30\xe7\xc6\x9d\x62\xe6\xa7"}, +{{0x0c,0xd7,0xaa,0x7d,0x60,0x5e,0x44,0xd5,0xff,0xb9,0x79,0x66,0xb2,0xcb,0x93,0xc1,0x89,0xe4,0xc5,0xa8,0x5d,0xb8,0x7f,0xad,0x7a,0xb8,0xd6,0x24,0x63,0xc5,0x9b,0x59,},{0x48,0x89,0x85,0x5f,0xe4,0x11,0x6b,0x49,0x13,0x92,0x7f,0x47,0xf2,0x27,0x3b,0xf5,0x59,0xc3,0xb3,0x94,0xa9,0x83,0x63,0x1a,0x25,0xae,0x59,0x70,0x33,0x18,0x5e,0x46,},{0xbf,0x91,0x15,0xfd,0x3d,0x02,0x70,0x6e,0x39,0x8d,0x4b,0xf3,0xb0,0x2a,0x82,0x67,0x4f,0xf3,0x04,0x15,0x08,0xfd,0x39,0xd2,0x9f,0x86,0x7e,0x50,0x16,0x34,0xb9,0x26,0x1f,0x51,0x6a,0x79,0x4f,0x98,0x73,0x8d,0x7c,0x70,0x13,0xa3,0xf2,0xf8,0x58,0xff,0xdd,0x08,0x04,0x7f,0xb6,0xbf,0x3d,0xdd,0xfb,0x4b,0x4f,0x4c,0xbe,0xef,0x30,0x03,},"\x28\xa5\x5d\xda\x6c\xd0\x84\x4b\x65\x77\xc9\xd6\xda\x07\x3a\x4d\xc3\x5c\xbc\x98\xac\x15\x8a\xb5\x4c\xf8\x8f\xd2\x0c\xc8\x7e\x83\xc4\xbb\xa2\xd7\x4d\x82\xce\x0f\x48\x54\xec\x4d\xb5\x13\xde\x40\x04\x65\xaa\xa5\xee\xe7\x90\xbc\x84\xf1\x63\x37\x07\x2d\x3a\x91\xcd\xe4\x0d\x6e\x0d\xf1\xba\x0c\xc0\x64\x5f\x5d\x5c\xbb\xb6\x42\x38\x1d\x7b\x9e\x21\x1d\x25\x26\x7a\x8a\xcf\x77\xd1\xed\xb6\x9c\x3a\x63\x0f\x5b\x13\x3d\x24\xf0\x46\xa8\x1b\xf2\x2f\xf0\x3b\x31\xd8\x44\x7e\x12\xc3\xf7\xb7\x71\x14\xa7\x0c\xbd\x20\xbb\xd0\x8b\x0b\x38\x27\xa6\xbb\xcf\x90\x40\x9e\x34\x44\x47\xa7\xfb\xc5\x9b\xdd\x97\xd7\x29\x07\x1f\x8d\x71\xdc\xc3\x3e\x6e\xf2\xcb\xab\x1d\x41\x1e\xdf\x13\x73\x4d\xb1\xdd\x97\x03\x27\x6f\x5e\xb2\xd6\xaa\x2c\xb8\x95\x2d\xd6\x71\x2b\xfa\xe8\x09\xce\x08\xc3\xaa\x50\x2b\x81\x35\x71\x3f\xac\x0a\x9c\x25\xb1\xd4\x5b\x6a\x58\x31\xe0\x24\x21\xbb\xa6\x5b\x81\xa5\x96\xef\xa2\x4b\x05\x76\xbd\x1d\xc7\xfd\xfb\x49\xbe\x76\x28\x75\xe8\x1b\xd5\x40\x72\x2b\xc0\x61\x40\xb9\xaa\x2e\xf7\xb8\x4a\x80\x1e\x41\xde\xd6\x8d\x45\x46\xac\x48\x73\xd9\xe7\xce\xd6\x49\xb6\x4f\xad\xaf\x0b\x5c\x4b\x6e\xb8\xd0\x36\x31\x52\x33\xf4\x32\x6c\xa0\x1e\x03\x39\x30\x50\xcd\x02\x7c\x24\xf6\x73\x03\xfb\x84\x6b\xd2\xc6\xb3\xdb\xa0\x6b\xed\x0d\x59\xa3\x62\x89\xd2\x4b\xd6\x48\xf7\xdb\x0b\x3a\x81\x34\x66\x12\x59\x3e\x3d\xdd\x18\xc5\x57"}, +{{0x33,0x37,0x1d,0x9e,0x89,0x2f,0x98,0x75,0x05,0x2a,0xc8,0xe3,0x25,0xba,0x50,0x5e,0x74,0x77,0xc1,0xac,0xe2,0x4b,0xa7,0x82,0x26,0x43,0xd4,0x3d,0x0a,0xce,0xf3,0xde,},{0x35,0x92,0x9b,0xde,0xd2,0x7c,0x24,0x9c,0x87,0xd8,0xb8,0xd8,0x2f,0x59,0x26,0x0a,0x57,0x53,0x27,0xb5,0x46,0xc3,0xa1,0x67,0xc6,0x9f,0x59,0x92,0xd5,0xb8,0xe0,0x06,},{0x98,0x5c,0xa4,0x46,0xdd,0xc0,0x07,0x82,0x7c,0xc8,0xf2,0x85,0x2c,0xbd,0x81,0x15,0xef,0x8c,0x59,0x75,0xe9,0xd7,0xce,0x96,0xd7,0x4d,0xfe,0xd8,0x59,0xaa,0x14,0xa4,0xc1,0x52,0x54,0x00,0x6b,0xea,0x5e,0x08,0x35,0x9e,0xfe,0x26,0x25,0xd7,0x15,0xe0,0x89,0x7e,0xe5,0xa1,0x6f,0x15,0x12,0x03,0xbe,0x50,0x10,0x41,0x86,0x37,0xde,0x05,},"\x27\xa3\x2e\xfb\xa2\x82\x04\xbe\x59\xb7\xff\x5f\xe4\x88\xca\x15\x8a\x91\xd5\x98\x60\x91\xec\xc4\x45\x8b\x49\xe0\x90\xdd\x37\xcb\xfe\xde\x7c\x0f\x46\x18\x6f\xab\xcb\xdf\xf7\x8d\x28\x44\x15\x58\x08\xef\xff\xd8\x73\xed\x9c\x92\x61\x52\x6e\x04\xe4\xf7\x05\x0b\x8d\x7b\xd2\x67\xa0\xfe\x3d\x5a\x44\x93\x78\xd5\x4a\x4f\xeb\xbd\x2f\x26\x82\x43\x38\xe2\xaa\xaf\x35\xa3\x2f\xf0\xf6\x25\x04\xbd\xa5\xc2\xe4\x4a\xbc\x63\x15\x9f\x33\x6c\xf2\x5e\x6b\xb4\x0d\xdb\x7d\x88\x25\xdf\xf1\x8f\xd5\x1f\xc0\x19\x51\xea\xed\xcd\x33\x70\x70\x07\xe1\x20\x3c\xa5\x8b\x4f\x7d\x24\x2f\x81\x66\xa9\x07\xe0\x99\x93\x2c\x00\x1b\xfb\x1e\xc9\xa6\x1e\x0e\xf2\xda\x4e\x84\x46\xaf\x20\x82\x01\x31\x5d\x69\x68\x17\x10\xd4\x25\xd2\x40\x0c\x38\x7d\x7b\x9d\xf3\x21\xa4\xae\xc6\x02\xb9\xc6\x56\xc3\xe2\x31\x0b\xff\x87\x56\xd1\x8b\x80\x21\x34\xb1\x56\x04\xf4\xed\xc1\x11\x14\x9a\x98\x79\xe3\x12\x41\xdd\x34\xf7\x02\xf4\xc3\x49\x61\x7b\x13\x52\x97\x69\xa7\x72\xf5\xe5\x2a\x89\xc0\x98\xe0\xdc\xa5\x92\x06\x67\x89\x3a\x25\x00\x61\xb1\x79\x91\x62\x6e\xb9\x31\x92\x98\x68\x5b\xe4\x6b\x6a\x8b\x68\x42\x24\x44\xfa\x5a\x36\xbc\xf3\xa6\x87\xe2\xec\xcb\x93\x22\xc8\x7d\xc8\x01\x65\xda\x89\x89\x30\x85\x0b\x98\xfc\x86\x3c\xad\xa1\xaa\x99\xc6\xd6\x1c\x45\x1b\x9c\xcf\x48\x74\xc7\xf0\xe7\x5b\x0a\x0c\x60\x2f\x04\x48\x12\xc7\x17\x65\xad\xaf\x02\x02\x53\x95\xb0"}, +{{0xbe,0xed,0xb8,0x07,0x3d,0xf5,0x8f,0x8c,0x1b,0xff,0xbd,0xbd,0x77,0xec,0x7d,0xec,0xb2,0xc8,0x2a,0x9b,0xab,0xec,0xef,0xc0,0x33,0x15,0x07,0xbd,0xc2,0xc2,0xa7,0xe7,},{0xb2,0x7e,0x90,0x8b,0x80,0x5e,0x29,0x6f,0xc3,0x0d,0x2e,0x47,0x4b,0x06,0x0c,0xd5,0x0c,0x0f,0x6f,0x52,0x0b,0x36,0x71,0x71,0x21,0x83,0xbd,0x89,0xd4,0xe7,0x33,0xe9,},{0x8c,0x89,0x0c,0xcc,0xad,0xc7,0x76,0x0e,0x1e,0x82,0xe4,0x3c,0x44,0xb3,0xdc,0x0b,0x68,0x5a,0x48,0xb4,0x79,0xae,0x13,0xcc,0x0a,0x6b,0x05,0x57,0xd0,0xfb,0x1c,0xba,0xbb,0xa6,0x3d,0x2a,0x96,0x84,0x34,0x12,0xea,0x8d,0x36,0xc5,0x0a,0xcb,0xf5,0x2b,0x92,0xcf,0xb2,0xdc,0xe4,0x9d,0xc4,0x8a,0xf6,0xdd,0xcf,0x8e,0xe4,0x7a,0x86,0x08,},"\x35\xca\x57\xf0\xf9\x15\xe5\x20\x9d\x54\xea\x4b\x87\x1f\xfb\x58\x53\x54\xdf\x1b\x4a\x4a\x17\x96\xfb\xe4\xd6\x22\x7d\x3e\x1a\xba\x51\x71\xed\x03\x91\xa7\x9e\x83\xe2\x4d\x82\xfd\xaf\xd1\x5c\x17\xb2\x8b\xf6\xc9\x4d\x61\x8c\x74\xd6\x52\x64\xe5\x8f\xaa\xac\xd2\x90\x28\x72\xfd\xd0\xef\xa2\x2e\x8d\x2d\x7c\xe8\xe3\xb8\x19\x7f\x0c\x36\x15\xb0\xa3\x85\x23\x5f\xa9\xfd\x8e\x45\x64\xee\x6e\x6b\x16\x50\xb4\xcf\xb9\x4d\x87\x2c\x80\x5c\x32\xd4\xf3\xa1\x8f\x96\x64\x61\xd3\xad\xbb\x60\x5f\xa5\x25\x88\x4f\x8e\xb1\x97\x62\x73\x96\xba\x4d\x99\x5d\x78\xac\x02\x94\x8a\x0e\xaa\xbb\x58\x51\x9b\x9a\x8e\x2e\x79\x85\xcd\x1d\xe2\xc7\x1d\x89\x18\xd9\x6a\x01\x68\x66\x0c\xe1\x7c\xdd\xf3\x64\xe3\xec\x0d\x4b\xd9\x0f\x21\x04\x75\x1a\x19\x27\xee\x1d\x23\xf3\xe7\xa6\x98\x40\xed\x04\x0b\x00\xe5\xf6\xe4\x86\x6e\xc5\x88\x13\x14\x9c\xc3\x82\xae\xbf\x61\x62\x60\x8c\x79\x57\x4d\x55\x3f\x47\x23\x0e\x92\x4a\x0e\xf1\xeb\xf5\x5d\x8e\x1a\x52\xab\xb6\x2a\x2d\x7a\xc8\x60\x27\xc7\xc0\x3c\xc8\x3f\xa1\x94\x9d\xa2\x9e\x2f\x30\x37\xab\x98\x6f\xd2\xff\xfe\x65\x0e\x31\x49\xba\xba\xe5\xa5\x0b\x1e\xe9\x69\x6f\x3b\xab\xec\x72\xe2\x96\x97\xc8\x24\x22\x81\x4d\x27\x20\x85\x50\x0f\xd8\x37\xfe\x3c\x7a\x97\x3e\xf4\xc1\x69\xaf\x12\xdd\x7f\x02\x70\x06\x20\xbb\x04\x5b\xdb\xf8\x46\x23\xf3\x26\x35\x05\x70\xb3\xca\xdb\xc9\xae\xa4\x20\x0b\x28\x28\x7e\x17\xab"}, +{{0x91,0x84,0xef,0x61,0x88,0x16,0x83,0x25,0x92,0xbc,0x8e,0xb3,0x5f,0x4f,0xfd,0x4f,0xf9,0x8d,0xfb,0xf7,0x77,0x6c,0x90,0xf2,0xaa,0xd2,0x12,0xce,0x7e,0x03,0x35,0x1e,},{0x68,0x7b,0x77,0x26,0x01,0x0d,0x9b,0xde,0x2c,0x90,0xe5,0x73,0xcd,0x2a,0x2a,0x70,0x2f,0xf2,0x8c,0x4a,0x2a,0xf7,0x0a,0xfc,0x73,0x15,0xc9,0x4d,0x57,0x56,0x01,0xe5,},{0xb3,0xc2,0x4e,0x75,0x13,0x2c,0x56,0x34,0x75,0x42,0x2d,0x5e,0xa4,0x12,0xb5,0xc1,0xe8,0xe6,0xe5,0xea,0x1c,0x08,0xea,0xd1,0x39,0x3c,0x41,0x2d,0xa1,0x34,0xc9,0xa1,0x63,0x82,0x84,0xea,0x7e,0x2c,0xa0,0x32,0xfe,0x3d,0x3e,0x32,0xa9,0x06,0x6a,0x8c,0x88,0x39,0x90,0x3f,0x6e,0xf4,0x6e,0x96,0x6b,0xb5,0xe4,0x92,0xd8,0xc2,0xaa,0x00,},"\x72\x9e\xb7\xe5\x4a\x9d\x00\xc5\x86\x17\xaf\x18\xc3\x45\xb8\xdc\x6e\x5b\x4e\x0f\x57\xde\x2f\x3c\x02\xe5\x4a\x2e\xc8\xf1\x42\x5e\xc2\xe2\x40\x77\x5b\x5a\xb0\xc1\x0f\x84\xac\x8b\xaf\xda\x45\x84\xf7\xe2\x1c\x65\x5f\xae\xcd\x80\x30\xa9\x89\x06\xbd\x68\x39\x8f\x26\xb5\xd5\x8d\x92\xb6\xcf\x04\x5e\x9b\xd9\x74\x3c\x74\xc9\xa3\x42\xec\x61\xce\x57\xf3\x7b\x98\x1e\xac\x4d\x8b\xf0\x34\x60\x88\x66\xe9\x85\xbb\x68\x68\x6a\x68\xb4\xa2\xaf\x88\xb9\x92\xa2\xa6\xd2\xdc\x8c\xe8\x8b\xfb\x0a\x36\xcf\x28\xbb\xab\x70\x24\xab\xfa\x2b\xea\x53\x31\x3b\x66\xc9\x06\xf4\xf7\xcf\x66\x97\x0f\x54\x00\x95\xbd\x01\x04\xaa\x49\x24\xdd\x82\xe1\x54\x13\xc2\x26\x79\xf8\x47\xe4\x8c\xd0\xc7\xec\x1f\x67\x7e\x00\x5f\xec\x01\x77\xfb\xd5\xc5\x59\xfc\x39\xad\xd6\x13\x99\x1f\xba\xea\xe4\xd2\x4d\x39\xd3\x09\xef\x74\x64\x7f\x81\x92\xcc\x4c\x62\xd0\x64\x20\x28\xc7\x6a\x1b\x95\x1f\x6b\xc9\x63\x9d\xeb\x91\xec\xc0\x8b\xe6\x04\x3f\x21\x09\x70\x5a\x42\xc7\xea\xe7\x12\x64\x9d\x91\xd9\x6c\xcb\xbf\xb6\x3d\x8d\x0d\xd6\xdd\x11\x21\x60\xf6\x13\x61\xec\xdc\x67\x93\x92\x9c\xa9\xae\xf9\xab\x56\x94\x4a\x6f\xa4\xa7\xdf\x1e\x27\x9e\xaf\x58\xce\x83\x23\xa9\xcf\x62\xc9\x42\x79\xff\xf7\x44\x0f\xbc\x93\x6b\xaa\x61\x48\x9c\x99\x93\x30\xba\xdc\xb9\xfc\x0e\x18\x4b\xc5\x09\x3f\x33\x0c\xbb\x24\x2f\x71\xfb\x37\x87\x38\xfe\xa1\x05\x11\xdd\x43\x83\x64\xd7\xf7\x6b\xcc"}, +{{0x35,0x4e,0x13,0x15,0x2e,0xe1,0xfe,0x74,0x8a,0x12,0x52,0x20,0x4c,0x65,0x27,0xbd,0xc1,0xb1,0xeb,0x2e,0xb5,0x36,0x78,0x15,0x0e,0x63,0x59,0x92,0x47,0x08,0xd8,0x12,},{0xd4,0x5f,0xf6,0xc5,0xfb,0x83,0xe7,0xbb,0x96,0x69,0xaa,0x89,0x60,0xde,0xb7,0xdb,0xc6,0x65,0xc9,0x88,0x43,0x9b,0x6c,0x9e,0xf6,0x72,0xc6,0x81,0x1d,0xc8,0xbc,0xf6,},{0xde,0x2b,0x46,0xe6,0x5f,0x3d,0xec,0xef,0x34,0x33,0x2e,0x50,0x0f,0x2e,0x11,0x30,0x6f,0xbd,0xcf,0x1b,0xe8,0x5a,0x1c,0x1e,0xe6,0x8b,0xa3,0x04,0x5d,0xce,0xc2,0xc7,0xbe,0x60,0x8d,0x22,0x92,0x7d,0xa1,0xf4,0x4c,0x0e,0x20,0x83,0xae,0x62,0x2c,0xf3,0xc2,0x9d,0x89,0x38,0x87,0x99,0x4e,0xfc,0xfa,0x2c,0xa5,0x94,0xf5,0x05,0x1f,0x03,},"\x8e\x5f\xcc\xf6\x6b\x1b\xa6\x16\x9c\xb6\x85\x73\x3d\x9d\x0e\x01\x90\x36\x1c\x90\xbc\xab\x95\xc1\x63\x28\x5a\x97\xfe\x35\x6d\x2b\xdc\xde\x3c\x93\x80\x26\x88\x05\xa3\x84\xd0\x63\xda\x09\xcc\xd9\x96\x9c\xc3\xff\x74\x31\xe6\x0a\x8e\x9f\x86\x9c\xd6\x2f\xaa\x0e\x35\x61\x51\xb2\x80\xbc\x52\x6e\x57\x7c\x2c\x53\x8c\x9a\x72\x4d\xc4\x8b\xf8\x8b\x70\x32\x1d\x7e\x1e\xee\xdb\x3c\x4a\xf7\x06\x74\x8c\x94\x2e\x67\xbd\xab\xdb\x41\xbe\xc2\x97\x7b\x15\x23\x06\x9e\x31\xe2\x9b\x76\x30\x02\x88\xf8\x8a\x51\xb3\x84\xb8\x0c\xc2\x52\x6f\x16\x79\x34\x0d\xde\xc3\x88\x1f\x5c\xd2\x8b\x03\x78\xd9\xcd\x0a\x81\x2b\x68\xdd\x3f\x68\xf7\xa2\x3e\x1b\x54\xbe\xe7\x46\x6a\xc7\x65\xcf\x38\xdf\x04\xd6\x74\x41\xdf\xa4\x98\xc4\xbf\xfc\x52\x04\x5f\xa6\xd2\xdb\xcd\xbf\xa3\x3d\xfa\xa7\x76\x44\xff\xcc\xef\x0d\xec\xdb\x67\x90\xc7\x0a\x0d\x73\x4e\xc2\x87\xcc\x33\x8c\xb5\xa9\x09\xc0\x05\x51\x89\x30\x11\x69\xc4\xf7\x70\x2c\x05\xc0\x91\x1a\x27\xb1\x6e\xf9\xed\x93\x4f\xa6\xa0\xca\x7b\x13\xe4\x13\x52\x34\x22\x53\x56\x47\x96\x80\x30\xed\xc4\x0c\xd7\x3e\x7d\x6b\x34\x5b\x75\x81\xf4\x38\x31\x6d\x68\xe3\xcd\x29\x2b\x84\x6d\x3f\x4f\x7c\x48\x62\xbc\x7e\x6b\x3f\xb8\x9a\x27\xf6\xf6\x0c\xd7\xdb\x2e\x34\xec\x9a\xae\x10\x13\xfe\x37\xac\xff\x8a\xd8\x88\xcb\x9a\x59\x3e\xf5\xe6\x21\xea\xe5\x18\x6c\x58\xb3\x1d\xcf\xde\x22\x87\x0e\x33\x6d\x33\xf4\x40\xf6\xb8\xd4\x9a"}, +{{0x7f,0xf6,0x2d,0x4b,0x3c,0x4d,0x99,0xd3,0x42,0xd4,0xbb,0x40,0x1d,0x72,0x6b,0x21,0xe9,0x9f,0x4e,0xf5,0x92,0x14,0x9f,0xc3,0x11,0xb6,0x87,0x61,0xf5,0x56,0x7f,0xf6,},{0x7f,0xdf,0xdb,0x9e,0xca,0x29,0xd3,0xf0,0x1d,0x94,0x86,0xd7,0xe1,0x12,0xce,0x03,0xaa,0x37,0xb9,0x13,0x26,0xa4,0x28,0x3b,0x9c,0x03,0x99,0x9c,0x5e,0xda,0x09,0x9a,},{0x05,0x8f,0x79,0x92,0x7f,0xbf,0x61,0x78,0x72,0x48,0x15,0xc7,0xb1,0x1c,0x63,0xba,0xaa,0x90,0xbc,0xc1,0x5d,0x72,0x72,0xbe,0x08,0x2f,0x8a,0x91,0x41,0x86,0x1c,0x81,0x64,0x33,0x05,0x5f,0x6c,0xf6,0x49,0x14,0x24,0x85,0x3f,0x9e,0xc7,0x8b,0xb9,0x1a,0xce,0x91,0x3a,0x93,0x41,0x1b,0x4e,0x5e,0xd5,0x8b,0xc4,0xba,0x57,0x15,0xc6,0x0a,},"\x99\xc4\x4c\x79\x65\x72\xa4\x82\x3f\xc6\xc3\x80\x77\x30\x83\x91\x73\x77\x4c\x05\xdb\xfc\x14\x92\xed\x0d\x00\x50\x9a\x95\xa1\xde\x37\x27\x4b\x31\x35\xed\x04\x56\xa1\x71\x8e\x57\x65\x97\xdc\x13\xf2\xa2\xab\x37\xa4\x5c\x06\xcb\xb4\xa2\xd2\x2a\xfa\xd4\xd5\xf3\xd9\x0a\xb3\xd8\xda\x4d\xcd\xaa\x06\xd4\x4f\x22\x19\x08\x84\x01\xc5\xdc\xee\xe2\x60\x55\xc4\x78\x2f\x78\xd7\xd6\x3a\x38\x06\x08\xe1\xbe\xf8\x9e\xee\xf3\x38\xc2\xf0\x89\x7d\xa1\x06\xfa\xfc\xe2\xfb\x2e\xbc\x5d\xb6\x69\xc7\xc1\x72\xc9\xcf\xe7\x7d\x31\x09\xd2\x39\xfe\x5d\x00\x5c\x8e\xe7\x51\x51\x1b\x5a\x88\x31\x7c\x72\x9b\x0d\x8b\x70\xb5\x2f\x6b\xd3\xcd\xa2\xfe\x86\x5c\x77\xf3\x6e\x4f\x1b\x63\x5f\x33\x6e\x03\x6b\xd7\x18\xbe\xc9\x0e\xe7\x8a\x80\x28\x11\x51\x0c\x40\x58\xc1\xba\x36\x40\x17\x25\x3a\xa8\x42\x92\x2e\x1d\xd7\xd7\xa0\xf0\xfc\x9c\x69\xe4\x3f\xc4\xea\xef\xfa\xaf\x1a\xe5\xfa\x5d\x2d\x73\xb4\x30\x79\x61\x7b\xab\xa0\x30\x92\x3f\xe5\xb1\x3d\x2c\x1c\x4f\xe6\xfa\xc3\xf2\xdb\x74\xe2\x02\x0a\x73\x4b\x61\x21\xa0\x30\x2f\xce\x82\x0b\xa0\x58\x0c\xe6\x13\x53\x48\xfd\xf0\x63\x2e\x00\x08\xdf\x03\xee\x11\x21\x68\xf5\xcf\xa0\x03\x7a\x26\xa1\xf6\x9b\x1f\x13\x17\xed\xf2\xa3\xab\x36\x74\x55\xa7\x7e\x00\x69\x12\x15\xd7\xaa\x31\x33\xc2\x15\x9d\x3d\xa2\xb1\x34\xcf\x04\xf0\xde\xfb\xf0\x7a\x60\x64\x01\x1e\x64\xdd\x14\xd4\xf8\xf0\x64\x35\x66\x55\x42\x88\x04\xc2\x77\x1a"}, +{{0x6c,0xab,0xad,0xd0,0x3f,0x8a,0x2e,0x6e,0xba,0xb9,0x6a,0x74,0xf8,0x0e,0x18,0x16,0x4e,0x4d,0x1b,0x6b,0xaa,0x67,0x8f,0x5a,0x82,0xe2,0x56,0x04,0xaf,0x98,0x9a,0xaf,},{0x2a,0x4a,0x31,0x79,0x56,0x41,0x94,0xe0,0x01,0x00,0xc1,0x8b,0xc3,0x53,0x51,0xd8,0xb1,0x35,0xbb,0xae,0x5b,0x32,0xb2,0x8f,0xce,0x1d,0x7b,0x67,0x66,0xca,0x4b,0x32,},{0x4e,0x65,0xc6,0xc1,0xd4,0x93,0x04,0x5e,0x8a,0x92,0x50,0xe3,0x97,0xc1,0xd1,0xd3,0x0f,0xfe,0xd2,0x4d,0xb6,0x6a,0x89,0x61,0xaa,0x45,0x8f,0x8f,0x0f,0xcb,0x76,0x0c,0x39,0xfe,0x86,0x57,0xd7,0xab,0x8f,0x84,0x00,0x0b,0x96,0xd5,0x19,0x71,0x7c,0xff,0x71,0xf9,0x26,0x52,0x2c,0x1e,0xfe,0xc7,0xf8,0xb2,0x62,0x4e,0xae,0x55,0xf6,0x0c,},"\x27\x9f\x78\xcf\x3b\x9c\xcf\xc6\xe1\xb0\x1e\x1a\x82\xf5\x0e\xd1\x72\xe9\xa8\xe1\xe7\x02\xbb\x15\x66\x1d\xd7\xdc\x3a\x45\x6f\xf7\xa7\xa7\xfd\xfb\x08\x1d\xb3\x86\x70\x79\x63\x0c\x7f\x70\xfd\x75\x32\x92\xec\x60\xec\xbf\x50\x63\x2e\x9a\xa4\x5b\x99\x65\x05\xc6\x6e\x6d\xc3\xc6\xae\x89\x2e\x21\xb6\xa8\x70\x5e\x4b\xba\xe8\xf1\x6a\x33\x78\x55\x4b\x31\xfd\xb0\x13\x9d\xcd\x15\xc9\x6a\x8a\x7e\x4b\x88\x75\x6a\x86\xd1\x8d\xb5\xdc\x74\xfd\x76\x91\x19\x7d\xd8\x8e\x2c\x7d\x5d\xf5\x2b\x04\x93\x44\xcd\xc4\x77\xc9\xcd\x7e\x89\xed\xa9\x9c\xcf\xb1\xd0\x08\x14\xd0\x15\x2b\x96\x54\xdf\x32\x79\x37\x2c\xa5\xf1\x8b\x1c\x94\x6f\x28\x94\xa7\x6b\x07\x9d\xdb\x1c\x3c\xd6\x1f\xbb\x96\x9a\xee\xc9\x19\x3a\x6b\x88\xfb\x7d\x13\x6c\x07\xf9\x82\x1e\x5c\x10\x74\xb4\xe9\x3b\xca\xf6\xfa\x14\xd0\xd1\xd7\xe1\x70\x75\x89\xd7\x7e\xc1\x33\x72\x06\xe5\x3a\x1f\x06\xcc\x26\x67\x2f\xf9\x5c\x13\xd5\xff\x44\x47\x66\x93\x1b\xa3\x0a\x0a\xfd\xcd\xad\xd2\x09\x8e\x9c\x41\xfd\x87\xa3\xf2\x3c\xd1\x6d\xbb\x0e\xfb\xf8\x09\x2c\xe3\x3e\x32\x7f\x42\x61\x09\x90\xe1\xce\xe6\xcb\x8e\x54\x95\x1a\xa0\x81\xe6\x97\x65\xae\x40\x09\xae\xed\x75\x8e\x76\x8d\xe5\x0c\x23\xd9\xa2\x2b\x4a\x06\xdc\x4d\x19\xfc\x8c\xbd\x0c\xde\xf4\xc9\x83\x46\x17\x55\xd0\xa3\xb5\xd6\xa9\xc1\x22\x53\xe0\x95\x68\x33\x9f\xf7\xe5\xf7\x8c\x5f\xdf\x7e\xc8\x9f\x91\x86\xa6\x21\xa8\xc0\xee\xd1\x1b\x67\x02\x2e"}, +{{0x0f,0xa0,0xc3,0x2c,0x3a,0xe3,0x4b,0xe5,0x1b,0x92,0xf9,0x19,0x45,0x40,0x59,0x81,0xa8,0xe2,0x02,0x48,0x85,0x58,0xa8,0xe2,0x20,0xc2,0x88,0xc7,0xd6,0xa5,0x53,0x2d,},{0xd6,0xae,0xe6,0x2b,0xd9,0x1f,0xc9,0x45,0x36,0x35,0xff,0xcc,0x02,0xb2,0xf3,0x8d,0xca,0xb1,0x32,0x85,0x14,0x03,0x80,0x58,0x0c,0xcd,0xff,0x08,0x65,0xdf,0x04,0x92,},{0x7e,0x9a,0xb8,0x5e,0xe9,0x4f,0xe4,0xb3,0x5d,0xcb,0x54,0x53,0x29,0xa0,0xef,0x25,0x92,0x3d,0xe5,0xc9,0xdc,0x23,0xe7,0xdf,0x1a,0x7e,0x77,0xab,0x0d,0xcf,0xb8,0x9e,0x03,0xf4,0xe7,0x85,0xca,0x64,0x29,0xcb,0x2b,0x0d,0xf5,0x0d,0xa6,0x23,0x0f,0x73,0x3f,0x00,0xf3,0x3a,0x45,0xc4,0xe5,0x76,0xcd,0x40,0xbd,0xb8,0x4f,0x1a,0xe0,0x01,},"\x53\xf4\x4b\xe0\xe5\x99\x7f\xf0\x72\x64\xcb\x64\xba\x13\x59\xe2\x80\x1d\xef\x87\x55\xe6\x4a\x23\x62\xbd\xda\xf5\x97\xe6\x72\xd0\x21\xd3\x4f\xfa\xce\x6d\x97\xe0\xf2\xb1\xf6\xae\x62\x5f\xd3\x3d\x3c\x4f\x6e\x9f\xf7\xd0\xc7\x3f\x1d\xa8\xde\xfb\x23\xf3\x24\x97\x5e\x92\x1b\xb2\x47\x32\x58\x17\x7a\x16\x61\x25\x67\xed\xf7\xd5\x76\x0f\x3f\x3e\x3a\x6d\x26\xaa\xab\xc5\xfd\xe4\xe2\x04\x3f\x73\xfa\x70\xf1\x28\x02\x09\x33\xb1\xba\x3b\x6b\xd6\x94\x98\xe9\x50\x3e\xa6\x70\xf1\xed\x88\x0d\x36\x51\xf2\xe4\xc5\x9e\x79\xca\xbc\x86\xe9\xb7\x03\x39\x42\x94\x11\x2d\x5d\x8e\x21\x3c\x31\x74\x23\xb5\x25\xa6\xdf\x70\x10\x6a\x9d\x65\x8a\x26\x20\x28\xb5\xf4\x51\x00\xcb\x77\xd1\x15\x0d\x8f\xe4\x61\xee\xd4\x34\xf2\x41\x01\x5f\x32\x76\xad\x7b\x09\xa2\x91\xb4\xa7\xf3\x5e\x3c\x30\x05\x1c\xbf\x13\xb1\xd4\xa7\xfa\x0c\x81\xa5\x0f\x93\x9e\x7c\x49\x67\x3a\xfd\xc8\x78\x83\xc9\xe3\xe6\x1f\x5a\x1d\xf0\x37\x55\x47\x0f\xda\x74\xbf\x23\xea\x88\x67\x6b\x25\x8a\x97\xa2\x80\xd5\xf9\x0b\x52\xb7\x14\xb5\x96\x03\x5b\xae\x08\xc8\xd0\xfe\x6d\x94\xf8\x94\x95\x59\xb1\xf2\x7d\x71\x16\xcf\x59\xdd\x3c\xfb\xf1\x82\x02\xa0\x9c\x13\xf5\xc4\xfb\xc8\xd9\x72\x25\x49\x28\x87\xd3\x28\x70\xc2\x29\x7e\x34\xde\xbd\x98\x76\xd6\xd0\x1a\xc2\x7a\x16\xb0\x88\xb0\x79\x07\x9f\x2b\x20\xfe\xb0\x25\x37\xcd\xa3\x14\xc4\x3c\xb2\xdc\xa3\x71\xb9\xdf\x37\xed\x11\xec\x97\xe1\xa7\xa6\x99\x3a"}, +{{0x7b,0x06,0xf8,0x80,0x26,0xfa,0x86,0xf3,0x9f,0xce,0x24,0x26,0xf6,0x7c,0xc5,0x99,0x6b,0xed,0xd0,0xcf,0xc4,0xb5,0xeb,0xb1,0xb5,0xe3,0xed,0xbb,0x47,0xe0,0x80,0xaa,},{0x3f,0x14,0x69,0xee,0x6a,0x2e,0x78,0x67,0xe2,0xe9,0x01,0x2d,0x40,0x2c,0xf5,0xa4,0x86,0x14,0x97,0xc0,0x1d,0xf8,0x79,0xa1,0xde,0xb1,0xc5,0x39,0x83,0x0b,0x58,0xde,},{0x42,0xf1,0x33,0xe3,0x4e,0x3e,0xb7,0x03,0x2a,0x13,0x3e,0xd7,0x81,0x53,0x7e,0xc6,0x2e,0x44,0xa5,0xce,0x83,0x81,0xe5,0xe0,0xbf,0x9e,0x13,0xa9,0x14,0xa4,0xb2,0xc7,0x57,0x81,0x1d,0x6d,0x3b,0x1e,0x86,0x67,0x24,0x24,0xea,0x42,0x30,0xd1,0x0f,0x7c,0x61,0x0a,0xbb,0x70,0x69,0xe6,0x1e,0x31,0x9b,0x40,0x66,0xa2,0xbd,0x7b,0xc9,0x00,},"\x71\x17\x5d\x4e\x21\x72\x12\x97\xd9\x17\x6d\x81\x7f\x4e\x78\x5d\x96\x00\xd9\x23\xf9\x87\xfe\x0b\x26\xfd\x79\xd3\x3a\x5e\xa5\xd1\xe8\x18\xb7\x1f\x0f\x92\xb8\xc7\x3a\xfd\xda\xbd\xcc\x27\xf6\xd1\x6e\x26\xaa\xfa\x87\x4c\xfd\x77\xa0\x0e\x06\xc3\x6b\x04\x14\x87\x58\x2b\xb9\x33\x76\x0f\x88\xb4\x19\x12\x73\x45\x77\x6e\xa4\x18\xf8\x35\x22\x25\x4f\xed\x33\x81\x9b\xc5\xc9\x5f\x8f\x84\x04\xcc\x14\x4e\xbf\x14\x86\xc8\x85\x15\x40\x9d\x34\x33\xaa\xf5\x19\xd9\x92\x0f\x52\x56\xe6\x29\x41\x9e\x9a\x95\x58\x0a\x35\xb0\x69\xb8\xd2\x55\x33\xdf\xcb\xc9\x8a\xd3\x64\x04\xa9\x51\x80\x8e\x01\x37\x8c\x03\x26\x63\x26\xd1\x20\x04\x69\x75\xfd\xe0\x7d\xae\xf3\x26\x6c\xaa\xcd\x82\x1c\x14\x03\x49\x9d\x7f\xdf\x17\xc0\x33\xc8\xd8\xc3\xf2\x8f\x16\x2b\x5f\x09\xdf\xda\xca\x06\x28\x5f\x00\xc6\xcb\x98\x6d\xfd\xf5\x15\x1a\xa6\x63\x96\x08\xb5\xb1\x3e\x78\xd6\x5a\x43\x68\x58\x5b\x16\x13\x87\x54\xfb\xd1\x13\x83\x5a\x68\x6c\xd0\x66\xc2\xb8\x9b\xb0\x95\x3c\x24\xd5\x0e\x77\xbf\x0f\xc4\x57\xc1\xe0\xfc\xf5\xd4\x4d\xa8\xdb\x9a\x88\xf0\x62\xbe\x3b\x68\x8d\x5c\xdc\xff\x1d\x1c\x00\xe8\x1e\xc9\xd4\x13\x88\x22\x95\xb3\x41\xfe\xe8\xfa\x42\x7d\xc1\x09\xad\xeb\x5f\x28\x4e\xec\x20\x2f\x1b\xef\x11\x5b\xf9\x6b\x17\x82\xd3\xcc\xde\xb6\x82\xb6\x9b\xf9\x2d\x17\x0c\x00\x7d\x5d\xf8\x0e\x1e\xd9\x62\xf6\x77\xdc\x24\xa1\x45\xa1\xe4\xe8\x29\xe8\xde\xc0\x10\x4e\x5f\x78\x36\x59\x44"}, +{{0xc3,0xf5,0xe1,0x49,0x96,0x8a,0x24,0xf4,0xde,0x91,0x19,0x53,0x19,0x75,0xf4,0x43,0x01,0x5c,0xcc,0xa3,0x05,0xd7,0x11,0x9e,0xd4,0x74,0x9e,0x8b,0xf6,0xd9,0x4f,0xc7,},{0x39,0xaa,0xcc,0xdb,0x94,0x8a,0x40,0x38,0x53,0x8a,0x45,0x88,0x32,0x2f,0x80,0x6b,0xb1,0x29,0xb5,0x87,0x6c,0x4b,0xec,0x51,0x27,0x1a,0xfe,0x4f,0x49,0x69,0x00,0x45,},{0x5f,0xa2,0xb5,0x31,0x67,0x7b,0x00,0xb8,0x5b,0x0a,0x31,0x3c,0xbd,0x47,0x9f,0x55,0xf4,0xab,0x3e,0xc5,0xcf,0xce,0x5e,0x45,0x4d,0x2b,0x74,0x17,0x6c,0xcc,0x33,0x99,0xc8,0x99,0xf9,0xd6,0xb5,0x1e,0xd4,0xc1,0xe7,0x61,0x85,0xac,0x9f,0xe7,0x30,0xc4,0xb4,0x01,0x40,0x44,0xf7,0x04,0x11,0x85,0xbc,0x3c,0x85,0x72,0x2e,0xb2,0xea,0x02,},"\xc4\x63\x70\xe3\x7f\x2e\x0c\xad\xcf\x93\x40\x2f\x1f\x0c\xb0\x48\xf5\x28\x81\xba\x75\x0b\x7a\x43\xf5\x6a\xb1\x1c\xe3\x48\x73\x2f\xb5\x7e\x7f\x9a\xaf\x8d\xfc\xbe\x45\x5e\x14\xe9\x83\xc2\x48\xd0\x26\xa2\x7e\x7f\x14\x8d\x5d\xb5\xa5\x3f\x94\x63\x57\x02\xb8\x95\x12\x77\x71\x04\x7a\x87\x6d\x14\x10\x73\x86\xc5\xe0\xff\x89\x33\x34\x5b\xbd\x7a\x93\x6d\x99\x0d\x33\xef\xa2\x8c\x2e\xc4\xe4\x86\x4f\xfd\x2f\xf5\x76\xf7\xc8\x8f\x95\x4c\xfc\x1c\x45\x9e\x88\x3b\xb7\x12\xda\xe3\xcd\xf6\x63\x20\x66\xf1\xf4\xd1\x3a\x50\x96\x15\xb3\x36\x0c\xad\xc5\xa3\x07\xf2\x3e\x52\xa5\x1b\x40\xa6\xfe\xeb\xe0\xb1\x8d\x0e\x9e\xe4\xe3\x48\xf3\x3c\xd8\x1a\x8d\xef\x22\x2f\x6a\x59\xb1\x28\x61\xd3\x35\xbd\x9a\xf8\x5c\xc0\x04\xbe\x46\xf1\xd3\xa4\x24\xf4\x87\x0a\xe9\xdc\x58\x7e\x5a\x4a\xde\x13\x6b\x93\x70\x64\x93\x48\xc3\x3a\xc3\xbf\x1f\xeb\xee\xbf\xfe\xa3\x70\x85\xed\x59\xca\xc9\xd9\xe6\x96\x47\x0b\x23\x46\x09\xe9\xa1\x0a\x9d\x43\x1f\xf9\x1e\x69\xcb\x51\x35\xfd\x11\x7f\xf5\x8a\x36\x53\x97\x44\xeb\xe7\x0c\xea\x69\x73\xc0\x0c\x7a\x4d\x57\xb6\x2f\x4a\x71\x36\xd7\x31\xb8\xe4\x6f\xf1\x8e\xc0\xed\x69\x07\x00\x31\x90\x50\x75\xd8\x54\x1d\x56\x8c\xfc\xe6\xee\xb7\x62\x42\xb7\x81\x9a\x7b\x6a\x93\x55\x21\x11\xbb\x88\xf1\x65\x52\x7c\xfa\x69\x66\xd3\x9f\xcb\xe0\xa7\xde\xa0\x08\xe3\x9c\x7a\x3e\x57\x7a\xb3\x07\xcd\x1d\x0e\xa3\x26\x83\x3d\x52\x65\x4e\x17\x29\x55\xf3\xfc\xd4"}, +{{0x42,0x30,0x5c,0x93,0x02,0xf4,0x5e,0xa6,0xf8,0x7e,0x26,0xe2,0x20,0x8f,0xd9,0x4b,0x3c,0x4a,0xd0,0x37,0xb1,0xb6,0xc8,0x3c,0xf6,0x67,0x7a,0xa1,0x09,0x6a,0x01,0x3c,},{0x3b,0x97,0xb1,0xf1,0x1c,0xe4,0x5b,0xa4,0x6f,0xfb,0xb2,0x5b,0x76,0xbf,0xc5,0xad,0x7b,0x77,0xf9,0x0c,0xc6,0x9e,0xd7,0x61,0x15,0xde,0xa4,0x02,0x94,0x69,0xd5,0x87,},{0x18,0xd0,0x5e,0x5d,0x01,0x66,0x8e,0x83,0xf4,0x0f,0xa3,0xbb,0xee,0x28,0xb3,0x88,0xac,0xf3,0x18,0xd1,0xb0,0xb5,0xad,0x66,0x8c,0x67,0x2f,0x34,0x5c,0x8e,0xda,0x14,0xc2,0xf8,0x84,0xcd,0x2a,0x90,0x39,0x45,0x9c,0xe0,0x81,0x0b,0xc5,0xb5,0x80,0xfe,0x70,0xd3,0x96,0x4a,0x43,0xed,0xb4,0x9e,0x73,0xa6,0xff,0x91,0x4b,0xbf,0x04,0x0c,},"\xd1\x10\x82\x8d\x44\x91\x98\xd6\x75\xe7\x4e\x8e\x39\x43\x9f\xd1\x5e\x75\xbf\x2c\xc1\xf4\x30\xab\xfb\x24\x58\x36\x88\x5b\xaf\xc4\x20\xf7\x54\xb8\x9d\x2f\xbb\xf6\xdd\x34\x90\x79\x2e\x7a\x4f\x76\x60\x73\xcf\xe3\xb3\x02\xd0\x89\x83\x1a\xce\x86\x9e\x27\x30\xfd\xe4\x5c\x21\x21\xec\x3e\xf2\x17\xaa\x9c\x43\xfa\x7c\xc7\xe9\xed\x0a\x01\xad\x9f\x1d\x2f\xc3\x61\x36\x38\xca\x9f\xc1\x93\xc9\x8b\x37\x45\x5b\xf5\xdb\xf8\xf3\x8b\x64\x70\x8d\xfd\xca\x6c\x21\xf0\x97\x5f\x10\x17\xc5\xda\x5f\x64\x34\xbd\xa9\xf0\x33\xce\xc2\xa6\x31\xab\x50\x31\x8e\x01\x7b\x17\x0b\x24\x0b\xf0\x1e\xb8\xb3\x6c\x7e\x1c\xb5\x9e\x77\x36\xac\x34\x44\x42\x08\x13\x2a\x8f\x59\xe4\xf3\x13\xd6\x5d\x84\x9c\x6a\x4f\xdf\x13\xe2\x0e\xca\xee\x38\x23\xe5\x89\xa1\x71\xb3\x9b\x24\x89\x49\x7b\x06\xe6\xff\x58\xc2\xc9\xf1\xdc\x5d\x3a\xa3\xbd\x10\xe6\x44\x3e\x22\xd4\x2d\x07\xb7\x83\xf7\x9f\xd4\x3a\x46\xe1\xcd\xe3\x14\xb6\x63\xa9\x5f\x72\x46\xde\xa1\x31\xfc\xd4\x6d\x1d\xc3\x33\xc5\x45\x4f\x86\xb2\xc4\xe2\xe4\x24\xde\xa4\x05\xcc\x22\x30\xd4\xdc\xd3\x9a\x2e\xab\x2f\x92\x84\x5c\xf6\xa7\x99\x41\x92\x06\x3f\x12\x02\x74\x9e\xf5\x2d\xcb\x96\xf2\xb7\x9e\xd6\xa9\x81\x18\xca\x0b\x99\xba\x22\x85\x49\x08\x60\xeb\x4c\x61\xab\x78\xb9\xdd\xc6\xac\xc7\xad\x88\x3f\xa5\xe9\x6f\x9d\x02\x91\x71\x22\x3a\xbf\x75\x73\xe3\x62\x30\xe0\xa8\x1f\x6c\x13\x11\x15\x14\x73\xee\x26\x4f\x4b\x84\x2e\x92\x3d\xcb\x3b"}, +{{0xc5,0x7a,0x43,0xdc,0xd7,0xba,0xb8,0x51,0x60,0x09,0x54,0x69,0x18,0xd7,0x1a,0xd4,0x59,0xb7,0x34,0x5e,0xfd,0xca,0x8d,0x4f,0x19,0x92,0x98,0x75,0xc8,0x39,0xd7,0x22,},{0x20,0x83,0xb4,0x44,0x23,0x6b,0x9a,0xb3,0x1d,0x4e,0x00,0xc8,0x9d,0x55,0xc6,0x26,0x0f,0xee,0x71,0xac,0x1a,0x47,0xc4,0xb5,0xba,0x22,0x74,0x04,0xd3,0x82,0xb8,0x2d,},{0x1e,0xde,0xf9,0xbc,0x03,0x69,0x71,0xf1,0xfa,0x88,0xed,0xf4,0x53,0x93,0xc8,0x02,0xe6,0xc1,0xa1,0x63,0x1c,0x8a,0x06,0x87,0x1a,0x09,0xa3,0x20,0x82,0x1d,0xce,0x40,0xbe,0xca,0x97,0xe5,0x3a,0x03,0x61,0xa9,0x55,0xa4,0xc6,0xd6,0x0b,0x8c,0xa8,0xe4,0x00,0xc8,0x13,0x40,0x91,0x1c,0xcb,0x4f,0x56,0x28,0x40,0x41,0xcd,0xbb,0x18,0x04,},"\xa4\xf6\xd9\xc2\x81\xcf\x81\xa2\x8a\x0b\x9e\x77\x49\x9a\xa2\x4b\xde\x96\xcc\x12\x64\x37\x44\x91\xc0\x08\x29\x4e\xe0\xaf\x6f\x6e\x4b\xbb\x68\x63\x96\xf5\x90\x68\xd3\x58\xe3\x0f\xe9\x99\x2d\xb0\xc6\xf1\x66\x80\xa1\xc7\x1e\x27\xa4\xa9\x07\xac\x60\x7d\x39\xbd\xc3\x25\x8c\x79\x56\x48\x2f\xb3\x79\x96\xf4\xbe\xb3\xe5\x05\x1b\x81\x48\x01\x9a\x1c\x25\x6e\x2e\xe9\x99\xeb\xc8\xce\x64\xc5\x4e\x07\xfe\xdb\x4f\xbd\x89\x53\xeb\xd9\x3b\x7d\x69\xce\x5a\x00\x82\xed\xd6\x20\x9d\x12\xd3\x61\x9b\x4f\xd2\xea\xe9\x16\x46\x1f\x72\xa4\xce\x72\x71\x57\x25\x1a\x19\x20\x9b\xbf\xf9\xfb\xdb\xd2\x89\x43\x6f\x3f\xca\xcc\x6b\x4e\x13\x18\x52\x1a\x47\x83\x9c\xba\x4b\x14\xf7\xd7\xa2\x1e\x7b\x5d\x6b\x6a\x75\x3d\x58\x04\xaf\xcd\x2b\x1e\xb7\x77\x9b\x92\xab\xab\x8a\xfa\x8a\xa4\xfa\x51\xca\xec\x0b\x85\xdc\xd0\xfc\x2a\x06\x76\x03\x6d\x3f\x56\x63\x0a\x83\x1f\xfe\xb5\x02\x86\x1d\xd8\x91\x61\xc7\x08\xa9\xc0\x06\xc7\x3c\x93\x0c\xe5\xb9\x47\x56\x42\x6f\xf1\x8a\xa1\x12\xfb\x4e\xb9\xa6\x85\x00\xb4\x8d\x4e\xed\xbd\x41\x67\xb6\xff\xd0\xa1\x1d\x49\x44\x3a\x17\x3c\xe9\xd9\x49\x43\x67\x48\xfc\x06\x34\xf0\x6b\xb0\x8b\x8f\x34\x23\xf4\x46\x3d\xba\x7b\x4d\x19\x9b\x64\xdf\x57\x81\x17\xf0\xa2\x64\x5f\x0b\x2a\x1e\x2a\xda\x27\xd2\x86\xf7\x67\x33\xf2\x5b\x82\xed\x1d\x48\xa5\xc3\x89\x8d\x4a\xd6\x21\xe5\x0e\xd9\x06\x0d\xaa\xd4\x0a\x39\x53\x2e\x4d\x1b\xf1\x62\xce\x36\x80\x4d\x5d\x4e\x2d"}, +{{0x2d,0xdd,0xb6,0xb8,0xfd,0x04,0xfa,0x90,0xec,0xe1,0xa7,0x09,0xf8,0x41,0x8f,0x2e,0x5d,0x0c,0x9c,0x43,0xaf,0xe7,0xcf,0xce,0x19,0xe6,0xad,0x15,0xa7,0x34,0x76,0xf7,},{0x80,0x59,0xde,0x6a,0x7c,0x47,0x76,0x48,0x9e,0xcc,0x2e,0x7d,0x70,0x7f,0xfc,0xe3,0x02,0x85,0xbf,0x30,0xa2,0x3f,0x78,0xd7,0x2d,0xb4,0x9c,0xfd,0x6e,0xd0,0xd4,0x92,},{0xc6,0x34,0xea,0x7b,0xf7,0x2e,0x89,0x5a,0x2e,0x79,0x6e,0x28,0x34,0x20,0x14,0x15,0xb8,0xb4,0x5e,0x05,0xe0,0x45,0x55,0x92,0x84,0xeb,0x90,0x52,0xc0,0xe8,0x4f,0x62,0xa5,0xa9,0xf0,0xc9,0x76,0x4f,0x75,0x76,0x78,0x8c,0x72,0x28,0xb1,0x9e,0xf5,0x17,0xc1,0x95,0x49,0x73,0x25,0xa4,0x8a,0x93,0x44,0xb1,0x47,0xc1,0x2f,0xd7,0x55,0x09,},"\x47\x4b\xaa\x59\x0a\x4c\xd7\x2d\x54\x24\xe5\x1d\x82\x57\xb3\xd4\x43\x25\xbc\x4c\x50\x63\xa0\x03\x3c\x86\xeb\xbe\x99\xed\x72\x12\x18\x4c\x19\x94\x4d\x08\x2a\x11\x53\x79\xdd\x4c\xec\xe9\x73\xfa\xa0\xbc\xa6\x48\x5b\xd2\x5f\x37\x44\xa7\x19\xe7\x0a\xa0\x29\x1e\x1b\x5a\x96\xe6\x37\xc1\x40\x61\x6a\x98\x26\x33\x57\xc7\x6b\x6e\xb0\x08\x3f\xe5\x14\x14\xe3\x86\x87\x0d\x0f\xdc\x7d\xd9\xab\xe4\xff\x6f\xb5\xbb\xf1\xe7\xb1\x5d\xac\x3e\x08\xe2\x61\x5f\x65\x5c\x31\x04\xce\xb3\x2a\x4c\xc2\xc9\xe9\xc4\x3c\xf2\x82\xd3\x46\xac\x25\x3c\xcc\x46\xb6\x35\xae\x04\x09\x73\xb4\x97\x35\x72\x0f\xfb\x89\x04\x69\xa5\x67\xc5\x82\x4e\x0c\x00\xd7\xcc\xd5\x50\x9a\x71\x80\x92\xa9\x06\x46\x1c\x4d\x61\x63\xea\xf4\x22\x41\x8f\x5f\xc6\xe0\x09\xfc\x3f\x52\x9a\xc6\x1a\x2f\x89\xbb\x8e\x0e\xd4\x5d\x94\x0c\x4c\x23\x31\xff\x8d\x8e\x1d\x6d\x58\xd4\x17\xd8\xfc\x26\x56\xa0\x2e\x87\x01\xae\xe7\x5a\xed\x91\x87\x24\xee\xbe\x4a\x2c\xf4\x74\x4c\x5c\x40\x1e\x21\x70\x23\xdf\x68\xa6\xf6\xa0\x22\x8b\xd0\x5a\x67\x9a\x69\x7d\x8d\xe7\x03\x6b\x9e\xd2\x69\x09\x0d\x3c\x65\x48\x6a\xfb\x91\xe2\x79\x54\xeb\x15\xb9\x64\x66\x5e\xde\x7a\xd0\x08\xf1\x2f\xb3\xa9\xd0\xe6\x9c\x13\xb4\x25\x4f\x43\x81\x9e\x08\x18\xa4\x19\x5f\x68\xb8\xa3\x8a\xe8\x1f\x3f\xcb\x18\x79\xc9\x5a\xb4\xcd\x0f\xfc\x38\xe3\x81\x08\x92\x60\xcc\xa9\x67\xac\xe5\xa0\x85\xb4\x57\xab\x5e\xb3\x63\x85\x21\x01\x37\x75\x70\xf9\xac\x9e\x38"}, +{{0x55,0x47,0xf1,0x00,0x4b,0xae,0xdf,0xce,0x5c,0xfc,0x08,0x50,0xb0,0x53,0x02,0x37,0x4a,0xad,0x24,0xf6,0x16,0x39,0x94,0xec,0xd7,0x51,0xdf,0x3a,0xf3,0xc1,0x06,0x20,},{0x7c,0xe6,0x20,0x78,0x73,0x85,0xee,0x19,0x51,0xac,0x49,0xa7,0x73,0x52,0xee,0x0d,0x6f,0x8c,0x5c,0xd4,0x7d,0xf7,0x4e,0x9e,0x32,0x16,0xa6,0x32,0x4f,0xc7,0xcf,0x7f,},{0x29,0xdf,0x3a,0xd5,0x89,0x00,0x9c,0x66,0x7b,0xaa,0x5e,0x72,0xda,0xbb,0x4e,0x53,0xcb,0x78,0x76,0xde,0x4e,0x7e,0xfe,0x5c,0xc2,0x1e,0xad,0x7f,0xa8,0x78,0xdb,0x57,0xf9,0x7c,0x11,0x03,0xdd,0xb3,0x9a,0x86,0x1e,0xb8,0x86,0x53,0xc1,0xd4,0xec,0x3b,0x43,0x06,0xe4,0x58,0x4b,0x47,0xb8,0xbc,0x90,0x42,0x31,0x19,0xe7,0xe4,0xaf,0x00,},"\xa6\xc1\x7e\xeb\x5b\x80\x66\xc2\xcd\x9a\x89\x66\x73\x17\xa9\x45\xa0\xc7\xc9\x69\x96\xe7\x7a\xe8\x54\xc5\x09\xc6\xcd\x06\x31\xe9\x22\xad\x04\x50\x3a\xf8\x7a\x3c\x46\x28\xad\xaf\xed\x76\x00\xd0\x71\xc0\x78\xa2\x2e\x7f\x64\xbd\xa0\x8a\x36\x2b\x38\xb2\x6c\xa1\x50\x06\xd3\x8a\xcf\x53\x2d\x0d\xed\xea\x41\x77\xa2\xd3\x3f\x06\x95\x6d\x80\xe9\x63\x84\x8e\xc7\x91\xb2\x76\x2f\xa9\x94\x49\xb4\xf1\xa1\xed\x9b\x3f\x25\x80\xbe\x3a\xc7\xd7\xf5\x2f\xb1\x44\x21\xd6\x22\x2b\xa7\x6f\x80\x77\x50\xc6\xcb\xb0\xb1\x6f\x08\x95\xfc\x73\xd9\xdf\xc5\x87\xe1\xa9\xe5\xd1\xe5\x83\x75\xfb\xab\x70\x5b\x8f\x0c\x1f\xd7\xdf\x8b\x3a\xd4\x46\xf2\xf0\x84\x59\xe7\xed\x1a\xf5\x95\x56\xfb\xc9\x66\xdc\x24\x9c\x1c\xf6\x04\xf3\xe6\x77\xc8\xa0\x9d\x43\x63\x60\x87\x74\xbf\x38\x11\xbe\xf0\x64\x27\x48\xc5\x5c\x51\x6c\x7a\x58\x0f\xa3\x49\x90\x50\xac\xb3\x0e\xed\x87\x0d\x0d\x91\x17\x4c\xb6\x23\xe9\x8c\x3a\xd1\x21\xcf\x81\xf0\x4e\x57\xd4\x9b\x00\x84\x24\xa9\x8a\x31\xee\xaa\xf5\xf3\x8e\x00\x0f\x90\x3d\x48\xd2\x15\xed\x52\xf8\x62\xd6\x36\xa5\xa7\x36\x07\xde\x85\x76\x01\x67\x26\x7e\xfe\x30\xf8\xa2\x6e\xbc\x5a\xa0\xc0\x9f\x5b\x25\x8d\x33\x61\xca\x69\xd1\xd7\xee\x07\xb5\x96\x48\x17\x9a\xb2\x17\x0e\xc5\x0c\x07\xf6\x61\x6f\x21\x68\x72\x52\x94\x21\xa6\x33\x4a\x4a\x1e\xd3\xd2\x67\x1e\xf4\x7b\xc9\xa9\x2a\xfb\x58\x31\x4e\x83\x2d\xb8\xa9\x00\x34\x08\xa0\x48\x75\x03\xfe\x4f\x67\x77\x0d\xd4\xb6"}, +{{0x3d,0xd7,0x20,0x3c,0x23,0x7a,0xef,0xe9,0xe3,0x8a,0x20,0x1f,0xf3,0x41,0x49,0x01,0x79,0x90,0x5f,0x9f,0x10,0x08,0x28,0xda,0x18,0xfc,0xbe,0x58,0x76,0x8b,0x57,0x60,},{0xf0,0x67,0xd7,0xb2,0xff,0x3a,0x95,0x7e,0x83,0x73,0xa7,0xd4,0x2e,0xf0,0x83,0x2b,0xcd,0xa8,0x4e,0xbf,0x28,0x72,0x49,0xa1,0x84,0xa2,0x12,0xa9,0x4c,0x99,0xea,0x5b,},{0x4c,0x03,0x69,0x35,0xa9,0x6a,0xbc,0x0d,0x05,0x0d,0x90,0x7b,0xed,0xbe,0x99,0x46,0xfb,0x97,0x43,0x9f,0x03,0x9c,0x74,0x2e,0x05,0x1c,0xcf,0x09,0xad,0xd7,0xdf,0x44,0xd1,0x7d,0xa9,0x8c,0x2c,0xa0,0x1b,0xdc,0x24,0x24,0xda,0x1e,0x4d,0xeb,0xf3,0x47,0xf8,0xff,0xf4,0x8a,0xc8,0x03,0x0d,0x2c,0xc0,0x7f,0x95,0x75,0xc0,0x44,0xbe,0x04,},"\xdb\x28\xed\x31\xac\x04\xb0\xc2\xde\xce\xe7\xa6\xb2\x4f\xc9\xa0\x82\xcc\x26\x2c\xa7\xcc\xf2\xa2\x47\xd6\x37\x2e\xc3\xe9\x12\x0e\xce\xdb\x45\x42\xea\x59\x3f\xea\x30\x33\x5c\x5a\xb9\xdd\x31\x8a\x3b\x4f\xd5\x83\x42\x99\xcf\x3f\x53\xd9\xef\x46\x13\x7b\x27\x3c\x39\x0e\xc3\xc2\x6a\x0b\x44\x70\xd0\xd9\x4b\x77\xd8\x2c\xae\x4b\x24\x58\x78\x37\xb1\x67\xbb\x7f\x81\x66\x71\x0b\xae\xb3\xee\x70\xaf\x79\x73\x16\xcb\x7d\x05\xfa\x57\xe4\x68\xae\x3f\x0b\xd4\x49\x40\x4d\x85\x28\x80\x8b\x41\xfc\xca\x62\xf5\xe0\xa2\xaa\x5d\x8f\x3a\xca\xb0\x08\xcc\x5f\x6e\x5a\xb0\x27\x77\xbd\xcd\xe8\x7f\x0a\x10\xef\x06\xa4\xbb\x37\xfe\x02\xc9\x48\x15\xcf\x76\xbf\xb8\xf5\xcd\xd8\x65\xcc\x26\xdc\xb5\xcf\x49\x2e\xdf\xd5\x47\xb5\x35\xe2\xe6\xa6\xd8\x54\x09\x56\xdc\xba\x62\xcf\xea\x19\xa9\x47\x44\x06\xe9\x34\x33\x7e\x45\x42\x70\xe0\x10\x36\xac\x45\x79\x3b\x6b\x8a\xce\xda\x18\x7a\x08\xd5\x6a\x2c\xe4\xe9\x8f\x42\xea\x37\x5b\x10\x1a\x6b\x9f\xcb\x42\x31\xd1\x71\xaa\x46\x3e\xeb\x43\x58\x6a\x4b\x82\xa3\x87\xbc\xdd\xaf\x71\xa8\x0f\xd5\xc1\xf7\x29\x2e\xfc\x2b\xd8\xe7\x0c\x11\xea\xa8\x17\x10\x60\x61\xb6\xc4\x61\xc4\x88\x3d\x61\x3c\xc0\x6c\x7e\x2a\x03\xf7\x3d\x90\xfc\x55\xcd\xc0\x72\x65\xee\xfd\x36\xbe\x72\x27\x03\x83\xd6\xc6\x76\xca\xe3\x7c\x93\x69\x1f\x1a\xe3\xd9\x27\xb3\xa1\xcd\x96\x3e\x42\x29\x75\x7a\xe5\x23\x1e\xea\x73\xa9\xf7\x15\x15\x62\x83\x05\x41\x0a\xc2\x59\x3b\x32\x5c\xc6\x31"}, +{{0x28,0x27,0x75,0xdf,0x9e,0xbb,0xd7,0xc5,0xa6,0x5f,0x3a,0x2b,0x09,0x6e,0x36,0xee,0x64,0xa8,0xf8,0xea,0x71,0x9d,0xa7,0x77,0x58,0x73,0x9e,0x4e,0x74,0x76,0x11,0x1d,},{0xa2,0xb4,0x96,0x46,0x03,0x3a,0x13,0x93,0x7c,0xad,0x6b,0x0e,0x91,0x4e,0x3c,0xec,0x54,0x98,0x9c,0x25,0x2c,0xa5,0x64,0x3d,0x07,0x65,0x55,0xd8,0xc5,0x5e,0x56,0xe0,},{0x15,0x76,0x39,0x73,0x85,0x94,0x02,0x90,0x7d,0x8d,0xcb,0x86,0xad,0xc2,0x4a,0x2a,0x16,0x8b,0xa3,0xab,0xf2,0x24,0x61,0x73,0xd6,0x34,0x8a,0xfe,0xd5,0x1e,0xf6,0x0b,0x0c,0x0e,0xde,0xff,0x4e,0x10,0xbc,0xef,0x4c,0x6e,0x57,0x78,0xc8,0xbc,0x1f,0x5e,0x9e,0xe0,0x23,0x73,0x73,0x44,0x5b,0x45,0x51,0x55,0xd2,0x3d,0xe1,0x27,0xa2,0x02,},"\x14\xcc\x50\xc2\x97\x3e\xa9\xd0\x18\x7a\x73\xf7\x1c\xb9\xf1\xce\x07\xe7\x39\xe0\x49\xec\x2b\x27\xe6\x61\x3c\x10\xc2\x6b\x73\xa2\xa9\x66\xe0\x1a\xc3\xbe\x8b\x50\x5a\xea\xad\x14\x85\xc1\xc2\xa3\xc6\xc2\xb0\x0f\x81\xb9\xe5\xf9\x27\xb7\x3b\xfd\x49\x86\x01\xa7\x62\x2e\x85\x44\x83\x7a\xad\x02\xe7\x2b\xf7\x21\x96\xdc\x24\x69\x02\xe5\x8a\xf2\x53\xad\x7e\x02\x5e\x36\x66\xd3\xbf\xc4\x6b\x5b\x02\xf0\xeb\x4a\x37\xc9\x55\x49\x92\xab\xc8\x65\x1d\xe1\x2f\xd8\x13\x17\x73\x79\xbb\x0c\xe1\x72\xcd\x8a\xaf\x93\x7f\x97\x96\x42\xbc\x2e\xd7\xc7\xa4\x30\xcb\x14\xc3\xcd\x31\x01\xb9\xf6\xb9\x1e\xe3\xf5\x42\xac\xdf\x01\x7f\x8c\x21\x16\x29\x7f\x45\x64\x76\x8f\x4d\xb9\x5d\xad\x8a\x9b\xcd\xc8\xda\x4d\x8f\xb1\x3e\xf6\xe2\xda\x0b\x13\x16\xd3\xc8\xc2\xf3\xed\x83\x6b\x35\xfe\x2f\xd3\x3e\xff\xb4\x09\xe3\xbc\x1b\x0f\x85\x22\x5d\x2a\x1d\xe3\xbf\xc2\xd2\x05\x63\x94\x64\x75\xc4\xd7\xca\x9f\xdd\xba\xf5\x9a\xd8\xf8\x96\x1d\x28\x7a\xe7\xdd\x80\x3e\x7a\xf1\xfa\x61\x23\x29\xb1\xbd\xc0\x4e\x22\x56\x00\xae\x73\x1b\xc0\x1a\xe0\x92\x5a\xed\x62\xac\x50\xd4\x60\x86\xf3\x64\x6c\xf4\x7b\x07\x2f\x0d\x3b\x04\x4b\x36\xf8\x5c\xec\x72\x9a\x8b\xb2\xb9\x28\x83\xca\x4d\xfb\x34\xa8\xee\x8a\x02\x73\xb3\x1a\xf5\x09\x82\xbb\x61\x31\xbf\xa1\x1d\x55\x50\x4b\x1f\x6f\x1a\x0a\x00\x43\x8c\xa2\x6d\x8a\xb4\xf4\x8b\xcd\xdc\x9d\x5a\x38\x85\x1a\xbe\xde\x41\x51\xd5\xb7\x0d\x72\x07\x32\xa0\x0a\xbe\xa2\xc8\xb9\x79"}, +{{0x47,0x30,0xa5,0xcf,0x97,0x72,0xd7,0xd6,0x66,0x5b,0xa7,0x87,0xbe,0xa4,0xc9,0x52,0x52,0xe6,0xec,0xd6,0x3e,0xc6,0x23,0x90,0x54,0x7b,0xf1,0x00,0xc0,0xa4,0x63,0x75,},{0xf9,0xf0,0x94,0xf7,0xcc,0x1d,0x40,0xf1,0x92,0x6b,0x5b,0x22,0xdc,0xe4,0x65,0x78,0x44,0x68,0xb2,0x0a,0xb3,0x49,0xbc,0x6d,0x4f,0xdf,0x78,0xd0,0x04,0x2b,0xbc,0x5b,},{0x55,0x2c,0x73,0x47,0xbd,0xfe,0x13,0x16,0x46,0xce,0x09,0x32,0xd8,0x2a,0x36,0xd2,0xc1,0xb7,0x6d,0x7c,0x30,0xee,0x89,0x0e,0x05,0x92,0xe1,0x9f,0x9d,0x18,0xb9,0xa5,0x6f,0x48,0xd7,0xa9,0xb6,0x8c,0x01,0x7d,0xa6,0xb5,0x50,0xc9,0x43,0xaf,0x4a,0x90,0x7b,0xaf,0x31,0x7e,0x41,0x9f,0xbb,0xc9,0x6f,0x6c,0xf4,0xbf,0xad,0x42,0xde,0x00,},"\xe7\x47\x6d\x2e\x66\x84\x20\xe1\xb0\xfa\xdf\xba\xa5\x42\x86\xfa\x7f\xa8\x90\xa8\x7b\x82\x80\xe2\x60\x78\x15\x22\x95\xe1\xe6\xe5\x5d\x12\x41\x43\x5c\xc4\x30\xa8\x69\x3b\xb1\x0c\xde\x46\x43\xf5\x9c\xbf\xcc\x25\x6f\x45\xf5\x09\x0c\x90\x9a\x14\xc7\xfc\x49\xd3\x7b\xfc\x25\xaf\x11\xe8\xf4\xc8\x3f\x4c\x32\xd4\xaa\xbf\x43\xb2\x0f\xa3\x82\xbb\x66\x22\xa1\x84\x8f\x8f\xfc\x4d\xff\x34\x08\xbb\x4e\xc7\xc6\x7a\x35\xb4\xcd\xae\xe5\xe2\x79\xc0\xfc\x0a\x66\x09\x3a\x9f\x36\xa6\x0f\xdd\x65\xe6\x33\x4a\x80\x4e\x84\x5c\x85\x30\xb6\xfd\xa3\x63\xb5\x64\x03\x37\xd0\x27\x24\x3c\xcf\xb3\xc1\x77\xf4\x3e\x71\x78\x96\xe4\x6e\xad\x7f\x72\xca\x06\xaa\x0f\xf1\xe7\x72\x47\x12\x1b\xaf\x48\xbe\x9a\x44\x5f\x72\x9c\xa1\x39\x0f\xc4\x61\x51\xcb\xd3\x3f\xcb\xd7\x37\x3f\x27\xa6\xba\x55\xc9\x2c\xbf\x69\x45\xb0\x9b\x44\xb9\xa4\xe5\x80\x0d\x40\x30\x70\xae\x66\x04\x89\x97\xb2\x19\x7f\x02\x18\x1a\x09\x7e\x56\x3f\x9b\x9a\xcc\x84\x11\x39\x25\x8a\x25\x8b\xc6\x10\xd3\xbd\x89\x16\x37\x35\x6b\x2e\xdc\x8c\x18\x4c\x35\xc6\x5a\xf9\x1a\xaf\x7b\x1c\x16\xd7\x4a\x5f\x5f\x86\x25\x48\x13\x92\x54\xec\xf5\x50\x63\x1d\x5f\x88\x49\xaf\xdb\x5b\x64\xcf\x36\x6f\xf2\x63\x3a\x93\xf3\xa1\x8c\x39\xb5\x15\x02\x45\xfb\x5f\x33\xc9\xe4\xe2\xd9\x4a\xf6\x96\x3a\x70\xb8\x8f\x9e\x7e\x51\x9f\x8f\xa2\xa0\xf2\xe3\x74\x9d\xe8\x83\xd0\xe6\xf0\x52\xa9\x49\xd0\xfc\x71\x53\xa8\x69\x3f\x6d\x80\x1d\x73\x52\xeb\x2f\x7a\x46\x5c\x0e"}, +{{0x27,0x70,0xaa,0xdd,0x1d,0x12,0x3e,0x95,0x47,0x83,0x2d,0xfb,0x2a,0x83,0x7e,0xba,0x08,0x91,0x79,0xef,0x4f,0x23,0xab,0xc4,0xa5,0x3f,0x2a,0x71,0x4e,0x42,0x3e,0xe2,},{0x3c,0x5f,0xbb,0x07,0x53,0x0d,0xd3,0xa2,0x0f,0xf3,0x5a,0x50,0x0e,0x37,0x08,0x92,0x63,0x10,0xfe,0xd8,0xa8,0x99,0x69,0x02,0x32,0xb4,0x2c,0x15,0xbd,0x86,0xe5,0xdc,},{0xf2,0x67,0x71,0x5e,0x9a,0x84,0xc7,0x31,0x4f,0x2d,0x58,0x69,0xef,0x4a,0xb8,0xd2,0x14,0x9a,0x13,0xf7,0xe8,0xe1,0xc7,0x28,0xc4,0x23,0x90,0x62,0x93,0xb4,0x9c,0xe6,0x28,0x34,0x54,0xdd,0x1c,0x7b,0x04,0x74,0x1d,0xf2,0xea,0xbe,0xdc,0x4d,0x6a,0xb1,0x39,0x7d,0xc9,0x5a,0x67,0x9d,0xf0,0x4d,0x2c,0x17,0xd6,0x6c,0x79,0xbb,0x76,0x01,},"\xa5\xcc\x20\x55\xeb\xa3\xcf\x6f\x0c\x63\x32\xc1\xf2\xab\x58\x54\x87\x09\x13\xb0\x3f\xf7\x09\x3b\xc9\x4f\x33\x5a\xdd\x44\x33\x22\x31\xd9\x86\x9f\x02\x7d\x82\xef\xd5\xf1\x22\x71\x44\xab\x56\xe3\x22\x2d\xc3\xdd\xcc\xf0\x62\xd9\xc1\xb0\xc1\x02\x4d\x9b\x41\x6d\xfa\x3e\xe8\xa7\x02\x79\x23\x00\x34\x65\xe0\xff\xae\xfb\x75\xb9\xf2\x9d\xc6\xbc\xf2\x13\xad\xc5\xe3\x18\xfd\x8b\xa9\x3a\x7a\xa5\xbf\xb4\x95\xde\x9d\x7c\x5e\x1a\x19\x6c\xd3\xa2\xd7\x72\x1f\x8b\xa7\x85\xaa\x90\x52\xa1\x81\x1c\x7f\xcc\x8f\x93\x93\x27\x65\x05\x9c\xab\x9c\x9b\x71\x89\x45\x89\x5e\xf2\x6f\x3a\xc0\x48\xd4\xca\xbf\x91\xa9\xe6\xaa\x83\xac\x14\xd4\x31\x56\x82\x78\x37\x91\x4e\xb7\x63\xa2\x3c\xba\x53\xf6\x0f\x15\x0f\x4b\x70\x20\x3e\xc1\x83\x3f\xf1\x05\x84\x94\x57\xa8\xda\x73\x27\x66\x1f\xb2\x3a\x55\x41\x64\xe0\x5f\xcf\x01\x46\xb1\x06\x74\x96\x4b\xe6\xf6\xaa\x0a\xcc\x94\xc4\x1a\xd5\x71\x80\xe5\x18\x0d\x19\x9b\xd9\x10\x2f\x55\xd7\x40\xe8\x17\x89\xb1\x56\x71\xbb\xd0\x67\x0e\x6d\xe5\xd9\x7e\x1a\xe6\x26\xd8\xa0\xeb\xc3\x2c\x8f\xd9\xd2\x47\x37\x27\x4e\x47\xd2\xdd\x59\x41\xa2\x72\xe7\x2a\x59\x89\x28\xad\x10\x9c\xde\x93\x7b\xf2\x48\xd5\x7f\x5d\x29\x42\x98\x3c\x51\xe2\xa8\x9f\x8f\x05\x4d\x5c\x48\xdf\xad\x8f\xcf\x1f\xfa\x97\xf7\xde\x6a\x3a\x43\xca\x15\xfc\x67\x20\xef\xae\xc6\x9f\x08\x36\xd8\x42\x23\xf9\x77\x6d\x11\x1e\xc2\xbb\xc6\x9b\x2d\xfd\x58\xbe\x8c\xa1\x2c\x07\x21\x64\xb7\x18\xcd\x7c\x24\x6d\x64"}, +{{0x4f,0xda,0xb7,0xc1,0x60,0x0e,0x70,0x11,0x4b,0x11,0xf5,0x33,0x24,0x23,0x76,0xaf,0x76,0x14,0xb4,0xd5,0xda,0x04,0x6a,0xc4,0xbe,0xde,0xa2,0x1d,0x8a,0x36,0x15,0x98,},{0xa2,0x5c,0x9a,0x94,0xd6,0xe4,0xec,0xd9,0x5a,0x4b,0xd6,0x80,0x5f,0x76,0x2e,0xb1,0xc4,0x57,0xa8,0xd4,0x5d,0x24,0x32,0x38,0xb1,0x83,0x9c,0xbb,0xa8,0xf4,0x41,0xcc,},{0x50,0x75,0xc0,0x90,0xcf,0xbe,0xb6,0xb0,0x18,0x02,0xaf,0x7f,0x4d,0xa5,0xaa,0x4f,0x43,0x4d,0x5e,0xe2,0xf3,0x53,0x0e,0xeb,0xb7,0x5c,0x85,0xe0,0x86,0x21,0xf8,0x3e,0xdc,0x08,0xaa,0x96,0x69,0x38,0x94,0xa4,0x27,0x76,0x33,0xba,0x81,0xe1,0x9e,0x9e,0x55,0xaf,0x5c,0x49,0x5d,0xaa,0x5e,0x1a,0x6f,0x8c,0xbb,0x79,0xc0,0x1c,0x72,0x07,},"\xda\x40\x58\x90\xd1\x1a\x87\x2c\x11\x9d\xab\x5e\xfc\xbf\xf6\x1e\x93\x1f\x38\xec\xcc\xa4\x57\xed\xc6\x26\xd3\xea\x29\xed\x4f\xe3\x15\x4f\xaf\xec\x14\x44\xda\x74\x34\x3c\x06\xad\x90\xac\x9d\x17\xb5\x11\xbc\xb7\x3b\xb4\x9d\x90\xba\xfb\x7c\x7e\xa8\x00\xbd\x58\x41\x1d\xf1\x27\x5c\x3c\xae\x71\xb7\x00\xa5\xda\xb4\x91\xa4\x26\x16\x78\x58\x79\x56\xaa\x4a\x21\x9e\x1a\xc6\xdd\x3f\xb2\xcb\x8c\x46\x19\x72\x18\xe7\x26\xdc\x7e\xd2\x34\x52\x6a\x6b\x01\xc0\xd7\x2c\xb9\x3a\xb3\xf4\xf3\x8a\x08\xe5\x94\x0b\x3f\x61\xa7\x2a\xd2\x78\x9a\x05\x32\x00\x0f\xac\x1d\x2d\x2e\x3a\xd6\x32\xac\x8b\x62\xbb\x3f\xf5\xb9\x9d\x53\x59\x7b\xf4\xd4\x4b\x19\x67\x49\x24\xdf\x9b\x3d\xb3\xd0\x25\x3f\x74\x62\x7c\xca\xb3\x00\x31\xc8\x5e\x29\x1c\x58\xb5\xfa\x91\x67\x52\x2a\x46\x74\x6f\xc3\x07\x03\x67\x45\xd4\xf9\x81\x77\x86\xe5\xd3\x00\xe6\xc5\xd5\x03\x12\x5f\xea\x01\xde\xc3\xe3\xfe\xdb\xf3\x86\x1c\xa2\x62\x7a\x05\x18\xfb\x2b\x24\xe5\xa7\xa0\x14\x17\x87\x19\xe9\xb3\x45\xf7\xb2\x49\xce\x3a\x41\x32\x80\xc8\xde\xb6\x74\xf5\x9a\x25\xbe\x92\xa8\xab\x64\x00\xc7\xc5\x2b\x07\x28\xae\x34\xe2\x2b\x2e\xc2\x00\xc1\xcb\xab\xa2\xcc\xd8\xaf\x29\x24\x9d\x17\xaf\x60\xc3\x60\x07\xa7\x22\xfc\x80\x25\x8a\x7b\xeb\xab\x1c\xda\xad\x74\x62\xa8\xb7\x58\x8c\x2f\x7e\x27\xc6\xd0\x7a\xfc\xf6\x01\x17\xfe\xd1\x1b\xd6\x85\x9e\x75\xe3\xb4\xfc\xee\x39\x81\x88\x1e\x95\xdd\x11\x68\x27\xdd\x4b\x36\x9a\xf0\x69\xd3\xc8\xf2\x67\x6f\x8a"}, +{{0x26,0x45,0x04,0x60,0x4e,0x70,0xd7,0x2d,0xc4,0x47,0x4d,0xbb,0x34,0x91,0x3e,0x9c,0x0f,0x80,0x6d,0xfe,0x18,0xc7,0x87,0x9a,0x41,0x76,0x2a,0x9e,0x43,0x90,0xec,0x61,},{0xeb,0x2b,0x51,0x8c,0xe7,0xdc,0x71,0xc9,0x1f,0x36,0x65,0x58,0x16,0x51,0xfd,0x03,0xaf,0x84,0xc4,0x6b,0xf1,0xfe,0xd2,0x43,0x32,0x22,0x35,0x3b,0xc7,0xec,0x51,0x1d,},{0xee,0xa4,0x39,0xa0,0x0f,0x7e,0x45,0x9b,0x40,0x2b,0x83,0x51,0x50,0xa7,0x79,0xee,0xd1,0x71,0xab,0x97,0x1b,0xd1,0xb5,0x8d,0xcc,0x7f,0x93,0x86,0xda,0xdd,0x58,0x3d,0xe8,0xdc,0x69,0xe2,0x67,0x12,0x1d,0xde,0x41,0xf0,0xf9,0x49,0x3d,0x45,0x0b,0x16,0x21,0x9c,0xdf,0x3c,0x22,0xf0,0x94,0x82,0xce,0x40,0x2f,0xe1,0x7c,0xa4,0x9e,0x08,},"\x90\x1d\x70\xe6\x7e\xd2\x42\xf2\xec\x1d\xda\x81\x3d\x4c\x05\x2c\xfb\x31\xfd\x00\xcf\xe5\x44\x6b\xf3\xb9\x3f\xdb\x95\x0f\x95\x2d\x94\xef\x9c\x99\xd1\xc2\x64\xa6\xb1\x3c\x35\x54\xa2\x64\xbe\xb9\x7e\xd2\x0e\x6b\x5d\x66\xad\x84\xdb\x5d\x8f\x1d\xe3\x5c\x49\x6f\x94\x7a\x23\x27\x09\x54\x05\x1f\x8e\x4d\xbe\x0d\x3e\xf9\xab\x30\x03\xdd\x47\xb8\x59\x35\x6c\xec\xb8\x1c\x50\xaf\xfa\x68\xc1\x5d\xad\xb5\xf8\x64\xd5\xe1\xbb\x4d\x3b\xad\xa6\xf3\xab\xa1\xc8\x3c\x43\x8d\x79\xa9\x4b\xfb\x50\xb4\x38\x79\xe9\xce\xf0\x8a\x2b\xfb\x22\xfa\xd9\x43\xdb\xf7\x68\x37\x79\x74\x6e\x31\xc4\x86\xf0\x1f\xd6\x44\x90\x50\x48\xb1\x12\xee\x25\x80\x42\x15\x3f\x46\xd1\xc7\x77\x2a\x06\x24\xbc\xd6\x94\x1e\x90\x62\xcf\xda\x75\xdc\x87\x12\x53\x3f\x40\x57\x33\x5c\x29\x80\x38\xcb\xca\x29\xeb\xdb\x56\x0a\x29\x5a\x88\x33\x96\x92\x80\x8e\xb3\x48\x1f\xd9\x73\x5e\xa4\x14\xf6\x20\xc1\x43\xb2\x13\x3f\x57\xbb\x64\xe4\x47\x78\xa8\xca\x70\x91\x82\x02\xd1\x57\x42\x61\x02\xe1\xdf\xc0\xa8\xf7\xb1\xae\x48\x7b\x74\xf0\x27\x92\x63\x31\x54\xdf\xe7\x4c\xaa\x1b\x70\x88\xfd\xa2\x2f\xa8\xb9\xbc\x35\x4c\x58\x5f\x15\x67\x70\x6e\x29\x55\x49\x38\x70\xf5\x41\x69\xe0\xd7\x69\x11\x59\xdf\x43\x89\x79\x61\xd2\x4a\x85\x2e\xa9\x70\xc5\x14\x94\x8f\x3b\x48\xf7\x1e\xe5\x86\xe7\x2e\xc7\x8d\xb8\x20\xf2\x53\xe0\x8d\xb8\x4f\x6f\x31\x2c\x43\x33\xbd\x0b\x73\x2f\xe7\x58\x83\x50\x77\x83\xe9\xa1\xfd\x4f\xba\xb8\xe5\x87\x0f\x9b\xf7\xad\x58\xaa"}, +{{0x2c,0xa7,0x44,0x7a,0x36,0x68,0xb7,0x48,0xb1,0xfd,0x3d,0x52,0xd2,0x08,0x0d,0x30,0xe3,0x4d,0x39,0x7b,0xb2,0x84,0x6c,0xaf,0x8f,0x65,0x9a,0xc1,0x68,0x78,0x8c,0xa5,},{0xab,0x33,0x1c,0xd4,0x0a,0x31,0xd0,0x17,0x3c,0x0c,0x8c,0x1c,0x17,0x00,0x25,0x32,0x80,0x7b,0xf8,0x9e,0x3e,0xdb,0x6d,0x34,0xc2,0xdd,0x82,0x94,0x63,0x2b,0x9f,0xbc,},{0xf9,0x3a,0xda,0x15,0xae,0x9c,0xd2,0xb5,0x4f,0x26,0xf8,0x6f,0x0c,0x28,0x39,0x2a,0xed,0x5e,0xb6,0xb6,0xb4,0x4d,0x01,0xa4,0xe3,0x3a,0x54,0xe7,0xda,0x37,0xc3,0x8e,0x8d,0x53,0x36,0x6f,0x73,0xfd,0x85,0xbe,0x64,0x2e,0x4e,0xc8,0x12,0x36,0xd1,0x63,0xf0,0xd0,0x25,0xe7,0x6c,0x8b,0xbd,0xd6,0x5d,0x43,0xdf,0x49,0xf0,0x9c,0x1f,0x01,},"\xa8\x2b\xcd\x94\x24\xbf\xfd\xa0\xf2\xf5\xe9\xea\xe1\x78\x35\xdb\xe4\x68\xf6\x1b\x78\x5a\xab\x82\x93\x47\x37\xa9\x1c\x5f\x60\x2c\xb7\xc6\x17\xcd\xff\xe8\x7c\xad\x72\x6a\x49\x72\xe1\x5a\x7b\x8e\xe1\x47\xf0\x62\xd2\xa5\xa4\xd8\x97\x06\xb5\x71\xfa\x8a\xa2\xb9\x59\x81\xc7\x8a\xbe\xaa\xae\x86\x20\x3f\xa2\xc0\xe0\x72\x97\x40\x6e\xa8\xc2\x71\x11\xa8\x6d\xbe\x1d\x5a\x7c\x3b\x7a\xe9\x30\x90\x4d\x98\x90\xf6\xd4\xab\xeb\xd1\x41\x2a\x73\xad\x5f\xee\xa6\x4a\xcf\x06\x5d\x3e\x63\xb5\xcb\xe2\x0c\xf2\x0b\xbd\x2d\x8b\x94\xf9\x05\x3e\xd5\xf6\x66\x33\x48\x25\x30\x12\x44\x46\x60\x59\x18\xde\x66\x45\x5e\x8c\xf4\xb1\x01\xa1\x27\x23\x3c\x4e\x27\xd5\xd5\x5b\xf9\x5b\xd3\x19\x5d\x03\x40\xd4\x35\x31\xfc\x75\xfa\xf8\xdd\xed\x52\x75\xbf\x89\x75\x0d\xe8\x38\xfd\x10\xc3\x17\x45\xbe\x4c\xa4\x1f\xa8\x71\xcb\x0f\x9b\x01\x67\x06\xa1\xa7\xe3\xc4\x4b\xb9\x0a\xc7\xa8\xad\x51\xe2\x72\x38\x92\x92\xfd\x6c\x98\xad\x7a\x06\x9e\x76\xe3\xf5\xf3\xe0\xcc\x77\x0b\x9e\x9b\x35\xa7\x65\xd0\xd9\x37\x12\xd7\xcd\xab\xd1\x7e\x5d\x01\xdd\x81\x83\xaf\x4a\xd9\x36\x5d\xb0\xa0\xfa\x41\x38\x1f\xce\x60\xa0\x81\xdf\x1c\x5a\xb0\xf8\xc1\x8f\x95\xa7\xa8\xb5\x82\xdf\xff\x7f\x14\x9e\xa5\x79\xdf\x06\x23\xb3\x3b\x75\x08\xf0\xc6\x63\xf0\x1e\x3a\x2d\xcd\x9d\xfb\xee\x51\xcc\x61\x52\x20\xfd\xaf\xfd\xab\x51\xbd\xae\x42\xcb\x9f\x7f\xa9\xe3\xb7\xc6\x9c\xc8\xad\xa5\xcc\xd6\x42\x52\x9b\xa5\x14\xfd\xc5\x4f\xcf\x27\x20\xb8\xf5\xd0\x8b\x95"}, +{{0x49,0x4e,0xa9,0xbc,0xce,0x26,0x88,0x5b,0x7d,0x17,0xd1,0xfc,0x11,0x44,0x48,0xf2,0x39,0xf0,0xce,0x46,0xe5,0xf2,0x47,0xb4,0xc9,0x99,0xfa,0x86,0x29,0x69,0x24,0x72,},{0x69,0x01,0xe5,0xef,0xae,0x57,0x53,0x6b,0xa5,0xfd,0xd9,0x6b,0x59,0x65,0x73,0x59,0x06,0x5f,0x25,0xd3,0x91,0xa1,0xaa,0x8c,0xdc,0x0d,0x38,0xbb,0x5d,0x53,0xc1,0x39,},{0x54,0x8a,0x09,0x3a,0x68,0x03,0x61,0xb7,0xdc,0x56,0xf1,0x45,0x03,0xb5,0x5e,0xee,0xc3,0xb3,0xf4,0xfd,0x4c,0xa9,0x9d,0x6a,0xed,0xce,0x08,0x30,0xf7,0xf4,0xae,0x2f,0x73,0x28,0x53,0x9b,0x34,0xc4,0x8f,0xc9,0x76,0x09,0x22,0x33,0x3d,0xae,0x9c,0x7c,0x01,0x7e,0x7d,0xb7,0x3b,0x8f,0xaa,0x6c,0x06,0xbe,0x05,0xe3,0x47,0x99,0x2b,0x06,},"\x3b\xad\xbf\xa5\xf5\xa8\xaa\x2c\xce\x0a\x60\xe6\x86\xcd\xce\x65\x4d\x24\x45\x2f\x98\xfd\x54\x87\x2e\x73\x95\xb3\x94\x64\x38\x0a\x0e\x18\x55\x57\xea\x13\x4d\x09\x57\x30\x86\x4f\x42\x54\xd3\xdd\x94\x69\x70\xc1\x0c\x80\x4f\xcc\x08\x99\xdf\xa0\x24\x20\x5b\xe0\xf8\x0b\x1c\x75\x44\x95\x23\x32\x4f\xe6\xa0\x75\x1e\x47\xb4\xff\x48\x22\xb8\xc3\x3e\x9e\xaf\x1d\x1d\x96\xe0\xde\x3d\x4a\xcd\x89\x69\x6b\x7f\xcc\x03\xd4\x9f\x92\xf8\x2b\x97\x25\x70\x0b\x35\x0d\xb1\xa8\x76\x15\x36\x95\x45\x56\x1b\x85\x99\xf5\xea\x92\x0a\x31\x0a\x8b\xaf\xc0\xe8\xd7\x46\x8c\xbf\x6f\x38\x20\xe9\x43\x59\x4a\xfd\xd5\x16\x6e\x4e\x33\x09\xdd\xdd\x76\x94\xef\x67\xe6\x94\xf3\x4f\xc6\x27\x24\xff\x96\xac\x33\x64\x17\x6f\x34\xe8\xa0\x2b\x4c\xf5\x69\xdb\x5b\x8f\x77\xd5\x85\x12\xae\xda\xbf\x0b\xcd\x1c\x2d\xf1\x2d\xb3\xa9\x47\x3f\x94\x8c\x5c\x32\x43\x30\x9a\xae\x46\xc4\x9e\xfd\x08\x8b\x60\xf3\x1a\x8a\x72\xad\x7e\x5a\x35\xac\xc5\xd8\x9f\xa6\x68\x07\xeb\x5d\x3b\xa9\xcd\xf0\x8d\x47\x53\xcb\x85\x08\x9e\xe3\x6f\x5c\x96\xb4\x32\xb6\x92\x83\x52\xaf\xad\x58\x01\x22\x25\xd6\x15\x7f\x9e\x36\x11\x42\x6d\xf9\x21\xb6\xd1\xd8\x37\x46\x28\xa6\x30\x31\xe9\xff\xb9\x0e\x42\xff\xbb\xa0\x21\xf1\x74\xf6\x85\x03\x15\x54\x30\x15\x2c\x91\x55\xdc\x98\xff\xa2\x6c\x4f\xab\x06\x5e\x1f\x8e\x46\x22\xc2\xf2\x8a\x8c\xb0\x43\x11\x0b\x61\x74\x41\x14\x0f\x8e\x20\xad\xc1\x6f\x79\x9d\x1d\x50\x96\xb1\xf5\x05\x32\xbe\x50\x42\xd2\x1b\x81\xea\x46\xc7"}, +{{0x00,0xd7,0x35,0xeb,0xae,0xe7,0x5d,0xd5,0x79,0xa4,0x0d,0xfd,0x82,0x50,0x82,0x74,0xd0,0x1a,0x15,0x72,0xdf,0x99,0xb8,0x11,0xd5,0xb0,0x11,0x90,0xd8,0x21,0x92,0xe4,},{0xba,0x02,0x51,0x7c,0x0f,0xdd,0x3e,0x26,0x14,0xb3,0xf7,0xbf,0x99,0xed,0x9b,0x49,0x2b,0x80,0xed,0xf0,0x49,0x5d,0x23,0x0f,0x88,0x17,0x30,0xea,0x45,0xbc,0x17,0xc4,},{0xdc,0xdc,0x54,0x61,0x19,0x37,0xd2,0xbd,0x06,0xca,0xcd,0x98,0x18,0xb3,0xbe,0x15,0xce,0x74,0x25,0x42,0x7a,0x75,0xf5,0x0d,0x19,0x7a,0x33,0x7a,0x3b,0x8b,0xa6,0x71,0x4e,0xf4,0x88,0x66,0xf2,0x43,0xbd,0x5a,0xc7,0x41,0x5e,0x91,0x45,0x17,0xa2,0xc1,0xc5,0xa9,0x53,0xf4,0x32,0xb9,0x9d,0xb0,0xe6,0x20,0xd6,0x4f,0x74,0xeb,0x85,0x05,},"\x59\xc0\xb6\x9a\xf9\x5d\x07\x4c\x88\xfd\xc8\xf0\x63\xbf\xdc\x31\xb5\xf4\xa9\xbc\x9c\xec\xdf\xfa\x81\x28\xe0\x1e\x7c\x19\x37\xdd\xe5\xeb\x05\x70\xb5\x1b\x7b\x5d\x0a\x67\xa3\x55\x5b\x4c\xdc\xe2\xbc\xa7\xa3\x1a\x4f\xe8\xe1\xd0\x3a\xb3\x2b\x40\x35\xe6\xda\xdb\xf1\x53\x20\x59\xee\x01\xd3\xd9\xa7\x63\x3a\x0e\x70\x6a\x11\x54\xca\xb2\x2a\x07\xcd\x74\xc0\x6a\x3c\xb6\x01\x24\x4c\xf3\xcf\x35\xa3\x5c\x31\x00\xba\x47\xf3\x13\x72\xa2\xda\x65\xdc\xff\x0d\x7a\x80\xa1\x05\x5d\x8a\xa9\x92\x12\xe8\x99\xaa\xd7\xf0\x2e\x94\x9e\x6f\xee\x4d\x3c\x9c\xef\xa8\x50\x69\xea\xff\x1f\x6a\xd0\x6f\xc3\x00\xc8\x71\xab\x82\xb2\xbe\xdb\x93\x4d\x20\x87\x5c\x2a\x26\x32\x42\xcd\xb7\xf9\xbe\x19\x2a\x87\x10\xb2\x4c\x7e\xa9\x8d\x43\xda\xec\x8b\xaa\x55\x53\xc6\x78\xa3\x8f\x0e\x0a\xdf\x7d\x3f\xf2\xdc\xc7\x99\xa1\xdb\xad\x6e\xab\x1c\x3d\x94\x58\xa9\xdb\x92\x2f\x02\xe7\x5c\xfa\xb9\xd6\x5c\x73\x36\xda\xe7\x18\x95\xd5\xbb\x15\xca\xc2\x03\xf2\xb3\x8b\x99\x96\xc4\x10\xf8\x65\x5a\xd2\x2d\x3c\x09\x1c\x20\xb7\xf9\x26\xd4\x5e\x78\x01\x28\xf1\x97\x47\x46\x2a\xbc\x5c\x58\x93\x2f\xbb\x9e\x0b\xc6\x2d\x53\x86\x88\x02\xf1\xb0\x83\xf1\x83\xb8\xa1\xf9\x43\x49\x86\xd5\xcf\x97\xc0\x4e\x2f\x3e\x14\x57\x30\xcb\xa9\x87\x79\xc7\xfe\xd0\xca\xb1\xc0\x5d\x5e\x46\x53\xc6\xc3\xf6\x73\x62\x60\xbc\x78\xee\x43\x72\x86\x2f\xfe\x9e\x90\x37\x1d\x76\x2c\x74\x32\x78\x1f\x35\xce\xd8\x84\xa4\xba\xca\x05\x65\x3e\xf2\x5f\x25\xa6\xf3\xd5\x62\x83\x08"}, +{{0x8c,0x34,0xb9,0x05,0x44,0x0b,0x61,0x91,0x1d,0x1d,0x81,0x37,0xc5,0x3d,0x46,0xa1,0xa7,0x6d,0x46,0x09,0xaf,0x97,0x3e,0x18,0xeb,0x4c,0x57,0x09,0x29,0x56,0x27,0xbb,},{0xb6,0x9a,0x8b,0x2f,0xdf,0x5c,0x20,0xe7,0x34,0xc2,0xff,0xb2,0x94,0xbc,0x8a,0xe1,0x01,0x1d,0x66,0x4f,0x11,0xaf,0xe7,0xfb,0xc4,0x71,0x92,0x5c,0xf7,0x2f,0xa9,0x9d,},{0x3e,0x0b,0x72,0x07,0x3d,0xc9,0x37,0x5e,0xed,0xcc,0xa6,0xc4,0xfc,0x1c,0xd3,0x15,0x93,0x8a,0x05,0x0c,0x92,0x71,0x6b,0xd2,0x28,0x4f,0x46,0x29,0xa9,0x62,0xbe,0xec,0x0b,0x7d,0x7c,0xf1,0x6a,0xb9,0x23,0xd5,0x8f,0x5b,0x90,0xd3,0x90,0x1a,0x8e,0x5c,0x75,0xc8,0xf1,0x7d,0xab,0x99,0x98,0xe0,0x07,0xd8,0xc4,0x95,0x11,0x97,0x3d,0x0e,},"\x30\xb5\x7a\x38\x9b\x48\xa0\xbe\xb1\xa4\x84\x32\xbf\xf6\xb3\x14\xbd\xed\x79\xc4\xa1\x76\x3a\x5a\xcb\x57\xce\xa1\xbf\xb4\xc6\xd0\x16\xcf\x09\x0f\x5b\xd0\x5b\xbd\x11\x4e\x33\xae\x7c\x17\x78\x2d\xfa\x26\x4f\x46\xc4\x5f\x8c\x59\x9c\x60\x30\x16\xfe\x9f\xf0\x5b\x6b\x5a\x99\xe9\x2f\xe7\x13\xa4\xcd\x5c\x41\xb2\x92\xed\x2b\xb2\xe9\xcf\x33\xa4\x40\x54\x2e\x82\x1e\xc8\x2c\xbf\x66\x5c\x3f\x02\xe3\xdc\x33\x7d\x7f\xdb\x58\xe3\x1b\x27\xcb\x29\x54\x54\x14\x68\x81\x46\x98\x51\x0d\xf1\x8c\x85\xc8\x1f\xad\x12\xdb\x11\xec\x6b\x96\x6f\x49\x30\xda\x56\x46\xb9\x91\xdb\x97\x44\x50\x97\xda\x30\xda\xb6\x1c\xda\x53\xa4\x10\x83\xcb\x96\xad\xd1\x9d\xe6\xc5\xee\xc3\x23\xbc\xa9\xd3\x53\x0e\x38\xc0\x0b\x35\xaf\x73\x60\x07\x76\x01\xbe\x6a\xc9\x7f\x30\x30\xf9\x30\xa2\x7b\x90\xfe\x8b\x69\x11\xba\xe3\x89\x06\x5a\xdc\x15\xe1\x88\x23\x00\xe2\xa0\x03\x27\x4d\x23\x18\x2d\x5e\xfd\x5b\xa4\xb9\x13\x0c\x07\xbd\x5c\x65\xfe\xcb\x8b\x5c\xb7\xeb\x38\x83\x6b\x31\x8b\xef\xdf\xd7\x7d\xe4\xd6\xca\x01\x81\xf7\x7a\xe5\x74\x08\x91\x68\x32\x25\xf5\x49\xdd\x84\x26\x14\x5c\x97\xc5\x81\x8c\x31\x9f\x7a\xb2\xd8\x68\xe1\xa4\x1c\xea\xb6\x4c\x08\x51\x16\x06\x98\x97\xbf\x2c\xa3\x66\x76\x52\x40\x61\x55\xed\x06\x46\x43\x1b\x6d\xe1\xcc\xc0\x3b\x42\x79\xae\x4d\x32\x66\x79\x26\x5d\xce\x82\x04\x8e\x72\x98\xe1\xf8\x7f\xce\xc0\x76\x8a\xc0\xf5\xd8\xff\x84\xf7\x21\x0b\xe5\x4d\x41\x1a\xf8\xed\xea\x72\x17\xf4\xe5\x94\x13\x12\x1e\x14\x8c\x60\xda"}, +{{0x77,0xa8,0x3e,0x18,0xc9,0xf0,0x00,0xee,0xff,0x7d,0xee,0xac,0x95,0x9e,0xcb,0xa2,0x20,0x6c,0x0a,0xa3,0x9d,0x2f,0x0e,0x2a,0xed,0x57,0x29,0x48,0x2a,0x7a,0x02,0x29,},{0x62,0xb1,0xb3,0x16,0x13,0x55,0x96,0xbf,0xbc,0xa6,0x03,0x7e,0xd8,0x47,0xc6,0x1f,0xb7,0xf0,0x9f,0xa3,0x6c,0xe9,0x0a,0xbb,0x77,0x89,0xb8,0x6f,0x76,0x8b,0x59,0xdd,},{0x1e,0xaa,0xd8,0x42,0x0a,0xc1,0x2c,0x99,0xac,0x1f,0xf4,0x47,0x66,0x78,0xe3,0xcb,0xbe,0x94,0xda,0x6a,0x79,0x7f,0x17,0x46,0x64,0xd5,0xee,0x0f,0x64,0x14,0x33,0xfb,0x1e,0x7c,0xb2,0xf5,0x61,0x3e,0x10,0x80,0x5d,0xf8,0x65,0x4c,0xd8,0xe0,0xd4,0x5d,0x96,0x23,0x09,0x32,0xbc,0x7f,0x20,0xb0,0x4e,0xae,0x83,0x64,0x35,0x13,0x43,0x09,},"\xf3\xd5\xfa\x2a\xca\xef\xd8\x58\xf1\xdf\x26\xe0\x30\x59\xcd\xcb\xc2\x46\x8a\xd7\x4a\xfc\x99\x3d\x0d\xb9\xc4\xcd\xe4\x11\x3f\x8d\x55\xc7\xda\x71\xd3\x8b\xa0\x65\x20\x53\x1c\x61\xfd\xdb\x5f\x33\xd5\xf0\x35\x3b\xe2\x37\x6e\x58\x07\x11\xbe\x45\xc0\xa3\x0b\x1f\xa0\x1b\x55\xe2\x28\xc6\xfa\x35\xe3\xf9\x5b\x67\x90\x9f\xc7\xdf\x3f\xd4\x64\xd9\x3d\x66\x1a\x92\x6f\x9d\x11\xf7\x55\x0c\x17\xfb\xcc\x34\x96\x52\x6e\x8f\x10\xe0\xc8\x91\x66\x77\xb2\xbe\x5b\x31\x9b\x68\x8f\x21\xe8\x1a\xaa\x94\x82\xe5\xc9\x3e\x64\xce\x8c\x43\x7b\x9c\x1e\x14\xfe\xfe\xd7\x0a\x3f\xee\x56\x88\x11\xdc\x31\xca\xda\xb3\xd5\xb2\x20\x25\x44\x65\x33\x6d\xc4\xd9\x7a\x3b\xd0\x96\xb5\xe0\x65\xe0\xcf\xbe\x82\x84\x9e\x2c\x19\x05\xac\xa4\x86\x53\x3f\x0d\xa7\xa6\x1f\x1e\x9a\x55\xb8\xe2\xa8\x32\x62\xde\xeb\x59\xf2\xb1\x3d\x3a\x8a\xef\x57\x00\x84\x5b\x83\xb2\x5a\xe2\x18\x3c\x0d\xda\xc0\xce\x42\xf8\xd2\x56\x74\xcb\x0d\x0d\x22\x0a\x6d\xe7\xc1\x85\x8b\xb0\x7d\x59\xa3\x37\x23\x44\xd9\x44\x60\x2a\xa4\x51\xd2\xb9\x37\xdb\x0f\xe6\xfe\xca\x0b\xeb\xa8\x17\x21\xfc\x36\x1e\xa7\x50\x9e\x2b\x6d\x39\x7e\x1c\x19\x1b\x56\xf5\x4a\xb4\x36\xd0\xd2\x7a\xb4\xc0\x61\xbd\x66\x1a\xd1\xa4\x45\x23\x87\xe8\x73\x57\x54\xd0\x7f\xa7\xef\x4d\x45\x48\xb1\x72\x58\x24\x25\xb2\x99\x04\x6e\x63\x01\xb5\xba\x6b\x91\x44\x18\xf1\x49\xcf\x72\x2e\x10\xbd\xe2\xe0\xd4\x17\x00\xf1\x2c\x84\x29\xfc\x89\x7b\x78\x19\xda\x92\x29\x22\x40\xcd\x45\x56\x54\x58\xc9\xa7\xb2\x9c\x12"}, +{{0x73,0xb0,0x33,0x73,0xef,0x1f,0xd8,0x49,0x00,0x5e,0xcd,0x62,0x70,0xdd,0x99,0x06,0xf1,0x9f,0x44,0x39,0xe4,0x03,0x76,0xcd,0xbc,0x52,0x09,0x02,0xbc,0x97,0x68,0x12,},{0x66,0x37,0x19,0xe0,0x8b,0xa3,0xba,0x16,0x66,0xf6,0x06,0x9a,0x3f,0x54,0x99,0x18,0x66,0xb1,0x8c,0xc6,0xbe,0x41,0x99,0x1b,0x02,0xeb,0x30,0x26,0xff,0x9e,0x15,0x5f,},{0xa4,0x0a,0xbe,0x98,0xfc,0x69,0xda,0x8a,0x1f,0xf9,0xff,0x5c,0x2c,0xca,0x93,0x63,0x2e,0x97,0x59,0x80,0xee,0x8b,0x82,0xc3,0xc3,0x76,0x02,0x2d,0x65,0x24,0xab,0x73,0x6d,0x01,0xb0,0x72,0xf2,0xb6,0x81,0xb5,0xf1,0xcd,0x3e,0xa0,0x67,0x01,0x2e,0xd6,0xd0,0x74,0xe9,0x49,0xc4,0x23,0x27,0xa3,0x66,0xca,0xa9,0xe4,0x75,0x0a,0x3c,0x08,},"\xd5\xc2\xde\xab\xa7\x95\xc3\x0a\xba\x32\x1b\xc7\xde\x69\x96\xf0\xd9\x0e\x4d\x05\xc7\x47\xfb\x4d\xae\x8f\x34\x51\x89\x5d\xef\x6e\x16\xe7\x2f\x38\xea\xce\x75\x6f\x36\x63\x5f\x8f\xb0\xb7\x2a\x3a\x0c\x1f\x54\x66\x38\x17\xa9\x4d\x4f\xd3\x46\xf8\x35\xab\x0e\x65\x7f\x00\x1a\x6f\x2c\xec\xb8\x6d\x08\x25\xbd\x02\x63\x92\x54\xf7\xf7\xf3\x8c\xa9\x9d\xbb\x86\xc6\x4a\x63\x3f\x73\xba\xf9\x33\xaa\xe3\x56\x32\x81\xf4\x00\x5e\x2d\x0e\x7c\xec\x9f\xbd\xe8\xe5\x88\xa9\x57\xe2\x11\x06\x8b\xe6\x5b\x3d\x3d\x35\xbf\x4e\x8d\x5b\xb3\x47\x83\x33\xdf\x9c\xed\x9b\x2a\xba\xf4\x86\x97\x99\x4a\x14\x5e\x93\x21\x49\x9f\xc5\xee\x56\x0f\x4f\xbb\x68\x49\xe1\xae\x8e\xb3\xd1\xde\x00\x83\xa2\x1a\x03\xf6\xa6\xb2\x81\x76\xf0\x13\x0d\x38\x95\xe5\x0e\x75\xe3\xd7\xd0\x94\x7a\x7b\xc2\xc5\xb9\xff\x69\x89\x5d\x27\x79\x14\x42\xba\x8d\x0f\x21\x80\x71\x2b\x56\x7f\x71\x2e\xa9\x12\xf3\xb0\xd9\x2c\x19\x34\x2e\x01\x06\xff\x1d\x87\xb4\x6a\xd3\x3a\xf3\x00\xb9\x08\x55\xba\x97\x69\xd3\x66\xe7\x94\x25\xd9\x8e\x4d\xe1\x99\x05\xa0\x45\x77\x70\x7c\xbe\x62\x5b\x84\x69\x17\x81\xcd\x26\xbf\x62\x26\x0b\x4a\x8b\xd6\x05\xf7\x7a\xf6\xf9\x70\xe1\xb3\xa1\x12\xe8\x91\x83\x44\xbd\x0d\x8d\x2e\x41\xdf\xd2\xce\x98\x95\xb0\x24\x6e\x50\x88\x7a\xa3\xa5\x77\xff\x73\xbe\x4b\x6a\xe6\x0f\xeb\x0c\xa3\x6f\x6a\x5f\x81\x71\xed\x20\x9e\x5c\x56\x65\x29\xc0\x94\x0d\x9b\x4b\xd7\x44\xcc\xee\x56\xe5\x4a\x9a\x0c\x6e\x4d\xa5\x20\xdd\x31\x5c\x28\x72\xb0\x2d\xb5\x63\x70\x3e"}, +{{0xea,0xb1,0x79,0xe4,0x1e,0xd5,0xc8,0x89,0xff,0xe6,0xaa,0xbd,0xc0,0x54,0xfa,0xf1,0x30,0x7c,0x39,0x5e,0x46,0xe3,0x13,0xe1,0x7a,0x14,0xfe,0x01,0x02,0x3f,0xfa,0x30,},{0x86,0xf3,0x47,0x46,0xd3,0xf7,0xa0,0x1d,0xdb,0xe3,0x22,0xf1,0xac,0xa5,0x6d,0x22,0x85,0x6d,0x38,0x73,0x3a,0x3a,0x69,0x00,0xbb,0x08,0xe7,0x76,0x45,0x0e,0xc8,0x03,},{0x14,0x3c,0xb2,0x80,0x27,0xc2,0xf8,0x2e,0x37,0x5e,0x5f,0x34,0x0e,0x7f,0xe6,0xe6,0x0c,0xe7,0xbd,0x51,0x00,0x0b,0x49,0xc7,0x41,0x68,0xaf,0x85,0xe2,0x6e,0xd2,0xed,0x63,0x0e,0xd2,0x67,0x20,0x90,0x16,0x4c,0xc5,0x4b,0x05,0x2d,0xa6,0x94,0xeb,0xdd,0x21,0xa2,0x1b,0x30,0x53,0xf4,0xdc,0xfd,0x78,0x95,0xea,0x5f,0x6c,0x8a,0xa8,0x0d,},"\x97\x10\x95\xce\xbe\x50\x31\x53\x02\x24\x38\x7c\x5c\x31\x96\x6e\x38\x9b\x85\x66\x39\x00\x54\xcf\x45\x26\x4b\x44\xe1\x89\x64\xb7\xbe\x52\xc3\x3c\x4f\xfb\x25\x9a\xf1\x62\x83\x43\x8f\xa1\x5d\xd6\x6b\xc7\x79\x1b\x75\x33\xef\x10\xcb\x0b\xea\xb5\x24\xa6\x43\x76\x26\xf4\xcc\x74\x51\x28\x51\xad\xcc\x2f\xb1\x29\x05\x5a\x48\x2c\x61\x10\x73\x83\xfb\x7c\x52\x41\x83\x1d\x55\x51\x63\x4e\xef\x0d\xc0\xb8\xf9\x05\x3a\x00\x97\x1a\xa8\xfa\x1a\xe0\x89\x8e\x4b\x48\x1b\x67\x07\xe9\x7c\x0f\x94\x20\x40\xb3\x39\xd9\x2f\xc1\x7b\xba\xde\x74\x67\x5a\xf2\x43\xd8\xb2\xda\xfb\x15\xb1\xdb\x55\xd1\x24\x15\xb8\x5f\x30\x37\x29\x19\x30\xab\x61\x60\x0b\xa3\x43\x1f\x8e\xb4\x25\xbe\x44\x91\x61\x47\x28\xaf\x10\x1e\x81\xc0\x91\xf3\x48\xbc\x5f\xfd\x1b\xde\x6a\xe6\xca\xd5\xc1\x5b\x3a\xa7\x35\x80\x78\xcc\x4e\xff\xb5\x4a\x86\xe7\xf0\xe0\xc5\x5e\x4c\xfe\x0a\x54\x60\x5e\xd4\x43\xfd\xf2\xaa\xba\x01\x65\x85\xda\x61\x7e\x77\x34\x1d\x52\x88\x9d\x75\xdd\x54\x0d\x39\xfe\x8b\x79\x93\xed\x70\x5c\xfd\xde\xa0\xcb\x0d\x5a\x73\x1d\x6b\xfc\xdb\x81\x6a\xfa\xff\x47\xe9\x63\xee\xde\xbd\xf2\x41\xaf\x55\x93\x35\x3d\x6d\x40\x1a\x34\xf0\x29\xa8\xcd\xeb\x19\x04\xcc\x2c\xaa\x4f\x96\x35\xcc\x2b\xa6\xb7\xb1\xa2\x9d\xa6\x25\xff\xc3\x83\xbe\x2f\x5a\x8f\x1f\xa4\xf3\x9b\x2d\x4b\x4f\x4c\x2d\x88\x38\xce\x25\x8a\x04\xd4\xa1\x20\x49\x3f\xdf\x07\xf6\x8c\x0f\xfd\x1c\x16\xb7\x68\xa3\x5c\x55\xfe\xa2\xca\xc6\x96\xb5\xc2\x0e\xfc\x10\x86\x5c\xde\x8a\x64\x62\x7d\xcd"}, +{{0xfb,0xf1,0x46,0xeb,0xd5,0x10,0x75,0x57,0x0e,0xc5,0x1a,0xc4,0x10,0xae,0x9f,0x39,0x1d,0xb7,0x5b,0x61,0x0a,0xda,0x63,0x62,0xb4,0xdb,0xd9,0x49,0x65,0x6c,0xfb,0x66,},{0xbe,0x7c,0x2f,0x5b,0x21,0xd7,0x46,0xc8,0xea,0x32,0x45,0xce,0x6f,0x26,0x8e,0x9d,0xa7,0x4e,0x00,0xfa,0x85,0xc9,0xc4,0x75,0x26,0x0c,0x68,0xfa,0x1a,0xf6,0x36,0x1f,},{0x67,0x68,0x00,0x6f,0xe0,0xf2,0x01,0xb2,0x17,0xdd,0x10,0xeb,0x05,0xd4,0xb8,0x2a,0xdc,0xfe,0xb2,0xec,0xfc,0x83,0x73,0xc3,0x30,0x8f,0x41,0x50,0x39,0x48,0x11,0xeb,0x60,0x49,0x18,0x81,0xa2,0xe5,0x3d,0x12,0x89,0xd9,0x64,0x78,0xe1,0x8a,0x64,0xc3,0x4b,0x2a,0x19,0x83,0x2c,0xdc,0xcf,0xd9,0x6a,0x2e,0x4a,0x0c,0x46,0x9f,0xdc,0x0b,},"\xcd\x7a\xd4\xf1\x7f\xcf\xf7\x3a\xcc\x40\x2d\xc1\x02\xd0\x90\x79\xb2\x9a\xaf\x2a\x0f\x4b\x27\xcf\x6b\xee\xb1\xe2\xb2\x3d\x19\xab\x47\xde\xb3\xae\x1b\xec\xd6\x88\x61\xea\x27\x9c\x46\x69\x17\x38\xf4\xff\xf4\x7c\x43\x04\x7c\x4f\x8b\x56\xb6\xbb\xcc\x3f\xde\x07\x23\xd4\x41\x20\xdc\xd3\x07\xa6\x31\x0d\xc4\xf3\x66\xb8\xf3\xcd\x52\xdb\x19\xb8\x26\x6a\x48\x7f\x78\x72\x39\x1c\x45\xfe\x0d\x32\x48\xa7\xab\xf2\xc2\x00\x22\xd3\x76\x95\x47\xf6\x83\x06\x7d\xcc\x36\x3c\xd2\x2f\xd7\xcd\xa3\xca\xdc\x15\x80\x40\x56\xf0\xe2\xaa\x2b\x79\x50\x08\xc5\x98\xbe\x7a\x96\x18\x05\xe6\xdf\x29\x1b\xa3\x04\x1c\x47\xff\x56\x40\x27\x5f\x46\xe6\xae\x82\x09\x2d\x21\xab\xcb\xcf\xba\x11\xe7\x30\x21\x60\x08\x82\x2d\xe3\xce\x46\x24\x00\x59\x6d\xa7\x9f\x7a\xe5\xd1\xdf\x83\x89\x11\x2a\xd9\x88\x68\xfa\x94\xfb\x05\x46\xbf\xe6\xa6\x7a\xa8\xd2\x8c\x4d\x32\x07\x2d\x2e\xad\xd6\x25\x62\x55\xf1\x8c\x23\x82\xe6\x62\xdf\xa9\x22\xa6\x80\xe0\x6a\x43\x62\x2c\x48\x71\xd2\x7d\x18\x07\xf7\xb2\x70\x30\x70\xc8\x3d\xb8\xdd\x92\x9c\x06\x03\x8b\x21\x83\xcb\x8e\x2b\x9e\xc4\xc7\x78\xd7\xec\xf9\xe9\xff\xac\x77\xfa\x77\x37\xb0\x55\xfe\xac\x2e\x79\x82\xae\xee\xc0\xb7\x2f\x1b\xbc\xa2\x42\x4e\x1a\x84\x4b\xba\xc7\x9c\xb2\xe7\x40\x0f\x81\xdc\x44\x9d\x05\x60\xb5\x21\xa7\xc1\x6b\xb4\x16\x7e\x66\x96\x58\x60\x58\xa9\xb8\xed\x2e\x51\x16\x69\x0b\x77\xf2\xa1\x7e\x5c\x0b\x16\xa8\x3d\xcb\xd2\xe2\x45\x52\x29\x3e\x25\x8b\x32\xba\x7f\x84\x49\x44\x37\x93\x42\x69\x86\x27"}, +{{0xdf,0xf0,0xeb,0x6b,0x42,0x6d,0xea,0x2f,0xd3,0x3c,0x1d,0x3f,0xc2,0x4d,0xf9,0xb3,0x1b,0x48,0x6f,0xac,0xb7,0xed,0xb8,0x50,0x29,0x54,0xa3,0xe8,0xda,0x99,0xd9,0xfd,},{0xc2,0x45,0x08,0x5e,0xce,0x69,0xfb,0x9a,0xa5,0x60,0xd0,0xc2,0x7f,0xdb,0x63,0x4f,0x7a,0x84,0x0d,0x41,0xd8,0x46,0x36,0x60,0xfb,0xe8,0x24,0x83,0xb0,0xf3,0xcc,0x3a,},{0x6b,0x48,0xb1,0x0f,0x54,0x5d,0xdb,0x7a,0x89,0xcd,0x58,0x29,0xf4,0xe5,0xb2,0x01,0x46,0xcf,0x6b,0xc9,0x6e,0x55,0x0d,0x06,0xf6,0x5d,0xe8,0xbd,0xae,0x7c,0xcd,0xde,0xd2,0x6c,0xd6,0x30,0xf8,0x6c,0x92,0x66,0xbc,0xcf,0x88,0xe9,0x24,0x03,0x3e,0x04,0xf8,0x3a,0x54,0xf8,0x29,0x0d,0x7f,0x73,0x4c,0xf8,0x67,0x3c,0xca,0x8f,0x97,0x03,},"\xe7\xc9\xe3\x13\xd8\x61\x60\xf4\xc7\x4a\xa0\xae\x07\x36\x9e\xe2\x2b\x27\xf8\x1b\x3f\x69\x09\x7a\xff\xae\x28\xda\xe4\x84\x83\xfb\x52\xa5\xc0\x62\x30\x6b\x59\x61\x0f\x5c\xdb\xff\x63\x32\xb1\x96\x0c\xd6\xf2\xb8\xf7\xb4\x15\x78\xc2\x0f\x0b\xc9\x63\x7a\x0f\xdf\xc7\x39\xd6\x1f\x69\x9a\x57\x3f\x1c\x1a\x0b\x49\x29\x45\x06\xcf\x44\x87\x96\x5e\x5b\xb0\x7b\xbf\x81\x80\x3c\xb3\xd5\xcb\x38\x29\xc6\x6c\x4b\xee\x7f\xc8\x00\xed\xe2\x16\x15\x09\x34\xd2\x77\xde\xa5\x0e\xdb\x09\x7b\x99\x2f\x11\xbb\x66\x9f\xdf\x14\x0b\xf6\xae\x9f\xec\x46\xc3\xea\x32\xf8\x88\xfd\xe9\xd1\x54\xea\x84\xf0\x1c\x51\x26\x5a\x7d\x3f\xef\x6e\xef\xc1\xcc\xdb\xff\xd1\xe2\xc8\x97\xf0\x55\x46\xa3\xb1\xca\x11\xd9\x51\x7c\xd6\x67\xc6\x60\xec\x39\x60\xf7\xa8\xe5\xe8\x02\x02\xa7\x8d\x3a\x38\x8b\x92\xf5\xc1\xde\xe1\x4a\xe6\xac\xf8\xe1\x7c\x84\x1c\x95\x57\xc3\x5a\x2e\xec\xed\x6e\x6a\xf6\x37\x21\x48\xe4\x83\xcc\xd0\x6c\x8f\xe3\x44\x92\x4e\x10\x19\xfb\x91\xcb\xf7\x94\x1b\x9a\x17\x6a\x07\x34\x15\x86\x72\x10\x67\x04\x10\xc5\xdb\xd0\xac\x4a\x50\xe6\xc0\xa5\x09\xdd\xfd\xc5\x55\xf6\x0d\x69\x6d\x41\xc7\x7d\xb8\xe6\xc8\x4d\x51\x81\xf8\x72\x75\x5e\x64\xa7\x21\xb0\x61\xfc\xd6\x8c\x46\x3d\xb4\xd3\x2c\x9e\x01\xea\x50\x12\x67\xde\x22\x87\x9d\x7f\xc1\x2c\x8c\xa0\x37\x9e\xdb\x45\xab\xaa\x6e\x64\xdd\xa2\xaf\x6d\x40\xcc\xf2\x4f\xbe\xba\xd7\xb5\xa8\xd3\xe5\x20\x07\x94\x5e\xcd\x3d\xdc\x1e\x3e\xfe\xb5\x22\x58\x1a\xc8\x0e\x98\xc8\x63\xba\x0c\x59\x0a\x3e\xd9\x5c\xd1"}, +{{0x9f,0x32,0x95,0x8c,0x76,0x79,0xb9,0x0f,0xd5,0x03,0x60,0x56,0xa7,0x5e,0xc2,0xeb,0x2f,0x56,0xec,0x1e,0xff,0xc7,0xc0,0x12,0x46,0x1d,0xc8,0x9a,0x3a,0x16,0x74,0x20,},{0x1d,0x72,0x69,0xdc,0xb6,0xd1,0xf5,0x84,0xe6,0x62,0xd4,0xce,0x25,0x1d,0xe0,0xab,0xa2,0x90,0xef,0x78,0xb9,0x7d,0x44,0x8a,0xfb,0x1e,0x53,0x33,0xf1,0x97,0x6d,0x26,},{0x98,0x81,0xa5,0x76,0x3b,0xdb,0x25,0x9a,0x3f,0xef,0xbb,0xa3,0xd9,0x57,0x16,0x2d,0x6c,0x70,0xb8,0x04,0xfa,0x94,0xab,0x61,0x34,0x06,0xa6,0xec,0x42,0x50,0x5b,0x87,0x89,0x46,0x5c,0xa1,0xa9,0xa3,0x3e,0x18,0x95,0x98,0x88,0x42,0x27,0x0c,0x55,0xe5,0xbd,0xd5,0x48,0x3f,0x6b,0x17,0xb3,0x17,0x81,0xb5,0x93,0x50,0x7a,0x6c,0x18,0x08,},"\xa5\x6b\xa8\x6c\x71\x36\x05\x04\x08\x7e\x74\x5c\x41\x62\x70\x92\xad\x6b\x49\xa7\x1e\x9d\xaa\x56\x40\xe1\x04\x4b\xf0\x4d\x4f\x07\x1a\xd7\x28\x77\x9e\x95\xd1\xe2\x46\x05\x84\xe6\xf0\x77\x35\x45\xda\x82\xd4\x81\x4c\x91\x89\xa1\x20\xf1\x2f\x3e\x38\x19\x81\x3e\x5b\x24\x0d\x0f\x26\x43\x6f\x70\xee\x35\x3b\x4d\x20\xce\xa5\x4a\x14\x60\xb5\xb8\xf1\x00\x8d\x6f\x95\xf3\xaa\x2d\x8f\x1e\x90\x8f\xce\xd5\x0d\x62\x4e\x3a\x09\x69\x38\xb9\x35\x38\x54\xb9\x6d\xa4\x63\xa2\x79\x8a\x5a\x31\x2e\xc7\x90\x84\x2c\x10\xc4\x46\xe3\x35\x0c\x76\x4b\xf5\xc9\x72\x59\x3b\x99\x87\xbf\x23\x25\x6d\xaa\x88\x94\xd4\x7f\x22\xe8\x5b\x97\x60\x7e\x66\xfc\x08\xa1\x2c\x78\x9c\x47\x46\x08\x03\x68\xd3\x21\xbb\x90\x15\xa1\x15\x5b\x65\x52\x3a\xd8\xe9\x9b\xb9\x89\xb4\x4e\xac\x75\x6b\x07\x34\xac\xd7\xc6\x35\x7c\x70\xb5\x97\x43\x24\x6d\x16\x52\xd9\x1b\x0f\x98\x96\x96\x51\x41\x34\x5b\x99\x45\xcf\x34\x98\x04\x52\xf3\x50\x29\x74\xed\xb7\x6b\x9c\x78\x5f\xb0\xf4\x39\x52\x66\xb0\x55\xf3\xb5\xdb\x8a\xab\x68\xe9\xd7\x10\x2a\x1c\xd9\xee\x3d\x14\x25\x04\xf0\xe8\x8b\x28\x2e\x60\x3a\x73\x8e\x05\x1d\x98\xde\x05\xd1\xfc\xc6\x5b\x5f\x7e\x99\xc4\x11\x1c\xc0\xae\xc4\x89\xab\xd0\xec\xad\x31\x1b\xfc\x13\xe7\xd1\x65\x3b\x9c\x31\xe8\x1c\x99\x80\x37\xf9\x59\xd5\xcd\x98\x08\x35\xaa\x0e\x0b\x09\xbc\xbe\xd6\x34\x39\x11\x51\xda\x02\xbc\x01\xa3\x6c\x9a\x58\x00\xaf\xb9\x84\x16\x3a\x7b\xb8\x15\xed\xbc\x02\x26\xed\xa0\x59\x5c\x72\x4c\xa9\xb3\xf8\xa7\x11\x78\xf0\xd2\x0a\x5a"}, +{{0xf8,0x6d,0x6f,0x76,0x6f,0x88,0xb0,0x07,0x17,0xb7,0xd6,0x32,0x7e,0xb2,0x6c,0xf3,0xce,0xeb,0xa5,0x38,0x51,0x84,0x42,0x6f,0x9c,0xfd,0x82,0x95,0xe2,0x42,0x1f,0xf2,},{0xcb,0x1d,0x25,0x05,0x04,0x75,0x41,0x83,0x70,0x4d,0xbe,0x21,0xc3,0x23,0xd6,0x6f,0x9f,0x90,0x11,0x75,0x8f,0x6d,0x8d,0xab,0x6f,0x59,0x7b,0x19,0x96,0x62,0x14,0x5b,},{0xec,0x61,0xc0,0xb2,0x92,0x20,0x3a,0x8f,0x1d,0x87,0x23,0x5e,0xde,0x92,0xb7,0x47,0x23,0xc8,0xd2,0x34,0x08,0x42,0x37,0x73,0xae,0x50,0xb1,0xe9,0xbc,0x44,0x64,0xe0,0x3e,0x44,0x6d,0xa9,0xdc,0xe4,0xc3,0x9f,0x6d,0xd1,0x59,0xbe,0xa2,0x6c,0x00,0x9e,0xd0,0x01,0x20,0xbc,0x36,0xd4,0xa2,0x47,0xdc,0x0d,0x24,0xbc,0xef,0xcc,0x11,0x0c,},"\xda\x84\x23\xa6\xb7\xa1\x8f\x20\xaa\x1f\x90\xed\x23\x31\xb1\x7b\x24\x06\x7c\x40\x17\x5b\xc2\x5d\x81\x09\xe2\x1d\x87\xac\x00\x52\x8e\xb3\xb2\xf6\x6a\x2b\x52\xdc\x7e\xf2\xf8\xce\xcb\x75\xc7\x60\x99\xcf\xa2\x3d\xb8\xda\x89\x70\x43\xba\x1c\xce\x31\xe2\xdf\xea\x46\x07\x5f\x5e\x07\x32\x03\xea\xeb\x3d\x62\xc8\x4c\x10\x7b\x6d\xab\x33\xa1\x4e\xaf\x14\x9a\xa6\x18\x50\xc1\x5f\x5a\x58\xd8\x8a\x15\xab\xa9\x19\x6f\x9e\x49\x5e\x8d\xbe\xcb\xcf\x7e\x84\x44\xf5\xdd\x72\xa0\x8a\x09\x9d\x7f\x62\x09\x99\x0b\x56\x29\x74\xea\x82\x9e\xf1\x1d\x29\xa9\x20\xe3\xa7\x99\xd0\xd9\x2c\xb5\x0d\x50\xf8\x17\x63\x1a\xb0\x9d\xe9\x7c\x31\xe9\xa0\x5f\x4d\x78\xd6\x49\xfc\xd9\x3a\x83\x75\x20\x78\xab\x3b\xb0\xe1\x6c\x56\x4d\x4f\xb0\x7c\xa9\x23\xc0\x37\x4b\xa5\xbf\x1e\xea\x7e\x73\x66\x8e\x13\x50\x31\xfe\xaf\xcb\xb4\x7c\xbc\x2a\xe3\x0e\xc1\x6a\x39\xb9\xc3\x37\xe0\xa6\x2e\xec\xdd\x80\xc0\xb7\xa0\x49\x24\xac\x39\x72\xda\x4f\xa9\x29\x9c\x14\xb5\xa5\x3d\x37\xb0\x8b\xf0\x22\x68\xb3\xba\xc9\xea\x93\x55\x09\x0e\xeb\x04\xad\x87\xbe\xe0\x59\x3b\xa4\xe4\x44\x3d\xda\x38\xa9\x7a\xfb\xf2\xdb\x99\x52\xdf\x63\xf1\x78\xf3\xb4\xc5\x2b\xcc\x13\x2b\xe8\xd9\xe2\x68\x81\x21\x3a\xbd\xeb\x7e\x1c\x44\xc4\x06\x15\x48\x90\x9f\x05\x20\xf0\xdd\x75\x20\xfc\x40\x8e\xa2\x8c\x2c\xeb\xc0\xf5\x30\x63\xa2\xd3\x05\x70\xe0\x53\x50\xe5\x2b\x39\x0d\xd9\xb6\x76\x62\x98\x48\x47\xbe\x9a\xd9\xb4\xcd\x50\xb0\x69\xff\xd2\x9d\xd9\xc6\x2e\xf1\x47\x01\xf8\xd0\x12\xa4\xa7\x0c\x84\x31\xcc"}, +{{0xa5,0xb3,0x4c,0xef,0xab,0x94,0x79,0xdf,0x83,0x89,0xd7,0xe6,0xf6,0xc1,0x46,0xaa,0x8a,0xff,0xb0,0xbe,0xc8,0x37,0xf7,0x8a,0xf6,0x46,0x24,0xa1,0x45,0xcc,0x34,0x4e,},{0x7b,0x0f,0x4f,0x24,0xd9,0x97,0x2b,0xc6,0xfe,0x83,0x82,0x6c,0x52,0x71,0x6a,0xd1,0xe0,0xd7,0xd1,0x9f,0x12,0x38,0x58,0xcb,0x3e,0x99,0xfa,0x63,0x6a,0xc9,0x63,0x1a,},{0x2f,0xbd,0x89,0x9d,0x72,0xb6,0xd3,0x9e,0x4f,0x45,0xb8,0xb6,0x2c,0xbb,0xd5,0xf3,0xc0,0xac,0xb1,0xad,0x85,0x40,0x91,0x3f,0xa5,0x85,0x87,0x7e,0x91,0xcc,0xfe,0xf7,0xbe,0xe5,0x0a,0x4b,0x0f,0x9f,0xed,0xf5,0xcc,0x1e,0x0d,0x19,0x53,0xad,0x39,0x9c,0x83,0x89,0xa9,0x33,0x91,0xe1,0xb7,0xc9,0x29,0xaf,0x6d,0x6f,0x3b,0x79,0x6c,0x08,},"\xe2\x1e\x98\xaf\x6c\x2b\xac\x70\x55\x7e\xb0\xe8\x64\xda\x2c\x2b\x4d\x6c\x0a\x39\xa0\x59\xd3\x47\x72\x51\xf6\x17\x8a\x39\x67\x6f\x47\x49\xe7\xfb\xea\x62\x3f\x14\x8a\x43\xa8\xb0\xfe\x06\x10\x50\x6f\xa6\x58\xab\xd2\xf5\xfa\x39\x19\x8f\x26\x36\xb7\x24\xdb\x22\xd1\xae\xbc\x2a\xb0\x7b\x2b\x6d\xbf\xfd\xee\x8c\xec\xe8\x1e\x1a\xf1\x49\x3e\xc1\x96\x4e\x16\xbf\x86\xab\x25\x8c\xa0\xfe\xb7\x7e\x3c\x87\x17\xe4\x40\x38\xab\xe1\x52\xc1\x4b\xe1\x56\x60\xbf\x93\xb2\xd4\x8d\x92\xc4\xed\x70\x74\xd2\x49\x42\x10\x62\x1b\xcf\x20\x4f\xba\x88\xc6\x54\xd5\xff\xe0\x1e\x1a\x53\xd0\x8f\x70\xbb\x23\x70\x89\xdc\x80\x72\x16\xff\x6a\x85\xdb\xec\x31\x02\x23\x7d\x42\x59\x07\x78\xac\xf6\xc1\xdc\x56\x6d\x5a\x2b\xb9\xa6\x3b\xc2\x1c\x32\x9c\x27\x2e\x59\x65\xba\xee\xb0\xfe\x89\x1d\xe3\xcc\x8c\xbf\xa8\xe5\x41\xa8\x88\x1d\xf6\x89\x42\xe7\xff\x8d\xc6\x56\xbd\x08\x57\x5f\x6a\xaf\x92\x4a\x17\x6d\x66\x3b\x1a\x1f\x43\x57\x4d\x11\x76\x8c\x70\x1b\x26\x95\x61\xe5\x54\x38\xdb\xeb\xfd\x44\x3d\x21\x15\xcb\x93\x3d\x1c\xde\x4a\x91\x5b\x54\xc3\x25\xc2\x7f\x49\x9e\xf0\x2b\xd0\x12\xff\x1f\x9a\x36\x39\x09\x22\x88\x76\x00\xfe\x71\x2b\xcd\xc2\x3e\xb5\x97\x4a\x30\x53\x72\xad\x52\x95\x1f\x83\xf0\xe5\x8c\xc4\x9e\x28\x98\x41\x62\x19\x17\xf1\xfc\xb0\x23\x51\x47\x24\x0d\xae\x4c\xf3\xb9\x9b\x6a\xc6\xd8\xde\x94\xef\xe7\xc4\x43\x67\x14\x50\x8b\xcd\x01\x14\xc5\x60\x68\xff\x1b\x7c\x16\xd5\x1b\xd9\x06\x43\x78\x74\xd6\x54\x9a\xb5\xd8\x08\x78\x96\x87\x2e\xc8\xa0\x9d\x74\x12"}, +{{0xad,0x75,0xc9,0xce,0x29,0x9c,0x4d,0x59,0x39,0x33,0x67,0xd7,0x7a,0x4c,0x9f,0x8d,0xf8,0xdc,0xec,0x76,0x5c,0x6d,0xbd,0x25,0xb5,0x27,0xfb,0x76,0x69,0x91,0x36,0x04,},{0xb9,0x91,0x05,0x48,0xfe,0x63,0x12,0xa1,0x19,0xc9,0x99,0x3e,0xeb,0xcf,0xb9,0xdc,0x90,0x03,0x0f,0xfb,0x0e,0x4d,0xe2,0xb7,0xcc,0xd2,0x3c,0xbe,0xb4,0xfe,0xf7,0x1b,},{0x6b,0x7e,0xf2,0x7b,0xcf,0xbf,0x2b,0x71,0x49,0x85,0x03,0x37,0x64,0xfc,0xcf,0xf5,0x55,0xe3,0xf5,0xbc,0x44,0x61,0x0d,0x6c,0x8c,0x62,0x11,0x7c,0xb3,0x83,0x1a,0x07,0xf4,0xa8,0xbd,0xdb,0x0e,0xae,0xd1,0xd4,0x6b,0x02,0x89,0xb1,0x5d,0xe1,0xaa,0x4d,0xcc,0x17,0xd7,0x1b,0xe9,0x6a,0x09,0xe6,0x6b,0xa4,0xdc,0x46,0x27,0xc7,0x87,0x05,},"\x62\xfc\x5a\xb6\x7d\xeb\x1f\xee\x9a\xb6\xcc\xa3\xb8\x8a\x1d\xf1\xe5\x89\xf0\xfd\x4a\x88\xf4\xaa\x77\x38\x94\x87\x61\xfe\x84\x37\x2c\x5b\x18\xe4\x65\x52\x20\xc1\xd8\x4d\x52\xac\xad\x32\xe2\x29\xa5\xc7\x56\xc2\x0f\xc6\x2f\xe4\xb4\xb4\xe5\xfd\x70\x77\xae\x4e\xd5\x39\x7a\xa7\x96\xf2\x30\x7c\xee\xdb\x65\x05\xb3\x92\x97\x85\x6f\x4a\xeb\x5e\x70\x93\x8e\x36\xee\x24\xa0\xac\x7d\x98\x68\x30\x6f\x6b\x53\x91\x06\x23\xb7\xdc\x89\xa6\x67\x2a\xd7\x38\x57\x6e\xd5\xd8\x88\x31\xdd\x33\x83\x21\xc8\x90\x2b\xc2\x06\x1f\x65\xe9\x4d\x45\x2f\xdf\xa0\xdc\x66\x5c\xef\xb9\x23\x08\xe5\x23\x01\xbd\x46\x27\x00\x6b\x36\x3d\x06\xb7\x75\xa3\x95\x91\x4d\x8c\x86\x3e\x95\xa0\x0d\x68\x93\xf3\x37\x61\x34\xc4\x29\xf5\x64\x78\x14\x5e\x44\x56\xf7\xa1\x2d\x65\xbb\x2b\x89\x65\xd7\x28\xcb\x2d\xdb\xb7\x08\xf7\x12\x5c\x23\x70\x95\xa9\x21\x95\xd9\x2f\xa7\x27\xa3\x72\xf3\x54\x5a\xe7\x01\xf3\x80\x8f\xee\x80\x2c\x89\x67\xa7\x6e\x8a\x94\x0e\x55\xfb\x2d\x81\x0b\xfb\x47\xad\xa1\x56\xf0\xed\xa1\x82\x9b\x15\x9c\xf0\x5c\x7f\x36\xcf\x38\x47\xd7\xb2\x1d\xe8\x4c\x3d\xc0\xfe\x65\x83\x47\xf7\x93\x96\xa0\x11\x39\xa5\x08\xb6\x00\x22\xdb\x1c\x0e\x5a\xee\xf4\x7e\x44\x5e\x66\xf7\x83\xe6\x2c\x96\x59\x7b\xdb\x16\xf2\x09\xc0\x8a\x91\x32\xc7\x57\x31\x36\x17\x0e\xe3\xeb\xf2\x42\x61\x26\x5a\x89\xfb\x4f\x10\x33\x33\x75\xe2\x0b\x33\xab\x74\x03\x46\x4f\x52\x49\x46\x1c\x68\x53\xc5\xfd\xdb\x9f\x58\xaf\x81\x68\x92\x91\x03\x93\xa7\x07\x7b\x79\x9f\xdc\x34\x89\x72\x09\x98\xfe\xea\x86"}, +{{0x1c,0xed,0x57,0x45,0x29,0xb9,0xb4,0x16,0x97,0x7e,0x92,0xeb,0x39,0x44,0x8a,0x87,0x17,0xca,0xc2,0x93,0x4a,0x24,0x3a,0x5c,0x44,0xfb,0x44,0xb7,0x3c,0xcc,0x16,0xda,},{0x85,0xe1,0x67,0xd5,0xf0,0x62,0xfe,0xe8,0x20,0x14,0xf3,0xc8,0xb1,0xbe,0xae,0xd8,0xee,0xfb,0x2c,0x22,0xd8,0x64,0x9c,0x42,0x4b,0x86,0xb2,0x1b,0x11,0xeb,0x8b,0xda,},{0xe0,0x30,0x3a,0xef,0xe0,0x8a,0x77,0x73,0x8d,0xcc,0x65,0x7a,0xfb,0xb9,0xb8,0x35,0xed,0x27,0x96,0x13,0xa5,0x3c,0x73,0xfd,0xc5,0xdd,0xbf,0xb3,0x50,0xe5,0xcf,0xf4,0xd6,0xc9,0xbb,0x43,0xdc,0x07,0xc9,0x5b,0xf4,0xe2,0x3b,0x64,0xc4,0x0f,0x88,0x04,0xc7,0x16,0x99,0x52,0xe3,0xc8,0xd5,0x9a,0x71,0x97,0x24,0x1b,0xfe,0xd0,0x74,0x0f,},"\x1b\x3b\x95\x3c\xce\x6d\x15\x30\x3c\x61\xca\x70\x76\x09\xf7\x0e\x72\x50\xf6\xc0\xde\xba\x56\xa8\xce\x52\x2b\x59\x86\x68\x96\x51\xcd\xb8\x48\xb8\x42\xb2\x22\x96\x61\xb8\xee\xab\xfb\x85\x70\x74\x9e\xd6\xc2\xb1\x0a\x8f\xbf\x51\x50\x53\xb5\xea\x7d\x7a\x92\x28\x34\x9e\x46\x46\xf9\x50\x5e\x19\x80\x29\xfe\xc9\xce\x0f\x38\xe4\xe0\xca\x73\x62\x58\x42\xd6\x4c\xaf\x8c\xed\x07\x0a\x6e\x29\xc7\x43\x58\x6a\xa3\xdb\x6d\x82\x99\x3a\xc7\x1f\xd3\x8b\x78\x31\x62\xd8\xfe\x04\xff\xd0\xfa\x5c\xbc\x38\x1d\x0e\x21\x9c\x91\x93\x7d\xf6\xc9\x73\x91\x2f\xc0\x2f\xda\x53\x77\x31\x24\x68\x27\x4c\x4b\xee\x6d\xca\x7f\x79\xc8\xb5\x44\x86\x1e\xd5\xba\xbc\xf5\xc5\x0e\x14\x73\x49\x1b\xe0\x17\x08\xac\x7c\x9f\xf5\x8f\x1e\x40\xf8\x55\x49\x7c\xe9\xd7\xcc\x47\xb9\x41\x0f\x2e\xdd\x00\xf6\x49\x67\x40\x24\x3b\x8d\x03\xb2\xf5\xfa\x74\x2b\x9c\x63\x08\x67\xf7\x7a\xc4\x2f\x2b\x62\xc1\x4e\x5e\xbd\xdc\x7b\x64\x7a\x05\xff\xf4\x36\x70\x74\x5f\x28\x51\xef\xf4\x90\x9f\x5d\x27\xd5\x7a\xe8\x7f\x61\xe9\x65\xee\x60\xfd\xf9\x77\x24\xc5\x92\x67\xf2\x61\x0b\x7a\xd5\xde\x91\x98\x56\xd6\x4d\x7c\x21\x26\x59\xce\x86\x56\x14\x9b\x6a\x6d\x29\xd8\xf9\x2b\x31\x2b\xe5\x0b\x6e\x2a\x43\x1d\x36\xae\x02\x2b\x00\xa6\xfe\x36\x0e\x3a\xf6\x54\x32\x89\x9c\x43\xbe\x04\x27\xe3\x6d\x21\xcf\xec\x81\xf2\x1a\xa5\x3b\x33\xdb\x5e\xd2\xc3\x7d\xa8\xf9\x6a\xc3\xe7\xdc\x67\xa1\xde\x37\x54\x6c\xf7\xde\x10\x08\xc7\xe1\xad\xbe\x0f\x34\xfa\x7e\xb2\x43\x4d\x94\xe6\xa1\x3f\x4c\xf8\x6a\x98\xd4\x97\x62\x2f"}, +{{0xf0,0x79,0x0d,0x93,0xe2,0xd3,0xb8,0x4f,0x61,0xef,0x4c,0x80,0x71,0x47,0xab,0xa4,0x10,0xe4,0x15,0xe7,0x2b,0x71,0xb0,0xd6,0x1d,0x01,0x02,0x6f,0xed,0x99,0xda,0x3d,},{0xef,0xdf,0x64,0x9f,0xb0,0x33,0xcf,0x32,0x8e,0x0b,0x28,0x77,0x96,0xf8,0xa2,0x5e,0x9c,0x6e,0x2e,0x87,0x1b,0x33,0xc2,0xc2,0x1a,0x40,0x28,0xa8,0xa2,0x5a,0x4b,0x28,},{0x08,0x77,0x3a,0x6a,0x78,0x76,0x2c,0xbb,0x1e,0x25,0xfc,0xbb,0x29,0x13,0x99,0x41,0xbd,0xf1,0x6f,0x4e,0x09,0xa1,0xfa,0x08,0xfc,0x70,0x1f,0x32,0xf9,0x33,0xed,0xd7,0x4c,0x0a,0xe9,0x83,0xc1,0x2a,0x0a,0x5b,0x02,0x0b,0x6b,0xcf,0x44,0xbb,0x71,0x9d,0xde,0x8e,0xd0,0x78,0x1a,0x82,0x98,0x26,0x56,0x40,0xe1,0x60,0x8c,0x98,0xb3,0x01,},"\x79\x73\xe9\xf3\x2d\x74\x80\x59\x92\xeb\x65\xda\x0d\x63\x73\x35\xe5\x0e\xff\x0c\xe6\x8e\xa2\xd1\xf3\xa0\x2d\xe7\x04\x49\x2b\x9c\xfb\xe7\xe7\xba\x96\xfd\xb4\x2b\xb8\x21\xa5\x13\xd7\x3f\xc6\x04\x02\xe9\x2c\x85\x5d\xea\xed\x73\xff\xea\xf7\x09\x52\x02\x90\x62\xc8\x33\xe1\x4e\xc1\xb1\x4f\x14\x4e\x22\x07\xf6\xa0\xe7\x27\xe5\xa7\xe3\xcb\xab\x27\xd5\x97\x29\x70\xf6\x95\x18\xa1\x5b\x09\x3e\x74\x0c\xc0\xce\x11\xbf\x52\x48\xf0\x82\x6b\x8a\x98\xbd\xe8\xbf\x2c\x70\x82\xc9\x7a\xff\x15\x8d\x08\x37\x11\x18\xc8\x90\x21\xcc\x39\x74\xae\x8f\x76\xd8\x66\x73\xc3\xf8\x24\xb6\x2c\x79\xc4\xb4\x1f\x40\xea\xa8\x94\x37\x38\xf0\x33\x00\xf6\x8c\xbe\x17\x54\x68\xeb\x23\x5a\x9f\xf0\xe6\x53\x7f\x87\x14\xe9\x7e\x8f\x08\xca\x44\x4e\x41\x19\x10\x63\xb5\xfa\xbd\x15\x6e\x85\xdc\xf6\x66\x06\xb8\x1d\xad\x4a\x95\x06\x55\x84\xb3\xe0\x65\x8c\x20\xa7\x06\xea\xf4\xa0\x77\x7d\xa4\xd2\xe0\xcd\x2a\x0f\xca\x60\x10\x9c\x2b\x44\x03\xdb\x3f\x03\xcd\x47\x81\xc1\xfb\xb0\x27\x22\x02\xbc\xb1\x16\x87\x80\x8c\x50\xcb\x98\xf6\x4b\x7f\x3f\xd3\xd4\x33\x33\xbb\x5a\x06\x1b\x9e\x37\x70\x90\xab\xb1\xe0\xa8\x85\xcb\x26\xb7\x3c\x16\x3e\x63\xff\x64\x51\xff\x2f\x4e\xc8\x24\x9c\x7e\x15\x2b\xd0\x39\x73\xa1\xe9\x64\xe2\xb5\xb2\x35\x28\x1a\x93\x83\x99\xa1\x12\xa2\x45\x29\xe3\x83\xa5\x60\xdc\x50\xbb\x1b\x62\x2a\xd7\x4e\xf3\x56\x58\xdc\xb1\x0f\xfe\x02\x25\x68\xac\x3f\xfa\xe5\xb4\x65\xa8\xed\x76\x43\xe8\x56\x1b\x35\x2e\xe9\x94\x4a\x35\xd8\x82\xc7\x12\xb1\x87\x78\x8a\x0a\xba\xe5\xa2\x2f"}, +{{0x4c,0xb9,0xdf,0x7c,0xe6,0xfa,0xe9,0xd6,0x2b,0xa0,0x9e,0x8e,0xb7,0x0e,0x4c,0x96,0x9b,0xde,0xaf,0xcb,0x5e,0xc7,0xd7,0x02,0x43,0x26,0xe6,0x60,0x3b,0x06,0x21,0xbf,},{0x01,0x80,0x69,0xdd,0x0e,0xb4,0x40,0x55,0xa3,0x5c,0xd8,0xc7,0x7c,0x37,0xca,0x9f,0xb1,0xad,0x24,0x17,0x27,0x13,0x85,0xe1,0x34,0xb2,0xf4,0xe8,0x1f,0x52,0x03,0x3c,},{0xe3,0x3c,0x07,0x83,0x6c,0x53,0x7d,0x6b,0xfb,0xd0,0xf4,0x59,0x2d,0x6e,0x35,0xb1,0x63,0x49,0x9b,0xa7,0x8d,0xc7,0xff,0xce,0xc5,0x65,0xd0,0x4f,0x9a,0x7d,0xb7,0x81,0x94,0x3e,0x29,0xe6,0xce,0x76,0x76,0x3e,0x9b,0xad,0xdf,0x57,0x43,0x7f,0xd9,0xc6,0xb0,0x32,0x39,0xa6,0xe6,0x85,0x0e,0x45,0x02,0xa3,0x56,0xc2,0xe1,0x2c,0x37,0x05,},"\x14\x62\x7d\x6e\xa0\xe7\x89\x54\x60\x75\x94\x76\xdc\x74\xc4\x28\x00\xce\xef\x99\x43\x27\x51\x81\x51\x49\x0d\x9d\xf2\x30\x67\x91\x4e\x44\x78\x8a\x12\x76\x8c\xcb\x25\x47\x1b\x9c\x3b\xa9\xd1\x4f\xb4\x36\xdc\xba\x38\x42\x9b\x3a\x04\x56\x87\x77\x63\xc4\x91\x75\xd0\xe0\x82\x68\x3e\x07\xa9\x05\x8f\x36\x85\xc6\x27\x93\x07\xb2\x30\x3d\x12\x21\xb9\xc2\x97\x93\xd8\xa4\x87\x7f\x6d\xf5\x15\x87\x38\x4d\xad\xf7\x51\xc5\xf7\xbf\xbd\x20\x7d\x51\x96\x22\xc3\x7b\x51\xce\xee\xe2\xc2\x0d\x82\x69\xf8\xcb\x88\xd3\xfe\x43\xd6\xd4\x34\xd5\xbb\xd0\xe2\x03\xc1\x53\x2d\x97\xba\x55\x21\x47\x22\x74\x96\xc8\x7f\x67\xb5\x0b\xb7\x61\x93\xad\xd0\x14\x4d\xf1\xc1\x76\x65\x75\x85\x40\x83\x62\xca\x2e\xd0\x4a\xd6\x2a\xcf\x1c\x25\xe3\x41\xdf\xd1\x49\x8d\x85\xb4\xb1\x34\x9a\x8b\x0b\x9b\x02\xc4\x35\x23\xc5\x58\x53\x41\x9b\xfe\xd3\x7d\x5a\x2c\xdf\x17\xdf\xbf\x1a\x3b\xd7\x75\x9d\x6a\xe1\x80\xf9\xd2\x7d\xcd\x9a\x89\x33\xe2\x9a\x7c\x0a\x30\x77\x1e\xea\x7c\x2e\x0f\xa2\x42\x92\x5d\x23\x36\xdc\xe5\x85\x62\x90\x57\xd8\x44\x32\x39\x64\xf6\xd3\xd1\x1f\xf0\xb3\xf8\x29\xa3\xbe\x8c\x9f\x04\x68\xa6\x82\x3d\x8e\x70\xab\x5a\x2d\xa2\x1e\x15\xfa\x8b\x04\x1a\x29\x81\x22\x22\xe9\xc3\x0b\x2b\xd9\xa1\x2d\x1f\xde\xe6\xf8\x78\x76\xe8\xce\x81\x00\x96\x37\xa8\xbb\x22\x36\x12\x9a\x47\xca\x74\x28\x9e\xe4\xaa\xd4\x29\xff\xe2\x9f\x47\x43\x02\x41\xca\x8c\xc3\x84\x8b\x72\x00\xfd\x6e\x14\x70\x65\x1a\x9a\x0a\x6f\x72\xc9\x03\x3e\x83\x1d\xf0\x51\x40\x8a\x62\x60\xf6\x5c\xba\xf6\xe0\x12\xb1\x8e"}, +{{0xa1,0x36,0xe0,0x09,0xd5,0x3e,0x5e,0xf5,0x9d,0x09,0x46,0xbc,0x17,0x56,0x63,0xa8,0x6b,0xc0,0xfc,0xd2,0x9e,0xad,0xd9,0x5c,0xfc,0x9d,0x26,0x60,0x37,0xb1,0xe4,0xfb,},{0x9c,0x18,0x06,0xec,0x04,0x54,0xf5,0x83,0x14,0xeb,0x83,0x97,0xd6,0x42,0x87,0xde,0xe3,0x86,0x64,0x0d,0x84,0x91,0xab,0xa3,0x64,0x60,0x76,0x88,0x84,0x17,0x15,0xa0,},{0xbc,0x09,0x4b,0xa9,0x1c,0x11,0x5d,0xee,0x15,0xd7,0x53,0x36,0x1a,0x75,0xf3,0xf0,0x3d,0x6a,0xf4,0x5c,0x92,0x15,0x7e,0x95,0xdb,0xe8,0xd3,0x21,0x94,0xb6,0xc5,0xce,0x72,0xb9,0xdc,0x66,0xf7,0x3d,0xf1,0x2d,0xca,0x0b,0x63,0x9f,0x3e,0x79,0x1d,0x47,0x86,0x16,0xa1,0xf8,0xd7,0x35,0x9a,0x42,0xc8,0xea,0xe0,0xdd,0xa1,0x6b,0x16,0x06,},"\xa4\x9d\x1c\x3d\x49\xe1\x3c\x2e\xda\x56\x86\x8a\x88\x24\xaa\x9f\x8d\x2b\xf7\x2f\x21\x95\x5e\xba\xfd\x07\xb3\xbd\xc8\xe9\x24\xde\x20\x93\x6c\xee\x51\x3d\x8a\x64\xa4\x71\x73\xa3\xbd\x65\x9e\xff\x1a\xcc\xff\x82\x44\xb2\x6a\xae\x1a\x0c\x27\xfa\x89\x1b\xf4\xd8\x5e\x8f\xb1\xb7\x6a\x6c\xab\x1e\x7f\x74\xc8\x9e\xe0\x7b\xb4\x0d\x71\x43\x26\xf0\x9b\x3f\xd4\x06\x32\xfa\xd2\x08\xea\x81\x6f\x90\x72\x02\x8c\x14\xb5\xb5\x4e\xcc\x1c\x5b\x7f\xc8\x09\xe7\xe0\x78\x6e\x2f\x11\x49\x5e\x76\x01\x7e\xb6\x2a\xa4\x56\x3f\x3d\x00\xee\x84\x34\x8d\x98\x38\xcd\x17\x64\x9f\x69\x29\xa6\xd2\x06\xf6\x0e\x6f\xc8\x2e\x0c\x34\x64\xb2\x7e\x0e\x6a\xbd\x22\xf4\x46\x9b\xdf\xd4\xcb\x54\xf7\x7e\x32\x9b\x80\xf7\x1b\xf4\x21\x29\xec\x13\xc9\xdf\xe1\x92\xad\xfa\xa4\x2e\xe3\xdd\xee\xda\x38\x58\x16\xfb\xad\x5f\x41\x19\x38\xc6\x3b\x56\x0f\x4e\xcd\x94\x53\x4b\xe7\xd9\x87\x25\xcd\x94\xc9\x9c\xe4\x92\xf0\xf0\x69\xba\x0e\xc0\x8f\x87\x7a\x78\x12\xef\x27\xae\x19\xd7\xa7\x7b\xe6\x3f\x66\xbc\xf8\xd6\xcf\x3a\x1a\x61\xfc\x9c\xfe\xf1\x04\xc7\x46\x2a\x21\xca\x7f\x03\xaf\xb5\xbb\x1a\xc8\xc7\x51\x24\xb5\x54\xe8\xd0\x44\xb8\x10\xd9\x5f\xf8\xc9\xdd\x09\xa3\x44\x84\xd8\xc4\xb6\xc9\x5f\x95\xc3\xc2\x28\x23\xf5\x2c\xe8\x44\x29\x37\x24\xd5\x25\x91\x91\xf1\xba\x09\x29\xe2\xac\xdb\xb8\xb9\xa7\xa8\xad\xf0\xc5\x2e\x78\xac\xdf\xdf\x05\x7b\x09\x85\x88\x1a\xfb\xed\x4d\xbe\xbd\xeb\xbd\xae\x0a\x2b\x63\xbd\x4e\x90\xf9\x6a\xfd\xcb\xbd\x78\xf5\x06\x30\x9f\x9b\xdb\x65\x00\x13\xcb\x73\xfa\xed\x73\x90\x4e"}, +{{0xff,0x0f,0x1c,0x57,0xdd,0x88,0x4f,0xbe,0xea,0x6e,0x29,0x17,0x28,0x2b,0x79,0xba,0x67,0xf8,0xa6,0x85,0x12,0x67,0xb9,0xf4,0x63,0x6d,0xaf,0xda,0x33,0xbd,0x2b,0x5b,},{0xfe,0xf6,0x37,0x8a,0xd1,0x2a,0x7c,0x25,0x2f,0xa6,0xeb,0x74,0x2b,0x05,0x06,0x4b,0x41,0x53,0x0f,0xf0,0x19,0xdc,0x68,0x0a,0xb5,0x44,0xc0,0x27,0xea,0x28,0x36,0xe7,},{0xd5,0x00,0x84,0x86,0x72,0x6c,0xce,0x33,0x0a,0x29,0xdd,0x7e,0x4d,0x74,0x74,0xd7,0x35,0x79,0x82,0x01,0xaf,0xd1,0x20,0x6f,0xeb,0x86,0x9a,0x11,0x2e,0x5b,0x43,0x52,0x3c,0x06,0x97,0x67,0x61,0xbe,0x3c,0xf9,0xb2,0x71,0x63,0x78,0x27,0x3c,0x94,0xf9,0x35,0x72,0xa7,0xd2,0xb8,0x98,0x26,0x34,0xe0,0x75,0x5c,0x63,0x2b,0x44,0x90,0x08,},"\x52\x2a\x5e\x5e\xff\x5b\x5e\x98\xfa\xd6\x87\x8a\x9d\x72\xdf\x6e\xb3\x18\x62\x26\x10\xa1\xe1\xa4\x81\x83\xf5\x59\x0e\xce\xf5\xa6\xdf\x67\x1b\x28\xbe\x91\xc8\x8c\xdf\x7a\xe2\x88\x11\x47\xfe\x6c\x37\xc2\x8b\x43\xf6\x4c\xf9\x81\xc4\x55\xc5\x9e\x76\x5c\xe9\x4e\x1b\x64\x91\x63\x1d\xea\xee\xf6\xd1\xda\x9e\xbc\xa8\x86\x43\xc7\x7f\x83\xea\xe2\xcf\xdd\x2d\x97\xf6\x04\xfe\x45\x08\x1d\x1b\xe5\xc4\xae\x2d\x87\x59\x96\xb8\xb6\xfe\xcd\x70\x7d\x3f\xa2\x19\xa9\x3b\xa0\x48\x8e\x55\x24\x7b\x40\x5e\x33\x0c\xfb\x97\xd3\x1a\x13\x61\xc9\xb2\x08\x4b\xdb\x13\xfb\x0c\x05\x89\x25\xdb\x8c\x3c\x64\x9c\x9a\x3e\x93\x7b\x53\x3c\xc6\x31\x0f\xa3\xb1\x61\x26\xfb\x3c\xc9\xbb\x2b\x35\xc5\xc8\x30\x00\x15\x48\x8a\x30\xfa\xdc\xa3\xc8\x87\x1f\xa7\x0d\xfd\xc7\x05\x5b\xf8\xe6\x31\xf2\x0c\x9b\x25\x28\x31\x1e\x32\x4a\x7c\x4e\xdd\x54\x62\x07\x9f\x34\x41\xc9\xec\xf5\x5f\xa9\x99\xe7\x31\x37\x23\x44\xfd\xc0\xd4\x13\xe4\x17\xaa\xa0\x01\xa1\xb2\xd3\xd9\xbc\x00\x0f\xec\x1b\x02\xbd\x7a\x88\xa8\x12\xd9\xd8\xa6\x6f\x94\x64\x76\x4c\x07\x0c\x93\x04\x1e\xef\xb1\x7c\xe7\x4e\xff\x6d\x4a\xff\x75\xf0\xcb\xf6\xa7\x89\xa9\xec\xde\x74\xab\xe3\x31\x30\xfc\xa0\xda\x85\x3a\xa7\xc3\x31\x3a\xda\x3f\x0a\xe2\xf5\x95\xc6\x79\x6a\x93\x68\x5e\x72\x9d\xd1\x8a\x66\x9d\x63\x81\x82\x5a\xb3\xf3\x6a\x39\x1e\x75\x25\xb2\xa8\x07\xa5\x2f\xa5\xec\x2a\x03\x0a\x8c\xf3\xb7\x73\x37\xac\x41\xfc\xeb\x58\x0e\x84\x5e\xed\x65\x5a\x48\xb5\x47\x23\x8c\x2e\x81\x37\xc9\x2f\x8c\x27\xe5\x85\xca\xad\x31\x06\xee\xe3\x81\x4a"}, +{{0x0b,0xc6,0xaf,0x64,0xde,0x57,0x09,0xd3,0xdb,0xc2,0x8f,0x7e,0xf6,0xd3,0xfe,0x28,0xb6,0xde,0x52,0x9f,0x08,0xf5,0x85,0x7c,0xcb,0x91,0x06,0x95,0xde,0x45,0x4f,0x56,},{0xfb,0x49,0x1f,0xc9,0x00,0x23,0x7b,0xdc,0x7e,0x9a,0x11,0x9f,0x27,0x15,0x0c,0xd9,0x11,0x93,0x5c,0xd3,0x62,0x87,0x49,0xff,0x40,0xef,0x41,0xf3,0x95,0x5b,0xc8,0xac,},{0xdb,0xc7,0x13,0x4d,0x1c,0xd6,0xb0,0x81,0x3b,0x53,0x35,0x27,0x14,0xb6,0xdf,0x93,0x94,0x98,0xe9,0x1c,0xf3,0x7c,0x32,0x43,0x37,0xd9,0xc0,0x88,0xa1,0xb9,0x98,0x34,0x7d,0x26,0x18,0x5b,0x43,0x09,0x00,0x41,0x29,0x29,0xe4,0xf6,0x3e,0x91,0x03,0x79,0xfc,0x42,0xe3,0x55,0xa4,0xe9,0x8f,0x6f,0xee,0x27,0xda,0xfa,0xd1,0x95,0x72,0x06,},"\xac\x78\x86\xe4\xf4\x17\x2a\x22\xc9\x5e\x8e\xea\x37\x43\x7b\x37\x5d\x72\xac\xce\xdc\xee\x6c\xc6\xe8\x16\x76\x33\x01\xa2\xd8\xef\x4d\x6f\x31\xa2\xc1\xd6\x35\x81\x8b\x70\x26\xa3\x95\xce\x0d\xaf\xd7\x1c\x51\x80\x89\x3a\xf7\x6b\x7e\xa0\x56\xc9\x72\xd6\x80\xec\xa0\x1d\xcb\xdb\xae\x6b\x26\xf1\xc5\xf3\x3f\xc9\x88\xb8\x24\xfb\xbe\x00\xca\xcc\x31\x64\x69\xa3\xba\xe0\x7a\xa7\xc8\x88\x5a\xf7\xf6\x5f\x42\xe7\x5c\xef\x94\xdb\xb9\xaa\xb4\x82\x51\x43\xc8\x50\x70\xe7\x71\x6b\x76\x12\xf6\x4e\xf0\xb0\x16\x60\x11\xd2\x3e\xb5\x65\x4a\xa0\x98\xb0\x2d\x8d\x71\xe5\x7c\x8f\xa1\x7b\xff\x2f\xe9\x7d\xc8\x19\x31\x77\xea\xdc\x09\xfb\x19\x2d\x80\xaa\x92\xaf\xa9\x87\x20\xd4\x61\x48\x17\xff\x3c\x39\xd3\xac\xce\x18\x90\x6f\xa3\xde\x09\x61\x89\x31\xd0\xd7\xa6\x0c\x44\x29\xcb\xfa\x20\xcf\x16\x5c\x94\x79\x29\xac\x29\x3a\xe6\xc0\x6e\x7e\x8f\x25\xf1\x26\x42\x91\xe3\xe1\xc9\x8f\x5d\x93\xe6\xec\xc2\x38\x9b\xc6\x0d\xbb\xf4\xa6\x21\xb1\x32\xc5\x52\xa9\x9c\x95\xd2\x6d\x8d\x1a\xf6\x11\x38\xb5\x70\xa0\xde\x4b\x49\x7e\xbe\x80\x51\xc7\x27\x3a\x98\xe6\xe7\x87\x6d\x0b\x32\x75\x03\xaf\x3c\xb2\xcc\x40\x91\xce\x19\x25\xcb\x2f\x29\x57\xf4\xec\x56\xee\x90\xf8\xa0\x9d\xd5\x7d\x6e\x83\x06\x7a\x35\x6a\x4c\xfe\x65\xb1\xb7\xa4\x46\x5d\xa2\xab\x13\x3b\x0e\xfb\x5e\x7d\x4d\xbb\x81\x1b\xcb\xbd\xe7\x12\xaf\xbf\x0f\x7d\xd3\xf3\x26\x22\x22\x84\xb8\xc7\x4e\xac\x7a\xd6\x25\x7f\xa8\xc6\x32\xb7\xda\x25\x59\xa6\x26\x6e\x91\xe0\xef\x90\xdb\xb0\xaa\x96\x8f\x75\x37\x6b\x69\x3f\xca\xa5\xda\x34\x22\x21"}, +{{0x2f,0x5e,0x83,0xbd,0x5b,0x41,0x2e,0x71,0xae,0x3e,0x90,0x84,0xcd,0x36,0x9e,0xfc,0xc7,0x9b,0xf6,0x03,0x7c,0x4b,0x17,0x4d,0xfd,0x6a,0x11,0xfb,0x0f,0x5d,0xa2,0x18,},{0xa2,0x2a,0x6d,0xa2,0x9a,0x5e,0xf6,0x24,0x0c,0x49,0xd8,0x89,0x6e,0x3a,0x0f,0x1a,0x42,0x81,0xa2,0x66,0xc7,0x7d,0x38,0x3e,0xe6,0xf9,0xd2,0x5f,0xfa,0xcb,0xb8,0x72,},{0x9f,0x80,0x92,0x2b,0xc8,0xdb,0x32,0xd0,0xcc,0x43,0xf9,0x93,0x6a,0xff,0xeb,0xe7,0xb2,0xbc,0x35,0xa5,0xd8,0x22,0x77,0xcd,0x18,0x7b,0x5d,0x50,0xdc,0x7f,0xc4,0xc4,0x83,0x2f,0xff,0xa3,0x4e,0x95,0x43,0x80,0x6b,0x48,0x5c,0x04,0x54,0x8e,0x7c,0x75,0x42,0x94,0x25,0xe1,0x4d,0x55,0xd9,0x1f,0xc1,0x05,0x2e,0xfd,0x86,0x67,0x43,0x0b,},"\xb7\x66\x27\x3f\x06\x0e\xf3\xb2\xae\x33\x40\x45\x4a\x39\x1b\x42\x6b\xc2\xe9\x72\x64\xf8\x67\x45\x53\xeb\x00\xdd\x6e\xcf\xdd\x59\xb6\x11\xd8\xd6\x62\x92\x9f\xec\x71\x0d\x0e\x46\x20\x20\xe1\x2c\xdb\xf9\xc1\xec\x88\x58\xe8\x56\x71\xac\xf8\xb7\xb1\x44\x24\xce\x92\x07\x9d\x7d\x80\x1e\x2a\xd9\xac\xac\x03\x6b\xc8\xd2\xdf\xaa\x72\xaa\x83\x9b\xff\x30\xc0\xaa\x7e\x41\x4a\x88\x2c\x00\xb6\x45\xff\x9d\x31\xbc\xf5\xa5\x43\x82\xde\xf4\xd0\x14\x2e\xfa\x4f\x06\xe8\x23\x25\x7f\xf1\x32\xee\x96\x8c\xdc\x67\x38\xc5\x3f\x53\xb8\x4c\x8d\xf7\x6e\x9f\x78\xdd\x50\x56\xcf\x3d\x4d\x5a\x80\xa8\xf8\x4e\x3e\xde\xc4\x85\x20\xf2\xcb\x45\x83\xe7\x08\x53\x93\x55\xef\x7a\xa8\x6f\xb5\xa0\xe8\x7a\x94\xdc\xf1\x4f\x30\xa2\xcc\xa5\x68\xf1\x39\xd9\xce\x59\xea\xf4\x59\xa5\xc5\x91\x6c\xc8\xf2\x0b\x26\xaa\xf6\xc7\xc0\x29\x37\x9a\xed\xb0\x5a\x07\xfe\x58\x5c\xca\xc6\x03\x07\xc1\xf5\x8c\xa9\xf8\x59\x15\x7d\x06\xd0\x6b\xaa\x39\x4a\xac\xe7\x9d\x51\xb8\xcb\x38\xcf\xa2\x59\x81\x41\xe2\x45\x62\x4e\x5a\xb9\xb9\xd6\x87\x31\x17\x33\x48\x90\x53\x15\xbf\x1a\x5a\xd6\x1d\x1e\x8a\xda\xeb\x81\x0e\x4e\x8a\x86\xd7\xc1\x35\x37\xb0\xbe\x86\x0a\xb2\xed\x35\xb7\x33\x99\xb8\x80\x8a\xa9\x1d\x75\x0f\x77\x94\x3f\x8a\x8b\x7e\x89\xfd\xb5\x07\x28\xaa\x3d\xbb\xd8\xa4\x1a\x6e\x00\x75\x6f\x43\x8c\x9b\x9e\x9d\x55\x87\x2d\xf5\xa9\x06\x8a\xdd\x8a\x97\x2b\x7e\x43\xed\xad\x9c\xed\x22\x37\xca\x13\x67\xbe\x4b\x7c\xdb\x66\xa5\x4e\xa1\x2e\xef\x12\x94\x71\x15\x86\x10\xea\xf2\x8f\x99\xf7\xf6\x86\x55\x7d\xcd\xf6\x44\xea"}, +{{0x72,0x2a,0x2d,0xa5,0x0e,0x42,0xc1,0x1a,0x61,0xc9,0xaf,0xac,0x7b,0xe1,0xa2,0xfe,0xd2,0x26,0x7d,0x65,0x0f,0x8f,0x7d,0x8e,0x5b,0xc7,0x06,0xb8,0x07,0xc1,0xb9,0x1d,},{0xfd,0x0b,0x96,0x45,0x62,0xf8,0x23,0x72,0x1e,0x64,0x9c,0x3f,0xed,0xb4,0x32,0xa7,0x6f,0x91,0xe0,0xae,0xad,0x7c,0x61,0xd3,0x5f,0x95,0xed,0x77,0x26,0xd7,0x85,0x89,},{0xc2,0x69,0x5a,0x57,0x17,0x2a,0xaa,0x31,0xbd,0x08,0x90,0xf2,0x31,0xca,0x8e,0xee,0xc0,0x28,0x7a,0x87,0x17,0x26,0x69,0xa8,0x99,0xad,0x08,0x91,0xce,0xa4,0xc4,0x75,0x79,0xb5,0x04,0x20,0xe7,0x91,0xcd,0xec,0x8c,0x18,0x2c,0x8a,0x0e,0x8d,0xde,0x21,0xb2,0x48,0x0b,0x0c,0xfd,0x81,0x11,0xe2,0x8e,0x56,0x03,0x34,0x7a,0x35,0x2d,0x04,},"\x17\x3e\x8b\xb8\x85\xe1\xf9\x08\x14\x04\xac\xac\x99\x90\x41\xd2\xec\xfc\xb7\x3f\x94\x5e\x0d\xb3\x6e\x63\x1d\x7c\xd1\xab\x99\x9e\xb7\x17\xf3\x4b\xf0\x78\x74\xbf\x3d\x34\xe2\x53\x0e\xb6\x08\x5f\x4a\x9f\x88\xae\x1b\x0f\x7d\x80\xf2\x21\x45\x6a\x8e\x9a\x88\x90\xb9\x1a\x50\x19\x2d\xea\xaa\xcc\x0a\x1a\x61\x5a\x87\x84\x1e\x2c\x5a\x9e\x05\x79\x57\xaf\x6e\x48\xe7\x8c\xc8\x61\x98\xe3\x2e\x7a\xa2\x4d\xcf\x6c\xff\xa3\x29\xbc\x72\x60\x6d\x65\xb1\x16\x82\xc8\xba\x73\x6c\xce\x22\xa0\x57\x85\xdf\x11\x46\x33\x1e\x41\x60\x9c\xf9\xca\x71\x1c\xf4\x64\x95\x82\x97\x13\x8b\x58\xa9\x07\x3f\x3b\xbf\x06\xad\x8a\x85\xd1\x35\xde\x66\x65\x21\x04\xd8\x8b\x49\xd2\x7a\xd4\x1e\x59\xbc\xc4\x4c\x7f\xab\x68\xf5\x3f\x05\x02\xe2\x93\xff\xca\xba\xaf\x75\x59\x27\xdf\xdf\xfb\xfd\xe3\xb3\x5c\x08\x0b\x5d\xe4\xc8\xb7\x85\xf4\xda\x64\xef\x35\x7b\xc0\xd1\x46\x6a\x6a\x96\x56\x0c\x3c\x4f\x3e\x3c\x0b\x56\x3a\x00\x3f\x5f\x95\xf2\x37\x17\x1b\xce\x1a\x00\x17\x71\xa0\x4e\xde\x7c\xdd\x9b\x8c\xa7\x70\xfd\x36\xef\x90\xe9\xfe\x00\x00\xa8\xd7\x68\x5f\xd1\x53\xcc\x72\x82\xde\x95\x92\x0a\x8f\x8f\x08\x98\xd0\x0b\xf0\xc6\xc9\x33\xfe\x5b\xb9\x65\x3f\xf1\x46\xc4\xe2\xac\xd1\xa2\xe0\xc2\x3c\x12\x44\x84\x4d\xac\xf8\x65\x27\x16\x30\x2c\x20\x32\xf9\xc1\x14\x67\x9e\xd2\x6b\x3e\xe3\xab\x4a\x7b\x18\xbc\x4e\x30\x71\xf0\x97\x7d\xb5\x7c\xd0\xac\x68\xc0\x72\x7a\x09\xb4\xf1\x25\xfb\x64\xaf\x28\x50\xb2\x6c\x8a\x48\x42\x63\x33\x4e\x2d\xa9\x02\xd7\x44\x73\x70\x44\xe7\x9a\xb1\xcf\x5b\x2f\x93\xa0\x22\xb6\x3d\x40\xcd"}, +{{0x5f,0xe9,0xc3,0x96,0x0e,0xd5,0xbd,0x37,0x4c,0xc9,0x4d,0x42,0x35,0x7e,0x6a,0x24,0xdc,0x7e,0x30,0x60,0x78,0x8f,0x72,0x63,0x65,0xde,0xfa,0xcf,0x13,0xcd,0x12,0xda,},{0x0c,0xe7,0xb1,0x55,0xc8,0xb2,0x0e,0xbd,0xaa,0xcd,0xc2,0xaa,0x23,0x62,0x7e,0x34,0xb1,0xf9,0xac,0xe9,0x80,0x65,0x0a,0x25,0x30,0xc7,0x60,0x7d,0x04,0x81,0x4e,0xb4,},{0x37,0x9f,0x9c,0x54,0xc4,0x13,0xaf,0x0d,0x19,0x2e,0x9b,0xc7,0x36,0xb2,0x9d,0xa9,0xd5,0x21,0xe7,0xba,0x78,0x41,0xd3,0x09,0xf9,0xbc,0xc1,0xe7,0x42,0xec,0x43,0x08,0xfe,0x9f,0x7b,0xa5,0x1e,0x0b,0x22,0xae,0xd4,0x87,0xcb,0x4a,0xa3,0x91,0x3b,0x9b,0xeb,0xfb,0x3a,0xac,0xd3,0x8f,0x40,0x39,0xf9,0xbb,0xbe,0xbe,0x1a,0xd8,0x00,0x02,},"\xc9\x49\x0d\x83\xd9\xc3\xa9\x37\x0f\x06\xc9\x1a\xf0\x01\x68\x5a\x02\xfe\x49\xb5\xca\x66\x77\x33\xff\xf1\x89\xee\xe8\x53\xec\x16\x67\xa6\xc1\xb6\xc7\x87\xe9\x24\x48\x12\xd2\xd5\x32\x86\x6a\xb7\x4d\xfc\x87\x0d\x6f\x14\x03\x3b\x6b\xcd\x39\x85\x2a\x39\x00\xf8\xf0\x8c\xd9\x5a\x74\xcb\x8c\xbe\x02\xb8\xb8\xb5\x1e\x99\x3a\x06\xad\xfe\xbd\x7f\xc9\x85\x4a\xe5\xd2\x9f\x4d\xf9\x64\x28\x71\xd0\xc5\xe4\x70\xd9\x03\xcf\xbc\xbd\x5a\xdb\x32\x75\x62\x8f\x28\xa8\x0b\xf8\xc0\xf0\x37\x66\x87\xda\xe6\x73\xbf\x7a\x85\x47\xe8\x0d\x4a\x98\x55\xae\x25\x72\xfc\x2b\x20\x5d\xc8\xa1\x98\x01\x6d\xdc\x9b\x50\x99\x5f\x5b\x39\xf3\x68\xf5\x40\x50\x4a\x55\x18\x03\xd6\xdd\x5f\x87\x48\x28\xe5\x54\x1d\xed\x05\x28\x94\xd9\xe2\xdc\x5e\x6a\xa3\x51\x08\x7e\x79\x0c\x0d\xd5\xd9\xc4\xde\xcb\x21\x7e\x4d\xb8\x1c\x98\xa1\x84\xb2\x64\xe6\xda\xea\xc0\xf1\x1e\x07\x4c\xae\x2b\xfc\x89\x9f\x54\xb4\x19\xc6\x5d\xcc\x22\x66\x4a\x91\x5f\xbf\xff\xac\x35\xce\xe0\xf2\x86\xeb\x7b\x14\x49\x33\xdb\x93\x3e\x16\xc4\xbc\xb6\x50\xd5\x37\x72\x24\x89\xde\x23\x63\x73\xfd\x8d\x65\xfc\x86\x11\x8b\x6d\xef\x37\xca\x46\x08\xbc\x6c\xe9\x27\xb6\x54\x36\xff\xda\x7f\x02\xbf\xbf\x88\xb0\x45\xae\x7d\x2c\x2b\x45\xa0\xb3\x0c\x8f\x2a\x04\xdf\x95\x32\x21\x08\x8c\x55\x5f\xe9\xa5\xdf\x26\x09\x82\xa3\xd6\x4d\xf1\x94\xee\x95\x2f\xa9\xa9\x8c\x31\xb9\x64\x93\xdb\x61\x80\xd1\x3d\x67\xc3\x67\x16\xf9\x5f\x8c\x0b\xd7\xa0\x39\xad\x99\x06\x67\xca\x34\xa8\x3a\xc1\xa1\x8c\x37\xdd\x7c\x77\x36\xaa\x6b\x9b\x6f\xc2\xb1\xac\x0c\xe1\x19\xef\x77"}, +{{0xec,0x2f,0xa5,0x41,0xac,0x14,0xb4,0x14,0x14,0x9c,0x38,0x25,0xea,0xa7,0x00,0x1b,0x79,0x5a,0xa1,0x95,0x7d,0x40,0x40,0xdd,0xa9,0x25,0x73,0x90,0x4a,0xfa,0x7e,0xe4,},{0x71,0xb3,0x63,0xb2,0x40,0x84,0x04,0xd7,0xbe,0xec,0xde,0xf1,0xe1,0xf5,0x11,0xbb,0x60,0x84,0x65,0x8b,0x53,0x2f,0x7e,0xa6,0x3d,0x4e,0x3f,0x5f,0x01,0xc6,0x1d,0x31,},{0x84,0xd1,0x8d,0x56,0xf9,0x64,0xe3,0x77,0x67,0x59,0xbb,0xa9,0x2c,0x51,0x0c,0x2b,0x6d,0x57,0x45,0x55,0xc3,0xcd,0xda,0xde,0x21,0x2d,0xa9,0x03,0x74,0x55,0x49,0x91,0xe7,0xd7,0x7e,0x27,0x8d,0x63,0xe3,0x46,0x93,0xe1,0x95,0x80,0x78,0xcc,0x36,0x85,0xf8,0xc4,0x1c,0x1f,0x53,0x42,0xe3,0x51,0x89,0x96,0x38,0xef,0x61,0x21,0x14,0x01,},"\x27\x49\xfc\x7c\x4a\x72\x9e\x0e\x0a\xd7\x1b\x5b\x74\xeb\x9f\x9c\x53\x4e\xbd\x02\xff\xc9\xdf\x43\x74\xd8\x13\xbd\xd1\xae\x4e\xb8\x7f\x13\x50\xd5\xfd\xc5\x63\x93\x45\x15\x77\x17\x63\xe6\xc3\x3b\x50\xe6\x4e\x0c\xd1\x14\x57\x30\x31\xd2\x18\x6b\x6e\xca\x4f\xc8\x02\xcd\xdc\x7c\xc5\x1d\x92\xa6\x13\x45\xa1\x7f\x6a\xc3\x8c\xc7\x4d\x84\x70\x7a\x51\x56\xbe\x92\x02\xde\xe3\x44\x46\x52\xe7\x9b\xae\x7f\x0d\x31\xbd\x17\x56\x79\x61\xf6\x5d\xd0\x1a\x8e\x4b\xee\x38\x33\x19\x38\xce\x4b\x2b\x55\x06\x91\xb9\x9a\x4b\xc3\xc0\x72\xd1\x86\xdf\x4b\x33\x44\xa5\xc8\xfb\xfb\xb9\xfd\x2f\x35\x5f\x61\x07\xe4\x10\xc3\xd0\xc7\x98\xb6\x8d\x3f\xb9\xc6\xf7\xab\x5f\xe2\x7e\x70\x87\x1e\x86\x76\x76\x98\xfe\x35\xb7\x7e\xad\x4e\x43\x5a\x94\x02\xcc\x9e\xd6\xa2\x65\x7b\x05\x9b\xe0\xa2\x10\x03\xc0\x48\xbb\xf5\xe0\xeb\xd9\x3c\xbb\x2e\x71\xe9\x23\xcf\x5c\x72\x8d\x17\x58\xcd\x81\x7a\xd7\x4b\x45\x4a\x88\x71\x26\xd6\x53\xb9\x5a\x7f\x25\xe5\x29\x3b\x76\x8c\x9f\xc5\xa9\xc3\x5a\x23\x72\xe3\x74\x1b\xc9\x0f\xd6\x63\x01\x42\x7b\x10\x82\x4b\xb4\xb1\xe9\x11\x0b\xfb\xa8\x4c\x21\xa4\x0e\xb8\xfe\xd4\x49\x7e\x91\xdc\x3f\xfd\x04\x38\xc5\x14\xc0\xa8\xcb\x4c\xac\x6a\xd0\x25\x6b\xf1\x1d\x5a\xa7\xa9\xc7\xc0\x0b\x66\x9b\x01\x5b\x0b\xf8\x14\x25\xa2\x14\x13\xe2\xff\xb6\xed\xc0\xbd\x78\xe3\x85\xc4\x4f\xd7\x45\x58\xe5\x11\xc2\xc2\x5f\xee\x1f\xec\x18\xd3\x99\x0b\x86\x90\x30\x0f\xa7\x11\xe9\x3d\x98\x54\x66\x8f\x01\x87\x06\x5e\x76\xe7\x11\x3a\xe7\x63\xc3\x0d\xdd\x86\x72\x0b\x55\x46\xa6\xc3\xc6\xf1\xc4\x3b\xc6\x7b\x14"}, +{{0x61,0x32,0x69,0x2a,0x5e,0xf2,0x7b,0xf4,0x76,0xb1,0xe9,0x91,0xe6,0xc4,0x31,0xa8,0xc7,0x64,0xf1,0xae,0xbd,0x47,0x02,0x82,0xdb,0x33,0x21,0xbb,0x7c,0xb0,0x9c,0x20,},{0x7a,0x2d,0x16,0x61,0x84,0xf9,0xe5,0xf7,0x3b,0xea,0x45,0x44,0x86,0xb0,0x41,0xce,0xb5,0xfc,0x23,0x14,0xa7,0xbd,0x59,0xcb,0x71,0x8e,0x79,0xf0,0xec,0x98,0x9d,0x84,},{0xeb,0x67,0x7f,0x33,0x47,0xe1,0xa1,0xea,0x92,0x9e,0xfd,0xf6,0x2b,0xf9,0x10,0x5a,0x6c,0x8f,0x49,0x93,0x03,0x3b,0x4f,0x6d,0x03,0xcb,0x0d,0xbf,0x9c,0x74,0x2b,0x27,0x07,0x04,0xe3,0x83,0xab,0x7c,0x06,0x76,0xbd,0xb1,0xad,0x0c,0xe9,0xb1,0x66,0x73,0x08,0x3c,0x96,0x02,0xec,0x10,0xae,0x1d,0xd9,0x8e,0x87,0x48,0xb3,0x36,0x44,0x0b,},"\xa9\xc0\x86\x16\x65\xd8\xc2\xde\x06\xf9\x30\x1d\xa7\x0a\xfb\x27\xb3\x02\x4b\x74\x4c\x6b\x38\xb2\x42\x59\x29\x4c\x97\xb1\xd1\xcb\x4f\x0d\xcf\x75\x75\xa8\xed\x45\x4e\x2f\x09\x80\xf5\x03\x13\xa7\x73\x63\x41\x51\x83\xfe\x96\x77\xa9\xeb\x1e\x06\xcb\x6d\x34\xa4\x67\xcb\x7b\x07\x58\xd6\xf5\x5c\x56\x4b\x5b\xa1\x56\x03\xe2\x02\xb1\x88\x56\xd8\x9e\x72\xa2\x3a\xb0\x7d\x88\x53\xff\x77\xda\x7a\xff\x1c\xae\xbd\x79\x59\xf2\xc7\x10\xef\x31\xf5\x07\x8a\x9f\x2c\xda\xe9\x26\x41\xa1\xcc\x5f\x74\xd0\xc1\x43\xec\x42\xaf\xba\xa5\xf3\x78\xa9\xe1\x0d\x5b\xf7\x45\x87\xfa\x5f\x49\xc1\x56\x23\x32\x47\xda\xfd\x39\x29\xac\xde\x88\x8d\xc6\x84\x33\x7e\x40\xcd\xc5\x93\x2e\x7e\xb7\x3f\xfc\xc9\x0b\x85\xc0\xad\x46\x04\x16\x69\x1a\xef\xbd\x7e\xfd\x07\xb6\x57\xc3\x50\x94\x6a\x0e\x36\x6b\x37\xa6\xc8\x08\x9a\xba\x5c\x5f\xe3\xbb\xca\x06\x4a\xfb\xe9\xd4\x7f\xbc\x83\x91\x4a\xf1\xcb\x43\xc2\xb2\xef\xa9\x8e\x0a\x43\xbe\x32\xba\x82\x32\x02\x00\x1d\xef\x36\x81\x72\x51\xb6\x5f\x9b\x05\x06\xce\xf6\x68\x36\x42\xa4\x6e\xd6\x12\xf8\xca\x81\xee\x97\xbb\x04\xd3\x17\xb5\x17\x34\x3a\xde\x2b\x77\x12\x6d\x1f\x02\xa8\x7b\x76\x04\xc8\x65\x3b\x67\x48\xcf\x54\x88\xfa\x6d\x43\xdf\x80\x9f\xaa\x19\xe6\x92\x92\xd3\x8c\x5d\x39\x7d\xd8\xe2\x0c\x7a\xf7\xc5\x33\x4e\xc9\x77\xf5\x01\x0a\x0f\x7c\xb5\xb8\x94\x79\xca\x06\xdb\x4d\x12\x62\x7f\x06\x7d\x6c\x42\x18\x6a\x6b\x1f\x87\x42\xf3\x6a\xe7\x09\xba\x72\x0e\x3c\xd8\x98\x11\x66\x66\xd8\x1b\x19\x0b\x9b\x9d\x2a\x72\x20\x2c\xb6\x90\xa0\x3f\x33\x10\x42\x9a\x71\xdc\x04\x8c\xde"}, +{{0xf2,0x19,0xb2,0x10,0x11,0x64,0xaa,0x97,0x23,0xbd,0xe3,0xa7,0x34,0x6f,0x68,0xa3,0x50,0x61,0xc0,0x1f,0x97,0x82,0x07,0x25,0x80,0xba,0x32,0xdf,0x90,0x3b,0xa8,0x91,},{0xf6,0x6b,0x92,0x0d,0x5a,0xa1,0xa6,0x08,0x54,0x95,0xa1,0x48,0x05,0x39,0xbe,0xba,0x01,0xff,0xe6,0x0e,0x6a,0x63,0x88,0xd1,0xb2,0xe8,0xed,0xa2,0x33,0x55,0x81,0x0e,},{0x17,0xf0,0x12,0x7c,0xa3,0xba,0xfa,0x5f,0x4e,0xe9,0x59,0xcd,0x60,0xf7,0x72,0xbe,0x87,0xa0,0x03,0x49,0x61,0x51,0x7e,0x39,0xa0,0xa1,0xd0,0xf4,0xb9,0xe2,0x6d,0xb1,0x33,0x6e,0x60,0xc8,0x2b,0x35,0x2c,0x4c,0xba,0xcd,0xbb,0xd1,0x17,0x71,0xc3,0x77,0x4f,0x8c,0xc5,0xa1,0xa7,0x95,0xd6,0xe4,0xf4,0xeb,0xd5,0x1d,0xef,0x36,0x77,0x0b,},"\x01\x55\x77\xd3\xe4\xa0\xec\x1a\xb2\x59\x30\x10\x63\x43\xff\x35\xab\x4f\x1e\x0a\x8a\x2d\x84\x4a\xad\xbb\x70\xe5\xfc\x53\x48\xcc\xb6\x79\xc2\x29\x5c\x51\xd7\x02\xaa\xae\x7f\x62\x73\xce\x70\x29\x7b\x26\xcb\x7a\x25\x3a\x3d\xb9\x43\x32\xe8\x6a\x15\xb4\xa6\x44\x91\x23\x27\x91\xf7\xa8\xb0\x82\xee\x28\x34\xaf\x30\x40\x0e\x80\x46\x47\xa5\x32\xe9\xc4\x54\xd2\xa0\xa7\x32\x01\x30\xab\x6d\x4d\x86\x00\x73\xa3\x46\x67\xac\x25\xb7\xe5\xe2\x74\x7b\xa9\xf5\xc9\x45\x94\xfb\x68\x37\x7a\xe2\x60\x36\x9c\x40\x71\x3b\x4e\x32\xf2\x31\x95\xbf\x91\xd3\xd7\xf1\xa2\x71\x9b\xf4\x08\xaa\xd8\xd8\xa3\x47\xb1\x12\xe8\x4b\x11\x88\x17\xcb\x06\x51\x33\x44\x02\x17\x63\x03\x52\x72\xa7\xdb\x72\x8a\x0c\xcd\xaa\x94\x9c\x61\x71\x5d\x07\x64\x14\x0b\x3e\x8c\x01\xd2\x0f\xf1\x59\x3c\x7f\x2d\x55\xc4\xe8\x2a\x1c\x0c\xb1\xea\x58\x44\x2b\xf8\x0a\x74\x1b\xca\x91\xf5\x8a\xb0\x58\x1b\x49\x8e\xe9\xfe\x3c\x92\xca\x65\x41\x48\xef\x75\x31\x35\x43\xd1\xaf\xf3\x82\xbe\xfe\x1a\x93\xb0\x21\x90\xce\x01\x02\x17\x51\x58\xe2\x07\x1d\x02\xba\xca\xd8\xdb\xe9\xfb\x94\x0f\xcb\x61\x0c\x10\x5a\xd5\x2c\x80\xfe\xb1\xec\x4e\x52\x4f\x4c\x0e\xc7\x98\x3e\x9c\xe6\x96\xfa\x4f\xcf\x4b\xf0\x51\x4b\x8f\x04\x32\xb1\x7d\x54\x48\xfc\x42\x6f\xea\x2b\x01\xac\x7b\x26\xc2\xae\xd7\x69\x92\x75\x34\xda\x22\x57\x6f\xc1\xbb\xa7\x26\xe9\xd6\x5b\xe0\x1b\x59\xf6\x0a\x64\x8a\xce\x2f\xc3\xe5\xe2\x75\x78\x9f\xa6\x37\xcb\xbd\x84\xbe\x3d\x6a\xc2\x44\x57\xa6\x29\x2c\xd6\x56\xc7\xb5\x69\xa5\x2f\xfe\xa7\x91\x6b\x8d\x04\xb4\xf4\xa7\x5b\xe7\xac\x95\x14\x2f"}, +{{0xfc,0x18,0x00,0x35,0xae,0xc0,0xf5,0xed,0xe7,0xbd,0xa9,0x3b,0xf7,0x7a,0xde,0x7a,0x81,0xed,0x06,0xde,0x07,0xee,0x2e,0x3a,0xa8,0x57,0x6b,0xe8,0x16,0x08,0x61,0x0a,},{0x4f,0x21,0x5e,0x94,0x8c,0xae,0x24,0x3e,0xe3,0x14,0x3b,0x80,0x28,0x2a,0xd7,0x92,0xc7,0x80,0xd2,0xa6,0xb7,0x50,0x60,0xca,0x1d,0x29,0x0c,0xa1,0xa8,0xe3,0x15,0x1f,},{0xa4,0x3a,0x71,0xc3,0xa1,0x9c,0x35,0x66,0x0d,0xae,0x6f,0x31,0xa2,0x54,0xb8,0xc0,0xea,0x35,0x93,0xfc,0x8f,0xca,0x74,0xd1,0x36,0x40,0x01,0x2b,0x9e,0x94,0x73,0xd4,0xaf,0xe0,0x70,0xdb,0x01,0xe7,0xfb,0x39,0x9b,0xf4,0xca,0x60,0x70,0xe0,0x62,0x18,0x00,0x11,0x28,0x5a,0x67,0xdd,0x68,0x58,0xb7,0x61,0xe4,0x6c,0x6b,0xd3,0x20,0x04,},"\xb5\xe8\xb0\x16\x25\x66\x4b\x22\x23\x39\xe0\xf0\x5f\x93\xa9\x90\xba\x48\xb5\x6a\xe6\x54\x39\xa1\x75\x20\x93\x2d\xf0\x11\x72\x1e\x28\x4d\xbe\x36\xf9\x86\x31\xc0\x66\x51\x00\x98\xa6\x8d\x7b\x69\x2a\x38\x63\xe9\x9d\x58\xdb\x76\xca\x56\x67\xc8\x04\x3c\xb1\x0b\xd7\xab\xba\xf5\x06\x52\x9f\xbb\x23\xa5\x16\x6b\xe0\x38\xaf\xfd\xb9\xa2\x34\xc4\xf4\xfc\xf4\x3b\xdd\xd6\xb8\xd2\xce\x77\x2d\xd6\x53\xed\x11\x5c\x09\x5e\x23\x2b\x26\x9d\xd4\x88\x8d\x23\x68\xcb\x1c\x66\xbe\x29\xdd\x38\x3f\xca\x67\xf6\x67\x65\xb2\x96\x56\x4e\x37\x55\x5f\x0c\x0e\x48\x45\x04\xc5\x91\xf0\x06\xea\x85\x33\xa1\x25\x83\xad\x2e\x48\x31\x8f\xf6\xf3\x24\xec\xaf\x80\x4b\x1b\xae\x04\xaa\x89\x67\x43\xe6\x7e\xf6\x1c\xa3\x83\xd5\x8e\x42\xac\xfc\x64\x10\xde\x30\x77\x6e\x3b\xa2\x62\x37\x3b\x9e\x14\x41\x94\x39\x55\x10\x1a\x4e\x76\x82\x31\xad\x9c\x65\x29\xef\xf6\x11\x8d\xde\x5d\xf0\x2f\x94\xb8\xd6\xdf\x2d\x99\xf2\x78\x63\xb5\x17\x24\x3a\x57\x9e\x7a\xaf\xf3\x11\xea\x3a\x02\x82\xe4\x7c\xa8\x76\xfa\xbc\x22\x80\xfc\xe7\xad\xc9\x84\xdd\x0b\x30\x88\x5b\x16\x50\xf1\x47\x1d\xfc\xb0\x52\x2d\x49\xfe\xc7\xd0\x42\xf3\x2a\x93\xbc\x36\x8f\x07\x60\x06\xea\x01\xec\x1c\x74\x12\xbf\x66\xf6\x2d\xc8\x8d\xe2\xc0\xb7\x47\x01\xa5\x61\x4e\x85\x5e\x9f\xa7\x28\xfb\x1f\x11\x71\x38\x5f\x96\xaf\xbd\xe7\x0d\xea\x02\xe9\xaa\x94\xdc\x21\x84\x8c\x26\x30\x2b\x50\xae\x91\xf9\x69\x3a\x18\x64\xe4\xe0\x95\xae\x03\xcd\xc2\x2a\xd2\x8a\x0e\xb7\xdb\x59\x67\x79\x24\x67\x12\xfa\xb5\xf5\xda\x32\x7e\xfe\xc3\xe7\x96\x12\xde\x0a\x6c\xca\xa5\x36\x75\x9b\x8e"}, +{{0xa2,0x83,0x6a,0x65,0x42,0x79,0x12,0x12,0x2d,0x25,0xdc,0xdf,0xc9,0x9d,0x70,0x46,0xfe,0x9b,0x53,0xd5,0xc1,0xbb,0x23,0x61,0x7f,0x11,0x89,0x0e,0x94,0xca,0x93,0xed,},{0x8c,0x12,0xbd,0xa2,0x14,0xc8,0xab,0xb2,0x28,0x6a,0xcf,0xfb,0xf8,0x11,0x24,0x25,0x04,0x0a,0xab,0x9f,0x4d,0x8b,0xb7,0x87,0x0b,0x98,0xda,0x01,0x59,0xe8,0x82,0xf1,},{0xe6,0xa9,0xa6,0xb4,0x36,0x55,0x9a,0x43,0x20,0xc4,0x5c,0x0c,0x2c,0x4a,0x2a,0xed,0xec,0xb9,0x0d,0x41,0x6d,0x52,0xc8,0x26,0x80,0xac,0x73,0x30,0xd0,0x62,0xae,0xbe,0xf3,0xe9,0xac,0x9f,0x2c,0x5f,0xfa,0x45,0x5c,0x9b,0xe1,0x13,0x01,0x3a,0x2b,0x28,0x2e,0x56,0x00,0xfd,0x30,0x64,0x35,0xad,0xa8,0x3b,0x1e,0x48,0xba,0x2a,0x36,0x05,},"\x81\x3d\x60\x61\xc5\x6e\xae\x0f\xf5\x30\x41\xc0\x24\x4a\xa5\xe2\x9e\x13\xec\x0f\x3f\xb4\x28\xd4\xbe\xb8\xa9\x9e\x04\xbc\xa8\xc4\x1b\xdd\xb0\xdb\x94\x5f\x48\x7e\xfe\x38\xf2\xfc\x14\xa6\x28\xfa\xfa\x24\x62\xf8\x60\xe4\xe3\x42\x50\xeb\x4e\x93\xf1\x39\xab\x1b\x74\xa2\x61\x45\x19\xe4\x1e\xe2\x40\x3b\xe4\x27\x93\x0a\xb8\xbc\x82\xec\x89\xce\xaf\xb6\x09\x05\xbd\x4d\xdb\xbd\x13\xbd\xb1\x96\x54\x31\x4f\xc9\x23\x73\x14\x0b\x96\x2e\x22\x58\xe0\x38\xd7\x1b\x9e\xc6\x6b\x84\xef\x83\x19\xe0\x35\x51\xcb\x70\x7e\x74\x7f\x6c\x40\xad\x47\x6f\xbe\xfd\xce\x71\xf3\xa7\xb6\x7a\x1a\xf1\x86\x9b\xc6\x44\x06\x86\xe7\xe0\x85\x5e\x4f\x36\x9d\x1d\x88\xb8\x09\x9f\xba\x54\x71\x46\x78\x62\x7b\xba\x1a\xff\x41\xe7\x70\x7b\xc9\x7e\xdd\xf8\x90\xb0\xc0\x8d\xce\x3e\x98\x00\xd2\x4c\x6f\x61\x09\x2c\xe2\x8d\x48\x1b\x5d\xea\x5c\x09\x6c\x55\xd7\x2f\x89\x46\x00\x91\x31\xfb\x96\x8e\x2b\xc8\xa0\x54\xd8\x25\xad\xab\x76\x74\x0d\xcf\x0d\x75\x8c\x8b\xf5\x4f\xf3\x86\x59\xe7\x1b\x32\xbf\xe2\xe6\x15\xaa\xab\xb0\xf5\x29\x30\x85\x64\x9c\xf6\x0b\x98\x47\xbc\x62\x01\x1c\xe3\x87\x8a\xf6\x28\x98\x4a\x58\x40\xa4\xad\x5d\xae\x37\x02\xdb\x36\x7d\xa0\xf8\xa1\x65\xfe\xd0\x51\x7e\xb5\xc4\x42\xb0\x14\x53\x30\x24\x1b\x97\xee\xca\x73\x3b\xa6\x68\x8b\x9c\x12\x9a\x61\xcd\x12\x36\xaf\xf0\xe2\x7b\xcf\x98\xc2\x8b\x0f\xbe\xea\x55\xa3\xd7\xc7\x19\x3d\x64\x4b\x27\x49\xf9\x86\xbd\x46\xaf\x89\x38\xe8\xfa\xae\xaf\xbd\x9c\xec\x36\x12\xab\x00\x5b\xd7\xc3\xee\xaf\xe9\xa3\x12\x79\xca\x61\x02\x56\x06\x66\xba\x16\x13\x6f\xf1\x45\x2f\x85\x0a\xdb"}, +{{0xf0,0x51,0xaf,0x42,0x6d,0x0c,0x32,0x82,0xfa,0xfc,0x8b,0xf9,0x12,0xad,0xe1,0xc2,0x42,0x11,0xa9,0x5a,0xd2,0x00,0xe1,0xee,0xf5,0x49,0x32,0x0e,0x1c,0xb1,0xa2,0x52,},{0xfa,0x87,0x95,0x5e,0x0e,0xa1,0x3d,0xde,0x49,0xd8,0x3d,0xc2,0x2e,0x63,0xa2,0xbd,0xf1,0x07,0x67,0x25,0xc2,0xcc,0x7f,0x93,0xc7,0x65,0x11,0xf2,0x8e,0x79,0x44,0xf2,},{0xb8,0xf7,0x13,0x57,0x8a,0x64,0x46,0x67,0x19,0xac,0xeb,0x43,0x2f,0xce,0x30,0x2a,0x87,0xcf,0x06,0x6b,0xf3,0xe1,0x02,0xa3,0x50,0x61,0x69,0x21,0xa8,0x40,0x96,0x4b,0xfc,0x7e,0x68,0x5d,0x8f,0xd1,0x74,0x55,0xac,0x3e,0xb4,0x86,0x1e,0xdc,0xb8,0x97,0x9d,0x35,0xe3,0xa4,0xbd,0x82,0xa0,0x78,0xcd,0x70,0x77,0x21,0xd7,0x33,0x40,0x0e,},"\xb4\x8d\x9f\x84\x76\x2b\x3b\xcc\x66\xe9\x6d\x76\xa6\x16\xfa\x8f\xe8\xe0\x16\x95\x25\x1f\x47\xcf\xc1\xb7\xb1\x7d\x60\xdc\x9f\x90\xd5\x76\xef\x64\xee\x7d\x38\x85\x04\xe2\xc9\x07\x96\x38\x16\x5a\x88\x96\x96\x47\x1c\x98\x9a\x87\x6f\x8f\x13\xb6\x3b\x58\xd5\x31\xfe\xa4\xdd\x12\x29\xfc\x63\x16\x68\xa0\x47\xbf\xae\x2d\xa2\x81\xfe\xae\x1b\x6d\xe3\xeb\xe2\x80\xab\xe0\xa8\x2e\xe0\x0f\xbf\xdc\x22\xce\x2d\x10\xe0\x6a\x04\x92\xff\x14\x04\xdf\xc0\x94\xc4\x0b\x20\x3b\xf5\x57\x21\xdd\x78\x7e\xd4\xe9\x1d\x55\x17\xaa\xf5\x8d\x3b\xdd\x35\xd4\x4a\x65\xae\x6b\xa7\x56\x19\xb3\x39\xb6\x50\x51\x8c\xef\xcc\x17\x49\x3d\xe2\x7a\x3b\x5d\x41\x78\x8f\x87\xed\xbd\xe7\x26\x10\xf1\x81\xbf\x06\xe2\x08\xe0\xeb\x7c\xdf\xe8\x81\xd9\x1a\x2d\x6c\xc7\x7a\xa1\x9c\x0f\xcf\x33\x0f\xed\xb4\x46\x75\xd8\x00\xeb\x8c\xff\x95\x05\xd8\x88\x75\x44\xa5\x03\xcb\xe3\x73\xc4\x84\x7b\x19\xe8\xf3\x99\x57\x26\xef\xd6\x64\x98\x58\x59\x5c\x57\xcc\xaf\x0c\xbc\x9e\xb2\x5d\xe8\x3b\xa0\x46\xbc\x9f\x18\x38\xac\x7b\x89\x53\xdd\x81\xb8\x1a\xc0\xf6\x8d\x0e\x93\x38\xcb\x55\x40\x25\x52\xaf\xb6\xbc\x16\x94\x93\x51\xb9\x26\xd1\x51\xa8\x2e\xfc\x69\x5e\x8d\x7d\xa0\xdd\x55\x09\x93\x66\x78\x97\x18\xcc\xbf\x36\x03\x0b\xd2\xc3\xc1\x09\x39\x9b\xe2\x6c\xdb\x8b\x9e\x2a\x15\x5f\x3b\x2c\xb1\xbf\xa7\x1a\xb6\x9a\x23\x62\x5a\x4a\xc1\x18\xfe\x91\xcb\x2c\x19\x78\x8c\xf5\x2a\x71\xd7\x30\xd5\x76\xb4\x21\xd9\x69\x82\xa5\x1a\x29\x91\xda\xec\x44\x0c\xda\x7e\x6c\xc3\x28\x2b\x83\x12\x71\x42\x78\xb8\x19\xbf\xe2\x38\x7e\xb9\x6a\xa9\x1d\x40\x17\x30\x34\xf4\x28"}, +{{0xa1,0x03,0xe9,0x26,0x72,0xc6,0x5f,0x81,0xea,0x5d,0xa1,0xff,0xf1,0xa4,0x03,0x87,0x88,0x47,0x9e,0x94,0x1d,0x50,0x3a,0x75,0x6f,0x4a,0x75,0x52,0x01,0xa5,0x7c,0x1d,},{0xee,0x63,0xa5,0xb6,0x96,0x41,0x21,0x7a,0xcb,0xaf,0x33,0x39,0xda,0x82,0x9e,0xc0,0x71,0xb9,0x93,0x1e,0x59,0x87,0x15,0x35,0x14,0xd3,0x01,0x40,0x83,0x7a,0x7a,0xf4,},{0x2a,0xa2,0x03,0x5c,0x2c,0xe5,0xb5,0xe6,0xae,0x16,0x1e,0x16,0x8f,0x3a,0xd0,0xd6,0x59,0x2b,0xcf,0x2c,0x4a,0x04,0x9d,0x3e,0xd3,0x42,0xfc,0xeb,0x56,0xbe,0x9c,0x7c,0xb3,0x72,0x02,0x75,0x73,0xae,0x01,0x78,0xe8,0x87,0x8e,0xbe,0xfc,0xa7,0xb0,0x30,0x32,0x7b,0x8a,0xad,0x41,0x85,0x7d,0xe5,0x8c,0xb7,0x8e,0x1a,0x00,0xcb,0xac,0x05,},"\xb1\x98\x4e\x9e\xec\x08\x5d\x52\x4c\x1e\xb3\xb9\x5c\x89\xc8\x4a\xe0\x85\xbe\x5d\xc6\x5c\x32\x6e\x19\x02\x5e\x12\x10\xa1\xd5\x0e\xdb\xbb\xa5\xd1\x37\x0c\xf1\x5d\x68\xd6\x87\xeb\x11\x32\x33\xe0\xfb\xa5\x0f\x94\x33\xc7\xd3\x58\x77\x39\x50\xc6\x79\x31\xdb\x82\x96\xbb\xcb\xec\xec\x88\x8e\x87\xe7\x1a\x2f\x75\x79\xfa\xd2\xfa\x16\x2b\x85\xfb\x97\x47\x3c\x45\x6b\x9a\x5c\xe2\x95\x66\x76\x96\x9c\x7b\xf4\xc4\x56\x79\x08\x5b\x62\xf2\xc2\x24\xfc\x7f\x45\x87\x94\x27\x3f\x6d\x12\xc5\xf3\xe0\xd0\x69\x51\x82\x4d\x1c\xca\x3e\x2f\x90\x45\x59\xed\x28\xe2\x86\x8b\x36\x6d\x79\xd9\x4d\xc9\x86\x67\xb9\xb5\x92\x42\x68\xf3\xe3\x9b\x12\x91\xe5\xab\xe4\xa7\x58\xf7\x70\x19\xda\xcb\xb2\x2b\xd8\x19\x6e\x0a\x83\xa5\x67\x76\x58\x83\x6e\x96\xca\x56\x35\x05\x5a\x1e\x63\xd6\x5d\x03\x6a\x68\xd8\x7a\xc2\xfd\x28\x3f\xdd\xa3\x90\x31\x99\x09\xc5\xcc\x76\x80\x36\x88\x48\x87\x3d\x59\x7f\x29\x8e\x0c\x61\x72\x30\x80\x30\xff\xd4\x52\xbb\x13\x63\x61\x7b\x31\x6e\xd7\xcd\x94\x9a\x16\x5d\xc8\xab\xb5\x3f\x99\x1a\xef\x3f\x3e\x95\x02\xc5\xdf\xe4\x75\x6b\x7c\x6b\xfd\xfe\x89\xf5\xe0\x0f\xeb\xdd\x6a\xfb\x04\x02\x81\x8f\x11\xcf\x8d\x1d\x58\x64\xfe\x9d\xa1\xb8\x6e\x39\xaa\x93\x58\x31\x50\x6c\xf2\x40\x0e\xa7\xed\x75\xbd\x95\x33\xb2\x3e\x20\x2f\xe8\x75\xd7\xd9\x63\x8c\x89\xd1\x1c\xb2\xd6\xe6\x02\x1a\xe6\xbd\x27\xc7\x75\x48\x10\xd3\x5c\xd3\xa6\x14\x94\xf2\x7b\x16\xfc\x79\x4e\x2c\xd2\xf0\xd3\x45\x3a\xda\x93\x38\x65\xdb\x78\xc5\x79\x57\x1f\x8f\xc5\xc5\xc6\xbe\x8e\xaf\xfc\xe6\xa8\x52\xe5\xb3\xb1\xc5\x24\xc4\x93\x13\xd4\x27\xab\xcb"}, +{{0xd4,0x7c,0x1b,0x4b,0x9e,0x50,0xcb,0xb7,0x1f,0xd0,0x7d,0x09,0x6d,0x91,0xd8,0x72,0x13,0xd4,0x4b,0x02,0x43,0x73,0x04,0x47,0x61,0xc4,0x82,0x2f,0x9d,0x9d,0xf8,0x80,},{0xf4,0xe1,0xcb,0x86,0xc8,0xca,0x2c,0xfe,0xe4,0x3e,0x58,0x59,0x4a,0x87,0x78,0x43,0x6d,0x3e,0xa5,0x19,0x70,0x4e,0x00,0xc1,0xbb,0xe4,0x8b,0xbb,0x1c,0x94,0x54,0xf8,},{0x62,0x7e,0x7c,0xa7,0xe3,0x4e,0xd6,0x33,0x1d,0x62,0xb9,0x54,0x1c,0x1e,0xa9,0xa9,0x29,0x2b,0xe7,0xb0,0xa6,0x5d,0x80,0x5e,0x26,0x6b,0x51,0x22,0x27,0x2a,0x82,0xdb,0x7d,0x76,0x5a,0xcc,0x7e,0x2a,0x29,0x0d,0x68,0x58,0x04,0x92,0x2f,0x91,0xed,0x04,0xa3,0xc3,0x82,0xc0,0x3f,0xf2,0x1a,0x17,0x68,0xf5,0x84,0x41,0x3c,0x4e,0x5f,0x00,},"\x88\xd7\x00\x9d\x51\xde\x3d\x33\x7e\xef\x0f\x21\x5e\xa6\x6a\xb8\x30\xec\x5a\x9e\x68\x23\x76\x1c\x3b\x92\xad\x93\xea\x34\x1d\xb9\x2e\xce\x67\xf4\xef\x4c\xeb\x84\x19\x4a\xe6\x92\x6c\x3d\x01\x4b\x2d\x59\x78\x1f\x02\xe0\xb3\x2f\x9a\x61\x12\x22\xcb\x9a\x58\x50\xc6\x95\x7c\xb8\x07\x9a\xe6\x4e\x08\x32\xa1\xf0\x5e\x5d\x1a\x3c\x57\x2f\x9d\x08\xf1\x43\x7f\x76\xbb\x3b\x83\xb5\x29\x67\xc3\xd4\x8c\x35\x76\x84\x88\x91\xc9\x65\x8d\x49\x59\xeb\x80\x65\x6d\x26\xcd\xba\x08\x10\x03\x7c\x8a\x18\x31\x8f\xf1\x22\xf8\xaa\x89\x85\xc7\x73\xcb\x31\x7e\xfa\x2f\x55\x7f\x1c\x38\x96\xbc\xb1\x62\xdf\x5d\x87\x68\x1b\xb7\x87\xe7\x81\x3a\xa2\xde\xa3\xb0\xc5\x64\xd6\x46\xa9\x28\x61\xf4\x44\xca\x14\x07\xef\xba\xc3\xd1\x24\x32\xcb\xb7\x0a\x1d\x0e\xaf\xfb\x11\x74\x1d\x37\x18\xfe\xde\xe2\xb8\x30\x36\x18\x9a\x6f\xc4\x5a\x52\xf7\x4f\xa4\x87\xc1\x8f\xd2\x64\xa7\x94\x5f\x6c\x9e\x44\xb0\x11\xf5\xd8\x66\x13\xf1\x93\x9b\x19\xf4\xf4\xfd\xf5\x32\x34\x05\x7b\xe3\xf0\x05\xad\x64\xee\xbf\x3c\x8f\xfb\x58\xcb\x40\x95\x6c\x43\x36\xdf\x01\xd4\x42\x4b\x70\x6a\x0e\x56\x1d\x60\x17\x08\xd1\x24\x85\xe2\x1b\xcb\x6d\x79\x9d\x8d\x1d\x04\x4b\x40\x00\x64\xec\x09\x44\x50\x14\x06\xe7\x02\x53\x94\x70\x06\xca\xbb\xdb\x2d\xd6\xbd\x8c\xee\x44\x97\x65\x3d\x91\x13\xa4\x4d\x4d\xe9\xb6\x8d\x4c\x52\x6f\xca\x0b\x9b\x0c\x18\xfe\x50\xfb\x91\x7f\xdd\x9a\x91\x4f\xb8\x16\x10\x8a\x73\xa6\xb3\xff\xf9\xe6\x54\xe6\x9c\x9c\xfe\x02\xb0\x5c\x6c\x1b\x9d\x15\xc4\xe6\x5c\xf3\x10\x18\xb8\x10\x0d\x78\x46\x33\xee\x18\x88\xee\xe3\x57\x2a\xaf\xa6\xf1\x89\xea\x22\xd0"}, +{{0xfc,0x0c,0x32,0xc5,0xeb,0x6c,0x71,0xea,0x08,0xdc,0x2b,0x30,0x0c,0xbc,0xef,0x18,0xfd,0xde,0x3e,0xa2,0x0f,0x68,0xf2,0x17,0x33,0x23,0x7b,0x4d,0xda,0xab,0x90,0x0e,},{0x47,0xc3,0x7d,0x8a,0x08,0x08,0x57,0xeb,0x87,0x77,0xa6,0xc0,0xa9,0xa5,0xc9,0x27,0x30,0x3f,0xaf,0x5c,0x32,0x09,0x53,0xb5,0xde,0x48,0xe4,0x62,0xe1,0x2d,0x00,0x62,},{0x68,0x87,0xc6,0xe2,0xb9,0x8a,0x82,0xaf,0x5e,0xe3,0xdf,0xa7,0xca,0x2c,0xb2,0x5d,0x9c,0x10,0x74,0x56,0x20,0xa8,0x29,0x56,0xac,0xba,0x85,0xcb,0x57,0xc8,0xec,0x24,0x27,0x9f,0xa4,0x2f,0x09,0x23,0x59,0xa1,0xb6,0xbb,0xea,0xfb,0xa0,0x50,0xf1,0x4b,0x62,0x88,0x20,0x9e,0x6e,0xf7,0xbc,0x1e,0x0a,0x2b,0x87,0x2c,0x11,0x38,0xf3,0x05,},"\xa7\xb1\xe2\xdb\x6b\xdd\x96\xb3\xd5\x14\x75\x60\x35\x37\xa7\x6b\x42\xb0\x4d\x7e\xbd\x24\xfe\x51\x5a\x88\x76\x58\xe4\xa3\x52\xe2\x21\x09\x33\x56\x39\xa5\x9e\x25\x34\x81\x1f\x47\x53\xb7\x02\x09\xd0\xe4\x69\x8e\x9d\x92\x60\x88\x82\x6c\x14\x68\x96\x81\xea\x00\xfa\x3a\x2f\xca\xa0\x04\x7c\xed\x3e\xf2\x87\xe6\x17\x25\x02\xb2\x15\xe5\x64\x97\x61\x4d\x86\xb4\xcb\x26\xbc\xd7\x7a\x2e\x17\x25\x09\x36\x0e\xe5\x88\x93\xd0\x1c\x0d\x0f\xb4\xd4\xab\xfe\x4d\xbd\x8d\x2a\x2f\x54\x19\x0f\xa2\xf7\x31\xc1\xce\xac\x68\x29\xc3\xdd\xc9\xbf\xb2\xff\xd7\x0c\x57\xba\x0c\x2b\x22\xd2\x32\x6f\xbf\xe7\x39\x0d\xb8\x80\x9f\x73\x54\x7f\xf4\x7b\x86\xc3\x6f\x2b\xf7\x45\x4e\x67\x8c\x4f\x1c\x0f\xa8\x70\xbd\x0e\x30\xbb\xf3\x27\x8e\xc8\xd0\xc5\xe9\xb6\x4a\xff\x0a\xf6\x4b\xab\xc1\x9b\x70\xf4\xcf\x9a\x41\xcb\x8f\x95\xd3\xcd\xe2\x4f\x45\x6b\xa3\x57\x1c\x8f\x02\x1d\x38\xe5\x91\xde\xc0\x5c\xb5\xd1\xca\x7b\x48\xf9\xda\x4b\xd7\x34\xb0\x69\xa9\xfd\x10\x65\x00\xc1\xf4\x08\xab\x7f\xe8\xe4\xa6\xe6\xf3\xed\x64\xda\x0e\xd2\x4b\x01\xe3\x3d\xf8\x47\x5f\x95\xfa\x9e\xd7\x1d\x04\xdd\x30\xb3\xcd\x82\x37\x55\xa3\x40\x1b\xf5\xaf\xae\x10\xee\x7e\x18\xec\x6f\xe6\x37\xc3\x79\x3f\xd4\x34\xb4\x8d\x71\x45\x13\x04\x47\xe0\x02\x99\x10\x10\x52\x55\x8b\x50\x65\x54\xec\x9c\x39\x9f\x62\x94\x1c\x3f\x41\x4c\xbc\x35\x2c\xaa\x34\x5b\x93\x0a\xde\xcf\xad\xda\xc9\x1e\xe5\x3d\x14\x51\xa6\x5e\x06\x20\x10\x26\x32\x5d\xe0\x7c\x93\x1f\x69\xbb\xa8\x68\xa7\xc8\x7e\xe2\x3c\x60\x4e\xc6\x79\x43\x32\x91\x7d\xfe\x2c\x5b\x69\x66\x9b\x65\x97\x06\x91\x7f\x71\xed\xdf\x96"}, +{{0xa8,0xd7,0x3d,0x63,0x9a,0x23,0xcc,0x6a,0x96,0x7e,0xf3,0x1b,0xca,0xbb,0x5d,0x06,0x3e,0x53,0xe1,0xea,0xb8,0xfc,0xc7,0xca,0xb9,0xbc,0x3a,0x17,0xfd,0xe9,0xc2,0xf8,},{0x8d,0xaa,0x9f,0x4c,0x8b,0x1a,0x44,0x69,0x1b,0xf4,0x45,0x21,0xf2,0xf7,0xca,0x45,0xdc,0x7f,0xc6,0x1f,0x6a,0x4c,0xe6,0xf9,0x8f,0xaa,0x41,0xc2,0xa7,0x49,0x77,0xd1,},{0xc4,0xdc,0xef,0x1a,0x24,0x53,0x93,0x9b,0x36,0x4b,0x34,0x02,0x50,0xc3,0x12,0x94,0x31,0x43,0x1d,0x5b,0xa3,0xf4,0x76,0x70,0xab,0x07,0xce,0x68,0x0c,0x69,0xbf,0x28,0xb6,0x78,0x62,0x7c,0x76,0xa6,0x36,0x0f,0xc4,0x0d,0xc1,0x09,0xaa,0x7d,0xea,0x37,0x1b,0x82,0x5e,0x46,0x13,0x4f,0x62,0x45,0x72,0x18,0x2a,0xcf,0x39,0x57,0xe7,0x0f,},"\xfd\x1f\xac\x3d\x53\x31\x3b\x11\xac\xd2\x9f\x5a\x83\xac\x11\x89\x6d\xab\x25\x30\xfa\x47\x86\x5b\x22\x95\xc0\xd9\x9d\xd6\x7c\x36\xed\x8e\x5f\xa5\x49\x15\x0c\x79\x4c\x55\x49\xef\xb5\xc1\xd6\x91\x14\xd5\xd6\x07\xb2\x32\x85\xb7\x21\x2a\xfa\xab\x57\x84\x6a\x54\xae\x67\xb9\xe8\x80\xe0\x7b\x65\x86\x60\x7c\xec\xf6\xd4\xee\xd5\x16\xa3\xa7\x55\x11\xfe\x36\x7d\x88\xeb\x87\x1e\x6d\x71\xb7\xd6\xaa\x13\x67\xa0\x14\x21\xb1\x08\x8f\xc2\xd7\x5e\x44\x95\x4b\x73\x62\x5c\x52\xda\x8a\x3a\x18\x3c\x60\xbe\x9d\xa6\x05\x0f\x59\xa4\x53\xca\xa5\x35\x20\x59\x36\x71\x72\x8d\x43\x18\x77\xbf\xaa\xc9\x13\xa7\x65\xfb\x6a\x56\xb7\x52\x90\xb2\xa8\xaa\xac\x34\xaf\xb9\x21\x7b\xa1\xb0\xd5\x85\x0b\xa0\xfd\xab\xf8\x09\x69\xde\xf0\xfe\xee\x79\x4c\xeb\x60\x61\x4e\x33\x68\xe6\x3e\xf2\x0e\x4c\x32\xd3\x41\xec\x9b\x03\x28\xea\x9f\xe1\x39\x20\x7e\xd7\xa6\x26\xff\x08\x94\x3b\x41\x52\x33\xdb\x7c\xfc\xc8\x45\xc9\xb6\x31\x21\xd4\xed\x52\xec\x37\x48\xab\x6a\x1f\x36\xb2\x10\x3c\x7d\xc7\xe9\x30\x3a\xce\xa4\xba\x8a\xf7\xa3\xe0\x71\x84\xfb\x49\x1e\x89\x1e\xde\x84\xf0\xdc\x41\xca\xdc\x39\x73\x02\x8e\x87\x9a\xcd\x20\x31\xaf\xc2\x9a\x16\x09\x28\x68\xe2\xc7\xf5\x39\xfc\x1b\x79\x2e\xda\xb1\x95\xa2\x5a\xb9\x83\x06\x61\x34\x6b\x39\xef\x53\x91\x5d\xe4\xaf\x52\xc4\x21\xea\xf1\x72\xe9\xda\x76\xa0\x8c\x28\x3a\x52\xdf\x90\x7f\x70\x5d\x7e\x85\x99\xc5\xba\xae\x0c\x2a\xf3\x80\xc1\xbb\x46\xf9\x34\x84\xa0\x3f\x28\x37\x43\x24\xb2\x78\x99\x2b\x50\xb7\xaf\xa0\x25\x52\xca\xfa\x50\x3f\x03\x4f\x8d\x86\x6e\x9b\x72\x02\x71\xdd\x68\xcc\xb6\x85\xa8\x5f\xff\xd1"}, +{{0x79,0xc7,0xdc,0xb7,0xd5,0x9a,0x8d,0xf6,0xb2,0xb2,0xba,0x04,0x13,0x05,0x9d,0x89,0x68,0x09,0x95,0xc2,0x0e,0x91,0x6d,0xa0,0x1b,0x8f,0x06,0x7d,0xc6,0x0c,0xde,0xb4,},{0x29,0x87,0x43,0xc7,0x39,0x18,0xbd,0x55,0x6b,0x28,0xf8,0xd4,0x82,0x4a,0x09,0xb8,0x14,0x75,0x2a,0x7a,0xea,0xe7,0xee,0x04,0x87,0x5c,0x53,0xf4,0xd6,0xb1,0x08,0xd9,},{0x7b,0x7c,0xbe,0x44,0xc7,0x71,0xe4,0x37,0x1b,0xae,0x13,0xb0,0x72,0x2b,0xab,0xcc,0x10,0x64,0x15,0x57,0x32,0x96,0x2f,0x40,0x7c,0xba,0x2a,0xcd,0x35,0x38,0x1d,0x42,0x21,0x0b,0xec,0xe8,0x22,0xf4,0x68,0x11,0x21,0xfd,0x4d,0xab,0x74,0x5a,0x1f,0x30,0x77,0x92,0x2f,0xba,0x1a,0x78,0x04,0x5b,0x71,0x29,0x02,0xba,0xcc,0xac,0x66,0x0e,},"\x5f\xe2\x02\xf5\xb3\x3b\x77\x88\x81\x0d\x25\x08\xa1\x3b\x31\x14\xd6\x9b\x85\x96\xe6\xea\xcd\xa0\x5a\x04\xa2\xeb\x59\x7f\xa3\x27\x9c\x20\x8b\x5a\x5b\x65\xda\xac\xb6\x99\xf1\x44\xe1\xd6\x60\xe7\x8e\x13\x9b\x57\x83\x31\xab\xec\x5c\x3c\x35\x33\x44\x54\xf0\x3e\x83\x2c\x8d\x6e\x29\x84\xdf\x5d\x45\x0e\xcb\x5d\x33\x58\x2a\x78\x80\x8a\x9c\x78\xf2\x6e\xbc\xd1\x24\x4e\xf5\x2e\x3f\xa6\xdc\xa1\x15\xc1\xf0\xcb\x56\xe3\x8e\xae\x0e\x5b\x39\xf5\xfd\x86\x3d\xff\xd0\xb2\xfb\x5b\x95\x8f\x2d\x73\x9d\xb3\x12\xfc\x66\x7a\x17\xb0\x31\xc4\xc9\xf8\xc5\xa2\xad\x57\x79\x84\xcc\x41\x46\xc4\x37\x58\x0e\xfd\x21\x52\x17\x3f\xe0\xd5\x78\x2c\xc2\xae\x98\x31\xa8\xd9\xa0\x41\x77\x25\x60\x18\xff\x76\x31\xe0\xb0\xd8\xa9\x9c\xb2\x8f\x00\x8b\x32\x04\x21\xe2\x7a\x74\xc3\x13\x59\x18\x86\x63\x45\x6d\x85\xe0\x98\xc1\xeb\xd2\x81\x70\x10\x97\xb6\xae\x5a\x87\x1e\x5c\xcc\x02\x05\x8a\x50\x14\x16\xcb\x91\xc1\x2c\xef\x5b\xe6\xf1\x91\x43\x70\xe5\x63\xf1\xa1\xb2\xaa\x41\xf4\xb8\xee\x84\xcd\x32\xa1\xd5\x09\xe5\x29\x78\x7d\x14\xa4\x45\x43\x8d\x80\x7e\xcd\x62\x0e\x2f\xa2\x6d\xe0\xda\x64\x26\x86\x47\x84\xd4\xa2\x8f\x54\x10\x3e\x60\x92\x83\xb9\x9e\xe9\xb2\xb6\x99\xc9\x80\xbb\xb7\x88\x2c\x3e\xa6\x8d\xdc\x90\x80\x2a\xc2\x32\xf2\xc8\xe8\x42\x91\x98\x7b\xf3\xc5\x24\x09\x21\xb5\x9c\xfa\x21\x49\x69\x31\x76\x73\xd0\xbe\x7f\x34\xb1\xca\x0e\x15\xea\x73\xc7\x17\x54\x01\xce\x55\x0b\xe1\x06\xb4\x9e\x62\xf8\xdb\x68\x69\x5e\x74\x0e\x0f\x3a\x35\x56\xa1\x9f\x3c\x8e\x6b\x91\xac\x1c\xc2\x3e\x86\x3f\xcd\x0f\x0d\x9e\xb7\x04\x7a\xa6\x31\xe0\xd2\xeb\x9b\xcc\x6b"}, +{{0xb9,0xce,0xd0,0x41,0x25,0x93,0xfe,0xfe,0xd9,0x5e,0x94,0xac,0x96,0x5e,0x5b,0x23,0xff,0x9d,0x4b,0x0e,0x79,0x7d,0xb0,0x2b,0xf4,0x97,0x99,0x4d,0x3b,0x79,0x3e,0x60,},{0xc1,0x62,0x9a,0x72,0x31,0x89,0x95,0x93,0x37,0xf5,0x53,0x52,0x01,0xe5,0xd3,0x95,0xba,0x0a,0x03,0xea,0x8c,0x17,0x66,0x0d,0x0f,0x8b,0x6f,0x6e,0x64,0x04,0xbb,0x12,},{0xf1,0xb7,0x97,0xde,0xd8,0xa6,0x94,0x2b,0x12,0x62,0x68,0x48,0x34,0x0f,0xb7,0x19,0xfc,0xdd,0xaf,0xd9,0x8f,0x33,0xe2,0x99,0x2d,0x35,0x7b,0xfd,0xd3,0x59,0x33,0xc7,0xac,0x56,0x1e,0x5b,0x2f,0x93,0x94,0x64,0x33,0x8c,0x56,0x66,0x85,0x4c,0xa8,0x85,0xc4,0xd0,0x46,0xeb,0x2c,0x54,0xe4,0x8a,0x1b,0x5e,0xd2,0x66,0xad,0x34,0xde,0x05,},"\x55\x5b\xb3\x9c\x18\x99\xd5\x7c\xab\xe4\x28\x06\x4c\x2d\x92\x5f\x5f\xc4\xcf\x70\x59\xb9\x5f\xb8\x9a\x8e\x9e\x3a\x7e\x42\x6c\x6c\x92\x2d\x9e\x4d\x76\x98\x4e\xa2\x38\x3c\xab\xb4\xf2\xbe\xfd\x89\xc1\xf2\x0e\xaa\x8a\x00\xdb\xe7\x87\xcf\xa7\x0a\xe2\xae\x6a\xa9\x03\x31\xcb\xbe\x58\x0f\xa5\xa0\x21\x84\xed\x05\xe6\xc8\xe8\x9d\x57\x6a\xf2\x8a\xee\xaf\x7c\x4e\x25\x00\xf3\x58\xa0\x09\x71\xa0\xa7\x59\x20\xe8\x54\x84\x9b\xf3\x32\x14\x29\x75\x40\x4f\x59\x8c\x32\xe9\x69\x82\x04\x3d\x99\x2b\xcd\x1a\x4f\xe8\x19\xbb\x56\x34\xad\x03\x46\x7a\xfc\x4c\xe0\x50\x73\xf8\x8b\xa1\xba\x4a\xe8\x65\x3a\x04\x66\x5c\xf3\xf7\x16\x90\xfe\x13\x34\x38\x85\xbc\x5e\xbc\x0e\x5e\x62\xd8\x82\xf4\x3b\x7c\x68\x90\x0a\xc9\x43\x8b\xf4\xa8\x1c\xe9\x01\x69\xec\x12\x9e\xe6\x3e\x2c\x67\x5a\x1a\x5a\x67\xe2\x7c\xc7\x98\xc4\x8c\xc2\x3f\x51\x07\x8f\x46\x3b\x3b\x7c\xc1\x4e\x3b\xcf\xd2\xe9\xb8\x2c\x75\x24\x09\x34\xcb\xdc\x50\xc4\x30\x8f\x28\x2f\x19\x31\x22\x99\x56\x06\xf4\x01\x35\x10\x0a\x29\x1c\x55\xaf\xdf\x89\x34\xeb\x8b\x61\xd8\x14\x21\x67\x41\x24\xde\xc3\xb8\x8f\x9a\x73\x11\x0a\x9e\x61\x6f\x5b\x82\x6b\x9d\x34\x3f\x3a\xc0\xe9\xd7\xbd\xf4\xfd\x8b\x64\x8b\x40\xf0\x09\x8b\x38\x97\xa3\xa1\xcd\x65\xa6\x45\x70\x05\x9b\x8b\xc5\xc6\x74\x38\x83\x07\x4c\x88\x62\x3c\x1f\x5a\x88\xc5\x89\x69\xe2\x1c\x69\x2a\xca\x23\x68\x33\xd3\x47\x0b\x3e\xb0\x98\x15\xe1\x13\x8e\x9d\x06\x50\xc3\x90\xee\xe9\x77\x42\x21\x93\xb0\x09\x18\xbe\x8a\x97\xcc\x61\x99\xb4\x51\xb0\x5b\x57\x30\xd1\xd1\x33\x58\xcf\x74\x61\x06\x78\xf7\xac\x7f\x78\x95\xcc\x2e\xfc\x45\x6e\x03\x87\x3b"}, +{{0x81,0xda,0x16,0x8f,0x02,0xd4,0x6b,0xb8,0x7c,0xda,0x84,0x5d,0xa4,0x3f,0x8a,0x6c,0xba,0x2c,0x01,0x68,0x78,0xd6,0xf4,0x9c,0x6f,0x06,0x1a,0x60,0xf1,0x55,0xa0,0x4a,},{0xaf,0xf8,0x6e,0x98,0x09,0x3c,0xa4,0xc7,0x1b,0x1b,0x80,0x4c,0x5f,0xe4,0x51,0xcf,0xdf,0x86,0x82,0x50,0xde,0xa3,0x03,0x45,0xfa,0x4b,0x89,0xbb,0x09,0xb6,0xa5,0x3b,},{0x4a,0xac,0xa9,0x47,0xe3,0xf2,0x2c,0xc8,0xb8,0x58,0x8e,0xe0,0x30,0xac,0xe8,0xf6,0xb5,0xf5,0x71,0x1c,0x29,0x74,0xf2,0x0c,0xc1,0x8c,0x3b,0x65,0x5b,0x07,0xa5,0xbc,0x13,0x66,0xb5,0x9a,0x17,0x08,0x03,0x2d,0x12,0xca,0xe0,0x1a,0xb7,0x94,0xf8,0xcb,0xcc,0x1a,0x33,0x08,0x74,0xa7,0x50,0x35,0xdb,0x1d,0x69,0x42,0x2d,0x2f,0xc0,0x0c,},"\x6b\xc6\x72\x6a\x34\xa6\x4a\xae\x76\xab\x08\xc9\x2b\x17\x9e\x54\xff\x5d\x2e\x65\xeb\x2c\x6c\x65\x9a\xe8\x70\x3c\xc2\x45\xcb\xc2\xcf\x45\xa1\x2b\x22\xc4\x68\xae\x61\xfd\x9a\x66\x27\xad\x06\x26\xc9\xb1\xe5\xaf\x41\x2c\xb4\x83\xea\xee\x1d\xb1\x1b\x29\xf0\xa5\x10\xc1\x3e\x38\x02\x0e\x09\xae\x0e\xee\x76\x25\x37\xa3\xe9\xd1\xa0\xc7\xb0\x33\xd0\x97\xfd\xc1\xf4\xf8\x26\x29\xa9\xde\x9e\xf3\x8d\xa1\xcf\x96\xa9\x40\x35\x7d\x5f\x2e\x0e\x7e\x8d\xbc\x29\xdb\x72\x8a\x1e\x6a\xad\x87\x6e\x5e\x05\x31\x13\xd0\x64\x20\x27\x2b\x87\xcf\x0c\x40\xdf\xe0\x3a\x54\x4d\xe9\x6c\x7a\xea\x13\xba\x00\x29\xb5\x7b\x48\xd9\x9d\xcc\x6a\x65\x04\x92\xd7\x8c\x4c\xdd\x1b\x28\xe1\xa1\x15\xa7\xe3\xe7\xa7\xcb\x21\x33\x3d\x4f\xf8\x08\x58\xdf\xb6\x77\x82\xc1\x63\x54\xb8\x71\x65\x96\x56\x0d\x7d\x8e\x38\x9e\xb1\x5a\x05\x2a\x0b\xf5\xd1\x6e\xb5\x4f\xb3\xe4\x97\x3a\xd4\x98\x4e\x72\xa1\x87\xf5\x34\x7d\x5b\x26\x2c\x32\xb1\x64\x7e\x42\xb6\xa5\x38\x37\x09\x6c\xc7\x8c\x2a\x05\xce\x1c\x6e\x12\x49\x3a\x03\xf1\xa6\x67\x58\x4c\xb9\x7f\x4f\xcd\x57\xee\x94\x4c\x65\xb7\xee\xd2\x5f\x7a\xe0\xf3\xf6\xce\xde\x17\x3f\xdf\xac\xf5\xaf\x1d\xb1\x43\x73\x0d\x18\x09\x66\x64\x91\x4b\xa4\xcf\xc6\x96\x6f\x39\x20\x22\x78\x1c\x66\xa9\x41\x7c\xa2\x68\x0b\x51\xf6\x3e\x4f\xba\x42\x4e\xcf\xdb\xc6\xa2\xf0\x17\x87\xd0\xe7\x48\x4f\x8a\x8a\xb3\x90\xae\xaa\x6d\x1f\x7e\xd3\x25\xd8\x2f\xea\xa1\x69\x2a\x49\x84\xfa\xe4\x3d\xa8\x73\x29\xb0\x45\xda\x8f\x0a\x4f\x56\xb6\x95\xaa\x93\x5d\xe1\x52\xce\x03\x85\x15\x37\x20\x97\x9a\x2b\x70\x06\xd4\x05\xfc\xb0\xfb\xa0\x9e\x23\xb8\x5f\xd1\x9b"}, +{{0xaf,0x2e,0x60,0xda,0x0f,0x29,0xbb,0x16,0x14,0xfc,0x3f,0x19,0x3c,0xc3,0x53,0x33,0x19,0x86,0xb7,0x3f,0x3f,0x9a,0x0a,0xec,0x94,0x21,0xb9,0x47,0x3d,0x6a,0x4b,0x6a,},{0xc8,0xbf,0xe2,0x83,0x58,0x22,0x19,0x9c,0x61,0x27,0xb8,0x06,0xfa,0xbe,0xef,0x0c,0xb9,0xff,0x59,0xf3,0xc8,0x1f,0xf0,0xcb,0x89,0xc5,0x56,0xf5,0x51,0x06,0xaf,0x6a,},{0x50,0xf9,0xf9,0x41,0xa8,0xda,0x9f,0x62,0x40,0xf7,0x6d,0x2f,0xa3,0xb0,0x6d,0xd6,0xb2,0x29,0x2e,0xd3,0x2d,0x1c,0x05,0x21,0x80,0x97,0xd3,0x4d,0x8a,0x19,0xdf,0xe5,0x53,0xf7,0x6a,0xe3,0xc6,0xb4,0xa2,0xed,0x20,0x85,0x21,0x28,0x46,0x15,0x40,0xde,0xcf,0x41,0x8f,0x52,0xd3,0x8e,0x64,0x03,0x7e,0xec,0x77,0x71,0xbd,0x1a,0xfe,0x00,},"\x7d\xbb\x77\xb8\x8b\xda\x94\xf3\x44\x41\x6a\x06\xb0\x96\x56\x6c\x6e\x8b\x39\x39\x31\xa8\x24\x3a\x6c\xab\x75\xc3\x61\xfd\xe7\xdc\x53\x6a\xec\x40\xcd\xed\x83\x29\x6a\x89\xe8\xc3\xbe\xf7\xd7\x87\xcf\xc4\x94\x01\xa7\xb9\x18\x3f\x13\x8d\x50\x00\x61\x9f\xf0\x73\xc0\x5e\x2f\x84\x1d\x60\x08\x35\x8f\x10\xa2\xda\x7d\xcf\xac\x3d\x4d\x70\xc2\x0d\x2e\xc3\x4c\x7b\x6d\x5c\xd1\xa7\x34\xd6\xbb\xb1\x1c\x5f\xd8\xd2\xbc\xe3\x2a\xc8\x10\xef\x82\xb4\x18\x8a\xa8\xea\x3c\xfc\x30\x32\x23\x3d\xc0\xe2\x60\x0e\x9d\xb6\xe1\x8b\xc2\x2b\x10\x04\x4a\x31\xc1\x5b\xac\xea\xf5\x55\x4d\xe8\x9d\x2a\x34\x66\x80\x7f\x24\x44\x14\xd0\x80\xff\x29\x63\x95\x6c\x6e\x83\xc8\xe1\x44\xed\x00\x66\x08\x8b\x47\x6d\xdc\xb5\x64\x40\x34\x47\xd9\x15\x9f\x90\x89\xab\xa2\xb4\xd5\x57\x5c\x4d\x8a\xe6\x6f\xc8\x69\x0e\x73\x49\xed\x40\x83\x2e\x63\x69\xc0\x24\x56\x3e\xc4\x93\xbf\xcc\x0f\xc9\xac\x78\x7a\xc8\x41\x39\x7f\xe1\x33\x16\x72\x83\xd8\x0c\x42\xf0\x06\xa9\x9d\x39\xe8\x29\x79\xda\x3f\xa9\x33\x4b\xd9\xed\xe0\xd1\x4b\x41\xb7\x46\x6b\xce\xbb\xe8\x17\x1b\xc8\x04\xa6\x45\xd3\x72\x32\x74\xa1\xb9\x2b\xf8\x2f\xd9\x93\x35\x87\x44\xde\x92\x44\x19\x03\xd4\x36\xfd\x47\xf2\x3d\x40\x05\x2a\x38\x29\x36\x7f\x20\x2f\x05\x53\xb5\xe4\x9b\x76\xc5\xe0\x3f\xa6\xce\x7c\x3c\xf5\xee\xb2\x1d\xe9\x67\xbe\xc4\xdd\x35\x59\x25\x38\x4e\xbf\x96\x69\x7e\x82\x37\x62\xba\xc4\xd4\x3a\x76\x7c\x24\x1a\x4c\xef\x72\x4a\x97\x0d\x00\xff\x3a\x8a\xb3\xb8\x3e\xed\x84\x00\x75\xc7\x4e\x90\xf3\x06\xe3\x30\x01\x32\x60\x96\x21\x61\xe9\xd0\x91\x0d\xe1\x83\x62\x2c\xe9\xa6\xb8\xd5\x14\x42\x80\x55\x0f\xc7"}, +{{0x60,0x5f,0x90,0xb5,0x3d,0x8e,0x4a,0x3b,0x48,0xb9,0x7d,0x74,0x54,0x39,0xf2,0xa0,0x80,0x7d,0x83,0xb8,0x50,0x2e,0x8e,0x29,0x79,0xf0,0x3e,0x8d,0x37,0x6a,0xc9,0xfe,},{0xaa,0x3f,0xae,0x4c,0xfa,0x6f,0x6b,0xfd,0x14,0xba,0x0a,0xfa,0x36,0xdc,0xb1,0xa2,0x65,0x6f,0x36,0x54,0x1a,0xd6,0xb3,0xe6,0x7f,0x17,0x94,0xb0,0x63,0x60,0xa6,0x2f,},{0xdd,0x02,0x12,0xe6,0x32,0x88,0xcb,0xe1,0x4a,0x45,0x69,0xb4,0xd8,0x91,0xda,0x3c,0x7f,0x92,0x72,0x7c,0x5e,0x7f,0x9a,0x80,0x1c,0xf9,0xd6,0x82,0x70,0x85,0xe7,0x09,0x5b,0x66,0x9d,0x7d,0x45,0xf8,0x82,0xca,0x5f,0x07,0x45,0xdc,0xcd,0x24,0xd8,0x7a,0x57,0x18,0x13,0x20,0x19,0x1e,0x5b,0x7a,0x47,0xc3,0xf7,0xf2,0xdc,0xcb,0xd7,0x07,},"\x3b\xcd\xca\xc2\x92\xac\x95\x19\x02\x4a\xae\xce\xe2\xb3\xe9\x99\xff\x5d\x34\x45\xe9\xf1\xeb\x60\x94\x0f\x06\xb9\x12\x75\xb6\xc5\xdb\x27\x22\xed\x4d\x82\xfe\x89\x60\x52\x26\x53\x0f\x3e\x6b\x07\x37\xb3\x08\xcd\xe8\x95\x61\x84\x94\x4f\x38\x8a\x80\x04\x2f\x6c\xba\x27\x4c\x0f\x7d\x11\x92\xa0\xa9\x6b\x0d\xa6\xe2\xd6\xa6\x1b\x76\x51\x8f\xbe\xe5\x55\x77\x3a\x41\x45\x90\xa9\x28\xb4\xcd\x54\x5f\xcc\xf5\x81\x72\xf3\x58\x57\x12\x0e\xb9\x6e\x75\xc5\xc8\xac\x9a\xe3\xad\xd3\x67\xd5\x1d\x34\xac\x40\x34\x46\x36\x0e\xc1\x0f\x55\x3e\xa9\xf1\x4f\xb2\xb8\xb7\x8c\xba\x18\xc3\xe5\x06\xb2\xf0\x40\x97\x06\x3a\x43\xb2\xd3\x64\x31\xcc\xe0\x2c\xaf\x11\xc5\xa4\xdb\x8c\x82\x17\x52\xe5\x29\x85\xd5\xaf\x1b\xfb\xf4\xc6\x15\x72\xe3\xfa\xda\xe3\xad\x42\x4a\xcd\x81\x66\x2e\xa5\x83\x7a\x11\x43\xb9\x66\x93\x91\xd7\xb9\xcf\xe2\x30\xcf\xfb\x3a\x7b\xb0\x3f\x65\x91\xc2\x5a\x4f\x01\xc0\xd2\xd4\xac\xa3\xe7\x4d\xb1\x99\x7d\x37\x39\xc8\x51\xf0\x32\x7d\xb9\x19\xff\x6e\x77\xf6\xc8\xa2\x0f\xdd\x3e\x15\x94\xe9\x2d\x01\x90\x1a\xb9\xae\xf1\x94\xfc\x89\x3e\x70\xd7\x8c\x8a\xe0\xf4\x80\x00\x1a\x51\x5d\x4f\x99\x23\xae\x62\x78\xe8\x92\x72\x37\xd0\x5d\xb2\x3e\x98\x4c\x92\xa6\x83\x88\x2f\x57\xb1\xf1\x88\x2a\x74\xa1\x93\xab\x69\x12\xff\x24\x1b\x9f\xfa\x66\x2a\x0d\x47\xf2\x92\x05\xf0\x84\xdb\xde\x84\x5b\xaa\xeb\x5d\xd3\x6a\xe6\x43\x9a\x43\x76\x42\xfa\x76\x3b\x57\xe8\xdb\xe8\x4e\x55\x81\x3f\x01\x51\xe9\x7e\x5b\x9d\xe7\x68\xb2\x34\xb8\xdb\x15\xc4\x96\xd4\xbf\xcf\xa1\x38\x87\x88\x97\x2b\xb5\x0c\xe0\x30\xbc\x6e\x0c\xcf\x4f\xa7\xd0\x0d\x34\x37\x82\xf6\xba\x8d\xe0"}, +{{0x9e,0x2c,0x3d,0x18,0x98,0x38,0xf4,0xdd,0x52,0xef,0x08,0x32,0x88,0x68,0x74,0xc5,0xca,0x49,0x39,0x83,0xdd,0xad,0xc0,0x7c,0xbc,0x57,0x0a,0xf2,0xee,0x9d,0x62,0x09,},{0xf6,0x8d,0x3b,0x81,0xe7,0x35,0x57,0xee,0x1f,0x08,0xbd,0x2d,0x3f,0x46,0xa4,0x71,0x82,0x56,0xa0,0xf3,0xcd,0x8d,0x2e,0x03,0xeb,0x8f,0xe8,0x82,0xaa,0xb6,0x5c,0x69,},{0x38,0xa3,0x1b,0x6b,0x46,0x50,0x84,0x73,0x82,0x62,0xa2,0x6c,0x06,0x5f,0xe5,0xd9,0xe2,0x88,0x6b,0xf9,0xdd,0x35,0xcd,0xe0,0x5d,0xf9,0xba,0xd0,0xcc,0x7d,0xb4,0x01,0xc7,0x50,0xaa,0x19,0xe6,0x60,0x90,0xbc,0xe2,0x5a,0x3c,0x72,0x12,0x01,0xe6,0x05,0x02,0xc8,0xc1,0x04,0x54,0x34,0x66,0x48,0xaf,0x06,0x5e,0xab,0x0e,0xe7,0xd8,0x0f,},"\x19\x48\x5f\x52\x38\xba\x82\xea\xdf\x5e\xff\x14\xca\x75\xcd\x42\xe5\xd5\x6f\xea\x69\xd5\x71\x8c\xfb\x5b\x1d\x40\xd7\x60\x89\x9b\x45\x0e\x66\x88\x45\x58\xf3\xf2\x5b\x7c\x3d\xe9\xaf\xc4\x73\x8d\x7a\xc0\x9d\xa5\xdd\x46\x89\xbb\xfa\xc0\x78\x36\xf5\xe0\xbe\x43\x2b\x1d\xdc\xf1\xb1\xa0\x75\xbc\x98\x15\xd0\xde\xbc\x86\x5d\x90\xbd\x5a\x0c\x5f\x56\x04\xd9\xb4\x6a\xce\x81\x6c\x57\x69\x4e\xcc\x3d\x40\xd8\xf8\x4d\xf0\xed\xe2\xbc\x4d\x57\x77\x75\xa0\x27\xf7\x25\xde\x08\x16\xf5\x63\xfa\x88\xf8\x8e\x07\x77\x20\xeb\xb6\xac\x02\x57\x46\x04\x81\x98\x24\xdb\x74\x74\xd4\xd0\xb2\x2c\xd1\xbc\x05\x76\x8e\x0f\xb8\x67\xca\x1c\x1a\x7b\x90\xb3\x4a\xb7\xa4\x1a\xfc\x66\x95\x72\x66\xac\x0c\x91\x59\x34\xaa\xf3\x1c\x0c\xf6\x92\x7a\x4f\x03\xf2\x32\x85\xe6\xf2\x4a\xfd\x58\x13\x84\x9b\xb0\x8c\x20\x3a\xc2\xd0\x33\x6d\xcb\xf8\x0d\x77\xf6\xcf\x71\x20\xed\xfb\xcd\xf1\x81\xdb\x10\x7e\xc8\xe0\x0f\x32\x44\x9c\x1d\x3f\x5c\x04\x9a\x92\x69\x4b\x4e\xa2\xc6\xeb\xe5\xe2\xb0\xf6\x4b\x5a\xe5\x0a\xd3\x37\x4d\x24\x6b\x32\x70\x05\x7e\x72\x4a\x27\xcf\x26\x3b\x63\x3a\xb6\x5e\xcb\x7f\x5c\x26\x6b\x80\x07\x61\x8b\x10\xac\x9a\xc8\x3d\xb0\xfe\xbc\x04\xfd\x86\x3d\x96\x61\xab\x6e\x58\x49\x47\x66\xf7\x1b\x9a\x86\x7c\x5a\x7a\x45\x55\xf6\x67\xc1\xaf\x2e\x54\x58\x8f\x16\x2a\x41\xce\x75\x64\x07\xcc\x41\x61\xd6\x07\xb6\xe0\x68\x29\x80\x93\x4c\xaa\x1b\xef\x03\x6f\x73\x30\xd9\xee\xf0\x1e\xcc\x55\x35\x83\xfe\xe5\x99\x4e\x53\x3a\x46\xca\x91\x6f\x60\xf8\xb9\x61\xae\x01\xd2\x0f\x7a\xbf\x0d\xf6\x14\x1b\x60\x4d\xe7\x33\xc6\x36\xb4\x20\x18\xcd\x5f\x1d\x1e\xf4\xf8\x4c\xee\x40\xfc"}, +{{0x31,0x01,0x0d,0x1d,0x67,0xeb,0x61,0x63,0x48,0xe8,0x47,0x92,0xb9,0x2d,0x5d,0xc1,0x28,0x55,0x3c,0xb5,0x2f,0x63,0x68,0x15,0x9f,0xe7,0xb8,0x16,0xcd,0x0e,0x7c,0x37,},{0x26,0x65,0x43,0xd9,0x67,0x87,0xca,0x90,0x1f,0xcf,0xf0,0x6e,0x6e,0x43,0x44,0x91,0xae,0x09,0x70,0x88,0x0a,0x5a,0x18,0x7d,0x53,0x5e,0xdb,0x19,0xdb,0x5c,0xab,0xeb,},{0x7b,0x1e,0xb6,0x77,0xc3,0xe5,0xe6,0xa8,0xb4,0xba,0x69,0xfc,0xb7,0xf6,0xb1,0x87,0x0e,0x42,0xa8,0xd5,0x89,0x58,0xa3,0x5c,0x67,0x4e,0x2d,0xb8,0x21,0x07,0x48,0x1c,0x4c,0x7b,0x37,0xf0,0xf6,0x89,0xd3,0x9d,0x9f,0x51,0xe1,0x81,0xb1,0x7b,0x11,0x08,0xc1,0x5a,0x3e,0x27,0xb2,0x9d,0xf3,0xa4,0x31,0x5d,0xcc,0x4f,0xaf,0x12,0x22,0x05,},"\x39\xf8\x9a\x5e\x7a\xa5\x30\xb5\x46\x3d\x49\x8f\x80\x35\xb9\x90\x9d\x55\xda\x52\x7c\xdb\xd4\xde\x6d\x22\x83\x79\xf0\x89\xe6\x08\xa9\x20\x7a\x2c\x5b\x9c\x42\x05\x1a\x60\xc8\xca\x3f\xb9\x7a\x1c\x06\xcd\x74\x7d\x9d\x07\x39\x97\x0c\xeb\x88\xce\x52\x6f\x97\x11\x40\xea\x2e\xc2\x1f\x09\x0b\xa0\x75\xbf\x89\x75\xfa\xa5\x08\xb1\xcc\x10\xef\xa4\x94\xdc\x17\x2e\x6d\x3d\x3f\x3f\x75\xdc\x8e\x0e\x96\xf0\x5c\x0c\xcc\xb2\xf9\x6e\x91\x1c\xfa\x7a\x2c\x82\xc9\x84\x50\x18\xbb\x1f\x9d\x75\xf8\x2e\x3d\xfe\x11\x39\x34\x7b\x2a\xc0\x58\xb0\x14\xac\x93\x76\x0c\x90\xf5\x56\x7a\xb5\xc4\xeb\xa0\x4b\x49\xfb\x09\xdd\xad\xd3\x05\xbe\x51\x1d\xfe\x05\xc9\x6e\xbc\x86\xfd\x67\xb5\xd0\xab\x57\xd8\x5f\x4f\xe5\xe2\xf0\xfa\x9d\x88\xa6\x8f\x0f\x6b\x6b\xc8\xbb\x94\x4e\xb3\xc0\xb1\x75\x57\xe5\x5d\x5e\xa1\x87\xd9\x22\xa4\x28\x13\xe6\x90\x57\xc9\xb6\xa7\xf7\x5e\x49\x92\x1b\x70\x79\xe5\x8f\x8a\x63\x71\x9e\xe3\xe1\xad\x10\xcf\x0e\x8a\x70\xc4\xf1\x54\x02\x18\xb7\x04\x94\xbd\x02\x9e\xe0\x2f\xf9\x72\x7a\x7d\x85\xd3\x77\x91\x9e\xc4\x05\x14\x79\xb7\x0f\x7c\xd6\x76\x77\x23\xfe\x42\xc1\xc7\x89\x9c\x2b\x7c\x1f\x70\x2d\xd6\xb4\xd1\x3b\x67\x2d\x48\x8f\x34\xa0\xe9\x69\xdb\x79\xcc\x2c\xb2\x52\x4a\x94\x8a\x8d\xe4\xc5\xb6\x23\xec\xd9\x0d\x6e\x82\xd9\x70\x33\xc1\x25\x63\x7d\x1c\xd8\xc8\x48\x03\xd8\xfb\xc0\x12\x84\x6f\xfe\x48\x4f\x6c\x02\x14\x92\x58\xf9\x46\x2f\xa1\xe9\x9c\x30\x7d\xd0\x06\x2f\xe0\xb6\xf1\x1e\xee\x40\xc2\x62\x9e\xf7\xc0\xf6\xa5\x10\x72\x59\xea\x5b\x9f\xfb\x6f\x29\xf1\x2c\x32\xf7\xb5\x22\x8c\xab\xc9\x86\xab\x66\x45\x0a\xf9\xdc\xc3\xda\x09\xd0\xe0\xb9\xa4"}, +{{0x8f,0xf2,0x39,0x8c,0xd5,0x1f,0x51,0xd4,0xc2,0xc5,0x78,0x69,0xa2,0x21,0x8b,0x84,0x86,0x82,0x20,0x31,0xf4,0x00,0x72,0x9f,0x4a,0xc4,0xd5,0x90,0x9c,0x48,0xba,0xfe,},{0xa5,0xa8,0x87,0x04,0xb6,0x86,0x77,0xbe,0x3d,0x16,0xc3,0xdc,0x00,0x52,0xcf,0xee,0x6e,0x2b,0x30,0xe0,0x86,0x09,0x05,0x9d,0x4c,0xba,0x52,0xc6,0xd9,0x60,0x61,0xfb,},{0x41,0x7a,0x64,0x78,0x29,0xc9,0x28,0x98,0xe5,0x20,0xff,0x53,0x11,0xda,0xa0,0xa1,0x39,0xcd,0x8f,0xff,0xcb,0x25,0xa1,0x8e,0x6d,0x9b,0x50,0xcb,0x52,0xcb,0xc3,0x54,0x24,0xc3,0x9e,0xbb,0xb5,0xd5,0xac,0x6a,0x6d,0x63,0xf1,0xf5,0x3c,0x4d,0xf2,0x12,0xf7,0x02,0x5a,0x8a,0xae,0xf8,0xe3,0x64,0x93,0xc8,0x74,0xc3,0xce,0x34,0x1a,0x0e,},"\x99\x39\x53\xe4\x7a\x34\x11\x88\xbc\x59\x29\x42\xe1\x55\x7a\xf2\x95\x46\xe4\xe9\x36\x8e\x2f\x1a\x5e\xe9\x80\x6e\x2b\xaf\x66\xb6\x19\x01\x91\xfc\x5d\x2b\x7e\x47\xde\x37\xff\x05\x4f\xb2\xbb\xb1\xf0\x31\x68\x4a\xda\x5d\x60\x7a\xdd\xa3\xd6\x54\x33\x12\x2f\xa9\x04\xe0\x45\x6f\xaa\x84\x10\x9b\xbc\x51\x7f\x8a\xd3\x96\x60\x87\x63\x82\xad\xcf\xed\x0f\x76\x20\xcf\x11\x64\x62\x2e\xac\xd9\x1e\xb3\x7a\x85\x96\x46\x2e\xbe\x9e\xbe\x26\xbd\xc1\xe3\x2c\xc3\x4a\xd4\x6f\xb1\xce\xa4\x20\xe7\x3c\x31\x21\x54\x08\xe6\xd3\x54\x25\xf4\x4a\x82\x9b\x13\x2f\x63\x1a\x3f\x6d\xd4\xb8\x73\xa0\x00\x66\x7e\x19\xeb\x22\xff\xfd\x59\x03\xaa\xa7\xd4\xc8\xfd\xf2\x19\x53\xc3\xc6\x17\x8f\x5f\x8c\xb2\xaa\x6b\xff\x92\x89\x4e\xad\x83\x58\x88\xdf\x06\x0a\x3c\x90\x43\x02\x6e\x0e\x2c\xef\x27\x54\x97\xe7\xd1\x05\xdf\x3b\x64\x4a\x98\xf2\x6b\xf0\x01\x05\xc9\x94\x13\xee\x0a\xf8\x85\x19\x54\xd6\x5c\xeb\x8d\x79\xad\x30\x71\xb8\xbb\x87\xf0\xb1\x97\x43\xd2\x55\x6f\xfd\x98\x19\x83\x0b\x6e\xeb\xf7\xec\xc7\xe0\x45\x66\x1f\x43\x57\x0c\xe9\xfd\xbb\xe2\xd2\x52\x40\x6f\xa9\x0d\x04\x23\x6f\x22\x2c\x42\x9e\xc1\x6b\x12\x87\x22\x4a\xda\x1a\x53\x21\x61\xae\x8b\x48\x1b\xca\xb8\xd4\x7a\xfb\x3e\xd0\x44\x5b\x30\x60\xfd\x67\x59\x17\x98\x56\xf4\x08\x5c\x1e\x58\x5f\xd7\xc1\x40\x97\x99\xaf\x69\x3c\xf4\x27\xbd\x1d\x3d\xc1\x0b\x5a\xe3\x44\x7a\x8d\x2a\x18\xdc\x3a\x12\xa6\x86\x0b\x22\x17\x5d\xd5\xeb\x53\xa0\x95\x04\x32\xe2\xd7\xae\xfe\xce\x8a\xf0\xad\xe3\xd8\x56\x77\x43\xde\x43\x69\x0f\x2d\x25\x37\x23\xc5\xd7\xe4\x8b\xd3\x0d\x29\x37\x59\x37\x01\xce\xcd\xe9\x15\x4b\x76\x65\xcb\x61\x1d\x7d"}, +{{0xef,0x81,0x6c,0x8f,0x5e,0xc3,0x4e,0xf4,0x1f,0x68,0x83,0x1d,0x90,0xcd,0x29,0xe5,0x2d,0xe8,0x97,0x37,0x82,0xd0,0x03,0xee,0x4e,0xda,0xda,0x2a,0xda,0x26,0x91,0xd6,},{0x47,0xf9,0xb3,0x63,0xa8,0x8a,0x45,0x05,0x3a,0x05,0xbb,0x72,0x16,0x08,0x52,0xbf,0xe8,0xf7,0xdf,0xef,0xc2,0xf3,0x72,0x83,0xde,0x34,0x67,0x52,0xca,0xf0,0x92,0xcc,},{0x65,0xc5,0xd1,0x0e,0xa7,0xbf,0xdb,0xb3,0x8d,0x55,0x36,0x4a,0x99,0x68,0xf8,0x2b,0x54,0x82,0x24,0xdf,0xf3,0x36,0x3b,0x2d,0xdc,0xf5,0x85,0x16,0x3d,0xea,0x27,0xdc,0x63,0xb0,0x56,0x3e,0xb1,0xa8,0xdf,0xbe,0xe9,0x51,0xd3,0xc9,0xb3,0x3f,0xcd,0x6b,0xbf,0x09,0x21,0xc3,0xab,0xb2,0x17,0x86,0xb2,0x29,0x06,0x9b,0xd9,0xca,0x00,0x0a,},"\x95\x93\xc3\x5c\xde\xc5\x35\xbe\xbb\x69\x65\xda\x68\xea\xb0\xb6\x46\xbf\xfc\xfb\xd0\x48\x83\xbc\x4c\xef\x90\xd5\xd0\x1f\x01\x8c\x63\xc9\xb0\xdd\xfb\x3c\xef\x5e\x78\x62\x84\xd5\x21\x8c\xaa\xaf\x06\x0e\x92\x88\x95\x2f\x16\x30\x1e\xd8\xa4\xc1\xbc\xee\x25\x63\x56\xa0\xc8\xbd\xa3\x59\xfb\xaa\x27\x82\xb1\x0c\x86\xd1\x8e\x20\xf7\xa0\xec\x99\xb2\x7a\x0b\x4d\xbe\xfc\x0a\x26\x2a\x3b\xf6\x8f\xe8\x14\x44\xdc\xae\x5f\x69\x3e\xb0\xf1\x6e\x6e\xe0\x3f\x8f\xcb\xf3\xa3\x39\x81\x46\xd2\x0e\xc4\xd2\x65\x77\x61\xfd\x03\x20\xfe\xe7\xea\x70\x3c\x49\xa6\xa5\x43\xbc\x9b\xba\x91\x1e\x79\x25\x03\x87\x10\xe8\xc3\x65\x52\xd4\x76\xd6\x02\x7f\x58\xb2\xc5\x2b\xa5\x1a\xd6\x5e\xa4\xf0\x39\xc7\x8f\x96\xb8\x89\x10\x2b\xb4\xbd\xd6\x9b\x68\xe9\xc3\xd4\x5b\x51\x76\xa2\xd8\x2b\x0b\x95\xdc\x32\x10\x16\x37\x0d\xae\x30\xc3\x93\x65\x15\xdb\x04\x64\xc4\x17\x74\x30\x1c\x74\xe4\x2d\x89\xb8\xbf\x4b\x9c\x19\xed\x55\x4b\x12\xfe\xba\xc0\xf6\x0d\xdb\x32\x19\xcc\xc5\x60\x35\x31\xdb\xf2\xeb\x5f\x29\x34\x25\xd7\x2c\xce\xfa\x0c\x7f\x14\x4a\xba\x89\x34\x7b\x29\x6b\xe8\x7f\xf1\x89\x94\xb4\xa0\xc7\x0c\x93\x0f\x05\x93\x03\xb5\xdd\x4c\x8f\xe1\xe6\xbb\xc3\xcd\x68\xc6\xc0\xd8\x42\x46\xdc\x6e\x61\x40\xa2\xab\xd1\x78\x0b\x13\xf1\x59\x4a\x60\x19\xd1\x77\x8b\x7c\xbb\x3a\x3e\x3a\x34\xbf\xae\x72\x97\xf0\xb3\xed\xc3\x76\x94\x1c\x32\x35\x2a\x4b\xe3\x14\xb8\x4a\x9d\x8d\x6d\x7f\x1f\x38\xa0\xad\x37\x98\x02\x0a\xa2\xa3\x31\xa4\x02\xbe\x9c\x70\x44\x84\x74\x4a\x73\x0c\xbd\xed\xcb\x90\x4b\x6f\xde\x70\x8f\xbd\x14\xbf\xdc\x29\xef\xd4\x61\xd1\xd0\xb5\x82\x5d\xe0\xbc\x79\x42\x2b\x69\xa2\x72\x2f"}, +{{0x45,0xeb,0x0c,0x4d,0xfa,0xfa,0x2a,0x76,0x90,0xef,0x57,0x9c,0x09,0x54,0x56,0xce,0xed,0xcd,0x32,0xf0,0xb6,0x14,0x4d,0x0c,0x38,0x0f,0x87,0xfb,0x74,0x4a,0x0b,0x1f,},{0xfc,0x85,0x63,0x2c,0x98,0x38,0x4b,0x5f,0x96,0x82,0xae,0xd9,0xcd,0x66,0x4c,0xf1,0xf4,0x8e,0x58,0x8b,0xe2,0xd5,0x68,0xe5,0xc7,0x34,0x49,0x4d,0xf4,0xc7,0x12,0xb8,},{0x55,0x85,0x1d,0xe8,0xe1,0x09,0x2f,0x78,0x94,0x4f,0x6c,0x6d,0xd9,0x5b,0xf0,0x7e,0x2d,0xbc,0x8d,0xf7,0xf5,0x7a,0xd5,0x76,0x82,0x9b,0x97,0x8e,0x3a,0xf5,0x8a,0x7a,0x8e,0x94,0xed,0x4d,0xcc,0xbc,0x01,0x82,0x46,0x7e,0xdf,0x0b,0xad,0x4b,0xae,0x7c,0xa8,0x4a,0xa9,0xa0,0xc1,0x7c,0x61,0xa9,0xe0,0xdd,0xff,0x1d,0x75,0x25,0xd7,0x04,},"\x6f\x66\xd8\x47\x40\x5a\x03\xd7\xbd\x6f\x8d\x28\x97\xdb\xdf\x04\xe7\x6d\x7d\xf2\xd9\x47\x0a\x49\x96\xb7\xdd\x6d\xb8\x85\x00\xf8\xf4\xf8\x3e\x96\x0e\x21\x9a\x24\x86\xe2\x45\x45\xad\xd1\x36\x14\x55\x04\x14\xd8\x27\xc4\x1a\x9b\x08\x31\x8d\xaf\x01\xb1\x52\x14\xc6\x4a\x42\x66\xcb\xf8\xa5\x71\x7a\xda\x3e\x62\xc2\x67\x29\x07\x3e\x16\xdd\xbd\x66\xf2\xd5\x20\xe1\xe0\x99\x35\xde\x05\xe4\xdb\x11\xc3\x96\xd4\x77\x01\x0a\xec\x66\xaa\xfb\x76\x2e\x69\x23\x8d\x0b\x9e\x76\xb4\x52\x45\x4b\xf9\xe4\x51\xe7\x6a\xc7\x9e\x69\x90\xd4\x1b\x93\x2b\xc3\x29\x17\x09\x37\x83\xc9\x1b\xc9\xcf\x0b\xbe\x3b\x51\x40\x70\xa1\xe6\x92\xff\x34\xfd\x06\xb6\x6e\xa1\x1f\x39\xe1\x0a\xf9\x33\xee\x96\xd8\xe9\xb6\x77\xcb\x03\x73\x7e\x79\x64\xee\xaa\x72\x5f\x12\x12\x07\xf9\xc1\xb2\x6a\x96\xc6\x16\xdf\x7c\xb7\xca\xef\x47\xbd\xa9\x01\x36\x8f\xf2\xea\x58\x6e\x42\x2e\x65\xbf\x21\xa6\x91\xbd\xd2\xc1\x3e\x67\xff\xf5\x8c\xfb\xfe\xd8\x17\x82\x04\x9d\xaf\xa0\xf7\x27\xdf\x88\x62\x3f\x2f\x7e\x8f\x26\x2d\xaf\x93\x95\x42\xa1\x87\xb8\x72\x0a\x9b\x6b\x2b\x09\x89\x0e\x54\x87\x6b\x28\xa4\x38\x74\xab\xbe\x3b\xfa\x98\x1f\x81\x38\xb7\x72\xc5\xd5\x17\x36\x88\x5f\x86\xac\xac\x22\x15\xa0\xb0\x10\xdf\xc2\xc6\xb1\x50\x84\x5d\x4f\x82\x96\x25\x25\x86\xa3\xe1\x15\xf3\x03\xc3\xd8\xa5\x82\xe2\x0f\xd2\xd4\x3f\x6c\x44\x6e\x5d\x00\x28\x0e\xc1\x79\x82\x3b\x7f\xb4\xc1\xb0\xfe\xb9\x4e\xb4\xef\x17\x07\xf5\x18\x4e\x3b\x52\x46\x1a\x75\x62\xd1\xf3\x07\xcb\x75\x1c\xdb\xbf\x6e\xae\x49\xff\xae\x91\x86\x23\x58\xe7\x4e\x95\x48\x82\x2b\x8a\x04\x9f\xec\x6b\xf4\xc7\xa9\x9c\xab\xbe\x09\x20\x65\x77\xb6\x57\xe3\x1f"}, +{{0x70,0x9d,0x2e,0x19,0x90,0x06,0xf5,0x36,0x9a,0x7a,0x0b,0xdd,0x34,0xe7,0x4d,0xc7,0x84,0xbe,0x33,0x88,0x0e,0xa3,0xc5,0xdd,0x10,0xed,0x5c,0x94,0x45,0x1e,0x79,0x72,},{0x06,0xf9,0x89,0x20,0x2b,0xa2,0xcb,0xc9,0xc1,0x50,0xbe,0x61,0x12,0x62,0xac,0xa0,0x0c,0x45,0xf0,0x12,0xf8,0x9f,0xba,0xf8,0x9f,0x8c,0xec,0xcb,0xa0,0xb1,0x93,0x4a,},{0x62,0x9b,0xf9,0x7b,0x0c,0x78,0xee,0x6a,0x9c,0x87,0x59,0xfb,0xea,0x28,0x22,0x4e,0x27,0xab,0xbb,0x6c,0xbe,0x4d,0xea,0x5b,0xb7,0x97,0xe6,0xe0,0xfe,0x80,0xc9,0x13,0xf9,0x53,0xe3,0xa9,0xb6,0x23,0x35,0x2d,0x13,0xac,0xf4,0xce,0x62,0x50,0xfb,0x02,0x9a,0x1e,0x19,0x8d,0x72,0xbd,0x5e,0x74,0x02,0xe6,0x0e,0x9e,0x48,0xca,0x35,0x01,},"\x62\xf0\x03\x14\x0f\xa0\x9e\x03\x87\xd1\x87\xa0\xff\x96\xc4\x56\x3d\xf9\xf4\xe2\x8c\x22\x82\xc0\x18\x3a\xc3\xee\xde\x13\x12\x35\x49\x21\xf7\x80\xfc\xa5\x36\x1d\x30\x68\xd2\x99\x49\x63\x0b\x75\x30\xcd\x59\x14\xac\xe0\x46\x8d\x01\x4b\x6f\x53\xd8\x39\xb8\x2e\x38\x81\x7d\xbf\x2d\x83\x92\xc3\xce\x34\x24\xea\xb8\x6a\x24\xd8\x04\xc7\xac\xb1\xce\x7a\xcf\xe0\xa1\xcd\xa4\x39\x39\x24\x28\x31\x05\xda\x4a\x77\x41\x19\x6e\x02\x75\x50\x04\x7f\x85\xb7\xa0\xa0\x1d\x45\x41\x24\xef\xc0\xe2\x99\xf0\xef\x9a\xd1\x43\x50\x54\x30\x53\x48\x22\x61\x52\x8b\xaa\x56\xe6\x59\x99\xac\x80\x2c\x00\xa3\x36\x26\x7c\x63\x51\x06\xb2\x64\x03\xc1\x9f\x39\x1d\x53\xbd\x82\x86\x1d\x6d\x48\xa4\x38\x0b\x30\x43\xaa\x91\xd6\x49\x53\x68\x81\x20\x4e\xcc\xb0\xde\x20\xd4\x3e\x5a\x37\x55\xb7\xf6\x00\x91\x6e\xcc\xae\x42\xa0\xc9\x05\x3b\x46\x2d\x94\x17\xa1\x3d\x67\xd7\x78\x26\x4a\x89\x6e\x8e\xaf\x90\xba\xf6\x6d\x29\xe5\x43\x8a\x71\x67\x81\x12\x3a\x89\xfa\x9b\x8b\xee\xf9\x1d\x96\x5a\xf2\xf4\xa1\xa5\xbd\x5d\x2e\x2a\xaf\x46\xd5\xc9\x4b\x77\x09\xcd\xd3\x8d\x05\xfe\xee\x4b\xfb\x76\xa3\x59\x07\x7c\x16\xbc\x4b\xe9\x11\x6e\x69\x00\x12\x71\xcd\xa5\x65\xbc\x19\xbf\x47\xd4\xf9\x86\xbd\x9c\x0d\x18\x4c\xd8\xa3\x52\x0c\xa1\xbd\xb4\xb5\x05\xaa\xf7\xcb\x4e\xc9\xf9\x47\x89\x77\x9d\x30\x71\x4e\x79\x11\x6d\xd5\x01\x9d\x59\xb2\x8b\x17\xda\xd9\x6f\x4e\x21\x55\xad\x9c\x61\x27\x4a\xdd\xc6\xb6\x38\x10\x95\x04\xe9\xed\x19\xf4\xed\xa5\x37\x77\x62\x64\x8c\x40\x98\x22\x4e\x33\x91\x04\x3e\x4c\x2a\xd5\x91\x65\x4c\x9e\x7f\x97\x4e\xfd\xf0\xb0\x50\x4b\x6f\xa5\xf6\x46\xce\xcf\x44\xcd\x37\x24\x12\x37\x25\x05"}, +{{0x51,0x51,0x61,0x74,0x21,0xaa,0xdc,0x9c,0x95,0xa4,0x42,0xb4,0x5e,0x7f,0xf6,0xde,0x06,0xa2,0xc7,0x33,0xb8,0x5b,0xd7,0x89,0xfb,0xad,0x41,0x4e,0xe3,0xc9,0x1a,0xdd,},{0x14,0x94,0x1d,0x55,0x97,0x61,0xb3,0x0a,0xb0,0xa8,0x6d,0x47,0xe0,0xf7,0xd1,0x89,0x6b,0x33,0x78,0x45,0x27,0xc8,0x0a,0xf4,0x1c,0xb8,0x48,0x10,0xcb,0xff,0x9d,0xbf,},{0xfa,0xe4,0x77,0x3b,0x33,0x44,0x60,0xc7,0x7b,0xf0,0x1e,0xc6,0x36,0x6c,0x4f,0xe6,0x1c,0x0c,0xab,0x57,0xd8,0xa4,0xb0,0x39,0x09,0xc6,0x19,0xe1,0x1e,0xe3,0x46,0x1c,0x13,0xfa,0x21,0x57,0x6f,0x63,0x87,0x0e,0x42,0x3d,0xd0,0x41,0x81,0xe4,0xa7,0x01,0x3a,0x75,0x24,0xf2,0x46,0xfe,0x33,0x85,0x3c,0x67,0x41,0x62,0xa7,0x81,0x51,0x04,},"\x21\x6e\x9d\x40\xbc\xdc\x3b\x26\x50\x18\x8d\x12\x1c\x9f\x8e\xf2\x9e\x91\x4f\xac\xd0\x22\xfe\x01\xb9\x0e\xd1\x12\x25\xf2\xeb\x93\x53\x8e\x5f\xce\xe5\xab\x80\x45\xe9\x19\x9a\xa7\x6a\x16\xbd\xd0\x61\x68\x05\x66\x0e\x24\x7f\xec\xd7\xe2\x28\x21\xb6\x9b\x1f\x8e\x8a\x58\xac\x3f\xb8\x56\x91\xd7\x5d\x59\x57\xa1\xda\xf5\x3f\xf9\xee\x64\x76\xd7\xc4\xbc\x54\x1e\x6a\xd3\x8e\x3a\x34\xea\x90\xfc\x52\xa4\x8b\x93\x99\xf9\x2d\x17\xc9\xbb\x0d\x7f\xc3\x10\x4c\x55\xd0\xef\xb4\xea\x5b\x83\x1f\xf9\x49\x0b\x3f\x79\xf4\xd9\xd6\x99\x59\x4b\x74\x15\x66\xf2\xb5\x0a\x8f\xc7\x8c\xc4\x03\xfa\x40\xf5\xab\xb6\x63\x8a\x32\xf4\x49\xa8\xb3\xef\x02\x9c\x40\x2f\x46\x93\x1a\xd2\xbd\x3e\x8e\x68\x31\x08\x71\x4c\x98\x9a\xe2\x16\x89\xe9\xc4\x44\xb9\xf5\x5b\x81\x11\x9b\xb5\x03\x5b\xcf\x73\xe9\x7c\xe4\x3a\x22\x18\xc7\xbc\x3e\x43\x0d\x1e\x81\x4f\x34\xde\xe0\x57\x26\x5d\x31\x94\xb9\xf4\x38\x75\xd8\x38\x1f\x52\x5f\x78\x57\x6e\x64\xce\x69\x25\x84\xfa\xa3\x0f\xb7\x43\xa1\x2d\x1b\x77\x61\x4d\x2e\x10\xa6\xb8\x56\xb5\x2b\xe2\x7c\xdb\x63\x0b\xa1\xf0\xd3\xa6\xf8\xea\x98\x44\x54\x2e\x58\x4e\xa0\xa2\x77\x75\x27\xd0\xc5\x2a\xca\x94\x9a\xac\xda\x45\xad\x83\xd1\x6d\x5c\x83\xd6\x63\xad\xb7\x9c\xad\x6f\x3e\x39\xe9\x90\xfe\x28\x2a\x14\xc3\x53\xaa\x23\x79\xd7\xf0\x6a\xda\xb7\x4c\xea\x02\x1b\x89\x83\xa5\x7f\x1d\x0c\xf7\x03\x29\x2e\xb0\x5e\xce\x89\xc5\x3f\x3a\x12\x65\x61\x0e\x0c\x1e\xa8\xdd\xd4\x44\xd1\xff\xd6\xbc\x3d\x03\xf0\xa6\xe4\xd0\xdf\x5c\x5b\x8d\xc1\xf9\x5d\x9f\x55\x58\xb1\x18\xaf\xe6\xbe\xa0\xf6\xc2\x93\x13\x63\xf0\x3a\xb3\x4e\x75\x7d\x49\x36\x41\x74\xf6\x58\xef\xbb\xf3\x8d\xc1\x77"}, +{{0x38,0xbe,0xd4,0x45,0x55,0x6d,0xe7,0x44,0x82,0xbf,0x5f,0xec,0x05,0x06,0xf9,0xaf,0x33,0x0b,0x15,0x1e,0x50,0xd4,0x77,0x4d,0xfe,0x85,0x91,0xd7,0xb7,0xe0,0x27,0x6b,},{0x4c,0x0f,0x9c,0x49,0xa4,0x2f,0x40,0x47,0xbf,0xe6,0x88,0x55,0x51,0xc5,0xe4,0xb8,0x56,0xcf,0x77,0x1a,0x67,0xaf,0x3f,0x89,0xdb,0xf6,0x02,0xf9,0xdb,0x92,0x20,0xf3,},{0xf7,0x02,0xd0,0xd4,0x63,0x28,0x2f,0xc7,0xfd,0x5f,0x8f,0x90,0x29,0xb8,0x9c,0x62,0x6c,0xaf,0xd8,0x34,0x50,0xc3,0xbb,0x9d,0xd8,0xf6,0x58,0x9f,0x0c,0x4b,0x4b,0x71,0xf6,0x49,0xea,0x21,0x2e,0x5e,0x33,0x48,0x7c,0x59,0xc1,0x68,0xea,0x3a,0xd8,0x31,0x50,0xf1,0xfc,0xdf,0xe8,0xc5,0x3e,0xba,0x65,0xad,0xc2,0x02,0x3c,0x25,0x83,0x0f,},"\x0f\xf0\x03\x1d\xf0\xbe\xef\xf3\x71\x0c\x6b\x76\x3f\x9b\x8e\xc8\x17\x19\xbf\xa1\x52\x8c\xe4\x65\x19\xad\xf3\xd3\x41\x2d\x93\xfb\x18\x8f\xd4\x97\xd5\xd1\x70\x91\xc0\xf0\x34\x59\x60\xdd\x0e\xb0\xc0\x9f\xc4\x00\x51\x73\x66\x5d\x4d\x97\xf9\x5c\x13\x82\x8b\xc7\x6b\x34\x92\xb8\x7a\x4b\x64\x25\x3c\x8b\x5f\xa4\x7a\xa7\x5f\xa3\xb8\x6d\x5a\xbe\xea\x8d\xe5\x95\x9a\x60\x22\x89\x13\x6f\x60\xa6\x9b\x30\x9e\x77\x3b\x22\x55\xcd\xe1\x9e\xd2\xa2\xe1\x99\xc3\x3d\xb1\x1c\x16\xad\xe0\x8a\x31\x97\x50\xb8\x51\xd9\x2c\x69\x29\x24\xfc\x98\x59\xbe\x52\x34\x31\xcb\xe7\x8e\xc0\x92\xdb\x11\x29\x21\x0e\xbb\xea\xa7\xc2\xa2\xc0\x00\xee\xb1\x05\xca\x03\x01\xa4\x8f\x3e\x45\xfd\xfb\x15\xb2\x75\xcb\xab\x83\xca\x5c\x99\xd7\x37\xa5\x85\x32\x0e\x9e\x3b\x31\x71\x79\xbd\x86\x46\x7f\xa9\x69\x4f\xcd\xb2\xac\x6a\xd3\x6e\xd7\x14\x48\x43\xdb\xc3\x4e\x42\x3d\x35\xaf\xd7\xd8\x97\x2a\x1c\x43\xc1\x99\xa1\x91\xab\xd6\xce\xba\x49\x36\xd3\x95\xc9\x95\xa3\xeb\x13\xcb\x05\x7f\x88\xa9\xdc\x94\x90\xfe\x98\x84\x5e\xe5\xd2\x6a\x89\xfb\x64\x2a\x2a\x51\x6d\xc3\x05\x6c\x54\xd3\x63\x72\x13\x36\x3a\x86\x28\xa4\x2a\x39\x5d\x94\x2b\x95\x4a\x89\xe8\xef\x7a\x74\x4d\x8a\xe5\xad\xac\x88\xc6\x16\xef\xaa\x90\xe2\x07\x72\x05\xa6\x0b\xaf\xfe\xde\x5c\x87\xbb\x14\xde\xad\x30\x62\x29\x49\x5f\x69\x8f\x3e\x49\x06\x16\x96\x6b\x16\x36\x38\x7d\x0d\x86\x18\x3f\x94\x5b\x24\xa9\xdc\xfc\xcf\x4d\x36\x72\x2c\xd1\x2e\xbb\x6b\xd8\xe7\x83\x25\x75\x2a\xfa\x2b\x1a\xbd\x13\xc4\xbd\xbc\xad\xd1\x70\x86\x91\x36\x82\x62\x42\xac\xfb\x72\x1d\xe5\xff\x27\xba\x8a\xa0\xc0\x18\xb2\x25\xed\x34\x04\x80\x3c\xe9\xfa\x2d\x50\x8d\x89\x44"}, +{{0x05,0x54,0x60,0xb3,0x2d,0xd0,0x4d,0x7f,0x4b,0x23,0x11,0xa8,0x98,0x07,0xe0,0x73,0xfd,0x55,0x65,0x65,0xa4,0x77,0x18,0x57,0xd8,0x82,0x79,0x41,0x30,0xa2,0xfe,0x5d,},{0x26,0x0f,0x8f,0xed,0x4b,0xba,0x30,0xb9,0xe1,0x2a,0xd8,0x52,0x3f,0xbb,0x6f,0x57,0xf0,0xa7,0xa8,0x82,0x55,0x00,0x61,0xf1,0xda,0x46,0xfb,0xd8,0xea,0x44,0x22,0x21,},{0x23,0xf4,0xf1,0x62,0x7f,0xba,0xbd,0x78,0x91,0xd7,0xd8,0x48,0x96,0x31,0xc7,0x23,0x1d,0x22,0xde,0x71,0x86,0x4e,0x26,0x2a,0xb4,0xda,0x84,0xea,0x8a,0x13,0xa6,0x0f,0xea,0xc4,0xdc,0xfb,0x18,0x12,0xf1,0x20,0x04,0x44,0xb7,0x75,0xf1,0x21,0xd7,0x26,0x6d,0x75,0x5c,0xe9,0xb6,0xa9,0xad,0x79,0x65,0x59,0xc0,0xa2,0x6b,0x51,0x6d,0x02,},"\x74\x07\xf9\x6e\xe3\xe7\x9c\x69\xd3\x6c\xe1\xf6\x4e\x4f\x18\x86\x55\xea\x68\xb9\x47\xe7\xe2\xbe\x97\xb0\x5e\xbc\x6d\x44\x39\xe9\x50\x27\x6e\xf3\xf0\xe6\xa0\x3d\xd4\x8b\x24\xf6\x69\x29\xb4\x9c\x15\x80\xeb\x46\x88\x07\xe1\xe7\xa2\x5e\xb9\xb9\x4d\xa3\x40\xc5\x3f\x98\x4f\x8b\x81\x60\x3e\xfb\x61\x04\x7b\xf3\xf1\x4b\x68\x6d\x97\x98\x00\x3d\x2f\x68\x58\x9a\x79\xeb\xfa\xd5\x44\x09\xc7\x1c\x90\xff\x67\xc1\x1f\xbd\x76\xcc\x72\xc2\xd1\x45\xf4\x58\xe4\x2f\x88\xb7\x5d\x25\x0e\xad\xca\xfe\x66\xbf\x37\xff\xc8\x37\xb6\x2f\xf0\x06\x68\x5b\x7f\x85\xa9\xd8\x75\xfc\x07\x8c\x82\xe6\x1f\xe3\x5d\x19\x22\x52\x7a\x55\x1d\xab\x62\xf9\xe4\x77\x49\x91\x46\xba\xd9\x12\x20\x3e\x66\x4c\x41\x7c\x36\x79\xc0\x2d\x87\x2a\xba\xc0\x03\x2f\x8c\xc7\x7f\x77\xbf\xe5\x4d\x33\x26\xfd\xee\x92\x76\xa4\x8e\xa4\xeb\x25\x13\x50\x40\x68\x82\xd0\x8c\x83\x0e\x76\x49\xfe\x68\x54\x55\x8a\x75\x13\xab\x2d\x8d\x2a\xc3\xe5\xce\xd8\xa8\x08\xd2\xae\xe4\x54\x77\x9e\xda\xbd\x1a\xa6\x3b\xb1\x9f\x71\x8f\x47\x0b\xdc\x84\x51\xcd\x9b\x29\x49\x41\xe3\x49\x70\x63\xb1\xe3\x9b\x6c\xa1\x84\x56\x2f\xe8\x38\xcb\xfe\xee\x92\x2d\xe2\x4d\xdf\xcf\x98\x82\xc5\xe6\x15\xb1\x1b\xf9\x04\x81\x7f\xbd\x64\x71\x39\xdb\x80\xb4\xe8\xfe\xb3\x7f\x11\xe1\x85\x2d\x7e\x87\x6d\xb9\xcb\x63\xc9\x4d\x7e\xe3\x41\x92\xf7\x20\x0b\x5b\xc7\x7a\x03\x11\xae\x43\xb8\x06\xeb\xd4\xc2\x89\x6c\x53\xf5\x8f\x7e\xbc\x16\x25\xcb\x20\xd7\x10\x7e\xf9\xdb\x0d\xa2\x87\x88\x52\x3d\xe9\x91\xef\x6c\x58\x66\xb1\x8d\x8d\xe8\x3a\x95\x4d\x32\x81\xe0\x6d\xbf\x27\xc4\xf2\x38\x2e\x08\xcd\x0e\x0f\x6e\xba\xe3\xf9\x61\xb7\x7f\xce\x5a\x95\xa9\xb0\x62\x1b\x75\x6f"}, +{{0xe9,0xf6,0xd3,0x1b,0x93,0x69,0x42,0xc5,0x26,0xe0,0xf9,0xec,0x4f,0x5a,0x7a,0xc2,0x5f,0xa7,0x89,0xe0,0xc4,0x34,0xbc,0xd9,0x19,0x9d,0x72,0x0c,0x74,0x3c,0x84,0xc4,},{0x32,0x12,0x6d,0x26,0xe2,0x82,0x31,0xc5,0xb5,0x85,0xb1,0x3f,0x43,0xa0,0x1c,0x6f,0xe5,0x42,0x94,0x6b,0x07,0xd3,0xa9,0x1e,0x57,0xd2,0x81,0x52,0x3f,0x5c,0xb4,0x5c,},{0x7e,0x3b,0x1c,0x4c,0x71,0x6c,0x80,0x8e,0x90,0xb9,0x74,0x45,0x89,0x15,0xf3,0xb2,0x23,0x9c,0x42,0x07,0x71,0x19,0xfe,0x27,0x07,0x88,0xfa,0xe5,0x20,0x57,0x8b,0xd7,0xda,0x64,0x88,0x04,0x41,0x32,0xe1,0xbe,0xf2,0x3e,0x3b,0x23,0xc3,0x4d,0x9c,0x18,0x62,0x74,0x4f,0x28,0xfc,0xae,0xcd,0xa6,0xca,0xc0,0xfd,0x72,0xb9,0x3b,0x6a,0x0f,},"\xe8\x81\x33\xf3\xd1\x76\x42\xd5\xc2\x27\x79\xa8\x53\x16\xba\x0d\xf3\x4c\x79\x2b\x4e\xfe\xe4\x9e\xd7\xdd\x93\xca\x33\x22\xef\x47\xc7\x2e\x5b\x2e\x45\x95\xc7\x78\x00\x43\x4b\x60\x71\x9a\xdf\x54\xe4\xc1\xa3\x4c\x89\xfa\x1e\x27\xee\x8d\x35\xa0\x92\x1f\x97\x55\xac\x4a\x77\xa6\xc1\x68\x4e\xa0\xf5\xc8\xee\x5f\x75\x9c\xe5\x9b\xfe\x83\x15\x80\x0a\x67\xaa\x6c\x64\xdd\xfa\xac\x92\xea\xbe\x6c\x2c\x61\x37\x79\x78\x4b\x3a\xff\xaf\xcc\x62\x0f\x2a\x6d\xc5\xcb\x8d\x8d\xc7\xd7\x4a\xa4\xd7\x94\x94\x67\x84\x94\xe5\xe6\x39\x4c\x43\x3c\x14\x80\x9f\xf4\x0c\x9a\x59\x2d\x0d\x69\x4a\x81\x10\x3b\x44\x53\x1e\x1f\x48\xbc\x13\x96\x5d\x15\xaf\x8b\xf3\x34\x04\x88\xf8\xcd\x58\xf0\x9a\xe1\xa6\x61\x6b\xf8\x5a\xc9\xde\x7e\x0c\x66\x96\xaa\x2f\x1b\xec\x15\xe1\x7a\x44\xda\x4a\x84\xed\xb4\xec\x6d\x77\x24\x77\x88\xba\x0d\xe3\xae\x12\xa1\x55\xcb\xed\xc0\xda\x2f\x56\x8e\xef\x0b\x75\xa8\x77\xea\x5b\x0c\x2c\x0d\x4b\xf2\xc6\x1d\x46\x8a\x46\xfa\xad\xfa\xec\xe3\x5f\xc2\x63\xa9\xbe\x99\x87\xf4\xf7\xf7\x8f\x05\xc7\x07\x78\x43\x78\xc7\xb8\xf7\xda\xf9\xac\x3a\x12\x2a\xad\x39\xa1\x67\x79\x66\xda\x9e\xf2\x86\xc9\xe0\x62\xc4\xf4\x39\xad\x0b\xdd\xea\x26\xe5\x4b\x2f\x73\x88\xe2\x38\xb2\xa6\x49\x28\x45\x0d\x34\x56\x4c\x5a\x44\x7e\x7a\xfb\xbe\xdd\x10\x85\xf1\xf2\x4c\x11\xae\x08\x43\x22\xd1\xa3\x2c\xf8\xaa\x47\x39\x41\xf0\x0d\x56\xb1\x61\x82\x13\xca\xb3\x90\x0a\xa6\x06\x46\x3d\x9f\x80\x0e\x92\x6f\x9f\x42\xd4\xb0\x82\xd8\xc5\xec\x3a\x4a\x02\x5b\x45\xf9\xaa\xdc\x8b\xcb\xd1\x70\x91\xb3\xda\x49\xe9\x45\x3d\xc5\x5e\x89\xb5\xb5\xfe\x6b\x31\xf5\xed\xda\xd1\x0b\x66\x01\x57\x25\x68\xd8\xe2\x05\xd3\x25\x1a"}, +{{0x6b,0xf4,0xca,0xaa,0xbb,0x96,0x85,0x4a,0x38,0xa5,0x72,0xf4,0xce,0x6c,0x78,0x38,0xf7,0xe7,0x50,0x11,0x8c,0x73,0xf2,0x72,0x35,0x82,0x61,0x8e,0x23,0x07,0xf8,0x38,},{0x08,0x12,0x63,0x73,0xd0,0x56,0xf0,0x0e,0x54,0xb8,0xd4,0x3d,0x77,0xc3,0x5f,0x5f,0x91,0x98,0x33,0xe9,0x0d,0x8a,0xaf,0xd6,0xc8,0x24,0x6d,0x27,0x91,0x7a,0xd0,0x91,},{0xd2,0x11,0x3f,0x80,0xd6,0xcf,0x92,0x84,0x86,0xa2,0x50,0xa6,0x79,0xd6,0xe7,0x4b,0x35,0xea,0x9d,0x26,0x06,0x1f,0xa9,0x4d,0x76,0x9e,0x1a,0x8f,0xbf,0xa0,0xa7,0x34,0x22,0x7f,0x55,0x53,0x7e,0x4e,0xbf,0xf5,0x93,0x36,0xdb,0x14,0x1c,0xf5,0xd6,0xd4,0x82,0xa0,0x71,0x1f,0x1e,0x9f,0xc7,0x2f,0xf7,0x09,0x56,0xa1,0x1b,0x4f,0xb9,0x09,},"\x47\x76\xe9\xd6\x00\x85\x48\x1f\xa5\x37\xbf\x29\x5b\xda\xbd\x8b\x1c\xf6\x32\xa8\xcd\x40\xbc\xe6\xbd\x32\x5c\x12\x9f\x97\x70\x00\xe8\x84\x68\xeb\xf2\xdc\x15\x8a\xc0\xf2\x07\x21\x2d\xb0\x0f\xb6\x0b\x8e\xc8\xba\xe2\x29\x37\x2e\x9a\x6b\x01\x53\x0a\x7e\xd1\xbc\x9d\x38\x9e\xc8\x91\x3f\x59\x03\x0d\x5b\x54\xaf\x56\xae\x1c\xcc\x28\xf3\x7c\xc9\x6a\x8e\x53\x20\x4e\x92\xa6\x77\x76\x6a\xdf\xaa\xda\x99\xb0\x28\x1f\x86\x7f\x61\xac\x9f\xf7\xd9\x72\xee\x3e\xd4\x27\xd7\x2f\xaa\xe7\x5d\x4a\xec\x01\xb5\xff\xc3\x70\x61\xb6\xf0\xf7\xe5\x71\x4c\x4c\xf3\x0d\x5b\x73\x1b\x07\x46\x06\x5f\x19\xe4\xc8\x92\x2d\xde\x64\x2f\x80\xfe\x24\xa3\xc8\xdc\xb2\xe5\xf1\xc2\x66\xe2\xaf\x6c\x37\xde\xcf\x55\xa2\xba\xa5\x4f\x0d\x5c\xf0\x83\x93\x70\xc3\xe0\xb4\xe7\x7a\x4f\x36\xbb\xb3\x16\x20\x14\x93\x3a\x4a\x4e\xbc\xae\x8c\x60\x96\x1a\xc6\xdc\xf1\x34\xf3\x08\x28\xd3\x14\x02\xae\x74\xe7\xe8\x51\x3c\x9d\x2a\xd8\xee\x46\xb7\xa9\xd5\x3a\x1f\x87\xeb\xfc\xe0\x4f\x46\x1b\xde\xd1\x74\x9b\x6f\xc4\xc4\xf2\x57\x93\x52\x56\x92\xd7\xa0\xe4\x26\xc8\x4e\x06\x08\x2c\xc3\xe6\xab\xb5\x13\x68\x37\x0c\xbb\x10\x6c\x7a\x08\x97\xf6\x6d\x92\xc9\x73\x9c\xff\x9f\x27\x06\xd6\xa2\x98\x0e\xce\xa3\xac\x49\x45\xf0\xf4\x7e\x65\x6b\xd9\x63\x77\x77\xe8\x53\xd2\xa8\x39\x10\x43\x27\xdc\x04\x9e\xbc\x34\xf0\x49\xd6\xc2\xf8\x0e\xca\x99\xdb\x7b\x41\x84\x24\xac\xef\x75\x22\x60\xd2\xd4\x27\x94\x93\x23\x99\x7c\xd9\x61\x7e\xdf\x50\xd4\x41\xd0\x08\x8b\x1d\x47\x91\x2e\x35\xcf\x54\x23\x15\x26\x58\x29\xf3\x83\xf4\x58\x60\xd3\xb4\x5e\x73\x5b\xb2\xf8\x58\x6d\xcf\x58\xdb\x4f\x2a\xcf\xb4\xa6\x88\x53\xa9\x6e\xed\x7b\x89\x76\x9d\x36\x56\x13"}, +{{0x5d,0x95,0x85,0x73,0x6a,0xb2,0x09,0xb0,0xab,0xe8,0xbf,0x74,0xac,0xa4,0xee,0xa4,0xf6,0xd1,0x65,0x0b,0x53,0x25,0x50,0xa2,0x23,0xe0,0x44,0x58,0x0f,0x8e,0x20,0xde,},{0xe7,0x77,0x29,0xed,0xfd,0x21,0x44,0xb2,0xb1,0x20,0x78,0x76,0x54,0x17,0xfa,0x21,0xf1,0x59,0x4f,0x09,0xb2,0x69,0xe9,0xb6,0x70,0x68,0x02,0xb4,0xf3,0xbd,0xfe,0x85,},{0xe7,0xb0,0x8e,0x1d,0x58,0x09,0xfd,0xd8,0x52,0x94,0x43,0xd6,0x5a,0xda,0x5d,0xd6,0x55,0xea,0x55,0xb5,0x41,0x5a,0x01,0x13,0x93,0xbe,0x70,0x71,0x67,0x64,0x86,0xd3,0x58,0xe8,0xd2,0xa4,0x60,0xeb,0xe0,0x75,0xb0,0xe7,0x01,0xb2,0x4c,0x9e,0x3a,0xb5,0xf2,0xb0,0x33,0x59,0x2d,0x4d,0xe3,0xb7,0xf3,0x7f,0xd5,0x41,0xf6,0x92,0x09,0x09,},"\x08\x69\x35\x91\xe6\xc5\x8a\x5e\xad\x9c\x85\xfe\x8e\xc5\x85\x08\xf8\x1a\x34\x67\x63\x6c\x2d\x34\xfc\xc1\xf4\x66\xe5\xc6\xda\xfd\xc3\x7c\x35\xcb\xee\x35\x58\x9c\x69\x97\xe2\xb1\x54\x48\x13\x27\x44\xe5\xa1\xe1\x31\xbb\x49\xbf\x5c\x25\x63\xf8\x7e\xad\x3e\xfe\x01\xe8\x8c\xbf\x24\xcc\x17\x69\xc7\x8c\xdf\xc1\x67\xe3\x78\x21\x5b\x15\x85\x9c\x7a\x28\xec\xe7\x0e\x18\x8f\xa3\x30\x26\x7d\x3f\xc5\x7b\x4a\xce\x6c\x15\x20\xec\x67\x87\x50\x67\xfd\x33\xbe\x86\xf4\xa1\x96\x7a\xfb\x3e\xb1\x64\xc7\x97\xcf\x28\xd8\x07\x2a\xa6\x9d\x82\xaf\xa3\x83\x74\xf8\xe5\x79\x7c\x4c\x28\x47\x1b\x7d\x69\xf5\xb9\xc7\xb4\xac\xdb\xc1\x9f\x3c\x5c\x5d\x40\x08\x08\xa9\x82\xa4\x78\x37\xae\xd1\xb3\x84\x1d\x69\x89\x0e\xeb\x31\x49\x4e\x10\xe3\xe5\x13\xd1\x2d\x0c\xa6\x86\xc7\xce\x65\x17\x78\x09\x27\x03\xfe\xf0\xdc\xc0\x21\x40\x77\xdf\xb3\x61\x25\x1b\xde\xa4\x36\x4d\xd4\x1b\x97\xbc\xeb\x0f\xb1\x47\x5a\x50\xe4\x70\x8f\x47\xf7\x87\x8c\x74\x40\x1e\x97\x71\xcc\x3f\xce\xac\xe8\x91\x69\x98\x1a\xa7\x72\x50\x85\x00\x90\xd1\x81\xd8\x35\x8e\xbb\xa6\x5e\x29\x0a\xcb\x03\x52\xbe\xce\x8c\x57\x98\x32\xa6\x01\x55\x18\x16\xd1\xc0\x56\x21\xcc\xbb\xee\x0f\xbe\x39\xea\x2f\x19\x53\x93\x19\x9e\x69\xc2\x34\xc2\xfb\x1c\x37\xe4\x74\x84\x08\x60\xce\x60\x91\x61\xfc\xfc\xe2\x86\x95\x74\xbe\x0d\x38\xf9\x5e\x20\xf4\xf8\x72\x52\x47\xb9\x62\x7b\x46\xe8\x34\x90\x51\x01\xac\x12\xb9\x34\xcb\xf8\x7c\xb2\xd1\x90\xd2\xf5\x14\x90\xa8\x2c\x4e\x81\x0e\xdd\xb8\x1f\x95\x6a\x9f\x36\xbd\xa4\x97\xbc\xa5\x06\xa4\x9e\xe9\xcd\x47\xfd\xa5\xb7\xf2\xb8\x84\xa3\x64\x8c\xad\xd1\x2a\xb6\x18\x98\xad\xa4\x6e\xcc\x97\x0f\x81\xdc\x9f\x87\x68\x45\xdb"}, +{{0x60,0xb1,0x42,0xf1,0x65,0x11,0x41,0x43,0xca,0x30,0xa6,0x04,0xfe,0xf5,0x1c,0x68,0x64,0x36,0xaa,0x1b,0x9a,0xfd,0xb2,0x66,0xb3,0xe3,0x98,0xcc,0xb3,0xc4,0xd8,0x55,},{0xea,0xf6,0xc5,0xa7,0x6c,0xa9,0x9b,0xf7,0x30,0x64,0x98,0x88,0x8c,0x3b,0x7a,0x1f,0xea,0xe9,0x8b,0xf8,0x98,0x8d,0x7f,0x2e,0x15,0x47,0xf8,0xf5,0x3a,0x45,0x28,0xaa,},{0xa6,0x21,0xf0,0x84,0xea,0x1a,0x36,0xef,0x81,0x2a,0x97,0x55,0xc9,0xaf,0xbb,0x53,0xda,0xda,0xae,0x6b,0x3a,0x53,0xfa,0x83,0x44,0xca,0x40,0xd3,0x61,0x2a,0x26,0x8a,0x35,0xfe,0xd0,0xfd,0x39,0x8a,0xb7,0x5b,0xcd,0x63,0x9c,0x54,0x79,0x37,0xc9,0x41,0x55,0xab,0x1a,0x7a,0x34,0x67,0xdd,0x4b,0xfd,0xdf,0xac,0xab,0x16,0x55,0xe9,0x08,},"\x18\x15\xde\xe1\x17\x3b\x78\x26\x47\x20\xd3\x5b\x7c\xc2\x45\x4a\x00\x0a\x65\xff\xf2\x14\xe2\x47\x3e\x20\xbc\x83\xf3\xec\xde\x9c\x04\xc1\xe0\x69\x6c\xe6\xe5\x55\x19\xdd\x2a\x75\xce\x04\x64\xbf\x60\x1a\xdc\x38\x1e\x79\x3e\xcb\x9f\x8c\xe7\xab\x87\xb6\xca\x2a\x3e\x41\x0f\x63\x90\x69\x45\x19\x78\xd1\x48\x73\xd3\x39\x0f\xab\x86\x23\x96\x97\x13\xc3\xdf\xcd\x58\xd8\x6d\x12\x40\x73\x76\x1e\xe0\x9a\x65\x2a\x48\x76\x7f\x96\x46\xcb\x72\x6a\xc4\x54\xac\x9a\x1b\xc5\xfa\xed\x30\x26\xb7\x03\x98\x2b\xc2\xb1\xe0\x75\x82\x10\xe1\xd6\x25\x19\x23\x0e\xb2\xb2\xf4\xa4\x86\xbc\x55\x16\x85\x60\xc4\x36\x3d\xf5\xff\x5a\xdf\xda\x11\xac\x7e\xf5\x1b\x18\x19\x6c\x94\x33\x7c\x07\xae\xf1\x17\x99\x0f\x77\x0c\x0f\x1e\x8c\x0f\x88\xeb\x6f\xfc\x40\xe8\xed\x7c\x3a\x80\xa6\x32\xdb\x1e\x7f\x63\xb6\x30\x96\xe2\xac\x49\xe5\x77\x92\xb3\x11\x43\xe2\xf4\xfa\xab\xce\xae\x66\xb2\x74\x71\x68\x1c\x36\xfc\x11\x39\x00\x7f\x9b\x54\x8c\xdc\x6e\x3b\x8f\xbb\xda\xba\x7a\x8a\xdb\x84\x34\x31\x23\x8b\xb4\x61\xba\x24\xf6\xe0\x9f\x62\xc7\x2d\x63\x77\xb4\x04\x8c\xb0\x13\x4c\x25\xa5\x41\x1a\x20\xbf\xcf\xc1\x3e\x48\xd8\x0e\x36\xbf\xb0\xda\x7e\x01\x85\xd3\x3f\x19\x28\x63\x6e\x15\xde\xe0\xe5\xdf\x89\x92\xa1\x65\x72\xb1\x3e\xa8\xf7\xcf\x85\xca\xe3\x2d\x52\x9f\x66\xe8\xf6\xd2\xfb\x2a\xd0\xbb\xfe\x71\x99\x16\x9b\x25\x67\xba\x00\xc7\x81\xb2\x0a\x48\xe1\xd7\x0d\xf9\xfa\x31\x19\xcd\x7e\x5b\xbe\x58\x88\x4b\x0b\x51\x21\x89\x40\xfa\x81\x5f\x85\x62\x5f\xa2\x03\x47\x1c\xee\x80\x84\x78\x0e\xb0\xb9\x35\x6f\x9f\x3d\x4f\x6d\xf7\x40\x30\x1d\x70\x7e\xf1\xff\xb3\x51\x9e\x3f\x90\xb8\x06\x4b\x98\xe7\x0f\x37\x5d\x07\x14\x26\x88\x17\x18"}, +{{0x73,0x4b,0xa4,0x70,0x33,0xc6,0x14,0x02,0x32,0xdd,0x4a,0x7a,0x14,0xf1,0xa7,0x74,0x3e,0xef,0xe9,0x07,0x0b,0xad,0x96,0x62,0x49,0x16,0x30,0xcc,0x9d,0x28,0xc1,0xf3,},{0x2f,0xa5,0xdf,0x30,0x26,0xd6,0x07,0x42,0xe2,0xaf,0xf6,0xb5,0x78,0x42,0xc7,0x12,0x68,0x46,0xc8,0xa7,0xbb,0xe9,0x26,0x6e,0xfa,0x7b,0x3f,0x23,0x98,0xc3,0x57,0xea,},{0x9b,0xd0,0x74,0xd1,0xd0,0xbd,0x28,0x00,0x1b,0xaf,0x7d,0x2d,0x4e,0x82,0x43,0x5d,0xf0,0x8c,0x42,0x64,0xd8,0xcb,0xb1,0xc3,0x81,0x18,0x3c,0x2f,0x01,0x22,0x3f,0x79,0xf9,0x49,0x23,0xca,0x17,0x8c,0xac,0x75,0x56,0x4e,0x16,0xc7,0xf5,0x60,0x79,0x08,0x8f,0x7e,0xd8,0x85,0xde,0x4d,0x50,0x9f,0xbc,0x78,0xf4,0x38,0xfb,0xa3,0xf6,0x07,},"\x5d\x3c\x65\x98\x10\xc3\xfe\xa5\x2a\x6d\xf3\x86\x1e\x5c\xdc\x5b\x70\x3c\xc1\xce\xf4\x85\x58\xc6\x1d\x8c\x51\xd0\xed\xea\x5a\x14\x79\xcf\xe5\x06\x3d\x82\xde\xd9\xca\x68\x1e\x57\x48\x88\x7c\x40\xec\xfb\x9e\x1a\x9a\x8b\x7f\x85\x09\xd1\x07\x76\x46\x1c\x39\x23\x39\x96\x93\xa7\x81\x89\x08\x91\x78\xd5\xaa\xbd\x15\xf8\xc8\x46\x64\x2b\xe4\x7d\x6d\x4c\xaf\x13\x82\x4e\xdc\xef\xb8\x09\x86\x8f\xa7\x2d\xdf\x03\x5c\x4d\xe8\xef\x0a\x9c\x83\x22\x64\xf6\x6f\x01\x27\x61\xce\x69\x55\xbc\x3c\x41\x6e\x93\xe2\x91\x88\x02\x5e\xbb\xb1\x3a\x55\x32\x58\xc1\xd7\xc4\x99\xc9\xa4\xae\xb1\x0b\xb3\x6f\x61\xd1\xbb\x4c\xec\x5a\xe5\x5d\x17\x57\x22\xb9\xa9\x69\x6d\xf8\x81\x95\x1e\x35\x20\x0b\x96\x53\xcf\x6e\xd4\xb3\xd1\x5d\xe0\x87\xa9\xd1\xc3\x19\xfc\xe8\x58\x21\x56\xbe\xbf\x3f\xc9\x1e\x0e\x61\x0f\xf7\xa1\x53\x08\xfd\x1d\x2c\x60\x69\xfb\xbb\x29\x47\xd3\x11\x07\x31\xd2\x45\xae\x29\x63\x01\x4b\xd7\x6d\xea\x42\xdb\x12\x5c\xec\xc4\x93\xc8\xe9\x09\x1a\x76\x64\x65\x77\x72\x9a\xed\x49\x66\xfc\xe9\x69\x9f\xe1\x2e\x36\x7d\x66\x5d\xf9\xe9\x5a\x91\x93\xe1\x13\x3e\x14\x3a\xf9\x2f\x82\xb6\x6a\xc7\x76\x4e\x50\x33\x17\x86\x90\x52\x18\x09\xa7\x10\x7d\x8a\xe9\xb8\x8e\x0e\xd1\xf3\x5b\x17\x19\x90\x1b\x93\x0a\xd0\xe1\xcb\xce\x7f\xb3\x02\x67\xb1\x15\x52\x04\xf6\x05\xf5\x25\xe4\x9d\xe2\x98\x8e\xa7\xf7\x4b\xe8\x81\x51\x77\xfd\x97\x6a\x1b\xcc\x12\x6d\x9c\x9c\x13\x5c\x5b\x42\x76\xd3\x80\x19\xc3\x4a\xef\xb7\xa0\x22\x0f\x7f\x5a\xef\xf3\x80\xae\xd6\x27\xb0\x70\xc2\xc9\xe2\x15\x33\xbb\x35\xc0\x8e\x39\x4c\x85\xae\x25\xe6\x86\x29\x42\x59\x9c\x65\xdb\xae\x59\x77\xa5\x84\xa8\x81\x80\xe0\xc8\xc7\x1e\x5a\x84\x09\xe0\x4e\xf7"}, +{{0x45,0xe3,0x4d,0x0e,0xf4,0xc1,0x96,0xfa,0x6d,0x57,0x2b,0x6b,0x17,0x74,0xb5,0x21,0x8f,0x7c,0x32,0x91,0x30,0x4c,0x13,0x50,0x0d,0xf7,0x07,0x0d,0x90,0xe8,0x03,0x9e,},{0x13,0xa7,0x30,0x4d,0xff,0x42,0x33,0x59,0x17,0x7a,0xba,0xfa,0x5e,0x65,0x08,0xd2,0x67,0x69,0xca,0x99,0xcf,0x8a,0xf4,0x5c,0x38,0x3f,0x3f,0xf6,0x34,0x40,0x60,0x03,},{0xb4,0x2c,0x1f,0x92,0x5f,0x4b,0xac,0xcd,0x12,0x9e,0xfb,0x10,0x9d,0xb3,0x54,0xac,0xa3,0x1c,0x68,0x98,0xf4,0xf4,0x51,0x29,0x47,0x49,0xa2,0x6a,0x6d,0xa1,0x67,0x7b,0xd3,0xa5,0xc0,0x41,0x19,0xe3,0x5f,0x47,0x31,0x9f,0x20,0xcf,0xdf,0xc0,0x8b,0xb4,0x52,0x8b,0x21,0x00,0x9e,0x00,0xbd,0x41,0xeb,0xc0,0xf4,0x68,0x63,0xbe,0xd1,0x0b,},"\x3d\x9e\xd5\xc6\x4b\x75\xe1\x35\xdf\x2f\x5e\x85\x30\x0d\x90\xf2\x1b\x36\x39\x35\xe2\x81\x75\x56\xfc\x93\x11\x75\x1b\xa7\x53\x54\x77\xde\xc8\x35\x6e\xc3\x85\xef\xb8\x2b\x41\x40\x62\xf3\x5b\xb6\xd3\xed\xea\xfd\xe3\x05\xf9\x90\x0a\x25\xe9\x81\x3c\x9e\xe0\x23\x7d\x46\x40\x96\x50\xcd\xcd\xb5\xdf\xa2\x30\x1a\x8e\x26\x47\xf8\xd3\x81\x9d\x86\xf7\xb7\xe3\x07\x0d\x33\x44\x0f\x82\xc4\x05\x4b\x1a\xb5\xed\xeb\xeb\x27\xf9\x5b\x3c\x4c\x6f\xdd\x46\x8f\x21\x60\x0f\x03\xb3\x49\x4d\xa2\x00\xba\xb9\x29\x3c\x38\xd0\x2f\xc4\x40\x48\xe5\x2f\xf5\xfd\x0f\x72\x17\xa0\x4d\x4c\xe9\x12\xa1\x80\xd1\x62\x8f\x36\x82\x80\xb6\x89\x26\x72\xe8\xff\x98\xd4\x62\x9a\xc2\x8b\x60\xc0\x2a\x30\x1e\x6c\x60\x26\xc1\xb9\xe9\xef\x21\xcf\x03\x92\xdf\x22\x50\x08\xd5\xa0\xe0\x28\x4b\x28\x26\x31\xad\x17\x10\xf8\x11\x61\x56\x97\x06\x6c\x98\x29\x65\x19\x94\x8a\x7c\xfe\xd5\xae\xeb\x45\x4e\xe7\xa6\x1c\xc2\x71\xbd\x3d\x49\x9b\xe1\x7d\xf0\x9d\x3a\x0e\x79\x0e\xe6\xb9\xbd\x99\xe1\xb9\x19\xbe\xd4\xa0\x63\xb8\xd1\xa3\x4f\x1a\xfd\x2e\x95\x2b\x9d\xfe\xfd\x77\x09\x69\xc8\xb2\xfc\x37\x97\x7a\xbb\x0f\xee\x63\x17\x25\x3a\x23\xec\xc9\x75\x78\x16\x89\x73\x33\x4c\x8f\x91\x76\x3a\xb9\x7f\x29\xc4\x9b\xae\xee\x7b\x35\xf3\xae\x7f\x5c\xd3\xa4\xa6\xe6\x97\xef\x25\x5a\x3c\x2e\xc0\xc7\x52\xa3\x39\x6f\x69\xf6\x63\xca\x1f\xc2\xb3\x32\xdf\xe6\xc0\xfa\xf7\x8a\xfe\x9c\x68\xd9\x95\x71\xe8\xe8\x96\xc5\x09\x30\x85\xe9\x86\x3a\x27\x64\x8a\x9e\x58\xf3\xa9\xa8\x4c\xbb\xfe\x2b\x41\xca\x36\x33\xdd\x5c\xf6\xe8\x2c\xb7\x7c\xec\xac\xad\x8d\x78\xb3\x53\xf4\x8d\xb4\x2d\x99\xc3\x6b\xca\xd1\x70\xea\x9e\x98\xab\xb2\x78\x8c\x33\xa3\xc7\x06\x26\x8f\x36\x31"}, +{{0x88,0x8c,0xe2,0xec,0xce,0xda,0x9c,0xa2,0xb9,0x48,0xac,0x14,0x43,0xc2,0xae,0xdd,0x75,0x95,0xaa,0xcf,0x36,0xed,0xaf,0x27,0x25,0x5b,0xde,0x7a,0x69,0x91,0xdc,0xc0,},{0x01,0x6e,0x57,0x2b,0x4f,0x98,0x41,0x7c,0x6e,0xe2,0x97,0xab,0xd7,0x84,0xea,0x48,0x22,0x6f,0xf4,0xfb,0xf0,0x05,0x0a,0x5a,0xde,0x88,0x06,0xe7,0x04,0x6d,0x3b,0xa3,},{0x99,0xd8,0x3f,0x14,0x8a,0x23,0x6e,0xbb,0xef,0x1c,0xad,0x88,0xcb,0x3c,0x76,0x94,0xf4,0x98,0x6c,0x92,0x50,0xe2,0x1c,0x36,0x03,0xa0,0xd9,0x41,0xbf,0xf1,0x99,0xcf,0x77,0xd6,0xce,0x99,0xef,0xdb,0x20,0x53,0x31,0x88,0xd6,0x8a,0xd1,0x33,0xde,0x03,0x3a,0x1f,0xb3,0x46,0x8a,0xbb,0x70,0x6d,0x2b,0x8b,0x4f,0xba,0xc0,0x8d,0xfe,0x03,},"\x5c\x80\x1a\x8e\x66\x4e\x76\x60\x76\x0a\x25\xa5\xe1\x43\x1a\x62\x15\x9f\xc3\xf3\xaa\x71\x37\x80\xae\x7c\xbc\xe2\x3b\x85\x64\x78\x27\x99\xbf\x2b\xe4\x81\x7e\xe2\x92\x19\x65\xba\xb7\xe1\xd4\x48\x33\x82\x4c\x16\x28\xd4\x2d\xce\xe3\xe4\x6a\xe4\x2b\x28\x16\xd0\xa4\x32\xa1\xab\x0b\xd2\x1f\xcf\x30\xad\xb6\x3d\x8d\xd7\x65\x69\x54\x43\x43\xd0\x03\x5c\x76\x05\x22\xca\x68\xbe\xa7\x2c\x40\x4e\xdd\xa1\xe9\x09\x5e\xc9\x0f\x33\x25\x68\x1c\x6d\xe0\xf4\xc1\x2d\x1a\xfb\xcb\xa2\xc7\x87\x1a\x1b\x1e\x1f\x19\xc3\x5b\x0b\xed\x9e\xc2\xa8\x7c\x04\x3d\x36\xd8\x19\x39\x6b\xd5\xd0\x99\xe1\xaa\x09\x03\x91\x29\x7c\x73\x3f\x65\xa8\xc5\xd2\x12\x0c\x67\x63\x53\x16\xfa\xb2\x5b\x4d\x48\x47\xa4\x5f\xc3\xf7\x6f\x2e\x24\x26\xdb\xee\x46\x29\x97\x50\x62\xfc\xe1\x4e\x21\x89\xdb\xa2\x7f\xb1\xde\xd2\x45\x3f\x00\x1d\xeb\xfa\xa8\x99\xc1\x16\x60\x61\x2d\x2c\xe2\xad\x2f\x76\x2e\xa5\xde\xe7\xe7\x1e\x58\xad\xcd\xce\xfa\x79\xe8\xe8\xb2\x7f\xc4\xcc\xf8\x9a\xab\xf1\x76\xb5\xd3\x4f\x82\xdd\x15\xd8\x89\xf9\xf0\x87\xdc\x9a\xe8\xa4\x2a\x72\xf3\xb8\x35\x83\x61\x6e\x17\x06\x37\xcd\x1a\xdf\x38\xaa\x65\x51\xcb\xac\xca\x36\x02\xbd\xc7\xae\x21\x0c\x4a\x44\x6b\x3a\xf8\xdb\x27\x20\xe5\x49\xbb\xed\xb8\xbe\xd2\x15\xae\x00\xf1\x9d\xa2\x9d\x8f\xb0\xb6\x42\xd2\x7b\x2d\x88\x57\x5f\x0e\xe8\x4f\x3d\x12\x9e\xb7\x74\xd2\x0f\x53\x7a\x1c\x0f\xdc\xf7\x17\xbd\xeb\xcf\xe4\x7f\x83\x31\xa3\x41\x86\x43\x46\xfa\x6a\x1c\x6b\xbf\xd1\x78\x81\x9e\x38\x7a\x0d\x54\x99\xa6\x8e\x81\xcc\x9f\x82\xad\x39\xe3\x1e\x4d\xfe\x71\x95\x2d\x5e\xa5\xcc\x80\x52\xa3\xce\xed\x17\x51\xf5\x9d\xc7\xec\xc9\x74\x2f\xad\x14\x4e\x18\xdd\xa8\xd0\x58\x2e\x74\xe3\x9c\xa8\xc4"}, +{{0x61,0x73,0x90,0x85,0x7d,0xc1,0x0c,0xdf,0x82,0xb5,0xc9,0x42,0x61,0xf5,0x8c,0xe2,0xd4,0x4a,0xa2,0xf5,0x7d,0x29,0x8f,0x08,0xa2,0xd6,0xc7,0x4d,0x28,0x14,0x7d,0xaf,},{0x89,0xe0,0xc3,0xe0,0xa0,0xf1,0x30,0xd1,0x91,0x6e,0x0e,0x38,0x49,0xb7,0x28,0x6f,0xa2,0xe3,0xac,0x4c,0x17,0xbd,0x1f,0x71,0x6e,0xe5,0xa7,0x2f,0x02,0x57,0xfb,0x8d,},{0x63,0xe9,0x0a,0x6a,0xfb,0xbb,0xb0,0xee,0x69,0x6b,0xfb,0x56,0xef,0xd6,0x79,0xd6,0x8a,0x98,0x51,0xa8,0x94,0x76,0x40,0xa9,0x7f,0x41,0xf6,0x8e,0xdf,0xea,0xdd,0x21,0x6e,0xd8,0x69,0x8e,0x2e,0x43,0xc8,0x20,0xc9,0x04,0x4c,0xaa,0x7a,0xda,0xab,0x5b,0x76,0x76,0x2b,0x68,0x18,0x31,0xa9,0xf7,0x60,0x47,0x6a,0x84,0x43,0xc4,0x3c,0x06,},"\x1f\xd9\xe7\x45\x3e\xaf\xfd\x7c\x9b\x54\x05\x56\x22\xdd\xe1\x70\xdd\x58\xb7\x1c\xb9\x45\xde\x75\x35\x1d\x5f\xce\xb1\xf5\x36\xbd\xe2\x51\x58\xf0\x37\x86\x15\x5f\x95\x3d\xc2\x07\xa1\x70\x8f\x90\xd9\x5b\x15\xac\xa0\xae\xe3\x09\x7f\xdc\xaa\xe8\x5e\x4a\xb1\xc2\xcd\xb7\x05\xc5\x3e\x6c\x2e\xd2\x1a\x99\x4b\x30\x4a\x75\xca\xf2\xce\x4f\xc7\xd6\x1f\x56\x1e\x74\xe2\x97\x39\x7e\x2c\xde\x5c\xc6\x90\x56\x94\x03\x43\xaa\x81\x37\x5d\x0a\xf1\x8d\x17\xd2\xf3\x4c\x0a\x71\xdc\xf1\xde\x3c\x4f\xc4\x88\xa1\x4c\x5f\xa6\xb3\x33\x7a\x31\x74\xb1\xda\x79\x58\xfb\x00\xbd\x59\x55\x14\x82\x21\x42\x7c\x60\xdb\xa0\x41\x17\xc8\x0d\x24\x88\x65\x6d\xbd\x53\x43\xde\x89\x12\x87\xb5\x0e\xf4\xdf\x98\x25\xed\xa7\x6b\x49\x77\xf3\xac\xd4\xab\x6d\x31\x02\xfa\x56\x87\x83\x06\xcd\x76\x56\x14\x91\xbc\xfd\xaa\x1d\xa5\x67\xe6\x77\xf7\xf0\x3b\xae\x5d\xbf\x44\x26\xc3\xc4\xa6\xc3\xd0\x82\xf9\x17\x8b\x2e\xfd\xd2\xbd\x49\xee\xe9\x7e\xf4\xdc\xf3\xf0\xf5\x1b\xbd\xef\xfe\x5a\xe6\x60\x1e\x28\x01\x95\x18\xf8\x27\xf0\x2e\x51\xf6\x67\x9b\x87\x15\x97\x8b\xec\x3e\x69\xd5\x77\x15\x6d\xd7\x19\x95\x93\x71\xba\xf0\x34\x21\x9f\xbb\xd1\x7a\x23\x69\xa8\x54\x14\x90\xf6\xa0\x20\x13\xe3\x3e\x74\xf4\x76\x9b\xe3\x7a\xef\xa4\xde\xfb\x6b\xfb\x3f\x35\x1c\x2a\x26\x14\x82\xc2\xfb\xec\x49\xf8\x5f\x84\x45\x45\x6e\x8f\x5a\x47\x40\x30\xcd\x72\xd0\x95\xef\x6a\x62\x20\x30\xe1\xe4\x3a\x0c\x5d\xeb\xb0\x34\x73\x1d\x2f\x5e\x8e\x4b\xa3\x99\x0f\x07\x7d\x0c\x16\x26\x49\xd1\xfa\x3e\xa4\xfe\x1e\x81\xd7\x4a\xa8\x49\xe2\x1b\x05\x9d\x96\x6c\xba\xd4\xc4\x93\xca\x10\xba\xfe\x7a\x69\x24\x3e\x3c\x0a\x6e\xbf\xd1\x3d\x69\x79\x06\x30\x33\x92\xba\x65\xd4\xfe\x06\xb6\xa5"}, +{{0x87,0x7d,0x01,0x74,0x36,0x36,0x9e,0xc2,0x45,0x3f,0xed,0x46,0xe9,0x77,0xd6,0xac,0xc3,0xa7,0xbe,0x60,0xd3,0x13,0x95,0xad,0x6e,0x7e,0xa9,0xe0,0x74,0x80,0xe4,0xc9,},{0x4e,0x65,0x42,0x2f,0xed,0x33,0x4a,0x55,0xe8,0xb6,0x73,0x89,0x3e,0xba,0x7c,0x18,0x1d,0xd7,0x24,0xdd,0xa0,0x02,0x81,0x7b,0x0b,0xae,0x28,0xac,0xdc,0x3f,0x7f,0xc0,},{0x76,0x88,0xf3,0xf2,0x40,0x1e,0xac,0xaf,0x2d,0xd8,0x8e,0x17,0x0f,0xf1,0xc4,0xd7,0xe9,0x48,0x22,0xa7,0x7f,0x6b,0x55,0x0b,0x56,0x9e,0x82,0x15,0x2b,0xbb,0xb4,0x34,0x05,0x7e,0x01,0x23,0x0b,0x05,0xce,0x58,0xee,0x1d,0xee,0x52,0x26,0xb5,0xc7,0xcd,0xbe,0x5a,0x8a,0xde,0x3b,0x94,0x65,0xf5,0x9a,0xed,0x74,0x14,0x5d,0x14,0x33,0x0c,},"\x4e\xd3\xf5\xbd\xbd\x41\xd0\xe3\xb0\xa8\xa7\xfc\x37\x52\xee\xa4\x96\xd6\x14\x16\x78\xcb\xfe\x06\x75\x7f\x61\xe1\xa1\x68\xd7\x61\xb6\xda\x83\x05\x2f\x79\x94\x95\x0d\x24\x62\x6f\x00\x4f\xbe\x9b\x8c\x95\x62\xe0\xc9\x55\xfb\x3b\x5c\x08\xfd\x2d\x3d\x25\x83\x93\xa3\x49\x03\x0c\x8e\x15\x62\x05\xb4\x04\x83\x03\x8b\xe1\x95\x9f\x1c\xba\x49\x0a\x87\xfe\x13\x89\x9e\x4f\x37\x52\x06\x3b\x68\xfe\x3e\x1c\x50\x71\xf7\xdb\x00\x02\xf0\x14\x94\xb4\xa3\xee\x2e\x07\x99\x2b\xdd\x20\x0d\xb4\x31\x66\x29\xee\x8a\x95\xca\x34\x7f\x0b\x28\xd6\x40\x2a\x6d\xa8\xb5\x3e\x6b\x32\x58\x1c\x36\x91\xe1\x1a\xe9\xb6\xe0\xf0\x49\x48\x94\xe6\x49\xa9\x2d\x03\xeb\x49\xc4\xd6\x83\x3f\xa1\xf5\x4f\x8d\xcd\x91\xd0\x69\x36\xa6\xe6\x2d\x49\x1e\x2c\xea\x46\xdd\x07\xd9\xf0\x2d\x32\x54\xb8\x50\xbc\x97\x49\xf2\x58\xa6\x1a\xd3\xb9\xcc\x24\xb0\x32\x87\x33\x1b\x85\xa2\x41\x43\xaa\xf8\xfc\xcc\xac\x5f\x18\xbf\xc7\x2d\xec\x75\xc0\x23\x35\x16\xaa\x6e\x45\x89\xc7\x8c\x66\x5a\x18\x6e\xd9\x02\x09\x1d\xf9\x7b\x0d\x04\xe8\x3a\x2d\x74\xd7\x89\x89\x1a\xea\x2c\xac\xf8\x13\xff\xfb\x5e\xfa\xf7\x8d\xbc\xd7\xaf\x54\xef\x55\xc7\x7b\x1c\x4c\x8a\xce\x9e\x92\x78\xad\xc2\x3d\x76\xc7\x79\xd6\x4b\x3b\xbb\xd1\xfb\x33\xb0\x98\x36\xea\x64\xa7\x1e\x47\x11\xe8\x9e\x8d\xa0\xf7\x09\x21\x33\x42\x17\x6a\xe2\x2c\x6e\x78\x52\xc3\x97\x3b\x60\xd9\xf9\x88\x89\xb4\x42\xaa\x48\xd7\xbf\xdf\xde\xf6\x4c\x36\xc5\x86\xc4\xfb\x2a\xd2\xe2\x7e\xbe\x47\x9f\x6d\x72\x2f\x06\x9f\xd6\x10\x6b\x0d\x08\x97\x5d\x5f\x72\x15\x47\xc3\xb9\xc5\x2f\x9f\xc5\xf4\x5b\xb4\x5b\x5b\x63\x21\x88\xe8\x06\x26\x51\x8a\x79\x05\x6b\xdc\x4e\xe1\xd2\xbe\x6c\x65\x42\xa2\x1f\xad\xea\x92\xc6\xdf\xb7\x76"}, +{{0x4f,0x0b,0x36,0x07,0xd7,0x0b,0x0f,0x26,0x98,0x32,0x7e,0xf4,0xf1,0x98,0x2c,0x5b,0x4b,0x94,0xbe,0x78,0xf5,0x0c,0x76,0xf4,0x3b,0xd6,0x42,0xf1,0xf0,0xed,0xe3,0x9b,},{0x94,0x2b,0x43,0x08,0x9f,0xd0,0x31,0xce,0xc0,0xf9,0x9e,0x5e,0x55,0x0d,0x65,0x30,0x7f,0xb6,0xc3,0xe7,0x93,0x44,0x9f,0xb3,0x90,0xff,0x73,0x0f,0xff,0xd7,0xc7,0x4b,},{0xf3,0x96,0xa1,0x1f,0x2f,0x03,0xc6,0x14,0x39,0x68,0x4f,0x79,0x00,0x1b,0xd4,0xf3,0x46,0xa3,0x48,0xdc,0xf1,0xd3,0xbe,0xb2,0xd3,0xbf,0xe3,0x3e,0xa7,0x3a,0x5a,0xd4,0xeb,0x97,0x50,0x6a,0xcf,0xbf,0xfb,0x78,0x4e,0x77,0x54,0x81,0x89,0xcd,0x59,0x9f,0x8c,0xcf,0x17,0x35,0x5d,0xde,0x80,0xe7,0x50,0x24,0xef,0x2a,0x78,0xd5,0xfa,0x03,},"\x9f\x70\x0a\x1d\x25\x60\xf6\x9d\x9b\xc1\x05\xbc\x83\xbf\xf5\x39\xe4\x25\x8c\x02\x48\x60\x20\x13\xa9\x59\xb9\x78\xa1\x9c\xc2\x73\x28\x0d\x90\xc0\x17\x80\x89\x57\x8b\x50\x51\x8e\x06\xad\x1e\xab\x79\x0f\xfe\x71\x0c\x63\xd7\x88\x87\xa9\x55\x69\x14\x4f\x3e\x58\xa8\x83\x7f\x93\xdd\x51\x6f\xcd\xdd\x22\xbc\x97\xa7\xf1\x44\x11\xd4\x24\xb2\xe8\xe9\xaa\x7c\x28\x01\x19\xad\x94\xce\x92\x53\x3f\xc7\xfe\xa6\xc6\x62\x48\x64\x4a\xc3\xe1\xbe\xef\x25\x53\xa6\xf6\x1e\x91\xb9\x37\x9b\x0f\xe0\xc6\x8b\x40\x68\x14\x55\xb3\x11\xf4\x0d\xf0\xc9\x7f\x53\xfc\x95\x42\x42\xc3\x75\xe7\x70\x8d\x61\xba\xd9\xf5\x12\x96\x24\x72\x74\xfa\x01\xa7\x32\x8f\xa5\x00\x9d\x99\x95\xf5\x01\xae\x86\x83\x55\x2b\x11\xa4\x9d\x26\x38\x11\x67\x23\xb1\x31\x94\x50\xa9\x01\x38\xd2\x78\xcd\x95\x12\xb8\x0c\xa5\x79\x2e\xd1\x6c\x68\x3b\xef\x92\xec\x87\x88\x4c\x9f\x07\xf1\x37\xdc\x47\xa1\x31\x46\xe5\x11\x06\x5c\x2e\x1b\x4b\x80\xef\xde\x88\xae\x12\xe2\x94\x31\xbe\xb7\xae\xe3\x65\xc1\x6d\x80\x50\x6b\x99\xaf\xa6\xa1\x40\x6e\xdb\x06\x17\x66\x87\x58\x32\xdb\xa4\x73\xe5\x19\xdd\x70\x18\xf4\x02\xeb\x1b\xb3\x01\x4b\x7c\xee\x4f\x02\xe9\x80\xb1\xb1\x71\x27\xe7\xd2\x5d\xfe\x0c\x16\x8c\x53\x44\xf1\xc9\x00\x44\xf8\x27\x70\x7d\xca\x03\x07\x0e\x4c\x43\xcc\x46\x00\x47\xff\x62\x87\x0f\x07\x5f\x34\x59\x18\x16\xe4\xd0\x7e\xe3\x02\xe7\xb2\xc2\xca\x92\x55\xa3\x5e\x8a\xde\xc0\x35\x30\xe8\x6a\x13\xb1\xbd\xfa\x14\x98\x81\x30\x98\xf9\xba\x59\xf8\x18\x7a\xbc\xaf\xe2\x1b\xa0\x9d\x7c\x4a\xaa\x1a\xd1\x0a\x2f\x28\x33\x4a\xb5\x39\x96\x14\x7c\x24\x59\xc0\x1b\x6a\x10\x83\x9e\x03\x01\x12\x3d\x91\xa3\x5c\xed\x7a\xf8\x9a\xfb\xac\x7d\x9c\xf8\xac\x9a\x38\xce\xeb\xef\x83"}, +{{0xb8,0xa0,0x01,0x0c,0x78,0x4d,0x8d,0x00,0x2a,0x31,0xda,0x11,0xd0,0x22,0xd3,0x01,0x88,0xa4,0x19,0x7a,0x1d,0x5f,0x14,0xea,0x4c,0x0d,0xab,0x29,0xa2,0xe4,0x06,0x68,},{0x8b,0xdc,0x63,0xe5,0x0b,0xed,0xe1,0x3c,0x91,0xa4,0x1e,0x4b,0x4b,0x78,0x57,0xb9,0xe5,0x53,0xf4,0x84,0xe3,0xc1,0xec,0x16,0x7d,0xc0,0x4c,0x28,0x1e,0xa8,0x66,0x22,},{0xb3,0xf6,0xcf,0x4c,0x0e,0x0f,0x90,0x74,0xff,0x2c,0x2c,0x47,0xe1,0x63,0x20,0x2f,0x1e,0x9d,0x6e,0xe1,0x17,0xcf,0x75,0x76,0x33,0xe4,0xab,0xe7,0x44,0x23,0xaa,0x70,0x00,0x8a,0xda,0x15,0x09,0xec,0x1d,0xc1,0x17,0xc1,0xc2,0x30,0xe9,0xb2,0x37,0x86,0xf3,0xd0,0xf2,0x9b,0x73,0xaa,0x28,0x45,0x36,0xe9,0x58,0x01,0x06,0xa8,0xa7,0x0c,},"\x5c\x6c\xcb\x29\x8b\xe2\x16\x80\x8b\x81\x1e\x56\xd9\x72\xf4\x56\xb6\x9a\xd3\x95\x94\xee\xe3\x54\x70\x1c\xa6\xb3\xe3\x8d\x1f\x41\xa3\x59\xe5\x51\x2a\xf9\x8a\x3a\x08\x73\x26\x5f\xe5\x19\x1f\x4f\x2e\xca\xf6\x6b\xee\x75\xa3\xac\x0b\x71\xa4\xdd\xf2\xa7\x59\xeb\xdd\xdb\xd8\x8a\x6a\x1c\x6f\xd0\xfc\xf7\xd7\xcb\x92\xa8\x4e\x33\x07\xb4\xa4\xf9\x8c\x71\x0a\xbf\x4f\x55\x3d\xee\x74\xf6\x52\xd2\xac\x64\xbc\x30\xf7\x2b\xf4\x35\x4e\xf7\xe8\x06\xa1\x90\x71\xa0\x51\xbc\xfc\xfb\x27\xe3\x7f\xdd\xd4\x1e\xce\xae\xc1\x75\x8e\x94\x69\x5c\x67\x0e\xf4\xc5\xa5\x90\x21\x78\x32\x9d\xb9\x58\x5c\x65\xef\x0f\xa3\xcd\x62\x44\x9b\xb2\x0b\x1f\x13\xae\xcf\xdd\x1c\x6c\xf7\x8c\x51\xf5\x68\xce\x9f\xb8\x52\x59\xaa\xd0\x5b\x38\xc6\xb4\x85\xf6\xb8\x60\x76\x92\x8d\xdb\x4e\x20\x36\xf4\x5e\x7b\x9c\x6a\x7f\xf2\x4a\xe1\x77\x60\x30\xe2\x57\x68\x25\x01\x9a\xb4\x63\xeb\xf7\x10\x3a\x33\x07\x20\x33\xea\xcb\xb5\xb5\x03\xf5\x32\x66\xaf\xb8\x2f\x9b\x24\x54\xb8\xdc\x05\x7d\x84\xf3\x0d\x9d\x2c\xb7\xc3\xa3\x1a\x7d\xbd\xfb\xa5\xb8\xe4\x92\x31\xc2\x31\x39\x6c\x47\xca\x04\x2c\x8e\x48\xa1\xa5\xe3\xec\x9a\xfe\x40\x20\x59\x53\x90\xf9\x99\x0d\xfb\x87\x4e\x08\x25\xae\x9a\xe5\xe7\x52\xaf\x63\xaf\x6f\xd3\xe7\x87\xe7\x5e\x8d\x8d\xc4\xc6\x63\x02\x27\x7a\xc0\x1b\x30\xa1\x8a\x56\xcb\x82\xc8\xa7\xeb\xdc\x91\x5b\x71\x53\x25\x5a\x1f\xed\xc4\x92\xe4\x96\x60\x26\x2b\xb2\x49\x78\x0d\x17\x3e\x1f\xd2\x0d\x18\xc4\xf6\xb0\xb6\x9a\xa2\xec\xa0\x24\xbf\x3c\x80\xd7\xd5\x96\x2c\xc4\xa1\x29\xa7\x94\x3b\x27\xf3\x3c\xc7\x99\xa3\x60\x45\x54\x12\x75\xa2\xcd\xb9\x2a\x40\xe4\x85\xba\x8b\x73\x7a\x04\xb4\x3d\x29\xc3\xe2\x5f\x76\xcb\x3d\x93\xa6\xb9\x44\x61\xf8\x8f\x56\x96"}, +{{0xef,0xc8,0x6c,0xbe,0x40,0x36,0x3a,0xbf,0xbb,0x2a,0x4b,0x1f,0xcc,0xe5,0xfd,0x60,0x84,0xda,0x96,0xe7,0xe8,0x14,0xde,0x71,0xaa,0xdf,0x9a,0x61,0x8f,0x30,0x36,0x25,},{0x22,0xf2,0x95,0xce,0xe7,0x27,0xd2,0x8d,0x2b,0x93,0x17,0x15,0x3e,0x7d,0x94,0x12,0xda,0x10,0x65,0xc1,0xb1,0x6a,0xe2,0xa2,0x51,0xdd,0x1f,0xb4,0x31,0xc6,0x2b,0x01,},{0xf8,0x81,0x83,0x10,0x22,0x8c,0xa7,0x61,0x11,0x52,0x4c,0xe9,0x4b,0xfc,0xb0,0x24,0x6e,0xa6,0x35,0x08,0xce,0xe9,0x30,0x65,0x92,0xb2,0xf7,0x75,0x48,0xed,0xef,0xcf,0x76,0xbd,0x14,0x54,0x50,0x8e,0xa7,0x15,0x04,0x2c,0xec,0x16,0x9c,0xea,0x51,0x15,0xab,0x54,0x23,0x5c,0xb1,0x09,0x7b,0x10,0x70,0x2a,0xa3,0x83,0x78,0x02,0x8e,0x0c,},"\x9e\x4f\xa4\x5d\xc0\x26\x71\x0f\x6b\xef\x4e\xd0\xf0\x7c\x54\x4b\x0b\xb0\xd8\x8f\xa7\x9e\x71\x77\xd8\x44\x8b\xc2\x09\xd7\x1c\xfe\x97\x43\xc1\x0a\xf0\xc9\x93\x7d\x72\xe1\x81\x9e\x5b\x53\x1d\x66\x1c\x58\xc6\x31\x41\xce\x86\x62\xc8\x83\x9e\x66\x4d\xb7\x9e\x16\xc5\x4d\x11\x3a\xbb\x02\xa7\x5b\xdf\x11\xb3\x45\x3d\x07\x18\x25\xbc\x41\x57\x41\xe9\x94\x83\x54\x6b\x8e\x1e\x68\x19\xde\x53\x01\x70\x92\xe4\xef\x87\x1f\x1c\xa0\xd3\x50\x8f\x93\x78\x28\xa4\x66\x7d\xb1\x1f\xff\xf9\x41\x6e\xeb\xb9\x4b\xf9\xb8\x4d\x65\x46\x03\x09\x48\x34\xa9\x9c\xa7\x0b\x90\xf5\x62\xa8\x68\x23\x62\x4d\xfe\x9c\xb2\xf9\xe8\x8c\x17\x3f\x13\x46\x4d\x4c\xe2\x55\xf2\x22\xdb\x50\xdd\x63\xab\x42\x46\x57\x34\xe7\x52\x95\xc0\x64\xb6\x4c\xc3\xf1\x5e\x62\x37\xe3\x7f\x33\xd6\x15\xf7\xc2\x43\xe4\xba\x30\x89\x60\xcf\xd4\x39\x34\x02\x52\x55\x00\xbb\x79\x02\x97\x0b\x39\x31\xd4\x8b\x35\x66\x6a\x2d\x4d\x2a\xb0\x8f\xa1\x2a\xf3\x66\xa0\x04\x34\x6c\x9d\xd9\x3d\x39\xfb\x1b\x73\x40\xf1\x04\xe5\x1f\xed\xbb\x53\x36\x05\xb5\xff\x39\xcf\x6d\x59\x51\x3f\x12\x85\x6d\xcf\xa1\x98\xd7\x93\xb0\xfc\x87\x5c\xde\xa0\x74\x1f\x14\x55\x74\x6d\x8a\x19\xc3\xe9\xd9\x28\xf0\x02\x1b\x01\xc2\x51\x31\x81\x1e\x48\xc3\xc7\x5c\x6f\x41\x42\x2a\x88\x10\xc6\xc8\x1f\x35\xb4\x54\xee\xae\x8c\xd1\x7c\xf3\xf2\xe6\xf0\xbc\xd9\xf2\x90\x98\x4f\x49\x65\x78\x62\x3a\xb8\xe2\x73\x8d\x2d\x10\x84\x0e\xb9\x1d\x10\x1c\xb4\xa2\x37\x22\xb7\x2e\x3d\xd1\x85\x44\x0c\x3b\x9f\x44\xd4\x6a\x39\x3a\x34\xc1\x87\xa2\x0d\x61\x0b\xb6\x98\xc5\x05\x31\x74\x1e\xfe\x96\x32\x35\x12\x32\x98\x00\x77\x2a\x40\x80\x65\xa7\xef\x8e\x4e\x41\x05\xeb\x1f\x5b\xf6\xd3\xfd\x6b\x21\x7f\xd8\x36\xd8\x9f\x53\xb9\x6f\x45"}, +{{0x33,0x55,0x6c,0x60,0xde,0x2f,0x2c,0x9a,0x93,0x03,0xb9,0x9a,0xdd,0x37,0x85,0x92,0x06,0x05,0x05,0xf8,0xe4,0x98,0x61,0x08,0x5a,0x4b,0x15,0xf0,0x72,0xa7,0xef,0x28,},{0x23,0x1e,0xc8,0xcd,0x84,0x58,0x59,0xf6,0x99,0x61,0x27,0x51,0x19,0xdb,0xe4,0xf7,0x15,0xe5,0xec,0x5a,0xa9,0x8b,0xb8,0x74,0x16,0x75,0xb3,0xc2,0xd0,0xc8,0x9f,0xee,},{0xe0,0x6a,0x7a,0x41,0x44,0x57,0xbb,0xbe,0xf2,0xba,0xc3,0x77,0x5c,0xca,0xd0,0x87,0xda,0xcb,0x1f,0xa4,0xbf,0x93,0x88,0x94,0xe8,0xc9,0x29,0x11,0x8e,0x09,0xe6,0x78,0xdd,0x19,0x93,0x8b,0xc8,0x8f,0x43,0xed,0x0f,0x7d,0x31,0xcc,0x6a,0x0e,0x60,0x2c,0x4e,0x4d,0x1f,0xee,0x33,0xd4,0x1e,0x74,0xa1,0x19,0xfa,0x2d,0x1e,0x4e,0x34,0x0f,},"\x96\xaf\x54\x0e\xa2\xb1\x92\x3f\x5f\xd0\xaa\xd3\x21\xac\x03\x20\x70\xc2\xd6\x5b\xa1\x3d\x16\x4e\x75\xc3\x46\x97\x58\xfc\xf3\x1b\xb3\x16\x55\xcb\x3a\x72\x1f\x9c\xb3\x4b\xe2\xc9\x0c\x77\xeb\x65\xbe\x37\xf6\x06\xd3\x2a\x91\x7a\x4c\xb9\xa7\x09\xac\x07\x05\x22\x99\x30\xef\x6e\xb6\xfd\xb0\xfa\x3c\x0f\xd3\xa9\x0c\xe1\x71\x67\x4e\xe3\xed\x06\x35\x4b\xaf\xc3\xc7\x07\x54\x67\xa5\x74\x45\xb8\x03\x85\x64\x04\x47\x90\x2b\xe3\x92\x62\x89\x4b\x1f\x64\xfe\xa5\x82\x87\xdc\x32\x2d\x19\x87\x59\x72\xa7\xc8\xbe\x91\xd3\x1f\x02\x1c\x70\xeb\x68\x2f\xdf\x11\xa1\x0f\x8f\x58\x2a\x12\x6e\x06\x47\x94\x83\x8c\x69\xfd\xf6\x4f\x5b\x6e\x8b\xa5\x9d\x48\xb4\x38\x4f\x8e\x9f\xb5\xc0\x87\xcc\x77\x38\x29\x5c\xd3\x23\x44\xba\x3b\x69\x7e\xe6\xb6\xa8\xb7\x8e\xe7\xa9\x57\x5c\x97\x97\x2a\x4d\x1b\xb1\x84\x86\xf9\x03\x7a\x0f\x3c\x6f\x47\x1a\x90\xf8\x64\x98\xdb\xc0\xdf\x52\x32\xc0\x7e\x8c\x01\xb6\x90\xbe\xe7\x53\x02\x99\x2a\x7a\x36\xfb\x44\x37\xc2\x5a\x8b\xf5\xe3\x4c\xf7\xd5\xb5\x55\x72\xc7\x00\xa0\x79\x84\x8d\x38\x13\x64\xf9\x94\x6a\x91\xeb\x16\x03\xff\x3d\xe5\xeb\xdd\x52\x3b\xd9\x25\x64\x81\x8e\x23\x7a\x53\xe8\xf5\x22\xde\xaa\x2c\x29\xb8\x97\xe9\x61\x58\x6e\x10\x0e\xd0\xfc\x0a\xd7\x0d\x16\x09\x34\xe6\x94\x02\x7e\x5c\x95\x79\x20\xbc\x05\x46\xe9\x01\xbe\x39\xa8\x45\x35\x59\x7e\x1f\x28\x0c\x22\x22\x67\xab\xe9\x7f\x41\x20\x5d\x81\x71\x82\x0d\xd2\xfa\xaf\xc0\x69\x94\x19\x32\x1a\x91\x60\xf6\x9b\x99\xfd\x41\x18\x09\x45\xb6\x2d\x2d\xd1\x05\xcc\x7b\xbe\x82\x1d\x28\x60\x5e\x09\x8e\xdf\xa8\xb2\x30\x9a\xeb\x05\x34\xe7\x56\x37\x7f\x59\x93\x7c\x67\x46\x3f\xd8\x7c\x8b\x92\xab\x58\x11\x9c\xf4\xce\x6c\x66\x5a\xf5\x72\xfb\xae\x1d\xe4\xa2\xcc\x71"}, +{{0x7a,0x5c,0x74,0x31,0x4e,0x11,0x83,0x33,0x4a,0x4b,0x62,0x26,0xb9,0xa8,0x2d,0x70,0xfc,0x2a,0x12,0x4e,0x3f,0x87,0xdb,0x6a,0x22,0x83,0xee,0x05,0xb6,0x8e,0x34,0xe0,},{0xbe,0xae,0x7d,0x3d,0xd9,0x7c,0x67,0xf6,0x27,0x3b,0xfa,0xa0,0x66,0x13,0x1f,0xed,0x8a,0xce,0x7f,0x53,0x5f,0xe6,0x46,0x4e,0x65,0x79,0x1c,0x7e,0x53,0x98,0x57,0x6c,},{0xc2,0xab,0x1f,0x6f,0x51,0x14,0xa8,0x4f,0x21,0x85,0x02,0x58,0x2c,0x56,0x7b,0x37,0xa8,0xbd,0xbc,0xdf,0x63,0x40,0xfa,0x46,0x22,0x87,0x3b,0xe8,0x91,0x06,0xf0,0xa9,0x0b,0x48,0x29,0x50,0x5f,0x72,0x12,0x9d,0xf0,0xab,0x3d,0x85,0x13,0x26,0x87,0x74,0xa3,0x4d,0xf3,0xad,0x21,0xce,0x25,0x4b,0x46,0x44,0x88,0xad,0xdd,0x6c,0x9b,0x04,},"\x98\xba\xc6\x72\x47\x55\x91\x29\x92\xad\xc2\xa4\x8b\x54\x42\x37\x6f\x2d\x92\x79\x97\xa0\x40\xfb\x98\xef\xe5\x44\xeb\x0c\x8e\x18\x66\xb9\x61\x6e\x29\x8d\x33\x60\x31\x6e\xd9\x76\xbd\x94\x6a\x41\x1f\xdd\x3a\x6b\x62\x5c\x0c\x1a\x37\xaf\x0f\x41\xcf\x65\x69\xa7\x88\x4a\xb8\x46\x74\x91\xa9\x87\xdf\x3e\xa7\xa0\xb7\xeb\xc4\x69\x25\x69\xa3\x4c\xe3\xa2\xea\x35\x03\x49\x5b\x2c\x02\xd4\x9d\x7d\x7d\xb5\x79\xd1\x3a\x82\xcf\x0c\xf7\xa9\x54\x7a\x6e\xae\xbe\x68\xe7\x26\x7d\x45\xa6\x0b\x8d\x47\x72\x45\x52\x28\xcc\xa4\x03\x6e\x28\x2e\x1a\x12\x16\xf3\x4c\xef\x7e\xa6\x8f\x93\x82\x70\xbd\xb0\x42\x93\xc8\x85\xd0\x05\xf9\xf7\xe6\x38\xa8\xb4\xea\xd2\x62\x6c\x09\x45\x17\x4f\xf2\xa3\xe2\xd6\xe1\x5a\x4c\x03\x38\xc0\x9e\x12\x60\xf0\x92\x8c\xa9\xd3\x49\x98\x24\xf3\xfe\xdc\x47\x85\xda\x49\xc5\xc3\x4a\x56\x85\x5e\x24\x1f\xac\xc6\x34\x7a\x39\x9d\xdc\xac\x43\x99\xa8\xb1\x58\x19\x8c\x15\x14\x61\xa3\xb1\x89\xe5\x8e\xc1\xf7\xef\xcf\x2a\xb2\x03\x1f\xb1\x7b\x6f\x03\x5b\xa1\xf0\x92\xe9\xee\xe2\xe9\x2c\x2d\x6c\xc2\x03\x22\x87\xf8\x54\xb4\x1e\x70\xfc\x61\xc8\xd1\x1a\x2e\x4f\x07\x08\xf0\x2e\xeb\xd0\x2e\x8c\x7e\x8c\x7b\x38\xa5\x7b\xfa\x1a\x74\x5f\x3a\x86\xc2\x39\x09\xf6\xf8\x9a\xb1\x6c\xe7\xe1\x81\x3c\x1d\x20\x14\x7f\x31\xb4\xcf\x2a\xd0\xb6\x06\xfb\x17\xe5\xac\x1a\xb5\x1e\xf4\xa7\xd8\x09\x3c\xee\x9a\x65\x5f\x47\x1d\xc5\xb1\x46\xbd\x1b\x93\xe5\x40\xa3\xd3\xd3\xe2\xde\x81\x05\x91\x1c\x10\xd6\xab\x5f\xf7\x9c\x2d\x06\x02\x7f\x7a\x54\x56\x1f\x20\x71\x41\x4b\xd3\x30\xa8\x78\x54\x42\x25\x1c\x81\x0e\x23\x2f\x83\xc3\x67\xf0\xbe\x77\x99\xa9\x3f\x52\x38\xf7\xf1\x7b\x5b\xe8\x29\xfd\x89\x12\x3c\x04\x83\x3a\xf8\xb7\x7e\x5a\x43\x63\x04\x7c\xec\xa7"}, +{{0xda,0x80,0x06,0xad,0xc4,0x92,0xca,0x5d,0xc8,0x6c,0x29,0x59,0x43,0x7a,0x75,0xde,0xb6,0x12,0x0f,0xf7,0x87,0xd2,0xec,0xb9,0xc2,0x0c,0x30,0xb5,0x2c,0x26,0xbc,0x41,},{0xff,0x11,0x3b,0xf0,0xaa,0x58,0xd5,0x46,0xf2,0x38,0x5d,0x44,0x4e,0xcb,0x78,0x88,0xf8,0xca,0xba,0x43,0xa1,0x74,0xa8,0x9f,0xd6,0x06,0x5f,0x2b,0x7d,0xc1,0x7b,0xf0,},{0x1f,0x53,0x75,0xdc,0xb3,0xad,0x2b,0xaa,0xff,0x95,0x6d,0x85,0x54,0xec,0xb4,0x24,0x17,0x6b,0xe9,0xa6,0xeb,0x9e,0xa5,0x4e,0x81,0x4e,0x0a,0x73,0xdf,0x2a,0x5d,0x84,0x8a,0xda,0x26,0xba,0x8e,0x18,0x05,0xcd,0x51,0xc5,0xe1,0x69,0x50,0xc1,0xff,0x7d,0x4d,0x27,0x64,0xda,0xa6,0xf4,0xc7,0x50,0x2f,0xb8,0x65,0xcb,0xe5,0x5a,0xaf,0x0b,},"\x3e\xb4\x32\x4d\xbc\x01\x49\xd2\xe7\xd6\xdf\x63\x2b\xb0\xcb\xe9\xa9\xf6\xdf\xa8\x3e\x22\x7f\xc0\x7b\xde\x1b\x57\x7b\x36\x11\xfb\x92\x1c\x9f\x83\x13\xf0\x68\xe6\x29\x5d\x49\x13\xa8\x19\x6b\xe5\x30\xf6\xa0\x1f\x57\xc0\x9c\x02\x84\x91\x44\x4b\x78\x47\x20\xe9\x09\xea\x1f\xb6\x9c\x1c\x1d\xd6\x30\x44\x00\x32\x7b\x77\x31\xb3\x3c\xc4\x6d\xeb\x04\x6c\xda\xb6\xad\x1b\x53\xf1\x74\x9a\x0c\x65\xcb\x9a\x7e\x37\x6f\xfa\x02\x23\x0f\x53\x65\x84\xae\xa2\x43\xc6\x39\x10\x3a\xdb\xba\x76\x43\x21\x64\x9d\x7e\x01\x26\xf8\x2e\x0b\x4f\xd9\xdc\xb8\x6c\x73\x1c\xbc\xc5\x17\xf2\x01\x68\x41\xe9\x16\xbc\xd5\xfd\xe8\x71\xdc\x09\x8c\xd9\x13\xdc\x54\x62\x84\xd1\xb2\x16\x5c\x63\xe8\x8f\x32\xa2\x78\x9a\x50\x08\x56\x37\x1b\x50\xd2\x2f\xb8\xc8\x7d\x1a\x3c\xae\xdc\xdf\xd0\x1e\xe5\xf8\x70\xa5\x3c\x28\x41\x81\xd6\x32\xec\x66\xd4\x8b\x6b\xdd\x56\x46\xac\x39\xc9\xe7\x53\x38\xa5\x20\x21\x20\x62\xbc\x34\x66\xef\x5c\x58\x76\x55\x70\xb9\x05\xf6\x3a\x93\xd0\x7f\x8f\x1b\xaa\xc3\x52\x6b\x01\x6d\xa7\x99\xf3\xe9\xe0\x3a\x4f\x7f\x81\x35\x5e\x0f\x7a\x76\xf3\x0a\x42\xb8\x07\x32\x20\x51\xb7\x1c\x62\x6a\x7a\x29\x6d\x75\xb9\xd9\xd1\xa2\x3b\xcb\x13\xc9\xef\x48\xa9\x12\xdc\x05\x73\x25\xd3\xbc\xfb\x3f\x9f\xad\xaf\x0c\x24\x9b\x10\x2a\xeb\x85\x4a\xa3\x63\x1e\x34\xf6\x9a\xd9\x0c\x2a\xb2\xed\x33\xba\xcc\x40\xb9\xed\x10\x37\xfa\xe6\x7c\xdf\x79\x9d\x5a\x9b\x43\x78\x59\x61\x12\x7d\x62\xf8\xe0\xbc\x15\x89\xfd\x1a\x06\xfc\xa2\xae\xa7\xcf\xc0\x12\xcb\xf7\xb5\xb2\x07\xdd\xc4\xe6\x77\xd8\xae\x4a\xec\x10\x00\x45\xce\x36\xc0\x0b\x74\xd1\xd2\x82\x50\x79\x12\x36\xdc\x5d\xcc\x1e\xd3\x13\xc8\xc2\x46\x17\x26\x66\xf7\x52\x17\x43\x7c\x60\x34\xac\xd6\x41\x98\xcd\x96\xdf\x2a"}, +{{0xa2,0x84,0xe2,0x6b,0x97,0xe5,0x38,0x83,0x9c,0x80,0x8d,0x45,0xbd,0xe6,0xf0,0x12,0xa3,0x54,0x45,0x4a,0xef,0x81,0xca,0xa8,0xc5,0x59,0x14,0x62,0x4f,0x2b,0x7d,0x66,},{0x5a,0xe4,0x6e,0x34,0x69,0x5e,0xfa,0xf4,0x63,0xa4,0x20,0x8f,0xc4,0xe3,0x5b,0x81,0xf2,0xc6,0x35,0x93,0x23,0x8a,0x56,0xf2,0x44,0x4b,0x85,0x0f,0x05,0x8c,0x3c,0x5c,},{0xbf,0x11,0x0e,0x2e,0x9c,0xec,0xbc,0x31,0xfa,0x3e,0x0c,0x24,0x38,0xcd,0x1f,0x43,0x21,0xf9,0x2c,0xd2,0x87,0x00,0x5a,0x48,0x52,0x8a,0xdd,0xf7,0x6c,0xad,0x8d,0x88,0xbb,0x22,0x71,0x9e,0xf9,0x1b,0x13,0x95,0x62,0xa1,0x51,0x18,0x38,0x68,0x26,0x74,0xfa,0xa9,0xff,0x7e,0x7a,0xde,0x6c,0x9d,0x57,0x3f,0x84,0x50,0x36,0xd1,0x89,0x05,},"\x9e\xbf\xe9\x10\xb5\x0a\x5c\xb7\x19\xd9\x5b\x96\x1e\x59\x05\xf0\x0e\xc7\x94\x3b\x55\x46\x8a\xb5\x95\x66\x92\x01\x76\x45\xb3\x66\x07\x1f\x8f\xbb\x77\xeb\x49\xec\x73\xea\x7d\x64\x51\x14\x05\xb9\x0d\xe2\x2d\xb9\x8c\x3e\xae\x39\xc4\x03\x9c\x7a\x13\x34\x30\xe8\x01\x0b\xdd\x39\xa0\x0f\xd1\xa5\x28\xb1\x13\xda\xe1\x49\xcf\xad\x3a\xe3\x40\xda\x27\xdc\xc5\x07\x78\x2e\xcd\x89\x29\x23\x75\x17\xaf\xe7\x46\x3e\xca\x24\x73\xc7\xac\xf6\xf7\xaa\x04\xef\xc9\xf2\x66\xae\x7b\x6d\x63\xbb\x8c\xc2\xa4\x38\xb3\x44\x82\x7f\x07\x13\xd1\xf1\x73\x6f\x0c\xbb\x65\xb9\x93\x53\xf2\x03\x55\xfa\x02\x30\xd4\xfa\x70\x73\x28\xa8\x66\x26\x54\xe8\x3a\xd0\x53\x0a\x10\xf9\xa6\x9e\x17\xc0\x99\xe1\xe2\xb5\xdb\x18\xe5\xf6\xf1\xdc\xed\xa5\x88\x3e\x8c\xab\x79\x70\x1a\x5e\x90\x89\x56\x2e\xd1\x53\xad\x08\xc6\x74\xf0\x97\xc2\x8e\x4d\x16\x63\x3e\x09\x29\x69\xa8\xf0\xbd\xac\x54\x52\x7c\x0e\xe0\x3b\xc2\x00\xe5\xbe\x61\x2e\x3d\x1e\xab\xd8\x70\x91\x10\x1b\x49\x62\xaf\xa0\x7b\x31\x08\x06\x99\x2f\x37\x30\x76\xd7\x6a\x58\x18\x51\x18\x13\x7c\x9d\x26\xee\x2c\xd4\xc6\x18\xc1\x82\x83\xdd\x19\xf0\xe7\xa0\x89\xee\x37\x30\x5b\x6b\x95\x18\xa7\x8d\x80\x98\x43\x6e\xf6\x2b\xe7\xd6\x99\x80\x8a\xce\xcf\x67\x93\x9d\x61\xb3\xe0\x29\x37\xcd\x8c\x5f\x1e\x74\x6d\x42\x74\x33\x4b\xc9\xc3\x7f\xdc\xba\x23\x4c\x16\x6f\xd7\x12\x89\x3f\x3a\x04\x08\x32\xec\x54\x25\xe5\x7d\x80\xf1\x1e\xf9\xca\x5f\xbc\xd6\xc1\x47\xfb\xbf\x5e\x2f\xae\x74\x6e\x0d\xdb\x60\x58\x67\xe3\xbd\x05\x04\x83\xc3\xcd\x13\x29\xab\xe5\x7a\x60\xbf\x88\x89\x8d\xc7\xe8\x0e\xde\x0f\x45\x17\xde\x8f\xc8\x07\xe8\x88\xb6\x21\xa0\x0f\x66\x30\x84\xff\x94\xb9\x99\x96\x62\x8f\x3b\x11\x69\x0a\x60\xf0\x91\x8c\xb5\xc9\xa7\xef"}, +{{0xcc,0x97,0xa9,0x63,0x01,0xce,0xed,0x0f,0x92,0x27,0x31,0xb6,0x85,0xba,0xd8,0xad,0x4f,0x06,0x20,0x7b,0xe3,0x40,0xf5,0xa4,0x4f,0xd1,0x87,0xf2,0x99,0x03,0xec,0x20,},{0xeb,0x56,0x3a,0x7b,0xce,0x12,0xdb,0x97,0xf1,0x89,0x1d,0x0f,0x61,0x0b,0xeb,0xd5,0x51,0x01,0xa3,0x12,0x5c,0xa8,0xdb,0xb5,0x0b,0x25,0xa6,0xb5,0x05,0x0d,0x37,0x84,},{0xff,0xbd,0xd3,0x24,0x41,0x81,0xcd,0xf6,0x03,0x4f,0x4a,0x45,0x0f,0xdd,0x95,0xde,0xe4,0x97,0x1a,0x93,0x3f,0x8b,0xe0,0x22,0xbb,0x0a,0x41,0x06,0xae,0xf3,0x9a,0xf3,0x05,0x5b,0x72,0x18,0x81,0xc9,0xb5,0x4d,0x1e,0x99,0xb9,0x40,0x90,0x96,0xfb,0xe6,0xdc,0x2c,0x99,0x66,0xe3,0x67,0x99,0x64,0xbd,0x7e,0xf4,0xc8,0x08,0xca,0xbf,0x01,},"\xb9\xea\x3b\x3d\xf7\x18\x7e\xa4\x15\xa3\xc3\x35\xe0\x83\x4e\x10\xf4\x40\x91\x5b\x2a\xd4\x1c\x71\xf2\x55\xd6\x95\x0a\x4e\x91\x20\xe4\xd4\x94\xfd\x9e\x67\x2c\xe5\x32\x06\xfd\xc4\x17\xd8\x65\x89\x7b\x47\xac\x10\x54\xe1\xca\x10\x68\x19\x52\x32\xd4\x29\x74\x35\xe4\x4e\x12\x24\xe6\x6a\x91\x2d\x9d\x7d\x18\x29\x46\xff\x5a\x9f\x08\x5b\xb8\xba\x19\xc5\x4d\x16\xb5\x86\xa9\xb3\x04\x61\xb6\x77\x3b\x93\x95\x03\x11\xe1\x61\x98\x86\xf5\xa5\xb3\xf1\x11\xaa\xad\x09\x4b\xae\x31\xc4\x8f\x19\x41\x08\x09\x68\xbd\x02\x77\xbb\x6f\xa9\x2e\xeb\xf3\x24\xb1\x92\xdf\x5c\xc9\x69\x51\x6c\x78\xc7\xb2\xd1\x21\x59\xb4\xd1\xc8\xeb\x03\x16\x0c\x4c\xd1\x90\x7f\x62\xed\x4b\x85\x4c\x56\x9e\xcc\x48\x1c\x08\xe6\x36\xf4\x4e\xd7\xc3\x90\xe5\x8b\x59\x37\xd2\x90\x6b\x28\x17\xbc\x37\x69\xda\xd9\xda\x1b\x0f\x79\x39\x1b\x55\x94\x20\x63\x05\x5d\xa0\xd6\xf2\x49\xa3\xe4\x52\xba\xdd\xaa\x03\x29\x98\xd7\xf7\x33\x98\xcc\xd0\x15\x1b\xfc\x92\xc5\xe2\xfd\xfa\x9b\x14\x85\x5e\x6b\x0d\x37\x46\xdc\xe2\x48\xe2\x19\x67\x29\x87\x25\x2e\xc7\x47\xdf\x27\x47\xfd\x3f\xbd\x8b\x71\x4c\x88\x2d\x70\x7e\xe3\x02\xa9\x04\x95\x0c\x34\x75\x4f\x85\x35\x0e\x1a\xa3\xf8\xea\x62\x93\xcf\x01\xf7\x17\xce\xfb\x6b\x83\xa2\x21\x26\xdf\x5c\x4f\x56\x98\xaa\xfd\x06\xa2\x24\x4a\xd7\xd0\x1f\x34\x01\x7c\xa0\xec\xe6\xf2\x10\x40\x04\x8a\xba\x6c\xa4\xae\xb0\x43\x25\xb9\x40\x2b\xcd\x43\xab\x13\x0a\x10\x57\x88\xac\x3d\x7b\x7d\xa0\x1e\xa9\x42\x6d\xd0\xea\x19\x33\xa8\x18\x99\x33\xa6\xc0\xc6\xcd\x64\x8e\xa3\x16\xa7\x46\x9a\x5f\xdc\x6e\x7c\x93\x4d\x91\x86\x58\x60\x97\xb5\x5d\xd5\x1a\xc4\x87\xbb\x80\xed\x11\xd4\xdf\x8d\x33\x62\x6b\xbc\xe9\x5e\x4f\x13\xbd\x49\x92\x2f\x00\xc9\x20\x22\x3f\x4c\xbf\x93\xcb"}, +{{0x67,0x9e,0x3e,0x34,0x77,0x3a,0xbe,0x4a,0xe2,0x5c,0xae,0x7d,0x07,0xcc,0xd0,0xeb,0x3b,0x0e,0xc0,0xa3,0x5d,0x57,0x02,0x57,0xd6,0x25,0x70,0xde,0x58,0xea,0x25,0x16,},{0x18,0xac,0xff,0xce,0x25,0x3b,0x27,0x25,0x95,0x79,0xed,0x99,0x24,0xf4,0x79,0xca,0xe3,0x12,0x16,0x7b,0xcd,0x87,0x6e,0xdb,0xa8,0x8b,0x5d,0x1d,0x73,0xc4,0x3d,0xbe,},{0x1a,0x51,0x02,0x26,0x28,0xcc,0xbb,0x88,0xea,0xe9,0xb2,0x17,0x73,0xc3,0xf8,0x30,0xb7,0xb6,0xe5,0xbc,0x36,0xc9,0x90,0x3c,0xe7,0x0f,0xbc,0xf4,0x59,0xd6,0xa1,0xed,0x8a,0x1d,0xce,0xff,0x5b,0x19,0x26,0x9e,0xbf,0x5a,0x6f,0xd3,0xd8,0x95,0x88,0x60,0xf5,0x54,0x46,0x1f,0x0e,0x9f,0xc0,0xe2,0x9a,0xf9,0xb1,0xfb,0x17,0x44,0xa8,0x0b,},"\xfb\x2b\x64\x8e\xbb\x16\x68\x82\x44\xf7\x8b\x2e\xe9\xa2\x73\x59\x9d\x56\xb6\x19\x89\x00\xd4\x38\xa9\xe9\x9c\x19\x14\x25\xc7\x2b\xec\x4f\x23\x58\x47\xe1\x8e\x47\xf5\x7c\x3c\xb3\x96\x65\x5f\x77\x89\x21\xf9\x08\x58\x0e\x8e\x83\xc9\x6c\x10\x8b\x20\xdd\x41\x66\x78\x02\x1b\xca\x25\x9b\x98\x51\x8f\xab\xb2\xd3\x53\x2e\x48\x51\xd9\xd5\x2a\xdd\x25\x42\xc0\xcb\x3e\xfa\x38\x57\xa1\x7e\x51\x24\x38\xbc\x0e\xc4\x76\x2e\x2f\x9b\xab\xa4\x29\xc0\x3e\x99\xbe\xc4\x03\x8e\x6b\x0c\xa4\x2b\xff\x5b\x23\x3b\x24\xc3\x33\xb4\xca\xea\xd2\xde\x37\x4a\x87\xb2\xab\x5d\x80\xd6\xe4\x9e\x44\x56\x32\x9d\x51\xae\x97\x3b\xc8\x3d\x78\x62\xf3\xd3\x15\xe5\x14\x48\x1b\x12\x85\x4a\x9d\xfc\x09\xe7\xd1\x4f\x0d\x02\x2c\x0b\xa3\x02\x25\x78\xeb\xa8\xf8\x74\xde\xba\x4a\xa8\xc8\x33\xf2\xb1\x32\x86\x1d\x4d\x51\xe5\x0f\xe9\xaa\x4b\x78\x7b\xd2\xf0\x51\xaa\xc5\x0c\x37\x53\x90\xcb\xbc\xfb\xa2\x00\x2b\x80\xad\x00\xcd\xc1\x29\x80\xf8\xba\x8b\xcb\x70\x64\xaf\xc0\x4d\x5c\x46\x82\xc1\x02\x9b\x10\xa6\xd4\x5f\xe6\xec\xd7\x04\x24\x5f\xaf\x59\x8c\x46\x59\x59\x7c\x5d\x68\xa1\x92\xcc\x1c\xd4\xfa\x45\xe8\x4b\x54\x9e\x8e\x5e\x67\xda\xa8\x79\xae\x5a\x52\x0a\x6b\x55\x50\x51\x98\x76\xa5\x62\xac\x49\xc6\xdb\x0a\xa7\x6e\xc6\x9b\xb6\x4d\xd6\xb5\xe1\xa3\xaf\x2e\x13\x1e\x72\x2e\x7c\xdd\x05\xbe\x34\xb5\xfc\xc6\x25\x9a\xa1\x24\xcc\xf8\x14\xcf\x5b\x50\x0d\x17\x6b\xe2\x8e\xbc\x40\xbb\x21\xf0\x3e\x24\xcc\xc1\x31\xe0\xf4\x1d\xaa\x1c\xa0\x2e\x6b\x00\xc9\xc5\x3f\xad\x12\x48\x61\x4e\x94\x0d\x4b\x23\x77\x60\xab\x75\x69\xa7\x67\xb7\x51\x5d\xd2\xd6\x23\xe5\x7a\x28\x41\xb7\xd2\x44\x1c\xf4\x30\x49\xe4\x69\x8d\x2f\x9c\x9e\xae\x7b\x29\x10\xf6\xad\x65\xed\xf9\xcb\x2b\xdb\xd9\xb2\x9f\x60\x6e\x0d"}, +{{0x9b,0xfa,0x60,0x92,0x3a,0x43,0xed,0x0c,0x24,0xe2,0xf1,0x2f,0x5b,0x86,0xa0,0x71,0x63,0x29,0xf9,0x3d,0x4d,0x8d,0x3e,0x06,0x23,0x80,0x02,0x89,0x32,0x78,0xc1,0x9a,},{0xfb,0x1c,0x00,0x68,0x77,0x81,0xb5,0x5b,0x89,0x3d,0x6b,0x2f,0x4f,0x49,0xcf,0x5f,0x73,0xd2,0x90,0x3c,0x31,0x6d,0x1e,0xee,0x75,0x99,0x1d,0x98,0x3a,0x18,0x68,0xc0,},{0x55,0xf2,0x02,0xef,0xb2,0xa5,0x7b,0xe8,0xb4,0xe4,0xfd,0x89,0x4d,0xcc,0x11,0xa4,0xfc,0x5f,0x82,0x76,0x61,0x8e,0xf5,0xcd,0x34,0xa4,0x49,0x5a,0xdb,0x01,0x6a,0x29,0x8e,0x64,0x80,0xa3,0x5c,0xfc,0x53,0xed,0xb2,0x5f,0xf1,0x49,0x9f,0xc5,0x32,0xa3,0x30,0x61,0xcc,0x01,0xa2,0x50,0x45,0x8a,0xa5,0xe4,0xf7,0xf1,0x6f,0x51,0x44,0x0d,},"\xa9\x90\x28\xb0\xf4\xa3\xaa\x5e\x79\xab\xef\x6c\x0d\xf4\xa7\x83\xef\x47\x0f\x1a\x29\xba\x51\xeb\xa0\x0f\x62\x14\xe8\x40\xfe\x19\xe5\xb6\xdc\x60\x21\xab\x59\x9b\xb2\xee\x36\x99\x57\x60\x15\xd7\x9a\x79\x39\xaf\x82\x35\x35\xb6\x30\xe3\x93\x8c\x72\x3f\x6e\x0b\x92\x29\xd4\x6b\xb3\x37\x9a\xcd\xba\x58\x7c\x23\x85\x67\xe3\xd8\x9b\xc3\xbd\x35\x19\xb7\x27\xfc\x69\x4f\xff\x11\x18\xbf\x22\xc8\xbc\x8b\xc8\x2c\x4d\xf7\xf5\xad\x38\xde\x05\xfe\x9f\x76\x29\x99\xec\xaa\x79\x5f\x3a\xe6\x30\xa9\xa3\x16\xd2\x6d\xce\x9f\x15\x68\xff\xa3\xf2\x2b\x02\x95\x21\x40\x20\xb3\xd3\xf5\x33\x7c\x14\x95\x68\x19\x22\x18\x13\x2a\x90\x70\x92\x79\xc0\x1d\x23\xba\xef\xa6\x69\xe1\xc4\xe4\x20\x38\x17\x3f\x13\x19\xc2\x12\xda\x14\x4f\x1c\x4e\xa4\xc5\x2c\x00\x5c\xbc\x0b\x5b\xc2\x83\xe7\x44\x83\xa0\xdc\xa6\x92\x79\xde\xb1\x7a\xe5\xb2\x9c\xfa\xfa\x7d\x00\x63\xf4\xe1\xbc\x93\x53\x7e\xfd\x93\x7e\x58\xa8\xac\xa7\x37\x22\x8f\x93\x7f\xf2\xa7\x41\x89\x0e\x96\xc5\x72\x5d\xa1\x1b\x45\xc4\x13\xa9\xbb\xb4\x18\x0a\x41\x99\x87\xbb\xf0\x46\xbf\xd3\x46\x29\x5d\x62\xf0\x81\xc7\x6d\xaf\x2b\x0e\x1e\xb4\xf6\x71\x2f\xee\xbe\x6f\x0a\x92\xe3\x58\xe7\xdd\xb8\x58\x96\x50\x7c\x34\x0a\x01\xf6\x8d\x1b\x0f\x08\x57\x78\xb7\xc4\x4b\x01\x4a\xa6\x67\x3e\x50\x17\x96\x95\x9a\x17\xa6\x88\xdb\x09\x59\x05\x84\x88\xa7\x11\x25\x72\xf2\x3c\xf9\xcd\xb5\x3b\x5e\xb4\xb4\x5f\x59\x53\xba\x0c\x0c\x69\x0f\x86\xbd\x75\xe8\x9a\x04\x7b\xeb\xaf\x84\x7c\x1d\xfc\x34\x5a\x4f\x3c\x7d\x3b\xee\xc9\x8b\x84\xb0\x21\x90\x03\xe8\x19\xf5\xc2\xad\xb4\x5f\x87\x17\x90\x3d\x1f\x5b\xd5\xd7\x19\x14\xc5\x6f\xca\xbc\x7a\x29\x0f\x9c\x41\x69\x9c\x95\x58\x4d\x6a\x3a\x16\x34\x0c\xb1\x7b\xaa\x1f\xc5\xe5\x46\x7a\xf7\xac\x32\x21"}, +{{0x6e,0x3a,0xf4,0x5e,0x66,0xe2,0x28,0x90,0xc3,0xf3,0xc9,0x34,0xf5,0x23,0xa4,0xd6,0x94,0x27,0x97,0x6e,0x6e,0x52,0x62,0x5f,0x8b,0xad,0x55,0x89,0x93,0x96,0x32,0x19,},{0xe0,0x97,0x36,0x4e,0x76,0xff,0x9f,0x2e,0x1d,0x16,0x7f,0x6b,0x20,0xc1,0xbc,0x58,0x30,0x08,0x5e,0x7e,0xc9,0x93,0xc1,0x38,0xf8,0xb1,0xb2,0x17,0x56,0x37,0xe7,0x41,},{0x26,0xba,0x56,0x2e,0x8a,0x40,0x65,0x70,0x82,0x07,0xc2,0x5e,0x23,0x9b,0x78,0x0a,0xee,0x38,0x79,0x4c,0xf9,0x83,0xa3,0x7a,0xcb,0xb9,0xd5,0x57,0xa6,0x5c,0xee,0xd3,0xc0,0xda,0x47,0xd1,0x7f,0x3e,0x8b,0x8f,0x4e,0xeb,0x1b,0x65,0xa2,0xc1,0x82,0xea,0x6f,0x29,0x62,0x3b,0x63,0xbb,0x0f,0x1c,0x72,0x59,0x26,0x83,0xb1,0x26,0xb9,0x01,},"\x5c\xfc\x2f\x4b\x55\x9f\x82\x05\xb3\x91\x02\x08\x76\x17\xf4\xd8\x6c\x7c\xe6\xcb\x25\x1e\x5f\x89\x60\x1d\xfc\x88\xed\x28\xe8\xd7\xa6\x70\xec\x00\x87\xd2\xea\x5d\x89\x30\x21\xc7\x04\x4d\xa2\x89\x9a\x22\xd7\x76\xfe\x90\x17\x0e\x51\xc2\x03\x25\x06\x90\xd3\x7a\x29\x45\x55\xe7\x4a\xf9\x23\x4c\xbf\x1a\xd8\xf2\x2c\xee\x89\x74\x82\x8a\x0d\x09\xe9\x55\x4b\x71\xee\x3b\xcf\x88\x0a\xb9\x83\x25\xf7\x06\x27\x21\x94\xeb\x2e\x80\xc7\x01\xd4\x41\xb5\xf8\x66\x85\x61\xb8\x88\x49\xf8\x27\xaf\x70\x3a\xb0\x95\x41\x05\xfd\x3c\x54\xb3\xf6\xec\x54\x93\x59\x6d\x0e\x3b\xc6\x78\x18\x04\x83\x10\xc4\xa3\xe0\xc5\x56\xbc\x80\x67\x5f\x20\x1f\x9b\xb9\xc6\x53\x8a\x41\xd9\x9a\xa4\x0c\x88\x6f\xc4\x31\x46\x72\x18\xd8\x19\xc2\x3e\x78\x49\x8a\xed\x06\x13\xfa\x6f\x97\x3e\x22\x11\xdf\x9f\xb8\x7f\x44\x11\x6f\x3f\xe4\xc2\x6d\x6c\xb2\xfa\x33\x4c\x87\xf7\x8c\x08\xca\x8c\x9b\x90\x41\xd8\x3a\x12\x30\x67\x7e\x0a\xf7\x88\x59\x8a\x42\xe4\x4c\xfd\xf6\x96\x4a\x4e\xe8\x0e\x38\x40\x2b\xa6\x7c\x73\xa5\x81\xe5\x52\xba\xa2\x28\x24\x25\xcb\x2c\xa1\x7c\xa9\x2e\xdf\xbf\x98\x29\x91\x02\xfb\xa7\x61\xb9\xb7\x1a\x54\x52\x14\x1b\xb9\xc1\x8d\xd9\x5f\xeb\xc2\xa7\x82\xde\x9c\xee\xc0\x8b\xd2\xee\x3f\x7f\x0c\x1b\xd8\x94\x6d\xba\x99\xcf\x9e\xa0\x86\xab\xaf\xd3\x7c\x9c\xa6\x02\x13\xf0\xde\x17\xc6\x1f\xf9\xc3\x91\xc9\x81\x8e\xd5\xcd\x85\x71\x77\x8b\x7d\xcc\x13\x22\x49\x62\x38\x6f\xb8\xca\x14\xf8\x61\xe9\x9f\x3b\x18\xed\xac\x8a\x5f\x13\x0f\x7b\xfc\xd4\x5d\x04\x5d\x0f\xf3\x4c\x81\x57\x2a\x51\x23\x63\xd6\x53\x0f\x93\x81\x3e\x5f\xb1\x0e\x9c\xb8\x33\x8a\x7f\x93\x80\x04\x91\x00\x6f\x44\x63\xe8\x9f\x0e\xd4\x53\x0e\x5f\x12\xdf\x67\x4f\x59\x89\x04\x78\x0a\xd0\x81\x2b\x1e\x35\x21\xfc\xd0\xf8\x3e"}, +{{0x5f,0x1f,0x27,0x18,0x44,0xd9,0xed,0x5a,0x6a,0x6f,0x20,0x9a,0x21,0x40,0x8d,0xae,0xa4,0x70,0xf6,0xfd,0x53,0xba,0x64,0x79,0xd7,0x40,0x71,0x05,0xb7,0xde,0x4d,0x65,},{0x60,0x85,0xd7,0xfb,0x5a,0x9b,0x2e,0xd8,0x06,0xc1,0xfd,0x30,0xa2,0xaf,0xde,0x76,0x09,0x61,0xf7,0xa3,0x6b,0x48,0xf4,0x87,0x52,0x46,0xe6,0x15,0xa2,0xbd,0x99,0x28,},{0x31,0x9b,0xb4,0xde,0xb2,0x17,0x81,0x12,0x24,0x1b,0x3f,0xb8,0xf4,0x6e,0x10,0x5c,0x3b,0x8e,0x4e,0xf7,0x21,0xeb,0x20,0x0d,0x76,0x2e,0xf3,0x63,0xe2,0x71,0x6f,0x2a,0x89,0xf8,0x0b,0x5b,0x9e,0x89,0x97,0x08,0x90,0xa0,0x98,0x92,0xad,0x6a,0x58,0x80,0x8b,0x47,0x7e,0x94,0x3b,0x3c,0xfa,0x77,0x77,0x4a,0x36,0x45,0xbc,0x74,0x5f,0x03,},"\xee\xd6\xb4\x47\x5d\xc2\x63\xbd\x22\x07\xfe\x9d\x41\xd4\x82\x82\xb7\x13\xf6\x80\xf2\xe0\x37\x38\x4f\x18\xb4\xbf\x22\x43\x47\xf5\xe4\xc4\xb0\x60\xb8\x08\xd4\x12\xea\xab\xcf\x73\x3d\xc3\x9a\x40\xc6\xbd\xa0\x50\x5c\xe7\x1f\xa8\x23\xbd\x1b\x17\x94\x84\x76\x78\xdc\x03\x4e\x79\x99\xc1\x63\x69\x34\x0b\xc6\x0c\x64\xd0\x9b\xb9\x18\x7b\x2e\x32\x60\x55\xa0\x53\xf8\xe5\x05\xea\x41\x96\x86\x14\x71\x62\x2d\xb0\xe4\x6f\x0f\x89\x54\xd8\xa1\xf0\x73\x32\xda\x4d\x8a\xc5\x57\x12\x62\x60\x09\x91\x2f\x8a\x15\xa9\xcd\x63\xa7\x4a\x03\xc9\x2f\x24\x6c\xb6\x3c\xc7\x3f\x92\xe5\x1d\xad\x1b\xc9\x71\x5b\x1e\xd3\xfe\x5f\x2e\x1b\x29\x59\xb9\xb7\x1e\x0e\x37\x36\x0e\xb2\x95\x36\xcf\x79\x71\x47\xfa\xb1\x08\x64\xd6\x14\x6c\x36\xb8\x23\x35\xa0\xce\x93\x14\x08\x47\x9c\x7e\xde\x48\x4f\xf7\x3e\x2d\xbf\xff\xc6\xc9\x22\x7e\x16\xd7\xa2\x3f\x4d\x90\xf1\x55\x84\x51\x4c\x39\x59\x4e\x17\xbf\xbb\x29\x5d\xe9\xd6\x2a\xda\xdb\x58\x9d\xbb\xe0\xb0\x6d\xc8\xda\xc5\xb3\xbf\x51\x7b\x24\xc1\x83\x7b\x39\x47\x2a\x6d\xd3\x89\x31\xff\xbb\xff\x5b\x76\x36\x38\x80\x5b\x4e\x22\x32\x1f\x7a\xfe\x92\xcd\xf5\x02\xfb\x63\xd1\x09\xdd\xcd\x9e\x40\x51\xad\x6f\x45\x59\x85\x32\xbe\x17\x95\x23\x71\x08\x51\xd3\x93\x1e\x88\x7d\x02\xc3\x45\xc7\x9c\x48\x9f\xc1\x06\xa4\xae\x16\x2f\x7d\xf7\x1a\xb9\x0b\x75\x1d\xa7\x03\x8a\x6d\xf7\x61\x6c\xfc\x11\x88\x7e\x21\x06\x8f\xb9\xe3\x3b\xe5\x66\x40\x2b\xe5\x04\xf3\xfc\x27\x42\xb8\x81\x50\x9b\xd4\xfe\x6a\x0f\xc7\x22\x64\x98\x83\xf8\xcb\x65\x55\x98\xa1\x5a\x1d\x4c\x22\x9d\xd8\x6b\x5c\xae\xb7\x11\xa0\x28\xde\xfd\x43\x11\x54\xbb\xa4\x6b\x48\x17\x2a\x4d\x8c\xbd\x45\xbc\x90\xaa\xf8\x74\xb6\x08\x5f\xa2\x84\xf5\xfe\xd6\x55\xad\x6f\xa1\x7d\x67\xb3\xb9\xa7\x96\xfa\x3e"}, +{{0x04,0x8a,0xc9,0xec,0x3e,0xcb,0x30,0xa3,0xb1,0xbf,0xda,0x9b,0x3b,0x79,0xa4,0x8c,0x07,0x93,0xb4,0x90,0x87,0x9e,0x3c,0x8a,0x5e,0x23,0xee,0x2b,0xab,0xcd,0x9b,0x7c,},{0x94,0x6c,0x18,0x6f,0xea,0xfc,0x35,0x80,0xa5,0x8d,0xdd,0x52,0x6f,0xf2,0x29,0xc0,0x47,0x20,0x25,0x0f,0x4c,0xf6,0xbd,0xe0,0x27,0x1e,0xef,0x9b,0x12,0xb1,0xc3,0xf3,},{0x2e,0xcf,0x5b,0x8a,0x59,0xa8,0xe2,0x7d,0x25,0x89,0x0a,0x2a,0xa3,0x2f,0x4a,0x06,0x73,0x27,0x5d,0x53,0x9b,0x17,0x4a,0xfa,0x7b,0x2c,0xeb,0xf2,0xe7,0x62,0x80,0xdf,0xfc,0x33,0x8e,0xde,0x85,0xac,0x8f,0x61,0x40,0x39,0x56,0x0e,0x28,0x06,0xd9,0xe1,0xe3,0xcf,0x9c,0xce,0x2c,0xeb,0x78,0x74,0xff,0xe1,0xa7,0xe8,0x0c,0xde,0xf4,0x0b,},"\xd6\x8b\xe8\xef\x7b\x4c\x7a\x42\x89\xf2\xb1\x8b\x16\xad\xe9\x7f\x4e\x4f\xa1\x64\x52\x97\x6a\xfb\x58\x16\x93\x38\x0c\xc5\x4d\xe3\x8a\x07\x58\x7f\x32\xe2\xd4\x54\x9f\x26\x59\x5f\xee\x23\x93\xbd\x06\x2e\x9b\x00\xba\xe7\x24\x98\xe4\x14\x8c\x8b\x88\x2a\x88\x40\xe1\x5b\x58\x5c\x82\xb5\xc0\xde\xfb\x23\x35\x18\x40\x99\x16\x61\x5d\xeb\x3a\x55\xa5\xf8\x4e\x6b\x3a\xab\x93\x84\x4d\xe3\xb1\xe4\xd8\x6e\x09\xf8\x89\xac\x71\xc3\x24\xeb\x12\xd0\xfb\xd8\x61\xcc\x31\x22\x95\x40\xe8\x43\xa3\x4f\x8d\x5b\xe4\x7c\x0e\xc0\xd2\x3d\xf4\x3e\x06\x81\x3f\xca\x30\x94\x39\x90\x4c\x16\x7d\x10\x43\xc0\xdc\xd4\x44\xb0\x04\xbe\x1f\xf2\x7b\x78\x62\xb0\x0e\xba\x94\x33\xb9\x4b\x0f\xcd\xc6\x75\x21\xda\x0c\x1d\x53\x58\x63\x6c\x78\xf5\x30\x43\x11\x64\xdd\xe2\x0a\x1c\xf1\x64\xf5\x1e\x29\xb8\xe6\x3e\xac\xde\xcc\x86\x9b\x41\x39\x2c\x66\x76\x64\xd9\x16\x80\xd9\xac\x51\x6a\xf5\x48\xf0\x9e\x60\x56\x4e\x81\x4e\x36\xe0\xb5\x63\xdb\xae\x55\xc6\x27\xff\xc1\x41\x58\xa5\x6d\x8e\xb3\x60\x9e\x17\x43\x81\xb2\x1d\xe4\xba\x82\x34\x44\x66\xdd\x57\x7f\x4d\x11\x03\xc4\x3c\x27\xfb\x83\xcb\x83\x3d\x87\xaf\xdf\x74\x12\xb4\x09\x09\x09\xb1\xdd\xe2\x64\xda\xdd\xce\x96\x7f\x49\x6b\xf6\xf1\x71\x12\xbf\x35\x1e\x41\x7d\xb5\x95\x3b\x13\xb8\xf0\xfc\xcc\xbf\x30\xf5\xbc\xf3\x76\x86\x1c\x12\xef\x20\xee\xc8\x9e\xd2\x3c\xf3\x84\xee\x78\xdc\x6e\xb4\x0f\xd5\x81\x1a\x7b\x23\x92\x7c\x13\xe7\xdc\x5d\xa3\xa9\x21\xb8\x83\xa9\xb2\xb1\x15\x59\x70\xfb\x0d\xa7\xd2\x99\x3d\xcd\xfd\x43\x43\x64\x2a\x9d\x5a\x63\x47\xe4\x3c\x19\x3b\x57\x93\xe4\x45\x3a\xc1\x53\x7a\xa3\xd0\x4d\xc9\xf7\x74\xe8\x40\x93\x48\x81\xd7\x8a\x39\xba\x25\x04\x38\xc5\x07\x25\x0e\xed\x2f\x6e\x07\xcc\x95\x3f\x78\x3d\x6b\x72\xb1\xcc\x61\x99\x81"}, +{{0x2f,0x05,0x7d,0x20,0xb1,0x67,0x85,0x31,0x61,0x1f,0x48,0xf0,0x03,0xb7,0xd2,0x2e,0xba,0x5d,0xbb,0xd7,0xe2,0xdd,0x41,0xb7,0xc7,0x9d,0x09,0x07,0x1f,0x85,0xe9,0x93,},{0x62,0x0f,0xc4,0xea,0xa3,0x4d,0x78,0x7d,0xf6,0x75,0xcc,0xbf,0x7e,0x89,0x32,0x04,0x82,0x8d,0xb9,0x2e,0xad,0x17,0xa1,0x16,0x5a,0xc7,0xfa,0x1a,0xb4,0x27,0x19,0xd8,},{0x30,0xdf,0x7b,0x0b,0x1c,0x04,0xfb,0x1e,0xfa,0x35,0x17,0xe9,0x28,0xd6,0xd5,0x7c,0x2c,0xa0,0xd0,0x7f,0x4e,0x04,0xff,0xb1,0xf0,0x8b,0x47,0x92,0xc5,0x93,0x7d,0xd2,0x71,0xcc,0xab,0xdc,0x00,0xdc,0xe8,0x50,0xaf,0xe5,0x0a,0xf5,0x99,0x0f,0x22,0x4e,0x84,0x20,0xa6,0x81,0xd9,0x5f,0x9f,0x7f,0x51,0x5a,0xfe,0xc1,0x02,0xef,0xd1,0x0e,},"\x6e\x35\xf6\xea\xa2\xbf\xee\x06\xea\x6f\x2b\x2f\x7a\xb1\x5f\xa9\x7c\x51\x80\x95\x8a\xf2\xe9\x0a\xf9\x18\xad\xfb\x3d\xb8\x32\x3f\x44\x7c\x7b\xf2\x6d\xc5\x34\x99\x7c\x38\xb7\xfc\x97\x7f\x64\x2d\xe2\x88\xcd\xf2\x53\x07\x1c\xac\xf3\x56\x4e\x3b\x8e\xd6\xdc\xe5\x7d\xdf\xba\x9f\xf7\x83\xba\xd2\xe7\x6d\xf1\x24\x82\x8f\xc1\x03\x1a\xcf\xad\xf0\x1a\x44\xd4\x1b\x42\x16\x1a\xd9\x06\x03\x01\xc1\xaf\x19\x28\xb9\xe5\xb7\x3b\x9b\xd2\x1c\xac\x60\xa8\x42\xb5\x04\xdc\x3c\xc3\x11\xc5\x22\xe3\xbb\x04\x8b\xf2\x21\x44\x4f\x53\xce\xb0\x8e\x77\xe9\x48\x59\x0e\x94\xed\x98\xf1\xb6\x04\xcb\x9e\xad\xc9\x3b\xbe\x74\x31\xc1\x14\x9b\x23\x19\x3f\xf9\x3e\x85\x69\xf1\x13\xe1\x68\x4d\x89\x76\xec\xae\x6f\x09\xe0\x10\x36\x14\xbe\x41\x8a\x47\x2e\xf5\x5b\xb8\x89\x0d\x72\xb3\x41\xcd\xd7\x50\x5b\x50\xa4\x55\x22\xab\x63\xed\x79\x1c\xe8\xf8\x2f\xed\xdd\x7a\x62\x0a\x4f\x6f\xb1\xd2\xfb\x0e\xd0\xc4\x56\x0d\x78\x44\x6d\x83\xb3\xd1\xb1\xbb\x56\xb3\x66\xd1\x96\x02\x0d\x06\x24\xb1\xfb\xdb\x75\xce\x73\x5d\xd4\x3e\x8e\x8d\xf1\x63\xc4\x4e\x23\x69\x93\xdc\xa3\x41\xf5\x13\x2d\x82\x5d\x0a\x4e\x39\x3a\x19\xd3\x8f\x61\xe1\x1e\x0c\xf3\x92\xcb\x9b\x64\x6e\xa2\x3c\x58\x09\x98\x24\xdd\x8d\x9f\xbe\x26\xa4\x9e\x33\xb2\x3d\xf8\x06\x07\xab\xf1\x97\x15\x79\x9c\x19\xac\xc7\x22\xed\x9b\xcf\x94\xa0\xc2\x9a\xd2\x4b\x78\xb0\xb0\x35\xb3\x24\x1c\x64\xcd\x86\xed\xea\xc8\x10\xe6\x67\x45\x69\x4b\x5e\xb1\x62\x50\x60\xed\xf2\xd9\x49\xde\x0d\x34\xf5\x22\xdf\x2d\xc6\x0a\xe6\x94\xa1\x93\xf3\xb8\x2c\x1d\x6f\x83\xa0\xcb\xb8\x40\xf4\x6c\x49\xa3\xd7\xd1\xcf\x06\xde\xaf\x96\xc6\x4f\x8f\x9e\x17\xbd\x9a\xd5\x12\xae\x63\x09\xc4\x86\xd9\xe2\xa7\x8d\xce\xec\xa4\x73\xa0\x42\x1d\xd1\xb6\x43\xc7\x87\x54\x27\x1b\x53\xce"}, +{{0x3a,0x3d,0x27,0x97,0x0f,0xe2,0xac,0xb6,0x95,0x1e,0xdd,0x5c,0xa9,0x0d,0xda,0x0f,0xc6,0xdd,0x22,0x9c,0x0a,0x56,0xdf,0x6e,0xb1,0x1a,0x9c,0x54,0xd2,0x42,0xdb,0xbf,},{0x56,0x4f,0x0d,0xc3,0xdc,0x47,0x20,0xe6,0x8e,0x44,0xdd,0x16,0x71,0x1e,0x04,0x9e,0x61,0x12,0x00,0x00,0x98,0xfa,0x62,0xa1,0xb9,0x8c,0x28,0x80,0x42,0xf7,0xc3,0xbd,},{0x22,0xeb,0x8e,0xa0,0x50,0x73,0x49,0xb6,0xa0,0xac,0xe2,0x5c,0xf9,0x18,0x0c,0xb0,0x8e,0x03,0x57,0xb0,0x45,0x02,0x90,0x5f,0xbe,0x69,0xb4,0xe2,0x1b,0x2b,0xd9,0x4e,0x22,0xcf,0xbd,0xb8,0x51,0xae,0x71,0x6a,0x5c,0x25,0x3c,0x70,0xd5,0xe2,0xb2,0x4e,0xa7,0x8f,0x35,0xbc,0x21,0x32,0x92,0x54,0x3d,0x94,0xe1,0x41,0x10,0xb2,0x41,0x06,},"\x43\x74\xf6\x1c\x2c\xd8\x8a\x3b\x89\x72\x24\x9b\xfa\x79\xb3\x6a\xb6\x9e\x3e\xd4\x84\xcc\x60\xe5\xd9\x54\x1f\xa7\x68\x6c\xf4\xee\xd1\x21\x0c\x5d\x0d\xcf\x42\xdd\x25\x97\x25\x01\x90\x91\x93\xca\x76\xae\x6e\xb7\xf4\x71\xd8\xbd\x0d\x5f\xb5\xa6\xb4\x31\xbc\x3d\xe0\xe0\x31\x8d\x50\x51\x45\x24\xde\x87\xc4\xb8\x30\x05\xdf\xb4\x12\x45\xfb\x1a\xf7\x9b\x84\xa9\x7b\x83\xd3\xca\xc7\xad\x7a\x53\x36\x4e\x2e\x9b\x21\xc9\x7b\x76\x9b\xdc\x57\xf0\x70\x31\x16\x16\x83\x80\xf3\xcc\x88\x36\x89\xeb\x4a\x7f\xa3\xb2\x6d\xbe\x12\xbc\x28\xf8\xc4\x03\x81\xaf\x64\xdf\x4b\x53\x61\xd1\x74\xcf\x75\xac\xbd\x46\x42\x87\x40\xb0\xd1\x32\x2d\x32\xbb\xe9\x48\x45\x21\x59\x66\xae\x58\x87\x77\xa8\xc0\x53\x36\xe3\x52\x30\x6d\x49\x27\x8d\x32\x8e\x49\x6d\xb6\x5e\x9e\xcf\x6c\xe6\x40\x5e\xd1\xc8\x93\x49\x0b\xc4\x8c\x13\xa1\x34\xe1\xfb\x6e\x80\xde\xbe\x6d\x32\xfc\xe6\xef\x74\x78\x3c\x8d\x77\x98\x0a\x44\x1a\x26\xae\xb4\xfd\x83\xcc\x85\x53\x52\xce\xdc\x18\x8f\x52\x79\xce\x21\x1f\x74\x4a\x40\xb2\x3c\xe7\xff\x24\x43\x7a\x1d\xd3\x37\x3e\xc5\xb2\x90\xda\x1f\x94\xf4\x3a\x07\xa3\xff\xea\x5b\x5f\x67\xb5\x2c\x19\x61\x85\xbc\xe9\xe9\xa8\x58\x25\x7f\xcd\x7a\x8e\xba\xf9\x04\x0e\xd0\x91\xfa\xce\x5a\x15\x5a\xa4\x47\xfa\x15\xe1\x21\x22\xd2\x5e\x8f\xc3\x6e\xae\xe2\x13\x7c\x7b\x3a\xa3\x0b\x7e\x3f\xf6\xcc\x86\xb6\xdc\xb9\xea\xf4\x9c\x95\x76\xf0\xf4\x62\x00\x84\x39\xcb\x1a\x3a\xba\x01\x3e\x89\x7a\x0f\xaf\x99\x4c\xb7\xd5\x9e\xde\x57\x74\xbb\x14\x47\x74\xf7\x3c\xa3\x0e\x64\x14\xa7\xcc\x7c\x74\xb2\x0c\x51\xa1\x40\x4d\xdc\x41\x9e\xf7\x62\x45\x93\xe9\xbc\xfb\x37\xc0\xa7\x62\xea\xb6\x8f\xac\xa5\x86\x34\x43\xe1\x6e\xdb\x75\x9d\xbc\x87\x88\x73\x2b\x9e\x4f\x59\xc1\x11\x92\xc3\xfc\xc8\x72\xaf\x55\xf3\x2d"}, +{{0x06,0xd4,0x98,0x31,0x8d,0xa4,0x56,0x24,0x2b,0x9c,0x3b,0x9a,0xb6,0xd5,0x32,0xa1,0x28,0xfc,0xe0,0x44,0xf5,0x38,0x82,0x68,0x2e,0x92,0x62,0x14,0x9c,0x16,0x52,0x88,},{0x41,0x35,0x17,0xaa,0x63,0x20,0x0a,0x17,0x17,0x32,0x09,0xa4,0xb3,0xe7,0x8a,0xb9,0x38,0x3c,0xb4,0xe3,0x9e,0xfd,0x67,0x94,0xc4,0x6a,0x2d,0x13,0xfa,0xfa,0x99,0xc0,},{0x82,0x50,0xf7,0x6d,0xc5,0x99,0xc5,0x12,0x87,0x87,0xe4,0xf6,0xd3,0xda,0x23,0x17,0x33,0x30,0xce,0x33,0x20,0xdb,0xa9,0x59,0xbd,0x71,0x4c,0xc8,0xcc,0x07,0xc6,0x79,0x45,0xd6,0x3e,0x75,0x66,0x2c,0x07,0x5e,0x26,0x74,0x60,0xab,0x7b,0xf5,0x61,0xf2,0x4f,0xaa,0xe3,0xb4,0x1d,0xbf,0x67,0x68,0x99,0x19,0x1e,0x3b,0x02,0xb5,0xaf,0x0a,},"\x3f\xe3\x0e\xcd\x55\x07\x7a\x6e\x50\xdf\x54\xbb\x1b\xf1\x24\x8b\xea\x40\x63\xe3\xfa\x75\x5f\x65\xfc\xd1\x15\x9e\xe0\x46\xef\xd0\xeb\x5f\x2f\xbb\x38\xb5\xc0\x09\x47\xc9\x7d\xc8\x79\xb3\x6b\x9e\x53\x61\x92\x28\x60\x86\xd0\xdc\x12\x05\x36\x10\x38\x61\x74\xa7\xc5\x6f\x22\xa8\x5b\x73\xff\x20\x8c\x59\x44\xf3\x93\x23\x6c\x32\x41\x58\x09\xda\x03\x6e\x73\xca\xd8\xfc\x3c\x30\x37\x80\x64\xa7\x6a\xfa\x93\x0a\x3b\xaa\xe9\xaa\x35\x70\x61\xa8\xc5\xe8\xe7\x56\xa9\xce\xcf\x94\xb7\x2d\xf4\x3f\xac\xd8\x8f\xa4\x9c\xb4\x94\x8c\x63\x68\x31\x8a\x6b\x1e\x5c\xff\x52\xe5\x87\xec\xdf\xae\xfd\xb6\x90\x81\xf2\x8c\x2d\x13\xbf\x8e\xab\x81\xdb\xaa\x5e\x37\x28\xc4\x31\x7f\xb7\x93\xdd\x19\x6b\xca\x0f\xe5\x4a\x6c\x24\x2c\xf2\x6e\x2d\x12\x9b\xa0\xd8\x2a\x2c\x3a\x45\xbc\x8d\x1d\xfd\x6f\x54\xf8\xda\x4f\x51\x89\xc9\x1a\xc2\x14\xfd\xab\xf4\xc5\x97\x38\x1b\x2e\x5c\x40\xcc\x71\xfa\x70\x51\xcf\x2e\xa9\x39\x06\xa3\x7d\x57\xdf\x12\xd5\xc7\xe5\xcd\x77\xc9\x07\xe4\x42\x56\x63\x15\xba\xe5\x1a\x22\x22\xd6\x2e\x3f\x42\xd1\x76\x78\x82\x63\x7d\x66\xa1\xd5\x30\x5a\xb4\x01\x0a\x0e\x49\xc5\x7d\xef\x69\xdc\xea\x83\x9e\x1b\x76\xa4\x11\x35\xba\x95\x2c\xc4\x24\x95\x0e\x8d\x3a\xac\x19\xe1\xd9\x3d\xe7\x75\x7c\x15\xff\x99\x97\xb3\xd2\xa8\x61\x3c\xd9\xa1\x64\x78\x1d\x1b\xe3\x31\x79\x9f\xa6\x10\x9c\xef\x61\x43\x05\xa1\x95\x8f\x62\x90\x3c\x8c\x9e\xa0\xb2\x3b\xa7\x06\xd4\x9c\x54\xba\xcc\xc1\xe6\x3c\xb4\xbf\x14\x78\x5f\xc7\xb0\x62\xa9\x80\x03\x49\xbd\xb0\xbb\x92\x72\x60\xb6\x77\xb6\x0f\x10\xe6\x2c\x87\x80\xf3\xeb\xb5\xeb\x6f\xf0\x36\x02\x63\xd4\x57\xab\x52\xfd\x11\x25\xc9\xce\x04\x6a\x95\xd8\x9d\x28\x73\x50\xc8\x04\xcf\xd4\xff\x2b\x2d\xdd\x18\xa9\xe1\x35\x19\xf2\x0b\x4d\x1e\x05\x1a\xf6\x24\x64\x0f"}, +{{0x8e,0x8e,0x1d,0xb5,0xb1,0x10,0x2e,0x22,0xa9,0x5c,0x47,0xaf,0x36,0x61,0x46,0x9f,0x00,0x0a,0x33,0xf1,0x3b,0x8b,0x87,0xb1,0x15,0xd2,0x45,0x2a,0x41,0x1f,0x6f,0x39,},{0x56,0xd7,0xb3,0x16,0x9a,0x95,0xc2,0x29,0x98,0xec,0x93,0x79,0x25,0xbd,0x7c,0xad,0x13,0xcc,0x65,0x80,0x8c,0xd5,0xd3,0x4a,0x6c,0x4d,0xa8,0x70,0xea,0xf3,0x23,0x64,},{0xf6,0xee,0x5e,0x13,0xcf,0xaa,0x36,0x2c,0x89,0x71,0xd5,0xa4,0xa8,0x79,0xa7,0xe3,0x69,0x66,0x52,0x5c,0xcd,0x86,0xc5,0xa4,0x8c,0xba,0x08,0xd9,0x13,0xec,0xe1,0xa7,0x9c,0x4c,0xd1,0x46,0xb8,0xe9,0xc6,0x51,0x25,0xfb,0xad,0xf1,0x7b,0xac,0x1c,0xab,0xcd,0xe8,0xfd,0x17,0xcf,0xd6,0x8f,0xa1,0xf9,0xc4,0x4e,0xa6,0x1c,0x08,0xa4,0x05,},"\xb2\x46\x34\xfb\xdd\x1b\x76\x61\x31\x5d\x9d\xc1\x53\xba\x90\xd6\x6a\x88\x62\x2a\x41\x58\xf8\xbc\xff\x25\xba\x9c\x29\xe6\x5f\x29\x7f\x8e\x60\x31\x18\x00\xb7\x33\x1b\x69\xfc\x20\xc9\xf8\x5b\xb7\xc1\x84\xbd\x40\x86\xb3\xa9\xf9\xa2\x71\x02\xb6\x23\x62\xbd\xb4\xfa\x5b\x20\x15\x94\x25\x0f\xc6\x28\xfd\x2e\x0e\x0d\x1b\xe0\x3d\xcf\x81\x8c\x60\x94\xc4\xc2\x91\x21\xcb\x2b\xf6\xd9\x08\xed\x8a\xab\x42\x7c\x37\x71\xc0\xc9\x5f\x0a\xc1\x46\x9a\x08\x10\xb6\x03\xa4\x70\x28\x2e\x59\x80\xa6\x07\x29\x19\x7f\xe6\xc2\x0e\xf6\x81\xcd\x1b\x96\x93\x2d\x20\x58\xf8\x96\xea\x74\x16\x42\x2a\x7e\x54\x1f\x22\x4a\x5f\x04\x25\x30\x80\x74\x1c\x5d\x4e\x3e\xb0\x39\xdb\x6b\xa0\x51\xb4\xca\x54\x17\xce\x8a\xfd\xc7\x02\x14\xba\x4d\xcc\x85\xb6\x23\xd1\x1e\x68\x1c\x60\x09\xae\xe4\xe6\x13\x0a\x83\xed\xd0\xd2\xc9\x9f\xb0\x64\x7e\x11\xed\xe7\x30\x1a\xe5\x6b\x59\x90\x4e\xf7\x02\x57\x32\xcd\xe0\x38\x80\x1e\xc7\xe8\xd9\x0a\x9a\x1b\xba\x04\x7f\xe6\x28\x35\x1b\x3b\x89\xd0\xbc\x5a\xe6\x65\xa7\x00\x89\x1f\x09\xeb\xee\xc0\x55\x91\x84\x2a\xdf\xcc\x25\xad\xc3\xc7\x1c\x1e\xbc\x4a\x31\x2e\x54\x71\xbe\x67\x25\x3b\x0e\x94\x28\xb0\xca\xe3\x76\x45\xa0\xf7\xec\xb8\x9d\xd7\x9f\xbd\x9b\xe2\x87\x54\x33\x66\x7a\xe0\x7d\x74\xa7\x98\x3c\x4c\xea\x60\x1e\x72\xe9\x75\xc2\x1d\xf9\x93\xe7\xfa\x22\xa9\xfa\xbd\x45\x45\x5d\x45\xe3\x70\x31\x55\x8e\x13\xa7\xa4\xf5\xf4\x97\xea\x78\xfb\x73\x99\xf8\x83\x8c\x0f\xd5\xde\x4e\xbb\x66\xdb\x29\x0f\x43\xa4\x86\x7d\x50\x53\x09\xf1\xc1\xbc\x27\xe9\xfa\xbc\xbb\xa7\x13\x02\xfc\x12\x04\x71\x5c\xe3\xfc\xb0\x90\x5b\xfa\x41\x1c\x9d\x1c\x9a\xb4\xa3\x99\x54\xe5\x0b\x8e\x0c\xf7\x36\xc1\x02\x89\x56\x3b\xdf\xa9\x67\x55\x3c\x36\xcd\x9e\x55\x5b\xc8\xcc\x56\xbe\x59\x48\x47\xde\x9f\x26\xf9"}, +{{0x38,0x84,0xb8,0xb7,0x9a,0xbf,0xd3,0xbe,0x6c,0x13,0x98,0x5e,0xb8,0x59,0xab,0x74,0x3f,0x15,0x7c,0xd9,0xde,0xb8,0x1b,0x2f,0xe9,0x7e,0xa4,0xd6,0x17,0x3e,0x46,0xf5,},{0xbd,0x7f,0xd9,0xa8,0xde,0xf1,0x3a,0x54,0x2e,0xd2,0xf2,0xfb,0x04,0x88,0x86,0x88,0x5b,0xa9,0xb5,0xce,0x59,0xcb,0x70,0x19,0xfb,0x54,0x66,0x79,0x86,0xee,0xbc,0x26,},{0xf4,0x20,0x6f,0xcd,0x34,0x50,0x24,0x41,0xd5,0x4a,0x73,0x32,0x3f,0x33,0xa5,0xdb,0xb4,0xc9,0x85,0x57,0x31,0x9f,0x21,0x24,0x6f,0x26,0x0f,0xfb,0xbe,0x58,0x44,0x88,0x6d,0xb5,0x67,0xf4,0xb6,0x3c,0x47,0x94,0x3d,0xbb,0x78,0xfc,0x35,0x65,0x7d,0x7c,0x04,0xd4,0xfe,0xb0,0x42,0xff,0x85,0x36,0xf6,0x72,0x92,0x5c,0x31,0x9e,0xfb,0x09,},"\x12\xad\xaf\xe3\x0e\xaf\x2b\x9c\x72\x03\xca\x5d\x44\xb9\x7f\xfe\xd4\xbf\x65\x17\xa4\x99\x88\xe4\xe6\x76\xc8\xe3\x14\xad\xbd\xbe\x23\xd8\xf2\xd3\xe2\xb0\x81\xa7\x02\x4f\xa5\x25\xab\x5a\xae\x26\xe6\x00\x57\xc1\x01\xe8\xf3\x68\xd3\xad\xdb\x93\x76\xc4\x68\x2c\x1f\x42\x24\xd7\xf1\x49\xa8\x47\x4b\xb9\xa8\xf6\x63\xef\x21\x0e\x95\x72\xce\x82\x9d\xa3\x88\xd8\xaa\xe7\x2a\x46\x71\x41\xad\xc1\x53\x47\x3b\xe3\x65\x3b\xaa\xa6\x4b\x5b\x1e\x2e\x30\x68\x3f\x6f\x06\xda\xc2\x78\x4d\x5b\xbf\x0d\x08\x2a\xab\x47\x30\x5e\xd8\xa8\xef\xd0\x88\x6c\xe6\x3a\x17\x93\x15\x22\x5d\x1e\x4d\x4f\xfc\xf1\xf2\x4a\xc2\xf4\x64\xcf\x5e\xd3\xa8\xb6\xd3\x99\x84\x54\xf1\xc0\x2c\xdb\xf0\xa4\x44\xee\x2b\x59\xdd\xbe\x0a\x17\x4a\x0d\x93\x7f\xa6\x28\x65\x08\x8a\xc6\x47\x49\x99\x57\xd2\x81\xc6\x94\x98\x03\xa5\xfb\xdf\xdd\x0d\xd9\xe9\x1b\x69\x76\x86\x1f\x3c\x5f\x21\x26\xf3\x9a\xac\x93\x5b\xe0\x9f\x4b\x97\x15\xbd\x4f\x0d\x5c\x55\xdf\x73\xa6\xb9\xf2\xc0\xad\x26\xce\x49\xd8\x22\xbf\x85\xbf\xa2\x34\x6f\x31\x65\xb0\x38\x59\xa7\x1c\x3d\x2a\x7b\x86\xdb\x6e\x9f\x2e\x5d\x7b\x16\x9a\x91\x0e\xeb\x7e\xf3\x8f\xbd\xfb\xbe\xc4\x3a\x9a\x25\xf0\x4b\xc3\xac\xfd\x3b\x06\x91\x54\x2a\xb6\xde\x9d\xb6\xf0\x30\x58\xf9\x58\x40\x24\xf9\x91\x8e\xde\xcd\x90\xfb\xb8\x57\x35\xd6\xdc\xec\x5b\xd5\x93\xae\x63\xe2\xcc\x96\x55\x35\x99\xa3\x10\xf8\xf2\x00\x9b\xa9\x53\x71\x19\x6b\x4d\x5b\x80\xe7\x55\x96\x37\xf2\x29\x26\x77\x8b\xe5\xe1\xcc\xef\x51\x26\xe2\x44\x3f\xa9\x39\xc2\xa5\x3d\xdd\xb0\x49\x61\xee\xfd\x34\xe5\x38\xcd\x8d\x7f\x0b\xec\x2b\xff\x1e\xf0\xd3\xa4\xbd\xd3\x58\x31\x76\x37\xf4\x2d\x59\x55\x38\xc1\x12\x22\x51\xa9\x4e\x96\x3d\x1f\x81\xe7\xb9\xae\xb1\x64\xf9\x5d\xa9\xa4\xed\x75\x29\xb8\x45\xeb\xc9\x61\xb2\x7b\x5c\x19"}, +{{0xec,0xd5,0x19,0xf2,0x87,0xad,0x39,0x50,0x52,0xb0,0xb3,0x0d,0xea,0xc3,0x41,0xd2,0xa9,0xdf,0x13,0xd6,0x56,0x7c,0x89,0x1c,0x81,0x3a,0x0c,0x9c,0xa5,0x2e,0x87,0x1e,},{0x8e,0xe9,0x4c,0x58,0x8e,0x0b,0x34,0x35,0x85,0xfc,0x67,0x48,0xfd,0x1b,0x54,0xb5,0x77,0x0c,0x64,0xe9,0x93,0x7a,0x56,0x35,0x7a,0x48,0xd4,0x4a,0xe2,0xf5,0x18,0x24,},{0xe8,0xf5,0x1b,0xe7,0x3f,0xc4,0xe0,0x23,0x5a,0xa1,0x53,0xa2,0xe1,0xb3,0x54,0xe9,0xc5,0xd2,0xd3,0x3a,0x11,0xae,0x0e,0x33,0x34,0x78,0xde,0x1d,0x8e,0x6c,0x44,0x56,0xd2,0xe2,0x50,0x82,0x4c,0x32,0x46,0xca,0x0e,0x8d,0x6a,0xe3,0xe1,0x66,0x77,0xa9,0x73,0x44,0x14,0x41,0x08,0xc1,0x3b,0x95,0x9e,0x1d,0xaf,0x51,0xcf,0x0f,0xe5,0x01,},"\xaa\x71\xbe\x5f\x55\x7e\x10\xc9\xfb\x5f\x09\x1a\x3a\x27\x44\x53\x94\x7c\x07\xa0\xe2\x5b\x26\xf9\x50\x92\x24\x54\x1d\xff\x76\xf4\xd9\x6e\xff\xd0\xd5\xa4\x1d\x31\x9b\xc9\x32\x1a\x86\x66\x7d\x55\xcf\x49\x43\x2f\xb5\xc3\xe7\x15\x38\x8f\x3f\x10\x6c\x91\x74\xb1\x61\x0c\x8f\x30\x75\xd5\x93\x1c\x29\x00\x99\x38\x5c\xe9\x24\x9e\x23\x51\x28\xe9\x07\xc5\x33\x90\x03\x6f\xbf\x5d\xa9\x68\xf8\xd0\x12\x33\x69\x58\xde\x90\xc5\xe8\xe6\xb1\x01\x6a\xd4\x3f\xb5\x7c\x8e\x28\x8d\xaf\xe1\x4e\x90\xe6\x4b\x63\x79\x1e\x5c\xbe\x55\x7e\x02\xdf\x8a\xc9\x37\x06\x42\xa7\x1f\xaf\x85\x10\x75\xe5\x56\x5f\x6f\x9a\x26\x7f\x4f\x6b\x45\x4c\xe4\xc5\x47\x48\x10\xb8\x04\x84\x4d\xda\x38\x39\x29\x39\x71\x97\x93\x24\x6a\xa4\x74\x54\xb9\xb0\xe8\x2e\x98\x03\xc0\x99\x35\xd0\x02\x7f\x39\x95\xcc\xa9\x71\x30\x69\xbb\x31\x02\x7f\x7b\x2a\xf1\x2f\xe5\xfe\xec\x7e\xeb\x06\x84\x3d\x82\x96\xec\x56\x82\x26\x2a\x07\xda\xe7\x47\xed\x7b\xc8\x21\xec\x17\x01\x8d\x89\x9f\xd1\x67\xb3\x6a\x7e\x37\x73\xb4\x27\x49\x9d\x99\xdc\x58\x3b\xbe\x4b\x42\x9a\xfa\x6a\x26\x59\x39\x53\xf9\x43\xe4\x67\x3b\xdd\x0d\x2a\x84\x42\x56\x13\x16\x03\xcd\x09\x03\x25\x6f\x33\x4d\x4f\x8e\xc8\x2d\xe1\x15\xb6\xca\x53\x38\xc7\x5c\x8b\xaa\x44\xb4\xba\x96\x3c\x7c\x78\x51\x0d\x8d\xe9\xb2\xa5\x85\x2f\x42\xf3\x46\x3c\x68\x5f\xb3\xa6\xda\x61\xa8\xe0\x89\x26\x62\xd6\xa2\x50\xfc\xaa\x6f\xef\x74\xd4\x50\xfc\x45\x7b\x98\x71\xd0\x8b\xb5\xbe\x30\x11\x29\x4a\xc8\x88\xfc\xe2\x15\xd5\x35\xc3\xb1\xa4\x3b\xb4\x7e\xfe\x3a\xd2\x5d\xa1\x59\x19\x1a\xed\x55\x19\x54\x69\xc5\x90\x93\xff\xb2\x4f\x65\xd6\x0c\x40\x20\xbf\xbe\x64\x7f\xf5\xdb\x7a\xb8\xa0\x1d\x5e\x48\x7b\x0b\x1b\x64\xef\x25\xda\x15\x6d\xb1\x42\xe6\xad\x87\x2a\x4d\xc1\xee\x9b\xa6\x68\x46\x52\x65\x37\x9e"}, +{{0x19,0x3f,0x3c,0x63,0x0f,0x0c,0x85,0x5b,0x52,0x9f,0x34,0xa4,0x4e,0x94,0x49,0x70,0xf4,0xa6,0x97,0x2e,0x6c,0x38,0x59,0x35,0x9c,0x2e,0x0c,0x87,0x62,0xba,0x9e,0xaf,},{0x32,0x56,0xf2,0xc8,0x2e,0x7c,0x80,0x12,0x01,0x21,0x01,0x40,0x56,0x9f,0xaf,0x18,0x50,0x7e,0x60,0x33,0x8c,0x2c,0xc4,0x11,0x8b,0xb1,0xce,0x60,0x5b,0x0e,0xbe,0x61,},{0xb1,0x25,0x10,0xac,0x5f,0x2f,0x6d,0x33,0x36,0x0c,0xdd,0xc6,0x72,0x91,0xd6,0xc2,0x70,0xfd,0x9e,0xe6,0x2d,0xc0,0x86,0xb3,0x8d,0x93,0x2d,0x26,0x47,0x3f,0xe9,0xa2,0x4e,0xfb,0xd4,0x24,0x88,0x67,0xea,0x7e,0x91,0x5a,0x30,0xc5,0xbf,0xb3,0xb8,0xb1,0x9a,0xa0,0x1a,0xa2,0xfe,0xbf,0x0d,0xac,0x6c,0xfd,0x66,0x38,0xa2,0xba,0x7e,0x0c,},"\x98\x62\x3f\x65\x16\x98\x08\x5b\xde\x02\x76\x2e\x8c\x33\x21\xf1\x4d\xa1\x61\x9b\x5c\x3f\x7c\x1a\x56\x8e\x8c\x26\xff\x0c\x62\xfd\xcc\x41\x24\x75\x91\x2e\xb8\xe8\xc4\xb0\xd3\x09\x18\xb8\xff\xee\xf3\x50\x93\x15\xe5\x8d\xa3\x59\xcd\xc2\xf2\x6b\xeb\xfb\x57\x03\x95\x3b\xe1\x6b\x8f\x3b\xeb\x1e\x54\xa1\xab\xee\x0a\xeb\xe2\x4e\x64\xdb\xe8\x73\x40\x2e\x15\x6f\x37\xdf\xc1\x68\xea\xf8\xa1\x14\xce\x08\xa6\x79\x5d\x3f\x64\xf5\x15\x1e\x9a\x8b\x82\x75\xcc\x7b\x49\xa6\xb8\xd8\xa6\x6b\x6d\x4b\x76\x32\xef\x80\x74\x0d\xc1\xc1\xb0\xa3\x8d\x1a\x28\xf7\xc1\xb2\x9f\xa4\x45\x41\xc1\xaa\xd3\x54\xd4\x59\x0c\x23\x1d\xae\x68\x7a\x2a\x8f\xed\x09\xe8\xc1\xeb\xbf\xcc\x38\xf3\x47\xbf\x06\xd9\x45\x77\xe4\x9a\xd1\x39\xf7\x10\xed\x8b\xb1\xfd\x07\x66\x3c\x03\x20\x84\x6f\xbb\x45\x5a\xb8\x37\xef\x96\x4a\xe7\xd4\xec\xee\xa4\x5f\xd7\xbd\x8d\x50\x9f\x82\x1e\x6e\xb0\x27\x49\x4e\xfd\x8d\xd8\xe9\x92\xb8\x86\x98\xee\xc2\xeb\xc5\xe0\x30\x25\xbe\x78\x9c\x18\x01\x3f\x20\x1f\x77\xaa\x2d\x34\xf5\x68\x64\x60\xe4\x3f\xb4\x89\xe0\x87\x76\xf9\x8b\xcd\xe2\xce\xeb\x9d\x4f\xaf\xdf\xfe\x03\x75\x60\x43\x71\xec\x32\xf4\x6b\x81\xfe\xc4\x74\x38\x29\x08\xe9\xd2\x50\xa0\xba\x27\x80\xa7\xd6\xdf\x40\x7b\xd2\xb1\xeb\x12\x67\x48\xd7\x25\x11\xb9\xb0\x69\xeb\x1c\xd4\x42\x70\xf2\x9f\xe8\x4b\x9a\x71\x77\x51\x83\x1d\x04\xc2\x81\x8e\x40\x8f\x22\x78\x93\x76\xc6\x1c\x2c\xa4\x5e\x32\xe7\x88\xea\xd3\xa7\x53\x6b\xf0\x9d\xa8\xaf\x47\x03\x90\x2f\x55\x16\xa0\x20\xd8\x92\x63\xe9\x37\x01\xa2\x56\x5e\xef\x12\x70\x41\x89\x25\xf3\x5a\x28\x8e\x32\x7b\xab\x62\x8a\xc2\xf0\x24\x8c\xfb\xca\x34\x82\xe2\x65\xd1\x62\x1c\xc3\x43\xc3\x1f\x65\x49\x3f\x06\x4b\xad\x0d\x76\x02\x46\x07\x15\xfa\x48\x6f\x29\x42\x63\x46\xaf\x53\xe3\x33\xb7\x5f\x59\x05"}, +{{0xa8,0x8a,0xd0,0x04,0x8d,0x38,0xc4,0x4c,0xeb,0xe7,0x35,0xea,0x38,0x02,0xca,0x57,0x6e,0x37,0x12,0x1c,0x7d,0x4d,0x76,0x0d,0xfd,0x88,0xde,0x16,0x63,0x06,0x4a,0xbb,},{0x14,0xdd,0x8b,0xb3,0x06,0x80,0x3e,0x5a,0x75,0x8e,0xd6,0x8a,0xd2,0x1d,0x07,0xd8,0x81,0x61,0xd5,0x0f,0x1c,0x74,0x71,0x37,0x77,0xda,0x12,0x09,0xaf,0xba,0xea,0x0b,},{0x13,0x41,0xa1,0x48,0xda,0x45,0x93,0xc8,0x8e,0xbc,0x5a,0x58,0x82,0x1e,0xef,0x77,0xf9,0x21,0x86,0x39,0x0f,0xf6,0x33,0xe7,0x62,0x07,0x08,0x4e,0x78,0x74,0xcc,0xf0,0xeb,0x1f,0x9e,0xc7,0x0a,0x3a,0x3f,0x96,0xb5,0x89,0x34,0xbc,0xb0,0x61,0xff,0x92,0x01,0x24,0xf7,0xe5,0x80,0xfa,0x2b,0x0b,0x27,0x95,0x83,0xad,0xf9,0x23,0x2d,0x0c,},"\x2c\xe8\xbc\xa2\x61\x78\x91\x3b\x16\x76\xe9\x0f\xfe\xfd\x94\x5b\xc5\x61\x98\x26\x60\xe2\xa7\x5d\x48\x2f\xf3\x0a\xab\xa1\xba\x43\xf8\x2d\x2e\x6b\x90\x9e\xc1\x0f\xc0\x97\x89\xff\x5c\xf3\x2a\x51\x80\xb6\x01\xea\x80\xfa\xde\xce\x6d\x7e\x7b\xae\xef\x48\x1d\xc6\x97\x9e\x2f\x65\x8a\xe0\xf6\xd8\xe4\x16\xb9\x32\x98\xf7\xd3\x40\x31\xbb\x76\xf7\x16\xed\x99\x1a\x16\xd0\x9a\x58\x2e\x58\xba\x40\x03\xac\x17\xbe\x8b\x44\x69\xe1\xa8\x89\xb2\xfb\xb2\x28\x9e\x98\xaf\x1c\x6d\x5b\xbe\xe7\x77\x56\x71\x3c\x07\x78\xb0\xdc\x44\x6a\x1f\x6c\x48\xc4\xd4\x08\x18\xec\x79\x99\x05\xf0\x69\xbc\x95\x34\x16\x57\xca\x5d\x02\xb7\xa5\x39\xa1\x3a\x02\xcd\x03\x76\xa5\x0e\x83\x43\xc0\xdc\x20\x34\x6d\xe5\x27\x5b\x1d\xcd\x4a\xd7\xaf\x72\x51\x31\xac\x75\xe9\x54\x82\x5d\x30\xea\xa5\x7a\x68\xbb\x98\xdf\xc4\x1c\xaf\xe5\x71\x05\x56\x64\x7b\x38\x7d\x9b\x7f\xd4\xe4\x76\x51\xe5\x13\x80\x50\x79\x8f\x6d\x40\xf4\xee\x71\x20\xb5\x8f\x74\xda\x94\xd7\x3c\xac\xbf\xd3\x93\xd1\x34\x73\x88\xee\x00\xb7\x9b\x8d\xbf\xeb\x57\x81\x41\x21\xbd\xda\x60\xc6\x27\xdc\xe1\x47\xd4\xd5\x68\xd7\x90\x52\xe9\x7b\x9a\x5f\x3e\xb5\x40\x7c\xc4\x64\x61\xa5\x5e\x18\xa9\x60\xd8\x09\x4a\x5f\xea\x48\xb6\x93\x75\x29\xcc\x4e\xc9\x19\xcd\xbe\xdf\x91\x85\x45\x6d\xc0\x0e\x8d\x98\xad\x15\x37\xee\x10\xa0\x57\xf4\xee\xc4\xb8\x1d\xc6\x03\x92\xfc\x91\x88\xd3\xe5\x61\x78\x59\x65\x09\x2e\x44\x31\x7f\x2a\x48\xe3\x66\x05\xfc\x58\x3f\xc1\x73\xb0\x5d\xb9\xdc\xbc\x75\x57\xd0\x64\x87\x39\x0f\xbb\xba\x77\xaf\x3a\x01\x4e\x1a\xc3\x51\x39\xca\xa1\xc5\x3a\x8d\x17\x34\x7f\x17\x8e\x1c\x54\xd0\xf5\x2b\x40\xe9\x10\x42\xc9\x3e\x7e\x48\x1d\x79\x2e\x28\x8f\xc2\x7e\x4c\x2f\xcf\x11\x1f\xe9\x7d\x9e\x23\x37\xd2\xfc\x1c\x30\x98\xf0\x66\x84\xa3\x1d\x55\xeb\xf3\x62\xc0\x27"}, +{{0x3f,0x59,0xd6,0xa0,0x18,0xf5,0x0a,0x82,0x21,0x17,0xe5,0xb4,0x73,0x60,0x9e,0x30,0xcd,0x64,0x92,0x0c,0xa1,0xc2,0x75,0x0d,0xcb,0x09,0xea,0xab,0x80,0x7a,0x3e,0xac,},{0x45,0x7d,0x0e,0x59,0xc1,0x1f,0x34,0x8f,0x3b,0xfb,0xdd,0x3f,0x32,0x7d,0xe7,0x8c,0x0a,0x75,0x77,0xc0,0xae,0xef,0x42,0xd4,0xc1,0xe5,0x67,0x00,0xd1,0x08,0x80,0x8b,},{0xd7,0x42,0x5e,0xa1,0x94,0xa6,0x71,0x5c,0x45,0x2e,0xc4,0xf6,0xd6,0xc7,0x6e,0x6d,0xd3,0x74,0xd3,0xca,0x7a,0xe7,0xa1,0x19,0x95,0xd0,0x2b,0x94,0x2d,0x4a,0x31,0x87,0x0d,0xd7,0x34,0xc1,0x2f,0xca,0x89,0xa8,0xeb,0x02,0x13,0xeb,0x13,0x9c,0x14,0xa8,0x7a,0x6a,0x33,0xe8,0x18,0x60,0x3b,0x2e,0x31,0x30,0x23,0xfa,0x58,0x73,0x7d,0x0e,},"\x7d\x10\x3a\x6c\x6b\xa2\xd0\x90\x87\xee\xf2\x25\x4c\x1c\x90\x3f\x06\x76\x95\xa5\x4c\x45\x15\xe4\xd1\x3b\xc1\xfb\xfb\x54\xd6\xe7\xa1\x67\x34\x9c\x14\x80\x99\x76\xda\x04\xa7\xe5\x8d\x96\xb4\x0a\xac\x3b\x2b\xdd\x14\xb9\xb5\x03\x22\xbb\x11\x64\x5f\x05\xe5\xe9\x78\xbc\x7f\xbd\x02\x49\x2e\xf8\x8f\x87\xd6\x68\x28\x0f\xd7\x08\x37\x32\x07\xff\x67\x0f\xcd\xa9\x7d\xf8\x48\x5d\x5e\x46\xdc\x3b\xd0\x43\x47\xf4\xd7\x52\x7e\xab\x27\x18\xf7\xd9\x3d\x13\x2b\xa7\x75\x82\x18\x89\x4e\x75\xa7\xde\xab\xe6\x93\x33\x5b\xa0\xdc\x73\xbf\x26\xc2\x88\xbf\xe9\xbe\x8a\x73\x6d\x75\xe5\xe0\xea\xa7\xbb\xe8\xd0\xb7\x7a\xbd\xd5\x14\x6e\x0f\xc9\xb3\x0d\xb9\xf0\x7c\xf4\xbf\x36\x26\x0a\x1f\x41\x41\x03\x31\xf8\xb4\x7c\x6b\x38\x33\x8c\x6d\xc9\xe8\x01\xff\xe1\xd5\x85\xf9\xb7\xfc\x31\xe9\x77\x8b\xca\x30\x27\xc2\x32\xc0\x74\xcb\x18\xe5\xb7\x29\x97\x00\x5f\xfe\xee\x4b\xf3\x7c\x8f\x87\x4b\x1b\x24\x6a\x63\x45\x41\x5d\xac\xac\xa7\x07\x5a\x60\x44\x3a\xc3\x31\x92\x36\xe2\x3c\xf6\xb7\x54\x47\x40\x80\x70\x52\x11\x49\x84\xb8\xd8\xf7\xe8\x57\xdc\xc6\xfa\xec\x88\x69\xcf\x96\xb9\x97\xdf\xa9\xaf\x91\x84\xad\x62\x3f\x1d\x90\xb8\xca\x75\x9b\x44\x8e\xab\xfc\xe1\x8c\x17\xcf\xdf\x9a\x3e\x33\x12\xe6\x3e\x5f\x08\x4c\xea\x90\x4c\x1c\x90\x99\x13\xcc\x4b\x19\xd0\x44\xa3\x72\x00\x34\x97\x3c\x73\x84\x94\x9b\xd6\xf9\xba\x92\x56\xf9\x8c\xd3\x94\xc5\x66\xda\x83\xc3\x11\x80\x10\x9f\x16\xd1\x03\x47\xb7\xe3\xe9\xdd\x6b\xe3\xbd\x3c\x77\xff\x1a\x79\x96\xa0\x78\xdc\xf8\x9d\xcd\xce\x2d\x1b\x61\x56\x95\xf4\xcc\x9f\x8f\x4f\x2a\x08\x80\x46\x41\xbc\xa8\x26\x62\xce\x88\xfa\xa5\x31\x45\xb6\xa4\x59\x55\xae\xc8\xcc\x2a\xf8\x1c\xcc\xb5\xd7\xc6\x4f\x9e\xce\x1c\x99\x83\x32\x64\x84\xa1\xe5\xec\xe4\xce\x36\x54\x4d\x63\x73\x5f\x77\x76\xf2\x1a\x20"}, +{{0xa1,0x21,0x2b,0x34,0xdb,0xca,0x63,0xb7,0x09,0x36,0x12,0xd0,0x5d,0xab,0x7b,0x4c,0xc8,0xf7,0xb6,0x76,0xa9,0x34,0xad,0x01,0xf6,0x59,0x85,0x1b,0x3b,0xb4,0x4e,0x4e,},{0xba,0x2f,0xcc,0xea,0x9a,0x08,0x05,0x91,0xbe,0x71,0x26,0x8d,0x7e,0x95,0x1f,0x25,0x0d,0xed,0xc0,0x04,0x16,0xe5,0xf3,0xf9,0x08,0xdb,0x6c,0xc5,0x71,0x25,0x49,0x25,},{0xfa,0x93,0xed,0x65,0x95,0xbc,0x95,0x8d,0xc0,0x42,0xce,0x16,0x45,0x16,0x7b,0x79,0xe8,0xf6,0x73,0x4c,0x46,0xf8,0x0f,0x63,0x1f,0xd5,0x48,0x49,0x08,0xf5,0xe5,0x1a,0x22,0x42,0x7e,0xe6,0x86,0xf5,0x64,0xff,0x98,0x2f,0x6e,0xf4,0xd2,0xca,0x1f,0x0c,0xa5,0x62,0x49,0x10,0xcd,0xd6,0x3c,0x11,0xa3,0xc2,0xb1,0x6d,0x40,0x97,0x3c,0x07,},"\x07\xc3\x7c\x46\xbe\x3c\x68\xd0\x56\x89\x57\x7a\xa6\x4a\x93\x2b\x90\x64\x46\xb2\x9b\xaf\x12\xf6\x17\x4a\x6b\x42\xbb\xae\xfd\x1f\x1f\x37\x3e\x0b\xcc\xc4\x73\xdd\xfc\xee\x1a\x7f\x21\xb9\x6a\x62\x60\xef\x0a\xa1\xf2\xd8\xb2\x95\x9e\x71\xd1\x2c\x95\x33\x58\xa2\x77\x4c\xc5\xe6\xf3\x79\xa3\x13\xe4\x35\xed\x69\xdf\xd6\xd4\xa5\x9a\xde\xe3\xcc\x7e\xc4\xba\xcb\xdb\xb3\xfe\xe5\x43\x0b\x73\xf6\x05\x1a\x60\x96\xc6\x0e\x9b\xc9\x2c\xc8\xfa\x05\x9f\xac\x2a\x93\xef\x70\x07\xd6\x4f\xbe\x50\x06\x49\x64\xd5\xa0\xad\x60\x11\x75\xcd\x9c\xab\xa4\x53\xf9\x10\x3b\x25\x48\x55\x45\xd3\x01\xf0\x3c\x5f\x9f\x94\x78\xbd\xf9\xd4\x14\xbf\x1d\xca\x3b\x1c\x1d\x9d\xaa\x99\x71\xf9\xe6\x17\xfb\xfa\xf5\xb0\x2a\x7f\xbd\x5d\x4f\xb8\x94\xc0\x97\x5c\x54\x59\x2b\x49\xa0\xfc\x85\xdd\x08\x53\xf3\x0c\x51\x50\x2d\x98\xfc\x1a\xb8\x5a\x17\xcc\x58\x96\x1a\xae\x97\x64\x57\x0b\xa5\xcb\xdb\xc9\x6d\xfc\xeb\x8d\x11\xda\x53\x36\x4b\x40\x25\xfe\x0b\x8b\xa8\xa3\x53\xad\x23\x68\x67\x20\x16\x9f\xe9\x73\x43\x2f\xfe\x29\x1a\x4b\x11\xde\xdd\xa0\xaa\xc7\x9a\x5e\x42\x62\x0a\x64\x58\x7d\x20\x59\xe7\x87\x01\x3b\x40\xce\xec\x59\x92\x08\xf6\x6e\xd0\xca\x6e\x1b\xe9\x09\x2e\xc2\x7d\xb2\x16\xee\x6d\xad\xfe\xbc\x21\x70\x5b\xc4\xa8\x5a\xee\x57\x7e\x57\xd2\x39\xaf\x58\x6e\xfe\xec\x22\xcf\x38\xd1\xcf\xb3\xcd\x74\xdd\x0d\x9a\x33\x81\xaa\x81\xe6\xa2\x97\xe3\x9b\x81\x91\x37\xad\x27\xd4\x75\xe2\xbf\x54\xaa\x42\x6d\xc2\x9c\x4c\xa8\x17\x6d\xf3\x43\x13\x7a\x2d\x79\xd1\x2e\xf9\xaa\x7b\xe1\xcf\x67\x75\xe5\xd8\xa4\x43\x0a\x85\xc3\x3d\xb6\x1c\xd2\xf3\x51\x87\xb4\xf6\xea\x9e\xbd\xd7\x53\xd1\xc4\xef\x72\x47\x11\x59\xff\x07\xb7\x78\x70\x90\x64\x96\x24\x9d\x42\x78\xe3\xf3\xca\x6b\xcb\xf3\x7a\x26\x5b\x89\x65\x39\x19\x0f\x9a\x31\xf1\xe7\xb4\xb6\x5c\xd1"}, +{{0xd9,0x68,0x20,0x86,0xfe,0x7d,0xda,0x30,0xb8,0x71,0x11,0x06,0x01,0x93,0xd8,0x47,0x56,0x6a,0xb9,0x4c,0xfd,0x9c,0x97,0xab,0x6b,0x43,0xe7,0xa8,0xd3,0xf7,0x93,0x82,},{0x8b,0x0b,0x13,0x72,0xd8,0x87,0x33,0xef,0x72,0x33,0xf6,0x37,0x97,0x90,0xd1,0xe4,0x6e,0x1e,0x07,0xe9,0xd3,0xfb,0x8b,0x0b,0xe2,0x52,0xed,0x04,0xc5,0xfa,0x16,0x3d,},{0x17,0x93,0xe4,0x97,0xeb,0x52,0x1c,0xa7,0x4e,0x35,0xd1,0x4a,0x63,0x86,0x8c,0xbe,0x94,0x99,0xda,0x2f,0x21,0xb4,0xeb,0x52,0x60,0x34,0x0f,0xca,0x3c,0x1f,0xec,0xa7,0x8d,0xbe,0x5b,0x14,0xac,0x10,0xf3,0xfa,0x76,0xfa,0x2e,0x71,0xe4,0xc9,0x14,0x61,0xaa,0x75,0x97,0x7e,0x5e,0x70,0x79,0x26,0x70,0xef,0x7f,0xf0,0xe6,0xa2,0x87,0x08,},"\xe8\x81\x4b\xe1\x24\xbe\x3c\x63\xcc\x9a\xdb\x03\xaf\x49\x3d\x44\x2f\xf2\x0d\x8b\x20\x0b\x20\xcd\x24\x93\x67\xf4\x17\xf9\xa9\xd8\x93\xfb\xbb\xe8\x5a\x64\x2b\xe2\x70\x1d\x1d\x1b\x3c\xd4\x8a\x85\xcf\x58\xf1\x59\xa1\x97\x27\x31\x43\xa5\x78\xf4\x2e\x8b\xcc\x8b\x62\x40\xf9\x32\x71\x90\x05\x38\xff\xc1\x87\xc0\xaf\xc8\xdb\xcc\x49\x2b\xcd\x67\x9b\xaa\xef\x3a\xf5\x08\x84\x34\xa9\x45\x86\xf9\x4b\x49\x97\x0b\xba\x18\xf5\xea\x0e\xbf\x0d\x27\xee\x48\x2a\xa8\x3a\xd0\xdd\x0e\xe6\x09\xdf\x59\xd3\x7f\x81\x8b\x2c\x8d\x7c\x15\xf0\xf6\xf5\x44\xdd\x4c\x7e\x7c\xb3\xa1\x67\x24\x32\x4f\x77\xd5\x89\x48\xf8\x47\x5a\x60\xd5\x3e\x5b\xd5\x10\xc1\x71\x37\xc9\x9e\x1c\xfa\x51\x5a\xf9\xbc\x85\x56\x9d\x21\x2a\x21\x19\x07\x29\xf2\x81\x7d\xe8\xc4\x69\x15\xe0\x21\xdf\x70\xff\x6d\x60\x21\x5f\x61\x4f\xc2\x11\x39\x90\x4d\xf3\xb2\x92\xb7\x49\xdc\x4d\xea\x02\x51\x8b\x62\xd1\x58\x62\xc9\x2d\x2a\x4c\x99\x67\x01\xcd\xec\xae\xd8\x4a\xb6\x28\xee\x98\x4f\xc1\x11\xee\xcb\x59\xe4\x84\x44\xef\xc0\xd4\x56\xe2\xc8\x52\x51\x84\x41\xc3\xdb\x76\x30\xdd\xd5\x15\x62\x49\xa2\x87\x30\x98\x38\x38\xae\x59\xac\x4c\xc7\x11\x0f\xd6\xde\x68\x10\x1e\xa5\xb2\xff\x69\xfd\x36\x4e\x3c\x94\x48\xde\xfe\xfe\x17\x5b\xcb\xe1\x17\xcc\x11\xb4\xff\x75\x49\xc3\x3e\x10\x25\xb6\xb5\x92\x04\x8a\x8e\x31\x96\x9e\x81\x8d\xcc\x18\x8b\xb1\x9d\x7a\x24\x40\xa3\xba\xba\x4e\xb1\xb8\x1c\x45\x67\x9d\xb4\x6b\x31\xbc\xde\x77\x76\x75\x7d\x99\x31\xec\x20\x63\xfc\x6f\x1f\xcd\x76\x1e\xcc\x57\xa7\xd0\x30\xa8\x5e\xa2\x73\xef\x18\x25\xb0\x50\x92\xab\x96\x45\x35\x9a\x44\x4f\xf7\xd1\x66\xb5\x75\xfa\xc2\x98\x30\x8d\x9f\xaa\x68\x46\x3d\x1d\x0f\x7b\x7d\xf8\xa5\x1c\x68\x15\xd3\x71\x59\xad\xc0\xb5\x93\x22\x4a\x81\x83\x21\xd7\x21\x9f\x09\x68\x6c\xfc\x95\x22\x59\x71\x8d\xfc"}, +{{0xb5,0x2b,0x24,0x9a,0x7a,0xea,0xe0,0xfb,0xd9,0x4f,0xfc,0xf9,0xa9,0xfd,0xe1,0x0d,0xe6,0x1c,0x3f,0x4c,0xbd,0xa1,0x4b,0x28,0x9f,0xe0,0x1f,0x82,0x70,0x73,0x34,0xca,},{0x73,0x51,0x63,0xbf,0xcf,0xd5,0x4f,0x9d,0x35,0x2e,0x1c,0x2f,0x3c,0x01,0x70,0xc9,0x5c,0x18,0x42,0xcc,0xc7,0x42,0x16,0x23,0xae,0x04,0x96,0x98,0x0c,0xee,0x79,0x1c,},{0x6f,0x48,0xa9,0xf7,0xf0,0xfa,0x19,0x2b,0x66,0xd1,0x21,0x75,0xa3,0x33,0x61,0x23,0x03,0xe1,0x80,0xb9,0xfa,0xb1,0x8e,0xda,0xbe,0xbc,0xdf,0x66,0x74,0xfd,0xfc,0xc5,0x36,0x07,0x08,0x9b,0xf9,0x80,0xce,0x35,0x89,0x4c,0x2f,0x9b,0xab,0xdc,0x44,0x38,0x66,0x7a,0xb3,0x29,0x7a,0x62,0x48,0xec,0x02,0x69,0xfa,0xa9,0x9c,0x72,0x48,0x07,},"\x1d\x44\x5e\x8e\xe3\x6f\x6e\x10\x64\xee\x12\x81\xe6\xb4\xa4\xce\xc5\x0a\x91\xc2\xb6\x67\xc8\x30\x5d\x1e\x9a\x5f\x7b\x73\xa3\x44\x58\x82\x58\x1f\xb0\xc1\x1e\x64\xf6\xee\x92\xe8\x11\xf9\xf2\xd6\xc5\x9c\x63\x44\xbe\x76\x91\xd1\x16\xdd\xa4\x93\xca\xde\x51\xc0\xce\x77\x37\x2b\x61\xa7\xc4\xfb\xb6\x33\x40\x13\x33\xcb\xf7\x13\x72\xad\x2f\x04\x4e\x99\x2a\xc0\x35\xf5\x87\x9c\x05\x30\x04\xf8\x22\x3f\x23\x7a\x24\xa4\x09\xb7\x89\x4f\x6a\xd5\x18\xe0\x46\xb8\xa8\x4c\x3f\x4c\x62\x60\xe6\x16\x9f\xd9\x44\xd5\x7f\xbc\xf9\xba\x27\x75\xf2\xd6\x0e\xd7\x72\xc4\x6c\xcd\x63\xc8\x50\xb8\x0d\x58\x7c\x52\x08\xdf\xb1\xa2\x58\x78\xc0\x2d\xec\xe3\xe6\x02\xe9\x63\x2f\xc3\xc2\xc7\x9b\x25\xab\x41\x03\x4c\x6e\x26\xb8\x69\x25\x53\x57\xa6\x86\x78\x1d\xfe\x6e\x64\x4b\xeb\xa9\xb6\x27\xda\x1f\xcb\x5e\xc0\xbe\x49\x7c\xf1\x88\xe1\xef\x1a\xf0\x60\x1b\xf1\x6b\x29\x11\xfd\x9f\xf3\x4f\x0e\x97\xac\x95\xa7\xfe\x2c\xf9\x0e\xa6\xce\xd3\x3c\xcb\x0e\xd1\xef\x2d\x41\x60\xef\xb0\x7c\x59\x1a\x5c\xb1\x6c\x70\xca\x16\x94\xfb\x36\xf2\xca\x19\xeb\xa5\x2b\xe3\xd4\xad\x89\x5a\xbc\xad\xa4\xb3\x6f\x02\x61\xd6\x5f\x59\xe0\xcf\xd2\xa6\x14\x8a\x88\x92\xdd\xbb\x45\x81\x0d\xb3\xbf\x4a\x9e\x26\xe9\x2c\x15\xea\x26\x18\xcf\xee\xb4\x62\xd8\x62\x8f\x25\x4f\x54\xd2\xaf\x27\x11\x3b\xab\x4f\x9a\x7d\x06\x79\x18\x11\x94\x2b\xdc\x32\xf8\x45\x92\x2d\x7b\x2d\xdb\xa9\x59\x14\x09\x28\xf8\xc2\x8d\x98\xb4\x4e\x1d\x19\xb9\x7f\xd3\x9c\xc0\xf9\xa5\x23\x6d\x34\x9f\xc8\x35\xac\x49\x21\x92\x46\x2e\x40\xac\x62\x9b\xeb\xff\xd2\xeb\xa7\x2d\x27\x88\xb2\x44\xbb\x77\x7a\xd0\xf7\xb7\xf9\x6f\x23\x41\x23\x99\xfc\x1d\x87\xa1\xd0\x87\xba\x08\x90\x27\xea\xbb\xc0\x5e\xda\xfe\xe4\x33\x79\xe8\x93\x29\x13\x31\xb4\x60\xbf\xa7\x33\x2e\x08\x42\xec\x25\x73\x39\x3d\xe9\x53\x06"}, +{{0x78,0x2a,0x93,0xef,0xe0,0xef,0x06,0xcb,0x25,0x34,0x33,0x0e,0xfd,0x0e,0x96,0x84,0xe9,0x96,0x9b,0x52,0x58,0x12,0x3e,0x49,0x02,0x39,0xbf,0x24,0xbf,0x9f,0x65,0x23,},{0x94,0x2f,0xa1,0x40,0x6e,0xe2,0x68,0x3e,0x29,0x37,0x7e,0x49,0xf7,0xba,0x75,0x7c,0xf5,0x0e,0xf0,0x72,0x37,0x07,0xd4,0x40,0x3d,0x28,0x62,0x25,0x70,0x45,0xde,0x87,},{0x93,0xe7,0x40,0x5a,0x40,0x44,0x51,0x01,0x66,0xc8,0xac,0x26,0x4c,0xe3,0xb5,0xba,0x66,0x65,0xd6,0x8b,0xad,0x45,0x87,0x12,0xdc,0x93,0xc2,0xc3,0x90,0x56,0x8d,0x74,0x02,0xef,0x7d,0x57,0xf5,0x49,0xb8,0xa1,0x04,0x2f,0x7f,0x69,0xa6,0x79,0xaa,0x85,0x5f,0x34,0xf8,0x01,0xd5,0x7d,0x79,0x89,0x5d,0xeb,0x8d,0xea,0xdb,0x35,0x23,0x08,},"\x46\xa4\xe3\x19\xa6\x70\xac\x99\x39\x94\xa5\x33\x00\xc3\xf7\x91\x44\xc2\xf7\xfe\xc1\x11\x6e\xee\xb3\x62\x1c\x76\xac\x35\xda\x79\xdb\xff\x6e\x18\x9c\xa9\xdb\xfc\x9a\xbb\xda\x05\x48\x47\xb2\x97\x1b\x02\xfa\xce\xbb\xe9\x26\xd4\x69\xeb\x0a\x86\x03\x89\xac\x74\x41\x62\xbf\x6f\xb1\x3b\x42\xcb\x9b\xb8\xc9\xd7\x26\x07\x13\x8e\x78\x00\x12\x1e\xe0\xcd\x63\x3e\xd5\x35\xc7\xae\x5f\x40\x60\xbb\xdd\x27\x1c\x9d\x11\x0a\xbf\xf5\xe0\x60\xea\x6e\xe8\x38\x90\xb1\xe9\x2a\x92\x56\xd7\xb2\xba\x98\x2a\x31\x14\xbb\x6d\xef\xfe\xe2\x69\x6f\x0a\x2f\x9c\x21\xaa\xa5\xb2\xde\xfa\x11\xaa\xb7\x07\x6d\xe6\xe5\x7e\x86\xf2\x84\xbb\x67\xf5\xa4\x9e\xe6\x85\x92\x10\x32\xc9\x5b\x74\xe7\xe3\xea\xc7\x23\xf1\x75\xaf\x08\x2c\x85\x8e\x0d\xfa\x01\x72\x8c\x38\xfb\xbb\x4c\x83\x58\x1f\x81\xac\xe6\xc6\x3c\x6b\xda\xac\x56\x20\xeb\x9a\x56\x8e\x7e\xbb\x7b\x72\xb3\xd1\xa1\x64\xef\x52\x4e\x7b\x9f\x00\x79\x9a\xb0\x86\x71\x59\x76\xc1\x4d\x0d\xf6\x5f\x7b\x96\xbf\x9e\xbc\xda\x7f\xee\xef\x11\x34\x22\x00\x1a\x03\xa7\x63\x3d\xf5\xe4\x99\x39\xa1\x21\xdb\x89\x9d\x9b\x8a\xc2\xdb\x4f\xad\x0c\x30\xcf\x0b\x8b\xdb\xc9\xe9\x80\x2a\x79\x7c\x82\x38\xe4\x65\x11\xff\x24\x06\x8c\xad\xcf\xf2\x44\x8c\xc0\xbf\xf9\x27\x69\x22\x33\x48\xd4\x5d\x6b\x6f\x2c\x8f\x15\x93\x38\x8c\x0b\xbb\xf4\x4b\x6d\xdb\x50\xb9\x8c\xd7\xf0\x9c\x73\x0f\x7d\xe4\xd0\x08\x15\x6c\xb3\xcd\xe0\xca\xb3\xad\x0a\x58\xa8\x39\x54\xe2\x34\xa0\xa8\xa0\x4b\x57\x3c\x9a\x8e\x9b\x92\x9e\xd3\x8b\x8b\x22\x8b\xf5\x5a\x3c\x6e\x2c\x6b\x51\xf6\x82\x65\x2f\xbb\x70\x8e\x74\x64\x0e\x33\x13\xe1\x7b\x46\x94\xd7\xfd\xf0\x11\x1f\x90\x60\x8c\x1b\x5a\xf4\x22\xdc\xde\xca\xd9\xdd\xb7\xf5\x0d\x1b\xf5\xbc\x63\x78\xcc\xaf\xfc\x32\x01\xe6\xc7\x87\xb4\x8c\x44\x3b\xa2\x40\xd9\xd5\x0f\xf6\xc0\xe9\xdf\x7f\x1a\x5b"}, +{{0x6f,0xe7,0xbc,0xf7,0xa6,0x84,0x42,0x3d,0xe1,0x07,0x6f,0xd7,0x6d,0xa7,0x83,0x42,0x33,0x73,0xb3,0x81,0x32,0x9e,0xfd,0x61,0x57,0x42,0x4e,0xc4,0xb2,0x65,0x5a,0x94,},{0x77,0x40,0xe9,0x1a,0xfe,0x45,0x32,0x4f,0x8b,0xb9,0x90,0xca,0x2a,0x34,0x12,0x79,0xdd,0xaf,0x23,0x2c,0x3b,0xb4,0x15,0xf1,0x78,0xb6,0x09,0x2f,0xba,0x19,0x5f,0xec,},{0x99,0x14,0xcc,0x50,0xfe,0xf0,0x93,0x5e,0xfb,0x89,0xb3,0xd6,0x4e,0x3c,0x1c,0x34,0x12,0xae,0xd6,0x59,0xb9,0x01,0x66,0x22,0x2c,0x0d,0x13,0xec,0x1c,0xe3,0xa6,0x8a,0xe6,0x28,0x1b,0x7e,0xfd,0x9d,0x4e,0xc6,0x4b,0x82,0xe7,0x3e,0x14,0x47,0x9f,0x03,0xfb,0xac,0x8f,0xa3,0xab,0xdb,0x41,0xea,0x42,0x15,0xc4,0xa4,0xd4,0x94,0x9d,0x09,},"\x0b\xaf\x0a\xd4\x40\x61\x2b\x4c\x5a\x13\x6c\x3a\x42\xbe\x1c\xa2\xb7\xc3\x19\x86\x2a\x44\xa9\xfd\x50\xc4\xee\x73\x54\x1c\x5e\x64\x57\xef\xa8\x18\x25\xb6\xdd\x4a\x72\x19\x4a\x29\x68\x68\x8b\xd4\x9e\x5a\x8f\x4c\x04\xdb\xaf\xc2\xe7\x88\x4c\x0c\x70\xc2\x08\xd4\xe9\x54\xcd\x16\x75\xda\x8e\x74\xc6\x5c\x49\x7c\xf9\xdc\x69\x42\x49\x65\xbd\xcb\xa5\xde\x52\x93\x6f\x92\x5f\x62\xe2\x01\xf9\x95\x05\xd3\x77\x7b\xeb\x3c\x2e\x08\xb2\xec\x9a\x87\x3e\x5a\x9c\x21\xfb\x4a\x2f\x3e\x86\x1f\x3c\xf4\xd6\xb5\xdc\xd1\xc8\x8b\xcd\x91\x63\x53\x9a\xc6\x2c\xd0\x65\x9f\x4e\xf2\x32\xc2\xce\x57\xfc\x77\xf9\x02\x85\xeb\x35\x01\x69\xed\xc6\xa8\x06\xff\x50\xf6\x1c\x7e\x0b\xee\xeb\xec\xec\x63\xbf\xc9\xd3\x98\x3f\x5b\xb4\xb2\x61\xc7\x46\x47\x1f\xcb\xf2\x89\x2c\x61\x08\x97\x0b\x68\xdb\x5e\x43\xc4\x50\x4d\xda\xe2\xd0\xff\xff\xa2\x8b\x67\x59\xae\x11\x28\xe1\x6f\x66\xd4\x92\xad\x61\xe3\x72\x2c\x96\x0f\x88\x69\x2b\xe8\x1a\x9f\x41\x28\x90\xff\xa3\x46\xe7\x02\xc8\x67\xdf\xa2\x59\x70\x3b\x73\xf5\x25\x07\x4f\x32\x27\xc4\x9c\xec\x1b\x64\x5a\x10\x3b\xd4\x47\x1f\x33\xf9\xf1\xba\xc3\x27\xd7\x91\x78\x61\xd0\xad\x91\xab\xee\x60\x22\x2e\xa2\xa3\xc8\xca\xc0\x52\xae\x9a\x2c\xbd\x90\x85\x5d\x73\x3d\x53\x19\x13\x3f\x95\x41\xbd\x0b\x61\xf0\x99\x52\x68\x35\x1e\x28\x63\xc1\xca\x2c\xa5\x1e\x3c\x97\x63\x83\xf5\xc4\xc1\x1f\xf4\x10\x03\x6f\xd5\x1d\x5a\xc5\x6b\x02\x3c\xe9\x02\x9c\x62\x0f\x22\x55\x70\x19\xad\x9b\x42\x64\xed\x4d\x71\xb4\x34\xf4\xa4\xd1\x7a\x7d\x57\x69\xfa\x1e\x14\xa6\x9f\x7a\xe4\x19\xcc\xf5\x94\x7f\x8c\x76\x82\x69\x71\x16\xc2\x40\x5f\x5a\x19\x59\xc5\x4b\x48\xf0\x87\x2f\x59\x6e\xd4\x59\x64\x48\x8d\xde\xc1\x2b\xdb\x63\x6d\x0b\x34\x9e\x74\x9e\xb6\x60\x92\xff\x45\x11\xfb\xa5\x9b\x59\x62\xcb\x93\xcc\x85\x51\x5c\xc8\x6a\xb0\xc6\xb2"}, +{{0xdd,0xa4,0x8a,0x0d,0x15,0xa2,0x9e,0xba,0x9a,0x76,0x30,0x5d,0x36,0x0e,0x46,0x6e,0x72,0xd8,0x04,0x0e,0xfe,0x2e,0x89,0xc0,0x4b,0x64,0x61,0x31,0x5a,0x9b,0x8b,0xf4,},{0x4f,0x5c,0xc3,0x6a,0x80,0x94,0x16,0xb5,0x8e,0x15,0xd2,0x4c,0xc5,0x79,0x68,0xcb,0x57,0x3b,0x76,0xad,0x90,0x88,0x7a,0x8e,0xf3,0x6c,0xde,0x7e,0xca,0x40,0x0f,0xcc,},{0xce,0x71,0xbc,0x82,0xd5,0x31,0xd0,0xf9,0x3b,0x57,0xbf,0xdc,0x2f,0x73,0x16,0xcf,0x40,0x4e,0xe0,0x9a,0xf8,0x8f,0x33,0xbf,0x80,0x6c,0x7c,0xad,0x6b,0x8f,0xfa,0x36,0x62,0x36,0xba,0x74,0xe7,0x5c,0x15,0x09,0x6d,0xda,0xa6,0xe3,0xa6,0x2a,0x8f,0x5e,0xb1,0xc8,0xc3,0xf6,0xb6,0xc9,0x4a,0x6a,0x34,0x9f,0xc7,0xc0,0xcb,0xfb,0x19,0x0d,},"\xf5\xac\x19\xb8\x1f\x21\x11\xa0\xdb\x0a\xe3\x0d\x15\x13\xed\x34\x3e\x7f\x57\xf7\xf7\x7d\x65\xb8\xac\x7c\xe3\xa6\x01\x17\x4b\xae\xd9\xbf\xa1\x36\x03\x59\x76\xf5\x16\xd5\xa8\x70\xf4\x5d\xb1\x91\x9f\x1e\xb1\xcb\xec\xbe\x88\xec\x32\xd1\x91\xe9\x24\x88\x21\xa7\xe7\x68\x1f\xe3\xab\xec\x11\x58\x4b\xdb\x33\xde\x1b\x4c\xa9\x48\x91\xeb\x66\xdc\xb8\x53\x9a\xc4\x11\x63\x73\x6c\xcf\xd6\x9a\xbb\x83\x81\x4d\xd3\x8c\xd6\x03\x81\x31\x87\x28\x05\x2a\x25\xcb\x66\x54\x71\x05\x86\x50\xcc\xc7\x57\x56\xdb\xee\x68\x8a\xb8\x26\xec\xad\x4a\xd5\xa7\xdb\x57\xe8\xf6\x5f\x1b\x64\xab\xff\x82\xdd\x53\x33\x4b\x79\x7a\xc4\x02\x28\xdd\x81\x7f\x23\x9d\x3e\xe8\x04\xa1\x9a\xea\xc8\xcf\xe3\x3e\xb6\x57\xec\x9c\xe9\x23\xd6\xb3\x88\x91\x4c\xfb\xa2\xe7\x2b\xfc\x2b\xc3\xd6\xf9\x85\xc0\xd9\x75\x34\xdb\x95\x8e\xed\xe5\x7b\x16\x49\x1f\xfb\x75\x5c\x1a\x58\xd7\x8a\xb3\x77\xfa\xec\x0d\x31\x18\x18\xe8\x99\x26\x0e\x3e\xbd\x1c\xcd\x29\x24\x6f\xa8\x2d\x0b\x76\x62\x2b\x2c\x4b\xc5\x2f\x54\x9f\xee\x72\xa3\x0f\x55\x4f\x33\x1f\x36\xd2\xa7\x4d\x99\x9e\xc1\x0a\x08\x29\x4f\x00\x2b\x43\x61\xe5\x90\x27\x9c\x2f\xb1\xbd\xa4\x31\x2c\xcb\x24\xd7\x52\x82\xce\x7c\x06\x1a\x0c\xa5\x52\x0c\x74\xf6\xf6\x33\x3b\x18\xc4\xb5\x41\xcb\x6c\x51\xe0\x15\x75\xba\x80\x51\x2f\xfa\x7c\xe0\xac\xcd\x22\xd1\x40\x27\xc5\x3a\xba\x1f\x74\x37\x83\x5f\x11\x14\xd6\x8e\x3a\xcf\x3f\xf8\xde\x94\xc8\xe4\xef\x6d\x3a\xb3\x12\xc9\x1d\x02\x97\x01\x57\x50\x8f\x54\xa5\x81\x6f\x46\x7a\x21\x4e\x9b\x12\x84\x30\x02\x89\xe6\x5f\x36\x5a\x61\x0a\x8e\xa2\x84\x66\x6c\xfe\x55\x18\xe4\x35\xbc\xcd\x21\x62\x75\x01\xc7\x25\xf0\xb8\xeb\x57\x25\xe0\xe0\x6e\x0c\xef\x5d\xb2\x01\xb4\x8e\xc9\x1e\xbf\x87\x8d\xd5\x7c\xe8\xda\xc7\x33\x48\x48\xa1\xbc\x82\xc1\x8b\x06\x59\x55\xe4\xf5\x9b\xe3\x39\x85\x94\xdc"}, +{{0xec,0x57,0xb9,0x41,0xad,0xf3,0xca,0x13,0xe7,0x7a,0x78,0x05,0x77,0xcf,0xd0,0xdf,0x5b,0x49,0xed,0xc8,0x53,0x51,0x05,0x2d,0xa3,0x4e,0x99,0xf8,0xa9,0xbf,0x32,0x08,},{0x28,0x59,0xc0,0x71,0x97,0x8a,0x04,0xb7,0xf5,0x40,0x7b,0x6d,0x22,0x40,0x1a,0x78,0xef,0xd0,0x39,0x4b,0xb9,0x66,0xb9,0xa0,0x4d,0xa6,0xb5,0xef,0x81,0x9d,0xe3,0xfa,},{0x11,0x8e,0x14,0x62,0x12,0x6b,0x45,0xb8,0xc6,0x80,0x35,0x23,0x75,0x5c,0x56,0xdf,0xc4,0xe1,0x23,0xe4,0xac,0xbb,0x66,0xba,0x0b,0xa6,0xfe,0x3e,0x05,0x3d,0xa4,0x11,0x9f,0x57,0x19,0x29,0x5e,0x0c,0x82,0xac,0x64,0xd7,0xc5,0xcb,0x1a,0xc8,0x98,0xdf,0x26,0x3d,0xdf,0xd3,0x60,0xf3,0x00,0x8d,0x91,0x01,0x8b,0x26,0xf6,0xa1,0x73,0x0a,},"\xd2\xbc\xbd\x1b\xc3\x61\xab\x32\xc6\x6d\x72\xfd\x48\xa8\xe2\x27\xdc\x6b\x8d\x6b\x15\x08\x48\xba\x71\x5f\xf4\x7d\xd3\x5c\x8e\x49\x38\x1b\xb4\xe2\x93\x3f\x42\xcd\x26\xb7\x5b\x14\xd9\xc0\x03\x92\x82\xb6\x2b\x85\x56\xaa\xa1\x1c\xd6\x91\xe8\x28\x38\x2b\xe3\x06\x88\x9f\xc9\x20\x51\x37\xb1\x69\xd3\xbf\x17\xb7\xf3\x76\x93\xfc\xe2\x86\x03\x9f\x03\x80\x9d\x7d\x9d\x98\xc8\xfd\xe4\x6f\x11\x01\x94\x2a\x27\x9c\x51\x67\x06\xf5\x01\x91\xa9\x11\x2f\x6a\x24\x63\x0e\x1a\x26\xc3\x21\xe4\x6c\x9c\xcc\x85\xb6\xef\x94\x2f\x35\x3a\x64\x2b\x9e\x7e\xf9\x98\xc0\xfc\xe2\xd3\xa7\x5b\x99\x9e\xeb\x77\xf3\x1f\x9b\x08\x13\xa9\x7e\x30\x14\xc3\xa8\x6e\x25\x58\x73\x46\x21\xa3\x06\x6d\xae\x35\x84\x50\x31\xe3\x56\x65\xf1\x92\x29\x07\xdb\xb7\x39\x78\x6a\x8b\x76\x58\xab\x60\x27\x6f\x2d\x92\x1d\x1a\x51\x23\x0f\xc7\x4d\x19\xe8\x01\x84\xa4\xf1\x0e\x9e\x83\x4a\xbc\x9a\x36\xc4\x29\x72\x6b\xc0\x55\xdc\x8c\x06\x3f\x0e\xca\x9c\x61\xa8\xa9\x70\xbd\x4b\xb5\xf4\x24\xee\x4d\x04\xbf\xc2\x95\xe3\xbb\x1f\x34\xbe\xcb\xd9\x92\x0f\xe2\xe7\x7f\xcf\x36\x76\x3f\x32\xfc\x9c\xfd\x5e\x46\x59\x79\xc1\x67\xca\xbf\x5a\x12\x44\xb4\x91\xfc\x06\xb8\x94\x64\x19\x04\x6b\xa5\x16\xc5\xb2\x33\xc4\x14\xdd\xef\xb6\xda\x04\xf2\xe1\x3d\xaf\xf7\xa9\xa0\xc0\x2a\x51\x8e\xde\x57\xad\x95\x21\xde\x64\xed\xdf\x6f\x49\xa9\x67\x0f\x63\x2d\x3f\x7d\x42\x42\x52\x07\xd0\x53\x60\x4f\xe3\x9d\x13\xb9\xf5\x2c\x8b\xc2\x92\xb0\x07\x6e\xa4\x2a\x56\x00\x56\xdf\x25\xde\x51\xad\x35\x88\x1d\x08\x54\x32\x24\xd7\xfa\x5d\x70\xb8\x60\x3e\xf2\x3c\xe0\x63\x39\xd6\xcd\x09\xe2\x2a\x95\x74\x9e\x50\xdf\xbd\x3b\x8a\xd6\x9f\xd3\x04\x96\xb9\x84\xd1\xc0\xa1\x99\xc8\x59\x48\x05\xf3\x8b\xa4\x46\x31\xa2\xc5\x9e\xad\xc6\x55\x4d\x19\xf9\xbc\x98\x36\x6d\xfd\xec\x2a\x12\x1d\x0e\x48\x14\xd2\xcd\x3f\x58\x71"}, +{{0xcb,0xfd,0x91,0xd7,0x69,0x5c,0x1f,0x27,0x0f,0x69,0x24,0x6a,0xb3,0xdf,0x90,0xed,0xb2,0x14,0x01,0x10,0x1c,0xa7,0xf8,0xf2,0x6c,0x6d,0x00,0xf4,0xdc,0xb7,0x23,0x3e,},{0x51,0x38,0x79,0xcf,0x79,0xd2,0xf4,0x6d,0xf4,0xb8,0x5a,0x5c,0x09,0x49,0xeb,0x21,0x16,0xab,0xf9,0x81,0x73,0x5a,0x30,0x31,0x64,0xcb,0xd8,0x5a,0xdf,0x20,0xb7,0x52,},{0xf3,0x36,0x13,0x7d,0xfe,0x6f,0x42,0xa6,0x66,0x9b,0x55,0xf7,0x4b,0x80,0xb3,0x03,0x5a,0x04,0x03,0x67,0xf9,0x06,0x56,0xfc,0xef,0x0a,0x64,0x4c,0x52,0x27,0x2d,0xdc,0x39,0x27,0x3c,0xd7,0x72,0x60,0x10,0xeb,0xcd,0x8a,0x30,0xa0,0x52,0x01,0xab,0x70,0xb8,0xff,0x97,0xd0,0x28,0x8a,0x2c,0xb9,0x4c,0xbc,0x49,0x02,0x06,0x47,0x39,0x0b,},"\x26\x4a\x93\x3f\x7d\x0a\xec\xba\xc1\x3e\xef\x64\x4b\x0b\x53\xdd\x53\xa1\x28\x09\x04\x10\x0d\xbc\x1a\xb8\x7b\x51\x14\x89\x98\xf9\xda\x0b\x3a\x0a\x63\x37\xf5\xe3\x48\x6c\x2b\x7e\x54\x8d\x21\x12\x59\x39\x7a\xaa\x19\x4e\xe4\x69\x5b\xf9\x8c\x2d\x5f\x44\x87\x69\x9f\x73\x97\xe5\xd3\xa7\xe6\xd5\xf6\x28\xfb\xd0\x54\x97\xc5\x56\xa5\x0a\x4d\x05\xe2\xb7\x12\xcd\xbc\x35\x10\x68\xe4\x2a\xf1\x95\x38\x90\x1b\x88\x25\x31\x0e\x34\x3e\x1a\x17\xa1\x86\x7d\xde\x0e\xb4\x7d\xda\xb4\x56\xd3\x16\xf3\x52\x15\x54\x93\x7b\xf8\x08\xae\x4e\x4b\xc1\xc3\xc5\xb4\x75\x6e\x4a\x16\x5a\xd9\xe8\x82\x7f\x53\x16\xf7\x48\xca\xc6\x99\x8e\xd2\xd2\x10\x4f\x26\x84\x07\xc1\x35\xe6\x2f\x26\xa9\x22\x46\x0e\xab\x6d\x85\x16\x39\xa0\x0e\x5f\x08\xb3\x47\x65\xea\x02\x44\xf4\x75\xbb\xfe\xac\x18\x3e\x3b\x5b\xd1\xaa\xb7\x98\x52\x27\x98\xa0\x8e\xc6\xbf\x22\x57\xd4\x69\x2f\x5b\x03\xcd\xd0\xa2\x13\x3d\xe9\x70\x60\x3e\x32\x51\x47\x5a\xad\x8d\x93\x4a\xf6\xb2\xbf\xc7\xa6\x50\xb9\x1b\xde\xc1\x43\xf8\xad\x25\x4c\xfa\x50\x6b\xbf\xf2\x8a\x03\xbe\xb6\x59\xef\x5e\x5d\xdf\xfe\x76\xe2\x32\x30\xc4\xcc\xd4\x63\x10\xb3\x7d\xd9\x1f\xa6\xaa\x68\x16\x7f\x62\xa5\x5c\x8a\x69\xf9\xed\x1e\xc6\xcd\xb1\x44\xdd\x81\xab\x0b\xcb\xd6\x26\x43\x42\x0b\xca\xe6\x78\x69\xf6\x4c\x0b\x16\x9f\x3c\xdf\x3c\x90\x58\x95\xb7\xd3\x5b\x6f\xaf\xda\x25\xcc\xf2\x3c\x3d\x10\xde\x32\xe7\xf2\x71\xe3\x00\xd3\x95\x97\xda\x8f\x84\x37\x22\xef\x08\x36\x4a\x5f\x7a\x10\x5b\x96\x55\x17\x2d\xf7\xc8\x2d\x73\x74\xf9\x82\x64\xc9\xcd\xcc\xb4\x96\xf2\xe1\x0f\xd8\x26\x2f\xb1\xa9\xa9\x96\x5b\x0b\x84\x1a\xc0\xd0\xe9\xc1\xa3\xd9\x49\x3e\xa7\xaa\x60\x02\x05\xb8\xf9\x00\xbe\x0d\x7a\xbb\x4d\x98\xa0\x65\x83\xd2\x29\x5c\x27\x63\x18\xbe\x28\xd4\x21\x98\x2d\xed\xd5\xbf\xc3\x3b\x88\x65\xd9\x4e\xf7\x47\xd6\x26\xaf\x99"}, +{{0x51,0xa4,0x19,0x7a,0xb7,0x68,0x6f,0x82,0xf6,0x00,0x3a,0x0c,0x32,0xf3,0x9d,0x0f,0x2e,0x47,0x55,0x5f,0x4e,0x9f,0x8d,0xee,0xe7,0x5b,0xcb,0x1b,0xd1,0xef,0x69,0xe5,},{0x06,0x38,0x6d,0xf8,0x6b,0x61,0xf1,0xf8,0xf4,0xdc,0x45,0xb7,0x3e,0xda,0xa8,0x41,0x92,0x09,0x68,0xbb,0xd1,0x31,0xcc,0x5c,0xa1,0xc5,0x29,0x4e,0xee,0xd5,0xc8,0xba,},{0x2c,0x07,0x29,0x69,0xff,0x47,0x19,0x21,0x2a,0x12,0x19,0x38,0xb5,0x06,0xc6,0x02,0x99,0x5b,0x4d,0x02,0xa2,0x2e,0x61,0x98,0xd6,0xe8,0x7d,0xd6,0xae,0x07,0x62,0x25,0xac,0x70,0xbb,0x25,0xef,0x8c,0x0e,0xe8,0x1e,0xb6,0xfe,0x95,0x3d,0xf6,0xb1,0x81,0x59,0x49,0xe8,0xed,0x05,0x06,0xcb,0x01,0x2e,0x87,0x3c,0xd3,0x6c,0xd0,0x9b,0x0a,},"\x2a\xed\xb7\xe8\x2f\x1f\xe4\xce\x46\x9a\xda\x48\x34\x5d\x00\x6d\x1b\x3b\xff\x40\xeb\x21\x86\x7f\x51\xfc\xe9\x65\x64\x0c\x40\x9e\xc1\x3a\xd4\xd5\x2f\x89\x1b\xd7\x90\x66\xd6\xb4\xd9\x44\xca\x86\x8d\x89\x86\xd2\x42\xb5\x7e\xcc\xc4\xc4\xa4\x88\x29\x1b\x15\x9c\x8d\xe4\x39\x2b\xe4\xb8\x6f\xeb\xaa\x75\xea\xc5\xd2\x2d\x3c\x4f\x8d\x6b\xef\x79\xad\xb9\xb9\x2b\x49\x14\xd5\xea\x07\xc7\xf0\x21\xe2\xc2\x9f\x58\xd0\x7b\xe8\xa0\x84\x10\x0b\xc1\x52\xd5\x1c\xa8\x97\xd7\xc1\x31\x64\x4d\x08\x95\x32\x2e\x94\x40\xa8\x33\x9e\x1a\xa3\x90\xa7\xf4\xfc\xb5\x1d\xdf\xb6\xdf\x48\xaa\xf5\x67\x63\x37\xd8\x7d\xdd\x85\xb1\xd9\x25\xe1\xa9\xc2\x9f\xe0\x81\x8f\x51\x4e\xf7\x2f\x74\x7a\x67\x49\x46\x47\x69\x07\xa7\xca\x99\xe9\xdb\x8d\x20\x96\x41\x05\x7a\x7f\x44\xa3\x17\xb9\x09\x74\xbc\x86\xf9\x61\x7a\x96\x8a\x76\xa6\xb8\x38\x7c\xf5\x85\x3e\x60\x81\x90\xc1\xa7\x9f\x1e\x1d\x68\x6e\x0d\xe2\x2d\xb6\xcd\x9a\xeb\x85\x32\xc5\xc8\x5c\xc9\x0b\x5a\x01\x85\x79\xf2\x8e\x50\x2a\x77\x0a\x4e\xc6\x75\x26\x3d\x0d\xd7\x81\xb4\xfa\x53\xc9\xdb\xf8\x09\x8d\x57\xb3\x3a\xe2\xaf\xba\xeb\x3e\x68\x26\x6a\xd9\xaa\xb7\x17\x4b\xa6\x8c\x64\x79\x88\x39\x92\x67\x0c\xcf\x3e\x5a\xc6\xa1\x7e\x65\xe3\x1e\x1f\xdc\x85\xe2\x69\xc8\x09\x35\xef\x57\x4f\x20\xd2\x39\x56\x84\x86\xe7\xd9\x4a\x4f\x72\x4a\xb7\x00\x60\x98\xb2\x4f\x3f\x61\x58\x76\x91\x43\x5c\x7f\x29\xce\x4e\x5c\xa7\x1b\x2b\x18\x74\x55\x64\x33\xa3\x58\xc8\xc5\xef\x3c\x88\x08\x43\x03\x0c\x2d\x13\xd5\x1b\x78\xc9\xbf\x1a\x88\x24\xe6\x2e\x11\x18\x44\x39\x6f\x5a\xf2\xe2\x5c\x31\x26\xef\x36\x26\xe2\x6e\xfa\xfa\xcf\x99\x83\x0a\xa4\x12\x12\x33\x2f\x37\x8a\x16\x72\x33\xa0\xb4\x22\x13\xaf\xe3\x6d\x83\xdc\x45\x82\xa7\x96\x93\xb9\xd5\x71\xa5\x77\x12\xa0\x8b\x85\x66\xd3\x61\xac\x90\x26\x47\xaf\xc8\x86\x60\x3e\x24\x28\x3e\xfb"}, +{{0xb1,0x11,0x9c,0x36,0x11,0x8b,0x7a,0x06,0x5a,0x19,0x5b,0xfb,0x8b,0x79,0xa5,0xc2,0x87,0xe0,0x9b,0xd2,0x87,0xc2,0xda,0xac,0x5e,0x6b,0x01,0x16,0x4c,0x5d,0x73,0x7f,},{0x88,0xf2,0x18,0xec,0xba,0x99,0xe7,0x70,0xed,0x21,0x4a,0x8d,0x01,0xa9,0x2a,0x10,0x40,0x0a,0xca,0xf1,0xf6,0xee,0xd4,0x20,0x06,0x7e,0x13,0x6e,0xe2,0xc0,0xc6,0x70,},{0x24,0xec,0x1e,0x54,0xfc,0x7e,0x72,0x2d,0x37,0x55,0x1d,0x02,0xcf,0x13,0x5d,0x33,0xf5,0xd3,0xff,0x53,0x57,0x73,0xe0,0x29,0x91,0xee,0x85,0xff,0xd3,0xaa,0x29,0x99,0x7f,0x9c,0x46,0x44,0x70,0x19,0x7f,0xee,0x81,0xdc,0xe1,0x10,0x60,0x9f,0x87,0x0b,0x27,0xc1,0x8d,0xfb,0xcf,0xd9,0x32,0x05,0x48,0x52,0x5e,0x93,0x14,0x8e,0x22,0x05,},"\x88\x16\xb1\xeb\x20\x6d\x5f\x6d\xcc\x2e\x4c\xc3\x91\xd2\x32\x09\x00\x6d\xe9\x35\xe3\x18\x15\x2e\x93\xfc\x8c\x2c\xf0\x8e\x26\x43\x2b\xad\x9a\xdb\x32\x03\xd8\x98\xdf\x0a\x2e\x7f\x1f\x83\xdc\x2f\x3e\xd3\x20\x5b\xec\x8e\xfc\xfd\x31\xad\xc1\xac\xa5\x75\x5d\xb9\xbd\x4e\xfe\x54\xcc\x17\x07\x30\x77\xde\x4a\x3f\xdd\x11\x99\x6e\x84\xb6\xa0\x52\xf0\x34\xb4\x10\x99\x22\x6c\x9c\x27\x2e\xae\x12\x52\x8f\x16\x58\x1b\x91\xb8\x12\x85\x0c\x20\x71\x44\xdb\xff\x3e\x85\x0c\xca\x84\x8e\xc2\xb1\xdd\x16\x47\x44\xd7\xb5\x93\x37\xd7\xe3\xef\xef\x00\x81\x62\xe6\x80\xbd\x4a\x08\x99\xce\xd6\x0b\x17\x1f\x8c\xbe\xb4\x8c\x51\x58\xdf\x6c\xbf\xdb\x26\x24\x08\x81\xbd\x58\xeb\xb8\xb6\xa0\x79\x58\x72\x79\x67\x9c\xb5\xad\x82\xf3\x71\xb5\x3c\x80\x13\x80\x4c\x35\x59\x6c\x88\x7e\x43\x6d\x23\x92\x6f\x99\x4e\x09\xd9\x8f\xbb\x8c\xe2\x70\x41\x74\xef\x38\xb6\x82\x62\xa7\xf1\xa7\x12\xda\x0e\xf0\xde\xc6\x39\x60\x68\x14\xb3\xbd\xca\xf2\x53\xff\x31\xc4\x8e\x8a\x75\x2c\x11\x1b\xd7\x10\x10\x31\xcc\x3d\x38\xef\xb0\xc9\xc7\xf1\x9c\x59\x08\x15\x84\xa0\xe0\x15\xee\x7c\x75\xb1\x0a\x4c\x51\xff\x54\x3a\x30\xe5\x2d\x5f\x94\xd8\x18\x8c\x6b\x08\xe9\xdf\x1e\x84\xa4\xe2\xc8\x07\x17\x0a\xc1\x24\xa7\x71\xb9\x94\x65\xa0\xd3\x8b\x1f\x1c\x63\x30\x40\x3c\x82\x54\x35\x82\xc5\xbb\x61\xb2\x20\xde\x1b\x9e\x0e\xf6\x9b\xda\xe2\x60\x23\x18\x1b\xa4\xcc\x07\x7a\x5f\x0d\x42\x57\x32\xac\xe1\x32\xae\x0c\x6f\xf0\xbb\x18\xba\xea\x83\xe8\x87\x7a\xfb\xe6\x50\xfe\x0b\xd0\x20\x93\xf0\x0a\x7b\x53\x65\x72\x8d\xcb\x66\xfb\xb8\x81\xf5\x92\x94\x50\x58\xa5\xb3\x50\x66\x5a\xf9\x1c\x55\x7a\x54\x72\x50\xad\x29\x5e\x68\xb4\xfb\x72\x45\x7c\xfb\x9d\x5e\xa1\xa7\xb2\xa3\x9c\x9a\xb7\xd7\xac\xe0\xaf\x5d\x51\x66\x9c\xb6\xc2\xc4\xc0\x7b\x22\x56\xd1\x0e\x5f\xfc\x6b\x97\xc6\x60\x00\x63\x13\xc4\xeb\x8d"}, +{{0xcb,0xb5,0x87,0x51,0x4e,0x0a,0x34,0xff,0xc3,0x4c,0xbc,0x04,0xf2,0x8c,0x9b,0x4f,0x64,0x65,0xf1,0xeb,0x22,0x5c,0xca,0x19,0xb8,0x64,0x87,0x6d,0xae,0xf3,0x7d,0x7f,},{0x6b,0x70,0x5d,0x46,0x77,0xd2,0xd8,0x49,0xb6,0x74,0x4b,0x1e,0xbe,0xd1,0x67,0xdb,0xcb,0xf6,0x45,0x92,0x4b,0x1f,0xf2,0xe6,0x36,0x07,0x94,0xbd,0xd0,0xe0,0x97,0x88,},{0x12,0x74,0xd6,0xf3,0x56,0xeb,0x64,0x14,0x72,0xb6,0xb9,0xe5,0xb3,0xce,0x65,0xd2,0x65,0x4e,0x6c,0xb8,0x7d,0x3a,0x83,0xfb,0x49,0xd0,0xf7,0xda,0x9c,0x44,0xbe,0x2b,0x53,0x26,0x04,0x46,0x5f,0x60,0x89,0xd6,0x80,0xd2,0xd9,0x4b,0x0e,0xdd,0x2b,0x6b,0x2b,0x80,0x5c,0x5e,0x84,0xc3,0x79,0xef,0xc0,0x59,0x67,0x3d,0x31,0x00,0x7a,0x09,},"\xbd\xf7\xd1\x7c\x70\x67\x96\xef\xd3\x48\x95\x59\xb5\x27\xb1\xc0\x58\x4b\x90\x22\xc9\xcb\xda\x3a\xac\x51\x46\xda\x34\x0d\x9c\xea\x69\xf9\x16\x03\x7c\xd2\x1b\x3e\xb1\x10\x43\x48\x88\x0f\xd5\xc5\xb7\xc6\x5f\xf8\x20\xf7\x49\x93\x46\x01\x69\x51\xcb\x71\x5d\x8d\xf2\xb4\x1c\x88\xcd\x3c\x66\x10\x54\x58\xb7\xb5\x90\xc2\x1c\x1a\xe2\xf6\xea\x9d\xde\xa7\x47\x0f\x25\xe0\x20\x27\xd1\x71\xe0\xe5\x74\xa2\xbb\x21\x64\x2f\x8f\x9d\xa5\x08\xe2\x1d\x8e\x73\x35\xb5\xac\xe5\x93\x52\x99\x40\x7b\xd1\xb0\x1b\xdd\x14\x23\x13\x3e\xf0\x45\x23\x4e\x70\x1f\x55\x54\x94\x34\xad\xe9\x4a\x60\xbe\x1e\x14\x06\xca\x5c\x75\x8c\x36\x79\x9c\xe1\x70\x30\x84\x47\x6e\x48\x4f\xb1\x74\x05\x30\xae\xe8\x42\x66\xd0\x7a\xdf\xb4\xcc\x68\x9f\x32\x65\x13\x3a\x59\xcd\xf9\x92\xfb\xb9\xa4\xb1\x2d\xef\xbe\x24\x1d\xdb\xf6\x5d\x12\xb2\xfb\xdd\xfc\x05\xaf\x0f\xb8\xde\x42\x08\x07\x75\xba\xd2\x9c\x6b\x04\x59\x84\x1c\xbb\x64\x8a\x9a\x95\xe4\x8d\x6e\x36\xac\x51\x44\x80\xa3\xde\xb4\xb3\x65\x54\xd8\xda\x62\x08\x08\xae\x9d\x47\x32\x97\x10\xd2\x0a\xaa\x6e\x5d\x7f\x54\x7d\x81\xad\x30\xf8\x4c\x0e\x3d\x23\x9c\xde\x5b\x16\x9d\x9d\xdf\x29\x48\x32\xd6\x7a\x80\x60\xba\x32\x9c\x4e\xf3\x9b\xe9\x4a\xc4\x64\x34\xdd\x21\x85\x93\x1d\x12\x31\xf9\xb6\xdf\x87\x8a\x5a\xf0\x83\x1e\x0e\x9d\x8a\x08\xd0\x80\x69\xde\xd6\xa9\x61\xef\x7f\x39\xfa\xd5\x01\xff\xd1\x7d\x6d\x9b\x7c\x65\x46\x53\xc1\xf5\x8f\xce\xe1\xa6\xcd\x80\x3d\x2a\xef\x16\x6c\x78\xef\x55\x14\xa3\x27\x6d\x69\x98\xdc\x7c\x09\xa3\xfa\x98\x2e\x42\x7c\x78\x5a\xa6\xa9\xe2\x56\xf7\xba\x72\xd5\xa6\xba\x33\xeb\x46\xf1\xf9\xfe\x9b\xe2\xbf\xc1\x41\x09\xf6\x47\x73\xc0\x0c\x06\x3b\x4d\x5c\xb4\xf4\xf8\xa0\xbe\xca\x92\xa9\xa0\x16\xc4\xf5\x40\xfe\xea\x9c\x3a\x31\xe3\x13\xbb\xcb\xc2\xff\x5e\xca\x99\x67\x85\x7f\x5f\x8a\x90\x9a\x29\xd7\xf2\x0d"}, +{{0x8b,0xde,0x3f,0xf6,0x1a,0x16,0x99,0x5a,0xb9,0xd5,0x39,0xf6,0x05,0x32,0x19,0x08,0x1b,0xca,0xea,0x1d,0x45,0x8e,0xc3,0x36,0x84,0xfc,0x1c,0x01,0xfb,0x56,0x5b,0xfa,},{0xcd,0x9d,0x78,0x2a,0x35,0x6e,0x84,0x7b,0x7a,0x04,0xc8,0x85,0xa9,0xb0,0x90,0x7c,0xc3,0x3b,0xa9,0x7a,0xd5,0x39,0x0d,0x4e,0xa5,0xfe,0xe5,0xeb,0x19,0x8d,0x08,0xb3,},{0x74,0x64,0xdf,0x0b,0x67,0xeb,0x90,0xb4,0xb7,0x3f,0xf0,0x82,0xad,0x0d,0x60,0xeb,0xfe,0x06,0x60,0xda,0xe9,0x70,0x69,0xb5,0x2c,0x37,0x27,0x22,0x3b,0xf7,0x0e,0x29,0xe4,0x87,0x11,0xa2,0xbb,0xb4,0x38,0xf5,0xf8,0xd8,0xa3,0x3b,0xb9,0xc4,0x8f,0xe7,0xb6,0x28,0xfa,0x8a,0x54,0x2f,0xf0,0xb5,0xae,0x36,0x26,0x9d,0x40,0x07,0xa5,0x05,},"\xa1\xf4\x0e\xc5\x80\x7e\x7a\x27\x06\x9a\x43\xb1\xae\xbf\xf5\x83\xef\x03\x70\x28\xc0\x2c\x85\x95\x25\xeb\x8f\xa4\xc3\xba\x95\xa9\x01\xff\x3a\xed\x78\xc4\xf8\x77\x52\xfb\x79\x55\x22\xf5\xbf\x71\x5b\xe7\xe3\xde\xfa\xc1\x0f\xcf\x17\xe3\xfa\x5c\x54\xb2\x00\x89\xa4\x72\x33\x33\x27\x25\x2e\xc9\x45\x71\x8f\xb4\x55\xe3\xf2\x7c\xcf\xde\xf8\x23\xd1\x2d\x40\x6e\x62\xa4\xae\xba\x3c\xb9\xd1\xc6\x1b\x2b\x17\xe4\x9e\x20\x0a\x84\x18\xf9\x35\xf2\x6e\xeb\x57\x60\x2c\x7a\xa3\xb3\xa2\x4f\x7e\x62\x38\xd3\xe0\x8d\x2d\x60\x9f\x2e\xad\xa0\x33\x2b\xc8\xcb\x12\x91\x6c\xb0\x3b\x0d\x4f\x9c\xd6\x02\x00\x25\x86\xd3\xe4\xcc\x7e\x0e\x03\x81\xc0\x45\xad\x2e\x1e\xe2\x82\x98\xae\x7f\xcf\x0c\x10\xf2\x12\x80\x85\x65\x29\x6f\x15\x8d\x2c\x32\xe8\xcb\x28\x15\x65\x81\xaf\x52\xbf\xc3\x47\x0c\x3c\x95\x82\x13\x8d\x22\x55\xe8\x42\x6d\x64\x8c\xa2\x37\xd7\xaa\xd2\x85\x6f\x17\x16\x38\x55\x82\x41\xd8\xae\x3f\x62\xba\x92\xdb\x59\x65\x68\xed\xee\x3e\xc0\xef\x37\x0f\x83\x62\x6a\xa0\x44\x5a\xf0\x8f\x96\x78\x63\x66\x0e\x8f\xba\x5a\x41\xc8\xe8\xed\xe1\xc9\x60\x51\x4a\x14\x68\x7a\x4a\x81\xe7\x76\xae\x0e\x8e\x77\x7f\xb0\xf2\x50\xd5\x1a\x83\xb5\x5f\x8c\x1f\xfd\xd7\x8d\xf3\xbd\xc9\x7f\xf1\x77\xaf\xec\xa0\x46\xc7\x2d\x72\xaf\x92\x4a\xd0\xd0\xab\x2b\xfc\x11\xb7\xf4\xab\xde\xd5\x1c\x39\x87\xa8\xbb\x94\xd6\x40\xc8\x71\x0e\x5f\xc9\xa4\x19\x0e\x8a\x00\x83\x63\xd7\x41\x9c\xea\x17\xc4\x0d\xea\x20\xea\x51\x56\x02\x9f\x3d\xeb\xf0\x52\x41\x91\x8f\x54\xaf\x50\x39\xe2\xc4\xcf\x2c\xa2\xe1\x39\xf6\x0e\x45\xcc\x65\x59\x5c\xdf\x54\xa6\x7d\x92\xb6\xac\x66\xfc\x0c\x5a\x29\x04\x95\xca\x57\xb0\x7e\xf5\x75\x0d\x05\xf5\x7d\x87\xd0\xc2\x28\xf7\xe4\xe1\x5a\xd0\xba\x01\x78\x73\x0f\x95\x1c\x69\x75\x83\x48\x1c\x66\xcb\xfc\xd4\x80\x32\x54\x4a\xa8\xd5\x09\x08\x30\x4b\xd8\x19\x40\x30\x87\x06"}, +{{0xda,0x59,0xbb,0xc5,0x23,0x40,0x4f,0x07,0x64,0x6a,0xdd,0x79,0x08,0x29,0x49,0x77,0xe4,0x66,0x45,0xbc,0x8a,0x38,0xba,0xd2,0x80,0x96,0x41,0xa2,0x3d,0xe3,0xb1,0x5a,},{0xb2,0x2c,0x0f,0x21,0xaa,0x1c,0x2d,0x45,0xf4,0xb2,0xe5,0x6c,0xc9,0xb5,0xe0,0x2f,0x9e,0x31,0xa2,0xea,0xa3,0x67,0xec,0xb4,0x82,0xf8,0x74,0xcb,0xd8,0xe9,0xfe,0x34,},{0x14,0x72,0x45,0x9c,0xbb,0xae,0x2c,0xf2,0x1c,0xe4,0x4a,0x15,0xba,0xe9,0xfc,0x85,0xdc,0xa4,0x0b,0x81,0x82,0xda,0x7d,0x52,0xcb,0xf5,0x6e,0xd5,0x38,0xd1,0x8e,0x03,0x47,0x7c,0x14,0x0a,0x3d,0xdd,0x0e,0xfb,0xa4,0x3c,0x96,0xaa,0x92,0xf5,0xf9,0xbc,0xdf,0x34,0x81,0x28,0x6c,0xe7,0x62,0xa7,0xe2,0xbd,0x1e,0x77,0x9b,0xa9,0x9b,0x0d,},"\x09\x71\x06\xc3\x62\x4d\x77\x4d\xde\x25\x51\xe0\xc2\x7e\x19\x50\x4e\x65\x18\xcc\x86\x36\x9a\xb2\x6f\xf8\x10\x96\x9e\x7d\xe2\x4a\xbc\x68\xb4\xb5\x3f\x11\xd9\x45\xd4\x9e\xf0\x78\xeb\x4f\x6b\xa6\xbf\x25\x7f\xf7\xb6\x08\xaf\xdc\xb3\x0a\x5c\x59\xa7\x56\xfd\x77\xa6\xc1\x24\x7f\x6f\x2a\x41\x10\x0d\x99\xfc\x52\x06\xaf\x3b\xcc\x6d\xe1\xd3\xe4\x96\x8e\x28\xfb\xa0\x12\x3f\x60\x45\xa1\xb5\x4d\x69\x3a\x42\xbd\xfa\x07\x1b\x2b\x91\x4b\x3c\x3c\x0c\x29\xb2\x59\x3d\x07\xe8\xbd\xc8\x6c\xa4\x2a\xc5\x55\xb7\xdc\xd9\x43\x9d\xf9\xfb\xd4\xbb\xec\x73\x0d\x63\x27\xbf\xae\x4f\xc4\x1e\xd4\x98\xb4\xf0\x4a\x0e\xb1\x4c\xee\x60\x82\x83\xaa\xa6\xe6\xaa\x46\x67\x6b\xc8\x8a\xed\x5d\x99\x39\x03\x7a\xad\x49\x15\x66\x1a\xf9\x4b\xb5\xf6\xe6\x53\xa2\xca\xc1\x23\x28\x70\x73\x27\x0e\x0b\x13\xfd\xa1\xdd\x48\x71\xaf\x6a\x92\xf9\x92\xf5\x39\xdf\x88\x17\x12\xfe\xfb\x03\x85\x40\xd4\x11\x91\x12\x3b\x6b\x3b\x4b\x6f\xf8\x7f\xfc\x92\x9a\x6b\xe5\x3c\x6c\xef\x02\xf4\x8f\x2f\x0c\xf2\xfe\x64\xa4\x5f\xd6\x60\x25\xcc\x2d\x7e\xe5\x5e\xbe\x23\x16\xc0\x00\x85\x56\x61\x16\x5e\x2a\x5b\xa4\x1a\xfc\x20\x97\x95\x7b\x6f\xe4\xc5\x52\x21\x20\x4b\x6f\xc1\xf3\x17\xdd\x3b\xa1\x3c\xac\x39\x92\x40\x26\xbd\xb6\x6b\xe4\x54\x22\x68\x87\x56\x31\xd2\x77\xf2\x10\x10\x7a\x33\x76\x7f\x6d\x95\x96\xe2\x57\x42\xd7\xa9\x0e\xa7\x91\xea\x4b\xc9\xee\x84\xa6\x7f\xd3\x28\xb8\x0f\x79\x1e\xde\x96\xd8\x96\x63\xe9\x37\xf0\xb7\x55\xba\xa9\xd5\x2b\xda\x21\x0c\xee\x1d\xb3\x39\xff\x1d\x3c\x4b\x00\x0b\x65\x3b\x9b\xde\x33\x80\x49\xaf\x84\x36\x4e\x21\x77\xf8\x0d\xd5\x1e\x2a\x16\x72\xee\x55\x5d\x63\x17\x58\x9f\x6f\x1d\x5a\xbe\x6c\x28\x77\x35\x8b\xf9\x4b\x0b\x80\x8f\xf8\x57\x36\x3f\xbf\xbe\x32\xe9\x73\x37\xe4\xb8\xa8\xc2\x21\xa9\xe7\x59\x62\xa8\xdc\x9b\x5a\x3d\x7c\xa5\xf9\xc9\xb6\x1c\x73\xc1\x46\x9a\x72\xbd"}, +{{0x40,0xea,0x82,0xda,0x41,0xfd,0x15,0xb0,0x6f,0xfe,0xb9,0x9c,0xd6,0x16,0xdc,0x6b,0xc8,0xc1,0xb2,0x14,0x77,0xea,0x23,0x94,0x66,0x08,0x8e,0x28,0x49,0xbf,0x10,0x16,},{0x59,0x10,0xe5,0x80,0xbf,0x41,0x2c,0x31,0xa8,0x74,0x51,0xd9,0xdd,0xf3,0x2b,0x3a,0xb7,0x13,0xf9,0xe4,0xa2,0x2c,0x59,0x0c,0x64,0x1c,0x14,0xa5,0xdf,0xbb,0xe0,0xd7,},{0xd2,0x98,0xfc,0xc9,0xa8,0xec,0xb7,0x6a,0x98,0xd4,0xa7,0x1d,0xfb,0x01,0xd2,0x76,0xab,0x2d,0x96,0x70,0xa9,0x5b,0xab,0x34,0xcf,0x1d,0x83,0x64,0x51,0x6d,0x1e,0xbd,0xb2,0x39,0x03,0x46,0x02,0x15,0x30,0x71,0x25,0xaf,0xd0,0x9c,0x75,0x8e,0x98,0x1a,0x45,0x2d,0xa9,0x5c,0x0a,0xc2,0xc0,0xb9,0x58,0xc6,0x91,0x7e,0x68,0x74,0x19,0x0d,},"\xa0\x6c\x4e\x02\xb8\x3a\xb7\xe1\x91\xad\x81\x8c\xb8\x18\x7b\x52\xa8\xda\x00\x4f\xe8\x38\xdb\x33\x3c\x4e\x02\x54\x8d\xb6\xbd\xf7\x91\x44\x46\x42\xe5\x7f\xdb\xc8\x59\x4e\x59\xd7\x02\x32\x80\xbb\xae\x82\x98\x6f\x39\x98\x05\x43\x4b\xb0\x72\xc8\xa2\x7a\x2d\xcd\x5a\xa6\x2f\x06\x5b\xc5\x8b\x06\x21\xfc\xd3\x65\xf6\xcd\xbf\x4d\x57\xd5\x77\xd9\x11\x50\x30\x1f\xa4\x8f\x18\x2f\x87\xe8\xdc\xa7\xce\x45\xa7\xd6\x48\x45\xff\x43\x4d\x1b\xab\x05\x34\xcc\xc8\x3a\xa0\x97\x4e\x88\xb3\x8f\xc2\x50\x8c\xef\xcb\xbc\x82\x13\x5b\x73\xb3\x84\xc8\x0e\xcc\xb8\xa0\x9e\x28\x73\xcc\x07\x12\x90\x21\xd8\x1c\xe1\x29\xa9\xdf\x65\xe6\x13\x41\x0a\xf9\x50\x19\x7d\xbf\x9a\xfc\x28\xed\xc4\xe6\x5c\x3e\x84\xda\x40\xd2\xef\x84\x1b\x88\x6b\xc4\x47\x19\xa5\xd5\x9d\xb2\xc6\xdc\x77\x64\x01\xc8\x95\xe2\xb3\xc8\x37\x83\xd7\x81\x7b\xba\x68\xba\xff\x59\x47\x0d\x60\x15\xbb\xa8\xd9\x75\xf0\xeb\x71\x2f\x3b\x89\x02\x91\x28\x05\x52\x3a\xa7\x1c\x90\x49\x9d\xe6\x89\xd3\x1a\xe4\x4e\x21\x0b\x84\x46\xf2\x48\x47\x27\xcc\x49\x1b\x92\xa8\xe8\xb1\x99\xd6\x28\xe1\xdf\x79\xa2\x8c\x56\x1e\x5a\x7d\x88\x2e\x30\x78\x7d\x08\xfb\x2d\x51\x96\xba\x61\x19\x63\x09\xb3\xbf\x0c\x58\x24\xa3\x54\x8c\x70\x00\x03\xfe\x99\x13\xbe\xfe\x12\x22\x31\x50\x01\x26\x85\xe9\x07\x20\xe9\xec\x6b\xc4\xdb\x60\x74\x25\xae\xc5\x31\xc4\xfa\x36\x08\x6d\x3b\x9b\xe3\x91\xa3\xf0\x46\x35\xa8\x07\x7a\x44\x7a\x16\xa6\xfd\x89\xaf\xbb\x9a\x72\xd0\xd3\x55\xcb\x0b\x22\xd5\x62\xf4\x3f\x59\xd4\xe3\x71\x28\xb3\xe2\xd9\x06\xc8\xae\x23\xd0\xaa\x59\x9c\x70\xd3\x77\x8a\x07\x6c\x1a\x39\x72\x8f\x1d\x69\x37\xbd\x48\xb9\x78\x74\x08\x50\x56\x61\x38\xd3\x48\x52\xb6\x30\x75\xe8\x9a\x8e\x22\x80\xed\xba\x6f\x4e\xe8\xf6\x15\x11\xe9\xb7\x68\xe9\x5c\x78\xd1\x97\xb6\x93\xb1\x09\xe8\x88\x18\xb4\x86\xa9\xdf\xdb\x74\xb4\xc5\x55\x0a\xcd\xfb\xd5"}, +{{0x28,0xbb,0x81,0xa1,0x7d,0x45,0x84,0x75,0x4d,0x52,0x81,0x8c,0xd0,0xf1,0xf2,0x1b,0xaa,0x77,0x7e,0x69,0x58,0x44,0xa1,0x51,0x22,0xac,0x05,0x34,0x4d,0xdd,0xc0,0x27,},{0xd5,0xf6,0x1d,0x51,0x99,0x44,0xd1,0x3b,0x84,0xbf,0xa7,0xcd,0x67,0xcb,0x0b,0xea,0x4e,0xf2,0x28,0x1e,0xfa,0x46,0x1f,0x22,0xad,0xe4,0xba,0x88,0x2d,0x11,0xb2,0x52,},{0x9c,0xe4,0x5a,0x07,0xdb,0xd2,0x8d,0x3f,0x6f,0x1b,0x35,0x63,0x0a,0x3f,0xd5,0x6f,0x1d,0x54,0x8f,0x84,0xff,0xb1,0xc6,0xae,0x64,0xb2,0x14,0x98,0xae,0x38,0xe5,0x96,0x91,0x6e,0x77,0xf7,0x99,0x05,0xe6,0x09,0xfb,0x1a,0xe0,0xda,0x36,0x13,0x8a,0x80,0xf2,0x42,0x12,0x21,0x67,0x06,0x80,0x92,0xcc,0x60,0x57,0x96,0xc5,0x66,0x9e,0x06,},"\x92\xe8\x4c\x7a\x55\xb0\xbe\xa0\x3e\x17\xcf\xb6\x5f\x70\x85\xce\x3f\x44\x5b\x15\x42\xba\xe9\x97\xde\x5f\x09\x2a\x24\xff\x24\x33\x80\x28\x6d\x13\x70\x91\xa5\x98\xf3\x5e\x6d\xae\x1a\x1c\x64\x8f\x5a\x49\x4c\x81\x9d\xfb\x24\x06\x52\xff\x90\x83\x81\xf3\x2d\x70\xbc\x51\x31\x00\xac\xa1\x6f\xe7\x22\x02\x95\xb1\xc7\x18\x35\xf1\x6d\x93\x10\xa9\xd2\x7a\x04\xa9\x80\xac\xe2\x97\xd5\xaf\x3f\x7c\xb7\xc7\x8b\x24\x99\x7c\xcb\x41\xf5\x4e\xcb\xab\x50\x7e\xb7\x3e\xa6\xa3\xed\x47\x0e\x49\x59\x05\x09\xf5\xd1\xe6\x03\x2a\x26\x05\xdb\x87\xf4\xa9\xb9\xec\x91\x60\x25\x83\xf1\x4e\x2f\xe1\xbd\xb9\x00\xec\xb8\x97\x11\x96\xb5\x5c\x0d\x43\x34\x89\xf2\x6b\xe9\xca\x15\x7c\xbd\x56\x57\x28\x87\xba\x85\x9f\x39\x67\x4a\x8e\x0c\xa0\x8f\x2d\xbb\x0f\x27\x07\x35\x51\xd0\xb1\x99\x06\x85\x17\x8b\x1a\xe9\xe7\x88\x54\x99\x14\x3d\x9d\x72\xc8\x57\x1d\x11\xe0\xd8\x5b\xf5\x8d\xf9\x4e\x2a\x74\xd9\xb6\x84\x65\x57\xf9\x12\x5c\xa0\x94\x4c\xe5\x71\x8d\x2c\xba\xe1\x67\x2b\xa0\x2b\x84\x7c\x17\xa6\xf6\xb4\x45\x63\x4d\x2f\x01\x75\xa7\x5c\xf6\x88\x3c\x62\xe5\xb5\x21\xc5\x71\x41\xf2\x18\xb2\xfb\x09\x94\xb3\x72\xa7\x16\xc4\xa2\x17\x43\x4b\xea\xb7\x57\x40\xb8\xe9\x1c\x62\x21\x87\xd0\x3c\x85\xda\x00\x1e\x00\x24\x73\x12\xa4\x65\x22\x5f\x5d\x6a\xf2\x32\x06\x4a\x42\x7d\x30\x18\x70\x0d\xed\x77\x4b\x90\x26\x77\x7a\x52\x75\xfc\x04\x75\x46\x06\xc8\x66\x00\x29\x7b\xf7\xb7\x1a\xaf\xf8\xb9\xa7\x46\x67\x7a\x36\x62\xf3\x75\x0e\x81\xb5\x01\x66\xf6\x23\x70\x00\x05\x1f\xfa\x15\x86\x8d\xef\xdf\x09\x00\x57\x72\x2a\xe2\x29\x96\x4a\x4e\xa0\x85\xe0\xdb\xc0\x4c\xe1\x99\x77\x22\xc5\xbb\x65\xd2\xb4\x7e\xcb\x74\x6f\xd8\x3a\x9f\x6a\x69\xc8\x15\x45\xa9\xb5\x02\xf5\xe7\x6d\x31\x30\xc5\xaf\xcb\x1c\x9a\xf9\x9d\x91\x87\x40\x83\x7c\xe8\x9d\x7c\xd2\x13\xfe\xf2\xfd\x06\x2c\xe8\x85\x0f\x69\x65\x9e\x4a\xd3\x27"}, +{{0x24,0xbf,0xd4,0xfc,0x45,0xd5,0x09,0x35,0x85,0x67,0x81,0x01,0xcf,0x56,0x3a,0xb8,0x01,0x1f,0xd6,0x43,0x0d,0xe1,0x55,0xf2,0xa4,0x25,0xf0,0x63,0x3e,0xe3,0xb7,0xcd,},{0x9c,0xf5,0xc5,0xfc,0x0c,0xcf,0xae,0xb2,0x8a,0x08,0xba,0x67,0x70,0x7b,0x18,0xdc,0x84,0xea,0x06,0x98,0xff,0xbd,0xbc,0x16,0x9a,0x09,0xc2,0x81,0x23,0xe6,0xc2,0xac,},{0xdc,0x93,0x5b,0x60,0xfd,0xe4,0x43,0x59,0xaf,0x8f,0x50,0xed,0x7f,0x91,0x9f,0x48,0x3c,0xe3,0xf2,0x4e,0x23,0x20,0xc5,0x5b,0xa9,0x2f,0x3e,0x76,0x17,0xc1,0x9b,0xfb,0x54,0x70,0x19,0x03,0xff,0x18,0x3b,0x42,0xcb,0xed,0xfe,0xf0,0x87,0x5f,0x42,0xb1,0x28,0x75,0xd3,0x6a,0x0a,0xee,0xc7,0x3f,0xfd,0x09,0x50,0x9d,0x92,0xb2,0x8b,0x0d,},"\xba\x54\x12\x8f\x45\xbe\x20\x01\xdb\xb0\x60\xd5\xdc\xc4\x71\x44\x99\x74\x15\xd4\x29\x4f\x6e\xba\x8d\xce\xba\x4f\x6c\xf2\x23\x46\x83\xc4\x26\x5f\x88\x03\x22\x05\x29\x6e\x9b\x27\xd6\x85\x06\x23\x2d\x57\xb6\x88\x40\x76\x48\xf8\x7c\xeb\x34\x20\x52\xbd\xe9\xd0\x06\x55\x42\xff\x17\x15\xc9\x42\x02\x7e\x67\x48\x2a\xf4\xbc\x27\x8f\xf7\x19\x66\xfb\x3f\x62\xa2\xa5\x32\x3c\xb1\xb4\xba\xe1\xe7\xb8\xfe\xdc\xbc\x73\xea\x05\xb4\x07\x64\x21\xb0\xb4\xfa\xe8\xbc\x33\x37\x41\x6a\x17\xfe\x12\x4e\x7e\xe4\x65\xeb\xb3\x8d\x87\x92\x30\x64\x29\xd8\x27\x9a\x1b\xd5\x4c\x37\xbe\xe8\xf9\xc8\x5e\xeb\xe3\xaf\xd1\xf6\x44\x89\xd4\xe5\x3a\xc5\xf5\x06\x57\xbb\x6f\xfb\x97\x12\x07\x44\xb7\x5d\x47\xc6\x22\x6d\x5a\x9c\x9c\x26\x4e\xe3\xe6\xa6\xde\xd0\x50\x62\xca\x10\x06\x66\x91\x18\x45\x45\x50\x01\x09\x19\xc2\x63\x3c\xf0\x86\x95\x03\x45\xe5\x14\xaf\x38\x43\x14\x8e\x5c\x64\x35\x2e\x69\x03\x7d\xfe\x60\xd4\xa8\xea\xb3\xeb\x8c\xb5\x4b\xd3\x9a\xf2\xf3\x53\xd5\xde\xd2\xe2\xbc\x8b\x11\xc0\x9f\x61\x2e\x12\x8c\x6e\xfa\x41\xf6\xeb\x2c\x95\x80\x87\xbe\x34\xc6\x33\x5a\x43\x00\x5d\x11\xa9\xd3\xb5\xa5\x29\xc2\xd1\xb0\x64\x2f\x77\xaf\xdd\x8c\x6b\x1d\x6f\xb2\xa9\xdc\xb6\x5f\x42\xf4\xec\xa8\xea\x9a\x05\x40\x58\xbe\x86\x13\x66\x76\x10\xe3\xee\xd8\xd1\xdf\x07\x39\xec\xa1\x71\x95\x41\x17\x98\x9d\x1b\x12\x18\x9a\xb5\x79\x04\xaa\x96\x0b\x0c\xa8\x55\x41\x74\x63\x85\xef\xa9\x85\xbe\x9d\x97\xb5\xa9\x02\x99\x89\xa9\xc7\x14\x98\xdf\xab\xdb\x81\x36\x81\xf5\x7e\x27\x6b\x64\xdb\x49\x1b\x8f\x08\x2a\x88\x51\x45\x46\x9a\x53\x1b\x7f\x9f\x04\xca\x0a\x2c\x2f\x8d\xff\x20\xcc\xb9\x9c\x28\x61\xf5\x4e\x5e\xaf\xa9\x62\xcc\x53\xea\xf1\x8d\x3d\x5e\x50\xd3\x37\xaf\x48\x5f\x19\x97\x5f\x05\x93\x07\x00\xa8\xa7\x25\x3f\x11\xf1\x84\x13\x0d\x0a\xee\x70\x96\x9d\x96\xfe\x08\xf2\x16\x95\x1d\x9d\xce\xd5\x23\x88"}, +{{0x2f,0xc2,0xf9,0xb2,0x05,0x0a,0xd7,0xd1,0x39,0x27,0x3e,0x93,0xe2,0xa0,0x45,0x1c,0x7b,0x5c,0xce,0x57,0x59,0x9a,0xa6,0xb0,0x8d,0x3e,0xdc,0x5b,0xb0,0x75,0x90,0xc8,},{0xff,0xe5,0xa1,0x78,0x80,0xd7,0x18,0xcc,0x79,0x88,0xc2,0xfd,0x98,0x25,0xb0,0x3b,0x93,0x45,0x0a,0xc1,0xde,0xb8,0xfb,0xd1,0xf1,0xbf,0x3b,0x8f,0x87,0x80,0x59,0x54,},{0x7a,0xff,0x16,0x2a,0x3c,0x0d,0x28,0xdf,0xf4,0x17,0x15,0xa9,0x74,0xaf,0x07,0xec,0xac,0x21,0x32,0xfc,0x18,0xbc,0x43,0xa1,0x98,0xfe,0x66,0x46,0x59,0x05,0x0d,0xa1,0x9a,0xe2,0x27,0x58,0xd5,0x2c,0x9c,0xbb,0x94,0xf1,0x35,0x8b,0xb0,0x26,0x10,0xa8,0xa3,0x51,0xc2,0x11,0x62,0x79,0xe7,0x24,0x5a,0xdf,0x69,0x67,0x5d,0xfd,0x36,0x0a,},"\xdc\x12\x97\x99\x0c\xc0\x27\xd5\x6d\x1f\xee\x26\x5c\x09\xbc\xf2\x07\xa9\x58\x3e\x6b\xab\x8d\x32\x47\x82\x28\xe0\xbc\x30\x5b\x98\x18\x15\x4c\x33\x8c\xee\xc3\x4b\x04\xc4\xad\xe7\xac\x61\xdc\xb0\x9b\xfa\xc8\xad\xe0\x0d\x1f\x29\xde\x31\x70\x60\xb8\xa4\xda\xf1\x98\x7d\xe4\x09\xca\x2c\x3f\xe4\x38\x00\x88\x07\x3c\xcf\x48\x5e\x9a\x69\x51\x6b\x5b\xbb\x41\x30\xf2\x0b\xe6\x9b\x2d\xd6\xa9\xb4\x65\x15\x9c\xca\x1a\xc8\x8b\x32\x8b\x80\xc5\x1b\x66\xaf\x7f\x4c\x50\xf6\x22\x87\x72\xf2\x87\x34\x69\x3c\xe4\x80\x5a\x41\x63\xdf\xf1\x4b\x4d\x03\x98\x11\xee\x3f\xce\x65\x93\x54\x44\xa6\xea\x9a\x72\xd7\x8b\x91\x5c\x9c\x3b\x76\x6c\x60\xb7\xe0\x32\x9e\x43\xc9\xc5\x7e\xde\x94\xb9\x15\x25\xce\x5a\x07\x5a\x72\x97\x21\x97\x72\xef\x3c\x02\x96\x49\xb5\x86\xa9\x5a\x73\xbb\xdf\x16\xd8\xfc\x20\x36\x8d\xe4\xba\x44\xde\x10\x64\xbe\x58\x26\xb3\x76\xbe\x31\xa8\x6c\xa4\x78\xa5\x2e\xfb\x98\xf1\xfa\x33\x31\x57\x71\x9b\xd6\xe0\xda\x80\xed\x68\xd0\xef\xea\xfe\xe5\xa1\x3b\xcc\x3b\x45\x75\x25\x25\x8f\x1f\x7e\x03\x1f\x7b\x40\x3a\x46\x15\x06\x92\x7b\x1e\x6c\x7d\x4a\x0c\x8d\x84\xb5\xf3\xdd\x0e\xb8\xbd\xb1\x3e\xdc\x2b\x51\x4a\x81\xd0\x88\xeb\x07\x7a\x52\xc8\xa8\x31\x86\x1f\xee\xe8\x11\x0e\x41\xa3\x25\xdc\xe2\x06\xb2\xd6\x7d\x25\xf9\x0e\xf5\x7e\x0f\xde\x70\x9f\x3e\x5a\x39\xc0\x4e\xed\x31\xe5\x7c\x19\x3b\x28\x3e\x2d\xa7\x27\x9e\xe3\xf1\xee\xd4\x82\xb3\xbb\xcd\x37\x39\x02\xc1\xdf\x81\x1a\xc3\x3e\x1d\xe0\x64\x29\xe8\xf8\x44\x3f\x60\x20\x19\x65\x0b\xdc\x2e\xe8\xd7\xf6\x50\x03\x6a\x7a\x22\xb8\xfd\x88\x51\x75\x11\x22\x9c\x72\x9a\x32\x69\xb3\xa3\xe8\xfc\x72\xb0\x1b\x5a\x4b\x3e\x33\xf5\x27\x2f\x3a\xd2\x16\x29\xd0\x8b\x1f\x71\x79\x35\xe9\xe1\x04\xad\xd2\xf0\xf2\x03\x34\x32\xbe\xc8\x2e\x21\x21\xd9\x8c\x9c\x1a\x58\xe0\xda\xba\x25\x53\x6a\x1b\xe8\xe5\x08\x83\x47\xf4\xa1\x4e\x48\xd8\xe3"}, +{{0x8a,0xfe,0x33,0xa0,0xc0,0x8a,0xa3,0x48,0x7a,0x97,0xdf,0x9f,0x01,0xf0,0x5b,0x23,0x27,0x7d,0xf0,0xbb,0x7e,0x4c,0xe3,0x95,0x22,0xae,0xc3,0xd1,0x78,0x16,0xe4,0x67,},{0xd0,0x04,0x37,0x0e,0x6e,0xdc,0x34,0xb3,0xe8,0x81,0x86,0x67,0x21,0x6f,0x5b,0x22,0x6b,0x0f,0xf7,0x5a,0x58,0x48,0x4c,0x86,0x16,0xe1,0xa8,0x66,0x44,0x4c,0xab,0x57,},{0x63,0xa8,0xae,0xac,0x02,0x5f,0x2d,0xde,0x9a,0x73,0x28,0x6e,0x56,0xc2,0xd6,0x2d,0xcb,0x79,0xa2,0x41,0xba,0x0b,0x2e,0x2d,0xba,0xca,0x87,0x52,0xed,0x2f,0xc8,0xcc,0x7a,0xb8,0xe6,0x60,0x0b,0x67,0x64,0x5f,0xb5,0xe8,0x18,0xa4,0xe8,0x2c,0x29,0x18,0x0a,0x6b,0x2c,0x3f,0x58,0xd0,0x99,0xcb,0x63,0x5c,0xe5,0x2b,0xdc,0x15,0x70,0x04,},"\x86\xfb\x74\x1f\x1b\x97\x08\x92\x91\x95\x03\x1a\xa1\x64\x5f\xb7\x09\xa8\xae\x32\x3f\xff\x85\xe5\x47\x01\x94\x45\x2e\x11\xb7\xb1\x27\x91\x94\xb5\xe2\x42\x7c\xe2\x3e\x1d\x74\x9c\x3d\xdf\x91\x0b\x01\x7e\x4f\x2d\xff\x86\xdb\xe4\x82\xc9\x1b\xd9\x94\xe8\x49\x3f\x2e\x68\x24\xbb\xa3\xbc\x7d\x7a\x84\x5f\x21\x7a\xe9\x76\x0b\x3c\xd0\x02\x26\xd9\xff\x26\x16\xd4\x52\x75\x1a\x90\xc3\xd0\xd3\xc3\x6d\x4a\xb4\xb2\x52\x0f\x67\x28\x81\x71\xbd\x3a\x34\xb2\xea\xca\xe8\xd4\x4c\x1e\x15\x3d\xda\x1f\x90\xbc\xd3\x59\x5d\xad\x37\x71\x3b\x8d\x34\x01\x56\xea\x90\xa4\xe1\x35\x95\x1b\xa7\x16\x9a\xc1\x75\x57\x8b\x81\xe9\x7a\x54\x1a\xb9\xbf\xb7\x63\x28\x79\x8d\x7d\x63\x1c\x14\xdf\x2a\xd6\x13\xe9\xc6\xe1\x14\x7a\x0e\x84\x06\x2d\xdb\xa0\x35\x85\x9d\x46\xba\xde\x5f\xad\xd9\xb3\x2b\x43\xda\xd4\x83\xc6\xb8\x02\x3b\x32\x39\x1e\x51\xef\x15\x20\xc6\x8c\x61\x91\x32\x6c\x49\x44\x23\x08\x0c\x62\x3d\xc4\xad\x0a\xa0\x74\x74\x8d\x82\x6c\x29\x64\x4c\x38\x98\x6a\x77\x00\x2f\x0c\xab\x90\x68\xe6\xc9\xec\x73\xcc\x2e\x0c\x58\x4b\x80\xe0\xbc\x37\x57\x21\xf7\xa8\xfc\x35\x31\x7a\x5e\x24\x0e\x8c\x66\x09\x2f\xb6\x30\x5b\x01\x2c\x70\xe1\x7a\xea\xff\x13\x38\x6d\x5e\x28\xd0\x64\x30\xca\x58\x5b\x0c\x85\xb2\x74\xe7\xfc\xbb\x63\xe3\x42\x3a\x98\x25\x79\xe5\xa6\x4a\x02\x62\xc4\x19\x08\xe5\x5d\xbe\x43\xda\xc1\xe5\xcc\x1b\xb7\x29\x8b\xe4\x28\x72\x0a\x12\xe3\xb0\x72\x55\x9e\xc2\x67\x5d\x45\x7a\xaf\x8f\x13\x25\x2e\x28\xaa\xd6\x3c\x15\x13\xf5\xf2\x39\x56\x4d\x36\x3c\x85\x05\xff\xa4\xe5\x0f\x66\x48\xc1\xcb\x82\xbb\xa8\x52\xbf\xf0\xac\xb0\x30\xcb\xe7\x3f\x05\x9d\xd8\x7b\xbd\x73\x18\xc5\x58\x6e\x70\x86\x18\xa4\xf4\xc9\xf3\xbe\xc3\xf4\xf0\x7c\x60\x9e\xeb\xb2\x4b\xa8\x78\xc6\xbf\x1e\x4f\x2d\x0f\xd1\x45\x0a\xb9\x4e\x31\x75\x52\x17\x78\x6f\xb1\x51\x82\x76\x0f\xfb\xe5\xa2\x67\xcb\xe9\x98\xa4\xff\x90\xa2"}, +{{0x6d,0xc7,0xcc,0xf3,0x29,0x37,0x8e,0x81,0x31,0xb6,0xde,0xfc,0xd8,0x93,0x70,0x30,0x10,0x68,0x94,0x63,0x36,0xb0,0xb7,0x62,0xac,0x5e,0xa5,0x14,0x87,0xdb,0xd3,0x9e,},{0x04,0xe9,0x0d,0x27,0x5e,0x79,0xdf,0x5f,0x2b,0x6e,0xf4,0xa3,0x15,0x05,0xaa,0xc0,0x5a,0x69,0x45,0x9b,0xaf,0x2c,0x58,0x1b,0x3c,0xe3,0xdb,0x29,0xf0,0xf1,0xfc,0x14,},{0x04,0x50,0x9d,0xb0,0x03,0xa1,0xa6,0xed,0x3f,0xbc,0xec,0x21,0xac,0x44,0xec,0x10,0xcc,0x06,0xd7,0x9f,0x27,0x14,0x96,0x08,0x82,0x17,0x03,0x16,0x27,0x5d,0xf8,0x04,0x23,0xa1,0xc1,0xa1,0x12,0xd8,0x81,0xfc,0x24,0xd2,0x81,0x25,0x26,0x07,0x90,0x58,0xaa,0x8b,0x60,0x8b,0xfc,0x6b,0x5e,0x57,0x63,0x22,0x40,0xc6,0x36,0xd6,0xeb,0x00,},"\x20\xce\xbb\xe9\x84\x01\xac\x89\x34\xc3\xe6\x5a\x57\x38\xcb\x0e\xc0\xcd\xc7\x5f\xdb\x09\xdc\x96\x31\x28\x94\xb1\x87\xc0\xa4\x6d\x2c\x38\xf4\x85\x5b\xe3\xee\xcc\xdc\xdc\xc5\x6d\x92\x6a\x8c\x08\xce\x6e\x74\x8e\x2a\x85\x8f\x53\x53\x2e\x7e\x5f\xc5\xf7\x01\x4c\x8c\x6f\x86\x31\x0c\xc2\x6e\xfe\xf3\x0a\xe5\x25\xa5\x15\x79\x40\xab\x53\x5e\xd8\xe4\x03\x11\x2b\x08\xe3\x5e\x2b\xb3\xdd\x91\xa9\xae\x8f\x77\x2d\x2a\xff\x37\xd8\xc4\x0d\x2b\x5c\xc8\x87\xa6\xf1\x50\x50\xa0\xf5\xbc\xf0\x36\x0c\x3a\x9d\x12\xd5\x91\x86\x55\xed\xc3\xc1\x3c\x86\xba\x6f\x4a\x2f\xa3\xbf\xcd\x40\x5e\xd3\x8f\x87\x1c\xf7\xdf\xf0\xf7\x5d\xaf\x2c\x32\x10\x84\xee\x9f\xa8\x12\x11\xad\xb1\x05\xb2\x5c\x22\x88\xf0\xf2\xf7\xf9\x3e\xf6\x56\xb2\xde\x19\x01\x22\xe7\xa4\xbf\xd4\xa1\xbd\x98\x93\xa8\x48\x5b\x50\x9f\xf0\xbc\x46\xcc\x96\x10\x51\xc1\xdb\x5a\x12\x49\x0c\x7e\x74\x19\x22\xcc\xc0\xa6\x65\x49\x64\x70\x27\x6f\x69\xc7\xb7\x70\x98\xc1\xe6\x70\xaf\x6b\x9f\x85\x12\x52\x99\x68\x75\xeb\x80\x35\xa8\x17\xfa\x9b\xe0\x7f\x2b\xe0\xbb\xb1\x20\x25\xe0\x56\x54\x14\xc8\x17\xe9\x42\x1a\xc7\x00\x37\x38\x93\x86\x2f\x24\xcb\x16\x5f\x9a\x27\x1a\x64\xfd\x23\x05\xc6\x67\x2c\x46\x76\x7f\x8f\x07\x5b\xe5\xd2\xd4\x07\x9b\xfa\xdc\x39\x56\x28\x8b\x02\x15\x60\x53\x11\xb5\xbf\x32\xf0\x03\x7b\x7c\x5a\xd5\x02\x01\x3e\x82\xae\x34\x19\xd9\xd8\xf3\x9c\x54\x5b\x58\x88\xf4\x71\x06\xc9\x4d\x5f\xd6\x08\x4d\x26\x03\x4a\x99\xf5\xdc\xbf\x26\xa8\x4e\xb4\xee\x14\x9c\x62\xa0\x41\x0d\x8c\x70\x7b\x1a\x9b\x07\x1f\x74\xed\x23\x93\x25\x85\x07\x2c\xe6\xcb\xd3\x3d\x4d\x54\xee\x91\x79\x16\xf5\xdf\xc6\x4d\x26\xa4\x98\x01\x84\x38\xb4\x55\x73\x93\x45\xdd\x60\xae\x0f\x47\x50\x62\x59\x15\xcc\x82\x9a\xb6\x82\x2d\x6f\x05\xf6\xd2\xbd\xa0\xa7\xbf\x56\x01\xe9\xa2\xed\x6d\xe9\x60\x37\x1d\x17\xe6\xf4\x37\x09\xc9\x67\x8c\xa7\x43\xad\xfb\xdb\x45"}, +{{0xcc,0xae,0x07,0xd2,0xa0,0x21,0xfe,0x3e,0x6e,0xe2,0x38,0x36,0xa7,0x11,0xb9,0x7b,0x04,0xe0,0xa4,0x41,0xf1,0x69,0x60,0x75,0x72,0x73,0x1c,0xb0,0x8c,0x26,0x94,0x88,},{0xa3,0x22,0x65,0xe5,0x32,0x8a,0x4f,0x49,0xcf,0x06,0xb4,0x67,0xa9,0x8b,0x9f,0x9d,0x5b,0x99,0x7b,0x85,0xdf,0xb7,0x52,0x3c,0xa6,0xa0,0xa1,0xd6,0x27,0xd3,0x28,0x91,},{0x0e,0xec,0x75,0x41,0x05,0x44,0x7f,0x97,0xd4,0xa9,0xcd,0x24,0x6c,0x7e,0xed,0xe3,0xfd,0x06,0x90,0x18,0xf0,0xd0,0x1a,0x41,0xdf,0xab,0xca,0x3e,0x90,0xa7,0x41,0x83,0x5e,0xa4,0xa9,0xd6,0x82,0x34,0x22,0x67,0xb2,0x50,0xfc,0x1c,0x8c,0x54,0x7c,0x89,0x63,0x2d,0x9f,0x68,0x9a,0xf5,0x36,0xc7,0x92,0x90,0x04,0xde,0xd0,0xd9,0x6f,0x09,},"\xa4\xbf\x82\x97\xd0\xdc\x5e\x4c\x92\xbd\x00\xad\x5b\x9c\x09\xb1\x23\x8b\x50\x3d\x61\x91\x16\xef\x74\x26\x03\x78\x34\x9a\x92\x82\xb4\x1f\x3f\x46\x76\xa6\x21\x5e\x3c\xe6\xd0\x22\x38\x48\x0a\x96\x04\x3b\x29\x42\xb3\xfe\xed\x12\x62\x0b\x1f\xa9\x7f\x77\x03\xb3\xeb\x68\x3c\x16\x01\xbd\x2f\x51\x82\x5c\x45\x0d\xf4\xfd\x1f\x33\xb0\xbf\x9c\x23\xc0\x32\x23\x78\x9e\x06\xe2\x4c\xf1\x36\xd3\xb5\x57\x40\x3a\x66\x98\x1f\x4b\x77\x7d\xcf\xe8\x90\xd2\xba\x96\xda\x4a\x47\x42\xae\xed\xdd\x6a\x61\x1d\x05\xfc\x21\x56\x94\xa5\xd8\x9a\x5d\xe6\x76\x0b\x1d\x94\x15\x15\x50\x44\xc0\x49\xcb\x02\x29\x1a\x15\x14\xfa\xa2\xe7\x7d\x2a\xe3\x3d\x44\x58\x5b\xda\xc6\x36\x5b\xf4\x81\xd9\xc9\x78\x33\x93\x7e\xab\x63\x6e\xd6\x57\x42\xa0\xd5\x97\x3b\x24\xd5\x40\x89\xb2\xda\xf0\x84\xd5\x41\x47\x65\x10\x5e\x4e\xca\x14\xaa\xad\xd1\x05\x33\x38\xa8\x47\x05\x05\x23\x2e\x4a\xc6\x33\x34\x5c\x5c\xde\xe1\xe4\x65\x3d\x1d\x93\x58\x3a\xf1\x18\x54\xb1\xd9\xb6\x5f\xc2\x02\x81\x83\x8c\x56\xdf\x11\x48\xf3\x5c\xcf\x9b\xfe\x2f\x3f\x80\xab\x73\xf5\xb7\x91\xcb\xed\x2d\x92\x06\x44\xcf\x03\x16\xf0\xcb\x5d\x36\x62\xb9\x12\x06\x47\xda\x56\xaf\xbe\xb4\x7a\x95\x29\x53\xbc\x1a\x37\xde\x85\x7e\x4b\x39\xfd\x92\xb6\x32\xb8\x51\x59\xf4\x6c\xd0\x5b\x6a\xbc\x23\x38\xd4\x63\x2d\x48\xe9\xa1\x78\x86\x0d\xe8\xf6\x5d\x9b\xc2\x3f\x24\x50\x7b\x7c\x56\x29\xe0\xbd\xaa\xc0\x67\xc4\x76\xc9\xc3\x94\x1d\x86\xf7\x88\x94\x4d\x74\x48\x52\xa6\x1d\xa7\x16\xf9\x5f\x3b\x04\xf0\x78\x3a\x56\x29\x41\xbc\xdd\xa4\x39\x59\x0f\xd1\x86\xb2\xa8\xeb\xf1\x9a\x5a\x7e\x4f\x4a\x3a\xaa\xb7\xa8\x7a\x43\x45\x24\xfb\xc9\x79\x9c\x99\x31\xeb\x8c\xe4\xe3\x4e\x99\xb6\x08\xca\xc9\x4a\xb7\xe7\x44\x95\x66\x8d\xf1\x36\x18\x5f\x48\x7d\x9f\xbc\xb6\x60\x5a\xd7\x25\x34\x54\x03\xec\x57\xf3\xf6\xdb\x36\x4a\x87\xf3\x8f\xea\x4b\x4c\x27\x15\x52\xe9\xf2\xe4\xa1\xbe"}, +{{0xdb,0x5d,0x5f,0x41,0xfd,0xdd,0x67,0x68,0x70,0x97,0x47,0xab,0x82,0x39,0xbb,0x4f,0x42,0xa3,0x1d,0x34,0xb4,0xfa,0x88,0x82,0x4d,0x94,0xbf,0x78,0xd3,0x14,0x92,0x64,},{0x03,0x85,0x8c,0xe6,0xb2,0xd2,0x40,0x79,0xee,0xad,0x66,0xca,0x0d,0xfe,0x77,0x2e,0xcd,0xa9,0xaf,0x4d,0x46,0xbc,0x9b,0x5e,0xdf,0xdc,0x28,0x6b,0x95,0xfe,0x97,0x16,},{0x5b,0x3d,0x0d,0xa7,0x10,0x23,0x55,0x48,0x6b,0xe4,0xd6,0x9c,0xfd,0x65,0x88,0x6c,0x9d,0x9c,0x87,0x38,0xb2,0x93,0xca,0xfb,0x23,0xb2,0x10,0x4b,0xfd,0xac,0x8d,0x7d,0x01,0x29,0x8e,0xeb,0x18,0xfd,0xe3,0xde,0xd6,0x49,0x1d,0x41,0xb4,0x19,0xcc,0x66,0x37,0x52,0xc4,0xe6,0x7d,0xbe,0x89,0x86,0x83,0x3d,0x20,0xe4,0xef,0x34,0x18,0x0b,},"\x67\xee\x03\xde\x45\xc3\xe7\x03\x0d\xb5\x24\x6e\xe5\xb5\x1b\xf2\x98\xbb\xa3\xe4\xd0\x93\x49\x37\xfc\x12\xd9\xa6\x29\x60\x4c\x53\xc0\x70\xe3\x0d\x61\x19\x99\xa9\xcd\xda\xf2\xd9\xac\xda\x6a\x9f\x67\x20\x2b\x35\x23\x69\xd4\x82\x60\xee\xbc\xe0\xe7\x8e\x4d\x5a\xe5\x4f\x67\x75\x21\xf8\x4a\x7b\xe0\x01\x7f\xab\x27\x8b\x2b\x57\x27\x5e\xfc\x5f\xa5\x7c\x61\x71\x86\xfc\x1b\xa4\x9e\xdf\xbd\x33\x08\x63\x48\x78\xd8\x64\xf2\xda\x15\x83\xca\x8d\x56\xce\x9f\xae\x77\xc4\x62\x03\x9a\xbc\x32\xd0\x53\x9c\x0a\x60\xb7\xbb\xba\x50\x29\xe9\x32\x9d\x27\x56\x83\xd9\xc4\xce\x77\xd0\xb9\x08\xad\xe9\x8b\x0e\x32\xb4\x42\x0d\x9a\xee\x2c\xc1\x0e\x4b\xe9\x22\xf9\x57\x25\x82\xdd\x89\x67\x14\x1c\x1d\x40\x2e\x21\x5f\x20\xae\xe0\xa8\x90\xe2\x36\x8e\x40\x6d\xea\x11\xbd\x11\x17\x7f\x2e\x03\x8a\xa2\xf1\xa0\xdf\xf5\x1a\x12\x8d\x95\x5d\x5e\x5f\x8d\x5d\x00\x09\xaa\xa8\x24\x40\xa9\x68\x64\xd6\xc6\x97\xf9\x10\xd1\xdf\x23\x0f\x46\x7f\x0e\x02\xa2\xe0\x2b\xf9\xe4\x5d\xa9\x5f\x25\x54\x10\xcc\x5a\xab\x8d\x85\xf4\x49\xa5\xde\x99\xaa\xbd\x44\xfd\x76\x3e\xc1\x46\x29\xf3\xdb\xab\x1a\x24\x7b\xff\xb7\x17\x46\x48\xe4\x3b\x9f\xb1\xeb\x0d\xf5\xe4\x10\x9b\x7a\x88\xe0\x55\x12\xb2\x08\x65\xba\xd3\x9f\x9e\xa7\x9d\x52\xf5\x18\x8e\x7c\xa5\x19\x44\x05\xbf\xb1\xa0\x97\x27\x61\x7f\x3f\x6c\x88\x19\x20\x08\xed\xbc\x0c\x65\x85\xdb\xf2\x61\xf1\x49\xdf\xfb\x59\x3d\x42\x71\x6e\x5a\x57\x77\xf5\x46\x2b\xee\xb1\xe9\xa5\x6a\x2c\x76\xe6\xcb\x73\x51\x17\xcc\x11\x83\xa3\x8d\x1e\x00\xb3\x03\xd1\x74\xaa\x9c\xf5\xc7\x31\xb2\xc7\x0e\xdd\x79\xcc\x5d\xc9\x6f\x40\x18\xf1\xd7\x1d\x71\x98\xbb\xb7\xd1\x34\xcd\x2f\xf8\xc1\x5f\x9a\x04\x28\x0d\xb2\x6a\x8f\xa9\x99\x7e\xb8\x6b\x13\x3c\x02\x2e\xda\x15\xd8\xad\x5e\x77\xcc\x9f\x62\x61\x59\x60\xba\xc2\xf9\xbb\xc3\xeb\xbd\x19\x8f\x72\xc5\x72\xb9\x71\x56\xfa\x7f\xa2\x29\xa9\x80\x14\xe1\x70"}, +{{0x7f,0x04,0x8d,0xfc,0xc2,0x65,0x0c,0xda,0x59,0x49,0x1d,0x4c,0xe2,0xb2,0x53,0x3a,0xec,0xc8,0x9c,0xc4,0xb3,0x36,0x88,0x51,0x94,0xb7,0xad,0x91,0x7d,0xb5,0xcd,0x14,},{0x08,0x00,0x1b,0x5d,0x40,0x95,0x8b,0xcb,0x27,0x0b,0xee,0xa9,0xba,0xba,0x33,0x87,0xe3,0xa4,0xb9,0x00,0xfc,0x42,0x27,0x56,0x57,0xc6,0xc6,0x91,0xa2,0xe2,0x64,0xf2,},{0x58,0x33,0x70,0x97,0x1d,0x24,0x65,0x2a,0xd2,0x13,0xc4,0x26,0x15,0x91,0x19,0x38,0xfa,0x9a,0xa3,0xd9,0xb7,0x19,0x69,0x40,0xe6,0xeb,0x08,0x15,0x12,0x00,0xc7,0xb6,0x72,0x9d,0x1e,0xff,0x8f,0x4f,0x09,0x04,0x07,0x4d,0xab,0x3d,0xdd,0xa6,0xaf,0x1e,0x4e,0x56,0x2b,0x7d,0x62,0x20,0xc1,0xa5,0x62,0x68,0x3b,0xea,0xb2,0x68,0xf8,0x0e,},"\x91\x75\x19\xcd\xb3\x35\x19\x68\x0b\xca\xe0\x4f\xaa\x79\x07\x71\xce\x7d\x13\x97\xc3\x45\xf1\xb0\x3d\xd7\x62\x57\x76\xf3\xf1\x95\x80\x99\x32\x61\x8b\x1c\x64\xac\xd9\x3a\xd0\x00\xea\xd0\x96\x54\xa3\x3d\x14\xf7\x48\xb4\x6b\x67\xaa\xe0\xff\x12\xdf\x3c\xc1\x63\x28\x0f\x47\xce\xdc\x16\xa8\x57\x90\x34\xe4\x98\x84\x29\x67\x72\xec\xbd\xbb\x71\xca\x29\xc1\x66\x23\x35\x33\xc8\xde\x54\x01\x2b\x41\x2c\xa1\x3c\xc2\x58\xf7\xc5\x46\x5d\x83\x42\x2f\x52\x4e\x4c\x05\xf8\x06\x31\x34\x78\x31\x9f\xd1\x43\xcf\x50\x88\xe6\x98\x37\x69\x7d\x36\x15\xd8\x0a\x7f\xa7\xe7\x44\x3f\xca\x65\xe7\x53\xac\x1b\x11\xd8\xef\xf3\x47\x66\x36\xae\x02\xd7\xa2\x0f\x4b\x23\x88\xda\xd6\x84\x00\x2f\x5c\xe9\x57\xca\xdd\xd2\x05\x3d\x0e\xd5\x33\x13\x2a\x81\xca\x19\xbb\x08\x0b\xd4\x3b\xe9\x32\x02\x8c\xb5\xf6\xb9\x64\xf0\x08\xb5\xb1\xc1\xc5\x99\x3b\xc9\xb5\x48\x5b\x22\xbb\xef\x70\x1f\x0a\x26\xa3\xe6\x75\xea\x31\x12\x2b\xba\xe9\x1d\x86\x4b\x54\xd8\x95\xaf\xdc\x79\xca\x58\xd4\xfe\x44\x92\x13\x35\x3b\x14\x9f\x31\x43\xb5\x14\x4d\x74\x7c\x5b\x46\x97\x47\x9a\xe6\x85\x28\x48\x53\x84\x04\x4a\xa2\xc9\x9b\xa4\xb1\x7b\x18\x4e\x94\x98\x22\x69\xbd\xe2\xde\x0b\x17\x70\x5d\x0b\xfc\x46\xd6\x90\x6a\x90\xed\xef\xe8\x91\x95\xde\x6b\xb8\xf3\xfb\x6a\x37\x41\x86\xc7\xcd\x08\x6d\x13\xd1\xb3\x52\x5a\x39\x94\xdc\x80\x20\xe1\xa0\x05\x54\xac\x8a\x82\xd6\x04\x7c\x5b\xff\x5e\x7f\x12\x45\x0f\x48\x65\xda\x16\x1e\x1a\x02\x1f\xd9\xbe\x8b\xd3\x3a\x32\xbb\x54\xa4\xdd\xf8\x74\x51\x2e\x74\xb5\xcf\xd3\xfc\x3c\xd9\xac\x11\xed\xd8\x78\x43\x36\x68\xe3\xfc\xc7\x82\xb9\x7b\x6d\x90\x5a\xdb\x0e\xbe\xc4\x2c\x92\x54\xac\x90\xf3\x58\x22\xc0\x0f\x97\xff\x3f\x0c\x7c\x39\xed\x3c\x7c\xb3\x92\x0f\x56\x08\xbb\x45\x83\x8b\xb2\x42\xa5\x2a\x86\x37\xd7\xce\xcd\xcf\x48\x9f\xa1\x83\xb4\x54\x51\xc6\xc9\xfc\xbb\xbf\x91\x4f\x5f\x7e\x6b\x22\x3b\xcb\x46\x75"}, +{{0x9f,0xeb,0x3d,0xf8,0x8c,0x49,0x4a,0x99,0x84,0x9c,0x6f,0xca,0x19,0x42,0x01,0x47,0x7a,0x2f,0xa7,0x56,0x4e,0x29,0xfb,0x06,0xcb,0x44,0xc1,0x15,0x4e,0x8c,0xea,0x3a,},{0xc3,0x56,0x28,0xca,0x6e,0xe2,0x8e,0xc1,0xc2,0x39,0xdd,0xc5,0xbb,0xa2,0xa9,0xe0,0x9e,0x48,0x46,0x81,0x6b,0x14,0x3c,0x74,0xdf,0xa2,0xae,0xc1,0xf6,0x25,0x51,0xb6,},{0xa1,0xc2,0x60,0x78,0x35,0xbe,0xc1,0xa1,0xd8,0x78,0x72,0xfd,0x8e,0xe4,0x88,0xd0,0xae,0x9e,0xd2,0x3d,0x49,0xfd,0x67,0x86,0xfc,0x49,0x96,0x72,0x5e,0x49,0xb3,0x26,0x21,0x18,0xba,0xbb,0x48,0x34,0x87,0x7c,0x7f,0x78,0xfb,0xea,0xc0,0x2d,0xf4,0x0a,0xb0,0x91,0xb8,0xb4,0x20,0xdc,0x99,0x51,0x38,0x1e,0x3b,0xcd,0xa0,0x67,0x05,0x02,},"\x95\xfb\x75\x81\xbd\x25\xff\xd4\x42\xc3\xae\x38\xa1\x9b\xea\x73\x49\xc7\xb7\x68\x3b\xa6\x76\x7e\x14\x8f\x0a\xfc\x15\x37\x3f\x67\xc1\x6d\x47\x17\x81\x20\x2e\x6d\xa8\x05\x4e\xd7\xfb\x9e\xe2\x04\xcc\x0f\x63\xc2\x10\xa6\x70\xa5\xf9\xce\xd4\x29\x45\x88\x19\x63\x30\xd3\x1b\x8e\x83\x92\xbe\xf6\xb4\x8f\xe3\xc9\x20\x78\xfa\xe1\x12\x84\xb4\xc3\xba\x20\xd9\x37\xe2\x71\x9d\xe7\xbf\x67\xc0\x06\x69\xad\x23\xe6\x13\x84\xeb\xdf\x8c\x6e\x60\x73\x54\x28\xc0\x84\xfe\x21\x7f\xdb\x47\x09\xcc\xb6\x08\x3f\xc0\xae\x4a\x05\x27\x3e\xef\x73\x90\x23\xd3\x4b\xb7\x3f\x66\x2d\xac\xdf\x11\x0b\x6d\xbd\x3e\x74\xfc\x14\x91\xe8\xc9\x65\x96\x07\x5f\xae\x5c\x36\xaa\xbe\x2a\x0a\x53\x05\x2b\xf7\x7c\x44\x62\x43\x80\x63\xaa\x7b\xc0\xc5\x0a\xb9\x20\xc9\xeb\x28\x86\x71\x56\x0c\xa5\xba\x7a\xf4\x4a\x53\xdb\x2e\x2f\xf4\x3c\xa5\x60\x69\xea\x55\x17\xcb\x21\x4e\x76\xfa\xa5\x3d\xbd\xa1\x00\x00\x3c\x4f\x61\x75\x41\x40\x41\xbe\x74\xde\x22\xce\x15\x5d\x22\x81\xb6\xf4\x03\x5b\xe3\x98\x41\xaf\xdb\x96\xdd\x89\xaa\x80\x8e\x68\x65\xba\xe6\x2d\x6b\xed\xd9\x19\xd3\xe8\x65\x10\xb9\xfa\x5f\xed\xd1\x97\x7c\x41\x31\xb2\xb8\x6e\x0f\x48\xd7\x21\x5e\xb1\x3d\x54\x98\xca\x5d\x23\x68\xf8\x18\x95\xed\x85\x5a\x52\x71\x24\x65\x7e\xc9\x53\x9e\xfe\x3b\x24\x99\xa3\xb0\xb3\x38\x26\x2f\x26\x34\x0e\x22\x55\x4c\x79\xf4\xfa\xd2\xb4\xe4\x19\xc7\x0b\xc1\xa2\x10\x7d\x20\x64\x56\xb6\x36\x87\x81\xbe\x4b\x5e\x2c\x54\xda\x42\xd3\x36\x04\x0f\xb7\xba\x49\xc3\x2d\x75\x23\x21\xad\xcd\x92\x98\x6e\x78\xbe\xdb\x22\x6c\xea\xc5\x02\x92\x08\x9b\xb5\x79\x02\x7f\x70\x22\x17\x74\x5a\xfe\x06\xa5\xbe\x13\x6b\x39\x98\xa3\x60\x4c\x9f\xf2\xac\xd6\xfa\x3f\x3f\x71\x63\x3d\x31\x02\xfb\xf0\x30\x47\xc5\x48\x6f\x84\xc4\xdc\x24\x47\xd8\x63\x79\x63\x83\xd5\x5f\x08\xc9\x81\xfd\x4d\xd7\xdc\x1c\xb7\x2b\x8b\xa4\x43\x5a\xf6\xab\xdd\x74\xe6\xf6\xe6\x79\x8f\x1a\xe2"}, +{{0xbf,0xf6,0x89,0x55,0xdd,0x6a,0xe0,0xe8,0xba,0x85,0xab,0x0d,0x0c,0xda,0xf0,0x4a,0x9f,0x5b,0xef,0xd5,0xef,0x60,0x14,0xf4,0x99,0x94,0xa7,0x83,0x63,0xdc,0x17,0xf7,},{0x0a,0xd9,0x49,0x3a,0xf8,0x0b,0x15,0xf0,0x7a,0x52,0x1c,0xcd,0x67,0x4f,0xe9,0xe5,0x21,0x2a,0x4a,0x28,0xc1,0x7c,0x74,0xf6,0x60,0x5f,0xfe,0xf7,0x8a,0x4a,0xed,0x72,},{0x93,0x19,0xee,0xf7,0x40,0x63,0x3a,0xda,0x1a,0xf0,0xe1,0x37,0x64,0x4c,0x61,0xfb,0x3e,0x11,0xba,0x4b,0x01,0xd3,0xc6,0xf2,0x53,0x92,0xdc,0x93,0x67,0x87,0x2a,0x23,0xbe,0x56,0x31,0x0d,0x31,0x2e,0xfc,0xb9,0x1b,0xdb,0xab,0x78,0xa7,0x5e,0x57,0x6e,0xbe,0x90,0x81,0x97,0x24,0x15,0xf5,0x62,0xdb,0x41,0xba,0xf5,0xe2,0x33,0x8b,0x07,},"\xd8\xf5\x65\x0a\xa3\x58\x1c\x4d\x39\xbd\x1b\x8a\xfc\x96\xc1\xad\x7c\x4b\xf7\x23\x42\x6f\x9d\x7f\xab\xd1\xa5\xc8\xac\x1d\x2f\xe5\x4a\x97\x1f\xac\x76\x5e\x05\xaf\x6e\x40\x7d\x72\x69\xba\xb6\x61\xb3\x43\x22\x92\xa4\x84\xf9\x52\xc1\x10\x95\xbb\xd2\x0a\x15\xd7\x7c\x41\xf8\xf3\x73\x1a\x50\x4d\x51\x8e\xe1\x0c\xd0\x06\xc9\x6e\xe5\x73\x72\xde\x5b\xea\x34\x8e\xc8\xba\x15\x91\x62\x17\x0c\x63\xe9\x70\xf1\xc7\xa3\x46\x5a\x3d\x59\x2e\x1d\x56\xc6\x54\x0f\xbd\xb6\x02\x28\xe3\x40\x90\x96\x46\x32\x0c\x95\xf2\x56\x98\xcd\x48\x96\xbd\xff\x58\xe2\x56\x1e\x3b\x3d\x9a\x73\xb8\x97\x47\x91\x2a\x1c\xf4\x67\xd6\x3e\x41\x45\x5f\xda\x77\x47\x7f\x46\xfe\x69\x37\xbb\x0e\x79\xd9\x2c\xcd\x52\xe8\x2d\xba\x90\x8a\x05\xa5\x7c\x7e\xcf\x49\x55\x4a\xb4\x4c\x0b\x71\x8e\x3b\xdd\x5f\xc0\xbf\x70\x70\xd9\xc5\x8f\x86\x05\x91\xc1\x8b\xca\x8b\x3a\x9a\x14\x8a\x06\x54\x8e\x0f\x01\x60\x2b\x1e\x6f\x68\x60\x37\xc9\x4f\xf7\x32\xe1\x55\xd5\x2d\x5b\x0b\x44\x70\x3b\x3d\x11\x16\x3e\x3f\x56\xe3\xb9\xc1\xb8\x64\x76\xe4\xdc\xbf\xc5\x3f\xa0\x59\x84\xe8\xc7\x5d\xd2\x18\x43\xcf\x96\xf9\xe4\x94\xab\xba\xe7\x18\x4a\xa4\x27\x36\x63\x3e\x38\x11\xae\xff\x40\x2b\x2f\xcb\x7d\x7f\x70\x2e\x44\x72\x41\xe2\x2a\x58\x84\x2f\xd6\xd0\xc0\x3d\x33\xff\x5b\x8c\x79\x22\x00\xe1\x73\xda\xa7\xb2\x17\xe4\xb2\xf4\x43\x3e\x6c\x02\x0a\xcc\xe5\x01\xb9\x32\x3a\xa0\x24\x11\x44\x43\x4b\x08\xe9\xd2\x46\x91\x39\xff\x67\x34\x22\x08\x90\x05\x46\x20\x0f\xd9\x71\xa6\x5d\xbd\x6d\xb6\xc2\x1e\x3e\xf9\x17\x2a\xbb\xa1\xea\x9e\xa2\xa2\x49\xad\xdf\x1a\x1e\xaa\x3c\xe1\x19\x38\xb1\x3e\x30\x91\x3c\xd0\xda\xd4\x91\xfc\xbb\x32\x85\xea\x37\x8b\x8e\xf9\x22\x7f\x3f\xa8\x0b\x58\x6e\xcf\xea\xe1\x37\x06\x6f\x84\x48\xac\xdf\xb7\x8d\x6d\x3e\x9e\xf4\xa6\xb3\x62\xdf\x42\x41\xad\x9a\xe2\x53\xb8\xe1\x59\x7d\x65\x6e\x00\x0c\xea\x44\x7a\x02\xfa\x49\x33\x32\x86\x09\xbb\xa0"}, +{{0x1b,0xa9,0x19,0xc0,0x66,0xbb,0x56,0xe6,0x40,0xc3,0x33,0x59,0x68,0xe1,0xd1,0xb5,0xbc,0xc0,0x93,0x38,0x3e,0x2d,0x7c,0xf8,0xb5,0xff,0xf5,0xc6,0x1e,0xc4,0x7a,0x77,},{0x80,0x4c,0x90,0xbd,0xc2,0xb3,0x61,0x8b,0x01,0xf0,0x75,0xe0,0x41,0xfa,0x97,0x1b,0x83,0xc5,0xb6,0xcf,0xa3,0xb6,0xb3,0x97,0x4f,0x3f,0xa4,0x35,0x99,0xbe,0xac,0xab,},{0x50,0x3e,0xb7,0xed,0x6d,0xe1,0xb7,0x76,0xc9,0x52,0xf2,0x55,0xbb,0xd4,0xbc,0xfb,0x0e,0x48,0xbc,0x70,0xc2,0xcc,0x2f,0x1f,0x72,0xbf,0x68,0x81,0x47,0x90,0x40,0xc4,0x75,0x24,0xec,0x54,0x2a,0xe1,0x3f,0x60,0x05,0xca,0x50,0x16,0xb5,0x8b,0x73,0x6a,0x50,0x89,0x8d,0xd0,0x56,0x9d,0x4d,0x38,0xad,0x29,0x86,0x30,0xd6,0x8a,0xdb,0x0b,},"\x87\xc5\xc7\x5d\x8a\xd0\x7d\x52\xac\xd7\x81\xd1\xbb\x95\xf7\x8c\x70\xe2\x1c\x2d\xd6\x6f\x7a\xa4\x42\x34\x15\x2f\x98\x23\x4d\x12\x83\x58\xa8\xae\xe9\x8e\xa9\x03\xa7\x7b\x44\x1d\xb1\x44\x7a\xe6\xff\x34\x32\xdd\xd4\x57\x0f\x7f\x58\x03\x61\x22\xc1\xfd\xcc\x93\xcb\x21\x57\x37\x39\xc1\x9c\xca\xa4\x11\x50\x8e\x08\xde\x26\x06\xf3\xd8\xf2\xdb\x89\xdf\x6a\x44\xa4\x61\x33\xd5\x70\x18\x46\x26\x27\xe2\x2f\x57\xef\x36\xd1\xde\x02\x4d\xe3\xd4\xae\x41\xb7\x52\xdf\x48\x21\x15\x59\x34\xb4\x47\xb2\xef\xfe\x51\x24\x87\x52\x1b\xe0\x35\x68\x32\xa7\x4c\xe0\xe2\xd8\x30\x1b\x79\xf9\x31\x75\xe8\xb6\xb9\x61\xb1\xdf\x63\x7d\x8a\xca\xdc\x88\x45\x43\xc6\x86\x4f\x80\x25\xec\xec\xec\x7c\x6e\x4f\xe0\xfe\xcf\xc4\x0d\xcd\x95\xe8\xd6\xab\x93\xce\x25\x59\x53\x84\x43\x6b\x59\x8b\x73\xc7\x4b\x03\xd4\x9e\xd5\x00\x2c\x0f\x85\x8c\xfd\x9d\x0d\xf6\x1e\xde\x93\x7c\xc4\x16\x59\xd6\x70\x8b\x96\xfc\x5a\xaa\xde\xe1\x09\xe2\xa6\x88\x46\xba\xf2\xc2\x46\xdf\xcf\x3d\x27\xc2\x8b\xd1\x37\x1e\x35\xfc\x94\x12\x63\x14\x42\xee\x75\xf3\x8c\x6e\x49\x58\x07\x0a\x74\xf6\xe6\xa2\x20\xf7\x5c\x72\x80\xea\xb4\x73\x7d\x97\xe3\x78\x82\xf3\x62\x48\x11\x67\x5f\x16\xca\xf6\x0c\xb9\x44\xbc\xe9\x2e\x75\x88\x4c\x56\x48\x3c\x61\xf2\x6b\x63\x71\xb1\xb5\x12\x37\x62\x1a\x06\x54\x3e\xb4\xab\xea\x7b\xec\xc4\xfc\x31\xdb\xb5\x47\x5b\x3d\xeb\x9b\xb3\xc8\x99\x23\x87\x10\x48\x30\xc6\x07\x2a\xfe\x1a\xf2\x44\xbf\x68\x1a\x40\x32\x9c\x9b\x37\x77\x2b\x09\xc5\xe8\x8e\x78\xf7\xdf\xfb\xc0\x45\x49\xff\xa1\x3b\x41\x44\xdd\xfa\x53\x8f\xc4\xb3\x30\x05\x40\xad\x83\x02\x15\xe2\x5f\x11\x44\x6d\x28\x9f\x33\x12\x2c\x2c\x88\x0d\xe3\xda\x71\xc4\x53\xd7\xe8\x8f\x7c\xa4\xea\x3d\x12\x55\xe8\x2f\x4b\xc9\xe5\x53\x3d\xc4\x01\xc3\x30\x40\xe1\x69\x40\xb2\xcf\x9c\xf2\x1f\xea\xca\x1c\x2c\x6c\x33\x33\x7c\xf7\x5e\x18\x84\xb4\x83\xbf\x80\x15\x36\xd3\x04\x08\x91\x15\xa0"}, +{{0x9b,0x36,0x24,0x7c,0x17,0x71,0x0e,0x95,0x26,0x1a,0x7d,0x70,0x2f,0x57,0xfe,0x81,0xf2,0x97,0x11,0x17,0xa5,0x0c,0x87,0x92,0x01,0x93,0xb3,0x86,0xd4,0x94,0xca,0x97,},{0x29,0xae,0x39,0xf2,0x73,0xe3,0x5f,0xb3,0xf6,0x11,0xda,0x09,0x16,0x00,0x65,0x0e,0xfb,0xc4,0xfc,0x4d,0x1e,0x7b,0x4c,0x76,0xac,0xed,0x5a,0x83,0xf8,0x26,0x34,0xf3,},{0x03,0x59,0x70,0xa6,0x72,0xe9,0x3f,0x87,0xeb,0x42,0xcc,0x39,0x6f,0x6e,0xa7,0xe1,0xb3,0xdd,0x5c,0x59,0x51,0x57,0x28,0x26,0xd1,0x07,0x5a,0x15,0xc2,0xd7,0xe4,0x54,0xdf,0x19,0x5b,0x51,0xaa,0xe8,0xdc,0x61,0xef,0x7a,0xb8,0x95,0x48,0x5f,0x64,0xe5,0x98,0x95,0x73,0xd9,0x8a,0x06,0x2e,0x67,0xae,0x73,0x56,0xfe,0x5c,0x9e,0x3b,0x0f,},"\xe8\xd9\xd5\x3b\xa2\x7e\x98\xed\xd5\x5d\xf3\xc6\xb2\x45\xea\xcd\xdc\x8a\x40\xe3\xef\xb0\x07\xbc\x91\x8e\xc5\xa8\x69\x17\x8a\x17\x0b\xb4\xa6\x35\xb7\xf8\xf7\x42\xe3\x7a\xd4\x5d\x14\xa7\x43\x44\xa6\xb5\x22\x83\x0a\x52\x21\x06\xeb\x96\x0d\xaf\x19\x2d\xc1\xe0\xfd\x70\xf1\x61\x60\xe1\x22\x51\x68\x92\xd0\xe2\xab\xd0\xd4\xae\x0f\x0d\x2e\x5a\xdc\xc9\x9a\xd5\x53\x02\xe2\x51\xb3\xe7\xa4\xd0\xcb\x33\x77\x4a\x49\x70\x49\x90\x5c\x33\xde\x1f\xbb\xc1\xad\x2b\x6c\x64\x52\x95\xfe\x41\x6b\x4d\x12\xb2\x32\xef\xe0\xa3\x3c\xd2\xad\x87\x32\xeb\xa1\xc3\xcb\x0e\xae\xb0\xb2\xa5\x7f\xa0\x3e\xc5\x67\xca\x29\x21\x0b\xf6\xff\x95\x42\xa7\x66\xf4\x96\xfe\x68\x05\x8a\xa9\x83\x80\x6c\xbe\x7a\xb1\x0a\x47\x92\x0b\xac\x82\x48\x81\x8e\x54\xa4\x15\x51\xc9\xa0\x95\x9e\x89\x94\xca\xc6\x0f\xc8\x68\xad\x48\xb5\xa2\x4d\x5f\x24\xa7\xa5\xa3\xfd\x90\xb8\x47\xe8\x17\xad\x3d\xd5\xd0\xd6\xf8\xde\x2d\x20\x4f\x64\x24\x83\xbd\x53\x58\x5a\x92\xef\x92\x54\x15\xa9\xb3\x8f\xbb\xf0\x7f\xc0\xf3\x5e\x70\x75\x69\xcf\x48\x8b\x20\x54\x53\xce\x54\x33\xeb\xa6\xfd\xe8\x78\x1a\xf7\x2b\x52\xbf\xbc\xab\x85\xea\xd3\x85\xd9\xd3\x17\x5e\x21\xad\x33\x73\xad\x53\x5c\xf0\xe3\x57\xed\x6b\x53\x83\xef\x38\x29\xa9\xd5\x09\x5b\x87\xdc\x9a\xad\xbe\x0c\xa7\xab\xad\xf3\x3e\xc3\xb6\xff\xd6\xeb\x94\xaf\xdc\xc1\x2e\x8d\x66\xa6\xfc\x05\xac\xf9\x73\x68\xdb\x0f\x69\x56\x5d\xcd\x8f\xef\x4d\x1e\x49\xd7\xdd\x4a\xc0\x53\xc2\x18\xf5\x24\x0c\x81\x2d\x4e\xbb\xa4\x40\xdc\x54\xca\xcd\xdb\x1c\x39\x32\x9e\x5b\xd0\xc3\xc8\x0d\xc3\x25\x9a\x80\xf0\x59\xf9\x46\x79\xaa\x07\x94\xca\x01\x15\xcc\x62\xaf\x25\xe1\x24\xcb\x8a\x9d\x41\x60\xea\xce\x6d\x22\xc7\xb1\xc4\x45\x44\xf8\x11\x42\xa1\x9e\xbb\x02\xa9\xbd\xa6\x42\x9c\x50\xe7\x83\xdb\x4a\x07\xf0\x21\x9e\x85\x7c\x8d\x3c\x56\x55\xa5\x82\x83\x1c\x8e\xab\xc3\xf1\x9b\x59\xad\x8d\x2c\x71\x4a\xde\xaf\x40\x39\xd5\xcf\x70"}, +{{0x6f,0xed,0xe7,0x39,0x6c,0x46,0x20,0x33,0x18,0x9a,0xcd,0x23,0xd2,0xf9,0xd0,0x2b,0x68,0x89,0x8d,0x35,0xf3,0xa0,0x1a,0x79,0x8f,0xc2,0x4d,0x48,0x8d,0xe9,0x3a,0x78,},{0xb3,0x40,0x62,0x06,0x0b,0x2c,0x20,0x07,0x6a,0x98,0xfe,0xa9,0x39,0xb3,0xb3,0xa5,0x04,0x51,0xa5,0xf4,0x9f,0x83,0x51,0xc0,0xad,0x75,0x91,0xdb,0xbe,0xbb,0x13,0x0f,},{0x88,0xa8,0x3e,0x20,0x12,0xd2,0x09,0xca,0x03,0xb8,0xeb,0xf6,0xde,0x5b,0xb7,0xef,0x4c,0xcb,0x5e,0x3d,0xf5,0xca,0xc7,0x89,0x54,0xaa,0x69,0x49,0x30,0xe4,0xde,0x82,0x54,0x4e,0xf5,0x08,0x3c,0x48,0x92,0xdb,0x9f,0x05,0xd7,0x7b,0xf6,0x3f,0x4f,0xdf,0xce,0x15,0xa4,0xd1,0xc3,0xf8,0x5b,0xae,0x80,0x77,0x06,0x2b,0xec,0x0e,0x7b,0x07,},"\x5a\xbc\xc1\x4b\x9d\x85\x78\xde\x08\x32\x1d\xe0\xd4\x15\xe3\xd4\x0e\x9d\xe3\x1e\x18\x88\x13\x74\x75\xce\x62\xbc\x6f\xbe\xe8\xfd\xd0\x3b\x9d\x47\xc7\xb8\x8b\xbc\xeb\x80\x44\x44\x49\x0b\xf6\xa3\xcc\xb7\xa2\x73\x26\x1e\x24\x00\x4e\xa6\x7c\xef\xa3\xd5\xd1\x73\x57\x6d\x01\xe3\x8f\x76\xc1\xe0\xe5\x15\x08\x3c\x97\xe7\x99\x14\xac\xf2\xbe\x41\x60\xef\x93\x60\xbb\xe9\x86\xb3\x6e\x9f\xf9\x33\x46\xb0\xe7\x06\x91\xd9\x34\xe4\x7f\x8a\x50\x3f\xa9\x33\xab\x2a\x50\x42\x69\x47\xcd\xa8\xe8\x10\xc9\xeb\xe3\xb3\x69\x82\xf0\x9a\xee\x60\x92\x73\x9f\xa2\x35\x8b\x61\x3c\x7f\x12\x9d\xb0\xdc\xbe\x36\x8b\xee\x52\xf2\xf7\xf1\xdf\xe3\xd2\x43\x46\x05\xb5\xaf\xcf\x25\x60\x71\x71\x7d\x92\x4f\xd0\x80\x3b\xbd\x0d\xd1\xf9\x55\x5c\xe8\x34\xda\xc7\x81\xdf\x4c\xc7\xaa\x19\xe7\xf1\x1d\xa9\xfb\x99\xcb\x9e\x6b\x9e\x1e\x6f\xb4\xf7\xe8\xdc\xb2\x23\x6c\x28\xae\xb6\xcb\xc5\x5a\x13\x0e\x03\xc1\xb1\x7a\x99\x1c\xca\x1b\x79\x4e\x6c\x13\x73\x2d\x5b\x0a\x66\xf6\xeb\xa8\x60\xec\xb9\x85\x55\xaa\x4c\x21\x8d\x11\x2b\x11\x6b\xce\x23\x82\x95\xde\x14\x27\x41\xf6\x87\xbe\x0b\x24\x87\xf5\x8f\xfc\x5c\x12\xa0\xa5\x19\xf1\xe2\x37\x93\x24\x2e\xf8\x57\xed\x39\x8a\x20\x69\x9d\x43\x51\x45\x3f\xc2\xf0\x92\x76\x2a\xbd\xe3\x4f\x4d\xa2\xdb\xe0\xce\x2a\xab\xaf\x6b\xc4\xc0\x15\x9f\x3f\xe1\xae\xa1\x6a\x03\x6f\x7e\xae\xcd\x62\x95\x38\xf3\xe0\xee\xd8\x3c\x9a\x4d\xc1\xab\xc2\x38\xf9\x0d\xaa\xf4\x89\xfd\x61\xb3\x4d\x93\x7b\x6f\x46\x07\xa7\x88\xba\xa8\x20\x61\x94\x3d\xba\xb2\x6c\x1d\x38\x4d\x8d\x49\xf9\x93\x48\x80\x0b\xf3\x61\xf8\x71\xf5\xd6\xcd\xa1\x8f\x68\x99\x18\xce\xc3\x1a\xd1\x58\xf1\x86\x3d\x13\xff\xac\x54\x05\xc1\x62\xc3\x2d\xe0\x6e\x32\x99\x4c\xc4\x10\x6f\x95\xbb\x4f\xff\xdb\xef\xe7\xd6\x29\xec\x77\x97\x39\x46\x09\xfd\xbf\xea\xdb\x46\x92\x73\x70\xa1\x1f\xb3\x84\x71\x54\x0f\x95\x1b\x93\xc6\xeb\x23\x86\x68\xdc\x00\x6c\x21\x66\x0b\xa2"}, +{{0xd5,0x59,0x58,0x01,0x34,0xab,0x05,0x0a,0xca,0x44,0x6e,0xa7,0x75,0x0e,0xf6,0xb3,0x71,0xd9,0x2d,0x76,0x45,0xec,0x76,0x35,0xfe,0x78,0x51,0x10,0x0b,0xc4,0xe5,0x1e,},{0xde,0x50,0x20,0xcd,0x21,0xa8,0xb3,0x23,0x39,0xde,0xcb,0xed,0xff,0x24,0x66,0x4d,0x95,0x80,0x32,0x63,0x27,0xae,0xdf,0x09,0xc5,0xec,0x6b,0x3f,0xe5,0x40,0x52,0x26,},{0x6f,0xcb,0x1a,0xc9,0x29,0x0a,0xb7,0x67,0xd5,0x9b,0x59,0x8c,0x9a,0x24,0xec,0xdb,0x6c,0x05,0xbb,0x02,0x3e,0xc3,0x60,0x14,0xa4,0x0d,0x90,0x8e,0xf0,0xdc,0x37,0x8a,0x45,0x28,0xb3,0x76,0x0d,0x88,0x9a,0x79,0x17,0x4e,0x21,0xca,0xe3,0x5d,0xf4,0x5d,0x42,0x7b,0xa6,0xea,0x81,0x2b,0xdd,0xca,0x16,0xe3,0x5a,0x69,0xb5,0xe7,0x9f,0x0a,},"\x68\x42\xe3\x19\x0a\x11\x0e\xee\x96\xc5\x07\xd4\xbc\xb4\xc5\x48\xc3\xa0\xed\x7b\x1a\x8e\xd7\x7d\xd9\x3b\x38\x61\x3b\x23\xc7\x3e\x83\x0b\x20\x5e\x62\x65\x19\x21\xad\x82\x96\xb0\x8d\x1e\x10\x08\xad\x78\xf2\x99\x6e\x3c\x7f\x38\x03\x2e\x46\x7c\xff\xec\xd7\x7b\x85\x25\xe2\x43\xce\xc0\x21\xf8\x52\x96\xaf\xd5\x45\xd7\xbe\x1a\x62\x56\x8b\xb0\xcf\xcd\xb9\x0d\x61\x4e\xd7\x98\xbf\xb7\xef\xc6\x55\x32\x68\x16\xa6\x10\x82\x25\x1d\xf0\x16\x13\xaa\xc8\x8e\xfc\xea\x1e\x0e\xa2\x96\x1b\x8f\x92\x1e\xbe\x15\x58\xde\xe8\x33\x74\xa0\x11\x3a\x78\xc5\x58\x57\xce\x20\x55\xbb\x2c\x48\xba\xdb\xd3\xd8\xf4\xcb\x19\x73\x4d\x00\xd0\x60\x4b\x61\x90\x73\x02\x0d\x72\xa9\x9a\x19\x23\xe6\x16\x0a\x09\x94\x65\x67\xfd\x4b\xda\x66\x44\x2e\xf5\xa7\x36\x07\x86\xd1\x78\xda\xe4\x49\x22\xf3\x50\xce\x2e\xdc\x6a\xf7\x3d\x1b\xd8\x0d\xc0\x3e\xc3\xca\x70\x05\xf4\x10\x9d\x10\xc6\xd4\xf7\xd8\xfa\x61\x73\x51\x10\xf8\xdb\xae\xdf\x91\xa0\xba\xd7\xd7\xfb\x5c\x04\xd7\x06\x37\x3c\x15\xc6\x45\x06\x3f\xf4\xb4\xfb\xd2\xd5\x59\xb0\xaf\xad\x43\x2d\x4c\x49\x6c\xd8\xab\xfe\xa2\x86\xfa\x67\x5d\xc0\x76\x72\x6e\xc5\x22\xb3\xa3\xc2\xf4\x7a\xec\xc5\x39\xf4\x8a\x79\x21\x69\xc4\xcc\x8c\xd4\x1c\xd2\xcb\x6b\x63\xdd\xbc\x19\x37\x3a\xc9\x69\x1c\x2b\xc2\xf7\x8f\x22\x60\x3d\x55\x13\x71\x5a\x16\xd4\x57\x4e\x7a\xcc\x4b\xea\x6d\xcd\x8c\xa7\xf1\x98\x65\xa4\x9d\x36\x64\xa2\x10\xdf\xad\x29\x07\x74\xb1\x0b\x71\x88\xf2\x55\xb3\xbe\x4d\xc8\xfa\x86\xf8\xda\x3f\x73\xa4\xe7\xc9\x29\x95\x1d\xf3\x0f\xe6\x6a\x17\xc8\xce\xe2\x3e\x4f\x2e\xd2\x06\x3f\x0b\x02\xab\x40\x37\x2c\xbe\x54\xb9\xa7\x08\xdf\x7c\x48\xa0\x65\x66\xd3\x9b\x19\x43\x4c\x6c\x76\x69\x87\xb3\xeb\xb0\x06\x75\xf4\x4c\x4b\x3c\x1e\x9f\x45\x04\xe7\xa9\x27\x05\x89\xc0\xd0\xf4\xcb\x73\x42\x35\xa5\x8e\xf0\x74\xcf\x9d\xec\xf3\x60\x1a\xee\xca\x9f\x1d\x8e\x35\x6c\xb2\xdb\x5f\xce\x79\xcb\xc3\x61\x43\xf3\x4b"}, +{{0x9d,0x4c,0xe9,0x75,0x54,0x78,0x76,0x63,0x6f,0xea,0x25,0x43,0x7c,0x28,0x80,0xc9,0xaa,0x8e,0xe6,0xb2,0x70,0xd1,0xb2,0xda,0x19,0x7c,0x8d,0x7f,0x95,0xe7,0xdc,0xcc,},{0xbd,0xe4,0x99,0x3c,0x03,0x04,0x77,0xc3,0x58,0x90,0xaa,0xe8,0x2b,0xb5,0x08,0x7e,0x91,0x4e,0x64,0xb9,0x4f,0xfc,0x64,0xe2,0xd7,0xa5,0xa7,0xc9,0x19,0xe2,0xd9,0x02,},{0xbe,0x17,0x44,0x4c,0xd4,0x65,0xa8,0x7a,0x97,0x1d,0xf8,0x4e,0xb1,0x02,0xf9,0xc7,0xa6,0x26,0xa7,0xc4,0xff,0x7a,0xea,0x51,0xd3,0x2c,0x81,0x35,0x3d,0x5d,0xbc,0x07,0x39,0x3c,0xa0,0x3d,0xb8,0x97,0xd1,0xff,0x09,0x94,0x5c,0x4d,0x91,0xd9,0x8c,0x9d,0x91,0xac,0xbd,0xc7,0xcc,0x7f,0x34,0x14,0x4d,0x4d,0x69,0xeb,0x04,0xd8,0x1f,0x0c,},"\xea\x0f\xa3\x2a\x4a\x28\x88\x11\x30\x1b\x9e\xe5\x33\xfa\x35\x1f\xdf\xbf\x6b\xc1\xd0\x55\x5a\x74\x02\x76\x7a\x3a\x91\x98\x55\x8f\x74\xbb\xa7\x03\x18\x57\x99\x5b\x9f\x32\x62\x26\xf1\xdd\x5d\xf1\x07\xb0\x63\x42\x20\x3e\xb8\xd4\x0c\x5f\x1d\xc9\x5b\x4f\x3f\x88\x97\x5a\xa2\x4a\xf8\x76\x9e\x26\x70\xc4\x66\x71\xbe\xbb\x7a\x0f\x1b\x75\x68\x72\x9a\xee\x47\x7e\x89\x88\xaf\x9c\x74\x9f\x32\x02\x70\x81\x71\xfd\x94\xb3\x37\xae\x67\xed\x21\xa6\xc4\x41\x74\x01\x4b\x0b\x0e\xb5\xba\x71\xc2\x77\x97\x8d\x48\x8c\x24\xc4\xa7\x84\x13\x09\x84\x6b\x4e\x30\xa4\xfb\xbc\xfc\x45\x07\x8d\x7e\x14\x01\x41\x14\xb1\xac\x64\xf7\xc3\x3c\x9a\xc2\x5e\xa5\x62\x6c\x2c\x81\x9f\xba\xa2\xa4\xde\x8a\x2b\xf5\xf1\x36\x5d\x6b\x70\x40\x7e\x80\x94\xf9\x91\x97\xce\x1f\x0c\x35\xe1\x1a\x98\xfb\xe3\x72\x41\x4e\xa2\x06\x4a\x3a\x12\xd1\xcd\x5c\x8d\xf8\xfc\x0e\x79\xf5\xb7\x70\xb5\x8f\x47\x7f\x91\x97\x6c\xa0\x13\x98\x95\x12\x0e\x24\x6b\xaa\xb5\xa0\x26\xf2\xd3\x9c\x68\x7d\xc0\x78\x83\x34\xb5\xc6\x26\xd5\x2c\xde\xbe\x05\xea\xf3\x08\x64\xb4\x13\xee\xbd\xc5\x58\x1e\xf0\x0d\x43\x92\x76\xe5\x2f\x47\x9c\x9c\x05\xb1\x16\x39\x58\x26\xb6\x04\x90\xb3\xce\x70\x0c\xc0\x02\x7f\x61\xe4\x6c\xa2\xf6\xfb\xc2\xc9\xde\x2e\x80\x08\x06\x55\x0a\xfb\x06\xd4\xa0\x8e\xac\x7a\x75\x8e\x24\x58\x2a\x4d\x6d\x42\x8b\x43\x3d\x36\x5f\xc3\x1d\x44\x44\x60\x7a\xfb\x64\xf1\x5e\x37\x07\x94\x00\x5a\x3a\x22\x44\xe6\x66\xd5\xd4\xc3\x8a\xd2\x00\x9c\x76\x9a\x51\xcd\xbf\x73\x8d\x23\x59\x42\xf4\x12\xd0\x7f\xee\xb7\x3b\x36\x57\xd0\xb0\xc9\x1c\xb5\x94\x0b\xad\x6a\x70\x6e\x14\xed\xcd\xc3\x42\x25\xb1\xc1\xf3\x8b\x1a\xbe\xcb\x2a\xdc\xaf\x81\x91\x55\xa9\x4f\xe1\x90\xfd\x55\x68\x22\xd5\x59\xd9\xc4\x70\x85\x4d\x3a\x43\xbf\xb8\x68\xda\xdd\x6e\x44\x3d\x98\xee\x87\xe4\xd8\x28\x4f\x5c\xf3\xa6\xda\xfa\xf2\x95\xb9\x02\x83\x6c\x64\x05\x11\xe6\x10\xae\x7d\x0c\xb1\xb1\xd3\xd6\x07\x9f\xe6"}, +{{0x02,0x73,0x86,0x82,0x32,0xf5,0xbe,0x48,0x59,0x2c,0xfa,0x05,0x13,0x4e,0x8d,0x55,0x54,0xed,0x1f,0x9a,0x57,0xbc,0x7e,0x39,0x82,0xa3,0x30,0xc5,0x7e,0x5a,0x7f,0x3a,},{0xf1,0x72,0x20,0x87,0x82,0xdb,0x66,0xd4,0x66,0xcb,0xe4,0xf4,0x41,0x7f,0x6f,0xc4,0x77,0xb7,0x34,0x9f,0x2a,0x98,0xdb,0x56,0xc0,0x3a,0x47,0x22,0x75,0x46,0xbc,0x5a,},{0x15,0xe8,0xd8,0xdc,0x7d,0x5d,0x25,0x35,0x9d,0x6a,0x10,0xd0,0x4e,0xe4,0x19,0x18,0xa9,0xc9,0xdf,0x4c,0x87,0xbe,0x26,0x9f,0xa8,0x32,0x43,0x4d,0x53,0x01,0xdb,0x02,0x24,0x81,0xbf,0xa3,0x95,0xa3,0xe3,0x46,0x6f,0x95,0x54,0xce,0xee,0x05,0x32,0xa8,0x18,0x3a,0x0d,0x05,0x50,0xe7,0xd1,0xab,0xe9,0x9f,0xc6,0x94,0xc6,0xff,0x93,0x01,},"\xf7\xa1\xd4\x61\x4c\xc6\x4a\x3b\xc4\x8f\x00\xc6\x27\x63\x04\xf3\x4d\x4d\xfd\x15\xe0\x61\x7b\x93\xcc\xef\x12\x6c\x5c\x63\x8c\x9d\x99\x53\xaa\xbb\x7d\xf4\x2d\xf4\xe0\xaa\xa7\xea\xc9\x6a\x4b\x38\xc7\xba\x75\x8d\x86\x0c\x90\xd0\x5e\x3d\x14\xe4\x79\xe5\x45\xf3\x19\xb0\xe5\xa8\x5a\xd8\xf0\x99\x1b\x43\xd6\xe4\x9c\x24\xfa\x06\x0e\x3e\x5d\xf9\x5c\x98\xd9\x45\x1a\xb8\x33\xe1\x2a\xa9\x7f\x40\x46\x11\xbb\xa3\x59\x49\x62\x65\xa6\xdb\x11\x91\x7d\x0d\xa5\xc6\xa7\x02\xd0\xb1\x02\xde\x36\xdd\x0c\x98\xdf\x5b\x54\x80\x6c\xe6\x26\xbb\x96\x37\x44\x75\xf6\x8a\x60\x60\xeb\x35\x0a\x7d\x2a\xae\x32\x04\xb3\xdf\xdf\x9f\x1e\x31\xbe\x81\xf7\x17\x0f\x8a\x1b\x93\x85\x41\x3f\xf8\xf6\x88\x1e\x10\xc1\xe8\xda\x4c\x88\xaf\xb5\x06\x39\xab\x44\x88\x7a\xca\x2a\xbe\xec\xed\xf1\x10\xd2\x95\x8c\x13\xfd\x33\x90\xd1\xb9\x6a\x76\x2d\x16\xce\x19\x69\x20\xce\x85\xf6\xc4\x15\xbe\xd5\x45\xb1\x44\x53\x02\xa6\xf0\x01\xeb\x8d\x00\xe9\x7c\x75\x18\x87\x86\x8d\x48\x1a\x0b\x1e\x4d\xfa\x04\xb6\xf7\x61\x08\x6e\xe8\xe6\x97\xb0\x19\xe0\x17\x10\x4b\xaf\xb9\x8f\xca\x24\x2e\x33\x4c\x6f\x18\xf1\xdb\x5b\x6f\x29\x5f\x05\xc5\x59\x36\x1c\x68\x31\xda\xbc\x42\xc2\x11\x07\x03\xf9\xd1\xf6\x4e\x12\xdd\xf2\x6a\x86\x79\x85\x4e\x9f\x8e\xf8\x47\x9e\x1f\x12\xc3\x54\x47\xaa\xc0\x2e\xa7\xf2\x42\xe5\x86\x32\xcf\x2f\xd0\x63\xfe\x66\x50\x70\x44\x5b\x80\xf3\xdc\x6a\x33\x03\xbb\xa9\x6e\x05\xfa\x88\xee\xc2\x01\xc5\xc2\xd0\x0c\xa8\x1b\x8d\xa6\x96\x9d\x0a\x4d\xd0\x48\x3b\x34\x77\xd3\x25\xa7\x1f\xac\xd6\xfa\x22\x09\xb4\x8c\xb4\xf6\x52\x5d\xa7\x3c\x9c\x05\xb2\xd9\x78\x9b\x01\x44\x8e\x15\x27\xe5\x6a\x09\xa9\xbc\x61\x36\xd9\x83\x72\x43\xc2\x07\x7b\x92\x5b\xbb\x93\x3f\x8f\xb1\xda\xac\x96\x33\x98\xc5\x80\x2a\xed\xa3\xbb\xca\x8a\xe3\xb8\xf4\xa9\xa8\x71\xf7\xea\x8e\x2c\x0c\xe8\x98\xc5\x66\x21\x7b\x5c\x06\xff\x55\xff\x9f\x4f\xe7\x83\x98\xae\x79\x73\x64\x1e\xaf\xb5\x21"}, +{{0x33,0x6a,0x83,0xb5,0x5a,0xbf,0x4c,0x02,0xe2,0x5e,0x54,0x03,0x29,0xb5,0x27,0x58,0x43,0xc2,0xec,0xb8,0xdf,0x69,0x39,0x5b,0x5a,0x5e,0x24,0x1b,0xd0,0xd8,0xc1,0x0d,},{0xdd,0x60,0x56,0x98,0x44,0x57,0x0c,0x9f,0x0a,0x82,0x64,0x3f,0x44,0x64,0x78,0xb5,0xac,0x6f,0xc5,0x42,0x21,0x42,0x31,0xa7,0xca,0x65,0x6a,0x92,0xb5,0xfd,0xaa,0x54,},{0xd2,0x63,0xf5,0x6d,0x59,0xcb,0x9b,0x28,0x96,0xa9,0x47,0x26,0x7c,0x2e,0xd7,0x8a,0x94,0x5b,0xac,0x5a,0xbd,0xbf,0x3c,0x14,0xdc,0x3a,0xd0,0x92,0xb2,0x30,0x8c,0xb9,0x31,0x5c,0x46,0x49,0x42,0xa0,0xa2,0x0b,0x20,0x24,0x51,0x1d,0x76,0x6e,0x85,0xc9,0x36,0x49,0x9a,0x14,0x9c,0xd0,0xbb,0xb2,0x09,0x15,0x0a,0x16,0x43,0x26,0x52,0x00,},"\x9a\xfe\xe8\xab\x48\x20\x10\xe2\x92\x64\xb4\x06\xd9\xb4\x94\x53\xd1\xce\x6d\x55\x09\x39\x07\x21\x82\x86\x3e\x46\x65\x28\x4a\xb0\x5d\x86\x25\x8e\x06\x23\xb1\x87\x54\xc4\x78\x52\x38\xf6\x97\xf0\x75\xad\xfb\x9e\x1d\x31\xa4\x2e\x85\x93\x4e\xc0\x71\xdd\xdd\xec\xc2\xe6\xc2\xf6\x13\x34\xa7\x95\x26\x78\x8b\x49\x52\x19\x07\x16\x90\x6d\xde\x17\xfb\xa5\x56\xee\xa4\xc8\xb5\x97\x27\x51\x4f\x6f\x56\x15\xa1\x9c\xa3\x6d\xa3\x58\xfa\xe6\xa6\xc5\x4f\x7f\x4b\x7a\x92\x9e\x31\xba\x7c\xc7\x1b\xde\x78\x82\xfa\x9f\xfd\x87\x30\x01\x36\x40\x9c\xaf\x3c\xa6\x4e\xef\xea\x61\x6a\xed\x58\xda\x5d\xfb\xf2\x8b\x66\x8e\xc1\xcc\xcf\xfc\xef\x6e\x2e\x14\xf8\x10\x9e\x9c\xbf\x76\xcf\xa4\x14\xf9\x1a\xc0\x0f\x48\xe9\x3e\xad\xa3\x85\xdd\x3d\x5c\x16\xe1\xa3\x9e\xa3\xdd\x55\xc7\x61\xfc\xa3\x61\xb4\x28\xf5\x16\xc0\x5e\x69\x4f\xe5\xc3\xc3\x45\xcd\x94\x45\x71\x87\xa8\xe6\x04\xb2\x00\xa1\xa0\xf9\x37\xae\x89\xf4\xd6\xb5\x42\x1d\xff\xcf\x7c\xa1\x5f\x2e\x2c\x25\x37\x8a\x41\x13\x23\x3f\x76\x13\xf4\x57\x0a\xa4\xb9\x09\xa9\x13\x5e\xae\x4c\x7b\x9e\xad\x45\x80\x07\xae\x17\x12\x6a\x11\xd1\x45\x25\x8a\xf9\x56\x3d\xb2\xf7\xe8\x92\x54\x31\x87\x8b\x0e\xec\xa8\xaf\xfc\x01\xac\x59\x13\xbf\x5b\xac\x4f\xa3\xa8\x57\xc5\x4c\xc8\x90\x6d\x6a\xf7\x7d\xe6\xb9\x32\x6b\x65\x06\x15\x10\x99\xe8\x7e\x99\xb1\xe8\x19\xc6\xfb\xe0\x82\x68\x8f\x34\xb8\x03\xd5\x88\xe4\x16\xd8\x53\x16\x97\x65\xd6\x2f\x7e\x0b\xdf\x72\xc5\xcd\x66\x66\x9a\x03\x35\x56\x23\x36\x73\x5e\x7e\xfb\x73\x4a\x2f\xad\xa3\x27\xf8\x58\xbe\xc6\x02\xd0\xda\x08\xeb\xa4\x47\x9e\x7f\x6d\xc4\xde\xf6\xe4\xeb\xdb\xb7\x30\xee\x91\xa3\x34\x45\xca\xdc\x9d\xf5\x2c\x82\x5a\xd3\x61\x49\xce\xfb\xc5\x1a\xb1\x02\x03\x35\x30\x81\x4b\xaf\xa7\xe8\x79\x61\xb0\x63\x67\xff\x89\x6f\x08\xae\x33\x4a\x9b\x1a\xad\x70\x3d\xa6\x86\x70\x6c\x11\xa0\x49\x43\xea\x75\xe1\x29\x92\xdc\xf6\x10\x6e\x37\x20\x77\xcd\x03\x11\x02\x9f"}, +{{0x88,0x40,0x91,0x72,0x61,0x8b,0x49,0x03,0x93,0xdb,0x27,0xd9,0x60,0x17,0x1c,0xbc,0x18,0x7e,0xaf,0x4d,0xd8,0xb3,0x20,0xb3,0xd2,0xf8,0x24,0x98,0x00,0x43,0x71,0x8f,},{0xce,0x2e,0x7c,0x58,0x39,0xef,0x56,0x32,0xa1,0x23,0xdc,0x37,0x3d,0xc1,0x4b,0x1f,0x05,0x05,0x76,0x6e,0x96,0x75,0x40,0x76,0x04,0xca,0x7c,0xf5,0x4e,0x8d,0x44,0xb2,},{0x93,0xb6,0xe2,0x9d,0x63,0x94,0x5d,0x5c,0x42,0x73,0x87,0xd0,0x06,0xc7,0xf0,0xb0,0x19,0x56,0xa9,0x5f,0xc0,0x43,0x6e,0xd4,0x2b,0x46,0xd0,0xf1,0x7b,0x5b,0xb1,0x93,0xea,0x8c,0x0e,0xbb,0xf3,0xd6,0xd1,0x3b,0xb5,0x39,0xe3,0x5c,0x91,0xf3,0xf0,0xf9,0xfa,0x34,0x14,0xa0,0x22,0x3c,0x90,0x60,0xba,0xc8,0x36,0x53,0xc6,0xfc,0xd9,0x06,},"\xfb\x3e\x82\xf1\x1b\xc2\x86\x26\x7e\x12\x38\x17\xad\x88\x64\xe0\x77\xd9\xf7\xa8\xe7\xa1\x63\xac\x7e\xea\xf9\x3d\x55\xdd\x11\x1d\xe8\x08\x3b\x66\xb5\x3c\xe7\xbc\x77\x1f\xc5\x07\x1a\x2d\x7a\xc2\xf8\x5d\x6f\xc6\xad\xcf\xce\xc4\x46\xe1\x6a\xa1\x04\x6d\xf3\x72\x09\xad\x7a\x29\xcf\x96\x65\xb4\x39\xa5\x4d\x6f\x8d\x94\x2f\x89\xbd\xaa\x56\xf2\xf1\x12\x60\xcc\x95\x99\x30\x38\xb0\xe8\xfb\xdb\x32\x14\xf1\x42\xe6\xc9\x0b\x61\xa1\xd2\xb1\x42\x07\x62\x06\xaf\x30\xac\x35\x78\x4a\x6d\xc1\x5a\x1e\x79\x25\x1a\x8c\x77\x31\xa1\xc5\x39\x78\x03\x8f\x8d\x76\xd7\x0c\x6c\x1c\xdf\x52\x9f\xbd\xb8\x4d\x15\x07\xdc\xff\xdd\x42\x87\x3d\xfa\x6a\x8f\xe6\xbd\x6f\x7f\xd2\x9c\x80\xe4\xb2\xf9\x33\xd2\xb6\xc9\xe6\x2c\x94\x57\xe6\x65\x47\x26\x55\x05\x9b\x63\xb6\x18\xe2\xa9\xa8\xe5\xb9\xe4\x1c\x36\x46\x17\x3a\x89\x2b\x8e\x6d\x4b\xca\xd6\xa6\x2a\x6f\xcc\xd3\x45\x58\x90\xb5\x8e\xc2\x68\x1a\x95\xcc\x97\x76\xa9\xfc\xe8\x3c\x54\xa9\xef\x31\x2a\x33\x19\x59\xc7\xef\x3f\x79\xee\x57\x6e\xb7\xb7\x94\x69\xc9\x23\x4b\x1e\xae\xf6\x09\x88\x47\x08\xfe\x4b\xb0\xef\xac\x66\x2d\xa8\x71\xba\x61\xdd\xab\xb3\xfc\xbd\xeb\x8f\x63\x56\x57\xdd\x9a\x5d\x73\x11\xe6\x39\xa8\x24\x85\x8b\x9a\x98\x68\xd3\xf9\x38\x4d\xa6\x12\xc7\xf2\xe7\x71\xa4\x6b\xd2\x62\x4c\x99\xea\x2b\x6c\xcb\xca\x99\x6c\x1d\x9c\x37\x55\x54\xf2\xa5\x51\x61\x9c\xe6\xd5\xe6\xe4\xd6\xb8\x44\xa4\xdb\xea\x83\xba\x73\x23\x31\xfc\xf4\x65\x72\xc1\xfb\x0e\x25\x7c\xe1\x04\x1b\x26\x5d\xf0\x2e\x69\x0a\x92\x81\x4b\xbf\x3b\x5e\xca\xc6\x9e\xe9\x98\x76\x6a\x02\xb0\xd2\xf9\x08\xb3\xc1\x5f\x95\x26\x99\x61\x6f\x2c\x07\xd5\x89\x19\x89\x89\xe6\x05\x6c\x16\x31\x9a\xab\x6c\xf8\x77\x19\x02\xc0\x78\x04\x6a\x88\xb2\x57\x0c\x13\xbc\x5e\xde\xba\x2e\xd1\xe3\xba\x13\x1d\xaf\x94\xe6\x89\x18\x62\xbb\x3d\xe7\xd1\x06\x3f\xe4\x05\x30\x7a\x5c\xd9\x75\x69\x3e\x9d\x58\xe1\x7c\x69\x0e\xee\xf4\xa2\x60\x3c\xaf\xc6\x8c\x2b"}, +{{0xe5,0x71,0x18,0x9b,0x5c,0xd9,0xe7,0x88,0x30,0x2d,0xe3,0x91,0x9d,0x85,0x0c,0x22,0x7d,0xcb,0xb6,0x15,0x02,0x2e,0x56,0x8b,0xda,0xeb,0x37,0xac,0x5b,0x29,0x39,0xc5,},{0xed,0xda,0x89,0x0f,0x42,0xdd,0x5f,0xbc,0x73,0x16,0xa5,0xfa,0xdf,0xbe,0xc3,0x85,0x56,0xf2,0x3f,0x51,0xb8,0xef,0xd2,0x62,0x54,0x37,0xf6,0xb5,0x06,0x9f,0x1e,0xe5,},{0x7f,0x79,0x7a,0x31,0x71,0x5d,0x7c,0x35,0x6f,0x8f,0x1f,0x78,0x37,0x00,0xaa,0x99,0x74,0xbb,0x93,0x6d,0x66,0x16,0x61,0xad,0x96,0x8c,0x7c,0xde,0x1a,0xc9,0xe7,0x67,0xbe,0x56,0xa2,0xdd,0x49,0xb9,0x23,0x0e,0x90,0x11,0x0c,0x67,0xc0,0xed,0x18,0x7c,0xb7,0xe7,0x5c,0x30,0x53,0xec,0xe8,0x44,0x98,0x4d,0x29,0x6f,0x0d,0x85,0xcb,0x07,},"\xb6\x2c\x86\x7a\xd6\x22\x74\x35\xbf\xa6\xda\xb8\x30\x68\x4e\x38\xd1\x96\xe1\xf8\x61\xaa\xde\x0f\xd6\xa7\x69\x9b\x6d\x60\x90\x1f\xef\xb2\xd7\x99\xc3\x5c\x6f\x3d\x8b\xb9\x4d\xee\xe8\x34\x40\x39\x81\x86\x6b\xab\x84\x94\x6a\xe9\x47\x6c\x75\xe9\xf1\xd3\x60\x2b\x42\xcb\x2d\xb4\x37\xbf\xf3\x3a\x77\x58\x22\xf0\xd6\xa2\x57\xd4\xb7\x54\x00\xeb\xa5\xb8\xab\xb3\x14\xb7\x1f\xc6\xb4\x6f\x8a\x34\xe8\x61\xa9\xa6\x2a\xbf\x33\xde\x84\x82\xf6\x3f\x9d\x71\x69\xe7\x73\xa2\xdc\xeb\xee\x03\x70\x5d\xac\x11\x7f\xd1\x49\x9b\x68\xe7\x41\x4f\x51\xff\x94\x37\xf2\x53\xa1\xd9\x90\x1e\xc3\xb0\xbb\xa8\x69\x65\xa1\x93\x83\x65\x54\x87\xb5\x80\x10\xf8\x04\x90\x9d\xe1\xff\xb2\x21\x2c\x02\x52\xdd\xd9\xbf\x2a\x56\xac\x46\xbd\x59\xc0\xc3\x4d\xd5\x9e\x46\x59\x8b\x6b\xab\xd4\xe5\xf3\xff\xfd\xe5\x5e\x48\xda\xb0\x39\x8c\x22\xaf\x9e\x26\xba\xdd\xf7\x72\x75\xe5\xf0\x17\xb3\x5a\x9b\x8f\x84\x35\xf9\x63\x19\x36\xb3\x91\xcb\x95\xd7\xad\xf3\x5d\x1d\x85\x45\xa0\xfd\x06\x64\x12\xd5\x08\x96\x7b\xbe\x9a\x20\x24\x5a\x26\x9e\x3b\xe2\x77\x71\x17\xe7\x5f\xba\xc1\x70\xdb\xa3\x52\xbe\x69\xb2\x54\xd3\x53\xb3\xb2\xcb\x3b\x7e\x21\xb7\x21\xaa\x9f\xe0\x44\xf8\x91\x6b\x4b\x2a\x6f\x8c\x28\xf8\xab\xe6\x6a\xc9\x2b\x91\x32\x3a\xc7\x3a\xfd\x93\xdf\xbe\xea\xee\xf2\x6d\x19\xbd\x9f\x67\xe9\x9d\x48\xcd\x2a\xd2\xd3\xe5\x5e\x45\xd2\x4d\x54\xb5\x0f\x44\xa3\x9b\x90\xe2\x42\xeb\xe9\xb4\x2b\xeb\xdb\x23\x0c\x47\x0b\xdf\xde\x1b\xc7\x72\x1c\x31\x20\x00\x84\x77\x39\x3d\xcc\x2e\x15\xfd\x22\xb2\x51\xfe\xb0\xe1\x8b\x02\x88\x3c\x07\x8a\xee\x4f\xb7\x60\x65\x5a\x67\x1d\xc7\xb8\xaa\xdb\x9a\x56\x24\x20\xa3\xc2\xef\xa2\xd3\x42\xe1\xe0\x09\x9d\x95\x1b\x42\x24\x29\x84\xf5\x94\xe6\x91\x4f\xe2\x82\xb1\xee\x12\x87\x35\x98\x4e\xf9\x3a\x66\x9e\x6e\xcb\xa2\x6c\x9f\xcb\x9f\x09\xf0\x92\x56\x64\x56\x17\xf1\x39\x2d\x35\x90\x89\x17\xcb\x8d\x29\xe0\x89\x7c\x75\x03\xcd\xdd\x5d\xe1\x95\x96\x86"}, +{{0x37,0x17,0x44,0xab,0x63,0xc1,0x15,0x61,0x39,0x29,0xa3,0x43,0x70,0x9b,0xb0,0x19,0xb7,0x35,0x7d,0xff,0x72,0xd2,0xa1,0x49,0xf1,0xd0,0xf7,0x1d,0x3a,0x20,0x1e,0xfe,},{0xe5,0x8a,0xbf,0xad,0x4a,0x13,0x85,0x9f,0x0a,0xcb,0x05,0xd0,0xe4,0x7d,0x59,0x63,0x8f,0x7b,0x1b,0x49,0x36,0x10,0x0b,0x98,0x8d,0x61,0xe6,0xe7,0x0e,0x22,0x66,0x7d,},{0x5e,0xae,0x4a,0xc7,0x2a,0xf0,0x17,0x4a,0xb2,0x56,0x52,0x7b,0x7c,0xd3,0x37,0xa0,0xe5,0x48,0x2e,0x61,0x5a,0xf0,0x68,0xdb,0x21,0xda,0xe3,0x5a,0x64,0x64,0x07,0x42,0x60,0x4d,0xf7,0x3f,0xd4,0xca,0x02,0xed,0x95,0x15,0xa5,0x60,0x8d,0x73,0x19,0x52,0x30,0xfa,0xdc,0xa7,0xb4,0x26,0xf0,0x2a,0x2f,0xbf,0xd0,0x20,0x61,0xaf,0x36,0x00,},"\xc2\x19\xde\x1e\x8d\x7a\xd8\xdf\x08\xc4\x93\x77\x39\x6f\xe7\xc1\xf2\xd5\x7b\xd2\x17\x06\x33\xa0\x0d\x70\x8f\xaa\xde\xe1\x80\xce\xba\x92\x84\x9a\x77\x78\x50\x6c\xbb\x36\x68\x75\xbf\x91\x24\x70\x18\x94\xce\xcd\xb3\x38\x51\x47\xd0\x67\x18\x43\x92\x2a\x64\x9a\xff\x7c\x43\x5e\xb5\xa9\xc7\x49\x27\x50\x30\x72\xd0\x06\x79\x78\x71\x6d\xc8\x0b\xe1\x54\x5a\x2d\xbf\x5a\x1c\x38\x53\x6e\x12\xbd\x77\x20\xc1\x96\x5d\x38\x03\xa4\xe8\xaa\x55\x76\x51\x92\xa1\x3b\x70\x5c\xa1\x05\x9d\xed\x0e\x80\x63\x62\xfc\x5b\xbe\x6c\x76\xa1\xc9\x67\x4b\xb8\x53\x79\x0f\x7e\x90\xaf\x00\x75\x3e\x00\x43\x6d\xa4\x8c\xd0\x82\xea\xd6\x4f\xdd\xb6\x89\x89\x01\x62\x08\x2f\x84\x82\x92\x4f\x33\xac\xd6\x04\x64\x0f\x69\x92\x73\x52\xb4\x3f\x64\x40\x2d\x27\xa8\x83\xfa\x6b\x72\xaa\x70\xd2\x41\xdf\xfa\xa1\x70\x1a\x25\xcf\x10\x79\x35\x82\x60\x79\x38\x75\xf7\x6a\x29\x78\xe9\xf9\xf9\xd6\x86\x34\xeb\x3f\x5f\x01\xbd\xe1\xce\x49\xe5\x92\x12\x52\xf9\x49\xf0\x82\x79\x5e\x4e\xaf\xed\x7b\xe5\xb4\x9a\x9f\x95\xed\xbb\x4a\x13\x53\x2e\x3f\x3b\x3b\xe6\x2e\x26\x52\x23\x12\x53\xa2\x0c\x1d\x54\x77\xe8\xf4\xbc\x57\xed\x76\xfa\x19\xea\xf0\x3a\x11\xbb\xa4\x29\xb6\x49\x6c\xe7\x62\x46\x17\x0e\x04\x3b\xc1\x4f\x2d\x2f\x70\x3d\x96\x8f\x1d\xeb\x09\x38\x87\x15\xc3\x7c\xb4\x75\x2d\xa8\xd4\x64\xe3\x48\xe0\x31\x3c\x89\x93\xe2\x41\x33\xa7\xc5\x45\x28\x4e\x3c\x9c\x90\x7d\x01\xb2\x60\xc4\x88\x3f\x9c\xb3\xe3\xdc\x5b\x6f\x7f\xb6\xd7\x55\x36\x36\x5f\x21\x32\xea\xed\xda\xb5\x70\xe7\x27\x3a\xfa\xc0\xbf\xf5\xc9\xfc\x0b\x82\x0f\x20\x78\xe0\x33\x60\x52\xe1\xfe\x7b\xde\xc8\x66\x74\xd0\x99\x8e\xc7\x8d\xa1\xc3\xf3\x47\x51\xf8\x86\x72\x76\x95\xf3\x5e\xca\x13\x04\xb1\x47\x34\x76\x6a\xb0\x5c\x11\x86\x30\x6d\xed\x9d\xb3\xee\xf6\x5d\x3c\x04\x56\xcd\xae\x81\x81\xaf\xee\x04\xb2\x96\xc6\x72\x2a\x88\xc7\xef\x30\x88\xd2\x6f\x7f\xe7\x4b\xc8\x9c\xf5\x28\x5c\x68\x8f\x02\x7b\x7e\x68\x60\x04\x86\xaf"}, +{{0x49,0x8b,0x6e,0xe6,0x49,0x2d,0x53,0x23,0x1b,0x35,0x32,0xd1,0x93,0x57,0x8b,0xa7,0x5d,0x6a,0x89,0x4e,0x2e,0x53,0x00,0x34,0xe2,0x1a,0xb8,0xad,0x8d,0x2c,0x0d,0x1f,},{0xd1,0x24,0x66,0x5b,0x28,0xfa,0xcd,0x2d,0x17,0x94,0x6a,0x04,0xdf,0xe3,0xd1,0x29,0xa4,0x56,0x1a,0x2b,0x24,0xeb,0x32,0x6d,0x84,0xb6,0x2b,0x42,0x2e,0x44,0xdb,0xcf,},{0x11,0x2f,0x5c,0x6d,0x3b,0xcb,0x3d,0xd9,0x93,0x46,0xd3,0x2a,0xd6,0x9c,0xbf,0xac,0x3e,0x65,0x3b,0xef,0x29,0xc6,0x8a,0x33,0xf4,0x32,0x31,0xf6,0x6c,0xea,0x1d,0x0a,0x19,0x54,0x27,0xd6,0xe1,0x0c,0x0e,0x77,0xc5,0xd5,0x5f,0xe2,0x79,0x42,0x87,0xee,0x32,0xe5,0xe2,0x2b,0xaf,0xbb,0xd8,0x05,0x2a,0xd3,0x60,0x6b,0x90,0xf9,0x45,0x05,},"\x04\x98\xa5\x9b\x87\xcd\xae\x28\x69\x55\x47\xe1\x08\x63\xbc\xe8\x04\xd9\x7d\xe0\xac\x80\x08\xf3\xd5\xfb\x65\x2c\x17\x57\x41\x9f\xdc\x9e\x0f\x97\x36\xf4\xc5\x9a\x34\xf2\x1c\xfc\x74\x59\x9f\xa7\x88\xfc\xc1\x0c\x67\x30\xc7\xdf\x8c\x3d\x2c\x1b\x6a\x78\x6d\x12\x30\xb6\x55\x85\x71\x9d\x1c\xb5\xc4\x90\x35\x9b\x94\x43\x5d\x6d\xd6\x71\xf5\x4d\x6e\x9a\x19\xb9\xb5\xaa\xad\x7e\x0f\x23\x3f\x87\x97\xdf\x99\x78\x28\xd8\x8c\xd9\x2e\xf0\x89\xef\x7d\xbf\x1e\x95\x27\x78\x94\xa2\xf7\xc2\xfd\x0c\x8e\x4d\xfd\xfa\x6d\x3d\x14\x58\x9f\xf0\x19\x16\xdb\xf9\xdd\xd8\x11\xc2\xf5\xe0\x1e\x94\x29\x89\x90\xa1\x45\xa6\xcf\xc2\x68\x95\x61\x4c\x7c\x96\x3f\xef\x30\x8a\x4e\x38\x56\xc3\x2d\xd3\xe3\x59\xbc\x56\xd2\xcc\xa4\x96\xad\x19\x9f\xf1\xa5\x68\xd6\x43\x0a\xc5\xcd\x20\x8e\x0e\x2d\x07\x80\x3c\xa5\x23\xe0\xd8\x13\xad\x37\x33\xab\x50\xbd\xca\xdc\xb9\x88\xae\xe7\x58\xea\x50\x43\x9b\xf3\x8e\xe6\x49\x99\x76\x04\xf1\x51\xc6\x02\xc8\x29\x00\xa8\x20\x5d\x8f\x6f\x67\x0c\x86\x84\xbf\x5a\xbb\x5f\x75\xff\x29\xa3\x7e\xb9\xbf\x81\x05\x19\x9f\xbb\xfb\x47\x07\xe1\x62\xe6\x4c\x71\x52\x70\xf8\x53\xe6\x48\xb0\xaa\x26\xfe\xa0\xf6\xdb\x56\x28\x96\xbf\x42\x4a\x9f\xfc\xb2\x92\xfa\xe8\x5b\x76\xce\xfb\x8b\xd5\xa4\xb3\xce\x1f\xb3\x9b\xd2\xa5\x0d\x0c\x9e\x6d\x93\x3e\x16\x7f\xf6\x29\xb8\xa4\x94\xf2\xa9\xb7\x74\xeb\x30\x3c\x78\x1e\xa0\x2a\xff\x1a\x8a\xfa\xdc\x24\x65\xcc\x61\x69\x68\x01\x5e\xd6\xa5\xa3\x3c\x31\x20\xb9\x45\xed\x53\x51\x98\x1e\x32\xfb\x9f\xb9\x6b\x22\x12\xdc\xf8\xfe\x9a\xc5\x6e\x3c\xf4\x1d\xc5\x24\xf8\x00\x63\x10\x20\xb0\x25\x91\x91\x78\xce\x07\x4e\xef\x07\x8d\x68\x42\x01\x2a\x27\x6e\xfa\x62\x8d\xb5\x40\x58\xd1\xeb\x5b\x5b\x70\x5f\x1e\x18\x18\xd2\xdf\x51\x64\xba\xab\xb0\xc6\x19\x56\xec\xdb\x8c\x70\x6e\x56\x2f\xc4\xfd\x64\x05\x28\x70\x53\x0a\xe4\x25\xb2\x21\xf8\x9d\xd6\xf9\x0d\xab\x88\x2e\x76\x3e\x7a\x7f\xfa\x14\x1b\xba\xa8\xbf\x7a\x3f\x21\xb0"}, +{{0xce,0xfc,0xfc,0xd1,0xcf,0xf4,0xd8,0x91,0x07,0x49,0x27,0x91,0x31,0x83,0x0b,0x1d,0xa1,0x9d,0xfc,0x52,0x45,0xf7,0x8c,0xa6,0x8b,0x8c,0x3c,0x1b,0x62,0x2b,0x45,0x51,},{0x1d,0x39,0x4a,0xbd,0x1b,0x4e,0xd1,0xae,0xdf,0x96,0x6a,0x60,0xef,0xd3,0xff,0x88,0x21,0x40,0xa7,0xe5,0x6b,0x42,0x83,0x74,0xec,0xb4,0x43,0x28,0x9a,0x9c,0x7f,0x00,},{0x7d,0x83,0xff,0x66,0xec,0x79,0x30,0x7b,0x1c,0x0c,0x09,0x3f,0xda,0x39,0x68,0xa9,0x6c,0xf6,0x04,0x4f,0x5c,0x80,0x28,0x88,0x58,0x40,0x18,0x84,0x5e,0x7c,0xaf,0x2a,0x13,0x5a,0xc6,0xf1,0x67,0x7e,0x84,0xd2,0x2e,0x45,0x8e,0x22,0x7e,0x4f,0x93,0x02,0x09,0x91,0x9b,0xc1,0x1b,0x12,0xf7,0xaa,0xf2,0xb8,0xc9,0x43,0x02,0xd6,0x42,0x00,},"\x5e\xc9\x4e\xd0\x6f\xc1\x25\x7a\xe9\xc1\x83\xce\x56\x27\x12\x07\xac\xa3\x7a\x23\xfd\xb4\xb0\xe7\x4a\xc9\x30\x7a\x1b\xb1\x12\xe0\x5e\xd5\xa5\xd0\x47\xc9\x31\x09\xe2\xe5\x94\x77\xb0\x33\x78\x34\x64\x22\xde\x36\x71\x4c\x29\x61\xbb\x97\x36\xa5\x13\xca\x36\x71\xc6\x03\xa6\x8c\x2b\xe7\x31\x7b\x1b\x52\xa0\x76\xda\xe2\xaf\xf7\xbc\x88\xcd\x5e\xea\x0a\xa2\x68\xfa\xaa\xda\xe5\x39\xc9\x38\xbb\x4f\xd4\xb6\x06\x9b\x19\x45\xeb\x6a\xf0\xc9\xe6\xc8\xaa\x5e\xe4\xa4\xaf\x37\xe9\x0c\x67\xe2\x48\xe8\xd2\x7b\xd7\xf9\x58\x9c\x4d\x30\xe9\x05\x65\x1b\xaf\x45\x36\x4f\xa0\x49\x95\x7e\xa5\xd9\xb7\x14\x6c\xa6\x82\x04\xe5\xe9\x73\xd0\xf1\xc9\x1a\x1c\x4b\xde\xd6\x61\x15\x02\x8a\x71\x11\x4f\x0f\x4f\x85\x1b\xd1\x15\xfa\xeb\x95\x4e\x3f\x71\xa0\x14\x70\xb2\x48\x1a\x00\x98\xd9\x9f\x9d\x74\x89\x8c\x8b\xa0\x28\x7c\xc7\x83\x41\x55\x21\x41\x73\xd1\xfc\xba\xfc\xfe\x9b\x08\x25\x03\x84\x43\x94\x76\x05\x58\x83\x83\x38\x16\xc9\x52\x4c\xfd\x57\x44\xaa\xa2\x59\xdb\x7e\xbd\x3a\x6a\xa2\x0b\x5a\x65\x46\xda\xde\xfd\x14\x06\x68\xeb\x0e\xcc\xb5\xf6\x68\xdb\x9f\xc6\x29\x83\xdf\x98\x08\x50\xc9\xd1\x98\x82\xa1\x75\x50\xd5\xdc\xa3\x54\x2c\xd3\x60\x03\xa0\xd0\x3c\xff\xb0\x45\x75\xa3\xe8\xe1\xd0\x70\x15\xc7\xb3\x0e\xca\x91\x15\xcd\x2b\x72\xe4\x6d\xfd\xdf\x6a\x4d\xda\x1f\xaa\x2d\xbd\xc8\x90\x00\xd4\x33\xf6\xec\x9a\xdc\x46\x14\x6d\x93\x9f\x32\x12\x1b\x99\xb2\x89\x83\xd9\x8b\x9d\xde\x8c\x3f\x6e\x57\x79\xf2\xb0\x70\x0c\xb0\x23\xdb\x13\xde\x65\x6e\x0a\xed\x1d\xa2\xd5\xc6\xba\x26\x52\x34\x36\x48\xad\x42\x0f\x6a\xb9\xe5\x5a\x97\x48\x2a\x1a\x22\xb3\xbc\x2e\xe5\x98\x62\x9a\xba\xd9\x54\x7e\xdb\x5f\xf7\x90\x99\x05\x64\xbd\x87\x1f\x81\xb2\x4b\x12\xf2\xbf\x8d\xbd\xfe\x7a\x88\x37\x5f\xad\x9c\xcb\xd9\xfc\x0b\xa1\xd3\xbb\xa5\xe3\xc4\x81\x3c\x18\xa0\x34\x8a\xad\x83\xfb\x1b\x82\x68\x90\x54\xd9\x9b\x46\x00\xdd\x17\x60\xd0\xdc\xce\x44\x75\x74\x67\xbe\xc1\x94\x64\x06\xd5\x30"}, +{{0xd1,0x07,0xcf,0x26,0xf5,0x27,0xdb,0x71,0xa2,0x06,0xe4,0x1d,0x17,0x95,0x53,0x21,0x01,0x32,0x25,0xbb,0x20,0xf9,0x3e,0x12,0xdf,0x3d,0xc7,0x39,0x9e,0x72,0x0c,0xa3,},{0x18,0x6b,0xf4,0x53,0xc9,0x5d,0xc0,0xa2,0xfd,0x58,0x9a,0x78,0xe2,0xc8,0x00,0x40,0xb3,0xf6,0xdd,0xf9,0xa6,0xf8,0x68,0x1d,0x14,0x60,0x36,0xcf,0x21,0x46,0xe8,0xfc,},{0x80,0x71,0xd9,0x7f,0x32,0x4f,0x10,0x35,0x8f,0x13,0xac,0x8c,0x61,0xd4,0x24,0xb4,0xf3,0x00,0xdd,0x04,0x19,0x57,0x1c,0x39,0xe4,0x0d,0x99,0xae,0xa5,0xf0,0x31,0x40,0xe6,0x2a,0xb4,0xc9,0x71,0x27,0xab,0x33,0xe9,0x82,0x69,0x96,0x6a,0xe1,0xd4,0x55,0x7e,0x45,0x9b,0xf7,0xf5,0x97,0xb3,0x13,0xf3,0x51,0xa2,0x01,0x22,0xf0,0x66,0x0e,},"\x78\xeb\x9e\x13\x78\x99\x28\xa7\x4f\x36\x01\x41\x72\x8e\xde\x98\x38\x96\x85\xc8\x36\xb9\x1f\xaf\xbf\x1a\x7e\x8c\x19\xcf\xbe\x21\xbd\x3c\x3d\x6c\x6e\xd8\x3c\x40\x9e\xf6\x93\xf1\xd7\x35\xda\x3f\xa4\x66\x49\x7e\x19\xf3\x8e\x30\xfb\xa2\xa1\x02\x37\x85\x45\x90\x70\xe6\xe9\x2c\x1c\xb7\xc9\xbd\x0c\x9b\xa6\x12\x20\x15\x78\x66\xc3\xbe\xd2\xb0\x1e\x6e\x6b\x9b\x8d\xd3\xf0\xc4\x7c\x02\xf1\x81\x34\x6a\x0a\x9b\x9b\x5d\x3d\x7e\x18\xa9\x4d\x69\x56\x85\x5e\x16\xe8\xea\xaa\xab\x71\xb1\x03\x02\xf3\x5b\xd8\xfb\x1f\x9b\x58\x47\x30\x41\x60\x32\x49\x26\x64\x5b\x05\x82\xc2\xf2\xf1\x53\x3a\x24\x28\x14\x61\x51\x42\x41\xdb\x28\x50\xef\x31\xc5\x76\x3b\x2e\x3d\x4f\xb1\x8f\xc6\xd8\xc1\xd7\xe5\x2f\x7c\x13\x39\x2c\x17\xe2\x70\x19\xff\x60\x00\x8e\x43\x1f\x17\x14\x37\x0b\xc0\xef\xd9\x45\x2a\x61\xf5\xc5\x64\x88\xd9\x1a\x18\x50\x37\xf1\xf6\x47\xf7\x2f\xa7\x85\x01\x0d\x5d\x78\xf0\xa1\x15\x87\xcc\xf6\x6b\x80\x88\xe0\xe6\x35\xff\xf3\x77\x41\x93\xb2\xed\xef\xfd\x92\xd6\xe8\xa0\x32\x11\x28\xae\x64\xcd\xb8\x62\xe6\x31\xe2\xee\x5b\xa0\xda\x44\xbb\xd5\x89\xdc\x39\x2b\x5a\x11\x3b\x86\xa7\x27\xa8\xdd\xb6\x98\xa3\x34\xcc\x66\x8b\x39\xb1\xcd\xe1\x99\xb8\x88\x37\xca\x5f\x00\xf5\x53\xf8\x9c\x62\x28\x34\x27\x36\x41\xd3\x9b\xc1\x0c\x6a\x24\xe1\xeb\x42\x58\x75\x42\xf0\x3f\xc1\x62\x75\x24\xed\x6b\x74\x93\x91\xf1\x10\x28\x70\x6c\x42\x36\x44\x25\xb2\xca\xf2\x01\x80\xe1\xb8\x02\xc7\x44\xb4\x9b\x7b\xcd\x9b\xf7\xb1\x5c\x23\xa0\xbf\x1c\x69\x65\x96\x0d\x34\x15\x54\xe1\x96\x6b\x6e\xf8\x2f\xcf\xbb\xe4\x1d\x1e\x09\xd7\x41\xe3\x09\x25\x44\x46\x77\x7f\x13\xc2\x9a\x67\xb8\xbd\xeb\xc5\xf7\xf0\x4d\x16\x0d\x60\xe3\x32\xe3\xd0\x44\x1a\x0f\x2f\x7b\x19\x2c\x3e\x2b\xdf\x6d\xad\xec\x2a\x42\x4f\x88\x66\x98\x06\x23\x6e\xe0\x4d\xea\x69\x2b\xd8\xbb\x6f\x91\xca\x06\x82\xec\xe3\x49\x14\x25\x75\x35\x8b\x9b\x7b\xe7\x06\x00\xb3\xcb\x81\xe1\x45\x6b\xa0\x79\x9f\xdc\x01\xff\xd6\x86\x23"}, +{{0xaf,0x7e,0xa8,0xe4,0x1c,0x89,0x37,0xa4,0xec,0x47,0x5a,0xd8,0x13,0x71,0xa1,0x71,0xd3,0xd0,0xf9,0xfd,0x75,0x19,0xa0,0x4c,0x75,0x1e,0xd4,0xad,0x8f,0xf8,0xfe,0xf9,},{0x15,0xdf,0xc7,0x15,0x85,0xba,0xc7,0x1e,0xf2,0x0f,0x37,0x49,0x87,0xc5,0x55,0xa3,0xf2,0xf0,0x7d,0x6b,0x9c,0x78,0x70,0x66,0xc1,0x0d,0x63,0xcf,0x06,0xe0,0x2a,0xb0,},{0xc0,0xf1,0x73,0x91,0x67,0x27,0x4b,0xf9,0x18,0x31,0xc7,0x4b,0xeb,0x64,0x5a,0xf7,0x90,0x45,0x9b,0x28,0xbb,0x3f,0x21,0x32,0x53,0x65,0x13,0x0f,0x40,0x9a,0xcb,0x66,0xdf,0x1d,0x22,0x37,0x59,0xa9,0x75,0x8e,0x08,0xfd,0x72,0x53,0x73,0x74,0x84,0xe2,0x85,0xa6,0xfb,0x47,0x40,0x4a,0xbe,0x2e,0xba,0x5e,0xf2,0x49,0xfd,0x02,0x5c,0x0a,},"\x05\xf2\x26\x3f\x02\x45\xec\xb9\xfa\xeb\x14\xe5\x7a\xca\x43\x66\x68\x30\x8c\x81\x25\xdf\x31\x16\xc4\xee\x20\x50\x1d\x0c\xde\x70\x1b\x36\x6e\x2b\x50\xa1\xc5\xed\xf4\x84\x14\x4c\xe1\x6b\xfb\x1f\x7d\x26\xdc\x42\x75\xea\x97\x32\xe2\x64\xba\x4d\x4a\x36\x2b\x40\x27\x5b\xa4\x73\x77\xdb\xc3\x32\xcb\x65\xe2\xf4\xc8\x85\x38\x94\xaa\x87\x8a\x4c\x17\x5d\xc5\xb3\xb2\xa7\x57\xff\x3c\x8d\x7d\xe6\x60\x97\x3b\x89\xda\xdf\x07\x6e\x2e\x4f\xc7\x62\x39\xb7\xbc\x75\x2a\x22\x9d\x44\xe0\x00\xce\xb6\x67\x10\x4c\xb0\x74\x6b\xfc\xf5\x9d\x69\x60\x3a\xe7\xfc\x1b\xcf\x11\xd2\xe3\x3f\x61\xdc\x49\x7e\xc1\xb0\xbd\x5e\x4f\x1d\xbe\xf4\x35\xf2\xf2\x91\xf3\x0b\x00\xa8\x5e\x83\x39\x46\xc8\xb1\x04\x84\xe4\xab\xd7\xd6\x0b\xdb\xb1\xfe\x6d\xff\x58\x07\xa5\x3b\xb8\x93\x82\x15\x30\x13\xb7\x0c\xa0\x8e\xfc\x91\xb7\xe9\xfc\x5b\x5d\xbb\xb6\xaf\x12\x3b\x57\xbe\x2e\x14\x0f\xc4\x71\xa4\x5d\x89\xfa\x82\x84\xcc\x27\xe0\xa1\xfe\x77\x1f\x55\x59\x8b\xbd\xcf\x06\x8d\x50\x6d\xad\x0a\x59\x21\x79\xce\xca\x39\xee\x95\x26\xf9\xe4\xfe\x47\xbf\x2b\xb1\x4f\xb1\x48\x6a\x67\x7d\x4d\x7b\x99\xa5\x20\x54\x56\x76\xa0\xf1\xfa\x80\x90\x49\xaa\x24\x14\xae\x7b\x81\x7d\x9a\x03\x6e\x5c\x15\x78\x86\xe8\x34\x1d\x4e\x81\x9c\x09\x2a\x3b\x48\xb3\x60\x6b\x03\xac\xb7\x27\xc6\xc2\x21\x7d\x0a\xf3\x01\x21\x54\x6a\x94\xaf\x6b\x49\xca\xa2\xa8\xc9\xb1\x78\x6f\xa0\xc2\xa5\x24\xec\x7a\x02\x3e\x92\x4b\x5f\x8a\x89\xa5\x37\x80\xc7\xf8\x78\x1c\x5b\x8e\x86\x94\x30\xca\xa0\xe6\xd0\x43\x79\x67\xe3\xae\xd4\x4f\x45\xc9\x01\xcb\xcf\x10\x26\xfb\xbd\x4e\x3d\xd9\xa0\x91\xec\xf8\xb3\x4f\x7d\xd5\x03\x8e\x54\x3d\xc7\xeb\x6a\xd5\x49\x4e\xfb\x14\x5c\xf6\x3e\xc0\xd3\x55\xbb\x8e\x17\x2f\x45\x5d\x8a\x6b\x13\xda\xca\xad\xdb\xc5\x6e\x47\xde\x3c\xf7\x62\xa1\xa7\x38\xef\x09\x2f\x14\x36\x68\x04\x67\xb5\xcd\x82\xe9\xe3\x6e\x2d\x2b\x68\x42\xb3\xbd\x5d\xce\x77\x18\x0d\xda\xf0\xb6\x43\x37\x8e\x69\x85\x99\xdd\x47\xf5\xcd\xbb"}, +{{0x0c,0x57,0xcb,0xfc,0xeb,0xde,0x10,0xed,0xe0,0x2d,0x1c,0xb0,0x1d,0xf3,0x60,0xd4,0x1f,0x2e,0x66,0xa5,0x04,0x43,0xd5,0x8b,0x5d,0x4f,0x08,0x28,0xc9,0xa1,0x8b,0xb7,},{0xc4,0xd7,0x61,0xba,0x18,0x99,0x71,0xb9,0x46,0x2c,0x61,0xbf,0x46,0xa7,0x65,0xf8,0x8e,0x2e,0xca,0xa5,0xbf,0x22,0x11,0x22,0x0a,0xfb,0x00,0xac,0x65,0x7f,0x7c,0xe5,},{0x8a,0xf7,0xbb,0xe0,0x1b,0x8a,0xb9,0x39,0x51,0xd1,0x6f,0xca,0x05,0xa9,0xc9,0x67,0xd1,0xc5,0x2c,0x97,0x4b,0xea,0x15,0x1e,0xa7,0x2e,0x4c,0xeb,0xaa,0x20,0xcc,0x78,0x3b,0xb6,0x1d,0x8d,0x69,0x38,0x5c,0xac,0x5b,0xc6,0xd7,0x2d,0xbd,0x16,0x2b,0xee,0xf1,0xfc,0xb5,0xdd,0x0e,0x0a,0x08,0xb4,0x8c,0xa0,0xb9,0xf6,0xd9,0xa9,0x88,0x0c,},"\x33\x77\x03\x24\x3a\xb5\xb4\xe4\xd3\x48\x1e\xe8\xdd\x1f\x44\x94\x50\x71\x74\x41\x26\x58\xa9\x39\x88\xb5\xc3\x04\x03\xa7\xb7\xed\x85\x22\xce\xb4\x6f\xa1\xee\x02\x75\x3a\x87\x4e\xf0\x67\x5d\x39\x7c\x57\x5d\xa0\xb0\x8c\xaa\x8c\xee\x33\x93\x78\x4d\x0f\x0d\xb8\x45\x98\x37\xaf\x90\xb9\x05\x6d\xf4\xe3\x8e\x41\x7f\x3a\xd2\xeb\x1a\x10\x0e\xf2\x07\xce\x2c\xa6\xc6\x10\x01\x80\x21\x66\x1e\x30\x70\x99\xf2\xb7\xc4\xae\x87\x59\x91\x14\x0b\xdd\x3f\x0f\x99\xad\x2c\x5d\x55\xaa\xcb\x84\xcc\x1c\xdc\xd5\x79\xe0\x80\x72\xb6\x95\x1f\xd4\x5e\xd2\x89\xac\x9f\xf7\xf0\x98\x6a\xc8\x8a\x4f\xbb\x9d\xc9\x20\x3d\x9b\xaf\x18\x0c\x90\xed\xf9\x37\x25\x8c\x9d\x0a\x6d\x48\xe2\x20\xf7\x2d\x25\x0c\x7f\x2c\x77\x7e\xaa\x7f\xb9\xfa\x11\xd5\x0a\x57\x98\x77\x2f\x9f\xd9\x76\xb0\x05\x99\xf1\xf0\x27\x6f\x3a\x2e\x4d\x98\x8a\xe9\x21\x25\x46\x7a\x8d\xed\xb7\xa1\x6f\x9e\x3a\x56\xe8\xd0\x06\x62\xb3\xeb\x67\xa3\x5b\x9b\x60\xe7\x3b\xd9\x35\x07\x7e\xe2\x38\xdf\x8f\x6e\x83\x3b\x9a\x55\x23\x38\x68\x26\xc1\xf2\x91\x7b\x1c\x3e\xc9\x8e\x0a\x5f\xde\x89\xc4\x8b\x1d\x44\x6d\xa5\xd0\xc8\x85\xfe\xf0\xe3\x74\xbf\xf3\x0a\x99\x7c\x7b\xaf\xd5\xe7\x43\xc8\x5d\x0c\x6a\xaa\x6e\xf1\x0a\x06\x12\x11\xa2\x32\x7c\x6d\x84\xeb\x74\x7a\x56\xe9\xbf\x60\xfc\xd5\xb5\x53\xb7\x98\x83\x4d\x0c\x5c\xca\xdb\x9d\x4b\x54\xe7\x23\x7d\x12\xc6\x79\xc1\x93\xa2\x87\xbb\x2f\x51\x1c\xd4\xee\x2a\x2d\x85\x49\xb4\x4b\x21\xc1\x1f\xbe\x57\x23\x38\x1c\x6c\x5f\x78\x46\x87\xfd\x90\xce\xbc\x5b\x49\x5a\xf9\xe4\x14\xf2\x96\x1b\x06\xa1\xc8\x43\x3b\x9a\xa3\x29\x2b\xcf\xf4\x24\x1c\x22\x71\x67\xf8\xd1\xde\x05\x4b\xa3\x3a\xd8\x1d\xa3\xeb\x3e\xc6\xe4\x0a\x6e\x26\x85\x4a\xf3\x49\x54\x01\x71\xb7\x5d\x75\xfb\x9a\x8d\x12\x93\x78\x27\xfd\x59\x4d\x31\x7b\x7a\x8d\x9f\x1c\x2f\xca\xbd\xa5\x63\x75\x56\x8c\x3e\x9e\x51\x4c\x2e\xff\xfc\x38\x78\x36\x3d\xcf\xad\x9f\xd9\x54\x36\xb0\x22\xe8\x77\x2a\x88\xcb\x71\xe8\x03\xbf\x90\x38\x19\x62"}, +{{0xfe,0x71,0x72,0x27,0x83,0x64,0x19,0x4b,0xcf,0xef,0xb4,0x78,0x31,0x42,0xb7,0x9f,0x59,0xd5,0xfd,0x97,0x8b,0x1e,0x47,0xc3,0x14,0xd7,0x8d,0x4c,0xb3,0xf6,0x1c,0x8a,},{0x2e,0x82,0xcc,0xe4,0x79,0x10,0xc7,0xe2,0xa7,0x9b,0xc1,0xf4,0x19,0xdc,0x3c,0x3d,0xf5,0x4f,0x23,0x29,0x1f,0xc8,0x19,0x3e,0x82,0x58,0xcc,0xd2,0xfd,0x38,0xd5,0x48,},{0xf6,0xc2,0xa4,0x29,0x6b,0x9a,0x34,0x07,0xc6,0xd7,0xa5,0x67,0x9d,0xae,0x86,0x66,0xb5,0x03,0xd1,0xa1,0x7e,0xac,0xf7,0x1d,0xf4,0x93,0x79,0x1b,0x8f,0xf0,0xc0,0xaa,0x8e,0xed,0x36,0xb3,0x27,0xa2,0x9a,0xb7,0x82,0x8f,0x46,0xf2,0x2d,0xe8,0x68,0xb6,0x28,0xb1,0xcf,0xd5,0x01,0xe8,0x59,0x9f,0xa3,0x16,0x93,0xb1,0x5f,0x61,0x08,0x0f,},"\x23\x50\x94\x51\xa0\x59\x96\x9f\x2b\x4b\xdf\xce\xe5\x38\x89\x57\xe9\x45\x6d\x1f\xc0\xcd\x85\x7e\x4f\x4d\x3c\x25\xa4\x15\x5d\x5e\xe9\x1c\x20\x53\xd5\x58\x06\x2e\xea\x68\x27\x95\x0d\xe8\x63\xbc\x9c\x3d\xf9\x67\x2c\xde\x8b\xa7\x41\x74\x4e\xbb\xdd\xb4\x5e\xc1\xf4\x28\x45\x70\xfd\x0a\xac\xd0\x7e\xa5\x8c\x58\x1b\xe2\xaf\xc9\x5a\xe4\x44\xe6\x78\xed\xc2\xa0\x24\x39\xf3\x87\xce\xc9\x82\xea\x3a\x44\x81\x4a\x8a\x30\x2b\xb3\xbf\xe8\x22\x8d\x58\xde\x03\x9d\xeb\xdf\x7c\x2a\x7e\xdd\xb4\xe7\x1c\xa4\x74\xf9\x4f\x7e\x2b\xd8\x9d\xc6\x5b\x16\x10\x73\x3c\x91\xff\xf8\x9b\xd4\x99\xf4\x01\x54\xa6\x19\x8f\xdf\x5e\xc7\xad\x37\x22\xd9\x25\xb2\x92\x19\x6c\x42\x94\x99\x07\x5b\xe0\xc5\xb6\xda\x9c\x09\x0c\x07\x91\xa7\x01\x9e\xb5\xe7\x36\x6b\xe6\xce\x58\xab\x2f\x04\xfe\xcd\x91\x27\xc4\x27\x18\x04\x7b\xf4\x70\x30\x69\x15\x21\x31\x2c\x08\x77\xaa\x3f\x36\xcc\x5f\xbc\x9c\xaa\xe0\xfd\xe3\x94\x5d\x2a\x86\x8e\xe2\x50\x2a\x38\x33\x20\x8e\xb8\x50\xa1\x63\xcf\xcb\xf6\xda\x9e\xe6\xad\x9f\xe0\x67\xfe\x24\x19\x86\xfe\x44\x36\xd6\xae\x4e\xdc\x61\x56\x19\x38\xe2\xa3\x3f\x4a\x33\xdb\x63\xf6\x9d\x3f\x1a\x88\x50\xed\x40\x02\x88\x69\x16\x41\x03\x48\x8f\xb7\x95\xcd\x82\xca\x06\x7f\xe1\xb4\x89\x7c\xaa\x49\xa7\xca\x9a\x80\xf3\xa8\x15\x1f\xd1\x3b\xbb\x7f\xf3\x50\xe8\x57\x9f\x56\x5d\xc1\xc4\xa9\xca\x93\x8d\x27\xb1\x5b\x3f\x85\x8e\xf4\x5d\x3d\xd7\x8b\x2c\x35\x86\x35\x35\x63\x15\xf5\x5a\x97\x52\x8e\xcf\xec\x5d\x11\xa5\xb7\x21\x50\x31\x07\xfa\xa4\x06\xc1\x70\x34\xe6\x01\x47\x4b\x3b\x60\xcf\x48\x69\x2e\x26\x92\x61\x15\x8f\xc3\x53\xd4\xdf\x42\x74\x38\x13\x57\x79\x0b\x77\x56\x08\x7b\x00\xcc\x79\xe3\xb9\xd2\x8a\x3f\x24\x39\xfe\xbf\x19\x9e\x64\xa8\xb3\x7c\x91\xb5\xa4\x33\x4e\x33\x54\xe8\xfa\xf3\xa3\x61\xe8\x56\xc5\x4b\xda\xa4\x3b\xfd\xcd\x6e\xe6\xc9\xf9\x67\x95\x88\xf6\x06\x99\x50\x83\x23\x48\xaa\xcb\xa2\xbf\xee\xba\xca\xa2\x07\x1d\xdc\x7d\x77\x89\x8e\xf0\xf6\x87\x93\xcd\x25"}, +{{0xa9,0x51,0xe4,0xe6,0xba,0x9f,0x1f,0x0b,0x35,0x48,0x31,0xc9,0x86,0x94,0x24,0x48,0xfa,0xed,0xe3,0x7e,0x11,0xb0,0xf2,0x47,0xda,0x27,0x06,0xdc,0xee,0xf7,0x3a,0xc7,},{0x30,0x36,0x20,0x14,0x97,0x4b,0xf7,0x5c,0x84,0x95,0xc2,0xe2,0x71,0xe7,0x13,0xd5,0x73,0x84,0x38,0x4d,0x0a,0x5d,0xa8,0x8e,0xde,0xea,0x79,0x27,0x9c,0x0c,0x58,0xec,},{0x02,0x78,0xc8,0x6a,0x15,0x20,0x8d,0x9b,0xe5,0xb1,0xe1,0x57,0x47,0x61,0x86,0x1b,0x8a,0xf7,0x2a,0xe0,0x8d,0x40,0xcd,0xcb,0xec,0x35,0x4e,0x65,0xa9,0xc3,0xd0,0xa0,0x6b,0x5f,0xcb,0xb2,0x97,0xd0,0x9b,0xef,0x39,0x74,0x62,0x39,0x59,0x86,0xc3,0x09,0x3e,0xeb,0x22,0x64,0x4c,0x00,0x3c,0x30,0x78,0x17,0x8c,0xdf,0x67,0x4e,0x99,0x0a,},"\x20\x57\x7d\xca\xc8\x91\x74\x88\x5e\xed\xb0\x62\x48\x9c\xd5\x12\xfa\x72\x86\x3e\xc5\x43\x8e\x31\xe9\x58\x78\xb7\x5c\xe2\x77\x2a\xee\x62\x90\xa0\xba\x3c\x8f\x64\x2c\x1d\x0e\xf5\x5d\xa8\xd5\xbc\x14\x84\xf8\x3b\xb9\x87\x6c\x7a\x8c\x0b\x6b\x60\x9b\x94\xd1\x12\xa0\x6f\xc8\x3c\xe8\xd2\xc1\xe0\x8e\xd6\xc7\x35\xe5\x7b\x24\x4a\xad\x6e\xcf\x70\x75\x36\x3d\x56\x5b\xa4\x78\x65\x69\x5c\x84\x23\x51\x09\x09\xe0\xa3\xdb\x4b\x61\xed\x7a\xa6\x7a\x74\x71\x33\x1e\x83\xa0\xc5\x8b\x82\x20\xa6\x24\x5f\x65\x66\x15\x49\xc1\xa1\x2d\x4c\x0d\x50\xc3\x26\xfb\x94\x91\x7c\xbd\x07\xbe\x51\xe8\x3f\xe8\xbb\x3e\x46\xca\x01\xb0\xa2\x60\xda\xaf\x1d\x6a\xbe\x37\x03\xd6\xa9\x25\x11\x3b\xb4\xd5\x7e\xa1\xa4\x8b\x4c\x7d\xbd\xaa\x03\xee\xa8\x14\xa4\xb5\xf0\x2e\x1d\xfb\x54\x5c\xc6\x23\xfe\x17\xa3\xbb\x18\xe4\x37\x3f\x5f\x7e\xc2\xfb\x52\x17\xd2\x3e\x4f\xed\x54\xa7\x72\xe1\x13\x23\xe7\x30\xaa\xd7\xef\xca\x8c\x46\x44\x00\xe7\x67\x90\x55\xfc\xc1\x25\xa8\x76\xef\x7b\x8b\x9d\xe1\x86\xe2\x29\xa7\xab\xf1\x91\xd0\xc5\x6d\x91\x81\x5f\x67\x87\x2e\x95\x7b\xfb\xc7\x63\x4a\xac\x40\x35\x76\xa5\x8f\x42\x7b\xdb\xb3\x0e\x8c\x4b\x6f\xc6\xc4\x47\x74\x10\x24\xeb\xb5\x03\xa5\xa9\x02\x51\x24\xa4\x88\x7f\x82\x5a\x43\xee\x94\x0f\x21\x0a\x1b\xd5\xae\x4f\x67\x32\xd6\x0f\x95\xf2\xb8\x32\x01\xc4\xc6\xdf\xe2\x79\x41\x2d\x75\x02\xa5\x21\x1f\x8f\x48\xf8\x00\xdb\x30\xfc\x37\x76\xc4\xed\x3a\x38\xbb\x46\x34\x82\x2c\x98\xa6\xd6\xdd\x32\x33\xbe\x60\xe4\x2c\xca\x45\xa3\x16\x3c\xc8\x4e\x9e\x8d\xa6\x47\xc0\x71\x1b\xc4\xc6\xcc\xd6\x5a\xa1\xe9\x72\xc0\x74\x04\xd1\x03\xe7\x4b\xcc\x31\xa7\xe2\xc3\xee\xa5\xac\x92\x57\xab\x42\x89\x47\xab\x3d\xd3\xfb\x15\x3d\x90\x69\x4a\x40\x73\x37\x3c\x4d\xd9\xce\xb1\x31\x15\x4f\xe8\x77\x47\x3f\xd9\x96\xf4\x24\xf3\x3e\x31\x6e\x4e\xb0\x2b\x8c\x75\x13\xbe\x69\x98\xe5\x16\xcb\xba\x54\xd9\x4c\xd0\xa4\x35\xe0\xff\xcc\x2c\x0a\x8e\xf7\x2b\x63\x0e\xc2\x47\x81\x06\x6a\xa5\xef\xb9"}, +{{0x38,0xa9,0xb2,0xd4,0x9b,0xa8,0xb8,0x2f,0x30,0x1a,0x57,0x72,0xce,0xa0,0xef,0xc2,0x21,0x84,0x55,0xc8,0xb2,0x18,0xb2,0x2c,0xba,0xa2,0xaa,0xd2,0xd7,0xad,0x3b,0x35,},{0x9d,0xf5,0xea,0x1f,0x78,0xf8,0x10,0xa5,0x21,0x77,0x46,0x02,0xbb,0xba,0x49,0x42,0xf0,0x45,0x92,0x38,0x96,0x6c,0x8b,0xcd,0x21,0x90,0x0a,0xfb,0xf3,0xd8,0x42,0x93,},{0xe1,0x9e,0x62,0xac,0x53,0x9a,0x9c,0xa2,0x51,0xd1,0x2d,0x4c,0x71,0x05,0x5b,0x0a,0x3f,0x58,0x1d,0x19,0xf2,0x68,0x2e,0x67,0x24,0x04,0xc7,0x8a,0xc1,0xf1,0x2b,0xbe,0xfc,0x91,0x51,0x92,0x76,0xa5,0xcb,0xe1,0x6f,0x52,0x0c,0xf7,0xa7,0xf6,0x87,0xa2,0x40,0xf0,0x32,0x91,0x57,0xc5,0x9f,0x50,0x02,0x6a,0x58,0xdc,0xdc,0x50,0xfc,0x08,},"\x17\x78\x16\x7c\x49\xb3\xa4\x4d\x4a\x5b\xa8\x38\xb7\x38\x85\x53\xb1\xe1\x3d\x36\xea\x4f\x86\xd3\x02\x42\xe1\xa8\x22\xa3\xbb\xaf\xf5\xce\xa6\x3e\x2a\xe2\xa4\x63\x5b\xe2\x36\xfe\xf2\xb8\x13\x5d\x14\xfb\x62\x1c\x0b\xb7\x73\xc9\xc1\x77\x53\xf8\x09\x26\xeb\x55\xd0\xf1\x15\xbd\x09\xa8\x85\xd8\x44\xb8\x18\xc9\xf0\x44\x89\xa3\x31\xbb\x5e\x03\x2b\x8e\x58\xcd\xa3\x69\x49\xc5\xa8\xd0\x8b\x55\xbb\x8d\xe9\x65\xe1\xf9\x0d\x3b\x9c\xfe\xec\xfc\x6a\xd9\xa4\xee\x5c\xb4\x04\x7e\x94\x50\xac\xdc\x64\x64\x01\x66\xa8\xc0\x69\xea\x84\x9a\xeb\xdd\xac\x1a\xe4\xaf\xec\x91\xdd\xd1\x7f\xa5\x55\x3f\xa8\x7c\x56\xf7\xe5\x1e\xc1\xcd\x6b\x5c\xc2\x33\x51\xd0\x57\xa4\xce\x4a\x89\x23\xc8\xae\x6a\xc7\xa8\xaf\xdc\xc0\x88\x1c\x0e\x74\xeb\xb0\x24\xef\x72\x96\x16\x2c\xb9\x3c\x68\xe5\x0b\xbb\x07\x4e\x65\x1a\xc8\x7d\xac\x9e\xa5\x9d\x4c\x3f\xbf\x0f\xe3\x79\xf3\xe9\x7a\x24\x56\x6e\xca\xe5\x43\x03\xbc\xfb\x6f\x0c\xc9\xf1\x5f\x66\x39\x43\x0e\x66\xb1\x9a\x42\x78\x49\xfd\xff\xf8\x33\xdf\x02\x68\x9e\x9d\xe4\x40\x06\xc9\x03\xc5\x59\x18\x34\x59\xb9\xf4\xa9\x7f\x54\xa0\xf2\xa2\x8d\xf7\xb0\xe9\xde\xed\xa8\x23\x9d\x7b\x51\x69\x77\xf5\xe7\xd6\x97\x1b\x45\x02\xe9\x88\x5f\x75\x0a\xf8\xd1\xa6\x66\x9e\x25\xe7\x7d\x5f\x32\x7c\x77\xc8\x7a\x86\xe0\xa1\x87\x2b\xc9\x6a\x76\x06\x0f\x5f\x8a\x0c\x40\xcc\x97\x3b\xfc\x7f\xe6\xed\x9b\xca\x78\xf8\x84\xe6\xa2\x82\x8b\x94\xd4\x89\xd3\x2a\x0f\xd3\x37\xe6\x9d\xb8\x3f\xb8\x78\x9a\xfd\x4e\x8e\xf5\x4c\x22\xa7\x8c\x25\x87\x46\x8b\x9a\xe0\x71\xba\xe3\xb2\x02\xd3\x18\x3a\xd5\xf0\xf8\xe8\x42\xe5\xa8\xde\x85\xbf\xff\x49\xe0\x3c\x83\x81\xbc\xa7\xfd\x42\x78\xdd\xcc\xaf\x01\x34\xfb\x55\x93\xa3\x95\xa7\x7a\x5c\xbd\x43\x45\x93\xbc\x4a\xd0\xff\x4b\x84\x00\xec\x67\x4c\x4e\xca\xf1\xd5\x77\x54\xbe\x0c\xb2\xfa\x9a\x64\x41\xa9\xab\xad\x7b\x42\x19\x7a\xd8\x2e\x50\x82\x7e\x4a\x42\x45\x57\x3a\x8f\x0e\xf8\x7f\x58\x22\x8a\x28\x67\xf4\xb3\xb8\x34\xb6\x63\x50\x37\x94\x0a"}, +{{0x9a,0x17,0x17,0x87,0x36,0x89,0xa0,0x3c,0x11,0x2d,0xd6,0xb4,0xd7,0x6a,0xe7,0x3b,0x89,0xb4,0x16,0xa5,0x98,0xce,0xec,0x20,0x9e,0x27,0x96,0x1e,0x7b,0xb1,0xee,0x8a,},{0xee,0xca,0xd1,0xe0,0xe4,0xb8,0x63,0x29,0x18,0x81,0xa8,0xc2,0x41,0xdb,0x9c,0xcf,0xff,0xe4,0xe5,0x5d,0x8b,0x5a,0x42,0xf3,0x07,0xb4,0x43,0x6a,0xcd,0x06,0x49,0xa6,},{0x1a,0xf8,0xbe,0x09,0x55,0x38,0x96,0x58,0x00,0xd8,0xef,0xf6,0xd7,0x23,0xd0,0x28,0xd6,0x5d,0x0e,0x9c,0x6e,0xb5,0xe9,0xd1,0x25,0xbb,0x3b,0x17,0x83,0xf1,0x1e,0xf7,0x07,0x9a,0x49,0xa8,0x07,0xe2,0x7e,0xf1,0x26,0x0b,0xe2,0x6a,0x3b,0x23,0x1d,0x03,0xb2,0xae,0x15,0x1e,0x49,0xf6,0xf1,0x89,0xf1,0x5b,0x1c,0x83,0xea,0xb0,0x1c,0x02,},"\xe2\x65\x80\x47\x09\x01\xa0\x7a\xb0\x93\x1a\xa2\x38\x29\x80\x2c\xe0\x4d\xa5\x9f\xdc\x2f\x77\x3b\xc5\x67\xf1\xe6\x5b\x4f\x2e\x2d\x4a\x1a\x6a\xec\x1f\x54\x15\x8a\xdf\xce\x9b\x09\x97\x90\xb5\x03\xa1\x3d\x22\x09\x7a\xe2\x3e\xbc\xcf\x92\x3f\x3b\xb1\x98\x6d\x6e\x49\x11\x1a\x8c\xf0\xd4\xeb\x82\x36\xbf\xe0\xd7\xc9\xe9\x3a\x5e\xfc\x7f\xeb\x8e\x6a\x9c\xd1\xb8\xd9\x21\xef\xa2\x1e\x44\x9f\xf4\x9e\x06\xc1\xcc\xfe\xa3\x1f\x93\xe0\x33\xc3\xc2\xa5\x4d\xdb\x0f\x65\x3a\x09\xfb\xd1\x8a\x70\xb5\x63\x15\xf1\x93\xe7\xbe\x56\xe5\x16\x8f\x59\x56\x38\x21\xd4\xbc\x3b\xbb\x0e\xaa\x20\x48\x28\x6b\xbe\xee\x5a\xa3\xf3\xe7\x53\x6c\xf2\xb7\x50\xfd\x32\x26\x02\xbb\x38\x47\xce\xca\x39\xb7\x54\x74\x32\x2d\x76\xb1\xde\x80\xfa\x2e\xad\xba\x15\x2d\x6f\x8f\x02\x0d\x4d\x93\x1c\x53\xf0\xa2\x80\x12\x24\xd3\x5d\xeb\x6e\xc1\x3b\x01\x48\x73\xe6\x89\x90\x36\x07\xde\x96\xd9\xb7\xa7\x43\xa8\x87\xd2\xf4\x8d\xaf\x2e\xd2\xee\xfb\x20\x2a\xbf\x60\x82\x79\x69\x81\x12\x3b\x96\x6e\x93\x6d\xcf\x34\x83\xe2\xd2\x4d\x69\x4e\xcb\x86\x5f\xbe\xb6\x96\x9f\x34\x70\x27\xfb\x8b\x17\x5d\x24\xa4\xc0\x45\xc0\xbb\x4a\xb5\xe0\x2d\xdc\xbe\x77\xd4\x75\x6c\x46\xd1\x37\xb0\x94\x47\x3a\x02\x30\x7a\x10\x83\x40\xac\xad\x9d\x03\xba\xe8\x40\x3a\xf1\x99\xcb\x75\xca\xe3\x16\x2f\x38\x15\x81\x3c\xc6\x8b\xf2\xa5\xe4\x99\xe5\x94\x92\x11\x49\xf3\xbb\xd2\x14\xda\x51\x37\xe7\x56\x52\x15\x59\xdc\x80\xd9\xa4\xb7\x4a\x0f\x49\x43\x02\x2c\x7c\xd5\xfc\xa4\x23\x15\xe0\xbc\xee\xae\x90\x69\x61\x5c\xe6\x7a\x04\x38\x24\x12\x31\x3a\x31\xd6\x7b\x34\x6c\x32\x9a\xd8\x2e\x74\x2c\x0a\x6c\xe0\xa6\xa0\x24\x54\xc1\x13\xe5\x20\x22\xf3\xcc\x03\xfd\xa6\x91\xeb\xdf\xe1\x4c\x53\xc8\xce\x5c\xa9\xb9\x32\xca\x1a\x38\x6e\x3e\xb4\xe9\x0a\x4d\xc6\xe8\xad\x85\x33\xb5\xaf\x1a\xae\xf5\x00\x31\x28\x65\x5c\xa6\x4f\x67\xfc\xd9\x7c\x6a\xc8\x03\x00\x24\x04\x90\x0b\xc0\xfa\xe9\x84\x63\xbc\xc3\x14\x09\xf9\x98\x17\x48\x78\x9a\xde\x2d\x07\x78\x3b\xc3\x2b"}, +{{0x43,0xbd,0x92,0x4d,0xb8,0x15,0x60,0x08,0xc6,0xb3,0x99,0x4a,0x81,0x30,0xd4,0x27,0xd5,0x14,0xdb,0x8a,0x61,0x3b,0x84,0xdf,0xb0,0xb8,0xe0,0xde,0x6a,0xc3,0x06,0x76,},{0x1b,0x34,0x61,0xc2,0x69,0xd5,0xb0,0x06,0x2d,0x5d,0xf6,0xfa,0x65,0x4a,0x25,0x86,0xf6,0x47,0xa0,0x68,0x42,0x18,0xa0,0x6e,0x5e,0x2f,0x7b,0xad,0xfb,0x39,0x41,0x31,},{0xd2,0xa0,0x5d,0x88,0xd9,0xd5,0x43,0xd9,0x4d,0x57,0xec,0x88,0xae,0x55,0x68,0x17,0x50,0xf2,0x0b,0x9b,0xe9,0xc1,0xe9,0x18,0xcd,0xaf,0x45,0x77,0x67,0xf2,0x94,0x8d,0xd6,0x29,0xe9,0x4f,0x06,0x8e,0xdc,0xf3,0xd9,0x92,0x7e,0x33,0x02,0x34,0xba,0xdc,0x3a,0x02,0xfa,0x5a,0xd3,0xd9,0xd8,0x5e,0x94,0x8c,0xb0,0xb0,0xcb,0x3c,0xd7,0x0a,},"\x61\x84\xe6\x48\x0c\x42\xe9\x6c\xc8\x77\x26\x9b\x16\x37\x15\x45\xff\x95\x23\xc4\x5e\xa8\x8e\x76\xa1\x34\x8c\x68\xae\x7f\x31\x8b\x08\x8f\xe4\x61\x09\x28\x23\x91\x85\xb6\xb5\x5b\xfa\x0f\x43\x64\x4c\x4a\x4c\x97\xc5\x6e\xd7\x7d\x08\xb1\xf4\xaa\xd2\xf4\xaa\x06\x99\x94\xab\xec\xa9\x6b\x7b\xf8\x1b\x80\x64\xea\x43\x50\xd8\xa8\xb0\x22\x97\xa5\x13\x08\xb6\x1c\x57\xc8\xf1\x87\x3c\x6f\x97\x00\x7a\xca\x31\x80\x42\x9e\x73\x0a\x66\x43\xf2\x87\x33\x54\x7b\xcf\x7b\x9a\xdf\xe3\x27\xe8\x57\x36\xbd\x04\xaf\x7f\x1d\x9f\x4f\xb8\x4a\x7f\x3a\xff\xdf\x4e\x22\xb5\x74\xec\xb4\xbc\x88\x36\xb1\x0b\x84\x53\xae\xaa\x5c\x1b\xf1\x32\x24\x8b\x82\x6c\xc5\x23\x0f\x75\xe0\x75\xfa\xc9\xf0\x37\x56\x11\x36\xe0\x06\x43\xd0\x82\x53\xe7\xad\x65\x2f\x70\x2c\x0d\x15\xb6\xd7\xd4\x8a\xa6\xf8\xe9\xb5\xf5\xcc\x14\x6e\x3f\x15\x6f\xb2\x52\x27\x51\xc3\x71\x00\x41\xbd\x92\x2f\x37\xa5\x03\x77\xe0\x28\xb0\xc4\xe4\xbc\x34\x65\xd7\xc8\x4a\xf6\xa5\xfb\x42\x7a\xcb\x3b\x41\x37\x8b\x10\x2b\xda\x46\xd8\xf6\xf2\x03\xa5\xff\xcf\x39\x5d\x43\x5e\x93\x45\x8a\x0b\x0a\x4c\x2e\x77\x82\xfa\xfe\x11\x9f\x76\x9f\x67\x05\x8c\x66\x77\xf6\xd1\x0d\x9c\xf5\xcb\x87\x48\xe1\x80\x57\x98\xed\x23\x3f\x6f\x93\x0e\xee\x0e\x50\x75\xbc\x58\xb9\x7a\xf9\x17\x7f\xda\x75\xd5\x37\x08\xbe\xb0\x4d\xc4\xf1\x9a\x43\xe7\x68\x07\x46\x09\xf1\x40\x65\xf4\x8f\xda\xd5\x07\x7c\xe1\x09\xba\xcc\x35\x71\x74\xa6\xb7\x95\x6f\x6e\x7f\x32\xe3\x84\x15\xbe\x52\x63\x70\xfa\x58\xc3\xc0\xb3\x1f\x51\xe6\xcd\x4b\x2c\xf2\x7f\x8b\xcb\xc2\x12\x59\xd9\xe5\xc3\xb5\xc2\x94\x6a\x9f\xc1\xb0\x0d\x9d\x15\xc3\xb7\xd8\x0b\xfd\x9d\x05\xdb\x91\xd2\x49\xd3\xe4\x2d\x89\x56\x68\x20\x44\x54\x8d\x83\xbd\xa8\xd5\xcc\x92\x12\x44\x2f\x30\xb4\x5c\xf4\xae\xad\x80\xcc\xe9\xb3\x51\x2c\x39\xc5\xc7\x37\xd3\xf8\xd7\x47\xaf\xba\xb2\x65\xaf\x5e\xee\xf8\xca\x93\x62\xec\x76\xe9\x43\xb0\xa0\xd7\xa3\x9f\x3d\xb1\x1e\xca\x14\x45\x8a\x7b\x59\x2e\x5e\x4f\xf2\x27\x5d\xd4\x8b\x28\x53"}, +{{0x8f,0xb0,0x86,0x20,0x6d,0xd9,0x5a,0x26,0x21,0xf5,0x98,0x56,0x0c,0xcb,0x28,0x1f,0x82,0x73,0xc8,0xfc,0x72,0xe2,0x36,0x11,0x08,0x9b,0xaa,0xc8,0x9d,0x3c,0x3c,0x78,},{0x20,0x27,0x6e,0xf4,0x79,0xf4,0xd4,0x52,0x3a,0xb7,0x74,0x20,0xd4,0x24,0xe8,0x81,0x9c,0x33,0xc8,0x37,0x79,0xed,0x80,0xc7,0xf6,0x66,0xe8,0xf4,0x40,0x3f,0x94,0xd7,},{0xa9,0x30,0x5e,0x00,0x16,0x00,0xd5,0x97,0xd0,0x5e,0xf6,0x71,0x69,0x9b,0xf0,0x9f,0x0d,0xcc,0x0c,0x44,0x47,0x5d,0x3c,0xa3,0x1e,0x7f,0xf1,0xbf,0xfe,0xdc,0x0c,0x67,0xda,0xa1,0xf3,0xb7,0x6a,0x03,0x59,0x48,0xc5,0x9c,0xd8,0x7f,0x82,0x45,0x3a,0x40,0x95,0x0a,0x1c,0x97,0x03,0xc2,0xe7,0xd9,0x28,0x0e,0x73,0x03,0x96,0x6d,0xa3,0x01,},"\xf0\x29\x03\xed\x42\x66\xe8\x49\xa4\x48\x52\x05\x95\x4f\xff\xa8\xa1\x08\xc3\x23\xb7\xe3\xf8\x43\x31\x04\x35\x14\xe4\x85\x56\xab\x01\x94\x97\x23\x3a\x5a\x12\x7b\xff\x3c\xd7\xc9\x70\x86\xbe\xce\xf5\x38\xb3\xf3\x39\xd7\xd0\x6e\x53\x2d\xc7\x32\x5e\x59\x7a\xe3\x57\xf8\x16\xde\xa4\x2a\x6a\x22\xc7\x9d\x22\x07\x4a\x2e\x1a\xd8\x02\x3c\x42\x4b\x7e\x09\x6e\x5a\xd8\x89\x7b\x05\xef\x7d\x00\xd3\x0a\x04\xaa\xf2\x98\x1e\xdd\xff\x2b\x34\x7f\x1e\x27\xe2\x0a\xab\xbe\x7e\x7a\x95\x44\x97\x8e\x09\x2b\x00\xcc\xe4\x20\xab\xa0\x61\x87\x37\x4f\xfb\xb3\x7b\x4c\x22\xd7\x5f\x04\xe5\x75\x90\xf6\x10\xa2\x73\x47\x28\x6c\x29\x83\x12\xa6\xc9\xb1\xbd\xf2\x4f\xbd\xa8\x51\x3c\x4f\x83\x56\xcc\xf7\x57\x06\x8f\xfc\x11\xbc\x65\x11\x37\x83\xa5\xdd\xe7\x72\x2f\xaf\x4c\xeb\x19\xfb\xb6\x2f\x40\x70\x2e\x2c\x6e\x6a\x8b\xb4\x9e\xf4\x04\x46\x45\x0c\x4c\x59\xa2\x99\x09\x44\xda\x47\x44\xf6\xee\x77\x0b\x93\x0c\x24\x66\x69\x81\x3c\xe5\xa9\xf5\xa4\x7d\xd8\x03\x88\x98\x1b\xfc\xc3\xa5\x6b\x5b\xe2\xc4\xc7\xe6\x59\xa2\xe9\x18\x2d\xec\x0a\xaa\xfe\x90\x31\xaa\x39\x54\xd4\xfe\x7c\x43\x11\x96\xa5\x61\xa5\xb7\x8e\xab\xa6\x4f\x3d\xb1\xb5\x86\xc5\x3b\x16\xf6\x79\xa8\x49\x21\xa6\x42\xc2\x60\xe4\x65\x3a\x61\xde\x10\x8e\xbd\xe6\xf7\x05\x3a\xfa\x2c\xb3\xf3\x66\x8e\xde\x12\x10\x20\xdd\x1b\xac\xe8\x41\x8a\xeb\xac\x3a\x5b\xd5\x14\x2f\x10\x5a\xc2\x6f\xe4\x9e\x5f\xb1\x40\xc1\x9b\x22\xd5\x4a\x62\x91\xdf\xc9\x54\x67\x02\x47\x88\x16\x46\x87\x4d\xef\xad\x81\x49\x95\x51\x9f\x62\x60\xe9\x77\x4a\x8d\x18\x5c\x37\x88\x1b\x4f\x25\x43\xc4\xb6\x3f\xbf\x19\x85\x01\x6a\xb4\x1c\x4d\x72\x8c\xbc\x90\xb3\xab\x87\x62\x67\xbe\xd4\x1d\x0c\x09\x02\xf6\xb5\x0e\x8f\xa9\x06\xfc\x47\x88\xf7\xb8\x20\x46\x73\x06\xe0\xfe\x9e\x03\x6a\x0a\x00\xf8\x04\xf9\x1c\x3c\xa7\x18\xb9\x5f\xf6\xd9\xe2\x20\x4b\xc3\x16\x1b\xf7\x0f\xcc\x17\xb2\x96\x4b\x56\xbc\x61\x2e\x29\x40\x2d\x96\xf5\x09\x86\x51\x4b\xc7\xd8\x31\xd5\x8e\x42\x79\x37\x86\xd5\x80\x6f"}, +{{0xaf,0xa1,0xb8,0x46,0xc2,0x10,0xb5,0x23,0x00,0xe9,0x76,0x96,0xf8,0x1b,0x8e,0xa7,0x74,0xd1,0xdf,0x12,0xe6,0x12,0x52,0x7c,0x55,0x74,0x7f,0x29,0xc1,0x93,0x73,0x96,},{0xb6,0x09,0x56,0x6b,0xbd,0x19,0x47,0xbd,0x7a,0xfa,0xce,0xb1,0x43,0x89,0xe8,0x36,0x22,0x71,0x69,0x21,0x5f,0xab,0x66,0x85,0x1a,0xa5,0xd7,0x0d,0x6e,0x2e,0x3b,0x89,},{0x98,0xb0,0xc6,0x31,0x3c,0xec,0xaf,0x7c,0x82,0xcb,0xde,0xb3,0xd0,0x28,0x06,0x41,0xc6,0x1a,0x06,0x0f,0x65,0xe5,0x63,0xaa,0x93,0xce,0x18,0x30,0x0a,0x9b,0x58,0x27,0x2d,0xc8,0x68,0x0b,0x48,0x5e,0x8c,0xd1,0x1c,0xf8,0x0f,0xdc,0xa8,0x68,0xfa,0xb3,0x65,0x37,0x83,0x84,0xa1,0x42,0x72,0x7f,0x2f,0x84,0x4f,0x87,0xcf,0xdf,0x19,0x05,},"\x4c\xac\x1b\x1f\x4b\xd4\x82\x84\xdc\xc9\xaf\xc8\xb5\x95\x5b\x64\xb4\x36\xdb\x70\x4b\x03\x35\xd9\x75\x5c\xc1\xf9\x74\x77\xf8\xd3\x23\xcb\x64\x10\xef\x14\x6a\xb8\xa9\xef\xb9\x52\x6d\x8b\x62\xe3\xbb\xad\x1f\x72\x95\xf4\x7b\xa9\xf0\xde\x95\x8f\x8e\xc9\xb7\x7a\xb4\x22\x32\x43\x7e\xd9\x74\x85\x64\x44\xcd\x22\xe2\x0b\xe3\x5e\x91\x81\x3b\xff\x4b\x01\x6f\x81\x0d\x0f\x61\xd8\x9f\x6b\x61\x4d\xb3\x3f\x34\xbd\x09\x98\x5b\x59\x3f\xe3\xe0\x6e\x06\x5b\x7b\xc6\xcd\x39\xd5\x5c\x2c\xfb\xec\x7b\x6d\x59\xc0\xb3\x7d\xd1\xd0\xd3\x51\x35\xab\x1d\x1b\x04\xf2\xf3\x0c\x2f\x04\xf4\xba\x2b\x36\x58\x27\x38\x08\x1c\xf5\x91\x90\xf5\x28\x36\x3d\xb9\x44\xed\x61\x29\x31\xd1\xd5\x14\xc6\x21\x4f\x9a\xb9\x2a\xbb\x18\x33\x92\x61\x83\xac\x52\xfb\xa2\xa4\x55\x1e\x20\xe4\xc0\xac\x95\x9a\x49\xdd\xb1\x67\xa3\x81\xe0\x24\x1d\x40\xc0\x86\xe9\x0e\x52\xac\xa0\x17\x25\x89\x75\xdb\xab\x2b\xa4\x51\xee\x53\x9a\x71\x8f\x07\x6a\x58\x70\x9c\x66\x97\x41\x8d\x9c\x6f\x13\xe4\xd3\x91\x36\x8b\xf0\xe8\xbd\x8f\x29\x32\xdd\x95\xce\xaf\x7a\xac\xa1\x24\x11\x47\xd3\x41\xa3\xac\xd0\x8d\xc3\x29\x05\x48\x35\x72\xb8\x9a\x80\xcc\x47\x23\x14\x68\xab\x8d\xe3\x59\xdd\x52\x5a\x62\x57\xcf\x19\x6c\x2e\xcb\x82\xfa\x8a\x78\xaa\x3a\x85\x1c\x7c\x96\xca\x25\xbf\x7c\xa3\xdc\xf3\xca\x21\x45\x3d\x0d\xfd\x33\x23\xd5\xa4\x22\xde\xc8\x43\x16\x10\x2f\x68\x4c\x35\x9f\x22\x6b\xb5\x37\x79\xc0\xb9\x95\x09\x39\x28\x1e\xf7\x9a\x58\xc0\x11\x99\x3e\xac\xe0\x85\x49\x7a\xfa\x4d\xaf\x64\xc9\x68\x7b\x0a\x11\xaa\x11\x6c\xfa\x7b\x03\x93\x62\x41\xa5\x56\x7b\x64\x6e\x7e\x42\xe9\xfb\x59\x24\x05\xb8\xfa\x3c\x0a\x82\x1f\xc3\x12\x1b\x45\xb1\x75\x3c\xec\x9a\x83\x94\x7d\x21\x1a\x45\x49\x9b\xd6\x37\x90\xb8\x7f\x01\x47\x2f\xe5\x66\xd8\x76\x96\xef\xed\xbb\x74\xed\x00\x04\x8c\x38\x4b\xa7\xf0\x27\xb3\xaa\x42\x98\xdc\x41\x10\x34\x9f\xed\xf5\x2a\x96\xcd\x05\xd0\x8b\xd6\x35\x77\x1e\xd4\x51\x07\x38\xd8\xf0\x7a\x60\x21\x24\x4d\x19\x03\x57\x9a\x3e\xa7\x39"}, +{{0xc8,0x59,0x13,0xa6,0x87,0x78,0x77,0x13,0x10,0x01,0x62,0x3c,0xcd,0xa9,0xcd,0xc1,0x2b,0x9d,0x40,0x43,0xb8,0xa8,0x37,0x93,0xc4,0x46,0x96,0x63,0x2c,0xd6,0x42,0x1c,},{0x9c,0xc6,0x7c,0x69,0x48,0xf7,0xbf,0x6e,0x55,0x6d,0x08,0x49,0xd3,0xb8,0xd2,0x03,0x45,0x7a,0x7b,0x61,0x54,0x9b,0x36,0x68,0x1d,0x75,0x4f,0x1d,0xc0,0x84,0x1e,0x96,},{0x01,0xfc,0xcf,0xdb,0x1f,0xb6,0x88,0x8b,0x03,0x10,0xa9,0x13,0x17,0x0f,0x7e,0x36,0x68,0x16,0xda,0xeb,0xe7,0x65,0x0d,0x72,0x51,0x3d,0x95,0x06,0xe6,0x6f,0x7d,0x62,0x20,0x8a,0x49,0xec,0xe0,0xaf,0x18,0x71,0x49,0x7f,0x45,0x41,0xef,0x60,0x5b,0xde,0x71,0x1c,0x9e,0x0a,0x12,0x05,0xef,0x48,0xf2,0x6c,0x03,0xdc,0x1a,0xd4,0xaf,0x03,},"\x91\xb5\x00\x9e\x83\xd0\xf6\x10\x33\x99\xc2\xd3\xfe\xec\x00\x84\x97\x3a\x30\x5b\xf4\x17\x6e\xc7\x82\x53\x75\x60\x47\x2d\xb1\x87\xa1\x1b\x4d\xcb\x4b\x2f\xfb\x7f\x06\x44\xfe\xb3\x94\xb2\x8e\x5b\xfe\x97\x24\x7c\x4a\x4a\x23\x1c\xf6\xe9\x16\xbf\x99\x34\x4c\xcd\xa8\x8a\x7f\x5d\x83\x1d\x6d\xe3\xd5\x63\xdd\x10\x2e\xae\xb1\x08\xc5\xbd\xce\x44\xe0\x63\x2d\x17\xe6\xfa\x55\xb1\x80\x67\xdf\x2f\xa8\xd2\x00\xa9\x86\x9f\x6a\xff\x92\x0c\x51\xd4\x6a\x1c\xed\x2d\x90\x3b\x1d\x9b\x6b\x07\x5f\xac\xbf\x91\xcd\x05\xeb\x41\xad\x81\x1a\x8e\xf4\x0d\x91\x18\x26\x10\x12\xc7\x2b\x89\x79\xf1\x51\x53\xdb\xb8\x56\x12\x93\xda\x9f\x8b\x77\xc8\xff\x14\xf7\x53\x87\x53\x6f\x00\x36\xd1\x71\x3a\x72\xce\x8c\x35\xb1\x06\x2f\x2c\x67\x32\xae\xbf\x32\x93\x67\x99\xb5\x1c\x2c\xbc\xd6\x57\x24\x13\xe7\xdf\xaa\xb8\x64\x1a\x02\xc1\x50\x23\x73\x81\xcf\x7a\x14\xe2\x2c\x74\xc6\xc2\x00\x09\xde\x7d\x3b\x7e\x69\xcd\x1b\x45\x84\xac\x2c\x01\xba\xba\xf9\x73\xc5\x6b\x38\x14\xbb\x00\x89\x72\x0e\x41\x96\x81\x06\xcf\x26\x50\x9d\x4a\xa5\x46\xfc\xad\x55\x34\xaf\x30\x3f\xfc\xa4\x2b\x16\xae\x6c\x93\xee\x06\xbc\x3c\xac\xe1\x2e\x4e\xc7\x18\x84\x4b\xd3\x0d\x22\x24\xcc\x48\x6d\x10\x6d\x1c\x45\x6b\xfa\x16\x5e\xa0\x12\x0f\xab\x3d\xf2\xc5\xab\x3a\x52\x3b\xbf\xa7\x89\xde\xed\x44\x03\x2a\xb0\xbe\x86\xeb\x7c\xc0\x9c\xdb\x7c\x07\xaa\x94\x8d\xd5\x27\x7c\x3d\xf1\xd9\xd1\x84\x35\x67\xde\xc8\x4f\x92\x88\xe0\x85\xb0\x5a\xe4\xb8\xaf\x2c\xea\x5d\x9a\x18\x4d\x50\xbe\xf8\x55\x50\xc8\x36\x61\x3d\x5d\x3a\xf5\xf9\xc2\x92\x8e\x6a\x89\x66\x0f\xa6\x27\x19\xeb\xff\x77\x3e\x46\xb7\x7e\x34\xbc\x04\x70\xda\x4d\x2c\xdb\xc7\x07\x1d\xa7\x58\xc4\xd3\x9f\xe6\x52\x01\xc8\x8a\xaa\x8e\x66\x03\xd0\xbb\xe7\xc3\xe9\xb2\xd9\xe4\x1b\x63\x46\x82\x09\x2f\x14\x73\x41\xad\x6d\x66\x7f\x20\xc6\x4e\x81\xa6\x8d\x62\x94\x67\xa5\x4d\xd8\x6e\x1c\xe1\x2c\x56\x0a\x6f\x9b\x64\x51\x2d\x6f\x38\x86\xcb\xb9\xf3\x7c\x37\xeb\x39\x85\xc8\xac\x38\xdd\x66\x82\xf4\x8f\xe1"}, +{{0xfa,0x1e,0x11,0xdc,0x83,0x64,0x20,0x8d,0x8e,0x1c,0xb6,0x6a,0x36,0x1b,0xe7,0xe8,0x4c,0x5e,0x36,0x81,0x66,0x58,0x7d,0x4f,0xdb,0x06,0xac,0xed,0x7f,0x62,0xe1,0x7c,},{0x4d,0x8e,0x6f,0x4b,0x34,0x15,0xdf,0x6c,0xed,0xab,0xfb,0x29,0x5c,0x19,0x84,0xfd,0x41,0x99,0x23,0xc6,0xac,0x41,0x76,0x4e,0x32,0xd2,0x2d,0xaf,0x37,0x2c,0x50,0xfc,},{0xe8,0x57,0xdb,0x08,0x7e,0x28,0xd6,0x75,0x0b,0xf5,0x4e,0x53,0x79,0x72,0x51,0xd8,0x43,0x99,0x89,0x57,0x6c,0x12,0xda,0x2d,0x9c,0x81,0x1a,0x14,0x87,0x7c,0x3b,0xd4,0x6c,0x4e,0xfa,0xb8,0x61,0xa1,0x0e,0xeb,0xe7,0xda,0x04,0xc0,0xb0,0xb4,0x45,0xc7,0xa3,0x90,0xa5,0x0c,0x13,0xde,0x36,0xf3,0xa3,0xc7,0xae,0x01,0x57,0x02,0x2c,0x0e,},"\x29\x4e\x63\xba\xcc\xcb\x80\x1b\xbf\x04\xc1\xf1\x9d\x0a\xee\x16\xf5\x65\x0a\x6e\x8e\xea\x6f\xe4\x11\x10\x66\x3e\xc0\x15\x32\xbd\x49\x60\xa5\x27\xf1\x5e\xca\x4a\xf2\xf4\xe6\xb7\xb0\xfc\x34\x0c\xf9\x7a\xa2\x34\xe9\x2c\xf7\xd6\x9d\x50\xe4\x00\x9c\x24\x96\xe3\xed\x4d\x9a\xff\x00\x0f\x9e\x18\x52\x75\xb8\x17\xd2\x6a\x0b\xab\x69\xb7\xf7\xee\x1e\xa3\x0d\xae\xc8\xbc\xee\x38\x7a\xe4\x6b\x4b\x29\x9c\x27\xbd\xc0\x6e\xea\x63\xf2\x4d\xbe\xe9\x55\xa6\xc0\x96\x90\x37\xee\xf9\x1c\x34\x32\x1e\x3c\x5c\x97\x2f\xde\x99\x31\x83\xb7\xd2\x3f\x6e\x01\x9c\x3e\x0c\xac\x75\x89\xae\x4a\x15\x21\xaf\x87\xea\x42\xdf\x8c\x22\xc2\x27\x0e\xc2\x3d\x6d\x14\x0f\x9c\xf6\xd4\xd5\x2f\xac\x1b\x9d\x6c\x89\x39\xef\x81\x31\xcb\x62\xa0\x35\xc5\x26\x15\x38\xbc\xdf\xd6\xdb\x41\x9a\x55\xef\x9f\xe5\xd7\xa5\xac\x44\x57\x9d\xe7\x00\x85\x8d\x74\xa3\x43\x48\x44\xf2\x83\x42\xc5\x65\x89\x27\x22\xe2\x7f\x40\x7d\x7f\x17\xb7\x4a\x59\x34\xbe\x91\x5b\x20\xc2\x40\x06\x43\x23\x5f\x8a\xb5\x79\x5f\x32\x4e\x33\xc5\x06\x44\xa0\x40\x33\x54\x2c\xb3\x81\x6d\x77\x0f\xa8\x99\xe7\x31\x1c\x14\x30\x1c\x1b\xd0\xf5\xaa\x60\xa2\xeb\x31\x65\x68\x0c\x72\x0e\x1e\xfa\x80\x96\xfc\x25\xd2\x77\x92\x75\xf1\x84\x2b\x2d\xb5\x3b\x4d\xa0\xad\x3e\x59\xc0\x75\x40\xc2\x84\x60\xce\xc1\xfd\xd3\xcd\xb7\xa3\x47\x8b\x91\xa9\xca\xf9\xac\x89\x1c\xdf\x3a\xea\xee\xca\x9a\x96\x56\xac\x13\x07\x25\x99\x22\xfc\xa7\x4c\x5c\xc6\x9f\x7e\x25\xc6\xbf\x58\x79\x73\xa4\xb7\xd3\xe3\xac\x06\x35\xb0\xdb\x22\xa0\x09\x3a\x79\x07\x68\x81\xc7\x17\x36\xee\x1d\x4d\x45\xf8\xed\x2d\x29\xa0\x67\x1a\x64\xe6\xca\x2f\x7a\x5e\xf4\x04\xb1\xed\xeb\x84\x20\x34\xf5\x71\xb6\x99\xbc\x59\xe5\xa3\x7d\xf0\x20\x54\xe8\x48\x2b\xf1\xe7\xb7\x7d\x8e\x83\x97\xda\x15\xd8\x9d\x73\x55\xa5\xdc\xe8\x6b\x16\x83\xa9\xac\x4e\x40\x6c\x08\xa9\x4a\x6e\xb0\x0e\x5a\xe1\x6d\x96\x72\x29\x72\xe5\xc5\x0c\x7b\xee\x4a\x84\xd0\x69\x7b\xbe\x67\xce\xb7\xef\x29\x5f\x06\xaa\xea\x5a\xbb\xa4\x44\x66\xbe\x0f\x67"}, +{{0x24,0xa9,0x14,0xce,0xb4,0x99,0xe3,0x75,0xe5,0xc6,0x67,0x77,0xc1,0xed,0x20,0x43,0xbe,0x56,0x54,0x9d,0x5e,0x50,0x2a,0x84,0x47,0x10,0x36,0x40,0x42,0xba,0x9a,0xcb,},{0x20,0xd2,0x1e,0xe7,0x64,0xb1,0xf3,0x5f,0x94,0x56,0x82,0x00,0xd6,0x3b,0xd5,0x82,0x8a,0xca,0x8c,0x5d,0x3e,0x90,0x47,0xd2,0x3f,0x47,0x8b,0x92,0x52,0x95,0xfa,0x2e,},{0x3a,0xe0,0xcc,0x7b,0xca,0x8d,0x73,0xbe,0x83,0xa9,0xb8,0x09,0xb1,0x33,0x38,0xc1,0x27,0x06,0xaa,0xef,0x75,0xc4,0xd1,0xa4,0x78,0x17,0x8f,0x9d,0xc5,0x65,0x51,0x4c,0x75,0x29,0xe2,0x98,0x04,0x3e,0xa7,0x8d,0x21,0xa5,0xa0,0x9d,0xd0,0x4f,0x10,0xae,0x87,0x44,0x1e,0x56,0x86,0xa9,0x33,0xc9,0x2c,0x75,0x54,0x84,0x27,0xad,0x3a,0x03,},"\x3f\xf9\xf6\x6f\xa2\x64\x6e\xc6\x6a\x1b\xf9\x33\xc2\xb4\xcc\x0f\xbf\x91\x2b\x4d\x6d\xb5\x05\x34\x25\x7f\x97\xd0\x1e\x69\x8d\x05\x48\x57\x47\xde\x25\x44\xe9\xf5\xa4\xa4\xa0\x75\x38\x8c\xf4\x40\x0a\xb8\x9b\x03\x53\xce\x86\x19\x82\x02\xdb\x3a\x90\x37\x67\xb8\x79\xa2\xaf\x9d\xaa\x15\x58\x43\x11\x1a\xf1\x5a\x2b\xc3\x5e\xfe\x41\xbc\xc9\x2c\x82\x07\xe0\x01\x13\xb0\x4f\x13\x03\x00\x79\x49\xff\xb6\xce\x8d\xf4\xb0\xb3\x42\x48\xfe\xdf\x5d\x9c\xb2\xce\xe9\x4b\x81\x2e\xd5\x8e\xce\x2a\x0c\xe0\x45\x4c\xf1\x4c\x20\xe4\x9e\x09\xfe\x66\x4d\x6e\x25\x76\x2e\x87\x89\x59\x32\xcd\x5c\xd3\x2e\xb6\xa3\xab\xb3\x8e\xe1\x63\x07\x8c\x13\x3e\x93\x58\x87\x91\xdb\xf6\xaf\x49\x9a\x31\xea\x44\x53\xbb\xcc\x7a\x85\xe4\x06\xc9\x84\x8a\x66\x40\x52\xf1\x11\x13\xfb\xb4\xff\xa7\x60\xde\xe4\xc2\x61\xe3\x96\x94\x24\x91\x11\x9d\xa2\x9a\x33\x58\x2f\x82\x1d\x41\x25\xe0\xb4\x16\x2f\x28\xbe\xb0\x66\x03\x1a\x65\x2d\x05\x74\x9a\xa7\x24\x4d\xd4\xf3\xd3\xbb\x15\xd2\x68\x32\x8d\x6a\x02\xfc\xe2\x50\x18\x15\x25\x7f\x8a\xd5\xaf\x4e\xcb\xe7\xcb\x8a\xe9\x66\x1e\x34\x4f\x90\x72\x31\x87\x91\xf3\xe8\x59\x09\x11\x21\xe0\x8a\xef\xca\x89\x82\xea\xaf\x66\x25\x9d\x9d\xe4\xf4\x6a\x31\xe7\x16\xdc\x03\x3d\x0f\x95\xd1\xfa\x93\x6b\x6c\x60\x79\xb1\x37\xdd\x11\x58\xd1\xde\xf1\x13\x01\x8c\x73\xf8\xeb\xb9\x80\x7e\x0f\x74\x15\x40\x4e\xa9\xc7\x85\x44\xac\xe7\xce\x46\x3c\xd1\xd1\xc5\x7e\x31\xf4\x09\x1b\xc0\x91\x80\x4c\xbc\xdd\xad\x0e\x15\xa4\x0c\xa9\x1a\xcb\xe1\xc6\x22\x4e\xd1\x3c\xaf\xb4\xdf\x2c\x84\xac\x9f\x0c\x3c\x9b\x54\x60\x07\xd9\xdd\x6e\x52\x4c\x46\x70\x72\x56\x3d\x4a\xc0\xd7\x00\xcc\x1b\xf3\x0f\xeb\xb3\x34\x31\x3d\xae\x57\x61\x74\x5e\xc0\xa5\xe9\xe8\x81\x50\x25\x95\x8f\x00\xfa\x2e\x58\x06\x0d\x7e\x9a\x5f\x2b\x72\x7f\x48\x69\x9f\x92\x9c\x84\x59\x93\x08\x92\x57\x3f\x78\x4f\xef\x56\x92\x51\x8b\x5c\xa2\x68\xe2\xa7\x3e\xbe\xad\x6e\xbd\xeb\x7e\xc2\x4e\xac\x92\xaa\x7d\xcb\x41\xb5\x98\xbd\x6e\xff\x36\x32\xd0\x69\x72\x62\x91"}, +{{0x55,0x32,0xe0,0x9b,0x93,0x7f,0xfd,0x3d,0x5f,0x4c,0x1d,0x9f,0x1f,0xfc,0xde,0xd2,0x6e,0xe7,0x4d,0x4d,0xa0,0x75,0x26,0x48,0x44,0x69,0x0b,0xd9,0xc8,0x61,0x39,0x94,},{0x50,0x93,0x96,0x9f,0x37,0x7b,0xec,0x3e,0x35,0xf5,0x9e,0xfd,0xa0,0x1a,0xb4,0x18,0x6c,0x5d,0x2a,0x36,0x74,0x0c,0xf0,0x22,0x67,0x5e,0x01,0x09,0x6b,0x1a,0x3f,0x0a,},{0xd5,0x27,0xff,0x0d,0x4a,0x21,0x9d,0x61,0xf4,0x18,0x12,0x12,0x06,0xa5,0x4a,0xe4,0x98,0x58,0x54,0xa3,0x10,0x48,0x27,0x44,0x48,0x6e,0x4d,0x13,0x0a,0x7d,0xe9,0x7c,0x31,0x9d,0xf8,0x37,0x2c,0x82,0x82,0x8c,0x93,0x6e,0x6a,0x8a,0xfd,0x9c,0x5d,0xe1,0x82,0x85,0x73,0xd8,0x26,0x1a,0xe9,0x36,0x5b,0x8f,0x23,0x76,0x76,0x18,0x24,0x02,},"\xad\xd4\xd7\xa9\xce\x3f\x63\xd1\xf9\x46\xe8\x67\x90\x65\x54\x5d\x8c\x7b\xf0\xa2\xcc\x3a\x4c\x00\xb8\xf1\x42\xf0\x94\x5a\xe3\x62\xc4\xc9\x46\x2a\x75\x76\xa4\x05\x9d\x57\x86\x16\x62\x88\x4b\xd8\x0b\x96\xd9\x0d\x27\x9a\x95\x2e\xda\x95\x2d\x37\xd4\xf9\x5c\xf0\xd7\x0d\xa9\x8f\x4f\xba\xca\x39\xe1\x69\xf9\xd9\x45\xd4\x1f\x87\x23\x97\xbb\xdd\x57\x01\x45\x43\x03\xd7\x7d\x31\xe8\x63\x48\x27\x1d\xa4\x0a\x1b\x8f\x1e\x57\xc3\x6f\xcd\x80\x3e\x14\xfa\x17\x71\x6c\x56\x31\xef\xa0\x1d\x3a\x79\x5d\xc2\x0b\x2b\xde\x36\xab\x73\xff\x6a\x2d\x53\x3b\xc1\x5c\xce\x22\x32\x87\x13\xc3\xc9\xcc\xd0\x72\xc3\xe4\x50\xd7\xf2\x2c\x0c\x9f\x94\x91\x97\x52\xcb\xfe\x45\xee\x65\x5d\x1b\x53\x67\x65\x93\xcd\xb4\x48\x70\x41\x02\x63\x1c\xaa\xa9\x76\x95\x2e\xaa\x1f\x6c\x2e\x87\x65\x64\xe4\x20\xf0\xc6\x46\xa0\xf8\x83\x65\xf7\x64\x15\xb4\x08\x5f\x60\xa3\x38\xb2\x9c\x51\x63\x3e\x54\x0f\x0b\xf3\x2d\x40\x87\xe7\xd0\xfb\x68\x5b\xe8\x8c\x75\x95\xdc\x53\x1c\x99\xb4\x89\x58\x45\x60\xad\x82\x34\xb1\x8e\x39\xa1\x07\xcf\x5d\x84\x2d\xab\xd4\x21\xe7\x7d\x26\xea\x5e\x0f\x14\x05\xce\x35\xfe\x79\x27\x14\xeb\x4e\xe1\xa8\x01\x76\x48\xac\x1a\xe7\x39\xa3\x3d\x7b\x1e\x08\x91\x05\xd1\xe5\xad\xd2\x7a\x62\xce\x64\x15\x45\x70\x34\x0a\xf9\xeb\x14\xe7\xfd\xfc\x2f\x9a\x2c\x2f\xcf\xcd\xac\x3c\xc4\x22\x77\x63\xf4\xd6\x29\x49\x74\x79\xf8\x49\x21\x6e\x5d\x90\xec\x16\xdf\xa3\x6b\x72\x51\x7f\x7b\x54\x86\xba\xee\x7f\xda\x44\x50\xc3\x52\xcf\xfb\xba\xe7\x39\x26\xc8\x43\x22\x4f\x8c\xe4\x4b\x38\xda\xe5\x3f\x3e\xad\x21\x89\x0b\x52\xa7\x80\x10\x75\x29\x16\x84\xfd\x59\x10\xed\x86\xad\x33\xe8\xa0\x07\xf6\xc3\xf8\x5c\x16\xb2\x09\x29\x37\x40\x18\x4f\x58\x90\x87\x4d\x43\x1c\xd4\xe0\xea\x40\x87\xc4\x9c\x34\x71\xd7\x89\xc8\x13\xc6\xdc\x9a\x78\x69\x93\x63\xa1\xd8\x71\x97\xd3\xb9\x2c\x02\x86\x68\x93\x11\x82\x3f\x4d\xf2\x2c\xe8\x03\x5e\x75\x73\x2c\xde\xa7\xf5\x62\x1f\x67\xdb\x0e\x2a\x4c\xa6\x61\x61\x93\x22\x1c\x0a\xa3\xd6\xde\x50\xd8\x52\x82\xee"}, +{{0xeb,0x36,0x51,0x10,0x09,0xd3,0x7a,0x9c,0x46,0xc4,0xd1,0x37,0x4d,0x0b,0xbd,0x0d,0x99,0x81,0xe7,0x8c,0xee,0x7d,0x18,0x8c,0x5a,0xab,0x98,0x3e,0xc2,0x39,0xe1,0x0c,},{0xb1,0xcc,0x21,0x2b,0x45,0x21,0xbb,0xe7,0xb1,0x9a,0x76,0x93,0x87,0x8a,0x55,0x84,0x40,0xee,0xc3,0x62,0x05,0xd8,0x43,0x9d,0x04,0x0a,0x46,0xa9,0x90,0x2f,0xbf,0x55,},{0x9f,0x58,0x37,0x24,0xde,0x55,0x2e,0xae,0x82,0xf2,0x54,0xac,0x6e,0x2e,0xd4,0x83,0xec,0x1a,0x07,0x34,0x62,0x66,0x73,0x5c,0x49,0x09,0x20,0x69,0x0c,0x1e,0x3f,0xb2,0xa9,0xe9,0xa3,0x41,0x94,0xed,0x64,0x73,0x73,0x3b,0x30,0x0d,0x4f,0x23,0xc9,0xae,0xc0,0xda,0x5a,0x20,0x22,0x05,0x4c,0xa4,0x38,0x85,0xa1,0x5a,0x29,0x84,0x32,0x0e,},"\xba\x24\x66\xe5\x6c\x1d\xf7\x7f\x22\xb6\xf0\x24\x1f\xc7\x95\x2a\xe9\xbc\x24\x75\x64\x19\xa9\x44\x6d\xd2\xb4\x9e\x2c\xb9\xdf\x59\x4e\x5b\x6c\x77\xa9\x5a\xa5\xfb\xd9\xdc\x57\xfe\xc8\x39\x62\xc7\x75\x1e\xeb\xb4\xba\x21\x82\x53\xf9\x16\xa9\x22\xa5\x13\x96\x63\xe3\x20\x3e\x3b\xe4\x82\xbe\x37\x9c\xa1\x51\xc4\x63\xd9\xad\xa2\x14\x46\x13\x5f\x35\x69\x94\xfa\x54\x49\xf0\x84\x47\x8f\x5b\xb4\xf5\xba\x61\x45\xc5\x15\x8e\xb7\xb1\xc4\x3c\x32\xeb\xea\x25\xe0\x9c\x90\x0f\x01\xef\x91\xe9\x2f\x88\xc0\x3c\x76\x50\x4a\xce\x96\x46\x01\x6f\xfc\x27\x89\x55\x9d\x0f\x3c\xc9\xd0\x0f\xb6\x1b\xdc\x6a\xf7\xd3\x94\x0f\x30\x2e\x58\x8e\x04\xf7\x9f\x7b\x3d\x4b\x91\xa5\xd1\x93\xa4\xf8\x22\x2b\xfe\xb6\x9b\xf0\x34\x7d\x98\xad\x81\xef\x99\xd1\x30\xeb\xc7\xb3\x6b\x07\x83\x39\x4e\xea\x92\xa3\x8d\xdd\x5e\x74\x80\xd2\xad\xd4\xe4\xde\xf5\x3e\xb9\x9c\x44\x9b\xff\x94\xe4\x71\x8b\x09\xf2\xea\x9b\x1f\x2b\x88\x65\x94\xa9\x5c\x33\xa6\x9e\x03\x33\x15\x4e\x44\x0a\xb3\x4b\x7b\x6c\x11\x34\xd8\x17\x9b\x6f\x0c\x56\x25\x1a\x9a\xd8\xe1\xb6\xb0\xf9\xb8\xa5\xc9\x70\x81\xa7\xf8\xfd\x05\xd0\xb0\xaf\xfc\x82\xdb\xdd\xc8\xb0\xc0\xab\x7e\x83\x3f\x30\x06\x26\xd4\xb9\x73\xb3\xf6\x0f\xea\xc5\x55\x71\xe8\x9c\xda\x0f\x2b\x44\x1e\xd2\xfa\xa6\x69\xa7\x0d\x55\x6c\xb4\x8f\x9b\x1d\x1c\xbc\xe3\x2e\xde\x5d\x16\x6b\x11\x43\xe2\x64\xb1\x1e\xa3\x27\x68\x1c\xb5\x59\xed\xd1\x3c\x36\x4b\xd2\xba\xf1\xfd\x54\xbb\x78\x18\x07\xbd\x59\xc8\x68\xb0\xe4\x79\x5a\x77\x9e\x67\xf0\xbd\x0d\x14\xb5\xa6\xb9\xe4\x40\xb5\x7a\x58\x23\x32\x8b\x59\xaf\xfb\xd0\x27\xed\xa7\xdd\x78\x50\x79\xc5\xf0\x2b\x5e\x32\x89\x0b\x03\x87\x30\x98\x6a\x39\xa5\xa9\x83\x4a\x3f\xed\x86\x8b\x6f\x45\xcb\xdd\x28\xac\xb2\x70\x9a\xff\x55\x62\x63\x86\x4f\x9a\xe1\xe7\x57\xb3\x27\x8c\x28\x8d\xbe\x29\x32\x82\x57\x12\x77\x3e\x43\x1f\x7c\x29\x32\x98\x57\xfd\xae\xa7\x98\xed\x93\x92\x08\x93\x63\x14\x02\xe6\xb1\x3b\xab\x62\xb4\x85\x54\x61\xed\xb9\x46\x20\xf2\xd1\x75\x18\x65\xf4\x45\xc4\x66"}, +{{0x7d,0xbc,0x81,0x90,0x2e,0x4e,0xaa,0xb3,0x07,0x75,0x40,0xf5,0x59,0x99,0x5c,0x38,0x74,0x03,0xca,0xc3,0x06,0xd4,0x86,0xe9,0x59,0xc5,0xeb,0x59,0xe4,0x31,0xc0,0xa8,},{0xe0,0x30,0x66,0x13,0x90,0x82,0xf6,0x13,0x44,0x8b,0xdb,0xc2,0x7f,0xe5,0x3a,0xa3,0xf8,0x89,0x94,0xc3,0x1d,0xdc,0xe0,0x02,0xe3,0x6b,0xbb,0x29,0x63,0xdf,0x3e,0xc8,},{0x5b,0x7f,0x65,0x2f,0x08,0xf2,0x29,0xfd,0xa1,0xb0,0xbd,0x75,0x93,0x77,0xb3,0xfb,0x72,0x6c,0x1b,0x9c,0x9a,0x10,0xef,0x63,0x42,0x6d,0x35,0x2d,0xd0,0x86,0x9b,0xd5,0x4d,0x87,0x6c,0x30,0x92,0xf1,0xcd,0x41,0x1c,0x37,0x57,0xd3,0xc6,0xb6,0xea,0x94,0x2a,0xa7,0x0c,0x3a,0xae,0xb4,0x21,0x7a,0x4c,0x73,0x64,0xd1,0x8e,0x76,0xe5,0x0f,},"\xdf\xf7\x98\xb1\x55\x7b\x17\x08\x5a\x06\x34\x37\x1d\xed\x5d\xdf\x7a\x5a\xcb\x99\x6e\xf9\x03\x54\x75\xe6\x82\x63\x36\xf6\x4a\xd8\xb8\x4b\x88\x2e\x30\xba\xde\xc2\xb4\xa7\x11\x99\x87\x52\xf4\xa1\x57\x4b\xc1\xf8\x9d\x43\x25\xcf\x2b\x39\x86\x10\x44\xdd\x03\x69\x1e\x71\xd0\x77\x68\xb5\x93\x3a\x30\x52\xcc\x7c\x81\xd5\x71\xa9\xde\x06\x1d\xc1\x90\x26\xc2\xf1\xe7\x01\xf2\xdc\xf2\x6a\x88\xd3\x40\x1b\xc9\x9f\xb8\x15\x59\xdc\xa7\x6d\x8a\x31\xa9\x20\x44\xa2\x73\x58\x7d\x62\x2a\x08\xd1\xcc\xe6\x1c\x8f\x94\x8a\x34\xde\xd1\xac\xb3\x18\x88\x1c\x9b\x49\xf6\xf3\x7c\x30\xa6\x5d\x49\x5b\x02\xd5\x42\x9e\x7a\xb4\x04\x0d\x8b\xeb\xeb\x78\x79\x4f\xf7\x36\xd1\x51\x10\x31\xa6\xd6\x7a\x22\xcd\xf3\x41\xb9\x80\x81\x1c\x9d\x77\x5f\xb1\x9c\x64\x78\xf0\x5e\xd9\x84\x30\x10\x3e\xa2\x4c\x0f\x41\x4d\x4c\xc0\x7d\x86\x0b\x72\xdc\x54\x2f\xf2\x2d\x83\x84\x5a\x42\xf8\xba\x45\xca\x7f\xf3\xaa\xb0\xb1\xe7\xde\x2b\x10\x94\xde\xac\x08\xd1\x6e\xee\x01\x96\x9f\x91\xbc\x16\xfe\xc2\x9c\xcc\x06\x1c\x54\xdb\x53\x45\xba\x64\x84\x2d\xac\xc9\x9e\xe7\x72\x94\x68\xd8\x0a\x3f\x09\x55\x83\xd8\xe8\x01\x24\x08\x51\x9d\x58\x2c\xc3\xff\x9a\x2e\xb7\xae\xba\xa2\x2d\xb8\x1f\xfc\x78\xee\x90\xef\x4e\xc5\x89\xdc\xce\x87\x11\x8d\xab\x31\xa6\x32\x8e\x40\x9a\xd5\x05\x9a\x51\x32\xc8\x2d\xf3\xce\xfe\x2e\x40\x14\xe4\x76\xf0\x4c\x3a\x70\x18\xe4\x52\x67\xec\x50\x18\xec\xd7\xbf\xf1\xdd\xa9\x26\x7e\x90\x66\x6b\x6b\x14\x17\xe8\x9d\xda\xcb\x50\x85\x94\x3b\xef\xc7\xad\x2f\x4d\xf5\xf1\xee\x0a\xf9\x43\x1a\xee\xb6\xb2\x4a\x55\x15\xb9\x3d\xbc\xf6\x86\x40\xf7\xda\xf8\xc9\x61\xe5\x67\xd7\x53\x49\x00\x20\x5c\x3d\xf2\x18\x4b\x6a\xc2\xda\x96\x1c\x4c\x1d\x2b\xc4\x9b\x4e\xa9\x6b\x81\x54\xff\xd4\xef\xff\xdc\x5e\x55\xa7\x11\x9c\xb8\xaf\x42\x9e\x85\x10\x5d\xff\xd4\x1f\xe4\xa2\xeb\xba\x48\x16\x8a\xa0\x5f\xa7\xdf\x27\xc4\x29\x87\x35\xff\x86\x8f\x14\x96\xbe\xb4\xb2\xed\x0b\x89\x80\xc7\x5f\xfd\x93\x9d\xdd\x1a\x17\xe4\x4a\x44\xfe\x3b\x02\x79\x53\x39\xb0\x8c\x8d"}, +{{0x91,0xb0,0x95,0xc8,0xa9,0x99,0xe0,0x3f,0x3e,0xd7,0x49,0xcd,0x9f,0x2f,0xaa,0xcc,0x00,0x76,0xc3,0xb4,0x77,0xa8,0x7a,0xb5,0xcc,0xd6,0x63,0x17,0x38,0x76,0x74,0x46,},{0xda,0xd1,0x74,0xd3,0x59,0xda,0xec,0xca,0x9c,0x6b,0x38,0x9b,0xa0,0x96,0x45,0x2a,0xb5,0xca,0x91,0xe6,0x38,0x3c,0x6d,0x04,0x2a,0x28,0x4e,0xce,0x16,0xba,0x97,0xb6,},{0x64,0xee,0x9e,0xfd,0xb0,0xc2,0x60,0x1a,0x83,0x5f,0x41,0x85,0x20,0x64,0x1e,0x43,0x6c,0x7d,0xd4,0x7c,0x33,0x3d,0x9f,0xc3,0x0c,0xfb,0xb9,0xe3,0x90,0xfe,0x76,0x45,0x30,0x65,0x47,0x08,0xb4,0x0b,0x03,0x58,0x18,0x99,0xa9,0xac,0x87,0x0e,0xfd,0x76,0x6f,0xfb,0xb4,0x63,0x71,0x52,0xf8,0xff,0x27,0x79,0x64,0xfe,0x35,0x42,0x52,0x09,},"\x9b\x0d\x8b\x00\x29\x98\x52\xd6\x8b\xbf\x49\x7f\xe6\x03\x96\x1a\x48\x54\x66\xa9\x9a\x54\x84\x00\x5d\xb7\x3d\x4e\x4b\xad\x81\x4e\x85\x74\xef\xd5\x4d\x64\x8b\xd5\xc9\x1a\xe8\x48\x3c\x54\xb2\xf9\x98\xb0\x2e\x1a\xbd\x6f\x40\x1a\x25\x52\x68\x43\xa5\xf2\xa2\x3a\x97\xbd\x58\x9d\x1f\x7e\x1a\xb1\x49\x15\xb1\xe3\x59\xa3\x96\xd3\x52\xc3\x60\xae\x65\x84\x32\x5a\xe4\xbb\x7d\x62\x4f\x61\x25\x5c\x5c\x7b\xf0\xa6\x7a\xca\xb4\x6c\x3b\x57\xb3\x45\x34\xc0\xee\x84\x31\xd2\x60\x57\x66\x06\xcb\xd8\x4d\x8d\x18\x39\xe7\x3d\xa6\xfe\x4b\x0b\x8b\x78\xf0\xf9\x58\x82\x7c\x2f\x1d\x93\xba\x7a\x34\x6d\xcc\x75\xcb\x56\x3d\xff\xde\x26\xf9\x97\x59\x8e\x8b\x5c\x2f\x16\x17\xc6\xfe\xfc\x9b\xe4\xb2\x8b\x54\x01\xb0\x00\x64\x13\xa2\x51\x69\x0d\x12\x03\xaa\xae\x4f\x6d\x8a\x3f\xb2\x1f\x24\x00\x9a\xb3\xbf\xf1\x37\x37\xa8\xa7\xe6\x64\x6c\x02\x73\x2d\x9e\xc5\xa4\xa5\x10\x46\x9e\x2d\x29\x9e\x4c\xc1\xad\x64\x80\xa4\x82\xaa\x95\x6f\x89\xdd\xcc\xcc\x64\xa1\x36\xfb\x15\xb8\x76\xb6\xec\xd8\x8c\x7c\x86\xa4\xdf\xc6\x0e\x66\x62\x07\xc6\x04\x16\x7d\x16\x34\x40\xca\x9a\xb9\xcf\x87\xa5\xe0\xf7\xbb\xc5\x51\x7d\xe4\xde\xe8\x76\xc0\x37\xf8\xcc\x9d\x95\x9c\x8f\xf5\xdb\xe9\x44\xff\x54\xcd\x91\xa7\x71\xe2\x92\x31\xf8\xb5\xf1\x7d\x61\xde\x90\x4c\x95\x5f\xe2\x02\x5d\xc5\x2e\xd4\x80\xfb\x3c\xc9\x0f\x23\x24\x59\xc6\x07\xef\x7e\x2a\xdb\x52\xc7\x48\x2b\xec\xd6\x7a\xd2\x14\x9a\x41\x28\xf9\x84\x03\x8b\x58\xaa\x90\x17\x67\x82\x39\x36\x04\xaa\xc7\x4c\x18\x20\x9a\x3d\x6a\x78\x63\x0c\x01\x95\x5a\x7c\xec\xe5\xda\x83\x84\xda\x3b\xaf\x63\xaa\x2d\xdf\x59\x63\xfa\xe0\x5b\xa3\xb8\x1c\x6a\x03\xd8\x6a\x00\xef\x78\xed\xb4\x18\x4f\xdc\x89\xb1\xd6\xbf\xeb\x31\x0f\xd1\xb5\xfc\xce\x1e\x21\x95\x24\xa3\xcf\xb2\xe9\x72\x57\x7f\x06\xb1\xdd\xde\xba\x00\x86\x5d\xae\x49\x79\x00\x0c\x00\x8a\xd9\x9f\x3b\x63\x8c\xce\xb8\xe8\xc7\xa0\xf9\x98\xd3\x4d\x92\x14\x3d\x81\xc0\xe1\xc0\x96\xa9\x25\xce\xba\x65\xc4\x30\x03\xee\x18\xd4\x94\xd0\x03\xe9\xc6\x1f\x77\xd6\x57\x59"}, +{{0x8c,0x56,0x8b,0x31,0x0a,0xce,0x7d,0x1f,0x0e,0xde,0xce,0xfd,0x60,0x3a,0x88,0x40,0x00,0x54,0x4c,0x79,0x25,0x65,0xd4,0x81,0xc3,0xd3,0xe0,0x6e,0x2d,0x82,0xca,0x96,},{0x5f,0xa6,0xe2,0x67,0xc7,0x66,0x73,0x68,0x41,0x41,0x10,0x72,0xd1,0x98,0x3d,0x19,0x00,0xac,0xf0,0x1d,0x48,0xc3,0xce,0x11,0x77,0x0b,0x26,0xf7,0x8d,0xa9,0x79,0xf7,},{0xde,0xbd,0xd8,0xe5,0xd3,0x11,0x2f,0xd7,0x7b,0x39,0x4a,0xa0,0xe3,0x6e,0x94,0x26,0xba,0xc9,0x1d,0xf1,0x26,0xfa,0x9c,0x31,0x7c,0xea,0x7c,0x9d,0x45,0x95,0x7c,0xdd,0x96,0xa4,0x5a,0xe3,0xad,0x76,0x04,0x13,0xee,0x12,0x05,0xaf,0xd7,0x1a,0x29,0xf9,0xc3,0xcb,0x58,0x6c,0xd2,0xd7,0xcd,0x1e,0x93,0xbc,0x16,0x52,0xfc,0x34,0xdc,0x04,},"\xb5\x9f\x5f\xe9\xbb\x4e\xcf\xf9\x28\x95\x94\x72\x1f\x26\x47\x04\x7b\x0d\xa5\xe0\xe4\x94\x1b\xbe\x57\xc5\xb7\x22\xb4\x76\x72\x3f\x0a\xc5\x97\x0b\x41\x11\xf8\x93\xbc\xaa\x41\x1f\x28\xfc\xeb\x4f\x58\x5a\x2a\x71\x87\x01\x8a\x90\x4b\x70\xef\x8f\xe1\xf6\x56\x9a\x54\xd0\x0a\xda\x37\xb6\x9c\xb5\xe9\xc9\xd2\x6c\x16\xa9\x03\x51\x81\x48\xe0\x4a\x1b\x93\x6a\x32\x32\x9c\x94\xee\x1a\x8f\xb6\xb5\x91\x89\x2c\x3a\xff\x00\xbf\x6e\x44\xdd\x0a\x76\x2b\xab\xe8\x9d\x70\x60\xc1\x7b\x90\x39\x0d\x23\xbf\x9d\x36\x0a\x29\x3b\x83\x08\x38\x30\x86\x91\x6e\x11\x82\xb1\xba\x43\x36\xf0\x01\xb8\xd2\x0d\xea\xe9\xa0\x29\xf7\xe8\x53\x97\xa9\xae\x5c\xf3\xca\x10\xc7\xf3\x87\x55\x88\xb8\xff\xab\xb0\x63\xc0\x0c\xa2\x6f\x58\x0f\x69\xed\xc5\x27\xa1\xac\xcf\x4f\x41\x39\x7b\x33\x76\x6b\xcf\x6d\x55\xeb\x8d\xe0\x81\xa4\x8c\x98\x1d\x05\xc0\x66\x61\x7b\x80\xd8\xf6\xf5\xe6\x0e\x59\xdd\x9b\x93\x0b\xc4\xd0\x45\x86\x40\x3b\xb8\x68\xdf\x75\x93\x3b\xdd\x86\x23\x0e\x44\x70\x36\xc1\x75\xa1\x0d\xe9\xbb\x39\x95\x3d\xcb\x19\x66\xa1\xf1\x19\x12\x07\x8e\x35\x8f\x48\xc5\xb2\x09\xa6\x36\xc7\xf7\x83\xf4\xd3\x6a\x93\xad\x2c\xc2\xe3\x24\x45\x19\x07\x8e\x99\xde\x1d\x51\x58\xb3\x96\x1e\x0f\xc5\xa4\xf2\x60\xc2\x5f\x45\xf5\xe8\x58\x5e\x60\x1d\xb0\x8b\xa0\x58\xd2\x90\x9a\x1b\xf4\x99\x5f\x48\x13\x46\x0d\x36\x95\x03\xc6\x87\x36\x85\xeb\xcd\x33\x30\xa1\x30\xb7\x5f\x23\x65\xfb\x2a\x5a\x34\xea\x63\xd9\x58\xa2\xa8\x67\xe9\x05\x52\xd2\xce\xc8\xc3\x90\x08\x4b\xe0\xc1\x08\xb0\xfd\x2d\x83\xcb\x92\x84\xdb\x5b\x84\x2c\xbb\x5d\x0c\x3f\x6f\x1e\x26\x03\xc9\xc3\x0c\x0f\x6a\x9b\x11\x8e\x1a\x14\x3a\x15\xe3\x19\xfd\x1b\x60\x71\x52\xb7\xcc\x05\x47\x49\x79\x54\xc1\xf7\x29\x19\x9d\x0b\x23\xe5\x38\x65\x40\x3b\x0a\xd6\x80\xe9\xb4\x53\x69\xa6\xaa\x38\xd6\x68\x5a\xbd\x39\x7f\x07\xfb\xca\x40\x62\x7e\xca\xf8\xd8\xd3\x01\x33\xa6\xd9\xd5\xaf\x00\x91\x92\x75\x1c\x9c\x45\xf7\x7c\x0b\xc0\x11\x26\x88\x00\xbf\x55\x25\x12\x73\x0e\x69\x97\x3c\x5b\xf3\x62\xab\x16\x48\x94\xbf"}, +{{0x3d,0x09,0xaf,0xce,0xe3,0xc4,0x32,0xfd,0xfb,0x6b,0xdc,0xea,0xd5,0x4e,0x3d,0xa5,0xb1,0xb4,0x16,0x5c,0x50,0xd6,0xd3,0x10,0xb7,0xfa,0xd7,0x87,0xb4,0x44,0xd6,0x80,},{0xb0,0xd9,0x02,0x8c,0x4d,0x14,0x87,0xd2,0x93,0xed,0x58,0x5a,0x76,0xbc,0x94,0xff,0xfb,0xaf,0xe2,0xc6,0x5d,0x98,0x0c,0x49,0x4e,0x14,0x1e,0x48,0x10,0xa3,0x5c,0xb9,},{0x89,0x73,0x9f,0xe4,0x41,0xca,0x0c,0xed,0x08,0xa6,0xeb,0x57,0x96,0xe9,0xbd,0xda,0x0e,0x74,0xfb,0x47,0x35,0x28,0xfd,0x49,0x07,0xed,0xb6,0x59,0xaa,0xb4,0x4d,0x33,0x43,0x22,0x90,0x46,0x71,0x63,0x68,0xfa,0xf8,0x8e,0x85,0xc1,0x64,0x4a,0xf6,0x6f,0xf2,0xdc,0xaf,0x0b,0x17,0xac,0x93,0xca,0x13,0x81,0x9f,0x3f,0x24,0x1d,0xd3,0x00,},"\x76\x71\x65\xca\xae\x0e\x57\x8f\x16\x53\x7e\x17\x50\xbe\x7d\xe8\x7a\x78\x9a\x51\xff\x2d\xe1\x18\x38\xf5\x64\xe2\x58\x0b\x23\x91\x36\x2d\x28\x68\xa5\xa4\x70\x8a\xf1\x5d\x2e\x2d\xb7\xb9\xbe\x39\xc1\x6a\xdc\xc1\x20\x0b\x34\xe6\xb4\xd4\x02\x7d\xdf\xfc\x1a\x2a\x35\x95\xe2\x9e\x85\x5e\xc5\x26\x1b\x20\xbd\x55\xc4\x28\xb0\x13\x09\xba\xdb\x59\xe2\xca\x3e\xdb\x96\x7f\xc2\xf4\xba\xc0\x72\x9d\xdf\x54\xfb\x6c\x20\x05\x7b\xdd\xa9\xe7\xaf\x7c\xbf\xc0\x92\xfb\xa8\x65\xfd\x32\x75\xb9\xd3\xbc\xb0\xc3\x46\xb9\x51\xd1\x70\xac\x9a\xa6\x50\xa8\x6d\xf4\x98\x55\xd4\x8a\x1b\x37\xce\x56\xc9\xf2\x73\x89\xf5\xc8\xb1\x5f\x5c\x2c\x90\x0c\x4f\x10\x7c\x06\x4f\x60\x3e\x4f\x86\x7e\xf2\xe9\xc1\x0a\x1b\x74\x21\x0e\x6b\x89\xbb\x01\x17\x93\xaa\x85\xde\xd4\x3b\x51\xb7\x49\xba\x7f\x70\x28\x7b\x6b\xc1\xb8\x94\x34\xdb\x8b\x8c\x8b\x5d\x73\xb2\x14\xb4\x1e\x36\xb5\x28\x00\x5b\xfb\xfe\x00\x2e\x21\xb1\x00\x6f\xb9\xd2\x4b\xab\xd7\x21\x06\xd0\x93\xe3\xc7\x09\x3b\x31\x38\xae\xa7\x19\xd6\x94\x79\x08\x46\x47\x49\x8c\xd6\xc9\xbb\xb7\x44\x50\x9c\xd7\xda\x8d\xd6\x1a\x62\x71\x00\xf0\x3c\x21\xe7\x50\xac\xb3\xfc\xf4\x63\x1d\x7c\x0f\x61\x81\x54\xd2\xe5\xfa\x66\x56\xfb\x76\xf7\x4c\x24\x79\x50\x47\xbb\xce\x45\x79\xeb\x11\x06\x43\xfa\x98\xe1\xf7\x76\xca\x76\xd7\xa2\xb7\xb7\xb8\x67\x81\x73\xc7\x73\xf4\xbe\x7e\x18\x2f\xd2\x4d\xd7\x62\x91\xac\x67\xd9\xf2\x6a\x28\xc5\xe3\xcb\x02\x5c\x68\x13\xa3\x78\xb3\x83\x22\x46\x42\xb4\xae\xfa\xd0\xc7\x6a\x65\x79\x51\x7b\x8f\x36\x07\x97\xdd\x22\x61\x3e\xe6\x82\xb1\x79\x38\x19\x50\xfb\x71\x60\x9a\x5f\xb5\x49\x4d\x2d\x57\xdc\xb0\x0f\x26\xd1\xe7\x29\x56\xf4\xd6\x67\x28\x30\xe0\x5c\x01\xb3\x77\x96\x77\xc0\x7e\xa0\x09\x53\xc6\xb8\xf0\xdc\x20\x4c\x8d\xbd\xcc\xb3\x81\xbc\x01\xb8\x9c\x5c\x26\x1d\xb1\x89\xab\x1f\x54\xe4\x6b\xc3\xed\xc4\xde\x5a\xd4\xf0\xeb\x29\xc0\xa1\x20\xe4\x37\xcd\x8f\x37\xac\x67\xd4\x8c\x7f\x0e\x73\x02\x78\x70\x8f\x02\xb5\x4a\xee\x62\xb7\x29\x52\xbc\x1c\x0e\xb4\x37\xca\x8b\xd5\x65\x54\x37"}, +{{0x41,0xc1,0xa2,0xdf,0x93,0x69,0xcd,0xc9,0x27,0x16,0x4a,0xa5,0xad,0xf7,0x75,0x71,0x36,0xab,0xe5,0x13,0x95,0x60,0x42,0x66,0x33,0x4c,0xc5,0x46,0x0a,0xd5,0x68,0x3e,},{0x40,0x55,0x78,0x34,0xcc,0xe8,0xe0,0x43,0x58,0x0a,0x42,0x72,0xa8,0x80,0x4d,0x4f,0x92,0x6e,0x88,0xcb,0x10,0xd1,0xdf,0x0c,0x5e,0x28,0xb9,0xb6,0x7e,0x1b,0x63,0xda,},{0xb8,0xb2,0x75,0x2a,0x09,0x71,0x96,0xc2,0x89,0x84,0x9d,0x78,0xf8,0x11,0xd9,0xa6,0x2f,0xc7,0x67,0x27,0x8f,0x0c,0x46,0x62,0x8b,0x52,0x1f,0x62,0xed,0x27,0x59,0xd7,0x44,0x62,0xa1,0x75,0xda,0x22,0x40,0x3f,0x15,0x02,0x04,0x45,0xca,0xe0,0x6d,0xa3,0xed,0x61,0xcc,0xa6,0x20,0x3b,0x70,0x06,0x36,0x2a,0x0e,0x19,0x89,0x63,0xd2,0x0e,},"\xb6\x4b\x14\xba\x77\xd2\x39\xe6\xf8\x1a\xbe\x06\x0a\xcc\xef\x85\xf0\x44\x2b\x65\x0c\x44\x01\x5e\xfc\x43\xa0\xaa\x2b\xa1\x0b\xf4\x8d\x30\x18\xb1\x95\x3d\xdf\xff\xbc\xda\x5b\xf3\xbb\xe0\xb6\xb3\xe4\xb0\xd9\xa3\x2c\x6b\x72\x5b\xbb\x23\x1e\x0a\x27\x04\x47\x1e\xe8\xbc\x1d\x59\x4f\x5c\x54\x22\x6f\x5d\xd9\xdf\xa1\x63\xcf\xc1\x45\x2c\x61\xf9\x3e\x4f\x81\x39\xab\x4c\xe4\x47\x6f\x07\xec\x93\x36\x61\xea\xe9\x1b\x6d\x50\x0b\xf5\x08\xac\x63\xe4\xba\xaf\x1f\xfc\x8f\x00\x07\xd8\x02\xe0\x05\xf1\xb4\xfc\x1c\x88\xbe\xe4\xd5\xe9\xe7\x63\x84\xf5\xa7\x04\x3b\xd6\x60\xcc\xe7\x1f\x3b\x67\xf0\x1f\x6a\xb8\x44\x29\x85\x31\xaa\xc7\x3a\x39\xd0\x45\x37\x00\x88\x85\x50\x05\xa0\x9c\x6d\x04\x23\x8e\xa4\x78\xdf\xac\xad\x1e\x6b\x22\xb2\xbe\x4c\x46\xb0\xd5\x9b\x1e\xba\x1f\x06\x0b\xf7\xda\x5d\x15\x66\xcf\x1f\xdb\x5c\x54\x3a\x33\x92\x6a\xf6\x3f\x01\xa0\xdb\x86\xe1\xa6\x71\x1c\x47\x3d\xc7\x95\xab\x28\x3c\x8d\x93\xfa\xcf\xb5\x70\x1f\xa2\xf2\xf6\xbb\x99\xf9\xb7\xe3\x74\x9b\x07\x1d\x58\x60\x7b\xe4\x4a\x70\x89\xbc\xb5\x03\xec\x14\x95\xb5\xfe\xed\xb3\x99\x96\x1f\xd3\x67\x7d\x74\x93\xea\xa3\xb3\xe9\xcc\x5e\x36\x42\xf4\x0d\x47\xde\x9b\xfe\xe7\xc2\x0b\x0e\x51\x9c\x4e\xb4\xa4\x0f\x4d\xa4\x46\xed\x6a\xc7\xaa\xca\x05\x3e\x75\x9c\x97\xda\xbe\x0a\x8e\xc2\xf5\x8e\x7f\x2f\x9b\x20\x72\x76\x2f\x9f\x79\x4a\x6a\x4e\x36\x06\x0b\x88\x72\xbd\x2c\x18\xd0\x6a\x85\xc2\xc1\x41\xa7\x82\x93\x77\x3e\xe8\xcf\xbf\x15\x4b\x99\x30\xcd\x39\xda\x31\xb4\x97\xe7\x37\xa7\x75\x0c\x90\xa1\x3f\x5a\xaa\x14\x7c\xd0\xdc\x43\x11\xf2\xe3\x49\x41\x25\x2e\xf1\x98\xb0\xc1\xf5\x08\x27\xe5\x6c\x9f\x16\xf5\x95\xac\xed\x6d\x2a\x69\x34\x65\x31\x49\x5a\x64\x99\x77\x4d\x36\x07\x66\xca\x9b\xe5\xed\x88\x81\xc0\xdb\x26\xed\x7c\x5e\x6f\xf3\xa4\xf9\xb7\x3c\xd8\xb6\x54\x64\x0d\xc9\x6b\xf4\x3b\xd4\x26\xa0\xf2\x8c\x9b\x25\xfa\x70\x4d\x62\xff\x02\x88\xfc\xce\xff\xaa\xeb\xd3\xea\x30\x97\xbc\xbb\xd7\x78\x42\x0e\xbc\x52\x0a\x41\x77\x30\xa1\xb5\xb3\xb8\xc9\x6c\xda\x9f\x4e\x17\x7d"}, +{{0xa0,0x06,0x11,0x48,0x94,0x67,0x12,0x2c,0x4c,0x16,0x4b,0xfb,0x6a,0x61,0x6e,0x6a,0x61,0x9b,0x9f,0x83,0xc4,0x36,0x72,0x06,0xb8,0x5d,0x3f,0xbe,0xc3,0x8c,0xd6,0x2c,},{0x57,0xab,0x58,0xba,0xbb,0x41,0xdc,0x0d,0xa0,0xbc,0xd5,0x06,0x05,0x9a,0xac,0x9f,0x46,0xec,0xa9,0x1c,0xd3,0x5a,0x61,0xf1,0xba,0x04,0x9a,0x9a,0xc2,0x27,0xf3,0xd9,},{0xc7,0x71,0xba,0x0a,0x3d,0x3c,0x4a,0x7b,0x06,0x4b,0xd5,0x1a,0xd0,0x5c,0x9f,0xf2,0x7f,0xd3,0x26,0x61,0x0f,0xbf,0xa0,0x91,0x83,0x03,0x9e,0x5e,0xdf,0x35,0x47,0x2d,0xde,0xd8,0xfc,0x22,0x75,0xbb,0xcc,0x5d,0xf1,0xbf,0x12,0x98,0x60,0xc0,0x1a,0x2c,0x13,0x11,0xda,0x60,0x2f,0xba,0xff,0xc8,0xb7,0x9c,0x24,0x9c,0x9c,0xc9,0x55,0x02,},"\x34\xdb\x02\xed\x75\x12\xbf\x8c\x67\xd3\x59\xe7\x20\x3a\x2e\xa4\x41\xe2\x0e\x72\x97\x66\xc1\x5a\xa0\x0f\xa2\x49\xa3\x51\x8f\xc2\x9e\xf8\x90\x5a\xa5\xb4\x67\x09\x58\xc6\xa4\x60\xd7\x7b\x3a\x80\xef\xcb\x47\x38\x59\xbb\xaf\xf8\x62\x22\x3e\xee\x52\xfe\x58\xac\xfd\x33\x15\xf1\x50\xf3\xc6\xc2\x7f\xf4\x8f\xca\x76\x55\x2f\x98\xf6\x58\x5b\x5e\x79\x33\x08\xbf\x59\x76\xba\xd6\xee\x32\x7b\x4a\x7a\x31\x32\x14\xb9\xae\x04\xb9\x65\x1b\x63\xcd\x8d\x9f\x5b\x3b\xec\x68\x9e\x0f\xd0\x00\xdd\x50\x17\x70\xdd\x0e\x99\xb8\xf9\x9e\xaf\xa0\x9c\x39\x6a\x24\x5a\x4a\x96\xe5\x68\x96\xa2\x9b\x24\x19\x0b\x1e\xf1\x10\x63\xf3\x9b\x63\xee\x3a\x58\x6b\x07\x62\x7d\xd3\x50\x0c\x4e\x17\x0b\x83\x5d\xc0\xec\x23\x6f\xa5\xa3\x5c\x44\x18\x47\x07\x56\x5c\x4a\x50\x66\x2d\x8d\xbc\xcf\xff\x7f\x9a\x7a\x68\xd0\x21\xb4\xaf\x64\xd5\x32\xb7\xc3\xd2\x74\x74\x18\xc2\xd7\x17\xbb\x6a\xca\x6b\x58\x74\x7a\xe4\xdd\x56\x41\xd8\x26\xf7\x9a\x8a\x31\x5c\x38\x21\x1a\x53\x8a\x92\x9e\x5b\x45\x1f\x62\x3f\x4f\xcb\xbc\xac\xdb\x86\xc8\x75\x2e\xa1\x3a\x61\x7a\xb4\x14\xab\x65\x3e\xb2\xe6\x8d\x54\x20\xdf\x7c\x6d\xf9\x24\x38\x16\x8d\xcf\x9c\x06\x65\x81\xdf\xe7\xb2\xc4\x68\x19\x4a\x23\x70\x7d\xe4\x65\x9b\xd6\x7e\xb6\x34\xff\x02\x47\x41\xc5\xfc\x86\x98\xfd\x4d\xc4\x1f\xe5\xdf\xc6\x29\x9b\x7a\x08\xe6\xff\xca\x37\x10\x9c\x02\x10\xc8\xf9\x4e\xa2\xd3\xdd\xc9\x77\xff\xc0\xb3\x79\x4f\xe6\xba\x43\x37\xc7\xaa\xb4\x34\xa6\x8a\xc6\x65\x48\x4e\xa8\x24\x3a\x84\xb7\x9a\xa1\x81\xee\x6a\xb5\xaa\x37\xa3\x2d\x87\x97\x25\xed\xc0\x18\xf8\x55\x21\x81\x81\x6d\x7d\x27\x2c\xa8\x81\x8a\x7b\x92\xe6\xee\x44\x54\xd1\xf7\x82\x8d\xd8\xaf\xba\x1a\x79\x03\x64\xb4\xff\x28\xd8\x4e\x02\x85\x97\x35\x3e\xbb\xef\x24\x83\x7b\xc3\x19\xe1\xae\x8f\x2b\x0b\x6a\x85\x1b\x48\x9c\x3e\x17\x0e\xef\x53\xe0\x65\xf7\x03\x26\x53\xcd\x6b\x46\xd8\xe5\x7e\x4e\x11\x1b\x78\x9b\xa9\x50\xc4\x23\x0a\xba\x35\xe5\x69\xe0\x66\x15\x40\x34\x07\xbc\xe0\x36\x9a\xaa\xb4\xea\xfa\xef\x0c\xae\x10\x9a\xc4\xcb\x83\x8f\xb6\xc1"}, +{{0xde,0x16,0x34,0xf3,0x46,0x0e,0x02,0x89,0x8d,0xb5,0x32,0x98,0xd6,0xd3,0x82,0x1c,0x60,0x85,0x3a,0xde,0xe2,0xd7,0xf3,0xe8,0xed,0xd8,0xb0,0x23,0x9a,0x48,0xcf,0xaf,},{0x9d,0xc1,0x46,0x5b,0x33,0x83,0xf3,0x7d,0xe0,0x0e,0xa2,0xd3,0xc7,0x0f,0x2c,0x8f,0xac,0x81,0x5f,0x01,0x72,0x02,0x9c,0x3f,0x57,0x95,0x79,0xc9,0x84,0xa5,0x89,0x5e,},{0xd2,0x05,0x06,0xeb,0x84,0x69,0x23,0xa0,0xb1,0x6f,0xf8,0x2f,0xb2,0xc3,0x92,0x3b,0x00,0xc1,0xb3,0xbc,0xc6,0xe2,0xf6,0x48,0x2f,0xba,0x24,0x80,0x75,0x21,0xe8,0xe0,0x22,0x3f,0x69,0x2e,0x62,0xea,0xc9,0x93,0xf4,0x98,0xf6,0x71,0x02,0xa0,0x4f,0xd1,0xac,0xf9,0xc7,0xe3,0x88,0x8d,0x85,0x7c,0x9a,0x08,0x0b,0x8a,0xf6,0x36,0x10,0x06,},"\xd1\x0c\x3e\x4d\xe7\xfa\x29\x89\xdb\xa8\x75\x37\xe0\x05\x93\xd0\xee\xd4\xd7\x5e\xe6\x58\x46\xda\xb1\x49\x8b\x47\x49\xd6\x4f\x40\xe3\x4b\x59\x11\xc5\xce\x3b\x53\xa7\xe3\x7d\x2d\x02\xbb\x0d\xae\x38\xed\x96\x2a\x4e\xdc\x86\xc0\x02\x07\xbe\xe9\xa8\xe4\x56\xec\xca\xe8\xbd\xf4\xd8\x7a\x76\x74\x60\x14\x20\x1a\xf6\xca\xff\xe1\x05\x66\xf0\x8d\x10\xda\xaf\x07\x71\x60\xf0\x11\xfe\xac\xa2\x5b\x9c\x1f\x6e\xca\x9f\xc5\x33\x14\xa8\x05\x47\x95\x17\x54\x35\x55\x25\x25\x7d\x09\xa7\xfd\xad\x5b\xc3\x21\xb7\x2a\xa2\x8d\x1e\x02\xd8\x69\x6d\x4f\x9e\xb0\xad\x3b\x21\x96\xf8\xbc\xfa\xeb\x1d\x61\x48\x28\x7a\x3f\xae\xfe\xf9\x1a\x7a\x3e\x06\x09\xc2\x8c\xe5\x9d\x0c\xa1\x4d\x0b\x30\x50\xdd\x4f\x09\x6b\x7b\xc2\x51\x39\x88\xba\x21\x21\x28\xd5\x02\x6d\xaa\xa7\x18\x88\x46\xdb\x21\xc5\xc1\xd1\x79\xab\x94\x87\xc1\xa5\xbd\x34\x65\x88\x12\x7c\x20\x39\x8d\x36\x2d\x4c\x75\x9c\xfa\xb2\xa6\x77\x75\x0b\x9e\x45\x67\x6a\x1e\x7e\x09\x2e\xf0\x2e\xdb\xf2\x78\xfb\x19\xa5\x8e\x9b\xf6\xc9\xe9\x96\xe2\x4e\xda\xd7\x3f\x3c\xe3\x1f\xa0\x4b\x6d\x85\x33\x43\x6b\xf8\x0b\x4b\x2f\x80\x5e\xd9\x1e\x7f\xcd\xa3\xbc\x2b\xab\x3b\x2b\xb1\x57\x15\x8a\xf0\xea\x8e\x3f\x07\x31\xdf\xad\x45\x9d\x2e\x79\xb6\xd3\x71\x5f\xe7\xbf\x1e\xaf\xc5\x39\x75\x93\x20\x88\x57\xe5\x7b\x7f\xeb\x2f\x73\x87\x94\x3a\x8e\x09\x13\x47\x0c\x16\x1a\xef\x4f\xe2\x05\xd3\x63\x7f\x23\x17\x7f\xf2\x63\x04\xa4\xf6\x4e\xba\x3f\xe6\xf7\xf2\x72\xd2\x34\xa6\x72\x06\xa3\x88\xdd\xd0\x36\x6e\x89\x4e\xaa\x4b\xb0\x5d\x73\xa4\x75\xf1\xb3\x4c\xa2\x22\xbb\xce\x16\x85\xb1\xb5\x6e\x03\x4e\x43\xb3\xc4\x0e\x81\xff\xf7\x96\x82\xc1\x9f\x32\xaa\x3f\x2a\x89\x5c\x07\x09\xf9\xf7\x4a\x4d\x59\xd3\xa4\x90\x29\xec\xfc\xb2\x83\x08\x2b\x06\x7f\x1a\x0d\x95\x05\x75\x0f\xd8\x67\x32\x19\x99\x48\x42\x49\xef\xa7\x25\xf5\x2c\x94\xc7\x59\x62\x06\xa9\x11\xf3\xf5\x05\xd6\x3f\x03\x13\x25\x4b\xd4\x45\xf0\x5b\xe3\x99\x6b\x58\xfe\x18\x19\xaf\x87\x35\x2e\x7f\x0a\x2c\xa3\x20\xd9\xcc\x00\xa5\xfe\x77\xad\x41\x64\x0d\x50\xbe\x84\x36"}, +{{0xc7,0x38,0xef,0x5f,0x09,0x35,0x28,0x1b,0xa6,0x25,0xfa,0x40,0x14,0xd4,0xa4,0xd0,0xbe,0x7e,0x28,0xfe,0xd7,0x79,0xa9,0xcf,0x65,0x8e,0x21,0xdb,0xa4,0x3c,0xeb,0xc1,},{0x95,0x79,0x9f,0xaf,0x70,0x6d,0x19,0x5e,0x54,0x4c,0x76,0xca,0xfd,0xdf,0x09,0xd0,0x2d,0x1b,0xea,0xfc,0x42,0xc9,0xd6,0xc9,0xea,0xd4,0xc1,0x84,0x55,0x87,0xd3,0x9e,},{0xf4,0x43,0x71,0xe6,0xc3,0x39,0x16,0x39,0xd4,0x57,0xed,0x14,0x64,0x81,0x84,0x80,0x94,0x11,0xe8,0x0a,0x32,0x01,0xf8,0x81,0x16,0x70,0xe5,0x00,0xfc,0xad,0x92,0xf3,0x00,0xaa,0xbf,0x7f,0xc6,0x8e,0x44,0x01,0x91,0xe8,0x81,0xd6,0xc3,0x47,0x4e,0xfd,0x6d,0x28,0xf0,0x9d,0xc4,0x43,0x12,0xfc,0xfc,0xb8,0x27,0x01,0xba,0x3c,0x29,0x0a,},"\x16\x8d\x0b\xc5\x59\x8b\xe0\x2f\x54\x43\xbf\xe7\xdf\xb8\x82\x99\x85\xca\x5d\x28\x2a\xf9\xcf\x1b\x14\x82\x60\x2f\x24\x3d\x48\x6b\xd8\x2b\xa0\x39\xa0\x75\x09\x09\xe9\xb3\xc7\xd4\xd5\xf8\xb8\xba\xf4\x57\x18\xaf\x03\x11\x85\x4f\x4d\x1c\x78\x37\xf3\x1d\x8e\xe6\x8d\x35\x58\xe7\xe5\x1e\x0c\x64\x6a\x4a\x63\x75\x96\xee\x90\x05\x7b\x01\xed\x0a\x17\xda\xa3\x95\x0b\x81\xab\x47\xae\x8b\x94\xc1\x7d\x40\x74\x69\x13\xc4\x6b\xa1\x47\x8b\xfc\xa5\x1b\x16\x76\x28\xfc\x3e\xe1\xe2\x2f\x2f\x19\xd6\xd8\xda\xf9\x3d\xf6\x54\x0c\xed\xb7\xa8\x59\xd1\xa2\xba\x59\x11\xba\x71\x76\x6e\x8b\x7f\xce\x0c\x0e\x86\x63\x61\x6d\x01\x80\x69\x7d\x78\xce\x30\x40\xd4\x38\x13\x19\x82\xf3\xf8\x11\x2a\xcc\xa2\x9a\xe5\x3e\x53\x9f\xf8\xc9\xec\x41\x06\xd1\x32\xf4\x02\x01\x85\x18\x30\x84\x85\xf2\xaa\x6c\x9e\x8d\x1e\x62\xfe\xd6\x0c\xb2\x49\x45\x7d\xb3\x3c\x6f\xd1\xfe\x07\x44\x53\x61\xf0\x81\x94\xa2\xb5\xa0\x57\xcb\x03\xcc\x75\x4e\x5c\x7d\x4a\x7e\xea\x53\xa7\xf7\xd2\x07\xca\xcc\xa5\xe6\x8c\xaf\xa9\x69\xa3\x52\x1d\xbb\x81\x03\x99\xa1\x7f\x32\x8e\xe7\x67\xcf\x55\x92\x6b\x2b\xd5\xf0\x29\x54\x9d\x3b\x46\x45\x79\xc4\x26\x55\x26\x53\x98\x47\x2e\x1c\x77\xcc\x8d\xd9\xaf\xf1\x87\xf7\xac\x34\xdd\x45\x6a\xce\x99\x9a\x73\x6e\xcc\xa6\xd4\x05\xd4\x92\x2c\x77\x9c\x60\x0c\x47\xb8\x4c\x9c\x1d\xf5\xe5\xf8\xed\x3b\x28\x11\xd3\x51\x33\x91\x13\xf8\x45\x3c\xca\x4c\x44\x11\x68\x8c\xb0\x38\x82\x58\xeb\xbd\x18\x72\xb8\x36\x10\x04\x22\x49\x49\x4e\xd5\x60\xd4\xcd\xa6\xa6\x84\x55\xd9\x57\xe8\x06\xdd\x0b\xdd\x83\x00\x4c\x4c\xa8\x07\x74\xb8\xa0\xa1\x66\x58\x66\xf1\x70\x85\x01\x4e\xad\xb3\xea\xe7\x38\x2f\xa8\x70\xde\xb2\x9d\xd8\xc9\x31\xb5\x30\x19\x62\x57\x40\xe2\x83\x92\xf3\x85\x75\xc0\xe2\xa9\xe5\x04\xfc\x35\xbd\x95\xdf\x56\x43\x9a\x89\x82\x30\xa2\x39\x8c\xd2\x22\x5c\x76\x6e\xf3\x6f\x12\xae\x7e\x49\xb3\x0a\x9c\x0a\xad\x46\x9d\x58\x95\xbb\xf7\x21\xcc\x0f\xf5\x1d\x84\x0c\x80\x2d\x4a\x7e\xef\xba\x84\xfe\x52\x05\xa2\xc2\xf1\x40\x11\x92\x2d\xde\x56\x14\x56\xf7\x9e\x61\x61"}, +{{0x5f,0xea,0x38,0x73,0x9c,0x61,0xca,0x83,0xbf,0x7b,0x4a,0xd1,0x75,0xa2,0x11,0x76,0x27,0xb9,0x71,0xa6,0x34,0xa3,0x05,0xa8,0x4f,0xa5,0x7f,0xec,0xb8,0x03,0x56,0x24,},{0xdd,0xd1,0x4b,0x0f,0xc0,0x67,0x68,0xd5,0x10,0x4c,0x50,0x76,0x4b,0xfd,0x3b,0x95,0x23,0x52,0xa3,0x40,0x07,0xc5,0x0d,0x5d,0xdd,0x22,0x4f,0xf5,0x1a,0xfc,0xdf,0x9c,},{0xf4,0xe2,0x74,0x82,0x3f,0x2c,0x39,0x6f,0x3a,0x32,0x94,0x86,0xaa,0x64,0x10,0xc5,0xff,0x19,0x26,0x6f,0x07,0x70,0xfd,0x04,0xfb,0x14,0xa7,0x60,0x2d,0x2b,0x69,0xa4,0xa2,0xb0,0x09,0x28,0xe9,0xe1,0xd9,0x23,0x89,0xf8,0x03,0x33,0x59,0xed,0x6f,0xb2,0x14,0x64,0x67,0xaa,0x15,0x4c,0xba,0x59,0x7d,0xec,0x6a,0x84,0x17,0x3f,0x8d,0x07,},"\x10\x13\xc6\x0a\x73\x95\x35\x49\xe5\xed\x10\x5b\xde\xa1\x50\xb9\x1e\x60\xec\x39\x20\x0d\x43\x72\x13\x04\xbf\xc8\xec\x43\x9d\x39\x60\x96\x13\xc2\xd8\x78\x04\x4a\x9d\xa0\x1b\x26\xd8\x6d\x6d\x65\xdb\x93\xd9\x1a\x13\x7e\x9c\x48\x08\xa9\x7d\x4e\xf2\x86\xa9\x03\xf3\xf1\x38\x2c\xc6\xd1\x29\x42\x16\xb9\xfa\xfc\x01\x3c\x86\xb9\xff\x68\xb5\x5a\x50\xea\x37\x66\xe6\x1d\xc1\xce\x38\x34\x8e\x91\xd6\x2c\xe7\x32\xc1\x52\xd7\x66\xb9\x33\x5c\x68\xd6\xca\xd7\x7b\xe2\xb4\xa0\xcd\x50\xb9\xa1\xec\x63\x2b\xa5\x56\x48\xa6\xe7\xe1\x1a\x14\xc0\x68\x53\xc0\x2a\xec\x48\x09\xbd\x14\x7a\x5d\xdd\x9f\xbc\x3b\xe9\xf0\xc8\x15\x8d\x84\xab\x67\x95\xd7\x71\xb4\x2b\x18\x14\xa1\x7a\x3c\x7a\x6c\xa0\xf4\xa8\xf7\xb3\xa0\xdb\x1c\x73\xba\x13\xb1\x64\x00\xdf\xec\xbd\x03\xd2\x16\x65\x0e\x4d\x69\x70\x4a\x70\x72\x46\x44\x4d\x57\x91\xfa\x27\x37\x52\xf5\x9c\xb5\xae\x9f\xd4\x16\xa5\x18\x66\x13\xd6\x6a\xfd\xbd\x1c\xe6\x91\xa8\x7b\xd7\xd8\xb6\x71\x90\xe9\xac\x68\x70\x62\xa0\x80\xd2\xec\x39\xfe\x76\xed\x83\x35\x05\x82\x51\x87\x28\x39\xe8\x5e\xb6\x2f\x18\xec\xe1\x87\xca\xba\x55\xb5\xf7\xd5\xed\xca\xde\x01\xcd\xc5\x43\xcc\x67\x7e\x50\x23\x8b\x89\xc5\x63\x5a\xd5\xc8\xfc\x22\x0f\x5e\x0b\xe1\xbc\x66\x7d\x20\x98\x97\x53\xa6\xd6\x16\xfa\x69\xf8\xb1\x29\x40\xb8\xca\x9e\x2c\x48\x57\x71\x32\xd8\x69\x1b\x05\x37\x79\xa1\x52\xcb\xac\xff\x3b\x8b\x1b\xd7\xaf\x69\x2e\x56\xc7\x3b\xba\xe4\x63\x47\x76\xcf\xc2\x13\xc9\x9b\x9a\xe4\x58\xdf\x1b\xef\xc8\xc8\x77\x74\x26\x64\xb0\xa0\xbb\x1f\x69\x15\xc8\xda\xe3\xb3\xf5\x5d\xd7\x5a\xba\x6a\x3b\xcc\x41\x76\xb4\xe3\xba\x03\xd0\xc1\xc0\x4c\x3c\x64\x08\x77\x8b\x2b\x8e\x5a\x8a\x3e\xb5\x2e\xd3\x2a\x74\x28\xc0\x0a\x98\xa5\x89\xd8\xca\x93\x90\xa2\x10\xf4\xa7\xac\x00\x4f\xa1\xfe\x4c\x6d\xa6\x94\xf1\x22\x76\xe3\x20\xb4\x1b\x0b\x59\xf7\x5d\x26\x4a\x39\x6d\x45\x0b\x63\x1a\xb3\x53\xf1\x61\x27\x09\xe7\xa2\xe6\xa5\x0d\x01\xcb\x11\x0e\x53\x04\x05\x46\xdd\x3b\x1e\x11\xd2\x57\x32\x81\x3a\xa7\x6b\xe5\xe8\x1f\xcf\x7a\x57\x73\xf6\x81\x5b\xbd"}, +{{0x60,0xf9,0xa1,0x4c,0xce,0x5d,0x43,0xfd,0x9a,0xab,0x4e,0xe8,0xcc,0x83,0x79,0xd5,0x75,0x94,0x91,0x52,0x69,0x3b,0xf2,0x9a,0x67,0x90,0xb0,0x35,0xe4,0x2a,0x44,0xde,},{0xbd,0x4a,0x70,0x74,0x0d,0x5a,0xca,0xbe,0x49,0xf9,0xa2,0x15,0x20,0x82,0xfa,0x20,0x25,0x33,0x0e,0x64,0x40,0x43,0x7f,0x1d,0x04,0x7f,0x31,0x3d,0xe4,0x90,0xdc,0xa5,},{0x72,0xf5,0x4b,0xb8,0xbd,0xd1,0x7e,0x9e,0x42,0x2c,0xd3,0x39,0x63,0x1d,0xd3,0x9f,0x57,0x35,0x50,0x15,0xd4,0xcb,0xd1,0x5a,0xca,0xb7,0x54,0x2e,0xfd,0x78,0x4a,0x32,0x1c,0x1f,0x61,0x25,0x76,0x4c,0x0d,0x15,0x40,0x45,0xb3,0x2e,0x70,0xdc,0x2e,0x03,0xfb,0xfe,0x11,0x17,0x46,0x8a,0xc3,0xe7,0x31,0x27,0xb5,0xfa,0xc8,0xd4,0x21,0x02,},"\xdd\x7f\x44\xf9\xeb\x72\x8a\xb4\x8d\xe5\x4e\xcd\xe6\xb6\x18\x4b\xd5\xdd\xd8\x70\x75\x45\xa0\x12\x9f\x2e\x90\x59\x05\xb5\x5d\x3e\x7f\xd5\x7e\x28\x48\x5d\x25\x81\x48\xf6\x60\x5e\x23\x77\xd5\xb2\x67\xd2\xea\xf4\xcd\x4b\x46\xe4\x54\x96\x22\x19\x86\x82\x32\xb6\xf4\x1f\x88\xa7\x97\xf9\xcd\xd5\xc3\x9a\xda\x51\xa6\x41\x21\x4f\xb9\xdb\x2c\x2a\x9b\x5a\x5b\x16\xe3\x03\x57\x53\x18\xb6\x25\xcc\xa9\x70\xb7\x43\x48\x72\x79\x02\xa1\xcf\x26\x8b\xd1\x6e\x10\x71\x13\x16\x1c\x8c\xbc\x99\x30\x3c\x2b\x9f\x23\x55\x41\xa7\xb3\x1e\x43\x31\x20\xfe\xba\x14\xfe\xbe\x4b\xcb\x0f\x5b\x93\x6c\x7e\xdd\xdd\x0e\xcf\xc7\x2c\x8d\x38\xf6\x4c\xdb\x6c\xfc\x29\x10\xbc\x29\xa5\x21\xc5\x0a\x51\xab\xcb\xc2\xaa\xbf\x78\x9d\xe8\x22\xcb\x04\xf5\x72\x8f\xee\x15\x3d\xd5\x50\x1b\x2d\xb5\x9c\x59\xf5\x0c\xab\x17\xc2\x92\x16\xd6\x69\x51\x01\x9e\x14\x5b\x36\xfd\x7e\x84\x1b\xfb\xb0\xa3\x28\x55\x4b\x44\xdd\x7e\xf5\x14\x68\xc3\xd5\xb7\xd3\xa1\xf7\xb9\xde\xf5\x8d\x8c\xf9\xd9\xbc\xaf\xe9\x2c\x86\xcf\x6d\x61\x19\xe9\x8d\xba\x6f\x38\xea\x57\xe3\x22\xdd\xc9\xc2\x19\x8d\x4b\xbc\x3b\x94\xea\x13\x29\xdb\x0d\x45\x8e\x01\xc7\x08\x1b\x33\x92\x5a\x3e\x28\x7f\x59\x9a\x85\x8c\x50\xc3\xa8\xf1\x8c\xc2\xaa\x63\x4d\xf6\x3e\x7f\x10\xe4\x03\xad\xea\xb2\xf4\x1d\xb5\x57\x87\x90\xc3\xb4\xf0\x41\xa8\xb7\xa4\xf6\x9c\xd6\xe0\x62\x15\xdf\x82\x01\xae\x5b\x3e\x1d\x1d\x25\xa0\xa3\x9b\xfc\x3d\x04\x1a\x2f\x98\x21\x3e\xf4\x14\x12\x45\x79\x2a\x76\xf0\x6d\x4d\xe2\x5f\x64\x67\xa0\xe5\x6f\x2f\x5c\xf6\x94\x00\xd2\x21\x17\xde\x7b\x46\x14\x95\x54\xb7\x0c\x75\xb9\xf9\x94\x84\xa4\xf6\xf0\x35\xad\x3f\x10\xe3\x75\x3c\xb1\x4f\x4f\x39\x8d\xcf\x6a\x64\xd1\x0c\xf6\xc4\xfa\xc0\x7c\x91\x19\x3c\xc0\xf5\x4f\x0d\xe5\x8c\x63\x43\xe9\xca\xaa\x6b\x4f\x47\x5e\xf9\x1a\x59\xe0\x83\xf9\xf2\x11\xf5\xbc\x8e\x7e\x45\x16\xb4\x5c\xf0\x6b\xf5\x0b\xeb\x8f\xc4\xab\x57\x9d\x86\xd4\xa4\x19\x0e\xea\xc7\x48\xd0\x6e\x08\x52\xc4\xb9\xba\x8c\xfc\x50\xdd\x0a\x03\x7a\x7b\xad\x7f\xad\x55\xaf\x30\x9a\x5f\x13\xd4\xc9\x1e\xd3\xe0"}, +{{0xa3,0x90,0x53,0xc5,0xc5,0x8b,0xf3,0x1d,0x46,0x2b,0x27,0xa6,0x20,0xb0,0xb3,0x7b,0x80,0x52,0xc6,0xb1,0xc4,0x10,0x2b,0x61,0x45,0x66,0x3a,0xa1,0x5e,0x97,0x87,0x18,},{0x36,0x42,0xac,0x2a,0x32,0x80,0xdc,0xe5,0x2a,0xd8,0xdf,0xcf,0xd3,0x70,0x94,0x36,0xed,0xc4,0xe7,0xe4,0xae,0x1b,0x45,0x2d,0x9b,0x22,0x07,0x80,0xb0,0x86,0x79,0xfa,},{0xf7,0x38,0x3e,0x96,0x6c,0xb2,0x30,0x9d,0xee,0xdf,0x86,0x01,0x00,0x18,0x3a,0xae,0xfa,0xc6,0x72,0xca,0x16,0xd5,0x41,0x9c,0xd6,0x42,0x2c,0xa7,0x0e,0x16,0xb3,0x97,0x6f,0x5f,0x16,0x5a,0xfc,0x27,0x86,0x11,0x7c,0x86,0x82,0x34,0xba,0x11,0x09,0xed,0xe0,0x31,0xf8,0x97,0x9b,0x50,0xe5,0x67,0x35,0x8b,0xd4,0xf8,0xbd,0x95,0x82,0x02,},"\xf6\x55\x40\xd3\xab\xeb\x1e\xe5\xea\x98\x70\x62\xc1\xb5\x79\x51\x6d\x3c\x29\xc3\x9c\xbc\x6b\x09\xd6\x0e\x18\xfe\x27\x4c\x2b\xef\xe0\xf5\xfe\x7d\xbd\x57\xc2\xd5\x83\x52\x29\xbb\x75\x4e\xc4\x34\x13\x94\x76\x57\x76\xd6\xa9\x17\x8c\x4e\x6a\x31\x2c\xd7\x4b\xdb\xac\xa0\xe8\x82\x70\x62\x8c\xd8\x41\x00\xf4\x72\xb0\x75\xf9\x36\x92\x83\x01\x22\xf0\x0f\x9b\xd9\x1a\xc5\x82\x83\x6c\x8b\xfa\x71\x4a\xa4\x8e\x97\x70\x03\x55\x6e\x1b\x69\x6d\xf3\x28\xef\x58\x4f\x41\x3f\x8a\xb6\x14\x76\x06\x99\xc4\xd1\x47\xc3\xee\xa1\xda\x04\x35\x83\x5c\x9b\xf7\xad\x54\x60\x6f\x02\x13\xeb\x74\xa1\xb4\x76\x14\x15\x06\xae\x2c\xd1\x24\xcd\x51\xd6\x6e\x7e\x7e\x57\x95\x60\x57\x63\x05\xc5\xfb\xe8\x43\x0b\xe3\xeb\xeb\xaa\xcb\xa3\xf9\x98\x9d\xd7\xd1\x99\xf5\xa4\x55\xa5\x0c\xdb\x37\x55\x03\x7e\x1a\x70\x67\x4a\x4f\xef\x40\xb4\xa3\xaa\xf7\xbd\x3c\x95\xb1\xab\x41\xbb\x20\x62\x11\xc3\xa1\x27\x6d\x3e\x37\xd8\xa3\xa5\xc3\xd5\xd0\xf3\x6e\xf5\xb4\xf3\xde\x26\xb7\xf2\x0f\x6b\x29\x00\x71\x6d\xcc\x22\xab\x73\x4e\xba\xf1\xe8\xd0\x00\x20\xe5\xf0\x19\x55\x16\x53\xb9\xc2\xf7\x0a\x40\x38\xdf\xb2\xf1\x2d\x25\xd6\xd8\x4e\x79\x07\x3a\x65\x48\xfe\x15\xe4\x82\x8f\xe5\xde\x83\xac\x3d\x8d\x98\xb7\xda\xf9\x27\x10\x48\x2c\x37\xf7\xbd\x24\x31\xa8\x11\x4c\x61\x37\x65\x7b\xb1\x77\x88\x2d\x8a\x3c\x76\xba\xbf\x1c\x67\x1a\x70\x55\x36\x5f\xe9\x08\x66\x16\x7a\x2d\x1d\xbc\x87\x0b\xe8\x3b\x36\x01\xf0\x9d\x4a\x31\x7a\xe2\x54\xca\xc9\xf9\x8d\xcc\x7a\xea\xd9\x22\x4c\xd9\xc9\xd8\xa2\x00\xab\xc8\x0a\x2d\xd1\x08\xaf\x28\xfd\x46\xad\x70\x80\xae\x74\x1b\x50\x05\x4b\x9b\x9a\x92\x01\xef\xb7\x83\x8b\xc4\xc5\xc2\xcc\x3d\x76\xba\x0f\xcc\x49\xc4\x6e\x79\x2c\x26\x29\x2b\x7d\x03\x12\xaf\xf9\x55\xa9\xf8\xed\xf0\xc6\x96\xa7\x0a\x61\x4f\x35\x53\xad\x38\x69\xbf\xde\x48\xd2\x6a\x4d\x36\x7b\x6c\xec\x05\x7e\x62\xa4\xe5\x48\x55\x4b\x48\xb5\x3e\xcd\xa7\x90\xba\x7a\x0a\xb2\xe3\xde\x58\x7b\xdc\x22\xb0\x2f\x59\x47\x63\x4d\x73\x09\x9f\x54\x7d\xb2\x2e\xc1\xbb\xf8\x23\x43\xf9\xa2\xca\x38\xbc\xe4\xeb\x59\xbe"}, +{{0xe0,0xc2,0x9d,0xf4,0xde,0x45,0xc4,0x75,0x39,0xe0,0x89,0x6b,0x3a,0x59,0xbc,0x3d,0xe6,0xb8,0x02,0xfd,0x14,0xdb,0xdc,0x9f,0x25,0xe7,0x17,0xac,0x82,0xc3,0x28,0xf3,},{0xa6,0x90,0x02,0xb0,0xf5,0xef,0x35,0x4c,0xe3,0xb2,0xd6,0xb8,0xd8,0xba,0x70,0xab,0x77,0x84,0x32,0xb2,0x2f,0x14,0x4d,0xc9,0xc2,0xeb,0x92,0xd9,0x9d,0x99,0xdd,0x2a,},{0xbb,0x3b,0x8c,0x5c,0x27,0x59,0x1f,0xd8,0xb9,0xc5,0xba,0x48,0x9d,0x6b,0x6e,0xe5,0xb0,0xfb,0x4a,0x7b,0x0d,0xe5,0x1f,0x16,0x39,0xaf,0xc6,0x73,0xd0,0xe5,0xf7,0x5e,0x31,0x3a,0xa7,0xe1,0xd0,0x00,0x90,0x81,0xdb,0xca,0x74,0x35,0xb6,0x87,0xcc,0xd1,0x2f,0x64,0xf7,0x4a,0x38,0x6e,0x77,0x2b,0x9e,0x24,0x78,0x1b,0x92,0x5c,0x8c,0x0c,},"\x6a\x37\xcb\x4c\x74\x9c\x58\x35\x90\xc8\xd8\x49\xbc\xe3\xfa\x65\x7f\x10\x00\x91\x90\xca\xd9\xbe\x41\xed\xe1\x9b\xf2\xfd\xb3\xc5\x62\xa6\x10\x1f\x27\xbd\x37\xf2\x23\xca\xb1\x3c\xed\x24\x5a\x1c\xed\xf8\x52\xf5\x51\xf8\x57\xaa\xd9\x72\x7f\x62\xc9\x67\xc0\xa9\x21\xdf\x11\x6f\x48\xa8\x0a\x60\x40\xb3\xc7\x23\xab\x5c\xb5\x94\xc4\x50\x7a\x3d\x20\xcd\x60\x51\x4e\x22\x16\x4a\x82\xb7\x4f\x19\xdc\xfd\xd8\x3c\x57\xbc\x36\x52\x37\x55\x17\x41\x4a\xf5\xd1\x8e\x0a\x64\xcc\xab\x36\x69\x97\x68\xd0\x7c\xf4\x0b\x70\x63\xa8\x3e\x43\xd5\xf6\x07\x96\x4b\x1b\xf0\x84\x0a\x45\xad\x50\xab\xf8\x3d\xbc\x84\x9f\x40\xe5\xb4\xcf\xb6\xa3\x34\x7b\x29\xfe\xc5\x07\x74\x04\x6a\x4b\x50\x04\x10\x32\xaa\x4d\x56\x7e\x85\x64\xb3\xee\xd1\x64\x20\x40\x68\x2d\xd8\xae\x7d\x71\x79\x28\x6c\xf6\xe1\x85\x3d\xc8\x7d\x27\xc3\xe9\xe6\x0f\xa4\x7c\xf8\xcb\x2d\xa0\x18\x1d\x53\xee\xc4\x06\x14\xb0\x73\x31\xa4\xfb\x70\x28\x08\x6d\x0b\x1c\xe2\xe1\x11\x5b\x73\xa1\x62\xc5\x27\xbd\xd7\xca\xb5\x33\x5b\x86\x3d\x10\x8b\xe0\x47\xbd\xbc\xa1\x12\xcc\x6e\x77\x6b\xb4\x53\xc3\x17\x31\x43\x88\xbb\x96\x53\xef\xb4\x44\x4b\xf5\xcf\x1e\xc8\xda\x23\xb7\x11\xba\x71\x79\x6c\x0a\xe0\x2b\xa1\xdc\xc8\x38\x45\x50\x78\xc3\x89\x7f\x07\xe9\xe1\x3b\x76\xe4\x92\x74\xc2\xe2\x07\x50\x6b\x00\xa0\xb5\x58\x88\x3a\xa1\x22\xb6\x67\xdb\x9d\x67\x05\x08\x60\x6a\x3f\x54\x32\x06\x36\xcd\x19\xf9\x73\x91\x7f\xb1\x87\x5f\x43\x63\xe2\x20\xf1\xe1\x23\x98\xcc\x6a\xfd\x79\x09\x47\x43\x33\x84\x56\x81\x3a\x58\x26\xad\x3f\x1a\xba\x7c\xd7\xbe\xab\x1f\xe1\x83\x85\x9c\x0c\xc9\xef\x40\xa5\xea\xb9\x12\xca\xf5\x15\xa8\xd4\xc3\xb9\x3d\x64\x1b\x7a\xb3\xe7\x6b\x16\xc1\x29\x71\xac\xe8\x8f\xf3\x3e\x5a\x1e\xd9\xb4\x4e\x45\xdb\x8f\x30\x85\xdb\xf0\x70\xb2\x56\xb0\xd7\x51\x2e\xe1\x06\x94\x32\x60\x3d\x73\x09\x5d\xb8\x74\x9c\xa5\x47\x96\x3b\xd7\x1a\x8a\x68\x4a\xb8\x51\x6b\x14\x6c\x41\x87\x17\x63\x86\xaf\xdf\x6c\xb1\x36\x8a\x3d\xd8\xfc\xb2\xcf\xff\x77\x05\x6a\xaf\x78\x23\xf8\x00\xb2\x66\xac\xce\x72\xbf\x64\x3c\x6d\x0c\x28\xf0\xab"}, +{{0x19,0x8b,0x5f,0xd1,0xc0,0x38,0x27,0xe0,0x99,0x4a,0xd5,0xbf,0xee,0x9b,0x5b,0x7b,0xe9,0x96,0x6c,0x9c,0x3a,0x26,0x7e,0x4d,0x74,0x30,0x34,0x37,0x67,0x40,0x3c,0x67,},{0x66,0x82,0xc6,0xf1,0xa8,0x66,0xb4,0x9b,0x2f,0x8e,0xe9,0x7f,0x2e,0x53,0x2f,0xa9,0x16,0x66,0xbf,0x38,0xda,0x1b,0x4d,0xd6,0x55,0x43,0xa1,0x77,0x77,0x94,0xcb,0xee,},{0xf4,0x54,0xf3,0x5b,0x18,0x53,0x8f,0x87,0x7e,0x5d,0x61,0x4a,0x76,0xb5,0x27,0x6a,0x27,0xfc,0x0b,0x43,0x3f,0x21,0x5d,0xc4,0xe9,0x63,0xb3,0xf0,0x47,0x69,0x4c,0x78,0x0c,0x51,0x5c,0x6e,0xf6,0xfe,0x2d,0xb4,0xb0,0x09,0x00,0x9b,0xc2,0x73,0x3a,0xec,0x4f,0xd4,0x6e,0x61,0x53,0x57,0xcc,0x0b,0xcc,0x9f,0x1f,0x7f,0xc2,0x1e,0x3c,0x02,},"\x3f\xda\xa1\x5c\x46\xf2\x51\x43\xdb\x97\x20\x79\xd7\x01\x3c\x7f\x69\xa1\x36\xf4\x5f\x3f\x6b\xa2\xce\xd8\xb8\x28\x46\x8e\xb3\xda\xa6\xb5\x0b\x4f\x8d\x33\x80\xfe\xc6\x4a\x03\x43\xbe\x11\x6f\x6f\x83\xb6\xee\x64\xcc\x4c\x1b\x1d\x08\xd5\x4f\xd4\x20\x29\xe4\x28\x5c\xfc\x6c\x6d\xd5\xcd\x18\x1a\xb5\x33\xff\xcd\x41\x1f\x23\xa1\x00\x3d\xa9\x4e\xc9\x34\x0e\x2e\xc7\x11\x99\xd6\x78\x54\x0d\x51\x82\xe1\x39\xff\xcb\xc5\x05\xa1\x70\xb8\xf0\x7f\x4a\x7e\x69\x4c\xa9\x2f\x58\x32\x0c\x0a\x07\x85\x64\xce\x9d\xe9\x9b\x0f\xa8\xe6\x6b\x0d\x82\x2e\x46\x7a\x5a\xeb\x83\x56\x79\x96\xa4\x8b\x89\xdb\x25\xca\xde\x64\x57\x79\x4e\x54\x14\xd6\x7e\x9d\x4a\xb7\xcd\x6c\xc2\x05\x8b\xb7\xa5\x13\xab\xd7\x09\xf4\xca\xf2\x4b\xb6\x7c\xe1\xc0\x3a\xb6\x2d\xbd\xfe\x30\x9e\xc7\xdb\x0f\xa3\xea\x7a\xae\x82\x36\xf2\x59\xb9\x22\xd4\x53\x61\x15\xa6\x3b\xc8\x9a\xcb\x20\x51\xd0\x9e\x73\x1c\xbb\x0d\xf1\x57\xd9\xd3\x45\xbd\x91\x09\x97\x3c\x2b\x59\x4f\x14\x8e\xfc\x6f\x33\x77\xde\x51\x63\xb7\xf6\x98\x69\xff\xef\x85\x3e\xae\xfe\xb4\x02\xe2\x35\x29\x59\x4f\xbd\x65\xca\x05\xfe\x40\x62\xc5\x29\xd8\xe3\x21\xab\xc0\x52\x00\xca\xc1\xe8\x39\xe8\x7b\x1f\xd3\xfd\xf0\x21\xd6\x8c\xbb\x3a\x41\x42\xb6\x9c\xc3\xaf\x6f\x63\x2e\xdd\x65\xb8\x3f\x5a\xa4\xcb\x17\xda\x5b\x6b\xa3\xfc\x03\xed\xb1\x7c\x2a\x3c\xb5\xb0\x48\x36\xe7\x66\x0e\x63\xc8\xa0\x48\x3e\x24\x39\x83\x37\x1d\xfa\x98\x39\xf9\x16\x4a\xd4\xda\x0d\x59\x53\x65\x5e\x3a\x95\x18\xe1\x36\xda\x74\x57\x37\xc7\x92\x43\xc3\x55\xfc\x12\x5c\xbd\xcc\x76\xae\xc9\x22\x16\x84\x6c\x45\x74\xf4\xf7\xf2\x98\xbc\xde\x54\xfd\x24\x44\xad\x30\x25\x95\x5c\x10\x03\x15\xde\x5a\x4e\x27\xc3\x33\xa0\x02\x84\xb2\xf7\x02\xfd\xd3\xde\x22\xac\x6c\x24\x0d\xbc\x14\xbf\x71\xe6\x2d\x13\x1b\x62\xf2\xdb\x99\x24\x73\xf2\xf9\x13\xf6\x0c\x91\x6e\xcf\x57\xdf\x5f\x3f\x02\x1f\xb3\x30\x83\x43\x95\xb7\x94\x72\xca\xff\x19\xfc\xfa\x0a\x27\x17\x95\xc7\x6d\x69\xb4\xdb\x3f\x85\xb8\xd2\xe5\xc3\x44\x19\x65\x48\x4d\xcc\x39\xab\xa5\x9b\x70\x12\x74\xf7\xfc\x42\x52\x46\x85\x60\x69"}, +{{0x43,0x92,0xf7,0xd4,0xfb,0xd6,0x8f,0xe1,0x54,0xe4,0xba,0x38,0xad,0x52,0x07,0x61,0x2a,0x06,0x48,0x55,0x60,0x56,0xc3,0x9a,0xc1,0x16,0xad,0x46,0x8f,0x89,0xbd,0x2d,},{0xcb,0xea,0xef,0x41,0xac,0xac,0x02,0xbf,0x1f,0x78,0x0c,0xe9,0x34,0xaa,0xbd,0x63,0x13,0x64,0xb3,0x69,0x56,0x7b,0xe1,0xbe,0x28,0xe3,0x90,0x6f,0x9d,0xb1,0x20,0xfa,},{0x86,0xe7,0xcc,0xf0,0x6e,0x79,0x36,0x2d,0x40,0xcd,0xb7,0xfb,0x75,0xa9,0x89,0x78,0xbb,0xd3,0x34,0xa1,0xdb,0x75,0x90,0x36,0x7d,0x60,0x84,0x9b,0xd5,0x3e,0x2f,0xb1,0xa4,0xbd,0xae,0x59,0x0d,0x1f,0x47,0xb5,0x49,0x0d,0x87,0x02,0xe7,0xc1,0xa8,0x72,0x68,0xb8,0xee,0x9d,0xb6,0x12,0xde,0x7b,0xdc,0x2e,0x38,0xfa,0x6d,0xeb,0x7e,0x05,},"\xcf\x17\x09\xdc\x9a\x08\x67\xee\x90\x87\x21\xb1\x36\xcb\x93\xa8\x42\x29\xe8\x3b\x46\x20\x47\x77\xca\x81\x94\xd0\x8b\x7a\x3c\xa9\xc9\x12\xeb\x24\x3e\x5b\xda\xbf\xee\xd3\x52\x34\x9d\x20\xbe\x80\x1b\x72\x2a\xf0\x89\x22\x38\xe7\x2e\xdf\x19\x0e\x63\x61\xf5\x75\x72\x78\x1a\xd3\xc2\x59\x0b\x19\x73\x57\x64\x1c\x80\x53\x83\xba\xa1\xd4\x97\x2f\x76\xc6\x54\x48\x53\x2c\x11\x08\x34\xa0\xba\xa8\xf4\x88\x63\xe1\x66\xb7\x06\x65\x37\x08\xcd\x40\x57\xd3\xa4\xf9\xfc\xb2\xce\xb4\x12\x00\x01\x27\x7d\x38\xc4\x38\x47\xd8\x22\x82\x2b\x77\x7c\x2b\xb4\xda\x40\x15\xa1\xc2\x4d\x41\x6d\x50\x62\xa8\x71\x84\x91\xd8\x55\xaa\xa5\xdb\xf5\x57\x9c\x16\x4d\x8e\x52\x4a\x9f\x2f\xa3\xf2\x2e\xb0\x98\x61\xff\xe6\xad\x65\x9f\xe3\x6e\xb4\x04\x31\x22\x2c\x22\xd7\x13\x7a\x6c\xab\xca\x8d\xb7\x86\xe3\x9d\x81\xf6\x61\xaf\xde\x4e\x39\x58\x9b\x4d\xb4\xd3\xc5\x1c\xa5\x35\x90\xa1\x4e\x11\x5d\x0a\xfc\x3a\x87\x7b\x83\x9a\x96\x38\xbe\xce\x80\xc3\x2c\x19\xe5\x1b\x75\x32\x02\x48\x45\xf7\x6c\xfe\x9b\xfb\x2a\xc0\x51\x30\xf6\x75\x8b\xf7\xfe\x99\x3a\xa9\x3a\xa2\x72\xe4\xe6\xbd\x0c\x75\xc1\x40\x99\xd4\x3e\x65\x2a\x22\x3e\x5b\xcd\x64\xc3\x62\xd4\xb8\xf4\xb9\x5e\x01\x6f\x93\x50\xc7\xfa\x74\xe6\x53\x52\x5d\x08\x01\x15\x58\xb2\xc6\xe9\xbf\x4f\xdf\x9d\xbd\x5e\xf9\xb0\x9b\xbc\x84\x6a\xfc\x2b\xcb\xc8\x6c\x4c\xcc\x31\x5f\x6d\x1c\xcd\x48\x9b\x0c\xf8\xed\x0d\x93\xf2\xf5\x32\xa4\x26\x26\x5c\x59\x0b\xa3\xa5\x90\x23\x34\x7d\x81\x9d\x9b\x28\x1e\xf8\x53\x10\xb0\x53\x16\xd4\x6c\x8a\x8c\x03\x65\xd0\x68\xa8\x70\x86\x64\xea\x4d\x77\xac\x0c\xd1\x50\xa6\x5a\x56\x58\x6b\xab\xd3\x4b\x74\x36\x5b\xb8\xfe\x3e\x61\x87\x26\x22\x84\xd6\x44\x32\xe4\xc8\x1e\xa4\xc0\xe5\x7c\x1d\x71\xae\x98\x0c\x7f\x4d\x1d\x87\x10\x32\xe1\x88\xbb\xf9\xd1\x75\x8c\xdc\x1d\xff\x98\x9f\x2d\x12\x88\xfe\xf4\xe2\x05\xe9\x9e\x7c\xbf\x2c\xc3\x24\xb8\xc9\x30\x46\xf4\x76\xc5\x9d\x3d\x0a\x59\xdb\x6f\xe3\x73\x82\xdc\x79\xc5\xec\x16\x05\x6a\xb3\x93\x4a\x52\xf7\xd2\x88\x0d\x04\x71\xa3\x77\xb6\xa8\xae\x84\xd5\x6a\xc2\x2d\x1d\x54\x55\x1c"}, +{{0x0b,0xea,0x98,0xab,0xe7,0xd6,0x3f,0x15,0x83,0x90,0xee,0x66,0x8a,0xa0,0x50,0xe8,0x4a,0x25,0xd2,0x89,0x3e,0x49,0xfc,0x83,0xf0,0x79,0xf9,0xbb,0xa6,0xa5,0x5a,0x75,},{0x22,0x19,0x2e,0xc0,0xd3,0x2e,0xf9,0x83,0x56,0x65,0xa6,0x1b,0xc8,0x8b,0xcf,0x4e,0x16,0x04,0x63,0x79,0x21,0x15,0x2c,0x11,0x6a,0xf5,0x03,0x36,0x5b,0xf6,0xbe,0x42,},{0x7e,0xb3,0x13,0x9b,0x88,0x0f,0xdf,0x66,0x37,0x6a,0x20,0x90,0x81,0x88,0x40,0x04,0x97,0x67,0xc8,0x37,0xf3,0xad,0x00,0x36,0xb1,0x41,0x66,0x70,0x52,0xb3,0x36,0x09,0x81,0x7c,0xa5,0xe2,0x40,0xed,0x8c,0xdf,0x3c,0xcf,0x3a,0xee,0x29,0x27,0x45,0x34,0x59,0x4d,0xb0,0xb4,0xcc,0xc5,0xc6,0xe5,0xbb,0xa3,0x28,0x0b,0x87,0x3f,0x29,0x01,},"\xc1\x78\xe3\x8d\x4e\x83\xed\x2b\xe5\x7c\xe1\xc3\xab\x64\x25\x3a\x81\x71\xe6\x10\x00\x81\x81\xfb\xfc\x6d\x75\x22\x69\xf7\xf1\xc5\xa9\xec\x62\xcb\x27\xf1\x9a\xd9\x9c\xe1\xf5\x11\x6a\x36\x3d\x96\xfd\xc5\xa4\x2f\x35\x8b\x6d\xbe\x7c\xab\xdf\xc9\xf6\x07\x18\xe4\x01\x2c\x1b\xb1\xf8\x42\xc5\x56\x08\x11\xba\x83\x74\xa0\x63\x77\x47\xff\x92\xea\xc2\x1c\xa6\x5d\xde\xaf\x43\xe9\x98\x9b\x7d\xe2\xd4\x32\x52\x0a\xfe\xe3\x64\xec\xfb\xa4\xda\x66\x9a\xd4\x89\x3d\x0b\xf6\x9f\x9f\x81\xe7\xdf\x69\x65\x7b\xe2\x2b\x92\x06\x97\x45\xf2\x16\xc2\x42\xcc\xd4\x6d\x02\xd3\x56\x16\xe1\x6c\x75\x5e\x0e\x37\xf9\x61\xa6\xf3\x63\x77\x52\x53\x4f\x6d\xfa\xb8\x80\x5a\xb7\x59\xa0\x32\xa4\xe7\xe4\xc8\x19\x53\x32\x5a\x2f\x68\x6b\xb6\x9a\x02\x9c\xe4\xe0\x3b\xec\xb3\x60\x56\x37\xc5\xa6\x5b\x52\xe3\x31\xc2\x6c\x92\x6e\xd4\x71\x1a\x50\x4d\x37\x33\xbb\x53\xc9\x7b\x80\xea\xfe\x4e\x75\xdd\xd9\xf4\x15\x36\x28\x88\xc3\xd4\xd3\x7b\xae\x0e\x63\xfa\x11\xbf\x75\x56\x66\x43\x7d\x72\xf5\x8c\x91\xd7\xa2\xf8\xcb\x61\x9b\x76\x20\xa0\x70\xb2\x6b\x18\xb4\xd5\x01\x84\xc5\x81\x87\x12\x11\x0e\x36\xd3\xe2\x83\x0f\x6a\x85\x76\xba\x57\xf9\xcc\xcb\x8f\xff\x40\x28\xbf\x8e\xf9\xcb\x81\x48\x25\xbb\xca\x82\x7d\x64\x95\x47\xbf\x6f\x2b\xef\x93\x17\x04\xca\x7f\x6d\xf1\x5f\x78\x01\x55\xed\x46\xea\xa7\xca\x7d\x72\xe2\x24\x34\xca\x04\x83\xbf\xb2\xf7\x90\x2d\xc7\x87\xf6\x17\xeb\x9b\xd4\x1e\xd4\x52\x0a\xdf\xd4\x30\x94\x8c\x71\x08\x05\xa7\x3c\x1b\xa5\x49\x2e\x96\x48\x4c\x4b\xaa\x7d\xa2\x4c\x74\x35\xc4\x6a\x05\x2b\xf3\x51\x5d\x33\xe4\x2d\xce\xf5\x17\xca\xa4\x5f\x36\xc8\x79\x12\x10\x78\xc6\x88\xdd\x10\xd7\x66\x56\xa1\x19\x76\x2b\x6a\x83\x41\x36\xfa\x1f\x8a\x64\x32\x24\xb9\x22\x4c\x54\x3c\xf0\x47\x0b\x3f\x8e\xe0\x17\xd6\x20\xdb\xdc\xc8\x4d\x98\x51\x54\xe9\xd1\xae\x80\xe5\xf1\x43\x87\xb8\x8a\x0f\x6a\x5c\x35\x90\x5a\xa5\x7f\xb3\xab\xeb\x0e\xa6\xec\xcd\xdb\x00\x44\x74\x63\x3c\xc4\x83\xb5\x6b\x8a\x8e\x20\xe8\xf2\xe0\x9e\x97\x9a\xa0\x98\x93\x08\x78\x75\xc6\xb1\x17\xb5\xf1\x38\x47\xad\x8f\xc0\x56\x04\xc4"}, +{{0xc2,0x58,0x78,0xb0,0xd1,0xe0,0x92,0x5c,0x8f,0x5f,0x04,0xa1,0xe5,0x79,0x90,0x80,0x96,0x3c,0x41,0x3a,0x13,0x99,0xc1,0x18,0xaf,0xb1,0x68,0x7c,0x79,0x7f,0x48,0x39,},{0x13,0xac,0x2c,0xad,0x41,0x90,0x8c,0x25,0x5f,0x67,0x1f,0x93,0x93,0x4a,0xe5,0xd7,0xbe,0x32,0x53,0x46,0x72,0x5c,0x8b,0x40,0xdc,0x39,0xea,0x80,0xd7,0x0d,0xdf,0x34,},{0x06,0xf5,0x51,0x98,0xb4,0x19,0x19,0x14,0xb7,0x43,0x06,0xf3,0x8e,0x38,0x13,0x16,0xea,0xc4,0x0b,0x5b,0x5a,0xdb,0x8a,0x31,0x24,0x64,0xf6,0x71,0x75,0xec,0xf6,0x12,0xe0,0x14,0x7b,0x1c,0xef,0x46,0xc2,0x51,0x87,0x50,0xa5,0x60,0x6b,0xb0,0x3b,0xc6,0x46,0x7b,0xb9,0x32,0x15,0x14,0xf6,0x9d,0xcb,0xeb,0xce,0x8f,0x69,0x05,0x80,0x02,},"\x68\x56\xcc\x71\x44\xb6\xbd\xdc\xc4\xb5\x89\x54\xd1\xa2\xe7\x10\x1d\x65\x84\xb5\xd5\xe7\x19\xa0\xae\xa0\xfb\xbd\xf2\x21\xc2\xa2\xaa\xcb\xac\xdc\x40\x20\xc5\xc8\xce\x68\x1f\xf7\x38\x1a\xcd\x60\x7b\x0f\x52\x39\x69\x23\x35\x70\x06\x55\xbe\x2d\x94\xc5\x3d\x7b\x51\x48\xe9\x2a\x2b\xc1\x63\x38\xc2\xf4\xc1\xa7\xd1\xc5\x95\xaf\x62\x2c\x24\x0c\xe5\x79\xa5\xe0\xf5\xb6\x51\xbf\x56\x25\x18\xce\xc8\xaa\x2c\xe4\xb4\xaa\xdb\x1f\x2f\xda\x6c\xf6\x29\x5b\xc3\x78\x03\xb5\x37\x7d\xab\x65\xc9\xb9\xa2\x94\x9f\xdd\x49\xbf\x9d\xdc\x8f\x96\xd2\x60\xff\x95\x1b\xf8\xe8\xcc\xf9\x82\x7e\x68\x69\xc4\x4b\xfd\x97\x33\x58\xce\xfd\xb0\x10\xdb\x5e\x1f\xe5\xdb\xd9\xf5\xd2\xb2\xca\x39\x3c\x17\xd4\x46\xf6\x37\x05\x9e\x69\x2d\x7a\x91\xaa\xdc\xc7\x68\x9f\x5f\x9e\x1b\x30\x52\x17\x5d\x9b\x6b\x20\x8f\x90\x26\x78\x7f\xdb\x66\x78\x3f\x45\x37\x2a\x24\x94\x6b\x1b\xd1\x68\x7b\xf0\xcf\xcc\x81\x74\xeb\xe4\xd3\x2e\x43\x28\x4f\xc7\x8d\x78\x44\xde\x0f\xa2\x2e\x20\x65\xe0\x75\x28\xba\xab\xaf\x01\x5c\xb3\x4d\x62\x9c\x35\x96\xad\x04\x0d\xe3\x1c\x56\x20\xeb\x26\x6d\xef\xa7\x53\x3a\xc0\x40\x19\x98\xe5\x67\x3a\x75\x43\x65\x04\x7d\xeb\xfc\xf7\xe1\x37\xa2\x0d\x16\xcd\xd6\xa5\x52\x19\x82\xf4\x44\xcf\xc3\x42\x93\x97\xc6\x41\xbd\x7e\x74\xa7\x70\xbb\x11\xfc\xb2\x94\x83\xe3\x37\xba\xe5\x16\x9e\xe8\x2d\xa9\xa9\x1a\xdf\x3a\xf6\x7c\xd8\x14\xc2\x82\x5d\x29\x01\x8e\xf0\x35\xea\x86\xf8\xde\x4c\x75\x63\xaa\xf6\x6e\x0c\x75\xd1\x7c\xa6\x8f\x49\xf0\x75\x8e\xc2\xd9\xc5\x17\x9d\x01\xaa\xed\x7d\x45\x15\xe9\x1a\x22\x2b\x0b\x06\xfb\xde\x4f\x07\xa7\xd9\xdf\x2d\xe3\xbc\xae\x37\xca\x2c\x84\x60\xc2\xa6\xb3\x74\x9e\x9b\xda\x36\xd0\x8e\x66\xbc\xc3\x56\xb3\x90\x43\x4b\x4a\x18\xcf\xa4\x5a\xf5\x57\xdc\xa3\xd8\x57\xff\x3a\xd3\x47\xcf\xb0\x7e\x23\x58\xc2\xac\xfd\x5c\xd5\x3b\x3b\x0e\xa2\xa4\x1e\xe5\xc0\x80\x2f\xd4\x73\xdb\x5f\x30\x52\x63\x34\xda\x41\xeb\x4b\xc7\x51\x83\x83\x89\x8a\x0b\x75\x07\xad\x4c\xa2\x89\xd6\x6c\x5e\x2e\xb7\x5c\xf2\x55\xdf\xf3\x12\xcb\x1e\x04\xee\xbe\xb4\x7f\x29\x30\xb9\x0d\x5e\x00\x2e\xb0"}, +{{0x0b,0x2e,0xc6,0x27,0x63,0xf6,0x87,0x59,0x31,0x35,0xda,0x19,0x61,0xef,0x29,0xa2,0x88,0x08,0x96,0x96,0xd9,0x44,0xb2,0x65,0xa5,0xf9,0x68,0x93,0xcd,0x2d,0x82,0x25,},{0xc1,0xe2,0x34,0xfa,0x8b,0xc9,0x6d,0x26,0x8e,0x7a,0xad,0x02,0x8b,0x03,0xf0,0xa9,0x11,0xb6,0x97,0x71,0x5d,0xb3,0xa2,0x1c,0x2f,0xc7,0xdf,0x48,0xec,0xda,0x88,0x75,},{0xff,0x70,0x1f,0x34,0xb3,0x59,0x4d,0xe3,0xb8,0x00,0x45,0xf4,0x29,0xe5,0xe3,0x2d,0xd8,0x8d,0x60,0x51,0xd4,0x19,0x5f,0x16,0x85,0xbe,0x78,0x37,0x66,0xe8,0x01,0x19,0x36,0x8f,0x56,0xb3,0x74,0x97,0x25,0xb9,0x13,0xf1,0x22,0x3f,0x87,0xfb,0x0f,0xb2,0x4d,0x9d,0xfa,0x08,0x41,0xd6,0xa0,0xe2,0xeb,0x1f,0xdd,0xf7,0x75,0xc2,0xd2,0x05,},"\xa8\x34\x34\xc6\x86\x93\xd5\xfc\xed\x91\xbd\xa1\x02\x13\xfc\xd5\x0c\x48\x92\x0b\x90\xce\xe9\xb7\x3a\x9c\x61\x08\x1a\x09\x74\x93\x3f\x4f\xdb\x0a\x67\xe6\x71\xf8\x35\x1b\x0e\xd5\xec\x0f\xe7\xb5\xfb\x0c\x87\x58\x6f\xe5\x82\xff\xb1\xbf\xa2\xdb\x5f\xce\xdd\x33\x02\x42\x82\x34\xb2\xbb\x0e\x72\x6d\xed\xf4\x5b\x13\xa7\x0c\xd3\x5a\xb3\xe2\x99\xd1\x3f\x34\x50\x35\x08\x27\x8c\x44\x58\xee\xa5\xb7\x35\x1b\x05\x83\x6b\xda\xd5\xb0\x5f\x60\xe4\x45\xfc\x65\x73\x7a\xe2\x7d\x2e\x52\xdf\x9c\x39\xe5\xda\x02\x86\x39\x2d\x08\xff\xf7\xec\xb7\x06\x68\x20\xfc\x90\xfc\x8a\x44\xd5\x61\x65\x61\xc5\x0b\x52\x71\x47\x02\x30\x2b\xca\x58\x74\xde\x85\xdb\xa0\x45\x04\x5f\x9f\x0e\x60\x4e\xb8\x6d\x6d\x7f\xbd\x77\x5f\x72\xea\x49\x3b\x2c\x4e\xf7\xc3\xbe\x16\xdb\x2c\xa7\xe4\xd8\xbd\x79\xeb\x20\xcf\xb5\xf0\xf6\xf0\x53\x36\xb7\x5c\xc8\x6d\x21\x9f\x3b\x8f\x2e\x91\xba\x7d\x52\xb6\x4f\xdd\x6a\x66\x64\xf0\x4f\x2f\xba\xb7\x58\xcd\xf9\x84\x16\x86\x91\xc3\x2f\x53\xe8\x61\x6b\x49\xf7\x6a\xb7\xb1\x92\xb9\x00\x90\x30\x82\xcc\x89\x65\x6a\x97\x05\x80\x4c\xc9\xb9\x28\x8a\x3e\x42\x17\x09\x84\xf8\xdc\x45\x4e\x08\x64\xb9\x34\x16\x72\x68\x6a\x17\x8c\x06\x00\x50\x17\x8a\x36\xc6\xd9\x06\xb2\xce\x07\x0d\x8f\xaa\xac\xd9\xa5\x8c\x79\x4a\x5e\xa4\x10\x8b\x4a\x48\x5c\x65\x81\x1c\x2d\xca\x2e\xe7\xbb\x10\xbf\xff\xf7\x5d\x45\x86\xb9\x90\xf4\x37\x63\xa1\x6f\xbc\x0b\x48\xae\x1f\xaf\xb0\x8a\x9a\x36\xfa\x43\x26\x84\x5d\xba\x5b\xa2\xfb\xd3\x2b\xbf\x66\x50\x5c\x5e\x86\x57\xed\x01\x07\xe3\xe1\x61\x44\xef\x31\xfa\x6a\xae\x72\xe7\x74\x09\x74\x83\xf5\x48\x0a\xa4\x55\x40\x56\x8f\xd0\x8c\xba\x0d\x57\x77\x68\x00\x4f\x58\xae\x9b\x95\xbe\x37\x4e\xd7\xf0\x29\x9f\xe7\x21\x27\x5e\x47\x6e\x0b\x9a\xb7\x2d\xc0\x6e\xa3\x28\x38\x4e\x39\xbf\x3a\xc3\x31\xc6\x25\x48\x43\x12\xcd\x9b\x06\xb1\x5a\x29\x54\xd3\x3e\x7a\xab\xa6\xbe\x22\x61\x88\x6c\xa8\x11\xdb\x96\xb1\x14\x3d\x06\xdd\x6e\x0f\x3c\xba\x7a\x1a\xe9\xb9\x4e\xaf\x67\x77\x1b\xb2\xd2\x4e\x2f\x94\xde\x9c\x47\x0f\xcd\xe7\xbf\xdb\x32\xf4\x10\x19\x8b\x5a\xa9\x69\x8e\x32"}, +{{0x89,0x60,0xd7,0xbe,0xe8,0xc6,0xb3,0x9c,0xa5,0x93,0x4d,0x7c,0xdd,0xd1,0x6f,0x16,0xb3,0x66,0x3e,0x6e,0x03,0xe8,0x33,0xc0,0x57,0xe2,0x18,0x1e,0x45,0x97,0xcb,0x68,},{0x43,0x40,0x90,0x95,0xd4,0xf5,0x0f,0x5e,0xdd,0xbd,0x5c,0xd4,0xd2,0x01,0x22,0x98,0xcb,0x41,0xa4,0x0e,0x99,0x49,0x2d,0x5a,0x2d,0xb0,0x8b,0xe5,0x37,0x7e,0xa1,0x83,},{0x72,0x13,0xdd,0x4a,0x79,0xfd,0x54,0xde,0xc0,0xc5,0x48,0xef,0x42,0xe6,0xca,0xe0,0x15,0xbe,0x77,0x80,0x2b,0xf5,0x15,0xcd,0x25,0x82,0x76,0x8f,0x72,0xf5,0x63,0xeb,0xb2,0xda,0x36,0xaf,0x4a,0xae,0xac,0x56,0xbb,0xff,0xc9,0x93,0x2c,0x2e,0x24,0xec,0x95,0xda,0xff,0x00,0xa5,0xf7,0xa0,0xac,0xab,0x9c,0x8b,0xd3,0xc2,0x3b,0xb4,0x0c,},"\x30\x8d\x84\xc7\xa5\xf7\x86\xe5\x63\xe5\xc1\xea\x57\xaa\xb5\xe5\x55\xc0\x09\x97\x74\x9d\x15\xae\xe3\x54\x39\xef\xa6\x45\xda\x2c\x39\x67\x70\x31\x15\xc6\xc6\x3e\xd7\xf9\x47\x85\xc5\x47\x8f\x38\x46\x7b\x86\xe7\x62\x6e\x8f\xff\xa4\xd5\x1a\x2d\xc4\x5e\x6d\xf2\xa3\x5c\xec\x99\x55\x5e\xab\xc9\xf7\xa9\x3e\x2e\x2b\x68\x94\x59\xb4\xe0\xc9\x2b\x35\x15\x62\xc4\x17\xb1\x99\x71\x13\x75\x4e\xa5\x9e\x4a\x91\x51\x07\x28\xff\x30\x71\xa2\xbb\xd1\xf4\x65\xa6\x87\xf6\x7d\xae\x95\x56\x15\x03\x1a\x8a\xd5\x51\xfe\x73\x8a\x26\x0b\xbc\x44\x6b\x48\xdc\xa1\xd9\x79\x05\x1a\xb5\x84\x08\x32\xe1\x9d\x47\x3b\x66\x62\x17\xa9\x18\x39\x80\xd6\xb2\x7e\x3d\x3c\x76\xd9\x36\x65\xba\x23\x93\xe6\xab\x1a\x42\xc3\x90\x4d\x40\x25\x93\x2d\x60\x1a\x20\x2a\x59\xa4\xc4\x9f\xdb\x77\xf0\xe0\x28\x68\x24\x7d\xe5\xaf\xdf\xaa\x1b\x89\x42\x08\xac\x00\xd7\x7c\x6b\xb5\x4c\x6b\x2a\x73\xa4\x76\x57\xe4\x4c\x85\x13\x79\x63\xb5\x75\x21\xaf\x20\x97\x62\x48\xeb\x26\x14\x82\x14\x7c\xdf\x7a\x14\x5c\x36\x43\xe2\x9e\x05\x88\xbf\xda\xe6\xa0\x82\x90\x48\x53\xce\x5a\x10\xd2\x49\x70\xeb\xdf\xb7\xf5\x9d\x5e\xfd\xd6\xa5\xe7\xe0\xd2\x87\x97\x1c\x84\x6a\xcd\x54\xd8\x4d\xd4\x54\x68\xa4\x11\x0b\xab\x6e\xf8\xd9\xa5\xb4\xb2\x42\x67\x88\x90\x0b\x7e\x1a\xdf\xe0\x62\x43\x44\xf9\x8f\xe5\x9e\xf8\xa1\xe6\xc4\x05\xb3\x44\xeb\x97\xbb\x20\x47\x73\x74\x4b\x6a\x2d\x8c\x6e\x65\xd1\x7c\xea\x07\xde\x03\xb7\xf0\xfe\x49\xf1\xa5\x5c\x33\xd5\xf1\x5c\xe5\x5d\xf7\xc9\x56\x1b\x25\x1c\x6a\xc8\x07\xa9\x25\x53\xe1\xce\x91\x70\x12\xdc\xcf\xd6\x9e\x7d\xbd\x03\x8c\x7e\xee\xca\xe9\x86\x23\xf1\x8f\xbb\x65\x0e\x22\x18\xa0\xbc\x0f\xff\x43\xa7\x5a\x11\x64\x48\xbb\x73\x62\xf5\x27\xee\x6b\xc8\xe1\x07\x61\xcc\xcf\x9b\xcf\xc0\xd0\x00\xf2\x12\x7b\x4c\xc1\x92\x11\xd0\x95\xa0\xbd\xaa\x4e\x4b\xe4\x51\x9e\x6c\x84\x45\xea\xb9\xb3\x14\x4a\x45\xca\xb9\x99\x61\x35\xbf\x7f\x75\xa7\x8d\x22\x27\x59\x00\xf4\xce\x1f\x0a\x9e\xac\x13\x63\x64\x10\x30\x62\x89\x3d\xad\x43\x90\x42\x2b\x77\xe5\xf5\xd1\xd9\x4d\x70\x29\xc6\x09\x7b\x35\xca\x64\xa7\xa4\x76\xfc\xc7"}, +{{0xef,0x6b,0x9b,0x51,0xfd,0x4f,0x85,0x86,0xca,0x62,0x65,0x8e,0x04,0x2f,0xc0,0x9a,0x83,0xb9,0x43,0x03,0x35,0x26,0xff,0xc3,0x26,0xc6,0x5e,0xb3,0xa5,0xfb,0x59,0x4b,},{0x1d,0x6e,0xec,0xe8,0x05,0xe0,0x88,0x78,0x21,0x87,0x6b,0x7e,0xd6,0xed,0x5b,0x07,0x14,0xd6,0x46,0xfb,0xec,0xda,0x38,0x76,0x4f,0x94,0xc8,0x15,0x5e,0x61,0xd0,0x04,},{0x71,0xd1,0x71,0x07,0x1c,0xd0,0xfe,0xa1,0xc6,0xa9,0xcf,0xad,0x1f,0x7f,0xd8,0x35,0xe8,0x5f,0xf9,0x06,0x77,0x8b,0xc6,0x34,0x5a,0x4d,0xec,0x43,0x13,0xec,0xc2,0xbf,0xf7,0x55,0xa7,0x17,0xeb,0xd9,0x12,0xa5,0xe0,0x28,0x40,0xac,0x07,0x38,0x42,0xf9,0xbf,0xca,0xa5,0x89,0x13,0xe2,0x60,0xe3,0xc7,0x33,0x93,0xd3,0x66,0x85,0xc7,0x0e,},"\xa8\xf3\xf1\x96\x65\xde\x23\x90\xd5\xcc\x52\xb0\x64\xb4\x85\x12\x73\x67\x74\x86\xd8\xf5\x56\x3b\xb7\xc9\x5f\xa9\x4d\xb3\x35\x61\x61\xee\x62\x22\x21\xf1\x0c\xbb\x1f\xa1\x95\xaa\xc7\x23\x1e\xa7\x16\xd7\x4b\x46\xb3\x7b\xc8\x5a\x70\xdb\xa3\xdf\xaa\x16\x75\x21\x7b\x35\x11\x99\xe7\x4a\x97\x10\x28\xf7\x29\xb7\xae\x2b\x74\xae\x8c\x6b\x3a\x06\x79\xc3\xe3\x29\x68\x02\x84\x4a\xd5\xbb\xa3\x43\xf6\xf9\xf7\xc4\x66\x1b\x4a\x29\xb4\x4f\x17\xe8\x9e\x11\x4f\xb2\x20\xe9\x84\xcd\x98\x0e\x94\xc3\xd2\xbf\x98\x73\xe0\x60\x5c\x92\x30\x17\x44\xa3\x03\x5e\xf0\x46\xba\xd2\x66\x6b\x5c\x63\xeb\xec\xf9\x3c\xc1\x40\x29\x19\x46\xc0\xfa\x17\x03\x40\xce\x39\x50\x92\xde\xed\x79\x84\x13\x52\xfb\xfe\xe0\x3a\x92\x7e\xb4\x58\xf2\xa6\x33\xed\x32\x71\x65\x2f\x5b\x0f\x99\x60\xcd\xf9\x01\x5d\x56\xfd\xab\xd8\x9e\xe7\x1e\x25\x9a\xf6\xeb\x51\x4b\x4c\x1b\xd4\xa6\x66\xf5\xb5\xa3\x5c\x90\xf3\x5b\x14\x94\x57\xaf\x29\x44\xdd\x0a\xa8\xd9\xb5\x42\x28\x3a\x7e\x54\x12\xb7\x75\xe4\x21\xd2\x12\x6f\x89\xbe\xbc\x3c\xa3\x7f\x73\x07\x16\x21\xf1\x32\x1e\xee\x52\xe9\x69\x04\x86\xa3\x3c\xd7\xff\x9c\x99\x67\xfb\x65\xee\x4e\x90\x7b\x6b\x85\x22\x11\x47\x3d\x21\xe9\xd9\x1a\x93\x36\x2a\xc7\x61\x76\x0e\x8c\x7b\xbe\xa4\x86\xc3\xd6\x05\xf9\xe1\x1b\x86\x13\x68\x19\xa7\xab\x3f\x32\xf1\x3f\xfc\xa1\x68\x17\xfe\xd1\x97\xff\x88\x0b\x4d\x6d\x9a\x80\x8f\x7f\x87\x87\x63\xa0\x45\x72\x8d\xf7\x2f\xaa\xa9\x63\xe4\xcb\x1c\x09\xcc\x2b\x2d\xa9\x20\x28\x0c\x83\x66\xb7\xd1\x8b\xf8\x97\x2d\xf1\x6c\xc2\x34\x48\xfb\xe6\xb2\xe6\xe1\x6c\xbb\xf0\x74\x51\x29\x85\x40\x53\x18\x96\x37\xce\x11\x5d\x23\x98\x43\x3c\x15\xd6\xf1\x16\xa2\x05\x33\x48\x24\xaf\x28\x2f\xa7\x58\x49\x4c\x47\x86\x8e\xa8\xf4\xdf\xad\xc7\x05\xe8\x61\xaa\xd2\xeb\x8e\xf3\xdb\xbe\xd2\xa4\x56\x9e\x15\x83\x4a\x76\x0c\xce\x0c\xbb\xc8\x4b\x28\x9e\x77\x9b\x98\x83\x46\xb9\x06\x9c\x74\x4c\x97\xab\x2b\xf4\x2b\x08\x6d\x2f\xb0\xa4\x11\xf5\xce\x99\xf0\x81\x9a\x30\x86\xb4\xfe\x9d\x96\xc7\xc9\x90\x8d\xce\x28\xdf\x1d\xdd\x30\xf3\x50\x1d\xda\xf7\x81\x10\x73\x4f\x9d\xcd\xfe\xc3"}, +{{0xba,0xd4,0x7c,0xd4,0xbd,0x89,0x84,0x90,0x67,0xcc,0xe1,0xe6,0x3c,0x3d,0x91,0xe9,0xb7,0x87,0xae,0xa8,0x58,0x4e,0xdb,0x07,0xf3,0x45,0x1e,0xf6,0x7e,0x7b,0xd7,0x9b,},{0xab,0x0c,0xe9,0xba,0x1d,0x29,0xbd,0xfb,0x85,0xa0,0xe6,0x6b,0x76,0xb5,0xe2,0xe0,0x5f,0xf7,0x32,0x56,0x9e,0x43,0x75,0xcc,0xd7,0x50,0x98,0xe9,0xe7,0x1d,0x17,0xbf,},{0xe5,0x72,0x4a,0x1d,0xd4,0x63,0xa9,0x7d,0x12,0x22,0xc5,0x18,0xc4,0x92,0x5d,0x32,0x22,0x02,0xd1,0x0f,0x04,0xcd,0x07,0x8e,0x77,0x1e,0x0f,0xb3,0x95,0x1d,0xbc,0x14,0x93,0xa2,0x34,0x46,0x07,0x54,0xc3,0xaa,0xe3,0xdf,0x93,0x00,0x8d,0xbb,0xfb,0x31,0x0c,0x99,0x59,0x2b,0xed,0xe7,0x35,0xa4,0xae,0xab,0x03,0x23,0xa1,0x21,0x0d,0x0e,},"\xb5\xa6\x1e\x19\xe4\x86\x3e\x0b\xb5\xf3\xfa\xb6\xc4\x97\x0d\x87\x85\x96\x89\x55\x21\xfa\x1e\x7f\x67\x8c\xaf\xa2\xde\x53\x32\x2f\xd4\x58\xa9\x8a\xa6\xe3\x58\x05\x42\x9f\x65\x12\x91\xb9\x5b\xd9\x95\x0e\x15\x5f\x3a\xda\x0b\x60\x91\x59\xa4\xab\xda\x59\x90\xc0\x4b\xc2\xe7\x64\x42\x2f\xb4\x9e\xf4\x2f\x12\x52\x9f\xf6\xf6\xa8\x20\x29\xff\x01\x85\x66\x2e\x65\x8f\x83\xc5\x46\xee\xd0\x9f\x06\xb5\xa6\x8e\x85\x7c\xda\xd0\xeb\x9e\xc4\xee\xcb\xfd\x88\xf3\x4b\xc8\x09\x90\xf8\x64\x4a\x9b\xfd\xde\x1d\x9f\x3a\x90\xd5\x57\xa8\xb8\x28\xd5\xce\x06\xa6\x4e\x3b\x23\x85\x82\xbb\x4c\xbe\xba\x30\xed\xc4\x9e\x81\x22\xc5\x5e\x95\xba\xdc\xf5\x02\xcc\x56\x78\x69\xc0\x9e\x9f\x46\xc6\xff\x3f\x68\x78\x98\x6b\x1d\xe0\x0b\x72\xa1\x85\x80\x46\xfc\xd3\xa6\xe9\xcd\xaf\x5b\x07\x3c\x56\xf2\x02\x50\x63\xa2\xd1\x78\xbd\x4c\x1e\x8c\xbc\x1e\x6e\x67\x1a\xa9\x7f\xb2\xcb\x4c\xc8\xa6\x2c\x20\xbe\x41\xc7\x76\x37\x2c\x8e\x7b\xe6\x3b\x48\x2e\x6c\x63\xfa\x85\xd7\xcf\xfb\xc1\xb2\x82\x0b\xae\x1f\xc1\x28\x34\x3a\x1e\x20\xfc\xf1\xbc\x35\x02\xee\xe8\x13\x58\xcc\x9a\x74\xc7\x2a\xf6\x35\x30\xf9\x6a\x25\xa6\x04\x64\x8f\xf5\x70\xdf\x1e\xb8\x9d\x1f\xdd\xba\xb2\x86\x79\xba\x2e\x9b\x41\x97\x7e\x9a\x9c\x1c\xae\xcd\xbf\xc3\x61\xa1\xdd\x05\x5e\xc5\x16\x20\xa9\xbb\xdb\xba\xf7\x18\xc9\xcc\x13\x6d\x20\x07\x71\x03\x99\x53\x6d\x13\x33\x24\x85\xec\x38\x87\x97\x85\xe0\xc9\xce\x99\x15\xa8\x02\x51\x37\x39\x90\xa5\x9b\xce\x44\x03\x26\x03\x1a\xb1\xb4\x58\xbf\xa5\xb8\xa4\x79\x3d\xa4\xee\x11\xab\x7a\xf2\x0d\xe2\xa1\x18\xc9\xae\x52\x1a\x41\x7b\x68\x20\x7f\xc8\x85\xe1\x09\xd8\x46\x3e\x9f\x02\x27\x87\xcc\x73\x0d\xb0\xb1\xfa\xae\xd2\x57\xbe\xd9\x01\x71\x08\x85\xb7\x4e\x99\x4f\x54\xf6\xf2\xae\xb6\x4f\x0f\x60\xb5\x9e\xfb\xf2\xe3\xbb\x65\x15\x42\x46\x03\xa1\x13\xc0\xb8\xa3\x1b\xa3\xc1\xe9\xa9\xb8\x11\x8c\x87\xec\x69\x49\xb7\x5f\x49\x62\x7e\xa7\xb1\x32\x88\x89\x39\x11\x04\xd4\xf4\xa3\x89\x2c\xf0\x0f\x26\xa7\x3c\xda\x2a\x40\xf9\xb7\x15\x7a\xfc\x40\x66\x7f\x4a\x04\xf6\x47\xdb\xf9\x39\x06\xb8\x4c\x9a\x35\x16\x4e\x1b\xc9\x02"}, +{{0xca,0xba,0x8e,0x05,0x33,0x11,0x3a,0x4b,0xe1,0x73,0x40,0x8b,0xa8,0x3c,0x0d,0xb7,0x42,0x60,0x80,0x2f,0x91,0x86,0xc3,0x91,0x40,0x26,0x55,0xac,0xde,0x60,0x15,0xcb,},{0x2d,0x7b,0xef,0x61,0x64,0xc2,0x79,0xfa,0x10,0x28,0xa9,0x78,0x8e,0x3e,0x8e,0xe8,0xac,0x15,0xed,0xcf,0x92,0xa5,0x85,0x50,0x62,0x95,0x23,0x10,0xb4,0x68,0x45,0x47,},{0xec,0x35,0xec,0x32,0xc8,0xa4,0x00,0x88,0x27,0xe1,0x78,0x49,0x2b,0x3b,0x8b,0xee,0x22,0xa4,0x95,0x4f,0xc6,0xb2,0x5f,0x4f,0x22,0x5d,0xd7,0xed,0x23,0x69,0x89,0x00,0xde,0x81,0x56,0x75,0x6a,0x8e,0xdc,0x35,0xc5,0x1d,0x10,0xf8,0x2b,0x83,0x0a,0x2a,0x65,0x96,0x76,0xea,0xc9,0x11,0xf9,0x60,0x24,0x47,0x66,0xe0,0xc3,0xc6,0x07,0x05,},"\x24\x13\xa3\x2b\xca\x5c\xe6\xe2\x30\xe5\x65\xeb\x85\x84\x93\xd5\xd0\x4e\x6d\x2e\x2a\x7a\xb1\xf8\x9a\x3b\x42\x33\x11\x67\x6b\xfa\x93\xc6\x7d\xaa\xfd\x1c\xfc\x71\x09\xe0\x40\xba\xc5\x2c\xbf\xe0\x7c\x28\x28\x0b\xb6\xac\xf6\xe3\xa3\x10\x73\xda\xb2\x96\x53\x78\xdd\x77\xf6\x1f\xe9\x24\x71\x35\xc1\xa6\x31\xb7\x9a\xd6\x68\xc9\xea\x1c\xd4\x11\x2d\x8d\x3a\x06\x4c\xc2\x1d\xf3\x2a\xea\xc7\xdd\x71\x8b\x09\x1f\xb6\x91\x5b\x8b\xc0\x63\xbb\x58\x15\xc3\x76\xe0\x14\x76\x31\x2a\x2e\x54\x33\x41\x7a\x7a\x93\x15\xd6\x59\x99\xb0\x2f\xf4\x64\xa4\x74\xa5\x97\xe5\x39\x88\x77\x36\x70\xec\xa4\x6a\x6e\x26\xcf\x96\xe9\x48\x8e\x9e\x63\x44\xbc\x78\x3d\xdf\xb5\x35\xe7\x6b\xb3\xb9\xa6\x03\xff\x4c\x59\xc7\xdb\xe2\xd8\xb6\x19\x8d\x5b\x24\x49\x0b\x4e\xa9\x6c\x95\x95\x9f\xfb\xf3\xd8\x21\x8e\x76\x0d\xaf\x20\xe0\x1e\x2f\x36\xc8\x4b\xb0\x97\x11\x5a\xbd\xde\xe9\x2b\xed\x82\xd1\x6b\x15\xa9\xe1\x92\xe9\x89\x3a\xc6\x38\x46\x1d\xf5\x07\x20\x7b\x0c\xf5\x95\x88\x4d\x8a\x99\xfb\x9c\x70\x45\xf9\xbf\xf7\xb7\x3f\x00\xca\x3f\xd5\x95\xa5\xce\xc2\x92\xad\xb4\x58\xbd\x94\x63\xbe\x12\x04\xd0\x16\x78\xd2\xf4\x38\x9b\x87\x20\x11\x5f\xa5\x97\xc4\x02\xb4\xff\x69\x4b\x71\xce\x4f\x3d\x33\x0d\x5e\x2f\x3c\x3a\xd6\xd9\x6a\x9b\x34\x39\x23\x0f\xc5\x3a\x44\x79\x4c\xda\x59\x55\x57\xc4\x06\xca\x15\x89\xbc\x7b\xe8\x1e\x2d\x79\x63\x60\x33\x25\x3f\xa7\xbd\xd6\x00\xc6\x7f\xc5\x59\x36\xbd\x96\xce\x04\x28\xc3\xeb\x97\xba\xd1\xde\x0a\x5f\xbb\x9b\x67\x51\x57\xde\x5f\x18\xbc\x62\xa7\xc2\x2c\x94\x83\xe2\x80\x2e\x67\x9b\x5b\x8f\x89\xdb\x0f\xc3\x7f\x7c\x71\x50\xad\x5a\xc8\x72\x2c\xeb\x99\x9b\x24\x35\xe6\x99\x72\x17\x09\x23\x36\xef\x1c\x8a\x22\x92\xda\xb9\xa4\x6f\xf8\xa9\xe1\x0d\x33\x55\x76\x5c\xac\x9d\x65\x98\x77\x0f\x4f\x01\xea\x63\x91\x25\xfd\x03\x16\x09\xdd\x1a\x50\x7d\x96\x28\x0c\x7d\x01\xa3\xee\x98\x7e\x9b\x21\x0e\xc8\x74\x4c\xd4\x8c\x74\xf8\xaf\xee\x96\x1e\x8e\xf2\x21\xf8\x26\xa1\xfe\x6e\x7d\xf0\xcb\x15\xad\x7c\x7e\xf4\xa9\x1f\x9d\x0f\x4c\x2e\x1b\xde\xa6\x35\xd2\x75\xfa\xc8\xc4\xbc\x06\x01\xf4\x90\xdb\xdb\xc7\x34"}, +{{0x9b,0xf3,0xfb,0xc7,0x30,0x8b,0x46,0xf6,0x03,0x6b,0xad,0xe0,0xc3,0xca,0x19,0x9f,0xac,0x66,0x2b,0x07,0xf1,0x03,0xbf,0x75,0x18,0x1d,0x52,0xba,0x6a,0x58,0xbe,0x05,},{0x2f,0x6a,0xc6,0xfc,0x33,0xbc,0x06,0x0c,0x1d,0xc3,0xcb,0x9d,0x1a,0x2b,0x91,0x15,0x84,0x5a,0xdd,0xb1,0x6c,0x4b,0x84,0xbe,0x37,0xed,0x33,0xad,0xb3,0xb3,0xd3,0xa8,},{0x0c,0x31,0x36,0xe0,0x1f,0x9b,0xcd,0x99,0xe1,0x0d,0x3d,0x12,0x4b,0x0c,0xdb,0x07,0x72,0xbe,0xc1,0x8a,0x86,0x4b,0xe8,0x1b,0xd1,0xda,0xa4,0x4d,0x81,0x8c,0x3d,0x47,0x0d,0xfa,0xa8,0xab,0x6e,0x9a,0x76,0x1c,0xf0,0x3f,0x93,0xef,0x9c,0xc7,0x82,0x91,0x09,0x6e,0xd6,0xd1,0x0c,0x08,0xfa,0x2f,0xba,0x3b,0xac,0x04,0xdd,0xe2,0x0f,0x0c,},"\xd6\x5e\x36\xa6\xa3\x81\x95\xec\xb9\x1d\xe3\xc8\x48\xb5\x1f\x63\x92\x45\xfa\x2b\xab\xa8\xa6\xf8\x59\x47\x15\x9d\xec\x0e\xd3\xfa\xe8\x0c\x5a\x0f\x8c\x66\xff\x24\x79\x3c\x89\xc0\xc6\x87\x54\x3b\xc6\x33\x54\x7a\x1f\x37\xf7\x30\xd9\x70\x12\xeb\xbd\xc7\xac\x33\x9c\x48\x90\xc0\x85\x6b\xbf\xe2\xba\x29\xb2\x5a\x7a\xa6\xb0\x89\xc0\x33\xfe\xcb\x76\xdb\x62\xdd\x3c\x00\xf6\x42\x1b\x9e\x76\xdd\x0e\xa3\x66\xeb\x2d\x4a\x05\x2e\xe6\xcc\x73\x6e\x38\x19\x19\x1d\x5a\xd7\xa6\x6d\x2b\xe0\x42\xcc\x65\x39\xe5\xf3\x56\x52\xb1\x55\xa7\x27\xf3\x88\x8d\x93\xf9\x3a\x91\x02\x59\x8f\x75\x38\xa9\xab\x7c\x77\x7e\xec\x79\x42\x6a\x60\x75\xd6\xf3\x8d\x64\xc4\x85\x52\x0f\x64\x13\xff\x4d\x35\x8a\x8a\x9c\xbd\xab\x01\xad\xf4\xdb\x02\xad\xae\xa2\x64\x94\xd1\xf5\xd6\x17\x63\x7f\x27\x7f\x8b\x0e\x6e\x7e\x61\xe2\xee\xcc\xdd\x33\x7d\xe2\xba\xf0\xca\x26\x4c\x14\xc8\xcb\x83\x68\x00\x0b\x9c\x71\x43\x85\xf4\x13\x73\x7d\x68\x16\xe2\x12\xca\xe2\xae\xcf\xff\xc3\x2f\xd1\x6d\x46\xc3\xec\xee\x6a\xb0\x74\xc0\xd7\x68\xbd\xfe\x99\xb8\x6c\xbb\xc8\xdf\x9c\x47\xcd\x58\x6d\x46\x58\x71\x26\x8d\x4a\x9d\x1c\x87\x72\x36\xab\x78\xf8\x85\x9c\x11\x4e\x25\x1c\xab\xc4\xbe\x0f\x8b\xc2\x5d\x14\x8c\x5f\x54\x3e\x29\x07\x45\xd1\x18\x03\xe4\x9f\x5b\x53\x19\x3f\xe3\x99\x69\xc0\x39\xb3\xf2\x49\xb3\x2f\x2b\x85\x98\xb6\xac\xf4\xed\x64\xd5\x75\x2b\xb7\x72\xff\x4e\xe0\x0c\xe0\xf8\x5e\xcb\xb4\xcf\xc4\xce\x07\xda\xf2\x80\x98\x68\xc2\x90\x3b\x78\x1e\x12\xa2\x74\x10\x5f\x06\x18\x10\x29\xe4\x7f\x2b\xfb\x21\xf4\x94\x80\xaa\x1e\x44\x47\x15\xc0\xb9\xff\x07\xea\xd8\x89\x75\xd9\x35\x85\xd2\xff\x42\x48\x32\xa9\x78\x3d\x94\x90\x6a\x60\xf8\x77\xae\x1c\x85\xff\x15\x31\x7b\xad\xca\x1e\x61\x31\x74\x33\xc7\xce\x96\x27\x9b\x67\x8e\xc9\xd1\x74\xdd\x08\x70\x08\x0b\x23\x41\x54\xf6\x26\xa5\x34\x62\xcf\xd5\x47\x84\x2e\xab\x87\x05\x60\x5b\x8e\xe8\x85\x72\x9e\xe7\x8d\x18\x33\xaa\x43\xf5\x5a\xc2\x27\x31\x98\x9f\xde\xda\x7d\xc5\xfa\x9c\x01\x98\x5f\x26\x61\xe6\xc7\x32\x6d\x34\x6e\x6d\xb2\x7e\x6f\x92\x1f\xae\x7c\x93\xa2\x17\x0e\x10\xdd\x0c\x46\x0b\xdc"}, +{{0x64,0xe8,0x93,0x04,0xa3,0x35,0xe9,0x03,0xcb,0x36,0xc0,0xbd,0xf1,0xa6,0x41,0x2e,0xf3,0x68,0x46,0x80,0x06,0xb7,0x3d,0x3d,0x2d,0x61,0xcb,0x03,0x0c,0xc5,0xf8,0xd1,},{0xa1,0x80,0xef,0x3a,0x66,0x1c,0x3c,0x47,0x9d,0x5f,0x69,0x80,0x7c,0x90,0x27,0x48,0xe3,0x5e,0x7f,0x72,0x51,0x21,0xe3,0x7a,0x5d,0x91,0xb8,0xbe,0xc8,0x8d,0x83,0xa6,},{0x92,0xeb,0x44,0x54,0x81,0x40,0x01,0xec,0xfc,0x18,0x02,0x5d,0x64,0x21,0xf6,0x46,0x45,0xa5,0xbc,0xbb,0x5c,0xb8,0xfd,0x85,0xc1,0x4d,0x77,0x26,0x17,0xc5,0x03,0xe8,0xbe,0x7d,0x3b,0xcf,0x11,0x7f,0x5e,0x68,0x01,0xd1,0xc3,0xb9,0x6f,0x90,0x90,0xa6,0x6d,0xdc,0x67,0xf8,0xcf,0x8f,0xf0,0xf1,0xc1,0x25,0xb1,0x6b,0x15,0xe2,0xce,0x07,},"\x2f\x51\x07\x4d\x98\x1b\xda\xfa\xfb\x02\xa4\x0f\xe8\x26\xc4\x5f\x31\x71\xc1\xb3\x18\x4d\x8c\x26\x0b\x82\xb8\x41\x1f\xc6\x25\xcb\x02\xcc\xfe\x75\x5d\xc2\x9d\xc7\x89\x5b\xf7\x59\xe6\x1b\x24\x50\xda\x1a\x65\x6a\x38\xd4\xf7\x0d\x2e\xe7\x48\xc5\x18\xc6\x42\x03\x06\xe5\xf0\x1e\xc7\xa0\xff\xe0\xe9\xdc\xeb\x93\xf6\xc0\x77\xb1\x26\x62\x88\x15\x84\xf9\x8c\xe6\xab\x94\x5f\x87\xfc\x6d\x12\x3c\x45\xd6\xcd\xfd\x82\x37\xa1\xce\x36\x35\xb6\x23\xa7\x9d\x02\x0d\xf4\x4c\x74\xb8\x9a\xc1\x4a\x32\x1f\xbf\x33\xa8\xc0\xa2\x55\x9f\xea\x1c\x2b\x15\x60\x76\xb8\x13\x90\x8f\x84\x2e\xbe\x4c\x2b\x94\x90\x89\xe5\x2b\x1a\xe4\x0d\xc6\xe4\xb2\xab\xbc\x43\x9a\x0b\xf7\x23\x69\x67\x9a\xab\x6f\x4c\x00\x01\x8b\xe1\x47\xf7\xc0\xa6\x7b\x96\x79\xee\x88\xa5\x38\x19\xc4\x9f\x7b\x67\x5e\x30\xa8\xb5\xaf\x39\x66\x1e\xe8\xdb\x21\x01\x04\x11\x29\x49\x68\xf8\x8e\x5d\x60\x4d\x0d\x88\xd7\x6a\x7e\x48\x64\xfa\xd3\xa5\x6f\x5f\x62\x4b\xa1\xb3\x4e\xa9\xcb\x72\x08\x50\xaa\xd3\xbd\x4f\x0a\x88\x2a\x7d\x25\xfb\xec\x2b\xb7\xca\x86\xda\x61\x6d\xa9\x6c\x15\x62\xc6\xd6\xa1\xab\xcc\x64\x1e\x1b\x58\xb2\xc1\x78\xe1\xc3\xbc\x8a\x3b\x36\xec\x9e\x14\x4d\xd2\xe7\x5b\x0b\xc8\xc0\x8c\xcb\x0d\x6e\x34\x27\xb0\x32\x2b\x3d\x6a\xb9\x3f\x3f\x60\xb9\xcc\x5b\x61\xda\xd0\x23\x85\xa1\x49\x49\xf9\xb8\x7a\x8e\x3a\xf1\xe0\xe0\xfa\xb7\xa9\xa9\x28\xc7\x53\xfc\x61\x10\x44\x4a\xf7\xcc\xaf\x80\x27\xed\x64\x1b\x9e\xd8\x7f\xa5\xd8\xe1\xf7\x6c\xae\x46\x5d\x57\xa7\x0d\xad\x9e\xbf\xdd\x3c\xe7\x57\x6a\xc4\xde\x89\xd9\x8f\x42\xe2\x82\xad\x87\xad\x6a\x50\x42\x57\x7c\xbb\xbc\x4d\x95\x1e\x2a\x86\x76\xfe\xdc\x8c\xb1\xb1\xbd\xf7\x6c\x3a\x38\x84\x63\x85\xa8\x5a\xa2\x47\x06\xc2\x0a\x8b\x38\x46\x5f\xe2\xae\x0e\x41\xf7\x8e\x61\x4b\x8e\x96\x42\xfe\x24\x71\xa9\x01\x57\x47\xdb\x97\x6e\x0c\x78\x48\xc2\x3f\xf3\xf4\x17\xcb\x05\xa8\xd5\xef\x40\x13\x0a\xdf\x85\x5c\x99\x8a\x62\x10\x4d\x7e\x2f\xb7\xc0\xf9\xaa\x2a\x49\x60\x75\x62\x3c\xed\x2c\x0f\x7e\xec\x10\x14\x7f\xf9\x60\x8a\x8a\x04\x2e\xf9\x81\x17\x45\x9b\x93\x83\x7f\xd1\xb8\xd5\xef\x03\x97\x8e\xad\xa7\x4c\xac"}, +{{0x6f,0x63,0x43,0x87,0xca,0x2c,0x0c,0xb1,0x67,0xa7,0x40,0xd6,0xaf,0xd8,0x9e,0x2a,0x28,0xf5,0x30,0x71,0x84,0xe8,0x1c,0xba,0x3c,0x03,0x70,0x46,0xa5,0xed,0xe2,0x3c,},{0x01,0x1f,0x2a,0x9a,0x11,0x1c,0x38,0xf3,0x49,0x0c,0xad,0x16,0x85,0xbe,0x78,0xec,0xee,0xdc,0x6f,0xac,0x4a,0x32,0x21,0x30,0x1c,0x69,0xc8,0x4b,0x1e,0xc7,0xb3,0xa7,},{0xfd,0x17,0xc6,0x18,0xcd,0xbb,0x5d,0x45,0x9e,0xa2,0xac,0xa8,0x86,0xf0,0x51,0x2c,0x62,0x32,0x51,0x28,0x4a,0xae,0x3a,0x83,0xeb,0x5d,0x7f,0x60,0xda,0x1d,0x9b,0x2b,0xa0,0x83,0xc4,0x55,0xa5,0xe2,0x58,0x3a,0x3c,0xba,0x73,0x6e,0x7b,0x96,0x1b,0xa1,0x9c,0x1c,0xc8,0xdd,0x90,0x74,0x5d,0xa8,0x2a,0x15,0xdf,0xc6,0x62,0xe8,0xe1,0x0d,},"\x86\x5c\x20\xa9\x4a\xc3\xf2\xe3\xbd\x5c\xb8\x5b\xec\x9d\x33\x72\x66\x71\xfe\x01\xf9\xc5\x37\x01\x7d\x59\xc8\xd5\x10\x6e\x43\x36\x0b\xf7\x6f\xc0\x61\x86\x70\x59\x80\xc8\xa8\x7b\xa3\x63\x3a\x4a\x17\x04\x26\xec\xc0\xde\xfb\x6d\xb2\x67\x0f\x5f\x59\x25\x33\x77\x4c\xda\x50\x05\x2a\xe5\x97\xd4\x8d\xea\xcc\x26\x37\x06\x3b\xfd\x51\x9f\x2e\x79\xba\xc8\x17\x75\xbe\xcc\xb1\xab\x2f\x5b\x39\x71\x2e\x2e\x82\x94\x69\xb7\x5a\x2d\x2d\xbd\x08\xaa\x6d\x24\x72\x34\x04\xb2\x5e\xb9\x48\xa4\x83\x4c\x55\x24\x6c\x80\x79\xa8\x2e\xc6\x43\x54\xe8\xc2\x38\x8f\x8c\x5a\x61\x6b\x3c\xdc\x37\x1e\x62\x63\xfa\xbc\x9f\x60\x99\x21\x9e\x86\x15\x85\xfe\x82\xa6\x7d\x61\x0d\xd1\xeb\x5c\x81\xc9\x6b\x5c\xb3\x54\xa6\x89\xfd\x8a\xac\x8d\xb7\x6c\x43\x3f\x0c\xb0\xb3\x1c\xf1\xd8\x55\xb6\xa3\x0a\x3d\x2a\x21\x2e\x9b\x4f\x7d\x7a\xfe\x61\x99\x51\xf9\x8d\x2f\x1b\xa2\xc1\x01\x08\x5b\xa8\x1f\x49\xb3\x60\x37\xcd\x64\x57\xa7\xea\xa8\xf4\xf3\xbe\xdf\x68\xd0\x9f\xc9\xfa\x25\xa9\xd7\x54\xdb\x65\x36\x02\x85\x41\x2d\x1a\x6d\xa5\x37\x88\x90\x5f\xcf\x4e\xfa\x8a\x80\xcd\x86\xca\x48\xb8\x45\x63\x3d\x8c\x31\xc2\xae\x06\xf1\x6c\x4c\x6b\xbb\xe9\xcd\x1a\xfb\x59\xe1\x01\xbe\x50\xe0\x35\x35\xdd\x8a\x65\xe4\x5b\xba\x46\xd4\x5c\xb1\x4b\xad\xfc\x8e\x93\xab\x52\x67\xf4\xe4\x92\xab\x1f\x9a\x95\xe6\x1f\xca\xb8\x1c\xbf\x2b\xd8\x67\xa3\xec\x7b\x4b\xaa\x18\x9a\x0f\x08\x56\x70\x75\x59\x61\x29\xdc\xf9\xff\x1c\x50\x2d\x32\x79\xe8\xaa\x6c\xe5\x6e\xaf\x13\x45\x82\xa9\xe4\x30\xa5\xaa\x8c\xa1\x0c\x3d\xa8\xbc\x79\x3d\x02\x56\xad\x19\xae\xa7\x14\x9f\x0e\xa7\xea\x95\xfa\xcf\xac\x1c\x5c\xfd\x29\xd7\xa3\xfe\x1a\x41\x79\x75\x73\x9e\x14\xda\x8e\xdc\x81\x99\x00\x47\x2c\xa8\xc6\x97\x16\x32\x8e\x8a\x29\x9f\x97\x4e\xdf\xf7\x41\xaa\xbc\x1c\x07\x4a\x76\x1b\x3e\xc8\x76\x1d\xda\x2e\x7e\xed\x7a\xf3\x3e\xf0\x04\x09\x84\x9d\x41\x54\x97\xc5\xed\x5d\xfa\xa2\x25\x9a\x31\xd0\x76\x39\x81\x70\xb2\xd9\xd2\x10\x20\x8b\x4a\x4c\x7d\xb8\xc6\x26\xd1\xc5\x33\x56\x2a\x1f\x95\x48\x9f\x98\x19\xe4\x98\x5f\xc4\xe1\xd1\xa7\x07\xbe\x5e\x82\xb0\x05\x48\x1d\x86\x37\x7f\x42\x4e"}, +{{0x4b,0x2e,0x1a,0xe6,0x0f,0xa5,0xd3,0x83,0xba,0xba,0x54,0xed,0xc1,0x68,0xb9,0xb0,0x5e,0x0d,0x05,0xee,0x9c,0x18,0x13,0x21,0xdb,0xfd,0xdd,0x19,0x83,0x95,0x91,0x54,},{0x36,0xc0,0x20,0xb1,0x85,0x52,0x34,0x56,0x19,0xef,0x88,0x37,0xeb,0x8d,0x54,0x94,0x84,0x0e,0x85,0xf4,0x68,0x09,0x34,0x3b,0x4d,0x6f,0x40,0x61,0x25,0xda,0x55,0x7d,},{0x22,0x20,0x11,0x9e,0x83,0xd6,0x9a,0x6a,0x3e,0xed,0x95,0xfa,0x16,0x6d,0x1d,0x11,0x28,0xa3,0xf2,0x32,0xca,0x1b,0x78,0xbc,0x94,0xb4,0xd4,0x76,0xc4,0x77,0x94,0x43,0x61,0x4b,0x87,0x72,0xaa,0x22,0x32,0xcb,0x07,0x20,0xa0,0x55,0xeb,0x71,0xd8,0x40,0x7f,0x3a,0xb1,0x9b,0xaa,0x1d,0x96,0x2c,0x05,0x2c,0x84,0xc0,0xbd,0x58,0x96,0x08,},"\xfa\xb9\x8b\x2b\xbf\x86\xae\xb0\x50\x86\x81\x2a\x4b\x00\x49\xa1\x04\x2a\xbb\x76\xdf\x9c\xd2\x90\x87\x55\x70\x63\x03\xef\xed\xb1\xad\x21\xe8\xbc\x8d\x75\x62\x34\x9e\x1e\x98\xce\x0d\x75\x2f\x4b\x3d\x99\xe6\x77\x36\x8b\xd0\x8c\x78\xfe\x74\x25\xec\x3b\x56\x0e\x38\x3b\xd4\x2a\xf6\x49\x98\x86\xc3\x5a\xdd\x80\xa5\x82\x8b\x61\xd6\x64\x4d\x7d\xc4\x43\xba\x2c\x06\xf9\xba\xd2\xec\xcb\x98\x3d\x24\x45\x8f\x6a\xda\x1b\x10\xbb\x5b\x77\x17\x2c\x5c\xdd\x56\xd2\x73\xd1\xe4\x10\x10\xb2\x5c\xf4\x8a\x7d\x58\xd7\x25\x57\x02\xac\x12\xf2\xa6\xfe\x29\x18\x46\x63\x95\xf4\x60\xd1\x52\x36\xd0\x35\xae\x94\x10\xca\x86\xc4\x60\x51\x28\x29\x9f\xaa\xf0\x90\x15\xf1\xad\xee\x77\x68\xee\x1a\x8f\x8c\xa0\x6d\x10\xdd\x7f\x95\xc4\x6f\xa1\x02\x53\x06\x5f\x9d\x6f\x90\x29\x59\x08\x80\x9f\xd7\x79\x57\x1b\xe2\x9e\x0a\xe6\x6e\x0b\xcb\xde\xb7\x91\x3d\x2b\xbb\x76\xac\x30\x2f\x34\x52\xc5\x5e\xf1\x99\xa4\x8e\xce\xb0\xe3\x59\x6c\x7b\x4c\x03\x86\xda\xe7\x10\x1e\xa2\x44\xa3\x3c\x4c\xdc\x83\x06\x72\xdf\x83\x65\x5b\x35\x33\x80\x52\x30\x7b\x94\xd2\x23\xca\xb1\xaf\x69\xe0\x7f\x78\xe5\x8c\xbb\x0c\xb3\xc5\x35\x1e\x3a\x6b\x0c\x4a\x92\x7f\x75\x62\xc5\x98\xd2\xd3\xdf\x90\x56\x9f\x61\xdb\x1a\x3c\xb0\x14\x0b\x56\xea\x02\xcf\x77\x45\xfb\xee\xc2\x02\x86\x73\xd6\x7f\x1e\xc5\xf7\xda\xf9\x71\x5f\x75\x4a\x9d\x8e\xd4\x6a\x7a\x63\xef\x72\x2e\xe0\xd5\x89\x93\x31\xb6\x3c\x97\x4f\xa8\x80\x42\x94\x35\x76\x7f\x96\x25\x4e\xf4\x6c\x99\x68\xf3\xfe\xda\xaf\xea\xf3\xe8\xf4\x56\x34\xb5\x4f\x5e\x0a\x5f\xc2\xd2\x37\x3a\xb9\xe9\x8d\x9a\xcf\xe3\x69\x7e\x64\x2a\x18\xe0\xdf\xd9\xfb\xc2\xf0\x94\x86\x6d\x40\x1f\x0a\x4c\xa2\xa4\x56\xed\xf6\xa1\xa7\x7b\x9c\x29\x6c\x39\x22\x06\x7e\xb3\xd5\xa5\xca\x0a\x77\xf4\x30\xe4\xc8\x61\x1d\x8f\x05\xa1\xba\xac\x16\x35\xef\x7b\xa8\x3d\xfc\x69\xd3\x01\x94\x98\x56\xbe\x4d\x2c\x8a\xb6\x1d\xe2\x9c\xf3\x92\x50\xc5\x79\x4c\xbf\x57\x50\xcd\xa9\x5d\x04\x68\xaf\xa2\xb7\xf2\x3d\xba\x4e\xf5\xf5\x29\x5a\x3b\xf4\x14\x00\x18\xb7\xed\x06\x18\x84\x44\x4f\x5b\xb1\xb7\xd2\x39\x31\x2d\xd7\x39\x99\x95\x36\xc6\x84\x45\x6e\xa0\x6b"}, +{{0xb2,0x16,0xce,0xbf,0x87,0x80,0x24,0xc2,0x0d,0xfc,0x86,0xce,0x4b,0x37,0xbd,0xc4,0x7a,0xa2,0x8f,0x29,0x20,0x3b,0x5b,0x44,0x92,0x50,0x65,0xd9,0x93,0xa2,0x59,0xfe,},{0xc3,0x6e,0xdb,0xb6,0x25,0x4a,0x91,0x3f,0x08,0xfe,0x25,0x9e,0x23,0x87,0x80,0x63,0x8f,0x72,0xec,0x0b,0x30,0x07,0x26,0x4b,0xcc,0x60,0xa9,0xe8,0x1e,0xe9,0x29,0x8f,},{0xb7,0x38,0x9e,0xe7,0x8d,0xd9,0x76,0x3f,0x9d,0x28,0x92,0x91,0x2e,0xdc,0xbe,0x3e,0x8a,0x23,0x6b,0x8b,0xdc,0x25,0xf4,0x4b,0x9c,0xfd,0xc8,0xc4,0x7c,0xd5,0x81,0x68,0xab,0x56,0xeb,0x04,0x02,0xa5,0xbd,0x75,0x2a,0xc8,0xf4,0x97,0x8d,0x2e,0xa2,0xb6,0x5d,0x2f,0xa8,0x52,0x65,0x96,0x6b,0x9f,0x57,0x22,0x7e,0xf4,0xa5,0x9a,0xe0,0x09,},"\x9c\x87\x17\xcc\x86\xfe\x02\x48\x0b\xfd\x9e\x92\x2b\xd7\x6b\xff\xee\x21\x70\xc4\xcb\x1b\x13\xdf\x83\x4a\xc0\x1d\x45\x00\x60\x86\x29\x7f\x1b\x8a\x26\xf2\xba\x67\x4d\x33\xe1\xd1\x62\xf1\x93\x67\xfe\xba\x97\x35\x2b\x7d\xf2\xe7\x5b\x30\x9d\x4b\x6f\x8b\x07\xcc\x0e\xb6\x77\x7e\x81\xe2\x68\xe0\x2d\x07\xf2\xa0\x8f\x8f\x39\xd5\xa8\x32\x0b\xfc\x01\xfc\x8c\x92\x27\xd2\xcf\x05\xe1\x28\x91\xff\x4d\xe8\x85\xa1\xc9\x33\x71\xa0\x91\x0b\xa5\x33\x92\xaf\xf9\xba\x2e\xed\x9a\x20\x55\x97\x7e\xc4\x15\x7b\xd6\x5b\x34\xdf\x79\x37\x2f\x4d\x50\xed\xbc\x48\x92\x43\x53\xcf\xa1\x69\x23\x19\xd8\x8a\x7a\x5b\xb7\x26\x25\x4c\x20\x92\x91\xe9\xb1\xd2\xc1\xa6\xc8\x23\x63\x98\x10\x9c\x59\xed\x42\xa0\xac\x9e\x76\x33\xc5\x20\x73\x4e\xcc\xfe\xa4\xfe\xa9\x5a\x47\xa8\xf0\xa0\x68\xb4\x27\x50\x00\x43\x9c\xc9\x7c\x57\x87\x1e\x10\x5c\xc0\x79\x0e\x9d\xcc\x9c\x25\xd5\xaf\x70\x63\xff\xd0\x5c\x4f\x37\x80\xe7\xbc\xa4\xc4\x56\xd0\x17\x0d\xa7\x09\xfc\x6c\xb3\xfa\xa7\x2b\xdc\xf5\x62\x90\x8a\xe9\x34\x0a\xef\x4d\x0c\x8b\x91\xf0\xfb\xcc\xbc\xf1\xcd\x89\x8b\x1c\x71\x6f\x4f\x14\x74\xc3\xaa\x31\x62\x42\xab\xdf\x63\x68\xe5\x7a\x24\x7f\xf2\xfd\x5c\xe2\x3d\x18\x7f\x69\x4f\x11\xe3\x8d\xfb\xfb\xc3\xd9\xdb\x20\x90\x3b\x4e\xbb\x44\x9b\x90\x49\xee\x02\x0f\x6e\x2f\x50\x8e\x8b\x2b\x16\x5b\xad\x74\x64\xdb\xdd\x17\x8c\xbd\x42\x32\x33\x76\x5d\x37\x1e\x7a\xe1\xc3\xe8\x78\xcd\xb5\xb8\x24\xb2\x0c\xb3\x09\x86\x7c\x0e\x47\x3c\x06\x7e\x67\x44\x00\x85\x27\xb6\xbc\x07\x6d\x07\x7f\x48\x67\x62\x2a\xee\xd1\xc2\x53\xdb\xde\x7c\x6a\x76\xc7\x01\x59\x62\xfb\x73\x39\x16\x98\x60\x0b\xb3\x18\xff\xa7\xb0\x13\x6e\xe4\xcc\xb0\x7d\xaa\xf0\x1f\x40\xff\x9c\x19\x4f\x98\x68\x1f\x9f\xae\xf8\xb6\xf9\xe9\x9f\x95\xdf\x00\x80\xda\x89\x66\xa8\xba\x7a\x94\x74\xc5\x37\xb9\x2d\xf9\x79\x9e\x2f\xd1\x6f\x78\x8d\xad\x7a\x7b\xcc\x74\x52\x26\xe1\xe6\x37\x1f\x52\xeb\xcd\xbd\x14\x40\x44\xdd\xfe\x63\x2d\xfc\x0a\x43\xd3\xa4\x50\x92\x31\x70\xeb\xc7\xae\x21\x9e\x50\xe0\x78\xa5\x11\xbc\x12\xef\x14\xcd\x14\xb5\x30\x9f\x38\xab\xd6\x5d\xb2\xb2\xa7\xaf\x22\x43\xb2\x29\xc9\xfd\x2e"}, +{{0xaf,0xce,0xce,0xa9,0x24,0x39,0xe4,0x4a,0x43,0xed,0x61,0xb6,0x73,0x04,0x3d,0xcb,0xc4,0xe3,0x60,0xf2,0xf3,0x0c,0xd0,0x78,0x96,0xcd,0xa2,0x0c,0xb9,0x88,0xd4,0xe3,},{0xd2,0x31,0xf6,0x92,0x35,0xa2,0xe3,0xa1,0xdd,0x5f,0x6c,0x2a,0x9a,0xaf,0x20,0xc0,0x34,0x54,0xb9,0xa2,0x9f,0x4e,0x3a,0x29,0xab,0x94,0x68,0x9d,0x0d,0x72,0x3e,0x50,},{0xa6,0x55,0x45,0xcf,0x3d,0xf4,0x56,0xb2,0x8d,0x83,0xa6,0xd9,0x4c,0x03,0x6a,0x19,0xd0,0xd2,0x9f,0xb0,0x65,0xed,0xc2,0x7e,0x5e,0x93,0xa1,0xf4,0x02,0x79,0x89,0x7e,0x1c,0x6f,0x25,0x95,0x9a,0x72,0x5a,0xba,0xbc,0x87,0xcf,0x2a,0xe7,0x27,0xf3,0x46,0x7b,0x79,0x57,0x0e,0x90,0x27,0x11,0x91,0x71,0x91,0xd9,0xcb,0x0d,0x2d,0x66,0x0c,},"\x0b\x05\xf8\x9e\xbb\x33\x97\x94\x76\x87\xaf\xbe\xf0\xed\xe8\x7c\xf3\x81\x06\x76\x27\x70\x37\x52\x1d\x95\x2a\x3b\xbb\xbd\xc8\x56\x59\x88\xa0\x95\xd8\xd4\xf6\xf5\x9b\xe5\x72\xd3\xd8\x21\xdd\x78\x99\x77\xef\x77\xa2\xfd\x71\x10\xce\xee\xd9\xf3\x75\x6e\xd8\xe1\x88\x26\x7b\x97\xa3\x0e\xf8\x95\x7c\x78\xae\xa3\xa2\x96\x3d\xec\xa6\x18\x60\x54\x5e\x0c\x40\x82\x48\x81\xeb\xb1\xdb\x10\xf6\x07\xe1\x0d\xdb\xdd\xce\x40\x0e\xa2\x36\xba\x47\x45\xaa\x99\xa0\x56\x41\x97\x67\x66\x78\x9e\xd0\xda\x7d\xb5\x5f\xda\xb4\x59\xeb\xd4\xb4\x41\xa6\x28\x2f\x7c\xfd\x5a\x20\xea\x06\xef\xfa\x33\x59\x55\xe5\xfd\x29\x18\x16\x71\xbc\x92\xc0\x00\x52\xf7\xf7\x5c\x39\x27\x7c\x9a\x43\xb7\x87\xac\x9f\xb1\x51\x6e\x99\x62\x32\xa5\x09\x77\x4d\x1d\xc2\x1d\x8c\x05\x13\xf7\x84\x4b\x0a\x5b\x5f\x18\x95\x75\x81\xf9\x90\x44\xa1\x42\x23\xcc\xda\x8a\x28\x4d\xe1\x2f\xd4\x24\x26\x5f\xe5\x7b\x27\x02\x15\xf8\xfa\x9f\xf2\xbe\xa5\x17\x93\x4e\x48\x00\xa4\x7d\x34\x6f\xb6\xc3\x61\xcf\xba\xbe\xff\xab\xd9\xc4\x16\x4f\x45\x15\x6e\x24\x5c\x97\x7e\xdb\x47\x36\x42\xc3\x94\x0b\xe5\xad\x6f\xd1\xa7\x11\x9a\x7b\x18\xe9\x8d\x6d\xc8\x43\xe0\xd2\x54\xc9\x3d\x01\x46\xd1\x8e\x5c\x62\xed\xe1\x49\x0f\x89\xa6\x05\xeb\x45\x4f\x97\x47\x78\xcf\xae\x20\x93\x2e\x95\x47\x7b\xd0\x3b\xcd\xb9\x7d\x5b\xcb\x76\x33\x59\x42\xe9\x2e\xe6\x68\xf2\x31\xe6\x9c\x57\x0a\xc5\x44\x6d\x0f\x77\x40\x66\x73\x7f\xdf\x49\xf1\x0c\xeb\x1b\x52\xd6\xd8\xa4\x63\x98\x46\xa3\x37\x3a\x7c\x6f\x3b\x4b\x31\x59\xfe\x2e\x7a\xf7\xee\xe2\xf0\xdf\x17\x2d\x94\xd2\x55\xd0\x17\x65\x1d\xa3\x00\x90\x05\xe5\xea\xc3\x17\x6c\x09\x38\x9e\xe4\x0d\x70\x38\x3b\xd3\x71\x17\xec\xa0\x83\x59\x8a\x18\x01\xf5\x92\xd0\x57\x18\x6e\x56\x8e\x24\x7c\x25\x2b\xe4\xb1\x4f\x72\x3a\xb7\xdd\xb9\x7a\xe9\x76\x8c\x26\x82\xfd\x63\xac\xc3\x00\x77\x9f\xe0\x4e\x2b\x88\x87\x47\x51\x34\x6c\x9e\x0f\x97\xa2\xa2\x16\x77\x2f\xf9\x62\x5c\x33\xbd\x7e\x29\xfe\xd8\x00\x3a\x08\xdb\xd3\x3b\x5d\x17\x89\x9c\x94\x3c\x25\xe9\x5a\xd7\x54\xfb\x63\x2e\x04\x7c\x11\x2a\xf7\xf7\xce\xba\x72\x36\x2e\x1a\x3d\xdd\x29\x35\xaa\xf7\xf8\x18\xa2\x7c"}, +{{0xb8,0x34,0xc6,0xe0,0xfa,0xcb,0xff,0x58,0x0d,0xd3,0xb2,0x37,0x53,0x95,0x9a,0x4c,0x21,0x54,0xc2,0x19,0x52,0x1b,0x3d,0x27,0x03,0x5d,0x07,0x1f,0x65,0x99,0xbd,0x02,},{0xd1,0xc3,0x84,0x71,0x5e,0x3b,0x3d,0x02,0xc1,0x3e,0x09,0x06,0x05,0x53,0x4c,0x7d,0xb7,0x40,0xda,0x2a,0xa5,0x60,0xf5,0x32,0x00,0xa3,0xce,0xd8,0xbe,0xae,0x8c,0xf8,},{0x0f,0x19,0xb7,0x06,0x6d,0x57,0x92,0x32,0x8a,0x98,0x00,0xd9,0xd4,0xf8,0xf6,0x7d,0x5b,0x08,0x9b,0x54,0x12,0x26,0xa1,0x67,0xda,0xcd,0x43,0x9f,0xa4,0x85,0xb0,0x02,0x5a,0x5d,0xc7,0xf2,0xc7,0xe2,0x3f,0xc4,0xa5,0xc6,0x86,0x9e,0x76,0x19,0xd3,0x56,0x39,0x97,0x00,0xc9,0x36,0x50,0xe8,0x9c,0xd2,0x5b,0x90,0xfb,0x99,0x25,0xe3,0x04,},"\x6c\xf1\x47\xb1\x60\x55\x28\xa3\x6b\xe7\x57\x16\xa1\x4b\x42\x0b\xcf\x06\x7c\x03\xf1\xcf\xe9\xc4\x40\x2f\x14\x98\x7f\xbf\xc9\xd3\xec\xc3\xcc\xf4\xf8\xd2\xd0\x3a\x55\x90\x0b\x8d\xc7\x9a\xf3\xb6\xe7\x74\x36\xf6\x9b\x14\x17\xad\x4b\x68\xfd\x44\xe5\xe3\x33\xed\x90\xea\x79\x43\xfb\xd1\x12\x26\x09\xec\x8f\xf6\xbb\x25\xe4\x2e\x99\x14\xf5\x92\x0f\xc7\x2c\x4d\x01\x3b\x6a\x96\x85\xc9\x96\xfb\xd8\x35\x2a\xaf\xb1\x84\xc2\x2d\x9e\x47\x87\x1a\x52\x80\xe4\xab\x7d\xd6\xa5\xcf\xd1\x0a\x59\x94\xa2\x00\xf6\x70\xe0\xb6\x22\xa9\x39\x4d\x47\x93\xd0\xa4\x20\xe7\xd8\x80\x6c\xb1\x27\xc7\xac\x69\x0d\x45\xa2\xe9\x41\x66\xce\xa6\x72\xbc\xd9\x82\xb0\xe9\xba\xad\x56\x31\x2d\x25\x70\xdd\xde\x7e\x0b\x9e\x7f\x47\x13\x6f\x04\x81\xd0\x0f\x66\xa2\xaa\xca\x4d\x1b\x09\xd7\xce\x6c\x5a\x98\xa7\x6b\x68\xcd\x97\xd5\x79\x39\x68\xd6\x67\x07\x3f\x82\x17\xf9\x05\x47\x35\x34\x0f\x9b\x14\x9c\x0d\xce\x84\x5b\x09\x9e\x88\xd0\x70\x96\x80\xf0\xf7\x76\x03\xff\x0a\x23\x31\xc5\x58\xfc\x36\xd5\xf2\x4d\xa9\xa6\x2d\x69\xaf\x51\x90\xd2\x1b\x5c\x85\x7a\x1e\x08\xf0\x14\xc6\xd4\x56\x46\x86\x65\xa7\xf8\x45\xc6\x6f\x91\x11\xf9\xc0\x98\xc6\x89\x40\xef\xcd\x87\xb6\x57\x07\x0c\xb9\x16\x4b\xc9\x74\x3a\xce\xb7\x43\x9a\x0d\x01\xc0\x06\x2a\x11\xaf\x2e\x11\x34\x93\x97\xf5\xd1\x52\x87\x2b\x13\xc5\xab\x32\xf5\x1c\xc5\x8f\x14\x75\xec\x82\xac\x67\x15\x61\xdc\xbd\x34\x3c\xfb\x3c\x5f\x78\xd0\xfc\x73\x05\x3c\x60\x04\xb0\xa4\xca\x3f\x20\x43\xff\x4b\x0c\x54\x27\x5c\x4f\xcb\x9c\xad\xc6\xba\xab\xe5\x7b\x1d\x5a\xcd\x53\x1e\x97\x2e\xf9\x33\x51\x36\xcd\x1d\x65\x51\x2b\xa1\xf5\xb6\xcc\xc4\xb6\x6b\x42\x50\xaa\xfa\x29\x67\xdd\x42\x11\xa2\x74\x2e\x0f\x17\x7d\x8f\x40\x63\x89\x9f\x61\x81\x5c\xbe\x6d\x8f\xbf\xcd\xf7\x48\x12\xbd\x40\xcc\x10\x08\x4e\x46\xa9\x9a\xc1\x28\x05\x8e\xaf\x16\xa4\x9a\x24\xb6\xae\x22\x8e\xcf\x01\x09\xc5\x2d\xfc\x06\xe3\x7d\x6a\x33\x3b\xcb\x24\xab\xa3\x12\x16\x4c\x6c\x02\x90\x48\x5d\x25\x12\x80\x53\x8c\xe9\x54\x1c\x09\x16\x64\x0e\x36\xd6\x92\x9d\xcd\x95\x88\xeb\x99\x57\x7f\x5f\x6d\x82\xbc\xbb\x19\x88\x26\x26\x7e\x49\xf5\xda\xff\x2c\x0d"}, +{{0x22,0x69,0xa5,0xd8,0xf7,0xac,0x2c,0xd9,0x04,0x8f,0x5f,0x49,0xe3,0x49,0xe5,0xc4,0x35,0xa1,0x59,0xb3,0x19,0xfe,0x3b,0x30,0xbf,0xac,0x8d,0x0d,0x50,0x59,0x43,0xf4,},{0x1c,0x81,0x79,0x43,0xdc,0x39,0xc2,0x4b,0x01,0xda,0x38,0xa4,0x87,0xb1,0x75,0x48,0x24,0x60,0xc6,0x09,0xe4,0x72,0x63,0x49,0xa9,0xaa,0x7a,0xea,0x9b,0xc0,0xfb,0x34,},{0xbe,0x0f,0xb3,0x30,0x8a,0x07,0x6a,0x61,0xa4,0xa9,0x2a,0x97,0xf6,0xac,0x55,0x32,0x71,0x90,0xe1,0x34,0x1d,0x6d,0xd4,0x10,0xd8,0x6b,0x41,0xbd,0xaf,0x2d,0x33,0x74,0x09,0x3e,0xf7,0x20,0xbd,0xb7,0x7f,0xeb,0x70,0x14,0xe0,0xf7,0x7d,0x3b,0x80,0x96,0x23,0xc7,0xca,0x53,0xe2,0xae,0x4b,0x09,0x71,0x13,0xe9,0x6d,0xb7,0x7a,0x2d,0x08,},"\x71\x53\xd4\xd9\xe6\x41\xaa\x61\x92\x0d\xb0\xff\x4b\xd5\x37\xa6\xd6\x13\x0a\x39\x65\x54\xcc\x94\x53\x76\x98\xf9\xca\xd1\x6b\x99\xee\xbe\xfa\x5f\x27\x76\xf2\xfe\xaf\xf6\xbd\x9a\x69\x04\x12\x0c\x67\xe0\x88\x3f\x6b\x96\xbb\xbb\x19\x5e\x95\xae\xc7\x53\xb6\x99\xba\xb3\xd0\x39\x44\xc1\x3c\x72\xfc\x84\xe3\xf2\xcb\xf6\x29\x6f\x64\x55\x49\x11\x1c\x93\xfa\xe1\xa7\x59\xbf\xcd\x16\xfc\x09\xe6\x0b\xb9\x78\x55\x35\xad\x27\xda\x24\x4e\xf2\xf8\x57\xf2\xde\x99\xa6\xe9\x21\x88\x89\x0e\x45\x2c\x7f\x5b\x9e\x3a\x4b\x96\x8e\x11\x74\x3b\x6f\xc7\xfa\xf1\x27\x5e\x53\x60\xa5\x46\x89\x41\x79\x78\x94\xd7\x70\xfa\x7d\xa3\x64\xa3\x37\x30\x22\x39\xfe\x83\xae\x0b\x0d\x08\x4a\xa1\x2a\xcd\xc6\x34\x62\x52\x4e\x0e\xb1\x0f\xef\xe8\x1b\xa9\x6f\x71\xf2\x75\xf3\x44\x9a\x3f\x8d\xb2\x1d\x58\x74\x9a\x38\x85\x3d\x39\xb0\xad\x8e\x69\x89\x1b\xd2\x04\xdf\xca\x8f\x6c\x23\x9d\xc9\xa0\xac\x27\xf5\x4d\xb4\x23\x8d\x47\x06\xdf\x11\xd6\x07\x36\x9d\xc7\xf7\x04\xda\x1d\x39\xf2\xe8\x2a\xf8\xc2\x83\xd2\x20\xc1\x24\x31\xf5\x6d\x80\x30\x69\xb4\xac\xb7\x70\x81\xc0\x31\xae\x33\x19\xfc\x77\xfc\xa7\x84\x50\x97\xfd\x72\x7a\xd0\xd0\x80\x89\x5b\xba\x23\xe8\x73\xd2\xde\xf8\xcd\xc2\x16\xc3\xee\xd6\x1b\x08\x76\x1b\xb9\xeb\xce\x02\x82\xcf\x50\x2a\xaf\x6c\xe7\xe8\xc0\x58\x63\x79\x58\xc3\xea\x1b\x72\xfe\x6e\x8d\xf8\xd3\x7a\xc0\x55\xdb\x69\x92\x58\x7f\xab\xbd\xc4\x67\xf5\x24\x75\x64\x4f\x91\x88\x63\xaf\x62\x04\x92\xf3\x46\x80\xf2\x05\x6c\xbc\xab\x75\xe2\x32\x36\x26\xc0\x94\x75\x9c\x0e\x0e\x99\xef\x19\x75\x95\x27\x25\x06\x46\xad\x76\x01\x20\xba\x38\x66\x99\xd5\x39\x34\xf9\x56\xb8\xbb\xc7\x39\x5b\xb4\x96\xce\xb2\xdd\x22\x3c\x7b\x50\x1b\x92\xd3\x6a\x95\xf8\xf0\xa0\x2e\xb5\xba\x4d\xdd\xf1\x66\xb9\xb9\x5b\x4a\x59\xe7\x2a\x30\xc6\x3c\xf2\x1e\x60\x85\x75\x19\x23\xd5\x4b\x30\x28\x1e\x52\xa0\x96\x18\xe6\xf0\x23\xba\x0a\x21\x67\x5e\x7f\x98\x9b\x89\x91\x58\x8c\x96\xc2\xb5\x6a\x78\xf5\xd2\x94\x5a\x7b\xae\xb6\xa0\xc1\xbb\xd5\xd9\x5a\xf3\xee\x83\x0f\x58\x09\xc7\x94\xa1\x5a\xb4\xb5\xf8\x9d\xd2\xbe\x2d\xfd\xcd\x8f\xe0\x52\x0f\xda\x2b\x3f\x02\xa1\xac\x01\x55"}, +{{0xe9,0x65,0xb3,0xf2,0x57,0x35,0x66,0x85,0xc9,0x8b,0x42,0xb9,0x64,0xa2,0x53,0xfc,0x49,0x53,0x99,0xcc,0x94,0xb0,0x99,0xc2,0x44,0x5f,0xc8,0x1c,0x75,0x9c,0x68,0xe5,},{0x68,0x9f,0x54,0x10,0xc8,0xe0,0xf4,0xd3,0x7b,0xc0,0x7c,0x85,0xd7,0xcc,0xe6,0xc9,0xb6,0x36,0x01,0xf9,0xbd,0xaf,0xec,0xaa,0x44,0x8a,0x5e,0xed,0x64,0xaf,0xc8,0xc6,},{0x8d,0x2b,0xc4,0xe1,0xcd,0x25,0x6a,0xad,0x8a,0x15,0x1d,0xec,0x01,0x0d,0xc9,0x3a,0x5e,0x5c,0xca,0x58,0x29,0x8d,0xec,0x49,0xcb,0xc9,0xc4,0x71,0x7b,0x5c,0xfb,0x54,0x60,0xd4,0x30,0xbe,0x72,0x6b,0x0f,0x30,0x2c,0xbd,0x92,0x6b,0xee,0xa1,0x9a,0xa3,0xc9,0x3a,0xeb,0x45,0x2a,0x44,0xf6,0x00,0x7a,0xf4,0x9a,0xdf,0x2f,0x05,0xbb,0x04,},"\x6f\x20\xa9\xad\x27\xe3\x0d\xac\x76\xb3\x0d\x4c\x19\xa5\xbd\x6d\xfd\x6d\x04\x92\x13\xf4\xbe\xcd\xd9\x63\xd7\x2b\x8b\x2d\xad\x68\x7b\x00\x38\x08\x20\x1d\x50\xf7\xdd\x6e\x59\x9e\xf5\x8c\xeb\x60\x68\xc5\x45\xed\x99\xb9\xe7\x63\xf9\xb0\xec\x1d\xb5\xfc\xbd\x7d\x49\x0a\x12\x1e\xce\xc6\xbb\xa1\xeb\x5e\xdb\xd6\xde\x85\x36\x47\x07\xc5\x5e\x30\x0c\x8b\x16\xbb\x25\x30\xf7\x08\x98\x13\x66\x89\xc9\x88\x59\x1d\x53\x91\xd9\xcc\x34\x7d\x79\x31\x06\x1a\x9b\x76\x96\xe2\xc9\xf3\x5b\xc0\xd3\x04\xa8\x1c\x2c\xf9\x54\xd9\xc3\xa8\x8a\x22\xe1\xd6\x7b\xbe\x0a\x85\x30\x84\x77\xf6\x29\x18\xc2\x5d\xb5\x04\xe4\x76\x2f\x0e\x3b\x42\x46\x00\x79\x08\xac\x70\x17\x79\x00\x6b\x77\xd7\x25\x10\xed\xc6\x9e\x17\xd0\xf6\x39\x4c\x77\xe5\x55\x18\x75\xa4\x46\xf8\x12\x33\x41\x5d\x0a\x91\xa0\x46\x0b\x51\xc4\x13\xd6\x44\xe8\x50\xf8\x55\x72\x81\xc4\x66\x99\xe5\x3b\x22\xa7\xc7\x3b\x06\x8e\xa3\x86\x52\xcf\xf3\xb0\xa7\xb8\xba\x30\x97\x1e\xab\x18\xfd\xbb\xd8\x73\x9e\xe1\xee\x0c\xd5\xcb\xfb\x7d\x5d\x41\x75\x7b\x63\x31\x27\x1f\xb7\x80\x97\x51\xe2\x03\x51\x3c\x99\x70\xf6\x6d\x91\xbc\x0c\xe0\x62\xf4\xfc\xb2\x8b\xe0\xa6\x99\x86\x7b\x79\x59\x4c\x64\x58\xa0\xd3\x07\xac\xac\x91\xf4\x13\xc4\x61\x58\x77\xdc\x53\xe1\xb0\x18\xda\x5c\xfc\xe1\xb6\x3f\x40\xbe\x1e\x55\x27\x4c\x43\x74\xcd\xfc\x21\x52\x44\x99\xa6\x83\xa2\x31\xad\xef\x77\x9d\x19\x21\x44\x0e\x5d\x3f\xdb\xd5\x03\x3d\xc9\x83\xcf\xc9\x31\xab\xe6\x38\xc3\x5d\x5a\x95\x86\x9e\x9f\xe3\xd9\x3e\xb9\x0b\xd1\x86\x1f\x85\x5c\xe1\xf6\x08\xb7\xbc\xad\x6b\x5e\x1b\xd9\x7e\xdc\x95\xed\x5d\xdc\xbc\xb7\x15\xd9\x19\xf5\xff\x77\xdf\x2d\xa4\x38\xf7\xa3\xa9\x82\x86\xdb\xd5\xb6\xe0\x43\xfc\x73\x72\xf6\x97\x04\xf0\x9d\x86\x55\x30\xf4\xf0\xed\xd3\x30\x0f\x18\x5b\x6d\x73\xd8\x71\x6d\x32\xd3\x2b\x1c\x9a\xc2\xdd\xf4\xf9\x02\xd3\xf2\x16\xd3\x5a\x33\xf3\x68\x09\x5d\xed\x10\xbe\x94\xbb\x53\xd6\xf2\x56\x56\x0f\xac\x2f\x4a\xf0\xed\xf5\xc5\xc7\x02\x14\x37\x77\x12\x6e\x7d\xe3\x2d\x07\x49\x39\x32\x66\x21\x29\xba\x0e\x7f\xc7\xcf\xb3\x6f\xd2\xca\x53\x16\x46\xe8\xcd\x22\x11\x85\x4f\xc5\x10\xaf\x3b\x1e\x8c\xaf\xde\x7a"}, +{{0xbc,0x3b,0x1e,0x0b,0xf8,0xd6,0x9e,0xa5,0xb4,0xcb,0xbf,0x10,0xbb,0x33,0xfc,0x95,0x5a,0xdc,0xbe,0x13,0xfc,0x20,0xaf,0x8a,0x10,0x87,0x2c,0xe9,0xdf,0x39,0xd6,0xbd,},{0xac,0xcd,0x26,0x28,0x15,0x59,0x19,0xbb,0xc7,0xf9,0xd8,0x6f,0x91,0xda,0xfe,0xc3,0x5c,0x71,0x1a,0x78,0xc7,0x9a,0xd3,0x60,0xed,0xdb,0x88,0xfa,0x8a,0x18,0x0b,0x2d,},{0x6e,0xf7,0xf0,0xe9,0x1f,0x2c,0xc6,0x71,0x5f,0x8e,0x5a,0x98,0x57,0x4b,0x44,0x00,0xc2,0x61,0xa6,0x43,0xe0,0x54,0x5f,0xf2,0x67,0x47,0xf8,0xe1,0x73,0x98,0x99,0xd7,0x66,0x40,0xb6,0x45,0x1c,0x43,0xc1,0xd0,0x3a,0x47,0x75,0xb5,0x4f,0xcf,0x9b,0xce,0x18,0xed,0x3f,0xcc,0xad,0x33,0x8b,0x77,0x64,0x02,0x4f,0xdf,0xa2,0xde,0x82,0x01,},"\x4c\x73\xe0\x4a\xbe\x08\x19\xde\x1f\x84\xd7\x05\x41\xeb\x1b\xb6\x1c\x4f\x42\x92\x0e\x1f\x2d\x1d\x9e\x62\x81\xa8\xa2\xe8\xb3\xeb\x45\x53\x7d\x83\x96\x90\x27\xf9\x9e\xf0\xea\x27\xca\x08\x5b\x13\xf9\xdb\x48\x0f\x00\xc0\x2f\x3f\xd7\x42\x9d\xd5\x67\x70\x89\x53\xbb\xf3\xb9\xe8\xe2\xc6\xac\x4d\x32\x1f\xf8\xf9\xe4\xa3\x15\x47\x23\x08\x5a\x54\xe9\xc9\x57\x3c\xc7\x35\x0c\x09\xf8\x97\x3f\x94\x8b\x08\x73\x03\x73\x59\x7a\x5f\xd0\x34\x98\x21\xae\x0a\x3c\xd6\xc8\x49\x92\xb1\x89\x12\x8f\x34\x90\x98\x7e\x1e\x9a\xd4\xf6\x57\x4c\xa5\x38\xfd\xfd\x83\x28\x4c\x1e\xb0\x95\x3f\x24\xc0\x8f\x74\x93\x2d\x43\x64\xdb\xbe\xf9\x22\x54\x24\x40\xda\xe8\x04\x24\xa9\x2e\xae\xf2\x7c\x18\x89\xbd\x08\xc4\x4f\x9d\xf0\x3a\x3a\xf3\x0d\xff\xb4\x8f\xae\x44\x5e\x62\x5f\x4d\x92\x65\xcf\x38\x7a\x1d\xa3\x5f\xe4\xc2\x31\x50\x45\x35\xdb\x72\xea\x81\xa1\x86\x80\x5f\x85\x6e\xbe\x6a\x6a\x65\x24\x14\x32\x53\x0f\xe6\xc9\x60\xc5\xf9\xbe\x6c\x22\x95\x70\x60\x30\x4e\x9d\xd8\xef\xbc\x1e\x48\x2e\x7d\xdb\xd8\xaf\x03\xbf\x23\x82\x89\x9c\x98\x6d\x91\x66\x11\xe4\xf2\x7a\xe5\x2f\x81\x7e\xf0\x1b\x6a\x14\x1f\xe4\xf6\x85\xd9\x4d\xc8\xcd\x52\x83\x00\x43\x93\x45\x87\x70\x4c\x1e\x64\x2e\x8f\xe5\x6b\xe6\xd6\xb8\x5b\xf4\xa6\xfe\xb2\xb6\x85\x8f\x1f\x00\x7f\x99\xd3\x9e\xa0\x4c\x9f\xe5\xfa\x7e\xf1\xb9\x1f\x49\x5e\xd0\xe7\xfa\x42\x13\xdd\x68\xce\xa4\x2b\x67\x29\xf9\x50\x31\x90\x7e\x27\xc4\x40\x98\x09\x43\x86\xfa\xbf\xb0\x4a\xb9\xb4\xde\x3d\x68\x61\xde\x46\x23\x12\xc5\x9b\x27\xc7\x6f\x7b\x6a\x4f\xc7\x1e\xa0\xd5\xda\xf6\xb7\x32\x05\x21\xa6\x7e\x5c\xb3\x75\x04\x97\x6a\xd7\x3d\xae\x2d\x64\x9f\xeb\x75\xe2\xea\xdd\x34\x01\xa7\xf2\xf3\x6e\x16\xdf\xbf\xbd\xb2\xaf\x57\x16\xcb\xa1\xbc\xe2\x0c\xd4\x7c\xe1\xc1\xd7\xbe\x00\x69\x70\x01\xfb\xbe\xb4\x91\x5a\xa6\xe5\x39\x3b\x5a\xb2\x0e\x0f\x31\xf5\x11\x91\x49\xa2\xcb\x4c\x4d\x45\x2c\x81\x56\x11\x3a\xc7\x82\x4f\x84\xf0\x9a\xeb\x81\x20\x2e\x8d\xd3\xda\xc0\xaa\x89\x39\x9b\x5a\x38\xb1\xe2\x18\x30\x19\x60\xa3\x7d\x52\x63\x2e\xea\xef\xe3\x68\x74\x55\x46\x42\x88\xeb\x17\xd9\xe1\x9a\x3a\x72\xed\x9d\xe3\x2c\x17\xbe\x79\xa3\xb9"}, +{{0x10,0x71,0x8f,0xa6,0xe2,0xd7,0xf6,0xed,0x38,0xfd,0x66,0xcb,0x6d,0xbf,0xa0,0x87,0xe8,0xf1,0xe8,0xa8,0xa2,0x4f,0xab,0x58,0xd7,0x9d,0x79,0x54,0xb8,0x72,0x0c,0x3e,},{0x87,0x0d,0x4f,0x66,0x6d,0x06,0xfd,0xa9,0xf9,0x51,0x1b,0x58,0x60,0x2e,0xec,0x05,0x0d,0x75,0x4e,0xa6,0xd8,0xe7,0x9c,0xdd,0x19,0xf6,0x01,0xc4,0x77,0xdf,0x1a,0xa0,},{0xe1,0x65,0x91,0x86,0xf1,0xf7,0x6f,0xe4,0x3a,0xc8,0xa1,0x17,0x03,0x36,0x0f,0xbe,0xff,0x53,0xb5,0xe5,0x7b,0x59,0x74,0xaa,0xa0,0x8e,0x25,0x75,0x57,0x9c,0x27,0x08,0x4c,0xf6,0x80,0x2e,0x7c,0x20,0x63,0x47,0x31,0x44,0x75,0xb6,0x03,0x19,0x74,0x94,0xe7,0xd6,0x1f,0xe4,0xb1,0xee,0x7b,0x78,0xe1,0x8d,0x94,0x46,0x93,0x52,0xdf,0x0c,},"\x41\x25\x9b\x6e\xef\x13\xd6\xff\xe3\x3c\xdd\xe7\x99\xb9\x95\xc4\x0b\xe7\x82\xcf\x97\x84\x40\xb6\x6b\xe5\x1c\x44\x05\x82\xab\xd4\x2f\x52\x66\x96\xbb\x3c\xb9\x22\x65\xb1\xed\x0e\x4b\xba\x76\x4c\xae\x28\x39\x83\x0a\x25\x26\x35\xdc\x80\xce\x5f\x73\xd5\x21\xb3\xd6\xff\x03\xac\x30\xe1\x98\xad\x20\x56\x7e\x75\xa3\x4f\xa8\x25\xeb\xf9\x84\x15\x08\xda\x84\xcd\x67\x42\x36\xca\x7b\x43\xde\x35\x64\xc9\x4a\xb0\x79\x40\x8f\xd9\x41\x37\xce\x3f\x90\xa5\xdd\x5d\x3a\xc3\x9a\x05\xec\x86\x71\x5a\x8f\x02\x5e\x45\x39\xa7\x64\x0a\xb8\x88\x36\xf4\xef\xba\xbd\x5e\x16\x52\xc4\x9e\xa2\x16\x13\xac\xfe\x34\x3a\x88\x0e\xe5\xa4\x2f\x2f\x91\x34\xef\x4e\x37\x16\xb1\x6d\x13\x4a\x9c\x4c\x71\xc3\x9b\x3c\x1a\x85\x7d\x3c\x89\x43\x97\x83\xee\xf1\xed\xd7\x1b\xf4\x49\x2d\x05\xfd\x18\x67\x3a\x52\x42\xff\x41\x87\xb9\xde\x47\xad\x49\x68\xda\x49\xdb\xa5\xa6\x09\x2e\x95\xea\x27\xdd\xfc\x74\x48\xdc\xf5\x97\x2d\x9d\x22\x8d\x63\xe5\x29\x1b\xa6\xe6\xfb\xd0\x7e\x32\x41\xf9\x36\x6c\xa4\x97\x6b\xb0\x4b\x22\xd0\x1f\x0d\xba\xe7\x94\xfa\x9c\x1d\x90\x29\xf8\x8a\x83\x60\x2b\x0e\x0e\xc5\x5e\x22\xc3\x7b\x20\x11\x25\xca\xdb\x53\x41\xef\x73\xf6\xda\x1a\xbb\xe2\xb1\xc4\x75\xf0\x75\x03\x45\xb1\xbe\x42\x59\xd8\xc2\x85\x31\xff\xe7\x78\x86\x67\xc4\x10\xda\xc3\x39\x91\x8c\x86\x9b\x00\xab\x80\xf2\x0b\xf7\x99\x0d\x36\x6f\x9b\x3d\x5e\x8e\xb2\xf4\x8d\x7e\xd0\xe6\x4b\x85\xdc\x9f\xe3\xbb\x99\x8b\x1e\xec\xd1\x23\x1e\x90\x2d\x2d\x15\x2e\x09\xda\x2d\x25\x92\xbd\xb3\x2c\x8c\xd2\xe2\xc4\x89\x49\x6b\x29\x80\xc0\x3d\xbb\x09\xec\x7f\x8a\x4e\xa2\xc7\x02\x0f\x2a\x0f\xaa\x65\x7c\xd6\xce\xd4\x8d\x6d\xa2\x78\x64\xcf\x5e\x97\xee\xa9\xb3\xc2\xf0\xf3\x4a\xbf\x8d\x87\xbd\x2a\xde\xb6\x0c\x72\x72\xfc\x43\x06\xd9\x55\xbd\xc8\x02\x3d\x7d\x3d\xc2\xf3\xda\xfe\x9e\xbe\x8a\x8d\x13\x89\x65\xa7\xf6\xce\x93\x51\x7c\xd2\x09\x96\x63\xf6\x7c\x34\x55\x21\x76\xdd\xb5\x95\xac\x6e\xa5\x60\x9f\xeb\xcf\x24\xc7\xd6\x9d\x41\x27\x09\xe5\x78\x67\x0a\x21\xac\x8a\xfc\xcb\x8b\xf2\xb1\x8f\xf3\xaf\x7d\xe2\x1d\xc7\x1d\x50\xd6\x0d\x37\xb6\xed\x72\x9d\xb0\x4b\xef\xf7\xd3\x4b\x29\x20\xd8\x75\x51\xce\x15"}, +{{0xc1,0xd4,0x72,0x4c,0x6c,0xb1,0xbc,0x67,0x23,0xb2,0xb4,0x30,0x34,0x27,0x8b,0x3c,0x5b,0x48,0xfe,0xd7,0xf8,0xa3,0xcc,0x23,0x18,0x03,0x3e,0x75,0x52,0x04,0x73,0x51,},{0xc2,0x7e,0x39,0x2e,0x7c,0x36,0x64,0xb9,0x06,0x1e,0xa7,0x6d,0x25,0x75,0xdd,0x7c,0x41,0xea,0xf1,0xda,0x3a,0x65,0xf3,0xa9,0x86,0xe0,0xa5,0x7f,0x6c,0x40,0xc1,0x7e,},{0xd3,0x7a,0x6e,0xc8,0x2e,0xd4,0x5c,0xa9,0xb4,0x85,0x5d,0xe9,0xcb,0x94,0x25,0x64,0xe8,0x83,0xff,0x70,0xa7,0x9b,0x8e,0x71,0x2d,0x5f,0x60,0x4e,0xc8,0x97,0x4d,0xe5,0x36,0x3a,0xc8,0x49,0xcb,0xab,0x28,0xe7,0xae,0xef,0xf2,0x8e,0xd3,0xf2,0xd1,0x4b,0x60,0x8b,0x31,0x46,0xc2,0xef,0xe0,0x73,0x5a,0xd8,0x15,0xc7,0xd7,0x5a,0x1a,0x01,},"\xde\xee\x99\xd7\xa7\x7d\x43\x00\xc1\x7a\xec\x1a\xb3\x23\xc5\x71\xc6\xe9\xe7\x3a\x43\x49\x1a\x3c\x78\x88\xb7\x6f\xc0\x3e\xc4\x3d\x07\xaf\x42\xa0\x5a\x2a\xa3\x22\xd0\x0c\x85\x60\xac\xef\x31\x41\x06\xb1\x0b\x9b\xd1\x26\x54\x35\x7f\xfa\x26\xf2\x39\x00\x50\xda\x63\xd6\x68\xc9\xe2\xdf\x54\x8f\x87\x63\x9e\x09\x6a\x35\x85\x3f\x82\xe7\x61\xfd\x71\x1d\x2a\x26\x54\x38\xf5\xd4\xdb\x5e\x32\x77\x57\x08\x15\x0d\xa6\xcb\x68\x6a\x2b\x4c\xa2\x11\xd7\xf0\x0d\xc0\xab\xcb\x2c\xa1\x50\xe7\x91\x11\x6a\x10\xa5\xef\xcf\xf3\x51\x4d\xab\x8e\xd8\x0a\x70\x92\xc3\xa0\x15\x15\x2c\xb2\x5d\x9f\x86\xec\x0d\x1c\xa6\x7d\xda\xb4\x4d\x64\xee\xb1\xf9\x31\xbf\xab\x2a\xb1\x88\x95\x6c\x74\x3d\xb4\x81\x48\x08\xc5\xcd\xe1\xb0\x74\x5b\x3e\xdd\x34\x0e\xb0\x3f\xfc\xc8\x0a\x78\xf3\xdb\x31\x0f\x4f\x5c\x20\x00\x9f\xc0\x27\x9c\x2c\x1b\xcb\x3c\xed\xf9\x90\xbd\x0e\x20\xc6\xf9\xfb\x75\x15\xad\x6e\x93\x3b\x07\xe9\x9d\xa6\xac\x32\xb9\x71\x41\x18\x7e\xf6\x3b\xdb\x10\x62\xe3\x72\x20\xa4\xdc\xd4\x19\xd6\x24\x4c\xdc\xc3\x4e\xa4\x1d\x0b\xcb\xc3\x13\x8b\x1d\x54\xae\xfc\x01\x90\xe3\x0b\x18\x7d\xb0\x73\xaa\x7d\x6c\xfe\x04\xbd\x3f\xd2\xac\x00\x31\x3e\x3d\xdd\x64\xa1\x81\x93\x5c\xa4\xb8\xb2\xa8\x5d\x36\xbc\x27\xd9\x7b\x76\x26\x76\x7b\x93\xee\x38\xde\xf8\xb6\xb2\xc8\xda\x9b\x00\x26\x36\x14\x34\x2f\xaa\x9d\x3e\x73\x8d\x27\x13\xc4\x5f\xfb\xee\xf8\xc8\x4b\xcd\xbc\x8d\xa4\x30\x9c\x84\x45\x53\x0f\x5c\x61\x7d\xc8\x66\x25\x1f\x54\x89\x50\xa1\x4f\x07\x5a\xa3\x11\x7f\x96\xe4\x1f\x89\x9d\xbe\x73\x40\xb1\xd9\x0a\x13\x52\xd3\xb8\xfb\x41\xb7\x9f\x16\xa8\x2b\xc2\xe4\xa1\x93\xb8\xa7\x23\x24\x00\x99\x6b\x73\xb1\xfc\x00\xb2\xec\x1c\x66\x75\x77\xf8\x28\x24\xd3\x9f\xb7\xf6\xe7\x69\x2d\xcd\x97\xb1\xd8\xce\x94\x08\x3c\xa1\x97\xe9\xa5\xd4\x0f\xad\xff\x0b\x9a\xc5\x7e\x9d\xe7\x61\xc1\x56\xe6\xd3\x1d\x52\xc3\x32\xd5\x13\xe9\xf5\x86\x97\xdc\xbd\xd8\x0a\x5e\x42\xc5\x51\x70\x2c\x3d\xe7\xbe\xcc\xc3\xdb\x84\x5b\x1a\x04\xc8\xcb\xd4\x16\x95\xea\x74\x28\xab\xba\x89\xe0\xdc\xe3\xe3\xd9\xe7\x02\x30\xae\x91\x47\xc2\xb8\x85\x59\xdc\x69\x5d\x68\x09\xa5\x1c\xcb\xc1\xdd\x9e\x08\x9c\x58\x5f"}, +{{0x37,0xc0,0x70,0xd4,0xa5,0x3b,0x13,0xbe,0x76,0x06,0x35,0x11,0x0d,0x1b,0xd4,0xf0,0x19,0x20,0x22,0x5a,0xfa,0xbe,0xc5,0x76,0xfa,0xae,0xc9,0x10,0xf2,0x92,0x6d,0x1a,},{0x0a,0xa8,0x5f,0x2a,0xb1,0xdf,0xf8,0x95,0xd1,0xfa,0xd0,0xc1,0x19,0xf2,0xbf,0x57,0x12,0x6a,0xab,0x60,0x1c,0x52,0x8d,0x37,0x69,0x8e,0x97,0x70,0x2d,0x35,0xf5,0x25,},{0x9d,0xa6,0x0c,0xc4,0xa6,0x4d,0x07,0xde,0xe1,0x34,0x6b,0xd3,0xd3,0x01,0x09,0x95,0xce,0x27,0x38,0x20,0x8a,0xb3,0x5b,0x34,0xc2,0xa8,0xfd,0x17,0x87,0xae,0x3a,0x1e,0x20,0x7f,0xe7,0x84,0x52,0x51,0x54,0xfa,0xe4,0xf5,0x79,0x4c,0xd8,0x50,0x30,0x45,0xfe,0xa8,0x5c,0xf7,0x7f,0xd9,0x2f,0x6a,0x70,0xcd,0x0c,0x5a,0x52,0xc0,0x81,0x0e,},"\x10\xc6\x46\x44\x7f\x81\xad\x94\xd0\x15\xd8\x6d\x0d\x98\xb2\x45\x2d\xca\x60\xa4\x7a\xb3\x52\x64\x03\x5e\x33\xa0\x94\x2b\x95\x4e\x3e\x23\xb9\x1d\x81\x23\xb8\x59\x3c\x6a\xf7\xc8\xd3\xec\xd2\x90\xe0\xe5\xee\x36\xfd\x4e\x53\xb7\xbe\x63\x3a\x6c\xf0\x27\xa5\xac\x3f\x0f\x67\x9e\xb1\xbd\xd2\x10\xa3\x8e\xa6\xe4\x8b\x05\x58\xe3\x03\x01\x0a\xf4\x74\xe7\xf6\xdf\x2a\x4e\x45\x76\x99\xfc\x38\xe3\x69\x38\xb0\x5f\xfc\xaa\x1b\x69\x4e\x32\xf3\xd1\xb2\xcc\x5d\x00\xcf\x25\x6f\x12\x18\x4c\x87\x3e\x51\x90\x89\xec\x1d\xf1\x5b\x0d\xc7\x6e\x7b\xfe\x90\x78\x0d\xf5\x81\x36\xfe\x59\x7f\xce\x89\x4c\xa5\x63\xe0\x8e\xfa\x0f\x2d\x4d\x20\x8b\xed\xe9\xa8\x74\x88\x28\x73\xd2\x51\xba\xf0\x19\xfe\x46\xd1\xd6\x50\x4b\x3b\xcd\x24\x3b\x79\x53\x51\xf3\x4d\x2e\x76\x06\xaa\x97\x55\x28\xee\x50\xd5\x9e\xfb\x6e\xe6\x99\x2a\x89\xb2\x42\x69\x56\xc2\xca\x42\x47\xe0\xdf\x01\x29\x85\x29\x83\xe9\x76\x7a\x8e\xed\x1b\xc7\x33\x5f\xfc\xa8\xd0\x28\x9f\x04\x80\x7f\x67\xca\x7d\xa9\x71\xf5\x8d\xb8\xb9\xbc\x9f\xdb\xe4\xf8\x3c\xfe\x9a\x00\xf1\xca\x58\x47\x98\xbc\x71\xd8\x51\xff\x7c\xd6\xc5\x1b\x89\x90\xaa\xba\x4d\x38\xb4\x16\xb9\x22\x40\xdf\xb7\x0e\xe3\xc1\x2b\x5e\x73\x10\x57\x76\x2e\xf9\x08\x23\xfb\xf6\x83\xca\x06\xd0\x5c\x20\xd3\xae\x2b\x97\xa8\x3e\xbe\x70\xae\x17\xaf\xff\x9d\x16\x60\x9d\x54\x6d\x8d\x3c\x74\xbc\x28\x18\x84\x89\x4f\x3d\x49\xe0\x83\xf1\x0a\xe7\xc1\x1c\x1d\xca\x0e\xff\xef\xcf\xa6\xe0\xf1\x53\x50\x81\xfa\xc3\xa2\x81\x9f\xd2\xe3\x26\x55\x27\x18\x2a\xe9\xd3\x91\xb2\x32\xbb\x75\x42\xe6\x84\x55\xcd\x26\x77\x60\xdb\x65\x2d\x19\xe2\x2f\xb2\xed\x11\xcd\x13\x05\xba\x8d\x98\xc1\xeb\xf2\xd1\x96\x9b\x24\xd6\x4f\x3e\x31\x9a\xf7\x4e\x09\x20\x06\xd2\xa3\xff\x74\x48\x72\xa2\x0e\xbf\x18\xd1\x77\x48\xab\x71\x10\x80\x50\x96\xea\x13\x6b\xce\x2f\x96\x8b\x20\x5e\x65\x0b\x80\x3c\x53\x1d\x06\x77\x5a\xe5\xce\xea\x28\xbb\x92\xe9\xa0\xed\xec\x89\x51\xce\x20\x09\xa8\x8e\xe1\xb6\x4d\x9b\x9e\x89\xf6\x90\x51\x20\x33\x84\x21\x0a\x10\x2a\x44\xd2\xd6\x70\x31\x73\xb6\x85\x07\xdc\xea\xdd\x3b\xf6\x51\x0d\xf2\xa5\xce\xfd\x9c\x80\xe4\xf3\x85\xb2\xf9\xe6\x21\x58\x13\xed\x32"}, +{{0x11,0x26,0x49,0x6a,0x58,0x2c,0xe5,0x8d,0x3d,0x61,0x8d,0xd8,0xa3,0x93,0x35,0x47,0xaa,0x7a,0x8a,0x30,0xfb,0x54,0x06,0x3b,0x8d,0xfd,0xd3,0x16,0x71,0xc6,0xc7,0x3d,},{0xe1,0x02,0x29,0xc6,0x23,0xfa,0x8a,0xd8,0x98,0x2c,0x3e,0x4c,0x36,0xff,0x52,0xdf,0x0f,0x21,0x9b,0x57,0x91,0x5b,0x6e,0x98,0x0e,0x5f,0xe7,0x2e,0xa0,0x96,0x2e,0x22,},{0xb3,0x0e,0xb5,0x6c,0xa9,0xb1,0x20,0xbf,0x84,0x9a,0x3a,0x9d,0x56,0xaf,0x03,0x3d,0xe8,0xa5,0x90,0xc9,0xe1,0x24,0x0c,0x1e,0x36,0xdb,0xc6,0xcf,0x0a,0x71,0xb7,0x8a,0x11,0xec,0x14,0x3f,0xb9,0x95,0x9a,0x8f,0x25,0xb5,0x77,0x11,0xd6,0xa9,0x0a,0x67,0xe0,0x1b,0xe3,0xa4,0xda,0x2b,0x69,0x39,0x48,0x69,0xbb,0x8d,0x64,0xb8,0x7e,0x0f,},"\x6a\x4b\x52\xd7\x30\xdd\xab\x82\x9b\x2a\x17\x95\x90\xcb\xd4\xc3\x72\x49\x8e\x9f\x43\x99\x77\xc0\xa1\x0d\xc1\x3c\x0a\xe1\x73\x6e\xaa\xff\x06\x33\x71\x43\x4f\xd0\xda\x80\x36\x0e\xc5\x89\x06\x07\xd2\xfa\xe1\xc9\xa2\xe1\xab\x0b\x7f\x3d\x66\x7f\x5b\x1b\x9c\x41\x8f\x18\xb1\x0c\x9e\x6f\xd6\x69\xd3\xeb\xec\x16\x8e\xfe\xf4\x41\x63\xe5\x77\xa2\xeb\xd0\xf2\xcb\x76\x8f\x80\xc2\x31\x88\xe8\x60\x69\xe4\xd1\x0f\x41\x03\x06\xce\xdd\x7a\x34\x1a\x61\xe0\xf4\xf3\xbc\x25\x04\x1b\xc2\xf9\x22\xed\x07\x3e\x1e\x2f\x1b\x70\x9c\x57\x9d\x10\x63\x0f\x33\x07\x17\x54\xd7\x07\x89\x4a\x1c\x62\x19\x0d\xe1\x88\x82\xc5\x64\xdc\x4c\x01\xdc\x54\x5d\xd8\x96\x64\x04\xed\x78\xfa\x32\x67\xa9\x46\x9f\x63\xb6\x12\x0a\xbb\x65\xf9\xb3\xba\x3e\xee\x28\xd7\x9c\x2e\xb4\xe7\x02\x0c\xc6\x98\x7d\xfc\x5c\x29\x67\x2f\x8c\x0f\xa3\xe6\x90\xd5\x84\xfe\x00\x0c\x64\xf3\x52\x61\x01\x79\x62\x1b\xfd\x5f\xf3\xeb\x30\xd1\x8f\x1a\x02\x50\x41\x6d\xb9\x3b\x1c\x1e\x93\xcf\x8a\x36\x46\x51\x75\x60\xd1\xcc\x8f\xff\x82\x2b\x51\xef\x27\xb2\x00\xe9\x87\xb5\x92\x39\x07\x53\x45\x3e\xf1\x38\xbd\x3d\x29\xdb\x7c\xb1\xb5\xf4\x5e\x47\x95\xb8\x9c\x53\xf4\x97\x04\x19\x27\x52\x23\x7c\x6a\xb2\x74\x84\x9f\x95\x94\xee\x97\x77\xf6\xef\xe7\x04\x83\x12\x9d\x06\x7f\x97\x19\x9d\x9a\xe3\x60\x90\x70\x38\x64\xf7\xca\x47\x50\xa6\xf3\xb6\xff\x83\x82\x4c\x91\x04\x84\x39\x4d\x1e\x2e\xce\xba\x18\x44\x6f\xe4\xe9\x94\xce\x07\x43\x3a\x74\x0d\xdd\x05\xf0\xe3\x96\xd4\x82\x89\x4e\x6f\x14\xac\xf7\xb9\x7b\xae\x6c\x7e\xb8\x87\x03\x03\x9f\xa7\x85\xd6\x0a\x3a\xf7\x8b\x13\x24\x3a\x4f\x88\xdd\xe1\xd9\x98\x61\x7f\x2e\x3f\xa7\xea\xfc\x2f\x43\x5d\xd4\xac\x1e\xa9\xc2\x38\x40\x7a\xa0\x9b\x4e\xea\x8e\xd4\x34\x92\x7b\x40\x66\x74\xac\x27\x04\x58\xcf\xb3\xbf\x29\xc3\x47\xf9\x45\x59\x61\x31\x79\xb9\x50\x21\x92\x32\x1b\x88\xe9\xaf\x0a\x90\xe9\xa4\xab\x9e\xdd\xaa\xe3\x82\xe3\x73\x4d\x14\x15\xeb\xe3\x24\x99\xc3\x4e\x6f\xde\xaf\x15\xb0\xd9\x78\x79\x85\xe0\x8d\xfe\x49\x54\x60\xc5\x4f\x67\x43\xd8\x1f\xf1\x68\x81\xe5\xe3\x0c\x51\xf4\xb0\x92\x37\x37\x83\xf1\x24\x23\xc3\xe1\xae\x85\x91\x13\x0a\x26\x99\x80\xca\xa1\xcb\x5c"}, +{{0x9c,0x16,0x7a,0xff,0x3b,0x1b,0x78,0x8f,0x13,0x3d,0x42,0x2d,0xe8,0xca,0x9a,0x64,0x31,0x64,0x09,0xf9,0xe3,0x5b,0xfe,0x22,0x03,0x2e,0xc4,0x17,0xae,0x9a,0xbc,0x6d,},{0xef,0xb5,0x34,0xf0,0xd4,0x7c,0x06,0x8e,0x77,0xb2,0x8a,0x90,0x6d,0x95,0xad,0x8d,0x21,0x3a,0x4d,0x4f,0xc1,0xc7,0x05,0x42,0xf0,0x1e,0x59,0x6d,0x57,0xb5,0xf0,0x19,},{0xc9,0xae,0x67,0xfd,0x64,0x15,0xdc,0xba,0xb2,0x92,0xfa,0xb3,0x94,0xca,0x6c,0x3b,0x7d,0x90,0xca,0x24,0x4d,0xc6,0xa7,0x76,0x4e,0x74,0xfd,0x20,0x2b,0xf4,0xb2,0x90,0x5b,0xd2,0x03,0x0e,0x6b,0xeb,0x91,0x4c,0x3c,0x23,0x8d,0xb3,0x71,0xb1,0xcb,0xa6,0xd9,0x26,0x1a,0xa3,0x92,0xec,0x87,0x1a,0x4b,0x8b,0x12,0xfe,0x9c,0x1c,0x97,0x0e,},"\x68\xac\x0f\xc2\xb6\x07\xba\x38\xe3\x77\xfa\xe8\x45\xc8\x08\xc8\xf9\xfa\x61\x4e\xb1\xf3\x11\x58\xa9\x62\x0a\x93\x7d\x3e\x30\x1e\x85\xac\xaa\x69\x14\x4b\xc3\x49\xa3\x9d\xfb\x58\x20\x41\xc4\xa1\x97\xae\x99\xb4\xd4\xd5\x9b\x7a\x2c\xa3\xd1\x62\x28\xb5\x59\x1c\xbf\x57\xc1\x8a\x78\x1e\xfd\x19\x19\x3c\x47\xb1\x6c\x60\x23\xa3\xa8\xba\x3d\x66\x8f\x05\xa3\x7f\x1e\x83\xb0\xd7\xfe\xbd\xd1\x0f\x63\xe4\x8e\xf7\xa2\x0e\x01\x5b\x1c\x67\x25\xd4\xc3\x00\xa9\x86\xc6\x0e\x3a\x11\x54\x69\xc8\xe5\x2b\xa0\x5b\x51\xc0\x5d\x0a\xf4\x0d\x89\xfd\x9e\xd7\x6f\x36\x95\x0a\xee\x3c\x78\x19\x89\x8a\x90\x3c\xfe\x03\x61\xa9\x1c\x69\x10\x0b\x49\x51\x41\xe8\x6e\xe7\x9d\x63\xd1\x74\x03\xfb\x1a\x16\x29\xef\x63\xcb\x7e\x9d\x27\x20\xcb\xff\xf0\x00\x2b\x19\x0b\xcd\xc2\x67\x94\x12\x4d\xd3\x8d\x42\xbc\xaa\x71\x75\x40\x5e\xb0\xbb\xcf\x8e\x37\xd6\x5d\x05\xa3\x71\x95\xb4\x79\x37\x1f\xa2\xbb\xbb\x16\x7d\x91\xce\xe8\x82\x35\xdd\x72\xea\x88\xfc\x73\xce\x3c\xe4\x3d\x33\xb7\x15\xf2\x5f\x19\x2e\xc2\x15\xda\xc1\x24\x89\x9c\x5e\x75\x86\xe8\x63\x40\xd8\xcb\xe5\x37\x35\xde\xfb\xe0\x2e\x4c\xc9\xfd\xe6\x9f\xb9\x79\x4d\x1d\xb7\x2b\x98\xc0\xf1\x97\x66\xee\x51\x38\xbb\xfa\x78\x90\x9a\xa2\x99\xb4\x91\x3c\x49\x9d\xea\xf5\x4b\x48\x41\xd5\x04\x48\x29\x98\x49\x36\x70\x0d\xcf\x92\xf3\x65\x42\xb2\xfc\x7e\x86\x44\x1b\x99\x25\xf5\xd0\xb7\x8c\x17\xa8\x5c\xfc\xfc\xb2\x0b\x0f\xd7\x51\x34\x9c\x27\x46\x3a\xbd\xe4\xd2\x7d\xf7\x42\x65\x28\x87\x13\xf9\x6d\xea\x01\x3b\x94\x55\x21\x80\x8b\x49\x96\xb1\xb2\xdc\x03\x38\xb6\xd2\x36\xef\xd6\xd2\xb2\x7d\xaf\xda\x46\xec\x5f\xa3\x2b\x96\x5e\x8b\xb5\xe8\xbb\x61\xbd\x96\x6e\xde\xb7\x74\x68\x1e\x0e\xa8\xc1\x7b\x8c\x99\xfa\x7d\x66\x0f\x0f\x66\xc9\xbc\x6d\x95\xcb\xd7\xdc\x09\x47\x24\x09\x8e\xb0\x51\x91\xb5\x3a\x3d\xf6\x56\x6b\x9c\x90\xe0\xd7\xdf\xf2\x94\x38\x48\xb6\x1a\x20\xd4\x8c\x22\xb6\xd3\xc9\x58\xe2\x93\xd7\x09\xc8\xf4\x81\x10\x23\x0f\xf5\x19\x18\x56\x28\x77\xda\xf6\xd9\x20\xc8\x5a\x82\xe0\x7c\x45\x1f\xe7\xae\x97\x59\xc0\xa7\x7e\x97\xbb\x29\x8b\x5d\x05\x92\xa4\x1d\x08\xf6\x7a\x4e\xd5\xa1\xbb\x41\xe9\x37\xb6\xa6\x8a\xeb\x38\xfd\x5b\xe9"}, +{{0xe9,0x94,0x88,0x05,0xeb,0x34,0x1b,0x28,0x67,0x47,0x9c,0x66,0x8f,0xd3,0x53,0x2c,0x30,0x99,0x41,0xc0,0xad,0x4c,0xb2,0xe5,0x42,0x31,0x75,0x6e,0x6a,0x1b,0xde,0xcb,},{0x54,0x47,0xa8,0xe3,0x4d,0x6a,0x64,0x00,0x02,0xd8,0xd6,0x0b,0xcf,0x1d,0xdc,0x71,0x1e,0x4c,0x46,0x5c,0x94,0xc3,0x4b,0x50,0xbd,0xef,0x35,0x89,0x60,0xff,0x81,0xf1,},{0xd3,0xdc,0x62,0xd6,0xce,0x9c,0x76,0x6f,0x2a,0xba,0xf9,0xa7,0xfb,0xe0,0x9d,0x6b,0xdb,0x07,0xa4,0x74,0x7b,0x56,0x08,0x0d,0xb0,0x9b,0xeb,0x4a,0x4e,0x80,0x4a,0x70,0xd7,0xdd,0xf4,0x11,0x94,0x75,0xc7,0xbe,0x83,0x4f,0x31,0x95,0x6f,0x4a,0x71,0xda,0xd0,0x29,0xcd,0xf2,0x36,0x3d,0xd0,0x36,0x5c,0xe2,0x2d,0xc2,0x7f,0x07,0x80,0x03,},"\x91\xcf\xfd\x7e\xb1\xcf\x6b\xd4\x75\x6b\xce\x6a\x30\xaf\x9d\xfb\xa2\x6d\xdd\x1c\xce\x03\x94\xc1\x94\xa3\xe3\x9c\xc3\xd1\xcb\xc2\x21\xb7\xeb\x70\xbe\xa1\x8d\x29\xc2\x67\x45\x71\x76\xa3\xc9\xe5\x3c\x18\xe4\x7d\x10\xa6\x7c\x46\x45\x05\x19\x77\x02\xe6\xb2\x47\x0d\x38\x86\x9d\xb5\x17\x4b\x15\x8f\x99\x92\xe4\x43\x5d\x02\x24\x6f\x54\x02\x58\xde\xdd\x3c\xe3\x3d\xf5\x82\x55\x5a\x68\x1f\xb7\x6e\xca\xcc\xb1\xc2\x98\x9b\x17\x7e\x3b\x7e\x45\x4a\xaa\x52\x9d\xe5\x9b\xf5\xa0\x31\x23\xd5\x71\xdf\x2e\x7f\x7c\xb8\x30\x80\x5c\x58\xb7\x4a\x65\x3b\xac\x0e\x5a\x88\x8e\x08\xdc\x22\x36\xd6\xcd\x49\x6a\xa0\x6d\x0d\x67\xcf\x3b\x33\x5e\x21\x8c\x49\xde\xda\xd8\x2f\xc1\xbe\x9e\xf2\x0c\xac\x61\x90\x5c\x30\xeb\x13\x2d\x73\x9b\x16\xca\x8a\x8c\x90\x66\x19\xc0\xe0\xd8\xb3\x39\x85\x32\x7e\x36\xf3\xd4\xb8\xfd\xa3\x87\xc1\x86\xcc\x50\x44\x31\x04\xdb\x76\x1f\x7f\xf9\x30\x12\x70\x20\x4a\x71\x3e\x58\x90\x21\x01\xfa\xd0\x00\xce\x93\x16\x47\xc5\x77\xfd\xec\x14\x8d\xca\x95\xcd\xc0\x89\x18\xeb\xed\x03\x7c\x60\x33\x2f\xad\xf0\x88\xf0\x36\x08\x3e\xbc\x92\xe1\x73\xb7\xdd\xcc\x30\xc4\x93\xf2\x7e\x69\xcd\x17\xa2\x0d\x30\xb7\x8f\x83\xa7\x2e\x4f\x5a\x74\x7d\x86\xd9\x6c\x5e\x1b\xb7\xa4\x38\x16\x62\x04\x01\x3e\x21\x64\xd6\xaa\xbc\x0d\x56\x2f\x54\x01\x5c\x36\x5c\x80\x44\x56\x07\x14\x5e\x56\x92\xee\x34\xf6\x35\x30\x77\xfa\xb7\x45\x2d\x88\xce\x3e\xb0\x1d\x2b\x37\x97\xdc\x91\xb3\x41\xa3\xa7\x26\x30\x15\x16\xba\xae\x18\xe8\x51\xf7\x4d\xfb\xdf\x08\x66\xbb\x23\x76\x86\x7d\xe5\x52\x31\xe3\x62\xc4\x72\xc5\x21\x16\x54\x4c\xd4\xf8\x1e\x93\x57\x1c\x4e\xc8\x20\xe7\xe6\x53\xf4\xe2\x1b\xe0\xa9\x42\x57\x6c\x9d\xe9\x1e\x7d\x12\x51\x68\x3d\x85\x9d\xe4\x48\xf8\x22\xdc\xf3\xd2\xcf\x55\xed\xe2\xf9\xc7\x1b\x60\x63\xd1\x37\x30\x61\xf8\xf5\x93\x6b\x69\x8d\x13\x84\xe6\x54\x59\xea\x2b\xc2\x6e\xc9\x67\x75\xef\x42\x52\x07\x43\x2d\xda\x0a\xc1\xfe\x28\x52\x6c\x5e\x45\x59\x34\x9c\x3d\x8d\xf9\x91\x82\x30\xf4\x04\x46\x83\xcc\x2c\x1b\x85\x8d\x14\x1a\xb8\xd0\x80\x5b\xb9\x33\x60\x67\x52\x2a\xa8\x9c\x81\x0f\x3e\xaa\x7a\xc2\xd8\xdd\x28\xc3\x75\x12\x25\xa1\x9e\xce\xc8\xbc\xca\x52\x43\x99\x46"}, +{{0xb0,0x17,0x53,0xef,0xa7,0x3b,0xb3,0xde,0x7a,0xa7,0x78,0xbe,0x7a,0xfc,0xbf,0xf6,0x6a,0x5d,0x3e,0x2c,0x2f,0x8b,0x5a,0xa2,0xb0,0x48,0x84,0x40,0x50,0x99,0x69,0x65,},{0xd0,0xcc,0x6c,0xf1,0x09,0xc9,0x99,0xfb,0xf6,0xd1,0x6f,0x47,0x1f,0xaf,0xd0,0x23,0x2b,0x0a,0x68,0xd4,0xc4,0x64,0x06,0xec,0x75,0x45,0xdb,0xab,0xa8,0x19,0x41,0x58,},{0x16,0xb7,0x42,0x12,0x27,0xae,0x09,0x13,0x06,0x85,0xcb,0xb1,0xa0,0xc6,0x0a,0xa5,0x7a,0x5e,0x1a,0xfe,0x1b,0xbe,0x6b,0xac,0xea,0x0c,0x28,0x1b,0xcc,0x89,0x98,0xe6,0x82,0x4a,0x77,0x2c,0x32,0x08,0xa6,0xb6,0xb4,0xd2,0x36,0x69,0x55,0x05,0xc9,0xbe,0x82,0x70,0x0c,0xf9,0x3a,0x78,0x39,0x85,0xa3,0x9e,0x16,0xe3,0x77,0xa7,0x41,0x0e,},"\x68\x4e\x61\x2f\x27\xee\xad\x0d\x34\x84\x4c\xc8\x1b\xa9\x11\xc2\x8a\xaf\x6d\x66\xe7\x12\x29\xe8\xcc\x34\x62\xf7\xc7\xa0\x50\xda\xa3\x0c\xb7\x44\x71\x15\x0f\x07\xda\xd4\x59\xb5\xa9\x13\x58\x47\x6c\x05\x98\x25\x5d\x8a\x64\x2d\xd7\xc0\x80\x28\x11\xbd\x88\xe4\xca\xc5\x97\xef\xe4\x1e\xbd\x96\xcd\x0f\x3b\x5c\xe7\x2d\xb4\xbe\x1a\x3d\xbd\x6b\x84\xf5\x44\x6e\x3d\xa6\x00\xd3\xb1\xd2\xb4\x60\xa0\x09\xbd\x31\xca\xcd\x98\xa9\x15\x18\xce\x33\xe9\xa7\x03\xd4\x04\x28\x87\x36\xcc\xc4\x31\x03\xfc\x69\xe6\x79\x74\xf3\x16\x52\xfa\x3d\xad\xef\x33\x37\xf6\xc8\x97\xa3\xd2\x01\x30\x3c\x8f\x03\x59\x7b\x4a\x87\xc9\x8f\x29\x1c\xcd\x58\xa3\xf1\xe8\x98\x33\x2a\xa5\x99\x3b\x47\xfc\xb5\xdd\xaa\x1c\x08\x68\xb6\x43\x74\x2d\x0e\x4a\x4b\x9c\xd4\x27\x03\x8b\x3b\x74\x99\x9b\xc8\x9a\xc3\x48\x4c\x0c\xa1\x3f\x25\xaa\xe8\xe7\x8a\xe1\xcc\xee\x62\x18\xac\xca\xb8\x1a\x4f\x69\x4f\x53\x24\xa3\x47\x62\x9d\x49\xb5\x5e\x40\x37\x50\x4a\x9a\xcc\x8d\xf5\x8c\x68\x41\xdd\xdc\xd4\xfc\x43\x47\xf7\xb6\xf1\xfd\x9d\xe0\x56\x45\x77\xe6\xf3\x29\xed\x95\x1a\x0a\x6b\x91\x24\xff\x63\xe2\x2e\xb3\x6d\x3a\x88\x63\xbc\x1b\xf6\x9c\xea\x24\xc6\x05\x96\x7e\x7d\x89\x48\x95\x3f\x27\xd5\xc4\xc7\x5f\x08\x49\xf8\x72\xa3\xe3\xd1\x6d\x42\x2f\xa5\xa1\x1e\x1b\x9a\x74\xdf\x6f\x38\xb9\x0f\x27\x7d\x81\xfc\xe8\x43\x7a\x14\xd9\x9d\x2b\xef\x18\x9d\x7c\xac\x83\xdd\xc6\x13\x77\xed\x34\x8b\x3c\x4f\xc0\x9e\xc2\xb9\x00\x59\x25\xd0\x4a\x71\xe2\x6d\x64\x16\x67\xbd\xf5\x49\x29\x43\x31\xc6\xea\x01\xcd\x5c\x0b\xd1\xb6\xa7\xec\xfd\xa2\x0b\x0f\x19\x29\x58\x2b\x74\x69\x7c\xb2\x62\xc3\x92\x7d\x6b\x22\x3f\x4b\x5f\x30\x43\xaa\x6e\xb4\x57\x1a\x78\xe9\xda\x11\xc2\xb3\x6f\x64\x55\x25\x80\xca\xa7\xb5\xfa\x6b\x90\xf9\x29\xe0\x16\x2e\x60\x8d\x12\x40\xd7\x24\x2c\xd2\xf4\x70\x25\xc0\x3d\xeb\xe0\x59\xb1\xdc\x94\x77\x02\x32\xbc\x67\x65\x14\x84\x80\xbb\x1d\x9f\x50\xda\x1e\xe6\x44\x8c\xf9\xc8\x8b\x19\xdd\x45\x99\x32\xc0\x6e\xd8\x11\xc4\xa6\x4a\x12\xd5\x93\x8b\xd1\xc7\x57\xbc\xfa\xea\xee\x89\x33\xfe\x5f\xff\x21\x76\x3d\xe7\x40\x48\x2b\xcf\x1b\xa5\x9a\xfd\xc8\xfc\xf8\x73\xc3\xd5\x07\xbb\x39\x4e\x32\xe4\x5f\x73\x65\x19"}, +{{0x4f,0x4b,0x20,0xd8,0x99,0x36,0x6f,0x2f,0x23,0xee,0x62,0x8f,0x22,0x9b,0x23,0x6c,0xf8,0x0f,0x43,0xba,0x18,0x31,0x77,0xc9,0x7e,0xe3,0x48,0x29,0x54,0x6f,0x17,0x42,},{0xc9,0x45,0x76,0x64,0x1f,0x4a,0x89,0x3c,0xdf,0xce,0xe7,0xb3,0x9f,0xc2,0x19,0x29,0xb8,0x6b,0x34,0x99,0x76,0xd7,0xb0,0xa4,0x6d,0x39,0xa5,0x88,0xbc,0xfe,0x43,0x57,},{0x0f,0x80,0xff,0x5d,0x17,0x48,0x8f,0xe2,0x6f,0x93,0xc5,0x43,0xb0,0x4e,0xd9,0x59,0xb5,0xf0,0x64,0x3f,0xc6,0x1c,0x7f,0x2c,0x3b,0xc6,0x01,0x32,0xba,0x9c,0x62,0x10,0xc8,0xb2,0x50,0xea,0x5e,0x84,0xd0,0x7b,0x01,0xde,0x68,0xbc,0x17,0x44,0x14,0xee,0xeb,0x31,0xfd,0xc2,0xba,0x68,0x23,0xe2,0x31,0xe3,0x12,0xa9,0x1e,0xde,0xdd,0x02,},"\xdb\x8e\xf0\x2e\x30\x33\xe6\xb9\x6a\x56\xca\xb0\x50\x82\xfb\x46\x95\xf4\xa1\xc9\x16\x25\x0d\xd7\x51\x73\xf4\x30\xa1\x0c\x94\x68\x81\x77\x09\xd3\x76\x23\x34\x6a\xe8\x24\x5b\x42\xbd\xa0\xda\x6b\x60\x46\x2c\xcf\xdf\xc7\x5a\x9a\xb9\x94\xe6\x6c\x9a\xb9\xfe\xcd\xd8\x59\x96\x10\x91\x0a\xff\xe4\xf1\x02\x15\xcb\x28\x0b\xf8\xf9\xf2\x70\x0a\x44\x47\x96\xda\xe9\x3e\x06\xc6\xbe\xa7\xd8\xb4\xfe\x13\x01\xba\xa7\x9c\xce\xc7\x69\x36\x8f\xeb\x24\x42\xc7\xde\x84\xf0\x95\xe6\xb3\xbf\xf6\x3d\x38\x8c\xba\xfb\x2b\x98\x09\xdc\x38\xe9\xb1\x2e\xbd\x03\x9c\x0a\x57\xf4\xd5\x22\xe9\x1e\xc8\xd1\xf2\xb8\xd2\x3a\x4a\x0a\xe0\x59\xaf\x85\x39\x3b\xb0\xa1\x5f\x74\x91\x10\xf6\x77\x4a\x1f\xd7\x31\xa6\xec\x21\x3e\x4f\xf4\x35\xda\xab\x54\x6d\x31\xed\x9e\xc3\xb6\xd8\xcc\x2e\xda\xce\xbf\x4f\xac\xc5\x56\x65\x56\xee\xa9\x2e\x5b\x3f\x25\x42\x23\x9b\x25\xe2\x80\x12\xdd\x4e\xf4\x00\x72\xee\xbf\x83\xed\x2a\x25\x51\x81\xf3\xa4\x42\x18\x9d\x68\xc6\xc6\x09\xf4\xdf\xdf\x3d\xb7\xd6\x7d\x08\x7a\x2f\xcd\x6d\x2d\xc5\x0b\xbf\xed\x8b\xfb\xbf\xcb\x74\xd3\xc4\x1f\x02\xa8\x78\x65\xb1\x3b\x8e\xfc\xf5\xc3\x58\x12\x57\xbe\x0a\xa9\x13\xf6\x0c\x37\x05\x27\xbd\xe1\x1a\x47\x5c\x13\x6a\x17\xc5\xee\xfe\xb0\x3f\x5b\xff\x28\x69\x3e\xd8\x41\xe8\xed\x1f\x7c\x29\x10\x2f\x55\x99\xdd\x44\x40\x09\xbc\xea\x6a\x92\xd5\x57\x41\x52\x45\x8e\x0c\xaf\x8a\x36\xaa\x72\xb5\xdc\x49\x08\xa6\x46\x1c\x9b\x74\x14\x53\x00\x5c\x8f\xbc\xc6\x81\x13\xae\x18\x42\x08\xee\x14\xb8\x35\x48\x0c\x6e\xfa\xfe\xd1\x8a\x76\x00\x0b\x38\xe5\x85\x82\x90\xf4\xd5\x1f\x52\xf0\x96\xcb\xe4\x90\xe1\xeb\x5c\xac\xb2\x26\xec\x49\x5a\x55\xa7\xfa\x45\x78\x43\xd5\x7f\xab\x67\xf8\xbe\x7e\x20\x93\x34\x78\x5b\xdd\x66\x5d\x7b\x63\xe4\xda\xf5\x7b\x6e\x78\x92\x8b\x60\x3c\x8c\x0f\x9b\xc8\x54\x64\x73\x3b\x61\x27\x3e\xf9\xe2\xb8\xa0\xcd\x7c\x3b\xf8\xee\x0a\x68\x72\xe3\x4d\x5a\x27\xa6\x25\xe3\x5e\xaf\x7f\xf5\x44\x0b\x8b\x14\x1a\xf7\x04\xdf\x70\xc9\xc1\x86\x23\xbd\x11\x20\x95\x13\x19\x25\x05\x10\x5c\xd7\xbc\xfa\x5f\x0d\x91\x9d\xa7\x06\x94\x8f\xbe\x1f\x76\x1f\x31\x58\x46\xaa\x3b\x48\x13\xdd\x9b\xa3\xd8\x1b\x92\x04\xe5\x40\x9c\x03\x82\xb6\xeb"}, +{{0xd2,0xe0,0x1d,0x25,0x78,0xb6,0x25,0xa7,0x06,0x0a,0xab,0xc2,0x57,0x65,0xf1,0x68,0xc6,0x80,0xce,0xf7,0x67,0xaa,0x97,0xca,0x0e,0x5e,0xb3,0xd6,0x67,0x47,0x4b,0x2a,},{0x19,0x1a,0xc2,0x23,0x57,0x54,0x24,0xaa,0x35,0x4b,0x25,0x5b,0x81,0x2d,0xd3,0x02,0x5d,0x70,0xed,0x82,0x9e,0x08,0x26,0xc0,0x16,0x29,0xf9,0xdf,0x35,0x45,0x08,0x2b,},{0x87,0xa0,0x10,0x39,0x4a,0x9f,0x2c,0x90,0x4e,0xff,0xef,0xca,0x9f,0xb4,0xd5,0xce,0x13,0x79,0x33,0x01,0xa4,0x92,0x5b,0xa5,0x1d,0xb1,0x19,0x12,0x3a,0x4d,0x73,0x0a,0xbf,0x76,0x4c,0xe0,0x65,0xe4,0x8d,0x90,0xa7,0x9d,0x90,0x7d,0x72,0x54,0xc4,0x0c,0xc3,0x58,0x98,0x7a,0x46,0x94,0x9e,0x92,0x8b,0xbb,0x3c,0xd0,0x85,0xdf,0xab,0x06,},"\x20\xd5\xdd\x69\x9b\x28\x53\x30\x2a\x68\x17\x09\x4d\x5e\xa5\x12\xbd\xf8\x53\x45\x04\xcb\x28\x9c\x60\x24\x67\x41\x07\x40\xec\x7e\xb8\xea\x64\x42\xc8\x0f\x14\x59\x35\x06\x8f\x91\x22\xfd\xf4\xa3\x9f\x20\x10\xf3\x3d\xb5\x5b\x81\x4d\x97\xbf\x2e\x58\x72\x32\x9f\x11\x26\xd4\xeb\x95\xb8\x06\xca\x19\x73\x11\x31\x65\xb1\x16\xbe\x87\x16\x37\x1f\x81\x33\x17\x79\xdc\x79\xa5\xcb\x39\x42\x08\x1a\xb5\xf2\x07\xf6\xb5\x3d\xb0\xe0\x03\x81\x07\xd6\x3c\xa9\x77\x08\x18\x19\x82\xdc\xb5\xf3\xb9\x30\x10\xec\x6e\xdf\xb2\xcf\xd3\x1c\xab\x00\x09\x0b\x3c\x38\x51\x5f\x97\x81\x76\x96\x86\xcb\x17\xab\x81\xd5\x4a\x8b\x77\x57\x54\xd4\x2f\xba\xd0\x86\xb8\x0b\x28\xd6\x36\xf7\x8b\x7e\xb7\x7e\xd9\xca\x35\xb6\x84\x3a\x51\x0f\x0a\xd0\xac\x1b\x20\x26\x7a\x00\x03\x01\xb3\xc7\x07\xa2\x0f\x02\x14\xd5\x9b\x5b\x81\x99\xc2\xf9\xee\x25\xd3\x20\x60\xac\xe3\xe0\xf2\x59\x46\x50\x41\x6a\x00\x71\x6c\xd3\xf9\x86\x04\xa5\xe1\x04\xb3\x33\x10\xfd\xae\x94\xc3\x14\x01\x3c\xdc\xa5\xba\x24\x14\x40\x9e\xb7\xf1\x90\x13\x94\xf0\x07\xd6\xfa\x0a\x29\xdb\xe8\xec\x3d\xf9\x8c\x39\x3c\x8d\x72\x69\x58\x77\xcc\x9b\xaf\x49\x1e\xf3\x0e\xf7\xdb\x33\x71\x60\x8c\xa9\x7c\xc6\x21\x56\x25\x20\xee\x58\x1d\x5d\x1c\xdb\xc7\x82\x32\xd6\xc7\xe4\x39\x37\xb2\xcc\x85\x49\xe6\xf1\xe0\x8d\xf5\xf2\xea\xc8\x44\xfe\x0f\x82\x2b\x24\x83\xad\x0a\x5d\xe3\x3b\xe6\x40\x89\x49\x0e\x77\xd6\x98\x00\xfa\xe2\x58\x9e\xe5\x87\x12\xac\x15\xa3\xf1\x9e\x6f\xfd\xbc\xa4\x2f\xe1\x89\x4e\x88\x9b\x94\xc0\x4b\x04\x24\x0d\xaf\xb0\xb2\x73\x0c\x23\x6b\x8c\xce\xb2\xcb\x97\xaf\xd1\xd5\x15\xdc\x19\xd1\x06\x7f\xd4\xab\xa8\xce\x29\x7f\xd6\xd1\x10\xb3\x5a\x21\xbd\x3c\x07\x5c\x57\x7d\x93\xfe\x1d\xf7\x7d\x64\x8f\x71\x19\x49\x20\x99\xb0\x17\xaf\x44\xeb\xa0\x9c\x80\x7f\x11\xa4\xc3\xf4\xa1\x1a\x2f\xff\x30\x6a\x72\x8b\xa7\x89\x83\x32\x3c\x92\xa2\xfd\x5f\xcc\x80\xc1\x8d\x42\x34\x26\xf8\x23\xa7\x3f\xe0\x40\x94\x95\x52\x84\x29\x3f\x5f\x6b\x3c\xa4\xff\x10\x80\xdb\xb1\xe4\xc6\xf7\x4c\x1d\x93\x5e\xd2\x1e\x30\x09\x4c\x7d\xe3\x36\xb8\x2d\xd8\x20\x0b\x0d\x65\x95\x83\xc5\xbf\xd5\x47\x0f\x9d\xb3\x42\xe7\x0e\xc4\x00\x07\x42\xc5\x64\x0a\x21\x4e\x3c\x2e"}, +{{0x7c,0xd7,0xec,0x99,0xdd,0x03,0xae,0xde,0x1f,0xf1,0x07,0x3e,0xc2,0xca,0x70,0x10,0x27,0x6e,0x94,0x7e,0x2a,0xa9,0xb0,0xe6,0x5f,0x87,0x7e,0x4c,0xcf,0x1b,0x3a,0x14,},{0xe4,0xc3,0x9d,0xbe,0x94,0x93,0x17,0x6b,0x82,0x13,0xf1,0x42,0x2a,0x9d,0xe7,0xc7,0x4f,0xb6,0xa5,0x91,0x90,0xfc,0xdb,0xf6,0x37,0xc7,0xad,0x5e,0xe1,0x65,0xc0,0x4f,},{0x6f,0x99,0x20,0x27,0x70,0x96,0x45,0x35,0xe4,0x83,0xa0,0xee,0x01,0xa5,0x29,0x44,0x2e,0xb3,0x21,0x30,0x3f,0xa8,0x05,0xd4,0x75,0x60,0x4d,0x7f,0xc7,0x28,0xa9,0x10,0x3f,0xb7,0xb5,0x58,0xb9,0x55,0xf4,0xd0,0x37,0x19,0xee,0xfa,0xa3,0xb7,0xed,0x5b,0x0d,0xa7,0x57,0x10,0xbb,0x98,0x78,0x7f,0x5c,0x22,0x82,0xed,0x66,0xe9,0xf6,0x0c,},"\xa6\x03\x4a\xa3\xc2\x48\x49\x23\xe8\x0e\x90\xe5\xa8\xe1\x74\x83\x50\xb4\xf2\xc3\xc8\x31\x9f\xaf\x1a\x2e\x32\x95\x15\x0a\x68\xe1\xee\xca\x1b\xc8\x49\x54\xcc\x89\xd4\x73\x1a\x7f\x65\x12\xaf\x01\x46\x4f\xdb\xce\x5d\xf6\x8e\xe8\x06\x6a\xd9\xa2\xfd\x21\xc0\x83\x5a\x76\x55\x9c\xa1\xc7\x44\x9a\x93\x3b\xcb\x15\xaf\x90\x22\x3d\x92\x5f\xf6\x1c\xd8\x3e\xb9\x35\x69\x83\x47\xa5\x70\x72\x70\x9a\x86\xb4\xe5\xa7\xa6\x26\xe0\x7a\x3f\x2e\x7e\x34\x1c\x77\x83\xa5\x40\xf8\x4a\xa7\x3e\x91\x7e\x86\x7b\xb8\x0b\xac\xe6\x25\x47\x05\xa9\xd1\xa1\x18\x5d\xe5\x6e\x1a\x4e\x78\xaa\xf5\x39\xe7\x49\xb8\xf7\x65\xbd\x05\x2c\x4c\xd1\x5b\x63\x8b\xf8\xec\xf8\x7d\x98\x14\x60\x6f\xed\x5a\x69\xf4\xda\xe9\xda\x47\xf3\x80\x6d\xd9\x0b\xe6\x4f\xcc\xd3\x36\x5c\xbe\x9e\x01\xc5\x88\xfe\x65\xd6\xb6\x03\x28\x07\x40\x96\x2a\xa8\xdd\xb9\x5a\x3f\x4f\x67\x4c\x03\xbc\x40\x43\x09\x2c\x54\x45\x95\x56\x82\x70\xa2\xc2\xa8\xaa\x06\xe3\xf6\x7c\x31\x99\x8c\x50\xb9\xa5\x8a\xca\xd0\x06\x90\xd3\x84\x81\x14\xcb\x19\x32\x93\xc8\xac\x21\x01\x6f\xd9\x96\xf5\xc6\x42\x14\x06\x4f\x82\x16\x7b\x2c\x92\x0c\xd8\xa8\x39\x75\x58\x52\xac\x77\xc3\xd9\x05\x26\xdd\x3a\xdb\x96\x83\x7c\xf4\xe7\x26\xf3\x4b\xd0\x29\x55\xcb\xac\x5b\x82\xc9\x2c\xf4\xaa\x8b\x54\xbb\x6e\x43\x6d\xae\x9b\xf8\x93\xef\x05\x0c\x6f\x13\x5a\x7e\x62\xfc\xd8\x34\xda\xc1\xd2\xbe\x8b\x8e\x59\xd6\x96\x13\x18\x11\x70\x1c\x43\x18\xbb\x6e\x9b\x5a\x20\xbe\xc6\x56\xfd\x2b\xa1\x92\xe2\x73\x2f\x42\x29\x63\xbe\xd4\xa4\xfd\x1e\xc9\x32\x63\x98\xdc\xe2\x90\xe0\x84\x8c\x70\xea\x23\x6c\x04\xc7\xdb\xb3\xb6\x79\x21\x44\x0c\x98\xd7\x27\x53\xf6\xa3\x32\xea\xad\x59\xfd\x0f\x57\x74\x29\x23\xfb\x62\x5f\xef\x07\x0f\x34\x22\x5e\xa0\x6c\x23\x63\xd1\x23\x66\x6b\x99\xac\x7d\x5e\x55\x0d\xa1\xe4\x04\xe5\x26\xb5\xb2\x29\xcb\x13\x0b\x84\xb1\x90\x3e\x43\x1c\xdb\x15\xb3\x37\x70\xf5\x81\x1d\x49\xfb\xd5\x0d\x60\xa3\x47\x4c\x0c\x35\xfc\x02\x1d\x86\x81\x81\x9e\xc7\x94\xcc\x32\xa6\x34\xbc\x46\xa9\x55\xaa\x02\x46\xb4\xff\x11\x24\x62\x3c\xba\xfb\x3c\xb9\xd3\xb9\x2a\x90\xfd\xe6\x48\xe4\x14\x63\x61\x92\x95\x2a\x92\x29\x1e\x5f\x86\xef\xdd\xb8\x9c\xa0\x78\xae\xa7\x71\x7f\xc7"}, +{{0xe3,0xca,0x37,0x13,0xa2,0xfd,0x41,0x2a,0xd5,0x33,0x6b,0xc3,0x56,0xb7,0x7b,0xe0,0x27,0xd5,0xb7,0x08,0x15,0xb3,0xac,0x2a,0xec,0xd8,0x34,0x0e,0xf5,0xf8,0x89,0xb1,},{0x1d,0x51,0x6c,0xb8,0xbe,0xf1,0x16,0xa0,0xc1,0xb6,0x92,0x90,0x09,0x93,0x3f,0x6e,0xb6,0x2c,0x23,0x05,0x07,0x45,0xfe,0x7e,0x8d,0x3c,0x63,0x16,0x23,0x77,0x81,0x11,},{0xb3,0x85,0x7e,0xa6,0x1b,0xaa,0x9e,0x62,0x83,0x8c,0x4e,0x3a,0x99,0x65,0x02,0xd3,0x36,0x4f,0xe1,0xec,0x59,0x42,0x58,0x35,0x50,0x73,0xdd,0x10,0xe4,0x97,0xc6,0x00,0xbe,0xfb,0x1f,0x8f,0x23,0x3f,0xd6,0xe3,0xb2,0xc8,0x7f,0x10,0xdc,0xb7,0x26,0x1a,0xaf,0x34,0x81,0xbf,0xd0,0x90,0x26,0x05,0xac,0xcc,0x90,0x0f,0xef,0x84,0xd4,0x07,},"\xdd\x99\xba\xf2\x95\xe0\x13\xee\xd1\x07\xba\x8a\xf8\x11\x21\xaa\xf1\x83\x5a\x3c\xca\x24\xf8\xe4\x64\xb4\xcf\xca\xa3\xc7\xbf\xfe\x6f\x95\x36\x01\x6d\x1c\x8c\xf3\x75\x03\x8c\x93\x27\xe8\xe2\x1b\x00\x40\x66\xf5\xea\xc0\xf7\x6a\x3e\x8e\xdf\xb0\x7b\xe8\xbd\x2f\x6b\xc7\x9c\x3b\x45\x6d\xe8\x25\x95\xe2\xc2\x10\x5b\xb1\xb0\xaa\xba\x5e\xee\xe1\xad\xef\x75\x21\x67\xd6\x33\xb3\x22\xeb\xf8\xf7\xcd\x5f\xbf\x59\x50\x8f\xdb\xdb\xec\xf2\x5e\x65\x7a\x9c\x70\x50\xaf\x26\xa8\x0a\x08\x5b\x08\x17\xc6\x21\x7e\x39\xac\xd5\x4c\xb9\xfa\x09\x54\x0f\xc7\xbd\xc5\x22\x6d\x6a\x27\x6d\x49\x2c\xc8\xa3\xdf\xfc\x2a\xbc\x6d\x0b\x9f\xb0\x8c\xbc\xcd\xd9\x43\x2e\x44\x98\x21\xa5\xdc\x98\xcf\xb3\xa4\x18\xe5\x39\xc8\x90\xfe\x5a\x04\x46\xb9\xf8\x1d\x30\x67\x00\x92\x7a\xde\x61\xcf\xdc\xc0\x62\x4f\x13\xb5\x84\x07\x48\x77\x46\x04\x80\x57\x31\xd9\x2e\x77\xd5\xde\xf6\x6b\xe4\x4c\xc8\x17\x94\x6f\x1c\xd7\x58\x19\x6c\xf4\x80\xf9\x9e\x71\x17\x83\x5c\x4c\x87\xcb\xd6\x40\x77\xa5\x62\xa8\x0c\xf1\x1d\x8c\xa6\x5b\xe7\xa9\x4d\x92\xb9\xdd\xae\xa9\x97\xe9\x3f\x14\x48\x57\x7e\xd6\xd8\x43\x6b\x2f\x31\x44\x69\x2c\x1f\xd7\xd2\x8a\x03\xe9\x27\x4b\xc9\xe8\x66\x9d\x85\x75\xf5\xde\x20\xcf\xbd\xbc\xb0\x4e\x9f\x39\xf3\x45\x1d\x70\x48\x37\x5e\x26\x98\xe7\x22\x84\x6c\xb4\xf2\xd1\x9a\x81\x0c\x53\xd4\xc1\xa6\xc3\xb7\x70\xfb\x40\x2d\xf0\x53\x0e\x7b\x29\x07\x22\x3f\xd0\x89\x9e\x00\xcb\x18\x8c\xa8\x0c\x15\x31\xb4\xe3\x7f\xba\x17\x6c\x17\xa2\xb8\xf5\xa3\xdd\xc7\xa9\x18\x8d\x48\xff\xc2\xb2\x72\xc3\xda\x9c\x9b\x89\xdf\xe5\x3f\x2f\xe7\xe3\x67\x2f\x91\xd1\x18\x18\x49\x1a\xce\x14\x0a\xdc\xae\x98\x50\x2e\x11\x4f\x4b\x35\x2b\x90\xe2\xe7\xfb\xd3\x33\xb2\x45\x9e\x7f\x15\xdd\x07\x64\xc9\xc3\x4e\x4c\xb7\xcc\x09\x55\x00\xcd\xa0\x35\xe8\xe2\xe4\xe3\xc8\xfd\x5d\xf5\xf3\xaa\x57\x9a\x73\x5d\xd8\xa9\xf1\x9e\xf3\x36\xfa\x97\x11\x14\xe4\x66\x18\x73\x4a\x4c\x13\xd3\x0c\x81\x12\x8c\xa2\x1d\xef\x47\x33\x01\x03\xd2\x3d\x80\xff\xe6\x74\x21\xa6\xcc\xf9\xf3\x6a\x93\xf0\x56\x03\xc5\x99\xee\x10\xb0\x34\x51\xf3\x6b\x21\x33\xc1\x87\xa7\x9a\xd9\xe6\xfd\xfb\xb1\x25\x95\xab\x73\xbb\x3e\x2e\x2e\x43\x03\x0f\xd3\x7e\x59\x1c\xf5\x5d"}, +{{0x29,0xa6,0x3d,0xcd,0x48,0xa3,0x51,0x77,0x14,0x11,0xfd,0xdc,0xab,0x46,0xbb,0x07,0x1e,0x91,0x49,0x85,0x76,0xe8,0xd0,0x2f,0x8b,0x60,0x44,0xf5,0xbd,0xd3,0xed,0x90,},{0x39,0x23,0xfd,0xcc,0x2a,0x9f,0xe5,0xca,0xbf,0x6e,0x99,0x32,0xe4,0x6d,0xbd,0x2b,0x7f,0x36,0x32,0x50,0x0f,0x9d,0x95,0x55,0x2d,0xb2,0xb0,0x45,0xbc,0x41,0x16,0x6f,},{0x12,0xbf,0x62,0x95,0x93,0xe2,0xca,0xad,0xc9,0x10,0xec,0x40,0xbf,0xe2,0xb7,0xa6,0x25,0x14,0x12,0x6b,0x16,0xba,0x3a,0x43,0x8d,0x88,0xe2,0xd2,0x1f,0x59,0x5a,0xae,0xe8,0xab,0xfa,0x4a,0xf2,0xec,0x87,0x03,0x61,0xd0,0xea,0x04,0xdf,0xc8,0xc6,0xa3,0x30,0xfb,0x28,0x41,0xc2,0xd8,0x21,0x1a,0x64,0xfa,0x1e,0x7e,0x7d,0x27,0x38,0x00,},"\xff\x18\xca\x0c\x20\x4c\x83\x86\xa4\xaa\x74\xec\x45\x73\xc7\xb6\x92\x16\xb3\x14\x70\xda\xed\xd9\x6a\x4f\x23\x02\x11\x6c\x79\x55\xd7\x2d\xac\xc8\x8e\x37\x14\x55\x0c\x09\xe6\xf7\xb9\xa8\x58\x62\x60\xdc\x7e\x63\xda\x4c\x63\x3b\xae\x01\x62\xe1\x16\xe5\xc1\x79\x7b\x78\xd8\x7d\x47\xff\xee\xa3\xd7\x81\x9d\xf9\xc8\x52\xf0\xff\x30\x93\x6a\x10\x5d\x3a\xf5\x53\x1a\x8f\x89\x54\x97\x11\xc1\x4c\x2d\x3e\xe1\x15\x64\xe7\xc8\x52\x5b\xd5\x88\x64\x00\x97\x62\xa0\x55\x41\xd8\xe0\x7a\xd8\x41\xa5\x5a\x6a\x9a\x00\x7e\xf2\x09\xcc\xec\x4b\x56\x40\xba\xbe\x35\x65\x1b\x61\xdf\x42\xde\x4d\x91\x0e\xe7\x3a\x93\x3c\x0b\x74\xe9\x95\x75\x7e\x84\xa9\x9e\xb0\x34\xf4\x18\x07\x18\x3c\x90\xca\x4e\xa8\xd8\x4c\xdb\xa4\x78\x61\x3c\x8e\x58\x7c\xb5\xf8\xfb\x6a\x05\x50\x81\xda\x6e\x90\x22\x0d\x5d\x86\xe3\x4e\x5f\x91\xe4\x88\xbd\x12\xc7\xa1\xa6\xb3\xc9\xfc\xe5\x30\x5e\x85\x34\x66\x58\xef\xfa\x81\x0d\x0e\x8a\x2a\x03\x9d\xb4\xa4\xc9\x49\x65\xbe\x40\x11\xf9\xd5\xe5\xda\x26\x62\x33\xe6\xc4\xe1\x8e\xd4\xf8\xa2\x5a\x57\xe4\x0a\x59\x1c\x7e\xd5\x90\xc0\xf8\xb1\xa1\x19\xc7\xc9\x74\x7f\x69\x1b\x02\x19\x6c\xd1\x8e\x69\x45\x21\x3f\x1d\x4c\x8c\x95\x79\xc6\xe0\xa2\xac\x45\x92\x41\x28\xd6\xd9\x2c\x8e\x4c\x66\x06\x53\x20\x35\x3d\x48\xd1\xd5\xe1\x31\x94\xd9\x05\xf8\x37\x07\x8f\x8d\xac\x0b\x68\xcf\x96\xae\x9e\x70\x55\x4c\x14\xb2\xfa\x29\xb1\x96\x30\xe4\xb0\xf5\xd2\xa7\x67\xe1\x90\xef\xbc\x59\x92\xc7\x09\xdc\xc9\x9a\xa0\xb5\xaa\xf4\xc4\x9d\x55\x13\xe1\x74\xfd\x60\x42\x36\xb0\x5b\x48\xfc\xfb\x55\xc9\xaf\x10\x59\x69\x27\xbc\xfa\xd3\x0b\xac\xc9\x9b\x2e\x02\x61\xf9\x7c\xf2\x97\xc1\x77\xf1\x92\x9d\xa1\xf6\x8d\xb9\xf9\x9a\xc6\x2f\xf2\xde\x3b\xb4\x0b\x18\x6a\xa7\xe8\xc5\xd6\x12\x39\x80\xd7\x59\x92\x7a\x3a\x07\xaa\x20\x8b\xee\xb7\x36\x79\x5a\xe5\xb8\x49\xd5\xda\xe5\xe3\x57\x37\x10\xaa\xa2\x4e\x96\xd5\x79\x1e\x27\x30\xd0\x27\x0f\x5b\x0a\x27\x05\xba\x51\x5d\x14\xaa\x7e\x6f\xa6\x62\x23\x75\x37\x7f\x9a\xba\x64\xd0\x25\x69\xa2\x09\xd3\x3d\xe6\x86\xe0\x89\xec\x60\x11\x8e\x48\x14\xff\xc6\xc0\x77\x8c\x64\x27\xbc\xe2\xb6\xb8\x44\xcf\xcd\x5a\x7c\xed\x0e\x35\x30\x3f\x50\xa0\xdf\xe5\xdf\x5d\xde\x1a\x2f\x23"}, +{{0xc7,0x18,0x8f,0xdd,0x80,0xf4,0xcd,0x31,0x83,0x9e,0xc9,0x58,0x67,0x1e,0x6d,0xd0,0x8b,0x21,0xf9,0xd7,0x52,0x8c,0x91,0x59,0x14,0x37,0x34,0xf9,0x4b,0x16,0x98,0x83,},{0x01,0x97,0x52,0xff,0x82,0x9b,0x68,0x59,0xb9,0x05,0x8d,0x00,0xc2,0x79,0x5e,0x83,0x56,0x55,0x44,0x06,0x75,0x75,0x3f,0x37,0xe8,0x5e,0xb7,0xbc,0x58,0x39,0xc4,0xca,},{0x35,0xc1,0x70,0xdd,0x0c,0x6d,0xc2,0x92,0x0a,0x59,0x57,0x75,0xd8,0xe2,0xdd,0x65,0x24,0x3e,0x9c,0x1b,0xf9,0x6e,0xf4,0x27,0x79,0x00,0x1e,0xd4,0x5f,0x01,0xb7,0xdf,0xeb,0xd6,0xf6,0xa7,0xdc,0x2d,0x38,0x6e,0xf4,0xd2,0xa5,0x67,0x79,0xeb,0xe7,0x7f,0x54,0xe5,0xae,0xcf,0xda,0x2d,0x54,0xa0,0x68,0x47,0x6b,0x24,0xdb,0xd7,0x8b,0x0c,},"\x4a\xf5\xdf\xe3\xfe\xaa\xbe\x7f\x8f\xcd\x38\x30\x8e\x0b\xd3\x85\xca\xd3\x81\x1c\xbd\xc7\x9c\x94\x4e\xbf\xe3\xcd\x67\x5c\xf3\xaf\xbe\xf4\x54\x2f\x54\x29\x75\xc2\xe2\xa6\xe6\x6e\x26\xb3\x2a\xc3\xd7\xe1\x9e\xf7\x4c\x39\xfa\x2a\x61\xc5\x68\x41\xc2\xd8\x21\x2e\x2b\xd7\xfb\x49\xcf\xb2\x5c\xc3\x60\x9a\x69\x3a\x6f\x2b\x9d\x4e\x22\xe2\x09\x9f\x80\xb7\x77\xd3\xd0\x5f\x33\xba\x7d\xb3\xc5\xab\x55\x76\x6c\xeb\x1a\x13\x22\xaf\x72\x6c\x56\x55\x16\xce\x56\x63\x29\xb9\x8f\xc5\xdc\x4c\xbd\x93\xce\xfb\x62\x76\x88\xc9\x77\xaf\x93\x67\xb5\xc6\x96\x59\xe4\x3c\xb7\xee\x75\x47\x11\xd6\x65\xc0\x03\x2a\xe2\x29\x34\xf4\x4c\x71\xd3\x11\x78\xef\x3d\x98\x10\x91\x28\x74\xb6\x2f\xa5\xe4\x02\x0e\x6d\x5d\x64\x58\x18\x37\x32\xc1\x9e\x2e\x89\x68\x5e\x04\x64\xe9\x1a\x9b\x1c\x8d\x52\x51\xe2\x4e\x5f\x91\x81\x3f\x50\x19\xa7\x40\xa0\x4b\x5d\x91\xcb\xb8\x30\x9e\x51\x61\xbb\xa7\x9d\xca\xb3\x82\x39\xa0\x91\xf5\x0e\x09\x9f\xf8\x19\xe3\xa7\xb5\x20\x5f\xe9\x07\xcd\xfe\x9c\x0d\xc3\xee\x85\xe3\x2d\x7b\xcd\x3c\xe0\x26\x35\xe2\x05\x83\x88\x03\x1e\x31\x7f\xbf\x22\xab\x9f\x39\xf7\xf7\xe3\xcd\x1a\x11\xa9\xc1\xf4\x5f\x4e\x1e\x42\xd2\x53\x6c\x12\x2c\x59\x18\x37\x91\x18\x47\x10\x8c\xea\xfd\x99\x08\x13\xc2\xb6\x34\x4c\xff\xc3\x4b\xe3\x71\x61\xdd\x81\x56\x26\x90\x0e\x8f\xcb\x85\xc2\x1a\xfb\x4f\x6b\xe8\xad\x01\x51\x6a\x31\xc2\xa6\x58\x03\x15\x85\x7c\x6a\x21\x67\x35\xca\x99\x10\x09\xdb\xc2\xea\x50\x34\x16\x07\x47\xa8\x69\xd5\xca\xdb\x0b\x47\xff\xbd\x5d\x3a\xc9\x7f\xdd\x05\x26\xca\xe6\xea\xa3\x5c\xff\x7a\x16\xea\xf4\xfb\x95\x0c\xa3\x15\x11\x34\x6f\xea\x61\x41\x99\x9a\x3f\x75\x4e\x62\x81\xcf\xba\x15\xe8\xa8\x26\x93\x2c\x58\x9c\x5d\x24\x7c\x90\x9d\x94\xb4\xea\xb7\xeb\xcb\x09\x07\x76\x48\xaf\x06\x5c\x2d\x86\x61\x1e\xb5\x88\x45\x3e\xd7\xc2\x47\x80\xd7\x3c\x68\x9c\x87\x44\xaf\xd5\x33\xa8\x6d\x9e\xe9\xe3\x36\x57\x32\xcb\xd0\xc3\x51\xe4\x36\xf8\x98\xb7\x04\x32\x92\x09\x7e\x03\xe6\x08\x1a\x23\xac\x86\x5e\x19\xdc\x88\x58\x96\x9b\x99\x9d\x01\xfa\x65\xef\x20\x0c\x3f\x26\x9c\x81\x8e\x30\xb9\x36\x5e\xcc\x68\x3b\xcf\xe6\x9c\x20\x3b\x4e\x0a\xb6\xfe\x0b\xb8\x71\xe8\xec\xaa\xae\x82\xd3\xac\xd3\x5d\x5b\x50"}, +{{0x38,0xba,0x06,0x21,0x70,0x4d,0x21,0x55,0xfc,0x2f,0x78,0x55,0x51,0x96,0x57,0x5d,0xe0,0x6d,0x80,0x25,0x5c,0x35,0xe9,0xdc,0x96,0x5b,0x6f,0xe9,0x6a,0x4d,0x53,0x89,},{0x43,0x88,0xf7,0xf6,0x8a,0x9e,0xff,0xbc,0x36,0x6e,0x42,0xd9,0x07,0x01,0x56,0x04,0xda,0xce,0xd1,0x72,0x7c,0xd1,0xd8,0x9d,0x74,0xad,0xcc,0x78,0x9f,0xd7,0xe6,0xe1,},{0x42,0xbe,0xd6,0xa9,0x87,0x86,0xf6,0x64,0x71,0x5f,0x39,0xbb,0x64,0x3c,0x40,0x5a,0xe1,0x75,0x00,0x56,0x46,0x0e,0x70,0x04,0x69,0xc8,0x10,0x38,0x95,0x04,0xc5,0x1c,0xff,0xd9,0xe1,0xa9,0x4c,0x38,0xf6,0x92,0xfb,0x31,0x62,0x65,0x31,0x6d,0x8f,0x4d,0xc3,0xad,0x1c,0xdd,0x8a,0x6d,0x59,0x91,0xef,0x01,0x0c,0xd1,0x48,0x9d,0x7c,0x09,},"\xed\x4c\x26\x83\xd6\x44\xb0\x5b\x39\xb0\x48\xef\x1f\x8b\x70\x25\xf2\x80\xca\x7e\x8f\xf7\x2c\xb7\xed\xa9\x93\x29\xfb\x79\x54\xb7\x00\x40\x07\x05\x27\x5f\x20\xb8\x58\xcf\x7e\x34\x9a\x35\x10\x66\x5b\x63\x06\x09\xc5\xe2\xe6\x20\x69\x26\x3a\xb9\xc5\x5e\x41\x23\xa5\x64\xdc\xa6\x34\x8c\x8a\x01\x33\x20\x75\xe7\xa5\xbe\xc9\xc2\x0a\x03\x80\x79\x57\xfe\xfa\x91\x0e\x60\xc3\x5a\xe5\x79\x77\x8c\xe2\xce\x42\xe6\xa6\x9a\x1b\x64\x76\x81\xe4\x3e\xc4\xb6\x3b\xd5\xfb\xef\xab\xb3\x17\x12\xcb\x3d\x64\x19\xea\xd7\x8d\xd4\x1c\x8a\x92\xaa\xce\xb6\x3c\xbf\xa8\x9d\x2a\xf3\x96\x06\xde\x01\x0a\x39\x7e\x30\x20\x53\xa6\x15\xc1\x6e\x5e\x95\xad\x99\x35\xc0\x79\xa0\xb8\x10\x31\x25\x78\x94\x71\xa1\xe3\x57\x4f\x42\x9b\x29\xe4\xd2\x25\xc7\x72\x3f\xbb\x3c\xf8\x8c\xbd\x73\x82\x3d\x9f\x0b\x6c\x7d\x05\xd0\x0b\xde\xb0\xfb\x0a\xd3\xd7\x13\x20\x33\x18\x3e\x21\xf6\xc1\xe8\xd8\xe4\xc0\xa3\xe4\xf5\x2f\x50\x01\xda\x68\x71\x71\x34\x5c\x6d\xc8\xb4\x2c\x42\xa6\x0d\x1f\x1f\xfa\x8f\xe3\xe7\xbc\xec\xe5\x9a\x03\x58\x78\xf9\xd4\xd8\x11\x27\xe2\x24\x96\xa4\x9b\xfc\xf6\xbf\x8b\x46\xa8\x0b\xd5\x62\xe6\x52\x55\x07\x1f\x9d\x11\xa9\xeb\x04\x81\xf4\x62\x6d\x4d\x71\xff\xc3\x8a\xfe\x6e\x35\x8a\x4b\x28\x91\x79\xcb\xce\x97\x64\xd8\x6b\x57\xac\x0a\x0c\x82\x7e\x8f\xf0\x78\x81\x33\x06\xa1\xd5\xfa\xdd\x32\xb4\x6a\x1f\xbc\xd7\x89\xff\x87\x54\x06\x3e\xec\xfe\x45\x31\x3b\xeb\x66\x01\xc3\xa3\x01\x0e\x8e\xb9\x7c\x8e\xff\xbd\x14\x0f\x1e\x68\x83\x11\x09\x2d\x27\x3c\x4d\xef\xca\x47\xda\x6f\x1f\x08\x25\x74\x46\x76\xf9\xa2\x80\xb6\xc2\xa8\x14\xfa\x47\xfa\xbc\x19\x80\xd0\xb3\x7f\x08\x7a\x53\xca\x87\x78\xf3\x9f\xfb\x47\x4f\xf5\xf1\x17\x1b\x44\x2c\x76\xdd\x00\x8d\x92\x18\x2f\x64\x4a\x71\x4a\x0f\x01\x1e\x21\x5a\x78\xb9\x7a\xf3\x7b\x33\x52\x0e\xbf\x43\x37\x2a\x5a\xb0\xcf\x70\xdc\xc1\xdc\x2f\x99\xd9\xe4\x43\x66\x58\xf8\xe0\x7c\xdf\x0b\x9e\xa4\xdd\x62\x24\xc2\x09\xe7\x52\x1b\x98\x1e\xe3\x51\xc3\xc2\xdf\x3a\x50\x04\x05\x27\xfc\xd7\x28\x04\x17\x60\x46\x40\x5d\xb7\xf6\x73\x4e\x85\xc5\xd3\x90\xf5\x20\xb0\xc0\x8d\xcb\xfa\x98\xb8\x74\x24\x80\xd5\xe4\x6f\x9b\xe8\x93\xf6\xd6\x61\x43\x40\xf8\x16\x16\x11\xd5\x05\x3d\xf4\x1c\xe4"}, +{{0xae,0x33,0x1f,0xc2,0xa1,0x47,0x59,0xb7,0x3f,0x1c,0xd9,0x65,0xe4,0x85,0x14,0xe1,0x2b,0x29,0xf6,0x3b,0x06,0xcc,0xfc,0x0a,0xd4,0x9f,0x36,0x82,0x0e,0x57,0xec,0x72,},{0x08,0x80,0x3d,0x48,0x23,0x8e,0xda,0x3f,0x9c,0xeb,0xb6,0x28,0x53,0x01,0x21,0xde,0x00,0xf0,0xf0,0x46,0x8c,0x20,0x2d,0x88,0x52,0x8b,0x8b,0xce,0xc6,0x87,0xa9,0x03,},{0x75,0xf7,0x39,0x08,0x88,0x77,0xe0,0x6d,0xc5,0x6d,0xae,0xc8,0xf1,0xe4,0xd2,0x11,0xb7,0x54,0xe3,0xc3,0xed,0xbf,0xa7,0xed,0xa4,0x44,0xf1,0x8c,0x49,0xb6,0x9c,0x5a,0x14,0x2d,0xb4,0x5a,0x0a,0x76,0x50,0xe4,0x7d,0x10,0x55,0x0b,0xa6,0x81,0xff,0x45,0xdd,0x44,0x63,0xc4,0xac,0x48,0xbf,0x44,0xb7,0x30,0x34,0xbd,0x56,0x59,0x22,0x0e,},"\x57\x16\x00\x33\x90\xe4\xf5\x21\x65\x98\xa0\x3d\x7c\x43\x0d\xbf\x49\x5e\xe3\xa7\x55\x7b\x58\x06\x32\xba\x59\xf1\x51\x98\xb6\x18\x0a\x42\x46\x9c\x23\x7d\xb5\xbc\x81\xf2\x9c\xfa\xab\x0a\xff\x3c\x99\x66\x30\x9a\xb0\x69\x58\xc9\xd7\x12\x6a\xdd\x78\xe3\xb3\x24\x59\xff\x8a\x0e\x0b\xde\xf8\x74\xb5\x8e\x60\x83\x66\x8f\x38\xad\x7d\x63\xaa\xe1\xf1\x2e\x26\xa6\x13\x34\x8f\x9f\x03\xea\x5d\x20\x5f\x04\x5d\x78\xcc\x89\x02\xd4\x7f\x81\xe8\xb5\x22\x93\xe7\x0e\x86\xc9\x80\x3d\x4d\xac\xea\x86\xc3\xb6\x74\x58\xae\x35\x79\xbc\x11\x11\x3b\x54\x90\xbc\xf3\xe1\xcd\x4e\x79\x79\xc2\x64\xd8\x35\x16\x1f\xd5\x5e\xfe\x95\x3b\x4c\x26\x39\x5d\xd9\x2c\xa4\x93\x09\x20\xe9\x04\xfa\xdc\x08\x89\xbb\x78\x22\xb1\xdf\xc4\x45\x26\x04\x84\x0d\xf0\x24\xdb\x08\x21\xd2\xd5\xe9\x67\x85\xa5\xc3\x7d\xbf\xd2\xc3\x75\x98\x32\x83\xe9\xb5\xb4\x3a\x32\x07\xa6\xa9\xb8\x33\x94\x83\x29\xd5\xde\x41\xe4\x50\x08\xbc\xba\xd4\x93\xde\x57\x54\xdd\x83\xde\xcc\x44\x0e\x51\x66\xed\xaa\xe0\x20\x8f\x00\x0c\x5f\x6d\x9c\x37\x21\x53\x20\x9e\x5b\x75\x78\x11\x6f\x89\xcf\x2f\x8b\x10\x04\xd1\x30\x7e\xa7\x9e\xd3\x74\x80\xf3\x19\x4a\x7e\x17\x98\x3a\x23\x04\x65\xcc\xc3\x0f\xcc\x1a\x62\xd2\x80\xfb\xba\xcc\xf0\x06\xdc\x4d\xee\x0e\xa7\x96\xb8\x1a\xcc\xc6\x1a\x06\x3e\x2c\x08\x3d\xae\xc0\x39\xbd\x9a\x64\xa7\x70\x24\xaf\x82\xec\x1b\x08\x98\xa3\x15\x43\x29\xfd\xf6\x16\x73\xc3\x6e\x4c\xc8\x1f\x7a\x41\x26\xe5\x62\x90\xe4\xb4\x56\x81\x9b\xde\xbf\x48\xcb\x5a\x40\x95\x5b\xab\x29\x7c\x2b\xbc\xb0\x18\xad\xbf\x24\x82\x86\x60\xa5\xd1\x2a\x06\x13\xbf\x3c\xcb\x5e\xeb\x9a\x17\xfb\x0a\x05\x47\xdb\x8d\xa2\x4d\x2e\xfb\x87\xba\x1b\x84\x31\x42\xa7\x5e\x4c\xa0\xb0\xa3\x33\xe4\xa1\x4f\xab\x35\xa6\x26\x69\x32\x9c\xa8\x75\x3f\x01\x6a\xc7\x0c\xd9\x97\xe8\xbc\x19\xee\x44\x8a\xea\xf0\xf4\xbf\x3c\xe5\x23\x05\x50\x57\x8a\xb6\x4c\x19\x01\x94\x46\xce\x2d\x9c\x01\xa0\x3d\x88\x9a\x99\x09\x86\x0a\xef\x76\xf0\x67\xc5\x0b\x61\xc3\xd0\xf1\x2c\xc8\x68\x6f\x5c\x31\xbf\x03\x2a\x84\x10\x15\xcf\xef\xf1\xcf\xda\xe9\x4f\x6b\x21\xda\xe9\x41\xb3\x35\xdc\x82\x1f\x32\x84\xce\x31\x50\x8f\x5d\xb5\xc4\x48\xff\xaa\x37\x73\xe9\xbe\x1a\x4c\x85\xa1\xc5\x8b\x00\x9f\xa3"}, +{{0x82,0x43,0x5f,0x39,0x79,0x01,0x06,0xb3,0xaf,0x72,0xf9,0x1f,0x14,0xc9,0x28,0xd2,0x46,0x5f,0x98,0xcd,0xd1,0x00,0x84,0xc4,0xa4,0x4d,0x19,0xaf,0x71,0xa1,0x92,0x7c,},{0xc5,0x2a,0x92,0x64,0x6f,0x5a,0xdb,0x21,0xc6,0xdd,0xe0,0xde,0x58,0x78,0x68,0x37,0xf8,0xa3,0x41,0x4c,0x09,0xae,0xdf,0xc2,0x7c,0x81,0x22,0x18,0xa7,0xe7,0x23,0x9e,},{0x1d,0xaa,0x44,0xef,0x06,0xd4,0xc1,0x0d,0xdb,0x48,0x67,0x84,0x23,0xc5,0xf1,0x03,0xa1,0xb5,0x68,0xd4,0x2b,0x20,0xcc,0x64,0xaf,0x11,0x0f,0xce,0x9d,0x76,0x79,0xa2,0xde,0xe4,0x12,0xb4,0x98,0x05,0x85,0xc2,0x6c,0x32,0x0d,0xba,0xa6,0x01,0xc4,0x72,0xde,0xfc,0x3c,0x85,0x41,0x5d,0xae,0xcd,0xd6,0xd2,0xd9,0xea,0xca,0xc8,0x5e,0x07,},"\xf3\xd6\xc4\x6a\xc5\x24\x8d\x53\x86\xb6\xb6\x84\x62\x59\x7d\x64\x70\x39\xf5\x44\xbb\x01\xac\x2d\x10\x67\xda\xaa\xa3\x97\xd2\xdb\xaf\x12\x5a\x1c\xf8\xfd\xf2\x80\xa6\xaf\xec\x32\x4d\x53\x11\xf5\x43\x68\x8a\x15\x6c\x84\x98\x19\xbb\x04\x6b\x91\x1c\x42\xea\x3c\xa0\x1b\x99\x80\x8c\x4d\x1f\x3b\x8b\x15\xda\x3e\xfe\x2f\x32\x52\x3e\xc3\xb0\x9c\x84\xb4\x8c\xff\xd1\x3c\x17\xc9\xe2\x6c\x91\x2d\x9c\x3e\x93\x46\xdf\xae\x3f\xd0\xc5\x6c\x88\x58\x78\x07\x82\xf6\x1a\x4c\x4d\xbf\xff\x1e\x9c\xb4\xb3\x62\xcd\x80\x01\xf9\xcd\xfe\xb1\xa7\x20\x82\xdc\xe9\xc9\xad\xe5\x2e\xff\xc9\x74\x46\x88\xac\x0b\x86\xc8\x82\x66\xb5\x3d\x89\x5c\x17\xea\xd9\xe8\x9e\xd8\xd2\x4d\x40\x64\x2f\x3a\xd3\xb9\xbf\x9b\xbc\x4d\xda\x79\x66\xef\x83\x28\x28\x9f\xb3\x1e\x17\xc8\x1f\xd0\x28\xef\x1b\xd9\xa1\xd4\xc7\x92\xe8\x6e\xc2\xdb\xdc\xe3\xf9\x37\xee\xcc\x3e\xeb\x51\x88\xd3\x25\x94\x19\x19\xbb\xf7\x5b\x43\x88\xe2\x39\x95\x07\xa3\xd7\xfb\x38\x75\x02\xa9\x5f\x42\x1c\x85\x82\x6c\x1c\x91\x76\xc9\x23\xe3\x16\x31\x0a\x4b\xa4\x5c\x8a\x5e\xf7\x55\x7c\xf8\x7b\x77\x02\x0b\x24\xf5\xba\x2b\xfd\x12\x28\x10\x95\x66\x30\x7f\xea\x65\xec\x01\x50\x19\x69\x12\x17\xbc\xe6\x9a\xee\x16\xf7\x62\x49\xc5\x8b\xb3\xe5\x21\x71\xcf\xef\xd5\x25\x4e\x5e\x0f\x39\x71\x69\x18\x6d\xc7\xcd\x9c\x1a\x85\xc8\x10\x34\xe0\x37\x18\x3d\x6e\xa2\x2a\xee\x8b\xb7\x47\x20\xd3\x4a\xc7\xa5\xaf\x1e\x92\xfb\x81\x85\xac\xe0\x1d\x9b\xf0\xf0\xf9\x00\x61\x01\xfc\xfa\xc8\xbb\xad\x17\x1b\x43\x70\x36\xef\x16\xcd\xae\x18\x81\xfc\x32\x55\xca\x35\x9b\xba\x1e\x94\xf7\x9f\x64\x55\x55\x95\x0c\x47\x83\xba\xb0\xa9\x44\xf7\xde\x8d\xf6\x92\x58\xb6\xaf\xe2\xb5\x93\x22\x17\x19\x5d\xa2\x45\xfe\xe1\x2a\xc3\x43\x82\x4a\x0b\x64\x03\xdf\xe4\x62\xd4\x3d\x28\x8d\xb3\x1f\x99\x09\x7e\xc3\xed\xc6\xe7\x65\x47\xa3\x74\x2f\x03\xc7\x77\xef\xb1\x58\xf5\x8d\x40\x53\xfa\x6c\xc8\xd6\x8b\x19\x6a\xf4\xf9\xde\x51\x6f\xd9\xfb\x7a\x6d\x5d\x9e\xe4\xa8\x9f\x9b\x9b\xce\x1e\x4d\xee\x35\x7a\x1e\x52\xc0\x54\x4c\xfb\x35\xb7\x09\x2d\x1a\xa5\xa6\xf7\xf4\xc7\x60\x26\x10\xe9\xc0\x0e\xf5\xb8\x76\x1b\xc7\x22\x79\xba\x22\x8a\x18\xb8\x40\x0b\xd7\x6d\x5b\x2b\xfd\x7c\x3c\x04\xaa\xc4\x43\x6d\xae\x2e\x98"}, +{{0x1b,0xea,0x77,0x26,0xd9,0x12,0xc5,0x5e,0xc7,0x8b,0x0c,0x16,0x1a,0x1a,0xd3,0xc9,0xdd,0x7b,0xc3,0x29,0xf8,0x5d,0x26,0xf6,0x2b,0x92,0xe3,0x1d,0x16,0xd8,0x3b,0x48,},{0xc9,0xdd,0xb4,0x21,0x06,0xcc,0xef,0x4e,0x0e,0xf4,0x79,0x45,0x51,0xd2,0x1d,0xf9,0x4a,0x63,0x06,0x87,0x2f,0x23,0x16,0x63,0xe4,0x7e,0x24,0x1f,0x77,0xcc,0x3e,0x82,},{0xf9,0xb0,0x45,0x17,0xbd,0x4f,0xd8,0xef,0x90,0xf2,0x14,0x0f,0xc9,0x5d,0xc1,0x66,0x20,0xd1,0x60,0x2a,0xb3,0x6c,0x9b,0x16,0x5f,0xff,0x3a,0xba,0x97,0x8d,0x59,0x76,0x71,0x10,0xbb,0x4e,0x07,0xa4,0x8f,0x45,0x12,0x14,0x47,0xac,0x0c,0x1a,0xba,0xc5,0x85,0xd3,0x91,0xd4,0x04,0x20,0x41,0x89,0x86,0x28,0xa2,0xd2,0xdc,0xc2,0x51,0x0d,},"\xb1\x12\x83\xb1\xf0\xce\x54\x9e\x58\x04\x73\x0a\xc3\x20\x7a\xc0\x03\x32\xd2\xaa\xcf\x9c\x31\x0d\x38\x32\xd8\x79\xf9\x63\x4b\xd8\xa5\x8a\xdf\x19\x9e\x4b\x86\x3b\xb1\x74\x81\xd2\x8a\xcb\x2d\xa0\xe1\x55\x7b\x83\x36\xa4\x00\xf6\x29\x56\x25\x03\x1d\x09\xe4\xdf\x4d\x31\x9b\xbc\x1e\x8f\x6e\x92\x32\xd2\x30\x53\xbb\x3f\xfa\xc4\xfe\x2c\x70\xce\x30\x77\xfc\x00\x60\xa5\xcb\x46\x92\xa1\xcf\x0b\x3e\x62\xfe\x45\x48\x02\xae\x10\xb8\x3d\xed\x61\xb6\xbf\x45\x4c\xa7\x5e\x4c\xda\xd5\x53\x2f\x20\xb7\x06\x54\xf1\x2b\xa9\x06\xf0\x03\xa8\xb9\xe9\x86\xf1\x5a\x39\x41\x9d\xeb\x2e\xa1\xea\xd7\x59\x82\x90\xee\xeb\xf9\x25\x2b\x0c\x27\x60\x5a\x7a\x73\xa6\xab\xeb\xb4\x22\x71\xd7\x1a\x3c\x19\x7a\x46\xbc\xc8\xdb\x11\xd9\x24\x28\x42\xf3\x78\x36\x4a\x37\xee\xca\xa3\x4e\x98\x21\x35\xbe\x34\x18\x2c\x69\xca\x8e\x6e\x3c\x8c\x90\xe1\xb4\xb2\xb4\x75\x81\x5a\x17\x83\x77\xae\x01\x65\xa7\x64\xc8\xba\x28\x89\xb5\xab\x29\x09\x49\xd8\x48\x7a\x88\xe0\xd3\xd2\xbc\x7e\x25\x20\x17\x6a\xa6\xff\x9f\xf0\xc4\x09\xff\x80\x51\x5f\x4f\x0b\x83\xc5\xe8\x2c\x23\xfd\x33\x26\xcd\xd6\xb7\x62\x52\xe7\xfd\xdc\xd6\xe4\x77\x09\x78\xcd\x50\x3e\xd2\xd6\xb4\x80\x10\x11\x67\xd3\xf1\x91\xfe\xd8\xd6\xd7\x4d\x74\xa2\x00\x7d\xb1\x09\x2e\x46\xa2\x3d\xde\xcd\xdc\xdb\x98\x46\x64\x04\x7b\x8d\xd7\xcc\x8a\x57\x6e\x1a\x80\x6f\x52\xcb\x02\x7a\x94\x80\xa9\x5c\xc4\x4b\x1e\x6f\x2e\x28\x6e\x9b\x7a\x6b\xf7\xb3\x96\xfa\x54\x96\xb7\xa5\xb1\xc0\x3d\x9c\x5c\x27\xda\x1a\x42\x99\x0d\x10\xb1\x2f\xb8\x64\x0e\x15\x96\xf2\x6b\x36\x6d\x27\x0b\xa6\x4f\x99\xaf\xff\xe3\xfe\xce\x05\xa9\xb0\x25\x4b\x20\x8c\x79\x97\xcd\xb5\x12\xfc\x77\x52\x79\x54\xa1\xcb\x50\xfd\xab\x1c\xc9\xa4\x51\x62\x74\x1f\xd6\xf9\xd3\xfd\x5f\x2e\x38\x28\x53\xd7\x33\x5d\xba\x1e\x6b\x29\x59\xdd\x86\xe1\x25\xe6\x7b\x53\xdc\x8e\x45\x3c\x81\x0b\xc0\x1b\xf2\x0b\xce\x7b\x61\x8d\xd5\xd1\xed\x78\x41\x06\xee\x06\xa3\xec\xaf\x6b\x3b\xee\x0b\x56\x83\x3b\x0b\x81\x31\x39\xc5\xa6\x96\x00\x0a\x44\x9c\x97\x90\x6a\x2f\xbd\xdc\x2d\x9d\xe9\x40\x6e\xa2\x82\xac\x4e\xe5\xef\x8b\xf3\x85\x4c\x74\xa6\xb7\x17\x3d\xd2\xf7\x9c\x7a\x12\x6f\x3c\x7b\x04\x33\xfd\x4e\xa2\x6e\x87\x7a\x14\x83\x1d\xd4\x15\xa1\x9d"}, +{{0xd0,0x1a,0x0e,0xad,0x9d,0x69,0x48,0x33,0x28,0x3b,0x9c,0xd7,0x29,0x9a,0x7b,0xd7,0x5f,0xa9,0x0b,0x1d,0x2d,0x78,0x84,0xe4,0x55,0x7b,0x33,0xc9,0x98,0x77,0x2a,0x68,},{0xa0,0xf7,0x57,0x47,0x9b,0xa6,0x27,0xef,0xef,0x95,0xd6,0xec,0x7a,0x93,0x1d,0xfa,0xc4,0x37,0x3d,0xf3,0x3d,0xaa,0xf4,0xdd,0xc4,0xec,0x68,0x94,0xc8,0x26,0x1e,0xd7,},{0x9a,0x0f,0xf7,0xf3,0x51,0x74,0xec,0x3f,0x66,0xd2,0x2a,0x6f,0x06,0xdf,0x60,0xe0,0x9c,0x8f,0x62,0x3a,0x5a,0xca,0x81,0x0e,0x23,0xa8,0x8d,0x0e,0x6a,0x31,0xcb,0x6f,0x1c,0xe1,0xc1,0xf9,0xdc,0xcc,0x9e,0x14,0x84,0xb6,0x8d,0xd0,0x04,0xac,0x53,0x59,0x7e,0x29,0xad,0x6a,0xb7,0x2e,0x8c,0xe2,0xb7,0x5a,0xd5,0xb8,0x0e,0xb8,0x48,0x03,},"\x76\x27\x53\x4e\x9a\x83\xd1\xe4\x06\xab\x94\x8d\x30\xd1\xda\x9c\x6a\x5d\xb0\x8e\x0f\xeb\x7f\xc5\xba\x5c\xbf\x76\x84\x9e\xe8\xad\xd4\x84\x7e\xf5\xca\x5a\x0d\xae\x41\x1a\xca\x09\x74\x51\xcb\x4c\x2b\x49\x8c\x94\x70\x97\x40\x70\x07\x64\x0d\xc1\x9e\xd9\x38\xe3\xb9\x1b\xf5\x1c\x95\x81\x16\x8d\xf8\x60\xbd\x94\x75\x16\x68\xda\xbd\x72\x1d\xc7\x39\x98\x40\x0b\xe2\x0c\x9a\x56\x3d\x50\x51\xef\x70\xe3\x54\x6f\xee\x67\x33\x12\xb5\x2a\x27\x40\x41\x05\x7e\x70\x84\x8e\xb7\xc5\xa2\x16\x44\xc9\x7e\x44\x8a\xbd\x76\x40\x20\x7d\x7c\xda\xfc\xf4\x5d\xa6\xdf\x34\x94\xd3\x58\x5b\x0e\x18\xac\x5a\xc9\x08\x1c\xb7\xa4\x07\xa3\x9a\x87\x77\x05\xcb\xaf\x79\xa0\x1b\x91\x5f\x73\x6e\xb0\x25\xc5\x8b\x4b\x5d\x80\x7f\xb7\xb7\x56\x6c\x59\x69\x78\x7c\x1d\x6c\xa4\xeb\xa9\x7d\x50\x9e\xf7\xfb\x35\x50\xd2\x1d\x37\x7e\xce\xff\xcf\x0e\xb6\x68\x18\x95\xad\xbd\x24\x6e\xe7\xbf\x3c\x93\x5a\x00\x64\x78\xb8\x32\xec\xe4\x6d\xe6\x11\x8b\x17\xe4\x66\xa2\x7f\xc2\xa4\x4a\x89\x6b\xaa\xe2\x72\xf9\xec\xf0\x18\xc6\x5c\xb5\x0c\xfb\xfc\x8d\x26\x09\x94\xa1\x8a\x83\x2d\x97\x19\x28\xc4\x49\x67\x57\x24\x58\x51\x31\xc8\x71\x53\x3c\x98\x97\xd8\xf8\x0f\x9c\x04\x16\xb7\x18\x78\x6b\x10\xfe\xa8\xeb\x5b\xd8\x13\xa2\x69\xa1\xb6\x77\xb7\xa2\x50\x7a\x44\xb7\x13\xd7\x05\x08\x65\x30\x99\x5e\x59\x33\x5d\xdc\x28\x55\xe8\x47\xe4\xf4\xdb\x06\xc9\x1f\x1d\x54\x02\x3d\x8a\x10\xf6\x9f\x9e\x61\xbd\xce\x4b\x68\x6f\xb6\x17\xbd\x50\x30\xe7\x55\xca\xdb\x1f\x64\x4e\x1d\xdd\x91\x61\x9b\x96\xec\xd6\x05\xb0\x01\x98\xb9\xa6\xed\xdb\x5a\x84\xeb\xd3\x69\x2b\x66\x59\x79\x76\x66\x37\xc6\x77\x37\x8c\x1c\x77\x04\x1f\xd4\xa6\xb3\x55\x5c\x1d\xc8\xa8\x3f\xe9\x01\x3b\xb6\x10\x6c\xc1\x8a\x2b\x03\x7c\x93\x77\xb7\xa1\xa5\xa5\xd0\xdc\xc5\x49\x18\xea\xad\x7e\x32\xc8\x80\x76\x7b\x26\xfd\x2e\xa2\xd6\x8b\x04\x05\xf5\xe0\x74\xf5\x5a\x19\xd8\xa3\x9f\xfb\xb7\xdc\x32\xfa\xee\x6a\x7f\x95\x32\xae\xc8\xa0\x77\x6c\x3f\xf8\x3a\xe3\xa4\x62\x77\x38\x49\x6a\x37\x1e\xb9\xe0\x90\xb7\x4e\x0e\xdd\xec\xfc\xd4\x1b\xed\x0c\x0c\xe5\x81\x27\x52\x43\x47\x2d\x26\xda\x8c\x99\x8e\x4b\x6d\x6b\x44\xfc\x88\xba\x2a\xb5\x46\x42\x22\x54\x17\x12\x02\x94\x41\x78\x05\x74\x2b\xdb\x33\xb7\xb1\x22"}, +{{0xdf,0x64,0x89,0x40,0xb5,0x78,0xbc,0x31,0xd2,0xa6,0x52,0x96,0x5f,0x30,0x39,0x1c,0xaf,0x06,0xd5,0xf2,0x51,0x59,0x9a,0x73,0x7c,0xe1,0x0b,0xe5,0x5f,0x4a,0x9d,0x0d,},{0x27,0xde,0x92,0x04,0x19,0xc1,0x86,0xb0,0x1b,0xe5,0x42,0x79,0xfb,0x8f,0x9b,0xe4,0xbb,0x4b,0x2c,0xad,0x75,0xca,0x7e,0x8f,0x79,0x2b,0xfa,0x7b,0xb9,0x7c,0x7f,0x41,},{0x62,0xbc,0x99,0x1c,0x45,0xba,0x9b,0x26,0xbf,0x44,0x01,0x16,0x26,0x41,0x62,0xc3,0x4c,0x88,0x59,0x78,0x85,0xe9,0x60,0x50,0x83,0xc6,0x04,0xb5,0xf5,0xd8,0xfa,0x6f,0x66,0x2b,0xa2,0x14,0xf7,0x6e,0x6c,0xf8,0x4e,0x5e,0xc0,0x4d,0xf1,0xbe,0xef,0xc5,0xf2,0x5d,0x3a,0x3b,0x72,0xf9,0x8b,0x50,0x69,0x83,0x19,0x16,0xa6,0x32,0x96,0x01,},"\x1a\xe5\x20\xbe\xeb\x4a\xd0\x72\x2b\x43\x06\x7f\xa7\xcd\x28\x74\xab\xcf\x34\xdd\x92\x37\xb4\x47\x8e\xae\x97\x72\xae\xa2\x97\xa6\x7f\xb7\x9b\x33\x07\x02\x04\xba\xee\x44\x0b\x9c\x87\xe2\xfb\xcb\xeb\x76\x80\x1d\xdd\xea\x5e\x45\x30\xd8\x9e\x11\x58\x31\x79\x93\x9a\x00\xa3\x2f\x81\x13\x32\xc5\x22\x91\xcc\x7a\xc9\x1e\x5a\x97\x0c\xd5\xaa\x70\x8b\x1d\xa2\x6b\xe9\xfe\x43\x2a\x9b\xbd\xa1\x31\x9e\x31\xe4\xbc\xc9\xf1\x66\x6a\x05\xb5\xc0\x5b\x87\x6b\xfd\x1f\x76\x66\x87\xcc\xea\x4e\x44\x82\xe9\x24\x32\x9a\xfa\xce\x5e\xe5\x2e\x98\x79\xfd\x69\xb7\x6e\x0f\x7e\x45\x2e\xc4\x71\x3b\xff\x21\x6d\x00\xc8\x25\x99\xd2\x7c\xa4\x81\xf7\x3a\xae\x13\x6f\x08\x75\xc8\x8a\x66\xb1\xb6\xf3\x4c\x50\x52\x3a\xb6\x02\xe9\xd4\xeb\xb7\xee\xb9\xe0\x43\xa6\x5e\x41\x89\x9d\x79\x75\x2a\x27\x9d\x2e\xd4\x69\x93\x92\x6f\x36\x21\xe7\xc3\x2c\x9a\x9b\x3b\x59\xd8\xdd\x57\xbe\xca\x39\x28\x54\x34\xde\x99\x1c\xbd\x2d\xfc\xbc\x5c\xa6\x2a\x77\x79\xf4\x75\xd0\xce\xf2\xf3\xe5\x62\xf2\x9a\xcd\x47\x4f\x3c\x99\xec\x5b\xd8\xde\x01\x10\x1b\xed\x2e\x0c\x9b\x60\xe2\xd7\x0f\xd4\x32\xc8\x92\xfc\x66\xf8\xd4\x61\x9a\x91\x1b\x56\x25\x16\x3e\x9a\x42\xbf\x9e\xa3\x85\x86\xd8\xe7\x64\x00\x15\x64\xd3\x35\x41\x12\x25\xfc\xb0\xa0\x6d\xc2\xa8\x2d\xa0\x77\x9a\x3c\x44\x4e\xb7\x86\x42\x01\xb4\x3e\xbb\x72\xb9\x21\xf3\x4d\x3c\x13\x08\x9d\xf2\xf4\xfa\xc3\x66\xff\x1e\x3c\x0b\x96\xf9\x3d\x2b\x4d\x72\x6a\x5c\xe4\xd6\x91\x6d\x82\xc7\x8b\xe3\x54\xa1\x23\x0c\x2c\xf0\x41\x8c\x78\xa1\x91\x3e\x45\x4f\x64\x8c\xc9\x2c\x8d\xd0\xe1\x84\x64\x5f\xe3\x78\x1d\x26\x3c\xff\x69\xf5\xc6\x0b\x1e\xbb\x52\x00\x5a\x8b\x78\xa5\x15\xc7\xe8\x88\x6f\xfe\x05\x4d\xab\x42\x8e\x2e\x22\x1d\x9d\x76\xaf\xf4\x26\x54\x16\x8d\x83\x3b\x88\x17\x82\x93\xe1\xfe\xdd\x15\xd4\x6c\xd6\x09\x48\x31\x29\xc4\xd2\xd8\x44\x32\xa9\x9d\x31\xff\xe9\xbd\xb5\x66\xf8\xc7\x5c\xe6\x5e\x18\x28\x8e\x4d\xf8\xc1\x67\x31\xa0\xf3\xfd\xde\x1c\xca\x6d\x8e\xde\x04\x35\xff\x74\x36\xca\x17\xd0\xae\xb8\x8e\x98\xe8\x06\x5c\xbc\xbf\xd0\xff\x83\x04\x3a\x35\x7c\xd1\xb0\x82\xd1\x70\x3d\x46\x18\x81\x87\x2c\xdf\x74\x1e\x4f\x99\xbd\x14\x67\x45\xba\x70\x39\x74\xbe\x40\xf5\x79\xbf\x5c\x4d\xba\x5b\xdb\x8c\x94\x1b\xce"}, +{{0xc8,0xac,0x23,0x45,0x58,0xaa,0x69,0x81,0x6b,0x36,0x8b,0x77,0xb7,0xcc,0xcb,0x5c,0x8d,0x2a,0x33,0xec,0x53,0xae,0xef,0x2c,0xe2,0x28,0x71,0x43,0xbd,0x98,0xc1,0x75,},{0x53,0x64,0xba,0xf1,0xfd,0xb2,0xc6,0x38,0x40,0xb3,0x0d,0x40,0x31,0xcf,0x83,0xa2,0xe1,0x8e,0x62,0x07,0x93,0xba,0xe5,0x9d,0x10,0x35,0xc0,0xed,0xe5,0x5e,0x52,0x8b,},{0x32,0x25,0x03,0x61,0xdf,0x6e,0xd2,0x83,0x48,0x5f,0x95,0xf3,0xd3,0x57,0xa4,0xf1,0xc3,0x3a,0x8c,0xf9,0x16,0x58,0x32,0x7c,0xd4,0x53,0xd4,0x9c,0x95,0x36,0x65,0x51,0x08,0x70,0xaa,0x45,0x4c,0xfa,0x3b,0x83,0x24,0x52,0x20,0xa8,0x27,0xd0,0xec,0x74,0x77,0xf9,0xec,0xeb,0x79,0xc4,0xa2,0x9f,0x30,0x1f,0x95,0x3c,0xc8,0xca,0xac,0x07,},"\xce\x48\x8d\x26\x97\x5c\x1c\x93\x28\xb4\x7f\xa9\x2e\x19\x56\x13\x30\x04\x1b\x23\xa0\xe5\x7a\x4b\x8b\xca\x89\xeb\x5f\x61\x5e\x73\xdd\x7f\xae\x69\xc2\x38\x0e\x32\x12\xf9\xb7\x33\x41\xc3\x56\xdb\x75\xa6\x25\x6d\x7a\x20\xa9\x7f\x75\x9d\x4c\xba\x71\x97\x17\x8e\xa7\x24\xdd\x93\x29\x49\x36\x0e\x96\xc5\x0a\x4b\x3b\xa5\x5a\x95\x33\x72\xc3\x97\xb0\x96\x9c\x2b\x14\xd3\x60\x9e\x0a\x85\x2d\x48\x4d\xf7\x0e\xaa\xb1\x12\x49\xeb\xeb\x32\x37\x92\x1f\x0a\x39\xa5\x5d\x7d\xcc\xfe\xf2\x05\xd9\x4e\xc8\x0d\x9e\x1f\xd6\xa2\xc1\xef\xd2\x98\x44\x10\x1d\xfe\x2c\x5f\x66\x8a\xdb\x79\x75\x91\x5d\xed\xd0\x86\x50\x0c\xee\x2c\x1e\x23\x3e\x8e\x48\x85\x5c\xc1\xa6\xf2\x87\xd6\x3d\xce\x10\xad\xdd\x13\xca\xc7\xb7\xa1\x87\xef\xe4\x7e\x12\xd1\xc3\x5b\xb3\x97\x40\x52\xb2\x3a\x73\x66\x8d\x3e\x4c\x87\xdb\x48\x41\xaf\x84\x6e\x80\x86\x72\xc4\x3d\x0a\x15\x22\xe2\x96\x5f\x08\x39\x51\xb2\xb2\xb0\xc4\x09\x54\x8e\xe6\x18\x2f\x0c\x98\x50\x51\x4c\x9e\x6c\x10\x2f\x54\xba\x41\x24\xc9\x2a\x90\x27\x4f\x40\x58\x91\xe6\x62\xf5\xeb\xb3\x77\x1b\x85\x78\x31\x56\xe9\xe5\x83\x67\x34\xd0\x9d\x1b\xaf\x5b\x21\x34\xc9\x31\x62\xee\xc4\xbe\x03\xbd\x12\xf6\x03\xcd\x27\xbe\x8b\x76\xac\xcc\x6e\x8b\x8b\xac\x02\x0c\xba\x34\x79\x65\x1c\x9f\xfa\x53\xce\x4e\xb7\x7a\x77\x31\x3b\xc1\x26\x5d\xda\xb8\x03\xef\x7a\x65\x63\xba\x6f\x79\x9d\x1e\xf3\x0e\xf5\xa0\xb4\x12\x96\x5f\xda\xc0\xb9\xda\xb8\x42\xc7\x8e\xe2\xcc\x62\x8e\x3d\x7d\x40\x61\xe3\x4e\xde\x37\x97\xe1\x54\xb0\x6e\x8c\x66\xce\xbd\xf2\xde\xd0\xf8\x1b\x60\xf9\xf5\xcd\xda\x67\x5a\x43\x52\x77\xba\x15\x24\x55\x7e\x67\xf5\xce\xfa\xfc\xe9\x29\x29\x1d\xce\x89\xec\xb0\x8a\x17\xb6\x7a\x60\xc5\x82\xb4\x87\xbf\x2f\x61\x69\x62\x66\x15\xf3\xc2\xfe\x3b\x67\x38\x8b\x71\x3d\x35\xb9\x06\x66\x69\x96\x0d\xe4\xdb\x41\x3c\xd8\x52\x8e\xe5\x6e\xd1\x73\xe9\x76\xa3\xc9\x74\xac\x63\x3a\x71\x34\xcc\xe3\x83\x19\x73\x5f\x85\x7b\x7d\x71\xba\x07\xf4\x77\xef\x85\x84\x8a\xa8\xf3\x9e\x11\x81\x18\x77\x9e\xd8\x7b\x4f\x42\xaa\x35\x8a\x89\xf7\xec\x84\x4a\x45\x1e\x7e\x8f\xc0\xaf\x41\x8b\x85\xbc\x9b\xf2\xf2\x6d\x1e\xa1\x37\xd3\x35\xec\x7e\xe7\x57\xb7\x0a\xe2\xfd\xd9\xcc\x13\x49\x32\xf0\xe5\x42\x5b\xf3\x7f\xb9\x15\xe7\x9e"}, +{{0x2c,0x47,0xf2,0xb8,0xb9,0xd2,0xce,0xe9,0xe6,0xf6,0x54,0xbc,0x24,0x65,0x8f,0x9e,0xaf,0x43,0x9c,0x23,0xbe,0xaa,0x0a,0x79,0xbf,0x35,0xcc,0x8c,0xd2,0xde,0xba,0xf4,},{0x44,0x4a,0xf2,0xf3,0x4f,0xd3,0x2e,0x5a,0x19,0xf6,0x1f,0x87,0xd0,0x3e,0x10,0x76,0x27,0xa3,0xee,0xb8,0xbd,0x94,0xd2,0xfa,0xea,0xa3,0x48,0xb0,0x5d,0xea,0x19,0x80,},{0x85,0x54,0xb0,0x1d,0x09,0xed,0x86,0xe6,0x13,0x95,0xb9,0x1a,0x2b,0x1e,0xe1,0x87,0x15,0xc4,0x2f,0x9c,0x7e,0x7f,0x07,0x00,0xd7,0x9f,0xf9,0xfb,0x57,0x81,0x29,0x3d,0x61,0xc5,0x58,0xdd,0x5b,0x43,0x1c,0x93,0x71,0x8d,0xcc,0x0f,0x98,0xfb,0x65,0x2b,0x59,0x6f,0x18,0xc3,0x0f,0x82,0x21,0x5e,0x8e,0x63,0xe4,0xf6,0x56,0x8c,0x88,0x00,},"\x04\x4c\x8f\xaa\x8c\x8a\xaf\x9f\x2b\x81\x86\xa6\xb9\xb3\x38\x47\xec\x7b\x45\x24\x23\xb2\x2a\x91\x74\x3d\x2e\x59\x7e\xcc\x1e\x1e\x22\xae\x60\x05\x3e\x9e\xe6\x23\x3b\x04\x4e\x77\x59\x20\xe4\xe3\xd6\x67\x19\x90\x13\x25\xcf\xdd\x39\xbb\x53\x2f\x8a\xa4\x69\xaa\xb4\x2e\x96\x08\xc2\x12\x60\xc0\x4c\x27\x41\x3a\x7a\x94\xe4\x66\xf6\x3c\x49\x52\xe9\x0e\xf9\x0c\x12\x81\x4b\x34\x51\xb1\xca\xd7\xda\x91\x47\xf8\x40\x92\x20\xf6\x49\x8c\xc0\xa6\x7f\xef\x4b\xc0\x4f\xc0\x6e\x1d\x89\x8a\x55\x15\x59\x1e\x8b\xe0\xc4\x3d\x75\xa6\xfe\x42\x5b\x7c\xbe\xfb\x1b\x91\xb1\xbd\x78\xb5\xbe\xc7\x82\x90\x56\x98\x2e\xfd\xc5\xbe\x24\xaf\x66\x78\x00\x6a\xdc\x6f\x04\x46\x20\x2e\x7e\xc3\xa2\xd6\x97\x9c\xb0\xdf\x7e\x25\xd7\x42\x33\x91\x4d\x9c\x58\xb8\x1c\xf5\x5b\xe0\x69\x67\xd3\xa5\x95\xc1\xb9\x67\x28\x69\x99\x4c\xfb\xa6\x71\x62\x83\x3a\x21\x43\xaa\x91\xcc\x93\xac\xda\xfa\x5b\x45\x20\x8d\xf3\xe8\x8c\xcc\x01\xa2\xa4\xd2\x20\xe3\x60\x09\x8d\x91\x54\xd2\x25\xa7\xca\x5f\x2f\x1e\x52\xb1\x00\x3d\x10\x66\x50\xa7\x7b\x28\x3b\x95\xe4\xba\xf1\xe7\x33\x6f\xa9\xa7\x47\xa2\xb3\x82\x3d\x36\x09\x10\x41\x2e\x76\xdb\x72\x5c\xe1\xab\x1e\x1d\x18\x9d\x0d\x3a\xbe\xf8\x2d\x76\x66\xbc\xf1\xb7\x66\x69\xe0\x64\x3b\x44\xf7\x4e\x90\xce\xaf\xa0\xc8\x37\x1b\x57\xc5\x8f\x3b\x37\x0a\x54\x7c\x60\x95\x8f\x0f\xcf\x46\x1b\x31\x50\xf8\x48\xc4\x70\xfa\x07\xe2\x9b\xf5\xf0\xd4\xb5\x9e\xfa\x5a\xb0\xd0\x34\x1e\x04\x51\xd0\xab\xb2\x9d\x74\x14\xcd\xdc\x46\xcc\x6d\x74\xcf\x3d\xc2\x33\xd0\xd1\x70\x73\x87\xbd\x8c\x77\x80\xff\x78\xe5\x46\xfb\x77\x29\x4d\x58\xa5\xdd\xa5\xf0\x5c\x12\x97\xe3\xd1\x77\x11\x56\xd2\x85\x63\x5b\xf7\xec\xed\xb3\x8a\x9e\x5e\x77\x44\x98\x04\xf3\x89\x9e\xa4\x6a\x50\x26\x6b\x25\x5a\xeb\x52\xd1\x8e\x0f\xa1\x36\xe5\x35\xcc\x90\x26\xf6\x78\x55\x2f\xa3\xee\x21\x46\x08\x1d\x99\x96\x85\xe2\x4b\xf7\x80\x7c\xc4\x7c\x13\x04\x36\xc5\x44\xd3\x5b\x4b\x87\x5b\xd8\xaf\xa3\x12\xce\x3a\xe1\x7c\xf1\xc7\xf5\xea\x1e\xce\xcb\x50\xf9\x53\x44\x72\x0c\xec\xf0\x88\x43\x4f\xf8\xe0\xba\x04\x4e\xc1\x9c\x98\xad\xa7\x78\x21\x16\x30\x4c\xbe\xac\x1c\x3e\x35\xf5\xa4\xf4\x43\x13\x35\x4d\xc9\xa4\x0e\xce\x5a\x0f\x9a\xd3\xa2\x02\x5a\xce\xf2\x62\xc5\x67\x9d\x64"}, +{{0x88,0x7f,0xdb,0x48,0x70,0x68,0x1d,0x4f,0xb0,0x6a,0x93,0x62,0x59,0xf7,0x5c,0xae,0x05,0x17,0xf5,0x01,0xaf,0x64,0x6b,0xc0,0x7a,0x4d,0x72,0xbe,0xe7,0xfb,0x1c,0x73,},{0xc7,0x62,0xeb,0xd4,0x8b,0x2c,0xe0,0x2d,0x06,0x38,0x4e,0x38,0x55,0x4b,0x82,0x5a,0xd3,0x22,0xeb,0xea,0x74,0xd2,0x59,0xdf,0x15,0x47,0xa4,0xd5,0x47,0xce,0x00,0x24,},{0x41,0x0a,0x5a,0xf3,0xc5,0x9b,0x7c,0x6b,0xdb,0x21,0x4b,0x16,0x6c,0xb7,0x9d,0x96,0xf8,0x30,0xcf,0x98,0xbf,0x52,0xda,0xd7,0xb6,0xff,0x29,0x79,0xc9,0x7f,0xea,0x4f,0xed,0x5e,0xf7,0xd3,0xd4,0x9f,0x03,0x09,0x72,0x79,0xb9,0xa0,0x99,0x22,0x6e,0x2a,0x08,0xdd,0x30,0xc6,0x07,0x86,0x25,0x4e,0x2d,0xa8,0xde,0xe2,0x40,0xbf,0xc3,0x08,},"\xc5\xdc\x77\x9f\x3f\x3f\xac\x06\xdd\x28\xe5\xa6\x7e\x0e\x52\x4a\xf5\xb5\xdc\x3b\x34\x40\x96\x57\xb6\x3d\xfa\xce\x94\x71\xe9\xa4\x1e\x11\x32\x17\x5a\x0b\x56\x9c\x8f\xea\x9d\x2e\xef\x2c\xf5\xd5\x96\x2c\x7e\x0b\x61\x45\xa9\xe7\xa0\xc1\xaa\x33\x77\x20\x44\xf9\xc3\x99\x8c\x5a\x8c\x48\x86\x45\x8b\x4e\x58\x6f\x93\x07\x60\x83\x61\xf5\x11\xe7\xab\x50\x92\xac\x41\xec\x76\xe0\x58\x6e\xf5\xb9\xc2\x36\xfc\xf5\xca\x2f\xc8\xdd\x6a\xae\xb7\x89\x36\x7f\x2e\x7c\x99\x09\x32\x55\x5d\xc5\x22\x61\xe4\x4e\x49\x42\x34\x98\xb5\x24\x41\x91\x83\xb6\xc1\xf1\xd4\x2c\x45\x46\x4e\xcc\xb0\xc2\xf7\xe2\x51\x77\xfe\x5c\xd4\x63\x50\x2b\x40\x3e\x06\xd5\x11\xfc\xf9\xdc\xb6\x40\x12\xe0\xf2\x0b\x34\xc2\xea\x7c\x00\x4d\x9e\x48\x4a\x7e\xd8\x1f\x32\x60\xc4\x1c\x8b\x19\x53\x52\x9f\x47\xf7\x1e\x86\x78\x43\xcc\x3c\x33\x2a\xd0\x36\x6a\x63\x81\x7e\xd1\x2d\xd4\x73\x0d\x3d\xfd\xbd\x75\x72\xb9\xff\x79\x80\x45\x94\x0d\xd1\x9f\xad\x0c\x8a\xea\x0b\x4a\xb6\x1c\x40\x16\xde\x32\x79\x9c\x73\xaa\x2b\x92\xd2\xc2\x5e\xe9\xb7\x2d\x46\xfe\x8f\x06\x93\xc5\x87\x75\xef\xb0\x5e\x9e\x17\xa5\xc3\x46\xa8\x12\x65\xd3\x5b\xe6\x9a\x22\xd0\x95\xde\x18\x60\x66\xa5\xc6\xd8\xc0\x7a\x3d\x38\xd0\x02\xa1\x0e\x5e\xfd\xb8\x66\xda\x4a\x9b\xdd\x54\xf5\x09\x26\x61\xb6\xc2\xd7\x43\xf5\xae\xaa\x4c\x6c\x31\x8f\xb5\x93\x23\x90\x30\x57\xe4\x9c\x23\x7b\x45\xf6\x75\x42\xa4\xf2\x7c\xaf\x65\xb5\x7c\xfc\xf8\x8b\x71\x20\x3d\x43\xd7\xf9\x53\x22\x16\x0f\x95\xc2\x32\xdd\x10\xab\xb1\x13\xb7\x21\xdd\xba\x22\x26\xb0\x63\x22\x9b\xb4\x41\x02\x33\x6b\x10\xbf\x16\x56\x55\x11\x61\x24\x97\x86\xd4\x54\xf4\xe0\x90\x9d\x50\x00\x17\xf6\xc7\x56\x4f\x73\x3c\x83\x1a\xf4\xe5\xec\x94\xdf\xd3\xbf\x8f\xf5\xf3\x02\x1b\x70\xa5\xca\x5d\x28\xc6\xdf\xb8\xa2\xc1\x8a\x1a\x66\x2a\x33\x35\x9f\x26\x4d\x16\x96\x98\xc1\xab\x55\x78\x3f\xac\xa7\x3b\xd6\x8c\x0f\x79\xd1\xd0\x4a\xe0\xec\xdb\x52\xae\x76\x18\x92\xc0\x24\x93\xff\x35\xf3\xd8\x4f\x66\xe2\x36\xfc\x58\x13\x4a\xd6\xa7\x7d\x92\x25\x49\x05\xd7\x73\x90\x0d\x9d\xdf\x26\x54\xc7\x0b\x46\xf3\x41\xda\xcb\x47\x93\xca\x51\xee\xde\x45\x53\x3e\xae\xeb\x6e\x33\x23\xbc\x3e\x6c\x85\xa7\x94\x06\x51\xc4\xf6\xf9\x81\x91\xc6\x18\xc8\x91\xea\x4e\x22\x0e\xa4"}, +{{0x88,0xb3,0xb4,0x63,0xdf,0xc3,0x0d,0x01,0x5e,0xef,0xbb,0xbd,0xd5,0x0e,0x24,0xa1,0xf7,0x27,0x77,0x75,0xbc,0xef,0x14,0xa6,0xbe,0x6b,0x73,0xc8,0xc5,0xc7,0x30,0x3e,},{0xf2,0xb6,0x28,0x4c,0x93,0x0d,0x4a,0xd3,0x2d,0x0a,0xc7,0x19,0x04,0x0e,0xe7,0x88,0x6b,0x34,0x72,0x2e,0xdf,0x53,0xda,0x80,0x1a,0xcb,0x5f,0x93,0x19,0x69,0xe1,0x19,},{0x82,0x5a,0xff,0x71,0xf7,0x93,0x03,0xbf,0x45,0x92,0xbd,0x8d,0xa4,0xd7,0xd9,0x43,0x7f,0xf2,0x67,0x97,0x6f,0x74,0x64,0x37,0x65,0x59,0x88,0xdd,0xcf,0x29,0x37,0x94,0x65,0xa3,0xb4,0x8c,0x9f,0xb0,0xf3,0x1c,0xef,0x03,0xe6,0x36,0x88,0x61,0xc3,0x69,0xb4,0x36,0x4f,0xb8,0xe4,0xb0,0xc7,0x2e,0x26,0xa9,0xa9,0xdd,0xed,0x1c,0x25,0x04,},"\x17\xc3\x17\xfa\x6b\xc9\x0c\x55\x32\x32\x8f\x02\xcc\xfb\x6c\x09\x9e\x6f\xe1\x00\x01\x74\xf2\xaf\x3a\x3a\x93\x09\x42\x85\x06\x71\x7c\x5c\x43\x35\xbd\xd7\xc3\x67\xff\x4e\x44\x8a\x9c\x04\x75\x03\xaf\xba\x68\xfd\x8f\x79\x87\x23\x7b\xe7\xf7\xfb\xdc\x6d\x73\xf2\x4c\x64\x21\xca\xb4\x22\xb3\xfb\x25\xf6\x7b\x2d\x71\x04\x2e\x71\x57\x0d\xf2\xaf\x37\xbf\xe5\xc1\x14\x21\x1f\xd5\x52\x4b\x6c\x1c\x6c\xc5\x2f\xab\xc3\xcd\x7f\xb4\x64\xcd\x58\x0b\xb7\x40\x71\xcb\x30\x0f\x8c\x9f\x8a\x46\x20\x8e\x5a\xa5\xdd\xfe\xa5\xfe\x90\x69\x7a\xa2\xf1\x4c\x60\x79\x50\xc9\x8f\x23\x12\xa9\xe1\x6e\xf6\x34\x6a\x8f\xd1\x29\x23\x27\x33\x82\x7e\x15\x01\xa6\x60\xc7\x7c\x29\xc5\x6d\x2f\xdd\x1c\x55\x97\xf8\xbc\x89\xaa\xef\xe3\x71\x37\x34\xfe\x82\x85\x82\x01\x89\x1a\x11\x47\xef\xaf\x1d\x78\xa4\x71\xf9\x20\xde\xfc\x88\x03\x44\x55\x3e\xb7\x16\xcc\xe3\x26\x0e\x86\xa1\xbc\x0b\xe2\x83\x73\xa6\xa0\x66\x11\x6e\x8e\xcb\x10\xa0\xc4\xa7\x0c\xa2\xb5\x36\x4e\x11\x9f\x84\xae\xc6\x0d\xec\xed\x3a\x4e\xff\x1f\xe6\x88\xc5\xe3\xe2\x51\x47\x0a\xb5\x16\xfa\x96\x4a\x4b\x6f\x28\x36\x8d\xd1\xe2\x83\x59\x79\x34\x06\x4d\xc0\xc5\xb5\x69\x10\x62\xcb\x2e\x26\x7b\xd1\x5f\xd4\x22\xbc\xfe\xfb\x83\xcc\xef\x7a\xa9\xa2\x27\x5e\xf5\x7e\x47\x31\x49\x98\x8c\x15\x78\xfd\x18\x70\x8d\x2f\xf6\x9f\x8e\x59\x80\xaa\x82\x6a\x82\xca\xb7\xd8\xb9\x2b\xb5\x3b\xdd\x46\xdb\x04\x6e\xcd\xfc\x8c\xd7\xae\x5c\xe4\x4f\x3c\x5b\x8c\x05\x65\xb5\xd3\xc0\x72\xc7\x6b\x95\xce\x90\x0a\xc3\xee\x55\x10\xdb\x0e\x75\xd3\xa4\x15\x0a\x98\xf3\xcc\xcc\xc6\x9e\x93\x0c\x6b\xa7\x41\xdb\xb0\xeb\x9f\xb3\x19\x68\x71\xba\x20\x6a\x58\xe0\xda\xe3\x9c\x8d\x6b\xb7\x2a\x82\x39\x9c\x4b\x7b\x9d\xa3\x85\x77\xac\x17\xff\x15\x24\xd6\x53\xc0\xbf\x33\x67\x93\x23\xca\x7e\xef\x4e\x92\x28\x72\x90\x31\x56\x0e\xd8\xf2\xe5\x19\x3c\x64\x0b\x2f\x5e\x60\x80\x75\xa2\xed\x61\x42\x8d\xfc\xcd\xc0\x00\x50\xba\x4b\x99\xed\x6d\x15\x36\xd5\xac\x1e\x93\x96\x74\xb4\x1d\x16\x31\x2a\xe5\xb0\x7d\xef\x1b\xf5\x35\x89\xbe\xd4\x40\x06\x02\xee\x11\xb8\x50\x33\x0f\x38\xaa\xd3\x3e\xf0\x41\x70\xa3\x90\x5c\x28\xb5\x0e\xcc\x57\xdc\xcf\x4f\x29\xd0\xc0\x0f\x71\x3d\x32\xff\xc8\x57\x95\x65\x88\xa6\x32\x6b\x95\x49\xed\xb0\xe4\xfe\x61\x85"}, +{{0x42,0x7d,0x6e,0x42,0x39,0x17,0x89,0x68,0x31,0x60,0x1b,0x8f,0x4e,0x21,0x56,0x1d,0xb6,0x10,0x85,0x71,0xbe,0x00,0x9e,0x29,0xdc,0xa4,0x9a,0x59,0x60,0xff,0x31,0x4b,},{0x8d,0x9e,0x63,0x60,0xfd,0xef,0x24,0x99,0x75,0xdf,0x27,0xb3,0x10,0x6a,0x71,0x12,0x05,0x87,0x72,0x2d,0xf3,0x27,0x0a,0x85,0xa1,0x3a,0x8c,0x3b,0xb8,0xc9,0x80,0x9e,},{0xd1,0xc9,0xa0,0x1c,0x56,0xe3,0x39,0x60,0xf4,0x9d,0xf3,0x7e,0xab,0x96,0x3b,0xc5,0xa9,0x9f,0x25,0xc6,0x00,0x44,0x6c,0xe2,0xca,0x48,0xd9,0x13,0x9d,0xa5,0x73,0x3b,0x71,0x8f,0xbf,0x1a,0x98,0x73,0x93,0xf6,0xe5,0x82,0x3c,0x2d,0x13,0x0c,0x7c,0xe6,0x0e,0xa3,0xdb,0x35,0x43,0xc8,0x85,0x4e,0xf1,0x2b,0x98,0xd3,0x3a,0xdd,0xe7,0x05,},"\x9c\x2c\xc7\xf2\x46\x2e\x09\xc4\xc5\x8c\x27\x09\xab\x42\x59\x88\x5a\x4e\x88\x7d\x9f\xa5\x31\x88\x15\x05\xaa\xf2\x03\xc1\x63\xfb\x3a\x0d\xc0\x28\xf4\xad\xa6\x06\x70\x63\x8d\x4a\x97\x27\xa3\x90\x83\xbe\xdb\xac\xed\x58\xed\xb7\x79\xe1\xce\x6c\xcd\xfb\x42\x8c\x36\x2b\xb1\xdb\x0c\x10\x53\x00\x6b\xd8\xf4\xbe\xf8\x9a\x1a\x9d\xe0\x1c\x77\x4e\x35\x7f\x91\x0e\x5c\x39\xb2\x24\x77\x55\x5e\x5f\x7c\x04\x98\xb5\xb2\x8f\x36\x9e\x5d\x3f\xa4\x2a\xb3\x60\xe4\xf4\x51\xc6\x9f\x81\xba\x0f\x3c\xce\xd4\x3a\x55\x9d\xb6\x00\x10\x42\x78\xf8\x68\x79\x6b\x2c\x91\x1b\x3b\x03\x2b\x72\x9f\x4b\x22\xac\x14\x9d\xc4\x67\xa0\xca\xe4\x8d\x19\xe9\xd9\x85\xb4\x2b\x62\x54\x9d\xe1\x71\xff\x56\x6e\x1d\x1e\x9b\xb8\xe5\x6c\xfd\x1a\xe8\xf7\xbd\xdc\xfd\x8a\x23\x41\x82\x7d\xbe\x89\xc8\x82\xab\x3e\x49\x83\x39\xff\x68\x1c\x7d\xc1\x10\x4d\xe7\x38\xb4\x80\x31\x69\x43\x10\x9f\x70\x3d\x47\x1a\xb8\x6e\x4c\xa4\x28\x7e\x4c\xd7\x4c\x31\x2f\xf7\xd0\x37\x39\x56\x06\xfb\x25\xf8\x71\xe7\x27\x70\x78\xa7\x87\xd0\x2f\x31\xcc\x9e\x81\x5b\xe8\x60\x0a\x7c\x47\xc6\xfd\xd8\x23\x31\xae\x9c\x49\x6a\x54\x7b\xdb\x23\x5b\x8a\x56\xd5\x32\x59\xe6\x29\x61\x24\xa3\x2c\x3b\x62\x5d\x20\x24\x19\xd0\x64\xb9\xa4\xe8\x3e\xfa\x87\xf1\x35\x37\xb4\xf5\x13\xb9\x16\xa8\x4f\xc8\x66\xd8\xa8\x99\x80\x4c\x78\x33\xea\xa0\x19\xe0\xd7\xe0\xe8\x07\x5b\xd6\xb5\xcb\x6f\xfc\x76\x64\x79\xf3\xf6\xe2\x0e\x48\x1e\x6a\xb2\x7b\xd8\x08\xad\x90\x6c\xdc\xc7\x82\x74\x30\xe3\x12\xf7\x40\xf2\x75\xdd\xf5\x1d\xd8\x32\x48\xfa\x05\x7c\x43\xc9\xcb\x77\x55\x7b\x2f\xd9\xc2\xd5\x28\x24\xff\x9e\x14\x6d\xea\xc1\xe6\x69\x1d\x45\x02\x13\xbc\x59\x0a\x49\xbe\xc7\x2d\x52\xe3\x8f\x6b\x4d\xc6\xcc\xa9\x51\xee\xf2\x18\x4d\x24\x25\x03\x1a\xd5\x9b\x24\x2e\xff\xa6\x8b\x6c\x72\xc5\x4c\x9d\xfd\xb4\x19\xc0\x2e\xb4\x3e\xf3\xf3\x4d\x33\x8d\x2a\x9d\xd0\x3a\x78\xcf\xdd\x01\x40\x98\xe2\x49\x25\x9e\x77\x28\x2e\x0c\x3f\xc1\x01\x0b\x02\xa6\x7f\xf8\x51\xe9\xcf\xd9\x74\x9c\x1c\xd8\xf0\x6c\xf4\x62\xe6\xad\xe9\x95\xac\x46\x6f\xab\x5c\x79\x5e\x9e\xff\x13\xe5\x5b\x43\x50\xb9\x4c\x73\x16\xaa\x49\x8d\xf9\xfd\xee\x99\x58\x04\x77\x93\xe3\xbb\xb8\x9f\xb8\x1d\xa8\x5f\x4b\x9d\x43\xe4\xb0\xd4\x3b\x38\x1b\x94\xcd\xc9\xa9\x9d\x06"}, +{{0xbe,0x93,0x52,0x09,0xf6,0x2d,0xea,0x60,0x12,0xec,0xda,0x6a,0x61,0x56,0xcd,0x16,0x6a,0x4d,0x76,0x11,0x50,0xde,0xed,0x45,0x68,0x16,0xea,0xf0,0xce,0x78,0xa7,0xf6,},{0xd3,0x9a,0x89,0xaf,0x72,0x29,0x39,0x48,0xb1,0x34,0x21,0xfb,0x88,0x3b,0xbe,0x37,0x2a,0xf9,0x08,0x9c,0x22,0x4d,0x42,0xb9,0x01,0x97,0x9f,0x7e,0x28,0x04,0xe1,0xc0,},{0x08,0xe0,0x98,0xa7,0x49,0xfc,0xe6,0xd1,0x23,0x54,0x39,0x58,0x78,0xa8,0xbe,0x35,0xfe,0x9e,0xdf,0x72,0x68,0x4d,0xd8,0x28,0x12,0x24,0x89,0x9b,0x1c,0xae,0xa4,0xed,0x68,0x77,0x85,0xdf,0xf5,0x5a,0x19,0x98,0x9e,0x03,0x63,0x6e,0x16,0x66,0x38,0x6f,0x22,0xc3,0xf4,0x43,0xec,0xf6,0xfd,0x34,0xd5,0x99,0xff,0x3e,0xc2,0xfa,0xf1,0x01,},"\x11\x7f\x42\x7c\xb6\x81\x50\xca\xfc\xfa\x46\x2c\x42\x20\x61\x41\x42\x7c\x4d\xce\xa1\xc8\xea\xcc\x2d\x30\xbe\xd1\xe9\x02\x07\xd5\xae\x30\x5e\x1f\xc1\x6c\x54\xe4\xc5\x4c\xc6\x87\x8c\xdb\xed\xc9\xf5\x1f\xe1\x84\x61\xec\x37\xc5\x57\xb1\x15\xd1\x3c\x86\x82\xc4\xe1\x5f\x50\x52\x96\xa1\x76\x0e\x1e\x75\xf5\xab\x27\xa5\xc1\x5a\x13\x57\xd2\xc8\xc4\x0d\xd5\x35\x5f\x7c\x82\xfe\xa5\xd2\x7e\x28\x87\x63\x58\xc1\x2e\x91\x13\xee\x29\x83\xea\x6f\x09\xc6\x4e\x06\xe2\x97\xdd\x96\xb3\x4d\x9b\x5e\xd4\x9f\xc4\x7a\x88\x39\x54\x9c\x66\xb0\x02\xfe\x94\x5e\x8f\x94\xe7\xd2\x31\x5c\x50\xca\x4d\xc0\x98\xbe\x4b\x32\x89\x81\x2f\xbe\xa9\x6b\x47\xce\x60\x45\x40\xbd\xe0\xe5\xab\x0b\x1b\xc0\x36\xbe\x9b\x6a\x95\xe0\x9c\x81\xe8\x98\x64\x0c\x8f\x05\xd6\x0a\xd9\x42\x18\xd0\xe6\x6c\xeb\x85\xa2\x6b\x78\x29\x22\x20\xbf\xd0\x61\xdd\x07\x35\x12\x92\x3b\x90\xc7\x9d\xcf\x5a\x19\x35\xfa\xfe\x8e\x01\xef\x8b\xf8\x1b\x4d\x37\xc5\xa5\x71\xb5\x0c\x42\x1f\x9b\xd2\x19\x4b\xef\x35\x86\xfc\xb8\x58\x48\x77\xbb\x7e\x04\x81\x65\x5b\x05\xc7\xb6\x43\xb1\xe4\x5b\x04\x03\x62\x72\x84\x18\x52\xe3\x19\x40\xef\x8f\x3b\x6d\x4f\xeb\x5d\xf0\x79\xd1\x76\xf9\x79\xc1\x8a\x11\xa6\x6d\x12\x14\xe5\x2f\x68\x7e\x90\x63\xc1\xc2\xb7\x27\x7b\x68\x5d\x5c\x72\xad\x56\x9f\x78\x73\x83\x8f\x91\x02\x57\xa0\x53\x13\x1c\x83\xeb\xce\x86\xe6\x9d\x73\x63\x62\xbe\xbc\x96\xbb\xfa\x35\xfc\xba\x1c\xb5\x27\xe7\x48\xe5\xf5\x79\x92\x9f\xd4\x0c\x56\xb1\xa5\x1a\x22\x2e\x86\x33\x02\x70\x5c\x86\xf7\xb5\x4e\xbf\xbb\x94\x82\xf7\xe2\x80\xf7\xbe\xc8\xca\xf3\xa6\xb5\x67\x1a\xc3\x0c\xd1\xbe\x52\x92\x88\x79\x7c\x01\x3c\xe5\x6b\xd1\x86\xde\x7d\xfc\x18\x28\x69\x14\x25\xc1\x47\xc5\x17\x4a\x29\x0d\x80\xcb\xd5\x9c\x19\xda\x7a\xdf\x77\x91\x88\x82\xa7\xb2\xa9\xa6\x4e\x6d\x76\xb4\x8b\x92\xf2\xa2\x66\xee\xe6\xe2\x51\xd2\xe8\x17\x65\x2b\x88\xb5\x02\xde\x73\x99\x78\x2d\x75\x29\xa8\x1d\x0a\x36\x39\x96\xb9\xdf\x68\xb1\x5a\x76\x30\x90\x4c\x8c\x24\x60\x81\xfa\x4f\x09\x29\x9f\x15\x75\x79\x58\xe0\x89\xa9\x01\xc3\x56\x46\x15\xc0\xf7\xcf\x27\x52\xb8\xb9\xe5\x21\x33\x8d\x83\x6e\x3d\xae\x4c\xe2\x37\x46\x42\x25\x3c\x4c\x98\x31\x97\x4e\x5d\x8c\x28\x42\xf4\x90\x07\xb7\x17\x75\x09\x3d\xfe\x57\xf4\x44\x92\xf0"}, +{{0x68,0x18,0xc6,0x0b,0xb6,0x43,0x9a,0xc2,0xee,0xe2,0xd4,0xe1,0x28,0xe9,0xd8,0x69,0x1d,0x4a,0xd5,0xd3,0x63,0xfe,0xd7,0xd6,0x57,0x7a,0x62,0xb6,0x56,0x99,0x94,0xa4,},{0x73,0x45,0xec,0x11,0xbc,0xcc,0x05,0x6f,0xc4,0xef,0xfa,0x3e,0x4e,0xf6,0x70,0x99,0x6a,0xa2,0x6a,0x1b,0xb1,0xb8,0x33,0x91,0xba,0xbc,0x39,0xa1,0xa5,0x96,0x01,0xf9,},{0x15,0x05,0x96,0x7a,0x27,0xb9,0xf8,0x6e,0x92,0x42,0x44,0x40,0x02,0xa1,0xe3,0x19,0x7d,0x74,0xdd,0xcd,0x89,0x65,0x9e,0xc5,0x14,0x02,0x02,0xaa,0xc7,0x94,0xb8,0xad,0xc1,0x93,0xe7,0xd3,0x0f,0x33,0x82,0x64,0x29,0x90,0xf6,0xfe,0xd7,0xa9,0x99,0xca,0xc8,0xc6,0x1e,0xaa,0x39,0xb7,0xd9,0x08,0x16,0xf1,0xd7,0x38,0x74,0x4b,0xe1,0x01,},"\xb2\xae\x65\x8b\x3c\x13\xc3\xcd\xeb\x1d\xc9\x93\xb0\xf4\x5d\x63\xa2\xea\x9a\xbd\x0b\x7a\x04\xf1\xf5\xce\x59\x32\x80\x6c\x2c\xa9\xb7\xa2\x04\xfb\xf8\xd0\x66\xb7\xf0\xfe\x6a\xe0\xd1\xda\x68\xc8\x85\xee\x11\xf6\xf6\xdb\x7e\x83\x20\xa2\xea\x65\x0b\x53\x38\x51\xcd\xd9\x9d\x90\x3a\xa0\xb3\xfa\xa3\xc9\x50\xf7\x02\xf0\x4e\x86\xb4\xee\xb3\xa1\xc7\xbc\x85\x4b\x25\x14\xfa\x5b\x47\x66\xd3\x75\xb4\xf1\xad\x61\x07\x53\x78\xdd\x92\xfd\x62\x6c\x2b\x47\xe0\x13\x83\xea\x72\x98\x79\x59\x26\x2c\x56\x28\x62\xb4\x5b\x75\x57\x67\x14\x13\xb6\x66\x14\xbc\xc9\xf7\xbd\xb9\xee\x46\xcb\xed\x89\x65\xbf\xa5\x05\x31\x50\x90\xc7\x20\x4b\xea\x89\x17\x5b\xe5\xf2\x08\x02\xe3\xde\xdd\xcb\xd8\xdd\x64\xcf\xef\x7e\xe6\xa6\xe3\x86\x0c\xe1\xe5\x79\x9d\xf5\xd8\x10\xd5\xec\xf3\x2e\x61\x5d\x16\xdf\xf8\x7a\xbd\x4a\x63\x6e\xa1\x7a\xa4\xec\xe5\xb6\xb2\xc0\x46\xb6\x5b\x5a\xf7\x49\x86\x2b\x45\x79\x0c\x39\x17\x68\x20\xb3\x69\x01\xbe\x64\x9c\xf4\x16\x9d\xf7\xe9\x23\x95\x6d\x96\x06\x49\x50\xc5\x55\xf4\x5a\xcb\x94\x50\x7c\xfd\x0c\x3b\x33\xb0\x80\x78\x5e\x35\xc0\xd2\xb0\xad\xdc\x4c\x0a\xd3\xfb\x21\x6a\xc2\xe6\x01\xc9\xc7\xe6\x17\xda\xbd\xa3\x33\xda\xe6\x03\xcc\x9d\xb1\xfc\x62\xae\x4e\x0e\x45\xe3\xcc\xdd\x16\x6a\x67\x81\xe2\x43\xb7\xda\xa1\x38\x80\x66\x32\xf5\x38\x84\x4e\xe3\xd1\x40\xb7\xa8\xbb\x2b\x54\x01\x00\x77\x8c\x45\x8e\x06\x61\x70\x70\x5e\x5f\xb2\xc8\x80\x29\x09\x8b\x99\x2c\x39\xbc\x9f\xf6\x33\x0b\xfc\xfe\x77\x52\x32\x0e\x6e\xa0\x94\x9d\x2c\x87\x1a\xed\xc1\x87\xbe\x27\xfe\xf7\xdb\x5f\x72\xa6\xa7\x73\xed\xde\x0d\xc5\x2a\xe2\xed\x93\x1c\xb2\x68\x17\xb8\x5b\x15\x45\x89\x4d\x92\x29\x8a\xaf\x87\xcc\xbc\x78\x3e\x8d\xd6\xd1\x64\x93\xf5\x6e\xad\x2b\xa8\x52\xee\x9c\x7d\x10\x07\x44\x06\x44\x0d\x2a\x27\x9a\xbc\x87\x4f\x15\x46\x8d\xd6\x6a\x71\x7b\xac\xe3\x7b\xe7\xb7\x05\x5d\xd9\x68\x1f\x8b\xe8\x13\x29\xee\x7a\xf9\x7e\x3a\xbc\x43\x4a\xc1\xc9\x3a\xec\x58\x2f\x23\xfd\x1e\xc0\xfa\x5a\xaf\xcf\x7b\xfb\xda\x00\xff\xa9\x7a\xe3\x17\xae\x91\x8d\x34\x9d\x21\xa7\xf4\x61\x91\x42\xba\x23\xda\xce\xf7\xb3\x90\xae\x26\xa1\x7e\x2e\x29\x62\xae\x27\x00\x53\x76\xb7\x2d\x4d\xa9\xe2\x97\x96\x53\xa6\x63\x25\xa1\x46\x17\x63\x8d\xbe\x1a\x55\x40\xb6\x83\xac\x00\x17"}, +{{0x6d,0x1d,0xa5,0xb4,0x83,0xe6,0x4b,0x03,0x65,0x99,0x0f,0xf0,0x93,0x81,0xfb,0x17,0x02,0xfd,0x8e,0xc3,0xa1,0xa3,0x69,0xcd,0x52,0xe4,0xc5,0x67,0x13,0xa3,0x14,0xa5,},{0x08,0x05,0x5c,0x26,0x1f,0x26,0xe0,0x2a,0x65,0x8f,0x66,0xd9,0xba,0x01,0xfc,0xde,0x53,0xe9,0xad,0xe3,0xed,0xc6,0xbf,0x81,0x5e,0x4a,0x68,0x02,0xe1,0x67,0x7a,0xb3,},{0xa5,0xb8,0xb4,0x4a,0x91,0x44,0x4c,0x64,0x37,0x4b,0x52,0x3c,0xb4,0xdc,0xb0,0xce,0xf4,0xce,0x52,0x40,0x8b,0x98,0x12,0x6d,0x7e,0x1a,0xe8,0xbd,0xc2,0x8c,0xf5,0x14,0x70,0xce,0x4e,0x25,0x3e,0x0b,0xe6,0x2b,0xd6,0x8e,0xbf,0x5f,0xa6,0xbc,0xe1,0x58,0x5e,0xcc,0xfa,0x92,0x56,0xc0,0x73,0xee,0x03,0xe5,0x4c,0x52,0x5b,0xbe,0x2d,0x0a,},"\x79\xa2\xc3\x70\x55\xf1\x89\xf3\x24\x7f\x1f\x8c\xea\x19\xb2\xea\x40\xd8\x58\xdb\x1f\x5d\x13\x92\xee\x6d\x41\x1c\x78\x02\xee\x23\xde\x52\xad\x02\x81\x17\x25\xa9\x4d\x76\x67\x5d\xa8\x9a\x96\xb5\xd0\x7a\xbc\xee\x23\x3a\x1a\x2e\x1f\xa3\x24\xff\xf9\xe7\x8a\x4c\x19\x61\x47\xf8\x57\x0b\x0b\x13\x71\x3d\x96\xaa\x5d\x75\x0a\x15\xd7\xcd\x16\x2e\x7b\xa2\xe7\x53\x33\x60\x7d\xd6\x98\xeb\x47\x73\xc7\xe9\x1f\x76\x68\xff\x8b\x62\xf0\x46\x40\xeb\x12\xec\xf1\x22\xfc\xe6\xb8\x32\xe0\xd0\xdf\x92\x8e\xef\xd2\xc2\x00\x23\x64\xaf\x6b\xb5\x52\x91\xd3\xf5\x49\x29\x08\x5b\xe3\x38\x34\x2f\x09\xda\x73\xe2\x79\xc8\x7c\x83\x24\x55\x58\x19\xed\x57\xe7\x8d\x7a\xc4\x09\x51\xd3\x3f\x65\xb9\x4a\xa1\xe5\x55\xe9\x2a\x06\x3d\x11\xf1\xff\x7b\x12\x69\x43\x41\xe3\xfe\x44\x49\x33\xd0\x1a\xa3\x67\x53\xed\x3c\xdd\xa8\x90\xbd\xf9\x5a\x82\x05\xb5\xd8\x93\x22\x19\x91\xc7\x95\xad\x0a\x4a\x94\x6f\x58\xd4\x0a\x45\x34\x51\xaf\x21\x4f\xd4\x65\xe2\x8d\x3e\x2f\x0a\x56\xaa\x56\xde\xf8\xdc\x04\xaa\xd3\x57\x13\xab\xfc\x8b\xd7\x85\x6d\x5a\x9d\xc3\xf6\x0a\x3f\x2b\xd3\xe6\x36\x6f\x1f\x24\x4e\x94\x1d\x6a\xea\x89\x2f\x6a\x88\x93\x1f\xe1\xc3\x13\xe0\x90\x78\xe9\x0b\xc6\x39\x2d\x49\x05\x33\xc9\xea\x3f\xf6\xde\xaf\x3a\xad\xfa\x8d\xfd\xc4\xe9\x0f\x64\xaf\x47\x58\x9e\xa6\x5a\x87\xac\xd2\x19\x96\x02\x35\x1d\x3a\xfc\x21\x03\x19\x6e\x03\x94\xed\x52\x3a\xa7\x99\xd3\x1e\x11\xd3\x4f\xff\x54\x6d\x44\xf4\x36\xb3\x48\x59\xf9\xcf\xbc\x9c\xe4\x03\xde\x5a\x98\x30\xec\x3d\x45\x3f\x0d\x45\x97\x0f\x57\x2c\x14\x4f\x19\x1b\x2f\xbb\x2d\x0e\xa6\xcc\x9c\x8e\x24\xd9\xc0\xb2\x18\x3b\x27\x80\x72\xeb\xb0\xbe\x2d\x70\xd0\x37\xfd\x2e\x8e\xc1\x8d\xc4\xc9\xb2\x1a\xbd\xc6\xa4\xce\x8d\x46\x68\xa2\x20\xee\xbd\x69\x34\xf0\x4b\xaf\x0e\x88\xa4\x88\xd2\xdf\xc7\x35\xa7\xc5\xa7\x0d\xbb\x01\x66\xa2\x1a\xe0\x11\xfc\x6e\x7d\xa1\x0f\xc3\x20\x33\x62\x71\xd9\xee\xad\x51\x0a\x6f\x70\x32\xf2\x29\x66\x92\xbe\x50\x80\x21\xbc\x98\xc1\x70\xbe\x42\x35\xf7\xce\x31\xf2\xbc\xd6\x34\x11\x63\x68\x33\x76\xae\x2c\x56\x62\xcb\x47\x70\xc9\x6e\x01\x8e\xf1\xbf\x47\x91\x33\x19\xc9\xa0\x9b\x9e\x96\x5a\xb5\xc3\xe9\x7b\xbc\x75\x6a\x56\x66\xb4\x56\x7f\x2c\xff\x2d\x0c\x3a\x6a\x40\x26\x15\x8c\xb9\xf9\x0f\x95\x00\x56"}, +{{0x51,0x46,0xf5,0xb7,0xf1,0xba,0xa1,0x9f,0xc8,0xcd,0x78,0x5c,0x89,0x6e,0x0f,0x90,0xf9,0xf6,0x59,0xb7,0x7b,0x1b,0x9b,0xb4,0xad,0xca,0xb5,0xa6,0x26,0x72,0x05,0xe4,},{0x68,0x8a,0x8d,0xe6,0x4e,0xff,0x33,0xba,0x6b,0xbe,0x36,0xcd,0xd6,0xa3,0x84,0xbb,0x67,0xb3,0xf4,0x26,0x36,0xdb,0x23,0x4f,0xf5,0xef,0xe0,0xb3,0x17,0x43,0xc7,0xe6,},{0x4b,0xdb,0xd7,0xc6,0x4f,0x13,0xe2,0x78,0xc2,0x39,0x69,0xe7,0xeb,0x38,0x6b,0xbe,0x49,0x9d,0xbd,0xef,0xc3,0xff,0x4e,0x30,0xcf,0xac,0x5c,0xf8,0x6f,0x21,0x6c,0x24,0xc9,0xe6,0xcd,0xe2,0x0e,0x52,0x9d,0x14,0x7f,0xb7,0xea,0x08,0xf2,0x59,0x3a,0xd5,0x09,0x03,0xb5,0xed,0xbf,0x86,0xb4,0xd2,0x8f,0x2e,0xb3,0x2e,0xf1,0x37,0xf0,0x0c,},"\x97\xbd\x99\xf5\x18\xee\x07\x88\xd5\x76\xd9\x9c\x04\x3b\x44\x9d\xfc\x24\x2a\xc5\xee\xae\xc3\x44\xa1\x94\x32\xb3\x45\x96\x2e\xc4\x12\xce\x55\x36\x2b\x3b\x85\x1d\x98\x11\x9f\xce\xb9\x32\x83\x47\xf6\xfc\xc6\x8d\xbf\x56\xa2\x81\x4d\xb0\x9e\x93\x85\x84\x3a\x93\x11\x89\xea\x3e\x72\xda\x9d\x79\xa4\x56\x93\x05\x3c\x03\x57\x01\xdc\x55\x51\x24\x0f\x95\xb3\x03\xfb\xa1\x6f\x89\xaa\x53\xa4\x38\x82\xb0\xf1\x38\x12\x02\xc7\x8f\x9c\x74\x19\x89\x9f\x23\x51\xec\xa9\x5e\x20\xbf\xee\x76\x35\x1c\x48\xd0\x04\x99\xf5\x91\xda\x56\xa9\x95\x24\xbb\x74\xfe\x1c\x83\x4e\xe9\x10\x77\x13\x9f\x1e\xdf\x67\x31\x5c\x07\xa3\xfd\x97\xf8\x0b\x7c\x27\x6b\x6c\xf6\xb5\xcc\x36\xbe\x36\x3b\x73\x12\x17\xf6\x31\x9f\x51\x29\xba\x7b\x14\xd0\x54\xc8\xd8\x1d\x8e\x3a\x3f\x3b\xe6\x2a\xc3\x1f\xf6\x2d\xf6\xa3\xb2\xee\x25\x96\x96\x9b\x99\x17\x04\xb3\x1c\x68\x99\x97\xab\x46\x28\xbc\x26\x60\xc6\x78\x72\x13\x2e\x85\xda\x0c\x4f\xcf\x56\x79\x65\xf1\x25\x4a\x8f\x43\x26\x92\xa1\x7b\xb8\x6c\xb3\xc1\xdc\xba\xac\x93\x95\x52\xf0\x9e\x50\xec\x5b\x0d\xe2\xef\x85\xe0\xac\x25\x3a\x41\x65\x65\x5d\xb5\xb5\xc4\x98\x03\x82\x1d\x85\x9c\x60\x96\x1e\x06\x1d\x58\x27\x8b\x82\x7d\xd4\xd3\xbc\x47\xf1\xc2\x2d\xe0\x94\x90\x6b\xdb\xbf\x3b\xad\xbd\xde\x22\xba\x24\x25\x58\x55\xeb\x86\xd1\xd7\xf3\x70\x82\x05\x93\x11\xdc\x07\x28\xeb\xea\xf2\x6c\x44\x73\xba\xd1\xfa\x9e\x61\x4b\x53\x3b\x81\x1b\x6b\xcb\x06\x50\xc0\x6d\x87\x9a\x52\x45\x78\x8f\x34\x01\xb4\x61\x97\x30\x07\x74\xa9\xaa\x73\xcd\x97\x8c\x05\x30\xc8\x1a\x53\xbd\xb3\xfc\x93\x24\x14\xb3\xe3\x04\x40\xdc\x12\x74\x41\xef\xf1\x60\x5e\x7f\xd9\xac\x8c\x63\x2e\x82\xbf\x1b\x45\x3d\x4f\x33\xa5\x7e\x4b\x67\xb0\xb6\xfc\xf6\xed\x55\x55\xb5\xf5\xa3\x00\xa1\x4a\x00\xd0\x38\x5a\x33\x75\x05\x25\xb0\x0e\xdb\x31\x2c\x6b\xfd\xd6\x4e\xdd\x3b\x53\x16\xd1\x9f\x95\x8c\x51\x76\x34\xf0\x13\xb0\x08\x93\x6d\x34\xe9\xb5\xe1\xe9\x28\x3a\x5f\x0f\xd7\x78\x33\x77\xc0\xe5\x09\x06\x41\xbb\x9d\x33\x8c\xf3\x13\x3a\xcd\x0b\x97\x1e\x53\x79\x04\xf1\x7a\xf9\x29\x11\xaf\xad\x72\xee\x97\xf9\xa8\x28\x3a\x16\xa7\xe2\x6a\xb4\x28\x41\x6c\x10\x17\xda\xe9\xb1\xa9\x9c\x4c\x33\x20\xad\x16\x3b\xdc\xfc\x32\x8b\xfa\xf9\xb8\xd5\xd7\xd2\x6d\x41\xd1\xef\x21\xa5\x20\x8f\x01"}, +{{0x5e,0x6f,0xda,0xc9,0x35,0x1a,0x63,0x7b,0x99,0xf3,0x3a,0x26,0x4e,0x12,0x87,0x69,0x7e,0x2a,0xba,0xb0,0xcc,0xa1,0x66,0x21,0x79,0x24,0x84,0xf5,0x60,0x6f,0x44,0xc1,},{0x57,0xe5,0xf8,0x8a,0xcd,0xdc,0x8c,0xde,0x7d,0xd0,0x7a,0x31,0x46,0xfb,0x1d,0x4f,0x7a,0x9b,0x63,0x83,0xa8,0xf6,0xb2,0xb8,0xd9,0xb0,0x7e,0xbc,0x3f,0xc4,0xdd,0x20,},{0x98,0x7e,0x32,0xe0,0x0a,0x8a,0x16,0x32,0xf4,0x7b,0x50,0x31,0x94,0x35,0x5c,0x98,0x0c,0xb2,0x2a,0xde,0xb3,0x26,0xb4,0xe3,0x11,0x5e,0xca,0xb0,0x4b,0x70,0x4d,0x18,0x6c,0xd9,0x2e,0x3c,0x3a,0xc7,0xb4,0xe2,0x93,0x6c,0xbd,0x07,0xcb,0x79,0x4e,0xc0,0xcf,0xe9,0x1a,0x97,0x87,0x2f,0xf2,0xb4,0x13,0x76,0xf5,0xf1,0x8f,0x55,0xb8,0x05,},"\x4d\x6c\xd3\xbc\x2f\x86\x26\x6b\x8b\xb1\xb6\x1d\x0e\x1c\xaa\x9b\xd2\xd4\xa1\x80\x36\x1a\xef\x3a\x18\xd3\x90\xb1\x0f\x7e\x86\x0f\x69\x7e\x24\x7e\xb6\xc3\xe5\x1d\x3b\x97\x6b\xf0\xca\x18\x3d\x01\xa6\x98\x80\xf1\x5c\x94\xb8\x75\x66\x8c\xa3\x0d\xad\xa0\x89\x5b\xed\xd4\xd7\x05\xa0\xe0\x33\x04\xd0\x63\xde\xa8\x7c\x7f\xde\xc9\x8b\x89\xc0\x6f\x13\x0d\xd5\xbd\x58\x6b\x54\xd9\xba\x73\x78\x26\xbb\x40\x5c\xd8\xac\x8b\xbc\x95\x00\xac\xda\x3c\x07\x46\x1d\x00\x94\x40\xaf\x0b\x25\x31\xe7\x2f\x3f\xf5\x01\x6a\xe2\xd8\x6d\x69\xb8\x7f\xb2\x73\xd1\xe8\xdd\x5f\x6a\x26\x4b\xee\xbb\x2f\x88\x59\x96\x74\x1f\xfd\xa2\x77\xa0\xfb\xf8\xef\x08\xf8\x1f\x22\xee\x59\x61\xd9\xd3\xfc\x93\x83\x62\xe1\xca\x12\x00\x4a\x91\xd9\xb5\xf7\xa6\x83\x3a\x6c\x22\x95\x5a\xc0\xcd\xa3\x39\x06\x71\x91\x0c\xbd\x51\xe6\x85\xfe\x09\x59\x73\xe4\x15\xfc\x2d\xb8\xad\xf1\x0b\x14\x7e\xc7\x08\x0c\x3b\x8e\xbd\x07\xd2\x1b\xb9\x55\x6d\xa8\x54\x30\xa2\x68\xee\xd8\x48\x6b\x1e\x31\xc9\x43\x13\xb0\x16\x49\xfe\x91\xb2\x22\xf8\x5a\xde\xe1\x5e\xb7\x77\x07\xd7\x8f\xfc\xb6\x60\x92\x65\x44\xd3\x3b\xe9\x99\x4a\x29\x76\x20\xdc\x7a\xed\x97\xf3\x92\x63\x90\x53\xf3\x88\xb0\xb3\xaa\x3b\xd0\xac\x5b\x03\x3c\xb4\x14\xbe\x52\x0b\x43\xdf\x68\x26\xb9\x76\x89\x0d\x0c\x53\xb9\x7b\x6c\x92\xe7\xd1\xa1\x57\x3d\x0c\x74\x94\xd7\x47\xe0\xca\xd9\xbd\x8e\xa5\x38\xd6\x2a\xd5\x98\x01\xad\x07\x16\xf1\x70\x19\x3e\x30\x09\xd9\x95\x9c\x55\xd2\xff\x64\x79\x9b\xd9\x59\x35\x9a\xbb\x94\xca\x97\x23\xb5\xff\xc2\x4c\x95\x07\xf8\xc5\xfd\x6e\x88\xea\xae\x7a\x70\xad\xd8\x4d\x74\x4c\xcf\x8b\x98\x36\x37\x88\xf0\xbf\xb1\xa0\x25\x22\x02\x57\x51\xe5\x34\x71\x0d\x40\xa2\xd3\x8a\x79\x11\x94\xeb\xa2\x93\xfd\x20\x46\xcc\x14\xdd\x38\x76\xd1\x68\xfc\x6e\x23\x6c\xbe\x14\x6d\x63\x69\xd2\x25\xbf\xa6\x7e\x53\x97\x98\x65\xf7\x88\x73\xa9\xfc\xf0\x3c\x18\x6f\xa8\x52\x1f\x0a\x55\x45\xac\xce\xe8\x0d\x1e\x55\x10\x72\x21\xe2\x1f\x0f\x22\x91\xc1\x43\xde\x02\x3e\x88\xd7\x33\x0c\xc8\x7d\x4c\x51\xff\x29\xa3\x09\x06\x05\xe9\x73\x94\x90\xc1\xdc\xee\x71\x34\x95\xf2\x31\xc2\xa3\x6b\x11\xab\x23\x55\x47\xfb\x63\x28\xf7\x47\x33\x6d\x9b\x1e\xf2\x5a\x8a\xb9\x9c\xed\xa9\x57\xb2\xdc\xce\xe4\x07\x5b\x0d\x03\x38\x1b\x94\xae\x18\xd0\x41\xea"}, +{{0xfc,0xff,0xf0,0x93,0x2d,0xc8,0x6e,0xa5,0x90,0x2a,0x8d,0x33,0x07,0x33,0x29,0x96,0x0c,0xd8,0x18,0x8a,0x07,0x5d,0xd0,0xbc,0xdf,0xa8,0x38,0x2c,0x20,0xb0,0xe7,0x8f,},{0x0c,0x92,0x05,0xa9,0x0b,0xbe,0x7f,0x2d,0x50,0x5e,0x17,0xfa,0x3d,0x08,0x0b,0x52,0x2a,0x1d,0x7a,0x15,0x2c,0xad,0x2d,0x85,0xd3,0x1b,0x34,0xa0,0x47,0x1c,0x0d,0x4c,},{0x37,0xdd,0xd8,0x3f,0x98,0xb0,0x57,0xb7,0xcb,0x32,0x08,0xa8,0x32,0xc5,0x8a,0xa9,0x06,0x94,0x56,0x3c,0x23,0x54,0x8d,0x43,0x22,0x91,0x38,0x0b,0x73,0x59,0x13,0x01,0xf2,0x74,0xb0,0x4c,0xee,0x2e,0xf7,0x8c,0x06,0xd9,0x6c,0x3d,0x9b,0x7c,0x17,0x52,0x1a,0xae,0x1a,0x8c,0xa5,0x0d,0x34,0x7c,0x09,0xc3,0xcf,0x70,0x3b,0xc8,0x83,0x0b,},"\x3d\x4b\x76\x12\x23\x73\xe2\x12\xa3\x46\xd1\x9a\x66\xbb\xfc\x4b\x62\x32\x92\x64\x9b\xd0\xce\x5c\xf6\xbb\x13\x56\x48\xbd\x01\xdb\x74\x03\xb3\xd0\xbd\xd1\x69\x7f\xf4\xe6\xe9\x08\x90\x41\x16\x75\x4d\x37\x0c\x40\xd7\x00\xcd\xb6\x64\xc4\x6a\x91\xdd\x84\xa3\x58\xb9\xd2\x38\x14\x43\xe6\x0f\x2c\x3f\x56\x40\x26\x1b\x6b\x85\x8b\xa8\xf8\x28\xb0\x97\x1f\x41\x22\xb2\x02\x88\xa2\x6b\xa2\x09\x0b\xa1\x4f\xd2\x76\x36\x0c\xc6\x86\x79\xcd\x84\x19\xae\x19\xc6\xd4\xdc\x7b\x66\x14\xc0\x6d\xf5\xe5\xc0\x51\x0e\x2c\xb6\x86\xde\x0e\xbd\x75\xe5\x21\x0a\x21\x55\x62\x58\x9b\x28\xc9\xcc\xc7\xd2\x72\xb9\x8b\xd4\xbf\x93\x49\x5e\xfe\x4f\xc5\xb7\x8d\xef\xec\xfb\xca\xa9\xfe\x12\x6b\xad\x30\xe8\x9b\x3a\x38\x9b\x42\x56\xf6\xa4\x8a\x76\xc3\x45\xde\x5a\x36\xa1\x44\x9f\x08\x34\x5b\x9a\x5e\x6a\x00\x1d\xa1\xff\x9c\xd4\x33\x70\x93\x48\xe9\xae\xfb\xc7\x8b\xa5\x2d\x3a\xb3\xb4\x69\x86\x93\x5e\xba\x8e\xcf\x81\xed\xc4\x3c\x5b\x2e\x3b\x5e\xb3\x8d\x9a\x16\x5e\x9e\x7f\x72\xf6\x17\x60\x54\x63\xbe\xdb\xa9\x73\xeb\xfd\xcd\xf2\xb0\x88\x9c\x71\x41\x2f\x8f\x85\x0c\x7a\x3b\x55\x18\xec\xd8\x9d\x2e\x25\xc0\xc1\xc3\x0f\x08\x5a\x0f\xfe\x54\x0e\xf9\xc0\xe8\x8f\xc7\xec\x4a\xf1\x94\x8a\x4e\x6f\x7a\x6e\x25\x6b\x30\x7a\x11\x27\xb7\x1b\xa6\x86\xef\xea\xdc\xa0\xe4\x86\x09\x47\xcf\x67\x4f\xce\xd6\xca\xf7\x31\x0c\xcb\xaa\x8d\x90\x47\xda\xed\x30\xfd\x55\x85\xd4\x1d\xde\xae\x4d\xf2\xfe\xd4\xb6\x22\x80\x32\xc3\xe4\xae\x23\x80\xe8\x7e\xc6\xcd\x72\xe4\xd7\x4b\x8b\x4c\x38\x13\xfb\x04\x33\x89\x39\x1e\x9c\x13\xf7\xd3\x3c\x3a\xab\x5a\x78\xfc\x4c\x6a\x63\x4c\x61\xa7\x0f\x02\xa9\x40\x54\x8d\xa1\x77\xc6\x5d\xf6\xab\x17\xcd\x96\x83\xf3\x7e\xa8\x21\xc7\x40\x88\x9d\x82\xe8\x8c\x83\x4e\x7d\x5d\xc1\x16\x62\xea\x78\xb1\x3c\x6a\x4b\x62\x18\xd3\x17\x84\x21\x9a\x47\x67\x59\x5b\x1a\x56\x21\x65\x25\xcd\x68\x93\x8b\x22\xbd\xb1\xf8\xc5\xa7\xf1\x70\x1a\xfe\xb9\x61\x88\x8e\x2e\x0e\xc0\xc8\x38\xcd\x62\x0c\xb7\xdd\x8a\x14\x93\xa0\x2c\xd5\x6b\x54\x51\x25\xe4\x70\x0c\x08\x89\xfa\x26\x44\xe6\x44\xa3\xaf\x53\x1d\x1c\xd6\xbc\x95\xe5\xdf\x91\x75\xf1\x37\xf2\x84\x08\xcb\x69\x9c\x7a\xe6\x6f\x65\xd1\xd2\x93\x0f\xac\x57\xca\x8a\x60\xe6\x31\x1a\x40\x78\x48\x8c\x9e\xa4\x04\x94\x8a\x9d\xeb\xeb\x9d\x5e\x10"}, +{{0xa1,0xe4,0xfc,0xfd,0xe0,0x44,0xf1,0xbb,0x0e,0x7b,0xbc,0x63,0x1a,0x83,0x1a,0x8d,0x07,0xe9,0x0a,0xe0,0x8a,0x96,0x6a,0xd6,0x27,0xb6,0x20,0xb1,0xe2,0x8c,0x42,0xcf,},{0x25,0x56,0x0f,0x31,0x16,0x8b,0xd4,0xb7,0x25,0x52,0xed,0xed,0xd0,0x8b,0xb6,0xbf,0x79,0xa9,0x40,0x63,0xc1,0xf1,0xe1,0xd3,0x04,0x86,0x9d,0xd1,0xce,0x04,0x9b,0x95,},{0xc8,0x00,0x15,0x27,0xbd,0x90,0x2c,0x15,0xc3,0xdd,0x5a,0xe1,0x81,0x80,0x52,0x5b,0x5e,0x82,0x02,0xbe,0x66,0x71,0x1f,0x82,0x88,0x5c,0x82,0x22,0xa1,0x5f,0x06,0x00,0x92,0xa2,0xa6,0xe2,0xf7,0xd7,0xe9,0x80,0x31,0x12,0x09,0x19,0x1b,0x32,0xb8,0xad,0xe4,0x8d,0x3e,0xa9,0x8c,0xf2,0x45,0xf0,0xfa,0xd6,0x2c,0x00,0x9c,0x5a,0x71,0x08,},"\x8c\x14\x54\xd4\xe0\x8a\x14\x01\x64\x6b\xf7\xa8\x85\x9e\x8a\x14\x5e\x85\xee\xeb\x40\xdb\x38\xff\x01\x69\x70\x96\x41\x21\x2c\x81\xb6\x73\x90\x74\x9c\x01\xa7\x98\x07\xf3\xcc\xad\xbb\xd2\x25\x6f\x36\xff\xc1\x80\xcf\x9b\xa4\x4b\xf4\xa7\x61\x2d\x44\x1c\x23\xb2\xe2\x5d\x33\xc4\x8a\x73\xe1\x6c\xe3\x57\x56\x27\x58\xad\xb0\x05\x53\xc3\x14\x2f\xb8\x17\x6b\x6a\xe8\xfb\x61\x0a\x60\xf9\x23\xb0\x91\x18\x14\xb1\x0f\x56\x79\x93\x6c\x36\x77\xb7\x0e\x84\x6e\x21\x8f\x58\x75\x67\xf2\x01\x9c\x7d\x28\x2a\x10\x7f\x3c\xc8\x47\x63\xad\xae\xc8\x89\x93\xc0\xcc\x50\x03\xe7\x7a\xf6\x0d\x67\xdb\x53\xf8\xcb\x72\x7a\xa6\x67\x2d\xe0\x04\x49\x8c\x3b\x3e\x22\x2a\xa7\x08\x2d\x91\xf9\x8a\x1a\x06\x83\x74\xc5\x10\xff\x53\xa5\xe5\x59\xcb\xe2\xd6\xc7\xc3\x44\x2d\x72\x38\x90\x7c\x81\x1d\x58\xaa\x7f\x5a\x46\xb8\x31\x12\x44\xf0\xdb\xe1\xb9\xc0\xe9\x44\xdd\xa1\xd8\x01\x08\x64\x94\x9c\x59\x39\x6c\x6b\x34\x6a\x11\xf3\xaa\x86\x6d\x6b\xce\xad\xfc\x90\x90\x38\xd2\x2e\xfb\xc8\xf1\xda\xc8\x10\xa9\xf2\xfa\xfc\xce\x7c\x03\x89\xeb\x0a\x56\xc0\xf6\x8c\xae\x24\xae\x3d\xdb\xdf\xf7\x11\x6d\x2f\xad\xeb\x9b\x0e\x75\x09\x53\x6f\xdc\x3b\x83\xe7\x13\x54\xda\x6a\x1a\xed\x16\x88\x74\x90\xdc\x2f\x4d\xf5\x7b\xba\xa7\x24\x45\x28\xfa\x30\x94\xb9\x9e\x86\x75\x81\xac\xef\x90\x62\x70\xb2\xcf\x4d\xed\xa6\xb8\xfd\x9d\xbb\x79\xad\xd7\xbe\xa8\xf8\x6f\xcb\x1f\x64\xdf\xd5\x0e\x38\x5b\x42\x09\xec\x0b\x1a\x9f\x6d\x2e\x51\x90\x68\x29\x7a\x2b\x5c\x40\x5c\x21\x6b\x4a\x2e\xd9\x83\xff\x69\xc5\x9b\x53\x0e\xff\xa6\x0c\x03\x67\x05\x12\x67\xdd\x2b\xbd\x1e\x86\xa9\xab\x5a\x11\x4d\xd4\xf6\x9b\x54\x0b\xfa\xbf\xe9\x7c\x04\x03\xb8\xfc\xbb\x27\x62\x57\x61\xed\xa3\xe2\xad\x8e\x62\x5c\xfe\x4b\x61\x5b\x70\x25\x53\x1a\x49\x89\x18\xc2\x4e\x02\xa0\x0e\x79\x7b\xba\xfd\x14\xf9\xd3\xf6\x82\x7e\x39\x00\x63\xc4\x36\x08\x06\x88\xd0\x37\xa6\xe2\x99\x3c\x56\xd3\xa8\xe9\x5f\x37\x5c\x10\x04\x0b\xf0\x4f\x03\x0c\x97\x26\x23\xd9\xe3\x80\x1c\x13\xb4\xec\x8d\x01\xcf\x18\x38\x55\xf5\x93\x5f\x10\xdd\xb2\xc5\x4c\x51\xc8\x0c\xbe\xd0\xc2\x4d\xb5\x6e\x1e\xd1\x48\x93\x1d\x89\x16\x1c\x5e\xa3\x7c\x2f\x97\x87\xf8\x8e\xf7\x33\x0e\x5d\xcd\x0e\x43\xd8\x1b\xfc\x8b\xf2\x3d\xdf\x79\x83\xcc\x1d\x73\x38\x43\xa3\x3c\xcb\x39\x5d\xfc"}, +{{0xbe,0xd1,0xbb,0xca,0xe1,0x86,0x43,0xd6,0xf6,0xaa,0xc3,0x4f,0x3d,0x9b,0x6a,0x14,0x78,0x39,0x4d,0x02,0xb9,0x31,0xcf,0xf0,0x06,0xd8,0x5f,0x21,0xb7,0xdb,0xc7,0x47,},{0x4f,0x52,0x8b,0x38,0x18,0x5a,0x42,0x4c,0x6f,0xde,0xce,0x46,0x51,0x1a,0x0c,0x29,0xb7,0xc0,0x4b,0x32,0xeb,0x04,0x83,0xab,0xb5,0x2d,0x5f,0x8e,0xb6,0xb3,0x52,0xeb,},{0x0f,0xc9,0x9d,0xd3,0xb9,0xa0,0xe8,0xb1,0xfc,0x6e,0x63,0x5a,0xf5,0xc6,0x40,0x06,0xb6,0x72,0x00,0xfe,0x95,0x8f,0x53,0xcc,0xe1,0xb9,0xb0,0x91,0xa4,0xe7,0x06,0x69,0xb5,0x93,0xf1,0x55,0x94,0xbc,0x08,0x42,0xe5,0x57,0x62,0x59,0xf9,0xa6,0x85,0x9a,0x0d,0xb2,0x2d,0x74,0x0f,0x9f,0x80,0x24,0xb5,0xba,0xf1,0xef,0x6f,0x95,0x8c,0x05,},"\xff\x7c\x64\x13\xe6\x18\xa0\x56\xde\x40\x1e\xe1\x0c\x40\xad\xe3\xd7\xc0\xe6\x86\x14\x95\xd9\x7c\x26\x89\xec\x6a\xbb\x69\xdd\x2a\xe7\x01\xfd\xca\xc8\xf0\x83\x31\xea\x5c\x5f\x5d\x80\x5b\x57\x89\xee\x5e\x24\x1f\xf4\xac\x8b\x96\x0f\x4f\x2b\x9f\xef\x6a\x72\x7f\xad\x86\xdc\xd4\x32\xde\x9f\xad\x6b\xa4\x5e\x00\xaa\x36\x87\xb0\xce\xeb\x2c\x0d\x43\x0b\x7d\x5f\xde\x63\xb4\xf6\xb9\x82\xc4\xf9\xe0\x3c\x43\x0a\xba\xd9\x04\x4d\x06\xdc\x49\xe8\x9d\xf4\x81\x40\x5d\x8f\xeb\xbb\x06\x53\xe9\x68\x69\x48\xaa\xd2\xd9\x07\x25\x44\xdf\x94\x24\xfd\x48\x7f\x4e\x24\xba\x7f\x24\x55\xdd\xec\x41\x05\x82\x8c\x39\x81\xbd\xdb\xb1\xb7\xfb\xdb\xac\x15\x59\x03\xe9\x60\xfc\xd9\x4c\x07\x16\xe7\x36\xf5\x19\x86\x7f\xbc\x52\xc5\x12\x60\xf5\x71\xd7\xed\xcb\x08\x1a\x23\x55\x0a\xd8\xc7\x0b\xb2\x68\x86\x4a\xb2\x76\xaa\x2c\xc2\xdb\xf6\x23\x83\xbb\x66\x03\x0e\xbe\x94\x35\x41\x74\xcc\xec\x2d\x2a\x90\x75\x78\x55\x64\x44\x50\x7c\xbf\x84\x88\xbb\x23\xc6\x24\x23\xa3\xa9\x8d\xa7\xcc\x96\x8f\x59\x9d\x3d\xc8\x4d\xca\x3a\xfa\xd7\xf1\x4e\xc3\x06\xe1\xdb\x53\x41\x43\x21\x6a\xa2\x2a\xd1\x80\x74\xc7\x19\x57\x08\x05\xea\x46\xbc\x86\xb7\x1a\x8f\xf5\x8e\x41\xe7\x3c\xb2\x9a\xd5\x75\x0f\xcf\xc9\xa1\xc5\x42\x92\xb6\x4b\x47\xec\x95\x38\xf5\x38\x16\xe3\x6e\xd0\xd0\xc1\xae\x5e\xad\x06\xd4\x77\xaa\x97\x5e\xce\xba\xf6\x2d\x90\x23\xb7\x7e\x50\xe7\xb6\xd4\xab\xda\xa4\x85\xea\x34\xec\x76\x6b\xeb\x1d\x9b\xa0\x3c\x9c\x06\x71\x86\xe2\xe3\x82\x66\xc6\xe2\x53\x1e\x97\x48\x02\x14\x63\x8a\x2b\xb3\x14\x31\xac\x20\x86\x79\x71\x55\xfc\x77\x5b\x3a\xad\x8d\x5a\x0b\x90\x4c\x38\x1e\xdd\x0c\x6b\xc2\x3c\x66\xa1\x90\x49\x55\xed\x45\x0a\x9c\xbd\x16\x45\x9c\x32\xf5\xca\x35\x4b\xbc\x2d\xa7\xb1\xa4\xd8\x14\xf1\xb8\x71\x0a\xad\xb2\xcc\xc4\xf3\x97\x75\x8b\x7e\x9d\x91\xf3\xa9\x1e\x58\x25\xab\x86\x82\xff\x5e\x41\x70\x2e\x07\x84\x1a\xc7\x69\x8c\x3d\xa9\xf5\x58\xed\xd0\x1f\x86\xce\x2c\x50\x6b\xf4\xc2\x14\x9a\xc9\xc1\x95\xa5\x9c\x7d\xd7\xd4\xec\xf9\x3c\x90\xb4\x42\x3b\x43\x50\x58\x8d\x41\x67\x2c\xed\xc8\x51\x0a\x7a\xd5\x3b\x4b\x7e\xdc\xaf\x23\xe4\x3e\x05\x66\x9d\x27\xa1\xfe\x97\xb7\x87\x30\xd3\xfc\x06\x0b\xd4\xed\xd9\x87\x2c\xff\xb9\x62\x85\x35\x1b\xef\x14\x8e\xf7\x83\xab\x39\x21\x16\xbd\x7b\x90\x7b\xad"}, +{{0xc7,0x18,0x82,0x3f,0x43,0xdb,0x22,0x17,0xc6,0x6a,0xb2,0x89,0x97,0x04,0x16,0x5d,0x20,0x85,0x73,0xde,0x60,0xf3,0x3b,0xc0,0xb9,0x33,0x8d,0x88,0x0f,0x19,0x3f,0xb5,},{0x29,0x40,0xb8,0x79,0xb6,0x3f,0x2c,0xb1,0xf6,0xe3,0xef,0x9c,0x9d,0x33,0x3b,0xa9,0x17,0x70,0xfe,0x18,0xcc,0x5a,0x34,0x7f,0xdf,0x12,0xb0,0xef,0xc5,0xca,0x2e,0xc9,},{0x4c,0x9c,0xdb,0x1a,0xd4,0x65,0x09,0x56,0x0d,0x87,0x1d,0x30,0x89,0xaf,0xb8,0x73,0x46,0x48,0x20,0x1b,0x10,0xac,0xc9,0x53,0xe8,0xb6,0x1f,0x2c,0xce,0x2d,0xba,0xe0,0xfb,0x9b,0x86,0x8a,0xc9,0x57,0x43,0x2b,0x72,0x22,0xdb,0xf7,0xe4,0xcf,0x0b,0xc7,0x53,0x09,0xbe,0xa3,0x60,0xb2,0x63,0xab,0xbd,0xe1,0x88,0x53,0x2d,0xda,0x25,0x04,},"\x05\x0e\x68\x77\xf6\x5e\xc7\x26\xee\xc7\x01\x86\x3f\xab\x14\x0b\x99\x4a\xa1\xe9\x2a\x48\x7d\xb1\xa1\x87\x01\x31\x20\x57\xdb\x44\xbf\xde\x70\x91\x1e\xc2\x6e\xaa\x28\x63\x2d\x03\x79\x4d\x54\x5d\xfc\xb2\xae\xd4\x34\x0c\xab\x7d\x09\x25\x95\xcd\x59\xed\x23\x99\x40\x43\xf5\x0b\xa6\x96\xe9\x80\x2b\xd6\x49\x90\x12\x13\x97\x28\x64\x57\xae\x69\xd7\x6c\xb8\xe3\x4d\x7c\x1a\xb2\x45\xcb\x07\xb1\xb4\x08\xf2\xbb\xbf\xdf\x33\xa1\xbd\xd5\x59\x63\x67\x02\xc9\x18\xf9\x82\xc2\xac\x02\x21\xf7\xf9\x4d\xb9\x1e\xde\xfc\xe2\x81\x18\x25\x9f\x89\xd9\x94\xda\xd5\xbb\x01\x3c\x67\x8c\x1c\x33\x8b\x65\x39\x6b\x15\xe8\x89\x9c\x16\x99\x21\xf2\x78\x85\x9c\xe0\xc8\x56\xd8\x89\xb8\xc6\x34\x18\xeb\xc5\x73\xd2\xd6\x25\xd5\xb5\x93\x88\x39\xf2\xb1\x69\xb6\x91\x6d\x8e\x40\xdd\xe7\x0d\x3b\x72\x88\x7a\xd2\x47\x8e\xf6\xfb\x12\x84\xfa\x0e\x4f\xc5\x24\xe3\xc6\xfa\x1d\xd2\x2b\xa6\xb8\x1d\xef\x82\x79\xf3\x82\xbc\xb4\x50\x48\x85\x1b\x17\xcd\x65\x9d\x59\x40\x9f\x57\x1f\xa8\xa9\x20\xa2\x09\x34\xd9\xdb\xe1\x02\x2d\x63\x58\x40\x96\x54\x00\x24\x0f\x87\x0a\xce\xff\xd5\xdb\x7c\x7d\xf0\x8a\xf8\x9e\x47\xe1\xb9\xe2\x0b\xb9\x9f\x96\xab\x07\x3e\xdf\x53\x69\x4c\x74\x82\x89\x0e\x36\x31\x34\x02\x17\xe6\x87\xab\x27\xc9\x84\xb6\x08\x25\x16\x94\x57\xd4\x35\xa5\x40\x9a\xd8\xe4\x2d\xa0\xaa\x63\xe2\x0c\x2b\xc6\x7b\xd8\xb9\xa2\x67\xf3\x96\x73\xa7\x7f\x7f\x31\x36\xdc\x5c\xb2\xd2\x49\x48\xdb\xe7\xbc\xd7\x12\x93\x18\xc6\x8c\x6f\xe9\x5d\xd4\xdd\x4f\xe9\x42\x28\x68\x31\xea\x53\x35\x2f\xbb\x25\x2a\x12\x88\xbc\xd8\x38\x92\x13\x56\x78\x5d\x07\x21\x34\xcb\x82\x0f\x62\x79\xcc\x71\x46\x1f\x43\x1b\xe9\xd3\x01\x47\x24\x32\x1c\x92\xfd\xc5\x76\x32\x01\x37\x70\x5c\xff\xb2\xc2\x36\x64\xb7\x05\xe9\xbe\x60\xae\x1a\x19\x0f\x3e\x34\x84\xf7\x00\x58\xe7\x02\x40\x7b\x05\x6d\x7f\xe5\xd3\x1c\xee\x9c\x2a\x6a\xc6\xea\xda\x35\x16\xab\xc5\x51\x72\x56\xdf\x12\x43\x78\x0a\x03\xbb\x00\xba\x00\xce\x24\x80\x76\xee\xca\x6f\xee\x91\xd5\xef\x9e\xb9\x07\xb8\x01\xaf\x09\x7f\x3e\x9e\xb2\x56\xbd\xcd\xe8\x1e\xfe\x4b\xaf\x81\x89\xb0\x39\x9e\x36\xf1\xea\xa3\xab\x62\x66\x17\xcf\x3b\x47\xdd\x89\xca\xf6\x9c\x64\xc5\xb8\xf6\x8b\xd9\x17\xfe\x03\xe4\x66\x85\x38\x46\x0a\x1b\xe8\x8d\x9a\x84\x6c\xef\x39\x93\x46\x27\xd4\x74\x73\x4f"}, +{{0x25,0x43,0xd1,0x66,0xc9,0xf5,0xf7,0x42,0x7f,0xf3,0x03,0x4f,0xfa,0x81,0x03,0xcb,0x11,0x7b,0xf4,0x72,0x33,0x1a,0x73,0xd9,0xa2,0xf1,0xbc,0x0a,0x02,0xa6,0xff,0x1b,},{0x42,0x67,0x8c,0xf3,0x85,0x70,0x21,0xaa,0x55,0x67,0x70,0x6d,0xb0,0x31,0xe7,0x92,0x71,0x5c,0xca,0xf8,0xab,0xb0,0x2a,0x04,0x2b,0xad,0x17,0xdb,0x3d,0x5f,0xa1,0x03,},{0x20,0xea,0x93,0x68,0xa2,0xcc,0xd0,0x8b,0xf9,0xcb,0xf4,0x8d,0x4a,0x2f,0x7d,0x03,0xf0,0xdb,0x08,0xa5,0x4b,0x87,0x67,0x9c,0xda,0x03,0xe2,0x96,0xaf,0x9e,0xf3,0x78,0xbe,0x9b,0x8f,0x04,0xb4,0x06,0x5b,0x00,0x9d,0xa6,0xdb,0x01,0x6f,0x3d,0xf9,0xdb,0x64,0x82,0x58,0x73,0xe2,0xfb,0x4d,0xe3,0x04,0x49,0x91,0x5c,0xd7,0x3c,0x46,0x09,},"\x74\x6d\x7a\xbf\x0b\xfb\x26\x62\xc2\x5a\xb5\xc5\xe4\x61\x2c\x30\x6f\x16\xd1\x3e\x44\xd0\xdb\x39\x4a\x00\x15\x67\x6c\xe6\x09\x78\x4f\x03\x23\xda\x1d\xfa\x94\xd2\xb2\xf1\xf6\xe0\x24\x44\xa9\x36\xd0\x19\xb1\x43\x02\x1f\x73\xc7\x9d\xf9\x30\x9e\x7b\xdf\xf3\x9d\xae\xec\x4c\xac\xa0\x0c\xba\x4e\xf3\x1c\x83\x10\xc1\xa0\x8e\xf4\xb3\x6f\x81\xc3\x77\x84\x6b\x5b\x90\xac\xd4\x11\xaa\x67\x1e\xd7\xaf\x27\x8a\x24\x22\x9b\x78\x93\xc1\xb4\x15\xd7\x98\x88\xd7\x63\x7f\x5c\xb5\xc9\xc6\xc6\x31\xae\x5f\xfa\x29\xf1\x34\x0e\x44\x40\x96\xab\x53\x36\x17\xfd\xcb\x80\xff\x81\xda\x0a\x7c\x6c\x14\x2e\xe0\xfe\x5e\xa8\x2f\x68\xcc\x3e\xa3\x8b\x56\xf2\x72\xb0\xd8\x0f\xd5\xf4\xf5\x5c\xa9\x34\x8c\x16\x18\x81\x43\x58\x13\xc3\xfa\x9f\xff\x66\xa2\xee\x6d\x5b\xd3\xed\xba\x0d\x2f\x9a\xa7\x4b\x1c\x44\xbf\xd0\xe6\x46\x78\xd3\x71\x51\x24\x96\x3a\xc5\x75\xff\xb0\x9e\xe1\x64\x37\xda\x48\x4b\x3b\xa5\x8e\x5a\xeb\x8e\xd8\xc5\xc0\xf4\x7b\x59\x90\x8f\xe5\x80\xf3\x7e\xc1\xde\x26\x6b\x29\x5d\x6b\xe8\x5e\x62\x35\x8e\x9b\xbd\xc7\x89\x64\xfb\x83\x7e\xea\x29\xfd\xb7\xde\x86\xcc\x56\xf4\x8b\xd9\xa3\xe6\xe2\xbe\x51\xd8\xa1\xdc\xff\x3c\xa4\xd5\x6e\xa9\x34\xc6\x82\x77\x2b\xca\xfb\x51\x49\x7b\xe5\xd0\xf2\xa2\x3d\xd4\x97\x0c\x02\xc4\x4c\x09\xad\x89\x7b\x42\x41\xac\xd7\xd6\xab\x12\xd8\xf0\x0c\x9a\xad\xc3\x34\xb4\x31\xfe\xc5\xbb\x69\xa2\x85\xb7\x55\x0a\x63\x9e\xce\x96\x95\x26\x82\xb7\x33\x4b\x68\xc6\x51\x52\xe8\x93\xb1\xc8\x10\x0c\x69\x4d\x8c\x5c\xfe\x26\xac\x03\xc1\xf3\x91\x4e\x65\xc8\x4f\x0e\x77\x72\x90\xc7\x6f\x6a\xcc\xe3\x40\xbf\xf6\x6d\xa7\x22\x0f\x73\x17\x5e\x94\xaf\x52\xf9\xf1\x9e\x61\xf8\x0d\xc1\xf3\x57\x16\xb3\xf4\x8d\xfa\x50\x25\xc9\xeb\xef\x73\x82\xe0\x55\x83\x0f\x5b\xbf\x15\xc6\xf6\xa9\x50\x32\x90\x9c\x89\x2c\x0f\x89\xc8\xc1\x5f\xc3\xea\x40\xa2\x0e\xe1\xa4\x52\x9b\x52\x19\x51\xdf\x44\xd9\xd7\x9d\x74\xe0\xc4\xc2\xe0\xfe\xd8\x49\xb8\x78\x52\x06\xdb\xe6\x2b\xfa\x2c\xa2\x10\x87\xa9\x12\xe9\xb1\x84\x55\x16\x59\xcd\x8a\x58\x7e\x95\xb0\x43\x17\x19\x25\x96\xbb\x0b\x7f\xc9\xf7\xbb\xb6\xee\x04\x9c\x8b\x02\xfd\xd7\x58\xb4\xe7\x98\x82\x07\x3b\x71\xea\xab\x18\xaa\x29\x37\x01\xc1\x7d\x55\xf9\xec\x46\xc5\x2d\xe1\xe8\x86\xb6\x75\x0f\xb0\xfb\xcd\x64\xf4\x56\x8a\x21\x0a\xe4\x51\xe9"}, +{{0x85,0xe0,0xa8,0x0f,0x3b,0x30,0xc2,0x01,0x99,0xd9,0xc1,0xec,0x66,0x2e,0x39,0x2f,0xdf,0x15,0x46,0x37,0x73,0x43,0xf1,0x24,0x71,0xdb,0x2a,0x03,0x10,0xa7,0x05,0xbd,},{0x54,0x0a,0x3a,0x1d,0x83,0x67,0x2e,0x49,0x50,0x34,0xcf,0xf4,0x08,0xe1,0xfb,0xe8,0x2e,0x53,0x8f,0x09,0x17,0xe8,0xa1,0xc7,0xd1,0x7a,0xab,0x58,0xe0,0x43,0xd3,0xc6,},{0x18,0x5e,0xf2,0x24,0x6a,0xba,0x2b,0x1a,0x56,0x80,0x32,0xc7,0xdf,0x93,0xc6,0x67,0x79,0x9b,0x8a,0x52,0x1a,0x6f,0x97,0x32,0x1e,0xad,0x58,0x66,0xb4,0xcb,0x9c,0x65,0xb6,0x4a,0x1c,0x40,0xb9,0xb6,0xa9,0x10,0xe7,0x42,0xdc,0x32,0xa7,0xe6,0x6d,0x11,0xea,0x45,0xdb,0xea,0xac,0xae,0x9f,0x09,0x51,0x1b,0x81,0x01,0xf8,0xaf,0x0c,0x0c,},"\xd2\x80\x2f\x15\x96\xf8\x38\x3b\x64\xed\xbd\xc5\x94\x06\x0b\xff\x0e\x70\x13\xd5\xb7\xc8\x5d\x83\x0f\xae\x11\xae\xb3\x4d\xd5\x94\x95\x9d\xa6\x24\xe0\x44\x47\x4c\x54\x09\xc0\x05\x96\x73\xbd\xc6\x1a\x67\x1e\xf5\xb0\xb8\xa2\x6f\x30\x10\x0b\x3b\x73\x96\x8d\x8e\x4d\x83\xa7\x2f\x25\xb5\x13\x44\x8d\x2f\x6b\x6a\x44\x75\xfd\xf8\x9e\x31\xca\x92\x68\xa3\x07\x05\xaf\x3f\x64\x9e\x3f\xe0\x1d\xde\x0c\xf4\xb2\x9e\xc2\xda\x54\x36\x44\x4a\xf0\x91\xd6\x27\x30\xac\xd4\xca\xb6\x08\xf0\xdf\x26\xf0\x88\xc6\xb9\xb9\x67\x37\x94\xf0\x74\x7d\xab\x2c\xe1\x90\xf9\x05\x92\x00\x9f\xdc\xe5\x46\x4b\x36\x61\xb7\xe8\x62\x0b\xad\x65\x50\x9a\x6c\x75\x2b\x72\x7a\x8d\xc8\xd3\xef\xa5\x84\xfd\xe0\x27\x2c\x45\x1d\x65\xa9\x3b\xec\xe4\xf5\x9d\x87\xdc\x6f\xbe\xb4\x51\x40\x1e\x3e\x2e\x00\x3c\x6a\xca\x7b\x3d\x3f\x92\x71\x91\x50\xc6\x77\x8f\x01\x5a\xff\x2a\x59\xbf\xbf\x2e\x91\xb2\x1b\x0a\xd6\x87\x75\x36\xeb\x54\x56\x70\x59\xf5\x87\xf5\x4d\x4e\x2a\x6f\xe1\xfd\xcd\xd6\xa7\xfd\xcb\x85\x15\x57\x5b\xcc\x37\x05\xd7\x78\x59\x35\x2f\xa0\xb0\x44\x16\x6e\x3c\x31\x88\x46\xa5\xdf\x33\x56\x30\x03\xcb\x20\xbc\x94\x2d\x30\x39\x10\x93\xe8\xd5\x83\xe8\xe6\x4d\xec\x57\x0e\xe1\xc4\x13\x87\x62\xf6\x48\x38\x98\xd3\x2e\x20\x32\xbd\xe9\xbb\xe0\x7e\xc2\xc3\xeb\x47\xd9\x68\x76\xf0\xfc\x0f\x02\x4d\x75\x3c\xeb\x34\xff\x84\x80\xb4\xcf\x57\x62\x30\xbb\x82\x63\xdd\x80\xee\xac\x66\x2e\xba\x31\xd8\xa6\x1f\x30\x9e\x17\x5f\x4c\x01\x43\xe2\x8a\x85\x2b\x1c\x30\x61\xce\x78\xef\xbd\x16\xa2\x87\x3d\xd2\x81\x98\xa4\x6e\xc0\xa8\x00\xb3\x0d\xc8\xa9\x3b\x8d\xbb\x81\xa7\x30\xde\x45\x0b\x86\x4d\xea\x76\x80\xe5\x09\xd8\x00\xe8\x23\x29\xc2\x61\xb0\x7e\x72\xaa\x80\xee\x16\xec\x37\x5d\xdb\xbb\x6f\xe3\xd8\xd4\x7b\x0e\x3c\x5a\x9f\x23\xc4\xd2\x0b\x72\x4c\x1d\xf5\x98\x35\xd8\x30\xdd\x22\xd1\x04\x03\xd8\xf1\x5c\x10\x2c\x4b\x37\x69\xc4\x16\x66\xc3\xab\x8c\x7e\x80\xb9\x40\xd0\xbb\xb5\x86\x52\xd1\x0a\x3f\xfe\x8d\x44\xdf\x10\x12\xa3\xdd\xc4\xe1\xc5\x18\xd4\x90\x19\xf7\xc5\xd3\xd9\xf9\x5e\xd9\x3a\x31\x97\x46\xd1\xe5\x43\xff\xa6\x9e\xdb\x49\xbb\x34\x39\xf8\xa3\x25\xac\x6a\x0c\xb4\xed\xd6\x5b\xa6\x00\x80\xa0\x44\x7c\x67\x4f\xaa\x72\xd8\xae\xbd\xb5\xd2\x54\x4f\x2f\x2d\x84\x7c\x72\xc2\xdf\xa6\x05\x7a\x69\x0a\xdc\x5c\x44\x1a"}, +{{0x82,0xa2,0xc6,0x49,0x3f,0x11,0xba,0x80,0xe4,0xb8,0xb3,0xb4,0x38,0x41,0xbe,0x97,0x0e,0x2a,0x10,0xa9,0x4d,0x22,0x49,0xd8,0xac,0x6f,0x54,0x14,0xcf,0x5a,0x3c,0xb5,},{0x4c,0x2e,0xe0,0x1c,0xde,0xa0,0x7d,0xb3,0x63,0x5f,0x5d,0x4c,0x10,0x82,0xb9,0x2f,0x29,0x8d,0xeb,0x17,0xd0,0xf9,0x05,0xdf,0x71,0xb6,0x6f,0xb2,0x27,0x4e,0xae,0x99,},{0x68,0xa9,0x1d,0x4f,0x8d,0x24,0x1c,0x1d,0xef,0xbd,0x5c,0xa9,0xe9,0xe1,0xed,0x82,0x74,0x41,0x95,0x06,0x75,0x1c,0x96,0x79,0x47,0xb1,0x0d,0x50,0x11,0x8b,0xbf,0xab,0xc7,0x65,0xff,0xd7,0xb3,0x1a,0x01,0x67,0xc4,0xfd,0x8b,0x11,0x75,0x33,0x24,0x12,0xdf,0x19,0xd8,0xaa,0x1a,0x90,0x95,0x90,0x86,0x13,0x20,0x92,0x3d,0xbc,0xb2,0x04,},"\x09\x85\x4d\x13\x68\x49\x50\x41\x9e\x0b\xb1\x64\x64\xe0\x99\x88\x90\x5c\x02\x17\x18\x3a\xa1\xe4\x8a\xdb\x14\x7b\xfc\xc2\xeb\x57\xc2\x30\x0b\x0d\xfc\x39\xd4\x89\x66\x55\xa5\x7a\xe2\x04\x15\x40\x8b\xb5\xf2\xc2\x38\x01\x39\x55\xf0\xa4\xfc\x78\x2e\x0c\x99\x3f\xe4\x2c\xb0\x8c\xd8\xcf\x41\x5c\xcb\xd6\xcf\x1c\xee\x2e\x80\x97\xf0\x4e\x8f\x09\xae\x5d\xa5\xf4\x15\xb1\x6c\x2c\xb3\x0c\xb2\xab\x66\x52\xba\x50\xeb\xbc\xae\x4a\x59\xe3\x1f\xe1\x1e\x7e\xf3\x69\x9c\xa9\x0a\xaf\xa5\x86\xbb\x24\x2c\x89\xcd\x2e\x33\x2b\x2b\xfa\x2f\x81\x42\xac\xca\xf4\x36\xf8\x9b\x64\x53\xbb\x48\x05\xa1\xe7\xf3\xab\x62\x70\xf0\xda\xf8\x93\x89\xe7\x17\xd1\xb7\x01\x75\xec\x57\x07\xc8\xf5\x12\xc4\x0a\xb9\x24\xc4\x57\xe9\xf0\x91\x47\x91\x75\x0d\xc2\x92\xbb\x27\xd6\xf6\x3b\xa8\xcc\xf5\x4b\x90\xd3\xeb\xa7\xf1\x9e\xb3\x00\xd9\xeb\x8f\x3b\x72\x03\x2b\xa9\x30\x37\xf5\x52\xb4\x09\xb5\x80\xa5\xf6\x51\x16\xfa\xff\xe0\xfd\xfd\xc6\xdb\x38\x81\x38\x6c\x3c\xbc\x16\xb6\x7e\xb2\x57\x63\xd7\xae\x3a\xac\x0b\x85\xaa\x1e\x9a\xa2\x2e\x49\x59\x60\x9d\x43\x81\xe4\xb6\xd7\x15\x9f\xf3\xe3\xb2\xd3\x7b\x64\x0f\x88\xcf\xbe\x4f\x8a\x77\xf8\x01\x64\x57\x22\x8b\xa6\xd3\xaf\x5c\x4e\x33\x12\x5d\x48\xbc\xfc\xf3\x67\x8c\x16\x3b\x69\x8e\x52\xe8\x56\x17\xab\x1a\x75\xff\x20\xc6\x90\xab\x07\x15\x5e\xe7\x57\x59\x85\x78\x07\x2d\x4a\x09\xdf\xc6\xc6\xc0\x94\xec\x04\x85\x67\xd5\x13\xce\x2b\x18\x34\xe1\x63\xdf\x15\x45\x31\x9d\x80\x61\xe0\xe5\x7f\x58\xef\x04\x1b\x7b\xff\xc4\x96\x6a\xc1\x66\x03\x31\xb9\x7a\xbb\xc9\x7b\xe2\x1a\xe2\xbc\x58\xc6\xc3\x27\x4a\x8a\xda\xd5\xfd\x2c\x3b\xc1\x6b\x92\xe1\xf8\xde\x87\x7b\x6a\x26\xf0\xc6\xab\x71\x62\xe8\xaa\xb9\x3a\xf8\xd8\x59\x18\xc1\x3d\x3e\x23\x5a\x27\x37\x48\xc6\x2f\x0d\x22\xcb\x1c\x93\xe1\x34\xa4\x95\xb1\xb5\xef\x8f\x1a\x11\x34\x51\x2d\x53\xb7\xa2\x11\x26\x31\x77\xf7\xa6\x0b\xdf\x47\x46\x91\xf2\x24\xa3\xb5\xba\xc4\x00\x6d\xb3\x45\xca\x67\x25\xf5\xee\x70\x3e\xca\x0d\xea\x10\xd7\x12\x67\x6f\x63\xef\x3e\x53\x7e\x63\xab\xd2\x60\x8c\xb4\xfb\xe2\x00\xe1\x5f\x18\x20\x91\x53\x49\x60\x72\x90\x80\x44\xc9\x5a\x4e\x9c\x53\x56\xaa\xe8\xed\x5f\x09\x59\xea\xc0\x91\xe2\x27\xa0\xb8\x1f\x58\x03\x27\x6b\x3b\x3b\xf4\xb6\x86\x5a\x55\xfc\x67\x82\xf6\x2e\xa6\xd6\x39\x90\xf9\xbe\xfe\x01"}, +{{0xe5,0x5b,0x34,0x3a,0x0f,0xa1,0xfb,0x74,0x71,0x89,0xcb,0x00,0xdb,0xc3,0xa6,0xaa,0x2d,0xcf,0x5b,0x86,0xe5,0x7d,0x76,0x93,0xf3,0x07,0x42,0x03,0x89,0x76,0x11,0x53,},{0x23,0xa1,0x44,0x60,0xea,0x98,0x3c,0xf9,0x97,0xc7,0x82,0xeb,0x45,0x82,0xab,0x3c,0x8a,0xa6,0xdd,0xe5,0x33,0x25,0xb9,0x77,0xb7,0x8e,0x33,0xd2,0xdc,0x5f,0x27,0xaa,},{0x07,0x26,0x6c,0x18,0x65,0x0e,0xcf,0x06,0x32,0xe2,0x25,0x62,0x4e,0xc4,0xc9,0x7f,0xc3,0x87,0xdc,0x37,0x46,0x87,0xa6,0x19,0x56,0xdc,0xcc,0xe7,0x28,0x94,0xee,0x13,0x8a,0xab,0xc8,0x0c,0xfc,0x90,0xc9,0xee,0xa6,0xdd,0x4c,0x59,0xaf,0x45,0x02,0xee,0x29,0x63,0x5a,0x92,0x88,0x07,0x86,0x67,0x8b,0x14,0xa3,0x93,0x1a,0x69,0xf9,0x07,},"\x36\x28\x9b\x5e\xaf\xf2\xa8\x5a\x7c\x6d\x57\x5b\xd1\x5e\xa5\x94\xb2\xfd\x85\x10\x87\x4a\x46\x9b\x52\x10\x91\x63\x69\x6d\x85\xb6\x8c\x5b\x21\x1d\x29\x64\xef\xdc\x66\xe6\x25\xab\xe8\xaa\xfe\x4c\xd9\x22\x0c\xdb\x34\x11\x07\xff\xa8\x27\x6e\xd4\xb3\x70\xfe\x37\x6c\x14\x82\x68\x71\x67\xdb\xc8\xf7\xb2\x05\xa3\xf3\x30\x1a\x16\x64\xd9\x07\x28\x77\xd9\xf9\x8b\x8f\x69\x83\x13\x01\xdf\x99\x94\x71\x7f\xc8\x89\x69\x24\x23\x91\xd9\xb0\x51\x7d\x6e\xfb\x27\x17\x01\xea\xb3\xf4\xa9\xb1\x20\x42\x13\xe8\xcd\x13\xf9\xd0\x99\x04\x8b\x82\x07\x56\x2f\x2e\x4e\xbc\x65\x3c\xc6\x5e\x9d\x55\x12\xd6\x5b\x41\x02\x2c\x79\xb4\xeb\x37\x29\x87\x69\xae\xaa\x6e\xfe\xd6\x9e\x9a\x8c\xb4\x45\xc7\x01\x22\x74\xde\x62\xf5\x09\xf4\xe4\x81\x4a\xdc\xbf\x44\x53\xb4\xfa\xb8\x5d\x7c\x8f\xd8\x45\xe0\x08\x30\xef\x5b\x7b\x1e\x63\xc6\x76\x13\x98\x4c\xae\xfe\x91\x5a\x54\x8e\x18\xe5\x05\x62\x2c\xb2\xb3\x92\x99\xf4\x27\xf4\xd8\x39\x83\xba\x2a\xa0\x0d\x53\xbe\xe1\xf5\x9a\xec\x83\x18\xc5\xea\x34\x5d\x29\x42\x52\x36\x97\x92\x76\x2a\xdd\x3e\x56\xfc\xfa\x6e\x77\x97\xf0\x28\xc7\x99\x47\x90\x45\xed\xb2\xe2\x05\xeb\x6d\xd6\xca\x04\xee\xe5\x6f\x94\x96\xd2\xbf\x26\x09\x93\x57\xc9\x73\x83\x5b\x99\x36\x02\x49\x11\xe4\x65\x5d\x3e\x22\xc8\x11\xc8\xd4\xdb\xd1\xb0\x4f\x78\x97\x3f\x07\x75\x23\xa3\x89\xb6\xf2\x8f\x6f\x54\x21\x61\x42\xcb\x93\xe3\x3d\x72\xb4\xa5\x05\x2d\x27\xe4\x91\x1e\x41\xe6\xce\xc7\xbe\xbe\x1b\x0a\x51\x13\xe6\xb7\x0b\x47\x9d\x2a\xbe\xed\xf6\x9b\x75\x64\xe5\xa5\x73\xb3\x52\xd1\x6c\xec\x89\x07\x01\xbb\x38\x3d\x3f\x66\x56\xed\xa0\x89\x2f\x8c\xcc\x70\x94\x0f\x62\xdb\xe5\x28\xa6\x5e\x31\xac\x53\x88\x26\xc1\x38\xac\x66\x52\x4e\x33\x16\x37\xba\x2d\x37\x73\x03\x58\xe6\xc7\x32\xcf\xf8\xfe\xe9\x40\xaf\xd2\x2c\x39\xae\x38\x1e\x5d\x88\x26\x73\x9b\x23\xfd\xc1\xb8\x0a\xea\x5a\x62\xa2\xcf\x0f\xf1\x52\x5e\x44\x6c\xf3\x10\x46\x19\x50\x51\xd5\x85\x03\xee\xd1\xbe\xfd\x79\x3e\xea\xe1\xd5\xd1\xb6\x2a\x5c\x98\x45\x15\x7a\x09\x5c\xdc\x08\xa1\xd7\x7b\xa4\x7e\x84\xa5\xa7\x39\x98\x0f\x0f\x5b\xe7\xaa\xec\x9a\x21\x5b\x20\x4b\x4b\xb7\xcb\x1b\x38\x6d\xed\x58\xd7\xaa\xf7\x28\x53\x41\x90\x7c\x63\x33\x6e\xe3\xe6\xef\x07\x7a\xd1\x11\xb9\x74\xe7\x50\x4b\xd9\x89\xf5\x66\xfd\xa1\xb1\xb5\x9a\xba\xa9\x1c\x78\xbb\x40"}, +{{0x39,0x73,0x03,0x8f,0xa2,0xef,0x6a,0x27,0x8d,0x3c,0x1c,0xff,0x9a,0x22,0x56,0x69,0xe4,0x65,0xa6,0x9d,0x07,0x50,0x50,0x3d,0xe7,0x48,0xc0,0x02,0xdb,0xf9,0x27,0x8a,},{0xc7,0x5e,0x77,0xc7,0x81,0x49,0xd9,0xd2,0xdb,0xc2,0x63,0xdd,0xf8,0xac,0x4d,0x65,0x4d,0x1f,0xf4,0x55,0xcb,0x18,0x97,0xe1,0xc3,0xce,0x31,0xb9,0x4c,0xfe,0x32,0x10,},{0xfc,0x0c,0x54,0x53,0x83,0x9e,0xa9,0x92,0x96,0xff,0xfa,0x50,0x1d,0x58,0x36,0x66,0x28,0xdf,0x89,0xf6,0x16,0x76,0x69,0x42,0xd5,0x04,0x0a,0x05,0x60,0x56,0xda,0xb1,0x8b,0x44,0x05,0xc0,0x4a,0xbf,0x90,0x59,0xc3,0x08,0x68,0xd7,0x9c,0x93,0x6c,0xcc,0xc8,0x4c,0x4f,0xbd,0x6f,0xd3,0x0b,0x60,0xf8,0xbc,0xbd,0x7a,0x66,0x40,0x42,0x02,},"\x33\x92\xe0\x2f\x3c\x84\x66\x1e\xaf\x81\xa5\xff\x04\x35\x7f\x21\x2e\x92\x36\x1c\x5c\x22\x07\x39\xd9\x6b\x4d\x3d\x9c\x22\xd1\x8d\xf4\x8b\xe6\xb5\x51\x26\xf5\x81\x60\x1f\xfe\x0d\xa6\x3f\x38\xe1\x9c\xbb\x12\x72\x6c\xa0\xa6\xaa\x32\x55\x67\xa0\x03\xa7\x84\x9d\x06\x78\x39\x92\xeb\x9e\xb9\x28\x53\x29\x7d\x72\x28\xdb\xa9\x80\xb2\x50\xbb\x11\x0f\x63\xd0\xb8\x46\x70\xe5\xec\xb3\x19\xcb\xfd\x61\x27\x8f\x1f\x4c\xab\xf1\xfc\xb3\xf7\x01\xf1\x2f\x6e\xf8\xd3\xcc\x42\x82\xfc\xbe\x58\x9e\xb5\x65\x95\x03\xa2\xdd\xd8\xbb\xa3\x8e\x5e\xff\x09\x2d\xfa\xf5\x39\xfd\x80\x4f\x21\xf7\x3a\x90\xad\xf5\x69\xa0\x0b\xf9\xd2\x5a\x9a\xd3\xa6\x33\x09\xcc\x60\x93\x14\x24\x71\xa4\x78\xf0\xb8\x99\x22\x86\xde\x02\x3c\x68\xef\xd4\x99\x87\xec\x27\x0b\xd9\x46\xf6\xdb\x48\xf6\x84\xf1\xc2\xad\xee\xe2\x6d\x68\xdc\xe9\x5a\x55\xe4\xcb\x27\xbc\x60\x52\x30\x80\xdf\x6b\xa2\xb1\x99\x99\x6b\x1f\x1d\xa6\x92\x0d\x15\x59\xf7\x9b\xfd\xe9\xfa\x1a\x02\xde\xae\x14\x80\xc7\x6f\x94\x7f\x9d\x21\x3f\xc4\x3b\xb2\x88\x0a\x1b\x4d\x03\xbb\x14\xf5\xb0\x44\xa0\xfd\x83\xce\x04\x92\xf4\x9c\xa3\xaf\x25\x21\x1b\x86\xfa\xa5\x73\x5a\xd7\xfe\xaf\x31\xa1\xa7\x49\x1e\x70\x8b\x41\x82\x9d\x68\xe3\x24\x14\xf6\x83\x52\xb7\x1d\x1c\xd2\x3c\x8e\x12\xfb\x02\xda\x71\x14\x84\xf6\xef\x97\x52\x8a\x00\xd2\x4f\xcf\x91\xd4\xe0\x6e\x9b\xad\xae\x9a\x44\xdb\xdb\x3f\x77\x80\x41\x76\x8d\x86\x37\x04\xd7\x36\x81\x04\x00\xe7\xf2\x93\x1e\xfb\x85\xc8\x72\x4a\x59\x34\x26\xaa\x2a\xf1\xec\x5b\x66\x4f\x85\xc2\x25\x48\x96\xfd\xcf\x31\x6d\xb0\x92\x4e\x11\xaa\xe8\xd6\x83\xe9\xa0\x21\x92\x9d\x0a\x9d\x6f\xec\xb4\x59\x4b\x1b\x3f\xbc\x16\xb1\x76\xd2\x9d\x1e\xfb\x18\x19\xa4\xa4\x23\xfb\xe0\xca\x05\x59\xc5\x7e\x9e\x54\x49\xf1\x4b\xce\x91\x36\x0d\xaf\xda\x6a\x42\x7c\xe4\xa0\x99\x3d\xd0\x30\x82\xdd\xee\x06\x65\x33\xf6\xd3\xbd\xa5\x66\x0f\x42\xfd\x77\x57\x69\x0d\x67\x05\x98\xec\x70\x96\xf4\x75\xa0\x1a\x51\x99\x50\x34\x1a\x83\x1f\xc9\xa2\x81\xc0\x94\x7a\x86\x3f\x1f\x6e\x03\xbb\xa7\x74\xde\x77\xad\xc2\x3f\xbe\x52\x5c\xae\x6c\xcc\xe4\x7a\x0e\xc4\x97\x9e\x8b\xec\x86\xf3\x32\xfc\x6a\x57\x36\xe3\xb9\x8f\xb3\x32\xe9\xe8\x24\x4e\x68\xa1\x00\x45\x5e\x64\x99\xba\x8d\xba\xe9\x8b\x92\xba\x3d\x9c\x6b\x4f\xf9\x80\x34\x3e\x4c\x8e\xf4\xd5\xa4\xaa\xcf\x8b\x1a"}, +{{0xc7,0x1c,0xc1,0x0a,0xd2,0xd4,0x43,0xe0,0x25,0xad,0x06,0x25,0x68,0x6b,0x12,0x35,0x03,0xe5,0x90,0x19,0x3a,0x2b,0xc8,0xcc,0x57,0xa7,0xb9,0xb4,0x15,0x8d,0xe6,0xcb,},{0xfc,0x06,0xac,0xaa,0xb5,0x3a,0xd0,0x8e,0x97,0x62,0xdd,0x11,0xcd,0x21,0x22,0xb3,0x15,0x99,0xbd,0x25,0x98,0xce,0x6f,0x24,0x87,0x95,0xe7,0x32,0x21,0x9c,0x2f,0xc7,},{0x2e,0xb3,0x3b,0xc2,0xd5,0xde,0xb7,0xf3,0xa2,0xdc,0xc3,0x77,0xb0,0xc6,0xa8,0x62,0x13,0x4b,0xf3,0x19,0x1e,0xc4,0x0f,0xc1,0x28,0xac,0x28,0xab,0xf2,0x31,0x6e,0xf1,0x40,0x16,0x49,0xb8,0xf4,0xcf,0xa1,0xa9,0x36,0xde,0x79,0xb5,0x32,0xdc,0x04,0x3b,0x6d,0x36,0x02,0x4b,0x4c,0x37,0xbb,0xa2,0x92,0x90,0xac,0x9f,0x44,0x9b,0xa6,0x0d,},"\x2e\x08\x46\x53\x6d\xc6\xcc\xe1\x9c\xcf\x82\xdc\x2d\x0c\xd2\x1b\xd4\xe1\xca\x7b\xc3\x17\x06\x7a\xf8\xd9\x0e\xe4\x81\x8c\x85\x18\xbc\x3e\xf9\x60\xce\x11\x2a\x41\xd2\xb9\x97\x9a\x28\x2a\xe1\x3d\x70\x6a\x00\x5e\x00\x34\xf0\x6b\x39\xff\x4b\x0a\x5a\xfa\xed\x70\xb5\x61\xbc\xce\xb1\xbb\xd2\xec\x19\xf9\x74\x48\xea\xed\x4b\xe6\x20\xe3\x6a\x96\x2d\x87\x8c\x6f\x80\x17\x2b\x9f\xad\x43\xee\xd0\x7f\xf9\x3d\xb9\xb9\xca\x22\x62\xd5\xa3\xc2\x29\xc5\x4e\x30\xa4\x5e\x73\x66\x08\x92\xf0\x48\xe3\x63\xf3\x71\x44\xed\x19\x21\xf7\x29\x92\xb4\xd0\x15\x29\x87\x0c\xfe\x37\x3b\x7e\x7c\xbe\xda\xf9\x69\x26\x9f\xb7\x0a\xa7\x83\xd1\xe7\x44\x17\xc7\xba\xe0\xfe\x03\xd9\x51\xfd\xb8\xc7\x1c\x62\xe9\xbe\x7f\xdd\x5d\x23\x3e\x39\xf4\x6f\xed\x05\x7e\x49\xb6\xf3\x40\x68\x45\x91\x48\xda\x3d\x42\x41\x61\xad\x2c\x86\x95\x08\x60\x2e\x9c\x0b\xb3\x0b\xfb\x88\xac\xd5\xf4\xdf\xdf\xfd\x47\x35\x03\xcd\xfe\xda\xbc\x44\x42\xb7\x43\xbe\x07\x5e\x7c\x6f\x61\x0e\x64\xff\xc2\xe5\x31\x87\x74\x5c\xd7\x19\x65\x8f\xc6\xe6\x2a\x5b\xe5\x18\x43\x7c\x5b\xd6\xa4\xfe\xba\x94\xae\x3f\x44\xf2\xf2\x93\x08\xe8\x31\xfe\xef\xed\x67\x69\x09\xce\x5e\x80\xc8\x4c\xbd\xca\xc4\x7e\x47\xd2\x7c\x97\x12\xa0\x1f\x6b\xc5\xda\xed\xc0\x2e\x64\x14\x40\x7e\x91\x1c\x0a\x5a\x53\xe5\x32\x8a\x5a\x5f\xd9\xf0\x40\xaa\x7f\xb7\x0b\x79\xb3\x1c\xd1\xb6\xfd\x9b\xd5\x02\x90\x40\xbd\x22\xae\x22\x2f\xd2\xf6\x87\x0d\x07\xf4\x35\x32\x26\x39\xcf\x31\x93\xca\x57\x09\xb8\x82\xb0\x7a\x58\xf9\x52\xa9\x96\x3e\x56\x8f\x8c\x5a\x58\x4a\x6b\x9e\x27\x5c\x5c\x07\x95\x7a\x4d\x2c\xda\xa9\xf1\xeb\x44\x4e\xd1\x22\x4b\xac\x65\x63\xb2\xf9\x27\x3e\x80\x30\x1d\x44\xd5\x0a\xe3\x83\xb5\x97\x21\x3b\x00\xda\x5b\xf2\x7e\x5d\x1f\xe2\x40\xcc\x3b\xb6\x5a\xa5\x03\x0d\x65\x1b\x6b\x5b\x31\x76\x1d\x53\xce\x0c\x6d\x74\xa1\x5d\xad\x54\x79\xf3\x1c\x91\x5c\xcf\x44\x66\x59\x85\x3b\x89\xa5\x1a\x28\xee\x89\x76\x85\x35\x53\xfd\x2e\x02\xfe\x72\x43\x53\x8d\x00\xb4\xed\x07\xd8\xb8\xa8\x0b\x5c\x16\x5c\xd4\x63\x41\xff\xd8\x16\x3c\x55\x57\x02\x66\x3a\x4e\x6a\xb2\x95\x2b\x7e\x74\x43\xd0\xf6\xb1\x23\xb6\x94\x67\x21\xaa\x63\xe8\x7b\x11\x55\xec\xa8\xa6\xa1\xbc\x9f\xd2\x5c\x67\x62\xe5\x27\x42\xc8\x6b\xca\x1b\xa9\xd8\x37\x04\x15\x24\x4f\x0e\xdf\xdb\xe0\x93\x2b\x5c\xa0\x61\x15\x09\xc9"}, +{{0x0a,0x4f,0x5e,0x16,0x70,0xf1,0xe2,0x4b,0xfa,0x37,0xb7,0x3c,0x99,0x43,0x30,0xb3,0x6e,0x7d,0xaa,0xf9,0x30,0x16,0x1b,0x78,0xa4,0xa8,0x48,0x66,0xff,0x25,0xe3,0xd5,},{0x9d,0xcb,0xba,0x90,0x39,0x81,0x59,0x4c,0x7b,0x67,0x7e,0xa8,0x00,0x20,0x01,0xd6,0x64,0xcf,0xf7,0xce,0x8e,0x5c,0xfa,0xe5,0x88,0x40,0xcf,0x74,0xaf,0xf0,0xd3,0xa9,},{0xdc,0xf3,0x53,0xb2,0xb9,0x9a,0x4e,0xf4,0x5f,0x3f,0xdf,0x65,0x28,0x63,0x2e,0x8a,0xbd,0xc4,0x33,0x34,0x24,0x76,0xa8,0xc2,0xb3,0x79,0x00,0x40,0x4a,0x4e,0x33,0x3d,0x38,0x78,0x14,0x23,0x57,0x57,0xef,0x7a,0xd0,0x38,0x58,0xa0,0xf3,0x5d,0x46,0x15,0xe8,0xab,0xa4,0x84,0xfd,0x64,0xf1,0x11,0x2e,0xc1,0xb1,0xae,0xd2,0xcb,0x64,0x0e,},"\xf4\xb0\x5b\x3e\xfd\xcb\x1d\x5c\x07\xda\x95\x0c\x46\x56\x55\x28\x44\x0b\xb4\x88\x35\xee\x4c\x13\xf4\x3d\x7a\x16\x18\xde\x11\x9e\xbb\xb2\x59\xea\x74\x80\xa5\x04\x81\x74\xfa\xec\xc1\x05\x5b\x32\xdc\x01\xac\x71\x56\x34\x43\x21\xe8\xeb\xa6\x98\xf3\x02\xee\x16\x43\xb5\xf0\x4b\x8e\x7e\xcc\xa6\x3b\x91\x56\x1c\xe3\x51\x4a\xbe\x78\x51\xb6\xfb\x17\xfc\x94\x3b\xdc\x94\xda\x30\x8c\x8e\x47\x69\xfe\xc2\x0f\xad\xf4\xfa\x8e\x7f\x62\xb6\xff\xb5\xf1\x70\xd6\x44\xed\x29\x35\x5e\xbd\x22\xcb\x3a\xa1\x48\x6b\x1e\x36\x7c\x72\x9d\xd3\xf7\x9b\xcd\x40\xff\xd0\x8a\xf2\x8c\xeb\xc8\xd7\x76\xe1\xa4\x83\xe9\x11\xd7\x9b\xc6\x13\xe0\x9c\xc6\x21\xca\xde\xb0\x34\xdd\x6f\x72\x37\x47\x71\x98\x51\x27\xf7\xa3\xa1\xaa\x78\x6a\x52\x3a\xe6\xe3\x4e\xe4\x33\xdc\x30\xc3\x75\x98\x7c\xff\x50\xbd\xcb\xc9\x97\xfc\xd5\x1c\x94\x56\x7a\x67\xae\xfb\x6e\xf5\xed\xf9\xbd\xd6\x59\x64\xd4\x64\xbe\x9e\xbd\xfb\x88\xc0\xe2\x31\xb0\x7f\xf6\x40\x5c\x00\xf8\x25\x31\xe9\x61\xbf\xc5\xea\xd2\x66\xbc\xc0\x87\x18\x87\x8c\xaf\xb1\xd3\x75\x36\xf1\x83\xe4\x8b\xf3\x8d\x3f\x6b\xe9\x00\x25\x2d\x1f\xb4\x19\xe6\xa2\xac\x58\x96\x03\x9f\x63\xc3\x14\x01\xff\xf9\x32\xce\x98\x14\xb0\x85\xab\x20\x41\x69\x72\xa2\xb3\x51\xc8\x15\xa6\x2d\xe5\x09\x67\x46\x28\xb0\xd3\x56\x6f\xc9\xc2\xe0\xa9\x23\x7b\x93\xf9\xbb\xb2\xde\xed\xf0\x2b\xff\x83\xbf\x6d\x86\x8b\x63\x99\x32\x6d\x48\x09\xd0\x41\x9f\x31\xb2\xf3\xa4\x81\x28\x5b\x94\x07\x8b\x47\x06\x1c\xe9\x1d\xad\x58\x3d\xd5\xb1\x3b\xd0\x10\xfb\x30\xf2\x49\x5b\xb7\x04\x20\x18\x3a\x93\x01\x59\xe4\xdb\x19\x3d\xf6\xac\xd1\x24\x42\x3e\x03\x9a\x67\xf1\x56\x88\xae\xc5\x0c\x59\x27\xfb\x27\x18\x22\xaa\xa6\x6f\x29\x4b\xc8\x05\xd3\xbc\x7c\x83\x41\x87\x8a\x54\x10\x09\xf3\x0d\xa9\x9f\xcc\x00\x85\x07\x9c\xe7\xfc\x55\xe0\x01\x16\x85\x56\x2a\xbd\xb3\xa9\x47\x1f\xfd\xe6\x17\x63\x00\xef\x5b\x31\xe0\xdf\x60\x9a\x54\xa1\xee\x66\x24\x07\x0d\xa9\x9c\x87\x76\x89\x1f\xdf\x6a\xa7\x8b\x4d\x55\xb1\xf5\xda\xdf\xc0\x61\xad\xd5\xaf\x00\xfd\x3a\xde\xdb\x44\x8c\x55\x9b\xff\xf2\x04\x06\x80\x43\xa5\xd1\xd6\x21\x47\x48\x62\x8c\x3e\xbc\x5f\x02\x24\x32\x6c\xa1\x8e\xf0\x48\x42\x5d\xa9\x30\x01\x33\xfb\x69\x5d\x4f\x26\x31\x65\xac\x22\xf3\x61\x9d\x40\x5a\xf2\x71\xa7\x1a\x9a\xfb\x19\x8b\xf6\x31\x24\x1d\x34\x59\xb9\x53\x98"}, +{{0xb8,0x55,0xc8,0x18,0x05,0xc7,0x08,0x74,0x10,0xe6,0x9f,0x96,0xb0,0x24,0x02,0x71,0xdc,0x76,0xc1,0xe4,0xad,0xe3,0x8c,0x6a,0x92,0x78,0xe3,0xc9,0x4f,0xbe,0xa2,0x56,},{0x6a,0xdb,0x02,0x5a,0x40,0x26,0x0f,0x56,0x98,0x84,0xb8,0xca,0xb3,0x75,0x2b,0x4f,0x25,0x5c,0x37,0x3e,0x2b,0x42,0x4b,0x62,0x87,0xeb,0xb5,0x10,0xfa,0x06,0xff,0xf0,},{0x3c,0xaa,0x81,0x32,0x73,0xe7,0x53,0x54,0x2f,0xfb,0xfe,0xb2,0x1b,0xc3,0xe2,0xcf,0x8c,0xa7,0xd9,0x20,0xfa,0xac,0x7c,0x49,0xdc,0x2a,0xa9,0x91,0x17,0x68,0xc7,0xad,0x43,0xb3,0x8b,0x02,0x36,0xdb,0x27,0xf3,0xee,0xae,0x0b,0x12,0x06,0x00,0x1e,0x66,0x5a,0x60,0x70,0x78,0xc5,0x22,0xed,0x7a,0x9d,0xc4,0x68,0x85,0x34,0x63,0x59,0x00,},"\x85\xa9\xbd\xb7\x0a\x6c\x75\x28\x97\xe4\x3a\x91\x10\x6e\xe9\xa9\x9c\x2c\xa9\x4f\xf7\xb4\x46\x1a\x44\xa3\x91\x74\xc1\x7e\xcd\x99\xdf\x46\xee\xcd\x81\xc3\xf5\x25\x13\xdc\x9d\x54\x7d\xad\x37\x21\xc6\xd5\xee\x1f\x8f\xac\x0b\xa5\xaf\xb3\x68\x70\x44\x73\x9e\xd5\x35\xb8\x44\x00\x87\x04\xc0\x9f\xe1\xe5\xd7\x85\xd4\xc9\xc3\xd0\xb0\x58\x89\xb9\xc2\x0f\xc3\xfd\x68\xdf\x12\xdb\xeb\x2c\x34\xf6\xf7\xec\x1c\x6f\xb7\xfa\x81\x1f\xf8\x46\xb5\xa6\x1f\xa5\xfe\x55\x37\x9e\xe6\x3a\xbc\xd3\x73\xfe\xd0\x02\x54\xeb\xd0\x6b\xc8\xb2\x2f\x7f\xbf\x2f\x72\x7a\x5f\xad\x88\x51\x41\x59\xe2\x6d\x78\xdf\xdb\x09\x57\xf6\xef\xaf\x51\xa8\xe8\x0b\x58\x5e\x83\x8b\x96\x21\xd0\x51\x07\x4a\x4f\x58\x67\xb4\xae\x2f\x2f\xf6\xd6\x2b\x85\xbc\xce\xc0\xb4\xaa\xa4\x79\x16\x37\x38\x8c\x09\x01\xfd\x49\xdc\xcc\xce\x72\x04\x85\x9f\x81\xee\xfc\x63\x9f\xed\x92\x28\x04\x56\xe6\x9a\x15\x09\xb4\xb1\xbd\x76\x24\x44\x7d\x86\x2c\x45\xa0\xc8\xb0\xc5\xbb\x2c\x4c\xa5\x12\xcb\xc0\x37\xf5\x1b\x78\x09\x82\xb1\x83\xa5\xca\xfa\x15\x29\x75\x85\xc9\x47\xa2\x5b\xe8\xc2\x24\x0e\xbf\xb6\x86\x8e\xce\x5e\xa2\xaa\xb2\xc2\x39\xc8\x37\x54\xc7\xd5\x94\xb3\x72\x5a\xce\xef\x34\x4b\xa7\xe6\xae\xf4\x9f\x7f\x31\x3b\x0a\xe8\x2c\xca\xca\xd3\x87\xa6\xe9\x33\x7f\x05\xf8\xc7\x99\xef\xe7\x82\x9b\x27\xb4\xd5\xb2\x01\xfd\x5a\xe5\x83\x43\x51\x69\x07\x59\xf3\xea\x17\x5f\xd4\x74\x1b\xe2\x28\xd8\x07\xfb\x54\xdf\x4a\x74\x10\x38\xfa\xee\x47\xed\xf1\xf5\x61\x65\x25\x98\x60\x1f\x27\x15\x5f\xc5\x0d\x9d\x50\x11\x43\x37\x11\xc1\x06\xd4\xb6\x07\x85\xa5\xcc\x93\xb3\xfd\xd1\xda\xd7\x0c\x0c\x8e\xaa\x33\xf1\x51\x2e\x35\xa5\x41\x74\x5e\x37\x6c\x15\x16\x7f\xa8\xf6\xb3\xb2\xc4\xc3\xa3\x66\xfc\x41\x49\x7d\x29\x73\x57\x81\x6a\xe7\x95\xa8\x04\xc9\x80\xe7\xcb\xfb\x0c\x74\xd8\x83\x5d\x92\x9a\xe3\xbb\x52\xba\xb1\x29\x64\x56\x6d\x74\x6b\xd2\xc1\xd1\x32\xb6\x23\x3f\xa3\x4f\x75\xe2\x68\xed\xee\x77\x5e\xb3\xce\x13\x2e\x6b\xeb\x2e\x8d\x71\xf0\xc8\x76\x29\x91\xcd\xe4\xe2\x6f\x71\x43\x9d\xfa\x83\x97\x8f\x99\x56\x03\x86\x1b\xc0\xb1\xd9\x06\x0b\xbc\xca\xcc\xf8\x6f\x87\x45\xad\x96\x99\x4d\x5d\x00\x7d\x52\xe8\x3a\xa5\xe6\x94\x12\x96\x4b\xdb\xfb\xe4\x78\x0a\xaa\x8d\xe4\x1b\xe1\x29\x8a\xbb\xe9\x89\x4c\x0d\x57\xe9\x7f\xca\xcc\x2f\x9b\xbd\x63\x15\xd3\xfc\xd0\xea\xf8\x2a"}, +{{0x95,0xb9,0xc8,0xa6,0xef,0x80,0xeb,0xd5,0xcb,0xd4,0x7a,0x04,0xca,0x54,0x38,0x73,0x73,0xdf,0x4d,0x67,0xa2,0xb4,0x75,0x59,0x77,0x65,0xac,0x89,0xfc,0xf9,0x3e,0x93,},{0xf2,0xc9,0x47,0xb1,0x8a,0xdc,0x3e,0xa6,0xa2,0x3f,0x7a,0xbc,0xa3,0x64,0xb9,0x85,0x3a,0xe8,0x5a,0x2b,0x0c,0x8c,0x26,0xf0,0xd3,0x17,0x3c,0x27,0x32,0xc3,0xc7,0xff,},{0x2c,0x8b,0xf5,0x43,0xe2,0xa3,0xe0,0x04,0x15,0xee,0x4f,0x10,0x7b,0x2f,0x5a,0x66,0x87,0x17,0x6f,0x5d,0x52,0x11,0x17,0x75,0x9c,0xeb,0x56,0x17,0x51,0xbc,0xc7,0x7d,0x9b,0x08,0xa6,0xa6,0x31,0xf6,0x44,0x7c,0xd9,0x01,0xde,0x96,0x69,0x9a,0xeb,0xb1,0x68,0xbf,0x97,0x50,0x0d,0xc5,0x4a,0x05,0x43,0xef,0x14,0xe4,0xb5,0xa0,0x81,0x06,},"\x78\x55\xbc\x39\x26\x30\xcc\xf5\x31\xd3\x06\x16\x06\xdd\xfc\x81\xa0\xfd\x92\x94\xc5\x47\x91\xb5\xf9\x55\x9b\x68\x27\x25\x4a\xa1\xf2\x5c\x54\x0b\x7d\x7d\xf3\xec\x9c\xdf\x14\x25\x66\x29\xdb\xcf\x9b\x72\x5f\xeb\x34\x12\xeb\xf3\x5f\x0e\xf9\x37\x9e\x41\x31\xcc\x77\xe0\xf0\xfb\x6f\x74\x59\xa7\x38\x36\x1a\x99\xae\x4c\xcb\x2b\x60\xa9\x9f\xe9\x2b\xd6\xc3\xa5\x3d\x6f\x45\x4e\xe9\x00\x5b\xce\xc5\xae\xdc\xfa\x82\x34\x73\x92\xef\xcf\x11\x75\xe5\x78\x39\x6a\x8d\x80\x0d\xab\xa0\xf4\xc2\xcf\x4d\x49\x13\xb0\x52\x86\x20\xe3\xba\xa0\xf6\xd8\x6e\x06\x28\xe4\x7c\x0c\xa2\x6d\xf3\xb0\xc7\x88\xc4\xe1\x65\x57\xf7\xfc\x28\xdf\x82\x0c\x12\xfb\xb6\xff\xbf\xec\xb9\x82\x9d\xdb\x65\xef\x8d\x63\xe9\x0d\x68\xfc\x71\x94\xb5\xb8\x85\x91\x3f\x08\xed\xee\x84\x56\x76\x47\xff\xa3\xf0\xd0\xd3\x25\xd0\x82\x60\x0c\xe7\x1a\x23\x45\xc7\x7d\x65\xbd\x96\x25\x20\x03\xe5\xc1\x25\xa7\x18\xa0\x73\x70\xc3\x1b\x57\x08\x07\x5c\xf1\x83\x7c\x69\x25\x63\x5c\xc6\x8d\xd1\xb7\x51\xe4\x0a\xb6\x08\xb0\xd9\xd8\x85\x2c\x18\xd3\x06\x92\x19\xef\x80\x7b\x76\xd2\x88\xf9\x2c\x29\xa9\x3e\x3d\x75\xb5\xb2\xe5\x36\x81\x67\x1d\x3a\xe0\x14\x5a\xc0\x3c\xca\xd3\x16\x2e\x44\x70\x3b\x04\x01\xd3\xeb\x16\x7c\xd8\xdd\xc1\xe1\xa5\xa3\x26\xb7\x28\xb1\xe0\xc0\x0a\x94\xd8\x6d\xe6\x13\x52\xa6\x61\xe4\x08\x97\x17\x5d\x28\xd3\x41\xe4\xd1\xd9\x96\x2e\x35\xf4\xde\x18\xa5\x40\x17\x61\x1a\xd0\x53\x59\xce\x08\xb9\x7b\xfe\xdb\xfb\xe3\x99\x2e\xd5\x8e\xd4\x0f\x51\x7a\xab\x01\xc0\xfe\xfe\x8b\x63\x64\x3d\xa1\xa4\x54\x15\x27\x30\xbf\x99\xaf\x87\x40\xad\xf9\x8a\x77\xb8\xd7\x3a\xdb\x08\xe6\x09\xe0\x0c\xe9\xb1\xcc\xdf\xef\x3e\x9a\x9b\x05\xaa\x56\xe0\xbc\x79\xb6\xbb\xba\x80\xdd\x8e\x46\x1a\xf7\xcb\x20\x28\x92\xd8\x9b\x2d\x05\xa4\x45\x8a\xb3\xfa\x54\xb4\x74\xb8\xf8\xf5\x81\x79\x5d\x6c\x27\x39\xe5\x9d\x0f\xe0\x62\x40\x0b\xae\x2d\x2d\x53\x4b\x34\x0b\xb8\xe2\x61\x57\x77\xa9\xa5\x61\x5b\xb2\xcf\x43\x7b\xa5\x25\xe0\x0e\x70\x38\xf2\x2a\x57\x88\x2a\xc5\x20\xb3\x33\xe7\x5c\x3c\x92\xa8\xb9\xf0\xe3\x7f\x67\x1c\x94\xb1\x5d\xd8\x18\x2a\x08\xd7\xc1\x43\xe9\x4e\x92\x62\xb3\xcc\x55\x44\xc2\x94\xf5\xf3\x35\xc2\xb2\x8a\xc1\x19\xfe\xa0\x0f\x96\x34\xdb\x06\x39\x93\x98\x8b\x5f\x15\x05\x79\xc7\xcc\x25\xb6\xa1\xfb\x0d\xde\x94\x80\x4f\xa6\xef\x66\xff\x79\xfb\x91\x07"}, +{{0xb7,0x86,0xcc,0xfb,0x58,0x6d,0x43,0xb8,0xc4,0x6b,0xb9,0x7b,0x96,0xc9,0x18,0x73,0x1b,0xc2,0xcc,0x11,0x92,0x77,0xf1,0x23,0x67,0x1e,0x30,0x14,0x81,0x58,0xd2,0xed,},{0x90,0xc7,0x00,0x46,0x00,0xf3,0xdc,0xe4,0x09,0xfd,0xea,0xdc,0x8e,0xd0,0x18,0xf9,0xea,0x26,0x3f,0x75,0x16,0x0a,0x74,0xab,0x54,0xf4,0xc2,0x39,0x9a,0x90,0xca,0x78,},{0x52,0xba,0x96,0x58,0xa1,0xa0,0xb3,0xe9,0x8e,0xd5,0x20,0x9e,0x39,0x3e,0x42,0x00,0x66,0xa3,0x7d,0x37,0x14,0xda,0xa7,0x3d,0x5c,0x67,0x1d,0x33,0x07,0x5a,0x5f,0x57,0x27,0xfe,0x4e,0x08,0x1e,0xe0,0xfa,0x3c,0x21,0x33,0xdc,0x95,0x3a,0x2d,0xa6,0x20,0x29,0x13,0x71,0xf0,0x0c,0xcb,0x57,0xd8,0x79,0x2e,0xb5,0x96,0xa2,0xff,0x81,0x01,},"\xba\xbf\x48\xbd\x55\xea\x91\xbd\x0c\x93\xb9\x70\x24\x1b\x52\x9d\x9d\xb4\x3d\x49\x27\xfe\xa5\xf1\xa1\xf7\x08\x2d\xd6\xcb\x50\xa5\x2b\x09\x4b\x31\x29\xfc\xd9\x03\xa4\x4f\xec\x8b\xfd\xb5\xc8\x6c\x00\x2a\x2a\x45\x28\x87\xca\x25\xa6\x0e\xce\xb5\xe1\xf9\xf5\xc9\x3d\xc5\x94\x23\xc7\xaf\xe7\x47\xc6\xbf\x40\x7c\xac\xad\xec\xcf\x5d\x78\x79\x70\xcb\x06\x17\xbb\x3c\xfe\x7f\xd1\x75\x63\xd3\xa0\xdc\x91\x63\x1f\x71\xb8\x4b\xe2\x4a\xe8\x00\x11\x37\x50\xf0\x31\xd0\x1f\xd0\x53\x64\xb4\xf2\x7f\x86\xf8\xdc\x3a\xd7\x40\x7e\x1a\xe9\xe7\x68\x15\x4e\x3d\xde\x58\xe8\x67\x12\x9e\x24\x74\x54\x7b\x40\x82\x17\x96\x48\x44\x85\x8d\x05\x6b\x31\xc3\x74\x99\x1b\x7f\x16\x1f\x52\xf0\x88\xb8\x06\xe0\xf3\x13\xd6\x8a\x15\xc5\x40\x1e\xd5\x5b\x2b\x77\xde\xea\x58\x6c\xb0\x54\xdc\xd7\x1a\xf2\xab\x6a\xb1\x1e\x84\xb3\x0c\x53\x93\x45\xde\x3e\xb4\x3f\xb7\xb3\xa3\xb4\x89\x87\xc3\xbf\xa7\x06\x55\xd5\x99\xf2\xe3\x1d\x12\xad\x23\xcc\x96\xe8\x6d\x38\x0b\xfd\xa8\x12\xfe\xff\x3d\xd3\x02\x42\x92\x91\x69\x07\x02\x28\x91\xe1\x19\xbf\xc3\xed\x9c\x25\x54\x6c\xd1\x9f\xc9\x92\xd8\xa6\x1e\x60\x59\xca\x3c\xe7\x80\x2a\xf1\x11\x87\x56\x62\x0b\x87\xa7\x24\x2b\xd8\x38\x97\xc9\x4d\xd5\xa3\x6e\xd4\x0f\xc0\xf3\x4c\x2c\x93\x11\x0b\x37\xd1\x7d\xd9\x6a\x22\x06\x25\x90\xbc\xdb\x54\x67\x42\xef\x72\x18\xad\xcc\xc5\xad\x28\xf4\xfc\xe6\xec\xf7\x05\x83\x5f\x41\x13\xd8\x2e\xa5\x33\x90\x3a\xec\x8c\x38\x20\xfe\x4b\x47\x15\xf3\x7e\x20\xce\xbc\x1e\x71\x51\x9a\xa0\xb2\x40\xb4\x84\x0a\xa4\xfd\xcf\xb5\x24\x67\xfe\xdd\x8f\x4d\x1f\x9b\xc3\x3e\xe1\x14\xf3\xef\x85\xf5\xfd\xb0\x9c\xa8\x84\xaf\x38\x8a\xd3\xad\xf8\x4c\x79\x3f\x38\x6e\xfe\x6f\xf8\xa4\x6e\xd8\x1e\x5d\x45\xa3\x7c\x25\xcd\x80\xf2\xd7\x36\x3f\x43\xae\x45\xe3\x77\x2c\x0d\xf8\x9f\x11\x44\x79\x39\x80\x6c\x09\x6e\xf9\x33\xa1\x39\x44\xf0\x89\x0d\x88\x7c\x2e\x5b\xbb\x6b\x12\xea\x95\x0b\x09\xb8\xfe\x42\x52\x89\x37\x73\x52\xf3\x5f\x84\xcc\x4d\xcd\x4d\x7a\x44\x94\x89\xfa\x92\x51\xc0\x31\x13\x48\x92\x25\x80\x9c\xdf\x3c\xb6\x34\x75\xf1\x0d\x34\x17\x09\x37\x1c\x6f\xd4\xbb\x7a\x94\x94\x83\xd1\xbc\x2b\x31\xdd\xf4\xd9\x63\xa0\x7d\xe7\xea\x5c\x3f\xee\x9a\x0e\x33\xf0\x76\x9f\x2f\xaa\x40\x61\x2a\x54\x69\x74\xbd\xe0\xb7\x33\x91\x79\xe4\x12\x4a\x44\x7b\xd4\x28\x79\xcc\xda\x5c\x8a\xd1\x81\x9c\x53"}, +{{0xdd,0x1a,0x97,0x74,0xf7,0x58,0x4d,0x85,0x89,0xb1,0x9f,0x92,0xab,0x69,0x39,0xac,0x48,0x56,0x02,0xfe,0x16,0x44,0xce,0xe2,0xf6,0xf3,0xcd,0x60,0xfb,0xd5,0x84,0x00,},{0x4b,0xea,0x7d,0x0b,0x0f,0x4b,0xd5,0x90,0xf9,0xe3,0x57,0x9f,0x0c,0x5f,0xa4,0xce,0xf4,0xd6,0x0a,0x49,0xd2,0xc4,0x37,0xa0,0xaa,0xea,0xd9,0xd4,0x3a,0x73,0xd4,0xa3,},{0x19,0x59,0xbd,0xe0,0xa6,0x97,0xa6,0x39,0x93,0xec,0x47,0xd1,0x58,0x22,0x37,0x39,0xfe,0x65,0x87,0x1f,0xa0,0x58,0x70,0xd7,0xde,0x0d,0x38,0x08,0x65,0x91,0x20,0x2a,0x51,0xb1,0x74,0xd1,0xc6,0x18,0x28,0x08,0xc6,0xce,0x62,0x63,0x1d,0x81,0xdb,0xa3,0x4e,0xbe,0xd4,0xaf,0x2f,0x29,0xb0,0x6c,0x00,0xa5,0x7a,0x3c,0xb6,0x66,0x36,0x06,},"\xe5\xdc\x3e\xd2\x6c\x1f\x69\x3c\xf8\x52\x46\x5a\x05\xe3\x04\x8b\x50\x5d\xb5\x11\x6d\x9e\x31\x59\x22\x05\xa9\xc3\xd4\x72\x0b\xc1\x0b\x6c\x20\x63\x9a\x0e\xe2\xf0\xe1\x47\x22\x5b\x5b\x19\xea\x51\x1c\xfb\xa0\xc2\x1a\xac\x10\x71\x5a\x2f\x23\x2f\x10\xc2\xc8\xaa\xd4\x11\x12\xb6\xb0\x12\xe7\x5a\x41\x55\xf8\xc6\x92\x62\x53\xca\x2b\x4d\xdb\x7b\xfe\x7f\x86\xe9\x0a\x53\xdb\xc0\xcb\xa8\x9e\x48\x5c\xec\xa8\xfd\x26\xe5\x0c\x7f\x28\x2a\x25\x35\x73\xcb\x0a\x8f\xa8\x8c\xc4\x46\x23\xe8\x2e\x8f\xa2\xed\xb6\xcb\xc7\x53\x8a\xc9\x2c\x11\xe4\xc5\xb1\xea\x5f\x68\x96\x6d\x15\xd9\x3c\x34\xf3\x96\xd2\x75\x72\xf8\x64\x38\x2a\xb7\x6a\x7b\xe6\x5a\x55\x7b\x13\x97\x66\x36\x8a\x20\x7d\x98\xbc\x0c\x20\x92\x63\x70\xde\xa2\x70\x48\x16\x03\x63\xed\x85\xf4\x09\x9e\x7c\xd6\x6d\x12\xd0\x98\x8c\xfc\x9e\x2f\x16\xaa\x56\x5f\x8f\x33\xb3\x9e\x97\x8c\x05\x87\x37\x1f\x92\xdb\x50\x56\x31\x75\x64\x41\x1b\xd8\xa3\xb6\xfe\xa0\x9d\x34\x87\xaa\xf7\x34\x03\x49\x18\xff\xed\x1c\x9f\xba\x7b\xde\xc6\xfe\x68\x87\x6f\xc7\x36\x0c\xc5\x62\x9b\x92\x10\x40\x27\xfe\x57\x59\xc5\xab\x36\x53\x54\x75\x1e\x79\x69\x11\x6c\x3b\x9a\x21\xb1\x52\x33\x0a\x96\xa9\x38\x1a\xf7\x30\xd1\x78\x22\xd7\x8a\xd6\xea\x86\x00\x06\x91\x5b\x5c\xab\x44\x7a\x75\x93\x72\xe0\x5d\x49\x5e\xbb\x32\x8e\x75\xd2\x48\xda\xa0\x2f\x5d\x2e\xb9\x78\xd2\x71\x0c\xf1\xc5\xfb\x82\x48\x76\x77\x0e\x32\xca\x6d\xe2\xc7\x30\x56\x48\x92\x41\x5b\xcb\x53\xe5\x98\x1d\x70\x7a\xdd\x96\x1c\x5f\x37\xfd\xaf\xa1\x39\x9a\xf8\xae\xa9\x60\x45\x8d\x2c\xa3\x10\x55\x3f\x7c\x98\x66\xcc\xbe\x8e\x9d\x88\xe0\x8a\x44\x68\x72\xea\x66\xfc\x30\x8c\x82\x45\x14\xb7\xda\xce\x03\x34\xdb\x73\x5e\x6f\x14\xc8\x5b\x5e\x61\x9a\x5d\x60\x56\x48\xa8\x81\xe8\x76\xc7\x8d\xbe\x06\x57\x23\x3d\x4f\x7f\x3b\xfd\xdf\x63\xb4\x45\x31\x1d\x6a\xbc\x47\x63\x47\xec\x4f\xb4\x3c\x89\x46\xf9\xd1\x7c\x36\x93\x81\xd1\xc5\x64\xff\xcf\xe2\xdc\x7b\x47\x26\xfd\x57\x38\x7f\x0b\x44\xdb\x8e\xf9\x5a\x0b\x4e\x32\xa7\xbe\xdf\x31\x9e\x53\xa9\xe7\x12\x6c\x28\x11\xf9\x82\x9d\x1f\x4a\xe9\xab\xd9\xd5\xf4\x2e\xfe\xf2\x07\x5f\x47\x05\x1c\x63\xa4\xf8\x20\x20\x40\xec\x47\x23\x68\x63\x82\xc6\x03\x31\x27\xc1\xfb\xff\xf4\xbc\x82\x37\x35\x08\x75\x2d\x43\x1d\xc4\x73\xf5\x2d\xde\xab\x03\x42\xdc\x4f\x54\x47\xf8\xf2\x57\x38\xef\x65\xd7\x85\x56"}, +{{0x66,0xf5,0xea,0x8c,0xdb,0x95,0xee,0x1a,0x75,0xe3,0x24,0x67,0xd7,0xc8,0x3c,0x59,0x44,0x77,0x42,0xc8,0x5d,0xdd,0x49,0x9c,0x43,0xc0,0x86,0x73,0xe1,0x49,0x05,0x3a,},{0xa8,0xad,0x04,0xb9,0xc1,0x44,0xb9,0x7f,0xe8,0x67,0x37,0x4d,0x4f,0xe5,0x7d,0x7e,0xc0,0xc2,0x49,0x18,0x3e,0x43,0xbd,0xfb,0x5d,0x52,0x64,0x4e,0x7f,0xbe,0x1d,0xf3,},{0xec,0x5c,0x7e,0x83,0x92,0xfa,0x8b,0x61,0xbc,0x82,0x96,0x81,0x86,0x6e,0x45,0xac,0x8b,0xe4,0xb5,0xb7,0xb6,0xa8,0x22,0xc1,0xbc,0xd0,0xf2,0xcc,0x2c,0x8c,0x44,0xc3,0x3c,0xf8,0x3f,0xa4,0x2d,0x43,0xa2,0xf1,0x88,0x41,0x41,0xb4,0xa5,0x9a,0xaf,0xf4,0x7f,0x9b,0xe0,0x7e,0x63,0x2e,0x20,0x18,0x75,0x93,0x24,0xea,0xc9,0xd1,0x49,0x00,},"\xc0\xd0\x1d\xce\xb0\xa2\xd1\x71\x91\x10\x18\x79\xab\xb0\x93\xfb\x07\x75\x71\xb5\x21\xbe\x7b\x93\xa1\x17\xc6\x96\xc0\x87\x2f\x70\xea\x11\x39\xab\x62\x83\x29\xee\x56\x55\xfc\x0a\xa7\x7e\x81\x11\xd2\xfc\x88\x47\x48\xc1\xf2\x67\xb9\xeb\x09\xdc\x26\xf5\x7f\xc4\x02\xd6\x1b\xa3\x6f\x63\xf4\xd5\x89\xaa\xe6\x3c\x76\xee\xee\x15\xbf\x0f\x9e\x2d\xcd\xe4\xe4\xe3\xe7\x8f\xc6\xc2\x9e\x3a\x93\xf3\xff\x0e\x9a\x6e\x0b\x35\x66\x45\x95\x38\x90\xde\xbf\x62\xdb\xea\xf4\x90\x51\x78\xd4\xf0\xa5\xa5\x92\xc1\x92\x94\xee\xba\x7c\x21\xcf\x8f\x1b\xb3\xf4\x51\x21\x87\x37\x6d\xe7\x2f\x11\x36\xa4\x8a\xc2\xdf\xaf\x32\xd0\xf3\x7d\xe0\x64\x59\x25\x92\xb6\xe1\xbc\x0c\x51\x2c\xf4\xd2\xd8\x5d\x16\x79\x78\x53\xa8\x09\x33\xb0\x9c\x2f\x7b\xfb\x9e\x54\xa6\x9e\x51\xa8\xe4\x23\xa9\x1c\x3e\x5f\xde\xb4\x79\x05\x33\xe8\x7a\x4b\x1c\x0e\x0e\x23\xa9\xdb\x95\x73\xac\x17\xab\x6e\xc7\x01\x4d\x8b\x7c\x44\x86\xe1\x57\x25\xf8\xd2\x64\xee\xa3\x05\x0e\x83\x5a\xe0\xac\x44\x9d\xb3\x34\x50\x2a\x6d\x97\x35\x8f\xa8\x59\x10\x6a\xd0\xf6\xf4\x29\x5f\x23\x44\x92\x0a\xdf\x93\x55\xa6\x94\x9d\x8d\x14\x5c\x25\x62\x8a\x46\xa1\x04\xca\x09\x9b\xd9\xdd\xe9\x41\x11\x9c\x83\x82\x0c\xdc\x2c\xb2\xd0\x97\x22\x69\x49\x01\x04\x3c\x37\xcf\x0a\xe8\x79\xbe\x20\x30\xd0\x37\x31\x58\xb9\xc4\xb0\x71\x82\x98\xbe\x45\xf6\x30\xf6\xfc\xdc\x19\x0f\x7b\x29\x26\xd8\x76\x55\xa1\x8b\xb7\x97\xac\x50\x75\x7f\xcd\x36\x55\xc9\xe4\x1d\x51\x63\x29\x3d\x9a\x13\xd9\x84\xf5\x91\xf7\x5b\x7e\x4e\x5c\xad\xb6\x4c\x4c\x9f\xdf\xef\x76\xca\xb6\x93\x81\xd0\xf6\x0b\x48\x3f\x80\x4b\xb3\xb3\x33\x64\xdf\x8c\xff\xac\xb3\xc9\xb1\x3f\xf4\xc8\xd8\xd4\xea\x40\x76\x6a\x7d\x42\xd8\x25\x6c\x6b\x1c\x11\xc1\x91\xda\xba\x1b\x8e\xf2\x15\x93\xe4\x7b\x18\x85\x8e\xc1\x9d\x81\x73\x58\x67\x8d\x85\x48\xff\x15\x35\xd5\xfc\xf4\x41\x4b\x6a\x11\xd3\x4a\x37\x42\xf8\xd7\x14\x9f\xa6\x81\x38\x3a\x94\x08\x88\x7f\x1c\x0a\x98\xed\x52\x1e\x72\x79\x32\x77\x82\x4d\x6f\x74\x6d\x49\xb6\x3d\x44\x4e\x31\x2e\x6d\x9b\x98\x66\x11\x25\x81\x96\xa5\xb0\x12\xb8\x8f\xaa\x29\xf9\xa6\xc6\x7e\xd2\x5d\xf8\x7b\x2d\xbf\x0d\xbd\x2d\xc3\x08\x0c\x5b\x8d\x15\xa3\x7d\x34\x72\x90\x98\xed\x0d\xe9\x2d\x75\x80\x74\x29\xb2\xca\xe5\xd7\x28\x3c\x4e\x5c\x9b\xd1\x96\xd1\xad\x43\x6c\x7c\x34\xf3\xc9\x46\x6e\x5c\xb3\x19\x6b\x44\x3f\x4b"}, +{{0xed,0x25,0x58,0xe5,0xc5,0x67,0x84,0xbc,0xfb,0x4f,0x4d,0xde,0xa3,0xc0,0xdf,0xbe,0xf8,0xd9,0x6f,0xf1,0xca,0xbf,0x15,0x8e,0xc4,0xab,0xe6,0x0a,0xff,0x66,0x99,0x9e,},{0x1e,0xdc,0x99,0x10,0x12,0xac,0x6f,0x88,0x8f,0xa7,0xe6,0x04,0x57,0x77,0xe9,0xba,0x1d,0x4c,0x03,0xc4,0x02,0x92,0xd2,0xda,0x6b,0x72,0x2b,0x4a,0xd0,0xa3,0xed,0x74,},{0xab,0x9e,0x01,0x16,0x65,0x24,0xfd,0x28,0x8e,0x5c,0x68,0x9e,0x56,0xd7,0x30,0xd4,0x98,0x30,0x00,0x55,0x10,0x30,0x49,0x33,0x34,0xa3,0x98,0x4e,0x22,0x23,0xdc,0x9f,0x7a,0x5b,0x91,0x0c,0x61,0x76,0x0c,0x61,0x57,0x99,0x0a,0x4c,0x33,0x5e,0x34,0x8e,0x3a,0x7b,0xc8,0x22,0x3e,0x09,0xc1,0x0c,0x5e,0x52,0x0c,0x8d,0x61,0xaf,0xf5,0x00,},"\x2c\x64\x33\xe9\xbf\xbf\x4c\xfd\x4e\x07\x1f\x15\xce\x6b\x12\x9d\x78\x0a\x4b\x3d\xe0\x14\xfa\xc0\x34\xe0\xd4\x4e\xf7\x72\xe2\xc8\xb0\xd6\xa3\x48\x1d\x7b\x3d\xde\xb2\x37\x63\x26\x73\x55\x33\x13\xde\xac\x1e\xfa\xfe\x37\x02\xa7\xa4\x41\x1e\x12\xbd\x34\x1e\x8d\x8e\x96\xc5\x9c\x5e\x30\xc3\x68\x07\xa8\x38\x5a\x53\x8e\x9b\x66\x90\x7d\x6a\x52\x84\x00\xbd\x9f\x95\xee\xdc\x52\x16\xb2\x8f\xd7\x43\x7d\x8f\x4a\x02\x9f\xdb\xdc\x7c\x93\x8e\x4e\xb9\x81\x2f\xec\x05\xea\x69\x32\x29\x62\x9a\xce\x6a\xcc\x7a\xf6\xba\x4c\x23\x8e\x77\x22\xf3\x12\xf7\x89\x6b\x00\x49\x22\xf7\x06\x7e\xde\x10\x6f\x8e\x70\x15\x4d\x78\x3f\xb4\x12\x91\xf3\xc7\xe2\xe4\x82\x60\x45\xb5\x74\x1b\xcb\x4a\x88\x38\xf8\x7a\x32\xe0\x04\x97\x04\xe9\xb5\x32\x34\xc2\x24\xff\x89\x8a\x75\x6e\x52\x91\x34\xc1\xa9\xbf\x50\xfd\x02\x98\x19\xb2\x23\x8b\x60\xb2\xae\xc1\x12\x8f\x34\xd2\x1f\x9d\x66\x98\x3b\xed\x39\x86\x59\xd8\x08\xb6\x7a\x2e\x50\x1b\x5a\x1f\x25\xf7\x1f\x0f\x0c\x1e\xb2\xfe\xa0\xab\x42\xd8\x2f\xf3\xbc\x93\x58\xbb\x20\xc2\x75\x20\xc1\x44\xcf\x21\x16\xf4\xa4\x9c\xbc\x61\x99\x4d\x2d\x71\x05\x46\x69\x4c\x4f\x60\x2d\xc4\x06\xe0\xb0\xc2\x7e\x5f\x5e\x64\x66\x7e\x95\xc2\xec\x9d\xf2\xd6\x52\x9c\xf5\x36\x22\xea\x10\xb9\x56\xb3\x45\xec\x55\xb6\xc3\x9a\x1e\x6e\xd8\x8a\xe6\x6e\x5b\x45\x71\x79\x42\x5d\x1a\x84\x90\x37\xb0\x7c\x46\xcf\x5f\x36\x33\x01\x09\x58\x37\xce\x81\x1b\xff\x49\x60\xbf\x9c\xbd\x15\x20\x1c\x1b\x67\x40\xbd\x70\x10\x21\x40\x74\x4c\x33\x27\xac\xa9\xd6\xd6\xd1\x54\x93\x67\x98\xac\x38\x1f\xa6\x39\xdb\x43\x6e\xe8\x16\x56\x67\xd5\x38\xa6\xc7\x4a\x23\x3c\x12\x4b\xf6\x04\xfd\xad\x51\x98\x4c\x41\x70\xb8\x20\x0d\x2d\xf7\x3c\x29\xbb\x1e\x37\x6a\xff\xc3\x14\xdd\xe3\xe8\x6a\xf9\xd2\xc2\xe6\xc3\xa6\x52\x4d\x32\x1b\xce\x93\xe2\x1f\xc9\x65\x56\x4f\xaf\x77\xd0\xcd\x1a\xcc\xb4\xd7\x62\x94\x85\xf5\x64\xc7\x9f\x4d\x8a\x2f\xde\xfb\x46\x54\x54\x02\x8c\x6d\xd1\x42\x80\x42\x80\x53\x70\x74\x33\x63\xbb\x18\x47\x6a\x3f\x23\x20\xdb\x25\x89\xc7\x21\x33\xcf\x5e\x29\xda\xfb\x7d\x07\xaa\x69\xa9\xb5\x81\xba\xb5\xa8\x3f\x40\x3e\xef\x91\x7a\xfa\x14\xb7\x64\xc3\x9a\x13\xc0\xc5\xea\x70\x19\xd2\xfd\xfb\xd7\xf3\xf7\xd4\x0e\xb6\x3b\x2a\x08\x4d\xa9\x21\x89\x5f\xe4\x8f\x4f\xd5\x94\x01\x7f\x82\x56\x9b\x46\x7a\xb9\x01\x16\x9e\xb5\xda\x9c\x40\x17\x1d\x5f"}, +{{0xb7,0x27,0x98,0xb8,0x11,0xe2,0x33,0x84,0x31,0x25,0x6d,0x24,0x80,0xfe,0x7a,0x36,0x63,0xac,0xec,0xbb,0xe6,0xe6,0xc1,0xb9,0x19,0x1e,0x9d,0x9a,0x22,0x44,0x79,0x40,},{0xce,0x49,0x1d,0xaa,0xd2,0x96,0xb5,0x57,0x27,0xb0,0x95,0x13,0xdf,0x02,0xba,0x59,0x28,0xa3,0x71,0x73,0x7c,0xd3,0x58,0x41,0xe5,0xf7,0x35,0xac,0xab,0x7c,0x5d,0xf8,},{0xdc,0xfc,0x6f,0xd4,0x77,0x99,0xfe,0xc7,0x72,0xc2,0x09,0x9b,0x3c,0x64,0x37,0x24,0x6c,0x3a,0xd0,0x72,0x29,0xfc,0x74,0x0e,0x05,0x31,0x1a,0x20,0x6b,0x18,0xb0,0x2e,0xcd,0xb0,0x26,0xc9,0x26,0xf4,0x9c,0x65,0x52,0xe3,0x47,0xfd,0x35,0xdf,0xde,0x06,0xcb,0x63,0x9a,0x79,0x7c,0x50,0x61,0x2f,0x98,0xe2,0x47,0x8a,0x92,0xaa,0xf6,0x09,},"\xa5\xd4\x62\x98\xb0\x79\x06\x10\xae\xdc\x09\x70\xfe\xa2\xa7\x07\x50\x81\x84\x72\x66\xf2\x2f\x12\x47\x8b\x93\xd7\xe6\x74\xc6\xc5\x17\xf3\xc1\x4e\xd0\x61\x26\x9d\x17\x0a\xc3\x1e\x2a\x64\xf9\x75\x4a\x56\x5b\xac\x1d\xd9\x75\x73\x22\xc1\x11\x32\xe7\xbb\xee\x5f\x32\x81\x8e\x0e\x30\x63\xab\x64\xe5\x52\xd0\x9b\x0f\xd1\x75\x76\x39\xb9\xb9\xd1\xc7\x70\x01\x6b\x67\x74\x65\x87\x2b\x66\x9d\xd4\x8b\xe0\x38\x66\x57\x51\x67\x4d\xd2\xf4\x0a\x96\x6a\x26\x74\x8f\xd3\xe5\xdb\xfd\x92\x26\x5e\xb9\x36\xf5\x5b\x09\x42\x86\xc0\x10\x62\x99\x04\x34\x7c\xb4\xc5\x26\xe3\x77\x47\x0a\xa9\x6e\x81\x69\xa6\xf2\x11\x63\x38\x07\xa5\x00\x30\xe7\xff\x68\xe3\x89\x11\xb3\x55\x5e\x72\x8e\xd8\x59\x0b\x2d\xc4\x5f\xea\x69\x94\x5c\xc0\xc9\xa3\xd3\xe6\xc9\x54\xb3\xe8\x01\x06\xa5\xc9\x1d\x3d\x22\xe8\x9e\x8c\x0e\x1d\xe9\x02\x05\x8e\x9c\xd0\xf8\xce\x80\x6e\xac\x4f\x89\x3e\xe0\x42\x99\x00\xfb\x54\x87\xb8\xfd\x36\xdb\xdc\xb3\x4f\x2d\x54\xfc\x6c\xc7\x4a\x92\x39\x51\xb8\x63\xda\x70\xf1\xb6\x92\xbf\x04\x38\x48\x43\x66\xcd\x85\xee\xb8\x80\xb2\x79\xf8\xfc\xa9\xd3\x24\x2c\x55\x83\x30\xf1\xca\x57\xc6\xa5\x86\x08\xcd\xbc\x07\x73\xe1\x60\x82\xbc\xa9\x64\xdd\xc4\x03\x47\xda\x8a\x36\xb2\xa9\x32\x8c\x2f\x46\x60\x9e\x09\x2f\xd6\x4b\x41\x34\xee\xe1\xd0\x99\x81\x3e\x12\x46\x48\x9e\x8e\xe5\xb1\x9b\x3d\x3b\x89\x1c\x28\xf3\x0b\x38\xb6\xa2\x8e\xc1\xd3\xe9\xb0\x05\xde\xc9\xc6\x3f\x8b\x98\x13\xbc\x1d\xe4\xaa\xf9\x95\xf1\x77\x9d\xde\xd1\x5c\x7a\x43\x0d\x70\xca\x46\xe7\xca\xfd\x4e\x9a\x54\x38\x04\x44\x6a\xb0\x80\x7d\x64\xf2\x55\xe2\x01\xef\x42\x8a\x47\x4d\xae\x8a\x0a\x75\x02\x1b\x62\xad\x39\x88\xff\xb8\x1c\xd8\x22\x1b\x24\x30\x85\xa0\xad\x04\x6f\xdc\x16\xc6\x7f\x17\xb9\xf8\x18\x20\x09\x59\x53\xa5\xb9\x8a\xcb\xdf\x93\xeb\xcf\x80\xbc\x9c\x99\xaf\x5f\xbf\xfa\xcb\x61\xa9\x25\x1c\x5a\xaf\xdb\x22\xb1\x12\x9b\xfc\x60\xc9\x8e\x0f\x17\x52\x63\xbd\xf9\x3d\xc9\xa0\x8b\x8e\xfc\x2e\x8c\xda\xf0\xf8\x3d\x6c\x49\xec\x90\x16\x45\xea\xc5\xa4\xff\x63\x38\x5a\x6f\x1a\xf2\x07\x18\x97\x66\x2a\x37\x22\x19\xc9\x30\x1f\x54\x5a\x2e\xbb\x8f\x59\x17\xdb\x7f\x29\xca\x13\xfc\x86\x1a\xf3\x8d\x90\xc3\x5c\x03\xac\x91\x84\xc1\x22\xe5\x7b\x05\x7c\xde\x42\x6f\xd7\x6d\xca\x79\xe2\x5e\x64\xdb\xb4\x1c\x84\x14\xa0\x45\x0d\xa4\x90\x5b\x90\x2a\xe9\x8d\x2d\xa4\xba\x79\x28\x01"}, +{{0x1f,0xe7,0x32,0x7e,0xa9,0x07,0xd3,0xff,0x17,0x9b,0x11,0x78,0x11,0xd3,0x01,0x93,0xfc,0xba,0x4c,0x34,0x7b,0x90,0x65,0x7f,0xee,0xd9,0x8d,0xee,0xec,0xda,0x9a,0xc9,},{0xee,0xf3,0x01,0xb1,0x6f,0xd7,0xbf,0x3c,0x7b,0x64,0x0b,0xf5,0xee,0x87,0x00,0xac,0x5a,0x87,0x16,0x9e,0xab,0x5f,0x56,0x01,0x5b,0x3f,0x49,0x9d,0x95,0x5e,0x07,0xeb,},{0x9c,0x7f,0xdb,0x53,0xfd,0x60,0x6b,0xc7,0xc9,0xc2,0x23,0xfe,0x94,0x31,0xe1,0xad,0x00,0x95,0x46,0xd0,0x00,0x98,0x81,0x2a,0x49,0x51,0x97,0xf2,0x54,0x1e,0x87,0xf8,0xd6,0xf5,0xda,0x22,0xec,0xef,0xcb,0xb7,0xda,0x56,0x66,0x2a,0x73,0x09,0xd1,0x0a,0x6c,0x4a,0x4f,0x7f,0x29,0x92,0x78,0xd5,0x1b,0xbd,0x11,0xe0,0xcc,0x1b,0x87,0x09,},"\x19\xa8\x32\xf2\x6f\xbb\x02\x39\xf0\xd9\xd2\x6a\x2e\xbd\xed\x24\x03\xc2\xa4\x06\xdd\x1f\x68\x31\x8d\x67\x7a\xfa\x64\xf3\x50\x43\x31\x6a\x5e\xfd\x72\x97\x83\xc7\xf9\xd1\x8c\x09\x82\x46\x14\x65\x20\x91\x88\x6c\xc9\x54\xbe\x9f\x93\x12\xd4\x58\x6b\xf3\x6f\x30\x35\xac\x70\x34\x38\xb0\xcf\xe3\xde\xc5\x07\x78\x13\xc7\x10\xd1\x44\x75\x61\xab\x61\x57\xbc\x7a\xd5\xea\xb5\xb0\xc0\xaf\xdc\xc9\xdb\x77\xe6\x6f\xa8\x07\x13\x66\x82\x9c\x50\x10\x96\xc3\xd3\xa9\x38\x21\x8a\x6e\x42\x07\x10\x9d\x1e\xb8\x1f\x7d\x88\xbd\x6f\xbb\x2a\xef\xb1\xad\xef\x35\x94\xaa\xe5\x7c\x46\xb7\xb9\x84\xdb\x94\x68\xcd\x96\x2c\x61\x84\xfb\x97\x6f\x0e\x2a\xa8\x41\x52\xde\xb1\xc7\x6a\xea\x75\xae\x48\x84\x42\x94\x3a\x80\xba\x7d\x98\xa2\x8c\xb8\x64\xb5\xe8\x7c\xdb\x28\x4a\xd6\xe8\xd7\xaa\xdc\x6b\x75\xd6\x9d\x3b\xd3\x45\x78\x3b\x3e\xbb\x67\x6f\xf9\x5d\x7b\x41\x91\xe5\x99\x85\x1c\x96\x28\x83\x5c\x7c\x01\x19\x7e\x7c\x8f\x86\xf9\xc8\xfb\x49\xfe\x3e\x28\x45\x8b\xa9\xb0\x23\x62\x19\xbd\x46\xc2\x8d\xf6\x53\x24\x96\x99\x4a\xc9\xba\x73\x3c\x01\x05\xa0\x2a\x26\x9a\x2b\xe8\xb7\xcb\x40\x07\x4b\x88\x16\x02\xef\x92\x47\x05\x2d\xe9\xd6\x37\x08\x91\x88\xbd\x4c\x18\x5c\xca\xe2\x58\xa2\xae\x98\x56\xa2\xcb\xf8\x45\x11\x17\x68\x3c\xe3\x41\xf8\x09\x6e\x1d\x91\xe8\x74\xc5\xcb\x8a\x4e\x09\x39\xeb\x77\x37\x3a\x9a\x0e\xb7\x91\x64\x5b\x8f\x54\x60\x47\x2d\x66\x9d\x80\x14\x68\x1a\x5e\x77\x87\x06\xcb\x55\x66\xbb\xd4\x72\x7d\x17\x16\xb2\x3c\x62\x0d\x22\x8b\x5d\x4d\xc2\xb3\x52\xb4\x23\x93\x1f\x8a\x7e\x8f\xb5\x9e\xda\xd8\xae\x42\x45\x87\x29\x86\x1a\x98\xe0\xc8\x50\xa7\x7e\xd6\x55\xe7\xfc\xfe\x4f\xe3\x6f\x97\x72\xdf\x1a\xc3\xc6\x43\xad\x31\xdb\x56\x30\xd5\x71\xdf\x9f\xcc\x9c\x50\xde\x76\x22\x10\x84\x11\x96\x2b\xbf\x72\xde\xfb\xf4\x9e\x99\x70\x59\xc7\x31\x1b\xd9\xdd\xd5\xb3\x38\xa9\x85\x19\x38\xd3\x7e\x7a\x26\x21\x08\xa2\x91\xe2\x01\x68\x03\xbb\xef\xf4\xf9\xc7\x76\x12\x5c\xeb\x7e\x72\x72\xb5\x1c\x7c\x33\x46\x1d\x80\x89\xf8\x40\x8d\x8d\xda\x92\x50\x6d\x50\x02\x08\x4d\x4f\x41\x4d\x8a\x4d\x28\xd3\x69\x4c\x88\x63\x0e\x31\x80\x19\x90\xd9\x52\x71\xce\xf4\x7a\xa5\xc2\x63\xf9\x7b\x7d\xac\xa1\x78\x87\x01\x43\x63\x29\xb5\xbf\xaf\x72\x65\x3c\x16\x6d\xb0\x87\x70\x81\x30\xc5\xc0\xd7\x8c\xc4\xe9\x06\x4f\x86\x06\x80\x27\x1a\xfe\x4c\x40\x98\x53\xc2\xfa\xd6\x75"}, +{{0x5f,0x9d,0xcd,0x93,0xfb,0x14,0x06,0x10,0xb0,0xe2,0x11,0xb3,0x9a,0xdd,0xb1,0xeb,0x87,0xba,0x97,0x80,0x48,0x77,0xaf,0xbc,0xc3,0x81,0x38,0x8c,0xad,0x65,0x08,0x45,},{0x18,0x2a,0x23,0x7d,0x87,0x8c,0x58,0x19,0x33,0x33,0x2b,0x41,0x78,0xb6,0x7e,0xc4,0x08,0xb3,0x19,0x4d,0x44,0xe4,0xe6,0x93,0x92,0xef,0x80,0x0b,0x26,0x7c,0x29,0x49,},{0xc1,0x91,0x5e,0x05,0x2b,0x66,0x47,0x97,0xe0,0xd5,0xfa,0xad,0xc7,0x8f,0x2a,0x00,0x9d,0x6f,0xbc,0xfd,0xe0,0x3f,0x3a,0xaa,0xd5,0x9b,0x9f,0x45,0x88,0xe7,0xfc,0x3b,0x21,0x99,0x0c,0x52,0x08,0xd3,0xd7,0x6b,0x4a,0xa9,0x5b,0xd9,0x34,0xe8,0x8d,0x3c,0x98,0xc5,0x91,0x93,0x0a,0x59,0xde,0x2a,0x05,0x67,0x01,0xd9,0xf7,0x57,0x74,0x00,},"\xc3\x8b\x87\x4d\x3f\xf0\x10\xff\xf1\xa6\x61\x3b\xfa\x13\x42\x57\xb2\x48\x33\xcb\x53\x6d\xe3\xe7\x49\x92\xc3\xcb\x01\xfe\x3b\xbd\xee\xd9\x7d\xc3\xc4\x59\x6f\xa4\x40\x61\x44\x2b\xd3\x1a\x9d\x4a\xa8\xc8\x1e\x34\xad\x98\x88\x71\x82\x06\x63\x55\x09\xb1\x33\xb1\xba\x69\xcb\x1a\xa0\xe7\x5c\x7a\x18\x93\xc0\x80\x16\x1d\x26\x15\x2a\xce\xf4\x0f\x6e\xf4\x21\x0e\x95\x2a\x49\x82\x8b\x5c\xdd\xe8\x04\xbc\xb5\x36\xcd\xc3\x49\xa8\xe8\x31\xb4\xb6\x9d\x37\x85\xa7\x6b\xd9\xfb\x27\x08\x05\x65\x97\x2d\x0b\x8f\xbd\x16\xf3\xf9\x60\xa6\xbf\x3b\xa0\xc5\xb9\xc4\x04\x96\x7e\xc1\xaf\xfe\x59\xb8\xc4\xec\xc6\x50\xfd\xde\x1c\xb0\x6b\x70\x59\x5a\xd4\xd3\x25\xda\x0f\xab\x4c\x55\x40\xa7\xa8\xd5\xeb\xea\xcc\x4e\x99\xbd\x0d\xc9\x6b\xde\x82\xf2\xbd\x7d\x95\x86\x30\x84\x65\xe5\x5b\x1c\xc3\x88\xd7\x50\x48\x6b\xdd\x5c\x72\x64\xd5\x4f\x56\x14\xd4\x87\x26\xd9\x9e\x44\xd7\x77\x8d\x9e\xd0\x32\x39\x58\xab\x98\x58\xe2\xb2\x5d\xf2\xbf\x99\x4b\xa3\xe6\x25\xe2\x80\x3b\x6c\x69\x31\xe7\xa9\x92\x6f\x1e\x61\xed\x86\x24\x03\xce\x39\x2a\xb8\x3b\x7d\x1b\x66\x08\x5d\xcc\x06\xd8\x2d\xbf\x17\x6d\x01\x6d\x9f\x44\xcd\xcb\x50\x72\xd0\x04\x59\x1e\x92\xd0\x45\x9e\xf0\x5a\x51\xb8\xf5\x4b\xa1\x72\x51\xe1\x66\x21\xeb\xb7\x53\xe5\xb1\x59\x0c\x02\xd2\x1e\x40\xf4\xb7\x5e\xee\x46\x02\x86\x0b\x97\x41\xfb\xbc\x0d\x2e\x38\x5b\x8d\xac\xa8\x3c\xce\x68\xc3\x4a\x99\xbd\xe6\xa6\x0d\x13\xba\x64\x34\x7d\x0a\x38\xd6\x4b\x2a\xde\x25\x0f\x38\x85\x2c\x4e\xda\x2e\x2e\x4f\x30\x3c\x3d\xe1\xa8\xa9\xd4\xab\x33\x00\xc9\xe6\x36\x22\x87\x9f\xc8\x53\x7f\xfc\x63\xb1\x85\x61\xfa\x1f\xff\x65\x53\x12\x41\x51\x5a\x62\xbb\x9b\x08\xb8\x0a\xf3\x76\x67\xa6\x01\xae\x04\x17\x17\x93\xcc\x83\xb1\x1a\xdf\x9c\x30\xca\x9f\x4d\xab\xc7\xb4\x01\xe1\x6a\x18\x14\xcf\xc7\x50\x24\x8c\xc2\xf7\x7e\x03\xf9\xc4\x33\x44\x65\xff\x6a\x2c\x83\xcb\xb5\x6d\xb4\xb7\x34\x75\x10\x43\x83\x2c\x40\x00\x97\x2e\xe3\x23\x2f\x92\x9f\x23\x33\x7e\xba\x5e\x65\x1e\x34\xcb\xdd\xfe\x68\xba\x21\x9b\x63\x2e\x7a\xcd\xbd\x46\x30\xa0\x31\xbf\x16\x89\xfb\xbc\x7f\xbb\xb2\x10\xdb\xf2\x5e\xe8\x7e\x2e\xf2\xb3\xcb\xaf\x8d\x9e\xbd\x8f\xc9\x2c\x3a\x58\xd3\xc0\x5b\x13\x85\xa7\x6c\x87\x79\x1d\x7c\xd3\x74\x1b\x71\xb6\xc3\x29\xde\x9a\x9d\x75\x08\xa0\xc1\x56\xa9\x52\x1a\x90\x20\x56\x30\x99\xa8\x2b\x87\x70\xae\x9a\x94\x4a\x7e\x94"}, +{{0x92,0x5e,0xbe,0x04,0xc6,0xea,0xc4,0x9b,0x26,0x73,0x8d,0x6c,0x13,0x00,0xf3,0x1f,0xd4,0x82,0x84,0x78,0xcb,0xe9,0x7d,0xab,0x18,0xbb,0x88,0x96,0x42,0xe1,0xe1,0x10,},{0xcd,0x72,0x31,0xb6,0xeb,0x74,0xe1,0xfe,0x9f,0x92,0x6f,0x00,0xd8,0xde,0x2c,0x51,0x3d,0x49,0x64,0x05,0x25,0xb0,0x79,0x5c,0xab,0x89,0x3d,0x0c,0x89,0x29,0xe3,0xe0,},{0x2c,0x4d,0x69,0xbe,0xd5,0xad,0x8b,0x95,0x84,0xd8,0x49,0xcf,0x3d,0xf2,0xba,0xc7,0x22,0x82,0xb5,0xf3,0x0d,0xe2,0x66,0xb1,0x4f,0x53,0x3c,0xa9,0x6e,0x95,0x50,0xc4,0xb8,0x54,0xc1,0x54,0xbd,0xc1,0x7a,0xa8,0x80,0xcf,0x00,0x1a,0x64,0x54,0xff,0xaf,0xaa,0x2e,0x50,0x17,0x8d,0xe2,0x12,0x16,0xed,0x12,0x6b,0x63,0xf7,0x7f,0x2d,0x02,},"\xe6\xc0\xba\xd2\x3a\x92\xae\x8b\x1d\x85\x77\x82\x88\x15\x7a\xc6\xc6\x17\xc6\x33\x63\x34\x1d\x77\x78\x70\x34\x1b\xb1\x0a\x8d\x3d\xfc\x89\xbe\x4f\x55\xad\x4f\x64\xe8\x3b\xf2\x49\x9b\x69\xfd\xf7\x21\x74\xd2\x84\x4e\x6b\xd2\x89\xda\xaa\x03\x5f\xec\x5b\xf7\xcf\x45\x52\x21\x19\xdc\x7a\x8c\x81\x1d\x79\x57\x8c\x5b\xb0\xf6\xd3\x4d\xb5\x07\xad\x1f\xb6\xdb\xff\xf9\x97\xb7\x9d\xac\xfb\x3d\xa5\x0a\x41\x5e\x35\x0c\x99\x8c\x0a\x02\x80\x0a\xa5\x0f\xfd\xfe\x5f\x42\x76\xd8\xe6\xbb\x82\xeb\xf0\x47\xfe\x48\x71\x1d\xaf\x7a\x89\x3b\xdc\x75\x37\xbd\xae\xdf\x3d\xcb\x4d\xec\x5d\x24\x58\x68\x11\xf5\x9b\x25\xb1\x9e\x83\xca\x61\xe5\x59\x2f\xed\xc0\x8c\xa5\x44\x73\xce\xa2\xec\x12\x1b\xaa\x0e\x77\xfb\x2d\x9d\x76\x56\x57\xde\x67\x98\x0e\xd5\x7f\x2f\x17\x78\x58\xb6\xde\xcf\x84\xff\x90\x21\x2d\x96\x47\xf4\x1e\xed\x9b\x9d\x0e\xa3\xd8\xd6\x21\xe4\xbb\x40\x41\xac\xc5\x14\x6e\x96\xdf\xcf\x14\xea\x96\x2d\x30\xc8\xcc\xb3\x9e\xa2\xbe\x95\x8c\x9b\x87\x74\x45\x1b\xfe\xb7\xdd\xce\x71\x6e\x94\x92\x3c\xc8\x5f\xbd\x3a\x31\x30\x78\x0e\x2b\x3b\x2b\xb7\x6d\xa5\x34\x19\x12\xa4\xe9\x94\xca\xfa\x19\xbb\xa1\x97\x32\xf2\xea\x40\x2d\x71\xd3\xd8\xa9\x69\x67\x9b\x9d\x10\x42\x43\xd9\x83\x9c\x69\xee\x9e\x95\x5e\x1c\x60\x44\x97\x88\xd1\xf4\xf6\x65\x1f\x4b\xc9\xb9\x4d\x73\x52\x2e\xc0\xcf\x72\xca\xcf\xcf\x19\xf1\xf0\x3a\xd6\x23\x21\x04\xb5\x5c\xbb\x8b\x5b\xb1\xe2\x13\x44\x71\x3d\x48\x27\x42\xd6\xab\xc5\xa9\x57\x17\x4f\x62\x3b\x84\x95\x27\x2c\xc1\xe2\xb8\x31\x5e\x5c\x80\xf9\x47\xf5\x00\xc8\x3d\x85\x44\xf7\xcd\x4f\x65\x34\x89\x49\xef\x44\x20\xd7\xfc\x83\x1f\xa4\xae\x2e\xe1\x8d\xbb\xa6\x14\x92\x5c\xe1\xd7\x67\xc1\x77\xa6\x26\xc4\x52\x7a\x81\x54\xb5\x72\x92\x18\x6b\x04\x4c\xbf\x92\x89\x42\x53\xb0\x0f\xd9\x34\x3f\x9e\x69\x7b\x14\x12\xeb\xa4\x35\x97\xeb\x72\xa6\x69\xaa\xa2\xd7\x7e\xac\xb9\x68\xc2\x0f\xe1\x95\x05\xa3\x80\x74\x15\x86\x21\xb6\x06\xf7\x7d\x97\xbc\x6e\xbe\x50\xe7\x58\x92\x93\xdb\x27\xfc\x7d\xfe\x63\x1a\x4b\xee\x83\xb2\x26\x82\xa7\x73\x28\xc3\x6d\x9d\x7d\x1d\x89\x1d\x65\x21\x7c\xc4\x78\x64\xf6\x80\xdc\x8b\x5f\xd1\xa0\x1a\x0f\x7c\x34\x43\x0f\x77\x06\x0b\x69\x1a\x1a\xd2\x13\xd2\x28\x68\xe6\x1b\xbd\x38\xf4\x3f\x0c\x8b\x4d\xa6\x8a\x58\x31\x86\x66\xc0\x99\x76\x61\x70\xc2\xdb\x76\x6a\xaf\x41\x7f\x55\x6c\xc9\xa0\xa3\x93\x4e\x9f\xce\xf1"}, +{{0x4d,0xd3,0xb4,0x78,0xeb,0xdc,0x59,0x47,0x2b,0xab,0x14,0xa8,0xcd,0xd0,0xc2,0xfd,0xac,0x57,0x23,0xee,0x04,0xdd,0x89,0x17,0xc7,0xcf,0xe7,0xa5,0x36,0x48,0x5c,0x77,},{0x5b,0xcc,0xb3,0x7e,0x68,0xc2,0x34,0xbe,0xad,0x49,0x33,0x7d,0xe2,0x08,0xaf,0xba,0xf6,0x11,0x81,0x1d,0x96,0x58,0x59,0xa0,0x6d,0x31,0x30,0x12,0x47,0xd6,0x6a,0xcf,},{0x57,0x88,0xe7,0x9e,0x84,0x3b,0xde,0x9e,0xf1,0x1a,0x9d,0xfa,0xc9,0x70,0x19,0x6a,0x56,0x7c,0x63,0x08,0xc3,0x48,0xe5,0x17,0x4b,0x38,0x77,0x95,0x04,0x6d,0x59,0x0a,0x47,0x49,0x1f,0xd7,0x1d,0x97,0xae,0xaa,0x78,0xc1,0x61,0x59,0x71,0xb8,0x34,0x90,0xe8,0x59,0x28,0x20,0xf9,0x59,0x2a,0xc7,0x62,0x69,0xb9,0xd2,0xba,0x70,0x29,0x01,},"\x1c\xdb\xd2\x85\x56\xec\x44\xe8\x70\x5a\xfd\xa9\x2b\xd5\xa5\x3f\x95\xd8\xfe\x8b\x0f\xfe\x46\x33\x73\x63\x33\x16\xc5\x22\x74\xc1\x1e\xdc\xd6\x15\x51\xe3\x19\x9e\x49\x4d\xff\x6d\x90\x6a\x73\x9e\x7b\x32\x43\x03\xfc\x47\x82\x7e\x56\xde\xf0\xbd\xcc\x46\xb8\x16\x01\x7c\x71\x23\x05\x37\x02\x63\xba\xbd\x2c\x71\xbe\x47\x8f\x41\xce\x30\xb1\xdf\x63\xbe\xdd\x3b\x2e\x6a\x51\x9c\x53\xdf\x51\x58\x52\xc4\x13\x7b\xc1\xac\xa4\x9b\xf4\xc4\x63\x1f\xd6\x56\x46\x57\xd1\x1c\xd8\x3e\xa7\x3c\xc3\xd0\xcf\x9e\x3b\x3c\x3e\x7c\xa9\x9b\x4f\x12\xa9\xc9\xb6\x7c\x87\x98\x14\x8e\x0a\x0d\xc1\xef\x8b\xf5\x86\x42\xa1\x4f\x97\xa5\x72\x13\x55\x14\xc1\x0b\x19\xaa\xbe\xc2\x5a\x9c\x6b\x35\xaa\x40\x34\xa5\x7a\xae\x1b\x6d\x05\xbd\xe2\xb6\x33\x0f\x25\x1d\x78\xdb\x09\x93\xf0\xca\x4c\x26\x38\x6e\x34\x89\xa2\x09\x28\x33\xb8\xac\xbb\xc4\xf4\x91\x7f\xd3\x09\x3d\xf5\x82\xff\xf7\x1e\xce\x21\x9d\x36\x72\x45\x55\x82\x60\x9c\x0d\xb8\xd9\x6a\x70\xfc\x8a\xed\x67\x98\xde\x54\xbf\xb2\xb3\xee\x6c\x5d\x32\x8d\xb1\x63\x59\x3f\x58\x01\x9f\x38\xf3\x39\xfd\x37\x53\xf8\x96\xa4\xa2\xcc\xa8\xc1\x40\x0a\x77\xea\x39\x19\x35\xf3\x4e\x26\x39\xc5\x60\x86\x08\x10\xbb\xbe\x4b\xe1\xd1\x6e\x01\x2c\x11\x49\x0a\xa8\x4f\x29\x64\xc8\x77\xc2\x93\xb3\x00\xf4\x3d\x37\x9f\x3e\xba\x9a\xf3\x91\xde\xe5\x10\x85\x6a\x4d\xdc\xf7\x6e\x0a\x0a\xe0\x6a\x6a\x7c\x0f\x9c\x5e\x3f\xa1\xb8\x35\x4f\xe8\x97\x7b\x4e\xa3\xb2\x06\x61\x49\x1f\xa4\x61\x3b\xa6\x2f\x55\x6d\x5d\x5d\xa8\x21\x3d\x01\x21\xde\x2c\x87\x25\xdf\x0a\xae\x04\x8a\xc8\x91\xab\xbc\x06\xbd\xce\xf3\xc3\xef\xfd\xf5\xa3\x17\x49\x47\x6f\x81\x4d\xb9\x45\x79\x45\xf0\xd9\x1e\x14\x08\x00\x56\xbe\x92\x1a\x16\xaa\x96\x4a\x92\x98\x22\x1b\x15\x75\x94\x97\x3e\x32\x96\x99\x93\x31\x0c\x87\x07\xe1\x9f\x31\x43\xab\xc4\xfd\xa7\xc8\xad\x01\x60\xac\xf0\x31\xab\xa6\x52\x80\x1a\xa8\x1a\x01\x6b\x31\x37\x03\x9e\x27\xd6\x73\x8d\x02\x80\x0a\x93\xa8\x6f\x9f\x55\x85\xc5\x18\xdf\xa9\xe7\xd8\xac\x72\x7f\x37\x43\x7e\x56\xd2\x78\x83\x86\xe1\x16\x53\xa0\x4e\x16\x51\x69\xf9\x03\x97\x2a\x01\x48\x47\x51\xe7\xcb\x38\x63\x25\x90\xec\x80\xd5\xfc\xe4\x54\x16\x01\xa0\xe0\x95\x78\x5a\x9e\xe8\xd3\x59\xed\xf2\x6b\x99\x46\xe7\x98\xda\x59\x98\xcb\xb7\x36\xf9\x4e\xb7\x13\x46\x3f\x79\xf5\x61\x75\x9b\xbc\xb4\xc4\xac\x69\x3c\xab\xf2\xe1\xe0\x36\xb2\xd0\xb0\x87\x9a"}, +{{0x07,0x4d,0x92,0x18,0xc1,0x21,0x7e,0x75,0x82,0x3c,0x90,0xe0,0x10,0x48,0x4c,0x2a,0xdb,0x88,0xec,0xcc,0xd2,0xbd,0xf0,0x12,0x0a,0xa3,0xed,0xff,0xcf,0xcb,0xd4,0xbf,},{0x37,0x35,0xad,0x19,0x19,0x03,0x3d,0x16,0x17,0xb8,0x5b,0xda,0x04,0xb1,0x61,0x21,0xda,0x1d,0x86,0x1b,0x40,0x41,0x54,0xfa,0x96,0x1d,0x49,0x46,0xe5,0x5e,0xcd,0x83,},{0xb1,0xf7,0x1c,0x3b,0xd1,0xb6,0xbe,0xc4,0x33,0x37,0xe2,0x6d,0xee,0x65,0x5a,0x8d,0x5f,0x4a,0x8d,0xad,0x84,0xa5,0x11,0x84,0xb7,0x75,0xb6,0x86,0xfa,0xd3,0x1d,0x80,0x29,0xe3,0x87,0x69,0x27,0xf9,0x57,0x6e,0x90,0xc3,0x62,0x48,0x75,0xfc,0x00,0x29,0xa5,0xc1,0x0a,0x8a,0x0a,0xf7,0x5d,0x7a,0x88,0x0c,0x68,0x44,0xa4,0xa8,0x3a,0x00,},"\x6b\x5a\xa4\x0e\x91\x67\xbf\xdb\x84\x7d\xaa\x7d\x27\x86\xe2\x8e\x75\x33\xe1\xd6\xac\x53\xbe\xb6\xf6\x9b\x59\x53\x79\x5a\x2b\xf5\x9b\xbf\x7d\x14\x19\x26\x96\x8f\x50\x96\x9b\xad\x74\x2a\x4f\xb5\x79\xd3\x25\x0f\xb1\xbe\x4c\x57\xeb\xf4\xf9\x11\x2c\x70\xcd\x9f\x72\xa0\x0d\xb1\xc8\x89\x6f\xe2\xb5\xbd\xa7\xc7\x03\x0f\x49\x7c\x0b\x00\x1e\xa2\x5b\xa0\xd4\x47\xf0\x8c\x36\xdb\x8b\x90\x7c\x2f\x2a\xbb\xbb\x62\x0d\x3e\x8a\x2c\x66\xe4\x17\x12\x85\xad\xca\xad\xd1\xc1\x4f\xe2\x39\xbc\x59\x5f\x09\x83\x96\xaa\x87\x80\xff\xb8\x0f\xe1\x44\x6a\x07\x00\x1e\xc2\x34\xd8\x2a\xbd\xcd\x81\x00\x79\x39\x15\xb0\xb3\xf8\x0d\x84\xe2\x0e\x51\xea\xbc\x79\x78\x06\xf3\xbe\x81\x08\xa4\xf4\x37\x55\x0b\x06\x69\x40\x50\xa8\x29\x31\xac\x40\xc0\xa4\x89\x77\xed\xf6\xce\xd2\x42\x8d\x7c\xfe\xa8\x20\x55\x06\xde\x86\x40\x80\x65\xd1\xa1\x98\x70\xfa\x33\xa7\x08\x10\x37\xb3\xee\x44\x91\xb6\xe7\xf3\xd1\x0b\x14\xa3\x0c\x20\x91\x59\xa1\xc8\x12\x31\xa3\x5f\x03\x65\xb4\x7d\x3e\x0d\xa0\x4a\x32\xc9\x5d\x98\x33\x3c\x44\xf5\x72\xcd\xaa\xa9\x05\xd0\x69\x19\x7f\x6e\x86\x1b\x5d\xfc\xdf\xb9\xdb\x6c\x7b\x0d\x0c\xb0\x0f\x37\xc9\x16\xa1\xc4\xc0\xb8\x98\x5b\x09\xf3\x34\x09\x5e\x12\x83\xed\xfd\xd4\xe6\x2a\x29\x41\x09\x9a\x2b\x69\x36\x96\x60\x4d\x99\x43\x11\xe3\xd5\xf6\x10\x66\x83\xe1\xd7\xa1\xc7\xe5\x3d\xf7\xb7\x90\x94\x7a\x9a\x80\x1a\x0c\xcd\x48\x43\x95\xf6\xcb\xfd\x9c\xa4\xd9\x80\x4f\x18\xd5\x2b\xb0\xf9\x46\xd1\xa8\x9f\x97\xa6\xfb\x06\x80\xa8\xc4\xc0\x57\xb6\x06\x2b\x2b\x9d\xe7\xc0\x37\x48\x79\xb8\xa6\xa6\xd2\xc1\x0a\xef\x78\x05\x08\xeb\x28\xbb\x56\x9a\x08\x35\x09\x44\xc8\x2f\x6e\xf2\x8d\xb2\x30\x4d\xb6\x97\xc3\xae\x1a\xf4\x3a\x50\x0b\x0b\x97\x48\x03\xe9\xf4\x6e\xa2\xa0\x2e\x85\xed\x27\xdd\xa6\x16\xd2\x4d\x6d\xb3\xcc\x4f\x5a\xed\x82\x40\xb1\xae\xa3\xdc\xf6\x9d\xee\x5f\x14\xf9\x5e\x6e\x72\x98\x7b\xbe\x61\x89\xbc\x20\x45\xf0\xd7\x83\xa7\xb4\x7b\xfc\x19\x83\x0b\xc7\xf4\xe7\x98\xab\xe9\x02\x45\xfb\xd4\x3f\x37\xc3\xf0\x36\xd1\xcb\xf1\xe7\x3d\xcb\x1d\x9d\xaa\x87\x37\x9b\x11\x06\x97\x34\x81\xa2\x15\xc1\xf4\xf4\x6c\x16\x03\xa5\xd5\xcd\x97\xb7\x07\x6f\x1f\x5d\xc7\x89\xaa\x6a\x71\xe7\x2e\xf5\x4e\xd3\x28\xa4\xab\x64\x34\x05\x39\xff\xd1\x64\xd0\xec\x64\x5f\x32\x2d\x1b\xc3\x71\x12\xdc\x08\xd8\xc8\x07\x9d\x19\xd3\x7a\xbb\x23\x53\xf4\x8b\x5c\x49\x2f\x80\x6e\xd2"}, +{{0xd2,0xea,0x2d,0xff,0x7a,0xf0,0xba,0x2a,0x6b,0xed,0x7f,0x6c,0xc6,0x8c,0x0d,0xf6,0x64,0xa6,0xb1,0x0c,0xe8,0x01,0xc4,0x2e,0xd5,0xbb,0xe6,0x17,0xbc,0xc8,0xb8,0x4a,},{0xab,0x44,0x70,0x63,0x44,0x02,0x6e,0xd3,0x5e,0x21,0x98,0x29,0x64,0xf7,0xb4,0xdb,0xbb,0xe2,0x07,0xfd,0x27,0xc4,0x67,0x99,0x70,0x1c,0x19,0xa4,0xd8,0x8d,0x1d,0x72,},{0x9a,0xbd,0xb9,0xdd,0x2a,0xb7,0x7b,0x6f,0x5e,0x1b,0x91,0xba,0x0b,0x61,0x3f,0x5f,0x36,0x0e,0xfb,0x50,0x0d,0x3f,0xe9,0x92,0x90,0xef,0x7c,0xa1,0x4b,0xd2,0xb3,0x30,0xf4,0x05,0xa4,0xf7,0xdc,0xda,0xef,0x49,0x23,0xd3,0x11,0x1d,0x40,0xbf,0x03,0x20,0x35,0x33,0x86,0xf6,0x34,0xb4,0x0d,0xe6,0xf0,0x4d,0xe9,0x19,0x0a,0xd5,0x1c,0x08,},"\x03\xab\x5d\xae\xbc\x6e\x70\xd3\x52\x97\x79\x32\xa0\x31\x07\x87\x9b\xd5\x5d\xaf\xd0\xc6\xba\x7a\xd9\x69\x7a\x17\xb1\x27\xb3\xa7\x4a\x3e\xae\xba\xbd\x0f\x8e\xee\xbf\xc0\x48\x3d\x63\xfe\xdd\xe5\x2d\xeb\x46\xa3\x75\x24\x49\xc9\xc4\x49\x5c\x51\xa1\xc9\x1f\x57\xe3\xad\x2e\x6d\x01\xa1\x3d\x0c\x47\x0c\x52\x91\xb8\xe9\x12\x28\x83\x40\x97\x0f\xbb\x85\x78\x7b\x8b\x37\x6d\x72\x17\x52\x50\xe8\xcd\x90\xc0\x78\x88\xbf\xef\x5e\xbf\x50\x86\xc8\xff\x2a\xbc\xdd\x12\xd2\x14\xb9\xc4\x5d\x12\x08\x73\xb4\x60\x2e\x57\xa6\xaa\xb0\xb8\x28\xd1\x08\x4d\xff\xaa\x36\x51\xee\x35\x66\x26\x95\xb7\xf3\x43\x3f\x4a\xb5\x30\xc2\x9a\xc6\xcc\x5b\xb4\x3e\xcc\xd1\xb6\x89\x8b\x9e\xf7\xae\xc6\xd5\xae\xc6\x8d\x5c\x11\x14\xbb\x5d\xf7\x82\x09\x66\x59\x4c\x99\x4d\x64\x08\x91\xb8\xf2\xdc\x5d\x25\x63\x8d\xe4\x35\x49\xd8\x6d\x34\x30\x6f\xf3\xf5\x74\x57\x51\x16\x40\x5b\x9e\x8e\x28\x6e\xe0\xcd\x97\x8a\x76\x00\x2c\x44\x35\xfe\xaa\xc6\xe8\x4e\xae\x16\x54\xf3\x39\xa5\x67\xd8\xd0\x4f\xcf\xa3\xeb\x6a\x04\xb9\xad\xc6\x66\x02\x13\x00\xe9\xee\x59\x72\xb3\xdf\x5d\x4d\x0d\xd4\xbf\x79\x21\xdc\x98\xde\x82\xce\xf2\xd1\xb1\xd6\x1b\x79\x7f\xc9\x96\x8e\x11\x84\x84\xc4\x13\x42\x41\x6d\xdc\x6a\xdc\x4e\xe5\xd6\x87\xd9\x4a\x40\xce\x57\x2f\x42\xa2\x04\x86\x68\xc1\x75\xcf\x7b\x1f\x24\xc4\xef\xd0\x20\x55\x4f\xc6\xf6\x42\xe1\x4a\x57\xba\xec\x23\xe9\x5c\x25\x14\x30\x6d\x0a\x6d\x33\x64\x88\x41\x49\x7e\xac\x48\xea\xbd\x96\xd0\x47\x31\xba\xb0\x8b\xf5\xea\x9d\x43\xe0\xcf\x9a\x37\xfa\xaf\xa7\x32\x86\x9d\x68\xe7\xd5\xfe\x69\x54\xf8\xa3\x19\xef\x55\xda\x1e\x17\x8e\x43\xe8\x4a\x3b\x9a\xa3\xad\x00\xc2\x9b\x1d\x16\x11\x63\xdf\x4b\x79\xf2\x88\xe9\x39\x1d\x70\xa2\xf8\x81\x3d\x66\x62\x2e\x8a\xc3\x33\xfa\x6a\xa5\x31\x1e\xab\xec\x38\x3b\xa4\xcc\x12\x28\x15\xde\x00\x88\x77\xef\xbe\x6e\x12\xc3\x22\xc9\x75\x43\x4a\xfa\xd1\x73\xeb\xe2\x42\x03\xd9\x16\xd5\x75\x78\xbd\x2b\xca\xcc\x78\xf6\xe2\x56\x45\x13\xf8\xd1\x13\xa8\x33\xc2\xc2\x26\xeb\x97\xba\x2e\x23\x36\x1a\x5d\x02\x66\x4a\xb3\x77\xf9\x64\xc4\x30\x0b\xe2\xd7\x7b\x62\xd9\x24\x08\x23\xa0\x98\x84\xdf\x30\x7e\xff\x3b\xe5\x66\x4d\x72\xd1\x1a\xd5\x13\xe1\xbc\x56\x10\xdb\xfd\x10\x09\xdb\x39\xf0\xcb\xfe\x47\x05\x55\xec\x1b\x56\xb8\x71\x67\x07\x93\xd3\xb7\x04\xfb\x06\xee\x95\x0b\x1a\xd2\xa4\xd7\x29\x7c\xa5\x8b\xba\xd8\x10\xc3\xfa\xd4"}, +{{0x7a,0x60,0xcd,0xf1,0x87,0x04,0x60,0xde,0x8a,0xe7,0x78,0x11,0x76,0xd5,0x12,0x7e,0x71,0x20,0x7f,0xaf,0x2f,0x21,0x0b,0xd4,0xdc,0x54,0x73,0x85,0xb6,0x67,0xf2,0xf2,},{0xea,0xd6,0x7a,0x9c,0xf3,0x4d,0x0f,0xf1,0x4e,0x79,0xaf,0xa4,0x6f,0x2d,0xc9,0x96,0xe9,0xac,0x0e,0x3e,0x07,0x63,0x22,0xfb,0xb4,0x00,0x97,0x67,0xb1,0x33,0xf0,0x1b,},{0xb2,0xe0,0x81,0x42,0xbd,0xd6,0x2b,0x78,0x65,0x92,0xc0,0x91,0xf5,0xfe,0x6a,0x9b,0x7f,0x30,0xce,0x13,0x4c,0x3b,0x23,0x6f,0xbc,0x6d,0xfe,0x67,0x34,0xf8,0x82,0x70,0xac,0x58,0xf6,0xd7,0x4b,0x4f,0xd9,0x9c,0x22,0x45,0x1c,0xa4,0x65,0xa4,0x2c,0x00,0x6d,0xb2,0x5a,0xf2,0x15,0xed,0x24,0x1a,0xf1,0x18,0x96,0x27,0xc6,0x05,0x0f,0x00,},"\x9d\xc0\x23\xa5\x25\xd0\x1b\xa3\x51\x37\x98\xb7\x38\xc7\x91\x62\x92\x6e\xbc\xcc\x0a\xdf\x1e\x57\xac\x47\xc2\x0d\xea\x6c\xe1\x37\x5c\x3d\x2a\xaa\x17\x33\xb7\xf0\xc3\xbd\x94\x5c\x33\x5f\xf3\x57\x61\x12\xbb\xdc\x10\xb6\x78\x3b\xa6\x54\xe8\xc6\x10\x47\xf2\x77\x3a\xa2\x29\xbf\x84\x69\x22\xa8\x9c\x6a\x73\xd5\xf1\x05\x1e\x8d\x96\xed\x36\xd7\xd6\x74\x7e\x06\x3a\x7a\xc6\x02\xf1\x9f\xc5\x2e\x02\x1a\x4b\xbc\x28\xb0\x35\x14\xfb\xd5\x1c\x7b\x3f\xd6\x59\xf1\x2d\x54\x7d\x05\x92\xdd\x09\xf8\x73\xc9\xec\xc6\x43\x9c\x7e\x93\x1a\xd0\xe4\x85\x6b\xe3\x1c\x60\x5d\xef\x2e\xd9\xb5\xd1\x3c\x59\x42\xb2\xf3\x25\x39\x7d\xac\x6c\x97\x60\xe9\xb1\xbb\x0c\x06\xf7\x13\xcb\x92\x0c\x23\x4b\xcc\xfe\xe9\xf0\xb8\x5d\xd0\x20\xf7\x98\x8f\x3b\xe1\xcc\x66\xe9\xe5\x1b\xab\xe2\xfe\xe2\x37\xeb\x84\xec\x7e\xff\x94\x09\xaa\x91\xc1\x94\xe3\x0d\xb1\xe0\x65\x01\x59\x55\xde\x97\x46\xbb\xa0\x3f\x7e\xdf\x9a\x58\x75\x12\x40\x9a\x41\x61\xfa\x77\xea\x62\xcc\xf4\x31\x60\x2d\xcd\xcf\x36\x5e\xd6\xbf\x0a\xed\xdd\x32\xf7\xc8\x44\xe3\xa3\x4d\x26\x6e\x28\x38\x2f\x40\x62\xfd\x4d\x6f\x82\x14\x25\x21\x04\xd6\x43\xa9\xbf\xd8\x07\x17\x16\x37\x1c\xcb\xb5\x4c\x8c\xc8\xdb\x79\xad\xd6\x5b\xcb\xce\xa0\xd0\x80\xd8\x40\x28\x03\xfe\x23\x2d\xf7\x0f\x76\x57\x72\x47\xa6\x3d\x55\x83\xbb\xd5\x64\x27\x67\xbc\x63\xf3\xc5\xa7\xbb\x3a\x47\xeb\x12\x98\x4e\x45\x41\xf4\x1f\xdb\x55\x86\x9a\x08\xfa\xde\x66\xc2\x0f\x69\xa5\xa9\xde\x25\xf6\xb3\x6b\xa1\x8a\xce\x5b\x4a\xc3\x36\xbb\x2a\x8e\xbf\x63\x0a\xd0\x3e\x8b\xb8\x73\x1d\x01\xe8\x4b\x91\xd0\x24\xd1\x17\x45\x9a\x74\x89\x2e\x93\xd5\x3b\x61\xe6\xb8\x06\x8e\x4f\x04\xb4\x18\x1f\x03\x87\xb4\x56\x7c\xcd\x45\xe1\xb8\x71\x8a\x2d\x7d\x78\x78\x72\xf3\xdc\xf8\x7a\x15\x93\x5a\xd7\xda\xaa\x74\x4e\xd6\x8a\x28\x66\x6a\x51\xa1\x0d\x39\xfc\x13\x9c\xdf\xe9\xa6\x87\x30\x76\xf7\xc4\x25\x00\x9c\x38\xfa\xee\x13\x5e\x51\x32\x07\xb0\x6e\x7b\xa3\x56\x85\xf5\x07\x2d\xa3\x4b\x60\x45\xb5\x7c\xd5\xd1\xb1\xa1\xfd\xf0\x17\xb8\xaa\x8e\xbd\x27\x52\x2b\xc9\x5e\x47\x90\x87\x34\xe4\x17\x22\xa7\x67\x90\x5c\x5e\xcc\x30\xc7\x24\x81\xb6\xc1\x2b\xf4\xac\xe9\x4d\x5b\xb3\xa3\x15\x56\x91\xb7\x07\x5b\x40\xeb\xf5\x96\x8f\xdd\x90\x3d\x8f\xd3\xcc\x50\xb8\xd6\x46\x48\x59\xb1\x0f\x75\x51\x32\xc6\xd9\xb6\xda\xd1\xd6\xf1\x4c\x41\x85\xb2\x64\xd3\x49\x7a\x4e\x54\x98\x77\xfe\x94\x6e"}, +{{0x33,0x79,0xd2,0x5c,0x11,0x17,0xcf,0x80,0x2e,0xc7,0x9c,0x06,0x57,0x5d,0x18,0xe6,0xbe,0xce,0x4c,0x70,0x93,0xdd,0x43,0xfd,0xee,0x03,0x68,0x5c,0x70,0xb2,0xfa,0x9f,},{0x85,0x25,0x15,0x6f,0xe2,0x9f,0xc2,0xfb,0xf6,0x61,0xba,0x50,0x18,0x2b,0xe2,0x0c,0x89,0x98,0xd9,0x41,0x49,0x3d,0x59,0x33,0xdc,0xa4,0xd8,0xb4,0x1f,0xb4,0x42,0xd5,},{0x4c,0x36,0xbf,0xc8,0x1e,0xef,0x00,0xb9,0xcb,0x3a,0xb5,0x14,0xc6,0xd4,0x51,0xb9,0x93,0x36,0x1e,0x09,0xa4,0xbe,0x4b,0x50,0x40,0x92,0x6f,0xeb,0x0e,0x0d,0x9b,0x52,0xf0,0x3d,0xe4,0x68,0xe7,0xba,0xd8,0x3f,0x37,0x91,0x54,0xbf,0x2c,0x43,0x7a,0x71,0xf7,0x54,0xf3,0xf4,0x07,0x98,0xee,0xeb,0xd6,0x2e,0x55,0xf2,0xbe,0x77,0x14,0x03,},"\x7a\xcd\xb3\x9f\x12\x26\xbd\x3a\xbf\xfa\x50\x35\x0a\x14\x97\xd7\x61\xf8\xf0\xaa\xef\xbf\xbb\xbb\x92\x5f\xf5\x63\xe3\x89\x76\xaa\x17\x2d\x40\x7b\x61\xff\xdf\xb1\xcd\x53\x8a\x4c\xd0\x00\xb5\x78\x18\xa0\xbc\x92\xc0\xe0\xcd\x0a\x5a\xbf\xcf\x57\x83\x00\xf5\xf4\xe6\xce\xfa\x26\x72\x75\xd1\x78\x45\xda\x70\x66\xfd\x4e\x18\x01\x00\x27\x96\x0c\xd3\x95\xe6\x82\xad\x71\xaf\x34\x9b\xbd\xad\x5e\xba\xa0\xf1\x1a\x77\x61\xe1\x9e\xa1\xbe\xf6\x61\x07\x43\x16\x4b\x17\x14\x14\x53\xb4\x72\xae\x2c\x8f\x36\xce\x6b\x08\x0f\x1c\x07\x45\x35\x24\x54\xce\x5a\xea\xe1\x1c\x9d\x75\xde\x3c\x08\x00\x42\x65\xfc\x4c\xa8\x0d\x33\xb2\x6e\xae\x14\x00\xdf\xd8\x97\x7b\xf7\x23\xa6\x16\xda\xeb\x6d\x42\x19\x90\x10\xb7\x3e\x19\x3a\xb7\x2a\x58\xbd\xd2\x48\xa7\xf4\x11\x1c\xa5\x0c\x1d\xe6\x46\xbf\xea\x7b\x4d\x5b\xaf\x0f\x93\xdd\x97\x3e\xe9\x36\x49\xe2\x1e\xc0\xc6\xc4\xfc\xca\x8c\xd6\xff\x69\xdf\x76\x16\x12\x02\x1d\x85\xff\x1f\xb2\xa9\x53\x37\xda\x48\x05\xa7\x6d\x34\x7e\xe7\x1e\xf1\x9c\x0d\xff\xb5\x9f\x15\xf6\x50\x29\x3a\xbb\x97\x21\x05\x3f\x74\x06\x90\x5a\xe6\x83\xf9\x6c\x83\xa3\xa7\x44\x7b\x1a\xfb\x14\xe1\x20\x8c\x63\x9f\x37\xa9\x75\x0b\xa2\x1d\xa5\x55\x2c\xc2\x04\xea\xc4\x53\xca\x03\x62\x82\xf7\xe0\x96\x10\x93\xc3\x9e\xc1\x18\x13\x8d\xcf\x71\xcf\x2d\x28\xfb\x96\xa2\x49\x62\xb5\x2d\x33\x93\xf8\x80\x65\x3b\xcb\xa2\xc9\xb9\xd5\x7b\x77\xc5\x22\xf4\x21\xfc\xf5\xad\x75\xfb\xa9\xcf\x33\x89\xb1\x23\xaa\x97\x52\x17\x13\xff\xf8\x84\x67\xde\xb8\xc8\x99\x1d\x4b\x57\xc1\x43\x81\x70\x53\x7c\xb5\x0c\xdc\xc6\x57\xe5\x0e\x5c\x48\x0e\x12\xc0\xd4\x49\x39\xb6\x39\x99\x44\xe7\xc7\x1e\x18\x6c\x2a\xbb\x81\xfc\x57\x34\x88\x36\xd5\xe5\x7b\x72\xb2\x24\xa6\xb7\x1b\x6c\xaf\x72\x1a\xca\x73\x47\x8c\xb6\xcf\x5f\xb8\x90\x71\xae\x3a\x39\x82\x02\xdb\xb3\x8c\x30\x81\x25\x63\xbb\x9a\x23\x40\x66\x57\xa9\x56\xd3\x05\xa3\x44\x9a\x60\xcc\x86\x41\xb6\x21\x75\xa7\x17\x0c\x23\xbd\x5a\x25\xf0\xf1\x2e\x15\xa7\xed\x91\xfa\xda\x6a\x4a\x2f\x0e\x7b\x15\x5a\x3d\x64\x85\xec\x03\xce\x6e\x34\xdf\x7e\x21\x62\x40\xbb\x28\xa2\xdd\x73\x2f\xf7\x90\xd2\x28\x6e\x20\x0b\x33\xc2\x9a\x31\xa5\xe1\x9a\xd2\xcd\x02\x97\x4b\xad\xc4\xbc\x22\xde\xb7\x50\x4c\x15\x24\x1f\xc1\x06\x0c\x8a\xce\xf4\xfb\xb2\x5e\xc7\x60\x2f\xce\x36\xa2\x7b\xb8\x7b\x6e\x64\x23\xe6\xb4\xf6\xe3\x6f\xc7\x6d\x12\x5d\xe6\xbe\x7a\xef\x5a"}, +{{0xef,0x38,0xc3,0xfc,0x74,0xf0,0x54,0xae,0x43,0xe8,0xd2,0x9d,0x6b,0xa6,0xdc,0x80,0xb5,0xaf,0x84,0x82,0x70,0xd4,0xaf,0x58,0x84,0x4d,0x24,0xbc,0xf9,0x87,0x41,0x4e,},{0x0a,0xe1,0x47,0x8b,0x05,0xfb,0x32,0x99,0x65,0xea,0x0f,0xa9,0x28,0xdc,0xbe,0x81,0xa0,0xbd,0xbb,0x6f,0xf6,0x6c,0x81,0x16,0x71,0x63,0x5e,0x43,0x88,0x88,0x80,0x51,},{0x1d,0x3a,0xc6,0xb6,0xbf,0x18,0xab,0x53,0x09,0x14,0x87,0x99,0x48,0x5b,0x27,0x6d,0x20,0x40,0x1c,0x6a,0xf5,0xf9,0xb2,0xf6,0x03,0x23,0x95,0xa3,0xc2,0xf4,0xb6,0x73,0xb7,0x14,0x0c,0x07,0xcc,0x26,0xf4,0xfc,0x56,0xa5,0xee,0x00,0xb0,0x74,0x6b,0x2a,0x80,0xda,0x6f,0xda,0xd1,0x7e,0xdd,0x11,0x49,0x20,0x10,0x1d,0x2c,0x89,0xc3,0x0e,},"\xbf\x29\x0d\xb3\xdd\xa8\x76\x39\x37\xae\x4c\x83\x74\x67\x05\x32\x72\x95\xc2\xc2\x48\x06\x8f\x5a\xb8\x5c\x8b\x5d\x75\x6f\x4e\x3e\x34\x06\x2b\x55\x49\x38\x72\x61\x47\x6b\xcb\xd1\xe7\x33\x19\x90\xf1\x19\x10\xd1\x1f\x94\x60\x7c\x2b\x71\xf6\x5b\x77\x1a\xac\xab\xdc\x10\xf4\x2a\xe9\x18\xdd\x25\x94\xac\x71\x05\x1c\x85\xb3\x30\x77\x9c\x47\xaf\x00\xa5\xb9\x81\x91\xb5\x6c\xbc\xf7\xef\xe4\x1a\x27\xe8\x7c\x67\x71\x68\xc8\xab\xe9\x49\x6e\xb2\xe7\xab\xbd\x0b\x16\x04\x28\x6e\xd1\xa1\xb1\x8d\x26\x4d\x73\x3d\xe8\x7d\x0d\x3f\x80\x55\x52\x8c\x4d\x42\x6d\x7f\x8e\x6e\xd0\x24\xa7\x41\x40\xab\xd3\x54\x00\x79\x62\xa2\xa9\x7a\x5c\x2f\xf9\x76\x54\x6a\x8d\x1a\xc4\x92\x4c\x09\x22\x3d\x34\x8d\xdc\xd8\x71\x0a\x37\x99\xf9\x1b\xb8\x70\xb3\xf4\x6d\x51\xf1\xe7\xf6\x89\x2d\x6b\x08\xb9\x91\x74\x8a\x03\x7a\x86\x7e\xcc\x39\xee\x8d\x64\x62\xa7\x61\x44\x88\xed\xd3\xc2\xba\x61\x5c\xa2\xe3\x78\x54\x88\x94\x41\xb1\x3d\xc8\x35\xc3\x6b\x38\x65\x3f\x65\x98\x61\x6f\x35\x78\x3e\x2e\x15\x83\x84\xbb\x93\x1c\x90\x1b\x70\x3a\xcb\x39\x91\xfb\x7a\xa5\xba\x69\xd9\xa5\xbd\x05\x70\x24\x29\x61\xa7\x1a\x52\x47\x03\x15\xe9\x82\xe3\x41\xa6\x1c\x64\xa6\x19\xbd\x16\xfe\x81\x19\xaa\xe0\xd7\x50\x3c\xe7\xd7\xe9\x26\x14\x6b\x91\xc2\x89\x2f\x13\x16\x69\xd1\xe3\x9e\x5b\x75\xe9\xc7\x24\x52\x61\x80\x99\xa5\x7d\xc2\xee\x37\x7b\xe6\x58\x75\xee\x01\xbb\x88\xed\x52\x6f\xc3\x94\xe2\xf5\xc8\x12\x7a\x5f\x69\x12\x5e\x67\x38\x5e\xf9\x4b\x1f\x33\xad\x52\x62\x9d\x72\x0e\x31\xc0\x2a\xe0\xb5\x82\x33\x9f\xf0\xf0\xbb\x07\xff\x2b\x03\x0f\x48\xfa\x7b\x69\x27\x16\x50\x1a\xd7\x77\x3a\xd3\x15\x12\x04\xa2\xa5\x40\xfa\x94\x36\xbd\xd4\x20\x2a\x15\x73\x09\xec\x36\xce\xcb\xe5\x8b\x33\xef\xf5\x57\xfd\x33\xe0\x3f\xd3\xeb\x19\x00\x9b\xd7\xa2\xde\xa9\xef\xee\xf8\x78\x55\x67\xaa\xb2\xa4\xc9\x8b\xd1\xf2\xa8\x10\x11\xb3\x43\xa9\xf2\x0c\x44\xc5\x77\xa4\x52\xfd\x54\xba\x21\x02\x9d\x47\x06\x81\x3b\x29\x87\xc7\x6b\xb2\x42\xab\x26\x20\x84\x3c\x22\x60\xb6\x69\xad\x35\x8e\xfe\xe7\xf9\x83\x0d\xc9\xc7\xd4\x78\xa2\xde\x4a\x2c\xf8\xc4\x3d\xa7\x70\xe2\x88\xe2\xed\xbb\x6d\x73\xbc\xf2\xec\xb0\x23\xde\x6b\x2d\xcc\x6b\x16\x6e\x87\xa3\x85\xeb\x0a\xdc\x30\x56\x65\xc5\xbf\xa5\x7f\x25\x0f\xe2\x23\xad\x7f\xf4\x51\x8d\xe3\x9c\x79\xe8\x7d\xc1\x01\xa9\xfa\xa6\x82\x1a\x74\x44\x2b\xfc\xfd\xf0\xa9\xe6\x3a\x50\x9e\x2a\x2e\x76"}, +{{0x7e,0x7b,0x39,0xaf,0x69,0x38,0x0c,0xf4,0x46,0x60,0xe2,0xc1,0xff,0x30,0x83,0x34,0xe8,0x25,0x0f,0xee,0xb8,0x8b,0xe0,0xd4,0x3a,0xab,0xe5,0xe6,0x8b,0x8e,0xf1,0x71,},{0xcc,0xef,0x9d,0xae,0xd9,0x25,0x23,0x53,0x3d,0x4a,0x2d,0xab,0x6d,0x24,0x19,0xf6,0xd0,0x86,0x04,0xdb,0x64,0xce,0x37,0xe3,0x29,0x04,0xac,0x77,0xb9,0xb4,0xa0,0x1c,},{0x10,0x62,0xa2,0xdc,0x9c,0xd5,0x37,0x96,0x75,0xc0,0x4f,0x5e,0x21,0x33,0x8d,0xcf,0xb7,0x7d,0xfb,0xab,0xce,0xdd,0x62,0xb2,0x60,0x71,0x00,0xd7,0x64,0x9a,0x05,0xe8,0x08,0x71,0xe9,0x61,0x23,0x21,0x4f,0x80,0xf4,0xf7,0x3b,0x0d,0x9b,0x06,0xe2,0xd3,0x1f,0x56,0x11,0x9c,0xea,0x69,0xda,0x23,0x47,0xda,0x84,0xa2,0x75,0xb7,0xb2,0x07,},"\xd4\xa3\x97\x6d\xbf\x83\x20\x18\x56\x67\xb5\xa8\x23\x66\x40\xf2\xeb\xc9\xe4\x5e\x6d\x5f\x2a\x8d\x92\x99\x79\x27\xdd\x9b\xc5\xdb\x95\xf4\x46\x34\xbd\x65\x4e\xef\xec\xe1\x0d\x99\xd9\x2b\x46\x71\x57\x91\x64\x50\x04\xac\xcc\x6d\x14\x0f\x32\xa1\xc8\x72\xe5\x4a\xa9\xa7\x49\x3a\xf9\x45\x88\xb7\xbb\x40\x0d\x94\xd4\x58\xd4\x32\x92\x30\x7c\x5a\x1a\x38\x82\xa1\xc8\xa6\xa7\x8d\x9a\x94\x5f\x79\xd6\x4b\x32\x94\xa2\x8c\x3d\x59\xd8\x20\x22\xb0\x09\xcc\x4d\x2d\xa9\x3a\x16\xb0\x71\xc9\xab\x8e\xe9\xa3\x66\x3d\x72\xed\x34\x4f\x15\x1d\x68\xc6\x66\xa4\xb4\x96\x52\xd9\x7a\x46\xd1\x42\xa4\x74\x11\x27\xf3\xc5\x7f\x15\x51\xc4\x09\x76\xcd\x13\x81\xa8\x2a\xea\xe7\xbc\x5a\xdb\x39\x87\x20\xeb\x43\x3f\x08\x99\x48\x7e\xd2\x37\x84\x46\xb1\xa8\xdc\x6a\x33\xfc\xd4\x53\x7a\x05\xfb\x60\x3e\xc0\xa9\x0a\x27\x53\x23\x00\x24\x2b\x20\x00\x10\x86\x21\xb6\x5a\xb0\x00\xbc\x06\x38\x15\x30\xf6\x90\xd7\xe5\x6f\x81\x60\x4d\xac\xff\x19\x10\x71\x50\x40\x41\x0a\xa1\xf9\x44\xc9\x2d\xd9\xbb\xaa\x5b\xd0\x8e\xa0\x0c\x84\x42\xdf\x94\xf0\x85\xeb\x3d\xe9\x73\x35\xb6\x00\x5e\x6f\x84\xf8\x23\xd4\x34\x70\xab\x1c\x67\xda\x12\xad\x44\x99\x36\xc6\xb5\x5f\x9f\xfd\x20\x3d\xfd\x6e\x3f\x33\x30\x9e\x8a\x99\x45\xa5\x93\x20\xe6\x67\x34\xc7\x9c\x48\x14\xdb\xa5\xa1\xc1\x40\x95\xc6\x29\x25\xa1\xe1\x73\x3e\xfd\x94\x81\x7a\x25\xef\x9e\x47\x9d\xd9\xcc\xde\x6c\xa8\xad\xb7\xa8\x05\x3c\x1b\x55\x13\x46\x97\x50\x4a\xf8\x05\x3d\x59\x5b\x84\x46\x40\xb6\x1e\x93\x16\x80\x75\x46\x84\x50\xeb\x5d\xe0\x35\x86\x97\xc1\x04\xaf\xa6\xa3\x79\x6a\x50\x9c\x26\xb4\xc2\x77\xc2\x3f\xff\x42\xdf\x14\x6d\xe5\x5e\x95\xd0\xd4\xb8\x0a\x7a\xa1\x77\xd9\x92\x27\xec\xb2\xa0\x59\x4d\xee\xde\xbb\x9c\xaf\xb1\xa4\x58\xac\xa8\x07\x2c\xc7\xd7\x7c\x71\x75\xf6\x10\xca\x30\x0e\xfd\x7a\xf9\x38\x83\x46\x49\x8c\x22\x99\x15\x64\x50\x0e\x0b\x0a\xa4\xd2\x94\x6f\x18\xe6\xf5\x37\x5a\x84\x82\x86\xf3\x69\x54\xc1\xca\x22\x68\x4c\x69\x28\xc2\xa2\x5c\x7f\xe2\x1a\xba\x4a\x71\x11\xd7\xe0\x5b\xc8\xd7\x0b\x3d\xcb\x4f\x6a\xae\xc0\x64\x84\x5e\xef\x55\x25\xf8\x50\x24\xc2\x57\x0f\x3b\x78\x69\x8c\x4b\xce\xc0\xd7\x1a\xad\x53\x78\xd8\x81\x9e\x1f\xac\x44\xee\x41\x63\x70\x21\x2d\xba\xaa\xe5\x4d\x2a\xf2\x93\x9b\x82\xcb\xaa\xe7\xf4\x2f\xf4\x85\xd4\x5b\x3a\xcc\x21\x09\x0f\x5b\xa4\x1e\xc0\xda\x30\x9e\x52\xef\x28\x38\xd1\xde\x47\x1e\x0b\x7c\xf9\x85"}, +{{0xa9,0x04,0x8a,0xf0,0xc2,0x0a,0x12,0x5f,0x5d,0x39,0xc5,0x0f,0x22,0xb8,0x05,0xae,0x74,0x2c,0xf6,0x4f,0x1f,0xe8,0xdf,0xbe,0x8d,0xfd,0xaa,0x51,0x1a,0xaa,0x57,0x6f,},{0x15,0x86,0x55,0xdb,0x94,0xb1,0x5c,0xa7,0x29,0x83,0x87,0x7b,0x6d,0xb2,0x31,0xa5,0x84,0x3d,0xf5,0xdb,0xca,0x28,0x10,0xa7,0xe4,0x96,0xfb,0x59,0xab,0x71,0x04,0xca,},{0x18,0xa3,0x12,0xb2,0x0d,0x86,0xac,0x33,0x9a,0x58,0xef,0x2b,0x85,0x2d,0x46,0x7c,0x23,0xbb,0x2c,0xb1,0x22,0x7c,0xb1,0x53,0x38,0xaf,0x07,0xfd,0x04,0xb9,0xa7,0x11,0xe8,0x56,0xee,0x5b,0x2c,0x82,0xe3,0x66,0xc1,0x7f,0x86,0x17,0x13,0xd1,0x08,0x8c,0x1b,0x21,0x44,0xd1,0xc3,0x7d,0x05,0xbd,0xc0,0x0d,0x73,0x96,0x73,0x85,0x20,0x00,},"\x8e\xef\x2d\x9f\x5d\x59\x70\x99\x59\xc9\x24\xf8\x7c\x22\x78\x97\x67\x39\x3a\x15\x5d\x5c\x87\xde\x48\x8c\xef\x50\xb7\xbf\x7d\xa8\x70\xe3\xad\xc3\x00\xae\xe6\x60\x3b\x2e\xf0\x87\x64\xd9\x9d\x9e\x77\x51\xe5\xdc\xe9\x2a\xaa\x71\xaa\x18\xa6\x9c\xc8\x23\x13\x4e\x85\x52\xd9\x59\xa0\xdb\xb4\x11\x17\xe0\xa5\x93\xc3\x18\x33\xb6\xec\x21\x72\xdd\xaf\xaf\x78\x48\xdd\xd1\x8d\x28\xd0\xd4\xed\x33\x23\x7e\xc8\x04\xf6\x59\x38\xae\xd8\xe8\xa3\x28\x0d\x42\xe3\x53\xd0\x1b\xe0\x18\x7b\x13\x01\xf8\x3d\x89\x84\x90\x67\xb0\x4a\x90\x31\xf7\xe0\xf3\x3e\x34\x16\x24\x0c\x53\xd9\x26\x5e\xd0\x66\x39\x59\x97\x1f\x41\x7c\xb5\xf2\x10\xcd\xc5\xae\xbc\xb5\xe1\xdb\x7d\xfb\x82\xdf\x43\x58\x76\xa6\xe9\x8f\x41\x5b\x0d\xf8\x69\xf0\xd8\x85\x15\x35\x37\x56\x45\xee\xf7\x0f\xae\xc7\x44\xee\x0d\xc3\xac\xbc\xb0\x40\xf6\x8d\x50\x2c\x2c\x62\xc8\xdb\x45\xeb\xe5\x48\x54\xa4\xb3\x6f\x43\xfe\xb4\x9a\x6d\x1c\x2c\x2e\xa7\x99\x14\xa7\xc2\x3c\x60\xba\xaa\x67\xcb\x47\xb2\x17\x8e\x12\xdc\xe7\x6b\x00\x4c\x87\xb7\xb8\x34\x6e\xfa\xdf\x38\x0b\x9e\x1e\x41\xf6\x31\x48\xda\x51\x78\x1d\x75\xce\xc0\x40\xe4\x26\x88\x20\x21\x1f\x3c\x46\x25\x01\xd8\x08\x99\x89\x4e\x79\xd6\x18\xde\x42\x46\x1d\x78\x5a\xea\xce\x53\xae\x14\xb7\x9d\x33\x50\x1e\xd5\x62\x9b\xbd\xd0\x71\x28\x15\x6d\xb0\x72\x5f\x5b\x4b\xed\x59\x3a\x95\x29\x47\x83\x03\x84\xf6\x1d\xf0\x0e\xe0\xaa\x09\x90\x99\xc3\xcd\x97\x65\xa9\xc1\xc7\xe8\xa6\xa8\x34\x30\xb8\xd9\x86\x7c\x8e\x17\x92\x0a\xd0\xff\x64\xd8\xcd\x2f\xf5\xf1\x14\x38\x8c\xe6\xd4\x3e\xec\x17\x15\xd0\x35\xf0\x22\xfa\x97\x96\x9e\x1a\x5d\xd9\xf5\x8d\x89\x6b\x17\xc1\x22\x1c\x9e\x6c\x85\x55\x59\x72\x35\xee\xda\x6e\xc4\x1b\x0c\x11\x76\x12\xb0\x0c\x5f\x0e\xd1\x81\x6b\x05\x73\x63\x58\x27\x07\xa8\xaa\x0d\x98\xd4\xd4\xbe\x5e\x8f\xa3\x2d\x6c\x9d\x27\x82\x21\xef\x30\x67\xb8\xba\x15\x16\xd9\xe0\x51\xd2\xf6\x8b\x7d\x1b\x15\x1f\x74\xa3\x53\x4e\x78\x12\xc0\x51\xe5\xf2\xb6\x3b\x30\x35\xf8\xe5\x70\x3b\x5f\x68\xfd\x2d\x65\xbb\x75\x65\xe8\xaa\x67\xbf\xd2\xa1\x2c\xaf\x0b\xc5\x48\x11\x97\xa9\xff\x89\xd7\x7d\xf7\xa0\xe9\x65\x5e\xf0\x29\xb4\x3d\xd9\x06\xd0\xb8\x88\xe3\x13\xae\x9d\x1c\x7e\x93\x68\xa0\x13\x52\xd0\x0c\x66\x80\xdd\x0f\x1f\x57\x4a\x58\x77\x34\x8a\x7e\xa2\xc0\xb9\xe8\xe2\x72\x75\x10\xbf\x0c\x9e\xf7\x44\xf3\x69\xeb\x3c\x6c\x4f\xc1\x6a\xde\xb6\xe1\x94\x5b\xe8\x28\x7d\x0f\x30"}, +{{0xf8,0xc9,0x18,0x3f,0x23,0x10,0x5f,0xad,0x0c,0x6e,0x51,0x03,0x35,0x8b,0x58,0x32,0x88,0xf9,0xff,0x6c,0x7d,0xfc,0x91,0x10,0x6d,0x07,0x98,0x7f,0xf6,0x9c,0xe1,0xeb,},{0x4c,0x79,0x62,0x8c,0x95,0x8c,0xde,0x0c,0xc3,0xcf,0x68,0x60,0x95,0xb8,0xa2,0xf4,0x4b,0x71,0x93,0xc6,0x16,0xf5,0x1b,0x21,0xb6,0x70,0xb0,0x38,0xce,0x6f,0x67,0xff,},{0xc6,0xa8,0xbc,0x7a,0x0d,0x5c,0x61,0x85,0xb6,0xec,0xd6,0x03,0x3e,0x42,0x32,0x1d,0x5c,0x87,0x1b,0xf8,0x89,0xbe,0x72,0xbd,0x54,0xcc,0x00,0x83,0xed,0x60,0xa4,0x70,0xb2,0xcc,0x0f,0xb4,0x68,0x2c,0x89,0x4c,0x75,0xb0,0xdf,0x95,0xf1,0xec,0xfb,0xba,0x2d,0x5a,0xce,0xf3,0xe1,0xaa,0xfe,0x54,0xb9,0xf7,0xe8,0x03,0xa1,0xd0,0x15,0x0a,},"\xb1\xd6\x05\x95\x32\x3f\xf3\xc8\x44\x87\x41\x90\xe1\x83\x6e\x41\x01\x40\x9c\xbc\xea\xe2\x8d\x5d\xa8\x1f\xad\x29\x8f\xe4\x7f\x6b\xdf\x44\x74\x5b\x7c\xd0\xd3\x71\x31\xc3\xec\x36\x5b\x92\xf5\xa1\xa6\x9c\x09\xfe\x2d\x9e\x81\xda\x10\xcf\x19\xd8\x5f\xf5\xff\x26\xf9\xe7\xdb\x9f\x07\x93\xb2\x5a\xb2\x6e\x6a\x74\xf4\x4e\xb8\xc4\xf0\x78\xeb\x7a\xd1\x8e\x65\xa1\x62\x10\xd5\xc8\x44\xd3\xce\xf7\x5f\x1d\xaf\x44\xee\xe5\x58\xf9\x0e\x52\x4a\x03\x2b\x6c\xae\x6c\x8d\x23\x36\x7c\x28\xce\x1c\x75\xfc\x25\xac\x87\x43\x39\x77\xd5\x97\x53\x3c\x92\xae\x65\xf2\x91\x3a\x18\x90\x7a\xc7\xd9\x54\x3d\xf2\x41\x27\x74\x39\x43\xfe\xfd\x9c\xf8\x3e\xd8\x33\xf6\x3e\xc8\x36\x72\x33\xd8\x97\xbf\xa1\x2d\x46\x6d\x2c\x4a\x9a\xd7\x0d\x5a\x67\x2f\xc1\x07\x75\xea\x2d\x20\x4e\x63\x6d\xe7\x01\x07\x88\xda\x27\x1d\xf0\x38\x81\xa2\x5c\x8d\xfa\x5a\xf7\x3e\xe5\x59\xf8\x1b\x52\x9b\x35\xaa\x12\x7f\xdc\x0e\xe8\xfd\x36\x9c\x7a\x04\x36\x62\x39\x86\xaa\x64\x07\xfa\x67\xa1\x42\x0c\x46\xf3\x21\x1a\xb8\x4f\x84\x46\x6d\xd5\x8b\xb7\x95\x08\xa1\xfe\xb0\xa5\xa5\xdc\x3b\xb0\xc1\xb2\x48\x09\x82\x62\xa0\x64\xf3\x7b\xb2\xf0\x19\xe2\x90\xc6\x0a\xfa\xa1\x20\x66\x51\xa2\x69\x7c\xaa\xcc\x3e\xcc\x02\xec\xfc\x07\x7f\x27\x2e\x8f\x75\xce\xa7\x1c\x3b\xc3\x35\x6d\x2b\x58\x07\x27\x6f\x19\x55\x00\x1c\xfe\x10\xa6\x17\x16\xb4\x08\x2b\xd6\xf8\x4c\xae\x4b\xb0\xd9\xa4\xb7\x5a\x4b\x57\x62\xf8\x10\x79\xf1\x9d\x7d\x19\xea\xff\x86\x31\xc9\x24\x88\x5b\xd3\xa6\x4e\x12\x9f\x4c\xf6\xb7\x9c\x7a\x98\x29\x66\x55\x11\xe9\xd8\x5c\x74\x5e\xb2\x2c\x1b\x7c\xb2\xa1\x7a\x49\xb6\x28\x5c\xce\x37\xb3\xde\x41\x59\x40\x32\x83\x23\xef\xe2\x4a\x1a\x07\xee\x87\x46\x8f\x65\x10\xe4\x2d\xd2\x06\xfe\x7f\x09\xe3\xd4\x33\xfb\x52\x15\x6a\xe3\x48\x38\x31\x15\x64\x88\x63\xe4\x5b\xf6\xa3\x71\xb1\x7e\x70\xe1\x9f\x96\x27\xd7\xf0\xa5\x8b\x95\xc6\xa4\x78\x8d\x5f\xd7\x86\x2f\x16\x12\xc0\x34\x73\x25\xb7\x97\x65\x1b\xe3\x0c\x3e\x1e\x60\xea\x4a\xe6\x0b\x57\x45\xa3\x8b\x6a\x9d\x4e\xb4\x93\x5d\x6f\x3c\xb8\xd7\x1a\xd3\xf3\x9a\xdd\xa5\xe4\x2e\x22\x19\xde\x0d\x38\x19\x09\xc9\xcd\x31\x7d\xd4\x37\x94\x21\xa2\xa8\x42\x68\xa7\xea\x71\x80\xa6\x4c\x12\x9b\xe1\xe5\xe8\xfc\xbb\xf5\xed\x65\x9e\x9f\x7e\x76\x3c\xe8\x4f\x63\x0d\x54\x07\x95\x4f\x9f\x75\x57\x50\xa6\xdb\xf9\xf7\x66\x07\x17\xde\x8e\x2a\xdc\x1e\x9a\xc9\xee\x31\x65\x4d\x18\x37\xce\xe3\x97\x95"}, +{{0x16,0x08,0x9a,0x1b,0x93,0x2f,0x8d,0x14,0x99,0x56,0x88,0xb4,0x8d,0xd8,0x41,0xed,0xae,0x3d,0xa5,0xcf,0xd2,0xcb,0x16,0x55,0x53,0x06,0xf3,0xfe,0x8b,0xd3,0xed,0xb9,},{0x9e,0xcd,0x9f,0xdd,0x7e,0x0b,0x92,0x3d,0xef,0xf5,0xd8,0x87,0xb2,0x42,0x58,0x5d,0x9d,0x41,0xcd,0x2c,0x7c,0x10,0xf9,0xc3,0x45,0xb3,0x9f,0x63,0x3f,0x4a,0xb9,0x03,},{0x78,0x78,0xab,0x74,0x1e,0xba,0xe2,0x74,0x7c,0x78,0x97,0xcb,0xb1,0xd1,0x05,0x48,0x2f,0x37,0xbe,0x2f,0x5f,0x91,0x79,0x52,0x32,0xcd,0xfb,0xcc,0xc5,0x26,0x60,0x89,0x18,0xe2,0x75,0x6d,0xdb,0x75,0x36,0xb3,0x68,0x0c,0x16,0x2c,0xf8,0xa1,0xef,0x38,0xa3,0x41,0xb9,0x36,0x2b,0xfe,0x5d,0x46,0x8b,0x4b,0xce,0x21,0xdf,0x23,0x4f,0x0f,},"\x58\x50\x02\x32\x38\x8d\x9a\xa4\xb5\xfa\xf8\x5b\x02\x33\x24\x7e\x71\x7f\xd1\x68\x40\xde\x9b\xfd\x0e\xf8\x6e\x01\xe6\x13\x02\x77\x55\x13\xe2\x24\x12\x5e\x0d\x20\x42\x0e\xa9\x49\xf6\xc2\x64\x25\xf7\x00\x77\x91\x1f\x97\x11\x31\x0c\xd6\xfd\x8b\xff\x27\xcd\xea\x11\x48\x0c\x73\xe8\xf8\xb3\xc3\x76\x41\xe7\xe8\xdd\x86\x07\xc1\x64\x02\x18\xfe\xc8\x0a\x02\x09\x28\xb9\x3d\x4d\x55\x7e\xbe\x82\xec\x0b\xb1\x75\x38\x86\x7d\x2c\xb1\x4d\x44\xd3\xea\x72\x7f\xdd\x52\x82\x0b\x0d\xa9\x44\xde\x21\xcd\x5d\xa3\x03\xd7\x76\xfe\x99\xcb\xc2\x64\x83\x65\xe6\xa0\xa9\x8d\x4d\xb1\x50\x84\x26\x61\x76\x8b\xe8\x4c\x68\x50\x7a\x5c\x45\xd2\x07\x84\x0b\x03\x35\x37\x78\x6c\xb2\x1d\xad\xad\x5f\xba\xb9\xc5\xcf\xc1\xe3\x54\x7d\xe5\x50\xd3\x13\x63\x1d\xd4\xfb\xb7\xca\x8f\x71\x93\x86\x27\x60\x8d\x2e\xbf\x65\x5d\xb4\x32\x5a\xbf\x3e\xd5\x04\xdc\x18\x30\x58\xf9\xde\x1e\x44\x93\x12\xd9\x04\xc8\x46\xa1\x84\xa0\x28\xf3\x64\xc0\x28\xb2\x7e\xb4\x94\x64\x27\xe3\x1c\x21\xe1\x05\x1d\xf3\x64\xd4\x99\xf4\x77\xbf\x51\xe7\xa8\x89\x31\x83\xe5\xec\xf7\x7d\x51\x3a\x1a\x76\xb1\xa6\xfd\xfb\x16\xbe\x90\xd7\x4b\xe4\xc4\x34\x5a\x4f\x9f\x87\xee\x44\x1a\x10\x22\xd6\x7e\xe8\x44\x78\x9f\x21\xb0\xc3\x1a\xdc\xc0\xd9\x56\x63\xcd\xfb\x40\xa8\x95\xb9\x22\xdc\xe8\x06\x9b\x93\x2c\x80\x2f\xd3\xab\x1e\xf0\xce\x6b\xff\xdc\xc5\x65\x3b\x1c\xd5\x25\x7e\x19\xa0\x95\x16\x87\xe5\x45\xfa\xf4\xaa\x66\x06\x5a\x55\xc4\xb4\x19\x1e\x34\xe8\x04\x7d\x6a\x4a\xb5\x2d\x1b\x06\xc3\x69\xa4\x26\xca\x2d\x16\xb5\x1a\x02\x71\xf2\x7f\x8d\x74\x4c\x71\x1f\xce\x3a\xad\x9d\x4a\xc0\x38\xee\x70\x0e\x4e\x97\x1b\x21\xca\x48\x9f\xf2\xb8\xc7\x78\xa3\x72\x1a\xdf\x47\xc1\xae\x5a\x41\xb9\xa2\x7f\xa7\x42\xfd\x0f\x18\x16\x4e\xf3\xc2\x6b\x8a\xe7\xd1\xfa\x29\xb7\xc0\xcc\x46\x83\xbe\x65\x02\x5c\x96\x53\x7a\x12\xd5\xfc\xeb\xbd\x05\xe9\x30\xc3\x69\x3e\xbb\xba\x0a\x78\xad\xf5\x9d\x8a\x3b\x59\x8a\x34\x8e\xaa\x9f\x47\xca\xf5\x31\xfe\x44\x96\x52\xdb\x5b\x20\xd6\x89\x94\xe3\x5a\xfe\xc2\xc2\x57\x09\x05\x5a\x1d\xe2\x60\x82\xe3\x91\x2d\x49\x7c\x64\x77\x20\xa3\xf8\x73\x62\x14\x56\xe6\xa5\xb9\xeb\x61\x3a\xcb\x43\xb6\x6d\x47\xd0\xb9\x54\xc6\x9e\x8f\xbf\x2c\x5e\x63\x4c\x48\x6e\x57\x24\x93\x0e\x0b\x56\xa5\x16\x94\x0c\x8c\xb0\xe7\x75\x27\x4d\xef\xf9\x7c\xbb\x77\x59\xce\x90\xa2\xb9\x3e\x9e\xfa\xa6\x24\xe6\xb3\x8a\x39\x84\x9d\xca\x1d\xf6\x12\x73\x6f"}, +{{0x94,0xd5,0x09,0x15,0x14,0x4c,0x7e,0x7d,0xd0,0xf8,0x5f,0xef,0x87,0xed,0xdc,0x22,0x06,0xc1,0x56,0x9e,0xd1,0x43,0x1c,0x8c,0x5a,0x15,0x3e,0x32,0xe1,0xcb,0x2f,0xb7,},{0x3b,0xb0,0x98,0xcf,0x16,0x0f,0x3a,0xec,0x31,0x70,0xb5,0x7d,0x6a,0xdd,0x4f,0x56,0x73,0x92,0x70,0xe4,0xb3,0xa8,0xef,0x79,0x66,0xec,0x30,0x61,0x9b,0x29,0x91,0x02,},{0x59,0xa1,0xce,0x55,0xf5,0xa6,0xba,0xdc,0x1b,0x93,0x91,0x26,0x36,0x20,0x54,0x2c,0xfc,0xae,0x87,0xa0,0xf2,0xb9,0x50,0x22,0x50,0xcf,0xe4,0xbd,0xcb,0xf7,0x6c,0x46,0x19,0x77,0xc3,0x34,0xa4,0x8d,0x91,0x6e,0xde,0xbd,0x56,0xc2,0x1c,0xe2,0x17,0xc3,0x5a,0x64,0x44,0xcf,0xbf,0xd3,0xb1,0x1a,0x3d,0x48,0xfa,0x2e,0xdb,0x6e,0xb4,0x0f,},"\x4d\x91\x5f\x27\x33\x2d\xd7\x50\x51\x71\x9a\x24\xae\x8d\x0e\x9c\x30\xda\x79\x09\x99\xe2\x2d\x9b\x58\x7e\xf2\x03\x21\xbe\xe4\xc0\x7d\x0a\x12\x49\x4f\xfe\x59\x9f\x47\xf9\x69\x25\xf5\xd9\x25\x17\xfc\x3e\x5f\x04\x1d\x0c\x70\x9f\x2a\x97\x83\x12\x5e\xec\xa6\x65\x29\x97\x20\x1c\x42\x9a\xa6\xf1\xce\x2f\x07\xa0\xd4\xa0\xa1\x8c\xf2\x0b\x3e\x9a\x4f\x76\x63\xea\x52\x62\xca\xd8\xf9\x49\x41\x1b\x05\xff\x5c\x5e\xdd\x7b\x30\xb2\x17\xd7\x5d\x8c\x86\xc9\x4e\x5f\x92\xc1\x67\x34\x37\x4e\x8c\xea\xd6\x1b\x0b\x27\xbb\x4b\xf5\xf4\x3a\x31\x3c\x1d\xd5\xb8\x3e\x0e\xa9\x33\xb6\xca\xdf\xed\xd7\xa6\x4a\xa5\xdd\x5b\x5d\x02\xc6\x95\xea\x20\xe0\x91\xfd\xaa\x72\xef\x4e\x7c\xa4\x0f\x38\x39\x5b\xe8\xbf\x7a\x25\x5c\x6d\x06\xa6\x32\xd7\xd7\x85\xd9\xe0\x47\xf2\x32\xaa\x50\xfa\x14\x52\x9f\x98\x6f\x9e\xf9\xd7\xb5\x80\xa0\x39\x65\xb0\x15\x47\x88\x82\x2a\x22\x5b\xb5\xab\x34\x38\xb8\x9a\x5c\x28\x74\x4a\xb0\xbc\x0b\x20\x14\xe5\x79\x6a\xcb\x49\x35\xa8\x1b\x02\xa0\x46\x32\xac\xb8\x8c\xaa\x7e\x39\xe0\x69\xc7\xc8\xe1\x75\x82\x91\x09\x4a\x53\xe3\x62\xfc\xed\xaa\xa5\x83\xec\xa7\x66\xef\xeb\xf6\x9b\x38\xe8\xcd\xe9\xce\x58\xe0\x12\xc6\x0e\xc8\x8e\x8c\x42\xbe\xad\xfa\x83\x8c\xfe\x44\x0f\xa0\xc0\x1d\x65\x9c\x96\x34\x57\x6d\x7d\x7a\x2d\x3a\x04\x4f\x99\xc6\xe4\x26\x3d\x4c\x0b\x37\x4a\x38\x8a\x2a\xcf\x38\xef\xf2\x9c\x77\x7e\x9d\xaa\x60\xd5\x98\x03\x5a\x7d\x9e\xdf\x67\xa5\x02\xc3\xf5\x73\x20\x7b\x11\x9c\xac\xac\x3f\xa7\x1e\x2a\x02\x07\xc6\x01\xcc\x0d\xd6\x37\xef\x56\x2b\xac\xc3\x5c\x57\x04\x27\x38\xf1\xf5\x58\x15\xa5\x26\x80\x82\xcd\x6a\x50\x82\x92\xfa\x29\xe3\x4e\x96\x45\xd8\x7a\x1a\x2b\x6e\x58\xad\xb7\xf4\xa5\x7f\xbb\x53\xe9\x21\x3e\xf3\xdc\x87\x3f\x29\x39\x62\x58\xa1\xea\x54\x6f\xb5\x95\x2c\xe3\x43\xce\xe9\xbb\xb9\x0c\x1c\xda\x72\xc6\x5a\x7c\x8e\x40\x31\x2b\x32\x8e\x23\x19\x20\xc2\x33\x07\x7d\xca\x34\xd0\x4f\x9d\x89\xda\xa9\xa2\xf4\x34\x59\x16\x5f\xd1\x02\xff\x56\x43\xc7\x17\x52\x30\xb3\x9e\xc7\xc3\xc4\x75\x65\x0e\xf1\x31\x60\x9d\x32\x20\xf5\xa2\x94\xa4\x03\xb1\xe1\xc4\x2c\xfa\x16\x2c\xd4\x26\xf0\xae\x43\xfd\x6b\x7a\xb5\x47\xa6\x2b\x7d\x5f\x84\x74\x03\xc4\xe5\x98\x79\x53\x87\x71\x58\xcf\xde\xe2\x3c\x04\xf7\x51\xc7\xc8\x6d\x07\x8e\x82\x4c\xa6\x3b\x5e\x65\x54\x3e\x97\x8b\x6b\x0c\xc6\x89\xef\x66\x44\x12\xb0\x1b\x8f\xf1\x65\xe7\xdb\xde\x3c\x09\x9b\xf4\xf3\x4e\xbd\xdc\xb4\xc4"}, +{{0x0d,0x81,0x92,0x6f,0x51,0x3d,0xb4,0xb2,0x5d,0xfa,0x1e,0x52,0xb5,0xdc,0xa6,0x78,0xf8,0x28,0xa6,0x1c,0x7c,0x91,0x3c,0x82,0x82,0x47,0xc2,0xeb,0x04,0x22,0xb7,0xd1,},{0x0f,0x32,0x41,0x1e,0xf9,0x1d,0x4e,0x4b,0x69,0x41,0xdf,0xca,0xab,0x14,0x2e,0xf3,0xbe,0xc1,0x60,0x98,0x39,0x93,0xa5,0x26,0x2c,0xcf,0x27,0xfa,0xdd,0x2a,0xf8,0x90,},{0xe0,0xcb,0x6c,0x71,0xeb,0xf8,0xd7,0x05,0xe5,0x0c,0xad,0x9f,0x0b,0x8c,0xba,0x3e,0xcf,0x4b,0x9e,0x37,0x93,0x40,0x00,0x92,0xaa,0x5b,0x12,0x1e,0x7d,0xbb,0xc8,0xbe,0xa7,0x1d,0xf2,0x95,0x28,0xca,0x9b,0x47,0xab,0xf8,0x7c,0x19,0x8a,0x8d,0xc4,0xe1,0x4d,0x51,0x80,0xce,0x93,0x2d,0xd2,0x11,0x4a,0x3c,0xda,0xa5,0x55,0x2c,0xc2,0x05,},"\xa9\x38\x37\x52\x2f\x7e\xc2\xe9\x3a\x2e\x4b\x4c\x8b\x46\xde\x92\x6a\x81\xad\xa2\xd2\x48\xbc\xd3\x3b\x39\xb6\xc9\x5f\xb6\x2a\x61\xdb\xbe\xda\x1a\xa8\x5a\x21\xd9\xb9\x6a\x08\x51\x0d\x8d\x3a\x65\x8c\xf3\x20\xa1\x09\x28\x69\x59\x99\xd2\xc0\xd6\x05\xc7\xf9\x5a\x12\xf5\x6a\x87\x18\x50\x7d\xb0\xf4\x97\xe3\xea\xd6\x13\x13\x2a\xb0\x92\xcb\xf1\x9d\x22\x60\x35\x86\x30\x35\x8d\x9b\x26\xe6\x8d\x50\xdd\xae\x37\xc8\xaf\x0b\xb7\xd2\x74\x1f\xd2\x92\x9c\x21\x27\x9a\x78\xd1\x0e\x2c\x5f\x3c\x5b\xf4\xa4\x2a\x36\x17\x03\x6d\x54\x74\x36\x47\x76\x5a\xfd\x8c\xd9\x10\xf8\x1b\x38\xce\xd7\x23\x90\x63\x0e\xe6\x89\x44\xa3\x7d\x29\xc2\xfe\xca\xda\x1c\xc5\x9e\xc5\x44\x07\x5b\xdb\xc1\x4c\x63\xc6\x23\x4b\x88\x40\x49\x00\x0c\x27\xc7\x34\x06\x03\x56\x04\xfc\xa8\x76\x0b\x49\xa5\xe2\x10\x9e\xf9\x12\x85\xad\xc4\xec\x48\xc8\x19\xd6\x2d\x94\x8f\xac\xa9\x0f\x62\xcf\xae\xf0\xb0\x7d\x6f\xe5\x76\xd7\x62\xbf\xd0\xee\xf9\x4c\xf6\xb5\x33\x2c\x4d\x42\x25\x11\x60\x7f\x2f\xac\xc7\xac\x04\x6a\x59\xb9\x61\x7e\x83\x83\xd1\x02\x9c\xc9\x1a\xc5\x92\xb5\x20\x84\x41\x30\x32\xbe\x84\x1b\xaa\x9b\xf9\x62\x51\xa6\xbd\xa6\x71\xd4\xcd\x4b\x12\x5d\xa6\x58\xa4\xe5\xa5\x0f\x44\x28\xee\xbf\x26\x14\xfb\x0c\xe5\xfe\xbe\x80\xf7\x21\xa5\xf4\xc0\x32\x55\x06\xd2\x7a\x8d\x31\xe3\x3d\x86\x25\x38\x70\xdd\x63\xc0\x8e\xdc\x73\x02\xb2\x80\xe9\xb9\xbd\xc2\x8b\xee\xf0\x5c\x7d\xcb\x30\xd4\xc1\x62\xe9\xbe\x83\x2e\x1c\x78\x5e\x37\x55\x12\x18\x42\x1e\xec\x85\x2c\x42\x98\x21\x3b\x2f\x27\xf8\xf8\xc7\x06\xd3\x91\xb9\xc6\x9a\x56\xdb\x7c\xe5\xd8\x15\x48\xfc\xa5\xfe\xd4\x56\xf2\xd8\xaf\xd0\xb7\x5f\x79\xf8\x58\x68\x31\x6f\x4a\x09\x21\xf0\xc6\x63\x99\x26\x51\x6b\x3c\x3e\x52\xa9\xcb\x22\x55\x45\x46\xef\x70\xe1\x4c\x77\xec\xbd\xcd\x5c\x0d\x59\xa8\x17\x69\xb3\x0d\x5d\x13\x1f\x2f\xb4\x49\xc9\x96\xb8\xde\x8a\xc7\xf8\x08\x4f\x84\x99\xe1\xa5\x6f\x7c\xd2\x9d\xb6\xaa\xef\xcc\xae\x8a\x60\xe7\x56\x16\xa1\xf7\x02\xc3\xbc\x8d\xea\xa1\x00\x4a\x8d\xae\x03\x92\xa5\x9c\xee\x54\x81\x0c\x6e\x94\x0e\xee\x25\xfb\x2e\x5d\x57\x32\x67\x04\x4b\x89\x3f\xfd\xe3\x78\xfe\x75\xac\x26\x13\x37\x3d\x84\xa0\xca\x81\x87\xaf\x4a\x33\x58\xe5\x0a\x99\x4e\xd0\x33\x67\xde\x64\x5e\x10\x39\x0f\xea\x4c\x33\xbb\x1a\x6c\x0c\x39\x85\x8b\x8d\xb4\xa6\x9f\xe8\x94\xa4\x22\x3d\x45\xaf\x69\xb3\x6c\x61\x17\xc4\xdc\x25\xde\x49\xa6\x30\x17\x00\x2b\xa9\xae\x55\x1e\xf9"}, +{{0x6c,0x8c,0x53,0xb5,0x6b,0xbc,0xb4,0xc0,0xa2,0x5d,0xc4,0x0c,0x18,0x24,0x0b,0x6a,0x5c,0x75,0x76,0xb8,0x9d,0xde,0x45,0xef,0x13,0xfb,0x15,0x8e,0xa1,0x7f,0x8e,0xd9,},{0x23,0x8e,0x51,0xd6,0xa4,0x4f,0xa7,0xac,0x64,0x26,0x88,0x01,0x26,0x1e,0xa3,0x5b,0x62,0x63,0x8a,0x00,0x6c,0xc4,0x52,0xbd,0xdb,0x9f,0x16,0xfc,0x58,0x03,0x06,0x0c,},{0x4b,0xf1,0xe7,0xd4,0x9c,0xd4,0xd5,0xc3,0xc1,0xfd,0x4a,0x4b,0xc4,0x8f,0xf6,0xb6,0xe5,0x2f,0xd9,0x51,0x0a,0x41,0x18,0x12,0x29,0x69,0x96,0xe4,0xfe,0xc5,0x6b,0xe4,0x45,0x14,0xc5,0x67,0xd1,0xd3,0x34,0x77,0xbd,0x5d,0xc0,0x83,0xc3,0x95,0x8b,0xd9,0x5b,0xfe,0x59,0x9c,0x15,0x3f,0x21,0xae,0x26,0x25,0x29,0x67,0xb7,0x32,0x60,0x03,},"\xb6\x0d\xf2\x94\x4b\xa0\x15\x75\x98\x02\xd3\xc5\x87\xbc\xfe\xbe\x52\x1a\x7e\x77\xb9\x98\x5b\x76\x1c\x96\x76\x45\x4d\x24\xa6\x64\xaf\x0b\x0d\x44\x22\x5a\x55\x75\x12\xe1\xc1\xcd\x7d\xd8\x33\x5c\x8f\x6a\xdf\x92\x8e\x18\xf8\x9f\xd5\xee\xdf\x6f\x41\x1d\xcd\xaf\x99\x69\x12\xe8\xc3\xe2\x3d\x1c\xb9\x5e\xca\x4b\x9e\x24\xe7\x53\x9c\x3b\x98\xbf\x3d\x07\xec\x25\x13\x92\x09\x6c\x19\xac\x53\x74\xdc\xba\x52\x61\x32\xb6\xd9\xbb\x8f\x6c\x85\x9c\xe9\x85\xd5\x84\xc7\xbb\xa5\xb0\x2a\x81\x03\x4b\x6d\x8b\x52\x1b\xd2\x80\xe5\x0d\x77\xda\xa2\xb2\x41\x3e\xd6\x79\x83\x4f\x81\x61\xd5\xd0\x57\x3b\xdd\x47\x6a\xc3\xcd\x0a\x3a\x7d\x8d\xb4\x53\x34\xe8\x9c\x00\xab\x66\xbc\x36\x8a\x07\xb4\x23\xe2\x46\x43\x46\x36\x27\x2a\xa4\xe4\x63\x7a\x53\x06\xb2\xc3\x39\x79\x92\x78\x1f\x30\x23\x8d\xe7\x9e\xc1\x04\xac\xc7\x20\x0d\xef\xad\x96\x08\x83\xd3\x91\x44\x3e\x70\xef\xbd\x22\xf1\xcf\xce\xec\x51\x12\xfe\x9e\x8e\x13\xbb\x94\x1c\x08\x34\x68\xdd\x71\xff\xca\x97\x6c\xd5\x1c\xe1\x61\x79\x31\x10\xef\x00\xaf\xf5\xee\x2c\xcb\x77\x06\xa5\x12\xb8\x5b\xeb\x94\xac\x49\xd1\x9a\xfb\x63\x33\x65\x5c\xf3\xae\xa5\x35\xa6\xf9\xc7\x5e\x03\x48\x41\xe7\x63\xc5\xa2\x49\xb4\x70\x4e\x1b\xe7\x8b\x0e\xca\xc6\x80\x2c\x34\x3c\x1b\x7e\x7b\x57\x70\xde\x4c\x93\xa3\xa7\x9c\x46\xe6\x83\x5d\xa8\xae\x5d\xb3\x83\x8e\x17\x96\xb5\x64\xa4\x80\xa4\xf2\x90\xb6\x0a\x1c\x63\xa7\x25\xff\x3f\xef\x43\x4d\x2a\x0b\x3d\x89\x31\x97\x87\x42\xb5\x25\xc8\x3b\xae\x67\x94\xae\x64\x19\x37\x94\xb3\x70\xc2\x89\xba\x35\xed\x79\xd3\x70\x72\xa8\xdc\xfc\xad\xb4\x6d\x5f\xfa\xee\xba\x1b\xfd\x4f\x87\xd7\x66\xb5\x04\xe6\x2b\x4a\xcd\xd7\x74\x46\xe7\x9b\xa9\x94\xd6\xdb\xf4\x76\x5e\xbd\x74\xb0\x36\x51\x00\xda\x56\x16\x2c\x36\xfe\x5a\x95\x07\x7f\x6b\x42\x65\xe8\x17\x96\xb4\xa5\x74\x43\x78\x29\x70\xb9\x6c\xb4\x56\x9b\xa9\x85\xc5\x5f\xe3\xa7\x18\x38\x0b\xca\x39\xf1\x66\x24\xf8\xe4\x7c\xc6\x3c\x1b\x6f\xa1\xbd\xe1\xae\xba\x9c\x51\xf9\x4b\x70\x2b\x13\x10\x8c\xc1\x48\x1d\x42\xe6\xfa\x98\x1e\x3e\xbf\xe0\x64\xd2\xdc\xa7\x42\x0c\x74\x59\x57\x92\x31\x2a\xe3\xfb\x91\x01\xd4\xb6\x6d\x99\x16\xdf\xd6\xc1\x3a\xe8\x83\xe6\x61\xc6\x28\x22\x8b\xe9\x79\x4c\xf6\x03\x45\x07\x6d\xb2\x61\x84\xb6\x17\xe2\x72\x29\x8c\xd4\x18\x3f\x27\xbd\x52\xd4\x05\x10\xbb\x01\x5d\x20\x97\xd4\xcc\x76\xe7\x6c\x0a\x62\xbb\xfd\xaf\x53\xc7\x26\x87\x75\xbb\xfb\xdb\x88\x70\xeb\x9b\xab"}, +{{0x69,0xb3,0x20,0xfb,0xd4,0x77,0x40,0x30,0xa2,0x97,0x67,0xa0,0xcc,0x15,0x50,0xd1,0x0b,0x74,0x9b,0x44,0xd6,0x19,0xd4,0x1d,0xce,0x11,0x46,0xf7,0xac,0x80,0xa7,0x55,},{0xdc,0x50,0x8a,0x79,0xc6,0xb8,0xab,0x86,0x6c,0xd1,0x17,0xa5,0xa8,0x4d,0xd9,0xd9,0x31,0xfd,0xa4,0x50,0xbe,0xc2,0x93,0x35,0x34,0x4d,0x0d,0x21,0x92,0x16,0xd6,0x5e,},{0x69,0x7d,0x4d,0x89,0x7e,0x0e,0x2c,0xc0,0x2b,0xc1,0xc2,0xdd,0xa5,0x7f,0x0d,0xda,0x62,0x0b,0x37,0xe8,0x61,0x82,0x2b,0xb7,0xf1,0xa7,0x01,0x93,0x5e,0x95,0x9e,0xa0,0xd8,0x45,0x3f,0x74,0x6f,0xb9,0x2c,0x08,0x7e,0xd6,0x5d,0x98,0x0e,0xea,0x1d,0x6f,0xdb,0xf2,0x3e,0x99,0xb2,0x89,0xaa,0xe0,0xdc,0xbb,0x12,0x8e,0xf8,0x36,0x64,0x0a,},"\x21\x7e\x33\xf8\x86\x22\xc9\x6f\x8d\x09\x2c\x9e\x26\x66\x4f\xe9\xef\xc0\xd8\xd2\xeb\x59\xa0\x36\xfa\x46\x4c\xee\x65\xce\x44\x89\xca\xf9\x03\xdc\xe1\x7a\xfa\xfb\xc4\xf1\x8d\xc9\xbb\xfd\x6c\x1a\x4b\xe7\xb8\x34\x85\xa6\xca\x94\x7d\xef\xb1\xd3\x51\x25\xd0\x77\x39\x62\xa3\x44\xa3\x8b\x6d\xca\x9a\x40\xc3\x1c\x1c\x4e\xb2\xd7\xf6\x81\x8f\x97\x8e\x57\x3d\x66\xb9\x90\x92\x1b\x92\xb7\x77\x47\x1a\x4f\x6f\x05\x47\x7e\xbc\x35\x3a\xce\x1d\x86\xb0\x0c\xc2\x51\x77\x7a\xaf\x6a\xf3\xaa\x11\x79\xbf\xf7\x8d\xf5\x04\x8e\x5e\xf2\x99\x68\x67\x0e\x53\x54\x83\x56\x8d\x6b\xb1\x6d\xa8\x29\x56\x8f\x81\xc7\x99\xb9\xaf\xd4\xaa\xd6\xef\x08\x52\x52\xc0\xce\x3a\xc0\x1a\xc2\x1a\x9e\xa6\x9b\xd5\x8e\xad\xc6\x69\x68\xf5\x5d\xee\x38\x6b\x65\x3f\x33\x34\xef\xc3\x98\xef\x3c\x37\xa3\x8c\xe9\x3b\x21\xf1\x07\xcc\x54\xde\xc2\x6f\x53\xfe\xe5\x60\x4e\xb0\x9a\x36\xaf\xe6\xb6\x65\xb6\x32\x4a\x84\xc7\xda\x7b\x7d\xd0\x1d\x92\x78\xe4\x72\xf1\x5a\x5c\xe9\xff\x0f\xd9\x3d\x0a\xa0\x60\x4d\xd2\xdf\x8d\x5b\xf6\xa9\x12\x73\x4e\xc5\x1d\xe7\x7f\x0c\xe0\x99\xba\x11\x67\x02\x10\xa6\xa2\x06\x10\x6b\x0e\xde\x2d\xed\x85\x8a\x6b\xc4\x11\xe7\x61\x3e\x6f\x80\xe1\xaa\x52\xc3\x23\xe3\x0f\xa8\x49\x95\x1c\xc9\xb7\x76\xe4\xcc\x58\xc9\x0c\xfc\x8f\x44\x2d\xf6\x41\x51\xa7\xfd\x4a\x3d\xd6\x1a\x43\x36\xda\x21\xd0\x39\x44\x63\x5d\x3f\xd6\x67\xbe\x74\x1e\xf4\x5b\x1f\x7c\xb2\x76\xd9\xf4\xde\x81\x07\xde\x64\x58\x2f\x79\x17\xc6\xea\xb3\x8e\x0a\x88\x90\xa4\xbe\xe4\x8b\xc9\x26\x17\xa3\x61\xcc\x7b\x1d\x25\xe0\x89\x45\x3c\xe0\xa5\x25\x44\xf8\x68\xdc\xb3\x24\x9d\xe7\x61\xe7\x9d\xf6\x3e\xfa\x07\x94\xe3\xc4\x61\x8c\x55\x47\x53\xee\x28\x1c\x52\xac\x8a\xd7\x8d\x53\x38\xf0\xda\xc3\x60\xa7\x69\x38\x1b\xb4\xa3\x9f\x19\x0b\x88\x7b\x47\x23\x80\x6a\xc4\xa4\xf2\xff\x30\x4b\xc6\xf9\x33\x7a\xb5\x4c\x86\x6e\x6b\xa5\x1d\xf5\x0c\x43\xea\xb5\x2e\x2b\x39\x79\x4c\x99\x17\xe0\xc3\x14\x33\xf0\x36\x81\xd2\xf1\xd9\x3a\x04\x36\x01\x8c\xaa\xae\x20\x20\x6a\x34\x58\xad\x6c\x03\x7a\xcb\x51\x1e\xf1\x28\xf6\xdc\xd0\x53\x05\xf0\x70\x49\xa1\x3b\x6c\x6c\x3c\x5b\x81\x70\xf1\x58\xc8\xf1\x2d\x46\xe1\x60\x93\x1b\xa1\x8b\xd5\x9a\xe1\x29\xec\x07\xa0\x65\x5f\xa4\x82\xeb\xbd\x3b\x85\x0d\x36\xb8\x32\xbb\xb7\x75\xf5\x38\xe3\xc1\xb3\xa4\x3e\xcf\x94\xca\x63\x0c\xa1\x5d\x50\x28\x13\xee\xd3\xe3\x5e\x8f\xd2\x3d\x2a\xb6\x38\x60\x04\x27\xd1\x59\x7c\xb2\x9d\xa2\xa5"}, +{{0x66,0xda,0x8b,0x25,0x4a,0x37,0x06,0x73,0x78,0xf6,0x81,0x38,0xaf,0xed,0xd6,0x64,0x96,0x59,0x6a,0x05,0x85,0x52,0x4c,0x71,0x6b,0xde,0x2b,0x31,0x24,0xc3,0xe7,0xd1,},{0x85,0xbd,0xe2,0x8a,0x92,0x2a,0xb5,0xee,0xaa,0x4a,0x62,0x94,0x52,0x1a,0x2c,0xca,0xc0,0xef,0x23,0x03,0xdc,0xdf,0x8c,0x7f,0xee,0x22,0x8f,0xb4,0x55,0x20,0x12,0xe7,},{0x40,0x82,0xa5,0xbc,0x73,0x0f,0xb5,0x4b,0x6b,0xd0,0xbc,0xd2,0xa0,0x44,0xed,0x5d,0x3d,0x32,0x7d,0xc1,0x9c,0xea,0xc8,0x82,0x5e,0x62,0x9b,0x9e,0x64,0x23,0xcb,0x1c,0x61,0x42,0x36,0xf0,0x97,0xa6,0xb7,0x3d,0x47,0x39,0x47,0xcb,0x81,0xc4,0xe2,0x70,0x85,0x2e,0xe5,0xf1,0x3a,0x5b,0x03,0xdc,0x18,0xe1,0xc9,0xc2,0x7a,0x9a,0x68,0x02,},"\x3f\xae\x36\x63\x88\x37\xd0\xed\xc8\xdc\xee\x51\x7e\x43\xc4\x88\xed\x57\xfa\x6c\x98\x53\xa7\x45\xaa\xed\xfb\x10\x9e\xc1\x40\x9f\xb8\xa2\xfe\x51\xd2\x3e\x0d\xd9\xfb\xfd\x94\xf9\x1c\x18\xe6\x11\x4d\x80\x89\x01\xbf\x61\x7d\x26\x67\xce\xeb\xd2\x05\xc5\xc6\x6f\x5d\x75\x34\xfd\x2e\xc3\x3d\xbf\xe5\x80\xad\x91\x9f\x50\x42\x04\xea\xf2\x42\xaf\x87\x00\xb1\x38\xcf\xbe\x0f\x37\x29\x19\xc0\x6b\x86\x1a\x27\xd7\x20\xd0\x9d\xf2\x0f\x4f\xb7\xb7\x48\xe7\x18\xb0\xfc\x48\x6d\xbd\xfc\xb6\x94\xcb\x3f\x14\x20\x03\x5a\xc1\xbe\x55\xd3\x1f\x30\xf9\x97\xa0\x43\xd0\x47\x08\xa5\xc5\x42\xee\x37\xc0\xf7\xfe\x0b\x32\x11\xd1\x8a\x87\x03\x3d\xcb\x15\xc7\x9e\x66\x81\xc4\x97\x05\x93\xd3\x2a\x13\xc4\x8f\x0a\x3a\xf8\xbf\xc1\x36\xe0\xf9\xb5\x6a\x12\x3b\x86\xc4\xc6\x40\xb6\x50\xcb\x7d\xee\x9a\x89\xe8\x2a\xee\xee\x77\x3b\x5c\xb0\x32\xfc\xa4\x1c\x20\xc4\x07\x32\x8b\xfe\xd2\x92\x44\xe4\x60\x55\xa8\x31\x14\x61\x4d\x3d\xb5\x65\x81\x60\x4b\x11\x5f\xba\x14\xf6\x18\xe1\x02\xa1\xe1\x6c\xb0\x36\xea\x69\xdf\x92\x75\xb9\x77\xa0\x85\x81\x18\xc9\x1a\x34\xb9\xa8\x51\x9b\xd0\xda\xc3\xb6\x14\x34\xea\x08\x8f\x38\x1b\xa0\x8b\xc1\x58\x31\x89\xa4\xa7\xc8\xb6\xad\x18\xf7\x32\xd7\x4e\xff\x3a\xce\xf4\xb6\x90\x4d\xf5\x8c\x64\x69\x43\x21\x51\x37\x2d\xf9\x32\x7a\xe7\x1a\x0f\x35\x6c\x94\x46\x8d\xcf\xc2\xe4\xa5\xc0\xe4\xec\x0b\x16\x6d\x90\xcd\x46\x5f\x92\x60\xeb\xd6\xa7\xa6\x2c\xe6\xc7\x15\xbc\xc7\x15\xbe\x0c\x7e\x1f\x28\xc4\x45\x60\x12\xd3\x31\x77\xa7\xd4\x11\x3c\x9a\x5a\x22\xac\xfa\xf2\xd6\xb6\x33\x09\x07\x8f\xc1\xb1\xba\xa8\xf3\x6c\x7e\x86\x6c\x1f\x97\x2a\x65\x00\xa5\xee\xa7\x92\x01\x65\x1a\x73\x05\x20\x8b\x6c\x93\xc4\x92\xbc\x77\xca\xcb\xc9\x9c\x9c\xde\xd1\x79\xe6\x64\xa2\xf4\xe1\x69\x38\xcc\x26\xfc\xa8\xb4\x33\xeb\x80\x12\xf7\xb3\xad\x19\xba\x1f\xb8\x58\xfe\x4a\x00\xfb\x3d\x1f\x8f\xd0\xed\xdf\x0c\x37\xdc\xdb\x2e\x5d\x35\xc2\x54\x6f\x22\xe8\xc0\xf8\xce\x90\xe2\xdf\x8a\xbf\x24\x82\x7a\x01\x9b\x2c\x33\xfc\x59\x0b\xbe\x71\x2f\x01\x92\x87\x00\x2b\xc2\x21\x7c\x0d\xc0\x93\x1d\xc8\xed\x8f\x50\xbb\x44\x2f\x8b\x2d\xe2\x78\x57\x36\x2c\xe5\xa9\xfd\x97\xf0\xfd\x1b\x2b\x92\x51\xca\xd2\xa4\xac\xa1\xa9\x4d\xe2\xe9\x53\x90\x2d\x72\x28\x14\x24\x07\x44\x3b\x1d\x51\x71\x07\x64\x8a\x7b\xab\x83\x07\x49\x87\xd0\x97\x8b\xc6\x1d\x41\x9b\xc8\x45\x91\xc9\x69\xc3\xd6\xf4\xe8\x6f\xc4\x73\x87\x37\xbc\x05\x58\x75\x5c\x11\x0a"}, +{{0x27,0x65,0x48,0x29,0x0f,0x3e,0x0f,0x90,0x05,0x15,0xdc,0x63,0x36,0x6c,0x03,0xfe,0x0f,0xc6,0xee,0x13,0x0c,0x21,0xfb,0x60,0xa4,0xdf,0x9c,0xf4,0x64,0x79,0x7c,0xda,},{0x7e,0x2a,0x35,0x78,0x00,0x0a,0x08,0x7e,0xdc,0xc9,0xe9,0x4f,0xde,0x50,0x9f,0xc4,0xbe,0x05,0xca,0x0d,0xd0,0x90,0xdf,0x01,0xae,0x11,0x21,0x12,0x35,0x36,0xf7,0x2a,},{0x88,0xa1,0x46,0x26,0x1a,0xd1,0x11,0xc8,0x0f,0xa4,0x29,0x95,0x77,0xe7,0x10,0xf6,0x85,0x9c,0xf0,0xd1,0xca,0x80,0xe5,0x12,0xa5,0x52,0xc7,0x25,0xb8,0x38,0x40,0x37,0xee,0xcf,0x64,0x65,0xce,0x97,0x58,0x5c,0x9d,0x66,0x0a,0x41,0xab,0x91,0x04,0xe5,0xf7,0xc9,0xb2,0xf8,0xec,0x6f,0xb2,0x1f,0x1d,0xdd,0x50,0xd6,0x5b,0x9b,0x66,0x0e,},"\xf0\xdb\x44\x2d\xe2\x9a\x7a\x1d\xed\x55\x0d\x12\x00\x02\xcc\x12\xab\xff\xf9\x8b\x1f\x57\x6d\x65\xbd\xe1\x6d\xea\xba\x68\x7e\x4e\x0b\x0d\x5a\x87\x48\xd7\x50\x3d\xa2\x96\x9c\x64\xd6\xa7\xc2\x8d\x27\xb6\xc9\x3a\xd2\x57\xce\x32\xec\xda\xee\x37\x5f\x43\xff\xf9\x7c\x43\x2d\x45\x3f\x71\x96\xc7\x09\xc3\xbd\xfb\x73\x88\xd4\xd8\xea\xf1\x39\xf1\x82\x94\x0c\xe1\x7b\x45\x52\xe2\xd2\x0a\xed\x55\x57\xba\x4d\x2a\xcb\xf8\x45\x73\x0c\x0a\x66\xb4\x5b\x40\x95\x0b\xaf\x6a\x94\x64\x37\xaf\x6c\x9e\x3b\x33\xa7\x9e\x04\xdc\xea\xe5\x7c\x2a\x54\x95\x42\xea\xbd\x21\x6b\xf1\x39\x48\xd4\x1f\xfb\x94\x83\xfe\x29\x80\x1f\xc8\xc1\x78\x28\x40\xde\xeb\x3f\xb4\xda\x31\x92\x78\x5b\xca\x13\xed\x0a\x9e\xff\x57\xd6\x13\x6b\xaf\xbf\x9d\xec\x69\x7b\x83\x24\x47\xb2\xb6\xe7\x30\xfa\x7f\x99\x95\xba\xc6\xb7\x83\x2e\xaa\x09\x90\x5e\xe4\x9d\x46\x5a\x5e\xe4\x50\xf5\x2d\x1a\x6d\x36\x4c\x61\x81\x44\xe8\x86\xe8\xef\x63\x3d\xc7\x9d\x0a\xf8\x93\xd1\x6b\x3e\xed\xa0\xfe\xfe\xfd\x87\x59\xf2\xa0\xda\x19\x30\x17\x0d\xd1\x9e\xb7\x8f\x0d\x7a\x7b\x74\x51\x54\x03\x37\x5a\x95\xbd\xbc\xce\x01\x8b\xc1\xed\xb0\x8d\x89\x7b\xb7\x98\xa9\x5e\x7e\x86\xa5\x2a\xf3\xd9\xb8\xa4\xa1\x4b\x03\x71\xd6\x34\x98\xdc\xb2\x01\x62\x48\xeb\xd0\xbe\x80\x0e\x9f\x21\xd5\x49\xe5\xe0\xe7\xb4\x89\x5c\xa5\xcb\x72\x5a\x0c\xab\x27\xda\x8a\x8b\x12\x99\xbe\x38\xa4\x26\x09\x00\xae\x10\xdf\x5b\xab\xa1\x1a\xe2\xba\xb7\x17\x9d\xd8\x45\x39\x69\x42\x9c\xcc\x4d\x41\x60\x55\xf2\xbc\xb9\x3c\x1c\xac\x6d\x7e\x80\x4c\xf8\x12\xdf\x14\x62\xf2\x2e\xe9\xe8\x33\xa9\x76\x9e\x8e\x67\x75\x50\x40\x2c\x40\x94\xdf\x21\x2f\xd2\xc5\xfc\xc0\x9a\x72\xc7\xce\x00\x77\x51\x00\x73\x09\x0d\x0e\x63\xdb\x63\x7d\x43\xd4\xc2\x1f\x86\x19\xd3\x4d\xa5\xdb\x08\x03\x3f\x68\x6c\xe8\xb8\xa0\x82\x12\x22\xf9\x54\x34\xac\x4e\x6f\x70\x30\x94\xed\xde\xd6\xfb\x1b\x84\x6e\x97\x96\x50\x97\x9d\x3c\x77\x45\x3f\x40\xf7\xfe\xe7\xc3\xe8\x8a\x96\xfd\x1d\x70\x2e\x81\xc2\xa4\xf3\xf3\x75\x3c\x79\x64\x84\x2d\xfd\x9d\x39\x58\xa7\x43\xda\x06\x3d\x1d\x64\x8e\x51\xb2\x10\xa2\x8e\xd2\x48\x7f\x14\xd5\xf1\xbc\x6f\x33\x9b\x2d\xd1\x7a\x66\x1c\x39\x73\x6d\xa9\x9e\x4a\x4f\x07\x36\x03\x42\xd2\x37\xe3\x81\x3e\xa3\x99\x8d\x66\xeb\x31\xa2\xd7\x08\xaf\x06\x5c\x32\xb9\x27\xf7\x57\xc3\x7a\x80\x06\x60\x67\x4e\x97\x17\xba\x58\xf2\x80\xeb\x2a\xa4\x64\xfa\x74\x40\x21\x08\xa5\xd5\x66\x2e\x8d\x0f\xea\xf3\x29\x68\x7a"}, +{{0x97,0x2c,0x06,0x16,0x55,0x6e,0xf2,0x2c,0x21,0x48,0x68,0xfd,0xd8,0x22,0xc5,0x57,0x39,0xe1,0xf9,0x6a,0x93,0xae,0x83,0x51,0x2a,0xfd,0xa9,0xca,0x7a,0xa7,0x4c,0xd2,},{0x9e,0x1c,0x6d,0x41,0x07,0xf8,0xab,0x81,0x61,0xc5,0xdb,0x5b,0x88,0xa3,0x7c,0xa1,0xde,0x9f,0x4e,0x29,0x13,0x67,0xab,0xb1,0xef,0xc8,0x4f,0x83,0xf7,0x07,0x69,0x53,},{0x54,0xdd,0x06,0xfb,0xb3,0xd7,0xc6,0x3f,0x8c,0xda,0xf7,0x83,0xc2,0xd7,0xba,0xc1,0x6b,0x4c,0x82,0x6e,0x2d,0x1b,0x18,0x07,0xc8,0x4e,0x04,0x9f,0x64,0xe2,0x71,0xb2,0x1c,0xfa,0x3e,0x37,0xc3,0x44,0x26,0x02,0x87,0x80,0x5d,0x71,0x88,0x06,0xb6,0x2c,0x56,0xb4,0x7f,0x6d,0x5c,0x50,0x81,0x25,0xc9,0xfb,0x5d,0x5e,0xa3,0x5f,0xd5,0x01,},"\x86\x89\xe2\xf9\x5c\x8f\xd5\x0d\xc4\x46\x64\xa1\x8f\xb1\xa9\xf2\xc8\xf3\xee\x73\xc0\xf9\x58\x7e\xe2\x8b\xfa\x35\xc9\x23\x1c\x75\xbf\xd3\xd9\x53\x41\x74\xe5\xad\x3f\xa9\xf0\x92\xf2\x59\x94\x2a\x0f\xf0\xba\x2c\xa2\xcb\x59\x04\x3d\x19\x2c\xa8\xe3\xc8\x86\x9b\xed\xd2\x35\x4c\xbc\x5a\xc7\x82\xd7\x27\xc0\xb6\x94\x07\xf6\x8d\x13\x26\xdf\x65\xa6\x0c\x4d\x32\xf8\x7f\x19\xa1\x0f\x3d\x76\x5f\xf9\x23\x43\x4f\x55\x11\xd1\x34\xd3\x97\xc4\xfe\xf6\xbb\x19\x53\xab\xfc\xe6\x08\x27\xc3\x59\xaa\x4b\x54\xf9\x12\xaa\x8b\x17\xb8\x3d\xcc\x7e\x3b\xcb\xc5\x05\xba\x04\x6f\xe5\x7c\x16\xda\xcf\x4e\xe2\xfa\xd5\x38\xbc\x06\x81\x7c\x9b\x9d\x8d\xbc\x5f\x9d\x9b\xbf\x9f\x4a\x93\x4f\x14\xa4\x2c\x29\xe0\xe2\xf3\xa4\x9f\x46\xb2\x0e\xe7\x6c\xfe\x20\xde\xa1\xe9\x74\x50\xeb\x6a\x8f\xda\x04\x81\x68\xdd\x82\x78\x10\x20\x7f\x00\x5a\x3c\xaa\x93\xca\x11\xf4\xee\x60\x8a\x7a\x93\x55\x49\x43\x13\xae\xc8\xd7\x07\x5a\xfc\x94\xc7\xcc\xcc\x75\xc2\x31\x9b\xb4\x58\xc0\xce\x37\x3e\x9d\x00\x7f\x75\x3b\x33\xb5\x27\x93\xd5\x84\x96\xb2\xd2\x5c\xd1\xdc\xd7\x83\x2a\xac\x5d\xdb\x38\xf4\xdb\x19\xc4\x27\x21\x9e\x1a\x04\x20\xea\xd4\x7b\xa9\x5a\xb6\xd8\x9c\x65\x93\x90\x41\xcc\x73\x4c\x08\xeb\x6b\x47\x6c\xaf\x7f\xc7\x6c\x59\x8d\x94\x7f\xf4\x44\xb1\x07\x70\xf6\x29\x45\xae\x65\x04\x4f\x78\x09\x82\x99\xe2\x62\x6b\x63\x8a\x73\x28\xd1\xb7\xda\xa5\x88\x9e\x8d\xb9\x4b\xbf\xf2\xde\xd6\x2e\x14\x46\x37\x60\x22\x7c\x3f\x32\x6e\xd4\x93\x56\x5d\xdf\x0a\x17\x61\xb8\xe4\xbb\x7d\x24\x10\xfa\x0f\xdb\xf3\x56\x84\x39\x7e\xef\xea\x95\x89\x58\x89\xa0\xa9\xdf\xfc\x5e\x02\xc0\x92\x38\x3b\x7c\xe7\x4d\x2d\x90\x93\x99\x16\xf2\x6b\x71\xaf\xd2\x65\xf8\xbe\xc7\x4f\x0d\xe2\x47\xc9\x64\x39\x05\x58\x3d\xf3\xce\xe2\x35\x37\xd6\xb5\x68\xc8\x33\x8c\xe5\xfe\xe4\x2f\x7d\xd1\x5d\xad\x52\x47\xf0\x09\xac\xbf\xd5\xd7\x69\xb6\x36\x69\x59\xcd\x0a\xe1\x50\xf5\x8f\x7c\x80\xfa\x10\xd9\x89\xed\x90\x11\x93\x72\xe5\xfe\xa5\xda\x48\xa4\xe8\xea\x9c\x72\x78\x75\xdc\x4a\x20\x05\xb0\xdc\x2e\x3f\x69\x7c\x0c\xe0\xa4\xbd\xb2\xf7\x50\xc0\x4f\xbc\x0c\x27\xd0\x2d\xd8\x28\x6e\x54\xc9\xc3\x95\x9b\x6f\xfb\xdb\x1d\xe2\xaf\xfe\x9e\x78\x26\x51\xe5\x16\x8a\x50\x0a\xfe\xd0\x37\xb3\xe1\x79\x0d\xdd\x59\x38\x51\xa6\xa6\xcc\xca\x9f\xff\xb4\xa9\x9e\x27\xdf\x43\x81\x88\x71\x53\x6a\xb0\x4f\x14\xa0\x6a\x1c\x7c\xb4\x7b\xed\x62\x41\xce\x74\x30\xad\x3e\x64\x0a\x72\x67\x52\xfa\x06\xa9"}, +{{0xe0,0x40,0x5d,0x37,0x89,0x3e,0x89,0xf5,0x38,0x11,0xd6,0xd4,0x46,0xe1,0xf1,0x93,0xf5,0x1a,0xfa,0x1b,0xbb,0xa7,0x25,0xf9,0x5e,0xb4,0x80,0x33,0x42,0x4a,0x25,0x09,},{0x45,0x10,0x4d,0x59,0x5e,0x44,0x3e,0x8c,0xe6,0x54,0xde,0x9d,0x65,0x50,0x54,0xbf,0x0a,0x99,0xd3,0x56,0x13,0xd7,0x7d,0x57,0x45,0x4c,0xa2,0xd1,0xc8,0x99,0xb5,0x17,},{0x77,0xdd,0xd4,0x91,0xca,0x66,0x2e,0xbf,0xfb,0x12,0xf7,0xf4,0x92,0xd7,0xfb,0xc1,0xa1,0xb4,0x47,0xf6,0xc8,0x59,0x98,0xf2,0xf7,0xcc,0x9a,0xdc,0xe6,0x7d,0xe6,0x3b,0x6e,0xeb,0xd0,0x81,0x17,0x84,0x5a,0x03,0x02,0xf7,0x34,0x97,0x14,0xba,0x9d,0xb2,0xaf,0x58,0x04,0x8b,0x85,0x83,0x7d,0x76,0x60,0xec,0x3d,0xeb,0xee,0xe2,0xd0,0x0f,},"\xdf\x58\xc4\xfd\x07\x02\xa2\x0f\xaf\xa3\xd1\xd4\xfe\x7d\x85\x93\x8b\x12\x0f\xc1\x1e\x8d\x41\xb6\x01\xf0\xe6\x0e\x42\x23\x6a\x49\xf1\x26\x81\x3b\xd5\x12\xee\x71\x35\x90\x61\xe1\x3e\xb3\x14\xd4\x17\xf5\x6d\x6d\x56\x02\x85\xfa\x89\x91\x21\x32\x84\xc4\x2b\xc2\xce\xf2\xdc\x93\x7b\xdc\x0b\x5e\x9d\xc2\x26\x9a\xfa\xb3\x2d\xb3\x0e\x68\x49\x85\x59\x51\xcf\xbc\x53\xec\xfa\x01\x64\x38\x63\xe0\x32\x89\x95\xfe\x85\x0c\x0d\xb5\x54\x21\xbf\xa5\x64\x60\x1b\x8c\x9d\xb7\x55\x2c\x7e\x6a\xa7\xad\xfa\x15\xa5\x80\x21\xa8\x42\x66\xe9\x59\x5c\x65\xfc\xa4\xa1\x5f\xa7\x0f\x55\xf5\xd2\x12\xc9\xe2\x77\xff\xb8\x30\xf4\xca\xd1\x86\x1f\x3f\x49\x5a\x9d\x67\x2f\x56\x91\x31\x06\x39\xc1\x2d\xcd\x07\xe3\xef\x17\xa2\x37\x50\xbc\xb4\x6b\x7a\xd7\xea\xc4\x62\xeb\x51\x22\x25\xf3\xbe\x7e\x32\xf8\xf4\x98\x7a\x11\xdf\x34\x11\x66\x06\x2b\x43\xc6\x3a\xb8\x58\xa6\x00\x49\x76\x67\xfb\xb8\x8e\x93\xc7\xe2\xe0\xaa\xb4\x1c\x09\xc0\x23\xeb\x90\x2e\xc3\xba\xf6\x79\xe2\x5b\x96\xe1\x06\x92\x1a\x91\x4f\xd5\xde\x20\x0a\x47\x88\x9d\xe2\x3e\x7b\x65\xd0\xcc\xdf\x0c\x29\x03\x64\x67\xa1\x21\x0c\x00\x30\x30\x9a\x2d\x04\xec\x25\x6d\x5a\x4d\x8b\x97\xd4\x6a\x3e\x15\xf3\x45\xb6\x67\x17\x08\x03\xcd\xac\xf6\xcb\x48\xad\xd0\xa1\x34\x62\xdd\x30\xfa\x06\x2b\xd4\x56\x66\x41\xda\x07\xd7\xf6\x1e\x06\x36\x86\xed\xd9\x6b\xfe\x8f\x97\xb9\x86\xb7\xc0\xe4\x42\x49\xcd\x2d\x73\x17\x47\x29\x99\xb8\xee\x4e\xa8\x0c\x90\x2f\x3b\x18\x89\x36\x71\x2e\x89\xd8\xbf\x02\xce\x8a\xe7\x7b\x6b\x31\xab\xb0\x63\x20\x65\x45\x5d\xdd\x9f\x9d\x1c\xd9\x53\xa4\xa4\x9a\xac\x1a\x15\x16\x9e\x68\x7d\x4f\xd3\xf7\xc2\xed\xfb\x3a\xab\xc3\xb6\x61\x55\xf7\xd3\x15\xf8\xa2\x94\xfa\xdd\xff\xdb\x49\x51\x36\x7a\x0c\xb8\x70\x75\x9e\x85\xa8\x38\xaf\x66\xba\x3f\xc1\x03\xda\x2b\xab\xc3\xf3\x81\x69\x6e\xf8\x88\x2d\x85\xa8\x27\x8d\x5f\xac\x3a\x72\xf1\x6e\xb1\x19\xee\x99\x00\xb1\xfd\x98\x6c\x2a\x9f\x94\xee\xd8\xe0\xd4\xf2\x73\x69\x7e\x43\x63\xa9\x75\xff\x6a\x7b\x80\xd5\xb4\xec\x53\x55\xbf\x63\xb4\x2b\x71\xcd\x48\x42\x40\x1d\x38\xb5\xe0\x0c\xc9\x7b\xfd\xa4\x0e\x45\x66\x53\x68\x3b\xc8\xe6\xda\xde\x7d\xcf\x98\x5a\x97\xb0\xb5\x77\x6c\x4d\x72\xca\x13\xa1\x47\x4e\x4e\xb2\xec\xcf\xcd\x42\x87\x86\xdd\xd0\x24\x6d\x73\xa6\x37\x7a\x79\xcb\x8d\xa7\x20\xe2\x26\xc1\x94\x89\xbd\x10\xce\xdd\xe7\x4b\x49\xfa\xc2\xcf\xa2\x07\x12\x9c\x6a\x10\x8a\xa1\x64\xbe\x9d\x80\x9c\x4d\x31\x14\x73\x60"}, +{{0x57,0x56,0xe7,0x52,0xdf,0xf6,0x9e,0x3e,0xed,0x84,0x8e,0x4a,0x49,0xc7,0xa8,0xba,0xca,0x12,0x15,0x4f,0x94,0x31,0xde,0xc3,0x56,0x26,0xef,0x8d,0x75,0xa4,0x45,0x14,},{0x59,0x10,0xef,0x00,0xa5,0xb3,0x54,0x14,0x3c,0x46,0x56,0x1d,0xa6,0x2c,0x41,0xaa,0x13,0xd2,0x9c,0x18,0xdc,0x61,0x53,0xbf,0x8e,0x50,0x2e,0x01,0x14,0x00,0x77,0x28,},{0x81,0x57,0xd8,0x33,0x4d,0xed,0x1a,0x32,0x69,0x9b,0x35,0x0a,0xc0,0xd4,0x12,0x00,0x28,0xcd,0x8e,0xf8,0x18,0x94,0x48,0x93,0x48,0x50,0xe5,0x0e,0xe4,0x99,0x9d,0x8f,0xa2,0xcd,0x25,0x76,0x46,0xd9,0x2f,0xba,0x5d,0x66,0x2a,0x82,0x3e,0x62,0x20,0x8a,0xb4,0xfb,0xe0,0x17,0x14,0xa8,0x48,0xa0,0xb9,0x0b,0x55,0xad,0xcd,0x24,0x69,0x02,},"\xeb\x21\x90\xa3\x21\x9c\x79\x2b\x66\x66\xb2\x75\x27\x33\xad\x9f\x86\xfc\x39\x01\x55\xc4\xb4\x38\xbe\x19\x69\x59\x38\x3b\x25\xf3\xa7\x49\x53\x0d\x5a\x4b\x15\xeb\xe2\xc1\x8d\x99\x17\x8e\x6d\x45\xbb\x4a\xa2\x12\x0f\x95\xa3\x52\xe0\x40\x6c\x63\xac\x86\x72\x48\xd9\xef\xba\x12\x42\x31\x06\x48\x73\xc8\x2f\xe9\x95\xdd\x03\x1c\x7c\xbc\x7d\x15\xec\x19\x1f\xbb\x6c\x47\x4d\xc4\xc7\x77\xe8\xf4\x57\x84\x1e\xb4\x62\x48\x41\xc1\x52\xd1\x5e\xde\x26\xe7\x84\x79\xa6\xa2\x5f\xfa\x33\x55\x63\xf1\x06\x4e\xf0\x95\x58\xb9\x10\xe2\x60\x84\x18\x82\x0f\x49\x55\x4b\x67\x0c\x6b\xab\x34\xd1\xd6\x09\x84\xde\xa5\x0e\xd6\xa3\x75\xf4\x5a\x74\xbe\xad\xfb\x04\xbd\x93\x00\xbd\x59\x4e\x2e\x20\xea\x5d\x30\x52\xbb\x7d\xdc\x51\xa9\x49\xa0\x04\x79\x72\x68\x2e\xbe\x66\xd3\x8a\xac\x62\x92\x72\x70\xde\x42\x15\x0d\x58\x22\x1d\x03\xb8\xac\xe3\x58\x99\x33\x48\x7b\xf2\x3d\x29\xc5\xc2\xc8\x43\xae\xfa\x2e\x1c\xa2\x2f\x9d\x16\x80\xf8\x0c\x76\x6d\x14\x3c\xe5\xec\xef\x25\x3a\x74\x5c\xb7\x1e\x72\xf6\x50\x4a\xd9\x11\xf7\xcb\x4a\x81\x9c\xd0\x74\x86\x3a\x92\x70\x69\x29\xa3\x14\x2f\x8d\xb7\xac\x16\x41\x02\xac\x2c\xa0\xd2\xe1\x9a\x72\x5e\x1b\x5f\x81\xf4\x43\xc7\x3e\x04\x84\xf2\x6a\x45\xa3\xae\xf8\x4f\x1f\x3f\xa0\x4a\x4a\xc6\x95\xd2\xda\xb6\xef\xba\x45\x6a\x28\x1a\x39\x73\xcc\x18\x6e\x68\x0a\x66\xdf\x52\x1a\x4d\x1f\x9e\xdf\x4d\xfb\x27\x4a\x42\x70\x97\xbf\x86\x32\x81\xcf\xb0\xed\x80\xf8\xd7\x67\x66\x38\xd6\xcd\xac\x93\x78\x43\xef\xbc\xfc\xe9\x1d\xe1\xdf\x6c\x52\xb5\x94\x57\x1b\x93\x15\x60\x0e\x4b\x65\x52\xde\xfb\x84\x37\xa8\x07\xba\x21\x29\x8e\x3d\x97\x22\x12\xba\x31\x46\x92\x91\x7f\x40\x07\x53\x11\xac\xd0\x09\x39\x52\x41\xb9\xf1\xb2\x56\xc5\x15\x73\x5d\xc6\x74\xf8\xe8\x66\xd1\xee\xb4\xc3\x28\x54\x8a\xee\x71\x23\x1c\x4c\x9d\x5b\xd2\x2e\x39\xde\x88\xd1\x9f\xab\xf4\x9f\x0b\x98\x69\xcb\xf8\x35\x21\x4b\x15\x52\x2a\x93\xd3\xa5\x00\x7b\x11\xf0\xb5\x0e\x52\x28\xd4\xee\xbb\x45\x71\xb3\x5d\xa8\x4f\x4f\x68\x7e\x3f\x43\x79\x3d\x54\xf3\x82\x5b\x37\xa5\x09\xea\x56\x4b\xdf\x21\x7f\xf4\xad\xf6\x84\x7b\xbe\xa4\x31\x6a\x1d\xbc\xc7\x44\x8e\xcd\x53\x63\xea\xab\xc1\x28\xde\xcf\x05\x4e\xe1\xa0\xee\x2d\x87\x19\x79\xf8\xa6\x3b\x26\x92\xb0\x9f\x6e\x98\x6a\x13\x8e\x7f\x68\xf6\x0a\xa4\x26\xa1\xc9\xb0\x1a\x49\x02\xe1\x3b\x17\xbc\x83\x12\x41\x0c\x28\xbe\xd2\x9b\x60\x1b\x0f\xc9\xf3\xbc\x2d\x22\x3f\x87\x52\x51\x10\x0f\x86\x9c\x6b\x58\x44"}, +{{0xb9,0x04,0xac,0xb1,0x9e,0x5c,0xf8,0x72,0xd3,0x64,0x0c,0xd1,0x8d,0xdf,0x3c,0x0b,0x66,0x57,0xe0,0x11,0x7c,0xe6,0x59,0xdb,0xf5,0x02,0x59,0x01,0x5d,0x3f,0xbf,0x32,},{0xe0,0x4a,0x8a,0xa5,0x6d,0x18,0x18,0x48,0x3b,0x10,0xd0,0xa7,0xc9,0x19,0xe1,0xd5,0xd8,0x00,0x1e,0x35,0x51,0x0e,0x1e,0xc6,0x2f,0x71,0x14,0xdb,0xe8,0x1a,0xe0,0xbe,},{0x9a,0xaf,0x8a,0xc9,0x71,0x40,0xd5,0x50,0x8d,0x58,0xf5,0xac,0x82,0xb7,0xfd,0x47,0xe6,0xb1,0xf6,0x8a,0x7c,0x78,0xa2,0xac,0x06,0xf0,0x41,0x6e,0xf8,0xe9,0x91,0x95,0x3f,0x62,0xc4,0x7f,0xd5,0xfb,0xc6,0xc1,0xe0,0x1b,0xae,0x1c,0x92,0xa3,0x3e,0xf5,0x2b,0x7e,0xfa,0x5f,0x17,0xbb,0x86,0x33,0xbd,0xc1,0xae,0xeb,0xce,0x31,0x8f,0x0f,},"\x83\xf4\x12\x4d\x5a\xf9\x55\x13\x9b\x1b\xc5\x44\x1e\x97\xc5\xfa\xc4\x91\xb4\xea\x91\x14\x07\xe1\x54\x20\xa0\x34\x7e\xd7\xfa\x1f\x88\x19\xe3\x6c\x8e\xd5\x74\x0c\x99\xd4\x50\x5a\x78\xb6\x19\xd5\x60\x74\x9a\xf5\x0b\x05\x73\x51\x08\x16\xd6\x13\x22\xcd\xa9\x76\xa5\xd4\xca\x32\x05\xf5\xf0\xe6\x0e\x75\x9a\x5d\xf1\xa0\xbd\xf3\x6d\xfe\x97\x17\x90\x6a\xc5\x7c\xbf\xc9\x70\xab\x43\xb6\xfa\x18\xe6\xc0\x00\x6c\x84\xfc\x72\x54\x47\x0a\x0b\x77\x47\x27\xbf\x5f\x8e\x67\x94\x23\xa5\x31\xe4\x1c\xb5\x31\x0f\x9b\xcb\xf5\xa5\x44\x5e\xbc\x39\xfb\xd9\x09\xce\x11\xe9\x7b\xc2\xf6\x6a\x4a\x1b\xb6\xc2\xf1\x67\xf2\xc6\xe8\x0e\xb9\xb8\xb7\x2d\xf3\xe8\xcf\xd4\xe5\x14\x48\xdc\x14\xc0\xb8\x37\xf2\x94\x96\x93\xd1\xd0\x54\xc8\xf9\x5b\xff\x7f\x1e\x36\x45\x67\xd0\x34\xf2\x22\x3e\x15\x94\x77\x2a\x43\xdc\xfe\x05\x97\xfd\x6d\x13\x3b\x3f\x2e\x96\xff\xc5\x66\x7d\xd5\x92\x8f\x23\xec\x3c\x75\x0f\x84\x59\x93\xa3\x4e\x97\x76\x15\x9a\x68\x30\xd6\xfd\x90\x13\xee\x7a\xea\xa1\xfc\xcd\x69\xb9\x6d\xf2\x84\x70\x4f\xd0\x88\x88\xb1\x5b\x64\xe2\xe9\x0d\x57\x8c\x5c\xfc\x0f\x95\x69\x3f\x6a\xb6\x5c\x69\x47\x44\x6a\x85\x7c\x02\x9c\x7c\xa6\x60\x80\xb7\x54\xc7\x73\x4b\x78\x99\x8a\xbe\x9b\x7c\xc6\xef\xd0\x9a\x44\x18\x19\x4d\x88\xb3\x4e\xc6\xc3\x3a\xf6\x30\xdb\x81\xde\x5b\x99\xfe\x65\xaa\xc8\xb7\x33\x62\x37\x91\x19\xc7\x00\xd1\x07\xed\xfc\x19\xf2\x70\x76\x04\x68\xee\x8e\x5f\x15\x5d\x9a\x34\x7e\x57\xb5\x93\x0f\x32\x7a\x8d\x11\xc6\x67\x4d\xdd\x02\x0f\x9e\x7d\x9b\x76\x1d\xba\x5b\x83\xa8\x73\x02\xf1\x83\x3e\x5a\xbd\x49\x52\x6d\x66\x39\x1e\x5b\xf0\xe3\x5b\x44\x53\xd6\x30\xbf\x7d\x0a\xdb\xfe\x50\x1a\xef\x81\xe6\xc5\x93\x8f\x92\xcb\x75\x2f\x5f\x14\xd2\x80\x6f\x90\xae\x15\x46\x05\x1c\xcc\x7f\x91\x3c\x5d\x6a\x38\xff\x3b\x7b\x9a\x23\x66\x2e\xf1\xf0\x08\x08\xed\xb2\xfa\x31\xec\xba\x5c\x8d\x33\x87\xe8\x75\x41\xcd\x06\x16\xed\xbf\x3a\xaa\x35\xa5\x37\x92\x28\x61\xf4\x4c\xbd\x9f\x99\x2b\x82\x46\xd9\xc6\x4c\x41\x98\x81\x70\x1a\xb4\x3f\x7f\xd4\x64\x21\x0d\x80\x2b\xa6\x56\xd9\x5c\x0f\x24\xa3\x45\x99\xb2\x0b\x1e\xc2\x00\x11\x48\x5c\xfc\xb3\x18\x6b\x7b\xcf\x69\xd7\x45\x81\xa7\xa3\xee\xd6\x13\x4c\x4e\xec\xd6\x55\x74\xa4\x32\x0d\x9c\x57\xa8\x49\xc4\xe7\x8c\x8a\x5c\xe8\x25\x05\x00\x4a\x54\xf1\x9d\x4b\xdc\x82\x23\x40\x1b\x34\x94\x6b\x7d\x66\xe4\x7e\x63\xcf\x9d\x0f\x57\xd0\x94\x54\x91\x38\x4b\xc6\x86\x8c\x4b\x47\x86\x90\xe5\x50\x02\x1d\xf1"}, +{{0x8a,0x35,0x01,0xb7,0x69,0x53,0x60,0x3c,0x90,0x33,0xe3,0xbc,0xbf,0x3e,0xc3,0x78,0xd2,0x57,0x01,0x1a,0x6c,0x50,0xb8,0x97,0x62,0xd4,0x91,0xea,0xa7,0x2c,0x5e,0x0d,},{0x77,0x8f,0x20,0x19,0xdc,0xd8,0xdb,0xb8,0x6c,0x67,0x37,0xcc,0x8d,0xc1,0x90,0xc5,0xa0,0x4c,0x50,0xb5,0xbf,0x45,0x88,0xbc,0x29,0xfa,0x2a,0x47,0xaf,0x25,0x26,0x72,},{0xa8,0xa3,0x09,0xba,0x52,0x12,0x5e,0x76,0xa4,0xa6,0x1e,0xb4,0x3f,0xd4,0x13,0x5c,0x41,0xab,0x11,0x79,0x9b,0x91,0xcc,0x54,0xff,0xc9,0xc6,0xa2,0x0f,0x05,0x0c,0xc5,0x95,0xb2,0x81,0x43,0xc8,0x74,0xbd,0xb9,0x28,0xbe,0xed,0x26,0x1d,0x9c,0x0f,0x12,0xaa,0x19,0x2e,0x66,0x40,0xbf,0xda,0xd5,0x4b,0xa0,0xd4,0x78,0x42,0x6b,0xce,0x09,},"\xe6\x09\xf1\x22\x4a\x6a\x45\x11\x40\xcb\xc0\x25\x4d\x43\x2c\xe5\xfd\xdd\x08\xa8\xe9\x12\xf8\x1c\x41\x2f\xdf\xd5\x18\x2f\xf6\xac\x2f\x13\xc5\x76\xc8\x14\x5b\x15\xf2\x5b\x40\x9d\x85\x3f\x91\x44\x09\xe4\xe0\x2c\xef\xc3\x9d\x9b\xef\x4a\x2a\x06\x04\x98\x57\x0b\x2d\x3a\x28\x38\xc9\xb0\xb8\xe3\xaf\x4f\xc3\x7e\x19\x15\xf8\x04\xa8\x01\x88\x58\x5b\x30\xb6\x8a\x3f\xfb\x2e\x96\x0c\x73\x20\xe8\x27\xd2\xfe\x36\xe6\xa3\x28\xcc\x6e\x78\x06\x34\x8a\xdb\x0b\x77\x3b\x78\x4d\xe5\x29\xbb\x6f\x64\x75\x1b\x21\x05\x85\x94\x94\xfd\x49\xdb\x0b\xc7\xf6\x2d\xf4\x6b\x9d\x7c\xe6\x76\x97\x5c\xc5\xf4\x38\x56\x49\x84\x36\x81\x2e\x04\xf2\x6f\xb8\xb8\xab\x7e\xba\x12\xf1\xd5\x67\x22\xeb\x82\xeb\xfa\xfa\x47\x35\x97\x7a\x26\x68\x1c\xb0\x3f\xa4\xbc\x69\x51\xab\x9c\xbd\xf7\x87\xe3\x27\x8f\x2f\x57\xf2\x9e\x12\x09\x5f\x8c\xa2\xa1\x78\xcf\xa7\x57\x13\x37\xf0\x27\x42\x37\x66\x9f\x97\x65\x7d\x4b\xad\xb3\x94\x36\xd7\x86\x49\x25\x80\xfd\x55\xd8\x6b\xe3\xa0\xcd\x17\xd1\x60\x57\x01\x7b\xaa\xae\xa0\x0c\x1e\x14\x55\x21\x59\xbc\xab\xc0\xe6\x66\xba\xd3\x41\x8e\x4e\xc1\x3b\xfe\x16\x3b\xe2\x56\xf0\xc8\x9b\xc2\x34\x4a\x8d\xdf\x99\xca\x81\x60\xb1\x89\x87\x5a\xd3\x22\xd9\x0f\x58\x13\x25\x28\x1d\x53\x89\x96\x5c\x0a\x7b\x7b\xca\xe2\x29\x4a\x3c\xbe\x35\xa4\xe4\xe8\x3b\x54\xc4\x27\x63\x53\x96\x0f\xad\x11\x85\x32\xd4\x9b\x70\x76\xf2\x5a\xd1\x90\xab\x56\x94\x91\x4f\x71\x08\xb0\xab\x69\x69\xa1\x91\x28\xfb\x0a\xef\x00\xe6\x5a\x04\xfc\x83\x2d\x07\x69\x61\x67\xb9\x34\x2b\x35\x5e\xc5\x77\x37\xca\x37\xcb\xff\x3b\xb3\x19\x31\xcb\x58\x71\x2a\x4c\x46\x89\x52\xc6\x45\x9d\x56\x7a\x26\xe7\x95\x01\xe4\xe3\x1b\x1b\x09\x53\x53\x76\x32\x02\x9e\x9b\x49\x0f\x72\xe5\xa6\xe0\x57\xdd\xb4\xb3\x17\x56\xfd\x97\x04\x21\x8b\x1b\x8f\x4d\xcb\x54\x30\xc0\x25\x04\x2f\x47\x16\x9b\xfc\x7c\x80\xd7\x1c\xab\x8c\xa0\x7f\x34\x0a\xfa\x00\x8a\xbb\xe2\xe3\xa0\xab\xe1\x41\xda\x8d\x41\xca\x6b\xd6\x9d\x36\xfd\xb1\x1a\x41\xce\x0b\x72\xfa\xbc\x00\xd9\x7e\xa6\x05\x27\x00\x10\xb2\x59\xdf\x8e\x10\xdd\x22\xdc\x17\xc1\x39\x90\xa0\x5f\x02\x33\xe3\xca\x85\x6b\x40\x97\x1c\xb3\xe2\x1c\x8b\x39\x50\xb1\x3f\xc8\x4e\x1f\x26\x6c\x2a\x6f\xbe\xce\x88\xd5\x97\x25\xc3\xcf\xb2\x22\x5d\xbc\x1e\xe9\x5b\x68\x6d\xb7\x04\xfc\x93\x7b\x76\x6f\x0a\x9b\xfe\x95\xa4\x2b\x90\x10\xf1\x22\x9c\x61\x0d\x7e\xde\x09\x57\x12\xc8\xf0\xf1\xfb\x00\x47\xc0\x40\xa8\x70\x30\x6c\xd8\xdc\x74\xc4\xda\x51\xbf"}, +{{0x42,0xb5,0x36,0x52,0xd0,0x8b,0x5d,0x76,0x6e,0x66,0xad,0x8f,0x3e,0xbf,0x69,0x3c,0xfd,0x77,0x90,0x7c,0xad,0xd9,0x8b,0x54,0x66,0xdf,0x77,0xdf,0xa2,0xc6,0x37,0xad,},{0x88,0x46,0x3b,0xb8,0xa4,0xb6,0x38,0x8d,0x92,0x4c,0xb8,0x62,0x09,0x83,0x41,0x95,0x43,0x5d,0x79,0xd7,0x7f,0x8c,0x02,0xf4,0x6b,0xbd,0x16,0xd8,0x2e,0xfe,0x42,0xb3,},{0x30,0xc4,0xb9,0x9e,0x68,0xec,0x33,0x51,0x30,0x8f,0xbc,0x76,0xd9,0xca,0xf0,0xaf,0x62,0x21,0xb5,0x96,0xb7,0x01,0x7f,0xe1,0x0c,0xc6,0x33,0x02,0x3b,0xa9,0x7f,0x02,0x38,0x96,0xfe,0x32,0x2b,0xaa,0x34,0x76,0x60,0x61,0x0e,0x05,0xfa,0x49,0x3d,0x21,0x8f,0xa3,0x60,0xf1,0x8d,0x93,0xe2,0x75,0xd1,0xef,0xf6,0x66,0xb6,0x3d,0xb2,0x04,},"\x9e\xe9\x13\xc7\x4e\xe3\xc5\xe8\xc9\x0d\x64\xb8\xae\x3a\x60\x04\x9f\xc7\x65\xe1\x76\x06\x0b\xcd\x1c\xd0\x9f\x0e\xda\x60\xbf\x23\xba\xdb\x8a\x1c\xaa\xc3\xd6\x6e\xbc\x52\x68\x14\x6e\xe4\xa5\x4e\x1e\xb2\x31\xed\x25\xef\xf9\x5b\x90\xa6\xe9\x83\x37\xa5\x40\xa3\xf4\x84\x49\x79\x4a\x48\x73\xbf\xc2\xe8\x47\x28\x96\x6b\xb7\xc6\xff\x67\x6a\x2f\xf5\x73\x11\xc1\xc2\x5e\x15\xfb\xf3\xd4\x0e\x9f\x25\xab\x5d\xb9\x1f\xdd\xb7\xa0\xae\x43\x6c\x8e\xc0\x70\x75\x4b\x6d\x74\x3a\xa1\xd6\x04\x8f\xb5\xbd\x7f\x5b\x8e\x4c\xca\xd2\x03\x28\x38\x95\x30\xf1\x13\x74\xa4\x89\xb1\xd5\x05\x31\xa3\x9c\x9b\x32\xb4\x03\x69\x62\x60\x06\xd2\x64\xa9\x9e\xec\x4f\xac\x13\x41\xf4\xe7\x46\x79\x45\x7b\x41\x8e\x6b\xbf\xba\x23\x3f\x1c\xa1\x58\xf7\xb2\x9d\x40\xd5\x03\x01\xf9\xd9\x25\x36\xfd\xc5\xc2\x3f\xe5\xde\xe4\xd6\xdf\x0e\xbf\x13\xdf\xa3\x75\x4a\x14\xc8\x56\x00\x9a\xde\xa1\xdd\xa4\x09\x30\x4c\x1f\x60\xd2\x53\x30\xfb\x10\x95\x79\x47\xa0\x05\x08\xf2\xfd\x76\x42\x2e\xac\x69\x4c\xc3\x9f\xa8\xae\x7f\xcc\x77\xa0\x2f\xd9\xee\x5f\x91\x0d\x93\xe8\xaa\xc6\x8f\x14\x5d\xd8\x78\x87\x6b\xa8\xed\xa0\xa4\x9f\xcb\x20\x9c\x34\xea\x22\x0d\x4d\x06\x05\x54\x6f\xc4\xa8\x09\xba\xf0\x10\xd5\x33\xe4\x5d\x17\xb0\xe1\x6a\x46\xe9\x1e\xa6\xfe\xc2\xcd\xc5\xa8\xb3\xec\x50\x14\xb2\x5e\x92\xd8\xe5\xc9\x28\xab\x06\x99\x3d\x4f\xe2\x3a\xc8\xd4\x5c\x89\x03\x78\xdd\x13\x3f\x00\xed\xb9\x37\xc0\x71\xf7\x5c\xfc\x13\xa4\x02\xe3\xe4\x29\xa8\x48\x65\x2a\x17\x5c\x9b\x6f\x6e\xac\x86\xf6\x18\x8a\x44\x48\xa9\x6c\xe2\x87\x2e\x5f\x65\xf9\xbd\xb8\x71\x66\xc9\xb8\x7a\x7e\x95\x8e\x80\xbb\x65\x66\xe3\xfc\xf8\x71\x19\x0c\xf4\xa8\x67\xe6\x12\xcf\xc1\xe4\x37\x1d\x2b\x73\xd2\xa0\xad\x0a\xa4\x00\xba\x69\xe6\x63\x36\x23\x3b\x0f\x3c\x52\xb8\xa6\x8b\xca\x05\x12\x56\x01\x25\x50\x46\xe6\xf4\x9d\x68\x8d\x2d\xb8\x5c\x7b\x82\x12\x70\x51\x6e\x3c\x06\x13\xf3\xf2\x3f\x9c\x57\xcb\x4c\x87\x14\x28\x5c\xdf\x95\xe1\x06\xa3\xb5\xaf\xca\xeb\x81\xb7\x2f\x34\x3e\x87\xbd\x92\xf1\x58\x1d\xcf\x9a\xa9\x0a\x02\x4f\xa4\xa1\x04\x80\x59\xe3\x0d\xe8\xff\x0d\x16\x79\x4d\xcd\x74\x5d\x2b\x2d\x53\x4c\x52\x0f\x82\x78\x53\x86\x74\xa9\x34\xc6\xf1\x4a\x84\x28\xe3\xda\x01\x8a\x36\xe4\x5a\xa5\x82\x7c\xf4\xb1\x52\x84\x34\x6f\xd6\x93\x63\x14\x92\x19\xbb\x0d\x1b\xc9\x27\xd8\xd1\x93\xc4\x82\x69\x2f\x97\xdc\x88\xd8\xed\x33\x7d\x0c\x9d\xc9\x9c\x7a\x5e\x11\x1d\xce\xd4\x22\x50\xd5\x80\xe2\x06\x92\xbb\x7b\x88"}, +{{0x14,0xcf,0xe0,0x0f,0xa7,0x19,0x0a,0xe8,0x10,0x88,0x8a,0xe2,0xbb,0xd0,0xff,0x64,0x12,0xcf,0x1f,0xd4,0x08,0xa3,0x08,0x29,0x43,0x83,0xa1,0x94,0x53,0xb5,0x90,0x73,},{0x4e,0x61,0xaf,0xe8,0xc1,0x74,0xb6,0xee,0x1a,0x29,0xfa,0x09,0xcf,0x87,0xb4,0x00,0x81,0x39,0xf1,0x07,0x0b,0xc8,0x53,0x1b,0x6d,0x06,0xf5,0x4c,0x95,0x62,0xa4,0xf3,},{0xf7,0x85,0xa4,0x6f,0x69,0xbb,0xd0,0x99,0xfa,0x01,0x11,0x24,0xba,0x90,0x32,0xc1,0x89,0x74,0x2c,0x9e,0x00,0x1d,0xbb,0x87,0x81,0xd8,0x22,0x33,0x45,0xa9,0x56,0x9d,0xc1,0x44,0xca,0x69,0x4d,0x90,0x24,0x5e,0x0e,0x51,0x3e,0x88,0xab,0x02,0x3f,0x7f,0x0f,0x99,0xb7,0x41,0x61,0x59,0x75,0x8d,0xd0,0x34,0xe7,0xa8,0x9c,0xff,0x36,0x00,},"\xbc\x66\xf8\x01\xda\xa8\x29\x85\x8e\x74\x02\x93\xd4\xd2\x18\x7b\x8e\x1a\x5a\xfb\xa5\xfd\x67\xb1\x09\x56\xc6\x53\x46\xac\xa9\x44\x29\xd3\x2e\x4c\xfb\x35\x84\xab\x0e\x00\x5d\x0d\xd7\x42\x78\x1d\x47\xe8\x94\x47\xc4\xe1\xd8\x1b\xf7\xe6\x15\x4f\x8f\x73\xaf\x03\x36\x1a\xd5\x6e\xa3\xc0\x60\x00\x75\x4b\x9f\x32\x7d\x4e\xde\xac\xc4\xd3\x48\xaf\xb5\x48\x23\xe1\xc9\xd4\x9c\xd8\xff\x2b\x19\xf4\x20\x21\xb4\x0d\x58\x0c\x39\xce\x3d\x24\x36\x61\xb8\x54\x21\xfe\xc9\x15\xba\x9d\xd2\x76\x2f\x85\x0b\xd2\x08\xfd\xbf\x20\xff\xab\xa5\x6a\x46\x86\x60\xf1\x7c\x00\xfb\x1c\x0f\x4e\x85\x27\xa5\x09\xdd\x4e\xec\x13\x36\x0c\xf6\xe3\xca\xc5\x42\xb8\x75\x18\x2f\x2a\x7c\xe7\xbe\x0a\x33\x30\x2f\xe2\x6d\x36\x29\x62\x93\x84\xe3\x5c\x06\x78\x9d\xe6\x34\xe9\x0e\x96\x4f\xbd\xa8\xcb\xba\x98\x11\x1e\x22\xe8\xd0\x76\x26\x84\x26\x6a\xab\x76\xae\xba\x4a\x38\x07\x78\x69\x68\x14\xa1\xe3\x11\x94\x3c\xb3\x50\x58\x92\x64\x0c\x44\xe3\xaa\xc4\x53\x0c\x50\xac\x60\x4a\x8d\x2c\xcc\x7c\xea\xbf\xfe\xa4\xaa\x3d\x7f\x48\xa6\x6d\xcd\x75\x88\xb8\x02\x09\xdb\xc1\x73\xf0\xc6\x63\xe8\xfc\x87\xa3\x6e\x89\x2e\xc9\xa3\xff\x8f\x60\xd2\xe0\xd8\x70\x4e\x5b\x6c\xbb\x87\x32\x75\x15\x1a\xd4\xcc\x00\x57\x16\x50\x31\x90\x50\x39\x65\x1c\xa1\x0a\x95\xc6\xfd\xa3\xb2\x78\x27\xa6\x57\xef\x9a\x5f\xc3\xeb\x5b\x53\xca\xc6\x1d\xda\xf5\xa4\x17\x04\xc8\x78\x57\x0c\xbc\x3c\x41\xc4\x75\xb1\x17\xc0\x5e\xab\x0b\xb1\x96\xbc\xb7\xc4\x33\x34\xde\xbd\x64\xb9\xe3\x74\x50\xd2\x3f\x5c\x10\x16\x1e\xc5\xab\x4f\xcc\xd7\xcf\x30\x8e\x2a\x99\x95\xcc\x9e\x57\x8b\x85\xe8\x28\x5a\x52\x08\xb9\xef\xd4\x2a\xf9\xcf\x2a\xc2\xb3\xb7\x46\x42\x54\x88\x9a\x21\x87\x31\x7e\x32\x49\x97\x09\xb9\x13\x95\x3a\xd4\x6f\x1c\x23\xe1\xb6\xb5\x6f\x02\x4c\x4a\x7d\x48\x46\x11\x92\xc0\x1c\x56\xc5\x4c\x56\x47\x91\xec\x0a\x67\xb6\x1a\xcb\xf9\x57\xe6\xd0\xd7\xda\x80\x53\xed\x13\xa4\x18\x93\xd7\x67\xfc\x57\x37\xcd\x19\x55\x53\xda\x5d\x5b\x07\x06\x5f\x47\xd7\x2a\x35\xc4\x2b\x00\x1e\xb6\xdb\xd0\xf8\xe7\x7a\x4b\x76\xa6\x26\x61\x92\x64\x7f\x41\x55\xea\x11\xbd\x12\x37\xba\x77\xc8\x7c\x62\xbf\x4b\x01\x14\x9f\xc5\x8b\xc2\x8f\x0b\x5a\x28\x64\x85\xd3\x71\x7d\x32\x39\x64\x04\x62\x18\xe7\x0c\x7e\x38\xb7\xd5\xe7\x4b\xa6\xb1\x2b\x02\x2f\x18\x19\x7d\x92\xc1\x3b\xca\x89\x33\x5c\x85\x6c\xbc\x57\x56\xaa\x3b\x64\xec\x1f\x46\xe3\x96\xb1\x16\x1c\x87\x1c\xd2\xdf\xde\xd1\xa4\xec\x91\x92\x74\x29\x37\xc0\x70\x45\x31\xc7"}, +{{0xac,0x0f,0x7f,0x04,0x18,0xde,0x67,0xe3,0x48,0xfa,0x6d,0x56,0x86,0xc4,0x6d,0x21,0xca,0x72,0x62,0x2e,0xe6,0x9e,0xaa,0xbe,0x00,0xd5,0xc9,0x07,0x5a,0x34,0xf1,0x79,},{0xfe,0xab,0xde,0x08,0xf0,0x0a,0x2b,0x68,0x2b,0xce,0x9d,0x45,0x99,0x0b,0xf4,0x5a,0xfc,0x95,0x83,0x39,0xdc,0x44,0x10,0x6d,0xad,0x33,0xb2,0xc4,0x90,0xef,0x70,0x90,},{0x75,0x91,0xcf,0x82,0x57,0xbe,0xad,0x39,0xa1,0xad,0x3b,0xa1,0x91,0x8d,0x51,0x8e,0x67,0x24,0x35,0x6b,0xf6,0x25,0xa5,0x73,0xea,0xe5,0x01,0xd1,0xaf,0x94,0x6c,0x13,0xc2,0x90,0xcb,0x63,0x15,0x6e,0xc9,0xd3,0x62,0x72,0x6e,0xe5,0x0b,0x39,0xfc,0x0a,0x7a,0x2b,0xbd,0x69,0xd4,0xa8,0x1b,0x75,0x93,0x2a,0x90,0xf8,0xc7,0xac,0x7d,0x03,},"\xe8\xd0\xe8\x32\x53\x35\xe0\xf3\x5a\x85\x46\x7b\xee\xd1\xe1\x1c\x6a\x20\x78\xc3\x5a\xe4\xa4\xa1\x05\x43\xed\xe4\x0c\x17\x12\xbc\x95\x20\x12\xd2\xf8\xfe\xc1\x05\xae\xf7\xc6\xc6\x5b\x36\x34\xb4\xa7\x4b\x22\xb4\x98\xb9\x13\x50\x7d\x1f\x6c\xfd\xe8\x38\x58\xe6\x83\x0c\x0a\xf4\xf4\x64\xa6\x89\x9d\x5c\x4e\x27\x9a\xff\x36\x75\x4c\x21\xda\x80\xa1\xbb\xd1\xdc\xf4\x62\x20\x37\x5b\x1e\x11\x2a\x5a\x72\xf1\xab\x6e\x8f\x64\x19\x42\xf6\x6d\x9b\xbd\xbb\x17\x9c\xf0\x13\x9e\xa8\xde\xb0\xf4\xb8\x14\xf5\x0c\x51\x33\x29\xa1\xa0\xe2\x67\xc4\x43\x3a\x23\x31\x82\xbc\x4a\x2a\xcb\x2c\x6d\x4f\x00\xb2\x40\x94\xd3\xbd\xc0\xeb\x81\xcf\x37\xd3\x82\x60\xc2\x10\x7d\xd9\x49\x06\x13\xd2\x76\xee\x1f\x72\x26\x6c\x6e\x4a\xcc\xa5\x24\x98\x11\xa0\xf8\xa7\xda\xe6\x6a\xed\xb7\x5c\x3d\xf4\xc8\xca\x3c\xb5\xd9\xc5\x67\xba\x54\x1e\xe5\xa9\x14\x0c\x50\x58\x72\x72\xaf\x34\x53\x0a\xb8\xb0\x8b\x9e\xc0\x32\xea\xc0\x60\x39\xe6\x92\x63\x0e\x2d\x55\x4d\xf7\x7c\x1a\x03\x88\xb3\xca\xaa\x3b\xe3\x75\x4a\x84\x96\x1f\xb2\x99\xe4\x02\x22\x71\x58\xce\x36\x3e\xac\x26\x47\x8d\x47\x97\x75\xe5\x68\x5a\xdb\xf8\x28\xbb\x35\x5e\x3c\x89\xcc\xe2\x41\x50\x3c\x15\x36\x64\x32\xba\x94\xcd\x3c\xd9\x54\x79\x14\x4b\x63\x6e\x0d\xe7\x0b\x3f\x16\xd1\xa3\xca\x51\x8e\x39\x90\x09\xa4\xc2\x47\xa7\xf9\x63\x67\xc7\x14\x66\x08\xaa\xcc\x00\x14\xfc\x35\xb8\x4a\xf9\x93\x3f\x09\xba\xbb\x89\x93\x7a\xbb\x8c\xed\x11\x18\x91\x34\x3d\xdb\x79\xf6\x0b\x78\x89\x8a\xb5\x93\x8f\x8b\xa3\x81\x4b\xd8\x00\x26\x05\xb1\xdf\xd2\x97\xfa\x07\xc4\x75\xa0\xd4\xf8\xf4\x45\x1a\xcd\x70\x7d\xe8\xaf\x6c\x0e\x88\x18\x83\x3a\x3a\xbe\x5c\x96\xd1\xa8\xc6\xc9\x6e\x2c\xb6\x33\x28\xeb\xa4\x4d\xd1\xd3\x46\x84\xe4\x12\xf2\x88\xe0\x65\x20\x9d\x11\xeb\x80\x94\xd2\x2e\x4c\xc8\x02\x62\x9c\xcb\xa3\x39\x26\xbf\x1a\xd3\x6a\x62\x85\x13\x8a\xbe\xe0\x5c\x5a\x39\xa4\x75\xf3\xfd\xd0\xb3\xec\x8c\x37\x0c\xd9\x57\xa8\x37\x9e\xc2\xcd\xaf\x03\xe8\x95\xc1\xba\x12\xb4\x49\xd6\xcd\x8b\xe0\xf3\x5d\x99\xe2\xb7\xfb\xaa\x92\xdd\x54\xe6\x4e\x7c\x35\xce\xb8\x8a\x71\xa6\x80\x52\x7c\xb3\x73\xaf\xe1\x4c\xdd\x15\x8a\x0b\x90\xbf\x2d\xae\xc8\x0d\x2e\xdb\xdc\x31\x28\xcd\x6b\x63\xfa\x53\x2a\x1c\x27\x8c\xdf\xe0\xf8\xeb\xb4\xab\xba\x5e\x1a\x82\xbc\x5c\x3f\xed\x15\xc5\x79\x5b\xd9\xff\xb5\x76\x08\x2c\xc4\x79\xfa\x1b\x04\xc5\xc5\xaf\xca\xd2\x69\xa0\xf1\xad\xdf\xe7\x60\x42\xc3\xa8\xf1\xf2\x53\x77\xb6\xcb\x72\xec\x16\x14\xeb\x63\x83"}, +{{0xb5,0xa7,0xc7,0x67,0x93,0x63,0x80,0xb3,0xe9,0x87,0x51,0xca,0xfd,0x3e,0xa8,0x9b,0x38,0x8a,0x32,0xcf,0x82,0x8b,0x32,0x1c,0x5b,0xd0,0xcc,0x8d,0xd8,0x5b,0xaf,0x00,},{0xbe,0x7f,0xa6,0x5f,0x1f,0x6b,0xe5,0x10,0x27,0xf8,0xb8,0x48,0xdb,0x7a,0x8c,0x40,0x49,0x61,0xbf,0x1e,0x21,0xa2,0x3d,0xf2,0x3b,0xb8,0xce,0x05,0x85,0x0c,0xda,0xa1,},{0x60,0xe4,0xd2,0x3f,0x1f,0x08,0xfc,0xe4,0x66,0xc9,0x91,0x5d,0xde,0xd9,0x32,0x56,0xb5,0x2b,0x32,0x7e,0x5f,0x81,0xfb,0xb3,0x1d,0x1d,0x10,0xd3,0x21,0xc3,0x90,0x36,0x6e,0xf0,0x01,0xfd,0x75,0x9a,0xa9,0xd0,0xa5,0x51,0x62,0xd5,0x36,0x4d,0x91,0x8b,0x48,0xc7,0x32,0x7e,0x77,0xcf,0x53,0x58,0xbc,0x43,0x19,0xe3,0x25,0xcd,0xd6,0x08,},"\x6b\x67\xc7\x95\xd6\x6f\xac\x7b\xac\x84\x42\xa6\xc0\x99\x2c\xb5\x75\x88\x43\xb3\xe3\x93\x9e\x3c\x27\x6c\x6e\x90\x08\xda\x82\x00\x76\x77\xbf\x9e\x67\xe9\xac\x5a\x1a\x0f\x48\x6b\xea\xc0\xd8\x56\x19\x1f\xae\x25\xa1\x27\x39\x2b\xed\x46\x9b\xc7\x8d\xeb\x0c\x4b\x89\x3f\x67\xf1\x71\x6d\x83\x50\x90\x77\xe4\xa1\xbf\xd4\x13\x6d\x03\x15\x2d\xcc\x3b\x76\xd9\x52\x49\x40\xa6\x06\x4c\x66\x9f\xbf\x51\xf6\xb9\x10\x34\xb6\xd5\xf2\x89\x86\x78\xa1\x3a\x24\x70\xf6\x64\x1e\xc8\x02\x45\x7c\x01\x02\xc3\xeb\xf6\x34\x5c\x32\x7e\x74\x1b\x80\x64\x4b\x3a\x99\xbf\x72\xb5\x9a\xb8\x01\x6f\x35\xd2\x51\x88\xa0\x85\x75\x0d\xc0\x60\xe5\xa8\xd5\x24\xae\x21\x3f\x07\x8f\x28\x8c\x7b\x34\xbc\x41\xf3\xce\x35\x6b\xf2\xda\xfd\xd2\xe0\xdb\x4f\xb8\xd7\xc2\xc3\x19\xf9\x90\x60\x05\x97\x17\x02\xe4\x9c\xa6\x2e\x80\x50\x54\x0d\x41\x21\xd2\x42\xf2\xee\xab\x1b\xd1\x34\xe6\x0b\xf1\x1b\x3e\xc7\x1f\x77\x65\xa9\x7c\x0e\x09\x84\x55\xe5\x9d\x22\x35\xd6\xb3\x7e\x7c\x9f\x5b\x21\xfa\x11\x2c\x3b\xa3\x9e\x4e\xa2\x00\x61\x4f\x58\xdf\xb3\xeb\x7b\x83\x6f\x0b\xec\x1d\xdd\x43\x8d\x14\x22\x45\x0a\xe7\xde\xd1\xdf\x9d\x71\xe5\xd9\xbc\x8f\xa3\xb6\xe6\xf7\x84\x46\xce\x7c\x79\xd0\xbc\xfb\x1c\x2d\x26\xc6\xfe\xce\x68\x68\x2d\xff\xc6\x0a\x9c\x6e\x0a\xd0\x5f\x2a\x09\xf2\x1d\x75\x23\x25\x1c\xb0\xc3\xd0\x8e\xfb\xbf\x8a\xc1\x63\x39\xd7\x17\x02\x4d\x67\x60\x24\xc1\xee\x3c\x1f\x62\xc5\xae\xab\x7f\xff\x93\x7c\x57\x45\x4d\xf7\xbd\x96\xf9\x84\x4a\x2a\x39\x99\x58\x41\x8a\xaa\x6f\x18\x48\xbe\xbf\x7b\xf1\x29\x2c\x24\xeb\x5c\xd8\xea\x56\x34\x0c\x5b\xeb\x26\x88\x02\x4a\x69\x53\x27\x5b\xe6\xef\xd1\xb7\x1b\xa8\xbe\x6e\xb7\x7f\x0c\x65\xa7\xc5\x11\x1b\x96\xc4\xc1\xf3\x9c\xb7\xaa\xf8\x3f\xda\xae\x8d\x14\x8d\x7a\x8a\xf4\x0a\xe9\xe6\x51\x91\x9f\x7c\xe2\x8c\x8b\x2b\x6e\x45\xe4\xd3\xd5\x6f\xdd\x54\xd0\x0c\x24\x12\x79\x0c\xbd\x6f\x80\xe1\x08\x19\xe0\xb8\xf3\x7c\x84\xfa\x00\x49\x88\xad\xaf\xcc\xbb\xc2\x1c\x63\xd6\xbf\x2e\x73\x2d\x9d\xd6\x3b\xd4\x9b\x04\x12\xb9\x67\x4e\x1e\x88\xf6\x14\x2f\x7f\x86\x7f\x1f\x26\x89\x1b\x22\x43\x04\x23\xce\xc4\xdb\x91\xb6\x1c\x2a\xbc\x5c\x8f\xbd\x46\xb8\xb9\x35\x96\xfc\x51\x60\x68\x31\x36\xe2\x11\x29\x82\x27\x96\xeb\x5e\xa0\x88\xe0\xa7\xd8\x12\x1b\x25\x57\x2e\x3e\xc3\x77\x43\xd1\xff\x6d\x8d\x1c\x35\x36\x43\x9a\x10\xe8\x4a\x66\x5f\x2c\x75\xee\x73\xcd\xc6\xff\xac\x4c\xc2\x87\x24\x46\x9f\x79\x70\xb4\x75\x07\xdf\x3e\x1b\x14\xd4\x77\xae\xc2\xbb\x20"}, +{{0xe1,0x36,0xf3,0x98,0xa6,0x05,0xd1,0x34,0x57,0x84,0x8c,0xea,0xd0,0x7c,0x72,0x86,0xf4,0x2e,0x2f,0x28,0xdf,0x8c,0x12,0x8a,0x3d,0x0b,0xb7,0x2b,0x29,0xaa,0xcc,0x19,},{0x6a,0xa5,0x04,0x5a,0x66,0xf7,0x72,0xa5,0x71,0xfe,0x3e,0x42,0xd1,0x17,0xef,0xcd,0xf6,0xc4,0x95,0x91,0x99,0x61,0x86,0x01,0x2f,0xa9,0x8f,0x7c,0x48,0xe0,0xcd,0xa7,},{0x75,0xa4,0x5c,0x6b,0x95,0x66,0x89,0x98,0x29,0xb4,0x1e,0xe5,0x17,0xb7,0x04,0x5a,0x47,0x3a,0x4f,0x7a,0x26,0x41,0x43,0x9b,0x5d,0x7c,0x56,0x73,0xe0,0x0d,0x8f,0x5c,0x06,0x6f,0x12,0x91,0xf8,0x5d,0xea,0xda,0x05,0x02,0xbd,0x16,0xe9,0x70,0x9f,0x82,0x7d,0x47,0x51,0xf2,0x87,0x38,0x62,0xe8,0x21,0x9e,0x57,0x74,0x6a,0x19,0xa9,0x00,},"\xd3\x28\x57\x9d\xe4\xc5\x37\x2f\x3b\x38\x2c\x48\x01\x1b\x2d\x4c\x60\x29\xf9\x04\xf3\xa3\x3e\x07\xd0\x83\xd7\xe2\xb0\x37\x56\xaf\x2c\x4c\x97\xa2\xd6\x6c\x10\xec\x41\x54\xd8\x74\x79\x20\x42\xb6\x46\xe4\xaa\xe5\x10\x1d\x50\x1b\xd1\xbf\x6f\x51\x17\x51\xd0\xaa\xf8\x21\xcd\x7c\x0b\x3e\xe6\xd0\xd7\xc6\x90\xa2\x77\x7f\xe1\x6b\xdc\x7e\x49\xb7\xda\x4b\xbb\x4c\xce\x3b\x61\x8e\xe9\xb6\xf2\xe3\xa1\x92\x40\xcd\xb7\x07\x33\xb9\x84\xb1\xc9\x40\xec\x66\x96\x0b\x72\x8c\xbb\x87\x4b\x80\x64\x31\x23\x72\x2d\xb9\xdb\xbe\x88\x32\x20\x08\x93\x1b\x1c\x89\x4e\xf5\xd2\x10\x99\xe6\x3e\x7c\x65\x00\x7a\xcd\x61\x78\x4d\xb4\x99\x4a\x2f\xb4\x0c\x3e\xfe\x9c\x47\xfa\xd6\x37\x63\xdd\xe0\x6f\xa0\x17\xa2\x6b\x82\xe7\x1b\x9d\xaa\xbc\x4f\xf0\xf6\xc7\x9b\x8c\xa7\xcc\xb4\xdc\x20\x31\xbe\xf1\x08\x73\x67\xc7\x08\x69\x74\xa0\x05\x66\xde\x41\xa7\x1e\x11\xd9\x93\xab\xe4\x33\x56\x98\x92\xb8\xf7\x5d\x76\x37\x99\x32\x45\xc8\x84\x47\x8a\xbe\x3f\x95\xf4\x4b\x0a\x4b\xbe\xde\xfe\xf8\x90\x6b\x75\xe0\xd3\x40\x20\xae\x53\x64\x55\xb0\xe0\x6f\x9b\xfe\xe1\x1e\xc9\xb8\x60\x4b\xac\x2c\xc6\xeb\xe0\x8c\x8f\xd5\xf5\xcc\xcc\xcb\xc1\x61\x7b\x7c\xf6\x9a\x3c\x51\x2e\x1f\x0b\xdb\x58\x5d\xf5\xe1\x27\x43\x06\x1f\x7c\x20\x53\xbc\x37\x14\x43\x61\xc0\xb3\x5f\xd3\x9d\x56\xb1\xef\xaf\x92\xc6\x10\x36\x01\x93\xec\x20\x59\x8b\x82\x85\x80\x50\xa6\xd9\x9e\x08\x2b\xce\xfd\xbd\x53\x18\xee\x5e\xfb\x3b\x26\x0f\x32\x76\xf3\xc7\x3f\x9c\x24\xce\x0c\xda\x33\xc7\xac\xc5\x0c\xa5\xdd\x61\xbd\xb8\x5d\x79\x38\x25\xf6\x73\x2a\x6e\x33\x0c\xe6\x72\xac\x44\xfe\x6b\x2b\x9a\xfe\x6e\x2e\x96\x5c\x02\xd2\xa1\xfe\x0b\x57\xcb\x1b\x31\x7c\x1d\x31\x3e\xfd\xc3\x56\x49\x2f\xe8\x96\xfd\x14\x9d\xae\x51\xc9\x5c\xcd\xbb\x7d\x11\xf7\xd6\x10\xe0\xc6\xe2\xfd\x3e\x57\xfc\xfe\xf1\xc5\x7c\x71\x19\xa0\xaf\x6c\x78\x21\xfe\xcd\xb8\x9d\x80\x30\x2b\x49\xfa\xd4\x17\x43\xf3\xd2\xd7\xa0\x75\x15\x4b\x31\x43\xe5\x1a\xeb\x94\x7d\x4b\x5e\x8b\x7e\x4c\xa8\x6f\xec\x3e\x80\xbd\x9a\x78\x6e\x4e\x46\xed\x1e\x6e\x9f\x7e\x0b\x63\x52\x66\xd9\xfa\x09\x7a\xa9\xe2\x0f\x32\xe3\xd2\x77\x2d\x7c\x1f\x00\x8b\xcd\xd3\xf9\x2c\x72\x83\xc5\x77\x90\xc3\x62\x2c\xba\xd3\xca\x35\x80\x3c\x45\xc8\x69\xdc\x37\x7f\xf3\x6b\xd7\xc0\xe6\xf1\xbb\x89\x2f\x73\x29\xa6\xe0\x8d\xf1\xdb\xeb\xc8\x1d\xc7\xb1\x15\xf8\x52\xe3\x6a\xe5\xd9\x28\x72\x5f\xa7\xc6\xfb\x9f\x28\xb0\xfb\x39\x4f\x9e\x38\xfd\x87\x62\x5c\x5f\xa2\x3a\xab\xa4\x70\x54\xe8\xcf\xea"}, +{{0x97,0xb6,0x70,0x2e,0x24,0x68,0x05,0xdb,0xcf,0xc7,0xfa,0x42,0x4a,0x8c,0xaa,0xbc,0xf2,0x62,0xd4,0x66,0xa0,0x5e,0x0d,0xd2,0xd4,0xe7,0xc3,0x74,0xd5,0x7d,0x52,0x51,},{0xa7,0x16,0xc3,0xd5,0xce,0x78,0xf4,0xd9,0xc5,0xbe,0xe3,0x44,0x7d,0xda,0xf4,0x88,0x1c,0x98,0x6e,0xfd,0xf6,0x67,0xac,0x89,0x77,0xb4,0xfb,0x69,0xb5,0xa7,0x11,0x0a,},{0x90,0x00,0x55,0x41,0xdc,0xc1,0xd7,0xab,0x83,0x7f,0x4d,0xe5,0x39,0x3f,0xad,0xd6,0xa9,0x2b,0x26,0xa7,0xd9,0x3a,0xf3,0xf6,0x69,0xe0,0xf1,0xbf,0xd6,0x21,0xcb,0xd0,0x0c,0x8a,0x23,0x05,0x6d,0x2d,0xa6,0x78,0x65,0x57,0xc8,0x28,0xa4,0x9b,0xe1,0xe4,0x02,0x1d,0x99,0x31,0x12,0x35,0xac,0x0d,0x4d,0x56,0xee,0xfc,0x7c,0x95,0x36,0x05,},"\xea\xa8\x6c\xf7\x6f\xcb\x65\xc6\xf9\xfc\x20\x8a\xc3\x6f\x28\xb2\x00\xd3\xb4\x03\xac\xa7\x32\x07\x46\x1d\x8d\x96\xaf\xa2\x46\xd7\xc6\x9d\x17\xa7\xa9\xbf\x77\xf0\x55\x43\x56\x3a\x7d\x3e\xca\x1d\x40\x79\xe2\x29\x38\xab\xa1\xf6\xe9\xe0\x4b\x49\xfb\xc8\xed\x6f\x63\xb5\x99\x73\x0d\xe9\x97\x98\x31\xc0\x2f\x8c\xba\x61\xe5\x55\x60\xd7\x11\x0d\x4c\x6e\x61\x67\x97\x06\xa7\x15\x5d\x5a\x67\x3c\x54\xd1\x6f\xe4\xd2\x28\xc2\xec\xa7\x54\x6f\xaa\x13\x39\xf2\x6d\x7a\x0b\xb4\xee\x33\x96\x11\xaf\xde\xc9\xa6\x8f\x5f\xf5\xb5\xd2\x03\xb6\x00\x53\x3a\xd5\xa3\xb3\x68\xc8\x5d\xa1\x15\x63\xf0\x98\xcc\x26\x87\x1e\x7f\xa9\x9a\xef\xd3\x8c\xc2\x61\x51\xdb\x3b\x0b\xae\x38\xdb\x6a\x87\xb6\x78\x9e\x58\x40\xb1\x08\x84\xaf\x51\x1f\x3e\xcb\x3e\xcb\xf9\x4f\xf8\x6f\xdb\x90\x55\x05\xa8\xc3\x4b\x2a\xa6\x1f\xf2\xec\x9e\xc8\xfe\xbd\x1d\xfe\xd0\x96\x5b\x6f\xc5\xb9\xf8\x86\x9d\xc3\xa4\x75\x59\x97\x4a\x88\x22\x99\x67\x06\xda\xef\xbc\x6c\x5b\xf9\x84\xce\x06\xb0\xd3\x2b\x31\xcf\x9d\x8a\xd1\x36\xae\xd4\xb0\x52\x58\x6d\xce\x70\x73\xb7\x67\xb2\x34\xe4\xa3\x7b\xeb\xbc\x39\x3d\xd2\xe0\xf7\xd1\x55\x17\x35\x48\xc3\x8a\x15\x83\xef\x94\xe0\xaa\x84\xe7\xfc\xe0\x4f\xcc\x9b\x4e\x30\x0a\xd0\x99\x44\x9a\x49\x23\x2a\xbd\xcf\x3d\x1a\x6e\x6f\xca\xb6\x96\xf5\x99\x6f\x9b\xd1\xb9\x48\x5d\x07\x47\x55\xac\x5b\x42\x97\xfe\xe3\x12\x4c\x7c\x03\x97\x6a\x40\xd5\x70\xbe\xae\xc2\xfa\xc9\x92\x33\x9f\x88\x5f\x74\xd4\x0e\xd4\xac\x87\xa4\xf4\x0c\xef\xbc\x48\x64\xf4\x4c\x36\x83\xaa\x8f\x10\x26\xe2\xc3\x7a\xef\xfc\xeb\xfd\xfe\x24\xdd\x0b\x01\x9c\x36\xa7\x98\x88\x20\x30\x04\xb2\xad\x83\xe8\x92\x21\xf3\xf6\x36\xf4\x55\xbb\x64\xe1\x7d\x17\x54\xc7\xc6\xdd\x7f\xc0\x9a\x0d\x65\xdd\xdd\xed\x46\x22\xfc\x4f\x9f\xba\x07\x2b\x45\x10\x34\x35\xe1\x02\x20\xa5\x86\xf1\x52\x26\xd2\xeb\x37\x7f\x40\x64\xd3\xff\x37\xcb\xb4\x70\x5a\x1f\xaa\xf5\xb3\x48\xf8\xc0\xef\x7f\xd1\x56\x4d\x42\x86\x88\xf5\x8f\x33\x92\x96\x7c\xf3\x96\xa8\xff\x2f\xd9\xe7\xb5\x17\xb7\xd6\xa5\xed\xe7\x44\x03\x73\xd8\xcc\x1a\x83\x99\x00\xe8\x4d\x42\x25\x42\x83\xd9\x69\x9c\x7c\xa3\x7e\x47\x76\x92\xa3\x49\x40\x08\xb8\x04\x44\xc5\xcf\x61\x4c\xbb\xc1\x69\xbf\xb9\x29\x63\x03\xc6\x45\xe2\xce\x28\xd1\x68\xdc\x6c\xba\xef\xae\x9c\x73\x19\x1f\x57\x15\x1a\xa4\x73\x00\x9d\x29\xe1\x80\x0b\x10\xf4\xc4\x98\x60\x9b\xa1\x15\x20\x98\x5c\x78\x09\x20\x58\x69\x6f\xdb\xca\x9c\x02\x0e\x2d\xfb\x8a\x04\x3a\x3d\xe8\xe4\x52\xd5\x8c\xd1\xad"}, +{{0xd1,0x52,0x8c,0x14,0x06,0xa6,0xe4,0x94,0xa0,0x2f,0x63,0x53,0x05,0xfa,0x74,0xd7,0x45,0xc6,0x93,0x27,0xfd,0x31,0xb7,0xd2,0xc2,0x62,0x3d,0xe2,0xc0,0x30,0xed,0x85,},{0x0c,0xfe,0x36,0x9c,0xf9,0x3d,0xaf,0x6d,0x53,0xef,0x02,0x8d,0xdb,0x9f,0x00,0x04,0x43,0xb0,0x97,0x2f,0xe2,0x53,0x2f,0x83,0xa4,0x1c,0xe6,0x57,0xc1,0x83,0x6c,0xa3,},{0xb8,0x39,0x9b,0xc3,0x32,0x6c,0xba,0x0a,0x93,0xa4,0x24,0x97,0x16,0x8b,0xf5,0x7f,0x91,0x06,0xee,0x43,0xd3,0x9b,0xf0,0xfc,0x86,0x68,0x51,0x99,0xdc,0x6e,0x0a,0x13,0xb9,0xc7,0x24,0xef,0x17,0xe7,0x88,0x2a,0xf8,0xc2,0xeb,0x70,0xf6,0xc9,0xe4,0x2d,0xfa,0x2f,0xbf,0x0c,0x1c,0xb5,0x00,0x2b,0x58,0xf1,0x08,0x66,0x19,0x73,0x3e,0x02,},"\xab\xb3\x67\x3f\x3f\xa1\x7a\x33\xa7\xaf\xf7\x6e\xac\x54\xe7\x68\x7c\x04\xbc\x84\xf7\x66\x65\x1a\x8b\x24\xba\x22\x94\x79\x08\xb0\x4c\xa4\x59\xfe\xb9\x8a\xce\x7c\xab\x1e\x74\x33\xa6\xa6\xbe\xff\xd8\xd9\x50\x4e\x29\x91\xda\xa0\x64\x4d\x61\xb8\xb2\xe4\x54\x48\xf5\x4d\xf8\x81\x3f\x50\xc4\x18\xb4\x8f\x49\xe1\x03\x4e\x85\x1c\xbe\xc3\xef\x0a\x18\x50\xef\x72\x67\x33\xaf\xaf\x68\xe1\xa4\x61\x04\x16\x51\xc1\x38\xd5\x4e\x4e\xf7\x81\x87\xaf\x9a\x73\x42\xf7\x12\x87\x27\xf9\x03\xbf\x4f\xc5\xef\x3e\x40\xc6\x4e\xc2\x6f\x89\x2f\x59\xad\xd9\x8f\xe3\x94\x76\x5a\xaa\x7d\x09\xca\xe8\x1b\x9f\x69\x9a\x9d\xd8\xbf\x2e\x2f\xe8\xe1\xec\x78\xfc\x88\x4e\xaa\x0d\x2d\xbd\xbf\xb8\xc1\x68\x83\x3e\xe0\xd2\x18\x03\xcc\x35\xdc\x62\x8d\x7c\x07\xe0\x44\x04\xfb\x60\xe8\xc4\x90\xa8\xdd\x34\xed\xbc\xba\xaf\x80\xcc\xda\xe3\xf7\xd3\x73\x9e\x0e\x89\x70\x23\xee\xb5\xb1\xa8\xc0\x0a\x96\x73\xc5\x92\x58\x24\x0d\xdd\x44\x20\x65\x0f\xe5\x77\x1f\x7e\x28\xcb\x23\x99\xf5\xe1\xe0\x2a\xd0\xb6\x43\x2d\x9b\x49\x60\x8f\xcf\x0b\x1c\x0d\x7c\x41\x2a\x44\x52\x55\xb8\xba\xdc\x53\x21\xc2\x4c\x1a\xc9\x2c\x79\xa0\xba\xcc\xb9\xde\xff\xed\x02\xd1\x2f\x55\x36\xcd\x59\x5d\xc6\x60\x83\xb3\x3a\x36\x03\xa9\xd1\x6e\xce\xa2\xbf\x38\xc4\xf2\xaa\xf5\x70\xf3\x0d\x21\x16\x2b\x2e\xfd\x7e\x4d\x5e\xbf\x1e\xca\xe9\x58\x8e\xee\x36\xdd\x9d\x3d\x8e\x3b\xe7\xbc\x6d\x4b\xc2\x18\x56\x22\xf1\x1d\x1d\xa7\xc4\x9c\x93\xe6\x23\xac\x56\xfe\xe7\xe3\x70\x6d\xb8\x31\x3c\xf9\x26\xbe\x92\xe5\xc8\xa5\x39\xfd\x16\xb0\xf4\x38\xda\x8e\x51\xa5\x1f\x2d\x27\x64\x03\x56\x12\x4e\xf7\xbe\x2f\x91\xff\xa1\x79\x6a\x91\xb1\x23\x01\x93\x4d\xde\xf0\xc7\x93\x8a\x7a\x45\xf3\x6f\x53\xb6\x32\x2d\x9c\x8f\x9d\x27\x5e\x1c\xd2\xc0\xf1\x29\xf8\xab\x8d\x74\x15\x5b\x5d\x9e\x5c\x15\xc0\x15\xb0\xb0\x00\x03\xb2\xbd\xdf\xa0\xbc\xfc\xc6\x93\xa1\xdf\xcb\x4f\x53\xda\xec\x12\x6d\x16\x69\xf3\x3f\x39\xad\x05\x51\x9e\xf7\xc5\xce\x40\xe6\xf4\x57\x3c\x24\x7a\x32\xc4\xa0\x16\x28\x31\x35\x2f\x6d\x55\x8f\xf5\x83\x6a\x53\x17\xdb\xc4\x51\x5b\x3d\xf2\x69\xa8\xac\x76\xd6\x43\x6f\x26\x4b\x64\x56\x1e\x79\x68\xb5\x82\x21\x08\x48\x7b\x04\x5c\x92\xd6\xc6\x14\x2a\x1c\x28\x55\xb3\x8b\xee\xbd\x64\x25\x65\x12\x3c\xc8\x27\xcb\x18\x31\x19\x9e\x6f\x12\xa7\xe4\x23\x68\x56\xb9\x4d\xad\x73\x8f\x69\xd1\x10\x6e\x77\x35\xd7\x11\xf7\xc6\xa3\xa3\x37\x80\x41\xfc\x7a\x21\x10\x3b\xbf\x86\x69\x07\xd4\xed\xdd\xaf\xa0\xe7\xf1\xbb\x5f\xfd\x41\xa6\x0d\x64"}, +{{0x51,0x23,0x40,0xf9,0x61,0xf1,0x42,0xd1,0x91,0x5e,0x85,0xfe,0x4f,0xa0,0xf5,0x51,0xf8,0x08,0x92,0xe7,0x5a,0xcc,0xce,0x7c,0xd1,0x86,0x9e,0x6e,0x2c,0x9e,0x80,0x15,},{0x0c,0xa0,0x26,0x04,0xfa,0x87,0xe2,0xc2,0x05,0x06,0x25,0x1f,0x07,0x92,0xcd,0x21,0x25,0x85,0x6f,0x0a,0xb1,0x6d,0x66,0x3f,0x28,0x11,0x96,0x3b,0x1f,0x2d,0x81,0x72,},{0x6b,0xb4,0xd9,0x75,0xaf,0xae,0xf4,0x1e,0xa9,0xef,0x08,0x5a,0x68,0xc5,0x68,0xa0,0x5d,0xa3,0x7e,0xf2,0x1d,0xad,0x46,0x4e,0xd8,0x6a,0xc0,0xd4,0x08,0x0e,0x7d,0x01,0x29,0xfb,0x02,0x31,0x31,0xec,0xa5,0xf7,0xad,0xb2,0x58,0x6a,0x18,0xbe,0x40,0x56,0x2f,0xa2,0x76,0x4c,0xa8,0x07,0xe6,0x70,0xa0,0x59,0x6a,0x5c,0x54,0x7b,0xc0,0x01,},"\xaf\x37\xb2\xc7\x58\x7a\x8d\x5b\xc8\x95\xcd\x35\x77\x46\xab\x03\x55\x2a\x0a\x56\x1a\x29\x3d\xc7\x16\x4e\x39\xb6\xa1\x33\x3a\x92\x0b\xb6\xda\xca\x60\x06\x67\x6e\x99\xbb\x7e\x92\x8f\x9e\xa3\x91\xe5\x48\x02\xa8\xd3\x15\x96\x28\x9f\xb9\xbf\xe3\x00\x00\xcf\x52\xeb\xf0\xc1\x24\xa5\x89\x5b\xce\x33\x98\xc1\xbf\x53\x56\xbe\x82\x61\x9b\x8d\xdc\x15\xa7\x7c\xa9\x22\x49\x4b\xdb\x04\xf5\xc2\xe1\xb6\xe8\xff\x77\xae\x74\x9f\xaf\x2b\x8a\x41\xd8\x22\xc1\x7c\x06\xdf\xb7\xa5\xf9\x43\x4d\x8b\xd7\x15\xec\x87\x78\xe8\x0b\x81\xd2\xe8\xd0\x62\x98\x74\x86\x90\xc6\x55\x52\x83\xc9\x8b\xb9\xb1\x9b\x92\x46\x66\x7b\xc4\x10\x46\xff\x98\xc2\xc3\x5d\x16\x1e\x1f\x4d\x69\xd2\x54\xec\x5a\x07\x6f\x25\xbd\x5c\x7e\x2c\x98\xca\x3c\x09\xd8\x08\x33\x96\x2c\xf9\x66\x02\x87\x88\x40\x96\xeb\x30\xc4\x6c\x54\x17\x41\x06\xaf\x4e\x29\x79\xa1\x12\xf3\xe8\x94\x4e\xaa\xf7\x66\x9c\x40\xd5\xaf\xb9\x1a\x02\x4a\xbb\xeb\x14\x66\x4e\x30\x89\x03\xe4\xd2\x6d\x70\x09\x44\x6e\xe2\xe8\x30\xab\x5e\xca\x0d\xbb\xc5\x13\xfb\x4e\x04\x35\x1d\xf2\xf6\x74\x18\x64\xfb\x23\x71\xb2\x50\x2b\xe4\x3d\xc1\x5f\xc0\x44\x31\xff\xf5\xeb\x8d\x4b\x68\xd7\x24\x62\xae\x32\x2e\x57\xba\x2d\x4a\xdd\xdf\x15\xa1\x90\x2c\x21\x13\xae\xbd\x3b\x5d\x61\x29\x17\xc1\xbb\x73\xe7\x08\xad\x54\x18\xe7\xd4\x5e\x4b\x72\x80\xfc\x88\x96\xab\x80\x85\x3f\xf5\xf8\xe9\x8f\x26\x55\x3f\xc7\x8e\x30\xb3\xb0\xd7\x27\xbf\x6d\x06\x4a\x8f\x32\x88\x87\x68\xc5\x1e\xbb\x61\xb2\xc6\x00\xb4\x02\x8a\x77\x06\x0f\xeb\xbb\x02\xeb\x3d\x20\x17\x80\xe7\x45\x66\xc8\x6a\x34\x03\x18\x36\xbc\xe9\xea\xda\x81\xe5\xd0\xf3\x39\x60\xcb\x2d\xf0\x8a\xff\x3c\x97\x49\x21\xfc\x9b\x7d\x3a\xa7\xc8\x1e\x9c\x67\x1e\xd6\xd3\x3e\x7a\xe5\xed\x03\xa5\x41\x7d\x7e\x5c\xd6\xfa\xac\x91\xb5\x4b\x8f\x79\x2f\x48\x28\x3c\x60\x64\x7d\xe3\xda\x81\x6c\xa9\x75\x6c\x5b\xfe\x1b\xb8\xb5\x97\x9e\x57\x54\x01\xbd\xa3\x4e\x9c\xbc\x4d\x77\xe7\x11\xd6\xb7\x3b\x82\xda\x19\xda\x47\x3b\x55\xe8\xe7\x2d\x34\x1b\x2d\x85\x03\xe4\x86\x09\xbe\x0f\xe2\x91\x44\x4c\x28\x36\x69\xe5\xde\xad\xea\xf5\x2a\xa8\xec\x48\xda\x83\xf5\x32\x8c\xc0\x99\xfb\x41\xf8\x2b\xec\xdd\x58\xd0\x4b\x1d\x66\x20\x3d\x73\x7b\xed\x06\xcf\x21\xc9\x78\x19\xac\x13\xed\x71\x1c\xa2\x17\xa5\x7c\xf7\xd8\x0f\xf0\x82\xaa\x1a\x1c\xf8\xfe\xa5\x55\xcd\x2e\x47\xe4\xdd\xab\x5e\x3f\x99\x41\xad\x4f\x77\x5f\x49\x41\x9d\xca\xdb\x5b\x00\x4b\x68\xca\xf4\x5b\x27\xef\x49\xba\x14\xfb\x52\xb0\x9f\x1b\x18\x5b\xe9\xf9\xc7"}, +{{0xb1,0xb6,0x36,0xe9,0x57,0x57,0x4c,0x21,0xa9,0x57,0xa4,0x5b,0xd1,0x95,0xc6,0xf9,0xfe,0x4c,0xc1,0xc5,0x7e,0x84,0x13,0x4d,0x39,0xb4,0x2e,0x1a,0x84,0x32,0x9e,0xdb,},{0x95,0xe7,0x7b,0x15,0xdd,0xa4,0x7c,0xaf,0x69,0xb7,0x28,0x88,0xdd,0x69,0x96,0x1b,0xac,0xbe,0xc3,0xbc,0x75,0x35,0x30,0x03,0xe8,0xbf,0xf0,0xa4,0x3d,0xdf,0x4b,0x7a,},{0x76,0x3c,0x7d,0x0d,0x46,0x87,0x8e,0x5c,0x7e,0xcf,0x71,0x04,0xfc,0x1f,0x22,0x30,0xe4,0x61,0x78,0xa2,0x7c,0x75,0xf1,0x96,0x16,0x9c,0x02,0x79,0xed,0xb0,0x1c,0x28,0xfc,0xde,0x3b,0x0d,0x5b,0x86,0x35,0xcf,0xe3,0x39,0xfb,0x23,0x27,0x74,0xb2,0x20,0x6d,0xab,0x8a,0x46,0x0c,0xe4,0x17,0xab,0xf4,0x90,0xbb,0xfa,0x78,0x5c,0x02,0x05,},"\xe2\x5d\x32\x9c\xad\x83\x64\xd2\xde\xc2\x43\x73\xe9\x2d\x9d\x50\xfc\x7a\xbe\x8f\xdc\x3d\x0b\x4e\xe5\x7e\x1c\xfa\x5b\x7c\xd5\x8c\x23\xbe\x91\x8f\x05\x17\x9b\xa8\x41\xb6\x1e\x18\x00\x34\xca\x7e\x74\xd4\x9b\x0a\x1a\x2c\xeb\xb4\xbe\x65\x34\x4c\x91\x3c\x46\xd3\x26\x52\x33\x6e\x6b\xda\x4e\xfa\x3f\x58\x73\x0d\x39\xa6\x33\xa1\x4c\xa3\xd9\xa6\x2a\xbb\x0a\x73\x98\xcc\x29\xaf\xf9\x16\xee\xea\x2e\x7c\xaa\xc8\x08\x45\x56\x2f\x73\xd4\x03\x0f\x9c\xab\x0b\xf1\xc6\x40\x7f\x54\x01\x51\x3e\xf8\x7f\xe6\xdc\x09\x9d\xbc\x5d\xfc\x33\x52\x91\x1c\x07\xaf\x6c\x52\x3b\xef\x4c\xca\x78\x37\x96\x59\xe8\x80\x3f\x58\x59\x04\xee\x6e\xf6\xfd\xe7\x73\x66\xd9\x6d\x2c\xcf\x24\x8a\x53\x20\xd9\xb8\x29\x8b\x2a\x73\x36\x38\x79\x10\x7a\x02\xb4\x7f\x57\x21\x3a\x85\x20\x3a\xbb\xca\x5a\x41\x95\xf8\xaf\x3e\x35\x93\xed\x2f\xa3\x50\x4b\xb7\x6a\x3e\x1b\xe2\x4b\x66\xd3\x55\x66\x29\x32\xcb\x67\xdc\x88\x50\x3a\xfa\xf7\x62\xbf\xf7\x41\xba\x1c\xac\xe9\x7a\xc5\x8b\xaf\xad\x5d\x36\xc3\xaa\x02\xe0\xcb\xe2\x0e\x5f\x3d\xc8\x09\x2c\x51\x2e\xaa\x9c\x49\x43\x47\x4a\xad\x41\x99\x00\x76\x72\x1a\xd3\xf5\x3f\xb0\x8a\xc2\x29\x82\xed\x9b\x15\xc7\x51\xa9\xe2\x33\x82\xf6\xa6\x9c\x72\xe6\xe2\x44\xe0\xeb\x68\x1e\x6d\xd2\x28\xd3\x77\x4f\xcc\xb3\x7e\xb6\x23\x2f\x82\x5d\x16\x9a\x2a\xc8\xb7\xe1\x8a\x42\xcd\xaa\x4f\x2c\xf0\x58\x90\xbb\x0c\x59\x8c\xf8\xc3\x1f\x82\x9e\xf8\xca\x24\x35\xbd\xcc\xeb\x0e\x61\x93\xad\xa7\x84\x1e\xe6\x92\xf3\x0a\xed\xf8\x8b\x62\x73\x11\xb1\x38\xac\x78\xb3\x91\x3e\x06\xf7\xc3\x21\xca\xfb\x39\xd9\x01\xdf\xe1\x74\x30\xb1\xa2\x0b\xc4\x37\xa5\x55\xa5\x78\xfa\x31\xe4\xb6\x80\x79\x54\x45\x6b\xd4\xb0\x4d\x5d\x88\x79\x87\xbd\xf0\x4e\x0f\x14\xaf\x31\x41\xb2\x4c\x3a\x7b\x9a\xc7\x5a\xa3\x2e\x2f\xcd\x21\x71\xa1\x26\x09\xe1\x5e\x73\x09\x4f\xd0\x92\x21\xb4\xd2\x70\x90\xe7\x32\x19\xb6\x48\xbc\xaa\xbf\x38\x07\xc9\x28\x0b\x6c\x4a\xd7\x50\xa4\x68\xbe\x0e\x1a\xd3\xe6\xe6\x30\x16\xcb\x5c\xec\x3a\xad\xdc\x56\x89\xc2\x95\x5a\x2a\x8d\x5b\x89\x84\xd7\xc4\x43\x76\xfd\xd9\x4d\x3f\x5f\xf1\x29\x8f\x78\x17\x2b\x56\x59\x13\x70\x4e\x90\xe5\xac\x03\x8c\xb1\x72\x0e\x19\xb0\x80\xf8\x1b\x53\xd6\xa4\x5d\x45\x28\x53\x07\x11\xb6\x3d\xfe\x1e\x47\x81\xc2\x4d\x74\xae\xb2\xbd\x8a\x73\xfd\x2a\x99\x3c\x5b\x08\x91\x39\x21\x96\xac\x32\xc5\x23\x69\x99\x60\xd8\xb2\x3e\x01\x66\x4c\xf9\x02\x1d\x93\x92\x80\x50\xca\xf9\x7f\xb9\x85\x55\x45\x80\xe3\x33\x36\xa4\x56\x32\x47\xdf\x59\xef\x6c\xae\x53"}, +{{0x10,0xca,0x41,0x3d,0x70,0xeb,0x3d,0xb6,0xe3,0x37,0xf0,0xf1,0x1a,0xbc,0x07,0x5c,0x95,0x85,0x9e,0x82,0x5f,0x87,0x61,0x76,0x07,0x69,0x52,0xd2,0xf1,0x88,0x80,0x30,},{0x50,0x28,0xba,0x38,0xaf,0xec,0xc2,0x42,0x63,0x5f,0x6e,0x35,0x3d,0x5f,0x4a,0xfd,0x12,0x3f,0x86,0x0a,0x04,0x25,0x22,0x0e,0x96,0x65,0x52,0xa0,0x57,0x88,0x08,0x23,},{0x6a,0xec,0x02,0xdc,0x6b,0xdf,0xcb,0x67,0xf0,0xef,0xc1,0xfd,0x31,0xe2,0x3e,0x69,0xe3,0x71,0xab,0x38,0x02,0x50,0x5b,0x32,0x01,0xa9,0x5d,0xd5,0x25,0x41,0x7e,0xd1,0xa1,0x28,0xdb,0x4e,0x18,0x2c,0xb3,0x7c,0x28,0xf6,0x28,0x06,0x66,0x70,0x99,0xa8,0xad,0x48,0x0b,0x0a,0xc9,0xe9,0x4c,0x2a,0x7d,0x5a,0x0e,0x96,0xe2,0xa7,0x36,0x0d,},"\xea\x7f\xaf\x79\xf6\xff\x5d\x78\xa8\x23\xa7\x54\x34\x71\x34\xf1\xb3\xc3\xe9\x1c\xe5\x18\xfd\xd6\x33\xfe\xb4\xf0\x5d\x12\x5f\x05\xcb\x54\x33\x6e\xf5\x60\xe9\x2d\xeb\x68\x51\x12\xa5\xff\xcd\x3d\xfd\x39\x64\xb2\x75\x8c\xe4\x78\x5f\x6a\x34\xbf\xeb\x39\x78\x4f\x0a\xee\x55\x95\x5a\xeb\xd1\x2d\xdd\xa6\x41\xd0\x57\x69\xf7\x44\x02\xf7\x06\xda\xd2\x01\xc4\x4c\x91\x08\x1c\x7d\x7f\x65\xe7\xaa\x42\x46\xde\x6d\xc3\xed\x64\x96\xd1\x0f\x4a\x41\x20\x60\xd4\x93\xba\xc9\xae\xd5\xbe\x4f\x6d\x74\x22\x9e\x3c\x55\xeb\x68\x76\xe3\xbb\x2e\xd4\x1f\xa4\x50\x4b\x66\x70\xdd\xa8\xc7\x98\xf6\xda\xa2\x80\xd1\xaa\x72\x02\x11\x74\xf6\xc0\x1a\xec\x49\xb3\x21\xd8\x7f\x53\xac\xbc\xad\xcc\x46\x07\xd5\xb1\xe4\x5d\x63\xfc\x48\x1a\x6d\x90\x57\x6c\x87\xc1\x88\x0b\x2e\x8f\xf3\xe5\x90\xa9\x6b\xee\xe1\x80\x47\x68\xc7\x56\xbe\xb8\x6b\xf1\xde\x8a\xdc\x40\x8b\x1b\x8d\x66\x6f\x74\xba\x28\x63\x08\x22\xf9\x2d\x18\xb0\x56\xae\x37\xce\x02\x93\xee\x61\xb9\xe8\x0f\x33\xac\x26\x96\x71\xbd\x62\xa4\x05\x9b\x24\xf7\xc1\xa4\x40\x80\x74\x40\xd5\xd5\x38\xa6\x54\x58\xad\xc8\x15\x87\x24\xb2\x5c\x12\x12\x7a\xa0\x34\x9e\x55\xf6\xe5\x5b\xc9\x20\x78\xfd\x1e\xf2\x74\xc2\xaa\x79\x19\x05\x76\x6b\xe3\x94\xa2\x62\x8f\x7b\xbd\x1a\x32\xda\x5e\x48\x74\x46\xbb\xef\xae\x88\xfa\x6c\xf3\xf7\xb4\x99\xf1\x31\xfa\x19\x31\x3d\x13\xb2\x80\xad\xca\x50\xf7\x78\x02\xd1\x73\x31\xb3\x81\x68\x3b\x5e\x7e\xda\xb9\x94\x73\xed\xd3\x1d\x77\x44\x34\x88\x21\x41\x35\xfd\x6f\x26\x44\x50\x93\xe9\xe2\xaf\xf7\xd7\xe8\x92\x33\x7f\xdc\x87\x79\x06\x5d\x4d\x97\xd6\xd6\x73\x57\x67\x94\x95\x8d\xbf\xa6\xc5\x0b\x1b\x13\xac\x39\x60\x7c\x1e\x66\xef\x96\x29\x76\x10\x71\x15\x5f\xbc\xa6\xf3\x6e\xb0\x2c\xee\xae\x16\x36\x7f\xea\xc0\x74\x76\x90\x8c\x84\x7c\x9a\x53\x3e\xf6\x8c\x94\x31\x1f\xa0\x89\xff\x28\xfb\xd8\x78\x09\xb0\xd3\x87\x6b\x43\x1d\x9a\x18\xb2\x02\xf9\xa4\x04\x9a\x05\x77\xb8\x17\x76\x10\xdd\x02\xe5\xc5\x20\xec\xa9\x55\xe8\x03\xc3\xad\x4f\x50\x97\x6f\x7c\x2e\xa8\xaa\x3e\xe4\x83\x6a\x19\x85\xdf\x0a\x4f\x16\xef\x46\x98\x15\x95\x41\x98\x97\x99\x35\x60\xaf\x82\x65\x1c\x2b\x49\x4e\x68\x0b\x37\x80\x2e\x75\x37\xef\x68\xa5\x75\xc3\x4f\x85\x88\x06\x3e\xe0\x19\x72\x06\xd9\xa3\x2b\xb4\x89\x0e\x7c\x21\x6a\x4d\x33\xfe\xca\x36\xb5\x49\xe5\x32\xfe\xa6\x85\x56\xe7\x54\x0a\x4f\xb1\x69\xd4\x9f\xc5\x53\xb2\xe6\x70\x0a\xe4\x2d\x9a\x51\x6e\x68\x16\x0a\xcf\x6b\x27\x0c\x77\xca\x5e\xc2\x6e\x5a\xd5\xdc\x75\xc2\xc3\x93\xe2\x99"}, +{{0x1f,0x0a,0x10,0xa2,0xcb,0x11,0x19,0x17,0xb9,0xa6,0x7a,0x2a,0x1f,0x38,0xfb,0x86,0xf8,0xed,0x52,0x60,0x7d,0x1d,0x65,0x3a,0x45,0x7d,0x7f,0x47,0x18,0xd9,0xa7,0xde,},{0x70,0xc0,0x75,0xb2,0xe9,0x4c,0x4c,0x02,0xf4,0x5e,0x73,0x04,0x4f,0x24,0x39,0x97,0x41,0xb1,0x61,0xfe,0xb6,0xf6,0x9e,0xab,0x63,0x54,0x17,0x28,0x2a,0x4a,0x93,0x68,},{0xa4,0x24,0x5a,0xa3,0x39,0x5e,0x7b,0xad,0xa2,0xbc,0xdf,0x16,0x03,0x14,0x7c,0xc5,0xf3,0xf0,0xba,0x91,0xf4,0x0f,0xda,0xd8,0xf6,0xd3,0x71,0xc3,0xeb,0xef,0xb4,0xc1,0x50,0x1d,0x07,0x87,0x5b,0x57,0x6f,0x40,0x79,0x78,0x06,0xa4,0x84,0xc7,0xa3,0xf7,0x05,0x69,0xe2,0x32,0xb0,0xc9,0x9d,0x29,0xca,0x23,0xa2,0x33,0xb6,0x8e,0xdb,0x0c,},"\x4f\x6a\x43\x4b\xd5\xfc\x77\xf0\xf1\xb7\x04\x9c\x91\x85\x3c\xcb\xd8\x94\x39\x96\x2a\x60\x78\xa6\x74\xb8\x67\x54\x3b\x6b\x7d\x10\x55\x2e\xc1\x75\x8c\x52\x83\x04\x2b\xd6\xb4\xce\xa8\x8c\x95\x20\xdb\x04\x74\x6f\x08\x9c\xf3\xa2\x60\xfb\x0f\x33\x85\x8e\xfd\x6f\x68\x0d\xe5\xb7\x2d\x98\x76\x32\x4b\xa5\x90\x29\x91\x38\xf8\x5a\x76\xf5\xbe\x0e\x05\xe8\x85\x9c\x02\xb2\x35\x12\x55\x9c\x8b\xea\xfc\x9c\xfe\x90\x1b\x28\x3e\x15\xd1\x6c\x79\x2e\xb0\x3b\x92\x88\x0f\x6f\xf9\x7a\xa3\x8e\xee\xad\x3f\x4f\xd6\xc0\xa9\x21\x43\x23\xaa\x39\xa1\xc1\x65\x15\xe3\x0d\xbd\x08\xb8\x33\xee\x40\xa8\x14\xa2\x88\x09\xc8\x70\xe1\xd0\xa6\x2c\x37\x93\x2d\x54\x08\xfc\x6a\xfc\x63\xe7\x9a\x65\x5c\x5f\xe3\xd4\x02\x6e\xf0\x9e\x02\x99\xfb\xde\x5a\xb3\x4f\xce\xab\x14\x13\x0d\xc4\xbe\x00\x7e\x8e\x64\x44\xd7\xaa\xae\xc6\x2c\x87\x3d\xf7\x7e\x80\x10\x74\x3c\x31\xe8\x75\x7f\x1e\xae\x9e\xdb\x55\x97\xa1\xb5\xd8\x4b\xd7\x7a\xe7\x64\x2e\x1a\xca\x99\x87\x3a\x15\x2f\xfd\xe0\x68\xa8\xe4\xad\x92\x40\xb9\x03\x33\x27\x95\xe4\x0b\xb3\x28\x65\xe5\xce\x03\x43\x07\xa6\xc9\xfe\x33\x9a\x1c\x93\x77\x0d\xf5\xca\x46\x32\x9f\x6b\x09\x41\x97\x85\xcb\xf2\x84\x7b\x0c\x68\x32\x83\x71\x23\x85\x3a\xd9\x52\x65\x32\x65\xc5\xb5\x74\x0d\x19\x4e\x00\xf2\x3f\x9e\x96\x67\x91\xf0\x05\xf8\xbf\x55\xc3\x88\xc2\xbe\x9e\x21\x53\x89\x25\xf8\x55\x5e\x0d\xbd\x83\xbe\x07\x3d\xf7\x65\xaf\x49\x40\xe5\x9a\x37\x90\xb9\x83\x6b\xab\x79\x09\xe5\x67\x6f\xbf\x1c\x21\x26\xfe\x22\x6d\x78\x1a\x44\x33\x0c\xc0\x1d\x32\x83\x0f\xf8\xae\x00\xb9\x79\x2e\x39\x8c\x2c\xbb\x4f\xb8\x3a\x10\x05\xc2\x45\x54\x9a\x89\x06\x3f\xbe\x06\xc6\x2a\x48\xda\xc4\x3c\x51\x01\x24\x99\x94\xe9\x5e\x37\xf2\x4c\x1d\x8b\x3b\xc6\x73\x53\x8c\x46\x05\x5f\x80\x0d\xb1\xc0\xf9\x56\x86\x9b\x6b\x29\x7d\x99\x0f\x44\xf0\x5b\x50\xc7\xad\x6b\x85\x6f\x46\x21\x28\x58\x47\x1d\xd0\xd3\x93\x72\xb0\xdb\x75\x15\x73\xdd\xb6\xb5\xb5\x6b\xa0\x1e\x37\x1c\x78\xfe\x58\xdc\xd1\xbe\x53\x11\x2a\x6a\x73\xda\x9a\x6b\xac\x75\xd3\xc3\x9a\x1a\x70\x5a\x36\xf6\x40\xfc\xfa\xd8\xcd\x04\x07\x75\x94\xd5\x96\x85\xf6\xe3\x0d\xe7\x1d\xfd\x4a\x44\xc4\xe7\xc0\x4d\x6e\xc7\xc2\xe8\xbe\x12\x78\x5b\xb0\x5b\x29\xb3\x91\x51\xd3\x29\xf5\x87\xfd\xc3\x81\xc2\xdf\x0c\xef\x73\xfe\x0e\x3f\xd9\x20\x8d\x7c\xcb\x6e\x08\xd0\x2f\x42\xd1\xfe\xed\x27\x56\x1d\x5e\x32\x3a\xa1\x48\x62\x4e\x55\x2a\xbe\x87\x53\x2d\xe1\x5b\x7f\x42\xc2\x2c\x98\xe4\x05\x25\xb1\x74\x7c\xbd\x75\x8b\xfb\x26\xfd\x3e\xed\x3b"}, +{{0x7f,0x05,0xba,0xac,0xf1,0x67,0x58,0x3c,0xf2,0xfe,0x95,0x62,0xa5,0x06,0x99,0x1e,0xd9,0x87,0xf6,0x8f,0xfb,0x71,0x56,0x7c,0x7c,0xcc,0xe3,0xfc,0xc5,0x9b,0x78,0xb0,},{0x0d,0xec,0x39,0x52,0x85,0x2b,0x96,0xfd,0x75,0x58,0x7e,0x97,0x74,0x3f,0x9e,0x41,0xc0,0x9f,0xbe,0x6b,0xa9,0x81,0xbf,0xce,0xb4,0xeb,0xb8,0x89,0x2d,0x98,0x6a,0x16,},{0x0d,0xee,0xd2,0xdf,0x82,0xac,0xf4,0x52,0x9c,0x40,0x8a,0x02,0x93,0x1f,0x67,0x6b,0xec,0x5c,0xb7,0xad,0xe8,0x4e,0xbd,0xcd,0x57,0x8f,0x70,0xf9,0x71,0x38,0x2c,0xf3,0x11,0xbb,0x83,0x09,0x73,0x00,0x45,0x6a,0x55,0x8b,0xc4,0xc0,0x9d,0x89,0x83,0xff,0x13,0x49,0x3f,0xd6,0x11,0xeb,0x66,0xc0,0x43,0xbf,0x01,0x9b,0xad,0x6f,0x33,0x02,},"\xa2\x7d\x1e\xab\x05\x15\x09\x20\xde\xd1\xb1\xc2\x57\x8a\xf5\x82\xb2\x94\xf7\x83\x7f\xe4\xfb\x1a\x31\x69\xc2\x5e\xfb\x70\x63\x4b\xa6\x6c\x7e\x29\x91\xb3\xe7\x5c\xc5\x12\x48\x26\xa0\x3e\x05\x72\x59\xb5\xcb\x70\x62\x28\x78\x0c\xbc\x82\x75\xc3\x39\xf8\x34\x0e\x40\x2a\x66\x50\x32\xa4\xab\x65\x78\x27\xb1\xc3\x48\x1f\x75\x66\xd3\x69\x73\x5b\x82\xdb\x76\x28\xc0\x22\xb2\x12\x73\x0d\xb1\xe4\x7c\x9b\x2d\x9b\xc4\xd8\x1b\x23\x42\xd8\x9c\x6e\xaf\xc3\xe0\xb6\xde\x50\xd4\x84\xcc\xef\x11\x23\x8c\x8e\x2d\x24\x0d\xd5\x95\xdc\xef\x8b\x2f\xc5\x7b\x54\xff\x9a\x8a\x74\x11\x1f\x61\xf8\xa6\x52\xf2\x0e\xa0\x12\xc1\xad\xe3\xe2\x80\xec\xde\x29\x4c\x0e\x35\x71\x71\x90\x16\x2e\xc6\xa2\x26\x5e\x7e\x6f\x3f\x07\x04\xcf\x8a\xb1\xa0\x3e\x5c\xc9\x53\xe2\x92\x62\x91\xcc\xd4\xb0\x59\x0d\x5c\x20\x56\x8f\x94\xf9\xff\x0f\xe2\xab\x78\xcf\x9a\xe2\xc3\x8b\xcd\x49\x1e\x51\x8f\x23\xe9\xb6\x36\xf8\x80\x61\x5f\xc5\x60\x78\xe5\x12\xd7\x57\x7e\x09\x49\x7c\x11\x83\x45\x3d\x50\x81\xfd\x47\x37\xf2\x80\xec\x5e\x26\x7c\x45\x86\xb7\x8b\x70\xff\xfd\xfd\x73\x0d\x80\x9d\xf5\x60\xf2\xe3\x77\x21\x91\x84\x7b\xbc\x3f\x60\x4f\xb7\xf8\xca\x49\xee\xd3\x18\xb5\xe7\xd1\xf2\xb8\x3a\x10\xda\x0c\x85\x94\xb3\x39\xb6\x87\x1a\x57\x72\xdd\x64\x16\x8e\xcc\x27\xe2\x40\xa4\x5c\x76\x72\x5e\x7d\x55\xbe\xf3\x7e\x13\x5e\x3d\x9e\x0e\x34\xe3\x6c\x16\xe3\x4d\x77\x45\x9a\x55\x2f\x40\x74\xd0\x67\xa3\x1a\x3e\xd2\xa4\x8c\xde\xa4\x89\x5b\x10\xbd\xf1\x65\x6f\x4b\x7a\x41\x3c\x6a\x08\x8c\x64\x9f\xc9\xd7\xbc\x56\xab\xf6\x44\x35\x49\x12\x14\x19\x2a\x66\x70\xcb\x8b\x9c\x91\x7f\x8e\x1b\xc7\xb2\xcf\xce\x78\xd2\x8f\xbc\x3a\xfc\x2a\x50\xe9\x82\x13\xe7\xe0\x26\x37\x8e\x4e\xa7\x11\xd1\x51\xad\xaa\xa7\x19\xbe\xb8\x97\x46\x56\xc1\x0e\xbc\x7d\xe4\x6b\x19\xec\x82\x95\x1e\xf4\x6a\x8c\x68\xe7\xf4\x36\xe1\xb3\xeb\xed\xb2\xd0\x9b\x05\x75\xc9\x91\x4e\xad\x27\x96\xb5\x3e\x00\x61\xe2\x12\x99\x4a\xc5\x02\x6a\xea\x81\xec\x37\xc8\x13\x78\xf4\xcc\xfc\x46\x77\x00\x08\x79\x68\x59\x7d\xa3\x8f\xed\x52\xfa\x48\x09\x3a\xe4\xba\x10\x66\xc3\x1e\x3c\x7d\x85\x08\x09\x5b\xb4\x5c\x28\x01\x20\xf4\xaa\x69\xa2\x4f\x3e\xfe\xf1\xf7\x67\x98\x5a\xa1\xa3\x0e\x14\x08\x56\xf7\x6d\x15\x20\x73\x28\x78\x48\x7b\xe5\x3f\x71\x2d\xbd\x7d\x77\x9e\x31\x51\x01\x58\x8f\xd7\xdb\xdb\x13\x2f\x92\xc2\x75\x75\xac\x14\x86\xf1\x76\xc7\x90\x66\x1b\x01\x48\x39\x4e\x92\xff\xa3\xae\x6f\x8a\xfb\x2f\xaa\x2b\x7f\x4f\xbd\x0a\xd9\x1e\x75\x9a\x70\x2b\x3c\x70\x2b\x4d"}, +{{0xd0,0x0c,0x21,0x64,0x26,0x71,0x0d,0x19,0x4a,0x3d,0x11,0xcf,0xc9,0x0a,0x17,0xa8,0x62,0x12,0xe7,0xa0,0xe5,0x4b,0xaa,0x49,0xb0,0x16,0x9e,0x57,0xff,0xf8,0x3d,0x61,},{0xcf,0xe6,0xae,0x89,0x03,0xc6,0xc7,0x01,0xaa,0x30,0x46,0x95,0xc6,0x51,0xbf,0xd8,0x50,0x33,0x1f,0x9a,0xd4,0x81,0x63,0x3a,0xe3,0x70,0xc8,0x6d,0x7b,0xd1,0x3f,0xb9,},{0x15,0xc4,0x5c,0x19,0x42,0x97,0xe8,0x87,0x02,0x9f,0x49,0xd8,0xbd,0xf9,0xd6,0x10,0xdd,0x8c,0x34,0x79,0x9e,0x1e,0x92,0x30,0x26,0x9e,0x7a,0x58,0x92,0x89,0x38,0xcf,0x39,0x6a,0x02,0xcd,0x42,0x20,0x54,0x90,0x39,0x1e,0x1c,0x64,0x35,0x3f,0xb0,0x6b,0x9f,0x8e,0x9b,0x81,0x8a,0x9a,0x36,0x1c,0x20,0x4a,0x38,0x69,0x95,0xbf,0x3b,0x03,},"\x82\xf9\x78\x41\xb3\xba\x22\xdd\x9a\x44\x50\x83\x7e\xa7\xbf\x8d\x27\xa9\x73\x14\x70\xca\xbb\x0c\x20\x78\x03\x4b\xf2\x4e\x4c\x1a\x62\x90\xc0\x3f\x40\x02\xb8\x6f\xa0\x9f\x07\xb5\x20\x9f\x1f\x53\xd0\xec\xf4\xd9\xe9\x22\x3b\xec\x12\x5a\x95\x45\x51\xfe\x8b\xff\x71\x8f\x5e\x26\x48\x68\xe2\x07\xf7\x01\x19\x4e\x41\xde\x39\x97\x1f\xd3\x85\xf4\x9a\x4b\x4a\xdd\xa9\x11\xeb\xa5\x52\x59\xfc\x68\x36\x65\x32\x73\xf6\x56\xf4\xaf\x60\xb2\x06\x64\x95\x6d\x4f\x21\x35\xd9\x0d\x09\xe9\x03\x7d\x53\x66\xa0\x25\x34\x44\xe0\x22\xc7\x21\x2a\xf5\xfd\x4f\xcc\xd7\x42\x37\xd2\x88\x53\x38\xe2\xfd\x72\x15\x22\xde\x67\x63\xc2\x54\x90\x28\xc6\x23\xb9\xcf\x38\x7d\x23\x4a\xb5\xe7\xfc\xbe\x5a\x47\xc6\x85\xb7\x9e\x75\xa5\x7b\x09\x57\x40\x82\xa0\x22\x21\xdf\x64\xa2\xe8\x41\x61\x80\x87\xe7\x22\xa2\x1b\xac\x1b\xa4\xf0\xd7\xd8\x7b\xdc\x51\x0a\xaa\x8f\xbd\x10\x75\x7f\x6c\x02\x9c\xa8\x20\x37\x1f\xc7\x4c\x3b\xc5\x0b\xd8\x98\xc5\x5d\x81\x67\xf7\x3a\xda\x37\x7a\xec\xc9\x16\x29\xd6\x4c\x36\x0c\x2c\x24\x1c\x5c\xb4\x2e\x3a\x51\x8c\x5d\xab\xf0\xf4\x18\xb2\xa7\xf3\xd8\x2e\xef\xd9\x20\x26\xd3\x1e\x8b\x81\x60\x35\x8e\xae\x82\x1f\x73\x0e\xca\xfe\x7a\xce\x64\x7b\xff\x87\x41\xde\x2f\x6a\x13\x1d\x11\xc9\x69\xe9\x78\x7c\xfe\x6a\x2f\xab\x37\xbf\x8d\x1c\x7f\x4a\x2f\x36\x4d\x2f\x1a\x76\xef\x04\x6c\x18\x43\xe6\x3e\xc0\x0c\xf7\x92\x0f\xfa\xae\x56\x1e\x73\x70\xb7\x19\xfc\x16\xfc\xeb\xca\x3c\xfd\xfa\xba\x43\xf4\xf0\x90\xc4\x6f\x47\x73\x03\xa6\x60\xee\x88\xdd\x4e\x89\xbf\x14\xb9\xf8\x04\xb6\xfd\x49\x5c\xb1\x41\x27\x53\x47\x4a\x05\x6a\x0d\x89\x31\xcd\x9c\xcb\xd6\x4f\x8f\xcc\x7a\x31\x23\x46\x7c\x5d\x47\xf6\x90\x67\x9e\x88\x71\x28\x80\x93\x73\x4f\xd6\xa1\x32\x60\x38\x65\x81\x56\x41\x36\x96\x59\x4c\x13\x4d\x73\x88\x7f\x34\xee\x67\x60\x9a\xe8\xff\xb3\x26\x6c\x16\xd8\x7f\x15\x34\x5a\x47\x6f\x72\x95\x0c\x15\x87\x96\xa8\x8b\xbb\x44\x4f\x1a\xa8\x09\xca\xd8\x75\xb8\x5f\xb9\x15\x1a\x0e\x2e\xef\x2e\x00\xe8\x0d\x6b\x7a\x9b\xa4\x06\xc0\x51\x9e\xff\xdd\x94\x12\x62\x32\xfd\xf6\xf1\xe7\xb9\xbb\xc0\x36\x2a\xa7\x75\x16\xfd\xf9\x39\xe7\x90\x6a\xab\x01\x30\x71\x28\xcf\x82\x4c\x10\x2c\x09\xb9\x29\xc9\xb2\xd7\xaf\x8f\x85\xb7\xd7\xf9\xa8\x38\xb2\xae\xd0\xc6\x97\xe8\xbd\xfe\xe6\x6e\xe0\x16\xbb\x1b\xf3\x5e\xff\x6b\x2f\x7e\xf4\xb9\x1b\x1f\xc0\x4f\xac\x9f\x11\x6e\x2e\xdf\xf4\x0f\x95\xc1\x5b\x77\xc3\x1e\xe5\x22\xf3\x93\x7c\x7f\xa0\x04\x7d\x62\x25\xe0\xc8\xe5\x5e\x27\x8c\x81\x03\x91\x1f\xea\xb2\xb7\xf4"}, +{{0xdd,0x12,0x39,0x72,0xe6,0x28,0x58,0x4a,0xcc,0x46,0x29,0x3b,0x8e,0x4c,0xe2,0xb2,0xdd,0x46,0x9c,0xc4,0xed,0xe1,0x4e,0xf3,0x95,0x21,0xcf,0x08,0x37,0x35,0x85,0xb3,},{0x35,0x22,0xf7,0xae,0x59,0x6e,0xed,0xb2,0x17,0x03,0x5d,0x95,0x39,0x5e,0x44,0x8d,0xbd,0x6f,0xfb,0xf4,0x25,0x85,0xea,0xeb,0x30,0x70,0x26,0x54,0x1c,0x78,0xa6,0x51,},{0x89,0x65,0xa8,0x89,0xd5,0x4c,0xd8,0x07,0x6d,0x35,0xbc,0x2e,0x12,0xb0,0x09,0xd5,0x6b,0x07,0x04,0xc8,0x94,0xf9,0x12,0xa0,0xd1,0xd3,0x07,0x20,0xc2,0x32,0xfe,0x44,0x04,0xbf,0x30,0x09,0x54,0x1e,0x8f,0x32,0x83,0xe8,0x9e,0xa8,0x6f,0x67,0x8a,0xfb,0xdf,0x1c,0x21,0xc9,0x24,0xb2,0x3a,0x52,0xb4,0xca,0x6d,0x63,0xf4,0x8f,0xc2,0x03,},"\x2b\x28\x57\xf4\x52\x80\x17\x3e\x2e\x0e\xf9\xd5\x94\xe6\x08\x3f\x1d\xc7\xa6\x54\x92\x97\x5b\x83\x7d\xef\x6c\xad\xd8\xc8\x54\x50\x31\xee\x9d\x68\x36\x9a\x93\x93\xcc\x7b\x79\x2f\xeb\x98\x04\x0b\x21\xf1\xeb\x84\x66\x5f\x87\x85\x37\xce\x41\x2e\x9d\xb6\x80\xd2\x9f\xbd\x8f\xfc\x77\x31\xea\xe9\x1a\x20\xb4\x75\x48\x99\x62\x04\xfb\x06\xad\x74\x0e\x78\xf0\xfc\x59\x0b\x67\x91\xdc\x7a\x0f\x26\x59\x28\x6c\xc1\x6d\x02\xc5\x11\x7b\x56\x58\x36\xb4\xb8\x73\x8c\xf4\x0e\x28\x5c\x69\xc5\x0e\x41\x29\x11\x29\x23\x67\x35\x2d\xfd\xae\xd9\x98\x2d\x0f\x89\x9a\x23\xc0\xab\x51\x81\x2b\x3e\xc6\x78\xf6\x88\x2e\xa4\x27\xcd\xc9\x3a\xb4\xb2\x48\x24\x37\x70\x54\xaa\x25\xd8\x22\x46\x65\x33\x40\x07\x8c\xf1\x1d\x14\xa5\x1f\x0e\x68\x6d\x7e\x01\x8b\x36\x74\x16\x68\xfc\xe7\x45\x8d\x16\x92\x93\x36\x1d\xd1\x6b\x3d\xeb\xbe\xd1\x9e\x1b\xef\x7c\x36\x93\x4e\x20\xf3\x3a\x09\xad\x3e\x82\xb5\x3a\xb4\xe9\x4c\x25\x5d\x04\x18\x98\xb9\x77\x37\xdf\x99\x58\x4a\xf1\x4e\x40\x40\x58\xd0\xc9\x3b\xca\xe7\xbb\xbc\x06\x39\x5a\x2a\xef\xbd\xef\xa7\xb2\xed\x17\xce\xbd\x15\x13\xfa\x39\x0f\xe9\xa9\xb0\xce\x68\xce\xcc\x2b\x9e\x12\x9b\x7a\x29\xf4\x9b\x6d\x18\xc2\x8b\xac\xd3\xaf\x39\xdc\x39\xca\x97\x2f\x0e\x0d\x06\x85\x5d\x57\xc2\xb5\xfc\xac\x2f\x79\xcb\x8c\x05\x79\x9e\x4f\x65\x73\x46\x68\xda\xd6\xaa\x7a\x43\xa1\x18\x56\xe2\x3b\x1e\x73\x2d\x00\xe5\xfe\x38\x85\xb7\xda\xd4\x2e\xc1\x8a\xc8\xe0\x96\xa0\x80\xf7\xd5\x50\x70\xfd\xcf\xf6\x07\xbc\x0b\x85\x2d\x8a\x08\x0d\x2a\x74\x05\xd5\x94\x14\x69\x5f\x2e\xb7\xfb\x0a\xca\x23\xc8\x63\x57\x42\xf8\xae\x57\xf1\x37\x80\x31\x6e\x28\x08\x72\x37\x4e\x69\x29\x59\x8d\x02\x8a\x33\xc0\x5d\x83\x1c\xda\xbd\x02\x94\x93\xc3\xcc\x85\x9f\xff\x1a\x67\xd5\x62\x16\xf0\x2a\x22\x95\x66\x53\x65\x88\x7a\x35\x0a\x80\xaf\xaa\x0c\x36\x7a\x74\xd3\x70\x1a\xe8\x8f\x59\xd8\xa9\xd3\xa1\xdc\xe0\xcf\xd2\xea\xbe\x2a\xf5\x06\x5a\x1c\x7f\xca\x4a\xad\xcf\x8e\x51\xe7\x56\x12\xa1\x37\x1b\x4d\xc8\xff\xc0\xc0\xb9\xc4\xfa\xdb\x2f\x08\x1e\x2e\x03\x2d\x96\x81\x8e\x55\x73\x7a\xdd\xe3\xe1\xac\x12\x1f\x56\xcc\x86\xfb\x58\xa0\xa5\x82\x69\x2f\x62\xce\x58\xac\xce\x17\xaa\xfe\xc7\xbc\xb7\xe4\x4f\x83\x92\x58\xcd\x4a\x85\x1f\xc0\x13\x44\xee\x9f\x1b\xd0\x3e\xb9\x43\x44\xf4\x77\x86\x93\xc1\x71\xdd\x28\x92\xb2\x42\x6a\x88\x29\xab\x0c\xfe\x33\xa7\xd4\xa3\x6e\xb4\x01\x7f\x7f\xcf\xd2\x41\x34\xab\x8a\x45\xf2\x37\x17\xcd\x13\x8a\xa6\x00\x01\x72\xe3\x7b\x40\x64\xdc\x9b\x6d\x1e\x1e\xf3\xaf\x84\x97\x1d"}, +{{0x33,0x35,0xea,0x92,0x81,0x17,0xcf,0xee,0xfb,0xee,0xae,0x14,0x60,0x03,0x88,0x1b,0xdc,0x88,0x89,0xd6,0x58,0x0e,0xed,0x13,0x52,0x37,0x08,0x20,0xad,0x1f,0x58,0x4f,},{0xcb,0x20,0xd4,0xfd,0x75,0x61,0x84,0x80,0x13,0x11,0x1c,0x3e,0x97,0x61,0x7f,0x34,0x18,0x1d,0x2e,0x7f,0xbc,0xf1,0xbb,0x2a,0x2c,0xd2,0xe8,0xc1,0x77,0x5b,0x8b,0x03,},{0xf7,0xc3,0x9f,0x92,0x47,0xd2,0x2f,0x01,0x89,0x99,0x24,0x7f,0x0e,0x00,0x05,0xcd,0x63,0x07,0x6c,0xcf,0x2f,0xee,0x41,0x63,0x42,0x1f,0x86,0x40,0x7a,0x41,0x69,0x8c,0x40,0x58,0x16,0x64,0x73,0x51,0xc0,0x4e,0x93,0xb5,0x44,0x15,0xb6,0x2f,0xc0,0x3f,0xc8,0xc2,0x5e,0x20,0xf7,0x54,0x1d,0xab,0x03,0x19,0x7d,0xc9,0x00,0xb2,0x9c,0x0c,},"\x0f\xa7\xf6\xa6\xfc\xa9\x81\x42\x9b\x57\x2a\x67\x04\x87\x1b\xed\x14\x0d\xab\x93\xee\x19\x92\x00\x6e\x9a\x3b\xb2\xe6\xcc\x9a\x09\xd4\xc9\xcf\x17\x06\x6b\x32\xff\x7e\xf5\xb6\xb2\xe7\x91\x11\x78\xed\x74\x62\xc4\xc1\x75\x60\x31\x71\xca\x61\x36\x68\xb3\xbe\x19\x3d\x94\xc3\x52\x1e\x58\x89\x13\xb5\x94\x8b\x55\x0b\xe9\x9d\x82\xd9\x66\x19\x7d\x71\x0a\xcf\xd9\x59\x14\xcf\x3e\x19\x75\x36\xe8\x3e\x68\x23\x0d\xc3\xd6\x7e\x67\xdc\xdb\xde\xe0\x4f\x0d\x9c\x48\x02\x37\xec\xd2\x8f\x74\x33\x8d\xb5\xf3\xf6\x97\xd3\xd0\x7f\xf3\x36\x13\xbb\xce\x54\x2a\xcc\x9a\x7f\xed\x5d\x12\x49\x0b\x9b\xfe\x1d\x10\x95\x40\xf8\x63\x80\x0d\xd3\x56\xda\x84\x1a\x45\xa3\xcd\x8a\x08\xa9\x45\xbf\xa3\xaa\x98\xe1\x71\x23\x12\xc4\xc0\xf0\xd9\xdd\x64\xf6\xef\xcf\x73\x6b\xd9\x7d\xea\xfc\xa9\xdc\xaa\x3f\x06\xd8\x7f\x2e\xd7\x2a\xeb\x6a\x94\xf3\x28\x00\x00\xc4\xbf\x72\x8a\x01\xc1\x86\x2d\xaf\xd9\xfc\x5c\x7d\x5a\x46\xec\x7d\x3a\x87\xaf\x59\xa1\x1d\x87\xf7\xff\x84\x40\x7d\x37\x01\x0e\x1d\x94\x6c\xf2\x25\xd6\xb3\xb1\xed\xee\x2e\x8b\xbf\x1e\x07\x9e\x47\xfb\x1f\x66\x66\x93\x94\xfb\xf2\xfa\x68\xfc\x56\xfc\x89\x82\x0a\x68\x09\xc2\x51\xdd\x62\xf5\xb8\x65\xc5\x47\xb1\x4f\xbd\x3a\x19\x50\x42\x44\xff\xbc\x7e\x52\x40\xf8\x8d\x43\x60\xf9\xca\xca\xaf\x5f\x82\x43\x3d\x33\x44\xfc\xae\xe0\xac\xde\xb7\xbe\xb9\xc0\xb3\xc7\x69\xea\xc9\x20\xef\x4f\x09\xab\xc2\xa2\x09\x55\x12\x04\x59\x43\xec\xcc\x53\xb1\xc0\x3e\xd2\x4e\x56\x7f\x3d\x7a\x71\x97\x7c\xab\x98\x40\xce\x89\x8e\xe5\x8e\xd5\xc7\x3f\x6a\xde\xa8\x23\x39\x4c\x5c\x8e\x36\x58\xa6\xbf\x5a\xcb\xbf\x00\x55\x99\x2c\x31\x2c\x26\xc7\x9c\x5c\xfb\xea\x38\x60\xb8\x76\x4a\x6d\x8f\xfe\x44\x91\xf8\xa5\xb8\xa2\x15\xe0\x11\x7a\x9a\x68\x16\x4a\xee\x25\xf8\xc0\xbb\x38\x11\x95\xb2\x40\x0b\xcb\x46\x44\xeb\xce\x1c\xde\x5a\x9a\x26\x58\x2c\xab\x9d\xc7\xf4\x3c\x33\xea\xe3\x50\xdb\x65\xaa\x7d\xd2\x2a\x07\x9b\xdd\xdc\xf5\x6d\x84\x8d\xeb\x0c\xfa\x50\xb3\xbd\x73\x2d\x9d\xa9\xe8\xd8\xab\x79\xe9\x34\x69\xde\x58\x02\xb6\xdf\xf5\xac\x2a\xa8\x48\x2b\xb0\xb0\x36\xd8\xf9\xd5\x95\xb8\xea\xd9\x4b\xb8\xd7\x41\x8e\x2e\xa4\x31\x92\xef\xcb\xfc\x05\xc4\x67\xbd\xe0\xa8\x68\xa5\x16\xa7\xc1\x4a\x88\x9b\x72\xc5\xb7\x3e\x7d\x85\xc2\xba\xe9\x02\xe4\xe6\x8d\x1f\x3c\xea\xb2\xb2\x77\x3a\xf5\xbb\xae\xe6\xa0\x0d\x08\x06\x3e\x78\x33\xcd\x4e\x29\x53\x47\xe5\x8f\x5d\x1b\x33\x97\xf6\x40\xc1\x59\xcc\x60\xa6\x74\xa2\x27\xb4\xcd\x8c\x10\xf1\xdb\xae\xd5\x16\xcc\xac\xdd\x29\x5f\x11\xb0\x81\x47"}, +{{0x32,0xa1,0x88,0x3e,0xff,0x57,0xa3,0xa7,0xec,0xdb,0x31,0x02,0x21,0xee,0x83,0xc4,0xde,0x92,0xb7,0x22,0x15,0x96,0x13,0xec,0xf8,0x16,0xe3,0x82,0x43,0x7b,0x60,0xb9,},{0x82,0xdd,0x1a,0x03,0xe5,0x85,0x20,0x62,0xba,0x4a,0x8b,0x6b,0x3b,0x93,0xc5,0xe9,0xc4,0x3f,0xf6,0x99,0x5b,0xd2,0xaa,0xc7,0x26,0x06,0xfa,0xc8,0x58,0x02,0xc6,0x82,},{0x83,0x09,0xcb,0xe7,0x2f,0x80,0x4b,0xd9,0x52,0x1d,0xef,0x5d,0xad,0x4d,0x8b,0xc1,0x38,0x86,0xb1,0xd4,0xf6,0x62,0xc9,0xbb,0x5b,0x97,0xba,0x47,0x90,0xf4,0x4b,0x80,0x1f,0x31,0x95,0xea,0xd0,0xd4,0xdd,0xb6,0x60,0x81,0x8e,0xcb,0xf9,0xa6,0x83,0xca,0xcf,0x85,0xf1,0xdc,0xc9,0xe8,0x2c,0x09,0x11,0x6d,0x73,0x36,0x58,0x09,0x1a,0x00,},"\xed\x2b\x12\x3b\x5d\xd7\xf5\xe7\x18\xe0\x26\xc7\x9c\xfa\x61\x11\x92\x49\x02\xd1\x89\xa4\x06\xef\x2b\x2e\x56\xa9\xee\x55\x73\xa7\x6d\xdd\x1d\x06\x29\xeb\xcd\xec\xf2\xaa\xa7\x4e\x84\xfc\xd0\x20\x8f\x14\xee\xa2\xe1\x71\xe7\xc8\x60\x8b\x81\x8f\xef\xf4\xdb\xea\x52\xdb\x35\x42\x27\xd0\x23\x25\x0b\x1f\x01\xcb\x4c\xc8\xc5\x21\x32\xa9\x8d\x4a\xcf\x55\xa5\x4f\xee\x81\xe0\x94\xae\xd6\x6f\xa0\xd6\xb6\xa2\x00\xb6\xb8\x74\x14\x40\x22\x78\x53\x8b\x90\x52\x9a\x8c\x60\x3d\x92\x7e\xdd\xda\x97\xbc\x4b\x8c\xb9\x5d\x04\xb5\x33\x7f\xa2\x2c\xea\xfc\x8b\x34\x0c\x46\xfe\xf6\x71\x98\xd1\xfd\x98\xd8\x9c\x65\xcd\x08\x9e\x23\xf5\x3d\xbd\xca\x96\x77\x98\xb5\xcd\x92\x32\x05\xad\x51\x1e\xdf\x70\x6f\x12\x25\xf4\x64\x8c\x98\x5e\x00\x9e\xf8\xa2\xf6\xa0\x11\x7c\xdb\xe1\x4e\x75\x31\x2d\x8a\xc1\xf0\x3d\x04\x6b\x37\xcd\xee\x7d\x69\xc0\xf2\x5c\xcf\x18\x14\x5a\x68\x8a\x8b\x3c\xa8\x87\x5f\xe8\xd9\x0b\xaf\x86\xd4\x39\x69\xe4\xd6\x10\x21\x4f\x1a\xc5\xdb\xba\x87\xa1\xef\x10\x37\x7e\x40\xd7\x80\x6f\xd9\xd2\x34\x57\xfc\x9d\xf2\x98\x99\x23\x9f\xd1\xd2\x78\x84\x96\x81\xa9\x43\xad\x9c\x91\xfd\x1b\xbd\x92\xb7\x3c\xb1\x77\xa8\x78\xf9\x05\x9e\xe0\x7a\xf7\xa8\x73\x16\x13\xe3\x3d\x59\xdf\x3d\x97\x79\x60\x79\xd5\x63\x1e\xd8\x5e\xb2\x24\x51\x06\xa5\xff\x6a\x2b\xca\x40\xdf\x5c\x6e\x87\x47\x3b\x2c\x08\xc2\x21\x2f\x56\xfc\x29\x33\xa9\x69\xa3\xc9\x58\xd3\x7c\x53\x43\xba\x27\x60\xc8\x13\xa7\xa5\x16\x5d\x23\x1c\x5f\xea\xae\x62\xb7\x55\xdf\x49\xfe\xca\x80\x04\x1a\x65\x35\xf7\xe0\x3b\xc4\x8e\x5f\x27\xf9\xbe\x26\xef\x53\x67\x3e\xb7\xc3\x7a\x2b\x64\x74\x4a\x6c\xf1\x7e\x88\x77\x34\xae\x01\x0b\xf4\x0e\xea\x03\xcd\xa2\x12\xf5\x12\xfb\xa0\x58\x59\x47\x17\x96\x40\xbc\xc4\x54\x4b\x8d\xeb\x4e\xad\x12\x9b\xc3\x32\x28\x00\xad\xf9\x88\x18\xf9\x95\x74\xbe\xfd\x9b\x00\x16\xd4\xee\xc8\x1a\x8e\x78\xdc\x3a\x2a\xf1\x3c\xab\x01\x64\x9a\xe2\xe3\x3d\x51\x6b\x9d\x42\x08\xad\x66\x13\xd8\xe2\x78\xc3\x93\xba\xa8\x82\x34\x0e\xf4\x61\xff\x4f\x94\x42\x3d\x55\xcf\x3c\xed\xd2\xa6\xb5\x6e\x88\x36\x55\x31\xdd\x29\xd6\x82\x73\xad\xbf\xe3\x69\x40\x2e\x6a\x7c\xee\x05\x3d\xa1\xf1\x00\x54\x00\x91\xa0\x09\x29\x25\x29\x83\x44\x90\x24\xb1\xc3\x39\x11\x10\x65\x00\x82\xf0\xe7\xdf\xdd\xb8\xed\xc2\x04\x2f\x3c\x17\x13\xc6\x94\x4b\xa5\x14\xee\x74\x07\xd3\x2b\xf0\x6c\x85\x8e\xfe\xc4\x2a\x78\xbe\xe9\x77\x46\xe5\xb4\x87\x91\x41\xa1\x3d\x9f\xc5\xcb\x12\x3b\x78\x32\x73\xb8\x4d\x57\xad\x35\x26\xb7\xda\x3c\x68\xb8\x39\xef\xd2\x3f\x5f"}, +{{0x22,0xec,0xef,0x6d,0xab,0xe5,0x8c,0x06,0x69,0xb8,0x04,0x66,0x49,0x73,0xe4,0x57,0xc0,0x5e,0x47,0x77,0xf7,0x81,0xc5,0x25,0x22,0xaf,0x76,0xb9,0x54,0x81,0xa9,0x14,},{0xd4,0x78,0x40,0x10,0xef,0x04,0x03,0xed,0xdc,0x5a,0x62,0xd5,0xd4,0x5b,0xb2,0x43,0xb8,0x0b,0x4b,0x9d,0x69,0xc3,0x9c,0xa3,0x87,0xc6,0xf5,0xcb,0xa0,0x28,0x64,0x0f,},{0x5d,0x0d,0x2a,0xf6,0x78,0xb3,0xd1,0xb6,0x77,0x51,0x6d,0x08,0xa7,0x9a,0xaf,0xd3,0x6e,0xc6,0x7c,0x14,0xca,0xf5,0xbc,0xda,0xae,0xaa,0xcc,0x51,0xa1,0x4f,0xb8,0x05,0xcf,0x29,0x04,0xe8,0x72,0x1d,0xb2,0x71,0xb2,0x0d,0xf7,0x09,0xbe,0xe1,0xa4,0xfb,0xfe,0x62,0x56,0x50,0x73,0xb2,0xa7,0xe9,0x42,0x72,0x44,0x61,0xf9,0x27,0x93,0x0d,},"\xc5\x35\xc1\x3d\x77\x9f\xc0\x98\x59\x73\xd6\xbc\xd5\x52\xd8\x17\x34\xe9\x2b\xdf\x10\x99\x4b\x00\xcd\x4d\x53\xce\x36\x5f\xad\x8c\x7c\xfa\x96\x20\x6a\xdb\x62\xd4\x56\x7b\xe5\xe4\x66\x31\x32\x38\x53\xe3\x8c\xe4\xbd\xc1\x6d\x7b\x8f\x63\x2a\x3a\xd9\xe0\x26\x19\xef\xf3\x71\x74\xea\xc3\xf0\xbf\x2f\x7a\x75\x17\xd4\xb8\x2d\xe6\xaa\x1a\xf0\x06\x38\x19\xd5\xe1\xf9\x27\x8f\xb4\xf2\x4c\x8c\xc0\x02\xaf\xb1\x5f\x33\x4c\x04\xfa\xdb\x00\x30\x30\x13\xc0\x16\x67\xf4\x93\x2a\x6c\x4b\x97\xd3\x9c\xd4\xa4\x59\x85\x06\xc0\xbd\x74\x0e\xa9\xf1\x16\x96\x35\x7d\x7d\x17\xfe\x4d\x75\xf9\xd7\x42\x41\xa7\xaf\x71\xf9\xd8\x69\xef\x6c\xd6\x95\x68\x7c\x03\xfc\x34\xad\x65\xa6\x8a\x48\x88\xa1\xa7\x41\x26\xcb\x55\xcf\x7d\xa9\xcb\x4a\x67\x17\xf6\xeb\x88\x48\x40\x89\xd2\xc5\x18\x9a\xe3\x81\xf2\x5e\x7b\x3b\xc3\xb2\x3d\x0c\x9d\x9f\x9c\xdb\xbe\xec\xfd\x1e\x72\xa0\x5e\x67\xbb\x48\x3a\x97\x64\xd9\xfc\x75\xad\x69\xe4\xab\x12\x70\xfb\x40\xf3\x95\x8f\xea\x4d\xa5\x59\xb4\x39\x80\xb2\x46\x81\x31\x3e\x85\x91\xe6\x85\x46\xa3\xbf\x76\xee\x34\xb3\x39\x70\x92\x95\xa8\xd4\x6f\xb2\x43\x2d\xda\x2f\x22\x18\x12\xdf\x69\x28\x95\xe6\x7c\xb2\x9c\xbf\x6f\xf4\x50\x2b\x43\x9a\x4e\x9e\x43\x63\x9e\xc0\x67\xbc\x90\xae\x81\x4a\x29\x3a\x7b\xd4\x69\x68\xe6\x56\x78\x76\x42\x30\x0a\x0f\xf2\x69\x7e\x33\x13\xf6\xa4\x18\xd3\xd1\x2a\x5f\x7c\x51\xa4\xc5\x7b\x63\x38\x5f\x2d\x2a\x21\xd5\xd1\xd7\x63\xfc\x8d\x1b\x93\xc1\x34\x35\xf9\xe4\x7e\xe7\xa4\x25\x98\x0a\x6a\xe6\xf1\xa9\xd0\x07\x60\x74\x76\x78\x3c\x6d\x0c\x78\x87\x38\x0f\x86\x8c\x65\xb3\x82\xd4\xcc\x8c\x04\x47\x8b\xbd\x79\xa1\xd9\xa9\x64\xb7\x81\x71\xd6\xbc\xf0\xb8\xee\xc5\x0a\x06\xa4\xea\x23\x4d\x1c\x23\x46\x5d\x3e\x75\xb8\x8b\xc5\x40\xda\xde\x74\xed\x42\x67\x5b\x07\xf7\xcf\x07\x82\x11\xe9\x07\xf8\x6d\x0d\xc4\xb9\x78\x62\x3d\x9f\x08\x73\x8a\xf9\x28\x69\x5e\x54\x2e\xc2\x98\x0e\x55\xa1\xde\x49\xe2\x52\x47\xfa\x0a\x09\x67\x81\x18\xe3\x93\x0b\xc4\xd2\x4b\x32\x14\xd6\xdc\xfb\x6e\xbd\xf4\x90\x6c\x92\x8d\xeb\x37\xbb\x9b\xa2\x9c\x8d\xe1\xbb\x94\x18\xdb\x71\x8b\x28\x53\xba\x57\xad\x8c\xae\x46\x77\xad\xdf\xd1\x8b\x6c\x7e\x8c\x24\x26\x21\xb3\x5c\x7f\x0e\xfe\x8d\xd5\xeb\x26\xff\x75\xfd\x57\x48\xb1\xd7\x83\xf6\xd6\x8a\x7d\x9d\x56\xda\x2c\x1a\x97\x8a\xc2\x5f\x84\xfb\xb2\xbe\x55\x68\xd9\x1e\x70\x93\x82\x21\xc1\x02\xae\xe6\x04\x09\xbc\xbe\xc0\xc8\x2e\x12\xdd\xb4\x25\xee\xb6\xec\xd1\x15\x51\xec\xd1\xd3\x3d\xda\xe8\x71\xae\x0c\x8f\x24\xd0\xd1\x80\x18\x73\x2b\x5e\x0e"}, +{{0x8d,0xe8,0x63,0x30,0xb2,0x56,0x09,0x5e,0x11,0x14,0xb6,0x52,0x9b,0xed,0xce,0x18,0x2c,0x16,0x6f,0x67,0xa9,0x15,0x39,0xce,0xbc,0x4b,0xec,0x25,0xad,0xd7,0xa4,0xa9,},{0x33,0xcb,0x05,0x4b,0x55,0xbb,0x79,0x0a,0xc0,0xf3,0xaf,0xdd,0x9a,0x6e,0x7c,0x05,0x0e,0xfe,0x90,0x06,0xc2,0x4f,0x60,0xb8,0x04,0x4f,0xd0,0x8a,0x5c,0x10,0x6c,0x11,},{0x6d,0x01,0xd2,0x37,0xdd,0x2b,0xb4,0x18,0x8d,0x29,0xbf,0xde,0xc3,0x87,0x97,0x6a,0x71,0xbe,0x7a,0xdf,0xbf,0x9e,0x23,0x63,0x9b,0x21,0x6d,0x0a,0xa0,0xc1,0x19,0x32,0x23,0x5e,0xdc,0xcb,0x3b,0x42,0xad,0xcd,0xb6,0x29,0x1a,0x0d,0x29,0x9a,0xed,0x64,0x8d,0xe8,0xb1,0x95,0x79,0x49,0xb9,0xd1,0xcf,0x2e,0x50,0x49,0x30,0x30,0xa4,0x0f,},"\x39\xe6\x1e\x0e\xcc\xec\x92\x9c\x87\xb8\xb2\x2d\x4f\xd1\x8a\xea\xbf\x42\xe9\xce\x7b\x01\x5f\x2a\x8c\xac\x92\xa5\x24\x48\xa4\x2f\xed\x4c\xba\xdc\x08\x5b\xbb\x4c\x03\x71\x2a\xe7\x2c\xfc\xb8\x00\xb9\x78\x35\x06\x69\xb0\x99\x00\x84\xf2\xda\xb7\x6e\xca\x60\x6d\x1a\x49\xfc\x55\xc5\x29\xe1\xe7\xda\xdf\x39\x12\x2d\xd5\xbd\x73\x38\x93\x85\x8b\x05\x23\xef\x62\xdf\x4f\x13\x4c\xf6\xc2\x6e\xed\x02\xfd\xbc\xb3\x0c\xe4\x74\xb1\xad\xa3\xf0\x60\x76\x9f\x93\x4b\xbe\x68\x6c\xce\xbd\x60\x88\x3e\xce\xc9\xce\x3f\xfb\x8a\xc4\xa0\x67\x8c\xdc\x5b\x00\x5a\xe3\xdb\xa7\xe4\xfe\x8b\xc0\x45\x73\x99\x57\xd8\x49\xf6\x9c\x14\x74\x05\x7b\x42\x8c\x54\x25\xf3\xcc\x25\x16\xe8\xbb\xe3\xbe\x81\xaf\xd4\xe7\xb5\x75\xab\xe8\x8c\x87\xf2\xf0\x3b\x56\xf6\x9f\x9e\x3b\x61\xb3\x78\x81\x20\xda\xa4\x95\xef\x0e\x50\xeb\x97\x0a\x64\x5c\x13\xd2\x13\xc7\xcf\xb7\xd0\xad\x55\x5c\x92\x0a\x1e\x5d\xbc\xb4\x67\x97\xd9\x39\xfe\x04\x01\xf5\x47\xbf\xd1\x75\x43\x22\x1a\x53\x01\x0d\xe0\x1f\x25\xb6\x45\x19\xc8\xf0\x39\x63\xe4\xb9\xca\x58\xb0\x11\x36\x27\xc0\x5b\x96\x08\xee\xaa\x7b\x9a\xe6\x30\x5c\x96\x18\x81\x60\x00\x0e\xe3\xa7\xad\xe9\x6e\x0b\x4b\xde\x9d\x0e\xd6\xa0\xce\xd7\x65\xd7\x86\x84\x0a\x48\x17\x5a\x6e\x09\x0a\x38\xaf\x6a\xde\xaa\x14\x86\xa9\xcb\x5c\x8c\x8c\x92\x23\xee\x0a\xe4\xc6\xc0\x26\x91\xa3\x54\x7e\x32\x58\x2a\x5b\x70\x59\xd2\xee\x66\xfa\x9c\xd9\x65\x61\x5c\x31\x5b\x47\x6f\xd8\x61\x27\x9c\xd1\xdd\x76\x07\x74\x3f\xc5\x56\x12\x96\x31\x2f\x11\xe4\x65\xca\x40\xbc\xe3\xcf\x0b\x1f\x1d\x5a\x30\xaf\x60\x87\xde\x4d\xe9\x6c\xe4\x39\x65\xa4\x6c\x4f\xcc\xa1\x5f\x28\x11\x49\xb5\xc1\xa0\xc8\x8f\xdb\xf2\x74\x09\xa1\x34\xed\x4f\x1f\xb7\x30\xfa\x19\x18\x16\xea\x78\x4d\x98\x6c\xc9\xec\x4b\x69\x44\x02\xde\x1d\xcc\xa9\xcc\xc6\x4f\xbd\x07\xb0\x7e\x54\xe9\x31\xde\x82\x7a\x84\x24\x60\xca\x0b\xf6\xb0\x4e\xbb\x57\x1f\xa7\x77\x87\xe3\x88\x4b\xe2\x2f\x1e\x40\x2c\xf2\xb8\xa9\x6a\x5d\x39\x77\x0e\xc4\xa8\x43\x03\x61\x42\xa0\xbe\x97\x0b\xb1\xab\x16\x5a\x63\x74\xdc\xf4\x3d\xeb\x8b\x98\x30\xb2\xc4\x9d\xb9\xcd\xfe\x4b\x52\x42\xe3\x6f\x95\xe0\xc3\xe0\x77\xe8\xd2\x38\xfa\x6a\x8a\xc0\xd5\x86\xbf\x61\xb8\x24\x8f\xb3\xa7\x9a\x27\x0a\xb2\x2b\xe8\xa9\xda\x05\x5f\xf3\xd5\xbb\x2d\x1c\xa9\xbc\x25\xf7\x01\x4b\x96\x40\x77\x19\xde\x34\x4c\x3e\x73\xb8\xc1\x14\xf7\x92\x07\x5a\x5c\x22\xfd\xd4\x16\x15\x4d\x34\x94\xec\x3f\x02\xfb\x11\x2e\xe5\x73\x7f\x70\x70\x4c\x1b\x6b\x07\xea\xcb\xf9\x45\x62\xca\x7b\x90\xdd\x84\xd9\x8c\x3e\xdf"}, +{{0xba,0xb5,0xfa,0x49,0x18,0x7d,0xa1,0xca,0xb1,0xd2,0x91,0x90,0x00,0x19,0xe6,0xcb,0xaf,0xec,0xcd,0x27,0xbf,0x7e,0xcb,0xf1,0x26,0x2a,0x70,0x05,0x16,0xe7,0xc2,0x9f,},{0xf6,0xfb,0x19,0x85,0xec,0x59,0x1f,0x69,0xe3,0xba,0xc8,0x07,0xb2,0xea,0xbf,0x26,0x39,0x90,0xcd,0xfa,0x09,0xb1,0x78,0x09,0xe4,0x8e,0x38,0x5d,0xa0,0x65,0xec,0x21,},{0xe3,0x16,0x03,0x8d,0x6a,0xa1,0x5b,0x1c,0x1b,0x61,0xc1,0xa1,0x6b,0x36,0x90,0x4f,0xe8,0xa2,0x89,0xc8,0xd6,0x02,0xbe,0xcc,0x51,0x4d,0x99,0x22,0x00,0x86,0xb2,0x67,0x85,0x9f,0x5b,0xf6,0xe9,0xc0,0x86,0x35,0x59,0xac,0x62,0x3a,0x56,0xd7,0x53,0x23,0x44,0xe8,0xd2,0xf2,0x8b,0x3f,0x9d,0xf9,0x20,0x89,0x70,0x8b,0x1b,0x05,0x90,0x08,},"\x5c\xf8\xff\x58\x7e\x52\xcc\xcd\x29\x84\xf3\x47\x91\xee\x68\x43\xe7\x70\x17\xc3\xb5\x5a\xd4\x5c\x44\x45\x09\x65\xb7\x5d\x83\x6e\x78\xfb\xd7\xa1\xd1\x72\x9e\xff\x6d\x6d\x34\x0a\x90\x3f\x3c\xf1\x7d\x9e\x2a\xec\xaa\xff\x2a\x32\x1f\xcd\xde\x0a\xbc\xfb\xbc\xbc\xc0\x9f\x40\x86\xf8\x12\xc4\x6e\xfb\x01\xb7\x83\x43\xaf\xbe\x48\x30\x9f\x91\x74\x78\x45\x5f\x32\x00\x0c\x6a\x69\xf7\x9f\xe2\x11\xb9\x9f\x03\x7f\x59\x56\xd7\x22\x75\xa7\xfe\x7b\x45\x29\x6b\x5f\x73\x9a\xa4\x51\xff\x05\x75\xbc\x70\x58\x85\xaa\x56\x31\xb0\xd0\x85\x0b\xc2\xb1\x2c\x41\x92\x43\x5a\xe5\xd2\xf5\x2b\xc5\x43\x86\x49\x7c\x4a\x24\xb8\xb6\xdb\x51\x6b\xe0\x9d\x8c\xcf\x1e\xca\x78\x5b\xde\x97\xe9\xbe\x1a\xc0\x64\xf0\x94\xe2\xaf\xcc\x30\x7c\x0e\x06\xb4\xc5\x64\xcd\x9a\x9a\x95\x30\x5b\x37\xb8\x1f\x43\x46\x11\xdc\xa5\x5c\xaa\xa0\x31\xe8\x84\x95\xd5\xdc\x5a\x04\xff\x5f\xaf\xdf\x0a\x82\xa0\xc0\x3a\xff\x1b\xfb\xf4\xff\xeb\xae\x71\x82\x4e\x35\xe7\x51\xb0\x92\x70\x00\x76\x69\x86\x0b\x58\x00\x35\x65\x9e\x23\xac\xe7\x6b\x3b\x36\x9f\xa3\x06\xf2\xbe\xd9\x57\x99\xfa\xfa\xbc\x2e\x69\xc1\x41\xbe\xb0\xba\xca\xc7\xea\xa3\x47\xe7\x7b\xe5\xaf\x3f\xcd\xbe\x7b\x36\x4a\x7f\x9a\x66\xd5\xe1\x7a\x07\xdf\x62\x02\xfd\x98\xc1\x4b\xfe\xe2\xca\x6f\x07\x45\x65\x1f\x0c\x85\x50\xf9\xff\xff\xca\xfb\x96\xff\xb3\xf1\x03\xe6\x52\xe7\x8f\x53\x91\x6c\xd6\xf1\xdd\x05\xb3\xfe\x99\xb3\x42\x01\xb0\x7e\xac\x26\x52\xf5\x25\x35\x71\xfd\x38\x22\xc6\x95\xd2\x65\xc7\xdf\xdd\x6c\x6b\x14\xa8\x0b\x6e\x87\x18\x3e\x6e\x03\x2e\x5f\x24\x01\xcd\x23\x8c\xdd\x37\x69\xbb\x6e\x39\x08\x23\x43\x8f\x56\x73\xea\x9a\x47\x9e\x5c\x63\xfe\x07\xa0\x7f\x4e\x14\xf5\x77\x57\xc4\xd7\xd2\x2b\x35\xd7\x1c\x44\xea\xad\x48\x73\xc8\xec\xa6\xf6\xb2\x1d\xcf\xa9\x55\x20\xff\x96\x14\xab\xf7\xa0\xe1\x88\x53\x09\xf2\xce\xd3\xbc\xdf\xc3\x19\x36\x3a\x2d\xa4\x6d\xed\x79\xa5\xcc\x7b\x6f\x69\x38\x3f\x94\xab\x35\xc2\x50\x62\x9c\xb9\x15\xd6\x67\xb6\x28\x11\x86\x75\x48\x95\x80\x3e\x4b\x95\xe7\x41\x82\x89\xa6\xac\x3b\xcd\xb6\xe1\xe7\xf6\xf1\xdc\x38\xe7\x7d\x28\x19\x14\xcc\x40\x4f\x97\xcf\xf1\x4f\xb2\xc4\xfd\x81\x41\x2d\x10\x1c\x1b\xfb\x36\x8c\xe5\x93\x11\xe8\x92\xa8\xb9\xcd\xca\x86\x93\x6f\x3b\xca\x7e\xc7\x91\x63\xed\xdf\x1c\xee\x68\xf4\x9f\x1e\xba\xa2\x7e\xc5\x0f\x49\x0d\x61\x60\x1c\xa3\x5f\x8d\x6e\xd2\x66\x05\x4a\xeb\x9b\x19\x9f\x93\x3b\xff\xd6\xe0\x05\x0f\x26\x1b\x4e\x13\xd5\xeb\xfe\x2c\xaa\x65\x57\xc3\x2d\xde\xae\xeb\xc2\xa1\x1f\x0a\xa2\x33\x24\x0d\xa1\xc7\xe4\x0f\x76"}, +{{0x74,0xca,0x12,0x2a,0xb6,0x0d,0xe5,0x0c,0xdc,0x04,0xa8,0xe2,0xed,0xa4,0x5d,0x96,0x31,0x06,0x1b,0xf1,0x87,0xd3,0x16,0xbe,0x5b,0x7c,0xc0,0x6f,0x02,0x0c,0x48,0x3e,},{0x78,0x7d,0xef,0xd4,0xfb,0x24,0xa3,0x99,0xbd,0x2a,0x4e,0x76,0xdf,0xf7,0xd6,0x03,0xed,0x0a,0xcb,0x32,0x69,0x81,0x3e,0x4d,0xf6,0x90,0xbb,0xf5,0xb2,0xbc,0x69,0x6e,},{0xbc,0xb4,0xb8,0x50,0x69,0x60,0x11,0x99,0x7e,0xb5,0xdf,0xe1,0x43,0xf1,0xa3,0xd5,0x62,0x8e,0xf1,0xa5,0x40,0x76,0x91,0xee,0x48,0xc7,0x9d,0x69,0xab,0xe4,0xd5,0x33,0xf8,0x17,0xad,0x73,0x13,0xb5,0x79,0x5e,0x46,0xe5,0x95,0xf3,0xae,0x3a,0x91,0x65,0xb1,0xb6,0xfd,0xda,0xe8,0x61,0x64,0xff,0xcb,0xa3,0x76,0x24,0x98,0x37,0xf6,0x09,},"\xa8\x0b\x46\x07\x9f\xa7\x75\xf8\xc1\xa1\x9f\xa0\x82\x9b\xe6\x66\xbd\xfd\xca\x07\x9c\xad\x43\xd7\x0e\x08\x42\x18\x3b\xc0\xdb\x95\x46\x8a\x53\x9f\x0d\xb2\xae\xa3\xab\x9c\x70\x73\xb4\x5d\x22\x8a\x9b\xde\x23\x28\x97\xa6\xeb\x6f\xc9\xed\xf7\x36\x5e\x71\x01\xba\x97\xc4\x46\xa5\x19\xa3\x64\x9c\xf5\x27\xc8\xa6\xde\x72\x51\xb9\x28\x06\x81\x5a\xc2\xfa\x00\x82\xef\xf7\x5e\x25\x82\xcb\xca\x7e\x1e\x4d\xa2\xa4\x46\xea\x23\x3e\x7c\xf7\xce\xdf\xb0\xe2\x39\x8e\xb6\xe1\x1b\xba\xef\xe3\xf7\xec\x89\xf5\xd7\x3d\xd3\x4b\xd4\x7f\xbc\xb4\xd7\xb2\x2f\x2a\xae\xe3\x73\x78\x56\x51\x84\x11\x35\xcd\x86\x61\xa7\x01\xb2\x10\x84\xa3\x16\xde\xac\x30\x74\xe2\x4a\x2e\x35\xa0\x33\x0f\x7d\x14\x79\xb9\x32\xf2\x85\x27\x7c\x18\xa4\x41\x78\x72\x24\xfb\xbe\x46\xc6\x2e\x83\x4a\x18\x51\xed\x23\x79\x98\xd4\x8d\xce\x20\xba\x11\x4d\x11\xe9\x41\xbe\x29\xd5\x6d\x02\xf7\x37\x0c\x8f\x6d\x6d\x7e\x50\x24\x8d\xcd\x8e\xc8\x9d\x3b\x22\xf4\xf5\x87\x78\x12\x9f\xaf\xd4\xbb\x92\xed\xe1\x77\x14\xbf\x02\x2a\x5b\xf9\x2b\xe4\x79\xf1\x8e\x63\x85\x2e\xcd\xcf\x8c\x42\x11\xf5\x30\xdd\x30\xf7\x9c\xbf\x4b\xfa\x57\x37\xf0\xba\xd3\xb0\x10\x60\x67\xf4\x13\x27\xc3\x18\x9e\x6f\x20\x6f\x0d\x4f\x3c\x70\x4b\xf2\xbd\x0b\x16\x1f\x01\x8f\xd2\x1c\xdd\xfb\x41\x8b\xac\x4d\x52\xef\x02\xc4\x1c\x87\x92\xe4\x13\xb0\x4f\x08\x36\xce\xa1\xf8\x6c\x92\xe5\xd5\x70\x3b\xee\x2b\x5c\x58\x99\xe2\x85\x99\x20\x24\xf6\x4e\x0d\x16\xc6\x0a\xd0\xfd\x92\x54\x79\x32\xd0\xc5\xcb\x98\xd8\xda\x22\xfe\xeb\xdb\xba\x8d\x1d\xe1\xe7\xe9\xbb\x21\x9a\x92\xeb\x6c\x1c\x69\x8d\x3b\x33\xa3\x7f\x9b\x81\x97\xd2\x6b\x55\x0f\xeb\xd2\x60\x1e\x7a\x64\x3e\xa7\xe1\xd9\xe4\x48\xae\x03\x7f\x62\x9a\x30\x6c\xe4\x17\xae\xb7\x9f\x2e\x3c\xa4\x4d\x8d\xb3\x84\x8a\x81\x1f\x18\x46\x81\x1c\xbc\xb8\x74\xf8\xaf\x09\xe0\xfd\x01\x73\xcf\x17\x5f\x30\x41\x15\x47\x6b\xf2\xc6\xc2\xd2\xf3\x32\xeb\xa5\x34\xf4\x6a\xae\x80\x1c\x26\x92\xc2\xd2\xfa\xdd\xfe\xac\xc0\xf1\xda\xce\x44\x0a\xbc\x2a\xe5\xe5\xa4\x9d\x57\x8f\xd7\xf9\xde\x2a\x84\x1a\xd6\xb6\x76\x9c\x32\xb1\x44\xce\xea\x16\xd0\xf3\xc0\xcb\x3a\x8e\xe6\x94\xc3\x8c\x28\x07\x35\x95\x09\x6c\x81\x37\x62\xcc\x2c\x5e\xc4\xb0\xd8\xd7\x23\xdd\x66\x08\x53\x27\x8f\xc7\x2f\xd6\xbd\x9d\x12\x72\x93\x3d\xd2\xa3\x8e\xd9\xd0\x4b\x13\x90\xff\xe4\xb2\x94\xa6\xff\xfa\x72\x1e\xe3\xbb\xa3\x3a\x03\xa1\x49\xc4\xa0\x34\x52\x65\xc0\x1c\xe0\x15\xe9\x4d\xb4\x19\xcf\xf7\x04\x98\x52\xee\x00\x00\x48\xa8\x57\x58\xf6\xd7\xb1\xc5\x9c\x50\x89\xee\x01\x8e\xd0\x9b\x52"}, +{{0x65,0xee,0xa9,0xff,0xb7,0x56,0x12,0xbd,0xe1,0xd9,0xba,0x3e,0xa4,0xfb,0x5e,0xda,0x0a,0xa6,0xf2,0x55,0x6a,0xb1,0x5b,0xf1,0x81,0x7c,0xee,0x3b,0x95,0xbb,0xba,0x12,},{0x5b,0x39,0x36,0xdc,0x74,0x9b,0x6b,0x92,0x39,0xf1,0x57,0x98,0xac,0xca,0xfd,0x88,0x4c,0x36,0x59,0xee,0x01,0xb2,0xd1,0x7d,0x74,0xfc,0x7d,0xa7,0x82,0x74,0xe7,0xe6,},{0xba,0xa7,0x11,0x31,0x55,0x35,0x8c,0x92,0x4f,0xed,0x57,0x48,0x8a,0x65,0x67,0xf8,0x72,0x38,0x50,0xa9,0xf5,0xc0,0x3a,0x0d,0x7d,0xe8,0x5f,0xcc,0xd8,0xfb,0x4d,0x17,0xd7,0x75,0x35,0x23,0xb0,0x0c,0x0d,0x8a,0xdb,0x88,0x4d,0xc0,0xc8,0xa7,0xa4,0x4d,0xc2,0xa6,0x00,0x83,0xaa,0x5b,0x3c,0x5b,0x94,0xa8,0xd8,0x80,0xf2,0xa9,0x4d,0x09,},"\xc0\x69\x36\x32\x3c\xe3\x25\x3c\xac\x5a\xb4\xf6\xb8\x32\x70\xcd\x4c\xfe\x85\xd0\xbf\x8b\xac\x1e\x1b\x8d\x5f\x0b\x15\x3f\x54\x1c\x8e\x8e\xd9\x5f\x28\xd5\xc8\x5a\x23\x15\xcd\x93\x1b\x7c\xf3\xed\xae\x50\xf9\x28\x30\x59\x91\x62\x80\x4b\x13\x63\xd3\xac\x0d\xa0\xab\xd0\x97\x51\x02\x3b\xdd\xc1\x62\x88\x94\x4e\x61\x6d\x21\xd9\x12\x71\x97\x8b\xb7\x82\xd3\xeb\xed\x7f\xa6\x12\x84\xc7\x49\x0d\x27\x59\x3c\xa8\xa3\xd5\xb4\x75\x62\x33\x07\x01\x0a\xbc\x1f\xbf\x79\x3a\x81\x6a\xaa\xb5\xe0\x92\x4d\xec\x79\xd6\x04\x98\x96\x5c\xf7\xf8\x0a\xb5\x9f\xc0\x29\xf7\x82\x16\x67\x55\xb7\x2b\x86\x90\x75\x43\x4a\xb6\x06\xcc\x87\x0a\x7c\x0b\xc8\xbf\x29\xae\xe0\x33\xfa\x9c\xc1\x22\xed\x7c\x8e\x06\x9b\x54\x7d\xba\xe2\x59\x01\xb9\xe2\x49\xb4\x1f\xea\x0b\xf8\xda\xf3\x82\x68\x66\xbc\xae\xd2\x75\x3b\x5e\x91\xae\x93\x7e\x71\x7b\x50\x8a\x0a\xcf\x4c\x3b\x06\x1f\xf0\xcb\x9c\xfd\x38\x0e\x24\x94\x50\x09\x51\xa6\x62\xfd\x49\x28\xfc\x5f\xca\xf6\xc1\x8e\x84\xb1\xd3\x78\xe4\x9b\xd9\xd5\x96\x86\xd0\x87\xeb\xd5\x52\xd0\x7f\xa9\xba\x81\x6f\xa5\x40\x2c\xa9\xe7\x25\x2a\x64\x8d\x10\x6c\xfe\x6c\x43\x1c\xc2\xa0\x53\xe2\x29\x46\x37\xcd\xb9\x9d\x96\xab\xe6\x89\xed\xab\xc5\xca\x07\x0f\x77\xc1\xec\xd1\xd5\x2d\x53\x85\x28\x9f\x17\xce\xd7\x68\xc3\x97\x16\x71\xb9\xc0\xb2\xf8\x55\xb8\x46\x1c\x1e\x74\x6c\x7b\x38\xf7\x78\x96\xb8\x5a\xfb\xbe\xdd\x08\x37\x5f\xe9\x22\x98\x46\x14\xdd\x84\x9f\xe2\xcb\x89\xae\x71\x49\xdc\xd1\xd3\x7f\x49\x36\xe6\x7b\x14\x40\xbe\x72\xe0\x09\x39\x8b\xe6\xf0\x83\xbf\x96\x11\x48\x0b\x59\x2f\xe2\xf0\x11\x8e\x25\x3d\xb5\xd2\xe9\xe4\xb4\x54\x1c\x11\xda\x00\xf7\x16\x1a\x73\x6e\x5f\x0b\xb9\x34\x20\x8e\x3e\xf4\xe0\xb9\xa5\x22\x58\x20\x3f\x06\x0d\x18\xa1\x95\x15\x9e\x5e\x26\x8a\xa2\x80\x53\xc8\x34\xf7\xbd\x5d\xb9\xbd\x71\xf5\x07\xd9\x13\x70\xb3\xff\xca\xbb\xd4\xac\xb3\x07\x1d\x3f\x6d\x52\xc3\x49\xac\xf3\x50\x95\x34\x8c\xeb\xf5\xa8\x6f\x8c\x59\xdd\xc9\x65\xef\xf6\x10\xac\x42\x58\x04\xc0\xe2\xf6\xbe\x42\x85\x3f\x5b\x46\x43\x4a\x2c\x31\xd9\xac\x99\x53\x9b\xfd\xc0\x4e\xcf\x2f\xef\xd0\x45\x98\xfa\x63\xc1\x39\xff\x6c\x6d\x88\x41\x0e\x73\xbd\x32\x8c\xc4\x34\x9a\xb4\xbb\x86\xf2\xe2\xed\x7c\x73\xde\x96\x52\x0e\xf7\x73\x0e\xf3\x83\x45\xe0\xf9\x72\xa8\x4c\x53\x88\x10\x36\x87\xe6\x8c\x50\xf9\xd8\xc9\xaf\x90\x3b\xc6\x32\xd4\x32\x04\x06\x2a\x4f\x50\x2e\x21\x4c\x07\x05\x9c\x2c\xbe\xf7\x2a\x54\x11\x0d\xbf\x73\xe4\x25\x40\x2d\x17\xe9\x78\xec\x19\x9b\x51\x8c\xec\x03\x10\xbf\xbf\x7d\x9a\xd3\x00\x43\x4a\x4a"}, +{{0x08,0xda,0xbd,0x4e,0x5c,0x11,0x9e,0xa9,0x07,0xce,0x45,0xf0,0xa7,0xaf,0x9e,0x62,0xc0,0xc3,0xf1,0xc9,0xec,0x61,0xad,0x10,0x56,0x7d,0x79,0x36,0x28,0x54,0xc5,0x57,},{0x94,0x54,0x06,0xb8,0x5d,0x7b,0x32,0xe0,0xb1,0xab,0x12,0x00,0xb9,0x42,0x22,0xde,0x1a,0xaa,0x68,0x62,0x4c,0x60,0xbb,0x47,0x16,0xb0,0xbc,0xe9,0xdf,0x00,0x57,0x71,},{0x33,0xad,0xbf,0xcd,0x4e,0xd4,0xfa,0x67,0xc5,0x8b,0x5c,0xb5,0x9e,0x16,0x98,0x71,0x48,0x69,0x78,0x12,0x66,0x0b,0x35,0x31,0xff,0x6a,0x21,0xc7,0x49,0xb9,0x60,0x16,0x60,0xba,0xee,0xe2,0x48,0x9b,0x82,0xb4,0xcd,0xe1,0x32,0xb6,0xe6,0x2f,0x2f,0x90,0xd8,0xf9,0x92,0x78,0x60,0xaa,0xad,0x25,0x28,0x1d,0x03,0xeb,0x17,0xa9,0x52,0x0f,},"\x6c\x47\x19\xa5\xa2\xa6\x89\x48\x35\xc4\xac\x1e\xd6\x91\x59\xe5\xeb\xb5\x69\x2a\xd8\xea\xad\xa4\x39\xf7\x9e\x96\x68\x4b\x36\xce\xcf\xb4\x4b\x89\x01\x56\x31\x66\x3e\x06\x44\xf6\xc7\xab\x71\x39\x89\xd7\x42\xda\x27\x42\x72\x53\x31\x8a\x52\x43\x2d\xfa\xb2\x12\x1d\x1e\x92\x33\xea\xd7\x19\xe2\xc8\x6a\x6b\xe0\x73\x63\xd0\x02\x17\x3f\x20\x54\x46\xca\x95\xfc\x17\xb2\x46\x35\x82\x7f\xe3\x15\xf2\x22\x40\x8e\x45\xe8\x33\xf2\x9f\xf0\x8f\xf3\x1d\xac\x58\x3a\x4b\xec\x70\x76\xd5\xcc\x78\xcf\xc9\x44\x51\xcb\xf4\xf7\xe2\xfc\x5b\x5e\xd8\x07\x0f\x4e\xf8\x08\xbe\x1d\x8a\x68\x0e\xcd\xff\x59\x01\x0f\x39\xb1\xde\x80\xbe\xf1\x71\x9f\x1e\x21\x8e\x0c\xe0\xa1\xe3\x93\xa5\x66\xc5\x17\x64\xd2\x37\x0d\x95\xa6\x11\x91\xd8\xf7\xaf\x74\x0d\xc2\x08\xfa\x78\x31\xb2\x10\x67\x05\x12\xcd\x73\x76\x6e\x60\x9e\x9b\x78\x00\x21\xeb\xb2\x0c\xc8\x79\x0d\x8d\xa5\xf1\x0f\x5b\x6a\x11\x4a\x1d\xb8\x8f\x66\x76\x65\x01\x80\x2d\x9c\x36\x6e\xa3\xfa\x6f\x1b\x1e\x1e\x8b\x04\x20\x94\x34\x13\xcc\x6f\xea\xb2\x8c\x6b\x68\x3c\xd2\xb3\x33\x06\x9c\x89\x51\xbc\x45\xe8\xa1\x3b\xd5\x22\x57\x83\x51\xc8\x82\xf7\xc3\x42\xfe\x43\x31\xb9\x21\xf5\x33\xc9\x2e\xc0\x4a\x49\xb2\x92\xbc\x56\x9d\xdc\xef\xca\xb5\x72\x7f\x9b\x56\x25\xb1\x67\xa9\x02\xdc\x89\x6d\x8b\xc7\xd8\xe9\x99\x20\xf5\xdb\x8d\xd7\x67\x83\x9c\x43\xe3\xcd\xf9\x47\x08\x0d\xec\x95\x42\x14\xa6\xfb\xbe\x04\x87\xa2\xf3\x2c\xd1\x7a\x6b\x00\x03\x70\xbd\x41\x44\x84\xfb\x73\xc5\x10\xea\x01\x24\xc6\xcf\x0f\xe5\x6c\x08\x46\xa7\x9b\xfc\x59\x77\x9d\x3b\x07\xa1\xbd\x2c\x7f\xb7\xe2\xd0\x03\x9f\x0b\xd2\x1c\x8a\x30\x8f\xb0\xf5\x8f\xdb\xf9\x4e\xfa\x08\x57\xac\x3b\xdd\xdd\x86\xd5\x76\x3e\x20\x5e\xe1\xb2\x21\xf0\x60\xce\xdb\x8b\xc0\x5f\x03\x1b\x60\x6c\xc7\x4d\xad\xc5\xdb\x04\x23\x27\x48\x86\x5a\x73\xd6\xcc\xdd\xb4\xd5\xe9\x30\xd5\x28\x34\x8c\x5b\xe9\x08\x8b\xfe\x34\x45\x84\x87\xa6\x7b\x19\xa1\x8e\xca\x25\xc0\xd3\xfb\xe2\x19\x5e\xb9\x17\x07\xb6\x5d\x91\x61\xea\x93\xed\xdd\x64\xa6\x34\xb2\x32\x80\x19\x5f\xdb\x0d\x13\x88\xf6\x99\x8e\x18\x58\xa4\x5b\x88\x69\x99\xb8\x44\xe6\x79\x5d\x83\xd3\x18\x37\xe4\x41\x1f\x71\x69\x92\x26\xde\x1b\xa0\x24\x56\x08\x00\x0d\xcf\x22\x3d\xd1\x83\x59\xb7\xc6\xd4\x59\xa6\x5d\xbe\x66\xc9\x0f\x5c\xb8\xc0\x91\x22\x18\x7a\x30\x46\xa1\x6d\xd1\x79\xc3\xf4\x37\x3e\x57\xcf\x5e\xe0\xea\xb6\xa2\x12\xcc\x9e\xd8\xb5\x4b\xf3\x7f\x1d\x27\xfb\xd7\x98\x48\xe4\xec\x1f\x56\x72\x43\xab\x87\x40\xa0\x51\x49\xd9\x60\x2e\xad\xa9\x20\xa4\x6d\x61\x0d\x3c\xc8\x23\xb5\x64\x98"}, +{{0xe0,0xf7,0xd0,0x08,0x24,0xc5,0xf3,0x70,0x1e,0x55,0x17,0xa4,0xab,0xc1,0x3e,0x2f,0x2c,0x0b,0x13,0x8c,0x83,0x69,0x77,0x84,0x3b,0xbd,0x1e,0xef,0xfa,0xbd,0x96,0x8a,},{0x52,0xfd,0xda,0xe3,0xe0,0x18,0xa6,0x84,0x73,0xb3,0x16,0x8d,0x07,0x64,0xcf,0xe2,0x74,0xdc,0xc8,0x34,0xc9,0x0a,0x91,0xfb,0x4f,0xe7,0x4b,0x93,0x9d,0xd2,0x38,0xb1,},{0xcc,0xdf,0xe1,0x8a,0xd6,0xd0,0xb6,0x5d,0x08,0x6d,0x63,0x2f,0x83,0xcc,0x46,0xff,0x3b,0x3f,0x2c,0x07,0xbb,0x8e,0x76,0x9d,0x0f,0xb4,0xe8,0x2d,0xf8,0xa3,0x87,0x3f,0x9a,0xee,0x35,0xfd,0xd1,0x8a,0x57,0x83,0x60,0x31,0x80,0xa9,0x5c,0x9f,0x74,0xce,0xd9,0xdb,0x51,0x46,0xaf,0xcf,0xbb,0xdd,0x40,0xdf,0x29,0xe0,0x42,0x01,0x20,0x0c,},"\xb3\x9e\x3a\xc7\x5a\x22\x1a\xdc\xce\xd0\x9a\x85\x91\xac\x5e\x2f\xe1\x5d\xfe\xd5\xb9\x19\xcb\xaf\x14\xc6\x5e\xb7\xcd\x93\x08\x6d\xde\xe3\xf7\x47\x25\x47\xe6\x6d\xdc\x70\x06\x2b\x97\x62\x97\xd1\xa3\xc1\x70\xee\x52\x5c\x9c\x53\xba\x93\xa4\xc4\xfd\xb2\x35\x72\xb7\xca\x6e\xd1\x38\x53\xe7\x0d\xb1\xd7\x2e\xde\xb9\x94\x4b\xbc\x35\x4a\x52\x0e\x77\xae\x59\x1f\x31\x80\x92\xef\xd5\xe6\x6d\x9c\x09\x81\xc4\xa4\xbd\xa9\x8a\xa4\xe5\x90\x45\xff\x9c\x4b\x4c\xa3\xac\xb2\xff\xd8\x93\x20\x1c\x70\xb3\x4a\x77\xf2\x4e\xda\x54\x54\x9d\xc8\x4a\xd1\x34\xa3\x55\x32\x55\x38\x15\x88\x8a\xe3\xdd\x9e\x24\x1e\xc4\xeb\xbf\xf8\x6f\x8c\x1e\x8a\xdb\xaa\xc4\xb9\x1a\xfd\x18\x22\x8c\xbb\xd5\xdd\x80\x5a\xca\xbf\x0a\x1e\x29\x0c\xe5\xdd\xa0\x25\x1a\xdf\xb3\x7c\xb7\x14\xc1\x39\xb5\xa3\x24\x2d\x88\xc6\x44\x84\xa3\x76\x55\xcc\x8f\xcb\xec\xff\xa9\x7f\xbd\x14\xd6\x4d\x51\x2b\xf8\xf6\x30\x5f\x89\xc5\x09\x22\xde\x54\x16\x92\x15\x8f\xb5\x47\xfd\x53\x9f\x1e\x58\x77\xcc\x64\x94\x95\x16\x63\x32\xea\x2b\x68\x5c\xfa\x3f\x60\x20\x19\xdf\x2a\xb2\xc2\x5e\xd9\x6b\x68\x74\x5e\x9a\xe8\x9c\x94\x8d\xa1\x1a\xd8\xa8\x30\xdf\x8b\x00\xf2\xe6\x68\x19\x2d\xad\xf2\xc5\x62\x0d\x35\xc6\xe8\x1a\x28\x53\xf8\x41\xe3\x75\xa0\xd9\xfc\xa2\xd2\x96\xef\xce\x2a\xc3\x8d\x40\xb0\x30\xb5\x75\x60\xae\x6e\x83\x41\x33\x9b\x3d\x3c\x2d\x06\x11\x64\x12\x43\x19\x59\x86\x88\xfc\xa6\x18\xfc\x64\xc9\xe8\xf5\xf8\x31\x09\x7a\x05\x3a\xf1\x9d\x7d\xbd\x61\x21\x8d\x92\x67\x42\xc2\xe9\xa4\x2a\x79\xcc\x1b\x14\x89\x12\x72\x2d\x8c\xd5\xca\x79\x3a\x1a\xd7\x3b\x5f\x14\x1b\x41\x80\x9c\x2f\xc0\x53\x0b\x76\x30\xe8\x03\x90\xc6\xb3\x38\xc7\x18\x68\xda\xcc\x59\xbf\x46\x3f\xfc\x48\x90\x16\xbf\x67\xf9\xc9\xd5\x55\x3c\x1e\xde\x17\x15\x28\x13\xfe\x0b\x26\x4b\x65\xdc\xa1\xb2\xb3\x8e\x4b\x80\x9f\x8c\x97\x25\xac\x5b\x1d\x8d\x2e\x56\xbe\xc9\x64\x9f\xe5\x5c\x75\x83\xff\x23\xb0\x43\xd6\xf3\x76\x86\x28\xf1\xf0\x51\x63\x37\x82\x4a\x5a\x56\xb4\x09\x52\x0a\x6a\x6c\xb7\x7e\x4f\x5f\xc2\x0b\x9f\x68\x99\xe0\x0a\xb2\x2d\xb1\x0d\x18\x2f\x09\xb8\x1e\x94\xf3\xad\x56\x8a\x0b\x81\x24\x4d\xf3\xf1\x85\x5c\x6e\xf2\x22\xa4\x1a\x51\xb6\x2a\x46\x49\xbb\x82\x69\x0a\xb6\x5f\xac\xac\x0d\x81\xd6\xfe\x02\x60\x11\x70\xa8\xdb\x62\xcb\xc5\xec\x99\x55\xd7\x71\x1a\x1c\x39\x65\x6a\x9f\x6e\x1f\xb6\xbc\x18\x3d\x9b\xea\x15\x03\x53\x1f\x17\x36\x27\x68\xbb\x84\x1f\x9d\x21\xf1\x3a\x2c\x99\x1e\x55\xdf\xf7\xf2\xb3\x36\xe2\x9e\xb2\x95\x07\x63\x8b\xdc\xad\x7b\xb3\x1c\x69\xe9\x09\x20\x7e\xba\xbc\xc6\x53\xff"}, +{{0x6a,0xcd,0x93,0x9e,0x42,0x22,0x26,0xcc,0x54,0x43,0xd4,0xaa,0xbf,0x58,0xc1,0x1a,0xf6,0x50,0xcb,0x40,0xb9,0x64,0x8b,0x4d,0xa3,0x8b,0x92,0x7b,0xff,0x9a,0x58,0xdb,},{0x4c,0x0b,0x91,0x75,0x6b,0x9e,0x20,0x6f,0x78,0x63,0xb1,0x55,0xff,0xc5,0x50,0x9b,0xb5,0x24,0x77,0xce,0xac,0xd0,0x1c,0xa0,0x11,0x43,0x51,0x53,0x67,0x86,0x46,0xcc,},{0x79,0x99,0x58,0x77,0xed,0x24,0xc7,0x91,0x68,0x4f,0x29,0x84,0xbd,0xf9,0x60,0x9c,0x3f,0x7b,0x57,0x6c,0x57,0xd1,0x62,0xee,0x62,0x2d,0x4c,0xe8,0xf3,0x6d,0x9c,0x55,0x73,0x16,0x9d,0x88,0x01,0x21,0x6f,0x1c,0x46,0xff,0xe2,0xf6,0xe2,0xc0,0x90,0x48,0xe4,0x7d,0x4b,0xeb,0x99,0x7e,0x9a,0xbc,0x4a,0xbb,0x12,0x9f,0x9b,0x79,0x69,0x0a,},"\x82\x50\xd5\x31\xcf\x2b\x66\xaa\xc2\xb3\x78\xd5\x4b\xc5\x7f\xd3\x29\xad\x5a\x41\x4a\x59\x92\x55\x89\x8b\x3c\x3b\x45\xbf\x9c\x0d\x2c\x77\x54\x75\x66\xb6\x60\xee\xcc\x76\xa6\x95\xa2\xd6\x08\xab\xf1\x1a\x5f\x6d\xb3\xe6\x07\xfd\x5a\x21\x71\x4b\x0f\xad\x5d\x81\x4c\x01\x5e\xbf\x48\xbb\x73\xad\x75\xda\x9c\x03\xc4\xaf\x54\x89\xe7\x82\xb6\xbf\x79\x08\xa1\xbd\x52\x8d\x7c\xe7\x88\xa1\x8b\xa3\x52\x8e\x35\x37\xaa\x7b\xbf\x75\xf6\x52\x4b\xbd\x19\xa5\x30\x4b\xa2\xa4\xa3\xee\x58\xc4\x1f\xec\x31\x32\xee\x65\x01\x64\x12\x15\xef\xf7\x46\xd7\x80\x0c\x4d\x33\xf5\x2b\xe8\x35\x7e\x0e\xe7\x58\x04\x1d\x91\xcf\xe4\x3c\x60\xc3\xce\xdc\x09\xb0\xd4\x6d\x4c\xfb\x9a\xe2\xa0\x23\x9b\x6f\x33\xc6\x94\x1c\xff\x35\x37\x26\x70\xee\xf5\xc8\x85\x9a\xb6\x5b\x6e\x9f\x7e\xbc\xe3\x2f\xa1\x5a\x9a\x47\x7a\xec\xdc\x96\x83\xa1\xe3\x3a\x1e\xdc\xdc\x90\xd4\x20\xa3\x1e\x78\xc1\x53\xd2\x60\x20\x87\x1d\xaa\x4f\xff\x28\xac\xc3\xf1\x1a\x72\x06\x78\x88\x06\xb6\xfa\x02\x34\x68\xea\x5a\x3d\x18\x6d\x10\xf0\xdd\x56\x77\x96\x66\x3b\xa3\x7c\x83\x2f\xe7\x5a\xae\x7d\xcc\xeb\xf3\x19\xf9\x36\x00\xc4\x6a\x22\xf5\x72\x23\x81\x2d\xdd\x0a\x68\xd7\x6b\xaf\x5e\x27\xa9\xfc\x8b\xd6\x8c\xc1\x0b\x5b\x51\x51\xd6\x2b\x41\xf9\x34\x8e\x21\xb7\x15\x35\x2f\x26\x30\xb6\x17\xf8\x13\xb0\xc2\x89\x96\x28\x59\x04\xcf\x29\x4e\x9c\x28\x56\xb1\x7b\xa3\x5f\x9a\x82\x19\x8b\x82\x14\xa0\x35\xe2\x89\x6d\x65\x68\xbe\x42\x39\x2c\xce\xf3\x2c\xd4\xeb\xfe\xeb\xf1\x2b\xe0\x12\x52\x06\xbb\xe8\x93\x36\xd3\xe7\x62\x99\x1d\xfa\xb6\x8f\xc9\x9d\xc1\x64\x9b\x89\x13\x83\xdb\x31\xfa\xb6\x49\xe6\x28\x82\x3f\x45\x98\xcb\x63\x6a\x38\xfe\x1d\xf7\x3e\x68\xd7\x42\x5f\xc5\xd2\xeb\x55\xa0\xfd\x1b\xc9\xf5\xce\xaa\xbd\x6d\xd4\x1f\x23\xe4\xf0\x86\xc6\x92\x63\x3d\xc3\xc4\x61\x9a\x97\xab\x0e\xad\xa1\x71\xf8\x4a\xdf\x20\xec\xc8\xec\xd4\x7c\x51\xcc\xa3\xe5\x9d\xd8\x09\xb0\xae\xaa\x73\x0d\xf9\x4b\xe3\xba\xcf\xd8\xee\x88\x8b\xba\x9d\x57\x08\x50\x65\x2c\xd4\xd5\xe6\xc5\x52\xa5\x7e\x9f\x48\xa2\xb0\x6a\xac\xdc\x70\x8d\x84\xa3\x76\xfb\xc6\xc9\x4b\xa6\xbf\x64\xa5\xf0\x18\x80\x0a\x7c\xc8\x51\x24\x5a\xed\xb2\x03\x78\xb3\x29\xac\xeb\xb2\x97\x7c\x13\x98\x08\x2b\x3a\x0e\x5e\x2a\x9c\x24\x84\xfa\x30\x1d\x30\x37\xa8\x22\x4d\xdc\xc0\x95\xb1\xdb\xd8\xa2\x31\x5b\x55\xbf\x33\x18\xc2\x78\x10\xef\xc3\xd8\xe2\x5f\xa7\xa8\x78\x9b\x73\xa4\xf5\x50\x59\x08\x0b\x08\xab\xb3\x69\x9b\x7b\x86\x26\xcb\x2a\x78\x0d\x97\xcc\x1c\xa8\x03\x28\x51\xba\xf4\xed\x8b\x64\xfc\x43\x30\x86\x5f\x84\xcc\xb1\x2a\x3d\xae"}, +{{0x4d,0xef,0xf6,0x47,0xcb,0xc4,0x5e,0xca,0xed,0xc3,0xf7,0xdd,0xf2,0x2c,0x16,0x7a,0xf2,0x4e,0x3d,0x63,0xda,0x22,0xb0,0xe6,0xa5,0xb8,0x43,0x9c,0x0f,0x3b,0x19,0x34,},{0x0c,0x27,0xc9,0xd7,0x7a,0xc8,0xc7,0x25,0xbb,0x06,0x63,0x93,0x3a,0xb3,0x0d,0x1a,0xad,0x09,0xcb,0xcf,0x2c,0xd7,0x11,0x6c,0x60,0x85,0xa8,0x49,0x9f,0x70,0x14,0x02,},{0xdd,0x54,0x89,0xfd,0xe4,0xba,0x87,0xd1,0x17,0x3d,0x4c,0xee,0x06,0x82,0xaf,0xdd,0x4b,0xad,0x80,0xdd,0x77,0x0e,0xa7,0xd0,0xdc,0xeb,0xaf,0x21,0xac,0xc6,0x1d,0xd6,0x32,0x4a,0xca,0x29,0x5e,0xd0,0xe2,0x3a,0x91,0x5e,0xcf,0xda,0xd5,0x0f,0x17,0x5e,0xbc,0x51,0x6f,0x1b,0xe5,0xb6,0xd8,0x7d,0x90,0xbb,0xe3,0x86,0x22,0x49,0x53,0x02,},"\xd6\x20\x1e\xbc\x21\xce\xc1\xe9\xbc\x28\xf9\x57\xc9\xd0\x29\xcc\x38\xf9\xe8\x5e\x06\xdf\xc9\x0b\xf2\x97\xe6\x1f\x2b\x73\xb4\x07\xd9\x82\xa6\x6b\x91\xe9\x4a\x24\xe9\x1d\x06\xab\x8a\x5c\x07\x9d\x0f\x69\xbe\x57\x88\xea\x8f\xea\xce\xbd\x91\x72\x91\x19\x22\x33\x86\x2e\x6a\xcd\xa1\xe8\xcf\x9a\x48\xbf\xfb\x54\x91\xdd\x65\xaf\x54\x1b\x6c\x72\xaf\x68\x1a\x81\x82\x3d\x98\xa0\xab\xee\xb6\xba\x9f\x95\x46\x5b\x84\x11\xf9\x9e\x11\x9c\xd2\x84\x79\xda\x98\x42\x59\xbd\xf8\x6c\x9f\xef\x3c\xca\x34\xe2\x24\x69\x1f\x18\x3c\xf0\x95\x03\x77\x27\xda\x9c\xad\x29\xf2\x42\xf8\x3e\xb4\xf7\x36\xe2\x7f\xdf\x67\x01\x8d\x71\x1b\x74\xc4\x5b\x29\x55\xa6\xa7\x6e\xc1\x53\x30\xdf\x5b\xad\x80\x30\xc6\xb3\xa8\x8d\x72\xf2\x84\x47\x65\x2a\xc8\x90\x2b\x5b\x76\xcb\xf6\xb9\x45\xce\xab\xfe\xc0\x4a\x9b\x8c\xb3\x0f\x43\xd9\xeb\x77\x3e\x67\x05\x59\x4f\x0d\xe1\xb7\x0f\x1a\x20\xc9\x9f\xc4\xb1\x22\x1f\x8c\x81\xb0\xbc\x30\xda\x12\xcd\x5d\xea\x8f\x4d\x90\xf1\x3a\x81\x1a\x2c\xc1\x1a\x96\x84\x6a\xaf\xb4\xc4\x2a\x00\xe9\xae\x7d\xa2\x56\xa0\xd2\x2b\x19\x8a\xfc\x25\xcc\x10\x41\xd2\x4e\x05\x6c\xf3\x87\x60\x1d\x7b\xf7\xeb\x31\x82\xd6\x05\xfe\x5e\x63\xb1\x8d\x53\x1a\x5f\x84\xe5\xdb\xd0\x18\x4a\x76\xc6\xc4\x67\xa8\x26\x3a\x98\xb5\xc0\x05\xfc\xb2\xaa\xf9\x89\xf5\xcb\xd0\xa9\xd9\x03\xfc\xfc\x60\x9d\x6e\x57\xd9\xc4\x39\x02\x1c\xea\x93\xe4\xc4\xe9\x91\xf1\x93\xca\xf3\x24\x37\x70\xb3\x25\x78\x74\x80\x76\xb7\xf4\xcb\x97\xf1\x7c\x17\xa7\x9b\x82\x25\x3c\x24\x23\xdb\x69\x8c\xd0\xa3\x3a\xb3\x3b\xb0\x9b\x0b\x08\xcb\x8c\xea\xdc\xa1\xe2\x9c\x5d\xe2\xfc\x12\xb2\x40\x7b\x6c\xc5\xaf\x5a\xe9\x76\xdd\x3e\xc6\x30\xd8\x33\x9b\x7d\xd1\x1f\xa3\x4c\xaa\xc1\x50\xc7\xc4\x79\x1d\x8c\x42\x7b\x0a\xd9\x2e\x05\x29\x06\x7a\x88\xd5\x20\x11\xe1\xe0\xa1\x82\x99\xb9\x69\x89\x6f\x8b\x83\x60\xf7\x5c\x45\xc4\x96\xda\x47\xb0\x9b\x45\x0f\x98\x22\xbc\xbc\xd4\x3f\x42\x93\xc5\x16\x80\x2b\xf7\x47\xc4\xab\xee\xdf\xaa\x3e\x79\xcb\x91\x03\xd3\x77\x0f\x56\x07\xb7\x75\x16\xe5\xb1\xce\x0f\x64\xb6\xee\xc7\xbe\xc3\xc6\x47\xc0\x06\x95\x6d\xc5\x5b\x6c\x79\xf6\xaf\xb3\x9d\x1f\xc3\xec\xf1\x1b\x97\x4b\x44\xae\xdb\x72\xae\xd1\x31\x66\x35\x08\x3c\x21\x24\x50\x2e\x5c\x72\xd8\x6e\xca\xb6\xac\x90\x24\x3e\xb3\x9a\x6a\xa9\xcb\x94\x80\xda\x38\xe1\xed\xb8\xd2\x8f\xf9\x09\x24\xc0\x5d\x5d\x21\xaf\x5a\xf9\x59\x57\xb8\x02\x07\x81\x37\x87\x11\xa2\x9d\x09\x20\xac\xad\x8c\xcb\x39\xa3\x11\x69\x32\x78\xc9\x90\x0b\x47\x0d\xa2\xbd\x4c\x12\xa0\x1d\x73\x96\x26\x44\x01\x7b\x60\x34\x71\x3b\x2a"}, +{{0x5a,0x19,0xbf,0x6c,0x94,0x1f,0x39,0x4e,0x93,0xbd,0x36,0x25,0xfb,0x81,0xcd,0x9d,0xa8,0x1c,0x90,0x20,0xb1,0xc5,0x31,0x25,0x7a,0x7b,0x59,0x57,0xbb,0x07,0x92,0x11,},{0x20,0xe8,0x69,0x9d,0x08,0x7c,0xe5,0xe8,0x15,0x1d,0x28,0x05,0x3d,0xce,0x66,0xc2,0x3f,0x28,0x08,0x1f,0x35,0xbd,0x26,0x81,0x9b,0xbe,0x85,0xd3,0x8a,0x09,0xd7,0x02,},{0x2a,0x2f,0xd6,0x05,0x4e,0xf4,0xe7,0x9b,0x72,0x19,0x1a,0x0c,0xcb,0xd2,0xb1,0x8a,0xeb,0xab,0xe8,0xb9,0xa7,0x18,0x61,0xde,0xd9,0x8b,0x7c,0xdc,0xb6,0xa6,0x25,0x53,0x28,0xbc,0x1a,0xec,0xb0,0xc9,0x33,0x57,0x21,0xa9,0xa9,0x6e,0xe4,0xb5,0xb4,0x3f,0x90,0xd3,0x22,0xec,0xf8,0x35,0xf7,0x8b,0x26,0x4d,0xae,0x6e,0x38,0x7b,0xfb,0x04,},"\xf7\x21\xca\x3a\x32\xc1\xe8\x1c\x9c\x6f\x46\xd5\xe1\xfb\x50\xe7\xce\x2f\x4e\x70\x93\x33\xca\x2b\x55\x0d\x52\x13\xb6\x77\x3d\x67\x0c\xa5\x9a\x2b\x50\x86\xa4\x43\x84\x3a\xc5\x08\x13\xb2\x44\xc9\xc9\xfa\xc6\xd1\x19\x69\x89\x27\x81\x35\x12\xc8\x4f\xe3\x0a\x89\x55\x30\x10\x13\x8f\x91\xe8\x17\x6f\x5c\xf2\x57\x89\xd7\x28\x1d\xdb\x83\xa2\x46\x70\x5d\xcc\xb9\x99\xc4\xcd\x0a\xe2\x19\xc6\x45\xf6\xd7\x1d\x45\x1a\xe1\xf8\xd2\xf9\x89\x1a\xf8\xcc\xce\x03\xf4\x38\x55\x9f\xb8\x36\x67\xb8\x07\x7f\xbe\x43\x5a\x74\x4a\xf0\x19\xd6\xd1\x39\x9f\xd2\x13\x7f\x5a\xfb\x8e\xf3\xf4\x7b\xcf\x73\x5e\x7c\x9e\xd8\xa5\x4b\xa0\xc1\xc6\x56\xb6\x65\x0b\xb3\x0a\xdb\x1d\x57\xec\xd2\x07\x46\x39\x49\x42\x31\xa2\xe9\xe2\xf9\x85\xed\x84\x22\xee\x03\xcb\x3f\xd7\x38\xc7\x35\xa1\xb8\x28\x06\x04\x74\x60\xed\x84\xf7\x46\x8c\x3c\x64\xb3\x5d\xb0\x6b\xc5\x8d\xe4\xbb\xa4\x63\xe6\x38\xa9\x41\x33\xdf\x10\x6a\xc4\xf4\x70\x36\x1c\xcd\xe4\x41\x57\x29\x9d\x22\x5b\x17\x79\x88\x91\xba\xf5\x92\x19\x86\xa2\xba\xe3\x26\xdd\xa0\xb8\x96\x17\xc6\x77\xbd\x14\x08\xba\x27\x48\xba\xa6\x7c\x8a\x2c\x5a\x96\x9b\xc0\x0c\xb4\x0d\xbf\x49\x0e\x07\xe2\x2c\x91\x3a\xfd\xde\x63\x04\xa0\x7f\xc9\xe6\x08\x46\x99\x24\x56\xbf\xb0\x66\x3a\x09\xde\xf6\x8d\xef\x67\xa1\x6d\x29\xe9\x8c\x7b\x55\x35\x18\x48\xa8\xcf\x92\x31\x0c\x74\x63\xc4\x75\xf2\x49\xc6\xf7\x55\x7f\xd0\xd7\x55\xca\x88\xf8\x77\x84\x7f\xe0\x76\x57\x56\xac\x34\xa2\x3f\x78\x40\xd9\x5c\x3d\x29\x4e\x66\x3b\xb1\x51\x8b\x75\x92\x7c\x41\x07\x57\xe0\xf5\xc0\x7c\x5a\x7f\xb2\x15\xdc\x72\x07\x43\x3e\xbf\x79\x1e\xdf\xce\xc9\x0e\x93\x0f\x8e\x3b\xa9\xdb\xbb\x98\x54\x13\xc2\x23\xbe\x87\x87\x3b\xd3\x23\x99\x75\x81\x80\x4d\x88\x96\xda\x38\x6a\x6e\x91\x20\x05\x0a\x0e\xae\xd3\x12\x40\xaa\x17\xc7\xb6\x69\x4c\x30\xcb\xcc\x3c\x69\x56\xa6\x82\x0f\xc9\xab\x21\x87\x55\x33\x96\x3d\xc3\xb0\xd8\x83\x58\x27\x12\x76\xc6\x05\x65\x28\x91\x0d\xd9\x89\xae\x0c\x33\x0d\x17\x98\xf7\xd8\xe7\xd1\x18\x4b\x84\xa8\x14\x34\x32\x5b\x8c\x30\x2e\xdf\x60\x1d\xc5\xe6\xf8\x47\xfb\xac\xbd\xee\xff\x78\xc6\x62\x1d\x1d\xaf\xdc\x23\x9b\x18\xb8\xc1\xaf\xdc\xb4\xb9\xda\xbd\x5d\x3a\x92\xa9\x32\xea\x15\x99\x54\x6e\x62\x5f\x96\xd6\xec\x6f\xb1\xcc\xcb\x76\xb4\x76\xb3\x30\xac\x59\x25\x9c\x63\x4f\xac\x9b\x3f\xa7\xde\x7a\xe7\x05\x37\x73\xb5\xbe\xfa\x00\x1b\x04\x92\x9f\x74\xb7\x12\x41\xe1\xb2\x57\x69\x6d\x65\xa2\x6c\x1b\x4a\xc8\x6b\x7b\x1f\xbd\x69\x57\xfb\x9b\x95\x08\x4c\xe7\xd7\x00\x90\xf5\x5d\x44\x53\x46\x94\x30\x5e\x91\x76\x9a\x82\x94\x13\x04"}, +{{0xb5,0x06,0xc0,0x1d,0x69,0x74,0x6e,0xb4,0xbc,0x63,0x58,0x72,0x0e,0x43,0x8a,0xd3,0x30,0xc8,0x8b,0x60,0x5a,0xad,0x65,0x2f,0x47,0x99,0x57,0x3a,0xb0,0xa1,0xaa,0xf9,},{0x7a,0xc8,0xb6,0x88,0x63,0xbd,0x69,0x15,0x15,0x83,0x78,0x9d,0x86,0x4a,0x73,0x57,0xe3,0xa0,0x45,0xfa,0x86,0x52,0x2a,0x9d,0xaa,0x6e,0x26,0xfb,0x79,0xed,0x6d,0x23,},{0x17,0xa1,0x9d,0x26,0x91,0xb7,0xb0,0x46,0xd7,0xb1,0x96,0x69,0xad,0x73,0x14,0x0d,0xb9,0x2f,0x0c,0x97,0x8c,0x7f,0x61,0xbc,0x38,0x67,0xd9,0x2c,0xa9,0xd4,0x75,0x80,0xa0,0x38,0x0b,0x59,0x01,0xba,0xd8,0x2a,0xf4,0x5f,0x67,0x6f,0x74,0x28,0x73,0x01,0x98,0x0f,0x71,0x87,0x1a,0x42,0x26,0x1d,0xbe,0x08,0x02,0x95,0x03,0x36,0xe6,0x0b,},"\xf7\xfc\x18\x06\x6e\xd0\x4b\x30\xe6\x33\xd9\x86\x5d\xa3\x21\x4b\xec\xa6\x0b\xd7\x96\x01\x9c\xd7\xec\xc9\x18\x66\xf9\xef\x24\x46\xc1\xfa\xb0\x6d\x86\x51\xbe\x7f\x10\x1a\xec\x7b\xb8\x4e\xe2\x1e\x71\xad\x02\x02\x15\xfc\xfb\x36\xf2\xd1\x1e\x45\x79\xac\x39\xf8\xe2\xb1\x29\x0e\x38\x96\xd5\x22\xbc\xf5\x13\xaa\xa0\x67\x71\xf8\x6e\xe2\x28\xcf\xf3\xa2\x0a\x1f\x10\xc5\x64\x33\x95\x89\xbb\xa9\x60\x53\x44\xc0\xa6\xe6\x82\xad\x5b\xa4\x0d\x10\x41\x94\x1b\xc4\x6f\x98\xb9\xd0\x9c\xa1\x7f\x8f\x04\x4e\x98\x3b\x8a\x49\x08\x93\x3d\xf2\x26\x3c\xf7\x88\x11\xc2\x4c\x8f\x48\x14\x35\x4f\x6f\x4c\x68\xb7\xee\x7b\x78\x30\x82\x93\xbf\x78\xfd\x0f\xf1\x22\xf0\x95\xc1\x4a\x73\xa5\x97\x97\x17\x2a\xe0\x5c\xfc\xec\x19\x56\x3e\xb1\x8d\x2b\xc5\x30\x0e\xd4\xbf\x6b\xdc\x44\x3e\xa9\xb8\xbc\x1c\xbe\xde\x94\xca\xb9\x05\xed\xa5\xa6\xa9\x31\x59\x7d\xe4\x02\x14\x6f\xac\x9c\xf8\xcd\x6a\x8d\x10\x46\x69\xf9\x13\xfa\x83\x40\x01\xca\x4d\x09\x0f\xb7\x94\x9d\x31\x09\xa6\x3c\x05\x49\xb0\x3f\x15\x1b\x71\x17\xc4\xf4\x69\x74\xba\x59\xc6\x82\x96\xed\xfd\xde\x76\x92\xee\x43\x2a\xce\xf7\x61\x06\x47\xe0\x95\x78\x65\xe6\x2c\x1a\x0c\xf0\x56\x59\x82\x3a\x55\x45\x2d\xd5\xe4\x71\xb3\x1c\x5a\x49\xab\x05\xb5\xaa\xfd\x5a\x0e\x53\x0e\x89\x6b\x58\xcc\x52\x2e\xcf\x19\xe5\x2e\xc8\x2f\xa1\x47\xf9\xe3\x85\x17\x4c\x7e\xc3\x3d\x1d\x9b\x86\x93\x4a\xeb\x4f\x6c\x57\x00\xf7\xd5\xeb\x33\xff\x73\xc9\xfc\x6a\xa4\x7d\xf5\x1e\x09\x22\x9e\x6a\xe8\x94\xe8\x6c\x81\x8b\xef\x06\x5f\x82\x59\x71\xa4\xcb\x90\xad\xfe\xfb\x31\xeb\xd9\xd1\xb7\x94\x22\xdc\x98\x68\xf9\xf7\x4e\x7a\x32\xcd\x40\x71\xef\xb6\x9b\x27\x23\x3e\x6e\x5c\x60\xde\xdc\xd5\x32\x1c\x03\x0a\x46\xcd\x26\xf5\x60\x2c\xac\x74\x7e\xe4\xb5\x22\xd8\x57\xa3\x32\x1a\x03\xf4\x03\xa6\x00\x62\x50\x40\x63\x61\xe4\x88\x15\xaf\xba\x77\xce\x08\x90\x34\x41\x84\x5b\xa8\x72\x25\xd8\xb2\x40\x46\x74\x5d\x40\x65\x64\x5a\x1b\x98\x41\x0c\xac\x48\xd1\x37\xcb\xbb\x8a\xb1\xeb\xa5\x0d\xa9\xc2\x31\xe9\xac\xf3\x22\xa6\xdb\xec\x0e\xf4\x16\xa4\x46\xc3\xb6\x10\xd9\x35\x69\xfd\xf4\x5a\xa6\xcd\xc1\xb6\x40\xd8\xf3\x01\xd7\x86\x93\xb2\x82\x6c\xc6\xed\x46\x85\x68\xad\x9a\x0f\x94\xaa\x9b\x9f\xb9\x2f\x7e\x78\xd4\x84\xfd\xf5\xd8\xd4\x5c\x99\x1e\x28\x07\x4d\xcd\xd6\x80\xd3\xb1\xf1\x89\xef\x6b\xdc\x32\x0e\xe6\xe6\x4d\xd1\xf8\x0d\x92\x64\xd8\x30\x42\xd2\xc4\x3d\x83\x58\x1e\xf0\x39\x4b\x1b\x5d\x1f\x69\xf3\xbb\xbf\x04\xb7\xc8\x08\xba\x34\xc1\x58\x0f\x16\xf7\x65\x37\xb6\xa7\xeb\xd0\xa1\x90\x8b\xe9\x49\x4d\x3f\xca\xa9\x87\x1d\xb1\x57\x50"}, +{{0xe1,0xcc,0xb8,0x0a,0x26,0x2f,0xf8,0xaf,0x1e,0xda,0x07,0x5c,0x97,0x2c,0x8e,0x94,0x1e,0x77,0xce,0xf5,0x7b,0xdb,0x0a,0x82,0x57,0x2c,0x28,0x20,0x0b,0x49,0x3c,0xa3,},{0x3d,0x37,0xe2,0xa5,0x02,0x7e,0xff,0xde,0xe0,0x7f,0xa5,0x11,0xe4,0x23,0xb2,0xbc,0x56,0xed,0xce,0xa0,0x75,0xb4,0x16,0x49,0x76,0x67,0x25,0xc6,0xb3,0x0a,0x10,0xf4,},{0xfd,0xa3,0x4b,0x65,0x2b,0x79,0x74,0x6f,0x89,0x7e,0x22,0x2d,0x37,0xb7,0x7a,0xa2,0x50,0xd0,0x2c,0x52,0x7c,0x48,0x33,0xdf,0x80,0xea,0x41,0xd5,0x21,0x89,0xd5,0x07,0x00,0xe1,0x28,0xb7,0x8e,0xe8,0x14,0x9c,0x9b,0x19,0xf3,0xab,0xf7,0x55,0xac,0xef,0x53,0x48,0xf5,0xfb,0xaf,0x1c,0xeb,0x41,0xc0,0x38,0x90,0x6a,0xc5,0x94,0x60,0x01,},"\xcf\xdc\x54\x97\xb0\x23\xaf\xa6\x2a\x7f\xe5\x92\xca\xa9\x2b\x87\x5c\x77\x05\x74\x78\x34\x00\x2f\x77\x84\xff\x16\x61\x89\x39\x88\x15\xd4\xe8\xa7\xa0\x03\x8e\x1f\xda\xdd\xde\xba\x51\x05\x73\x27\xad\x19\x60\xe8\x59\xce\xe5\x65\x26\xbb\xb4\x12\x7b\x6a\x5f\x90\xd0\x4d\x08\xb1\x5e\xee\x66\xc9\xcc\xf8\x8b\x4b\x7d\x1e\xe9\xd3\xb8\xb8\xc6\xf4\x2d\xb3\xc3\x4e\x59\x04\x8a\x15\xc6\x04\x1f\x14\x2c\x40\x79\x36\x8b\x7b\x11\xe2\x99\x70\x11\x8b\x99\xe5\x67\x0a\xe3\x1f\xcc\xfd\xff\x13\x99\x14\x2e\xe0\x6b\x2e\x3e\x2b\x3c\x97\x07\xdd\x64\x11\x97\x86\xe2\xfa\xb4\x7e\x0b\xad\x2c\xc8\xb5\x58\xd9\x63\xbb\x48\xa4\x9a\xd2\xc6\x37\xdd\x35\xb2\x5d\xb5\x4b\xc5\xa2\x63\x02\x22\xfa\x2a\xce\xce\x9c\xe1\x2a\xb0\x81\x30\x77\xf7\x65\x9f\x50\x74\x42\x9c\xa6\xb4\x94\x33\x10\x32\xae\x79\x2a\x59\x9c\x42\x5e\xe2\x97\x45\x1d\xcf\x5e\xe1\x95\x29\x03\x12\x74\x2e\x64\x7a\x77\x95\xb8\x4d\xcc\x66\x4d\xda\xe2\xa1\xfb\xf8\xc4\x54\x8a\x37\xfd\x82\xd8\x10\xe2\x14\x5f\x01\xdf\x1a\x6d\x3b\xcc\x42\xa9\x1a\x10\x76\x8e\x09\x1f\x3d\x69\x32\x9a\x7b\xad\x6c\x07\x2c\xac\x6d\x89\xaf\xa3\x1c\x02\x90\x56\xd6\xb6\x22\x12\x16\x5c\xeb\xcd\x49\xac\x67\x2e\x38\x30\x26\x7a\xf9\xf2\x8e\xa3\x19\xbd\x04\x2f\x6c\x59\xde\x47\x01\xe5\x82\x48\x73\x6c\x8d\x97\x6a\xcf\x93\xb9\x9d\x2f\x46\x47\xa5\x47\xd3\x92\x44\x7a\x48\xda\xc1\x11\x81\xe1\x6b\x15\x01\xa9\x4c\x93\x16\xe5\xa6\x7c\x99\x0b\x35\x81\x0b\x4c\xda\x04\x73\xa6\xa4\xe5\x76\x14\x21\x58\x68\xe2\xe0\x02\xc6\x05\x8b\x42\xe4\xee\xec\x84\x13\x9d\xc1\x9e\xdf\x5f\x80\xae\xef\xfa\x4f\x5b\x07\xe8\xfd\x23\x13\x9e\xdd\xa3\x18\x99\xeb\xe6\xfe\xe7\x86\x43\xce\x68\x6b\x29\x63\xa3\x20\x72\xbd\x3b\x3b\xba\x68\x48\x5a\x05\xc2\xcc\x04\x56\xc3\xda\x50\xc7\xc8\xc6\x51\xa3\x06\x6d\x13\xa3\x66\x0b\xd4\x7a\xb6\xdf\xec\x49\xe0\x15\x57\xa6\x74\x28\x96\xaa\x4b\xc6\x36\x3a\x79\x7d\xba\xd1\xa4\x09\xcd\x4a\x50\x91\x1e\x70\xea\x00\x7a\xf8\xe9\xb1\xbb\x7e\x3a\xb5\x62\x15\xa5\x75\xc9\x0f\x73\x9c\x2d\x48\xb3\xb3\x46\x94\xb5\xac\xdf\x07\x98\x0a\xe5\x28\xde\x06\x21\xed\xfa\xc8\xb8\xfa\x84\x95\x4d\x56\xdb\xb4\xd0\x30\x82\xb9\x84\xf1\x3e\x5d\xbe\x9c\x71\x12\xff\x97\x16\xf5\x50\x53\x06\x46\x62\xce\x0f\xb8\x1e\xa3\x5f\x98\xfd\x2c\xd5\x11\x37\xa4\x6f\x64\xe0\xc1\xca\xf4\x4e\x54\x07\xdc\x96\x17\x60\xb2\x59\x7f\x7f\x92\x00\x61\x7d\x47\x13\x40\xcf\x15\x17\x6c\x3d\xa8\x80\xfe\x4e\x0e\x93\xa7\x2f\xb9\x49\x26\xfa\xed\x86\x5d\xfd\xc7\x72\xe1\x85\x29\x2c\x1e\x36\xb1\x21\x17\x81\xc3\xe9\x38\xe3\xd4\xf2\x4e\x29\xaf\x51\x7a\x37\x96\x83"}, +{{0x4f,0xc5,0x12,0xef,0xd8,0x6e,0x3a,0x63,0xb3,0x95,0xea,0xff,0x1b,0xa0,0x11,0xe1,0x59,0x0f,0xb9,0x32,0x6a,0xd3,0xff,0xed,0xe7,0x87,0x6d,0xcc,0x3e,0x9f,0xab,0xdc,},{0x26,0xc2,0xa2,0x2f,0x9b,0xfa,0xd9,0x06,0x06,0xdc,0x61,0x3f,0xf1,0x07,0x02,0x1f,0xcd,0xdb,0xec,0x72,0x37,0x06,0x66,0x60,0xb4,0x88,0x96,0x43,0x49,0xe0,0xc8,0x28,},{0x82,0xc8,0x24,0xa7,0xd1,0x13,0x9e,0xc7,0x3a,0xe1,0xd0,0x23,0xad,0xf6,0x28,0x11,0x44,0x1e,0x96,0x82,0x87,0xf1,0xa5,0x80,0xb8,0x59,0xcd,0x66,0xcb,0x33,0xb5,0x8e,0x40,0x9b,0xde,0xb2,0xa8,0x74,0xbf,0x4c,0x23,0x61,0x0b,0xd4,0x4f,0x69,0x31,0x47,0xf2,0xf7,0xc2,0x9d,0x44,0x3a,0x90,0x50,0x84,0xf3,0xea,0xaf,0xd9,0x33,0x0e,0x04,},"\x07\xcd\x1e\x9b\xfa\x38\xa7\xd8\x85\x34\x65\xa9\x3c\x77\xab\x4f\x30\xfa\xf9\x14\xe4\x8b\xc4\x76\x3b\xa0\x7b\xf9\x6b\xa8\x08\xc1\xf5\x9a\xd4\xce\x9b\x7d\x92\x1f\xbb\xc7\x79\x65\x9d\x7c\xa3\x6e\xdb\x7d\xd3\xac\xf7\xa2\x94\x52\xa8\x45\xb4\x9f\xb6\x54\x3a\x3b\x6c\x5c\x1c\x29\x3a\xff\x61\x84\x85\xa1\x0e\xea\x60\xee\x96\x49\xac\x9d\x48\x1e\x69\x49\x96\x7d\x39\x38\xb5\x2f\xe0\x9c\x36\xb9\xad\xe0\x75\x81\xdb\x4e\xb5\x42\xa9\x7f\x5a\xc8\xac\x73\xd3\xee\xa1\x84\x72\x25\x56\x76\x0c\xf4\x83\x09\x05\x64\x55\x30\x61\xb9\x0a\x0b\x6d\x2d\xff\x47\x07\xbe\x76\x39\x37\xa1\x05\x94\xa8\x2b\x76\x6b\xb2\xcf\x6d\xaa\x52\xfa\x8d\x7b\x48\xf3\x21\x27\xc4\x31\xad\x9a\xae\xd3\xbf\xde\xb9\x9a\xd4\x21\x18\xa1\xb4\xde\x7b\x99\x21\x34\xed\x9c\xda\xd0\xb5\x29\x6d\x19\x7a\x48\x5e\x49\x3e\xcf\xec\xa3\x65\x3a\xd2\xce\x0f\x92\x41\xaa\xbc\x09\x6d\x7c\x4b\xa6\x03\xba\x7d\xdd\x07\xa8\xb2\x57\xfe\x52\x32\x76\x41\x70\x73\xa6\x5f\xa4\x43\x42\x56\xfd\x1f\x23\x9e\xc1\xde\x5d\xa1\xa0\xa8\xc5\xe6\x86\xee\x14\xd9\xdf\xa4\x38\xc5\x3b\x99\xc9\x54\xaf\xab\x2f\x79\xe6\x0b\x71\x26\xf2\xcb\x58\xa2\x6e\x29\x0d\xa1\xdc\xcf\xc3\x01\xf2\x39\x74\x8e\xde\x7b\xcf\x1b\xb7\xcc\xb4\x72\x0e\x69\x2f\x57\xe5\x3e\x6f\x59\x07\x53\x99\xe1\x08\x0a\xc8\xaa\x9a\x61\xa5\x68\xc4\xc5\x69\xd3\x6e\x76\xa2\xd7\x27\x1f\x2c\x44\xde\x4e\x36\x3a\x8c\x91\x6a\x4e\x44\x6b\x02\x7b\x64\x39\x2e\x90\xce\xab\xf6\xb6\x07\x1b\xc4\x7a\x13\x79\xb6\xaa\x63\x44\x76\x3b\x2a\x0e\x7f\xf7\xc4\xa2\x7b\xff\x31\x06\x72\x1c\x25\x3e\x4c\x1d\x67\xc3\x7f\xa3\xd7\xc1\xec\xd0\x55\xb8\xe9\x29\xd5\x2a\x8e\x45\xed\x89\xfb\x18\x0f\x74\xb5\x52\xfe\x06\xf0\x66\xc7\xe4\x31\x8c\xa2\xf9\x15\x94\x6e\x83\x20\xd5\x80\x65\x61\x47\x2f\xb8\xff\x7f\xa8\x07\x2d\x8e\x6f\xd1\xce\x63\xcf\x87\x38\x2f\x7b\x94\x04\x54\x0c\x1d\x40\x6c\x70\xb2\x26\x85\x36\x77\x09\x26\x45\xce\x99\x69\x22\xe7\x34\x5d\xc0\x7f\xb7\x33\x9f\x9a\x54\xff\x07\x35\x2d\xd2\xb9\x93\x06\x3c\x2c\x83\xd1\x28\x1a\x4f\xd1\x78\xe5\xa5\xf8\x0a\x5b\x33\xc2\x29\xd0\x57\x83\x67\xd4\x41\x92\xe9\xa4\xd2\x1e\x97\x34\xd3\xbd\xa0\x83\xb7\x0f\x47\x10\x3f\xd1\x25\x17\x70\x21\xdf\x3e\x53\xd7\x99\x86\xef\xea\x2d\xc0\x4f\x02\xc0\xac\x27\x87\x88\x31\x9e\xf3\xa9\x13\x2e\x62\x32\xea\x6d\xb3\x9c\xa5\x87\x08\x55\xf9\x59\x2f\xff\x6c\x20\x9a\xd2\xf1\xc2\x9d\xd1\x68\x55\x28\x98\x97\x9e\xcf\xf8\xc8\x11\x27\x24\x8f\x83\x10\x51\x53\x00\x65\x61\x29\xd9\xb7\xac\xbb\x7e\xd1\xe4\x6b\xc9\x8c\x04\xd1\xa3\x5b\x18\x91\x37\x38\xe9\xdd\xe4\xd2\xb0\x65\xf4\x18\x42\x42\xd8"}, +{{0x0b,0x7d,0xfa,0xd0,0x5b,0xa6,0x65,0x11,0x1e,0x16,0x81,0xbd,0xc0,0xbc,0x8b,0xa9,0x73,0x76,0x7c,0xb8,0x58,0x77,0x02,0x0a,0x2d,0xbf,0x91,0x83,0x25,0x57,0x1d,0x9f,},{0x95,0x05,0xd9,0xe8,0x6d,0xce,0xf5,0x6c,0x9d,0xb7,0x6f,0x28,0x62,0xb9,0x0e,0x1f,0x27,0x73,0x20,0x2f,0x17,0x50,0x40,0x5e,0x7e,0xe5,0xae,0xd0,0xfc,0x54,0xf8,0xb9,},{0x41,0x5a,0xdb,0xb2,0xf2,0xb9,0x84,0x05,0x77,0xfd,0x18,0x41,0xf9,0xaa,0xe2,0x52,0xaf,0xe8,0xf5,0xa7,0x22,0x36,0x01,0x7d,0x50,0xdb,0x22,0xd2,0x28,0xcd,0xee,0x9f,0x5b,0x3e,0x8f,0xe9,0xa1,0x7a,0x4d,0x4e,0x98,0xb7,0x34,0x13,0x81,0xe8,0xd8,0x62,0x5c,0xdc,0xea,0x95,0x6d,0x25,0x3b,0x74,0xe0,0x2d,0xac,0xb8,0x49,0x20,0xa0,0x09,},"\xc4\x3f\xd3\x4b\xb1\x42\x4c\xca\x4e\x4d\xfb\xa7\x5c\x28\xbe\x80\x18\x44\x44\x6c\xa0\x89\x02\x08\x85\xc7\x48\x38\x25\x47\x16\x4a\x9d\x4a\x7f\x95\x70\xd3\xd1\x71\xad\x69\x81\xab\x50\xee\xee\x08\xa4\xa6\xc6\x6d\x76\x99\xd2\x3e\xdb\xe1\xfa\xaf\x44\x66\x0c\x72\xf4\x55\x2d\x87\xd2\x65\xac\xe8\x79\x28\x23\x47\x4b\x90\xa5\xd7\xf7\x40\x1d\xeb\x93\x77\x62\x7f\x60\xb0\x36\xb3\x6e\x04\x4e\xb7\x6b\xf1\x32\xfd\xdf\xcc\x0e\xf5\x70\x4a\x63\x3d\x84\x5e\x96\x2b\x47\x51\x7f\x0b\xaa\x34\xd3\xd6\xe9\xa8\xb9\xf8\x16\x8b\xcd\xc8\x4c\x6d\x2b\x30\xc6\xf3\x43\xe7\x53\x57\xf7\xf2\xc0\x03\x9b\xd2\x54\xb2\x44\xd3\x6c\xd6\x16\x75\x58\x1f\xb8\x34\x57\x0e\xd4\x11\x3a\x78\xe6\x06\xf1\x45\xa1\x11\x99\x2c\x2c\x6b\x61\xc4\x26\x76\x28\xec\x87\xcd\x88\xc3\x6a\x3c\x84\x70\x6e\x44\xae\x96\xa9\x6e\x0c\x84\x80\x31\x85\x46\xd6\xea\x6a\x6d\xf1\x8a\x2b\x4f\x19\xf8\x36\x0c\xfb\xce\x4e\x9d\x1c\xf1\x01\x1f\xfe\xa5\x63\x3a\x66\x61\x9a\xa4\xa6\x5c\xf6\x9b\xe4\x45\x96\x17\x94\x5e\x43\x59\xa9\xd4\x32\x60\xca\x1a\x20\xf4\xed\x7c\x1a\xe5\xff\xff\x3b\xd9\x22\x94\xea\x70\xab\xba\xe0\x38\x5b\x09\x35\xcd\x1c\x0e\xb5\x18\x30\x29\xc5\x85\xa0\x29\x4b\x79\x99\xe3\x2e\xf7\xa2\x90\xfc\xb0\x95\x67\x5d\xc4\xf6\x01\xe8\xf2\xc9\x6f\x35\xb7\x34\x9a\x37\x05\x75\x09\xf4\xec\x70\xc9\xf5\x0f\x60\x11\xf1\xf5\xe6\xb0\x61\xc0\x91\xd1\x1c\x0e\xd5\xde\xc8\xec\xe8\x81\xaa\x34\x05\x08\xf6\x96\xd9\xe9\xcc\x72\x98\xe6\xbc\xcd\x7c\x21\x0e\x2c\xe0\xde\xd8\x35\x92\xa3\xcf\xa1\x3e\x80\x78\xfd\xb3\x25\x8b\x39\xf1\xd1\x1c\xdf\xe0\x96\x70\xc1\xe6\x0a\x39\x10\xa4\xff\xf5\x1c\x6c\x7f\x7d\x66\x24\xf4\xc9\x3d\xf8\x88\x8c\x52\x6f\x48\x4f\x9b\x13\xe0\xa7\xf6\x29\x64\x78\x39\x78\x68\x4e\x29\x26\x79\x80\x0e\xd5\xeb\x28\x0e\x28\x7c\x7e\x63\x9e\x85\xfa\xa5\x3f\xba\x2f\xa2\x04\x5c\xe2\x7d\x8f\xb3\x08\x36\x07\x26\x55\x0d\xf9\x75\x2d\xb3\x05\xf8\xf0\x66\x47\x97\x0d\x01\x46\x91\x99\x9a\xfa\x97\xb6\x19\x3f\xfc\xc6\xd5\x32\xf4\xfa\x69\xe1\x33\xa1\xd1\x0f\x30\x47\xfc\x00\x38\x1f\x49\x97\xbb\x84\xe5\xb6\xcd\x60\x28\xc6\x21\x32\xcf\xc0\x24\xbf\xeb\x98\x03\x01\xf2\x95\x12\xbb\xd1\x09\xd0\x89\xac\xe1\x82\xcf\x9c\x2f\xfa\xb1\xb1\x7e\xb0\x0b\x6e\xb4\x6a\xe1\x98\xda\x99\x3f\x5e\xfe\x7c\x1d\xc2\x2d\x25\x04\x7c\x1e\xe5\x24\x65\x17\xe7\xf5\x75\x8f\x99\x6a\xbd\x83\xf1\x3d\xa2\x2c\x13\xdd\x20\x5e\xe1\x91\xb5\x5a\xfd\x48\x31\xef\x07\x8b\xb6\xea\x07\x3a\x62\x5b\xc9\x7c\x81\x29\x61\x60\xbb\xf2\x55\x9b\x27\x5c\xc3\x7c\xcf\x01\xb9\x1f\xd8\x7d\x4d\x99\xa3\x67\xaa\x99\x78\xda\xdd\x06\x89\xf8\xa6"}, +{{0x78,0x18,0x8d,0xf8,0xc7,0x54,0x78,0x56,0x21,0xe2,0x7a,0xe5,0x8e,0x10,0x0d,0x50,0x80,0xe1,0x6e,0x0a,0x15,0xe2,0x77,0x05,0x1f,0x95,0xf0,0x80,0x90,0x0e,0xc0,0xd3,},{0xa1,0xbd,0xee,0xe9,0x8b,0x07,0x57,0xba,0x9c,0x2d,0x84,0x09,0xb8,0x74,0x24,0xe6,0x4e,0x42,0xf9,0x93,0x2a,0xcf,0xa9,0xbc,0x71,0xfb,0x3f,0x8c,0xa0,0xe1,0x1d,0x52,},{0xb9,0x41,0x14,0xed,0xa4,0x6c,0xcf,0xc2,0x2a,0x44,0x71,0xa6,0x4d,0x79,0x08,0x92,0xe5,0x9c,0x5d,0x50,0x56,0x18,0xeb,0x0e,0x70,0x13,0x92,0xc7,0x09,0x61,0x3e,0x2d,0x50,0x3a,0x5c,0x2b,0x66,0x60,0x1e,0x63,0x6a,0x3c,0x1c,0x7d,0x49,0xb1,0xac,0x79,0x8d,0x90,0x89,0xb0,0xf9,0xcc,0xd0,0x57,0x9b,0xb9,0x06,0x34,0xd0,0xbd,0x75,0x0e,},"\xcf\x70\xcc\xa5\x7f\xeb\x1b\xee\xfe\x98\x5a\xd5\xaf\x9d\x43\x48\xd3\xa4\x6a\x63\xde\x10\x75\x38\x1f\xb3\x63\x9a\x04\x4f\xd6\xe6\x09\x1f\x5d\xb9\xc9\x4d\x39\xbe\x0f\x13\xad\xe6\xd9\xa0\x74\xe6\x7b\xa7\x06\xb3\xa8\x80\x62\x95\xf6\xb6\x54\x86\x57\x28\xc5\x8c\xa6\xe9\x41\x9d\x5d\x04\x3f\x21\x10\x81\x4b\xbf\x36\xfc\x40\x70\xe4\xd9\x45\x49\x65\xc2\x51\x20\x2c\xa3\x95\xef\xe3\xfd\xbd\x54\x4f\xeb\x18\x7e\x34\xca\x3c\x80\x79\x51\x79\x55\x2f\xce\x9a\xa8\x04\x43\x0e\x5b\x6c\x86\x85\x34\x1e\x91\xd5\x88\x9f\xbf\x3f\x98\x19\x04\x62\x0f\xfe\x70\x13\xf5\x3b\x93\x9e\x17\x44\x3d\x61\x4e\x7e\x6b\xb5\x7a\xd6\x74\xf3\xb4\xb0\x01\x63\x05\x26\xcf\x73\x02\xa7\xd0\xaf\xe7\xdc\x24\xd6\xda\xde\xf6\xfe\xba\x3f\x96\x97\x3a\xa5\xb8\xd6\x27\x52\x62\xe4\x30\xa8\x2f\x67\x86\x96\x97\x1a\x8b\x60\xe3\x8d\x3b\x2b\xcc\x17\x0d\x5b\xc2\x03\x02\xa3\x9c\x59\x6d\x27\xfe\xe3\x9e\x5d\xa5\xb1\x0e\xa9\xf3\x82\x29\x9e\x19\x81\x97\x17\xa7\x18\xd3\x7d\x15\x5f\x13\x92\x31\x82\xb5\xb7\xa1\xc5\x4c\xa1\x09\xb2\x2c\xa8\xe8\xb2\x6c\xa5\xca\x3f\x3b\x90\x62\x21\x94\x61\xba\xce\x97\xe8\x90\xc9\x4e\x41\xca\x3d\x84\x58\x7f\xbd\xf6\xe2\x40\xc3\x5c\xca\xb7\x1d\x58\x47\x7d\x28\x16\x8e\x93\x37\x26\x86\xd4\x2a\xad\x32\x4a\x3f\x16\xaf\xe0\xe9\xb8\x9e\xe2\x0e\x48\x5f\xe6\xc8\x64\xb5\x01\x3b\xa8\x83\x99\xee\xaa\x15\x98\x35\xa8\xb2\xbb\x2f\x25\xf5\x79\xca\x3b\xae\x67\x5c\x63\xda\x1b\x50\xd9\x9d\x4e\xd9\x78\x69\x2e\x56\x00\x23\x3f\x38\xab\x7e\x7a\x5a\xe0\xfb\xf8\xc0\xb6\x9c\xc3\x8b\xd3\x0e\xab\xd9\x77\xef\xa0\x5e\xe2\xc8\x35\x14\x30\x2b\xd4\x0c\x4b\xdc\xe7\xa4\x11\x0a\xfb\xb6\x57\x9c\x62\x0e\x97\xf8\xcf\x2e\x9b\xab\x2d\xcc\x7c\x33\xf1\x96\xe5\x7f\xe7\x61\xa0\x50\x12\x28\x94\xb7\xa7\x5a\x92\x95\x31\x99\x6d\xda\xad\x78\xde\x1d\x4d\x92\x4c\xd9\x3a\x61\xdf\x22\x77\x76\xbc\x1c\x39\xfb\xb8\xde\x1c\x44\x38\x86\x8b\x6a\x3a\x2c\xd9\x4c\x07\xb2\x9e\x3f\x6b\x23\xcc\x7e\x0b\x63\x68\x90\x09\xd9\xd0\xba\xe1\x60\x6b\xaf\xc7\xa8\x08\xf2\xd2\xfa\x25\x62\xb8\xdc\x09\x38\x42\xc0\x1f\xdb\x84\x0d\xa4\x86\x0a\xce\xd3\xfc\x52\x5c\xa3\x34\xed\xcf\x65\x94\x8b\xc4\x16\xf9\x8c\x45\x0f\x00\x12\xa6\x10\x7d\xd7\xf8\xed\xe4\x0e\x1c\x48\xc9\xe8\xa5\x65\xa8\x10\xb9\xcf\xd2\x03\x56\xdb\x19\xf1\xdb\xde\x59\x89\x21\x33\x2e\x0d\x81\x3f\x0c\xb8\x76\x84\x37\x03\x88\x77\x2f\xf3\xcb\xfc\xbf\xa2\x99\xc1\x98\xc9\x7b\xfb\x96\x17\x76\x8a\x05\x16\x1f\x41\x69\xff\x5d\xe5\xd9\xf4\x00\x62\x09\x0f\xb8\x82\x98\x4d\x9d\x5c\x7a\xa7\x8e\xdd\xcb\x96\x34\xe4\x66\xb8\x85\x3d\x51\x2b\x4a\x54\x6d\x74\x23"}, +{{0x73,0xcb,0x02,0xb0,0xbf,0x26,0xa0,0x15,0xda,0x1d,0xc3,0x01,0xfc,0x12,0x5d,0x7e,0x6c,0x30,0xb6,0x3c,0x9e,0x6e,0xee,0x9e,0x06,0x5d,0x4e,0x84,0x71,0x32,0xc3,0x25,},{0xac,0x9e,0x3d,0xd2,0xce,0xb9,0xb2,0x3e,0x74,0x8c,0x04,0xba,0x75,0x77,0xfe,0xdf,0x7c,0xea,0xb9,0xed,0x87,0xdc,0x43,0x0b,0x5f,0xe2,0x2e,0xac,0x50,0x95,0x0e,0x0d,},{0x1a,0x5d,0xd4,0xc8,0x91,0xc8,0xe1,0x32,0x57,0x01,0x87,0xc2,0x3b,0x9a,0x1e,0x4b,0x26,0xf0,0x54,0x60,0xe8,0x75,0x67,0x38,0x19,0x39,0x6d,0xf5,0x61,0xc8,0xaf,0x0e,0x48,0x33,0x3b,0x62,0xc7,0x77,0x29,0xd4,0x9f,0xc4,0x0e,0x17,0x4a,0x7f,0x3c,0x21,0xf8,0x5e,0xf4,0xd3,0x39,0xce,0xb8,0x0b,0xd2,0xe0,0x37,0xd8,0x03,0xaf,0x56,0x0e,},"\x0a\x2b\x61\xba\x35\xe9\x6e\x58\x19\xb8\x8b\xfd\xb2\x8b\x7c\xe0\x2e\x64\xae\x9c\xf5\x72\xb2\x1f\x13\x55\x2c\x0d\xb1\x0f\x39\x60\xd4\x4b\xa3\x47\x2f\x43\xab\xc4\xe6\x29\x5b\xdf\x79\x0b\xd9\x33\xba\x39\x75\xfd\x44\x65\xfa\x3e\x2f\xe2\xdb\x02\xb6\x37\x77\x52\x22\x3d\xec\x98\xfc\xb2\x40\x4f\x3a\xba\x43\x26\x5a\x6f\xa7\x97\x6b\x6c\x6c\xb6\x86\x8b\x88\x1b\xd6\xf3\xd2\x5c\xd9\xd6\xf7\x0e\x51\x2f\x80\x89\xc8\xef\x26\xfd\x58\x24\x50\x53\x77\x9e\x59\xc4\x72\x5a\xef\xa2\x64\x67\xc9\xf5\x00\xe1\x7f\x3e\x15\x73\xf1\xa8\x55\xe9\xb8\xb2\x19\x25\xea\x05\x27\xf3\xce\x8d\x88\xfb\x54\xa4\x7a\xbe\xed\x14\xf3\x99\xcc\x2d\x9f\x1f\xe5\x46\x65\xfa\xe0\xa8\xf0\xc6\x88\x72\xa6\x00\x04\x6d\x1d\xc3\x63\x97\xd3\x10\xce\x39\x3f\xce\xaf\xe8\x7c\x17\xeb\xe1\x22\xfd\xb5\x43\xae\xa7\x10\x85\xba\xec\x98\x27\x3f\x41\xac\x96\x69\x8c\x15\x0c\xf9\x11\xd0\xe5\xde\x23\x92\xd8\x48\x41\xd0\x12\x76\xae\xfb\xfe\x99\x95\xe1\x0a\x6d\x46\xef\xdc\x26\x78\xd4\x56\xc9\xf3\x6b\x2e\x10\x11\x4d\x11\x87\xe7\xac\xa7\x39\x03\x7e\xa5\x1f\x85\xfd\x62\xa2\x94\x29\xba\x52\x9c\xdd\x8a\xd9\x13\x47\x49\x74\x87\xed\x7e\x87\x09\xd4\x77\x6e\xf6\x86\x70\x79\x2d\x06\x15\xbc\x96\xda\x51\x78\xd6\x06\xdb\x63\xe4\xe5\xcb\x17\x2a\xcf\xbc\x1c\xbe\x20\x26\x93\x50\xf1\xb6\x05\xf3\x5d\xcd\x47\x91\x35\xbd\x30\xfb\x4b\x5a\x39\x17\x6c\xff\x74\x4d\xdb\xb3\x06\xc9\xe7\xb4\x16\x7d\xe0\x37\x9a\x61\x66\xbe\x5a\xaa\x74\xd7\x15\x7f\xac\x95\x7d\x88\xdc\x57\x59\x7c\xfe\xf2\x3e\xb5\x10\x8b\x3c\xe5\x3f\xc6\x32\xda\xd1\xb9\x72\xa2\x9d\xa5\xde\x32\xd2\x0d\x8e\xce\xde\x67\xff\x00\xda\x4a\x08\xa0\xcc\x1a\x98\xbe\xe7\xa9\x4e\x3c\xb3\x2f\xee\x94\xae\x25\xa4\x13\x54\x47\x02\xc3\x7b\x3e\x17\x78\xa0\x70\xcd\xd4\x84\x0b\xd3\x9f\x5f\x45\x79\x51\x92\xa8\x67\x86\x38\x76\xed\x0d\x13\x0d\x46\xe2\x91\x39\x35\x08\x28\x09\xf7\xe1\x5a\x49\x67\x10\xf2\x55\xd7\x83\xda\x3d\x01\x6a\x65\x4c\x15\xff\x5d\xf9\x07\xa3\xcc\xaf\x37\xcf\xe1\x1c\x8c\x3d\x49\x65\x07\xd6\x76\x0c\x05\x38\x20\xf0\xf5\x94\xc3\xd0\x1c\xa2\x69\x17\x8a\xca\x52\x5a\xb2\x82\x1e\xf5\x5f\x92\xd8\x5f\xe6\x85\xea\x34\x47\x2e\xd1\x39\x81\x71\x06\x4d\x74\xa4\x22\xec\x91\xd1\xa6\x70\x61\x8f\xc9\xf3\x24\x24\xbc\xb1\x1a\x77\xf6\xfb\x4e\x2f\xef\xd2\xc4\xe8\xa7\x3c\x45\x28\x86\xe9\x31\x66\x4d\x1a\x83\xbd\x92\x73\x29\xc0\x4d\x25\x0b\x83\x52\x1d\x7d\xc1\x3c\x91\xce\xe1\xec\x05\x0e\x11\xd4\x2a\x4b\x0c\x8c\x06\x9b\x61\xc4\x42\x2d\x3a\x49\xc0\x7e\xff\x29\x05\xb7\xbc\x7f\x4a\x5b\x43\xe6\xb0\xd6\x1d\xfb\x50\xe4\xee\xa2\xe9\x0d\x29\x8a\x78\x1d\x05"}, +{{0xdb,0x05,0x60,0x63,0x56,0xba,0xcf,0x23,0xaf,0xf6,0xcd,0xdd,0x42,0xb2,0xc6,0x94,0x35,0x2b,0x5a,0x0f,0xec,0x56,0x0a,0xff,0x54,0xd9,0xbd,0x97,0x10,0xef,0xe0,0x6a,},{0x32,0xa5,0xc7,0xcc,0x49,0x09,0x78,0x6b,0x48,0xa5,0x3f,0x31,0x09,0x3f,0x54,0x9a,0x9f,0x17,0x30,0xca,0x66,0x90,0x38,0x3f,0xdb,0x5f,0x14,0xc2,0x66,0x6e,0x31,0x32,},{0x53,0x09,0x9b,0x76,0x6a,0xdf,0x29,0x44,0xb6,0x82,0x13,0x74,0x84,0x2c,0x25,0xd6,0xe6,0x7b,0x0c,0xcd,0xe9,0xc6,0x37,0xfe,0xcb,0x11,0xb8,0xb8,0xb0,0x72,0x03,0xe3,0x07,0x57,0x32,0x80,0x5f,0x4f,0x14,0xae,0xae,0x73,0xbd,0x62,0xe3,0x08,0xb5,0x88,0x7d,0x68,0x9e,0x29,0xcd,0x89,0xb2,0x3a,0x47,0x69,0x43,0x11,0x07,0x17,0xb1,0x00,},"\x1b\xc9\xc2\x83\x3f\x37\xcd\xf1\x35\x6f\xad\x16\x67\x68\x64\x27\x17\x70\x1b\x38\xa0\xab\x0c\x2f\x58\x1a\x26\xd2\x22\xd6\x5c\xce\xe4\xbf\x0f\x6d\xfe\x64\xd3\x3b\xc0\x23\x9f\x71\xd4\xb8\x26\x44\xb0\x16\x25\xa1\xa3\x5f\xe7\x98\x67\x62\x39\xe0\xca\x77\x9e\xf2\x31\x38\xee\xbe\x3b\xd1\x9d\xe2\xd8\xf7\xc1\x5b\x4d\x96\xf1\x3e\x51\xbc\x63\x3b\xea\x5d\x61\x22\x5b\xca\x1d\x63\x39\xba\x53\xe8\x1f\x7d\x8d\x24\xc5\xd6\x0f\x04\xce\x8c\x72\x67\x61\xd2\x64\x58\x4f\x1c\x7e\x5b\x5b\x69\x92\x45\x6c\x1c\x76\x89\x2d\x63\x52\x11\x1e\x3b\x92\x6f\xe0\x25\xc0\x00\x9d\xb6\x7c\xe0\xdd\xc7\xf7\x64\xe0\xc9\xad\xb0\x48\x1b\xc2\x79\x54\x84\xd9\x63\x73\xa9\x62\xa7\xb7\x4a\x55\x96\xf5\x27\xa7\x34\x76\x49\x8c\x78\x23\xdf\xfa\x6c\x85\x43\xb0\x79\x71\xb5\xaa\x27\x1c\x12\x25\x5e\x09\x18\xdd\x73\xf5\x0c\x30\xc9\xa8\x5a\xc7\xc2\x99\x3d\xd6\x55\xda\x59\x43\x12\x63\xf5\x91\x4b\xe7\x06\x37\x4b\xe9\xc0\x75\x85\xc2\x87\x13\x28\xb4\xdb\xc3\x94\x01\xc9\x57\x07\x38\x7e\x6e\x06\x9d\x44\xb9\xd8\xfb\x05\x8f\x22\xe3\x15\xaa\x0d\x5b\x4f\x11\x68\xfc\x10\x79\x62\xb0\x64\xf7\xd8\x45\xaf\x8e\x21\x31\x95\x1d\x1c\xd6\x6d\xc8\x4d\xba\x46\xd2\x00\xaf\x4f\x4c\x5f\x51\x22\x1b\xc9\xb2\x19\x69\x42\xf8\xb4\x0e\x7d\xdb\xc9\xae\xb3\xd9\xaf\xc0\x71\x25\x95\x13\x13\x5a\x01\x6f\x28\x66\x09\x9f\xa1\x0f\x4c\x3b\x73\x50\x0b\xd5\x5c\x47\x7b\x24\x15\xe1\x0a\x27\x9b\xa1\x10\xd2\x94\xf3\xdd\x18\x42\x17\x7d\x0b\x4b\xfb\x17\x34\xdd\x0c\xcb\x7e\x39\x4b\x43\xd1\x6f\x0b\x75\x48\x36\x22\x80\xf4\x34\x76\x4d\xa5\x7f\x19\xed\x3e\x30\x2e\x53\x70\xfb\xa4\x96\x64\xc2\x30\x05\x74\x33\xcc\x64\x7e\xb2\x7c\xd2\xc7\xc1\x8c\x7d\x66\x90\x6f\x08\x82\x46\xc2\x2f\x7f\x79\x03\x99\xde\xb4\xc5\xfb\xb9\x06\x18\x17\x69\xbe\xf5\xaf\xbe\x8a\xd1\xf5\xde\x55\xbe\x58\x8f\x52\xf6\x9c\x54\xd4\xef\x5a\x96\x9a\x0d\x99\x5c\x27\x40\x7b\x23\xed\xd9\x24\x3d\x24\x99\xfd\xf2\x94\x73\xb1\x95\x5c\x84\xb3\xf7\xcb\xdc\xd8\x1b\x76\x56\xec\x0b\xe9\xe0\xfd\xb3\x38\x13\x56\x96\x0f\xd0\xca\x70\xe7\xea\x74\xb6\x46\xfc\xd3\x13\x94\x8e\x6d\xdb\x47\x60\x94\x76\xfb\x6f\xa4\x84\x2f\xa7\x88\xa0\xd5\x7b\xe3\xb0\xa6\xca\x18\x19\xf7\x16\x14\x76\x00\x43\xec\x49\x04\x88\x19\x39\x96\x8a\x43\xb5\xd1\x92\x8f\x84\xa5\x91\x90\x93\xbc\x38\x41\x58\x81\x71\xa9\xcd\x39\x0f\x8f\xcd\x61\x53\x8b\x54\xe6\xef\x99\x77\x05\x73\xe1\x98\x6d\x15\x0f\xa9\x6b\x7a\x07\xe1\xd1\x94\xaf\x1c\x0b\x40\x55\x00\xac\xb3\xd1\x0e\x3b\xe6\x47\xc8\x98\x62\x00\x6f\xa7\x85\x83\xe7\x61\x66\x84\x29\x20\x16\x0e\xb5\x7f\x0b\x2a\x6e\xdf\x19\x3c\x44\xc5\xee\xac\xf4"}, +{{0x1d,0x13,0x9b,0x1a,0xd0,0xc3,0xaf,0x1d,0x5b,0x8b,0xe3,0x1a,0x4e,0xcb,0x87,0x8e,0xc6,0x67,0x73,0x6f,0x7d,0x4f,0xa8,0x36,0x3a,0x98,0x09,0xb6,0xd1,0xda,0xbf,0xe3,},{0x24,0x28,0xcf,0x1d,0xeb,0x20,0xfb,0xad,0x1f,0xdc,0x66,0x5d,0x82,0x5b,0x61,0x41,0x22,0xdf,0x10,0x1f,0xbe,0x14,0x73,0xa7,0x99,0x96,0xba,0xf6,0x96,0x74,0x34,0xb8,},{0xdd,0x64,0x5e,0x51,0xed,0xab,0x04,0xdb,0x31,0xe3,0x31,0x72,0xcf,0x27,0xac,0xee,0xed,0xcc,0x04,0x63,0xa9,0x63,0x91,0x4a,0x0e,0xac,0x8e,0xfd,0x5a,0x34,0x34,0x1f,0x6b,0xbc,0x52,0xe0,0x42,0xba,0xaf,0x3b,0x40,0xc8,0x9a,0x57,0xef,0xb6,0x45,0x74,0xe6,0x96,0x77,0xfc,0xe9,0x55,0x24,0x6c,0x1f,0xc0,0xf2,0x69,0xef,0x81,0x90,0x00,},"\x8d\xf2\xd2\xdf\x9b\x98\x4d\xa8\x44\x33\x48\x6a\x81\x3c\x98\xc5\x97\x3a\x69\x6c\x11\x62\x46\x10\xb2\x3a\xa4\x38\x08\x34\x64\xf6\x5a\x76\x79\x66\x15\xb7\x28\xc2\xed\x4e\x60\x71\x58\x55\xaf\xc2\x39\x45\x0d\x5b\xc0\x91\x1f\xf2\xa8\x52\x30\x20\x5c\x6f\x13\x49\xba\x5b\xd8\x7e\xa6\xf7\x20\xdb\x6b\xa7\x0b\x77\x42\x17\x88\xe0\xc6\x54\xae\xbc\x23\x07\x4c\x5f\x41\xd2\x29\x07\x72\x14\x0d\x98\x1a\x6b\xc4\xfe\x70\x9a\x26\x8e\x64\x17\x2a\x02\x6b\x27\x01\x18\xb4\xdb\x51\xab\x6a\x13\xc9\x9b\x06\x31\x86\xd8\xd5\xb3\x38\xe9\x77\xed\xdc\x6b\xb5\xfd\x7d\xd5\x7d\x98\x45\xa3\xc3\xfe\x76\x17\x7d\x57\x38\xdc\xa1\x6a\x8f\x91\x02\x85\x75\x00\x17\x4f\x23\xff\x4c\x3b\xf3\xc8\x53\x6f\x11\x58\x0e\xf8\x51\x4a\x40\x9f\x5b\xbc\x9c\x02\x96\xf1\x2e\x34\x78\xd4\x08\x7f\x95\xef\xaa\x6c\x63\x60\x71\xd2\x11\x57\xbf\x11\x77\x4b\xbf\xe7\x69\x33\x06\xca\x72\x13\xda\x47\x13\xeb\xaa\xab\x35\x54\xed\xf0\x80\x11\xa5\xff\x73\xda\x12\x03\x75\xae\xd1\x96\x28\x67\x0f\x28\xab\x24\xb6\xf5\xd5\xa1\xd5\x70\x48\x0f\x65\xd3\xc1\x52\xbf\xf1\xb4\x7b\xf0\x66\x69\x29\xcb\x7c\x99\xd9\x03\x3f\xaa\xe8\x53\x4f\xc3\x5d\xa7\x30\xb8\x11\xeb\xcc\x25\xae\x10\xa1\x95\xaa\xb1\x2c\x32\x6a\xa4\x5b\xf8\x05\xc6\x2d\xd4\xcd\x5f\x86\x86\x23\xc0\x4a\x8e\x1c\x6a\xa7\x2f\x1e\xa4\x40\x0c\x60\x86\x7d\xff\x62\x2f\x31\x64\x34\xf1\xec\x89\x50\x3c\x6f\x9f\x65\xc1\x37\xb4\x94\x4c\xbc\xb3\x5f\x08\x6c\x74\xcc\xea\xfa\x22\x42\xac\xca\x6f\xfe\x61\x1c\x4b\x55\x87\xf5\xb7\x5f\xfa\xd3\x49\xf0\x0b\xf9\x6e\x4a\x58\x0a\x87\x5b\x92\x65\x40\x69\xb6\x2e\xea\xc0\xbf\x78\xe5\xae\xdd\x71\x86\x9e\xe0\x5b\x9a\x94\xe1\xc9\x8e\x35\xa9\x78\x00\xa4\xa2\x12\x20\xb0\x39\xcd\x5e\xbb\xb7\x56\xd4\x0b\x40\x42\xe2\xc8\x4a\x2a\xe9\x81\x82\x51\x1d\xae\x8e\xd3\xb8\x9f\x4f\xa0\x0f\xb8\xed\x94\x63\x16\x45\x97\x10\x05\x2a\xd4\xc0\x2f\x63\xdf\x05\xd3\xbb\x1a\xce\x33\x67\x21\x51\xbd\xf5\xda\xb4\x6c\x7b\x58\x3d\xb3\x73\x89\x9d\x4f\x03\x5b\x6c\x11\x12\x58\xb4\xe5\xa9\xe7\x07\xa1\x1d\x21\x5e\x44\xe6\x8e\xf1\xa6\xf0\x53\x80\x9a\xa5\x1b\xd9\x02\xe1\x3c\xa9\x9c\x1b\x1c\xec\xc8\x3b\x9c\x23\x5c\x71\x0e\x79\x7d\x2b\x1a\x24\x9b\x2e\xa0\x79\xb5\xc1\x67\x4e\xd7\x16\x9f\x1b\x6e\x67\xf1\xac\x77\xf8\x6b\x74\x32\x98\x96\x93\x35\xa7\x72\x44\x0f\x7f\xbf\xa7\x25\x13\x50\x0d\x84\x16\x61\x14\xa8\xfd\x54\x13\x94\x64\xd4\x2b\x99\x55\x30\xd3\x23\x70\xb6\x9b\xff\xc7\x58\x9d\x6d\xcc\x97\xe0\xbf\x17\x85\x6c\xc3\xbf\x41\x64\xdb\xec\xcc\x8a\x88\x1d\x41\x4d\x6a\x62\x02\x92\x76\xc5\xf8\x13\x7c\x0b\x3c\x68\xbc\x8f\x4b\xd4\xe7\xcf\xf6\x5e\xf2"}, +{{0x4d,0x22,0xe3,0x31,0xe0,0xcf,0x6f,0x6a,0x27,0x2d,0xb4,0xd2,0x06,0x87,0xff,0xb0,0x59,0xf1,0x22,0x5d,0x81,0xe4,0x11,0x23,0xb8,0xc8,0x9b,0x07,0x4d,0xe7,0x6a,0x3b,},{0xb1,0xe4,0xcf,0xae,0xad,0xd6,0x7b,0x12,0xd7,0xb9,0xdb,0xfc,0x0f,0x88,0xed,0xd0,0x37,0x3f,0x9a,0x88,0xc7,0xfa,0x33,0xfb,0x7f,0x2b,0x1e,0x47,0x5e,0xcc,0xb6,0x1b,},{0xc3,0x66,0xb8,0x02,0xf6,0x82,0xfc,0xd7,0x05,0x25,0x26,0x4f,0xb1,0xa3,0xcb,0xcd,0x0e,0xe3,0x5e,0xcf,0xf5,0x97,0x7c,0x2a,0x55,0x4d,0xa9,0x39,0x22,0x9f,0x17,0x81,0x9a,0x96,0x1e,0xa7,0x4c,0x3d,0x7a,0x78,0x81,0xac,0x5c,0x1f,0xa1,0x6b,0xf9,0x84,0xd9,0x45,0x6a,0x13,0x88,0xd3,0x46,0x3c,0x44,0x94,0x42,0x9b,0x1d,0xc4,0x54,0x02,},"\x9c\x8e\x3f\x5b\x4d\x70\x40\x30\xe1\xba\x71\xf0\x2e\xfc\x4b\x87\xd6\xff\xfb\x55\xbc\x3d\x8d\x03\x81\x8f\x91\x56\x24\xfc\xf7\x01\xc5\x4a\xdf\xaf\xa2\xb6\x94\xb8\x77\x51\xcb\x9f\x69\x91\x8c\x0f\x05\x0f\x4c\x10\x5d\x5c\xcb\x40\x10\x0b\x28\xdf\xd4\xf4\x11\xd5\x91\xc1\x20\x19\x17\x6a\xc2\x01\x6b\xfb\xfd\xf0\xdd\xf1\x1d\xb8\xa7\xe3\x9a\xa7\xb9\xe2\x16\xf6\x67\xc0\xa1\x5f\xb9\x77\xea\xa9\xba\x3b\xc4\x55\xcc\x58\x94\x5f\x3e\x94\x4b\x8a\xc2\xfb\xf4\xd2\x4f\xe7\xe1\xe6\x19\xcd\xbe\xee\x3e\x5e\x12\xa9\xa5\x27\xd2\x8f\x5f\xd7\xcf\xd9\x22\x0f\x13\x08\xd8\x97\xb6\xd4\x31\x4a\x5a\x01\x87\x86\x4a\x2d\x62\x1c\xf1\xb2\x84\x42\x61\x24\x7b\xf5\x20\xba\xfa\x9b\xf2\x26\xe1\x15\x68\x1e\xcd\x77\x42\x79\x80\xcd\x12\xb0\x8c\x35\x9c\xec\xd1\xde\x3f\x55\x45\xf8\x07\xf8\x1e\xd7\x63\x02\xff\xd6\x47\x7f\x89\xb9\x58\xcd\xf1\x29\x54\xcf\x70\xc1\x42\x53\x29\x93\x83\x16\x47\xea\xca\xb0\xb4\x80\x7b\xfd\xad\xb4\x38\x9d\x7d\xff\x2c\x4e\xf0\xef\x5a\x5c\x61\xd0\xdf\x76\x2e\x2e\x90\x80\xa7\x18\x1c\xec\xd0\x6a\x53\x19\x9f\x0d\xfe\xf7\x02\x62\x7a\xde\xcf\x5f\xcd\x9b\x3e\x68\xc7\x23\x33\x16\x17\x27\xf8\x71\xc7\xd1\xc4\x30\x51\xff\x1c\x92\x1f\xd5\x3b\x64\x22\x38\xb9\x78\x80\xd6\x4e\x25\xfa\xc5\x12\xab\x95\x4b\xed\xbc\xa5\x40\xf5\xb2\x00\x91\xec\x72\xe6\x7f\x88\x77\x0a\xfc\x32\xf2\x12\x5c\xa0\xda\x4f\xe8\x7b\x56\xaa\xc9\x17\x7f\x1f\x4f\x67\xc8\x51\x72\x5c\x5e\x8a\xfe\x64\xf6\x64\x79\x98\x33\xfd\x79\x10\x0b\x77\xea\xd2\x58\x38\x87\x9f\xff\x47\x47\xaa\x0d\x56\x72\xec\x0a\x94\x34\x81\x34\xbd\xbd\x4b\xb3\x9b\x0c\x67\xa0\xcd\x30\x60\x2e\xdf\x4f\xec\x6f\x7a\xf0\xcc\x2b\xda\xe1\x26\xce\xa8\x42\xdf\xaa\x43\x91\xdc\x5d\xde\xa9\x38\xe1\x79\x21\x68\x24\x0c\x2d\x8b\x25\x35\x2f\x9f\x3a\x64\x42\x35\xce\x36\xfe\xfe\xb6\x99\x2a\xd8\x8e\x28\x7a\xd2\xd8\x5b\xd8\x50\x39\x6f\xc2\xe5\x17\xa1\x52\x09\xf5\x92\x0a\xc9\x8c\x53\x2b\x1f\x4d\x86\x9b\xeb\x08\xbb\x03\xcf\x7c\x91\xaf\x3f\xfc\xed\x68\xd5\xfb\xfe\xf8\x6f\xf9\x4e\xce\x6e\x2e\xad\x34\x84\xce\x08\x0d\xb1\x7b\xbe\x40\xf1\xdb\x43\x2e\xc1\x65\x0e\xd2\x4f\xdd\x25\x0f\x33\x45\x74\x5c\x9b\x7b\x91\x98\xc9\x10\x9a\x37\x26\x1f\xc5\xec\xbb\xb1\x2f\x83\xa0\xe1\x22\x0a\x18\x67\xd4\x5f\xdd\xfe\xa8\x1d\xcf\x75\xf4\xec\x7f\xdb\x52\x50\xe5\x77\x54\xd6\xde\xa2\x70\xb6\x28\xa7\x95\x30\xec\x28\xb6\x19\xbc\xa9\x49\x3e\x63\x05\xcf\xc4\x41\x4c\x1c\x1d\xe3\x38\x9e\x89\x01\x97\xc8\x5f\x28\x40\x4f\x3f\xa9\x6a\x1e\x2f\xd9\x20\x6b\x47\x2e\x8a\x0a\x0d\x32\xaf\x55\x60\x6b\xb0\x83\xf7\x6a\x19\xb8\xea\xe3\x47\x9a\xe5\x1d\x98\xa9\x9a\x62"}, +{{0xa5,0x22,0x8f,0xf9,0xbb,0xb6,0xf2,0x32,0x32,0x7e,0xb8,0xd8,0x79,0xd7,0xf8,0xb2,0x77,0xca,0x72,0xba,0xe1,0xf9,0xa9,0xd0,0xe2,0x60,0xdd,0x90,0x57,0x1d,0xb4,0xf9,},{0xd8,0x2f,0x6a,0x69,0x74,0xf5,0x1c,0x88,0x08,0xd9,0xd6,0x17,0xf4,0xce,0xc2,0xd8,0xa3,0x7e,0xb1,0x1a,0x14,0x23,0x7c,0x9a,0xb9,0xcf,0x11,0xeb,0xc8,0x0f,0xf6,0xc0,},{0x97,0x65,0x0f,0xae,0x3f,0x59,0xca,0x76,0x47,0x7f,0x25,0x47,0x16,0x77,0x49,0xc5,0x83,0x02,0x48,0x88,0x32,0x25,0xe3,0x54,0xff,0x46,0xc7,0xe3,0x81,0x96,0x52,0x20,0xd9,0xbe,0xf2,0xc2,0x05,0x7c,0x7d,0x19,0x90,0xf0,0x8b,0xca,0x4c,0xfd,0xe8,0x77,0xff,0xf2,0xb4,0xaa,0x81,0x3d,0x9c,0x4b,0x84,0xfb,0x79,0xec,0xed,0x81,0xef,0x05,},"\x1d\xf7\xa6\x83\x5e\x33\x10\x98\x3e\xe7\xec\x73\x11\x25\xf5\xb5\xcf\x11\x7a\xf0\xe3\x6b\x36\x85\xbf\x54\xac\xe1\xc4\x8c\x46\x30\x05\x60\xa4\x5e\x9f\x9b\xdd\x96\xa0\xbc\x4d\x14\xe8\x9d\x4b\x57\x21\xa2\xca\xff\x66\x18\xb1\x82\xed\xb1\x20\x2f\x3d\x0c\x5d\x11\x8d\x09\xb6\x18\x12\xc0\x10\xe8\xb1\x96\x34\x45\x41\xcd\xee\xfe\x5f\xd1\xf9\x61\xc5\xdd\x75\x45\x95\x55\xab\x72\xef\x2a\xa7\xa7\x59\xa4\xf3\xad\x3c\xae\xd4\x4f\x4c\x9a\x8e\xf9\x5b\x76\xed\x9a\x99\xb5\x5d\xd8\xa2\x60\xba\x08\x01\x0d\x29\xff\x81\x9f\x2a\xf3\x51\x3c\x1a\x64\x0d\x6c\xcd\xde\x49\x99\x20\x5f\x9f\xca\x88\x57\x11\x5d\x8b\x5d\xb9\xf7\x0a\x62\xe5\xee\xa0\xd5\xaf\x06\x5d\xe1\x53\xf2\xed\xed\xee\xc6\x3e\x15\xc8\xe0\x9a\x92\x58\x21\x82\xac\x07\xd8\x1c\xa6\x3c\xa4\xaa\x59\x7a\x22\x20\xe7\x04\x81\x95\x7d\x41\x52\x64\xe2\x58\xbc\x26\x3e\x1c\xc3\x6e\x53\x47\x8a\xac\x5c\xa0\x16\x94\xcc\xb0\x9b\x4f\xfd\x84\x73\x99\x72\xc7\xdc\xcf\x3d\xef\xea\xfd\xed\xe1\x62\xab\x6c\x58\xa1\xdf\x27\x37\x1e\x3f\x54\x93\x06\x7f\xc9\xe2\x06\x7e\x57\x96\x23\xc0\x09\xfc\x82\x5e\xef\x0e\x01\x0f\xd1\xcc\xf2\xa8\xd3\xfb\xbb\x31\x56\xf9\xdf\xde\x0c\x7c\xbb\xaf\x84\x33\x09\x85\x17\x49\x1b\x78\xdb\x96\x98\x61\x4e\xa4\x0e\x0b\x1e\x6a\x1e\x36\xb9\x00\x45\x3a\x16\xea\x27\x6f\x34\x42\xbb\xd2\x7a\x7e\xcb\x98\x15\x11\xf5\xc9\x20\x9e\xb0\x96\xe2\x85\x88\xb6\x5b\x96\xb5\x01\x88\xc0\x38\x1f\xf7\x12\xbc\x06\xb2\xc6\x55\xcc\xa0\x75\x1c\x09\x5d\x80\x16\x25\x15\x85\x85\x1e\x67\x74\x34\xdc\x3e\xfd\x08\x7a\x12\x68\x0f\xc2\x2e\x5b\x83\x10\xa1\x0e\x32\xca\xac\x9b\x71\xc8\x76\xee\xd3\x1e\xf0\x9f\x7f\xa0\x12\xba\x08\xdf\xd2\xad\x68\xc1\xe1\x47\xf5\x05\x98\xe5\x50\x46\x7e\xf9\x9f\x29\x5a\x31\x8f\xaa\x50\x7e\xbe\x77\x6c\xe5\x5c\x4d\xa1\x64\x32\x3c\x30\xa5\xe7\x2d\xbe\x02\x7c\x3c\xcf\x96\xc7\x01\x97\xa6\xfb\x1b\x74\xaf\x13\x3a\x8b\xe2\xb0\x3c\x1b\x99\xfd\x25\xb3\xce\xd5\x1f\xe3\x88\x20\x21\xa3\xaf\xd9\x22\x9f\x64\x1b\xc6\xca\xd4\xe1\xd3\xcb\x6e\xd9\xb6\xb6\x8a\x25\xf1\xe1\x39\x72\x89\x98\x1f\x78\x92\x4b\xff\x24\xc8\xde\xe6\xa1\x8a\x04\x21\xfa\x32\xae\x3a\xb6\x0a\x0d\x93\x3a\x6a\xf4\xff\x70\x48\x74\xb0\x9b\x07\x39\xe2\xf2\x9d\x8f\x25\x2d\x79\x05\x5f\x89\xd3\xbf\xf1\x0a\x22\xc5\x4a\xc3\xd8\xaf\xee\xce\x81\x83\x53\xa6\xab\xe2\xb7\xfb\x8e\x8e\x0d\xa5\xb7\xac\x1c\xfc\x98\x5d\xf9\x75\x80\xb1\x82\x11\xa4\xe3\xed\xff\x95\xaf\xdd\xa0\x61\x54\x7d\x3a\xe0\x40\x6d\x32\x86\xcd\x30\x5b\xdf\xd2\xc3\xab\xf8\xf7\x4a\xf9\xa0\x34\x20\xe5\xb0\x3f\x82\x5e\x9c\x53\x90\x7e\x13\xa5\x81\x21\x74\xbe\x42\x89\x86\x45\x14\x9d"}, +{{0xc0,0x4d,0xc0,0x9f,0x11,0x9d,0x67,0x0f,0xb1,0xea,0xe0,0x13,0x6f,0xcc,0x06,0x08,0x5f,0x29,0x0f,0x4a,0xd1,0xaa,0x1f,0xfc,0x9c,0x16,0x0e,0xa5,0xcf,0x47,0xf0,0x9d,},{0xff,0x49,0x8c,0xe8,0xc9,0xdb,0x78,0x67,0xf6,0xd0,0x27,0x64,0x52,0xa4,0x66,0x72,0x48,0x87,0xe6,0x17,0x2f,0x66,0x81,0x67,0x1b,0x8a,0xe0,0x35,0xf5,0x86,0x5e,0xa3,},{0x4b,0xd1,0x9f,0x3d,0x9c,0x51,0x16,0xec,0x6a,0xe0,0x02,0x4d,0x0f,0x24,0x6d,0x2c,0xe2,0x50,0xd9,0xe0,0x63,0x4a,0x23,0x2b,0xa0,0x6f,0xd3,0x56,0x6a,0xed,0x55,0xcb,0xe5,0x9f,0x12,0x33,0x2c,0xba,0xd6,0x5d,0x43,0x49,0xa9,0xd2,0x2e,0x7d,0x6e,0x46,0xd2,0xfb,0xdc,0x71,0xd5,0xc8,0xf9,0xda,0x15,0xdf,0xbf,0x17,0xba,0x22,0x51,0x07,},"\x1e\x42\x29\x7f\x8a\xee\xf2\x9a\x84\x2e\x0e\x21\xf5\xdb\xae\x06\x8e\x2c\x9d\xda\xa6\xfd\x34\x8e\x48\x88\x1f\x0d\x42\xc5\x0b\xf0\xec\xf1\x70\x6b\x94\xa5\xd1\x98\x17\xca\x02\xd8\x3e\x9a\xb2\xf9\x9d\x8b\xfa\xaa\x5c\x85\xad\x39\xa1\x50\xb2\x25\xad\x3e\xaf\xa0\x67\x81\x5b\x74\x67\x2f\xe0\x26\xc3\xcc\xc6\x77\x25\x54\x40\xb6\x84\xa7\x6e\x12\x8c\xa2\xcc\xc4\x29\xf1\x52\x57\x7d\x25\xb6\x9f\x40\xdb\x58\x2d\x49\x47\x9a\xfa\xe6\x80\x71\x2d\xc0\xfd\x1f\xe1\x41\x88\x39\x68\x7c\xa6\x0c\xdd\xe9\x74\x14\x04\x62\xf9\x61\x48\x29\x5d\xf1\xce\x43\xa9\x77\x35\x1c\x77\xf2\xf0\xb0\x9a\x6b\x26\xd6\xfe\x96\x5f\xce\xae\x17\xd7\xb8\x62\x03\x71\x40\x24\x28\x54\x4f\xdf\x91\x69\x0b\x44\xe9\xaf\xc2\xe9\x08\x8c\x83\xca\x48\xdc\x85\x76\xf6\x28\x72\x47\x98\xdc\x90\x32\x31\x74\xc4\x49\x96\x59\x65\x02\xa3\x5d\xf8\xb9\x82\xc5\x70\xa6\xcb\x51\xb9\xa1\x97\xd4\x31\xaf\x33\xf0\x2b\x80\x01\x15\x67\xfe\x50\xcf\x45\xac\x11\x1b\x3d\x55\x6f\x8c\x8c\xe5\xae\x8c\x99\x72\xf2\xa9\x93\x6b\x1a\x01\x2b\x9c\x33\x9e\x30\xc9\x73\x12\xb6\x5e\xa5\x9c\x10\x0f\x79\xd7\x95\xb8\xa2\x4b\x31\xa0\xa9\x7d\xc2\x5c\xce\xd6\xb8\xff\x5a\xe1\x45\x33\x9a\x04\x8c\xa1\x2a\x57\x90\x17\xfa\xe8\xd5\xcb\xcb\x61\xd5\x2e\x31\x4d\xd7\xc2\xe7\x20\x10\xc4\x72\x17\xb1\xd0\x68\x78\xbf\x28\x18\xca\x18\x8e\x8e\x30\x79\x60\xc1\x68\x9d\x7d\xfc\x02\x02\x97\x3c\xd2\x9f\x2f\x7b\xa7\x43\x46\x9e\x68\x5e\x0e\x70\x4b\x04\xba\xca\x4f\xab\x54\x88\x44\x8a\x92\x2e\xab\xf4\x0b\xe5\x81\xc1\x99\x4d\x74\xd1\x3a\x36\x6c\xe8\x57\xfb\x40\xa6\xe0\x5d\xa8\x55\x36\x94\x17\x2c\xc3\xfd\x28\x06\x2f\x53\x82\x50\xaa\x8c\x11\xf6\x81\x39\xe7\x9c\xd1\x19\x1b\xa3\x31\x4b\x5c\xea\x08\x64\x43\x7e\xd2\xe4\xb6\xfb\xd7\x5b\x9d\xed\x09\x87\xb4\x1c\x20\x2a\x58\xec\x02\x54\xd9\xd3\x71\xa7\x95\xf1\xdb\xec\xdd\xac\x11\x2b\xe8\xd0\x9e\x2d\x7b\x9c\xa5\x75\x2f\x40\x6c\xff\xb9\x11\xca\x36\x45\x0b\xc0\x5f\x1e\xc1\xca\x3c\xa8\xd3\x51\x24\xd1\x28\x6c\x55\xf1\x0f\x61\x33\x4e\x46\xec\xe4\x18\x3b\x92\x21\x9a\x9d\xcd\x0e\x5e\x78\xef\x2a\x76\xcf\xe9\xa9\xab\x37\x95\xdf\xdc\xb4\x4f\x63\xd4\x5f\x5f\x48\xff\xb4\x15\x61\x33\xad\x2e\x99\x50\x88\x4c\x5b\xbd\x2c\x1c\xb8\x72\x9e\x40\xa8\x78\x7f\x78\x49\x69\xfa\x88\x0c\x07\xff\xcc\x97\xd5\xc0\xd2\xd4\x88\x08\x5e\x91\x16\xd7\x10\x7c\xd5\xdb\x16\xce\xcc\xde\xad\x55\x02\x5e\xea\x2e\xde\xe9\x3c\x1b\x10\x64\x27\x61\x8e\xe0\x9d\xc3\xda\xd1\xe0\x56\x76\xa2\x36\x80\x69\xc8\x04\x5c\x3e\xbc\x6c\x67\xaf\xa5\x2d\x59\x39\x82\x48\xef\xcf\x15\xe9\x04\xc7\x14\x23\x04\xff\x61\x97\x1f\x4d\x9b\xf6\x46\x0c\x1d\x64\x17"}, +{{0x67,0x91,0xbd,0x74,0xd3,0xb4,0x62,0x0e,0xf5,0xf1,0xff,0x56,0x40,0x64,0x32,0xc2,0x6a,0xb6,0x46,0xf6,0xd5,0xe9,0xdd,0xa6,0x84,0x2e,0xd6,0x90,0x52,0x27,0x53,0x92,},{0xda,0x99,0x15,0xa7,0x55,0x2f,0x11,0x0f,0xae,0xa1,0x2d,0x47,0x92,0x0a,0x09,0x60,0x14,0x43,0xd4,0x00,0x0a,0x9c,0x7e,0x21,0x8d,0x5b,0xa7,0x2b,0x74,0x98,0x9f,0xa6,},{0xb1,0xe8,0xd4,0x81,0x06,0x5b,0xd5,0x12,0x1b,0xb3,0xbf,0x56,0x96,0x00,0xbc,0xc2,0x6d,0xf4,0x0c,0x49,0x9f,0xba,0xa9,0x54,0xb3,0x9a,0x61,0x9d,0xc4,0x0b,0x95,0x90,0xc3,0x17,0x56,0xb8,0xb6,0x3f,0x86,0x01,0x51,0x69,0x4b,0x95,0x76,0x5d,0x69,0x7b,0x2e,0x1a,0xde,0x08,0x06,0xe9,0x2a,0x06,0xc4,0xa5,0x59,0xe9,0x0f,0xcf,0xa5,0x06,},"\x36\xa2\x0e\x66\xbb\x29\x15\x51\x61\xad\x85\xee\xfe\x89\x3b\x53\xac\x5a\xde\x16\x5f\x08\x9a\x77\x19\x0b\x0c\x23\x9d\xec\x8a\x20\x16\x85\xb0\x76\xb4\xde\xd4\xa1\x0a\xa4\x59\xb9\x80\xa8\xcc\xa4\x7d\x5f\x8d\xe4\xd2\xa6\x62\xe4\x46\xd5\xf7\xfb\x70\xed\x9b\xe0\x5d\xb1\xcc\xea\xdd\x13\x0b\x33\x46\xd9\x40\x9f\x9d\x6e\xf5\x28\x24\xc7\x64\xac\x6f\xb1\xcd\x15\x6d\xbd\x6a\x47\x3a\xe7\x22\xd0\xeb\xb2\x56\x38\xc5\x12\x65\xa2\x2f\xeb\xbb\x14\x96\x7d\x6d\xd8\x25\x3c\x1d\x03\x88\x95\xc6\x73\x7f\x06\x7c\x8f\x73\xc3\xc1\xcb\xe6\xcd\xa4\x36\x96\x32\xd7\xf4\xc9\xac\xeb\xe8\x7d\x05\x71\xc8\x1a\x58\xcf\xd7\x2c\xce\x4a\x5c\xf5\x3a\x1e\x75\x25\x9f\x4c\x99\x3e\x67\xef\xc8\xd9\xc3\x57\x6c\x43\xaf\x04\xa5\xca\xf3\x3d\x85\x6f\x7f\x27\x55\xd3\xa9\x75\xab\x2b\x68\x5c\x6f\x65\x68\x0c\xba\x9a\xc8\x79\xf3\xa8\xc9\xa4\x76\x5b\x87\x9c\x0a\xde\x1e\x4b\xd0\xd4\xa7\x0b\xb6\xf9\x2b\x24\xd4\x29\xdc\x74\x6c\xc7\x8f\x84\x81\x1f\x07\x6f\x32\xc6\x1e\x35\x85\xcc\x8a\xad\xe9\xb0\xca\x15\x22\x4b\xfb\xfe\x18\xbe\x10\xa3\x36\x43\x60\x0f\x66\x12\xbf\x01\x3f\x0e\xfc\xca\x83\x72\x46\xa0\xee\x5b\x03\xc0\x2f\x15\x73\x62\x4c\x4a\x44\xa9\x0f\x9e\x42\x3d\x4e\x56\x06\x1a\x71\xd0\x14\x4f\x5a\x88\x7a\x8c\xd4\xa9\xd6\xf2\x47\x90\x4e\x26\x79\x59\x51\x95\x9d\xa1\x21\xc8\x3c\x6c\x94\x1e\x2b\x6b\x9a\xb7\x62\x09\xff\xe9\x17\x85\x91\xea\xd6\x82\x30\xb9\x4a\xe9\x7d\xf5\x8f\x9f\x17\x24\x28\xc9\x50\x67\x59\x8a\xc5\x82\xff\xb9\x50\x84\x0d\x82\x66\x30\xc4\x62\x5f\x5d\xea\xdd\xec\x13\x05\x20\x3b\x4d\xb6\xb9\x45\xf9\x91\xed\x7c\xd3\xd6\xfa\xbc\xa5\x1e\x21\x66\xad\xad\x0a\xad\x51\x17\x33\x6d\x52\xd5\x94\x22\xf0\x13\x5c\x8f\xa8\xcd\xd0\x88\x4b\xe7\x35\x86\xbf\x28\x4e\x5d\xdd\xdb\xcb\x95\xb4\x11\xf9\x85\x68\x52\x6f\xbe\x71\xa5\x59\x2b\x56\xad\x5a\x73\x45\xf2\x87\x4d\xb1\xd5\x7b\xea\xb4\x3e\x8c\xc6\x95\x47\x52\x06\x29\xf0\xee\x76\xdb\xf4\x32\xa3\x76\xfa\xd2\x8b\xfc\x77\xe1\x4d\x84\x0f\x0c\x02\xd4\x78\xf1\xe2\x33\x7c\x23\xb8\x9e\x73\xe5\x27\x91\x08\xb5\x60\x9b\x18\xe8\x0d\xb0\xde\x11\xcf\xa9\x4e\xcf\x72\x39\xbc\xff\x59\xc5\x41\x18\xe4\xed\xe4\xfb\xfc\x08\x23\xae\x54\x60\x16\xf7\x74\xc5\x21\x98\xa9\x63\xb5\x54\x5a\x34\x89\xb8\x9d\xf7\x62\x6f\xd1\x1e\xd4\x65\x8d\x71\x5a\x46\x57\x99\x40\x35\xd4\x03\xb3\x37\x0d\x14\xee\xd9\x71\x8d\x59\x8d\xb6\x75\xf0\x42\x59\x2f\xea\x89\x05\x65\x44\xb3\x2e\x5b\x9c\x80\x62\x82\x8a\xaa\x3c\xf5\x9c\xb4\x76\xad\x36\xdb\x1d\xaa\x24\x82\x22\x7a\x9b\x7a\xfb\xc1\x53\xce\x93\x25\x3d\x1b\x39\xda\x95\xeb\x96\xf8\x31\x28\xff\x25\x54\xa5\x47\xe3\x4e\xea\x4a\x00\x00"}, +{{0x23,0x4c,0xe4,0xd3,0x9b,0x5e,0xba,0xbe,0x9a,0x2c,0x1e,0x71,0x97,0x0d,0x71,0x81,0x38,0xdc,0xb5,0x30,0xcf,0xd2,0x96,0x02,0x34,0x27,0xd8,0x92,0xbf,0x88,0xf8,0xa4,},{0xcb,0x73,0x93,0x0d,0xb4,0x21,0xf6,0xd2,0x45,0x36,0x83,0x7b,0xd0,0xbf,0xf6,0xfa,0x75,0xbb,0xd1,0x41,0xc9,0x8a,0x40,0x5d,0x42,0x44,0xa3,0xc4,0x24,0x55,0x07,0x79,},{0xf6,0xd0,0x60,0xed,0x7d,0x18,0x27,0x3f,0x18,0xf7,0xa6,0x9c,0xd1,0xd8,0x12,0x6e,0x47,0x8e,0x88,0xa1,0xd7,0x29,0x4f,0xf6,0x04,0x08,0x46,0xd4,0x61,0x07,0xc3,0xe4,0x1a,0x42,0x3b,0xab,0xb2,0x41,0x71,0x39,0xfe,0x58,0x7d,0x29,0x10,0x27,0x1a,0x35,0x7f,0xe5,0xbf,0x57,0xc9,0x2e,0xe3,0xa7,0xb7,0x75,0x33,0x72,0x9d,0x0a,0xc2,0x0d,},"\x77\x73\x0c\xf8\xc8\xf9\x6b\x91\x87\x90\x2a\xcf\xf9\xff\x0b\x21\x74\x6c\xca\xf0\xa3\x82\xa7\xb3\x43\xd1\xc7\x20\x27\xae\x3c\x31\x68\xa7\x3a\x6b\x8f\x49\xbc\x87\x98\x14\x1e\x15\xc2\x73\x2b\x6a\x6b\x3f\x75\x7f\x8a\x8e\x86\xc7\xa4\xba\xcb\x39\x55\x1c\x54\x87\x4d\x6b\xf7\x16\x89\x7e\xe4\xaf\x13\x25\x3a\xa5\xbb\x79\xa1\x92\x10\x4f\x44\xdc\xb3\xde\x96\x07\x45\xa8\xe6\xaa\x98\x80\x52\x4a\x62\x9f\xb5\x10\xa4\xce\x4c\xbd\xa7\xe2\x95\x7d\xff\x1d\x62\xe7\x05\x60\x6a\x2c\xc8\x4f\x91\x85\x0b\xea\xac\x5e\x58\x46\xe1\x42\x0b\xc9\x1d\xcd\xd2\x42\x7b\x69\xcf\xa4\x6a\xe3\x8a\x4f\xef\x41\x46\xea\xe3\x5f\x9c\x22\xe9\x67\xcb\x14\xa1\xaf\x9c\xab\xf8\x3b\x18\x04\x65\xbe\xd6\xef\x2c\xda\x38\x2a\x84\xd9\x99\x4a\xad\x65\x5d\x89\x52\xe0\xfb\xb0\xf9\x6f\xc8\x08\x9f\x2e\x74\x89\x49\x7f\xac\xdc\xd6\x56\xa8\xa4\x51\xb9\x28\xc1\x1e\x7a\x40\x75\x07\x2a\xaf\xbf\x17\xd8\xf1\x05\x4c\x91\x96\x28\x8d\xed\x3a\xe2\x1f\x9a\xfd\x58\x10\xa1\x00\xd8\xe4\xd8\x4c\x4a\x35\xa9\x8b\x30\xd3\xe1\x85\x24\x43\x8d\xd4\x40\x2d\xfd\x8e\x76\x75\xf0\x9d\x08\x0c\xd9\x15\xf1\x4a\xf4\x37\x2f\x7c\xe5\x83\x84\x97\x2d\x5d\x11\x10\x79\x65\x1b\x2a\xcf\x39\xd2\xa1\x67\xc6\xa0\x0b\x2b\x17\xce\x0b\x26\x87\x91\xbd\x2b\xe5\x17\x8f\xe0\xf8\x2d\x64\xda\xcd\xde\x37\x7a\x1e\x8b\xe9\xe7\xd8\xdf\xc8\x2b\x08\x64\x45\x37\xbd\xc8\x70\xc5\x81\x92\x86\xfd\x51\xf6\x79\x2d\xc5\xf6\x7b\x54\xbe\x33\x6d\x44\xd5\x4f\xeb\xf8\x1b\x8d\xf8\xde\xc5\xd8\x68\x6d\xb1\x2f\x16\x4d\x0e\x8f\xf1\xaa\x2c\x16\xba\xcc\x98\x06\x01\x0e\xc8\xe9\x11\x96\x59\x7e\xf0\x6a\x4c\xf1\x70\x7d\xef\x50\x67\xa0\x48\x89\xd8\xe4\x8a\x9b\xc2\xc0\xbe\xf6\x64\xf5\xac\xd1\xb4\xf5\xbc\x2d\xa7\xda\x43\xdc\xb5\xf9\x63\x24\x5b\xa5\x52\xfd\x49\x30\x01\xd8\x70\xa9\x51\x7a\x17\x9c\x2f\x0d\xe8\x5b\xe0\xc6\x82\xd0\x57\x48\x8e\x35\xc7\x81\x6f\xf4\xba\x52\x9a\xef\xd7\xc6\x60\x91\xf2\x06\xf5\xf4\xd7\x5c\xac\x8b\xd2\x09\xec\x2f\xa5\x5b\xe7\x4a\xf2\x31\xe2\xf3\x89\xdc\xc2\xd6\x68\xbf\x69\x5e\xd2\x67\xc3\x59\x4b\xad\x9e\xfc\x00\x21\x7c\x7a\x0e\x9e\x7b\x6a\x56\xa3\x30\x79\xa3\x0e\x73\xc3\x73\x3f\x2d\x24\xef\xec\xdd\xe8\x7f\x72\xf9\x48\xd2\x77\xd6\xb6\xd5\xb0\x35\xb4\xc5\x31\x80\xd2\x3d\x66\xcc\x0f\xf1\x7c\x15\xdd\x46\x85\x85\xe3\x89\xd9\x1a\x4c\x97\xfd\x80\x11\x0b\x21\x8a\x0b\xf7\xa5\xe0\x35\x3f\x46\x09\xd2\xcf\x01\x8a\x06\x55\x71\x00\x1c\x78\x88\x55\x5e\xed\xbd\x36\x22\xc3\xb1\x76\x9c\xd1\x3f\x33\x37\x47\x72\xaa\x6c\x8a\x8f\x58\x81\x02\x01\x7d\x4e\xe4\xe5\x0d\xcb\xbd\xb1\xd6\x10\xc3\x26\x70\x93\x4a\x6d\x9e\x6d\x9b\x78\x4b\xbf\xe7\x18\x62\xbb\x38"}, +{{0x10,0x3d,0x11,0x8c,0x7d,0xd6,0x5d,0x07,0xe8,0xd5,0x58,0x2e,0x45,0x04,0x2a,0x75,0x79,0x24,0x17,0xc6,0x92,0x00,0x1e,0xe6,0xbd,0x9a,0x92,0x7b,0x2b,0x3d,0x90,0x16,},{0xb4,0x5c,0xc9,0x45,0x14,0xa6,0xad,0x67,0x24,0x96,0xcd,0x4e,0xb9,0xfd,0xaf,0xc1,0xd4,0xa1,0x67,0x07,0x2c,0x68,0x74,0xdc,0x8f,0xf1,0x6d,0x76,0x1f,0xb6,0x69,0x86,},{0x2f,0xaf,0xc1,0x3c,0x43,0xaf,0xe5,0x05,0x43,0x72,0xb9,0x23,0xd2,0x4f,0x29,0x2b,0x28,0x3a,0xfc,0xa3,0xac,0xa3,0xb3,0xe4,0x32,0x38,0x06,0x84,0x96,0x17,0x13,0xc8,0xd2,0x3e,0x86,0xb3,0x58,0x04,0x95,0xdf,0xba,0xe4,0x24,0xb7,0x67,0xe4,0x79,0x5a,0x0f,0x92,0x2f,0x71,0xb5,0x0f,0x5d,0x7a,0x36,0x9a,0xb8,0xc6,0xe8,0x80,0x42,0x0c,},"\x5a\x8e\xe0\x79\x18\x6b\x51\xcf\x46\x29\x83\x4d\xe0\xc6\xbd\x73\x34\x85\x50\x39\xa7\x63\x1d\x68\x87\x65\x2a\x77\x28\x99\x59\x72\xe3\x62\xc1\xc4\x09\xf0\x84\xf5\xaa\xf2\x98\x6a\xe3\xf5\x36\xbe\x00\x70\xc4\xba\xf4\x59\xef\x60\xa0\x15\xef\x9d\x70\xdf\xa3\xea\x96\x71\x1c\xbb\x18\xe9\x2a\xf5\x0c\x52\x7d\x7e\xd4\x57\x87\x7a\x07\xab\x83\x72\x15\x18\xc8\x9f\x7a\x86\x41\x91\xb1\xe9\x74\x33\xb7\xc6\xcd\x63\x4a\x83\x2e\x19\x89\x1e\x76\xc6\x21\x22\xa4\x9d\xbf\xfd\x83\x49\x8a\xa4\x16\xac\xcc\xb7\x73\x7f\xe7\x5f\x4f\xb2\xc3\x53\x28\xe6\xf6\xec\xec\xaa\xa4\x2e\x43\xdb\xa5\xbc\x96\x89\x67\x3d\xab\x96\xf0\xbe\xfa\x3c\x83\xeb\x41\xd4\xd8\x87\xb3\xa1\x17\xd0\x55\xe3\x0b\xb8\x7f\xbe\x7c\x71\x94\x72\xf6\xc7\xa4\xcc\x45\xf6\x28\xf5\xfa\xdd\xc4\x8c\xa3\x44\xf7\x7b\x73\x3c\x0e\x3b\x9f\x50\x79\xdb\xd0\x7a\xf3\xa3\x84\x7a\xf1\x41\x71\x9c\xca\x2f\x6a\x76\x65\x52\xb4\x5d\x0f\xdc\xdb\x98\x68\xf2\xc7\x62\xb6\xd4\x93\x3b\xa1\x08\x36\xf9\x5b\xff\x71\xcb\x88\x04\x00\x24\xc9\x05\x34\xc4\xd7\xa9\x5a\x23\x03\xb0\x4c\x29\x61\x01\x2a\xf5\x8b\xc7\x84\xa9\x63\x27\xbb\xfe\xd0\x39\xd0\x80\x2a\x05\x26\x2d\x8e\x66\x3b\x78\x50\x8e\x92\x50\x8b\xc1\xf2\xea\x2b\x9b\xe7\x58\x0b\xde\x10\xa4\xd6\x63\xd0\xd2\x5b\x0e\x97\x3b\x8c\x5d\xed\x59\xde\xbf\x19\xbb\x04\x4a\xff\x1c\x60\xc7\x0e\xa1\xae\xfe\x85\xf6\xd1\x5c\x2c\x1b\x84\x75\x3b\x59\x57\x6a\x49\x47\x3d\x65\xaf\x3e\xd9\x41\xa3\xd5\x14\xb5\xc4\x52\x2c\x14\x1b\xdb\xee\xd9\xcb\x33\x96\x95\xb2\xe0\x2d\xc0\x70\x00\x86\x7f\x1b\xf8\xed\x8c\xfd\x3b\x1a\xfe\x68\x8f\xbc\xa8\x0e\x2f\x9b\xa5\xc0\xb1\x88\xa1\x9a\xda\xff\x66\x86\xca\x0f\xf0\xed\xd4\x44\x66\x12\x91\xfa\x27\xca\x1f\xc5\x29\x42\x9a\x5d\x8f\xf7\x9e\xd2\x02\x7c\x60\xff\xe3\xb2\xc0\x3f\xb8\xa6\x6a\x39\x85\x41\x7b\xa4\xac\xe7\xd1\x4f\xd0\xe2\x37\x1e\xdf\x5d\x71\xbc\x02\xb9\x05\x27\x67\xc7\xf7\x2c\x4e\x6f\x3f\x30\xe0\x63\x82\x76\xb9\xc4\x20\xaa\x43\x33\x09\x5d\x31\x31\x30\x33\x09\x05\x82\xe3\xac\x4d\x9f\xd3\x20\x31\x20\xba\x25\x14\x97\x3a\xb9\xd1\xc7\xfc\x42\x29\x01\x16\xb5\x1d\xae\x9f\xd5\x79\x41\x0a\xe0\x78\xed\x32\x0a\x5a\x1b\x49\xaa\x7b\x5f\xef\xcd\x75\x63\x95\x21\x3a\xf8\x64\x1e\x29\xb0\xeb\xb5\xb8\x3e\x37\x80\xe5\xd1\x0e\x9d\x3d\x11\x99\x81\x48\xf6\xc6\xf8\x6c\x4d\x4e\xb2\x52\xe2\x8c\x70\xfa\x3a\x55\xc4\x3d\x4d\x7f\xaa\xfc\xbc\xdd\x45\xad\x26\x37\xf2\x15\xe8\x15\x49\xeb\x8a\x4c\xde\x47\x15\xb7\x10\x72\x07\x50\x3a\x79\x59\x50\x60\xb8\x3a\xce\x8f\xeb\x67\x3b\x99\x79\x68\x46\x9d\xd9\xb4\xad\x6a\x7e\xa8\x1c\x6e\x61\x81\x00\x33\xf3\xed\xfc\x13\x7d\x97\x42\x09\x57\x5c"}, +{{0x47,0xee,0xe2,0x02,0x4d,0xbe,0x09,0x95,0x3e,0x98,0x1f,0x69,0x86,0x52,0x0f,0x66,0x60,0x82,0xaa,0x9e,0xf4,0x89,0x2d,0xfd,0xfb,0xdb,0xd2,0x50,0xd2,0xa1,0xdf,0x28,},{0x9f,0x13,0xcd,0x8e,0xbf,0x50,0x80,0x34,0x79,0x75,0x15,0x9f,0x36,0x02,0x96,0xa7,0x16,0x40,0x14,0xd8,0xd0,0x69,0xe8,0x31,0xda,0xb0,0x33,0x26,0x07,0x99,0x7c,0xde,},{0x5d,0xef,0xae,0x0e,0x17,0x3e,0xcc,0x18,0xd5,0xf0,0x1e,0xc9,0x29,0x1b,0xe1,0x60,0xd5,0xea,0xbf,0xf6,0x3f,0xd5,0x42,0x3f,0x2b,0xc6,0x6e,0x3f,0x64,0x08,0xc1,0x96,0x35,0x35,0x02,0xdc,0xef,0x21,0xef,0xfa,0x4b,0x9c,0x14,0xbf,0x27,0xb6,0x87,0xd1,0xb6,0xe8,0x6b,0x2a,0x20,0x5a,0x89,0xeb,0x35,0xc3,0x76,0xa3,0xa3,0x25,0x69,0x0d,},"\xc1\x33\xf0\x33\xcf\x3b\xec\x6c\xd1\x92\x12\xea\x47\xdb\xec\xb1\x3f\x2c\x60\x18\xf9\xe0\x87\x8a\xc8\x84\xbf\xb5\x75\xc0\xf5\xd3\xfc\x5b\x49\x99\x58\x0e\xb8\xac\xbc\xaa\xc8\x3a\xe9\xac\x9b\x44\x3e\x6d\x1c\xff\x44\x9c\x36\x89\xb4\x33\xd5\x09\x00\xb2\xe8\xb7\x1d\x00\xe1\x19\xc8\xb8\x75\x09\x4b\xda\xb9\x16\xad\xaa\xb7\x5b\xcc\x85\x29\x59\xd8\xd7\x59\x79\x5b\xbd\x6b\x36\x0e\xe4\x84\xaf\xe4\x7b\x1a\xd2\x83\x91\xf2\x5a\xfb\x8d\x4e\x3a\xfe\x0c\x5b\x60\x04\x98\xa1\x28\x33\xfe\x2a\x1a\x54\x83\xdf\x94\x0b\x17\x3b\xa0\xd9\xd8\xc4\xd1\x32\x1f\xa4\xb7\x33\x33\x4b\x0f\x6d\x87\x8a\x0e\x5a\x76\xf4\xf1\x80\xac\x11\x9a\x82\x08\x2a\xcb\x14\x88\xe4\x9b\xbc\xa7\xa0\x36\x9c\x19\x1b\xd6\xd0\xc5\xd4\x45\x65\x68\x21\xa9\x9c\xcb\xc9\x45\x94\x9e\xca\x81\x36\xcc\x6e\x12\x7d\x9d\xe9\x2e\xf6\x4f\x17\x4a\x6c\x04\xc8\xb5\xe5\x24\x95\xf0\xdd\x67\x4b\xb5\xca\x12\x8a\x92\x09\x96\x8f\xd4\x50\xdc\xe3\x19\x91\x3f\xd6\xa3\x0c\x33\x82\x79\x81\x63\xe6\x58\x5f\x58\xef\x20\x8b\xe4\xd0\xc6\xa2\x51\x3a\x75\x23\x88\x39\x7a\x4a\xe4\x44\x83\x8c\x84\x66\xdb\xc3\x6f\xbc\x36\xae\x08\xbe\xc8\x8e\xed\xa1\x31\xc1\x4d\x06\x36\x6b\x67\x31\x51\x45\x41\x00\xde\xa1\x11\x81\x50\xfb\xe4\x41\xb1\xe7\x82\x6e\x54\x5d\x98\x68\x24\x2e\x89\x9f\x5e\xa5\x3e\x43\x4c\x37\x93\x6c\xe6\xfd\x06\x14\x62\x83\xe8\xfb\xd5\x36\x48\x0d\xe5\x5a\x16\x10\x2c\x44\x75\x4b\xc5\x54\xd5\xbc\x2d\xe2\xf2\x5e\x19\xe5\x67\xa0\x23\xdf\x46\x40\xe7\x4f\xf3\xa4\x9e\x4d\xd3\x0e\x0e\x25\x58\xb3\xdb\xc2\xaa\xb9\x2f\xdd\x5e\x79\x42\x5e\xcb\xc4\xc6\x99\xfe\x1f\x16\x19\x65\xf1\xd0\xb4\x5d\x8b\xda\xb5\x2e\xc9\xbf\x7a\x69\xd8\xaa\x0b\xd1\x71\xe7\x55\xce\x7b\x8d\x07\x18\xf7\x26\x7a\xfb\x73\x3e\xfc\xa5\x4b\x21\x3e\x6f\x5a\xda\xb4\xc9\xd7\x6c\x86\x7f\xcb\x69\xae\x05\xc7\x4b\xd2\x15\x16\xcf\x34\x2c\x61\x61\xf6\xfc\x9e\xcc\xac\xf9\x70\xeb\xce\x54\x0c\xd8\x92\xbc\x10\x6c\x6b\xd5\x63\x61\x02\x98\xb7\x09\x68\xf0\x91\xbc\xc6\xe1\xf7\xab\x4a\x5b\x2c\x63\x74\xa1\x90\x3f\x4d\x3a\xd5\xe1\xbd\x86\x43\xa9\xc2\xf8\x78\xc3\xd7\xa4\xdc\x49\xef\x31\x97\xed\xbc\xda\x7b\xb9\x1e\x7e\x06\x60\x60\x87\xd4\xe9\x81\xbf\xab\x93\xa6\x02\x49\x77\x96\x2e\x45\x26\x25\x17\xf3\x38\xb6\x85\x7e\xec\x21\x58\xa2\x97\xb2\xaa\x91\x52\x4b\x67\x7a\x21\xaa\xc5\x7b\xe0\xb6\x3a\x80\x74\xfe\x54\xe7\xa9\xdc\x70\xc5\xa5\xc3\xde\x72\x8b\x9c\x17\xec\x12\x12\xab\x11\x30\xeb\x17\x62\x2c\xd7\xb2\x2a\xb6\xeb\xa9\x18\x5e\x8d\x67\xbe\x6c\x47\xa2\xe5\xad\xc6\x63\xd4\x64\x2c\xc1\x20\x22\x2e\x29\x9f\xe1\x34\xfd\x7f\xcd\x00\xad\xab\xcf\xaa\x64\x2f\xe2\xe0\x8d\xd5\x2e\x2c\x3f\x32"}, +{{0xb6,0xc8,0x8b,0x4c,0x90,0xfd,0x19,0xa1,0x49,0xd3,0x81,0x67,0x19,0x53,0xb9,0xb1,0x6d,0x42,0x8f,0x63,0x61,0xcf,0x50,0x3a,0x11,0x04,0x77,0xe2,0x97,0xf8,0xd2,0xf8,},{0x8e,0xbf,0xb0,0x84,0xf9,0x97,0xb2,0xea,0x79,0x32,0xa2,0x35,0x3b,0x2c,0x8b,0x16,0xbd,0x82,0x5e,0x1a,0xf5,0x87,0xa8,0xeb,0xc5,0x1a,0x6c,0x45,0xae,0xa3,0x43,0xae,},{0x74,0x47,0xa2,0x01,0x81,0xb0,0x2c,0xf1,0xb6,0xad,0x52,0x95,0x69,0xce,0x43,0x7c,0x2a,0x05,0x08,0x11,0x6f,0x50,0x20,0x5c,0x41,0xe6,0x37,0x8b,0x74,0xfe,0x2f,0xc5,0x36,0x30,0xaa,0x0d,0xc4,0xb8,0x0c,0x31,0xcb,0x26,0xc8,0xf0,0x9b,0xf8,0xfa,0xb2,0x7e,0x3a,0xbc,0x8f,0x1f,0x60,0x4a,0x5e,0xc0,0x66,0x31,0xa8,0x4f,0x6f,0x2e,0x06,},"\x7f\x4b\xf4\xf5\x21\x73\xef\xf0\x72\xf8\x18\xd0\xaa\x97\xe6\x93\x5d\x8b\xac\xcf\x48\x39\x66\x32\x53\xb2\x41\x4f\xe6\xb1\xf3\x4c\xf4\x3a\xb1\x20\x15\x5a\x1a\x3a\xea\x7b\x48\x19\xdd\xd1\x03\x16\x73\xb8\xa7\xa6\xbd\x0b\x9d\xda\x4a\xde\xfe\x69\x2a\x56\x16\x2c\x64\x61\x80\x79\x42\x64\xc5\x12\x21\x15\xeb\x90\xa6\xd3\x05\x4f\x08\x43\x02\xdc\xe3\xd8\x36\xac\x3d\xe8\x20\x63\x8b\xd8\x9a\x86\xbf\x0a\x4c\x01\x54\x7c\xfd\xc5\x43\xd6\x76\xfe\x16\x39\xef\x72\xc5\xb8\x45\xc4\x94\xe0\x78\x14\xce\xc8\xa4\x7d\x03\xdf\x73\xbe\x4e\x33\xc0\x5a\xfe\x9a\x19\x0d\xda\x04\x33\x60\x49\x6b\xe4\xcf\x3a\x63\x19\xda\x9a\xb0\x64\x81\x67\x7f\x1a\x43\x74\xd6\x0d\x3d\x3b\x63\x94\xf8\x84\x3c\x86\x9b\x0f\x41\xa1\xe8\x1c\x2b\x1a\x54\xbf\x5a\xac\xbd\x98\x20\x7c\x8d\xba\xcb\x36\x42\x2a\x3a\xa0\x13\xd5\xe8\x49\xe0\x44\xaf\x92\x85\x45\xc0\x46\x09\x7c\xaf\x14\x9d\x97\x02\x15\x11\x5d\xea\x0b\x5a\x85\x40\x1f\xf6\x72\xe0\x2e\xd4\x0b\xd0\xf5\xa4\x40\xcd\x56\x49\x40\x53\xc8\x96\xc3\xbd\x32\x60\x63\x49\xf7\xcb\xe7\xec\xe2\xa2\x23\x0c\xf2\x36\xda\xc5\x9f\x78\x17\x96\x5f\x3f\xa8\x0f\xb4\x8a\xa3\x0b\x0b\x19\xef\xa9\xa9\x65\x91\x64\x6b\xd2\x5e\x67\xc1\x85\xf7\x7e\x21\xd6\x63\x0b\x28\x8d\x4e\x55\x14\x6b\x2a\xbc\x15\xe9\x50\x88\xd9\x36\x08\x07\x75\x61\x81\x54\xbb\xdd\xa1\x15\x70\x2a\x2a\xfd\x6f\xd5\xf5\x6b\x92\x3e\x18\x88\x33\xec\x44\x89\x44\xd3\x02\x83\xe3\x37\x25\x42\x42\xc5\x81\x2d\x72\x45\xa4\xe9\x26\x70\xbc\xe3\x54\x6e\xfa\xed\x22\xd2\x74\xe1\xe6\x04\x8b\x5a\x0f\x01\xef\xbf\x89\x5d\xc4\x24\x94\xba\xf1\x74\x71\x85\xcb\x1a\x4b\x88\xfd\xf1\xe6\x09\x9b\xaa\xbc\x6a\x5a\xb5\xa2\x72\x7b\x1e\x24\x87\x89\xd1\x70\xca\xa2\x44\x96\x71\xa8\xf6\xe0\x94\xc1\x13\x32\xea\x0a\xc2\xaf\xe8\x81\x32\xc6\x44\xff\x88\x3d\x0c\x49\x9a\xd7\x6a\x93\xdf\x47\x2f\xa0\x13\xea\xa2\x7a\xb4\xda\xd6\x79\xd2\x51\x1b\x50\x49\xc4\xe9\x8b\xaa\x2e\x7b\x00\xa5\x34\x89\x1e\x29\x02\x65\xed\xb0\x76\xf7\xdc\xa8\xe6\xfe\xf3\xf4\x33\x03\x4a\x16\x57\x5f\x0e\x53\xda\x45\x77\xe6\xb1\x3f\x0c\xb0\xd7\x85\x87\x0d\x0d\x09\x8d\x5d\x80\xf4\x13\xa2\x68\xba\x84\xe0\x43\x1a\x78\x69\x23\x77\x13\x78\xcd\x57\xb8\x19\x22\x58\xe2\x63\x3c\xdb\xe0\x3c\xc3\x16\xa0\x95\x09\x70\x52\x6f\xd3\xe0\x93\x76\xbc\xef\x0d\x03\xb7\x07\x4e\x59\xa5\xa8\x4f\xc6\x4e\x79\x5a\x81\x21\x56\xd9\x60\x56\x76\x50\xbb\x1e\x14\x24\xb3\xcc\x9a\x4d\x99\xd5\x7b\xa8\x58\xdd\x1a\x0c\xad\x35\x32\xe9\x98\x14\x6e\x79\x26\x40\x45\xe2\x8e\xbb\xfd\x75\xa4\x26\xb0\xbb\x85\x1a\x24\x4a\xd6\xbe\x7b\xd5\x76\x5a\xf4\x93\xdf\xc4\x4e\xe3\x78\xcd\x04\xda\xf3\x91\x7e\xef\x2a\x62\x06"}, +{{0x79,0x49,0xa9,0x47,0x2f,0x72,0x5c,0xe7,0xc6,0x8d,0x7e,0xa8,0xfc,0x16,0xe1,0x3d,0x9e,0x0e,0x0a,0x58,0xf5,0x8c,0x24,0xf9,0x22,0x8c,0x88,0xe8,0x02,0x64,0x09,0x0d,},{0xa3,0x70,0xf8,0x28,0x33,0xf8,0x8b,0x4f,0x5f,0x53,0x10,0xb9,0x18,0xe6,0xaf,0x93,0xbb,0x72,0x4b,0xfb,0xdf,0x3c,0x02,0xc5,0x03,0x78,0x0b,0x2c,0x83,0xab,0x6c,0xc6,},{0xe0,0x28,0x98,0xcc,0x7c,0x30,0xee,0x01,0x64,0x82,0x47,0x49,0x7b,0xe8,0xa9,0xc6,0x37,0x85,0x93,0xdc,0x88,0x20,0xbf,0x7c,0x17,0xff,0xcd,0x18,0x11,0x8a,0xf0,0x98,0x79,0xa7,0x69,0xf5,0x39,0xdd,0x92,0x37,0xe9,0x68,0x21,0x16,0x66,0x34,0x99,0x8f,0x94,0x6d,0xa6,0x5e,0x6d,0xba,0xd8,0x27,0x15,0x11,0x66,0x9e,0x2d,0x6c,0xad,0x02,},"\x95\x53\x86\xb9\x2d\xd6\xbf\x92\x60\x1b\xf8\x1e\x84\xd2\x51\x44\xb5\xfc\x0b\xcd\x7d\x23\xc7\x6e\x7d\xeb\x5f\x5b\xa6\x31\x6b\xb6\x1a\x5d\x8e\x74\x18\x5b\x01\x29\x67\xf0\xa4\x43\x8b\x53\x16\x96\xde\xb4\xb8\x10\x10\x89\xe0\xc0\x48\x2a\xdf\x13\xc0\x61\x31\x91\xb9\x77\xf7\x7b\x04\x19\x81\x41\x47\xf5\xda\x64\xa1\xd3\xbe\xb1\x27\x5b\x98\x49\xd1\x29\x7b\xa8\x53\x2a\xe0\xa6\x47\xa8\xac\xe3\x95\xae\x0e\xd0\x0f\x67\x34\x8c\x5e\xe5\xea\x19\xb5\xf1\xc5\xbd\x2e\x62\x28\x18\xe8\xad\xcb\xa3\xc1\x7c\x27\x98\x7e\x4e\x3d\x6d\x91\x0a\x56\xc7\xe5\x14\x9d\x3f\x55\x74\xfc\x06\x00\x9b\xf4\xdd\x3e\x37\xcf\xe3\xeb\xda\x2c\x21\x16\xd3\x66\xdd\x88\xce\x5e\xa7\x2a\xb3\x87\x49\x05\x85\x44\x3b\x08\x6e\x8a\xa3\x8d\x11\xd3\x82\x0b\x72\xc6\x58\xe4\x63\xcd\xb5\x9c\x53\x93\x01\x1d\x4a\x8f\x4c\xb6\xa1\x95\x22\x93\x04\xe7\x62\x39\xfa\x5e\x8c\x2c\xbe\x0f\x39\xdc\xad\x13\x8a\x0e\xcb\x3c\x51\x57\x9e\xc9\xa1\x20\xa5\x16\x07\xee\xfe\xbf\xa5\x9a\x44\x62\x0e\xa5\xb1\x91\x60\x87\xea\x33\x85\x33\xfc\x13\x2f\xf2\xe4\xa4\x3d\x05\x2f\xd0\x8b\x6b\x1b\x24\xfb\x67\x2f\x73\xc9\xb9\xba\x20\xb7\xc1\xc4\x1e\xa2\x4d\x91\x2d\xe9\xb5\x55\xb6\xe5\x68\x2b\x97\x06\x08\xff\x22\x9a\xd3\x08\x6f\x43\x1f\x9b\xe1\x90\xec\x39\x22\x4b\xa2\xed\x8a\xcb\x4c\x8e\xac\x85\x82\xe2\x3a\xaa\x79\x82\x7c\x44\xe2\x48\xc5\xba\x09\x2d\xda\xc0\xf2\xf7\x96\x84\xaa\x93\xfc\x06\x10\x73\xe1\x82\x1a\x56\xaf\xb9\xbf\xec\x95\x2d\xf2\x71\x9a\x9c\x7a\x40\x3e\x6a\x93\xf7\xa6\x56\xd7\x4b\x61\xc1\xd1\x90\x83\xf8\xd3\xf1\x9e\x65\x9f\xa2\xb7\x18\xe0\xbd\x04\xb6\x93\xd6\x3d\xaf\xb8\x6a\xdb\xee\x5d\x87\xc7\x5b\x7d\x12\x91\x22\xf1\x78\xa0\xe6\x69\xeb\x03\x5c\xa4\xd8\xeb\x45\x39\x7f\x18\x51\x26\x4e\x2c\xf0\xa0\xcd\xd3\x07\x20\xc5\xe1\x39\xcd\x6a\x57\x3f\x1f\xa2\x41\xca\xe9\x42\x58\x05\xac\x79\x60\x3e\x8d\xe3\x50\xef\xdb\x0b\x9b\xc9\x5b\xa7\xb0\x85\xc1\xed\x92\xc1\x2a\xcf\x53\xf5\xd4\xa1\x13\x75\x98\x00\x8f\x2a\x36\x72\xc8\x4e\x5f\x76\x9a\x25\xc7\xa4\xa1\x65\x79\xd8\x62\x88\x77\x49\x72\x60\x6e\x4e\x7d\x85\x26\x3a\xd2\x17\xe0\xdb\xcf\x34\x3f\xe5\x54\xc1\x09\xc5\xd9\x40\x9b\x79\x39\x07\x3a\xc5\x5a\x03\x42\x0f\xec\x28\x9b\x11\x4a\x5c\x54\xc2\x0b\x45\xea\x69\x93\x85\x33\xad\xe7\xb3\xae\x85\xe1\xa7\x83\xdd\x97\x89\x7c\x3a\xe8\x25\x41\x83\xcc\x54\x04\x5c\x2a\x18\xec\xbe\x52\x16\x91\xf2\x61\x9d\x9b\x8f\x1f\xb3\x47\xca\x05\x5a\x7b\x0b\x4c\x24\xf6\x4d\x17\x73\xe0\x14\x16\x44\x1e\xfe\x15\x99\x23\x21\x7a\x84\x87\x4b\x9c\x4e\xc2\x65\xcd\xaa\xb6\x43\x90\x80\x68\x49\x78\x12\xc1\xaf\x15\xc1\x88\x07\x1e\x78\xf5\x97\xfe\xdf\xce\x91\xc5\xd4\xc6"}, +{{0xd6,0x8a,0x5e,0x3c,0x47,0xee,0xdb,0x30,0x99,0xdf,0xfc,0x80,0x4c,0xf1,0x9c,0x5e,0x74,0xbf,0x7b,0xf5,0xf0,0x1f,0x54,0xd4,0xd9,0x1d,0x75,0x74,0xf3,0xd3,0xdc,0x7c,},{0x46,0x46,0x7f,0xe9,0xce,0x3a,0xcf,0xd0,0xd7,0x43,0x46,0xbe,0x21,0xc4,0x62,0x16,0xdb,0x81,0xae,0xce,0x6c,0xe0,0x30,0x8f,0xb8,0xdc,0x63,0x86,0xfc,0x34,0x46,0xcf,},{0x89,0x6f,0xc3,0xca,0xba,0x7f,0xd3,0xfc,0x28,0x5d,0x5e,0xdd,0xdd,0xc0,0x12,0x0c,0xd4,0x6d,0xa7,0xc6,0xef,0xab,0xe6,0x6b,0x15,0x0b,0x00,0x27,0x60,0xb8,0x41,0x4a,0x89,0xac,0x9e,0x7f,0x1f,0x7b,0x7c,0x7b,0x33,0x59,0x8f,0x61,0xf4,0x57,0x18,0xe4,0xff,0x4a,0xc3,0x68,0xff,0x12,0x96,0x14,0xb4,0xfe,0x92,0x19,0xf2,0x37,0xb0,0x09,},"\x59\x6c\x03\xd0\x87\x3f\x57\x2f\x45\xc3\xb1\x6f\x0e\xf4\xb5\x2a\xd2\xbf\x59\xec\x76\xd3\xc0\xe5\x34\xd6\x2c\x1f\x84\x16\x4d\xda\xa4\x25\xfb\x85\xc9\x54\x84\x85\xb7\x06\x46\x77\xe9\x9d\x04\xc3\x9b\x6e\xba\x04\xc9\x66\x39\x7b\xa6\xa5\xf4\xeb\xaa\x69\xa2\x41\xdf\x95\xa6\xe4\x45\x02\x50\x9d\x63\x50\x55\x7e\xbf\xea\x60\x26\x4b\x62\xad\x7f\x74\xd1\x6e\x5d\x25\xd4\x59\x70\xcf\xeb\xeb\x33\xe7\xb1\xba\xc3\x34\x8d\xd0\x3a\x8e\x99\x13\x3b\x26\xbb\xfd\x7a\xa7\x22\xc2\x58\x7f\x72\xd5\x52\x6e\x98\x0d\xa9\xee\xbd\xf1\x08\x21\x1d\xae\x50\xbb\xe8\xc6\x5f\x9a\xbe\xe6\x9a\x1b\xbf\x84\xc0\x3e\x40\x44\x8b\xab\xad\x03\xd3\xcf\x3b\x7d\xe4\x88\x7d\x2b\x47\x73\x77\x02\x79\x64\x82\xd2\x26\x5c\x56\x6b\x0f\x62\x3b\x53\xc8\x67\x1b\xd3\x71\x9e\xde\xc0\xff\xd5\xf4\x9b\x49\xb0\x72\xc1\x56\x4a\x57\xf9\xba\xb6\xb9\x2d\x1f\x06\x8d\x75\x66\x39\xa4\x33\x14\x52\xe6\x1a\xa7\xb2\x18\xa8\x8b\x9d\xb7\x7a\x19\xfb\x82\xf1\x3e\x98\x68\xed\xb7\x98\xd5\xbe\xec\xa5\x5d\x1a\xb0\x95\xb3\x16\x22\x5f\x3f\x63\x90\xf8\x95\x78\xf0\x16\x04\x28\x74\x7b\xcd\x21\xbe\x6a\xe1\xd8\x69\x91\xb4\x8e\xf8\x0d\x56\x92\x50\x85\x8f\xeb\xf3\x27\x6b\xd5\xde\x3d\xb6\x5a\x24\x5c\x8b\xdc\xf1\x48\x8c\x48\x25\x96\x89\x45\x78\x6b\xed\x63\xf3\xd1\x3f\x14\x09\x36\x3b\x94\x85\x60\x47\x68\x58\xb3\x96\xbc\xe5\x88\xe4\x0b\x31\x1d\xdf\xc2\x2a\xd6\x22\xca\x7d\x1e\x69\x56\x14\x64\xdd\xa5\x00\x9e\x63\x8a\xa5\xec\x9f\x4c\x03\x92\x93\xaa\xec\x75\x00\x1f\xfc\x68\xa7\xcb\x3a\xe0\x18\x74\xdc\x7f\x39\xd7\x50\x27\xf5\x9a\x28\x96\x5f\xc1\x95\x30\xc0\x75\x2f\xe9\x9b\x15\x3d\xa7\xc0\xe5\x42\xbd\xa7\x6c\xa1\xe1\x0b\x7e\xa1\x58\xef\xb4\xd8\x21\xfb\xc6\x5e\x72\x71\xad\x99\x41\x09\x53\x15\x44\x7a\xbc\xad\x08\x80\xa0\x07\x5d\xd0\x4b\x13\x25\xc7\x26\x33\xac\xbc\xb2\x61\xfc\xb4\x07\xc2\x64\xa3\x4d\x70\xbf\x1f\x04\x4f\xee\xad\x06\x9a\xf5\xa8\x7d\xd3\x52\xf4\xbd\x81\x10\xfa\x17\x8a\xdb\xd8\xdb\xf2\x3c\x6b\x57\x5c\xdd\x5d\xf2\x2c\xc9\xa5\xcd\xd3\x7d\x9c\x8f\xaa\xb8\x1a\x4c\xb3\xfb\x5c\x4f\xe7\xff\x62\x9d\xba\xa9\xfc\x06\xb8\x0c\x1f\xb6\x91\xc2\x86\x55\x95\x5c\xfe\x5c\xa4\x41\x49\xb1\x50\xb3\xcf\x14\x0d\x9a\xca\xcb\x14\x31\x3a\x72\xc8\x40\x98\xde\x72\xba\xcc\x02\x72\xd7\x9e\xd6\x61\x7f\x72\xde\xc8\x8e\x19\xb8\x44\x25\x49\x2a\x42\x9e\xc6\xd2\xec\x08\xb8\x63\x46\xdf\xbf\x20\xea\x2a\x36\x19\xe7\x7b\x6a\xc6\x42\x30\xeb\xe2\x5f\xa0\x06\x7a\xbb\x5f\x33\xee\x49\xad\xc7\xc4\x4b\xda\x70\x46\xd7\xf2\x24\xf2\xe7\xa4\x89\x56\x83\xfc\xa8\x68\x4e\xd6\xa0\x31\x84\x4f\x57\x86\xbc\xda\x48\xb5\x04\x23\x94\x48\x7b\x52\x40\x2a\x09\x90\x77\x88\xa1\xe1\x40"}, +{{0x31,0xe8,0x2b,0xc1,0xcc,0x5c,0xed,0x21,0xcd,0xc8,0xbf,0xc2,0xdb,0xbb,0x97,0x6b,0x08,0x78,0x0a,0xfc,0x69,0x44,0xaf,0x7e,0x88,0xe5,0x0e,0x67,0x87,0x4d,0x84,0xf1,},{0x8d,0xf9,0x77,0xe2,0xb0,0x40,0xac,0xeb,0xd3,0xda,0xfd,0x67,0xb8,0x7f,0x92,0x16,0xe8,0xc3,0x71,0xbe,0xce,0xd6,0x18,0xfe,0xf3,0xa4,0x96,0xd6,0x51,0xa5,0xd7,0xb5,},{0x24,0x07,0x02,0xac,0x6c,0x68,0xd5,0x97,0xd2,0x22,0xda,0x94,0x9d,0x0c,0x47,0xd1,0x6b,0x39,0x0a,0x47,0x7d,0x1f,0xb5,0x79,0xe9,0xd8,0x94,0x8a,0xdf,0x9b,0x3b,0x6a,0x7f,0xd4,0x45,0x8a,0xe6,0x38,0x5b,0x7e,0x2b,0x68,0x4a,0x05,0xb5,0x5c,0x63,0xfa,0x6c,0xd0,0x87,0xbb,0x90,0x11,0x3c,0xba,0xb8,0xe4,0xaf,0x14,0x2f,0xcf,0x81,0x0e,},"\x69\xd4\x61\xb6\xb7\xa8\x66\xe9\x4c\xd5\x9a\x5a\x23\xbb\xa4\xa1\x27\x66\x02\xf0\x42\xba\xa8\x50\xd5\xb2\x92\x49\xd6\x74\x3a\xda\x04\xd3\xd9\x38\x21\x9a\xbb\xc2\x2a\xda\x66\xa1\x77\x81\x97\xf7\x0b\xf8\x0b\x59\x7a\x8b\x4a\xe0\x0b\xdb\x87\x68\x12\xd3\xab\x4e\xc0\x11\xdf\x73\x34\x1c\x85\x05\x3e\xeb\xcc\x2d\xf0\xac\xfc\x21\x54\x82\x83\xb5\x53\xec\xde\x01\x54\x82\x8e\xd5\xaf\x47\x57\x19\x85\xf8\x97\x67\xb0\x05\xb6\x22\xc9\xe7\xc0\x79\xdd\xe6\x94\xe4\x9d\xc0\x55\x0c\x79\x18\xcc\x51\x5c\x27\x4d\xbd\x9c\x54\x69\xd2\xf1\x8e\xcd\x90\xde\x66\x4e\x03\xca\x41\xe5\x3b\xe2\x0b\x96\xe2\x5a\xf4\x0c\x54\xab\x0f\x7c\xbe\x9e\x05\xca\x3f\xa5\xa3\x7c\x1a\xa8\xeb\xfb\x64\x44\xa3\x2c\x49\x6e\xfc\x68\x15\x7c\x69\xf3\x58\xc1\x5f\x6a\xc0\x9d\x46\xef\xef\x9a\x68\x5d\xf7\xe8\xdd\x63\xb3\x04\xbd\x3c\x63\x8c\xcf\x53\x2f\xe9\x01\xf1\x1c\xf9\x7c\x5b\x1c\xbe\xd3\x3c\x70\x63\x7c\x72\x1b\x02\x89\xad\xf6\xbb\x6d\x87\xc3\x04\x79\xfa\x92\x6e\x04\x30\x74\x30\x2b\x76\xf1\x15\x7d\x0a\x81\xde\xc4\x93\xe8\x7a\x3c\x64\x3e\x7a\x20\xb7\xa4\x15\x25\xa3\x8d\xb0\x4e\x78\xda\xe5\xe7\x79\x70\x66\xbf\xae\x2c\xf4\x48\xa4\x47\xe9\x00\x4c\xce\x8e\x41\xf0\x98\x79\x91\xfa\xd3\x03\x11\xdd\xaa\x45\x9a\x26\x44\xf4\xb9\x41\xc0\x68\xc0\xd6\xc0\x77\x1a\xfc\xf4\x2b\xf9\x13\x9a\x68\x4d\xa2\x98\x48\x6e\xcf\x67\x52\x3b\xf8\x50\x9a\x45\xba\x5c\xb8\xb3\x86\x4a\xd2\x2c\x0c\x6a\x82\x8c\x6d\xb7\x2e\x37\x1d\xe4\x10\xb4\x7d\xac\x49\xae\x9d\x3b\x57\x02\xb1\x73\x9b\x8d\x76\x0c\xe9\x86\x11\xc0\x7d\x88\xdf\x5f\x04\x68\x38\x08\xa2\x1a\xfc\x2e\x61\x71\x3f\xc2\xc0\x25\xcb\x25\xfc\xc4\xee\x94\x18\x41\x08\x3b\x22\xf6\x1e\x26\x56\xfb\x3b\x8d\xad\x41\xc2\x62\xc8\x9d\x2f\x17\x61\x03\x09\xf2\xd5\xc2\x95\x89\xa2\xdf\x61\xe5\x51\x49\x89\x50\x32\xca\x98\x1e\x45\x57\xe1\x30\xa2\x37\xfc\x08\x26\xfc\x87\x25\x29\x86\x1b\xbb\x83\x28\xd6\x73\xf3\x9b\x58\xb7\x3d\x06\x0e\xc5\x96\xbf\x22\xe7\xee\x08\x1f\x44\xe9\x2c\x02\xa5\x67\x76\x79\x52\x0e\x2a\x2b\x4d\x22\xc7\x7f\x2b\x21\x2d\x5a\xaf\x05\x0b\xf2\xc1\x41\xe3\xe2\x8b\x85\x71\xd4\x32\x19\x37\x42\x62\x35\xc7\xa6\x46\xd6\x47\xe3\xef\xe1\x83\xc2\x7b\x74\x92\x56\x5e\xca\xcd\x7f\x43\xc6\x7a\x74\x45\x3f\x47\x80\xe8\x87\x11\xba\x2d\xd4\xa3\x94\x1b\x12\xdd\xd3\x90\x92\x70\xfb\x3d\xeb\xd4\x22\x43\x6a\xb6\x16\x6f\x08\xc9\x9c\x88\x6c\xc0\xe8\xe3\xce\xcd\x06\x42\xe4\x42\x85\xb8\x86\x4a\xa4\x16\x94\x3c\x5a\x18\x69\x74\xf4\x64\x53\x5a\x87\x0a\x01\x28\x61\xbc\x2e\x58\x71\x49\xca\xe9\x71\x62\x4e\x61\xc3\x1d\x8a\x50\x7e\x3a\xd8\x27\x73\xe7\x23\xbc\xb7\x5d\xf5\x4b\xef\x84\x7a\x40\x7b\xcb\x7b\x1d\x57"}, +{{0xcc,0x56,0xbc,0x7c,0xdf,0xa6,0x11,0x92,0x4e,0x72,0xb0,0x7f,0x68,0xab,0xc6,0xca,0x5b,0x85,0xff,0x8b,0xba,0xcd,0xff,0x40,0x6e,0x51,0xba,0x72,0x0d,0x09,0xa8,0x66,},{0x5f,0xfe,0xe2,0x21,0xab,0x4d,0x0f,0xe6,0xf4,0xc9,0x34,0x6c,0x5e,0x5a,0x4b,0x8a,0x63,0x6a,0x6a,0x0b,0xad,0xce,0x96,0x67,0xbe,0x73,0x9f,0x4c,0x9e,0x67,0x33,0xc1,},{0x9b,0x86,0xa1,0x92,0xb6,0x4f,0x4f,0x04,0x4f,0xfb,0xf8,0x7b,0x41,0xc7,0xee,0x52,0xf7,0xa7,0x21,0xaa,0x32,0x0e,0x7b,0xad,0x64,0x25,0x99,0x59,0x90,0x31,0x5c,0xdd,0x50,0x2b,0xe4,0xe1,0x11,0x60,0x19,0xd1,0x31,0xa9,0x21,0x8d,0x19,0x61,0x4a,0xd9,0x55,0x43,0xb1,0x88,0x9a,0xf0,0xa9,0x7e,0xd4,0xd2,0x56,0xdc,0x33,0xd7,0x6e,0x08,},"\x08\x83\x04\xf2\x2e\x1a\x28\x60\x62\xde\xfb\xeb\xb1\x82\x7a\x64\xb7\x6a\x14\xe8\x70\x15\xe7\xf6\x46\x17\x87\x77\xab\xa7\x97\x04\x68\x8d\x7b\xf3\x2e\x1e\xfa\xc9\x7a\x9f\xc3\x39\x81\x0e\xbd\x3d\xf9\x3e\x4e\xa0\x24\x68\x69\x53\xed\x91\xfa\x6d\x2a\xb6\xe0\x7e\xc7\x81\x1a\x6d\x91\xca\x91\xb0\x98\xdb\x47\x25\xdf\x65\x84\x6a\x95\xb8\x08\x63\x5a\x8d\x0c\x5f\xe5\xac\xe2\x5f\x07\x80\xe8\x96\x17\x7b\xc1\xbb\xa1\xcd\xb4\x44\x92\x51\xc0\x1b\x48\x2f\x02\x38\x62\xf8\x8e\x07\x2e\x79\xcd\xe5\xdb\xd6\xc1\xd9\xad\x9c\x07\xc6\x06\xf5\xdf\x85\xa6\xec\xa2\x96\x6c\xbf\xe0\xa1\x67\x39\x68\x11\x2f\x26\xa3\x17\x05\x3f\x16\x7f\x61\x1a\xf2\x97\xef\xa8\x02\xe0\xa9\x4b\x3e\x1f\x33\xa2\x7b\x73\xe5\x59\x7a\xbb\x22\x41\x15\xeb\xe7\x5e\x29\x4a\x1b\xcd\xcd\x97\x92\x55\xb0\xa8\x02\x65\xc0\x89\xaa\xa7\xd6\xbe\xd2\xe3\xd0\xc9\x18\xf5\x6f\x4a\x55\xf4\x48\xd8\x63\x36\x5c\x6c\x58\x46\xfb\x9b\x2b\x9b\xb5\x5f\x6b\x7c\x6d\xff\x58\x47\xb7\x1b\xfd\xd4\xbb\x5b\x9b\xb2\xe4\x24\x9b\xc0\x24\x3a\x02\xab\x4d\x22\xba\x78\xa4\x3d\x18\x21\x95\xae\xd7\x8f\xec\xe8\x4c\xb1\xdd\xae\xb9\xef\xf6\x81\x56\x04\x5b\x29\x32\xe6\x38\xd7\x73\x1d\x0e\x8b\x4c\x9c\x8c\x38\x3b\x0d\x6d\x39\x2d\x21\xfc\x64\x07\x62\xc8\x7d\x36\x92\xb1\x81\x0b\xcc\x4a\x42\x39\x2f\xf1\x3d\x45\x16\x9e\xcb\xf0\x13\x50\x55\x09\x31\x05\x09\x8c\x86\x9b\x68\x88\x7e\x93\x4e\x2b\x9d\xa5\x23\x2a\xc6\xc9\x37\x38\x00\xf7\x0b\x64\xec\x64\xa4\xaa\x0c\xa0\x44\xc0\x77\x7c\xa3\xa3\xac\xaa\x13\x8c\x14\x24\x96\x72\xa5\x5b\x24\xdd\xfe\x4d\xc3\x57\x57\x32\x41\xe1\x4a\xd0\xac\x16\x47\x5a\x8e\x38\x67\x88\x6d\x41\xee\xa3\x5f\xe7\x93\x2b\xa9\xae\xaa\x0c\x86\xc9\xeb\x6d\xb7\x80\x80\x49\xad\xe7\xb5\xcc\x1a\x40\x82\x2c\x66\xde\xa9\x3a\xd2\x2d\x44\xb9\xe4\x29\x04\xb5\xb8\x36\x84\xae\x29\x31\xfe\x36\xc6\x08\xff\x70\x96\xf1\xb0\x9f\x81\x1b\x02\x67\x28\x04\x40\x6e\x08\xed\x9e\x77\x45\x67\x6c\xe0\x47\xf0\xf7\xf6\x47\x08\xe4\x9b\xb7\x87\x54\x72\x0b\x8a\xa2\x26\xf5\x55\x6a\xbf\x05\xb5\x65\x84\x64\x52\x92\xda\xd0\x8e\x24\x73\x63\x9a\x8c\xe5\x47\x5e\x0c\xe9\x19\x2f\x8b\xa2\xdd\x32\xce\x14\xc9\x19\x75\xab\x60\x2f\x7c\x13\x53\x8c\x52\x95\x2d\x03\x96\x15\x8c\x7c\xc6\xb9\x42\xbe\x7d\x92\x3e\xeb\x52\x3a\x73\xb5\xb4\x11\x96\x6d\x14\xac\x96\xe5\xb0\x96\xa5\x29\x32\xa4\x16\x29\x2e\xcc\xdd\xb9\x10\x71\xc8\x85\x60\xe7\x0e\xcd\x4f\xe2\xfe\x24\xd5\x23\xfa\xfc\xb9\x8e\x40\x21\x50\x2f\x41\x90\xa0\x51\x5e\xdc\xb2\x40\x19\xea\xca\x09\xec\x26\x15\xa9\xbf\xde\xb6\x0e\xb3\x54\xc8\x4a\x1f\x3c\xec\x7f\xfd\x7e\x65\xa5\x51\x5d\x47\x95\x9a\x4c\x4e\xc4\x8d\x80\x21\xb1\x75\x4a\xe2\xbf\x84"}, +{{0x7a,0x57,0xf2,0xdd,0xa0,0xad,0x03,0x38,0xab,0x9a,0x13,0xc9,0xa3,0x49,0x7e,0x9c,0x75,0x23,0x8c,0x15,0x31,0x58,0x97,0x89,0x22,0x7c,0xd2,0x74,0x9b,0xc6,0xe9,0x50,},{0x6f,0x73,0x8d,0xc5,0xe7,0xd9,0xe2,0x40,0xc9,0xf4,0xd0,0xc0,0x6a,0x5e,0x02,0x17,0x47,0x56,0x8b,0x69,0xa7,0x5d,0x50,0x7a,0x2e,0x0b,0xe7,0xea,0x61,0x35,0x26,0xc5,},{0x98,0x91,0x23,0x76,0x1d,0x93,0x56,0x32,0x78,0xfd,0x0a,0x78,0xae,0xd6,0x4e,0x2d,0xe6,0xf4,0xa7,0x00,0xfc,0x9a,0x70,0xd2,0x18,0x77,0x48,0xac,0x06,0xd9,0xc2,0xc3,0x77,0xd1,0x99,0x5f,0x89,0xc7,0x72,0x7f,0xe2,0xf1,0x20,0x78,0x4e,0x41,0x71,0xc4,0x2d,0x63,0x53,0xac,0x3d,0x4e,0x3f,0x62,0x0c,0x63,0x9c,0x75,0x78,0x6c,0x46,0x0a,},"\x8c\x85\x75\xa1\x1d\x2f\xf2\xc2\x38\xe4\x19\xcc\xb0\x06\x33\xd0\x4e\x8b\x8b\xd7\x74\x29\x01\xd5\x88\xdd\x6a\x2f\x00\xaa\x12\xf0\x8a\xe4\x1d\xca\xa9\x33\x8f\x8c\x47\xe9\x53\x12\x19\x2c\xf6\xb2\x45\xa0\x0c\xe6\x88\xa0\x29\xda\x56\xdd\x1b\x1d\xeb\x0d\x34\xb5\x41\x4f\xe1\xc2\x1d\x6b\x63\xd0\x6b\x85\x34\xac\xe8\xe8\x66\xc9\x33\xfd\x7c\x5a\x65\xed\xa9\x5a\x17\x37\xa9\xec\xdb\x17\x85\x91\x49\xac\x69\x69\x51\xb8\x2c\x23\x0e\x82\x75\xe9\x6d\xd0\x2f\xd4\x55\xea\x67\x53\x79\xe6\x7b\xa6\x34\x84\xb6\x28\x38\x31\xfe\x3f\xfe\x52\xd6\xec\x49\xb7\x09\x10\x67\x05\xc9\xd1\x9b\x85\x9d\xe9\xfd\x20\x08\x87\xcb\x44\xd8\xfd\xfe\x69\x61\xfa\x4c\xa2\x34\x09\x44\xc7\x64\xc7\x04\x49\x12\x08\x25\x7e\x73\x54\x82\xaf\x8c\xb6\x90\x41\xdd\xe6\x85\x24\x1d\x3f\xbf\x46\xfd\xa0\x57\x24\x8b\x89\x87\xbe\x1f\x80\xb5\x4e\xb5\x40\x09\xf3\x24\xdc\x45\x0e\x88\x6e\x79\xf9\x12\x58\x5b\x91\xc9\xdf\xaf\xe9\x01\x22\x62\xc4\x71\x40\x3b\x1e\x8b\x5c\x31\xfc\x53\x75\xa1\xdd\xf9\x9b\x68\xed\xf9\xed\x70\xaf\x85\x94\xf7\xd8\x4b\x2c\xc4\x91\x1f\xe9\x05\x00\xc6\xee\xbf\xba\xc0\x85\x55\x35\x50\xe3\x5b\xd2\xe5\x25\x14\xe9\x79\xe7\x24\x1e\x9f\x8e\x34\xcd\xf8\x51\x3a\xbe\x72\x51\x0d\xff\x3c\xfe\xc7\xe2\xbc\x64\x88\x64\x1c\xfd\x0a\x65\xae\x0e\x09\xeb\xe9\x9b\x15\xb2\x9d\x45\xea\x67\xa5\x7a\xad\x55\x4d\x4f\x8b\xfc\xe1\x38\x6a\xce\x22\x88\x39\xe3\xa8\xa5\x34\x14\x0e\xec\x3d\x37\xd5\x1b\xe3\x61\xf5\xea\x18\x83\x73\x9f\x56\x61\x5f\x75\xb0\x55\xa0\x6a\x91\x47\x1b\xe9\x8b\xc9\x45\x37\x83\xc3\x58\x38\x2b\xd0\x55\x5a\xe9\xeb\x0b\xdc\xd6\x66\x29\xa6\x11\xfc\x1a\x11\xc6\x53\xc8\x22\x14\x58\x7d\xec\x12\xba\x12\x0e\x25\x13\x07\x0f\xe6\x9e\x98\x2f\x7a\x80\xad\x15\x9f\x6a\x32\x5d\x97\x7d\x01\xd0\x50\xd1\x16\xa6\x2a\x4f\x8a\xca\xb6\xc3\xd6\x9f\xf6\xc8\x78\x21\x3c\x60\xa9\x48\x45\xca\xe1\x06\xde\x6c\x5d\x6f\xe2\x50\x8d\x94\x56\x5b\x7b\xa7\x5d\x58\xd1\xad\x47\xd7\x6a\x20\xde\xfa\x75\x68\xcb\x7f\xd6\x6f\x57\xcf\x37\x74\xa2\x1d\x3f\xfa\x7d\x8a\xa6\xd8\x6d\xc2\x84\xb7\x0e\x0f\x17\xe7\x63\x0b\xfc\x10\xcd\x1f\xc9\xa8\xd9\xc5\x92\xd3\x9f\x24\xa7\xb5\xc8\xe8\xaf\xf3\x53\x57\x7e\x6a\xc9\x00\x86\x90\xc7\xa1\x59\xa7\xe8\x3b\xe5\xa6\xae\x8f\xca\x96\x44\xbd\xdf\xa3\x7a\x92\xb0\x70\x55\xf9\xfa\xc9\xfa\x97\xfb\x3e\x8f\x5f\x4d\x91\x7d\xda\x5c\x6d\xc6\xea\x34\xb6\x4d\x30\x24\x05\xbc\x38\x06\x2e\x07\xce\x93\xa1\xa8\x8a\xed\x5f\xba\xf9\x95\xa0\x9b\x45\xb2\x8a\xd4\xa6\xb2\x73\xde\xc1\x41\x3c\x54\x04\x52\x9d\x82\x5b\x5e\xdc\x2e\x27\xa3\x90\xeb\x7e\x8c\x2b\x43\x90\x5e\x11\x6d\x88\x7a\xb5\xfb\x99\x3d\xfe\x15\x0e\xbd\xcf\x81\x7a\xe6\x2e\x03"}, +{{0x32,0xef,0x6d,0x78,0x9a,0x1e,0xa3,0x93,0xf1,0xbf,0x9f,0x11,0xde,0x34,0xf5,0x7d,0x65,0x3c,0x4e,0x77,0xd5,0x1e,0x60,0x50,0xfe,0xf4,0xe8,0xd7,0xbf,0x18,0x3d,0xb5,},{0xc1,0xaa,0x18,0x1e,0x62,0x0f,0x60,0x52,0x5c,0x2b,0x17,0xda,0x8d,0x29,0x0b,0xae,0x5d,0x33,0x9e,0x17,0xea,0xbc,0xea,0xb5,0x8c,0xd7,0x6a,0xe0,0x66,0xf4,0x11,0x79,},{0x88,0xf3,0xa6,0xe0,0xbb,0xaa,0x3e,0x06,0x0b,0xc9,0xd9,0x1f,0xe2,0x96,0x8c,0x61,0x12,0x6b,0x20,0x31,0x7f,0x59,0x84,0x2e,0x4a,0xe4,0x87,0x11,0xcd,0xba,0xf6,0x2c,0x6c,0x02,0x07,0x40,0x5d,0x1c,0x48,0x49,0x95,0x02,0x71,0xf0,0xaa,0xa7,0x59,0x30,0x91,0x10,0x9e,0x47,0x8d,0x13,0xf3,0x56,0x96,0x4f,0x7d,0xba,0xb7,0x29,0xaf,0x00,},"\x11\xa9\xc3\xc1\xba\x7c\xfb\x61\xad\x10\x33\x05\xc2\x58\x86\xde\x9f\x88\x15\xc6\xc2\x1f\x17\xa8\x73\x3a\x02\x4f\x94\x97\xda\x05\x40\xdb\x36\x03\xa6\x71\xaa\xe8\x37\xdb\xbb\xa1\x9e\x19\xf8\x2d\xdf\xc8\xaf\x85\x59\x80\xa7\x01\x25\xfc\x61\xcd\x7f\xfd\x10\x77\x7e\x36\x6e\x5e\x95\x69\x92\x7a\xf0\xf2\x45\xd4\xf3\x9b\x3f\xd0\xf4\x58\x79\xc2\x53\x40\x14\x12\x85\x5e\x57\x61\x90\x5e\xd6\xef\x31\x8b\x6a\x06\xea\x6e\x9f\x90\x6f\x9b\xd0\x16\xbc\xb6\x94\xa0\xdf\x65\xa0\x16\xbd\xfe\x84\x5a\x09\xf2\x3e\x50\x86\xc5\xaa\xf3\x75\xef\xeb\x86\xda\x51\x23\x9d\xdc\x35\x0b\xac\x0c\xdb\x03\xb8\x74\xdb\x15\x07\xe6\xad\x4e\x2c\x9f\x46\x02\x8c\xa2\x38\x83\x63\x54\x14\x93\xb6\xcb\x92\xc1\xdf\xca\xa3\xef\xd6\x8c\x6b\x4e\x91\xef\xb4\x67\x51\xd2\x3f\x4c\x48\xa9\x73\xf0\xa5\xc7\xc6\xfe\x2a\x12\x69\xd2\xa6\x9e\x9f\xc4\xab\x8b\xa3\xb9\x2f\x79\x64\x49\xba\x3d\xc7\x02\x45\xed\x50\x5c\xc0\xee\xee\x16\x36\x64\x7a\x68\xc7\x67\x9d\x0b\x6d\x65\x1b\xba\x35\xc2\x9b\x81\x47\x8d\x17\xca\x36\x85\x70\x7a\xd6\x16\xe6\xe5\x60\x43\x81\xf8\x4e\xe5\x2b\x25\xad\x02\xfc\x0d\xfb\x85\x43\x2e\xfb\x1f\xec\xd0\x90\xc0\x2a\xd0\x02\xc1\x85\x7f\xce\xd8\x8f\xdf\xb2\xff\x26\xdd\x0f\x50\x18\xfb\x47\xd8\x13\x58\x1f\x65\x08\xca\x63\x7c\x73\x65\x17\x7c\x51\x3d\x1e\xe0\x58\x79\xa6\x5c\x5b\x67\x6b\x3a\xa8\x73\xa1\x93\x5c\x54\x37\xea\xdc\xb6\x6d\xfb\x05\x2a\x5e\x7c\x3e\x81\xd4\x4b\x3d\xaf\x69\x8f\x42\x24\x4e\xe2\xee\x4b\x6e\xd2\xb7\xe6\xe5\x6e\x61\xff\x9c\xb4\x5e\x71\x9f\xd7\x46\x19\x8b\xf2\xa7\xde\x6d\x25\xaf\x3b\xc6\xc7\xb0\xed\x8a\xbe\x3c\xb3\x89\xaf\xd8\x4f\xfa\x2a\x23\x0d\x93\xbc\x0c\x29\xd5\xa9\x41\x9c\xbf\xf1\x1b\x78\x83\x32\x99\x21\x48\x0b\x58\x44\x65\x5d\x99\x6c\x7c\xab\x29\xdf\xb2\xa3\x92\x7b\x82\xba\x7c\x30\x6c\x45\x77\xb6\xf8\xb5\xdb\xe2\xaf\xaf\x9b\xf1\x4a\x8f\x95\x54\xcd\x01\xa6\x9a\x99\x1b\xf2\x12\x82\x8d\xe1\xe6\x31\x72\xe8\x33\xde\x06\x69\x8c\xdb\x3b\x28\x71\x63\x80\x31\x45\x72\xbf\x5b\xcf\xd3\x4e\xf5\x2a\x6f\xad\xda\x87\xba\xbe\x6b\xac\xdb\x20\xce\x63\xc7\x25\xcb\x0f\xf6\x1f\xe3\x0c\x1b\x51\xdb\xda\x2c\x26\x25\xf9\x9d\xfe\xb0\x29\xa3\xe5\x8c\xba\x7d\x01\x90\x51\x11\xca\xf4\x2f\x27\x02\x5e\x72\x0e\x18\xee\xb0\x7d\xae\x91\x55\xc5\x5a\xa3\x00\xe2\x2e\xb5\xe9\x4d\xc7\xa0\xa8\x4e\xe6\x7d\x91\xa9\x60\xae\x08\xca\x63\x2d\xbb\x17\x37\xfc\x9a\x43\xdb\xcf\xb3\xa8\x79\xeb\x9f\xbf\xfd\x72\x99\x33\x8e\x26\x4b\xc1\x23\x7a\xb6\xa5\xbc\x2a\x26\x3c\xfa\x99\xe8\x54\x44\x39\xd9\x63\x31\x63\x9f\xe9\x40\x8e\x54\xa3\x50\x61\x0f\xf0\x1d\xe3\xf8\x57\x99\xad\xeb\x73\xd8\x2b\xe9\x38\x07\x4d\xea\x85\x8e\xa6\x36\xb6\x3a\xbd"}, +{{0x0a,0x55,0x25,0xa4,0x59,0x8f,0x60,0x99,0x2f,0x86,0xba,0x1a,0xb9,0xee,0xe6,0xe2,0x67,0x56,0x22,0xf9,0x43,0x28,0x4f,0xc0,0x55,0x3e,0x44,0x46,0xac,0x5a,0x4c,0x53,},{0xdb,0x60,0xd7,0xea,0x29,0xf8,0xd6,0x0d,0xad,0x33,0xd0,0x2e,0xc5,0xf4,0x22,0x32,0x05,0x7b,0xd1,0xc4,0xbd,0x61,0x80,0xa2,0x42,0xcb,0x7a,0xb6,0xf4,0x42,0x67,0x81,},{0x8f,0xa6,0xb0,0xae,0xac,0x71,0x13,0x2a,0xd8,0x82,0x97,0x58,0x68,0xf1,0xbd,0xb8,0xc1,0x1f,0x1a,0x6c,0x1b,0x9c,0x54,0x59,0x4e,0x0e,0x46,0x28,0x6e,0xa6,0xc9,0xa5,0xd6,0xd5,0xb0,0xea,0xea,0xca,0x9a,0xe3,0xaf,0x74,0xe7,0x23,0x26,0xb3,0xb6,0xf2,0xea,0xa8,0x93,0xc0,0xec,0x42,0xa4,0x9c,0x56,0xef,0x51,0x4f,0x75,0xc7,0x7f,0x01,},"\xf7\x87\x32\x1b\x42\xc0\x8d\x40\x52\x44\x9a\x48\x85\x93\xd8\x85\xb4\xe0\xc3\x4a\x5d\x64\x14\x9f\xa8\xb9\xc8\x5e\xe5\x4b\xcb\xec\xb5\x09\x09\xb2\xa8\x6b\x88\x25\x8a\x10\xe0\x7e\x8f\x8c\x2d\x06\x8a\x89\xfb\x16\x5a\x6a\xce\x7e\x64\x99\x8b\xa5\x7d\x89\xd9\xbf\x2b\x8b\x38\xa1\xf6\xd8\x36\x4a\xee\x05\xce\x33\x48\xbe\xd4\x8b\x88\xc2\x47\x3b\xf5\xf2\x66\x5f\x51\xca\x07\x3a\x53\x05\x35\x8e\xaa\xd4\x36\x5d\x58\xb8\x3b\xc9\x81\x4e\x25\xf5\x4c\x37\xcd\x9b\x68\xa8\x08\xa5\x7d\x6c\x2d\x7d\x7b\x6d\xeb\x5f\xe2\x0f\x4f\x96\xfe\x72\x5f\x8d\xe6\x5c\x29\xa4\xf1\xcc\xef\xd7\xc2\xc6\xf2\xfc\x01\x16\xd5\x86\x76\xac\xbc\x58\x69\x1c\x79\xc2\xb0\x06\x78\x5a\x09\x75\xa3\x1d\x8d\x3c\x94\x91\x61\x59\x6a\x06\x8a\xaf\x22\x26\xab\x84\x25\x50\xe9\xc0\xb2\x61\x0a\x29\x53\x1d\x1f\x3f\x7f\x00\x82\x6b\xb6\xc7\xdb\xe0\x4e\x28\xae\x1b\x9f\xf6\xf8\x88\xa4\x9d\x82\x81\x2f\x45\x2e\x1b\x32\x74\x0b\x23\x4d\xdd\x96\x42\xe1\x8f\x32\xad\x9a\x9a\xf7\xf8\x95\x25\x28\x67\x4a\x2c\xda\x25\xb4\xf7\xba\x86\x70\x07\xff\xa7\xf7\x8f\x16\x3d\xb8\xf3\x69\x14\x95\x6b\xfa\xec\xd5\x0f\x6d\x1a\xf4\xee\x13\x32\x75\xa8\xea\xab\x94\xbb\xc0\xae\x52\xb6\xd9\xb2\x83\x26\x34\x23\x2e\xc0\xe8\xb5\xf8\x02\x2d\x3e\xf1\xea\xd9\xb7\x9e\xf9\xa1\x65\x64\x27\x71\x94\xf2\x38\x0d\x90\x21\xe1\xf1\x7b\x18\x4b\x8d\x3a\x7a\x34\xd1\x51\x39\xa3\x9c\x77\x28\xc2\x2e\x1a\x3a\x67\xa2\x7a\x6c\xa4\xb8\xa8\xa0\x63\x6c\x60\x54\xd0\xf7\x41\xf0\x46\x67\x36\x19\xfc\x6b\x07\x0e\x62\xff\x48\x62\xf5\x9d\x26\x90\x07\xf3\x43\x13\x39\x63\x7a\x89\xf5\x64\xc0\xdb\x3d\x9b\xcf\xcd\x19\xfc\x25\x13\x8a\xc6\x6d\x47\x4d\x80\xf4\xad\x79\xf6\xd1\xe7\x84\x44\x08\xe8\x80\x34\xee\xaf\xf4\xa7\x90\x33\x8d\x54\x6b\xfc\xd7\x42\x4c\x11\x9e\x21\x1f\x36\x3c\xb8\x9c\x88\x87\x49\x34\x6a\x89\xd3\x2f\x02\x3b\xb6\xb0\x36\x6a\x1e\xde\x43\x25\x03\x2a\xa3\x5f\x52\xe9\xdf\x93\x8a\x50\x27\xeb\xee\x96\x88\xae\x48\x0d\xde\x1a\x9c\x9b\x42\xd1\xa9\xc0\x8f\x71\x92\x23\xdf\xae\x1c\xfc\xd4\x9d\xd1\x05\x3a\xaa\x38\x1c\x24\xcc\x9c\x7a\xbf\xcf\x8f\x6d\x86\xd6\xaf\x72\xee\xf0\x53\x04\x41\x2f\x3d\xb2\x58\x5a\xa9\xe0\xf3\xa4\xf1\xb6\xd7\x10\xd0\x2a\xb1\x1d\xb1\xfc\x90\xad\x4d\xe2\x5d\x04\x29\x9f\x31\x29\xc2\x12\xe9\xcb\x73\xc0\x04\x79\x53\x45\x5b\xf9\x8e\xc8\xfd\x26\x74\xe4\x7b\x94\x99\x57\xde\xed\xa0\x18\xba\xdc\x9f\x2f\x68\xa1\xb1\x8e\xf5\xc5\x83\xb0\x95\xe0\x8d\xd9\x06\xda\x5f\x22\x0d\xa0\x29\xb9\xc4\x00\xe3\xca\x91\xc7\xcb\xd8\x7f\x34\x30\xc7\x42\x33\x7f\x61\xcf\x54\x74\x5b\x06\x22\xbc\xb9\x07\x62\xc6\xba\xfe\xf8\x7e\x1e\xc8\x88\xc3\x64\xfa\xd6\x46\xc3\x3a\xcc\x22\xaf\x54\x38\xb8\x4c\xd5"}, +{{0x2d,0x5d,0xdf,0xfa,0x2e,0x58,0xc9,0x04,0x51,0xea,0x05,0xde,0x47,0xb8,0xc4,0x92,0x34,0xe2,0x6c,0xed,0x54,0x85,0x4e,0x3a,0xce,0xf1,0x1d,0x8e,0xe6,0x85,0x2d,0xa7,},{0x7b,0xfd,0x1c,0x8a,0x4a,0x0b,0xbb,0x46,0x06,0xd2,0xe5,0xbc,0x09,0x0f,0x56,0xb2,0x0d,0x58,0xf2,0x20,0x4b,0x6a,0xed,0x83,0x1d,0x3d,0xf4,0xd4,0x06,0xb4,0x76,0x05,},{0xce,0xd9,0xd6,0x10,0x10,0x33,0x9c,0x47,0x1d,0xdf,0x9f,0xef,0xca,0xa8,0x2d,0x1e,0xab,0x3a,0x2e,0x0e,0x60,0x27,0x85,0x53,0xb4,0xdd,0x9f,0x39,0x5b,0xe5,0x81,0x49,0xc9,0x15,0x94,0xe5,0x61,0x8b,0x0b,0x10,0xbf,0x3a,0xab,0x94,0xf1,0x59,0xb5,0x30,0xf6,0x44,0x63,0xee,0xd6,0x6f,0xa2,0xac,0xe5,0x4f,0xd9,0x25,0x72,0xa0,0x6a,0x0e,},"\x4f\x1c\x5b\x4e\x6f\xac\x3b\xaa\x3e\x90\x10\xf3\xbf\x29\x3c\x77\x9e\x61\xfd\x7b\xbe\x05\xa5\x86\xf5\xaa\xf0\x80\x26\x37\x16\x27\xa2\x09\xac\xd1\x88\xaf\xb2\xdb\xe0\x31\x15\x47\x94\x05\x59\x71\x16\x40\xf7\x8a\xea\x9a\x62\x81\x89\x62\xf4\x45\xa8\xe7\xed\x6f\xe6\xc5\xf4\x91\x62\xe7\x43\x5d\x1b\x62\x5b\x88\xba\x39\xda\xb0\xad\x56\xfd\x2c\x0a\xd6\x51\x26\x61\x36\x2b\xf7\x8a\xfe\x5a\x14\x16\xb6\x47\xf3\xb8\x8a\x05\x6c\x9e\x72\x89\xc9\xb0\xcc\x3a\xfb\x43\x40\x21\x98\x56\x34\x93\xe7\x37\xb1\xda\x05\x25\x06\xb6\xc9\x30\x6d\x75\xad\x66\x93\xdb\x6d\x15\x71\xf9\x6f\x6f\x52\x99\x0c\x4d\xf1\x96\x65\xa6\xbb\x63\x07\x3f\xdd\x9f\x55\x59\x68\x96\xa2\xe9\xc2\x62\x2f\x2b\x0c\x2c\xc9\x9d\xdd\x1b\x64\x9f\xb0\x31\x80\x58\xd7\x47\x94\xe3\x8e\xc6\x57\xeb\xc8\x2a\xbd\x5b\xed\xf8\xb3\xf4\xbb\xa3\xbb\x6c\x99\x35\xfd\xf6\x82\x65\x02\xb7\x69\x04\x6b\x36\xd9\x6d\xc6\x95\xd7\xc8\x54\x04\x28\x4d\x2a\x2a\xb7\xfc\xf3\xb0\x2f\x68\xa1\x49\x3d\xd3\x83\xca\x63\x39\xfa\xc1\xcd\xe4\x7f\x53\xc5\xe0\x26\xd0\x86\x9f\xaf\xfe\x40\xab\xdb\x98\x19\x52\x30\xf1\x7d\x0c\xfa\xa5\x33\x31\x5a\xfd\xbf\xe7\xd1\xaf\xc3\xa6\x15\xb4\xf7\x50\x90\x23\x3a\x50\x3f\x88\x61\xe3\x23\x74\xe1\xea\x95\x57\x67\x42\x31\xd9\xd7\x37\xd4\x77\xb3\x3f\xf8\x2a\xc0\xb2\xc0\xba\x93\xc1\x1f\xb5\x23\xe6\x13\x61\x8e\xd3\x70\x52\x4a\x60\xf4\xd4\xc8\x36\x94\xc0\x33\x60\x6d\x1d\x06\x9d\x54\x4d\xcc\xd3\x90\x0c\x37\xa3\xb3\x36\x3e\xfb\xcf\x66\x97\xf9\xf7\x62\xb3\x3b\x12\x94\x58\x39\x53\xfc\x53\x77\x3e\xf5\x67\x26\xee\xb4\x70\xeb\xe9\x21\x49\xb7\x36\x48\xa1\x61\x61\xd4\x94\x12\x0a\x31\x8b\xfb\x08\x0c\xc3\x8e\x49\x96\xf4\xb2\x63\xff\xe7\x8c\x78\x77\xfe\x13\xc2\xfc\x55\x21\x9f\x44\x26\x0e\x8f\x25\x3b\xdd\x37\x9d\x87\x0e\x6c\x91\x04\x8b\x1d\x8d\x4e\x88\xb8\x82\x18\xb2\xb0\x49\xfe\xf5\x3b\x2a\xe1\xf8\xc9\x21\xed\x2b\xcb\x43\x46\x69\xe3\x97\x5d\xcc\x3f\xe4\x52\x0c\xa8\x02\x48\x42\xf7\xff\x2b\xa1\xe2\x2c\xfe\xb5\xd4\xc9\xe4\x35\xea\xda\x60\x1f\xf1\x83\xb2\x63\x64\xee\xe1\xfa\xa5\x9d\x19\xe6\xaa\x4f\x09\x75\x23\x84\x96\xa7\x09\xe4\x6b\xf6\x83\x36\xb0\x68\xbd\x80\xb3\x46\xf1\x1f\xaa\x38\x17\xa0\x7d\x1c\xbd\x84\x38\x2b\x21\x02\x98\x6f\x29\x5a\x13\x98\x07\x7b\xa2\x91\xd6\xb5\xf5\xbd\x86\x0e\xc6\x17\x72\x73\x46\x8f\x0e\xe0\xf2\x59\x1b\x57\x5c\x43\x66\xe1\x89\xb2\x24\xe9\xff\xa3\x5b\xc7\x8a\x4a\xa8\xc0\x69\x54\xfe\x33\xd0\x80\xff\xc0\xb2\x3e\x20\x9f\xd0\xe7\x94\x21\xf1\xbd\xe8\x18\xa8\x68\x90\xcf\x17\x22\x36\xdb\x21\x16\x57\xd1\x00\x31\x19\xfe\x91\xd4\xe2\x7c\x52\x4c\xcc\x11\xfa\xde\x0a\x25\xf5\x7a\x7a\x1d\x67\x7e\x1d\xa0\xb9\xc0\x43\xd0\x2f\xca\x38"}, +{{0x4d,0xf5,0xe1,0x1d,0xec,0x80,0xec,0xd8,0x82,0x83,0x75,0x54,0xfa,0x31,0x35,0xb9,0xd5,0x02,0x9d,0xf4,0x20,0x27,0xaa,0x3b,0x3c,0x92,0x92,0x46,0x32,0x9f,0xee,0x96,},{0xef,0xd9,0x28,0x89,0x8f,0xa1,0x44,0xc2,0xd1,0xc8,0x33,0x4f,0xa2,0xe6,0xb5,0xb6,0xa3,0x25,0xa7,0x10,0x2a,0x2c,0x34,0x4a,0x14,0x55,0x41,0xee,0x9a,0x6c,0x04,0x6d,},{0x62,0x54,0x5e,0x6c,0x07,0x80,0x1f,0xde,0x95,0xb4,0x61,0xe2,0xe7,0x53,0xc4,0xb6,0xc8,0x4c,0x25,0x12,0x4e,0xb3,0x30,0xa2,0x72,0x59,0x89,0xd5,0xe3,0x40,0xdc,0xef,0x0c,0x74,0x56,0xd4,0xc7,0xc6,0xa1,0x78,0xa2,0x21,0xb6,0x32,0x83,0x48,0x25,0x3d,0xb7,0x87,0xa9,0xe5,0x51,0x0a,0xb9,0xcc,0x27,0x85,0x15,0xae,0x3e,0x58,0xfb,0x01,},"\xfb\xd6\xf3\x71\xb4\xc8\xb1\x52\xc9\xce\x0c\x63\x96\xa7\x7c\x0f\xe4\x80\xbc\x02\x00\x7f\x33\x6a\xc5\x8f\xd4\xad\xdd\xa9\xd6\x98\x55\xac\x9e\x93\xa4\x5d\x3e\x35\x0f\x41\xff\x50\x2a\xa1\xd8\xfe\x15\x9c\xe8\x9b\x06\x48\x02\xa0\xa1\x89\x0f\x6a\x40\xa7\xef\x57\xc6\xe5\xe5\xed\x04\x02\x80\xdf\x07\xe7\xf4\x8f\xe8\x19\xbe\x63\x17\x67\x10\x75\x7c\xb6\xe4\x40\xb4\xf7\x8b\x57\x59\xdc\xe0\x28\xbf\x58\x5b\x3c\x3f\xec\xa1\xcf\x59\x81\xda\xda\xdf\xd2\x7e\xa1\x24\xaf\x45\xef\x63\x85\x42\xa8\x61\x7f\xf4\x9f\x94\x70\xac\x22\x85\x94\x3c\x7c\x3b\x11\x63\xb9\x03\x95\x5a\xb9\x9b\x6e\xab\x17\xf4\xd4\x9f\xfa\x87\x20\x7a\xbb\xfc\x11\x1c\x4b\x91\xf5\x41\x3d\xfc\x9b\xea\x31\x84\x3d\x11\x5d\xde\xb1\xda\x40\xb4\x5f\x58\xf4\x7c\x41\x7b\x5e\x77\xd5\x81\x89\x34\xe7\x30\xeb\xa9\xc4\x55\x7b\xbf\x48\xcb\x7f\xd4\xe6\x64\x55\x8a\xf4\xfb\x44\xee\x3d\x94\xc1\x6e\x88\x36\x31\xf3\x84\x76\xf4\x83\x7d\xb9\x4d\x54\x12\x2f\xa1\x34\xca\x51\xa5\x25\xaa\xd5\xe2\x4b\x76\x01\x8f\xee\x9a\x2e\x8f\x60\xe2\xbb\x48\xd2\x4a\xb8\xb1\x46\xf8\x4f\xfa\x98\x20\x12\x0e\x7c\x50\xd4\x5c\x0c\xfb\xe3\x5c\x8c\x31\x41\x9b\x07\x8e\x90\x71\x2c\xfe\x93\x4c\x3b\xe3\xa9\x4f\xf2\x15\x88\x73\xae\xfe\x34\xdc\x6e\x36\x90\x2b\x16\x75\xe1\xa4\x7c\xb6\x08\xdf\xe9\x60\xfb\x4d\xa8\xd2\xa8\x49\x0c\xc3\x8e\xba\xdc\x73\xa1\x00\x3c\x49\x41\xfd\xa8\xfa\xe9\x44\xa1\xde\x8e\x3b\x10\xef\x6d\x9e\x67\xce\xec\x74\x59\x77\xd3\x33\xac\x9e\x71\x21\x41\x21\xed\xe8\x89\x22\x95\xe2\x77\x99\xf2\x06\x67\x5a\x9d\x54\xac\x12\x15\x9d\x3a\x1f\x95\x4f\xd0\xee\xff\xbd\x30\xa3\x19\x04\xfb\x2e\xee\x77\xa8\xaa\x9d\xc4\xcc\xbb\xe2\x85\x10\x96\x14\x6a\x4c\xe0\xe8\x1f\xb9\xc6\x24\x98\xdb\xd8\x3b\xf8\x3b\x55\x02\x9a\x5e\x90\x00\x86\xb9\x53\x1c\xe3\x24\x7a\x98\xf8\x65\x4e\xfd\x8f\xe7\xa8\x36\x43\x1f\x75\xda\xf0\x86\x8f\x01\x08\x32\x6e\x23\x02\x6d\x2d\xb4\xa7\x21\x24\xec\x4e\x39\xd4\xbb\xf3\xd8\x46\xc9\xf5\x1c\xa3\xcc\x31\xeb\x1d\x02\xc2\xba\x32\x1e\x46\x19\xf2\xb6\x59\xc0\xbf\x0f\xe5\xc1\x9b\x21\x3f\x3c\x79\x12\x4f\x36\x43\xf7\x4d\xd0\xff\x9c\xe5\xd2\x77\x27\xbe\x6c\x69\x58\x15\x9c\x16\x44\x04\xf4\x33\x01\xfe\x17\x42\xe2\x79\xde\x9e\xfd\x44\x1e\x73\xe4\xea\x7a\x84\x25\x87\xa7\x9d\x11\x5d\x36\xec\xa9\xc0\x3c\x90\xff\x0d\x14\x74\x74\x10\x9f\xc2\x0a\x91\xd7\xb3\xcc\x22\xeb\xcb\xb8\xc7\xf7\x1b\xd6\x1e\x8c\xae\x47\xc5\x05\x0c\xec\x1d\x48\x49\xa1\xd4\xa8\xe7\xa6\xf8\x45\x54\x84\x37\x70\x6c\x25\x33\x1c\x9e\x57\xc2\xcc\x6d\xa1\x17\xf2\xe5\xa0\xf4\xb3\x68\xc4\xcb\x20\x62\x65\xc4\x17\x8e\x06\x55\xff\x67\x5f\xfc\x1d\x4c\x58\xec\xeb\x9e\xdb\x4d\xa3\xad\x2c\x5f\x62\xcd\x13\xab\x48"}, +{{0x85,0xd3,0x23,0x30,0xe2,0xe0,0x73,0xa4,0x60,0x30,0xca,0x0e,0xe2,0xdf,0x2f,0x8e,0xb8,0x74,0xa9,0xfd,0xdf,0x56,0x24,0xc8,0x03,0x17,0x75,0x11,0x1f,0x11,0xee,0xa2,},{0x6e,0xa7,0xde,0x2e,0xd5,0xea,0x5c,0xdf,0x50,0xbf,0xff,0xee,0x77,0xf7,0xbd,0x2f,0xcc,0x21,0xd4,0x86,0x66,0xbb,0x1f,0x48,0x90,0xc7,0x6a,0x69,0xcc,0x7b,0xa4,0xe8,},{0x41,0x43,0x63,0xfe,0xad,0x6e,0x59,0xa3,0x43,0x8c,0xe5,0xa3,0xa2,0x77,0xd6,0x2b,0xdd,0x00,0xfa,0x2e,0xfa,0xc6,0x46,0x3d,0xd1,0x3f,0xcd,0xde,0xd9,0x3a,0x7f,0x10,0x8a,0xe1,0xf5,0x28,0xff,0xc8,0xff,0x4e,0xca,0x33,0x1d,0xab,0x91,0xae,0x5b,0x14,0x16,0xe2,0xdd,0xb7,0x3b,0x6d,0xaf,0x85,0x3b,0x03,0xc8,0x1e,0x99,0x36,0x56,0x0a,},"\xae\x61\x07\xf3\x8f\xf9\x4e\xd0\x32\x79\x03\xcb\xaf\x6c\x3e\x3a\x34\x98\xc4\x7a\xbb\x29\x89\xa8\xb3\x7b\x3a\x19\xdf\x88\xc6\xde\x79\x0a\xcc\xb4\xb7\x25\x81\x77\xb9\x15\x1d\x1f\xe0\x40\x63\x57\x7d\x3c\x3a\xcd\xb4\xc9\x29\x96\x8a\xfd\xad\x6f\x25\x2a\x67\xed\x4c\xa8\x9d\x06\x0f\x1a\x46\x53\x98\x3f\x7a\xb5\x8d\xdb\x93\xe2\x87\x8f\xba\xb0\x63\x7d\xbb\xeb\x95\xd2\x5c\x59\x86\x83\x9d\xe2\x74\x8d\x9f\x34\x02\x7a\xee\xbf\x1d\x9e\xb9\x36\xcb\x67\x70\xe0\x8d\x45\xb8\x09\x5b\xac\x9c\xbb\x71\xdb\x14\xe8\xa3\x42\x22\xb1\xf2\x23\x7b\x9f\x0b\xc9\x76\x6a\x23\x1a\x6d\x10\x27\x99\xf7\xc0\x81\xd5\x00\xfb\xea\xde\x60\x3c\xdc\xdd\x7d\x5b\x96\x5f\xba\xce\x4b\xe5\xc2\xcd\x93\x2d\xcf\x5f\x6e\xd3\x17\x22\xf4\x1d\x5a\x36\x3b\x34\xba\xbf\x3f\x63\x6f\xb3\x03\x82\x4a\xa7\x01\xdf\xe1\xd3\xe4\x12\x63\x07\x8c\x1e\xbb\xdc\xb1\xf7\x3f\x12\x45\xb8\x3e\x3f\xa7\x0a\xb8\xe3\xf1\x41\x3e\x6b\x06\xbd\xae\x02\x2b\x71\x4d\x60\xa4\x01\xd5\x74\x80\xdc\x64\xe7\xaa\xc6\xd3\xde\x85\xfc\x94\xd8\x53\xca\x13\xb7\xe6\x74\x15\x57\x9d\x5c\x67\x21\x23\xa5\xaf\x19\x4b\xee\x14\xae\x35\xdc\x27\x24\xff\x20\x9f\x11\x66\x63\x86\x61\xf8\x81\xb1\x19\x4a\xa4\xe3\x1b\x42\xa5\x27\x96\x47\x81\x59\x15\x04\xba\x76\x10\x3f\x97\xb7\xf5\x52\x03\x15\x47\x3e\xc9\x4b\xb0\x17\xa1\x66\x67\xb2\x2a\x85\x76\xa7\xcc\x2a\xc0\xb7\x75\x63\x03\xc7\x56\xf0\xdd\xaa\xe9\xd0\x18\x9e\x6c\x8d\xe3\x49\xf9\x19\x57\xc7\x2a\x52\x9e\x9f\x7e\x9b\x94\x56\x52\x48\x40\xba\x02\x34\x4f\x55\xad\x3c\x11\xa0\xb2\x59\x90\x14\x39\xf2\x65\x5a\xb9\xf8\xc6\xc8\xe8\xe9\x60\xc0\x57\xd9\xc7\xda\xfe\x42\x5c\x75\xd4\xa3\x3b\x80\x1d\x45\x47\xcd\x05\x51\xa6\x80\x2a\x80\x05\xdd\x72\x42\x47\x64\xdc\xf5\x7e\x4a\xa2\x22\x90\xea\x4f\x5b\xaa\xc5\x1d\x79\x39\xc0\x53\x42\x88\x2e\xe1\x43\x80\xef\x2d\x47\x04\xb4\x19\x49\xb2\x28\x2a\x1e\x1a\x3f\xa7\xdd\xea\x9f\xe8\x3b\x9f\xc5\x1d\x4e\xef\xa2\xeb\xac\x72\x2e\x4c\x0a\x7c\x59\x9b\x69\x25\xf0\x1b\x8a\x20\x66\xdc\x0c\x26\xf9\x21\x96\xf4\xf5\x03\xe8\x87\xc1\xe6\xef\xb0\x93\xf1\x53\x13\x87\xbd\x88\xc6\x91\x99\x7b\x9b\x89\xe3\xcd\xf7\xda\x12\xd3\x73\x41\x83\xa4\xb6\x12\x6b\xe9\xe0\x77\x47\x04\xb5\x29\x65\x9b\x55\x48\xf1\xb8\x75\x12\xcc\x18\x78\xca\x4e\xf5\x59\x90\xb4\x83\xc9\xaf\x6a\xa9\x76\x35\xf4\xf0\x79\x49\x72\x70\x65\xab\xf2\x1e\x21\xe3\x29\x90\xb1\xa7\xd0\x7d\x74\xe0\x2d\x9b\x07\xec\x63\x99\x31\xbf\x9e\x2c\xa3\x94\x1f\x2b\xa6\xb5\xef\x14\xdc\xc2\xa2\x47\xd2\x11\x7e\x9c\xb4\x1e\xfa\x3f\xcc\xa2\x47\x16\x64\x14\x52\xbe\xed\x2f\x92\x65\x7c\x2f\xb7\x31\xf0\xb9\x4e\x8c\x89\x2a\x81\xbb\xa9\x1f\x63\x9d\xf4\x37\x96\xac\xd3\x01\x3a\xc0\x44\xf6\x08"}, +{{0x66,0x59,0x0d,0x36,0x99,0x84,0xc6,0xf5,0xad,0x3a,0x89,0xc7,0x8d,0xdf,0xca,0x10,0xa0,0xa7,0x65,0x79,0x95,0xdc,0x01,0x88,0xb6,0xb5,0x7a,0xc3,0x16,0x47,0x31,0xa4,},{0x98,0x87,0x3a,0xb1,0x33,0x46,0xee,0x48,0x67,0x7c,0x4f,0x86,0x12,0xdb,0x31,0xeb,0xd1,0x3d,0xb5,0x8b,0x2b,0x03,0x4f,0xd1,0x55,0xaf,0xa8,0x72,0x0f,0x4e,0x93,0xe8,},{0xf0,0xdb,0x63,0xa1,0xbc,0x76,0x24,0x16,0x1c,0xa0,0x06,0x38,0x53,0xb2,0xde,0xe4,0x5f,0xcc,0xd2,0x24,0x71,0xe0,0x12,0x36,0x6f,0x86,0x8a,0x4a,0x9c,0x74,0x65,0x4e,0x13,0xf1,0xa3,0x15,0xad,0x83,0x91,0x6e,0xbf,0xb8,0xdc,0x31,0xa4,0x20,0xf8,0x3c,0xf6,0x45,0xc4,0xc9,0xd1,0x6b,0xb4,0xd5,0xd9,0x9d,0x23,0xc7,0xb4,0x3e,0x23,0x00,},"\x2e\xc1\xc6\xb0\x82\x97\x37\x83\x2c\x9c\x79\x8a\x92\xeb\x49\x0b\x23\xd3\x34\xc3\xbb\xe6\x27\xcb\x58\x2d\x17\xa9\xe4\x29\x60\xef\xcd\xc7\xd3\x47\x50\xe0\xb4\xaa\x86\x4c\x20\x4f\xb8\xd6\x2b\x47\x99\x2e\x91\xdb\xfc\xfd\x69\xf5\x1d\x93\x7d\xc0\x6c\x48\xc0\xad\x43\xe8\x59\x83\x71\xcd\x0e\x3b\xbc\xe4\x16\xbf\xd4\x4b\x09\x44\xb9\x93\xaa\x29\x93\xfd\xea\x48\x71\x34\xcd\xe4\x22\x77\x72\x3e\x06\x83\xec\x98\xe6\x95\x95\xe9\xb7\xb1\x4c\x8c\xf9\x61\x7a\x1e\x30\xdd\xb8\x06\x0e\xac\xba\x48\xd8\x82\x53\xb1\x65\x33\x61\x08\xde\x0c\xb0\x2f\xf2\x0f\x54\x24\xb5\x67\x83\x08\x69\xc9\xb4\x32\x9c\x99\x45\xf0\xbf\x2f\x3c\x7a\xcd\x1e\x77\x43\x58\x93\x0c\xd8\x90\xfd\x9c\xb8\x64\xd9\x50\x93\x5a\xd8\xa4\xa3\xbe\xcc\xae\x8f\x83\x3f\x63\x56\x19\x13\x71\xc3\x26\x33\xdc\xf8\x82\x70\x9b\x0d\x98\xbd\x80\x7b\x38\x3a\xed\x8d\x7b\xb0\x97\xb6\xe2\x62\xef\x70\x0c\x9d\x76\x8f\x4b\x56\x90\xe3\xa1\xa8\xf2\x17\x55\xd6\x58\xdb\x2d\x1b\xfd\x2f\x70\x71\xe0\xca\xec\x7c\x2c\x53\x81\xc5\xef\x5c\x2c\x22\x81\xc6\xbc\xed\xc8\x67\x39\x0b\x90\xf3\xb2\x7b\x0f\x0f\x64\xa3\x36\x58\x57\x8a\x5c\x0d\x66\xe2\x11\xe6\xff\xf6\xe8\x64\x88\xac\xf8\x2b\xc0\xf5\xe2\x66\x4b\x83\x69\x90\x46\x03\x7c\x0d\x33\xd3\x40\xff\x98\xed\x62\x63\x35\x4c\x24\x27\x31\x36\xff\x0e\x4f\x0f\x23\x3a\x6c\x82\x54\xfc\x0c\x90\x76\x43\x30\xe3\xb1\x05\x7b\x1e\x66\x6d\x5e\xcd\x5a\x2e\xfe\xaa\x6a\x10\x5b\xfc\x85\x84\x31\xb8\x8e\xd7\xfe\x55\x1e\xb3\x2a\xc0\xaf\x27\xc6\x6a\x98\x03\xa3\xbc\xf8\x76\x34\xc6\x6c\x70\x66\xdd\x01\x97\xa3\xcb\xd2\xd6\xf4\xe6\x5c\xfd\xb8\xf3\xda\xf9\xf3\xca\x5c\x4f\x4e\x0a\xdd\x45\xf5\x54\x1a\xa1\x8d\x04\x1f\x70\x6e\x4f\xa8\x7c\x34\xe9\xa2\x23\xd8\x85\x72\xeb\x50\x08\x3e\xe8\xc7\xc4\x75\xdf\x56\x8b\xc7\x3b\xd0\x8c\x0f\x0d\xea\xa3\x74\xaf\xb1\xc1\x78\xd0\xdd\xdb\x23\x6e\x15\xa8\xbc\x23\x85\xed\x3f\x52\xb8\x76\x1e\x63\x78\x87\x40\x7a\x20\xae\xc3\xe9\x9e\xc8\x30\xda\xe3\x16\x7e\xf0\xcd\xb3\xf3\xff\xd2\x00\xd8\x3b\x75\xb7\x49\x69\x0b\x9e\x25\xe2\x17\x1d\x07\x2c\xa5\x6f\x71\xba\xec\xd2\x1f\x7d\x45\xa1\x2c\x91\xb2\xc0\xfb\x3f\xea\x3b\x15\x8e\x54\x64\x82\x84\xbb\x00\x95\xb3\x62\x44\xb0\xb1\x21\xf9\xf1\x38\x4c\xe9\x00\x43\x65\xe7\x77\x2f\xa3\x08\x28\x25\x0f\x51\x98\x5f\x1b\x17\xb2\xd2\xf8\x0a\x33\xe8\xfc\x6d\x85\x65\xea\x15\xcd\xaa\xcd\x42\xa8\x7b\xd7\xc9\x40\x8b\x1f\xe1\xc7\x70\x66\x5b\xdd\xed\x75\x4b\xc2\xff\x2e\xf9\x1b\x97\x3a\x86\xb9\x9f\x10\x59\xc6\xf2\x27\x24\x6a\x69\x8b\x38\x54\x15\x09\xdd\x54\x49\xfc\xe6\x0d\x38\x62\x24\x18\x3b\x7d\xce\x1b\x38\x84\xf7\xba\xe1\xc2\xe4\xeb\x59\x45\x10\xb5\xca\x58\x52\x79\xd9\x04\x1d\xf8\x81\x7b\x06\x19"}, +{{0x41,0xcf,0x07,0x1f,0x48,0x42,0xec,0xd4,0x94,0x19,0x1b,0x8c,0xf2,0x8c,0xc0,0x92,0x31,0x85,0xef,0x1b,0x07,0x45,0x8a,0x79,0xa5,0x9a,0x29,0x6d,0x35,0x49,0x82,0x2e,},{0x6d,0xc8,0xe4,0x46,0xdb,0x1d,0xa3,0x53,0xb5,0x8d,0x0c,0x45,0xd8,0xb4,0xd8,0x16,0xba,0x59,0xe2,0x5b,0xb6,0x80,0x71,0x2d,0x62,0xd6,0xd3,0xdb,0xf7,0x8d,0x06,0x98,},{0x41,0x05,0x2b,0xc4,0x17,0xb2,0x4d,0xc4,0x83,0x83,0x96,0x6a,0xf0,0x14,0x3f,0x9c,0x0b,0xa8,0x5b,0xbe,0xfb,0xda,0xf7,0x91,0xb1,0x6a,0x4d,0xad,0x1f,0x57,0x0e,0xb8,0x07,0x03,0xc0,0xa2,0xcd,0xeb,0x2f,0x7a,0xd6,0xdc,0xd3,0xfa,0x7b,0xdb,0x5c,0x22,0x5e,0x86,0x9c,0xd8,0xfb,0x27,0x8d,0xff,0x06,0x67,0xd3,0x8a,0xcc,0xf3,0xdb,0x08,},"\xda\xeb\x5f\x0e\x84\xf1\x59\x0b\xca\x2b\x9d\x97\x19\xef\x5d\x1c\xfa\x79\xe0\x58\x34\x46\x33\x2f\x18\xe9\xe4\xfe\xb0\xb1\xf1\x53\x40\x29\x7a\xc9\xad\x67\x24\xc8\x5b\xb1\x65\x58\xea\x54\xeb\x5d\x70\x2a\x47\x24\x8b\xad\xc6\x25\x2a\x80\x43\x71\xb7\x4c\xfe\x10\x62\xd1\xdb\xa1\xec\x68\xfd\x1d\x4d\xd0\x29\xcb\x55\x03\x4b\xbf\x61\x06\x82\x51\xef\xf3\x98\x36\x36\xf6\xde\xbd\x57\x27\xbe\x91\x99\x3b\x3e\x4d\x0a\xbc\x96\xec\x19\x64\x21\xa4\x7b\x78\x93\xf8\x39\x86\xd6\xc0\x32\x3f\x0d\x19\xaa\xf2\xcd\xe9\xd3\x56\x5c\x10\x4c\x9d\x31\x76\xec\xb5\xed\x5e\x17\x3f\xee\x52\xb5\xa0\xc4\x2b\x6a\xb2\xfc\xb1\xcc\xba\x96\x49\xc2\xc6\x7c\x52\x0e\x9b\x96\xce\xa6\x93\xdf\x3e\x58\x60\x9a\xd6\xa0\xbd\x52\x2e\xfa\xaf\x03\x85\x8d\x24\x5d\xd0\xa3\x8f\x84\xa2\xfb\x10\x20\xf4\xdd\x97\xc3\xae\xef\x0e\x24\x47\x7d\x30\xd2\x56\x70\x1e\x90\x0b\xef\x26\xa8\xa6\x26\x9a\xb6\x60\xd7\x42\x93\xa2\xbf\x1d\x20\xc2\xcf\xae\xbb\x7c\x28\x20\xf5\xf5\xb0\x74\x53\xbb\x69\xee\x76\x9b\x52\x39\x15\x39\xf0\xc6\x06\xd2\x2e\xb3\x92\x3e\xe6\xf5\xa1\xd4\x60\x50\xaf\x90\xf0\x11\xf8\x51\xac\xe7\x63\x27\xd3\xd1\x8c\x48\x17\x0a\x9a\x25\xb0\x4b\x77\x0f\xd9\x38\xef\x8a\x30\xb7\xbd\x03\x39\x1d\xd3\x6c\x51\x6b\x62\xf0\xcb\x78\x67\x07\x40\xe0\x0e\x69\x59\x5c\x41\x8d\x96\x72\x53\x82\x0b\x75\x4c\x4f\xd6\x66\xe3\xcc\xe1\x6e\xe0\xc9\x41\x83\xbb\xea\x70\x6f\xe2\x98\xe1\xc9\x9d\xdb\x82\x12\x17\xed\x90\x08\xcc\x8e\x8b\x83\xbc\x8b\x81\x99\x15\xb0\x7b\x14\x6f\xe7\x45\x02\x4a\xc3\xc4\x61\x16\xcb\x4c\xce\x5e\x32\xec\x5d\x75\x24\xa2\x38\x8d\x9f\xe2\x97\xeb\x02\x81\x1a\xf4\x54\x6f\xcd\x58\x60\xe1\x4c\x0d\x13\xf0\x3d\xd7\x5a\x42\x49\x61\x59\x00\x07\x8a\x3c\x35\x8c\x53\x42\x96\x2b\xc1\xbe\xac\xf6\x8c\x24\x68\x21\xa4\x59\xab\x53\x21\xec\x9f\x57\x4f\x49\xd1\x03\x89\xf4\x0f\x14\xdd\xfc\x85\x13\xff\xe3\xde\xaa\x73\x36\x03\x5a\x67\x5f\xa5\x85\x8b\x49\x0c\x5d\x24\x77\x80\x06\x4a\xdb\xaf\x75\xa7\x63\x35\xee\xc9\xab\x91\x87\x71\xb0\xb1\xdf\x51\x47\x64\x2a\xef\x4a\x16\x6a\xb1\x72\xed\x60\x1f\xed\x21\x0f\x6c\x0c\xff\xd9\x18\x69\xf7\x49\x0b\x57\xe7\xc6\x52\x41\x86\x3e\x7e\x8c\x0a\x26\xeb\xa6\x3b\x53\x42\xd0\xfd\x82\x14\xac\x73\x1e\x1c\x43\x8d\x01\x77\x11\x5f\x6a\x19\xe0\x93\x5c\x7a\xf6\xbc\x7d\xbe\xb7\x55\x11\xd9\xbd\x8e\x63\xe3\xe2\xf4\x7a\xb0\xdd\x1c\xed\xd7\xb1\x80\xd7\x4a\x4b\x44\xd4\x61\x19\x7a\xef\xdd\x36\x20\x46\x51\x66\xa3\x9b\x45\x39\x50\x43\xce\x88\x74\xcd\xd7\x2c\x60\x2b\xd3\xd2\xee\xcb\xad\x34\x66\xb5\xcb\x1a\xa4\x1a\xe9\x2a\x8a\xfe\xf2\xd7\x64\xce\xc0\xc4\x49\xd2\x7e\xfa\xc4\x37\x93\x8f\x28\x0b\xea\x9c\x50\xa5\x82\xe5\x7c\x27\xf9\xb3\xde\x87\x2f\x0c"}, +{{0xa2,0xc8,0xe1,0x61,0xa8,0xd9,0xd6,0xe8,0x88,0xc3,0xd0,0x9b,0x0b,0x97,0x27,0x37,0x30,0x7a,0x2c,0xbd,0x2a,0xcd,0x7c,0xcd,0x80,0x4d,0x24,0x31,0xac,0x6c,0x58,0xd2,},{0x3a,0x32,0x57,0x75,0x88,0x67,0x32,0xde,0xca,0x40,0x68,0x57,0xa8,0x05,0x60,0x10,0xaa,0xea,0x28,0x75,0x54,0x5b,0xa6,0xf3,0xdf,0x30,0x75,0x45,0x71,0x38,0x69,0x92,},{0x56,0x0d,0x01,0xb9,0x4d,0xf1,0x1d,0x83,0x34,0x77,0x52,0xff,0x51,0xb3,0x54,0x5e,0xf5,0x5c,0x56,0x32,0xae,0x7c,0x8e,0xfb,0x11,0xaa,0xdd,0x83,0x12,0xde,0xf7,0x25,0x62,0xe8,0xf5,0xd7,0x5e,0xce,0x10,0xad,0x46,0xbc,0x96,0xc8,0x60,0xde,0xec,0xe3,0x9e,0x63,0x4a,0x5f,0x50,0x65,0x4d,0x4c,0xdb,0xa8,0x4a,0x8e,0x6f,0x70,0x24,0x0a,},"\x83\xa3\xbe\xbc\xac\x5f\x28\xc5\x43\x3e\x3c\x4f\x1e\x7b\xf5\xd2\xe4\xdc\xd2\xf5\xe5\x9d\xbe\xe0\xa8\x3b\x07\x02\x57\x15\x35\x07\x46\xf8\x56\x75\xf1\xdf\xea\x37\x4a\xa7\xd7\x94\x28\x7b\x89\x2e\xf9\x09\x7f\xf6\xd2\xe1\x22\xf0\xa6\x56\xfb\xa0\x79\x8c\xdc\xfc\xb3\x64\x5d\xfc\xfd\x78\x8c\x74\x0c\x0f\xd0\x45\x20\xe7\xa0\x6a\x02\xa0\x58\x29\x63\x0a\x2b\xf0\xcd\xfe\x2e\xcc\xa0\x09\xec\x44\x04\x99\x46\xbb\x1d\x23\x26\xdd\xd6\x1d\x7e\xc6\x40\xbf\x69\xeb\x44\xfb\x23\xcc\x1f\xf4\x78\xc5\x70\xc7\x5d\xb7\xe7\x66\xe3\x5b\x7c\x43\xdb\x73\x68\x0d\x14\x07\xa9\x43\x99\xfb\x62\x1b\xaf\x38\x45\x74\x5c\x1c\x4e\xd0\xb9\xf0\xb4\x85\xbe\x2d\x53\xc5\x68\x54\x5d\xdf\x18\x77\x5a\x83\x7a\x05\xd9\xc9\x15\x7b\x08\x4e\x8c\xd0\x1f\xc3\x24\xf0\x7f\x11\x68\x77\xe4\x07\x5d\xba\x24\x32\xc8\xa7\x75\x2e\x9e\x93\x95\x86\xad\x93\xf0\xc0\xaa\x5e\xda\xc9\x4b\x8d\x82\xe5\x44\x99\x97\xb1\x5b\x8c\x89\x61\x58\x9c\x44\x28\x21\xaa\x83\xb6\x02\x39\xec\x5f\x15\x8c\x3f\x5e\x9e\xc5\xbe\xa5\x11\x5d\x5f\xed\x61\x91\x8e\x8f\xcd\x5b\xce\x61\xc7\x77\xf2\x0b\x6b\xfe\x80\x3a\x69\xc6\xfc\x79\x4a\xb8\xc5\x7d\xf2\x71\xda\x86\x38\x72\xa6\x13\x35\xb1\xfa\x29\xf4\x60\x8f\xf0\x37\xf7\x12\x06\x98\x09\xca\x64\x2a\x03\x07\xc7\x9a\xa9\x2e\x10\xcb\x89\x3a\x29\xd1\x72\x01\xa0\xb6\xd1\xb4\x6a\x72\x12\xb3\xba\xec\x97\x03\xc0\xb0\x39\x2b\xa6\xb7\x6e\x5c\x9c\x10\xf8\x35\x99\xb8\x1e\xa2\x22\x83\xf9\x54\x7a\xac\xda\xa7\xf3\x08\x96\xd1\xff\x73\x1e\x11\xfb\x9e\x56\xad\x06\x03\x04\x17\x11\x98\x05\xba\xb6\x35\x21\x49\x6c\x3b\xb9\x2a\x12\xf5\xe5\x5a\xfc\xf6\x0e\xd4\x21\x77\x37\xf3\x04\x6b\x16\xca\x50\x66\x57\xa6\xd6\x96\xd7\x5a\x6d\x8e\x18\xe9\xef\xe2\xb0\x8c\x8b\x1f\xa0\x72\x82\x38\xe2\x7c\xfb\x32\x21\x66\xee\xe4\xee\x76\x96\x8b\x77\x7b\x50\xee\x6a\x2b\x80\x4e\x1e\x9b\x46\x01\x66\x20\x13\x2b\x65\x88\x71\x8d\x97\x8c\xa2\xc0\x02\x69\x79\xc4\x00\xd3\xc5\x33\x67\x51\x21\x0f\x0b\x00\xd2\x69\xec\x8f\x4e\x2f\x95\x59\xe1\x80\x33\x2d\xd2\x70\xe5\x0c\xc9\x46\x5c\x55\x58\x93\x63\x55\x52\x1b\xc3\xc9\x56\x0f\xc1\x9e\xc1\x42\x42\x12\x1e\x6b\xb2\xff\xf8\xf5\x03\x37\xfc\x26\x4a\xcf\x1a\xc1\x70\x43\x28\x33\x4b\x3b\x52\xcb\xa9\x6d\x93\x03\xb1\xb5\xdb\x85\x9d\xae\x31\xd8\x0f\x17\x11\xfb\xa2\x51\xe1\x0b\x4d\x12\x21\x28\xf9\xfa\xff\x68\x72\xd0\xc0\xb8\x1e\xef\x59\x54\x1f\x83\x2b\x0a\x9d\xf3\xa4\xcd\xd5\x91\xc8\x77\x36\xb1\xae\xcf\x24\x2c\x27\x5a\x10\xc3\xfd\x67\x83\x9d\xad\x4e\xf3\x99\xb9\x49\x4e\xcd\x77\xf7\xba\x5b\x5d\x4f\x2c\xa3\x04\xe5\xb2\x29\x21\x30\x7c\xb1\x8f\xa6\x4a\xa3\xd0\x1c\x44\x11\xc8\x36\x9c\xce\xde\x46\x5e\xe3\x69\xee\x63\x7d\x43\xd2\x88\x26\xbf\x60\xdd\xde"}, +{{0xd3,0xd1,0x88,0xb3,0x90,0xba,0xcc,0xd9,0x50,0x24,0x52,0x61,0x46,0xb8,0x2b,0x91,0x84,0xe1,0x97,0xe4,0x6a,0x93,0x40,0xa0,0xe6,0xec,0x18,0xbf,0x75,0xbe,0x7f,0xc5,},{0xd8,0xf7,0x94,0x94,0x8a,0xa6,0x98,0x61,0x00,0x21,0x4e,0x9b,0x7b,0x90,0x24,0x42,0x08,0x06,0xb4,0xc6,0x78,0x46,0xd5,0xbd,0x50,0x61,0x13,0xb3,0x53,0xa2,0xea,0x3d,},{0x16,0x97,0x6b,0x26,0x7d,0xe9,0x6e,0x38,0xdd,0xdc,0x84,0x78,0x07,0x5f,0x6b,0xdd,0x71,0x59,0xe5,0x63,0x34,0xb2,0xd2,0xd1,0x92,0x09,0x46,0x29,0x4f,0x33,0xcd,0x6b,0x7f,0x9c,0x50,0xf8,0x05,0x7f,0x49,0x6c,0xab,0x5d,0x94,0xbb,0x4d,0xca,0x26,0x2f,0x9f,0x0f,0xdf,0x9b,0x1b,0x64,0x74,0x1f,0x4b,0x72,0x2d,0x32,0xef,0xa8,0x22,0x03,},"\x5e\x65\x65\x8e\x42\x03\x75\x43\x3f\xd7\xc1\xf6\xbe\x67\x88\x41\xe5\x81\x04\xf1\x0b\x4c\x67\x63\x59\xd8\x4f\xce\x79\x92\xf5\xc5\x75\x57\xd7\x38\xf8\x30\xb5\x05\xfa\x0c\x2b\x9e\xab\xf8\xd1\xa9\xf8\x1f\xe8\xf3\x15\xd6\x62\xe2\xb8\x4c\xe9\x52\x99\xeb\xf4\xe5\x03\xb5\xe1\xf7\xf8\xcd\xb6\x68\xae\x73\x3f\x3d\x0c\xdd\x4c\x74\x2a\xb5\xf2\x72\xbe\xa4\xf1\x8d\x18\x3e\x89\x23\x84\x76\x62\xf9\xa3\x9c\xd4\xb1\x4e\xc7\x6d\x11\x03\x2f\xe5\x73\xc2\x62\x01\xae\xf6\x66\x01\xce\xc6\x83\xe3\x4b\x89\xaf\xd9\x64\xe9\x87\x80\x1c\x70\x6a\x85\xe2\x7b\xab\x33\x70\x1c\xd1\x09\xbc\xf0\x7b\x27\xca\x67\xf0\x22\xc4\x94\xa0\x4c\xbe\x5a\x9c\x6d\x63\xaa\xd9\x36\xcd\xf1\xa1\x80\xfd\x05\x86\x51\x98\xb9\x6f\x06\xa7\x8d\xa9\x57\x99\xd3\xaa\x4d\xf3\xb1\x70\x03\x3c\x69\xe8\xfb\x04\x28\x8c\x35\x46\x55\x3b\x57\x9c\x0a\xe3\x93\x80\x62\xd3\xd8\x42\x1c\xfa\x66\x26\x85\x29\xbe\xc0\x27\x1e\x53\xb4\xee\x7d\x09\x9e\x71\x48\xa8\x02\xdf\x80\xfe\x5e\xed\xee\x1c\x90\x3a\xe8\xed\x4d\x64\x0e\xad\x76\x12\x62\xdd\x40\x14\xf2\x5f\x93\x97\xba\x3f\x1c\x08\xd8\x3a\x3c\x48\x5c\xfb\x55\xf8\x99\x19\xaa\x97\x2d\x6b\x7e\x77\x11\xbe\x9e\x30\xc1\xeb\x96\xa0\xc3\x84\x53\x09\xfb\x23\xdb\xc7\x5b\x69\x91\xdd\x6e\x48\xcd\xde\x90\xe0\x4f\x22\x8e\x8c\xcf\x3b\xa2\x3f\x27\x47\xcf\xb9\xd3\x38\x1a\x93\x05\xf8\x16\xf2\x6c\xdd\xe4\x1c\x02\x20\xfa\xd2\x28\xff\x6a\x8b\x09\x5c\x77\xb6\xba\xe8\xfa\x33\x68\x14\x27\x24\xbf\x1f\x5e\x0f\x6f\xbc\xa5\x32\x0c\x21\x5b\x6b\xa8\x6b\x91\xe3\xa8\xac\xf7\x50\xe9\x3f\xa7\xea\xa6\x5c\x4f\x78\x5e\xf8\x42\x1a\x19\xc1\xe2\x7b\xc2\x4b\x42\x8e\x08\xa9\x02\x42\xab\xac\x9b\xd4\xaa\x03\xc6\x56\xf8\xf4\x6d\xc4\x0b\x36\x15\x2c\x1b\xd0\xde\xf1\xac\xfc\x0d\xa1\x0a\x2f\xa1\xdc\x3d\xa7\xac\xe5\xa8\xfd\x76\x22\x7b\xb1\xa6\x02\x39\x0f\xe5\x7a\xfd\x32\xef\xe2\x81\xf2\xea\x6b\x2e\x4d\x25\x45\xcb\x88\xd2\x30\x8d\x72\x69\x1c\x9a\x52\xb4\xca\x25\x23\x1a\x01\x07\xf2\x5d\x11\x7c\xc9\x35\x39\x76\x21\xc6\x83\xbd\xc8\xf2\x2e\x81\x03\x40\xf2\xcb\xac\x4c\xea\xa3\x46\x86\x65\x26\x18\x79\xf0\x07\x42\x00\x74\x3e\x0d\xe5\xf3\xe5\x83\x08\xb9\x8b\x04\xb8\xc7\x14\x8a\x4e\x00\x4e\x66\x7e\x83\x2b\x00\x84\xb5\xf2\xbd\xc6\xfd\xc9\x59\xf2\xfc\x28\xa8\xd3\x1d\x9a\x9e\x78\xe5\xd5\xf9\xc0\xb1\x19\xe5\xff\x1f\x68\xf7\xc0\xda\xf0\xc0\xf1\x69\x47\xcc\xa5\xb7\xce\xd0\x96\x01\xe2\xeb\xed\x28\x2e\xf2\xbf\x8f\xe9\xa2\x7e\xd2\x7f\xc5\xbc\xda\x8a\xed\x6c\x71\xbe\xe3\xe7\x75\x10\x04\x47\x26\x89\xbb\xf6\xd9\xd0\x79\x52\xa2\x42\xff\x87\x0d\x7c\x3f\x5e\x1f\xfc\x2c\x1f\x40\xfc\x9a\xb7\x57\x9b\x39\x2b\x55\x4f\x3d\xc5\x88\xc0\x3a\xb9\x57\x43\x1f\xe5\xd0\x2c\xbc\x71\x1a\xd4\x89\xfe"}, +{{0x61,0x91,0x7a,0x97,0x5c,0xb7,0xec,0x56,0x4c,0x70,0x8a,0x56,0x53,0x88,0xc5,0x72,0x36,0xa6,0x6b,0x69,0x7d,0xcd,0x5a,0x7f,0x10,0xba,0xe6,0x71,0x57,0x2a,0xc7,0xf0,},{0xec,0xc0,0xf0,0xb9,0x92,0x76,0xe5,0x28,0xf8,0x2b,0x42,0xf2,0xef,0xce,0x85,0x79,0xf8,0x3e,0x63,0x8c,0x6a,0xce,0xfd,0x07,0x28,0x28,0xc0,0x4e,0x43,0x4f,0x55,0xaf,},{0x6a,0xbb,0x3e,0x37,0x7b,0x5c,0x80,0xb7,0x4f,0x77,0x21,0x9c,0x1a,0x9e,0x09,0x6f,0xba,0x0e,0xb6,0x89,0x90,0x81,0x7a,0xcf,0xf1,0x2d,0xba,0x7f,0x61,0xc7,0x7c,0xcf,0x59,0x5f,0xb6,0x60,0x85,0x52,0x00,0x3c,0xea,0xd0,0x6c,0xa1,0x31,0x7c,0x9c,0xd5,0x1a,0xc4,0x72,0x4b,0x29,0xf4,0x09,0x21,0xfb,0x92,0x84,0x33,0x76,0x87,0x64,0x01,},"\x6e\x97\x0e\x0b\x1c\x92\xa7\xf4\x96\xa8\x2d\x8a\xe8\x0c\xfd\x0c\xce\xf1\xd2\xc7\x99\xd4\x17\x28\xf3\x5d\xdc\xd6\x03\xb4\x21\xc2\xa5\xab\x3b\x48\x9e\x78\xf4\xb6\x22\x97\xde\x43\x7c\x5a\xd1\xa9\x68\x3f\xf8\x7f\xa2\x8e\xb3\xcc\x38\xce\x24\x2a\xf5\x94\x19\xf9\xfd\x43\xfc\xaa\x54\xfc\x39\x89\x92\xf8\xc8\xe3\x1f\x2b\x33\xdc\xcc\xd0\xee\x11\xba\x7b\x38\x8e\x8d\x2a\x36\xea\xd0\x67\xc6\xbe\xce\xd5\x89\x0a\xb7\xd4\xa9\x4f\x55\xda\xb9\x21\x28\xa0\xf8\x14\xc0\xe6\x89\x71\xdf\x57\xbd\x50\x78\xa7\x40\x31\x75\xc7\xc2\xfd\xd4\xa5\x24\x47\x15\x3a\xb3\x74\x56\x72\x9a\xee\x33\xe5\xfc\x93\xdb\x8e\x7f\x48\x03\x09\x87\x5e\xcf\x6d\xb0\x7c\xe7\xf3\xca\xc5\xde\x49\xe3\x61\x27\x5c\xa5\x0b\x6b\x71\x9f\x4b\x71\x5b\x3e\x30\x86\x3c\xbb\x3b\x71\x64\xba\x9e\xb9\x6e\xf3\x30\x4b\x19\xad\x4d\x74\xdc\xe4\xbd\x25\xe7\x7b\xbb\xbe\xff\x1e\xe7\xd1\xfb\x55\xb9\xc4\xf7\xfc\x4c\xd9\xbd\x55\x10\x8a\xfc\xf9\x9c\x1a\x41\xcd\x6f\x6b\x1a\xdb\x29\x7b\x10\x6c\x8b\xa2\x4e\x31\x34\xf8\x7d\xd8\xef\xe5\xcf\x85\x49\x22\x91\xb9\x4d\x66\x00\x95\x8c\x28\xb9\x12\x2f\xe6\xe0\x1b\xd3\xe3\x29\xe4\x2d\x19\x26\xb8\x9f\x7a\x8c\x40\xa4\x98\x67\xe5\xaa\x3a\xd7\x49\xbd\x98\xda\xe7\xd0\x06\xb4\x53\x60\x9e\x7d\xae\x26\x36\x4d\x91\x72\xbe\x72\x83\x33\x01\x21\xed\x2b\x40\x27\xe0\x88\x51\x18\x74\x3a\x6e\xa0\xcb\x7d\xc2\x74\x09\xa9\xb2\x82\x0b\xcc\x24\x2e\xa1\x0a\x00\x93\x7b\xf8\x49\x20\x1e\x0f\xb6\x19\x94\x21\xf1\x63\xe9\x79\x4f\x2d\xd4\xb3\x32\x01\x4a\x09\xd3\xee\x80\x71\xda\x78\x77\x47\xf9\x90\xf5\x17\x99\x19\x02\x7d\xdf\xf7\xca\xb0\xf5\x5e\x9a\xfa\x8e\xcc\xb1\x6c\xc2\xdd\x3c\xbb\xea\xd7\xff\x7e\xc8\x18\xc2\x53\x39\x3f\x74\x87\x41\xf5\x54\x07\xf7\x40\x8e\xe3\x3a\x42\xae\x2d\x6e\xcb\x3f\xb6\x00\xa7\x1f\x30\xab\x63\x06\x06\xe5\x53\xb4\x36\x78\xe5\x98\x54\xf3\xa2\x94\x7b\xcf\x4e\xa0\xfc\xfe\xdc\x31\x4d\x83\x70\xd1\x26\x63\x95\xfd\xa3\xc9\x10\x5e\x97\x59\x52\xf6\x0e\x30\x86\xbb\x82\x48\x15\x13\xd6\xfe\x8a\xdb\x4f\x95\xef\xb9\xa9\x5b\x66\xd4\x80\xd2\xbb\x17\x10\x78\xcf\x40\x68\x4a\xc6\x9a\x78\x9c\x7f\xb7\xfa\x42\x53\x33\xd7\x05\xdb\x00\x06\x67\x55\xdf\x72\x8d\xe0\x2d\xf2\x5b\xae\x34\xf1\xd7\xd4\x9c\xaf\xfc\x51\xe9\xba\x2b\x10\xb9\x8f\xe4\xcd\x9d\x22\xb7\x76\x4e\xd9\x31\xed\xb5\xf0\xb5\x54\x49\x6e\x99\x53\x91\xe0\xaf\x0b\x8d\x1c\x7a\x82\x95\xa8\xd1\x5a\x7c\x65\x56\xd2\x9c\xb1\x9e\x08\x55\xca\x50\x5a\xd0\x1d\x2a\xa3\x09\x28\xa8\x4b\xc4\x89\x59\x57\x6d\x81\x2d\x9b\x27\xb8\xe8\x88\x79\xfa\xa2\x80\x6c\x08\x41\x36\x0e\xcd\x0f\xe8\x3f\x5b\x84\x8f\xc1\x2f\x65\x8f\x1e\x7f\x40\xe5\x61\xc2\xe7\x8d\x3b\x01\x25\x21\x0a\x92\x06\x1c\x2d\xb2\x1b\xa6\x60\xe8\x60\x8f\xf5"}, +{{0x7b,0xa2,0x5f,0x27,0x97,0xa2,0x83,0x6f,0x37,0x9d,0x6b,0xbc,0xbe,0x9a,0xbf,0x4f,0x2d,0xef,0x5e,0x52,0xf7,0x2b,0xd9,0xe0,0xb0,0x06,0x57,0x10,0x22,0xfa,0xc2,0xf3,},{0x6c,0x2e,0xd4,0xe8,0xc0,0x12,0x4d,0x5d,0x05,0x40,0x79,0x6d,0x39,0x45,0xd1,0xde,0x71,0xaa,0x69,0x69,0xe6,0xab,0xea,0x0f,0x1b,0x0e,0x6f,0xc4,0x29,0xc7,0x04,0x6f,},{0xf1,0xf5,0x90,0xa9,0x07,0xba,0x98,0x0e,0xb0,0xd6,0x48,0xab,0x4d,0xed,0x5f,0x92,0xfa,0xf7,0xcb,0x85,0x1d,0x81,0xd8,0x58,0xa7,0x8f,0xa6,0xb7,0x7c,0xbb,0xe1,0x2f,0x64,0xd2,0x0d,0xf5,0x27,0x71,0xa7,0xd5,0xe5,0x39,0xa1,0x52,0xd7,0x31,0xe1,0x90,0x3d,0x42,0x11,0xfd,0xcf,0xef,0x9a,0x48,0xb4,0x6c,0x8f,0xd5,0x39,0x4c,0xa0,0x09,},"\x17\x1a\x34\x09\x87\x80\x97\xb3\xb2\x2b\x2c\x00\x66\x0b\x46\xe5\x42\xc2\x16\x4c\x00\xbb\xee\x54\x55\x48\x37\x94\x0e\x70\xf0\x3d\xa9\x91\x6a\x40\xf9\xbd\xe8\x28\x8f\x45\xe4\x7b\xef\x7f\xfe\x4e\x55\x7c\xd4\x47\x40\x45\xe7\x40\xfd\x95\x9d\x98\x4f\x4e\xc8\x1d\xa8\x8d\x44\xa3\x73\xc1\xed\xa0\xcf\xc6\xb0\x8e\x35\x13\x73\xd3\xb8\x2a\xb0\x90\x2d\xf8\x06\x3f\xd9\x08\xe7\x03\xe0\xcb\xec\x41\x0a\xb5\xcd\xfe\xaa\xe0\x01\x88\xce\x2a\xd4\x2b\x8b\xf0\x4f\x7d\xaa\x5f\x0e\xe3\x33\xa6\xf9\x31\x1b\x4a\xd9\x81\x09\x52\xd5\xd5\xa6\x4b\x20\xf3\x7e\x84\x54\x15\xfc\x3c\xdd\x61\x6f\xeb\xec\x50\xdb\x29\x6f\xb3\xf3\xbb\x7f\x6b\x36\x6b\xbe\x52\xe4\x89\x7a\x05\x61\x7b\xf7\xc9\x81\xa6\x2e\xdc\xbb\xbe\x5d\xa4\xc3\x9c\xaf\xa8\x69\xaa\x2b\x27\x34\xe6\xcf\xed\x90\xed\x8b\xe7\x59\x49\x39\x0e\xe4\x45\x66\x89\x24\x55\xb8\x90\xcf\x56\x8b\x94\x5a\xab\xb7\x58\xd3\x85\x4b\xe6\x53\x9f\x3b\x86\xbf\x01\xd1\x88\xe4\x8c\xf2\x62\x6a\x0d\x7d\x38\x17\x03\xbe\x6e\xd1\x29\x0d\xfb\x94\x7b\xc2\xe0\xf8\x3d\xbc\x58\x70\x30\x80\xd7\xf5\xb9\xef\x19\xae\xf9\x30\x90\x8f\x68\xf0\xc8\x00\x10\xa9\x40\x1b\x30\x3a\x9f\x6d\xa8\x05\xbb\x8a\x0e\xd0\xf3\x94\x13\xee\xfe\xdf\x91\x9f\xfd\x8e\xa6\x39\x1b\xf9\x5d\x42\x29\x60\x4e\x49\x45\x7b\x8e\x23\xbe\xc6\x11\x48\x4c\xc7\xf9\x83\x2d\xd9\x5b\xdc\x3a\xd1\x77\xc0\x50\xf4\xab\x63\x3d\xcd\xb3\xe6\x91\xf5\x90\x28\x73\xb3\x8c\xb0\x72\x0b\x91\x13\x35\x7f\xe0\xcf\xb9\x8a\x68\xcc\xcb\x5d\x5f\x08\x09\xd5\x9a\x37\x5c\xf7\xb5\xa2\x75\xd4\x3c\x4c\x34\xff\x68\xe4\x48\x52\x6e\x8e\x1a\xad\x44\xe2\x00\x08\xa2\x32\xaf\xbc\xf5\x32\xa4\x2b\x50\xa0\x25\xa1\xb2\xee\x4e\x07\x7e\xb0\x12\x5a\x59\x3d\x51\xa2\x00\xec\x20\xd8\x72\xc0\x58\x38\xad\x36\xaa\xae\xec\xcc\x3e\xd9\xef\x41\xf6\xd1\x22\x67\x02\x17\xd5\xc0\x8f\x6e\x13\xc1\x72\x19\x45\x89\xac\xc3\xc5\x9f\x7e\xf7\x90\xc7\xc8\x5a\xa6\xd5\xeb\x69\xd4\xc8\x9a\x72\xf5\xe7\xc9\x24\x69\x85\xc1\xac\x0c\x5d\x19\x7f\x76\xa7\x3e\x37\x74\x83\x9d\x4a\xa2\x09\x6a\xca\x19\x0a\x30\xf4\xaa\xc5\x40\x57\xb6\x4f\x35\x8e\x0e\x06\x40\x0c\x0d\xf2\xf8\x76\x41\x2d\x34\x48\x4c\x43\x44\xf4\xd7\xc8\x66\x51\x7d\x3e\xfb\xa4\xa9\x0f\xa7\x14\x4c\x9b\xa5\xdb\x33\x61\xdb\x57\x69\x40\x3e\xc8\x16\x26\xa5\x11\xf9\x3e\x30\xf8\x58\x6e\xad\xfc\xaf\xd9\xa3\x6e\xcf\xf8\xd2\x4b\x42\x07\x9a\xda\x8e\x57\x9a\xc3\x08\x51\x17\x7b\xce\x90\x38\xb0\xe1\x30\x00\x72\xd6\x8e\xfd\xd7\x23\xf6\x35\x50\x64\x84\x32\x75\x81\x5a\x66\xb9\xd7\x3a\x12\x99\xaa\x59\xa1\x81\x2f\x64\x52\xfb\x41\x15\xea\x2b\x1f\x9f\xf4\xa9\x96\x90\x59\x6e\x3f\x20\x22\xd8\x1e\xd8\x74\xdd\x67\xe6\x18\x9c\xa0\xe6\x8b\x93\x04\xe9\x93\xa9\x5b\x66\x66\x5e\x0d\x07\x4c"}, +{{0xd1,0xe1,0xb2,0x2d,0xe5,0xe0,0x4c,0x9b,0xe4,0x65,0x1d,0xd7,0x39,0x95,0xa3,0x66,0x6c,0xb5,0x35,0x2c,0x65,0xac,0x7b,0x70,0x51,0xb3,0x66,0xfe,0x1a,0xc0,0xc3,0x10,},{0x12,0xfe,0x56,0xf1,0x01,0x2d,0x5c,0x12,0xf1,0x35,0xed,0x59,0x82,0xf3,0x82,0xae,0x5f,0x11,0x43,0xbc,0x90,0xe8,0xcb,0x8c,0x93,0x05,0x17,0x54,0x55,0x1e,0xe9,0x0a,},{0xab,0xaa,0xb4,0xfa,0x6a,0xeb,0x0a,0x0b,0x34,0xee,0x0d,0x61,0x3a,0x0a,0xf0,0x49,0xed,0xb4,0xce,0xdb,0xfe,0x9d,0x3b,0xeb,0xe9,0xc0,0x06,0x18,0xb1,0x15,0xb9,0xd1,0xfa,0x52,0x4e,0xc3,0x49,0x5e,0x13,0x30,0xb0,0x93,0x61,0x81,0xea,0xbb,0x14,0x29,0x9f,0xac,0xcc,0x40,0xea,0xa8,0xcc,0xa5,0x7e,0xd3,0x24,0xb7,0xa6,0x42,0x0c,0x0e,},"\xc7\xf2\x18\xb5\xaa\x7a\xae\x17\x99\x62\x5a\x56\xc4\xd7\xd7\xb0\x26\x37\xe5\x72\xf1\x41\x1a\x61\x22\xf1\x13\x79\x1a\xa3\xc6\x28\xe8\x19\x60\x2f\xb4\xf0\x33\x5a\x61\x23\x01\x3f\xa6\x4e\x9f\xdc\x4e\x4a\xe4\x97\xbd\x16\x9c\x2f\xa7\x7b\xc2\x36\x12\x97\x17\xf4\x62\x88\x6b\x41\x08\x93\xfa\x78\x09\xcb\xfd\xc8\x92\x22\x3b\x40\xee\x04\x1e\xbd\x4e\xc7\xdd\xab\x55\xbe\x60\x81\xa1\x64\x66\x43\xa9\x12\x0b\xaa\x46\x28\x9a\xcb\xa1\x5b\x3b\x48\xaf\x3b\x7a\xde\xcd\x69\xf4\x3e\xed\xe7\x9d\x9b\x19\x57\xe1\xd8\xc3\x12\x9e\x0f\xa0\x57\x9d\x3d\x39\x53\x70\x46\x1b\x0e\x12\x55\xc9\xca\xa9\x4e\x47\x25\x60\x1c\xb9\xd0\xe2\xd6\x02\x44\xd1\x5b\x64\xe1\xf7\xbc\x90\x15\x59\x0a\xd0\x99\x1f\x12\xf8\x26\x73\x11\x20\x6e\x9e\xb5\xd1\x6a\xdd\x0b\xa5\x21\x8f\xce\x5f\xff\xe1\xc9\xce\x5f\xfe\x1f\x73\x11\x32\xf4\xb1\x2c\xac\xb0\x2f\x97\x45\x17\x10\x84\x6b\x7f\x82\x4f\x4f\xa9\xe0\x89\x19\x26\x64\x69\x78\x9c\x00\xce\x0d\x94\xd3\x8f\xa8\xfe\xc3\xf5\x1f\x2f\x88\x6e\x9d\xb0\x9b\x80\x44\x70\xb1\x9e\xc9\xe8\x06\x63\xf1\x55\xb4\x98\x4d\x2b\xbd\x0b\x2c\xe9\x93\x02\xe0\x6c\x64\x44\x4b\x69\x6e\x31\x29\xfc\xef\x34\xc3\xdd\x00\xf7\xab\x5b\xed\xa7\x47\xa3\xfc\x63\x39\x19\x2b\x74\x0f\x35\x69\xb6\x7d\xbd\x6f\xfa\x39\xe2\x71\xfa\xa4\x00\xd9\x61\x6b\xff\x86\xec\x49\xa6\x59\xde\xf2\xe7\xf5\xd4\x51\xf2\xa2\xb3\x5e\x66\x2a\x6e\x7c\xc2\x2f\x1e\x5c\xdc\xde\x8a\x59\x98\x81\x35\xb7\xe7\x65\x62\x74\x3c\x1e\x6a\x09\x99\x01\xb3\xef\x97\xcb\xff\x23\xf2\x09\xbd\x70\x88\xc2\xf0\x32\x45\x27\x9a\x1d\xc7\x8d\xdd\xc1\xbb\x0c\x1d\x35\x10\x03\x57\x88\x21\x26\xb3\x28\xd3\xd9\x4e\x08\x71\xb6\x0b\xe2\x53\xfd\x1b\x6e\xcf\x03\xc1\xdb\x73\x1d\x9e\xed\x0e\xdf\x2b\x26\x43\x23\x07\x80\xa4\xd6\x6e\x99\x17\x9a\xad\x1b\x82\x40\x2e\x55\xf6\xd7\x85\xeb\xc8\x0f\x8d\xd2\xfd\x2b\xeb\x09\xf3\x10\x35\xdf\x62\xc1\x7f\x42\x8e\xd0\xb2\xd5\x65\x08\xdb\x31\xe6\xd2\xdd\x5f\xb6\x9e\xbe\xee\xa3\x25\x70\x70\xcf\x2f\xe6\x7d\x42\xd2\x88\x16\xa5\x5d\xba\xe0\xb1\x85\xdb\x44\x21\xbb\xfd\xae\xfc\x79\xc0\x8c\xdc\x1a\xcc\xf7\x16\x42\x56\x2e\xc7\x00\x36\xda\x2b\xba\xfa\x4a\x89\x19\x54\xc4\xee\x40\x49\xb5\x5c\x64\x0e\x91\x93\x0e\x39\xe3\xef\x10\x18\xdc\x16\x47\xf2\x69\x42\xc6\xdb\xdf\x4d\x56\xe4\x1e\xb2\xc8\x98\xc8\x21\xfa\xc1\x7c\xc2\x73\xe8\xe4\xaa\x56\x08\xa8\x12\xcf\x4b\x82\xf9\x60\x19\xc2\x52\xd5\x6e\x78\x05\x29\x8c\xcb\xe8\xce\x40\xb0\xbd\x0f\x93\x3b\x88\x4c\x0f\xaf\x97\xa9\x58\xb2\x04\x08\xb8\xa5\x29\x7c\xce\x55\x27\xb2\xca\x21\x28\x06\xe7\x2a\x32\x64\x45\x7a\x7f\xac\x86\x62\xb8\x2c\xa2\x33\xe1\xc7\x75\x8d\xc6\xe4\xf1\xb9\x99\x58\x63\xf2\x5f\x74\x7b\xce\xe4\x3b\x63\x9b\x1f\x8f\x20\x26\xd2\xd2"}, +{{0xdf,0x29,0x4e,0x47,0x7b,0x1b,0x91,0xc5,0xac,0x5b,0x98,0xc3,0x30,0xd2,0x22,0xd7,0xcd,0x2d,0x53,0xe7,0xd0,0xbc,0x0c,0xa4,0x03,0xdf,0x4e,0xc7,0x53,0x27,0xa2,0x74,},{0x5f,0x0b,0xd2,0x2f,0x2f,0x18,0x96,0xd1,0x56,0x3b,0x4f,0x69,0x40,0xc7,0xdf,0x89,0xef,0xc2,0x58,0xc0,0xff,0x6c,0x2f,0xcd,0x67,0x4d,0xaf,0x4f,0x59,0xfc,0xdb,0x60,},{0x99,0x45,0xab,0x73,0xb5,0x85,0x62,0xb3,0x55,0xda,0xbc,0x4e,0x2b,0x6b,0xe7,0xe0,0x5f,0x37,0xf8,0x95,0x71,0x44,0x0c,0xcc,0x32,0xc1,0xa9,0x47,0x37,0x09,0x5b,0x78,0x66,0x74,0x7d,0x21,0x00,0x70,0x00,0xa0,0xf0,0xe3,0x51,0x11,0x4b,0x88,0xe0,0x13,0x8b,0x55,0xdf,0x44,0xfe,0x72,0xeb,0xe9,0x59,0x14,0x10,0xe7,0x07,0xfa,0x9d,0x02,},"\x3e\x42\xd6\x68\x40\x96\x30\xcb\xb8\x48\x12\xac\x7f\xf1\x15\x4f\x70\xfc\xa8\xbd\xff\x3f\x1a\x04\x0f\xa3\xaf\x86\x8a\xa1\xc4\xe9\x15\x08\xb1\xae\xfd\xf5\xc3\xa8\xb4\xb0\x77\xa4\xd1\x62\xd2\xc0\x5b\xd3\x64\xfb\xbe\x8c\x5a\x08\x31\x4c\x2e\x07\xdf\xfb\xd6\xe8\xdd\x2e\x08\xa0\xdc\xc9\x6e\xa9\x2d\xdd\x4c\x97\xf7\x9d\xb9\x42\x5a\x6c\x6b\x34\xc4\x60\x43\xd0\x9a\x68\xb7\x68\x72\x36\xa9\x18\xd2\x1a\x56\x16\x10\xa1\x3a\xc5\xe4\x46\xe0\x88\x1b\xb2\x6c\xc8\xe2\x8a\xad\x16\x54\xf8\x67\xad\x82\xae\x33\xf8\xf7\xa7\x8a\x65\xbe\x57\x69\x94\x75\x51\x6a\x1a\x87\x46\x84\x3e\x93\xa1\xa2\x94\x35\x46\x24\xfa\xc0\x4d\x45\x2c\xcf\xbe\x4f\xdd\x92\xa9\x51\xaa\xa0\x7d\x26\x67\x6d\x5c\xb0\x77\xa5\x00\x0d\x43\x9c\x12\x42\x76\xc0\xdb\xcf\x86\xe7\xaa\x15\x3c\xc2\x4b\x5a\xff\x67\x7c\x6b\xad\xc2\x61\xc2\x89\xf4\xa4\xae\x51\x9b\x2e\x2f\xff\x31\x2f\xbf\x0f\x5b\x4c\x46\x98\xf6\xae\xdd\x8f\xcb\x1d\x23\x48\x94\x2d\xe3\xfb\x73\xba\x27\xf6\xdb\x14\xc2\xf0\x91\x80\x35\x6e\x5f\xca\xe1\xad\xf6\x5e\x22\x42\x5f\x8c\x27\xf1\x9e\x98\x94\x83\x50\x6e\x5d\xf5\x7a\x1b\x61\x3a\x22\xe3\x45\x03\x8b\x3e\xa9\x1c\x0f\x78\xff\xff\x46\x38\x3f\x38\xc7\x22\x25\x35\x8a\x34\x57\x0d\x6f\x66\x4a\x17\x45\x4a\x15\x16\x13\xf0\x1c\xba\x77\x7f\x62\xec\x83\x18\x75\xec\x5e\x27\xd2\x57\xf1\x80\xb6\x36\x6c\xb1\x83\x10\x7c\x40\xf5\x0b\x01\xb2\xb9\xbf\x91\xb3\xb5\x54\x9e\xd9\x31\xa3\x53\x7a\xa4\x16\x89\xf7\x2b\x25\x7a\x6a\xa3\x9c\xdc\x6f\xce\xdf\x14\x39\x83\xbe\x5b\xff\xe3\xae\x2b\x29\xf8\x2f\x88\x21\x22\xd6\x6a\x79\x25\xf5\xa7\x10\x82\x6c\x0d\xad\xb7\xe4\xfa\x4e\xc0\x79\xba\x2e\x76\xda\xda\x43\x3f\x30\x77\xcb\x1e\xf7\x46\x13\xfc\x5d\xbf\x82\x58\xb6\xda\x7c\x73\xc8\x66\x37\x24\x57\xed\x50\x0f\x97\xf9\x90\x7e\x1f\xc2\x63\x53\xc7\x0b\xa3\xbd\x9c\x36\x15\x1d\x46\x86\x5d\x2c\x65\x98\x65\x62\x48\x5c\xf8\x42\x1f\xeb\xbe\x77\x7c\x73\xe6\xcd\x00\x26\xd6\x6d\x35\x12\x8b\x9f\x8f\x33\x26\x4a\xeb\x56\xbd\x3e\x4b\x8d\x1f\x52\x66\x41\x1e\xf3\xb2\x3b\x76\xb3\x6d\x4c\x9d\xf3\xc5\x12\xfd\x56\x0c\x2b\xe5\x2a\xc5\x23\xc1\x93\x77\xad\x2a\xdc\x0e\x8c\x30\x9c\xf5\xbb\xf7\x2d\x9e\xb8\x5d\x65\xa9\x48\x47\xd4\x97\xd8\xd1\x02\x42\x4f\xb8\x43\x81\x66\x6e\xcb\x1c\x35\xa3\x72\x5d\x7d\x9e\x92\x84\xfd\xeb\xb6\xb3\x62\xaa\x6a\x9c\x6f\xb3\x7a\xba\x87\x35\x7f\x57\x4c\x0e\x63\xb4\x49\x7d\x49\x8f\xfb\xb7\xd0\x69\x2d\x78\x4b\x4b\x18\xce\x9f\x91\x50\xc1\x46\xd3\xd1\x8c\x38\x2e\xda\x04\x93\x8c\x69\xd0\x77\x8f\x29\x02\xd5\x23\x5a\x56\x52\xb9\x7c\xef\x6d\x5f\x60\xda\x6b\xd7\xed\x4f\xf9\x7c\xd9\x4d\x49\x39\xca\xca\x3b\x6b\xaa\x3c\xfd\xac\x04\xcd\xa9\x55\x96\xf4\x67\xcb\xc6\xcb\xcd\x92\x64\x16\x77\x43\xea\xc1"}, +{{0x70,0xc6,0x85,0x9f,0x08,0xcf,0x42,0xb4,0xbd,0xa9,0xeb,0x62,0x97,0x9d,0xff,0xb7,0xcb,0x08,0xeb,0x3d,0xab,0xe9,0x3f,0xe9,0x4b,0x01,0x38,0x46,0x17,0xcf,0x67,0x30,},{0x40,0x1c,0x9e,0x20,0x33,0xe2,0x25,0x9f,0xb6,0x38,0x3b,0x3e,0x8b,0x9e,0x17,0xb3,0xf2,0x06,0x27,0x46,0xbb,0xe6,0x48,0xcf,0x48,0x45,0x16,0xdb,0x0f,0x2f,0x1b,0x06,},{0x0f,0x03,0xa4,0xf1,0x5c,0x33,0x9b,0x4f,0x7b,0x88,0xb4,0xe2,0x1a,0xd9,0xe3,0xd6,0xbb,0xf3,0xef,0xfb,0x7b,0x67,0x8f,0xfa,0x50,0x0d,0x47,0x38,0x3b,0x71,0xa7,0x45,0x4f,0x62,0x90,0x7b,0x56,0xf5,0x9f,0x9b,0x9a,0xf6,0xd5,0xb2,0xa0,0xfc,0x1c,0x73,0x7a,0x64,0x10,0x51,0x95,0x08,0x98,0x99,0xf5,0x7a,0x2c,0x9d,0xba,0x50,0x9e,0x0a,},"\xdd\x06\x09\xea\x15\x99\x21\x39\x5d\x11\xfb\x2d\xa8\xea\x4f\x74\x7d\x7f\x74\xb5\x80\x52\xe0\x1c\xad\x40\xa2\x71\xfa\x0b\xbe\xed\x91\x02\x0f\x4f\x0c\x08\x46\xc4\xf0\x77\x78\xa6\xaa\x76\x8e\xb5\x17\x12\x29\x4e\x9e\x1f\x32\xa6\x02\xb1\x52\x51\x4f\x5e\x6d\x39\xf9\xe0\x8f\x7a\x78\x12\xbd\x90\x0c\x10\xa9\x14\x69\xe4\x7e\x8a\x78\xe5\x4c\xd4\xbd\x7c\xfe\xde\xde\xc1\x71\xef\x37\x3f\x1c\x4f\x9b\xbc\x2c\x81\x40\x2f\xb1\x4e\xd0\xbf\xac\x8d\x04\x3f\x11\x7d\x61\x24\x52\x1a\xfa\xe0\x91\x6a\x51\x0d\x56\x8a\xcf\xa3\xaa\x33\x01\xbc\x97\x9a\xc2\x8d\x55\x1d\xbb\xea\x6c\xea\xc4\xc2\x12\xaa\x8c\x84\x92\xb3\x61\x3a\xe7\x39\x5d\xd4\x12\x5f\xc4\xc2\x5d\x5b\x4d\x99\x23\x08\x21\xd4\xb1\x7e\xc2\xee\x6b\xe7\xd6\x04\x19\x5a\x21\x54\x33\x3b\x97\x35\x26\x58\x0c\xa7\xef\x9e\x30\xc6\xc1\xdd\x42\xef\x2a\xfe\x42\xb1\x1b\x1a\xa4\x9b\x9c\xca\xba\xca\x17\x09\x1e\xeb\x38\x0e\xc5\xe3\x4a\xd1\xe3\x82\x7c\xc6\x0d\xac\xf1\x44\x28\x6c\x78\x92\x59\x0b\xd2\x67\x1a\x8d\xc5\xf3\xa7\x02\xc1\xde\x7c\xd3\xb4\x2c\x1b\x15\x0b\x09\xc3\xe5\x8e\xf6\x94\x3b\x45\xd8\x9d\x41\xdf\x36\x1f\x1d\x5c\x25\x56\x55\x91\xb6\xac\x8d\xea\xa7\x36\x76\x53\x1f\x6e\x5a\xbe\x58\x04\xb0\x09\x7f\x8d\x45\xea\x29\x39\x17\x73\x33\xca\xce\xf1\x2e\x4b\x71\xfe\x49\x36\xba\xfe\x00\x74\x7a\x89\x30\xbc\xea\x55\xb8\xfd\x84\xa0\x1f\x6d\xf8\x4e\x7a\xcb\x93\x1f\xc7\xc0\x1d\xdf\xd6\x3d\xee\xc3\xad\x3e\x69\xdf\xa2\xb7\x35\x50\x58\x3d\x57\x47\xee\xe9\x6c\x55\x36\x36\x87\x97\xe2\x47\xf2\x3f\x53\x7d\x79\x07\x9a\xb6\xda\x31\x41\x02\xc7\x44\x3d\x41\x96\x0e\x3a\x3d\x8c\x35\x9c\x4a\x4e\xc6\x26\xfc\xc4\x4e\x11\x0e\xa7\x44\xd4\x17\xaa\x85\x0d\xb8\xec\xdb\xfe\x34\x0a\x96\x2d\xb0\xd8\xc5\x7d\xc5\x17\xbe\x8b\x40\xd1\x4d\xe9\x7b\x1e\x9e\x04\x26\x44\x7f\xde\x0a\x04\xe5\x06\x79\xc5\x3b\xa1\xaa\x3c\xdc\x38\xc7\xed\xe6\xdb\x6c\x05\x4b\x1e\x9c\xe7\xde\xad\xaf\x93\xeb\xdd\x47\x07\x91\x53\x5f\x3e\xcf\xab\xf3\x41\x63\x55\xf7\xa1\x8a\x38\xaf\xe6\xbf\xe5\x07\xef\x08\xc4\x37\x3a\x4a\x69\xde\xe1\xfc\xb6\x5b\x16\x31\xa0\xde\x14\x88\x64\x9d\x0b\xb2\x67\x9a\x9a\x45\xf6\x78\x20\xb2\xa4\xa1\xe5\xa5\x48\x07\x2d\xa7\x03\x2d\x17\x25\x55\xe7\x88\xcc\x98\x60\xeb\xb3\xc0\xc3\x59\x49\x37\x51\xb0\xc2\xc9\x50\xa7\xfc\xf4\x80\x3c\x14\x7f\x93\x40\xfc\x93\xd8\x5f\x1e\xfa\x57\xb3\x90\x81\xb9\x2d\x93\x47\x3f\xd2\x35\x16\xc4\x95\x0e\xd4\xb2\x9a\x2e\xd3\xa0\x42\xae\x3d\x92\xa1\xe5\x2c\xb7\x09\x63\x6f\xc7\x27\x2f\xd7\x47\x20\x8b\xee\x2b\x16\xd1\x91\xe4\xc6\xde\xb2\x76\x72\xaa\x34\xe4\x39\x14\xcf\xf2\x05\x5c\xa4\xee\x8b\xa3\xe1\xdc\x58\xa6\x79\xc7\xf7\xde\xe2\xc1\xd5\x3e\x28\x75\x09\x70\xf5\x7d\x85\xea\xb1\xc2\x6b\x89\xbb\x73\xe0\xb1"}, +{{0xc5,0x96,0x29,0x61,0x81,0x5b,0x57,0xcd,0x16,0x24,0x03,0xce,0x08,0xe4,0x10,0x5d,0xdb,0x8a,0xae,0x2d,0x3f,0x53,0x3f,0xb4,0x9c,0xc2,0x36,0xb5,0xff,0x50,0x4d,0x6e,},{0xdb,0xad,0xe7,0x22,0x36,0xba,0x12,0xd4,0x97,0x7b,0xa4,0x6c,0x36,0x4b,0xb6,0x9a,0x88,0x7f,0xf4,0x02,0xde,0x91,0xd4,0x7a,0xfa,0x9b,0x93,0xc9,0x5b,0xe7,0x1e,0x7e,},{0x81,0x01,0xba,0xef,0x00,0x4e,0xb6,0xf5,0xad,0x4d,0xe0,0x97,0x9f,0xf3,0x6d,0x34,0x39,0xb8,0x21,0x2b,0xdc,0x92,0x89,0x42,0xe4,0x31,0x91,0x5b,0x3f,0xd1,0x8b,0xc2,0xad,0x67,0xb2,0x6f,0x18,0x94,0x1d,0xcb,0x16,0xd2,0xc2,0x91,0x91,0x42,0x1e,0x77,0x9f,0xed,0x62,0x2f,0xd9,0xf5,0x82,0x64,0x4e,0xaa,0xdb,0x3f,0xe5,0xc0,0x98,0x03,},"\x4a\xe4\x14\x8d\x79\xca\x94\x25\x59\x2a\xa2\x40\xbd\x15\x34\x24\xa3\xbf\x4a\xe2\x73\x95\x87\x2c\xe5\x72\x8a\xc7\x61\x35\x96\xa7\x7d\x5c\xe8\x56\x5d\x8d\x6e\x1b\x59\x35\xb3\x90\x6c\xaf\xe1\xff\x88\x8e\xbc\x98\x15\xe0\x4a\x62\x4d\xfc\x4c\x69\x07\xb8\x5f\x6f\x1a\x0d\xbd\xdf\xf6\x2e\x91\x51\x22\x0d\x47\x44\x62\xcb\x9f\x13\xd8\x9d\x3a\x93\xa0\x0b\xa2\xb6\x0f\x7e\x7c\xa6\x3d\xa1\x7a\x63\x79\xd6\x73\x55\x1e\x79\x0b\x59\x11\x72\x7c\x90\x6d\xc9\x4f\x86\xd8\x27\x75\x46\xc1\x56\x4a\x45\x57\x3a\x77\x43\xbb\x8a\x13\x8c\xde\x87\xb3\xb2\xf2\x8e\x5e\x24\x59\x40\xa5\x1e\x7c\x45\x8c\xf8\xc5\xf0\xa7\x02\x75\x96\x25\x53\xe0\xd2\x39\x0d\x17\x1d\xb4\x4c\x2f\x7a\x5c\x9e\x9f\x93\xb9\x0f\x7a\x5f\x54\xf1\x91\xb0\xd8\x75\xba\xd7\xe0\xbe\xb9\x80\xc2\xa3\x36\x5c\xd7\xb9\x20\x87\x24\xf4\x65\x44\x18\x11\x7e\x16\xef\x71\x34\xe3\xe2\x79\x4b\x6f\x9e\x80\xec\xab\xec\xa3\x25\x4e\x70\x4c\x21\xb7\xad\x30\xc5\xde\xe0\x17\xea\x25\x33\xfc\xd9\x42\x51\xe5\x5a\xe7\x5a\x8c\xc6\xdb\x66\x74\xb3\x9c\x88\xca\x42\x00\x60\x43\xd6\xbd\x9b\x00\xec\xf6\x4c\xea\xfe\xeb\x40\x2b\x1f\x22\xfd\x89\x1f\x2d\x11\xc5\x15\xc1\xab\xa6\xa2\xd4\xc0\xbd\x21\x81\xa4\x8e\x43\xfd\x1c\x0a\xf9\x1f\x9b\x7b\x7d\x37\xf3\xdc\xd9\xe4\xc0\xa7\x59\x74\x84\x67\xd3\x48\xa8\xb1\x16\xdf\x6a\x4e\xac\xf1\x78\xae\xcc\xcd\x30\x66\xe9\x2d\xca\x45\xda\x7a\x3e\x31\x9f\x37\x71\xeb\x34\x90\x02\x21\x93\xc5\xb6\x52\xf0\x45\x68\x7e\x17\x05\xf2\xe5\x69\x1c\x13\x4b\xe4\x00\x63\x53\xd7\xec\xd0\xe9\x18\xd5\xde\x0f\x3b\x87\x80\x9f\xca\x4a\xcf\xab\x94\xe1\x14\x8f\xf7\xcf\x07\xf7\xcf\xd0\xc7\x45\xdd\x2b\xe0\x1a\x24\xa5\xe0\x69\x28\x06\x98\xbc\x3f\x54\x00\xa6\xdc\xd0\x8e\x44\x59\x5c\x03\x88\xe4\x48\x33\x76\x8f\xc4\x91\x04\xee\x11\x5b\xdc\xb0\x2b\xfb\xda\x17\x9d\x16\x4c\xe9\x69\x93\x66\x29\xf2\x33\x56\x01\xb5\x6f\xe8\xf7\x85\xcc\xa3\x80\x5f\x04\x03\x87\x2c\x62\xf7\x3c\x3c\xe8\x05\x63\xd0\x70\xe9\x76\xd8\xec\xc5\x11\x24\xe2\xca\xce\x7e\xe1\x86\x99\x04\x7c\xb0\xf8\xfb\x8d\x9c\x59\xb8\xa6\x0d\x12\xc0\x8a\x09\xfc\xe5\x8f\xd9\x2c\xd3\x6d\xb6\xa8\xe8\x9d\x11\x8c\xf8\x8a\x92\xdc\x8a\x26\x00\xbd\x95\xf5\xa8\xe8\x5d\xb5\xcd\xbb\x24\x9c\xa8\x12\xca\x20\x9c\x76\x18\x05\x1c\x45\x64\xa3\xa0\xe1\x92\xb7\xe4\x59\x92\x45\x6c\x87\xd1\x74\x12\xc1\x1a\xde\xad\x52\x6a\xb8\xdb\x21\x45\x2f\x74\x71\xd1\x7f\x2e\xbc\x90\x01\x54\x50\xed\xf4\xf0\xa4\x4f\xb2\xf4\x90\x5f\x74\xd7\x02\x75\xcc\xd8\x9b\x93\xa6\x50\x47\x3c\x02\xa7\xda\x0c\xbc\x67\x91\x5c\xeb\x7a\x1e\xa5\x9f\xa8\x88\x44\x72\xdc\x91\x7e\xe9\xd2\x46\x33\x9c\x59\x26\x84\x3e\xcf\x53\xfa\xfd\xc5\x6a\x69\x56\x01\xa2\x76\xc2\x3a\x84\x3e\x4d\x30\xf8\x9c\x97\xc9\xee\xe6\xdf\xc7"}, +{{0xde,0xe6,0x86,0x6c,0x78,0x74,0xc1,0x27,0x02,0x9e,0x96,0xe0,0x25,0xbf,0xfd,0x35,0xfc,0xfd,0xf4,0xdc,0x36,0x96,0x6c,0x15,0xee,0x62,0x93,0x36,0x80,0x13,0xd3,0x79,},{0x08,0xc9,0x4d,0xa3,0x51,0xbb,0x2b,0xee,0x72,0xe6,0xe1,0x96,0xbe,0x74,0x88,0x07,0x58,0x37,0x62,0xc5,0x29,0x6e,0x05,0xb1,0xe5,0x29,0xc4,0x7c,0x6b,0xba,0xce,0xc6,},{0xb7,0x8e,0xbd,0x6d,0x65,0xb1,0x75,0xd4,0xbb,0xd3,0xd9,0xa2,0x08,0x2a,0x0e,0xfe,0x6e,0x99,0x1c,0xb2,0xe4,0x03,0x52,0x1e,0xec,0xe0,0x0f,0x41,0x8f,0x2e,0x95,0x6b,0x66,0x90,0x78,0x80,0x65,0x8b,0x9e,0x8e,0x47,0x69,0x96,0x53,0xd1,0x59,0x13,0x23,0x80,0xd9,0xce,0x11,0x09,0xaf,0x9c,0x27,0x57,0xda,0xf4,0xcd,0xf1,0x8c,0x9c,0x0a,},"\xf1\xaa\x19\x77\xf5\x31\x1b\x53\x8b\x94\x0a\xe4\x42\xa3\xab\xc8\x9a\xac\xcd\xcd\x0a\x79\x38\x0a\x24\x25\x8d\x4a\x9f\x1c\xe6\x38\xfc\x2f\x5b\xa2\xe5\x3f\x8e\x1f\xa6\x17\x6f\x17\x8d\x90\x24\xa7\x78\x94\xc2\x8c\xad\x42\xd6\x29\xc7\x93\xd6\x8a\x02\xbe\x94\x11\xb5\x27\xac\xad\xae\x7e\x5c\x38\x51\xba\xbb\x45\xb5\xfe\xce\x32\x9e\x29\x03\x4c\xd4\x25\x71\x08\x37\x27\xf3\x5a\xec\xad\x7c\x9b\xe5\x95\x4e\xc6\x4e\x8f\x6e\xca\xb7\xcc\x05\x90\xe5\x41\x56\xa4\xe1\xa4\x53\x03\x84\x9f\x78\x97\xe7\x2c\xf2\xfb\xcd\x84\xf5\x6c\x72\xf9\x41\xdb\xb0\xb0\x9a\x32\xe6\x38\x6f\xbe\x18\xa4\x3b\xb9\xbd\x8b\x79\x3e\x4b\x9e\xdd\x53\x21\x03\xea\xb5\x4d\x62\x71\x17\xd2\x81\x39\xb6\x4e\x60\xfb\x0b\x81\xd0\x90\x01\xbb\x24\x04\xd9\x25\xe2\x65\xba\xbd\xc6\x9f\x96\xb1\x35\xe9\xe6\xab\x7f\xeb\xb1\xed\x30\x75\xd6\xaa\x2a\xbd\x2b\xbf\x9b\x65\xfa\x9b\x3b\x71\x91\xef\x37\xb6\x33\x60\x59\x10\xee\x88\xf6\x6e\xad\xa7\x9f\x00\xf5\x36\xd3\x80\xb8\x2f\x2f\x4b\x59\x85\x11\x2d\xe0\x04\xa5\x66\x03\xf4\x43\x6d\x8f\xf3\x00\xf4\x2b\xf5\xac\xdc\x7a\x4b\xf1\xea\x9d\x41\x96\xc4\x80\x49\x5b\xac\xb0\x06\x76\x30\xfc\xc0\x00\xb4\xf2\x79\xdd\x3f\x30\xf3\x53\x27\x60\x92\xd1\x52\xc3\xf4\x3e\xfd\xc0\x41\xde\xaa\x0b\xc5\xaa\xab\xa7\xf8\xbb\xd8\x5e\x69\xc1\x37\x42\xd6\x78\xdb\xb6\x53\x60\xaa\xf7\xb5\x48\xa0\x44\xc0\xec\x60\xa5\x7a\xf6\x50\xbc\x31\x97\x3f\x83\x2f\x96\x12\x65\xbc\x23\x18\xf8\x07\x75\xaf\xd5\x1f\x55\x19\x4c\x42\x42\x3f\x7b\xf4\xe0\x05\x2f\x98\xcb\x20\x69\x13\xff\xea\x48\x86\xec\xd2\x7a\x41\x79\xb1\x37\x73\xf9\x47\x50\x2e\x18\x1b\xf1\xa1\xf2\xc6\x2c\x6f\x08\xc2\x03\x59\xf0\x6d\xf2\xb1\x81\x27\x04\x3b\x10\x70\xd0\x19\x4e\xf5\xe5\xbf\xd3\x7d\x22\x79\x84\xcf\xb1\x09\x89\xf2\x1c\x71\xad\x0f\xe3\xb8\x12\x27\xd3\xa7\x17\x89\x45\x5e\xda\x38\x3c\x22\xf4\xd2\xfc\xc7\x25\x79\xf4\x65\xe0\x66\xf3\xd3\x8b\xef\xc0\x24\xef\xef\x6c\x2e\x32\x96\x49\xce\x43\x4d\x62\x73\x67\xa9\x00\xd0\x7f\xe6\x23\x42\x35\xc8\x46\x56\xea\xc5\xdd\x0d\x78\x8c\xf4\xcb\x31\x87\x18\x24\xd6\x6a\xe4\xbc\x89\xed\xeb\xa1\xb3\x67\x01\x29\x84\x53\xe8\xda\x1e\x69\xcf\xb8\x68\x09\x5c\x3b\xe6\xed\x21\x82\xda\x1c\xff\x49\x05\xaf\xd2\x07\x31\xac\x1e\xd9\x84\x16\x47\x37\x90\x3c\x7d\x8b\xb0\xad\x16\xae\xcf\x2f\xae\x33\x74\x04\xfe\x35\x66\x45\x15\xd9\x3b\x70\x1e\x2f\x87\x86\x64\x45\x4c\x0d\xec\xd1\xc6\x55\x8a\xda\xce\x3c\xdb\x22\x75\x07\xa5\x16\x06\xf0\xa5\x4d\xf8\xdf\xaa\x42\x02\x05\xdd\x57\xc6\x52\x42\xff\x24\xa4\x05\xef\x85\xc9\x2d\x60\x28\x86\x93\x2b\x35\xfa\xbe\x9c\x3b\xce\xbf\xc6\x23\x56\x39\xe8\x73\xfc\x2d\xd0\x84\xc5\x2c\xd6\xa7\x41\x3b\x83\x1d\x1c\xc9\x99\x31\x37\x3a\xab\xd8\x47\x62\x0e\xb6\x9b\xb0\xfa"}, +{{0x52,0x36,0x23,0x55,0x59,0x95,0xba,0xaf,0x2a,0x27,0xad,0xcb,0x1e,0xba,0xfa,0xa8,0x02,0xd2,0x3e,0xf7,0xab,0xfa,0x97,0x75,0xf2,0xc9,0xbf,0xa0,0x7d,0x64,0xe0,0xac,},{0xd3,0x4d,0xea,0xe6,0x52,0x3e,0x61,0x9d,0xd1,0xbf,0xc8,0xf3,0xc4,0xca,0x4b,0x78,0xb3,0x68,0xc0,0xf7,0x20,0x03,0x5e,0x14,0x4c,0x3f,0x2f,0xc1,0x05,0xd4,0xce,0x21,},{0xb1,0x87,0x17,0x29,0xfe,0xc8,0x3a,0xea,0x0a,0xaa,0x47,0x2b,0x70,0x0a,0xcd,0x09,0x48,0x13,0xfb,0x7d,0x57,0xb9,0x09,0xe0,0xea,0xaf,0x21,0xee,0x93,0x18,0x47,0xad,0xde,0xdd,0x2b,0xe8,0x53,0x3d,0x0c,0x30,0x5c,0xb9,0xcf,0xe5,0x08,0x0e,0x76,0xc2,0x80,0x8b,0x6e,0x51,0xc9,0x82,0x62,0x90,0xdd,0xb7,0xb9,0x4b,0x6f,0x7d,0x58,0x0b,},"\x05\x53\xe6\x9e\xf2\x11\x65\x2d\x62\xbf\x28\x1b\xfb\xdd\x37\xbe\x22\x76\x9d\x81\x97\x46\x36\x1c\x7d\x65\xdd\xd0\xfa\xd6\x77\xcc\x04\x38\xb3\x01\xd1\x51\x45\x78\xe0\xda\x58\xe5\x5f\x72\x9f\xa8\xe6\x6d\xde\xb7\xf9\x73\xa8\x18\xd2\x4e\xd8\xfe\x02\x7b\x84\x91\x17\x9d\x07\x77\x3f\xb5\xd2\xbb\x96\xaa\x85\xd6\xb3\x75\x04\x54\xe5\x0d\xe9\x1f\x9b\x88\xae\xe8\xaa\x68\xe6\xbb\x53\xed\xc6\x66\x77\xb4\x1e\x60\x1a\x46\xab\x4b\xb1\xe6\x56\xe7\xfa\x5f\x01\x79\x93\x36\x80\xa6\xec\x95\x04\x27\x5e\x7a\xdf\x7a\x32\x48\xe6\x3a\x0f\xc9\xc1\xea\x5a\xe9\x6c\xd0\xc6\x5a\x89\xa7\x7c\xec\x2b\x1f\xd8\xf4\x53\x7e\x82\xc1\xc4\x88\xa6\x9a\x0e\xf6\x4f\x58\x73\x4d\x9e\x73\x47\x8e\x1d\x1f\x12\x31\x14\xef\x66\x08\x5e\x0b\xa3\x19\xcb\x81\x0b\x66\xaf\x96\xd1\x30\x8b\x1a\x2b\xd9\x2b\xa2\xc2\x65\xaa\x30\x9e\xcd\x55\x57\xd4\x02\xc3\x80\x2c\xae\x8d\x7e\x95\x00\x7f\xe6\x10\xc2\xaa\x75\xfc\x66\x19\x6c\x3f\xad\xfe\x99\x7d\x6d\x59\x98\xe1\x8d\x26\x0e\x9d\xa3\x1d\xa9\x21\x8c\xba\xd1\x03\xcb\xfc\x2c\x75\x47\x76\x5d\x67\xe8\x1f\x24\xac\x83\x02\x2e\xf5\x1c\x6c\xc5\x08\x64\x36\x6a\x35\xf6\xb9\xb9\xaf\x94\xe8\x4c\xaa\x9f\xd3\xd7\x67\xc8\x31\xf0\x96\x7a\x61\x46\x2f\xbc\xfc\xc8\x03\xf1\x2e\x37\x39\x03\x9a\xcd\x5d\xbe\x93\x66\xf0\x5a\x33\xdb\xea\xf3\x60\xe2\xdd\xcb\xe5\xc4\x43\xf8\x0e\xf2\xad\x62\xe0\x3c\x1d\x5b\x70\xcd\xea\xb4\xa7\xdd\x41\x55\x30\x64\xc8\xd1\x52\x70\x9d\xef\xf8\x20\x76\xb9\x07\x11\x92\x37\x6f\x51\xd4\xc2\xc7\x1a\x84\xe8\x9f\x2d\x94\x01\x32\x0c\x2e\x45\x9b\x3e\x24\x3c\xca\x7c\x26\xfd\x09\x8c\x26\x4a\xc8\x8e\xf6\x38\x92\x1d\x98\x0b\x0a\xe9\xe5\x12\xd3\x72\x03\x7d\x81\xad\xc4\x81\x26\xd7\xc9\xe4\xb5\xaf\xa5\x7e\xc2\x65\xd4\x01\xb9\x65\x3e\x92\x8a\xfb\x7d\xff\x9b\x48\xe2\x95\xe4\x70\xd6\xb5\x2e\x88\xb3\x9d\x0a\x40\xcb\x8e\xba\x24\x9f\x8b\x13\xd8\x11\x13\xdb\x1d\x3e\x01\xef\x75\xc7\x22\xf2\x69\x48\x8e\x96\x3c\xc8\x18\x27\x04\xf8\xca\x01\x8e\x73\xdc\x07\x14\xe9\xa9\xfc\x79\xbc\x43\x63\xc2\x8c\xb3\x98\x43\x74\xf7\x3b\x2a\xa8\x78\x6e\x74\xe0\x15\x95\x07\xa2\x98\x83\xfe\x0e\xd1\xc6\x00\xf5\x25\x88\x5f\x2f\x10\xea\x00\x6c\x39\xe5\x9b\x92\x5b\x76\x5b\x1e\xde\x53\x42\x57\xa1\xf4\x0f\x28\x46\x58\x4f\x06\x97\x46\xb5\x2f\x56\x00\x43\x0a\x28\x63\xd7\x93\x60\x95\xfb\xc2\x2a\x6a\xda\x67\x4d\x41\xb3\x74\xe2\xb8\xb9\xa1\x9f\xa7\x12\xb5\x94\x45\x33\xbb\x6d\x6e\xc4\x3b\x89\xd4\x97\x1b\x70\x20\x5a\x6a\xcd\x72\xa8\x99\xda\x12\x61\x82\x04\xdb\x0c\x3e\x82\x67\xb8\x45\x79\x16\x93\xe0\xae\x6a\x35\xf1\x4d\xa1\xf8\xf4\xdd\x17\x4b\xce\x03\x18\xfb\x5a\x00\xf6\x72\xed\xe4\x23\x04\xcf\x04\xa6\x27\x60\x57\x75\x90\xf2\x7e\x2d\xfa\x6e\x5e\x27\x95\xd6\x60\x53\xb3\x0a\xf7\xf1\xbf"}, +{{0x57,0x5f,0x8f,0xb6,0xc7,0x46,0x5e,0x92,0xc2,0x50,0xca,0xee,0xc1,0x78,0x62,0x24,0xbc,0x3e,0xed,0x72,0x9e,0x46,0x39,0x53,0xa3,0x94,0xc9,0x84,0x9c,0xba,0x90,0x8f,},{0x71,0xbf,0xa9,0x8f,0x5b,0xea,0x79,0x0f,0xf1,0x83,0xd9,0x24,0xe6,0x65,0x5c,0xea,0x08,0xd0,0xaa,0xfb,0x61,0x7f,0x46,0xd2,0x3a,0x17,0xa6,0x57,0xf0,0xa9,0xb8,0xb2,},{0x90,0x3b,0x48,0x4c,0xb2,0x4b,0xc5,0x03,0xcd,0xce,0xd8,0x44,0x61,0x40,0x73,0x25,0x6c,0x6d,0x5a,0xa4,0x5f,0x1f,0x9f,0x62,0xc7,0xf2,0x2e,0x56,0x49,0x21,0x2b,0xc1,0xd6,0xef,0x9e,0xaa,0x61,0x7b,0x6b,0x83,0x5a,0x6d,0xe2,0xbe,0xff,0x2f,0xaa,0xc8,0x3d,0x37,0xa4,0xa5,0xfc,0x5c,0xc3,0xb5,0x56,0xf5,0x6e,0xdd,0xe2,0x65,0x1f,0x02,},"\x2c\xc3\x72\xe2\x5e\x53\xa1\x38\x79\x30\x64\x61\x0e\x7e\xf2\x5d\x9d\x74\x22\xe1\x8e\x24\x96\x75\xa7\x2e\x79\x16\x7f\x43\xba\xf4\x52\xcb\xac\xb5\x01\x82\xfa\xf8\x07\x98\xcc\x38\x59\x7a\x44\xb3\x07\xa5\x36\x36\x0b\x0b\xc1\x03\x0f\x83\x97\xb9\x4c\xbf\x14\x73\x53\xdd\x2d\x67\x1c\xb8\xca\xb2\x19\xa2\xd7\xb9\xeb\x82\x8e\x96\x35\xd2\xea\xb6\xeb\x08\x18\x2c\xb0\x35\x57\x78\x3f\xd2\x82\xaa\xf7\xb4\x71\x74\x7c\x84\xac\xf7\x2d\xeb\xe4\x51\x45\x24\xf8\x44\x7b\xaf\xcc\xcc\xec\x0a\x84\x0f\xec\xa9\x75\x5f\xf9\xad\xb6\x03\x01\xc2\xf2\x5d\x4e\x3b\xa6\x21\xdf\x5a\xd7\x21\x00\xc4\x5d\x7a\x4b\x91\x55\x9c\x72\x5a\xb5\x6b\xb2\x98\x30\xe3\x5f\x5a\x6f\xaf\x87\xdb\x23\x00\x1f\x11\xff\xba\x9c\x0c\x15\x44\x03\x02\x06\x58\x27\xa7\xd7\xaa\xae\xab\x7b\x44\x6a\xbc\xe3\x33\xc0\xd3\x0c\x3e\xae\x9c\x9d\xa6\x3e\xb1\xc0\x39\x1d\x42\x69\xb1\x2c\x45\xb6\x60\x29\x06\x11\xac\x29\xc9\x1d\xbd\x80\xdc\x6e\xd3\x02\xa4\xd1\x91\xf2\x92\x39\x22\xf0\x32\xab\x1a\xc1\x0c\xa7\x32\x3b\x52\x41\xc5\x75\x1c\x3c\x00\x4a\xc3\x9e\xb1\x26\x7a\xa1\x00\x17\xed\x2d\xac\x6c\x93\x4a\x25\x0d\xda\x8c\xb0\x6d\x5b\xe9\xf5\x63\xb8\x27\xbf\x3c\x8d\x95\xfd\x7d\x2a\x7e\x7c\xc3\xac\xbe\xe9\x25\x38\xbd\x7d\xdf\xba\x3a\xb2\xdc\x9f\x79\x1f\xac\x76\xcd\xf9\xcd\x6a\x69\x23\x53\x4c\xf3\xe0\x67\x10\x8f\x6a\xa0\x3e\x32\x0d\x95\x40\x85\xc2\x18\x03\x8a\x70\xcc\x76\x8b\x97\x2e\x49\x95\x2b\x9f\xe1\x71\xee\x1b\xe2\xa5\x2c\xd4\x69\xb8\xd3\x6b\x84\xee\x90\x2c\xd9\x41\x0d\xb2\x77\x71\x92\xe9\x00\x70\xd2\xe7\xc5\x6c\xb6\xa4\x5f\x0a\x83\x9c\x78\xc2\x19\x20\x3b\x6f\x1b\x33\xcb\x45\x04\xc6\xa7\x99\x64\x27\x74\x1e\x68\x74\xcf\x45\xc5\xfa\x5a\x38\x76\x5a\x1e\xbf\x17\x96\xce\x16\xe6\x3e\xe5\x09\x61\x2c\x40\xf0\x88\xcb\xce\xff\xa3\xaf\xfb\xc1\x3b\x75\xa1\xb9\xc0\x2c\x61\xa1\x80\xa7\xe8\x3b\x17\x88\x4f\xe0\xec\x0f\x2f\xe5\x7c\x47\xe7\x3a\x22\xf7\x53\xea\xf5\x0f\xca\x65\x5e\xbb\x19\x89\x6b\x82\x7a\x34\x74\x91\x1c\x67\x85\x3c\x58\xb4\xa7\x8f\xd0\x85\xa2\x32\x39\xb9\x73\x7e\xf8\xa7\xba\xff\x11\xdd\xce\x5f\x2c\xae\x05\x43\xf8\xb4\x5d\x14\x4a\xe6\x91\x8b\x9a\x75\x29\x3e\xc7\x8e\xa6\x18\xcd\x2c\xd0\x8c\x97\x13\x01\xcd\xfa\x0a\x92\x75\xc1\xbf\x44\x1d\x4c\x1f\x87\x8a\x2e\x73\x3c\xe0\xa3\x3b\x6e\xcd\xac\xbb\xf0\xbd\xb5\xc3\x64\x3f\xa4\x5a\x01\x39\x79\xcd\x01\x39\x69\x62\x89\x74\x21\x12\x9a\x88\x75\x7c\x0d\x88\xb5\xac\x7e\x44\xfd\xbd\x93\x8b\xa4\xbc\x37\xde\x49\x29\xd5\x37\x51\xfb\xb4\x3d\x4e\x09\xa8\x0e\x73\x52\x44\xac\xad\xa8\xe6\x74\x9f\x77\x78\x7f\x33\x76\x3c\x74\x72\xdf\x52\x93\x45\x91\x59\x1f\xb2\x26\xc5\x03\xc8\xbe\x61\xa9\x20\xa7\xd3\x7e\xb1\x68\x6b\x62\x21\x69\x57\x84\x4c\x43\xc4\x84\xe5\x87\x45\x77\x55\x53"}, +{{0x03,0x74,0x9c,0xa2,0x04,0x58,0xa3,0x5a,0x37,0xa8,0xd7,0xa2,0x6f,0x95,0x9f,0x0d,0x59,0xf6,0xdc,0x99,0x73,0xfa,0x36,0x3c,0x1f,0xf8,0xca,0x4e,0x63,0x8c,0x2c,0xd3,},{0xea,0xeb,0x94,0xf4,0x06,0xbd,0xe6,0xa7,0xcf,0x8b,0xde,0x2a,0xdf,0x30,0x81,0xf8,0x37,0x5b,0x87,0xd9,0x33,0x5d,0x49,0x6c,0x71,0xd0,0x42,0xcd,0x2e,0xaa,0x16,0x6c,},{0x78,0xa3,0x87,0x7e,0x02,0xbd,0xfd,0x01,0x5e,0x7f,0x86,0xa3,0x27,0xa4,0x8c,0xc3,0xa5,0x23,0x0b,0xbd,0xb1,0x24,0x3f,0x1a,0x8c,0xf2,0x27,0xf7,0x8a,0xb5,0xe7,0x68,0x0d,0xe3,0x01,0xa9,0x15,0xdc,0x11,0xb3,0x36,0xfb,0x5f,0x65,0x66,0x84,0x8b,0x42,0x50,0x0a,0xdb,0x5d,0x67,0x39,0x69,0x12,0x2b,0xa8,0xf0,0x05,0x3c,0xd3,0x06,0x0b,},"\xee\xf5\xce\xeb\xd0\x44\x5e\x9c\x91\x81\xaf\xf9\xc6\xf2\x66\x01\x28\xfc\xfb\x63\x69\x1a\x42\xcf\xa4\x43\xd6\xa6\x49\xef\xc5\xfa\xd8\xc2\x08\x03\x76\x3e\xe9\x7d\x1d\xba\x08\xe6\x3e\x08\xa2\x61\x6d\xa0\x50\x77\x48\x9f\x2f\xa2\xc5\x6b\x75\x34\xf9\x40\x26\x19\x25\x1f\xdf\x9c\x32\x0d\xe7\xaf\x10\x9e\x2f\xd8\xb2\x56\x5c\xe8\xa7\x52\x4c\x94\x05\xec\x0f\x8f\xca\xa7\x14\x9a\x6d\x21\x0e\xfd\xe8\x3b\x11\x1c\xf8\x2d\xc0\x83\x5c\xf9\x4f\x20\xcd\xb0\x21\xb7\x3b\xd2\x62\x66\x65\x55\xe6\xd6\x27\x07\xb4\x6e\xe4\x2f\xa9\x00\xb4\xf4\xf7\x05\xde\x33\xd3\xdb\xdc\x68\xa8\x8d\x1a\x4d\x0a\xe9\x33\x56\x6d\xb6\xc6\x23\x7e\xc8\xab\xe1\x02\x4d\xac\x4b\x7f\x46\xd4\x07\xbe\x16\x59\x4d\x90\x46\xc7\x31\x2d\xda\x66\x14\xd9\xbc\xdb\x01\xfb\x83\x24\xfc\x62\xb8\xee\xaf\x0a\xbc\x23\xcd\x57\x0e\x30\x4f\xca\x08\xe8\x8c\x73\x5e\x5d\x31\x59\x24\x09\xce\xb5\x83\x86\x2e\x6b\x0a\x76\x77\x29\xf7\x55\x6f\xa2\xc0\x53\x64\x4d\x36\xc8\x33\x7c\x02\x74\xe7\x49\x20\x29\x82\xfb\x4a\x17\x1a\xca\xc1\x96\xc0\x2b\x7f\x16\xa8\xda\x49\x07\x1c\x8a\xb8\x07\x6d\xd5\xd3\xab\xad\xfe\x3a\xf8\x2c\xa8\x5d\xa0\x2d\xcc\x1c\x4a\x6f\x2e\x19\x30\xbe\xe2\x00\x9e\xee\x0d\x97\x1e\x40\xdd\x12\x17\x5c\x8d\x00\x69\x4f\x03\x25\xa3\xb3\x13\x3c\x0d\x0b\xd3\x82\xa5\x19\x4f\xb2\x14\x22\xce\x67\xc7\x8a\x5a\x6e\x15\x37\xe3\xb9\x7d\x5e\x20\x4e\x5d\x19\x56\x96\x39\x0f\x77\xd1\x90\x24\xc1\xbf\x6b\x51\x25\xa0\xcd\xbf\x7b\x98\x80\x03\x61\x81\xc9\x8e\x1a\xc2\xe5\x16\x5b\xd4\x96\xcf\x99\x74\x51\xa1\xc1\x21\x02\xe6\x69\x46\xb1\x67\x6a\xbd\x4c\xbd\xd2\xc1\x16\x73\xf4\xf2\xcd\x5f\x3c\x9a\x43\x4d\x74\x7f\xa0\x5b\x40\xfb\xc7\x22\x68\xb4\xeb\x28\x42\xe4\x74\x1f\x51\xb7\x70\x9b\x6a\xcc\xc4\x7f\xca\xf7\x0d\x9c\x1c\x4c\x35\x86\x71\x19\xd8\x1c\xb3\xff\x1f\x16\x08\x11\x33\xf1\x65\x9a\xed\x85\xf6\x3b\xc9\x01\x98\x9e\x26\x17\xfc\xce\x15\x3c\x29\x78\xd7\x08\xfd\x02\x44\x9a\xe4\xd5\x38\xd1\x22\xdd\xb8\x52\x7c\x0a\x76\xa1\x02\xee\xff\x6e\xdb\x65\xdb\xa2\x98\xd3\xc2\x17\xf6\x55\x18\x14\xed\xde\xec\xe1\xae\xf5\xf3\x71\xa5\x4f\x12\xbf\xfd\x6b\x49\x61\x81\x9a\x0f\x24\x4f\xf0\xd7\xd8\x69\x4c\x14\x42\x2d\xe9\x82\x2c\x13\x17\x9e\x4e\xeb\x81\x59\x50\x79\xb9\xdd\x2a\xd1\xe7\xc3\x9b\xd3\x03\xcc\x44\xae\x3f\x36\x34\x88\x15\x77\xa2\x66\xfd\x6b\xb7\x91\x78\x12\xb9\x99\xdc\x80\x9d\xc0\x9c\x3d\x70\x19\xda\xcd\x28\xe4\x30\x13\xa2\xf9\xe4\xf9\x4b\xb0\xbf\x71\x24\xef\x09\x17\x83\xf7\x96\x39\x7f\x64\x63\xbf\x1e\xfb\x39\xcd\x46\xf3\x79\x0a\x1d\x9b\x6a\x7c\x30\xf1\x49\xb5\xe6\x6c\x29\x37\xe3\x9c\xb9\x74\x4d\xdc\x66\xab\x56\x1b\xad\x4e\x6f\xa8\x53\x4d\x69\x88\x38\x22\x64\x3d\x63\xd8\xbd\x7b\x18\x16\x21\xa2\x67\xe9\x55\xe7\x58\xd1\x79\x2b\x44"}, +{{0x53,0xcb,0xd6,0xf6,0x8c,0xee,0x27,0xb9,0xf7,0xbc,0x05,0x9b,0x80,0x3b,0x44,0x79,0x49,0xbb,0xc9,0xc5,0xd5,0xa3,0x86,0x52,0xd7,0x78,0x9c,0xa1,0x54,0x20,0xde,0xa1,},{0x61,0x16,0x99,0x0b,0x53,0x31,0xe2,0x16,0x5f,0x82,0x74,0x3f,0x01,0xd8,0xe7,0xbd,0x5d,0x70,0x88,0xb3,0x01,0x59,0x83,0x3f,0xa7,0xb9,0x39,0xcf,0xb1,0xcc,0x04,0xd7,},{0xd8,0x25,0x04,0x40,0x5f,0xf1,0x6b,0xa6,0x44,0x3d,0xc4,0x82,0x36,0x72,0x63,0xa8,0xe2,0x00,0x36,0x0a,0xca,0xaa,0x83,0xfc,0x4e,0x4b,0x72,0xbd,0x24,0x9f,0x16,0x10,0x3e,0xc7,0xe5,0xa7,0xe9,0xca,0x17,0x19,0x8f,0x88,0x8e,0xac,0xa1,0x6b,0x74,0x0c,0xc3,0xf5,0xc3,0xb7,0xb6,0x17,0xa3,0x4b,0x94,0x91,0xc3,0xed,0x76,0xaa,0xb3,0x0d,},"\x30\x6f\x8e\x1d\xf0\xa4\xca\x78\xbd\x77\xe8\xe1\x19\x1c\x94\xde\xaa\x82\x64\x83\x55\xc2\xae\xcb\x7e\x82\xfc\x56\xd6\x4c\x50\x46\x19\x24\x7e\x7c\xf8\x94\x33\x28\xd1\x1f\x3d\xb4\xb1\xdc\x14\x8e\x8e\xf6\xf6\xc3\xbc\x35\x59\x69\x66\x2a\x28\x1a\x65\x57\x63\x91\x24\x2b\x7b\xd5\xa6\x2f\x8f\xa7\xac\xb6\x04\xe3\xa3\x44\xae\x1a\x9d\x73\x2a\x25\x43\x15\xf3\x1a\x04\x64\xc1\xe6\x58\x74\x62\xd2\x92\x12\xc4\x0e\x5e\xcf\x06\x1e\x26\x9a\xa0\xb9\x03\x90\xba\x41\x04\x07\x21\x68\x4b\xf2\xaa\x95\x82\xd8\x30\x66\x22\x1d\xb6\x0d\x0f\x7a\xe2\xf1\x49\xa3\x6e\x16\x95\x27\x04\xfb\x1f\x3a\x98\x2e\xac\x6b\x45\x83\x66\x5c\x63\xe5\xa8\x99\x6f\x24\xa5\x66\xdd\x50\x6a\x33\xd4\xec\x8a\x02\xb2\xbd\x34\xb7\x14\xc7\x45\x00\x0c\x01\x28\xa3\xc8\x9d\x94\x25\x06\xd1\x2f\x4b\xeb\x90\x0e\x29\x03\xcd\xb3\x4b\x35\xca\x9b\x6d\x3a\xd9\xb3\x50\xac\x99\xf4\x1d\xb3\xac\xfe\x7f\xe5\x5a\x28\xc0\xf0\x06\xb8\x44\xc9\xdc\x48\x53\xfd\x98\x53\x5a\xda\x79\x41\x6d\xca\x5f\xee\x58\x03\xa2\xd9\xf5\xd6\x8e\x6b\x80\x53\x9f\xf3\x02\xe9\x73\xf2\x4e\x9b\xc8\x8b\x7c\x41\x94\x11\x7d\xdb\x9f\x93\x2b\x32\xd5\xec\x74\x86\x8a\x13\x63\x1e\xce\x68\x81\x4b\x93\x14\x21\xdc\x89\x02\x49\x57\x03\x41\xf4\xb4\x23\xe8\x6e\x8e\xe0\x81\xb2\x27\x02\xf6\x49\xa6\xc7\xa0\xb7\xbd\xf5\xfb\x75\x62\x02\xbd\x10\xb0\xbb\x22\x15\xc7\xd6\x59\x7e\xff\xd8\x52\xf0\xb8\x9a\xbe\xc1\x5e\xa8\x22\x57\x68\x9d\xf8\x1e\x33\x82\x54\xf9\x3e\x81\xcb\xf0\x61\x72\x9d\x48\x3e\xb5\xcf\x64\x98\x05\xd7\x8e\xd8\x92\xdd\x0b\xd2\x48\xca\x1e\x25\x2b\xea\x51\x84\x7e\x1e\x82\xd3\x9a\xf5\x80\x50\xdc\x4a\xfb\xf9\x11\x5a\x3a\x60\x49\x3e\x8c\x0b\xa2\xe8\x6e\x08\x98\xcd\x0d\x43\x08\x91\xb9\xeb\x0a\x40\xf8\x74\x31\xe2\x5f\x41\x53\x8a\x03\x0f\x88\x4f\xab\x36\xad\x11\x16\x5d\x26\x7e\x8d\xd9\x4d\xcb\x05\xb9\x3a\x5a\xe7\x79\x69\x43\x0e\x18\x10\x13\x4e\x15\x72\x51\xb9\x82\xdf\x34\x3d\xff\xae\x61\x23\xa9\x9a\xa0\x56\x2d\x5d\xf7\x24\x08\xf1\xa6\xe2\x9c\x40\x59\xa5\xa8\xaa\xa4\xe6\x21\x52\x8f\xc6\x3a\x9c\xbe\x1f\x4c\x0f\xef\x25\xfe\x3f\x8e\x18\x15\x77\x74\x09\x7a\x9d\x91\x02\x0a\x90\x06\xb6\xc8\x60\xec\x1e\xe1\x0d\x52\x1d\x20\x3a\x1f\x8b\xb8\x25\x61\x29\x6f\xaa\xd4\xb2\x20\x3d\xa5\x3b\x20\x7a\x45\x9b\x29\xc1\x8b\xc0\x64\x93\x32\xb1\x80\x7c\x13\xca\x61\xac\xfa\xf9\x07\x79\xfe\xbb\xc7\xf3\x24\x21\x64\x79\x7e\x6f\x57\x2c\xb1\x5a\x9b\xe5\x88\x73\x43\x45\x5e\x26\xb9\x10\xc8\xbe\xfe\xe4\x2a\xeb\x04\x7f\x9a\xbe\x6b\x37\x50\xdb\xd7\xde\x99\x20\x2a\x0b\xb5\x76\xce\x14\x89\xe6\x1c\x1f\x5d\x27\xc6\x79\x2e\x63\x21\x8e\xdb\xfd\xb9\xb3\xdc\x51\x5b\x42\x54\xd8\x2c\x85\x9e\x52\xce\x6b\xd7\xad\x29\x6d\xd0\xe3\x70\x9d\x4c\x46\x63\x62\xf9\x02\x65\xe9\x9d\xa7\xd0\xb7\x01"}, +{{0x8b,0x65,0x74,0xf6,0xd7,0x39,0x69,0x81,0xe2,0x23,0xa4,0x83,0x7b,0xc3,0x39,0xc3,0xfd,0x65,0x94,0x19,0x84,0x5a,0x21,0x21,0xbf,0x85,0xbe,0x2e,0x69,0x5d,0x86,0x0d,},{0xe3,0x81,0x1a,0xca,0x70,0x63,0x4f,0x5a,0x9c,0xe4,0xb5,0x92,0xa1,0x7b,0xb5,0xcf,0xda,0x53,0x44,0x24,0x22,0xe2,0x03,0xcd,0xa9,0x50,0x4c,0x9d,0x65,0xb2,0x63,0xe8,},{0x2f,0xd0,0x90,0x54,0x75,0xa2,0xce,0xc3,0xe7,0x6f,0x99,0x09,0xb8,0xaf,0xd8,0x3b,0xeb,0x8d,0xae,0xfa,0x77,0xaf,0xcd,0xa3,0x4c,0xb4,0xf1,0x17,0x28,0xef,0x15,0xfc,0x9c,0x1d,0x7f,0x6f,0x6a,0xff,0xfc,0x28,0xf3,0x87,0x4f,0x91,0x3e,0x17,0x98,0x0f,0x0e,0x8e,0x3d,0x5a,0xd2,0x39,0x51,0xdf,0x2b,0x32,0xef,0xaf,0x62,0x19,0xce,0x0d,},"\xa4\x8a\xac\xc0\x49\x5f\xa0\xf1\x25\x9b\x27\x86\x5d\x3d\x75\xdc\x52\xc2\xc8\x28\xea\x8c\x4c\x2a\xd7\x85\x77\x07\x2f\xef\x72\x70\xf6\xa4\xd5\x82\xbb\x7b\x96\x2f\x4c\x3f\xd1\x49\xa6\x0a\x06\xbc\x8e\xfd\x29\x70\xef\x03\x14\x8d\xdf\x61\x98\xb9\xb6\x95\xa6\x9f\xad\xb5\x34\x09\x51\xcb\x75\x39\x8a\xc5\x1a\x4f\xd5\x54\x30\x37\x8c\xd5\xda\x88\x85\x21\x0b\xfd\x21\x46\xf9\x5c\x62\x76\x32\xfe\x8b\xe0\x6d\xe0\x1a\x7c\x27\xb8\x9d\xee\xfd\x67\xef\xc6\x9c\x9b\x5c\x62\xb3\x81\x08\xf7\x76\x22\x91\x43\xda\xe6\x60\xc1\x0c\xbe\xa3\xcd\x4f\x7e\xe5\x3d\xc3\x69\x2e\xd0\x11\x77\xe4\xa6\xf7\xe4\x24\xb5\x66\x6f\x7f\x49\x5f\x2a\x65\x60\x2c\x7d\x08\xc5\xd5\x72\x23\x4a\x56\x7c\xb6\xc3\x8a\xfd\x79\xca\xb5\xc4\x03\x6d\x62\x63\x7a\xef\xab\x55\x88\x76\x9a\x44\x8a\xb4\xc6\x5e\x24\x55\x4b\xd4\x15\x80\x50\xe0\x9e\xb5\x8f\x99\xab\x40\x77\x7b\x03\x56\x70\x9b\x7c\x02\x5a\xe5\xae\x54\x22\xac\xf8\x74\x44\x93\x1a\xe4\xd9\xa8\xb3\xd9\x44\x76\x88\x11\x28\xba\x1e\xb7\x32\x8f\xaf\xc7\x5f\x6b\x9d\xac\xc9\x6d\x3b\x64\x87\xdd\xef\x7c\x59\x26\x2d\xca\xda\x42\x6a\xac\xb1\x39\x22\x93\x54\x11\x56\x62\x35\xe0\x58\x37\x26\x22\xd8\x85\xbd\x0c\xc0\x49\x58\xdc\xfb\x17\xe0\x8f\xcd\x7f\x14\x7e\x20\x15\x6c\x8e\x26\xaf\x85\x53\x0f\x55\x11\xa6\x8d\xb4\x3d\xaf\xc4\xe6\xa2\x3f\x66\x7d\xf3\x74\x3e\xed\xd7\x1a\x3f\x07\xf7\x6f\x94\xd1\x68\x8a\xfc\x84\x63\xbf\xa5\xa4\x39\xae\x31\x14\x69\x94\x8e\x74\x47\x06\x4f\x0b\x05\x06\xf3\x67\x19\xc1\x34\x66\xa1\xb9\x87\x76\xd9\x67\xec\x58\x20\x8b\xa6\x74\x03\x73\x03\xdf\xc6\x19\x0d\xa7\x83\xff\x27\x30\x3b\x86\xb5\xfc\x32\x11\xf0\x1c\x91\x5e\x83\xa6\xad\x01\x21\x44\x79\x11\xcb\xe1\xcf\x69\x6f\x61\x8f\x60\x23\x66\x43\xf2\xe9\x4e\x15\x5d\xb6\x57\x18\x29\x44\xc1\xa4\x3b\xdc\x7b\xd5\xea\xf3\x48\x1f\xe1\x28\x40\x92\xcb\x37\x89\xa8\x92\xbd\x79\xa1\x11\xfd\x41\x01\x43\xcf\x91\xae\x33\x28\x60\xb1\xd2\x9a\xa0\x41\xd1\x77\xb5\x0d\x6c\xc2\xb9\x66\x0d\x32\x8c\x0f\x23\x0a\x35\x15\xe6\xa0\xd6\x88\x70\x9c\x0c\xd3\x47\xad\x2f\xf3\x2d\x61\xd1\xe1\xe9\xba\x76\xf8\x1e\x87\x3a\x6c\x42\x0f\x17\x07\xf3\x84\x1d\xb5\x19\x6c\xb5\x3f\x50\x6f\x00\x06\x35\x2c\x7c\x44\xc0\x80\xf3\x09\x68\x01\xa5\x7a\x49\xcf\xe8\x42\x05\xbd\xd7\xa9\x80\x1f\x84\x3c\xf2\x6b\x95\x58\xa2\xdb\x78\x8e\xf1\xb2\x37\x91\x5d\x58\x7b\x9b\xa9\x77\x98\x90\xf6\x1f\xdc\x91\xe0\x3e\x4f\x4c\xdb\xef\xe4\x17\xcc\x22\xd5\x22\xa8\x6a\xdd\xdb\x53\xf3\x74\x74\x50\xab\x62\xb5\x76\x56\x5d\xb3\x2e\x0c\xd4\x42\x76\x54\x7d\x9a\x16\x65\x3c\x27\x96\x59\xdd\x4d\x17\xec\x04\x82\x7c\x53\x3e\x33\x39\x0f\xe9\x4f\x79\x35\x09\x25\x6d\xb6\x75\x31\x73\x6a\xb3\xfc\xee\x2a\x30\x1a\xc3\xf0\xa2\x4d\x3b\x10\x8d\x7e\x75\xc3\x2a\x5a\xba\x36\xd6"}, +{{0x29,0xb2,0x88,0x1b,0x8c,0xaa,0xdb,0x33,0x6e,0x78,0x80,0xc5,0x10,0xb8,0x00,0x85,0xf4,0xb1,0x22,0x18,0x60,0xb3,0x01,0xeb,0x45,0x25,0x65,0x07,0x52,0xa6,0xd2,0x89,},{0x0c,0x5c,0x44,0xed,0x29,0xd2,0x1b,0xca,0xde,0xe2,0x1c,0xbd,0xe6,0x1a,0x9c,0xdb,0x6d,0x59,0x36,0x00,0x9b,0xa2,0xf5,0xb2,0xe7,0x77,0xc9,0x24,0xdd,0xfb,0x67,0x51,},{0x99,0xe9,0x96,0xe8,0x5a,0x49,0x4f,0x19,0x80,0xcb,0x07,0xde,0x9c,0xa6,0x16,0x5e,0x7d,0xe1,0x04,0xd3,0x9f,0xe3,0xc3,0x22,0x67,0x35,0xc5,0xda,0xa5,0x69,0x51,0x6f,0xca,0xf1,0xb6,0xe4,0xdf,0xad,0x0d,0x38,0x9b,0x6d,0xb0,0xec,0x8a,0x8f,0x20,0xdd,0x2c,0x60,0x26,0x56,0xb5,0xe7,0x61,0xc8,0xf3,0xa6,0x55,0x83,0x82,0x15,0x19,0x09,},"\x19\x74\xa2\xe2\xb4\x79\x49\xf4\x67\xa9\x31\xd1\xd9\xdd\x5c\xe1\x16\xe9\xf5\x03\x0a\xd0\x9a\x8c\xc7\x28\xd1\xae\xb1\x48\xbb\xf9\xac\xf5\x98\x74\xda\x80\xe7\x08\xd5\x3c\x66\x8f\x2f\x14\xd7\x52\x20\x71\xe9\x09\x80\x84\x27\xb2\xab\x5a\x05\xf8\xb9\x4f\x21\x50\x5c\xd2\x6a\xbc\x53\x45\x89\x78\xc7\x84\xd4\x79\xea\x6d\xab\x10\x5c\x4f\x79\x84\xa0\xfb\x97\x90\xe5\x06\x24\xf4\x73\x4b\x55\x19\x05\xaa\x5f\xfa\x60\x18\x4c\xd2\x01\xcf\x2b\x26\xc9\x79\x5d\xa6\xe7\xe0\x8d\x6a\x0b\xc7\x72\x24\x00\xfe\xf9\x4f\xc2\x10\x38\xbe\x89\xd3\x4b\xcd\x14\xc4\x27\xb8\x5b\x68\x66\x73\x71\x96\x15\x2d\x4e\xeb\x66\xd0\x5b\x24\x5a\xe8\x4b\xdc\x77\x87\xc1\x4a\x8b\xec\x2e\xea\x53\x60\xf0\x42\x43\x3d\x70\x79\x44\x67\xd4\x73\x93\xb9\x37\x57\xf3\x31\xcf\x2b\x53\xc6\x60\xd7\x1c\x29\x58\x2a\xee\xa7\x9b\x12\x52\x7a\x28\xb0\xc5\xe1\x10\xdf\x6f\x85\x4e\xea\xd9\xa2\xb0\x0d\x42\x54\x2c\xa8\x27\x6b\xb8\xbf\x98\x8b\xaa\xb8\x56\x59\x96\xfe\xe5\x0c\xf3\x1b\x24\x59\xc4\xc5\x0a\xb4\x75\x26\x5e\x83\xe2\x28\x5d\x43\xfe\x1f\x75\x2a\x55\xb2\xdb\xc4\x9f\xca\x04\xa8\x10\xf0\x41\x3b\xf6\xbd\x81\xb7\x9a\xc6\x4e\xe1\xf8\x9b\x97\xbd\x7d\x26\xd6\x25\x12\x27\x3e\x24\xa6\xba\xb2\xd5\xf7\xd2\x22\x6b\xaa\xab\x7b\x11\x12\x09\xbb\x03\x73\x3d\x8a\x60\xdf\xa3\x1a\x51\x6f\x4a\x8c\x76\x99\xd8\x28\x5c\x10\x65\x15\x9a\x6c\x73\x31\xc1\xde\xfb\x47\xa3\x0e\xf5\x85\x8c\x50\xb7\xd0\x45\x12\x4a\x09\x81\x3d\x1c\xfd\xa5\xc9\xcc\x3b\xb5\xbf\xae\x73\xc9\x84\x19\x7f\x8f\x85\x7f\x18\x6c\x41\xab\x87\xfb\x79\x62\xb6\x31\xf4\xd0\x07\xcf\xbe\xe2\x21\xfc\x65\x72\x78\x4a\x55\x11\x94\xc1\x97\x77\xb0\x8e\x6b\x59\x67\x57\xe7\xcb\xa7\xa0\xe2\x7f\xe4\x53\xf9\x0d\xc5\x9c\xc0\x8c\x64\x72\x43\x1c\x02\x0e\x8d\xd0\x91\x75\x90\xe7\x9c\x1f\x20\x73\x83\xaf\xb3\x90\x76\xad\x24\xda\x8e\xe5\x24\x86\x73\x94\x53\xa2\x59\x0e\x51\xbf\xc8\x9b\x13\xc2\x03\x3c\xfa\x5f\x89\x03\xcb\xe9\x96\x1a\x85\x98\xba\x55\x62\x32\x86\x9d\xfa\xb4\xd5\x6e\xdf\x4f\x05\xe8\xb7\x7d\x05\x87\x18\x95\xe6\x3b\x53\x51\xf7\x6c\xb2\xd2\xc8\x38\x5c\x10\x9d\x73\x06\x19\x2a\x25\x44\x6e\x4d\x62\xdc\x7d\x62\x4f\x0c\x66\x73\x98\x6b\xe0\x62\x8b\x2c\x2d\x73\xeb\x94\x1d\x35\xa3\x43\x30\x90\xf5\x9b\x28\xa5\x97\x9d\x56\xdb\xc9\xfd\x69\x73\xf6\x36\x47\x64\x2c\xd9\x03\xb0\xcf\x7a\x6a\xcd\x33\x0d\x87\xe2\x29\x27\x10\xde\x99\xe0\xc1\x79\xca\x78\x92\x9c\xca\xec\xfa\xed\xbf\x27\x42\x41\x4f\x17\x6b\x60\x90\xc0\xd5\x9a\x9d\xb7\x81\xc9\x96\x7e\x28\xfa\x4e\x77\xd2\xa0\x82\xe4\x2f\x52\x16\x91\x67\xe9\x2d\x4f\xdd\x82\xe2\xcc\x05\xdd\x91\x84\xc7\xdf\xee\x49\x0a\x23\x7f\xda\xd4\xdf\xeb\xc0\x18\x68\xe0\xa4\x35\x3a\x29\x54\xd0\x90\x92\x84\x61\x82\x1a\x7a\x84\x8d\x1b\x60\x81\x7f\xc3\xbd\xef\xa1"}, +{{0x42,0xaf,0xe8,0x9d,0xac,0x83,0xe7,0xd3,0x89,0x96,0xc0,0xdb,0xce,0x0c,0x98,0x74,0xc0,0x09,0x27,0xba,0xbd,0x77,0xca,0x8c,0xea,0xc3,0x4e,0x56,0x44,0x74,0x28,0x2b,},{0xa4,0xc5,0xf5,0xe3,0x80,0x3f,0x0a,0x03,0xd5,0xc1,0xc9,0x06,0xca,0xec,0x9c,0xc6,0xd2,0x85,0x14,0x07,0xf1,0xca,0x29,0xf7,0x2a,0x45,0xf2,0x33,0xe6,0x65,0x62,0x44,},{0x4f,0xba,0x2d,0x6c,0xc1,0xb7,0x19,0x3d,0x35,0x62,0xf8,0xc8,0xbf,0xe6,0x90,0x5c,0x82,0x9d,0xb2,0x65,0xa5,0x42,0x7c,0x5c,0x26,0x57,0x14,0x78,0x5b,0x83,0xf6,0x95,0x14,0xc5,0xe3,0x0e,0x28,0xb5,0x66,0x84,0xc8,0x2d,0xae,0x26,0x37,0x58,0x1b,0xf3,0xf4,0xef,0x27,0x14,0x20,0xbc,0x7e,0x60,0x10,0x61,0x3a,0x38,0xfa,0x10,0x1a,0x0d,},"\xe7\x10\xa1\x63\xad\x28\x85\xae\xb7\x65\x8e\xb3\x74\xf1\x18\xb7\x68\x42\xec\x36\xef\x3b\x01\x0c\x3c\x6b\x95\x59\xe8\xb1\x60\xc2\x62\x8d\xed\x0b\x85\x11\xeb\x49\x07\x18\x0d\xa4\xb6\x21\xe9\xaa\x4a\x32\x22\x88\x88\x8a\x1c\x09\x13\x0f\x69\xf8\x90\x59\x7a\x92\x93\xe7\x4f\x92\x89\xbd\xaa\x5c\x91\xb6\xfd\x24\xaa\x04\x4a\xb9\xfc\xb3\x40\x2f\x7a\xbc\x48\xd2\xab\x7b\x38\x80\xa0\x48\xda\xa4\x48\x64\x5a\xd2\xec\xb5\x5b\x3c\xae\xe2\xd6\x8a\x8b\xed\xb5\xd1\x86\x5d\x5e\x21\x1d\xe3\x9b\x0e\xaf\x22\xe5\xda\xf1\x0f\x71\x68\x20\x3a\xa1\x5b\x85\xaa\x47\xbb\xd3\xcc\x41\x69\xcb\xc1\xfe\x80\xb4\x70\x0b\x62\x58\x71\xed\xab\xcd\x4f\xe7\x4a\x3e\x96\x55\x69\xce\x24\x5c\xfc\xde\x42\x09\xcc\x8a\xbc\xd6\x79\x7d\x44\x18\x5b\x4f\x96\xc0\x18\x1b\xbd\x27\x00\x87\x83\xe9\x35\x8a\x53\x94\xfe\x3a\x34\xa0\x68\x71\xd3\x79\xda\x35\xb2\x0b\xb5\x7e\xef\x9e\x55\x24\xee\x79\x12\xa6\xf4\x1b\x4a\x1f\x68\x4c\x39\x19\xcf\xcd\xc0\x0f\x45\x80\xba\xf9\xe0\x9d\x31\x6c\xef\xa0\xf4\x65\xdc\xa5\xd8\xee\xc5\x14\xe9\x5e\x5a\x57\xbb\xcd\x27\xe4\x1f\x81\x19\xb2\x64\xae\x14\xa3\x19\xd8\xc3\x85\x9b\xab\xf1\xf4\xa6\xb6\xb7\x7e\x44\x2c\x86\x1d\x6e\xe2\x8a\xd1\x2b\x82\x36\x2e\x90\xdb\x0c\x36\x72\xb0\xe0\xd9\xff\x58\x14\x6f\xd1\x59\xaa\x8f\xa9\x9d\xc7\x55\xfc\x85\xb9\x0c\xf9\x41\x92\x79\xc0\x62\x4b\x93\xe7\x5e\xda\x0e\xf7\xc0\x96\x95\xae\x93\xbd\x72\x82\x41\x93\x77\xb7\x6c\xa8\xbd\xc0\x52\x1c\xfe\xe6\xf6\xd7\x29\xc3\xad\xff\x89\x46\x87\xb1\x77\xef\x19\x52\x9a\x6b\xda\xce\x70\xb6\x85\xc6\xd7\xa5\xd7\x4a\x08\xe2\xa9\xe7\x24\x03\x59\x75\xc8\x0d\x18\xcb\x36\x94\x70\xde\x72\x99\xcb\xd6\xb0\xa2\x7c\x92\x32\xc7\xea\xba\xc8\x6d\x50\x93\xa6\x5f\xfe\x0b\x40\xd4\x0b\xef\xe8\x0b\x68\xcd\x9d\xce\x1e\xa1\xe6\x57\xe4\x5e\x9c\x49\x9d\x0b\x69\x0f\x74\x45\x5f\xb4\x70\x96\xed\x8c\x18\xd1\x51\x7f\x90\x44\x29\x01\xa6\xc4\x10\xb7\xf6\x41\x5f\x20\xae\x48\xc5\x8a\xde\x8d\x67\x5b\x6c\x05\x8d\xf1\x6a\xe7\x69\x8f\xce\xae\x95\xaa\x77\x1b\x4c\xd8\x8a\x0b\x3f\x22\xc5\x1f\x98\xc7\x1c\x1e\xb4\x6b\x26\x4b\xf9\x7a\x30\x0e\xcb\x1f\xd2\x62\x26\xad\x8e\x87\xa0\x58\xcf\x3e\x70\x8e\x26\x0f\x56\x6b\x68\x53\x14\x04\x51\x33\xf4\xa5\xe8\xfb\xc3\x45\x61\xb9\xa0\xf1\xff\x93\x39\xf5\x52\x31\x07\x6b\x73\x6b\x6e\x11\x52\x43\x19\xa2\x72\xbd\x44\x53\xa0\xaf\x14\x93\xda\xa0\x91\x67\xe8\x46\x43\xd2\x07\xa0\x2f\xee\x98\xfb\x22\x3b\x01\xa9\x9a\xa5\xce\xf2\xb7\x00\x1e\x47\x0f\x6f\x94\xa5\xdc\x20\x8e\xdf\xc0\xcb\x8c\xf3\x11\x4a\x91\x96\x00\xf0\x61\x17\x2f\x0e\xfe\x03\x90\x36\xbf\x4d\xdd\xbf\xd0\xd4\x5f\x91\x44\x3b\xf2\x6f\x8e\x15\xed\x7d\xb8\xe5\x5f\x08\x6a\x4a\x45\x83\xf4\xbd\xa0\xf5\x56\x28\x4d\xcf\x71\x29\x2f\xe7\x0f\xca\xa8\x25\x9b\x9f\xaf\xf3"}, +{{0x10,0xf0,0x09,0xaa,0x88,0x7d,0x91,0xce,0xd8,0x09,0xaf,0xe1,0x92,0xd7,0x8e,0x47,0x99,0xd9,0x03,0x77,0x62,0xf4,0xa9,0xd3,0xa4,0x29,0xfd,0xe0,0xf3,0x9f,0x7b,0x7a,},{0xcf,0x51,0x16,0xb9,0x21,0x21,0x2e,0x9b,0x78,0x82,0x9a,0x02,0x63,0x46,0x36,0x91,0xc6,0xfb,0xcc,0xdc,0x0c,0x11,0x8b,0xe1,0x41,0xc9,0x6f,0x8c,0x88,0x05,0x3d,0xd3,},{0xc3,0x7b,0xb7,0xb7,0x3b,0x11,0x05,0xbe,0x08,0x6f,0xf3,0x07,0x69,0x72,0x07,0x72,0x62,0xdf,0x4d,0x73,0x32,0xf6,0x08,0xc7,0xb2,0xb9,0xd9,0x78,0xd4,0x74,0xcb,0xbc,0x27,0x10,0x46,0x08,0x00,0x35,0xf3,0x96,0xee,0x36,0x47,0x9b,0x7a,0x67,0x11,0xc6,0x8e,0x25,0x61,0xc7,0x41,0xc0,0xec,0x5f,0xc9,0xec,0xa1,0x73,0x4e,0x81,0x1f,0x04,},"\x2e\xdf\x14\xd6\xcd\x56\x89\x6e\xea\xa7\x70\x21\x1c\x49\x84\xbe\xd8\x0e\xca\x8d\x65\x34\xd5\xd5\x10\x88\x4f\x55\xf1\x1f\x99\xff\xa9\xf8\x9b\x58\x6f\xfe\x7b\x1e\xc7\xea\xab\x6a\x9d\xc1\xa2\x4a\x3e\xe3\xc7\xa6\xab\x44\xad\xe9\x91\x78\x83\x26\x4e\xde\x2f\x13\x61\xbe\x7d\x7a\x38\x17\xf2\x9d\xec\x95\x81\xc3\x19\xf1\x8f\x95\xd5\xbe\x26\xd9\x11\x8b\xe6\x78\x34\x00\x37\xa6\x8a\xbf\xc5\xef\xbb\x9a\x3f\x3f\x38\x78\xaa\xe3\x72\x1f\xfe\xf5\xbb\x6a\x26\xc7\xb1\xa3\xa5\x6d\x2b\xda\x6c\x6e\x86\x0e\xb4\x1f\xd8\xd8\x37\x11\x74\xd9\x1c\x74\xc5\xeb\x67\xc3\x85\x5c\x63\x0d\x64\x1d\x2e\x57\x1a\x9a\x51\xc6\x40\x2c\xfe\x18\x42\xce\xf3\x89\x80\xcb\x8d\x0a\x64\xbc\xc8\x9b\xe3\x18\x9e\x68\x11\xf4\x7e\x8f\x4d\x00\x63\xa5\xb1\x60\x1f\x44\xfd\xa2\x0c\x1c\x4c\x2f\xc4\x9c\xbe\x27\xa4\x13\x7d\xc4\x63\x8c\x2a\xd2\xd0\xa5\x47\x47\x47\x22\x9c\x56\x8e\x38\x05\x43\x1f\xa3\x6e\xeb\xa7\x85\xf7\xb9\x78\x44\xb5\xe3\x19\xfa\x6a\x09\xcc\x5a\xe8\x40\x34\x74\xbb\x91\xdd\x89\x6c\x1e\xc2\xba\xc7\x3d\x2e\x50\x5e\xfc\x62\xbd\x50\x2b\x5c\xeb\x08\xd1\x6e\x83\x2e\xc5\xdc\x4f\x98\xb5\x1b\x9d\x07\x38\xb9\xfb\x28\xf3\xab\xe8\x96\x6b\xf2\x23\x75\xa0\xb2\x2c\x47\x1a\x9e\x58\xe3\xfd\x70\x0d\xe1\x5c\x52\x96\x37\x3c\x1b\xc9\xd4\x64\x0e\xb7\x81\x6e\x1d\xc9\xc8\xce\x86\x19\xa8\x11\x83\x00\x9e\xc9\x74\x87\x1e\x8f\x0a\x97\x72\xed\xe0\xa6\x38\xb3\x57\x4b\xf7\x5d\x8f\x55\x98\x7f\x3c\xfa\x6f\xec\x68\x97\x0b\xfe\x00\xb2\x3b\x59\xfb\x5b\xf4\x99\x6e\xa5\xd7\x70\x4f\xcf\x2e\xff\xcc\x0f\xd7\xf3\xd8\xe6\x05\x60\x08\x09\x7f\x26\xca\xff\xd5\x41\x5a\x28\x2a\x27\x6a\x9b\x26\x45\xe5\xca\xb1\x29\x68\x87\x2e\xb0\x52\xf4\xd7\xc1\x0c\xc7\xc2\x1d\x51\x61\x81\x8b\xb4\x4c\xc8\x56\xb0\xde\x76\x9d\x55\x9c\x55\xdf\x64\xad\x9a\xdc\x16\xc0\xac\x65\x83\x8f\x66\x0d\xa8\x13\x86\xb7\x0b\x93\x52\x5e\xc2\xf4\x0f\x6f\x63\xf8\xea\x5d\x48\x30\xb9\x64\x6c\x46\x18\x3b\xb4\xe6\xf2\x70\x47\xbd\xa2\xa5\x46\xbd\x34\xbd\x4d\xb5\xfb\x88\xfd\x8a\xb7\xc7\x5f\x65\x2e\x15\xd5\xaa\xa6\xb4\x6a\x8a\xcf\x6e\x44\x8b\xf2\xdd\x64\xde\xe3\xc1\x05\x64\x7c\x7f\x83\xad\x20\x0d\x80\x97\xc4\x44\xa1\x58\xd8\x5a\x54\xf0\xe5\xdb\xb1\x2b\x43\xde\x94\x3a\xf1\xa8\x18\x56\xac\x96\x9f\x52\xa0\xbd\x45\x43\x81\xbd\x26\x50\x41\xa2\x69\x1d\x1a\x4a\x0d\x81\x9f\xa7\x90\x92\xc8\x80\x35\x21\xfa\x53\x68\x9a\xb8\x52\xf1\xfb\xab\xe0\x0c\x94\xb7\xf6\x82\xd1\x21\xcf\xf5\x43\x91\x32\x25\x29\xc8\xd5\xad\x7b\xbb\x98\xea\xfe\x30\x0a\xb9\x22\xf1\xc8\x92\x40\xa1\xe6\x33\xcf\x56\xa7\xb0\x2f\x74\xa2\x92\x14\xe5\x69\xa0\x57\xbd\x58\x5e\x40\x4d\x7c\xd5\x35\x20\x41\x45\x6e\x6c\xf9\x0c\x15\x34\x2e\x02\x56\x70\xf4\xfc\xcd\xf9\x87\x83\xb6\x85\x32\x14\xca\xc3\xfa\x80\x8a\x66\xc2\x7b\x65\x3c"}, +{{0x45,0x78,0xc6,0x5a,0x7c,0xa4,0x8f,0x27,0x74,0x05,0x0a,0x7b,0x0c,0xe7,0xa4,0xfd,0x5a,0xd4,0xe6,0x96,0xb2,0xb8,0xaf,0x23,0x96,0x16,0x4a,0x1c,0x7e,0x1b,0x7b,0xd7,},{0x15,0xbf,0x9d,0xbd,0x3b,0x81,0x73,0xe6,0xf0,0x3d,0xcf,0xd5,0x75,0xd9,0x09,0x84,0x5f,0x03,0x8e,0xaa,0x09,0xc5,0xd9,0x08,0xfe,0xf9,0x08,0xa9,0x74,0x58,0xb3,0xef,},{0xa1,0xc2,0x42,0xb4,0x5e,0x94,0xfd,0x18,0x0f,0x05,0x4c,0x71,0x01,0xe5,0x5b,0x39,0x65,0x68,0xf4,0x83,0xdb,0x6f,0x0d,0xfc,0x41,0x68,0xb6,0x9b,0x59,0xd3,0x85,0x81,0x4c,0x19,0xeb,0x30,0x75,0x23,0x7d,0x1f,0xbb,0x1f,0xee,0xbb,0xfe,0xa5,0x0c,0x56,0x81,0x3c,0x8c,0x39,0xc2,0x27,0x52,0xe0,0x2d,0xb7,0xe5,0x7f,0x3e,0x3f,0xbf,0x0d,},"\x50\x6f\x32\xb9\x68\x14\x24\x3e\x4d\xd8\x87\x0a\x8f\xd6\x0d\xde\xf0\x9b\xb8\xc5\x63\x15\x10\x70\xd9\xbc\xb2\xb1\x60\xa3\xea\xbd\x71\xa0\x44\xd7\x1e\xc9\x3f\xba\x95\x28\x8e\xd6\xfe\x1a\x7b\x92\x16\x51\x60\x43\x07\xd6\x5a\x45\xec\x5d\x3f\x26\x31\xac\xe4\x0e\x58\xd5\x3c\x72\xe5\x26\x88\x6e\x16\x97\x2f\x6e\x0d\xb9\x4d\x57\xb5\x56\x34\xfd\x39\xd5\x5e\x9b\xb7\xf2\x12\xaf\xab\x00\xf7\x74\x64\x09\x26\x7e\x8d\x56\x5f\xf5\xc2\x25\x73\x33\xc3\xd0\x41\x52\x17\x4f\xe1\x2d\xe6\xa5\x7b\xea\x05\x7d\xc2\x19\xe2\xfb\xa5\xf1\x91\xed\x81\x41\xc0\x18\x96\x9d\xe1\x94\x72\xd6\xaa\xf7\x63\xf1\x9e\xc5\x54\x70\x2b\xb3\xdc\xbe\x13\xca\x9b\x23\xb2\x41\x8c\x99\xe7\x18\x38\xa8\x8c\xf4\x54\x72\x8c\xf9\x20\x8a\x16\xc8\x4e\xa3\x98\x29\xb4\xba\x9b\x4c\x77\xe1\x76\x11\x2b\xfe\x1b\xf3\x5f\x95\xc4\x02\x8c\x7d\xb8\x0b\x36\xfa\xa2\x9d\x2b\x89\xe9\xe8\x62\xf3\x10\x00\x06\x5f\x13\x9b\x3d\xa7\x7d\x9d\x86\x85\x30\x57\x4b\x7e\x39\x1e\xd9\x7b\x34\xf8\x78\x16\x4f\x6b\x8d\x87\xb4\x06\xc7\xdc\x78\x60\xa5\x17\x5f\x92\x0e\x5a\x62\xdc\x1f\xc8\x2e\xd8\x45\x25\x43\xb1\x07\x36\x0d\x35\xd2\xb4\xc4\x23\x9e\xab\x46\x6d\x32\xbf\xda\x34\xf5\x10\x37\xa6\xfa\xe7\x6f\x6d\x8b\x83\xe8\xf7\xf4\x89\xdd\x4c\x1b\x49\xc3\x8f\x53\x57\x6e\x62\x17\x2c\x17\xde\xe3\x66\x5f\xde\x8c\xbf\x01\x5a\xf9\x66\x5b\x0f\x1d\xa2\xfb\x77\xb1\x34\xf0\x4b\xe2\x71\xe4\x02\xf3\x15\x37\xc2\xfc\x05\xc2\xf9\xb6\xfc\x3f\xfe\x47\xde\x33\x69\x13\x38\x67\xc6\x9d\x10\xe7\xf5\x37\xba\xe4\x56\x7d\x46\x8e\x0f\x2e\xd8\x06\xfe\x33\x5f\x93\x9c\x75\x99\x4f\x36\x3c\xe3\xb7\x0d\xaa\x7d\x5b\xd2\x31\x7c\x83\x38\x51\xfd\x8c\xc9\x72\x51\xec\x41\x90\x23\xd9\xd0\x17\x4d\x84\xd5\x60\x9a\x69\x18\xa1\x74\x0e\xb1\xe3\x09\xbd\x12\x73\x66\xde\xb9\xc5\xab\x12\x99\x2e\x99\x02\xe0\x15\xfe\x58\xd6\xad\xbf\x52\xd2\x2a\x76\x0a\xcd\x63\xe1\xed\xd8\xf1\x38\xe9\xfb\x01\x37\x18\x86\x01\xe1\x97\x8e\x7d\x04\xfb\x2a\xda\x2b\x2a\xee\x12\xf4\x9f\x28\x36\xc6\x84\x2d\x88\xcf\x48\xc8\x66\xe3\xd3\x3f\xcd\x26\x9c\x27\x5c\x89\xc2\x5e\x36\x69\xca\x90\xde\x7b\x67\xa7\xe7\xa3\x82\xcb\x7e\xfa\x47\xe9\xc2\xbf\x76\x57\x1c\x79\xa2\x50\x85\xef\x02\x04\x87\x15\x2f\x06\xbf\xa1\x33\x01\x5a\x1b\x8f\x1c\x0f\x6a\x9f\x0e\xae\x1b\xa6\x2b\xf1\x04\xf1\xc1\x6a\xc1\x4e\x1e\x96\xc4\xeb\xdf\x06\x1e\x0c\xc7\x10\x1d\x38\xda\x7e\x9e\x09\x94\xda\xf0\xf3\x22\xaa\x3c\xfe\xf9\x1b\x61\x6c\x2d\x00\x06\x89\xab\x18\xed\x45\x26\x8d\xcd\x27\x50\x94\xf6\x56\xba\x3c\xf5\x15\x26\x10\x24\x74\x1f\x74\x44\xab\x7f\xc4\xde\xcc\xe1\x67\x56\x03\x2a\x1b\xe2\x70\xff\x0b\x03\x17\x54\x2b\xa0\x26\x62\x26\x0a\x37\x6f\xc9\x12\xcb\xb0\x29\xca\xc5\x45\x15\xf5\xa5\x51\x36\x4f\x6a\x99\xff\xad\x0b\x9c\xbc\xd0\xe6\x93\xb7\xa5\x21\xcb"}, +{{0xc2,0x1e,0x70,0xc4,0x6e,0xde,0x66,0xe6,0x8a,0x88,0x73,0xbb,0xc6,0x4b,0xa5,0x12,0x09,0x30,0x3a,0x0a,0xc4,0xfc,0x49,0xb1,0xd8,0x3e,0x81,0x93,0xad,0x46,0xc0,0x37,},{0x9f,0xbf,0x80,0xa4,0x25,0x05,0xd2,0xc9,0x52,0xf8,0x9f,0x45,0x58,0xc3,0xe6,0xd1,0x87,0xa7,0xbc,0x1e,0xf4,0x46,0xb2,0xe3,0x73,0x23,0x43,0xc1,0x3b,0x33,0xd2,0x00,},{0x0a,0xe3,0x43,0xbb,0x84,0xe3,0xa2,0x99,0x07,0x8e,0x24,0x34,0xba,0x22,0x00,0x22,0xf3,0x16,0x0f,0x96,0x8a,0xc0,0x44,0x82,0xbf,0x8c,0xad,0x13,0xb4,0x23,0xf2,0x67,0x0f,0x01,0xfb,0x5f,0x7b,0x32,0xc5,0x97,0x52,0x0f,0x84,0x60,0x7e,0x0f,0x79,0xc0,0x75,0xfa,0x70,0x78,0xe6,0xe6,0x9d,0x3c,0xec,0x31,0x92,0x65,0xd4,0x66,0x08,0x0b,},"\xf5\x5a\xa5\x70\xce\x4f\xc9\x5f\x73\xf5\x17\x20\xd2\x54\xe4\x69\x5f\xcd\xc8\x1a\xaa\x04\x01\x30\xc7\x68\x7f\x03\x9b\x8b\xa5\x9e\xd8\x57\xce\xb2\x9c\x12\x10\x25\xa8\x57\xfe\xac\xb4\xa0\x1f\x38\xe0\x11\x78\x31\x0a\xe6\xe3\x5c\x99\x8e\xbf\x89\xdd\x79\x05\x7b\x4a\xfc\x6d\xb3\x40\x60\x1c\x81\x70\x3c\x87\xa8\xc4\x0e\x5c\xeb\xb0\x44\x1d\xf7\x8a\x6d\xe1\x3a\x44\x7c\xb0\x16\xc6\x5e\x74\x1b\xb7\xdf\x30\x4d\x83\x05\x6b\x72\xc6\x82\xc7\x31\xfa\xc0\xa0\xc7\x0b\x78\x11\xca\x14\xa5\x01\x54\x61\x30\x99\xc2\xc4\x37\x52\x1c\x40\x4b\x63\x61\xde\x36\x21\xf8\xea\x56\xb0\x8e\xbf\xdb\x07\xb4\xf2\xbb\x8b\xa2\xec\xc1\x64\x33\x6d\xa8\xef\xc9\x42\x76\x6e\xf0\xc7\x4d\xfd\x3b\x49\xe0\x87\xe9\xa2\x7a\xe5\x4a\x7a\x2b\x98\x28\x1b\x9a\xf9\x3d\xc1\x1a\xa2\xf0\x92\x24\xab\x5a\x73\x0f\x02\x18\xf4\xa6\xe1\xea\x48\x85\xa7\x7f\xbd\x93\xa1\xc5\x82\x77\xd9\xe0\x1b\xe7\x3a\x25\xcd\xa9\x18\xfc\x27\xdd\xdb\x45\x3a\x5d\xa6\x90\x2a\xd0\x2b\xa0\x57\x75\xc6\x7e\x07\xbe\xa4\xdf\x86\x91\x34\x66\x74\x43\x65\xc1\x32\x6e\x0a\xb5\xe1\x25\x4c\x17\x96\x74\x47\xd5\x91\xba\x5e\xd1\xb6\x3a\x42\x54\x3b\x87\xfe\xd4\x14\x59\xa0\x89\xbc\xea\xff\x21\x98\x02\xa8\x7a\x87\x2a\x76\x3e\x69\x23\x33\xce\x1c\xc7\x39\x78\x25\x08\x4b\x2b\x83\x1e\x93\xd8\x0d\x67\x37\xf3\x29\x80\xf2\xf3\xae\x82\xc6\x21\x90\xfe\x3f\xa7\x00\xc5\xb7\x32\x9d\x6d\x50\x04\x2b\xdf\x83\x1f\x37\x54\x8f\xcc\x80\xb1\x1f\x57\xcf\x20\xf6\x7a\x3b\xb6\x51\xa7\xbe\xff\xcc\x48\xb7\x0d\x17\xeb\x60\xf7\x25\x9c\xc5\x3b\xf7\xff\x60\x80\xeb\x2b\xd0\x92\x3b\x04\x83\xaa\x30\x65\xa8\x95\x5f\x01\xd2\x3b\xa8\x09\x51\xe0\xae\xfd\x2a\x93\x72\x19\x15\x72\xbc\x52\x91\x6a\xa2\x2a\x2a\xec\x39\x37\x67\xfa\xfd\x08\x68\x39\xe2\x36\xfe\x04\x60\xce\x6d\x63\x9c\x7c\xe6\x9f\xe7\xf9\xd3\xaa\xd2\x13\x05\x73\x44\x35\x70\x44\x3b\xe6\xba\xb9\x3a\x06\xa5\x4b\x8a\xc2\x9b\xf3\x3f\xf9\x94\x9b\xc9\x21\x58\xe6\x92\x4b\x6b\x68\xec\xda\x5f\x6f\x3a\xaf\x42\xb3\xd2\x2d\xf6\xd5\xe6\x7d\x5c\xb3\xab\x71\xeb\x8e\xe0\xb0\xe6\x67\x32\xe1\xda\xca\x6c\xd6\x0d\x9a\xa7\x43\x05\xfc\xd5\x70\x07\x6d\x22\x8d\x44\x6d\x5e\xe5\x42\xb1\x04\x88\xbf\x8a\xa9\x88\xf4\x51\xfa\xeb\xe7\x4a\xb6\x69\xd6\x04\xd9\xdd\xb1\x51\x06\x62\x0e\xa0\x2e\x8d\xb3\x8c\xe6\x39\xb5\x74\x78\x12\xbb\x90\x48\xee\x8b\xf7\x2b\x1a\x95\x1a\x05\xdf\xfa\xc9\x54\x17\xcb\x43\xb0\x6d\xce\x61\xee\x3d\xa6\xf2\x83\x2e\xe8\x3b\x2e\x72\x88\xdd\xd6\x2e\xeb\x58\x93\xf7\xf2\xf6\xc8\x09\x0d\x99\xe3\x36\xc9\xf9\x06\x9e\x18\x15\x98\x58\x41\xbd\xd5\x05\xb5\xf8\x3d\x89\x5e\x87\x95\x93\xda\xde\xe7\x2c\xeb\x97\x65\x69\x9b\xf8\x0b\xd0\x6a\x5c\x55\x33\x1b\x25\x45\x52\x7d\x0c\x7c\xae\xce\x96\x58\x4c\xe3\xec\x7f\xe0\x22\x60\xf2\x0b\x8a\x1c\x06\x35\x76\x3f\xf4"}, +{{0xf2,0xc1,0x05,0x77,0xf7,0xdf,0x77,0xf0,0xc1,0x15,0x7a,0x8c,0x33,0x1a,0x7b,0xd2,0xae,0x63,0x86,0x67,0x0e,0xb6,0x5f,0x0f,0xae,0x12,0x23,0x31,0x69,0x0f,0x82,0x8a,},{0x0d,0x4c,0x34,0x0f,0xc2,0x31,0xaa,0xfb,0x3b,0x6f,0x74,0xb8,0x9b,0xce,0xf7,0xee,0xaa,0x0b,0x04,0xf2,0x93,0xec,0x85,0x44,0x24,0x7b,0xfc,0x3f,0x2d,0x57,0xc1,0xe0,},{0x60,0xb7,0x03,0x11,0x5a,0x32,0x2a,0xb8,0x92,0xc2,0x76,0xbf,0xd1,0x8f,0x70,0xa9,0xeb,0x0c,0x73,0x23,0xe2,0xc0,0xa6,0xeb,0x5f,0xc7,0xe3,0x30,0xb0,0xbc,0x3b,0x07,0xa5,0x78,0xa0,0x82,0x84,0x62,0x64,0xf0,0x32,0xc6,0x19,0x1d,0x04,0x0b,0xd9,0x8e,0x5d,0x5a,0x4d,0x4f,0x07,0x6f,0xb9,0x06,0x2a,0xcd,0x36,0xbe,0xa4,0x0c,0x91,0x02,},"\x38\xea\x1e\x02\x8a\x49\x3d\x1c\x60\xec\x70\x74\x9f\x14\xd4\x36\xeb\x3a\x2b\x2d\xe5\x4f\x21\x3d\x01\xa6\x45\xb5\x80\x43\x0e\xcd\x8e\xce\x6b\x55\x69\xcc\x01\x7a\x49\x43\xe5\x59\x5c\x5e\xd6\xe4\x8c\x94\x43\xf2\xfa\x5e\xb2\x22\x7f\xfe\x56\xd2\x11\xf2\x69\xbc\x8f\x6f\xa9\xee\x8c\xd5\x6f\x6b\x84\x70\x53\x92\x08\xaf\xe2\x9a\xb0\xa1\x95\x04\x4d\x95\x7b\x31\xf9\x3e\x18\x4a\x9c\xbe\xf1\xa1\x4e\x14\xf8\x08\xbb\xf5\x89\xac\x77\x70\x08\x4f\x99\x8e\x1b\x25\x4d\xa5\x9c\xa6\xd3\xe6\x2e\x7b\xe1\x79\x07\x16\xd2\x56\x0f\x01\x5f\x39\x9c\xbb\xce\x48\xcf\xd0\x39\x1e\xad\x19\x93\x44\x6f\x6b\x24\x93\x97\x7d\x93\xd7\xb0\x9a\x07\xa7\x9a\x59\xce\x15\xdc\xe7\xa1\xda\x9c\x64\x6f\x45\xaf\x2c\xca\xd5\x5b\xa1\x58\xe6\x38\xc4\xa3\x0c\x5d\x30\xe9\xac\x6e\x3a\x33\x39\xc2\x43\x42\x6d\x86\x49\x1b\x2d\x92\xda\xc1\x47\x8e\x8d\x74\xff\x0b\xf1\x49\xbd\xb5\xe0\x9e\x3f\xb6\xb8\x26\x2e\xb0\x68\x79\x81\x55\x4a\xe2\xcb\x47\x19\x63\x39\x07\x9d\xa0\xa1\xa5\x72\x39\xc1\x9b\xf7\x81\xf6\x2f\xda\xf4\xe3\x15\x60\xa8\x43\x17\xef\x03\x04\x92\xcf\x1b\xb1\x30\x5b\xa8\x51\x8e\xba\xf2\xb4\x34\xd3\x64\x16\x72\xc8\xf6\xea\x2d\xef\xa6\x96\xdc\x7e\x4f\x39\xef\xc0\x8d\x28\x8d\x1c\x96\x6a\x6c\x71\x48\xc0\x12\xee\xc4\x39\xf7\xe1\x2d\xba\xb5\xb8\x7c\xfa\x44\xc9\xae\x19\x00\xf8\x38\x6f\x24\x44\x4e\x10\x92\xb2\x3a\x27\x4c\x13\x8e\x95\xc6\x61\xe9\x37\x7e\x8a\xd2\xd1\xfc\xaf\x19\x39\xec\x9a\x63\x2a\x87\x3f\x7e\xad\xbe\x68\x7b\x4a\x03\x3b\x92\xa4\x77\xf2\xe0\x2e\x9e\xd9\x2c\xe4\xf9\x5c\xf1\x70\xb3\x90\x15\x18\xa0\x62\x14\x3e\x56\xdb\x05\x4d\xf4\xe4\x43\x15\x44\x78\x5a\x6d\xfa\x24\xee\xc0\xf0\xde\x7a\x69\x9c\xcf\x28\x6d\xad\xfa\xd8\x59\x03\x61\x22\x50\x76\x4f\x25\xcd\xea\x81\x27\xd0\x07\x8d\x55\x48\x25\xea\x6e\x73\x71\xc4\x38\xbc\x46\xf2\x9f\xb8\x93\x7f\x8d\x9a\x39\xcf\x88\x49\x05\x2d\x43\xec\xbf\xf6\xc4\xa3\x76\x2a\x5f\x40\x0c\x15\x14\xe8\x5e\x91\x38\x4f\xef\x9b\x40\xf4\x31\x4e\x22\x3a\x9d\x68\xc5\x26\xac\xc7\x02\x27\xd6\x2b\x8b\x63\x7a\x34\x2d\xf1\x13\xd3\x18\x20\x2c\x51\xed\xd3\xc1\xef\xd1\xff\x20\xb1\xff\x07\x8b\x32\x06\x8e\x79\x4d\x92\x81\x33\x03\x7f\x1e\x3a\x34\x68\x9e\x62\x9e\x43\xfd\x2b\x8e\x88\xea\xb5\x0d\x7e\x7a\xb0\x64\x70\x14\xab\x5e\x4a\xd5\x82\x00\x65\x67\xef\xf7\x2b\x5a\xf2\xda\xc5\x36\x89\x2c\xcc\x87\x1f\x8a\x80\xb5\xcb\x79\xd9\x0b\xcc\x6b\x77\xd4\xcd\x08\xf8\x76\x18\x4e\xf5\x8c\x06\x4a\xe4\x30\xbb\x79\xa6\xb9\xe9\x6b\x0a\xd8\x73\x68\xaa\x83\x8a\x8d\xcc\xff\xac\x0c\xd8\xce\x9e\xa0\xd0\xec\x4c\x4b\x0f\x42\x67\x34\x16\x65\x9c\x98\x49\x92\xcf\x53\xb1\xe4\x45\x43\x10\x07\x64\x0d\x47\xec\xe2\x6d\xee\x4a\x29\x43\xaa\x70\x97\xdd\x35\x6c\xff\x47\x54\xf2\x1a\xc0\x7f\x6b\x3f\x73\xc4\x69\x05\x55\x12\xf3\x7a\xba"}, +{{0x04,0x1a,0x97,0x90,0x6b,0x59,0x56,0xb9,0xd3,0x40,0xf2,0xe0,0xd7,0xa1,0xdc,0xbf,0xef,0xe6,0x63,0xe9,0xbb,0x40,0x26,0xf8,0xcc,0x1a,0xe7,0xe2,0xa1,0x4d,0xe2,0x7e,},{0xf3,0x82,0xd3,0x2e,0x88,0xc3,0xa7,0x2c,0x7c,0xad,0xda,0xfc,0xf8,0xaa,0x69,0x9e,0x21,0xdb,0x7a,0x6b,0xf4,0xed,0xd6,0xe4,0x9a,0x00,0x5a,0xad,0x70,0x2e,0x6a,0x79,},{0xa2,0x3f,0x03,0x2e,0x66,0x92,0xa0,0xe8,0xbf,0xee,0x5b,0x2d,0x30,0xb4,0x14,0xcb,0x16,0xc3,0x5a,0xd0,0x8d,0xa3,0x1f,0x69,0x6d,0x46,0x1a,0x02,0x85,0x78,0x22,0xc4,0xef,0x35,0x7f,0x0c,0xcf,0x31,0x02,0x5a,0x4d,0xc9,0x5c,0xed,0x30,0xa9,0x94,0xf4,0x1e,0xdd,0x1d,0x08,0x7a,0xfc,0xaa,0xf3,0xe8,0xe8,0x75,0x70,0x83,0x20,0xf8,0x0c,},"\x71\xa7\x59\x57\x41\x15\x44\x97\x5a\x48\xcf\x10\x3a\xa1\xf8\xe2\xad\x15\x24\x44\x59\xcd\xc0\xe3\x36\x96\x6e\xb8\xb2\x6c\x97\xf2\x16\x9e\x5d\x78\x53\x70\x37\xef\xc0\x77\xe8\x6f\x06\xe0\x5e\x9c\x1d\xc3\x41\x82\x88\xc0\xa2\xbe\x6b\xa3\x4b\x3a\x04\xab\x20\xba\xe7\xf3\x62\x10\x94\xb8\x7d\x78\xa7\xea\xcb\x86\x4d\x40\x78\xcb\x4e\xfc\xba\xc5\xad\xd9\x37\xa2\xc6\x01\x2e\xe1\xa8\xb2\x56\xcc\x27\x6b\x65\xd5\xe9\x2b\x4d\x00\xb9\xb1\x1f\xad\x88\x49\x91\xde\xc4\xc1\xcb\x9d\xce\x18\x63\xc8\xb0\xa2\x10\x16\x1a\xe6\xb3\xf8\xbf\x9c\xc4\xdc\xe4\xad\xfd\xc8\xed\x57\xd8\x3e\x95\xab\x9d\xd2\xd9\x26\x58\xdf\xbd\x3a\xfa\x99\xe3\xf8\x95\x1e\x2a\xd7\x4a\x14\x8f\x6f\x59\x7e\xb2\xc9\x45\xc1\xf1\xb9\x44\x61\xae\x07\x45\x48\x1f\xd0\xed\xf8\x38\xc6\x28\x60\x35\xe3\x6f\x01\x12\x38\x87\x5d\xbb\xa2\x28\x9d\x3d\x6a\x39\x42\xa7\xf9\x55\x4c\x64\x43\x05\x24\x4d\xdb\x77\xc1\x17\xcb\x4b\x56\x23\x77\x29\xdd\xe4\x28\xb8\xbb\x42\xdf\x9c\xe2\x9e\x14\x4d\xfc\x96\xcf\x6c\x67\x67\xb1\xee\x6d\x05\x3c\xe4\xf8\xbb\x20\x56\xab\x78\x10\xaa\x13\x68\xa8\x91\x0f\x2f\x69\xe0\x61\xc1\x9d\x88\x47\x18\x4f\xed\x53\x4f\x98\x75\x8d\x70\x3a\x76\x88\x5f\x91\xeb\x75\x2a\x21\x95\x4a\x10\xc6\xf6\xb4\xda\x10\x46\x4d\xed\x36\xb0\x00\x89\xf6\x62\x91\x54\x21\xbf\xda\xd4\x96\x75\x36\x89\xcc\xd0\x3b\x62\x40\x21\x08\x07\x61\xe6\x81\x76\xb1\x06\x97\xda\xc8\x78\xe4\xc3\xdb\x2f\xd0\xb2\x8c\x65\x53\x35\xd9\x80\x16\xf1\x9f\x26\x5b\xb0\xb2\x43\x4c\xb4\x63\x78\x44\xd9\x1e\xd0\xce\x05\xed\x25\x91\xfd\x99\x89\x65\xf8\x3f\x31\x97\xd1\x0e\xef\x44\x88\x50\xe7\x92\x03\x27\x24\x70\x1d\xa3\x05\xcb\x6d\x79\x46\x69\x48\x3f\xc3\xdc\x6f\x68\x6b\x18\x3e\x29\x99\x13\x0c\x8f\xc0\x05\x8d\xca\xbb\xc9\x18\x8f\x26\xb2\xd6\x3e\xbd\x6c\xb1\xe1\x8a\x09\x7c\x77\x04\xa5\x9b\x5e\x18\x7e\x01\x42\x59\x3b\x70\x83\xf7\x40\x0a\xfa\x9b\x1b\xf0\xc1\xcc\x6c\x35\x6b\xc4\x33\x4a\xf7\x72\xe6\x71\x53\xb4\x5b\x33\x1b\x99\x09\x20\xc2\x4e\xed\xe2\xc6\xe3\x23\x70\x3f\x52\xec\xd6\x07\x35\xb2\x3b\xf2\x2b\x81\xee\x77\x59\x27\xc3\x7e\x53\xda\xd7\x59\x6e\xa6\x5a\x73\xbb\x96\x77\x5f\x3b\x87\xc8\xb3\xc0\x88\xec\x69\x5b\xc3\xa7\x50\x2c\x0c\x51\x0f\x02\x0b\xf9\xac\xa3\xcb\xb7\xa2\xc0\x11\xc6\x7f\xf2\x7d\x63\x4c\xaf\x1d\xcf\xc5\x8e\x5e\x39\x7e\x66\x58\x25\x22\x72\x01\x1c\x8f\xfd\xd6\x42\x30\xa9\x32\x41\xff\xf6\x83\x72\xc4\xba\x85\x38\x2b\xbb\x22\x93\x09\x65\x29\x22\xdb\x68\x83\x66\x31\xe5\x5b\xe6\x9a\xb6\xad\xb8\xe4\x33\x53\x57\xfc\x92\x3e\xfe\x15\x4a\xfc\xc2\x22\xd6\x0d\x07\xf5\x69\x90\xa3\xe5\xa2\x14\xb2\x27\xae\xcf\xf2\xcd\x1b\xb6\xf0\xc7\x9f\xf5\x45\xf7\x0a\x61\x61\x41\xa9\xd5\x3f\x92\x2a\x02\x44\x3f\x7d\x2a\x46\x89\xc3\x5b\x09\x5d\xd3\x94\xd5\x0b\xf4\x9f\x96\x80\xa5\xf7\xd9"}, +{{0x4b,0xc5,0xe0,0x5a,0xa0,0x03,0xa4,0x49,0x2f,0x4b,0xad,0x10,0x2a,0x53,0x90,0xf7,0xce,0xba,0xb3,0xd3,0xec,0xa9,0x15,0x21,0x42,0xad,0x5e,0xf7,0xd8,0x40,0x30,0xae,},{0x67,0x51,0xd3,0xad,0x8b,0xb6,0xc6,0x4d,0x6a,0x17,0xd7,0xe4,0x47,0xa2,0x7d,0xa2,0x2f,0x5f,0x04,0x03,0xf4,0x37,0xba,0xc9,0x44,0x9f,0x13,0xcc,0x85,0x3d,0xd8,0x40,},{0xa2,0x4f,0xee,0x11,0xf7,0xec,0x6d,0xa3,0xe9,0xdf,0xaf,0x6c,0x85,0x8a,0xc0,0x04,0xb4,0x53,0x1a,0xbd,0x1c,0x9d,0x3b,0xb6,0x4f,0x40,0xdd,0x24,0x7f,0x00,0x35,0x93,0x50,0xe4,0x3b,0x2d,0x4b,0x8f,0xbe,0xc5,0xf6,0xb2,0x41,0xec,0xf9,0xf1,0x10,0x14,0x85,0xcf,0x41,0x87,0x35,0xb0,0x5f,0x71,0x20,0x18,0x33,0x5b,0x20,0x06,0x83,0x08,},"\xa8\xf7\x94\xdb\x17\x95\x66\x7d\x28\xd2\x4b\x70\xac\x22\x00\xa6\x23\x9a\x34\xe2\x43\x8c\xed\x1d\x03\xf9\x7e\xd4\x8b\xeb\x4d\x6b\xea\x67\xc1\x43\x38\xf7\x73\x64\x19\xdc\xd2\xa2\xa7\x97\x37\x26\x57\x2e\x6a\xfe\x7e\xdf\xef\x22\xc9\x9b\xe8\xb0\x69\xf0\x4f\x6d\xc6\x1a\x13\xb3\x43\xc6\xe5\x85\xab\xad\x22\x14\xd8\x5c\x36\xf0\x29\x96\xfa\xbb\x46\xbb\x91\xb5\x17\x6a\xc7\x08\xe4\x9a\x0b\x05\x30\x17\x04\x8f\xbb\x55\x45\x3f\x2b\x82\x08\xd6\x67\x8d\x1a\x8c\xf6\xa1\xee\x9a\xd7\xa9\x1e\x38\x03\x25\x63\x5d\x1e\x23\x6a\x6c\xa1\xd6\xcc\x7f\x6b\x59\xf2\xa2\xbf\x18\x4f\x5e\xe4\x51\xd6\x79\x9f\x69\xba\x11\xa0\xcd\x6b\xc0\x4b\xe8\xa3\x51\xa8\x0e\x72\x5b\x5f\xc4\x56\x3e\x45\xbd\x47\x49\xec\xbc\x45\x20\x52\x29\x10\x5b\x9d\xe7\x32\x61\x49\x85\x27\xf3\xd4\xec\xfb\xb5\x83\xff\x53\x27\x53\xd0\x7c\x38\x52\x6b\xb4\x82\xd1\x71\xa2\x61\xb9\xcf\x89\x90\x6a\x7d\xea\x8c\xbd\x7e\x72\x6b\xa3\x1e\xa6\x88\x03\xa6\xb0\x04\xf6\xdc\xd1\x9e\x67\x19\x50\x46\x37\x38\xcc\xa7\x8b\xb0\xdf\xfa\x3d\x64\x57\xe4\xae\xca\x65\x7e\xc6\x49\xb9\x7e\xe3\x0e\x97\xc8\xcb\xe6\xce\x43\xc2\xaa\x9a\x69\x95\x8e\x9d\xc8\x81\xe4\xaa\x7b\x32\x78\x07\x4e\x78\x7a\xce\x5f\xb6\x01\xd7\xfa\xf7\xca\x51\x03\xec\xbb\xd3\xbd\x55\x4e\xb1\xb0\x66\xf8\x29\x6d\x2c\xc5\x7e\x8c\x8a\x32\xe9\xc0\xe6\xa9\x26\x96\x4d\x6d\xf2\xd8\x64\x58\x64\xb3\x22\xc3\x22\xf1\xca\x80\x73\xce\xdf\x2b\x55\x67\x11\xa7\xa2\x0b\x77\xc0\xa1\xed\x27\x7a\x9a\x6c\xa2\xc0\x71\x54\xe8\x63\xfe\xf5\xa4\x04\xe3\xe8\x9f\x0d\x7f\x30\xf2\x18\xec\x4d\xe7\xa5\x3a\xeb\x9c\x41\xee\xaa\xf6\xce\x74\x96\x49\xc9\x99\x8f\xd6\x2b\xcb\xa2\x87\x23\x38\xe1\x9c\x94\xe5\x9d\xd5\xe2\xdd\x77\x6f\x53\x71\x9d\x21\x74\x69\x76\x93\x2e\xf1\x1a\xbf\x7a\x32\xae\x6b\x07\x44\x66\x5d\x0e\x0c\xe5\x13\x95\x5a\x9e\x68\x53\x1d\x8e\xe4\xde\x9a\x8d\x35\xdd\xfb\x88\xeb\x5a\x48\x6a\xd6\x31\x37\xe8\x89\x2f\xd7\xc6\x89\xd4\xf9\xe7\x02\x1b\x11\x73\xbb\x37\x52\xa5\xee\xcf\x29\x92\xe3\xfd\x46\x42\x26\x3c\x7b\x3d\x81\x5c\x29\xb4\x66\xab\x69\x28\x5f\xfe\x4b\x8d\xaf\xcb\xf3\xd0\x1d\x63\x55\x53\xab\x75\x75\xa7\xa3\x47\x1e\xdc\x7b\xe4\x12\xd3\xd0\x1e\x6f\xe8\xe3\xcd\xc3\xfa\x04\xd2\xa7\x59\x93\x81\xe2\x2b\xba\x49\xc5\x53\x9d\x79\xc6\x2b\x52\xbb\x0e\xca\x33\xf7\x42\x55\xe4\x1a\x95\x26\xa8\x92\x89\xb1\x5f\x18\x50\xd9\xaf\xa8\x7e\x6b\x6f\xa1\x27\x10\x1c\x1a\x6d\x88\xd4\x33\xe0\xc8\x6a\xa6\x0b\xba\x8f\xe7\x10\x0e\xd6\x1d\x5a\x9d\x00\xa0\x07\x64\x51\x3e\xb1\xc7\xf5\xf5\xc3\xb3\xef\xc4\x53\x2a\x36\xb4\x07\xfe\x2d\x17\xcf\xb4\xe6\xfc\xd6\x04\x9c\xff\x3a\x35\x56\x23\xa3\xa4\x13\x90\xea\x48\xf4\x21\x20\xd8\x97\x94\x91\x11\xbe\x3d\x16\x9b\x2d\x2e\xf4\x5b\xdb\x89\x4f\xe2\x0b\x1a\x95\xef\x66\x14\x94\x27\xa9\xd8\xf8\x0a\x9b\x2e"}, +{{0xa3,0xbe,0xd9,0xfe,0x23,0x54,0xbd,0x28,0x60,0x14,0x9a,0x3d,0xb7,0x5a,0x85,0xb1,0x29,0xcf,0x83,0xe9,0xd7,0x3e,0x63,0x17,0xba,0x70,0x54,0x52,0x19,0x33,0xf8,0x96,},{0x5a,0xc0,0x3b,0x4f,0x13,0xd9,0x1d,0x06,0x6b,0x2c,0xe3,0x59,0xe9,0xbb,0x1d,0xfb,0x6b,0xfa,0x5a,0xfa,0x38,0x2f,0xd1,0xcc,0xd7,0x2a,0xef,0x11,0x76,0x07,0x9f,0x89,},{0x33,0xbc,0x1e,0x0b,0xf1,0xb4,0x93,0xe0,0xcf,0xb7,0xea,0x40,0x48,0x0a,0x14,0x23,0xe0,0x91,0xf7,0x14,0x57,0x45,0x01,0x31,0x73,0x78,0x7d,0xf4,0x7a,0x10,0xdb,0x24,0xc1,0x65,0xd0,0x05,0x96,0xfa,0xb7,0x0e,0x68,0xc9,0x4c,0x10,0x4e,0x8a,0x74,0x07,0xcf,0x69,0x5c,0xd3,0xfb,0xe5,0x85,0xb5,0xb1,0x76,0xb8,0x5c,0xcc,0xa4,0xfd,0x08,},"\xdb\x85\x38\x08\x68\x6d\x6d\x21\xf4\xc5\x7b\x54\x1e\x5a\xd6\x33\x94\xd4\x65\xe6\x00\x78\x64\x3c\xab\x1e\x06\x5c\x9f\x30\x6c\x50\x00\x78\xf0\xcc\x41\xef\x0f\x95\x42\xb5\xfe\x35\x6a\xec\x47\x77\xef\x8a\x95\x55\x4c\x97\xb6\xa4\x40\x99\xe9\xbd\x64\x04\xfb\x0b\x2e\x41\xf9\x19\x14\xb0\x74\xd1\x22\x37\xcd\x44\x2e\xbd\x40\xb5\x1b\x8b\xc8\xbb\xe4\x37\xa2\xc5\x33\x32\xd2\xbe\xb2\x28\x1b\xf7\x32\x4a\x0c\xf5\xb7\x41\xbb\xf9\x8d\x1e\xb9\x85\x8b\xe9\x26\xe9\x15\xa7\x8e\x8d\x31\x4b\x41\x44\xf3\xd2\x0d\xfc\x6c\xb7\xf4\x8c\x23\xaf\x90\xf8\x71\xc6\xcd\xa9\x08\x45\xa4\x1a\xff\x17\x07\xa8\x7b\x4e\x55\x16\xf1\x8e\x8b\xd7\x68\x3c\xfd\x74\x07\x08\x03\xe8\x88\x33\x8c\x9a\x18\xf7\x92\xc8\xd3\xa7\x04\x17\x0f\xf9\x82\xbf\xfc\x9e\x8e\xc9\xea\x5d\x1a\x62\x59\x2f\x16\x88\xd4\xf2\xb0\x1e\x11\xf9\xf8\x87\x74\xc4\x7a\xc1\xd5\x8f\x69\x0b\xcf\x28\x8c\xf8\xa4\x73\xd3\x50\xa8\x23\x9d\xf9\xd3\xa6\x28\x81\xda\xdd\x33\x85\x31\xfd\xce\x76\x15\x80\x7c\xe9\x65\x49\x6d\x6f\x35\xd6\xc0\x42\xf0\xce\x7f\x21\xef\xe5\xce\x64\x25\x18\x59\x41\xed\x56\x36\xb8\xae\x91\x3a\x75\xd2\x1a\xb9\xdb\xdb\x3c\x3b\x66\x87\xa4\x5e\x04\x49\x38\xa9\xf1\xc1\x3a\x33\x0e\xa9\x76\x1e\x28\x3e\x61\xd4\xa3\x20\xe1\xf5\x59\x88\x2f\x34\xb6\x07\xfe\xfe\x32\xc3\x43\x17\x4a\xbc\xdc\x77\xb0\x65\xa9\x29\x04\xb4\x2d\x96\x1d\xb8\xed\x91\x6c\x01\x46\x4f\xfd\x43\xf9\x3c\x10\x77\xf1\xdf\x7e\xe6\x50\x31\xcf\xe0\x5d\x78\x0d\x01\xd0\x8e\xe0\x36\xf2\x2a\x2b\x05\x12\x19\x3b\x0c\x0f\x38\x01\xe0\xa0\x20\x8e\xef\x24\x5c\x9e\x51\x93\x52\xd2\xb0\x09\x63\x82\xf2\xcb\xa0\x6e\xb2\xa0\x1d\xac\xf6\x19\xea\xbb\xc8\x83\xc5\xd4\xf2\xfd\x7c\x34\x23\x17\x9c\x0f\x5f\xfd\xaf\x8c\xaf\xff\x5c\x46\xb3\x4a\x09\xc3\xc5\x0e\x29\x49\xc0\x60\x00\x20\x7d\x70\xd3\x7d\x65\xa7\x43\x07\x5f\xdc\x2b\xe6\x2d\x41\x2a\xa6\x3e\x36\x37\x06\xca\x90\xe6\xef\x44\xe1\x52\xea\x4d\xc5\xc2\x89\x3e\xcd\x08\xd7\x96\xd4\x1f\x17\x22\x54\xc3\xd1\xd1\x4b\xb0\x67\xb5\x3a\x08\x97\xbb\xd7\x3c\x99\x54\xd9\x64\x8b\x2a\xf1\x0d\x9c\x27\x03\xe3\x8b\x6c\x62\x46\x9f\x6f\x95\x8a\x1c\xa0\xa3\x20\xc1\x23\x39\xe9\x0c\xf7\x68\xc8\x7b\x47\x38\xc2\x19\xf8\x09\x3b\xff\x4c\x2c\xfd\x29\x45\x9f\x6d\x32\x81\x34\x93\x78\xe9\x15\xa3\xb0\xe7\x24\xc7\x4d\x2b\xd7\xa8\x51\xac\x7c\x6b\x48\xe8\xaf\xc7\x12\x4f\xdc\xbc\xab\x5f\xf8\x0d\x1d\xee\x30\xa6\xc0\x24\xcb\x43\x31\x97\x23\x66\xeb\xab\x26\xbb\xb9\xf6\x08\xca\xac\x7e\x51\x91\x4d\xf0\x58\xb9\xb3\x74\x5d\x98\xc5\xd2\x7e\x97\x10\x54\x75\xec\x01\x73\x77\xe6\x31\x61\x98\xec\xe4\xec\x59\x09\xf0\x4f\xc2\x7e\x7b\x38\x2e\x66\xad\xb6\x2a\xc8\xa9\x77\xf3\x76\xfd\x5d\xae\x43\x4f\xb5\x51\x75\x24\x9c\xa1\xab\x6b\xb0\x2d\xec\x06\x96\xf0\x89\xbe\x34\x54\x88\x7a\x0c\x32\x36\x1d\x17\x2b\xd2"}, +{{0x88,0xa2,0x4f,0x0d,0xf3,0xae,0x29,0x14,0xdf,0x79,0xda,0x50,0xec,0xf8,0xec,0xb4,0x2f,0x68,0xc7,0xba,0xad,0x3b,0x6c,0x3a,0x2e,0x0c,0xc9,0xc2,0x5d,0x09,0xd1,0x42,},{0x12,0xe6,0x60,0x3f,0x71,0x3b,0x23,0x05,0x35,0x85,0x68,0x71,0x00,0x18,0x68,0x5e,0x14,0x15,0x53,0xc4,0x75,0x91,0x39,0x6f,0xb4,0x25,0x9e,0x42,0xdc,0x53,0xb9,0xc9,},{0x17,0x07,0xcc,0x00,0x91,0x86,0xbf,0x3f,0x03,0xf7,0xbb,0x9e,0x3c,0xd4,0xcf,0x6b,0x73,0x7b,0x7a,0x6b,0xaa,0xde,0x7f,0xc6,0xc3,0xff,0x5c,0x12,0x25,0xdb,0xb2,0xba,0xf5,0x4f,0x47,0xc8,0x5e,0xaf,0xa1,0x32,0xc3,0x1e,0xac,0xa0,0x3e,0x6a,0xec,0x14,0x47,0x73,0x3f,0xac,0xd3,0x71,0x49,0xb7,0xc6,0xcf,0x0c,0xd4,0x1f,0x61,0x14,0x04,},"\x65\x4e\x9e\xdc\x69\xfe\x63\x4c\x23\x08\xba\x8c\x46\xa9\x55\xe8\x82\x45\x62\x86\xea\xe3\x59\x3c\xae\x73\x9c\x44\x86\x6c\x0d\xe9\xed\xcb\xbf\x0d\xb1\xc4\x41\x49\x66\x84\x67\x70\x9d\xc9\x70\x62\x98\xdd\x2e\xac\x33\x01\xda\xba\xd5\xbd\x8e\x93\xc5\xe8\xa9\x3f\x19\x4e\x0f\xc1\xd9\xf3\x76\xc1\x44\xc2\x93\xae\xfd\xa0\x86\xb2\x21\x8f\x2e\x9d\xfd\x7c\x2d\xc5\x2b\xa3\x3e\xb2\x29\xdc\xf7\xbb\x68\xce\x0f\x87\x6c\x5f\xd4\xe8\x1a\xfd\x80\x16\x9f\x73\xcf\x26\x4e\x5d\xc0\xce\x16\xe1\xb8\x76\xcd\x11\xc7\xad\x89\x05\x8e\xe0\x82\x0c\x40\x00\x5d\x01\xf1\x19\xf8\xbe\x6f\x1a\xfb\xe2\x4c\xa4\xae\xdc\x18\xe9\x78\x96\x82\x7c\x3e\xd6\x7f\xc4\x56\x30\xe7\x90\x3b\x7f\xee\x9c\x99\x0e\x36\x19\x37\xbf\x4e\xa0\xa4\xd8\xd1\x6c\xf6\xd9\xcf\x03\x81\xe9\x06\x5e\x36\x25\x14\x8f\x8a\xe0\x49\x1a\x03\x41\xd0\xff\x9f\x72\x7b\xe1\xf3\x10\xca\x1e\xc3\xf0\x10\x4a\xa0\x54\x32\x17\x84\xdd\x24\xd5\x3c\x98\x5b\x28\xd4\x40\x82\xf8\xe1\xc1\x08\xa4\x41\x09\x63\x8f\xf5\x11\x6e\xdd\x85\xae\xb8\x6b\x6e\xa5\x12\xa1\x9b\x60\x2e\xdd\x9d\x21\x10\x70\xd0\x44\xaf\x5b\xed\xb6\xc8\x52\x7b\xa3\x49\x1e\x34\x5b\xac\xc1\x30\xb3\x69\x60\x28\x2a\xe7\x37\xb8\x5c\x76\x92\x74\xf0\xf7\xc5\x88\xf4\x0e\x66\x25\xb2\x36\xbd\xc1\xa3\xb8\x73\x20\x46\x0e\xee\xad\xa2\x78\x12\x4b\x56\x68\x87\x4f\x39\xf5\x9c\x2e\x6a\xa2\x08\xc3\xb6\xa9\xb8\x45\xc4\xd0\xa2\x7a\x05\x46\x78\x6f\xa1\x3e\x51\xcc\x98\xb7\x3f\xd7\xee\x32\x7b\x62\x15\xec\x6b\x62\x9f\x4c\xc7\xe4\xbd\x3c\x0a\x3d\xb7\x8a\x21\xff\xfe\x24\xc7\x04\x38\x71\x6b\xc3\x7b\x8d\xa7\xc5\xff\x7c\x36\x88\xa9\x03\x39\xc2\x2e\xb5\x0b\x7c\x2c\xd3\x6b\x68\x83\x1f\xd5\x93\x91\x75\x68\x9b\xd3\xe2\x2c\x38\x81\xaf\x33\x7e\xe1\x44\x35\x70\x9e\x35\x10\x40\xef\x3d\xa9\x55\x72\x4e\x51\xc2\x4a\x5e\x2c\x09\xf8\x91\x80\x83\x93\xfb\xf8\xef\x7f\x1f\x5f\x02\x98\xde\xeb\xdc\xd8\xd6\x66\xcb\xcf\x3e\x86\x6c\x71\x89\x99\xab\x6b\x1f\xee\xc9\xc4\x7e\x02\xe7\xd6\x35\x40\xf8\x99\x63\xd5\x42\xc5\xd0\x1f\xb6\xfc\x30\x76\x89\x68\xae\x81\xb2\x0c\x35\x4b\x40\x00\xc1\x32\x77\x47\x64\xd6\xd4\x43\xad\xd6\x4f\x6d\xd7\x48\xf5\xfb\x5b\x7f\x6e\xba\x40\x1d\xb4\x31\x8b\xe9\x93\x98\x9f\xcc\x25\x77\x96\x1f\xa5\xad\x31\xf6\xa2\xa9\xd6\xa7\x55\x28\x58\x65\xcd\x5d\xc3\xa8\x8c\xfb\x5a\xba\x7d\x92\x3b\xaf\x78\xb5\xd1\x31\xb4\xc2\x14\xdf\x55\xb6\x17\x1f\x45\x20\x9e\x21\xca\x66\x45\x49\x0d\x3a\x36\x44\xdd\xa6\xdc\x92\x9c\x7c\x40\x95\x76\xd3\x71\x64\x75\x5e\xf8\xaa\xf3\xdc\xd4\xd2\x27\x75\xee\x7d\xea\x0e\x56\x5b\xd5\x47\x27\x92\x1c\x64\x9b\xc5\x1f\x20\xc1\xf6\x8c\x1f\xde\xac\x45\x5c\x67\xd7\x1a\x1c\xb8\x83\x7f\x46\x91\x44\x8b\xf0\xbf\x04\x4a\x46\xf1\x68\x5f\xbe\x22\xb1\xe0\x18\x77\xf7\x47\x7d\x34\x99\x40\x8c\x4c\x31\x65\x10\xce\x2e\x55\xb9\x80\x05"}, +{{0x18,0x4d,0x0c,0xe2,0xe9,0xdb,0x7f,0x25,0x7a,0x8b,0xf4,0x64,0x6d,0x16,0xd2,0xc5,0xef,0xc2,0x70,0x2c,0xed,0x02,0x6b,0x69,0x06,0xd3,0xc8,0xc0,0x11,0x8f,0x22,0x61,},{0xe9,0xda,0xb8,0xfd,0x9d,0x94,0xdc,0x9b,0x24,0xcc,0x79,0xc6,0x35,0xcc,0x57,0xce,0x66,0x51,0x89,0x82,0xba,0x3e,0x24,0x47,0x24,0x07,0x41,0xba,0xc0,0x73,0x0e,0xc5,},{0xb1,0xe3,0xbf,0x5f,0xa7,0x4d,0x7e,0x44,0x2c,0xed,0x9a,0x98,0xd9,0x27,0xd8,0xc4,0x5e,0x0e,0x64,0xd8,0x74,0xf8,0xea,0x59,0x20,0xa3,0x60,0xa4,0xbf,0x42,0xd8,0x3c,0xe1,0x8a,0x92,0x4a,0xc7,0x96,0xe1,0xa7,0x7d,0x1b,0x02,0x08,0x29,0x4b,0x50,0xf8,0x22,0x17,0x7f,0xdb,0xdd,0x45,0x8c,0x74,0x35,0x6f,0xcf,0x6b,0xd7,0x94,0x51,0x06,},"\x6a\x9b\x87\x6b\x0b\xf4\x18\x9b\x3c\xc1\x5f\x9e\xb4\xfb\xe7\x93\x2b\x55\x77\x89\x2a\x22\x20\x0c\xe1\x07\x15\x68\x53\xd6\xd3\xca\x36\x3f\x02\x5a\xd7\xa2\xd8\x62\xaa\xdc\x74\x2d\x94\x15\xbd\x8d\x1f\xca\x13\xc9\xdc\xa3\x58\x60\x44\xe5\x5a\x8c\xf5\xde\xe1\xce\x56\x45\x76\xe3\xe8\xe3\x65\x54\x05\x46\x50\x1b\x34\xca\x67\x5c\xf2\x00\xe0\x77\x1a\x81\x8c\x73\xd3\x7f\xcd\xa8\xcb\x15\xe4\x8d\x5a\x0b\x9e\xa3\xbe\xec\x0f\xf6\x61\x0b\x2a\x8a\x21\x4c\xa4\xf7\xef\xac\x0e\x71\x38\x10\x52\xd9\xbf\x3c\x00\xc3\x29\x59\x34\x74\xeb\xd0\xa6\x87\xa0\xb4\x1d\x14\x4b\x5e\x7a\xb1\x41\x2b\x97\x0a\x74\xba\xba\x4d\x27\x4b\xb0\xdb\xfd\xb0\x2b\x11\xf7\xf6\x39\x64\xba\x6f\x3b\xa0\xad\x23\x34\x1d\x08\x3b\x91\xa4\x30\x82\x39\xe3\x3d\x50\x82\x43\x96\x12\x65\x88\xde\x72\xa2\x39\x0c\x1c\x0f\xc0\x67\x47\xc2\x87\x72\xf6\x30\xbf\x4d\x14\x3f\x7a\x11\x59\xf0\x28\xc0\x93\x40\x48\x94\xe6\xd1\x6f\x63\x46\x35\xd4\xfc\x33\x0f\x3d\x7a\x73\x13\xef\x75\x6f\x5d\x49\xd8\xf6\x20\x5e\xb1\xc7\x92\xa9\x49\x5d\xa1\x31\xb4\x33\x45\xa0\x09\x0c\x12\xca\x56\xe6\xad\xac\x5b\xe0\xcb\xca\xc3\x60\x9d\x69\xf7\x24\x15\xf6\xc3\x7f\x3c\xfb\x2c\xf7\x6b\x3e\x65\xf3\xc9\x3a\xc9\x2b\x63\xf2\xba\xa4\x66\x24\x90\x75\xbc\xa6\x9d\x4c\x1d\x1f\x3a\xde\x24\xab\x31\xef\xfc\xb9\x04\x69\xc2\x4b\xb4\x10\xab\x47\x23\xe1\xb7\xe1\xc8\x8b\x3a\x36\x43\x35\x63\xf7\x1a\x99\xaa\xd5\x8f\xe8\x05\x68\xf9\xc1\x02\xda\x89\xba\xd9\x79\x63\xe7\x7d\x66\x22\x48\x31\x66\xf3\xae\x26\x1f\x32\xa5\x2a\x86\x10\x1e\xbd\x64\x5f\x61\x42\xc9\x82\xe2\xcd\x36\x25\xcf\x8b\x46\xb9\xb2\x89\x12\x46\x92\x0f\x69\x7f\xca\xed\x39\x7c\xb9\x22\xc2\x74\x94\x51\x67\xa0\xe6\x19\xb0\xb5\x06\x37\x76\x06\xdb\x04\x57\x83\xb0\xb8\x8e\xa0\x4e\x93\x2d\x21\xff\xc0\x64\xa1\x2a\x40\xeb\xe9\xb4\x80\xf1\xa2\xc7\xdd\xd3\x95\xa9\xb1\x5e\xfd\xc4\x95\xc9\x71\x4f\x36\xfa\x99\x6f\x79\xf8\xeb\x8e\xfa\x52\xd9\x9a\x24\xab\xfe\xf4\x3b\x32\xa2\x37\xc5\xbc\x00\x18\xda\x3b\x16\x2f\x59\xb8\xd3\xd4\x74\xe2\xce\x08\xfa\x80\x24\xc5\x8a\xcc\x0a\x99\xff\x61\x4e\x6c\xd7\xfd\xd9\xca\x4e\x8f\x41\xa1\x44\x9a\xa6\x18\xd0\x33\x37\xe8\xa3\x74\xd5\x60\x55\xb2\x07\xa9\xdb\xe6\x9f\x59\x48\xf9\x01\xca\x7d\xb0\x41\x0f\x01\xaa\x37\x3d\x9e\x02\x27\x62\x35\x99\xbc\x21\x28\x45\xb0\x06\xe9\x42\xfa\xbc\x58\x2c\xd7\x26\xdb\x5c\x44\x3e\xb2\xdf\xfb\xc9\xe3\xe7\xf0\xe5\xcb\x67\x44\xf7\xad\x71\x60\x50\xfd\xf2\xc6\x0c\x7c\x77\xc2\x53\xab\x74\x5d\xb9\xc8\x55\x26\x55\x68\x3e\xa7\xea\x68\x0a\xa4\xaf\x34\xdf\x13\x25\xc2\x9b\x88\x74\xb6\x1b\xe2\x3d\xe4\xff\xba\x25\x42\x4f\x46\x19\xec\x68\x2c\x26\xb3\xa6\x7b\xda\x9b\xc4\xc9\x4b\x79\xa9\xfc\x4d\x82\xd3\x40\x49\x5b\x43\x7a\x1c\xbd\x6b\x60\x30\x7c\xfc\xb1\x00\x26\xf9\x64\xa0\x17\x62\x3e\x33\xdb\xf2\x33"}, +{{0xd0,0x2b,0xbf,0x70,0xd5,0x13,0x51,0xe3,0xb4,0x7a,0xd8,0xe5,0xed,0x26,0x3d,0xbf,0x55,0x6d,0x14,0x98,0xfa,0x9b,0xd5,0xdb,0xd9,0x9f,0xb4,0x26,0x90,0x09,0xdc,0xed,},{0x8c,0xe4,0xb5,0x9f,0x94,0xce,0xd6,0xec,0x96,0x14,0xd6,0x7d,0x30,0x66,0xd9,0xd3,0xa0,0xdf,0x7a,0x46,0xb3,0x7b,0x4c,0x17,0x25,0xef,0x1e,0x57,0xbc,0x68,0xa0,0xd1,},{0x6e,0x7c,0x66,0xac,0xc9,0x54,0xff,0xd9,0xdd,0x4c,0x1c,0x63,0x35,0xab,0x4f,0xe7,0x9d,0xbb,0xed,0x78,0x2c,0x4a,0x47,0xec,0x30,0xd8,0x48,0xd8,0xbb,0x2b,0x4f,0x10,0x69,0xdc,0x62,0xe5,0x22,0xa1,0xe8,0x01,0x7f,0x54,0xa6,0x34,0x5e,0x17,0x28,0xc0,0x73,0xaf,0x64,0x47,0x85,0x6d,0x8c,0x1e,0xd3,0x58,0x78,0xb5,0x71,0xe5,0x23,0x0d,},"\x55\x45\x60\xf7\xa7\xfd\x1a\xe7\x75\x8a\x2f\xce\x7d\x78\x0f\x6b\x3f\x04\x3d\x3a\xf8\x9d\x4f\x19\xef\x57\x3c\x34\x99\x75\x54\xdf\x24\x3f\xaf\x2a\xaa\xb6\x5b\x2a\xfd\xd2\x86\x10\xd4\xa5\x1e\x9a\x4b\x46\x4d\xb6\xdb\x09\xeb\xf7\x3b\x7d\x24\x05\x4c\xc9\xb1\x28\x14\xbb\x29\xee\x99\xe1\xa7\x3b\xd6\x03\x89\x83\x60\xf9\xdc\xf0\x1e\x67\x08\x36\x28\x6f\x82\x36\xed\x8c\xef\x07\x5f\x3d\x56\x33\x12\xc1\x6c\x73\xfc\x37\xee\xdf\x25\x2f\x8f\x42\xd3\x0a\x13\xe7\xfb\xa3\xb1\x65\x23\x8c\x7f\x81\xea\xae\xb5\x31\x90\xf3\xec\x3b\x5d\x63\xf0\xee\x03\xe3\x98\x7e\x39\x0d\x1d\x81\xe8\x27\x7e\x9f\x6c\x1e\xe6\xec\x4e\xc3\xfa\x0d\x72\x0e\x9f\x53\xf9\xc2\x6f\x04\xaa\x2e\xd2\xb5\xef\x31\x60\x89\x59\x99\xea\xce\x29\xcf\x5d\xc2\x54\xad\x71\x10\x6b\xb7\xe8\xbc\x29\xa5\xb1\xd2\x41\x25\x93\xd0\x81\x94\xe8\x8e\x16\x59\xa7\x31\x59\xa2\xa2\x20\x33\xab\x06\x6e\x8d\x3d\x8c\x3b\xc8\x6b\x7b\x01\xde\x81\xa8\xc6\x60\x47\xb0\x7f\xe2\x4e\xd2\x40\x31\x8b\xa3\x7b\xa3\xef\xb6\xcf\x63\x26\x04\xca\x4f\x44\x6a\x75\xfd\x8e\x70\xc4\x53\xf0\xc6\x0e\xe1\x6e\xca\xf5\x24\xe7\x03\xf4\x7d\xf5\xc2\x82\xca\x32\x89\xb3\xaf\x61\xde\xe4\x70\x9e\xe0\x85\x32\x3b\x1e\x5c\x8a\x6b\xc0\x76\x62\x01\xc6\x35\x03\x14\x46\x89\x1f\x34\x94\xe9\xdb\x20\xdd\x4e\x9e\x08\x38\x24\x9a\x67\xe1\x38\xd1\x3e\xe2\xc9\x6f\x61\xe7\x71\x06\x15\x42\xaa\x16\xef\x20\xd8\x1e\x3a\x0f\x4e\x45\x21\xa6\xcd\x6c\x92\xfc\x26\xfe\xef\x03\xb6\x6c\x70\xe0\x35\xca\xfc\xc1\x9c\x96\xfb\x9d\x82\x91\x8f\xe1\x97\x78\x0e\xff\x0e\xda\x6e\x25\x12\xc5\x6e\x2a\x73\xd7\x70\x32\xb7\x68\x91\x9b\xea\x97\x72\xf5\x98\x9c\x8b\x6c\x65\xc3\xd1\xe9\x7a\x21\x80\xcc\x3a\x37\x57\x9d\xa7\x0c\xe9\x80\x6a\xc1\x28\x5a\x3e\xab\x41\x5c\x06\x07\xd8\x8c\xb8\x65\x42\xea\xb9\x0b\x9d\x2d\x67\xfa\xff\xfc\xad\x23\xa7\x14\x00\x0e\xe5\x9e\xd6\x8c\x95\x6e\x81\xc4\x45\x42\x88\x82\xf9\x7a\xf7\x4d\xb3\x62\xe4\x5c\x0d\x1b\xd8\x85\x6e\xed\x16\x6e\x4a\xec\x4b\xfd\xf9\x5e\xad\xb2\x51\xe2\xa1\xef\x80\x48\x52\xa9\xea\x77\xd3\x45\x77\xfe\x70\x83\x1a\x92\x8b\x10\x1b\x60\xac\x61\x3e\x7b\xa2\xe6\xba\x0a\x94\x01\x3a\x64\xc2\xf8\x21\x9f\xd3\x0b\xff\x40\x90\x99\x66\x7a\x78\x6f\x99\x32\x7b\xb0\x3e\x2f\x21\x87\xf4\x45\xb4\x6b\xee\xda\xb6\xd3\x25\xaf\xd9\x04\xe3\x95\x43\xe9\x3f\x4b\x6c\x54\x43\x24\x9d\x74\x4b\x2d\x1a\x43\xe1\x41\xe4\x76\x8b\xd4\x0a\xab\xe4\x05\x72\x44\xe1\xea\xdd\x9d\xae\xc1\x75\x71\x9e\x51\xa0\x93\xac\xe3\x2f\xe8\x2b\x2e\xac\xb5\xec\xb0\xda\x6c\x1f\xfe\x98\xc8\xce\xe7\x88\x6e\x30\x16\x70\xdf\xf8\x71\x13\xef\xed\x42\x82\x47\x1a\xfb\x6b\x8a\x0f\xdb\x50\x5e\x2e\x8e\x7d\xbc\x1a\x08\xa2\x2e\x96\x80\xbd\x09\x8b\xf1\x27\x58\x02\xbd\xb4\x59\x41\x3a\x3b\x23\x7d\x77\x13\xa1\xbb\xf5\x97\xe6\xad\xf2\xb6\x0e\xaf\x82\x37\x91\xb3"}, +{{0xaa,0x0f,0xda,0xe2,0xa5,0xa4,0xc9,0xc0,0x45,0x21,0x91,0x30,0x04,0xcd,0x89,0xef,0xbc,0x88,0xb2,0xda,0xdf,0x5a,0xbb,0x24,0x6f,0x3c,0xa7,0xf6,0x92,0x35,0x44,0xaf,},{0xbf,0xfc,0xb1,0x7c,0x35,0xc1,0x30,0x4c,0xdd,0x9d,0x62,0x4f,0xf6,0x9b,0xee,0x60,0xec,0x7c,0x9e,0xc3,0x27,0xd1,0x23,0x50,0xd7,0x0f,0xac,0x12,0xb4,0x7c,0xc2,0x5c,},{0xf9,0x37,0x29,0x89,0x69,0xca,0x34,0xd9,0x75,0x84,0x44,0x89,0x07,0x35,0x8b,0x0f,0x47,0x84,0x1f,0x30,0x23,0xaf,0xc7,0xef,0x76,0x81,0x52,0x1c,0x5b,0xe0,0xf5,0xe5,0x62,0x8a,0x8f,0x60,0x7e,0x2f,0x31,0x63,0x6e,0xf6,0x36,0x46,0xb0,0xe9,0x89,0x8a,0x72,0xad,0x35,0x57,0x06,0xd2,0xc8,0x06,0x0f,0xbc,0x64,0x0e,0xfb,0x3d,0x66,0x05,},"\xb1\x41\x84\xcf\xdc\x4a\x5f\x0c\x7f\x83\xf9\x4a\x83\x2f\x58\x85\x07\xe2\xd7\x2a\x89\x32\x98\x70\x07\x85\x71\xd2\x08\xa0\xc4\x96\x0c\x2f\xdc\x4c\x23\x6c\xf8\x82\x29\x98\x1d\x12\xb1\x0a\x1b\x68\x84\xc8\x65\x0d\xda\xf1\xd4\xb2\xeb\x98\x15\x75\xb1\xe0\x19\xfe\x3f\x60\x42\x36\x76\xf8\x85\x6a\x99\x2c\xce\x36\xd6\xd0\xa3\xd0\x26\x63\x1c\x8c\x1e\x1f\xfe\x34\x13\x4b\x29\x6f\x40\x84\x2b\x6d\xf4\xf8\x6f\x83\x3e\x01\x75\xba\xe5\x0e\x86\xbf\x85\x6d\x1e\xe7\x99\x25\xf4\x34\xb8\xbf\x2c\x84\x51\x9f\x1f\x5d\x25\x38\x60\x49\xce\x3c\xa6\x17\x77\xe3\x0b\x70\x0a\x60\x2d\x39\x52\x50\xb6\x0f\xc6\x4a\xc6\xf8\xdb\x02\x7e\x8d\xa8\xb9\x55\x0f\x24\xed\x11\xa1\x1d\x9f\x9f\x9c\x5e\x0a\xf1\x45\xb8\x65\x97\x51\xac\x6b\x55\x86\x1f\x63\x88\xa6\x43\x36\xb3\x1e\xfe\x45\xc0\x80\x2d\x76\xa5\x34\x86\xa8\x1e\xba\x07\x31\x4b\x4d\x96\x1c\x14\x1a\xb3\x4e\x2f\x76\xed\xac\x0e\x6d\xe3\x14\x22\xdf\x79\x2a\xf0\x81\xe7\x69\xc7\xed\x05\xda\x9a\x5a\xf2\xfd\xf3\x6f\x14\x17\x69\x90\x8b\x70\x09\x37\xf0\xe1\x06\x8c\x13\x1f\x17\x6e\xb9\x6c\x67\xaf\xdb\xe7\x8f\x40\xd8\x60\x07\xfb\xcd\x47\xe4\x9e\x2e\x4c\x4c\xe0\x49\x93\x6a\xdf\xf1\xce\x3e\xac\x42\xb9\x6b\x34\x29\xb5\x62\x6b\x1a\xa6\x2a\xcd\xe0\x7f\x45\xa1\x3c\xe1\xbd\x21\x1f\x32\xbd\x7e\xfe\x47\x90\xc8\x37\x1e\xbf\x87\xc1\x64\x47\x7a\x5c\x9f\xa3\xe7\x8c\x2f\x88\x07\x7b\x09\x73\x44\xcf\xfa\x03\x1c\x44\x29\xc7\xf4\x2d\xca\x07\x73\x78\x50\xee\x7a\x76\x9b\x36\xd0\xf0\x62\x5a\xdf\x12\x0e\xa2\x3f\xf4\xe3\x93\xa4\xfd\xcb\x65\x58\xdb\xf9\xb2\x66\xa0\x32\xe3\xb0\x59\x9b\x9d\x66\x92\xfc\xeb\xd8\x15\xa3\x89\x76\x07\x85\x63\x25\xfc\xd0\x11\x5d\xc3\x10\xdb\x3a\x87\x92\xfb\xeb\xd3\x99\x49\x4c\x83\x71\xe5\x85\x72\x7b\x3d\x63\x24\x14\x49\x68\x93\xd0\x38\x13\xba\x1f\x99\x66\x1b\xce\xb9\xdc\x18\xec\x5d\xc2\x7f\x52\x67\x03\x18\x68\x77\x69\xfc\x67\x8d\xdc\x7e\x40\x22\x7c\x20\x05\x22\x01\x3f\x5c\x0e\xec\x0e\x47\x81\xe6\xfc\x15\x3a\x0c\x2f\x4f\x3f\x95\xe5\x17\xc8\x41\x99\x24\xab\x39\x99\x2a\xf8\xc1\x94\x65\x05\x7f\x13\x44\x86\x69\x6b\xa7\xfd\x46\x51\x76\x8b\x4e\x74\x9e\xf3\x6f\x02\x44\x46\x17\xcf\x97\xf0\xa4\x23\xe4\xc1\x3b\x7b\x66\xba\x2b\x6c\x45\x68\x78\xb0\xb5\x0c\xe2\xee\x5e\xc5\x64\xed\x88\x54\xf7\x82\xaa\x1d\x1c\x6a\xa7\x60\xf2\x52\x2c\x7d\x97\xb9\xb1\xab\xe0\xba\x81\x09\x59\xd7\xaa\x40\x3a\x99\x37\x5a\xa3\xe3\x9a\x11\x5d\x1f\xc6\xfe\xdd\x00\x2f\x38\x30\xa5\x0a\x83\x7d\xc7\x20\x32\x9e\xc0\xc7\x3d\x5b\xfd\x50\x03\x85\xc7\x36\x83\x82\x87\xe1\x92\x01\x52\x5d\x18\x9c\x3a\x08\x4c\xd5\xa3\xf3\x59\x87\x5e\x3b\x83\x25\x28\x9c\xed\x18\xb6\x3b\x00\xff\x9c\xd0\x70\xc3\xe6\x74\x44\xbd\x3d\x83\x46\x17\x40\x85\xcc\x45\x13\x5c\xaa\x0c\x67\xb3\x22\x6e\x4a\x52\xe9\xa1\xc5\x5a\xed\x7e\xc5\xfa\xde\x6b\xf1\x6c\x19"}, +{{0x71,0x62,0xfe,0xf0,0xac,0xa4,0x97,0x4b,0x09,0x4a,0x6a,0x08,0x05,0x43,0x95,0xf8,0x77,0xff,0x94,0x33,0xf1,0xe3,0x3e,0x20,0xe8,0x8e,0xaa,0x90,0xf9,0x38,0x99,0x7d,},{0xa2,0x80,0x64,0x0f,0x13,0x9f,0x45,0xc3,0x5a,0x48,0x71,0x53,0x7e,0xef,0xe6,0xef,0x9d,0xb0,0x2d,0xe7,0x85,0xee,0x9f,0xd5,0x4f,0x80,0x5f,0xb5,0x7d,0x37,0x46,0xef,},{0xae,0x16,0x1c,0xce,0x95,0x40,0x33,0x84,0xb6,0x5c,0x6b,0xc9,0xb3,0x93,0xeb,0x07,0x25,0x64,0xc3,0x5f,0x3a,0x6c,0x04,0xfa,0x51,0x7a,0xb0,0x68,0xbc,0xd2,0x37,0x67,0xcc,0x0c,0x8e,0xdd,0x92,0xb1,0xa1,0x3a,0xe9,0xa9,0xce,0x48,0x64,0x13,0x7f,0xb8,0x9c,0x1f,0x37,0xb7,0x48,0xcf,0xc9,0x13,0x4b,0x67,0x41,0xba,0x1b,0x22,0x28,0x0d,},"\xc9\x0f\x45\x0b\xda\x1c\x6e\xfd\x8d\x12\x78\xde\xbd\x7a\xe0\x3e\x2e\xac\x27\x40\xa5\xa9\x63\xfc\xf9\x6c\x50\x4e\x31\xd4\xd6\xfc\xc5\xe2\xb5\x2a\x25\x18\xd2\x74\x1c\x55\xe9\x59\x18\x67\xb2\x42\x32\x28\xf9\xc1\x9f\x33\xc6\xf3\x87\x05\xc6\x20\x36\xd4\x80\xff\x53\xdf\x12\x07\x7e\x38\xfd\xb0\x73\xc6\x73\x10\x5d\xa1\xe1\x16\x19\xba\x53\x21\xa7\x1b\x5f\x49\x93\x23\x4a\x11\x94\x8e\xa1\x10\xcf\xa2\x42\xbc\x23\xfa\xc9\xaa\xe4\x62\x60\x6e\x39\x64\x1c\xa7\x14\x7e\xeb\xba\x1e\xec\x55\x3f\xce\x94\xe5\x3e\x4e\x01\xb0\x73\xdd\x78\x0a\x2f\xf6\x78\xb3\x15\x72\xca\x11\xee\x08\x77\xe7\x56\xbc\xdb\x66\x53\xe5\xe1\xb4\xcb\xfb\x56\x9a\x9d\x60\xe3\xee\x33\x61\x82\xdc\xb9\xb2\x5d\x1b\xe6\xdb\xf9\xb5\xc7\x14\x6d\x77\x55\x85\x83\x4c\xab\xde\x02\x78\xae\xe5\xd5\x7c\x85\xe9\x83\xf8\x4d\x88\x33\xa9\xe1\x5b\xcc\x11\x19\x8e\x1c\x1d\xa6\xba\x59\x28\x21\x29\xf1\xdb\x96\x6f\x54\x60\xc8\xfb\x65\x30\xfb\xc3\xa9\x8a\x31\xfc\x0f\x4e\x9b\x33\x73\x66\xee\xc1\xdc\xe1\x08\xc8\x26\xd4\x90\x45\xab\xfa\x12\xee\x88\x79\x7f\x08\xf0\x68\x3f\xef\x77\xed\xaa\x35\x43\xb9\x1c\xb1\x18\xe4\x24\xd9\xc4\x08\xda\x54\x74\x31\x12\x51\x07\xd9\xb0\x74\x4c\x24\x43\xce\x99\x17\xe1\xe3\x28\xd8\x18\x50\xba\xbb\xc9\x4d\x92\x0a\x1d\x06\xe5\x24\xdb\xb6\xc2\x3d\xd8\x2e\x17\x87\x82\x2d\x71\xc4\xcd\xc4\x09\xae\x85\xba\x4d\xeb\x58\x1f\x93\x47\x48\xf7\x5e\x7a\x76\x9b\x9d\x68\xc4\x58\x9e\x59\x4e\x65\xcb\x6c\x8f\x49\x03\xff\xba\xbd\x5a\x32\x6e\x89\x44\x1a\x54\x2f\x8a\xc2\x64\xcc\xc6\x4e\x95\xa8\x98\x2a\x71\x0b\x6c\x56\xff\x7d\x10\x91\x6a\xfc\x40\x9e\xa8\xa4\x1b\x74\x67\x9d\xd6\xa7\x66\xf5\x9c\x52\xb9\x30\x5b\xa7\x33\xb1\x3c\x9e\x81\x1e\xe1\x30\x83\x92\x5f\x42\x00\x68\x2b\xd0\x5d\xea\x33\x95\x32\x52\x29\x70\xaa\x14\x9d\x00\x4a\x2e\xa2\x0f\xf4\x61\xe9\xec\x0f\x3b\x62\x56\x5c\x1a\x10\x62\x59\xc8\x36\x60\x5c\xc2\x7c\xad\xc9\x51\x5c\xb9\x97\x9e\x89\xaf\x28\x7c\x02\x7d\x75\xed\xbf\x87\xd5\xcf\xf6\x3a\x7f\xec\x9b\xd1\x0e\x78\x77\xab\x9b\xf8\x68\xd7\x34\xbd\x3a\x23\x74\xce\xf7\x02\x5c\xc4\xda\xb7\x10\xe2\x54\x80\x66\x85\xa1\x36\xec\xd0\x3e\x36\x77\x03\x46\x51\x3a\x15\x14\x5b\x89\x0e\xee\xf4\x7b\x80\xea\x08\xe4\x6c\x81\xd2\x02\xe5\x33\xe9\xa0\x6a\x38\xa6\xf7\x6e\xf5\x7a\x9c\x73\x6e\xc7\x8d\x00\xb8\x08\xe3\xff\xd9\xc7\x9b\x9d\xc7\xa2\xe5\x89\x90\x76\x56\xc9\x32\xab\x8a\x8b\x57\xda\x1a\x49\x5b\xa7\x45\x20\x15\xe7\x92\x4b\x52\x69\xab\x1f\x67\xbd\xb4\x3a\x35\x83\x14\x87\xab\x90\x02\xf5\x2d\x78\xb1\x34\xcd\x37\x51\x92\x5a\xaa\xb0\xb4\x5c\x8e\x6b\x0f\x2b\xf0\xcc\x9a\x46\x59\x31\x71\x08\xfb\xa9\x13\x6a\xab\xb0\x92\x1a\x58\xfb\xb9\xb5\x0e\x51\x24\x3f\x9b\x53\x18\x47\xdc\x96\x57\xe9\x6f\xba\xf7\xaa\x69\x8f\xe6\xfe\x44\xf9\x05\x90\x14\x4c\x70\x33\x72\x50\xc5\x8b\xc5\xdd"}, +{{0xde,0xa1,0x80,0xc9,0x1b,0x53,0x3a,0xaf,0x73,0x6b,0xc5,0xd3,0xc8,0xe4,0x74,0xd5,0xe5,0xd4,0x75,0xb7,0x5b,0x92,0xcd,0xe6,0xbd,0x1d,0x10,0xf3,0xb8,0xf5,0x5a,0xd4,},{0x30,0xb2,0x0f,0xb3,0x20,0xb0,0x0e,0x77,0xc4,0xe0,0xa8,0xeb,0x37,0x30,0xaf,0x3c,0x0b,0x1c,0x5f,0x5e,0xd9,0xee,0x2b,0x05,0x62,0x70,0x7e,0x4f,0x55,0xc4,0x93,0x8b,},{0xd0,0x83,0x33,0x3f,0xb8,0x4e,0x79,0xc9,0xb3,0x3e,0x55,0xe8,0x19,0x2d,0x57,0x1f,0xfc,0x8d,0xc5,0x07,0x45,0xb6,0xb5,0xfd,0xd8,0xc4,0x4d,0x92,0xa6,0x3f,0xd1,0x78,0xc4,0xe5,0x7c,0x2a,0xb3,0xa1,0x21,0x1c,0x0b,0xa2,0xd3,0x9d,0xa3,0x0b,0x06,0x62,0x9d,0x8d,0x1c,0xc1,0xd9,0xf2,0x59,0x32,0x63,0xd5,0x24,0xfa,0x5a,0x2e,0xbc,0x03,},"\x60\x61\x44\xb7\xd4\xf9\x6b\xef\x7f\x11\x2b\x6d\x41\xbc\xb5\x00\xd2\x13\x6c\x13\x4c\xed\xa2\x20\xe2\x4d\x0f\x15\x24\xec\xa1\x2c\x30\xf2\xb1\x02\xc7\xf3\x78\xd6\xbb\xa2\x59\xc5\xb4\xa5\xef\x8e\xc9\x30\x9d\x5c\x8d\xa7\xe8\xd2\xde\xd3\x79\x2a\xee\xea\x21\x08\xf7\x7d\x66\xb2\x30\x45\x93\x8e\xd6\x47\x51\xf2\x0d\x48\x32\x6b\xe2\xfb\x99\x62\x8c\xfb\x18\x73\xd7\xdd\x27\x58\x1c\x10\x5e\xc1\x32\x49\xa9\x52\xa5\x07\x84\xb8\xb3\x4c\xb3\xb2\xc1\xa0\x04\xfa\x8b\x62\x8a\x07\x67\xfa\x9a\xbf\x05\x8d\x95\x5d\xf8\x5d\x13\x4a\x0f\xc7\xf4\xb7\xd7\xfb\x0c\x8d\x31\xbc\xe3\x45\xdd\x0a\x42\x82\x14\x5a\xfb\x2f\xf1\x97\x51\xf2\xcc\x3a\x1c\xae\xa2\x42\xba\xaf\x53\x87\x49\xbf\x38\x80\x00\xe3\xdc\x1d\x73\x93\x59\xdf\xeb\xae\x64\xae\x1e\x10\xfb\x6f\xc1\x7c\xc9\xfb\x95\x05\x35\xc2\xde\x12\x95\x87\xa8\x68\x59\xb7\xbe\x36\xdf\xe9\xb6\xc1\x14\x1b\x25\xe0\x91\x5c\x8d\x4a\xa1\xcc\xea\xe7\x04\x6b\x3d\x7c\xfa\x94\x0b\xc9\x8d\x4d\x69\xfc\x5a\x30\xdd\xe1\xde\xe4\x2f\xb5\x27\x22\x81\xbf\x8f\x8e\x7f\x3e\x1a\x04\x39\x7f\xb4\xf3\xad\xef\xc5\x75\x32\xdd\xbd\xe3\x68\x33\xa6\x76\xe6\xf3\x9c\x82\xaf\xf6\xbf\x48\x32\xec\x97\x1e\x03\xbe\x38\x29\xc0\x2a\x20\x3c\x82\xd9\xeb\x8c\x16\x30\xee\x96\x93\xf4\x5d\x26\xf5\xf5\x1a\x31\x03\xca\x64\xd4\x68\xec\xea\xc1\xb2\x9a\xf4\xc4\x2e\xb2\x16\xd7\x6e\xc8\x99\x48\x36\xb4\xbe\xc7\x64\x89\xca\x50\x70\x68\x0c\x2c\x2e\xb4\x57\x21\x0a\x77\xc4\x7f\xdc\xbf\x60\x01\x72\x07\x3a\x53\xf1\x45\x3b\xb5\xc8\x04\x39\xc8\x82\xf0\x73\x6d\xe4\x06\x37\xb4\xf5\xab\x1f\x76\x1f\xf3\x55\xc6\xe9\xbd\x4a\xbd\xe7\x56\x0d\x5f\xc1\x13\xc8\x30\x15\x9a\x1b\x77\xc4\xe8\x7b\xc2\xc6\x98\x80\xa4\x0c\x58\x05\xec\xc8\xaa\xaf\x57\x57\x5b\xcc\xd8\x17\x7f\xc6\xb8\x35\x69\x23\x3c\x0f\x5c\xa2\x23\xac\x40\x13\xca\x10\x6c\xac\x28\x54\x70\x6a\xea\xd7\x14\xfa\x29\xf2\x86\x0a\x5f\x97\x53\x26\x8a\x36\x71\xd9\xf5\x9c\xde\x60\x48\xcf\x0b\x89\x86\x05\x0f\x7f\x54\x9e\x4f\xd7\x55\x7f\x2f\xc3\xfc\xdc\xcd\xdc\xef\xda\x58\x6a\x64\xb3\x00\x6e\x58\x25\xf2\x7c\xa3\x16\x87\xca\xf6\x63\xbd\x90\xa0\x5b\x11\x52\xd7\xc8\x8d\x7f\x10\x51\xa9\xd7\x91\x74\x86\x51\xd8\x88\xa6\xa1\x2f\x22\xd6\xc8\xc3\xf7\x8c\x2b\x86\xea\xf5\x39\x4b\x4e\xf7\xee\xfb\x89\x79\x7b\x25\xe5\x42\xdc\x93\x10\x2d\x02\x1a\x1d\x0b\xed\x6a\x7d\xcd\xd8\x10\x2b\x8f\x04\x30\xa0\xbc\x21\xd9\x04\xa3\xc9\x34\x6c\x01\x83\x43\xdd\x99\x37\xcb\x35\x25\x00\x07\xa2\x84\x82\x5d\xb0\x8e\x9a\x11\xfe\xe3\x1c\xff\x7a\x31\x4c\x48\xc4\x2d\x8b\x31\x4a\xcc\x27\x82\x2a\xf0\x3d\x19\x54\xc7\xcc\x8b\xf9\xad\x4e\x9e\x98\xf4\xad\x4e\xfb\x35\x52\x88\xda\xa8\xc9\x0d\xe9\x03\x7e\x64\xa7\x86\x1f\x5e\xe4\x3a\xda\x9f\x0f\xcc\xde\x34\xd0\xbc\xf5\x02\x88\x55\x0f\x70\x0f\x21\x5a\x79\x44\xa5\x38\x0e\x2a\x8e\x3f\x04\xf2\xb4\xf5"}, +{{0x9d,0xaf,0x6d,0xbb,0x7f,0x76,0x29,0x66,0xe7,0xa5,0x7c,0x2e,0xc1,0x99,0x6e,0x9f,0x5b,0x55,0x5b,0x98,0x66,0xb8,0xe3,0x1d,0xea,0xab,0x43,0x56,0xeb,0x13,0x81,0x6e,},{0xf0,0x21,0xb5,0x5a,0x36,0xd9,0xfb,0xfb,0xf2,0x97,0x8b,0xc0,0xdf,0x73,0x6b,0x28,0x9c,0x82,0x41,0xd6,0x43,0x53,0x09,0x84,0x1a,0x13,0x4b,0x07,0xd4,0x7c,0xe4,0xed,},{0x49,0xb6,0xbc,0x46,0xb7,0xab,0xb5,0x69,0x4d,0xa9,0x42,0x15,0xef,0xc4,0xb3,0x0e,0xea,0x04,0xae,0x2e,0x73,0xeb,0x2d,0xa8,0xe8,0xc9,0xef,0x9b,0xe2,0x22,0x24,0x98,0xb1,0x7e,0x13,0x93,0x96,0x46,0xc2,0x9e,0x32,0xd6,0x45,0x58,0x46,0x40,0x64,0x15,0x90,0xb1,0xbb,0xdb,0xfe,0x24,0xf3,0x6c,0x6f,0x69,0x4b,0xf8,0x72,0x38,0xee,0x04,},"\x54\x45\x23\x90\x0d\xaa\x67\x78\xc0\x39\x1a\xe4\x04\x4a\x51\xc0\xc4\xa5\xe4\x44\x13\x3f\xbd\x77\x47\xd5\x39\xa7\x44\xfa\x60\xab\x5d\xc5\x4e\x18\x19\xdc\x8e\x56\x89\x9c\x56\xef\xd7\xef\x3d\xa3\x41\x79\x0e\xcc\x49\x64\x5e\xf3\x25\xc6\x56\x8a\xe9\x71\xd3\x0d\x21\xbb\x7f\x23\x46\x4f\x46\xa2\x4b\x80\xd4\x9b\xb9\x3c\x6e\x91\xde\x79\xb2\x43\x31\xd0\x70\x7f\x43\xd0\x66\x5d\x01\x97\x74\x3a\xdf\xf6\x90\xd6\x15\xa1\xc9\x25\x87\x77\xfc\x47\xd0\x21\x71\x42\x42\x6a\x47\x34\x89\x2e\xb6\x22\xab\x8e\x50\xbb\x12\x8e\xc3\xa8\x95\x26\x6a\x38\x61\xa3\x97\x68\xbc\x76\x09\x6f\x58\x1f\xd0\x82\xdf\x9b\x72\x23\xe8\x5a\x8a\xfb\xdb\x5c\xaa\x49\x22\xaf\x2a\x01\x4b\xf8\xa5\xcd\x11\xe5\xc5\xea\x93\xe9\x1c\xd4\x6d\x5a\x1b\x99\xb8\x5a\x26\x70\xe3\x21\xde\x2e\x32\x25\x5a\xfd\x67\xfe\x2c\x37\xfd\x93\x2c\xac\xa2\x2d\x24\x1f\xaf\x4c\xce\xfe\xff\x58\xd6\xbd\x04\xcf\xaf\x11\xde\xdd\x29\xc8\x71\x9f\xfc\xb0\x2e\xf6\x5c\x5d\x3e\xb7\x8b\x4f\xc0\xd1\x70\xa2\xe3\x43\x2c\xc8\x12\xf0\xd0\x41\xd9\x76\x0c\x13\xc1\x2f\x7c\x7f\x2f\x84\xfe\x5e\x0f\x70\x0c\x10\xb1\xa6\x9c\xa4\x66\xa7\x0b\xde\xff\x8d\xbe\xc7\xd3\x18\xfb\x09\xdd\xd8\x27\xef\x61\xca\xa6\x91\x0b\xbc\x06\x1c\xbd\xa2\xb5\x27\xef\x2e\x59\xed\x4c\x17\x22\x99\x72\xf8\x95\x67\xd7\x05\xde\x92\x31\x92\x4b\x41\xbb\x6e\x7c\x01\xfe\x85\x42\x64\x47\x4f\xa7\x6b\x1f\x88\xcd\x57\xea\xc3\x11\x17\x1a\xf1\x03\xd2\x30\x78\x42\x4a\x12\x67\x5f\x2f\xa3\x6c\x2d\xe0\xbf\x53\xc2\x95\xfe\xeb\x31\x57\xde\x95\x89\x22\x98\x6e\x32\x51\x3d\xfa\x33\xb3\x5e\x15\xc3\x94\xa1\x1c\x0f\xcc\x55\xb8\x2d\x6d\xd0\x59\x7c\xdd\xd2\x7e\xde\x7d\xe1\x29\x85\xa6\x16\xe6\x40\x26\xbe\xfb\x5d\x69\x04\x82\xb3\xff\x22\xc0\xdd\x21\xf2\x7a\x08\x6d\x37\xa0\x49\x9e\xa3\x6f\xe2\xc4\xb5\xa9\x59\xd1\x0e\x9a\x61\x0c\xab\x1f\xe0\xd2\x8c\xf1\x01\x3d\xca\xe6\x3d\x8f\xde\xe0\xec\xbd\x8b\x4e\x19\xd5\xd0\x40\xe2\xfa\xd7\xd0\x41\x3a\x38\xe8\xc4\xe7\x35\x52\xad\x46\x04\x7b\x5b\xbd\xd1\x5c\x09\xcc\x0d\x34\xe4\x8b\x91\xfd\xba\xe2\xa9\xd1\x62\xd4\xb2\x1e\xe2\x0a\x1e\xf5\x35\xea\x88\x35\x95\xbc\x49\x51\x69\x2a\x67\x16\x34\x54\xc7\x36\x7f\x13\x4b\xf6\x45\xd4\x8f\x99\x69\xe3\xd4\xf0\xf9\xea\xf4\x14\x4c\xe9\x80\xa0\xa2\xe3\x34\x2c\x74\x6c\x2b\xdc\x3c\xcd\xc2\xf8\xa7\xda\x57\xa0\xe8\x02\x87\x82\xd3\x0a\xf5\x85\x7d\x9e\xfb\x37\x66\x6d\xf6\x5d\x7c\xc3\x84\x71\x66\x61\xe6\x1f\xf5\xc0\x97\x52\x59\x5e\x94\x11\x2c\xa1\xa8\x40\xd6\xe4\xf6\xec\x0e\x55\x49\x4c\x5b\x44\xf7\xc0\xf0\xd4\xa9\x9c\xd7\x09\x05\xbf\x84\x85\x56\x17\x48\xf4\xdc\x0f\xd7\xa4\x4a\x1b\x13\x91\x13\xc3\x8a\x1e\x8e\xb5\xc7\xa2\x0f\x3e\x95\x2e\xae\xa8\xce\x38\xb2\x07\xc2\x8e\xd9\x72\x71\x8f\x03\x1f\x47\x7c\x62\x07\xce\x43\x3c\x51\x5f\x5a\xc2\x84\x0f\x49\x74\xf1\xf1\x69\x89\x62\x6c\x76\xbc\x98"}, +{{0x71,0x86,0xf8,0xd1,0x68,0xd9,0xdd,0xf1,0x7e,0xdb,0xaf,0x0e,0x7b,0x1a,0xbc,0xb2,0x6d,0xa3,0xe4,0xc0,0x27,0x2d,0x98,0x79,0xc7,0xfd,0xff,0x64,0x21,0xc4,0xea,0x50,},{0x96,0xb4,0xa6,0x56,0x23,0x20,0x29,0xfc,0x1b,0x83,0x64,0x70,0x3c,0xbe,0xa7,0xa5,0xd7,0x38,0x75,0x18,0xa8,0x8c,0xed,0x1a,0x91,0x5e,0xc8,0xd8,0x86,0x84,0x81,0x32,},{0xa9,0xc0,0x49,0x9f,0xc2,0x16,0xa1,0x45,0x32,0xd7,0x36,0x36,0x5c,0x63,0x55,0xf9,0x38,0xf8,0xd8,0x19,0x4f,0xa1,0x13,0x28,0x48,0xf8,0x3e,0x49,0x04,0x54,0xd4,0xbb,0xf6,0x92,0x69,0xf1,0x22,0x59,0xfc,0x6c,0x07,0x4c,0x10,0x15,0xe4,0x25,0xe4,0xf4,0xf2,0x7c,0x02,0x9c,0x93,0x33,0x49,0x51,0x36,0x1a,0x35,0xad,0x11,0x76,0x54,0x0e,},"\xa3\xe6\xcb\x6b\x84\xcc\x5c\xf1\xfb\x1a\x84\x8b\x4b\x8e\xa7\xcb\x7c\x87\xe0\x44\x57\x50\xc6\x1f\x9a\xa5\xd7\x7d\xed\xdf\x94\x94\x63\xec\xd3\x9b\xfc\x71\xf2\x61\x0c\x2a\x94\x24\x84\x7f\xb7\x6f\x84\xc5\xda\x1f\xa1\x0e\xf7\x18\xa3\x45\x66\xce\xc1\xb3\xe8\x99\xe7\x25\x2e\x8d\x4d\x34\x60\x16\x49\x8f\xf1\x19\x97\x27\x50\x06\x16\x60\xba\xed\x31\x28\x27\x58\x31\x81\x07\x3d\x1d\xc7\x4b\x76\xc4\x30\xca\x30\xd4\x09\xe4\xe8\x43\x9c\x0f\xc4\x8c\x00\x68\x06\x29\xd4\x3a\xe2\xa7\x7d\x69\x22\x8f\x7f\x8a\x12\x53\xaf\x15\xbd\x2c\xb6\xbb\x1c\x16\x96\x55\x0c\x4c\x79\x0f\x44\x98\x69\x63\x0a\xb9\x2b\x9c\x11\xcd\xe1\xf9\x61\xaa\x21\x03\xec\x23\xf7\xd9\xf0\xfe\x9c\x3c\x41\x32\x58\x2e\xfa\x79\xa6\x6a\xe3\x42\x6e\x51\x05\xb8\x0b\xfe\x5e\x04\xdc\x8b\xb1\xe3\x8a\x31\x10\xcd\x72\x98\x4b\x3e\xf0\x2a\x0c\xa6\x2a\xb6\x38\xcb\xcf\xbc\x8a\x6b\x59\x3d\x26\x13\xdc\x06\xec\x86\xfe\xe3\x4f\x65\x18\xd4\xa3\xfb\xdc\x15\x72\x37\x17\x45\x64\xda\xeb\x66\x74\xcd\xc3\x4f\x4d\x65\x37\xcf\x81\xd8\xaa\x9b\xdd\xbf\x3a\xed\xa3\x12\xda\xae\xee\x33\x6f\x9e\xd8\xbf\xf8\x1e\x29\x4b\xc7\xd4\x4d\x25\xcd\x78\x70\x72\xe6\xcb\x41\x4b\x65\xfb\x7a\x84\x6f\xc0\x65\x36\x7b\xa8\xe3\x7b\xef\xfd\xf0\xb7\xba\x8f\x98\xcd\xf1\xeb\x87\x0f\x4e\x8b\x71\x30\xfa\x34\x29\xd2\xe2\x4b\xce\x59\x94\xda\xf1\xaa\x65\xe5\xf6\x03\xb6\x31\x05\x3d\xc5\x10\xb2\xf0\x97\xe8\x6e\x9b\x9b\x55\x23\x02\x75\x79\x68\xd0\x13\x6e\xe6\x75\x4c\x42\xa3\x2c\x99\x0a\xdd\x9c\xb5\x29\xbc\x89\x75\x1d\xfa\x4e\x5e\x3a\x0b\xad\xaf\x4c\xc4\x0b\x6a\x09\x50\x7f\x9f\xcd\x24\xc3\xca\x72\x25\x95\x99\xc6\xee\x58\xd8\x57\xb3\xa1\x89\xe0\x48\x90\x2e\x88\x5a\x36\x07\x42\x60\x93\xcb\x0f\xab\x43\x7c\x0f\xb0\xed\x2f\x1e\x96\xe9\x44\x1a\x7e\x95\x4f\xe3\xef\x76\x46\xe2\x6a\x39\xa0\x70\x33\xd0\xa1\x55\x5d\xfe\xed\x9a\x6f\x57\x79\x4a\xf3\xa2\xab\xf0\x05\x7e\x9f\x85\x3a\xe5\xc3\x01\x38\xfd\x80\xe2\xf2\x9c\x2f\x4a\x93\xad\x31\x45\xda\x10\xa3\xe3\x1c\xe9\xff\x97\x86\xac\x65\xd8\x60\x37\xd9\x8b\x7a\xa6\xd1\x1d\xe8\x80\x00\x10\xe1\x33\x86\x9e\xb6\x7a\x50\x39\xb9\xb8\xfe\xb6\xef\x90\x3d\x0c\xc7\x46\x41\x26\x07\xda\x72\x5c\xe2\xdc\x6a\x35\x21\x09\xdb\xc6\xa5\xe4\x0b\x17\x0c\x23\x05\x0b\xc4\xfb\x1e\xfa\x0c\x34\xfe\xc0\x0e\xae\x32\x19\xc2\x90\x40\xe8\xf5\x97\x8c\x93\x84\xee\x91\x5d\x8c\x93\x98\xdd\x12\x0d\x5c\x3c\xba\x38\xf8\x52\x6b\x06\x19\x7c\xb2\xc2\x61\xde\xc7\xd7\x26\xae\x13\x0f\x9b\xee\x17\x26\x17\x00\xe9\x99\x31\xfa\xc4\xb4\xdc\xa0\xf7\x58\x70\x1a\xcb\xf3\x70\x7d\x47\xdf\x53\x21\x13\x0e\xc1\x0b\xb3\xb1\x30\x78\xc4\xdc\x5d\xe3\x47\x0f\x15\x8b\x57\xdb\xeb\x87\x8b\x3a\x85\x24\xe0\xed\x2c\x95\x47\x54\x5f\x0f\xdd\xf1\x31\x25\xe4\x5b\xb2\x3d\x6a\x7b\x38\x3a\x18\x7f\x4c\x5d\x54\xa7\xb4\xc8\x3d\x59\x57\xf2\xcd\x7e\x6f\xbc"}, +{{0xe8,0x6e,0x8c,0x62,0x56,0x6e,0x15,0x75,0x3b,0xd5,0x57,0x7e,0xaa,0xe7,0xf2,0x41,0x05,0xb7,0x40,0x55,0xa2,0x56,0x29,0x58,0x07,0x08,0xbf,0xc8,0x3a,0xeb,0xf0,0x6c,},{0x8c,0x8c,0xe8,0x82,0xd5,0xf7,0x65,0x86,0xd8,0xdd,0xcc,0xc5,0x57,0x9b,0xcc,0x1c,0xdf,0x4c,0xfd,0x71,0x62,0x30,0x4c,0xb1,0x0e,0x76,0x96,0x02,0x6e,0x70,0x7f,0x17,},{0x54,0xd2,0xfd,0x44,0xac,0xf9,0xe2,0x09,0xbc,0x7e,0x43,0x33,0x72,0xbd,0x73,0x07,0x4d,0x07,0x80,0x6a,0x77,0xc6,0xce,0x22,0x8e,0x9b,0xe9,0x94,0x41,0x8b,0x00,0xc7,0xec,0xbc,0xb7,0xac,0x00,0x6c,0x29,0x4a,0xec,0x9d,0xe6,0x68,0x57,0x2a,0xdd,0x51,0x7c,0x06,0xb4,0xeb,0x4f,0xe2,0xff,0x35,0x23,0xbf,0x04,0x3d,0xf4,0x4d,0x3d,0x0d,},"\x12\xfa\x63\x1b\x0e\x48\x2e\x9b\x9d\x63\x3e\x94\xb8\x2d\x8a\xb4\x36\xfe\x54\x8e\x5b\x95\xda\x92\x62\x46\x23\xd1\x3f\x2c\x70\xda\x77\x5b\xa1\x36\xc5\x22\x9c\x16\xa0\xc7\xa6\xfa\x91\x4b\x2f\xed\xa5\x64\xe1\x72\x19\xe4\x73\x70\xf9\x51\x5b\xb1\xd5\x9d\xe6\xe9\x58\x62\x04\xd9\x43\xdc\x56\x0d\x73\xe2\xe7\x57\xf7\xeb\x39\xbb\xc7\x11\x1b\xb4\x6b\xc6\x43\xc1\x3f\x60\x21\x12\x73\x9b\xec\x77\x8d\x7d\x4f\x49\xd0\x92\x56\x3d\x68\xf5\x77\x6e\x43\x0e\x3b\x0b\xf2\xdc\x1b\x01\xbe\xb3\x04\x01\x96\xda\x63\x02\x90\x8b\xfe\x91\xe0\xfc\x38\xe0\x4c\x15\x0e\xf9\x07\xdc\x73\x6c\x44\x5f\xf2\x1f\xdb\xd2\xdc\x1e\xac\x0a\x0f\x5d\x00\xa3\x0a\xf0\x28\xaf\xe2\xff\x61\x16\x2b\x75\x8c\x7d\xa9\xa7\x76\x66\x6a\x11\x23\x59\x43\x1c\x48\x85\x6a\x87\xca\x82\xd3\xdd\x1c\x8a\xf3\x76\x59\x86\x35\x43\x2b\xf8\x91\xbe\xcb\xc3\x3a\x8f\xda\x44\xce\x88\x3e\xa8\xaf\x4a\xd8\xb9\x1a\x92\x61\xce\x76\xb9\xe9\x39\xc4\x61\xfa\xc5\x3a\xe0\xf0\x76\xe8\x2d\x87\x9a\xac\xe8\xf3\x8f\x12\x0b\xc9\xb0\x4d\x81\x25\xed\x24\xbc\xd7\x79\xd9\xd2\x43\x86\xb1\xdd\x20\x17\xeb\xee\x81\x97\x37\x6e\x8c\x36\xfa\x3a\xef\x8c\x1e\x71\x3e\x2b\x8b\xce\x49\x66\xd8\x48\x88\x68\x1b\xa7\x84\x95\xfb\xd1\xd6\xcc\xa5\x86\x26\xe6\x85\x4c\xda\x60\x6b\x83\xd6\x29\x3d\x01\xe8\xe3\xe1\x3b\xbf\x4a\xac\x85\x1d\x9a\x1e\x00\xd0\x02\x4e\x26\x99\x3b\x0b\x30\x91\xbe\x7e\x80\x61\xbc\xbb\x3c\xbb\x23\x02\xce\xab\x96\x89\x7a\x8e\x1f\xf3\x67\xec\x86\x25\x69\x3c\xf3\x15\x34\x12\x4a\x9d\x5d\x72\x5b\xca\xe0\x01\xd6\x7b\xc2\x11\x1d\x0a\xb8\x11\x1f\xa1\xd2\x4e\x4e\xd0\x6d\x63\x58\x3c\xe6\x90\xf2\xa0\x46\x26\xd7\x91\xd2\x9e\x3e\x31\x5a\x41\x5b\xf2\xe8\x53\xa5\xf2\x97\x4c\x83\x3a\x3f\xe2\xe2\x90\x9c\xf6\x69\xc7\x3c\x1f\x59\x39\x2d\x30\xc3\x7f\x3b\x9c\x5a\x3d\xdc\xfd\x75\x62\x1f\xda\x36\xe4\xba\x2f\x16\x14\x78\x58\xf6\xf2\x06\xb9\xa1\x40\xf1\xdd\xc1\x46\x6c\x9a\x53\xed\x73\xf8\x24\x90\xbc\x95\x32\x2c\x95\x5f\x61\xd1\x1c\xb5\x1d\x5e\x8a\x58\xc6\xb3\xcb\x0f\xdf\x04\x19\x76\x32\x01\xbe\xea\x93\xa8\x51\x2b\x14\x05\x24\x5b\xfc\x38\x41\x55\xad\xc5\xce\x77\x8a\xa7\x4d\x00\xa3\x22\x72\x64\x65\x11\x9a\xf7\x95\x01\xf0\x40\xdd\x0a\x7a\x84\x06\x00\x01\xca\x89\xd2\xfe\x5e\x9c\xf9\x77\x9a\x54\x7e\x3e\xbd\x3b\xf8\x64\x29\x90\xa3\x69\x0e\x2b\x2c\x3e\x54\xcb\x7e\xee\xea\xbc\x24\x2b\x4d\xd9\x92\x74\xc4\x25\xa8\x67\x93\x1c\x92\x9c\xa7\x08\x08\x60\x1c\x39\x08\xcf\xd7\x88\x86\x7d\x68\x7d\xc3\x66\xe9\x76\x35\x0c\x9e\x70\x58\x4b\xd3\x90\xd6\x7e\xeb\x7c\xfe\xa2\x6c\x42\x68\x6d\x3d\x96\x20\xf6\x2f\x64\x10\x4e\xf4\x1e\xd1\xd1\x30\xd7\x9e\x32\x59\x38\x48\x62\x96\xb7\xab\x2d\x2a\xdb\x78\x52\x67\x43\xe4\x00\xac\xb2\xb7\xaf\x09\x62\x8d\x68\xcf\x94\x75\x10\x16\x25\xc2\x0e\x1d\xc0\x51\xd7\x3c\x99\x7c\x95\x2e\x12\x81\x2c\x80\x5b\x68\xff"}, +{{0xa5,0xca,0xb2,0x72,0x7e,0x2f,0x13,0x1a,0x4d,0x63,0xfa,0xce,0xe7,0x99,0x33,0x66,0x63,0x93,0x0a,0xa0,0x7a,0xfd,0xa6,0xbd,0x5a,0x8e,0x98,0x5a,0x02,0xde,0xb1,0xea,},{0xac,0x35,0x5f,0x95,0x26,0x0f,0xbf,0xea,0x77,0x8c,0x55,0xb5,0xaf,0x8b,0x3f,0xd1,0xf2,0x4d,0x26,0x93,0xda,0x35,0xde,0x4e,0xe5,0x08,0xa2,0x7e,0xd3,0x50,0x39,0x1f,},{0x13,0x8c,0x7a,0x8e,0xca,0x5b,0x5c,0x37,0x15,0x88,0x13,0x84,0x3c,0x9a,0x90,0x4e,0x5f,0x53,0x0a,0xd9,0x71,0xee,0x43,0x2a,0x44,0xf3,0x44,0xf8,0xc6,0x4b,0xbf,0xaf,0x10,0x2f,0xf4,0x1d,0xaa,0x5c,0xf7,0x22,0xa4,0xbc,0x66,0x40,0x58,0x87,0x59,0xb8,0xf3,0x6f,0x9c,0x05,0x9e,0xab,0x93,0x6c,0xc4,0x5e,0xd4,0x79,0x63,0x94,0xa0,0x02,},"\x48\x34\x39\x15\x4d\xd5\xe5\xd1\x09\x85\x7c\x24\xd1\xc4\xe7\xfb\xbe\xfd\x2f\x38\x65\x1d\xa8\x12\x89\xf2\xad\x3d\x61\x54\x30\x65\x38\xb8\x2a\xc7\xdb\xa9\x21\x0e\x74\x07\x76\xed\xe4\xcc\xf5\x1d\x4f\x63\x09\x4b\x03\xe4\x6a\xd3\xaa\x3c\x31\x94\x7d\x8c\x36\xce\x6f\x94\xe8\x52\x96\xbd\xed\xcc\x1e\xad\x62\xea\xa1\x44\x1e\xcd\xe0\xa2\x25\xd0\xbf\x02\xed\xca\xcf\x86\x50\x14\x89\x9a\xf6\x6d\x98\x08\x04\x0c\x2d\x02\x00\x0a\x0f\x5c\xe4\xf1\x68\x3c\x1a\x49\x52\x76\xd9\xc4\xd7\x28\xc9\xec\xd6\xf0\x78\xdb\x8a\x0c\xfc\x26\x71\x87\x23\x85\x62\xab\x1a\x1e\xa2\x81\x3f\xb4\xf1\x2e\x87\x8e\x1b\xa1\x43\xf4\xd0\x6a\x3b\xc8\x10\x0c\x35\x50\x11\x8d\x69\xda\xe6\x7b\x55\xed\x69\x2a\xcf\x94\x44\xda\xa5\xc3\xe3\xc0\xa9\x8e\xe2\x8c\xf1\x72\xde\x0c\x58\x4c\x9f\x2e\xc9\xbb\x6e\x9b\x57\xf5\x72\xa8\x6f\xf8\x72\x9f\x65\xf4\xc6\x5b\x7f\xea\xcc\xaa\x21\x72\x0e\xd7\x9e\x90\x61\x8b\xca\xfb\xfd\x95\x33\xda\x85\x23\x2b\x45\x08\x83\xaa\x91\x9f\x82\x7f\x04\xc4\xa9\x7b\xf5\x13\x90\xd4\xf8\x56\x9c\x19\x17\x26\xf4\x4f\x7e\x39\xfb\x3d\xb7\x3b\xfc\x41\x5b\x6f\xfc\xa8\xb9\x1a\xca\xad\x69\x23\x85\x72\xf1\x4b\x49\x98\x5e\xa0\x3c\x98\xd7\xb1\xd4\x4b\x3a\x65\x54\x76\x5b\x19\xab\xf9\xb2\x52\x74\xe9\x7e\x46\x34\xe4\xb0\xf9\xe8\x02\xeb\x6f\x74\x3f\xff\x95\x07\x57\xee\x01\x3a\x69\x88\x22\x18\x81\xa7\x44\x3f\x1f\x32\xbc\xcb\x00\x7e\x99\x37\x9c\x7c\xa4\xf9\x06\xd5\xfe\x11\xcb\x12\xf6\x6b\x53\xa3\xd2\x1a\xc9\x47\xbe\x0c\x81\x50\xbc\xd0\x4f\x1c\x81\x6b\x3f\x0c\x07\xc5\xfb\xc0\x90\x5a\x71\x36\x95\x68\x49\xda\x03\x83\x6d\xae\xc2\x5c\x3e\x1a\x06\xec\x3a\xeb\x20\x56\x48\x17\x6f\x89\xf4\xa2\x91\xfa\xc4\xf1\xd3\x89\x9f\x56\xc9\x06\x5e\xeb\xb8\x76\x8b\x84\xb3\x1b\x7c\xc0\x31\x08\xbd\x08\x88\x33\x8d\x17\x74\x99\x49\x70\x29\x2d\x93\x50\x31\xfe\xa3\x35\xd9\xe7\x90\x8f\xe0\x25\x48\x89\xc0\xb1\x71\xcf\xe0\xaf\x2e\x6f\xde\x7a\x5e\xa3\xde\x1f\xdc\xda\xe5\x37\xb6\x31\x31\x19\xc2\x7f\x77\x20\x24\xef\x36\xe4\x5c\x8b\x89\xf2\x6c\x93\xd9\xee\xa1\x37\x25\xe1\x2d\x81\x0c\xf9\x82\x4a\xea\x04\xcb\x80\x2d\xa7\xe4\x58\xe8\x42\xca\x37\x5e\x36\x71\x34\x6e\x00\x89\xde\xc5\x71\xbe\x16\x9b\x0d\x90\x96\x6b\xf3\x68\xfe\x36\x98\xfd\x3e\x72\xbf\x16\x24\x9d\xd9\x00\xaf\x6d\x29\xff\xa4\x83\x51\x36\x0f\x12\x24\x17\x14\x58\x5f\x7a\x9b\x4c\x7b\xaf\xc9\x52\x22\x67\x35\xde\x14\x62\x74\x3d\x78\xab\xad\x0f\x67\x11\xf2\x49\x5f\x33\x13\xad\x4e\x0b\xa2\x16\xb0\xde\xa5\xdc\x15\x16\xa9\x54\x9f\x7d\xfc\xfe\xb9\x3e\x59\x1a\xbe\xda\x5e\xa3\xc7\x04\x59\x06\x52\x3b\x40\x86\x8c\xa5\x73\x5d\x6a\x33\x71\xc3\xc2\x94\xc1\x11\x26\xd0\x97\xf4\xc7\x08\xe9\x04\x64\xc1\xad\x91\x42\xfa\x0b\xed\xf0\x7d\xfc\x5f\x4c\xb6\x7d\x6e\xd8\x0f\x1b\xfe\x72\x68\x3c\xfb\x2a\xd6\x65\x30\xdc\x43\xd7\x02\x3f\x37\x90\xff\x42\xd9\x5b\xd8"}, +{{0xcb,0x63,0x19,0x61,0x37,0x79,0xa4,0xef,0x66,0xbe,0x14,0x14,0x4b,0x28,0x40,0xad,0x01,0x67,0xc0,0x3f,0x3b,0x8d,0x04,0xff,0x59,0x2c,0xd1,0xd2,0xd7,0x22,0xe3,0x30,},{0x18,0xeb,0x03,0xf0,0xa3,0x34,0xb0,0x80,0xe1,0xaf,0x43,0x99,0xd8,0x37,0x6d,0x83,0xc5,0x33,0x31,0x6d,0xc6,0x87,0xcf,0x34,0x1f,0x0a,0xfa,0xb4,0x50,0x96,0x52,0x99,},{0xc1,0xb3,0x99,0xcd,0xc1,0x98,0xe9,0xa1,0x59,0xe6,0x84,0xfc,0x26,0x68,0x6d,0xe6,0x60,0xda,0x54,0xcf,0xe3,0x12,0xca,0x73,0x45,0xdf,0x0c,0x7d,0x15,0xa3,0x57,0x43,0x01,0x44,0x10,0xbd,0x2f,0x6c,0xd1,0x1e,0xef,0x33,0xa8,0x9b,0x3d,0x15,0xcb,0xc1,0x7c,0x7a,0x35,0x89,0x37,0xfd,0x99,0x72,0x05,0x05,0x1f,0x92,0x57,0xc2,0x56,0x09,},"\x87\x4a\x6c\x81\xd6\xdb\x71\x33\xa7\x91\x69\x76\x0c\x84\xd3\x6e\xea\x3d\x42\xea\x08\x92\xb7\xc8\xdd\xe8\x44\xa3\xa6\xb6\x0a\xa9\xf2\x66\x07\x26\xc9\xc4\xdd\x26\xa0\x1f\x4e\xd0\xdc\x1c\x53\xba\x60\x05\x46\x3f\x7e\xa6\x4a\x1e\xc6\x39\x53\xbc\x3d\x81\x05\x2a\x2f\x10\x84\x38\x9a\x77\x06\xdf\x74\xed\x41\x36\x08\x2a\xb5\xc6\xe8\xc7\xf4\x11\xdf\x9d\x3a\x0f\x3c\x40\xf5\xa6\x0e\x2d\x21\xa8\x54\x8e\x7a\x25\xde\xe3\x40\x30\xb3\xc3\xe7\x5c\xaa\x93\xdd\xaa\x9c\x19\x0c\xb6\xde\xda\x24\x13\xd5\x4e\x37\x3d\x43\x53\xdb\xa4\x3d\x39\x49\x1a\x2f\x56\xc8\xb3\x6d\x45\x01\x6f\x77\xd7\x47\x16\x91\x63\x45\x39\xe7\x6c\x4f\xb4\x19\x13\x47\x2b\x0a\x23\x05\x4f\x54\x8f\x54\xb1\xe7\x10\x9c\x8b\x65\x21\xb5\x7a\xe9\x81\xd0\x50\x31\x6a\x33\xc4\x9c\x71\x16\x26\x8d\xcc\x4b\x78\xc2\xba\xe5\x3a\x3a\xe4\xdd\x17\x8b\xb8\xb7\x6b\xb3\xbe\xfe\x19\xe4\x1a\x2c\xf1\x2c\xeb\xb7\x11\x68\xf9\x71\xf2\x02\x46\x1c\x63\xf7\xd6\xee\xf1\x07\xf5\xb1\x03\x0e\xdd\x4e\x75\x00\x9e\x91\x16\xc3\xcd\x0e\x8b\xdd\xc2\x99\xb4\x1f\x1a\x45\xe7\x84\xef\xa6\x46\xda\xda\x64\x06\x8e\x92\x48\xec\x98\x8f\x23\x26\x34\xad\x3d\x5a\xab\x19\x56\x0e\x83\x0a\x5b\xd6\x65\x45\x7c\x94\x29\x5e\x1a\xf0\x16\x0f\xbc\xe2\x72\xef\x48\x45\xdd\xf0\xc4\xf2\x4d\x97\x6f\x51\x86\x90\xea\x1f\x82\xff\x4d\xfa\x48\x13\x64\x1a\x67\x59\x8e\xa9\x84\x01\xe0\xff\x10\xa0\xe5\x82\xe2\xb9\x08\x67\xb4\xe6\x23\x2c\x34\xea\x49\x9c\x16\x99\x09\xa4\x41\x26\xf3\x77\xd8\xcc\x1c\x11\x90\x58\x66\x34\x0e\xfd\x1e\x7b\x07\x7d\xc7\x45\x6d\x59\xc9\xb9\x6a\x12\x4a\xac\x3b\x33\xbb\x22\x74\x41\xbb\x7a\x52\xe6\xc3\x14\x0d\x7a\x4f\x67\xca\x05\xbb\xc9\x3c\x93\x77\x5b\x92\x91\x19\xa2\x24\xed\x8f\x39\x00\x58\x20\xf4\x20\xcc\x6c\x53\x0e\x61\xe2\x0a\xdc\xa0\x1e\x93\x9c\xc0\x31\xdf\x49\xcd\xb1\xec\x8f\xf4\x93\xc9\xef\xbc\xad\x34\xc5\x71\x08\xef\xd7\x64\x55\x89\x66\xfb\x14\x70\xb0\x74\x5e\x69\x66\x19\x1a\x9a\x9e\x44\x58\x1b\x09\xfa\xf4\x69\xf9\x51\x53\x72\x03\xd9\x26\xbc\x8a\x55\xd0\x80\xa8\x05\x18\x1d\xd7\x29\x6e\xd2\x0a\x81\x82\x68\xf7\x55\xea\xa6\x6b\x08\x22\x42\xf4\xd0\x20\xf7\xcd\x67\x20\x89\x04\x84\xc0\x1c\x75\x7f\xe3\x5d\x87\xb5\xbc\x90\x6d\xea\xcc\x2e\x30\x71\xde\x46\x01\xbc\xf0\xdd\x6b\x83\x7c\x43\x31\x06\x04\x7f\xd8\xec\x9b\xd0\xe9\x8c\x9e\xe8\x06\xf7\xec\x8c\x5a\x10\xea\x21\x36\xf1\xf9\x0f\x90\x0b\x85\x3f\x95\x3f\x00\xb0\x76\xbd\x1e\xbd\x92\x9d\x08\xa3\x8b\xec\x68\xd8\x66\x43\x50\x47\xbc\xb6\x72\x1e\x06\xb6\x40\x85\xdc\x05\x58\xc1\xfa\x85\xa2\xc8\x3b\x0c\xaf\x4c\x81\x60\x84\xf1\x0a\x4c\x58\x85\x29\x5b\xca\x15\xff\x7c\x18\xe5\x96\xc6\x2c\x92\xee\x99\x21\xa2\x7c\x29\xd1\x95\xbd\x28\x22\x13\xff\x36\x60\xb6\xe7\x54\x6b\x4e\xaa\x77\x7c\xe3\x9f\xc5\xd2\x04\x84\xc7\x1e\xd6\xca\x06\xf9\xb7\x7a\xb1\xd8\x72\x39\x3a\xb2\xd1\x02\x55"}, +{{0xb2,0x98,0xad,0xf3,0x8a,0x67,0x08,0xf8,0xd1,0x8f,0xf1,0xed,0x96,0xbf,0xba,0xb4,0x21,0x54,0x0d,0x09,0x6c,0x4e,0x43,0x51,0xb9,0x22,0x09,0xb5,0xe6,0xaa,0xab,0x65,},{0x77,0x0e,0xdf,0x42,0xb8,0xa0,0x39,0xc6,0xca,0xb9,0xba,0x65,0xeb,0xfb,0x13,0x5a,0xbc,0x2d,0xa3,0x14,0xa4,0xc3,0x09,0xf4,0x6a,0x8f,0x32,0x5b,0x52,0xd0,0x65,0x93,},{0xe5,0x5f,0x8d,0x30,0x41,0x22,0xdc,0x17,0x5c,0xf0,0x27,0x46,0x74,0xfc,0x9d,0xed,0xfe,0xc2,0xb5,0xf8,0xa2,0xee,0xb1,0xe3,0xe7,0xf8,0xe0,0xdf,0xba,0x0d,0xac,0x2d,0x32,0xf4,0xe7,0x04,0xce,0x91,0xcd,0x59,0x91,0x84,0x13,0x3c,0x3b,0xf1,0x06,0x3d,0x2f,0xae,0x63,0xd7,0x3a,0xcc,0x57,0x72,0xd7,0x18,0xd8,0x11,0x83,0x31,0x86,0x02,},"\x9d\xf4\xd5\xd7\x56\x5d\x2c\x05\x22\x62\xdd\x34\xd6\x00\x7d\x86\xd9\xc0\xf0\x7c\x70\x89\xaf\x61\x19\xe3\x04\xf4\xd8\x01\x1d\x7e\xaa\xd7\x7b\x3e\xf7\x0c\xc2\x80\x84\x7d\x59\xf2\x97\x20\x2b\x7e\x18\x61\xae\xf3\x34\xbf\x38\xde\x14\x74\x0e\x80\x73\xc9\x55\xa8\x51\xd2\xcf\x3d\xad\xc3\xed\xce\x15\xbe\x49\x0e\xaa\x84\x5b\xa5\x53\xfc\x6e\x87\x46\xe5\x29\x15\xe6\x55\xaf\x4b\x86\xc6\x29\xd4\xc5\x22\x78\x36\x35\xd4\x64\xa2\x82\x57\x77\xd8\x9d\x70\x97\x67\x7e\xf0\xe5\xee\xae\x38\x53\x7e\xcb\x65\x6e\x3b\x28\xdd\x07\x35\x8f\xd9\xfb\x2c\xd4\x62\x51\x72\x86\x65\x9a\xef\xc7\x9d\x37\x4d\x1d\x13\xed\x93\x96\x7c\x53\x0c\xde\xa4\xf3\x14\xa0\xf9\x1d\x62\x89\xb4\xc7\xa4\x27\x9b\x6f\x4c\x4a\xbc\xa3\x33\x57\xf6\x9e\xd8\x4b\x91\x19\x63\x7a\xdb\x7c\x18\xe6\x94\xcb\x3c\x56\xe7\x36\x37\xda\x91\x07\x35\xd4\x3c\x38\xaa\x80\x86\x67\x5a\x06\xad\x37\x0e\x57\x26\x88\x1d\xa5\xe1\xa1\xdc\x61\x44\xd6\xa6\x2a\xff\x7f\xb0\xc3\x52\xd8\x8d\xc9\x71\xa3\xd7\x2d\x30\x71\xe1\x4b\x47\x42\x53\x56\xaf\x1b\x01\x92\x33\x53\x82\x61\x45\x1a\x99\xa6\xcf\x4a\x07\xce\x9a\xb1\xc3\x99\x0d\xe6\xab\x8d\xe2\x11\x6c\x75\x61\x05\xc5\x12\xb7\xa3\xee\xb3\x15\x7b\x15\x8b\x32\x1e\x44\x4e\x80\x6d\x89\x0b\x38\x90\xed\x9d\xdc\x86\x9f\x17\x11\x72\x3b\xb9\x9a\x72\xbd\xb9\x23\xd1\x31\xba\x4e\xdb\xfb\xb6\xda\xe9\x9a\x5c\x7b\x32\x8d\x31\x0d\xf9\xa6\xd1\xdc\xd8\x59\x18\x96\x28\x33\xe8\x9e\x20\xf5\xc5\xe6\x33\x3a\xc8\x61\x09\x4a\xe9\xe7\x99\xc8\x64\x1b\x9b\xae\xa1\x1a\x2e\x0e\xc2\x34\xbe\x59\x30\xe0\x28\x80\x85\x9c\xde\xc0\xd9\x78\x23\x7c\xbe\xa5\xc7\xc3\x2c\x11\x1b\xaf\xdd\x4b\xfb\xff\xe4\xfb\x34\x85\xef\xfe\xcd\x51\xbd\x19\x5a\x71\x40\x4c\xa5\xb5\x9a\xfa\x25\x2d\x7b\x5f\xf9\xd0\x30\xf4\x8c\x6f\xaa\xdb\xdb\xa9\x18\xf2\x1a\x0c\xd3\x9a\xf5\x69\x66\xdc\xcf\xa2\x5f\xb5\xa5\xcf\x9a\x4b\x26\xa7\xf5\x44\x1d\xf6\xe3\x20\xe3\x4b\x27\x39\x3d\xe2\xec\xfb\xd6\x9a\x15\x94\x90\x9a\x6c\x68\x5e\xc6\x45\xfc\xf3\x04\x8d\x01\x48\xfa\x38\xd3\xe8\xa6\x4d\xc3\xc2\x1a\xe4\x4d\xa7\xe4\x6a\x5e\xa7\x93\x6c\x2b\xa0\x83\x68\x9a\x78\xca\x3a\xc6\x0b\x87\xbe\x6d\x23\xea\x40\xf5\x96\x15\x83\x74\x28\x42\xe3\x75\x25\xa4\x9c\x5f\xe8\xfd\x15\xd7\xb0\xc9\xe8\xfc\xcd\x07\x93\x6d\x19\x53\x82\x12\xf7\x37\x3d\xbb\xf3\xdf\x7d\x46\xad\xf9\xd9\xf5\xdb\x09\x52\x4c\x65\xb8\x83\xae\x6f\x6c\xef\xa2\x4b\x19\xec\x48\xce\x28\xcf\xa7\x34\xd9\xbd\x6e\x77\x83\x7d\x1a\x14\xd6\xa1\x9d\x34\x5b\xfb\xea\x55\x9e\x7e\x6b\xfb\x71\xdd\xad\x83\xcd\x8d\xee\xab\x68\x7f\xe7\x3c\x05\x74\x88\xf8\xf2\xb3\xe2\xe2\x6d\x13\x00\x9f\x4d\x23\xe6\x61\x9a\x23\xc0\x69\x2a\xf7\x66\x69\x21\x7d\x5e\xbd\x46\x08\x5b\x39\x88\x90\xe5\xc9\x1f\xdb\x4d\xb5\xba\x40\xe7\x77\x3d\x51\x8d\x3c\xf0\x0c\x0a\x5b\x5a\x4b\x0f\x1b\x85\xd6\x29\x16\xa5\x9e\x56\x07\xb7\xb1\xeb\x80"}, +{{0xe9,0xcf,0x16,0xd6,0x96,0xf6,0x3b,0x59,0xe5,0xe2,0x5c,0x9e,0xe2,0xd7,0x5b,0xb0,0x5e,0xd2,0xba,0xa5,0x91,0xa7,0x55,0x7f,0x9f,0xb1,0x29,0xcf,0x98,0x3d,0xe0,0xba,},{0x6d,0x1a,0xe3,0x85,0xe8,0x0a,0x39,0x55,0xe8,0xd0,0xc5,0x93,0xa8,0x1f,0x43,0x1c,0xd4,0x32,0x67,0x1e,0x78,0xcd,0xba,0xfe,0x83,0xfe,0x58,0xdb,0xcd,0xb9,0x85,0x60,},{0x81,0x12,0xac,0x37,0xea,0xfb,0x74,0x9d,0x3f,0x4a,0x1e,0xa1,0x48,0x43,0x79,0xdf,0x3e,0x38,0x3b,0x01,0x9c,0x12,0xde,0x85,0x15,0xe3,0x49,0xe4,0xf6,0xf9,0x98,0x63,0x2e,0x30,0x96,0x83,0x47,0xa1,0xd1,0x5b,0x09,0xda,0x2e,0xb8,0x00,0xb0,0x3d,0x81,0x9d,0x20,0x2b,0xd1,0x0a,0x6a,0x46,0x3b,0xb0,0x2b,0x36,0x6d,0x68,0x55,0xfe,0x0e,},"\xa1\x0f\xea\x8f\xc9\x3e\xcc\xfe\x2a\x6b\x78\x26\x07\x95\x63\xad\xf8\xaa\x9a\x66\x64\x44\x93\x22\x00\xcc\xa9\x44\x7d\xd0\x27\xc5\xc7\x20\x4e\xa6\x2b\xf8\xf5\xe2\xe3\x91\x45\xac\x39\x48\xab\x3f\x31\x86\x88\x7b\x30\xbc\x60\x23\x30\x24\xb4\x83\xf3\xf5\x19\x03\x6a\x3e\x94\xc8\xd7\x51\x0a\x85\x3a\xc6\xe2\x0c\x6e\x52\x6e\xe3\xcd\xb7\x6d\xe6\x63\xf6\x73\x05\xad\x80\xdf\x23\x42\xc8\x50\x1b\x4f\x4a\x8e\xe3\x66\x5a\x79\x8f\xc4\x37\xdd\x81\x4e\x4e\x47\xe7\xa4\x66\x89\x0e\x0f\xfa\x8f\x51\x0f\x3e\x6e\x19\xc9\xc9\x69\xf7\x0a\x76\xe5\xcf\x30\x54\xd1\x7d\xe4\x59\xac\x8e\xe9\x95\x50\xbd\x38\x31\x9f\x36\xe4\x33\x43\x4a\x92\x6a\xd6\x8b\x96\x1e\x0c\xa1\x0a\xdd\x4b\xa9\x92\xb3\x65\x06\x60\xa2\xc3\xc2\x6f\x5d\x74\x0a\x31\xaf\xb7\x76\x3f\x54\x2f\x72\x3b\x8a\x3c\x92\xd8\xae\x92\xa5\x67\x76\x4e\xfc\x70\x53\x03\x12\xba\xab\xdd\x3f\xbb\xd5\x27\xfe\x0f\xcb\xca\x3f\x6a\x70\x64\xcd\xde\x18\x56\xe9\x7a\xb7\x86\xaf\x7d\x70\x22\xa9\xd4\x6a\x33\x8e\x8e\x17\x54\xaf\xd9\xad\xac\x85\x6a\x38\xde\x2a\x4c\x97\x66\xde\xe8\xdb\xc7\x09\xb0\x67\x1a\x6a\x6e\x6e\x1e\x5d\x12\x07\x4d\x22\x24\x5c\xd7\x3b\xee\xeb\x1b\xd8\xec\xfc\x1e\x85\xa2\x1b\xde\x25\x3f\x7c\x46\x5a\xbc\x1f\xea\xa9\x61\xc0\xff\x5c\xff\x2d\x89\x64\x72\xae\x17\xab\x84\x88\xe3\x3f\xfe\xfd\xb7\x2c\x10\x5e\x20\x4f\x94\x4a\xda\x51\xee\x13\x98\x1a\x13\x6c\x0f\x38\x42\x6e\x3e\x49\xb0\xe9\x18\x41\xc3\x27\x94\xd5\x2f\x13\x35\xdf\xa6\x37\xf1\x51\xc7\xe4\x0f\x9b\x83\x0a\xed\x53\x9a\xc5\x73\x1b\x81\xcd\xe3\x26\x4d\x22\xbe\xad\x31\xa6\xcc\x68\xd1\xa7\x31\x43\xb5\xba\x48\x16\x13\x92\x32\xf3\xf7\xf9\x79\x83\xf4\xec\xba\x64\xc4\x95\x53\xbe\x9d\x6d\x94\x3f\x91\xdf\xe0\x3d\x1e\xe8\x61\x8c\xd4\x0d\x2f\xb7\x23\x8a\x31\xd1\xbc\x38\xe7\x6a\x55\x1f\x9e\xee\x22\xe7\x3a\x27\xd7\xa4\x8b\x40\x87\x72\xea\x72\xc3\xed\x63\x7b\xb4\xb1\x68\xf9\xd7\xae\xad\x94\xea\x03\xbc\x11\x10\x99\x01\xc8\x89\x92\x7d\x51\xcd\xac\xf9\x62\x12\x59\x62\x55\x99\x79\xd3\xe4\xc8\xe3\xb5\xae\x58\x2f\x2d\xba\xd4\x99\x88\x02\x85\x6c\x4d\xf6\x9e\x8f\xb5\x49\x17\xe2\xf3\x6b\xb6\x7a\x19\xa2\x6e\x9a\x9a\x94\x85\xbc\xe9\x8d\xbf\xff\x0d\x2b\x02\xb9\x37\x7a\x91\x37\xa7\x34\xe5\x7b\x5c\xe6\x65\x05\x30\x17\xe9\x92\x67\x7a\x1a\xa0\x79\x24\x0d\x2c\xf9\x63\xcd\xf9\xbf\xea\x8d\x46\x00\x91\x23\x2d\xaf\x89\x80\x1f\xd7\x51\x71\xa6\x19\x5a\x5c\x04\x68\x15\x91\x4b\xe1\xf6\x28\x68\x78\x3d\x6f\x2c\xf2\x8a\xf9\x37\x8d\x6c\x68\x93\xe7\x5d\xe6\x41\x11\x1c\x68\x47\x27\xef\xfa\x31\xb8\xbc\x9b\x0a\x01\xdb\x9c\x9e\x81\xcc\xd8\xf4\xd4\xe8\x75\xd4\xbd\x90\xd2\x53\xf5\x89\x89\xa8\xa5\x2a\x20\x3a\x77\xa4\x96\xd6\x97\x98\x6b\x03\x1e\x9f\x69\x9b\xc6\xa1\x6c\xd5\xf9\xc3\x60\x18\xeb\xda\xa3\x6b\xad\x0e\x01\x4f\x4c\xf3\xb4\xb7\x46\x17\x1b\xf8\x93\x14\xe8\xb7\x2c\xbd\x47\xcc\x61\x6a"}, +{{0x23,0x8a,0x6d,0x49,0x79,0x32,0x1a,0x14,0xa9,0x97,0x23,0x6f,0x45,0x85,0x04,0x6c,0xf7,0xa0,0x5c,0x0a,0xdc,0x6b,0xa1,0xfd,0xb1,0x9e,0xc2,0xa3,0x2f,0x62,0xbe,0xeb,},{0x0b,0x4b,0xa6,0x74,0xe4,0x01,0x66,0x5b,0x67,0x90,0xcf,0xda,0x08,0x07,0x04,0xcd,0x90,0xe2,0xf3,0xd3,0xef,0xab,0x25,0x3e,0xd8,0xdc,0xfb,0xd1,0x8e,0x40,0x67,0x89,},{0x29,0x42,0xf7,0x08,0xc0,0xed,0xe4,0xcb,0x0d,0xde,0xf1,0x3b,0x85,0xd7,0x1d,0x72,0x13,0xe0,0x38,0x3d,0xd2,0x94,0xf5,0x34,0x13,0x5f,0xd6,0x9c,0xaf,0xbc,0xfc,0x0e,0x33,0x09,0x0a,0x2a,0x0c,0xa3,0xfa,0x57,0x2c,0x72,0xcd,0xf5,0x59,0x2d,0xe9,0x03,0xb1,0x58,0x44,0x95,0xab,0x63,0x99,0x81,0x50,0xf2,0xb3,0x93,0xa3,0xb3,0x40,0x0c,},"\x97\xcd\x61\x9a\x22\x51\xed\xa9\x16\x64\x64\x31\xd4\xcd\x15\x98\xc2\xd4\x4d\x06\xaf\x3e\x48\xbd\x18\xe3\xde\x7f\xb4\xbd\x4f\x78\xe0\x0a\x69\xee\xab\xde\x3f\x82\x06\x5c\xfe\xe6\xcd\x71\x1f\x07\xd2\x26\x37\x16\x1f\xf6\x85\xf6\x5a\x7d\xdf\x54\x55\x31\x97\xfd\x31\xc5\xc6\xb7\x1d\x9e\x36\x5a\x94\x1d\xce\x4c\x3e\x22\x5d\x19\xcc\x63\x3a\x7e\x12\x86\x2c\xd2\x3e\xbb\x7c\x74\xa7\x04\x85\x0f\x76\x1a\xc0\x24\x1b\xe5\x17\xce\x7c\x36\x09\x36\xce\x07\x25\x0d\x9f\x2e\xb2\x78\x71\x15\xee\xc3\x77\xe1\x13\x4d\xc0\x8f\x44\xeb\x0a\x2a\x2a\x27\x16\xf0\x01\x44\xa4\x9f\x01\x2a\x57\xb3\xcd\x06\xef\xeb\x3f\xae\x92\x0f\x28\x5c\xff\xd9\xa4\x01\xa0\xb9\x86\x59\x4e\x17\xb2\xc9\xc8\xfd\xab\x83\x5d\x9f\x3f\x5d\x47\x4b\xe7\x33\xc1\x92\x5e\xe6\xf0\x93\x86\x71\x10\x66\xc3\xfc\xd6\x45\xee\xb0\xfb\xe7\x05\x41\x69\xeb\x70\x9d\x4a\x3f\x0d\x16\xf2\x8a\x1f\xf5\x06\x6c\x84\x2b\xc6\x3e\x35\x9e\x92\x48\x5b\x38\x75\x7f\xf4\x6c\x27\xf7\x9d\x0c\xdc\xf0\xe1\x6e\x97\xe3\xc7\xb7\xe2\x17\x8d\xff\xd2\x70\x28\x2d\xd6\x12\x05\xd5\x85\x4d\x84\x1f\x0e\x3f\xc0\xe4\x82\xcc\x1e\xe4\x85\x52\xcf\xe6\x58\x93\x5b\x54\x27\xc3\x66\x23\x0a\xef\x79\xae\xf4\x02\x1d\x6f\xab\x5f\x18\x75\xcc\x84\x9e\x32\x1a\x75\x50\x0e\x9e\x1b\xa5\xdd\x59\x6b\x43\x8c\xf8\x8b\x23\x5b\x01\xa6\x76\x25\xc4\xbf\x84\xd0\x72\x4a\xe6\x88\x0a\x37\x85\xe3\x3b\xd9\x23\x5f\xd0\xf5\x98\x18\x04\xd2\x1c\xbd\x63\x3c\xb1\x80\xf3\x44\x56\x46\x02\x07\xa2\x90\xa2\x54\xd9\xfe\x61\x06\x3d\x40\x63\x4c\xa3\x87\x2f\x09\x35\xfa\x28\x32\x87\x95\xca\x41\xb0\x06\xa2\x11\x1f\xc5\x93\x2b\x1e\x77\x9c\xe9\x66\xcc\x47\xad\xb7\xc0\xdd\x98\x73\x33\xba\x75\x29\xa1\xa4\x99\x6c\xe9\xf5\x6e\x05\x19\x81\xfe\x1f\x55\x3e\x57\x8f\x43\xc3\xba\x94\xbe\xac\xc9\x3c\x3e\x73\x96\x67\xc7\xa7\xc6\xfa\x27\xe1\xe0\x81\x69\x5d\x20\xba\x70\x5c\x3f\x10\xb2\x0d\xf5\x30\xcb\xb0\xec\xb8\x74\x56\x50\x11\x09\x68\x70\x19\x31\x84\x52\x78\x5d\x38\xe7\x66\xb3\xcd\x35\xb0\x07\xd7\xe3\xcf\xe0\xb2\xcc\xa8\xaa\x6e\xf7\x39\x55\x99\xdc\xb9\xc4\xd2\x8b\xcc\x35\xc7\x6d\xfc\x35\x34\x3c\xb1\x34\x8b\xa3\xe9\x62\xf1\x0e\xe8\x6f\x86\xf5\xb6\xd4\xca\xe2\xe8\xc2\xb1\x85\xe3\xea\xa1\xae\xb8\x7b\xcf\xcf\x2f\xb7\x6c\xc7\xfc\xc6\x89\x50\x71\xb1\x68\xe8\xb7\xf6\xca\xa0\xfd\x63\x98\xe7\x78\xcc\x07\x91\x2f\xf5\xd6\xe6\x10\x21\xa8\xa5\x9a\xe0\x35\x21\x60\xf5\x6d\x54\x88\xfe\x2f\x2a\xcc\x94\x03\xda\x9a\x9f\xfc\x66\x1c\x1e\x9d\xc5\xbe\x88\xc4\x20\xdb\x0f\xd7\x7d\x84\x5d\xc8\xdd\x9d\x8e\x58\xf9\x96\x1b\x79\xaf\xc6\x86\x24\xba\xa8\x6a\xa6\x43\xa8\xa3\xc7\xed\xf7\x1d\x55\x3c\xc0\xd3\x22\x4a\x60\x69\xec\x67\x4f\x52\xda\x29\xa1\xcb\x60\xc4\x19\x23\x01\xa2\x43\x47\xa8\xaa\x83\x26\x26\x9e\x0a\x14\x78\x0c\x95\x83\xcd\xff\x51\x59\x27\xfd\x5b\xef\x52\x8f\x9d\x23\x78\x7a\xeb\x80\x3d\x70\xeb\x91\x6b"}, +{{0x59,0xd5,0x01,0x39,0x3d,0xc5,0x99,0x97,0x23,0x81,0x07,0x06,0xfa,0xd7,0xd6,0xef,0xd1,0x63,0xc4,0x47,0x10,0xc7,0x41,0xc1,0x85,0xc2,0x7e,0x04,0x25,0xe3,0xc0,0x5b,},{0x82,0x65,0xd4,0x3c,0xfb,0x07,0x35,0xb5,0xd7,0x25,0x0f,0xcf,0x0f,0xcb,0xd1,0x54,0xbf,0xc0,0xee,0xcb,0x13,0xb7,0xad,0x93,0xb6,0xb0,0x29,0x40,0x58,0x8b,0x84,0x3b,},{0xe6,0x46,0xf1,0x64,0xcf,0xed,0x8c,0x2e,0x06,0x07,0x10,0xdc,0xfb,0xc3,0xe9,0xfa,0x5e,0xb3,0x96,0x37,0x68,0x13,0x19,0x01,0x84,0xe3,0x46,0xf5,0x2b,0xb0,0xba,0x57,0x46,0xcc,0xb6,0xb5,0x95,0x22,0xb1,0xaf,0xf9,0x83,0x0f,0x2f,0x98,0xb9,0xe5,0xda,0xfc,0xd8,0x32,0x07,0x78,0x83,0xc4,0x4e,0x8a,0x35,0x38,0x8f,0x71,0x8b,0xf4,0x0c,},"\x56\x4e\xd2\x2c\x17\x2f\x5c\x3a\xfb\xb0\xb9\x5a\xd2\xfc\x64\xe4\xbe\x6d\x4d\xb1\xeb\xb8\xd3\x99\xc4\x3a\x5e\x16\x04\x8e\x7f\x87\x32\x18\x1e\x5d\x0e\xed\x8e\x63\x8e\xf2\xa5\x5a\xa0\xd7\xb6\x81\xfe\x02\xbb\x54\x23\xaf\x94\xbd\x35\x2d\x3c\x2d\xde\xc0\xf8\x47\x60\xa4\x11\x2b\x4f\xe0\x17\xcf\xbc\x50\x2f\x95\x43\xcf\xa4\x1f\xb2\xaa\xe7\x5a\x3a\x08\x1f\x8c\x49\x90\x33\xd1\xfa\xe5\xd9\xc5\x0c\xb4\x4d\xbc\x63\x60\x5a\x54\x39\x8f\xbf\x07\x98\x52\xeb\xa8\x6f\x2f\xdf\xc2\x72\xd0\xc4\x17\x9d\x7c\x13\xcb\xc1\xc2\xa3\xda\x0b\x82\x84\x5c\xf1\xa4\x6e\xbb\xe3\x1e\x79\xb6\x00\x97\x33\xc7\xbf\xe7\xaa\x4f\x9f\xfd\x71\x9c\x77\xdc\x7d\x74\x8e\x49\x2e\x14\xee\x5e\x41\x79\xbf\xa9\xe6\x49\xcf\x0d\x89\x53\x41\x86\x38\x5e\xe9\x94\x10\x05\x1d\x66\x56\xe6\x23\x43\x8c\xc7\xb2\xe7\x07\xe4\x8c\x84\x91\x55\x49\xae\x8d\x67\xa3\x06\xc6\x7b\x10\x6b\x7a\x25\xf4\x5f\x8e\x10\xdd\x7d\xd3\xea\xac\x31\xf1\x05\x22\x57\xeb\x6a\x75\x76\xb6\x85\xcb\x9e\x6c\x1c\xd0\xd7\x3c\x7a\x3c\xed\x5a\x8d\xd2\x73\x08\xae\x00\xf9\x5e\xab\xda\xe9\xd1\xc4\xaa\x89\x34\xe2\x42\x4c\x93\x28\xa5\x22\x8f\x4f\x82\xdd\x4a\x66\x55\x6d\x82\x17\xc5\xa2\x2b\x2b\xeb\x86\xa2\xa4\x34\x13\xee\x5e\x10\xf8\x83\xf2\xcd\x6c\x2e\x87\x49\xb5\x50\x88\x42\xec\xae\x5f\xfc\xcb\x79\x6d\x96\x33\xe8\x7e\xf4\xa9\x6c\x0d\xf7\xef\x47\xb2\x83\xd0\x96\x72\x3b\xa3\x13\x5b\xad\x75\xb2\xe1\x9e\xc0\x4f\x70\xa4\x78\x42\x8a\xd5\xd0\xaa\xc0\xdd\x2a\xb9\x90\x59\x13\xe7\xe5\xad\xe4\x08\x80\x1d\x5d\x3c\x54\xd9\xcf\x7b\x8f\x0f\x0c\x5e\xb0\x54\xc1\x47\x5c\xc2\x10\xa2\xc7\x98\xd8\xbd\x89\x93\x2f\xf9\xf3\x60\x42\x18\x58\x05\x3a\x70\x7b\x8b\xbd\x32\x05\x5c\x44\xb2\x07\x12\xa2\x67\x8a\x9a\x6a\xf9\xe3\x6d\x04\xdc\xff\x44\xf4\x31\xcf\x19\x30\xcd\x18\xfc\x93\x5d\x22\x67\x77\x5c\x69\x09\x67\x25\xed\x89\xa2\x91\xdd\x60\xe2\x1a\xc0\xb0\x12\x87\x34\x07\x29\x92\x82\x3e\xf8\x7b\x5e\xfa\x6c\xc5\xb0\x50\x17\x7f\x55\xf4\xce\xc9\x2a\x08\xa6\x5b\xca\xdc\xab\x9a\x41\xc3\x60\x86\x37\x0b\x7b\x9d\xd6\x29\x8a\xc7\xb0\xae\x6a\x09\xc9\x71\x0a\xbb\x46\x76\xa8\xfc\x87\xa3\x65\x12\x90\x14\x4b\x6b\x30\xef\x4f\x6f\xbe\x5b\x9a\xd2\x52\x37\xfe\x06\x05\xe3\xb9\xf1\x8a\x77\x18\xac\x9f\xca\x6f\x32\x5e\xa5\x5f\x49\xa8\x07\xfb\x80\xa2\x40\x2a\xe1\x34\x23\x08\x0d\x32\x77\x58\x64\x90\x23\x79\x8d\x57\x28\xe0\xdc\x64\xac\x88\xa6\xe2\x94\x5d\xbb\x3e\x3f\xfa\x9f\xdb\x4c\x7b\x58\xfb\xa3\xf5\xfb\xd6\x7c\x68\x6b\x29\x71\xbb\xd8\xba\x4d\x27\x5d\x57\x3e\xb7\x96\xeb\x91\x46\x77\x5d\x8c\xdc\xd5\xfd\x3e\xb5\xa8\x8e\xa5\xa9\x30\xec\x32\x44\xe6\xa3\x7c\x81\xf6\xa2\x55\x4e\x5b\xa7\x87\xf0\xe4\x53\x19\xfe\x4b\x8a\x2f\xfb\xfe\xd5\x07\x70\xe7\x82\x7b\x3e\x7b\xc2\xb4\x4c\xe5\x12\xae\x60\x51\xb6\xf9\xf1\x39\x31\xea\x6a\xcc\x09\x6b\x8d\xcb\x01\x96\xbe\x42\x24\x84\xdb\x5f\xcb\x29\x9d"}, +{{0x83,0x9f,0xb1,0x32,0xe6,0x92,0x50,0xca,0x1a,0xd9,0x45,0x10,0x08,0x7f,0x92,0xce,0x06,0x87,0x69,0x21,0x3a,0x19,0xb2,0xa6,0xc8,0x94,0x90,0xf1,0xf5,0x78,0x80,0x7a,},{0xeb,0x58,0x66,0x19,0xb4,0x4a,0x15,0x37,0x9a,0xcc,0x46,0x21,0xa2,0xac,0x71,0xea,0x58,0x97,0x00,0x26,0xc2,0x8e,0x24,0x09,0xfc,0x1b,0xa2,0xbd,0x8b,0x23,0x6d,0x1d,},{0x66,0x43,0x7b,0x6b,0xc0,0x5e,0x75,0xdd,0x16,0x26,0xc3,0xc4,0xff,0x1f,0x72,0xe6,0xdb,0x38,0x1b,0xa1,0x59,0x09,0x48,0xf8,0xf1,0x6a,0xd4,0xd6,0x6e,0x59,0x91,0x65,0x9a,0xa8,0x44,0x05,0x56,0x8c,0xfb,0xc0,0xa7,0x7c,0x02,0x5e,0x59,0xe4,0x3f,0xd5,0x3a,0xb9,0xff,0xab,0xba,0x7b,0x25,0x8f,0x78,0x79,0x62,0x39,0xf9,0x0d,0x45,0x01,},"\xc5\x72\x32\xfe\x32\xf1\x1e\x89\x4b\x43\x7d\x40\x45\x62\x07\xcc\x30\x6d\xb4\x81\x69\xb2\x0e\x07\x81\x10\x3a\xff\xe8\x02\xf5\xaa\xbe\x85\x82\x95\x2c\xa8\xe9\x57\x45\xe9\x94\x0d\x53\x5e\x00\xff\x65\xab\x3c\x64\xbe\xd3\xd1\x17\x3a\x0f\x3d\x70\xce\x4e\xbe\x2b\x50\xd0\x48\xbb\x47\x16\x4d\x2a\x2c\xd9\xd9\x5a\x10\xcf\x0d\x07\x3e\xd1\xc4\x1b\x3d\xe3\x33\x52\x8e\xe3\x29\x68\x22\x3a\x0d\x84\x7c\xad\xbb\x5b\x69\xf3\x82\x16\x4e\x9a\x28\xd2\x3e\xc9\xbd\xe9\xa8\x28\xe8\x77\x1c\x9e\xb4\x92\x20\xaf\x54\x18\x55\x08\xaa\x07\x3a\x83\x91\x95\xf1\x03\xbc\x2f\x32\xfe\x04\xf9\x51\xca\x45\xbf\xbf\x30\xd2\xfb\x81\x14\x05\x6a\x73\x6a\xdd\xf2\x7e\xcd\x9a\xf0\xf6\xe5\xe9\x7e\x57\x73\xc4\xfa\x90\x22\x68\xc3\x2a\x15\x14\x10\x95\x5f\x3c\x76\xaa\xe2\x55\x54\x9e\x0f\x03\x3f\x89\xe1\xa7\x8f\x26\x5c\xba\xb6\xbe\xb7\x51\x6d\x4b\xad\xc4\x9c\xda\x45\x88\x31\x62\x25\xb4\xc8\x5e\xa9\xfa\x99\xc7\xd6\x76\x6e\x94\x90\xc4\x9d\xe5\x9d\xa7\x17\xf6\x67\x65\x35\x30\x07\x1d\xd2\xf0\xc5\x3e\x31\xd8\x76\x81\x56\xfe\xb0\x8f\xaf\x00\xdb\x0a\x04\x53\x3d\xf9\x79\x57\xa8\x4a\xa4\x6a\xeb\x7e\x36\xc0\xb0\xbe\x69\x01\x89\x46\xf1\x53\x8a\x6a\xea\x71\xdf\x53\x6f\x14\x42\xc2\x44\x4a\x43\xa0\x43\xd0\x46\xab\xde\x1a\x78\x2b\x0f\x4f\x5c\x6a\xa7\x20\xaa\x60\xaf\xed\x94\x7c\x0c\xee\x47\x7d\xbe\xc0\x05\x57\xb3\x72\x12\xd9\x33\x57\xca\x2b\x6b\x6f\x82\x71\x5b\xa0\xe4\x84\xf6\xda\xf2\xd0\xb7\xa9\x8c\x03\x35\x19\xce\x38\x26\x35\x86\x79\x6d\x5d\x31\xcb\x2b\xc3\xd1\x12\x5b\xc0\xcc\xd3\x29\xa5\xc2\x1f\xd2\x7a\x21\x8d\xed\x60\x7a\x0e\x75\x15\xb5\x71\xf1\x92\xc3\x3f\x5f\xba\x51\x4a\xfe\x4d\x45\x81\x00\xf3\xcc\xba\x3f\x38\xeb\x43\x0b\x4f\xc8\x8f\xae\xf9\x99\xfa\x71\xee\xe4\x88\x22\x89\x03\xbe\x29\xf2\x4d\xf8\x1d\xc9\x11\x04\x4e\x92\x4c\xda\xa0\x17\xcc\x7d\x87\xe5\x6a\x6c\xba\x87\x60\x85\x9b\xd6\x3d\xd2\xd4\xf5\x81\xb9\x55\xec\x92\x4a\x49\xaf\xb4\x7c\xa0\xd6\x3e\x78\x26\xfd\xc7\x12\xb4\x94\x3b\x73\x9e\x18\x57\x75\x5a\x33\xc6\x50\x36\x75\xfd\xde\xae\x06\x27\x06\xe3\x4f\x74\x4f\xd9\x32\x64\x8a\x56\x08\xce\x60\x8a\x61\x99\x57\x83\xf3\x33\x9c\xa3\xfe\x10\x7e\x19\x72\x74\x4b\xf6\xd4\xed\xaf\xbf\x47\xce\x02\x1e\x05\x82\x1f\xb1\x24\xc7\x08\x39\x30\xe6\x8e\x6f\x5c\x32\xd2\xd9\xfc\x4a\x88\x4c\x0b\xc8\x84\x04\xe4\xcf\xe3\xc1\xa2\x42\x0d\x41\x82\x3a\x38\x5f\xb3\x28\x8d\xb6\x5c\x89\x54\x5f\x6e\x73\xf0\xd8\x00\x4b\x2b\xa1\x2a\x4e\x07\x72\x75\x23\xef\x08\x56\x70\xda\xff\xaf\x41\xc2\x8a\x4c\x11\x57\xbd\xd2\x45\xe6\x87\x50\xdd\x20\x0e\x02\x3a\xf9\x0c\x67\x56\x1e\x0f\xe4\xba\x34\x0c\x43\x3f\x75\x5e\xef\xab\xd4\xb0\x39\xbf\xc3\x23\xdc\x11\xad\xb7\x5a\xec\xc4\x48\xa8\x69\xc7\xf2\xa5\x8b\x9d\x86\x17\xc6\x4b\x8f\x89\xfc\x58\x3f\x8c\x94\x8e\x2d\xf0\x25\x1a\x6c\x7d\x8c\x73\x8c\x3b\x5a\x42\xb7\x49\xad\x5e\x8e\x98\x6b\xd8"}, +{{0xad,0xc1,0xe5,0x6c,0x3a,0xc9,0x4e,0x6c,0xda,0x04,0x11,0xcb,0xc3,0xce,0x2a,0xf1,0x28,0xd1,0x85,0xa2,0xa2,0x73,0xbd,0xb2,0xaf,0x8d,0x7e,0x50,0xfb,0x96,0xb5,0x26,},{0x5d,0xcf,0xec,0x1f,0x91,0x12,0x75,0x15,0x64,0xec,0xb6,0x07,0x15,0xeb,0xb2,0xc5,0x17,0xb5,0xec,0x37,0xb2,0x53,0x4f,0xd6,0x32,0x99,0x24,0x42,0x9b,0x7f,0xd5,0xc5,},{0xf0,0x2e,0x5d,0xbc,0xb6,0x87,0x04,0xaf,0xad,0x03,0xac,0xa8,0x10,0x61,0xdb,0xdb,0x99,0x85,0x70,0x04,0x9f,0x10,0xce,0x65,0x0e,0xc7,0xa2,0xef,0xf1,0x5c,0x79,0x3d,0xdf,0x5a,0x27,0x2c,0xb6,0x83,0xc2,0x2c,0x87,0x25,0x7c,0x59,0xbd,0xef,0x39,0xef,0xea,0x79,0xbd,0x67,0x95,0x56,0xea,0x15,0x05,0xed,0x00,0x36,0xcb,0x46,0x04,0x0c,},"\xd4\xf9\x59\x47\x4e\x0b\x89\xe2\xdc\xd0\x20\x66\x98\x4f\x88\xd7\x39\xdd\x11\x34\xa3\x33\x09\xf0\xa8\xb7\x80\x2e\xaf\x01\x33\x03\xc1\x35\x15\xdf\xeb\x46\x1e\xa3\xd2\x48\xe9\x98\xb9\xa4\xe5\x4d\xae\x5b\x00\x19\x0a\x45\xe7\x0d\xc6\x7e\x98\xf3\xd4\xcf\x90\x6c\x21\x4d\x4f\x63\x6d\x29\x52\x92\x5e\x22\xb1\xa8\x6a\x1a\xab\xb3\xa8\x92\xa9\xf8\xed\x45\x4f\x39\xc6\x3d\x35\xb7\x1e\x87\xa2\xda\x55\xa8\xe1\x67\xac\x83\xa8\x66\xad\x16\x7a\x17\xae\xd1\x83\xc0\x85\x18\xc1\x5e\x6b\xe3\x48\x58\xb4\xce\xe2\xb8\x42\x73\x14\x76\x0f\xff\xdd\xd5\x92\x38\x54\xb1\x74\x7f\x79\x6e\x1a\x52\x49\xfb\x30\x44\x89\x4e\xd6\x46\x82\x9f\x65\x43\x16\xee\x52\xf4\x01\x0c\x8d\xd3\x21\xfa\x1d\xec\x39\x7e\x50\x14\x5e\xd9\xe3\x16\x86\xfd\x52\x03\xf7\x23\x3b\x8d\xa7\x80\xac\xaa\x91\xee\x0b\x5b\x47\x20\x78\x66\xaa\xd8\x5f\x83\x7e\x03\xb4\xe6\xf6\xde\x8c\x04\xac\xaf\xd7\x07\xbd\xc1\xdd\x45\x50\x0a\xb5\x64\x80\x1b\xee\x9a\x58\xec\xe3\x60\xd0\x04\x82\x8b\xaa\xf5\x23\xe2\xf5\xab\x69\x32\x6a\x03\xaa\xbe\x01\x08\x78\xfd\x43\xff\xaa\x56\x87\x22\x44\xd7\x68\x1f\x16\x18\xe6\x23\xe3\xd4\x74\xc7\x3a\xf8\xb0\x80\xa6\x18\x21\xa5\x74\xef\x2f\xd7\x52\xd2\x3b\x60\x5e\xc5\x21\xc1\x9c\x15\x50\xde\x98\x0c\x09\x4d\x05\xe0\x23\x8f\x3e\x00\x8e\x6b\x19\x5a\xbf\xdd\x40\x28\xee\x1e\xe1\xd6\xc6\x6a\x76\xf1\x78\xf0\xb4\x31\xe4\xaf\x44\xdd\xcc\xfc\x52\x90\xed\xff\x36\xec\xe6\x3e\x83\x85\x56\x70\x13\xf4\x3a\x2a\xeb\xb6\x7e\x3e\xf4\x06\x30\x8c\x20\x48\x8a\x76\xd5\x8a\x21\x4f\x31\x39\xd9\x83\xb1\x9a\xfb\x12\xe3\x28\x36\x07\xfd\x75\x10\x7b\xd3\x1f\xeb\x62\x56\x17\x4b\x7a\x18\xae\xca\xc9\xf8\x56\x25\x82\x01\x8b\x0e\x6d\xe4\x05\x35\xe3\x5b\xef\x2b\x56\x25\x53\x88\x51\x29\x39\x75\x62\x90\x0d\x34\x17\xf9\x8c\xdd\x1e\x29\xd7\x31\xff\x48\x93\x3f\x29\x52\x95\x81\x63\xba\x67\xd5\x95\x61\x81\x1b\x83\x77\x2b\xd0\x57\x10\xb6\xe3\xcc\x04\x34\x60\x99\x37\x50\x72\x23\xab\xb7\x1a\x6a\x8c\x83\x8f\xec\xdb\x1d\x2d\x37\xc9\x5d\xc8\x06\xf6\x5f\x3f\x96\x63\xd9\x9f\x06\xe6\xc0\xf3\xc3\x2e\x95\xaf\x1d\xd7\x08\xe8\x11\x08\x63\x6a\x26\xb9\x68\xe9\x83\x39\xc7\x41\x28\xb6\xcf\x67\x13\x35\x88\x4a\xc7\x2f\x75\xb6\x37\x19\x5e\xa9\xec\xa0\x53\x60\x89\x96\xc3\x2e\xd4\x45\x41\x0f\x67\xfa\x10\x4b\x39\xf0\xfd\xf3\xc9\xb5\xc6\x15\x7b\x76\x80\x37\x56\xb2\x7f\x4c\x3b\xa1\xb4\x7f\x32\x85\x76\x24\x8e\x9b\xc5\x3e\x7b\x8a\xb0\xb2\xed\x97\xc2\xf9\x99\x8b\xcc\x7d\xfe\x39\xe2\x64\xaa\xd3\x0c\x6c\xfe\xf2\xb5\x55\x3f\xfb\x5a\x69\x9a\xa4\xbd\x0e\xab\xe4\x38\xce\x05\x22\xcc\x91\xfe\x4e\x72\xbf\x7e\xac\xba\x47\x71\xcc\xf6\x3a\x37\xaa\xfc\xad\xbf\xbf\x99\xdd\x76\xb8\x5b\x80\xee\x07\x5d\x3a\x7d\x1a\x90\xa5\x5b\x77\x29\xa5\x41\x6e\x5b\xe6\x96\xbf\x9f\xb7\xf3\x15\x8c\xfd\xb5\xcf\xda\xcd\xde\x81\x72\xee\x1a\xb9\x48\x6e\x24\xcc\xea\xd2\x9b\x45\x7a\xcf\x43"}, +{{0xdb,0x89,0xdf,0x6a,0x23,0xd8,0x90,0xb7,0xf0,0x02,0x60,0xe8,0x1f,0x4a,0xd9,0x8f,0xd0,0x94,0x40,0x36,0x51,0x31,0xe8,0x5e,0x22,0xc7,0x95,0x1a,0x18,0x7b,0x02,0x18,},{0xc9,0x67,0x63,0x67,0x2e,0xe4,0xa2,0xcc,0x5a,0x93,0xb6,0xa6,0x83,0xdf,0x9b,0x5d,0xe4,0xd9,0x38,0x6a,0x79,0x08,0x35,0x68,0x1d,0x12,0x17,0xd1,0x92,0x96,0xbd,0xc8,},{0x80,0xb7,0xfc,0x8b,0x6a,0xe6,0xee,0xce,0x81,0x66,0xb7,0xea,0x53,0x4c,0xb5,0xb2,0x14,0xc9,0xea,0x99,0x73,0x92,0x1e,0xd0,0x5d,0xe4,0x0c,0x78,0xe1,0x4f,0x16,0x2b,0x09,0xe9,0x78,0xca,0x6d,0x86,0xee,0x43,0x4d,0x98,0x4b,0x8b,0x00,0x70,0x40,0x9d,0xd2,0xad,0x11,0xb5,0x31,0x78,0xe2,0x39,0xda,0xb5,0xbc,0x39,0xc7,0xba,0x46,0x0d,},"\x54\xc1\xc5\x11\x1e\x08\xc9\x82\x45\xba\x4f\x13\x18\xba\x1d\xb1\xdc\xc7\x4d\x14\xa5\xc9\x8a\xb9\x68\x9c\xba\x1c\x80\x2c\x68\xbc\xfc\x81\xfd\x87\xff\xc6\x1c\xaa\x94\x2f\x66\xd7\xe5\x15\x7f\x65\x53\x8c\x7e\x7b\x33\x17\x04\x84\xb4\xb6\x54\x3f\x36\x20\xff\x29\x63\x8b\x64\xd4\xda\xe7\xb0\x22\x21\xcf\x77\x83\xf1\x87\xec\x42\x31\xe6\xb6\x94\x6d\x82\x76\x20\x74\xf0\x9c\x32\x78\x1c\x2f\x38\x46\xde\x3e\x82\x17\xf6\xe1\xb6\xe0\xd2\xb5\x59\x5d\x74\x2e\x2c\x4e\x32\x5a\x28\x41\x92\x40\x44\xdf\xcf\x12\xb4\x79\xeb\x69\xf1\xbb\xd4\x0e\xab\xdd\xd1\xff\x54\xa9\x18\x4d\x36\x6d\xff\x9d\x8f\x2d\x86\x3e\x37\x8a\x41\xf1\x0c\xd1\xda\xe9\x22\xcd\x7f\xbb\x2a\x54\x4e\x47\xea\xbf\x47\xca\x0a\x38\xab\xba\x34\x45\x49\x19\xbb\x9a\x4e\xf0\x44\xbf\xb9\x7b\x70\x8c\x2f\x74\x28\xd6\x8f\x9c\x57\xc0\xee\x7e\x79\x25\xf7\xa2\xb5\xc6\xe7\xdf\x82\xbb\x26\x80\xc8\x62\xdc\x7c\xc6\x8b\x0f\x54\x53\x0e\x64\xaf\xe2\x76\x3d\x9c\x7b\xaf\x45\xcc\x6f\xe6\x12\xd1\xf7\x82\x77\x39\xc4\x41\x13\x98\x88\x8f\x73\x67\xc3\xd4\x37\x79\x07\xac\xc0\x6a\x06\xf9\x3f\x88\x72\x26\x79\x8f\x48\xaa\x54\x64\xf6\x01\xc2\xc1\xed\xda\x77\xed\xfe\xb9\xb9\xb5\xd5\xf9\xcb\x6f\xed\x37\x90\x05\x47\x47\x7f\xca\x1d\x09\xab\x52\xd6\x3e\x49\x1f\xeb\x12\xfd\x6d\xc8\x05\xa7\x8c\xee\x3b\xaa\xde\x43\x52\x98\x20\x61\xde\xa5\xa2\x65\x3d\xb8\xe7\x60\x77\x72\xe8\x34\xb3\xa5\x05\xc1\x6d\xd6\xe7\xc7\x1b\x91\x1e\x84\x2e\xba\x92\x5d\x77\xa3\x3c\x5c\x57\xce\x11\x84\x09\x80\x78\xca\x2e\x6a\x3f\x69\xaa\x6a\x14\x63\x9d\xc9\x7b\x4b\x30\xc9\x9d\xc4\xfa\x3e\x2c\xf6\x3c\x70\x1c\x30\x6c\x5e\x25\x3c\x51\x13\x85\x4c\x18\x5e\xbc\x8b\x47\x98\xf6\x8d\x1f\xd7\x80\x05\x4d\x3e\xed\x2f\x39\x4c\x45\x43\x04\x96\x6b\xdd\xbd\x12\x28\x08\x34\xec\x9b\x40\xc1\xe9\x8b\xc2\xd9\x8f\x48\x45\xf6\xeb\x44\xf2\x53\x15\xee\xdb\x3b\x79\xff\xca\x41\x80\xc1\xbd\xdd\x97\xd0\xc9\xaf\xfb\xac\x58\x81\x49\x37\x68\x26\x80\x07\x6f\xe5\xa3\xba\xbb\x65\xd2\x8f\x25\x17\x03\x6c\x0c\xfb\x42\xf0\x29\x3e\xb2\xac\xb1\x39\x49\xfe\x91\xe0\xad\x06\x78\xaa\x24\x3d\x77\x34\xa8\x9d\x99\x78\x70\xbf\x9a\x6a\x58\x4e\xd6\xe6\x28\x16\x3e\x39\xd8\xaa\x61\x0d\x46\xb9\x28\x5b\x9e\x1d\xd7\xe8\xf8\x07\xfd\xf5\xca\x2b\xbf\x6d\xe5\xe5\xe6\x8a\xf7\xcb\x7e\xbd\x43\xec\xce\x22\x7c\xd7\x0c\x7b\xf4\xee\x14\x33\xed\xfc\xfe\x88\x66\x14\x67\x0c\xdd\x19\x63\x43\xfb\x91\xe1\x54\x16\xd2\xf6\xac\xba\xe3\xea\xdc\x03\x02\x31\xee\x9d\x2e\xcc\x52\xa8\x8c\xe8\xdc\x7d\x09\x8e\x7f\xac\x77\x68\x5b\x4e\xb5\x40\xe3\x01\x93\x07\x14\x32\x21\xb8\xef\x77\xf3\x63\x2c\x89\x3d\x55\x6e\x0b\xb7\x43\xa1\x96\x3e\xc1\x58\x86\xc8\x54\x5e\x87\xc9\x5c\xc8\x25\xf2\x00\xd0\xf3\xcf\x4f\x55\xa3\xd6\x60\xa5\x36\xa2\x3a\xef\xcc\x42\x8a\x43\x20\x34\x85\xee\x84\x34\x2f\x5c\x00\x1e\xe8\x40\x4e\x75\x90\x17\x00\x62\x82\xab\x8b\xa8\x90\x3e"}, +{{0x00,0xe6,0xbb,0x17,0xaf,0x3c,0x2d,0xf6,0x52,0xb3,0x4f,0x9a,0xbe,0x19,0xf9,0x90,0x19,0x07,0x42,0x33,0x68,0x6c,0x71,0x14,0xe3,0xa0,0xed,0xf0,0x83,0x09,0x93,0x4f,},{0x7b,0x82,0x32,0xa6,0x6c,0xec,0x2f,0x91,0x5a,0xaa,0x79,0x51,0xd2,0x9d,0x2b,0x9e,0xe9,0x3d,0x32,0x1d,0x15,0xb2,0x03,0xc5,0x1e,0x61,0xe8,0xce,0x83,0xd1,0x87,0xf8,},{0x04,0xb3,0xb8,0x50,0x1e,0x39,0x6c,0x4a,0x78,0x8e,0x14,0xac,0x49,0xf6,0x17,0x4c,0xdb,0x5c,0x85,0x5e,0x65,0x12,0x03,0xcf,0x68,0xd1,0xef,0xa8,0x9a,0xa5,0x86,0x78,0xd4,0xd1,0xf3,0x03,0xa9,0x87,0x7a,0x37,0x86,0xd2,0x03,0xc3,0x55,0xb0,0x9d,0x52,0x86,0xc1,0xca,0x0d,0xf0,0x4a,0x89,0xaa,0x06,0xcc,0x3f,0x9d,0x0f,0xd3,0x05,0x04,},"\x06\x32\x81\xe4\x1e\x8b\xa9\x70\x3e\xd0\x9e\xf3\xbf\x0e\xa4\x6e\x4c\xab\xdd\x6e\xbd\x76\x9d\x05\xdc\x04\x5d\x4f\x99\x0d\x69\xfc\x55\x41\x30\xa4\xe6\x1a\xa2\x1e\x2d\xe4\xc9\x2d\xb4\x8a\x20\xa3\x7b\x17\x47\xa7\xea\xc5\xeb\xb2\x73\x5a\x89\x38\x19\x7f\x13\x9f\xad\x14\x97\xb3\x51\xad\x06\x4c\x0f\x18\xf8\xfa\xf1\xfe\x11\xf6\x39\x79\xa6\x99\x68\xe2\x4c\xf9\x1e\x58\xa3\xab\x03\x26\x69\xe4\xef\xee\x27\x4f\x96\xb5\x8b\xe7\xd9\xe3\x91\xf3\x6f\xcf\x07\x09\xb2\xcb\x2d\x22\x69\x4a\x6c\xeb\x17\x24\x69\x45\xeb\xb3\xbc\x7f\x0f\x03\xbf\x0b\x08\xdc\x96\x26\xe3\xe7\x15\xc9\x91\x67\x1d\x53\xeb\xb9\xae\x83\xa7\xd0\x8d\x44\xf6\x36\x35\xc4\x0f\x8d\x48\x17\xf5\x8d\xe9\xeb\x77\xcb\x25\xb2\xac\xd6\xde\xf9\x69\xab\x56\x9e\x97\x4a\x8a\xda\xc1\x1a\x86\xb5\x8f\xe6\xc1\x00\x67\x49\x9f\xc9\x14\xdf\xf5\x69\x02\xcb\xc3\x93\xa7\x1c\xc2\x5e\x8f\x05\xc0\x3c\x94\xf1\x3b\x84\xa2\xb0\x1a\x58\xc1\x0d\xbc\xbb\x60\xeb\xce\xe4\x87\xf5\x29\x17\x74\x66\x29\x99\x25\xda\x50\xe2\xda\x5b\x55\x57\xf0\xae\xee\x3f\xd7\xf4\x7b\x5c\x2e\x3f\x84\xce\xfa\xb4\x67\x96\x91\x39\x4d\xd1\x22\x30\x3b\xb7\x69\xaf\xb3\xad\xfe\x83\x58\xb0\x2b\x67\x92\x73\xb3\x5a\xbd\xc6\x40\x25\x76\xcc\xce\x5e\x10\x44\x2a\x13\x7e\xf9\x45\x69\x39\xb2\x89\xef\x4e\x41\x7b\x1c\xc6\x23\x9f\x7c\xee\xdd\x68\xf1\xa8\x26\x41\x80\xe0\x68\xb4\x96\x6f\xd6\x7f\x2b\xad\x6e\xdd\x8b\x4a\x1e\x8d\x2b\x54\x2d\xaf\x26\xdb\x83\x1f\x1f\xb5\x1e\xb8\x6f\xfa\xde\xcc\xd9\xac\x3d\x66\x4f\x34\x6e\x7d\x04\x6c\x33\xa5\x72\x84\x1e\xa8\x33\x4e\x7f\x2f\x41\x7a\x05\x71\x2a\x9e\x33\x4e\x48\x7f\xd3\xae\x17\x54\x55\x16\x2f\xe8\xf4\x9c\xc0\x26\xa6\x40\xc6\xcf\x93\xcf\x58\x87\x50\x52\xf4\x1c\xc9\x82\x06\x15\x65\x3e\xa2\xd0\x84\xc8\x96\xea\xfe\x5a\xd4\x72\x55\x79\x65\x30\x84\x99\x4f\x95\x6d\x5c\x94\x59\x0a\x24\x09\x58\x1b\x6f\xc8\x6e\x40\xaa\x58\xbf\x6e\x60\x57\xa6\xf9\x0a\xf3\xb8\x7a\xea\xf3\x29\x94\xa5\x5a\x54\xf7\x9b\xdf\x3d\xbb\xf5\xce\x0f\xf8\x12\xe4\x86\xb0\x54\x5d\x9e\x9c\x2b\x0b\xce\x0d\x4c\x36\x47\xb1\x82\x72\x62\x49\x88\x34\xe1\x98\xa3\xec\x70\xf3\xb0\x3d\x6a\xad\x2c\x49\xeb\x80\xb5\xe2\x05\x14\x39\x22\x5f\xd9\xce\x94\x68\xd6\x9a\xf7\x0a\x26\x2e\xe3\xb8\xb6\x2a\x8e\x5b\x41\x34\x6d\xa3\x01\x2f\xfb\x45\x81\x6b\x7b\xec\xb0\xe7\x9a\x60\xbf\xf7\x16\x36\xa3\xe4\xbb\x1b\x35\xca\xf1\x95\xf5\x51\x17\x28\x0f\x78\x72\x17\xb3\xca\xa2\xe7\x93\x72\x6f\xc5\xa7\x4d\x11\x60\xdc\xad\x86\x89\x04\xc1\x97\x38\x11\x34\xed\x8c\x3d\xb3\x75\x0b\x75\x56\xf6\x9c\xcc\xe1\x8b\x77\x38\x8b\x58\xc5\xb8\x11\x3e\x59\x0a\xd6\xea\xc5\xb9\x1e\xce\x5a\x67\x05\x02\x5c\x80\x35\x3c\xeb\x1e\xd8\x4a\xaa\x1c\xc4\x8a\x41\x6b\xc0\x16\xae\xf1\x73\xbb\x80\xb2\xba\x28\xc5\x79\x60\xc6\xb0\x11\xb6\xb4\x95\xa3\xf3\x31\x1e\x79\xfe\x46\xbd\xb6\xa4\xc3\x81\xfb\x9d\xc4\x62\x8b\x0a\x83\x02\x35\x58\xf1"}, +{{0xfb,0xdd,0xf6,0xe6,0x1e,0x20,0xd8,0x06,0xe5,0x59,0x17,0x75,0x6d,0xe6,0x0d,0x0c,0x9a,0x99,0x97,0x6f,0x64,0x67,0x16,0xff,0x2f,0xf1,0x31,0x2c,0x54,0xdd,0x97,0x1d,},{0xac,0x53,0x8f,0xab,0xad,0x43,0x80,0xe6,0x0e,0x97,0x71,0x26,0xe7,0x69,0x5e,0xed,0xa5,0x41,0x7d,0x85,0xf7,0xd2,0x3d,0xb2,0x1b,0xd0,0xad,0x11,0x11,0x16,0xf0,0x5d,},{0x8c,0x9b,0x77,0xaa,0x0f,0x1c,0xf5,0x2e,0x8f,0x7a,0x91,0x8b,0x21,0xb4,0x68,0xe6,0x23,0x35,0x91,0x1b,0xc5,0x93,0x06,0xb3,0x0c,0xe7,0x7b,0xf6,0x92,0xc1,0x10,0x59,0xb0,0xee,0x9c,0x5d,0xaa,0xf6,0x83,0x9b,0xb8,0x13,0x73,0xc6,0x1d,0x28,0xd0,0x72,0x70,0x2b,0x59,0x5e,0x4d,0xce,0x28,0xcb,0x99,0x38,0x22,0xb2,0x48,0x13,0x04,0x0b,},"\x3e\x99\x53\xca\x55\xd0\xcd\x23\x3b\x98\x83\x3e\xb1\xbc\x79\xd3\xb5\x5f\x18\xc8\xfa\x1c\x42\x02\x7b\xca\x25\x57\x91\x53\xb5\x5d\xa0\xc5\xa1\x78\xb8\x38\x69\x56\xd9\xa5\x41\x83\xb2\x4c\x91\xdc\x4b\xe9\x94\x84\x72\x37\xd3\x66\x6a\x0a\x01\x30\xfe\x19\x92\x4b\xc0\xee\x50\x89\x6c\x35\xa2\xe1\x6a\x29\xe2\xe2\xac\xf1\x80\xbd\xd9\x37\x93\x54\x68\x7f\x0e\xce\x68\x82\xd2\x6e\x98\x0e\x68\x66\x98\x04\x3b\xb1\xb0\x12\x13\xaa\x64\x4a\x4f\x8d\x61\xf9\xb6\x13\xe6\x2e\xaa\x35\x76\xce\xa0\xb0\xb8\x3f\x05\xce\x25\x58\xff\x63\x56\x49\x5c\x45\xed\xe4\xa8\xf6\x5b\x81\x4a\xb8\xa7\x30\x94\x03\xdf\xd4\x3c\xbe\xa9\x08\x93\x93\x9b\x78\x00\xaa\x00\x23\x2b\x5f\x6b\x77\x14\xeb\xdc\xd8\xbc\xf3\x4a\x5a\x7e\x82\x2a\xc7\xb1\xb0\x99\xac\x61\x5f\x13\x5f\x8c\x35\x1d\xc4\x1a\xe5\xf6\x6d\x5f\x9c\x26\x00\x45\x4c\xa0\x1c\x00\x9b\xa6\xde\x04\x16\x2a\xe5\xf1\xf2\x70\x89\x3c\xa3\x90\x7a\xff\x7f\x78\xe0\x33\x96\xe3\x2b\x62\x2f\xf3\x40\x53\x7b\xf1\x23\xe5\x59\x95\xe9\x20\x96\x09\x33\x0b\x2e\xee\x51\x12\x74\x84\xa4\x0e\x25\x07\x00\x82\x3f\xeb\x0b\xc9\x7b\xb5\x09\xff\x73\x26\x75\xde\xc3\x2e\xcb\x63\x5e\xd9\x2c\x7d\x78\xfe\x30\x50\x20\x0c\xf1\xd9\x41\xd6\xb3\x88\x80\x0a\x84\x19\xd9\x6a\x59\x5e\xce\xd5\xec\x4e\xfd\xcb\x6f\x98\x7f\x54\x72\xa5\xc4\x30\x58\xd3\xa3\xa7\xbb\x56\xd7\x98\x03\x65\xed\x43\xdb\xc2\xbe\x48\xf1\xd1\x8c\xe7\x6a\x89\x18\x54\x26\xfd\x5c\x69\xdf\x7e\x92\x91\xab\x78\x23\xc2\x3a\x76\x94\x1e\xd3\x83\x6a\xac\x7b\x58\xc0\xd5\xfb\x6b\x63\x6c\x42\x47\x1a\x4d\x17\x03\x51\x6f\x03\xe9\x35\xf3\x1f\x19\x54\x50\xe5\x37\xb2\xa0\x7d\x54\x5b\xa4\xb6\x8a\xfb\x06\x38\xc6\x5b\xb0\xff\xaa\x0c\xfd\x69\xd7\x10\x48\x19\x79\x66\x19\xd4\x83\xa0\x24\x5b\x4f\xd9\x01\x7f\x62\xa7\xd3\xa5\xfc\x3b\x72\x89\xd7\x57\x35\xf2\x87\xca\x0a\x95\x1a\xd5\x83\x44\xb2\xab\x7d\x7d\xf8\xdb\xd7\x92\x2a\x5a\xbb\x8d\x7c\x2e\x79\x14\x7e\x6d\x36\xee\x31\xf9\x30\x47\x3b\x07\x27\xdc\xfd\x58\xd6\x44\xd7\xd7\x0a\x0e\xd3\x1c\xa6\xa1\x3e\xd9\xdb\xd2\x24\x49\x2e\xfd\xa1\x9e\x4f\x8e\xed\x46\x18\x0f\xe7\x50\xf0\x7b\xbe\x8e\x99\x85\x4d\x13\xf5\x8b\xa9\x68\xce\x38\x59\xd6\x11\x89\xcd\x2b\x66\x7f\x3b\x2d\x06\x65\xb5\x74\xc4\xba\xc1\x9d\x9e\x37\xe5\xb7\xa8\x0e\xb3\x34\xe3\x68\x10\x53\x0a\xa5\xd1\x76\x63\x93\xf8\x11\x5a\x52\x09\x0c\x91\x82\x34\x28\xc8\x97\xa5\xf3\x5e\x12\xa8\xaf\x2c\xd4\xfb\x13\x90\x7c\xa6\x60\x3a\x4f\x76\xf5\xc2\xe0\x23\x74\xa8\xdc\x3a\x47\xc1\xbe\x6f\x1d\x1c\x8e\xbc\x59\xb3\x6d\x1c\xfa\x0a\xb2\x3e\x9b\x0a\xe9\xb0\xe6\x37\xee\xed\xb9\xc6\x6b\xea\x62\xdc\x63\x0c\xde\xfa\x71\x82\x39\x61\x7e\x31\x18\xe5\xb6\xde\xb7\xc2\x94\x47\x52\x82\xe8\xab\xe2\x4f\xd5\xa5\x4b\x78\x6f\xff\x90\x28\xc5\xa0\x33\x38\x4e\x4b\xc8\x01\x4d\xec\x8d\xa1\x00\xa9\x4b\x17\x8e\xf8\x8e\xc3\x57\xb6\x6d\x2b\x90\x98\xab\x64\x79\x16\x96\xb1\xa6\x6b"}, +{{0x8a,0x55,0xe7,0x7b,0xb0,0xc8,0x74,0x0b,0x8c,0x2e,0x8d,0xdf,0xdf,0xdb,0x40,0xf2,0x7e,0x45,0xfe,0x81,0xfe,0x45,0x71,0x11,0xbf,0x1c,0x87,0x30,0xea,0xb6,0x16,0xb4,},{0x9f,0xf1,0xfd,0x0c,0x50,0xeb,0x24,0xf9,0x9f,0xe2,0xf7,0x71,0x1d,0x52,0x87,0x2d,0xfc,0x90,0x03,0x80,0xdd,0xdc,0xdb,0x86,0xfe,0x6f,0x4a,0x5f,0x35,0x0a,0x87,0x43,},{0x8a,0xae,0xba,0x53,0x5c,0x51,0x1c,0x31,0xd3,0xf8,0xe9,0x5c,0xb0,0x77,0xa9,0xa7,0xec,0x7d,0x08,0x44,0x1e,0x53,0x42,0xa6,0xab,0xe0,0xbf,0x2a,0x5d,0x7f,0xc9,0x30,0xb4,0x3d,0xac,0x3d,0x1e,0x8e,0xf2,0xcb,0x03,0x45,0x52,0xeb,0x4d,0x08,0x39,0xbc,0x8b,0xf2,0x94,0x55,0x1d,0xd2,0xd8,0x0c,0x53,0xfd,0x62,0x79,0x35,0x1a,0xc2,0x0c,},"\x20\xfb\x41\x4e\x26\x4a\x95\x47\x84\xf1\x12\xba\xce\x7e\x04\x74\xb3\x9c\xb3\xc9\xe5\x3d\xee\x0a\x21\xf4\xcf\x6d\x4a\x99\xb9\x34\x7d\xdf\xfb\xe2\x81\xa6\xc2\x30\xa7\x5d\x63\xa7\x2f\xd0\x5f\x6d\xb5\x3e\xa7\x01\x4e\xf7\x70\x9d\x18\xff\x97\x0f\x48\x5f\xe8\x3b\xa1\xd3\x71\x47\x33\x8a\xde\xd6\xda\x4c\xfd\xac\xc1\xe6\x9d\x2f\x3e\x0e\xf3\x62\xf4\x7b\x5b\xcf\xb7\x8a\x1e\x17\x9e\xb5\xc5\xb1\x06\xc8\xd8\x2a\x0a\x0b\x29\x0d\xf0\x75\xab\x27\x43\x69\x29\xcd\xe6\x56\xf0\x23\x09\xf9\x57\x50\xeb\x67\x65\x83\x26\x2e\x5f\x2f\x69\xf0\xff\x72\xa8\xe0\x57\x26\x63\x82\x26\x92\x05\x31\x87\x40\xbf\xe0\x6b\xf5\xc2\xcb\x45\x33\x90\x8e\xf9\xf9\xf2\x86\x9a\x75\xb9\x53\x35\x79\x82\x0e\x3b\xc0\xca\xff\xd6\x46\x17\x1c\x82\x86\xc3\xa4\xab\xa1\xff\x09\x15\xd9\x36\x11\x20\x5e\x23\x0f\x39\xff\x4c\x4c\xaf\x3f\x33\x3e\x75\x3f\xce\x2b\x71\x21\x3e\x53\xd6\x08\x41\x5e\xe1\x7f\xd4\x82\x12\xee\xdd\x88\x40\xf3\x37\x10\x1e\xf0\xd0\xb6\xf7\xbe\x4b\xff\xc0\x6e\xee\xfe\x80\x66\xdd\x27\xa0\x54\x1a\x46\x88\x31\xac\xdd\xc4\x90\x2e\x2f\xef\xef\xbe\xd1\x9c\x30\x8e\x56\x21\xe0\xbf\x46\xbc\xd5\x38\xaa\x13\xfa\xf0\x4d\x38\x07\x59\xc0\xe1\x07\xe9\x12\x00\x18\x39\xdf\xd0\xb6\x35\x44\x0e\x96\x38\xf5\x37\x7c\xa8\x45\x0f\x35\x0c\x01\x12\x9e\xe3\x37\x64\x41\x5c\x53\xcb\x2f\xfb\xf9\x68\xdf\x78\xb7\x42\xfd\x06\x65\xe7\x8a\x34\xab\xf4\xde\xcd\x1f\xd3\x86\x28\x9a\x13\x64\xe6\x45\x55\xee\xc5\x8b\x0a\xf9\xa4\xcd\x6b\x36\xd1\xd5\xc6\x11\xa2\x84\x6d\xfb\x55\x89\x34\x4b\xbb\xb0\x25\x60\x24\x1b\x74\xb9\x93\xa2\x5b\xef\x50\xfb\x1e\x73\x19\x08\x6e\x6a\x23\x98\x63\x00\x83\x4e\xd2\xdb\xa9\x8a\x16\x87\x21\xc2\xf7\x84\xdf\xb8\xd3\x80\x0d\x06\xa0\x54\xae\xf1\x4d\x17\x72\xb6\xc5\x74\xaf\x25\x63\xd1\x93\xef\x2e\x51\xbd\xc6\x2d\x2a\xbc\xe2\xee\xbe\xad\xa7\x92\x03\x49\x8e\x66\x86\xc2\x87\xf3\x7b\xd8\x8a\xeb\x16\x6f\x7d\xff\xc3\xe6\xad\x02\x94\x11\x7e\xf6\xee\x9d\xa8\x47\x9e\xd8\xa1\x6f\xe9\xbe\x24\x6d\x26\x68\x04\xf2\x96\x58\xdb\x75\xe7\xa0\x87\x3b\xe7\x1d\xc7\xd4\x07\xe3\x9f\xab\xd6\x6f\x98\x8b\x45\x74\x77\x42\x7f\xad\x81\x30\xf0\x9a\xb6\x65\xf1\x59\x7c\x90\x46\xe7\x37\x3a\xf9\xa8\x35\x2a\x86\x83\x0c\xb9\x2a\x80\x44\x88\x70\x0f\xe6\x89\x19\x24\xfe\x2a\x72\x01\x73\x3d\x95\xe5\x91\xee\x0a\x1f\xef\x1c\x26\x36\x07\x8d\x37\x0e\x7a\xd3\xb6\xa9\x44\xfe\xd2\xcf\x2b\x30\xab\xa2\xd5\x6f\x34\x95\xb2\x84\x9c\x03\xbb\x61\x4f\x48\xbc\x4e\x50\x7c\x39\x5a\x6c\x35\xd3\xee\xd4\xc7\xbe\x8e\x68\x0f\x2d\x45\xa3\x10\xb1\x87\xeb\x88\xcf\x0e\x8e\xd4\xde\x7d\x37\x24\x6a\x50\xa6\x36\x7b\x97\xee\x37\x84\x32\x2c\x0b\x71\x13\x1a\x28\x31\x98\xda\x48\x04\xde\x75\x1d\xcf\x70\xc4\xba\xd0\x0d\xd9\x8d\x87\x3a\x69\xdd\x1a\x09\xcf\x69\xdd\xfa\xd7\xae\x60\x35\x00\xb6\xa4\x62\x25\x80\x98\xd8\xb6\x6b\x85\x29\x35\x94\xe2\x08\x82\x9b\x52\x28\xfa\xe2\xfa\xfc\x39"}, +{{0x16,0x3b,0x0c,0xb6,0xa1,0x2e,0x8f,0x07,0xb0,0xc2,0x9d,0x6a,0x63,0xf6,0xa6,0x52,0xce,0x49,0x72,0x70,0xb5,0xe4,0x6f,0xcf,0x83,0x3c,0x99,0xbd,0x84,0x3f,0x8c,0x64,},{0x68,0xa3,0x5d,0xe4,0xba,0x6f,0x0f,0x82,0xec,0xf4,0xb1,0xe0,0xdf,0x8e,0x24,0xcb,0x4f,0x18,0xf2,0x10,0x3f,0xf0,0x4d,0xc1,0xb5,0x33,0x39,0x91,0xb6,0xd3,0x14,0xba,},{0x17,0x73,0x8f,0x57,0x26,0x55,0x07,0x80,0x65,0x1d,0x60,0x19,0x9f,0xda,0x39,0xd9,0xc4,0x76,0x8d,0xb5,0x91,0x7e,0x32,0x39,0x36,0x31,0xc5,0x4a,0x41,0x9d,0x59,0xf1,0x8e,0xf9,0x60,0xdd,0xd4,0x39,0x38,0x0d,0xab,0xc3,0x14,0x76,0x1b,0xd0,0xcd,0xb5,0x7c,0xce,0x48,0x1e,0x61,0x09,0xfe,0xd0,0x95,0xde,0xa6,0xe8,0x65,0xaa,0x67,0x0b,},"\x56\xa1\x60\x3f\x72\x5b\xe0\x76\x13\x05\x8c\xdb\x3a\xcd\xc5\x23\x54\xe3\xbb\x1f\xf2\xbe\xd1\x3f\x89\x51\x75\xb1\x5c\x8c\x5a\x90\xff\xbe\x46\xb1\x1a\x06\xcf\xe3\x62\xda\xdf\x73\x23\xc9\x40\x41\x72\x55\xaa\x7a\xa5\x43\x12\x10\x3e\x71\x46\x3d\xaa\x0b\x5c\xda\xeb\xd0\xbe\x72\x3c\x73\x22\x73\xe3\xc3\xf5\xbf\x7a\xa3\x51\x9d\x69\xdf\x6f\x47\x70\xda\xa1\xdf\x82\x80\xbb\x3c\xd2\xc7\x14\xac\x03\x02\x00\x54\x65\x79\xf5\x6c\x60\xb9\x1a\xe1\x1f\x4c\xf8\x74\xa3\x5f\xc5\x9b\x35\x4b\xed\x80\xf5\x6e\x11\xa6\xcd\x62\xa8\x8c\xe6\xb4\xf6\xbf\x39\xd6\x4c\xe3\xd8\x04\x09\x82\x5f\x90\x16\x2c\x3d\x96\xd1\x0e\x47\x86\x07\x36\x5f\x7a\x24\x1e\x71\xaf\x98\x00\x42\xfe\xc2\xd6\x88\x91\xe0\xc8\xa3\x7c\x58\xec\x4e\x60\x0f\xd5\x81\xe7\x90\xb0\xaa\xe8\xe0\x9f\x35\xd4\xcc\x18\x76\xdf\x43\x4b\x80\xee\xe0\x53\x69\xf8\x48\xfc\x49\x30\x57\x7d\x16\x84\x27\x58\x88\xf3\x25\x9c\xb4\x73\x76\xc5\x16\x9c\x99\x37\xf8\x55\xa9\x6a\x9e\x74\x8a\xd0\xa6\x9a\xe4\xab\x2f\x2f\x17\x44\xa3\x92\xf9\xac\xc6\x20\x99\x75\xb7\x84\x98\x4c\xb1\x2f\x98\x29\x2c\x36\xa5\x32\x21\x99\x4a\xbc\x56\xf9\xa6\x6d\xae\x45\x60\xb7\x93\x56\xff\x47\xe1\x28\xc0\x79\x6a\x7f\xb0\xe0\xbb\xc9\x60\x0a\xf4\x8e\x49\xea\xa9\x42\x7c\xf6\xeb\x66\x20\xb1\x0c\xd2\xc0\x85\xb0\xb3\x42\x00\x4d\x5b\x0d\x3e\xdc\x11\xd2\x92\x42\xa4\x63\x87\x80\x76\x2c\x9d\xc6\x06\x9b\x66\xbd\x84\x97\x3b\x50\x11\x96\x1c\xe5\x6d\xb5\x8b\xda\xf4\x8e\x6b\xe1\x2a\xb9\xad\x24\x41\x62\x97\x00\x4d\x02\x91\x4b\x95\x9f\x54\xe0\x92\xf8\xcd\x43\x65\xfa\x6a\xb7\x8d\xdb\xff\x4c\xe8\xda\xd4\xe2\xf5\x3a\x05\xc0\xcc\x49\x9b\xfb\x47\x81\x4a\x27\x13\x55\x1d\xcd\x19\xd4\x47\xf6\x27\x57\x6e\xa4\xea\x4b\xbd\xa8\xba\xe1\x8a\x64\x65\xce\xd7\x47\xea\x17\x18\x0b\x00\x9f\x01\x21\x21\x60\x48\x2b\x04\x33\xaa\xc6\x8e\x67\x64\x4d\x00\xf4\x1f\xdf\x99\x90\xb9\xe1\x11\x17\x63\x4d\xeb\x13\x9b\x1a\x40\xad\x3f\xce\x42\x99\xa1\x7f\xe1\xdd\x22\x53\x01\xc7\xf8\xd8\x01\x0a\x79\x6d\xc7\x9c\x13\x30\x7d\x3f\xf9\x92\xa8\x8b\xe6\x64\xd4\xc8\x86\xd6\x8c\xa9\xe4\x47\x0c\xfb\xe6\x3e\xbf\xfc\x42\x40\x10\xe3\x72\xb6\x92\x2a\xa9\x5c\x80\x1d\x1e\x94\x06\xda\x4b\xc1\x88\xca\x82\x06\x64\x05\xbc\xdb\x3e\xaf\xc9\x37\x62\x9b\x32\x63\xdc\x7d\x50\xee\x52\x78\xcc\xec\x6f\x11\xd5\x51\x7f\x56\xbc\x26\x9c\x87\x36\x91\xe7\xeb\x53\xfa\xef\xf0\x75\x64\xab\x46\xb4\x03\xf1\x5d\x9e\x0e\x69\x24\x86\xee\x09\x8e\x7b\x51\xb4\x28\x13\x46\x9b\x82\x35\x04\x22\x33\xca\x3f\x9c\x4f\x8f\xf2\x4a\x57\x1f\x47\xe0\xad\xf9\x14\x4a\xea\x48\x8a\x2d\x2d\xd0\x01\xe3\x1f\xc9\x61\xe0\x5c\x3e\x85\xf0\xd9\x81\x40\x7c\x87\x31\x58\xbb\x0d\x35\xba\xfe\x4b\x60\x42\x2e\x67\x55\x1e\x97\x01\x65\xce\x3f\xc5\x99\xd0\xfc\xc9\x2b\x16\xac\x36\xa9\x2b\x2c\x1d\xc6\xb3\xf0\x33\xfe\x31\x0c\xd1\x96\xda\x04\xa4\xe6\x39\x03\x11\x77\xcd\x27\xd7\xc2\xfb\xec\x65\xa0\x0b"}, +{{0x8c,0x83,0x93,0x81,0xb6,0xa7,0xce,0x26,0x49,0xc1,0xea,0x46,0x4a,0xe3,0xc2,0xd3,0xfd,0xb1,0xec,0x66,0x6d,0x7b,0x4b,0xe4,0xe2,0xa9,0x41,0xab,0x6d,0x65,0x57,0xa7,},{0x5c,0x72,0x4a,0x30,0xc6,0xfb,0x32,0x81,0x53,0x43,0xa8,0x0d,0xde,0xe6,0xee,0xe5,0x44,0x51,0x64,0x18,0xea,0x95,0xe1,0xba,0xc8,0x0a,0xfc,0x80,0x40,0xd6,0x3f,0xc6,},{0x5d,0x21,0x10,0xd1,0xd2,0xf3,0xed,0xd6,0x83,0xbd,0xfd,0xbe,0xa3,0xff,0xa7,0xcf,0x55,0x28,0xa4,0x0b,0x8b,0x3d,0x8d,0x8c,0x9b,0xfd,0x22,0xae,0xac,0x28,0xba,0xd4,0x71,0x66,0x6e,0x06,0x2f,0x7d,0x38,0xce,0xda,0x8b,0xb3,0x73,0x97,0xa1,0xc5,0xc3,0xf7,0x33,0xb5,0x37,0x96,0x70,0x45,0x70,0x64,0x78,0x43,0x7d,0x4d,0x18,0x7a,0x0a,},"\xcb\xcf\x89\xc3\x54\x89\x64\xc3\x8d\x70\xfd\x8f\x68\xe8\xec\xe3\x6c\xc3\x97\x55\xc9\x71\xd1\x4d\x7e\x05\x6f\x39\xb0\x23\xef\x16\x6d\x17\xf2\x43\x85\x22\xf0\x10\xd6\xd8\x35\xd8\x86\xe7\x1f\x47\x4c\x67\x27\xa4\x22\x1f\xd0\x3a\x75\x74\x57\x82\x89\xed\x54\x93\xac\x4c\x09\x47\xe3\xf4\x28\xd8\xfe\x06\x40\x06\xa2\x56\xce\xf2\x18\x11\xd7\x26\x78\xf5\xdf\xc6\xba\x66\xac\x29\xec\xd1\xb3\x2f\xf5\x55\x7c\xb0\x8c\x5f\x13\x05\x59\x21\x7a\x04\x13\xb7\x59\xc2\x4d\x83\x38\x8a\x2b\xb9\xb2\x9b\x6b\x91\xd1\xf3\x10\x1e\xd6\x25\x21\x1e\x4d\x73\x80\x51\x93\x47\x8c\xf9\x95\x39\x6c\x10\xb1\xc5\xaf\xfa\xcb\x00\x89\x9d\xa0\x4e\x3c\xce\x19\x3b\x49\x4e\x2a\x93\x3c\x4e\xeb\xe0\xa3\x7b\xfb\x8f\x1b\x83\x71\xbd\xe5\xfd\xa0\x9e\x80\x4e\x94\x0f\x34\x48\x96\xa5\x29\x46\x7a\xde\xe4\x5a\x8f\xeb\xf8\x5a\xb0\x36\xca\xb8\x80\x14\x3b\xe4\xf5\x9b\x77\x41\xd8\xe4\x50\x27\x8b\x06\x36\x55\x78\xd4\x0b\x19\xdc\xec\xc6\xe1\xee\x3d\xa3\x4a\xb2\x90\x13\xfa\x3a\xf7\x72\x92\x72\x96\x21\x10\xe3\x85\xab\x9a\x02\x2f\xae\x41\x46\xf8\x97\x16\xf7\xba\xb9\xd3\xdc\x68\x2f\x4f\xac\x77\x36\xd3\xe0\x89\x73\xc6\x85\xbb\xb2\x75\xbb\xf8\xf2\x17\x41\x9e\x5c\xae\x02\x19\xeb\xa5\x16\x6a\x5d\xe1\xb1\x1e\x3f\x9a\x90\x8b\x8a\xc7\xe6\x5b\xcd\x62\x3f\x8c\x18\xbb\x02\x4f\x60\x5d\xcb\xac\xda\x79\x0d\x83\x62\x95\x74\x44\xa9\x5c\x13\x0a\x37\xee\x9d\x56\x3d\x0c\xbb\x4c\xb2\xb0\xff\x71\x59\x1d\x93\x90\xb6\xc8\xfc\x28\x75\x3a\x0e\x40\x2d\x64\x87\xcf\xac\x60\x71\x35\x92\x7d\x89\x26\x75\x12\xb3\x4f\x87\x70\x57\xd9\x27\x1b\xcc\xc0\x24\xdf\xed\xcc\xc6\xc3\x2e\xdf\x75\xc8\xb7\x55\x1c\xdf\x80\x15\x4e\xe8\xe0\x8a\x0c\xc4\x30\x44\xe1\x03\x6b\xae\x01\x7e\xb4\x8b\x65\x02\xc7\xa9\xd6\x0c\x8b\x37\x0c\xf3\x79\x9c\x46\x4f\x96\x4a\x69\xee\x65\x95\x01\x22\x3e\x78\x9a\x64\x97\xb6\x34\x96\xdf\x1a\xda\x2e\x80\x8d\x24\x34\xfc\x8b\xb9\x79\x4e\x5e\x2a\x20\xbb\xf4\xd6\x92\x5c\xb3\xc5\xbb\x14\x84\x2f\x19\x20\x09\x05\xba\x93\x54\xe0\x0d\xc3\x3c\xff\x5b\x42\xd4\xe9\xd9\x66\x8b\x34\xe6\x61\xd4\x4b\xef\x76\xfe\xfe\x2e\xd5\x1f\x94\x42\x3a\x93\x3a\xc9\x4f\x15\x23\xbf\x37\x82\x3a\x23\x8d\x61\x6c\x6b\x17\x97\x34\x41\xe3\x5f\x94\x05\xa0\x4d\x99\xea\xa8\xf5\x04\x53\x4c\x8b\x5f\xa5\xe8\xe3\x35\xc7\x43\xbc\xf2\x1f\x5d\x49\x2b\x71\x12\xe0\x0f\xd8\x64\x2c\xb1\x2b\xfe\xc8\x49\xdf\x62\x12\x0d\xbb\x06\xbf\xc2\x94\x6a\x56\x01\xe2\x5b\xe7\x50\x11\xc6\xf0\x0c\x65\xd3\x5f\x44\xa4\x6a\xf9\xe4\xf7\x80\x9e\x57\x89\xa3\xa6\x1b\xa0\xa3\xb2\x13\x89\x04\x97\x29\x6c\x81\xe4\x2e\x88\xf0\xec\x0f\x5d\xef\xc1\xf5\xd3\x9f\xf2\xa4\x8b\x7e\x30\x26\xc9\xe5\x47\x20\x2e\xdc\x7e\xb7\x38\xc3\x4a\xd3\xa1\x5d\x37\x3e\xf8\x2a\x4c\x1d\x18\x1f\x28\x5a\x98\xbd\x33\x14\xc2\xc1\x94\x7c\x9e\x2c\x60\xac\xa5\x17\x50\xee\x7f\x94\x3c\xaf\x0c\x4e\x1e\x5c\x7d\xf7\x29\x1e\x97\x3b\x1f\x93\x6b\x73\x70\x76\x19"}, +{{0xaa,0xbb,0xb2,0xef,0xed,0xb5,0x99,0x42,0x4a,0x5f,0x3e,0x08,0xf9,0x0f,0xa8,0x82,0x6c,0x5c,0x92,0x17,0x0b,0xe5,0x01,0xa1,0x18,0x1f,0xe8,0xe8,0xdf,0x97,0x4e,0x0e,},{0xce,0x73,0x19,0xef,0x88,0xb2,0x42,0x42,0x06,0x66,0xca,0x69,0x7b,0xa8,0x50,0x1d,0x27,0x4e,0xc4,0xa5,0xdc,0xf8,0x44,0x59,0x66,0x08,0xb9,0xdd,0x5a,0x8a,0x3a,0xcd,},{0xa0,0xb1,0x9c,0xfa,0x6c,0x80,0xde,0x77,0xbf,0xcd,0x32,0x10,0x30,0xbf,0x8c,0x03,0x89,0x3e,0x2b,0x21,0xac,0xe6,0xc6,0xba,0x1f,0xf7,0x40,0x8e,0x6f,0xf0,0x7d,0x84,0x7e,0x6b,0x2b,0x68,0x8d,0x4f,0xd5,0x1a,0xa9,0x32,0x70,0x1d,0xb6,0x40,0x2e,0xf2,0x23,0x22,0xe6,0xe9,0xfc,0x7e,0x32,0x0a,0xbb,0x4d,0x24,0xe1,0xac,0xc6,0xcf,0x06,},"\xfc\xc1\x5c\xc5\x79\x70\x56\x9e\x9c\xcf\xa5\xa7\x78\xfc\x7a\xed\x71\x97\x8a\x3f\x56\x24\x57\x7b\x6f\x57\xfa\x3f\x16\x7e\xa2\x23\xef\x31\x76\x4c\x48\x8d\x05\x9d\x06\x53\x1d\x01\x6b\xcb\x17\xd5\x44\xd4\x69\x77\xaa\x24\x1f\x8e\x07\xaf\x47\x87\xa0\x81\x0f\x98\xd7\x66\x46\x0c\x08\x41\xad\x81\xb8\x8f\x4d\x5d\x81\x64\x48\x5a\x12\x58\xa9\x46\x22\xc5\x49\x24\x28\xd6\xd5\x75\x94\x37\x15\x76\x6c\x2b\x0a\x86\x5b\xed\xba\x16\x7d\x5d\x34\x0e\xdb\x57\x9c\x47\xaa\x32\x45\x9b\x8f\xc9\x8a\x79\xbb\x0b\xed\x1c\x96\x0b\x4c\xcb\x7f\x2d\x4b\x56\x81\xa2\xa7\x0d\x50\x5b\x85\xb8\x1e\x3d\x99\x67\x27\x14\xe4\xea\xb4\x1f\x3a\xb0\xca\x87\x4f\x41\x71\x86\xfe\xb6\x9e\xd1\x3f\xb9\x11\xf4\x9d\x15\x84\x75\x8b\x2d\x18\xb4\x67\x3e\xdf\xae\x49\x5e\x68\xda\xd5\x13\xa7\xac\x0d\x47\xb2\x75\x3c\xb4\xed\xa7\x8f\xb4\x31\xf0\x4d\xda\x8f\xe8\x03\x0d\x7b\xb4\xe8\xdb\xcc\xb9\x69\xd7\xf5\x80\xd9\xc1\xef\x93\x5d\x07\x4d\x7a\x41\xd1\xf8\xb9\xdc\x45\xc9\xa2\xe4\x10\x6a\x55\x29\xa9\x8b\x95\x52\x9a\xb0\xed\xea\x0b\x57\x22\xdd\x68\x6f\x5a\x7f\x3c\xd8\xfb\x26\x24\xab\x26\xc4\x2d\xf1\x1f\x51\x0a\x10\x3d\x8a\x92\x98\x30\xad\x85\xf5\x21\x24\xe3\xd5\x82\x7b\xa6\x0b\xfb\xcd\x73\x6c\xb6\xc5\x90\xee\x77\x7e\xad\x7a\xa2\x22\x4d\x7a\xe4\x6d\x25\x7a\x90\x40\x72\x47\x96\x0c\x9c\xb0\x38\x60\xae\xaa\x7f\x54\xc1\xa8\xe1\x11\x60\xd1\x1b\xb4\x73\x06\x5e\x19\xb7\x07\x21\xc8\xf0\x72\xe1\x90\x9d\x53\x9e\x9a\xc9\x41\x85\x90\x4b\xbb\xfe\x54\x87\x37\x54\xae\x1c\xa7\xbc\xed\x6f\x40\x56\x1a\xf4\xb5\x05\xf0\x3a\xc9\x72\xa6\xf0\xbf\xa7\x3b\x5f\x83\x2f\xe2\x3b\x89\x8b\x2b\xbb\x05\x74\xa6\x66\x2e\xe9\x3b\x3b\x36\x0d\xa1\xec\x7e\x83\x8e\xb2\xc7\x7c\x7c\xb7\xfc\x16\x4f\x7c\x46\x27\x01\x04\x89\xc8\x58\x90\x07\x52\xc9\x2d\x9d\x75\xad\x54\x71\x67\xe4\xbd\xd1\x1a\x07\xd2\x8b\x65\x1a\xa3\x0f\x16\xa8\x50\xe0\x60\xdd\x28\x82\xfb\x82\x09\x19\xa3\x98\xe8\x05\xeb\x63\x69\x9f\x4f\xf5\x95\xf9\x91\x52\x47\x31\x64\x1e\xce\x25\xfb\x3f\x8e\x89\xad\xa5\x01\x19\x2b\x1e\xdd\xae\xcb\xac\xc8\xb8\x98\x52\x8f\x2d\x5b\x33\x12\x69\x4f\x5e\xc2\xdc\x91\x42\xe1\x51\x3f\x77\x7a\x5c\x83\x34\x09\xc1\x71\x63\x3f\xf9\xfa\x26\x09\xd0\x49\x7f\x5d\xf4\xfb\xf4\x8e\xf2\xb7\x7d\x55\xe2\x55\x19\xd2\xee\x79\xb5\xfe\x9d\x8f\xa4\x60\x00\xde\xcd\xb4\xf2\x5d\xfb\x3f\x2b\xaf\xb1\x9f\xbe\x2c\xbd\xac\x00\x2a\x35\x9a\x95\x4b\xc6\x9b\xdf\xe2\xfb\x36\xad\xfd\x9a\x15\x09\xf3\xe3\xa4\xc6\xb1\xf3\xf3\x6e\x7c\xf8\x0d\x58\x3d\x44\x0f\xf2\xa1\x44\x64\x30\x98\x97\x4d\x71\x49\x3e\xcb\x64\x17\xc0\xb8\x06\x5b\xd2\xc2\x1c\x1e\x34\xaf\x09\x24\x3f\xb4\x9e\x9d\x35\x29\x7e\xb0\xa5\x2d\x56\xdd\x27\x0f\xea\x6d\xc5\xc0\x80\xa0\x55\x99\xf7\x85\x81\xe9\x0f\xd8\xcc\x4c\xd1\x1a\x50\x5e\xdd\xe8\x4b\x89\x2d\x89\x53\xbd\xbb\x23\x79\xd3\x3a\xad\x64\x65\x8a\xe2\x06\x07\xdd\x35\xb0\xbf\x3a\x26\x37\xd2\x0c\x3f\x86"}, +{{0xc2,0xe0,0x74,0xfa,0xa2,0x34,0xe9,0x9a,0xb2,0x0a,0xdb,0xbe,0xae,0x11,0xb8,0x10,0x97,0x23,0xb7,0x08,0xc5,0x45,0x86,0xdf,0x65,0x2b,0x40,0x2c,0x35,0xcd,0xd1,0x27,},{0x5e,0x52,0x4e,0xce,0x1c,0x69,0x6e,0x70,0x5a,0x35,0x14,0xdd,0x00,0x82,0xb8,0x40,0x79,0x5a,0x59,0xc3,0x6a,0x96,0xcb,0xc4,0x82,0xbf,0xf5,0xab,0x4e,0xf5,0x15,0xd1,},{0x65,0x7c,0x38,0x26,0xb3,0x48,0x3f,0xd4,0x2a,0xb6,0xdf,0x86,0x9d,0x1b,0x77,0xa8,0xc4,0xdf,0x67,0xa6,0xa5,0x90,0xc7,0xc6,0x77,0x29,0x69,0xe3,0xdf,0x33,0x12,0xae,0x06,0x54,0xfb,0x83,0x84,0x7a,0xf2,0x21,0x93,0x5a,0x05,0x12,0x29,0x16,0x36,0xec,0x05,0x95,0x70,0x08,0x79,0xeb,0xdb,0xa8,0xa1,0x46,0x7c,0x53,0xd4,0x0c,0x23,0x06,},"\x31\x29\x03\x38\xe4\x6d\x1c\xc2\x5c\xe9\x9c\xba\xcc\x40\x16\x03\x41\xb7\x85\x82\x3c\x82\x3c\x4a\xb9\xba\xee\x3b\x61\x25\x79\xf1\xc0\x11\x71\x67\x96\xe5\x6e\x26\x93\xf6\xdd\xad\x43\x92\x2a\xa7\x84\x7c\xbb\x41\x48\x10\x16\x51\xbb\xe6\x2d\x50\xbe\x90\x82\x5e\x8e\xab\x77\x7a\xa4\xb8\x02\x6d\xc5\x38\x5a\x97\xd3\xdf\x76\x16\x01\x91\xf9\x22\xcd\xd2\xf0\x7b\xa5\xf8\x5e\x95\xf4\x5d\xb2\x29\x28\xf9\x07\x34\xff\x52\x0c\x44\xdc\x8f\xe3\x90\x3b\x4c\x51\xcd\x23\xe0\x64\xf0\x1c\x82\x9e\xc7\x4f\xbf\xfe\x25\xfd\x0d\x36\x9d\x27\x65\x74\x0f\x43\x85\x6b\xd7\x39\x8a\x19\x11\xad\x74\x98\x36\x16\x0f\xd9\x8d\x04\xb2\x8e\xe8\x7e\x11\x1d\x40\x71\x8b\x5a\x16\x6f\x05\xc9\xa4\x71\xa4\x15\x66\x55\x70\x69\xf7\xa1\x4d\xe9\x88\xbb\xbf\x67\x77\x52\x1f\xcb\xa6\xdd\x65\xde\x4c\x06\x67\x4a\x11\x85\x3a\xf8\x3a\xcc\xb7\x0f\xb3\x28\xdd\x8f\xd6\x10\x5a\x7d\xf5\x26\x9c\x9f\xae\xc8\xd9\x00\x14\x7e\x92\x8d\x97\x0c\x36\xcd\x83\x4b\xd6\x05\x4f\x70\x65\x0d\xfa\xce\x94\xb7\x62\x9d\x16\xe3\x70\x3d\x76\x6c\xe7\x63\x8d\x0a\xd1\xe1\x7b\x77\x46\x9b\x95\x8d\x2b\xa2\xa1\xe6\x31\xa1\x63\x5e\xfd\xcb\x00\x6e\xbc\x6e\x5d\x8b\x9f\xaf\x7e\x5f\xb9\x89\xdc\x08\x96\xc5\x61\xa2\x6f\x3c\x25\xf0\x55\x71\x6b\x36\x71\x38\xea\x5d\xa1\xf8\x1d\xc7\x2c\xff\x7a\x55\xaf\xae\xe5\x83\x9e\xf5\xaa\x82\x2b\x29\x70\xaa\x18\xa8\x98\x21\x63\xbf\x5e\xed\x1b\x67\x7c\xca\xac\x12\x24\xff\x6c\x6c\xf2\x56\x37\x47\x80\xae\x65\x80\x3b\xf5\xc6\xe2\x3c\x80\xba\xcd\x76\xec\x3e\x2d\xdd\x3a\xb7\x19\x97\x50\x64\x48\xe1\x9d\xb1\x98\xef\xad\xc9\xf7\x57\x49\x1f\x1b\x09\x72\xc8\x2d\xb2\x94\x10\xe1\xe8\xbb\x67\xbb\xb2\x3d\x53\x56\x3b\x88\x07\xe5\xe0\xc2\xe3\x2e\xe5\x96\xb5\xb4\x40\x23\x28\xf9\xe1\x79\xe9\xce\x85\x6d\x3b\xd1\x99\xd5\x8d\xe6\xc5\xc2\x52\xe7\xa6\x12\x4d\x81\xfc\x9e\xea\xf2\x3d\x34\x7d\x2a\xb8\x89\x17\xaa\x68\x44\x50\xdd\x58\x30\x35\x16\xc1\xa4\xd2\xbd\xcd\xde\x22\x0c\x9a\xe3\x79\x0f\x29\x8d\x7d\x38\x4b\x70\xc2\xfe\x25\x88\x07\x84\x8f\xc3\x53\x20\xb5\x78\xb3\x35\x03\xb7\x5f\x38\xa1\xdf\x63\x0b\xd3\x3e\x6a\x85\xa4\xdd\x4d\xf9\xf6\xe5\x5a\x6e\x68\x67\xc7\x38\x01\xe5\x93\xe1\xd5\x91\xdb\x89\xba\x9a\x9a\xf0\xfc\x29\x2e\x06\xfb\x51\x5a\xc8\xa5\xe8\xe3\x43\xa8\x21\x33\x55\x75\xba\x48\xfb\xaa\xe3\xfb\x12\xde\xea\xae\xe6\x0f\x4b\x3d\x31\x7e\xc0\xa5\x54\xdd\xd4\x25\xc8\x49\x32\xc2\x7a\x7a\x12\xf2\x9d\x63\x71\x51\x07\x83\xbd\x75\xe6\x0e\x2f\x6d\xa2\x00\x52\x06\x9e\xd7\x1e\x69\x5a\x94\x31\x82\x19\x3c\xb6\x85\x1a\x7d\x2f\xa3\xc6\x66\xc1\x93\x02\x80\x15\xac\x8b\x7e\x7d\xaa\x6c\x52\x04\xf7\x7a\x62\x32\xb8\x8b\x4a\xbf\xfc\x53\x62\xfd\xe7\xde\xc3\x6b\x9d\x45\x48\x80\x84\x92\x83\xb1\x15\x63\x39\xea\x2e\x8c\x3b\x10\xe5\x1b\xfa\xbd\xf7\x25\x78\xc7\x26\x41\x9a\x38\x54\x2c\xf8\x64\x9d\xf9\xa0\x90\x9f\x58\x2d\xeb\xad\x5f\xd8\x9d\x8c\x81\xf8\x3d\x9e\x42\x3e\x75\x03"}, +{{0xb9,0xda,0x4e,0x6a,0xf0,0x7e,0x39,0x8a,0xb4,0xd2,0x17,0x52,0xa3,0x2c,0x8f,0xfa,0x9b,0xe0,0xc3,0x10,0xd3,0x50,0x59,0xfb,0x66,0x1b,0xd7,0x3a,0xfa,0x97,0xe2,0xa8,},{0xf8,0x62,0x80,0x3c,0x96,0xcc,0x42,0xad,0xc8,0x25,0x28,0x84,0x54,0x72,0x30,0xb9,0x70,0x04,0x7b,0x7e,0x5d,0xa9,0x96,0x26,0x0c,0xcc,0x02,0x40,0xab,0x71,0xa6,0xec,},{0x62,0x5e,0x1f,0x42,0xc8,0x74,0x34,0xa2,0x5d,0x62,0x2d,0x80,0xd1,0x25,0x32,0x80,0x6a,0xfb,0x25,0x09,0x33,0x24,0x49,0xe6,0x96,0xb6,0x5e,0x1e,0x58,0x88,0x50,0x8f,0x11,0xc4,0xac,0x25,0xf5,0x9b,0x8d,0x94,0xd0,0xbf,0x27,0xe4,0xc8,0xd1,0x86,0x70,0x07,0xc4,0x08,0xda,0x57,0x30,0x82,0xdc,0xf1,0x9d,0x15,0xa9,0xd5,0xcc,0xcb,0x0c,},"\x6b\x95\xaf\x0e\xeb\xb6\xa0\x8a\xfa\xda\xa1\x96\x21\xf7\x6a\x83\x9b\xe8\x08\x51\xc6\xdd\x31\x5e\x82\x76\xf5\x01\x99\x5d\x4c\xe6\xd1\x34\xdf\x5e\x79\x8e\xd5\x17\xa2\xf0\xe6\x2a\xa1\xd6\xc9\x8c\x36\xef\x14\xbb\x1e\x5d\xdf\xc9\x8d\x5a\x7f\xcc\x81\x14\x0a\x13\xc2\x0d\x2c\xa0\xc4\xb4\x0e\x6e\x6a\x03\xee\xd8\xc8\x99\xf9\xd1\xf7\x92\x46\x81\x52\x19\x9f\x4b\x95\xa4\x32\x66\x89\x47\xa5\x1d\x7b\x8e\x10\x4d\x8d\x1f\x12\xaa\xcd\x96\x7e\x08\xb0\x8c\x41\xc3\xc8\xca\x3f\xee\xda\xa5\xb8\xb6\x3b\xce\xc0\x61\x38\x64\xd9\x53\xd8\x11\x43\xec\x81\x42\x5b\xde\x29\x16\x4a\x08\x76\xf2\x3f\x37\xac\x9a\xc9\x47\x36\x72\xce\x11\xa0\x8b\xd5\x47\x6f\x6f\x66\xd6\x65\xe9\xad\x61\x7e\x34\xeb\x32\xee\x56\xff\xa4\x59\xf2\x0d\x1b\x93\x53\xd7\x82\x12\x98\x54\x57\x50\xc6\xef\xf3\xe7\xd4\x07\x3d\xc3\x18\x5e\xde\x03\x91\xcc\xe0\x57\x5f\x8b\xa6\x37\xd8\x00\x06\x8d\x9d\x7e\x54\x03\xba\x70\x38\xd2\xdb\x77\xda\x14\x47\x84\xf2\xe8\xea\x76\xae\xdf\xe5\x21\xe7\xdc\x6a\x67\x4e\xde\x35\x57\x95\x95\x99\x3f\xb2\x0d\x44\xb4\x05\x27\x83\xf5\x6c\x8c\x0b\xbd\x04\x40\xb6\x9e\xab\xde\x84\x46\x8d\xd1\x3c\x67\x1f\xb1\xbb\xd5\xcb\x02\x2c\x2a\x4f\xcf\x35\x42\xd8\xb3\xbb\x51\x8e\x5a\xde\xbd\xdc\x84\xe7\x14\xb1\x3b\xe5\x2c\x56\xb2\x82\xb4\x2a\xc0\x89\x2a\x54\x59\x28\x1b\xe7\x16\x07\x29\xf4\x11\x2c\x7d\x99\xdf\x9b\xe5\x43\x4f\x82\x3a\x9c\xe0\x50\x17\x89\xde\x1d\x55\x0a\xd5\x0b\xb1\x8c\x8d\x89\xa3\x36\x68\x27\x0b\xff\x7b\x91\xff\x11\x8f\x5c\xd9\x90\x9a\xdd\xde\x90\xc0\x24\xa3\xad\x71\x39\x15\x17\x46\x74\xf2\x8a\xaa\x9f\x94\xa3\x22\xba\xa5\x43\x73\x8e\xda\xb4\x97\x33\x12\xb5\xbf\xa1\x21\x55\xde\xbc\xee\x16\x3c\xfe\x2b\x04\xac\x9c\x12\x2a\xc8\xa4\xe1\xbc\x41\x8c\x14\x95\x5d\x96\x10\x45\x5b\xd9\x45\xe9\x79\x3b\x91\x62\x67\xc9\xc5\xf9\xe5\x3a\xc0\x45\x18\x92\x6e\xc9\x8e\xcb\x84\xa4\xf0\x44\x5d\xcb\x12\x36\xc7\x6c\x3a\x67\x8c\x69\xab\xe4\xe9\x2c\x22\x97\x1d\x62\x21\x72\x01\xa1\xbd\xf0\x5c\x04\xdf\x84\x20\xa3\xde\x6a\x91\x7a\x85\xe7\x1e\x2b\x97\x25\xe7\x7b\x52\x29\x15\xd4\xc9\x94\x60\x77\x63\x7c\x2d\x88\x13\xf0\x10\xb9\x49\x1c\xf0\xed\xdc\x3d\x46\x68\xcc\x0f\x8b\xc8\xa6\x83\x57\x9b\xe5\x43\x93\x4d\xa2\x85\x3a\x16\xf5\x71\x57\x24\xf7\x79\x81\x9f\x44\x43\x9e\x1d\xeb\xca\xa4\x27\x0d\x9b\x85\x94\xba\x4c\x86\xe1\x06\x3b\x3c\xe4\x79\xd7\x1a\x54\x09\xbe\xf2\x7e\xf4\xe5\xc1\xd1\xc9\x6e\x8b\xe1\x38\x65\xaf\x7b\xb4\x3f\x09\x16\x2c\xcb\xc8\x3a\x2c\xa9\xe9\xb8\xa2\x32\x4e\x6d\x99\x65\x75\xee\xfe\xd3\x7e\xf4\x99\x08\x18\x57\x38\xb8\xea\xe4\x3f\x8a\xdc\xa3\x30\xc9\x9b\xc6\x6c\xc1\xfd\x52\xc5\x30\xd7\x37\x1c\x60\x86\x9c\xe4\x2c\x19\x7d\xca\x0a\xd1\x28\xb8\x5f\x61\xc8\x75\x8f\x0d\x54\x2f\x3d\x32\x98\xb6\x5e\x93\xc6\xe8\xa6\x8f\xa0\xe9\xa1\xd5\xe8\xc5\xfe\xc8\x05\xb8\x3a\xff\x43\x90\xe1\x15\xeb\x64\xf3\xf0\x78\xa0\xb9\xb6\x6c\x27\x38\x43\xfc\x6c"}, +{{0x14,0x3f,0x7b,0x42,0x47,0xd5,0x49,0xf6,0xb7,0xc0,0x91,0x72,0x66,0xc5,0x0f,0x96,0x2c,0x28,0xa2,0xea,0x24,0x76,0x2f,0x53,0x7a,0xa0,0x6a,0xd1,0x5e,0x40,0xb3,0x5a,},{0xc9,0x95,0x9f,0x90,0xa2,0xd5,0xfe,0xac,0xba,0xe2,0xc4,0xc8,0x03,0xde,0xd5,0xde,0xab,0x86,0x98,0x76,0x37,0x06,0x43,0x37,0xaa,0x2a,0x0b,0x0d,0xde,0xf2,0xfd,0x86,},{0xc1,0xcf,0xae,0x58,0x51,0x57,0x13,0xea,0x72,0x8c,0xfa,0x09,0x09,0x0e,0x89,0x42,0xf8,0xdf,0x18,0x62,0x1b,0xa7,0x09,0x0e,0x3a,0x33,0x76,0xc3,0x80,0x27,0x75,0xa1,0xec,0xaf,0x43,0x6b,0x18,0x49,0x78,0x04,0x1e,0xbb,0x75,0x22,0x6f,0x97,0x0d,0xf7,0x1d,0x6a,0xd3,0x53,0xc0,0xfb,0x46,0x50,0x23,0xf9,0xe2,0x98,0xf6,0x4a,0x70,0x02,},"\xe2\x74\x20\x23\x47\xa0\xd0\x57\xa4\x8b\xf2\xa1\xf6\xe9\xf6\xcb\x42\x56\x07\x9d\x80\x03\x74\x09\x3c\x02\x0c\xbf\x52\x0e\x5f\xa2\x7f\xe9\x96\xff\x07\xf3\x3a\xd3\xb2\x1f\x74\xab\x0c\xd9\x3c\x86\x47\x5f\xf3\x7c\xf6\x22\xd3\xf9\xfa\x4d\x13\xbc\x99\xf0\x13\xe8\x50\x2b\x24\xe4\x6c\xc8\x7c\x47\xe6\xb2\xc3\x66\x2b\x50\xe9\x79\xa0\xf3\x45\xb7\x84\xff\x21\xa8\xa4\xd9\x2a\xdc\x65\xe8\x6e\x33\xb4\xdb\xe1\x7f\x52\x8c\xcd\xf5\xb4\x86\x46\x64\xba\x94\xff\xdb\x7c\x7d\x24\x12\xb4\x38\xe6\xe4\x3f\xa9\x66\x81\x47\xee\x33\x28\x22\x4d\x1f\x52\xa3\xf5\xb5\x43\x59\xb4\xf7\xfe\xf6\x9a\xf8\xf8\x67\xb4\x78\xf1\x30\xa1\x47\xbe\xa4\x2e\xd3\x98\x03\xbc\xbc\x25\x57\xbc\xa8\xc3\x99\x9f\x1d\x24\xf0\xa6\xb0\x3c\x98\x84\x60\x11\xf9\xec\x74\xf6\x66\x41\x7b\x95\x02\x0e\xb1\xfb\x2f\xb8\x8b\x63\x12\xe5\x00\x8c\xff\x03\xe2\xd7\x7a\x26\xaa\x53\x2d\x17\x80\xb5\x07\x7f\x9e\x8b\x82\x86\x74\x45\x5d\x6b\xc9\x57\x97\x5f\x7b\x2a\x50\xe7\xfd\x7c\x16\x12\xce\x02\x36\x2e\xfa\x4c\x55\x5a\x1e\xef\x68\xec\x34\xa5\xc0\x06\xa6\xda\x00\x8a\x31\xd4\x19\x3d\xc2\xcc\x64\x76\x85\xad\x3c\xfa\x3b\xd7\xc5\x60\xb7\xae\xd4\x5f\x0f\x1a\x3d\x1b\x5b\x36\x22\x68\xde\x53\x28\x57\x05\x5a\xb9\xd1\xd5\xd8\x58\xd9\xae\x9a\x75\x9a\x51\xbb\x94\x78\xe8\xf0\xee\x93\xc9\x84\xb5\x76\xb8\xb4\xab\x46\x02\x80\xbe\x3d\xe2\x05\xa3\x2f\x1d\xc3\xd5\x72\x92\x3f\xb2\x13\xac\x15\x12\xd8\x0e\xb5\xad\x5c\x18\x94\x4b\xe7\x7f\xc1\x7d\xef\x13\xa6\x1b\xbd\x31\xbc\x71\xac\xc2\x3d\x25\x0e\xc5\x89\x4e\xbc\x21\x4c\xfe\xc0\xc1\xb9\x06\x51\x6d\x32\xd8\x36\xad\xc8\x38\x80\x2e\x8d\xe3\x0d\xd7\x6d\xf6\xe6\x1c\x1b\xc4\x38\xb6\x8d\x2b\x02\x5a\x84\xf2\x11\xfa\xcf\x3f\x13\x84\xd2\x61\x2d\x0f\xae\xf5\xd1\x71\x31\xcf\xe0\xcf\xe8\x33\xfe\x95\x0e\x47\x9b\xc2\x9c\xbe\x7f\xd6\xda\x0c\xce\x30\x7c\xf0\xb1\xbd\x92\xc8\x0e\x87\x8e\x43\x2f\x63\x6e\xa0\xcd\x42\x48\x0c\x07\xe8\xb8\xe5\x7e\x69\xb2\xf9\x38\xb7\x81\x20\xf6\xaf\x4a\xbe\xbf\x7d\x4b\x05\xca\xcd\x6e\xed\x85\x44\x91\xc0\x29\x75\x5c\x4e\x66\x33\x89\x93\xed\x2a\xc2\x5d\x19\xa0\xc5\xb4\x0f\x5e\x32\xc8\xa8\xb1\xbc\xe3\x69\x71\x81\x86\xc9\x1d\x60\xed\xff\x24\xa8\x37\x7a\x99\x69\x75\x75\x99\x06\x7d\xd3\x12\x63\xa0\x6d\x6a\x61\x15\x47\x81\xf2\x96\x11\xab\x81\x2f\xf8\x2e\x81\x37\x39\x64\x62\x63\x70\x4c\xd6\x04\x63\x57\xa2\x3c\x04\x5e\x24\x07\xb7\xa8\x95\x08\x25\x93\x91\x31\x4f\x2f\xbe\xe4\x9a\xef\x08\x55\xc6\xe5\xe6\x3d\x91\x2a\x19\xdf\x15\xb1\x1e\xce\x34\xe2\x76\xdc\xb8\x8b\xf2\xf2\xe4\x75\x63\x58\xf3\x4a\x0e\xe3\x95\x2b\x68\x6f\xcd\x17\x57\x8a\x88\x41\x76\xd3\x4e\xa2\x91\x6c\x5d\x9f\xcd\x00\xeb\x9e\x0a\xa9\xf2\xcf\x0f\x16\xe2\x56\x4b\xfd\x28\xb6\xab\x59\x68\xb8\x44\x8f\x06\x83\x20\xe4\x18\x71\x60\xf8\x66\x57\x81\xb1\xe2\xed\x9d\x04\x9e\x1b\x54\xa7\xd7\x27\x20\xff\x9d\x4f\x07\x30\x51\x99\x6a\x9d\xb6\xf0\xc6\x82\x1c\x42\x4f\xa5\x1d"}, +{{0x0d,0x1f,0xe9,0xd8,0xb9,0xa2,0xf0,0x4c,0x22,0xbb,0xb0,0xed,0xea,0x38,0x33,0xa0,0xce,0x43,0x33,0x93,0x47,0x53,0x1f,0xdb,0x67,0xed,0x51,0x3a,0x13,0xd3,0x6b,0x39,},{0x67,0xc4,0x9f,0x41,0x0f,0x48,0x53,0x29,0x3d,0x0c,0x4d,0x39,0xf4,0xc1,0xb3,0xd6,0xc6,0x10,0x3c,0x5c,0xfe,0x20,0xa9,0xa5,0x9b,0x53,0x93,0x20,0x43,0x51,0x73,0x69,},{0xb0,0x57,0x25,0xe7,0x37,0x1e,0xd0,0xa9,0x1e,0xbc,0x89,0xf3,0xc3,0x0b,0xaa,0x99,0x18,0x37,0x63,0xed,0xb4,0xce,0x34,0xfe,0x90,0x1a,0xf3,0x73,0x1e,0x00,0x1c,0xc5,0x4f,0x28,0x71,0x18,0x91,0x5e,0x90,0x36,0x5d,0x91,0xac,0xa8,0xfe,0xb1,0x70,0x87,0x69,0xf9,0xf1,0xd6,0xee,0xf5,0xaa,0x11,0x3b,0xee,0x00,0xb5,0xef,0xab,0x27,0x04,},"\x64\x21\x7a\xc8\x41\xfd\x4d\x64\x59\xbf\xc4\xa4\x9b\x88\x01\xd6\x92\x9b\xf1\x9b\x40\x8e\x8a\x53\x79\x0c\xeb\x51\xec\x34\x1f\x9b\x46\xa3\x51\xe8\xc2\xe5\x9d\x88\x7e\x1e\xac\xcb\x91\x42\x31\xcd\xca\x1d\x3e\x5c\x47\xd1\x66\xb4\xcd\xb9\xb5\x8c\x01\x3c\x59\xa3\xbd\x28\x3a\xd1\x0f\x6b\xd6\x2c\x0f\x15\xf7\x64\xce\x14\xf3\xb2\x65\xf5\x37\xc6\x3e\x73\xb6\xc4\xfa\x65\xe0\x6c\xe1\xe1\xf4\xae\x0d\x11\x48\x9d\xd2\x60\x2f\x95\xfc\x40\x2b\x77\x12\x05\x2a\xbc\x84\xbd\xc7\x78\xc1\x9f\x10\x00\x1b\x4e\x0d\x5f\xbe\x46\x30\x90\xe8\x3e\xf4\x38\xfe\x06\x8f\x3b\xb6\xfb\xc2\xc1\x39\xaf\x06\x78\xed\x2a\x11\xfa\xa1\xb9\xe4\x9a\xaa\x46\x20\xab\xfc\x08\x43\x9f\xbf\xe2\xc6\x18\x40\x76\x9e\x5f\xda\x26\x77\xf8\xe2\xf0\xa1\x45\x64\xf9\xf5\x04\x23\x2a\x9f\xc0\xd9\xda\x47\x1e\x67\xfb\xc5\x74\xc3\xd5\x6d\x2a\xeb\x93\x7a\x58\x6e\xd5\x58\x35\x56\x30\x8a\x99\x8e\xb1\xdc\x47\x6a\x01\x4f\x5a\x08\x22\x8d\xbe\xd9\x5a\x12\x08\xbc\x1d\x1f\x5d\x76\xb4\xe8\xd0\xb2\x43\x4b\x99\x5a\xd4\x58\xe4\x29\xee\x61\x42\xa0\xc9\x71\x76\x8c\xc4\x0c\x40\xbc\xb0\x8e\x96\x03\xf0\x96\x11\x47\x44\x71\xb3\x85\x9d\x7f\xd5\x84\x21\x9f\x02\x65\x7b\x43\x0e\x9e\x56\x95\x5b\x34\x67\xac\x56\xff\x2e\xab\x22\xcc\x49\x84\x89\x03\x6a\x57\x41\x20\xe2\xdb\x76\x9a\x3b\x21\x50\x03\x89\x14\x2c\x78\xa8\x7d\x06\x9f\x0e\x25\x76\xca\xfd\xa8\xcd\xdd\x79\x15\xa9\x22\x87\x73\xd2\xac\x9a\x07\x5c\xb3\x87\xf2\xa8\x98\x61\x72\x13\xb2\xcc\x50\x59\xd1\x19\x41\xbc\x4f\xe5\x86\x41\xe7\xc1\x75\x02\x67\xe5\x3e\x99\xc4\x21\xcb\x4c\xf2\x1d\x09\x8c\xa2\xd1\xf4\x16\x44\xf7\x90\x89\x83\xeb\x17\x4a\x23\xa7\x81\xcf\x15\xef\x38\xeb\x91\x16\xed\xa4\x12\x3a\x15\x22\xf5\x3b\x81\xfb\x73\x68\xe8\x07\x5f\xb8\x38\x59\xd2\xcf\x98\xd9\x21\x53\x5a\x70\x9f\xaf\xa9\x87\x3c\x4a\x03\x9a\xae\x68\x2f\x7e\x62\x86\xb8\x99\x25\x7c\x09\x24\x01\x6c\xa5\xbf\x6d\x31\x69\x09\x92\x11\xa9\xa4\xa6\x74\x5c\xdd\x31\x98\xf1\x33\x7f\x60\x92\x82\x27\xce\x3c\x7d\x60\x96\x0b\x53\xde\xdf\x01\x1a\x89\x40\xf5\xc4\x68\x20\x7a\x38\x94\xbb\x08\x72\xb3\x33\xcc\xde\xc9\xd5\xec\xd9\x11\xec\xbb\xb9\x6c\x9b\xc4\xbd\x48\x75\x32\x0e\x4d\x3e\x9c\x02\xd9\xdc\x76\x10\x9e\xc4\x5e\x61\xd1\xcf\x5a\xc7\x29\xf2\xe3\x4a\x96\x47\xb9\x5b\xce\x70\xb0\xc6\x33\x17\x1a\xda\xf0\xdf\xdb\x5a\xfb\xa4\x03\x5b\x3c\xce\x8c\xb7\x14\x1a\xd1\x42\xbb\x7a\xdd\x4f\xc3\xf9\x61\xd4\x2d\x72\x03\x75\x4a\x4e\x31\x32\x21\xd4\x87\x83\x1e\x32\x94\x7d\xa9\x11\x38\xab\x64\x8b\x59\x52\xef\x69\x56\xe2\x7a\xa5\xd2\xc1\x75\x79\x4b\xf8\x1e\xf2\x77\xfa\xa6\xb9\x05\xe1\x45\x02\x86\x68\x87\xd8\x78\x80\x60\x6e\x81\xb2\x7a\xf0\x1b\xb2\x63\xec\xf2\xc5\x82\x05\x85\xea\x6c\xe8\xd8\xb3\x91\xd8\x6f\xce\xda\xdc\xd1\x1f\xdb\xb5\x66\xfd\xf1\x47\xf4\x02\x01\x0f\xc3\x5f\x51\x57\xe0\x36\x14\x6b\x37\x36\xc8\xa4\x33\x59\x12\x7c\x26\x1f\x6b\xf0\xca\xd3\xbd\x8a\x34\xcb\x15\x09\xf7"}, +{{0xc1,0x0b,0x5a,0xc6,0x05,0x5a,0x1d,0xdb,0xca,0x28,0x55,0x2e,0x5c,0x72,0xeb,0xd0,0x52,0x78,0xc9,0x22,0x39,0xb2,0xfc,0xd0,0xc1,0x35,0x36,0x51,0xa8,0xe5,0x59,0xa0,},{0xb2,0x18,0x3e,0x1b,0x00,0x81,0x6d,0x29,0x30,0x5f,0x74,0x68,0xe7,0xe4,0x5e,0xed,0x3f,0xd8,0xf2,0x3c,0x15,0xb3,0x05,0xf9,0xfd,0xa9,0x3e,0x81,0x2d,0x65,0xbc,0x27,},{0x8a,0x9a,0x32,0x17,0xfd,0xf0,0x64,0x3a,0xaa,0xa5,0xc8,0xfb,0x2a,0x88,0xa5,0x56,0x39,0x88,0x59,0xb8,0xfe,0xef,0xbc,0xb4,0x8c,0xcd,0x88,0xe5,0x85,0xa1,0x67,0xc9,0x4d,0xbb,0x5c,0x0c,0xad,0x24,0xd1,0x5b,0xca,0xbb,0xc1,0xed,0xb2,0x1f,0x02,0xa8,0xc4,0x57,0xc5,0x61,0x20,0xa3,0x23,0x4a,0xc3,0x35,0x77,0xb9,0xaf,0x2d,0xdc,0x01,},"\x35\x94\x90\x5f\x9e\xa4\x64\x61\x5f\x41\xb8\x7a\xbb\x9d\x16\x73\x37\xf2\x9d\x45\xd9\x7f\x7a\x14\x64\xec\x9f\x2e\xe5\x0f\x90\xf2\xe6\x73\x39\x87\x4d\x3f\x20\x93\xbe\x92\x26\x10\x77\x01\xec\x1a\xab\x94\x1c\x4e\x05\x9f\x1b\xb2\x6c\xe8\x6e\x14\x8d\x1d\x9f\x0d\xa2\xa2\xa0\xf9\x82\x9a\x36\x4f\xb4\xf1\x3f\x58\xb9\x60\xd0\xf8\xd7\x23\x23\x28\x3c\x44\x90\xef\xdf\x57\x87\x86\x45\x89\x0f\xf7\xbc\x50\x65\xda\xd6\xe5\x1d\xd1\xe5\xb9\xa5\x07\x51\x50\x97\x8b\x33\x67\xf1\xba\x84\xe4\x5f\xf1\xf1\x27\x6c\x57\x6e\x4b\xc7\x2b\xe8\xaa\x8e\x40\x5f\xc2\xb2\x7f\x81\x46\xb9\x99\x84\x5f\xaa\xa0\x59\x5d\x3c\xb7\x0e\x5d\x37\x12\xed\x54\xa0\xfb\x3e\x32\x2d\x45\x38\x0b\x5d\xe3\x60\x9b\x96\x7b\x95\x9b\xca\x5a\x58\x3c\xc5\x20\xcd\xcb\x7b\xcb\xb8\x29\xaa\x25\xd7\x93\x20\x95\xec\xb3\x03\x92\x3c\x25\x60\xaf\xc3\xfd\x73\x24\xb7\xb7\xac\xd0\x89\xa9\xf0\x0c\x03\xa7\x3d\x04\x3d\xc0\xcf\x0b\xa0\xd8\x41\x1e\x2b\x1b\x18\xd2\x1d\x2a\x32\xa7\x26\xa5\x30\x59\x14\x0f\x78\x4f\x7c\xed\xf2\xf3\x3c\xec\x66\xfe\x4a\xd5\xcc\x9e\xac\xcb\xe4\xae\x10\x03\x6a\xc3\x52\x3b\xac\x70\x0a\x11\x3a\x98\xb5\x98\xe6\xdf\x03\x04\xc6\xfa\x32\x12\xac\xc0\x4c\x4e\x3c\x7f\x66\x87\x36\x2e\xf8\x6d\x61\x7c\x6d\xd4\x83\xf8\xd8\x0c\xea\x66\xd1\x95\x11\x27\x42\x8a\x61\xc1\xe1\x55\xa6\x85\x0b\xb2\xaf\xb7\xf9\x1c\x82\xd7\x3e\xb2\xb0\x54\x3e\xe8\xfc\x1f\x38\xe1\xdc\xdb\x3c\x50\x3d\xdc\x9b\xa0\x81\x24\x56\xa5\xce\x2e\x11\xd5\x56\x48\x7a\x64\x69\x74\xa7\xbb\xf8\x6e\x80\x6c\x58\xc6\x8c\x42\x69\xa7\xc9\xbb\xca\xc0\xff\xef\x98\x35\xb3\x3d\xc4\x49\xa7\x54\x79\xec\xd2\x3f\x6d\x14\x9c\x1e\x5e\xa8\xb6\x92\x08\xff\x36\xe5\xfb\xd6\x82\x95\x55\x03\x18\xbf\xa0\xd3\xb1\xd6\xc1\xad\x42\x70\xbc\xab\x09\x04\xae\x53\x49\x1f\x9b\x1c\xa5\x02\xe0\x12\xee\xd7\x7c\x42\x7d\x49\xa0\x96\x2f\x10\x55\x12\x5d\xd7\xb5\x37\x33\xd8\x52\x89\x34\xb5\x58\x0d\xd5\xfd\x5b\xbe\x85\x49\x78\xba\xe3\xd2\x5b\xb4\xae\x94\x4e\x90\x65\xe8\xe2\xe0\x79\x46\x51\x8a\x6f\x54\x8e\x36\xe0\x56\xbe\x82\x4d\x9e\x02\xa7\xa3\xea\xad\xd3\x79\x29\xf5\x81\x01\xcb\x18\x53\xbe\x3d\x75\x47\xf5\x8f\x49\xe3\x8b\x01\x8a\x74\x8d\x3f\x19\xc4\x85\x82\xab\xbd\xbe\x95\x3a\x8a\x25\xba\x9d\x36\x5d\xea\x83\x59\x35\x89\x9c\x19\xfb\x0b\x51\x90\x6a\xa9\x72\xc5\xac\x45\xe9\x9c\x40\xb3\xb7\x6e\x35\xd3\x27\xe3\x21\xe8\xae\x23\x06\xa6\xeb\x3d\x8c\xb6\xec\x2f\xa5\x39\x9a\xdd\x19\xea\x00\x28\xa0\x17\x92\xc0\x8e\x27\xc1\x6c\xf4\xf8\x5a\xaa\xae\x72\xf9\x86\xb0\x99\xf9\xeb\xe4\xad\x0b\x25\xd0\x6d\x3d\xe4\x4a\x8b\xfa\x52\x84\x4b\xe4\xa9\x39\x44\x83\x3c\xe2\xad\xd5\x1b\xb5\x54\xb3\x56\xa7\xdc\x49\x74\x8d\xd4\x5a\xe7\xec\x9e\x8d\xb4\x26\xc9\x7a\x25\xda\x5e\xdd\x3b\x62\x1e\x4a\xdb\xde\x48\x19\x7a\x33\x14\xde\x1c\x50\xf4\xd6\x00\x20\x27\xdd\x75\x19\xdd\xe3\xe1\x57\x29\xe4\x86\x95\x5a\xc4\x0d\x9d\x66\x87\x6f\x90\x66\x8c\x68\x9d\x8a\xb5\x98"}, +{{0x06,0x1b,0xdd,0xab,0x28,0x0b,0x0f,0xdc,0xb2,0x6b,0xfd,0x9a,0x0f,0xc7,0x21,0xf6,0x8f,0x88,0x34,0x3b,0x5d,0x39,0x83,0xa1,0x6b,0x6d,0xfa,0xa5,0xe7,0x69,0x69,0xf3,},{0x81,0x55,0x78,0xbb,0xa6,0xe7,0x07,0x0e,0xbd,0xec,0xa1,0x17,0x56,0x8b,0xd7,0x7e,0xbf,0xf9,0xe1,0x4c,0xb8,0xbc,0x20,0x0c,0x32,0xbd,0x87,0xdb,0x1f,0xb3,0x7d,0x6c,},{0xb8,0x32,0x97,0xcc,0xdd,0x6d,0x00,0x98,0xeb,0xf5,0xd1,0x32,0xd1,0x74,0xde,0x19,0x58,0x31,0x1a,0x76,0x6b,0xcc,0x4d,0xa1,0x5f,0x86,0x4d,0x80,0x1f,0x38,0xe0,0x9d,0x61,0x3e,0x7a,0xa8,0xc3,0x36,0x30,0x27,0x35,0xd7,0x5b,0xe4,0x16,0x6d,0x73,0xb0,0x18,0x4b,0x0e,0x0b,0xc5,0xef,0x39,0xed,0xbc,0xcb,0x6e,0x0e,0x61,0xaf,0xeb,0x0c,},"\xee\x76\xb4\x0c\xd4\x29\xea\xc7\xbc\x12\x83\x9c\xa2\xf7\xcd\x31\xf1\xe0\x09\x8a\x39\xc5\xfc\x19\x80\x5b\xe0\x33\x1f\x44\x79\x9e\x31\x8d\x12\x57\x1f\x06\xe2\x99\x37\x53\xa3\x68\x5c\xd2\xa9\x6b\x23\x01\xe2\x00\x24\x20\x9a\xdc\x5a\xdf\x74\x79\xff\x90\xc4\x77\xc3\x69\x5a\xbb\x99\xbd\x28\x57\x9d\xbc\x78\x31\xa1\x92\xbe\xed\x0c\xe1\x7b\x03\x8b\x20\x76\x48\x00\x65\x3a\xf7\xaf\x02\x4e\x2a\x10\x4e\xd0\xf3\xe5\x2d\x4b\xbd\x3e\x10\x9c\xf1\x26\x29\x1f\x49\xb0\xa2\x1b\xe4\x33\xc1\xc5\xa2\x58\x9e\xa5\x72\x99\x7f\x63\xd2\xbb\x39\x72\xd5\x32\xbe\x35\xa0\x47\x1e\xf0\x57\x3d\x79\x5c\x07\x2b\x6a\x86\x85\xb9\x5e\x47\xb0\x9e\xa9\xf4\x75\xd9\x3b\xf1\x2b\xbd\x77\xb7\xd2\xbf\x5d\x5b\xdd\xf0\xae\x02\x37\x53\x71\xd1\xd7\x99\xea\x92\x04\xbe\x38\x9e\x6a\x8e\x5d\xee\xdc\xd4\x92\x02\xe9\x2d\xf7\xc3\xe7\x61\xf9\x2e\xf8\xd7\x9f\xa7\x38\xd2\xc5\xbc\x28\x0e\xd3\x28\x79\x83\x2f\xf2\xb0\x26\x42\x45\x89\xcd\xbd\x52\xd1\x5b\x60\xf2\xaa\x35\x26\xb8\x98\x84\x9a\x34\xa8\x5f\xf1\xc4\x7d\xc6\x55\x4b\x85\xac\x76\xaa\x79\x35\xcb\xf3\xf7\xbc\x80\xad\x00\x91\x92\xa8\x75\xca\x20\x9b\x40\xfe\xb0\x47\xcc\x44\x69\x68\xf9\x70\xda\x47\xb8\xcd\x67\xda\x7e\xb4\xe5\x4a\x0e\x5a\xb2\x0c\xb3\x5b\xc6\xfb\x7f\x13\x30\x7c\xe6\x7e\xb6\x20\x4a\x67\xce\x9b\xb1\xd1\x39\xc1\xb4\xbd\x5d\xbe\xd5\x80\x10\xc8\x7b\xf8\x31\xe6\x52\x2e\xe1\x82\xda\xd9\x45\x80\x4b\x76\x7c\x4d\xf2\x55\x4f\x15\xb9\xe9\xaf\xd2\x59\x9e\xf2\x58\xc6\x7a\x22\xca\xeb\x92\xa5\x79\x88\x00\x6b\xbc\x72\xc1\x04\xfa\xc7\xe5\x41\x3c\xd3\xd3\xb8\x02\xc8\x3e\x63\x9e\xaf\xe2\x12\xa3\x8b\xb7\xef\x77\x9a\xf1\xa9\x4e\xe1\x37\xf6\xc6\x06\x67\xbc\x48\xf2\x7b\xf4\xa2\x22\x41\xbc\x44\xbb\x60\x33\x83\x62\x39\xbd\x6e\xaf\x3e\x2e\x22\x31\x87\x84\x1e\x46\x41\xb0\xf4\xe9\xff\x8d\x5a\x41\xdd\xbe\xab\xb4\x13\x8f\x6b\x58\x5a\xce\x0f\xb6\xb5\x3d\xc3\xc9\xed\xc0\x37\x3b\x60\x47\xf2\x7d\x83\x5e\x8e\x24\x66\x44\xfd\x83\x2c\xcf\xe0\xdf\x25\xc3\xd7\xda\x18\x7c\x9f\xa0\x54\x20\xd4\x34\x55\xf2\xd0\x8b\x57\x19\x29\x38\x6b\x59\xc6\xe0\xe1\x0a\x35\x60\x1d\xa8\x99\xb1\xb4\xdc\x3d\x95\xb6\x7d\xd9\xa8\x38\x18\xb0\xa3\x18\xbf\xdd\xa0\x64\x64\xb4\xa4\x2d\x3c\xb9\x85\xf3\x0e\xc9\x7d\x6a\x2a\xf1\x32\x91\x15\x5d\x60\xce\xc5\x7c\xbd\x58\xd5\xcf\xcb\x35\xc1\x85\x35\xe8\xd2\x99\xb5\xb0\x07\x59\x08\x92\xea\x94\x9d\x1b\x13\x7a\x62\xb3\x9a\x43\x6c\xd7\xe5\xb9\xf8\xd1\xb6\x93\x8d\xba\xa6\x2c\x22\x68\xd4\x59\xc6\x22\x0a\x3e\x6f\xcb\xf8\x0b\xa0\x11\x8a\xcd\x23\x42\x56\x3f\xbd\xbc\x1f\x7c\x9d\xba\x7e\xa2\xc0\x72\xaf\xc8\xae\x21\x28\xe3\xeb\xca\x06\x44\xff\xd8\x16\x3e\x80\xa1\xa5\x57\xd9\xd3\x90\x34\xcc\xd9\xdb\xd1\x2c\x88\x55\xa6\xf9\x16\x5b\x08\x01\x83\x9c\xf6\xe0\x7a\x9f\xba\x4c\x64\xd9\xc0\x99\xe1\x54\x10\xe2\x90\xe6\x77\x03\x1b\x65\xcf\x7d\xeb\x00\x79\xbd\xad\xc5\x73\xcc\x05\x6d\x76\x66\xd9\x5d\x03\x3a\x0b\x6b\xdb\xa7\xec"}, +{{0x2c,0xab,0x5b,0xf5,0x5f,0xfa,0x91,0x4e,0x9a,0xd0,0x76,0x22,0x19,0x0d,0x34,0x3e,0xc5,0x5c,0x13,0xcd,0x91,0xb3,0x88,0xcb,0x75,0x00,0xff,0xe0,0x6d,0xf7,0xc1,0x80,},{0xb6,0x1e,0x43,0x2b,0xb9,0x7c,0xba,0xe3,0x88,0xa2,0x57,0x8a,0x74,0x84,0x99,0x8e,0x00,0xe9,0xad,0x3d,0xdf,0xd6,0xca,0xb8,0xd3,0xa5,0xfc,0x5b,0xa0,0x43,0x07,0xc8,},{0x4c,0xf0,0x8f,0x4f,0xab,0xbd,0x06,0xdc,0xcb,0xcc,0xe2,0xa7,0xa5,0x94,0x1f,0xe9,0xaf,0xdd,0xc4,0xd2,0xd0,0xbc,0x80,0x80,0x2e,0x93,0xb1,0x2c,0xb1,0x35,0xd3,0xac,0xf6,0x51,0x1e,0x0f,0xe4,0x11,0x3c,0x5e,0x3c,0x55,0x41,0xb2,0x7d,0x3a,0x21,0x50,0xa7,0x57,0x74,0x2a,0xc6,0x5f,0x95,0xa9,0xce,0x66,0x73,0xff,0x0c,0xd2,0x1c,0x0f,},"\x2c\x2d\x04\xdc\x3a\xd1\x98\x23\x59\xec\xd5\xbc\x3e\xe0\x35\xf3\x49\x8e\xed\xff\x61\x04\xa9\x3c\x60\x2a\xf2\x17\x9a\xeb\x2c\xb1\xf4\x1c\x5c\xdb\x0a\x77\xb1\x24\xf9\x46\xaa\x8a\x82\x4a\xa3\x07\x6c\x2e\x1a\xcf\xd4\x8f\x68\x07\x0b\x26\x27\x6a\x65\x6b\x4a\x47\x58\xab\x15\x1a\x6a\x9c\x41\xbd\x74\xe0\x9b\xbd\x9a\xdc\xce\x1e\x87\xa0\xa8\x0d\x17\xfd\x92\xe8\x5e\x4b\xda\x47\x2c\x98\x8b\x6b\xb1\x18\x3b\x7e\xe5\x9a\x09\xd8\x05\x70\x46\x6d\xb9\x0d\xd3\x74\x95\x79\xc4\xeb\x19\xab\x75\xfc\x15\x2e\xcd\xcd\x68\xcd\x10\x78\xef\x06\xe5\x93\xc7\x35\x16\xfa\x82\x91\x48\x1a\x66\x7d\x3f\x95\xbf\xeb\x14\x4b\xab\x59\xd6\xdd\xc7\x3a\x27\x95\xc1\x01\x7e\x09\x53\x6b\x31\x62\xe4\xbc\x58\xf8\xea\xd3\x89\x57\x01\x8c\xfe\xc7\x2b\xad\xbf\x22\x81\x9a\xb0\xb4\x06\xc6\x47\x30\xfc\x73\xfd\x9e\xe6\x1f\x74\x18\x7e\xda\x91\xed\x4e\x79\x93\xe6\x68\x84\xaf\x43\xef\x4c\x6b\xf7\xf7\xc3\x79\xe8\xf0\xf6\x3d\xcb\x80\x41\xe2\x6b\x8b\x82\x92\xb6\xb6\xd1\x90\xe4\xad\xf4\x30\xfa\x82\xdd\x74\xc5\x73\x85\xb9\x19\xc4\x46\xdb\x37\xb5\xe8\x76\x7e\x4a\x0c\x95\x01\x3b\xe8\x9b\x2b\xc4\xe9\xfd\x62\x75\x4a\x84\x44\x18\x40\x09\x68\xae\xd2\xdd\x32\x8d\x7b\x1d\xc9\x1e\x1a\x2b\x30\x09\xdc\x7a\xd1\x40\xa0\x68\x6f\x67\x31\x68\xa6\x0e\x88\xd8\x0c\x52\x0f\xc2\xdc\xfc\x56\xca\x9d\x4b\x0c\x88\x85\x90\x99\x23\x07\x14\xde\xc8\x3d\x26\xb4\x63\x05\x54\xdc\xb9\xc4\x90\x18\x95\xf7\x8f\x38\x34\xb0\x97\x66\xb6\x7a\x46\x5d\xe8\xc9\x49\x00\x65\xbf\x56\x83\x39\x24\x33\x99\xfd\xc9\xd5\x10\x03\x24\x66\x7c\x5a\xb2\x8f\x35\xc0\x0f\x61\x25\x63\x8e\x61\xda\xb7\x0d\x1e\xec\x48\x95\x1d\xe0\xfb\x3f\x7b\x23\xd3\xcd\x98\x24\x37\xc6\x34\x73\x41\x5b\xef\x37\x4a\x66\x32\x96\xf2\x98\x6b\x1a\xe9\x57\x9b\x9f\xfc\xe7\x1e\xc3\x5e\xec\xa1\x16\xd1\x94\xf8\xfb\xa9\xa4\x5a\x91\xba\xe2\x7a\xc4\x55\xdb\x71\xa6\xb0\x1a\x72\x9d\x0c\x13\x5f\xcd\xcb\xc2\x3e\x50\x4a\x29\x43\xc0\x0a\xa4\x20\x70\x51\x9d\x9c\xd7\x7a\xe6\x75\x4f\x31\xeb\x46\xa3\xe5\xbe\x9e\xeb\x3f\xc8\xd3\x1f\xf1\x82\xda\x9b\x08\x7b\xe3\x46\x2c\x84\x59\x12\x6e\x86\x29\x09\x23\x2f\xd5\xf2\xd8\x9c\x01\x81\x59\x57\x61\x1e\x6a\xe7\xca\xa9\x8b\x60\x53\x77\x6a\x77\x15\xc2\xf9\x3c\xcf\x03\x08\x87\x03\x0c\x56\xc2\xb8\x22\x6d\xae\x29\x77\x99\x5a\x6d\x3f\x1e\x9d\x79\x11\xa9\xc9\xd2\xa3\x03\xf0\xe0\x1f\x32\x33\x8e\xfd\xaf\x8e\xe6\x3f\xc4\x1b\x25\x39\x9c\xff\xd0\xb3\x5f\x7e\xe5\x67\x6b\xd8\xfd\x3d\xa2\xcb\xee\x4a\xe2\xea\x98\x08\xd7\xe7\x35\x83\xd9\x94\x33\x99\x31\x46\x67\x4a\x40\x40\xf4\x2f\x63\xd1\xb3\x13\x5c\xc7\x97\xa8\xd8\xf0\xb8\x85\x73\xa3\x28\x90\x69\x6c\xac\x94\x39\xd1\xe1\x5d\x19\x6d\x90\x90\xb6\x2b\x6d\xb7\xe6\x3c\x96\x47\x2d\x94\x6e\x66\x8c\xbd\xa1\xf4\xdb\x88\x93\x00\xcd\xcc\x25\xe8\x4c\x9f\x38\x57\xd1\xd9\xe5\x32\x41\xcf\x62\x5f\x39\x09\xaf\x1c\x8a\xaf\xf4\x30\x9f\x68\xf6\x54\xb7\xa1\x5b\x67\x71\x1c\x5b\x7f\x9d\xe7\x67\x75"}, +{{0xdd,0x7b,0x59,0xa3,0x3d,0x97,0x0b,0xef,0x62,0xe0,0xe2,0x1a,0x7b,0x6e,0x4c,0x30,0x96,0x06,0x86,0xf1,0x7f,0x49,0xaf,0xdb,0x4a,0x9f,0x4e,0x80,0x8e,0x35,0x5c,0x7f,},{0x53,0xa0,0xe5,0x72,0x77,0xd9,0xbb,0xee,0xcf,0x99,0xc4,0xd1,0x38,0xfd,0x66,0xfa,0xfc,0xae,0xc7,0xbc,0x5f,0x56,0x7f,0x83,0x20,0x80,0x0c,0x4e,0x58,0x4f,0xf8,0x2e,},{0x87,0x29,0x4d,0x22,0xd4,0xad,0x0d,0x08,0x14,0xe2,0xd6,0xd5,0xfa,0xf5,0x57,0x49,0xe9,0xb3,0x98,0x03,0xb4,0xd4,0xb7,0x87,0x9e,0x60,0xb7,0x77,0xc1,0xfc,0x41,0x58,0x4f,0xe1,0x51,0x35,0xba,0x11,0x23,0xff,0x5f,0x20,0x0d,0xb3,0x5a,0x34,0x68,0xdd,0x4d,0x58,0xda,0xd7,0x7b,0xd9,0x6e,0xe2,0xb8,0x88,0xa5,0xa8,0xb1,0x8c,0x32,0x04,},"\x75\x58\x03\x67\x93\x05\x18\x16\x8b\x0a\x76\x4d\x09\x58\xbe\xc4\xfc\x46\xcf\x59\x19\x99\xeb\x37\x37\xe4\x2a\x02\xea\x72\xd2\x10\xda\xad\x53\xe5\x4a\x7c\x2c\x13\x4a\x6d\x47\x83\x37\xd2\x63\x33\x68\x54\x81\x70\xed\xef\x0d\x85\x17\x9f\x30\x23\xe1\x50\x38\x68\xa6\xe5\xe2\x77\x5e\x41\x2a\xc0\x5f\x05\x89\xd4\x2a\x37\x7e\x75\xaa\x6b\x8f\x52\x20\xa7\x69\x9a\xe8\xaf\xf0\x10\x94\xec\x46\x9d\x63\x61\xd3\xe8\xf3\x86\x15\xed\xcd\xa4\xd2\xd5\x28\x9a\xcf\x73\xdb\x64\x56\x98\x57\x80\xc9\x2e\x07\xf6\x2c\x77\xa9\x09\xfb\x6e\xf5\x98\x82\x20\x62\xbd\x57\x2b\xf7\x05\x8d\xcb\x83\x5e\xf3\x44\x3d\x3e\x47\xb5\xc6\x03\xd9\x27\x36\xdd\x1d\xf2\x6b\xe4\xb9\x28\x3b\x76\xe3\x21\xd5\x5c\xe2\xb6\x38\xcd\xe2\x25\x77\xca\x59\xc9\x63\xc2\x47\x95\x56\xc5\x75\xcc\xb0\xd6\xd1\x8c\x80\x4e\x2e\xb0\x1f\xf5\x35\x81\xeb\x04\x0f\xfd\x2c\xc4\x67\x60\x73\x7a\x74\x67\x2e\xa6\xbf\x78\x05\x8a\x6a\x0a\x1f\x5e\xbf\x56\xde\xcb\xf9\x4b\x54\xaf\xb2\x3c\x11\xd3\x41\x79\xbf\x09\x76\xb4\x15\x80\x17\xd4\x07\xc9\x5a\x40\x1f\xa6\xf9\x62\x4d\x77\x13\x5e\xae\x81\x41\xeb\xea\x9f\x35\xd5\xf5\x1b\x3d\xed\x99\x5c\x7f\x70\xc0\x25\xb0\x94\xad\xef\x2b\x07\x1f\x97\x11\x55\xd7\x79\x6d\x61\x3a\x55\x0d\x09\xe7\xf4\xdf\xc3\x45\x17\xb3\xf8\xfa\x43\x93\x28\x6a\x2b\x22\x80\x17\xda\xf2\xe0\x15\x38\x7e\x13\x52\x7f\x63\x66\x1d\x3c\x13\xe7\x8e\x90\xfb\x29\x55\xee\xe3\x45\x73\x91\x19\xb7\x91\xf0\x5b\x07\xc8\xf4\x2a\x43\x6e\xfc\xad\x1e\xc5\xea\x10\xf3\x08\xf8\xe2\x3c\xa9\x8b\xc6\x5a\x5f\xd9\x39\x3e\xfa\xaf\xe5\xcd\xef\xba\x81\x05\x81\x70\xcc\x54\x93\xc0\x0c\xed\xf2\x54\x09\x74\x35\xd2\xe2\xfd\xe5\x5f\x86\x6b\xb8\x2d\xbd\xfb\x91\x54\x34\x49\x74\x86\x63\x59\x16\x7b\x46\x6c\xaa\x90\x9b\x91\x53\x0c\x9c\x7e\xe8\xc5\x3f\xa9\x01\x64\xbb\xd0\xb1\xfa\xdb\xdc\xd0\x81\x27\xf1\x9b\xe5\x03\x30\x71\x51\x8d\x3c\xf1\x0a\xe6\xbd\x6f\x98\x27\xe1\x20\x6f\x5e\xc0\x95\xc1\x98\x61\x70\xe8\xd5\xd8\xe7\x2e\x57\xd4\x22\x87\x01\xdf\x2a\x48\xc9\x54\x87\x30\x56\xcf\xdf\xba\xaf\xb1\x0e\x46\xa0\xc1\xf1\x44\xb1\xa0\xea\xcd\xd2\xcb\x66\xbb\x91\x2a\xc4\x71\x78\x7d\xab\xe4\x83\x53\x85\x91\x20\xb0\x34\x03\x56\x7c\x41\x5d\xdb\x88\xfc\x0d\x7f\xba\x40\x69\xbb\xfe\xf4\x06\xee\xd7\x24\xa1\x1a\xbc\x04\x1e\x8e\x7b\xeb\x66\x3d\x0d\xc9\x9d\xce\xf3\xac\x6a\x14\x90\x07\xb4\x2d\xd1\xf2\x2a\x77\xdd\x52\x90\x18\x14\x32\x51\x72\x22\x4a\x27\x78\xf3\x66\xfb\x9e\xb0\x2c\x81\x2b\x84\x2a\x42\x84\x25\x61\xc6\x8f\x2a\xc2\x31\xc2\x6c\xe9\xe8\xb1\x9a\xe9\x1e\xbf\xad\x3c\x0e\x9f\x66\x36\x3a\x13\xec\xd8\xb8\x97\xa3\xd0\x0a\x26\xd2\x57\x64\x8d\x56\xc6\x74\x74\x41\xca\x1c\x6e\xe9\x9f\x08\xdd\xad\x25\xd1\x16\xdf\xad\xab\x03\x83\x00\x0d\x3d\x72\x25\xcf\x2e\xff\x70\x76\xb2\xad\xab\x95\x22\x29\x25\x55\xf3\x19\x32\x06\x78\x60\x00\xd4\x2c\xa3\x4d\x70\x8d\xc0\x42\x84\xa9\x4d\x17\x4c\xc9\x2f\x10\x2e\xfd\xdf\x31\x48\xc2\x99\x69\x16\xd4"}, +{{0xd8,0x80,0xd2,0xfb,0x06,0x26,0x2f,0x57,0xab,0x87,0x78,0xe3,0x3d,0x16,0xb4,0x73,0x06,0x09,0x78,0xa6,0x54,0x9c,0xdb,0xcd,0x55,0x86,0xba,0x81,0x05,0xf5,0xac,0xa8,},{0x0d,0xe4,0x86,0xd2,0x11,0x5f,0xaf,0x2d,0x54,0x72,0x66,0x77,0x2e,0x43,0x0f,0xd9,0x72,0x7b,0xdc,0xac,0xe6,0xec,0xbf,0x2f,0xe2,0x3a,0xb6,0x0f,0x7b,0x52,0x54,0xb1,},{0x4c,0x00,0xa7,0x16,0x68,0xd3,0x21,0x3c,0x29,0xc7,0x04,0x1c,0x5a,0x03,0x7e,0xdf,0x13,0xc6,0x51,0x4b,0xd0,0xeb,0xc8,0x80,0xc9,0x09,0xca,0xff,0x15,0x06,0xa4,0x5d,0x27,0x80,0x9f,0xb7,0x4e,0x66,0x02,0xea,0x2a,0xad,0x0f,0x84,0x28,0x31,0xb7,0x4f,0xb3,0xd6,0x90,0x0c,0xcc,0x52,0x06,0x52,0xda,0x28,0x36,0x8f,0xd9,0x0c,0xa3,0x0e,},"\x11\x47\x43\xe8\x2a\x09\x93\xce\xc9\x70\x50\x67\xab\xd7\x7c\x16\x8b\x53\x67\x7e\xde\x5c\x15\x9f\xad\x36\xf0\x6f\xc1\xa1\x4a\xcd\x77\xf8\x83\x79\x9e\xd9\x88\x3f\x99\x15\xae\xa6\x38\xec\x17\x41\xf3\xf4\x21\x58\x55\xfb\x5b\x07\xdf\x37\x93\xbb\xe5\xb5\x68\xeb\x35\x94\x39\x1a\x9e\xf5\x72\x7f\xab\x93\xe5\x74\x69\xb3\x7d\xe1\x25\xb1\xe9\xf2\xe6\xfe\x2c\x3d\x1a\x10\xec\xf8\x7b\x6c\x0a\x66\x5c\x6d\x46\x0a\x17\x0e\xef\xb9\xbf\x71\x6c\xd8\xfa\xea\x97\x64\xf5\x79\xff\x34\xeb\xfa\x9c\x4c\xfb\x34\x70\x6d\x8d\xd7\xc9\xeb\x1d\x10\xb2\xdf\x46\x0a\x46\xbb\x57\x89\x43\x0b\xf4\x49\x15\x8b\x58\x24\xf2\xa3\xa7\xb9\x18\xb3\x3a\xcf\x2d\x9e\xbe\x90\x21\x6d\x1b\x7c\xbf\x4a\xf7\x70\xc5\xdb\x95\xfc\x62\xff\x3a\x3c\x38\x5c\x3a\x82\x17\x85\x3b\x73\x46\x63\x4a\xaf\x30\x60\x72\x88\xdb\x0c\x48\x3b\xd4\xc2\x22\xeb\x33\x2c\xb8\x9d\xc4\xa2\x17\xe6\x33\x4a\x26\x84\x13\xa3\x90\xbb\x37\x1a\xec\x35\x5f\xbe\x4c\x73\x6f\x7d\xa7\x5f\x9c\x88\x75\x41\xa2\xb7\xd0\xda\xc0\x18\xb6\x13\x8f\x02\x1e\x77\x26\x6d\xde\xce\x84\x68\x45\x2a\xda\x39\xf5\xe6\x3d\x02\x09\xb9\xd6\xda\xbf\x97\x54\x13\x25\x6d\xca\xa1\x5a\xc1\x4b\x60\x68\xe1\x77\x05\x6c\x7b\xf0\xf0\xf7\xc8\x84\xa3\x40\x20\x32\x29\x8c\xd5\x59\xa6\x31\x20\x39\x40\x06\x32\x32\x7f\x9c\x0e\x76\x3e\x52\x79\x8c\xb1\x77\xda\x44\x75\xe4\xb2\x40\x5c\x15\x7c\xa4\x27\x74\x11\x08\xd3\x3e\xd0\xb7\xa3\xf5\x34\x38\xce\x6b\x72\x5c\x6d\xd5\x81\x4a\xf5\x1c\xfa\x45\xdb\xce\xd5\x57\xf7\x26\xdb\x13\x0d\x55\xcd\xe7\x53\x3b\xc2\x09\x2d\x6b\x69\x9c\x2c\x87\x0a\xf2\x82\x73\x1e\x18\xd6\x51\xae\x85\xb3\xdb\x4b\xa0\x28\x53\xf8\xc8\x7f\xd5\xe3\xab\x69\xbc\x57\xb0\x8b\x81\xf8\x3c\x23\x9c\xcf\x22\xe8\x17\xe2\xad\xa4\xd0\xad\x14\x48\x7e\xd1\x46\x12\xc8\xb0\x97\x3e\xc0\x65\x0a\x55\xf6\xbf\x9a\xf4\xae\x92\x56\xad\x35\x46\xa3\xf6\x7d\xd3\x5d\x98\x7e\xf2\x19\x09\xa9\x4c\x50\xf0\xef\x06\x40\xe7\x55\xb1\xc4\xe1\xa0\x12\xaf\x0d\x31\x76\x6e\xeb\x5d\xf3\x1c\xd1\x04\xc6\x4e\xb6\x2e\xb4\xef\xb1\x39\xcf\x30\x57\x69\x40\x1d\x21\x3f\x96\xa4\x88\xd5\xee\x7e\x3c\xe3\x2b\x01\x92\xee\x8f\x08\x31\xbf\xbe\x8f\xe9\x5d\xe9\x56\x88\x6b\x52\x4d\x33\x19\xb7\x3f\xd5\x6d\xc6\x0e\x9f\x1c\x72\xd7\x81\x55\xa9\x7c\x6f\x43\x69\x7b\x20\x46\x6b\x3e\x7a\xeb\xd3\x57\xb9\x16\x96\xe7\x34\x8f\x45\x99\xb3\x4f\x35\x91\xed\xdf\xce\x2a\x7b\xd8\x49\xab\x16\xf7\xb4\x3e\xbb\x16\xe2\x3d\x6f\x52\x10\xef\xa3\x0a\xb3\xba\x8d\x32\xc4\x06\x62\xb8\x66\x2f\xd9\x11\x54\x4b\xc2\x45\x8c\x65\x69\xef\x75\xa9\xb9\xdf\x6a\x0f\x6d\x80\xd6\x58\xba\x86\xb2\x41\xca\x19\xce\x9a\x6f\xcf\x01\xd3\xda\xa9\x5a\xfb\x59\xc3\xd8\x9a\x18\xb9\x48\x62\x13\x94\x32\x7f\xc5\xe9\x20\xa7\x5f\x98\xf5\xe2\xb3\xd6\xc9\x5f\xd8\x52\xad\xf5\x67\xb6\xd3\x7c\x54\xd2\x97\x08\x56\xa5\x99\xf7\x49\xe2\xc5\x5d\xac\x7c\x23\xe3\xfb\x1a\x63\xbb\x4c\xc4\x7b\x8b\x94\xf3\xd5\x89\xac\x4b\xee\xf0\xaa\xd4\xe6\x29\x2f"}, +{{0x58,0x58,0x71,0x94,0x1c,0xc2,0x82,0xe3,0x33,0xd5,0x7b,0xbf,0xc3,0xd4,0xae,0xda,0x86,0x2c,0xfa,0x0a,0x37,0x50,0x30,0xcd,0x59,0x4b,0x36,0x92,0x84,0x8c,0x5f,0x00,},{0x4f,0x34,0x38,0x16,0xcd,0x48,0x05,0x0b,0x67,0x8d,0x3a,0xdf,0x70,0x00,0x88,0x77,0xc9,0xfc,0xf5,0xcb,0x66,0x2c,0xc4,0xad,0x2b,0x93,0x86,0x4c,0x02,0x09,0x07,0x07,},{0x29,0x88,0x56,0xe5,0x70,0x18,0x8a,0xef,0xca,0xd8,0x1b,0xb9,0x70,0xf0,0x76,0x96,0x57,0x70,0xc2,0x67,0x62,0xfe,0x29,0xe6,0x55,0x4d,0xc7,0xaf,0xcd,0xb8,0x01,0x72,0x3b,0xf6,0xc7,0x63,0xb4,0xcc,0xd6,0x5f,0x4e,0x15,0xd7,0xd8,0xea,0x38,0xfc,0xf6,0x7e,0xa9,0xd2,0x85,0x90,0xc7,0x92,0x55,0xc1,0xcf,0xeb,0xa7,0xb5,0xe4,0x5a,0x00,},"\x65\x1c\x10\x1b\x3e\x2d\xfe\xf0\x78\x3c\xe9\xf6\x1b\xd0\xa8\xbd\xc9\x30\x7a\xc0\x48\x8b\x9d\xd7\x0c\xd9\x0a\x7e\xd8\xf1\x79\xa7\x89\x35\x55\x62\x95\xb9\x1c\xc2\xb9\x72\x11\xe3\xb9\x81\xb8\xda\xfc\xb3\xd0\x6b\x76\xd0\xb6\xed\xa7\xfc\x61\x94\x5c\x0e\xe2\x65\x2c\x5a\xc4\x54\x25\x64\x96\xcb\x82\xf9\x8c\xc1\xcc\x92\xd8\x18\x93\xb1\x08\x2b\x31\xb4\x7e\x6d\x22\xa2\xde\x60\x9d\xe4\xce\x8d\x7c\xc4\xf4\xa1\x52\xc4\x7f\x41\x0d\x7f\xc3\x7d\x38\xcc\xd6\x29\xa4\xb3\x3e\x62\x21\x89\x60\x81\x79\x7d\x07\x53\xdd\x4f\xaa\x8a\x8b\x44\xd6\xc4\x67\x71\x66\xdf\xb4\xd5\x21\x54\x46\x36\x0a\x3c\x28\xd8\xf6\x8e\x38\xab\x54\x60\x8b\x98\x82\x1b\x83\xc1\x87\xb5\x39\x3a\xd8\x74\xa7\x6f\x4f\x5d\x72\x94\x93\xa1\xfd\x74\xcc\x77\x19\xca\xea\x99\x1d\x22\x9c\x5d\x0c\x8c\x4c\x5f\x89\xd8\xe4\x34\x5f\x4f\x52\x21\x43\x13\x41\x0b\x8c\x06\xb3\x31\x5f\x45\xed\x0c\x2f\x91\x38\xab\x96\x6a\xec\x0a\x64\x5b\x6d\xba\x76\x38\x0a\x53\x91\x23\xe0\xf3\x3b\x97\xf3\xd0\x60\x39\x4a\x30\x53\x58\x1f\xfd\xef\x3e\x6d\x36\x53\x11\x66\xb5\x53\xa9\xdd\xe0\x31\x05\xc0\x4a\xf6\x97\xd9\x5e\x95\x21\x7f\xd6\xdc\x96\x8b\xf3\xb4\x48\xd5\xf3\xa8\xe4\xf5\xae\x7e\xdc\x30\xec\x78\xb1\xae\xa4\xf0\xdb\x18\x9a\x94\x9a\x12\x21\x38\xcd\xfb\x5f\x96\x93\xdb\x00\x4b\xae\xd1\xa4\x21\xdc\x44\x12\x2f\x32\x72\x87\xf7\x27\xcf\x98\x9f\xca\xe3\xcf\x3b\xe3\xe3\xdd\x9b\x9f\x53\x50\x2c\xf5\xd9\xfb\x18\x6d\xe7\x91\xd3\x10\xd1\x22\x86\x9c\x9f\xc3\xb6\x95\xde\xc1\x60\x74\x77\xf3\xe1\x49\xe5\x2b\x63\xcf\xdf\xb0\xd9\x83\xe8\x9a\xf2\xf7\x5a\x8f\x48\x98\x43\xec\x05\xc5\xea\x5f\x0e\x72\x1a\xca\xb3\x87\xc6\x80\x25\xf2\x0a\xbe\x0d\x27\xb4\xce\x29\xf4\xa6\x4f\xb7\xf8\xe8\xa3\x32\x87\x3d\x3e\xd1\x21\xfb\x49\x34\x14\xb8\xcb\x0c\x00\xad\x3a\xb6\x16\xc5\xbe\x52\x41\x47\x1a\xde\xe9\xf8\xf4\x69\x74\xea\xe8\x4a\x4a\x8c\xe6\xfa\xbb\x7f\x5d\x9a\x6b\x75\xa7\xe6\x70\x45\x6f\xcd\xcd\x1d\x98\x2e\x8f\x82\x7a\x4b\xbb\x69\xde\xc7\xe3\x05\x3d\xfe\x83\x5b\x70\x30\x1b\x7b\x76\x3f\x00\x04\xbc\x90\x6e\x14\x55\x42\xf4\x87\xb4\xdb\xa2\xed\x56\x1b\xd1\xa2\x03\x06\x23\x6a\xf4\xb3\x6e\x40\x68\xe8\xc0\x07\xb9\x45\x4f\x87\x41\xa5\xf8\xf0\x79\xec\x1d\xb8\x83\x5e\xb6\x54\x42\x90\xd6\xad\xb5\x2a\x70\xd7\x67\x5d\x85\xdf\x4a\x9a\x12\x55\xbf\xd9\x36\xc3\x31\xfe\x51\xc0\x97\x7d\x12\x4b\x5a\x50\x6d\x29\xc6\xee\xc3\x3c\xaa\x25\xd8\xeb\x28\x95\x2d\x6f\xfb\x9d\x6e\x3d\xa8\x90\x38\x2d\x88\x87\x96\xd3\x74\x60\x7f\x66\x43\xb8\x9e\x73\x26\xd9\xed\xc4\x9a\x0f\x53\xbd\xcb\x8c\xc7\x6f\xfd\x39\x3a\x77\x06\x52\x2d\x04\x17\x00\x36\xcc\xb6\x63\x30\xdb\xac\x9d\xa7\xe6\x16\x8c\xaa\x88\xcb\x62\x18\x1e\x55\xa7\xb6\xd5\x21\xa2\x11\x5e\x23\xe2\x02\xee\x24\x80\xb5\x87\xbe\x45\x01\x44\x79\x79\xa8\xd7\x36\xf9\x01\x2e\xcf\x00\xe6\x7b\x31\xe8\x10\x4f\x6e\x7d\xf0\x8a\x96\x83\xcd\xc8\x9c\x03\xa4\xe3\x7e\xe2\x29\x28\xd4\x5f\xa1\x90\x94\xe0\xd6\xe7\xb4\x0b"}, +{{0x05,0x88,0xac,0xd4,0xe0,0x9b,0xa9,0x02,0x74,0xc8,0xf3,0xd1,0x57,0x5b,0x2b,0xf3,0x64,0xa7,0x76,0x88,0x4a,0x9a,0xeb,0x41,0x03,0x41,0x5e,0x16,0x3b,0xa0,0xbf,0x81,},{0x3e,0xca,0xe6,0x97,0xb4,0x25,0xd8,0x7e,0x34,0xa1,0xd9,0x44,0x09,0x8e,0x3d,0x32,0xe2,0xc1,0xec,0x56,0xc3,0x62,0x7d,0xf8,0x0b,0xa2,0xb8,0xa4,0x3d,0xdc,0x19,0x03,},{0xa1,0x11,0xb9,0x70,0x6d,0x24,0x2c,0xd3,0x6d,0x6e,0x87,0x41,0xcb,0xb0,0x97,0xb9,0xe2,0xff,0xfa,0x40,0xf4,0x3f,0xd6,0xf2,0xd3,0xd9,0x16,0x93,0x66,0x73,0x32,0xb5,0xf2,0xdb,0x5e,0xe3,0xea,0x20,0xb8,0x32,0x91,0xb8,0x40,0x57,0x95,0xb7,0x4d,0x63,0x3d,0x46,0xf4,0x75,0xab,0x7c,0x47,0x61,0x71,0x18,0x53,0x5b,0x80,0x51,0xd9,0x07,},"\xf8\x28\xf8\xc9\xda\xd2\x98\xc5\xb7\x19\xda\xa8\x52\xb1\x7e\x76\x25\x98\xa7\x0f\x4e\xcd\x16\xa2\xfc\x59\x6e\xb0\x26\x38\x99\xe9\x83\xd4\x4e\xdc\xc7\xbd\x24\x0c\xb0\x76\x10\x60\x0a\xe9\x6a\xac\x0d\xfc\x3b\xe3\x87\xb6\x16\x85\x08\x99\xb5\xcf\x44\xe1\x76\x7f\xfa\xca\x3d\xf3\x81\x58\x59\x84\x24\xf8\x07\x14\x14\xc7\x04\xe6\x0b\x42\x2a\xd7\x73\x77\xfa\x7f\x6a\x8c\x5d\x0e\xbc\x02\x35\xe2\xd4\x3a\x98\x4f\x3a\xdf\x75\x9e\xb1\x04\x47\xf3\xc2\xf6\xb8\x0d\x5a\x11\xef\x41\xd3\xa0\x98\x52\xc0\x93\x2a\x1b\x9a\xc2\x3e\x6f\x40\xa1\x67\xde\x21\x04\x1b\xec\x88\x85\xf9\x43\x3e\xb8\x0b\x95\xc9\x78\x59\x58\x04\x6c\xdb\x7b\xf1\x47\xa7\x99\x47\x82\x3b\x41\x49\xae\x05\x21\xd7\xe5\xaa\xbc\x15\x64\xfa\x40\x44\x10\x6e\x2e\x39\x2e\x9c\x34\x44\x57\xe9\x92\x93\x76\xea\x9b\x42\x29\xc6\xe7\x73\x8f\xe7\x90\x08\xd5\x54\xc4\x29\x39\x69\x14\xc3\x63\x87\xf5\x79\xb4\x6b\xab\x14\x6f\x6a\x95\x10\xeb\x6f\x8c\x85\x55\x1c\xbd\x84\xc7\xdc\x0d\x0b\x1c\x01\x0c\xcb\xa5\x96\x3a\x7f\x39\xf1\x81\xe4\x4d\xbc\x98\xe4\x95\xaa\x63\xc0\x10\x59\xcb\xe6\xa9\x9b\x07\xb4\x49\xe7\x75\x9c\x9a\xf9\xe0\xf8\xd9\x05\x4a\x67\xa3\x48\xfa\x19\xd7\xf9\x1e\xc0\xa4\xd4\xf2\xc7\x02\x6c\x3b\x84\x92\x59\xa3\x50\x41\x7f\xd8\x6c\xab\x21\x42\xe4\xcf\xe3\xc0\xaf\xbf\x25\x18\x2a\x2d\x52\xbd\x2e\x0b\xc9\x20\xe8\x50\x80\x83\x2b\x91\xb9\x27\xb6\x29\x48\xa6\x7c\x31\x7e\xb0\x90\x91\x46\x1d\x49\x3e\xea\x5f\xfc\x47\xbf\x08\x55\x82\x96\x82\x58\xa3\xc8\xdd\x81\xa8\x58\x27\x0b\xdd\xaf\xe7\x92\x56\x84\xa1\x5f\xfb\x51\xbc\xfa\xab\x93\x1a\xfa\x46\x5e\x30\x90\xe8\x6b\xe4\x1e\x35\x47\xcb\xa2\x34\xb8\x5f\xe7\xdb\x70\x04\x96\xa5\x05\x00\x2d\xf3\xca\x4e\xae\xc7\xb9\x62\x78\xc7\xd1\xa7\x7d\xb8\x34\xa9\x17\x97\xbb\xb8\x26\xd0\x92\xaa\x28\xb4\x95\x45\xed\x3b\x1e\xda\x23\xbe\x11\xa3\xf5\x28\xb9\x55\xcb\x0c\x4f\xa6\x6e\x16\xe9\x57\xe5\x70\x4c\xf3\x19\xe5\xf7\x9c\xc0\x9f\x2d\x05\x4e\x6d\xaf\x19\xe2\x92\x6b\x11\xe1\xe4\x13\xff\x82\x2c\xa1\x41\xf7\xc3\xd3\x85\xae\x95\xdd\x20\xb3\x46\xe5\x83\xcf\xb0\xc2\x29\xec\x39\xcf\x88\x9a\x54\x19\xcd\x37\xbc\x18\x4e\xf5\xfb\x14\x46\x22\x08\x0a\x30\x2d\x9d\x77\x45\xc4\x51\xf7\xd8\x82\x42\xcc\x26\xb9\x16\xa3\x56\x9a\xbc\x7d\x1f\x21\x6d\x57\x79\x7a\x47\x2b\xc6\x21\x76\x17\x58\xe8\x40\xeb\x8e\x29\xbc\x8e\xfc\xb7\xaa\xfc\x7c\xf8\xf4\xe5\x93\x30\xd3\x5e\xe1\x07\x49\x6d\xec\x6e\x71\x4b\x1f\xa4\x30\x98\x37\xbb\x47\xeb\x3a\x06\xb4\x60\x4d\xd2\x07\x33\xcc\x0e\xaa\xc2\x64\x9e\x18\xc0\x73\x42\xef\x55\xd1\x9b\x8d\x03\x95\x91\xac\x28\x69\xac\xc3\x4b\x6c\x3c\x1c\xa3\xcf\x26\x3f\xf8\x4c\xa4\x3a\x5f\x64\x65\xba\x34\x88\x8c\x10\x90\x13\xb3\x2b\xfc\x0d\x0d\x15\xf5\xa7\x6c\xec\x27\x0a\xb3\xac\x9a\x10\x63\x31\x31\x2f\x5a\x0a\x84\x28\x2c\x3a\x3d\x4a\xea\x1e\x7c\xf5\x3d\xbf\x8b\x24\x0b\xdd\x11\x1c\x34\xd2\xa9\x3d\xfd\x12\x58\xfe\x92\x67\x13\x3f\x75\x54\xdc\xc2\x1a\x8f\x43\x9c\x16\x5d"}, +{{0x7d,0x14,0x02,0x3e,0xb4,0x8b,0xbd,0x43,0x76,0x49,0xa2,0x41,0x87,0x79,0x05,0xa3,0xc9,0x32,0xf1,0x46,0x40,0xf2,0x9a,0x0f,0xb1,0x34,0x11,0x4e,0x8f,0x33,0xf5,0x82,},{0xea,0x5c,0x11,0xb4,0xb2,0xc5,0xef,0x4a,0xb7,0x06,0xcc,0xa3,0x47,0x50,0x43,0xc9,0x58,0x18,0xeb,0x56,0x5a,0x79,0x7e,0x33,0x68,0x8a,0xfe,0xac,0xd6,0x8a,0xdc,0xca,},{0x31,0x33,0x9d,0xce,0x23,0x33,0x6d,0xf5,0xb2,0xb1,0x93,0x52,0x2a,0xa3,0xdd,0x2d,0x41,0x14,0xa6,0x6a,0xf1,0x65,0x62,0x89,0xc9,0x52,0xbc,0x11,0xc9,0xb2,0x10,0xf7,0x7a,0x54,0xd4,0x61,0x61,0xf4,0xe0,0xc5,0x2b,0x30,0x13,0xe4,0x0b,0x9e,0x9e,0x84,0x27,0xd8,0x51,0x32,0x5b,0xd7,0x1c,0x4d,0x99,0x35,0x3e,0xee,0xd7,0x51,0x08,0x0d,},"\x90\x01\xdb\x31\xf2\x79\xbe\x50\x53\x19\xb8\xe7\x2b\xde\x11\x99\x51\x29\x80\xdf\x65\xf0\xd8\xa9\xb4\x93\x04\x67\x41\x3a\x99\x7b\x97\xa3\x62\xb5\x72\xa4\xb4\x4b\xc9\x40\x48\x7f\x18\xb2\x08\xce\x6a\xc5\xc6\x87\x16\xd3\xaf\x1b\xce\xf1\x70\x38\x3b\x5c\x4b\x5c\x47\xe4\x47\x37\x72\x6f\x93\x83\xbc\x4f\x14\x47\x68\xbf\x5c\xaf\xb4\xe9\xdf\xe3\x97\x61\xe6\xed\x47\x89\x71\xd1\xc7\x0e\x6d\xab\x2f\xd0\x49\x9d\xff\x92\x93\xb2\x39\xd1\x6c\x96\x02\x61\xc6\x82\x18\xb9\xf5\xb1\xbe\xe6\x90\xf0\xd2\x40\xc1\xb3\xdb\x71\x1f\x9e\x82\x1f\x08\x09\xbb\xeb\x9a\xaf\x24\x9c\xcb\x16\x8c\x67\xd9\x65\x56\x2d\x24\xf8\x48\x51\x61\x40\xbf\xd9\xfc\x05\x0d\x4f\x20\xda\x5a\x17\x94\x46\x8a\x9c\x07\x25\xea\x5c\x66\x9d\x5c\x63\x0d\x93\x10\xe5\x74\x51\x07\xda\xd3\x72\x61\xb5\xd9\x1e\x38\xe0\x85\x12\xe6\xf3\x73\xec\x5d\xca\xd5\xca\x09\x07\x29\x07\xc8\xfb\x7b\xf3\xb9\x26\xc3\x33\x94\x90\xb3\xf5\x1f\x76\x44\xe7\x3a\xe2\xec\x01\xd6\x1b\xe7\xc6\x52\x65\x36\xb4\xff\xd1\xab\x68\x49\xfe\x0c\x2f\x40\xd3\xbd\xa2\xa4\x9e\x55\x50\xb8\xdf\x97\x90\x81\xda\x85\x16\x8d\x0f\x71\x58\x2b\x90\x36\x77\x52\x6d\x1f\x1b\x15\x11\xe1\x38\xb6\x84\xfc\x46\xaa\xc8\xbd\x80\xc3\xde\xf7\xee\x81\x38\x19\x04\x61\x80\x7c\x55\x36\x12\x5c\xb0\xe2\xc3\xd0\x83\xa1\x87\xc7\x26\x9c\xb5\x31\xec\x36\x78\x78\x7b\x32\x55\x5c\xf0\x4a\xb0\x93\xc9\x00\x2e\x7d\x79\x2b\x4d\x93\x3f\x2e\x30\x70\xf3\x9a\xc8\xcc\xf8\xd5\xf5\x45\x5f\x12\x10\x9d\x8a\x8a\xeb\x4e\x21\x2f\xad\x4a\x70\xb1\x47\xc0\x4a\x7b\x91\x84\x60\xb1\x31\x63\x76\xe6\x40\x20\x85\x95\x17\xeb\x7e\xe3\x0c\x29\x0b\xe8\xb8\xd6\xf9\x67\x39\x15\x25\x6c\x3b\x04\xb9\xd9\x05\x4b\x52\x33\x8e\x0d\x36\x07\x85\xe4\x6a\x18\x28\x44\xc5\xc3\x76\x6a\xea\x8e\xd3\x11\xb2\xd4\x81\xc0\xb7\xb2\x11\x4e\x41\x8e\xd1\x7f\x8d\xeb\xf0\x1a\x83\xff\x37\x51\x70\x24\xee\x9e\x28\xe0\xc9\x0d\xce\x6d\x05\x9f\xfe\xe4\x13\xd2\x7c\xd6\x27\x83\xa8\xb8\xb5\x01\x6a\xd2\x76\xe3\x9d\xfd\x8f\x8f\x3d\xdf\xc4\x28\x10\x18\x18\xce\x50\x7f\x00\x3e\xb5\x8c\x9a\x5c\xc8\xb1\xaf\xf0\x5a\xab\x8f\x0d\x7f\x1d\x1f\x6d\x4b\x87\x1d\xbc\xed\x1f\x3d\x28\x66\x23\x97\x52\xfb\x13\xf6\xe1\x80\x34\xbb\x2b\x5a\x66\x35\xca\xa6\xec\xc4\x62\xe0\x58\xeb\xe2\xfa\x65\x1d\x3d\x0f\x36\xe2\x0a\x31\xf7\x65\xe4\xb9\x58\x27\x0b\xd8\x25\xc6\x81\x8a\xac\x1a\xd7\x56\x31\x35\xae\xed\xf1\x4a\x2b\x6d\x39\x8b\x6e\x34\x00\x84\x01\xb2\x18\x46\x18\x20\x07\x1c\x5a\xf7\x78\x46\xcb\x9c\x32\x81\x90\xc0\x61\xd5\xaa\x6e\x0e\xcd\xe7\xef\x58\x56\xb0\xe6\x81\x4f\x83\x3f\x70\x40\x96\xdf\x08\x25\xfa\x4b\x46\xdc\xda\xcf\xa2\x7c\xd8\x7b\xd7\xbf\xef\xf7\xf8\xca\xe1\x66\xa3\xa0\x4d\x43\x7c\x7b\xe7\x16\xc4\x90\x45\xc7\xbd\x3d\x13\x49\x62\x7c\x9c\xbd\x04\xc1\x5f\x00\xa6\x96\xe3\xcf\xfb\xb4\x5a\xf2\x91\x22\x62\x7e\x7e\xd3\x3b\x42\x49\x91\x3b\xec\x00\xf0\xe2\x8a\xa1\x12\x98\xcc\xe8\xb6\x49\x08\x1f\xe3\xb1\x69\xb4\xaa\xea\xca\x48\x5b\xda"}, +{{0xe8,0x30,0x6b,0xad,0xa6,0xd5,0x5e,0xb1,0x88,0xd9,0xf7,0x5c,0x81,0x5c,0xc9,0x14,0xe9,0x3c,0x9c,0x72,0x22,0x39,0x1c,0x15,0xbb,0xae,0xaf,0x93,0x54,0x43,0x79,0x35,},{0xbf,0x27,0x98,0xb8,0xe5,0x54,0xf5,0x1e,0x22,0x86,0xc3,0x03,0x4a,0x88,0xe5,0x77,0xff,0x23,0xfa,0x32,0xa6,0x72,0x44,0xea,0x82,0x45,0x91,0x2e,0x8b,0xf4,0x6d,0xa4,},{0xcc,0x66,0x27,0x30,0x8e,0x2f,0x42,0x43,0x83,0xfa,0x70,0x59,0x4f,0x57,0x57,0x91,0x60,0x05,0x40,0x02,0x7a,0x27,0x51,0x61,0x9b,0x28,0x3a,0xff,0xea,0xeb,0xc9,0xc9,0xd2,0x9a,0xc6,0xdb,0x28,0x6d,0xd2,0xc1,0xb5,0x96,0x58,0x7b,0x87,0x8d,0x1d,0xf4,0x78,0x1d,0x43,0x6b,0xb5,0x70,0xc1,0xc0,0xf0,0xd3,0x33,0x68,0xdc,0x66,0x52,0x0b,},"\xd7\x04\x38\x09\xc3\xe3\xdc\x00\xb1\x7e\xfd\x52\xc9\x13\x0b\x11\xb7\x86\xf1\xe2\x57\xb5\xe2\x2f\x81\xa7\xfa\xae\x60\x0b\xbc\xdf\xd5\x18\x53\x7f\xe8\x52\xc6\x42\x35\x97\x62\xfb\x75\xe8\xad\x85\x92\x49\xe6\xab\x49\xce\x1b\xb0\x4f\x24\x92\xf2\xaa\xc3\x54\x46\xba\x6e\xb0\x3e\x76\xde\x3a\xbd\x2d\x5f\xc7\xe6\x14\x68\x43\xad\xd0\x42\x86\x0a\x4a\x16\xb5\x9b\xdd\x7d\x03\x83\x78\xa3\x5e\x1a\x04\xb1\x21\x7a\x55\x71\x0d\x93\x7e\x2c\x90\x32\x23\x2e\xa2\xcd\xd1\xd2\x5a\x0b\xff\x71\xef\x5d\x3e\x0c\x05\x6b\x29\xcb\x92\xf6\xdf\x69\x2b\xde\x14\xdf\xa5\x0e\x13\x2b\xeb\xd8\x9e\x9f\x18\x33\x88\x0b\x65\x7a\x78\x1e\x94\xec\xb6\x03\x04\x17\x56\xe5\x51\x7d\x44\x23\xc5\x6f\xad\xc1\x3e\x2b\x31\x80\x88\xfe\xdd\xf3\xb5\xc8\x3c\x20\xb4\x6f\xdd\xbb\xa9\x23\x05\xe4\x86\x06\xda\xb7\x48\xce\x38\x48\xb8\x43\xf4\x71\x1f\x37\x0c\x3e\xc7\xd5\xe1\x9a\xb4\xc0\xac\x1a\xe1\x5a\xaa\xf2\x3d\x65\xfe\xce\xda\xbc\x08\x04\x9b\x9e\x29\x11\x3e\x57\x61\xed\x9d\x1c\x62\xeb\x07\x5c\xab\xb2\x67\x4c\xdb\xe1\xe3\xa8\x89\xba\xe4\xb1\xdd\x31\xb6\xa5\xb2\xea\x1b\x8d\xed\xcc\x3c\x51\x5e\xdc\x44\x67\xc3\x02\x31\x17\x6c\xd4\x4b\xec\x8a\x05\x79\x51\xab\x5c\xd3\x9a\x96\x23\xf8\xaf\x84\x73\xcd\x27\xd9\x33\x02\xbf\x8a\xa6\x24\xc9\xc3\xc5\x79\x9d\xa1\xdc\x49\x44\x94\xef\x8f\xf1\xdb\xe0\x18\x7e\xa5\x16\x26\x70\xb8\xd0\x98\xc3\xa9\x49\x19\x39\x8d\xad\xf7\x9e\x6c\x24\x91\xc4\x44\x39\x2c\x29\xcd\x50\xd5\x74\x35\x06\x32\x90\x84\x2b\xfa\x0e\x85\x30\xfa\xeb\xc0\x06\xd6\xea\x78\x01\x11\x7e\x0a\x3f\x01\x9e\xe2\x8f\xb3\x79\x22\x35\x40\x2e\x2f\x69\xb8\x7a\x43\xdc\x22\x7f\x9d\xe3\x16\x02\x97\x56\xc3\x16\x7d\x64\xa3\xa3\xf6\xd7\x31\x60\x33\x1d\x5a\x18\xee\xe5\xb0\xe6\xe2\x2a\x66\x3e\xfd\xcc\x8d\x67\xaf\x3b\xce\xd0\x41\xea\x84\x3a\x56\x41\x60\x3e\xc7\x2e\xfd\x64\x4e\x17\x3d\x19\x9a\x8c\x83\x0b\x2e\xa5\xfe\xc0\x37\x80\x27\xc3\x72\x25\xaf\xcb\x60\x4c\x4c\xdc\xf4\x09\xbe\x1c\x50\x9c\x9a\x37\x7b\xe0\xd0\x52\x41\x07\xc6\xd9\x2b\x5f\x09\xa2\x9e\xfb\x71\x09\x29\x56\x70\xbb\x1a\x1d\xd3\xea\x00\x8b\xb7\x91\x85\xf0\x9b\x98\xf0\x20\xc4\x3f\x14\x39\x68\x5b\x96\xf6\x19\x93\x11\xa0\x90\x87\x0f\x0d\x9b\x10\xd4\x95\xcd\x41\x0a\xa9\x5b\x7e\x53\x74\x9b\xe3\xa6\xc0\xfb\xc7\x29\xf9\x6c\xf8\x56\x43\x97\xb0\x9c\x13\x51\x40\x16\x82\x5f\x72\xf1\x4e\xb9\x32\x94\xd7\x01\x0a\xcc\xfd\x11\xf1\x7a\x6a\xc8\xf5\x44\x26\x3d\x60\x38\xd5\xc7\xdb\x29\x48\x62\x91\xb3\x0e\xa4\x9b\x6b\x54\xcf\x88\x82\x6d\xd2\x52\xcd\x9d\xbb\x57\xd8\x41\xb5\xa4\xcf\x70\x2a\x32\x64\xfa\xa4\xdc\xcc\x86\xab\x14\xda\xf1\x24\xef\x3d\x53\x35\xa6\x87\x8d\x06\x5c\x6b\xa2\x99\x91\x04\x57\x65\xee\x55\x42\xcc\x9f\x5d\x9f\x35\x4d\xcd\x2c\x6e\x0c\xf7\xff\x3a\x30\xf6\x49\xb5\x91\x2d\x97\x1d\x63\x35\x78\xf1\xe9\xf2\x63\x87\x4d\x05\x65\xc2\x47\x30\x1d\xcb\xd1\x5d\x76\x21\x1a\xe2\xd3\xd5\x06\xfc\x64\xde\xb7\xe0\x42\x56\x5d\x43\x8e\x2b\xfb\x24\x92\x43\xb7"}, +{{0x36,0x3c,0x1e,0xa7,0xc3,0x2e,0xa3,0x28,0xa0,0x55,0xaf,0x7b,0xd8,0xb3,0xbf,0xd2,0x04,0xfb,0x0b,0xbd,0x4b,0xf4,0x2f,0xfe,0x26,0x2f,0x3a,0x5e,0xbd,0x54,0xda,0x55,},{0x7a,0x83,0xec,0xca,0x51,0xef,0x6e,0x5a,0xa0,0x43,0xa5,0xce,0x04,0xd9,0x28,0x8a,0xdd,0x49,0xa2,0x77,0x54,0x8b,0xd3,0x01,0x6b,0x69,0x3f,0xfa,0x79,0xa2,0x2e,0xdc,},{0x5f,0xd1,0xe5,0xf9,0x92,0x2a,0x12,0xf6,0x36,0xb7,0x2a,0x7d,0x62,0x17,0x09,0x1f,0x94,0x8a,0x55,0xbc,0xb1,0x82,0x6b,0x8f,0xca,0xf9,0x9d,0x26,0x41,0x6c,0x7a,0xb1,0x35,0x1c,0x10,0xf4,0x09,0x3f,0xfd,0x8a,0x2a,0xf8,0x69,0x14,0xa0,0xa9,0x81,0x84,0xec,0x7e,0x06,0xd2,0xde,0xe8,0x7f,0xdc,0x0f,0x4a,0x47,0xf8,0xc6,0x3c,0xf5,0x01,},"\xc4\x1c\x1e\x1f\xb7\x59\x54\xa0\xae\x0e\xbc\x29\x09\x0b\x9f\xc5\x33\xe6\x93\xe7\xc7\x10\x5c\xfe\x40\xef\x52\x6e\x4e\x12\xa7\x40\x52\x21\xf2\x18\xc7\xac\x01\x9e\x1d\x4c\x92\xda\x28\x53\xf2\xd7\x26\xaa\x62\x27\x79\x24\xdf\x0c\x34\x3f\xc3\xd4\x7c\xd5\xa9\x9a\x3e\x27\x9b\x26\xa1\xb1\x3b\x1f\x2a\xa3\x6f\x7c\xcb\x4b\x54\xfb\xef\x18\xbd\x87\xa5\x5f\x1b\xc4\x0c\xe7\xb2\x02\x91\x45\xee\x7a\xab\x39\x17\x95\xac\x68\xde\x61\x99\xf5\x05\x94\xfc\x79\x61\x1b\x85\x13\x1c\x14\x30\x21\xf2\x6f\xa3\x58\xda\x0c\x7c\x6a\x65\xdd\xe0\x76\xda\xb4\x88\x67\x5b\x72\x23\x09\xe5\xed\x97\x46\xd1\x8a\x89\x30\x99\x06\xa7\xa9\xdf\x23\x7d\xd2\x7b\xd5\x90\xcc\xc7\x7c\x40\x2e\xf6\xe1\x9c\xa6\x3c\xc8\x6b\x85\x16\x03\x30\xee\x6e\x1f\x1f\x47\xa2\xff\x80\x7e\xef\xad\xc0\x09\x63\x52\x0a\x1c\x60\x0a\x3e\x45\xaa\x7f\xb2\x55\x4f\x47\xd8\x97\xbd\x86\xd8\x1c\x3b\x08\x77\x10\x12\x22\xfa\x78\x50\xb8\x0c\xe3\xbc\x06\xc9\xe5\x8c\x0c\x96\xe3\x2f\xec\x85\x30\xc9\xfa\x1e\x41\x63\xf0\xef\x84\x56\x95\x2b\xf6\xdd\x58\x04\x5a\x36\x3d\x61\x88\x0e\x9a\xc9\x76\xa3\x60\x3e\xf7\x7a\x4c\x39\x5e\x6a\x07\xe3\x42\xf6\x02\x3b\x8a\xf1\x02\x25\xcf\xf2\x40\xef\xc0\x36\x6a\x79\x9f\xd8\x6e\x9d\x06\x20\x60\xd8\x72\x40\x33\xbd\xf6\x75\x88\xcd\x73\xac\x28\x4d\xe4\xc6\x94\x3c\xf4\x5e\xe4\xf7\x5f\x59\x37\xd9\x7d\x78\x10\x5f\x0b\xbe\xce\x04\xd3\xdc\xb5\xe4\x24\xef\xf8\x9b\x77\x3e\x5d\x6b\x4f\x37\xef\xa9\xa0\x65\x4c\xb3\xef\x34\x52\x78\xa6\x2d\x87\x6c\xfe\xf9\xa3\xdc\xdc\xeb\x70\x81\x44\x18\x77\xeb\xd5\xfa\x30\xc9\xd9\x54\xe3\x68\x4f\xa4\x76\xa4\xf4\x85\xd4\x26\xfd\x3c\x8c\x32\xbe\xa0\xf9\xcc\x20\xb1\x5e\x8f\xdf\xc3\xca\x4b\x30\x2c\x07\x4f\x50\x81\x32\xd1\x5d\xe6\x25\xc1\x0a\xe0\x73\x78\x11\x46\x3d\xcc\x55\xfc\xc4\x01\x4b\x20\x20\x8f\xff\xce\xfa\x9d\xd4\x52\x11\x9b\x16\x52\xde\x41\x34\x8f\x69\xf2\xc4\x88\xf5\xcc\x18\x56\xd6\xe7\x8a\x5c\xbe\x3e\x37\x3d\xd4\x59\x8e\x2d\x39\xf8\x76\xeb\x94\xe0\xb0\x1b\x21\xfa\x91\x29\xef\x41\xb6\x39\xf4\xe0\x5e\x69\xde\xb1\x83\x5e\xd4\x4b\x91\x12\xa6\x86\x2a\x5b\xce\xa0\x72\xc6\xe1\xb8\xf0\xf0\x58\xf4\x6b\xac\x2a\x84\x5a\x58\x2d\x14\x8f\x17\x76\x0b\x9e\x0a\x2b\xa6\x0b\xbb\xf3\x88\x4a\xf9\x4d\xd4\xc7\xec\x9d\xb0\x8e\x9a\x5b\xcc\x6d\xde\x13\x46\x44\x2e\xe1\xf4\x70\x7d\x1f\x79\xb6\x9b\xa8\x67\xf4\x18\xdc\x27\x91\x73\xf7\x7a\xdb\xc5\x8a\xb8\x5e\xa3\x93\xb9\xdc\x68\x26\x19\x00\xc1\xca\xa8\x2d\x2f\x50\x47\x4c\x42\xae\xc9\x11\x31\x42\x78\xc0\xaf\xfa\x2a\x6b\x6c\x36\xd1\xff\x88\xf3\xb4\x9f\xb2\xb7\xc3\x39\xd2\xa7\xc2\xb3\x04\x9f\x8c\x0a\x08\xd1\x6a\x9e\x8d\xf9\x3d\x13\x0d\xa4\x84\xbd\xba\x6d\xbe\xc5\x34\xcd\x51\x09\x7a\x04\x82\x21\x10\x6b\xab\x48\xd6\x7f\x95\x1b\x75\x05\xa1\x48\x48\x92\xb8\x57\x79\xc5\xa3\x11\x17\x02\x12\x4d\x95\x7a\xcf\x2d\xc3\x52\xef\x9b\xa2\x47\xbc\x80\xe2\xce\x96\x26\x9c\xe8\x5e\x78\xb9\xeb\xda\x98\x90\x76\xdd\x5f\xf7\x3e\x1e\xb2\x75\xe5\xd7"}, +{{0xdb,0x22,0x28,0xff,0xff,0xa9,0xd2,0x53,0x4a,0xef,0x91,0x8f,0xb8,0x5b,0x82,0x1a,0xd3,0x60,0xe2,0xd3,0x9d,0xec,0x5a,0xeb,0x2d,0xb0,0xdf,0x02,0x49,0x7f,0x94,0x16,},{0x6d,0x01,0x95,0x77,0x7f,0x81,0x05,0xff,0x52,0x3b,0x79,0xc5,0x9e,0x3c,0x30,0x81,0xfe,0x89,0xdb,0x6f,0x87,0x03,0x3f,0x09,0x4f,0xa5,0xa9,0x40,0xce,0xf8,0x4b,0xb4,},{0x82,0x18,0x9d,0x34,0x0b,0xc1,0x1c,0xea,0xa4,0x00,0x41,0x0e,0x08,0xba,0xe9,0xd9,0x01,0xaf,0x05,0x91,0x25,0xe9,0x53,0x78,0x6f,0x8a,0x04,0x3d,0xdf,0x11,0xf7,0xb2,0xf8,0xe3,0xb6,0x17,0xac,0xcd,0x78,0xe2,0x93,0x9a,0xdf,0xab,0xf2,0xd2,0x47,0x1f,0xaf,0xd6,0xf5,0xbc,0x45,0xb1,0x40,0x75,0xb3,0x28,0xe3,0x4d,0x80,0x75,0xb2,0x07,},"\xfc\x07\xcd\x99\x04\x0f\x13\xe5\xa8\x4f\x94\x74\x6d\x6b\xb8\x68\xf7\x52\xb4\x48\xb6\x2d\x99\x59\x3e\xf2\x9e\x43\xcc\x82\x45\xf0\x47\x0f\x65\x55\x2d\x64\x32\x20\xf6\x71\x92\x85\xe1\x5c\x37\xa6\xd1\x74\xae\xf7\x60\x88\xcc\xda\x5f\x88\x68\x5b\x52\xda\xe2\x84\xc6\x5b\x38\x0d\xa3\x45\xa2\xe1\xaf\x2e\xd7\x64\x80\xd2\x69\xcb\x93\x4b\x43\x17\x62\x0b\x79\x2e\xbb\x39\xb2\xa6\x78\x24\x7d\x6d\x81\x5f\x2a\x5c\xb9\xaa\x56\x0e\x4b\xf6\xde\xba\x4c\x0a\x0d\xdc\x82\xd0\xe5\xa5\xa6\x5a\xcb\xc4\x78\xe1\xec\x6b\x06\x4d\x7b\xb7\x38\x8a\x73\xf6\xed\xa3\x0b\x0b\x6b\x73\xdd\x8f\x87\x92\x63\xad\x1a\x03\x48\x67\x1d\xcf\x21\x1c\xb9\x6e\xd0\x8e\xd5\x2f\x33\x17\xda\x68\x18\x5d\x6b\xb2\x58\x9d\xc1\x1d\x75\x5d\x47\xa3\xb6\xf6\xa0\x38\x6a\x85\x94\xd9\x57\x0b\x2e\x9b\x0d\x4b\x5e\x13\xdc\xcd\x9b\xb7\xac\xbe\xf0\xab\x27\x6a\x7a\xeb\xe1\x29\x31\xbe\x67\xf1\x0d\xe2\x67\xa0\x29\x89\x53\x01\xf5\x66\x25\x30\xad\x8a\xb3\xd2\x30\xb3\xb6\xd7\x09\x3a\xcd\xfb\xf2\x74\x75\x7a\x90\x78\xe2\x0c\x23\xbc\x82\x2d\xef\xfa\x61\x00\x54\x86\x10\x2c\x01\xab\x82\xbd\xc8\xcd\xcf\x1b\xb3\x7f\x9b\x56\xd3\x9e\x50\xfd\x5a\x68\x95\x41\x6e\x76\x7f\x4e\x36\xc1\xa4\x17\x78\x90\x81\x25\xb5\xca\x3f\x92\xa9\x0d\xa9\xad\xdf\xf1\x55\xfb\x1f\xd7\x76\x88\x08\xa8\x0f\x20\x3e\xd7\x37\xef\x00\x77\x63\xbd\x2f\xea\x9f\xf2\x8c\x84\xb4\x35\x51\xc9\xfc\x43\x8f\xfc\x47\xfc\xfc\xf6\x4d\xc7\x70\x06\x13\xaa\x8b\x3a\xf8\x63\x3a\xe8\xb6\x98\x74\x37\xc0\xaa\x47\x81\xbe\x1e\x82\x13\x96\xc5\x36\xcb\x30\x05\xd0\x55\x49\xb1\xcb\xa7\x01\x35\xaf\xb7\xfe\x30\x68\x96\x1c\xad\x3a\x14\x63\xcc\x0b\x55\x60\x68\x4e\x27\xbb\xa7\x7a\xef\x41\x9d\x82\x38\x68\xe0\xce\xba\xd1\xf1\xce\x0a\xe9\x02\x74\x4a\x15\x2d\xd2\x94\x51\xa1\x7e\x28\xa8\x9a\x71\x58\xa1\x83\x6e\xfc\xe4\xa3\xe5\xc7\xd1\xfa\xa4\xc3\x87\x5b\xc4\x6c\x4d\x9b\xe2\x2d\x66\xd3\x66\xac\x6f\x59\x53\x8a\x00\xb2\x75\xb0\x2f\xac\x6d\xa7\x55\xa8\x54\x08\x19\x97\xd5\xd1\xd0\xe6\xe5\x68\xa5\x95\x8c\xf3\x34\xc5\x18\xcd\x51\x7a\xb9\xd7\x3c\x48\xd6\xcb\xc4\xae\x4e\xea\x43\x53\x11\x3e\x7e\x4a\x7c\x05\x92\x0e\x68\x6b\xf0\x7a\xfb\xfb\x8d\xd2\xec\x4f\x18\xfa\x71\x38\xe5\x7d\x33\x2c\xd7\xa4\x22\x8f\xea\x73\xbc\x09\x25\x2f\x24\x42\x72\x94\xeb\xd3\x64\x5e\xe0\x99\x6c\x2e\x85\x1a\x8a\xa5\x1a\x7c\xd9\xfc\x2e\xab\x47\xc0\xab\x21\x3f\x4f\x51\xd2\x16\x09\x1e\xd0\x89\xe4\x59\x2e\x9b\xb0\x82\x8b\x85\x8f\x84\xf6\x0b\x93\xad\x84\xa0\xa2\x28\x27\xcb\xd2\x74\x14\xb7\x81\x32\x2a\x04\xd3\x96\x08\x28\xf6\x38\xdf\x28\x34\xc7\xf7\x83\x9d\x70\xdb\x12\x6b\xee\x5a\xf2\xee\x75\x59\xa8\xac\x4c\x01\xa6\xc3\x91\x39\x6a\xf9\x3f\xa0\x60\x89\x40\x29\x7d\xdf\x89\x00\xc5\xdd\xb4\x66\x34\x0a\xe5\x1c\x60\xc7\xea\xd7\x62\x44\x7e\x76\xd8\xbc\xcb\x57\x39\x97\xcf\x66\x14\xd1\x88\xa0\xb9\xa2\xf5\x6e\xed\x9b\x0f\x9d\x46\x3a\x19\x78\x7f\x40\x92\x58\x1a\x65\xc6\xbf\x78\x1b\x93\xc5\x60\x87\xe5\x4e\xe1\x34\x3a\xab"}, +{{0x66,0xb5,0x0f,0x69,0x2e,0x39,0x5e,0xb8,0x33,0x86,0xe0,0x27,0xc8,0x2c,0xe3,0xfd,0xee,0x3b,0xd8,0x99,0xb0,0xd3,0x17,0x9d,0xb0,0x86,0xfb,0xf5,0x24,0xf5,0x74,0x59,},{0x44,0x85,0x36,0xe9,0x82,0x40,0x84,0x37,0xce,0x89,0x67,0x40,0x53,0xe3,0xc5,0x89,0xc9,0x8c,0x09,0x5c,0x60,0x02,0x1a,0x11,0x81,0x78,0xc6,0x26,0x1d,0x88,0x10,0xfe,},{0xbd,0x13,0xf6,0x36,0x2c,0x07,0x07,0x89,0x22,0xf3,0x0c,0x63,0x30,0x75,0x1b,0xf6,0xe7,0xcf,0x42,0xa7,0x69,0x16,0xee,0x65,0x3e,0xb1,0x7a,0xcc,0xff,0x1f,0xbb,0xca,0x35,0x25,0x8c,0x4c,0xbc,0x58,0x2a,0x5e,0x8c,0xc9,0x4f,0xd2,0xc7,0xed,0xeb,0x53,0x76,0x2f,0x1f,0xc2,0x31,0x23,0xd7,0xf4,0xf1,0x45,0x40,0x9b,0x31,0xcd,0x38,0x02,},"\x74\x28\xa9\x64\x21\x2b\xcb\xe8\xdf\x7d\x59\xe4\x8e\x92\x34\x80\xaa\x0e\xe0\x9b\x91\x0d\x04\xef\xb6\x90\x36\x62\xef\xc3\x10\x7a\xc8\xfd\xc0\xc5\xf3\x92\x72\x74\x0c\xd8\x77\xe1\x6c\xd7\x1c\x54\x92\x38\xc3\x37\x22\x0c\xe2\xf6\xb5\xa1\xfc\x6f\x7b\x0a\x1c\xd4\xed\x21\xd9\x38\x89\x08\x1e\x34\xfb\x7f\xde\xcf\x41\x78\xbb\xd4\x31\xe6\x11\xe5\x39\xd9\x00\xc3\xd0\xac\x3d\xc7\x10\x7b\x36\xb4\x1d\x6d\x0d\x5d\x32\xc1\x97\x27\xf9\x08\xb6\xeb\x36\x7f\xeb\xb3\x52\xa4\x93\x58\x1f\xf1\x28\xb5\x6c\x4c\xaf\x6f\xb8\xe0\x99\x81\xf0\xd3\x79\x57\xd1\x28\x20\x17\xfb\xb8\x07\x61\x4c\x20\xf4\x65\xdc\x02\xb0\xcd\x96\x99\x83\xbd\x5a\xe1\xeb\xf6\x57\x8d\x7f\xf3\xce\xff\x32\x0e\x25\x56\x21\x99\xde\xe9\x34\x75\x7c\xc1\xf5\x8d\x55\x40\xc4\x1a\xac\x1c\xe4\xf2\x11\xf0\xb8\xec\x41\x07\x17\x40\x30\xe7\x02\xbc\x6a\x8a\x9c\x85\xc5\x05\xc9\x31\x6a\xef\xea\x3e\x43\x72\x24\x2d\xe0\x19\xb3\x5e\x2b\xd3\xc5\xa9\x56\x52\x19\x71\xc1\x06\xa3\xad\xbb\xc1\x3c\xdc\x4f\x7f\x9d\x3c\x58\xb9\x6a\x34\x4b\x4a\xc3\xef\x6b\xd8\xac\xa6\xed\x98\x76\xb4\x3e\x64\x97\xfa\xf7\xfa\x4c\xf2\x7f\xbc\xb6\x65\x73\x0c\x09\x1e\x13\xaa\xf7\xe9\xef\xe7\xdd\x10\xe1\x4e\xb1\x9a\x92\x00\x42\x42\x10\xec\x8b\x8f\xba\x7e\x69\x44\x4c\xe1\xa9\xe3\xa7\xb2\x6c\x11\xf6\xb7\x14\x5b\x69\x83\xa7\x80\x57\x76\x48\x40\x31\xbf\xf5\x2e\x81\xae\x76\x9b\x70\xa2\x82\xb0\x94\xff\xb5\xfb\x55\x25\xdc\x1a\x87\x2e\x20\x7e\x82\x7a\x2e\x11\xf4\xec\xf7\xb5\x30\x8c\x74\x8a\x92\x78\xea\x7b\xd6\x61\x88\x19\x44\x00\x43\x0c\x8c\xd5\x96\xeb\xb8\x72\x21\xe5\x36\xf6\xaf\xe1\xf1\x50\x5d\x6a\x59\xf4\x1d\x16\xa2\xf0\x14\xe1\xcf\xa5\x13\xf7\xa6\x97\x31\xd7\xbf\xdb\x2a\xff\xce\xfe\x05\x37\xd4\x2c\x79\x6e\x3f\xd2\x7e\x41\xb7\xca\x72\x05\x1b\xef\x28\xbb\x7b\xde\x70\x10\xdc\xfe\xd8\xaa\x16\xef\x67\x6d\xb6\xe5\x20\xc3\xce\xf8\xd6\xf5\x8a\x9a\x28\x13\xcf\xf0\xf7\x04\x1f\x87\xfb\xfb\x84\x31\xe0\x20\xed\xe1\xd4\xea\xf1\x9e\x23\xb9\x83\x44\x5c\x59\x15\xb5\x4a\xdf\xb5\x57\xfc\x20\xd0\x05\x8f\x40\xf5\xe0\x98\x25\xdb\xa8\xd8\xf2\x0c\x00\xf4\x3b\x3a\xee\xbb\x61\x57\xbe\x32\xec\x54\x62\x7d\x5d\x42\xab\x81\x3c\xf9\x7f\x09\x5d\x26\xdb\x80\x36\xc1\x2e\x82\xcb\x96\x3e\x80\x01\x16\x7e\x61\xab\x39\x3b\x4c\xca\x75\x5e\xce\xa8\x69\x95\x4e\x32\x3f\xa5\x26\x2c\x5f\xda\x3e\x0b\xe9\xa5\x1e\x5a\xf5\x1f\xa6\x44\x48\x24\xfb\x83\x7c\xc6\x7b\xe5\x37\xa8\x75\x69\xc3\x0c\xf0\x11\x4d\x39\xa0\x39\x42\xde\x4e\x1c\xd5\x23\x35\x5d\xab\x1a\xf3\x60\x80\xa9\xa9\xa5\x48\xbe\x1c\x2a\x7f\xbe\x54\x33\x77\x23\x15\xd2\x83\xe5\x15\x6d\xf6\x48\xbe\xe4\xb7\xdc\xda\x74\xf1\x59\x05\xd5\x42\xbe\x54\x87\x3c\x15\xc5\x3f\xf4\x2a\xca\xbf\x8c\x56\xf2\x57\xd7\x64\x72\x2d\xb4\xe9\xc7\x18\xe1\x20\x98\xa3\x45\x74\x86\xa6\xc9\x47\xac\x2d\xe0\xaf\x53\xe8\x2c\xf9\x50\xbb\x37\xca\x29\xc8\xda\xdf\xa3\x64\x6d\xb4\x98\x2a\xf5\x72\xd3\x9b\x26\x8c\x7f\x96\xb0\x3e\xf6\xb6\x53\xc8\x79\x45\xf2\x9b\xc5"}, +{{0x55,0x32,0x8b,0xe4,0xb3,0x70,0x82,0x27,0x33,0xff,0x39,0x89,0xa6,0xa3,0x28,0x2d,0x65,0xfe,0x8f,0x20,0x7a,0xb7,0x27,0x0d,0x7c,0x2e,0x72,0x7c,0xa3,0xcf,0xaa,0xc4,},{0x51,0x8e,0x02,0xee,0xf5,0x2f,0x5a,0xae,0xbd,0xe3,0xd1,0x08,0xea,0x79,0xec,0xad,0xfc,0x4d,0x99,0x4c,0xe1,0x95,0x36,0x21,0xe5,0x4b,0x7b,0x3b,0x12,0x1f,0xf8,0xff,},{0xf5,0x8d,0xb1,0x9f,0xd8,0x34,0xe1,0x51,0x94,0xc3,0xc0,0xf8,0xa6,0xa5,0x0e,0xbc,0x4c,0xf0,0x74,0xe8,0x0e,0xa2,0xe7,0x0c,0xda,0xf1,0xe1,0x69,0xbd,0x51,0xeb,0xd0,0x99,0x0b,0xad,0x77,0xc4,0xfa,0x20,0x8b,0x8d,0xd1,0xe2,0xc8,0x57,0x4c,0x01,0xb5,0xf5,0x96,0xc8,0xdf,0xa6,0xbb,0x8e,0x6a,0xe3,0xa4,0x7f,0xf4,0x12,0xe7,0xe2,0x09,},"\x6c\x24\xc9\xaf\xbb\xf1\x2d\xca\xee\x6f\x10\xe4\x08\x92\x52\xf2\xc6\x0b\x2a\xb9\x3a\x02\xc1\x60\x2f\xb5\xde\x4c\xe3\xbd\x92\x3e\xb0\x2f\xe1\x03\x9f\xdc\x15\x99\x6a\x44\x69\x15\xe7\x67\xde\xe0\x17\x6d\xdd\xb7\x8e\x9d\x6b\xbf\x06\x96\x75\x77\x5a\x82\x9d\xd8\x08\xd3\x76\xb0\xcf\x79\x20\xbf\x1a\x66\xe1\x30\x3b\xa5\x24\x19\x78\x5f\x25\xf2\x8b\xb3\x38\x99\xeb\xde\x84\x0c\x0a\xb1\x4b\x91\x9a\x65\x80\xcb\xaa\xc3\xa8\x05\x62\x7b\x9c\x4a\x77\xba\xa1\x6f\x82\x5a\x9e\xac\x2d\x6d\x36\x41\x65\x14\x93\x37\x0e\x50\xee\xe9\x4c\x74\x04\x97\x64\x36\x56\x05\xab\x4d\xac\x1a\x03\x02\x27\xa3\x30\xaa\x17\x8f\x2f\x8d\xa3\x77\xaf\x73\xf0\xbb\x04\x0b\xac\x12\x36\x6e\x65\xe0\x59\x10\x55\xf9\xf2\x3e\xac\xa3\x5e\x96\x88\xd8\x37\xa3\xc0\xd9\x9c\x16\x8f\xd8\x86\xac\xc9\x22\xcf\x37\xa7\x11\x8e\xf8\xa4\x4b\xb0\xa4\xfa\x42\x88\x04\x93\x09\xa7\xdc\x1b\xed\x80\x62\x1e\x10\x63\xe3\xe5\x92\xc0\xfb\xa4\x2d\x73\x98\xeb\x15\xf7\x40\x28\xac\x15\xd7\xed\x65\xa6\x36\x8a\x13\xb7\xf9\x56\xd1\x95\x47\xeb\x50\x6c\xe7\xec\x90\x73\x4e\xb9\x49\xcf\xf1\xd9\x8c\xe4\x14\xf1\x0a\xdc\xba\x8c\x00\x73\x20\x01\x87\x50\xa7\x1b\xd3\x6d\x3b\x6b\xfd\x61\x27\x05\x45\x08\xe3\xef\x65\xd9\x98\x48\x51\x4d\x33\xd6\x8b\x58\xe3\xa4\xb2\x24\xf7\x9b\x6e\x34\xdd\x48\x03\x40\x46\x7f\xe7\xf0\x25\xcc\x88\x21\x3d\x80\x8f\xbb\x5b\x91\xe2\xe4\x3c\xf9\xd9\x50\x64\x07\x98\x65\x92\x73\xd4\x7a\x25\xf1\xf0\x13\x2f\x68\x82\xfa\xad\xba\xfb\xa2\x8f\xee\x5f\xa1\x72\x72\xc1\xa9\x00\x11\x72\xb3\xab\x6f\xf2\xc3\x15\xf2\x6c\x07\x73\x44\x05\xb5\xee\x8b\x5e\x4f\x08\xe1\xe3\xb8\xae\xa0\x19\x46\x7f\xb0\x71\x88\x7f\x19\x19\x01\xa2\x1c\x59\x76\xc1\xca\x8a\xaf\x0a\x1d\x4a\x2e\x69\x8e\x76\x23\xe9\xbb\xe9\xca\x2a\x67\xa1\x53\xa1\x6f\x89\x5e\x6d\xd9\xea\x92\x44\x41\xb4\xbd\x0b\x67\x45\x52\xe3\x98\xb8\xd9\x70\x34\x3a\x9b\xc7\x76\xa3\xa3\xfc\x1a\x86\x60\xc5\x62\x5d\x60\x81\xb5\xd8\x7f\x0f\x8a\xc9\xf0\x7a\xb5\xab\xe7\x7c\xdb\x8e\x30\xd2\xfd\x1f\x6f\x46\x52\x5c\x75\xdd\x0d\xd1\xca\x32\x81\xcc\x89\x34\x6f\xb3\xe6\xd7\x38\x8e\xbe\xe1\x54\xcb\x59\xbd\x9e\x95\xed\x6a\x41\xd5\xdf\x66\x8b\x59\xea\x13\x78\x68\xeb\x12\x0b\x8a\x2c\xfd\xf4\x67\x44\x14\xfd\x27\x96\x99\xf2\x8b\x5a\x5c\xcc\x2e\x2f\xc8\x02\xa4\xc9\xe0\xb8\x5b\x76\xf2\x0f\x6b\xce\x2a\x49\x54\x88\x6f\xc4\x02\x67\x0a\x71\xef\xd2\x61\xf5\xdd\x7b\xca\x16\x88\x4a\x28\x7c\x62\x2f\xd4\x45\xf6\x8d\x44\x15\x1c\xc0\x13\x4b\x22\x9d\xa3\x8d\xaa\xab\x81\xb5\xc9\x60\xd5\x77\x00\xca\x92\xb2\x6d\x0b\x14\x21\x34\xce\x94\xb7\xbe\x6c\x18\x61\x0e\xa2\x13\x6f\x8b\xa8\x32\x9a\x2e\x8c\x00\x0b\x8f\x02\xfe\x05\xbc\xf7\x2c\xb7\x1f\x8c\x72\x53\x5f\xfc\xd8\x18\xe3\x8e\x79\x92\xa8\xf0\xc3\x2a\xc6\x21\x77\xd1\x52\x2a\xe5\x52\xc6\x0c\x1e\xe6\x16\xb7\x5e\x4b\x34\x42\xe7\x96\x57\xe4\xa3\x33\xc0\xb3\xd7\x44\xea\xf2\x60\xd0\xc3\x36\x93\x16\x86\xa6\xd6\x68\xc6\x4f\xef\x44\x00\x52\x35\x2c\x2b\x25\x8c\xfb\x65"}, +{{0x7d,0xa0,0x5f,0x04,0xe5,0xd3,0x8b,0x98,0x9b,0x83,0xf7,0x2f,0x7a,0xb2,0x6c,0x13,0x87,0x76,0x75,0x8f,0x4f,0x57,0x7e,0x49,0xdc,0x73,0xd6,0x01,0x3f,0xf4,0x37,0x59,},{0xb1,0xde,0x51,0x67,0xf4,0xd3,0x30,0x80,0x4e,0xec,0x9e,0xb5,0x65,0xef,0x40,0x55,0xf1,0xb6,0x4d,0xd9,0x5e,0x1c,0x9b,0x27,0xc6,0x7f,0xfe,0xf9,0x14,0x82,0xcc,0xa8,},{0x05,0xf1,0x17,0xf9,0xbc,0x3e,0xa5,0x5d,0x45,0x5e,0x9e,0xf1,0x35,0xe9,0x2e,0x76,0x65,0xd1,0x80,0x70,0xd8,0xf5,0xe3,0x75,0xdf,0x67,0xbe,0x18,0x17,0xce,0x14,0x35,0x7a,0x55,0xe7,0x01,0x66,0xf3,0x26,0xb7,0x7d,0x85,0x24,0x32,0x27,0xcf,0x67,0xd8,0xf2,0xe0,0xbf,0x84,0x40,0xca,0xbf,0xb0,0x52,0x75,0xb3,0x73,0xf1,0xe1,0x19,0x0e,},"\xa6\xa8\x61\xd8\x94\x7c\x5c\xd6\xad\x08\x19\x60\x2e\x32\xea\x76\x81\xc8\xf7\x30\x10\xee\xe5\x53\xe5\xde\xfb\xf7\x98\x20\x98\xb5\xf7\xb3\x99\x24\xbb\x79\x59\xad\x64\xc3\x03\x26\xbe\xd5\x60\xbf\x51\xe9\x98\x3c\xda\x5d\xff\x4f\x31\x1e\xea\x24\xcb\xe6\x8c\x61\x06\xce\xac\x9b\x84\x3a\xa4\xe2\xad\x1b\x6f\x8a\xe1\xe4\xf9\x68\x71\xfc\x02\x5b\xe4\xa6\x16\x38\x5f\xf2\xd4\xb7\xf5\x68\x29\xab\xef\xaf\x6a\xac\xbb\x78\x0d\x6c\xbb\xc9\x51\xb6\xe0\x5a\x78\x7f\x88\x5e\x33\x25\x61\x16\x65\xec\xc9\x24\x27\x4a\xa5\x31\xbc\x13\x3f\x62\xc7\x6c\xb3\xad\x14\x8f\x3c\x95\x79\xa8\x15\xa1\x42\x00\xb7\x64\x8d\xae\x0b\x07\xb3\x27\xd3\xbf\xcc\xdb\x6f\xe3\xb6\xcb\xd7\x0e\xa6\x5e\x6c\x0c\xc2\x51\x6a\x89\x66\x96\xd0\x7b\x2e\x77\x71\x3b\x0b\xee\x3b\x92\xfb\x1b\x6f\x75\xb0\x82\x0a\x5c\xb6\x2c\x5f\xe6\x20\x40\x03\x94\x3e\x24\x85\x71\x66\xfb\xdf\x57\x1f\x11\x5d\x45\xf4\x2e\x75\x90\x1d\xf8\xb1\x2c\x32\x61\x8a\xac\xb0\xd2\x42\x86\xc8\xd3\x03\x96\x05\x1f\xc2\x72\xaa\x17\xf4\xd2\xd4\x74\x61\x15\x2a\xac\xd3\xfa\xa2\xb7\xb2\x08\x31\x22\x78\xe8\x09\x24\x05\x92\xd1\xd1\xaa\x58\x5c\x56\x28\x0e\x66\xff\xd9\x2b\x57\x17\xd0\xcd\x1e\xb9\xfb\x74\x01\xde\xf8\x79\x48\x7c\x37\x4e\x5c\x53\x0b\x6f\xeb\xf9\x11\x12\x25\x74\xd2\x4f\xe1\x04\xb4\xf4\x5c\x7c\x60\x1e\x6c\x91\x7d\x3c\x18\x82\xc1\xad\x3c\x55\x5d\x8f\x2c\xe9\x55\xb5\xa1\x0d\xb0\xd5\xa8\xb8\xac\x7a\x62\x66\xb2\xe6\xb2\x7a\xd0\xee\x34\xf4\x7a\xd8\x57\x36\x7d\x52\xf7\x09\x6d\x4b\xac\xef\x0e\x46\x72\x54\x88\x42\x4b\x93\xb8\x9a\xcd\x42\x9f\xfb\x5e\xf3\x3a\x0b\x08\x1d\xd0\x94\x79\x67\x91\x96\x02\x3c\x39\x67\xf4\x4a\xd4\x1e\xb1\xa2\x39\x55\x27\xfd\x3b\x79\x76\x8f\x1b\x88\x5f\x04\x29\xb4\x95\xab\x60\x52\x56\x91\xbe\x84\x65\x06\x32\xa2\xf6\x6c\xb6\x3a\xd5\xbf\x2f\x6a\xe7\x0b\x66\x8c\x5a\x19\x3f\x74\x99\xfc\x4f\xc4\x2c\xf8\xcb\x30\x8c\xe5\x02\x9a\x50\x27\xba\xbe\xf5\x5d\x19\x25\xec\xfb\xa9\xf2\x7e\xb6\x08\x16\x19\xed\x0d\xf8\x56\x9f\xd8\x0e\x9d\xa1\x04\xdb\x39\xb5\xb8\x14\x0b\xfe\xbe\xbd\x29\x08\x54\x40\x06\x58\x19\xde\xba\x8d\x46\x9a\xe8\xb3\xea\x6d\x3b\xac\x58\x91\xf9\xa4\xdd\xfb\x7f\x1f\x06\xd1\x3c\x31\xa0\x7e\xe5\x3f\xb5\x4b\xc9\x7b\xd0\x86\x96\x39\x4c\x38\xe7\xf3\x68\x0c\x0f\x02\xf9\x75\xf4\x69\x92\x11\x47\xa4\x09\x85\x90\x97\x81\x3b\x4c\x3f\xa4\x3d\x17\x4a\xc4\x02\xf1\xa5\x28\xcb\x5f\xc4\xb8\x07\x51\x84\x32\xef\xf3\x34\x07\xa1\x11\xca\x3a\x3d\x7e\x9e\x84\x13\x5a\xba\xc8\xa8\xf5\x2e\xa6\x31\xc8\x6d\x74\xa1\xc6\xe5\x74\x9e\xdd\x14\x91\xc0\x02\x4e\x7d\xe7\xfe\x52\x85\x68\x29\xb7\x2f\xd1\x3d\xa6\x3a\x1a\x23\x43\x34\x9d\xf6\x62\xab\x31\x63\x53\x60\x32\x34\x6e\x53\x47\xf0\x43\xff\xf5\x28\xbf\x67\x15\x09\x22\xff\xf2\x02\x6b\xab\x74\x2d\xb9\xca\xe7\xcb\x2e\x3c\x74\x58\x07\x19\x65\x2c\x28\x44\x7c\x5e\x20\x98\x23\x17\x97\xee\x6e\xf1\x23\x1f\x57\x92\x05\x4b\xc3\x35\x9a\x32\xc8\x6d\x2f\x94\xf8\x5f\xa7\xd4\xa7\x41\x9d\xd2\x41\xff\x66\x2a"}, +{{0x1b,0x8e,0xc6,0x58,0x80,0xed,0xbf,0x03,0x9a,0x13,0xe9,0x70,0xb1,0x5a,0xa6,0x7e,0x19,0x2a,0xa0,0x2c,0xa6,0x5c,0xff,0x9a,0xda,0x17,0xd4,0x55,0x8f,0x40,0x13,0x7d,},{0x12,0xc1,0x19,0x1e,0x4d,0xe3,0xbd,0x44,0xd0,0x39,0x07,0x01,0x53,0xad,0xb7,0xb5,0x81,0xf6,0x00,0xe9,0xa1,0xdd,0x69,0xaa,0x89,0xf2,0x77,0xc7,0x06,0x9e,0x76,0xf8,},{0xbf,0xf2,0x69,0xa3,0x5d,0x6c,0x8e,0x55,0x2c,0xe7,0x16,0xd1,0x63,0x81,0x81,0xce,0x85,0x83,0xb4,0x5c,0x0e,0xc5,0x93,0xb4,0xe5,0x8c,0x40,0xac,0x76,0xe7,0xf8,0x5c,0xa1,0xda,0xff,0xfd,0x68,0x54,0x1e,0x62,0x3a,0x1e,0x35,0xa7,0xc0,0x97,0x26,0x88,0xb2,0x5e,0xed,0x72,0xf4,0xda,0x57,0xec,0xa1,0x68,0x57,0xa8,0x26,0x3c,0xaa,0x0b,},"\x37\xf1\x8b\x7f\x64\xc5\x13\x34\x79\xd6\xda\xe3\xbe\xf6\x79\xcd\xc2\x1e\xce\x3f\x5b\x57\x9a\x6a\x9c\x3f\xa2\xe5\x9e\x9b\xe8\x7d\x20\x09\xf7\x4e\x1c\xfd\xac\xcb\x1c\xe3\x7d\x00\x70\x23\x69\xbd\x16\x9d\x94\xfd\xcf\x85\xaf\x9f\xa3\x21\x7d\x27\xe6\xed\x6d\x1d\x8e\x5d\xf7\x61\x5e\x8e\x37\xea\x55\xde\x1f\xd0\xb0\x6d\x77\xb4\xc8\x3b\x92\x9d\x80\x58\x6f\xa0\x69\x4b\xe7\x2e\xc8\xb3\x65\xad\x2c\xbc\xdd\x2b\x1a\xd8\xcf\x7f\x03\x6d\xfa\x4d\xaa\x1a\x90\x36\xcd\xb1\x20\x43\x22\x27\xb1\xf0\x7b\x88\x66\xb1\x22\x12\x03\x09\xeb\x91\x4a\xb8\x4c\xdd\xeb\xa1\xde\xc4\x8a\xb9\x26\x36\x72\x85\x88\xfe\xdb\x3a\xaa\xd7\xe7\xdb\xb2\xac\x30\xe6\x3c\x6f\x5f\x90\xfc\x6c\xe6\x2d\x6d\x3b\xd8\x8b\x0d\x5a\xac\xfa\x61\xde\x9f\x32\x67\xb3\x00\x91\x7b\x57\xa4\x80\x36\xab\x20\xc9\xa0\x54\x46\xb8\x76\x74\x94\xaf\x24\x9e\x7d\xe7\xbc\x50\x7a\x22\x07\xcc\x95\x6f\x71\x84\x55\x5a\x7d\x5d\x88\x83\xbb\x4b\x3e\x93\xf2\xdc\xfc\x57\xb0\xda\x86\x38\x65\x8d\xcd\xce\x88\x5d\x44\xd9\xcc\x68\xb1\xd8\x17\x0a\x36\x77\xcc\x5e\x50\xcb\xf3\x3d\x54\x3e\xba\xe4\x47\x7d\x92\x39\xcf\x83\x38\x4e\xc5\x9b\x42\x33\xe8\xff\x33\x43\xf0\x6f\x30\x18\x77\x72\x9a\x53\xd4\x20\xbf\x01\xc6\x2e\x66\xab\x7f\xe5\x5d\xd8\x7e\xe8\x23\xa5\x8f\xcb\x87\x87\x0e\x1f\x52\xe8\x79\x17\x7c\xd4\x39\xc5\x33\xf5\xa2\x23\xe5\xa3\x43\x6f\xe9\xd6\x42\x65\x48\xda\xcf\xc8\x6a\x08\x46\xd3\xed\x23\xac\x04\x25\x63\xe8\x87\xff\x46\xaa\xd0\x05\xf4\xe1\xde\xe3\xee\x0e\xe4\xc2\x7a\x72\x51\x70\x9a\xe4\x0a\xbc\x5e\x25\x68\x64\xe4\x78\x5a\x4e\xdd\x8b\x2a\xdf\x1b\xc5\xb4\x01\x8e\x28\xd0\xb1\x75\x86\x7b\x02\xd0\x52\xa6\xe1\x7e\x41\x1a\x3d\x8b\xeb\x2a\x42\x08\xb7\x6c\xc6\x21\xfd\x18\xbe\x14\x8e\x23\x5d\x55\xaa\x71\x27\x70\x65\x57\xde\xc0\x53\xa1\x3f\x1a\x47\xdf\xda\x40\x5b\x3f\xe5\xbd\x28\xef\x5d\x34\x86\x19\xf5\x1e\x59\x5e\xf5\x05\x5f\x83\x9e\xfa\xf1\x10\xe4\x90\x16\x31\xac\x31\xa0\x2f\x4f\x7e\xe4\x24\xa3\xa2\xc3\xe0\x0d\x26\x02\xd2\xcc\x1e\x49\x29\x06\xee\xa4\x20\xa9\x26\x82\x38\xac\x66\x22\xa0\x89\x74\xe5\x73\x02\x92\xe6\xed\x51\x02\x56\xef\xde\x66\x7e\x0d\x9a\x0f\xf2\x21\x3f\x54\x12\x0c\xcd\x81\xff\xaa\x6b\x7c\xc4\x81\x41\xa2\xb7\x29\x85\x2a\xf5\x83\xd2\x6a\xa5\x1f\xbd\xe6\x7b\xe4\xdf\x14\xe5\x20\xc2\x25\x7a\x73\xc5\xc2\xe3\xc3\xd8\x7d\xfb\x25\x36\x11\x75\xfd\x18\xab\xd7\xe9\x9a\xa0\x9b\x85\xf8\x8f\x19\xc8\xd8\x2d\x45\x85\x8f\x31\x44\xc5\xdf\xb7\xa4\x9e\xde\x45\xb4\xef\xd8\x71\x05\x92\xa3\x72\x06\x36\xe7\xe8\x89\xc7\xe2\x2a\xd1\x3b\x2d\x44\xbb\x7e\x2b\x47\xb2\x96\x3a\x5f\xa3\xf2\x55\x7b\x85\xbc\x0c\x69\x3d\xe3\xd2\x2e\xf9\x46\x4f\x7b\x81\x4a\x20\xa4\x67\x6a\xd2\x6f\xca\xa0\x35\x44\xc6\xaa\xd4\x12\x83\x09\x5f\xcd\x12\x10\xaa\x8c\xc0\x29\xff\x5a\x26\x00\x5a\x89\x12\x26\xc2\x98\xe9\x4a\x52\xaa\x71\x33\x91\x3e\xc9\xd2\x2a\x5b\x2a\xc0\xbc\x6f\x15\xb2\x51\xd0\xb9\x38\x89\x21\x3c\xd1\xb1\xe5\xc6\xfd\x08\xf1\xa8\xf5\xcb\xd4\x21\x53\x29\xa3"}, +{{0xe7,0x53,0x88,0x02,0x6a,0x6a,0x6d,0x6c,0x6d,0x19,0x9e,0x36,0x29,0x93,0xa5,0xb1,0x04,0x49,0x01,0xe1,0x8a,0x76,0xc2,0xfa,0xc7,0x26,0x1a,0x6d,0x1c,0x19,0xa4,0xf3,},{0xb9,0xce,0x14,0x25,0x1c,0x0c,0xdf,0x3b,0xdd,0xb2,0x06,0xdc,0x6b,0x8b,0x2b,0x7f,0x5b,0x7e,0x4d,0xd1,0xbe,0x2c,0xe1,0x86,0x3f,0xf1,0x88,0x06,0xae,0x00,0xf1,0xee,},{0x6d,0x0f,0x83,0xd9,0xc5,0x5d,0x84,0xbc,0xf9,0xa8,0x61,0x47,0xd9,0xb6,0xba,0x9a,0xd5,0x37,0x83,0x2f,0xd0,0xf9,0x9d,0xae,0x7e,0x72,0xc8,0x13,0x9a,0xfc,0xb3,0x0c,0x7b,0x24,0xf6,0xb2,0x92,0xe3,0x2f,0x98,0x47,0x09,0x75,0x51,0xb7,0xfb,0xfd,0x51,0x0c,0x84,0xe8,0x9b,0xe9,0x82,0x54,0x44,0x14,0x57,0xbd,0x08,0xe5,0xf0,0x53,0x02,},"\xb9\x9c\xdc\x84\x72\x11\xc0\x66\x42\xdd\x11\x1b\xc5\xe0\xbe\xca\x53\xa7\x4f\xfb\xa2\xe3\xac\x93\xaf\xb4\xb0\x94\x75\x18\xe8\x32\x35\x27\x33\x0a\x4e\xfe\xfb\xe4\xba\xfa\x00\xba\xfe\xcb\x43\x4a\xb1\xe5\xb7\xce\x65\x65\x6f\x7a\x4f\xd8\x56\xaa\x6c\x38\x5e\xd8\xd7\xbd\x62\x85\x58\x0d\x7d\xd6\x08\x82\xe6\x9c\x19\xda\x07\x69\x09\xd6\x47\xde\x09\x5a\x80\xe9\x8a\xd8\x9b\x81\x4a\xad\xcb\xbf\x6f\x03\x3c\x49\x20\x2f\x65\x6c\x09\x10\x50\x39\x59\xcf\x97\xcd\x0f\xa8\x2d\x5f\x6d\x22\xfb\xa3\x38\x99\x51\x29\x4c\x4f\x7c\xdc\x21\xeb\x82\x44\xbd\x65\x60\x63\x7a\x5e\xca\x62\xa8\xeb\xa1\xf4\xa9\x33\xd1\x87\xa7\x5f\x86\x71\x16\x43\xaf\x35\x88\x31\xc8\xc1\x6a\x9a\x0f\x09\xe2\x53\xb2\x39\x5e\x9c\xb3\x71\x61\x1e\xec\xdd\x66\xb4\xab\x52\x1a\xa9\x4b\x3f\x20\x23\x7e\xae\x41\xcd\x10\xc5\xe2\x1a\x45\x2d\x48\xe7\x48\x18\x7f\x35\x4a\x67\xad\xf6\x81\xb0\xfe\x61\xcd\xae\xc9\x4a\x5e\xaf\x01\x26\x9f\xce\xb5\x70\xd5\x14\xff\x3c\x55\xff\x1d\xba\x2f\xd2\xdf\x17\xf8\x6a\x8a\xeb\x74\x78\x38\x11\x3d\xee\x94\xa4\x3b\x13\x84\xcb\xe1\x33\xcd\xf6\x42\x7e\x8d\x12\x2e\x4e\x93\x37\x04\xda\x6e\x26\xcf\xce\xe9\x7f\xe3\xf6\x29\xb6\x0b\x91\xb2\xdd\x86\x38\x67\xfa\x79\x80\x1e\x2b\x91\x6e\xc4\xc0\xfb\x62\xe0\x71\x59\x42\x1e\x65\x79\x74\x30\x7a\x1d\x02\xf7\xf2\xed\x47\x24\xa8\xb5\x21\xa8\x61\xf5\x5f\x35\x52\x1e\x8b\x2e\x1a\x84\x90\x4c\x42\x8c\xfc\x5b\x60\x14\xbb\x0f\x8b\xa8\x43\x4c\x22\x09\xbd\x40\xac\xa3\x11\x30\xdb\x97\x74\x33\x33\x59\x7d\x23\x51\xd5\xf6\x81\x17\x41\xf6\x26\x88\x97\x3b\xd7\x73\xd3\x02\x66\xfd\x1e\xfb\xd8\x9d\x47\xa9\x64\xf9\xd0\x19\x97\x15\x3d\x08\x7d\x92\x69\x66\x16\xdd\x10\x3a\x93\x4c\xcb\xac\x4c\x1d\x14\x2f\x20\x75\xd4\xe2\x2c\x3d\xa4\xa0\xe9\x73\xb2\x38\x63\x19\x62\x87\xb7\x91\x74\xfa\x29\x75\x5f\xc6\xd9\xb5\xe1\x00\xac\xe0\xa4\x59\x75\xe5\x03\xb2\x54\xd3\xf1\x95\xc2\x61\x71\x09\x10\xfe\xf1\x06\x89\x2c\x08\xbb\x29\x6d\x23\x0c\xde\xa9\xf5\xa1\x1f\x91\xac\xaa\x6e\x7c\x05\xe9\x2c\x28\x1d\x2b\x31\x55\xfe\x44\x80\xb0\xaa\x5e\x0d\xb4\x1d\x10\xe0\x5c\xfd\xef\xa4\x36\x40\x51\xcb\x75\x5d\xc7\x2f\xfa\x97\x8c\x00\xb9\x4a\x5f\x21\x2d\xc6\x91\xf8\x39\xb4\x9d\xe9\x7e\x01\x39\xd6\x5e\x8d\x73\xb2\xb2\x89\xb2\x6a\x12\xc6\xcc\xd8\xed\xc0\x4a\xdb\x45\x2a\xf7\xff\x09\x4a\xa9\x01\xea\xf5\x76\x51\xeb\x1b\x87\xb8\x33\xd0\xa0\x9b\x4a\x4a\x64\x62\xf4\x06\x64\x62\x37\x69\xe9\x50\x79\xf3\xc9\x62\x85\x0c\xc3\xb4\x01\xbb\x00\x58\xb8\x47\x5b\x10\xc8\x62\xf3\x2f\x30\x0a\x2b\x14\x3b\x3d\xea\x26\x9d\xdc\xbe\xa7\xbe\x7d\xd2\x42\x6d\x0d\x42\x04\xeb\x66\xa3\x9f\x13\x18\x82\x2d\xcb\x9c\x56\x13\x98\x63\x7f\x4a\xb8\xde\x19\x67\x68\xac\xe7\x4f\x34\x8c\x01\x2d\xd1\xba\xbe\xc1\x7f\x53\x00\xff\xe0\xd7\xaa\xae\xaf\xef\x7d\xb6\x50\xa8\xf2\xf3\x09\xa9\x79\x3f\x52\xc6\x85\xc7\xe1\xd5\x13\x32\x74\x91\x57\x84\x89\x9c\x48\x1d\x48\x5c\x9b\xd3\x0e\x99\xfc\xdc\x97\xd9\x6e\xf0\x74\x87\xda\x66\x3b\xef\xe6\x82\x99\xdf"}, +{{0x5b,0x32,0x3f,0xc0,0x1a,0x16,0xc4,0x5d,0x10,0x64,0x66,0x7d,0x2e,0xa4,0xa7,0xea,0x59,0xd2,0x03,0x42,0x56,0x2d,0x12,0xfb,0xc5,0x98,0xd5,0xaa,0x73,0x00,0x68,0x8e,},{0xd4,0x14,0x1b,0x45,0x5d,0x30,0x16,0x42,0xba,0xda,0x28,0x14,0xaf,0xcb,0x16,0x20,0xd5,0xeb,0x56,0xd9,0x2b,0x11,0x85,0xfe,0x5d,0xad,0xef,0x55,0x96,0x25,0xfa,0x71,},{0xe2,0xef,0xf6,0x07,0xf0,0x22,0x7a,0x29,0xd5,0x82,0xd6,0x9f,0x34,0x58,0xac,0xad,0xd3,0x22,0x6f,0xce,0xaa,0xc0,0xab,0xbd,0xae,0xd5,0x26,0x75,0xc5,0x16,0x30,0x07,0x3c,0xd3,0xa9,0x01,0x70,0x7e,0xcf,0x05,0xe8,0x93,0xf2,0xc3,0x6d,0xaa,0xf0,0xcc,0x49,0x01,0x11,0x69,0x46,0xb5,0x77,0x0d,0xc0,0x38,0x12,0x5f,0x6d,0x13,0x1b,0x09,},"\xad\x24\x66\x9e\xf5\x5c\x54\x0a\x8e\xd1\x62\xce\x1d\x28\xf0\x17\x60\xa6\x07\x19\xa0\x37\x73\x36\xeb\x00\xb1\xec\xbe\x6f\x61\x60\x1c\xd5\x64\xf9\x2c\x95\x68\x04\xf9\xbe\xd4\xe1\x47\x6b\x94\xe5\xea\x8c\xca\x80\xcb\x49\xa3\x04\xef\x85\x1f\x7f\x67\x5a\xbe\x58\xe6\x68\x1d\xc0\x12\xad\x55\xe5\x1b\x02\x1d\x98\x28\x56\x9d\x0b\xcc\x9e\x05\x27\xa3\xfc\x03\xc8\x91\xd1\x7a\x90\xe6\x33\x7a\x1e\xa6\x7f\x2f\x08\x81\x05\x87\x69\x38\x37\x08\x1e\x4c\x08\xa3\xd7\x2c\x53\x6c\x21\x40\xda\x20\x0b\xa4\x56\xc3\x76\xf6\x1d\x05\x65\x1f\x0c\x5f\x39\x57\x11\xf4\x1c\x0d\x6e\xae\x98\xc9\x06\x76\x4d\x1e\xbe\xf3\xf9\x04\x6c\xb7\xc8\x62\x26\x40\xfc\xaf\xaf\xbf\xb8\xf6\x2e\x1c\xd3\x2c\x66\xee\x1c\x55\x50\x94\x89\xa5\x38\xab\x61\x29\x99\xe7\x99\x7b\x77\x9c\x64\x22\xef\xf1\x09\xda\x4d\xf8\x29\x20\x93\x0d\x8d\x36\x3d\x78\x30\x90\x87\x95\xa3\x88\x8f\x25\xd6\x67\xe1\x4d\x15\x5e\xd4\x45\x81\xbe\x43\x0f\x79\x73\xb5\x74\xe2\xbc\x0b\x13\x4c\xf1\x39\xfb\x4b\xb0\x1d\xbd\xa4\x1b\x67\xb9\x81\x47\xd8\x01\x2f\x40\x67\x7f\x4b\x80\xce\x4a\x53\x4c\x90\xad\xea\xbf\x48\x4b\x21\xfa\x99\x4b\x7a\x17\x5f\x8a\x8b\x8a\x40\x75\x56\x44\x78\xdd\xb0\x50\x24\x58\x0b\xab\x03\x8c\xd9\xea\xa1\xdf\xda\x55\x2f\xb3\x12\x29\x42\x9b\x61\x4f\xa1\xd8\x0c\x52\x61\x4e\x84\xfa\xa2\x21\x7f\x26\x0f\xf7\xcc\xea\x8c\x7b\x06\xe3\xd7\x7f\xf8\x74\xeb\x81\xfc\x85\x97\xe5\xfc\xdc\xec\x95\x1b\x5f\xe6\x4a\x1a\xf8\x6e\x73\x19\x3a\x88\x24\x69\xeb\x3b\xa3\xc3\x82\x73\x4b\x28\x87\xb4\x19\x31\x6e\xa4\x48\xaf\xc2\x82\x47\x8c\x25\xf7\xbc\xa1\x84\x29\xcb\xbf\xfd\x88\x71\x17\x7c\x5e\xcc\x7d\x8a\xa9\xa1\xb9\xec\x87\x19\x2d\x29\xa5\x25\x39\xc0\x81\xc3\x59\x33\x32\x44\x4c\xbe\x66\x87\x2c\xf3\xd0\xe1\x97\x29\x2b\x82\xb0\xbe\x5f\xcd\x85\x8c\xd6\xca\x48\xb5\x3e\xe5\xb6\x16\x41\xbc\xaa\xf3\x1d\x81\x9c\x7e\x1c\xed\xaf\x9e\xe6\xb0\x7e\x09\xca\xed\xfb\x30\xb9\x20\x4a\x1d\x4d\xdb\x70\x56\x0c\xbe\x1e\xb0\xc0\xec\x43\xf1\xd1\x78\x20\x1b\x29\x08\x19\xfc\xdc\x92\xc6\x3e\x0d\xb6\x0f\xb8\x7d\xff\x00\xe5\x12\x64\x8c\x89\x58\xa8\x47\xef\xc3\x63\x46\x07\x3f\x1a\x4f\x1f\x23\x17\x06\x0f\x1c\x54\x3e\x6f\x01\xb4\x24\x85\xbe\xeb\x56\xca\xb3\xba\xb2\x6e\x6a\x0c\xa6\x93\x58\x02\xc7\x62\xb7\x99\x15\x9e\x32\x0f\x36\xb5\xe8\x3d\x4a\xca\x89\x62\xaa\x2c\x3c\x2b\x7a\x38\x70\xe9\xe0\x47\x31\xf3\x94\x8c\xf9\x41\xe2\x1d\x50\x96\x4e\x5d\x63\x5a\x35\xa5\x3e\x29\x98\x11\xb8\xca\xdf\xcb\x44\x16\xc5\x75\x98\xa3\xfd\x05\x41\x09\x10\xdb\xc0\xea\x2c\x78\xfd\xb9\x25\x74\x99\x7d\x58\x79\x62\x79\xea\xaa\x78\xb3\x6d\xce\xf1\xc9\xa1\x29\xee\xff\x82\x39\x9a\x26\xd0\x08\xff\xa3\xbf\x04\x18\xff\x7d\x39\xb6\x42\x7f\x34\x18\x95\x02\x4d\x16\xe2\x2a\x0c\x62\xa8\x2b\xeb\xa2\xe2\xba\xc2\x3d\xee\x18\xcf\xcd\x5d\xb2\x39\x7f\x37\x8c\x53\x67\x30\x90\x82\xc4\x4e\xb4\x3c\xed\xc1\x52\x20\x25\x3a\x62\x32\x03\x99\x66\x5f\x71\x34\x9c\xc1\xb9\x44\xf5\x8c\x73\xa1\x0a\x0b\xbf\xd4\xca\xf1\x28\x91\xe3"}, +{{0xbe,0x1c,0x11,0x2f,0x78,0xcf,0x13,0xae,0xfc,0x5c,0xe7,0xe3,0x37,0x64,0xac,0xa4,0x48,0x1f,0x9f,0x88,0xb0,0x18,0xe1,0x22,0xdb,0x9f,0x8d,0xac,0x14,0x62,0x46,0x05,},{0xae,0x38,0x99,0x36,0xbb,0xf6,0xd1,0x6e,0x3c,0x1e,0xeb,0x64,0x74,0x29,0x89,0x70,0x86,0x6e,0x12,0xec,0x9c,0x1d,0x6a,0xea,0x2f,0xd9,0xdb,0x6b,0x56,0xaa,0x59,0xc4,},{0xf5,0xfc,0x5a,0xcb,0x17,0xe9,0x95,0x7e,0xa3,0x04,0xf1,0x23,0xb6,0x50,0xe1,0x44,0xc9,0xe4,0x37,0x72,0x83,0x50,0x9d,0x43,0x1d,0xa6,0xa2,0xbb,0xd5,0x27,0xbe,0xb3,0x82,0xc9,0xf5,0x87,0x45,0xa3,0xe5,0x6d,0xcc,0x65,0x5b,0xd2,0xeb,0xb7,0xae,0xef,0xc9,0x3e,0xdc,0x3f,0x20,0xd8,0xd3,0xc3,0x79,0x23,0x03,0x1e,0xec,0x0c,0xb4,0x07,},"\xd7\x7f\x9a\xee\xa0\xfe\x98\xed\x7f\xb7\x4d\x58\x2a\x40\x2b\xcb\x79\x31\x47\x4b\x4a\x95\xd5\x23\xf3\xfb\x76\x9f\xb7\x09\x7d\x2b\xe4\xc6\xec\x10\x52\x14\x01\x63\x22\x25\x53\xaa\x8f\x4f\x89\xe4\x21\x73\x00\x14\xec\x73\x46\x97\x20\xce\xa9\x67\xf8\x8b\x6a\x48\xd0\x2a\x2d\xdc\x1a\x12\x1f\xdf\xfb\x8a\xe1\x27\x73\x8e\x29\x3c\x4d\x6b\x1b\x74\xad\x03\x84\x4d\xe6\xbf\xe8\x21\x50\x6b\x3a\x7a\x81\xd1\x9c\x37\xa7\xf0\x1c\xa4\x81\x47\x12\x19\xef\xe2\xa7\xb9\x2c\x4b\xd2\xac\x07\x74\x3b\x49\x75\x69\x64\x41\x71\x4b\x84\xd6\x3c\x54\x9d\x7a\x6f\xb6\x1f\x16\xfb\xcd\xb7\x2b\x91\x4d\x78\x82\xd0\x91\xf9\x70\x6d\xa3\x8c\x1a\x81\xa1\xc6\xa4\x0f\xbe\xc0\xd8\xe2\x38\xb5\xd5\x6d\x46\x0e\x90\x9f\x85\x47\x9f\x7a\xd8\xb1\x19\xf3\x54\x55\xe3\x40\x10\xca\xa7\xe5\xd0\x1f\x38\xe3\x01\xad\x37\xe8\x00\x5f\x6e\xd2\x9e\x4a\x10\x2d\xb3\xf6\x1d\x84\x09\x3f\x78\xc4\x9a\x96\x48\xc9\x77\xbf\x4d\x5b\x68\x9f\x71\xf4\x06\xf8\xad\x7b\x9a\xeb\x1a\xe2\x21\x33\xa8\x4c\xe1\xb2\x78\xb2\xcd\xde\x46\x59\x01\xb2\x3a\x17\x9d\x07\x2a\x80\x87\x9d\x0a\x24\xd2\xaf\x19\x7b\x32\x2a\x07\xbf\x5d\x40\xee\xab\x3a\xf1\x21\x17\xf1\x30\x21\xdf\xc1\x68\x1a\xba\x5c\x08\x3f\x25\x96\xe3\x7f\x11\x23\x42\x2b\xbd\xca\x3b\x2c\x32\xcb\x59\x4f\x56\xc3\x25\xe0\xc5\x64\xa1\x73\x32\x88\x05\x34\x59\xc6\x24\x88\x92\x5c\xd8\x0e\x7c\x94\x4d\xb9\x98\xc3\xc7\xbe\x54\x6b\xf8\x9d\x7a\x51\x1c\xcd\xba\x4b\x80\x9e\xee\x0f\xc2\x87\x3d\xad\x72\xb4\xcf\x3b\xa0\x51\x28\x9b\xb3\xf4\xe9\x92\x57\x32\xe4\x5a\xe7\x74\x10\x58\xc8\xfd\x11\x59\x9d\xd8\x43\x92\x7e\x3d\x14\x59\x8b\xb8\x30\x52\xd3\x35\x69\xcf\xb0\x2a\xf0\xc8\x8f\xa7\xae\xa4\xbb\x46\x84\x1c\xd2\xdd\xbd\xf5\x98\x8f\xcf\x32\x5f\xf1\x04\xa5\xdf\xc4\xa3\x0d\x26\x9d\x2a\x94\x97\x30\xc3\x61\x3b\xdd\xd3\x67\x3b\x42\xf6\x09\x0e\x6a\x60\xe4\xa2\x53\x06\x24\x63\xa6\x5d\x7e\x7f\xc0\x03\x0b\xba\x76\x9c\xa3\x44\xbf\xa9\xac\x82\x3f\x58\xcb\x5c\xee\x8a\x5f\xc0\xca\x37\x22\x8d\xe5\xa4\xd9\x3e\x0e\xcf\x7f\x10\x82\x16\x59\xa2\x26\x1f\x7e\xf1\x59\x6e\xda\x4e\x41\x1c\xf3\xc9\x66\x9d\x81\xde\x74\x54\x7c\xe4\xbf\x83\x3e\xb4\x32\xf3\x85\xce\x90\x38\xfe\x84\x8a\x8c\x96\xda\x7f\x01\xfd\x95\xbe\xa0\x6d\x1d\x74\x7c\x8a\xe7\x36\x49\x5b\xba\x22\x85\xbe\x5c\x32\xaf\xea\x44\x95\x20\xcf\xe8\xe1\xce\x25\xf9\x07\x7e\xd0\xec\x0f\x65\x98\xa9\xb8\xf7\x38\x6f\x15\x35\x81\x70\xcc\xef\xc3\xd5\xff\xb0\x09\x28\x81\x54\xde\x87\x7c\x24\x09\xae\x5f\xd8\xfe\xf0\x09\x3f\x1c\x36\xb3\xa8\xf5\x47\x43\x2c\xd0\xf6\x2c\x40\x33\x24\x2a\xd9\x92\x1a\x8f\x11\xc0\x0f\x36\x6d\xa9\x39\x69\x30\xa8\x0c\x99\x7d\xf4\x29\xa4\xf5\xf4\xe4\x5c\x7a\x6d\x7e\x02\xaf\x03\x31\x86\x75\x7c\x73\xcb\xe6\x4d\x2d\x4e\x78\xea\xaf\xe2\x75\x39\x52\x80\x35\xf2\xcf\xcf\x8e\xaf\x0a\x42\xbd\x25\xf8\x8b\x2f\xc6\x9e\x42\x66\x8f\xae\x66\x77\xc9\xac\x90\x91\xd9\xd1\x5a\x41\xf3\xac\xe6\x5d\x90\xa0\x22\x98\x73\xdc\xf2\x54\x25\x6c\xca\x44\x9e\xd4\xc1\x7d\x54\x35\xba\xe4"}, +{{0xbd,0x85,0x23,0xed,0xa8,0x99,0xb9,0x84,0x23,0x0e,0x32,0x88,0x75,0xb9,0x67,0x2e,0xdc,0x9f,0xcd,0x24,0xea,0x5c,0xc1,0x2d,0x7b,0x57,0x2d,0xa4,0xbe,0x01,0xfb,0x7b,},{0x02,0xb7,0x34,0xeb,0xbe,0x88,0xc1,0x3b,0xfa,0x95,0xa5,0xd9,0x64,0xfc,0x7e,0xf9,0xd3,0x95,0xbd,0x63,0x03,0xf0,0x65,0xdc,0x4e,0xe1,0x7b,0x3a,0xc1,0x54,0x8b,0x7b,},{0xfc,0xfc,0xdb,0x08,0x8d,0xcb,0xd0,0xa5,0x1b,0xd3,0x01,0xe3,0xe1,0x56,0x16,0x71,0x93,0x5d,0x8b,0x6f,0x71,0x9c,0x5d,0x92,0x69,0x06,0x40,0xd3,0xc9,0x1e,0x77,0x5b,0xf4,0x05,0x41,0x32,0xef,0xc0,0x5a,0x21,0x22,0xfc,0x20,0x9d,0xb3,0xc3,0x34,0x32,0x33,0xff,0x8a,0xec,0xeb,0xd5,0x2d,0xaa,0x2b,0x3b,0x21,0xee,0xb1,0x5f,0xd1,0x02,},"\x16\xc2\x16\xc9\xbe\x9f\x0d\x4b\x11\x54\x10\xbd\xfd\x15\x93\xc8\xe2\x62\x22\x1a\xb9\x7a\x2a\x39\x5a\x12\x19\x8f\x95\xc3\x02\x05\xb0\x89\x62\xd4\x89\x31\x18\xba\x9f\xf9\x9a\xb1\xc7\xa6\xe1\xf2\xf1\x75\x19\x10\x70\xac\x94\x53\x27\xad\x6c\x47\x0b\xab\xf7\x92\x8b\x07\xdd\x78\x8c\x85\xb6\x4b\x71\x2e\x0a\xae\x6c\x0e\xa2\x02\x81\xe4\x2f\xd5\x61\xe8\x3e\x3f\xba\xc6\x7f\x14\x00\x0e\xe5\x6d\x98\x1d\x2a\x2f\x0b\x9c\xa0\x0a\x9e\xa4\x7c\xa2\xf6\xfc\x8d\xca\x10\x35\xfc\xeb\x14\x2c\x3f\x26\xf2\x0e\x3c\x73\x22\x07\xff\xff\x11\xb7\x96\x95\xbd\xaf\xa4\x15\x21\x4a\x44\x99\x30\x23\x26\x60\x5c\xf0\xb8\xc8\x2f\x2b\x11\x39\x2e\xcc\x90\xcd\x74\xa7\xb4\x11\xb6\xd9\x07\xa3\xd5\xc1\x30\xc8\x79\xb7\xcf\x88\x0f\x22\xbb\xd7\xf0\xe9\x59\x33\x71\x8e\x96\xd7\xd1\x6c\xae\xa9\xf2\xc3\x9e\x89\xb1\x3c\xd5\x22\x66\x27\x36\x04\xa9\x6b\x51\xd6\xe3\x4f\x70\x67\x35\xdd\xd9\xfc\xa4\x4d\x09\xcd\x86\xbb\x72\x17\x60\x0e\x0d\x34\xd4\x16\xac\x24\x9f\x2e\x41\xbd\x0f\x4a\xbc\xbd\x25\x80\xad\xae\x21\xd7\xeb\xa5\xfa\x44\xf3\x9d\x78\x0f\x17\xeb\x85\xcc\xbe\xf5\x8f\xef\x90\x3a\x28\x0d\x95\xf8\xf3\x21\x07\x89\xfa\x12\xe1\x20\xe2\x1b\x6e\x8c\xad\x91\x78\x35\xbb\xdc\xc3\xb0\x7e\x84\x69\x39\x54\xe2\x3a\x94\xf9\x9f\x93\x7d\xdb\x0d\x4a\x18\xd4\x2c\x3e\xa8\xfc\xa7\xd1\xea\x6e\xd5\x3a\x00\x24\x6f\x99\xea\x52\x0e\x64\x05\xbd\x2a\xa5\x49\xb0\x6e\x7d\xa7\x22\xc1\xba\x74\xaa\x1c\x13\x6e\x8e\xa5\x8b\xaa\xf8\xd3\x76\x58\x69\x3f\x3e\x0b\x44\xf6\x31\xdd\x6d\x08\xff\xdf\x4f\x09\x18\x9d\x30\x35\xa3\xf0\x34\x68\xe2\x96\x96\xef\x05\xe0\x2c\xc1\xaa\xbf\xec\xbd\xa2\x30\x1b\x54\x0c\xb0\xeb\x0a\x75\xbc\xce\x73\xdb\x92\x73\xa9\x16\x1a\x98\xad\x89\x8f\xcd\x65\x79\xfb\x7e\x4b\x32\x79\x54\x4f\x2e\x0b\xd7\x74\xdd\x1a\x81\x57\xda\xa8\x8a\x70\x32\x11\x67\x70\x3c\x60\xa6\x08\xa4\xb5\x42\x16\x59\x03\x75\xe5\x97\xfe\x21\xae\xa9\x7b\x52\x18\x5d\x0e\x37\xa5\x3b\x63\x88\xa7\x07\xa2\xbc\x24\xac\xf9\x44\x25\xf8\x4f\x3d\x56\xbc\x9f\x7e\xe7\x41\x2a\x9e\x18\x33\xad\x55\xb7\xea\xe6\xda\x58\x16\x98\x16\x63\x83\xa2\xeb\xa8\xb6\xf5\x39\x20\xf5\x17\xa5\xc8\x0b\xd3\xe0\x3f\xaa\xd4\x08\x7e\x3e\xe8\xfe\xc9\xa7\x9a\x01\xc7\x79\x51\x21\x33\xd7\xb6\xe5\xf1\xde\xc7\x66\x30\x0d\xc4\x05\xcc\x21\xa8\xc5\x83\xfb\x73\xbc\x90\xcf\x24\x38\x5b\x08\x60\x49\xd3\xbf\x20\xc3\x00\x98\x3c\x0b\x35\x15\x38\xdc\xcb\x22\x7a\x14\xfa\xfd\x23\xac\x4b\x26\xbe\x81\xa2\xb1\x20\xcf\x21\x6f\xc5\x83\x54\xf9\xdc\xbf\x05\xf6\x63\x39\xad\x6d\xdc\x2c\xac\x14\x67\x7b\x90\xe2\x47\xeb\xb6\xc5\xc2\x29\x00\x7d\xc6\x0f\x37\x4a\x06\xd4\x04\xeb\x23\xeb\x1e\xc4\x99\x07\xc6\xe8\x81\x62\x9e\x18\x67\x26\x8c\xa6\xff\xfa\x59\xaa\x3c\xa8\xf6\xc2\x95\x16\x2b\x95\x36\xc2\xbe\x22\xbb\xe3\xb7\x23\x80\xef\x11\xb6\x1b\x35\x7a\x62\x53\x10\x0e\x30\xa5\x86\x81\x8b\xa0\x03\xfa\x3f\xfd\x1f\xc9\x19\x88\x1c\x05\x02\x2f\x94\x84\x85\x98\xf2\x17\xfe\xa2\x22\x50\x72\x20\xd1\x08\xa2\x8f\xc7\xbc\x39\xa8\xa1\x1c"}, +{{0x33,0xa8,0x5a,0xe1,0x50,0xbb,0xf5,0x52,0xf4,0x16,0x63,0xb2,0x15,0x21,0xc2,0x96,0xd2,0x46,0xdd,0x6c,0xf8,0x19,0x5d,0xf8,0x51,0xc6,0x95,0xbd,0x15,0xf4,0xa5,0x02,},{0xc8,0xc9,0xc4,0x25,0x21,0x00,0x8d,0x5e,0xff,0xf5,0x76,0xc7,0xe4,0xa5,0x60,0x83,0xce,0xd9,0xa9,0x28,0xda,0x6f,0xd5,0xcf,0x93,0xfd,0xa5,0x72,0xa5,0xa2,0xd0,0xc0,},{0xbb,0xe4,0xcd,0x63,0x67,0x6e,0x26,0xd6,0x75,0xa1,0x91,0x15,0x1d,0x30,0xdb,0x72,0xb5,0xb8,0x4d,0x46,0x1e,0xec,0x65,0x64,0xaf,0x86,0x7a,0xb4,0x1b,0xae,0x99,0x31,0x14,0x78,0x85,0x51,0x9e,0xc9,0xd7,0xe6,0xc8,0x18,0x74,0x3c,0x8e,0xf6,0xd5,0x16,0x7b,0x35,0xb4,0x21,0x36,0x3c,0x09,0xb3,0x57,0x36,0x7f,0xe8,0xde,0x44,0x3a,0x06,},"\x93\x7e\x05\xf2\xf1\xfd\xbd\x41\x73\x15\x53\xe7\x7c\xf1\x81\xb5\x07\x97\x58\x94\x0a\xee\x8e\x92\x62\x3f\xb1\xd5\xf0\x71\x28\xb7\xd7\xf1\x7e\x48\x42\x70\x7a\x56\x2c\x45\xba\x69\x26\x4c\x0f\x73\x0a\x82\x1c\x7d\xb6\xbf\x82\x99\x0d\xc6\x51\x26\x9b\x29\x6c\x33\x51\x79\x11\x30\x53\xd6\xf8\x5b\xb0\x96\xb2\x91\x11\x65\xfa\x39\x00\xcb\x10\x24\x16\x48\x7b\xa8\x07\x86\x79\xc6\xb3\x36\xdf\xf3\x87\x63\xc0\x8d\xcd\x20\xfa\x66\xdd\xa4\x5c\x57\x5d\xf1\x50\xd8\x51\x16\x5a\x48\x04\x97\x38\x30\xf4\x36\xdf\x60\xb8\x13\x19\xf9\xcf\xb5\x64\xc0\x65\x28\x96\xed\x5f\x18\x49\xcb\x33\x54\xf5\x0f\x00\x12\xf2\x86\xe8\xa3\x0c\x21\x35\x28\x69\x34\x74\x00\x4e\x85\x04\x01\x2b\x94\x55\x60\xc0\x74\xa6\xa1\x63\x43\x2c\xf4\xac\x4b\xa7\x17\x5c\xf2\x60\x05\xdb\x71\x99\xee\x96\xd8\x93\xcd\x1a\xad\x3f\xdf\x5d\x57\x46\x0e\xf0\x2d\xda\x6d\x3a\x14\x08\x25\x19\x6f\x3f\x8e\x2f\x37\xda\x36\xb6\xfd\xad\x18\x4f\x27\x40\xf1\x16\xde\x75\x8a\x92\x91\x70\x30\xc5\xfb\x80\xf0\x26\x24\x96\xd2\xdf\x93\xc7\xe2\x76\xf2\x5d\xa7\xdb\xed\x8e\xb8\xdd\x4c\x56\x3a\xba\x55\xb8\x2a\xf6\xba\x3a\x70\xca\x5f\x85\x8b\x44\xa0\x33\xcf\xb7\x95\x60\x4d\xde\xe7\x46\xe7\xc8\xae\x79\xd2\x72\xfb\x9a\x23\x41\xa2\xa2\x02\xdf\x5e\xac\x08\xde\x75\xad\x80\xc6\x58\x0d\x92\xb1\x69\xf2\xe1\x31\x88\x57\xb1\xb1\x42\x1c\x30\xf3\xdd\x46\x10\x93\xde\x2d\x34\x5e\xde\x74\x04\xb7\x2a\x45\x0d\xe0\x7b\x16\xee\xe6\x8c\xe6\x28\x87\xb6\xea\xa4\x36\xee\xe6\x84\xbe\x75\xce\x0e\x1f\x96\x26\x3e\x8d\x87\x36\xf9\xba\x00\x0d\x88\xe9\xe5\x86\x0f\x32\x8a\xe1\xe2\xdc\x73\x09\x9d\x32\xfc\xeb\x1b\xd2\xc0\x12\x36\x98\xa4\x9b\xea\xd1\x90\xa0\x0e\xc9\xa6\xf8\x71\x33\xed\xdd\x45\x31\x6f\x65\xeb\x0d\x32\x9b\x07\xb9\xa6\x6b\xb9\xfe\x42\x58\x8b\xf7\xb8\xd0\x6e\xfe\xc1\x98\x6b\x82\xa0\x81\xed\x3f\x68\x02\xe9\xbe\x73\x46\x47\x84\x55\x9a\x4f\x2c\x09\x7b\xa1\x4b\x0b\xfd\x5d\x7e\x0a\xff\x65\xcb\x69\xab\xd0\x3f\x86\x16\xcd\x7e\xdf\x7e\xc3\x68\x21\x9e\xdc\xf8\x93\xe9\xee\x71\xda\xd9\xf1\x8d\x79\xe5\x68\x26\x5d\xdc\x67\x16\x22\x32\x13\x23\x5b\xb9\x28\xe9\x08\xde\xa8\x27\x78\x4c\xd1\xaf\x39\x6d\x59\x0c\x81\xf4\xea\xcd\xfc\xf8\x9c\x5c\xac\x96\xfa\x05\x00\x64\xa2\x28\x41\xea\x71\x5f\x8c\x89\xd6\xd5\xaf\xbf\x59\x7a\x4d\x00\x5d\xbc\x6b\x13\x85\x6d\x33\x5b\x42\xa9\xa8\x2e\xdc\xb9\x49\x83\x5c\xca\x20\xb0\xa2\x3d\xe5\x1c\xc3\xae\xc3\x55\x66\xef\xf0\xc5\xae\x1a\xb3\x75\x13\x20\xd2\xc3\x10\x49\x52\x38\xed\xa3\x83\xc3\x8a\x41\x63\x15\x2b\x88\x15\x69\x0b\x8f\xf0\x15\x03\x5d\x1d\x00\xea\x4a\x0d\x6c\xaf\x32\x4b\xb7\x1a\x66\x4a\x1b\xed\x31\x48\x07\x84\xa6\x8f\x43\x8c\xaa\x35\x9e\x8d\x26\x73\xc8\x57\xd4\xb8\xc0\xb6\xc6\x95\x84\x7b\x86\x80\x0e\xa3\xd7\x34\xb5\xec\xc4\xd5\x2b\x50\x7a\xc6\x9b\x3a\x67\x78\x91\x60\x16\xeb\xc2\x31\x5f\x44\xc9\x0b\xf0\xc3\xe7\xda\xe0\x1d\x49\xcb\xc3\x03\x40\x2b\xbc\x63\x4a\xe1\x19\x1f\x3f\x6f\xd6\x3d\x30\x3b\x0c\x0b\xe0\x33\xa4\x7b\x90\xf8\xd3\xa7\x7f\x0a\x44"}, +{{0xba,0x9e,0x68,0x62,0x04,0x97,0x5c,0x3b,0xde,0xd4,0xc1,0xe9,0xf7,0x4c,0x7e,0x4c,0x7a,0x7e,0x3c,0x99,0x81,0xd0,0x1b,0xfc,0xa0,0xad,0x01,0x15,0xc3,0xf0,0xf5,0xc3,},{0x49,0x90,0xfc,0xe6,0x95,0x2e,0x8b,0x7d,0x0a,0xfc,0xf4,0xbf,0x9d,0xba,0x9b,0xce,0x1b,0xc4,0x81,0x5e,0x37,0x51,0x1d,0xa7,0xc2,0xad,0x48,0x92,0x58,0x1d,0xe0,0x3a,},{0xc7,0xd2,0x3a,0x58,0xe2,0xfb,0x2a,0x8d,0x4b,0x8e,0xd1,0xe9,0xea,0xe9,0x1e,0x11,0x29,0xc2,0xaf,0x8b,0xd0,0x5f,0x0b,0xd5,0x72,0xab,0xeb,0xbe,0x0f,0x30,0x82,0x59,0x25,0xf0,0xdf,0x71,0xcf,0xb7,0x21,0x8c,0x68,0x6e,0x55,0x48,0xd9,0x42,0x77,0x10,0xa6,0x90,0x36,0x6b,0xa8,0x55,0x41,0xc7,0x91,0x01,0xa5,0x8a,0x10,0xe8,0xaf,0x0a,},"\x46\xbb\x48\x95\x2a\xe5\x8f\x2b\xf5\x8f\x5b\xe8\xdf\x4f\x31\x6b\x50\xf3\x63\xec\x84\xee\xd8\xf8\x2f\xf4\xc0\x4b\x06\x92\xd0\x3a\xef\x26\xe8\xe1\xe6\xc9\x54\x9a\x22\x47\xd5\x40\xa6\xe2\x2f\xeb\x11\xe5\x7f\x4b\x80\x8a\x20\x97\xe8\xa7\xb6\xb3\xb7\xaf\x37\x69\xe6\xd8\x1d\x64\x88\x6e\x69\x62\x37\x2f\x4f\x39\xe4\x9c\xd4\x6c\x1b\x5f\x73\x5f\x38\x0f\x7c\x27\x7d\x09\x97\x76\xed\x1a\xea\xa5\x7a\x35\x9c\x0a\xa8\xc7\x2f\x40\xeb\x91\xa1\xbf\x07\xea\x15\x7f\x5d\xdb\x30\x40\x9d\x6e\x3a\xf9\x89\x90\xce\x7f\x30\xaf\xfd\xac\x5e\x22\x01\x06\x46\xdc\xa9\x6a\x54\x00\x60\xfc\x90\x8a\x31\x25\xb0\x00\xad\x1e\xd3\xa0\xf2\x55\xcd\x34\xf1\x5d\x7d\xd1\xfd\x68\x1c\x3c\x35\xa1\xcd\x65\x20\x56\xec\xc5\x26\x4d\x39\xaa\xf7\x2a\x9b\xb8\x3a\x55\x1c\xc9\x34\x88\x7a\xe1\x07\xaf\xdf\xef\x06\x32\x17\x27\x0d\x95\x96\x89\x14\x18\xbd\x46\x1b\xba\x63\xde\x65\xbe\x06\x7b\x1b\x78\x64\xfe\x46\x48\x4c\x7c\x9e\x96\x34\x9a\x7c\x03\xa8\x0f\xa0\x55\x05\x0a\xa1\x8a\xce\x2a\x44\xb4\xa0\x3c\x94\x78\x24\x17\x2b\x30\xe2\x10\x11\x15\x94\x43\xca\x3c\xef\xaf\x69\x6a\x7a\xa8\xf9\x80\x11\x26\x0c\x94\x36\xbf\x48\x99\x1f\x41\xd4\xd5\x07\xb9\x6c\xe7\x32\x3e\x53\x1a\xdc\xf6\x63\x47\xc5\x5c\x88\x55\x67\x3a\x9f\x2e\xc8\x9b\x5c\x80\x24\x46\x06\x17\xec\x72\x71\x77\x3b\x36\xd6\x4f\xc1\x4e\xb5\xd8\x26\x52\xc5\x3a\x30\x31\x45\x72\x27\x09\x3d\x11\x8f\xd8\xeb\x93\x84\xe8\x02\x29\x04\x1a\x96\xa6\x49\x34\x50\xf9\x7e\x67\x36\x26\x3a\xbf\x1e\xcd\x9e\x9f\xb9\xa4\xf0\xf6\xd6\x67\xfa\x82\x41\x51\x48\x5e\xdc\x37\xb3\x4a\xcf\x3d\x8c\x35\xf9\xc1\xbe\x48\xb5\xe9\x6a\x12\xaf\x8e\x2d\x35\xc2\x3a\x03\x58\x0f\x21\x1d\xa6\x31\x6b\x34\xc5\x6b\xee\x87\x2d\x47\x64\x1b\xca\x77\xda\x64\x0f\xdb\xba\xd5\xa9\xad\x8a\xb9\xdc\x79\x57\x91\x3d\xa7\x34\xad\x37\x49\x2b\xa4\xde\x8c\xf1\x36\xcc\xcd\xeb\x6b\xa3\xf1\xbd\x3f\x00\x3b\xe7\x26\x3c\x4f\x2a\x40\xc3\x3f\x24\xca\x33\x39\x59\x6e\x6c\x34\x28\x33\x81\x00\xeb\xcc\x07\x22\xd4\xf5\x0d\x30\xb3\x3b\x91\x2d\x4e\x7c\x1a\x9f\xe6\x5f\x66\x58\xa6\xf2\x39\x14\x0a\x62\xc3\x26\x1e\x10\x39\x2e\xd1\x93\x0a\xa9\x17\x65\x2d\x3b\xd2\xbe\x4e\x8a\x08\xab\x97\xe1\x45\xb9\x20\xab\xb3\x1e\xe4\xbc\xd5\xa0\xd7\x1f\x63\x81\x80\xf6\x1c\x24\x58\x23\xa3\x99\xa7\x34\xa4\xdc\xde\x09\x97\x88\x02\x45\xed\x71\xeb\x9b\xc6\x5e\x3c\x6f\xc9\x5a\xb9\x20\xb8\x02\x4c\x17\xd4\x4c\xed\x00\x37\xd0\x4a\x13\x3c\x26\x41\x78\x2f\x1d\x62\x2d\xf4\x52\x69\xb4\x91\xd3\xfa\x2a\x12\x27\x57\x9e\xaa\x38\x6d\xe3\xe7\xde\x7b\xc4\x55\xc6\xa1\x54\xee\xe5\x72\x7f\xff\x04\x37\xa2\x00\x76\xc5\xc3\xb0\x57\x7c\xac\x5b\x4b\x69\x34\xe2\x69\x38\x02\x22\x46\x1a\x60\xf9\x54\xe4\x89\x79\xc0\x67\x12\x17\xf1\x6f\x70\x27\x98\x30\x34\x12\x10\x93\x18\x6c\x78\x70\x5f\xc2\x7d\xc9\x2e\x2e\xda\x41\x16\xa6\xbf\x7d\x23\xe0\x54\x8d\x62\xb6\x7b\x25\xc4\x1e\xd0\x61\x92\xbc\x26\xef\x13\x97\xbf\x16\x01\xf3\xa6\xe2\xa0\xe7\xf6\x61\xfb\x05\x05\xee\x38\x2f\x27\xae\xc2\x80\x5a\x3e\x21\x17"}, +{{0x59,0x07,0xa8,0xc0,0x84,0x04,0x38,0x75,0x23,0x8e,0xdb,0xdc,0xb7,0x83,0x2f,0xbb,0xa4,0xc0,0x5e,0xa3,0xc5,0xf8,0x8a,0x96,0xf1,0xfb,0xf9,0x50,0x40,0x1e,0xc1,0x64,},{0xe2,0xf4,0x95,0x09,0xd1,0x00,0x7f,0x61,0x8e,0xfe,0x4f,0x1f,0xd6,0x7e,0xaa,0x6e,0x2a,0xb1,0x8a,0xfb,0x2d,0xec,0xce,0xd5,0xa0,0xb2,0xba,0x83,0x63,0x78,0x92,0x60,},{0x8c,0x49,0x12,0xc0,0xf8,0x85,0xd7,0x6c,0x91,0x40,0x59,0x50,0x53,0x73,0xa6,0x4b,0xdd,0xd6,0x7d,0xd4,0x68,0x36,0x9a,0xb9,0x18,0xf2,0x3e,0xa2,0x8e,0x04,0xc1,0x91,0x77,0xa8,0xd4,0x61,0x14,0x4f,0x0a,0x8b,0x51,0xd2,0x15,0x17,0x6c,0xb0,0x8b,0xd6,0x53,0x01,0xc3,0xc4,0x62,0x37,0xb6,0x1b,0xb1,0x49,0x8c,0xa7,0x9d,0x4b,0xe7,0x0e,},"\x43\x3b\x24\x78\xe1\x8f\xad\x5c\xb8\x10\x67\x06\x1d\x22\x55\x28\x22\x97\x78\x30\x78\x85\x47\x54\x60\xfb\xe3\x13\x7a\x5b\x44\x02\x48\x94\xdd\xbe\x56\xfa\x6e\xd0\x21\x49\x6f\x07\x86\xe4\x2b\xc6\xc2\xd2\x79\x7e\xa0\xa6\xbf\x35\x5e\x88\x11\x5f\xaa\x55\xcd\x92\xed\x42\x13\x3d\x9d\xcd\xa6\xb9\xeb\xf6\x3c\xe4\xa9\x94\xd1\xa8\x2d\x2a\x49\x26\x75\x58\xbe\x54\x18\x2a\x6f\x85\x11\x2b\xd1\x2b\x24\x7a\xda\xcf\x14\x05\xfc\x7e\xc7\xa0\x15\xd4\x3a\xb4\x0b\x82\xc6\x77\xf7\xf8\x5a\x0e\x48\x19\x7c\x5b\x96\x57\x61\x99\xf4\xc3\x34\x3f\xf7\x65\x4d\x52\x3a\x30\xc4\x3a\x05\x4c\x3e\x46\x44\x51\x27\x80\x34\xb7\xf1\x96\xc3\x66\x76\x8c\x62\x8a\xf9\x4f\xc0\xcc\xfc\x9a\x29\x55\xf9\xd3\x23\x38\xb9\x44\x78\x0f\x8e\x32\x70\x85\xb1\x03\x78\x18\x68\xe4\xfb\x79\xd5\x61\x22\xd7\xf3\xf5\xab\x30\x9e\x5d\x63\x4a\xdd\x15\xda\x38\x2c\x0d\x23\x58\xe6\x47\x18\x2b\xe4\xde\x6e\x9a\x9e\x43\xe6\xa3\xa3\xb8\x21\x5b\x20\x4d\x95\x07\x61\x0d\x46\x16\x21\x00\x0f\xb1\x89\x37\x07\xaf\x7d\x25\x95\xbf\xef\x8a\x8c\x5c\x5c\xd0\x8f\x30\x9a\x5f\xb5\x5e\x45\x51\x9a\xea\x9b\x84\x74\x8c\xa5\xc6\x72\xbf\xec\xd3\x0d\x25\x65\x12\x34\xa3\xcc\x31\x9b\x43\xdf\xce\xfc\x1a\x07\xb5\x5b\x4a\xca\x71\x4c\x2e\x7e\xf9\x63\x8f\xe7\x88\x4a\x77\xb2\x22\x53\xa0\x1a\x22\x29\x50\x0e\x9c\xe1\x0f\xda\x73\xa8\x43\xc1\x9c\xc0\x96\x26\xd2\x45\x6c\x22\xa9\xc9\x01\x88\x1d\x52\x1f\x4b\x15\xd2\xf6\x13\xcb\x46\x9d\x30\x4d\x57\x92\x23\xbc\x5f\xf7\x38\x04\xdf\x63\x71\x51\x7e\xba\xa5\xb6\x77\xea\x91\x0f\xf1\xa0\x2a\x26\xfa\xfe\x48\xfe\xf4\x69\xed\x79\x9b\xed\x6d\x56\xce\x96\x18\x34\xa2\xed\xc2\xe2\x3c\x0d\x94\x26\xec\xcd\xcc\x93\x4f\x4c\x22\x0e\x37\x81\x5f\x7c\x33\x4b\x73\x83\x60\x7d\x43\x05\x20\x94\x6a\x88\x1a\x08\x32\x5b\x41\x64\x97\x9d\x5e\x82\xcd\x81\x34\xd7\x8c\xec\x48\x61\xc0\x19\xf6\xde\x30\x1c\x1b\x9a\xec\x52\xbb\x98\x20\x33\xfb\x79\xb2\xe9\x73\x1b\xab\x29\x68\xbc\x3f\x93\xfa\x56\x04\xb8\x93\xc6\x02\x8c\x20\x4c\x36\xbb\x8c\x6b\x07\x4b\xe2\x8c\x96\x4d\x28\x49\xb5\xbb\x19\xd7\xe0\xba\x24\xe2\x2a\x20\x4d\x4f\xda\x83\xb1\x01\x31\xd3\x83\xf1\x0b\x13\x6b\xd0\xdb\xa3\x9e\xc2\x6a\xf3\x0e\x3f\xfb\x4d\xbc\x0c\x92\x1f\x0c\xc9\x91\x07\x15\xd5\x1c\x81\xfe\x4c\x62\x95\x0e\x85\x55\x49\xa1\x7c\xd7\x3a\x09\xac\x91\xe0\x6d\x46\x15\x18\x37\x6d\x0f\xcf\xa1\x23\xdf\x0a\x83\x71\x03\x45\x8d\x9c\xe2\x21\x80\x8d\x1f\x9e\xf2\xed\xc5\xcd\x2e\x68\x23\x14\x5b\x52\x48\x94\xea\x48\x52\x6d\x98\x5e\xef\xd3\xf6\x06\x79\x39\x95\x48\xe1\xed\xea\xdb\x53\x95\xb4\x3d\x87\x04\x4b\x2b\xfe\x7c\x60\x37\x02\x9b\x34\x6a\x40\x22\x27\xea\xb8\x1f\x33\x3e\x10\xe7\x7f\x1d\xbc\x06\xa2\x11\xd4\x3b\x82\x55\x86\x76\xc2\xdc\xff\x90\x82\xb1\xdd\x53\x36\x8d\xf0\x02\xde\x13\x29\xaf\x30\x00\xb1\x71\xa6\x91\x43\x89\xbb\x80\xec\x0c\x9f\x3e\x41\x2a\x44\x1b\x80\x0a\xfc\xeb\x04\x86\x70\x9a\xda\xc6\x6c\xaf\xee\xf2\x48\x83\x93\x31\xf5\xd8\x92\x19\x7e\x25\x42\x0f\x1e\x37\xd7\xc0\x24\x7f\x66\x9f\x5f\xcb\xf0"}, +{{0x60,0x20,0xae,0x27,0x3e,0x0e,0x05,0x37,0xba,0xc8,0x81,0xd7,0x54,0x9d,0x92,0x3e,0xb1,0xcc,0x20,0x0d,0x49,0xca,0x65,0xd4,0xbe,0x63,0x5e,0x39,0x17,0x3d,0xf9,0xda,},{0xda,0xaf,0x0e,0x69,0x9a,0x12,0xa9,0x2c,0x16,0xe0,0xde,0xd3,0xeb,0x34,0x50,0xa3,0x63,0x11,0x82,0x45,0x77,0xe3,0x61,0xf0,0x56,0x96,0x60,0x33,0x00,0x16,0x62,0x97,},{0xb1,0xba,0x88,0xfe,0xd7,0xe5,0xf4,0xb7,0x57,0xf3,0xfa,0x4d,0x1e,0xd9,0xb1,0x9e,0x49,0x8e,0x5d,0x2f,0x5e,0x6c,0xd4,0x6e,0x42,0x6f,0xe8,0xf0,0x39,0x88,0x2f,0x1b,0xe7,0x7a,0xc9,0xe5,0xa9,0x26,0x5c,0xbf,0x7e,0x3c,0xd2,0xa9,0xe9,0x92,0x6c,0x18,0x19,0x91,0x43,0x79,0x8d,0xa5,0xbe,0x47,0xa4,0x08,0x64,0x40,0x49,0x6b,0xa0,0x0f,},"\x6a\x80\x11\xde\x09\xaa\xc0\x0d\xb1\x6f\xf7\xe5\x5c\x2d\xe6\x7d\x8c\x98\x83\xfc\xb2\x04\x0d\xed\xbc\x1e\x32\x1c\xab\xa7\xbb\x03\x69\x71\x53\x01\x76\xd1\xdb\xba\xa9\x27\x52\x0b\xdf\xcc\xbe\xd8\x84\x01\x26\x04\x3e\xdc\x44\xcb\xb7\xfa\x35\x28\x68\x0e\x5f\x1b\x56\x64\x95\x1d\xc9\x01\x09\xae\xa4\xb9\xc3\x36\xca\x04\x3d\x82\x21\xa4\xc8\xd2\x01\x16\x56\xbf\x94\x4e\xfd\x36\xba\x0a\x10\xa4\xb3\x89\x19\x60\x55\x75\x0b\x0e\x38\x8f\xb5\x28\x70\xbb\xec\x8c\x55\x19\x81\x31\x44\x39\x45\xc0\x9f\x3a\xac\xe3\xe6\x91\x50\x14\x37\x40\x73\x26\x6f\x34\x88\x74\x42\xd7\x4f\x46\x8f\x8d\x70\x78\xbb\xa0\xbd\x81\x4c\xd6\xdd\x42\x3c\x97\xb5\x69\x05\x58\x7b\x15\x2d\x1f\xcf\xba\x0e\xb9\xfd\xe2\x11\x26\x91\xda\xfa\xf4\xf9\x21\x56\x2f\x24\x1b\x62\x84\x10\x01\x83\x4f\x6c\xe3\x66\x85\xf8\x2a\x8f\xaa\x3b\x7a\xfa\xd7\x3a\x5e\x59\xbf\x5f\x9e\x71\x3e\x59\x16\x3f\x31\xdb\xe6\x96\x11\x8a\xf3\x35\x06\xd2\xff\xea\x3d\x9c\x15\x56\xfb\x15\x2f\xd2\xb3\x21\xc3\x17\x57\xd0\xc3\xc0\xf6\x0e\xe1\x13\xed\xac\x02\xd6\x7e\xfb\xb3\x03\xdc\xe6\xfa\x88\xf7\xb9\x74\x6c\xa1\x10\xe6\xa0\xcd\x09\x9c\x08\x31\xf5\x3c\x55\xc2\x8b\x6c\x82\xaf\x44\x64\x56\xb8\x42\xb2\xc9\x50\xa5\x53\xee\x2c\x76\x5e\x97\x29\xe6\xb0\xc5\x46\xbf\xc2\x6b\xd6\xd4\x2d\x06\xb2\xed\x5d\x4c\x8c\xbb\xc7\x5f\x2a\x3a\xd8\x12\x93\x95\x79\x3d\x97\x9c\x03\x1f\xce\x7e\x20\xb3\x8b\xd8\x9c\x9b\x62\x47\x48\xb2\x01\x34\x23\xce\xba\xda\x02\xcd\xe2\x05\x2d\xa5\x66\x4c\x6c\x64\x26\xcb\xfc\x88\xf8\x4f\xf6\x02\xe2\xe2\x0d\xf9\x67\x8f\xbb\xa5\x77\xa4\xc1\x34\x51\x7e\xe0\x50\x68\x11\x51\x58\x0f\x7c\x5c\x97\x87\xb9\x6e\x55\xc4\x07\x5a\x26\xf4\xf8\xcc\xff\xbb\xb6\xea\x18\xde\x1b\x2c\xc8\xc4\x49\x6b\x16\x04\x27\x70\xb7\xec\x6e\xb5\x42\x9e\x7a\xc1\x89\x12\x32\xaa\x4e\x47\x46\x7f\x4e\x9a\x98\x5d\x80\x54\x7e\xcc\x4c\x6f\xd9\xf5\x97\x63\xed\xe9\x16\x71\xf2\xaa\x57\x36\xa5\xd1\x48\xe3\xa8\xff\xc8\x8e\x61\x25\x3a\x85\xb0\x95\x36\x54\x95\x8e\xb2\xd6\x94\x01\xcb\xea\xe7\x75\xf8\xcb\x8c\x3c\xa4\x2d\x21\x69\x3e\xbe\x29\x88\x38\xdf\x94\xc1\xd7\x7b\x12\x6a\x12\x05\xcc\x47\xd5\x0d\x53\x67\xb6\xf2\x76\xec\x8d\xb6\xb9\x53\x24\xa3\x1e\x8f\xd2\xed\x2e\x43\x42\x0c\x4a\xd0\x2e\xa2\x77\xdd\x94\x8a\x55\x19\x3d\x0f\x0b\x4d\x1c\xf2\x83\x86\xc7\x25\x97\x5c\xe5\xc1\x2d\x2a\x6f\x35\x67\x3c\xc2\x2a\x06\x94\xcc\xa4\xda\xf6\xaf\xbf\xd3\x26\xd8\x8c\x18\x50\xf8\x34\xc4\x2f\xf0\xe2\x92\xba\x4f\x13\xe5\xef\x07\x74\xa5\x96\xd3\x39\x04\xc0\x26\x2d\x31\xdf\x2c\x58\x4a\x0a\x4f\x45\x3f\x6a\xe4\xa8\x8a\x27\x5f\x7d\xe7\x9c\x13\xae\x1a\x73\x11\x5b\xe0\x2f\x42\x5c\x6f\x17\x7a\x1e\xc4\x63\x9c\x42\xa7\x92\x80\x9a\x2b\x09\x19\xeb\xd3\x21\xe3\x16\x00\x1d\x5b\x2f\x84\x89\x4f\xce\xbd\x50\xa1\xdc\xf4\x4d\x70\x2b\x92\x45\x32\xfc\x0e\x4d\x3f\x9f\xf8\x48\x6c\x0e\xd1\x80\xee\xcc\x3e\x09\xe2\x27\x2a\x94\xdc\x7d\x24\xa4\xe8\x7a\x93\x1f\xe2\x49\x5c\xbf\x99\x2c\x0a\xae\x92\x01\xe0\x79\x62\x98\xf9\x36\x3d\xba\xc4\x75\xe8\xed"}, +{{0x93,0x2a,0x20,0x0e,0xce,0xe7,0x22,0x3f,0x24,0x14,0x62,0x83,0xa4,0x04,0x8c,0x67,0xa6,0xa2,0xd2,0xfc,0x4b,0xa0,0xf9,0x24,0x8b,0xdf,0xfd,0x82,0xc6,0xcc,0xe3,0xcb,},{0xec,0x9b,0xfb,0x7a,0x6d,0x04,0xe7,0x26,0xfc,0x1e,0xa0,0xc4,0x24,0x61,0x0d,0xcb,0x79,0x67,0xbf,0x15,0xd6,0xd6,0x62,0x68,0x58,0xd4,0x11,0x19,0x8d,0x40,0xe2,0x39,},{0xcd,0x1e,0x4b,0xdf,0x4a,0x3e,0x4a,0x31,0xd6,0x52,0x54,0x33,0x3c,0x8c,0xc4,0x08,0x7e,0x4c,0xc4,0x0b,0x02,0xe2,0xa3,0x47,0xd0,0x9a,0x3d,0xde,0x69,0x84,0x90,0xc0,0x87,0xd7,0x10,0x9a,0xd0,0x20,0x9c,0x53,0xe9,0x87,0x58,0x9c,0xbf,0x3c,0xe2,0x64,0x12,0xa2,0xb0,0x2c,0xb8,0xa3,0xbc,0x93,0xfe,0xc7,0x5a,0xb5,0xd2,0xc3,0x87,0x03,},"\xdf\x95\x32\x07\x04\x82\x13\xaf\xb8\xe2\xaf\x45\x2c\x88\x9a\x21\xca\x13\x6a\x68\xc9\x29\xbd\xc8\x24\xf9\xa8\x9a\xc5\x96\xdc\xb9\x00\x19\xa4\x6f\xb6\x82\xbc\xfd\x96\x2f\xcc\xb2\x7d\x00\xba\xf8\xec\xca\xf9\xd9\xa7\xd8\x18\x3c\xab\xd7\xdf\xa5\x06\xf7\xba\xfb\x49\x35\xab\x04\x59\x31\xff\x8f\xae\xb7\x16\x31\xf9\xed\x6b\xb8\xf8\x47\x3a\xd6\x29\x0d\x7c\xf5\x19\xdb\x31\x0a\x44\x42\xc4\x61\x11\x8f\x67\xd1\xa6\xd1\x03\xba\xe6\xf2\x69\x7c\x94\xb7\x42\x6d\x9e\x02\xe3\xcb\x95\x22\xfd\x0b\x44\xae\xf6\x00\xc9\x62\xfe\xff\x58\x73\xd9\x8c\x27\x90\x88\x7b\x8e\x88\xd1\x60\x82\x4f\x1b\xba\x22\x01\x76\x39\xf8\xdc\xe6\x8f\x74\x34\x80\xde\xea\x1f\x92\xaa\x1f\xd4\x13\x5d\xd0\x64\x57\xa6\x0f\x36\xb7\xd7\xf5\x17\xd4\x0c\x94\xc0\xdd\xdc\x2e\x46\x58\x47\xd9\x09\xb9\xf6\x82\x45\xff\x2b\x42\x1d\x59\x19\x00\x1a\xae\x5a\xef\x24\xe0\x2c\x00\x2d\xa9\x07\xe8\x60\x5f\x16\x0e\xa6\x09\x6b\x58\x0b\x75\xce\xa0\x22\xd4\x02\xf7\xf5\xfd\xc4\x64\xf8\x7f\x78\xc7\x90\x6a\x01\xe8\xe4\x8f\xb5\xb3\x51\x74\x61\x2b\x48\xac\x8b\xc7\x50\xe0\xf3\xae\xb0\xa1\x2f\x7d\xfc\x09\xb0\x84\x2c\x17\x80\xa5\xfd\x9c\x54\xaf\xb9\x39\x9b\x94\x08\xba\xac\xcd\xa2\x0a\xfb\xe3\xd6\x82\x24\x8d\x7b\xf1\xef\xde\xf4\x90\x5a\x31\x9b\x0f\xfb\x10\x8b\x75\x3b\x71\xcc\x97\xe9\xe2\x1e\xc9\xb3\xdd\x28\xce\xe0\x39\xd9\x41\x8a\x11\x35\xf0\xad\xd0\x92\xaa\x66\x31\x2e\xa2\x91\x33\x00\xd1\xcc\x89\x16\x52\x43\x02\xbd\x3d\x1b\x09\xe6\xb2\x9c\x68\x57\xcb\xdc\x56\xef\x4b\x3f\x35\xd8\xee\x67\x72\x08\xef\xfa\x84\x6f\xdb\x06\x6b\x05\xeb\x71\x7b\x4d\x45\x12\x0c\xab\x72\xa7\xdb\x7a\x7c\xa8\x46\xe8\x7b\x16\xb6\x90\x47\xeb\x76\xd8\xf1\x8d\xa8\xe1\x39\x9e\xc0\xa8\xc9\xc3\x28\xcb\xe6\x0e\x0b\xf4\x20\x44\xd2\xeb\xf2\x81\x8b\x3c\x04\x75\x88\x45\x2f\xcd\x2b\x3e\xfc\x1e\x10\x09\xae\x07\x68\x87\x27\xdb\x8f\xb6\xdf\x2a\x2f\xe7\x5d\x1c\xf2\x2f\x32\xba\xc0\x9c\x82\xa6\xa3\xd7\xee\xd7\xd0\x05\x08\xcb\xe5\xb7\x24\x60\xec\xfc\xdd\x3e\xe9\x11\xef\xe5\x89\x8d\xbd\x8e\x4c\xe8\x59\x13\x26\xdd\x15\x22\xf9\xd2\x55\xda\x86\x1b\xf9\xeb\x2a\x1d\x57\x25\xd7\xd5\xd4\x27\x34\x03\x41\x94\x5e\x7b\xca\x8c\xf2\xff\x8a\x99\x74\x50\x95\x3e\x77\xd2\x03\x68\x3e\x4b\x0d\xaf\xc3\x30\xe0\x56\x72\xd2\xec\xd1\x3a\x3f\x44\x2d\xf1\x37\x04\x4e\x0f\x55\x6f\xfb\xce\xff\xea\x26\xcb\xae\x26\xcb\xa6\xf2\x56\x8c\xf3\x9f\x90\x84\x89\xe1\xa9\x2e\x76\xaf\xbf\x29\x79\x95\xda\x4b\x2c\xb1\xab\xc9\xee\x1f\xe4\xdc\xa5\xaa\x83\x8b\x2f\xbd\xc1\x09\xe8\x9b\xef\x3c\xe5\xa3\x6e\x5b\x2f\x71\x2a\xc4\xc8\x89\x43\x82\x48\xfa\x5a\x21\x50\xca\xc6\xc9\x77\xb5\xe0\x54\x3f\x40\x10\xb7\x31\x47\x32\xfd\x18\xe7\xfd\x59\x82\xe8\x32\x76\x51\x9e\x78\x72\x5e\x5a\x5e\xeb\x86\xf4\x89\x20\x84\xae\x52\xda\x38\x49\xc2\x28\xc8\x09\xed\xbf\x69\xa2\xcc\x47\xc4\x78\xd1\x87\x19\xf1\x11\xd7\x37\x88\x7c\x7a\x2e\xb3\x25\x08\x98\xdb\x34\xe5\xe5\x07\x6f\xab\x9f\x4a\x9e\x6e\x19\x29\xa3\x48\x08\x36\xde\xa0\x7b\xa4\xd6\x3f\xce\xfc\xe5\x54\x34\x30\xa8"}, +{{0x5c,0x48,0x3e,0x83,0x7e,0xb0,0x1e,0xd5,0xa4,0xad,0x5d,0xb3,0x79,0x26,0x99,0x82,0x4d,0xf1,0x3e,0x57,0x6b,0xe9,0x67,0xd1,0x21,0x15,0xc8,0x5e,0x02,0x86,0xe6,0x28,},{0xfe,0x1a,0xa8,0xb0,0x69,0xda,0x56,0xe6,0x76,0xef,0x3a,0x57,0xd9,0xbb,0xa8,0x83,0x05,0xea,0x03,0x28,0x08,0xee,0x63,0x52,0x73,0xb3,0x7c,0x5c,0x63,0x5d,0xef,0x4e,},{0xc1,0x7c,0x2f,0xbf,0x8c,0x00,0xbc,0xea,0x30,0x35,0xbf,0x0a,0x62,0xd3,0x02,0x29,0xdb,0x74,0x2c,0xab,0x11,0x99,0x67,0x7c,0x7e,0xb4,0xeb,0x0e,0xf5,0xc7,0xb5,0x1a,0xd4,0x87,0xa4,0x97,0x1b,0x63,0x1e,0x79,0x4a,0x58,0xbb,0x08,0x23,0xcc,0x0f,0xe6,0x26,0x10,0xfd,0xa6,0xa9,0xe0,0x3f,0x8c,0x4c,0x33,0x81,0xcb,0x15,0x4c,0xef,0x0b,},"\x58\xd5\xe2\xcd\x89\x9b\xa9\x85\x37\x8b\x3e\xc3\x3e\x9a\x86\x98\x22\xb2\x3d\x5d\x89\x6a\x28\xf4\x24\xfc\xd6\xe4\xcc\x28\xb8\x0d\x4a\xaf\x2d\xe8\x04\x36\x7e\xfd\xf5\xe4\x23\xb1\x23\x4d\x82\x1d\x63\xac\x05\xea\xed\x12\xc7\x3e\x8e\x36\x08\xaf\x0d\xdc\xcc\x83\x86\xb7\xd8\x42\xb1\x2e\x60\xd3\x0c\xed\xe3\x25\x53\x94\x5e\x78\x29\xe9\xb2\x3f\x5c\xcc\x2e\x71\x03\xa0\x8f\x2c\xdd\x9e\x75\xa7\xb3\x6f\x5e\x63\x72\x0e\xf0\xd4\x9b\x25\x92\xbe\xf3\x74\x02\x68\xc8\x9c\x86\xa6\xcb\xdf\xe2\x01\xde\x0d\xb9\x98\x5c\xeb\x19\x39\x9c\x9a\x1d\x5b\xb0\x58\x6a\xf3\xc8\xcd\xf2\x71\x32\x99\xeb\x04\x43\xa5\x41\xa4\x73\x84\x60\x72\x43\xc5\x4a\x05\x91\x50\x58\x36\x7d\x3f\x2d\xb3\x80\xed\x31\x7a\x8c\x12\xc7\xa6\x3e\x80\x9c\x2e\x84\xd4\xac\xb9\xd9\xee\xf5\x4c\x6f\x5a\xf7\xab\x59\xcb\x91\x68\xb1\x06\x8f\x9d\x2c\xcd\x97\x8f\xe7\x21\xba\xd6\x8a\x66\x9f\xfe\xde\xa3\xe9\x2c\x76\xb3\x2e\x31\x66\x65\x8e\xe3\xbd\x0d\xeb\x1b\x08\x41\x94\xce\x35\xd9\xa7\x41\xc5\x7f\xc2\x24\x1e\x68\xef\xaa\x65\x32\x0b\x23\xa1\xdd\x19\xea\x8b\x7e\xc8\x1e\x76\xf1\xe9\x16\x3f\x95\x92\xee\xee\x5a\xf8\xec\xed\x02\x72\xf3\x35\x12\xd0\xd4\xca\x06\x7f\x05\x55\x1b\x26\x53\x96\xe1\x00\x14\x78\x3c\xac\xac\x79\x43\x7b\x19\x84\x2d\xe6\xab\x91\xb9\xd9\x23\xbb\xeb\x50\x33\x25\xbc\x54\x86\x9f\x66\x3e\x6e\xa4\xae\x68\x97\x70\x1b\xe7\xe1\x1d\x16\xcd\xfa\xe0\xee\xe8\x61\x86\x20\x00\xe7\xa4\x16\x07\x81\x54\x7e\x42\x52\x6a\xf5\x1b\xa9\x69\x8d\x23\x4a\xaf\x51\x0d\xa8\x1a\x0d\xbf\x26\x43\x66\x15\x3d\x7a\x6d\x5e\xb3\xfb\x08\xb9\xbb\x5e\xa0\x65\xc2\xf5\xe5\xb6\xbb\x67\x9d\x2e\x21\x0b\x5b\x40\xe2\xbc\x82\xf7\x8d\xc9\xab\x58\x24\xb7\x4a\xad\xad\xd8\x9b\xf8\xa8\xb7\x3a\x0a\x2f\x43\xac\x74\x83\x78\x92\x1a\x73\xa2\x52\x70\x4a\x4a\xdb\xf7\x40\xcb\x99\xc1\xe1\x59\x4c\x37\xac\x9a\xcc\x19\xf5\x23\x15\xc6\xa8\x46\xa5\x7b\x36\x12\x8c\x64\xd7\x67\xaf\x44\xe9\xc8\x63\x05\xbf\x18\xba\x7c\xd5\x26\x80\x52\x3a\x3b\x10\x2f\xba\x6f\xe5\x55\x67\x06\x9d\x20\x47\xcb\xdd\x96\x05\xea\x12\xc8\x87\x7d\x39\x9c\x1e\x66\xe3\x38\x17\x73\x1f\x50\xb8\x4f\x81\x7d\x1f\x07\x60\xa4\x0f\x97\x46\x86\x18\x93\x41\x05\xeb\x00\xec\x50\xc7\x6d\xb3\xc5\x3f\xcf\x43\xfe\x17\x02\x90\x7d\x9a\x75\x6b\xcf\x43\x9f\x88\x31\xd0\xbf\xac\x92\xe7\x05\x8f\xb1\x57\xbe\x3e\x59\x1d\x37\xeb\x34\x16\x5e\x3c\x6f\xc6\x0e\x72\x29\x4c\x08\x3e\x47\x76\x26\xf9\x00\x1c\x1d\x73\x7c\x29\x03\x77\xdf\xa5\x8e\xa4\xea\xd3\x02\x8f\xc7\x62\xce\x8a\x3a\xfe\xc2\xe6\xe1\x32\xc6\x62\xdf\x60\x34\xab\x55\x4f\x93\xef\xac\x65\x7a\xd3\x4f\x61\x07\xd3\x47\xfc\x5c\x5e\x53\xf3\x73\x3e\x17\x8b\x76\x01\x4d\x2f\x9b\xbd\x06\xef\x2d\xfe\x60\xe2\x08\x3d\x88\x65\xf7\xf5\xb2\xac\xc0\x25\xd9\x12\xe5\xcf\x6c\xda\x6e\x79\x81\x43\xe9\xdb\xbc\x70\xa0\x21\x1d\x8e\x40\x03\xd7\x8b\x38\x3d\x66\xa6\xad\x29\x71\x7c\xa2\x4e\xdd\xef\x7d\xf7\xcd\x3a\x7e\xf6\x52\xab\xa5\x48\x7a\xfe\x5d\x02\x6c\x9b\x10\x28\x07\x29\x4e\xb2\x7d\x98\x24\xee\xb6\xb4\x0f\x08\x3d\xe7"}, +{{0xb0,0xd0,0xab,0xdd,0x84,0x44,0xe1,0x0f,0x29,0x37,0x54,0xac,0x9f,0x16,0xe3,0x1b,0xdc,0xdd,0x97,0xb7,0x06,0x71,0x28,0xaa,0xe8,0xe4,0xd7,0xf1,0x12,0x89,0xe2,0xcd,},{0x1c,0x78,0xcc,0x01,0xbe,0xa1,0x53,0x52,0xb6,0x3c,0x56,0x97,0xf1,0xcf,0xe1,0x2f,0xfd,0xd1,0x6d,0xdc,0x1d,0x59,0xe7,0x79,0x51,0xb6,0xe9,0x40,0x8e,0xe2,0x28,0xad,},{0x64,0x40,0x8b,0xdd,0x2d,0x0f,0xc8,0x92,0xa5,0xb6,0x2b,0x5a,0xcf,0x8e,0x3b,0x3c,0x73,0xc0,0xb5,0xc4,0xfa,0x2a,0x72,0xe3,0x9d,0xd6,0x08,0xd4,0x93,0x7f,0x93,0x32,0xf7,0x3e,0x14,0xd0,0x8b,0xad,0xc6,0x27,0x01,0x14,0xd1,0xf1,0xa5,0x56,0xcc,0x6e,0xe8,0x48,0x8a,0xbb,0x90,0x7f,0x79,0xae,0x17,0x5c,0x35,0x2e,0x9f,0x11,0xee,0x05,},"\xaa\x27\x6c\xc5\x43\xfc\xc6\x2d\x70\xa7\x04\x60\x8d\x98\xce\x51\xb6\x45\xb5\xc2\x4a\x64\x0a\x5d\xf1\x0a\x55\x91\x41\x7d\x10\x89\x26\xdf\x3f\x0c\xe1\xb9\x21\x03\x33\x09\xeb\x8d\x86\x59\xf4\x89\xfd\x6f\x79\xaa\x1b\xf4\x88\x2d\x72\xac\x69\xcc\x58\xd3\xbc\xe0\xfa\x89\xb1\x64\x11\xe9\x75\x3e\xb4\x0c\x6c\x4d\x59\x8d\xc8\xf4\xab\xb0\xbc\x48\xf1\x37\x03\x71\x32\x6c\x9a\x86\xbb\xc2\xac\x62\x14\x47\x8e\x78\xa3\x84\x08\xbd\xda\xfa\xa9\x59\x26\x00\xc4\x9a\x12\x9c\x05\x39\x2f\x8a\x7d\x64\x2b\x49\x13\x7a\x20\xf3\xfe\x9f\x11\xee\x17\xcf\xa3\xaf\xd2\xaf\x71\x56\x5e\x9c\x40\x08\x0b\x60\xcd\x0d\xbc\x37\x8e\xda\x06\x2c\x7c\xbc\x7f\xe9\x72\xbd\xe4\x50\x9a\x1d\xe9\x5f\x14\xdf\x48\x2f\x48\xaa\xcc\x46\x3c\xd5\x94\xf6\x6d\x64\x8d\x37\x94\x73\x8a\xd6\xab\x49\x6e\x2d\xa5\x0b\x0d\xb2\xba\x7b\x65\x91\x85\xe4\x58\x7f\x18\x2e\x83\x3d\xe7\x50\xfa\xac\xdd\xf2\x1a\xf5\xe0\xcf\x4c\x9a\xf3\x85\xb0\x4f\x7b\xe2\x31\x49\x8a\xd0\xb7\x42\xd5\xa8\x7c\x06\x11\x5d\xb2\x30\x97\x3a\x51\x42\x7f\x20\x2f\xa3\x9a\xfb\x98\x28\xb5\xf0\x3f\xa3\x27\xcb\xd5\x2d\xfe\xc6\x6d\x71\xea\x31\x98\x65\xdc\xf6\x81\x0f\x18\x58\x47\x2d\x8b\xea\x3e\x44\x7a\xdf\xb4\xb6\x07\x58\xe8\x6b\x48\x13\x37\x09\x73\x2d\x2b\xcf\x51\xc7\x6c\xaa\x84\x7b\x65\x37\xfc\xb0\x5b\xb8\xc8\x7d\xc5\xe9\xfb\x02\x2b\x32\x60\xc1\xd7\x1b\x14\x98\x59\xc9\x66\x3d\xbd\xae\x6a\x7b\xbf\xd6\xde\xb9\xd1\x23\x80\x9c\x24\x14\x01\xaf\x10\x71\x9c\xf9\x1a\x6b\xed\x16\x08\x4c\x44\x46\x07\x35\x9e\xd8\xf0\x18\xdb\x11\x15\x11\x89\x2b\x46\xbd\xac\x6c\x9c\x61\x38\x41\xde\xd8\x86\xb9\xde\xc0\x6c\x01\xe8\x04\x87\xe4\x8f\xbe\x77\x8e\x9e\x97\x50\x8f\xfd\xa0\x57\x78\x53\xaa\xbd\xca\xca\x8b\x0b\xab\x6c\xe4\x15\x57\xaa\xb9\x63\x1c\x96\xd6\x09\x77\xe3\x57\x18\xb6\x05\x95\x27\x3f\xdb\xa1\x40\xf5\x50\x0a\x8d\x35\x76\xf5\xa9\xfc\x8f\x3c\xa4\xc0\x2c\x16\x7a\xf2\xe0\x3d\x25\x75\x0b\x42\xad\xb0\x3b\x14\x17\xf2\xb6\xd2\x19\xbe\x5f\x84\x29\x33\x1a\x26\xa4\x49\xb5\xd4\xdb\x2b\x1a\x09\x15\x2e\xea\x2b\x25\xd2\xdf\x7e\xf6\xfe\x0a\x32\xe2\x5f\xae\x79\x36\x0a\x9a\xee\x15\x11\xfd\xa8\x06\x45\x50\x93\x7a\x71\x30\x97\x19\x30\xc6\x73\xbb\x35\x8e\x5f\x55\x95\x1f\x50\xb1\x46\xd8\x5d\x38\x3f\x3e\x01\xc1\x51\xec\xe6\xc0\x6d\x83\x67\x01\x25\x32\x80\xfd\xcf\xf4\xe1\x39\xd3\x31\x9a\xb2\xe2\xca\x71\xbc\xc3\xfa\x0f\xaf\x7c\x70\x2c\x9c\x60\x4e\x56\x51\xde\x4a\xf5\x70\x0e\x9e\xde\x72\x58\xb9\xbc\x14\x8d\x55\x95\xcd\x34\x17\x0e\x3e\x5c\xf2\x92\x82\x83\x90\x90\x8f\xda\x96\x1f\x22\x30\xac\x0b\x8c\xac\x64\x73\x97\x32\x70\x6c\xe2\xd5\xe5\x9a\xbd\x6d\x5e\x20\x7b\xda\xfe\xa7\x4d\x28\xd7\xa7\x58\xf2\x20\x0e\x4e\x00\xa0\xbc\xf0\x30\x6a\x3c\xab\xda\x47\x02\x4f\xab\xea\xe4\x88\xab\x5c\x32\x37\x15\xcf\x3c\xa7\x72\x0a\xf9\xeb\xbf\x85\x82\xe1\x15\x8a\x09\x9d\x73\x6b\x56\x9b\x9d\x40\x29\x58\x17\xea\x25\x54\x06\x8b\xef\x32\x44\x2c\x11\x1e\xc8\x14\xc6\xed\x41\x59\x19\xba\x73\x52\x63\x34\xdf\x30\xba\xc6\x66\x08\x4e\x56\x01\xc2\x28\x1c"}, +{{0x49,0x84,0x97,0xfd,0xcc,0x6a,0x10,0x58,0x91,0xe0,0x23,0xff,0x32,0xd7,0x5f,0x7c,0x37,0x48,0xd8,0xc5,0x2d,0x87,0xdd,0x3b,0x27,0x75,0xae,0xfd,0x81,0x60,0xa1,0x43,},{0x2d,0x79,0xae,0x9c,0xee,0x4a,0xc6,0x27,0x5b,0x05,0x74,0x9c,0x43,0x8e,0xbe,0x55,0x2b,0x41,0x3d,0x87,0x3c,0xc0,0x7f,0x14,0xf5,0xfa,0x13,0x01,0x77,0x21,0x4c,0x54,},{0xb0,0xa3,0x6a,0x2c,0x93,0x47,0x56,0x34,0x8e,0xb4,0x7c,0x25,0xa3,0x2c,0x3f,0x2a,0x5d,0xdb,0xd5,0x8f,0xcc,0x72,0xa0,0x8c,0x3c,0xea,0xd1,0xa2,0xd9,0x00,0x33,0x5c,0x30,0x01,0xe3,0x5b,0xfe,0x1f,0x3f,0xb5,0xa5,0x55,0x00,0x9b,0xa8,0xe9,0x68,0x74,0x49,0x4b,0x97,0xe8,0xb0,0x97,0x00,0xed,0xcb,0x1f,0x25,0x84,0xb9,0xd0,0xfe,0x03,},"\xbe\x38\xbc\x8c\xdf\x46\x19\x0e\x30\x4a\xb5\x3d\xd2\x9c\x2b\xc4\x09\x54\xfd\x4c\x6d\x2b\xb9\x90\xf9\x3b\x2b\x5c\x69\x1f\xdf\x05\x27\xc2\x60\xf5\x06\x61\x87\xf2\xd0\xf3\x1f\x43\xa0\x8b\x36\x0e\xa1\xed\x82\x00\x65\x17\x64\xb8\xfa\x49\x59\x5a\x15\x94\x10\x9e\x49\x67\x59\xab\x66\x23\xfa\x33\x37\x8d\x80\x0e\x61\x17\xe0\x79\xe1\x3f\xe8\x5c\x81\xb6\x3e\xbe\x24\x7b\x3d\xf6\xc1\x58\x4b\xc7\xcf\xfb\xdf\xa4\x5f\x2a\x2c\xe7\xc2\x37\xaa\xaf\xef\x8c\xbc\xa7\x0b\xca\xbc\xe0\xb8\x47\xd5\x51\xf4\x6a\x7d\x15\xce\x2a\x0d\x3d\x54\x5a\xba\xcc\x59\x30\x01\x0c\x53\x64\x88\x87\xd4\x76\xe0\xd1\x3a\x34\xfc\x1c\x54\xdf\x09\xd1\x06\xed\x75\x8d\xee\xdc\x76\x1d\x55\x7a\x73\xb2\xbc\xdd\xde\xfb\xa4\xed\x00\x59\x97\xb1\x92\x79\xb9\xd2\xde\x37\xd0\x41\xfe\x01\x3e\xef\x05\xa2\xe1\x1c\x9a\x23\x4e\x87\xcc\x0e\x16\xc0\xc6\xda\x42\xaa\xa5\xbf\x99\x64\x17\xbf\x64\xe5\xb7\x85\xd6\x7d\xc3\x25\x47\xc1\xf0\x52\x17\x8d\x69\x4c\xf2\x0f\x16\x98\x58\x9e\x7e\xd4\x9b\xe2\x9d\xd5\x9f\xd5\xc0\x1b\xa1\xd9\xf5\xfb\x06\xa7\x58\x95\xb7\xb1\xe1\x58\x95\x09\x7e\xbd\xe8\x4c\xad\x63\x03\xaa\x0a\x86\xdb\xc3\x24\x74\x7d\x97\x24\x5d\x70\xc5\x20\x3b\xe0\x1b\x06\xcb\xde\x06\xae\x03\x72\x04\xd2\x37\x30\xcd\x69\x61\x89\xf7\xac\x26\x7c\xf2\x02\x17\x99\x29\xce\x54\x10\xe0\xe3\xad\xe5\x13\xd2\x20\x1b\xfd\x20\xfe\xfa\x40\xb4\x47\x6f\x27\xbf\x90\x7c\x76\x2e\xb7\x26\x2a\x5b\xe1\x3c\xfc\x04\x7a\x84\x6d\x20\xa9\xf2\x31\x1b\x64\x69\xb0\x6a\xb5\x45\xf0\xec\x9f\xc4\x46\xea\x25\x0c\xd3\xb7\x3a\x7b\x6b\x96\x0c\x10\xca\x4c\x2d\x6c\x64\xa1\x56\xa1\x8c\x9f\xb8\x10\xe4\x9a\xfd\x0c\x36\xda\xab\x8b\x8b\x85\x66\x43\xa4\xcc\xaf\xa9\xad\x88\x6e\x91\xe5\x44\x53\x5b\x8e\xdd\xa2\x7c\x90\xc0\x6a\xb6\xbc\xc5\x36\x28\xbe\x18\xd7\xd6\x36\x9c\xa1\x80\x1f\x91\xc2\xe0\xb9\x5f\x36\xd7\x02\xf7\x72\x34\xb4\x10\x07\x19\xc0\x59\x95\x1e\x45\xb1\xf9\x16\x98\x39\x34\xe3\x2b\x4d\x4d\x8f\x29\xc0\xa3\x73\xf8\xd8\xf0\x91\x8b\x96\x78\x65\xcd\x0e\x4b\xec\xa0\x13\x27\xc9\x9d\x5f\xde\xd4\xc1\xa6\x9a\xc2\xd4\xd9\xb7\x8f\xfb\x83\x05\x67\x00\x21\x04\x02\x50\xcc\x27\x73\x7e\x75\xdf\x75\x76\x0f\xec\x8b\x8d\x30\xb2\x45\x65\x4f\x3c\x12\xf1\xf7\xce\xa0\xbc\xe7\x8a\xb3\x69\x35\x78\xaf\x3e\xa6\x1f\xfc\xcd\xf9\xba\xf7\xc3\xea\x65\xb8\x8f\xc8\x54\x12\x81\x26\x47\x67\x96\x89\x2c\x66\x3b\xd1\x45\x18\xc9\x91\x86\x29\xa1\x09\x5f\x61\x4e\x04\x92\x44\x6c\x3d\x84\xb1\x6e\xc9\x4f\x7e\xca\xda\xeb\x6b\x65\x9b\xbb\x48\x67\xb5\x79\x06\x17\x14\xfd\x5b\xb0\xfa\xa4\xad\x6b\xe0\xff\xb3\x88\x8b\xea\x44\x7e\x4e\x34\x38\xc8\xf0\xea\xe6\x44\xfb\xd4\x5a\x38\x02\xdc\x40\xec\x45\x1b\x21\x2b\xd5\x92\xda\xcd\x4d\xa9\x66\x86\xdc\x8b\x20\x24\x25\x7f\x25\xe9\xc8\x30\xbf\xf7\x95\xee\xe8\x5d\x87\xa0\x90\xc1\xa4\x23\x21\xe7\x10\x55\x57\x64\xed\x82\x57\xc9\x41\x5c\x7f\x22\x4b\x53\x75\x58\xce\xfd\xc6\x15\x12\x9f\x28\x35\x02\x67\xc0\x1b\xa0\x40\x3e\x07\xf5\xc6\x06\x7f\x91\xc8\x5a\x2c\x50\xc8\x66\xdc\x43\x88\xaf\x38\xd2\x16\x02\x03"}, +{{0xd9,0x62,0xa6,0x71,0x9e,0x5c,0xc7,0x72,0x4c,0xa4,0xa1,0xd5,0x59,0x53,0x68,0x12,0xb4,0xe2,0x2a,0xa7,0xbc,0xb1,0x3e,0x4f,0xb1,0x72,0x2d,0x28,0xe0,0x45,0x21,0x7c,},{0xa9,0x44,0x59,0x2d,0xbc,0x7d,0x77,0x03,0x9d,0x72,0x02,0x56,0xc3,0xfd,0x34,0x0d,0x34,0xdb,0x89,0x2a,0xb1,0x3e,0x48,0x12,0xd6,0x62,0xe2,0x84,0x0c,0x28,0xb6,0xd0,},{0xdf,0xb9,0xb6,0x35,0xac,0x0e,0xdf,0x83,0xb7,0xb5,0x9d,0x0b,0x84,0x09,0xaf,0x47,0x5f,0x66,0xfc,0x99,0x46,0xaf,0x0b,0x7c,0x63,0xab,0x8c,0xf5,0x92,0x9d,0x47,0x01,0xa1,0xbf,0x66,0x95,0x9c,0xde,0x62,0xfb,0xcf,0x59,0xa4,0x8a,0xb3,0xbb,0xaf,0x0b,0x9a,0x61,0xb6,0xe0,0x0b,0x21,0x81,0xeb,0x93,0x42,0x82,0x07,0x0a,0x5d,0x53,0x00,},"\xa6\xaa\x7a\x19\x0d\x00\x3a\xb1\x75\x33\x2b\x8f\x58\xe7\xca\xeb\x69\x08\x54\xd9\xdb\x56\xdb\xb6\x95\x7b\x3f\xb6\x54\xe2\xe0\xda\x99\x1f\x31\x54\x21\x42\x04\x13\x5d\xf1\xe1\x10\x43\x17\xc9\xe3\xc5\x8e\xed\xff\x1f\xc6\x1a\xba\x57\x74\x4c\x0c\x7e\xf4\x86\x00\x0a\x70\xb2\xc1\x42\xeb\xad\xdc\x07\xab\x06\x5e\x2a\x85\x5d\xaf\x19\x8a\x68\x03\xac\x24\xef\x37\x24\x48\x7c\x13\x51\xdd\xed\xa0\x51\x39\x13\x45\x7d\x76\x86\x0d\x78\xa9\xb6\xbc\x3d\xba\x66\xc4\x0e\x5f\xc3\x49\xa8\x73\xad\x60\x65\xce\x7d\x7f\xdc\x2c\xc4\x83\xb3\xae\xfb\xf2\xf0\x3d\xd6\x69\xbd\x9c\xb8\xf6\x3c\xee\x47\x78\x5c\xac\xb0\x9d\x87\x2c\x9a\xeb\x83\xe9\x86\x84\x05\x25\x43\x24\x03\x79\x82\xe0\x86\x13\x45\x5d\x95\x21\xd8\x8e\xa2\xfd\xa0\x20\xbe\x73\x0c\xfc\x8c\x07\xcb\x0b\x37\x61\x4c\xcb\xa2\xfa\x3e\xc4\x98\xb8\x15\xbb\x5a\xdb\x99\x6e\x84\x8b\x38\xc0\x15\xa6\xa5\xc7\x52\xeb\xda\xc7\xb9\xee\xd8\xb6\x96\x19\xd8\xc8\x46\xb6\x6f\x78\x16\xd1\xdf\x1e\xbc\x21\x07\x1c\xef\x0b\x25\x1e\x2e\xab\x59\x82\x7f\x6d\x60\x55\x08\x43\x70\xfd\x27\xc2\x03\xe8\x6a\x18\x9f\x1e\xe1\x1e\x84\x03\xab\xdc\xbd\x1f\x45\x34\x1a\x82\x05\x25\xd8\x63\x7d\xc4\x84\xa5\x18\x5d\x65\x51\xcb\x88\x2a\x96\xb9\x98\x1a\x5f\x1a\x82\x1f\x27\xb6\x56\xff\xf9\x0e\x7f\x69\xbf\x28\x6f\x75\x2f\x97\x0f\xfc\xa5\xc5\x3e\x08\x50\xb2\x0b\x94\xf9\x43\x16\x27\x09\x4a\xce\xa9\x12\xa8\x80\xb7\x49\xa6\xf8\x0b\xb2\x06\xcc\xaa\x74\x6f\xa7\x0c\x83\x3c\x9f\x32\x30\x89\xce\x05\x58\xc9\xdc\x20\x0d\x57\x39\xd1\xe4\x99\x63\x4f\x2c\x16\xe5\x4b\x7f\x6d\x78\x19\xc4\x70\x71\xb6\x0b\xd5\x4d\xd0\xf2\x73\xa3\x19\x75\x0f\xd3\xc5\x10\xa4\x9a\xb5\x6f\x63\x0c\x7c\xe6\xd8\x02\x3d\x97\x86\x23\x46\x85\x9b\xc0\xb4\xd6\x05\x22\x49\x69\x70\x89\x03\x76\x03\x01\x40\x9c\x60\xab\x25\x17\x56\x11\xf0\xbe\x98\xb2\x3a\x8c\xd8\xac\x53\x5e\x35\x13\xbc\x77\xe1\x45\x21\x93\xda\xdf\x44\x35\xe6\x3c\x36\x29\xb6\x66\xa5\xea\x4c\x4b\xad\x36\xea\xca\xd2\x60\x14\x04\xea\xbd\x8d\x9a\x07\x95\x6e\xc2\xb4\xb7\xbb\x63\x36\xed\x75\xb8\xdf\x8f\x16\xde\x42\xc0\xfc\xae\x93\x65\x2e\x3c\x40\x7c\xbd\x45\xe8\xd4\x13\xef\x51\xe8\x54\x2d\xf6\x25\x12\xee\x79\x3e\x41\x35\x8a\x1d\xe1\x92\x46\xc6\x58\x6b\x3c\x14\x07\x41\x04\x21\xf6\xe8\x65\xc7\x5a\x9f\x4a\x6a\x47\x88\xf8\x4a\x9c\x78\x1d\x8f\x80\x24\xbf\xdb\xe2\x5b\xdc\x7d\x4b\x69\xcb\xaa\x77\x19\x62\x8c\x0b\x07\xec\x2c\x4a\x23\x4f\xff\x4a\xc3\xd4\x93\x5b\x9c\xe4\xc8\xa1\x69\x47\xab\xe7\x95\x1f\xf8\xd9\xac\x92\x15\xe3\x38\xfa\x0f\xe9\x12\x41\x76\xd1\x7b\xac\x1e\x05\x59\x2c\x43\x98\x68\xae\x5a\x4f\x75\xfd\x1e\xa8\x2a\xa4\x54\xc2\x0a\x93\x9d\xed\xa7\x29\xa0\xe1\x96\x46\xce\xbd\x82\x20\x49\xc8\x25\xc7\xe3\x1c\x6e\xfa\xd4\x5e\x30\x6f\x2d\x9f\x05\x69\xe0\x71\x73\x31\xf4\x80\x04\xc2\x6e\xbf\xe6\x8f\x38\x43\xe9\x0f\x80\x67\x03\x2d\x21\xe7\x86\xc8\x53\x9e\x01\xbe\x3c\xea\xc5\x95\x4a\x05\x46\xc8\x4b\x73\x4d\x99\x94\x56\xa7\xc4\x5f\x8c\xeb\xaa\x47\x8e\x54\x80\x07\xf9\xd3\xaf\x83\x6f\x75\x4d\xe4\x12\x3f\x2f"}, +{{0xe1,0xd1,0x41,0x65,0x18,0x92,0x1d,0x07,0xc8,0xc3,0x9e,0x29,0x73,0xd8,0xea,0x12,0x49,0xca,0xa8,0xbf,0x65,0x9c,0xc3,0x6c,0x79,0x37,0xf8,0x4e,0xce,0x7a,0xd4,0xfc,},{0x48,0xbd,0xcc,0x3f,0x1a,0x5b,0x80,0x58,0xed,0x9a,0x32,0xef,0x1c,0xc4,0x8c,0xf7,0xa8,0xab,0x76,0xa6,0xe4,0x51,0x9e,0x5a,0x82,0x85,0x52,0x41,0xad,0x6f,0xff,0x8a,},{0x42,0x32,0xd2,0xa4,0x81,0x08,0x4d,0x11,0x96,0xdb,0x62,0xf2,0x2d,0xc7,0x4c,0xf2,0xea,0xf2,0xdb,0x0d,0xf0,0x5a,0xd7,0xcd,0xde,0x67,0xbf,0xc2,0x9b,0xff,0x56,0xcd,0xe0,0x19,0xac,0x9f,0x03,0xd8,0x1f,0x18,0x27,0xeb,0x1e,0x3b,0x0a,0xbe,0x02,0x04,0xca,0x7f,0x77,0xfa,0x87,0x4a,0xb5,0x26,0x83,0x54,0xff,0x08,0xbb,0x7f,0x48,0x00,},"\x3d\x26\x3d\xe1\xab\x91\xe8\xdd\x7b\x31\x7f\x7a\x27\xfb\x60\xa6\xe1\x83\x8c\x0c\x79\x3b\x03\xab\xbe\x70\x82\xb6\xbd\xa0\xc7\xc4\x60\x62\x26\x21\x92\xc8\x8b\x65\xc0\x26\xc1\x74\x58\x4d\x29\x64\x97\x10\x42\x9a\xe4\x4a\x46\x14\x0b\x4c\x82\xc8\xa0\xb7\x4d\x56\xa0\x04\xf8\xe2\xf5\xc1\x8f\x84\xf0\x46\x41\x53\x77\x2f\x83\x12\x63\x3f\xc6\xad\x28\xa7\xd9\xfb\x55\xf7\xd7\x8c\xd6\x48\x8c\xa5\x81\x17\xea\xf9\x23\xfa\x28\x87\x5e\x2b\x31\x89\x89\x31\x85\xaa\x3c\xcd\x04\x4d\x3f\x11\x0e\x2e\x7c\xab\xdf\x6f\x81\x4b\x9f\xdd\x67\x33\xbd\x5f\x30\x7a\x87\xbc\x73\xb6\x25\x0d\x58\x83\x93\x6d\xeb\x1d\xb0\xe0\xaf\x1b\xe7\xab\x32\x9b\x5c\x6b\xd9\x35\xbd\x8f\x8d\xc8\x88\xf0\xd1\xc4\x64\xed\xbc\x02\x3c\xbc\x08\x07\x53\xee\x8f\x79\x9f\x10\x72\xba\xd1\x14\x4d\xfa\xa6\x15\xa5\x9e\x2a\xed\xc6\x62\xe8\x3c\xb1\xf8\xe5\x20\x96\xa7\xee\x48\x3b\xf8\x73\xb2\x5a\x0c\x04\xc1\x85\x1a\x0e\x87\x37\x50\x63\xaa\x1a\x94\xfa\x83\x5c\x05\x26\x40\x36\x6b\x79\xf7\x35\xd3\x28\x61\x97\xab\x32\xeb\xdb\x51\x23\xf6\xb4\x7a\xd3\xf4\x42\xc4\x4c\x53\x0a\x68\xf8\x51\x27\x59\xe9\xcf\x38\x6f\xba\x07\xb8\x06\x4b\xc8\xfe\x83\xe2\x45\x49\x5e\xc4\x5f\x89\x38\xf8\x25\x9d\xc8\x01\x62\x05\xf7\x8d\x39\x54\x44\x2e\xc1\xb4\x45\xd8\x3d\x95\xad\x18\x05\xa5\xe0\xe8\xb3\xd5\x6b\x87\x0a\x20\xda\x18\xd7\x4f\x26\xf5\x50\xa9\xc7\x53\x4a\x41\x44\xdc\xbc\x1c\x3c\xdb\xbe\x47\x0c\xc1\x53\x90\x50\x43\x08\x8f\xac\xf1\xd3\x03\x55\x9d\xe4\x1e\x96\xc0\xab\x40\x9b\xb3\x6d\xcf\x38\xcc\x90\x38\xa6\xa4\x90\x8d\xea\x82\xa6\x53\x19\x5c\x16\xf2\x90\xa7\xc3\xac\x48\x76\x36\xcc\x5b\xcb\x18\xd1\x5a\x14\xac\x62\x4c\x70\xb6\xf6\x46\x2b\xf2\x49\xe0\x00\xce\xe9\x24\x01\x8b\xdf\x7d\xde\x39\x11\x4c\xb4\xf6\x52\xe1\x22\xe8\x74\x4d\xa2\x8b\x05\x89\xe1\x28\x4d\x70\xd9\xf1\x06\xde\x16\xd0\x73\x64\x80\x80\xe6\x43\x7f\xf3\x84\xe6\x81\x77\xd5\xcb\x71\x8e\x2c\xe3\xf1\x7b\xa1\xe9\x90\xae\x3c\xe9\x40\x66\x01\x30\xe9\x37\x50\xb8\x2e\x2f\xb4\x1a\xa3\x69\x77\x45\x68\xd7\xcf\x28\x67\x25\xe3\xc5\x8f\x63\xe7\x3f\x86\x97\xae\xec\xc7\x17\xc5\xcf\x1a\xf7\xad\x74\xf4\x46\x29\x2c\x90\x5d\x84\xe2\x2b\x23\xd4\xe0\xd2\x60\x4b\xff\x48\xfe\xfc\x40\xc6\x20\x4b\x5e\x34\xc0\x42\x29\x2e\x53\xbe\xc9\x36\x01\x59\xa5\xcd\x97\xb2\xdf\x57\x86\xb8\xf5\xa2\x92\xc0\xb3\x9d\x14\xa8\x70\xa4\x58\x8e\x67\xbd\x12\xb2\xc2\xf7\xa4\x40\x84\x62\x85\x1d\x2a\xa7\x87\x97\x1d\x93\x15\x19\x0f\x42\xcc\x58\x8a\xf0\xd2\xdc\xd9\x1f\x31\xbb\x71\x5e\x92\x50\xf1\x19\x28\x14\xf7\xb8\xa2\x1f\xef\x45\x17\xb0\xcf\x8b\xb8\xa1\xa1\xa5\xf5\x00\xee\x21\x9d\xfb\x46\x13\x2e\xfe\x8e\x90\xbc\x49\x09\x3a\x55\x59\xf9\x68\x1b\x4f\xb5\x9e\x5b\xa9\xef\x3f\x05\xd3\x4e\xed\x03\x4c\x14\xd7\x7e\xe9\x5e\xbd\x76\xff\xa5\xaf\x0b\xef\xcb\xa1\x8f\xdf\x93\x2a\xf4\x85\x45\x10\xb7\x5d\xb0\x0a\x72\x57\xb2\x34\x88\x7d\x49\x60\x7d\xfd\x16\x18\x0d\xb5\x16\xc7\xa2\x0c\xcf\xca\xed\xa6\xae\xdf\xb6\xa2\x37\x7f\xbf\x31\xe6\x7b\x51\x76\x55\xdb\x73\xca\x29\xe1\x18\x62\x4d\x60\x80"}, +{{0x2b,0xf7,0x4f,0x00,0x4d,0x7d,0x0a,0xf7,0x3a,0x83,0xea,0x20,0x8c,0xc2,0x06,0x72,0x3d,0x18,0x8f,0x4c,0xf6,0x07,0xbc,0xad,0x4b,0x69,0x80,0x26,0x8f,0xf2,0x1f,0xa7,},{0x8f,0xdc,0xd9,0x93,0x52,0x43,0x8b,0xeb,0x52,0xf0,0xd1,0x74,0x2b,0xae,0x71,0x84,0x45,0x12,0xdd,0x06,0x85,0xaa,0xf1,0xc9,0x09,0xe3,0x8f,0xc4,0xb5,0xaa,0xb6,0xcc,},{0x3e,0xb5,0xb3,0x39,0xe1,0x91,0xa3,0xb6,0x16,0x85,0x45,0xda,0x5f,0xb0,0xca,0x9b,0xe2,0x09,0x04,0x39,0x19,0xb9,0xc7,0x0a,0x07,0xb4,0xa7,0xa3,0xbf,0x64,0xb1,0x02,0xf6,0xff,0xd6,0xd2,0xb0,0x25,0x59,0xdc,0x68,0x1e,0xd3,0xb9,0xc8,0x22,0x97,0xb2,0x01,0xdc,0x25,0xc4,0x97,0x38,0x80,0xe1,0x55,0xe1,0x3a,0x29,0x42,0x6e,0xb4,0x0d,},"\x89\x8e\x43\x03\xea\x5b\xeb\xd2\x00\xa5\xf7\x56\x2b\xe5\xf5\x03\x26\x40\xa3\xf5\xcc\xfa\x76\x42\x92\x04\x5a\x1a\x36\x8d\x02\xaa\x59\x10\x77\xd8\xf3\x04\xf7\x4d\xbd\xfc\x28\x07\x34\x45\x4e\xd8\xc2\x72\x7a\xff\x39\x2c\x10\x8c\x52\x6e\x52\x7e\x67\x2c\x53\x97\xb2\xd7\x7c\x01\xf7\x74\x1e\xf8\xdc\xc2\x51\x0e\xe8\x41\xb5\x9d\xd1\x0f\x4e\x1d\x3a\xc5\x01\xaf\x7c\xbd\xb8\x5b\xa3\x11\x29\xc2\x62\xfd\xe1\xa0\xc8\xbc\x83\xd6\xff\x94\x4b\x6b\xae\x3f\xa7\xfb\x62\x58\x7c\x68\x1d\x8e\x34\x29\x65\xc5\x70\x5f\xd1\xa6\xab\x39\xe5\xa0\x77\x0e\xe7\x79\x8d\x9f\xb6\xc0\x01\x8a\x51\x4d\x53\xaf\x84\x8d\xb6\x04\x7c\xd0\x2d\xb3\x52\xd5\x56\x3b\x53\x66\x23\x73\xb9\x71\x93\x5a\x1a\xc2\xb7\xb6\x36\x1d\xac\x67\x48\x77\x18\x13\xf7\x74\x93\x16\x69\x49\x61\xb9\x40\xff\x38\x05\x81\x1a\x49\xfa\x27\xa9\xba\x45\x7a\xd2\x88\x48\xc6\x97\x05\x0e\x01\x88\xd0\x77\x3e\x17\xfb\x52\x19\x4e\x19\x0a\x78\x72\xa3\x98\xf3\x1c\x0f\x0a\xe0\x65\x37\xa2\x73\xff\xb5\x0c\x2c\x81\x64\x45\xab\x88\x28\x11\x92\x2c\x06\x21\x55\x6c\x46\xa3\xa0\xec\x40\xbf\xed\xb4\x11\xe9\x0b\x6d\xb1\xdd\xd4\xbb\xeb\xb5\x7d\x10\xdf\x56\x6a\x63\xd7\x26\xa3\x33\x08\x51\x4c\xe3\xb4\x99\xd5\xe5\x26\xc2\x2b\x95\x6d\x8b\x99\x91\x3d\xcb\x13\xe4\x37\xe9\x47\xb6\x66\xc4\x1c\x54\xd8\xb3\xae\x23\x56\x64\x7e\x80\x17\xab\x67\x83\x86\xc9\x27\x21\x9a\xe7\xbd\xdc\x0d\x82\x12\x65\xf9\xdc\x4f\xf3\xf8\xce\x5b\xe6\x0f\x8e\x9d\xef\xc5\xca\x33\x50\x68\xee\x29\xfe\x83\x04\x91\x7b\x78\x87\x84\xa2\x38\x8a\x32\x01\x92\xf9\x32\x5d\x0e\x6c\xff\xfe\xa2\x1e\x6e\xaa\x29\xe7\x70\x7f\x63\xa9\xea\x4f\xbb\x25\x58\xe3\xd0\x83\x5b\xab\x1f\x52\x36\x10\x37\xae\x59\xe5\x03\xee\x96\xb9\xd7\x08\xa4\x7a\x3a\xe4\xba\xd1\x13\xe2\xa4\x60\xa2\x69\xcc\xf2\x5a\x00\x03\xcb\x3e\x68\xa5\x51\x86\x4e\x59\x84\x09\x14\x79\x11\x26\xf9\x54\x78\x8b\x25\xb5\xaf\x5a\xaf\x58\x6e\xbb\x87\xfa\x5f\x37\x7b\x4d\x7d\x7f\x84\xc0\x00\xdd\x2c\xb4\x40\xe2\x14\xd3\x8d\x5e\xcf\x70\xf2\x0e\x98\x81\x82\x8e\xda\xa1\xdb\xec\x37\x09\x3d\xb9\x60\x68\x6c\xa1\x23\xf1\xec\xba\x63\x36\xb3\x7f\x46\xcf\x76\x5b\xe2\x81\x4b\x9e\x67\x05\xbc\x9d\x6a\x49\x31\x81\x18\xc7\x52\x9b\x37\xc8\x4e\xc8\x8d\x58\xa8\x45\x3d\xcb\x69\x2c\x9a\x36\x01\x6b\x94\x8e\xbe\x6f\xb2\xc1\xd0\xad\xf5\xf1\x98\xee\x30\x97\xa6\xff\x0b\x8e\xeb\xba\xd8\xb0\x76\x93\x30\xb1\x86\x89\x51\x6b\xc0\xfe\x66\x8b\x0d\x05\xe3\xa5\x84\xfc\xf8\x9c\x49\xdb\x50\x1d\x61\xc2\xde\xf7\xed\x37\x22\x07\x01\x93\xa5\xb6\x83\xc5\x08\x7e\xf2\x74\xce\x6a\x19\x3d\xd4\xa3\x03\x53\x6c\x67\x93\x4b\x46\x60\xa8\x41\xee\x1b\x44\x6a\x68\x92\xb1\x4d\x0b\x0a\xa3\xe9\x8f\xdf\xfd\x43\xc7\x97\xad\xd3\x65\x83\xf7\x4c\x94\xd0\xe2\xd6\x8e\x2d\xe8\x18\xd9\xaf\x20\x05\x98\xf0\xb2\xbe\xae\x16\x9c\x8d\xfb\xc4\xd3\x97\xe6\xd1\xce\xb6\xda\xa6\xc9\xf6\xbb\xf4\xf8\x31\x1b\xa2\x6f\xfb\x19\x4d\x44\x21\x6c\x51\x30\x52\x67\x07\x4e\x85\x6a\x1d\x6e\x92\x27\x80\xf4\x79\x8e\x2f\x22\x02\x23\xff\xf1\xdc\x37\x0c\x8e\x34\x51\x4a\xba\x42\xdf\x51"}, +{{0xf5,0xf7,0xd5,0xb7,0x3c,0x5a,0x65,0x30,0x1b,0x5b,0x4c,0x67,0x10,0xed,0x12,0xc1,0x6e,0x79,0x03,0x17,0x7d,0xb7,0x92,0xca,0x71,0x5e,0x23,0x38,0x9d,0x05,0xd8,0x3e,},{0x7c,0x47,0x62,0xe9,0x79,0xf0,0xc7,0xe2,0x07,0xbe,0x18,0x43,0xe2,0x66,0x6a,0xca,0x27,0xea,0x89,0xbf,0xf5,0xb6,0x1d,0x57,0x3c,0x98,0x5f,0xc7,0x02,0x5e,0x1e,0x28,},{0x58,0xfb,0x39,0x2f,0x82,0xd5,0xe5,0x2f,0xf0,0x72,0xcc,0x77,0xef,0xe0,0x48,0xf2,0x23,0x52,0x50,0xc7,0x11,0x25,0xee,0x82,0x1c,0x5f,0x3b,0x39,0x3b,0xcf,0x2f,0xa4,0x6b,0xe4,0xc5,0xd8,0xca,0xf1,0x3c,0xb5,0x19,0xef,0xe0,0xc2,0xfa,0xd9,0xee,0x23,0x1a,0xe9,0xb6,0xfd,0x1f,0xd5,0x09,0xc9,0x8c,0x69,0xc2,0xd3,0x6c,0x75,0x3e,0x0e,},"\x7c\x93\x18\xd5\x6e\x63\xf1\x65\x35\x43\x6f\xa4\x5a\xfe\x27\x8e\x74\xe6\x18\x81\xbb\x46\x89\x97\xd0\x41\x8b\xc7\x20\xb6\x30\xda\xdb\x81\x28\xb4\xb6\x5c\xa6\xe9\x21\xe5\x01\x81\x3d\xf9\xfe\x03\xb4\xef\x0a\xae\x80\x35\xdd\x08\xc5\xf8\x20\xce\x5d\xf1\x2e\xe1\x18\xd9\xc3\x6d\x3b\x15\x1a\x52\xc3\xf9\x6a\xe1\xca\x4c\x82\xfd\x19\xda\x66\x9d\xdb\xa9\x4f\xeb\xf8\xea\xc8\xc4\x2b\x44\x7b\xab\xc8\xa6\x0b\x36\xe8\x03\x62\x4f\x7d\x20\x47\xbd\x8d\x8a\x15\x36\x87\xf1\x0d\xc1\xca\x82\x10\x0b\x7c\x87\xd3\x23\x70\xec\x8f\x26\x71\xed\x7d\x06\x7c\xc8\x05\x87\xca\xb8\xdb\x3a\x71\xce\x5e\x40\x63\x27\xf7\x63\xec\x1b\x3c\x16\x67\x70\xa7\x55\x36\x63\x0c\x81\x5f\xd8\x26\x75\x82\xd1\xb5\x05\x1f\x0f\x82\x1c\x02\x15\x0b\x2e\xef\x34\x9b\x50\x59\x03\x14\xaa\x25\x70\x79\x3f\xa6\x4a\x76\xed\x2e\xd8\x3d\x2b\xa1\xf9\xb9\xf1\x16\x31\x54\x61\x2b\x49\xa6\x4a\xd8\xd5\x57\x3c\x25\xb1\xcd\x37\xc4\x1a\x44\xe3\xdf\x78\xf1\x05\x3d\x90\xb0\x68\xf0\xd3\x7a\xe0\x0c\x4a\x32\xb1\xa3\xff\x87\x4c\x41\xda\x4a\x70\x43\x39\x2f\x18\xef\xe5\x51\x8d\x76\xe8\x8b\x41\xce\xd6\x9e\x6f\x4c\x01\x4f\x06\xeb\xc5\x14\x6e\x61\xe8\x2f\xae\x1c\x49\xc3\x7c\x39\x4f\xea\x34\x19\x9a\xb8\x6c\x11\xa4\x46\x7a\x37\x4e\x40\x25\x5a\x05\xd4\x26\x97\x14\x30\xd5\x6c\xdb\xa2\x5a\x21\xad\x77\x9c\xc7\xf6\x2d\x22\xcd\x87\xb6\x0f\x08\x91\xbd\x85\x6a\x51\x7e\x14\xb7\x2a\x9a\xc7\x67\x2e\x4e\x8f\xb3\x74\xa9\x75\x8a\xb0\xc4\xe5\x96\x4a\xae\x03\x22\x89\x73\xf1\x73\xa5\xd4\x2a\xef\x9d\xb3\x37\x36\xc3\xe1\x8d\x8e\xec\x20\x4a\x1a\x17\xb9\xd0\x45\x93\xde\xa4\xd8\x04\xcb\xc8\x1b\x9a\xc5\x45\x80\x50\x49\x55\x39\x99\x9a\x99\x85\x48\x7e\x7c\xa1\x1c\x37\x58\x2e\xf8\x5c\x84\x1e\x8f\x06\x5e\xa9\x8f\xdd\x6b\x1c\x60\xde\xa1\xec\x28\x83\x52\x15\x68\x85\x6a\x6e\xbb\x27\x49\xf2\x07\x2e\xb4\x34\x48\xbe\x07\x05\xed\x47\x7c\xf4\xb2\x00\x48\x65\x21\x7d\xe5\xfa\xdb\xe2\xa0\xf9\xd6\xb8\x4b\x3f\xe7\xf7\xbf\x6c\x77\x53\x74\x96\x24\x6e\xc7\x96\xb8\xef\x2c\x04\xf6\x8a\xb5\xb1\x4f\xce\x0c\x6d\x28\x7b\x83\x62\x27\xd9\xf0\x8f\xa0\xee\x19\x72\x2f\x67\x98\xa5\xd8\x28\x0d\x10\x7c\xfc\x1b\xd5\x92\xd9\xdd\xc7\x24\xea\x86\xfc\x39\xdc\x94\xa3\x94\x01\x9e\x3a\x3d\xe9\xe0\xd1\xc7\x35\xe8\x62\xde\x2b\xb9\x52\x5b\x5f\xb4\xbd\x12\x12\x12\xbf\xaf\xf9\xff\x58\x6a\xc3\xc7\x5c\x5a\xce\x74\x6d\x9c\xa3\x07\xf7\x95\xff\x26\x97\xf2\xb4\x1a\x63\x46\xed\x23\x39\x7e\xb3\x88\x98\x69\x1e\x6f\x66\x84\x16\x37\xd0\xab\x0d\x96\x83\x09\xe0\x19\x40\x02\x30\x90\x15\x41\x6e\x74\x47\x2f\xe3\x24\x25\xd4\x5f\x07\xc7\x71\x19\x18\xb1\xe5\x79\x0f\x57\x2c\xe4\x44\x10\x42\xd4\x26\x03\x37\x92\x29\x7b\x5f\x81\xe0\x80\x9b\xd9\x69\x1f\x0a\x50\x5e\x32\x59\xfc\x03\xc9\xff\x10\x7e\xb9\xb4\x87\x95\xf4\x9f\xb0\x9c\x1b\xab\x56\x59\xd3\x9f\xfe\xcb\xdc\xc4\x03\xe3\x80\x3d\xc0\x12\x43\x8c\x2f\xb3\x6f\x68\x30\x15\xc5\xdf\x04\x82\xcb\x7d\x7f\xc5\x75\x73\x64\xa0\xa3\xc1\x0d\x0e\x12\x59\xc0\x1f\xcc\x4d\xd5\x49\x4b\x52\x90\xa6\x94\xae\xa3\xf6\xfa\xe5\x47\xac\x57\x6f"}, +{{0x43,0xd4,0xbe,0x6d,0xe9,0xcb,0x00,0x89,0x8e,0x99,0xdd,0xcc,0x2e,0x15,0x30,0x11,0x0f,0xa2,0xcb,0xc4,0x37,0x6c,0x48,0x5e,0x9c,0xa5,0x7f,0xd6,0x55,0x86,0xd8,0xa3,},{0x36,0x32,0xad,0x38,0x9b,0xe2,0xfa,0xb3,0xfb,0xa0,0xd8,0x04,0xbf,0x63,0x45,0xcd,0x32,0x2e,0xdd,0xd6,0xa7,0x5d,0x8c,0x37,0xfd,0x4b,0x5b,0xa1,0xc9,0xc2,0x5e,0x8f,},{0x86,0xae,0x93,0x25,0xf8,0x0b,0x98,0x86,0xc8,0x38,0x1f,0x96,0xa1,0x8c,0x21,0x20,0xe6,0xdb,0x01,0x6a,0x0d,0x6c,0xa2,0x82,0xed,0x93,0xba,0x9b,0x61,0xca,0xec,0x02,0xde,0x88,0xef,0xca,0x8b,0x8e,0x91,0x6a,0x4b,0x16,0xa5,0x85,0x25,0xa2,0xf6,0x8d,0x21,0xe5,0xfb,0xe6,0x7d,0xb4,0xc4,0xd6,0x20,0x95,0x95,0xc4,0xab,0xc3,0x2b,0x09,},"\xd9\xd5\x5d\xab\x0f\xa6\xda\x76\xb6\x8e\x84\x1c\x24\xd9\x71\xba\xc1\xf7\x9a\xf5\x13\xd8\x34\xe4\x26\xa5\xd0\x81\x14\xce\x8b\x54\xce\x8b\x7a\xfe\x01\x6b\x0f\xad\x03\xee\x74\x50\xc6\xc3\x09\x71\x73\x68\x1a\x4b\x2e\xb9\xf9\xc1\x79\xa8\x8e\x7c\xc3\x68\x13\xf2\xf5\xd1\x5f\x79\x98\xaf\xa9\xfd\x4e\x54\x6c\x73\xbb\x42\xe7\xf9\x52\x2b\xe6\xaf\xab\xca\x8c\x7b\x64\xfe\xd0\xe2\x92\xe4\x37\x5f\x3e\x1e\x5f\xd9\xfc\xb5\x39\xf4\xe5\xe5\x43\xfb\x6a\x11\xa0\xdf\x32\x1e\x70\x08\x4a\xaa\xbb\x70\xa9\x95\x0c\xee\xe3\xd8\x79\xc3\x86\xef\xca\x1e\x59\xc3\xcb\x7c\x45\xb5\x60\x09\x5e\x7a\xf0\x0f\xf5\x2f\x8a\x1a\xaa\x9c\xcf\x09\x2f\x0b\xb8\x06\xd9\x76\x10\x74\x2a\xc5\x82\xa3\xab\xbe\xdd\xf3\x9f\x49\xd2\x29\xd3\x2a\x11\x86\xd0\x21\x51\x8d\x74\x72\x8d\x13\xd9\x62\x63\x5d\x63\xba\xa6\x74\x3b\x12\x6b\xf4\x58\xfa\x2a\xc7\x56\xfb\xf8\x80\x96\xc8\xd3\x34\x0c\x62\x23\x90\x53\x4a\x74\x3f\x18\x64\xd5\x4d\xea\xb5\xe5\x53\x63\x72\xce\x5a\xc9\x37\x62\x28\x74\x14\xea\xe1\x58\xa7\x6b\xf8\x1d\xf5\x41\x7c\xf4\xc0\x47\xbe\x3a\xc1\x47\x5c\x51\x7e\xbd\x3a\xc1\xd1\xd1\xbd\xda\x11\xb3\xf9\x9c\x18\x17\x3e\x03\x0a\xcd\x51\xd2\xb5\xcf\x79\x51\x65\x09\x41\x54\x05\x07\x75\x11\xbd\xd9\xcb\xe1\x7d\x04\xf4\x78\x05\xe9\x8d\x0d\x14\x5e\x60\xa5\xd0\xe0\xf4\x53\xcd\x9b\x5c\x1a\x24\xf1\x2b\x75\xe8\xcc\x34\xd5\xe0\x06\x91\xff\xac\xbf\xf7\x88\xfe\xa8\x34\xd9\xd7\x79\xc1\xe6\x10\x29\x4d\xce\x19\x17\x0d\x28\x16\x0c\xff\x90\x9b\xea\x5a\x0a\xa7\x49\x40\x17\x40\xea\x3a\xf5\x1e\x48\xb2\x7c\x2b\x09\xf0\x25\x44\x42\x76\xc1\x88\xc0\x67\x1a\x6d\xa9\x4b\x43\xd1\xe5\x25\xe6\xa4\xa8\xa1\xa7\x3d\xfe\xdf\x12\x40\x18\x46\xba\x43\x06\x8a\x04\x09\x2b\x12\x91\x22\x70\xd2\xb6\x0d\xf6\x09\x97\x79\x75\x6b\x8b\xbb\x49\xec\xe8\x2d\x55\xf0\xf8\xdb\x1b\x80\xfb\x4b\x59\xbb\xa8\x60\xbd\x18\xc7\x5d\x6c\x83\x4d\x69\x44\x2a\xe0\x31\x4c\xf2\x39\x9f\x53\x92\xa3\xc6\x72\x8c\x63\xe5\xc5\x16\xc4\x22\x2a\xac\x60\xf9\x16\xdd\x63\xd1\xd0\x51\x7e\x8e\xb1\x0b\xd0\xe1\x5e\xb9\x06\x14\xde\xb2\x96\x40\x3a\xd1\x5b\x8c\x12\xb9\xe9\x71\xef\x2f\x01\xe5\x9f\xc3\x5d\x90\xc5\x5a\x8e\x20\xe9\x43\x7d\xd4\x34\xb2\x6d\x5c\x2c\x6e\xc2\xd5\x3a\xce\xc1\x7e\x81\xe4\x78\x31\xdc\x2d\xe8\x21\x83\xd7\x13\xb5\x9a\x4d\x1f\x46\x96\x9d\xdc\xdd\xaf\x27\xf4\x4e\x5a\x31\x1a\xaa\xc3\x9c\x3d\x5a\x97\xbc\x90\xca\xd7\x12\xf4\x6f\x85\xe6\xc8\xfb\xf5\xd5\x8d\x8b\xc3\xec\x27\xd3\x10\xa9\xea\xf2\xc3\x69\xcb\x00\x64\x97\x70\x39\x0a\x3f\x98\x8f\x36\x2e\xfc\x15\x5f\x56\xa1\x46\xa6\x26\x50\x54\x7e\x91\x53\x25\x07\x01\xee\xad\x1b\xd0\x1c\x89\x46\x22\x72\xdf\xaf\x0a\x43\x1a\xf4\xbd\x7c\x3d\xb4\x51\xad\xa6\x03\x23\x3f\xda\xd3\xaa\x89\x99\xaa\x21\xe2\xd3\xa4\x3b\x0b\x56\xfc\x6a\x91\x24\xd3\x35\x98\xb3\x73\x7f\x4e\x5c\xb2\x58\xbe\xda\x75\x6a\xd2\xe1\x7d\x06\x91\xd1\x5d\x41\x6b\xb7\xcb\x07\xec\x8d\x8c\x7a\xf5\xde\x80\xe5\xb9\x39\x4e\x32\x0c\x4c\x6e\x43\xef\xaa\xe6\x84\xad\x00\xf6\xdd\x20\xa8\x75\x0e\x95\x9c\x2f\x04\x20\x6f\xc0\x23\xaa\x19\x0c"}, +{{0x7d,0x01,0x0d,0x76,0x0f,0x24,0xe5,0xa2,0xde,0x34,0x08,0x9c,0x9f,0xdb,0x19,0xc3,0x3b,0x15,0x5b,0x0a,0x37,0xca,0x45,0x5a,0x5e,0x5b,0x1d,0xae,0x7a,0x07,0x31,0x76,},{0x4c,0x87,0x7b,0x3c,0x49,0x71,0xfb,0xb5,0x51,0x16,0x6e,0x21,0x4d,0x1c,0x76,0x24,0xc5,0x22,0x77,0x90,0x3c,0x59,0xa5,0x62,0xa8,0x0b,0x91,0xa8,0x54,0x83,0xfb,0x47,},{0x55,0x70,0x61,0x38,0x79,0xae,0x22,0x77,0x8b,0xd5,0x4f,0x14,0xfb,0x6e,0x8c,0x02,0x56,0xa7,0x1f,0x3d,0x79,0xc3,0xe5,0xcd,0x8e,0x41,0xae,0xa8,0xcf,0x77,0x3e,0x24,0xd2,0x9f,0x1f,0x1b,0x24,0xf8,0xc8,0x0d,0x29,0x49,0xe8,0x20,0x14,0x65,0xdb,0xde,0x89,0x40,0xb1,0xfa,0xb6,0x48,0x3b,0x08,0x5d,0x41,0x8e,0x25,0x10,0x14,0x20,0x0c,},"\x86\xe2\x11\x55\x72\xbf\x4c\x01\x3e\x6b\x4b\x04\xd0\xb0\x3e\x60\x6e\xe7\x0d\x92\x9c\xb8\xec\x36\xf4\xe2\xf3\x55\xdb\x3b\x5e\x15\x73\xd6\x58\xd1\x7b\xb1\xa3\x10\xc1\x69\x89\xa1\x6b\x95\x58\x92\x2e\xe4\x93\xf3\x59\x04\x21\x03\xc4\xdc\x1b\x40\xdf\xf7\x70\x99\x01\xfd\x58\x30\x13\x3f\x42\xc4\x65\x1e\xca\x00\x8b\x49\x9e\xe4\xf8\x4c\xd4\xec\x1e\xda\xa7\x82\x56\xed\xb6\x2f\x24\x02\x1a\x00\x76\x25\x69\x19\xe4\xe2\xce\x0a\x5a\x20\xf9\x21\xc2\x78\xcc\x29\x91\x59\x64\x4b\x5e\x3a\x3b\xbd\x08\x9d\xcb\xbe\xba\xd3\x76\x6a\xea\x77\xe9\xf0\x8e\xe5\xf7\xd4\xc1\x9d\x81\x70\xbc\x3d\xe1\xba\x77\x9a\x76\x99\x14\xf9\x65\xdb\xde\x2b\x61\xba\xd2\x14\xc5\x08\x18\x60\x41\xf7\x6c\x25\xbe\x95\x76\x56\xf5\xcf\xb7\x33\x4e\xb8\x38\xa3\xcf\xbc\x55\xcf\xba\xb6\x7a\xdf\x15\x52\x61\x99\x41\xb8\x35\xcd\x3e\x34\x10\x3b\x18\xb4\x91\x31\xe8\x20\x96\xf0\x5f\x57\x0b\x89\x98\x04\xba\xb8\xb6\xcb\xad\xdb\xbc\x02\xf9\xf3\xb5\x59\x73\x6d\x99\xca\x7b\x02\xd3\x26\x8f\xa2\x73\x99\x6f\xcf\x05\x71\x97\x7d\x1c\xc3\x00\x8c\x4e\xf8\x48\x97\x0e\xe3\x50\xb1\x58\xc4\x7e\xc2\x77\xad\xd4\x74\x2f\xa2\xbc\xbe\xa9\xbd\x55\x49\xc7\xbc\xa0\x38\x02\x0e\xce\x68\xf1\x88\xc1\xea\x3a\x62\xdd\x9a\x07\x3d\x4c\x13\x8c\xa8\xa9\xac\x04\x08\xdc\xfd\x46\xe3\x6b\xdf\xf7\x39\x88\xa5\x8b\x96\x17\xca\xa0\x8b\xd4\x1b\xf3\xe8\x12\xe7\x82\x4f\x0f\x7e\x81\x46\xa4\x44\xf3\x6b\xf5\x3a\x1c\xd8\x92\x03\x9c\xcd\x33\x5f\x5a\x2e\x79\x74\x5e\xac\x96\x14\x8c\x2a\x29\x99\x47\xf1\xb2\xe3\x28\xa3\x78\x9b\xf1\x3c\x6d\x73\x50\x6f\x3b\xdc\x68\xea\x48\xab\xf0\x02\x27\x0f\xe4\xee\x9e\xf9\xed\x6b\x10\xc2\xfb\xb4\xff\x12\x75\xb9\xd7\xdd\x35\xd8\xa5\x2e\x37\x17\x58\x57\x4c\xb4\x66\xc5\x7b\x5a\xbc\x24\x29\x76\xbe\xfc\x8d\x98\xa0\x13\x1b\x9b\xb8\x46\xb2\x19\xe4\x66\x91\x86\xa8\x3c\x05\x6c\xd8\x08\x06\x61\xde\x16\xb5\x1c\xe5\x76\x7b\x22\xe9\xa9\x32\x42\xbf\x8d\x32\x05\xc6\x6a\x67\x3c\xe7\x83\xd1\xc0\xd3\x7b\x63\x00\xfb\xf0\xd6\x12\x79\x40\xf8\x8f\x18\x19\xc4\x50\xdc\xc9\x05\x43\xed\x79\x4f\x1f\xd4\x4e\x65\x39\xfe\xba\xf1\x9a\x4c\xc9\x88\x70\x01\x4d\x7c\xca\xd7\x4d\x18\x76\xa1\x23\xec\xd1\x45\x51\x6c\x74\x3b\x4b\xba\x62\xd8\x21\xca\x9a\x79\x51\xe0\xdf\xb2\x3f\x38\xd9\xe3\xa3\x65\xfd\x83\x22\xf2\xee\x47\x99\xe9\xff\x11\xe1\xc5\xc3\x0b\x55\xa3\x55\xc8\xa5\xde\xea\x81\xa5\x45\xe3\x47\x05\xab\x56\xd1\x7b\x1f\xa0\x6e\xd7\x64\x15\x55\x67\x02\xf3\x64\x80\x82\x46\xf8\x63\xc3\x19\xf7\x5c\xdf\x6b\xd7\x48\x43\x8d\x1a\x2e\xaf\x42\x06\xc5\x60\xbf\xaf\xc2\x35\x67\x9a\xd6\x04\x9c\x1a\x01\x52\x6f\xcb\x9a\x3c\xe1\xb1\xd3\x9b\xe4\xdf\x18\xb1\x5f\xa0\xea\x55\x27\x2b\x17\xeb\xde\xdf\x6c\x30\x49\x8a\x8a\x14\xf2\x04\x2b\xe1\xc2\xcd\xb0\x9e\x9e\xf3\x84\x6d\x66\x59\xa9\xf6\xd6\x73\xdf\x9a\xfb\x7e\xde\xd0\x4b\x79\x3d\x97\x31\xf0\xac\xcc\x41\x46\x8d\xc1\xf3\x23\x6c\x99\xac\xad\xee\x62\x39\xc3\x61\xb8\xbd\x7e\x2d\x0c\xfe\x8b\xb7\xc0\x66\x87\xe0\x8e\x76\xb7\x1a\xd5\x7a\x03\x61\x79\xf2\x91\xd0\x96\xae\x2f\xa0\x81\x8e\xf4\xbf\x48\x66"}, +{{0xaa,0xaa,0xbb,0x7c,0xe4,0xff,0xfe,0x4d,0xc3,0x57,0x47,0xba,0xea,0x2b,0xc5,0xf0,0x50,0xbe,0xf0,0x6e,0xe0,0xc1,0xfd,0x63,0x2a,0x06,0x7f,0xec,0xe1,0xef,0x4f,0xb5,},{0x82,0x0a,0x24,0x42,0xd5,0xf4,0x5f,0x3c,0x79,0x14,0x78,0xe0,0x98,0xfb,0x3b,0x06,0x8d,0xa5,0x2e,0xc4,0xe8,0xda,0xde,0xc8,0x50,0x65,0xc3,0x56,0x59,0xf4,0x37,0xe0,},{0x05,0x0a,0xe8,0xae,0xce,0xec,0x96,0x27,0xb8,0x01,0x37,0x35,0x7a,0x22,0x96,0x2a,0xc8,0xb4,0x50,0x48,0x66,0x17,0x08,0xd3,0x94,0xd0,0xa5,0x1a,0xad,0xc3,0x81,0xfe,0x85,0x35,0x02,0x3d,0x6e,0x1b,0xda,0x0e,0x72,0xb3,0x49,0xb5,0x0b,0x26,0xda,0x7c,0x3a,0x30,0x85,0xe8,0x1e,0x9d,0xd6,0xcf,0x12,0x78,0x68,0xfc,0x5b,0xae,0xab,0x01,},"\xf9\xd2\x85\x97\xa3\xe2\xb6\x4b\xa3\x27\xac\x5c\xd2\x9f\x08\x1e\x74\xbf\x46\x1b\x2e\xb2\xd3\xcf\xd9\xd5\xe9\x21\x58\xd2\x1d\x1d\x2a\x47\xab\x50\x98\x1c\xb1\x9f\xe3\xf8\xc6\xfe\x48\x82\x49\xb1\xc4\x9f\xb8\x97\xa0\xfe\x21\xab\x54\x04\x41\x4f\xd9\x14\x87\x5c\x22\x0f\x1c\xbc\x12\xf5\xc3\x8c\xfb\xa7\x9f\x7a\xc3\x03\xa5\x23\x1a\x37\x2b\x02\xfa\xd6\xc8\x46\x2f\x8c\xc4\x9f\x0f\x64\x96\x5b\x65\x1d\xcc\xef\x0b\xb9\x60\x82\x15\x09\x08\x49\x17\x7b\xe4\x7b\x2d\x30\x72\x94\x4d\x36\xe8\x56\xda\x18\x5c\x7b\x3a\x68\x9f\x7e\xde\xf9\x88\x33\x8e\x09\x63\xed\x31\xa6\xb0\xa8\x0d\x5c\xb0\xb1\xcc\xcf\x6f\x39\x48\x37\xaa\x6f\x8b\x2f\x3d\xa5\xef\xbd\xf4\xd3\x60\xd4\xbf\x4d\xd7\x08\xce\x64\x45\x58\x7d\x94\x2b\x79\x76\x1c\xe9\x51\xb1\xbb\x4d\x90\x50\x70\x36\x18\xa6\xd9\x30\xa8\x0c\x69\x57\x6f\xc4\xaf\x30\x6a\x2a\x56\xdb\xd8\x84\xa0\x5a\x1e\x4e\x9f\x31\x36\xcd\x0b\x55\xae\x47\x4b\xb5\xd3\xd0\xfb\xc9\xb0\x33\x9c\xec\x34\x4f\xdd\x08\x5c\x19\x28\x10\x14\x81\xc6\x87\x94\xf5\xc8\x90\x13\x71\x08\xce\xa7\x91\xd2\x1f\x81\x68\x3d\x3e\x1a\x9e\xec\x66\xac\xe5\xc0\x14\xd8\x9e\x69\x80\x8e\x5f\xa8\x3d\x38\x12\xee\x68\x0f\x5a\x99\x71\x68\x1b\x8a\xdc\xd4\xa1\x6e\x9a\x4c\x16\x5b\x5e\xf9\x93\x2c\x5e\xd8\x25\x23\x7f\xd5\x03\x7b\xcb\xef\xe4\xcb\x11\x56\x4f\xa7\x07\xc8\xa9\x32\x90\x75\x14\x14\x89\x1b\x1e\xdd\x33\x13\xc6\x5f\x8b\x91\xc2\xe9\x25\xa3\xc1\x2a\x9d\x3a\xa4\x5f\xd5\xa6\x67\xb7\x83\x93\xc3\xe3\x9d\xf8\x8a\x8f\x0d\x11\x48\xb5\x31\x1e\x3d\x87\xc4\xa9\x2e\x0a\x3f\xb9\x15\xbc\x90\xd5\x55\x8d\x05\xb4\x75\xa8\x83\x47\x78\xaa\x94\x3e\xa3\x9b\x8e\xaa\x95\xad\x18\x32\xe5\x91\x6e\xa3\x10\x2d\x7d\xe0\xb8\x36\xcd\xe8\xf3\x75\x9d\xbb\x3b\x9d\x56\xea\x81\x7b\x3e\x49\xc9\x83\x21\x02\x77\xc2\xc7\xc5\xb0\xdb\x18\x74\x22\x53\x2f\xca\x98\xa2\x8b\x3b\x65\x9c\x6b\x81\x5a\xc1\x26\xfa\xdb\xe2\xf4\x00\xc7\x3e\x9d\x2d\xed\xcb\xbd\x2d\x3a\x36\x5f\xfa\xd7\xe6\x66\xc8\x96\xe3\x1e\x61\xb3\x84\xed\x3a\x9f\xcf\x12\x90\x53\x8d\xf1\x1b\x94\x74\xc6\x28\x1c\xc5\x92\xc7\x1c\x88\x08\x86\x8b\x42\x92\xc1\x7e\xce\x6b\x3e\xdf\x5e\x35\x42\xa7\x0b\x91\x15\x93\xe9\x3f\x35\xec\xd9\x72\x9b\xd8\x88\x0a\x24\xea\xf4\x1f\xbc\x65\x74\xdf\xe1\x67\xec\x2d\x0e\x7a\xb3\xdf\x5e\xc3\x4b\x8b\x55\xd5\x48\xab\x93\x73\x8a\x2e\xea\xf2\x1c\x88\x4c\x5c\x85\x51\xdb\x2e\xdf\x2b\x04\x9f\x1a\x2a\x84\xfa\x72\xac\x89\x78\xa4\xc2\x78\x09\xf2\x09\xc1\xb2\x19\x5a\xff\x50\x4f\x69\x98\x56\xcc\x4f\x22\xd4\x4e\xbd\xd0\xfe\x50\x37\x44\x68\xd0\xb1\x79\x2e\x57\x4b\x51\x10\xa1\xf4\xcd\x0e\x22\x1e\x82\x4a\x78\xdd\xc4\x84\x5f\xeb\x46\xd6\x6d\x63\x3d\x23\xcd\x23\xf4\xb6\xfb\xe4\xc8\xce\x16\xcd\x1a\xf6\x15\x36\xda\x5f\xa6\x7b\x10\xac\x75\x55\xa6\x8c\x0e\x0b\xdb\xf2\xf8\xd7\x23\x09\xd9\x95\x51\x6b\x81\x18\xbf\x43\x83\x5d\x0a\x01\xc0\x8f\xfe\xba\x3e\xa3\xed\x05\xcd\x2d\x54\xf0\xea\xbc\xda\x05\xd0\x03\x7d\x52\xca\xed\x3b\x19\x37\x4f\xaf\x73\x99\x90\x94\xf7\x90\x55\x92\x4b\xea\x9a\xec\x44\x70\x13\x5f\x5e\x8b\xf1\x83\xc9\xd1\xc9"}, +{{0xe9,0x5c,0xc2,0xa4,0xd1,0x19,0x3b,0x75,0x39,0xfc,0xbb,0xea,0xae,0xed,0x98,0x5b,0x6f,0xb9,0x02,0xdd,0x0e,0xfb,0xd6,0x38,0x74,0x57,0x55,0x0d,0x0d,0x6a,0x2f,0xea,},{0x72,0xa1,0xff,0x1e,0x9b,0xb1,0x1c,0x8d,0x88,0x96,0x8a,0x7b,0x16,0x96,0x37,0xad,0xee,0x43,0x8e,0x22,0x63,0xf0,0x06,0xdc,0xa4,0xfe,0x02,0xfe,0x06,0x6c,0xba,0xd3,},{0x1b,0x8d,0x7c,0xc2,0xad,0xf3,0x6c,0xae,0x16,0x31,0x25,0x0c,0x82,0x43,0x1b,0xd8,0x84,0x37,0x16,0x3a,0x63,0x49,0xad,0x96,0xe7,0xa8,0x64,0x44,0x7e,0x9f,0xee,0x75,0x3a,0xc3,0x65,0x5c,0x98,0x35,0xb4,0xd1,0xec,0xbb,0x30,0x6c,0x63,0x8b,0xa5,0x40,0x2a,0xd0,0x2b,0xa6,0xd2,0x25,0xd9,0x68,0x82,0x88,0x9f,0xe8,0xd2,0x04,0xa6,0x04,},"\x84\x26\x74\x39\x20\x1b\x05\x91\xdb\x60\xc0\xf1\x7a\x9c\x15\xe4\x54\x09\x29\x56\x52\xd5\xf5\x5b\x87\xfb\x35\x19\x67\xc8\x46\xa5\x67\xf5\xce\xba\xae\xd1\x76\x2b\xff\x54\x85\xf0\x48\x53\xca\x92\x69\xf4\x64\x09\x4e\x51\x2d\xf1\xf0\x2e\x13\xe5\x17\xb1\xda\xa5\x8d\x34\xca\xa2\xd5\xff\x9f\x9e\x79\xbc\xaf\xb4\xce\x96\xe8\xa0\x89\x25\x8a\xd6\x13\x43\xb4\x46\x62\x8e\xbc\x4f\x5b\x2a\x84\xd0\x3b\x72\xef\x3f\x73\x85\x89\xfa\x13\xc4\x25\x19\xa8\x28\x29\x9a\x3f\xae\xc0\x35\x03\x7b\xc1\x0b\x44\xe3\xbd\xfe\xd9\xe0\x87\x07\x17\xcb\xaf\x31\xbe\xf8\xb2\x2c\x4e\xa1\x6e\x81\x57\xfc\xbc\x63\xee\xfa\x39\xed\x82\x2e\xfd\x42\x15\xc2\x47\xdd\xa4\x87\x86\x27\x7e\xc0\x30\xa8\x6c\x0e\xf4\x85\x1d\x67\x3c\xfe\x75\x2d\x06\x77\x88\x3c\x2c\x45\x20\x38\x97\x0c\x09\xbd\x48\x17\x14\xbc\x3f\xbe\xcf\xa4\xff\x2a\x3c\x24\x56\x95\xd7\xec\xc2\xf4\xde\xc7\xf5\xed\xe0\x4f\xf6\xdb\x43\xe2\xbb\x91\xc0\x66\xb6\x49\xef\x73\xfd\x3b\xe8\x60\xcb\x83\xfa\x80\xb0\x74\x14\x9f\x43\x1e\xeb\xb9\x17\xec\x84\x78\xda\x87\x0c\x11\xe3\x17\x70\x38\x59\xf9\xf2\xf4\x00\x8a\x6c\x7c\x75\x4b\x06\xe1\xf7\xd2\x47\x96\x89\xda\x84\xe8\x89\x22\xf3\x82\x74\x98\x5e\x11\xce\x13\xcd\xbd\xb0\xf2\xec\xe6\x8f\xb6\x02\xad\xe0\x3d\xd5\x49\xa3\x62\x49\x1f\x4a\x20\x3f\xf8\x07\x44\xf6\x63\xc5\x23\xa0\x26\xb4\x31\xaa\xd4\x5c\x58\x29\xe0\x29\xad\x62\x56\xd1\x27\x6f\xd7\xb7\xa1\x2d\xdb\xf1\x72\x7d\x9e\x23\x3f\xb5\x34\x45\x73\x70\xa4\x26\xe5\x6f\xb3\x9c\xf4\x04\xa3\xec\xbf\x0c\x4b\x50\xbb\x52\x2d\xce\x98\x1e\x08\x30\xfd\x84\x06\xe6\xd9\x72\x5c\xeb\x1d\xdd\x3a\x19\x47\x93\x7d\x90\xe0\x4d\x76\x8a\xe1\xd1\x26\xe2\xae\xac\x21\xb8\xc9\xef\xc5\x4c\x40\x96\x1b\x7f\x4e\x9e\x88\x02\x5f\x7e\x0b\x9d\xe9\x01\xeb\xf0\x04\x9e\x74\x1b\x79\x79\x97\xd8\xdb\x78\xe9\x28\x3b\xbb\x5f\x90\xf3\x5a\x2c\x4d\xee\x27\x31\x42\xec\x25\x8c\x02\xad\x0e\xcc\x61\xcc\x5c\x9f\x12\x13\x2d\xb2\x8a\xf4\x1c\x1f\xb7\x8e\x52\x4b\xe5\x32\x7b\x5f\xfc\x35\x96\x27\x79\xfb\x11\xff\x0c\x5d\x3e\xe0\xa3\x1f\xf4\x7e\x73\xb1\x72\x9d\xfa\x46\xe8\x98\x6b\x1b\x89\xab\xc8\x8a\xd0\x6a\xbd\x5b\x6f\x76\x6d\x23\xab\xf6\x42\x25\x78\x94\xeb\xdf\xa7\x9e\x63\x09\xf1\x27\x23\x74\xee\x94\x33\x67\x7b\xa1\x3e\x45\x1b\xaa\x95\x33\x0e\x66\x0c\x80\x52\xae\x87\x2e\x0e\x32\xe2\xb2\xd1\x28\x6d\x01\xa0\xab\x58\x10\x42\x4e\xd8\xb9\x40\x54\x65\xbd\xeb\xa0\x3b\x69\x83\x84\x67\x6f\xe5\xea\x46\x4a\x03\x44\x6c\x4f\x7c\xd7\xb4\x33\x12\xec\xf1\x51\x36\x04\x64\x57\x1a\xd2\x86\x10\x58\x1f\xba\xdb\x94\x5a\x1d\x68\x18\x1d\xeb\x40\x3a\xa5\x6e\xba\x0b\xb8\x40\x32\x8e\xee\x36\x10\x3c\x7d\xe0\x73\xa6\x87\x9c\x94\x1c\x75\x54\xc6\xf6\xf2\xa0\x80\x80\x9e\xb0\xe5\xbd\x0e\x13\x0f\x29\xa2\x29\xe9\x30\xdb\x01\xfe\xca\xc2\xe0\x36\xbd\xf0\xe0\x01\xe2\xa8\xea\x32\x64\xf8\x64\x9d\x5b\x60\xc2\x91\x03\xf0\xb4\x9c\x24\xc9\x7f\xac\xaf\x7e\x81\x06\x9a\x2b\x26\xab\x3f\x93\x3f\x42\x7d\x81\x27\x2c\x6c\x8b\x7c\xd0\xdf\xb7\xc6\xbb\xe9\xc0\xea\xab\x32\xbb\xda\x22\x18\xb9\x62\x3a\x21\x19\xaa\xb1\xf3\xeb"}, +{{0x77,0xad,0x0f,0x94,0x2c,0x37,0xf0,0x31,0x3e,0x6b,0x04,0x56,0xda,0xba,0xec,0x81,0xb2,0xd6,0x1f,0x6c,0x11,0x8d,0xdb,0x29,0xea,0xf3,0xac,0x5b,0xf1,0x95,0x04,0xd4,},{0x69,0x2d,0x2d,0xa5,0xa9,0x5f,0x48,0x61,0x1a,0x6d,0xa8,0x9c,0xfb,0x3b,0x35,0x40,0xf6,0xaa,0x0c,0x85,0x0d,0x6d,0x98,0xde,0xea,0x87,0x0e,0x39,0x7f,0xed,0xe3,0x28,},{0x69,0x6b,0xd5,0x52,0xdd,0x01,0xdb,0x80,0xb3,0xd6,0x7d,0x61,0xee,0xb7,0xec,0xc5,0x68,0x78,0x40,0x4a,0xb1,0x19,0x44,0x2a,0x1c,0x74,0x22,0x99,0x2c,0xfa,0x35,0xae,0xa9,0x20,0x82,0x5d,0x2d,0xaf,0xd8,0x92,0xad,0x7e,0xb6,0x82,0x5a,0xd9,0x99,0xae,0xe5,0xc8,0x3b,0x7b,0x50,0x79,0x06,0x53,0x4f,0x91,0xac,0xe7,0x59,0xc5,0x51,0x0c,},"\x87\xe6\xde\xad\x2c\x85\x54\x9e\x3d\x8d\x25\x88\xa0\xa3\x36\x06\x03\xa6\x24\xfb\x65\xae\xbb\xc1\x01\xbf\x7f\x1f\xec\x18\xd0\xb2\x8f\xbd\x5d\xba\xee\xd3\x87\x52\xcd\xf6\x35\x5c\xe8\xdc\x84\xe1\x8a\xc1\xa4\x39\x3d\x2a\xb8\x88\x88\x2c\x4f\xf1\xc9\xc8\x13\x7f\x83\xbe\xe3\x63\x36\xbc\xbf\xbb\x72\xd5\x04\x9e\x0a\x40\x08\x74\x51\x4f\xdc\x36\x33\x04\x6e\x89\x38\x3d\xde\xd9\x3c\xa3\x1f\xde\x0d\x89\x8e\x11\xe9\x26\x8d\x3d\x5c\x24\x06\x66\xed\x55\x27\x61\x3d\xa7\x9f\xb7\xe4\x96\x25\xb4\x4c\xde\x78\xb4\x1c\x67\x90\x2e\xb0\x21\x6b\x3a\x7a\x3e\x56\x0e\x26\x1d\x71\xd7\x64\xaa\xcf\x15\x95\x9c\x17\xfc\xd6\x17\x6f\xb2\x5e\x24\x9e\xe6\xbb\x1b\x3b\xd7\xbd\x90\xf6\x0b\x0b\x0f\xfa\x03\x15\xa0\x65\xa2\x4b\xba\xe8\xf2\x55\xbf\x29\x8d\x7e\x4d\x44\xf0\xb4\x30\xc4\x15\xb4\xfb\x36\xcf\xa6\x62\x6a\x83\xf4\x9a\x25\x67\xf6\x24\x4f\x40\xe9\x23\xad\xd1\xd4\x9a\x72\xf5\x7b\x15\x30\xf5\xb3\x79\xde\x3a\x91\xc2\xe9\xa1\xac\x79\xab\x37\xbc\x3b\x9b\xa7\x3d\x88\x28\x13\x6b\xcc\x87\xd2\xc0\x11\x90\xde\x54\x57\xfa\xcd\x90\xf3\x69\x55\x3f\x7a\xc5\x21\xc5\x67\x2b\x08\x67\xdf\xa8\xda\x3b\x95\x2a\xd9\x5b\x67\xda\xb9\x9b\x48\x20\x57\x2f\x2d\x4a\x29\x8e\x95\x18\x63\x77\x79\x28\x9c\x03\x1b\x79\x3d\xee\x85\x9c\xde\x7b\x24\xad\xd6\x49\xff\xf8\x71\x24\x8a\x66\x02\xd2\x51\x62\x79\xda\x60\x58\xcb\xb6\x96\xfa\x8b\x1d\x89\xa2\x0d\x20\x99\xe6\x46\x44\x32\x10\x48\x3e\x5d\x41\x34\xe9\x28\xfa\xeb\x38\xa3\xb5\x08\x19\x9e\x0d\x69\xbb\x55\xee\x34\x77\x42\x05\xc0\xa6\x12\x05\xb5\x0b\x08\xfe\xbe\xaa\x40\x1e\x6e\x3a\x51\xa2\xbf\x98\xef\xac\x78\xb7\xae\x2b\x85\x2c\x53\x95\xa1\x2c\x40\xe2\xc7\xdd\x1b\x20\x25\x04\xb5\xa7\xd2\xf7\xe4\xfd\x4f\x86\x10\x93\x0d\x28\x68\xcb\xa8\x86\x43\x39\xe0\x41\xda\x21\xc0\x71\x5f\x41\xb2\xb2\x3d\x14\xd0\xb5\x45\x48\x0b\xc3\xbd\x7d\x72\x15\xcf\x2f\x81\x6a\x33\x32\x08\x1e\xca\xa0\x8c\x0f\x8b\x99\x52\x52\x51\xf5\x72\x31\xb6\x75\x0c\x2d\xbd\x11\x09\xac\x41\x60\x48\x6b\x76\x83\x24\xb6\xba\xc8\x7e\xf5\xa2\x26\x44\x8c\x43\x12\x40\x32\x8f\x42\xcc\xa5\x86\xbe\x7a\xff\x3c\xbe\x76\x05\xfa\x34\x15\x14\xfc\xcf\xb9\x66\xaf\x3d\x45\x30\xe8\xcd\x90\x37\xa1\x1c\xe5\x93\xc2\xd3\x83\xe1\x03\x5a\x0c\x2e\xda\x09\x8d\xe9\x0d\x50\xc5\x18\x4a\x9c\x01\xb5\x7f\x26\xb9\x4d\xed\xd1\x45\x4c\x34\x06\x37\xec\xcc\xee\x70\x62\x57\x54\xa3\x28\xc6\x5f\x42\x64\x5b\x5e\x1a\x56\x55\xee\xf9\x7d\xfb\x1c\x63\x08\xed\xf4\x9f\xa3\x68\xd1\x7d\x17\xe0\x6a\xdc\x51\x2b\x39\x73\xea\x65\x2a\xc4\x0a\x99\x78\xe1\xbb\x1b\x2f\x86\xc5\xa9\xff\xbf\x60\xdc\xc4\xf6\xbb\xc9\x8a\x64\xf4\xde\x65\xe7\xec\x61\x72\x1e\xde\xb0\xe5\x23\x84\x56\xf7\x61\xd2\xd1\x29\x3a\xf0\xde\x9f\x79\x3b\x11\xd8\xca\xdf\x01\xa9\x43\x19\xa0\x2a\x42\x73\xff\xc4\xd3\xff\xa7\xb3\x4d\x74\xfd\x2e\x0b\x10\x0f\xca\x58\xb5\x32\x5f\x90\x7a\x74\x91\x93\xe7\x51\xd6\xc1\x16\x68\x7a\xee\x37\x47\xb5\x94\x60\xd4\xef\x15\x6e\x72\x47\x6e\xae\x1b\x84\x55\xd7\x6e\x71\xb3\x06\xb9\x81\x29\xb7\x2f\xe1\xcb\x5e\xb4\x05\xa7\xc2\xf4\x32\x7f\x38\x62\xd4"}, +{{0x29,0x32,0x14,0x69,0xee,0x9f,0x2b,0xb1,0x65,0xa0,0x69,0x64,0x03,0x32,0xb4,0x89,0xbf,0x5c,0x3f,0xab,0x68,0x2e,0x93,0xda,0xe9,0xd8,0x63,0x17,0xbf,0x50,0xc5,0x2c,},{0x96,0xf7,0x30,0xf8,0xef,0x89,0x70,0x26,0x8d,0xba,0x0f,0x75,0x70,0x41,0x0b,0x61,0x88,0xa1,0xa3,0xc8,0x63,0x97,0x74,0x09,0x13,0xd5,0x3a,0xda,0x26,0x2a,0xb8,0x7e,},{0x4e,0x1a,0xff,0x84,0x63,0xbc,0xa1,0xb7,0xde,0xb1,0xd3,0x77,0x3d,0xf2,0xe7,0xa0,0x68,0x64,0x11,0x1b,0x6d,0xc4,0x2a,0x62,0xae,0x98,0xde,0xb2,0x31,0x39,0x43,0xb3,0x15,0x3e,0xe4,0x66,0x96,0xb1,0x5c,0x24,0xef,0xc2,0xa8,0x08,0xaa,0xba,0x81,0xc7,0x8e,0x3d,0xfa,0x4d,0xfb,0x50,0xca,0x9f,0xe8,0x44,0x45,0xea,0x68,0xbc,0x8e,0x0a,},"\x9c\x71\x2c\x83\xd5\x4f\x2e\x99\x3c\xa6\x8a\x96\x32\x84\x60\x04\x49\x9c\x51\x95\x44\x8d\xdc\x49\x1c\x3a\x0d\x2e\x3a\x66\x6d\x6b\x33\x09\x8e\x48\x64\xfd\xf8\x6e\x61\x9d\x50\xf1\x0b\x7c\xc6\xc3\x9b\x3f\xf2\x80\x1a\x94\x91\xf6\xfa\x97\xc5\xf1\xc4\xaf\xa7\xae\xff\x31\xd7\x38\xf9\xa7\x68\xa7\x9c\x73\xb2\x55\x77\x31\x0f\xb0\xad\x4f\xaf\x85\x43\xa0\x98\xf8\x59\x57\x1b\x61\x48\xe8\xb5\x29\x26\x44\x57\x57\xd5\x54\x9f\xd2\x5a\x26\x51\x85\x31\x56\x63\x79\xd1\xc2\x74\xe6\xc6\xa9\xd6\x41\x32\xe4\xac\x25\xac\x9a\xf9\x38\x1b\xcb\x88\x53\x32\x11\x3f\x43\x01\x4a\x13\x9a\x81\xf8\xd4\x3c\x8a\x6a\xb5\x4c\x11\xa5\xc9\x2e\x06\x19\x1c\x1e\x51\xb7\x57\xac\x9f\x11\xe3\xdc\x15\xdb\x44\x86\xd1\x67\xff\x9f\x2d\x65\xe2\x3e\x6c\x96\x22\x3d\x9a\xff\x8d\x10\xd1\x50\x2c\xf3\xdb\xce\x5e\x35\x7e\x6b\x12\xdb\xe9\xb7\xe9\x97\xc3\xd0\xa5\x07\xd3\xba\xe3\xcf\xef\x1f\xfc\x8d\x05\x6e\xf7\xdc\x72\xdd\xc1\xc8\x1e\x31\x0a\xd2\x05\xbe\x16\xe7\x7f\x27\x38\x35\x4b\x10\xb4\x84\xd3\x07\x6c\x27\xe6\xb4\xf1\x66\x38\x85\x81\xf3\x50\xbe\xfe\x22\xfb\xb0\x82\xb5\x41\x21\xee\x59\xec\xc7\xae\x5d\xec\xe8\x98\x82\xac\xf2\x6c\xb7\x47\xff\xaa\x3e\x2d\x05\xa6\x96\xf6\x0f\xd9\xe8\x29\xc7\x09\xd8\xf0\x2d\xaf\x53\x7b\x23\x69\xb8\x91\xfe\x6c\xcb\xf8\xdf\xcd\xd7\xf4\xa3\x64\xb1\x99\x85\xbe\x7e\xde\xc6\x7d\xdc\x1d\xb7\x13\xc0\xa9\x0f\xaf\xa4\x88\x37\x77\x25\x62\xde\xac\xc2\xd2\xa0\xe7\x89\xe1\x8a\x8b\x5b\x3b\xd9\xe0\x83\xea\x92\xff\xfc\x31\x83\xd5\xd4\x14\x15\x32\x59\xb3\x3a\x43\x29\xcf\xc8\x08\x24\xeb\xcb\xe0\x44\xa7\xe3\x3a\xb8\xa2\x4f\xde\x54\xbd\x95\x20\xae\xa2\x84\xb0\xc4\xc4\xfa\x94\x27\xd2\x51\xc0\xdd\xd0\x13\xec\xdd\x82\x90\xef\x55\x65\xf6\x08\x50\x8e\x36\x35\x89\xe5\x29\xd8\x4f\xf0\xf2\x6f\x9e\xcb\x03\x05\x2d\x58\x97\xfa\xbc\x91\x7e\x56\xe6\x01\xb6\x4a\xbf\xe5\xa1\x7c\x39\x50\x28\x9d\x0c\xdc\xaf\x1f\x60\x05\xa9\xf8\x10\x6f\x43\xe1\x7a\xdc\xaa\x2d\x1e\x26\x91\x66\x76\x2f\x80\x54\xde\x05\x13\x5d\x5d\x13\x93\xd7\x00\x0a\x15\xb8\x7b\xd6\x88\x46\xa8\x9d\x5b\xc2\x28\x63\x32\x51\x51\xaa\xc8\x43\xf7\x22\x78\xae\x6f\x4a\xf7\x2a\x4e\x44\x9a\xdb\x7e\xae\x6d\x43\x6a\x1e\xc7\xe5\x8e\x59\xb7\xb8\xbb\x9e\xf0\xdd\xaa\xa0\x01\x82\x6f\x8d\xcb\x44\x64\x79\xde\xaf\xd8\xb8\xd5\x42\x04\x1c\x19\xa0\x5b\x1e\x0e\xe4\x7b\x46\x40\x91\x0c\x31\x93\x0c\xa4\xe2\x0b\x10\x57\x58\xec\x75\xf1\x95\x03\x56\x94\x7f\x62\x61\xd0\x03\x7f\xe3\x07\x73\xa3\xec\xe6\xa9\x6c\x8d\x54\x33\x33\x3d\x82\x2c\x27\x77\xef\x7f\xf8\xbe\x60\x33\x34\x5b\x50\x55\xd5\x8f\x5e\xb3\x72\x9a\xf5\xae\x88\x24\xf3\x31\xee\x07\x31\xc8\x9b\x20\xac\x11\x8f\x55\x04\x27\xcd\x95\x8a\x55\xf6\xb1\xa2\x88\x8a\x08\x7b\xb7\xdb\x55\xbf\xc7\x3b\x29\x42\x9b\x44\x48\xdb\xe9\x11\x9c\x45\xa8\x73\x39\xb4\x49\x7a\x69\xa4\xcf\x83\x3e\x8f\x37\x70\xcc\xe5\xe0\x1f\xaf\x5e\x73\xbb\xaf\x62\x76\x83\xc0\xa2\x8c\x73\x05\x2f\xbe\xce\x20\x30\x43\x38\x9d\xfb\xfd\x45\x49\x5e\x51\xda\xb8\x6a\x25\x2e\x5b\xc1\xb4\xb7\xfe\x28\x07\xe3\xd0\xe2\x36\x3b\xea\xb5\x1c\x67\xfb\x31"}, +{{0x04,0x65,0x77,0x50,0x49,0x7e,0x68,0x15,0x2c,0x43,0xce,0x34,0xa5,0x8d,0x21,0x06,0xe6,0x4c,0x55,0x7c,0xd7,0xa8,0x4e,0xf0,0x5d,0x9e,0xb8,0x2e,0x6b,0xcb,0x05,0xf5,},{0x3b,0x3a,0x19,0x47,0xb4,0xcb,0xf6,0x0b,0x82,0x6d,0x60,0x9f,0x19,0x2d,0xc2,0x30,0xaa,0x9b,0x9b,0xaf,0x4c,0xd6,0xa6,0x09,0x2e,0x49,0x5f,0x1d,0x2e,0x47,0xad,0x62,},{0x7e,0x2e,0xae,0x5a,0x29,0x3f,0x41,0x83,0x91,0xf6,0xd8,0x5a,0x79,0x94,0xb0,0x7c,0x45,0x22,0x80,0x01,0x7e,0xe6,0x53,0xbf,0x61,0x7a,0x8d,0x5b,0xe2,0x4c,0xbb,0x5d,0x0e,0xfd,0xfb,0x7f,0x7f,0x00,0x13,0x12,0x26,0x0f,0x34,0x4e,0x6f,0xb9,0x15,0xad,0x8d,0x7d,0xe9,0xc0,0x51,0x98,0x27,0xc0,0x57,0x26,0xf9,0xce,0x25,0x45,0xdd,0x0b,},"\x29\x48\x22\x7a\x89\x0f\x6f\x84\x5b\x77\x5e\x62\xc5\x3a\xf3\x80\x50\x64\xa1\x57\x64\x46\xf0\x85\xd9\x0f\x8b\x9a\x5e\xd6\x8d\xf1\xea\x39\x3c\xe4\x79\xc4\x41\x41\x49\xa9\xec\x5a\x17\x10\x36\x42\x4d\xff\x03\x44\xb4\x95\x8f\x61\x32\x29\x8d\x0e\x24\xc9\x26\xd2\x8a\xd9\xd7\x9f\x98\xc6\xe6\xbc\xf1\xc5\x76\x76\x06\xec\xd2\x91\xc6\xad\x47\xb4\xf9\xfb\x2b\x02\x01\x15\x5a\xda\x62\x7b\x7a\x1f\xd5\xb0\x74\x19\x87\x40\x83\x05\x9e\xb5\x2b\x2f\x6e\xc2\x28\x18\xb7\x82\x46\x22\x8f\x3f\xe6\x35\x5d\xfd\xa7\x0e\xbb\x9b\xbe\x73\x22\x93\x78\x73\x63\x99\x55\x7c\xe2\x4b\x30\xbf\x64\x5a\x14\xe2\x25\x6f\x70\x01\x9b\x33\x36\xb2\x03\xfb\x77\xc6\xec\x94\xa7\xa2\x63\x48\x88\xfe\xea\xd4\xd7\x2c\x23\x91\xe9\x9e\x8c\x8d\x53\x3f\xd8\xa4\x2b\x08\xc1\x1f\x88\x7a\xb2\xde\xb6\xeb\xbf\xe3\xd2\x51\xde\x63\x53\x6c\x36\xcd\x53\x42\x23\x98\xe5\x44\xcf\xf8\x7b\x07\xa6\x33\x49\xfc\x50\x85\xdd\xe9\x3a\x1b\xfd\x71\x71\x13\x3a\x20\x43\x98\x1f\x60\x75\x22\xc8\x13\x3c\x63\x42\x8d\x1b\x92\x62\x6c\x79\xb7\x35\x8e\x70\x21\xcf\x1f\x41\x2a\x78\xaf\xa7\xcb\x3f\x59\xff\xef\x92\x79\x88\x5a\x5b\xdb\x24\x66\xac\xd3\x4c\xd5\x15\x80\x83\x0b\x83\x51\xeb\xd4\x40\xa9\x66\x23\x90\x7a\xd1\xf4\xb5\x62\x03\xf5\xe1\x59\xa4\x29\xe3\x54\x6e\xad\x0c\x01\x1d\xbe\xd0\x90\x28\x71\x7e\x3c\x3d\xfe\xd3\x91\x97\x76\x4d\x4d\x24\x5e\xf2\x28\xb9\x80\x44\x71\x8e\xf4\xd8\x82\x2f\x21\xb2\xc5\x68\x50\x38\x47\x3b\xf9\x3d\xc0\x93\x74\x51\xeb\x02\xd3\x1a\x46\xc8\xdc\x7e\x94\xc3\xe8\x67\x8c\x83\xb9\x8a\x43\x81\x8f\x12\x5b\x52\x8b\x47\x6a\xad\x31\xd1\x58\x4f\xfd\x48\xf1\x49\xe5\x73\x6e\x58\xf9\x42\x05\xd3\x88\x9e\x56\x7e\x4d\xd1\xea\xc2\xfa\xc1\xf8\xf4\xdc\x54\x0e\x53\x22\x46\x0f\xb9\x40\xe1\x2e\x93\xc4\xc9\x8d\xed\x19\x41\xc1\x90\x4f\x96\x7f\xb4\x64\x36\x84\xc1\x9a\x4d\x5c\x44\x1d\x60\xb0\xe9\xf4\x08\x55\xe5\x23\xfe\x7f\x99\x10\x76\x57\xa6\x80\x76\x27\x5b\xf8\x4b\x7c\x69\xa3\xf2\xb3\x85\x5b\xc8\x02\x6b\xa9\xb0\x0b\xc6\xfe\x34\xb9\x9d\xa0\x63\x17\x00\xa6\x7f\x52\xb3\x4e\x17\x96\x33\x98\x87\xa4\x83\x05\x12\x1d\x53\xab\x44\x40\xfc\x4b\x5c\x9b\xf7\x23\x94\xd5\xed\x37\x2f\xf1\x8c\xa3\xf0\x07\xbd\x02\xdf\x65\x1d\xc3\xac\x43\x82\x75\xf1\xa3\xe5\x24\x22\xb8\x6c\x45\x86\x76\x6a\x21\xcd\x89\xf8\x05\x80\x5d\xbb\x44\xfd\x89\xfe\x24\xfb\x2c\x0b\x40\xd1\xb7\x54\xc3\x35\xdb\xaf\xfc\x3b\x3b\xb8\xbb\x46\xc7\x4c\x36\x37\x45\x04\x04\x2d\x86\x78\x92\x27\x59\x98\x62\x31\x2e\x99\xca\x89\xeb\x50\x4c\xc3\xd7\x5d\x19\x49\x5a\xa8\x6b\x20\xb2\x73\x6b\x12\x1b\xb2\x07\x5c\x88\xed\x4a\x3f\xbd\xaa\x6b\x2c\x3f\x76\xd1\xff\x55\x25\xd3\xa2\x86\x3e\x4d\x83\xc7\x2b\xfe\x01\xe1\x02\x78\x80\x94\x74\xe1\x82\x2d\xe2\xd9\x62\x83\x48\x93\x20\x02\x96\x11\xaa\x9d\xff\xc4\x82\x9d\x66\x86\x9e\x63\x49\x4f\x9a\xad\xe7\x0b\x77\xa7\xb8\x0f\xbc\x93\xe3\xde\x4d\x93\x59\x13\x75\x2d\x04\x5e\x13\xb3\x12\xc5\xd0\x82\xf6\x24\x2d\x49\x85\xb0\x53\xb3\x78\x3e\xb0\x2c\x66\x14\x96\x3d\xc0\xd5\x5d\x4c\xbe\x88\x7b\xae\x29\xcc\x18\x97\x9e\x5e\x2e\xa9\x45\xbc\xd4\x0d\x89"}, +{{0x8b,0xd9,0x90,0x70,0xc5,0x0a,0x9f,0xa4,0x18,0xef,0x7f,0x75,0xc0,0x01,0x29,0x91,0x6a,0x41,0xc8,0x60,0x70,0x96,0x1c,0xcb,0x2b,0x20,0x2b,0xe1,0x8c,0x2d,0x10,0xd7,},{0xdd,0xd7,0x33,0x08,0xfc,0xe8,0xca,0x65,0x52,0xd0,0x39,0x42,0x8c,0x7a,0x1a,0x94,0x92,0x33,0x20,0xa3,0x1c,0x0f,0x58,0x0d,0x3c,0x23,0x52,0x80,0xf0,0x3c,0x18,0x30,},{0xb1,0x4a,0x7b,0x26,0x20,0x12,0xc5,0x90,0x9e,0x21,0xd5,0x87,0xfb,0x4f,0x29,0xa9,0x09,0x3c,0x8e,0x1c,0x29,0x99,0x81,0x6a,0x82,0x11,0x8f,0xef,0xbf,0x10,0xe6,0x8e,0xa8,0x98,0xbf,0x0d,0xa1,0x8e,0xbf,0xd0,0x34,0x1e,0xa8,0xf8,0x2a,0x18,0x44,0xc8,0xe0,0xdd,0x53,0x06,0xe5,0x09,0xb9,0xd0,0xc3,0x5b,0x47,0x3a,0x7d,0x20,0x95,0x07,},"\x48\x5f\x8d\x68\x0f\x79\xee\x2d\x82\x8b\xe7\xd0\x18\xa6\x5e\x0b\x64\xb0\xf0\x18\x48\x19\x86\x3e\x71\x10\xee\xa8\xf2\x99\xa7\x2c\x4d\xc8\x7f\x8e\xe8\xa8\xae\xaa\x81\xaf\x91\xdc\x71\xad\xea\x79\xfc\x97\x97\x42\x1c\xcc\x64\x6e\x6c\xd5\xdd\x48\xb4\xde\xc1\xde\x96\x86\x93\xfb\xce\x0d\x00\x21\xa3\xd9\x8d\x38\xa8\xbb\xc5\x81\x95\xe6\xdf\xc3\xb5\xe1\x46\x1b\x2a\x59\x41\x03\xe8\x0a\x29\x44\x1d\x5a\xaa\xf8\x89\xe3\x1c\xc8\x65\x14\x1f\x0c\x6b\x2c\x8c\x81\xf7\x21\x67\x9e\xa2\x39\x4e\xc6\xe4\x08\x1e\xc2\x03\xc2\xea\x39\x7d\x94\x84\x75\x7a\x7a\x0e\xcd\x53\xe6\x52\xdb\x9d\xf1\x7b\xea\x0e\x32\xfe\x8b\x2c\xbc\xe0\xd1\xd9\x7b\x96\x1e\xd7\x4e\x8e\x62\x2b\xcd\xd3\x55\x8b\x7c\x48\x69\x5a\xdf\x18\xaa\xe6\x11\x0e\xa9\xa3\x39\xb9\xda\x40\x7a\x9e\xda\xf2\xab\x08\x1a\x68\x1e\x18\x32\xcc\x21\x5b\x1f\x08\xa6\x7d\x55\x9a\x47\x44\xaf\x7c\xd5\x03\x18\xc2\x06\xee\x91\x15\x75\x82\xf8\x2e\xb6\xc0\xfc\x29\x02\x7b\x44\x61\xc3\x07\x33\xb8\x16\x9d\x14\x81\x32\x2c\x48\x60\x50\x9b\xa0\x96\xba\xcb\x71\xa5\x79\x24\x67\x51\xd5\x67\x54\x0e\x41\x43\x1e\x14\xf1\xb4\x6e\xf1\x6e\xba\x27\x61\x04\xbc\x01\x65\x0d\x5c\x49\x26\xe4\x7c\x9c\x60\x40\x78\x4b\x04\x3c\xd0\xaa\x48\x54\xef\xe8\x79\x7f\xd0\x46\x2d\x45\x39\xf3\x80\x35\xae\xf0\x8b\x45\x77\xc1\xa9\x11\x8d\x00\x4b\x6d\x01\x86\x2f\x52\x76\x77\x6d\xfe\xf1\x37\x18\x64\xf1\x55\xac\x0f\x07\x83\x89\xc2\x05\xcf\x05\x38\xd8\x5f\xa3\x48\x24\x4d\x7a\x42\x29\x11\x31\x0f\xf6\xc1\x01\x32\xb1\x59\x8b\xb4\x45\xc7\xe2\x07\x7b\x76\x3c\x47\x3d\x1e\x7a\x61\xa3\x8b\x64\x92\x9a\x64\x8b\x60\xb2\xe5\x43\x54\x37\x39\x22\x4b\x40\xfb\xf6\xd8\x7f\x10\x79\xc3\x0b\xc8\x73\xac\x38\x99\x1d\x51\xb8\x9e\x9d\x26\x1c\x4b\xcc\xb3\x75\x35\x5c\x07\x2c\x1e\xa2\x0e\x4f\xf9\x1d\x55\xd9\xf7\x54\x4e\x90\xd1\xc6\x64\x6c\x59\xaf\x72\x42\x4d\x8a\xaa\x8e\x0a\xed\x07\xb3\x88\x9d\x4e\x45\x0c\x12\x09\x68\x4c\xe1\x38\xd0\xc9\xda\x07\x95\x25\xf5\xaa\x02\x05\x0a\xf5\x70\xe4\x31\x5c\x2f\xa8\xb0\x99\xb7\x76\x5b\xfb\xb8\x94\xfa\xd3\x59\xb8\xe2\x48\x04\xec\xe0\x52\xac\x22\xa1\x91\x70\x53\x35\xe9\x88\x40\xa6\x24\xe4\xcb\xf3\xa1\xa1\xa3\x27\x81\x27\x85\xb2\xc0\xf5\xd6\x38\x14\x57\xb7\x2f\xdb\x63\x3e\x81\x93\x8b\xbb\x54\xb8\xc3\x7c\xcc\xb5\xd5\x9c\x58\x27\xc7\x68\x3a\x52\x47\x54\x49\x77\xe9\x84\x44\x21\x78\xd0\x85\x29\x06\xca\x6f\x94\x5c\x42\x29\xeb\x08\xad\x27\xe6\xc2\x75\xd7\xb4\xec\x8d\xc2\x5f\xb2\x81\x93\x37\xe5\x3e\xad\x6c\x7a\xa7\x87\xf9\x1a\x7d\xc6\xdd\xaf\xd5\x36\xee\xfc\xbd\xec\x2c\x50\x16\x7b\xe3\x43\x06\xa8\x2e\x16\xd5\xd5\x2b\x3b\x1b\xe0\x08\xa7\xa6\x11\x27\x4c\xe2\xcf\x8d\x62\xe3\xb9\x00\xc0\x99\x43\xbe\x70\xcc\xc7\x7b\x07\x06\x37\xc2\x50\x61\xd6\x1b\xe9\x10\xee\xf5\x0d\xf1\x87\x44\xc3\x3e\x76\xf6\x70\x1e\x0a\x8f\xf6\x29\x7f\xa6\x7e\x4b\x41\x08\xc1\x37\x56\x72\x7a\x9d\x74\xbc\x9e\x17\x98\x3e\xec\x08\xf8\x66\xb7\xc7\xff\xb3\x7f\x3c\xcb\x01\x41\xa8\x0f\xef\xf6\x32\x2b\x2a\xc6\x2b\x84\xce\x27\x97\xfd\x98\xd6\xff\x26\x9a\x41\xa0\xc3\x84\x82\xdb\x67\x98\x62\xa3\x8c\xd2"}, +{{0x1a,0xf4,0xcf,0x6d,0x24,0xab,0x37,0x82,0x86,0x7d,0x96,0xa1,0xc2,0x75,0xce,0xeb,0x02,0x2c,0x69,0x1a,0x30,0x8e,0x62,0x45,0x66,0x5d,0x61,0x6b,0xf6,0x7c,0x2c,0x32,},{0x19,0xd3,0x17,0xea,0x98,0xd3,0x5b,0xa5,0xfa,0x67,0xc1,0x2e,0xcf,0xb3,0x27,0x50,0xdf,0x27,0x5d,0x7a,0x45,0xb8,0xe2,0x11,0xa7,0xac,0x47,0xed,0xe7,0x71,0x2d,0x9f,},{0x7e,0xb4,0x6c,0xd0,0xde,0x31,0x55,0xb4,0x37,0x47,0xd7,0x32,0xf1,0x04,0x5d,0x8e,0xf7,0x44,0x92,0xad,0x82,0x7a,0x22,0x45,0xbd,0x17,0x10,0x28,0x28,0x44,0x2e,0x43,0xa0,0xce,0x7e,0x8b,0x26,0x8e,0xd7,0xfd,0x8d,0x3e,0x7b,0x28,0xf0,0x72,0x79,0x5d,0xa3,0xe0,0x70,0xf1,0x2b,0xc4,0xe2,0x3e,0xae,0xf5,0x7b,0x85,0x3c,0xee,0x88,0x0a,},"\xf4\x45\xfd\xcf\xe2\x8c\x17\xbd\x44\x27\xae\xa5\x67\x6c\x0e\x12\x80\x84\x15\x97\xe9\xd6\x6d\xe7\xd7\xa7\x17\x23\x11\x09\x39\xbe\xd0\x0f\x4e\xba\xf9\x60\x3d\x53\xc9\xcb\xf6\x27\x1b\xe5\x47\xaf\x29\xb2\xa0\x45\xec\x41\x28\x8a\x7b\xb7\x9d\x66\x2d\xc2\x10\xe2\x15\x95\x7f\xa8\x46\x88\xc9\x16\x54\x3e\x56\x17\xf5\x60\xe4\xd3\x8f\x73\xba\xef\xc3\x7e\x11\x91\x4e\x47\xc5\x15\x06\x78\x51\xe8\xed\x21\x39\x3e\x13\xdd\x19\xed\x9b\x73\xd9\x89\x45\xfc\x82\x6a\x25\x8e\x95\x7d\xc0\x83\xdd\x8e\x53\x5c\x30\xa5\x4b\x42\x66\xdd\x71\xd1\x13\xce\x85\x6b\x46\x28\x2a\x18\x03\x36\x27\xa9\x8e\x64\x72\xcc\xb4\x63\xed\x3d\x96\xfa\x7b\x35\x5d\x3b\x2c\x2a\x2b\x60\x10\xdd\x14\xf4\xea\x39\x65\xdd\x87\xbe\x1c\x42\x9b\xde\xa8\x30\x0b\x4b\x0b\x44\x45\x86\x35\xb4\x97\x9f\x5e\x3e\x8e\xb5\xc6\x18\xd4\xe1\x3e\x1d\x68\x8b\xf8\x8c\x7e\x4a\x3d\x93\x8e\x84\x33\x6d\x67\xbe\x68\xdf\x34\x35\xc5\xc9\x90\x86\x32\x1c\x02\xe1\x3b\x4a\x12\x52\x4b\x34\xe4\x6a\x0b\x4d\x27\xf3\x0d\x7e\xd4\xf5\xce\xcb\x36\xde\xad\xf0\x9e\x7e\xfc\xc7\x55\xca\x66\x75\x68\x29\x79\x14\xc6\xbc\x24\x06\x27\xd9\xd0\x9a\xac\xf8\x54\x15\x41\x2c\x06\x35\x62\x34\x53\x27\x8d\x9b\xf0\xe1\x0e\xec\x65\xfc\x72\xaf\xff\xfa\x93\x92\xdc\x78\x81\xd1\xe5\xc7\x60\xa4\x02\x80\xf1\x6b\x14\x75\x12\x7b\x91\xb6\x9c\xcb\x65\xdc\x4b\x35\xde\x10\xf9\x43\x25\xc0\xcb\xe1\xc4\x70\x19\xa2\xea\xf2\xb4\xba\x92\xd7\x85\x22\x9a\xac\xfa\xd1\x82\x6e\xbb\xde\xbe\xfb\x7d\xad\x4b\x05\xf8\x82\x43\xe1\x5f\x27\x97\x66\xe3\x32\x1d\xd8\xdb\xa6\x50\x44\x4d\x81\xfb\x08\x78\x76\x7a\x9c\x63\x53\x4b\xb4\xba\x21\x28\x5a\x24\x16\xcb\x8f\x85\x6d\x11\xa9\x6e\x0a\x8c\x8d\xe1\xe1\xa7\x51\x32\xf1\x56\x4c\xd9\x94\x99\x56\x90\xbb\xed\x2e\xe1\x54\x53\x7f\xb6\xf2\x79\xfb\x09\xc8\xde\xa6\xf6\xaf\xab\xc6\x28\x56\xe3\xd1\x28\xfd\xfa\x79\xfc\x49\x76\x19\x3b\xb9\xb3\x36\x86\x1e\x47\xb5\x6d\xc2\x58\x23\x93\xd2\xe5\x44\x65\x1a\xc8\x5b\xc5\x8e\x9e\x6a\x94\xdc\x4c\x39\xc4\xef\x72\x53\x8a\x14\xf8\x56\xcd\x95\xc3\xe2\x79\x0a\xde\xe0\x3a\xb2\xe5\x2c\xa0\xae\x47\x1d\xe5\x02\xcb\x19\xe6\x76\xaf\x35\xf5\xf9\x3d\x84\x0f\xef\x96\x06\xcb\xe9\x2d\x8b\xc2\x50\x06\x10\x5d\x92\x34\x45\x88\x83\x88\x42\xc3\xbe\x50\x5c\x73\x50\xe3\x51\xb7\x35\xe6\xcc\x6f\xb7\x92\x75\xb2\x7b\xd9\xeb\xd3\x6b\xa4\xd0\x60\xac\xee\x73\xb5\xa3\x15\xce\xff\xab\x86\xd0\x6f\x21\x68\xa6\x70\x65\x57\x81\x96\xa0\xed\x04\xa4\xdd\x71\xd6\x73\x48\x37\xdb\x08\x38\x57\xab\x1e\xb5\xe0\xee\xc4\xff\xba\xc9\x54\x4f\x4e\xc1\x9b\xde\x19\x4d\xf8\x4b\x1c\x84\x83\x41\x57\x4b\xf1\x0d\xae\xe8\x5b\x81\x78\x19\x6f\xb6\x08\x12\x3a\x80\x81\x71\xd7\x3c\xe4\x20\x6a\xd6\x52\x16\xad\x1a\x5c\xbd\xe4\x0b\x19\xd6\xae\x7f\x40\xdf\x97\xab\x84\x32\xe2\xc5\x3a\x50\x4e\xd1\x22\xe2\x5f\xb7\xa5\x1c\x14\x35\x4a\xb3\x92\x8e\xde\xb3\x9c\x29\xeb\x24\x6b\x74\xa0\x76\xf8\x9d\x03\x50\x4f\x40\x1b\xd1\x76\xb5\xcf\xfe\xe4\xb9\xdb\x09\x7c\x45\x76\x4f\x51\xaa\x37\x67\x04\xb5\xa7\xf2\x10\xb3\xf1\xa9\x05\xe2\x5d\x67\x00\x2f\x65\x57\xeb\xb7\x49\x73\x7c\xda\x31"}, +{{0x2a,0xac,0xc8,0x19,0x7f,0xf8,0xfa,0xe1,0xc1,0xcf,0x38,0x62,0xe3,0xc0,0x4a,0x21,0x78,0x29,0x51,0xf8,0xe4,0x8e,0x40,0xb5,0x88,0xf8,0xbc,0x74,0x60,0xc3,0x0a,0x03,},{0x9a,0x1b,0x01,0xe2,0x15,0x4f,0x1c,0x36,0xa8,0xe1,0x6b,0x79,0xee,0x7d,0x2d,0x05,0xb8,0x71,0x2e,0x0d,0x27,0xa0,0x61,0xa6,0xd4,0x1d,0x47,0x57,0x78,0xb0,0xdf,0x8c,},{0x64,0x7c,0xdd,0x6c,0x1a,0x67,0x29,0x0e,0x57,0x67,0x6a,0x78,0x11,0x3a,0xaa,0xdc,0xa6,0x9a,0xc5,0x7b,0x99,0x77,0x15,0xc5,0x09,0x89,0x5b,0x8c,0x5c,0x94,0xe8,0x2c,0x0b,0x6a,0xce,0xcc,0xf3,0xba,0x8b,0xd7,0xcf,0x61,0x75,0x2b,0x1b,0x19,0xd1,0x3b,0x49,0xf1,0x5f,0x8b,0xfa,0x04,0x6e,0xb4,0x42,0xa5,0x5c,0xd5,0xba,0xb1,0x42,0x02,},"\x5d\x82\x75\x2c\xe5\xda\x31\x80\xfa\xf4\x78\x7a\xed\xfb\x19\x29\x4b\x43\x48\xa1\xd9\x20\x2c\x85\x39\x83\x31\x32\x3e\x0f\x42\xb0\x83\x52\x27\xe6\x8e\x11\x56\xf2\xd4\xba\x2f\xe4\x50\xe6\xd6\xef\x2b\x92\xd8\x9b\xbb\xe4\x09\x6e\x12\xca\x83\x97\xeb\x2f\x45\xe6\x76\xf1\x67\x3a\xa4\x1c\x95\x9f\xcd\x30\xd5\x57\x88\x53\xb5\xdb\xd1\xc0\xd5\xb3\xa0\xf0\xd8\x70\xec\xa7\x1e\xa1\x33\x90\x11\x1b\x25\x8f\x65\x48\xb3\x2f\x37\xa0\x5e\x97\x44\xa6\x56\xfd\x77\x8d\x65\x72\x19\x65\xc6\xd9\xb3\x28\x60\x0b\x45\x70\x47\x70\xe0\x4b\x09\x97\x90\xaa\x78\x84\xf0\x0d\x7b\xb7\x65\x9e\x33\x72\x10\xbd\xc2\x3e\xaa\x71\xd7\xb0\x16\x03\x0a\xca\x62\x23\xb5\x56\x9b\xdf\xc2\x90\x81\x1a\xac\x40\x95\x24\xdc\xcb\xf9\xba\xbc\xbe\x4b\xf2\x09\x46\xb5\x44\x31\x7c\xa6\xf2\xf9\x18\x31\xc7\x9f\xb2\x73\xb6\x40\x4e\xb4\xe6\x1e\x1f\x7b\x10\x6e\xbd\x0d\xb9\xf2\xb1\x97\x4d\x2f\x03\x1b\xce\x25\x80\x36\x06\x55\x2c\x34\x41\x65\x5e\xfc\xf2\xc7\xea\x52\xad\xcb\x30\x99\x3d\x85\xf2\xdd\xa7\x96\x03\xe9\x41\x5a\x02\x32\x45\xa6\x6c\x07\xa9\x56\x93\x31\x46\xf5\x3c\x99\x3c\x08\x89\x18\x08\xb8\x16\x6b\x30\x72\x1f\xbd\x1f\x8a\x1b\x93\x7d\x14\x07\x0d\x78\x6e\x9e\xb4\x51\xf2\xab\x51\x42\xf8\x3a\x60\xf3\x5d\x76\xad\x8b\x81\xd6\xa5\x7c\xf3\x68\xfc\x6f\xca\xcc\x0c\x47\x58\x44\x0d\x9c\xd5\x95\xb1\xb0\x94\x2a\x36\x55\xe2\x50\xda\x98\x3b\x72\x41\x54\x6d\xcf\xbe\x0a\xe8\x10\x77\x65\x02\x95\x40\x9f\xf9\xe9\x09\x77\xfb\x99\x60\xcb\xf4\x0a\x2a\xf5\x17\x74\x02\xba\x2f\xaf\x50\xdb\x6f\x1a\x73\x65\xcf\x99\xe9\x92\x42\x9e\x38\xdb\x43\xea\x83\xfd\xdc\x95\xa6\x48\x67\x6c\x0b\x16\xbc\x95\x2b\x15\xde\x99\xd5\x2f\x6b\x52\x33\xda\x4e\xae\x19\x78\xe8\xba\x25\xe6\x23\x5a\xfb\xc5\x11\xc7\x6c\x4c\x87\x4c\x92\x37\x92\x2b\x1c\xef\x08\x47\xd0\x7a\x80\x20\x0c\xba\xe3\xc7\xc8\x1f\xcb\xd0\xd1\x72\x52\xed\x8c\x61\xad\x19\x54\xfc\x86\x2e\x1e\x04\x44\x4c\x32\x08\x6f\xee\x38\x0d\x1c\x17\x54\x13\x22\xb9\xa6\x0d\xa6\x62\x35\x2e\x21\x0e\x9a\xe2\x15\xe3\x53\x29\x6d\xb9\x22\x33\x9a\xa1\x7d\x21\x73\xec\x31\xf1\xc5\x30\xa2\x4b\x1f\x34\x8a\x31\x57\x2e\x14\x69\xca\xac\x80\x8f\x9c\x76\xec\x27\x31\x87\x3b\x80\x3e\xad\x3e\x54\xea\x24\xbc\x24\x49\x9b\x97\x04\xb3\xbd\xce\x81\x38\x9b\x9d\x14\xd4\x95\x27\xc0\x4b\x3b\xb9\xe3\xba\x6d\x94\x6c\xea\x58\xcf\x78\x6d\x4d\x28\xb8\x9b\x41\xc5\x82\x74\x03\x5a\x86\x90\x5a\xd9\x57\x58\xc3\x16\x13\x66\xab\x93\xda\x81\xe6\xb4\xc8\x08\x36\x4e\x08\x7d\xae\xea\x4c\x4c\x5c\x2a\xa6\x87\x19\x37\xc5\xfe\xab\xa2\x14\x9f\x01\xf7\x38\xf4\x53\x96\xe6\x6e\xa8\x06\x32\x21\xe1\xc8\x1c\x05\x25\x5b\xa5\x64\xad\x44\x0c\xb5\xd0\x7c\xbd\x4b\xab\x94\x1e\xa5\x93\x24\x49\x30\xbc\x5c\x28\x9b\x31\x65\xd3\xec\x88\x47\xeb\xc4\xb6\x74\xc0\xa4\x9f\x91\x69\xad\xef\x78\x6d\x77\x67\xbc\x8f\x21\x3d\xb7\xd9\x5c\x06\xe9\x9b\xc1\x1e\x20\x00\x55\xb6\x5e\xb7\x9a\xda\xa0\x1b\xcd\x2c\x85\xda\x43\xce\x63\x70\xe1\x2e\x34\x9b\xf6\xd4\x75\x48\x7a\xff\xdf\x92\xe2\x0a\x3a\xcd\xed\x1d\x76\xf9\xe8\x3e\x91\x9e\x98\xde\xf1\x95\x07\x2a\x50\xd0\xc5\x71\xdd\x25"}, +{{0xff,0x86,0x21,0x56,0xc7,0xea,0xb6,0x81,0xc9,0x5e,0xff,0xf8,0x00,0x3e,0x00,0xa1,0x4f,0x1f,0x0d,0x50,0x5d,0x55,0x07,0xe6,0xe5,0xb3,0x91,0x79,0xdf,0x9b,0x1c,0xda,},{0xe1,0xb8,0x9f,0xb3,0x11,0x14,0xea,0x46,0x10,0x7f,0xfd,0x03,0x29,0xf1,0x06,0x64,0x28,0xde,0x54,0x70,0x8e,0xdb,0xec,0xf3,0xed,0x9d,0x47,0x08,0xcd,0x14,0x3f,0xe2,},{0x4b,0x81,0x37,0x04,0x2d,0x67,0x84,0x75,0x7d,0x4a,0x9c,0x06,0xbc,0x74,0x32,0xf4,0x80,0x9b,0x1c,0x6a,0x90,0x35,0x42,0x73,0x6d,0x9a,0x57,0x66,0x8c,0x20,0x84,0x5c,0x17,0xd4,0x68,0x55,0x70,0x85,0xc5,0x7f,0xb6,0x32,0x13,0xda,0xd3,0xbe,0x0f,0xa3,0x6a,0x11,0x8f,0x7c,0x1a,0xef,0xf2,0x56,0x2f,0xf4,0xb8,0x88,0x8c,0x26,0x90,0x0e,},"\xb3\xd1\xdb\x72\xa6\xa9\x85\xec\xd7\x0a\x2c\xff\x6c\x18\xc1\x79\xe2\x17\xd4\xf4\x10\xfd\x39\x34\x96\x96\x85\x90\x1b\xd0\x71\xbc\xe6\xc2\xfb\x67\x63\xe1\x0c\x6f\xa1\x6e\x75\xa1\x17\x60\x66\xb8\xec\x81\xae\x3a\x80\x39\xe7\x1d\xc2\xcd\xc6\x4a\x40\xfd\x62\xb7\xce\xe7\xbe\x4b\xa0\x33\x2f\xe4\x5d\x0b\x60\x15\x86\x52\xe3\x3f\x8d\x3a\xff\x3c\xb4\xd6\xb0\x21\x74\x4d\x0d\xd1\x78\xb1\xbf\x0a\x1c\xc1\xd3\xfe\x93\x21\xbe\x28\x42\x1e\xb8\x82\x63\xa1\x24\xf4\x97\x92\xd0\x79\x47\x5a\x8c\x55\x5f\xf5\x69\x08\x73\x51\x4b\x5d\x48\x3e\x53\x21\x7e\x0c\xbb\x12\x86\x2b\x85\x0f\xe3\x90\xc8\xf8\x30\x08\x08\x6e\x64\x9a\xc9\x04\xb0\x18\x35\x0a\xb4\x91\x57\xee\x9b\xca\xe6\xc0\x7a\x4b\x87\x8b\x48\xe2\x5e\x98\x4f\xbb\x4d\x36\xb6\x1d\x68\x9b\x13\x46\x8a\x28\xd1\xe3\x87\xe0\xe8\x86\x57\xf8\xc8\xac\x95\x86\xa6\xe2\x6c\xf9\x4d\xff\x6f\x82\x64\xe3\xff\x62\x58\x86\x5c\x6d\xcf\x85\x7b\x00\x14\x78\x86\xe1\x75\xdf\x04\x32\xe3\x2f\x04\x40\x0e\x29\x9f\x21\x18\x83\x12\xb3\x2d\xfc\x05\x0e\x7b\x7e\x87\xee\xaa\x0c\xba\xac\x6b\xe9\x93\x7a\x5e\x0c\xc3\x11\x13\xde\x7c\x8b\x23\x3e\x1c\xe8\xe5\xd9\xc5\x64\xfb\xe9\xf3\x7b\xbd\x41\x1d\xf7\xa5\xe4\x4e\x6c\x7e\xbb\x67\x6d\x85\x89\x4d\xcc\xf4\x86\x5e\x4d\xda\x0c\xad\xef\x2b\xbc\x55\x00\x0b\x3a\x29\xf1\xf7\x1e\xf4\x46\x1d\xdc\x3b\x33\x1d\x91\x56\x65\x34\xc5\xd6\xd8\x4c\x73\x13\x76\x29\x53\x20\xf8\x0a\xdc\x90\x28\x8f\x99\x53\x55\x4f\xcd\xf9\x21\x3d\xe6\xa9\x05\x21\x0d\x4c\x80\x64\xaf\x91\xcd\x98\x32\x5e\xf9\x18\x98\xd3\x3d\x70\x03\x82\x02\xe3\x2f\xb6\x70\x9c\xa3\xd7\x88\xfe\xcb\xd1\xb8\x41\xfa\x4e\x5e\x90\x62\xd6\x42\x67\xc3\x5c\xfd\x44\x4f\xb6\x9e\x2f\x60\x47\xf5\x8b\x1c\x2a\xf4\xcc\x7e\x4c\xac\x2f\x89\x08\x88\x36\x05\x92\x11\x3e\x96\xad\x3a\x85\x7e\xd0\x5e\xaa\xba\x6f\x91\x53\xef\x89\xb9\x3e\x00\xe8\x74\x37\x33\xec\x47\x2d\x9b\x0e\xec\x1c\xd8\xfa\x52\x42\x5c\x4a\x26\xbd\x7d\xf7\x3a\x27\x12\xbe\xbe\x51\xae\x3b\x25\xeb\x78\xdb\x82\x14\x90\x31\xfe\x7b\x28\x1a\xf6\xcb\x77\x14\xed\xf8\x9d\xe9\x15\xf3\x47\x0f\x15\x3e\xed\x7f\x45\x62\x43\xbb\x90\x34\x2e\x19\x0e\x64\x7f\x39\xe0\x46\x88\x3c\xe2\x8a\x89\x20\x03\x31\x5e\xa3\x79\x42\x9e\x95\x82\xa9\x35\xeb\x78\x96\x33\x96\xd1\x36\x84\x5f\x86\xc4\x66\xe8\xfa\xf2\x27\x2f\x43\xff\xef\xc2\xad\xa5\x60\x1f\x8a\x6b\x2a\xc4\xcc\x6b\x92\x82\x09\x17\xf2\xe0\x39\x3c\x8f\xaf\x98\x2d\x6c\x5f\x4f\x23\x0e\x27\xce\x22\x78\xa7\x23\x77\x47\xfa\x85\xa9\xc8\x57\xbf\x18\x02\xc3\xea\xe0\xd2\x35\xb5\xad\x58\x49\x7d\x66\xa0\xd3\xa9\xba\xeb\xcc\x41\x7f\x18\x33\xe9\xcc\x44\x60\xf9\x75\xd7\x28\x58\xcd\x11\x8d\x7a\xaf\xaf\x1c\x87\x82\x97\xca\xcf\x71\xac\x75\x67\x6d\xc1\xb4\xfb\x51\xc1\x77\x58\x10\xd0\x35\x37\xf2\xd7\x66\x27\x8b\x99\x71\xbb\x97\xd3\xc4\x9b\x51\xfe\xb2\x6d\x37\x5e\x0c\xb9\x10\x95\x74\xa8\x16\xf8\x4e\x76\xfc\x7e\xf0\x72\xd5\x79\x3c\x2f\x65\xab\x2e\xfd\x90\x52\xe6\xb8\x56\x9f\x28\x05\x86\x1c\x31\xa7\x34\x4a\x3c\x44\x06\x9a\x94\x32\x0d\x27\x4e\x27\x12\x71\xea\xfa\x3b\xfe\x64\xde\x75\x37\x84\x6a\x01\xe5\x1f\xda\xe0"}, +{{0x58,0x26,0x19,0xab,0x3c,0xf5,0xa3,0xae,0x77,0x66,0x88,0xbf,0x6d,0xba,0xcb,0x36,0x33,0x0a,0x35,0xad,0x75,0x24,0xe4,0x9e,0xf6,0x63,0x68,0x77,0x64,0xcf,0x6e,0xc7,},{0x20,0x02,0xea,0x0a,0x38,0xa3,0x27,0xe0,0x38,0x4a,0xea,0xe4,0x68,0xdb,0x0f,0x6c,0x85,0x16,0xa6,0x96,0x09,0xaf,0x9e,0xee,0x93,0xe9,0xec,0xb9,0x4b,0x44,0x9c,0x66,},{0xfe,0x97,0x01,0xda,0x1a,0xa8,0x1c,0x55,0xba,0xc3,0x36,0x38,0xf7,0x75,0x54,0x2b,0x80,0x44,0x80,0xf3,0x4b,0x7b,0xfc,0x78,0xda,0x99,0x16,0xe5,0x24,0x6a,0x60,0x4d,0x39,0x0b,0xf9,0x20,0xc8,0x72,0xa7,0x79,0x24,0x24,0x6e,0xe8,0xd0,0x39,0x3b,0x20,0x2e,0x7b,0x25,0xb2,0x48,0x4f,0x65,0x4a,0xc3,0x67,0xcb,0x09,0x25,0xec,0xe3,0x05,},"\xca\x74\x28\x4f\x11\xc5\x6e\x25\x98\xd7\x8a\x4e\xcd\x03\xb4\x0e\x01\x7a\x55\x81\x76\x01\x2b\x26\xfd\xf6\x95\xc3\xde\x98\xa7\x4f\x8f\x40\xa4\x7d\x79\x78\xed\xc2\x4e\xe8\x09\x2b\xfe\x5e\x61\x59\x68\x34\xde\xed\x1d\x9d\x34\xa0\xf5\xcd\xae\xbe\x34\x21\xaa\x19\xe0\x12\xde\x86\x5b\x9e\xe1\xb7\x34\x79\xb2\xbd\x1a\xc9\x82\xf9\x7e\xd9\xc7\xcd\x20\x45\x9c\x60\xfb\xb1\x1e\x1e\x2b\x4e\xac\x5d\xb6\x84\x4c\x71\xd7\x29\x49\x50\x2b\xba\x50\x3a\xce\xc9\x05\xad\xba\x25\xf6\xb1\x19\xea\xf9\x63\x9f\xa8\xab\xb3\x02\xdf\xf9\x93\x2d\x85\x0c\xc4\x4c\x57\xcf\x90\xb2\xe5\x8a\x8b\x52\x51\xc1\x26\xa9\xe2\x8f\x5c\x76\x1b\x62\x80\xe2\xcd\xdd\x79\xcb\xd6\x8e\x53\xff\x4a\x62\x26\xd3\xbd\x4c\x96\x1b\x9b\x9e\x43\x45\xa2\x54\x58\x62\xc7\x97\x38\x66\xf0\x42\x0b\x89\x8e\x7b\xae\xa9\x0e\xa4\xee\x00\x40\x42\xef\x38\xa1\xfd\x95\x6a\x72\xfd\xf6\xfd\x43\x25\x7d\xa9\xfd\xb9\x66\x80\xef\x4f\xdf\x9e\x94\x3d\x26\x5c\xdc\xf2\xe5\x2e\x32\x01\xd5\x40\x8b\xc6\xce\x10\xe5\x70\x0a\xdf\x12\xb5\x5b\xa1\x4a\xa8\x29\xd8\x69\x1c\x31\xf2\x4f\xc4\xa5\x1c\xe6\xfa\xa1\xf3\xef\x2e\xad\x78\xe5\xe7\x53\x44\x6a\xd3\xfa\x4a\x84\xc1\x93\x97\x9a\xeb\xc8\x30\x9b\xad\x60\x81\x4f\x48\x59\xb9\x31\xd7\x04\x14\x76\x44\x91\xc6\xc9\xed\x8d\xb6\x73\xc5\x43\xd3\x51\x85\xcd\x28\x88\xaa\x21\xc1\xa9\x20\x34\x27\xe0\xac\x0b\x1f\xe3\x4c\x0e\x4a\x40\x01\xe0\x95\x6c\x13\xcb\x59\xa3\xba\xf8\x7c\x21\x09\xa8\x88\xa4\xc9\xe7\xaa\x48\x17\x67\xd8\x02\x0f\xf3\x5d\xd7\xc5\xcc\xec\x7c\x08\xe9\x71\xa7\xe2\x18\x13\x8c\x90\x54\x6a\x7d\xdf\x36\xad\x11\x4b\xe5\x85\x57\x43\x2c\x2d\xdf\x34\xce\xd3\x37\x9f\x70\xd4\x40\x7e\x58\x79\xf9\x84\x2f\x38\x17\x17\x05\x1b\x16\x85\xaa\x7a\xb0\xad\x38\x54\x1e\xc1\x68\xf5\x1c\xb6\x88\xf3\xcd\x1a\x01\x9a\x33\x6c\x9f\x4f\x3f\x82\xde\x78\x5c\x07\x48\x67\xfd\xc8\x80\x0f\xc7\x6f\xba\x04\xc8\xad\x8d\xe1\x0d\x2e\x9b\x43\x05\x81\xbe\x44\xc4\x1e\xcc\x8f\xc8\xa6\x16\x31\x43\x99\xd1\x8c\x64\x79\xf5\x7e\x57\x3b\x22\xa6\xee\x5c\xe2\xdc\xc0\x89\x48\xa0\xde\x1f\x0d\xd2\x5b\x65\x71\x5a\xb1\x8c\x70\xc7\x62\xfc\x3d\x7d\x60\x0c\xad\x63\x22\x60\x38\x50\x9c\x19\xab\x35\xb5\x49\x3e\xee\x73\xa7\x03\x73\x1e\xc5\x35\xc9\x0c\x6f\x06\xd9\x4d\x3e\x5f\x7e\x51\xa0\x9f\x9f\x8f\x42\xc5\x01\xb8\x50\x46\x86\x36\x5c\xee\xe9\xe0\xfe\x00\x13\x29\xf3\x03\x52\x21\x46\x71\x7c\x6a\x12\x58\xd0\xf1\x57\xcb\xea\x4b\x5a\x5e\x3d\x13\xbc\x90\x7e\x95\xfd\x6e\x8a\x71\x89\x6a\x02\xc3\x10\x6b\xd2\x6a\x51\x00\x51\xf1\xb3\x02\x58\xab\x27\xf8\x75\x67\x3b\x13\x37\xee\x36\xb7\x1a\x37\x6e\x0f\x9e\x78\x09\xa6\x7c\x67\xd9\xac\xc1\x6c\x25\x1d\xcb\x8c\x92\x6c\x8e\x93\x25\x16\xd3\x8b\x72\x33\xea\xc6\x15\x9c\x59\xca\xd0\x30\x7c\x59\x0e\x71\x31\xb6\x22\x19\x14\x5a\xaa\x35\x5b\xfb\x4a\xcb\x6a\xf0\xa5\x50\x00\x06\xcd\xd8\xb8\x13\xfe\x19\x08\x60\x2e\x08\x74\xc9\x62\x2b\xb3\x76\x73\xba\x1a\xcb\xa4\x14\x23\x16\x67\xbc\xc4\x90\x7a\xc8\x71\xf8\x7e\x6c\xe3\xf5\x91\xc1\x91\x71\x05\x7a\x9f\x45\x7f\x53\x62\xae\xda\x10\x5d\x18\xfb\x84\xf7\xd0\xf0\xa7\xda\x7e\xf8\xda\x91\x14"}, +{{0x2b,0xbd,0x83,0x0c,0xe7,0xde,0xf3,0xfe,0xce,0xa1,0xec,0xd6,0xea,0x0a,0xe9,0xc9,0xf4,0xfa,0x8f,0xfc,0x3b,0x1f,0x19,0x38,0xc5,0x05,0x05,0x1b,0xab,0x40,0xcf,0x7a,},{0x0f,0xdf,0xed,0x8d,0xe3,0xc1,0xea,0xf8,0x91,0xce,0x37,0xe3,0x4c,0xb4,0xa2,0x44,0x1c,0xbb,0xae,0x08,0x83,0x38,0x3d,0x70,0xde,0x24,0x64,0x85,0x0b,0x4a,0x64,0x2a,},{0x13,0xeb,0xc9,0x79,0xa8,0x87,0x10,0xe3,0xc5,0xf3,0x45,0xcf,0xbb,0x82,0x48,0x13,0xb3,0x08,0xa9,0xd5,0xc6,0xde,0xe3,0x28,0xbf,0xd2,0x35,0xa9,0x7d,0xe7,0xb3,0x26,0xde,0x6c,0x73,0x8f,0x96,0xf6,0x98,0x31,0x94,0x92,0x09,0x99,0x68,0x52,0xdd,0x9c,0x09,0x8d,0x58,0x08,0x41,0x87,0x09,0xf2,0xbf,0x51,0x0d,0x46,0xb7,0xf0,0x36,0x06,},"\x5f\x1e\xde\xaa\x3c\x0b\x2a\x63\x31\x1d\x97\xf1\xc5\x4e\x7e\x2f\x68\x71\x70\xe6\xb4\x6e\x21\x69\xcb\xf5\x6c\x66\xf2\x31\xbf\xc4\xa5\x76\xbd\x2b\x84\x20\xbf\x35\x7d\x3a\x90\xf8\xf3\x2e\xa1\xad\x99\x39\xb4\x67\x25\x4b\x66\xa1\xdf\x1f\x5b\x4c\xba\xc6\x3a\x5c\x27\x24\x26\x0d\x24\xd8\xdf\x8e\xdb\x58\xae\x24\x7a\x25\x91\xe9\x20\xb1\xa4\x20\xcf\x8d\x85\x39\xea\x57\xdb\x0d\xad\xff\x1a\xd3\xe9\x8c\x31\x72\xd0\x33\x16\x3c\xb4\x34\xa7\x66\xb0\xc1\x18\xa5\x6a\xbd\xcc\xe7\x9c\x82\xaf\x7b\xac\x74\xed\x0e\xa0\x24\xac\x4c\xe0\x22\x2d\x0a\xa9\x14\xf4\x32\x09\x2b\x1b\x51\x78\x04\xdb\x59\x18\xa8\x45\xe9\xcc\xa5\x5a\x87\xdb\x7c\x28\x52\xf7\xdd\x2e\x48\x36\x01\x85\xcc\x44\x2c\x79\x30\xaf\xe1\x5d\xd6\x22\xcc\x02\xbc\xd1\xee\x77\x8b\x59\x70\x5f\x14\x33\x32\x41\x58\x8a\x52\x2d\xe2\x44\x07\xe8\xe6\xe1\x0d\x5e\xf3\xa8\x8e\x3a\x3c\x44\x38\xc1\x7f\x75\x04\x67\x4f\xd7\xe4\x18\xcb\x2f\x77\xad\x0a\x56\xd2\x38\x67\x03\x15\x5e\x9a\x40\x1c\x43\xdd\xb5\x1e\xad\x55\x20\xaa\x7b\xa0\x38\xe7\xde\x53\x31\x41\x8a\xd5\x52\xbd\xcd\x18\x5f\x50\x3a\x85\x48\xf5\x5b\x63\x86\xe4\x68\x7c\xa5\x15\xf7\xc0\xee\xa5\x70\x98\x3b\xfb\x24\xbe\x16\xf7\xb3\x00\x3f\xb7\x56\xe3\x26\x56\x2f\x2a\x32\xfe\x65\xff\x84\x4c\x39\x84\xc7\x2e\x40\xdd\x49\xe4\xf3\xae\x8c\x0f\x81\x9a\x79\x39\xb2\xe7\x36\xe3\x81\xf5\x82\x3c\xbc\x61\xb2\xed\x01\xd9\xb0\x5c\xf8\xb1\x46\x48\xa4\x8b\x0d\x7c\xbe\x88\x2a\xc1\x6c\xad\xd8\xc4\x2a\xa2\xc7\x02\x46\x34\x7b\x4d\x84\x95\x36\xa7\xac\x22\xc7\x20\xda\x3c\xf1\x78\x72\x5e\xe5\x57\xa9\x2c\x25\xb1\x2b\x8b\x95\x6d\x3b\xf4\x80\x2e\x9e\x8a\x15\xb5\xab\x75\x42\x35\xcc\xa0\xe5\xb7\xe5\x5e\x4a\xec\xe4\x5a\x47\xe0\x84\xce\x14\x47\x44\x05\x98\xef\x5d\x4f\x5f\xdc\x2c\x98\xa5\xad\x13\x6c\xff\xbf\x87\xd3\xcf\x52\xf6\x73\x8c\xca\x79\x48\x35\x60\x92\x07\x8f\xdf\x25\x45\x77\xf5\x59\x69\xa0\xc6\x52\x46\xda\xc8\x09\xa2\xfc\xa1\xf6\x0a\x1d\x92\x98\x77\xb9\xa6\x54\x0e\x88\xa9\xe6\xe9\x15\x59\x38\xd2\x2c\x68\x7e\x63\xb3\x87\x53\x4d\x38\x5e\x89\x61\xe5\x88\x67\x43\xf9\x5f\x4a\x70\x80\xd9\x16\x62\x45\x17\xb1\x53\x36\x03\x0a\x46\x71\x4b\x16\x8b\x83\xd6\xf9\xcc\xe0\x60\x66\x49\xc0\x1f\x0a\x1d\x0a\x2a\x53\xf5\xe3\x78\xf6\xaa\x98\xc3\x84\xaa\xfb\x3e\xef\xdb\x34\x21\xfa\x3a\xc9\x8a\x0d\x3a\x9c\x02\x9c\x23\x00\xae\x02\x41\x06\x7d\x1a\x4f\xc9\x2e\x43\x86\x88\xea\x88\x9f\xcb\x1a\x1a\x9e\x86\x34\xb9\x16\xc6\x0b\xaa\x0c\x18\xbf\xcd\x13\x9b\xfe\x30\x17\xbf\xbe\x16\x29\x13\x43\xce\x86\x05\xbb\x78\x72\x55\x8c\x6b\x5f\xd5\x6d\xfd\x22\x15\x77\xed\xcf\xfa\xa8\xbd\xa3\x4d\x7a\x11\xab\x8c\xb2\x78\x28\x8e\x58\x34\x84\x26\x76\xfc\xcf\xfa\xa9\x11\x1b\xce\xd2\xb3\x57\x5f\xdd\x49\x62\x1b\x76\xe8\xd1\x29\xb6\x17\x00\xee\xab\x03\x14\xef\x94\xd5\x50\x50\x6a\x4b\x8d\x1e\xe6\x55\x08\xd8\x9d\x0e\x99\xe9\x33\x6b\x41\xd9\xf7\x4a\xa4\xd7\x22\x11\x4d\xe0\xf3\x1e\xcf\x00\xb0\x97\xf5\x3c\x9a\xca\x9c\x7a\x28\x5b\x58\xa3\x5d\x70\x29\x8c\x5c\x34\xf7\x4b\x4a\x70\x53\x08\x03\x31\x00\x34\x9f\x0c\x62\xf9\xc2\xeb\xf7\xde\xad\x0a\x77\xb2\x98\xeb"}, +{{0x1a,0x7a,0x3c,0x2f,0x54,0x81,0x13,0x1b,0xe5,0xf8,0x68,0x45,0x6a,0xa2,0xfa,0x90,0xe5,0x6d,0x52,0xcb,0x72,0x1c,0x71,0x84,0xeb,0xff,0x06,0xfe,0xd2,0xfe,0x68,0x5d,},{0x7c,0x2a,0xd0,0xf2,0xa5,0x70,0x55,0x03,0x26,0xfb,0x50,0xa8,0x50,0x83,0x58,0x21,0x67,0x6d,0xe1,0xde,0x12,0x7f,0x6d,0xe1,0x67,0x02,0x99,0xd8,0x14,0xf6,0xe3,0xce,},{0x97,0x61,0x60,0xfb,0x5b,0xbd,0xab,0xe5,0xc8,0x96,0x2f,0x23,0xba,0xba,0xcf,0x0b,0x0a,0xb4,0x1c,0x2b,0xb1,0x3e,0x9c,0x0d,0x44,0x90,0x67,0xb7,0xde,0xcc,0x7d,0xb4,0xe9,0x4e,0x76,0xa7,0x1b,0x9c,0x0a,0xc4,0xd6,0xaf,0x38,0x7a,0x72,0xa8,0xcd,0x73,0xe3,0xbc,0x63,0xb7,0xed,0x65,0x0b,0xee,0xbf,0x17,0x42,0x4c,0x49,0x0b,0xd6,0x0d,},"\xc6\x28\x34\xd9\xd5\x5d\x1a\x44\x03\xe9\x25\xd0\xa5\xb5\x52\xda\x17\x4c\x02\xf4\xe9\x45\xde\xc3\x38\xc1\xbb\xb2\xae\xb4\xff\x40\x02\x0e\xf7\x0f\xf5\x05\x20\x5c\xf8\x81\xb6\x29\x96\x0a\xbd\x62\x76\x4e\x5a\x54\xf2\xb5\x10\x56\x67\xb1\x1c\x7d\x5b\x7a\x4c\xcc\x3f\x48\x8b\xdd\xdb\x95\x8a\x7b\xe9\x54\x62\x07\xe6\xc4\x67\x18\x97\xc0\x53\x50\x8e\x1f\xd8\x32\x22\x13\x0a\x79\x33\x97\x6d\x2b\xec\x61\x4e\xd8\xf9\xb6\xa6\xb9\xf4\xef\xb2\xa5\x8b\x9d\x00\x5b\x94\x3e\x42\xf1\x71\xb7\x09\xa7\x31\x30\x70\xcb\x2e\x06\x8d\xa3\x9c\xf9\x99\x22\xb6\x9e\x28\x5c\x82\xad\x97\xf2\xd6\xc7\x79\x22\xca\xe2\xb5\xe3\x20\xe8\x35\x77\xc0\xd0\x88\x76\x1e\xc8\x81\x52\xc2\x97\x49\x29\x78\xa9\xd7\xa3\xff\x67\xed\xe4\x4c\x2a\x70\x7c\xf3\xe2\x35\x2e\x23\x2f\x53\xc8\x78\x2b\xa4\x89\x28\xa9\x7f\x8a\x36\xb2\x0a\x41\x68\x16\xe9\x45\x79\xb9\xd7\x25\x0a\x29\xdc\x84\x70\xf6\x3a\x70\x58\xe2\xd2\xa9\x9d\x6f\x0c\xcb\x53\x0d\xf5\x96\x95\x05\xef\x5c\x78\x44\xeb\x16\x7d\x20\xf4\x12\xa5\x08\xfa\xb1\xf8\xcd\x9c\x20\xc5\xeb\x9a\x41\x7a\x54\x12\xb5\xda\x6a\x57\x13\x57\x59\xfa\xb1\x7f\x63\x14\xf6\x8d\xf3\x5b\x17\x72\x42\x14\x43\x67\x6f\x31\x25\x79\xaf\x6b\x14\x11\x53\x5a\xda\x8f\x76\x01\x2b\x69\xbb\xeb\x60\xb2\x89\x7e\xe6\x60\x7c\xb3\x69\xcd\xf5\x2f\x4f\x6d\xdf\x88\xcd\xb2\x63\x0d\x78\x89\x6f\x13\x61\xfe\xa2\x2a\xe6\x34\x21\x76\x96\xff\x11\x4f\xb4\x2d\xbe\x4f\x43\x46\xf1\xbe\x5b\x57\xad\xb3\x84\xae\x7e\x49\xb4\x1f\x74\xb3\x1b\x9a\x62\xbc\x69\xdc\xa1\x65\x89\xc6\x34\xeb\x9d\x7c\x6c\x94\xf8\xec\xe4\x4b\x60\x62\x8f\x98\xe1\x02\x4c\xf3\x2e\x3e\x3d\xd6\xdc\xe5\x5a\x12\x22\x53\x2f\x49\x0d\x63\xe6\xa2\x75\x28\x1c\x0f\x3a\x6c\x10\x18\x91\xb8\xd5\x7a\x45\xde\x11\xde\x35\xeb\xb1\x51\xc0\xdc\xd7\x5e\x6c\x05\x0b\x3c\xd8\xba\xba\xe8\x45\xc3\x9f\x66\xc3\x6c\x77\xcd\xe0\x5b\x68\x3e\x4f\xb0\x10\x3d\x93\xe7\x65\x93\x35\xc8\x7f\xc0\xe3\x23\x5b\x2e\x82\x48\x8c\xda\xbe\xb5\xc5\xc8\x75\x80\x87\x45\xee\xa9\x2d\xe8\x6b\x8e\xfc\xb6\x3e\x16\xd0\x82\x91\x9a\xee\x2e\x92\x89\x9c\xb0\xbc\xf1\xc1\x42\x15\x77\xa4\xa0\xd9\xdb\x09\xee\x1f\x9f\xeb\x92\xa5\x38\x21\x03\xcf\x7c\x32\xcf\xe4\x63\x72\x5a\xe4\x86\x6d\xaa\xfe\xda\x05\x34\xc1\x69\xf8\xf9\xbe\x40\x4f\x3b\xaa\xe1\x23\xfa\x76\x8a\xce\x46\x17\x8d\x4b\x9b\xbc\x5b\xd7\xae\xec\x79\x03\xb0\xa5\xbc\x57\x53\x89\x86\xee\x09\xe0\x7e\x32\x07\x7b\x3b\x9d\xe5\x0d\xd1\x96\x7a\x37\x2c\x38\x5a\xc8\x86\x28\x7c\x18\x45\x1a\x64\xef\xb3\x7d\x05\x6f\x9f\x41\x94\xc0\x8b\x1e\x3e\xc9\x70\x22\x26\x7b\xf0\x04\x3c\x13\xd2\x6b\x9c\xe1\xf5\x39\x05\xf6\xe4\x1b\x3d\x99\xdc\x81\xb3\x31\x90\x9b\x72\x26\x66\xef\x24\x32\xe6\xaf\x8a\x45\x31\x07\x53\x12\x30\xce\x4a\x1a\xf8\xee\xd6\x26\xda\x22\x3d\xa7\x6b\x46\x50\x7e\x33\xd7\xcd\xbd\xe0\x2d\x41\x10\x40\xc8\x9a\x11\xd9\x51\x56\xed\x4a\xc2\x60\x5b\x82\x69\x39\xc6\xcf\x87\x7b\x4e\xe7\x36\xc5\xda\x77\xcf\x46\x50\xa9\x99\x7a\x3b\x9c\xf4\x6a\x82\xba\x2b\xc0\x13\x33\xc0\x44\x78\xb5\xc9\x2e\x24\x98\xbd\x00\x2f\x01\x31\x40\xae\xdb\x30\x1b\x95\x99\x3d\x1d\x75\x08\x70\xd9\x88"}, +{{0x19,0x1a,0x1d,0x90,0x32,0x1c,0x7f,0x4e,0x74,0x94,0xbb,0x98,0x29,0x09,0xa9,0xeb,0x40,0xc3,0x34,0x1d,0xd3,0x2a,0xe4,0xd9,0x67,0x50,0xb7,0xd0,0x29,0x66,0xb4,0x0f,},{0x95,0x62,0xd9,0xe2,0x13,0xf1,0x45,0xc4,0x56,0x93,0x5b,0x70,0x31,0xc6,0x80,0x66,0x9f,0x8b,0xbd,0x31,0xa4,0xc2,0xed,0x3c,0x91,0xc4,0x00,0x2a,0x56,0x29,0xe9,0x7b,},{0x74,0xcb,0x02,0x8d,0xc6,0xb7,0x5b,0x37,0xa1,0xda,0xea,0x1c,0xf8,0x84,0x65,0xdb,0x83,0xa0,0x09,0x3f,0xec,0xb2,0x2d,0x99,0xba,0x85,0x5e,0x9a,0xb5,0x9d,0x05,0xcb,0x22,0xc8,0x7d,0x0b,0x09,0xdf,0x7c,0x11,0x62,0x13,0xba,0xa8,0xf1,0x89,0xb2,0x70,0x3f,0xf9,0x53,0xcd,0x20,0x2e,0xb9,0xde,0xa3,0x97,0x6e,0xe8,0x8f,0x5f,0xa7,0x03,},"\x85\x89\x0d\xb4\xe2\xfb\xce\x09\x3d\xde\x5a\x80\xbf\x8f\xe0\x9a\x98\x4b\x83\xa4\x9b\x7c\xcb\x5d\x4b\x06\xcd\xaf\xdd\xd3\x82\xe4\xb8\xa8\xa5\x05\x30\xe8\x2c\x20\x06\x12\xc9\xd7\xd8\xa0\x89\xbc\x8a\xa8\x45\xc3\xcf\xcc\x38\xa6\x19\x5d\x21\xc2\x61\x8c\x3d\xba\x2b\x57\x09\x20\xec\xcf\xcd\x23\x6f\x17\xf0\x8d\x81\x42\x68\xf8\x82\x24\x2d\xdf\x07\x02\xda\x87\x85\xf4\x07\xaa\x8f\x86\xfe\xcf\xa9\x03\xc4\x8d\xa8\x3f\x83\x97\x77\xeb\x6b\x4a\x2b\xbf\x5d\xf7\xa4\xda\x53\x47\x5a\xf1\xff\xe4\x4b\x5f\xe0\x07\x2b\x8f\xbf\x3d\x26\xe6\xd8\x9e\xa6\x7d\x8a\xc8\x45\x94\x92\x89\x0a\xda\x65\x7e\xb3\xdc\x24\x92\xb8\x8d\xe1\x75\xb4\xbb\xa1\xa5\x08\x06\x4d\x61\x96\x74\xaa\xae\x2a\xf0\x9d\x31\xa5\xc2\x7c\x8d\x5d\x5a\x29\xb0\x37\x79\xf4\x28\x6b\x89\x66\xce\x40\x7e\x6f\xf6\x92\xfb\x94\x25\x20\xa9\x93\x8d\x69\xcc\x70\xac\xb0\x6b\x01\x4b\x6d\xfc\x19\x83\x42\x06\xcf\x1a\xc6\xc4\x48\xae\x6f\x07\x80\x25\xb5\x5f\x3d\x82\x72\x01\x26\x8a\x92\xad\xd9\xad\x17\x8e\xf7\x6a\x29\x89\xfe\xdc\x6e\x39\xf4\xeb\xb9\xf9\x6c\x9b\x83\x52\x69\x4f\xa5\x4f\xa0\x22\x01\x9c\x0e\xc0\x01\x2d\x0d\x76\x9e\x23\x67\x80\x3f\x92\x5f\x17\x5f\x9f\xb9\xcb\xec\x4a\x0c\x9c\x1e\x2c\x83\xea\x57\xe6\xa9\x2a\x17\xf5\x55\xca\xb9\x34\x27\x1e\x72\xc8\xcc\x32\x15\xfc\xb8\x7c\x20\x53\x9b\xf1\x42\x77\xb1\xbf\xbd\x6e\x58\x80\xef\x95\x3f\xc7\x5f\x23\xc0\xdd\x4f\xcc\x1e\x0b\xe3\x40\xaf\x94\x7d\xe0\x2e\x87\x7f\xd5\xc7\x7d\xd1\xdf\x7b\x41\x4b\x5c\x0b\x40\xc7\x49\x56\xa5\x45\xa1\x15\xb0\xc6\x99\x3a\xb2\x33\xb7\xe7\x2c\x82\x2b\x6b\x33\x81\xbb\x1f\xc1\x08\x75\xbf\xfe\x3e\x2e\xd1\x19\x0f\xa3\x3f\xc1\x5d\xa0\x83\x79\x4f\xcc\x2c\x5b\xf5\xa0\x79\x09\x06\x3c\xb2\x89\xa0\x8a\x2c\x8a\x33\xd3\x43\x84\x2c\x2d\x6a\x3c\xfa\x2a\x16\xca\x2e\xaf\xca\xb7\xea\x10\x0d\x1c\x71\x4b\xaa\xbb\x71\x49\xf0\x7e\x25\xde\xe3\x23\xe7\x80\x75\x7d\xfa\x80\x16\xfa\xa7\xc0\x62\x62\x22\xc3\x65\xf8\xf2\xf6\x68\x7d\x1d\xed\x23\x4f\x79\x9c\xc5\x0d\x1c\xd2\x6b\x4c\xfa\x40\x45\x91\x70\x56\xfc\x79\xc3\xb8\x8b\x2b\x19\x08\xe3\x72\xdf\x66\xda\xc8\x73\x46\x31\x64\x83\x49\xbc\x37\xfa\x34\xb2\x5f\xff\x3b\x07\x47\xb6\xbc\x16\xb9\x4e\x3e\x58\x95\xe4\xbb\xd9\x3d\x47\x8a\x6c\x1f\x75\xe4\xfa\x30\xfa\xa9\x22\x04\x9e\xd4\xc5\x0f\x12\xf4\xb3\x12\xa8\x97\x4d\x0f\xed\x8d\x44\x25\x5d\xcb\x2b\xf0\xfe\xbe\x47\xfb\x3f\xb8\xed\x99\x03\xb5\xba\x4c\xa1\x8e\x3c\xc6\x76\x2c\xfa\x1e\xaf\x04\xdf\xa9\x44\xd4\x96\xe0\xfe\x8b\xb7\xdc\x04\x54\x51\x39\x6b\xfa\xba\x54\x85\xd9\xd5\xf3\x91\xa9\x54\xc3\x71\x42\x53\xcc\xd9\xb1\x99\x64\xd4\x28\x06\x80\x72\x07\x83\x03\x6b\x3a\xbf\xaf\x28\x84\x58\x3e\xa5\xbd\xbc\xf6\x9d\x08\x89\x7a\xb2\x88\x31\x46\x35\xab\xb4\xc2\x96\x4b\x71\xad\x92\x91\xfe\xb5\xb6\x1f\x80\xe9\xb0\xcc\x07\xf9\x12\xa8\xe5\x59\x8d\x55\x48\xde\xfe\x0e\xea\x1c\x44\x85\x73\x71\x0a\xac\xdd\xb1\x52\xf9\x3c\x7c\x6f\xd3\xf7\xe4\xed\x9f\x74\x42\xa6\xb9\x00\xf2\x3c\x3c\x54\x4c\xe5\xc9\xba\x5f\x5e\x92\xaa\xfd\x11\xc9\xff\x5f\x79\xc0\x8b\x9d\x04\x5f\xef\x07\x97\x06\x25\xf6\x2e\x2f\x43\x34\xa4\xd6\x64\xca\xf7"}, +{{0x62,0x85,0x63,0xaa,0x3e,0xe2,0xfc,0x61,0x1b,0xcf,0xf7,0x8b,0xfb,0x2a,0x75,0xe9,0xfd,0x87,0x80,0xe8,0x7a,0x93,0x94,0x99,0xa6,0x1b,0xea,0xa6,0xa4,0xb7,0x19,0x13,},{0xda,0x20,0x61,0x6e,0xe4,0xa4,0x1c,0x2e,0xbf,0xdc,0x50,0xab,0x54,0x95,0x3b,0x6d,0x38,0x7b,0x06,0xc6,0xde,0xf7,0x57,0x96,0xb0,0x88,0x09,0x56,0x5c,0x6c,0xf8,0x05,},{0xc9,0xa6,0xaa,0xa9,0xb4,0xe1,0xcc,0xe1,0xb5,0x84,0x45,0x72,0x5f,0x61,0xf5,0x52,0xc8,0xfb,0x45,0x83,0x1f,0x03,0x48,0x27,0x98,0xf0,0x1f,0x66,0x3e,0x99,0x83,0xdb,0x1a,0x82,0xfd,0x33,0xab,0xa3,0xec,0xcb,0x96,0x22,0x64,0x26,0xd5,0x0a,0xe1,0x7c,0xc5,0x12,0x74,0xce,0x18,0xa3,0x88,0x60,0xf4,0x0b,0x2f,0x82,0x36,0x1b,0x5c,0x03,},"\x05\x6f\xb9\x54\xfb\xe6\xa6\x01\x4f\xad\xac\x1e\x1a\x9f\x56\xcc\x08\xaf\x37\x34\x8e\xba\xf6\x92\x06\x83\x38\x4e\xfa\x47\x62\x6c\xcd\xdf\xea\xd2\xd5\xe9\xe8\xcf\xff\x45\xf7\xac\x63\xde\x63\xf6\x9d\x12\x84\x8c\xe3\xc0\xef\x1f\x53\x0a\xde\x43\x0f\x0a\xfd\x5d\x8e\xcf\xd9\xff\xd6\x0a\x79\x74\x6a\x2c\x5b\xee\xdd\x3e\x67\x24\x99\x82\xf8\xb6\x09\x2e\xe2\xd3\x40\x47\xaf\x88\xa8\x1f\xea\xb5\xd5\x2b\x47\xd5\xb3\xf7\x6c\x20\x41\x72\x5f\x6f\x81\x32\x93\x05\x0a\xaa\x83\x4b\x01\xa3\xa5\x8f\x69\xaa\x4a\x8c\xa6\x1f\x5b\x74\x6f\x60\x0f\x3d\x45\x2c\x62\x82\xff\xdc\xa4\x42\x9b\x93\x38\x96\x7b\xa3\xa7\x26\x66\x90\xae\xc7\x5e\xbf\xbf\x7b\xe9\x8d\x99\x9b\x03\xed\xdc\x72\x92\x58\x1b\x0d\x69\xe3\x0a\x03\x51\xa1\x51\xdb\x70\x41\x2b\x0b\xfd\x43\xd3\xba\xa9\xd4\x56\xcb\x3e\x0b\x4f\xc1\x9c\xb0\x9e\x6c\xad\xcb\x6d\x3f\x3b\xe5\x13\x7c\xc7\xa8\xd3\x21\x9e\xc2\x03\x6e\xc6\x70\xed\x7e\xc5\x23\xb1\xb1\xc6\x87\xb5\x46\x53\x07\x88\x2f\xe3\x8d\x74\x72\xd0\xba\x87\xa4\x71\x86\x83\x09\xd2\xf7\x73\xff\x24\xc8\x7d\x39\xc1\x6b\x70\x8a\x4e\xd9\xaf\x43\xf7\x4c\x8d\x85\xcf\xe8\xab\x54\x06\x90\x7e\x94\x1a\x14\x97\x0e\x20\x9c\x29\xff\x7e\xd8\xa2\xf9\x35\xae\x41\x70\x9f\x27\x0d\x0d\x08\x55\x5e\xf7\xaf\x2e\xdf\xe4\x0d\xf3\x99\x22\x3c\x78\x5a\x43\xe7\xf3\x69\x15\x89\xe2\xea\x4c\x03\x6f\x11\xd0\x3d\x7d\x1e\xea\x14\xf6\x20\x03\x53\x25\xcf\x2b\x33\xba\xf3\x86\x39\x3e\x8a\x97\x2a\x7a\xf6\xcd\x9b\x85\x43\xb3\x2e\x25\x33\xd1\xfc\xc3\x17\x7f\xd9\x6d\x1e\x13\xbf\x8b\x68\xde\xb2\x22\xf9\x44\x97\x26\x5d\x3c\xcb\x34\x57\x51\xbd\x5b\x66\x90\x78\x08\x19\x98\xd6\x08\xca\x5f\xdc\x13\x48\x39\xd4\xed\x2b\xeb\xb2\x95\x2f\xea\x5a\x39\xc6\xf0\x33\xc1\x55\x8f\x69\x8c\xe4\x94\x6e\x4f\x6c\x08\xaf\x87\x4f\x27\x35\x7f\x87\x0e\xbe\xeb\x21\x99\x97\x6f\xfa\xef\xac\x95\x1f\x8e\x17\xfe\x7d\x08\x21\xe1\xb9\x2a\x90\xaa\x4e\x9d\xef\xd3\xfa\xfd\xa0\x52\xa4\x44\x47\x6d\xb1\xce\x38\xa9\xe1\x76\xe8\x41\x18\x9a\xbd\x8f\xec\xde\x0f\xbc\x5c\xb5\x5f\x51\x1f\x5f\xde\x07\xea\x97\xde\xb3\x9b\x7a\xa8\xdc\x84\xa3\x94\x6a\x6c\xf9\x26\xd3\x9b\x95\xc1\x1a\xf9\xd6\x4d\x98\xb8\x07\xf4\x70\x4d\x0a\x2b\xda\x97\xda\xd9\x88\x1a\xda\x1b\xf6\x63\x63\x66\xe6\x0a\x52\x2b\x48\x21\x04\x78\x61\xc7\xaa\xe2\x14\x6a\x02\xee\xf6\xb2\x5d\x51\x37\x1a\x0f\x17\xd2\x4b\xc1\x87\xdc\xdd\x05\xd5\x41\xc2\xf7\x22\x01\x42\x79\x15\xa3\x92\x8c\xd3\x78\x68\x91\x03\xac\x50\xb3\x3f\x87\xa4\x7e\x8c\xdf\xa6\x87\xa5\xf0\xaf\x8a\x56\x73\x1d\xab\xe6\x62\xf4\xf2\x83\x6d\xe0\xba\x8f\xaf\xd8\x6a\x38\x54\xbc\xa0\x12\xd7\x08\x8a\x00\xb9\x85\x4c\x2d\x3c\x70\x8d\xdf\x58\xfa\xa3\x55\xa8\x9a\xfc\x2c\x80\xf3\xf5\x33\x6d\xa0\x1d\x72\xa2\x77\x1a\x05\x58\x13\xfb\x35\x33\x0f\x7d\x2e\x01\xb1\xd1\x2d\xaa\x95\xed\x55\xd3\xbd\xc5\xdf\x77\x39\xcb\xc3\xca\x09\x7a\x41\xb6\xb2\xbd\x7f\x0f\xf9\xdd\x1d\x86\x58\x98\x3b\xa3\xff\x79\x20\xc1\x5f\x29\x2a\x1e\xf9\xfc\xad\xa1\xc6\x07\xec\xb4\x5d\x3a\x73\xc9\xff\xd4\x2f\x3e\x16\x02\x2f\xdf\xe1\x27\x44\x92\x63\x95\xf7\x4f\xb3\x11\x17\x93\xfa\x92\x81\x82\x1a\x66\xa0\x1d"}, +{{0x91,0x41,0xf7,0x9e,0xd3,0x0b,0xf6,0x00,0x61,0x1a,0x13,0xf3,0x67,0xb4,0x03,0x96,0xf2,0xec,0x83,0x9c,0x56,0x12,0xbb,0xf1,0xe6,0xe4,0x97,0xf8,0x39,0x54,0xbc,0x88,},{0xf1,0x4e,0xda,0x96,0x26,0x40,0xbe,0xcb,0x66,0xc4,0xd1,0xf1,0xa0,0x21,0x11,0x02,0x51,0x91,0x7b,0x8b,0x1d,0x34,0x82,0x82,0x98,0xd3,0x21,0x45,0xba,0xf6,0xe5,0xd9,},{0xcf,0x20,0x2d,0x7f,0x2f,0x9e,0xd1,0x17,0xf4,0x29,0x50,0x2b,0x2a,0x5a,0xff,0x54,0xa7,0xf7,0x51,0xd2,0x17,0x15,0x15,0xa4,0xd2,0x03,0x75,0x34,0x46,0xdf,0x0e,0xba,0xc8,0x69,0x84,0xc8,0x8b,0xd4,0x2b,0xd1,0xfb,0x8d,0xcb,0x40,0x87,0x76,0x72,0x2a,0x38,0xf3,0x2c,0xce,0xb2,0x5f,0x32,0xa2,0x5d,0x73,0x93,0xf1,0x38,0xee,0xdf,0x0a,},"\x8f\xec\xaa\x7a\xe9\xa3\xd4\xa4\x85\x1a\x66\x36\x2b\x36\x6e\x16\x7b\x9f\x43\x00\xfd\xab\x20\x56\x54\x75\x19\x87\xf0\x85\xde\x61\xbe\xc9\x34\x4a\xa8\x6f\x5e\x5c\x64\x77\x51\x4c\x28\x04\xce\xd7\xac\x0c\xd0\x62\x85\x29\xa3\xa1\x59\x92\x36\xed\x67\xbe\xbe\x1f\x2e\x95\xaa\x15\x1f\xe0\xf3\xb3\x01\x1a\x1d\x4b\xe9\x90\x1c\xaf\xab\x2f\x18\x91\x90\x4d\x4b\xff\x01\x28\xc1\xd3\x5e\xce\xcb\x32\x2b\x3c\xc0\x1d\xac\xc5\xae\x3d\xca\x69\x14\xa7\xd3\x4d\xa8\xc9\x65\x7b\x95\x0f\x89\xd1\xd6\xae\xc3\x29\x9b\xb6\x90\x11\x10\x71\xfa\x87\x28\x27\x74\x94\x3d\x96\xa4\xab\x7c\x3d\x6d\xe7\xd1\xbf\x11\x93\x63\x06\x8c\xc8\x2d\x45\xe4\xb7\x64\x54\xc6\x08\xbc\x35\x66\xb7\xf9\xb3\x85\xcc\x7e\xb3\x8e\xe4\x29\xaf\xc2\xda\x99\x66\x9f\xc5\xc1\xbe\x82\x16\x1a\x1b\x0c\x33\xf7\xba\x9a\xd4\x41\x9d\x20\x62\x97\x19\x01\xdb\x00\x3b\xfa\x23\xc4\x47\x14\x99\x5c\xb0\x6b\xfa\x96\x6e\x50\x23\xaa\x93\x46\xfd\x37\x5a\xe2\xa1\xe8\x40\x84\x31\x4d\xf3\xf0\x8c\xe2\x08\x00\xc2\xc2\xad\xfb\xb8\x13\x66\xf6\xb1\x04\x24\x3d\x62\xd5\x04\x1e\x72\x73\x43\x3f\x17\x58\x1b\xf9\x3f\x4c\x61\x46\xfa\x96\x6f\x63\x8a\xb0\x7e\xa1\x66\x94\xa7\xce\x30\x5c\xc6\x09\xa6\xe1\x06\x23\xff\x7f\x6c\x79\x16\xb6\xe4\xdb\xde\xbb\x7b\x52\xec\xa7\xf0\xd5\x18\x7f\xf6\x64\xd7\xc3\x70\xed\x22\x88\x6a\xa2\x67\x13\x29\xd9\x28\xe0\xa3\xbe\xa3\xb4\x71\x1a\x12\x8b\x9a\xab\x90\x26\x6f\x86\x51\xd2\x20\xb9\xcc\x1c\xbf\x5b\x1c\xe7\x26\x59\x31\x80\x36\x90\xd3\x29\x1c\x01\xea\xd4\xdb\xc3\x32\x9a\x97\xe8\x5c\x4f\xe1\xd3\x56\x60\x8c\xc9\xe6\x0b\x05\xbc\x14\x83\x8a\x86\x08\x27\x9a\x00\x61\xde\x28\xff\x7b\x8e\x81\xf5\x9c\x8a\x8c\x55\x23\x92\x4c\x4c\x48\x5e\x6e\xa8\x0a\xc8\x17\x50\xbb\x0e\x41\x9e\xfc\x78\x58\xcd\x4a\xf5\x0c\x8b\x8c\x80\x65\x0f\xac\xab\x4d\x82\x58\xf9\xca\xfa\x03\x10\xa0\x07\xcc\xcb\xc4\x18\x5c\x82\xfd\x14\x6d\xf1\xd8\x11\x87\x9d\xa3\x65\x0d\x57\x16\xf1\x00\x4b\x71\xd2\xc7\xf2\xbd\x65\x03\xc3\x54\x58\x9f\x86\x02\xc9\x50\xa1\xf5\x13\x9f\x81\x14\x60\x75\x28\x80\xa3\x41\x11\x66\x30\xe4\xff\x84\x94\x8e\x74\xa9\xeb\x35\x0d\x64\xd8\x29\x30\x02\x20\x02\x33\xf2\x09\xb1\x7d\x78\x89\x7c\x7c\xe6\xce\x29\xe2\x9f\x82\xd4\xad\x6c\x61\xeb\x79\xf5\x73\x9c\xb6\x68\xb2\x1a\x74\x55\x55\xc9\x6e\x19\x52\x68\x45\xe8\x2c\x6e\xd2\xb1\xc6\xbd\xd6\x36\x4b\x8f\xc7\x9b\xa9\xa3\x2d\xbd\x3f\x8b\x97\x5e\xb9\x23\x62\x39\x58\xae\x0d\xaa\x4f\xfa\x13\x92\x17\xc0\x0e\x02\x1f\x93\x7e\x9b\x79\x1c\x37\x99\x1a\x35\xe5\x23\x1a\x19\x14\xc0\x45\xa7\x87\x43\x2f\x97\xb8\xe2\x06\x3d\xb1\x05\xe1\x4d\xa9\x79\xc1\xc4\xcb\xa7\x85\x21\x0e\xb0\x20\x11\x33\x4b\x23\x0c\xfb\x68\x31\x99\x8c\xcc\xe2\x53\x86\xf4\xf3\xba\x0d\xce\x20\x06\xe9\xc3\x94\x0b\x4d\x5a\x56\xaa\xcc\xdc\xab\x02\x71\x86\x89\x81\x63\x60\xf1\x88\x52\xfd\x19\x98\xa9\x9f\xce\x9a\x04\xda\x3f\x5e\x23\xaf\x94\xc6\xe8\xa5\xba\xdf\xd3\x93\x04\xb9\xe2\xa3\x76\xa1\xf9\xba\xc0\x9a\x85\xbd\x04\x24\x76\xe2\x6b\x58\xec\x73\xf1\x23\x6d\x41\xab\x4b\x4e\x7a\x54\xde\xf9\xd6\x6a\x38\xf8\xe5\x46\xde\x7b\x38\x8e\x1e\x7d\x66\x81\xe5\xe2\xa0\x96\xf1\x60"}, +{{0x69,0x5c,0x96,0x0b,0xbb,0x0d,0xd5,0x7f,0xfa,0x36,0x15,0x1c,0x85,0xde,0x73,0x51,0x54,0xfe,0x5a,0xd5,0xf5,0xfc,0x77,0xd0,0x05,0xa0,0xa3,0x20,0x11,0xde,0xb3,0x0c,},{0x34,0x12,0x5e,0x4e,0x21,0xf7,0x89,0xed,0x0e,0x11,0x80,0xc1,0xf6,0x36,0x9c,0x72,0x1d,0xca,0xe9,0x85,0x9b,0x6f,0x7b,0x04,0xf9,0x57,0xe5,0x10,0x01,0xee,0xde,0x8a,},{0x4a,0xf4,0x1c,0x55,0x4d,0x99,0x08,0x12,0x68,0x6c,0x32,0x9a,0x87,0x5c,0x41,0xee,0x24,0xb4,0xa7,0xfd,0x7b,0x3d,0x4f,0x8c,0x8d,0x52,0x75,0xf2,0xe7,0xcb,0x24,0x2b,0x25,0x8b,0x58,0x58,0xa4,0x66,0xde,0x59,0x5c,0xe2,0xa2,0x17,0x7e,0x35,0x1c,0x7f,0x08,0xc7,0xfc,0x4e,0x0b,0xf9,0x7e,0xc5,0xfb,0x2d,0xcb,0x82,0x52,0xd2,0xc9,0x0a,},"\x37\x06\x69\x6c\x7a\x90\x66\x90\xd0\xd3\xb7\x1e\x7e\x21\x1c\x7b\x06\x71\x68\xf3\xa8\xf1\xed\x98\x4a\x0a\x5e\x60\x78\x59\x76\x62\xe4\xe7\x88\x9d\x52\xdb\x0f\x78\xe0\xd5\xef\x0e\x5f\x7a\x0a\x0f\x42\x63\xb6\x84\x8b\x07\x25\xca\xa4\xb1\xce\xa6\x98\x74\x09\x51\x1c\x8e\x5e\x98\x2d\x3f\x5b\x82\xbb\x56\xa4\xa7\x94\x71\x21\x93\x7f\x8e\x10\x5c\x5a\x14\xb5\x3e\x6c\x37\xcc\x71\x6b\x1e\xba\x92\x24\x21\x82\x8b\x04\x6f\x68\x56\xc4\x4f\xab\xf1\x3a\x75\x16\xc6\x2a\x5f\xf9\x85\x68\x45\x0c\xee\x78\xb1\x40\x33\x50\x47\xbf\x1c\xa7\x7e\x15\x49\xa8\x94\xfe\xeb\x07\x80\x45\xe4\x64\x18\x32\x25\x3b\xf6\x95\x48\x54\x52\xec\x36\x90\x65\xa6\x00\x29\xa6\xc9\x07\x7a\x37\x9d\xb2\x04\x85\xea\x2e\xdb\x6c\x96\x95\x47\xbb\x26\x53\x28\x9b\xc6\xe8\x1f\xfc\xb8\x4b\xdb\xf7\x73\xdd\xea\x4b\x37\x50\xe9\xa7\x23\x95\xd1\x17\xf6\x44\xb0\xe2\x20\x61\xd4\xf3\xbb\x7c\x5b\x61\x2e\x4b\x70\x39\x5e\x07\x79\x51\x6b\x46\x65\x91\x16\x90\x2f\xd0\xfb\xcd\x23\x40\xee\xa4\x5e\x9c\x23\xdb\x25\x64\xa5\xe1\x1d\xc7\x9e\x8f\x4b\x33\x2a\x44\x3e\xc3\x5a\xad\x96\x04\xfe\x79\x12\x52\x08\x82\x95\xe8\x4f\x65\xa3\x07\x31\x25\x50\xd9\xeb\xf6\x1f\x36\x7e\x4a\x0f\x2b\x56\x23\xe5\x3e\xf6\xbc\x13\x28\x25\xfc\x24\xeb\xee\x4e\xbf\x33\x8c\xbf\xb5\xdf\x69\xb3\x2d\x03\x0d\x44\x7c\x44\xf3\x13\xba\x96\xfe\x07\xbb\xfe\x5b\x01\x66\xea\xec\xbc\x61\x9b\xb6\xb2\xe5\x92\x40\x10\xba\x3e\xc1\x50\xff\x6a\x69\xfe\xc4\xde\xd9\xc4\x42\xf9\x8c\x15\xe7\x7f\x31\x9b\x48\x43\xb3\xb7\x48\xb5\xd2\x60\x89\xa7\x6c\x2b\x83\x4f\xf9\x3c\x41\x3e\x04\xca\x95\x50\xcd\x21\x1c\xe2\xd6\xa5\x83\xd7\x82\x57\x50\x66\xdb\x6d\xd3\x3e\x8d\x5e\x83\x74\x35\x5d\x06\x8a\x5e\xb9\x6f\x8b\x3d\xa8\xdd\xdf\xb5\xba\xf5\xc5\x96\xda\xaf\x55\x6a\x8f\x2c\xb5\x78\x1e\x50\x42\x32\x7f\x92\xae\x06\x21\xea\xe0\x88\xb5\xf0\x13\x59\x2e\x77\x87\x3a\x81\xd7\xe0\x68\xd7\xb8\x33\x7d\xb9\xf1\x09\xa8\x35\xb4\x75\xe5\xca\xf7\xce\xa5\xaf\x3b\x4a\xd6\xd9\x0b\xaa\xf1\xc7\x36\x55\xec\x67\x67\x47\xfc\xdd\x41\x77\x5b\x4f\xbe\x39\x24\xc3\xf4\x1d\x8a\x73\x75\x28\xd1\x2d\x61\x56\x65\x3a\x22\x35\x8c\x68\x21\x42\x6b\x2c\x0a\x33\xe1\x63\x4c\x62\xc7\xc8\x38\x56\x49\xbc\x23\x3e\x7d\xaf\x94\x39\xf0\x9d\xb9\xbd\x11\xea\x01\xe2\x8b\x77\xec\xbb\xc4\x59\x0e\x29\xfd\xcf\x0f\xdd\xe1\x52\xf6\x47\x81\x32\xfe\x4c\x3a\x5b\x45\xa7\x30\x5a\xf6\xe3\x81\xca\xdd\x72\x49\x6e\x66\xbb\xb8\x66\xce\xa4\x7f\x7e\x7d\x7e\x63\x34\x16\x00\xaf\x3f\x49\xce\x9c\x9e\x4e\x37\x39\x4d\xf5\xdf\x71\xdc\x10\xcd\x39\x1f\xdc\xb8\xa1\x93\xdc\x98\xfc\x19\x05\x9f\xa3\xac\x23\x0e\xc5\x47\x6b\xf9\x4d\x85\x55\x6a\xce\x6e\x1b\xa3\x24\x21\xbf\x59\xdc\xbe\x05\xc5\xe1\x5d\x34\xc6\x64\x4e\x27\xd0\xa0\x2b\xe9\x7f\xa8\x38\x7e\xe0\x37\x06\xf2\x2a\x8f\x4b\x3b\x40\x40\xad\x7d\x3f\x8a\x86\x97\x1a\x20\xa0\x9e\xc8\x1b\x76\x96\xd8\x34\xc5\x26\xb8\xe5\x1c\xb9\x7d\x27\x64\x3f\x9a\xbf\x5e\x29\xff\xd0\x33\x3f\x95\xde\x15\xd1\x10\xc2\x06\x4c\xa4\x94\x67\xc1\x4e\xf2\x27\xf4\xba\xbf\x1a\x55\xe7\xb1\xcd\xa0\x42\x9c\xff\x25\x6b\xe3\x1c\xf1\x16\x71\x9a\x81\xb9\xc5\xfb\x75\xfd\xf6\x4e"}, +{{0x25,0xcb,0x17,0xfc,0x33,0xd2,0xbf,0x83,0x84,0xae,0x4d,0xf2,0x0c,0x1f,0xad,0x5c,0x35,0xfd,0x76,0x5a,0xff,0xde,0x04,0xb5,0x25,0x6d,0x4d,0xe0,0x1c,0xa8,0xde,0x14,},{0xb8,0x6c,0xa3,0x12,0xfe,0x59,0x85,0x20,0xc6,0x4b,0xe5,0xc7,0x2f,0x5b,0x23,0x81,0x65,0x07,0xf6,0x9e,0x07,0x0f,0x82,0x8e,0x02,0xd2,0xaf,0xcf,0xe1,0x1b,0xfa,0x01,},{0x8c,0xcb,0x0d,0xbc,0xf7,0xcc,0x03,0xe8,0x3e,0x21,0xc5,0x74,0x74,0xaf,0xd3,0xad,0x88,0x98,0x09,0x7b,0x97,0x2e,0xde,0x17,0x5a,0xca,0xae,0x48,0xe3,0xec,0x17,0xb2,0xdb,0x06,0xfc,0x82,0x77,0x6b,0x07,0x51,0xc0,0xf9,0x56,0xfd,0x71,0x96,0xf3,0xd1,0xc9,0x63,0x21,0xa6,0xcf,0x3d,0x89,0x24,0x15,0xd8,0xf8,0xee,0xb4,0xa1,0x41,0x08,},"\x4b\x4a\x71\xcb\xf8\xcb\xaf\x57\xa7\x7d\x4e\xa1\x88\xa6\xf9\x64\x84\x0f\x0d\x71\x4a\x5f\x38\xa0\x95\xa1\x3b\x4e\x57\x12\x97\xa8\x8b\x79\x24\x17\xd1\x61\x84\x42\x7f\x90\xe0\x43\xdd\x8a\x55\xb7\xf1\xc1\x3e\x00\xdf\xa6\x05\x16\x44\x5c\xbe\x77\x06\x8c\x79\xc8\xc3\x5e\xbe\xac\x33\x0c\x33\xf1\x12\x1d\x05\x73\x1a\x8f\x51\x32\xd6\x48\x00\x73\x27\x46\x41\x19\x5a\x75\x20\x21\x16\xff\xf1\xc3\x18\x81\x71\x78\xfd\xd7\x68\xbb\xdf\x10\x5f\xa0\x69\xc7\xa3\xd1\x43\xfd\xf5\xd1\x7b\xfa\xd7\xc0\x62\x4e\x52\x92\x06\x8f\xd7\xbb\x6d\x30\x3b\x4a\x27\xcb\x20\xa4\xe6\x18\x75\x07\x67\x87\xd1\x9f\xa6\xf7\x29\xc9\x4d\xc0\xba\x9b\x8c\x0b\xfd\x98\x66\xda\x5c\xb2\xe7\xa2\xcd\x2e\xdb\xdc\x95\xac\x34\x9e\x5e\x5c\x21\x72\xe5\xa4\xcf\x7b\xd9\x0c\xab\xe2\xc6\xe2\x24\x59\x80\xbd\x72\xd0\xf6\xf5\x47\x98\x81\xe8\xc4\xc3\x54\xf6\x8a\xa7\x28\x41\xd0\xc7\x3b\x98\x6b\xa5\x10\x21\x20\x31\x61\x02\x6e\xe3\xd7\x29\xdd\xf1\xa0\x49\xff\xe9\xeb\x25\x43\x98\x02\xf0\x30\x11\xd1\x44\xe5\x0b\x02\xbd\x4a\xca\x5e\x55\x06\xd3\x2f\xcf\x69\xe3\x2f\x54\x25\x44\x79\x8f\x4e\x87\xf7\x2b\xdf\x24\x33\xb1\xff\x32\x59\x29\x2e\x1d\x90\x81\x2c\xff\xd7\x9f\x6a\x54\x32\x70\xba\xf2\x4a\x3c\x39\xdd\x35\x98\xe1\xc6\x61\x61\x29\x22\x52\x2f\x38\x7d\x51\x59\x76\x92\xf3\x14\xc4\xd5\xac\x4b\xf1\x88\x3a\x61\x46\x36\x33\x6a\x55\x44\xd5\x9f\xf4\x1d\x1e\x0d\xbc\xf8\xe6\x62\x7e\x7c\x80\x85\x64\x63\x22\xdf\xc2\x0c\x33\x2c\xbd\xf3\x53\x70\xd4\x7d\xca\xbb\x80\x2e\x17\xca\x84\x78\x0e\xec\x66\x1c\x90\x4d\x5b\xfb\xc2\x40\xad\x6a\x14\xa7\x53\x3f\x71\xa2\x75\x00\xc6\x1d\xd3\xe4\x73\x98\x38\x87\xa8\x68\x35\x18\x7a\xbb\x0d\xf0\x8f\xa6\x2c\xda\x69\xdc\xe8\x6e\x21\xfa\x5a\xe9\x54\xc2\x2e\xdd\xb6\x0e\xe3\x13\x15\x04\xa6\x9b\x50\x48\x6a\x17\x76\x70\x91\x88\x37\x60\x63\x8a\x29\xc3\x80\x30\xe1\xe0\x5f\xdb\x28\xe1\x58\x63\x30\x10\x38\x5a\x62\x06\x13\xcc\x10\xd5\xa5\xf3\x50\x95\x5f\x4a\x34\x7c\x65\xed\xdd\xb7\xe2\x51\x59\xda\x8d\xcc\x26\x55\x92\x8a\xd6\xf6\xd8\xc4\xc1\xab\xb8\x17\xd7\xfe\xf3\xba\xe5\xde\x04\x02\xed\xde\xe7\xb5\x15\x21\xce\x28\x0a\x66\xb7\x96\x14\x0f\x56\xaf\x9b\xc2\x0e\x46\x58\x75\xce\x26\x28\xa8\xa1\x04\x77\xce\x9b\x2e\xac\xc7\xd8\x6f\x88\x27\x24\x57\xbf\xd4\x43\xe7\x12\x52\x69\x96\x25\x43\x80\xf0\x13\x52\x27\xe9\xfc\x15\x1c\x86\x95\xe9\xcc\x64\xd2\x72\xb2\x56\xab\x95\xc9\xa9\xf5\x68\xe9\x37\x16\xe0\xe5\x3d\x29\x88\x2e\x3c\xe7\x42\x61\x25\x7a\x02\xcd\x49\x7c\x37\xd7\x64\xd9\x0f\x7f\xd4\x78\xa1\x7a\x89\x0a\x8b\x2e\xa6\x1a\xb8\x1f\x68\x69\xb1\x20\xa2\xf6\x48\x4a\x88\xc1\x51\x95\x33\x91\xec\xa4\x45\x01\x53\x77\xb3\xa5\xdf\xfe\x4c\xfb\xac\xfb\x5b\xab\x2c\x47\xf6\x54\xf7\x2a\x9d\x19\xcb\xc4\xd2\x95\x37\x19\x84\x05\xe3\xa0\x4b\x4b\xfe\x11\xbc\xdb\x5c\x1f\x30\xd9\xac\x02\xf5\x48\x49\xc5\x7a\xa9\x6f\x7b\x56\x63\x61\x16\xf2\xbb\x6f\x25\x83\xd9\xaf\x94\xc8\x6a\xff\x5c\x13\x7f\x63\xce\x54\xe8\xf0\xc2\x1b\x6c\x25\xc1\xf0\x47\x2a\x22\x9c\x90\x81\x7e\x61\x62\xea\xc7\x1c\xcd\xa3\x09\xa1\x64\x3b\xd6\x31\x2a\x52\x63\xa2\xef\xe6\x46\xdf\xfe\x79\xeb\xd8\x15\x7a\x28"}, +{{0x49,0xe2,0x4d,0x16,0x99,0x83,0x37,0x26,0xb1,0x8c,0x78,0xea,0x65,0x68,0x40,0x1a,0x97,0x1e,0x1c,0xa3,0x9d,0xd0,0x6d,0x75,0x63,0xac,0x8b,0x42,0x50,0xd4,0xa9,0xf5,},{0x71,0xcf,0x05,0xe9,0x0d,0x30,0x1a,0x6d,0x9f,0xad,0x7f,0x0b,0x38,0xec,0x8b,0xb0,0x44,0xfc,0xfd,0x97,0xc8,0x49,0xb0,0x4c,0x00,0x36,0x25,0xde,0x29,0xbe,0x86,0xbb,},{0xa0,0xb6,0xa2,0xaf,0x15,0xb6,0xbe,0x9e,0x95,0x1e,0xf3,0xf3,0x2c,0xbd,0x1c,0x67,0x02,0xe8,0xe0,0x17,0xfb,0xd3,0x15,0xa3,0xf2,0x59,0x9c,0x3f,0x1a,0x11,0x86,0x5d,0x46,0xe7,0x84,0x59,0xa0,0xd7,0xf7,0xbe,0x04,0x6a,0xae,0x29,0x3c,0xad,0x09,0x13,0x7e,0xc8,0x47,0xe2,0x69,0x28,0x10,0x6d,0x9a,0xa3,0x5e,0x09,0x82,0xb9,0x92,0x02,},"\x6d\x26\x05\xf6\x1e\x1a\x04\xb6\xae\x18\xc2\xc2\x5a\xe1\x00\xdd\x42\xa6\x1e\x66\x4e\x2d\xb5\xc3\x4d\x7a\xd1\xf8\x4a\xc5\x07\x55\x2b\x74\x1c\x20\x86\xc1\x7c\x85\x2b\xab\xe0\x7a\x91\xe1\x29\xa5\x06\xee\x59\xed\xb9\xce\x73\xbe\x1b\x1d\x06\xd1\x20\xec\x36\xa1\xe9\x4c\x62\x81\x05\x4e\x78\xce\xb1\xbd\xef\xfb\xcb\xf4\xf0\x10\x51\xed\x38\x1b\xfc\x8a\xd1\x76\x9f\x41\xe2\x40\xbf\x60\x59\xd9\x70\x4c\xac\xec\x66\x66\x11\xf4\x1e\x4d\xd4\x38\xb7\xf5\x02\x42\xea\x86\x75\x6b\xb1\xf8\x1e\x59\x42\xc0\x92\x12\x9f\xbc\x6d\xe4\x95\x5d\x28\xdf\xf3\x52\x37\xdb\x30\xe4\xa5\x03\x6a\x99\x14\xc9\xf8\x4d\xbd\x8c\xcf\x82\xba\x2b\x1b\x3b\x55\x54\xa2\xb7\xa7\x4c\xb0\xb2\xa1\xe1\x96\x33\x45\x28\x6e\x25\x8d\xc8\xe7\xd5\x67\x18\x03\x5f\x95\xf3\x13\x81\x1c\xfb\xd8\x52\xa0\xf8\xf4\x9a\x29\xef\x93\x3e\x7c\xda\x7e\xd9\xc7\xe8\xb1\x62\xcd\xba\x1a\x82\x26\x2c\xd4\xdf\x7c\xf8\xea\x4b\x58\x6d\xb4\x3d\xcc\x1e\x37\x64\x59\x8e\x9c\xa4\x66\x73\x82\x2b\xaa\x2a\xd8\x7f\xb1\x4b\x6f\xdb\x9e\x20\x32\xd0\xca\x51\xc2\x6c\x5e\xf3\xd9\xf7\x97\x85\xfa\xc2\x49\x1c\xdb\xf7\xc3\x99\xf3\xcd\x17\x74\xc1\xa6\xb1\xe4\xa6\x7f\x54\x36\xd8\x0d\xb0\x25\xf8\xfb\x64\x09\xe2\x75\xbd\x0e\xd5\x08\xb5\xe0\x39\xed\x2e\x4e\xec\x8b\x0f\x4d\x5b\xe9\x9d\xca\xfa\x6a\x14\x01\x25\x27\x32\xa6\x5b\x37\xc9\x43\xc0\x7e\xf3\xac\xbc\xfb\xb3\xdc\x06\xda\xd0\xa8\x8f\x2f\x5e\xb5\x51\xa3\x99\x7a\xd6\xc6\xee\xd9\x5e\xdd\x9a\x0a\xf4\xa2\x88\xd5\xe4\x32\x86\xb2\xac\x07\x29\x77\xc4\x36\xb7\xc5\xff\x7a\xb6\x1c\x94\x84\xf2\x57\xf5\x8e\x01\x0c\x9b\x6a\xd4\x15\x81\xd7\x42\xcd\x19\x75\x2c\xde\x54\xd2\xb4\x20\xd6\x43\x65\x4e\x90\x96\xa8\x1e\xb9\xdc\xf8\x04\xc7\xc2\xed\x0e\x38\xd1\x3a\x5c\xe3\x99\x78\xcd\xd0\x2b\x25\x35\x09\x45\xde\x78\xfe\xec\xc0\xc2\xc2\x2f\xfd\x70\x5c\x3b\xa8\x11\x32\x65\xc7\xb9\xa7\xc8\xdd\xb5\x91\x78\xbd\x21\xd7\xf6\xc3\x1c\x6b\xe2\xc3\x67\x49\xee\x0f\x9a\xb8\xbc\x1d\xcf\x5d\xa5\xcb\x2d\x2d\x59\x62\x35\x8f\x71\xf9\x6a\xb3\x79\x2a\x25\x2a\x51\x9e\x41\x53\x51\xf4\x3e\x7e\x12\x03\x5b\x03\x28\xf2\x82\x08\xcf\x4b\xe5\x29\xd2\x99\xaa\x5c\x12\x8c\x9d\x5e\xd5\x75\xbf\x90\xc5\x35\x05\x69\xea\xa6\xf2\xd5\x52\x1d\xe1\x18\x03\x09\xf6\x86\xc9\x7e\x9a\xd6\xfa\x1e\xc1\xdd\x86\x27\xae\x89\x51\x58\x1c\xf6\x04\xb8\xb9\x17\xc5\xba\x43\x4a\x63\x7b\xe1\xbc\x8b\x79\xf4\xac\xaf\x77\x95\xf4\xe5\x1a\xab\xdb\x88\x50\x77\xbc\x4f\x3c\x68\xfc\x33\x18\xde\x58\x23\xd7\xe0\x80\x4e\xe9\x95\xb7\x03\x87\x95\x0f\x79\x93\x53\x68\x23\x00\xd4\xe7\x97\xf3\xca\xd6\x11\xb4\xc5\x62\xc8\x64\x0f\xf2\xb3\xfe\x29\x29\x16\xa9\x70\xfb\x98\xc1\x47\x5c\x1f\x4e\x27\xb9\xb3\x3c\xfe\x0d\x3a\xd9\x32\xa1\xeb\xe6\xa2\x7f\xc3\xb4\x46\x62\x29\x54\xae\xe1\x68\x36\x68\xc8\xbd\x4a\x3f\x90\x3b\xe5\xc7\x7d\xfd\xb8\xe8\x91\x4c\xed\xc5\x1f\x65\xfe\xd2\xd9\xc4\xd0\x3e\x13\xa6\x68\xd4\xc7\xea\x5e\x31\x88\x3e\x1b\x3d\xb6\x43\x63\xe2\xac\x5c\xc5\x4b\x54\xce\x69\xc6\xad\x52\xf8\x74\x99\x9b\x5d\xd2\xc5\x78\x2f\x03\xc3\xd5\x15\x05\xdf\x53\x6a\x1f\xe0\xd8\x60\xd3\x3e\xab\xed\x64\x1a\x94\x00\x89\xf1\x29\x7d\xd0\xf5\x7f"}, +{{0xf8,0xff,0x97,0x03,0x2a,0x34,0xcf,0x99,0x99,0x08,0x80,0x58,0xaf,0x56,0xff,0x70,0xb6,0xac,0xb2,0xed,0xf7,0x59,0xe1,0x31,0xfa,0xec,0x84,0x40,0xfd,0xec,0xf6,0xc4,},{0x54,0x38,0xb4,0xe3,0x3f,0x1c,0x5e,0xa1,0x12,0xfb,0x1b,0xaf,0xef,0x40,0x59,0xbf,0x09,0x5a,0x11,0x40,0x9b,0x64,0xd4,0x6b,0xfb,0x4d,0x25,0x47,0x3c,0x1c,0x08,0x74,},{0x50,0x9e,0x9e,0xad,0xfe,0x8d,0xde,0x79,0x14,0xac,0x20,0xca,0xfc,0x0b,0x0a,0xf2,0x2b,0x84,0xdd,0x8a,0x21,0x0a,0x48,0x12,0xcd,0x8c,0xae,0x39,0xb0,0xa2,0x72,0xe5,0x3e,0x02,0x24,0x6d,0xc8,0x93,0x9e,0x92,0x26,0x92,0x03,0x36,0xe1,0x40,0xb3,0x15,0x32,0xd0,0x68,0x13,0x7a,0x34,0x16,0x1e,0x59,0x9a,0x86,0x94,0xa9,0x5d,0xdf,0x01,},"\xdf\xb4\x1f\xb9\xd5\x37\x02\xcb\x2b\x9e\x3f\xfc\xad\x4e\xa6\x02\x71\x6f\x71\x8a\x7e\xa3\x3e\x21\x84\x3e\x2a\x6c\x05\x2c\x70\xc6\xc5\x14\x85\xd7\x2b\x53\xa5\xbb\x4e\x34\xe0\x3e\x3e\x1d\x1a\x52\x51\x8e\xb3\xe7\xf1\x8f\x2a\x1e\x1c\xaf\x78\xac\xb2\x11\x60\x89\xbe\xd4\xc6\x17\x13\x8e\x71\x6a\x91\x43\x1f\x2c\xf6\x44\xa1\x21\x0f\x6d\x19\x20\xd2\x85\x99\x42\x64\xd6\x46\x6b\x0d\x8d\x2c\x62\x63\x80\x44\x61\x6f\x57\x6e\xdc\x7d\x0d\x93\xcb\x66\x01\x31\xd4\xbb\x50\x87\x5e\x15\x36\x40\x12\x3a\x96\xf1\x5b\x75\xa5\xbc\xee\x46\xd5\xcc\x5e\xb1\xa4\x31\xc5\x9d\x2e\xad\xdf\xd5\x53\x15\x02\xfe\xb1\x55\x1b\xf7\x79\x1c\xd5\x98\x9d\x17\xd1\x02\x96\xd0\x1b\xa3\xae\x3e\x38\x4c\x67\x45\x26\xca\xb6\x2a\x7c\x24\xc0\xff\x67\x7d\xe7\x1c\xa1\x72\x62\x1a\x28\xa8\x5e\x01\xee\xfe\x07\xf6\xee\xf9\xc3\xec\xfd\x7f\x94\x98\xac\x42\xf4\x6a\x43\x71\x6f\x61\x53\x18\xa3\xb2\x87\x57\xc3\xa1\x5f\x4f\x1c\x38\x22\xae\x7a\x75\xc2\x03\xa2\x98\x25\x8d\x75\x36\x38\xcf\x42\x5e\x15\xbb\xc4\x62\x02\xb0\x93\xb8\xe4\xf3\xe6\x70\xfb\xb6\x63\xdb\x2b\x69\xc8\xfb\x0f\x62\x50\x74\xd8\x5a\x44\xd3\x50\xe0\x42\xbb\x1b\x74\x02\x1d\x19\x29\x97\xa2\xc2\x7d\xd6\xc8\x63\x48\x41\xd1\x00\xa0\x34\x4b\xae\xd7\x50\xa3\x9f\xf5\xdc\xd9\x84\x8d\xfc\xf0\x9e\x5c\x8c\x47\x96\x7b\x96\x55\x6e\x23\x32\xca\x17\xd8\xe4\x2d\xd8\xf3\x93\xa5\x44\x5a\x37\x22\x44\x60\x0b\x30\x01\xb8\xfe\x86\xc4\x5e\xaf\xc6\xe7\x38\xaa\x7e\x11\x7b\x4a\x79\xfa\x2e\x6b\x00\xf4\x64\x92\x8d\x18\x56\xc8\x3e\xcf\xe8\x7d\xd3\x4d\x15\x8f\x5c\xb4\xe4\xf4\xd6\x10\xf5\x97\x17\xec\x79\x0b\xd3\xff\x87\x20\x40\xb6\x7e\x8d\x39\x39\xe8\x04\xe3\xb5\xdb\x98\x5a\x09\x56\x21\xcb\xcc\xd6\x86\xc0\x93\x4e\xce\x3e\x27\xab\x2c\x6c\xe3\x3f\xb5\x2b\x11\x1f\x48\xe4\xf2\x74\xbd\xf3\x20\xd0\xb0\x23\x84\xc8\x3c\x49\xe1\xa0\x41\xbd\x23\x19\x10\x9c\x85\xa0\x6d\x80\x48\xa9\x93\x35\x7a\xbf\xd8\x11\xac\x2f\x38\x05\x9d\x07\x7a\xcb\xc3\x6a\xa9\x66\xc0\x28\x90\x37\x48\x62\x5f\x92\xe8\xf7\x9d\x51\xbd\xa1\x0f\x78\x52\x29\x77\xf7\x6e\xc4\xe8\x85\xe4\x9a\x46\xc6\x8d\xe0\x9f\x3d\xa8\xf8\x6b\x71\xae\x64\x23\xbd\x29\xde\xef\x1c\xc6\xa1\x13\xea\xc1\x15\xa6\xcd\xe2\xcc\xd0\x11\xfc\x1c\x0f\x0e\x34\x27\xf4\x3c\x3e\x96\xfc\x41\x56\xed\xf6\x2d\xdf\xb7\xb0\x83\x6b\x88\x8b\xab\x3c\x43\x45\x05\x5a\x6c\x41\x78\xe9\xe2\x28\x29\xfd\x8c\xfc\xe3\x9b\x0b\x84\x44\xeb\x26\x48\x7c\xc9\xdc\x82\x60\x6f\xea\xad\xaf\x49\x78\x69\x4e\x65\x64\xf2\x72\x9c\x1b\x13\xab\x37\xc9\x07\x2d\xb4\xe9\xde\x94\x0e\xe5\xf1\xd0\x58\x84\xae\x7f\xd9\xd9\xec\x9c\xb7\xde\x56\x34\x76\x00\xa8\x8d\xea\x92\x08\xa6\x34\x19\xfc\xe2\x9e\xe5\x00\x55\xa3\x74\xa8\xf2\x2f\x9a\xe2\xbe\x98\x05\xa9\xf4\x76\x15\xaa\x59\x57\x6b\x44\x04\x2f\xf1\x26\xa8\x98\x24\xe3\x6a\xd6\xbc\x58\xe0\x6b\xb9\x0f\xbe\xef\xba\xe5\xd6\xd7\xd6\x24\x30\xf3\x73\xb6\x29\x6f\xbf\xcd\x4d\x66\x20\x16\x83\x53\x58\x3f\xbd\x3d\x5a\x29\x2b\x95\x72\x51\x75\x34\xe2\xfb\x0b\xee\xf2\xfa\x98\xa4\x64\xe5\x91\x03\xe7\xa0\x42\x87\xf1\x5d\xad\x0f\xac\x54\x97\x0e\x77\x15\x07\x8d\x63\xec\x26\x36\x2f\x6f\xba\xbc\xdd\xea\xf7"}, +{{0x2e,0x4c,0x39,0x21,0x9f,0xc9,0x2a,0x53,0x8e,0x48,0xe9,0x5f,0xbf,0xcf,0xef,0x30,0xf5,0xa2,0x1b,0x78,0x94,0x0b,0x81,0x05,0x3b,0xda,0xd4,0x60,0x2b,0x4c,0x96,0x90,},{0xf8,0xee,0xd8,0x92,0x17,0x66,0x20,0x43,0x4c,0x7f,0x0e,0xc5,0x3d,0xcf,0xf3,0x98,0x63,0x10,0x9e,0x7c,0xa4,0xd0,0xb3,0xc6,0xc4,0xb5,0x64,0x10,0xbe,0x01,0xe5,0x37,},{0x39,0x45,0x20,0x12,0x2b,0xb0,0xa5,0x64,0x64,0x8a,0x7a,0x8b,0xc8,0xdc,0x73,0x63,0x6c,0x51,0x77,0x46,0xa3,0xc8,0xa0,0x5b,0x90,0x1e,0x72,0x52,0xfe,0xf0,0xe5,0x02,0x3d,0x90,0x99,0x1e,0x31,0x1b,0x53,0x82,0xd4,0x91,0x00,0xe5,0x26,0x33,0xc7,0x0f,0xe9,0xc2,0x6c,0x14,0x50,0xe0,0x60,0x3e,0x6d,0x45,0x22,0x99,0xaf,0x4d,0xae,0x07,},"\xc8\x7d\x1f\xba\x9d\x94\xa6\xa5\x40\x89\x80\xfc\x80\x83\x98\x0f\xd2\xd2\x52\xfa\xe5\x40\xf6\xee\xc1\x9e\xd6\x74\x6c\x29\xe3\x39\xa1\xc2\x9f\x6f\x53\xbc\x23\xfd\x6b\xfa\x43\x85\x07\xef\xf5\xda\xf9\x03\x40\x3c\xda\x70\x7b\x4d\xc5\xe8\x44\x80\x5d\x6b\x1c\xeb\x4a\xff\xf4\xb2\x32\xe8\xe6\x9d\x7d\x27\x1f\x3c\x06\x7c\x48\x54\xf3\xd9\x4f\x27\xfe\x32\x55\x81\xfa\xca\x79\xd1\xf0\x2a\x26\x29\x0a\xd2\x3a\xf7\x11\x00\xc1\x2c\x09\x15\x76\x47\xca\x9d\xa4\x3d\x76\x90\xdd\xcd\x94\xdb\x65\xe0\x00\x98\x9c\x87\x8b\x75\xa0\xff\x22\xd2\xc7\x09\x62\x59\x4c\x9b\x08\x08\xf2\x78\x46\xcc\xac\x85\x67\xbc\xe5\xd2\xe3\xb7\x60\x28\x09\xf2\x3b\x59\xcd\x71\x8a\x08\x05\xd1\x08\xf3\x1a\x63\x2a\x05\xb8\xdf\xa5\x03\x5a\xb9\x46\x1a\xeb\xa4\x16\x00\x9d\x74\xfd\xf9\xe0\x07\x20\x28\x56\x89\x0d\x2c\xff\x80\xfa\x24\x0b\x97\x8a\x48\x27\x0f\xcb\x2f\x47\x36\x97\xbc\xba\x8e\x73\x0a\x55\xc2\x87\x61\x91\x9a\x23\xbe\x41\xda\x27\xff\xea\x09\xe3\x55\x9c\xaa\xab\xf9\x51\x9e\xc0\x8e\x1f\xfa\x86\x81\x7a\xa3\xe8\x87\x4f\xa8\x16\xe7\x71\x8c\x5b\x2f\x34\x49\x67\xba\x1b\xc2\x81\x9c\x4f\x04\x5a\x97\xb4\x05\x44\xea\x61\xd7\x17\x08\x3c\xca\xf1\x1e\x9d\xdc\x04\xa3\x59\x8e\xf1\x81\xe7\xbe\xf4\xac\xef\x45\xb6\x55\x1b\x47\x8a\x0d\x77\x31\xc4\xf0\x8c\xe5\x80\x2f\x78\x25\x8d\x41\x90\x17\x66\x10\x76\xd7\xd6\xd2\xef\x39\xe5\x7c\xf9\xcd\x93\x97\xdc\xc5\xde\xbf\x64\xab\x82\xb6\x61\x59\xf5\x78\x31\x6e\x74\xcd\x49\xf5\xad\x2c\x6f\xef\x83\xcf\x08\x68\x3b\x95\x70\xa9\x46\xad\x49\x03\xdf\x4e\x96\xec\x00\x8e\x14\xa5\x01\xfa\x93\x86\xbd\xaf\x2a\x63\x99\x3c\x6c\x9b\xdf\x23\x1f\xd0\x9e\xa6\xf9\x6e\xf4\xd4\xe2\x9a\x3a\x33\x27\xcb\xf7\x4e\xa8\x31\x05\x4e\x66\xca\x86\x68\x0c\x6c\xe5\x3b\x66\xf9\x46\x5d\x06\xb3\xfa\x07\x98\xbb\x69\x05\xae\x38\x45\x59\x34\xf2\xfb\x7e\x0b\xa4\x72\x32\x89\x89\xf0\x01\x30\x86\x71\xcc\xcb\x56\x6d\x22\x2c\x72\x16\x5b\xb3\xa7\x44\xfb\x98\xe2\x21\x0f\x96\x20\x68\x0d\xf3\xe3\xcd\x14\xa8\xbd\x94\xb5\x74\x5c\x00\x16\xdd\xa7\x7f\x05\x9f\x26\x05\x3b\x64\xcf\x45\x23\xc3\xd4\x29\x11\x2f\xb6\xb3\x28\x39\x8b\xc6\x30\xa2\xe9\x06\xb9\x5a\x6c\x57\x80\xcf\xdc\x06\x41\xbe\x47\x51\xbe\xbd\xdf\x77\x24\xdc\x9c\x27\xe7\x8d\x60\xed\x0f\xd7\x36\xd5\xab\xd8\x89\x29\xc1\x79\x5d\x47\x3a\xbd\x2b\x03\x20\xc5\x40\x47\x57\x28\x82\x18\x67\xa4\x09\xa2\xff\x13\xcc\x44\xce\x35\xe5\x98\x1e\x9f\x6b\x87\xa2\x8d\x4f\xa8\xb8\x67\x5e\x50\x3f\xae\xfc\xa7\xc1\xd7\x98\x47\x37\x87\x1f\xe9\x19\xac\x41\x4e\xea\x26\x5e\xe3\x1f\x9f\x78\xf5\x21\xf3\xf4\xf8\xd0\x0c\x3f\xb7\x91\x71\xf3\xc6\xa5\xdb\xf5\xe1\xac\x8b\xf6\x3b\x4c\x3d\x8d\x8b\xc1\x21\x03\x6e\x9e\x55\xbb\x70\x2e\xa6\xc8\x6e\x92\x5e\xc0\xb9\x84\xde\xd2\xc7\x1f\x3b\xfd\x49\x32\xe6\xc4\x1b\x58\x2f\xd0\x2c\xa5\x9f\x53\xce\x29\x74\x45\x78\x5c\xc4\xca\xc2\x47\xb0\xb8\x4e\x7f\xa0\xbc\xdc\xf7\x9b\x3e\x4a\x15\x5f\x98\x78\xc1\xf6\x43\xbe\x9c\x42\xf7\xa4\xf2\x72\x60\x44\x45\x05\xc1\x84\x5b\xd5\x3b\x55\x0a\x31\xd7\x95\x3c\xc7\x38\x86\x1f\x46\xbd\xf4\x87\x0f\x3a\x77\xac\xe1\x91\xab\xd6\x3c\x45\xad\xb1\x53\x90\x9f\xb5\x9a\xb5\xdb\x9b"}, +{{0xf0,0x92,0xe6,0xbe,0x8d,0x2d,0x9a,0xd0,0x69,0xa3,0xe2,0xb9,0x76,0xd2,0x44,0xe3,0x4c,0x15,0xc2,0x8c,0x48,0xd3,0x2f,0x55,0x60,0xa5,0x41,0x85,0xd1,0x50,0x15,0x02,},{0xcf,0xeb,0x3e,0x74,0xe4,0xb5,0xc8,0x35,0x6a,0x81,0x75,0x7b,0x8f,0x1b,0xe4,0xb4,0x29,0xfc,0x18,0xfc,0xaf,0x49,0x7c,0xbf,0x8d,0x8b,0xc0,0x48,0x0f,0xf9,0x78,0xf9,},{0x63,0xcd,0x4c,0x0b,0xa3,0xbe,0x93,0x97,0xcc,0x0f,0x3c,0x1a,0xf3,0x48,0xec,0x4b,0x8a,0x91,0xe4,0x2f,0xee,0x67,0x5d,0xa1,0xd0,0x59,0x00,0xb9,0xa8,0x6c,0x13,0x8f,0x91,0x74,0xeb,0x99,0x6b,0xbd,0xf3,0x1c,0x42,0x95,0xe0,0xc5,0x78,0xac,0x0f,0x9d,0x53,0x76,0x41,0xa2,0xaf,0xd5,0xdf,0xf9,0x3a,0x39,0xc5,0xcd,0x9d,0x3c,0x48,0x0b,},"\x2c\x25\x5f\xb2\x5d\x45\xb0\x86\xc0\x71\xe0\x3e\x52\x5b\x4d\x72\x85\x78\xfb\xb6\xb0\xc6\x0d\xa9\x41\xe6\xbf\x2a\x48\x98\xb2\xd5\xb6\x98\x8c\x53\x30\x27\x85\xab\x7a\x3b\xc4\xbb\x2c\x20\x5a\xcd\x27\xd6\xa4\xcb\xdd\x1a\x0c\x08\x89\xde\xd7\x84\x26\x4c\xb7\xc0\x28\x89\xc5\xc7\x11\x3f\xc9\x0b\xbb\xcd\x31\xff\x00\x14\x32\xc0\x53\xf9\x71\x07\x3c\xf6\x71\x2f\x66\x7f\xce\x46\x98\x77\x6b\x98\xcc\x54\x44\xc6\x92\xab\xd1\x28\x81\x98\xbe\x5a\xd5\x67\x46\x09\xf7\xe1\x39\xad\x1b\x9c\xcb\x94\x3f\x8d\xfd\x9d\x12\xc5\x4e\xce\xe2\x78\x34\x1b\x2e\xe1\x27\x79\x91\xca\x62\xcd\x3b\xfe\x12\x8d\x13\x92\x96\x4e\x95\x88\xe2\xf9\x7c\x32\x17\x04\xa3\xde\x10\x61\x88\xc5\xeb\x33\x5a\xa5\xa1\x9a\xcc\x90\x67\xb4\xa9\x41\x29\xb9\xd1\xa6\x16\x7c\x4b\xbf\xb5\x6f\xb9\x76\x84\xcb\xbd\x72\x0c\x86\x86\x9e\x00\x20\xab\x07\x76\xcd\xc9\x95\x4f\xeb\xa8\x62\x12\x4b\x07\x3f\xba\x8d\xe9\xea\x9a\x38\xea\xcf\xa0\x03\xae\x4f\x1c\xdc\xbf\x15\xc3\x2f\xb6\xb9\x70\xc7\x31\x15\xdd\xff\xcd\x4f\xa3\xb7\x18\x46\x11\x0e\xde\xc2\x57\xfc\xae\xd6\x11\x36\x04\xf7\x19\x25\x72\x57\x72\x64\xb9\x90\x5c\xa6\xae\xd8\xda\xec\x13\x84\x03\xca\x41\xaa\x95\x42\x78\xa5\x72\x0b\x26\x7b\x90\xca\x16\x3a\x9b\xdf\x44\x7e\xad\xe8\xde\xb7\x69\xa3\xb4\x92\x37\xa7\x35\x16\x97\x7c\x28\x73\x45\x55\xdd\x23\x4c\xa7\xde\x49\x99\x26\x1b\xc7\x96\x0f\x53\x6b\xa8\xa3\x5a\xd3\xd0\x2c\x75\xf1\xc2\xbe\xa0\xa0\x61\x2e\x7d\x49\xc4\x03\x97\xdd\x6a\xf5\xff\x58\xba\xe6\xa6\x4b\x6a\x77\xe9\x81\xf9\x2d\x15\x9e\x0b\x2b\xd2\x05\xab\x15\x70\x52\xf4\x70\x17\xa3\xe1\x8a\xec\x94\x4d\x04\x65\xee\x00\x17\xe9\x61\x48\xa6\x12\x9f\x74\xd3\xcc\xb4\x89\xfe\xa1\x3a\x15\xa9\xb9\xac\xed\x58\xc6\xee\x0e\x6e\x84\xe0\x5f\xda\xdf\xae\x07\xb3\x34\xa9\x8f\xc3\x7f\x7e\x51\x1c\xd5\xa4\x4e\x9c\x74\xe4\x78\xd3\x49\xe3\x0e\x29\xae\xb4\x6a\x4d\xf0\x1e\x43\x07\xfe\x65\xe1\x39\x4a\x75\x8f\x6a\xda\x2f\xb1\x20\x22\x5c\xcd\x50\xa4\x90\x13\xe6\xc9\xf1\x75\xaf\x90\xf3\xfc\x8c\x57\xe7\xa6\xa9\x69\xa9\x16\xc3\xf1\xaa\xcc\x22\xf3\xe0\x1a\x07\x0c\xc4\x8e\x6f\xd8\x78\xe2\xbd\x07\x3d\xf9\xee\x6f\x05\x9b\x98\x56\x84\x04\xfc\x7e\xae\x7d\x4b\xf6\xfa\x16\xc0\xc8\x03\xc6\xbe\x84\xe8\xb7\x9c\x67\xaf\xfc\x8c\x88\xca\xbd\xee\xbc\x11\x34\xbb\x23\x86\xe2\x2b\xa4\xd2\xe9\xe0\xf3\xe1\xab\x3a\x0d\xac\x7c\x80\xdd\xee\xd7\x73\xcd\xa0\xc4\x1d\xc9\xde\xfa\x67\xfe\xa3\x77\x69\xcb\x4a\x1e\x15\x22\xd7\xe0\xb3\xd7\xc4\x63\x8b\xcd\x98\x31\x53\xd4\x78\xbe\x5e\xcf\x2b\x6a\xb1\xb4\x01\x24\xe4\x22\x2b\x8c\xaa\x46\x47\xbd\x50\xd7\x4d\x20\x39\x43\xab\x20\x93\x8d\x5f\x27\xd9\x08\xa6\x73\x67\x40\x46\xce\x2e\xf1\x8e\x85\x8b\x0a\x01\xa7\xe7\x53\x0d\xed\x0f\x8c\xc8\x9e\xf0\x9b\x73\xca\x59\x7c\xf7\x3a\xfb\xc9\xa2\x71\xa4\xd2\x3c\x92\xfe\x59\x18\x83\xc4\x40\x10\x9c\x4e\xf4\x16\x67\x0b\x7f\x2c\x59\x05\xb7\x7f\x65\xf5\x6d\x09\xd4\x02\x50\x35\x6f\x9b\x1d\xbc\xaf\x1e\xe2\xc0\xb6\x36\x96\xf8\x4d\x68\xdd\xbe\xa1\x60\x08\x51\x51\xa9\x52\x62\x74\xd7\xb8\x46\xcc\xeb\x6c\x43\x48\x09\x84\x84\xde\x3b\xb7\x23\xae\x5e\x85\x27\x6d\xf4\x9f\x56\x34\x13\x0f\xf9\x05\x75\x4f"}, +{{0x01,0xa2,0x47,0x94,0x3a,0xfe,0x83,0xf0,0x36,0xb6,0xb6,0x0f,0x23,0xd9,0x77,0x74,0xfd,0x23,0x20,0x8e,0xdc,0x31,0xcf,0x3d,0x88,0x20,0xe9,0xdc,0x63,0x66,0x11,0x03,},{0x8c,0x97,0xa5,0x8b,0xe0,0xe8,0x47,0xc4,0x8a,0x6a,0x39,0x87,0xcf,0xe2,0x50,0xa8,0xd7,0xb0,0x7d,0x97,0xf9,0x61,0xf6,0xb7,0xb7,0x9e,0x7d,0x80,0x42,0xb8,0xbd,0x7b,},{0xed,0x2c,0xed,0x1a,0x4f,0xdd,0xb3,0x44,0x2a,0x63,0x73,0x48,0x17,0x9a,0x6a,0x5b,0xee,0xdc,0xb4,0x4c,0x8e,0x98,0x8c,0xa2,0x6f,0x78,0x93,0x6d,0x2c,0x8d,0xb5,0xc5,0x16,0xd5,0x4b,0x8c,0x4f,0x08,0xd9,0x1d,0xd7,0x04,0x2a,0xb6,0xab,0x26,0xd8,0x7f,0x23,0x0e,0xb2,0xb2,0x15,0x6f,0x3c,0xe2,0x99,0x4f,0xce,0x7c,0x2b,0x0f,0x10,0x0e,},"\x08\xd8\x14\x95\xda\x77\xf4\x07\x25\x5c\xc4\x1a\x81\x8e\xef\xa7\x27\xe2\xc4\x7a\xe4\x11\xf4\xb5\x41\xf0\x1f\x81\x1d\x90\x6d\x55\xfb\x1e\x3c\x9c\x48\x4d\xf3\x05\x65\x36\x4d\xe9\xdc\xb9\xfe\xa0\xaf\x66\x11\x2f\xe7\x5f\xd1\x1a\xe8\x1d\x26\x41\xb5\x47\x58\x9f\x8b\x97\x4a\x97\xe7\x97\x6e\xd6\x92\xaa\xd6\x40\xed\xd2\x88\xbd\x86\x3d\x11\xc4\xca\x98\x36\xf9\xd7\xc1\x15\xc3\xd9\x88\x30\xd6\x42\x47\xcb\x6f\x8f\xb6\x03\xc6\x98\x11\x33\x55\x2a\x32\x04\x04\x19\x61\xbd\xd8\x3e\x2f\x9d\xeb\xa7\x70\xc0\x39\x4f\x9b\x60\x2a\x45\x35\x51\x07\x49\x21\xa3\xde\x28\x32\x13\x69\xd7\xf8\xca\x64\x0c\x45\x10\x9e\x8f\x52\x2c\x97\xed\x9f\x35\xb9\x27\x7a\x35\x0e\x29\x59\x31\xb4\x2e\x01\x35\xe9\x4a\x92\xfe\xd3\x63\xd6\xca\xe3\x92\xf7\xc4\x51\x99\x32\x7e\x24\xb4\xcf\xa5\x89\x8a\xb5\x99\xae\x7b\xd5\x0b\xd3\xa0\x0c\x0d\x00\x7e\x95\xfa\xf8\xf2\xae\x10\x38\x02\xca\x7e\x53\xb2\x79\x18\x4d\x06\x90\x5f\x57\x48\xca\x8b\xe1\xf7\x2e\x66\x8c\xb8\x32\x83\xdd\x00\x40\x64\x91\xf8\xb9\xb4\xe5\xa9\xd4\xa5\x43\x8b\x2f\xa4\x37\x1e\x0b\x05\x68\x6f\x87\x57\x5b\xaa\x79\x6e\x30\x2f\x08\xff\xc4\x25\x66\x27\x50\xa3\x3a\x0c\x9c\xfa\xa4\xb4\xd7\x04\x1f\x92\x64\xfe\xd7\xbe\x4f\x9f\xde\x2c\xac\x68\xa2\x15\x82\x36\xf6\xac\x43\x04\x7e\x91\x1f\x4c\x4e\x8b\xc6\x63\xfd\xd5\x05\x17\xdf\xaa\x8f\xbc\xd2\x19\xdd\x7a\x0e\x93\x69\xf4\x3d\x0d\xd2\x5b\x4f\x0c\xf9\x30\xf2\x0b\x7b\x7c\x6d\xb9\xd5\xbe\x0c\x6e\x19\x60\x94\x1a\x3e\x04\xd1\x41\xc0\x3e\x59\x61\xaa\x33\xe9\x02\x44\x77\xd5\x33\xc9\x95\x37\x87\x96\xbf\x22\x92\xad\xe9\x22\x69\x5b\x14\x56\x9f\xc3\x39\xb3\xd9\x08\x5c\x63\xfc\x6e\x5b\xef\x4d\x99\x0c\x80\x33\x3a\x6b\x57\xaf\x47\x8f\x93\x8e\x3e\xe7\x38\xb1\xd1\x29\xbd\x97\x6a\xfe\x68\x61\x28\xbc\xac\x08\xcc\xbe\xb0\x34\x9b\x9b\x53\x73\x13\xbc\x7b\xf5\x91\xc6\x5d\x4a\x71\x23\xad\x30\xbd\xbe\x14\x86\xb4\x28\x08\x47\x48\xb6\x50\x7f\x6f\x5e\xf6\x7c\x26\xca\x86\x2c\xf7\x26\xaa\xc1\x40\xb8\x61\xae\x0d\xc7\x4b\xb3\xc0\xb4\x89\x78\x9f\x17\x14\x5e\x9a\x85\x5a\x3e\x2b\x5d\xaa\xc4\x18\xd8\x35\x37\x33\x23\x9e\xf6\x9c\x7b\x56\x5b\x53\x03\xeb\x87\xbd\x7f\x64\x9a\xbf\x40\xa2\xf1\x35\xa2\x9e\xd2\x7e\x3b\xe4\xc1\x2c\xd6\xdd\xd2\xe5\x41\x8a\x99\x97\x43\x83\x66\x3f\x58\x49\xbf\x3c\xe5\x53\x2b\xf6\x4a\x80\xaa\x52\x11\x91\xd2\x53\x90\xbc\x19\xa4\x5e\xed\x1d\x3f\xec\xa1\xd9\xfc\xc0\xdb\x03\x1b\xfb\x48\xe4\x50\xbe\x3d\x45\x93\x35\x6d\x5b\xa0\xf3\x10\x47\xb4\x57\x74\x5f\x21\xe3\x2e\xbe\xa3\xca\x6c\x35\xf0\x5d\x78\xd8\xc3\x16\x40\xb0\xfe\xcb\x94\x01\x16\x56\x75\xc7\xf9\xcb\xb1\x9b\xc4\xb5\x67\x7c\x2c\xce\xdc\x4e\x7a\xaf\xb8\x41\x84\xc1\x91\x99\xac\xa0\xdb\x21\xcf\x50\x67\xdc\x3a\xf7\x69\xbc\xc6\x29\x35\x5f\xf7\x25\x7a\x9e\xfd\x71\xa6\xa9\x2d\x13\x0d\x35\xab\xee\x6e\x70\x60\x5b\x5c\xab\x93\xc0\x28\xfa\xc3\xaa\x23\x44\xba\x86\x1a\xc1\xe8\xce\x9a\x4b\x07\x0c\x3d\xf7\x40\xd2\x8c\x5e\xce\x0f\x1b\xc3\x1c\x2d\x7d\x1e\x5e\xcc\x76\x10\x44\x80\x93\x91\x33\xa1\x86\x60\xe4\xa3\xe4\x84\x6b\x25\x17\xbe\x3b\x8e\x7a\xfa\xfe\x07\x83\x91\xd8\xaa\x8e\x5c\x30\x13\x7e\x85\xd9\x4d\x64\xa2\x79\xfb\xee"}, +{{0x91,0xfd,0xef,0xcd,0xbc,0x99,0x0d,0x3e,0x8e,0xeb,0x60,0x17,0x04,0x34,0xda,0x10,0x83,0x1b,0x03,0x08,0x1f,0x6a,0xfd,0x0d,0x7e,0x12,0xb1,0x00,0x11,0xe0,0x2a,0xef,},{0xc5,0x8d,0x3e,0x20,0xb8,0xd4,0x7b,0xa4,0x55,0xb9,0x12,0x57,0x2d,0xc8,0x40,0x81,0x5e,0x3d,0x88,0x5f,0xa5,0x91,0x7d,0x1d,0xa4,0x84,0x08,0xb9,0xa9,0x56,0x40,0x98,},{0x51,0x01,0x12,0x22,0x3b,0x33,0xa5,0xab,0x15,0x64,0xf7,0x53,0x71,0x91,0xcd,0x29,0x2a,0x9d,0xbd,0x5a,0x32,0x3d,0x7a,0xdd,0x05,0x84,0xc1,0xb0,0xad,0x00,0xd0,0xac,0x71,0x99,0xc3,0xfb,0x75,0x8e,0x91,0x3f,0xf3,0xd7,0x16,0xc2,0xe9,0x0d,0xd9,0x0d,0x4e,0x8f,0x59,0x95,0x1e,0x87,0xef,0x8b,0x78,0x21,0x4a,0x51,0x75,0xc4,0xe6,0x08,},"\x5b\x0c\x1a\x3a\x95\xe0\xba\x74\x74\x76\x6c\x9b\xad\xfa\xe3\x4a\xb8\x60\xe0\xa6\xc0\x33\xa2\x2f\xba\x72\x11\x27\xf5\xbb\xee\xe8\xe2\xcb\xde\x1a\x1d\xfe\xb1\x8d\x55\x1c\x95\x99\x4d\x21\xe3\xeb\xc6\x8a\xfa\xe6\x85\x44\x4a\x3a\x41\x95\xbc\x75\x55\x38\x90\x3a\xcf\xa6\x71\x55\x92\xdd\xe2\x56\xe7\xa1\xb4\xc3\x63\xec\xa7\x1e\xf0\xf3\xa4\x8a\xe3\x44\x2d\x50\xd5\x66\x1b\x39\x40\x96\xb7\xec\x27\xbb\xf5\x29\x53\xf3\x04\x0c\xd2\x5b\x78\xce\x47\x55\x27\xe0\xcc\x59\xf1\xef\x9a\xe2\xe0\x59\x04\x31\x58\x2b\x2d\xf8\x14\x14\x99\x82\x9a\x2c\x5f\x7b\xbe\x35\x98\xe4\xc9\x6c\xc0\x1e\xde\x2f\x43\xb6\x56\x05\xb4\x88\x59\x37\x09\xc0\x94\xb5\xa0\x42\xb2\x85\x55\xfb\x52\x27\xa6\xd1\x56\x37\x6f\x3f\xf0\x7b\xd5\xc8\xbc\x68\x04\xd3\x9a\x32\x82\xac\x59\x70\xba\x08\xae\xbf\x75\x42\xb8\x45\xf6\xb5\xc2\x38\xc2\xce\x20\x44\x3f\x7f\x77\x55\xd7\x5f\xe4\xfa\x16\xb9\x64\x4c\xa3\xe2\x1d\x91\xa9\xa8\x7c\x68\x61\x15\x74\x8a\x16\xc0\xae\x4a\xe4\xe1\x6d\x1c\x71\xae\x60\x0b\x39\xcd\x25\xe5\x63\x3b\x39\x9f\xee\x7f\xf2\xe3\x62\xbe\xd2\x51\x25\xc6\xfd\x5c\x7f\x5f\xfa\x2d\xa2\x35\x3f\xd3\x5b\x78\x4a\x1b\x1b\x03\x19\x77\x47\x58\xb7\x39\x0c\x44\xdc\xc9\x2f\xca\x42\x01\xdf\xe1\xa3\x75\x69\xde\x05\xf0\x66\x4d\x08\xb9\x0d\x6e\x2b\xad\xc2\x1b\x92\xf9\xce\x87\x21\x42\x35\x7b\x96\x15\x08\x0a\xb7\x65\x9a\x24\x6f\xf0\x85\x2a\xdb\x17\xdf\xda\x70\xcf\x17\x54\x15\x7b\x13\xbc\x03\x2b\x4c\x5d\xeb\x8e\x10\x68\xb4\x69\x2b\x93\x16\x5d\xa3\x5e\xfc\x9d\xa8\x6a\xcb\xe6\xf8\x0f\x01\xbb\xc2\x6f\x57\x5e\xc5\xaf\x5b\x05\x0e\x98\x28\xaf\xde\x6c\x3b\x78\xe7\x33\xeb\x5a\x91\x24\x92\xf7\x65\xbc\xad\x73\x1b\x95\xe3\xab\x88\x96\xb6\x17\x58\xbf\x91\x3b\x9a\x15\x68\xf9\xc5\xb4\x60\x33\xcf\x45\xdc\xc1\x75\x0d\xa2\x06\x6c\x60\x8d\xc3\xd3\x43\x73\x8e\x84\x8d\xc3\x90\xcd\x47\x44\x32\xe9\x91\xd7\xaa\x2c\x5b\x27\x81\x42\x1e\xfe\x55\xe3\x6b\x0b\x42\xc1\xf4\x9a\xe2\x77\x48\x0b\x0f\xc5\xff\x68\x5b\xb5\xa3\x1b\xe3\xa0\xfa\x44\x82\x38\x16\x07\x70\x37\x54\x8a\x5c\x9b\x0e\x1c\xc6\xc6\x35\x04\xa4\x07\x57\x9a\x36\x32\xb3\xc9\x6f\xcd\x0d\xe5\xea\x1e\x4d\x6e\x87\xc0\xca\xf7\xb6\xca\xe3\x12\x0d\xb8\xb1\xf4\x61\x5c\xe6\xa7\x5a\x81\x65\x4f\x39\x04\x28\xb6\x4c\x21\x3e\x72\x7e\xec\x3a\xe7\xf9\xf4\x2d\xb9\x06\xf4\xde\x1f\xda\xdd\x34\xa3\xda\x2a\xeb\x12\xb4\xd9\xa1\x85\xf4\xa6\x0c\xb0\xc2\x67\x45\xf5\x30\xb4\x81\xfc\x97\x6a\x09\x3c\xe2\x4a\x30\x91\x6a\xf6\x05\xee\x94\xb0\x87\x85\x19\x3a\x94\x9d\x56\x9c\x4b\x7e\xf5\x96\x03\xbb\x62\x43\x60\xe7\xb4\x08\xd9\x8c\xa5\x09\xda\xf5\xa9\x2a\x6d\x40\x15\xbd\xb6\xf9\x7a\xd4\xff\x0c\xf0\x5c\x8f\x0c\xd5\x47\x6a\x93\x44\x26\xa0\x59\xf2\x44\x44\x46\xe5\x86\x4f\x08\x9e\x0f\x06\x75\x61\x59\x10\x66\x2d\x7c\x1e\x79\xa6\xc7\x5f\xa3\x14\xb7\xba\x2c\x64\x3b\x0d\x37\x65\x3e\xef\xe5\x93\x17\x2d\x1d\x33\x2c\x8d\xd6\x44\x92\xea\xf1\x04\xfb\x19\x57\xba\xa5\x20\x49\x44\x2d\x10\xb5\x6a\xf8\xea\xe8\xff\x82\xcd\x8f\x46\xa0\x49\x4b\xec\x2f\xcb\x9f\xad\xf1\x0c\xf7\x1a\x6e\xec\xd0\x54\x7d\xaf\xdc\x7a\xdb\xaa\x45\x03\x78\x3f\x94\x3a\x46\xb4\xad\x0e\x6d\xd7\xf2\xca\xb5\x56\x17"}, +{{0xef,0x00,0xb3,0xc1,0x81,0xf6,0x32,0x7d,0x02,0x25,0x67,0x51,0xcb,0x51,0xc2,0xc3,0x6c,0x0c,0x0a,0x78,0x07,0x63,0x40,0x54,0x8f,0x5b,0xc0,0x70,0xd8,0x6d,0x9e,0x26,},{0xdb,0x14,0xcd,0x32,0x58,0x8f,0xd7,0x41,0xe8,0xf4,0x2e,0x51,0x21,0xcc,0x81,0x1a,0xd4,0x50,0x63,0xf2,0x81,0x41,0xe8,0x3c,0x66,0x8f,0x07,0xd9,0x12,0x28,0xf0,0x49,},{0x13,0x9f,0x9c,0xb9,0x9b,0x99,0x5b,0xe6,0x58,0x8c,0xdd,0xb5,0x05,0x16,0x94,0x83,0x8f,0x9d,0x82,0xa6,0x07,0x61,0xfd,0xe3,0x04,0xb0,0x02,0x7f,0xf8,0x65,0x84,0xbf,0x65,0xc7,0x3c,0xc6,0xd2,0x53,0xe5,0x60,0xf6,0x55,0x25,0xdf,0x04,0xbf,0xe1,0x46,0xc8,0x3b,0x42,0x26,0x9c,0xf3,0x78,0x0f,0x8b,0xc3,0x92,0x43,0x78,0x94,0xae,0x01,},"\x7d\x6a\xbe\xc7\xa1\x1a\xf6\x73\x24\xce\x17\xb1\xd2\x0b\xb4\x0c\x66\x8a\x21\x9b\xc9\x5d\xf0\x5e\x32\x5d\x86\xf8\x87\x95\xe2\x64\xd4\x54\xfc\x5f\xa7\xd9\xc8\xaa\xfe\x77\xe9\x0a\x6a\xf6\xb5\x74\x53\xd8\x5b\x97\x0b\x55\x2a\x85\x6b\xa6\x59\xab\x31\xbd\x8a\x66\x0e\xb7\xd3\x58\x7b\x45\x3e\x5c\x5f\xc6\xb7\x94\x72\xb2\x6e\x8f\xf7\xdd\x6d\xb6\xbe\x35\x72\x54\x8b\x0d\x75\x4e\xd4\xd9\x85\xb8\xd9\x96\x5f\x88\xb9\x52\xfc\x4f\xa3\xb7\x61\xcc\xff\xc3\x53\x54\xdb\x0e\xb9\xc5\xa1\x71\x71\x8a\x8a\x55\x92\x87\x02\x13\x82\x7d\x36\x91\xba\xe7\xfd\x9c\x63\xf2\x05\x03\xe0\x43\x19\xb5\xe9\x53\x57\x9d\xe4\x7e\x3e\xf8\xe1\x62\x85\x49\x50\x3c\xb4\xf6\x87\x1b\xa2\x5d\xb8\x73\x47\x08\x0e\x53\x1a\x51\x7a\x8b\x72\x21\xe6\xad\x84\xdf\xf8\x32\x56\xd9\xab\x9a\x43\x3d\xe8\x71\xb9\xcb\x9c\x50\x44\x58\x9e\x67\x20\x6b\x31\x7a\x52\x06\xae\xba\x96\xc9\x2f\xd6\x09\x40\x71\xc6\x44\xfe\x52\x65\x8d\xed\x92\x20\xcf\x6a\xbd\x50\xe2\x30\x5a\x1c\x90\xfd\x66\xaa\xcf\xb3\x8e\xb0\x5e\xaf\xf6\xca\x5f\x85\xf4\x29\xcd\x57\x71\x6e\xb8\x77\x39\xa0\x2b\x64\xcf\xfa\x08\xc4\xf6\x85\xb0\x03\x10\xb5\xb4\x84\x49\x20\xdf\x21\x5a\x9f\x24\xa1\x76\x13\xae\xf8\x5f\xec\x94\xf5\x11\xdc\x8a\x42\x94\xed\xdc\xea\x11\xc0\x8c\x0b\x39\x9a\x23\xd9\x16\x38\x3e\x29\xad\xeb\x98\xc6\x5d\x41\xc7\x05\xa5\x7f\x84\x05\x20\xfa\x80\x8d\x7f\xd2\x5f\xdc\xe1\x59\xf7\xa0\x84\xd0\x62\x97\x4b\x30\x13\x2a\x57\x12\x42\xba\xff\x41\x96\x24\x6d\x6d\x75\x7b\x31\x2e\x9d\x60\x85\x53\xd2\xdc\x53\xb6\x23\xb2\xe9\x5c\x75\x38\xfb\xc5\xde\xb6\x2b\xa7\x37\x76\xd8\x5e\x51\x18\xfa\x1a\x30\x2d\x4d\x07\x6d\x99\xe1\x00\xf0\xdf\x11\x9c\x33\xfc\x66\xcd\xfe\x6f\xd4\x4d\x71\x99\x7b\x78\xc8\xf7\x89\x0c\x70\x73\x46\x05\x62\x20\xd1\xe9\xde\x88\xbc\x17\x3c\xf0\xb7\x6c\xb3\x02\x87\x7e\xc1\x6a\xf4\x6e\x4c\x31\x63\x9f\x54\xee\xdc\x16\xda\x9d\x9e\xb0\xad\x95\xbd\xa5\x45\xdf\xc4\xa7\x32\xb6\xda\x98\x14\x13\x6a\xb1\xb9\x39\x2a\x07\x1b\x02\x24\x73\xb3\x49\x05\x57\x69\x8b\x77\xe7\x44\x7a\xc8\x59\x0d\xca\xf4\xf2\x42\xad\x3d\xfb\xc0\xdf\x71\x6c\xc0\xea\x75\x36\x26\x97\x3d\xf0\x8d\x93\x5d\x17\x8e\x33\x12\xfb\xe2\xa7\xba\x9c\x50\x93\xc5\x3b\x92\x55\xea\xca\x29\xb7\x25\x78\xe3\xba\x1b\xdf\xaf\x0c\x9e\xce\x21\xa5\xdf\xf6\xea\x42\x15\x24\xf7\x0f\xc1\x90\x4e\x9a\x2c\xf7\xc5\x18\xbf\xcc\x7e\x36\x73\xee\x87\xff\x27\xe1\xca\x2a\xc3\x2b\xcb\x40\x91\xcb\x34\xa8\x2a\x71\x56\x3f\xf6\xa6\xa1\x5d\xa0\xeb\xd5\xbd\x10\x25\x6c\xe9\x60\xf4\xea\xa7\xfe\x35\xe1\x28\x88\x60\x50\xd0\x49\xfe\xc3\xa4\xab\x16\xd5\xb0\xc1\x07\x26\x7e\xae\x1a\xb8\x01\xea\x5b\x91\x98\x38\x39\xda\x1c\x48\x8c\x12\xf8\x64\xd7\xc3\xa7\x7f\x2b\x6a\xe2\x7d\x54\x01\x09\xf6\x8d\x78\x36\x4b\xb6\x27\x18\x3b\xd5\x03\x91\x75\x47\xaa\xf3\xb3\xa1\x80\x9d\xa0\x25\x77\xb3\xf0\x3a\x9a\x3f\x5a\xf4\x8c\x88\x02\xe2\x97\xc8\xbb\x63\xdb\x6a\x86\xd3\xea\x72\x7a\x6d\x71\x48\xb3\xaa\x44\x4b\x8d\x16\x8f\x38\xc6\xc8\xf2\x40\x88\xa4\x9a\xf3\x31\x77\xa3\x44\xad\xab\x2c\xf6\xe0\x8e\x0c\xb0\x37\x1e\xd5\x2b\xde\xad\x13\x2f\x77\xe7\xae\x3e\xe5\xd8\xfb\x17\xaf\xc0\xa0\xbb\x73\x11\xb9\x56\x0b\x67"}, +{{0xd0,0x71,0xd8,0xc5,0x57,0x8d,0x02,0x59,0x49,0x93,0x2a,0xa6,0xbf,0x6a,0x80,0xb1,0xcc,0x41,0x2f,0x10,0x6f,0x91,0x57,0x4e,0xe2,0x46,0x54,0xb4,0x45,0xee,0x9a,0x97,},{0x9b,0xcb,0xf7,0xd2,0x21,0x2f,0xb6,0x2c,0xcc,0xf8,0xb6,0xc7,0x68,0x03,0xa5,0xea,0x24,0x40,0x9d,0xa6,0x28,0x7e,0xfb,0xb8,0xb1,0xf0,0xc7,0xb3,0x0e,0xbd,0xd9,0x3e,},{0x0c,0x29,0x7a,0xbe,0x0f,0xd8,0xeb,0xcc,0x6b,0x77,0x19,0x98,0x75,0x5e,0x2c,0x6b,0xe0,0x7c,0x81,0x2b,0x5a,0x80,0x54,0x49,0x57,0x06,0x31,0x70,0xca,0x69,0x43,0x2e,0x72,0xb6,0x0d,0xaa,0xe3,0x22,0x95,0x8a,0x22,0x38,0xcd,0x6a,0x46,0x28,0x94,0xa3,0x87,0xee,0xf6,0x5b,0xf9,0x6f,0x63,0xf5,0x4c,0x08,0x56,0x87,0xa5,0x02,0x75,0x0e,},"\x3e\x8e\xe7\x0e\x51\xe5\x6e\xf5\x7f\x6e\x66\xb3\xa8\x84\xaa\x04\xa7\xb4\xd4\x59\x9f\xb9\xb4\x39\x96\xb3\x93\xa8\x68\x09\x35\x12\xea\x74\x1a\x0c\x6a\x94\xf4\x0c\xe4\x98\x62\xd2\xfd\x1f\x75\x51\xf4\x64\x7a\xbd\x80\x75\xbc\x1b\x74\x2a\xd4\x0e\x29\xa6\x04\x61\x30\x12\x24\xfe\x8f\x76\x92\xb1\x47\x72\x78\x2b\x4e\x89\x6b\x63\xfe\x05\xab\xd5\xff\x53\x14\xf9\xec\x80\x75\xf2\x8d\x90\x8c\xca\xaa\xce\x5e\x90\x5e\xa7\xf5\x7a\x49\x1b\x99\xb3\x59\x1e\xea\x54\xa6\xb7\x81\x91\x67\x74\x9d\x38\xa0\x47\x62\x06\x76\xa1\xa7\xaf\x11\xf4\x85\xa5\x5b\x7c\x87\x9e\x68\x50\x38\x08\x58\xc8\xf4\x5c\x0c\x1c\xcb\xd7\x40\x6e\xd0\x99\xd8\x4a\x74\x71\xb9\x35\x0c\x4d\xdb\x28\x47\x0b\xf5\xbf\x32\x7d\x5b\x3c\x22\xd8\x99\xb4\xc6\x60\x83\x9e\x10\x4a\x06\x22\xae\x85\xc8\x4a\xa9\xfc\x7f\x0a\x2c\x7c\xeb\x6e\x69\x1c\x49\xc0\x64\xb5\x31\x34\x99\x68\x3e\x8e\x03\xb2\x11\x5e\xda\x7d\xda\xd5\x5a\x49\xf9\xfb\xe6\x25\x44\xf9\x14\x51\x1c\xfb\xec\x6b\x84\xdb\xde\x7e\x80\x90\x9b\x45\xfb\x10\x50\x2e\x2c\xaa\xa7\x21\x24\xfd\x94\x56\xa3\x87\x2f\x95\x92\x70\x7e\x9a\x4c\x50\x12\xda\xa9\x72\xea\xf6\x5f\xab\xe5\x53\xde\xbe\x82\x57\x01\xef\xef\x5c\x75\x6b\xb4\x65\xe9\x66\xab\x68\xdd\x52\xf3\xdd\x00\xa4\x5c\xf6\xdc\x3f\x19\xb8\x6b\xb0\xdb\x4a\x86\xe4\x66\x98\x85\xa0\x74\x69\x6a\x67\xd8\xea\x21\x18\xc7\x66\xef\x62\x5f\x8a\x98\x02\x6f\x9f\x4a\x3c\x5c\xcc\xf9\x84\x6f\xdc\x90\xed\x93\xec\x7c\x1f\x3c\x70\x86\x95\x4f\xa2\xf0\xa4\xca\x96\xd4\x01\x84\xaa\x57\x54\x55\x27\xa1\xf9\x65\xc1\x1d\x84\x3c\x90\xc5\xa5\xe0\x8d\x7c\x11\xf2\xd5\x61\x00\x4e\x90\x57\x48\x52\xeb\x50\x46\xaa\x1e\xa7\xb6\x10\x09\xfd\x5d\xd7\xd6\x24\x2a\x8d\xf5\x8a\x9e\x8e\x55\x5c\x7f\x4c\xdc\x13\x0d\x69\x01\xbf\xe6\x79\x7f\xdc\x6c\x39\xbe\xec\xfb\xba\xb6\x62\x5b\x2e\x4f\xb9\xd8\x00\x02\x76\xd4\xa9\x4f\xc6\xfc\x10\x51\xfe\xff\xf5\xad\xeb\x72\x4b\x87\x09\x0d\xb0\xa2\xc6\x97\xd0\x56\x66\x4d\x99\x1f\xad\x80\xdc\x80\xfa\xb7\x00\xb1\xf1\xf2\xee\x27\x73\x4e\xbc\x26\xb2\xa6\x41\xc3\x2a\x0c\x91\x1b\x27\x0a\xc7\x6b\x0d\xa5\xc0\x89\x14\x97\x1c\x91\x12\x46\x3a\x70\x70\x9c\x0d\xda\xc7\x91\x00\x16\xf9\x13\xf6\x21\x00\x86\xd7\x25\x5c\xef\x11\x95\x57\x10\xf6\x51\x88\x9c\x83\x62\x1d\xd8\xa4\xfc\xd5\x36\x63\x02\xd6\xc9\xb5\x6e\xef\xcf\xac\x85\xc1\x4a\x94\x78\xb6\xd7\x18\x07\x54\x28\x80\x07\x60\x51\x5c\xab\x5f\x3d\x44\x55\xe2\xb9\x70\xdf\x9f\xe4\xbe\x83\x83\xd7\x04\x83\xbb\xdd\x75\x60\x71\xf5\x3b\x2f\x9c\x27\x5c\x7c\x85\x12\xd1\x63\x51\x8f\xe5\x55\x83\x75\x14\xc8\x67\x76\xc9\x47\xf2\x9a\x77\x57\x02\x87\x44\x6b\x69\xbe\x40\xc8\xd4\xab\xbd\x65\xef\x25\x07\x24\x9b\x5a\xec\x33\xac\xb7\xb8\xbd\x3f\x35\xbc\x85\x9b\xa4\xe3\x7b\xdb\x49\xcf\x91\x3d\x93\x98\x9c\x44\x38\xd2\xab\xcf\xa3\x88\xcc\x89\xd7\x8a\xc0\x62\x70\x65\x64\x92\xe7\x52\x8f\x29\xbd\xfe\x8c\xbb\x9b\xfa\x9e\x73\xc1\xda\x01\x3f\xc3\xce\x21\x05\x65\x76\x13\xff\x62\xbb\x0c\x3b\xf4\xde\xe3\xb0\xd2\x65\x9c\x72\x6e\x7b\xcd\x9e\x97\xec\xce\x92\x47\xd4\x60\x0d\xfe\xaf\x60\x44\x4e\xd8\x62\xb0\x0b\xa1\x1e\x70\xea\x88\xd4\xf0\xb6\xb5\x39\xfc\x9f\x36\xbb\x2a\x1a\x9e\xd2\xb3"}, +{{0xe9,0xd4,0x86,0xc2,0x9a,0xe8,0x11,0xb9,0x42,0xe1,0x0d,0x81,0xf0,0xa6,0x71,0x63,0x17,0xb8,0x42,0xc2,0xc5,0xbf,0xde,0xf5,0x5c,0xc4,0x32,0xb7,0xfc,0xae,0xb8,0x18,},{0x43,0xa5,0x2d,0x15,0xb9,0xf7,0x31,0xd7,0x37,0xb1,0xc4,0xdb,0xc3,0x22,0x27,0xa4,0x80,0x96,0x30,0x91,0xd2,0xc6,0x28,0x6f,0x48,0x2e,0xf1,0xe8,0x36,0x70,0x54,0xe5,},{0x65,0x19,0x1a,0xa8,0x85,0xdd,0xab,0x9f,0x67,0x27,0x18,0x79,0x95,0x2f,0xc6,0xaf,0xfe,0x41,0xca,0x20,0xeb,0x3b,0xcd,0x86,0x67,0x31,0x61,0xb0,0x3b,0x53,0x26,0x94,0xd6,0xdd,0x88,0x90,0x8e,0xb1,0xb1,0xee,0xc0,0x03,0xcf,0xcb,0xe6,0x14,0x6b,0x45,0x38,0xe2,0x1d,0xf5,0x59,0x69,0x91,0x2a,0x0d,0x7d,0x88,0x18,0xad,0x79,0x59,0x0d,},"\x14\xfe\x1e\xd5\xbb\xbd\x76\xcc\x73\xdc\x56\x50\xbd\xa9\x2d\xe8\x63\x26\xe2\x4d\x2f\x1f\x62\x24\xba\x85\x68\x94\x4d\x6f\xe3\x44\x26\x75\xdb\x96\xf1\xd8\x49\x8f\x16\x34\xff\x9b\x6e\x50\xcb\xa9\xdb\x4e\xb0\xb0\xb0\x21\xb2\xbe\xcf\xce\x4b\xef\x33\xc4\xce\x0e\x32\xc8\xa9\x83\x89\xec\xa9\xe0\x59\xa6\x62\xd6\xf0\x37\xc5\x4a\xa4\x0c\x76\xcd\xee\xe8\x56\x50\xf0\x89\xea\x56\xe1\x38\x3a\xb0\xf5\xc3\x6f\x6d\x66\x45\xff\x7e\x87\x66\x73\x01\xf9\x44\xfd\xc2\xed\x35\xb0\xd2\xc3\x5c\xb2\xe4\xb4\x56\x36\xe7\x49\x8e\x92\x7f\x58\x46\xb3\xe1\xed\xfb\xd1\x60\xa4\xae\xf3\x32\x0c\x34\x28\x49\x6b\xda\xaf\x7d\x3e\xd5\x6e\xf0\xb7\x25\x4a\xc5\x97\xbe\x58\x9a\x70\x58\x44\x16\x30\x0c\x1a\xdc\xfb\xa4\xf2\x2c\xfd\x4c\xd6\x61\xe1\xf5\x0f\x15\x5d\x17\x2f\xa5\x74\x8d\x29\x6b\x29\xcd\xd7\xeb\x81\x21\x48\x3f\xf1\xd9\xfe\x95\x3f\x94\x51\xc7\xc7\xa5\x42\x00\x72\x85\xee\x72\x46\xbc\x0f\xde\xa9\x38\x81\x40\x29\xab\xce\x05\x7a\x0e\xcb\x97\x4b\x12\xd3\x60\xea\xb6\xaf\xd3\x07\x97\xd6\x14\x45\xad\x2b\xac\x7e\x52\xbc\xe4\x34\x63\x15\xf7\x8e\xb8\x75\x42\xd5\x95\x28\xb2\xf6\xc5\x6d\x66\x24\x1c\xb4\x42\x03\x3f\x64\x3d\x3d\x2a\x67\xcb\x63\x7d\x8d\xa9\x5d\x4f\xd1\x23\x4b\x03\x1a\x3e\x51\x72\x3a\x1d\x26\xe6\xf5\xca\x07\x98\x73\x21\xad\x11\xa9\x0f\xcc\x1d\x4e\x2b\x0b\x89\x66\x50\xc3\xa7\x51\x8d\x56\x55\x29\xbe\xa8\x06\xa0\x5d\x44\x7e\x08\xd2\xa6\xa3\xdb\xf1\xa3\x69\x15\xb2\x95\x7c\xa5\xb4\x0e\x58\xb9\x7a\xd0\x36\x97\x35\xc4\x28\xbd\x6d\x69\xbd\x21\x00\x44\xb6\x51\x41\x8d\x98\xb0\x59\xd9\x0c\x83\xe4\x60\x11\xf4\x1c\x03\x2c\x56\x55\xa5\xef\x21\xac\x2c\x8c\x2b\xc9\x4b\xe0\x7e\x45\x42\x6a\x7a\xe5\xd4\x7b\x45\xf2\x7c\xf4\x28\x9c\xa4\xdd\xab\xe0\x8a\x12\xb9\x10\x20\x7d\xab\xb3\x4a\x46\xab\x75\xce\x69\xb5\x8e\x7e\x17\x66\x4b\xf3\x35\x9a\x8f\xb6\x8e\xb0\x32\xc9\xea\xa6\xdf\x87\x38\x29\xf0\xe0\x84\x85\x53\xf7\x32\xe1\xc3\xc0\x84\xb3\x2b\x7a\xf7\x50\x74\xe7\xbb\xaa\x4e\xb5\xd7\xea\xd7\xaf\xf9\x75\x80\x10\x9b\x60\xf4\xc7\x92\xf9\xe2\xa6\x51\x37\xb0\xaa\x48\x17\x5b\x81\x15\xd9\x13\x05\xf4\xc7\x7e\x2d\x08\xe7\xe8\xd7\xe7\x78\x5c\x96\x68\x42\xc2\xe3\x50\xfe\xd4\xf9\xe3\x3b\xf6\xe1\x84\xc5\x50\xb4\xb0\x6e\x95\x74\x14\xed\xf5\x2f\xa0\x79\xe8\x19\x73\x45\x84\x61\xfb\xb9\xb7\xd7\xd3\x4b\xef\x15\x03\x57\xf4\x32\xca\xac\x3a\xe9\xf3\xdc\x96\xeb\x5a\x2d\x12\x3e\x09\xed\xa1\x70\x2e\x1d\x10\x70\x17\x7b\xb2\x20\xc4\x23\xc0\x96\xec\x24\x42\x43\x85\xc6\x79\xbe\x02\xef\x84\xd0\x9e\xd1\x02\xf4\x9c\xad\x3b\x1f\xd6\x70\x67\x9a\x39\x71\x4f\xf1\xd6\xe4\x22\x8d\x8d\x7d\x0e\x19\xed\x0e\xba\x13\x2f\x21\x28\xd4\x7b\xaa\x56\x9a\x8e\xcb\x7b\xd4\x8a\x82\x62\x82\xf9\xcf\xcb\xf6\x0d\xde\xce\xaf\x1d\x02\x13\x2c\x8a\xff\xed\x3a\x03\xd2\x34\x0d\xeb\x78\x7c\xd6\x49\xc5\x1c\x6e\xcb\x9f\xf7\x5d\x7a\x7b\x4e\xf9\xb1\x51\x39\xcf\xea\x27\x62\xab\x18\x61\x51\x97\xa6\xb5\x1f\x6e\x75\xdb\xd0\x45\x73\xa2\x44\x80\x94\xd0\xcd\xeb\x0f\xe4\x58\x58\x83\xff\x9b\x68\x82\x4a\x04\xb8\x3e\xc9\x1c\xf8\x4a\xcd\x6a\x74\x46\xcb\x1f\x5e\xe3\x7d\x5d\xf8\x0f\x17\xcb\x2b\xdc\x3f\x31\x22\xa8\xfa\xf7\x6e\xbd\x06\xcf\xe8\x17"}, +{{0xe6,0xfa,0x10,0xdb,0xb4,0x78,0xe1,0xe3,0x6b,0x35,0xdf,0xeb,0x02,0x50,0xf6,0x3c,0x08,0x51,0x50,0x70,0xae,0x79,0xb2,0x2f,0x04,0x7e,0x27,0x17,0x08,0xd6,0x4f,0x5c,},{0xe0,0x2e,0x1f,0x2b,0xd8,0x79,0x2e,0xf4,0x83,0x48,0x1c,0x6d,0x11,0xf7,0xc7,0xc9,0xdb,0xde,0xec,0xc9,0x85,0x94,0x32,0xe7,0xf2,0x79,0xe9,0xd1,0x73,0xd3,0x11,0x64,},{0xc0,0x3c,0x47,0x03,0x59,0x12,0x7e,0x9d,0xe3,0xaf,0x0e,0x0e,0xd7,0xd3,0xb1,0x9f,0xae,0xe0,0xec,0x14,0x0b,0x79,0xc2,0x99,0xe2,0xcb,0x6d,0xac,0x0a,0x3e,0x7e,0x31,0x41,0x41,0xcc,0x85,0x4b,0x45,0x96,0xce,0x4c,0x51,0xc7,0xb0,0xde,0xc8,0xa5,0xc8,0xcf,0x09,0x36,0x20,0x53,0x61,0xd5,0x36,0x5f,0x4b,0xcc,0x07,0xc4,0x28,0x7c,0x07,},"\xad\x31\x60\x75\x8d\x8c\x08\xa6\x61\x52\x5c\x95\x28\x0a\x37\x18\x87\x49\x69\x85\x9f\x1c\xc9\x18\xe3\x4f\xec\x00\x8a\xcf\x23\xb8\x89\x6e\x8d\x50\xc3\xc0\x51\x23\x31\xdc\x89\x78\x0f\x8b\x10\xfc\x34\x9c\x67\x5c\x4c\xd8\x2a\x5d\xf8\x58\x6b\x43\xc8\x64\x44\x8f\xac\x00\xb8\x47\xb9\xc9\x80\x54\xab\x79\x3f\x63\xc7\x1a\xa5\xe5\x24\x8e\x22\xd0\x69\xbd\x3f\x85\x2a\x3b\x8c\x6e\x2a\xc8\xef\x86\x1d\x90\xbc\xd9\x84\xbf\xca\x87\x58\x3e\x59\xe9\xa7\x46\x8f\x29\xb8\x08\xdc\x2f\xe5\x30\x2a\x98\x9d\x6f\x2e\xcd\xe7\x58\x5c\xd9\xbe\x4e\x4c\x76\x1c\x4d\x4b\x3e\xea\xf4\x69\x9f\x65\x56\xef\x03\x9a\xf2\xb8\x0f\x94\x07\x60\x5a\xc3\x97\x35\x1d\xd8\x55\x95\x58\x44\x95\xba\xa1\x77\xb0\x8c\x88\xd2\xec\x1f\xc4\xe3\x2d\x1c\x0b\x8d\x7e\x7a\xc5\x83\x9d\xfb\x92\x3f\x09\xb3\x23\xe7\x8e\xce\xb7\xe9\x6c\x06\x04\xb0\x1a\x19\xe4\x9c\x9b\xea\xf4\xf2\x5e\xc4\xa8\x4c\x1a\x08\xf2\x38\x0e\xdd\xc3\xa7\xf0\x12\x18\x49\x59\xcc\xd1\x9e\xcb\xba\xc6\x5e\xac\xa1\x55\xce\xe9\xec\xfe\xc1\x1e\x7f\xee\x05\x8e\x17\x4f\xc4\xed\x7c\x67\x9f\x2c\x15\x63\x1d\x4e\x15\x27\xbc\xdb\x0e\x3b\xb0\x81\x5f\xfd\xff\xc0\xc8\x56\xbe\xf0\xdc\x0f\x5c\x82\x37\xf7\x09\x8e\x26\xbd\xb6\x9e\x87\x82\xd1\xca\x51\x11\xec\x3c\x7e\xdb\x42\x5d\xff\x80\x32\x02\x6c\xba\x3d\x2e\x08\x1b\x71\x31\x0d\xb9\xba\xda\xd1\xad\x02\xf1\xec\xcc\x53\x7d\x87\x4c\xd1\x8c\x6b\xb0\x12\x21\xf7\x1e\xe6\x62\x50\xd9\x4c\xf8\xec\xce\xaa\x96\xd3\xc5\x7e\xea\x2b\x0a\x8e\xc7\x24\x29\xd7\x60\x64\x88\xbd\xf1\x9e\xc3\xbb\x16\xe5\x08\x67\xc7\x93\x7d\xef\x09\xfc\x78\x3f\x20\xa2\xa5\xec\x99\x25\x3d\x6b\x24\x0d\xf4\x67\x7d\xd2\xd5\x27\x7b\x01\xc5\xb8\xe5\xbd\x6c\x7d\xf0\x87\x42\x05\xbc\x8c\x2f\xff\xdb\xa1\x31\x46\x74\xd3\x1c\x9b\x2c\x91\x99\x22\x8e\x19\xe0\x42\x18\x34\xc1\x65\x7d\x06\x98\x28\x69\x16\xc7\xe3\x92\xf0\xab\xd5\x54\x5b\x96\x3a\xc1\xff\xa9\x97\x21\x61\x6c\x23\x79\x6f\x85\xc3\x4a\x5c\x66\x4a\xe8\x1d\x16\xb2\x16\xa5\xb0\xcf\x5b\xc6\xb5\xa9\x08\x29\x72\x85\xd6\x16\x44\x12\x8f\x88\x6f\x38\xaf\x9e\xdd\x25\x19\x3d\x7e\xcc\x77\xa7\x99\x94\x27\x8d\xa0\x71\xf5\x44\x95\x93\x7f\xee\xf5\xa5\x19\x57\x52\x7c\x3e\xec\x7c\xb0\xb4\xe8\xaa\x7a\x4e\x85\x6d\xef\xd5\x7d\xd9\x23\x34\x15\x1b\x98\x6a\xa6\x9c\xa6\x92\x60\xd1\xe2\xd7\xb5\x3c\x05\x67\x7e\xe0\xd2\x16\xb2\x8d\x03\x62\x52\xdd\x30\x06\xde\xbe\x1b\x65\x74\xa2\x5e\x6b\x19\xdf\xb4\x8f\xa6\x43\x16\xaf\x8f\xd6\x8d\x78\x93\xb3\x97\xe7\xdb\x57\x80\xab\x27\xbf\x87\x26\xff\xf6\x05\xd3\xb4\x6d\x80\x05\x95\xb4\x62\x4b\xee\x30\x2c\x96\x43\x26\x03\x4b\x52\x34\xd1\x75\xdf\xdc\xc2\xce\x88\x2e\x65\xb3\xd9\x3a\x04\x38\xf6\x92\xe9\x69\x5d\xe1\xf2\x4c\x70\xa7\x9b\xee\xd2\x54\x15\xec\x5a\xae\xcf\x33\x91\x95\x3b\x2f\xfd\x45\x3a\x8f\x04\x67\x56\x1a\x4a\x47\xee\x14\x4a\x43\xfd\xff\x83\xdf\x2b\xea\x5f\x66\xa7\x22\xb5\x2a\xbe\x86\x13\xf2\x0c\x59\x4a\xf0\x98\x2e\xb3\xf0\x45\x05\xa5\x24\x61\xdd\x03\x4d\xa8\x6c\x36\xca\x16\x21\x77\x05\xc0\x48\x23\x91\x1d\x72\xa2\x47\x69\x51\x76\x33\x56\x28\x86\xf2\x50\xf2\xcf\x78\x8b\x8f\x32\x86\x4a\x94\x74\xf5\x7e\x62\xe5\x7d\xe8\xfd\xaf\x95\x9a\x6b\x72\x28\x74\x40\xa8"}, +{{0x05,0x8e,0x36,0x80,0xb8,0xfc,0xc0,0xaa,0x14,0x90,0x08,0x9c,0x11,0x24,0x67,0x7f,0x98,0xd7,0x4b,0x1b,0xfb,0x71,0xee,0x86,0x63,0xf0,0x25,0xf0,0xd9,0x46,0xcd,0x20,},{0xec,0x72,0xce,0x0e,0x82,0xc6,0xa3,0xb2,0x12,0x43,0xd2,0xf0,0x0e,0x9e,0x88,0x3a,0xdb,0xc5,0xcb,0x63,0xb3,0xd9,0x36,0xef,0xa5,0x0c,0x07,0xcb,0x92,0x91,0x48,0xe2,},{0x57,0x34,0xec,0x50,0xa7,0xf8,0x2e,0x48,0x53,0x6b,0xdc,0x43,0x70,0xcf,0xef,0x2e,0x15,0x0a,0x63,0x1d,0xab,0xaf,0x89,0xed,0xcf,0x0f,0xda,0xbe,0x4f,0x58,0x39,0xf4,0xf5,0xfb,0xd8,0xdf,0x8e,0xc4,0xa3,0xac,0xd4,0x0a,0x8b,0xfb,0x96,0x3d,0x18,0x55,0xff,0x92,0x74,0xdb,0xc3,0x31,0x65,0xb5,0xe6,0xd3,0x7a,0x23,0x9d,0xac,0xe9,0x03,},"\xe6\x3d\x14\xf5\xbe\xa7\xa1\xab\xb8\xfe\xe6\x97\x74\x6c\x22\x80\xdf\xd0\x62\x2d\xe7\x35\x72\x26\xcc\x07\x42\x72\x2a\x32\x29\xbe\x12\x6b\x08\x3e\x86\x8a\xea\xf0\x7d\x2f\xc9\x7a\xdc\x33\x42\x70\x96\x74\x19\x3c\xa2\x81\x74\x4e\x85\x0e\xa1\x54\x40\x05\x0a\xec\x93\x0e\x45\xd7\xa8\x7b\x8a\xc8\x01\x5c\x89\x67\xc2\x00\x33\xa5\x32\xd2\x95\x91\xb1\x35\x58\x6c\xe0\xfd\xd2\xe6\x68\xb5\xc8\x64\xb3\xbd\xe7\x0c\x7e\x71\x9a\xd2\x41\x93\x12\x51\x86\x19\x33\xff\xbf\xa9\x64\x83\xff\x82\x85\x67\x48\xc5\x6d\xc2\x6e\x25\x7d\x69\x2e\x51\x34\xd8\x2f\xc7\x19\x1c\x11\x0d\x95\x90\xd3\xfc\x75\x1c\xd6\x36\xb0\xc4\x6f\x44\xf8\x80\x3e\x59\xe2\xf9\x3f\xa0\xcb\xe2\x47\xa1\xa6\x25\xb4\xbc\x2c\x7b\x1f\xdc\xeb\x5a\x2b\x22\x59\x1f\xa6\x13\x7c\x54\x04\xdf\xec\x6a\x69\x63\x9e\x3f\x63\x2b\x59\x76\xab\x9f\xe1\xc6\x3a\xa3\xda\x9d\x52\xb0\x44\x00\x8f\x3a\xe4\x4b\x7c\x36\x4f\x08\x56\x64\x32\x3a\x88\xeb\x45\x83\xe8\x71\x40\xf7\x63\x78\x2b\xff\x88\x19\xcf\x74\x1a\x87\x5d\x50\x6c\x92\x9d\x34\xbb\xd4\x30\x07\xde\x4b\x18\xf6\x87\xa7\x58\x11\x11\x28\xb1\xdb\x86\xfc\x5a\xd2\xfb\x9f\xca\xd1\x2c\x9d\xd2\x8f\xee\x5a\xd1\x0d\xe0\x73\x9f\x8e\xfd\x9b\xff\x66\xf8\x40\xb1\x1b\x3f\x91\xc5\xe0\x7c\x21\x45\x2c\xab\x24\x24\x2b\x6e\x32\x16\x5c\xd1\xe6\x95\x72\xbf\x21\x6e\x86\x04\x53\xda\xd2\xfd\x12\x9c\x33\x37\x58\x58\x0b\xb7\xd0\xf1\x95\x09\x74\x5e\x85\x14\x63\xd1\x27\xa5\xf9\xbe\x21\xfe\x54\x9c\xae\x55\xd5\x6b\x8b\xea\x80\xbf\xaf\xda\xc1\x0a\xcd\x83\x8e\xa8\xaf\x31\xc0\x07\xdc\x32\xbf\xd7\x40\x82\xd9\x11\x0a\x3e\x91\xe6\x1e\x03\x57\x58\x7e\x4e\xd3\x28\x27\xad\xe9\xb6\x91\x0a\x98\x8c\x1d\x3b\x2d\xd2\x2c\x0e\xe7\x6e\xf3\x5f\xe1\x5e\x09\x94\x04\xa4\x5d\x4b\x2a\xca\xb9\x12\x3e\xcc\x45\x55\x0a\x40\xfa\xf8\x33\x6b\x46\xc6\x30\xa9\x08\x03\x58\xff\x8b\x8e\x58\xaf\x0b\xcc\xbd\x35\x01\x0c\x1e\xcc\x12\x81\x66\x55\xa5\xec\xeb\xa9\x5a\xd3\xf5\x03\xa1\x8e\xc5\xbe\xce\x3a\x33\xf4\x69\xdf\xe9\x17\xe1\xc5\x5e\xf1\xd8\x1e\x5a\x75\x56\x1e\x6b\xbd\x99\xc6\x53\xa6\xd0\x95\xb9\xf3\x87\x91\x1e\x40\x33\x2f\x62\x16\xf9\x56\xa3\x5c\xf7\xd9\x9a\x9f\xdd\x0c\x44\xc5\x1e\x90\xa5\x64\xf1\xc3\x6b\xf3\xd4\x0a\x7f\xaf\x4b\xa2\x8b\x1a\x12\x0b\x32\x05\xfb\xac\x1a\x98\x56\x92\x90\xbe\x37\xc5\x8b\xbd\x74\x5c\xe0\xfb\x74\x83\x52\x70\xab\xa2\x25\x2a\xda\xec\x15\x7d\xc4\x24\x61\x22\x1a\x2c\xff\x68\x7b\x9e\x65\xce\xb5\x7c\x2d\x77\x70\x0a\xea\x63\x20\x48\x6c\x5b\x1b\xec\x9c\xc5\x3e\x7e\xf9\xe4\x8f\xcd\x1b\x77\x83\xac\xbe\x75\xa6\xbe\x02\x67\x27\x88\x12\xdb\xf3\xd2\x57\x6c\xf7\xad\x39\x11\x27\x1a\xce\xbe\x0f\x2c\x04\x60\x2a\x08\x0c\x8b\x96\xc1\x20\xfd\x86\xfd\xa2\x82\xaa\x4e\x1c\x13\x1f\xe9\x7c\x90\x7c\x15\x85\x5f\x87\x75\x5f\x51\x1c\x03\x7b\xef\xad\x0f\x56\xb3\x9f\x32\xa2\x13\x3a\x22\xf3\xd5\xa9\xbe\xc3\x44\x3f\x29\xa6\x94\xe9\x7f\xe0\x5e\x10\xfb\x8e\xf9\x99\x13\x02\xb9\xe0\xd8\x4d\x92\x9a\x19\xeb\x03\x47\x1f\x3a\x86\x13\xd3\x93\x68\xe1\x58\x83\xa7\xe4\x97\x0b\x53\xcb\xaf\x29\x29\xd8\xde\x43\x1b\x48\xb4\x35\xd7\x53\x3c\xaa\x2e\x36\xce\xab\x6c\xdd\xb3\x46\xe5\x35\xe5\x15\xc4\xb3\xdb\x76\xde\x07\xd9\x85\x54\x14"}, +{{0x51,0xba,0x3a,0x4f,0x3d,0x85,0xd1,0x54,0x8c,0x2f,0x24,0x94,0xa3,0x51,0x1f,0x3b,0x95,0x15,0x66,0x3d,0x7e,0x85,0x37,0x0f,0xb6,0x15,0x02,0x37,0xe9,0xbc,0x98,0x0b,},{0x77,0x49,0xde,0x02,0x10,0xbc,0xe0,0x6d,0x48,0xf5,0x9b,0x95,0xae,0xb1,0x52,0x8f,0xd9,0xb4,0xe5,0x2c,0xdd,0xe2,0x2f,0xb8,0x19,0x3b,0xed,0xd5,0xdf,0x12,0x81,0x7c,},{0x16,0xfb,0x29,0x0c,0x91,0x3b,0x20,0xeb,0x1c,0x3d,0x7b,0x79,0x82,0x49,0xeb,0x84,0x59,0xd4,0xbe,0xe8,0x12,0x5d,0xb2,0xb3,0xf1,0xda,0xab,0x8a,0xf9,0xd9,0xa7,0x00,0xed,0x79,0x8a,0xdd,0xd8,0x02,0xdf,0xcd,0x29,0x7a,0x41,0x25,0x93,0xcd,0xa7,0xbe,0x99,0x79,0xa1,0xf0,0x93,0x50,0xe8,0x6f,0x69,0x8a,0xc3,0x38,0x0e,0x34,0x1d,0x07,},"\xd1\x8d\x0c\xbf\xc1\x6d\x0f\x9b\x67\xf2\x53\x9a\xd6\x20\x7c\xd9\x21\x7a\xd5\xed\x03\x33\xcd\xdb\x10\x41\xe0\xac\x2b\xdd\x92\x02\x76\x62\x96\x52\xb4\x9c\xbc\x98\x02\x59\x3e\xc3\x64\xea\x79\x5a\xbc\xd1\x58\x20\x85\xf5\x5b\xc6\x6c\x48\xfd\x3e\xed\xe6\x18\xd6\x36\x96\x17\x10\x0e\xae\xcc\xc1\x5f\x24\x9d\x6e\xee\x5b\xb2\xc4\x3c\x01\xb0\x62\x3f\xe6\x03\xce\xee\xe4\x9b\x40\xfb\x7c\x53\xfc\x68\x47\x36\x73\xc0\x9b\x1a\xc7\x7e\xa9\xbe\xb7\xe8\x53\x03\x79\xa8\x6d\x69\xec\xd1\xff\x11\x81\x3f\xbb\x88\xf6\x92\xf0\x5e\xf1\x32\x07\x42\xb4\xfe\x7e\x06\xd5\xba\x71\x65\x66\x46\xcd\x75\x00\xde\x19\xbb\x93\xd8\x44\x53\x66\x03\xf4\x0b\xd4\xae\xea\xf0\xc4\xdb\xc0\xac\xfd\x20\x2b\x28\x6b\x64\xaf\xb8\x3d\x4a\x37\x8d\xd4\x5e\xe3\xc1\xdf\x6b\x3e\xf1\x6b\x8b\x1a\xcc\xbc\x04\x06\x32\x50\xec\x47\xb8\x6a\xe5\xa7\x1d\x1d\xab\x38\xb5\xeb\x80\xd6\x63\xfa\xa7\x88\xf8\xb5\x9a\x75\x4c\x0f\x9c\x9f\x6d\x90\x62\x52\xaf\x46\xab\x1f\xff\xed\x27\x6d\x23\x88\xdb\xe7\x0d\x96\xba\x67\x47\xd1\xfe\xd4\xfc\x0b\x55\x29\x3d\x5f\x78\x7b\xda\x0c\x0d\xf4\x6a\x73\xf4\xaa\x7d\x29\xe1\xc9\xcc\x85\xcd\x04\x3e\x3d\xff\xe0\x57\x46\x2c\xa5\xfe\x5c\x64\x70\xe7\x39\x27\x6f\x8b\x53\x4c\x01\x72\xe4\x60\xf3\x40\x48\x7a\x56\x94\x68\xaa\x58\x90\xcc\x14\xf2\x0d\x67\xd7\x9c\x66\x1e\x87\xfe\xba\xc6\x27\x59\x71\xc3\x73\x08\x07\xeb\xf1\x75\xe0\xde\x10\x49\xbe\xe6\x7c\x89\x5e\x57\xb7\x1a\xb8\xa2\xf3\xcf\x36\x41\xfd\x54\x8d\x09\x41\x4f\x5f\xc3\x02\x6a\x0a\x35\xf6\xba\x95\x16\x73\x94\x49\x41\xcb\x23\x6f\x3d\x19\x76\xdc\x69\x07\x7d\x95\x14\x50\xe7\x66\x03\x16\x98\x8f\x6f\x2a\x6f\xbb\xff\x3b\x37\xce\xaa\x02\xfd\x6f\x02\x73\xbd\x80\x31\x85\xa1\x09\x03\x9c\x63\xf2\x51\x9b\x98\x3d\xaf\x65\x54\x25\x3b\xed\x54\x97\xc0\xb0\xbd\xaa\x0b\xd4\xa1\xfa\xc9\x00\x26\xad\xe3\xe4\x0c\x55\x4c\xff\x2c\xcb\x36\x99\x0e\x71\x55\x67\x08\xc5\xc4\x03\x92\x56\xff\xc7\x33\x7e\x5f\xea\x11\xf5\xe9\x0d\x3e\x4d\x93\x35\x91\x79\x11\x6a\x85\xc2\x41\x36\xca\x34\x83\x5c\xd3\x40\x12\xe4\xd7\xdd\xc7\xb7\x21\xc2\x46\xc7\x37\x00\xe2\x76\xdc\x2f\xf9\xf2\x77\x0b\x43\xc8\xe8\x0a\x17\xf0\x1d\x32\x68\x0b\xae\x22\x8e\x64\x23\xa8\x80\xc3\xfb\x99\x6a\xb8\xd2\x21\xbc\x62\x74\xac\x5f\xa7\x70\xd2\x05\xfc\x87\x8f\xba\x9b\xbd\x77\x6a\x3d\x79\xed\x77\x04\x89\x50\xf3\x6d\xc0\xaa\x3c\xcd\x28\xe4\x75\x6a\x99\x19\x04\xae\x05\x1b\x8a\x4b\x7d\xe3\xa1\xf2\xad\x0f\xb4\x5a\x33\xd0\xc6\x82\x25\x84\x1f\x8e\xb6\x5b\x6a\x16\xe9\x5f\x89\x35\x91\xe1\xaa\x73\xa6\x4f\x0d\x2e\xe9\x38\xab\x69\xad\xcc\x8c\x59\x51\x8b\xec\x50\x1c\x39\xf1\x39\x17\x4b\xbb\x00\x69\x9e\x1a\x0f\x0e\x0d\x88\x9a\xae\x54\x3a\x55\xe6\xac\x56\xd5\x20\x4c\x1a\xde\x1f\x27\xd8\x2a\x6a\x95\xe1\x4b\x2d\x69\x09\xdd\xa7\xbf\xaa\x7f\x48\x7f\xb6\x19\x59\x01\x4b\x78\x79\x5c\xb4\x63\x9f\x09\xf0\xd3\x29\xfe\xb3\x5c\xcf\x52\xed\xc2\xdb\x72\x19\x14\xe4\x23\x30\x68\x89\xa4\x83\xfe\xe8\x76\x36\x0e\xe3\x26\x33\x53\x19\x07\x0c\x56\x4f\x3a\x8b\x95\x3f\x52\xf4\x15\x13\xa2\x26\x08\x83\xc3\x8d\xd9\x78\xa2\x48\x60\x4a\x41\xbd\x4b\xfc\x9e\x84\x18\x4d\xc9\xe8\x4d\x25\x89\xf4\xaf\xff\x84\x17\x82\x4c\xe5\xad\xba"}, +{{0x7d,0xde,0xc5,0x26,0xa4,0x97,0x1d,0x89,0x12,0xa6,0xbd,0x43,0xc6,0x9f,0x92,0xed,0x86,0x44,0x2b,0x15,0xf4,0x2f,0xba,0xbb,0xf2,0xd1,0x7e,0xff,0x98,0x99,0x31,0x61,},{0x0d,0xfe,0xff,0xb2,0x76,0x23,0x09,0xb4,0x73,0x4e,0x4c,0xe2,0x52,0x3c,0xf1,0x86,0x31,0x49,0xf7,0xe1,0x9a,0x7c,0x14,0x7e,0xc0,0x89,0x9e,0x11,0x0c,0xa9,0xd8,0x7d,},{0x9e,0x60,0x3b,0x01,0x5f,0x42,0x87,0x1b,0x78,0xeb,0x27,0x52,0x3f,0xbb,0x7c,0xe9,0x62,0xfc,0xa3,0x2a,0xe2,0x70,0xe8,0xe1,0x2d,0xca,0xdd,0x25,0xaa,0x85,0x2b,0x89,0x1f,0x6f,0xef,0x77,0xb5,0x9a,0x54,0x6c,0x9a,0x7a,0x7c,0xac,0xb5,0x5e,0x1d,0x32,0xad,0xc8,0x05,0xae,0x5f,0x61,0xa6,0x9e,0x67,0x64,0xc7,0xc0,0x82,0x92,0xeb,0x03,},"\xe8\x77\x4a\x45\xd4\xd8\xf8\x6d\xda\x5c\x08\x80\x2b\xa2\x47\x2e\xf3\xc8\xd3\x6c\x7f\x38\x3a\xc0\x46\x12\xa4\x64\x38\x2e\x9d\x6c\x07\xd8\xd3\x58\x22\xc5\x3f\x43\x88\xf5\x15\x36\x14\xfe\xfa\xf4\x63\x74\x74\x7b\x9d\x4f\xd4\x46\xa8\x64\x76\x9a\x4c\xad\xe8\x43\xc1\xea\xb8\x57\x43\x19\x11\x2f\x01\x79\xd2\xea\x9e\x3c\x19\x5d\xc0\x68\xf0\x69\x74\x62\xb9\xe0\x7c\x87\x94\x87\x0f\x8f\xb8\xff\xc0\x81\xe4\x58\x6a\xfb\xcd\xba\x7a\x4f\x59\x25\xe9\xfd\x9e\xc9\x42\xd8\x43\x47\x33\xc2\xdd\xd5\xe2\x9b\xbd\xfc\x73\x42\xb9\x28\x68\x71\x9b\x54\x40\x88\xa4\x8e\xba\x4c\x82\xf1\x87\xdd\xca\x8f\x47\x46\x25\xa7\x1c\xf6\xb7\xaa\x5f\x08\x1c\x74\xf7\x40\x8f\x53\xb7\x81\x63\x6e\x7e\x9d\x29\xb0\x7f\xdb\x6d\x9c\x35\xe5\xeb\x38\x2d\xb7\xa3\x1a\x8b\xa5\x16\x91\x5d\xf8\xde\xe9\xe1\xad\x3f\x18\x28\x43\x68\x3e\x8d\x1d\xc5\xd8\x66\x9d\xbf\xcf\x09\x54\x1a\x43\xc0\xa0\x46\x13\x38\x1a\x5b\x5e\x4e\x71\xb2\x3c\x5a\xd0\x9b\x8e\xaa\x51\xcb\x93\x8d\x0c\x75\x2c\xc3\xd3\xa1\x0f\x10\xb4\x2b\xe8\xee\x7f\x6b\xda\xc8\x07\x85\x68\x43\x49\x46\xbb\xf5\x6d\xa7\x0e\x7d\x54\x15\x7a\x6e\xfd\x48\x46\xeb\x15\x52\x78\xc9\x4c\x38\x88\x65\x8a\x7a\x2f\x8e\xa3\xba\xc1\x47\xaa\x89\x16\x92\xae\x8b\x23\xf1\xaf\xe7\x1e\xcf\xde\xca\xa6\xc1\x13\xb5\xca\xaa\xa1\x93\x98\xc7\xdf\xe7\x3f\xac\xb4\x15\x5f\xd6\xba\xc1\x8d\x5d\xf2\x12\x9e\x8b\x29\x07\xec\xee\x15\x1b\xdd\x14\x7a\x7c\x3e\x46\xea\x72\x75\x4d\xe3\x2c\xeb\x06\x6d\x9d\xb1\xc2\x6e\x80\xdf\x36\x31\x29\x2b\x16\x17\x4c\xfa\x6f\x1d\x9c\x08\x28\xb8\x49\xc2\x2d\x29\x65\x1a\x73\xe9\x10\xd9\x27\x58\x77\xf4\x64\xce\x93\x26\xc6\xe4\xed\x6b\x07\xdc\xb3\xa3\x53\x63\xc1\xaa\x64\x72\xe0\x2c\x5c\xd8\x55\xe3\x8a\xab\xe9\x65\xac\xe9\xf3\xf5\xa4\xf5\xde\x03\x00\x86\x94\xcb\x90\xaf\xe4\x16\xc9\xd4\x86\x88\xde\x7f\x75\xcf\xe2\x43\xff\x7f\x41\xe0\x59\x31\x09\x34\x90\x3d\xb5\x68\x84\x45\x08\x26\x2c\x89\x9d\xfa\x75\x0c\xd6\xa2\x82\x98\x24\xba\x02\x7a\xea\x1b\x6d\x01\x77\x72\x6a\x34\x3a\xdd\x4e\xcd\xc5\xf7\xe6\xe9\x09\xab\x7d\xe6\x15\xef\x28\x07\xf9\xe7\xd7\x1c\xe2\xf7\x8a\xcf\xf5\x7e\xba\x79\xc3\xf5\xe0\x7c\x8b\x66\x1c\x1e\x30\x27\xf8\x17\x6d\x28\xbf\xef\x76\x7d\xd6\x8d\x4e\x5d\x62\x8f\xec\x0b\xfe\x88\x79\x93\x41\xf3\x06\x12\x87\x34\xfa\xd2\x02\xaa\xfc\x9f\x11\x12\x3f\xb3\xe3\x63\xd1\x0a\xee\x0d\xb5\xe2\x7a\x15\x70\xdf\xae\xe4\x7e\x24\xda\x47\x3b\x07\xfe\xe5\x9a\x6c\x93\xf0\x98\x1d\xbe\x32\x5c\xd8\xcc\x2d\x2e\xd7\xdc\x17\x16\x6b\x26\x7c\x1b\x11\x05\x36\xf2\x63\x6b\xba\x34\x75\x1a\x78\xf7\xf6\x29\x81\x82\x44\x2d\x83\xc1\x23\xbb\xee\x4f\x50\xc5\xb0\xfa\xcf\xf0\x3e\x7c\x55\x6e\xd9\xe6\x4c\xa2\x7c\x4b\xca\x5a\xb0\xde\x0d\x5f\x9c\x2c\xbb\x54\xcc\x2d\x94\x73\xa3\x2d\xf9\x99\x39\x0a\xc2\xff\xee\xd3\xd4\xcb\xa3\x49\x73\xdc\xec\x3f\xba\xba\xfc\x4d\x54\xca\xe4\xe7\xe8\x5d\x4a\x6e\x8a\xfe\x45\xca\xcd\x71\xe0\xf2\xe6\xd0\x4b\x4f\x9d\x3b\xcf\x43\xd3\xfa\x41\xe9\x98\xcc\xbe\xd0\xf1\x50\xd5\xca\x1d\x52\x72\x93\x2d\x93\xec\xa1\x04\x95\xc6\x83\x34\xfa\x32\x68\xf3\x1d\xe5\x22\xcb\x12\xa7\x44\x9f\xfb\x5c\xb5\xe8\xf1\x46\x2c\xd9\xb5\x17\x70\xcc\xaf\x58\xb1\xe0\xd8\x2e\xf9\x29"}, +{{0x0b,0x65,0x90,0xdd,0x7c,0x2f,0x15,0xf9,0x4a,0x56,0xe2,0x40,0x16,0x93,0x63,0xc2,0x67,0x32,0x30,0x2b,0x9d,0x44,0x0b,0x53,0x27,0x23,0x00,0x2e,0x15,0x5d,0x02,0xd9,},{0xcd,0x18,0xe0,0x32,0x57,0x7c,0x55,0x76,0xf2,0x23,0xf3,0xe3,0xd8,0xa1,0xfa,0x8e,0x9a,0x87,0x0f,0xef,0x09,0xe9,0x40,0x9f,0xaf,0x40,0xd7,0x14,0x3e,0x52,0xfc,0x44,},{0x64,0x2d,0x81,0xac,0xf3,0x8c,0xf0,0x99,0xa8,0x33,0xa7,0x4f,0x2d,0x80,0xb8,0x54,0x48,0xec,0x2b,0x1a,0x5d,0xdc,0x64,0x47,0x0b,0x21,0x3d,0x54,0xb7,0xbe,0x61,0x33,0x68,0x9a,0x71,0x94,0xf5,0xd8,0x97,0x92,0xe1,0x6e,0x5d,0xf7,0x55,0xa4,0xfd,0x9e,0xf4,0x68,0x9e,0xa9,0x52,0x92,0x6e,0x0e,0x4e,0xcb,0x3b,0xd4,0x81,0xfd,0x91,0x02,},"\x71\xfe\x0f\xd5\x5d\x5e\xd1\x20\x6f\x28\xee\x16\xe4\x19\xfa\xb6\xfa\x66\xa2\x51\xfa\x6b\x06\x01\xda\x26\x1e\x42\x9f\x55\xb8\xd5\xae\x3f\x3c\x52\xa1\x7f\xe1\xec\x73\x4b\x81\x0a\xb6\x3a\xad\xe4\x44\x70\x39\xca\x0a\xe4\x68\x7c\x24\x35\xf5\x61\xe4\x6c\x5b\x30\x97\x17\xab\x31\xe0\xf6\x40\x76\xb2\x16\x92\x11\x57\x2b\x74\xe1\x8a\x1f\x45\x25\xa6\x4f\xa7\x17\xa5\xed\xf1\x49\x75\x81\x29\xcb\x04\x03\x5e\x7e\x20\xba\x40\x05\xb7\x48\x09\xde\xc6\x44\x50\x4c\x24\x54\xa7\x7f\x99\xb2\x0c\x53\x74\xf3\xce\xe7\xd8\xc6\xb6\x8b\x24\x3c\xaf\xb3\x00\x98\xdc\xe9\x04\x90\xfd\xc3\xb9\x2f\x54\x94\x8f\x42\x46\x39\xe1\x9f\x8f\x20\x20\xd1\x55\x13\xda\xef\xad\xd9\xe9\xb1\x2a\x84\x76\x1e\x5e\xce\xa0\x88\xad\x56\x1f\x06\x20\x9f\xd4\x42\x3f\xcd\x00\x3f\xbc\xd1\x87\x3e\xa5\x49\x63\xa2\xfa\x07\xc7\x47\x6b\x13\x88\xf9\x01\x5d\x9e\xac\x30\x5b\xea\x5a\x3d\xe1\x94\xf5\x5a\x17\xb4\x2d\x59\x9e\x5c\xe6\x2c\x8b\x7c\x19\xe7\xe7\x09\x61\x37\xb9\xd0\xa6\x5e\x63\xc1\xa3\xb8\x45\x38\xca\x65\x36\x9a\x20\xe8\x82\x2f\xff\x5e\xcb\x57\xfc\x09\xb4\xe6\x84\x5b\x4f\x24\xd4\x88\x69\x71\xac\x1a\xc2\x8c\x77\x58\x0e\xa5\x67\x2a\xd1\x4c\xe4\x44\x17\x19\xc2\x14\x54\x6d\x07\x36\xcb\x7a\xd0\xbd\x9f\xb5\xb2\x6c\x6d\x9c\x53\x6b\xf8\xc8\x57\xae\x42\x57\x7b\x36\x34\x1d\x39\x2b\x43\x32\x3b\xda\xe7\xdf\xaa\x49\x19\x86\x87\x2a\x23\xd8\x27\xc6\xef\x8b\x57\xe7\xd0\x0f\xea\xe3\x83\x4c\x46\x64\x00\xaa\xd1\xd3\x67\x82\x39\x84\xaa\x02\xd2\xef\x49\x29\x14\xae\x11\x27\xe7\x55\x1b\x81\x25\x59\x37\x83\x05\xe4\xfd\x52\xd8\xbc\x7e\x41\x57\xec\xca\x45\x1f\x43\xee\x9f\x54\xc8\x21\x53\xc7\xdb\xfa\xf7\xec\x35\x23\x87\x73\x05\x1b\x4e\x58\x7d\xb1\x36\x95\x7e\xc5\x71\x38\x2b\x90\x59\x0b\x5d\x10\x26\x02\x45\x80\x96\x6b\x72\x52\xd2\xcd\x3f\x4f\x16\x25\xc4\x85\xba\x90\x6b\xff\x17\x59\x92\x18\x89\x78\xf2\xd6\x27\x4f\x3a\x03\x17\x49\xba\x7e\x70\x2f\x56\x54\x7e\xdc\x96\xec\x26\x7b\x84\x89\x28\x80\xd7\x50\xd7\x31\x0e\xbf\x6d\xb2\x41\x25\x3c\xab\xe4\xb2\x5a\x97\x74\x58\xc6\xff\xc9\xe3\x53\xe6\x2a\xdf\x05\xe6\xef\xc0\xfc\x1e\xbe\x89\xf5\x27\x70\x5b\xcc\x26\xb7\x01\x28\x56\x10\xd9\x8a\xa3\xbf\x23\x87\x2b\x69\x96\xd3\xde\x48\x0e\x8d\x09\xd7\x83\xc4\xa0\x8c\xd3\x83\xc9\x01\x26\x35\xaa\x68\x97\x8b\x50\x06\x81\x8b\xbd\xe4\x4f\x29\x87\x47\x9b\xcb\x2b\x71\x1c\x1b\xee\xed\x27\xcf\x09\x97\x0a\x16\x4e\x45\x4f\x71\x08\x22\xee\xf5\x55\xc1\xc7\xbf\x9f\x76\xd5\x25\x4c\xe2\x20\xc9\xaa\xa7\x16\x84\x7a\x24\x94\x88\xf9\xcd\xb4\x4c\x48\xf4\x52\xab\x52\xc4\x0f\x6d\x03\xad\xc8\xbf\x3f\x19\x7b\x25\xe3\xd1\x27\x83\x0e\x74\xfd\x81\xeb\x14\xf7\x54\x20\x5b\x3a\x48\x44\xc5\x96\xb6\xe3\xa9\x93\x6a\xd6\xfd\x9e\x80\xa1\x63\x20\xb3\x81\xc3\xff\xc7\xb6\x9e\xab\x54\x53\x6f\x55\xab\xe2\x2c\x91\xd8\x98\x40\x8e\x88\x0c\x6d\xbf\x0f\xa5\x64\x8d\x51\x77\x72\xca\xa5\x35\x3b\x25\xdb\x60\x50\xd7\x53\xfa\xf1\x98\xec\x1d\x37\x5d\xe0\xfa\x72\x18\x0a\x93\xba\xb0\x3d\xed\x77\x16\xcb\x87\x50\x5b\x68\xac\x6a\x35\xe7\x3d\x0f\xcf\x34\x45\x7e\xff\x82\x17\x89\x52\x14\x2c\x7b\xac\x9d\xfd\x87\x2a\x9a\x82\xf8\x5b\x24\xb8\x8f\xa4\x2d\x4b\xe0\xa0\xca\x0b\x2c\x70\xf4\xc6\x22"}, +{{0xc6,0xd9,0xac,0xc5,0x17,0x5f,0xa2,0xb8,0x96,0x5c,0x15,0x8c,0x56,0xba,0x0a,0x5a,0x66,0x6a,0xd2,0xc7,0x40,0xcd,0x5b,0xb6,0x79,0xbb,0xa9,0xb1,0xdc,0x50,0x92,0x84,},{0xf5,0xcf,0xca,0x21,0x1b,0x02,0xfb,0xa7,0x72,0x03,0x47,0x70,0x3b,0xf1,0x63,0x1c,0xb3,0x08,0xfa,0xbc,0xda,0xa6,0x74,0x29,0x52,0x7c,0x5b,0x7b,0x67,0x6d,0xba,0xef,},{0x4d,0x2c,0xe7,0x07,0x09,0x0b,0x0f,0x3f,0x41,0x46,0x2f,0xd7,0x5b,0xd6,0x09,0xa2,0x72,0x4f,0xad,0xfe,0x5c,0xa3,0x90,0xe3,0x13,0xa4,0x2c,0xab,0x42,0x86,0x8e,0xd6,0xe9,0xa8,0x91,0x4d,0xc1,0x39,0x09,0xc0,0xd6,0xf6,0x1e,0x63,0x71,0x29,0x57,0xc7,0x6f,0x3b,0xd8,0xb7,0xf5,0x53,0x49,0x71,0x5a,0x3a,0x31,0x75,0x15,0xc0,0x71,0x08,},"\xf2\x45\x10\x0c\xd2\xd3\x16\x48\xf5\xf3\x51\xbd\xa5\x64\xc9\xdb\x4a\x35\x82\x0c\xc3\x0e\xf6\x51\x33\x7c\x4c\xd8\x88\x07\x05\x69\xd1\x17\xa9\x34\xb9\xc9\x18\xe5\xdf\x8b\x37\x44\xdd\x66\x20\xcc\xbc\x49\xf6\xb3\xe5\x78\x2a\x30\x33\x9d\xbb\x9c\xbe\xd0\x5d\xd2\xb3\xb8\xc5\xbf\x15\x46\xe7\x0a\xf6\x36\xe6\x61\x5c\x48\xb2\xc3\xc2\xd1\x9f\xe3\x54\x20\xdf\x53\x14\xf6\x3c\x48\x12\xb5\x8e\x82\xa2\xa6\x0b\x18\x02\xf3\x8e\x50\x5c\xe7\x48\x01\x7a\xfa\x97\x7d\x3f\x9b\x1b\x6b\xea\x21\x92\xac\xec\x73\xbd\xce\x12\xd6\x5e\x68\x4d\xa4\xd8\xb4\x1f\xa9\xa8\x6f\x11\x08\x6e\xdc\x2d\x52\x96\xf6\x7e\xfc\x53\xac\x84\x07\x0f\xde\x13\x69\x3e\xb2\x31\x8f\x5a\x8c\x3b\x11\x7c\x23\x34\x22\xad\xcd\xd3\x52\xf3\x28\xf0\xec\x69\x9a\x46\x50\xc9\x3f\x9b\x4a\x7d\x79\x5d\x7f\xc2\x62\x2a\x03\xd9\x9b\x64\xf7\xb3\xdc\x31\x94\xf6\xc3\xb1\xb6\x9d\x99\x07\xce\x09\x24\x01\x07\x3f\x47\xa2\x8f\x47\x99\xd2\x29\x09\x2a\x1b\x07\x41\x29\x95\x4b\xe8\x0c\xa4\xa3\xe6\x58\x2e\xe0\x5c\x30\x2c\xac\xb7\x43\x1d\x1c\xa6\xa4\x51\xaa\xed\x72\x78\xab\xc7\xf7\x85\x75\x24\x1c\x2a\x2e\xea\x2e\x84\xcb\xf9\xa3\x34\xdf\x40\x21\x09\xc0\x28\xe3\x45\x47\x3a\x13\xaf\x9b\x00\x8e\x20\xbc\x8c\xf0\xbc\xef\xbb\x7a\xa7\x27\xec\x85\x6e\x99\x25\xb4\xdd\xd9\x9d\xeb\xa8\xf2\x52\x91\x1a\x59\x01\x54\xb5\x79\xa8\xaa\xa3\x1f\x07\xdd\x50\x25\xdf\x5c\xd8\xa0\x9f\x74\x29\x64\xcc\x8c\x36\x5d\x8a\xff\x4e\xb1\xd7\x9f\x6e\x5a\x07\xda\xc5\xf4\xed\xe9\x2b\x4e\x2e\x61\xd3\x4c\xc2\xd4\xf0\xaa\xaa\xb0\x37\xad\x5f\xdb\x95\xde\x6c\xd5\x98\x4e\xba\xf7\xcc\xe7\xf0\x8d\x0c\xa0\xdb\xbe\x48\x3c\xe3\xcb\x35\xcd\x79\x0c\xa0\x42\x70\x65\xa3\x4d\xf7\xf4\xc2\xaf\x86\xef\xe9\xb7\x65\x71\x3a\xff\x25\x7f\x5c\x1d\x54\x70\x95\x27\xad\x18\xac\x33\xab\xcd\xee\xdb\x20\x80\x64\xeb\xae\xa4\x83\x5b\xe4\x94\x2b\x8f\xc6\x66\xad\x1b\x79\xb6\x65\x13\x09\xe5\xea\x1d\xa3\x02\xd7\xfb\xa2\xe9\x9f\x0e\x63\x19\xe8\x2b\x99\x05\xa1\xea\x48\x2b\xa0\x43\xb6\x80\x0b\x33\x0d\xc4\x8b\x33\x13\xf5\x9b\xb2\xf9\xe8\xa7\xf0\x7e\xb1\x80\x0a\x70\x27\x45\xdb\x14\xc6\x29\x9a\x98\x2d\xad\x89\x79\x54\x44\x5b\x7d\x98\xeb\x58\x37\xfd\x70\xbf\x19\x0c\x64\x95\x52\xc8\xe8\x6f\xeb\x7f\xf5\xb3\xed\x8e\x0a\x06\x70\x4d\x45\x53\xa3\xc2\xdd\x74\xf1\x8e\xa8\x23\x3a\xe0\xa5\x0d\x91\x4f\xe0\x8f\xbc\xd3\xa1\x43\x5f\xed\x56\xa9\xf3\xa7\xef\xfa\x14\x0f\xb5\x52\xdd\xd2\x1d\xff\xff\x7f\xa4\x73\x32\xdd\xfc\x1e\x53\x17\xf4\x17\x7d\x5e\x2f\x11\xa0\x6e\xc8\x4c\xcf\xb8\x9b\x65\x4e\xa8\x1b\xd4\x2d\x7e\x07\xa3\x87\x30\x1d\x0f\x40\x26\x4a\xbb\xf9\xf9\x10\x7b\x30\xed\xe8\x64\xcc\x76\x90\xc0\x6d\x2e\x24\x7a\x06\x0b\xb2\x24\x4a\xd7\x8e\xd5\xc5\x51\x5a\x1a\x2a\x61\x2d\x61\xe3\xd9\x31\xe2\x8b\xc9\x39\xb4\xd3\x43\x5e\xee\x4f\x73\x31\xb1\xf0\xf8\x53\x75\xd8\x2a\xc9\xa7\x7c\x43\x74\x00\x32\x05\x17\x46\xdc\x92\x69\x45\x8c\x14\x7d\x18\x8d\x84\x40\x19\x54\xa4\x89\xcb\x4f\xbf\x9b\xf8\x4b\xa7\xd8\xf1\x00\x90\x3c\xe6\x78\x31\xb4\x05\x4d\x0f\x58\xcd\x88\x3d\x54\x2c\x49\x33\x10\x3f\xf0\x70\xcd\xfc\x9d\xbb\x0f\xcc\x31\xef\xca\x46\x6e\x77\xa3\x3f\x1a\x81\x3d\xa6\xdc\x0c\x7c\x31\x58\x5e\x8f\x4f\xef\x1e\xbf\x42\xfb\xd1"}, +{{0x7d,0xfa,0xe4,0x16,0x41,0x9d,0x7b,0x0d,0x4f,0xc1,0xf8,0x23,0x84,0x0c,0x3e,0x4b,0xd4,0xad,0xcd,0x4d,0xc2,0xdc,0x17,0xb3,0x86,0x37,0xac,0xed,0xac,0xbd,0xbb,0x45,},{0xbc,0x51,0xd7,0x74,0x59,0x31,0x31,0x7e,0x1e,0x34,0x6e,0x2e,0x7c,0x92,0x03,0x91,0x81,0xb6,0xbf,0x38,0xee,0x2f,0x5a,0x44,0xfb,0xe2,0x33,0x9c,0x4f,0x95,0x2a,0xb9,},{0xda,0x34,0xb1,0x98,0x3e,0x8c,0x55,0xe4,0x1f,0xda,0x8e,0xc8,0xab,0xf2,0x3b,0x36,0x7a,0x0d,0xa6,0x06,0xc8,0xcd,0xbb,0x1e,0x8b,0x57,0xe0,0x34,0x3c,0x05,0x57,0xa5,0xf0,0xe8,0x15,0xe7,0xf2,0x2f,0x86,0x05,0xae,0x93,0xb2,0x7d,0x03,0x77,0x6a,0xc1,0xf7,0xde,0x3d,0x79,0x2e,0xa2,0x93,0x3a,0xc2,0x2d,0x2d,0xc2,0x3b,0x32,0x3d,0x0c,},"\xec\x84\x3d\xc4\xdd\xa6\xe9\x02\xe9\xbe\x31\xb7\x0f\x11\x76\x3b\x75\x7a\xb6\xce\x73\x34\xdc\x00\x76\x4b\x2d\x08\x4e\x9d\xaf\x24\x84\x48\x59\x84\xee\x28\xa2\x83\x0f\xcb\x94\xc5\x41\xcb\x46\x94\x40\x03\x67\x31\xde\x80\xff\x56\x0f\x53\x0c\x9d\x9e\x6e\x1f\x7d\x9c\x4c\x5b\xdf\x50\xb0\x4f\x54\x03\xc2\x9f\x76\xd7\xe3\x6e\x00\xbb\xea\x35\xdb\x1c\xc6\x0d\xa8\xd7\x76\x52\x62\x66\xc3\x32\x4c\xe7\xef\xec\x64\x50\x85\x96\x09\x26\x68\x56\xd7\x01\xa4\x7a\x48\xde\xe8\xbf\x37\x40\x95\x65\xc7\xfb\xfa\x99\xa2\x04\xe5\x53\x0c\x97\x1c\x60\x5b\x44\x30\x5d\x5c\x74\x67\x89\x41\x14\x25\x3c\xf4\x3c\xdd\xf1\x8b\x62\x96\xdd\x25\x4a\x4d\x96\xac\x70\x00\x91\x81\x86\xdf\xd4\xbf\x45\x4e\xd3\x09\x74\xc5\x53\xd0\xae\x15\x1a\xd4\xcf\x54\x0c\xec\xaa\xa0\xb5\x94\x8b\x09\x85\xa9\xc7\xb6\xe7\x81\x59\x32\xba\xc1\x17\x32\xfc\x7d\x10\x26\x7f\x6b\xf8\xf1\xe7\xc0\x8d\x65\x0e\x56\x7b\x4e\xdd\x15\xae\x79\x58\x41\x0e\x42\xf1\xf5\x37\xfa\x73\x2f\x72\x7a\x26\x83\x88\x32\x1d\x53\x44\xc4\xe7\x8b\xb9\xa7\x4e\xab\x9d\x6a\xbf\x96\x89\x65\xc6\x66\x93\xd5\xf1\x12\xdd\x4c\x14\xfd\xfd\xd9\x60\x05\xea\xa6\x75\x7f\xa2\xcc\x10\x13\xfe\x43\x27\xab\x09\x99\xd1\x17\xf3\xdb\xf3\x25\xb0\x7c\xd4\x54\xd4\xb1\x41\x99\x1e\xf7\xe2\x3d\xb5\xee\x24\xbe\xda\x35\x88\x4a\xa3\x70\x48\x08\x64\x8a\xa4\x3c\xd6\x25\x62\x59\xf7\xd3\xdb\x5e\x05\x53\x11\xf2\x53\xe8\xb5\x7a\x4c\xda\x5a\xfe\x0b\x0a\xdf\xc3\x64\xe1\x60\xca\x37\xe8\xde\xc6\xb9\x5a\xa6\x15\x2e\x5d\x5d\xa6\xeb\x91\xbe\x0e\x44\xff\xe8\xe4\x95\x33\x26\x7b\x7e\xb7\x95\xf5\xf8\xe0\xb2\xc3\x5b\x29\xdf\xbc\x87\x58\x5f\x22\xbd\x5b\x90\x9d\xfd\x6a\x5e\xdc\x0e\x3a\x9d\x97\xb0\xc4\xf3\xad\xc5\x1e\x96\x99\x37\xc0\x8f\xd6\x5f\x53\x7a\xac\xda\x8f\x11\x27\x5a\xf0\x2c\x33\x54\x54\x26\x30\xf3\x92\x0c\x39\x3f\x5c\x42\xb9\xfc\x63\x3d\xe9\xd9\x4c\x72\xe3\xf2\x00\x02\x34\x9a\xd0\x41\x80\x35\xb3\xf2\x5f\x02\xca\x92\x8e\x5b\x2d\x40\xa7\x7a\x1c\x3e\x56\x22\x1f\x4b\x9d\xb0\xc2\x5b\x09\x6d\x6e\x5d\x0f\xe7\x58\xda\x2c\x69\x05\x3e\x8d\x08\x6d\xef\x4e\xdc\x6e\x34\x53\x78\x3f\xfc\x63\xa4\x96\x01\x22\xd9\x23\x67\x1a\x90\x60\x08\xba\xc1\x05\x61\xae\x62\x19\xd2\xb5\x1d\x53\x67\xbf\x13\xcc\xab\xf5\x93\x1b\x9f\x18\x6e\xb1\x09\xba\xcd\xe4\x0e\x1a\xf2\xb5\x64\x81\xe0\xc6\xdc\x6f\x5c\x54\x73\xf8\x00\x1c\xf3\x71\x91\x9a\xcb\x40\xce\xc5\xb9\x62\xeb\xba\x80\xe3\x2d\x6e\xba\xc4\x80\x6d\x04\xd2\x47\x68\xc2\xad\x2e\x3f\x92\xa8\xcb\xe4\x77\x54\xf9\xbf\x61\x59\x53\x52\x2b\x26\x3d\xc2\x49\x37\xfb\xd9\x32\xc8\xc4\x59\xeb\x8b\x10\x94\x43\xaf\x6c\x19\x5a\x59\xfd\x27\x21\xb0\x12\x56\x28\xf2\xb8\x14\x3c\xf3\xc1\x28\xbc\xec\x13\x92\xef\xd1\x6b\x73\x4c\x10\x71\x6d\x96\xba\x7d\x1f\x41\x39\x17\xcc\xaf\xa5\xbf\x5f\x83\xf5\x24\xfe\x84\x06\xa1\x52\x11\x5e\xa7\x70\xe1\x74\x5e\x82\xe8\xb5\x1d\x75\x2b\x8b\xd7\x85\xdf\x48\xbf\xc1\x20\x41\xbf\x87\x4f\xc7\x3a\xfb\x42\xca\x5d\x69\xc6\x41\x64\x79\xce\xb4\xaa\xa0\x49\x2b\x6f\xf2\x1e\xe1\x2d\xb2\x21\x3a\x42\x86\xfd\x56\x05\xc9\x3a\x7b\xb8\xa3\xb0\x71\xb0\xb2\x5f\xb0\x1d\x77\xab\xbc\x87\x71\x48\x94\x70\xa1\x07\xaa\xda\xe9\xf6\x40\xc2\x4d\xfd\x53\x28\xf6\x0f\x4b\x7d"}, +{{0x70,0x94,0x16,0x07,0x49,0x97,0xb9,0xc9,0xaf,0x4d,0x37,0xa0,0x11,0x39,0xe8,0xa3,0xf9,0xf2,0xce,0x5d,0x72,0xa5,0x7d,0x80,0x5e,0x82,0x2a,0x81,0x18,0x6d,0x01,0x7e,},{0xae,0xe1,0x10,0xf1,0xf4,0xd4,0x6e,0xa6,0x06,0x49,0xd7,0x86,0xb1,0x50,0x05,0x2e,0x28,0x7a,0x9d,0xa6,0x01,0x22,0xc4,0x7b,0x09,0x08,0xfa,0x8b,0x2c,0xa2,0x8a,0x80,},{0x8e,0x4b,0x41,0xf0,0x97,0xd8,0x36,0x14,0x18,0x4b,0xa7,0xf5,0x2b,0xa2,0xfd,0x9f,0x05,0x65,0xf8,0xa6,0x37,0x21,0xef,0x55,0xf9,0x31,0x62,0x82,0x6b,0x9f,0x0a,0xc0,0x70,0xc0,0xe2,0x86,0x4b,0x5f,0xfd,0x8e,0xcc,0xc1,0x8e,0xfa,0xd1,0x8b,0x2c,0xe8,0x4b,0xe5,0x7c,0x0b,0x4a,0x41,0xc5,0x2e,0x20,0xef,0x37,0x72,0x23,0x77,0xc6,0x0f,},"\xed\xda\xa3\x69\xc0\xe3\x1a\x1f\xcc\x1d\xa4\x6f\x65\x36\x24\x42\xa0\xcc\x21\xc7\xdc\xdd\x5c\xd9\x0e\x0a\x2e\xe9\xf2\x51\x10\x81\x2b\xa1\x14\x93\x1c\x86\x8a\x70\x86\x07\xac\x16\x08\x4d\x79\x71\x5d\x13\xb3\x38\xc0\x5c\x6a\xef\x73\x43\xe7\xda\xd2\x82\xf9\x6f\xe2\x81\x93\x18\x8f\x0c\xc8\x93\xc7\xdc\xe8\x05\xfd\x3a\x7c\xd2\x68\xb7\x28\x94\x16\x0b\x52\x45\xfe\xd9\xfa\x99\x43\xb7\xc8\x0a\xdb\x3c\x2d\x1a\x35\x3d\x8f\x12\xdf\x25\xa3\x1d\xde\x7f\xa3\x85\xbb\xec\x35\x1d\xa6\x6f\x15\x30\x32\xe1\x77\x56\x27\x3f\x8d\x54\xe9\xa3\xb9\xea\x25\xae\x67\xd1\xe9\xc1\x8c\xc6\x8b\xe6\x01\xe3\xd6\x82\x82\x81\x8c\xe0\xe7\xcf\x88\xa4\xd1\x33\x64\x53\x02\x17\x32\xf0\x8d\x9e\x76\xcd\x23\x63\x79\x29\xb0\x91\x1d\x5f\x86\x14\xf4\x84\x2e\x67\x0c\x14\x28\x60\xaf\xc2\x65\xc5\x01\x72\xb1\x3b\xfd\x35\xad\x8f\xc5\x4b\x28\x65\x7d\xa3\x2b\xac\x15\x3b\xa9\xaf\xfc\x89\x7a\xfb\x3c\x72\x1f\x48\xca\xa4\x62\x40\x58\x57\x10\xb0\xf2\xd2\x4d\x5f\xf4\x96\x5d\x1d\x10\xf1\xa0\x7b\x06\xab\xea\x6a\x08\xe1\xd6\xf1\x50\x0d\xa1\x2c\x43\x4a\x6d\x77\x8c\x94\x10\x67\x10\x80\x00\x47\x5c\xe8\x31\xbc\xfe\x2d\x0a\xfe\x40\xb7\x41\x9d\x07\x05\x9b\xc0\xcd\x8d\xce\x4b\xe9\x58\x7f\xf2\x9a\xd8\xbf\x0b\x26\x8a\xe2\x3c\xe0\xda\x5b\xb5\xbf\x74\xff\x0b\x2b\x31\xb8\x21\x12\xa9\xfd\x5a\xbd\x9b\xfd\x0a\x90\xe6\xf4\x72\x35\x48\xc6\xbb\x2f\x99\xdc\x06\x1b\xa3\x2e\xba\x2d\x53\xe6\xbc\x79\xbf\x44\x1b\x23\xfb\x74\x60\xde\x04\xe8\xe8\xef\xbc\xd4\xd4\xcc\x73\x55\xde\x9e\x3b\x08\x61\xa6\x81\xb9\x83\x83\x9d\x44\x88\xe5\x51\x75\x1f\x23\xe9\xa6\xe2\xe4\xd4\x43\x27\x3b\x9e\x0f\xe6\x4d\x8a\xcd\x1c\x74\x8b\x55\x59\x43\x82\x23\xdd\x21\xb5\x18\x31\x89\xe0\xf3\xc0\xe8\xed\x41\x4c\x03\x56\xba\xb7\x7a\x65\x4d\xe1\xa5\x77\x14\x62\xef\x14\x34\x49\x70\xa4\x91\x51\x1a\x72\x29\x14\xf4\xa8\x9f\x4f\x1a\x82\x7e\x18\xcd\x84\x47\x9c\xc9\x25\x92\xea\xdf\x8d\xe2\xdf\x82\x4b\x97\x6d\xcb\xd2\x84\xa3\xba\x64\xbc\xdb\x0d\xf1\x5e\x8f\x41\xc0\xb2\x47\x15\x86\xb2\x6a\x06\x35\x3d\x90\x50\x28\x23\x5c\x1c\x6e\x5c\x45\x87\x22\x27\x25\xaf\x08\x3e\x11\xe7\x9c\x94\x3a\xa4\x44\xd4\xaa\x41\x21\x8d\x3e\x97\x43\x36\xe3\x72\x81\x3e\x99\xe2\xb0\xc5\xf0\xae\x81\x0f\xfe\xd9\xa7\xa3\xd6\xcb\x74\xc5\x47\x3d\x99\x0a\x59\x11\x32\x9b\x8e\x82\xec\x6b\xf2\xbd\x43\x21\xbb\x48\x73\x70\xf8\x73\x9e\x7a\x2a\x4a\x53\x43\x08\x33\xd4\x5b\x9f\xe3\xde\xb9\x3f\x79\xfc\x6a\x51\xd5\x63\x69\x5e\xcd\xb9\x78\x58\xd2\x13\xda\x58\x44\x34\xb7\xc7\x15\x46\xaa\xe8\xd9\x67\xe1\xc6\xd0\x08\x2b\x10\xd4\xa7\x2d\xe1\x74\x2e\x53\xc4\xb2\xf9\x2e\xb8\xb5\xc8\xc3\x5a\xb6\x53\x5e\xa8\x10\x0b\x37\x92\x4a\x0a\x91\xd2\xa7\x28\xd0\xf5\x64\x24\x37\xaa\x66\xc8\x2a\xb7\x4b\x5d\x07\x45\xec\x08\xf7\x70\x5c\xb8\x1f\xa0\x79\xd8\x9e\xcd\xc9\xaa\x1f\x8d\x7d\x82\xdc\x77\x46\xd3\x46\x15\x34\x3a\x69\x25\xdc\x31\x8f\x35\x2a\x2b\x45\x01\x24\x38\x42\x4f\x90\x98\xfd\xdf\x6e\x61\xfd\x1f\x8f\xb4\x9d\xa4\x0b\x3e\xec\xe8\x9a\x1a\xf1\x99\x6d\xe7\x0c\xd1\x69\x6c\xbf\xd9\xe3\x01\xea\x5f\x44\x37\xc7\x1a\xc2\xa0\x32\x25\x4c\x14\x0a\x90\xe8\x5f\xb8\xff\xc4\x66\x7f\xa1\x39\xc1\xee\x9b\xbf\x12\xee\xd9\x06\xa9\x67\xbc\x09\x21"}, +{{0x3d,0xcb,0x7a,0xe7,0xd9,0xf0,0xf1,0x41,0xf1,0xd9,0xf0,0x78,0x83,0x63,0x5b,0x91,0x3e,0xd2,0x9f,0xb6,0x1d,0x0f,0x74,0x1c,0x9a,0xfd,0x05,0xa2,0x7b,0x04,0x5b,0x06,},{0xae,0x62,0xb7,0xee,0x1b,0x8d,0xb5,0x76,0x4d,0xaf,0xdd,0xd9,0x72,0x4a,0xcc,0x10,0x6d,0x6c,0x0a,0x4d,0x1e,0x85,0xd8,0x90,0x6f,0x75,0x84,0xb5,0x58,0xf5,0x77,0xdf,},{0x09,0xa1,0xe6,0xfe,0xdf,0x97,0x1b,0x3e,0xdb,0xfa,0xef,0xbe,0xb8,0x9a,0xa5,0x39,0xca,0x0b,0x02,0xb3,0x7e,0x7a,0xc4,0xea,0x89,0x20,0xd6,0xd4,0x34,0x8e,0xe0,0xcf,0x9a,0x2d,0x5e,0x96,0xfc,0xe5,0x17,0xc6,0x65,0xe7,0xc3,0x83,0x68,0xba,0xf2,0x49,0x79,0x24,0x9a,0x95,0xb7,0x0e,0xa7,0x43,0x6c,0x00,0x78,0x5f,0x16,0xa3,0xae,0x09,},"\x38\x11\x6a\x57\x26\x69\x07\x0d\xd5\x86\x32\x18\xc9\x1a\x77\xa4\xab\x47\x55\x36\x88\x48\x8c\x79\x28\x38\x50\x9e\x9a\xba\x25\x06\x7a\xdb\x7e\xa4\x24\x98\x48\x00\x9d\x91\x4a\xe9\x87\xa6\x03\x23\x48\xc1\xc0\x68\x1c\xf9\x77\xa9\x55\x2d\xd6\xbb\xf4\xe6\xff\x32\xac\xc9\xfa\x61\xcb\xee\x25\xa3\x93\x07\x65\x0f\x8b\xa6\xa7\xce\x42\x1e\xf2\xf7\x1b\xcc\xc0\x95\x81\x38\xf9\x32\x4c\x86\xbf\x2e\x52\x8f\xa3\xe4\xd1\xb1\x9f\x9f\x2c\xa5\x26\x84\x09\xb8\xcc\x19\xc6\x2d\xd9\x79\xb8\x96\x97\xe4\x57\xed\x2d\x98\xbd\x20\x96\xf6\x2d\x3d\x9e\x24\x73\x88\x79\x59\x27\x80\x3e\x79\xab\x71\xd4\xf7\x2f\x56\x8e\x94\x5a\x8a\x16\x21\x59\xd9\xb8\x48\x36\xe4\x58\x56\x44\xd4\x97\x9f\x61\x4a\xad\xa7\x3a\xd4\x13\xa8\x33\x91\xe9\xcf\x88\x0c\x42\xac\x2a\x98\x34\x3b\x6a\x82\xcd\x2b\x61\x58\x14\x56\xf6\xde\x5c\xeb\x24\xfe\x46\xb7\x62\x5d\x52\xab\x2c\x2c\x32\x4a\xc7\x47\x03\xd1\x5e\x15\xf1\xae\xff\x80\x55\xd2\xf7\x39\xf7\x36\x3e\x16\xec\x1d\x78\xbe\x2c\x62\x99\x43\x6c\x8c\x8d\x33\x6b\xd2\x92\x71\xa8\x97\xa6\xec\x93\x2e\xd0\x87\x25\xbe\x21\xb2\x8f\x9a\xa1\x4e\xaf\x4f\x71\x85\x31\x54\xdb\x14\x58\x7c\x93\x0a\xb3\xeb\x02\x27\xad\x7f\xfb\x45\xb3\xba\xa6\xa9\x99\x49\x9c\xc8\xa6\xe4\x5b\x1a\xb4\xd0\xb3\x39\x78\x2b\xcd\x9c\xfb\xcf\x88\xcf\x7e\xae\x89\x1c\xc8\x41\xe9\xc8\x8a\x1f\x6a\x69\x1f\x39\x48\xa6\xbc\x85\xba\x7f\x46\x11\x64\x2e\x84\x22\x3c\x3b\x17\x89\x46\xdd\xbe\xdd\xcf\xcd\xef\x4a\xe4\xc4\xe1\xa8\x14\xb9\xb1\xf0\x2b\x1e\xaa\x82\x4d\xb9\x3f\x44\xb2\x7d\x14\x20\x6b\x34\x04\x65\xa1\xce\xfc\xf5\x35\xc6\x3e\x55\xc4\x28\x72\x24\x26\x27\x33\xd9\x8a\xaa\xa1\x54\xf3\xad\x42\xcd\x85\x46\xa4\x61\xce\x0d\x46\xd8\x86\xd3\x46\x1a\x21\x50\xcb\x45\xdb\xe5\x64\x73\xff\x63\xd3\xdc\x7a\x2b\x95\x7b\x82\x39\x69\xf1\x9b\x59\x68\xe8\xb4\x24\xc8\x79\x74\x19\x26\xd8\x2c\x63\x86\x75\x3b\x0f\xa1\xf0\x80\x28\x4e\x55\x78\x94\x23\x63\xaa\xde\xb2\x1f\x8e\x1e\x89\x09\xfa\x6c\x38\x07\x64\x14\x9b\xc9\x15\xb2\x28\x60\x4e\xfc\x56\xd9\x2e\x4b\xeb\x72\x0e\xdc\x74\xc4\xd7\x8f\x92\x5d\x6c\xfd\xf7\xba\x2f\x14\xb5\x62\x37\x75\x81\x0d\x2d\x07\xbd\x38\x8c\x57\x3e\x36\x52\x3f\x21\x57\x38\xe6\x91\x14\xdc\xf8\xd8\x0f\x17\x0b\xfa\x67\x6e\x31\xfb\x62\x6a\x7d\x44\x9e\xd9\x66\x47\x36\x34\x75\x97\x0c\x8c\x47\x80\x97\x09\xbc\xb5\xe7\x20\x0f\x2a\x22\x7c\x7c\x8e\x7b\x00\x0f\x30\xc0\xbd\xe6\x1d\x67\xbd\x68\x95\x36\x16\x29\xa3\x6c\x8f\xdd\x5a\x56\xb8\x1e\xfb\xac\xf1\x5c\x1b\x35\x30\xa0\x8c\xde\xd5\xb1\xfd\x45\x7f\xbd\x2f\x03\x04\x2f\x56\xf1\xb3\x7e\xd1\x5c\xdb\x91\x2f\xa0\x29\x8c\x27\x67\x25\x08\x7e\xe2\x7d\x3c\xf2\x55\x0f\xe6\xe8\xa0\x33\x0a\xf4\x17\xf4\xf5\xba\xf0\x36\x27\xed\x67\xc5\xf8\x32\x33\x63\xab\xac\x5a\x1f\xe3\x48\x23\x18\x0e\x3e\x0e\x20\x80\xf7\x5b\xfd\x91\xc2\x07\xcf\x6b\xaa\x9a\x22\x9c\xf4\x43\xdd\x44\x2c\x59\x02\xe0\x67\x3f\x32\x52\xb8\x52\x63\x46\x58\x58\x72\xf6\xcd\x36\x60\x25\xa5\x69\x92\xb7\x0e\xde\x39\xbc\x8d\x32\x2f\x9c\x22\xa1\xdc\x59\x9e\x9f\x0d\x52\x4c\xb6\xd2\xea\x5a\xe2\x87\x8e\xf6\xbe\xd4\xb7\x02\x80\x7f\x1e\x1e\x73\xeb\xf2\x90\xeb\x6c\x0e\xeb\x85\xc1\x37\x16\xf6\x26\xaa\x90\xd3\x64\xb4\x90\x48\x37\xce\x05"}, +{{0x29,0x73,0x11,0xdd,0xef,0xfe,0xc9,0xd2,0xbe,0x68,0xef,0x7b,0x2a,0x20,0xfe,0x2d,0x27,0x7e,0x1d,0x8e,0x51,0x64,0x8b,0x03,0x57,0x2a,0xda,0x27,0xec,0x1f,0x9f,0x43,},{0x6a,0x6c,0x28,0xe7,0x61,0x64,0x0c,0x40,0x08,0x33,0x3a,0xae,0x5a,0x33,0x66,0x30,0x2e,0x2f,0x46,0x77,0xa9,0x53,0xba,0x48,0x2a,0xb6,0xfb,0x4a,0x1d,0x70,0xb4,0x47,},{0x4b,0xf0,0xb9,0x2c,0x6e,0xe4,0xea,0xce,0x5e,0x8e,0xb1,0x03,0x70,0xff,0x9d,0x9c,0x68,0xa5,0x74,0x9d,0x59,0x89,0x9d,0x04,0x32,0x7a,0xaa,0x38,0xf8,0xf8,0x25,0xe0,0x32,0xe5,0x97,0x42,0xb3,0x7d,0xe2,0x31,0x07,0xa3,0xec,0xdd,0x3f,0x7a,0x0d,0x08,0x12,0x26,0x14,0xb7,0x8f,0xdd,0x37,0x29,0x3c,0x8d,0x05,0xe2,0x8f,0x5f,0x71,0x08,},"\x26\x52\xac\xfc\x3b\xdf\x09\xa5\x99\xec\x67\x86\xbb\xd9\x4f\xe5\x77\xcf\x57\x8e\x02\x63\xcc\x68\xd9\xf5\x7a\x6c\x83\x45\x8f\x80\xac\xd8\xa7\x5e\xf0\x30\x40\xa6\x35\x67\x2b\x96\x8f\xf2\xaf\xdb\x28\x8d\x28\xb9\x99\x6f\x64\x15\xb2\xf3\x17\x5e\x9e\xa3\x7a\xeb\x05\xdf\x81\x81\x2e\x38\xa4\xc9\x76\xeb\x92\x85\x6c\xed\xb9\x1a\x26\x9a\x46\xfc\xa5\xdf\x9b\xd7\x30\xfd\x84\x45\x2b\x4b\xd9\x35\x77\xc6\x1f\x42\xc1\x41\x13\x97\x98\x82\xa8\x6a\x9f\xe6\x32\xe4\x75\x6a\xfd\x89\x81\x6f\xc4\x67\x0a\x31\x05\x03\xfd\xaa\xd2\xdb\x76\x4c\x37\x21\x21\x3c\x3e\x60\xf2\x9c\x26\x68\xd4\xde\x8f\x42\xb0\x87\xf2\x5c\xd5\x6c\x69\xa4\xe4\x8f\x13\x4f\x55\x98\xcf\x14\x5b\xe6\x38\xa5\xc2\x31\x88\x63\x32\x90\x61\x72\x9a\xac\x91\xda\x6a\x19\x1f\xd7\x74\x88\x0c\xf9\xcb\x55\x5e\xec\x15\xb0\x04\x4f\x10\xe5\x43\x3f\xb4\x6a\x9b\x88\x92\xda\x8f\x6d\x24\xf1\x42\x58\x8b\x70\xff\x0b\x49\x20\x0c\x50\x6b\x88\xbe\xd4\x49\xad\x10\xd3\xf9\x2c\x2b\xae\xda\x6b\xbf\x58\x67\x6c\x5b\xbc\x67\xd3\x1f\x64\xfb\x12\xe8\xd5\xe7\x88\x76\xd5\xc8\x49\xfc\x31\x4b\x2c\xf8\x01\x0c\x51\x02\x04\xc8\x63\x3d\x0c\xc3\x18\x56\xec\x6a\x11\x4e\xa8\xa8\x9c\x48\x92\x7b\x07\xa3\x1a\xb8\x42\xc9\xb8\x35\x2d\x93\x67\x34\x51\x41\xa9\x9b\x40\x04\x9d\x5c\x48\xe7\xd2\x7c\xab\x42\x7a\xde\xfd\x1f\x0f\xc1\x13\x6b\x35\x3c\xb0\x1c\x3d\xef\x91\xff\xfe\xe8\xad\x91\xe8\x8f\x4b\xb7\xd2\x61\x5c\x0d\xcc\x95\x34\x4c\xd0\x19\x50\x93\x8e\xcb\x14\xb8\x44\x6b\x56\xa0\x6b\xf2\xf2\xf6\x5f\xb8\x73\x5e\x8a\x7b\xc9\x6b\xb4\x6c\xe9\xca\xc7\x1a\x88\xeb\x8f\xda\x5e\x69\xd6\x9e\xb2\x9a\xa4\x2a\x01\x6b\x85\x83\x89\x3e\x9d\x72\x77\xcb\x13\x59\xc5\x68\x7e\xed\xcd\x59\x9d\x8a\x46\xe6\xc1\x49\x63\x63\x7d\xb0\x4a\x92\x9f\x4b\xc7\x93\x04\xac\x2d\xae\x73\x3b\x3a\x83\x9e\xb7\x4f\xbe\x3d\xe5\x04\x2f\xd6\x55\xea\xec\xb1\x5f\x39\xb2\xfe\x16\xda\xd8\xa6\xff\x8d\xbc\x05\x4f\xed\x51\x28\x2a\x85\x6e\x9d\xa6\x31\x6f\xac\x6d\xb5\xd5\x6f\x77\xf1\x8d\xa8\x41\x2e\xb3\x77\xe5\xb1\xb8\xf4\xcb\x13\x54\xec\xfe\x8f\xe8\xfd\x54\xe6\x2d\x76\x7a\x80\xde\x04\xcb\x76\x20\x22\x9a\x88\x31\xdb\xc9\xec\xd4\x57\x8f\xfa\x2f\xf0\x6b\x54\x45\xe4\x40\xd6\x9a\xab\xc9\x4c\x47\xbd\x17\xf2\x2b\x69\xf5\x2e\xea\xe5\xcf\xcd\x01\xa5\xca\xfe\x05\x80\x07\x2a\xe9\x16\x6b\x95\x74\x3d\x68\xc3\x56\x4c\x5a\x7e\x46\xf2\x4b\xc4\x8a\x89\x8a\x1a\xb2\xeb\xe6\x3f\x36\x85\x1d\x2a\xac\xfa\x0c\x4f\x32\xd9\x93\x77\x1d\x31\x4e\x72\x5a\x43\xd9\x80\x5d\x13\x71\xcf\x72\x3e\xf1\x61\xd4\x2e\x63\xff\xca\x68\x8d\x7f\x0e\x21\xef\x5b\x3f\x9a\x56\x1a\x62\x10\x70\x2b\x85\xfb\xd1\xf8\xca\x75\x38\x9c\xc7\xa2\x27\x39\xba\xe4\xde\xd9\x37\x57\xf1\x52\x0d\xc3\x88\x44\xa1\xa8\x8b\xe8\xe0\x96\x45\x05\x91\x48\x80\x7b\x93\x37\x70\x87\x8c\xb8\xa9\xad\x92\x11\x31\x71\x31\xe6\x93\x24\x53\x2f\xd0\x27\x9b\x83\x18\x5b\x62\x8f\xc2\xf9\xe2\x15\x00\x38\x46\x93\xfa\x29\xf2\x6b\xd1\xb9\xc3\x01\x60\x13\x67\x66\x5f\x05\xf3\x72\xda\xb4\xe3\x10\x77\x26\xcd\x3f\x63\x9c\xa6\x2b\xf6\x3a\x75\xf7\x7e\xaa\x75\xf7\x13\x61\x57\xad\xa2\x37\x4e\x65\xfb\x4f\xd3\x49\xb4\x5e\x25\x44\x1f\xd2\x1b\x13\xe6\x91\x13\x66\xb9\x7c\xfb\x4d\x6a\xd5\x22\xb8\x50\xad\xf4\x0c"}, +{{0x4d,0xb2,0xb5,0x81,0x44,0xa8,0xd2,0xd0,0xec,0x03,0xbb,0x9b,0xc2,0x9b,0x4c,0xa8,0x93,0x85,0x4c,0x80,0xb6,0x4a,0xfa,0x4a,0xf7,0xa9,0xc9,0x36,0x93,0x5e,0xcb,0x04,},{0xfc,0x5c,0xd7,0x50,0xe1,0x74,0xed,0x71,0x8b,0xd9,0x38,0xfa,0x8e,0xd9,0x9a,0x1b,0x9d,0x55,0x6b,0xa7,0x67,0x0f,0x2a,0x77,0xda,0xf1,0xc7,0x20,0x11,0x37,0x32,0xa5,},{0x42,0x45,0x17,0xaa,0xdd,0x85,0x3c,0xe3,0x98,0x57,0x59,0xa3,0x27,0xe7,0x76,0x0d,0x91,0x56,0xd3,0xb2,0x73,0x45,0x38,0x3f,0x0e,0x4a,0xd6,0x66,0x1e,0xe4,0xa3,0x72,0x4d,0x18,0xd8,0x20,0xf6,0xc5,0x57,0xf8,0x27,0x97,0xbe,0xb6,0x2d,0x2f,0x08,0x54,0x33,0x74,0x4f,0x89,0xa2,0xd8,0x52,0x93,0x79,0x64,0x81,0x86,0x2e,0xf8,0xa4,0x0f,},"\xc8\xd1\xdb\xc9\x36\x91\x1e\x12\x2c\xee\x18\xf9\x2b\x16\xa3\x9a\x2e\xef\x08\x23\xb2\x27\xf8\x98\xcd\xf5\x84\x2b\x93\xd5\x9f\xc0\x02\xed\xb5\x49\x8a\x20\x87\x2e\x19\x55\x4e\xf7\x39\x99\xeb\x3a\x7b\x3e\x2f\xdd\x90\x70\xe1\xef\xa9\x22\x8e\x9e\x93\xb2\x9a\x86\x8a\xe3\x79\x9e\x4e\x57\x23\x24\x83\x6b\x1a\xd5\xaa\x81\x2b\xf0\x0f\x84\x5b\xc2\x17\xeb\xbc\x3f\xab\xdc\x4e\x1b\x6e\x51\xef\x9e\xfa\xc2\x77\x0a\xa0\xa4\xa1\x1e\xe5\x2a\xb9\x56\xac\x64\x48\xaa\x26\x29\xcb\x61\xdb\xb1\xf1\xed\xb3\xbd\xe9\x9b\x48\x76\xda\x39\x2a\x6e\x0b\x9a\x0c\x31\x84\x9a\x58\x90\xae\xa9\x52\x2f\x56\xd0\x15\xa1\x93\x50\x15\xb9\x1b\xf4\xc6\xa0\x01\x1d\x23\x77\xd6\x71\xc3\xd0\xd7\x53\xc2\x7f\x8c\x76\xe4\x05\xd0\x23\x0f\x1f\x4b\x9b\x88\xfc\xeb\xba\x1e\xaf\x13\x77\x72\x35\xe5\x53\x24\xb7\xd3\xf8\x1e\x68\x61\x09\xd9\x1c\xe6\x89\x53\x0b\x90\xd2\xc5\xc7\x1d\xd1\x87\x72\xb3\x85\xd6\x2c\xcb\xfd\x2e\x08\x9a\x1b\x67\x09\x83\xf6\x0c\x21\xc4\x45\x5c\xb9\xd1\xa0\xdc\xaa\x74\xc8\x74\xe3\x52\x11\xf8\x22\x7f\xf7\xc2\x34\xdf\xf8\x5e\xc0\xb0\x7e\x36\x8c\xfa\x50\xa3\x43\x57\x83\x95\xa1\x4c\x68\xf1\xf8\x9b\xd4\xec\xbc\x17\x2e\xf8\x05\xe5\x83\x1e\xc8\x94\x75\xfc\xc8\xd6\x85\xca\x92\x55\xa7\x7e\x3b\xa3\xc1\x47\x50\x8e\xc9\x2d\x7b\xcc\xe8\x79\xaf\x0a\xbd\xd2\x41\x6b\x67\xb5\xf5\x05\x07\x33\x79\x14\xf3\x90\xbb\xe0\xb4\x50\xb6\xa2\xf1\x15\x93\x72\xc4\xbc\xce\xa3\x82\xce\x3d\x6d\x9f\xb2\x51\x5e\xcf\x79\x30\x05\x9a\x05\x52\xb7\x5f\x97\x88\x62\xbf\x97\xe8\x32\x5a\xf2\x4d\x1b\x8c\xe9\x51\x2b\xfc\x7c\xef\x88\x42\x32\x04\x23\x41\xd8\x2f\x9b\x5d\xad\x2e\x50\x2a\xc6\xac\x79\x5f\x99\xda\xc7\xfc\x60\xe3\xb8\x63\x9d\x0e\x15\x00\xde\xad\x4e\x78\xac\xa1\x09\x95\x7d\x57\x7a\x13\xc1\x92\x5d\x74\x03\xc1\xac\xf9\x89\xa9\xde\x67\x11\xe2\x3c\x67\xbf\x87\x22\xf5\x51\xb7\x74\xca\xda\x93\x1b\x5f\xd9\x73\x43\x4e\x3b\x71\x72\x81\x98\x83\xe7\x0c\x52\x78\x5e\x3b\x49\xd3\x23\xd0\x56\x36\x64\x11\x58\x64\x0d\xcf\x6a\x4c\x20\x0e\xb2\xc1\x3b\x1b\xee\xb2\xdc\x36\x03\x52\x47\x0d\x15\x38\x6e\x59\xe6\xfa\x60\x36\x7e\x5e\x7f\x17\x2b\x21\x15\x9d\x5e\xe7\xca\xb0\xd7\xf5\x86\x82\x39\x85\x8e\x2a\x93\x55\x04\x80\xfe\x8f\xb4\xdc\xaf\x4f\x22\x4c\x4b\x2a\xd5\x44\x87\x91\x63\x2d\xf3\x0e\x8e\x5f\xb9\x98\xb3\x5e\xa9\xae\xc8\xc9\x34\xa4\x40\x3a\xef\x82\x18\x7c\xa1\xab\xf8\x2a\x34\x4d\x00\xff\xb9\x93\xd9\xff\x34\x61\xd6\xfe\xcd\xaf\x5d\x3b\x48\x1e\x0d\x31\x15\x3d\xbf\x6a\xed\x28\x8c\x8a\xdd\x06\x4e\x83\x31\x55\x01\x41\xbd\x5f\x7a\x7e\x04\x7b\x86\x07\xd8\x46\xa6\xbf\xb7\x2d\x68\x34\x46\xa4\x45\x11\x46\x06\x25\x0d\x8d\x2d\x3a\x8b\x95\x08\xbb\x07\xd4\x62\x3c\xdf\x17\x88\xb5\x49\x9e\x9c\xb9\xa1\x37\x98\x49\xbf\xa1\x9c\x9a\x9f\x4c\xd3\xd9\x25\x3a\xdf\xfd\xa2\x5f\x47\xc8\x11\xbe\x83\x3b\x02\xf3\x32\x7e\xbb\xa8\x37\x30\x19\x5d\x61\x4b\xae\x6f\xe4\xe7\xa3\x83\x08\x15\xd2\xaf\x40\x0d\x20\xa9\x41\x7a\x09\x5e\x7e\x8e\xea\x10\x44\x91\x7c\xbe\x51\x2c\x40\x18\xd6\x56\xe2\xdb\x67\xbb\x98\x9c\x00\xe1\xe5\x07\x62\x3e\x82\x78\xd7\x29\x92\x5b\x84\xfb\x5c\x18\x6a\x7b\xac\x18\x9e\x6d\x6a\xb1\x4f\xd7\xb6\x2f\xdc\x63\x2b\xeb\xb5\xf7\x7c\xb5\xcc\x2f\x70\x7d\xf4\x05\x30\x99"}, +{{0xc8,0x20,0x41,0x3c,0x24,0x56,0x74,0x71,0x04,0x66,0x2e,0xf4,0xdf,0xf3,0xac,0x23,0x3a,0xc4,0xb9,0x1a,0x76,0xd3,0xc4,0xea,0x75,0x44,0x90,0xbc,0x9b,0x1e,0x29,0x1f,},{0x89,0x93,0xce,0xa2,0xf7,0xf2,0x80,0x6c,0x77,0xb3,0x98,0x1b,0x54,0xbf,0xa9,0xbf,0x17,0x62,0x15,0x1b,0x41,0x8e,0x5e,0x72,0x53,0x71,0xca,0x2c,0x04,0xd2,0x23,0xee,},{0x7e,0xf7,0x0e,0x4a,0x14,0x95,0x4d,0x50,0x9f,0x11,0x7f,0x4b,0xd0,0x1b,0x22,0x0b,0xcc,0x19,0x2d,0x3b,0x5f,0xdf,0xc3,0x48,0x2f,0xbb,0xc3,0xb6,0x9d,0xc0,0x68,0xa7,0xc4,0x76,0x1d,0x1b,0xeb,0xc2,0x31,0x7d,0x6d,0xb7,0x4f,0x90,0x6a,0x15,0x56,0x42,0xb0,0xa3,0xc6,0x59,0x2b,0xdc,0x72,0xe6,0x4e,0xac,0x6f,0x20,0x3f,0xb7,0x4e,0x02,},"\xd2\x99\x2f\x83\x92\x4a\x59\x48\x87\xe6\xef\x13\xf2\xae\x80\x8f\xc8\x63\x9c\x7b\x2c\x99\x4f\xaf\x0f\x79\x5e\x36\x01\x6d\xab\x77\x00\xa0\xee\x53\x01\x70\xf0\xb9\xfe\x98\xab\x75\x88\xce\x03\xbc\x50\xc2\xba\xe6\x5e\x05\x26\x47\xe7\x56\x73\x5b\x35\xd0\xb5\x9c\x96\x4e\x91\x7d\x8c\x83\xe2\xf9\xfe\xcc\x4c\xb0\x55\x64\x28\x7f\x0e\x34\xc9\x49\x40\x05\xe2\x5b\x1a\x8b\x1b\x94\x2b\x54\xd8\x90\x35\xf1\xb1\xc3\xc9\x45\xfc\xc8\x4e\x4a\x39\xef\xa2\xca\x50\x95\x9b\x45\x9a\xf7\x4d\x21\xb6\x24\x2e\x2f\x56\x51\x8f\x70\xe8\x67\x92\x57\xc0\x89\xd2\x6c\x3b\xb7\x92\x68\x7c\x92\x33\x55\xb2\xc1\x8e\xe2\x13\x6d\x40\xcb\xa4\x5a\xcb\x64\x24\x0d\x96\x67\xf3\x9d\xba\x36\x39\xb6\x51\x6d\x4c\x49\x47\x57\x3e\xf4\xce\xd8\x76\xb5\xb2\xea\x34\x89\xea\xea\x53\x9f\x55\x7f\x58\xda\x20\x46\x91\xa7\x6e\x29\xc9\x4b\x8b\x05\x38\x23\x2c\x5f\x7d\x0b\xb0\xfd\xd0\x16\x91\x04\x31\x35\x4b\x3e\x1e\x7c\xe6\x2a\xd4\x36\x91\x7c\xd5\xc3\x15\xa5\xbe\x9b\x97\x1c\x80\xf9\x7b\xc9\xd5\xc1\x56\xff\xd6\x4f\xd4\xe3\x1d\xa5\x60\x83\xe0\x2a\x0c\x8f\xce\x55\x4d\xb6\x86\x74\xcb\x62\x70\x0b\xa9\x51\x75\x2b\x82\x9b\x03\xc5\x42\x32\x74\x12\xee\xc9\xcc\xc6\xa5\x0a\xdf\x47\xbb\xee\x15\x44\x66\x82\xda\x2f\xea\x42\x04\x89\x36\xd7\x63\x06\x0c\xd8\xf5\x39\x65\x26\x16\xdf\xa8\x08\xd6\x23\xff\x77\x7b\x41\x13\x65\x2e\x78\x9e\xc0\x25\xb8\x5e\x04\xef\xe8\xad\x4c\x96\x0b\x19\x0b\xf4\xa5\xa6\x32\x4d\x6f\x57\xc1\xad\x22\x01\x8c\x83\xcd\x7e\x7e\x09\x7f\xc6\x7b\x80\x26\x9c\x13\xb4\xdd\x97\x01\xca\x98\xf9\x87\x69\x58\xba\x76\x89\xc6\xf6\xf1\x0a\x73\x2a\x64\xbe\xf2\x2e\x8b\x98\xbd\x30\x4d\x5d\xbf\x4f\xb1\xf9\xe4\xca\x53\x9a\x5c\x4a\xa6\x19\xc4\x4d\x6f\x58\xf8\x24\xb2\xdb\xae\x77\xb7\xe8\x3b\x56\xdb\x5e\x5a\xa7\xb0\xae\x9c\xe1\xcd\x10\xa6\x9f\x04\xa8\x0f\x13\x79\xeb\x0c\x47\x4e\x47\x82\xdf\x0e\x3b\xa6\xa1\x48\x22\x6b\xd1\xa6\x62\xd9\x5e\xe2\xd6\x7c\x52\x07\x33\x3c\xb1\xd5\x41\x76\xd9\xe5\x06\x45\x94\x79\x02\x9f\x31\xdc\xac\xe2\x69\x93\x8f\x6b\xc5\x62\x78\x78\x41\xdc\xfe\x10\x1f\x4d\xb6\x0b\xd6\x60\x16\xe1\xee\xbb\x6b\xfb\xd9\xcd\x83\x04\x2d\xd1\x37\x9a\x46\x4f\x40\x5a\xaa\xe3\xc1\x18\x07\x84\x8c\xc4\xf9\x5c\x3c\xc6\xfa\x92\xab\x4e\xa5\x30\x58\x34\xeb\x86\xb8\x73\xfa\x30\xed\x1f\x7f\x47\x0b\xf6\x63\xf1\xa7\x0c\xf9\xe6\x0a\xb6\x80\xcd\x1d\xbb\xd0\x3a\xc0\x43\x3b\x3d\x4b\xb4\x82\xf8\xb3\x44\xd4\x6b\x3a\xa9\x34\xb8\x63\x3f\x57\x09\x0b\xea\x5f\xcc\xca\x64\x88\x79\x98\x35\xf1\x33\xf8\xbc\xf6\xe8\x87\xca\x59\xd1\x90\x76\xd6\xca\x19\xd4\xe2\x83\x49\x05\x1e\x01\x6b\x03\xe9\xa9\x20\xf4\x12\x0f\xb5\x23\xd1\x37\x1d\x0e\x38\x46\x73\x19\x54\x3f\x12\x7e\xd9\x14\xb4\x3a\xd0\x62\x22\x6a\x53\x65\x82\xdb\x72\x8c\xcd\x76\xe9\x83\xf1\x17\x66\xa8\x86\x3c\x2f\x42\x4f\x65\x50\x8d\xcb\x26\xfe\x0c\x5a\x80\x0c\x35\x09\x39\x60\xa1\x21\x97\x6e\x30\x51\xe2\xef\x1a\x2a\x99\xc1\x2f\xb7\xbd\x8b\xc0\x37\xa4\x39\x68\x68\x06\xeb\x72\x01\x7a\x07\x1a\x91\xb3\xe3\x9c\x90\xe8\x6b\xc3\x35\xf9\xbb\x54\x3b\x12\x7c\x98\x86\x73\x8c\xb5\x38\x06\xb9\xcb\x3c\x25\x94\xc7\xef\xfc\x2a\x59\x20\xaa\x83\x4b\xe6\x5c\x49\xf4\x79\x64\xe8\x9e\xec\x74\x72\x8d\xe7\x71\xf3\xd6\x75\xde\x9d\x1e"}, +{{0x67,0x69,0xcc,0x8e,0x12,0x56,0x17,0xc2,0x2c,0xe5,0x72,0x37,0xa4,0xfc,0xa1,0x50,0x7f,0x94,0x12,0x34,0x66,0x1d,0xf7,0x43,0x28,0xd0,0x4a,0xb6,0x2e,0xf8,0x6c,0x47,},{0x05,0x11,0x2c,0xa6,0x0b,0xaf,0xf7,0x9b,0x49,0x16,0xc1,0xbe,0xe2,0xb9,0x39,0x0c,0x04,0x7a,0xf0,0x8c,0x35,0xeb,0xb3,0xc3,0x81,0xb9,0x74,0x8d,0x1d,0xd4,0xc4,0xfd,},{0xd3,0x9d,0x85,0x3d,0x2c,0x2c,0x5d,0x21,0xb5,0x87,0x1e,0xa5,0xa7,0x5c,0x04,0x10,0x48,0xd9,0x3a,0x47,0xdc,0x59,0x9a,0x5f,0xdd,0xc0,0x85,0x62,0x85,0xce,0x63,0x6f,0xcd,0xfd,0x85,0x64,0x08,0x3d,0x06,0xff,0x28,0x4a,0x52,0x4b,0xc6,0x33,0xcf,0xdf,0xc3,0xb0,0x37,0x16,0x3d,0x67,0x4c,0xb9,0xbb,0x5b,0xa3,0xbc,0x25,0xbe,0xd0,0x0e,},"\x68\x54\x89\x73\x9b\x98\x56\x47\x49\x58\x7f\xf1\xac\x96\xba\x68\x2d\xa3\x0b\x40\xa4\xde\x24\xf5\x4e\xc8\xb0\x83\xdd\xa4\x53\x33\x16\x21\x67\xcb\x3f\x97\xb2\xc7\x31\x4c\xe7\xa3\xf3\xf3\xd3\x19\xcc\xc3\x5b\xb6\xa9\xf0\x07\x7d\x56\x31\x61\xe2\x81\x46\x9c\xf0\x89\x68\xd9\xdc\xf7\xae\x5f\xff\x83\x0a\x5d\xb0\x0b\xc3\x80\x10\xe6\x66\x2d\x49\x4f\x3c\x86\x47\xc4\xf7\x0c\xe2\xd2\x9a\x9d\xa8\x46\x10\xa0\x80\xb5\x75\x9a\x3b\x58\x20\x52\xdf\xde\x66\xe4\xa7\xfa\x5f\xb2\x7f\x06\x50\x73\xfe\x72\x3d\x83\x70\x1d\x5b\xac\x06\xca\x43\xb4\x6d\x1e\x58\x09\x76\x70\xc1\x94\xa1\x3a\xf8\xb5\x73\xa3\x79\x1a\x96\x61\x55\x7c\xbc\x04\x27\x57\xab\x8a\xdd\x0e\xf7\xcf\x4f\x35\x43\x5a\x42\x12\x35\x3f\xcb\x3c\x20\x3c\x73\xdb\xc9\xd2\x68\x52\xd0\xe9\x17\x32\xe3\x62\x1c\xe8\x28\x92\x9c\xdc\xa4\xd9\x19\x20\x48\x75\x19\x22\xed\x22\x5e\xab\x29\x00\xcf\xf9\x71\xa2\xa2\xd3\x42\x46\x36\x48\xbb\xb1\x94\x43\x19\xa8\xef\x6d\x43\xdb\x62\x48\x0f\xbf\x1d\x72\x57\xd2\x26\x94\x53\x97\x93\xf2\x5c\x92\x79\x17\xca\xab\x25\xc1\x19\x3a\x2d\x2b\x23\xbb\x5c\xb8\x56\x9a\xef\xff\x4f\x0c\xa4\x23\xd1\x9b\xbd\x46\xfc\x5e\xf7\x52\x4f\xf8\xcb\x70\x6f\xfc\x47\x07\x65\x09\xc0\x5a\x81\x58\xaf\x77\xf9\x8d\xf6\xa9\xb5\xcb\x32\x44\xab\xa4\xb5\xc5\xf9\xce\x59\x7e\x7d\x29\xba\x07\x01\x3d\xca\xc1\x91\x1b\x6d\xe7\x11\x3c\x73\x6a\x40\x05\xc4\x59\x99\x29\x79\x01\x9a\x45\xb2\xdd\x80\x2a\x07\x66\x09\x09\xeb\x4c\xe2\x05\x40\x81\x70\xd8\x25\x45\xda\xcb\xa8\x68\x6d\xbd\xe9\x27\xdb\xc9\xc7\xd9\x62\x05\x8e\x9a\x95\xea\x66\xb8\xdf\xd3\xea\x43\x53\x57\xa9\x3c\x73\x94\x8c\xd3\x55\xf6\xac\x65\x52\x32\x3f\x17\xc2\xa6\x78\x66\x2b\xc0\xe9\x72\x6a\xd5\xa5\x25\x1d\xd2\x76\x47\x40\x4c\xbf\xe6\x1c\xea\xaf\xdc\xfc\x08\xa4\x75\xff\xd8\x7c\xb7\xf5\x97\xe5\x6a\xc1\x67\x04\x09\xdd\x94\x08\xae\x47\x70\x42\x0c\x6e\x5e\x6d\xd8\xe7\x48\xfe\x03\xa7\x2d\xc1\x28\x03\xd0\x27\x71\xd9\x2f\x47\xe6\xe7\x17\xcc\xc1\x44\xfc\x03\x72\x75\xb6\xf7\x45\xdd\x30\xda\x1a\x45\xd2\x9d\xb6\xd9\x07\x3e\xee\x50\x09\xcf\xd5\x46\x27\x33\x41\x4a\x49\x5f\x34\x9d\xb0\xb6\xdb\xf2\xce\xa9\xcc\xd5\x72\x38\xed\x5e\xe9\x1a\xd8\xbc\x86\x17\x9a\xd5\x69\x5a\x85\xa5\x04\x84\xe6\x17\x75\x1d\xe5\xef\x7a\x7d\x8a\x8d\xb9\x50\xa9\x8a\x6b\x7f\x7d\xee\x9d\x42\xa5\xdf\x69\x2f\xcc\xf5\x55\xc9\x40\xdc\x39\xcf\x2e\xac\x48\xcb\x9d\x15\xcd\xa1\x4d\xd2\xa7\xec\xc0\xb7\x6e\xbe\xc6\x8a\xd4\x17\x7d\x11\x17\xe0\x77\x66\xc4\x85\x90\xd4\x3c\xa7\x66\x28\x68\xeb\x97\x90\xac\x29\xf4\xf2\x39\x2b\x9a\x93\xf8\x97\x59\xe7\xba\x54\x6b\x92\x5b\xd8\x6f\x80\x7d\x8d\x16\xc7\xe6\x37\xdc\xc6\x66\xe9\x05\x90\xbf\x43\x0d\x98\x6a\x67\xf1\xb0\xc7\xc2\xc9\x49\x30\x84\x58\x69\xed\x8d\x8a\xdd\xe1\x8f\xc1\x88\x74\x56\x88\x1b\x4b\x26\xb5\x3d\xcb\xa7\xa5\x26\xf0\xec\xa1\x4e\x8b\xb6\x89\xd6\x6f\x0a\xa1\xb2\x53\xc3\xdc\xfc\xf5\x95\x40\xd5\xd2\xf5\xad\x61\x7f\x52\xc3\x09\x38\xa5\xa9\x2e\xa3\x85\x07\x7d\x75\xaa\x4a\xc0\x7a\xfc\x2b\x35\xfb\x8c\x1d\x5e\x78\xeb\x29\x5f\xc2\x0f\xe3\x7c\x41\xac\x06\x95\x9d\x3a\x17\x97\x84\x3a\xd7\x05\x6c\x1b\x41\x2d\xd0\xb4\x80\xaa\x3b\x39\xbc\xc2\x05\x87\xd9\xa0\xfe\xf9\x2c\x6c\x95\x0e\xbc\x5b\xb8\xe1\x42"}, +{{0x1d,0xf7,0xac,0xfb,0x96,0x33,0x04,0xe5,0x1e,0xc4,0x71,0xca,0xf1,0x81,0x10,0x25,0x56,0x78,0x3c,0xb7,0xd9,0x1e,0xad,0x30,0xbd,0xc2,0x53,0x4d,0x07,0x8a,0x14,0x88,},{0x05,0xa3,0x1f,0xfc,0x70,0xe4,0xe3,0x56,0x9f,0xc2,0xbe,0x11,0x0c,0x64,0x3a,0xd5,0xf0,0x87,0x91,0x3c,0x7a,0xa4,0x76,0xdc,0xd8,0xd6,0xe4,0xbc,0x7e,0xc2,0x2d,0x24,},{0xb1,0x81,0x93,0x8d,0xe1,0x01,0x42,0xf3,0x24,0x07,0xb4,0xe7,0x86,0xcd,0xdd,0xe9,0x32,0xeb,0x11,0xdb,0xc0,0xbf,0x0e,0x5a,0xc5,0x09,0xfa,0xe7,0xa5,0xbc,0xc3,0x29,0x61,0xfe,0x34,0x48,0xf9,0x12,0xc8,0x50,0x0f,0xc6,0xdb,0x4e,0x1d,0x32,0x62,0xa8,0x3c,0x9d,0xbe,0x76,0x9b,0xb8,0xc3,0xa7,0x61,0x00,0x0f,0xe3,0x6c,0x0d,0x71,0x04,},"\xb0\xc3\xee\xb5\x7f\x14\x60\x6a\xb7\xab\xea\xb2\xee\x05\x73\x84\x3c\xa2\x2e\x6d\xb2\xfd\xf2\xc9\x06\x4c\xea\x51\x98\xdc\x58\x30\xeb\x15\x8d\xa8\xe2\xda\xa8\x88\x57\xaf\x8b\x8e\xef\xcc\xf0\xc2\x6c\x3e\xc0\xf3\x30\xe9\x2c\xff\x06\xbc\x05\xa2\x9b\xfc\x99\xf9\x40\xb6\x1f\x3c\xfb\x29\x64\xb3\x37\x09\x7a\x65\x50\xa3\xe9\xa3\x28\xc8\x5b\xe6\xf1\x60\xd2\xc0\xa5\x7f\xf6\xf1\xb3\xc5\xff\xcc\xa8\x90\x89\x42\x5a\xb6\xbe\x01\x72\xe1\x75\xba\xf4\x0c\xf1\x2b\x24\xa8\x15\xf7\x0f\x29\xa3\xa4\xcd\x0a\x6a\x13\x2f\x12\x00\x97\x75\x2f\x4b\xc7\x43\xed\xe0\x8f\x5f\x21\xd4\x2f\x28\x2f\x76\x71\xf7\x78\x3e\x27\xb2\xa8\xe2\xc1\x46\x92\xf1\xe0\xe5\xde\x82\x85\x5d\xab\xf9\x8a\x1a\x63\x97\x60\x06\xff\xbf\xe5\xf5\xa5\x79\xb4\x60\xe2\x6d\x06\xbd\x54\x28\x42\xa5\xf9\x26\x1b\xbf\x26\x04\x51\xd2\x32\x1c\x50\x89\x32\x01\x3c\xc6\xe9\x04\xf7\x9b\x5e\x46\x86\xd0\x33\xe1\x2c\x7b\xbd\x7e\xb1\xc9\x23\x79\xc5\xec\x34\x1b\xf6\x45\x7a\x3f\x17\x26\x4a\x7c\x27\x8b\x27\x50\x1e\xca\xed\xc3\x61\xeb\xa8\x44\x44\x23\x42\xb4\xb1\x0f\xa9\x4d\x26\x58\x65\x11\x6a\xcf\x43\xfc\xbe\xc9\x65\xd2\xab\x4b\xbb\xe6\x14\xc4\xf9\x0a\xb6\xb3\xe0\xd5\x38\x3f\xa0\x49\x88\xbf\xbb\x26\x03\x07\xdd\xe2\x2d\x84\x09\x8b\x63\x31\xd1\x55\x14\x1a\x92\x7b\xb7\x8d\x66\x4b\x34\x1d\x2f\x2a\x93\xe2\x91\xcf\x79\xba\xae\xcd\x26\x12\xf6\xb1\x04\xf3\xfc\x81\x37\x3a\x7c\x6a\x04\x5b\x59\x24\xbf\x95\x0c\xd5\x42\xf7\xb7\xac\xce\xf3\xaa\x7d\x72\x5d\xe0\x53\x05\x5d\x95\x1b\xd7\x68\x11\x13\x92\x59\x66\x38\xae\x09\x71\x70\xf4\x49\x2b\xa5\x0a\x46\x8f\x8e\x34\x77\x63\xdb\x61\x2d\x3c\x7d\xe7\xe5\x64\x59\xb2\x6e\xe0\x29\xc6\x30\x82\x7a\x35\x3a\xee\x73\xde\x68\xd6\xd7\x2b\x27\xaf\xd7\x5d\x22\x16\x45\x27\x94\x5c\x72\x26\x84\x4f\xab\x15\xb8\xdc\xc9\x14\x34\x9e\x31\x41\xc6\x13\x16\xad\xc8\x94\xde\xdc\xdc\x84\x39\x84\xd9\xc7\xfe\xae\x39\xdb\x33\x2d\xc3\x93\xe9\xe8\x96\x1b\xbd\xe0\x71\xc3\xd2\x85\x8b\x3c\xb5\xf3\x3b\x16\x4a\x15\x61\x6c\x6f\xe1\xbb\xc2\x4a\x35\xf2\x13\x36\xd2\x61\xc5\xd8\xcf\x75\x9e\x27\xe2\x2c\x91\x01\xc4\xae\xbd\xe3\xe1\x26\xcf\x64\x6c\xa7\xb2\xe0\x31\x28\x09\x5c\x59\x76\xbf\x3f\x6e\x49\x1a\xf0\xf0\xb6\x40\xc7\x31\x09\x66\xac\x59\xc5\x9f\xbc\x5b\xfe\x05\x48\xf8\x8e\xe6\x1a\xd9\xec\x40\xc1\xc0\x6d\xd2\x9d\x79\x4c\x44\xa3\xea\x22\xc3\xd4\x76\x26\x22\xec\x1e\x8b\x33\x3e\x45\x07\x4d\xb9\x37\x41\xfd\xa1\x93\xc9\x11\xf6\xdb\x58\x79\xe5\x5e\xe3\x6e\xf6\x02\x61\x4a\xe6\x4a\x5c\xde\x9d\x83\x06\xd2\x2f\xbc\x4a\xe9\xc8\x81\xa5\x94\xbd\xe6\x79\x61\x25\xfc\xb6\x28\xb9\xf3\xb6\xfb\x3f\xfd\x51\x1b\x35\x3f\x14\x6a\x27\x27\x2a\xfd\x3e\x5d\x28\xb7\x7f\x58\xa6\x7f\x1f\xd2\x72\x85\xc2\x5e\xcc\x1c\xcf\x64\xe3\x8d\x21\xf3\xb9\xff\x22\xe0\x0e\xe9\x00\x62\x9e\xf1\xa6\x3e\x71\x3f\x25\x88\x83\xdd\x91\x1f\x30\xc0\xd3\x98\xb7\x4b\xd7\x97\x14\x9b\xe5\xe2\x69\x67\x22\xda\x09\xd5\x2d\x4e\xbf\x3c\x67\x39\x29\xd2\x98\xaa\xc3\x4c\xe0\x5b\xea\x08\xea\x9a\x42\x4e\x93\x45\x9c\x2e\xb8\xfc\x22\x22\xc3\x1c\xc1\x3d\x80\x3b\x90\xa8\xa7\x0b\xcd\x0a\x30\xc2\x09\x21\x1d\xc2\xcc\xc8\x5b\x0b\xcd\x45\x82\xc6\x95\xf5\x8d\x80\xbf\x6e\xc4\x71\xa2\x50\x5f\x68\x84\x7a\x75\xf6\xe9\x11\xfd\x87"}, +{{0x7e,0xd8,0x7c,0x36,0xdf,0xdb,0xae,0x60,0xc9,0x40,0xa3,0xb3,0x25,0xc1,0x9f,0xde,0xd8,0x14,0xd7,0x6a,0x54,0x48,0x20,0xa3,0x2f,0x28,0x6a,0x5c,0x0a,0xd7,0x1d,0x72,},{0x3c,0x4a,0xc5,0x10,0xb3,0x62,0x22,0xc2,0x52,0xa2,0xdc,0x1a,0xfc,0xb4,0x0f,0xb0,0xeb,0x85,0xbc,0xa9,0x03,0x91,0x19,0x6a,0x58,0x83,0xaa,0x2c,0xc9,0x12,0xb2,0xdf,},{0x57,0x9b,0x38,0x12,0x4b,0xd0,0x59,0x1a,0x59,0x7c,0xc9,0xa3,0x89,0x12,0x7c,0xea,0xf5,0x51,0x56,0x07,0x73,0x63,0xed,0xb8,0x11,0xd0,0xb6,0x55,0x52,0xac,0xfc,0xc6,0x77,0xb2,0x72,0x94,0x21,0x99,0xca,0x25,0xab,0x79,0x0d,0xe6,0xe0,0x84,0x60,0x3a,0xd1,0x05,0x2e,0xc2,0x10,0xcf,0x6f,0xcb,0x14,0x17,0x28,0x90,0x67,0xce,0x3c,0x08,},"\x62\xd3\x13\x91\x2a\xbb\xb0\x06\xb7\x77\x4a\x67\x37\x71\x4a\x34\x99\x70\xce\x04\x21\x11\x2f\x40\x04\x63\xd3\xdb\x0e\x2f\x7f\x12\x8d\x7b\x96\x93\x9f\x43\xc1\xe7\x10\x7b\x51\x18\xa7\x7c\x11\x96\x83\xd8\x66\xb7\xe3\xd7\x2a\xc2\x1f\x6b\x42\x72\xb4\xbe\x92\x89\xb6\x55\x6f\xe3\x1b\x60\x51\xa0\xb4\x2e\xd5\xea\x0c\xf3\x47\x69\x6d\x30\xfb\x8b\xff\x6b\x8b\x57\x27\x19\xde\x19\xa2\x31\xcc\x85\x45\x9a\x99\x0c\x37\x80\x1f\x08\x37\x18\x6c\xef\xbb\x55\x21\x56\x96\x66\x96\x7c\xd4\x24\x3d\x73\x07\xf1\xb0\xb2\x4c\x8e\x2b\x9b\x69\x23\x17\x30\x4f\xbe\x3d\xd0\xa2\x63\x65\x01\x91\xb3\x52\x16\xf5\x29\x16\x57\x3a\xf9\x05\x24\xf9\x1d\xb1\xa9\x24\x71\xd7\x58\xc9\x2d\xc6\xd1\x4d\x1a\x4b\x26\xf4\x1b\x40\x40\x3c\xa8\x7d\xcf\xab\xdc\xa4\x7b\x9f\xc2\x53\x35\x78\xf1\x61\xf3\xb0\x19\x9b\x5c\x69\x8e\x08\x07\x04\xb2\x1c\x9e\x61\x52\x69\xfc\xd0\xd4\x04\x39\xed\x8b\xc3\xbd\xfb\xc9\xaf\xb4\x4c\x11\xfa\x89\x27\x5f\x0e\xaa\xa5\xd0\x8f\xa9\x59\xd6\x37\x8d\x0d\xb8\x99\x10\xd4\x8f\x2d\x86\xa1\xeb\xfc\x5c\xbf\x10\xeb\x2d\x5a\xad\xf5\x1b\xbd\x83\x44\xff\x8b\xbb\x5b\x8a\xfe\x05\xa4\x50\x11\xb5\xe4\xb7\x2e\xb8\x64\xad\x26\x3e\x8a\x03\xa6\xc7\xf9\x8a\xee\xb3\x54\xf7\x30\xa3\x18\xaa\x30\xfb\x56\xd3\x3d\x80\x74\x8c\x98\xeb\xec\x15\x87\x8c\xcf\x3c\xe8\x22\xf6\x9d\x34\x56\x84\x3c\x40\x0d\xc5\x6b\x48\x1a\x95\xe6\x88\xb8\xa4\x73\x5b\xf3\x84\x3f\x58\x33\xdd\xa0\xef\xe0\x9e\x71\x75\xb5\x67\xc6\x61\x38\x7a\xfd\x2e\xbc\x07\x9a\x48\xe3\x49\x67\xec\x97\xb9\x27\xdf\xa5\x81\x88\x8f\x23\x1a\x98\xa7\xed\x33\x10\x3b\xfa\x8e\x8f\x9b\xa6\x51\x35\x27\x90\x0b\x39\xb8\x62\x31\xda\x79\x11\xa2\xfc\x93\x58\x88\xa7\x5f\x11\x29\x58\x4a\xff\xf2\x02\x52\x49\xc4\x18\x8f\x09\x05\x2f\x85\x68\x77\x06\xd0\x5e\x29\x91\x44\xd4\x0d\xe8\x89\x8b\x7c\x8b\x2d\xfe\xf0\xc3\x70\x85\x73\xd8\xb0\x56\x3a\x6b\xd0\xa5\x04\xc0\xb6\x74\x57\x02\xb1\xb5\x71\x21\xc6\xf0\x40\xaf\xf2\x71\x98\x94\x8b\xa6\x9c\x21\x25\x3a\x28\xd3\x9e\xba\x72\x62\x19\xbe\xda\x1f\x82\x09\xfb\x83\xe9\xad\xb0\x7a\xd4\x09\xfb\xd6\xd2\x55\x65\x88\x9a\xb4\x51\x23\xf9\xd9\x45\xec\xd7\xd9\xca\x70\x28\xec\xe0\x92\xe3\x5f\xbb\x7c\xb3\xf3\x28\x12\x6e\xfd\xda\xc5\xd8\x59\xf2\xb2\xc6\xeb\x09\x01\x33\x69\x0e\x20\xc1\x7d\xea\xf3\x88\x26\x85\xf0\x7e\x9e\xd2\x65\x3b\x80\x3b\x9b\x38\x3b\x70\x74\x8a\x1f\xa9\x2c\x86\xf8\x6d\x6c\x47\xea\x87\xb1\x0b\x12\xe3\x63\xba\x50\x80\x60\xf4\x7c\xe2\xa2\xf3\xb6\xa3\xee\xfc\xd4\xda\xcf\xc7\x1c\x41\xf4\x36\xfe\x0c\x2b\xc3\x4d\x4b\xaa\xd4\x95\x74\xe7\x44\x3c\x12\x6a\x58\x9f\x6e\xf7\xbc\xa4\x49\x54\xf0\xbb\x28\xec\x71\x51\xb0\x51\x1c\x23\xc6\xbc\x42\xd5\xe8\x59\x83\xec\x16\xbb\x5f\x50\xa3\x82\xd6\x88\x15\x0a\x49\x60\x9c\xbd\xe5\x69\x8e\x86\xdc\xbf\x02\x12\xc2\x29\x22\x99\xdc\x4d\xcf\x87\x42\x9f\x6c\xd2\xee\xc8\x09\x48\xce\x86\x7e\x25\xc9\x45\x84\xcd\xc6\x4b\x09\x90\x29\xeb\x85\x4e\xdc\x26\xea\x21\x42\x1e\xff\x48\xcf\x4e\x41\xf4\x9e\x2d\x89\x47\x8d\xef\x06\xc4\x2b\xea\x22\x0a\x13\x3e\x50\xf5\xc7\x44\x64\xc7\xe7\x3f\xb1\xc1\xa7\x7c\x50\x7c\xf6\xcd\xa8\x5b\xe4\x02\xb7\xe6\xd6\xd2\x1e\x81\x0d\x6d\x0b\x59\x72\xb9\xfe\x77\xe5\x4e\x74\xae\xe1\xf3\xbb\xfd\x6e\x7d\xe6\xb5\xc0"}, +{{0x6a,0x29,0xf8,0x1b,0x8d,0x9a,0xa4,0x8a,0x1b,0x23,0x36,0x4e,0xac,0x8f,0x6a,0x4b,0xdd,0x60,0x7a,0x84,0xcf,0xe8,0xe8,0x8d,0x90,0x17,0x5d,0x80,0x64,0x3a,0x58,0xa8,},{0x4c,0x3b,0xe3,0xa2,0xa8,0x42,0x5f,0xf3,0x1c,0x3a,0x0d,0xb4,0xa5,0x2a,0x0c,0xb1,0x41,0x6c,0xeb,0x48,0xcc,0x3e,0x4c,0x28,0xa4,0xf2,0x28,0x4a,0xb3,0x46,0x07,0x15,},{0xdf,0x09,0xcb,0x9b,0x87,0x8d,0x3d,0xc9,0xe5,0x42,0xdb,0xac,0x28,0x94,0x3e,0x28,0xe4,0x1d,0xce,0xcb,0x92,0xcb,0x7e,0xa4,0x40,0x09,0x88,0x5e,0x46,0x49,0x97,0x43,0x33,0x05,0x61,0xba,0x1d,0x36,0xae,0xdd,0x46,0x76,0x75,0xfd,0xca,0x2b,0xaa,0xa4,0x70,0x1b,0x6f,0xad,0x97,0x9f,0xd8,0x39,0xc4,0x70,0xd1,0x3c,0x82,0xda,0xa9,0x05,},"\x78\x76\xa3\xf4\xeb\x69\xbb\x7e\x54\xe9\xff\x95\x4e\xbd\x3b\x10\xb9\x3a\x4c\x1a\xfe\xae\x92\xfa\x03\xc1\x03\xcb\x63\x13\xa2\x01\xc5\xb3\x3a\x9a\x72\x23\x75\x5c\xb5\x10\xe2\x5e\xc5\x82\xb5\x4e\x81\xb8\x49\x56\xf6\xc5\x3f\x1f\x08\xa6\x3b\xf0\xc4\xa2\x61\xaf\x45\x0e\x52\x3f\xe8\xf6\x1d\xdb\x3c\x0e\xea\xb8\x75\x10\x72\x68\x88\x01\xb2\xa4\x73\xb7\x1a\x2e\x38\x70\x8d\xa6\x8c\x2f\x37\x92\x5c\xb0\x5a\x20\xc4\x28\x3b\x3a\xf9\x7b\x6f\x0b\xa6\x5a\x54\x03\x55\x43\x75\xe2\x15\xd9\xe3\xaa\x1b\x0f\x9f\xdb\x0f\x84\x99\x23\xed\xbd\xaa\x0a\xb4\x81\xc5\x45\xa5\xdf\x8f\x51\xd1\xf6\x8b\x22\x35\x07\xea\x0e\xcc\xfa\xeb\xb5\xfc\xcf\x5e\x3d\xfa\x65\xa4\x4e\xea\x50\x45\x68\xa8\x81\x80\xa0\x60\xbb\x06\xc5\x15\x57\xb8\x1e\x66\x7b\x4b\x04\xe3\x21\x0f\xa4\xc3\x79\x87\x6c\x49\xf3\xe5\x6b\xf2\xbe\x1c\xf5\x19\xa7\x41\x83\x93\xd2\x40\xdc\x8a\x22\x4c\x6c\x38\xac\x2a\xb9\xd8\xfa\xdf\xc5\x36\x20\x30\xc7\x93\x0c\x3c\xe7\x79\x5b\x14\x7c\x26\xc8\xa2\x8c\x65\x34\x29\xd9\x0a\x17\x3a\x86\xa8\xb1\x8a\x00\x9e\x62\xae\xf6\xec\xa9\x5d\x39\xbd\xbe\x45\x64\x77\x78\xa2\x53\x2a\x41\x5a\xe1\x9b\xad\x23\x11\x29\x12\x78\x42\xfe\x1d\x0f\x11\xfa\xb4\xa1\xcf\x0b\x17\xe4\x98\xcd\x59\x52\xc9\x39\xe0\x90\x09\x02\x87\xb1\x44\x89\x5d\xff\x00\xce\xc8\xd6\xae\xda\xf6\x24\x81\xa4\x17\x83\xe0\x21\x08\x2c\xe3\x52\x06\x3e\x62\x81\x1f\xd9\x99\x90\x10\x4d\x8a\x46\xcd\xca\xee\x2b\xab\x45\x8e\x52\x47\xfb\x02\x3e\x92\x33\x30\xa4\x28\xc7\xbc\xfd\x20\xb0\x8f\x52\x0e\x89\x46\xdd\x65\x83\x47\x35\x2a\xe0\xc4\xbe\x73\xc3\xd5\xec\xcd\x11\x14\x9f\x3a\xb7\xb8\x05\x2c\xfd\x95\xc3\x5d\x41\x64\x54\x6f\x5d\x8f\x37\x75\x17\xa7\xf4\x32\xc0\xd5\x56\x3a\x7b\xcc\x7b\xd1\x19\xd3\x42\x1d\xfe\xba\xae\x84\x45\x99\xb2\x9b\x38\x3b\xb8\xd5\xdb\xf1\x40\xd9\xbd\x47\xa0\x78\xb7\xae\x7c\x6a\xa8\x7b\x1e\x29\x23\x6c\x9f\xcf\xd6\x54\xb7\xf8\x09\x79\x4c\xcc\xb2\x61\x58\x8e\x18\xde\xc6\xc4\x04\x6a\x93\x40\x67\xd0\xdf\xa0\x37\x91\xd0\x3d\x83\xb7\x18\xac\x4d\x24\xdc\xe7\x85\xa3\x02\x8d\xe0\xc9\x59\x2d\xba\x7c\x5c\x58\x45\x18\x4a\xfc\x9c\x0d\xfc\xf9\x40\x95\x86\x0f\x0e\xb8\x02\xeb\xea\x20\x17\x8e\x78\xb5\x64\x2e\x5d\xd6\x1c\x33\xb3\x97\x69\x05\x2d\x9d\x85\x4d\xce\x90\x2f\x47\x6e\x21\xf9\x6c\x65\x0b\x46\x3b\x7b\xc3\xd0\xff\x29\x96\xb6\x5c\x57\x83\x1f\x8b\x7c\x0f\xb9\x15\xf4\xdd\x72\x26\xac\x95\x5c\xbc\x7d\xfb\x03\xf9\xb7\x58\xdd\x3e\x0d\xfc\xe2\xe0\xe5\x80\xc9\x1a\x30\xc7\x83\xff\x56\x7b\x17\xf1\x2d\xfd\x5d\x31\x37\x64\x6e\x20\x01\x1c\xdc\xaa\xe1\x11\x02\xdc\x71\x68\x86\xcb\xf1\x23\xc0\x94\x88\xb1\x73\x63\x6a\xbd\x54\xe9\x62\xca\xee\xc9\x7d\x5e\xb9\x40\x68\x2e\x70\x3b\x73\x0f\x61\x56\x2c\xd1\x4b\x9e\x65\x61\xb5\xe9\x3f\x60\xcd\x0e\x1e\x86\xd1\xa1\xb4\x71\x9c\x5b\x50\x82\x42\xbd\x6b\x2d\x9a\x54\x8f\x59\xbb\xb8\x75\x07\x59\x69\xef\x20\x32\xf3\x19\x6b\x8a\xec\xcc\x45\xa4\x4d\x9d\xbd\xaf\x87\x8e\xd1\x6f\x1d\x85\x5e\x89\x18\xed\x65\xa4\x5e\xe5\xc7\xfa\x32\xa1\xec\x69\x32\xa1\x59\xcf\xb5\x0f\xfc\x87\xbe\x06\xdf\xcf\x72\x28\xae\x88\x70\xcc\xd3\x57\xfc\x65\x6e\x33\xfa\x4b\x6b\x8b\x7d\x1a\x72\x15\x55\x3c\xab\xac\xc7\x0a\x39\xc9\x80\xb9\x71\xe5\x1a\x17\xed\x63\x18\xb4\x3b\x29\xbb"}, +{{0xef,0x12,0xdf,0x47,0x9d,0x98,0x3a,0xd9,0x6e,0x8b,0xa6,0x53,0x30,0xb3,0x6d,0x49,0xaa,0xdb,0x98,0x31,0x64,0xe1,0xc0,0xb4,0x52,0xb5,0x60,0xde,0xd1,0xd0,0x8d,0x60,},{0xf7,0x61,0xcf,0x28,0x26,0x92,0x7a,0x7c,0xda,0x8c,0xb0,0x4f,0xaa,0x2c,0x59,0xf8,0x42,0x5a,0x8f,0x7d,0x39,0x8f,0x76,0xe8,0x67,0x02,0x1c,0x95,0x1f,0x07,0x38,0x09,},{0x4c,0x80,0x10,0x86,0x6d,0x91,0x15,0xf0,0x52,0x93,0xb9,0x34,0xca,0xc6,0x81,0x04,0xcc,0x2c,0x34,0x37,0x56,0x8c,0xb9,0xd5,0xc5,0x70,0xb1,0xa8,0xbe,0xe7,0x06,0x60,0x30,0x75,0x53,0x70,0x33,0xbd,0x70,0x8a,0x9c,0x9f,0x3d,0x1e,0x25,0x19,0xa9,0x15,0xb1,0xc4,0xae,0x4c,0xcd,0xdf,0xcf,0x0e,0xd0,0xc0,0x49,0xd3,0x42,0xa0,0x2e,0x02,},"\xe5\x8f\x34\xda\xea\x75\x5a\xc4\xe4\x13\x33\xd6\xf0\xed\x01\x35\xf7\xdb\xce\x50\x30\x9b\xb1\x95\x6b\xc7\x1a\xcb\x12\xc7\x70\x67\xa6\x47\xff\xd8\x6a\xa5\x87\x0c\x0c\x00\x07\xe8\xf9\x95\xa2\x2b\x88\xc4\x67\xde\x22\x54\x44\x54\x42\x01\xc5\x57\x49\x5e\x25\x3e\x33\x19\xcc\x5c\xa3\x76\xd3\xe7\xcc\x1e\xb4\x67\x34\x6e\x52\xad\x95\x6a\x6f\xa7\x33\x72\x0b\x17\x11\x7b\x5b\x75\x85\xe4\xd5\x59\x40\x9a\xae\xfa\x95\x58\x0f\x91\xe5\x02\x01\x5f\x49\x7c\x5c\xdc\xb7\xd4\xd5\x61\xf5\x44\xef\xa3\x5c\x1e\x2a\x53\xb7\x2b\xdd\xec\xee\xc2\xd1\x05\x0f\x17\x7d\x48\x0f\x68\x74\x05\x66\x4d\xfd\xde\xc0\x6e\xee\x4b\xd1\x47\xa9\x12\xfd\xbf\x74\xf2\xa9\x5d\x1f\xd1\xe1\x12\x68\x69\x4c\xe4\xd4\xec\x4f\xff\xd6\xdd\xb3\x25\x4d\x36\x0f\x23\x6f\xab\x4d\x1a\x17\xf8\xd0\xd1\xa5\x11\xf9\x44\x69\x2f\x23\x96\x39\xae\x03\xd6\x4f\xac\xec\x65\x38\x42\x7a\xb7\x1f\x71\x27\xf4\xa2\x76\xf9\xbc\x45\xbb\xa6\x11\xdf\xcc\xe6\x44\x6c\xc1\x39\x68\x97\x6c\x8b\xb6\xd6\xfe\x21\x06\xd7\x05\x92\x2d\xca\xc9\x56\x96\x6a\x76\xd4\x8f\x2a\xff\x4b\x86\x51\x4e\x39\xa6\x7e\x16\x43\xfc\xc3\x21\x85\x80\x24\xe6\x93\x18\x98\x33\xc8\xad\x59\xb4\xb6\x25\x29\x8e\xba\xfe\x64\x62\x6b\x48\x0f\x32\x6f\x13\x40\x72\x3c\xb3\xd3\x83\xf4\xfc\xcb\xfc\x23\x7a\x3f\x4c\x4f\x7e\xcf\x0b\xa4\x36\xb3\x2c\x2f\xe3\x51\x79\xda\x93\x11\x1b\x48\xcc\x9e\xa2\x42\x02\xbd\xc1\xb2\xfb\x60\xa4\x31\x9d\xfd\x98\x64\x47\x0f\x73\xf5\x41\x37\x20\x6e\x0b\xf0\x07\xf5\xae\x88\xa8\x87\x47\x00\x8a\x60\xf4\x78\x9a\xd1\x67\x72\x4f\x17\x9c\x02\xb6\x3a\xed\x00\x25\x73\xd2\x8a\x6b\xcf\x88\xe0\x7c\xe8\xda\xea\x5d\x5f\x1a\xcf\x48\x7b\x4c\x5c\x16\xc2\xbf\xe1\x12\x31\xea\x5e\xa7\x63\xe8\xf3\x32\xcc\x73\xda\x1b\x2f\x8c\x19\x8e\xa8\x17\x3f\xd3\x3d\x4b\x2a\xe6\x9e\x5d\x4d\x1a\xad\xdd\xf2\xfd\x82\x1b\x85\xbe\x45\x15\x19\x62\xd1\xf9\x9d\xf8\x13\x08\x61\x88\x52\xad\x7c\xf4\x1d\x72\xda\x08\xa1\xb3\x9d\xf7\xd8\xb9\x94\xb4\xdd\xff\x37\xf9\xdf\xe8\xf3\x8c\xe3\x0e\x91\x06\x1d\x95\xd5\x8f\x7a\xe8\x26\xb0\x23\x85\x27\x2e\xc0\x9f\x01\xa7\xb3\xe4\xb3\x91\xd0\x9b\xce\xd6\x65\xda\xd6\x95\x05\xb4\x19\xda\x84\x81\xbc\x37\x92\xbf\x8b\x8e\x7a\xd6\x4b\x63\xf2\x45\x66\x6c\x8c\x32\xfd\x5c\x1b\x1b\x48\xc9\x95\x1e\x1c\x21\xa1\xeb\x5f\x50\x7c\xff\x13\x7c\xfb\x86\x2c\x2c\xc9\x87\x66\xe8\x78\xc9\x30\xa0\x83\x82\x8c\x9d\x8d\xb1\x8b\xf1\x67\x16\x68\x5f\x39\xd6\x57\x2a\x8c\xa8\xb2\xa5\x14\xf7\x70\x03\xd4\xe7\x5b\xc1\x54\xae\xbf\x14\x10\x37\x78\xf3\x65\xb1\xc3\xf0\x35\x41\xdd\xbd\x07\xd6\xe2\x3e\x56\x76\x2d\x97\x1e\xb0\x29\x83\xe9\x3c\x4e\x01\xba\x4b\x8a\x21\x78\x92\x8c\x43\x37\xd3\x02\xf3\x1c\x9c\xcb\x75\xb2\x49\xa8\x2d\xc9\x68\x21\xe9\x5a\x03\xab\x6b\x77\x0d\xf2\xc3\xdf\xdb\xf1\xfe\x97\x73\xf8\xbc\x1b\xc5\xb3\xaf\xa0\x44\x0b\x10\x25\x78\xf3\xd2\x13\xc8\xd0\x19\xcf\xf1\x24\xf7\x5c\xe4\xac\xcc\x8c\x66\x7f\xeb\x27\xc7\x51\xa6\x12\x00\x74\x81\x31\x04\xe0\xcd\x07\x0c\x9f\x5e\x45\x1d\xcc\xff\x4c\x80\xd7\x11\x07\xc9\x75\xab\xfa\xc0\x7d\x4d\x27\x0c\x72\x7d\x8a\x2f\xec\x34\x9b\x53\x39\x68\xe2\x71\x89\x2d\x2b\x62\xc1\x25\xfb\x79\x74\x60\x3c\x30\x5e\xa3\xbf\xa3\x0f\xb6\x10\xfc\x5a\x23\xeb\x68\xa8\x40\x64\x44\x39\x1a\x52\x13\x37"}, +{{0xf7,0x31,0x31,0x7c,0xf5,0xaf,0xfe,0x58,0x70,0x4c,0x4d,0x94,0x97,0xae,0x86,0x0b,0xbf,0x73,0x9d,0x0f,0xd9,0x6b,0x7c,0x02,0xef,0xb6,0x77,0x7b,0x3c,0x85,0x8a,0x19,},{0xd7,0xd6,0x38,0xae,0xcc,0xe1,0x46,0x1e,0x31,0x42,0x55,0xaa,0x29,0xd9,0xa6,0xb4,0x88,0xae,0xa1,0x39,0x6e,0x96,0x82,0x69,0x5a,0x47,0x0e,0xff,0x23,0xf3,0xed,0x84,},{0x2a,0x4f,0xea,0x98,0xf9,0x24,0x01,0x71,0xa1,0x82,0x3f,0x2f,0x69,0x35,0x20,0x62,0x67,0x2e,0x6c,0x6e,0x66,0x52,0xd3,0x88,0xa8,0x77,0x14,0xd6,0x47,0x99,0x5d,0xf7,0x5b,0x6e,0x1e,0xd1,0x74,0x6a,0xf2,0xad,0xf4,0xe8,0x06,0x13,0x5d,0x60,0x75,0x4e,0x60,0xfe,0xa0,0x32,0x12,0x8e,0x35,0xab,0xc1,0xf1,0x61,0x51,0x81,0x12,0x5f,0x0b,},"\x16\xf5\x1c\x59\xe9\xae\xfc\x26\xb0\xda\x5e\x00\x85\xeb\x2e\x2f\x1f\x85\x6d\xef\x97\x25\x76\x9e\x3a\xf1\x2f\x86\x09\x05\xae\x13\x3f\x65\x07\x4d\xa7\x6d\xbf\x25\xc6\x7f\x62\x57\xd2\xdc\x66\xc0\x5f\x9b\x31\xae\x17\x7b\x69\x92\x9f\xc1\x83\xb5\x88\xc5\x19\xbc\xa1\x47\x96\xa0\x89\x6d\x29\x05\xfd\x94\x2d\x7a\xb4\xa3\xfd\x95\x41\xa5\x52\x9f\x72\x9c\x58\x51\x41\x9b\x5f\xbe\xf7\xb1\x34\xd6\x76\x2e\xb9\x7e\x8a\x95\x1a\x8f\xf5\x2a\xa0\xd7\xe6\x74\x44\xd0\x6b\x07\xaa\x55\xe4\xeb\x9a\xb8\x92\xf4\x7b\xfd\x11\x1d\xf5\xb6\x2f\x6f\x3f\xd1\xa5\xed\x84\x12\x5f\xee\xbb\x77\xda\x63\x7c\x05\xd5\x26\x5c\xed\x11\x3d\xfe\x87\x82\xdb\xd1\xce\xcd\x2c\x6c\x03\x2b\x8f\xa8\x85\x5b\x3a\xe7\x8d\xe7\x4f\xaa\x5a\xa2\x0a\x76\x14\x63\xc2\xa3\x0b\xe6\x6b\xd3\x8c\xde\xc7\x5f\x89\x57\xcb\x94\xc1\x13\xa4\x5d\x54\x6d\xaf\x47\x5d\x89\xaa\x14\x82\xf8\xd2\x80\x3a\x23\xc9\x39\x20\x20\x15\xa0\x8e\x94\xb1\x32\x72\x8f\xbe\x8f\x60\x19\xd7\x16\x8a\x08\xa5\x93\x01\x70\xe5\x63\x9d\x11\x0e\x47\x39\xdb\x85\xe6\x1e\x64\x49\x59\x44\xb5\x42\x3a\x74\xad\x5a\x8a\x0a\x51\x06\x12\xec\xe6\x55\xce\x18\x86\x40\x51\x52\x5b\x90\x8e\x0b\x19\x29\x0a\xbe\x8b\x11\x82\xc4\x8c\x70\x0d\x35\x05\x15\xfd\x34\x99\x56\xe8\x08\x73\x27\xf3\x0b\x6f\xc3\xf1\x31\xc2\x14\x4a\xbb\x3f\x0e\x9c\xa3\x31\x17\x2b\x35\x06\x4a\x82\x81\x1a\x68\xe2\xcf\x36\xb4\x3e\x3a\xd2\xe8\xdf\xa5\xb1\xce\xf5\x0e\x2a\x60\x29\x3f\xc5\xf6\x35\xc9\xa9\x99\x8d\x8c\x1a\xd2\x96\xe7\xc7\x8f\xc0\x58\x20\x22\xd6\x30\x67\x18\x6b\x65\xe7\x64\x82\x8c\xc0\xf5\xf7\x63\x2d\x5e\xef\x86\x3e\x6c\x6d\x90\xe3\x8c\xcc\x87\xd7\xb7\x47\xfa\xc8\x49\x1d\x63\x2c\xf7\xf5\x4b\x9a\x9e\xed\x16\xee\xbe\xc0\x1b\x6c\xc3\x3d\x24\x63\xf7\xf9\x50\xd8\x28\xb5\x5e\xe3\xf7\x7c\xbe\x97\x4f\x48\x94\x8e\xb7\x57\xae\xd4\xe0\xdb\xb0\x0a\xd9\x5e\xe0\x13\x23\x48\x6e\xba\x3c\x8d\xa8\x86\xed\x7f\x57\xbb\x40\x0d\x63\xa1\xb2\xeb\xea\xa2\xe7\x0a\xdf\x03\x79\xe3\x39\x30\x01\xba\x62\x6c\x0d\xd5\x4b\x7f\x0c\x9a\x25\xaa\xe6\xc9\x87\x5d\x4e\x76\x22\xf3\xed\x42\x8f\xb3\x12\x4b\x29\xc5\xdb\x9a\x7e\xf1\x6e\xbd\xdd\x68\x05\xf0\x95\xf5\xe7\x69\x82\x3c\x43\xf2\x62\x86\x8f\xf4\x3e\x3e\x05\x25\x74\x6d\x94\x97\xaf\x12\x4a\x01\xdf\xf6\x1e\xc7\x18\xaf\x3b\x5b\xb7\x46\xfc\xc0\x8a\xeb\xd1\x66\x84\xd4\x56\xae\x79\x32\xff\x5e\xd7\xd6\xb0\xf1\xb2\x5c\x7a\xde\xef\x59\x8b\x5d\x58\x87\x75\x90\xac\x1d\xc0\x59\x75\x15\x67\x96\x99\x87\x74\x08\x1e\x5b\x66\x82\x2a\x94\xa6\xa8\x02\xc3\xa2\xcd\x9f\x48\x9e\x16\x28\xaa\xf4\x65\x2b\xe1\x18\x4b\x0f\xc7\xc5\xee\x7f\x97\xce\x08\xb9\x23\x3b\x4b\x83\xd9\x36\x7b\xe5\xf4\xaa\xe9\x78\x25\x93\xa3\x52\x65\x15\x4d\xea\x4c\x37\x5c\x16\xf0\xca\xf6\xdc\x45\x94\xd2\xbd\xbf\xc3\x37\x5b\xb2\xa0\x43\x2c\x48\x2f\x13\x94\x1c\xe2\xaa\xab\x4d\x83\xe7\x4d\x11\x6f\x5d\xe4\xab\x28\xf8\xdc\x3d\x1c\xd1\x9d\x27\x1e\x56\xe1\x03\x98\xbd\x1d\xf5\xc8\x70\xfc\xbf\x93\xa7\xd1\xdf\x39\x39\x54\x7c\x10\x7b\xfd\x90\x64\x3f\x6f\x50\x01\xae\x7e\x06\x39\x7a\xe1\xa2\x71\xbb\x82\xa1\xf3\x8e\x09\x7b\xec\x66\x74\x66\xb8\x0e\xe3\xe5\x0d\xd4\xfc\x9d\x5d\x54\xf1\x8f\xaf\x7a\x5b\x55\xa8\x83\x45\x94\xef\x0c\xb7\xe5\x08\xbb\xd2\x8f\x71\xfd\x34\x23\x5b\xbf\xd3"}, +{{0x49,0x8e,0x5a,0x21,0xa9,0xb0,0xc3,0x47,0xba,0x83,0xa4,0x7a,0xc1,0x00,0x69,0x45,0x7f,0x57,0x83,0xc2,0xe1,0xe6,0xe4,0x64,0x00,0x45,0xe5,0x94,0xb1,0xc6,0x93,0x32,},{0xfb,0x39,0x48,0xc8,0x11,0x99,0x56,0x91,0x05,0xcc,0x1b,0x7d,0x9c,0xeb,0x3b,0x41,0xa3,0x43,0xbb,0x00,0x57,0x55,0x38,0x59,0x2e,0x09,0x84,0xf4,0xf4,0x71,0x0a,0xbe,},{0x28,0x60,0x83,0x0c,0xcd,0x1d,0x41,0xd9,0x50,0x76,0x81,0x6a,0x39,0x84,0x24,0xf7,0xb7,0x39,0xc4,0x9f,0xda,0xcf,0x56,0x54,0x52,0x9d,0xa8,0x5f,0xe3,0x56,0x55,0x84,0xf6,0xaa,0xc2,0x61,0x4c,0x63,0xf7,0x74,0xb6,0x1d,0xb9,0x08,0x1f,0x14,0x10,0xfb,0xa8,0xe5,0x0a,0xb3,0xb4,0xc3,0x9d,0xc0,0x63,0x14,0x24,0x3f,0x3f,0x0d,0x8e,0x0f,},"\xe4\xfb\xea\x86\x4a\xa5\x11\x90\x82\x66\x45\xd2\xf7\x72\xcb\x0f\x9e\xdd\xd3\x03\x44\x73\xfa\x31\x77\xc7\xaf\x9a\x5d\x41\xe1\xa7\x3a\xd5\x78\x4c\x70\x96\x55\x9f\xcd\xdb\x7b\x7c\x85\x89\x1c\xf2\x4e\x82\xc5\x88\xd7\x47\x74\xff\xca\xc0\xc6\xb4\xee\xbc\x2f\x3f\xa4\x3e\x9d\x45\xf2\x59\xd6\x75\x64\x03\x0c\xfe\xea\xb9\x23\x6c\x66\x5b\x65\x0a\xf0\xc9\x2c\x87\x51\x89\xf5\xf9\x38\x35\x04\xb1\x53\x60\xa0\xb9\xa5\xa0\x0d\xa3\x1f\x63\x5b\x96\xf6\xc7\x3e\xf4\x7b\x6b\x06\xf0\x28\x11\xd1\xd1\x9c\x2e\x8e\x53\x55\x0c\xe2\x2e\x42\xec\x50\xa1\xeb\x2e\xa2\xf4\xcd\x03\xc4\x42\xd4\xaa\x43\x68\x94\x23\x8c\xeb\x18\x35\xfe\x99\xb2\x40\x35\x8a\xa0\x56\x2c\x24\x96\x98\xa3\xf1\x23\xc2\xc1\x7e\x59\x10\x10\xbd\x6f\xdf\xcb\xd7\xdb\xe7\x0b\x04\x52\x05\x02\xec\xe3\x7a\x9a\x1d\xfa\x1a\xe3\x37\x04\x17\xb0\x04\x21\x7a\x5b\x8f\xe9\x90\x3c\x9a\x3b\x9f\x4b\x6d\x5c\x46\xc0\xed\x0c\x53\x8c\xec\x22\xf2\xdf\xcb\x2a\x28\x0a\x42\xad\xc4\x89\xcf\x2e\x06\x29\x12\xbe\x99\x28\xf0\xc0\x60\x89\x1e\x43\x20\x91\x17\x75\x26\xf1\xb3\xa9\x68\x06\x9d\x4a\x57\xad\xe8\x28\x55\x98\x10\xae\x03\x60\x68\x1f\xf9\x93\x29\xfa\x0f\x59\xe7\xe5\x9c\xdf\x87\xf9\xf3\x3c\x40\xe9\x70\x31\xb9\xf8\x1d\x48\xfc\x12\x28\x6e\xfb\xb3\xd4\xe5\xa6\x2e\xf5\x7b\xc0\xd5\x2d\x53\x3b\x99\xc5\x10\x6a\xa7\x9c\xfe\x17\x93\xa9\x08\x51\x85\x96\xc3\x83\x48\x3e\xc4\x9f\xf9\x8e\xc5\x57\xbf\xff\x74\x90\xa4\x6d\xaf\x67\x14\xf2\xc2\xc3\x2f\x57\x93\x2c\xa0\xd7\x30\xf0\x3f\x38\x1d\x69\xde\xcd\xbd\x9a\x7a\x6d\x4a\xfc\x62\x40\x65\x43\xc8\xeb\xe9\x0a\xc7\x6e\x6a\xfa\xbd\xb8\x24\x92\xa2\x06\xa3\x69\xe0\x42\x86\xd3\x13\xe1\x11\x07\xd8\xcd\x9b\x4b\xf6\x8f\x81\x5d\xba\x4e\x99\x0b\x04\x9d\x79\x21\x6d\x36\x53\x13\x83\x42\xcd\x11\x8b\x13\x0f\x66\xb0\x06\xf3\xd8\x9a\xc3\xcf\x89\x83\x70\x48\xb0\xf8\xa6\x2d\x94\x05\x1d\x2e\xab\x89\x1a\xc5\xf4\x78\x88\x87\x9d\x88\xe5\x46\x67\x6d\x1d\xae\xeb\x4d\x17\x5d\x3f\x04\xa9\xd7\x4f\xfc\xdd\x47\x74\x60\x16\xf8\x4a\xd0\xd1\x12\xaf\xb5\x9a\xd1\x21\x87\xe9\x4f\x22\x53\x5d\x77\xe9\xe0\x51\x6f\xa4\x21\x85\xc1\x97\xba\x77\x4b\x39\x32\x27\xf7\x41\xfe\x68\x27\x3f\x42\x3f\xb0\xe0\xe0\x47\x4b\xfd\xaf\x2d\xa7\x8a\xeb\x1c\xd5\xb9\x8c\x1d\xc0\x83\x21\x24\x74\x2a\x47\x54\x12\x5f\xc7\x8b\x19\xc5\x59\xa5\xb3\xf7\x71\x1e\x06\x8c\x44\x0c\xc0\x46\x9a\x1c\xfa\x5c\x18\x64\xbe\x18\x73\x5a\xa8\xbc\xd4\x06\xc4\x37\x1e\xb8\x57\x75\x4d\x90\x8b\xf3\x79\xb9\x1f\xcb\x24\xe3\x43\x96\xbf\x87\xc1\x9a\x04\xa8\x3d\x59\xda\xe7\x1f\x3f\x38\x39\x82\x9d\x06\x22\x13\x01\xef\x59\x56\x96\xe7\x19\xd5\x6b\x79\x52\x0a\x0e\x50\x99\x29\x83\x3b\x1d\x80\x4a\x6a\x0e\xa4\x04\x00\xbb\x45\x02\x8c\xe5\xd3\x69\x33\x88\x3e\x17\x40\x6e\x27\xa8\x10\x90\x57\xb1\xa1\xa5\xe5\xda\x21\x0a\x69\x21\x99\x4f\x46\x7a\xb4\x1a\xa8\xf0\xd8\x87\x75\xa8\xa8\xeb\xb4\xec\x77\xd7\xc8\x0e\x45\xa7\xbb\x42\x2a\x4c\x00\xc9\x05\x83\x91\x14\x65\xe6\xb5\xf0\xfd\xcd\xea\xb7\x28\x71\xca\x54\x2e\x1d\x1a\x2c\xa9\x4d\xf4\xed\x2e\xab\xf9\x0d\xed\x00\x45\x29\x03\x24\xa9\xff\xfb\x30\x14\x54\x70\x20\x9f\x38\x26\x58\x09\x89\x34\x91\x99\xdc\x5a\xb8\xd4\xa2\x5d\xf7\xa0\x52\x9c\xf9\x14\x71\xe3\x08\x42\xab\xfa\xcd\x44\xab\x78\x1d\xfc\x13\x95"}, +{{0xc2,0x4c,0xbf,0x40,0x1a,0xd0,0x3b,0xd8,0x8d,0xcc,0x7b,0x51,0x9e,0xcf,0x62,0x4d,0xb2,0x22,0x3e,0x99,0x02,0x89,0x30,0x9e,0x1e,0x9f,0x1f,0x8f,0x61,0x27,0xc6,0xc9,},{0xa7,0x46,0x66,0xf3,0x57,0x20,0x9f,0x71,0x89,0x90,0x37,0x88,0xf1,0x07,0x56,0x3e,0x50,0xc0,0x51,0xc3,0xd4,0x0c,0x3f,0x3d,0xad,0x10,0xd3,0xc3,0xcf,0xf1,0xe6,0x78,},{0x58,0x1e,0x6c,0x85,0xae,0xc6,0x23,0xb6,0x2b,0x3d,0x4c,0x9b,0xc9,0xc7,0x77,0x59,0xd5,0x49,0x27,0x22,0xe2,0x52,0xd4,0x4c,0x1f,0x8a,0xda,0x9d,0xa2,0xec,0xc6,0x7c,0x17,0x08,0x32,0x73,0xaa,0x09,0x1b,0xba,0xc0,0x46,0xae,0x63,0xc7,0x88,0x93,0x15,0x2e,0x14,0xd9,0x26,0xc4,0x1a,0xe3,0x5f,0x0e,0x6e,0x39,0x59,0x49,0x6b,0x13,0x06,},"\xe7\xfa\x35\x9e\x6a\x09\xb2\xc5\x4a\xab\xed\x3b\xba\xbf\xb7\x28\x53\xa8\x05\xaa\xbc\xf4\xd1\x8d\xda\xd3\x9f\x03\xf3\x46\x01\xe5\x5b\x6c\xe2\x63\xc9\xa3\xca\x6a\x3e\x5f\x14\x25\xc8\x21\x92\x8c\x61\xe7\xf7\x50\x91\x9b\xd3\xaf\x32\xbc\xb7\xb9\x4d\x45\x9a\x7a\x9a\x35\xf6\x1c\x94\x17\x92\xe2\xcc\x2e\x43\x27\xbe\xb3\x44\xa8\x41\xa0\x7f\x32\x06\x8a\xf1\x02\xb3\xde\x61\xea\xb6\x4e\xf6\xd5\xe6\x90\x62\xe3\x93\xab\x5e\xdf\x6a\xc9\xef\x7b\x38\xd4\x9a\x01\xbe\xf0\x00\x3f\x42\x11\x74\xc8\x88\x59\x75\xc0\x18\x32\x89\x9c\x31\x35\xe7\xa8\x6e\x5b\x55\xd9\xb1\x32\x8b\xb4\x28\x9b\x5c\x40\x20\x0f\x49\xe5\x52\x3b\x3c\x46\x1d\xc7\x17\x5e\x14\x65\x02\x22\x97\xc3\xd3\x80\xf2\xb1\xfe\xf3\x9c\xb8\x2c\x00\xfd\x16\x0f\x44\x7e\xb5\x12\x63\xfa\x25\xb4\xdf\x0f\xca\x41\xec\x0c\xa2\xec\xe7\x47\x22\x01\xaf\x86\xc3\x03\x8c\x49\xdf\x09\x9a\x9a\xef\xa1\xf8\x8d\x0e\xdf\xd1\x7c\x0b\x3c\x86\x04\x66\x29\xc0\x94\x54\x05\x4a\xa0\xfb\x2c\x69\x49\xdd\x9c\x13\x01\x85\xdf\xa5\xd9\x03\x89\x1e\x08\x74\x2c\xd0\x42\x94\x03\xf5\x7f\x40\x52\x15\x8b\x2f\x40\x1d\xa4\x75\x68\x54\xe4\xaa\xf0\x24\x22\x1e\x37\x51\x3c\xf6\x77\xee\x6a\x0b\x15\x9f\x50\x1d\x37\x7e\xa3\x2e\xb7\x1e\x77\x80\x04\xf2\x72\x03\xcd\x6d\x55\x3f\xda\x5d\x65\xe1\x87\x94\x77\x04\x6f\x3e\xa3\xd1\xd7\x5c\x9d\x0d\x30\x31\x14\x56\x70\x9c\xc7\xf6\xab\x68\xc7\xb0\xd5\x2b\xe4\x0f\x04\xcf\x65\x56\x55\x32\x32\x85\x31\x83\x29\xe8\x4c\x6a\x5b\x07\xe0\xce\xed\x5f\x78\xf7\xf1\xfa\x62\x29\xbe\xf8\x78\x79\x3c\x58\x47\x28\xab\xf4\x51\x0b\x7f\x27\x79\x4b\x59\x42\x91\x62\x54\xc5\x89\xa0\x9c\x8e\x91\x1f\x0b\x95\x42\x11\xa6\x36\x99\xa7\x52\x14\x7f\x2a\x4e\x1a\x18\x95\x66\x44\xbe\xa2\xca\x26\x92\xba\x18\x22\x80\xe0\x4a\x72\xdd\x89\xb0\xd1\x26\x85\x00\x93\x8f\x34\x7b\xf4\x3f\x2a\x24\x2e\xe9\xb9\xa6\xba\xac\x9b\x35\x0d\x65\x6f\xb1\x9e\xc8\x34\xab\xe3\x16\x44\x40\xf2\xd2\x07\x1f\xe5\xe3\x2c\x8e\x4c\xf9\x05\x53\x9b\x83\x9c\xee\xca\x26\x20\xfc\xb2\xa0\x87\xf7\x80\xe6\xc7\xf5\xe0\x5c\x50\x68\x88\x25\x0e\xa7\xc8\x56\xfb\x30\x98\x32\x00\xaa\x8f\x78\xfc\x17\x71\x05\x4a\xda\x0f\x3f\xac\x38\xae\x2f\x33\xdc\x4a\x4f\x85\x1b\x76\xed\x74\x0c\x09\x62\xa7\x6a\x4d\xe4\x40\x80\xdc\x62\x0a\x44\xad\x8f\x23\xd3\x46\x2b\x79\x2a\xb3\xaf\xb1\x9c\xb8\xa9\xf4\xd9\xe5\x9a\xd7\x65\xa7\x71\x89\x9d\xa8\xcb\xec\x89\xe5\x07\x7e\x85\xc0\xc9\x31\x26\x37\x6c\x94\x1b\xef\x1f\x8b\xb9\x92\xd3\xa3\x5f\x27\x07\x25\x84\x6f\xb2\x52\xf8\xb5\xfb\xb7\x56\x7e\x40\x6a\x1b\x53\xb6\x19\x76\x9e\x63\x2b\x2b\x40\x87\xcd\x4c\x27\x6e\x5d\x58\xff\x2b\x56\xe8\x9e\xde\xc4\x8c\xe5\x3a\x52\xe3\x29\xca\x15\x59\x53\x8f\x10\x90\x2c\x01\xa8\x5f\xbb\x3c\xd7\x2e\x6b\x82\x91\xe5\xfe\x63\x9b\xee\x9d\x47\xd3\x4c\x24\x9a\x7a\x07\xd7\xa1\x42\x7a\x01\xf6\x3d\x60\x98\x4c\x45\x0b\xef\x81\x9b\x19\xf6\x5e\x26\x14\xfd\x9c\x2f\xae\x7b\x92\x31\xa0\xbc\xa4\x14\xed\x94\xa5\xee\x7e\x66\x32\x7d\x2a\x99\xc8\x48\x78\xb7\xbe\xe0\x87\xe8\x91\xf2\x53\xfa\x1f\xec\xe3\x13\x64\x8c\x06\xc4\x5d\xb2\xd9\xf3\xbc\x85\x99\x93\x7b\x75\x2d\x38\xce\x50\x63\xd0\xed\x9a\x43\xec\x9d\x40\x15\x89\x3d\x43\xbf\x5b\x2d\x1c\x60\x47\x85\x10\x46\x89\x68\xb7\x96\xf0\x15\x37\x89\x59\x54\x41\x72\x2a"}, +{{0x8b,0x3d,0xcd,0xe4,0xab,0xbf,0x4e,0x62,0x11,0xc4,0xa5,0x1c,0x4b,0x02,0x68,0x00,0xa8,0xa2,0xa0,0x61,0xcb,0x38,0xa2,0xec,0xc7,0xc9,0xcf,0x11,0x3f,0x92,0x70,0xbf,},{0x51,0x45,0x35,0x58,0x0f,0x0d,0xe3,0x59,0xbb,0x0d,0x41,0xf2,0xef,0xdd,0xaa,0x04,0xc2,0xec,0x95,0x01,0x19,0xf3,0x16,0x34,0xb2,0xc1,0xa3,0x2f,0x19,0x5f,0x69,0x68,},{0x4f,0x3d,0x4d,0x22,0x85,0x03,0x01,0x7e,0x74,0xa6,0xbb,0x58,0xaa,0xfa,0xe3,0x5c,0x3f,0x37,0xbd,0xee,0x4f,0xf6,0xbe,0x2e,0x62,0x40,0xb5,0x08,0x2f,0xed,0xdb,0x22,0x27,0x35,0xe1,0x2f,0x31,0xe0,0x56,0xfa,0x68,0x54,0x47,0xe5,0x38,0x48,0x03,0x00,0x7e,0xa7,0x91,0x0e,0x60,0x5c,0x1b,0x78,0x11,0x8c,0xd5,0xac,0xc5,0x87,0xa6,0x06,},"\x48\x14\x25\x02\x7d\xa6\x72\xb6\xf2\x6c\x91\xb8\x0e\x55\x58\x2c\xae\xf4\x7b\xb1\x5a\x2d\xe8\xfc\xa8\x52\x22\x17\x85\x18\x0b\x20\xa7\xfd\x6d\x49\x07\xb5\x88\x1c\xc1\xd6\xe3\x9a\xb9\x61\x2c\xc7\x4d\x69\x77\xe9\x14\x1f\x70\x87\xbb\x27\xab\x30\x84\xa2\x62\x85\x58\x6f\x84\x11\xdb\x1f\x50\x3a\xdf\x52\xdc\xb2\x5a\xb8\xff\xfd\x2e\xc1\x50\x4c\x17\x77\xb9\xd6\xdd\x4a\x29\xe2\x01\x9e\x5c\xba\xe1\xb7\xeb\x26\xf9\x5b\xbe\x07\xd9\x0c\x2f\x6f\xb0\x88\x4a\x59\xa8\xd5\x8d\xde\x51\x16\xed\xc3\xbc\x34\x9d\x37\xc1\x60\xb2\x7b\xef\xbe\x5a\x5c\x18\x1c\xe7\x25\x63\x92\x35\x4d\x22\x1b\x58\xc4\x7e\xb0\xbb\x10\x92\x9e\x74\x21\x79\x5f\x4b\x7a\x7c\x27\x5e\xdd\x08\xc0\x88\x56\x87\x72\xe9\x93\x21\x8d\xd6\xf3\xc2\xcb\x4a\xc6\x57\xa0\xa3\xf9\x1f\x31\x26\xb9\x91\xad\xf6\xcb\xe7\xd1\xb1\x9b\x8c\xd8\x3b\xe3\x60\x2e\xd1\x8f\x03\x96\x33\xfb\xd2\x38\x7b\xda\x69\xe2\xcf\x03\x87\xd8\x64\x4d\x97\xb3\x03\xfb\x00\x63\x9a\xee\xe7\xae\x46\x3f\x6f\xe1\xa2\xc4\xb8\x9a\xeb\xa3\xe9\x09\x4c\x11\xfc\x29\x11\x4b\x20\x28\x3f\x28\x7c\x6d\xd2\x8c\xb0\x98\xda\xe8\xda\xbc\x48\xe8\x5b\xb5\x9c\x0d\xc6\xe7\x8c\x95\x66\x05\xcb\x7c\xf0\x69\x42\x35\x3e\x7a\x22\xe9\x6f\x80\xa3\x7a\x66\xf7\x18\xd9\xe4\xdb\x8c\x52\x45\x2a\xa0\xa3\x57\x72\xe8\x1b\xa2\xb3\x03\x20\x5b\x41\x2d\xd2\xbf\xc1\x5c\xe9\xb4\x36\xf9\x9f\xbb\x32\x12\x6b\x63\xce\x9c\xb4\x31\x99\xf1\x57\xd8\x17\x51\xa7\xc4\x93\x7d\x13\xaf\x4c\x58\x29\x52\xb5\xd6\x06\xb5\x55\xb0\x46\xbf\x1d\xe0\x6c\xf3\x9b\x63\xa8\x02\x87\x37\x18\x03\x60\x9a\x38\x7e\xe8\x0f\x3a\x5d\x88\xb9\xd6\x21\x96\x50\xed\x17\xd3\xcc\x18\x3b\x2c\x70\xd5\xeb\x94\xe3\xbc\x52\xae\xa7\xaa\x7f\x53\xbe\x0e\x20\xb8\x97\x2f\x14\x3d\x8e\x20\x16\x2e\x80\x3e\xdb\x4a\xa8\x3d\x55\x53\xfd\xd5\x53\x39\x8b\x0f\xa1\x76\xb9\x59\xcb\xa1\x40\xd6\xe9\x80\xc9\x25\x1b\x0f\xa0\xb6\x5e\x90\x84\x17\xf8\x2f\x45\x1f\xf9\xf2\xde\x6b\x9c\xa5\xe3\xb5\xf4\x1b\xa4\x0d\x05\xa5\x4f\x3d\xab\x48\x86\xaa\xcc\xa0\x5c\x9c\x27\x98\x13\x9a\x4c\xb3\x3e\x96\xa9\x14\x94\x74\x99\x10\xa1\x7c\xe8\xb3\x92\xfc\x0f\xc7\x76\x29\x74\xd7\x9d\x33\xdb\x92\x4b\xfe\xf8\x65\x5a\x72\x37\x76\xff\x87\xf9\x50\xfd\xc5\x68\xb1\xe5\x26\x53\x45\x41\xf5\x72\x72\x3b\x84\x06\x63\xc1\x91\x88\xc4\x24\xf7\xc4\x89\x23\x5a\x42\x4b\x09\xfe\x25\xc3\x07\x27\xea\x1c\xb0\x49\x53\xd7\x06\xd6\x8b\xfe\x12\x10\x0e\xf6\xf6\x4c\x35\xc6\xb8\xde\x67\xed\xf0\xe3\xad\x01\x4a\x40\x0e\x82\x1e\xa3\x40\x24\x32\x19\x99\x86\x7b\x43\xc8\x2c\x45\x01\x84\xb7\x8f\x74\x25\xce\xbd\x73\x19\xdc\x6f\x65\xd3\x60\x66\x5d\xfb\xe7\xc3\x66\x74\xda\xc3\xa5\x4e\x96\xda\x91\x0c\x02\xd3\x64\x07\x80\xb2\x2d\x51\x2c\xa0\xe3\xca\x35\x87\xb9\x4e\xa9\xfc\xd7\xa3\x1b\x4a\xf6\x9f\xd6\x20\x7c\x68\xfe\xd2\x5f\x89\x92\x1c\x1c\xdc\xde\xfd\x1c\x09\x02\x04\x49\x2b\xff\x9b\xbb\x52\xe0\x88\x85\x82\x9d\x01\x2b\xc2\xdf\xb4\xfe\x8c\x35\xe5\x9c\xd1\x3b\xcb\x8e\xad\x34\x19\x3c\x40\xb0\x3e\xe4\xd8\x25\xee\x13\x22\xff\x4e\xf0\x71\x27\x95\x74\xcb\xae\xe7\xc0\x7f\x14\xbe\x60\x6b\x9c\xd0\xe2\x61\x11\x1e\xf2\x0d\x96\x81\xd7\x6c\xf7\x8c\x89\xa8\xc3\x97\xd6\xb8\xdc\x77\x8f\x49\x84\x16\x6a\xd5\xdf\x3a\x81\xaa\xf2\xe6\xde\x09\xf7\x00\x19\x5a\xe2\xc1\xd4\x60\x96\x47"}, +{{0xd4,0xa7,0xa9,0x52,0x4d,0x30,0xa6,0x33,0x7c,0x0a,0x0b,0xe9,0x5c,0xa9,0x05,0x91,0xde,0x98,0x88,0x03,0x8e,0x3e,0x59,0xe1,0xb2,0x5a,0x41,0x81,0xef,0x94,0x66,0x29,},{0x9f,0xc3,0xeb,0xd1,0x39,0xcc,0x5b,0x7c,0x0e,0x05,0xaf,0x47,0xbf,0xf6,0x61,0x9b,0x81,0x28,0x15,0xbb,0x01,0xce,0xec,0x39,0x2a,0x3f,0xf0,0xae,0xc3,0x81,0x1d,0x2c,},{0xd1,0x57,0x88,0xbc,0xd8,0x8d,0x1d,0x81,0xb9,0xe6,0x1d,0x4f,0xe2,0x6e,0xa4,0x9e,0x66,0x81,0x9a,0x59,0xd2,0xae,0x48,0x32,0x32,0x1b,0x81,0x4d,0x50,0x62,0xfa,0xdb,0x87,0x80,0x7d,0xb6,0x85,0x2e,0x1d,0x82,0x95,0xe3,0x1a,0x29,0x1b,0x1e,0x78,0x5d,0x01,0xd8,0x34,0x89,0x5f,0x88,0xf4,0x00,0xdf,0x88,0x32,0xc1,0x60,0x7b,0x5b,0x0c,},"\x17\x19\x80\xc0\x3f\xdf\x7a\x72\x7b\xd5\xba\xb3\xba\x09\x45\xe6\xad\x5f\xaf\x0a\x7f\x50\x6a\x56\xd1\xd0\xed\xd9\xa3\x06\xb3\x15\x8d\x84\x32\x66\xd3\x09\x1f\xc1\xe4\x22\x81\xdf\x97\x55\x9a\x22\x01\xf5\xbd\xdd\xfe\x68\x3d\x0e\x10\x28\xd1\xd9\x5b\x2f\x31\x3b\x48\x4c\x39\x2f\xfd\xb1\xcd\xf8\x85\x08\xaf\xde\x3d\x6f\xd2\xa1\x28\x88\xba\xce\xde\xb7\x9f\xf3\xdb\x40\xc9\xac\x0e\xc3\xfb\x90\x1b\x22\x86\x98\xad\xf8\xd8\x45\xff\x4f\xce\x10\xde\x55\xd4\x24\x36\xdc\xe9\x30\x97\x3a\x34\xbe\x05\xd1\x40\x1f\x33\x4d\x4c\xe8\xe3\xa7\x93\x79\x9e\xaf\xdb\x94\xd0\xf2\xab\x09\x50\xb0\x79\xe6\x65\x3e\xeb\x49\x9f\xc7\x44\x7c\xcb\xee\xed\x8d\xbd\x54\x56\x80\x8c\xd7\xa3\x8f\x9a\x15\xa2\xa9\xc7\x38\xd6\x13\x34\xca\xb8\xce\xeb\xbb\xf4\xa4\x81\x4d\x94\xc6\x18\x59\x17\x87\x84\x60\x4e\x0c\x21\x54\x59\x7e\x72\xcf\x58\x7c\xd1\xf5\xda\xfe\x59\x22\x05\x18\x90\xe7\x6d\x61\x6d\x8c\xd5\xb0\x5d\x64\x78\xd0\x62\x6e\xa8\x3c\xe8\x08\xc4\x61\x43\xe6\xfb\x06\xb4\x18\x2d\x22\x8d\xa8\xf6\xd4\x13\x9e\xca\x5b\x8f\x3b\x1b\x98\xaf\x68\xc5\x9b\x4b\x5a\x53\xc1\x36\xee\x90\x43\x2a\xca\x2b\xb9\x15\x52\x9d\x26\x36\x79\x49\x82\x62\x33\xb4\x3e\x55\x80\x4b\x55\xfc\x9f\x21\x5e\xb0\xb0\xb7\x92\x91\x46\x5b\xb3\x4e\xda\xea\xdf\xfa\xbf\xe6\xcf\x41\xbc\x07\xb5\xdd\x4d\x01\x42\xf0\x36\x1f\x05\x8e\xe1\xb3\xb9\xfc\xc1\x96\xeb\x9b\x35\xb1\x34\xbe\x3d\x1d\x23\x20\x04\x48\x9e\x8f\x69\x93\xf6\x25\xa6\x30\x15\xbc\xd3\xf1\xe8\x75\x88\x32\x48\x58\xcc\xfb\x77\x0d\xdd\xd8\x94\xbf\x29\x7b\xd7\x63\xef\x58\x28\xe2\x1f\x5c\x89\xaa\x98\xcf\xbc\x1c\x08\x2d\xd7\xfb\xaa\x43\x07\xbd\xa4\x0b\x4a\x75\x8c\xa8\xf3\x9f\x4e\x4a\xae\xd3\x09\x04\x12\x68\xdb\xcf\x0a\xf3\x2d\xe0\xd7\xfa\x90\xa5\x23\x96\x3b\x78\x0b\x6a\x93\x2c\xf8\x94\x99\x02\x5f\x0e\x0d\x04\x74\xc7\x43\x48\x94\x75\x10\xe6\xc5\xec\x7c\x9e\x05\x06\x6e\xeb\x4a\x73\x52\x0c\x3d\x92\x7c\x39\xac\x26\xad\x75\x96\x32\x5b\x2c\xc4\x7c\x5e\x82\xa7\x75\x45\x5b\x7a\xf0\x31\x20\xb1\xcf\xbf\xd6\xec\x3f\xc0\xc3\xbe\x60\x78\xb0\x0c\xfd\xf8\x34\x2a\xe8\xbf\x14\x71\x59\xf5\x0e\x9d\x56\x4e\x2f\x68\x30\x6d\xae\x3c\xae\xdd\x10\x19\xf3\x23\xc4\x78\xa1\xe1\xf6\x75\x98\xdd\x83\x4b\xd1\xd1\xa8\x73\x3f\xd7\xfd\xd8\xa8\x76\x52\x6c\x53\x15\x18\x93\x6e\xdb\x72\xd0\x16\x56\xb3\x44\xc7\xd6\x5a\xc1\xce\xe3\x7c\xe5\x99\x7b\xa4\x8d\x3f\x4d\x06\x4d\x88\x05\x7e\xfe\x9a\x48\x2d\x9e\x00\xab\x5c\xae\xb5\xac\xa2\xd6\x60\xe3\x37\xbd\x15\x48\x73\x65\x69\x79\x56\xa5\xe4\x7b\x02\xab\xdc\x30\xd8\xe3\x53\xfe\xd4\xe1\xac\x41\xd2\xbc\x21\x20\x02\x11\x43\x63\x59\x35\xc6\x20\x18\x6a\x52\x2b\xde\x54\xbe\x04\x46\xfb\xd2\xdc\x88\xb5\x63\x04\xb3\xa6\x42\x27\xd0\xac\xd5\xf8\x5a\x6b\x67\x87\xa3\xad\xcf\x2d\x7c\xfc\x86\xc6\x34\xb4\xd7\xab\x43\x15\xb9\x7d\xe9\xe6\x66\xcf\xf3\xff\x1b\x88\xf3\x29\x5e\x7b\xab\x9e\x9f\xd4\x6f\xaf\xdd\xb4\xf5\xfa\xc5\x1c\xc0\x17\x01\x29\xc6\x51\xb4\xef\x4d\x39\x50\xd6\x94\x2f\xf0\x20\xd1\x66\x8a\x52\x8b\xde\x1d\xa9\x36\xc0\xec\x1a\xe0\x9e\x84\xf8\x20\x58\x61\xff\xf4\x91\x50\x2a\x87\x2c\x81\x54\xa9\x6e\x7e\xa2\x5e\xda\x95\x5a\x7f\xd2\xe4\xb4\xc7\xa8\xd2\x73\xf6\x0b\xc7\x4f\xab\x7b\x49\x68\xca\x6f\x75\xda\xea\x50\x40\xf8\x39\xfd\x56\xc2\xa9\x80"}, +{{0xd0,0x8f,0x4b,0xab,0xba,0x3b,0x53,0x65,0xfa,0xf7,0x38,0x79,0x5c,0x9d,0xa4,0x5d,0xb1,0x86,0x2c,0xb2,0x8b,0x93,0xeb,0x66,0x35,0xd1,0x32,0x0d,0xa0,0xf4,0xd9,0x37,},{0xef,0x31,0xb4,0x54,0xf7,0x34,0xe5,0x2b,0x34,0x38,0xee,0x2f,0x1c,0xbc,0x35,0x63,0x1b,0x19,0x69,0xde,0x54,0xac,0x98,0xfe,0x46,0x33,0xf2,0xf5,0x00,0xac,0x87,0x12,},{0xac,0xeb,0xe4,0xc8,0x6f,0xa9,0xfe,0x2c,0x1a,0x5c,0x57,0x6a,0xc0,0x50,0x1e,0x8a,0xb0,0xf6,0x40,0xfa,0x40,0x38,0x05,0x36,0xfc,0xf9,0x50,0x59,0xd5,0x3d,0x4a,0x35,0x55,0xd2,0x20,0xac,0x36,0x35,0x87,0x17,0x5e,0x4b,0xde,0x16,0x3c,0x0d,0x00,0x65,0x0a,0x12,0x96,0x3d,0x46,0x76,0x6c,0x99,0xbb,0x62,0xbf,0x75,0x73,0xe2,0x87,0x0c,},"\xa3\x94\xd8\x85\x4c\xeb\x5c\x43\xaf\xee\x1a\x48\x92\x6b\xbd\x66\x85\xaa\x8a\xec\xfd\xcf\x85\x41\x33\x33\x39\x74\xd6\x24\xbf\x2f\x1f\x9c\x30\xf0\x05\xbb\xf3\x4c\xee\x3a\xfe\x2b\x29\x06\x00\xee\xae\x6f\x1d\xd1\x2a\x0c\x34\x6f\xbb\x2a\xb9\xc9\x16\xc5\xd5\xd8\x0d\xcd\x87\x88\x78\x75\xa0\xac\x84\x76\x78\x03\x9f\xdc\xd3\xa9\x79\x35\x41\xf5\xd6\x75\x14\x3a\x6a\xba\xdc\x3b\x18\xf0\xfe\xf5\x10\x8c\x19\xc2\xdb\xfb\x59\x71\x0e\xef\x98\x66\xa4\xf3\xf2\x97\xa0\x9e\xe4\x8c\x68\x03\x00\x7d\xd6\xba\x8f\xd4\xbe\x84\x1c\xfb\x10\xff\x05\x14\xc3\x0f\xc4\xdd\x49\xa3\xcd\x43\xbb\xd1\x6e\x46\x04\x43\xa1\x1a\xfe\x64\x9e\x90\x1d\x63\xd8\x9a\xf5\x98\xaa\x68\x6b\x2f\x60\x7e\xc1\x1f\x35\xe1\x7a\x79\x8a\x42\x13\xb7\x5a\x38\x78\x8d\xa4\xf2\x7c\xf2\xb0\x2c\xad\xdf\xe6\x1c\x37\x29\xa8\x7e\xc6\xe6\xb0\x98\xf6\x8e\x7a\xed\x28\xa8\x00\xc4\x84\xdf\xa0\x13\x04\x01\x20\x8f\x98\x6d\x79\x2f\x54\x63\x5a\xdd\x28\x48\xe1\x51\x26\x2a\x36\x5e\xb2\x1e\x27\x27\x19\x1e\x1f\x70\x0f\x3b\xf5\xc7\x3b\x0f\xb4\xc5\x46\xd0\x04\x8a\x15\x5c\x18\x71\x79\x20\xfc\x04\x25\xc8\xc8\xfa\x8f\x16\x7c\x43\xa2\x77\xbb\x36\x6e\x0a\xd7\x02\xc8\x9b\xc5\xaa\x06\xfd\x47\x09\x43\xbe\x05\xcb\x9e\x32\x59\x78\x72\x29\x71\x4c\x30\xa4\xe8\x7b\x00\xa6\x33\xaa\xf7\xbe\x6b\x58\x75\x01\x0d\x12\xe1\x07\xc9\xa5\x26\x1c\xa5\x62\xd6\x70\x25\xbe\xa0\xfe\x22\x34\x63\xed\xb9\x2e\xa0\x1c\xca\x92\xc4\x4f\xf2\x4d\xa9\xd8\xa8\x0a\x64\x21\xf3\xd4\x13\x5d\x64\x7d\x1b\xb0\xfd\x98\x8c\x46\xc8\xa1\x70\xce\xb4\xf3\x3f\xff\x9c\x0f\xfb\x6a\xba\xd1\x09\x2c\x84\xdf\xad\x82\x90\x89\x8b\x24\x95\x16\xa2\x92\xe8\xda\x96\xfd\x51\xa8\x10\x05\xee\xcf\xde\xbb\x05\x93\x30\x99\x27\x7d\x07\x3a\x48\x0c\x3f\x9e\xb8\xaa\x11\x96\x8c\x4d\x8d\xc0\x78\x7a\x9a\xec\x3e\x05\x27\xb7\xfe\x4c\x06\x35\x41\x13\x35\xa1\x81\x16\x89\xe8\x8f\x6d\x5c\xed\x0d\x40\xd6\xb4\x8b\x7f\x2d\x99\x29\x52\x93\x48\x94\x15\x30\x76\xa8\xd3\x73\x72\xfa\x00\xd9\xce\xfc\x5c\xf8\xc2\x6a\xdb\x5a\xcf\x32\x5a\x01\xcd\x00\x5a\xb8\xd4\x74\xa5\x2d\x67\x11\x40\x78\xc6\x51\x6a\xef\x80\x4b\xba\x19\xb8\x87\xa2\x8e\xd5\xe4\x6e\xe9\x99\x5e\x5a\xd3\xa8\x2f\xb9\xcd\x93\x28\x34\x33\x68\x09\x21\x11\x4b\x4d\x9a\xf8\xfc\xb6\xb2\xb5\x35\x83\x9c\x36\xde\x8d\xf1\x2b\x17\xea\x6d\xdc\xfc\xb3\x33\x4f\xf4\x0e\x6c\xf0\x4c\xcd\x5c\xa6\x40\x3b\xa0\xb6\x2b\x4c\xb7\x1b\xbd\xe9\x1d\x8b\xab\xda\x69\x15\x2c\x9c\x93\xae\x76\x9b\x55\x29\xc8\xd5\x2f\xd9\xa6\x90\x9a\x15\xe1\xa0\x60\x1a\x71\x46\x49\xc9\x6e\xc9\x96\xc1\x70\x6d\x10\x21\xb9\x74\x87\x98\x0d\x7b\x2c\x2a\x39\xbb\xb0\xe4\x70\xd8\xe4\x6a\xc4\xaa\x60\x9a\x09\x22\xc9\xbd\xc0\x16\x12\xea\xde\xac\xcd\x5f\xa5\x23\xb2\xa8\xd0\xe6\x2f\xfe\x56\x28\x16\x47\xd6\x1f\xff\xbb\xc8\x40\x53\x57\x45\xd1\x44\x25\x9c\xc8\x13\x00\xfe\x99\xdf\xbf\xfe\xa6\xb0\xb9\xbc\xd2\x84\x73\x98\x2d\x32\xe9\x3e\xd4\x66\x34\xa9\x98\x79\x06\xd6\xf4\x89\x39\xd8\xdf\xbf\xb3\x7d\x33\xb8\x88\xdb\x60\x8c\xb2\xff\xe3\x9a\x8c\xf6\x7b\x72\x64\x46\x11\xc7\xd3\x2a\x4a\x8d\xf6\x12\x46\x8c\xd5\xe5\xd7\x5f\xbb\xa7\x9e\x63\x8a\xa1\xda\xa2\x8c\x4e\x0e\xeb\x9a\x63\x7f\xf8\xa0\x8b\x65\xf7\xa7\x61\x24\x14\xdf\x76\xbc\x7b\x0b\x56\xb5\x53\x7d\x66\x6f\xac\xfd\xda\xf6\x5a\xf1"}, +{{0x8f,0x47,0x4f,0x88,0xcf,0x86,0x3c,0x48,0x54,0x56,0xa5,0xa2,0x15,0x52,0x81,0xff,0x27,0xb2,0x84,0x59,0xf6,0x3b,0xc4,0xf1,0xdb,0x00,0xe0,0x03,0x10,0x64,0xf6,0x49,},{0x43,0x14,0x4a,0x32,0x9d,0x75,0x1d,0x04,0xe0,0x71,0x69,0xb7,0x79,0xee,0x92,0x0d,0xd0,0x29,0xcb,0x44,0x5b,0xf3,0x76,0xba,0x3a,0x66,0x85,0x72,0x18,0x23,0x44,0xa3,},{0xf6,0x1f,0x78,0x07,0xc3,0x3e,0x19,0x6d,0x0f,0xe1,0x82,0xef,0xa4,0xd4,0x51,0x6a,0x98,0x15,0xdd,0xd4,0x49,0x53,0x8b,0xba,0xa6,0xb8,0x6b,0x69,0x01,0xa0,0x5f,0x5d,0xdd,0xa0,0x60,0x1e,0xc9,0x0f,0x39,0xf1,0x55,0x47,0x79,0xdb,0x7a,0x09,0xa6,0x05,0x72,0xef,0xfd,0x4d,0x12,0x8d,0x0d,0x3c,0x2d,0xd4,0xe8,0x83,0x57,0x4b,0xc6,0x0b,},"\x84\x08\x91\xd9\x48\xec\x19\xc8\xc7\xf7\xc9\xd3\xc4\x77\x53\x62\xa5\x44\xa0\xec\x97\x45\x7a\xb5\xd1\x4e\x12\x5d\xc5\x4b\x59\xc8\xdc\x9a\x63\x5e\x7b\xad\xb6\xbe\x73\xc3\xa5\x8d\xc0\xe9\x92\x9f\x2b\x42\x0d\x83\x56\xd6\x17\xc3\xd4\x1b\xfe\x69\xb4\xe1\x58\xd4\xbf\x08\xfb\x17\xe6\x88\xd3\xcf\x3c\x94\x8b\x69\xb3\x5f\x0b\x6d\xb6\x62\x72\xa8\xeb\x2b\xd4\x10\xd6\x50\x9f\x6c\x82\x8b\x6a\x20\xd6\x58\x6e\xaf\x85\x76\x01\xed\x9d\x60\x54\x79\x9c\x25\x32\x0e\xba\x80\x77\xfe\x1a\xe2\x26\x71\xb3\x3a\x15\x88\xff\x2b\x23\x5d\x3c\x71\xa2\x7c\xe5\xc6\xc6\x6e\x18\x88\x91\x98\xd1\x16\x93\x36\x76\xbc\x4f\xb0\x71\x0d\xb7\xff\x1a\xc2\xf2\x0c\xe3\x69\xbe\xf5\x6b\x43\xcd\x1d\x40\x6c\xef\xda\xcf\x00\xf1\xf3\x48\xb8\xca\x7a\xa6\x14\xdb\x11\xa3\xa6\x40\xfd\xb5\x93\x89\xd1\xa6\xa3\x94\x75\x5c\x13\x3f\x1b\x01\x9c\x83\x08\xca\x5a\x95\x1e\x73\xb8\x10\xa1\x80\xf6\xff\x25\xb2\x9d\xbb\xcc\xef\x4c\x13\xa9\x75\x03\x39\x39\x07\xa2\xdb\xa0\x96\xa8\xce\x5c\x86\xc0\xee\x6f\x97\xc1\x44\x1b\x8d\x63\x31\xcb\xa5\x3b\x19\x60\x6b\x42\x1a\xf5\x2f\x65\xf9\xc6\x63\xe6\x3d\x39\x82\x71\x8f\x94\x8c\x6b\xae\x96\x1b\x8e\x4b\xf8\xcd\x9e\x31\xcd\x09\x92\x8e\x4e\x80\x61\x65\x97\xcc\xfa\xdc\xb8\xa6\x14\x15\x49\x33\xbc\x37\x58\x9c\x85\xc7\x76\xe3\x4e\x5a\x90\x66\x0f\x59\xa6\x5b\x5e\x93\xad\x43\x88\x42\xf9\x82\xd0\x2b\x04\x1e\x6d\xbd\xdf\x17\x10\x99\xf8\xdb\x70\x99\x57\x31\xa0\xdb\x8c\x46\x25\xc9\xbc\xa7\x10\x80\x59\x61\xfb\x17\x6d\xae\x81\x97\x68\xfc\xad\x7f\xf9\xbf\xce\x36\x40\x3c\xa7\xf7\x83\xe7\x61\x37\x26\xd7\xdc\x59\xf2\x4e\x24\x7c\xf1\x50\x68\xff\x3b\x19\xc7\x25\xfa\xd6\x5e\xa8\xe8\xa7\xf7\x22\xd5\x28\xc9\x5f\xce\xf1\xc0\xcc\x79\xd1\x8e\xf0\x7c\xee\x8b\x01\x1e\xea\xbd\x99\x21\x63\x4d\x76\xa6\x1a\x8a\x3c\x89\x31\xb8\x27\xe8\x18\x98\x81\xf8\x1f\x7a\x17\x5f\x21\xfb\x03\x78\xb8\x18\x8e\x58\xbd\xb2\x01\x7b\xef\x39\x0f\x18\x00\xd9\xd7\x4f\x26\x3a\x81\xdf\x8e\x67\x52\x2d\x09\x2e\x77\x5d\x01\xe0\x04\xe7\xf8\xd8\x28\x1a\xe2\xc2\xfd\xf8\xc3\xa4\x45\xf9\xef\xf7\xfd\xf1\x3f\x26\x1a\x77\x3d\xdf\x2d\xd9\xcc\x6b\xa5\x58\x5d\x99\x0c\x99\x5e\x6e\xb8\x9d\xff\xd9\xff\x0a\x9d\xbb\x76\xce\x5e\x10\xdd\x02\x72\xd5\x00\x14\x97\x88\x13\x66\xf5\xd6\x36\xa9\xcc\xea\xa2\x83\x22\x8d\x3a\xc6\x14\xdb\x21\x7a\xb8\x91\xd6\x68\x9d\xbe\xb9\x50\xe1\x20\x0c\x3d\xe5\x3b\xc5\xda\x07\xf1\xd3\x63\xda\xe9\xbe\x6e\xc3\x6e\xda\x6e\x68\x7d\x26\x29\x0f\x7a\xbc\xa2\x68\xa7\xfa\x03\xd9\x31\x88\x64\xed\xa9\xa1\x1e\x3b\x26\x14\x06\x05\x92\x0a\xc1\x3a\xde\xc1\xb5\x54\x8c\x9a\x7a\x32\x15\xa5\x87\x6b\x7e\x94\x1a\xfa\x1c\xb5\xd7\xf7\xf0\xc1\x16\x30\xcd\x42\x9f\x3b\x2b\x37\xdc\x76\xc6\xcb\xea\x4f\x3b\x72\x6a\xa8\xa5\xf8\xb9\xf7\x05\xb0\x5d\x7e\x94\x51\x95\x6f\x8a\xf1\x3c\xe0\xa8\x59\x55\xc7\x13\x5d\x64\xad\xe5\x49\x6e\xa5\x42\xe7\x0f\x8d\xa5\xb5\x73\xaa\xf1\x37\x08\x5d\xc9\x6c\x69\x27\x09\x96\x95\x67\x26\x68\xb3\xc7\xc6\xf9\x3c\x97\x7a\x4e\x8e\x9e\x77\x02\x95\xf2\x0d\x52\xdf\xf1\x87\xf8\xdb\xb2\x5e\xe7\xe7\x74\x02\x4e\xb9\xbe\x08\x12\x1e\xd7\x4b\x6d\x54\x62\xf4\xbb\x7d\xc2\x00\x38\x74\xca\xa3\x1b\xb7\x59\x5c\xd9\x3a\x99\xeb\xe1\xef\xf9\x28\xbb\x5f\xcb\x9e\x9c\x89\xdd\x31\xd4\x87\xfc\x0e\x20\xbb\xe1\x50"}, +{{0xe4,0x2b,0x30,0xd4,0x9c,0x43,0xc4,0xfa,0xd8,0x3d,0xd5,0x1f,0xdc,0x2a,0x4a,0xc5,0x90,0x13,0x27,0xad,0xd8,0x00,0xb6,0x69,0x72,0xc8,0xc7,0x0b,0xde,0x18,0x0a,0xdc,},{0xf7,0x34,0xaa,0xfa,0xa4,0xdb,0xaf,0x31,0x5c,0x25,0x8c,0xca,0x8b,0xbc,0x1d,0x4f,0x34,0xe8,0x36,0x01,0x10,0x98,0x74,0x22,0x2a,0xa0,0x55,0x89,0xf3,0xa6,0x63,0x5f,},{0xff,0x8e,0x07,0x6e,0x34,0x3c,0x8b,0x73,0xaa,0x45,0x3b,0xfe,0xe9,0xb2,0xba,0xb6,0xd5,0xc2,0xf7,0x4c,0x35,0xe1,0xba,0xd1,0xe5,0x2a,0xe7,0x77,0xd6,0x9f,0x79,0x76,0x40,0x83,0xf9,0x94,0x36,0x8a,0x1a,0xc8,0x51,0xa6,0x41,0xcd,0x24,0x70,0x08,0xa3,0x4f,0x3b,0x60,0x89,0x62,0xf4,0xdd,0x51,0x09,0xac,0x71,0xcc,0xe9,0x78,0xec,0x02,},"\x0d\x49\x70\x51\x86\x1e\x22\xd8\xa9\xc6\x0e\x5f\x7d\xe6\xc8\x95\xcb\xa3\x35\xb2\xe8\x2e\x60\x21\x18\xad\x83\x42\xb4\xd4\xed\xaa\x80\xf9\x5e\xfb\xb5\x9c\xfd\xa1\xfc\xc0\x29\x17\x25\x70\x0e\x8a\x81\xbb\x12\xa0\xb8\x62\x3b\x1f\xe2\x89\x1b\x8d\x98\xf7\xa8\x4c\x59\xfd\x92\xf8\xa7\xad\xfc\x06\x50\x42\xf7\xf4\xfd\x7e\x1a\x79\xf5\x5a\x1d\x4d\x5e\x54\xe0\x4e\x67\x2f\x1c\x9e\x4c\x4c\xd8\xd0\x00\x3f\x3c\xd5\x4b\x76\xe2\x16\x3d\xd7\x37\xac\xb2\xde\x5c\x26\x3a\xc1\x02\xa4\x8f\x69\x6b\x60\xca\xf9\xbe\x39\xc6\x65\xcc\xe1\xe0\xf3\xd4\x98\x55\x3f\x57\x90\x61\x88\x9a\x5e\xc5\x60\x3e\x4d\x14\x1c\xfd\xed\xe8\xe7\x31\x75\x72\xcf\xe7\x6a\x0f\x48\xe4\xae\x06\x06\x2c\x91\x57\xb5\xea\xac\x34\x68\x93\x81\x92\xdb\x4b\x16\x10\x5c\x73\x64\xa9\x44\x32\xb2\x15\xa7\x17\x97\xfe\xe1\x4c\x3c\x9c\xe2\xf7\x46\xed\x79\x03\x02\xfc\x41\xdc\x49\x2d\x37\xd9\xef\x02\x4a\xb5\x1d\xa3\xbd\xaf\x0f\x81\xd9\xa9\x30\xaa\x0e\x02\x5c\x04\xfd\x71\x02\x6b\x6a\xfe\xb7\xed\x01\xa9\x1a\x1e\xfd\x6c\x39\xf5\xe4\x47\xc6\x6d\xd3\x8a\x76\x56\xc6\x13\xd0\x21\x26\xf3\x58\x5d\xfa\xa0\x2d\xf9\x30\x25\x3f\x83\xbd\x42\x19\x64\x63\xeb\xc5\x0f\x8c\xfc\x94\x9e\xd3\x50\x39\x2e\x61\xce\xec\x13\x09\xda\x15\xa4\x32\xf8\x0d\xfe\x94\x8e\x26\x1c\xe6\xd8\x42\x1c\x54\x59\xcd\x21\xf3\xff\xa2\xed\xb5\x00\x98\x2b\x2a\xbf\xa5\x2e\x82\x43\x7c\xa2\x30\xf6\x09\x11\x63\x20\xd9\x89\x3e\xb8\x2a\x14\xdf\x72\xb7\x73\x66\x67\x51\x6f\xc0\x12\xb2\x8a\x03\xc9\xdd\x88\xea\x43\x08\xd8\xce\xea\x44\xcc\x60\x44\x54\xcd\xfa\x2c\x79\x76\x15\xbc\x0a\x6b\x3e\x00\x89\xaf\x0a\x81\xbe\x54\xd1\xb1\x10\xa1\x3a\xb9\x11\xb4\x52\xc3\x42\x80\x0c\xee\x2a\xd2\x39\xa2\xb1\x88\xa7\xfa\x87\x5e\x94\x1d\xaa\xeb\xcf\xc8\x8b\x70\xae\x4b\x1c\x57\x5c\xdb\x6e\x6d\x89\x44\x81\x36\xf6\x0e\xe8\x1c\x70\x3c\x47\x82\x2d\x2c\x0e\x50\xc7\xf1\xe8\xb7\xfc\x7e\xbd\x80\x78\x9f\xcd\x7e\x06\xc7\xe5\x0b\x5f\xc8\xb7\x76\xe8\xb9\xa4\xcd\x59\x05\xa2\x90\x69\xbc\x3a\x55\x8d\x7c\xab\xce\x2a\xf4\xf3\x10\x76\x7d\x5b\x11\x7e\x30\x76\xb3\xa0\xd5\x27\x17\x55\x43\xb2\xcc\xea\x28\xd5\xf7\x16\xfa\xc3\x2e\xfe\xd3\xd2\xe0\x27\x6b\xe4\x4a\x89\x56\xfc\x82\x40\xf2\xdb\x33\x97\x61\x4f\x2f\x2d\xa0\x21\x66\x69\x4e\xc6\xa7\xfe\xec\x6e\xce\x39\xd7\x2b\x64\xbb\xc6\xb4\x76\xa4\xf8\x4f\x8d\x87\x93\x80\xa3\x84\x88\xe4\xd6\xe5\x8c\xac\x03\x90\xae\x25\xa5\xfc\xb7\x3d\x47\x41\x4b\x4c\x26\xbb\xb9\xb4\xcc\x66\xe4\x25\x94\xbd\x56\xd8\x41\xa3\x60\x92\x34\x91\xd1\x17\xbe\x2c\x6e\xb2\x32\x0f\x3c\x61\x75\xe4\x4e\x27\xb6\x65\x3c\x5d\xac\x6f\xae\x73\x60\x0b\x67\x96\x0d\xca\x50\xaa\x85\x5a\x89\xe0\xff\x51\x1e\xa0\x4f\x14\x3e\x89\xf1\xda\x02\x84\x76\xbe\x4b\xf6\xd9\x4c\x80\xff\x72\x63\x39\xe8\xbc\xfb\x7d\xd9\xf8\xcf\x20\x22\x59\xc0\xac\xb6\x27\x6c\x28\x1e\x38\x47\xc2\xcc\x8d\x2f\xba\x84\x43\x8d\x2d\x3c\x60\x31\xf2\xa7\xb9\x5c\x1d\x8f\x9f\x3c\xc8\x6a\x5e\xff\x65\xcc\x01\x1d\xe9\x5a\xd8\x96\x85\x8e\x1f\x7f\x6d\x6b\x94\xbf\x49\xdf\xff\x5d\xe2\xd7\xfd\x71\xef\x10\x81\x34\x28\x5f\x61\xae\x47\x54\x83\x44\x2d\xc9\x0b\xf0\x13\xfa\xed\xf3\x77\x1c\x47\xc5\xb9\x6d\xc3\xcf\x8e\x48\x51\x00\x60\xad\x8d\x45\xfd\x54\x61\x62\x27\x80\xd8\x69\xd4\x61\x7b\x57\xfe\x3c\xb5\xcc\x02\x03\x15\x3a\xae"}, +{{0x5c,0xb5,0x14,0x21,0x74,0x82,0xbf,0x42,0xf6,0x11,0xfc,0xec,0x36,0xa5,0x28,0x68,0x07,0xc2,0xbd,0xbb,0x56,0x96,0x76,0x91,0x35,0x3f,0x54,0x31,0x0e,0x1a,0xd5,0x53,},{0x28,0x06,0x99,0x00,0x3d,0x5d,0x3e,0x1c,0x05,0xad,0x10,0xfb,0x10,0x95,0x9b,0xbc,0x59,0x5c,0xfe,0x21,0x30,0x69,0x96,0x5c,0xd8,0xcf,0x39,0xdd,0x42,0x6a,0x05,0x68,},{0xd5,0x3e,0xe2,0xe0,0xf0,0xfd,0x65,0x7b,0x20,0x52,0x47,0x8f,0xd1,0x5d,0xf1,0xd3,0x8f,0xe0,0xe9,0x3a,0x54,0x83,0xeb,0x4a,0x6e,0x7d,0xe9,0x3d,0x02,0xa4,0xcd,0x54,0x4d,0x8f,0xdd,0xdc,0xea,0x82,0x2b,0x71,0x57,0x6e,0xd0,0x28,0x53,0xd9,0xa6,0xb1,0x4e,0x1a,0x54,0x8a,0xef,0xe9,0x0d,0x92,0xf8,0x83,0x79,0x2b,0x7f,0x1d,0x86,0x09,},"\x2f\x57\x25\x8c\xca\x79\x32\xe5\x8b\xed\x54\x6c\xb0\x04\x11\x15\xbb\xad\x23\xd1\x83\x46\xef\x7a\xb5\xe3\x11\x00\x82\xb3\xa9\x71\x2f\x6c\xbe\x12\x70\xe6\xdc\x0c\xea\x33\x64\xa0\x6a\x5f\x2f\x28\x3e\xc3\x9b\x63\x05\x8d\x34\xd5\x99\x79\x07\x2f\xcb\xbd\x7a\x5d\x0f\x44\x2b\xbd\xf0\x82\xd5\xbf\xe2\x99\x8a\xeb\x51\xbd\x26\x12\x78\x03\xe5\xc7\x96\xc3\x88\x43\x20\x0a\xe2\xf6\xe6\x05\xaf\x31\x2f\x54\xfd\xff\x17\xed\x1d\xfa\xa8\x9d\x28\xfa\x67\xdc\xe4\x62\xde\x4f\xe2\x52\x68\x21\x2b\x28\x2e\x22\x2a\x44\x3e\x2f\x31\xe2\x69\x05\x41\x71\xaa\x73\xc7\x19\xa8\x96\xcd\xb7\xa5\x39\xdf\xd1\xd4\x29\x91\x97\x81\x97\xd7\xc4\xf2\xd3\x0a\x64\x1b\xe3\x4b\xf1\x38\x0a\x4f\x4d\xc6\xd9\xb1\x01\x63\x66\x36\xa4\x96\xbe\xb3\x57\xe3\x47\xc1\x66\x65\x16\xdf\x8e\xb5\x60\xa0\xe0\xd1\xe1\x52\x9c\xe3\x6a\x60\xe0\x0e\xd2\x78\xda\x38\x02\xbe\x19\x23\x42\x98\x9b\xb6\x11\xb4\xe3\xcb\xd9\xc3\x7e\x8c\xce\x07\xef\xc1\x2d\x29\xbe\xfd\x7e\x2f\x3a\xdb\x13\xd2\x8f\x70\x8d\x97\xb6\x3e\x10\x74\x82\xc8\x62\x95\x6d\x7c\xe8\xdf\xc2\xaf\x5c\xac\x8d\x51\x65\x92\x67\xb0\xbb\xed\xdd\x5e\xfa\x41\x4d\xde\xab\xd1\x7b\x23\xca\x6e\x84\x3f\xf4\x9e\xff\xc8\x2a\x5d\x07\xe3\x6a\x83\xb6\x7c\x2a\xd7\xe4\x8e\xb9\x99\x0b\x42\x1c\x55\x58\x00\x9b\xd6\x93\x4e\x86\xd5\x4a\x8a\x6a\xc4\x07\x87\x96\xe3\x05\xc7\xcc\x81\x0d\x3f\x66\xea\x6b\x95\x04\xfe\x0a\xe6\x75\x7c\x50\x4c\x55\x52\x53\x0a\x6f\x8b\xbb\x52\x40\x9b\xe0\x79\xd8\xe4\xa2\x8a\x6f\xd7\xdc\x89\x35\xf8\xeb\x94\x98\xad\xc0\xf2\x3d\x08\x07\xec\x86\x29\x5f\x48\x98\xf5\xd0\x5e\x15\x0b\xdc\x43\xaa\x8b\x7b\xdc\x89\x3a\x0a\x68\x4c\x30\x63\x89\x8b\x6c\x95\xe7\xd5\x6a\x4c\x10\x26\x90\x43\x8e\x9d\xf9\x97\x58\xa9\x0f\x47\xc6\x08\xda\xcc\x4c\xa2\x40\x26\x6f\xab\xa3\x5f\xa1\xeb\x2e\xaa\xbe\x28\x8d\x2c\x2a\xd5\x0b\x6c\xbf\x10\x7c\x00\x25\x75\xe9\x1f\xf4\x72\xa4\x41\x79\x40\x66\x7b\xe8\x18\x01\x73\x85\x4c\x93\xdf\x84\x46\x4b\xcd\x31\x2b\x7a\x7a\xe4\xdc\x2b\x90\x59\xfb\xe6\xf8\x3f\x53\x80\x64\x25\xbd\xff\x03\x1c\x6a\xed\x6e\xfa\xfd\x9d\xe8\xdc\xd0\xdf\xab\xea\x8e\x6f\xa6\x81\xe9\x91\x93\xfb\x3c\x64\x7e\x44\x21\x12\xc9\xa2\x3f\x59\x6e\x65\x41\x1d\x8d\x6b\xfc\x39\x23\x00\x4e\xce\x91\xea\x6d\xeb\x88\x11\x11\xb1\xdc\x29\x94\x3f\x57\x89\x81\xee\x8c\x3b\xce\x85\x25\xf7\x85\x65\xf3\x4b\x85\xff\x20\x01\x5f\xea\xe8\x46\xf9\x5b\x18\x70\x0b\xc5\xcd\xf1\x4b\x2d\xb6\xca\xc6\x98\x14\xd6\x3d\x74\xbf\x20\x32\x93\x03\xe5\xca\x9f\x04\x73\x1f\x68\x81\xce\xc6\xd3\xab\xf8\x7f\x5e\xac\x08\x73\x4f\xaa\x34\xcf\xf4\xd3\xcd\x9a\x4a\x11\xd7\xb1\x2f\x73\x25\x3b\x4d\xd0\xa4\x31\x78\xf0\xd3\xc1\x9c\x0c\x40\xd9\xed\x91\x8d\xd1\x76\x46\xf6\x16\xaf\x79\xfd\xf6\x19\x42\x62\xf0\xfa\x4f\x71\xb3\x18\x7d\xed\xca\x48\xd9\xcb\xcc\x19\x93\x1a\x15\x19\x67\x74\x56\x25\x6e\xd3\x83\x54\x56\x7c\x3a\x67\x57\x1c\xdf\x82\x17\x0a\x2c\x85\xbd\x2c\x5e\x68\xe0\x5a\x0f\x3b\x93\x90\x3f\x19\x1b\x89\x4f\x84\x94\x6f\x89\x00\x05\x68\x05\x4c\x1c\xea\x9f\xd0\xb8\xbb\x55\x01\x95\x06\xc5\x43\x41\xc2\x49\x31\x98\x45\x48\xba\x45\x8a\x4d\x81\x30\x89\x89\x6e\x86\xa2\xdc\x33\xd9\x46\x04\x00\x3f\x35\x4a\x7c\xc9\x41\xc7\x54\xaa\xea\x24\x25\x3c\xbe\x4c\xf2\x14\x7f\xfe\xc5\xe7\xb9\x50\xcb\xf2\x8e\x28\x44\x81"}, +{{0x87,0xd3,0xba,0x95,0xc4,0x0d,0xf8,0x00,0x69,0xb1,0x79,0x7d,0xdf,0x68,0xe8,0x66,0xe6,0x6d,0x46,0xc5,0x1f,0xde,0x60,0xe7,0x68,0xa9,0xdb,0xc5,0xc9,0x2f,0x57,0xa9,},{0x2b,0x81,0x2b,0x2c,0x9b,0x60,0xff,0x31,0x97,0x5c,0x42,0x9a,0x86,0x73,0x6d,0xcc,0x17,0xa5,0x8d,0x3d,0xc1,0xda,0xa3,0x46,0x23,0xa4,0xbb,0xcb,0xe2,0xcc,0x05,0x81,},{0xfa,0x0d,0x12,0xcd,0x53,0x23,0x6c,0x41,0x08,0x6b,0xea,0x8c,0x0c,0xc6,0x0b,0x77,0x64,0xa3,0xed,0x72,0xbd,0xeb,0x9d,0x1a,0xe5,0xee,0xac,0xb4,0x88,0x11,0xfe,0x52,0x97,0x62,0xa2,0xc6,0xf2,0xbb,0x06,0xd9,0xb3,0x18,0x21,0x8d,0x96,0x8f,0x64,0x44,0x35,0x49,0x7a,0x1b,0xd0,0xd0,0xd8,0xc1,0x61,0x2a,0xb8,0x99,0x6d,0x98,0xd7,0x07,},"\xe1\x12\x56\xf8\x2a\xd7\x6f\x3f\x4a\x49\xd7\xba\xd3\xce\xd8\x71\x8d\x36\xd2\xf2\xbb\x3d\x31\xbb\x61\xed\xd1\xec\xbc\xee\x66\x21\xfd\x2e\xee\xd3\xe3\xde\xb5\x97\xb1\x49\xff\x71\xb8\x51\xf6\x1c\x8c\x68\x19\xe1\x31\xf9\xa2\xaf\x76\x73\xc3\xf2\x07\x02\xac\xfd\xc8\xb8\xf9\x06\x4b\x41\x5c\x9a\x3e\x35\x56\x8e\x37\x1d\x74\x0a\x38\x12\x7c\x1f\x27\xb3\x91\xb4\x5d\x07\x04\x5a\xea\xf0\x0a\x54\xe5\xb7\xfa\x54\x8a\xfb\x5f\x96\xfe\xb5\xf5\xb4\x4f\x60\xcd\x17\x07\xe8\xfa\x95\x67\xf7\x80\x6e\x15\xf6\xa0\x1a\xa0\x20\x77\x73\x3f\xe7\x38\xb0\x8f\x21\xef\xbc\xf9\x8c\x19\xd5\xb9\x70\xe6\x16\x3e\x5f\xe8\xf4\x80\x0e\xf9\xed\x22\xa0\xf9\xb5\x12\x6f\xf1\xeb\x1c\x7d\x65\x01\x9c\x8b\x44\x03\x91\x92\x70\x29\xb8\x13\xda\xb7\xc7\xe8\x63\xd4\x82\x29\xf8\xdf\x85\x39\x43\x45\xfc\xc8\x8a\x30\x0f\x60\xa8\xd5\x16\xd8\x77\xa5\xa3\xa7\xe3\xc4\x9a\x9e\xb0\x6c\xd9\xf2\x66\x5c\xe2\xa8\x90\x22\x96\x2b\x1d\x49\x59\x2b\x09\xc7\x54\x3d\xa8\x35\xce\x63\xbc\x9a\xbb\x82\x21\x45\x76\x2b\x71\xcb\xe1\x50\x29\x2c\xe5\xc8\x70\x4e\x5a\xd3\x4f\xb4\x59\x2f\x97\x20\x44\xe4\x3e\x69\xf0\xe1\x67\x2d\x6c\x83\xcf\x25\xaa\xc6\x8e\xfe\x3d\x27\xaf\x2a\xd3\x42\x74\xb9\xd2\xb7\x77\x42\xd9\xc6\xdf\xbd\x57\xf9\x2f\xf6\x4d\x3e\x4c\x67\xc5\x41\xd8\x50\x2a\x7d\x03\x18\x95\xaf\x85\x31\x9a\x4e\xae\x2d\x25\x43\x35\x83\x5e\xff\x11\xe7\xa3\x67\x1a\x6a\x0d\x21\xb7\x2c\xe1\xfc\x2a\xcb\xa1\xa9\x20\x18\x38\x34\xbc\x0a\x4b\x73\xf6\x39\xff\xcb\x0f\x6b\x81\xcd\x92\x0f\x2e\x94\x20\xd6\x12\x16\x6d\x56\x82\xa0\x60\x60\xea\x0b\x6f\xa6\x95\xfe\xcc\x77\x04\xbb\xe4\xb0\x52\xaa\x3e\xc8\xf7\x20\xf7\xd4\xf3\x2e\x8a\xff\x86\xb8\x0b\x8c\x1c\xc1\x27\x64\xa0\x48\x74\x03\x7c\x31\x03\xe9\xdf\xec\xb8\xf7\xab\xcb\x0e\x07\x3b\x23\xe6\x7c\xa0\xa9\xb1\xfc\x72\x99\x3a\xbf\x31\xdb\xc2\x4a\x8f\xee\x09\x5b\x32\x51\xc2\x26\x26\xaf\x5d\xd1\xb6\xd3\x4b\xe5\xea\x06\xa0\x2a\xe1\x76\xc7\xb8\xcb\x9d\x06\x35\x01\xbe\x6f\x61\x20\x82\x88\x9f\xdb\xdc\xbf\xad\xc3\x3a\x0d\x31\x1b\x08\x0b\x8d\x64\xe4\x9f\x16\xb1\x6d\xd8\xed\xd3\xb2\xed\x11\x93\xa7\x4e\x5b\xe5\x07\x60\x9b\x04\x27\x27\xcc\xf0\x8a\xfb\x05\xcc\x6c\x50\x52\x4e\xf0\xe2\x66\x46\x21\xdc\x8b\x05\xb1\x5f\xfa\x81\xab\x6f\x7e\x3c\x8a\x5b\xb3\xea\xb1\xf6\x8e\x36\x56\xc1\x19\xd9\x69\xe4\x14\x4c\xf3\x28\x5a\xf2\x3c\x04\xdb\xec\xc0\x38\xae\xfd\x91\x83\xc4\xe7\x24\x47\xb2\xaa\xa8\x31\x5f\x46\x96\xce\x6d\x1e\xf4\x29\xba\x0e\x5c\x3d\x5f\xfa\x7f\x05\x0b\xe3\x9c\x7f\x61\x2f\x4e\x10\xf8\xef\x07\x0d\xf7\x2f\x8a\xdd\xbe\xaf\x33\x39\xc1\xad\x8b\x5f\xc3\x9a\x2e\xcf\x29\xa8\x7f\x82\xe2\x9a\x01\x17\xba\xac\x66\x25\xad\x5c\x80\xcf\xe7\x59\xfa\x1d\xbc\xfa\xa1\x2b\x37\x44\x77\xd8\x0b\xfc\xf0\x67\x96\xc3\x0f\x2c\x39\xcf\x03\x03\xd0\x0d\xc5\x6a\x32\xd1\xd0\x39\x59\x2d\xdb\x06\xc2\x2a\xa0\x68\x84\x1c\x0b\x46\xfd\x48\xdf\x8f\xbb\x74\x92\xcc\xbc\x59\x0c\x56\x3c\x8f\xec\xce\x42\x63\xc8\xc7\x53\x92\x18\xbb\x97\xb3\x57\x11\x53\x7e\x98\x81\x95\xdb\xf5\xbc\xd5\xcc\xaf\x06\xfa\xf5\x08\x47\x09\x77\xa5\x35\x8e\x6f\x02\x60\x83\x49\xfb\xb9\x9a\x23\xfb\xe3\x6b\x8c\x97\x15\x5a\xdc\x24\x6a\xd7\xd9\x3a\x8c\x20\x3f\x75\x44\x6c\x83\xc4\x34\x2c\x35\xba\x10\x4e\xcc\x67\xe6\x69\xdb\x4a\x95\x46\x6e\xe6\x8f\x45\x8a"}, +{{0x7c,0x27,0xae,0x47,0x07,0x2b,0x0c,0x9b,0x9c,0x2c,0x35,0x1f,0x13,0x27,0x89,0x98,0x95,0xef,0xa5,0x36,0xc9,0xc0,0x67,0xd0,0xe0,0xce,0x8e,0x82,0xe6,0x29,0x27,0x93,},{0xf9,0xfe,0xbd,0x12,0x1e,0x17,0xdb,0x72,0x29,0xb5,0x67,0x09,0x02,0x18,0x49,0xc3,0x5d,0x69,0xfa,0x08,0xb5,0x06,0x20,0xe6,0x67,0xf8,0x42,0xec,0x7a,0xc7,0x82,0xdc,},{0x32,0x71,0x96,0xdd,0xd4,0x3b,0xb6,0x02,0xd0,0x4d,0x19,0x64,0xcc,0xc0,0x59,0xed,0x62,0x7c,0xef,0x0a,0x88,0xd8,0xad,0x91,0xbe,0x49,0x31,0xf1,0x7c,0x25,0x0d,0x55,0x29,0xf5,0x52,0x79,0x4a,0x3e,0x26,0x9d,0x17,0xa6,0x3b,0xd3,0x29,0x33,0xeb,0x5e,0x51,0x9c,0x1d,0x50,0x65,0x74,0x77,0x0a,0xe4,0xa7,0x29,0x64,0xe0,0x6f,0x7d,0x00,},"\x15\x47\x87\x6a\x98\x8d\x1b\xe7\x14\xa4\x2f\xb9\x1c\xb0\x37\x63\xf1\x91\x3a\x89\x2e\xcb\xd4\xde\x2c\xcf\x83\x44\xd2\x07\x58\xb7\xb6\xd0\x02\x59\x10\x1f\xe9\x72\x25\xb2\x97\xf8\x7b\xfe\x22\x20\x04\x32\x5d\xb7\xf6\x32\xce\xaf\xfb\xd1\x34\xc9\x6c\xbd\x57\xe9\x85\xbe\xc8\x43\x4f\x81\xa4\xee\x6a\xf8\x5c\x3f\xad\xe5\x0e\x4c\x4e\xf2\x0c\xb0\x39\x35\x45\xe4\xd4\xa8\x6e\x1f\xa3\x9a\xaf\x33\x3f\xe4\xde\xd0\x54\xbf\xc0\x50\xa8\x98\x3a\x03\xdd\x1e\xcf\x2b\x5e\x95\x17\xba\xf9\xe1\x15\x21\x29\xa8\xa7\x59\x35\x71\x1e\xdb\x20\xaf\x5c\x8c\xf9\xc6\x94\xa3\x3c\xee\x45\x1c\xd9\x50\xb2\xff\xf0\x8e\x31\x58\xc5\xcf\xb7\xb1\x5c\xb3\xe9\x0d\x46\xf4\x94\xb6\xa1\x08\xd8\x88\x8d\x5e\xc2\x9a\x33\xc0\x66\x02\x3b\x49\x77\x09\xb2\xd9\x40\x1f\xea\xf2\xe7\x4f\xf2\x6c\x16\xd3\x6c\x39\xe6\x51\x7f\xf9\x54\xbd\x98\xbc\xe7\x70\x06\x71\x98\x8f\x66\xe8\x51\x07\x64\x4b\xa2\xea\x00\x7a\x13\x01\x8c\x1c\x14\x4e\x3c\x5b\xb8\x0d\xb9\x51\x1f\xcc\xa4\x10\x1b\xf4\x9f\x8c\x80\xff\x3c\xa7\xd2\x98\x25\x7c\xbf\xea\x62\x9f\x83\xd5\xe0\x66\x39\xd3\x1f\x63\x9d\xb4\xb8\x72\x6c\xbe\x22\x4d\x75\x88\x29\xba\xb1\x09\x05\x17\x1c\x9c\x0e\xc3\x70\xd5\x80\x31\xef\xe4\xcc\x5a\xe7\x2a\x49\x5a\xcf\xf6\xcb\x2e\xd9\xee\xc6\x58\xba\x11\x70\x88\xdd\x3c\x6e\xd1\xdf\x8f\x9c\xb1\x0b\xd4\xfe\x0e\x5e\x8a\xd9\xf5\x03\x4e\x34\x65\x2d\x98\x66\x8d\xb1\x5c\x85\x33\x39\x3a\x6e\x9e\xc0\x87\x0c\x35\x66\x6c\xe5\x4e\xfe\x2b\xcb\x45\xc3\x4a\x72\x30\xe6\xa7\x00\x67\x63\x49\xc7\xb3\xab\xf3\x1d\xe7\xb7\xb0\x52\x1f\x89\xb3\x0a\xc4\x03\x4c\x2a\x4b\xa8\x21\x8e\xef\xdf\x8d\x2a\x5c\x1f\x8e\xd9\xb7\x01\x57\x9e\x47\xaf\x8a\x52\x9a\x95\xa1\xff\x64\xd8\xfd\xb8\x85\xc3\x68\x39\xb4\xc5\xf6\xd7\x2a\x99\x25\x7e\x86\x78\xdc\xcf\x31\x27\x54\xb9\xd4\x61\x9b\xee\xce\xb8\x25\x52\x6d\xe6\x22\xbd\x96\x76\xfd\x5f\x35\x76\x93\xab\xab\x07\x8b\x9e\x03\xae\x21\xe8\x7c\xa1\x61\xe7\x78\xaf\x77\x09\x6e\xaa\xc2\xd2\xd3\x2b\xfe\xc8\xec\x94\xaf\x79\x65\xf6\x1d\x68\xef\x66\xa4\x52\x3c\x1c\xc7\x0c\x95\x19\xb0\x75\x0b\x3c\x9e\xed\x5a\xeb\xa9\xf0\xa9\xb7\xef\x52\xcd\x4a\x2d\xe2\x9b\x39\x5b\x70\x5f\xa5\x3f\x02\x8f\xa7\x66\x15\x9f\x20\xe7\x5f\x4d\x38\x4e\xc4\xfd\x66\xdf\x06\xe7\x44\xc9\x9a\xc8\x8c\xb8\x49\xc2\x85\x75\x7c\xc5\x57\xe2\xee\xdd\x86\x95\x9d\xa2\xc1\xb8\x1f\x5b\x27\x15\xa6\x51\x98\x48\x90\x1a\xe4\xf8\x9d\x09\x13\xc8\xde\x57\xc5\x3d\xad\xf2\xe5\xe1\xaa\x2a\x9c\x5f\x46\x4f\xc7\x61\x0e\x8e\xf5\xf5\xcd\xd8\x20\x3a\x67\xa9\x3c\x33\xa0\x6d\xab\x35\x8d\xc5\xae\x23\xed\xfe\xe6\x33\x42\x62\xf4\x7b\x19\xb1\x13\xd6\xca\xfe\xda\xc1\xb4\x39\x02\x53\x9d\x74\xfb\xa2\x9a\xaa\x7b\xce\x68\x88\x4b\x72\x61\x6a\x05\x42\xc9\xfc\x69\x54\x7c\xd1\x9a\xe1\xdf\x01\x72\x3a\xbd\xda\x65\xe9\xbf\xac\x5d\xa0\xd0\x42\x40\xc6\xa2\x17\x5c\x00\x62\xe4\xe1\xed\x8a\x5b\x39\x7a\xfc\xd4\xde\x38\xe8\x62\x09\x27\x2c\x7a\x42\x4b\x5a\xe8\xd5\xa4\x0b\x48\x4c\xe1\xb4\x70\x4a\xf2\x83\x16\x09\xad\x0f\x36\xe9\x0e\x07\xb2\xaf\xed\x01\xdc\x05\x57\x4a\xd3\x97\x17\x23\xc5\xb5\xc1\xdd\xd4\xfc\x8b\xd2\x63\xbc\xdf\x56\x8a\xf7\x5e\x73\xd8\xab\xd1\x00\x8c\x9e\xc7\x12\xf8\x0f\xfc\x65\xac\x34\xe2\xa7\x93\x04\xea\xde\x1d\x2a\x1d\xff\xec\x0e\x4c\x98\xc3\x58\x24\x68\xf3\x20\xbf\x8f\x66"}, +{{0x08,0xed,0xdc,0xb5,0x62,0x5a,0xe1,0x9f,0xfe,0x7b,0x49,0xa7,0xdc,0x82,0x9c,0x89,0x3c,0x75,0x38,0xb0,0x88,0x5e,0x18,0xf9,0x8d,0xb7,0x8c,0x8b,0xeb,0x56,0x9c,0x26,},{0x83,0x47,0x8b,0x1c,0x58,0x57,0x6a,0x0d,0x18,0x34,0xb2,0x8d,0x46,0xfb,0x80,0x51,0x6d,0x6f,0xb6,0xf9,0xf5,0x91,0x69,0x4b,0x44,0x35,0x2e,0xec,0xd1,0xe7,0xe8,0x9a,},{0xec,0xe7,0x53,0x22,0x99,0x51,0x54,0xb2,0x92,0x43,0x7e,0x47,0xd3,0x8a,0x6a,0x70,0xaf,0x37,0xe2,0x02,0x07,0x16,0xfd,0xe4,0x6b,0xfd,0x39,0x3b,0x3d,0x36,0x9b,0xdd,0xb5,0x32,0x53,0xb5,0x56,0x62,0x1c,0xfb,0x34,0xc8,0xa9,0x02,0x54,0xe1,0x32,0xfd,0x28,0xec,0xd0,0x98,0x43,0x34,0x13,0xa2,0x1b,0xd3,0xa9,0x79,0x8c,0xa1,0xf3,0x09,},"\x01\x5b\x1d\x3e\xeb\x00\x92\x9e\xa8\x0b\xd8\x68\x7d\x18\x28\x6f\x0a\xdf\xe6\x45\xcc\xf2\x5a\x22\xb5\x06\x19\x21\xe2\xa0\x30\xfc\x76\xd0\x33\xfb\x53\xd0\x93\x7c\x69\xb3\x1c\x5b\xe4\x99\x13\xca\x1f\x2c\x3d\xca\x12\x1b\x2b\x87\xc5\x9b\x3c\x84\xc7\xae\x52\xaf\x19\xc6\xb9\xfa\x1b\xd6\x75\xfb\x6d\xd8\xb3\x29\xd5\x66\x87\x86\xdc\x78\x83\xe2\xd2\xe8\x58\x6f\xf4\x12\x8b\x90\xde\xe8\x4b\xe0\xab\x54\xd6\x81\x3f\x7a\x8c\x61\x34\x75\x71\x73\x98\x17\x75\xde\x84\xc4\xdd\x39\xe3\x36\xf8\xa4\xef\x8d\xca\xde\xc9\x43\xe9\x0d\x42\x1b\x22\x9c\x11\x78\x5f\xcd\x3f\xe9\x63\x03\x74\x58\xe7\x6c\x82\x0b\x3b\xc2\xc9\x47\x60\x01\x26\x2b\x26\x1d\x28\xb6\x5b\x48\x9d\x76\xb4\xbe\x23\x65\xe4\xa8\x0f\xa8\x71\xb0\xa5\x3b\x6a\x5f\xb2\x43\x68\x82\x35\xac\xc5\xf4\x77\x4d\xb1\x5d\x47\xb4\x2d\xd6\xc8\xd9\xe1\x2d\xcb\x0b\x5d\x98\x0d\xab\x0f\x3a\xd8\xa4\x96\xf7\x6e\x50\x06\xc2\xca\x82\x67\x5f\xf1\x94\xca\xf8\x07\x0d\x04\xbd\x38\x4f\x97\xe5\x83\xe7\x3c\xbc\x4f\x7f\x25\x73\x10\xa6\x1b\x1c\x80\x62\x32\x2d\xce\x81\x15\xf6\xdd\x93\xee\xe8\xa9\x3f\xfa\x5c\xab\x66\x34\x11\x6e\x1a\xb7\x05\xfa\x86\xc4\xa8\xea\xa5\x56\xc6\xc8\x9d\xbc\xad\x01\x04\x36\xbf\xfe\x45\x18\x22\x49\x1f\x1e\xa8\x6c\x20\x20\x7e\x4d\x12\xdf\xa3\x62\x61\x6c\x58\x9f\x97\x10\x7e\xa5\xd8\xbd\x8a\x72\x15\xc6\x00\xff\xc7\x0b\x80\xe2\xab\xb1\x5a\xcb\xe4\xbe\xcc\xa2\x0d\x72\x15\x5a\xbc\x3d\xbe\x8e\x37\xcf\xd7\x3f\x74\x20\xf2\x1c\x9b\xcd\x0c\x32\x73\x51\x3b\x50\x49\x67\x08\x74\xd5\x51\x9b\x3b\xc1\xdb\x52\x3c\x1d\x7e\x90\xc1\x65\x96\x7c\x4c\xb2\x84\x5a\x2e\x8b\x47\xb5\x88\x92\x54\xf5\x8a\x9b\xbb\x82\x6f\x94\x52\x1c\xdb\xd0\x41\x6f\x5f\x18\xff\x78\xa3\xfd\x0d\x7a\xb8\x97\x90\x62\x64\x48\x3c\xde\x64\x2d\x8e\x70\x3f\xd8\x2e\x5a\xe7\x0a\x9f\x97\x8f\x64\xee\x80\x52\x05\x54\x85\x05\x28\x58\x1c\xa9\xa0\xb3\x8c\x19\x6f\xd1\x66\xda\xe5\x87\x9b\x3f\x72\xf5\x9c\xde\x91\xcc\xa2\xc8\xbf\xaa\x47\x8b\x98\xd6\x24\xcd\x34\x72\x44\x02\xde\x57\x8e\x57\x54\x82\x5c\xe2\x27\xd2\x87\x1b\x45\xa5\x11\x71\x49\x51\x5b\xff\x81\xa9\x23\x24\x6f\x3b\x72\xd0\x7b\xd4\x58\x12\x5c\x70\xa1\x4d\x87\xc3\xfd\x13\x39\x2a\x3b\xda\x65\x53\x01\x6e\x8b\x2d\x07\xbd\xe9\x03\xcf\x68\x7b\x44\x5c\xfd\x6f\x76\x14\x92\xeb\xa4\x65\x22\xad\xa8\x4a\x96\x15\xd8\xda\x34\x98\xb2\x58\x06\x72\x69\xb7\x88\xe5\x59\xb6\x59\xd4\xb4\x8a\x87\xd8\x80\xd6\x37\x8b\xe6\xa8\x87\x46\xf3\x5b\x32\x2b\x04\x78\x45\xaa\xdc\x52\x3b\xea\xff\x30\x70\xf7\x21\xc3\xc0\x71\xea\xa3\x19\xb7\xa4\x7c\x1b\x20\xd3\x00\xdc\x03\x21\x90\x9b\x66\x9e\x57\xd3\x9a\x1c\xe2\xfd\xbe\xaa\xfa\xc2\x13\x50\xec\x2d\x6e\x6d\x5b\x88\x01\x86\xc0\x28\xa8\x61\x47\x4d\x50\x76\xa4\xad\xc5\x03\x2f\xec\x91\x40\x78\x7c\x36\x80\x6e\xf7\x9c\x72\xe3\xa1\x9d\x8c\x8b\x70\xbd\xaf\x20\x72\x95\x54\x2d\x96\x82\x5a\x5d\xe7\xdf\xe1\x08\xef\x57\x45\x99\xb8\xf1\x84\xc6\x3a\x5a\x13\x1d\xb1\x9b\x3b\xe5\x3f\x69\x9c\x10\xfc\x4c\xa7\xc6\x3f\x35\x00\x21\x1b\x35\x6a\x0a\xc6\x64\xdd\xfc\x1a\x92\x52\x59\x00\x26\x39\x5b\x47\x9b\xe9\xa5\xe4\x75\x84\x23\x56\x0b\x65\xbb\xce\x5b\xba\xde\x49\x3b\x13\xd0\x0c\xf8\xc1\xd3\xb7\xe9\x22\x13\x67\xe8\xf0\xea\xda\xb6\xe6\xd1\xb5\xff\xfd\xe7\xb2\xd7\x41\xfc\x2c\x83\x02\x24\xff\xf7\xff\x14\xae\x5c\x07"}, +{{0x22,0x73,0x94,0x2d,0xb3,0xe5,0xd3,0x22,0x1e,0x80,0xd9,0x94,0xfd,0x5e,0x11,0x63,0xaf,0x55,0xf5,0x45,0x5a,0x8e,0x52,0xbe,0x85,0x2d,0xd3,0xad,0xf7,0x62,0xb4,0x40,},{0xbc,0x58,0x67,0x4e,0x99,0x6b,0x6f,0x3e,0x32,0x20,0xb3,0xe9,0x4f,0x00,0x67,0xbb,0x0e,0x9b,0x0d,0x97,0xd9,0xe1,0x05,0x9c,0xf1,0x39,0x97,0xa1,0x93,0xac,0x03,0x2a,},{0x87,0x4d,0xde,0xce,0x08,0xf3,0x0b,0x30,0xf0,0xd4,0xc8,0xb3,0xed,0x7c,0x61,0x51,0x49,0xb8,0xaa,0x74,0x0d,0xaa,0x34,0x7b,0x55,0x95,0x8f,0x1e,0x21,0x19,0x04,0x4f,0x69,0x5a,0x21,0x06,0x96,0x90,0x50,0x64,0x48,0xd8,0xe7,0x35,0x2b,0x90,0x46,0x51,0x1d,0x7f,0x39,0xa5,0x41,0x5b,0xb9,0xc5,0x70,0x50,0xfc,0x17,0x05,0x5c,0x38,0x08,},"\x8a\xa0\x50\x9e\x4b\x91\x41\x86\xff\xff\x07\xae\xb9\x7a\x04\xb5\x46\x27\x2d\xa2\xf9\xea\x7b\xfa\x65\x9a\x24\xcb\x50\x96\x6c\x23\xeb\x65\x42\xe4\xf2\x2d\xeb\xe3\x3b\x65\x76\x92\x45\xc4\xd1\xb5\xdc\xf3\xe6\x99\xc7\x0c\x5c\x2b\xaa\xd9\x73\x4e\x9d\x1e\xfe\x54\x48\xab\x71\xc8\x94\x6a\xec\xce\x52\x68\xd2\x6f\x19\xcf\x60\x5e\xb3\xbf\x38\xb0\xb3\x32\x26\x94\xac\x0d\xcb\x76\xb0\xf9\x46\x84\x2f\x6c\x5c\x68\xd7\x63\xfc\xe7\x47\x01\xbd\x6b\x78\xe7\x1c\x8c\x31\x42\xad\xd4\xed\x46\xe0\x96\x9b\xb9\x55\x5b\xe0\x36\x02\xd5\x62\xe4\xc8\x9f\x3a\x91\x99\x40\xe8\x83\xa9\x69\x40\x54\x2f\x27\x79\xfb\xf9\xec\x0a\x28\x5d\x9d\x8a\x72\x36\x01\x46\xe3\xff\xbd\xb7\x8d\x21\x03\x16\x03\x8d\x95\xd6\xab\x75\x71\x65\xaa\x94\x3c\x03\x3e\xeb\xb3\x21\xc0\x5a\x39\x95\x69\xbc\xf6\x6b\x4d\xdb\x0b\x2e\x0e\x33\xc4\x79\x3d\x81\x7c\xcf\xf5\x7f\x99\xb3\x18\x9c\x60\xd5\xd7\xb9\x41\x9d\x1e\xbc\x94\x3a\x79\xd4\xd8\xc3\x94\x56\x61\x80\x59\x4f\x55\x9a\x80\x52\x9c\xc1\xba\x28\x87\x7a\xf8\xf5\xc0\x50\x3e\x94\x3c\xd3\xaa\xd9\x98\x11\x64\x52\x72\xda\xfb\x49\xb9\xb3\xe6\x10\x7e\xb5\xe5\x18\x6e\x16\x08\x75\x71\x26\x05\x3d\xeb\xce\xc7\x5d\xd9\x56\x5c\xee\xa0\x6a\x13\x91\xa8\x22\x6d\x1f\x45\x93\x79\x22\x40\xcc\xd9\x7c\x67\xa6\xc2\xb1\x34\x4c\x22\xc9\x1f\x42\x03\x3a\xde\xf5\x28\x61\xf3\x2a\x4e\x07\x12\xa9\x17\x87\x9a\x0b\x05\x18\xb5\x42\x4b\xcd\xc0\x54\xb4\x4e\x97\x2e\xd2\x4d\x01\x68\x9f\x4f\x27\xf5\xf1\x76\xf0\xa5\x78\xab\x2d\x3c\x08\x78\x27\x2e\x8c\x08\xc2\x15\x82\x11\x86\x54\x12\x4d\xca\x39\x58\x53\x37\xc1\x3c\x18\x65\x81\x4c\xaf\x09\x96\xca\xdf\xa6\x5b\xe5\x80\xde\xe3\x22\xeb\xcc\xda\x70\x4b\x22\x80\x58\x26\x04\x06\x7d\xc3\xc6\xb1\xf7\xd8\xa2\x69\x78\xa6\x5c\xff\xd1\xed\x31\x96\xa2\xb0\x65\xfb\x3c\xaa\x79\xe6\xb5\xb6\x6c\x13\xd7\xbd\x7d\x0e\xc1\x4a\x3a\x4d\x58\x41\x3f\x21\x2f\x47\x1e\xca\xad\x3a\x84\xaf\x35\xe5\x98\xa8\x9f\xb3\x44\x7d\x33\x24\xf0\x20\xfb\xf1\xb7\x3e\x2a\x98\x6e\x0d\xa1\x6c\x01\x83\xbf\x92\xa3\x98\xc4\x19\xa0\xf9\xf3\x05\x37\xbe\xa0\xdf\x8d\xf2\xdc\x53\xc1\x54\xe8\xea\x16\x06\x89\xe7\xbb\x4d\x72\x9d\xd8\xab\x90\x03\x14\x27\xaa\x39\x45\x86\x3a\x85\xe8\x96\x52\xb9\x35\x38\x05\x16\x6f\x7c\x0a\x18\xc9\x39\x95\x4b\x27\x87\xc3\x70\x94\xf9\x25\x12\x72\x2e\x52\xb0\xc9\x76\xb9\xe4\x2a\xf4\x03\x9d\x2c\x05\x78\xff\x14\xfa\xe1\xd8\xc2\xd1\x39\x6b\xeb\x2d\x6a\xa6\xeb\xd5\x54\x74\xa9\x34\x98\x67\xa0\x3f\x3a\x99\xd7\x87\x80\x63\x4a\xb4\xb3\x5c\xfe\x1b\x87\xa9\x13\x32\x52\xa6\x98\xbc\x40\x7d\x63\x84\x28\x70\xe2\x2c\xcf\x39\x33\x62\x0a\xc0\x42\x3c\x3d\x1f\x68\x1d\xd7\x3c\x01\xd0\x6c\x3b\x94\x15\x06\xc9\x8e\xed\x9b\x78\x68\xe0\x17\xb7\xf9\x97\x16\xb0\xb7\x7f\x11\x32\x1e\x5a\xb2\x3d\xbf\xcf\xca\x93\x50\x84\x5e\xe1\x80\x44\x4c\x50\xff\x0a\x9c\x96\x5f\xcb\xf7\x77\x70\x8e\x4f\x34\xcc\xc6\x37\xc6\xa0\x8d\x85\x43\x84\xf8\xd3\xe2\x51\x69\x56\xc1\x51\xd0\x31\xbb\x1c\xbe\x71\x2a\x5e\xf9\xee\x16\x61\x92\x28\xbd\x29\x6f\x2a\xfe\x58\x2d\x99\x53\xd5\x90\xd1\x8b\xb2\x05\xf7\x0f\x84\x4c\x16\xc0\xa2\xd8\x31\x80\x37\xd4\x3d\xd8\x0f\x65\xc6\xa7\x53\xf2\xa8\xe2\x7c\x89\xc8\x3e\x7e\xd7\x0c\x52\xf7\x06\x2d\xfb\xb1\xf5\x44\xaa\x23\x6b\x5c\x70\x4e\x7b\x39\xce\x0a\x55\xfd\x46\x52\x80\x83\xca\x61"}, +{{0xdb,0xfa,0x45,0xab,0xaa,0x55,0x41,0x52,0x38,0xb1,0x28,0x76,0x34,0xd5,0xee,0xc4,0x02,0xda,0xdf,0x62,0x2e,0x27,0x0c,0x04,0xa8,0x91,0x4c,0xed,0x27,0x0a,0x72,0xbe,},{0xc0,0xfe,0x32,0x35,0x81,0xea,0x29,0x67,0x50,0x79,0x7e,0xb5,0x50,0x8c,0xa1,0x9a,0x58,0x3b,0x53,0x7f,0xa7,0xdf,0x45,0x29,0xf0,0x80,0x4a,0x33,0xc1,0xa4,0xbe,0xf4,},{0xa4,0x62,0xa9,0xba,0xa5,0x6d,0xc0,0xf7,0xa7,0x1b,0xf8,0x7b,0x95,0xf4,0x8d,0x64,0x20,0x22,0xd9,0xd1,0x73,0x3e,0xe3,0x68,0x37,0x77,0xa3,0x78,0x22,0x28,0xac,0x85,0xfc,0xd8,0x30,0x26,0xbe,0x4c,0xa9,0x7a,0x34,0x5b,0x08,0x4f,0x50,0x87,0x4e,0x91,0x24,0xe1,0x6b,0xa1,0x7d,0xea,0xd4,0xad,0x85,0xc0,0xe5,0x6f,0x16,0xef,0x18,0x04,},"\xe2\x6e\x8d\xcb\x44\xe6\x41\xfc\x20\x08\x0e\x95\x47\x4b\xd3\x9d\x71\x6c\x5a\xfe\x5a\x1f\xfb\x05\x6d\x1e\xaa\xb0\xc4\x9f\x85\x70\x71\x7d\xb6\x43\x7a\x03\x22\x8a\x9a\xd9\xf4\xbb\x0b\x34\x3b\x95\xe1\x60\x23\xc0\x80\x7e\xb2\xa1\x51\x06\xa6\xeb\x12\xdc\x76\x68\x3e\x69\xdd\xa3\x36\x31\x48\xc5\xd7\xdd\x97\x13\xaf\x6f\x87\xa0\x94\x10\xea\x8f\x76\xb6\xb7\x8a\x11\x44\x29\xbc\x85\xf7\x84\x81\x2f\xca\x31\xac\xb0\x30\x95\x52\xcc\x18\x8c\x6e\x96\x97\x09\x3c\xf4\x04\xc6\xf0\xf4\xab\xe8\xa1\x60\x86\x73\xfd\xfa\x5e\xb7\x8f\x65\xfc\x1d\x49\xcd\xec\x40\x94\xb1\xbd\x23\x4a\x46\xe0\xec\x62\xa4\xb6\xd3\x1b\x82\x96\x11\x54\x01\x27\x87\x6b\xff\x4c\x17\x3d\xe0\x58\xcf\x61\x00\x4b\x01\x4a\x7b\xdf\x79\x3d\xfd\x6b\x63\xc5\x07\xd2\xb2\x3e\x0f\x56\xbc\x2f\xe6\xba\xf6\x37\xce\xe4\x0d\x18\x99\x22\x95\xd8\x48\xef\x49\x8f\x8a\x16\x1b\xd8\x7e\x60\xc9\x1f\x97\xa9\x1e\x9e\xf3\xf6\xd9\x7f\x2b\x2d\x21\x04\xba\x6f\xdd\xd6\xc6\x80\x70\x62\x73\xda\xe8\x7e\x6e\xec\x1a\xf2\xa4\x59\x84\x98\x50\x69\xe8\x09\xe8\xde\x32\xc1\x28\x89\x29\x9a\x32\xd4\x0f\x38\x77\x45\x99\xac\x33\x24\xb7\xcb\x0a\x4e\xa6\x32\xc5\xf9\x10\xad\x87\xf5\xad\xbf\xa5\xc3\xbb\x20\x49\x82\x79\xfd\x53\xc1\xc2\x67\xfe\x0a\x84\x77\x30\x85\xda\x26\x6b\x25\x3c\xd8\x53\xdf\x7e\x96\x35\x58\xcb\x06\x88\x07\x80\x97\x34\x23\xc5\x64\xcd\x0b\xcd\x6b\x93\x33\x4c\x19\x59\x53\xd7\xcd\x89\x9f\x8a\x54\x7d\x1a\x1a\x0a\x8d\xef\xf1\x38\x1b\x43\x21\x57\x47\x28\xcf\x71\xb9\x6f\xf2\x09\xe8\x99\xda\xa8\xf1\x3f\x41\xb2\x30\xe1\x7b\xff\xdf\xdd\x2a\x89\x43\xaa\x5d\x21\xe5\xf3\x6e\x1d\xa0\x7e\xdd\x6c\xee\x92\xdc\x48\xb5\xb2\xa7\x58\x01\x46\xa9\xba\xf7\x13\x95\x0c\xe6\x76\x25\x5a\x89\xe3\x4f\x87\x87\x54\x7d\x62\x86\x8d\xb1\x4b\xa4\x65\x94\xda\x31\x0d\x7e\x2d\x9e\x7c\x7d\xbe\x17\xdb\xd7\x1e\xb4\x7c\x56\xc5\x72\x1d\xc9\x6d\x69\x64\x70\x57\x37\x94\x80\x94\x11\xcd\xfa\x27\x6b\x05\x9d\x00\x07\xc2\x5d\x74\xb2\xa6\x7d\x38\x24\x6d\xe1\x1e\xf4\x6d\xfe\x26\x70\x92\x6f\xe4\xb6\x36\x56\x23\x1b\xc7\x26\x8b\xba\x23\xf3\x78\xe8\x4a\x42\x8c\x3c\xbf\x45\xcc\x53\x96\x78\xfd\x46\x7c\xd3\x3d\xd0\x75\x7c\xfa\x02\x4e\x54\xda\x1f\xf5\x4c\xe8\x20\x22\x9b\x77\x8b\x18\x4b\xe1\xfa\x2e\x84\x68\xcc\x19\x95\x59\x40\x73\x5e\xaa\xa8\x84\x02\x2f\x64\x18\xb0\xb1\xf2\x6b\xcc\xf1\x69\xf1\xbc\xac\x7d\x82\xa3\x5a\xb6\xef\x84\x7e\x1d\xba\x53\x7d\xca\xff\x57\x25\x0a\x8d\x1c\x71\xfa\xcb\x13\x4c\xd0\x6b\x01\xc4\x53\x19\x13\x27\x45\xdc\x48\x88\x88\xa1\xd7\x76\x1b\x84\x86\xa3\x7e\x69\x88\xa1\x12\x0b\xcc\x16\x82\xdb\xfc\x89\x14\x3f\xc3\x5b\x46\x93\x5d\x8a\xcf\x6e\xf3\xc4\x2f\x0f\x4b\xf6\x79\xdf\xd6\xff\x44\xb6\xad\xa2\x6b\x01\xa9\xf8\x9f\x37\x4c\x7d\x2e\xe4\x8d\xfe\x1a\x41\x0e\x89\x7c\xdf\xd9\x7f\x62\x6d\x26\x68\x50\x28\x14\x40\x07\x93\xb3\xb0\x7c\x87\x20\xbb\xdd\xc5\x9c\xb0\xf9\xde\x96\x4a\xe0\x75\xb4\xaf\x3d\xd4\xba\xf6\xd0\xe4\xf9\x4f\x29\x4e\x81\x09\xd6\x57\x7c\x4f\x8a\x9c\x7a\x5f\x7d\x69\x4b\xf8\x8f\x1a\x5e\xa7\xeb\xa0\xa6\x6d\xa6\xc7\x70\xc0\x8b\x3a\xbf\xfc\x53\x4d\xf2\x19\xdc\x3e\x33\x23\xb0\x22\xe9\x6c\xc8\x60\x02\xb1\x89\x18\x1a\x1d\x2b\x52\x7d\x27\x95\x0b\x7f\x42\x5a\x47\xda\x40\x13\x77\x8b\xd0\x0b\x71\x10\x59\x22\x20\x49\x21\xe9\xdc\x69\x2c\x23\x3f\x7b\xaa\x04"}, +{{0xef,0x64,0xe1,0x7a,0x53,0xf7,0xfb,0xca,0xfe,0x3e,0xa4,0x68,0x76,0x84,0xa0,0xda,0xdb,0x18,0xd0,0x37,0x35,0xa4,0x0a,0x53,0xb3,0xed,0xb0,0x49,0x07,0xee,0x61,0x62,},{0x91,0x86,0xe6,0xbc,0x14,0x29,0x61,0xc4,0xd3,0xeb,0x36,0x9e,0x9e,0x11,0x57,0x82,0x92,0xde,0x5b,0x6a,0xf5,0x34,0xd4,0x23,0xff,0x24,0x0f,0xa2,0x6e,0x21,0xa7,0x81,},{0xf5,0x8f,0x39,0x6b,0xa2,0x7e,0x06,0x7a,0x5f,0xe0,0x03,0xe3,0x85,0x58,0x2a,0xe3,0x49,0x0e,0x05,0x95,0x77,0x15,0xd7,0x04,0xda,0x0d,0xa6,0x3a,0x64,0x19,0xd2,0xe4,0xf6,0xdc,0x66,0xb7,0xe8,0x8e,0x42,0x8a,0x6f,0x21,0xb9,0xea,0x20,0x22,0x99,0xa3,0xc3,0x6b,0x24,0x2b,0x0e,0xa0,0x64,0x76,0xff,0x12,0xd0,0xb6,0x58,0x0c,0x04,0x03,},"\x68\x82\x45\x6c\xc3\xd1\xad\x0d\xaa\x9b\x88\xef\xf0\x96\x9f\x15\xe9\x7b\x48\xd0\x51\x96\x7e\x13\x90\x84\x72\x25\xf2\x6a\xc2\x55\x59\xf0\x24\x6b\xf7\xd6\x83\xfa\x28\xec\xed\xad\x21\x49\x1d\x77\xbd\x26\x96\xfa\x83\x5d\x0f\xd1\x19\x88\x4f\xec\xe9\xd8\x03\x69\x1b\x2f\xd3\xde\x17\xee\x08\x7c\x74\x00\x7a\x7d\xe9\xbc\x65\x34\xbb\xfe\x95\xfd\x32\xe9\x7c\x37\x5f\x4c\xb6\x57\x31\xaa\x1e\x83\x46\xbe\xa2\x1b\xe9\xf2\xc3\xdc\x87\x4a\xf0\x43\x19\x06\xcc\xbc\x2c\x60\x01\x27\xf4\xd3\xb0\x69\xeb\x09\x1d\x16\x5e\xc4\x53\xe6\x72\xe9\x3c\xae\x8b\x72\xf0\x33\x71\xd8\xb8\xa8\x24\x4e\xc4\xec\x2e\x09\xf3\x1d\xf4\x02\x06\xa2\xb1\xc8\x4c\xaa\x1b\x99\x3c\xc6\x75\xfd\xe1\xc7\x9b\xd4\xa7\xd1\x59\x74\xfa\x29\xce\x2e\x89\x2c\x28\x99\xcf\x48\x2c\x3d\x96\x63\xf6\xd2\xa7\x97\x84\xf4\x1c\x1f\x58\x66\xd3\x7c\x85\x46\xf3\x57\xd5\x64\xd3\xc4\x21\x8d\xfa\x6d\x20\xb6\xc2\x82\xb4\x00\xfe\xdd\xe5\x24\x39\xd4\x72\x21\x2c\x57\x67\xa3\x5d\xa5\x20\x10\x32\xda\x87\x30\x96\x8b\x07\x20\xe8\xa6\x04\xde\x6c\x1b\xaa\x3f\x4e\x89\x6a\xc2\x61\x4f\xb1\xab\x6e\x3f\x6c\xf3\x87\xa8\xeb\x2f\xf8\xa9\x21\x47\xab\x34\x92\x38\x43\x2e\x50\x9d\x82\x9c\xb7\x5b\x2c\x17\x65\xc5\x12\x21\x84\x8e\x25\xaf\xff\x5f\x16\xe4\xdd\x0c\xd5\xc9\xf7\x13\xc4\xaa\xab\x2c\xe8\x36\xf8\x49\x45\x06\xb5\x30\x9d\xc2\xb0\xae\x74\x5b\xb9\xc4\x79\x80\x98\xfb\x86\x41\xd5\x20\xa0\x8b\x02\xf7\x5a\xd8\x0d\xbc\x2c\xe2\x9e\x89\x0b\x4d\x72\xa3\xff\xb2\xa1\xcb\xd5\x38\xe1\x22\x9f\x57\x9c\x29\xae\x66\xbc\xa8\x5e\x0f\xa0\x8c\x86\x47\xa1\xab\xcf\xe8\xa4\x9f\x5e\x50\x8d\x4d\x24\x95\x55\x66\x23\xd9\x26\xce\x49\xef\xa4\x35\x0a\xaa\xab\x5c\xec\x2c\xd8\x85\xbe\x1d\x63\x47\x5e\x3b\xab\x7c\x7c\xdc\x8d\x65\x61\x73\xb8\xd4\x56\x02\xf4\xb3\xd2\x81\x24\x1d\x17\x19\x03\x27\xb2\x4c\x38\x36\xb1\x93\x11\xa1\x93\xaf\x86\xa6\x76\x8f\x04\x85\x2a\xb0\x6e\x67\xc8\xea\xd5\x91\xcd\xcb\xf3\x78\x9c\x61\x32\x09\xcf\xe0\x3f\x58\xc0\x30\x5f\x63\x20\x3b\x48\x7f\x7c\x5f\xc0\x98\x87\x7e\xc9\x8a\x68\x9c\x9d\x35\xaf\x81\xe8\x40\x78\xd6\x6f\xe9\xe4\xec\xcb\xb1\xcc\x6c\x71\x99\x1c\x03\x01\x7b\xb8\x11\xf4\x1f\x07\xde\x68\xfa\xd1\x94\x14\x60\x61\x32\x4f\x3d\x0e\xf2\x17\xa5\x4c\xf3\x8f\x7a\x62\x5a\x38\x86\x9f\x67\xd0\xb7\x43\x1d\xf9\x37\xcd\xe3\x49\xc1\x75\xce\x8b\x26\xac\x88\xd3\x9a\x43\xe2\x79\xb0\x18\x76\x4e\xfa\x4d\xd6\x27\xcb\xf5\x91\xf6\x20\x9c\x4a\x5b\xb1\x9e\xbf\xa7\xc7\x13\x55\x92\xd0\x2e\x50\x1c\xae\x5e\x6b\x31\xc9\x0e\x72\xfa\xab\x47\xf7\xdc\xed\x2c\x48\xad\xf8\x84\x43\xb3\xed\xe6\x0c\xef\xb0\xd6\x37\x9d\x69\x22\xec\x43\x7f\x08\x6b\xad\x62\x17\xd4\xd4\xff\xef\x18\xe2\x25\x23\x66\x4b\xf4\xe9\xca\x1e\x65\xa2\x8c\x2a\x7a\x60\xc5\xf6\xbc\x90\x6b\x73\x7c\x29\x93\x5f\x90\x97\x46\x30\x48\x57\x5b\xef\xd1\xa2\x54\x9d\xc4\x74\xb1\x3e\x68\xae\xec\xf1\x66\x04\x3e\x07\x5a\xac\x51\x55\x40\xf8\x31\xb4\x30\x66\xce\xf9\x32\xe6\x3d\xcd\x5b\x37\xb6\x15\x78\xc3\x5b\x09\xe4\x5c\xc2\xa8\xde\xf5\x71\x03\xed\xfc\x5f\x64\x98\x31\xa8\x96\x1f\xe4\xa4\xb3\x72\x1f\x1d\x6d\xf4\xea\x9f\x03\x38\x81\xb4\x74\x30\x0e\x0f\x12\xcb\x9c\xd3\xba\xbd\xcf\xfb\xb9\x18\xdd\x9b\xb0\xe2\xf5\xb2\x10\x33\xe4\x30\x23\xa0\xd2\xe6\x6d\xa3\xab\x0f\x07\xee\x98\x8b\x16\x88\x9c\xa5\xd5\x1a\xbd\xc0\x5f\xde"}, +{{0x33,0x47,0xdc,0x47,0xbb,0x3d,0x2e,0x5d,0x02,0x86,0xac,0x06,0xa5,0x4f,0xd9,0x21,0xc9,0xe9,0x6b,0x68,0x99,0x86,0x2a,0x54,0xe5,0xcc,0x81,0x15,0xd3,0xd0,0xba,0x99,},{0xd0,0x0b,0x64,0x5d,0x86,0xdb,0xb7,0xe5,0x24,0x75,0x7e,0xc7,0x78,0xc6,0x2b,0x7e,0x60,0xd0,0xb6,0x57,0x68,0x83,0x33,0x8c,0x9b,0x67,0xc2,0xc7,0xe4,0x50,0x92,0x68,},{0x9a,0xb4,0x29,0x9b,0x17,0x72,0x93,0x44,0x75,0x0b,0x69,0xdc,0x60,0x37,0x36,0x8c,0x98,0xf4,0x7b,0xe6,0x27,0xfb,0xd9,0xad,0xfd,0x8d,0xb3,0x9f,0x99,0x64,0xdd,0xb7,0xbc,0x92,0xd6,0x74,0xc7,0xbe,0x74,0x07,0x56,0x39,0x6b,0xaa,0xee,0xac,0xbf,0x74,0x94,0x7b,0x61,0x91,0xc6,0xed,0x1f,0x5d,0x32,0xa6,0x3d,0xf3,0x6d,0x54,0x26,0x01,},"\xe2\xf4\x8e\xdf\x9d\x64\x33\x20\xab\x99\x1c\x8f\xf9\xf6\xaa\x75\xfe\x06\x6e\x7d\x88\xff\x1e\x47\x2a\x5a\xc9\xc5\x18\xde\x1f\xb6\x29\x83\xb1\x00\x7f\x64\x22\x80\x91\x17\xbd\xbe\x8a\x0e\x57\x87\xf6\x6b\xb0\x57\xd2\x7f\x12\x9a\x20\x0b\x40\x57\x6e\x17\x19\xcf\x9e\x98\xfc\xb7\x2a\xf9\x4b\xb8\x2e\xe7\x0f\x37\x19\xa2\xe2\xcd\x9b\x64\x77\x7c\xea\x5e\x44\x64\x59\x87\x4b\x74\xbf\xbf\x56\xb2\xd2\x52\x64\x00\x59\x2a\x9b\x45\xa5\xcb\x79\x80\x92\xb6\x0a\x81\xb7\x1d\x82\xf0\x68\x5f\xae\x7f\x81\x0b\x52\xd2\x26\xad\xac\x7a\xd8\xa9\x18\x3f\x09\xfe\xbe\xe9\xd2\x50\x46\xc0\xfe\x30\x66\x81\xac\xe2\xbf\xf9\x1b\x34\x82\xb0\xbc\x30\xb2\x02\x1c\x43\x41\x64\x5d\x67\x51\x34\xfe\x30\x81\xc5\x1e\x5c\x59\xe4\x0b\x37\x5a\x14\x34\xf6\x3b\x42\x6e\x30\x53\x0d\xa9\x35\x3b\xb2\xa9\x42\x32\x20\x43\x4a\xe5\x9d\x7b\x6f\xdc\x14\x3f\x49\x82\xeb\x8c\xfa\x77\x51\xb7\x5b\xf3\xe9\xc9\x13\xc7\x3b\x76\x0b\x07\xd3\x95\x31\x0c\x59\xf3\xb7\x7e\xbf\x12\xed\x2d\x7b\x03\x59\x0d\x33\x17\xaf\x17\xdf\x42\x1e\x78\xb0\x84\x9f\xd5\x6d\x94\x5c\x56\x96\xa0\x40\xfc\xaa\x78\xa9\x3e\xcc\x16\xd5\xac\x34\x45\x06\x36\x11\xf3\x01\x3e\x9a\x3a\xe2\xe1\xc2\x70\xdd\x01\xa8\xff\xe3\xe6\x12\x6b\xc1\xe4\xc9\x5f\x65\x47\xa8\x65\x1f\x26\xb6\x40\x4e\x39\xee\x4c\xe7\x61\x89\x18\xf3\xf9\x37\xa5\x25\x73\xec\x27\x7b\x77\x1e\x91\xad\x09\x6f\xa1\x5c\x7a\x34\x0a\x80\x9b\x47\x03\x18\xa4\x63\x64\x23\xeb\x48\x88\xa1\x21\x60\xc4\x66\x3f\xce\x29\x96\xd6\x38\x89\x6c\x83\x9b\x2c\x7a\xd4\xb3\xa9\xb2\xe6\xcb\x71\xe9\x12\xfe\x39\xb8\x43\xc6\xe0\x83\x2e\xca\x22\xde\x93\x8b\x50\xae\x86\x3e\x48\x58\x2c\x10\x85\x12\x32\xf7\x5e\x52\x25\xb8\x89\x6b\x5a\x47\x0f\x81\x8b\x6f\xa3\x9e\xb7\xbb\x59\x03\x57\x67\x86\x12\xd2\x5f\xe1\xa4\x0e\xa1\xb9\xd7\x1d\x88\x09\x09\xc1\xbd\x4a\xd1\x76\xcc\x0c\xef\xfd\xce\xe7\x09\x9e\x78\x82\xa7\xc9\x07\xe4\xbe\xc7\x98\x30\xc6\x77\x1a\xcb\x89\x94\x4b\xd5\x4a\x51\x65\xb3\x18\x70\x91\x69\x21\xb1\x98\xac\xd4\x43\x2e\x7e\xed\x8c\xe1\xde\xb3\x45\xb1\x07\xed\xa7\x60\x26\x6f\xcb\xda\x3b\xa5\x22\x94\x00\xa3\x03\x60\xa4\x64\x5c\xa8\xdb\x38\xc3\xd5\xf4\xa8\xde\xf1\x57\xbb\xdb\xbf\x2c\x1f\xa1\xdc\x6b\x05\x14\xa4\xf5\xa0\x36\x4f\x92\x83\x81\xb4\x0f\x95\x57\x9a\x26\x46\x7f\x22\x82\xa8\xa2\x55\x75\x84\x02\xac\x9c\xa8\x0e\x89\xb9\xcc\x68\x60\xa3\x4b\xb3\xf9\x0c\x32\x37\x65\x7c\x21\x29\xea\x48\xc8\x52\xb9\x25\x69\xe8\x11\x06\xbc\xe4\x61\xe2\x02\x44\x54\x82\x1a\x91\x75\x92\xd1\x99\x1b\x5b\x69\xf2\x7b\xbe\x01\x99\x77\x52\x8a\x2f\xc0\x11\x92\xc5\x6b\x4a\xea\x87\x3c\xf8\xc5\x8d\xfd\x7c\xb4\xb0\xe9\x17\xe8\x7a\x87\x04\xc9\x92\x82\x0f\x98\xd7\x74\x04\xd3\xf1\xd2\x05\x0c\x67\x43\xf6\xe9\x3c\xdb\x51\xa6\x1a\xa6\xf4\x5b\x35\x1b\x26\x46\x1d\x13\x29\xf3\x15\x12\x72\xac\x39\x62\x34\xd0\xd6\x7c\x17\x8a\xcf\x91\xfc\x51\x0d\x86\x42\x9c\x69\xa8\x7f\xdf\x10\x11\x55\xda\x8d\x94\xde\x67\x22\x23\x8a\x6f\xb1\x70\x16\x86\x2b\x11\xd5\x02\xc6\x67\xee\x9c\xa0\xaa\xbe\x1c\x20\xb9\x77\x89\xf1\x86\x7a\xdd\x78\xb8\xb8\x7e\x9a\xb5\x19\x34\xc0\xb4\xa1\x6c\x2c\xbc\x4d\x2e\xfe\xdb\x79\xc0\x5b\x23\xe0\xcf\x78\x92\x01\xac\x75\xfe\x07\x6d\x31\x5f\xcb\xac\x20\xba\x0d\x31\xe4\xdc\x61\x69\x27\xd6\xea\xb1\xb1\xc8\x7a\x1c\x9c\x77\x8e\x4b\xd2\x85\x29\x58\x74"}, +{{0xff,0x15,0xd6,0xe7,0x4e,0x28,0xe4,0x1d,0x05,0xa8,0x66,0x3a,0x70,0x2f,0x03,0x8d,0x5b,0x85,0x78,0xc4,0x27,0x5e,0x77,0x2b,0x73,0xba,0x44,0x0b,0xc5,0xf5,0x5a,0x06,},{0x47,0x47,0xe2,0xe9,0xb8,0x26,0x37,0xb3,0x84,0x4b,0x85,0xf7,0x5b,0x59,0xf7,0x13,0x6b,0x7f,0xdb,0x1a,0x62,0xe7,0xb7,0x0d,0x6a,0xac,0x17,0xb3,0xc5,0x75,0x2f,0x2f,},{0x42,0xc1,0x29,0x5f,0xaf,0xe2,0x6d,0xe3,0xea,0x34,0x92,0x6b,0xf1,0xef,0x80,0xbc,0xaf,0xe4,0x7b,0x21,0xb9,0x0e,0xae,0xd1,0x96,0x35,0xed,0x75,0x38,0xd7,0x67,0xcb,0xf3,0xa1,0xe5,0xde,0xda,0xab,0x82,0xad,0xf7,0x51,0x20,0x37,0x3e,0x92,0x32,0x02,0xf7,0xfd,0xa0,0x82,0x67,0x84,0x29,0x2e,0xba,0x8b,0x23,0x8b,0x6c,0xb8,0x83,0x04,},"\xce\x7b\xf9\x72\x84\x4f\x51\x84\xae\x8e\xac\x87\xb1\x2b\xe9\x20\x2c\x72\x39\x96\x1d\xc2\x3c\xd4\x1f\xf5\x5b\x9b\xfa\xac\x0c\xc0\x6f\x3f\x1d\xec\xfa\x95\x71\x09\x5c\x8e\x82\xb4\xeb\x6f\x8a\x1c\x52\xc8\xd3\xde\xaa\x61\xa9\xaa\x94\xe2\xec\xd9\xab\x5b\x80\x63\xf2\xda\x6d\x80\x15\xdf\x0a\x51\x44\xfa\x3a\x48\xe3\x05\xad\x9f\x41\xea\xa1\x1c\x4d\x74\x85\x43\x74\xec\xbf\x38\x2e\x30\x02\x57\x9a\x9a\x24\x9e\xfa\x1e\x1c\xa0\x4d\x33\x84\x47\xd7\xf2\x20\x67\x03\xe6\xca\xbf\x5b\xbd\x33\x2b\x42\x57\x3b\xcb\xd3\xb6\xf7\x1b\x7c\x3b\xf7\x3d\x4c\x77\x4a\xa0\x1e\x86\x68\x41\x43\x28\x29\xd0\x7f\x96\xe1\xf6\x1a\x20\x21\x6d\x96\x8c\x90\xe3\xed\x11\xf6\x63\xf7\xd6\x27\x16\x22\xfe\xfc\xf3\xab\x68\xf3\x44\x32\x85\x15\xd5\xcc\xe2\xce\x85\xe8\xbf\x3d\x1d\x09\x04\x36\x92\xe1\xfb\x8b\xbd\xdc\x07\xa4\xab\x0a\x3e\xef\x8c\xa6\xa4\x20\xe7\x4b\xff\x8d\x3d\x71\x55\x96\xaa\x82\x16\x82\x95\x4f\xe8\x96\x29\xae\x27\xc1\xbb\x03\xb6\xaa\x09\xf3\x6a\x39\xa3\xe3\x7b\xa9\x81\x32\xf4\xe2\x38\x88\xf9\xf3\x35\xe7\xbe\xaa\x2c\xb2\x72\x7a\xcc\x3d\x27\x77\x30\x9b\x85\x29\x52\x32\xe5\x4d\xa8\x8e\xbb\x6f\x10\x53\xd6\xde\x79\xac\x66\x09\x85\x2e\xb9\x3a\x0a\x35\xbc\x1a\x7b\xdc\x22\xd6\x28\xbc\x86\x12\x4d\x69\x6c\x3f\x98\x28\xb6\xf8\xb9\xaa\xde\x1a\x65\x21\x61\x77\x48\x6c\x25\x2a\x4b\x42\xd9\x0a\x4e\x0f\xea\x20\x93\x48\x9e\x24\x4d\x80\x8e\xf7\x02\x1a\x97\xd5\x60\x8c\x0a\xe1\xd6\x63\xc7\x75\xe8\xbb\x9e\x9a\x73\x15\xf1\xfe\xb6\xd1\x29\xb5\xa5\x41\xea\x59\x29\xa2\xc6\x33\xb6\xd8\xc3\xc4\x54\x41\x71\x79\x46\xcf\x87\x3e\x9b\x4c\x51\x21\x80\x13\x5d\x54\xf0\x53\xab\xe4\x4c\x6d\xf3\x9b\x7b\x06\x2e\xf7\x24\x01\x62\xcb\xd0\xb8\x51\xaf\xe5\xf9\x15\x36\xa9\x49\x94\x18\xe8\xbf\xf4\x99\x64\x73\xd8\x05\xeb\xc1\xae\x48\xda\x2d\x0b\x12\x9e\x8e\x82\x52\xf1\xd5\x3c\x32\x8f\x32\xdb\x25\x2d\xe3\xbe\xfb\xe5\xf3\x12\x80\x12\x11\x43\xa8\x00\x4a\x4c\xae\x63\x1c\x82\x74\x09\xe5\x20\xe3\x94\xcd\x0f\x89\x50\xcd\x4c\x3c\xf3\xf3\xdb\xd4\x95\x2a\x4d\xfe\x69\x87\x5f\x56\x53\x89\x06\x1a\xd0\xa0\xce\xe6\xb6\xaf\xf0\x9c\xec\xa2\x6d\x99\x0e\x89\x6a\x2a\xba\x9f\x3b\x26\x01\x5b\x63\x42\x37\x68\x68\x4c\x03\xed\x0d\xe6\xce\xe7\xac\x5b\xbd\xf9\xf4\x85\xc2\x27\x5c\xd1\x2a\xef\xa8\xf9\x07\xb8\x51\xa0\x2d\x51\xc3\x4f\x12\x1b\x77\xf3\xa5\x6a\x9e\xbd\x1d\x65\xff\xe8\x9b\xee\x38\x1f\xf2\xa7\x48\x0e\x89\x68\xcf\xf2\x5a\xc8\xd0\x4e\x14\x9a\x9d\x50\x27\xd1\x4b\x88\xf8\xae\x26\x04\xd2\xac\x22\xac\x67\xd1\x3e\x90\xad\xa6\x20\xc2\x04\x6d\x28\x29\x93\x84\xd0\x95\x9f\xb7\x6e\x22\x58\x87\x96\xce\x42\x7a\xae\xaf\x4e\x2a\x8a\xae\xc3\xe8\x7f\x84\xcc\xd0\x82\x52\x4c\x96\xd7\x66\xee\xc6\x6f\x0b\xec\x3e\x79\x95\x58\x14\x5f\x09\xd3\x30\x13\x4f\x1c\x63\xf3\x70\x53\xcd\x4b\xdc\x1c\x37\xfd\xe9\x72\x91\x85\x75\x51\xf5\x0a\xc8\xe1\x5f\x06\xac\x1c\x73\xda\xa1\xe8\xc5\xbc\x92\x77\xe3\xd6\x9c\xb4\x4a\x32\x37\xec\x57\xdb\xbc\xcf\xdf\x66\x85\xad\xa2\x0b\x74\xa1\xbc\x6b\x74\xab\x05\x69\x0e\xaf\x9b\xd0\xc4\xbe\x17\x04\x2f\x5c\xd3\x20\xcd\xd6\x13\xdc\x08\xd2\x9a\xf3\x46\xaa\x41\x91\xce\x0b\x4f\x85\xbb\x2a\xd7\xf3\xba\xc7\x38\xa9\x37\x7e\xc6\xb8\x40\x62\xcc\x70\xfc\xa9\xec\xfb\xe1\xf5\x7f\xe5\xb2\xce\x7a\x4f\x73\x9c\x81\xca\xbc\xde\x04\x64\x51\xdd\x61\xce\x1d\xbc"}, +{{0x1e,0xd3,0x7b,0x61,0x0b,0x8b,0x35,0x41,0x7d,0x04,0xe5,0x9a,0xaa,0xda,0xc6,0x88,0xff,0x81,0xf1,0xe5,0x07,0xc8,0x9b,0x4f,0x40,0x01,0x60,0x94,0x19,0x08,0xcb,0x8c,},{0x48,0xe8,0xcb,0xeb,0x12,0x40,0xbd,0xeb,0xf0,0xa2,0xd9,0x29,0x53,0xaa,0x89,0xb2,0x82,0xc4,0x9a,0xab,0x2c,0x38,0xae,0x69,0x04,0x4c,0x51,0x51,0x5c,0x33,0x00,0xd5,},{0x86,0x08,0x81,0x5e,0x10,0x59,0x0d,0x55,0x04,0x87,0x4d,0x89,0x99,0xfd,0x6f,0x09,0x62,0x6f,0x95,0x0b,0xe2,0x0c,0x91,0x2c,0x27,0xc9,0xde,0x6e,0x79,0xb0,0xfa,0xf7,0x77,0xa5,0x33,0xbd,0x5b,0xb6,0x67,0xab,0x51,0x3a,0x49,0x45,0x8e,0xcd,0x67,0x87,0xa0,0x9e,0xc0,0xdf,0x6c,0x9c,0x9d,0x63,0x33,0xc5,0xe3,0xae,0x61,0xea,0x37,0x0a,},"\x1e\x67\x67\xdf\x97\xdb\x1c\xfb\x40\x88\xda\x7b\x20\x0d\x9f\x59\xec\x8d\xd4\x53\x3b\x83\xbe\x30\x9f\x37\x65\x00\x31\x06\x57\x27\xcd\x52\x02\xce\xf4\x84\x26\xa5\xf3\xa1\x1d\x50\xb3\x81\xf8\xbc\x22\xff\x10\x18\x27\x35\x9f\x2d\x0a\x61\x0a\x4f\x75\x54\x64\xa0\xc8\x91\xcb\xd9\x8d\x2d\xcb\x41\xd9\x77\x9d\x28\x8f\xcf\x1f\xea\x62\xe5\x21\x63\xae\x67\xe9\x04\x28\xb8\x63\x98\xef\xa2\x18\xf1\xb9\x82\x08\x1f\xc5\x13\x30\x5f\xd3\xe8\xec\xe7\xf9\xac\xb0\xe1\x0e\x00\x1d\x2e\xd2\x99\xa4\x8a\x80\x87\x0b\x3d\x5d\x8a\xb9\x00\x63\x09\xb3\x15\x91\xca\xf0\x58\x33\x80\x07\x3a\x2d\xb6\x1f\x45\x25\x4a\xb9\x65\xb5\xe4\x67\x2c\x4b\xfa\xa8\x6e\x33\x6c\x49\x27\x85\x52\x72\x9f\xb2\xda\x76\xff\xe5\x02\xec\x61\xe1\x69\x6c\x7f\xc9\xef\x19\xf7\xcc\x2a\x27\x75\xb2\x97\x00\xcb\x38\x42\x94\x06\x3a\x17\xfe\xd4\xfc\x63\x5b\xc1\x32\x82\xa9\x0d\xad\x0c\x00\xaa\xdb\xcd\x56\x9f\x15\x6a\x85\x4f\x8b\xa9\xe7\xd6\x07\xd2\x0f\x2e\x9e\x53\x37\x98\x11\x61\xd8\x04\x64\x46\x68\xd0\x64\xfa\x63\xdc\xeb\x9f\x58\x01\x35\x3d\x0a\xb9\xf4\x1d\x1d\x8b\xdc\x76\xc1\x3a\xb2\xf0\x23\xea\x01\xad\xbc\x4c\x81\x68\xd9\x39\xe9\x8f\x64\xfd\x89\x19\x38\x4a\xbe\x76\x70\x92\x63\xc0\xcd\x7c\x3e\xfa\xdc\x28\x01\xcc\x4a\xbd\x80\xa0\x9b\xb3\xed\x6b\xb7\x8c\xd6\x20\x96\x9c\xd3\x5c\x6a\x3a\x5d\x01\x48\x5e\xad\x4c\x45\xeb\xb6\xac\x6a\x83\x21\x2a\x7c\x76\x67\x54\x27\xb2\x1d\xa8\xa7\xa5\x04\x7b\x30\xa6\x10\x0c\xda\x02\x47\x6c\x18\x6e\x6c\xe4\x0d\x27\x68\xa9\x42\xc9\xf8\x73\x05\xe9\xd3\x63\xb5\x24\xc0\x09\x4a\x9e\x2e\x29\xf5\x85\x89\x4c\x0a\xdb\xfc\xd6\x06\x90\xfc\x7f\xb0\xa9\xc7\x17\xcf\x43\xb4\x84\xfd\x45\x15\x1b\x13\x04\x16\x9c\x26\x92\x1d\xb2\x27\x6e\xc0\x5a\xd2\x2a\xd1\x66\x85\x4f\xd2\xf9\x40\x85\x77\x8c\x47\x0d\xc4\x52\xe5\xcf\xa4\xae\xe0\x4f\xac\xb7\x70\x52\x6e\x1f\x24\x8d\x3d\x15\xc2\x72\x80\xfd\xfa\x1f\xd2\xc1\x04\x4b\xcb\xc8\x81\xc3\xd9\x98\x15\xc9\x7f\xbe\xa4\x61\x10\xbe\x02\xda\xb7\x74\xf3\xa6\x10\xe5\x80\x2a\xbf\x36\xa4\x98\x75\xc6\x82\x63\x8e\x0a\xe4\xcc\x82\x77\xc5\xe9\xaa\x73\x07\x44\x5e\x6b\xbc\xbe\x54\x9e\xec\x2a\x45\xb1\x59\x7f\x74\x47\x10\x7b\x62\xe2\xce\xe0\xa5\xfc\x51\xbe\xae\x3e\x1f\xe9\xbe\xfb\x18\x85\xd9\xb3\x0f\x9b\x4f\x1f\x56\x20\x6d\xee\x0d\x67\x77\x9c\x57\xf4\x84\xc8\xc3\xc8\x99\xa5\x15\xa9\xd1\xc1\x0f\x60\x59\x84\x0c\x1c\x73\xd3\xf0\x5b\xcb\x88\x59\x0c\x52\xf7\xda\x39\x18\x38\xdc\x2e\x73\x22\x8f\x09\x81\xc2\x89\xa4\xc2\x7f\x0c\x75\x7f\xaf\x7b\x3b\x89\x14\x6e\x33\xda\xfa\x49\x0d\x9e\x0f\x92\x75\xb0\xcf\xa6\xa7\x71\x0a\x73\x83\x14\x59\x59\x5b\xf7\x32\x11\x2b\x62\xfc\x86\x4c\xa4\xc8\x29\x78\x4a\x3f\x16\xee\xc4\xe1\x8f\x93\x69\x18\xa7\xb9\x89\x16\x69\xe9\x33\x22\x3f\x74\x5f\xda\x56\x2b\xc0\xa4\xe6\x1e\x3d\x14\xea\x45\xdf\xc3\x27\xe2\xfc\x0c\xdf\xe6\xf2\xf9\x75\x46\xc9\x0f\xce\x82\xf5\x22\x29\x14\x80\x11\x1a\x1e\x6b\x93\x88\x27\x2c\x0b\xe2\x8d\x20\xed\x84\xbb\x84\xd4\x9b\xc1\x99\xcd\x59\x99\x48\xb8\xf2\x03\x9d\x07\x82\x7a\x3f\x40\x75\xd3\xa6\x7e\xe5\x72\xa0\x13\x79\xa3\x62\x13\xfe\x11\x6e\x76\x8b\x41\x14\xe8\xa4\xb3\x13\x4c\x38\x18\x96\x07\x72\xd7\x27\xb0\xca\x6f\x7c\x99\x7c\xa9\x98\x43\xb7\xeb\x02\xff\xc0\x13\x97\x1c\xbe\x0e\x6e\x60\xd4\x97\x73\xf1\xe8\xc0\xb3\x06\x06\x13\x1c\xb1\x0c\x3e\x04"}, +{{0x84,0x36,0x44,0x78,0xec,0x94,0xbd,0x25,0xc4,0xbd,0xb8,0x2d,0x29,0x62,0x29,0xe6,0xda,0xce,0x2b,0x13,0x59,0xd6,0xd2,0x1b,0xe2,0xb3,0xaf,0xcd,0x7b,0xda,0x19,0xc7,},{0xa1,0x81,0x4f,0x8c,0xe0,0xfc,0x3b,0x23,0x60,0x93,0xa5,0x0f,0x46,0x8c,0x13,0x16,0x21,0x1f,0xe6,0xc5,0x2e,0x23,0x45,0xd9,0xf0,0x76,0x6b,0x36,0x88,0xa0,0x3c,0xad,},{0xb4,0xc2,0x32,0x1a,0xde,0x3c,0x19,0xed,0x4e,0xd4,0xc6,0x39,0xd5,0xa4,0xd6,0xf2,0xbe,0x8e,0x2f,0xb1,0x3b,0xb7,0xbd,0x62,0x5a,0xd6,0xdc,0x87,0xe2,0xc2,0x0f,0x93,0xad,0x6b,0xe7,0xb7,0xe4,0x27,0x11,0xa8,0x78,0xdb,0x9d,0x76,0x05,0x4b,0xfd,0x7b,0xc2,0x5e,0x37,0x74,0xa9,0x3d,0xa1,0x54,0x3c,0x9b,0x4f,0x66,0x33,0xb0,0xbe,0x09,},"\x7b\xb7\x29\x3d\xe5\x5f\x05\x8f\xb2\xec\x22\xb6\x87\x26\x05\x43\xdc\xaa\x90\xf1\x40\xb9\xf4\x5e\xdd\xd4\xbc\x22\xe4\x09\x77\xe0\x0e\xd3\x3c\xd1\xef\x1b\xba\x13\xc1\xd0\x99\x08\x59\x00\x55\x69\xa8\x07\x67\xe4\x86\x4a\x2c\xd2\x88\xc8\x13\x93\xe0\x4a\xd9\x71\x78\x2e\x2b\xc4\x93\x10\x8c\xbe\x80\xda\xcf\x0b\x7b\x9c\xd5\x34\x98\x84\x07\xa4\xf9\x32\x7e\xc8\xe9\xc4\x04\x32\x84\xef\x6e\xe5\xa2\x6a\x5b\x41\x77\x65\xd3\xea\xbb\x48\xa0\x07\xe7\xc7\xf3\x29\x87\xd7\x0a\x13\x9a\xc4\x16\x78\xcd\xf7\xa5\x5c\xb8\x0c\xf9\xdb\x5e\xaa\x45\xf3\xde\x0f\xbf\xba\xdf\xfc\x40\x99\x63\x70\xe4\x8b\x1f\xf5\xed\xd9\x79\x40\xe7\x50\x79\x21\x64\x83\x6a\x4a\x5a\xc2\xe3\xff\x53\xe4\x8a\x1e\x55\x6d\xb9\xad\x0c\x5c\x0b\x94\x4f\x4a\xee\x51\x9a\x2b\x0a\x88\xbb\x1c\x1f\xc7\x45\x45\x24\xcd\x57\xaa\x53\x50\x98\x62\x43\xd3\x4f\xc5\x8e\x24\xe8\x19\xec\x0b\x85\x45\xd8\xdf\xcf\x6b\x20\x31\x14\x41\xd3\xa3\x5d\x3e\x71\xb3\xe3\xec\xd7\x88\x4d\xda\x84\x33\xa4\x05\xe3\xd9\x96\x90\x00\xc8\x20\xa8\x9b\x95\xd1\x97\x84\x1d\x98\xae\x73\x4a\x2e\x81\xda\xf6\xa7\xdc\xf5\x6c\xb2\xfc\x26\xf2\x16\x5a\x5f\x42\xb8\x6c\x7e\x9e\x5b\x11\x16\x17\x00\xa1\xab\x98\x31\xf3\xfa\xe5\x8e\x14\x20\x8b\xe1\xbf\x33\xb5\x8e\xcc\xe8\x1b\x0c\x6b\x7e\x02\xf8\x8a\xdf\x9a\xb0\x30\x26\x3e\x2c\xc9\xb6\xe3\x3e\xbc\xa3\xf4\x95\x49\x2e\x32\xbf\xe3\x72\x53\x7d\xe6\xc6\xb8\x76\x44\x82\x8f\x74\x94\x2a\x02\xb0\x07\xf1\x4c\x3f\xc5\xdb\xde\x76\x33\x3d\x36\xd0\x76\x31\xb7\xa9\x92\x4f\x71\x75\x50\x04\x06\x97\x92\x3f\xa7\xb9\x54\x6b\xfb\x02\x17\x02\x4e\xa3\xf2\x52\xb5\x15\xb5\xd6\x4a\x62\xc4\x8e\x02\x7c\xef\x67\x50\xbe\xda\x49\xa0\x24\x47\x03\x9b\x25\x0a\x0b\xda\x07\xdc\x06\x24\x91\xa6\x62\xe2\x68\x74\xc8\xd0\x0f\x80\xe6\xcf\xc8\xb3\x0f\x2c\x3b\xf7\x72\x0b\x57\xf2\x61\x5f\xc4\x78\xfe\xfa\xa6\xd3\x17\x05\xb4\x3c\x5a\x54\xf7\x58\x66\x6b\x30\x2a\x8d\x34\x95\x31\x31\x94\x1b\x79\x57\x73\x04\x76\x79\x4d\x0b\xd9\xd2\xdf\xa7\x2f\xd2\x03\xf2\x2d\xf5\xec\x6b\xba\xac\xe8\xb9\x39\x4b\xeb\xda\xea\xa5\x61\x46\x10\x11\xb4\xfc\xa6\x18\x5c\x9a\x38\x28\x3f\x54\x03\xfd\xac\x32\x6d\x1f\x73\x4c\x6a\x5d\xed\x67\x24\xd9\xf3\x84\xae\xbd\x6c\xab\xfc\xbe\xc1\x2a\xba\xb9\x82\x0d\x08\x07\x32\x51\x5e\x05\x00\xcf\x5d\x3e\x2f\x9e\xf8\x0a\x4d\x76\x46\xa7\xda\x9e\xff\x41\x0f\x50\x7c\x69\x87\x3b\x32\xd5\x40\xec\x32\xb2\x83\xef\x31\x79\xa4\xc6\x32\xb3\x66\x57\x6d\xff\x05\x8f\xaf\x8c\x8c\x70\xbc\x69\xbe\x80\x89\x82\xec\x14\x97\xae\x89\x11\xb0\x01\x65\xa6\x66\x95\xf4\xd3\xb9\x87\xe7\x39\x0b\x5c\xf8\x78\xe3\x5e\x67\x65\x41\x28\x5e\x4e\x13\xdf\xae\xb2\xf3\x68\xcb\x51\x1b\x77\x8b\x10\x6a\x42\x87\x78\xa1\xb8\xf2\xa7\xd2\xe0\x93\x51\x9b\xc9\xb5\x18\x8e\x38\xc6\x79\x3e\x96\xbd\x0d\x30\xe2\xa3\xdb\x9e\xe1\x46\x8c\x3d\xc8\x7c\xc3\x65\xc8\x10\xf9\xdb\xdf\x01\xa4\xb5\x14\x21\xf6\xfc\x8d\xfd\xa3\xa1\x6e\x2d\xa7\xca\x71\x59\xb6\x86\xa5\xe1\x67\x33\x89\x37\x88\x2f\xf7\x15\xd3\xe7\x50\xd9\x58\xfc\x9e\x4b\x1f\x05\x53\x12\x92\x99\xaa\x84\x30\x18\x3e\x50\x6c\xd7\xf2\xb2\x79\x07\x6e\x0e\x1c\xca\x97\x49\xcf\x12\x3c\xe5\x07\xfe\x07\xdd\xbb\xc4\xdc\xca\x6c\xdb\x9e\xf1\xb8\x33\xf6\x1d\x4b\xff\x00\xbe\xc0\x12\x15\x8f\x43\x2c\xeb\x75\xb4\xf2\xed\xb1\xbb\x84\xe5\xeb\xb9\x25\x9e\x09\xf9\x62\x5c\xe3"}, +{{0x00,0xdb,0x37,0xad,0x2a,0x19,0x5f,0x08,0xa0,0x84,0x40,0xd0,0x59,0x25,0x9e,0x53,0x9f,0xeb,0x40,0xb4,0x74,0x92,0x82,0x55,0xe7,0xc9,0x4e,0xbc,0x3b,0x05,0x03,0x8c,},{0x04,0xf8,0x8b,0xf6,0x39,0xe0,0xf7,0x1a,0x57,0xd0,0xd0,0xaf,0xff,0x5f,0xe9,0x7d,0xde,0x38,0x09,0xff,0x28,0xec,0x68,0xeb,0x6f,0xc4,0x23,0xf4,0xfa,0xff,0x43,0x90,},{0xf4,0xd1,0xc8,0x0f,0x5e,0x7b,0x91,0xc5,0xc7,0xa8,0x2a,0x68,0x2d,0x49,0xba,0x6f,0xb1,0x9d,0x40,0x0a,0x29,0x97,0x48,0xa0,0xc9,0x69,0xbb,0x99,0x81,0x69,0x98,0xbe,0x63,0x4e,0x84,0xda,0x78,0x58,0x1b,0x06,0xe3,0x47,0x0e,0xfe,0xc3,0x98,0x04,0xfe,0xd9,0x3d,0x29,0x73,0x9f,0x04,0x39,0xa8,0x09,0x5a,0xc4,0x0d,0x9d,0x38,0x5e,0x04,},"\x5a\x94\xf7\x29\xd3\x0d\xd8\xaa\xe2\xa5\xc8\xc2\x85\x47\xbf\x45\x06\x29\x5d\xc6\x1b\xfe\xad\x97\x27\x74\x60\x82\xd4\x3b\x0f\x81\x14\xc8\xc1\x8c\x5e\xda\xf2\xfe\xc7\xca\xe8\x19\x35\x63\x38\xf0\xbf\x11\x5a\x17\xb0\x38\xac\xfd\x7c\x96\xba\x62\x62\xca\xbd\x57\x10\xfc\x0e\xfb\x43\xd1\x3d\xf4\x06\x5b\xec\xbf\x1b\x9e\x27\x9c\x03\xec\x9b\xbf\xed\x54\xd9\xa1\x3f\xe0\x6a\x55\xa3\xbd\x05\xc8\x07\x85\x8b\x41\xe1\x8d\xbd\xe1\x3b\x09\x07\xd4\x03\x41\x32\x26\x2d\x9c\x2f\x4d\x2d\x37\x6e\x16\x09\xad\x28\x0d\xe2\x0b\xa7\x09\x84\x4d\xbd\x12\x95\x02\x57\xf1\xb0\x7e\xf8\xcc\x33\x37\xc0\x1a\x70\x26\x93\xfb\x4d\x92\xd0\x47\xe6\x98\xc3\xa6\xdd\x46\xc4\xa9\x2a\x10\xd4\xc7\x80\xe5\x2e\x50\x25\xe0\x9d\x56\x53\x5d\x7e\xeb\x9f\xe7\xf0\x33\xe6\xe9\x26\x0a\x68\xf9\xd5\x4b\x6f\x37\xcc\x06\x96\x56\xe3\xbc\xee\x06\x92\x2b\x34\x96\x81\xa8\xe7\x75\x1c\xde\xcb\xe1\xec\xb6\x63\xfb\xc6\xf7\xc8\x61\xf8\x53\xdc\x31\x0f\x33\xde\xfa\x98\xee\x34\x3a\x68\x63\x2e\xc2\x2c\xaf\xec\xb7\xf3\x21\x2f\x81\xe7\x0b\x71\x84\x3b\x9f\xe8\xc8\x6a\x68\xb5\xc8\x6f\x03\x22\xd3\x48\xa7\x6d\xa7\xf1\xba\x0c\xa3\xcd\x7b\x6f\xd1\x5f\xf8\x92\x92\xb3\xf6\x36\xcd\x08\xcf\x62\x5c\x74\xd5\x10\x2c\xab\xb5\x71\xa3\xdb\xa8\x6a\x1c\x92\xf4\x1c\x72\x03\xb4\x49\x42\xf5\xa2\x46\x25\xac\x37\xd7\x7e\x49\xa5\x7f\x11\x82\x38\x69\x9d\x80\x7c\x25\x0d\x5b\xf4\x6f\x7a\x3c\xec\x57\x79\xa6\xe5\xae\x1a\x6c\xa1\x60\xcf\xf3\x7f\xb3\xb7\x83\x88\xfe\x9c\x03\x0c\x40\xe7\x15\x46\x01\x08\x1a\x51\x7f\xc0\xaa\x18\x02\xcd\x3b\x84\x5b\x94\x6e\xfe\x94\xaa\x8b\x9e\x03\xf6\x8a\x80\xde\xd0\xdf\xbf\xad\x4d\xae\xe4\x0f\xa8\x38\xc1\x33\x84\x1a\xe8\xa3\xce\x0d\x79\xfa\x8a\x2b\x94\x34\xba\xc5\xe1\xda\x6e\x0c\x71\x93\xe8\xde\xa4\x35\xa0\x3a\x85\xf7\x61\x84\xf7\xeb\xe2\xaa\x74\x9b\xe9\x41\x31\x04\xa1\x78\x68\x9b\xa6\xd2\x7e\x94\xfc\xcf\x61\xeb\x3a\xba\x0e\x6a\x5a\x63\xaf\x0c\xa8\xf0\x5a\x35\xcb\x63\x70\x51\x94\xe4\x4d\x92\x93\xde\x39\x29\xb0\xd9\x2b\xe6\xf8\xe6\x27\xc3\x50\xa8\x3f\xc9\x00\x0a\xa9\x5b\x93\x82\x0b\xe9\x79\x5c\x80\xb5\x66\x2c\xd7\xb3\x48\x22\x32\x80\x61\x35\x6d\xc5\x80\x57\x8d\x1a\x35\xb1\x01\x40\xdc\xd2\x48\xe4\x85\x31\x04\xd2\xc5\xb2\xc1\x3f\xf6\x83\xdd\x5c\x30\x79\x4b\xe4\xa7\x68\x58\xaf\x1c\x0d\x9a\xf3\x47\xce\x1d\xcd\x97\x2e\xe4\x9a\xac\x12\xbb\xcd\x89\x9c\x93\x29\x87\x1d\x3e\x7a\x06\x83\xd1\x75\x77\x9a\xfe\x35\xf2\x6a\x2d\x24\x8f\xd7\x80\xea\x85\x1d\xc4\xba\x6d\x21\xf8\xa1\x71\xaa\x6c\xb8\x69\x7d\x9d\x11\x21\x61\x54\x03\x07\xcd\x54\xf9\x31\x77\x5d\x70\xb3\x3d\x3b\x6d\xe1\x09\x1f\xc1\x75\x05\x31\xc0\x8f\xa7\x0f\x7b\xe3\x8a\xa1\x10\xd6\x74\x6b\xb5\x65\xdb\x7b\x47\x0f\x90\x08\x50\xfb\xbf\x1c\x66\x2f\xd6\x13\xe4\xf3\xa5\x68\x95\x49\xe3\x10\x7e\x9b\x0f\x17\xde\xf7\xa5\xbd\x7f\xd7\x59\x6c\x4d\x04\xc7\xf4\x8c\x77\x9f\xc3\x5e\x09\x33\x5e\x1d\xf7\x84\x08\x4e\x55\xd8\x55\x1d\x1f\xf4\x9d\xe5\xb3\x11\xcd\x35\x0f\x34\x7a\x0b\xd2\x86\x3a\x2a\x30\xe6\xea\x18\x3a\xd2\xe3\xee\xde\xbc\x18\xdd\x28\xc6\xa5\x96\xe6\x93\xdc\x33\x89\xf7\xd9\x0b\x71\x3e\x3a\x85\xa6\x25\x16\x30\x5a\x70\x66\x7f\xc1\xfb\x3c\xb1\x0e\x8a\x95\x57\x50\x27\x39\x43\xc5\x68\xe1\x07\x69\xce\xf7\x81\x99\xdf\x44\x50\xdb\xc4\x90\xfe\xf1\xb3\x04\xb0\x52\x22\x1b\x2d\xb9\xc4\x4f\xe0\x03\x45"}, +{{0x6c,0xa1,0xa1,0x48,0x2a,0x07,0xf2,0xa6,0xc5,0x7f,0x04,0x11,0x97,0xb3,0x4a,0x51,0x19,0xe6,0x89,0x03,0xcf,0x6d,0xfb,0x51,0x71,0x1d,0x95,0x50,0x97,0x31,0x63,0xc0,},{0x80,0x34,0xa5,0x5e,0x3b,0x6e,0xd7,0x99,0xf4,0x9e,0x2e,0x70,0x3a,0x81,0xf4,0xac,0x02,0x57,0x3c,0x44,0x5d,0x76,0x5e,0x30,0x69,0xbe,0x42,0xf0,0x9c,0xbd,0x18,0xad,},{0xdd,0x9b,0xdb,0xad,0xd9,0xfd,0xc8,0x1c,0xe2,0x30,0x28,0x8c,0x4a,0x06,0x8d,0xf0,0x7e,0x18,0xb4,0xc7,0xcc,0x51,0xc0,0xca,0x48,0x11,0xdf,0xbd,0x04,0x76,0x5c,0x56,0xbc,0x88,0x32,0x40,0xe4,0x6e,0x3a,0x42,0xc0,0x1d,0x8d,0x24,0x24,0xfb,0xc3,0x32,0xb7,0xc5,0xa1,0x7b,0xce,0xb1,0xf6,0xe8,0xda,0xd0,0xbf,0xe5,0x62,0xca,0xd3,0x02,},"\x08\xfd\x84\x87\x50\x3c\x3f\x32\x96\xb6\xf1\xb6\x4d\x6e\x85\x90\x6f\xd5\x98\x6c\xf9\xc5\xd9\xfa\x8a\x59\xd9\x2f\x44\xe6\x47\x0a\xf3\x4b\xcd\xef\x33\x6f\xfd\xc8\x64\x56\xec\x7a\x7b\x57\x61\xf1\xad\xea\x02\x73\x26\x63\x0e\x68\xab\xc6\xb8\xcd\x5d\xdf\x40\xb6\x41\xa2\x59\xad\x02\x43\x21\xbf\x3e\xf9\x8e\x76\x32\x79\x71\x49\xc4\x92\xd5\x35\x94\x75\x2c\x55\x0d\xfb\xc4\xfa\x6b\xf4\x71\x76\xf4\x23\xa2\x70\x56\x93\x94\x7a\xa9\x0d\x68\xdd\xc8\xef\xb6\xcb\x9d\xbe\xca\xfd\x28\x30\xd0\x4f\xd9\x3b\x1e\x9e\x7c\x12\xb9\x3e\x0d\x0f\x3e\x26\x34\x90\x0f\x25\x86\x0d\xda\xdb\xae\xce\x17\x80\xff\x2d\x3f\x3d\x9f\xb8\x38\xfd\x0d\x5d\x66\xf8\xaf\xb3\x05\xff\x1a\x1a\xed\xca\x2b\x97\x4b\x63\xe4\x3f\x5b\x3c\xc9\xdf\xed\x1b\xcf\x11\x99\x91\x76\xed\x95\x85\xac\x82\x9b\xc6\x79\x4e\xf3\xac\xd8\x72\xe8\xd2\xe9\x26\x08\xb3\x20\xf8\x94\x99\x6a\x56\x2e\x1e\xb1\x77\xe2\x1b\xe5\x7c\x22\xc4\x1e\xc2\x59\xa3\xdf\xf9\xc7\xc9\x49\x1d\xb8\x38\xd7\x6c\xf9\xb0\x38\x31\x11\x59\x8e\x35\x7f\x44\xba\xbe\xbf\x12\x1b\xdb\x24\xee\x9d\x55\x7b\x7d\x5a\xf4\x91\xa0\xa0\x36\x5c\x90\x36\x1f\xe4\xf7\xe3\xd1\x3a\x17\xda\x3a\x39\xfd\x43\xf6\x90\xdf\xb0\xb2\xd8\x60\xca\xb4\x19\xf7\x75\xab\x71\x52\xcd\xc8\xf2\xaf\xdc\x50\xe8\xd5\xda\x5d\xa0\x17\x06\xee\xa2\xa2\xff\xad\x4b\xab\xee\x8b\x03\xda\x33\x6a\x4d\x84\x3d\x9d\x7e\x0a\x93\xf3\x6a\x92\xe6\x61\x0a\x36\x8b\x63\x13\x3f\x05\xa3\xfd\xc5\x5e\x3e\x1a\x44\x0b\x0f\x87\xa5\x33\x64\xc1\xd3\x72\x42\xc5\x7a\x10\x9e\x6d\xf6\x93\x45\xb0\x1c\x21\xc1\x08\x9e\x79\x0a\x66\xf4\xf3\x38\x0d\x3b\x76\xff\xb4\x20\xdf\xe1\xe6\x20\x0e\xac\xe5\x79\x26\x5a\x42\x7f\xbd\x35\x55\x14\xef\x95\x3e\x1a\x6e\x96\x8e\x37\x02\x1b\x3c\x6a\x29\x0d\xcd\x02\x93\xda\x67\x68\xda\xd7\xc6\x63\x11\x63\x30\x51\xc0\xac\xcb\x0b\x91\x65\x46\x4d\xfd\xdf\xde\xd2\x3b\xd1\x3e\xf9\x08\x74\x4f\x9c\x21\x11\xdc\x15\x31\x42\xd2\xf1\x05\x34\xd8\x93\xfe\x0b\x54\x5f\xec\x53\xfd\xb3\xb3\x5b\x51\x83\x98\xb0\x2a\xb2\x17\x91\xfa\x97\x7e\x30\xcf\x4b\x40\x4e\x7a\x29\x9d\x37\x87\x10\x8b\x83\x6a\xa0\xd5\x9c\x11\x4f\x1f\x36\x71\x9a\x7a\xcf\x85\xac\x99\x4d\x9c\xb7\x23\x06\xf2\x58\xf7\x8a\xc0\xa3\xb6\xc0\x53\x43\xe0\xb7\xa9\xaa\x72\x6e\x52\x26\x7e\xdf\x97\xf4\x97\x2f\x76\x64\xf4\x37\x20\xad\x33\xce\x6e\x61\x54\x40\xe3\x65\x37\xcb\xc5\x69\xbd\x6f\xf9\x4f\xfd\xae\xa5\x1e\x06\x02\x9d\xae\x78\xc5\xb9\x15\xc5\x37\xca\xea\x6f\x15\x04\x14\x79\x79\xb8\xaa\xae\x0b\xcd\x96\x18\x43\x7e\xbe\xd0\xb5\x5e\xfa\xec\x32\x0e\x84\xc7\x59\x59\xa3\x7a\x26\x0a\x02\xd4\xef\x1b\xb6\x26\x41\x52\x0f\x1a\x03\xdd\xea\x8c\x4c\x1d\xe8\xd7\xfa\xc5\x8d\xa4\x08\xb0\xab\x47\x57\xa1\x35\xf1\xd0\x75\xc9\xf7\xc9\x9f\xb9\x9d\xb9\x42\x7c\xe9\xb0\xd6\x26\xcb\x1a\xc1\x89\xad\x86\x63\xd7\xa7\x14\xfb\x5c\xd1\x58\x5c\x3b\xf9\x9a\x0a\xa4\x6d\x76\x39\x78\xd0\xb1\x2d\x65\xc4\x38\xbb\xb7\x3f\xea\xa5\x1b\xa2\x6a\x45\x9e\x7b\xea\x25\x43\x94\x66\xc0\x86\x13\xe4\x25\x40\xc8\xc6\xd5\x43\x67\xf2\x21\xfc\xce\x0c\x5e\xb6\xaf\x2f\xaa\x18\x1e\xa2\x15\x21\x80\x9b\xe7\x56\x49\xcf\x8d\xee\x76\x71\xdb\x7f\x94\x8f\x34\x6c\xbd\x03\x02\xbf\x9a\x06\xea\xbc\x72\xe2\xe5\x12\xb3\xdf\x88\x5f\x6d\xaa\x39\x8f\x93\xe3\x6d\xae\x2d\x6a\x04\x47\x81\x21\xf9\x77\x87\xd4\xce\xdf\xf6\xdb\x09\xaa\xf1\x0f\x27\xb1"}, +{{0x27,0x84,0xdf,0x91,0xfe,0xa1,0xb2,0xd2,0x1d,0x71,0x3d,0xe2,0xed,0xc6,0x65,0x24,0x51,0xa0,0xc1,0x59,0x54,0xb8,0x65,0x60,0x62,0xea,0x1d,0xed,0xc2,0x44,0x5b,0x2a,},{0x95,0x56,0xdb,0x53,0x70,0xf8,0xfb,0x3c,0x74,0x78,0xde,0x03,0xd2,0x3d,0xf1,0xcd,0xa9,0x6f,0x27,0x40,0x11,0x8e,0xfd,0xd3,0xd1,0xa9,0xfa,0x4c,0x3b,0xfe,0x88,0x49,},{0x17,0xd1,0x71,0xd9,0x46,0xde,0x35,0x16,0x15,0x84,0x07,0xe1,0x32,0xcc,0x1a,0xce,0xca,0xef,0xd6,0xd0,0x92,0x11,0x2b,0xe6,0x53,0x99,0x95,0x23,0xe2,0x0b,0xd4,0x95,0xf7,0xb7,0xf6,0x00,0xe8,0xd5,0xa6,0x71,0x33,0x0d,0x32,0x69,0x3d,0x60,0x19,0xc0,0x8d,0x2d,0x00,0x3b,0x17,0x6e,0x63,0x19,0xc3,0x53,0x94,0x20,0x0e,0x02,0x7d,0x0e,},"\x2e\x3b\xc5\x4d\xf4\x16\x74\x1d\xbe\x79\x16\xad\x25\xf0\x4e\x48\xd5\xa9\xd7\x7a\x62\x3e\x57\xf9\xcd\x61\xec\xb4\x4f\x09\xf7\x68\x33\xeb\x2a\x3e\x9a\xb7\xaa\x89\xff\x5d\x2d\x56\x0c\x07\x17\x7d\x85\x4d\x7c\x49\xcb\xef\x49\x2b\x7f\x4f\x7e\x56\x7d\xe1\x27\x51\x24\xe1\x6c\xa4\xa7\x98\x01\x62\xfa\x0f\xd1\x62\xa8\xe5\xfd\x6f\x35\x61\x70\x07\x03\x4b\xce\xec\x57\xc8\xfa\xf7\x66\x4f\x4b\x3b\xaf\xfd\xea\x8d\x8f\xc2\xba\x22\xd5\x85\xe9\xe2\xd7\x39\xf5\xff\xc9\x9b\x4e\x0d\xbe\x9c\x36\x86\x54\x7e\xa0\x48\x15\xa5\x9c\x4a\x25\xb5\xf2\x39\x06\x68\xe4\x18\xba\x0f\xcb\xdf\x4c\x4a\x51\xf3\x39\x05\xc7\x4f\xbb\x83\x0a\x19\xf9\xbc\x86\x36\xdb\xaa\xff\x20\x99\x95\x44\x79\x96\xd2\xe5\xb1\xc3\x77\xb4\xcb\x87\xa4\xe1\xef\xe1\x2d\xe3\x4d\x33\x59\x9f\xf3\x97\xb7\x40\x17\xd7\x11\xed\xd3\xe7\x72\x15\x5b\xe5\xa4\x40\x6e\x74\xcb\xe2\x93\x1e\xf5\x13\x59\xaf\xd5\x1b\x5b\x1a\x7b\x3e\xa2\x2e\xe8\xed\xa8\x14\x76\xbc\xc1\x7e\xa7\x68\x0f\x6f\x31\x04\x70\x3b\x9f\x2a\x35\xcf\x26\x27\xeb\x74\x1d\x1a\x30\xaa\x4b\xee\xf6\x57\x9e\xc7\xd0\xb0\x7a\x4e\xf3\x2a\xbc\xb4\xd7\x56\x97\x0f\x70\xa3\x67\x8e\x17\xe6\xe5\x73\x18\x90\xae\xbc\x8c\x92\xb9\x56\xd4\xb3\xb5\xfe\x2a\xdf\xd7\x9b\x21\x1a\x18\x83\xdf\xc8\xc9\xa4\xb1\xb9\xc8\xc1\xbb\x26\x5e\x1f\x3d\xd3\x92\x44\x5e\xa5\x9b\x59\x0a\x01\x95\x51\xf8\x12\x18\x49\xf4\x35\xb3\xac\x1b\x29\x90\x2f\xc8\x39\x25\x54\x05\x6b\x93\x90\x3d\x5f\x26\x3b\x3d\x54\x08\x43\xd6\xaf\xa7\x5a\x2a\xd8\x30\x4b\x76\x90\xde\x99\xa7\x34\xc3\xd1\x30\xb6\x95\x47\xb1\x8b\x09\xe9\x8c\xbf\x25\x27\x30\xe4\xae\xdb\x6d\xc4\xb5\x8b\x22\x43\xfe\x55\xe8\x09\x39\xd3\x7b\x0a\x59\xd7\x22\x26\xd8\xa2\xcc\x51\x53\x09\x5e\x15\x99\x4a\xd6\x21\x95\xaa\x31\x0f\x2a\x64\x26\x67\x6b\x66\x1e\x47\xb9\xfc\xff\xfa\x04\xd6\xdc\x62\x5f\x29\xf4\x4c\x7c\xf6\x20\xb3\x78\xa6\x5d\x23\x83\x44\xb3\x80\x44\x8c\xd1\x19\xcc\x7f\x37\x3f\x62\xcd\xfa\xd6\x41\x49\x90\x63\x53\xf3\xa5\x41\x07\xc5\xdb\xa6\x5e\x3c\xc4\x94\xb0\x53\x1f\x4d\x64\x74\x93\x63\xf2\x30\x73\x8b\x2c\xfe\xed\x98\x35\x20\x22\x7d\xd5\xbc\x43\xbe\x59\xb3\x26\x8e\x28\x32\x16\xf6\xe9\xc7\x5e\x0c\x1c\x71\x27\x2e\x54\xfd\xb2\x9c\x78\x58\xd2\x87\xd1\xef\xa1\x91\x7b\xe3\x7c\x8e\xea\xb5\xe4\x4c\x3a\xd7\xb3\x6e\x8a\xc9\xf6\x69\x91\xeb\x82\xa5\x14\x8e\x59\x72\x03\x4a\xd0\x1c\x62\x61\x5a\x45\x15\x45\x79\xfa\x50\x86\x9e\x7b\xe9\x87\x6b\x56\x56\xea\xad\x2e\x43\x02\x5a\x62\xdd\x13\x4b\x61\x2d\x8f\x4d\x5e\xbc\xf8\x05\x6e\x19\x8b\x71\x34\x38\xe8\xe0\xe3\x47\xca\xfb\xfc\xb8\x9e\x39\x4a\xa3\x30\xd4\xc7\x88\xd4\x9c\x65\x8f\xcf\xc8\x0b\x3e\x00\x78\xf0\xe8\xe1\x9a\xa9\xb8\xfe\x8e\xb0\xba\xb9\x3d\xe7\x85\xd0\x43\xe0\xf4\x75\xae\xb6\x0d\x62\xe3\x8f\xb1\xf8\x38\x4a\x00\xb7\xa9\x02\xda\xee\x13\xd2\x13\x62\x69\xe5\x08\x01\xb8\x0a\x65\xb2\xf9\x13\xcf\xe3\xff\xb3\x65\xd9\xaa\x2f\xd1\x93\x72\xa0\xb0\x22\x56\x95\x44\x4e\x4b\xc5\x48\x71\xd1\x08\xe0\x9c\x7e\x1c\x2b\x42\xdc\xbb\xac\xce\x24\xea\x5b\xd5\xbf\x1f\xcf\x4a\xc6\x97\xa3\xfe\x09\xa5\x46\x77\xb7\xa8\xdc\x8d\x5e\xec\xb8\x6c\xc7\x92\xee\x9b\x6f\xea\x2d\xe1\x6a\x47\x32\x69\xfd\xc6\x5d\xbb\x73\xc2\x58\xc8\x21\x44\x04\x07\xc6\x42\xf7\xd3\xd3\xf5\xc7\x08\xd5\x53\x32\xda\x83\x43\x10\x6c\x19\xb2\x30\xa5\x14\x27\xf3\xb7\x71\x91\x6a\xe3\x68\x8b"}, +{{0x4b,0xb7,0x92,0x36,0xfa,0xda,0x31,0x44,0xb6,0x82,0x96,0x49,0x9b,0xa4,0x4a,0xe5,0x34,0x07,0x4c,0xa9,0x4d,0x4b,0x58,0x1e,0x5e,0xdc,0xff,0xfe,0x13,0xb3,0xad,0x19,},{0x0a,0x83,0x99,0xf1,0xe5,0xa4,0x23,0xdc,0xf7,0xb2,0x5b,0x2f,0xb0,0xac,0x9e,0x1e,0x95,0x48,0x14,0x8b,0xea,0x84,0xd0,0x21,0xe0,0x42,0x87,0x60,0xe0,0x5d,0x58,0xbf,},{0x69,0x8f,0xab,0x68,0x51,0x0d,0xb8,0x12,0x1a,0x46,0x5d,0xb7,0x7e,0x4f,0x8b,0x58,0x6a,0xee,0x89,0x58,0x16,0xe6,0x3b,0xbf,0x0b,0xeb,0x24,0x2d,0xb4,0xe8,0x4c,0x15,0x7f,0x4b,0xe2,0x01,0xae,0x65,0x64,0x51,0x7a,0x87,0x0d,0x17,0xf6,0x0c,0x85,0x83,0x70,0xc0,0x1c,0xca,0x17,0x18,0x9c,0xb4,0x18,0x9e,0x81,0x43,0x91,0xd1,0x50,0x0d,},"\xad\x81\xab\xf6\x93\x7a\x7a\xcd\x7f\x18\x37\xf0\x4d\x3f\x10\xe7\x08\xc6\x1a\x5f\xbe\xde\xee\x4d\xb7\x6e\x15\x98\x57\x03\x84\xe6\xef\xec\xe9\x7c\x92\x5d\x2e\x5c\x34\x88\xca\xb1\x0b\x5b\x52\xb8\xa5\x48\x6e\x99\xd8\xff\xe8\x6c\x19\x81\xa1\xf1\xd5\x32\xdc\xd4\xd4\x89\xe5\x54\x6d\x86\x65\x32\x98\xe7\xa5\xf9\x6e\x81\x44\x55\x2d\xda\x8a\x18\xe7\x5b\x5f\x73\x55\xb1\x35\x41\x62\x11\x06\xe4\x97\xe5\x1a\x56\xd8\x65\x9d\x19\x8f\xe1\x00\x37\xe2\x21\x28\xaf\xc2\x71\x4a\x2c\xb5\xa1\x2c\xc5\xdb\x09\x68\xa3\x43\xef\x91\x8e\x87\x69\xdd\x6a\x3e\x5b\x9e\x32\xaa\xb6\x6c\xb0\x23\x9e\xbe\x4c\x17\xf1\x82\x18\xe2\x52\xeb\xa6\x16\x2e\x97\x70\x49\xeb\xac\x0b\x38\x04\x8b\x3a\xaf\xb7\xd4\xd7\x22\x63\xe9\x21\x28\x99\xa3\xbf\xe0\xa6\x9c\x99\xe2\x2a\xc6\x1c\x5e\x96\x12\x45\x63\x03\xd9\x24\x58\xb5\xc5\x02\x91\x6c\x34\xa8\xee\x5c\xd9\xa5\x82\xa5\x25\x76\xb6\xdc\x9d\x7d\x4c\x64\x2f\x21\x29\x98\xbf\x33\x58\xd4\xa8\xc2\xea\x67\x68\x6e\x55\xd4\x89\xf6\xa7\x6e\x6b\x07\x0e\x6e\x99\x5a\x74\x53\x26\xc9\xaa\x63\x63\x0a\x00\x33\xad\x30\x72\x1a\xa6\x5f\xac\x60\x4a\x6e\x58\xc7\x50\x72\x1a\x56\xca\x67\x60\xc9\x41\x34\xd6\x11\xfa\xb4\xd3\x54\xe4\xf6\x6a\x29\x67\x7b\x1a\x66\x66\x01\xe9\xda\x79\xf2\x13\xf5\x82\x03\x74\x33\xc0\x7f\x94\xd5\xf0\xde\x6a\xa9\xfa\xa0\xb3\x2f\x7b\x02\x3f\xb9\xfc\x13\x5a\x26\xf9\x70\x52\xac\x80\xb3\x9b\x30\x6a\xed\x13\x92\x6c\x28\x54\x19\xa2\x9b\x20\xe2\x37\x0d\x8a\x09\x5b\x32\x25\x8f\xa9\x89\x34\x89\xee\x21\x08\x9c\x75\x2e\xc0\x62\xe1\x20\x35\x9e\x2f\x35\x15\x12\x82\x54\xc8\x09\x8c\xca\x65\xa9\x1a\x02\x2d\xd0\x57\xa2\xc2\xa1\xb6\xb8\x5d\x13\x7c\x3c\x96\x7d\xcb\x70\xaa\x17\xa2\xff\x4b\x37\x67\x8b\x38\x29\x02\xf0\xf9\x31\xee\x74\x3f\xc3\x98\xac\x1b\x8c\x10\x46\x98\x67\x30\x84\x79\xe4\x0d\x7f\x2f\x04\xa4\xb0\x4c\x44\x89\x15\x84\x88\xdd\xb7\xbe\xc5\xa4\x7f\x20\xff\x35\x6d\x99\xa1\xb3\xe9\xd0\xb7\xfe\x9b\x0a\xd9\x49\xf2\x98\x96\x0e\xfa\x4d\x97\x28\xf8\x10\x1c\xf5\x3d\xa3\xbf\xfd\xd9\x52\x4b\xf4\x40\xa5\x8b\x32\x73\x8d\x0b\x62\x93\xe8\x53\xf4\x66\xff\xd4\x2c\x56\x07\xac\x9e\x35\x3b\xa0\x3e\xfb\x57\x8c\xc9\x96\x3d\x8a\xaa\x9d\x2e\x26\x6d\x1d\x2a\xe9\x29\x6f\x30\xc9\xef\x44\xec\x69\x10\x30\xd5\x96\xa4\x01\xb6\xce\xe7\x2a\x54\x0e\xf3\xc4\x2e\xc0\x17\x42\x66\xba\x54\x01\xf3\x54\xad\xc8\xe2\x54\x04\x43\x7e\x88\x8b\x08\x28\x69\x39\xbe\xde\x30\x8a\xcd\x30\x32\x7e\xbf\xf0\x62\x70\x09\x7c\xc2\x94\xf0\xa0\xf3\x9f\x9a\xa3\xc6\x65\x85\xca\x47\xe6\x0c\x4b\x8e\xa3\x60\x89\xeb\x8a\x90\x88\xbb\x18\xb0\x34\x31\x35\xbb\x6a\x45\x6d\x2f\x6a\x3b\xf3\x90\x72\x3e\x78\xb4\x2c\x03\x7c\x2d\xe2\xe1\x43\x2c\xaa\xd3\xa5\x94\x02\x12\x94\xd4\x3f\x5b\x15\xa2\xe8\x19\xdc\x74\x8e\x45\x1d\xe4\x00\x68\xc8\xf0\x32\xf1\x3b\x47\x11\x37\x70\x12\xed\xcd\x4f\x11\xde\xc1\x11\x1b\x12\xeb\x6e\x1b\x00\x63\x38\x18\x70\x6d\x71\x32\xd9\x91\xce\x20\xdf\x3b\x92\x1d\xb2\x18\x5e\xe2\x5b\xb6\xf5\x82\x75\x76\xec\x01\xad\x89\x0f\x79\x79\x3b\xaa\x35\x8c\x2b\xbf\xb6\xfa\xad\x11\xd8\xcb\x0d\x0d\x2d\x2b\x29\x81\xfb\xf4\xe3\x72\x34\x9f\xc6\xa0\x1c\x36\x07\x7b\x59\x32\x5f\x70\x2b\x38\x00\x59\xa6\x5c\xf2\xf5\xea\x98\xd6\xbd\xc8\x15\x20\x53\xb8\x5b\x28\xc8\x1e\x41\x3c\x4c\xac\x7e\x22\x6c\x13\xdb\x32\x67\xd2\x18\x30\xf0\xe5\x43\x11\x02\x91\x70\x05"}, +{{0xaf,0xd7,0x65,0xe6,0xaa,0xc0,0x14,0x6d,0x48,0x11,0xef,0x95,0x97,0xbc,0x3f,0x44,0x76,0x3f,0x03,0x37,0x8b,0x7b,0xe0,0x33,0xd6,0xe6,0x4c,0xa2,0x9d,0xec,0xae,0xf9,},{0x6b,0xb7,0x61,0x23,0xd9,0x25,0x89,0x22,0x68,0x6c,0x53,0xfb,0x69,0x17,0xb9,0xa4,0x59,0xca,0xbd,0x30,0xbe,0x8c,0x43,0x97,0x0d,0x80,0xf5,0x35,0x0c,0x2d,0x98,0xef,},{0x3d,0xc9,0x19,0x4d,0x50,0x81,0x14,0x19,0x04,0x9e,0xaa,0x07,0xb6,0x55,0xb7,0xd4,0x06,0x4b,0xcb,0x0e,0x7f,0xb5,0xf9,0xe5,0x32,0x6b,0x5f,0xc8,0x56,0xfc,0x0a,0xb8,0x70,0x59,0x73,0xae,0x10,0x01,0xdf,0x55,0x37,0x39,0x77,0xdd,0xe2,0xd9,0xb8,0x10,0x79,0x55,0x14,0x14,0xad,0xc7,0x1c,0xc8,0x52,0xd4,0x99,0xb0,0xcf,0x82,0x4f,0x07,},"\x18\x3b\x10\x92\xc7\x90\x4e\x47\xa1\x42\x03\x17\xa2\x5d\x0f\x59\x11\x0a\xa8\x4d\x6b\x34\x19\xad\x45\x68\x65\xc4\x3b\x29\xe9\xd1\xda\xcf\x75\x5d\x9e\x5c\xf9\x4c\x55\x91\xd5\xd9\x12\xd0\x5c\xa9\xa5\x2d\x01\x5d\x6e\x8f\x5d\xc9\x4e\xfd\xce\x0d\x7c\xf5\x65\x12\x03\xb1\x1e\x54\x27\xa9\xf6\x79\x42\x9e\x00\x41\x4a\x48\xea\xb1\x3f\xd8\xe5\x8b\x87\xeb\xa3\x9d\x10\x25\xd6\xa1\x8b\x2c\xdc\xbe\x14\x74\x36\xdb\xf3\x8a\x1c\xe8\x64\x13\xae\x31\x87\x65\xe1\xbb\x1d\xf7\xe2\xb3\xbe\x97\xe9\x04\x08\xb1\x17\x17\xcf\x45\x9b\xcd\x0f\x3c\xac\x58\xb4\xa0\xd3\x5b\xff\xb5\x33\xe2\x0d\xf3\x74\x51\xc1\x14\x01\xce\x1d\xab\x02\x05\x5c\x7e\x08\xc5\xec\x46\x39\x0c\xd6\x17\xa6\xb5\xf2\x2f\x65\x18\x30\xa1\x11\x2a\x06\xed\xe4\xc4\x0a\xb7\x95\x78\x51\xd6\xc6\x6f\x17\x1c\xd1\x62\x41\x59\x09\x00\xb8\x52\xa3\xd0\x19\x95\x7b\xe1\xb7\xbb\x7a\xcb\x89\x23\xf2\xa3\x57\xc3\x26\x44\x56\xcf\xca\x9b\x42\x9d\x71\xfe\xcb\x7e\xda\xe3\x9b\x25\x2b\x4e\xb6\x10\xe8\xc7\x18\x83\x56\x99\x75\x4b\x8d\x41\x24\xb4\x92\x48\x8e\xde\x62\x61\x0c\xce\x44\xb5\x92\x18\x66\x3b\x6c\x96\x46\xa1\x4a\x84\x17\xed\xdb\xb6\xf4\xfb\xe5\xa4\xbb\xbb\x48\x2b\x37\xa4\x45\xe3\xc1\x6b\x65\xa1\x41\xcd\x3e\x12\xa5\xb2\xc0\x48\x1d\x61\x4d\x6d\x20\x84\x79\xb9\xb2\x09\xb8\x28\x85\x4d\xae\x0e\xa1\xed\xed\x50\x65\x55\xfe\x18\xe1\x85\x40\x05\xcf\x00\x1a\x80\x77\x08\x34\x98\xd2\x7f\xad\xf1\x18\x28\x6b\x53\xb8\x97\x4d\x69\xfa\x28\x25\xbe\x8c\xa3\xd6\x03\x6a\x92\xca\x52\xf9\x1d\xde\x6d\x5b\x1f\xfe\x28\x88\xf4\xd6\x07\x79\xfa\xd1\xfb\x41\xd8\xc0\x71\x40\x49\xaf\x68\x1b\x75\x5f\x2d\x42\x04\xee\xcd\x09\xe0\x77\x21\x0a\x48\xa1\x95\xe7\x2c\x80\xe1\x27\xc3\xd4\x87\x50\x95\xc6\x57\x0a\x1f\x78\x09\x59\x07\x52\x8c\xf7\x74\x6f\x31\xd9\x71\x11\xc6\xf4\xcb\x25\xb3\x74\x12\x99\xa7\x57\x48\x22\xd4\x6b\x6e\x79\xed\x23\xc2\xfe\x05\x7b\x3a\xc7\x29\x0b\x46\x0b\x16\x6e\xe9\x0a\x45\x56\x2e\xff\xed\xcc\x6b\xa8\xf4\x79\x5f\x73\x95\x81\x8d\xb5\x6b\x6e\xdd\x59\xca\x2c\xc4\xae\xa1\x84\x1f\xd9\x56\x5b\xec\xd6\xc0\x81\x04\xcd\xee\x26\xba\x9d\xe2\x00\x77\x3d\x09\x1b\xc7\x7a\x57\xc5\x47\xf1\xa6\xba\x0a\x2c\xd7\x17\xab\x32\x56\x1d\x74\x22\xea\x72\x35\xad\xb0\xcb\x36\xbf\x5c\xbd\xf8\x8f\xca\xe0\x66\x30\xa1\x56\x47\xd9\xa3\x57\xb4\xe0\xe5\x02\xd2\x73\xf3\x79\x6a\x51\xe0\xbc\x3f\xed\xbf\x7a\x1e\x64\xaa\xd7\x22\xaa\xc5\xfd\x02\x2f\xa7\x9d\x60\xfc\x70\x73\x25\xf1\x27\xeb\x1f\x03\x86\x87\x95\xcc\xdc\x0b\x4c\xb2\x6f\x20\x23\xd1\x52\x15\x3a\x97\xa2\x60\xbf\xf1\x17\x45\xd2\xe2\xcc\x0b\xf8\x60\xd4\xa6\xe3\x58\xa6\xd8\x17\x6d\x2a\xc1\x78\xa9\xae\x1a\x2d\xc7\x5e\x8b\x49\x04\x08\xff\x7c\xdf\x99\x13\x29\xf3\x3c\xb0\xc0\x5e\x1e\x35\x69\x25\x08\x7e\x0b\x8d\x96\xa5\x23\x51\xd1\xd1\x77\x68\xeb\x13\x4c\xdb\x21\xa1\x54\x6a\xae\xdc\xc6\x87\xdf\xa1\xb2\x2e\x92\xfb\x52\x41\xa8\x36\x77\xa1\x53\x44\x5b\x77\xd5\xe7\x03\x50\x8e\x2a\xbc\x58\x8a\x9f\x42\xe5\xbc\x71\x06\x73\xe4\xdd\x8a\xd7\x03\xfa\xb2\xd7\xdb\x1e\xb8\x42\x26\xc8\x9d\x87\x62\xa7\x09\xe3\xe9\x13\x8a\x1f\xa7\x90\xf2\x92\x9b\xff\x61\xbc\x1e\xa6\xe8\xaa\x1a\xd0\xe3\x88\x7d\x70\xa5\x6d\x4e\x65\x47\xfc\x60\x6a\x50\xd3\xbe\x3b\xd6\xdb\x03\x66\x3e\x00\xca\x9e\x4f\x24\xfe\x8c\xbf\xd7\xd8\xc9\x73\x8d\x63\x67\x55\x4b\x7b\x60\x1f\x74\x19\x0b\x59\x70\xa3\x98"}, +{{0xeb,0x34,0x71,0x45,0xf3,0x39,0xed,0xd8,0x02,0x78,0x5b,0x6f,0xbe,0xcd,0x5c,0xb8,0x08,0x89,0xac,0x7c,0xe4,0xeb,0xad,0x2f,0x67,0x07,0x67,0x65,0xdb,0x93,0x9b,0xca,},{0x99,0x4a,0x45,0x6e,0xad,0xa0,0x30,0x20,0x92,0x1c,0x3d,0x10,0x9c,0x13,0x5e,0xb9,0x61,0xfc,0xd4,0xa0,0xa4,0x00,0xba,0xfd,0x32,0xca,0x06,0x1b,0xbc,0x86,0x25,0x43,},{0xfd,0xbd,0x15,0xe1,0xe6,0x46,0x9d,0xf7,0x20,0xd9,0x55,0x2c,0xb5,0xdd,0x17,0x7b,0xcb,0xd2,0x92,0xfc,0xda,0x83,0xcd,0x93,0xc8,0x8d,0x01,0x14,0x91,0x2d,0xc8,0x70,0x31,0x09,0xba,0xc0,0xd4,0x59,0xac,0xe9,0x95,0x7d,0xf2,0x29,0x3a,0xc1,0x6d,0x40,0xd5,0x14,0x89,0x35,0x56,0x85,0x32,0x99,0xb9,0x7b,0x4f,0xd4,0x13,0x7a,0x3d,0x00,},"\x5b\x8b\x31\xba\xf8\x84\x83\xf0\x95\xb5\xd0\x2e\x17\xd8\xb7\xb4\x6c\xf4\x64\x60\xe6\x4c\x6b\x02\xc5\x6d\x8d\xaf\xe3\x48\x23\x70\x6c\xb5\xc1\x5f\x33\x8a\xd9\xb5\x65\x86\xa9\x49\x71\x1a\xa7\x31\x2c\xc9\x34\x50\xd2\xfb\x9a\xf4\x61\x3f\xc3\x07\x93\xa6\x31\xa5\x5c\x14\xe5\x3c\x0c\xb1\x5f\x06\x11\x63\x99\x39\x8c\x8d\xd6\x18\x76\xc6\x29\x15\xf9\xf9\xe4\xcd\xf8\xf7\xd8\x9a\xde\x12\x9e\x6d\xde\x7d\x63\x67\x1a\x18\x63\xf5\xda\x8f\x42\xea\x64\xc0\x79\xec\xb9\xa2\xc1\xb1\xdd\x9a\xda\xe6\x0e\x96\xb9\xcb\xbc\x76\x24\x53\x2a\xa1\x79\x75\xeb\xa1\x7a\x7a\xf0\x2b\xfb\x21\x9a\xac\x02\xb3\xd4\x30\x6c\xd3\x89\x33\xa8\x50\x60\xcd\x62\xab\x51\x3a\x39\x65\xb0\x91\x50\xa4\x88\xc9\x2b\xf7\xca\xb0\x48\x2e\xee\x56\x46\x3f\x01\x39\x00\x9b\x9f\xbb\x3f\xf4\xec\xae\x21\x1f\x42\x8b\x5b\xfb\x88\x76\xf0\x04\x98\x3b\x90\xc4\x47\x84\x6c\xa4\xb7\x45\x66\xe9\x79\xbc\x30\xc9\x5e\x99\xfa\xab\x69\xa3\xeb\xbf\xe4\xda\x60\x34\xc8\x2d\x63\xe9\xc5\xcc\xaf\x84\x86\xaf\x3b\x5e\x0d\x38\x14\x22\x93\x8b\x0c\x22\xf5\x16\x95\x5b\xdc\x36\x94\x31\x73\xf5\x83\x27\x08\xa3\x3c\xf5\x2d\x88\x75\xd9\x7f\xde\x58\x5b\x49\x17\xe4\xad\xec\xdd\x1e\x79\x85\x67\x62\x03\x3a\xf2\x2f\x25\x4b\x50\xce\x9d\x0c\x70\x0e\x77\xa7\x31\x55\x4f\xa0\x11\x3a\x0c\x66\x66\x83\xf3\xfd\xb1\x9e\x3a\x42\x63\x02\x23\x0b\x63\xe3\x3a\x78\x5e\xf2\x4a\x92\x89\x45\x5b\x3b\x8f\xc6\x18\xff\xfe\xf4\x9c\x2c\x6e\x48\xfd\x4b\xb4\x22\xf5\x04\x14\x9d\xe2\xb4\xc0\x35\x5c\x36\x34\x08\xe6\x6d\xa8\x1c\xbb\x58\x15\x52\xa4\x11\xe3\x64\xfe\x3e\x4c\xa9\x6d\x70\x72\xab\x07\x2e\x75\x68\xc1\x3d\x35\xe4\x1c\x78\x25\xa1\x3a\x5c\x68\xfb\x9f\xb5\x98\x8b\xbb\xfb\x9a\x0b\x51\x16\x57\x64\x66\x0c\xdf\xa2\x41\x1f\x3d\x42\x16\x5d\xa1\x87\xc5\x8e\xde\xf0\x10\x5a\x6d\xb1\x77\x42\x05\x43\xe9\x58\xd5\xd5\xe8\xa3\x71\xf7\x98\x70\x51\xc4\xe1\x78\x6d\x01\x8e\xb3\xd7\x32\xc2\x10\xa8\x61\xac\xaf\x67\x1b\xe9\x5b\xb6\x3f\xbc\x88\xbf\x8b\xe7\xbe\x53\x90\x93\x9c\xd9\xfb\x2a\xcf\x39\x81\xdd\xa6\x1b\x78\x7a\x7b\xbd\x78\x46\x8e\x1d\x32\xca\x46\xaf\x8f\xb3\x2a\x18\x46\x3c\x18\x0f\x52\x4b\xe1\xda\x91\x0d\xa5\x50\x8d\x42\xa0\x05\x17\x41\x22\x7c\x9b\x62\xde\x6d\x19\xb3\x3c\x0b\xd4\x80\x67\xb0\x35\x85\x9a\xd9\xbd\xc2\xdd\xd9\x7b\xef\xca\x31\xe6\x5a\x88\x6c\xfc\x75\x3a\xfc\x4f\xf2\xa7\x21\x2a\x89\xd3\x7c\x04\x6c\xdf\x39\x99\xc0\x51\xff\x13\x96\xbd\x99\xcb\x54\x94\x56\x39\xeb\x64\x62\xdb\x9e\xce\x84\x07\x7b\x0b\x3d\x6b\x3d\xf3\x95\x2d\xd3\x67\x56\xc6\xda\xb2\xab\xc2\x5a\x51\xbf\x32\xc1\xe9\xcd\xd0\xa7\x28\xa7\x98\x5f\x7b\x7e\x0d\x9c\x1a\x6f\x66\xce\x12\x16\x37\x3d\x25\x2d\xaf\x59\x58\xf2\xe8\x97\x3f\xd2\x68\xfa\xd0\xef\xe2\x51\xce\x76\xfe\x47\xbd\x0a\x4d\x0c\x4f\x10\x17\x94\x9d\x4c\x2b\x16\x71\x72\x18\xe1\x49\x15\x4e\xd6\xfb\xe5\x6f\x86\xd8\x2e\x19\xef\x0a\x91\x63\x19\x12\xf2\xa8\xf3\xde\xbb\x00\x76\x6b\x61\x77\x80\x2f\x4b\x2e\x79\xf6\xe7\xbf\xa9\xc6\x2c\xfa\x2f\x75\xcd\xb6\x04\x92\x63\x0a\x85\xc9\xb4\x31\x77\xd2\xdd\x9b\xa8\xd0\x54\x8a\xbe\x24\x92\x3a\xe8\x44\x3e\xea\xdc\xd0\xf5\x8a\x7b\x82\xdf\xf5\x0d\x88\x40\x03\x88\x9c\xb5\x60\xf7\xac\x53\xe7\x10\xa7\x55\x75\x36\x24\x64\xb1\xaa\x43\xd2\xa9\xb2\x2f\x2b\xd2\x16\x2d\x30\x2f\xaa\x74\x52\x34\x4c\xe7\xad\xe9\x98\x36\x87\xb6\xc6\x8e\xca\x47\xdd\xdb\x28\x9b\x15"}, +{{0x32,0x08,0x83,0x7d,0x15,0x54,0xb6,0x51,0x1a,0xdd,0xa0,0x9c,0xba,0xe5,0x65,0xda,0x78,0x43,0x9a,0x47,0x2a,0x5d,0x1b,0x10,0x7c,0xe0,0xa9,0xb1,0xd7,0x75,0x7d,0xb7,},{0x9b,0x52,0x5e,0x35,0x36,0x8a,0x92,0x1e,0x3a,0x2e,0x9a,0x35,0xa4,0xde,0x9e,0xa4,0xc4,0x36,0xca,0xba,0x27,0x12,0x3e,0x5c,0x36,0x9e,0x2a,0x6c,0xf5,0xc9,0x0a,0xb6,},{0x70,0x9d,0x1c,0xa9,0xca,0x2f,0x74,0x2a,0xb9,0xdd,0x0b,0x04,0x93,0x35,0xf5,0x44,0xcf,0xfb,0x2f,0x1a,0x36,0x93,0xd5,0xf5,0x3f,0x8b,0xa0,0x83,0xb9,0xb0,0xd8,0x6e,0x52,0x08,0xfa,0x8e,0x1e,0x81,0x56,0xc9,0xcc,0x22,0x42,0x77,0x5a,0xbb,0x7e,0x15,0xaf,0x30,0x85,0x86,0x8e,0xf4,0x57,0x63,0x4e,0x99,0x26,0xc4,0x04,0xec,0xf3,0x0f,},"\x43\x6a\x3c\x31\x76\x3f\x93\xd4\xd5\x46\xc6\xd1\xec\xfb\x7a\xe4\x59\x16\xaf\x75\x4f\x83\x9d\xcf\xe9\x6d\x6b\x69\xc6\x12\x14\xd0\x16\xfc\x84\x2f\x56\x46\x2a\x3f\x07\xf6\x61\xb2\xe2\x50\x5a\xcf\xaf\x48\x2a\x0b\x0f\x4f\x55\x01\xee\xc4\xb2\xd2\xd7\xd4\x44\x54\x4d\xe0\x00\xb9\x90\xf4\x36\x3d\x3f\x98\x3f\x5d\x4e\x09\x30\x97\x52\xff\x57\x9c\x73\x20\xc9\x15\x95\x1c\xc3\xa1\xe3\x23\x8c\x1b\xa7\xa1\x91\x30\xea\xbf\x6a\x37\xf5\xf0\xbc\x56\xe2\x52\x42\xf7\x52\x06\x1f\x3c\x63\xac\xad\x99\x2a\x75\x01\xe9\x67\xde\xb9\x25\xb3\x0e\xd1\x05\x43\x1e\x58\x21\x02\xfa\x4f\x30\x8c\x2f\x06\x83\x61\x2b\x56\x68\x6d\x52\xda\xed\x69\x43\xa7\x21\x9f\x3b\xee\xa2\xe0\xa2\x92\x42\xe8\x6d\x55\x62\xff\xab\x83\xb5\x6b\x26\x33\x26\x66\x4e\x02\x9e\x96\x1e\x70\x17\xd8\xe8\x9f\x5e\x3e\x1d\x10\xf5\x93\x28\x54\x55\x0c\xe6\xe5\xcd\x76\x97\x1f\xd2\x35\xcf\x9c\x00\x27\xd0\xcf\xed\x33\x15\xc2\xcb\xf1\x85\x08\x62\x4d\x8a\xcf\x04\x7f\x9b\x96\x8f\x90\x7d\x9e\x6f\x4c\xfa\x5e\x45\xc8\x0a\x27\x2c\x2d\xbb\x62\xc5\xd4\x19\x45\x80\xdf\xab\xed\xd8\x2c\xb4\xd7\x64\x92\x34\x4b\xe9\x6c\xcf\x5d\xaa\xf6\x1e\x6b\x2b\x55\xef\xdb\x3f\x65\x21\x0a\x3d\x6e\x1f\x36\x98\x87\xca\x0e\xa0\xd5\x8c\x3d\x14\x6a\xe3\xcf\x9b\x00\x00\x76\x88\x41\x15\xfa\x51\xb5\xfd\x66\xbe\xc0\xcc\xbf\x0d\x29\x20\x19\x6a\x7d\x7a\x38\x44\x5f\xbe\xd2\x2d\xfc\x75\x64\xdc\x56\xf6\x0d\x6e\x29\xe5\x92\x48\x53\x74\xc6\xbd\x1e\x5b\x15\x93\x1b\x69\xca\x6e\xe6\xb3\xaa\x25\x25\xc2\x35\x85\xf0\x92\x9f\x31\xcb\xd1\x1f\xb1\xa5\x33\x02\x16\xb9\x0a\xe5\xa6\x56\xdf\x7a\x07\x4c\xec\x64\xe5\x98\x18\x4f\x50\x3f\xb2\x3c\xc0\x5e\x65\xda\x9a\xe7\xe8\x44\x1f\x40\xe2\xdc\x26\xb8\xb5\x6d\x2c\xb5\x23\xa7\xc6\x35\xdc\x08\x47\xd1\xcd\x49\x8a\xbf\x75\x6f\x5a\x13\xea\x14\xf8\xfa\xb2\xc4\x10\xb1\xa4\x70\xf4\x9a\xa8\xdc\xa4\xac\x02\x56\xb1\x18\x00\xde\x0d\xd0\xec\x42\xb1\x42\xc5\x61\x12\x8d\x35\x7e\x78\x3b\x12\xf6\x1c\x66\x8f\x5e\x6e\x06\xb7\xb4\x8b\x7b\x22\x54\xde\x5b\xdc\x18\x04\xb7\x23\xd5\xfd\x6a\x0f\x4b\xc7\xc5\x9e\x7c\x50\x54\x18\x26\x13\xbb\xd2\xfa\x92\xb4\xc1\xda\x16\xbc\x8c\x97\xe1\x6b\xcb\x0d\xbf\x8c\x92\xb7\x48\x99\xb3\x7f\x31\x87\x57\x14\x0b\x6c\x4f\xd5\x35\xe2\xe1\xe0\x57\x0a\x50\x81\x8c\xf7\x8f\xb9\x88\xe1\xf4\xce\x40\xe7\x6e\x8f\xe3\xd6\x97\xd7\xa4\x58\x50\xf2\x93\xce\x17\x0f\xd8\xab\x07\xcf\x15\x34\xea\x5f\xfa\xd3\x4f\x6f\xcf\xa4\x2d\x0d\x21\xa9\x1d\xfb\xfe\x05\x97\xc7\x3f\xd9\xb9\x76\x76\x14\xeb\xdf\xd0\x2c\x3a\xc0\xc4\x9a\xd1\x0c\x94\xbe\x59\x69\xee\x08\x08\xc0\xa3\x0b\x2a\x1e\xaa\x90\xea\x43\xb8\x57\x5c\x30\x56\xf4\x23\xcd\x4b\x6f\x34\xae\x51\xc2\x22\x37\x65\xa9\xea\x21\xf6\x45\x73\xc1\xa1\x39\x61\x32\x12\x46\xe3\xb5\x34\x9e\xe0\x48\xfb\x62\xd5\xfb\x61\xb1\x71\x43\x91\x18\x25\x62\xb9\x15\x98\x36\x0e\x5f\x9b\xf4\xac\x80\xdb\x24\x64\x32\xaf\xb3\xa4\x3d\x34\x96\x50\xde\x03\xd3\x43\xc2\xe9\x7a\x8e\xef\xd1\xbf\x30\xc1\x0c\x25\x86\x7f\x53\x26\x6b\xd1\xf0\xdc\x14\xae\x1a\x6b\xe9\xef\xde\xcf\xf6\x7e\x7d\x29\x2c\x6c\xdf\xc9\x0d\x80\xb8\x86\x66\x8f\x04\xc2\xa0\xf5\xad\x7f\xa1\x7c\x17\x8b\x6e\x9b\x45\xa1\x1f\x4d\xdf\xe2\xd6\x69\x60\xa3\xf7\x51\x35\xad\x5e\xd1\x54\xe5\x13\xe1\xa5\xd1\x38\xe7\x37\x1e\x84\xd7\xc9\x24\x53\xe6\xc6\x2d\xc5\x9b\x8e\x1f\xa9\x3d\x77\x3a\x25\x40\xd9\x1c\x25\x7c"}, +{{0x4e,0xc6,0x82,0x9b,0x43,0x99,0x70,0x56,0xd9,0x96,0x85,0x38,0x9b,0xd5,0x3c,0x52,0x8d,0xe7,0xe5,0xff,0x27,0x15,0xd6,0x5c,0x95,0x66,0x19,0x82,0x6e,0x3f,0xb5,0xb5,},{0x7d,0x92,0x2d,0x57,0xfd,0xb1,0x27,0x92,0x87,0x9a,0xec,0x4e,0x8c,0x65,0x14,0x63,0xec,0xe0,0x64,0x49,0x2c,0x72,0x17,0x53,0xd2,0x2e,0x11,0x55,0x09,0xfe,0xd7,0x06,},{0x15,0x9c,0xa4,0x04,0xf7,0xf7,0x41,0x17,0xc5,0x16,0x3c,0xf4,0x04,0x11,0x09,0x49,0xeb,0x57,0xae,0x2d,0x76,0x62,0xb1,0xff,0x41,0x78,0xcc,0x67,0x56,0xe9,0x0a,0xda,0xea,0xb7,0x1b,0x06,0x4c,0xe1,0xdf,0xf4,0x57,0xb2,0xdb,0xa7,0xe2,0xdc,0x13,0xc2,0x17,0xbc,0xae,0x8a,0x61,0xfc,0xf8,0xce,0x14,0x87,0xa6,0x49,0xc2,0x57,0xff,0x07,},"\xed\x26\xb4\x13\x0d\x4e\xbf\x3f\x38\x61\x49\x1a\xa3\xdd\x96\xa4\xeb\x69\x75\x21\x73\xfa\x6c\x84\xca\x65\xdf\xc9\x91\xc7\xfe\x44\xe0\x2b\xd6\x16\x50\x25\x2a\x1d\x23\x78\x66\x82\xec\x38\xc1\xfe\xe8\x2c\xc3\x50\xdb\x7c\x3c\x39\x49\xa1\xc9\x35\xff\xeb\xd7\xba\xa2\x4f\x35\xa3\x93\xfb\xd2\x7e\x7c\x34\xc2\xf9\xff\xda\x60\xa1\x8d\xf6\x6c\x3e\x46\x5d\x90\xed\x48\xfb\xba\xd3\xfa\x79\x47\xde\xe7\xe6\x59\xa3\xee\xad\xb8\x87\xf0\x96\x3f\x6b\xdd\x76\xc3\x6c\x11\xae\x46\xd0\x88\xee\x50\xbc\xa8\x18\x7a\x0a\x88\x32\xdb\x79\x84\xb7\xe2\x7c\xbe\x6a\xbf\x12\xd2\xc9\x4f\x33\x7e\xc7\x8c\xb3\x8b\x26\x24\x1b\xd1\xa3\xd2\xf5\xfa\x44\x07\xfd\xd8\x02\x27\xd2\xb1\x70\x14\x4b\x41\x59\x78\xe3\x72\x01\xd0\xfc\xf4\x31\x74\xb9\xd7\xb2\x11\x5d\x5e\xb8\xbc\xec\x27\x6a\x77\x5a\xea\x93\xf2\x34\x0d\x44\x25\xd3\x4d\x20\x47\x49\x4d\x91\x7e\x0d\xbe\x37\x85\x7e\x6c\x99\x85\x9b\x71\xc9\x14\xaa\xd5\xe5\x4f\x7b\x2b\x03\x3e\x59\x4e\x27\x2c\xc5\xcf\xe9\x19\xf8\x88\xe5\x5c\xb6\x15\x7a\xff\xcf\x35\x72\x46\xd0\x0b\x53\x2c\xc4\x71\xb9\x2e\xae\x0e\xf7\xf1\xe9\x15\x94\x4c\x65\x27\x93\x15\x72\x98\x53\xda\x57\x2c\x80\x9a\xa0\x9d\x40\x36\x5f\x90\x87\x5a\x50\xd3\x1c\xa3\x90\x0d\xa7\x70\x47\xc9\x57\xc8\xf8\xbf\x20\xec\x86\xbd\x56\xf9\xa9\x54\xd9\x98\x8e\x20\x6b\x44\x4c\xa5\xa4\x43\x45\x21\xbf\xc9\xc5\xf3\xa8\xa0\x61\x47\xeb\x07\xd1\x1d\xfe\x11\x71\xec\x31\xff\x55\x77\x15\x88\xb3\x33\xee\xe6\x21\x5d\x21\x6c\x47\xa8\x56\x6f\xbb\x2b\x18\x97\x46\x46\xac\x5a\x92\xc6\x99\xd7\x75\x84\xc0\xde\xfe\xfd\x2d\xfa\x58\xfc\xa2\x71\x99\xe4\x1e\xc5\x8a\x24\x63\x20\xb3\x5f\xaa\xb7\x5b\x97\x95\x19\x24\x22\x6d\xa4\xab\x28\xf0\x1b\x47\x07\x8e\x71\x2e\x4f\xd9\xf7\x7b\x25\x1c\x96\x67\x85\x8c\x28\xe3\x2e\xf1\xcd\x01\xfc\xbe\x43\x5c\x54\x2d\xba\xd0\xa8\x4a\x13\xcd\xbb\x57\x75\xe6\x2d\x81\x1d\xc6\x90\xd9\x55\x5c\x37\xf1\x5f\x91\x76\x7a\x56\x13\x57\xdf\x10\x6e\xef\xe0\x56\xe7\x36\x06\x70\x65\x0f\xb8\x18\xfc\x6a\xdc\x59\x97\x3e\x9a\xd5\xcd\xcd\x80\x98\x07\xab\x56\x39\x7f\x3c\x13\x94\x87\x32\xd9\x8d\x67\x6f\x4a\x44\x70\xa9\x5d\x8b\x51\x82\x37\xe2\x26\xf0\xcc\x5f\x47\x65\x16\x4a\x5c\x3e\xf0\x50\x71\x4b\xe0\x2a\x12\x6b\xe8\xf6\x65\x46\x48\x15\x81\xb9\xe9\x4a\x26\xaa\xd2\x4c\x69\x3b\x7f\xdb\xc1\x8a\xcd\x3e\xd7\xcf\xc4\x7d\x8a\xb2\x67\x45\xd7\x8e\x70\x1d\x0c\xf0\x5d\xd8\x44\xb5\xb3\x45\xa2\x9d\xab\x68\x4c\xbc\x50\x92\xba\x02\x2e\x3c\x58\x2d\xfc\x04\x4c\x31\x00\xad\x02\x75\x66\x97\xa8\x49\x82\x29\x15\xa1\x6e\x2a\x2b\x81\x0e\x68\x15\xf5\x44\x21\xd2\xf3\xa6\xff\xf5\x88\xc0\xd9\x01\x3c\x76\xf3\x3e\x09\xbe\xae\xef\x60\xd8\x77\x42\x30\xe8\xce\x71\x31\x28\x9a\xef\x2a\x40\x68\x6c\x81\x9f\xb2\x04\x0b\x06\x12\x4d\x3d\x9a\xa4\x19\xd5\x67\x88\xf1\x7f\xa7\xed\x9b\x9b\x57\xce\xaa\xd1\x33\x7a\x01\x01\xbe\xa0\x44\x0c\xff\x74\x5d\xdd\x97\x22\x05\x5d\x1f\x9b\xcf\xb0\x09\xce\x2c\x2f\x41\xa9\xe7\xe8\x68\x06\xb8\x72\xcd\xc2\x05\x9b\xc8\xec\x68\xf5\xee\x56\xc4\xba\xcf\x4b\xbd\x30\xea\x4c\x71\x55\x86\x4d\x60\x0c\x0e\x2e\xee\x73\xb3\x19\xbd\xa4\x37\x2e\x9c\x60\x3c\x77\x2c\x25\x89\x0c\x76\x10\x48\x99\x89\x47\x5d\x37\xa7\x7a\x45\x74\xa2\xba\x55\xbf\xd9\xc9\xcf\xd1\x46\xfb\x97\xe6\x16\x5d\xcc\x19\x55\x9f\x4f\x85\xdf\xca\x2f\x97\xf3\x70\x2e\xd8\xfa\x6b\x3c\x2a\x97\x41\x97\x4a\xa0\x7a\xb6"}, +{{0xb1,0x50,0xa7,0x89,0x29,0xed,0x1e,0xb9,0x32,0x69,0x21,0x3e,0x1e,0xbc,0x22,0xe2,0xe4,0x0a,0x60,0x1b,0xdb,0x00,0x54,0x99,0xb7,0xbe,0xb0,0x58,0x91,0x7c,0x53,0x40,},{0x28,0x86,0x6b,0x6d,0x1c,0x39,0x3c,0xb0,0x8e,0x46,0x4c,0xf5,0x57,0x14,0x40,0xa6,0x49,0xe5,0x06,0x42,0x38,0x0d,0xdf,0x4f,0xfb,0x7a,0xd1,0x50,0x48,0x5c,0x10,0x8e,},{0x27,0x6d,0xd0,0x96,0x2e,0x6e,0xe6,0x4f,0x05,0x92,0x44,0x1a,0x8a,0xf0,0xe5,0xef,0x8f,0x93,0xbf,0x0b,0xae,0xba,0x20,0x50,0x4b,0x9d,0xb4,0xf9,0x5a,0x00,0xb9,0x39,0xea,0x38,0xde,0xf1,0xc7,0x97,0x86,0x28,0x98,0xca,0xbe,0x9d,0xc4,0x64,0x4f,0x0e,0x67,0x7e,0x87,0xc0,0xa3,0x3b,0x87,0xb6,0xa4,0xd2,0x2a,0x80,0x7d,0x0e,0x1e,0x02,},"\x1b\xf5\x5d\x27\xf9\xdd\xe6\xc4\xf1\xc0\xdd\xd3\x60\xa2\x5d\x94\x93\xc0\xff\xdc\xa7\x4a\x7e\xd5\xe5\xa5\x14\xe9\x55\x15\xcd\xa4\xaa\xd8\xf4\x5c\xd6\xed\x79\x01\xf8\xf2\x24\xa6\x3b\x38\x12\x1c\xbe\xac\x2f\x56\xda\xe2\x10\xdd\x05\x37\x50\xcb\x20\x75\x14\xa8\x89\x1e\x24\x5a\x5d\x07\xe7\xde\x78\xa2\xe3\x81\x44\x63\xf1\x48\xd2\xac\xb7\xdc\x71\xf9\x95\xc9\x29\x9a\xd0\xd6\x26\x6c\xfe\xfc\x94\x26\x96\x57\xfd\x47\xcf\x53\x12\xb9\x2a\xf2\x75\x06\x51\xc4\x79\x63\x6c\x9d\x36\xae\xf0\x8f\x7d\x11\x95\xe7\xfa\x1b\xa3\xab\xb5\xdc\xb9\x01\x36\xb0\xfb\x9a\x37\x66\x8b\x87\xa2\xdb\x88\xd1\xe2\xb6\x44\x0d\x3e\x6e\x60\x1e\x6d\x4b\xc1\x0c\xf1\xcb\xdf\x1d\x61\x69\xc0\xdc\x2c\x4a\xec\xde\xb6\xcd\xd4\x56\x7d\x42\x50\xb2\xaf\xa7\x15\xb1\x66\xc9\x46\x7f\x90\x7d\x3f\xa5\xa6\xda\xf2\x00\xb3\x09\xc1\x09\x37\x68\x30\x49\x9c\xaf\x31\x49\x00\x1c\xf3\x33\x94\x48\xca\x3d\x76\x52\x25\xd6\xb3\xc1\xcd\x26\x7c\xba\x93\x6e\x7a\xa4\x83\x25\x39\x46\x6f\xd2\x0c\xbb\x38\x32\x3c\xbb\x22\x28\xa2\x71\xf2\xd2\x82\x56\x1c\x73\xed\x79\xa1\xad\x04\x69\x8e\x27\xef\xe3\x93\x23\x5f\x34\x56\xc2\x95\x40\x7d\xa0\x96\x0f\x00\x34\xd8\xde\xef\xd1\xc1\x85\x73\x6f\xd3\xea\xf1\xf9\xa1\xe3\x2f\x09\x17\x4c\x1f\xe1\x27\x20\xb7\xc9\x6f\xeb\xdb\x33\xe0\x1b\x1b\x6a\x1c\x63\x71\x50\x19\x4b\xe4\xff\xab\x15\x9e\x45\xb2\x45\x85\x57\x68\x46\xbb\x64\x27\x4e\xca\x7b\x39\xa3\xed\x93\x57\xde\x7b\x08\x42\x13\x02\x4a\x9e\x85\x89\x26\x36\x00\xa2\x86\x7c\x2a\x7c\xf8\xb9\x90\x76\xa1\x2a\x07\xbd\x7d\xf8\xd5\x27\x7b\xb0\x4a\xd7\x2e\x63\x9b\x77\xea\xca\x1e\xc5\x8e\xf9\x63\x7e\x9a\x23\x76\xba\x87\x8a\x45\x72\x35\xa0\x6f\x78\xfd\xf0\xe0\xd9\x25\xcb\x2f\xd2\xa3\x8c\x77\x18\x8f\x60\x37\x2e\xf6\x00\x97\x92\x42\x43\x99\xc9\xb6\x79\x28\xda\x2e\x3b\xa9\x1c\xbd\xe4\x07\xe7\xe8\x76\xba\x98\x13\x9e\xd2\x2c\xa3\xb9\x83\xbe\xde\x00\x00\x52\x87\x96\x44\x8e\x4a\x10\x55\xac\xb2\xde\xaa\x56\xbc\x30\x82\x54\xc5\xbd\x49\x8c\x27\x5e\xce\xdc\x13\x57\xef\xe1\xfd\xa0\x1d\x34\xd9\x16\xdd\x4d\x86\x47\xe5\x77\x19\x95\xa6\x53\xe0\xf8\xa5\x28\x4c\xc7\xbf\x73\x15\x7b\x33\x49\xd5\x9e\x6f\x92\x0c\xad\x6c\xdd\x17\x19\xf0\x38\x02\x5c\x43\x00\xe0\x21\x0c\xe2\x49\xfa\xf3\xc8\x2d\xe1\xfd\x1c\xda\xbe\x61\xc1\x4e\xcb\x1d\xf0\x0c\x5c\x46\x6a\xa6\xa0\x12\xa9\xc1\x0d\xcf\xe5\x9b\x7e\x9d\x3b\x15\x5d\xab\x6c\x7b\x7c\x16\x08\xc1\xed\xd5\x1d\xbd\xad\xf6\xba\x58\x76\xb5\xe6\x0f\xdf\x7f\x19\xe6\xef\x71\x2c\xd1\xa7\xdd\x3a\x06\x2a\x65\x74\xa7\x43\x6b\x31\x9e\xfb\x94\x4e\x42\x23\xf5\x42\xb2\x50\x2c\x1b\xa9\x76\xbe\x91\xe0\x5b\x0f\x85\xa0\x9f\xd7\x93\xbe\xca\x88\x33\x75\xfb\x67\xcd\x13\x3f\x52\x84\xd8\x99\x84\xff\x3c\xaf\xa7\xe1\x1a\x9d\x85\xe7\x89\x32\x32\xa5\x24\xec\x54\xb2\x0f\x97\x5d\x3c\x0a\x11\x43\xa0\xef\x41\x17\x6b\x70\x51\xea\x91\xd4\x0c\x5f\x44\xfd\x9e\x10\x05\x58\xbf\x12\x12\xa7\xb8\x91\xe6\x8b\x55\xca\x61\xf4\xbe\x94\x52\x66\xd9\xa1\x00\x7a\x14\xaa\xeb\x68\xc4\x8e\x25\x7f\x0f\x46\x31\x0a\xd1\x64\x81\x46\x7e\xc1\x77\x35\x35\xd5\xfc\x08\x49\x15\xf5\xd0\x04\xba\x0d\xc7\x59\x1d\x21\x23\xc6\x22\x07\x90\x9d\x84\xf2\xb3\x82\xf5\xef\x12\x75\x9a\x95\xcd\x3f\x51\x89\x80\x6e\x27\x39\x60\xae\xe1\x62\xc0\x0f\x73\xe7\xfa\x59\x36\x39\x57\x65\x4b\xb1\x91\x6b\x57\x09\xbb\x0a\x9d\x04\x05\x14\xae\x52\x84\x95\x1e\x6b"}, +{{0x9f,0xc7,0xc4,0x9c,0xb8,0xc4,0xf0,0x97,0x2d,0x6e,0xd9,0x70,0xae,0x2c,0x6a,0xc3,0x37,0xe6,0x75,0x42,0x5c,0xc8,0xdc,0xe7,0x30,0xfc,0x41,0x44,0x43,0x02,0x93,0x5d,},{0x47,0x82,0x52,0x0b,0x06,0xf9,0x33,0x44,0xaa,0x76,0x67,0x80,0xe5,0x44,0x01,0x36,0x3d,0xfd,0x7d,0x96,0x7c,0xc3,0xbf,0x06,0x48,0x8a,0xf9,0x09,0x20,0xa3,0x0f,0x85,},{0x5c,0x78,0x3a,0x86,0x0a,0xa6,0x68,0x18,0x4d,0xd2,0x2c,0x4f,0x9a,0x54,0x6b,0x5e,0xc9,0x6e,0xba,0xd2,0xe4,0xaf,0x00,0xf9,0x68,0xc6,0x88,0x67,0x13,0x54,0xe0,0xcc,0x9b,0x57,0x2c,0x73,0xbc,0x6f,0x19,0x93,0x7a,0x05,0xf1,0xba,0xf3,0x43,0x47,0x63,0x96,0x5c,0x96,0xe1,0x03,0x40,0x7f,0x0e,0xb6,0x42,0xc5,0x64,0x41,0x54,0x29,0x0b,},"\x82\xbc\x2c\x70\x0d\xb2\x22\xa4\xac\x91\x4a\xa2\xbe\x8f\xa2\x8e\x42\x20\x67\xf9\x4f\x33\x44\xf5\x36\x2b\xeb\xaa\xbe\xd7\x61\x2b\x0e\x46\x4a\x73\xa6\xc4\x56\x90\x35\x64\xb1\x53\x93\x48\x51\x40\xdd\x0f\x3a\xff\x90\xaa\x6e\x16\x61\xdd\xf6\x82\x85\x0d\x04\x90\xaf\xc3\xd7\x35\xde\xa0\x5b\xa4\x7c\x85\xd9\x7e\x83\x35\x33\x51\x4c\x19\x8b\x4c\xf6\xe6\x6d\x36\x0e\xe5\xbf\x00\xe1\x4a\x3a\xab\x1a\xd0\xe7\xb8\xab\x2a\xac\xc9\x64\xd4\x28\x30\xc7\x84\x53\xdf\x19\x55\xbb\xed\x1c\xd6\x8a\xda\x3d\xb0\xec\xdb\x60\x1a\xd7\x66\x7d\x5c\x5e\x2f\xd4\x9e\x36\xf7\x32\x8e\xaa\x33\x7d\xbd\x6f\xf7\x0e\x78\x98\xa3\xf9\x8c\x15\x9d\x04\x5a\x24\x27\xad\xe5\x33\x3c\x88\xfc\x4a\xfd\x38\x19\xdc\x82\xf4\xda\xa3\xc5\x23\xcb\x57\xe3\x5a\x2a\x5a\x72\x5d\x63\xd4\x02\xba\xef\x51\xe5\x1f\x1e\xf4\xf8\xf9\xa5\x95\xc9\x37\x9c\x9a\xba\x87\x3f\xb4\xe7\x65\xa9\x31\xda\x09\x14\x8a\xba\x6e\xc5\xb4\x48\x59\xb0\xe8\x1f\xf9\xfc\x22\x95\x98\xac\x9f\xbd\xb0\xbd\xbd\xdb\x56\x92\xa5\x22\x22\xdf\x52\xea\x38\x7b\xbb\xf3\x6a\xd6\x4d\x19\x46\xbd\x28\x2e\x32\x3f\xf4\x82\x2a\xd9\xda\x89\x7f\xf7\x3f\x01\xb3\x90\xcf\xe2\xe6\x4d\xe4\x92\xd5\x5d\xe7\x7f\x5d\x7d\x00\x60\xa6\x87\x2a\x01\x83\xcc\xba\x61\x0f\x53\x27\x4c\xcb\x29\xce\x6d\xce\x6a\x03\x6c\x53\x17\xa1\xed\x2a\x7c\x10\x68\xc1\xb2\x46\xfc\x1d\x58\x81\xd0\x0d\xe0\x6e\xb4\x01\xcf\xf9\x5e\x6b\x69\x14\x86\x99\xdb\x13\xe9\x4b\xb5\xb2\x80\x21\x2d\xff\x54\xc7\x0e\x56\xde\x23\x5a\x5f\x14\x00\xb5\xbe\xa5\x67\x72\xd0\x60\x17\x0f\x1d\x06\x57\x32\x15\x61\xe4\xb4\x91\x07\xeb\x96\xd9\xb3\xbc\x5a\xdf\x45\x1c\x2a\x52\x4e\xba\x4d\xb0\x03\xb7\x7b\x63\x2a\x5d\x89\x82\x7a\x62\x24\xcc\x79\x8e\x09\x6b\xa2\x7f\xb3\x3b\xf6\x1e\x3b\x8e\xaf\x18\xd0\x01\xae\x8e\xb5\x2f\x85\xc9\x0d\x9e\x12\x54\x48\x03\xe6\x7f\xf0\x20\x47\xe0\xd2\x3c\x22\xe7\xf8\xb9\x80\xc0\x1c\x3d\x48\x24\xb2\xa9\xa1\x4a\x2e\x8f\x67\x2a\x7b\x0c\xe0\x3b\xdb\xb3\xbd\x56\xd7\x54\xa0\x96\x4d\xb0\x1c\xa8\x99\xd4\x88\x00\x15\x08\x65\x7b\x7b\x02\x2c\xcf\x04\x2c\x38\xfc\x19\x49\xd0\xe0\x0a\xf4\xd3\x01\xd4\xf0\x0c\x3d\xea\x20\xe3\x08\xa0\xf9\xdc\xac\xb4\x32\x22\xb3\x82\x41\x44\xaf\x77\xbe\x18\xa5\x04\xaa\x8d\x26\x8b\x8a\x56\x00\x72\x5e\x7c\xc5\xf3\xa2\xe6\x25\x6a\x80\x74\xd1\xae\xbc\xa1\x23\xea\x53\xa0\x76\x7a\x92\xe1\x78\x3a\x49\x83\xc5\xef\x3d\x7d\xd7\xf0\x2a\xa9\xd1\xf4\xf9\xaa\xc6\xce\x25\x45\x93\xf0\x87\x92\x01\x4f\xb8\x67\xea\xf8\x79\xb8\x8a\x4e\xfb\x18\xe8\x9b\xa1\x10\x06\xad\x09\xd8\x54\x31\xcc\x26\x57\x5b\x53\x8d\x8e\x78\x90\x64\x6c\x59\x88\x64\x7c\xc1\x05\xd5\x82\x90\x7a\xe6\x25\xe0\x9c\xd0\x89\xf4\x72\x49\xe8\x18\x14\xda\x14\x04\x4c\x70\x14\xe8\x0e\x7a\x8e\x61\x9c\x7b\x73\x5f\x70\x16\x16\xb6\xa3\xc6\xf4\x92\xcd\xc6\xed\x46\x3e\x71\xa3\xd2\x22\x91\x48\x2d\x90\xa1\xde\x6f\x09\x7c\x4a\xe2\x54\x87\x61\x84\xc5\x62\xb1\x65\x75\xb9\xd0\xd1\x93\x13\xed\x98\x86\x4f\x49\xfe\x2e\x1d\x07\x4a\x21\x21\x1b\x2b\x2a\x6d\x27\xdd\xb2\x86\x11\x52\x0d\x5f\x71\x23\x05\x8f\xd0\x07\xbb\x01\x00\x1d\xef\x07\xb7\x92\xbb\x05\xbb\x74\x1c\x12\x9c\x6a\x36\x37\x6c\x38\x53\xb8\xbb\x4f\x66\xb5\x76\x0c\x8e\xb4\xec\xc7\x30\x6b\xa3\xa9\x0c\x70\xda\x47\xc9\x65\xf6\xdc\xcb\xdb\x61\xa7\xfd\xa1\x8e\xe9\x67\xcf\x8c\x5f\x05\x03\x11\x09\x2d\x0f\xde\xea\xed\xd1\x26\x5d\xef\xdd\x66\x0a\xbe\x70"}, +{{0x08,0xbf,0x05,0x9b,0x4d,0xa9,0xaa,0x7f,0xfc,0x70,0x2f,0x5b,0x23,0x04,0xc4,0xf9,0x6c,0xa4,0x9b,0x7d,0xab,0xb6,0xaf,0xb4,0x1d,0xc9,0x1c,0x0f,0x00,0xc6,0x5b,0x78,},{0xa6,0x28,0x9b,0xa2,0x8e,0x80,0xe8,0xd1,0xa3,0x19,0x22,0x3e,0x41,0x65,0xdc,0x0b,0xce,0x73,0x52,0xaa,0xf2,0x42,0xf7,0x0c,0xc9,0x68,0xd2,0x1d,0x77,0x75,0x28,0x32,},{0xe2,0x47,0x65,0x86,0x01,0x37,0x68,0x9a,0xad,0x50,0xeb,0xee,0xfc,0x8d,0x6d,0xb8,0xe9,0x36,0xa4,0xcb,0xa6,0x2c,0xe8,0x7a,0x7f,0x58,0x02,0x09,0x38,0x4a,0x9d,0x7e,0xec,0x90,0x70,0x90,0x5f,0x60,0xad,0x63,0xa7,0xbe,0xfd,0x7c,0x70,0xf0,0xae,0x7c,0x81,0x09,0x16,0x9a,0xee,0x4e,0x51,0x8f,0xce,0xbf,0xac,0xa7,0x23,0xc5,0xb2,0x07,},"\xbd\x4f\xb2\x8a\x1d\xd0\x8b\x07\xba\x66\xe1\x7f\x0c\x4f\x21\x85\x3f\xef\xef\x1c\x9d\x20\xba\x79\x77\xf1\x54\x64\x1e\xa1\xa1\x8b\xec\xf6\xbb\xb8\x03\x88\x88\x62\x94\xe0\x75\x6a\x3c\x50\x8f\xfd\xfe\x90\xb5\x1e\x13\x56\xd1\x12\xd8\xcd\xe5\xee\x2c\xc6\x33\x2e\x61\xd1\x69\xcc\xc8\xcc\x93\x49\x94\xf1\xbb\x56\x0f\xa4\x66\x0c\x0b\x0f\xd4\xe8\x14\x9a\x22\x5e\xd4\x88\x3e\x68\xfb\xb6\x9d\xa7\xaf\x8a\x52\x4b\x17\x14\x1c\xcb\x76\xb5\x0c\xd8\xe1\xb6\x7d\x3c\xe0\x37\xde\xd7\xdf\xa5\x9b\xc7\xc2\x67\x42\x26\xec\x7e\x07\xb7\x8e\xa3\xf7\x82\xfd\xa3\xe5\xf1\xe9\xca\xea\xb6\x08\xca\x38\x7c\x30\x46\x54\xf8\x01\xd0\x0e\x10\xa7\xc2\x9f\x4b\x0d\xa3\xe5\xf8\x95\x13\xa9\x80\x37\x71\x9a\x1a\xef\x4c\x25\x06\xc1\x77\xaf\x54\x51\xa0\x07\x57\xa5\x9f\x16\x22\x9c\x4f\x44\x14\xdf\x51\x58\x0d\x48\x21\x0d\xab\xc9\x37\x73\x70\xb6\x06\x8a\x88\xe8\x1d\x3a\xd1\xbe\xd4\x98\x51\x55\xc3\x60\x0f\xf4\x87\x68\xb9\x03\x02\x2f\xe0\x2a\xe4\x80\xf2\xe6\x32\x9f\x0b\xcc\x91\xd7\x5f\x5c\x6a\x09\xfd\xf7\x7b\xde\x90\x49\x9f\x3c\xa3\x95\xcb\x20\x06\x2a\x09\x84\xad\x6a\x01\x41\xfd\x01\xc2\xd5\x4d\xfb\xb1\xee\x58\x46\x10\x64\x07\x73\x43\x9a\x16\x58\xd2\xc9\xf8\x62\xf1\x83\xbf\xef\xb0\x33\xa3\xbe\x27\x18\x12\xf1\x3c\x78\x70\x46\x57\xe7\xfb\x4f\x85\x01\x75\xfc\xd6\x3d\x3e\x44\x05\xd1\x92\x24\x2c\x21\xf2\x7c\x51\x47\x7f\x32\x11\xa9\xce\x24\x8e\x89\x2b\x42\xfb\x6d\x85\x82\x0f\x41\xb8\x97\x83\x6f\x20\xf8\x5a\x13\x11\x53\x4b\x5c\x40\x4f\x8b\x7a\x4a\x03\x19\xbc\x6c\xec\xaa\x57\xfe\x4d\x4f\x20\x60\x7c\x99\xc2\xdf\x22\xfa\x06\x76\xf9\x9d\x1b\xd8\x78\x86\xc9\x28\xc4\x98\x8c\x6e\x78\xc5\x7d\x75\x83\x30\xe6\x92\x2c\xbe\x03\xc1\x03\x40\x25\x3d\x0d\xd4\x83\x79\x2c\xe7\x5e\x6c\xd0\x9d\x12\xfb\xbb\x04\x1f\x02\x05\xe6\x5a\xd2\x5c\xe7\xc1\xb2\x4e\x77\xee\x8d\x6f\x91\x5e\x3b\xc3\xe1\x0d\x09\xfb\xd3\x87\xa8\x4b\xda\xab\xfd\x1c\xed\xb5\x2c\x0b\x17\x33\xb5\xf4\x70\x88\xc0\xd3\x5e\x0e\xf4\x58\xc8\x54\x14\xc2\xb0\x4c\x2d\x29\xf6\x3f\x77\x58\x61\x31\xee\x65\x53\x0f\x20\x9b\x51\x8a\x0f\x25\x7a\x07\x46\xbb\xd5\xfe\x0a\x2e\x0c\x38\x8a\x6c\x48\x0e\x1b\x60\x71\x4f\xee\x1c\x59\x41\xbb\x4e\x13\xf7\x07\xea\xc4\x87\xa9\x66\x6a\x72\x3b\x57\x93\x13\x4a\x26\x8b\x77\x59\x77\x86\xc3\xa3\x19\x3b\x46\xd3\x55\xdd\x08\x95\xfc\x62\x16\xc5\x36\xa5\x42\xff\xd7\xd7\xb0\x80\x10\xc8\x6f\x54\x7a\x5d\xaa\x38\x33\x5a\x8b\xfa\x26\x55\xd5\xf7\x1b\x4d\x88\x07\xf5\x0c\x85\x45\xc5\x83\xdd\x0b\x69\x00\x22\xee\x65\x87\x3a\xea\x3e\x8f\x1a\x56\x5f\x3b\x0e\x4e\x02\x95\xfb\x0d\x32\x1f\x5c\x0b\x39\x7f\x2f\xd0\x52\x8f\x86\xa0\xd1\xb7\x07\xf7\x37\xb1\x75\xc6\x9e\x9e\x7a\xe3\xc8\x4d\x4b\x2c\xf3\xa3\x8a\x63\x1a\xa8\x03\x2b\x3e\x65\xbb\x45\x28\xf6\x6d\x0b\xfd\x34\x47\x3e\xd0\x10\x1d\x2a\x61\x25\x5b\x21\x5b\xc1\xcb\xab\x9a\x26\xd2\xb9\x69\x32\x4b\x77\xc8\xa5\x46\x4e\x5b\x23\xdf\x6c\x51\x12\xf9\xd1\x7c\x58\x7d\x95\x55\x9d\xe2\x12\xad\x24\x1d\x8b\x12\x60\x50\xe5\xfd\xdf\xcc\x83\x9a\x7e\x5a\xa2\xfd\xa1\xca\x20\xc0\x91\x0d\x86\x34\x18\xf1\x95\xb3\x8a\xdf\xcc\x36\xe9\x2f\x23\x96\xac\x31\x44\xb5\x37\xb3\x0f\xbe\x4d\xde\x61\x49\x02\xf8\x99\x78\xb7\xfb\x42\xcd\x99\xf1\x3d\x99\xc4\x5c\x73\x4f\xb8\x2c\x32\x59\xf9\x0b\x88\xfd\x52\xbd\xcb\x88\xf7\xee\xec\xdd\xe4\xc2\x43\xd8\x80\xba\xc7\x61\x4e\x15\xcf\x8d\xb5\x99\x3f\xfa"}, +{{0xdb,0xbd,0x0f,0x7e,0xcb,0x64,0x82,0xcb,0x01,0xc4,0xdb,0xdc,0x38,0x93,0xc0,0xdb,0x81,0xe8,0x31,0x35,0x3a,0x5b,0x01,0xcc,0x75,0xd3,0xb1,0x1f,0x2f,0xf3,0xc5,0x9c,},{0x2d,0x4e,0x58,0x8d,0x31,0xa3,0x84,0xb1,0x78,0x58,0xc0,0xd7,0x84,0xf6,0x71,0x2b,0xaf,0xd0,0xb4,0x12,0x04,0xcf,0x8f,0x0d,0x57,0x97,0x3e,0x59,0xc7,0x70,0xd3,0xda,},{0x96,0xc0,0x03,0x61,0xfb,0x71,0xc5,0x23,0x05,0xe1,0xab,0x77,0x07,0xe0,0x46,0x52,0x03,0xeb,0x13,0xdf,0x3e,0x06,0x55,0xf0,0x95,0xfb,0x33,0x19,0x42,0xa4,0x0b,0x15,0x58,0x41,0x43,0xb3,0x70,0xa7,0xdd,0x57,0x61,0xfb,0x03,0xc0,0x75,0xd0,0x4a,0x83,0x48,0x66,0x1c,0xce,0xa9,0xad,0xa5,0x33,0x65,0xb5,0x00,0x08,0x7d,0x57,0xec,0x0c,},"\xe0\xff\xf3\x59\x75\xeb\xa7\x8d\xa2\xb0\xff\xcc\x5c\x1b\x66\x36\x00\x88\x8e\x82\x55\xcd\x20\x8f\x6d\xce\x7e\x88\x95\x3b\x71\x42\x93\x73\x89\xa3\x37\xae\x82\xf4\xcf\xe3\x2f\xcb\x34\xf5\x52\xa4\x8f\xa8\x89\x9e\x1a\x65\x9e\x3e\xd3\xd3\xd2\x90\xef\xc9\xa0\xf7\xde\xdf\x33\xe2\x1d\x04\x8d\x8d\x91\x07\x57\x03\x7b\x76\xe8\xa7\xee\x9e\x4e\xca\x30\xf5\x29\xdd\xc0\x2c\xef\xfc\x26\xd6\x4f\xda\x73\x03\xcc\x0d\x89\x40\xe9\xef\x59\xdc\x98\x3c\x12\xcc\xd1\xd2\x71\x7e\x64\xd3\x00\x6a\xf8\x2a\xb1\x5b\xb8\x78\xbb\x89\xd1\x75\x8b\xe4\x43\x10\x42\x06\x38\xb9\x6a\x0b\x5e\x1e\x65\x00\x9d\x69\x39\x5d\x02\x7a\x5d\xa4\xa8\x5e\x90\x1b\xe9\xaa\x2c\x0b\x3a\xcc\x50\x8e\xe1\x85\x74\xc1\xb2\xfa\x9b\xd5\xd7\xae\x7c\x7d\x83\x07\x12\xda\x5c\xbf\x26\xbe\x09\xa3\x12\x84\x70\xa1\x2a\x14\x90\x9a\x80\xa2\x66\x65\x9b\xef\xda\x54\x8f\xd2\xb2\x2f\x24\xc5\xfd\xc2\x06\xed\x3a\x4e\x75\xf5\x32\x06\x82\xed\x0e\x4c\xe8\x17\xd6\x3d\x5c\x7f\x1e\xe2\xb4\x40\x64\x33\x55\xbe\x65\x42\xf5\x9d\xc6\xc4\x5a\xb1\x57\x72\xf2\x21\x9a\x81\x2e\xf7\x52\x76\x42\x01\x5b\xc7\x5f\xe4\x5b\xa9\x69\xe8\x10\x0c\x26\x8e\x24\xce\xef\x92\x05\xa8\x3a\x3f\x7b\x5a\xe8\x00\xad\x06\xe0\x95\xb9\xb1\x39\x21\x94\x89\x79\x3a\x7b\xce\x84\xeb\xeb\x65\x4a\xb6\x66\x9e\x28\x55\xcc\xbe\xb6\x94\xdd\x48\x65\x15\x05\xb9\x59\xd3\x2a\x77\x02\x0b\x86\x95\x33\xe3\x25\x6d\x40\x68\x5a\x61\x20\xba\xb7\x94\x48\x5b\x32\xe1\x16\x92\x56\xfb\x18\x8f\xe7\x6e\x04\xe9\xef\xa6\xd1\x0d\x28\x6a\xe8\x6d\x6f\x1c\x87\xe8\xfc\x73\xad\x9b\x59\xfe\x0c\x27\xee\x92\xa4\x64\x15\xb3\x9d\x78\x6d\x66\x32\x5d\x7f\xa6\xfd\xa7\x12\xf1\x99\xda\x55\x4f\xc1\xc8\x99\x44\xa4\xe8\x4c\x19\x6e\x97\x9a\x80\x75\x53\x71\x8c\xb8\x1c\x07\x6e\x51\x1e\x60\x9d\x5c\xac\x23\xd8\xf4\x5b\x38\xb9\x4b\xcf\xcf\x15\x8d\x0d\x61\x60\x22\x38\xd5\x2e\x3a\xe8\x4c\x81\x53\x22\xf5\x34\xf2\x54\xe6\x33\x89\xae\x15\x5d\xee\x2f\xa9\x33\x96\xf0\xea\x49\x9d\x5d\x08\xc2\x47\x59\x08\xc6\x48\xbd\xdc\xee\x59\x1e\x13\x37\xe9\x42\x1d\xc5\xa2\x57\xce\x89\xcc\xce\x4c\xee\xa8\x09\xd7\xe8\x71\x34\xe0\x39\xdb\x1b\xe5\x98\x19\x6d\x30\x89\xfd\xcf\xa8\x97\x8e\x02\xc1\x55\x58\x32\xda\x0a\x72\xb0\x8a\xd0\x7c\xdd\x07\x26\x27\x40\x9c\x87\x39\x37\xb0\xe8\x35\x71\x5b\xaa\xf2\x60\x8b\x23\x95\x32\x74\x67\xcf\x69\xa1\xcd\xcc\xe6\x37\x24\x18\x38\x3e\x7b\x89\xc8\xdf\x4d\x53\x1f\x58\x51\x49\x50\x9e\xad\x1e\x41\xb6\x62\x7f\xea\x81\xc7\x95\x8c\xb4\x9d\x2d\x3c\x3e\x2f\xc6\x91\xe0\xb8\xcf\x72\x67\x9c\x08\xb8\x90\x46\x54\x53\x1b\xc4\x36\x8f\xb6\x17\xac\x75\x57\xd9\xdb\x8d\x32\x9d\x77\xe4\x8d\x8f\xb4\xde\x73\xab\xe7\xcb\x93\x88\x27\x4a\xf5\x85\xf8\x75\xc0\xda\xb7\x93\xe4\x35\x35\x18\xbb\x24\x69\x53\x42\xaf\x0f\x5d\xf5\xbe\x4e\x9c\x7a\xd2\x15\xbe\x90\xe2\x55\x40\xda\x34\x89\x71\x7d\xd3\xd2\x92\x54\x58\x5a\x45\xc1\x3e\x6d\xcc\x7e\x9c\x8a\x3a\x79\xff\x75\x5c\xbe\x46\x5b\x25\xe2\x3a\x1d\xa6\x08\xe1\x08\x4f\xec\x83\xbf\xf8\x0c\xfb\x74\x42\xb1\x46\x01\x87\x30\x7a\xcd\x75\xe3\xf2\xd1\x28\x43\xa7\x70\x94\xac\xc3\x28\x88\xfb\xe5\xf1\xfc\x24\xc6\x15\xd1\x9a\x06\x53\x91\xd4\x17\x64\x74\x64\x42\x46\xb5\x34\x3d\xa7\x76\x26\xa2\xd4\x83\xfe\x20\x4f\x83\x93\x28\x77\x5b\x71\xa4\xcb\x56\x72\x73\xe1\x69\x64\x0a\xf9\x3d\xde\x3e\xca\x91\x16\xf4\x00\xe2\x3a\x7a\xd3\xd8\xfc\x3a\x28\xe5\x65\xf1\x25\xd6"}, +{{0x74,0x8b,0xb3,0xcd,0x47,0x71,0x37,0xbc,0x88,0x0e,0xa7,0xc6,0x1d,0xf2,0x5c,0x1d,0xac,0x6e,0xbe,0xc9,0xe6,0xc3,0x19,0x3d,0x81,0xff,0xa6,0xf7,0xa8,0x1e,0xc6,0x67,},{0x10,0x6f,0x28,0xcf,0xed,0xf0,0x96,0x45,0x42,0x26,0xb3,0xb0,0x1f,0xc2,0x4a,0xb1,0xc9,0xbb,0xd7,0xf2,0xb0,0x97,0x3e,0x56,0xfe,0x2f,0x4c,0x56,0xa0,0xb1,0x47,0x5b,},{0xe1,0x3c,0xa8,0xe5,0xce,0x7c,0x26,0x80,0x90,0x90,0x8d,0x61,0xcf,0x2f,0x0a,0x3e,0x45,0x72,0x41,0x2b,0xf5,0xad,0xfc,0x5a,0xdd,0xfe,0x88,0x55,0x6f,0x14,0x8b,0x5f,0xcb,0xe3,0xe1,0xbc,0x65,0xff,0x16,0x11,0x7d,0x35,0xc9,0xd5,0xdc,0x3b,0x11,0x71,0x98,0xf8,0x84,0x92,0x5b,0x40,0x35,0xb2,0xc0,0xde,0x6c,0x40,0x2e,0xd4,0x7a,0x01,},"\x00\xde\x6d\x99\x0c\x84\x33\x8a\x39\x8f\xda\x5f\x4a\x2c\xca\x73\x3c\x56\xb2\xa2\xea\x39\x6c\x2f\xe6\x67\xc2\x68\xe3\x81\x45\x87\x85\x39\xbd\x41\xbc\x14\x0a\x2c\xdf\xe7\xe1\x83\x60\x41\x10\x48\xcc\xa6\x0f\x35\xce\x51\x09\x91\xdf\x26\x1c\xbf\x66\x90\x39\xd9\xd2\x56\x87\xa0\x7f\xc0\x47\x6a\x41\xf5\x0e\xcc\xf3\x81\x53\xee\x6a\xe9\xff\xd3\x92\xb2\xbe\xc0\xcc\x67\x10\x1e\xc3\x69\x6d\x7a\x2e\xc8\xcb\xd4\x47\xb6\xa6\xea\x06\x3d\x33\xec\x12\x8a\xe8\xb5\x75\x77\xde\xe1\x7b\x97\x16\x25\x63\xf1\x5e\x42\xb5\x5c\xa4\xbe\xdb\xdf\xb6\x31\xa9\xf6\x26\x2f\x94\xae\x35\xbb\x35\xf7\x95\xc3\x5a\x01\xde\xdb\x46\x45\xa7\x3c\xfa\x6e\xd9\xee\x52\x1e\x46\x31\xfb\x17\xbb\xc0\x6e\xe5\x73\x16\xbe\x52\x74\x27\xc8\xaa\x55\xc6\x31\x18\x74\x62\xd4\xb2\xc8\x82\x2c\xa4\xe1\x8b\x7a\x5d\x4c\x11\x4c\x11\xdc\x22\x06\x9b\xc8\x32\x65\x6d\x5f\x4d\x39\x54\x87\x18\xc5\x1f\x5e\x4f\xc8\x28\xf6\x0e\x37\xf0\x13\x07\x50\x52\x65\xac\xb2\x2d\x5e\x8d\x76\x7b\x9a\xa7\xb8\x66\xa1\x57\xc6\x43\x87\x3e\x09\x08\x4a\x1a\x40\x4a\x7b\xb5\x8c\xcc\x4b\x5a\x39\x0f\xd3\x06\x01\xc8\x96\x93\x5e\x35\x56\xf6\x0d\x2d\xc6\xbd\xff\xe4\x7d\xa0\xa6\x87\xc8\xec\xe1\x24\x1f\xf6\xc0\x7d\x77\x61\x11\xca\x65\x98\xfc\xa9\x68\xcb\x6a\xfa\x0a\x14\xa3\x4a\xb8\xf5\x4b\x95\xd3\xd8\x47\x3a\x17\x4b\xc7\x25\x52\x3f\x86\x74\xdf\xb2\xb1\x0f\x87\x42\x07\xfe\xe1\xb0\x8b\x42\xda\x1f\x58\x65\x53\x05\xa3\x59\x75\x7a\xa0\x25\x1f\x14\x13\x8e\xed\xbc\x28\x0c\xbd\x38\x5b\xf4\xbb\xf5\x53\x01\x14\xcc\x43\xb0\x47\x47\x79\xe2\x04\x96\x2f\x85\x60\xd4\xaa\x42\x3e\x17\xe6\xae\xca\xce\x66\xc8\x13\x78\x4f\x6c\x89\x8b\x5b\x9c\xb7\x46\xa9\xe0\x1f\xbc\x6b\xb5\xc6\x60\xf3\xe1\x38\x57\x4f\x59\xb9\x74\x54\x45\x48\x6c\x42\x2b\xc0\x6a\x10\xcc\x8c\xc9\xbc\x56\x45\x8e\xf8\x5e\x0e\x8a\x02\x7c\xb0\x61\x7d\x03\x37\xdd\xda\x50\x22\x0b\x22\xc5\xc3\x98\xf5\xce\x05\xec\x32\xf0\x9b\x09\x0f\x7c\xf6\xc6\x0f\x81\x8c\x6b\x4c\x68\x30\x98\x3e\x91\xc6\xea\xdf\x1e\xae\x4d\x54\xbd\xe7\x54\xf7\x5d\x45\x0a\xe7\x31\x29\xf6\xc4\xff\x5c\x4c\x60\x6f\x7c\xad\xbf\x4f\x78\xa1\x8d\xb2\x96\x1c\xc8\xc8\xdd\xab\x05\x78\xcf\xed\xfc\xf9\x5e\xf0\x88\x8a\xfd\x38\x55\x37\xd1\xd0\xa0\x76\x48\xa5\xce\x25\x22\xd0\x63\x35\x07\xd7\x75\x93\xe1\xa0\x36\x6d\x1e\xce\x84\x3d\xe6\x98\x67\xd7\xac\x44\x2b\xa7\xda\xd2\xa9\x0b\x59\xd8\x98\x4e\x4a\x94\x6b\xbe\x5f\x17\x2d\xa4\x27\x63\x8b\x2b\x61\x20\x90\x41\xff\xf5\x0e\x60\xec\x02\xec\x2c\x0b\x1d\xc4\xbe\x2e\xdd\x13\xe8\x7b\x64\xd1\xd1\x66\x31\x14\x57\x3c\xf5\x8a\x17\x73\x9f\x46\x3a\x1c\x3d\x6b\x21\x23\x39\x01\x83\xb5\x05\xc8\xee\xff\xb2\x05\x39\xbd\xfe\xeb\x40\x77\x6d\x20\xc4\x59\xba\xc4\x56\x99\x68\xfc\xaf\xe4\x4e\xa4\xcd\x62\x4a\x84\xbf\xcc\xd7\x87\x6d\xd7\xbf\x55\xf8\x3a\xc7\x04\x0e\x30\xf3\x26\xdc\xe3\x25\x58\x8e\x1b\xa5\xbc\x07\x90\x26\x5d\xfd\xba\x09\x83\x9e\xef\x57\x16\x41\xe8\xa1\x23\x4b\x6c\xfc\x3a\x36\xa8\x66\xbd\x6b\x92\xcd\x71\xec\x74\xe0\xd4\xde\xb9\xe7\x4d\x15\x82\x01\xaa\x50\x2f\x07\xc8\xba\x34\x8a\xc2\x6a\xaf\x9b\x3d\x07\x0c\x9a\x40\xb5\x2a\x44\xe9\x32\x55\x2b\x67\xa2\xdf\x05\xa7\xf0\xf0\x3c\x61\x7b\x48\xdc\x27\x82\x36\x6a\x23\x1e\x0c\x4e\x39\x38\xa4\x27\x4b\x36\xaa\x94\x50\xff\x93\x6b\xe1\x32\xdc\xb6\x92\x83\x8d\x65\x4c\x94\x54\x2c\x6e\x04\x7a\x7f\x78\xba\x71\x19\x19\xf9\x08\xa1\x5b\x30\xb9"}, +{{0x39,0x3d,0x44,0xdd,0x0d,0xed,0x71,0xfc,0x08,0x47,0x7b,0xd2,0x5e,0xd0,0xe6,0x62,0x9f,0xa7,0xf8,0x8f,0x08,0x2e,0xbc,0xef,0x09,0x18,0x98,0xe5,0xc9,0xe3,0xd5,0xb8,},{0xc5,0x2a,0x99,0x3b,0x80,0x2d,0x84,0x54,0x0d,0x27,0x54,0x79,0xa1,0xaf,0x5e,0x28,0x7d,0x19,0xea,0x13,0xb3,0x80,0xfa,0x30,0x68,0xd2,0xf2,0xc6,0x8e,0xb9,0x7a,0x09,},{0x84,0xc7,0x16,0xe6,0x0d,0xe6,0x7b,0x02,0x0c,0xc1,0xa6,0xa2,0x4e,0x65,0x49,0xfe,0x56,0xc6,0xd9,0x41,0xa8,0xed,0xea,0xe4,0x07,0x62,0x66,0x66,0xc3,0x1c,0xb6,0x0d,0xee,0x6b,0xe5,0xa7,0x1e,0xbd,0x76,0xba,0xf7,0x1b,0x75,0x11,0x4b,0xcc,0xfd,0x37,0xd1,0x63,0xa9,0x68,0xbb,0xee,0xc1,0xf7,0x69,0x72,0x15,0x12,0x96,0xc4,0x7e,0x07,},"\x14\x2b\x6e\x82\x50\x13\x62\xd5\x5a\x04\xb8\x9d\x54\x1a\x79\x68\x63\xd7\x78\x38\x40\xd3\x4c\xbd\xfc\x51\x6a\x3c\x84\x77\x2f\x92\x44\x6f\x5f\x0d\xf4\xc4\x5c\x6e\x0d\xc8\xec\x1e\x9b\xb0\xff\x7e\xc1\x69\x6a\x09\xcd\x7a\xe3\x4c\x10\xf8\xe6\x1a\x9a\xca\xbd\x43\x03\xf0\xa9\x24\x72\x37\x62\x1c\x49\x0e\x8d\x9d\x0f\xe4\x44\x82\xc5\x60\xd0\x51\xb8\x2b\x07\x4a\xc3\xd8\xe4\x9b\xb2\xac\x71\x5a\xc4\xcd\xe3\xd4\x70\x9d\x0e\xa3\xaf\xc5\x1b\xfd\xef\x4b\x65\x67\x71\xfb\xd5\x5f\x89\xda\x9f\xa6\xdc\xaa\x62\xcb\xae\x56\x12\x08\xd9\x8c\xfa\x24\xcb\x81\x25\x2b\x89\x5f\x6a\x4a\x92\xc8\xe4\x07\xaf\x6c\x1f\x1e\xf4\x9d\x8d\xde\x15\x4f\xbc\xb1\xca\x45\x7a\x20\x4b\x5e\xa5\x43\x2e\x4d\x71\xfb\x7e\xb2\x4d\x43\xf6\xfe\x25\xe7\xb4\xc6\x59\xb0\xee\xbc\x4c\xbc\xc8\xb3\xcf\xde\x07\xc8\xf0\x7b\x18\xa5\x15\x70\xe7\x16\x3e\x33\xb3\x17\xb6\x13\x60\xf9\xce\x08\xd9\x5d\xe2\xc3\x15\x6a\xf1\xcc\xc9\xb5\x5b\xcf\x81\xea\xbf\x3c\x40\x43\x40\x46\xbb\xe8\x2e\x02\x99\x2a\x2a\xc8\xb3\xb4\x25\x68\x0a\x23\xd9\x34\x72\x6c\xb1\xb7\xbf\x26\xce\xb5\x2a\x39\x02\x2c\x00\xac\xf4\x25\x25\x71\x67\xb8\x21\x18\x5f\x68\xe3\xed\x17\x90\x3d\x8d\x22\x27\x54\x98\xc3\x9a\x9e\x8d\xf8\x84\xec\x00\x55\x8d\xcf\xa4\x3b\x8a\x11\x9c\x2e\x85\x3b\x9a\x03\x18\xbb\xea\x08\x7f\x9c\xec\x17\xca\x49\xb7\x08\x17\xb8\xd7\xc1\x70\xa8\x90\x6f\x3e\xe9\xe8\xf8\xcb\x27\xa1\xd0\xf5\x75\xab\xfa\x62\x7e\x88\xf0\x8c\xa4\xb9\x3c\x32\x97\xc4\xf3\x17\x07\x2f\x42\x1c\x5e\x60\x2e\x2f\x83\x1d\xfb\x82\x55\x1b\xdc\xe8\xd7\x12\x16\xf0\x5c\xf9\xa2\x77\x3b\x90\xfc\x93\xb9\xd8\x55\xa9\x1e\x35\xad\xe3\x32\xa5\x06\x1f\xdb\x82\xb3\x09\xba\xb4\xf5\x6e\x2d\x58\x6a\x84\xc6\x74\x81\xd1\x90\x2c\x26\x1b\x3f\x97\xdc\x30\xb1\x84\x61\x9d\xf9\xfd\xfc\x7a\x32\x9d\x06\x1a\x41\xdf\x33\x22\x02\x13\x3d\x8e\xae\xed\xdb\x4c\xfc\xee\x53\x53\x6e\x07\xaa\xd1\x15\x53\xdc\xf5\xed\x1e\x94\x9d\x45\x35\x5f\x9e\xf4\x2c\x78\x32\xb0\xde\x7c\x2f\x15\x26\xfb\xef\x86\xb6\x36\x49\xb6\xb8\x5a\xe5\xca\x86\xf0\xce\xa6\xdf\x9c\x12\x6c\x1d\x79\x48\x9c\xc3\xbf\xc6\xe8\xbf\x03\x46\xeb\x30\xd0\x16\x43\xc0\x10\x15\x0c\x5c\x8d\x0e\xb5\x01\x0a\x46\x11\x22\x15\x13\x79\x91\x08\x5e\x57\x49\x3b\x22\xe8\x35\x26\xb7\xb1\x72\xc6\xc7\x34\x1c\x40\x32\x1e\x9c\xeb\x7c\x82\xbf\xba\xa4\x8f\x3b\xd8\xf5\x13\x72\xd9\x6d\x47\x44\x4f\xf0\xd8\xbb\x2e\x5f\xd2\x65\x14\xeb\x63\x91\x05\xe3\x38\x95\xfd\xc4\x1f\x6d\xf1\xfb\xfd\xcb\x08\x46\x6e\xc2\xd2\x17\xfc\x99\xfb\x01\x2f\xe6\x54\x0c\x0c\x5a\x59\x66\xed\x3e\x66\xfa\xb1\x20\x2a\xb9\xda\xff\xe8\xe2\x7e\x8f\x74\x62\x82\x8d\x66\x26\x59\xea\x3b\x2c\x60\x8c\xf6\x8e\x30\xdb\xac\x62\xff\xd8\x22\x9f\x4a\x53\xf5\x9a\xe1\x68\x33\xb8\x1a\x15\x91\x61\xf1\x93\x69\xf6\x0f\x51\xc4\x3a\x21\x7e\xfc\x5e\xfd\x6a\xb7\xa9\x1f\xe2\x49\xc7\xb8\xa0\xc1\x4e\x9f\xae\xa5\x33\xde\x13\x38\x49\xa9\x24\x47\x67\x6f\x6c\xc1\x8b\xef\x4f\xec\x7f\x37\x31\x97\x59\xce\x80\xea\x3e\xac\x18\xfa\x2d\x9f\xa0\x23\x09\xe1\xce\x93\xac\x6c\xf4\xcd\x2c\xb2\xc9\x5f\x1e\x2a\xff\x7b\x2a\x88\x56\x40\x5a\x7b\x8e\xba\xbe\xb4\x90\x6d\x9b\x97\x34\xda\x9f\xb5\xe5\xd3\xf3\x22\xbb\x5b\x55\x9f\xa6\x1e\xc8\xf5\x15\xdb\x90\x65\xab\x4b\x91\xa7\xa3\x1d\x5c\x62\x50\x61\xc2\xfd\x2b\xcf\xe1\x7f\x94\xbb\xde\x47\x76\x30\x2b\x8a\xef\x3d\x5b\x52\xdb\x3b\xc7\x3a\xe4\xa3\x0c\xc4\x41\x7a\xcb"}, +{{0x71,0x19,0x36,0x40,0xa0,0xa2,0xb2,0x2f,0xb2,0x2d,0x00,0xa8,0x0b,0x33,0xa5,0x51,0x4f,0x3d,0x10,0x00,0x03,0x4f,0xcc,0xd8,0x85,0xd8,0xea,0x86,0x38,0xf0,0xb0,0xf8,},{0xb1,0xd3,0x6f,0x72,0x3b,0x70,0x86,0xd9,0x23,0x11,0x9f,0x46,0x75,0x9b,0x39,0xfa,0x1e,0x40,0x38,0xc6,0x41,0x8c,0x37,0x9b,0xa9,0x8b,0x58,0x40,0xc7,0xea,0x50,0x68,},{0xa9,0x70,0x2a,0x33,0x95,0xac,0xd2,0x0d,0x75,0x43,0x73,0x09,0x5d,0xc6,0x14,0x45,0x58,0x4d,0x8e,0x57,0x10,0x80,0xe1,0x79,0xad,0xcb,0xa3,0x10,0x6b,0xb0,0x6a,0x7c,0xe4,0xd4,0x60,0xf1,0x26,0x1a,0xef,0x86,0x43,0xab,0x16,0x34,0xf4,0x7c,0x94,0x14,0xa3,0x2e,0x18,0x3a,0x32,0x76,0x91,0xe6,0x58,0x43,0xdd,0x6c,0x05,0x50,0x72,0x07,},"\xe0\x28\x79\x48\xbb\x85\xa3\x98\xe6\xaf\xfa\x2d\x25\xfc\xff\x8b\xdb\x93\x26\xf5\xd1\x4f\xde\xb6\x05\x49\xf5\xfb\xf0\xc1\x81\x6f\x11\xcb\xdd\x4e\x90\xfe\xa0\x39\xdc\xa6\x0f\xaa\xd1\x69\x60\x03\xf9\x15\x15\xc9\xb2\x72\x88\x2c\x95\xc9\xa4\xab\x6e\x27\x77\xbd\x92\x7e\x7d\x84\x42\xae\xa6\xce\xa6\x19\xc9\xb1\x52\x55\xfe\xd6\x12\xb5\xcc\x31\x58\xfc\x70\x5b\xb7\xa5\x06\xf4\xaf\xec\xf4\xe3\x4e\xd5\x17\xb2\xc1\x2b\x83\x62\x61\x0e\x5e\xa2\x70\x48\x5c\xcc\xb3\xc9\xaa\x97\xec\xd6\xcb\x19\x63\x09\x00\xf0\x7d\x94\xcb\x29\x3c\xb6\xe0\x89\xa9\xa7\x7c\x01\x94\x07\x3a\x7f\x71\x77\xb0\x23\x0d\x25\x76\x3a\x2e\xf9\x8d\x47\x70\x4c\xb2\xc3\xaf\x4c\x3c\x1b\x49\x56\x31\xb4\xa5\xb2\x1b\x2e\x56\xbf\xf2\xed\xe0\x3e\xa4\xfe\x7c\xf8\x29\x17\x34\x7e\x3a\x9d\x4d\xbe\xef\x37\xd1\xcf\x17\x61\x5a\xda\xa0\xfd\x17\x05\x79\x69\x91\x7d\x47\x8d\x03\xcc\xd8\xf8\xb8\x8e\x5e\x5a\xca\xe6\x73\x2a\x81\x61\xdf\xb5\xf7\xd0\x21\x23\xc8\xd5\xa5\x65\xcf\x4d\xd9\x8d\xfc\x9a\xaf\x5a\x33\x50\x58\xa9\x41\xca\x43\x07\x3f\x26\x59\x61\x5a\x72\xfe\x78\xc1\x01\xc4\x1a\xed\x07\xf3\xbc\xf9\x80\xb0\xa5\xb3\xfb\xaf\xdb\xbe\xa9\x2f\xd8\x89\xcf\xd5\x3d\x40\x32\x78\xbc\x15\xa5\x9a\xa1\x40\xc2\xd7\x73\xb8\x88\x9b\x96\x3d\xce\xa3\x65\x36\x2e\x42\x6e\xf4\x60\x98\x45\xc9\xbc\xe9\xf8\xae\xb5\x91\xd1\xa4\x69\xb0\x72\xb4\x12\x09\xf5\xa8\xb6\xdc\x23\x95\xad\x90\x60\xeb\x2e\x37\x09\x78\xae\x33\x11\xd1\xcf\x0a\x8f\x20\x51\x42\xd4\x36\xba\xb6\xb9\x59\x43\xa9\x7c\x23\xe6\x1b\xd1\x4b\x2d\x95\x67\x2c\xb9\x32\x5e\x9a\xb1\xfc\x9e\xee\xaa\xcc\xd5\x8b\x9f\x4a\xc1\x55\x0b\xde\xc8\x44\x9b\x03\x60\x39\x49\x6c\x5f\x07\xa5\xed\x64\xd5\xd8\x51\x71\x69\x01\x44\xdb\x5c\x81\xc8\x1c\xbc\x4c\x16\x71\x8d\x52\xc4\xdf\xd1\x95\x8c\xa5\xc9\xc8\xba\x58\x2c\xd9\xd7\x06\xf2\x7a\x74\x74\x4c\x3a\x05\xbf\x1c\xcd\x51\xf1\x09\x20\x10\xd3\x6f\x15\x78\xb5\x78\xae\x0e\x9f\xfa\x47\x07\x90\x55\xef\x94\xfa\xbc\x9f\xf7\x2f\x73\x8b\xef\x68\x46\x1e\xb3\x40\x4c\xce\xe9\x53\xf5\xee\x86\x4c\x97\x4c\xe7\x0e\x90\x37\xe3\x38\x8f\xba\xf2\x88\x9e\x13\x66\xca\xa0\xf6\x51\xe2\x1b\x33\x9e\x3d\x56\xb9\xd9\x5a\xc3\x0b\x35\x92\xa9\x48\x91\x2c\x90\xbf\x54\x47\x3c\xeb\xc4\x67\xb0\x9a\x39\x43\xdc\xac\x48\x68\xac\xb5\xb3\x5e\xa6\x91\xef\xf4\xd8\xcc\x1c\xda\x0c\x6c\x0a\x9c\x16\x9a\x4e\xe1\x00\x41\xf3\x5f\x43\x3f\xb5\x3d\x26\x06\x7b\x29\x10\x56\xb1\xda\x69\xff\x46\xfb\xea\x1c\xa7\x21\x36\x59\xa9\x90\xd5\xd5\xdf\x14\x06\xb0\x93\xda\x2a\x33\xc8\xdf\x95\xab\x3c\xe8\x11\xaf\xb9\xc9\x8c\x5b\xfd\x7c\x4e\x98\x1b\x3e\xa9\x4e\xef\xd2\xe2\xfe\x95\x70\x7d\x89\xf3\x07\xfa\x76\x82\x8b\x5c\x67\x74\x95\x0a\xee\x80\x62\x67\x14\x25\x6e\x19\x7d\xc7\xda\x97\x21\x58\xc7\x68\xbb\xee\x7f\xbd\x16\x9e\xc1\x5b\x4b\xb7\xbe\x72\x97\x6d\xbe\xd3\xe5\x12\x76\x6e\xf2\x2e\xf3\xb8\x12\xbc\xac\x4a\xa3\x11\x5a\xfe\x83\xd3\x12\x84\xaf\x8e\xac\xea\x4e\xe4\x9a\xfd\x42\xd9\xc4\x4f\xff\x2d\x86\x1c\x08\x62\x9b\x55\xda\xe0\x0f\xf6\x74\xfb\x02\x8e\x73\x8b\x05\xdc\xb3\x8a\xea\xa6\x96\x3c\xc3\xfa\xaf\xc7\xb6\x92\x45\xa2\xa1\x22\xa9\x6d\xd2\xf0\x3a\x82\x4d\x72\xb0\xfe\x0d\xd7\x98\xdf\x5c\x4b\xb7\x5a\x87\x32\x4e\x76\x4a\x50\xa5\xff\x52\x54\x7a\xda\x8f\x8f\x88\xe6\xf3\x8a\xee\x49\xd5\x8d\xdb\x01\x26\x48\x85\x4c\xd5\x9d\x0e\xc9\x7b\xc3\xd5\x8d\x0a\xd4\x49\x1f\x08\x59\x07\x67\xce\xb1"}, +{{0xbf,0xc9,0x62,0x6c,0x91,0xf3,0x48,0xfd,0xaf,0x46,0x9d,0xef,0x23,0x02,0xe9,0xe3,0x8f,0x90,0x51,0xe7,0x34,0x9e,0x48,0xf8,0x50,0xcf,0x35,0x2a,0x83,0x31,0xa2,0x8b,},{0x4e,0x81,0x93,0x06,0x1c,0x9d,0x65,0xa8,0x2b,0xcb,0x25,0xda,0x08,0x9b,0x4a,0x80,0xba,0x41,0xb3,0xdd,0x2f,0x8e,0xd1,0xdc,0x81,0xe1,0xcf,0xd0,0x3c,0x84,0x91,0x15,},{0x66,0x02,0x42,0xc1,0xdc,0xf3,0x29,0x13,0x69,0xc6,0x5c,0x9d,0x7f,0x89,0x87,0x2e,0xab,0x48,0x22,0x00,0xe3,0x44,0xb2,0x96,0xe3,0x36,0xa0,0xa2,0xe6,0x31,0xfa,0x79,0x60,0x24,0xb6,0xe1,0x11,0x9c,0x27,0xd5,0x22,0x64,0xa4,0x98,0x15,0xdd,0x78,0x19,0x27,0xa7,0xdf,0x46,0x7e,0x88,0xb8,0x01,0xe6,0x84,0xfc,0x60,0x22,0x96,0x25,0x0e,},"\x2f\x11\xf4\x0b\x2a\x19\xf6\x40\xc0\x04\x4c\x7b\x13\x96\x80\xc3\xc3\xb6\x9f\x00\xff\x9f\x6a\x41\x86\xfd\x7d\xed\x56\x9c\x1d\x8c\x57\x20\xf1\x9d\xd3\x5c\x78\x16\xd0\x8a\x94\xc0\x82\x04\xe4\x76\x43\xe2\x64\xd4\x25\xe2\x1c\xef\xb8\x31\x29\xc9\x09\xa3\xd7\x8c\xaf\x72\xc4\x6b\xf1\xa7\x29\x76\x5e\xf4\xb8\xca\x80\x3f\xda\xf8\x05\x2f\xfc\x6c\xc4\xa6\xb5\x79\xa1\x60\xb7\x03\xb1\x53\x55\xc6\xfc\xd3\xb9\xa2\xec\xbc\x26\x7e\x60\xdd\x59\xf6\xa2\xb1\x94\x20\xe5\x57\x27\xa8\x0b\x0b\xb6\x41\x67\xc8\x3b\xa0\xc8\x05\xde\xed\x49\x1d\x93\xe7\x23\xf3\xb4\x32\x63\xd1\x74\x20\xb8\x5b\xe8\x6c\x16\x5c\x55\x27\x79\xdb\x96\x0e\x0a\xa9\xeb\x4d\x9f\x3a\x16\x4a\x5a\x21\xfa\xb3\xf5\x09\xa8\xf0\x19\x9a\x69\x43\xc4\xb2\x23\xcf\x9d\xac\xa7\xe1\x10\xe0\x56\xa8\x1d\x9c\xe0\xe0\xc0\x2a\xc2\x65\xee\xac\x05\xec\xd8\x44\x48\x46\x8a\x4d\x12\x2b\x87\xa3\xe0\x4c\x28\x37\xe4\x3d\x21\x27\x04\xfd\x41\xe7\xf3\xd1\x98\xa2\xe7\x6b\xec\xa0\xe7\x02\x9c\x43\x2a\x06\x54\xec\xd4\x4f\x98\x4c\x5d\xf0\x67\x41\x96\x4d\x83\x72\xc8\x6e\x16\x2a\x8c\x54\x18\x84\x9b\x41\xe5\x71\xfe\xb8\x3e\xb4\x2f\xbb\xcd\xdb\x8a\x08\x21\x43\x90\x9e\xaa\x50\x12\xb9\x79\x93\x1d\xc7\xe3\xcc\xcb\x44\xc7\x91\xe0\x4b\x80\x65\xee\x63\xf0\x56\x1d\xa1\xbb\xf3\x7b\xf6\x50\x34\x77\x87\x9c\xfb\xaf\x6d\x9d\x7d\x9a\x74\x75\x55\x3f\x53\x53\x5f\x84\x7a\x76\xdc\x3b\x2b\x7a\x3d\x1d\x47\x0b\xbe\x17\x12\x4a\x88\xe0\x3f\xe9\x94\xba\x10\xc2\x42\x21\xe3\x9e\x3d\x0f\xf5\x3c\x79\xe2\xfa\xaf\xa1\x90\x12\xd5\xef\x19\x2b\xc6\xd5\x26\x0b\x66\xf9\x97\xb6\x44\xcf\x48\xd9\x9f\x38\x99\xd7\xc4\x85\xe6\x84\xaa\x1e\x6e\x30\x85\x5c\xf7\x5c\x2d\x80\xc7\xa3\xee\x43\x54\xfe\x13\xc6\x76\x09\x1c\x86\x67\x37\x3d\x30\xe6\x0f\xf8\xe0\x9f\xed\xef\x17\x5a\x1a\x87\x39\x5f\xef\xa0\x72\x2b\xf6\xc0\x1c\x65\x55\xcf\xf0\x68\x89\x2a\xfe\x94\x86\xcb\x1f\xcc\x5f\xb6\x64\x1e\x82\xd8\x70\x79\xba\x5d\x7a\x9c\x13\x93\x55\xd6\xc1\x4c\x50\x7d\xbd\x59\x47\x24\xb5\x53\x51\x10\x09\x65\xbe\x9e\x5d\xbf\xa7\x70\x88\x78\xc4\xb2\x9f\x4d\x54\xc2\x17\x74\x6e\x32\x6a\xb2\xa5\x4f\x99\xb8\x81\xd7\xda\x5b\x11\xed\xb0\x8a\x6d\x79\xd8\x85\x69\x1b\x1f\x70\x85\x51\x73\x10\xb3\x09\xcf\x9b\x1b\x71\x4a\xab\xc5\xc1\x7a\x50\x9b\x14\x0b\x89\xb3\xf9\xdc\xee\x50\xca\xb4\x41\xbf\x5a\xd3\xbb\xc2\x99\x90\xf6\x27\x40\x61\x70\xa7\xa1\x0f\x2d\x47\xdf\xc9\x25\x61\x54\xf9\x62\x30\x8e\x76\x9a\x2a\xb1\xb2\xa0\x0e\x27\xe3\x27\xf0\xd1\xfa\x16\x4d\x1e\x38\xea\xd5\xce\xaa\xe2\x38\xba\x52\x6f\x54\xb8\x1b\x45\xde\xa6\xc8\x97\x41\x86\xb1\xb6\x72\x5f\xa4\xc8\x3e\x62\xf3\xe2\x54\xf7\x29\x87\x1b\xda\x4d\xc4\x44\xbc\xe7\x8f\x09\x03\xfa\x31\x8e\xaa\xc8\x22\xa9\x55\x32\xab\x01\x9e\x9c\xfc\x56\x19\xe2\xc2\x06\x7f\x25\x8f\x43\x75\xd2\xe0\x22\x2e\xa5\xbf\x96\xa2\x53\xa2\xa3\xfa\x9e\xea\x02\xc3\xee\xcc\xb0\x28\xc7\x6b\xc6\x0d\x38\x29\x8b\x95\xb9\xaf\xe6\x60\x31\xb1\xa2\xa2\x61\x52\xfd\xaa\x7e\xf4\xf8\x37\xab\xb5\x11\x85\xdf\x8b\x2e\xf8\x5a\xd2\xc9\xbe\x6d\xfb\xa7\x5e\x37\xdc\x7d\x12\xe1\x78\x7f\xc5\x5f\x86\x6f\xd0\x66\xf1\x22\x91\xdf\xf1\x97\x6a\xfc\x10\xda\x91\x31\x01\xe7\x04\x95\xd8\x78\x33\x48\xd6\x11\xb0\x11\xec\x67\x1c\x0d\xa7\x37\xbf\x96\x2c\xdc\xc9\xe4\xa8\x00\xb5\x13\x93\x5a\x56\xd0\x84\xea\x64\xa7\xd4\xe8\xe9\x9e\xe9\x44\x0a\x73\x61\x32\xe4\x2c\x90\x95\x03\xc2\x22\x4a\x14\x1b\x25\xce"}, +{{0x39,0x3b,0x76,0x94,0x82,0x37,0x5b,0x82,0x14,0x27,0xa6,0x6d,0x16,0xe4,0xf5,0x51,0x85,0xb7,0xa3,0xb7,0x33,0x8f,0x1a,0x06,0xf6,0x7c,0xdf,0xa7,0xe3,0x5c,0x54,0x1c,},{0x84,0xaf,0xd7,0x06,0x78,0xff,0xa8,0x5a,0x9f,0x65,0x74,0xcb,0xcf,0xe3,0xb1,0x5d,0x04,0xa9,0xfd,0x15,0x01,0x6f,0xf8,0x55,0x0a,0x98,0x7c,0x4b,0x95,0x1c,0x71,0x22,},{0x31,0xf9,0x8c,0x0a,0x08,0xfd,0xa8,0xe7,0x35,0xb5,0x73,0x66,0xaa,0x1b,0x83,0xb9,0x3d,0xae,0x63,0xb5,0x81,0x0c,0x82,0x1d,0x99,0xcb,0x39,0xdf,0x52,0x1f,0xea,0xc0,0x7f,0x3c,0x41,0x0b,0x27,0xba,0x33,0x07,0x75,0x7d,0x60,0x49,0xf2,0x24,0x54,0xfb,0x6d,0xe9,0xe2,0xc3,0xc2,0x43,0x8d,0x68,0x31,0x90,0x97,0xd1,0x12,0xcf,0xdb,0x07,},"\x8a\xe8\x05\x3e\x03\xbe\xbe\xae\x54\x40\x43\xb8\x41\x4b\x38\x53\x64\xad\xd1\x67\x37\x37\xcf\x8a\xb2\x01\x93\xd4\xaa\xbc\x8a\x78\xe1\xd6\x9b\x9c\x7e\x52\x72\x9e\x69\x30\x78\x06\xe9\x27\xce\x38\x07\xb0\x7c\x68\xc8\x33\xc4\xfc\xf1\x6d\xb1\x5e\x7d\xce\x60\x4d\x17\x98\x91\x5f\xd4\x21\x16\x89\xb4\x86\x46\x42\x50\x2d\x38\xe9\x1b\x19\x97\xb7\x18\x23\x31\x8b\x69\xab\xe5\xbe\xd6\xf5\xe3\x01\x5b\xfb\x22\xdf\x30\xdb\x37\x1f\x22\x60\xc5\xc2\x2e\xba\x60\xdf\x39\xb3\xed\xd3\xc4\xd7\xa1\xe1\x11\xcd\x9b\x8a\xa4\x6f\x67\xbd\x0c\xf3\xa7\x17\xaf\x06\xec\x0c\xe5\x67\x02\x8e\x06\xe4\x79\x79\x34\xad\x69\xb1\xf5\xbe\x44\x0f\xf3\x7a\x8a\x03\x4b\x15\x33\xfa\x94\x64\x24\xac\x59\x54\x00\xad\x27\xd3\xbe\x76\xdc\x89\xba\x9d\x6c\x49\x93\x9a\x09\xf2\xe4\x01\xc8\xf2\x0f\x7f\x7b\x4b\x9e\x63\xb9\xd5\x52\x01\x53\x4a\xb4\xcc\x7b\xe8\x85\xf0\x43\x2a\x2c\x66\x73\xd2\xe7\x65\x19\x4d\xff\xd9\xb6\x09\x6d\xd2\xb2\x84\x39\x18\x75\x09\x59\xa8\xdd\xe4\xa3\xab\x40\x7e\xb2\xf7\xe1\xa4\x9c\x25\x97\xe3\x08\x05\xf8\x48\x0d\xd0\xcc\x82\x72\xa3\x20\xc0\x0a\xa2\xb2\x10\xf5\x76\xe4\x25\x77\xd3\xaa\x41\x97\x03\x69\x7c\xa4\x06\xd4\x3a\x1a\x4f\x99\xb0\x73\x36\x64\xf6\xd6\xb2\x40\x3c\xba\x1b\xdc\xc5\x1f\x54\x1c\xf2\x42\x36\x07\x05\x70\x54\x07\x55\xc7\xa8\x63\x1f\xcc\x2f\x18\x93\x8f\xa1\x1b\xc2\x91\x15\x5b\x39\xd7\xa7\x62\xa1\xff\x4d\xca\x97\xb4\x48\xf7\x0e\x2d\x3d\xe4\x47\xcb\x08\xf9\x18\xea\x20\xcb\x43\x3f\xa1\x15\xe3\x08\x80\xc9\x6c\x8c\xf5\xf0\xeb\xbc\xf4\x82\x30\x9d\xb6\xdc\x1f\xb6\x4e\x17\xc0\x4d\x7c\xdf\x7a\x90\xf4\x01\x4d\x15\xae\x76\x96\xb4\x44\x23\xb0\xba\x08\x4e\xed\x4d\x3f\xb2\x8c\x1e\xfb\x39\x82\x8a\xca\x2f\x40\xca\x6d\xf3\x42\xc2\x0e\x95\xf8\x00\x6b\x27\x67\xa8\x3f\x50\xc3\x1f\xcc\x15\x81\xa0\x97\x53\xe7\x82\x91\xf0\xd9\x93\x1d\x99\x2a\xd3\x60\x44\x73\xce\xb8\x85\xec\xbe\x78\x57\xcc\x52\xad\x55\x85\x33\x4d\x14\x85\xd0\x22\xe1\x06\xb7\x1c\x29\xbd\xfc\xf2\x3e\xe8\xa4\x75\xdf\x2c\x09\x05\x32\x35\x6a\x6f\xfc\x02\x23\x23\x17\x98\x8a\x2c\xbc\xfb\xc2\xa3\x6b\x4b\x48\x3c\xb4\x45\x10\xe8\x55\x99\xb6\x12\x59\x6b\x62\x65\x72\xb0\x99\x6d\x8a\x61\xc0\xee\x3e\xff\xf1\xf7\xc7\x1c\x05\xfb\x5a\x8d\x8c\x5d\x09\xd9\x24\xeb\xaa\xc8\x80\x04\x51\xc9\xdb\x24\x56\x71\x0a\x27\x9d\xfe\x2d\x22\xf6\xae\xa9\xde\x31\x80\x1d\xc7\x42\x53\x43\x62\xb0\xe8\x10\xe9\x9e\x84\x1d\xbb\x7f\x0c\xf9\xaf\x1a\xef\x54\x2a\x52\xc7\x76\xcc\x51\xf2\x87\x36\x8f\xbe\x6a\xd6\x51\xfa\xd5\x78\x7e\xf7\x7c\x73\x53\x5f\x3d\xfb\x36\x18\xcc\x8f\x0d\xbb\x54\x9d\xdc\xa9\xb9\xbf\x91\x13\x5a\x34\x56\x00\x1a\x46\x21\x5a\xde\x38\x8e\x7c\xeb\x9f\xcd\xfd\x0d\x2d\x0a\x03\x56\xaf\xbe\x2c\xec\x1c\x2e\x78\xb4\xd9\x98\xd4\x55\x4f\x46\x21\xf1\x15\x1d\xd3\xff\xd3\xba\x4c\x0b\xc8\x52\xf3\x11\x75\x8c\x5d\xca\x42\x5d\x18\xba\x15\xa8\xd6\x7c\xa4\x01\xd0\xe6\xcf\x28\x0c\xb8\x83\x84\xa2\xda\xd4\x9f\xae\x39\xba\x2a\x77\xb4\x67\xb3\x23\x8a\xa2\x8c\xfd\x13\x7e\x5c\x5c\x0f\xf9\x00\x0f\x8b\x06\xa2\x19\x2e\x16\x29\x20\x69\x22\x65\xdb\x24\xab\x6a\xed\xe5\x35\xe3\x1c\x20\x93\xbe\x57\xeb\xf8\x80\x5d\xf1\x78\x89\x14\xf3\xa8\x84\xf8\x84\x17\x90\x15\x80\x8d\xb4\xd3\x02\x0f\x3e\x78\xbc\x34\x28\x5d\x23\x37\x62\xe8\x99\xeb\xff\x28\x42\x82\x15\xe2\x44\x40\x4d\xe2\x91\x72\x8f\xbf\x41\x24\xce\x5b\x24\x35\x26\x0a\x8e\x34\x11\x80\x07\x5a\x56\x51\xe6"}, +{{0x26,0xcb,0xc2,0x51,0x0e,0xe6,0xea,0x39,0x0a,0x2c,0xb9,0x48,0xa0,0x15,0xd1,0x31,0xab,0xf4,0xc0,0x95,0x49,0x15,0x62,0x0b,0x78,0x16,0xae,0xcf,0x4e,0x11,0xda,0x6d,},{0x14,0x5e,0x8d,0xd2,0x2b,0x44,0x00,0x28,0x9d,0xaf,0xb6,0x26,0xd9,0x5a,0x94,0xc2,0xf3,0xb6,0x9c,0x65,0x19,0x77,0x17,0xcb,0xdc,0xd8,0x50,0x98,0xc5,0x49,0x21,0x07,},{0x67,0x10,0xd0,0xdd,0x00,0x54,0x5b,0x44,0x4c,0xf7,0x14,0xb7,0x91,0x44,0xfe,0x79,0xf3,0x8c,0xb1,0xc0,0xf5,0xb7,0x42,0x48,0xd4,0xf0,0x1f,0xe3,0x60,0x11,0x7a,0x26,0xff,0xed,0x4a,0x3b,0xf2,0x13,0x23,0xb2,0x8a,0x39,0x3a,0xe9,0xde,0xe0,0x7d,0x69,0xe5,0x83,0xe3,0x16,0xc6,0xa5,0x73,0xd3,0x7c,0x64,0x4a,0x8d,0x62,0xc4,0x05,0x06,},"\x9c\xeb\xe2\x4b\x4f\x8a\xde\x86\x43\x0e\x27\x9a\x3c\x43\x3e\x4a\xe1\x7e\x00\x88\x52\xa2\x4f\x08\x69\x0c\xbc\x3d\x75\xe3\xb7\xf2\x00\xda\x89\x7c\x25\xf7\x48\x3b\x37\x63\x7d\x4b\xc1\x10\x08\xd9\x22\x4c\xd5\x81\xfb\xc0\x38\xad\xad\xa0\x2d\x27\x1e\xd2\xa5\xd2\x85\xd8\x43\xa0\xf8\xb7\x9e\x37\x94\x5d\xc3\x5b\xc2\x64\xbe\xcd\x80\x43\x07\xe1\xd4\x42\x18\xa6\x43\xe4\xb5\x9a\x93\x11\xde\x98\x5d\x24\xb4\xc2\x6f\xb1\x46\x03\xbe\x5d\xba\x18\x39\xee\x0c\x8d\x2e\xde\x6c\xb5\x0a\xf6\x7c\x80\x45\x19\x03\x7b\x1b\x16\x63\x31\x8c\xfc\x6e\x75\xd0\xf0\x51\xdb\xb5\xd3\xea\xf3\xaa\xd1\xf7\x8e\xf0\xcf\xf4\x8d\x5c\x55\xb2\xfd\x25\xdb\x15\x39\xd0\xf0\x2d\xae\x9f\x25\x14\x8a\x8d\x33\x8b\x97\x87\x9b\xbd\x39\xdf\x96\x1a\xa2\xc3\x96\x31\x5a\x2a\x86\xcc\x78\x35\x81\xe6\x7e\xa8\x44\xac\xfe\x86\x45\x42\x8a\x27\xb8\xd3\x2e\xa3\x06\x4e\x3b\xf6\x2d\xcf\x58\x01\x0e\xc4\x34\x88\x62\xfa\xc2\x5e\x3d\x9f\xcd\x4e\x5d\x65\xbe\x59\x90\x5d\x81\x6d\xfb\x96\x49\x92\xba\x7a\xce\xef\x8c\x20\x75\xa3\x12\xe5\xff\xc4\xf9\x53\x0e\xa2\x0f\x77\xf9\x3e\x81\xcf\x8a\x01\x9d\xc3\x94\x56\x34\x36\x4b\xab\xf7\x97\x72\x04\x5a\x0d\xba\xa7\x7c\x47\xa2\x2b\x77\x22\x3b\x70\x4d\xeb\xd2\xd0\x03\xf6\xa5\xc7\xbf\x6b\x19\xcd\x2c\x49\xb6\x14\xfd\x4d\x47\xfd\x25\x1f\xe6\x22\xcb\x98\x17\x85\xc1\x46\xbd\xb7\xc1\xd2\xea\x02\xb1\x16\x92\x3b\xf9\x8a\x1a\xfb\xb7\x85\x8a\xdf\x2d\xf9\x38\xa7\x90\xec\x1f\x90\x74\xad\xb8\xd1\xaf\xb5\x63\x3f\xa9\x61\xa8\x47\x64\x01\x0d\x3b\xde\xd1\xc0\x33\xd2\x5a\xbd\xb4\xb0\x0f\xb0\x5e\xd7\x64\x0f\xae\x61\x87\x9d\xf8\x8f\x0b\x09\xe3\xab\xd0\x57\xb9\xa5\x21\x08\xa9\xbc\x98\x5f\xb7\x3a\x5f\x29\xd8\x4d\x1c\xa6\x92\x1b\x62\xf1\xb7\x03\xc7\xee\xb4\x81\x5d\x9d\xd6\xd0\x66\x73\x8d\xb1\x18\xba\xf6\x1b\x04\x22\xf3\x88\xf1\xbf\xc9\xe3\xa9\xbe\xd8\x3a\x1a\x72\x7d\xcc\x26\x6a\x99\x88\x36\x48\x46\x80\x7f\x4d\x55\x18\xbc\x2e\xdd\x0e\xcb\x34\x13\xc2\x6f\xd0\xc7\x9b\x75\xd8\xcb\x5b\xcd\x85\xc0\x6f\xcc\xea\x4d\x03\xfb\x89\x88\xdf\xf3\xed\x0c\xc9\xdb\xae\x78\xd6\xae\x8d\x5f\xc4\x02\x46\x17\xa2\x3f\x52\xbd\x61\x53\x85\xd4\xee\xe0\x8f\x91\x34\xeb\x3b\x25\x0c\x8f\x82\x2b\x47\xd9\x1e\x8c\x4d\x4c\x29\x29\x80\x16\xe6\xfc\x81\xf1\xf1\x09\x92\x53\xd7\x94\x5e\x07\x98\x95\x5d\xa0\xdd\xe1\x4e\xbb\x93\x4e\xcf\xae\xea\xba\xe8\x78\x83\xe1\xcc\x39\x80\x67\x40\x0f\xe4\x62\xa2\xc4\xe9\xf2\x32\xdb\x5c\xdd\x61\xeb\xa9\x49\x18\x8c\xf0\x1b\x23\x8b\xe7\xad\xa9\x38\xf0\x02\xdc\x3a\xe3\x1f\xdf\xd4\x25\xc8\xd4\x6e\xa0\x32\x32\x3a\xaf\x20\xdd\x3d\xe2\x50\x7d\x36\xbb\x45\xfb\xb9\x1c\x40\x96\x9a\x9e\x5d\xa2\x0f\x7f\x93\x6b\x0f\x4b\x13\x7b\x62\xfe\x2b\xa3\xa6\x67\xbc\x03\x62\xd9\x3f\xc5\x0d\x3f\x22\x95\xe1\x67\xfc\xba\xb0\xfb\x3a\x39\xb7\xcb\x02\x4b\x57\x8f\x94\x90\xf7\x34\xb2\x8c\x9c\xcf\x71\x92\xf1\x83\x94\x7d\x5a\x51\x3e\xfa\x49\x16\xe4\xd8\x2b\x2a\xb4\xba\x7e\xc2\xff\xba\x21\x3c\xe8\x2a\xd6\xed\x3b\x10\xe4\x85\x53\xe7\x33\xc9\x40\xaa\x9b\x9c\xe7\x13\x37\xc6\xc2\x80\x5d\xfb\x8d\xd6\x61\x8b\x6d\x40\x90\xa3\xd6\xcc\x96\x3e\xce\xa2\x6d\x1c\xdc\x2b\xf5\xac\x99\x9c\x11\x27\x61\x68\xa9\x31\xd8\x16\x46\x9d\x79\x08\x3c\x24\x08\x1a\x50\xdc\xbd\x22\x27\x52\x38\x52\x67\xce\x1b\xfc\x1d\xb7\x6b\x15\x54\xad\x57\xe3\x47\x52\xb7\xf8\x98\x31\x47\xc1\x16\xd4\xa3\xfa\xe6\xf6\xd5\x7e\x65\x4f\xed\xd7\x37\x8d\x2b\x49\x89\xea"}, +{{0xb1,0xf5,0x9e,0x3c,0x23,0x80,0xd7,0xaa,0x41,0x4d,0x0b,0xf9,0x08,0x93,0xa3,0x8d,0xdd,0xfc,0x29,0x38,0x59,0x30,0x3d,0x16,0xf0,0x0d,0x9e,0xae,0x6c,0xb3,0x45,0x0e,},{0x84,0xe3,0xf5,0xf7,0x2f,0x19,0x09,0x5b,0x0f,0x53,0x38,0x48,0xa5,0xa9,0x1d,0x0f,0x07,0x43,0xb8,0xe3,0xa3,0xe2,0xf5,0x2f,0xcb,0xd7,0xeb,0xe7,0xc5,0xb5,0xa9,0x98,},{0x60,0xaf,0xc1,0xe9,0x91,0xfd,0xd2,0x7c,0xc4,0x72,0xb9,0xac,0xc9,0xd4,0x05,0xb4,0xd2,0xb9,0x13,0x08,0x92,0x90,0xb3,0x11,0xc4,0xfa,0x89,0x1a,0xe2,0xee,0xa0,0x56,0x71,0xfd,0xe7,0xa0,0xef,0x86,0x55,0x7b,0xd8,0x67,0xd1,0xc0,0xb7,0x47,0xca,0xf3,0x52,0x29,0xd6,0xef,0x52,0x8f,0xe3,0xe0,0xd0,0xbc,0xf6,0x30,0x38,0x0e,0xa9,0x0e,},"\xc6\x17\x4c\x9a\xd3\x68\x5d\xd6\x48\x63\x60\x17\x83\x7b\x8d\x99\x22\x00\x31\x9e\x9a\x5a\x0d\x26\xd9\x4d\x2d\xa7\x5e\x2c\x3a\xff\x46\xf4\x2d\x7b\x3a\xba\x47\x2b\x7f\x86\x0b\x0f\xe1\xf6\x95\x52\x97\x31\xfd\xc8\xcf\x0d\xa7\x05\xd1\xd0\x9a\xca\xd0\x4f\x01\x08\x37\xec\xef\x41\x9d\x57\xe9\xea\x6c\xac\xf1\x68\xc5\x21\x56\x96\xf4\x71\xf3\xca\xa8\x97\x60\x7c\x62\x9d\x44\x3d\xe0\x99\xd3\x17\x53\xc2\x46\x77\xd8\xd7\x5f\x4b\xf1\x72\x46\x81\x8b\x58\xad\xc0\x42\x4b\x76\x2a\x19\x1e\xf3\x9a\x70\x76\xa5\xad\x12\x61\x4c\xf5\x4c\x47\xeb\x09\x08\xbb\x86\x65\x18\xc5\xfa\xc1\xca\x2d\x2e\x5b\x65\x75\x20\xa2\xb3\x69\x5c\x6f\xb3\x60\xf1\x6f\x4a\xb3\x57\x99\x8e\x4c\x0e\x97\x23\x1d\x6f\x89\xc9\x68\xdc\x29\xec\xc1\xaa\x91\xfa\x0d\x75\x43\xb5\xd2\x24\x7b\x0d\x85\xe4\x87\x43\xab\x7c\xc8\x15\xcf\xda\xa8\x2b\xf6\x8c\xa6\xd3\xe2\x25\x0b\xfd\xa2\x70\x24\xd6\x1b\x47\x4c\x6b\x81\x54\xac\x8d\x1b\x5a\x36\x20\x97\x82\x51\x5c\x16\x46\x68\x0d\x37\x06\x9b\x8b\x44\x12\xf9\x51\xb0\x25\xa4\xd5\x43\x62\x5d\xd0\x22\x90\xbf\x03\xc6\x73\x46\x13\xf9\x9b\x7a\x4c\x3a\xf5\xc5\xf9\xe9\xac\x34\x74\x46\x5e\x64\x84\x23\x01\x8d\x40\xa6\xad\xbe\x88\xa3\x30\x1d\x3d\x25\x9b\x04\xee\x44\xcc\x05\x62\xee\x0d\xed\x4f\x5e\x26\xad\x97\x7a\xb5\x63\x1f\x85\x76\x8d\xbc\xe5\x3f\x61\x6c\x02\x9a\x8b\x8f\x93\x3e\x2a\x92\x64\xb1\xc8\x1f\x51\x7e\x9f\xf5\x8a\xb9\xf4\x5a\x23\xee\xed\x42\x04\x35\x8f\x8f\xff\x0c\x8f\x97\x5e\xf1\xdf\xa5\x77\x6a\x5f\x77\x93\xba\xe2\xf2\x81\xd7\xb0\xcb\xef\x24\x0b\x3f\xc6\xbe\x05\x88\x21\xea\x2b\x80\x0f\xff\xe5\x5a\x7d\xe0\xaf\xc9\x3e\xde\x9c\x60\xc8\xde\x00\x5a\xbb\x9a\x2c\x88\xf4\xe6\x1e\x8d\xeb\x31\x70\xf1\x07\x8a\x36\xe2\xd8\xf2\xa5\x82\x39\xbd\xee\x49\x6e\x90\xd1\x37\xd2\x11\x0f\x0a\xd8\x57\xa8\x8b\x35\x27\x66\x4f\x78\x19\x39\xe0\xb2\xf7\x66\x34\xff\x9f\x6c\x57\xe1\xc4\x3f\x58\x24\x31\x71\xcd\x86\x2e\xf4\x28\x45\x76\x17\x2a\xf1\xf6\xc3\xbd\x37\xd5\xd7\x4b\x28\xa7\xa9\x86\x98\xbd\x74\xe5\x7b\xbc\x14\x2e\x67\xf7\x03\xf9\xd6\x2c\xde\x76\x1a\x02\x26\x8f\xec\xb3\x43\xfc\x01\x41\x88\x36\x41\x4f\x12\x22\xca\x24\xbc\xdd\x69\xd0\x05\x90\x1d\xa2\xa0\xf9\x44\x65\xe4\xd4\xba\x68\x89\x88\x16\xbf\x7e\x3e\x4b\xb7\x9c\x8c\xa5\x99\x7f\xba\x9a\x8d\xf8\x4f\xaa\x2d\x24\xb0\x44\xc4\xea\x61\x02\x9a\x46\xcb\xa7\x03\x42\x1e\x36\x1d\xfa\x52\xca\xaf\xf3\xbb\xaa\xb7\xfd\x75\x3f\x28\x56\xd7\xc0\x83\xae\xb9\x76\x8d\xa1\x1d\x82\x1e\x2d\x30\x9f\x7a\x73\x5c\x39\x96\x92\xda\xc2\xf2\x62\x84\x6b\x89\x1b\xf6\x46\x1a\xf2\x3c\x8c\x7c\xe1\xd4\xd9\x03\x2c\x3c\x14\x0f\x73\x9e\x55\x84\xc3\x6f\x05\xea\xf4\x34\x9f\xf4\x54\x5f\x28\x3a\x4e\x0f\xea\x49\x43\x0a\x1b\x18\x0d\x08\x71\xe3\x74\x2b\x88\xcc\xb5\x91\x12\x4f\xc4\x27\xed\x67\x3b\x5f\x27\xb0\xb0\xa6\xf5\x4a\xf2\x2b\xa4\xa6\xd1\xc6\xc1\xdb\x2a\x1f\xca\xa6\xd8\xa0\x30\x8b\x77\xef\x2d\x0c\x61\xbb\xf5\x1b\x95\xf1\xe8\xb6\xab\xc5\x04\x1d\x97\xb6\xb6\xf1\xb5\x69\xb3\xf6\x3c\xec\x05\xcb\x56\x7a\xae\xa1\x06\x72\x70\x96\xee\x8a\x9e\xa8\x7b\x88\x04\x90\x1f\x7e\x88\xa7\x40\x9c\x66\xf1\x52\xde\x9d\xbf\xcb\xe3\x19\x52\xe6\xfd\x83\xb2\x87\x7a\x77\x5f\xae\x42\x5b\x38\x51\xe0\xef\xf8\x79\x2f\xfb\x38\x48\xf8\x4a\x65\xcc\x31\x72\x53\xb2\x72\x47\x5e\x71\x7e\x49\xe9\xc6\xff\x6b\x78\x59\xd1\x1b\xba\x7c\x44\x28\xc8\x2d\x17\x89\xe0\xdc\xa5\xbc\xad\xca\x2f\xdb\x25\x9e\x98"}, +{{0xdb,0x46,0x1b,0x9f,0x70,0x7e,0xb2,0xcd,0x77,0x48,0xc4,0x4c,0x99,0x56,0x2f,0x13,0x02,0x39,0x74,0x89,0x35,0x3d,0xf5,0xf3,0x03,0x79,0x7f,0xe0,0xd0,0xb5,0x8d,0xe1,},{0x63,0x51,0x16,0xda,0x8b,0xa5,0xa3,0x6a,0x37,0x77,0x28,0xe2,0x86,0x18,0xe7,0x5c,0x55,0x92,0xae,0xcc,0x18,0xe3,0x40,0x11,0xc4,0xc4,0x25,0x91,0x97,0x0b,0x73,0x66,},{0xdd,0x04,0x9c,0xa7,0x9b,0xeb,0x9e,0xac,0x32,0x5a,0xcf,0x44,0x67,0x2f,0xf5,0x78,0xa9,0x68,0x50,0x2f,0xe1,0xbc,0xf5,0xea,0x19,0xd5,0x2c,0x0f,0x67,0x78,0xc7,0xf1,0xc7,0xbb,0xf7,0x42,0x74,0x79,0x07,0x78,0x6e,0x60,0x81,0x23,0x91,0x1a,0x92,0x07,0x78,0xd2,0xf9,0x59,0x6f,0xe2,0x9b,0xe7,0xcc,0x28,0xfd,0x00,0x9d,0x7c,0x44,0x0e,},"\x1a\x2a\xc8\xc1\xb9\xea\x09\x9b\x83\x1a\x68\x12\xd2\xb4\x26\x13\x09\x05\x8e\xa5\x88\x3d\x70\xb1\xc6\x07\xb9\xcd\x3f\xdf\xdb\x86\xe7\x99\x02\xb0\xfe\x89\xe8\x0e\xa7\xc4\x78\x20\x76\x74\xb2\xd8\x03\xb0\xb9\xca\x14\x7f\xfe\x62\xe5\x94\xf5\x06\xc7\x96\xd6\x89\x97\xce\x48\x2b\x51\xa4\x6e\x49\xb4\xa5\xd8\x58\xcd\xea\xe2\xc6\xec\x9b\x69\x41\x98\xe6\x82\x2f\x0e\x33\xed\x57\xbe\xdb\x03\x35\xc7\x89\x0a\x72\xa7\xee\x3c\x23\x82\x3b\xe7\x9b\x7f\x94\x71\xe0\x33\xc7\x9a\xee\xd5\x2e\x57\x60\xfb\x0c\xcb\xb9\xd3\x8f\xde\xd8\xb4\x73\x83\xc1\x91\x03\xce\x44\x70\x58\x34\xc5\x9d\xdd\x86\xf7\x03\x39\x48\x61\x2d\x66\x62\xf5\x16\xce\x4e\x39\x9f\xf2\x03\x63\xcc\x72\x81\xa6\x9b\x2d\x5c\x30\x7b\x10\xb7\x04\x15\x01\x84\xec\xe3\x2f\x39\x0d\x77\x2c\xcf\xa7\x84\x83\xbb\x77\xa9\xfb\xa8\x44\x25\x36\x69\x84\x17\x1c\xc2\xbb\x60\xb0\xec\x6c\x62\x8d\x4e\x90\x30\x74\x6d\xac\x1c\xab\xca\x60\xf0\x56\x83\x81\x33\x46\xa1\xa5\xbc\x14\x72\x75\x49\x79\x5c\x1c\x92\x68\x69\xe1\xaa\x25\x09\x3d\x59\x1b\x43\xe0\x86\xe4\x3a\x04\xd1\x70\xd9\x42\xc4\x16\x5e\x1c\x5c\xe7\x6c\x3e\x64\x97\x3d\x91\x36\xf9\x32\x5b\xee\x82\x16\x82\xf1\x04\x3e\x95\x1b\x02\x76\x7f\x3f\xb4\x58\xd0\x24\x49\xad\xd3\xe8\xa6\x6e\x51\x6f\xdb\x1e\xd5\x80\xe0\x56\xe0\xf7\x8e\xe3\x3f\xd9\xee\x32\x80\x91\x2f\xae\x07\xfe\x1e\xa0\x25\x27\xcd\x00\x1d\x6f\x6f\x2f\x89\xee\x64\x9f\x51\x74\x14\xd5\x6f\x57\x35\x9a\x84\x68\x91\xf0\x22\x2c\x32\x1d\x7e\x70\x81\x79\x95\xa8\xcd\x8e\x94\x76\x0b\x6e\x74\x83\x2b\xab\x68\xd5\x5b\xc4\x64\x18\x84\x22\x1f\xd2\x9f\x12\x2d\x87\xa9\xa8\x68\xb6\xa6\x06\x0c\x87\xb2\x38\x2c\xf7\xbb\xdd\xa4\xcd\x6a\xaa\x1b\xbc\x8e\x6d\x63\x4a\xb5\x80\xc8\x65\xf5\xad\xd6\xa1\xd5\x4e\x61\xa6\x07\xdc\x2c\x37\xb0\x8a\x8c\xba\x6e\x61\x0c\x12\xcf\xeb\xef\x9c\x98\x9e\xef\x3b\x78\x2a\xcb\xd1\xbc\xec\x5f\x04\xe8\x35\xca\x10\x12\x98\xb5\xe9\xbd\xd8\x81\x3a\x71\xb0\xd4\x69\xfc\xf1\x27\x27\xd3\xde\x1c\x3f\x97\xdd\xbc\x6a\xb2\x65\x84\x40\xdd\x64\x21\x01\x9b\xc6\x8f\x35\x6d\x6f\x25\x53\x68\x65\x85\x1d\x92\xd9\x0f\xe9\x96\x9c\x3b\x7c\x35\xa2\xe8\x8c\xe1\x53\x47\x6e\xc3\x97\x3a\xf9\x35\x9f\x16\x77\xa4\xca\xf1\xcc\x48\x1c\x71\xbd\x90\x22\x8f\xf5\xfc\x6d\xd8\x3b\x8a\x69\x9f\xfe\x51\x49\x29\xf5\xc9\x5c\xb4\xf0\x4b\x00\xdd\x18\xa2\x87\x2c\x41\x86\x8d\x3b\xeb\x76\x49\x8d\xdc\x92\x34\xb6\x3f\x59\x9d\x70\x71\x80\x1d\xb2\xc2\x87\x8f\x7b\xef\x4f\xfd\xdd\x81\x32\x26\xf0\x6d\xb8\x4e\xb3\x02\x17\xa7\x18\x30\x82\xe3\xc1\x24\x2b\xb6\xd0\x1c\xd3\xa6\xce\x27\xbf\xf1\x6b\xfb\xfd\xd7\x5b\x7e\x51\x04\x31\x2c\x49\xc4\x3a\xad\xfc\xd5\xb4\xed\xba\x0f\xf5\x0d\x28\x90\xca\x3c\xd9\xcc\xa3\x3e\x4f\xc6\x94\xc0\x57\xc4\x7e\xbe\x1c\x20\xa4\xad\x11\x5f\x98\x5d\xc7\x44\x2c\x6f\x6d\xa7\xbe\x53\x0b\x69\x02\x28\x9c\xab\x9c\xa1\x39\xc6\xb2\x4c\xb8\x0f\xfd\xd7\x82\x32\x4e\x60\x2c\x45\x91\x0d\xb6\x3d\x8b\x5c\x44\xca\x29\xd2\x7f\x56\xdb\xf0\x01\x86\xba\x58\x3c\x34\xe1\x60\x31\xdf\x35\x75\x46\xb3\xab\x9a\x3d\xd6\x5e\x91\xd7\x12\x8c\x93\x91\x95\xe6\x46\xa0\xf0\xb8\x9b\xf5\xdf\x04\xba\x23\x3d\x6a\x12\xa2\x71\xf7\xe0\x4a\xa4\x5c\xda\x99\xb4\xa5\x5a\x21\xcb\xbb\x73\x85\x15\xe3\x2c\x56\xaa\xc2\x49\x62\x32\xb1\x00\x8a\x67\x61\xc8\x04\x5a\x1f\xe0\xf9\xa3\x64\x40\x47\xb5\x96\x6a\x58\xa6\x00\x46\x6c\x1b\x1d\x11\xdd\xad\x5a\xa5\x73\xc4\x3e\xbd\xa8\x87\xe1\x6a\x05"}, +{{0xf5,0xc0,0xa7,0xf8,0xf6,0x58,0x4c,0x5d,0x2f,0x2e,0x1d,0x08,0x10,0xe8,0xe8,0x61,0x03,0xe4,0xe2,0xd4,0x5c,0xf9,0xa7,0x21,0xd8,0xc4,0x7f,0x67,0x49,0x33,0x96,0xa4,},{0x3c,0x6d,0x6c,0xce,0x49,0x63,0x31,0x41,0x07,0x86,0x96,0x13,0x1a,0x8d,0x84,0xed,0x82,0x3f,0x30,0x66,0x4b,0x28,0x9a,0xf9,0xdd,0x30,0xc6,0x40,0x7f,0x6f,0x03,0x13,},{0xd4,0xc3,0x0a,0x48,0xc4,0x52,0x3b,0x1f,0x84,0xb1,0x4b,0x65,0x7a,0xf8,0xf8,0x59,0x75,0x5b,0xba,0x63,0x59,0x98,0x8b,0x67,0x5c,0x6d,0x85,0xdd,0xf3,0x54,0x62,0x82,0x0d,0xa4,0x76,0xd8,0x4f,0x6c,0x40,0x2e,0x65,0xb0,0x20,0xd9,0xe8,0xa2,0xc2,0x85,0xc1,0x67,0x08,0xae,0x58,0xd1,0xf8,0xdb,0xc6,0x57,0x82,0xa8,0x98,0xa6,0x65,0x08,},"\xd6\x8a\xbc\x60\x9a\x7a\x0c\xe2\x56\x69\x9e\xb1\x70\x43\xde\xfe\x1e\xb8\x22\xc9\x70\x8f\x65\x71\x8a\x06\x58\x1f\xab\x21\x10\xec\x2d\xb0\x92\x13\xbb\x9e\x0f\x36\x12\xce\x4a\x3f\x8f\xdb\xe7\x57\xa9\xf0\xeb\x2c\x3e\xba\x43\x8a\x90\x88\xb1\x8f\x6c\x5c\xaa\xbb\xe5\xc8\x2f\x7a\x9a\xb2\xfe\xcf\x0f\x58\x59\xd1\x75\xe1\x39\x26\x30\x33\x74\x24\x58\xf8\x2a\x6f\x38\x75\x6c\xd5\xbc\xdf\x9e\x07\x36\xdb\x2c\xab\x20\xa0\xcd\x3f\x0f\x1c\xdb\xea\x85\x56\xd8\x49\x09\x35\x8d\xd8\xf6\x9f\x0d\xac\xd4\x9a\xbf\x8a\xc1\xbf\xe7\x59\x40\xd6\x93\x9e\x6a\x55\x38\x5b\x5a\xce\x7c\xe1\xfd\xe1\x20\x67\x9a\xb6\xea\x7a\x89\xd1\x42\x68\xd2\x9f\xfb\x46\xdf\x10\x5b\xf3\x90\x92\x42\xc6\x60\x5f\x3e\x3e\x2a\xb7\x44\x89\x37\xd6\xdb\x2b\xa0\x54\xc7\xb1\x4f\x43\x2d\xb4\x1d\xc1\x8a\x5b\x95\x73\x36\xb7\xf5\x2d\x97\x8e\xc0\x3e\x7d\x57\x64\xe9\xbd\x2f\x4b\x68\x95\x8d\x93\x7b\xf2\x98\x23\xb2\x7e\xfb\x31\xe2\x5b\x43\x92\x5c\x4d\xac\xbe\x67\x18\xa6\x0f\xea\x3b\x32\x70\xe7\xb7\x6b\x0d\xe0\xe7\x0f\x7f\xa3\xc1\x2c\x21\x5e\xf7\x2b\x95\xdc\x1b\x52\x76\x23\x81\x79\xdf\xc5\x2f\xc4\x88\x59\x64\x9f\xa5\x82\xd0\x5a\x60\xdf\x68\x59\x9a\x1c\xee\xa6\x4f\x64\x12\xd3\xf8\x49\x8a\xe2\xce\xdb\x12\x42\x45\x88\x3a\x24\x0b\xc0\x85\x1f\x0e\x32\x49\x65\xbe\x12\x04\x86\xe1\xea\x89\xa0\x18\x2d\xfa\x8e\xab\xd3\xb8\xfa\x66\xa9\x9c\x51\x49\x13\x89\xf3\xc8\x3a\x3c\xdb\x42\x67\xf3\xe4\xdb\xc9\x8f\x0c\x44\x85\x6b\x04\x4d\xc8\x8d\x90\xee\xee\x84\x15\xbf\x73\xde\x17\x1a\xfe\x84\xbe\x90\x35\xe0\xdc\x4c\x80\xcf\x04\x22\x46\x9f\xe0\xc9\xbd\x1c\x6a\xa6\x54\xa5\x9b\x5e\x34\xee\xd3\x51\xcd\xa2\x87\x12\x69\xac\x47\x8e\x8d\x38\x2e\x74\x0e\x9a\xc7\xab\x4d\xdc\x4c\x0d\xef\x0a\xea\xb7\x97\xb6\xf1\xa4\x27\xb8\xe4\xa8\x49\x7a\x0b\x97\x97\xda\xdc\xd3\x5c\x41\x4f\xd5\x5b\x78\x31\x30\xf6\xcd\xed\x38\xa4\x4c\x1a\x89\x28\x83\x07\xeb\x84\x25\x48\x41\x37\xa8\xae\xdb\x03\x0d\x54\xb6\x16\xa8\x2e\x3c\x5a\xcf\xfb\x08\xd6\xcc\x1a\x61\x74\x5c\x29\xaf\xc6\x8a\x0c\x18\x38\xb1\x39\x15\x9c\x5f\xa6\x67\x4d\x66\xb9\xe3\x38\x11\x5a\xad\x4b\x1b\x47\x10\xaa\x5d\x95\x17\xbc\xf7\xe1\xcb\x12\xd4\xe6\xa5\x1c\x11\x78\x9f\xdc\xae\x9d\x9b\xbe\x78\xf6\x9a\x33\xe5\x2d\xf1\x83\x3c\x87\x6b\x02\x68\x7a\x40\x4f\xac\xad\x32\x84\x1c\xb2\xd5\x25\x54\xe7\xb8\xe2\x20\x9e\x3f\x88\xfd\x94\x8c\x1e\xcf\x83\x95\x7c\x96\xf4\x3b\x03\x4b\xed\xa6\xc4\x76\x09\x6b\xcb\x09\x30\x1a\xd6\x1f\x83\x67\xcc\x43\xe1\x56\x13\x18\x62\xb4\x2e\xce\x28\x5b\xec\x2d\xcc\x2d\x02\xd0\x94\xd0\x42\xa1\x60\x72\xeb\x22\xab\x98\x88\x01\x3b\xe8\x23\x71\x56\x94\x00\xec\x1f\x8e\xc7\xe7\x91\x08\xc4\x1b\x85\x33\x65\x26\x8f\xa4\xcf\xbc\x62\xc4\xac\x12\xcc\x98\xd2\xec\x38\xa8\x7d\x60\x85\x85\x95\x67\xc0\xf2\x7d\x6d\x43\x1a\x04\x6e\x88\xa9\x81\x55\x58\x66\x07\x05\xfd\x05\xeb\x06\xc6\xc0\x5e\x5b\x7d\x62\x34\x7c\xee\xe2\x7d\xff\xed\x71\x41\x54\x0d\x60\x8c\xb9\x75\x07\x5a\x96\x44\xac\xc6\x32\x84\x39\xf9\xfa\x68\x2b\x22\x6b\x18\x61\x54\x54\x90\x11\xc3\xb0\xf0\xff\x4f\x74\xca\xa7\x1c\x19\x44\xe4\xcb\x83\x6c\xe8\x51\xd9\xb5\xd9\xe7\x27\xc5\x53\xe3\xc7\x23\xcf\x98\xc2\x73\xe5\x67\x5c\xab\x89\x9b\xb6\x6f\x46\x33\xa7\x6d\xea\x35\x73\x41\xf9\x83\xc5\x3d\x91\x58\xad\x31\x9a\xda\x75\x40\x8b\x41\xc0\x6f\x26\xb7\x43\x5b\x80\xdc\x3b\xc0\xaa\xf2\x2a\x83\x3d\xde\xdc\xd6\x78\x5c\x87\xd1\x96\xb0\xaf\x2c\x9a\x43\xd1"}, +{{0x1a,0xb9,0x46,0xc0,0xc1,0xae,0xbf,0x9c,0xa3,0x7c,0x2f,0x4e,0x2a,0x4b,0x33,0x7d,0x5b,0x1e,0xbc,0xcd,0x24,0x73,0x4c,0x9c,0xb2,0xa1,0x60,0x8c,0x88,0x1e,0x57,0x57,},{0x9a,0xfc,0x63,0xdf,0xce,0x0d,0x48,0x9b,0x40,0x90,0x7a,0xee,0xd6,0xdf,0xfe,0x4c,0xd8,0xef,0x5a,0x6f,0xfa,0x22,0x98,0x95,0x56,0x44,0x5c,0xbf,0x9b,0x35,0x19,0xc2,},{0xbf,0xab,0xde,0xa4,0x18,0x10,0xa5,0x3f,0x8e,0x52,0x7a,0xcd,0x66,0xec,0x10,0x6c,0xe2,0xae,0x1a,0x67,0xff,0x6a,0x9b,0x52,0x2e,0x0f,0x08,0xfb,0xbf,0x12,0x52,0x68,0x2c,0xb3,0xa1,0xdc,0xc8,0x75,0x60,0x19,0x44,0xcb,0x88,0x00,0x0f,0x72,0xe1,0x39,0x07,0x00,0x79,0x03,0xa7,0x7c,0xd0,0xdb,0x03,0x16,0xd4,0x19,0xac,0x38,0xc2,0x04,},"\x9b\xb0\x71\xb6\x2c\x04\x06\x4b\x0c\x96\xe2\x43\xdd\x19\x8c\x39\x71\x7b\x25\xc9\x94\x48\xc2\xc0\x02\xb8\x4a\x99\x20\x4c\x5a\x6e\x23\xb4\xb9\x12\x02\x86\x75\xbf\xdc\x4d\xf9\x3c\x5b\x2f\xb8\x08\x81\xa2\x3e\x0d\x44\xba\x18\xbd\xe9\x91\x21\xee\xe8\x6a\xdc\x6f\x84\x28\x19\xd6\xeb\xc7\xa2\x88\x99\x2d\xa3\x28\x58\x05\xa8\xb8\xb6\xfb\xcd\x22\x67\xb6\x86\xb3\xe1\xbf\x79\x60\xb4\x5f\x24\x4f\x85\x2e\x82\x49\x29\x44\xe3\xd6\x18\xbc\xc4\x51\x4c\x17\xf7\x22\xba\x49\xac\xa7\xf2\xf3\xbb\x4e\x91\xf9\x40\xe9\xce\xf0\x15\x65\x0c\x3e\x40\xb0\xc8\x55\xa1\x7c\x42\xf1\x1e\x3a\x34\xac\xc8\x52\x87\xdb\xe0\xf9\x09\x3c\x00\x37\x3d\x50\xc0\xb3\x06\x4a\x5a\x5f\x2b\x1e\x89\x20\x65\x17\x52\x82\x95\xfd\x87\x17\x03\xa8\xe7\x62\xb5\xe7\x6f\xb9\xb7\x47\x3d\x21\x49\xb8\x5b\x94\x61\xf5\x58\x7e\xd7\xe7\xfc\x8b\x50\xaa\x09\x87\x6d\xee\xb6\xe2\x37\x07\x85\x02\x14\x2c\xec\x6b\xdd\xc7\x01\x40\xfe\x1d\x1f\x16\x58\xd5\xd3\xe9\x10\xfd\x70\x36\xa2\xf9\x24\xb4\x99\xdb\x17\x56\xf7\xc8\xce\x0d\x5f\x0d\x04\x5b\x39\xbc\x81\xc5\xc2\xf1\xa7\x61\xf5\x2f\xf3\x93\xe0\x64\x9b\x8d\xb0\xbd\x88\x54\xbd\x02\x6b\xe2\xc7\xc3\xcd\x63\x52\x6b\xa5\xa8\x0d\x48\x33\x5f\x03\x38\x32\xd6\x33\x76\x07\x1b\x63\x08\xf0\x59\x60\xcb\x3f\xc9\xfa\xc9\x32\xed\xd8\x37\x6d\xae\x51\xf2\xc6\x61\xf7\x5b\x7c\x6f\x4a\xc8\x56\x75\x3a\xca\x62\x06\x28\x77\x60\x9f\xc4\xa0\xff\x60\x67\x02\x82\xc0\x5e\x88\x2d\x1a\x03\x5b\xf9\x89\x0c\xab\x29\x6a\xc7\xa8\xdf\x24\x4c\x56\xf4\x90\x25\x0f\x02\x00\x54\xb8\xaf\x51\xbe\x4f\xc3\x18\xbe\xba\x50\x62\x32\xbf\x45\xe1\x7f\x5c\x74\x0c\xf0\x9d\x37\x51\x5a\x8b\xc8\x94\xbc\x95\x5c\x8a\x46\x08\x77\xc7\x85\x4f\x8b\xe3\x63\xb2\x19\x33\xe1\x62\x87\xae\x0c\xb7\x0f\x22\x2d\x4e\x36\xb8\xb4\x24\x97\x55\x59\xbb\x4b\xfc\x8d\xd1\xd5\x1b\x3c\x0f\xaf\x4a\x53\xe3\x02\x19\x6f\x9f\xed\xb5\x32\x87\xd0\x93\x15\xdf\xff\xa2\xbc\x4b\x3a\xcf\xf1\x37\xf9\xa7\x6d\x68\x56\x21\x7f\x79\xcb\xb2\x54\x33\xfc\x97\x89\x9f\xd6\x54\x0f\x18\x08\x8e\x84\x41\x7e\x48\x33\xe4\xa9\x1a\xab\xa4\x65\x8a\xe9\xad\x7f\x76\x0d\xd9\xc5\xb7\x19\x1a\x0d\x3c\x05\x54\x1b\x83\xc0\x25\xa7\x99\x21\x38\xe6\xd1\x08\x0d\xa1\x4c\x2c\x88\x7c\x6d\x67\x0a\xab\x37\x4d\x43\x6c\x27\x2f\x9e\x96\xf8\x5a\x9c\x42\x33\x79\xc0\xd4\x7c\x46\xdf\x6d\xe3\x34\xea\x20\x57\x15\x8d\x33\x23\x1e\x14\x26\xa6\x6d\x3c\x70\x82\x7a\xad\x55\x11\xb8\x46\xe0\x3b\x94\x92\x3d\x5f\x94\xba\xf1\xf8\xcf\x11\xa8\x61\x37\x3a\x5b\x80\xad\x5e\x31\x7e\xc2\xa5\x29\xe9\x4e\x63\x6c\xdc\x3a\xa2\x9e\x5d\xac\x20\x5a\x0c\x13\xf6\x8f\xb1\x98\xcf\x94\x56\xe6\x39\x0a\xea\xd4\xd9\x78\x2a\x10\x38\xf6\x47\x8d\x33\x9a\x81\xba\xe7\xaf\x2a\x04\x15\x1c\x2f\x22\xe8\xd3\x9f\xe0\x71\xe1\xa5\x21\x68\xd5\x7c\x84\xc3\x62\x93\x41\x3f\x8e\x6f\xf6\x93\x4f\x05\xe7\xef\xad\x6f\xa1\x20\xc8\xc1\xc3\x8a\xd1\x88\x6a\x3d\x00\xbf\xc3\x06\x45\x92\x03\xc0\x2c\xdf\x4f\x06\x65\x2b\xc8\xfa\x0e\x8b\x9c\xc7\x79\xd4\x3f\xbb\x78\x9e\x7d\xad\x5d\xc9\x9f\x41\xd4\xcc\x58\x8c\x1b\x65\x42\x6a\x4e\x77\x38\x9e\xdd\x04\x97\x75\x78\xf8\xf3\x16\xbc\xdd\x94\x61\xd6\x66\x47\x2c\xdd\x27\x6a\xa5\x69\x72\x1c\x65\x23\x22\x56\xba\x1c\xf0\xe7\xf5\xea\x55\x32\x17\x29\xbb\x0e\x03\x86\xa7\x7b\x86\x55\x32\x02\x46\x96\xed\xde\xf4\x85\xb7\xd7\xb2\x8c\x15\x73\xb9\x34\x7e\x41\x4d\x42\x61\x99\x54\x82\xe3\xb3\x12\xde\x13\x31\xf8\x4e\x75\x48\x60\x7a\x84"}, +{{0x04,0xbb,0x88,0x7a,0x8a,0x31,0x84,0xff,0xc7,0xea,0x09,0xc9,0xbc,0x7c,0x1f,0x7c,0x34,0x11,0x55,0x6a,0x7c,0x7c,0x39,0x8c,0xb8,0xb2,0xd9,0x8f,0xfd,0x9e,0xe8,0x66,},{0x6a,0xb1,0xe4,0xae,0x4a,0xa0,0xd3,0x89,0x89,0xae,0xef,0xa8,0x05,0xb5,0x78,0x80,0x6e,0x2e,0x97,0x1a,0xc7,0xac,0x05,0x40,0x99,0x58,0xbf,0xe6,0x00,0x71,0xf4,0xa7,},{0xcd,0x84,0xf5,0x5e,0x5e,0xf4,0x53,0x19,0x24,0xc5,0xa2,0x18,0x1e,0xc8,0x7a,0x64,0x54,0x13,0x88,0xc1,0x05,0x94,0x06,0xbc,0x07,0xd5,0x31,0x57,0xa1,0x68,0xe2,0x03,0xcc,0x8a,0xa0,0xf0,0x06,0x9d,0x53,0xff,0x58,0xa9,0x5b,0x8a,0x8c,0xaa,0xfd,0xad,0x26,0x36,0x3c,0x7d,0x0f,0x80,0x45,0xc4,0x35,0x9e,0x97,0xb4,0x36,0x02,0xc6,0x06,},"\xb7\xab\x0c\x81\x63\xf4\x78\xc6\xca\xbf\x2b\xbd\x7c\xa3\x7c\xb0\x24\x56\xd7\x6e\x52\x7e\xea\x1b\x0d\x26\xdb\x24\x2e\x37\x87\x76\x32\x98\x5a\x3e\x3c\xa4\x1b\x52\xe2\x1d\x79\x01\x7b\xff\x81\xee\x55\x1a\xd7\x2a\xf2\x77\xb4\x10\xe4\x2a\xf8\x22\xc6\x08\xcd\x69\xd0\x0b\xf4\x40\xb7\x5b\x78\x7a\x8c\x91\x5d\x70\xb6\xc6\x37\x6c\x3f\x67\xfa\x64\xd6\x12\xa1\xb4\x49\xa7\xe2\x13\x4d\x9c\x23\x23\x01\x57\xd5\x76\xe0\x6a\x66\xa8\x42\x2a\x61\x1e\x2a\x0f\x09\x72\x86\xc1\x99\xea\x2a\x16\x28\x61\x86\x4b\xd0\x35\x07\x6a\xb2\x0b\xba\xe2\xb4\x40\x8a\x2c\x64\x33\xcb\x23\x43\x3a\x88\x9f\xe6\x59\x8f\x47\xbe\x53\xbb\xd2\xc8\x0f\x07\xa8\xfc\xcb\x8a\xae\x51\x11\x61\xe6\x09\xda\x4d\x18\x0a\xce\xa5\x44\x81\x1e\x94\x49\xc5\xdc\x22\x50\xe3\xe5\xa0\xcd\x41\xda\x33\xa2\xda\x63\x2e\x60\x38\xbd\x86\xf1\x6d\x5b\x7c\x1b\xe4\x9f\xc6\xdb\x49\x90\x76\xca\x91\xf7\xaa\x02\x8f\xe3\x85\x29\x70\x0b\x21\xd0\x72\xd2\xb7\x5d\xcc\x8b\x43\x78\x1d\x4b\xc4\xd3\xbb\x58\x4d\x9d\xa0\x1c\x3e\xcc\x85\xb1\xe9\x3f\xce\x04\x5d\xad\xce\xea\x51\x06\x46\x8b\xdf\xe5\xf7\x0d\x66\xa4\xfa\xd6\x0e\x4f\xb8\x64\xec\x15\xea\x50\xf6\xcb\x79\x72\x23\xc8\xc7\x56\xf7\xa1\x93\x1a\x39\x46\x4e\xbb\xb9\x67\x9f\x6b\x01\x68\x7c\x17\x4e\xaa\x32\xb9\x68\xb9\xcf\xac\xe8\xc1\x67\x12\x0a\xa7\xbd\x02\x42\xf0\x03\xa0\xc3\x77\x70\x25\x51\xb3\x0d\xa2\x48\x8e\xb2\x94\x40\x52\x93\x4a\xef\x4b\xfe\x11\x5f\x0a\xb7\x40\x5a\x3d\x5f\xa9\xbd\x79\x6b\x37\x17\x42\xbc\x11\x4a\x9b\xf2\x8c\x5b\xd2\x56\x26\x29\x5c\xe2\x61\xa6\xa8\x3e\xf6\x0b\x77\xd2\xd3\x2d\xd7\x10\x5f\xc8\x36\x64\xaa\x89\x76\x5b\x3f\x81\x91\xee\xee\xd8\x78\xf2\xeb\xff\x2f\xb9\x76\x63\xa6\x18\x77\xc0\x93\x93\x3b\xbd\x07\x31\xe6\x37\x57\x57\x1b\x0e\x37\xca\xc9\x9e\xd0\x1f\xd2\x14\xcb\xd4\xfe\xb9\x77\xe8\x56\xe0\xa1\xa7\xef\x0c\x40\x8c\x20\xe0\xdd\xaf\x1f\xd8\xf0\x28\xcf\xa0\x8c\x85\x0f\xa7\x09\x0d\xca\x8c\xdd\xe0\xcb\x69\x03\xda\x18\xc6\x29\x0c\x66\xa1\xc0\xae\x0a\x08\x4b\xf2\x50\xc5\x1a\x9d\x03\x5e\x5b\x16\xec\x61\x66\x36\xaf\xb9\xb5\xbc\xe3\x6a\x77\x5f\xe2\x17\x5b\xcc\x2e\xe0\x72\x20\x83\x4e\xeb\x31\xca\xee\x50\xe9\xf8\x06\x3f\xb1\xfc\x84\x68\xae\x25\xe3\x96\x67\x89\xa6\xd8\xdf\xfe\x08\xa6\xf7\xa1\xe6\x72\x6f\x93\xae\x74\x82\xde\x02\x62\xbb\x1f\x8d\xe0\xc9\x5a\x99\xec\xb9\x56\x84\xd4\x4b\x3f\x1a\x33\x2a\x18\xd2\xcd\x3d\xcf\x25\x3c\x33\xd7\x35\x52\x2f\x79\x6b\x65\x1c\x9a\x63\x3a\x8e\xbe\x95\xd0\x2b\xc0\x46\x58\x25\xee\x54\x1a\x7d\x92\x7b\xb5\xb9\x0a\x6d\xb5\x49\x9f\x8d\x99\x3a\xb4\x04\xb1\x65\x0b\x75\xe7\x92\xa7\xc8\x34\xeb\x41\xf0\x47\x01\x38\xb0\xf5\x78\xa0\x4c\x9b\xa5\xad\x95\x0a\xc7\xc9\xb5\xd3\x28\xf3\x40\x8b\x64\x5a\xd9\xc6\xbf\x19\x6d\xd9\x61\x44\x55\x96\xbc\x78\xf2\x84\xb8\x91\x4b\x2a\x8c\xf9\xb7\xbd\x3a\x71\x6d\x8f\x14\x4b\xb6\xb1\x5d\x83\x10\x23\x71\x3b\x5e\x41\xfd\xa9\xb5\x87\xff\x9d\x6c\xc4\x3c\x08\xd3\x5a\x70\x7f\x49\x52\x83\xe1\xac\xe9\x60\x48\x7e\x7f\x02\xb7\x54\x3b\x68\xa7\x31\xa2\x9b\xf3\xbe\x14\xb6\xe9\xc3\x71\x74\xa9\xf4\x6f\x56\x11\x99\xdb\xd2\x7b\x46\xbf\xe6\x22\x43\xe0\xc1\x1c\x0e\xdf\x13\xb6\x4f\x41\x1c\x8e\x8e\xce\xd3\x5d\x84\x28\xf7\x9f\x10\xea\xcf\xfb\x72\x34\xe5\x46\x41\x3d\x1e\xb0\xfa\xd8\x8c\x0e\x93\x85\x93\xb4\x3b\x5e\xe0\xe4\x28\x5d\x4d\xdd\xf5\x29\x5d\xbf\x1a\x3d\xdb\xe9\xf4\x13\x4d\xd7\x6d\x3d\xe7\x04\x62\xc2\xf0\x4f\xe0\xae\xbd\xf5\x9a"}, +{{0x97,0x76,0xa4,0x67,0xfa,0x14,0x00,0x73,0x54,0x12,0xa7,0x9b,0x49,0x5f,0x9f,0xca,0x07,0x8c,0xe1,0xd8,0x7a,0x85,0x30,0xd8,0x5c,0x26,0x05,0x5d,0x3a,0x39,0x44,0x88,},{0xc7,0xdb,0xe0,0xe4,0x1c,0x0a,0x31,0xc0,0x94,0x27,0x93,0xff,0xd1,0x42,0xd8,0xb9,0x5c,0xc8,0x2e,0x5c,0xaa,0x92,0xa3,0x79,0xba,0x23,0xf6,0x44,0xed,0xf2,0x24,0xda,},{0xe1,0x31,0x7b,0xa2,0xa1,0x23,0xae,0x3b,0x29,0xe7,0xb6,0x0e,0x8e,0x93,0xbe,0xed,0xd7,0xa0,0x84,0x51,0xa0,0x13,0x69,0x5b,0x6d,0xcf,0x35,0x8e,0x40,0x34,0x02,0x6d,0xc7,0x40,0x37,0xaf,0xbd,0xd2,0x17,0xff,0x4b,0x14,0x8b,0x02,0x91,0x38,0xf4,0xbc,0xc8,0xf9,0x83,0x6a,0xbb,0xae,0x7e,0x62,0x76,0xe9,0xe7,0x69,0xdb,0xd8,0xf0,0x07,},"\xd7\x85\x53\xa1\xb7\x05\x5b\x58\xb2\x13\x10\x1b\x1c\x84\xc5\x3e\x16\x4e\x39\xc6\xe9\xd3\x6d\xb4\x3f\x30\xe1\x9e\x2a\x12\x5a\x9a\x67\x70\x9e\xaf\xef\x96\x4f\xa5\xba\xb7\x26\x1d\xdb\x3a\x8a\x01\x88\x45\x7d\xfb\xf5\x15\x9c\x40\xe5\x1d\xa8\x20\x84\x83\x24\x57\x81\xd7\x13\x1e\x23\xa8\xbe\xe5\xe5\x06\x33\x18\x16\xb9\xde\xee\xfe\x6e\x55\x6e\x3f\x0c\x95\xc6\x68\xd1\xbe\xdb\x7d\xa6\x35\x06\x54\x58\xad\x20\x46\x70\x12\xf5\x9f\x17\x13\x52\x06\x80\x20\xce\x3c\x75\x87\x86\x93\xf6\x43\x7b\xc4\xa0\x9f\x13\xb9\xb0\xf0\xcd\xda\xf1\x69\x1b\x87\x2f\x82\x00\x80\x93\xeb\xfb\xe2\x33\xd0\x31\x3e\x72\xc8\x63\x2d\x7d\x17\x93\xf0\xb8\x1c\x76\x88\xf5\x44\x70\x33\x0f\x04\xe6\x48\x60\xe6\x44\x6b\xfc\x6d\x96\xc8\x75\x69\xbf\x18\x2f\x0f\x43\x85\xaf\x48\x5d\x42\x99\xca\xc0\x4e\x06\xba\x47\x34\x65\x56\x6c\x47\x7f\x07\xb9\xdb\x27\x7a\xb4\xa9\xde\x2f\xb2\xde\xd0\xa5\x01\x1c\xd0\x6d\x67\x5c\x08\x00\xb3\x4f\x55\xbc\xf3\xec\x72\xd2\x1c\xa1\x50\xc8\xbf\x23\x61\x28\x7b\xe8\x1e\xfa\xbb\x96\xd8\x68\x8a\x1d\xee\x3f\x43\x0f\x06\xf6\x37\xdf\xd0\x6f\x15\x14\x64\xa0\x5c\x95\xf5\xfe\x76\xaf\x2e\x06\xd0\x12\x3f\x69\x48\xa2\x6b\x3b\xe8\x35\x04\x5a\xa2\x68\xcc\x1b\xe9\x76\x69\x71\x07\x77\x02\x08\xa7\x56\x8f\x02\x5c\x2d\x53\xc7\x19\xe5\x24\xcc\x36\x9d\x9b\x4a\x33\x7d\x8f\xd1\xef\x34\x5b\x9b\xca\x57\xfb\xd7\xb6\x5a\x6b\x99\x7c\xad\x3f\xce\x4c\xf0\x6f\x2c\xa4\x3e\xbe\x29\x86\xd0\x96\x82\xd4\x7c\x92\x2b\x2c\xb7\x56\x9d\x98\xde\x97\xa6\x16\x4f\x54\x70\xee\xc7\x1c\xed\xa5\x20\xcc\xec\x77\x32\xbd\x01\x68\x9e\xf8\x16\x56\xe9\xf6\xd0\xc5\x8a\x89\x55\x58\xae\xe8\x63\xf5\x46\x9e\x7a\xb9\x79\x15\xbf\xe0\xb8\x0a\x06\x4c\x65\x9b\x18\x30\x31\xf7\xf1\xa8\x6f\xb1\x1a\x9d\x52\x8c\x28\x15\xdc\xaa\x2f\x0d\xec\x3d\x21\xa8\x82\xe1\x06\xe2\x04\x93\xee\x0a\xcb\x77\x08\xea\xa2\x91\x25\x74\xae\x97\xbb\x28\x8b\x41\xfc\x09\x25\x05\x3a\x29\xb0\xbf\xbc\x0e\xba\xe8\xd6\x3c\xc0\xb4\x6e\x37\x38\x04\x6c\x5a\x20\x25\x30\xbc\xb1\x5b\x18\x7a\x72\x85\x4a\xa2\xd8\xa7\xa7\x6c\x89\xa8\x9a\x5d\xb4\x60\x32\x07\x4e\x1b\xd7\xde\x77\xef\x20\x65\xa0\x8f\x38\x9d\x78\x3c\xf7\x59\xeb\xd5\xa6\x3a\x44\xd9\x19\xf9\x48\xf5\x60\xc3\xe9\x4c\x42\x39\xe2\x74\xe0\x51\xa2\x04\x85\xa4\x30\xcb\xd5\x29\xf3\x13\xd9\xf7\xed\x67\x9a\x34\x18\x7b\x24\xf8\x41\x30\x87\xa9\x02\x1e\x47\x31\x73\x0f\x5f\x46\x1f\xc5\xaa\xd6\x65\x4d\xfa\x1c\x05\x04\xd2\x61\x24\x70\x7e\x63\xee\x57\xf9\x31\xb2\x78\x59\x08\xf8\x6b\x10\x4b\x3e\xcb\x96\x00\x02\x51\xd0\x6c\xe1\xfa\x45\xe4\xcd\x6d\xf9\x1a\xc1\x5b\xbf\x7c\xa3\xc3\xeb\x8e\xe0\x82\x76\x12\xa2\x9e\xcb\x7a\x36\xd5\x47\x0c\x40\x50\x51\x82\xfa\x9a\xc9\x13\x57\x0d\x0c\x10\x50\xd9\xa4\x34\x55\xcb\x7b\xdc\x17\xd1\x69\x80\x5f\x01\x89\x56\xf8\x54\xf8\x91\x9b\xbf\xb7\x19\xe1\x86\x7b\x36\xa6\x4a\xab\xcd\xb8\x07\xf4\x8d\xcc\xc0\x67\x2f\x67\x88\x74\x50\xb3\xf3\xe9\x58\xd7\x84\x99\xe0\xd1\xab\x36\x8a\xa4\x94\x42\xe5\xe8\xa3\x32\xbf\xfd\x44\xc1\x69\xea\x67\x62\x9c\x85\x72\x4d\xb6\xf1\x58\x6b\x6c\x6b\x5b\xe4\x86\x4d\xfd\x53\xda\x7c\x0f\x7b\x8b\xb3\x57\x31\x16\xbe\x50\x77\xd3\x32\xbd\x12\xa6\x30\x0f\x3a\x68\xa8\x98\x66\xb4\x79\xec\x2b\xaa\x27\x7f\x9f\x56\xf6\xe1\xd4\x9d\x74\x1e\xb3\x22\x03\x5f\xf8\xcb\x1d\xe8\x5c\x8d\xc8\x7a\xc8\xe6\xe4\xc5\xd2\x0b\xfb\x6d\x31\x7a\xb1\x25\x93\x0c\x42\x60\x9b\xe3\xae\x82\x24\x2a\x9e\xf0\x56\x88\x58\xd8"}, +{{0x09,0xd8,0x12,0x26,0x97,0x12,0x6d,0xfc,0x7e,0x11,0x68,0x5a,0x04,0x12,0x3f,0xdf,0xb4,0x7c,0xcd,0xdb,0x44,0x99,0xd8,0xa3,0xae,0xf4,0x18,0xcb,0x65,0xae,0xd7,0xa7,},{0xf8,0xdd,0xb1,0xc0,0x0f,0x6e,0x0f,0x4b,0xea,0xa6,0xfc,0x38,0xe5,0xd0,0xa5,0x77,0x5e,0xe2,0x8c,0x80,0xdb,0xde,0x3f,0x0c,0x79,0x30,0xa3,0x3a,0xad,0x71,0x50,0xf3,},{0x18,0xcf,0xaf,0x6d,0xc8,0xe4,0xe8,0x58,0x2b,0xce,0xfe,0x0c,0xdc,0x6f,0xce,0xfe,0x6a,0x4a,0x87,0xea,0x62,0x95,0x85,0xf3,0x7d,0x2f,0xba,0x44,0x6b,0x3a,0xeb,0xd4,0x52,0x42,0x63,0x82,0xda,0x0d,0x49,0x1c,0x39,0xcb,0x7d,0x54,0xd2,0x73,0x00,0x5d,0xc1,0x32,0x12,0x15,0x68,0xd2,0xab,0x67,0x45,0x20,0xad,0xda,0x75,0x23,0x84,0x0d,},"\xa0\xd8\xd8\x79\x8e\xba\x22\xf5\x67\x60\xc3\x06\x43\xe9\xfc\x67\x95\x54\x7e\xa5\xf2\xf2\xbb\xd1\x1c\x03\x92\xb2\xeb\xf7\x11\xac\xa2\x2f\x08\x24\x19\x9f\xc3\x18\x8a\x45\xbd\xff\xde\x70\xec\xe9\xab\x15\xa5\xea\x89\x62\x2a\x58\x71\xe0\xef\x76\x85\xd1\x0f\x12\x74\xcc\x19\x5b\x4f\xda\x81\xf8\x79\xd1\xe9\xbf\x42\xf8\x73\xb2\x0a\x85\x9c\x23\x3f\x9e\x49\xad\xbf\x05\x77\x31\xe1\x13\x35\xe9\xb6\xd8\xed\x0e\x06\x9e\x13\x4e\xc4\x61\xca\x88\x90\xd7\xb0\x47\x3c\x40\x5e\x8a\x9d\x95\xd1\x57\x11\xb1\x24\x76\x10\x37\x62\xc6\x26\xd9\xf2\xaa\x5d\xd5\x19\xbd\x82\x5b\x60\xb3\x23\x4e\xbf\x65\x1e\x0d\x19\x33\x37\x1c\x52\xbf\xd8\xce\x33\xfc\x36\xbb\xa3\x28\xf7\xf3\xf2\xcc\xc0\x10\x00\xa8\x99\x04\xaf\x37\xe4\xe1\xe9\xe1\x5f\xff\xab\x5c\x2b\x0c\x47\xf3\x7c\xdc\xb0\x68\xdb\x33\xac\x36\xa5\xf0\xd6\xde\x12\x03\xfb\xf8\x94\x93\x24\xbd\x3e\xfd\xa0\xf9\x88\x9d\xb0\x0d\xa2\x31\x7b\x49\xfd\x18\x69\x99\xdf\x7f\xcd\xc3\xcb\x4e\x1d\x18\xfa\xa2\x54\x56\x1c\x25\x11\x78\xb8\xd3\x3f\xdc\x9d\xcc\xd8\xd2\xd7\x21\xb9\x3a\x53\x6c\xcd\x3c\x0e\x9c\x85\x63\x37\xf1\x95\xee\xe7\xda\x9a\x7f\x6b\x0a\x42\xb7\xc5\x41\xc6\xa6\x8c\x59\x5b\xf3\x47\x04\xd9\xfe\x3a\x56\xd2\xec\x84\x81\xd5\x77\xc9\x6e\xcc\x08\xb8\xe4\x0a\xcd\xbf\x05\x0e\x20\xc6\x83\xf3\x9c\x41\x4e\x8c\xbf\xcf\x4a\x01\x52\x31\x4c\x05\x98\x7a\x83\xbd\xe3\x02\x5b\x73\x5c\xca\x30\x23\xab\xc5\xfe\xb7\xe0\x0d\x02\x36\xb4\xf2\x4b\x15\xe6\x79\xdb\x05\x2c\x8d\x2f\xdd\xb3\xbe\xf8\x66\x3a\x6d\xf8\x19\xa9\x81\x55\x27\xa1\xa2\xf6\x0a\x0f\xa4\xe5\x07\x8d\xdc\x6d\x43\x5f\xe8\x92\x87\xb3\x0f\xfd\xeb\x5d\x9a\xe0\x5d\x1a\x86\x90\xfb\xc7\x59\x0a\xad\x57\xd4\x3d\x22\xc1\x2a\xce\x2c\x81\x96\x88\x8e\x35\x4e\x9f\x78\x2f\x5d\xbb\x44\x14\x9e\x83\xfb\x8b\xbc\x9d\xa6\xd8\x9c\xe2\x06\xc1\xe2\xb6\xb2\xb2\x8f\x93\x3f\x3e\x5f\xf1\x17\x5a\x31\xa8\xff\x5d\x31\xe6\x5c\x8b\x00\xc5\xba\x46\x22\x24\xa1\xe0\x9d\x4f\x09\xcb\x40\xfc\x87\xc3\x6e\x7d\x28\x5c\x77\x4a\x96\x97\x62\x03\x65\x18\x28\xe7\x83\x62\x88\x47\xac\x51\x2e\x5d\x1c\x35\xb3\x5b\x03\x01\x71\xf9\x23\x96\xf5\xff\xaf\xf5\x85\xce\xad\x04\xb6\xae\x21\x0d\x80\x70\x7c\xc6\x83\x2d\x98\xa2\x0d\x3a\x94\x76\x48\xda\x26\x04\x93\x7f\xef\xd2\x5a\x9f\xe0\xfc\x5c\xac\x08\x3d\xdd\x7d\x20\x75\x30\x7f\x4f\x38\x26\x64\xf6\x87\xdc\xe8\xc6\x55\xde\xd9\xc1\x2d\x48\xff\x76\x01\xdf\x2a\x48\xd3\x7f\xe2\x14\x97\x08\x44\xc0\x75\xf2\xea\xb0\x02\x05\x9f\xc2\x27\x1e\x61\x7c\x96\x57\xa0\x1b\xec\x1d\xd3\x8f\x6c\x28\xba\x8a\x61\x7b\xd3\x08\x51\xe3\xf9\xdb\xac\x90\x44\x18\xdf\x1d\x02\x15\xad\x45\xdf\xc9\xf0\x2b\x5c\x5e\x9f\x9b\xbc\x6d\xe8\xb0\x7a\xf0\xbd\x1f\x7f\xa8\x92\x25\x44\xf1\x2d\x2a\x3e\x1a\xad\xff\x7e\x9c\x6b\x93\x32\x0c\x3a\x61\xef\x33\xda\x07\xeb\x87\xb1\x61\x7f\x9e\x77\xd7\x70\x2e\x55\x8b\xc7\xd8\x12\x2e\x0d\xfe\x2a\xe8\x3e\x83\x6c\x5b\x1a\x62\xaa\x58\x5c\x0d\xff\xe7\x16\xf7\x46\x3c\x0b\x33\xda\x5b\x1e\xda\x55\x6a\x1e\xf1\xe4\x50\x42\xc7\x9b\xdd\x3e\xc3\xcb\x88\x63\xa7\xbc\x1b\x0f\x7e\x1c\x05\xbd\x99\x20\xf0\x5b\x4e\xda\x86\x51\x77\x05\xed\x07\xf6\xdc\xa7\xbb\x00\xae\x04\x56\xe6\x78\x7d\x9f\xae\x8e\xde\x4e\xcd\x0b\xc5\x72\xeb\x5c\xc6\xd1\x9e\x89\x1f\x1b\xcb\x22\x9e\x94\x09\xe0\x65\x74\xc7\xdf\x05\x81\x73\xcb\x58\xc3\xfd\xf2\x0f\x3f\xf1\x7c\x37\x05\xaf\x62\xd9\xb7\x22\x5c\x57\x43\xf6\x00\x60\x7f\x77\xcb\xe7\xd6\xe7\x61\x8a\xbc\x79"}, +{{0x10,0x20,0x1b,0xf0,0x08,0x43,0x67,0x59,0x0d,0xe6,0x74,0xcc,0x0e,0xd2,0x64,0x8e,0xc2,0x5d,0x3b,0xa8,0xdb,0x40,0xd0,0x0e,0xde,0x15,0x33,0x98,0x50,0x8b,0xc1,0x26,},{0xba,0xdb,0xd0,0x5e,0x5f,0x79,0xe3,0x11,0x69,0xf7,0x40,0xba,0x46,0xa5,0x89,0x10,0xa1,0xb7,0x77,0x05,0xaf,0x45,0x71,0x7b,0x2a,0xf8,0x08,0x56,0x45,0x7c,0x58,0xc9,},{0xf1,0xd9,0x96,0x58,0x8b,0x29,0x8f,0x27,0x1e,0x97,0x0c,0xeb,0xd2,0xa1,0xb3,0x39,0x97,0x9c,0xd2,0x9d,0xdd,0xee,0x36,0x45,0xd0,0x7f,0xab,0x8a,0xb4,0x65,0xdd,0xe3,0xe9,0x86,0x67,0xec,0x01,0xad,0x7f,0x1c,0x0a,0x65,0x92,0xe0,0x69,0x7e,0x66,0x5c,0x72,0xfd,0x38,0x14,0xdb,0xe1,0x89,0xed,0x5f,0x4e,0x76,0xc7,0x94,0xe5,0x38,0x09,},"\x7b\xb1\x47\x06\x17\xd1\x1e\x45\xeb\x60\x2a\x82\x9a\xd7\x73\xee\x2b\xb7\xe6\xb8\x8d\xa4\xc0\x4a\x72\x16\xa4\x50\xf8\x49\x93\xa4\x98\xcb\xd3\xb9\x25\x40\x28\xf2\xf9\x9f\xc2\x1a\x23\x28\x8b\xdc\x1e\x15\x1a\x72\xa9\x13\x0c\x3d\xed\xda\x1b\xbb\xcc\xd4\xe6\xc0\xf4\x8a\xe9\xf3\x53\x18\xcb\xef\xc9\x59\xf4\x05\x04\x5e\x6e\x0b\x5f\xb2\xe7\x38\xf2\xb7\x65\xbe\x11\xb1\xb6\xa0\xf1\xe8\x31\x95\x49\xd9\x5f\xa8\xd1\xdf\x81\x67\xcd\x4a\x77\x17\xae\x16\x36\xa9\xdf\x54\xd9\x6e\xaf\x2d\x63\x23\x69\x00\xfd\x11\x33\x82\x52\xa5\x00\x8d\x5d\x48\x0e\x2b\x1e\x98\x61\xd1\xf7\x06\x88\xc4\x7e\xae\x46\x89\xda\x01\xa4\x7d\xa3\xdf\xb6\xd2\xba\xb3\xcd\xf5\x05\xee\x5d\x80\x1a\x15\x2c\x26\x70\x93\xd1\x7e\x9b\xf7\x13\x7a\x6e\xe7\xb8\x34\xd0\x08\x55\x00\xe4\x01\xc1\x7f\x32\x86\xc1\x57\x5d\x1c\x01\x00\xfa\x98\x07\x63\x0c\x4a\x99\x06\x54\xc1\xe7\x1a\x8b\x71\x56\x27\xbb\x13\xd4\x42\xc8\x4a\x44\x98\x44\xc4\x04\xb8\x72\xbf\xba\xc7\x18\xa4\x8d\x0e\xa0\x94\x5c\x77\x16\x6a\x53\x13\x9b\x0f\xf0\x09\x81\x34\x76\x4f\x9e\xcd\xb8\x8e\xab\xe0\x7c\xcb\x2c\xce\xd4\x95\x5e\x08\x24\x9b\x2f\x57\x70\xad\x41\xfc\xcd\x7b\x5b\xb3\x72\xe6\xc3\x37\x67\xe0\x7f\x5b\xe7\xd1\x07\x12\xde\x81\x84\x1b\x13\x4e\x19\x3d\xf0\x77\x6a\x0f\xc1\x56\xff\x5d\x0e\x96\xf4\x0a\x70\x47\x53\xe1\x14\x5e\x9f\xa0\x83\xc4\xdd\xee\xf4\x41\x62\x34\xf6\xe1\xa2\x38\x2c\x8e\x5b\x3a\xd4\x05\x45\x8e\x89\xd2\xf4\x93\xa4\xd7\xc2\x9a\x23\xde\x21\x07\x48\x5b\x7f\x56\x35\x01\x24\xe7\xe0\xd6\x95\xc5\x22\xb6\xde\x7a\x92\x47\xa2\x92\x4c\xe6\xf2\x86\x32\x36\xc1\x0c\xc2\x12\x64\xad\x54\x59\x0d\x31\x47\x63\xea\x1a\x19\xaf\xac\xd9\x0e\xba\x95\x58\x70\x40\x7e\x8c\x63\x65\xa1\x43\xa5\xc1\xb9\xa8\xbe\x5e\x4a\x4d\xca\xdb\x72\xe0\xd4\x76\x49\xbd\x53\xab\xd4\x6b\x5c\x69\x60\xea\xe2\xca\xb7\x73\x75\x3c\xc0\xe0\x4e\x99\x41\x4b\xc2\xcb\x30\xf4\x8b\xb5\x41\x39\xd0\x66\xe4\x3e\x2f\x0e\x1a\x4a\xe9\x63\x85\x8b\xef\x96\x7d\xf8\xc8\x41\x40\xd2\xd0\x92\x02\xb4\x06\xd5\xd8\x5c\xb7\xa9\x6c\xc5\x7f\x23\x3e\xb2\x18\x7f\xfd\x02\xf9\x4e\x92\x29\x7b\x5e\x69\xd9\x69\xd3\xa5\x93\x6e\xfe\x49\x29\x14\x4f\x25\x8b\xfb\x39\xdd\x0c\xe2\x63\x59\xc4\x54\x9f\xc2\x18\xa0\xaa\x54\xf3\x1b\xd5\x51\xb8\x78\x1a\xcb\xbf\x61\xcb\x3f\x73\x2c\xda\xf6\x22\xc6\xa6\x91\x88\xcf\x55\x7a\x3a\x92\xed\x15\x3e\x69\x12\x5a\x40\x90\xac\x45\x15\x36\xa0\xe9\xa6\x3a\x41\x78\x29\x10\xff\xcc\xb4\xe8\x50\x02\x11\x23\xff\xd1\xf3\xbf\x39\xc7\x34\x60\xa6\x5c\xcf\xe4\xdb\xa9\xbd\xef\xb5\xd5\xf4\xda\x6c\x46\x9a\xa1\x32\x2f\xa2\x70\x43\x23\x83\x63\xee\x72\x91\x86\x88\xd7\xca\x1c\x4c\x29\x52\xe4\x30\xd5\x63\x25\x6b\xb8\x6d\x35\x0a\x35\xee\x82\xe0\x15\x04\x74\x7f\x31\xd0\x2e\x03\xae\xdd\xa5\x46\xd0\xf1\xb2\xf4\x51\xb8\x70\x82\x16\x02\xd0\x0e\x81\x90\x36\xad\xe5\xa7\xc7\xfc\xd2\x1a\x6d\xe6\xaf\x35\xb1\xf9\x63\x2a\x70\xaf\x65\xdf\x64\x45\xf6\xfa\xdf\xbc\x0f\x41\x67\x55\xc8\x24\x66\x40\xe5\x6b\x85\x6b\x66\xdd\xd9\x2a\x60\xc0\x35\x38\x22\x1d\xc8\xfb\x14\x2c\xe2\xdb\xac\xdb\x74\x25\xf3\x3c\xb8\x5d\x85\x0c\xc0\x2c\x31\x5c\xfc\x11\x1f\x6f\x65\x1d\xde\x1b\xdb\x67\xfb\x20\x8e\x1f\x6b\xde\x78\x4d\xdc\xf7\xbd\x18\xc8\x05\x1a\x2e\x0b\xbf\x10\x18\xb8\xf3\x95\x36\xc5\x89\xde\x65\xea\xdc\x6c\xf3\x79\xb7\x7c\xad\x13\xf9\x08\x9c\xb3\x23\xfb\x2e\x94\x3d\x06\xcd\xd1\x07\x05\xc1\x21\x13\x4c\x65\x48\xdc\x53\x41\x5f\x8c\x37\x0e\xc6\x90"}, +{{0xc4,0xaa,0x42,0x52,0x46,0xb5,0x17,0x3f,0x5e,0xf8,0x98,0x15,0x2e,0xca,0x3d,0x09,0x2b,0xb4,0xc2,0xdd,0x02,0x85,0x3f,0xcf,0xc7,0x17,0x83,0x99,0xf4,0xe2,0xf7,0x58,},{0x29,0xb7,0x7a,0x30,0x75,0xf4,0x19,0x24,0x3c,0x0c,0x1b,0xc3,0x96,0x59,0xd7,0x31,0x17,0xac,0x00,0xe5,0x5e,0x8d,0xe3,0x8f,0xe9,0x82,0x9a,0x87,0x9c,0xc5,0xb8,0xa0,},{0x5d,0x85,0x45,0xa4,0xbe,0x3f,0xd6,0xda,0x25,0x78,0xc2,0xec,0xcb,0x64,0x8d,0x83,0xfc,0xfe,0x58,0x71,0x33,0xfa,0x7a,0xe4,0xa1,0xcf,0xca,0x9a,0xe6,0xda,0xa4,0x92,0x59,0xc9,0x52,0x04,0x4a,0x85,0xa2,0x0b,0x6f,0x53,0x24,0xf8,0x27,0xdb,0xa2,0xd1,0xa8,0x38,0x8c,0x40,0xa9,0x28,0xb9,0x50,0x91,0x3c,0x63,0x4f,0xb3,0x09,0x27,0x07,},"\x7d\xf9\x78\xa1\xf4\x97\x68\x38\xff\xed\x74\x49\xa4\xdc\x13\x8b\x60\x4f\x4b\x2a\x4a\xe6\x89\xce\x75\x01\x8e\xbc\xcd\xab\x2e\xaa\x0b\x60\x76\x8f\x72\x08\x25\x7f\x2b\x28\xe7\xaa\x09\xbf\x6c\x05\x88\x8d\xa4\x6f\xd3\x96\xd1\xc8\x03\x01\x17\x50\xe3\x0e\xb4\x84\x87\x0c\x88\x06\x97\x76\x96\xf1\x2e\xbb\x9f\xee\xb4\xca\xf9\x2a\x02\xdb\xaa\x22\xbb\xff\x63\xf8\x42\xc3\xba\x14\x7b\xca\x7c\x00\x31\x42\x78\xac\xd0\xdb\x17\x35\x69\xf4\xe3\x65\x27\x95\x8e\xf6\xf1\x00\x2b\xd3\xcd\x01\xf4\x07\xa8\x65\x31\xed\xcb\xd9\xf3\x1b\x3a\x4a\xb8\x80\xa4\xf5\xb5\x2b\x42\xd0\xd4\xa1\xba\x66\xa2\x09\x86\x51\xae\x3e\x6c\x91\x51\xf4\x02\x73\x28\x5f\x7f\x6a\x4e\x81\x60\x6b\xf9\x80\xf6\x89\x50\x4b\x42\x08\x0f\xdb\x97\xc7\x28\x46\xfb\xa9\x04\x7c\x7e\x66\x0b\xa5\xc6\xbf\x12\x6a\x9a\x59\x9e\x25\x71\xfa\x13\x50\x5a\xf7\x58\x1b\xfe\xbc\x16\x51\x3f\x5c\x94\xdc\x71\x93\x7e\x6e\x61\xb3\xea\x10\x93\x9b\x02\xea\x10\x85\x9f\x32\xd7\x91\x2b\x9e\x38\x06\xab\xef\x61\x85\xfc\xff\xa6\x88\x21\x47\x80\x05\xcb\xfc\x1d\x63\x7d\xd0\x20\x42\x56\x20\xa3\x18\x07\x48\x98\xbd\xc3\x09\x31\xc5\x9a\xc0\xc6\x6c\x4d\x12\x38\xb0\x97\xcd\x5b\x17\x0f\x08\x44\x35\xd4\xba\xe4\x8a\x03\xd9\x2f\xd4\x8f\xc2\xca\xa4\xff\xc5\x05\xf1\xbc\xa5\x16\xfb\xd6\xe4\xf8\x88\xcc\xed\x98\x2a\xe0\xdd\xb8\x8f\xc2\x8a\xa6\x97\xb7\x07\x1d\x01\x5b\x0a\xcb\x28\x09\xb0\x1d\x1d\x9c\x7e\x7b\x53\xee\xe6\x82\x4c\xc3\x7c\xce\x5b\x69\x93\xd8\x8d\x83\xea\xfc\x2e\x92\x8a\x6f\x14\x7d\xb6\xeb\x80\xb1\xa6\x9f\x01\x60\x5b\x04\x6b\xd2\xfd\x1d\x92\xc5\x45\x9d\x6d\x33\x98\xa9\xca\xa2\x99\xdd\xd0\xc3\xba\x2e\x08\x94\x13\x07\xb1\x20\xcc\x13\x99\x2f\x70\x03\xac\xed\x14\xa4\xa4\xd9\x23\xbb\xb1\x2f\xc3\x93\xff\xcf\x92\x0b\x9f\x6d\x47\x75\xe9\x4d\x4a\x51\x22\x67\xfd\x26\xa6\x99\x7c\x60\x62\xb4\xc9\x90\x0f\x98\x62\xb9\xea\x0c\x8d\x7d\xf1\x9f\x05\xc2\xb6\x04\xaf\x5b\x98\x64\xfb\x27\x54\xa8\x07\x3b\xbb\xfb\x18\x23\x3e\x6e\x15\x0f\x72\xa5\x25\xe3\xa5\x76\x0f\xcd\xa7\xd3\x2a\x60\x03\x4f\x95\x6e\x3c\xbd\x34\x36\xc2\x00\x83\x0b\x3e\x7a\x14\x57\x12\x20\xbc\xb6\x27\xd5\xa4\xbe\x72\xc2\x0b\x23\x35\x1b\x2d\x92\x06\x02\xa5\x1c\x3e\xb3\x2c\x12\x37\x03\x9d\xfb\xff\x43\xc9\x87\xfd\x85\x63\x77\x7f\x0e\x5a\x39\xf8\x14\x6c\x16\x4b\xdf\xfc\xe4\x4f\x3b\x13\xee\x74\xd6\x4b\xfd\xcf\x98\x03\xf0\x3d\xd0\x17\x2a\xc4\xfa\x4b\xf6\xc7\x83\x9c\xb1\x1f\x3d\x34\xba\xef\x0e\x32\xb5\x49\x42\xfc\x4f\xa3\x8f\x47\x3e\x29\x66\xf4\x91\x1c\x0e\x80\xd7\x69\x37\xb2\x5b\x76\x32\x27\x5b\xa8\x83\x09\x63\x5a\x60\xdf\x13\x54\x89\x20\x8d\x3e\x73\x4b\x67\x2e\xda\x7d\x2b\xa2\x15\x79\xab\xa8\xd8\x86\x0e\xa7\x64\xfd\x67\xea\xf9\xc3\x8e\xa7\x63\x7d\x1b\xad\x57\xb2\xf3\xd7\x82\xb9\x1e\x1d\x5d\x92\xac\x30\x0b\xdb\xa7\xab\x91\x13\xce\x91\x3d\x0c\x79\x3c\x12\xa9\xa7\x26\xe3\xfc\xab\x05\xcb\x47\x99\x77\x87\x16\x40\x63\x0d\x45\x9e\x69\xe8\x1c\xa5\xcf\x56\xdd\xb2\xa0\x61\x1d\x61\xd4\x81\xc1\xb8\xce\xf3\x80\x4b\xd4\xe5\x75\x4a\x61\xeb\x49\xb1\x7e\xf2\xb0\x3c\x83\x05\x7b\x5d\x20\xd8\x82\x05\x8c\x00\xf5\x4b\x6c\xca\x86\xbe\x95\x35\x0d\xd7\xbc\xb2\x5e\x4c\x1c\x46\x58\xf4\x52\x29\xc8\xbb\x9f\x5c\xdf\xcc\x44\x79\x5c\x97\x8e\x33\x88\xd3\x25\x76\x01\x06\xe5\x2b\xe9\x83\x4b\xd8\x1f\xfc\x5c\x62\x48\x6b\x6f\x33\xc2\x74\x59\xdf\x17\x8e\xb9\x46\xe7\xa8\x2d\xb9\xce\x0d\x29\x5b\x92\x5b\xb6\x12\x6d\xd5\x5c\x31\xf4\x9a\x68\xdc\xef\xc7"}, +{{0xf1,0x3c,0xaf,0xde,0x6f,0x39,0xb9,0x63,0xdc,0xa9,0x66,0x26,0x86,0x2f,0x4f,0xbc,0x5c,0x2e,0x00,0xdd,0xf0,0x8b,0xec,0xea,0xc7,0xa6,0xe2,0xfc,0xa9,0xe1,0xcc,0xf7,},{0xc1,0xb0,0x1a,0x91,0xe8,0xee,0x0b,0x9f,0x19,0xa7,0x2e,0x5e,0x7e,0x0a,0xef,0xcf,0xdc,0x44,0xa1,0x57,0x47,0x4e,0x99,0xfe,0xeb,0xd0,0xff,0x55,0x2d,0x73,0xb2,0xac,},{0x6c,0xa9,0xf8,0x0a,0x62,0x50,0x1f,0xaf,0x31,0x9f,0xb8,0x4a,0xf4,0x71,0xf6,0x76,0xae,0x3f,0xff,0x85,0x56,0x5c,0x97,0x98,0x1f,0x14,0x57,0xcb,0xb8,0xc4,0x9f,0x97,0xb2,0x66,0x31,0x6a,0x99,0x2d,0xb0,0xd4,0x2b,0xc5,0x02,0xf0,0x95,0xa5,0xf2,0xd9,0xa4,0xe1,0xcf,0xac,0x0c,0xc9,0x35,0xd3,0x88,0x2c,0x8a,0x3a,0x0e,0xa6,0xe1,0x0e,},"\x2b\xee\x73\xb7\x4f\x1b\x76\x22\xeb\x09\x6a\x28\xd8\x3a\x81\x9b\xce\xc2\x2d\x99\x99\xa3\x20\x62\x10\x3d\x60\x4a\xe6\xd7\x8e\xdf\x8f\x89\x38\x95\xd2\x22\x0a\xb7\x56\x90\x41\x0c\x58\xaa\xb5\x90\xa9\x8d\xdf\xf2\x3a\x94\xd2\x35\x0f\x88\x9e\x53\x46\x42\x00\xa5\x27\xd5\x4d\x62\x57\x11\x07\xb2\x7e\x57\x4f\x54\x2e\xba\xc2\x49\xb8\xe2\xe3\xce\x08\xd1\xbd\x27\xbd\x8d\x29\xf2\xe6\x12\x43\xde\xef\x0e\x69\x38\xe5\x2e\xe2\x99\x2f\xf2\x18\x7d\x7a\x7f\x52\x82\xed\xd9\x8f\xc4\x98\x5b\x61\x9a\xcb\x80\xaa\x9d\x03\xd6\xcb\x84\xb8\x21\x10\x6f\x40\xd6\xe5\xf4\xc3\x87\xab\x0a\xf6\xf2\x06\x61\x5d\x0a\x17\x5f\x7e\x60\xee\x27\x55\xae\xa3\x46\x75\xfd\xd8\x23\xeb\x24\x10\x9a\x9b\xd8\x18\xea\x2d\x9d\x9b\xd1\x99\xcf\x8d\xfe\x79\x62\x4b\x03\x72\xae\x85\xe9\x8c\x60\x20\x02\x34\xbd\x41\x3f\x4a\x62\xce\x68\xa4\x7b\x6c\x9b\x12\x85\x7c\x0d\x39\x9a\x44\x8e\x5a\x52\x80\xe9\xf2\x2f\x9b\x12\xea\x2c\xd3\xc6\x87\x13\xe7\x7d\x0a\x11\xf3\x62\x8d\x8e\xc5\xe0\x60\x63\x90\x31\xd3\xb6\x40\x02\x1c\x9c\x38\x80\x9d\xc5\xf4\x2d\x2e\x1c\x2e\x23\x46\xc8\x6e\x24\xee\xdc\x59\x84\xa1\x15\xa4\x2d\xe8\xde\x7e\x35\xc9\x91\x75\x39\xe8\x98\x85\xca\x91\x6e\x07\x2a\xfd\x5d\x46\x84\x6b\x2a\x93\x59\x61\xc2\xfe\x28\xe9\xeb\x3c\x8f\x89\x6b\x86\xfc\x12\x0c\xbd\x3a\xf2\xaa\x13\x9c\x49\x9d\x29\xcf\xc3\x69\x9d\xb7\x9c\x14\x48\x4e\x9e\xc2\x57\xa5\xf6\x43\x44\xb7\xad\x1e\x3d\xfb\x34\xee\xe7\x65\x4c\x6b\xf1\x2f\xd3\x8f\xbb\xa8\x0f\xe1\x76\x2a\xab\x57\x11\x2b\x3a\x94\xe2\xbe\xe7\x90\x41\xd1\xe8\x84\x40\xf8\x5f\xb7\x2d\xde\x68\xd4\x9e\x84\xbc\xed\x99\x8a\x2f\x63\x35\x44\x6e\x4a\x83\x5e\x70\xc5\xf8\x27\xfb\x3a\xd7\x82\x3d\x5f\xbe\x3b\xe5\xf6\xec\x7e\x43\x4e\xe5\x24\xcc\xd9\xff\x5b\x7e\x72\xa3\x2d\x09\x1a\x7e\x17\xc8\xb1\xae\x41\xa1\xaf\x31\x79\x3c\xce\x91\xd8\x4c\x36\x22\x67\x89\x69\xc8\xf5\x17\xdc\x26\xe3\xcd\x61\xd2\x44\x69\x12\x28\x3f\x93\x53\xbb\x5a\xd0\x3c\x11\x1c\x62\x33\xde\x31\x4c\x61\xb8\x31\xcb\xf3\x8b\x04\xfe\x58\xcf\x44\xf1\xd2\xd0\xb4\x5f\x25\xa6\xb4\xe0\x25\x68\x59\xcd\x5d\x83\x0f\xac\x5e\xc3\xc8\xd7\x63\x98\x55\x9e\x9b\x26\x01\x0f\x5e\x1d\xa5\xf2\x5d\x22\x00\x93\x54\x53\xff\xac\x5a\xea\x51\xf7\xe8\x1e\x72\xec\x8e\x5f\x04\xd2\xf8\x85\xc7\xb4\x5c\x63\xf6\x44\x56\xcf\xe2\x31\xb8\xcb\x24\xaa\x16\x20\xa9\x02\x63\x9c\xa7\x8d\xd3\x91\xaa\x4a\x3d\x03\xe1\x19\x75\xc8\x90\x7f\x96\x4f\xd5\x5d\xf9\xbb\xb1\x40\xe3\x8d\x6d\xb9\x32\x56\xb4\xb3\x9c\x2b\x7b\xcb\xe3\x5b\x11\x82\x6b\xbf\x8c\x08\xf1\xdc\xb4\x8e\xdc\x4b\xfb\x70\x46\x2a\x35\xea\x8c\xd8\xcb\xa7\x9f\xab\x8b\x4c\x44\xe7\x3b\xe7\xec\xfa\x11\x21\x66\xf6\xdc\xab\x70\xd8\xbb\x55\xd8\xb8\x42\x8c\x2d\xa7\x1a\xac\xa2\xfc\x3d\x90\xf3\xcc\x5e\xd0\x15\x51\x35\x8d\x60\x78\x9b\x9d\x57\x1e\xfe\x10\x89\x20\x27\xfa\x37\x40\x4a\xaf\x59\xec\x1c\x2d\x71\x11\xec\xc3\x59\x24\x67\xed\x1d\x9b\x8a\xba\x8e\x22\x9e\x32\xd2\xa0\x0c\x19\xdb\x71\x87\xfb\xcb\x12\x20\x61\x96\x1c\x1f\xda\xca\x30\x7e\x9c\x9c\x9d\xe9\x72\xad\x51\x40\x2f\xa6\x7d\xc1\xc2\xa4\x03\xb3\xc5\xe8\xb1\xe2\x46\x86\x2d\x6a\xd6\xa4\x98\xdb\x6d\x76\x1f\xb5\x66\xf6\x06\x59\x42\xb6\x0a\xd4\xb4\x30\x9d\x18\x2b\xc5\x15\x4c\xfc\x36\x86\x31\x85\xa8\x7e\x23\xab\xaa\x1d\x54\x1a\xb7\x63\xa4\xa1\x06\x6c\x0a\x7a\x8c\x3d\x82\x1a\xe3\x2f\xd3\x1c\x88\x92\x40\x10\x46\xd0\xa2\x0e\x91\xa6\x47\x79\xf4\xbd\xa8\x11\x20\xaf\x3f\xb3\x48\x6d\x3f\xc0\xa7"}, +{{0xc8,0x46,0x34,0x42,0x61,0xa3,0x48,0x65,0x39,0x38,0x34,0xbf,0xaa,0x3a,0x15,0xa3,0xf5,0x3a,0xc9,0xe1,0x38,0x33,0xb0,0xb2,0x87,0x12,0x27,0x81,0xb7,0x9d,0xe3,0x92,},{0xeb,0xad,0xe0,0x22,0x61,0x95,0xae,0x25,0x4b,0x61,0x15,0xe2,0x16,0x96,0xa9,0xc6,0x5a,0x19,0xd5,0xe0,0x40,0x44,0x31,0x31,0xc2,0x2b,0x89,0xf0,0x2f,0x69,0xab,0x78,},{0xd5,0xe4,0x1b,0x47,0xad,0x0f,0x34,0x00,0x70,0x97,0x70,0xed,0x43,0x91,0x9b,0xaf,0xdf,0x24,0x38,0x1b,0x66,0x15,0x44,0xe5,0x1d,0x8b,0x5c,0xee,0x9e,0x97,0xb3,0x67,0x6a,0x4c,0x0f,0xfa,0xeb,0xb2,0xcb,0xd2,0xdb,0x79,0x85,0x32,0xb6,0x5c,0xf6,0x54,0xa5,0xb6,0xc1,0x66,0xef,0x88,0x6c,0xb0,0xfb,0xbf,0x4a,0x4f,0x84,0x4c,0x44,0x0b,},"\x5a\xbd\x13\xe9\x5b\x6e\xe1\xd5\x51\x47\x68\x28\x22\x00\xa1\x4f\x7d\x1a\x57\x1f\x34\x68\xe2\x2e\xfe\xc9\x93\x46\x30\x66\xa3\x7a\xec\x83\x73\xe5\xfb\x49\x95\x64\x19\x1f\x32\x94\xa9\xb3\x0a\xfb\x5f\x1a\x34\xd4\xd8\x8a\xbc\x3e\x9b\xc3\x03\xc1\xab\xa0\x5b\xd8\xfa\xca\x90\xee\x35\xd9\x7a\xc3\xdd\x91\x06\xf6\xfa\x3c\xa8\x1a\x38\x10\xec\xce\xfa\x6a\x20\x9e\xa3\xf3\xfc\x30\x49\xdc\xb1\xb0\x03\xc7\x28\xf7\xf6\x37\x4c\xa9\x8c\x58\x2d\xe6\xdb\x1a\xf7\x60\xf0\xa0\x21\x33\xca\x4a\x01\x03\x24\x30\x4d\x26\xa0\xe5\x0a\xf0\xd1\x3c\x13\x4d\xa3\x4a\x03\xa4\x1e\x83\xec\x8f\x10\xea\x5b\x85\x9b\xec\x1f\x51\xb0\x1c\xab\xb2\xd1\x6c\x1f\xc5\x2b\x05\x8f\x8e\x5d\xef\xae\xde\x12\x81\x71\xc2\xe0\x26\x90\x23\x16\xf8\x71\xb3\x5e\x32\x92\x65\x6f\x0e\x5b\x39\xbb\xbc\x81\xd0\xc0\x83\x0e\x6a\xc0\x1f\xac\x9b\x45\x39\xf4\x7f\x9a\xcf\xbd\x58\xb7\xab\x9f\x5a\x12\x56\x00\xf2\x51\xa2\x71\xd7\xbf\x16\x7f\x29\x54\xca\x8e\x1e\x0c\x96\xe1\x6b\x06\xe8\x30\x7d\xf8\x8b\xb8\xe9\xd5\x7d\x5b\xa0\x44\xf2\x7f\x3e\xaf\xf8\x1d\x9f\x15\x05\x54\xaa\x71\x22\xfd\x10\xd1\x1f\x35\xd2\xbe\x2b\x16\x24\xe3\xe1\xa1\xd7\x7f\xea\x4c\x5c\x7f\x8b\x98\x3e\x94\x5b\xa8\xc0\x8d\xc1\x54\x5b\x3e\x6b\x29\x73\xad\x04\x1c\x44\xd0\x61\x7e\xcc\xc8\x71\xa3\x82\x1a\x9f\xfe\xa9\xdb\x7c\x2b\x0d\x05\x5d\xa5\x5d\xe0\xb3\x50\x63\xe4\x22\x5a\xee\x6b\x22\x5a\xb2\xa7\x90\x6a\x8e\xe3\x29\xd1\xb3\x97\x2e\x0d\x1f\x70\x81\x7c\x50\xcc\xfe\x94\x03\xd1\x2a\xd6\x2c\x94\x92\x3b\x9a\xa2\xd7\xf8\x5a\x8d\xda\x47\xbe\x4d\xce\xc0\xdc\x2b\x0b\x58\xf7\xac\x19\x0a\xe0\x57\x9b\x9b\x13\xbb\xb8\xb1\x6a\x31\xb0\xab\x4d\x6f\x27\x91\x25\x3a\xb4\x75\x1b\x53\x6b\x88\xd3\xb4\x93\x7c\xc3\xa1\x10\xaa\x82\xa6\xff\xed\x68\x53\x52\x4b\x66\xb3\xef\xfc\xd2\xf6\x3c\x6f\x96\x45\xce\xa1\x3a\xa2\x3c\xd1\xc9\x9d\x9f\xfd\xa4\xcd\x3a\x9c\x5d\xf4\x5e\xc7\x47\x26\xc3\x47\x11\x28\xb7\x08\x9f\xbd\x82\x69\x4d\x2d\x3f\x08\xdc\x93\x06\xc0\xfc\x9c\xe7\xc8\x01\x13\x8e\xb1\xec\xb7\x56\xe5\x71\xe9\x05\x9b\x75\xed\x03\xf9\x2a\x31\x50\x2f\xbe\xb5\xfe\xc5\x1d\xe9\x35\x90\x10\xc4\x39\x7d\x28\xb6\x5e\x35\x6e\x38\x00\x1d\x0d\x51\xac\x96\x00\x72\x8c\x78\xb5\x76\x6e\x0f\x21\x79\x38\xb4\x10\xe7\x85\xb4\xc0\x1e\x86\xa3\x45\x2b\xcb\x38\x84\xac\xa4\x75\x40\x85\x9c\xc4\x9b\x00\x0f\x0b\x61\xfd\xbe\x72\x75\x25\x74\xb2\x7a\x22\xd4\xc4\x04\x13\xa4\x3b\x31\x09\x24\xb1\xbb\x14\x0f\xc9\xfd\xaa\xe2\x66\xd6\x59\x30\xe3\xf2\x34\xfe\x84\x1d\x82\xb2\x61\x76\xff\x86\xc5\xd2\xbd\x8d\x96\x5c\x52\xd7\x28\x06\x4e\xbd\xf6\x8d\xc8\xe4\x83\x49\x41\x80\x1c\xca\x0b\x2f\x25\x6d\x4f\x6c\x3d\xd1\x9d\x35\xd5\x36\x2b\xbf\x9b\x8a\x3a\x1c\x86\x3e\x09\x26\x89\xdd\x28\x52\xad\xd4\x88\xbf\x42\x68\x5b\x11\xe1\xe1\xad\x57\x45\xd0\x75\x62\x8d\x73\x1f\x91\xcf\xd7\x49\x15\x9e\x2e\x1c\x83\x7f\x4e\xf8\x3d\x80\xea\x1d\xd9\xbd\xed\x5f\x88\x01\x8c\xe1\xd4\xb3\x37\x1f\x95\x43\x53\xf3\xd8\x94\x37\x00\x62\xc0\x96\x5d\x67\x98\x6d\xbc\x48\x17\x15\xf4\x2d\xd2\xc9\x16\x07\xab\x8b\x5f\x0d\x89\xf6\x6e\x68\xd7\x3d\x50\xd6\x40\x52\x4d\x72\xe6\x91\x34\xb8\x87\x29\x8e\x5c\xd8\xc4\xb9\x05\xba\x5e\xfa\x0e\x9d\x68\x52\x14\xb8\x42\xf5\x0a\x2a\x39\x83\xa1\xaf\x58\x5a\xf2\xca\x43\xdb\xcf\x02\xc4\x08\x97\xae\x2e\x1a\xb5\x1d\xbc\xe5\x70\x34\x5e\x8e\x13\x5f\xb7\xb4\xeb\x0a\x1d\x6a\x0b\xb5\xa8\xa1\x80\x7e\x42\x5b\x2d\x62\x83\x60\x76\x80\x58\xe6\x1a\xd1\xcf\xaa\x20\x99"}, +{{0xfa,0xaf,0x55,0xd3,0xc2,0x97,0x14,0xb6,0x5c,0x22,0x81,0xe2,0xc2,0x2d,0x61,0x34,0x97,0x1a,0x2e,0x74,0x00,0x8f,0xb9,0x40,0x89,0xa7,0x73,0xee,0xeb,0x44,0x83,0xa6,},{0x39,0x86,0x2e,0xac,0x6d,0xd5,0x2e,0x38,0x1b,0xb3,0x4d,0xc1,0x96,0xba,0x8a,0x37,0x4d,0xcb,0x7d,0xf6,0xcb,0x14,0x0f,0xd0,0xcf,0xa6,0xcf,0xa3,0x9b,0x8c,0x75,0x3f,},{0x5b,0x00,0x83,0xf7,0xa8,0x20,0x61,0xc6,0x5c,0xf6,0xc7,0x56,0x40,0xc8,0x1c,0x28,0xe8,0xd6,0xd2,0xe8,0x7f,0x6d,0x57,0x95,0xc9,0xaa,0x3b,0xb3,0xe3,0x90,0xe9,0x19,0x90,0xe8,0x2d,0xb6,0xf0,0x7e,0x61,0x4f,0x50,0x7a,0x56,0x0a,0xba,0xa1,0xec,0xa6,0x56,0xc6,0x78,0xdd,0xca,0xe8,0x19,0x82,0x51,0xe6,0xaf,0x0b,0x76,0xb8,0x8d,0x0d,},"\x94\xe6\x61\xc2\x52\x40\xa8\x9e\x82\x3d\x7f\x5d\xc0\xe6\x92\xed\xdd\x13\x70\xc3\x5a\xc4\x4d\x5a\x8c\x87\x98\xd0\xc9\xaa\xfd\xf0\xbb\xfb\x54\x92\x60\x56\x8d\xba\x1c\x69\x08\x6b\xee\x63\x6b\xe8\xed\xcc\xd3\xcb\xb2\x70\x16\x24\x4d\x54\xd7\xed\x2f\xeb\x7f\xa6\x46\x14\xd4\x54\x49\xd7\xe0\x58\xe7\x1b\x30\x6c\x22\xe6\x91\x1c\x2a\xc7\x42\x07\xba\xe5\xa8\x4d\x0f\xc2\x47\xbe\x49\xd3\x56\xe5\xd4\x35\x3b\xa5\x58\x6b\x6e\x4b\x2b\x97\xce\x9e\x23\x77\xb6\xee\xd9\x2c\x84\x9e\x67\x69\x44\xae\x90\xdc\x42\x08\xe3\x00\xe1\x9c\xc9\x1d\xc2\x6b\xbd\xd5\xa3\x0c\xfa\x92\x81\xa1\x5e\xfd\x87\x30\x66\xf8\x5a\xf3\xa2\x6f\x31\x06\x23\xe0\x09\x80\x48\x53\xcc\x68\x55\x90\x3e\xa6\x4a\x90\x98\x97\xe3\x15\xe7\x3d\x31\x29\x48\x98\x0e\xf6\x28\x9d\xb2\x1a\x5e\xbb\xec\x8c\x8e\xfe\x20\xd1\xd5\x3d\xfa\xad\x6d\x9f\x42\x96\x53\x2e\x88\x7c\x37\x35\x01\x05\xa6\x33\xab\xc7\x73\x18\x87\x51\xb2\x8c\x3a\x08\xf1\xb5\xee\x04\x72\xde\x46\x27\xe6\xb6\x1b\x68\x27\x8d\xd5\x1c\xed\x6a\x61\xec\xf3\x88\x86\xe4\x53\x39\xdc\x6c\x60\xc3\x1e\x85\x0e\xf8\x29\x6a\xe8\x0f\x9d\x31\x70\x17\x76\xeb\x9a\xf2\x16\x93\xf4\xc5\x2e\xc0\x62\x62\x57\x38\xd4\xe3\xaf\xbf\x71\xd1\xc8\x1f\xc4\x84\x63\x60\x36\x3e\xa5\x41\xa9\x76\x62\x3a\x5e\x4e\x6b\x6a\x67\x23\x7e\x92\x37\x17\x3f\x1a\x1d\x54\x33\x02\x85\x88\x85\x71\x4c\x2a\x59\x1d\x0a\x78\x62\x82\xa0\x28\x5a\x37\x11\xf7\xbc\x2b\x63\xca\x79\x87\xe9\xae\x7d\x02\x03\x55\x55\xcf\x3b\x6a\xd6\xf7\x1c\xa9\x8a\xa9\x28\x88\x3b\xf8\x1d\xd6\xf8\x64\x93\xea\xab\x56\x37\xb4\xdd\x56\x9d\x1e\xe8\xde\x6a\x44\xbc\xed\xb6\x2b\x97\x06\xb1\xdb\x89\xe3\xf0\x5d\xf1\x63\x10\x01\x7d\x89\xef\x3e\x4b\xc0\x99\xb7\x21\xa5\xc8\xd3\x80\x43\xd6\xe4\xa2\x2c\xf0\x40\x09\xc0\xfc\xee\x6b\xe6\x99\x37\x82\x99\x54\x94\x1b\x8b\x4a\x1e\xbf\x4d\xae\xa0\xd7\x74\xd0\x78\x2b\xe1\x76\xc8\xe5\x91\x90\x77\x56\xc2\xcf\x75\xde\xa6\xf7\x87\x7d\xd6\x87\x5b\x8f\xe1\x01\x2f\x30\x50\xcf\xb1\x28\x9c\xf0\x88\x66\x7e\x15\x22\xee\xed\xc9\x27\xac\x86\xbf\xe2\xc4\x07\x43\x2b\x4a\x81\x3a\x6a\x7a\x55\x04\xe9\x99\x20\x6d\xb1\x82\x7e\x25\xfa\xfd\x70\xce\xd3\x6d\xb3\xb2\x81\xb6\xf7\xb1\x4e\xd5\xba\xa0\x57\x23\x15\xa9\x39\xc5\xbf\x4a\xbb\x13\x3d\x2e\x7b\x16\xd5\x2d\xe2\x08\x17\xaf\x05\x5d\xf5\xf1\x41\x20\x77\x34\x61\x0a\x0c\x6e\xeb\xed\xaf\xff\xd9\xcc\x9f\x06\x9b\x67\xf9\xa1\xc0\x45\x4b\xe4\x1d\x54\xc1\x38\xbe\x54\x2e\x5e\x38\xcf\xe2\xf2\x93\xf7\xd2\xd3\xdf\x66\x97\x7a\xcb\x36\x6a\x42\xc1\x9b\x31\x85\xac\xfa\x1b\x36\x3c\x61\x31\xa4\xa8\x11\x1c\x3b\x1f\x4f\xd7\xac\x40\x6d\x0e\x69\x10\x3b\xa1\x5b\x8c\x4b\xf2\x9b\xc2\xed\x9c\x45\xcf\xd1\xd2\x79\xd8\xd9\x31\x44\x4b\x2b\x18\x49\x25\x2b\x8a\x70\xee\xd8\x0f\xd2\x60\xed\xf5\xa3\xc0\x1b\x96\x90\x16\x0d\x23\x11\x85\x1d\x21\xc9\x30\x2d\x98\x59\x86\xea\xee\xb3\xae\x2c\x07\xc7\xc7\x67\x20\x94\xf9\x1d\xb0\xbd\x50\xbe\x37\x7e\x4d\x1e\xb0\x7e\xe7\x6a\xf4\x9d\xc1\x36\xa1\x45\xa1\x1b\x17\x2f\x08\x11\xfe\x73\xd6\x25\x9b\xe3\x70\xc4\xdf\xca\xb6\xf1\x9e\x4a\x64\xb1\x51\xd0\xa6\xdb\x80\x50\xc3\xde\x2c\xc3\x25\xf5\xc5\xf6\x59\x4c\xf6\x24\x8e\xb0\x81\x20\x95\x39\xe0\x8c\xa3\x42\x29\x84\xe7\xbf\x80\x3d\xe3\xa4\x19\xb1\x44\x23\xf1\xe5\xa5\x42\x24\x04\x2c\xe4\xf0\x54\x88\xa6\x04\x4f\x40\x42\xbd\x64\x9b\x1a\x08\xce\x10\xc2\x00\x6e\xa7\x6e\xfa\xb4\x64\x1f\xef\x28\x97\xef\xd7\x24\xe6\x05\x4a\x3b\xd1\xa6\x9e\x39\xa4\xa5\xe2\xd5\x02"}, +{{0x6d,0x78,0x55,0xe3,0x0f,0x7a,0x13,0xe2,0x37,0xb0,0x67,0x14,0x43,0x46,0x43,0x4b,0xb4,0xb0,0x51,0x78,0xc7,0xd8,0x8d,0x49,0x2e,0x79,0x02,0x7c,0x4b,0x0f,0x3c,0xdd,},{0x72,0x73,0x29,0x38,0x28,0xef,0xa3,0x49,0x82,0x23,0x92,0xdb,0xba,0xb0,0x78,0x79,0x57,0x7e,0x1a,0x77,0xa6,0xfd,0x6a,0xfe,0x33,0x75,0x3a,0x9e,0xec,0x88,0xc4,0xaf,},{0x0f,0xe2,0x8e,0xad,0xd9,0xe5,0xdd,0x57,0x4b,0x3f,0xaa,0xea,0x81,0x0d,0x44,0x52,0x2c,0x8b,0x1b,0xfb,0xb3,0xe3,0xd5,0x7e,0xd8,0x89,0xfa,0xed,0xec,0x91,0xd0,0xe1,0x4a,0x86,0xb9,0x14,0xc4,0xc7,0x66,0xf1,0xbf,0x9b,0x8f,0x18,0xb0,0xdb,0x89,0x0d,0xb6,0xc1,0xb1,0x25,0xd5,0x78,0x04,0x33,0x36,0x19,0xb1,0xe0,0x72,0x0a,0x33,0x00,},"\xf8\xb9\x36\xe7\x93\xb0\x17\x58\x0c\xc0\xe9\xcb\xda\x2a\xcb\x64\x74\x50\x7f\x4b\xca\x3a\xfc\x87\x83\xec\x46\xee\xb8\x2c\xcd\x4d\xd2\x52\x56\x76\xaa\x6a\xb5\xc0\xdc\xf7\xd7\x5f\x7e\x03\x11\xe6\xfe\x6b\xf2\x72\x63\xf8\x57\x8f\xeb\x55\xc5\x61\x2d\x1f\x28\xe8\x88\xb7\x66\x56\xc4\x1c\xcd\x8a\x70\xb9\xbc\x60\x4b\x42\x72\x4f\xa2\xbc\x41\x1d\x44\xc3\x1a\xb6\x8c\xe8\x4f\x83\x93\x39\x9e\x34\xd5\x40\x85\x79\xc2\xba\x29\x21\xf2\xf8\xd1\x14\x87\xaa\x7e\x52\x55\x7f\xee\xd9\x67\x57\x19\x9d\x3a\xae\x63\x77\x77\x01\x54\xb1\x7f\x35\x77\xc7\xac\x3d\x8c\x76\xcf\x74\x61\xb5\xe8\xd4\x2a\x71\x85\x07\x8e\xd4\xf8\x62\xfc\x57\x50\x2f\x61\x50\x75\x30\x7b\x6e\x10\x3c\x77\xc1\xf6\xc8\xbd\xa7\xaa\x17\xe4\x35\xe2\x1b\x94\x9a\xf4\x4d\xff\x5a\xa3\x0a\x62\xda\x71\x2f\xa9\x96\x6a\x61\x2f\xfc\xa1\x48\x71\xfd\x6f\x86\x0b\x4a\x96\x14\x01\x2c\x53\x69\x91\x0e\x0f\xfd\x6f\x0f\xbd\x88\x9a\x9c\x25\x7c\x32\xbd\xcf\x90\xbb\x80\x62\x7c\xb2\x72\xec\xd4\x59\x98\x97\x55\x59\x55\xe1\xfe\x08\xcd\x7e\xbb\x21\xc0\x71\xbe\x0f\x48\x98\x96\x96\xcb\x39\xaa\x82\xad\x11\xba\xa5\xd4\xac\x61\x3a\xbf\x1b\x6d\xb8\xa2\x0e\x68\x68\x36\x22\x28\x33\xf8\xb6\xdd\x2f\x00\x06\x22\x7b\xe4\x8e\x85\x80\xdc\xc8\xde\x62\x0d\xac\xb2\xf6\x5a\x69\x36\x75\xd6\xcb\x45\xba\x5d\xd1\xaa\x70\xdb\x76\xbc\x64\x1d\x4f\xb5\x67\xec\xbc\x71\x11\x44\x2e\x29\x41\x58\xbe\x57\x5c\x71\xdd\xc2\x6e\x94\xf4\x12\x66\xa2\xfd\x3a\x0d\x43\x57\x81\xfc\x09\x46\x48\xfa\xdf\x5f\x17\xcd\x41\xab\x89\x58\x21\x89\x4e\xc0\x80\x6b\x26\x2c\x39\x35\x34\xfe\x66\xf2\x1e\x37\x83\xc1\x4a\x96\xc8\x8f\x2e\x06\x53\xfe\x32\xe7\x5d\xce\x8a\x46\x3b\xb9\x7e\xed\x6c\x16\xf3\xf3\x22\x81\x69\xab\xb5\xb4\xbf\x9e\xa3\x27\x8c\x1f\xf0\xf8\x6e\xae\x71\x38\x9b\x64\x33\xac\xd0\x97\xee\xfa\x9e\x6e\x05\xf4\x95\x5c\xd5\x17\x83\x0b\x8d\x98\x70\xcc\xb5\x22\x74\x15\xe5\x0f\x23\xf6\x47\x32\x17\xa7\x45\x09\x64\x70\xdc\xa9\x3d\x2b\x34\x67\x3c\x5d\x6a\x57\xed\x02\xc8\xe0\xca\xe1\x19\xb3\xf3\x29\xd8\xab\x64\x98\x49\x4c\x29\x21\xbb\x6f\x49\x6d\xd0\x83\x81\xe7\xd3\x9f\x2d\xb5\x76\x3b\x14\xa2\x82\x1b\xef\xcc\xa0\xa9\xfd\x31\x25\x45\xde\x68\xab\xf2\x06\xd1\x2d\x8e\x02\xe7\x3b\xc7\xe3\xcb\x79\x6e\x7e\xe2\x6c\xc6\x3d\x74\x1e\xfa\xfc\x53\x45\xf8\x13\x29\x51\xbc\xfb\xfd\xdf\x63\x1f\xb7\xcb\x43\xef\x35\xb9\x45\x3c\x93\x90\xeb\x23\xb1\xf9\xd8\xb1\xc7\x2d\xeb\xd2\x4f\x09\xa0\x1a\x9d\xc6\x0e\xe6\x81\x53\x06\x18\x83\x57\x78\x1a\xf6\xe1\x82\x0a\xa3\x5e\x4e\xc1\x21\xb7\xca\x34\xd7\xde\x76\x11\xb2\x46\xa3\xe7\x03\xed\x48\xc7\xeb\x03\xa6\xfe\x8f\x85\x2e\xe7\xd3\x25\x45\xc9\xd8\x52\xd6\x4d\x5d\x75\x93\x0e\x5f\x1e\xbe\x21\xa3\x07\xef\xa7\x62\x2e\xda\xce\xd6\xd8\x79\x02\x6f\x0f\x85\xa9\x11\x20\x12\x80\x37\x05\x58\x22\x69\xd3\x9f\x14\x32\x34\xdf\x89\x09\xab\x3d\x94\x8e\x76\xd3\xda\xaa\x24\x22\x6d\x9a\xc6\x01\xee\xf2\x77\xfd\x2c\xfc\x4a\x19\xae\xdf\x43\x87\xa2\x16\x17\xb0\x3e\xc3\xd3\x84\x5a\x38\x55\x4f\x5e\x97\x03\x6e\x56\xec\x1c\xe6\x60\xdf\x9c\x06\x2c\x2c\x99\x3b\x77\xc5\xba\x6a\x6d\x05\x23\x1d\xae\x37\x64\x18\x3c\x3e\x96\xaa\x53\x9c\xfb\x34\x15\xfb\x16\x3c\x64\x5b\x23\x03\xb2\xd6\xd4\xbd\xa8\xca\x6c\x72\xbc\x03\xd5\x30\x5f\x9b\x11\x8e\x92\x5e\x27\xd2\x9a\xb7\xdc\xb1\x96\x47\x0e\x63\x39\x63\x1b\x23\x80\x74\x4c\x04\xd1\xda\x34\x8f\xc0\xfe\x27\x42\x77\xf8\x2f\x95\xbd\xfb\x0b\x64\xb4\xcf\x3b\x51\xe5\x71\xc0\xdd\xb3\xb5\x3c\xa6"}, +{{0x7e,0xe4,0xe7,0xe9,0x8c,0x6a,0x40,0xf0,0xe7,0x44,0x13,0xf2,0x40,0x39,0xbd,0x22,0x0d,0xf1,0xf8,0xc7,0xf0,0x15,0x52,0x8d,0xbf,0x52,0x84,0xab,0x9f,0x7c,0x82,0xe2,},{0x4d,0x5a,0x80,0x0f,0x9b,0x22,0x07,0x0e,0x01,0x6e,0xe2,0x3a,0xf8,0xa3,0x10,0x90,0x2b,0x36,0x9d,0x58,0x9a,0x84,0x7f,0x34,0x5c,0x2e,0xa2,0x96,0x8d,0x6d,0x09,0x24,},{0xac,0x3b,0xfe,0x3a,0xdf,0x94,0x1c,0x93,0x4d,0x33,0x49,0xc4,0x92,0xde,0x70,0xd5,0x16,0x6b,0xe3,0x89,0xf9,0x55,0xbe,0x87,0xc2,0x88,0x3f,0x41,0xf2,0xda,0x14,0x6c,0x91,0x06,0x51,0xa3,0xb4,0x52,0xc2,0xd7,0x39,0xdc,0x9b,0x53,0x1c,0x57,0x45,0x56,0x5e,0x69,0xd9,0x83,0x59,0xf1,0xd7,0xd9,0x3e,0xbd,0x36,0xd7,0x0a,0xbb,0xf0,0x0d,},"\x8f\xb0\x13\x73\xc4\x2e\x69\x61\x4a\xea\x99\xaf\x49\x32\x37\x85\xf3\x38\x61\xb9\x4e\x90\xf5\x65\x38\x9e\xbf\x70\xe2\x19\xf5\xde\xc7\x32\xe0\x01\x0b\x58\xf7\x29\x05\x30\xdf\x22\x2a\xc9\xc7\x3e\x1c\x2e\x92\xa5\xe6\x06\x1d\xe5\x59\x0c\xaf\x9c\x0d\x50\x21\xd7\x29\xea\xa1\x15\x41\xfa\x1d\x08\x21\x60\xbe\xaf\x61\x1e\x7c\xfd\xc0\xeb\xb3\x15\xd3\x88\xe5\x38\xb4\xb5\x02\x8f\x9b\x30\xd3\xd9\x73\x34\x7f\xfd\x44\x26\x3e\xef\x08\x3b\x81\xb2\x1b\x82\xec\xa5\x75\x6a\x49\x4b\x1d\x81\xc0\x7d\xe8\x49\x50\x6d\x3e\x3b\x66\x87\x97\xa5\xc5\x44\x25\x4d\x4e\xbe\x5c\xf8\x17\x1b\x39\xf8\x72\x4c\xbc\x41\x89\x29\x1b\x3c\x53\xc2\x1e\xce\x49\xa1\xd7\x39\x56\x3c\x65\xb4\x90\x25\x93\x56\x47\xa7\x30\x3a\xe0\xef\x7f\x6d\x24\x55\x46\x45\xa4\x28\xdb\xbb\x42\x44\x9f\x53\x99\xe3\x6d\xc7\x87\xb7\xd6\x95\x8a\x02\xee\xbb\xb8\x36\xe5\xe5\x3e\x26\xe4\x87\x23\x9d\xe9\x4d\x1d\x25\x0e\x79\x43\xac\x0e\x22\xd9\x27\x50\xa0\xcf\x34\x73\xbe\x1a\x62\x25\xcb\xe7\x95\x45\x04\x82\x69\xf6\x23\x7e\xc9\xf9\xec\x30\x7e\x8a\x34\xb7\xbb\x34\xcd\x49\x06\xe4\x31\x62\xa3\x70\x8f\x32\x9c\x5b\x98\x9d\x7a\x7f\xcd\xe1\x09\x9a\x54\x25\x46\xfe\x9c\x33\x18\x2b\xa5\x1b\x84\x3e\x96\xd1\x1c\x79\xe9\x1a\xd2\x1f\x71\x70\xe2\x57\xfd\xc2\x81\x8e\x12\xf9\x16\x8a\x97\x4c\x96\x8a\x4d\x27\x3f\xa3\xff\xa9\xf3\x5f\xf9\x05\x98\x0e\xaa\xd3\x72\x1c\xae\x80\x2b\xee\x36\x21\x0b\x40\xb9\x93\x19\xbb\x66\x99\x82\xe9\x43\xb2\x70\xa4\xc4\xd0\xa9\x2e\xcb\x5b\xba\x2d\xd8\xb4\x0a\xc3\xd2\xf0\x32\x5c\x46\x9d\x5e\x9d\x48\x3f\x52\x41\x97\x40\x10\xc5\xc0\xda\x33\x5f\x16\xe9\x62\x19\x6c\x2e\xf1\x4e\xb2\x4a\xaf\xbb\x31\x1b\xfd\x5f\xa8\xdc\x8d\x2d\x61\xe6\x87\x8a\xd2\xcc\xe0\xdc\x99\x39\xe4\x45\x22\x72\x3d\x42\x7e\xf3\x2f\xb4\x3b\x96\x7f\x5e\x44\xfc\x66\x57\x92\x79\x6f\x8c\xf9\x34\xf0\x1c\x32\x5d\x63\xd5\x83\xdc\x3c\xa9\xd4\xfc\xc7\x57\xd9\x17\x85\x80\xda\xef\x53\xaa\x3a\xb2\x1d\x2c\xe4\x35\x95\x5d\x1c\x6d\x47\x63\x8c\x5e\xdb\x62\xff\x55\x61\x69\x3d\x1c\xbd\x10\xec\x9e\x39\x9a\x71\xbf\x9d\xb1\xc9\x96\x9f\xd5\x9e\x4e\xeb\x31\xaa\x59\xbf\x39\xe9\xf1\x84\x17\x8d\xef\x72\x46\xed\x4b\x8f\x4b\xe5\xba\xda\xa5\xdb\x4a\xf8\x67\xf4\xf2\xec\x39\xa1\x37\x04\x20\x2c\x87\x84\xfa\x16\x8c\xe9\x6f\x9c\xfa\xc7\x10\x17\x23\x62\x75\xfd\x85\x7c\xc3\xc5\x1a\x9c\x7a\xc2\x56\x21\x5e\x14\xb8\x43\xf7\x21\x4d\xc9\xf8\x24\xb9\x1d\x1a\x51\x70\xd0\xef\x1d\x37\x69\x6f\x93\xee\x96\x6a\x2b\x7d\xec\xe2\x2b\x4f\x3a\xfd\x39\xc1\x6d\x60\x1e\x5f\xf8\x40\x8d\x45\xc1\xa6\xce\x71\xf0\x60\x97\x6c\x5b\xe4\xc0\x42\xb1\xb7\x38\xdf\x95\x80\xba\x5a\xe7\x78\x80\xa7\x0c\x0b\x94\xf0\xe1\xc9\xf9\xaa\x34\xc0\x90\xd6\x12\xd5\x7a\x9b\x93\x1f\x50\xa1\x25\xfa\x35\xce\x40\xa2\xcb\x7f\xaa\xd5\x30\xf8\x09\x08\xc7\x3c\xb7\x82\x58\xaf\xd2\x63\x13\x90\x04\x1d\x92\x61\x7e\x9b\xf6\x4c\xe9\x6e\x8e\x4a\xc7\xf3\x12\x6d\x8a\xf8\xa0\x4c\x75\xff\xd4\x38\x76\x9d\xe0\x6f\x74\xc2\xfc\x20\xcc\x81\x92\xda\x35\x3e\x79\x06\x12\x83\xbb\xa0\x8a\x8d\x24\xe6\xe4\xe2\xe8\x3b\xa5\xb0\x8e\x42\x75\x22\x60\x62\x14\x8d\x8a\x02\xaf\xad\x65\xb6\xf6\x27\xcf\xbd\x29\xb7\x1c\xa1\x8a\xee\x5b\x1f\x97\x16\x9b\xf0\x22\x8b\x37\x6f\x41\x06\xb5\x0f\xd9\x1a\x38\xa6\x62\x11\xd6\x9e\xbb\x4a\x7a\xf0\xe1\xc2\x21\x7f\x1b\xa0\x14\xd1\xe0\xcd\x17\x50\x8d\x58\x15\x5d\x16\x3d\xd9\xde\x2f\xe1\xc6\x4c\x7f\x88\xd5\xb5\x53\xe9\xba\x1e\x1f\x25\x43\x0d\x7e\x12\x5b\x07\xa8\xc2\xed"}, +{{0x1f,0x28,0xd9,0x09,0x1d,0x19,0x6c,0xba,0x3d,0x45,0x52,0xe5,0xa3,0x37,0xa4,0xd8,0xaf,0x3f,0x29,0x5e,0x62,0x9e,0x4b,0xa6,0xfe,0x99,0x70,0x31,0x20,0xae,0x41,0xe0,},{0x81,0x4d,0x34,0xbf,0x28,0xee,0x6d,0x90,0xf0,0x39,0x59,0x90,0x41,0xdb,0x81,0x0f,0x7c,0x9d,0xaa,0x91,0x8e,0x03,0xe9,0x61,0x97,0x41,0x4b,0xc9,0xaa,0x31,0xec,0xdc,},{0x5b,0xe5,0x52,0xfa,0x73,0x1e,0x83,0x67,0x93,0xf6,0xdd,0xa8,0x95,0xdc,0x9b,0x1e,0x2c,0xcd,0x66,0x9d,0xe1,0xc8,0x43,0xe0,0x0e,0xa6,0xfa,0x3c,0x5e,0xbf,0x97,0xa3,0x4b,0x26,0xf1,0xf3,0xac,0x7f,0xf2,0x22,0x5e,0xe4,0xa7,0xe4,0x30,0x07,0x2c,0x13,0xda,0x40,0x66,0xdc,0xdc,0xc0,0x5b,0xa2,0xb5,0xf6,0x1a,0x6e,0x8d,0x21,0x07,0x09,},"\xa6\x94\x68\xbc\x33\xeb\xfe\xf0\x61\x5c\x64\x3c\x49\xda\xc6\xe0\x4f\xdb\x6c\xfb\x8e\xc4\x58\x57\xbb\xb7\xa2\x7e\x52\x8f\xd6\x31\xfc\x34\x11\xba\xee\x65\xcc\x1f\x94\xfc\xc9\x4a\xed\x4a\x43\x32\xfa\x68\x61\xe0\x65\xe0\x61\x63\x54\x17\x09\xd7\x97\x28\xe0\x1b\xe2\xb1\x40\xa0\x22\xc8\x3e\x7b\x23\xb9\xed\x2a\xd2\x83\x21\x69\xdf\xc9\x56\x90\x91\x3c\xf3\x72\x01\x30\x65\x70\x80\xc9\xd5\xa7\x82\x7e\x56\x60\x75\x74\x52\xc5\xfc\x3d\xcd\x80\xcc\x6b\xe0\x98\xc6\x29\x22\x6d\x54\x66\xe0\x2b\x97\x12\x6b\xe7\x4a\x14\x52\xee\x16\x81\x50\x95\xde\xb4\x2b\xf0\x65\x66\x71\x50\x28\xc1\x18\x25\x82\x0a\x8a\x23\xc6\x0d\xa2\xb6\x8d\xd9\xa5\x5d\xad\x2a\x29\xa4\x96\x44\x43\x81\x7c\x07\xd7\x76\xb2\x44\xb1\x51\x86\x81\x9a\x3b\xbe\xd4\x14\xab\xf4\x57\x9a\x3e\xce\x3a\x3d\xc7\xb1\x05\xd0\xa9\xdb\xa3\x7b\x9e\xaa\x78\xbe\x8e\x46\xe1\x69\x8b\x59\xb0\x94\x0b\x01\xf3\x8b\x28\x3c\x33\xa9\xa4\xb1\xd4\xf8\x14\x4b\x16\xee\xb5\xfc\x0a\x7a\xf0\xd0\x81\x69\x66\x45\xa1\xea\xb3\xa7\x87\xcb\xcf\x88\xfa\xd9\x3d\xd6\xcd\x46\xd2\x95\xa8\x79\xa1\x77\x50\x33\xa9\x85\x63\x82\x2e\xf1\xf6\xb6\x9a\x58\x1e\x49\x73\x6c\x8d\x70\x1b\x44\x53\x96\x93\x40\x52\x1e\x4a\xd4\xbf\x94\xb9\x11\xb0\xe2\xd8\x6f\x34\xee\xce\x4a\x63\x85\xff\x1f\xe6\x32\x20\xcd\x3c\xc5\x92\xf3\x6d\x6c\x49\x1f\xa1\x8f\x7c\x14\x04\x36\x0d\x2a\x77\x53\xfe\x07\x3e\x09\xa2\xfc\x42\xa4\xbb\xea\x55\xbc\x96\xd7\xf0\x5c\x98\xae\xd2\xcc\x4a\x9f\xae\x8f\xd4\xa0\x19\x7f\xf0\x1f\xa7\xf0\x04\x6e\x3c\x3e\xb5\x9a\xaa\xbc\xa3\x13\xa4\xdd\xaa\x5d\x20\xd2\x7c\x2c\x5f\x1a\xc6\xd8\x7f\xd3\xcb\x4b\xd3\x5a\x1e\xc7\x5d\x10\x4f\x7c\x36\x73\x31\xa3\xe2\x95\xe5\x3c\x4e\x80\xba\xe1\x4b\x97\x92\xd0\xd5\x26\xf7\x40\xd4\xff\x03\x6f\xaf\x54\x87\x96\x7f\xfa\xbe\x8e\x88\x3d\x3f\xb0\xd1\x6f\xaa\xdb\x28\xe1\x28\x5d\xed\x41\x57\x0c\x0b\x07\xc2\x55\x9b\x53\x1e\x0f\x92\x54\xef\x88\xe5\xb1\x0f\x64\xf4\x83\x9a\x9a\x0b\x6c\x3c\x7f\x1b\x78\x50\xf4\xad\x9b\xf0\x99\x9a\x7f\x2a\xe7\xc4\x5a\x65\x8e\xa5\x30\x36\xfc\x70\x19\x98\x42\xb8\xe4\x9e\x60\xf9\x67\xde\x1f\xf3\xab\xff\xf6\xcd\x73\x5b\x7c\xd8\xb8\xf9\xe2\x48\xf1\x56\xf6\xc6\x54\x38\x69\xeb\x99\x82\x3d\xae\xa8\x8d\xeb\xaf\x79\xf0\x1e\x65\x21\xec\x63\xfe\x72\x72\x4e\xe3\xc8\x22\xb8\x8b\x39\x68\xb2\x48\x52\x09\x15\x83\xc4\x9a\xb3\xc1\x5f\xa1\xf7\x9b\x18\xd9\x8f\x04\xd9\xb6\x84\x1c\x9a\x7c\xa0\xde\x2f\xcc\x02\xf9\x5d\xd6\x49\x49\x2e\x8b\x56\xa3\x1e\xc1\xe2\x44\x33\x7a\xf6\xaa\xae\xde\x8b\xf9\x9f\xc8\x14\xef\x57\xc0\xd5\xe0\x8c\x3c\x7e\xcc\x18\x97\x98\x0a\xa1\x69\xa9\x92\x6d\x20\x69\x8d\xf6\x93\x0e\x21\x10\xcb\x46\x0f\x49\x39\x01\x00\x74\x10\x95\xf8\xed\x00\x41\x2a\xe6\x96\xd9\x8e\xfe\xfd\x29\x0d\xa5\xf7\xd0\xb7\x28\xd2\x0a\x1e\xbf\xa6\xbd\x7d\x27\x0f\x28\x1a\x98\xc7\xb1\xe4\x08\x43\x51\x25\xaa\x48\x3c\x6b\x7d\x63\x3f\xf7\x58\x8a\x94\x16\x58\xf6\x12\x95\x44\xd6\x29\x45\xb9\xb8\xaf\x71\xa8\xc6\x2c\x0a\x50\x07\x6c\xb8\x54\x1b\xa7\xe4\xbd\xe4\xed\xe4\x41\x72\x2c\x6e\xb9\xdf\x8c\xfd\x06\x56\x33\x9e\x86\xd2\x26\xab\xae\xa0\x5e\xa0\x47\xf6\xb8\x30\x77\x01\xf6\xc9\xa4\x4c\xc9\xcb\x83\x7b\x8e\xb6\x24\x45\x92\x5e\x8a\x88\x81\xd2\x53\x8f\xcb\x2b\x24\x9e\x4e\xe8\xb6\x86\xec\xfb\x49\xc4\xdf\x86\x40\x1d\x24\x9a\xac\x35\x84\x1e\x91\x40\x04\xf9\x45\x5d\x3f\xde\x37\x5d\x20\xa0\x1f\xba\x27\xb1\x97\xa6\x98\xd3\x84\xc7\x65\x05\x10\x68\x01\x62\x7e\x83\x36\xbd\x2d\x76\xd7\x61\xa8"}, +{{0xc6,0x4d,0xd2,0x0d,0x42,0x62,0x75,0x26,0x19,0x8a,0x22,0x64,0x76,0x90,0xc8,0x95,0xb5,0xb4,0x5b,0x69,0x8f,0x57,0xa6,0x9d,0xfb,0xe4,0x8d,0xbd,0x42,0x6a,0xa4,0x70,},{0x2e,0x01,0xd4,0x04,0x16,0xf7,0x8a,0xcd,0xdb,0x34,0xb8,0x44,0x5e,0xa4,0xfd,0x0a,0xb3,0xfa,0x9e,0x66,0x43,0x04,0x47,0x52,0x21,0x3f,0x07,0xc7,0xf0,0xff,0x43,0xa0,},{0xde,0xac,0xc8,0xc2,0x32,0x18,0x72,0x76,0x76,0xd5,0x40,0xa2,0x3b,0xda,0xd7,0x81,0x02,0x11,0xe6,0xd5,0x7a,0xd2,0x94,0xc3,0x7d,0x4b,0x1c,0x9a,0xf6,0xb3,0x37,0xa5,0x3f,0x78,0x80,0xd2,0xba,0xfa,0x73,0xb3,0x05,0x08,0xc0,0x08,0x42,0x6b,0xf8,0xd7,0xc9,0x65,0xa1,0xf4,0xa4,0x22,0xa1,0xbc,0x7d,0x6a,0xd6,0x22,0x6f,0xd1,0x97,0x06,},"\x82\x1b\x9f\x7c\x16\x10\x4b\x53\x3b\xd1\x27\x18\x4f\xd7\x2a\xde\x09\x2b\x13\xbb\xd9\xac\xee\xd2\x9b\x8d\x10\xf1\x66\x88\x92\x2d\x16\x5f\x89\x31\xd5\x3d\xf5\x90\xfb\x71\x3b\x67\x4d\x80\x5c\xe0\xc9\xd6\xce\x6c\x43\xba\x69\x68\x19\x1d\x12\xbf\xa0\x8a\x8c\xe2\x2e\x8f\x33\x6b\x2b\x49\x1a\xf2\x5d\x1b\x16\x06\xf9\x30\xca\xeb\xe5\x22\x39\x2a\x87\xd4\x2c\xe7\xbc\x16\x7a\xa7\xb6\x10\x59\x72\x20\xaf\x31\xa6\x65\x35\x30\x71\xe8\xd9\xe5\xf4\x20\x78\xb9\xc3\x88\xbf\x04\x02\x58\xe2\x1f\x9c\x3a\xb3\x8c\x04\x27\x61\x8b\x2c\x28\xd3\x43\x0d\xf2\x79\x21\xbf\xc5\x84\x87\xb3\x46\x19\x78\xbf\xa8\xbf\x58\x6c\xfe\x83\x58\xe0\x92\xf8\xf4\x74\x66\xe7\x62\x45\x1d\x50\x16\x4a\x0d\x74\x36\x0f\x66\xb4\xcd\x3a\x35\x75\xda\x01\xda\x23\x75\x24\x30\xc0\x35\xda\x85\x9f\x57\x7d\xe2\x22\x90\xaa\xb4\xed\x7f\x34\xd2\x67\x40\x6a\xb5\x47\xeb\x44\x5c\xc6\x4d\xf5\x30\x19\x42\x7f\x4e\xb7\x2b\xca\x55\x39\x71\x53\xd0\x1c\xcf\x7e\xc9\x7d\x7a\x96\x7d\x9a\xff\x46\x23\x1d\x2e\x20\x27\xb3\x8f\x3b\x41\xbd\x2c\xb1\xb7\x98\xa4\xae\x88\xab\xf4\x89\x62\x16\xd3\x15\xbd\x53\x83\x02\x42\x59\xe5\x97\x42\x80\x2a\x91\x1b\xad\xcf\x84\x73\xdb\x91\xaf\x31\x97\x33\x32\x0c\xb9\x52\x1e\xf9\xce\x43\x72\x67\xb6\xea\x17\xbc\xaf\xe5\xd0\x90\x3b\x12\x3a\x35\xc9\x88\xf4\x98\x34\xf6\x1d\xd5\x52\x64\x0a\x32\x76\xda\x26\xaf\x17\xec\x21\xa2\x02\x96\x58\x6d\xd6\xf4\xb3\x6c\x7a\x4f\x0b\x89\x9d\x70\xb4\x2a\xf8\x9e\x29\x37\x01\x32\xed\xfb\x72\xd6\x83\x41\x94\xa1\x60\x93\x60\xb1\xf1\xfe\xab\x89\xb9\x6b\x8e\x8f\x0f\x68\x98\x7c\x57\xcc\xe0\xba\xb7\x68\x11\x37\x18\xfb\x17\x09\xde\x2d\xf3\x21\x77\xd4\x40\x85\xda\x5e\xfd\x9d\xa7\x0e\x1a\x85\x8c\x92\xf2\x45\xac\xfe\xe6\x4b\x71\xf3\xeb\x16\xe0\x4f\xc1\x39\x89\xe6\x93\x37\x99\x97\x01\xdd\x73\xab\xc2\x66\xc9\xfd\x4c\xff\x91\xa0\xfd\x04\xfb\xd8\xb1\x3b\x12\xe6\xf4\x50\x38\x57\x15\x84\x8e\x00\x7f\xa0\xd4\x63\x11\x9f\xd7\xde\x63\x25\xb6\x40\x04\x2b\x65\x42\x12\xe0\xdb\x8d\xa1\xad\xeb\xd2\xa7\x58\x9f\x77\xee\x4f\x75\x2d\x28\x2c\xa1\x11\x9c\x43\x1b\x17\xad\x0a\x02\x1e\xf2\xbf\x95\xe5\xac\x47\x04\xe6\x2d\x70\x39\xd0\xe6\x51\xe4\x56\xd6\x0e\x63\xba\xde\x40\x1c\xca\x77\xc9\xa8\x91\x63\x17\x4d\x50\x22\xd7\x45\xab\xdc\x76\xb9\xff\xe2\x54\x41\x55\x23\x5e\x30\x63\xe6\xe4\xae\xec\x44\xed\x5d\x8a\xb4\x08\xd9\x66\xfe\xc1\x20\x16\xc1\x30\x73\x0b\xbc\x55\x87\x32\x06\x5d\xa8\x00\xa7\x0c\xbf\xb0\xfc\xcc\xa4\x5d\x00\x28\xcb\xfd\x96\x32\xdd\xb2\xf0\xed\x12\xed\xae\x7b\x93\x0b\x10\x6c\x9d\x12\x85\xa4\xb8\x70\xde\x75\x07\x99\x9c\x74\x79\x3d\xd4\x97\x40\x87\x19\xc8\x98\xab\xe4\x9f\x7f\x33\xa3\x3e\x69\xb5\x0f\xa5\xaf\x94\x80\x06\x85\x66\xd1\xfd\xdf\x44\x82\xd7\x97\x04\xad\x8e\xf1\x1b\x88\xb4\x2c\xc6\x9f\xce\x8a\x55\x7b\x5b\xa5\x10\xe7\x08\xb9\x37\x51\x23\x03\x85\x68\x27\x0d\xe4\x07\x23\x2e\x95\x62\x1e\x2d\x04\x57\x0b\xec\x2c\x41\xec\xcf\xd8\x55\xb2\x1f\x0c\x9b\xba\xa2\x3b\x5c\x58\x15\xfc\x88\x8f\x7f\xbe\xd4\x82\xc3\x20\xff\xa1\xe0\x63\xe8\x7b\x55\xbc\x8f\x7e\xee\xa3\x74\x06\x3a\x9b\xe6\x5f\x7e\xd9\x22\x5b\xf6\xca\x34\xcf\xa3\x11\xb7\x9f\x3a\x25\x8c\x25\x2e\x63\x45\xed\x6a\xc8\x47\x48\xf4\x68\x07\xa5\x5d\x4b\xa4\x12\x66\x16\x9c\xd2\x62\xd4\xf7\x22\x79\xef\x0c\xaa\x77\xff\x44\x93\x35\x32\xbd\x13\x74\x75\x6c\x23\xec\x85\xf5\x5e\xfe\x9f\xc2\x33\x1f\x26\xf8\x81\x62\x9f\x80\xc2\x69\x2f\x7f\x53\xe4\xbc\x6f\x22\xef\xb4\x54\x57\xa2\x23\xf0\xd1\xc4"}, +{{0x0f,0x8e,0x9f,0x35,0x26,0xb4,0xfa,0xea,0x92,0x76,0xf2,0x2a,0x17,0x79,0xe6,0xf8,0x27,0x09,0x80,0x8f,0x6d,0x0c,0x61,0x2a,0xdf,0xe3,0x2a,0x6e,0x8a,0x06,0x10,0x05,},{0xd4,0x8c,0x3f,0x0f,0xde,0xf3,0x82,0xd1,0xd8,0x03,0x13,0xe8,0x46,0xfc,0xa9,0x5e,0x41,0x81,0x76,0xbb,0x5d,0xfa,0x9d,0x39,0x8c,0x1d,0x21,0x24,0x77,0x6f,0x69,0x0a,},{0x2f,0x59,0xa2,0x93,0x60,0x73,0x91,0x38,0x34,0xeb,0x15,0xa0,0xe0,0xbc,0xb9,0xaa,0x80,0x40,0x89,0x46,0x8f,0x24,0xdd,0x1b,0x2d,0x37,0xa1,0x93,0x4a,0xe9,0xba,0x10,0x20,0xff,0x64,0xb7,0x2e,0xec,0x03,0x26,0x8d,0x0a,0x7c,0x01,0x2c,0x4e,0x79,0x63,0x00,0xf6,0xdf,0x7a,0xdd,0xa0,0x1c,0x8b,0xc5,0xe9,0x01,0x5c,0xcd,0xee,0x1a,0x00,},"\x0c\xcd\x37\xc4\xcf\xd8\xe7\x0c\xa3\xbb\x39\x46\xd0\x9d\x70\xd0\xf6\xa4\xb8\x1d\x6d\xfb\x07\x9d\x78\x73\x74\x80\x71\x58\x98\x80\x92\x73\x82\xf7\x43\x6a\x6e\xf8\xf5\x1c\x25\x54\x73\xdd\x01\xfe\xb5\x2c\x8e\xdb\xe4\xd3\x25\x57\x13\xe6\x8d\x64\x0f\x3d\xcf\x15\x8f\x2b\xfb\x9f\xbe\xcf\x71\xf0\x71\x9d\xfe\x8c\xe6\xb6\x01\x28\x1b\xa6\xc2\x0a\x56\xb4\xf8\xe7\xca\xa4\xaa\x9f\x86\x8f\xbf\xc5\xe4\x32\x1c\x22\xd6\x5f\x03\x82\xc4\x89\x6b\xf9\xbe\xbe\x35\x46\x94\x9e\x81\x85\xa4\xd8\x17\xe4\x5b\x5d\x12\x93\x95\x38\x21\xbd\xd9\x8e\xc2\x59\xf6\x4a\x3d\xe5\x38\x65\xb1\x49\xea\x01\xc8\xf6\x83\xec\xda\x61\xda\x5d\xc1\x0e\x7e\xbd\xdd\xfe\x74\x84\xf5\xeb\x10\x31\xb7\x91\x65\x87\xca\xa3\x99\xa0\x6b\x6f\xea\x4c\x5e\x6e\x0b\xe6\x50\xfb\xdf\x06\xc1\x03\x6d\xf2\xcc\x35\xf6\x2e\xa0\xea\x71\x3f\x52\x80\x9d\x77\xf4\x7c\x2e\x55\xc9\x23\x92\x48\x16\x80\xb6\x33\x20\x56\x22\x69\x13\xb0\xce\x88\xa6\xc5\x5a\x26\xbd\xb5\xb8\xba\xb3\xcf\x46\x95\xa8\xc5\x22\x30\x2c\x4e\xba\x37\xd3\x1f\xf7\x7e\x58\x30\x1b\xcc\xfc\x7c\x7b\xe8\x58\x0c\x63\x42\x68\x79\x95\xf4\x4a\xcd\x19\x09\x65\xae\x0d\x7b\xf0\x66\x95\x92\xb6\xad\x88\x74\x3e\xbb\x36\x0c\x73\xe0\x48\x4a\x23\xd2\xf9\xe9\x9e\x9e\xb0\x38\xdc\xbd\x87\xca\x9b\x1a\x49\x8f\x1b\x2d\x35\xfe\xdd\x7f\x8e\x1f\x7f\xd8\xca\x52\x64\x86\x91\x1e\x07\x6a\xea\xb4\x87\x7b\xba\xcf\x37\x8a\x28\x55\xf9\xc5\xac\x03\x91\x30\xdc\x69\x0e\x17\x7d\x67\xb2\x44\xcc\x8a\xd0\x32\x37\x9e\xf7\x1f\xe0\x5e\x9c\x86\x13\xd8\xf5\xd6\xea\x3d\x4e\x3e\x47\x22\x20\x29\xcc\x00\x42\x53\xbe\x47\xf8\x7f\xb5\xe3\x31\x4c\x48\x98\x13\x4b\x87\xac\xf1\x0b\x25\x38\xba\xd8\x97\xbd\xc5\x01\x2d\x8f\x97\x62\xc8\x71\xb6\x53\xd4\x00\xfe\xe0\xce\xed\x5e\xf6\xbd\xd1\x6f\xaf\x3f\x0a\xbd\xbd\x72\xcd\x0a\x12\x94\x05\x46\xf0\x99\x5f\xf1\x4b\x0f\x1b\xd5\x48\x56\xff\x74\xc3\x6e\xb4\xf2\x2d\x72\x87\xae\xfd\xc6\x09\x99\x8c\x1f\x41\xbc\xc3\xbb\x3a\x5f\xa4\x92\x34\xf4\xfa\x8e\x92\x9c\xd0\xf5\x54\xb3\x15\x39\x5d\xae\x87\x3c\x61\xca\x70\xe0\x41\x0c\x2f\xd5\xa1\x15\xd2\xa6\xff\x1f\x1c\x94\xb2\x7b\xa4\x50\xb8\x19\x4b\x21\xf0\x95\xc6\x1a\x5f\x21\x5e\x3c\x84\xf5\xd4\x3f\x0e\x73\x62\x86\xd3\x3b\x8c\x47\x81\x4d\xb9\x79\xf9\xdc\x00\x91\x98\x46\xbe\xe6\x85\x33\x7d\x99\x55\x5a\x24\x47\x2e\x6b\x00\xb3\xf4\xa1\x43\x11\xa6\xc7\xc9\x04\xba\x58\x89\xda\x6c\x1d\xdc\xc1\x11\x75\x80\xf5\xfb\xc4\x1f\x2b\x8a\x42\x68\xcf\x0e\x9f\xa5\xbf\x41\x25\x34\xc9\xe4\x05\x2a\xac\xb5\x04\xcb\x86\xe2\x14\x7a\xb8\x02\x3d\x58\x80\x0b\x76\x3f\x9a\xbf\x9d\x04\x40\x78\x8a\x51\xdf\xe5\xcb\xd4\x42\x30\xba\x52\x28\xf1\xf5\x96\x0e\xa3\xa4\xe4\x04\x4d\x36\xda\xf8\x11\xcb\xdb\xec\x5d\x69\x64\x63\xd8\xe9\x41\xf2\x72\x17\x56\x3b\xb4\x4a\x21\x18\xa4\xf5\xac\xd6\xe7\x94\xde\x17\xe0\x28\xcb\xde\xef\xde\xf2\xcb\xf0\x3d\xd3\x2e\x78\x99\xe6\x5a\x1c\xf8\x39\xf5\xd9\x0e\x1f\x8c\x36\x4b\x57\x7f\xe3\x10\x53\x53\xf6\x67\x68\xdb\xf7\xaf\x0c\x52\x1a\xa8\xa4\x9f\x7a\x22\x08\x2d\x88\xf9\x01\x49\x8c\x90\xb9\xd7\x77\x7e\xd2\xf9\xf0\xe8\xa5\x52\xd8\xa1\xfa\x5e\x96\x32\xed\x85\x32\x58\xc9\xc2\x15\xb6\xdb\xb4\x11\x1d\xcf\xca\x55\x4b\xfb\xc9\xbb\xa2\x2f\x88\xbc\x55\x55\x2c\x6d\x86\x25\x56\xd7\x41\xda\xd5\x9f\x21\x5e\x37\x28\x83\x46\xca\x7d\x7f\xd8\xc6\x5a\x38\x0d\x72\x0c\xaf\xf9\xef\xa1\x49\xf3\xfd\xa2\x32\xda\xa5\xb1\x2e\xf1\x1c\x0a\xf0\x86\x2b\xd0\x22\x9e\x07\x5a\x3c\x6b\x60\xef\x0b\xbb\x3d\xad\x7f\x29\x08"}, +{{0xfe,0x7c,0xdc,0x79,0x66,0xd0,0xff,0xb9,0xc7,0x6f,0x4a,0x18,0xe7,0xf0,0xbf,0x90,0x69,0x0e,0xb7,0x6d,0xc3,0xd3,0xd5,0x08,0x84,0x64,0x8e,0x2e,0x39,0x37,0xd0,0x20,},{0xa1,0x2e,0xe9,0x81,0x2d,0x6a,0xf6,0xaa,0x48,0x79,0xfa,0x72,0xbc,0x0a,0x69,0x80,0x4e,0xa1,0xa8,0x5f,0x9b,0xc4,0xa2,0x6a,0x5b,0xa7,0xcf,0xbb,0x91,0x4d,0x0d,0xd9,},{0xb5,0x2d,0x03,0xfd,0xeb,0xcd,0x42,0x97,0x37,0xef,0x70,0x92,0x06,0x87,0x21,0x1f,0xbb,0x4c,0x04,0xf8,0x1e,0x35,0x5c,0xec,0x70,0x72,0xc5,0x05,0x41,0x75,0xd2,0xed,0x77,0xf3,0x8f,0x46,0x6f,0x00,0x14,0x22,0xda,0x8f,0xcd,0xf0,0x67,0xdb,0x14,0x51,0x00,0x7c,0xab,0x60,0x7f,0x04,0x9c,0x2e,0x26,0x07,0xb5,0x7d,0x44,0x71,0x3c,0x04,},"\xdc\xb9\x1c\xf1\x55\x46\x1a\x60\xdf\x07\xee\xc2\x9d\x98\x61\x6e\xd1\x72\x8b\x34\xef\xa9\xe1\xf7\x44\x5a\x91\x58\xa8\xf8\x8d\x7f\xaa\xae\x0e\x24\x72\x5a\xef\xf2\x63\xc3\xf7\x4f\x0c\x68\x4f\x18\x58\xf0\x5b\x69\x95\xd2\x84\x6b\x6a\x83\x2f\x67\x08\x5a\x42\x76\xd8\x66\x1a\xeb\xd3\xbf\xcc\x73\x18\x1f\x1f\x51\x02\x93\xb6\xde\x5e\x4b\xb2\x3f\xf2\xdc\xa1\xdf\x60\x8c\xb1\x4a\xe5\x22\xac\x4b\x51\xe1\xf9\xb9\x73\xab\x8b\xaf\xcd\x53\x4e\x71\xc5\x71\x81\xb1\x18\x96\xee\x10\x61\xfb\x36\x9c\xa4\xd2\x93\x9d\x1e\x57\x06\x0d\x9f\x4d\xb0\xa5\xc0\xb0\x7d\x52\x68\x7f\x15\x78\x17\xe6\x3e\x2f\xe7\xeb\xcc\x3e\x7c\x95\xef\xe0\x5b\x85\x99\x10\xc9\x5e\xed\xe8\x6d\x14\x39\x9e\x61\x62\x48\xa2\x8c\x24\xc4\x14\xdb\xb6\x93\xaf\x9b\xe4\x35\xa3\xa9\xcd\xc3\x3e\x0e\x2a\x58\x69\x18\xd9\x1b\x8a\x85\xce\xdd\x16\x12\xd7\xc1\xa2\x17\x92\xbd\xd4\x3a\x91\x5b\x15\x7e\x04\xbb\x3a\x44\xec\xbe\x23\xfa\x49\xcc\x55\xda\xab\xbe\xaa\x15\x5a\x73\x7f\x76\x5b\x8d\xdb\x0f\x3b\x15\xd4\xec\xf2\xce\xf7\x05\x4c\xa7\x3e\xc8\x7d\x91\x75\x2c\x2e\x99\x19\x5c\xdb\x19\x58\x84\x4f\x14\x4e\xda\xb8\x2a\x97\x54\x9f\xc9\xce\xc0\x8e\x87\x11\xcf\xf8\x63\xb6\x3f\xc2\x31\xa7\x7f\x76\x2e\x5c\xd9\xda\x9d\x59\x40\x92\x52\xe9\x9a\xb0\x4c\x42\xbc\x57\x09\x7e\x46\x4e\x3c\x6a\x48\xd8\x02\x41\xe6\x32\x5e\x3e\x40\x94\x98\x9b\x34\xc0\xe8\xb3\x2b\x1a\x78\x29\xd5\x4d\xf3\x2a\x05\x0e\xe8\x7d\x8f\x7c\x4f\xe3\xe4\xf4\xf7\x04\x9d\x1f\xee\xcd\xbe\xa6\x71\x08\x35\x0d\xb4\xe8\xed\xbe\x3c\x3f\xf8\xab\x2a\x25\xd1\x47\xb1\xc1\xc5\x82\x1b\x0f\x8c\x21\x04\x2d\x65\x5d\xb8\x31\x69\x1f\x59\x98\x3f\x27\xd2\xed\x1d\x49\x06\xc5\x44\xe2\x4e\x79\xbe\x68\x65\x3c\x9b\x22\x9a\x7f\xb6\x1e\xf5\x45\xba\xb1\x6e\x98\x81\xcb\x4d\x92\x65\xe2\x93\x59\x0a\x0b\xc2\xdc\x86\xba\xd2\x30\x07\xff\x40\xc9\x58\x61\x92\x3b\x49\x82\x41\xc1\x0d\x26\xbf\x48\x48\xf6\x2b\xa7\x38\x3f\x64\x9d\xc3\x8a\xf1\x84\x0d\x0d\xe9\x28\xa9\xbf\xee\x5e\x11\xb5\x14\x34\x16\x3a\x7a\xb1\xed\x53\x74\x15\xf1\xe9\x32\x85\xe3\x69\x92\x05\x72\x01\x58\xf9\x55\x7d\x86\x41\xed\x2b\xf4\x85\xb8\x21\x2c\x8f\x82\x66\x8b\xac\x3c\x22\x8e\x69\x24\xc1\x7d\x0d\x98\xf2\xe6\xd9\x23\x43\x71\xc4\x42\x5e\xb7\x58\x68\x9f\xdb\x0d\xc1\xce\xa1\x39\x4a\x28\x62\xe8\x7b\xb3\x8e\x62\x4c\x34\x79\x91\x68\x61\x32\x78\x22\x5f\xb5\xe1\x9c\x92\x47\xad\xa3\x55\x54\xf2\xc4\xad\xdb\xb6\x1d\x5a\x50\x2a\x70\x81\x27\xd6\xef\xbc\xa8\xf7\x35\x09\x0b\xdf\xdd\x88\xdb\x29\xfb\xd1\x4b\x69\xab\x12\x62\xf0\xc3\xe2\x6d\x26\x3a\x59\xc5\xae\x46\x39\x06\x53\x83\xd5\x25\x0b\x54\xcf\x59\x2b\xb7\xad\xfe\xaa\xe0\xd2\xfe\x81\x6b\x63\x81\xe8\x6e\xa2\xd1\xc7\x18\x13\xcb\xc3\xd8\xfe\x2d\x31\xde\x7b\x30\xfb\x6e\xc2\x29\x4f\xe4\x53\x6a\x36\xc6\xa1\x83\x5a\x71\x62\xab\x4b\xf8\x9d\x19\x46\x61\x19\x65\x7b\x0e\x46\x45\xae\xf5\x03\x50\x5b\x4d\x55\xdf\x97\x7b\xd2\xc9\x0c\x64\x40\x6f\x49\x70\xd5\xcf\xf2\x45\xb8\x35\x32\x2a\x6f\xbe\x23\x4e\x5e\xfb\xb5\xea\x45\xe8\xf0\xd3\x97\x3b\xe4\xaa\xa2\xaa\xda\xab\x07\x7d\x6c\x9b\x25\xbd\x44\x94\x40\x9e\x93\x47\x9d\x2d\x15\x07\xf6\x6b\xc8\xbe\xf8\x29\x99\xa1\x3c\x79\x43\xb4\x72\xb9\xe6\x1e\xc2\x9d\xeb\xef\xbf\x22\x41\x42\x3e\x0f\xaa\x42\xc1\xa3\x38\xa7\xa6\x13\x1d\xed\x93\x5b\xa0\x3a\x28\x66\x2e\x68\x59\x33\x68\xdd\xe5\x4b\x46\x2f\x2a\x5f\xb7\x46\x18\x5f\xf5\x50\x3e\x69\xba\x36\xbf\x16\xf7\x14\x58\xcd\xd0\x57\xe5\xc1\x72\x67\xf6\x74\x98\xd6\x52\x86\x0b\x46\x5e"}, +{{0xf6,0xc9,0xab,0x5e,0xa7,0x5f,0x29,0x4e,0x8e,0x0c,0x07,0xc4,0xc0,0x9e,0xd8,0xee,0xa3,0x11,0x3b,0xdf,0xc2,0xef,0x75,0x9e,0x20,0xa2,0x64,0x57,0x16,0x04,0x10,0x8d,},{0xb1,0x2f,0xf5,0x5b,0xd3,0xec,0x42,0x61,0x0e,0xac,0xea,0x28,0xb3,0x13,0xa1,0x6e,0x19,0xc9,0xe8,0xb4,0x7c,0x2b,0x15,0x17,0x09,0x91,0xbe,0x08,0x8d,0x65,0xcf,0x63,},{0xa7,0xf9,0xd0,0x8b,0xa1,0x41,0x83,0xef,0x24,0x7f,0x2c,0x25,0xfe,0xcc,0x2b,0x83,0xed,0xa6,0xde,0x58,0x02,0x2e,0x46,0x6c,0xe7,0x8f,0xcf,0x50,0xf7,0x1c,0xe2,0x61,0x62,0x44,0x65,0x62,0xee,0xa4,0x5d,0x63,0xa2,0x1c,0x3b,0x22,0x56,0x1f,0xd4,0x68,0x00,0x58,0xac,0xb8,0x25,0x40,0x7a,0x15,0x40,0x8f,0x27,0x13,0x61,0xa1,0x46,0x0f,},"\x71\x62\x3b\x39\x74\x3e\x39\xc7\xe0\x86\x38\x80\x6d\x46\x8a\x1a\x8a\x6f\x35\xc2\xae\x38\x8e\xef\xc2\x73\x74\xbb\x52\x53\x88\x14\xc4\xb3\x6c\x9b\x8e\x38\x9a\xd8\x31\x83\xde\x02\xa1\xbb\xd0\x32\x57\x34\xe4\x61\x87\x54\x09\x23\x37\xd3\xe7\xdc\x12\x56\x92\x8e\x35\x28\x87\x0c\xa7\xf0\x06\x13\xa2\x5b\x71\xbb\x15\xd1\xd9\xea\xaf\xf9\xf2\x26\x9b\x71\xc1\x97\x69\xe0\x03\xce\x84\x56\x14\xb2\xec\x95\xed\x28\xca\x85\x5b\x52\x21\xd4\xcb\x80\xa6\xca\x94\x66\xaa\x33\xe2\x51\x0d\xdf\xf7\xdc\xe1\x86\x15\x9d\xa7\x0f\xc8\xb1\xfb\xac\x12\xa2\x6e\x1f\xc0\x94\x22\x76\x89\x2a\xd6\xe9\xb0\x03\xf5\x69\x59\xbd\x31\x3a\xf2\x89\xe7\xa0\x53\x2a\x66\x4b\x76\xb9\x6b\x91\x98\x54\xe0\x65\x0c\xb8\xc5\x2e\xc4\xc5\xfb\x50\x53\xaf\x2f\x0c\xf8\xc0\xf2\x2a\x52\x3f\x9e\x2c\x64\x19\xdf\x8d\x0b\x71\x4e\xe3\x77\x68\x00\xeb\xfa\x70\x77\x60\x84\x66\x7d\x6d\xcf\x54\x1f\x14\xcf\x16\x62\x62\xe0\xf6\x4c\x42\x76\xae\x28\x88\x5e\x6c\xfd\x09\x7b\x70\xc0\xd6\x18\x6e\xa5\xdb\xd0\x33\x32\x3c\x98\x76\x13\xda\x08\x64\x5d\xe0\x72\x08\xba\xe1\x2a\x17\x8d\x8f\x7f\x65\x0a\x25\xaf\xbd\x70\x1c\x85\xa1\xba\x63\x9e\xf9\xf1\x21\xc4\x0c\x5c\x12\x9a\x47\x37\x34\x33\x86\xa4\x81\x83\xff\x3c\x59\x13\x89\xd8\x9e\xcd\xa5\x26\xcf\xfb\x26\x74\xf1\x7b\xb1\xc2\x30\x90\x55\x4b\x13\x40\x84\x97\x96\xa6\xd4\x44\x46\x0b\xb4\x19\x42\x7e\x93\xe6\x58\x5b\x0f\x4f\x06\x5a\xd8\x7e\xe6\xed\xf5\x4b\xe6\x18\x8a\x1d\xd5\xac\xe1\x36\x4d\xef\xa5\x61\xf7\x4e\x26\x76\x9c\x9b\x29\x1e\xe7\x55\x52\x76\x50\x1c\x6a\x49\x08\x0d\xa0\x92\x4f\x37\x92\xc2\xa7\x28\xa5\x20\x07\xb1\xc0\x7c\x95\x57\x8f\xed\xaf\x40\x39\x96\x23\x9e\x9c\x55\xa9\xa4\x4c\x3d\xfc\xc3\x7c\xdf\x03\xfb\x48\x5d\xb5\xa0\x8d\xff\x15\xa7\xa4\xf7\xb7\xf1\x54\x74\x2e\x84\x31\x56\x4d\xc1\x7d\xbd\x43\x2e\x10\x33\x7c\x22\x76\xfc\xfd\x9d\x70\xf7\xc3\xd5\x70\x39\x3a\x0c\x19\xf6\x40\x51\xc7\x3a\x87\x0e\x20\x55\x84\x10\x65\x31\xd1\xfd\x2a\x1d\xd1\xc9\xd0\xfc\xe1\x4f\xfa\xaa\x07\x7b\xb7\xe2\x60\x25\x1e\xed\x6c\x62\xbc\x6e\xdc\x24\x22\x51\x94\x40\xc2\x24\x4e\xba\x38\x40\x46\xb0\xed\xda\xa6\xcf\x2c\x1c\x7e\xee\xbf\xcd\x78\xfc\xae\x18\xb8\x22\x90\x55\x2b\x59\xc0\x46\x3d\xc4\x50\x61\x8b\xa6\x7c\x77\x0d\xec\x0e\x22\x9b\x84\x60\x93\x6c\xa8\x19\x56\x2b\xcb\x36\x96\x9c\x8f\xf7\x0b\xf1\x13\xc1\x16\x71\xe0\x0b\x94\x13\x55\xbf\x01\xad\x54\xb0\x5c\xfe\x2a\x04\x8b\x38\x72\x8c\xbd\xd1\xb4\x98\x09\xe1\xf2\x07\xac\xa3\x09\x8d\x99\x42\xee\xc4\x7d\x6c\x9d\x41\x3b\x37\xc9\x14\xfe\xdd\x38\xac\xd5\xff\xe4\x96\xca\xc7\x57\xc2\xef\x8b\x77\xbd\x84\x03\xd1\x4b\x1f\xc9\x8a\x90\x3f\xe2\xb9\x79\x46\x82\x33\xa7\xf2\xae\xd6\xf8\xd5\x09\xd8\x74\xe1\xdc\xe0\x51\x49\xaf\x9d\xf3\xfe\x45\x95\xc7\x1e\x8b\xc4\x63\xde\xe9\x38\x4d\x5e\x05\x05\xd2\xa6\xb0\xa2\xb8\xa1\xed\x62\x16\xaa\xae\x9d\xcc\x76\x02\x48\x7a\x4c\x08\x51\xfd\xf0\x96\x29\xc1\xe9\x91\x18\x80\x9a\x95\x44\xa6\x57\x7a\xf9\xf9\x15\xd1\xe6\x5d\x81\x62\x20\xc4\x8c\x84\x90\xfa\x9b\x70\xda\x42\x2a\xd6\x80\x02\x23\xd6\xd8\xc3\x40\xf9\xea\xb2\xcc\x7e\x14\x93\x62\x12\x4a\x30\x0b\x40\xcb\xb8\xc0\xa6\x5d\xa3\x01\xdb\xba\x93\x1b\xa5\x64\xf3\x59\x73\xca\x8b\xf2\xd1\xed\xb5\x6c\x19\x46\x61\x95\x5b\x3b\x68\x38\x1f\xa1\x5d\x4b\x8d\xc6\xad\xa1\xa5\xce\xbd\xa3\xa4\xcc\xc5\x51\x23\xe0\x05\x7f\x4f\x82\x10\x41\x93\x7d\xd5\x49\x20\x9c\x82\xe1\x16\x57\x0b\xc9\x08\xa2\x8e\x32\x99\xa9\x44\x14\x43\x49\x8f\x74\xb3\xcc\x88\xe1\xa6\x2d"}, +{{0x43,0x10,0x3d,0xf0,0x1a,0x48,0xa0,0x3c,0x57,0xf3,0x2f,0x52,0xd7,0x0c,0x68,0x49,0xee,0x44,0x58,0x0b,0x2a,0xb4,0xee,0x72,0xd5,0x48,0xd8,0x48,0x13,0x4f,0x7c,0xeb,},{0xa3,0xcb,0xe0,0xd6,0x4b,0x05,0x60,0xbc,0xb5,0xae,0x00,0x90,0x01,0xe3,0x14,0xd9,0xec,0x90,0x79,0x01,0xdd,0x74,0xa8,0x04,0xa0,0x05,0x90,0x22,0xed,0x9c,0x6d,0x04,},{0x19,0x54,0x47,0xbe,0xb1,0xde,0x4a,0x7e,0x36,0xea,0x89,0xa6,0xce,0x3c,0x99,0xbc,0xc8,0x94,0x11,0xdf,0x5e,0x0b,0x15,0xf7,0xba,0x0b,0x1d,0x11,0x0c,0x45,0x6a,0xbc,0x6b,0x3f,0x5f,0x1d,0xa6,0x10,0x6e,0xd8,0x87,0x86,0x4b,0xa5,0x6a,0xab,0x46,0x6a,0x8a,0x63,0xb3,0x35,0xcf,0xcf,0x4c,0x64,0xd6,0x5c,0x0e,0x6f,0xb4,0x80,0xb4,0x01,},"\x73\x8c\xbf\x06\xd0\x0d\x4d\xcd\x5e\x5f\x24\x3a\x1c\x18\xdd\x5e\xc2\x02\x78\x88\x46\x95\xa1\xcf\x3b\xea\x67\xbb\x5b\x05\xdd\x7e\x60\xa2\xa2\x4f\xd3\x25\xbe\x6b\xf4\x6b\x46\x28\x73\xec\x90\x7f\x9d\xe8\x8d\xc2\xc7\x62\x62\x0b\x7e\x0e\xf7\x27\x65\xd4\xbd\xa6\x62\x45\x49\x93\xc8\x28\xa1\x74\x6e\x9e\xd8\xd1\x9d\xff\x43\xc4\xc4\x85\x27\xac\x84\x5f\x21\x86\xa4\xad\x7c\x1d\x99\x2a\x16\x24\x5c\xd5\x73\x07\x3e\x09\x40\xdc\xee\xd3\x68\x11\x0b\xb5\xfd\x0a\x4c\x88\x34\xce\x88\xa7\x71\x25\xb9\x14\x73\x93\xc8\xb5\x8c\xb1\x6e\x5e\xbd\xc1\x82\x44\xeb\xfa\x48\xba\xba\x46\x97\x3f\xdc\xd4\x85\xb1\xb2\xe5\xf3\xb0\xe7\x09\x92\xcf\x19\x99\x58\x06\x38\xd8\x7f\x1f\x5b\x27\xc4\xd7\xf9\x1d\xec\xf3\x7d\xe2\xe7\x34\xe3\x19\x55\x35\xc6\x31\x08\x2b\x3e\xba\xa8\xce\x30\xa9\xc2\xc2\xdb\x01\x6d\x7d\x35\x47\xe6\x21\x61\x88\x50\xe2\x20\x40\x03\x8d\x0f\xe0\xfa\xea\x2f\x9b\xf5\x10\xb6\x82\xc4\xfd\x14\x75\x0e\x89\xb4\xc1\x99\xef\x0c\x99\x05\x00\x54\x3e\xee\xab\x5f\x0b\x50\x7a\x31\x31\x99\xc2\xa2\xa0\x26\x2d\x6d\x81\x4c\xbc\x09\x33\xc5\x92\xe2\x56\xc3\xe2\x9d\x52\x4b\x06\x6e\xa5\xa4\x54\x33\x61\xa1\x04\x50\xe0\xaa\x67\x5c\x61\x40\x8f\x30\x7f\x26\xee\x58\x96\x9d\x63\x27\x8f\x13\x5b\x7d\xcb\x66\x6b\x93\xf2\xca\xcf\xd8\x38\x73\x47\x1e\x97\x4a\x28\x6b\x09\x02\x3f\x50\x15\xfa\x1a\xaf\x18\xbf\xbf\xa5\xf7\x43\x85\xd0\xdf\x6b\x9a\xdd\x51\x6f\xfc\x0c\x31\x13\xe3\x7e\x09\x78\x38\x64\x6a\xc9\x30\x54\xff\x4d\x96\x02\x06\x67\x44\xba\x33\x96\x95\x3f\xd7\x81\x68\x13\x01\x70\xbb\x27\x5c\x15\x2b\xdd\x36\x6f\x73\x06\x5c\x0a\x7a\xd7\xad\x00\x75\x8c\xb9\x9a\x7a\xc1\xb7\x80\x9d\x26\xdf\xaa\xc7\x58\x46\x82\x01\xee\xb6\x0d\xea\x36\x8c\x33\xf2\x57\xaf\xe2\xf1\xb4\xc0\x2e\x37\xba\xfe\x40\xf5\xd7\xfd\x40\xc8\x7d\x1c\x56\xa0\xcb\x28\xe9\xd2\x83\x69\xa3\x92\x4b\xce\xf8\xb6\xd9\x99\xdc\xf4\x29\x4d\xd8\xc4\x14\x3d\x75\xc6\xc2\x5b\x5a\x45\x44\x48\x8d\xde\x72\x52\x48\xc7\x8d\x93\xc1\x5b\x81\x5b\x01\xcb\xd0\xf3\x1d\x1b\x00\xac\x04\x83\x7e\xf8\x5b\x40\x03\xfc\x96\xd4\x45\x7a\xc5\xa0\x23\x62\x3e\x67\xb6\x6d\xa4\x70\x0a\x08\x59\xf8\x3f\xdc\xcd\x3c\x7a\xae\x09\xde\x09\xa0\x57\xe0\x0d\xb4\x4a\x2a\x6a\xac\xaa\x21\x74\x6a\x49\xb8\x22\x46\x89\xa5\xcc\x18\x54\xba\x3d\xc4\xaa\x2a\xa3\x45\x24\xe7\xa5\xa8\x9d\x11\xee\xa3\x56\xaa\xea\x5e\xf5\xfb\xf5\x42\xc9\x9f\x54\x4d\xb9\x40\xf5\x08\x68\x38\xee\x2a\xb2\x18\xb8\xd3\xf2\xe1\x07\xd0\xb2\x9d\x4b\x04\x83\x0e\xed\x79\xc0\x76\x8e\x02\xc2\x84\x4b\x3c\xba\x32\x68\x95\xf4\xab\x38\xa3\x99\x4b\x83\xab\x30\x60\x0f\xf5\x11\xcc\xb5\x95\x99\x2f\x8c\xc0\xd2\x95\x48\x07\x97\x2d\xa3\x65\xb0\x6f\xbd\xab\x53\x9b\x2e\x03\x59\x8b\x34\xe5\x3c\xfc\xf9\x39\x90\xb9\x7a\xac\x1d\x32\x97\x83\x36\x6d\x45\x1f\x97\x2b\x8d\x8a\x00\xb6\xb8\xec\xdb\x37\x27\x96\x44\xce\xc1\x44\x7c\x09\x98\xee\x4f\x70\x90\xf3\x4c\x9c\xc8\x53\x05\x90\xca\xe7\x65\x36\x0a\xad\xb0\xab\x31\x35\x00\x49\x41\xc9\x23\x02\xcb\xb2\xb3\x50\xa1\x4e\x8f\x30\xaf\x53\x25\xc2\xb4\x38\x00\x5e\x3a\x9d\x45\x85\xe6\x32\x65\xc3\x27\xba\x72\x57\x54\xb3\x32\x56\x91\x7f\xb9\x65\xae\x9f\x02\xed\x21\x26\xb4\x81\x47\x3d\xc0\xe9\x31\xc2\x52\x2b\xf0\x0f\xe6\xa2\xec\x95\xc7\x92\x24\x7b\x1e\x03\x39\x61\x12\xf7\x83\x07\x0e\x2f\xe6\xc2\xcb\x98\x22\x50\xd1\x3f\x2d\x54\x60\xc7\x44\xfd\xe4\x53\x23\xe6\x31\xcc\xcb\x54\x0c\xd7\x25\xf2\xc5\x5a\x70\x58\xf2\x30\xe8\x2b\x79\xf3\x66\xaf\xcb\xb0\x25\xb4\x92\x55\x43\x95"}, +{{0xf9,0x13,0x9e,0x57,0x9f,0xa9,0x6e,0xbd,0x62,0x87,0xdb,0x3b,0xab,0xcd,0xa6,0x0f,0x92,0xe7,0x31,0x53,0x56,0x6f,0x92,0x4c,0xb5,0xde,0x04,0xde,0x44,0x93,0x48,0x1e,},{0xc0,0x6c,0xe3,0x35,0x53,0x3a,0xf8,0xd8,0xf3,0x37,0xf2,0xb3,0x8e,0x0a,0xaf,0xa2,0xce,0x9b,0x27,0x22,0x3c,0xd9,0xdd,0xc5,0xef,0x32,0x02,0x7f,0x04,0x88,0x9b,0x7f,},{0x05,0x1d,0x8d,0x7f,0x0b,0x68,0xd2,0xee,0xc7,0x2c,0x81,0xad,0xfc,0xfb,0x31,0xae,0x85,0x58,0xf6,0x0a,0xb6,0x3c,0x9f,0x56,0x52,0xa8,0xdf,0x63,0x8f,0x66,0x6f,0x1e,0xbc,0x0c,0x6e,0x0b,0x41,0x19,0x53,0xbc,0xda,0x6b,0x51,0x51,0xb2,0xb9,0x3a,0x39,0xe3,0xc5,0x33,0x0a,0x85,0x73,0xe1,0x68,0x79,0x22,0x72,0xab,0xd3,0x6c,0x81,0x0a,},"\xb3\x30\x76\x4d\xdc\x62\x8e\x4a\xd6\x7a\xa4\x98\x2a\xe8\x6d\x45\x81\x07\x1c\x19\x3e\xc3\xc5\x8f\x81\x3d\x79\x21\xb8\x4d\x2a\x54\x56\x2b\xd8\x74\x17\xae\x1d\xe5\x90\xa1\xa4\x8c\x4e\xc7\xd5\x56\xad\x93\x1d\x65\xc0\x54\x3f\xdf\x06\x07\xc7\x49\x85\x9e\xe1\x2f\x99\x52\x02\x0c\x19\x5c\xf8\x74\x60\x95\xe1\x08\x7c\xc6\xc3\xc8\xef\x9d\x24\x05\x25\x60\xce\x81\x3d\x61\x39\xb7\xa7\x5c\x8f\x4b\x8e\xa3\x0a\x9c\x4a\xb8\x88\xd0\xa6\x34\x1c\x99\xab\xd3\x5e\x09\x03\xbf\xe5\x6c\x93\x15\x23\x40\xc4\x12\x76\xd7\xf2\x4e\x09\x12\xb1\x2a\x4d\xb3\xd7\xee\x44\x84\xdf\xa5\x3a\xfc\x0b\x1a\xea\x14\x09\xd1\xe0\x32\x8a\xa1\xc8\x60\x41\x27\xca\x2e\xb1\xa5\xe8\x1b\xf3\x1f\x8c\x7a\x51\xc6\x05\x2c\x53\x4e\xfe\x6b\x3d\x0e\xe7\x4f\xf5\xa9\xb1\x1c\x61\x57\xe3\x64\x77\xef\xa9\x38\x2f\x57\x51\xbe\x8c\x8c\x64\x54\xc4\x46\xd6\xf8\xdc\x7e\x92\x95\x25\xcc\x3d\xe7\x8c\xb1\xba\x4a\xba\x9b\xd4\xbe\x15\x26\x10\x43\x75\x82\xc9\x65\xee\xa4\x8c\xbd\x4c\xaa\x6f\x30\x8f\x85\xf4\xf8\xd0\x06\xa0\x42\xf6\x19\x20\x07\x62\xe1\xbb\x9b\xa4\x22\xe6\x54\x75\xb3\x3a\x94\x94\x29\x8c\xfb\xb7\x5a\x15\x2b\x36\xd2\xa0\x55\x01\x80\x77\x05\xb9\x52\x76\x53\x50\xcd\x14\x14\x1d\x35\xd4\x98\x66\x92\xd6\xc3\xbc\xfc\x6d\x61\xdf\x00\x52\xa6\x20\xaa\xb8\xcc\x13\x20\x5e\x75\x4c\x16\xf9\x3e\xca\x79\x20\xbb\xea\x51\x57\xef\x11\x2f\x0b\x64\xc1\x05\x4f\x90\xa5\xdd\xc1\x75\xa8\x9e\x29\x24\x2f\x57\x64\x6e\x74\xcc\x88\x5e\x81\xa1\xcc\x14\x4c\x3d\x78\x2d\x11\x52\xa9\xe4\xcf\xe7\x6c\xb3\xff\xab\xe7\xdb\xe6\x03\xfb\x38\x69\xec\xa8\x69\x96\x98\x70\x9c\xc8\x7f\xc9\x61\xc1\xe2\x99\xcf\xca\x22\xe3\x24\x2e\xae\x78\x8c\xff\x11\xbf\xca\x61\x02\x67\x45\xf4\x97\x62\x25\xb2\x6e\xe2\x00\xc4\xf1\x91\x0c\x4b\x83\xdf\x5c\xe4\x6e\xf4\x87\xd7\x48\xd9\xc4\xc5\x02\x14\x1b\x78\x74\xca\xf4\x1e\x5a\x29\x7b\x24\x8c\x2b\xac\x69\x90\xa1\x5b\x07\xb4\xcf\x81\x0e\x59\x28\x74\x42\xd9\xa3\x69\x6c\x02\xe8\xd7\x32\x4d\x3c\xf7\x30\xdd\xa5\x40\x53\x6b\xeb\x13\xcf\xde\xae\x61\x80\xdd\x74\x84\x83\x2d\xfa\x94\xe9\x4a\xa6\xcb\xa1\x17\xaa\xe1\x72\x70\xf4\x8f\x93\xb2\xf9\x8a\xe9\x58\x17\x18\x16\x3f\x44\x63\x54\x6c\x0a\xe0\xf2\x79\xc3\x6b\x92\xbe\xe6\x6f\x1c\xa2\xd6\xa4\xf7\x26\xd2\xdf\xee\x0b\xc1\x1c\x1d\x8a\x1f\xa6\x2c\x3c\xc8\xab\xa2\x66\xb9\x87\x59\x28\x6c\x10\x68\x48\x3b\x23\x76\xb4\x03\xc8\x87\xfb\xb6\x57\xdc\x0f\x25\x5d\xea\x90\xdb\xd2\x33\x08\xf7\xe0\xe8\x42\xb4\x98\xa8\xdf\xc7\xc9\xcd\x5a\xef\x0e\x87\xd5\x6b\xe4\x0d\x50\xfc\x1d\xd4\xc0\xaa\x7d\xee\x55\xae\xbe\x4d\x6b\x6a\x52\x05\x39\x62\xb8\x7b\x0f\x2e\xe0\x9a\x90\x81\x61\x55\x33\x3d\x5c\x57\xa1\x47\x24\xe0\x01\xbc\x3d\xed\x17\x84\x3b\x76\xe2\xc4\x7a\x17\x63\x39\xc8\xde\xfc\x54\xb5\x5b\x23\x58\xae\x7d\x01\xb0\xf6\xe0\x8f\x31\x21\x6a\xe9\x03\x40\x69\x41\x68\xa5\xa7\x9e\xe8\x83\xea\x78\x58\x00\x7d\x17\xc3\x73\x59\xc9\x9d\x65\x97\xef\xe4\x60\xc1\xa2\xf7\x73\x8a\xc3\x2c\x5e\xb5\xe3\x9e\x50\x0c\x49\xc0\xdf\xf9\xc4\x65\x9e\x8c\x50\xcc\x5c\xa7\x9d\x8b\xa4\xe5\x97\x2d\x67\x22\x54\x68\xfb\xa6\x41\x67\xa6\xb2\xc6\xf3\x68\x93\x5c\x7a\x04\x9d\x35\xd3\x55\xc7\x67\x25\x20\xd3\xc9\xe4\xe4\x3c\x67\x1c\x3c\xb8\xde\xe2\x59\x04\x74\x95\xde\x0f\x56\xdd\x71\x91\xd5\xbd\x4b\xbd\x29\x51\x7e\x36\x47\x92\xff\x89\xd3\x37\x99\xb6\xe7\x81\xc2\x01\x93\xf5\xa3\x16\xfb\x40\xde\x74\xfe\xe2\xac\xc2\x5e\x47\xf5\x12\x21\x4d\xe3\xb1\xe9\xb3\x82\xa8\x69\x29\xc1\x57\x3d\x37\x24\xc2\x50\x17\xc0\xe5"}, +{{0xc8,0xee,0x95,0x4d,0xb5,0xa1,0x1b,0x29,0x2e,0xd9,0x77,0x64,0xfa,0xe6,0xb2,0x83,0x05,0x1d,0xb5,0x7d,0xcd,0xc0,0xaa,0x0d,0xf5,0x39,0x3b,0xb6,0x0c,0x11,0x2e,0xd3,},{0x5c,0x2f,0x81,0x82,0x4e,0x99,0x75,0xdd,0x7e,0xa3,0x53,0xbc,0x66,0x80,0x7d,0xed,0xc7,0x61,0x03,0x49,0x79,0x4e,0x2f,0xc0,0x8e,0x5a,0x31,0xe0,0x02,0xe3,0xfe,0x07,},{0xf3,0x07,0x7a,0x75,0x10,0x1e,0x12,0x1e,0x5c,0x3e,0x77,0xd8,0xed,0x97,0xb5,0x78,0xd2,0x39,0xbd,0x42,0x18,0x03,0xd3,0x45,0x5b,0x56,0x54,0x40,0x5a,0x4c,0x58,0x6a,0x60,0x92,0xe1,0x3a,0x85,0x29,0xba,0xce,0x46,0x8a,0x30,0x57,0x84,0xb3,0x73,0xe4,0x33,0xfe,0xe4,0xa3,0xdf,0x89,0x56,0xbe,0xfa,0x01,0x2f,0xd8,0xa8,0xee,0xd1,0x0c,},"\x7b\xa3\xfb\x56\x83\x15\xaa\x81\xe2\x1f\x19\x77\x80\xed\xc2\xc6\xea\x26\xd8\xd0\x6a\x43\x78\x91\x2f\xca\x23\x01\xcf\x1e\xab\x3d\x80\x3c\x84\x69\xde\xdd\xf3\x76\x70\x3d\xdb\x7c\xe0\x6a\x77\xda\xb2\x0e\x02\x34\x4f\xad\xcc\x50\x02\x2a\xb3\xc7\x13\xcd\x03\xc1\xda\xa9\x3f\x1c\x7e\xa5\x72\x62\x9f\x61\x0b\x5e\x3c\x51\x41\x1b\xb8\xc1\x96\x94\xbb\xce\x90\x3c\xac\x47\x05\xf9\xb5\xdd\x0f\x47\xbc\x5d\x0a\xa3\x25\x3f\x90\x88\x70\x29\x90\x27\xff\xbd\x34\x49\xee\xba\xd4\x53\x32\xb5\xd0\xc4\xf5\x33\xdb\xed\x18\xa9\x9a\x24\x98\xb9\x16\x4e\x24\x5f\xb6\x5c\x0a\xfa\x0b\x05\x37\x03\xa0\xcf\x95\x94\x0a\xc7\xa0\x19\x5d\x4f\x70\x46\x60\x9c\xf0\x43\x71\x33\x87\x06\xb9\xb1\x98\x6c\x0f\x11\x81\x75\xd2\xcd\xfc\xe7\x4a\x6f\x88\x65\x98\x25\x85\x4e\x94\xec\xe5\x8f\x51\x57\x63\x6d\x62\x35\xb7\x6d\x32\x74\x5a\x2a\x81\xa9\x67\x1a\x8f\x86\x02\x7b\xa9\xe0\x17\x63\x88\x8f\xc1\x71\xce\xf7\xc4\x51\xc3\x60\x72\xbc\x74\x99\x83\x9d\x43\x1c\xf1\x8c\xd7\xc6\xc9\xfb\xa3\xaa\x71\x2a\x05\x43\x28\xcc\xd6\x2b\xe4\x82\x0a\xbd\x5e\x78\x21\x62\x76\x46\x11\xd4\x53\x9b\xa2\xce\xbd\xc2\x09\xb3\xf4\xe4\xb6\x9c\x3d\x64\x07\x3e\x92\x0d\x21\x52\x14\xfb\x0f\xda\x44\x18\x5a\xad\xa5\xc3\x61\x27\xa1\x5b\xa1\x5c\xa2\x8a\x3a\xd0\x86\xe9\xd0\x33\x66\x86\x9c\x60\xc3\xfb\xce\xbd\x86\x9d\x2e\x40\x64\x3e\x83\x3f\x89\x48\x03\xf9\x80\xa2\xda\x7e\xa4\xe5\x9c\xe4\xd7\xc0\x6f\xd2\xaf\xf0\x87\xee\x7b\xcf\xdd\xaa\x3b\x32\x81\x7c\xe6\x3a\x63\x58\x7d\xba\xfe\xf3\x80\x01\x3a\x6f\x1e\xe3\x73\x4b\x94\xca\x3d\xf9\x64\x4d\xd0\x43\x43\x02\xec\xb3\x24\xaf\xe3\x5f\x46\x5c\x9c\x1c\x93\x1b\x27\x29\x4f\xc6\xee\x02\x72\xde\x22\x42\xae\x90\xd7\xf2\xe0\x67\x02\x7e\xf8\x64\x2e\x8f\x17\x1e\xd8\x80\xff\xab\xce\x8a\x20\xa1\xb3\xe3\x39\xad\x4e\x3f\x1a\x90\x01\xf2\x0f\x90\x02\x61\x88\xfd\xe3\x4b\x21\x7a\x6e\x26\xaa\xff\x18\x42\x2b\x7f\x84\x3d\x0f\xdd\xa3\x21\xc3\x19\xc7\x78\xf2\x31\x37\xf2\x0c\xcc\x1b\xda\x18\x90\xe5\xbc\x91\x6a\x54\x56\xd0\x68\xd3\x7b\x5a\xcc\x63\x47\x72\x0c\x56\xa5\xa4\x91\xbc\x34\x8d\x6c\x84\x8a\x9c\x8f\xec\xfe\x58\xc9\x2b\x1f\x30\x2f\xe1\x49\x19\x71\x8c\xd5\xe7\x8b\x7f\xd6\x01\xd0\x9d\xc0\x1e\x69\x04\x86\x1e\x8d\x68\xb3\xc5\x75\x35\xb6\x13\x66\x76\xcb\xc6\xe8\x39\xaf\x0d\xd7\x39\xdb\x89\xa7\xab\xd9\x13\xfd\xf6\xb0\x0e\x9c\xa0\x26\x02\xde\x6c\xa0\xaf\xd0\x91\x3d\x99\x2f\xba\xa8\xff\x82\x2b\x9d\x9b\x09\xdd\xa7\xa2\x9b\xe9\x19\x10\xd8\xfa\x3c\xaa\x2a\x5e\x51\x83\x46\xc1\x67\xc9\xf5\x19\x41\xcf\x73\x53\xf3\xf3\x4c\x1d\xab\x33\x48\x5d\x0a\x8c\x19\xda\xf9\x51\xfd\x3e\xf2\x0d\x0b\x11\x9d\x80\x38\xdf\x90\xc1\x14\xa2\x5a\x5b\x93\xae\x40\xec\x44\xb9\xa5\xd2\xbc\x1c\x65\x17\xc6\x82\x50\x0d\x4c\xdc\x19\x71\x42\xbe\xc3\xaf\x82\x32\xc0\x71\x42\x8d\xc5\x4c\x0d\x30\x45\x42\x72\xe7\x33\x6b\x0b\x58\x88\xa6\xe8\xfe\xcd\xe8\x59\xe2\xac\xcb\x7f\xb0\x94\xac\xc5\x4f\xfa\x48\x1f\x76\x23\xd9\x44\x69\x1f\x04\xfb\x36\x13\xa9\x95\x49\x80\xf1\x7e\x2a\xd2\x17\x3d\x68\xcf\x0e\xc1\xb6\x7d\x8a\x91\xd6\xec\x82\x94\x6b\xcf\x05\xcb\x90\x68\x1a\x71\x62\x7b\x59\x02\x38\x33\x4e\x3d\x5a\xb9\xda\x6a\x08\x9b\xd7\x26\x24\xdf\x90\x74\xcd\xd2\x30\x9e\x04\xdf\xca\xe0\x32\x81\x2f\xe8\x4f\x9d\xb8\x82\xcd\xea\xae\x69\xee\x5d\xaa\x5a\x66\xff\x42\x7f\xc4\x52\xed\xd0\x76\x9b\x6a\xab\xcc\x13\x9d\x0f\x70\xaf\x8b\x97\x43\x0e\x64\x4f\x58\xa4\x12\x87\xa9\x3f\x63\x1d\xed\xa8\x2c\xa0\x71\x6d\x79\x75\x4c\x5c\x50\x3e\x52\xa6\x65\xda"}, +{{0x6d,0xbc,0x55,0x9e,0x4a,0xb1,0x93,0xee,0xbf,0x70,0xc5,0xc3,0x2d,0x79,0x7b,0xe0,0x0b,0x73,0x11,0xe8,0xe6,0x69,0x1d,0xa9,0xaf,0xcc,0x18,0x72,0x91,0xf2,0x50,0x1c,},{0x38,0xa7,0x03,0x44,0x76,0xfb,0x93,0x82,0xf1,0x41,0x77,0x68,0xc4,0x21,0x62,0x95,0x1a,0x26,0x36,0x90,0x2c,0x38,0x98,0xc0,0x29,0xbe,0x27,0x8a,0xb4,0xc3,0x1f,0x31,},{0x31,0xf1,0x6a,0x7c,0xaf,0x2b,0x74,0xf6,0x5e,0x05,0x7c,0x93,0x33,0xa1,0xa2,0x63,0x3d,0xac,0x73,0x46,0x33,0x8f,0x79,0x85,0x10,0x73,0x0e,0xb8,0xd5,0xd3,0x25,0xfc,0x10,0x80,0xdd,0x5a,0xad,0x5f,0xce,0x05,0x34,0xe9,0x54,0x3f,0x3c,0x93,0x58,0x68,0x04,0x46,0x4a,0xf5,0x88,0x6e,0x86,0x44,0x12,0x9c,0x77,0xeb,0xaa,0x48,0x5f,0x01,},"\x88\xee\x23\x65\xf7\xcf\x9d\xe3\x3a\xcd\x53\x56\x49\x68\xb2\xdc\x7f\x73\x70\xb7\xe7\x03\x3f\x4c\x66\x3a\x88\xc2\x5f\x60\xf7\xf7\x11\xd6\x19\x08\xeb\xf1\xf5\xbb\x72\x83\x55\x53\xc8\xaa\x8c\x8e\x4f\xcd\xec\xd3\x79\x78\x23\x82\x89\xbf\x6c\xa8\x48\x76\xd2\x28\x21\x7a\x28\xd8\x1b\x0b\x45\x7c\x92\x2e\x91\xec\xba\x8d\x3e\x1d\x2e\x66\x59\xc2\xb0\xae\xa0\x51\xb9\xc2\xe0\x9c\x7d\xfe\xb5\x1d\x30\xed\xe7\x67\x57\x03\x41\xff\xac\x1e\xcf\x0d\xe2\x0c\x82\xd1\xe9\xed\x07\x75\xde\xac\x72\xda\x7c\x2d\xec\x23\x48\x65\xde\xc8\x3f\x67\x15\xe1\xc3\xc5\x9d\xe2\x03\x3c\xc2\x4d\x86\xbc\x2d\x31\xaa\x16\x64\x96\x86\xed\xe0\xdb\xbd\x89\x64\xc3\xa6\x4a\x3d\xca\x55\x88\xd7\x24\x8b\x1f\x24\xdf\x8d\x75\xf0\x9a\xac\x62\xc0\x78\x28\xca\x43\x1a\x3a\x2d\x77\xa6\x0c\xc9\x3c\xfa\x34\x95\xca\xbe\xb1\x90\x4e\xd5\xb5\x63\x98\x4e\x8c\x20\x77\x7b\xac\x87\x74\x10\x8a\x64\xed\xa5\x8f\xb3\x20\x24\x4a\x3a\xdd\x3e\x3e\x7a\x76\xcd\x13\x7c\xfa\x4a\x09\xb6\xe6\xe9\x30\x11\xea\x0a\xe6\x51\x71\xaf\x13\x07\x11\x76\x6c\xd2\x5b\x3c\x74\xec\x54\xc0\xbd\xfa\x02\xb3\x12\x0a\xc2\x90\x87\xeb\xac\x98\x37\xfc\xa6\x5b\xa9\x71\xbc\x42\x81\xdd\x55\x7c\x50\x0e\x22\x5e\xa6\x6c\x3c\x3f\xd5\x22\x06\xc1\x9a\x9f\x93\x95\x46\x31\x69\xf8\xc7\xa8\x46\xbd\x9f\x83\x4d\x7f\x33\x7d\x0b\x61\xfb\x30\xbc\xe2\x94\xf4\x78\xae\x1f\x1d\x97\x7e\x45\x4e\x43\x3e\xe8\x72\x9f\xb0\x65\xcc\xe0\x3f\xb2\xe4\x35\xdc\xbc\xbf\xba\x01\x53\x7e\x7a\x67\x62\xe5\x5e\x7e\xd2\x25\x28\x30\x37\x04\xbe\xb5\xae\x38\x1f\x2e\x18\x10\x56\xf2\x51\x33\x27\x3c\xf1\x7d\xdf\x2b\x06\xe2\xd9\x47\x7f\x2c\x09\x75\x5f\xc8\xd9\xc7\x3c\xb3\x31\x00\x46\x8c\x64\x13\x1c\x68\x6c\xac\x79\xfd\x38\x45\x01\xe5\x0f\x8b\x0b\xee\x28\xba\x39\x58\x3f\x42\xe4\xfd\x37\x99\xe2\x4f\x60\xda\x5f\xd3\xc7\x79\xaa\xbf\x69\x9f\xfd\x23\x21\xed\x04\x5a\x85\xbc\x64\x24\xf6\x0f\xdc\xc4\x9c\x1c\xb3\x1f\x24\x9a\x42\x36\xc0\x94\x91\x76\x81\x81\xb9\x21\xf5\x86\x02\xfd\x41\x5c\x1e\xde\xb2\x6f\x39\x32\x4a\xdd\xff\x14\x77\x13\x24\x73\x7c\x67\x20\xcc\x92\x39\x1b\x94\x9d\xcb\x42\x12\xbd\x69\x31\xd4\xde\x51\x40\x1e\x7f\x95\x3b\x7b\x03\x6b\x22\x3f\x0a\xf7\xa8\xe4\x08\xb0\x4e\xa6\x35\xa2\x3f\xa0\x70\x9b\xa0\x42\xa5\xd9\x92\x95\x4c\x09\xd8\x58\x1d\xcc\xcf\x52\x56\x8a\xd2\x7a\x1c\xc7\x1d\x18\xaa\x27\x40\xf6\x21\x21\x2e\x7f\x4c\x5e\x5e\x5e\x5e\x45\x32\xd9\xa6\x7e\xc2\x77\x3a\xc2\x1c\x8a\x4b\x00\x2d\x65\x24\xf6\x18\x2d\xd3\x71\x73\x5d\x2c\x2a\xbe\x6c\x95\xc2\x81\xc6\xfb\x1e\x97\x6b\xc1\x7e\x38\x3f\xd5\x2a\xea\xaa\x9f\xbd\x4a\xbb\x82\xa2\xcc\x65\x39\x5f\x8c\x2c\xc7\xd8\x18\x2a\x0d\x25\x0c\x68\x5c\xfc\xba\x93\xa9\x51\xee\x7c\x50\x3c\x6e\x3e\xec\x23\x6c\xe3\x3e\x08\x6c\x61\x07\x28\x73\x7c\x1c\x3b\x3a\x24\x25\x2d\xa7\xf2\x16\x72\xd9\x28\xeb\xda\x99\x3a\x94\xc4\x58\xab\x99\x0f\x5d\x19\xd8\x00\x23\xc3\x6a\xa1\x6e\xaf\xca\xb1\x43\xf3\x52\xe9\x7d\x64\x09\xf3\x24\x99\x41\x11\x9b\xfd\x9f\x5f\x90\x84\x72\x4d\x9e\xba\xd3\x83\xb1\x0f\x34\xd3\x3a\xc8\x30\xcc\xe9\xe5\xcb\x8a\xec\xee\x6f\x40\x30\x1c\xbb\xe3\x09\xfd\x06\x15\x34\xa7\xd0\xc3\xed\xaa\xea\x02\xa1\x71\xd8\xb2\x34\x9d\xbe\xec\x62\x85\x20\xac\x33\x4a\x5b\xfe\x28\xa9\xd5\xf4\xc0\xd7\x40\xf7\xc7\x2d\x4d\x72\xd8\x9a\x97\x32\x6a\x03\x00\x2d\x1e\xf3\x85\x22\xbc\xd3\x7b\x42\x84\x7a\x31\x4b\xd8\x43\xec\x88\xd1\xf2\xf9\xd3\x9f\x57\xf2\xf1\xa1\x3d\x01\x40\xa8\x84\x74\x50\x44\x8c\x88\x0b\x3a\xe7\x65\x31\xe9\x5c\x43\x92\x97\x32\x50"}, +{{0xc9,0xd4,0x16,0x83,0x0a,0xe2,0x02,0x8f,0x21,0x75,0xd2,0x2b,0x61,0x4c,0x79,0x19,0x8c,0x67,0x0c,0xfa,0xa0,0xe7,0xa3,0x61,0x50,0xef,0x0f,0xee,0x21,0xa9,0x5c,0xe6,},{0x6e,0x3e,0xb4,0xd0,0x18,0x73,0x07,0x2d,0xf9,0x46,0xf1,0x79,0x2f,0x71,0x06,0x33,0x08,0x95,0xe7,0xa7,0x6d,0xd9,0xae,0x27,0xf8,0xa9,0x88,0x03,0x94,0x90,0xfd,0x4b,},{0x47,0xfa,0xad,0x4e,0x65,0x52,0x93,0xed,0xa1,0x56,0xb2,0xa1,0xfa,0xbb,0xfb,0x7e,0x00,0x9f,0xc2,0x90,0xaa,0xfe,0xdb,0xd5,0x65,0x21,0x14,0xa4,0x78,0x53,0xbc,0x77,0xa8,0x23,0x3a,0x2b,0x17,0x9f,0x60,0x54,0x77,0xd7,0x87,0x87,0x8c,0xbb,0x15,0xea,0x61,0x24,0xdf,0x8d,0xc5,0x7b,0x2c,0xe7,0xbe,0x7d,0x18,0xb7,0x16,0x2f,0xb5,0x0d,},"\xff\x9a\xd4\x83\x7c\xd0\xbb\x77\xd6\x21\x0f\xdd\xdc\x75\x5e\x6c\x0f\x1a\x73\xc2\xbc\xd0\x3f\x7a\x58\x69\xe7\x34\x2c\xfd\x73\xcf\x70\x86\xf8\x65\x56\x15\x60\x27\x7b\xf6\xc3\x42\x1a\x91\x2d\x67\x65\x8b\x1f\xa9\x70\x57\xc4\x96\xf4\xbe\x8e\xdc\xbe\x18\xb5\xec\xd0\x8a\x1e\x7d\xb2\x52\x23\xab\xda\x20\x8f\xa5\x31\xf4\xb2\x80\xaa\x03\xb0\x4b\x60\x60\x34\x11\xd3\x74\xba\x7c\xbb\x02\x0b\xb9\xa8\xce\x4c\x0e\x45\xa7\xe1\x32\x14\x48\x43\xc3\x1f\x8b\x45\xc5\x8e\xb3\xea\x85\x3c\x2c\xeb\x61\x37\x6e\x9d\xf8\x1d\x97\x78\xe7\x21\xad\xac\x77\xb5\x03\x54\x93\x7f\x34\x37\x2f\xcc\xd5\x75\xe8\x8d\x9d\x05\x8e\x43\xdf\x94\x2f\x2c\x43\xb5\x23\xc8\x09\x8e\x6d\xd9\xe6\xbd\x21\xd5\xa6\x49\xb4\x72\xd4\x1e\x34\x5f\xcd\x5e\xfd\xdd\x49\xea\xb3\x02\x70\xcd\x87\x88\x40\x4f\x28\x51\x6e\x09\xd3\xac\xc4\x00\x48\xb3\x9d\x32\x46\xf7\x57\xe4\x82\xe1\x45\x9c\x62\x6b\x79\x9e\x04\xd0\x67\x27\x13\x73\x71\xe1\x20\xaf\xb9\xfe\xc3\x9a\x25\xf4\xe6\x76\x4b\xf9\x79\x2f\xe4\x92\xee\x0f\x21\x0b\x57\xdb\x9e\xbb\x9e\x8e\xf4\x1b\x02\xc7\xfe\xe9\xed\xd4\xb6\x17\x4c\x57\x0d\xe0\x20\xa3\x91\x28\x71\x33\xfe\x8c\xcb\x41\xa8\x3f\x91\xbd\x22\x38\x2b\x21\xe1\xd7\xeb\xc2\xc7\xe5\x01\x8e\xf5\x14\x2d\x82\x63\x7d\x02\x62\x0f\xbc\x05\x69\xcc\x09\xc4\x4e\x91\x11\x12\xbb\xae\x99\x06\x4d\x68\xd1\xc6\x9e\x77\xc9\x93\x0b\x0d\xe0\x30\xc8\xc1\xd7\x48\xc4\x14\x05\x9d\x5e\x29\x9b\x7e\xdc\x08\x94\x06\x51\x89\x4b\x30\x3a\x2b\x32\xdd\x2c\x36\x5a\x06\x7c\x97\x23\x58\x55\x94\x64\x4d\x3e\xe8\xde\x1a\x51\xfa\xea\x0e\x65\x0f\x21\x24\x88\x5a\x94\xcb\x99\xeb\x90\x3b\x7d\x45\x79\xbd\xe5\x91\x49\x7d\x95\x39\x30\xd3\x63\xdd\xdb\xda\xc6\x27\xb9\x7a\x91\xf4\x96\x82\xdf\x8e\x72\x50\xa7\x07\x3d\x38\x3a\x7a\x22\xcf\x11\x3f\x28\x58\xce\x6b\x63\x2a\x28\x92\xc4\xe8\x8a\xa9\xa0\xd2\x89\xeb\x57\x62\x9b\x00\x8d\x3b\x1b\x60\x81\xe6\xfe\x5d\x3c\x0a\x6c\x80\x21\x89\xb5\xf1\x08\xe7\x66\x31\x9e\x15\xb3\x3e\xaa\x5b\x8c\xed\x40\x27\xea\xec\x83\xb4\xac\x68\xb1\x4b\x82\x98\xbc\x51\xcd\x8e\xb3\x80\x9b\x7a\x2d\x68\x4f\xe3\x2b\xbd\x9f\xab\x5c\x91\x8e\xeb\x17\xcc\x44\x4d\x73\xf7\x30\xd4\xc8\xcc\x05\x7b\xd3\xa2\xf1\xf0\xae\xbb\x61\x63\x29\x34\xe6\x17\x02\x16\x88\x29\xcd\x7e\x91\xde\x81\x50\x96\x29\xd0\x1a\x8c\xde\xfe\x0d\x1a\xc4\x9e\x21\xf0\xc5\xfb\xe1\xb2\x24\x48\x27\x26\x8a\x0a\x27\x35\x7e\x15\x8b\xd7\x68\x84\xa2\x1e\x7f\x1f\xac\x1b\x62\x72\x16\x6d\x5a\x9f\x64\xf9\xb6\x72\x98\x9a\x87\x62\xf5\x12\xbf\x1d\xf4\xb2\xab\x69\x97\x65\xf2\xcd\x83\x96\xf4\x76\xe7\xf5\x99\x95\xde\xe7\xd8\x90\x20\x7e\xff\x0f\xd2\x72\x63\xec\x23\x2e\x37\xcf\xed\xfe\x7c\x44\x05\x55\xd4\xca\x74\xe5\x2d\xa2\x46\xc4\xb8\x37\x57\xbe\xaf\xd2\xab\x2a\x51\xef\xe1\x60\xbb\x02\xb9\x8c\x26\xd6\xb2\xc3\xf0\xc1\xaa\xcb\x2f\x3c\x34\xa5\xb2\xa3\xb6\x6f\xee\x17\x5b\x78\x75\x48\x07\x3d\x8b\x57\x77\xc6\xbe\x88\x0b\xdc\x19\x6b\x33\x74\xa2\x15\x4f\x94\xd9\x36\x0f\x77\x55\xac\x68\x15\xa2\x8a\xf2\x96\x27\x1e\x22\xa8\xf2\x35\x43\xc7\x49\x55\xa6\x09\x12\x5b\x02\xa5\x69\x21\x80\x11\x42\x02\x95\xcc\xf0\xd7\x35\x69\x99\xa5\xb8\x95\xcc\x88\x48\x3f\xad\xf7\x97\x0c\xec\x6c\x64\x24\x0f\x70\x79\xfd\xb1\x5f\xfc\x5c\x42\x27\xe5\x39\x26\xd2\x78\xba\x0f\xed\x3c\x39\x93\xbc\x86\x82\x28\x23\xdd\x58\x1a\x32\xab\x2e\x3a\x07\xf7\x94\x30\x22\x4b\x27\x4e\xad\xd8\x45\x59\x8a\x7d\x1d\x89\x67\x6a\xaf\x23\x67\x77\x74\xb7\xb0\x58\x3b\xcc\x83\x59\x9d\x15\x5d\x14\xb0\x9a\xdc\xf4\x9e\xd5\x05\xe8"}, +{{0x2d,0x27,0x7d,0xd5,0x5f,0x57,0x19,0x5e,0xc0,0x72,0xb4,0x7c,0xb1,0x44,0x8c,0xb5,0x82,0xc8,0x35,0x73,0x9e,0x6c,0x98,0xba,0x71,0xab,0x12,0x8f,0x70,0xce,0x6b,0x79,},{0xdf,0xa9,0x25,0x93,0xef,0x0f,0x0d,0x97,0x4a,0x11,0x37,0x83,0x0a,0xd1,0x38,0x48,0xaf,0xef,0x3b,0x81,0x0c,0x2a,0x21,0xbf,0x77,0x91,0x78,0xce,0x4b,0x3a,0xb9,0x74,},{0x73,0xc1,0x06,0x06,0x49,0xa7,0xc0,0x14,0xed,0x01,0x94,0x58,0x51,0xb5,0x3e,0x28,0x53,0x24,0xe6,0x0d,0x06,0x1c,0x83,0x1d,0xda,0x41,0xf0,0x33,0xb5,0x65,0x83,0x06,0xa1,0xf1,0x12,0x32,0x7a,0xfe,0x93,0xca,0xa9,0x21,0x02,0x07,0x30,0xaa,0xe0,0x06,0x9c,0x9a,0x2b,0x45,0xee,0xf5,0x5c,0xbb,0x4a,0x5a,0x9c,0xd4,0x6c,0xda,0x80,0x08,},"\x14\x54\x9e\xdd\xd5\xf2\xb7\x90\x5d\xda\x19\xd7\x4a\xb2\x07\xaa\xc6\xfb\x3e\x3d\xf3\x29\x5d\x84\x52\x31\xef\x3a\xea\x6e\x1f\x04\xee\x03\x3c\x90\x38\xdc\xb4\xbd\x3d\x5e\x45\x2c\x54\x83\x4d\x0f\xf2\xb7\xde\x3f\x32\x2e\x56\x26\x94\x9c\xd6\x1d\x6e\x89\x01\x38\xff\x0e\xa8\xad\x84\x6e\x8f\xe8\x87\xae\xe1\x5f\xc4\x8b\xbe\x4f\xba\x42\x45\x5f\x5c\x17\x45\x7a\xe7\x89\xb4\x05\xaf\x85\x96\x11\xfe\x1f\x87\x46\x18\x5a\x65\xae\xf2\x13\x4e\xa4\xd8\xf3\x98\xd4\x8d\xf7\xc1\xbb\xa4\x30\x44\x08\xae\x7e\xfb\x35\x29\x24\x09\xd5\x08\xdd\x55\xce\x21\xde\x8c\x28\x16\x0d\xc9\xe8\x77\x70\x0c\x76\x3d\x06\xb0\x1b\x85\x42\x05\x2d\x7d\xdb\x63\x35\x54\xe3\x58\x42\x79\xc7\x96\x93\x70\x23\xc8\xea\xc3\x72\x77\xbe\x2b\x82\x04\xff\x3e\x0e\x10\x31\x19\x0a\x01\x01\x4c\xf5\xf5\xb4\xd7\xad\x99\x67\x27\xf9\x75\x31\xe0\x35\x5b\x87\xc9\xe6\x11\x52\x5a\xad\x07\x99\x58\xe9\xaf\xe2\xab\x10\xe4\xa3\xe7\xa1\xb6\xba\x0a\xff\x81\x5d\xa2\xcd\x81\xea\x9e\xb9\xf5\x36\x98\x66\x33\xf3\x16\xdd\x06\xc2\x50\x3c\x6b\x19\x8d\xc5\x93\x04\x80\x7b\x98\xb4\x29\x35\xf5\x1f\x63\x7d\xdb\x59\xe2\x33\xfe\xd5\x66\x43\x9c\x1f\xe9\x6c\xda\xaf\xa4\x9f\x44\x12\xd0\xc1\xe6\x54\xd8\xc6\x90\x42\x47\x0b\x3a\x59\xac\xb6\xbf\x67\xe4\x0b\x38\xa7\x70\x67\xd5\x99\x7b\x8d\x35\xed\x61\xd6\xeb\x3c\xc7\x8b\x8b\xdc\xb9\x57\x4b\x1c\xed\x9f\x6f\x33\x9e\x9e\x38\xf9\x41\x46\xef\x63\xf0\x49\xe6\xb8\x02\xbf\xed\x2a\x51\xab\x42\xe7\xd4\x89\xf3\x16\xff\x4d\x1c\xd8\x98\xbc\xf8\x50\x56\x51\x68\x74\x40\x74\x9c\x0f\xb7\xa5\x7d\xbe\xff\x72\xe6\x46\x89\xfa\xa4\x1c\x07\xb4\xad\xe5\x99\x33\xd2\xfa\xc6\xd5\x73\xde\xb7\x39\x54\x9e\xb7\x5f\x1e\x6f\x73\x85\xd8\xc6\x14\x28\x94\x97\x3e\xd6\x85\xeb\x8e\xd0\x80\xc2\xa4\x9f\x3a\xc6\x57\x11\x61\xaf\x96\x63\x5a\xd0\x57\xdf\x14\x86\xd3\x96\x77\x3a\xc8\x98\x32\x10\x97\x89\x86\xe1\xbf\x21\xa2\x08\x06\xd6\x67\xa4\x8a\x55\x5a\x96\x32\x21\xd5\x06\x14\xa8\x97\x6b\x2e\xec\x97\x51\x2d\xb1\x1a\x35\x81\x94\x49\x2a\xb5\x45\x58\x01\xba\xa1\x4a\x51\x1b\x26\xeb\x0c\x68\x28\x9d\x79\x05\x23\x71\x2f\x2f\xf8\x70\x98\x92\x69\x5c\x4d\xb9\xad\x31\x0d\xf8\xc6\xee\x7b\xd8\x3c\x87\x1f\x05\xae\xc3\x3b\x7a\xd3\x26\xf4\x46\x69\x2a\x42\xf7\x22\x23\x76\x24\x6d\x53\x6a\x32\x6c\x4d\x73\xeb\x57\x2f\xea\xda\x11\xb8\xac\x71\x14\xf6\xcb\x44\x4c\xa2\x78\xfc\xf0\x7b\x97\x0d\x2a\xd4\x65\x37\x2a\x68\x7d\x36\xb7\xda\xac\x47\x87\x48\xec\x6a\x93\x2d\xa2\x08\x43\x94\x8e\xfa\x39\x30\x97\x81\x42\x72\xe5\xca\x1c\x73\xe7\x11\x97\x3a\x52\x68\x3f\x98\xc0\x1e\x55\x24\x1c\x15\x4d\x28\xe3\x8d\x3e\xdf\xad\xe2\x30\x3a\x4e\x7c\x45\xc2\xa7\xa1\xc9\x96\xee\x11\x37\xaf\x86\x4a\x98\xb6\x98\x09\xfc\x92\x14\xee\xa8\xcf\x3a\xfe\x84\x2f\xee\x3e\xb9\xa9\x32\x2c\x3b\x82\xfd\xdb\x05\xd4\xd1\xa2\xde\x09\xc1\xce\x72\x73\x44\x53\xa8\xdd\x3a\x89\x20\xd0\xd0\xac\x96\xef\x77\x8b\x9e\x02\xc6\xa3\xf1\x28\x72\xe1\x7d\x3a\x81\xba\x75\xfd\x23\x3b\xaa\xdb\xe2\x16\xea\x0a\x58\xe9\xdd\xa0\x08\x40\x87\x02\x08\xae\x41\x35\x40\x03\x0b\x3c\x05\xe5\xd0\xb8\x32\xdf\x87\xc8\xee\x7f\x15\x34\x87\xaa\x11\xba\xd9\xf1\x39\xc7\xdd\x4b\xcf\x41\x8f\x4b\xcb\x95\xbe\xe8\x57\xd0\xe9\x60\x84\x47\x23\x87\xcb\x39\x12\x7a\x94\x71\x34\x50\x19\x63\xa7\x07\x1b\xdb\x34\xde\x69\x61\xbe\x2b\x6b\x06\xe4\x03\xe7\x59\x18\xe6\xf6\x9d\x08\x02\x1c\xf2\xa8\xac\xb8\x0a\x01\x11\xf4\xd5\x06\x10\xc1\x52\xd3\x9c\x66\x21\xc0\x57\x8a\xc6\x89\x95\x9b\x1c\xe6\xf3\x76\xf4\x3d\x18\xaf\x06\x2e\x4a"}, +{{0x42,0x80,0x66,0xc5,0x24,0x45,0x72,0x6d,0x0e,0xa2,0x00,0x7e,0x50,0x46,0x37,0x27,0x4d,0x84,0xee,0x23,0x23,0x25,0xb5,0x05,0xf2,0xc5,0x16,0x35,0x7f,0x80,0x75,0x83,},{0xdd,0x40,0xfe,0x8f,0x67,0xc6,0x65,0x61,0x3b,0x3c,0x45,0x9f,0x6a,0xce,0x8d,0xc2,0x8d,0x34,0xe0,0xe7,0x7e,0x2f,0x6a,0xa0,0x60,0x59,0x28,0x19,0xbe,0x6a,0x9d,0x68,},{0xc9,0x38,0x82,0x9f,0x59,0x8b,0x1f,0xf1,0xb8,0x18,0x33,0x60,0xd2,0x23,0xf4,0x3c,0x59,0x47,0x30,0x60,0x68,0x76,0xa9,0x9a,0x3f,0x31,0xb2,0x06,0x5d,0x04,0xe6,0xf0,0x75,0xd1,0x39,0x6b,0x3c,0x8c,0xff,0xb0,0xe1,0xe2,0xea,0xab,0xda,0x7d,0xa5,0xe7,0x89,0xcc,0xd1,0xc0,0x20,0x83,0x5f,0xe3,0xa7,0x1d,0xcd,0xb6,0xaf,0x03,0x96,0x0c,},"\xe2\x79\x6c\x50\xd9\x3d\xf8\x12\xbc\xa4\x1b\xf2\xa1\xe1\xdd\x73\x7d\x8c\xf6\xf6\xb4\xf7\x62\x42\xe3\x91\x78\x18\x67\x58\xcb\xae\x08\x84\xe6\x0c\x6b\x4a\xaa\xdd\xae\xc9\xa8\x99\xa9\x12\xe5\xc5\xb9\x80\x4d\x7b\x04\x97\xba\xb4\x45\x8c\x58\x5d\x4f\x25\x92\x22\x49\x8c\xe9\xe8\x0e\xb6\xa7\x97\x9b\xbe\xd6\xd5\x2c\xc3\x80\x72\xf7\x45\xcb\x2c\x63\xe6\x63\xbc\x3b\x9d\x6c\xaf\x01\x2a\x60\x7f\x6d\x3b\x70\x6e\x15\x57\x57\x87\x17\xec\xbb\x97\x1a\xeb\x7c\x48\xe1\xdf\x95\x71\x1c\x55\x0e\x00\x69\x93\xbf\xfb\xa9\x11\xcb\x64\xad\x52\xd5\x17\xed\x18\xbe\x82\x36\x9e\x81\x58\x19\xd3\x17\x59\x47\xd4\xa3\x5b\x2c\xc7\xb9\xdc\x6c\x10\x05\x13\x26\xb3\xf1\xdc\x1e\xdb\x1b\x68\xba\x01\x5f\xf7\xca\x1d\xc3\x61\xd8\x96\x7a\xbc\xff\xd3\xc3\x1f\x7d\x6b\x0c\xb1\x39\x6a\xe5\x41\xf2\x97\x59\xc4\x13\x0b\xe5\x2e\xcc\x11\xd9\x92\x61\xc3\x65\xbf\x7c\xde\xc7\x81\x49\x4c\x5f\xa0\x52\x6d\xb4\xdb\xbe\x66\x0a\x43\x2b\xe5\x60\x43\xc6\x6e\xa0\x7c\x25\x62\x7a\x5f\x72\xb7\x81\x23\xdc\xf9\x86\xff\x71\xed\x1a\xff\xd1\x65\x9b\x13\x93\xd9\x62\x1f\x71\x1d\xfa\x63\xea\xda\x38\x34\x30\x79\x70\x58\xf1\x56\x6a\x00\x05\x2d\x67\xba\x53\xc1\x23\x7b\x56\x91\xde\x3b\x03\x9f\xd4\x47\x6f\x11\x51\xe5\xed\x5f\x5a\x98\x67\x2f\xa3\x3a\x1d\x85\x4f\xa0\x15\x66\xb3\x32\x31\xd4\x6a\xcd\x7f\x34\xb8\x03\x44\x79\x98\x18\x53\x76\x4d\xab\x87\xf4\x98\x44\xcb\x62\xc6\x3d\x53\x6f\xac\xa9\x20\x44\x7d\x8c\xd1\xe8\x11\x3e\xdb\xc8\x3e\x4a\x6b\x78\x15\xe1\x80\xcd\x78\xb9\x33\xd9\x68\x7f\xd5\xbe\x99\xd0\x51\x8a\x44\x66\x29\x89\xbc\x64\x01\x11\x24\xf1\x87\xd4\x39\x79\x99\x4a\x95\xe0\xc9\x03\xa0\x06\xc1\xc0\xbe\xf1\xc0\xf3\xdf\x1e\xb7\x00\xf9\x80\xc2\x8c\x3c\x1e\x99\x7d\x0c\x56\xd1\x13\xda\xe1\x96\x88\x2b\x05\x01\x8f\xca\xb3\x14\xd8\x11\x7f\xaf\xba\xbe\x77\x00\xb9\x32\xd4\x7c\x57\x36\x2b\x20\x35\xed\xdc\xe2\xd2\xef\x33\x64\x1e\xa9\x0c\x3e\xa3\xfe\xc6\xea\x5b\x87\xe1\x61\x01\x4c\x4f\x82\x14\xfd\x03\xce\xbf\x94\xab\xe1\x22\x53\x7a\x98\x70\x32\x39\xdf\x58\x21\xc5\xab\x63\x3f\x98\x36\x5c\xc6\x36\xe3\xf1\xd2\xf7\x4e\x0f\xf8\xf1\xfe\xe0\x6a\x3f\x73\x90\x7e\xe5\x04\xb3\x10\xfd\x52\x24\xad\x4d\x05\xcd\x23\xc3\x56\xdf\x8b\x34\x64\x72\x98\xc4\x98\x28\x72\x5b\xa5\xfd\x60\x61\x1e\x82\x9b\x63\x37\xbc\xc9\xdc\xf8\xe8\x97\x1c\xab\x3e\xe9\xc2\x63\x37\xd3\x8d\xfd\xfa\x03\x6b\xf6\x09\x6b\x63\x5a\xc1\xbd\x55\x25\xec\xd3\x77\xa1\x52\x72\xa8\xac\x9b\xbe\xf1\x33\x10\x7a\x42\x25\x8d\x8b\x19\xec\x69\xdc\x42\x61\xbe\x53\x00\xa2\xd2\xd5\xca\x99\xf3\x1e\xfd\xf2\x59\xf9\xd0\x79\x86\x9a\x34\x41\x37\x79\xf3\x02\x88\x24\xd7\x47\x68\x6c\x46\x0f\xfc\x49\x6f\x20\x10\xf4\x03\xe9\x03\xe2\x7a\x87\xdd\x07\x5a\xe0\xa7\xf1\x68\x94\x16\xd3\x1b\xcc\x15\xf4\x90\xca\xf9\x75\xc4\x0e\x71\x5d\x54\x99\x03\xe8\xbc\x0f\x7d\x91\x41\xe0\x20\xf4\x10\xf3\xca\x2b\x2c\x07\x97\xca\x0d\xc8\xd7\x39\x2b\xff\x24\x35\x28\xc7\xf3\xbe\x13\x89\x97\x18\x5a\x4b\x36\xf4\x53\x76\xd9\xfd\x70\xba\x20\x98\x9d\x2d\x1a\x91\x1d\x4b\x98\xd1\x60\xd2\xb8\xde\x59\x2d\xe2\xf4\xc0\x4f\x35\x86\x0d\xf3\x20\xc5\x48\x44\x0d\x5e\x3a\x34\x6a\x14\xd3\xa6\x3f\xe4\x85\xc2\x88\x91\x26\xb7\xf4\x1d\x55\xa6\xeb\x23\xd5\x62\x0b\xab\xf8\x56\x4a\xa7\x9d\x15\x6e\x98\x3f\x36\xd9\xed\x49\x8d\xa9\xca\x88\x8d\x94\x6b\x53\xcc\x47\x68\xa5\x89\x2d\x52\xd5\x41\x52\x69\x60\x28\x25\x24\xba\x61\x94\xda\x65\x94\x1d\x1e\xa3\x0f\x80\x6b\xb6\xd9\x7c\x74\x88\xb9\x3f\xd0\xa7\x70\xa9\xb1\x5e\xfc\xd1\x2c\x5c\x46\x94"}, +{{0x31,0x45,0xbc,0x68,0xd8,0x29,0x79,0x40,0x8e,0x46,0x57,0xb7,0x75,0xf1,0x50,0xc6,0xd2,0x8a,0x32,0x4d,0x74,0x6e,0xa6,0xde,0x90,0xfd,0x72,0xb1,0x7a,0x25,0x79,0x82,},{0xc7,0x76,0x18,0x6c,0xe4,0x7f,0x30,0xad,0x08,0xfa,0x1d,0x2c,0x61,0x6a,0x36,0x44,0x66,0x5b,0xa5,0x4f,0xf7,0x30,0xfc,0x2f,0x4d,0xb1,0xdb,0xa3,0x8d,0xde,0xed,0xca,},{0x24,0xa4,0x33,0x33,0x76,0x83,0xbc,0x71,0xa6,0xca,0x3b,0xcc,0xd8,0xcc,0x24,0x00,0xc2,0x44,0x64,0xfa,0x67,0x71,0x4b,0x46,0x51,0x5f,0x2a,0x14,0x32,0x71,0x27,0x05,0xd5,0x70,0x61,0x4d,0xb6,0xd2,0x6b,0xbb,0xd3,0xf0,0x26,0x7c,0x14,0x27,0xca,0x1c,0x2f,0x40,0xdc,0x9a,0x6f,0x1f,0xb0,0xf0,0xfc,0x71,0x4a,0x02,0xe2,0x4b,0x47,0x08,},"\x2e\xa8\xdc\xe1\x48\x7f\x45\xd6\xff\x8e\xb8\x3c\x54\xfb\x7e\xdd\x76\xad\x6e\x60\x8b\xb8\xda\xf1\xa1\x82\x3d\xa4\xf4\xe4\xe9\x86\x31\x73\x89\x7c\x19\x7a\xc6\x58\x04\x82\x3b\xca\x95\x09\x1f\x59\xe8\x6d\x63\xc1\x8d\xbc\xdb\x85\x74\x3f\x88\x93\xee\x69\x4d\x81\x56\x01\xf8\xf2\x2f\x4d\x7d\xf0\x87\xf0\x11\x4b\xb2\x6c\x37\x95\xe1\xfe\x4b\x7f\x4a\x8f\xa3\x1f\xd9\xf4\xff\x10\xfe\x5d\xd4\x52\xc5\x4c\x55\x78\xc7\x52\xf8\x88\x21\x30\x76\xbe\x46\x7b\xa3\x0d\x2e\x2f\xbb\xee\x87\x7c\x4b\xe9\xb6\xec\x4f\x04\x02\x1c\x00\x6f\x92\x66\x31\x19\x43\xca\xb7\xce\xa9\x9a\x2a\xce\xbb\x69\xee\xc3\xe6\x18\xc1\x31\xf9\x74\x30\x07\x5f\x79\x75\xe3\x9f\x26\xd5\x31\x51\x78\xb6\x9a\x1d\xdf\x73\x17\x61\x05\x1b\x93\xfb\x8d\xf7\xe0\xe8\xb4\x1e\x82\xe7\xf4\xf7\x5e\x91\xd6\xc8\x90\xb1\x4c\xa5\x33\xe0\x94\xeb\x8e\xa4\x48\x6d\x38\x71\x85\x96\x6c\x98\x29\x5d\x3f\x58\xb1\x7e\xef\x6c\xc3\xb4\xd0\x7e\x93\xa3\xd9\xf4\x77\x2e\xe5\x2f\x18\xa5\xbb\x30\xaa\x39\x72\x85\x0e\x65\x81\x70\xbd\xdb\x67\x6f\x33\x26\x6c\x9f\xd1\x0f\x59\x90\xba\xd8\x91\xf0\xce\xb7\x82\x73\x6b\x40\xf0\x1b\xd8\x65\x09\xb0\x63\x04\xa9\x6d\x93\xda\x23\x3d\xbe\xd1\x8a\xfa\x18\x18\xaa\xf5\x7a\xf9\xbd\xbc\x86\x7b\x39\x7f\xf2\x35\xa8\x3e\x85\x72\x24\xb1\x50\x65\x22\x5e\xec\x03\x9d\xd4\xe2\xd6\x9a\x04\xee\x10\xbe\xa0\x69\x50\x41\xed\xa5\x9b\x05\x8e\xc0\x5f\x49\x04\x8e\xe3\x24\xd1\x6c\x4d\x61\x07\xb6\xec\xd0\x48\x75\xeb\x74\x4e\x93\x65\x47\x1b\x4c\x5f\xe6\x61\x1b\x26\x18\x93\xf9\xd2\xb1\x28\xe1\x35\xf9\x2e\x47\x41\x56\xb2\x71\xb3\xc8\x2e\x9a\x76\x63\xda\xd4\x95\x3d\x30\xe1\x0e\xda\x08\x62\x60\x7d\xec\x33\x72\xb3\x99\x70\xf2\xa8\x4b\x12\xf6\x0e\x6d\xae\x7f\x31\x79\x90\x86\xd3\x8a\x7e\x34\x94\x84\x19\xc1\xb0\x7f\x44\xc2\x15\x9c\x86\xb8\xc0\xcf\xe8\x74\x7f\xc2\xba\xd5\xbf\x47\x53\x56\xcf\xe6\x9d\xe2\xdc\x6a\xd5\xa5\x19\xfd\x65\xc1\x25\x64\x70\x1c\x05\xf7\xc2\x77\xec\xaf\xcf\x4c\x87\xb1\x48\xdf\x1f\x98\x79\xa9\xae\x44\x3c\x55\xae\xa5\x21\x38\xc6\xfa\x01\xef\x0c\x3a\xbb\x5f\x2d\xf9\x0a\x57\xab\x66\x24\x17\x8c\x73\x7b\x54\x91\x5b\x7a\xa2\x9e\xa7\x8e\x8e\x49\xef\x5a\x81\x6d\x8a\x92\xc2\xf8\x1b\x8a\x19\x63\x27\x79\xc8\x92\xd6\x6f\x75\x3d\x51\x8c\x41\xcc\xcc\x9e\x59\x3e\x50\x74\x26\x25\xbc\xaf\xa4\x68\x80\x5c\x37\xa2\x1f\x8e\x29\xa6\x96\x0d\xdf\x5c\x5e\x5c\xa1\x4a\x7b\x05\x2a\x7b\x60\x15\x69\x7a\x02\x10\xed\x6f\x01\x43\xe6\xb4\x84\xc3\xf5\xb3\xb4\x72\x6c\x60\x7d\x07\xbf\xb3\xd5\x4a\x09\xc9\x80\x43\xf2\x1d\xcc\x5c\xc2\x0b\xb4\x75\x4e\x2e\x5a\x73\xb2\xf8\x06\xc2\x20\x4b\x72\xf3\x6a\xb9\xe9\x6a\x62\xc6\x27\x7c\x0a\xd6\x6b\xe7\xab\xff\xc1\x63\xb4\xe8\xfa\xfc\xef\xf5\xe2\x02\xe5\x94\x3f\x4f\x0e\x6b\x92\xb4\xdd\xb9\x53\xcb\xb7\x91\xf8\x31\x66\x03\x69\x38\xe6\xc4\x4a\xd9\x1a\x59\x6a\x55\x73\x44\x0f\xb3\x07\x41\xe6\x60\xb6\xcd\x5f\x86\xff\xa7\x46\xe6\xe9\x72\xb8\x05\xc1\x0b\x7b\x7b\x9a\x63\xc0\x55\x1d\xb8\xeb\x4f\x84\x00\xcd\xe2\x86\x8c\x0d\x0d\x4e\xb4\xcf\x11\x7f\x8e\xc4\xab\x97\x44\xfc\x58\x79\xde\xa7\xf0\xef\x16\xc2\x91\xd5\x5c\x17\xf0\x8b\x73\x1b\x7c\x65\xd0\xc4\x41\xb6\x3b\xc8\xff\x5e\x94\x90\x4c\x02\x6a\x13\x61\xda\xcc\x80\xa9\x3a\x9b\x9f\xba\x3b\x40\x36\x17\xae\xb9\x4a\x56\x85\x41\x84\x80\x11\x95\x42\x34\xae\xad\x70\x0f\x03\x4c\x47\xc7\xde\xf8\x77\x90\x52\x55\xf1\x8b\xdb\x9a\x25\x7c\xe5\xbd\xcf\x0e\x17\x67\x0c\xda\xaf\x13\xb1\xc7\xe0\x9d\x58\xf9\x2a\x96\x63\xaf\x23\x9e\x22\x07\x8e\x18\x0a\x23\xcc\xb6\xf6\x4d\x64"}, +{{0x5a,0x25,0xea,0x5e,0x18,0x2d,0x9b,0xf8,0xe9,0x30,0xa2,0x0b,0x6c,0xf5,0x5e,0x24,0xe8,0x38,0x62,0x78,0x9b,0x38,0x39,0xb1,0xce,0x9a,0x71,0xe9,0x38,0xc4,0x2d,0x37,},{0xc9,0x81,0xfc,0x36,0xf1,0xa6,0xd5,0xf7,0xd4,0x51,0xcd,0x5e,0xf3,0x9c,0xd3,0xab,0x02,0x08,0x7f,0xcc,0x6a,0xf2,0x7d,0xd7,0x8e,0xa8,0x27,0x49,0x7e,0x77,0x9e,0x21,},{0xa4,0xf3,0x5b,0x49,0xd7,0xe1,0x98,0xe5,0xd3,0x26,0xe3,0x53,0xfb,0xb0,0x1f,0xa1,0x3b,0x6a,0xe2,0x60,0xd1,0xe4,0x8e,0x30,0xc1,0xb9,0x67,0x73,0x7a,0x5e,0x79,0x93,0x6c,0x97,0xca,0x2b,0xa7,0x99,0xca,0x34,0xe5,0xe7,0x88,0xce,0xa5,0xac,0x8e,0xd1,0x0d,0x5c,0xd1,0x5d,0xae,0x53,0xe4,0x24,0x32,0x32,0x1c,0xc2,0x6d,0xc9,0x98,0x09,},"\x21\x4d\xd1\x92\x7f\x2c\xac\xd9\x88\x87\x14\x24\x9b\x85\x43\x46\x02\xac\x78\x45\x3b\x4a\xf5\x38\x6e\xee\x39\x29\x5d\x3d\x5a\x22\x67\x80\x6e\xb0\xcf\xf2\xc1\x32\xd3\x64\xc2\x42\x0d\x04\xe3\xf6\xcc\x0a\x96\x7b\xf0\x5a\x10\xff\xcf\x12\x17\xbb\xf3\x15\xe7\x5b\x98\x06\x0f\xd4\x58\xd6\x7e\xba\xad\x93\x80\xf4\xad\xc4\xdb\xdf\x74\xcb\xf1\xc6\x47\x92\x02\xbd\xd7\xfe\xd3\xa9\x46\x69\x7d\xc3\x84\x44\xd8\x8b\xfe\x51\xd4\x1d\x7a\x9b\x38\xda\x60\xb8\x50\xc5\x6b\x48\xba\x98\x4f\x6a\x18\x89\x51\x49\x55\xc0\xda\xdb\x69\xa8\xc7\x36\xcc\x76\xcd\xc4\x9f\x13\xf8\x5a\x8b\xfb\x79\x28\xff\x0a\x0c\x0c\x03\xf1\x7c\x74\xb5\xe1\x06\x2d\x75\x53\xfb\xeb\x9d\xd3\xd5\x08\x1d\xe1\xdf\xd8\xa6\xa9\x97\x66\x97\xc6\xa2\x59\xbc\xf7\xd4\xbe\xf1\xc2\x1e\x0a\xaf\x32\x98\xb0\x42\x1b\x91\x9f\xdd\xfc\x1d\xcb\x3e\xc6\x83\xd8\x6f\xf3\xd4\x23\xd7\x1c\x8f\x2d\x72\x3a\x42\xff\x68\xd8\x2e\x9f\x39\x17\x49\xb8\x29\x98\xdc\xfa\x11\x21\x60\xf5\x2a\x41\x3a\x23\xd9\x5f\xc4\x2c\x3b\xd2\x23\x84\xba\xd7\x77\x54\xa7\x10\xd8\xb9\xf8\x4a\xe0\xa8\x02\xfc\x46\x50\x9e\x7f\x2b\x07\x07\x90\x12\xb4\x3b\xfe\xea\xb7\x19\xbd\xe5\x6f\x00\xe5\x9b\x8e\xdf\x1c\x47\x28\x83\xb1\x98\x5b\x2f\xa6\x99\xa1\xae\x90\xcf\x45\xd7\xac\x58\x0c\xeb\x5f\x27\x97\xde\xf5\xb8\xbf\x4f\x2b\x9b\x35\x19\xa7\x27\xb9\xf2\xcd\x12\x56\xa2\xf0\x76\xed\x22\x96\x49\x5b\x5c\x2d\xf7\x88\x7f\xf8\x9e\x88\xe2\x36\xa1\x4c\xde\x63\x24\xf4\x3d\x68\xd9\x01\x72\xb0\xb8\x8b\xd2\x88\x03\xe9\x99\xdb\xed\xcc\x50\x1d\xb6\x54\x54\x4e\x17\x1e\xc1\xf9\xf3\x2d\x4d\x33\x21\xd5\x89\x39\x2e\x03\xca\x65\x9f\x96\x75\x2e\x1f\x08\xa5\x5d\xb5\x53\xd8\x66\x98\x55\x41\xf5\xbe\xf8\x4c\xe2\xee\x32\x3e\x17\xd1\xf7\xdc\x16\x4b\x50\x51\x5a\x28\x7d\x53\x05\xfc\x28\xc5\x98\x3b\x9e\x53\x98\xb2\x40\x7a\xe4\x72\x96\xfe\x4a\x48\x1d\x22\xff\xb4\xb8\x65\xa6\x6b\x97\xa6\xc2\x79\x35\xdd\x8e\xb8\x69\x94\xb7\x9d\x36\x83\x63\x71\x3f\x10\x1d\xc3\x7f\x42\x9e\xee\x0f\xee\x24\x41\xc2\xdc\x17\xbf\x43\x92\x4f\x0c\x04\x4f\x14\x32\x90\xea\xf3\xf9\xee\x4d\x94\x6d\xbe\x45\x83\x1a\x0d\x83\xc0\x76\xe7\x51\xc1\x4f\x3b\x1a\x72\x67\xf5\x44\x6c\x18\x86\x98\xd2\xb4\x6d\x87\xe6\xf3\xb2\x0b\xb3\xfd\xaf\xe2\x4c\xc0\x96\xbc\x31\x2d\x86\x78\xb3\x8a\x80\xc3\xf0\x52\xa0\xc9\x6d\x5a\xd8\x7a\x5d\xd8\xc1\x33\xcc\x9a\x15\xbe\x33\x57\x4c\xd9\x43\x08\xc2\x4d\xec\x1a\x9b\xdf\x18\x9b\xa6\x87\x19\x9f\x72\xef\x67\x09\x87\x8e\x10\xf8\x7b\xd8\xa0\x3d\xc8\x4c\x8f\xa9\x64\x20\x28\x58\x98\xca\x32\x11\xd8\xb0\xcc\xef\x64\x01\x1e\xc2\x4f\x38\xe5\x74\xda\x34\xda\xb9\xd2\xf0\x02\x10\x52\x27\x89\x0f\x92\x48\x8c\x62\x1e\x57\x13\xe4\x7d\xbc\xb1\xa8\x2a\x6d\xa6\x0d\x8b\x22\x01\xeb\x29\xd4\x94\x49\x33\x60\xed\x5a\x3f\x4b\x52\x25\xea\xe7\x70\x7e\xe0\xb4\xc0\x40\x73\x05\xc1\x67\x54\xc7\xf6\x30\xfc\x85\xc1\x3e\x49\x17\x04\x7b\xcf\xf3\xb2\xa2\x93\xfe\x95\x55\x06\xc7\x26\x4e\xa6\x5b\xf3\xa9\xb2\x5a\xcf\x34\x36\x00\xd8\xfa\x0c\x7c\x1a\x29\x0d\x02\x71\x10\x1b\x7f\x40\xb9\x6e\x7f\xda\xf2\x9d\xef\x9d\x93\x27\xa5\xae\x05\x44\x6c\xb5\xa6\xd3\x22\x45\x3a\x8b\x09\x8b\xcf\x3a\xee\x1f\x70\x4e\x14\xd0\x0b\xe3\x42\xb8\x93\x4d\x19\xe5\x29\x21\x88\x72\xea\x3a\x2f\xb2\x12\x4b\x52\x66\x7c\x01\xfc\xa5\x84\x1c\x66\xe1\xe6\x4a\x1e\x68\x0e\x09\xba\x18\x6e\x04\xd1\x05\x18\x6c\xf6\xeb\x72\x8b\x9d\x50\x2a\x66\xb8\x29\xfb\xc9\x92\xa3\x88\x10\x04\xec\xdc\x80\xad\xfd\x04\x4e\xda\x88\x0f\x8a\xf7\x2a\x14\xfb\x55\x0d\x7c\xc7\x41\x94\xa9\x45\x20\x7d"}, +{{0x42,0x33,0x5c,0x30,0xb3,0xf6,0xb3,0x59,0xce,0xf5,0xaa,0xb6,0xa3,0xce,0x28,0x58,0xa1,0x51,0xb7,0xa4,0xfd,0x78,0xd2,0xfd,0x3e,0xe3,0x6f,0xc2,0x9d,0x24,0x94,0x04,},{0x30,0x1c,0x51,0x5a,0x02,0xa4,0xc6,0x6b,0xc6,0x40,0x10,0x80,0xc6,0xca,0x79,0x23,0xb7,0x83,0x1e,0x3c,0x9a,0x72,0xb5,0x5b,0x14,0x02,0x7e,0xb2,0xe7,0xb3,0xb1,0x52,},{0x67,0xb0,0xf1,0x74,0x49,0x03,0x9e,0x8c,0x79,0x7b,0xf9,0x13,0xaa,0xe6,0xe4,0xf0,0xbb,0x99,0xc7,0x4d,0x6d,0x10,0xc9,0x73,0xb9,0x90,0xff,0xe0,0x3e,0x7e,0xe4,0xab,0x5b,0x35,0x80,0x6d,0xb1,0x5a,0x98,0xc0,0x84,0x6a,0x82,0x7e,0x7b,0xcd,0x53,0x9c,0xd3,0xbc,0x09,0xdd,0x11,0x8a,0xb3,0xe5,0x26,0x63,0xa3,0x57,0xb1,0x29,0x91,0x07,},"\x6d\xa2\x25\x1e\x6f\x55\x95\x36\xb0\x9b\xfa\xfb\x81\x60\xa2\xe8\x10\x2d\x31\xf8\xb5\x93\x24\x08\x3e\x52\x27\xb2\x0c\x3e\x5c\x3a\x06\xe2\x39\x67\x68\xdc\xa3\xec\x76\xdc\x7f\xc0\xeb\x3d\x14\x5e\x62\xed\x07\xfc\x1a\x8b\x1b\x2e\x34\x70\x13\xa0\x52\x72\x74\xd0\xb2\x34\xfe\x72\x50\x26\xa9\xd1\x28\xf8\xdf\x20\xdb\xfa\x3b\x65\x03\x81\x8e\xde\xbd\x7f\x24\x93\x40\x80\x94\x5a\x7e\x1e\xa0\x22\x73\xfe\x48\xb6\xed\x1e\x83\xfd\x16\x8d\x79\x73\xfb\xb7\x94\x1b\x40\x37\xd3\xcd\xa5\x55\xe0\xe8\x9c\x2b\x94\x3f\xb1\xe2\x07\x65\xac\x7d\x4f\xa3\x77\x7f\x35\xa0\xa8\xbc\x11\x8f\x59\x9c\x84\x7b\xe3\xfd\xb2\xd8\xe2\x01\xae\x12\xa3\x0b\xde\xfb\x03\x4f\xf2\x4e\x3e\x2e\x70\x1a\x0d\x17\x33\x73\x40\x78\xbd\x1f\x9a\x69\xbb\xc6\x67\xe4\x61\x21\x1f\x2c\x76\x9d\x29\xdb\x7c\x4d\x62\xd6\xb1\xb9\x2b\x56\xf5\xf1\x8a\x93\x1a\x92\x60\x64\xb7\x8d\xa1\x46\xe1\x8b\x48\x13\x9b\x9b\x39\x86\x2a\xec\x37\xbc\xce\x12\xcb\x78\x94\x29\xe6\x8e\xa3\x81\x12\xd0\xb5\xcc\xe3\x0b\xd2\xd2\x6c\x5f\x7f\xd4\x15\xda\xf7\xca\x31\x7b\x33\x68\xb7\x61\x7d\x45\x25\xe5\xbc\x97\xd9\x46\x1d\x5d\x64\xf6\xb5\xd3\x18\xd0\xbc\x3b\x76\xf2\x5b\x06\x05\x42\x69\x09\xf2\xaa\x0c\xd6\x67\xa4\xf0\xe0\x75\xb9\xa9\xfb\x2e\x9a\x6c\x82\x70\x4d\x8a\x9f\x16\x66\x84\x4e\xdc\x32\xf6\x3a\x3d\x4e\x0f\xd9\xfd\xba\x30\xb5\x1b\x33\x36\xb9\x6e\x9e\xae\x39\x2a\x34\x2d\xe4\x9e\x9b\x5f\xa0\xf9\xb9\x01\x71\xbd\xe0\x9c\xf1\xe9\x46\x49\x91\x40\x00\x81\x59\xeb\x18\x65\x56\x3c\x28\x39\x4b\x03\xa8\xd7\xa5\x52\x27\x1b\x28\x76\x68\x75\x66\xb8\x0f\xd3\xbe\x2b\x66\x33\x2f\xca\xd1\x96\xca\xb8\x52\x7c\x56\xe2\x15\x36\xa1\x41\x65\x2c\xdc\x7f\xa7\x45\xb2\x6a\x33\x1d\x78\x7b\x93\xe5\xe8\x16\xd8\xd8\x51\xa5\x8f\x6a\xc0\x7a\x58\x27\xfc\xdf\x47\x2e\x86\x85\x43\x3a\x40\xca\xc0\xc4\x9a\xa5\x69\x31\x9a\x2e\x57\xb4\x1c\x99\x98\x16\x5e\x69\x72\x3b\xa7\x7e\x5c\x04\x23\xc4\xb4\xca\x07\x18\x7b\xb7\x44\x2e\x7d\x31\xca\xac\xb2\x77\x00\xc7\x1a\xe4\x8c\xd0\x55\xed\x2f\xe4\xda\x36\x3f\x44\x82\x11\x24\xcc\xa1\xbf\x2e\x63\xd9\xb8\xab\xd2\xfa\x41\xb1\x42\x2f\x52\xd5\x58\xbc\x5f\x11\x0c\x86\x3c\xc6\x00\x86\x49\x84\xed\x25\x9b\x73\xcd\xdd\x57\x96\xb3\x29\x79\xed\xdf\x76\xa0\x7b\xc5\x9b\x73\x68\xc4\x8e\x12\x9e\xcc\x0d\x45\x35\xdc\xce\xe2\xc3\xb8\xe5\x6d\xe5\x0e\x6f\x5c\xc6\xea\x51\x5c\xd6\xa0\xeb\xdf\x1c\xa7\x9a\xa2\x79\x48\x21\xad\x2e\x10\x9e\xdd\xa4\x50\xc9\xfc\x3c\x84\xd8\xc9\x6b\xc3\x8d\x4b\x43\x7a\x73\x8f\x81\x8b\x4d\xdc\xb6\x84\x38\x3c\x09\xb1\x1b\x36\x05\x2e\x9d\x2f\x76\xa6\x1e\xb4\xd6\x20\x49\xce\xd5\xf6\x16\x62\xc4\xb9\xec\xd2\x4a\x67\xf4\x51\x9d\x46\x52\x8c\x5b\x2e\xb2\x10\x05\xf4\x9c\x73\xa3\x37\x0c\x68\xe3\x7a\xc2\xb1\x8d\x48\x1f\xa1\x0f\x96\x71\x4f\xe0\x5c\x16\x8d\xf1\x1c\xda\x54\xf1\x4f\x49\x37\xe9\xfc\xe1\xf5\x16\xc0\x37\x1b\x36\xa2\xc0\xa0\x50\xba\xc7\xfa\x51\x22\xa6\xe3\x5e\xc9\xc4\x04\x36\x58\x5f\x31\x6e\x6c\x91\x1b\xdf\xd7\xdb\x4b\x80\xb4\x30\x64\x79\xb8\x2a\x2b\x24\x3a\x52\xb2\xd2\xb6\x27\x42\xed\x11\x28\x27\x90\xcf\x6f\xdc\x7c\x9c\x82\x43\x64\xcf\x25\x63\x6a\x85\x51\x50\xbd\xdb\xdf\x7e\x64\x0f\x9f\x95\x2a\x94\x7e\xc7\x97\x49\x25\xe8\x24\x50\x68\xb2\x92\x10\x1b\x1f\x4b\x20\x18\xe8\x5d\x07\x8c\x2f\xee\xf4\x49\x23\x49\x72\x9a\xd4\xac\xb3\x8f\x1c\x7c\x02\x70\xb6\x1d\x3d\xfd\x76\x36\xc6\xcb\xf1\x81\xe4\xc8\xa0\xe6\x4f\xa0\x61\x32\x55\x3c\x2b\x9d\xb7\x01\x9e\x3b\x3c\x48\x5d\x8d\x5b\x7d\xfd\x5f\x51\x5e\x4d\x71\xed\xe5\x35\xae\x7f\x2a\xae\xdc\x23"}, +{{0xbe,0x6b,0x2b,0xab,0xdd,0xd2,0xdc,0xa1,0xb0,0xe1,0x0d,0x12,0xd2,0x0a,0x9c,0xe2,0x9c,0x67,0x85,0xda,0xc1,0xd6,0x0f,0x2e,0xdf,0xa9,0x4a,0xc2,0x78,0x4b,0xa7,0x66,},{0x39,0x8f,0x22,0xf0,0xef,0xbf,0x8c,0x38,0x35,0x5e,0x47,0x91,0xbf,0x67,0x08,0x98,0x95,0x1f,0xbb,0xd5,0x51,0x8f,0x0e,0x2a,0x60,0x5d,0x46,0x00,0x23,0xf6,0x13,0xf0,},{0x70,0x2a,0xb9,0xac,0xbf,0xa7,0x5e,0xa2,0xad,0xbe,0x4b,0xe2,0xb6,0x84,0x76,0x25,0xae,0xb4,0x09,0xee,0xf9,0x59,0x6f,0xab,0xe3,0x9d,0x2c,0x53,0x3a,0x03,0x43,0x1e,0x5e,0x57,0x95,0x52,0xe8,0xa6,0x4f,0xc4,0xfb,0x7d,0x92,0x6a,0xa8,0xff,0xfe,0x06,0x40,0x69,0x84,0x64,0xc4,0x45,0x4c,0xe3,0x5f,0xe8,0x3f,0xf2,0x63,0x05,0x1a,0x01,},"\x5c\x92\x95\x88\x1b\x7a\x67\x06\x69\xb0\x4c\xbe\x0d\xab\xd8\x96\x93\xb7\x7f\x7c\xce\x0d\x4a\x33\xf5\x2e\x02\xeb\x26\x95\x9e\x71\x3d\x9a\xef\x5f\x95\x44\x2b\xdf\x91\x72\x83\x83\x32\x52\x02\xaa\xcc\xc0\x37\x47\x7e\x36\x66\xfa\xca\xf2\x4e\xac\x95\x34\x87\x9a\xa3\xef\xe1\x8f\xfc\x1a\x5c\x54\xe3\x9c\x76\x87\xd0\x93\x7b\x24\x71\xba\xb3\x89\xb6\x46\xcb\xe6\xb3\xe5\xd5\x96\x1e\xa6\x3b\xd4\x52\xb4\x74\x33\x44\xce\x4c\x79\x33\x74\x52\x37\x95\xc7\x81\xee\x84\xd5\x11\xe2\x94\x11\x19\xba\xd1\xf4\xa7\x46\xed\x9d\xba\x89\xc8\xd0\x75\x1a\x64\x02\x71\x86\x35\xf6\xe3\x1d\x9e\x18\x68\x1c\x69\x56\xc5\x37\x32\x51\xd3\x5f\x53\xba\xa1\x98\x7c\xd4\x48\xc9\x03\x1a\x07\xf3\x2c\x80\x29\x11\x9d\xe3\xa9\x16\x31\xde\xde\x1d\x93\x3e\x0f\xa3\x26\x29\xaf\xe1\xb4\x2e\xb5\x91\xc2\x2f\x87\x33\x1e\x93\xcc\x08\x3c\x23\xf6\x4a\x6e\x5e\x58\x6f\xf3\x1c\xc0\x4e\x42\x3c\x56\xae\x3f\x6a\x73\x94\x6c\x48\xde\x4d\x85\xab\x00\x17\xba\x24\x45\x6d\x69\xb5\x9d\xca\x6d\x40\x3b\x64\xb0\x7c\x40\xd3\xb9\x0e\x12\x23\x21\x5e\x3f\x7e\x87\x6c\x67\x01\x11\x1e\x37\xe5\x17\x77\x08\x87\x31\x0c\xa8\x56\xf0\x09\xa0\xd6\x06\x54\x83\x5d\x94\xe6\x58\x7a\x43\x9d\xa5\xdb\x0a\x0c\x37\xd7\xc9\xd3\x7c\xa1\xd7\x03\xe1\xb3\x22\x76\x31\xad\xac\xaa\x79\x42\x1a\x1c\x43\x9d\x60\x34\x9a\xe5\x77\x41\xb7\xa8\xad\x09\xec\x29\x31\x23\x03\x0b\xf6\xba\xc0\x68\x9e\x53\x1c\xa7\xe7\x27\x18\x22\x3f\x9e\xa4\x3b\xec\xb0\xee\x9d\x9c\x1a\xb8\x45\xed\x1c\xae\x44\x3e\x3c\x5d\x4a\x9b\x1e\xde\x6d\xb3\x41\x7c\x3a\xce\x28\x11\x43\xf4\x2d\x85\xf5\x99\xb3\xb9\xd3\xd0\x5f\xa0\xed\x07\xc1\xec\x35\xff\xab\x03\x05\x16\x8b\x4e\x56\xe5\x8a\xfa\x06\x17\xf9\xa8\x6b\x1b\x5b\x20\x1d\xcc\xb0\x72\xb4\xce\xf0\xbb\x7b\x95\xc5\x2d\xae\xef\x9d\x9e\x74\x24\xa5\xc0\xf1\x48\xf9\xff\xe6\x0a\x5b\x23\xe0\xff\x82\xc7\x30\x99\x2a\xc9\xc1\x7f\x97\xf0\x65\xcf\x0a\xd5\x37\x7e\xac\xcb\x31\xd8\xbb\x92\x3b\xd2\x60\xea\x11\x9e\x6f\xa9\xbd\x69\x83\x48\x2d\x70\xd9\x21\x91\x02\x40\x2d\xc6\xa3\x49\x91\x93\xd0\xc1\xcd\x3e\xd2\xa6\x69\x21\xa9\x8d\xf6\x9b\x79\x14\x13\xf4\x97\x0b\xbc\xe0\x4f\x63\x9a\xf9\x09\xc6\x4f\x45\x60\xdb\x0a\xf6\x00\x3d\xc4\x62\x19\xe8\xad\x2b\x37\x2f\x8b\x5f\x81\xcf\xaa\x04\x1a\xb7\x1a\x34\x8c\x93\x1e\x8d\xfd\xbc\x40\x9c\x22\xd7\xee\x6e\x07\x62\x6e\x10\x4e\xc6\xcc\x7c\x6a\x41\x16\x17\x7f\x93\xaf\x16\xf1\x24\xf1\x96\xda\xb6\x19\xb6\xf6\x98\xc2\xd1\x91\x85\x8e\x96\x0c\x2e\x94\x7b\x51\xf3\xac\x48\x38\x75\x9c\x21\xfe\xf7\xeb\xae\x35\xda\x24\xf5\x5e\xbd\xa9\xb9\x87\x9a\xea\x17\xa6\xd8\xd9\x27\xde\x48\x7b\x17\x5f\xd7\xfa\xa2\x14\x38\xa2\x09\x23\xdd\xbb\xca\x72\xe6\x72\x69\x34\xbd\x6c\x21\xe8\x11\x80\x19\xf6\x5b\x38\x10\xa0\x7f\xa2\x7b\x1c\xba\x64\xd0\xf3\x9f\x0b\xfd\x49\xdc\xfa\xfd\xef\xe3\x79\xbd\xea\x82\xf3\x1a\x9c\x39\xf7\xe8\x1d\x29\x43\x37\xd1\x0f\x1e\x9d\x8b\x50\xeb\xa4\x58\xce\x7b\x75\x3d\x36\x96\x85\x38\x51\x3e\xdd\xb0\xe8\x45\x34\x41\x1c\x4a\xf3\xf0\x21\x46\x10\xee\x39\x01\xa0\xeb\xf3\x16\x17\x3c\xca\xf1\x5c\xd7\xee\x49\x6d\xbf\xc2\x46\x5e\xb8\x34\xdf\x62\x02\x9d\x62\x1f\xe9\x11\x82\x4d\x79\x87\xdf\x2d\x46\x34\x6b\x4d\xce\x1e\xce\x7d\x19\xd5\x51\x18\xc0\x37\xc9\x95\x51\x11\xd0\x7f\x1f\xc3\x62\xc7\x39\xf1\xea\x5b\x27\x5c\x71\xc0\xae\xbf\x59\x65\x5e\x2d\xef\x16\xe1\x23\xb3\xeb\x25\x26\xc3\xca\x5e\x83\xcb\x24\xd5\xb6\x8d\x7a\xc4\x0a\x67\x59\x33\x84\xc5\x63\xaf\xe0\xb5\x52\xad\xaf\x60\x80\x50\x35\xbe\x97\xb8\x06\x76\xad\xeb\x15\x76\x52\x08\x33"}, +{{0xb1,0xe4,0x7c,0xa3,0x1c,0x64,0xb6,0x8a,0xaf,0xaf,0xb4,0x43,0x51,0x2e,0x66,0x78,0x7c,0x65,0x92,0xf3,0x34,0xaa,0x78,0xfa,0x21,0x9a,0x3d,0x93,0xc3,0x3a,0x4a,0xb3,},{0x58,0x11,0x9b,0x38,0xe6,0xa1,0x48,0xa9,0x36,0xbc,0x5f,0x92,0xf4,0xf2,0x9b,0x98,0x2f,0xf2,0xcc,0xa6,0x4a,0x5a,0xff,0xa1,0x4c,0xa1,0xb6,0xa6,0x2f,0xe3,0x28,0xc4,},{0xdf,0xac,0x86,0xdf,0x58,0x6e,0xc3,0x4c,0x7c,0xfe,0xa5,0xd5,0xa6,0xcd,0x11,0x40,0xe5,0x0b,0x6b,0xf0,0x50,0xf8,0xe4,0x1a,0x19,0x0e,0xbf,0xd3,0xb1,0x43,0x2b,0x95,0xa5,0x7d,0x56,0x52,0xdb,0xae,0x8f,0x53,0xe0,0x37,0xae,0x32,0x6e,0x7f,0x18,0xcf,0xef,0x7c,0x77,0x9f,0x40,0x34,0x6f,0x7c,0x0d,0x86,0x44,0x61,0x05,0x93,0xf2,0x09,},"\x76\x7e\xc1\xb3\xda\xf2\x04\x38\x7f\x3f\xd3\xb2\x00\x10\x78\x1a\xfb\x1f\x38\xf6\x14\x47\x42\x13\x28\x7f\xff\x11\x30\x7f\x5f\xf5\xae\x7e\xc9\x45\xa2\xb9\xb4\x87\x00\x49\xd4\x53\x2f\x8f\x61\xc1\xa7\xb5\xf2\x11\xfc\xa2\xe6\x7c\x37\x4d\x96\x21\x9d\x8e\xa9\xde\x73\xf0\xe3\x87\x04\xfc\x94\xc0\xe9\xe7\x2f\x2e\x15\xda\xba\x3f\x88\xf7\x49\xb1\xed\x70\x26\x60\xdb\x1a\x35\x2a\x26\x67\xd4\xdf\xd4\xe0\x0a\x18\xef\xa4\xc6\x60\x9e\xe9\xc9\xa8\x8a\xda\xcb\xbb\x98\x5d\x3d\xe8\xdd\xd1\x7d\x4e\x4e\xb7\xcf\x74\xa1\xda\x91\xed\xb3\x90\x85\x2e\xa4\xcb\x9a\x42\x4f\x7f\xa2\x22\x9e\x08\x30\x33\xa3\x40\x59\x11\x7e\x5e\xfa\x7b\x66\x13\xd7\x5e\x58\xb7\x02\xc6\xce\xe5\xd0\x04\xe8\x59\x9b\x97\x50\x3a\x5f\x10\xc4\xc4\xe5\xb9\x57\x73\x71\xd3\xd0\x5b\x2d\xfb\xf7\xcb\xef\xe6\xd0\x92\xd6\x5c\xbd\x40\x51\x38\xd9\xb0\x4c\x51\x86\x23\x59\x83\xfa\xb6\xd4\xce\x85\xb6\x36\x27\x62\x06\xd7\x4a\x2e\xe7\xdb\x61\x64\xda\xc4\x7c\xce\x78\xf5\x0d\xb9\x9a\xf6\xac\x6e\x70\x64\xc1\x3a\xab\x79\x3b\xe8\x7e\x66\x28\x9c\x94\xa0\x9f\xb0\xa3\x1d\x97\x97\x1e\xdd\x74\xea\x9c\x0c\xe8\x74\xd2\xb7\xd6\xc4\xab\xae\xff\x07\xf8\x70\x22\x51\x51\x94\x6a\x5c\x47\x6f\x6b\x97\x89\x96\xb8\x7d\x8c\x98\x46\x06\xc7\x91\x28\x7d\xa6\xba\xd0\xaa\x44\xb0\x13\x0b\xe8\x86\x71\xa5\x56\xe2\xde\x35\xc4\xcb\x03\x8e\xe7\x81\x27\x35\x30\xac\xe0\xa1\x04\xc2\x78\x09\xae\xe0\x33\xc8\xbf\x90\x29\xd9\x0f\xe7\xba\x06\xaa\xa9\x4e\x16\xa5\x2c\x64\x3d\xfd\x92\xa7\x62\x4f\xbb\xee\x77\xa7\x15\x8b\x2c\xc1\x51\xbd\x3f\x61\xa1\xa7\x6f\x32\xb2\x84\x89\x30\x7a\xcf\x0d\xd8\xc2\x6c\xc4\xad\xbb\xb8\xde\x43\x0d\xb4\xe4\xf5\x83\x08\xb6\xab\x90\x45\x61\x11\xde\xac\x29\x78\x17\x2f\xe1\xfc\x0c\xe4\x98\x08\x8a\xdd\x4c\x31\xc2\x1f\x24\x27\x90\x25\xfe\xb4\x8c\xbb\x7a\x92\x0c\xff\x2d\x28\x71\x05\x87\xaf\x52\xc8\x44\xdb\x8a\x7a\xeb\x7d\xf1\x0d\x43\x41\x1a\x3c\x8e\xee\xbb\x40\x6d\x6e\xfc\xb1\x92\x48\x88\x7d\x45\x0b\x57\x3d\x90\x30\x5e\x1f\x23\x75\x3e\x89\x05\x11\xdc\xc7\x7c\x74\x0e\x31\x6a\xd7\xf5\x2d\x49\x02\x07\x3d\xb3\x99\x8e\x4e\x4a\xcc\x4e\x01\x88\x5b\xd1\x18\x8e\xcd\x61\x65\xae\xde\xd1\xe7\x78\x70\x2b\x6a\x6a\x79\xa9\x49\x99\x10\x2d\xf7\x20\x18\xf7\x92\xf8\xf1\x62\x00\x7e\x81\x2a\xef\x8f\x95\x6e\x12\x32\x82\xbb\xdb\xd0\xc3\x56\x12\xc2\xd3\x47\x3f\x94\x4c\x6d\x76\xbe\x9e\x86\xff\xfa\x46\xcc\xb1\xae\x13\x50\x5a\x4a\x81\xf3\x1b\x84\x26\xb8\xb6\x0d\xe8\xe8\xa7\xc1\x6d\x1e\x16\x65\xb2\x71\x43\x46\x65\xc4\x42\xa9\xc6\xa9\x77\xce\x98\x6f\x69\x93\xb7\x43\x9a\xf0\x3b\x40\x2e\xea\xff\xf1\x45\x6d\x15\x15\x26\xd9\xc5\x8f\x51\x5f\xd2\x48\x5e\x0c\xbb\x32\x4a\x50\x3a\x8d\x49\x13\x44\xcd\xb2\xaf\xf4\xc4\x1a\xa8\xe2\xed\x66\xe5\x80\x83\xbf\x0d\x2f\xbf\x48\x77\xc8\x5a\x4b\xcd\x6b\x9c\xbb\x82\x12\x42\xc9\x41\x47\xe5\xfd\x8b\x7d\xd7\x92\xad\x0a\x28\xd4\x9d\x41\x10\x0b\x43\x1b\xb4\xd8\xc7\x83\x3d\x85\x05\xdd\x9e\x26\x49\xf9\xca\x70\x51\xbe\x68\x71\x2e\xf3\x63\x71\x02\x03\x6b\x00\x26\x49\x47\x3c\xe2\x59\x67\x7d\x82\xc6\x06\x28\x95\xe1\x61\x92\x8b\x75\x2f\x13\xc9\x1a\x45\x95\x5e\x80\xf0\x07\xde\x69\x0e\xdf\x8a\x0e\x5e\xee\x44\x22\xe1\x62\xb9\xd2\xb4\xa9\x21\xd3\xa6\x48\x45\x79\x3a\xa2\x22\x9e\x9c\x23\x9e\x57\xa6\xb1\xa9\x0a\x52\x54\xc3\x51\x2f\x99\x34\x53\x15\xac\x7d\x34\x57\xf9\x15\x42\x96\xc6\x68\x22\xab\xe1\x84\xd6\x4e\x57\x2b\x9c\x38\x49\x29\x58\xe2\x1b\x02\x92\x67\x54\x10\xe7\x34\x8b\x2b\x71\x8a\x0b\x75\x92\xca\xee\x94\x58\x1a\x94\x8d\x2f\x41\xfa\x03\xc6\x1e"}, +{{0xfb,0xd5,0x5f,0xa7,0x43,0xc3,0xa5,0x91,0x0b,0x38,0x57,0xdd,0x0b,0x6a,0xa5,0x84,0xf3,0xb2,0x38,0xde,0x05,0x6b,0x76,0xab,0x76,0x17,0xae,0xb5,0x26,0x38,0xfe,0xf6,},{0xa7,0xa1,0x63,0xc4,0x18,0x3b,0xd8,0x4b,0x75,0x6d,0xf3,0xc8,0xaf,0xdf,0xb9,0xcd,0x5b,0x24,0x23,0x52,0xd9,0x49,0x9e,0xbd,0xab,0x90,0x78,0x5c,0x3b,0xd6,0xdb,0x2d,},{0xef,0xfb,0x29,0xda,0x69,0x85,0x97,0x1c,0x20,0x2e,0x24,0x50,0x30,0x1d,0x49,0x71,0x1b,0xed,0x25,0xfa,0xd8,0x5f,0x61,0x99,0xd1,0xeb,0x1e,0x71,0x91,0x4d,0x96,0x4c,0xbe,0x18,0xe3,0x4c,0xc3,0xe3,0x28,0x72,0xcd,0xec,0x02,0x6b,0xd1,0x19,0xa4,0x1c,0x1c,0x07,0xca,0x41,0xe8,0x2a,0xcb,0xa6,0x2f,0xb0,0xa7,0xc8,0x2a,0xed,0x80,0x0c,},"\xbf\x52\x52\xb2\xae\xca\x11\x63\x77\x1f\x76\x62\x78\x76\x80\x66\xf2\x19\x71\x35\x7e\xa7\x99\x61\x58\xa8\xd6\xe9\x08\xdd\x59\xb5\x99\x71\x34\x9f\xa1\x78\x82\xcb\x92\x24\xb9\x72\xd0\xff\xab\xe8\x55\x10\xdc\xf2\x5a\x9f\x9f\x9b\xde\xfa\xd2\xf4\xca\xdf\xbb\xda\xcc\x1f\xca\x9d\x94\x8c\xb5\x41\x2f\x47\x4c\xad\x23\xb5\xb9\x19\x9b\xf3\xc7\x37\x06\x41\x33\x9b\x75\x0e\x1f\x78\xc2\xad\xb4\x60\xaa\x5b\x21\xb1\xfa\x8f\x97\x71\x4a\xbb\x4e\xd5\xe9\xcb\x51\xd6\xde\x55\x81\x66\x18\xab\xd3\xfd\x2b\x28\x6b\xc1\x1c\x67\xba\x01\x12\x93\x73\xd4\x35\xb3\xe7\xe3\x91\xba\x37\x26\x14\xda\x83\x22\x87\x5e\x46\xa6\x75\xb6\x45\x15\x60\x24\xca\xd2\xdd\x13\xf9\xa0\x81\x61\x6b\xf1\x31\xa2\x43\x58\x89\x4e\x0e\xfa\x1d\x56\x64\x8f\xfb\x42\xef\xb5\x40\x31\xda\x7f\x37\xd1\x97\x61\x51\x55\xae\xdb\x69\xc4\xe7\x09\xc8\xbb\xbe\x7f\xbf\xcb\x59\x83\x47\xac\x5d\x0c\x63\x84\x07\x84\x7b\x28\x1c\xf1\x16\x43\x30\x97\xf5\x66\x21\x58\x71\x9f\xcd\xd3\x7b\xeb\x48\x92\x68\xce\x71\xde\x7d\x70\xed\x92\x5f\x74\x3f\xc6\x3a\x71\x5f\x7e\xee\x75\x49\xfd\xb9\x09\xcc\x45\x4c\x98\x8b\x30\xae\x4d\x77\xd6\x2f\x65\xa0\x7e\x2c\x8f\x93\x62\x38\x5d\x02\x8a\x60\x31\x08\xc9\x45\x87\x2f\x5e\x1a\x97\x41\x98\x78\xed\x49\x54\x2e\x28\x8e\xf0\x7b\x5c\x90\xf5\xc4\x15\x9e\x16\x23\x03\xd0\x80\xf6\xac\x2b\x05\x8d\xdc\xac\x60\x74\x6f\x9e\x1c\x9e\xc1\xdf\x8e\xda\x42\xd6\x27\x38\x58\x6d\x3f\xdd\x65\xdf\x55\xf4\x37\x4f\x32\x94\xe0\x86\x8d\x41\xef\x0b\xb1\xfd\x55\xe0\xcb\xf1\x95\xbb\xfc\xfc\xde\x5b\xdb\x41\xfa\xd9\xa0\x47\x7e\x4c\x90\xca\x27\xfa\x8c\xf5\x03\x36\x2a\x33\xfd\xec\xa5\xa4\xf0\xff\xea\x26\xe8\xd7\xe1\x34\xfa\xd3\xb1\xec\x3d\x05\x60\x55\xbb\xa5\xe6\x5d\x81\x15\x3e\xe8\x31\x87\x3b\x93\x8d\xf7\xd2\xc8\x3c\x2a\x52\xb3\xc2\x21\x82\x7f\x96\x1b\xd0\x08\x36\x22\x32\xd8\x82\xa0\x41\x2a\x04\x7a\xfd\xfb\x85\x97\xc8\x65\xa2\xaa\x2c\x2c\xf5\x18\x99\x34\xa8\x3e\xe6\xb7\x52\xa6\x26\x94\x1e\xdc\xe0\xc2\x0b\x6f\x7a\x69\xf1\xcf\x12\xf9\xa3\x31\xcd\xfa\x9e\xda\x24\xc8\xde\xfa\x76\x9c\xcc\xe2\xef\x74\x6c\x30\x7d\x8b\xb0\x48\x91\xfc\xef\xd4\x9a\xf3\xe6\xf9\x69\x91\xa7\xa2\x0f\x27\xb6\xc0\xaf\x12\x18\xbe\x31\x79\x1d\x1d\x02\x93\xe0\x81\xb9\x0a\xf3\xb9\x2e\xcb\x17\x5e\xc8\xc7\x89\xf7\xa8\x64\x2e\x04\x1e\xc3\xa6\x1a\xae\xfe\xf6\x2a\x80\x7d\x1a\x50\x54\xad\xf8\x32\x3b\xed\x94\x22\x41\x62\x37\x32\xa2\x05\x1d\xc0\x1f\x9a\x20\xa2\x9a\xa4\x8b\x3f\xdf\x26\x5d\x0b\xa6\xc1\x38\xfb\x57\x93\xe2\x87\x50\x02\xe7\xde\x3f\x5c\x3f\xf7\xe8\x3a\xd2\x7d\x11\x1c\x84\x8b\x7e\x6e\x2e\x5a\xd5\xf2\x8e\xb7\xc3\x63\xf9\x5f\x96\x0c\xbc\x42\x13\x36\xce\x98\x5f\x94\x6b\x05\x15\xb1\xbd\xd3\xa8\x32\xc3\xfe\x90\x3f\x7b\x44\xe2\x0c\x92\xea\x80\x82\x6f\xbf\x97\xe2\xa4\xfc\xaf\x2d\xb1\xa0\x86\x98\xdd\x62\xed\xd0\xa8\x45\x89\xd7\x46\x2c\x44\x7b\x4a\x89\x6f\xe0\x08\x60\x04\x24\x96\xbd\x51\xb1\x92\x5c\xb7\x9c\xc3\xb8\x29\x01\x6a\x4c\x7e\x62\x79\x0f\x80\x58\xc5\x46\xf2\x14\x5a\xaa\xef\x4d\x4b\x1e\x27\x3f\xf6\x13\x00\xf8\x00\x8e\x94\x6b\x62\x2f\x60\xe5\x05\xf5\xf6\x29\x0d\x51\xeb\x99\x7d\x20\xfc\x3f\xbb\x3e\x99\xed\xd6\x8f\xf5\xcc\xe9\xe8\xc2\x83\x88\x1c\x36\x4f\xf2\x15\xcb\x50\x04\x5e\x60\xf4\xa7\xee\x45\xb6\xc9\xd8\x64\x47\xf3\x81\x41\xd3\x42\xdb\xc5\x30\x8f\x8c\x66\xef\xc4\x7f\x7c\x45\xf6\xd2\x5e\x65\x64\x30\x9a\x86\x2d\xb9\x0f\x4d\xf3\x31\x78\x7e\xcd\xd8\x9d\x3a\xaa\x46\x05\x3e\x29\xf1\x02\x62\x4d\xdf\xe8\x0e\x8a\x3f\x99\x28\x7c\xec\x19\xfa\x83\xe4\x4d\x55\x7c\x04\x41"}, +{{0x5d,0x66,0xce,0xb7,0xc6,0xe5,0x8c,0xac,0x91,0xe2,0x88,0x27,0x91,0x70,0xe8,0x18,0xe7,0x87,0x18,0x0c,0x6b,0x42,0xdf,0xa1,0x68,0x78,0x7d,0xd0,0x7f,0x80,0x9f,0xa4,},{0xef,0xc9,0xb3,0x5d,0xb8,0x1f,0x34,0x61,0x98,0xa7,0xac,0xc6,0x9f,0x65,0xfd,0xfb,0xf4,0xc2,0x2e,0x68,0xdd,0x76,0x12,0xe3,0xb8,0xec,0x68,0xd3,0x78,0x55,0x3b,0x8d,},{0x6e,0xf2,0x64,0xab,0xf8,0xb0,0xe5,0xc2,0xd7,0x93,0xb2,0xc7,0x52,0x79,0x61,0x4a,0x39,0xc7,0x75,0xeb,0x2b,0xcc,0x08,0x91,0x06,0x7a,0xbc,0x61,0xf6,0xd6,0x44,0xa6,0x9f,0xf8,0xf8,0x14,0xa3,0x05,0x22,0xcc,0xa9,0x05,0x36,0xf0,0x12,0xc6,0x28,0x3a,0x76,0xc3,0x2b,0x89,0xee,0xe1,0xbd,0x9a,0x43,0x36,0xf4,0xfd,0xda,0xc8,0xdc,0x0b,},"\x94\xd7\x2f\x6d\xec\x4f\x7c\x92\x06\xb4\x15\x10\xce\x71\xa0\x29\x55\x60\x4f\x3c\x5d\xe8\xe4\x47\xd5\x87\x18\x65\xa7\x58\x98\xa4\xd2\x07\xa2\x6c\xf3\x3d\x10\xca\xf0\x5a\x0b\x6e\xd0\xd3\x89\xfe\xe9\xed\x49\x27\x50\x98\xa8\x8e\x1c\x0d\x83\x04\xe8\x1b\x40\x74\x21\x4c\x7a\x5c\xe1\x57\xeb\x26\x17\xef\x04\xe1\x32\x4b\xa9\x42\x12\x9f\xaf\x32\xc3\x1c\xb4\xaa\xe4\xa5\x91\x6c\x75\x08\x08\x72\x68\x56\xf7\x18\x0e\x57\x97\xed\xe4\x43\x62\xd7\x47\xd7\x0c\xec\x15\x9d\x3b\x6a\xce\xc6\x3a\x51\x4c\x7e\xf3\x1b\x2e\xcd\x16\xdb\x7f\xe6\x8e\xa9\xc5\xea\xd9\xd8\x70\x92\x18\x00\x34\x8f\x69\x54\x12\xf3\x09\x3e\x61\x98\x5a\x31\xea\xdb\x79\xb5\x9d\x91\xdd\x9a\x37\xf8\xd4\xef\x7a\x5d\xdf\x22\x3d\x4b\x24\x77\x4c\x2e\x44\xe3\xf2\x71\xff\xb8\x50\x0d\x59\x53\x81\xb3\xdf\x2e\x8e\x6b\x79\xee\x65\x53\x5a\x51\x9a\x43\xea\xa5\xe5\x2b\x25\x6c\x26\x43\x30\x5e\x31\x70\xcb\xe5\x76\x06\xa0\x54\x5f\x85\x86\x56\x5c\xfb\x75\xbf\x5e\x95\x64\xc6\x2a\xf0\x5f\x15\xee\x6e\x62\xaf\xee\xf8\xc2\xc7\xa9\xda\xe2\x35\xc9\xed\xd1\xd7\xc2\x5c\xf4\x9a\xdc\x03\x3e\xe7\xb5\x83\xf5\x18\xbc\x16\x8e\xa4\x88\x36\xb5\x0f\xfe\xdd\x20\x32\xb3\xf6\x30\xcc\x56\xda\xad\xd5\x13\xeb\xda\x86\x48\x23\x61\x0f\xc6\x7a\x72\xb9\xa7\xd8\x11\x71\x05\xc1\xc7\x1d\x85\xa9\x6b\x1d\x27\xa4\x41\xfa\x1e\x7c\x6c\xf8\x02\x33\xa4\x9f\xe0\xe7\x6a\x40\x27\x8d\x06\xe3\x43\x47\xd8\x7b\xe7\x7b\x98\xde\xd5\xe2\xa3\xea\x1a\xfb\x13\xbe\xe1\xe6\xcd\x6c\xa6\x3b\xe5\x4f\xcf\x88\xa2\x0c\xcb\x7a\x9f\xc3\x24\xbf\x61\x43\x20\x1b\x44\x48\x3b\xcc\x96\x40\x33\xda\xb7\x1c\xf8\xf2\xa5\x91\xfc\x05\x0d\x57\x24\xe9\x5a\xa5\x0d\x32\x89\x6e\xec\x0f\x3b\x34\x31\x1d\x2a\x99\x34\xe9\xf8\x52\x97\x7e\x25\x3f\x15\x30\x4c\xae\x24\x16\xc2\xc4\xfc\xd8\xf1\xfe\xcc\x3f\x1f\x64\xbb\x79\x75\x99\x29\xab\xb0\xe8\xe8\xf5\xf7\x29\x3d\x69\x1a\xf2\x2a\xbd\x3b\x2a\x67\x70\xb0\xcf\x14\x46\x08\xf2\xd6\x2c\xc7\xe5\x2b\xfe\x33\x3b\x2e\xd2\xde\x39\xb9\x9a\xfd\x37\xe3\xac\xf0\x7e\xda\x37\xdd\xf0\xdf\x02\x9b\xff\x2e\xc2\x25\x44\xb6\x0b\xd7\xdb\x23\x8d\xf1\x97\x5f\xfa\x00\x75\xa8\x2a\xbd\x8d\x6b\x05\xb2\x67\x18\x0b\x87\x0e\x21\xab\xf3\x69\x81\xae\x77\x68\xde\x53\x99\x3b\x30\x4f\x1c\x54\x53\x87\x2f\xdf\xa8\xed\xad\x45\xf8\x00\x1a\xa0\xe7\x34\x2b\x3b\x58\xec\x0f\x38\x9d\xcb\xc2\x71\xfb\x0f\x90\x00\x62\x87\x57\xab\xba\x58\xc0\x57\xe1\xa0\x89\x9f\x6f\xaf\x15\xf3\x74\x0f\x31\x43\xf5\xc0\xb7\xa9\x15\x96\x80\xde\x8c\x55\x72\x66\x44\x1b\x3b\x01\xca\xac\x12\xec\x27\x8f\x5a\x10\x25\xdf\x53\xed\xb6\x13\x4c\x96\x66\x3a\x96\x66\xae\x3b\xaa\x90\xfc\x83\x51\x11\xef\x05\x1b\xd9\x12\xf6\x79\x67\x44\x91\x13\xb6\xa8\x5f\x71\xdf\x8c\x60\x37\x72\x4e\xb8\xfc\x7d\x83\x19\xbc\x03\x85\xbe\x9b\x0e\x99\xe9\x5f\x9a\xed\xca\xe8\xd4\x5a\x51\x44\x76\xf0\x5b\xcd\x72\x35\xc0\x13\xeb\xc3\xae\xa9\x12\x3c\x67\xaa\x6f\x3b\x79\xc8\x5e\xa5\xdb\x15\x9e\xef\xad\xfb\x75\xa5\x0a\xc6\xb9\x5b\x49\x6b\x55\x72\x58\x1a\x76\x11\x2f\xf6\xdb\x26\x3f\xc1\x4c\x58\x18\xaa\xd5\xbc\xa3\xb2\xcb\x3a\xc8\x11\x6d\x42\x94\x82\x78\x1e\x06\xf6\x1e\x75\x63\xe6\x50\x5e\x51\xc8\xff\x99\x8b\xf8\x4a\xed\xb5\x20\x2e\x2f\x9f\xf4\xc2\x68\x98\x20\x29\x6c\xc6\x96\x03\x09\x1b\x8b\x81\x8f\xbe\xb2\xaf\x5f\x4c\x57\x06\x0d\x98\xc1\xa9\x04\x84\x3a\x70\xbf\x97\x5b\x3c\x3c\xa6\x03\x1a\x4c\xad\x5b\x4b\xbf\xba\x7e\x9b\x47\x49\x1a\xb7\x40\xd9\xeb\xe4\x1d\x76\x88\x10\xcb\x8c\xc5\x1a\x93\x7f\x7e\x3b\x22\xe3\xcf\x07\xce\xae\x0c\xe2\x08\x31\x49\x5a\xfc\xdd\x8c\x1a\x98"}, +{{0x62,0xed,0x86,0x82,0xbd,0x3a,0xb3,0x96,0x6e,0xba,0x3b,0xff,0xb7,0x75,0xa3,0x18,0xa0,0x3d,0x99,0x93,0x19,0x79,0xe9,0x9f,0xeb,0x2d,0xdb,0xd6,0x94,0x55,0xa0,0xef,},{0xd3,0x2a,0xda,0x17,0x8b,0x3e,0xc7,0x70,0x0c,0x47,0xdd,0x6d,0x36,0x53,0x22,0x03,0x3f,0xe4,0x31,0xc3,0x02,0xb4,0x6f,0x8d,0x58,0x79,0x8e,0xd8,0x33,0x71,0x56,0x6b,},{0x3d,0xa8,0xd1,0x4d,0xc4,0xe7,0x1f,0xe6,0xc3,0x2e,0xde,0x46,0x37,0x88,0xe4,0x1b,0x82,0x6b,0x4e,0x21,0x60,0xba,0x10,0xc9,0x5f,0x1c,0x8a,0x27,0x49,0xaa,0xd8,0xf1,0x2e,0x98,0xae,0x24,0x68,0x30,0x3b,0xaf,0x69,0x08,0xbd,0xb3,0x5e,0xf3,0x8a,0x5e,0xcd,0x77,0x74,0x1e,0x72,0xee,0x3a,0x42,0x7f,0xd9,0x04,0xda,0xe6,0x6f,0xcf,0x03,},"\x9e\xb1\x3b\xc7\xfa\xcf\x51\xa1\x80\x54\x1e\xc1\xdc\x5f\x5a\xcb\x14\x8c\x8d\x5e\xad\xcd\x2c\x4e\xf0\x68\xbc\xdd\x11\xb3\x49\x25\xea\xbf\xaf\xab\xfe\x82\xa2\x84\xbc\xba\xee\x13\x81\x15\x2a\xf8\xe5\xe0\x9f\x03\x7c\xf1\xbb\x64\x84\xac\x18\xe3\x73\x59\xbf\xaa\x4c\x87\xaa\x07\xd3\xd1\x4e\xd0\x89\xb0\x53\x91\x0d\x1f\xa4\x73\xf7\xbc\xe1\x43\xe2\xa5\x9c\x4d\xaf\x99\xb6\xc6\xe4\xe9\x29\x1d\x97\xc8\x64\x71\x2a\xf3\xea\xba\x53\xce\x25\x17\xa4\xf7\x5c\xd7\xec\xf2\x78\xf3\x4e\x22\xb7\xdf\xfd\x08\x8f\xa5\xec\xad\xc0\xdd\x22\x13\x5e\x42\xa5\x36\xc6\x84\xf2\x19\x5d\x31\x5f\x69\x24\x57\x1e\x46\x3f\x5c\xfc\x11\xb9\xf9\xd0\x5a\x7e\xa1\x1b\x98\xa1\x69\xa1\xe3\x93\x60\x97\x3c\x50\xad\x45\xc7\x49\x1b\x57\x13\x8e\xc0\x50\xf4\x3c\xbd\x5d\x17\xeb\x3f\xe0\x01\x3e\x3d\x28\xd5\x26\x05\x4e\x07\x63\x31\x52\x24\x6f\x16\x55\x4f\x30\x54\x74\x9e\xea\x68\x7b\x9c\x37\x1b\x40\x9c\xd3\xec\xef\xb1\x11\xa1\xd6\x00\x40\x73\x44\xe6\xd6\xec\x38\xc6\x0f\x6e\x54\x5a\x92\x38\x2e\x46\xc4\xd1\x13\x12\x5d\xbe\x5b\x98\x26\xe1\x27\xf1\x01\x81\xa3\x5a\xcf\xff\x28\xab\x37\x64\xca\x7f\x23\x8f\xf4\x79\xfd\xbc\x45\xb7\xa2\xad\x0f\xf5\x38\xc8\xac\xd0\x01\x8d\x44\x70\xfe\xbc\xc6\xa3\x07\x65\x1c\xb5\x83\x2f\x32\x6b\x19\x24\x1b\xe9\x86\x7e\x4e\xca\x6a\xe3\x6f\x0e\x2d\x83\xfd\x77\xb9\x72\x02\xb3\x64\x71\x6e\x36\xd1\x89\x5a\x36\x85\x3e\x7e\x76\xe8\x8f\x62\xdb\xbf\x77\x26\xc2\x18\x05\x69\xc6\x66\x73\x83\x7a\xd7\x2f\xf9\x36\xcf\x0e\x2f\xdb\x9e\xc6\xaf\xcc\x79\xf8\x82\x9e\x15\x7f\x95\x22\x88\xf4\xe0\x0d\x04\x10\xa7\x22\x53\xbf\x60\x5e\xdd\xce\xb0\x14\x40\xde\xe5\xdd\x32\xb5\xa8\x03\x43\x9f\x03\x8c\x06\xaf\x1c\x90\xb2\x7b\x5f\xe9\x84\x3c\x27\xae\x76\x60\x9c\xbf\x83\x28\x35\xc0\xe3\xc4\xbb\x59\x97\x6c\xce\xde\x44\x87\x86\xd9\x1e\x43\x8e\x07\x75\xc0\x6a\x92\xd0\xf0\xb8\xdc\x0e\xf6\x82\x60\xf7\xdd\x9e\x68\x71\xc4\xd0\xc0\xc0\x94\x63\x85\x26\x15\x21\x85\x16\xf4\xa6\xde\xbf\xdb\x46\x27\x3b\x28\x33\x82\xcd\x9c\xa7\x44\xab\xf9\xfd\x43\x91\x94\xb8\xcf\x1b\xdb\xb3\x17\x5c\xa9\xc5\x7a\x1c\x37\x3c\x41\xfc\xe9\x2b\xd5\xfc\x01\x2b\x19\xa0\x69\x8a\xef\x37\xba\xf8\x06\xae\x09\xad\xd8\xcb\x97\x2a\x9e\xf9\xa7\xa5\xa9\xb1\xfd\x9a\x41\xd8\x54\xc3\x0c\xca\x13\x96\x14\x0e\x20\xc2\xb9\x86\x54\xfe\x6e\x51\x1b\x62\x6a\x43\x91\x5b\x22\xfb\x2d\xad\x74\x7b\xa7\xfe\x74\x60\xd8\xce\xbb\x20\x06\xfe\xa1\x9b\x32\x84\xb0\x9c\x06\xa6\xf5\x2f\x17\x9a\x32\xbe\xb5\x63\x57\xb9\x29\xa6\x59\xf0\xfe\x6a\x26\xb6\x97\x03\x3d\xef\x58\xba\x60\x3f\x43\x0f\x74\xaa\x35\x07\x09\x81\xdb\x74\xcc\xf1\x91\x90\xa1\xfb\x05\x14\x4e\xc0\xa0\x9a\x51\xe5\x47\x65\x06\x97\x30\xb0\x9a\x7a\x23\x31\xff\xb3\xde\x2a\x7e\x02\xc5\xe1\x84\xda\x40\x13\xdf\xe9\x37\xc3\x71\x11\x75\x24\xf7\xb2\x10\xba\x60\xe2\x69\x2d\xcd\xce\xf3\x6a\xb2\x27\xb4\xc4\xf0\x2a\x9f\x48\x89\x72\xb8\x47\xf0\xd6\xb5\x9d\x02\xee\x54\xfe\xde\x88\x21\xdb\x6c\xf7\x31\xcc\x8a\xc8\x95\x35\x0a\xc5\xcd\x4d\x6b\xaa\x3a\xd0\x36\xf0\x6f\x20\xd1\x0a\x14\x0c\x4a\xd3\xd1\x0c\xa9\x85\x53\x2e\x31\x60\x46\x27\x73\x38\x5a\x2e\xb5\xe4\x64\xd5\x28\xe1\xe5\x9c\x29\xf6\x6b\x3d\xe5\x9e\x9e\xa2\x8a\xf3\xf9\x7b\xfc\x55\x89\x03\x57\x52\xa5\xa5\x52\x3d\xec\xd2\xdf\xf0\x1f\xc0\x0f\xf3\x1b\x30\x15\x2f\xf5\xda\xfa\x33\x1c\x6a\xb1\x58\x73\xaf\x41\xaa\x96\x0a\xac\xe7\xd2\xcb\x4f\x95\xc2\x3d\xf4\x4b\x9e\x6c\x6e\x2f\x86\x78\x8a\x87\x2f\xd3\xa5\xcb\xe4\xac\xc9\x58\x10\xda\xa0\x9d\xcc\x1d\xf9\x33\x46\x5e\xf0\x40\xc5\x3d\x9d\x95\x9f\x9d\xad"}, +{{0x4e,0x57,0xf0,0x31,0x1f,0xff,0x0e,0x5d,0x53,0x88,0x49,0xb1,0x21,0x6f,0x69,0x5b,0x1a,0x52,0x77,0x94,0x17,0x08,0x20,0x4d,0xb2,0xf0,0xc1,0x5b,0x3c,0x73,0xc8,0x2a,},{0xe3,0x37,0x1f,0xe2,0x36,0xad,0x2f,0x6f,0x42,0xf9,0xe1,0xfa,0x4e,0x1e,0xda,0x2c,0x3e,0x29,0xc3,0x6c,0x8a,0xd2,0x21,0x8a,0x3c,0x03,0x79,0x82,0xf0,0xb5,0x79,0xec,},{0x4f,0xdc,0x7b,0x6e,0x28,0x27,0xf6,0x4b,0xa3,0xc0,0x33,0xc7,0xfb,0x6d,0x1b,0x35,0xdd,0x68,0x0f,0x53,0x29,0x99,0xa0,0xd7,0x7a,0xeb,0x27,0x6c,0x31,0xbd,0x9e,0x39,0xc6,0x70,0x97,0x8b,0xe4,0x72,0x43,0xc1,0x13,0x22,0x3a,0x57,0xaa,0x10,0x23,0x31,0x50,0x67,0x8b,0x40,0xdb,0x78,0x59,0x1c,0x04,0xd0,0x8d,0xf5,0x7a,0x70,0xa2,0x09,},"\x05\x2a\x1f\x41\xeb\xfd\x4b\xf6\x5e\xfb\x0e\xc8\xe7\x4d\xd7\xb3\x06\x5e\x9c\x48\x2c\x49\xb9\x92\x62\xe6\xdf\xa8\x40\x7d\x9e\x31\xed\x34\xd2\x29\xba\x41\xfc\x49\xa9\x4a\x13\x09\xf9\x90\xa9\x9c\xb9\x90\x2f\xb8\x4f\x4e\xde\x91\xbb\x64\x71\x45\x64\xa9\x13\xd5\x74\xd4\xa3\xc2\x86\xf0\xa1\x92\xa7\x8c\xe2\xd5\x5a\xae\x5c\x9f\xb0\x57\xff\x36\x12\x00\x18\xb2\xa8\xb5\x4d\x98\x08\x55\x37\xea\x64\xae\xa9\x99\xd5\x32\x1c\x78\x80\xb3\x6a\xb4\x30\x18\xea\x2c\x92\xa5\xe6\x83\x50\xd3\xde\x85\x26\xe2\xc8\xbc\x91\x41\xf4\x34\x9a\x18\xa3\x4f\x21\xde\x0a\xbb\xf2\x93\x09\x87\x56\x7f\x0a\xaf\x8e\xb1\x91\x45\x58\x0d\x71\x30\x6c\xe8\xa6\x9e\x79\xf8\xee\xa2\x6c\xfa\x0b\x8b\xeb\x49\xcc\x5a\xa2\xbc\x77\xb7\x97\xd4\xf8\xd5\x03\x26\xff\xb9\x37\x39\x9e\x94\xfd\xec\x85\xe1\x92\xf1\x27\x2a\x80\xe9\xa0\xeb\xba\xf5\xd0\x1f\x1b\x97\x06\x08\x02\xbd\x4a\xf3\x4c\x0f\x7d\x7e\x98\x54\x3f\x9d\x66\xd6\x0e\x0e\x6b\xc0\xbf\x9c\x99\x0b\xe3\x1e\xea\x19\x78\xff\xd1\x67\x33\xa8\xab\xe4\x95\x58\xb3\xad\xd0\xdc\xe6\xde\xfd\x64\xdc\x04\x3f\x15\x19\xb1\xe9\xbe\x66\xe0\x6e\x41\xec\xab\x16\x8c\x83\x39\xa8\x5e\x0b\x91\x38\x18\x64\x4e\xa7\xc5\x33\x44\x68\xfd\x71\x96\xa0\x1e\x1d\x4c\xe8\xdd\x1e\x7e\xe3\x13\xdd\x53\x50\xb8\xdc\xe4\xf5\xd7\xa6\xac\x09\x85\x7c\x4d\x3d\x0f\x10\xa3\xd9\x06\x26\x09\x75\x45\x92\xad\x10\x77\xb2\xe2\x09\x6f\xc9\xe5\xb1\x97\x8c\x98\xb5\x66\x0d\xdf\x51\xb4\x6e\xde\x9f\x9d\xcd\x41\xb2\xef\x44\xe7\x9f\x6d\xaf\xf7\xd3\x62\x68\x70\xe2\x24\x3c\xaf\xb2\xf4\x36\x79\x39\x10\x9e\xd9\xc0\x14\x84\xb7\x9e\xaa\x30\xa1\x89\x1e\xa1\x8f\x98\x4e\x16\x1d\xcd\xd1\xbd\xa3\x71\x34\xbf\x67\x35\xd2\xb2\x14\x9b\x48\x98\xda\xcb\xfd\xa6\x1e\x60\x02\xd7\x2a\x6f\xc5\xd2\x1f\x10\x98\x21\x32\x31\x13\x2d\x56\xdf\x68\xd6\xa9\xbf\xdf\x4e\xdd\xc0\x52\x4d\xb8\xfd\x8f\x24\x88\x52\x04\x9a\x68\x25\xa5\xed\xd2\x36\x0c\x00\x9a\xf2\x4f\x0a\x94\xc5\x07\x9d\xdf\x6f\xe7\x96\x94\x5f\xf9\x84\xaa\xc3\x64\x11\xce\x80\xd9\x87\xc6\xed\x67\xb6\xb0\xdd\xb6\xd4\x17\xf6\xe8\x09\x99\x1e\x72\x9d\x14\x7d\xd0\xd2\x1a\x09\x32\x41\x36\x3c\xf4\xef\x3b\x8e\x3b\xa0\x2d\x48\x66\x33\xb6\xb2\x17\xf5\x49\x3e\x2e\x43\x2b\x8c\x2e\x27\xd0\x0c\x5b\x56\xc9\xb6\x5f\x9a\xed\x49\xce\x93\xd7\x7e\x7d\x0b\xf5\xf9\x2f\x92\xf5\xbb\x4b\x59\x5d\x66\xf8\x87\xa4\x88\x01\x33\xf9\x70\x46\x3a\xb8\xb7\xf3\xd8\xc7\x94\xc0\x40\x6e\x88\xe3\xea\xb9\xae\x65\xf1\xa1\x85\xd6\xe3\x9e\x2d\xd6\xab\xb8\xa9\x3d\x2a\xc4\xb9\x20\x83\x98\xda\xb8\x9d\xbc\x07\xa4\x1a\x50\x26\x40\x26\x41\x2d\xa0\x22\xb5\x8f\x48\x9d\x4d\xba\x31\xfb\x88\x2f\xec\xb1\xff\x8c\xa1\x82\x0d\xda\x18\x65\xaf\x15\x51\xe4\x6c\xd6\x18\xb4\x4c\x4e\x6e\xb3\x03\x7a\x93\x33\xfd\xcc\xef\x4b\x89\x51\x89\xe4\x39\x0e\x93\x14\x5d\x26\x4c\xa5\xf4\x52\x02\xa3\xeb\x28\x53\x59\x3f\xee\xd6\xc6\x6d\xbb\x28\x8f\xf3\xa3\xc0\xfa\x83\x2b\x2a\xa7\xe5\x29\xb5\x56\x88\x97\xb3\x14\x94\x02\xa9\x07\xe7\x41\xe1\x01\x1c\xe0\x73\x1c\x91\x5f\x91\x44\x6a\xa0\xd5\xca\xf0\x59\x5f\x18\x16\x43\x4f\xa4\x57\x6d\xb3\xbc\x31\xe1\x0c\xc2\xaf\x33\xf6\x13\xf0\x3c\xa7\xb9\x49\x1a\x0a\x34\x05\x25\x27\x1a\xb5\x37\xf6\x2a\x11\xa8\x4d\xa0\x1c\x7f\x55\x81\xad\x57\x38\xc3\x72\xb5\x33\x5b\xab\x9b\x2b\x9d\xc2\xfe\x91\xe9\x33\x30\x4d\x94\x01\xba\x8e\x1c\xe8\xdc\x55\xc4\xfb\x46\x6b\x3a\x8e\xd7\xf5\x3a\x12\x2b\x83\x81\xd8\xf2\x90\x47\xd7\x26\x4d\x06\xfb\x51\xec\x3e\x70\x07\x1f\x27\x36\xa4\xe7\xe1\x53\x7a\x52\xfa\x25\x6a\x04\xee\x86\xfa\xd2\x7a\xd2\xd2\x8a\x9b\x36\x29"}, +{{0x39,0xf0,0x55,0x6b,0x1c,0x5d,0xca,0xb3,0x87,0x10,0x41,0x81,0xbb,0x30,0x4d,0xe0,0xcf,0x81,0x59,0x20,0xb9,0x72,0xe8,0x71,0xd5,0xf0,0xfb,0x41,0x6d,0x8e,0x61,0x6a,},{0xd8,0x5f,0xb7,0x6e,0x78,0xc3,0xd5,0xbb,0x7c,0xa6,0xb0,0x5b,0x31,0x01,0x91,0x82,0x1a,0x4a,0x7d,0x2d,0x9b,0xdf,0x02,0x29,0x2c,0xc7,0xae,0xa5,0x64,0x2e,0x48,0x19,},{0x01,0x66,0xaf,0xed,0x5a,0x8f,0x7c,0x3f,0x7a,0xd6,0xf3,0xfd,0xd2,0x93,0x8e,0xff,0x00,0x89,0x8e,0xab,0x81,0x5c,0x54,0x55,0xac,0x90,0xfb,0x51,0xf6,0xe1,0x85,0x4f,0x0c,0x07,0x53,0x19,0x4b,0x76,0x29,0x59,0x4c,0xc1,0x27,0x1b,0x00,0x34,0x31,0x22,0x1c,0x57,0x4b,0x0c,0x0d,0x19,0x08,0x2f,0xee,0xda,0x51,0xb0,0x84,0xae,0x5e,0x03,},"\xa8\xd0\x34\xe1\x70\xfc\x22\xb5\x7a\x44\xaa\x62\x69\xed\x1f\x01\xcb\xa8\x01\xf3\x98\xdf\x1a\xdf\xe7\xdf\x04\x4d\x5f\xa4\x68\xbb\xfa\x8a\xf4\x74\x9a\xb5\x0d\x24\xd6\x2e\x31\x3a\xc0\xe7\x3a\x64\xb4\x28\x2b\x74\x62\x6a\xf2\xb4\xa4\xb5\x4c\x27\x4e\x5a\x6b\xc2\x80\xb6\xdc\x25\xdc\xfe\x07\x81\x4c\x9c\x81\x6d\x2f\x9e\x36\xc0\x5b\x9b\xfe\xdf\xf7\xc6\xb0\x3c\xdd\xeb\xd4\x73\x5e\x09\x93\xd3\xc3\xfd\xc6\x54\x04\x43\xc6\x00\x5e\x90\x0b\x40\x35\xe1\x40\x8a\x85\x01\x6a\xa1\xb8\x92\x02\x99\x0e\x5d\x84\xed\x99\x81\xc2\x9b\x77\x20\x6d\x7c\x11\x30\x52\xa2\x02\x98\x12\xc6\xea\x13\xaa\xe8\xbe\x0a\xca\x7a\x33\x06\xbf\x61\x72\x42\x29\x8e\x68\xbe\xcd\x0d\x5d\x16\xc8\x88\x7f\xd1\x95\x0b\x77\x85\xa4\x6b\xb0\x22\xb3\x9f\x76\x07\xcd\x89\x13\x71\x8b\x30\x17\xfc\x3f\x86\xd6\x93\x3f\x75\xee\xc5\x19\x1a\xd1\xf1\x98\x9a\x8d\x26\x17\x86\xf5\x6b\xe4\xa9\x88\x37\x0d\xb8\x29\x61\xa9\xfc\xc9\x53\x54\x2e\x51\xc2\xe0\x86\xdb\x0e\x02\xb4\xfc\x34\x66\x94\xab\xd9\x05\x9d\x5b\x11\x72\x26\x47\x66\x9e\x7f\x17\xb7\x45\xa6\x0b\x02\xf7\x33\x9f\xcc\x99\xbc\x35\xd5\x9f\xd0\xb9\x8b\x60\xc3\x14\xab\xd4\xbf\x8a\xa4\xb7\xea\xe0\x9d\xd0\x09\x7a\xcb\x91\x89\xf0\x2c\xf8\x5a\x25\x1a\xc9\x2a\xaf\x69\x1b\x15\xcd\x4a\x33\xb5\x8d\x76\x63\xab\xd0\xb0\x44\x43\x33\x04\x4a\xf5\xce\x20\xfd\x71\xcb\xaf\xfc\x0d\x29\x83\x58\x19\xf4\x92\x93\xfc\x26\xe7\xf9\x78\x7f\xc3\x68\xc4\xd3\x5c\xae\x92\x74\x7f\x21\xca\x1f\x3e\xfd\x87\xa0\xd8\x10\x41\x99\x41\x64\x82\xd0\x7b\xfe\xc1\x28\x1c\x66\xf5\x65\x28\x5b\xf6\x72\xd5\xe7\x48\x64\x00\x66\x0c\x01\x75\x55\xe9\xfa\x2b\xf6\xa4\xe7\x02\x7f\x0e\x7e\x5f\x44\x3e\xd6\x58\xb7\x5b\x59\x06\x12\xab\xde\x0d\x80\xd1\xa2\x6c\xb8\xbd\xe7\x6b\x99\x6e\xff\x6a\x74\xe3\xda\xfc\x59\xeb\x1b\x58\x4f\x45\x97\xa2\x39\xcd\x83\x9f\xa1\xf1\xb7\xbd\xa1\xa2\x4d\x15\x0c\x4e\x24\xb9\x1c\xec\x01\xee\x53\xa3\xac\x85\x2a\x91\x2d\xe1\x95\xa3\xc2\x9d\xd7\x07\x9a\xa7\xe8\x8a\xa8\x1e\x9d\x31\xb8\xfc\xcd\x43\x5e\xda\x11\x3c\x3f\x82\x45\x8b\x7f\x79\x33\x57\x2b\x77\x67\x53\xc9\x22\x40\xcc\x03\x61\x58\xa4\xba\x0e\x56\xef\xed\x53\xec\xb5\x3f\xc0\x93\xfe\xad\x14\x34\x34\x85\xae\x5d\x91\x05\xbb\x16\x3f\x26\x25\x14\xe4\x8b\xe7\x41\x59\xc9\xfa\xbc\xb7\x1d\x1a\x42\x80\xd9\xed\x70\xd7\xe4\x2b\x75\xf7\xfd\xad\xd0\x2d\x69\x19\x8f\x5f\x46\x5b\xf6\x04\xcb\x42\x54\x41\x7b\xac\x37\x14\xb3\xa9\x9e\x6f\x1a\xce\xc9\xe3\xb3\xd0\x97\xf9\x72\xfb\xc3\x6f\x2e\xda\x39\x26\xd5\x61\x12\xd4\xe9\x09\x7d\x89\xbd\xc3\x59\x37\xb9\xa3\x15\x8e\x7c\xdd\x5d\xa4\x01\xe1\x80\xd3\xed\xe6\xb1\xff\x02\x86\x41\x92\xeb\x72\x97\x81\x53\x4f\x49\x64\xdd\xf2\xaf\x11\x80\x0d\x8b\x5b\x6d\x01\xb2\x09\xaa\x33\x69\x36\x6c\x19\xa2\x8c\x79\xa8\x7d\x21\x74\xec\x22\xfb\x14\x89\xa6\x75\x5c\x34\x8a\x99\x6d\x0a\xa5\x6e\x0f\x60\xd5\x8e\x26\xbe\xfa\x23\xa8\x6b\xef\x4e\x35\x29\x51\x2e\x30\xa9\xd1\xc5\xe4\x88\x50\x18\xcb\x97\xae\xb7\xc9\x3c\x5c\x41\xca\xa3\x42\x36\x57\x5c\x22\x6f\x3b\x23\x5e\xdd\xba\x36\x4e\x28\x5b\x6e\x35\x27\x07\xbb\xb3\xb3\x39\xbb\xf2\xa6\x3a\x9c\xb9\xbd\x33\x3a\x77\xe7\x9b\xd5\x8a\x48\xe1\x4c\xe5\x88\x6e\xd0\xcd\x07\xc2\xd1\x65\xa8\x1b\x5e\x6a\x31\xa8\xae\x78\x06\xbc\xf2\xe0\xc4\xec\x29\xa9\x67\x72\x5e\x57\x7f\x17\x41\xee\x68\xf3\x45\xf5\xf7\xab\x0f\xad\x31\xc8\xb4\xb1\x8b\x43\x1c\x49\x77\xd5\xc5\x84\x00\x4b\x45\xf7\xcd\x19\x61\xaf\xfe\x87\x38\xe2\x4c\x38\x26\x10\xef\xe9\x98\x35\x3d\x7e\xba\xf9\x19\xb2\x79\xbb\xb6\x91\xc3\x05\x2b\x8b\x2c\x5f\x09\x80\x8e\xf3\xa6"}, +{{0xba,0xb3,0xff,0x7a,0x44,0x48,0xd8,0xa0,0x3d,0x8a,0xcf,0xdb,0x91,0x3f,0x77,0xfe,0x77,0x80,0x43,0x95,0xc3,0xe5,0x4e,0xc2,0x35,0x11,0x79,0x27,0xe3,0x2b,0x50,0xd5,},{0x54,0x97,0x5e,0x35,0xe5,0xb1,0xd0,0x32,0x3f,0x2d,0x6f,0xb5,0xc6,0x15,0x8b,0xf6,0x65,0x4b,0x08,0x4f,0x76,0xbb,0xdc,0xfd,0x72,0x34,0x92,0x29,0xe8,0xe4,0xa6,0xe8,},{0xd6,0xb4,0x13,0x5f,0xc7,0xac,0xb3,0xd7,0xcd,0xf9,0x87,0x89,0x6d,0x91,0xb8,0xa9,0x0d,0xb5,0x84,0xd8,0x93,0x3a,0x6f,0x30,0x29,0xe3,0x26,0x1e,0xc1,0xc3,0x90,0xcb,0xac,0xfa,0xaf,0xef,0xf4,0x43,0xb6,0xda,0x4f,0xdb,0x1d,0x84,0xc6,0x4a,0x54,0x56,0x0f,0xef,0xfa,0x2f,0x1c,0x7a,0x91,0xbd,0xe9,0x73,0x02,0x22,0x92,0x3b,0x67,0x03,},"\xb6\x47\xb6\x7c\xf0\x1c\x2c\xac\xc3\x9d\xe5\x96\x9e\x19\x9b\xe6\xd9\x32\x01\x67\xa4\xce\xbb\xf1\x62\x59\x50\xb1\xe6\xb7\xad\xf5\xca\x24\xd1\x34\x95\x68\x86\x5f\xbb\xfd\x90\xf5\x13\xf0\x5f\x79\xf7\x0a\x63\xa2\x38\x73\xdc\x7a\x19\x5d\x4b\x28\x5a\x08\xf3\x0e\xe0\x61\xd0\xb8\xe6\xb4\xd6\xbf\x9b\x2e\xcf\x2c\x69\xf3\xd5\xa0\x7a\x67\x30\x53\x7c\xca\x4a\x4e\x4c\x7e\xe6\x84\x70\x2b\xff\x88\x3f\xab\x8b\xca\xf8\x93\x11\xc5\x49\x8b\xcc\xb5\xa0\xf7\xc8\xd4\x9b\x54\xf4\x82\xff\xfb\xca\x6e\x7d\xa2\x62\x45\x2b\xa5\x9a\x57\xa6\x87\x9d\x81\xb7\x3c\xd7\xad\xf7\x2a\x3b\xe2\x8a\x37\x3c\xd6\x33\x10\x40\x84\x61\xc2\x1b\x90\x7f\x63\xe0\x86\xb2\x92\xff\x02\x83\x3e\x8a\x2f\x46\xad\xbd\x67\x1d\x02\xb0\x3a\x69\xac\xa2\xe1\x1d\x28\x7c\x52\x2a\x95\x45\x20\x44\x2e\xce\xfa\xa9\x05\xdb\xfc\xc8\x25\x4c\x58\xc3\x95\x4a\x89\xbf\x56\xcb\xe0\x1a\xd5\x63\x19\x71\xeb\x39\xeb\x43\x2a\x85\x4e\x69\x19\x29\xdf\x7e\x48\xb9\x00\xca\x6e\x74\x0a\xcc\xf5\x78\xb3\x17\x95\xb4\x9a\x6c\xa7\x74\xbd\x8b\x99\x31\x06\xa9\xc4\x94\x8c\x18\x71\x49\x48\x31\x59\x90\xa5\xf1\x91\x69\x24\x20\xf2\x89\x32\x8a\xb7\x13\xec\x19\xb7\xea\x89\x4d\x16\xe6\x47\x61\x00\x87\x1c\xf3\x16\x8e\x4f\x93\x5b\x55\x05\xd1\xed\x5b\x0a\xa2\x9b\xe3\x6f\xa3\xa3\x46\xac\x3e\x76\xf1\x43\xc4\x6c\xa6\x91\x23\xb7\x9c\x36\x39\x9a\x0d\x2e\xd3\x02\x77\x24\x94\xad\xf4\x42\xbb\xaf\xbc\x4d\x01\x53\x26\x92\xc7\x85\x9d\xf0\x4d\x2c\xa7\x8b\xa5\x5d\x77\xfd\xf3\xe5\xad\x99\x37\x86\xa2\x4c\xff\x21\x99\xbb\x49\x38\x78\x73\xcc\x41\x4b\x4c\xf1\x13\x7a\xbb\x7e\x94\xae\x3d\xdb\xf9\x7f\x53\x4a\x18\xfc\x5a\xe5\x85\x23\xa3\xcc\x52\x28\x3d\xc7\xb0\x16\xf3\x1c\xd6\x55\x79\x81\xc5\x07\x6c\x77\x4f\x30\x3a\x47\xc4\x27\x87\x0e\x20\x7e\xd8\xbd\x66\x64\x0f\xf0\x92\xdb\x50\x3f\xa1\x24\xbf\xdc\xf0\x20\x05\x1d\xad\xd1\x06\xdd\x24\x58\x40\xb3\x19\x10\xb8\xa9\x06\x0d\x59\x86\xf0\x2b\x60\xaa\x5e\x33\xb4\xd7\x55\x09\x12\xcd\xc5\x77\x6c\x77\x2a\xac\x93\xae\x19\xc7\x3b\x7e\xcf\xca\x38\x9e\x62\x76\x81\xa8\x78\x1e\xb4\x7d\x84\xe9\x34\x60\xba\x89\x1d\x3f\xf6\xea\xdf\x8f\x2a\x90\x3c\x38\x34\x74\xbe\xaa\x42\xb9\x0e\x03\x22\x36\xdc\xd8\x98\xd0\x2a\x40\xef\xb4\x4e\x47\xea\xd5\x2b\x75\xb0\x9c\x7d\xa1\xcd\x6a\x2d\xfd\x4d\x1c\x04\x52\xde\x69\xf6\xac\xac\x1a\x68\xdd\x78\xda\xf9\x72\xae\x26\x08\x21\xe2\xec\x52\x2f\xb5\x74\x9b\xeb\xe0\xad\xb4\x52\xbf\xa4\xfa\xa1\xe9\x79\x11\xc1\x29\x9f\x16\x56\x8d\x68\xee\xf4\x05\xf4\xb1\xcd\xac\xab\xed\x59\xf7\xb0\xfb\xce\xab\x71\x9a\x34\xb2\x99\xf5\x8a\x4a\xe8\x15\x4f\x98\xf4\xd9\xf4\xf1\x40\xb1\xf0\x85\x00\x69\x46\x72\x5e\x7c\x29\xbb\x0b\xc6\xcc\xf2\x53\x44\x97\xc6\x1d\x4c\x16\x12\x62\x4a\x61\xd7\x0d\x26\xc3\xef\xb7\xd7\xc3\x51\x84\x86\x57\xf7\xf8\xee\xbf\x8b\x99\x07\x47\x74\x0e\x6f\x91\x0c\x97\xce\xf1\x50\x37\x57\x65\xc8\xc0\xb3\xb4\x49\xc0\xd0\x9d\x66\xf0\x08\xe6\x7c\xfa\x76\xea\x2b\x68\x08\xb6\xfe\x63\x2e\xaf\xe0\x58\x7f\x37\xe3\x6b\xe9\x8d\xcb\x17\xa3\xf4\xa1\x5b\x65\xa9\xf6\xfc\xf9\x64\x2b\x52\x52\x20\x77\xb1\xfb\x4c\xc3\xc0\x8d\xf4\xb4\x67\xca\x71\x6d\xb1\x6b\x73\x7f\x78\x2c\xdf\x38\x71\x70\xa5\xf1\xf6\xa7\xae\x0a\xb3\xf5\xb7\xc5\x85\xe3\xb0\x65\x5a\x64\x56\xa5\x03\x59\x5c\xe8\xea\xea\x25\x37\x85\x5e\x7f\x0d\x50\x61\xbc\x29\xb4\xe6\x7d\xaa\x82\x46\x3c\x19\x0e\x9f\xdd\xd5\x2f\x83\x22\xdd\xb4\xe0\xf2\x6b\x68\x77\x82\x28\xeb\x57\xe1\xa1\x85\xb7\x02\x5d\xa1\x49\x87\xd4\x4b\xaa\x76\x7b\x22\xee\x7f\x4c\x84\x59\x10\x32\xe8\x8e\xc1\x2e\xb8\xc5\xa4\xb9\xe1\x57\xec"}, +{{0x48,0x6c,0x7b,0x43,0x6c,0x1d,0x43,0xd6,0xb7,0x03,0x51,0x22,0x83,0xc1,0x66,0xdc,0x86,0x3e,0x5a,0x33,0x80,0x2f,0x4e,0xa6,0x5f,0xc7,0x38,0x77,0x89,0x02,0xd0,0x14,},{0xb5,0xdc,0x94,0x7d,0x64,0x33,0x7c,0xae,0x82,0x12,0x2b,0xd6,0x8c,0xc8,0x08,0x40,0x59,0x6d,0xe3,0xbe,0x56,0xcb,0xd0,0xc8,0x33,0xaf,0x3f,0xaa,0x3a,0xdc,0x37,0x76,},{0x31,0xf9,0x5c,0xbb,0x74,0x63,0xb8,0x75,0x28,0x65,0x42,0x27,0xbb,0x13,0x97,0xbf,0x10,0x65,0xb4,0xf5,0x76,0x80,0x80,0x78,0x20,0x7d,0xfa,0xf0,0x6d,0x12,0x4b,0x41,0xf4,0xc3,0x18,0xf4,0xa9,0x31,0x5a,0x66,0x08,0x5b,0x9e,0x56,0x8a,0x71,0xe4,0x14,0xed,0x94,0x14,0x51,0x73,0x10,0xc6,0x99,0x94,0x6d,0xb0,0xc9,0x76,0x28,0x52,0x07,},"\xaf\x03\x60\x53\x67\x2d\xcf\x3a\xa2\x6e\x28\xec\x6a\xa6\x42\xce\x28\x4b\x89\x6c\x69\x88\x7d\xfd\xcf\x08\x24\x51\x5e\xb0\x84\x8d\x9d\x97\x0c\xa2\x72\xdf\x77\xa8\x6b\x3f\xf6\xdd\xaf\x3c\xba\xdd\x3a\xb6\x28\x3b\xc3\x7c\xdf\x7a\x56\x07\xd5\xdf\xc7\xcf\x96\x32\x92\x99\xcc\x53\xed\xbb\xe6\x57\xfd\xfa\x2c\xa2\x44\x67\x05\x0a\x0a\xeb\x8c\xff\xd7\xd3\x3d\x54\x3e\xc2\xc1\x91\xcc\x0b\xce\x89\xac\x37\xd3\x32\x93\xb1\x88\x8c\xcb\x76\xc2\x8a\xdc\x67\x1a\x49\x35\xa8\x46\xd9\x07\xe4\xad\xd0\x11\x0f\xeb\xbe\xe5\xae\xc8\x0f\x9d\x2f\xf7\x4e\x2a\xf4\xfd\xbe\xbb\xcf\x49\x10\x5a\x64\x69\xd7\x38\x00\x06\xb2\xca\x44\x36\x48\x14\x45\x4e\x44\x5e\x36\xdc\x00\x12\xf3\x39\xc9\x68\x54\xf8\x36\x44\x2a\x05\xa5\x0b\xec\x90\x73\x27\xf7\x4b\xa9\xf6\xfd\x79\x0f\xf0\xad\x37\x83\xd2\x97\xbd\xcc\xa7\x64\x60\x78\x37\x03\xeb\x5f\x2b\x1f\x51\xb0\xa7\x40\xce\x7a\x8f\x00\xa3\x87\xe3\x63\x62\x70\xa9\x71\xfa\x8f\x15\xb4\x49\x67\x30\xd8\x8a\xdd\x80\x7a\x7f\x7e\x98\x7c\xd4\x15\x95\xa2\xe7\x43\x5d\xf5\x19\x55\x76\xa3\x5f\x5e\x91\xb2\xfc\xfa\xc9\x4e\xd5\xd7\x76\x63\x78\x3b\x61\xe6\x67\x1d\x34\x83\x8b\x6b\x56\x44\xfb\xc1\xc5\x39\xfe\x15\x9b\x77\x92\xdb\x96\x7e\x83\x52\x61\x8d\xda\xca\x0c\xde\x73\x43\x7b\x59\xe7\x80\x1b\x49\xeb\x46\x09\xb1\x05\x77\xca\x26\x92\xdd\x6f\x9d\x5e\x9d\x4b\x5e\x5e\x62\xc5\x91\x3e\x7b\x87\xe6\xb3\x47\xbe\x61\x53\xb1\x71\x99\xc9\x16\xa1\x3f\x8a\x88\x5b\x37\x8e\xf0\x9e\x13\xca\xe4\xd8\xb0\x79\xd7\xd5\xcb\x90\x94\x19\x9b\x0f\x20\x53\x3c\x90\x08\x3b\xc3\xac\xb2\x66\x76\x97\xee\xd2\x2e\x36\x70\xab\xb4\xa5\x53\xe9\x95\xc9\xdd\x95\x94\xe5\x92\x39\x1a\x00\x04\xb6\x55\x65\x44\xf3\x56\x12\xc4\x97\x13\x59\x57\x7c\x47\x63\x82\xca\x53\xb3\xf2\x62\xa5\xe3\x3e\xd2\x6e\xec\x80\x9f\x4f\xdb\xa4\x89\x8a\x11\x36\x75\xcb\x6a\xf7\x17\xdb\x62\x57\x9f\x39\x80\xb2\x14\x63\xbe\x02\x9c\xb4\x16\x0f\xe5\xd2\x57\xc4\x6c\xd6\x66\x4f\x98\x61\xac\x50\xfe\x05\xc1\x44\x05\x7d\xce\x2f\x8d\xf1\x53\x2a\xa7\xaf\x58\x9f\x41\x27\x06\x01\xce\xf0\x6b\xbe\x4f\x35\xc3\x1c\x78\x2b\xb3\xcf\xff\x7d\x5a\xb6\x4a\x14\xec\x41\x73\x61\xf1\xd3\x2c\xbd\x38\xb6\xbd\x0e\x02\x50\x5d\x14\x16\x30\x2b\x85\x05\xae\x2a\x96\xe8\xd5\x33\x9c\x34\x6c\x2b\x06\x62\xd3\x50\x25\x9c\x50\xc5\xe4\x87\x95\x91\x4e\x6f\x88\xe9\x7c\x81\x1c\x39\x3b\xdf\x9a\xec\x7e\xf8\x20\x47\xca\x28\xee\x97\x1c\x17\x5c\x27\xe3\x6e\x10\x97\x27\x96\x0d\xdf\x1a\x1b\x97\x6a\xb4\x4f\x48\x51\x60\x7b\xd9\x66\x80\x8a\xc4\x6d\x54\x00\x31\x28\x29\x7f\x5f\x44\x87\x10\x8d\x6a\x02\xe7\xa1\x64\x13\xd2\xb7\x5e\xcb\x42\xfd\xdf\xb6\x69\xc8\x01\xd2\x3d\xe5\x0a\x6f\x7b\xf6\x58\xf7\x53\xc6\xb2\xb3\xb4\x7c\x06\x40\x10\x5d\x0a\x80\x1b\x32\xa1\x94\x3c\xdc\x15\xc8\x86\x55\x5e\xb7\x5b\xb7\x92\x7b\x93\xc3\x5c\x5b\xe1\xf9\x8b\x19\x6c\xaa\xc2\xda\xd9\x91\xb1\x04\x4e\xa8\x63\x94\x4d\x54\xd8\x83\xab\xc3\xc6\xde\x66\xed\x86\x8e\xe8\x4b\xcf\x9c\x34\xcc\xdb\x80\xfc\xd9\xcc\x04\x02\x74\x77\x32\xcd\x63\x0b\xbf\xa3\xbb\xe8\xb0\x38\xdc\x1d\xbd\xaf\x43\x6d\x9a\xc0\x0c\x02\xd5\x28\xec\xe2\xe7\x91\xee\x31\x2a\x86\x8f\xeb\x2f\x58\x7c\xa4\x4d\xb5\x73\x13\x84\xfa\x18\x31\x14\x20\x61\xb2\xea\xd2\xb8\x0c\x66\xbd\x2f\xa5\xdc\xca\xbe\x6a\x25\xf2\xa4\x93\xfe\xaa\xcd\x23\x1d\x2f\x40\x96\x46\xb9\x42\xa5\x78\x54\x5e\xa4\xfe\xea\x9a\x73\x47\x3f\x79\xdc\xf1\x3e\x0c\x9f\x1b\x49\xfd\x89\x12\xec\x48\x73\x28\x04\x5b\xd0\xfa\x22\x89\x22\xee\x6e\x97\x3e\x61\xf6\xe9\x33\x65\x29\x65\x78\xdc\xc2\x1c\x36\x14\x79\xee\x2d\x24\x87\x9f\x2e\x9b"}, +{{0xa6,0xe6,0xad,0x2c,0x37,0x9c,0x6f,0xcc,0xad,0xb4,0xa4,0x9b,0x23,0x2a,0x91,0x42,0x61,0x8e,0xa3,0x01,0x03,0xc3,0x3c,0x22,0x6f,0xf6,0x28,0xbc,0xfd,0x81,0xf4,0x26,},{0xf7,0xc4,0x32,0x3f,0x5c,0x41,0x9d,0x9b,0x3f,0x34,0xa8,0xeb,0x42,0xae,0x7f,0x1f,0xaa,0x23,0x33,0x07,0x90,0x30,0xc5,0xd6,0x4f,0x9f,0xfb,0x1e,0x9b,0x16,0x00,0x2d,},{0x07,0xd9,0xfc,0x24,0x4f,0xda,0xb0,0x01,0x59,0xeb,0xec,0xc5,0xa0,0x08,0x83,0x45,0x3f,0x08,0x31,0x01,0x71,0x76,0x9d,0x29,0x70,0x01,0xe8,0x77,0x01,0x0e,0x3e,0xce,0xd9,0xfb,0x60,0xec,0x91,0xcb,0x4d,0x88,0xe7,0xba,0x40,0xc5,0x30,0xb1,0xf9,0x23,0x79,0x78,0xcc,0xd9,0x6d,0x5c,0xba,0x9e,0x4f,0xa2,0x7e,0x2a,0x0a,0xd9,0xd6,0x0c,},"\x2e\x85\x76\x76\xa5\xbb\x1c\x6e\x9e\x94\x50\x7f\x83\xc6\x0a\x67\xf5\x47\xc5\xde\x9e\x94\x56\x6b\x19\x7a\x6a\xf6\xcf\x47\x52\xe9\x3d\xbd\xef\x6b\x9f\x66\xd1\xfe\xbd\x95\x7e\x42\xa7\xf5\xad\x64\xef\x1d\xbc\xc4\xfe\x69\xae\x95\x25\xd1\xa4\xde\x67\x05\x4c\x88\xf2\x9c\x06\x47\xba\xcf\x8b\x82\xf3\x21\xff\x99\xfe\x9e\xed\xc9\x92\xed\x34\xc1\x17\x7f\xc5\x42\x12\x27\xcc\xac\x10\xfe\xb9\xce\xd4\x08\x2f\x56\x58\xda\x63\x71\x47\x23\x97\x97\x37\xe7\xdc\xbf\xe2\xe8\xb5\xd5\x0f\x91\xdf\xca\x83\xe7\xf9\x5f\x35\xd1\xad\x8d\xd5\x11\x44\x50\x2f\x3d\xf6\x72\x43\x26\x11\xf0\xe7\x66\xa9\x0d\xcc\x2a\x57\x39\xc8\x05\xd9\x5f\xe5\xb0\x41\xde\x9d\x7f\xb4\x7b\x44\x04\xaf\xc8\x03\xa3\xbd\x48\x04\xc7\x81\x7e\xbc\x5b\xdf\xef\x8a\xdd\x9e\x25\x0b\x50\x96\x6c\xa8\x93\x9b\x22\xb3\xc6\xff\x93\x6e\xaa\x65\x9a\x24\x0c\x0c\x84\x8b\x81\x0a\xce\xcf\x61\x81\xe0\xe4\xdb\x8e\x4c\xf8\xfc\xce\x7d\xe5\x59\xcb\xe8\xaf\xa9\xdb\x84\x99\x57\x09\x11\xa3\x88\x7e\x85\x0e\x50\x9c\xdb\x70\xde\xbc\x34\x77\xd1\x21\x75\x01\x4f\x79\xf8\x1b\xa1\x13\xd0\xb7\xb3\x35\x11\x8f\x85\xcf\x59\x99\x6f\x80\x67\x58\xeb\x90\x3c\xc4\x50\xf5\x2f\xee\x10\x2e\xfc\x01\x44\x1e\x9a\xe5\xfa\xe7\x4c\x23\x1d\xfd\x85\xeb\x6b\xad\x17\xd6\xb7\x0e\x93\x85\x84\xfa\xcb\x21\x72\xcb\x03\xbd\x5e\xa0\x7b\x7f\x0d\x37\x1f\xfa\x35\x1c\x0e\xe4\xef\xe9\xba\x4a\x3f\xd5\x43\x87\x46\x55\xe7\xd3\x9c\x53\xae\x86\x32\x98\x02\xe5\xc3\x85\xe9\x28\x3a\x29\x73\xca\xb8\xcf\x7a\xc7\xff\x0f\x91\xd1\xd4\x8b\x58\xab\xfd\xad\x65\x8d\x81\x2f\x07\x88\x16\x76\xbd\x22\x6b\xfe\x95\x7d\x7d\xf3\x0c\x41\x30\xa4\x48\x35\x4a\x6b\x94\x40\x5a\x41\x16\x50\xa9\xc8\xfc\x85\x11\x55\xec\x5a\x8a\x3e\x3b\x67\xae\x0c\x4b\x5c\xb8\x9b\xb7\x3f\xc8\x29\x74\xbe\x62\xda\x73\xf0\xe2\x30\x92\x93\x7d\x40\x5b\xa4\xaf\x6c\xab\x94\x65\xea\x43\xa6\x25\x3f\x44\x57\x08\x2a\x06\xac\x12\xb7\x5e\x88\xec\x68\x44\x87\xf9\x07\x63\x73\xfa\xb8\x89\x28\x59\xd8\xe8\xba\x43\x14\x23\xaa\x80\x5a\x22\x0c\xbf\xda\x43\x1b\x32\xb1\xe0\x31\x21\xf7\xfd\x4d\xe1\x85\x91\xf2\x50\x5c\xc0\xf5\xb2\xb1\xa7\x60\x5f\xbc\xc6\x37\x57\xb0\x7e\x29\x9f\xef\x5a\x2b\x73\x65\x23\x0c\x2e\x92\xa2\x59\x62\xc2\xe8\x01\x2a\xd3\xfa\x9e\xe9\x48\x82\x70\x96\x25\xba\x68\xc7\xb2\x13\x66\x4a\xe2\x53\x2b\x60\x9d\x7c\x9a\xa0\xe8\x3d\x49\x3d\xbc\xe7\x63\x2f\x35\x58\x0e\x06\xd3\x11\x1c\xed\x32\x0d\xd0\x19\x04\x41\xf6\x2d\x9e\x35\xf5\x0d\xe5\x9c\x27\x2f\xb0\x0f\x56\x8a\x00\xb0\x74\x6c\x33\xa9\xbd\x24\x90\xc0\x74\xb9\x1c\xdd\xc4\x87\xef\x2e\x45\xa0\xf0\x30\xe0\x8f\xdc\x18\x17\xbc\xa8\xa9\xce\x29\xd2\x92\x79\xe7\x55\xde\xbc\x28\xdf\xad\xc3\xc4\xd1\xb4\x58\x48\x6e\x3c\x8d\x0c\x43\x18\xe7\xe6\xf9\xeb\x5a\x36\x53\xb3\xf7\xc4\x95\x07\x07\x7c\xd5\xeb\x81\xf1\x0b\x88\x10\x7c\xc0\xf9\x31\x69\x32\xab\xe9\xb6\x4e\x88\x86\xd0\x68\x56\xa8\x5b\xe6\x3b\x0c\x2b\x47\x5c\x0a\xfc\xb0\x69\x44\x26\x86\x0f\xb2\x4b\x5c\x17\xab\x6a\xb7\x73\x3d\x5e\x64\x1b\xe7\x4f\xd5\xf6\xa1\xff\x18\xd2\xf9\xa4\x27\x70\xfb\x30\x75\x0f\x56\xf4\x85\x4e\x38\xd5\x8a\xef\x18\xa2\xa6\x1c\xbf\xb4\x9e\xe5\x76\xed\x97\x73\x7b\xc2\x8d\xf3\x26\x8a\x33\x41\x75\x51\x3d\x97\xaf\x00\x9c\xbb\xcf\xdf\xad\x50\x39\xd6\x9b\xb4\x6f\x70\x88\x67\xd9\xb3\xce\x0b\xf2\xf5\x69\xe3\xcf\xbc\xf6\x13\x6f\x88\x70\xd2\x52\x08\xb2\x1a\x3e\xdc\xb7\x33\x93\xdf\xcd\x41\x72\xc1\x40\x2c\x41\xf3\x6e\x3f\x82\xa4\xea\x6d\xcd\x89\x16\x86\xba\x66\xe1\x43\x20\xaa\x0e\x22\xba\x0c\x1e\xf0\x33\xd6\x62\xcd\xb8\x60\xcd\xfa\x3a\x40\xf6\xcc\x53\x2a\x08"}, +{{0x9b,0x6d,0x7e,0x28,0xeb,0x05,0x15,0x97,0x32,0x4d,0xce,0xb7,0xa1,0x89,0x41,0x24,0x67,0x25,0xe8,0x8d,0x53,0xab,0x2c,0x34,0x77,0x11,0x05,0x33,0x0c,0xf1,0xf4,0xae,},{0x88,0x72,0xa5,0x0b,0x5f,0xe3,0x62,0xf8,0xea,0xd1,0xd4,0x0e,0x20,0x45,0xf0,0xd4,0x0b,0x2e,0x7b,0x50,0xb5,0x9d,0x80,0x90,0xbc,0x47,0xad,0x68,0xeb,0xee,0x09,0xed,},{0xc6,0xdc,0x5c,0xa1,0xe8,0x56,0x00,0x15,0xb4,0x93,0xaf,0xe2,0x66,0x6c,0xcf,0x6f,0xef,0xa8,0x03,0xd8,0x52,0x6c,0x83,0x7f,0xe7,0xf1,0x23,0xc7,0x99,0x14,0x27,0xab,0x03,0x0d,0x7c,0x77,0x0e,0x45,0xf6,0xde,0x84,0x81,0x52,0x3b,0x94,0xec,0xe9,0x7f,0x3f,0x16,0x1c,0xf5,0xb8,0xc7,0xae,0xa3,0x9f,0x5a,0xd8,0x26,0xbf,0x8d,0x0a,0x02,},"\xd1\xe1\x98\x7b\xff\x65\xf6\x2a\xd6\x76\x24\xc6\x65\x79\x24\xf5\xd6\x73\xb7\x82\x4e\xbe\x40\x40\x26\xc0\x56\x2d\xed\x31\x43\x44\x0b\xe6\x37\xf9\x8c\x9e\x01\xa6\xaf\xdf\xa9\xa4\x7d\xd4\x9c\x7c\xba\x6e\x3f\xd2\x3e\x45\x52\xf7\x63\x2b\x14\x38\x0b\x27\xcd\x3e\x96\x06\xcc\xe3\x50\xf1\x52\xab\x12\x6b\xea\xd0\xa5\xd3\xbc\xe4\xd4\x20\x92\xd9\x34\xc8\xca\x33\x7e\x98\x7e\x11\xd8\x6c\xfb\xfb\xd2\xac\xc3\x22\x3b\xd1\x67\x44\xa9\x27\x72\x8f\x48\x53\x72\x17\x5c\xc6\x94\xdf\x30\xa7\x3f\x9d\x33\x76\x5f\xf0\x14\xef\x00\x8d\x58\x63\x21\x03\x38\xcc\x34\x82\xcc\x27\xea\x31\x7e\xec\x92\x1b\x0c\x56\x8c\x38\xab\x27\xc4\xa5\x64\xe8\x02\xb1\xb9\x46\x68\xc6\x51\xe2\x0a\x0b\x55\xf3\xa7\x9d\x21\x5f\xc3\xa0\xd0\x49\x04\x01\x09\x32\xc4\xcc\x68\xc2\xa9\xe7\xd0\x0e\x5d\x38\xd8\x2d\xf5\x52\x06\xba\xb9\x5c\xf6\x97\xbe\xbc\x72\x06\xee\xde\xf6\xfd\x18\xd9\xa2\x0c\x2c\xbb\x28\x5b\x00\xef\xa7\x69\xa0\x8d\xab\x2b\x3a\xba\xdf\x00\xd1\x98\xb4\xf1\x92\xdd\x44\xbc\xb9\x14\x31\x82\x3a\xe6\xfd\xf9\x84\x58\xec\xa3\x9c\xd2\x92\x63\xf0\x99\x93\x03\xe7\x0d\xc6\x94\xfe\x01\xc5\x3a\x11\xc1\xd1\xc3\x4c\x1e\xe5\x06\x8a\x20\x1d\xbe\x7e\x10\x08\xd7\x64\x35\x89\x68\xb4\x02\xaa\x39\x85\x49\x50\x7f\x7b\xd1\x85\x08\x00\xe4\x11\xb1\xc4\xe2\x8d\xdc\x04\xa8\x59\xe1\x79\xbe\x8a\xd7\xe6\x67\x0e\x50\x9d\xb0\x27\xad\x7e\x51\x7e\x44\x25\x95\x4f\x5a\x80\x74\x14\xa6\xda\x26\x7a\x76\x4e\x71\x2a\x99\x84\x65\x06\x49\x82\xd8\x51\xa2\x65\xea\x3c\x4d\xfb\x74\xf9\x92\xa7\xcc\xcd\x9a\x82\x68\x7f\xa6\x1c\x32\x2c\x4f\x58\x9e\x86\xb8\x82\x52\x13\xbf\xa9\x51\xda\xe6\xaf\x35\x4a\xce\x18\xf0\x73\x99\x5a\xdc\x95\x83\x9d\xac\x01\x65\x51\x1d\x61\x75\x37\x91\xa5\x3e\x48\xe3\xa8\x27\x3d\x44\x82\x3d\x25\x96\xf2\xa2\xdb\x2e\x5f\x1a\xe5\x97\x22\x1b\xa7\xf3\xeb\xaf\x4a\x7b\x28\x88\x39\x50\x02\xbd\xaf\xf5\x1f\xa5\x4b\xfb\x97\x9d\xe1\x03\x14\x04\xca\x77\x89\xfe\x09\x5d\x4d\x17\xf0\x7a\x35\x55\x6b\x10\xfe\x8e\x14\x17\xc8\xa6\xa6\x31\xc2\xed\x36\xcb\x7a\x0e\x61\x81\x77\x62\x89\xc3\x44\x81\x4d\x42\x13\x1a\x73\xb1\x2f\xaa\x35\xd7\x78\x14\xc6\x81\xa6\x01\x37\x4b\xa7\x1c\xb9\xad\x53\x15\xfa\xd4\x2d\x3a\xcf\xc7\xc1\xd6\x28\x81\x02\x56\xda\xf7\xd8\xc3\xc9\xa2\xe5\xbd\xcf\xb7\x70\x08\x2f\xa6\x38\x16\x89\x58\x52\x3a\x1c\x3b\x03\x5d\xbc\x6d\x5a\xdf\x26\xdf\x89\xa7\xcc\xab\xed\x3e\x7d\xd3\x77\xc1\x6d\xa8\x41\xf1\x3c\x68\x94\xd4\x3c\xeb\xb4\xe3\x90\x22\xf1\xcc\xec\x22\x74\x44\x5c\x78\xb3\xad\xc7\xbb\xf7\x0d\x89\x0b\x80\x23\x6c\xc4\x46\x8f\x95\x69\xc5\x9a\x7e\x33\xb5\x70\xe6\x70\x38\x0d\x24\x4e\x4e\x31\x0e\x11\xc3\x92\xf1\xe3\x34\x05\x4b\x92\xc8\x38\x6c\x16\x1c\xe0\x41\x09\xb0\x37\xbd\x62\x8d\x91\x9d\xcb\x62\xda\x14\x35\xbf\x94\xe8\x8b\x0a\x88\x46\xd4\x86\xd1\x67\x78\xf7\xa3\xb8\x80\xe6\x60\xf4\x41\xfd\xf8\x6e\x56\xb8\xaa\x06\x61\xf5\x5a\xae\xce\x27\xf9\xdd\xaa\x0e\x2a\x22\xc2\x15\xb0\x40\x53\x97\x26\xb9\x85\x39\x15\xa1\x59\x2d\xff\xea\xe3\x2d\x7b\x5b\x67\xeb\x62\x05\xbb\x0b\xd7\x27\x9f\x78\x8d\x5f\x83\x3c\x40\x66\x78\x0c\xa0\xa4\x2d\x3e\x4e\x1a\xa2\x2b\xd0\x6b\xb5\xee\xd8\x9b\x94\x13\x77\x1e\xca\xb6\x44\xca\x72\xd1\x29\x1d\x00\xf7\x40\x90\x1a\x73\x11\xdc\x03\x67\x15\xd2\x3e\xbd\x9a\x59\x89\x16\x28\xf0\xd8\x7e\xd4\x89\x50\x2f\x06\xd7\x5b\xbd\x11\xcd\x16\x02\xa3\x5e\xe7\xe1\x33\x35\xd6\xa1\x44\xb0\x88\x30\xe6\x69\xc0\x2e\x65\x2f\x3f\x10\x0d\x39\x3e\xf9\xb4\xac\x05\x32\x14\x39\xbc\xe6\xce\x36\xff\xc5\xab\xca\x89\x0b\x87\x96\xcc\xb5\xe1\x63\x03\x55\x9c\x5d\x91\x17\xf0\xf3\x1d"}, +{{0x70,0x09,0xed,0xd0,0x79,0x50,0x96,0xed,0xc4,0xfe,0xd5,0x5a,0x17,0xcc,0xf4,0x84,0x13,0x1e,0x60,0x8c,0x6d,0x5d,0x66,0x96,0xbf,0x33,0x76,0xe2,0x69,0x24,0x95,0x9b,},{0x77,0x57,0x4b,0xf0,0x69,0x52,0x71,0x45,0xe7,0x2d,0x3e,0x85,0xce,0x7d,0x4f,0xcd,0x67,0x1a,0x33,0xe0,0xa7,0x1e,0x6b,0xf0,0xda,0x7e,0xa4,0x71,0xdd,0x6e,0x86,0xa4,},{0xb7,0x01,0xb8,0xf9,0xa4,0x34,0xe0,0x6d,0x71,0x9a,0xd2,0x5d,0xcc,0x54,0x06,0x0c,0x79,0x86,0x64,0x7f,0x44,0xf3,0x88,0x4b,0xcb,0x6e,0x5e,0xe1,0xd7,0xa4,0x46,0xcc,0x26,0x5c,0xec,0x02,0x9b,0x53,0x7d,0xa7,0xf2,0x52,0x33,0x26,0x55,0x8a,0xc9,0xba,0x34,0xf4,0xcc,0x2a,0x97,0xcc,0xa3,0x45,0x2e,0x70,0x56,0x2e,0x7a,0x8f,0x55,0x04,},"\xb1\x2c\x12\x47\x05\x39\x54\x7c\x2d\xe6\xbc\x4e\xea\xc7\xb6\x3e\x50\x8e\xd7\x10\xf3\x56\x37\xd9\xfd\xd2\xdc\xca\x32\x2a\x7a\x50\x71\xda\xb2\xb2\x84\x5e\x30\x79\x28\x06\x03\x5c\x9f\xcd\xaf\xe2\x78\x3e\x3b\x67\x7d\x6b\xe5\xaa\xc7\x0b\x33\x91\x0a\x2b\x95\xe8\xb5\xd5\x9b\xda\x61\x59\x35\xa4\x17\xb7\xae\x19\xa7\x85\x37\x74\xe8\x9a\x12\xaa\x54\x7b\x41\x92\x97\x9a\x01\xef\x6e\xf3\x2a\x40\xde\x79\xd6\x80\x05\x7a\x83\xa0\x74\x61\x7c\xa6\x50\x1f\x59\xe7\x35\x64\x92\x7c\x38\xb5\x8c\x19\x58\x5a\x2c\x03\x65\x9c\x02\x6e\x4d\xe3\x80\x6d\x6c\x1c\xa8\x95\x8d\xee\x47\xbc\xb8\x89\xe7\x6d\x2c\x3a\x9a\xb5\xb8\xb6\xaf\xb2\xe8\x42\x29\x80\x56\x56\x7b\xf9\xb5\x89\x57\x41\x54\x83\x33\x62\x33\xef\x49\x20\xfa\x57\xf4\x96\xe1\xf0\x34\x8c\xca\x20\x36\x64\x96\xfa\xb3\xa7\x5b\xf4\x21\x4e\xce\x47\xa4\x5f\xea\xa1\x39\x2d\xb3\xf2\x54\xd9\x6a\x7f\x37\x40\x2c\x98\x11\x14\x0d\x73\x58\xb4\xef\x8f\x20\xa2\x98\xee\xef\x90\x4e\x37\xd6\x8f\x37\x8d\x33\xcb\x96\xd0\x0c\x03\x10\x9f\xc8\x3f\xd0\x6a\x87\x6c\x92\x48\x2f\x61\xab\x79\x14\xeb\x7c\x2e\x5e\x84\x06\x6e\x0e\x91\xe2\x1e\x42\xe9\xbe\x23\xdf\x12\xb5\xc7\x47\x97\x3c\xb8\x64\x42\xc3\x22\x91\xd3\xd1\xae\x71\x9b\x36\xa6\x2f\xaf\x3a\xba\xa2\x05\x3a\x31\x3f\x62\x5d\x85\xc5\x1a\x51\x98\x57\x19\x15\xef\x8a\x2b\x19\x9b\xa3\x7d\x25\x88\x45\x75\xba\x1b\x72\x84\x4c\xab\x43\x28\xb5\x7f\xab\x1e\xc9\x74\xee\x8e\xa1\xdf\x7c\xa9\xc7\x8a\x4d\x3a\x03\xbc\xb0\xab\x41\x69\xbf\x06\xa3\xa4\x38\xd9\x56\x6c\x6c\x50\x1d\x8d\x9c\xcc\xcb\x1a\xc2\x6b\x4d\xa4\xae\x1a\x9d\x8e\x8b\x9d\xf6\x62\x82\x1a\xd9\x75\xc9\xb0\x15\xfe\x26\xf6\x89\x8d\x22\xab\x91\x2f\x0e\x40\x5a\x5b\x27\xcf\xd3\x9d\x65\x7d\xcd\x92\xcd\xeb\xe6\x79\x19\x02\x71\x34\x84\x40\x6d\xdd\xce\x71\x18\x87\x31\xe4\x43\x19\x38\x1a\xf2\x7d\xaf\x76\x79\x22\x73\xb8\xc3\x52\x51\xd1\x1b\x83\x6a\xfe\x8b\x3c\xe9\xb4\x02\x73\xf6\x91\x5e\xbe\x6b\xc9\x5a\x75\xbb\x94\x1a\x42\x92\x09\x86\x7f\xba\x87\x64\xbf\x6c\x40\xdb\x6e\xec\xb4\xf2\x17\x47\x83\x7c\xf6\xae\x7f\xbf\xe3\x6d\x50\x23\xdf\x7f\xce\x2c\x0c\x3c\x57\xaf\x28\x98\x88\x53\x13\xc5\xc4\xbd\xa3\x5c\x7d\xa6\xcb\x29\x93\x2f\xb1\x99\x1f\x62\xbb\xb0\x80\xb3\x2e\x20\x50\x61\x93\x11\xae\x69\xab\xb3\x02\x2d\x91\x3f\xa9\xea\xbd\x5d\x5c\xb4\xdc\x54\xd7\x5d\xca\x63\x8c\xda\x9a\xf3\x31\xc0\xcf\x4d\x20\x07\xb6\xca\x39\xf6\x55\xa6\x1c\x01\x03\x9f\x12\xa4\xb9\x78\x2b\xc3\x9a\xec\x4d\x22\xef\x00\x93\x38\x8d\xd7\xd5\xb5\x6d\xfb\x8a\x7f\x9d\x86\x69\x00\x4e\x28\x78\xdd\x8a\x6d\x76\x85\x7c\x08\x45\x24\x50\x68\xfe\xe1\xc5\x31\x96\x31\xe7\x8d\x37\x85\x16\x5c\x70\xaf\xd6\x52\x99\x30\x13\x78\x55\x1e\xbf\x61\x35\x84\xc6\xa7\x62\x0a\x0e\x3b\x67\x79\xf3\x8c\x09\x40\x06\x24\x97\x00\x8e\xb2\x33\x87\x08\x68\xc2\x1c\xcc\xac\x23\x95\x01\xb6\x3b\x74\x9a\x85\x60\x2c\x28\xa0\x95\xca\xfc\x74\x9b\x05\x11\xa6\xc8\x78\xed\xb3\xb7\x80\xea\x17\x4d\x07\xb1\x21\xe3\x15\xa8\x26\xdd\xa6\xec\x8d\xc5\x43\x63\xe2\xcd\x2e\x63\x05\xa1\x94\x82\x5c\x0e\xa9\x0e\xfd\x7a\x9f\xd8\x9c\xd9\x7b\x99\xc4\x30\x0b\xd3\xbf\x93\x53\xd8\x2f\xbc\xce\xea\x71\xb4\xee\x3f\x1a\xae\x95\x39\xb4\xcc\xe9\x0c\xa4\x77\x59\x7c\x17\x4e\xf2\x0f\x4b\x9f\x4e\x62\xd0\x9a\x57\x0d\x31\x35\xaa\xbe\xe9\x55\x1f\xa6\x09\x83\x95\x8c\x0b\x7b\x8c\x37\x44\x55\x3e\xe1\x4e\x7f\x3c\xd1\x03\xa1\x92\x51\xc9\x9b\xf6\x38\x4a\xbb\x60\xa7\x6a\xfc\x66\x58\xb8\x0d\xfc\x51\x10\xad\xc4\xc7\x32\xfe\x0e\xe3\x29\x33\xfb\x28\x48\x28\xe0\x08\x88\x7a\xef\x80\xf6\xf8\x13\x34\x04\x46\xc0\x21\x7c\x12\xee"}, +{{0x12,0xfe,0x8e,0x5c,0xe2,0x0c,0xaf,0xaa,0x32,0x79,0xda,0x7b,0x34,0xaa,0x87,0x75,0x2e,0xad,0x67,0x9f,0x15,0x61,0x28,0xaa,0xef,0xb4,0xaf,0xa5,0xdb,0x4f,0x2a,0x6f,},{0xe7,0x7f,0x44,0x20,0x6b,0xb0,0xc4,0xc5,0x9a,0x28,0x70,0xcf,0xc2,0xec,0xac,0x63,0x36,0x2d,0xee,0xcb,0xe8,0x11,0x5d,0xe5,0xcb,0x1a,0xfc,0x2d,0x9a,0x3d,0x47,0xf1,},{0x04,0xea,0xf9,0x00,0x96,0x6e,0x09,0x92,0xd3,0x6e,0x3c,0x22,0x0a,0x4b,0xd4,0xd8,0x2b,0xcc,0x6e,0xb9,0x98,0xed,0x05,0x1d,0xbc,0xb9,0x16,0x0b,0xcd,0x35,0x74,0x09,0x73,0x6b,0xcf,0xf7,0xe6,0x63,0x0e,0x96,0xf5,0x53,0x8a,0xec,0xa6,0xab,0x8b,0x0d,0x0b,0xd8,0x2c,0x0c,0xd7,0xc4,0x54,0x99,0x17,0xfe,0xbb,0x9c,0xba,0xda,0x08,0x0c,},"\x6b\x80\xcc\x6f\xbb\xd3\x32\xf8\xc6\x19\x7c\xdf\x2e\x6d\xc1\x9a\x21\x30\xfa\xa2\xec\x93\x8e\xf5\x58\xb8\x84\xba\x4f\xa5\xe1\x13\xe5\xb3\xe4\xb1\xaa\xf5\x1b\x69\x5f\x13\xef\xfe\x13\xf7\x7d\x39\xca\xb3\xc0\x7d\x04\xd6\x6d\x43\x0d\x99\x74\xb1\xda\x3d\x39\xdf\x12\x78\xc0\x0d\x6b\xcb\xfd\x4b\xae\x75\xb8\xc0\x76\x40\x4d\xbb\xb8\x34\x48\xfb\x49\x3d\xf6\x70\x00\xf9\x7d\x24\x7e\x8f\x23\xdc\x08\x1f\xce\x99\x2b\x65\xa2\x1b\x35\xd7\xbd\x7f\xa7\xdc\xcc\x54\xa5\x60\xaf\xd1\x4b\x1e\xc4\x36\xc1\x09\x46\xf6\xaa\x59\xea\xe1\xbe\x3e\xcf\x31\x1d\xef\x51\xe4\x6b\x6b\x4d\x1d\x08\x0d\x17\x84\xb2\x33\x4b\x80\xcf\xba\x72\xcd\x93\x1f\x55\xec\xd2\x98\xb0\x5d\xc8\x36\xab\x12\xd0\xad\x8b\x5d\x6e\x9b\x1e\x3c\xea\x3d\x84\x33\x68\xee\xf1\x9f\x5c\x14\xc6\xbb\xad\x94\x14\xcc\x7a\x4d\xb6\xa7\x26\xe4\xfc\xae\xd4\x44\x40\xa0\x19\xfe\x12\xa6\x05\x73\x40\x3c\x0e\x66\x2d\xc9\x02\xd1\xc8\x73\xff\x30\xc9\x31\xba\x7e\x43\xa3\xb3\xbf\x71\xd5\xb0\x94\xea\x50\x49\x71\x64\x7c\xa9\x43\x56\xf0\xa5\x3e\x44\x4b\x4c\x00\x8e\xe5\x97\x72\x04\x22\x1b\x40\x0d\xee\xc3\x7f\xc2\x73\x45\x25\x45\xf8\xf2\x18\xbe\x98\x87\x25\xbc\x38\xc8\x5d\xf2\x12\xea\x73\xdc\x0b\xc7\xcb\xba\xc9\x07\x98\x2f\xef\xad\x68\x0f\xbd\x97\x5c\x20\x93\xa7\xfe\x8e\x6b\x37\xc1\xcc\xed\x87\xf8\x1d\xaa\x57\x29\x1a\x5a\x18\x47\x6d\x11\xa1\x8e\xc4\xb5\xcb\xce\x5d\x55\xac\x9b\x62\x4b\x04\x84\x30\xf2\x54\xf6\x71\x07\x85\x06\xe6\x98\x9d\xf7\xc0\x92\x56\x52\x50\x39\x08\x5a\xb7\xc1\x30\xc2\x40\x00\x4a\xbb\xb3\xaf\x6b\x48\x1c\xc1\xa0\x61\x7e\x57\xe3\x88\xee\x4b\x1f\x05\x2f\x34\xa0\x03\xfe\x6b\xb2\x02\xcb\x87\xd2\x74\x1b\xd8\xe3\x45\x4c\xa7\x3d\x2f\x61\x20\x11\xec\xc7\x4d\x88\x34\x35\x10\xa6\x3c\x93\x13\xdd\xc3\x6c\x25\xd3\xfb\x03\xe1\x88\xf5\x60\xbd\x02\x9c\x80\x15\x85\xce\x55\x29\x88\xdc\x55\xb7\xd8\x52\x2a\x33\x96\xc0\x1d\x5e\x71\x5a\xe2\x6c\x62\x2c\x64\xfe\xd5\xb9\x8e\x9c\x55\x9e\x4a\xa7\x8d\x1e\xd3\xb7\xb8\x90\xd4\x77\xec\x8c\x50\xa0\xff\x10\x7a\x3f\x83\xb0\x7b\xd3\x5e\x9c\xe9\xa0\x8b\xcf\xc0\xf1\x68\xee\xc7\xaa\x31\x1f\x71\xc6\x6a\x71\xce\xb9\xd5\xa2\x19\x9a\x14\xbe\x36\x86\x5c\xa8\xd0\x7e\x18\x6b\x13\x92\xb9\x29\x0c\x57\x80\x04\xd5\x84\xf1\x91\xc8\x2a\x53\xd8\x50\x89\x0b\xcc\x0d\x12\xdf\xf8\x40\xe0\x43\xdd\xdc\x2e\x67\x0c\x83\x60\x20\x92\x4f\x58\xc0\x44\xb2\x18\x76\x3c\xa6\x19\x82\xbc\x33\x2d\x24\x7b\x2a\x00\x8a\xb5\x70\xb6\x56\x5a\x06\x89\x2a\x26\xcf\xb0\x85\x3d\x79\xda\x28\xef\x8b\x91\x0a\x93\x29\x54\x4b\x79\x2a\xe4\x45\x6b\xa7\x76\x50\x66\xb9\xd1\xb4\xa3\x00\x21\x04\x48\x66\x0a\xe4\x8b\x50\x44\x41\x01\x7c\xdd\xd1\xf6\xf0\x09\x38\xb1\x07\x2c\x8a\xb8\x24\xad\xfe\x8a\xe3\x49\x23\xc8\x2e\xec\x75\x4b\xee\x1a\x65\x50\xab\x1d\x3d\xa0\x86\xe3\xae\xbb\xf2\x11\x69\xc4\x44\x69\xe0\x3b\xba\xe0\xd7\x2c\xe8\x63\x45\x77\x84\xcf\xe1\xdf\xc2\x76\xf1\xaf\xad\x9e\xe5\x3e\xba\xb5\xa3\xc6\x57\x2e\xb1\xca\xe0\x99\xa4\xa5\xfe\x19\x31\x92\x90\xe6\xa1\xb8\xb0\xe7\x54\x1e\xd7\x35\xb3\xf2\x1b\x1e\x2c\x75\x09\xf8\x7f\xd1\xfe\xd0\x00\x07\x47\x9b\x3c\x1b\xb7\x84\x32\x46\x63\x02\xd2\x46\xd8\xd0\x31\x99\x63\x07\x26\x0a\x0c\x41\xa0\xe3\xec\xd1\xe7\xfd\x83\x4d\xac\x11\xa1\x3e\xb0\x36\xb3\x9c\x36\x99\x66\xfd\xef\x39\x4c\x18\x3e\x54\xe7\xb0\xcb\x3d\x0c\xeb\x19\x8b\xd0\xe6\x6c\x00\xd3\x8d\xb7\x03\xaa\xce\x30\xcb\xbd\xab\x36\x9d\xfd\x1d\x9e\x51\x4d\x09\x68\xf1\x00\xc9\xf0\x7c\x31\x50\x89\xad\xb3\xad\x02\xe5\x9c\x04\xb9\xbe\x46\xe9\x9f\xbf\x5a\x62\xc6\xbb\xec\xdf\xf5\xb3\x81\xe5\x51\x27\x82\x4d\xdb\x18"}, +{{0xee,0x9b,0x6c,0x2e,0x0c,0x9b,0x01,0x47,0x2c,0xe3,0x2d,0x54,0xd1,0x76,0x2a,0xb0,0x30,0x33,0x17,0xd7,0x6d,0x3a,0xa7,0x8f,0x5e,0x08,0xa9,0x02,0x4c,0xa1,0xe0,0x83,},{0x01,0x6d,0xf0,0xf7,0x17,0xbc,0xb7,0xad,0xf6,0x26,0x95,0x8d,0x83,0xbf,0x8a,0xa3,0x25,0xc7,0x05,0x18,0xc6,0x8b,0xc7,0xef,0xd8,0x42,0x53,0xb7,0x5d,0xb0,0x87,0x88,},{0x4b,0x00,0x1d,0x96,0x42,0x83,0x5d,0x72,0x13,0x8d,0x68,0x01,0x98,0xe6,0xaf,0x70,0xb5,0xde,0x7a,0xf0,0x15,0x13,0x1e,0xa7,0x26,0xf4,0xe5,0x1b,0x5e,0x8b,0x6d,0x48,0xc2,0xa6,0xca,0x8e,0x87,0x09,0xcc,0x82,0x22,0xa5,0x04,0x7c,0x09,0xa6,0x6e,0x51,0x8a,0xc5,0xe8,0xb6,0xe5,0x35,0x48,0x94,0x82,0x61,0xf0,0x70,0x1f,0x68,0x73,0x08,},"\x77\x2c\xc2\x5c\x3b\x69\xbb\x3f\xf5\x65\x56\x64\xef\xa4\x78\xac\x41\x4a\xdf\xae\xa7\x0a\xc4\xa2\xa8\x87\xed\x39\x68\xc5\x4d\x34\xdb\xf1\xbe\x32\xcc\x9a\x9b\x54\x20\xa4\xad\x3c\x9a\x87\x7b\xc8\xcc\xec\x94\xad\x47\x3a\xa7\xa3\xc7\xde\x08\xa0\xfd\xb5\xed\x1e\x89\x87\x2b\xe7\x81\x70\xbe\x22\x1d\x27\x97\x76\xbb\xc6\xed\x9c\x5a\x67\x16\x89\x80\xd5\xea\xf8\x95\xe1\x34\x0f\x5d\xfa\xa3\xdf\x62\x2d\x65\x44\xb3\x99\xd7\x49\x45\xfd\x13\xbb\x11\x73\x62\x1e\x05\x61\x51\x46\x40\x13\x7a\xa7\xbc\x9c\xb7\xde\xbe\xff\x2c\x62\x69\x77\xd4\x47\x26\x3b\x7e\x57\xd4\x3d\x69\xef\xb2\x30\xcd\x25\x86\x5e\x4d\x92\x48\x28\xf5\xe3\x6f\x96\x4e\x40\x3e\x34\x93\xf3\x0d\x6d\xfe\xa6\xca\x3b\x78\x10\x75\xb5\xe3\xb2\x5c\x05\xac\x50\xe5\x55\xf1\x5b\xa1\x2b\x0e\x05\x9b\xff\x99\x64\x84\x12\x9d\xb6\xea\xfd\x88\x99\x3d\x6f\x0b\x7e\xcd\x15\xdc\xe2\xfc\x99\xf8\xb8\xe4\x35\x16\x35\x2d\xdb\x46\x1a\x04\xb9\xff\x34\x86\x45\x2e\x6a\xa6\xa5\x4b\x2d\x10\x62\xa7\x71\x42\x50\xcd\x2a\x88\xff\x6c\x4c\x17\xb6\xcc\x66\x52\xd8\xc5\xac\x27\xd4\x44\x3a\xeb\xf3\xd5\xfb\xaa\xee\x45\x21\xec\x76\xf0\x41\x3d\xb6\x44\x21\xec\x8d\x69\x49\x62\x67\x25\xfe\x56\x16\x0a\xb3\x07\xc0\xe7\x39\x06\xc4\x51\x55\xef\xab\xb4\x72\x22\x02\x1f\x22\x0d\x32\xbd\x3d\xb0\x71\x2a\xbd\xe2\x59\x9e\xa4\xff\x79\x97\x17\x81\x1d\xcd\xf8\x18\x2d\xf6\x71\x6d\x2a\x03\x8a\xee\x15\xd7\x78\xda\x55\xac\x20\xf0\x1f\x25\x30\x9c\xea\xd5\xb5\xb7\xb2\x23\x22\xe1\x82\x8e\xa7\xc9\x1a\xe6\x66\xf2\xdc\xd6\x84\x07\x31\x48\xe3\x1b\xb2\x24\x7d\x5f\x93\x50\x6e\xa8\x08\x52\x27\xad\xc9\xae\x19\x82\xe9\x50\xf0\x06\xa9\xda\x15\x8b\x9c\xec\xff\x89\x29\x76\x1c\x84\xf9\xd9\x76\xfd\xcd\x31\x7f\xfe\xd3\x6c\xbf\x6a\xcd\xa3\xe5\x0c\x9b\x73\xbd\x2c\x80\x85\x40\x9d\x11\x9b\x64\xce\xd7\x34\x9a\x26\x74\x26\x2a\x83\x2b\xec\xb0\x3c\x2e\xdc\xca\xc0\xec\x54\x12\x4e\x82\xf8\x10\x18\x17\x92\xda\x49\xea\x10\xbd\x94\x1f\x98\x95\xa0\x69\x59\xfd\xe0\xd3\xb0\xae\x84\xc3\x9d\xf0\x53\x90\xab\x33\xc3\x6c\x79\xca\x22\xe6\x59\x4d\x7f\xc6\xe3\xf8\x69\x22\xd7\x8e\xb7\xf5\xc2\x54\x95\xd8\x22\xa3\xb4\x10\x51\xb2\x4e\x57\xa7\x6f\xcf\xc1\x65\xcd\xe6\xd0\x96\xcc\x7b\x7e\x9d\x05\x5f\xe8\x64\xd5\x29\x42\xd6\x29\xa8\xac\x26\x1b\xe1\xdc\xd3\xa2\x1f\x89\x5f\x49\xb6\x7e\xe4\x7e\xab\x7c\xf1\x64\x4d\x57\x1d\x5f\xf3\x8c\x17\x9f\x5c\x6a\x54\xa3\x61\x2f\xb3\x47\x53\x41\x2a\x1b\x95\xbf\x62\xff\x31\x79\x80\x4f\xfb\xb9\x90\x51\xf2\xb0\x80\x56\x3a\x4a\xe0\xf2\x7c\xf9\x96\xea\x8b\xe3\xba\xe0\xa4\x33\x9d\xcc\xdf\xf6\xb6\x67\x15\x59\x26\x6e\xaf\xf4\xef\xf6\x82\xb8\xde\xe8\x9c\x9d\x2d\x45\xac\xdb\xec\x4a\xa6\xce\xcd\xbd\xb1\xd2\x84\x60\x9e\x65\xef\xb7\x7b\xb8\xf1\xa5\x1f\xc4\xd4\x56\x8a\x70\x5f\xb9\xc9\x7b\x23\x03\xc1\x46\x7d\xff\x8c\x8c\x5e\xe2\x75\x59\xb9\x3a\xd1\xc5\xb9\xc5\xc6\xc7\xc5\x29\xfa\x8c\x55\xc7\x5e\xbb\x59\xb2\xa8\x18\xaa\x9b\xda\x1e\x9e\x79\xbc\x66\x02\x97\x72\xf8\xae\xa1\x1b\xad\xd3\x22\x65\x65\xd5\x4f\xd0\x1b\xda\x8c\xb2\x70\xe7\x0d\xc9\x33\x9b\x46\x90\x0b\x58\x18\xe9\x32\x07\x5b\xe6\xc2\x8e\x73\xa1\x91\xd0\x2c\xbd\xc7\x45\x4b\xe1\x23\x87\xb0\xd4\x7a\x1a\xb1\x42\x32\xd2\x34\x2a\x6f\x15\x18\xea\x97\x09\x8b\x81\x5a\x1c\xa3\xf9\xc7\x0b\x25\x72\x2b\x1b\xcd\x7d\xac\xda\x63\x56\x22\xfc\x8e\x72\x95\x9f\x57\xf7\x67\xea\x56\x3d\xa4\xc1\x58\xee\xf7\x20\x01\x09\xf6\x14\x16\xc2\xe7\x04\x39\x92\x30\x62\x43\x7b\x1d\x08\x2a\x8c\x7f\x43\x94\x71\x3c\x1b\x7b\xa0\x58\x7b\x84\x1c\x11\x44\x75\xee\x3f\xf0\x59\xdf\x8c\xfa\x12\xa3\x21\xd9\x01\xcb\x47\xf5"}, +{{0xa3,0xd2,0x35,0x05,0xd0,0x7c,0x5f,0x93,0x7f,0x13,0x63,0x9d,0xbd,0x81,0x8e,0x85,0x14,0x52,0x34,0xee,0x70,0x17,0xec,0xee,0x86,0x36,0xc7,0xba,0x76,0xeb,0xef,0x5b,},{0xfd,0x7f,0xdb,0x3d,0x02,0x2b,0xa3,0x6e,0xad,0xfe,0xd0,0xda,0xaa,0xe5,0xbf,0xf0,0x45,0x05,0x40,0x3f,0x17,0x14,0x73,0xe4,0xd3,0x61,0xee,0x8d,0x15,0x0a,0x0e,0xb4,},{0x67,0xa6,0x67,0xee,0x0d,0x62,0x54,0xca,0x0a,0x8f,0x21,0x25,0x82,0xc0,0xcb,0x8b,0x6e,0xd9,0x7c,0xc9,0x67,0xdb,0x02,0x12,0x96,0xad,0x6a,0xa9,0x9f,0x0a,0xd3,0xa9,0x44,0x97,0x8c,0xfd,0xaf,0xf1,0x3f,0xe5,0xf8,0xc6,0xe8,0x8c,0xbd,0x83,0x1a,0x54,0x73,0xd0,0x74,0x2e,0x37,0x34,0xb3,0xe2,0xdf,0x00,0xff,0x32,0x40,0xa5,0xde,0x02,},"\xbc\x29\x8e\xd6\x98\x92\x90\x40\x28\x72\x5e\x21\xb1\x14\x46\x2d\x89\xd8\xc0\x06\xdc\x88\x4b\x17\x87\x56\x83\x8a\xf4\x95\x4f\xf0\xf1\xb7\x95\x17\x30\x7a\x25\x8a\x0e\x76\x81\xe8\x79\xac\x47\xd7\x92\x02\x30\xb0\xcc\x1d\x66\x17\x1e\xb2\x14\xd7\x7c\xd9\x7f\x61\x7c\x40\x5e\x6c\x21\x72\xfc\x58\x9f\x16\x25\xcc\x5e\x1b\x59\x31\x10\x53\x1f\x6e\xb5\x3f\x1e\x6f\x48\x6d\x19\x64\x61\x24\x47\x75\x0a\x04\x1f\xe5\x1b\x33\x2e\xb3\xfb\xc7\x11\x61\x6c\xe3\x5f\x04\x04\x42\xb4\x31\x63\xb8\x0b\x75\x1e\x21\xec\x12\x45\xf1\x2e\x48\x83\xc7\x9d\x3b\x41\x32\x82\xc6\x9b\xfc\x6a\x46\x5d\x1e\x78\x96\xba\xb0\x38\xdc\x89\xb4\xcf\xc0\x32\xfc\xcd\xfc\x87\xb0\x7f\x06\x11\x0e\x1f\x50\x6a\xcc\xa8\x15\x7a\x32\x25\x43\xbf\x1e\xd8\x90\x67\x27\xf2\x8d\x0d\x68\x9b\xcd\x7d\xd3\xdf\x85\x93\x52\x04\xa9\x04\xab\x3f\x7a\x0d\x99\xc1\x6e\x5a\x54\x2c\xc2\xbc\xde\xbf\x5b\x50\x2d\xba\xbe\x33\xb9\x72\x48\x0e\x02\xe7\x1a\x43\x8a\x19\x80\xa8\x76\x6f\x10\x8b\xd8\xad\x51\x10\x42\x23\x99\x4d\x9b\xfb\x3c\x3a\x4b\x7a\x59\x23\x8c\xe2\xef\x7d\x72\x88\x38\x3f\xfb\xf2\x91\xe1\x60\x2b\x38\x4a\xf6\x07\x00\xd7\xda\xf0\xe8\xfe\x60\xf8\xca\xed\xe4\x3d\xb0\x6b\x3f\x4c\x8c\xff\xf7\x49\xae\xaf\xa4\x6f\xc6\x1c\x49\xb2\xd5\xa4\x12\x04\xcf\x86\xf0\x49\x25\x4d\x80\x9e\x94\x98\xaa\x9d\x4c\xfd\xb9\x4a\xcb\x2b\xab\xfc\xf7\x86\xdd\xfb\x03\x69\x15\x16\xb3\x83\x8b\x0d\x4f\x20\x1c\xb2\x59\x1e\xdb\xb0\xb0\xf6\x74\xe1\xe2\x82\x03\x16\xb7\x2e\x81\xb4\x8c\xc5\xa6\xb2\x93\x38\xbc\x36\x68\x1f\x8f\x7d\xca\x43\xee\x6c\x0b\xd2\xe4\x02\xaf\xbf\x96\x77\x97\x51\x64\x53\xbc\x01\xbe\x86\xbf\x42\x29\x9d\x1b\x73\x6a\x0d\x97\xbb\xc9\x22\xf5\xa7\x8a\xf2\xdf\x42\xe6\xf8\xc2\x8e\x95\x3f\x2c\xea\xda\xff\xc5\xe9\x30\x64\x04\x1e\x42\x5a\xd6\x97\x5f\x88\xc7\xaa\xdf\x81\xc3\x68\x69\x1a\x58\x1e\x88\x5f\x2a\x6b\xa7\x2e\xd6\x8b\x8f\xef\xbc\xd6\xce\x36\x86\x26\xd4\x48\x92\xa2\x02\x70\xb5\xf7\x09\xc2\xe3\x4b\x83\x35\xd4\x2e\xeb\xd6\x7a\x24\xdf\x73\xf4\x54\x55\xc4\x19\x44\x18\x7b\x66\x92\xf0\x54\xb2\xfc\x95\x91\x37\x3f\x19\xfc\x71\xaa\x7f\xa2\x7d\xf6\x00\x6a\x1d\x54\x9b\xbf\xae\x7d\x3c\x3e\xb3\x6e\x5a\xb2\xaa\xa1\x0a\xa5\x53\x8d\xa7\xef\x36\xc8\xff\x35\x4b\x60\x58\x13\x40\x04\xd6\x60\xa4\x03\x63\x21\xca\xad\x00\xa3\x0b\x1c\x49\x8b\xa3\xd8\x08\xc4\x40\x5e\xf7\x96\x18\xfc\x22\x12\xa7\xb8\x33\x96\xa3\xd7\xce\xdc\xeb\x86\x3c\x66\x37\x4d\xc4\x69\xae\x18\x3c\x7e\xd7\x4b\x3e\x70\xd6\x37\x4a\x06\x2d\xe0\x37\x9b\x21\xcf\x25\xd3\xc4\xc5\x76\x21\x15\xcd\xfe\x75\x55\x45\xe8\x9a\xd4\x05\x2b\xb0\x27\x9d\x93\x8e\x90\xde\x3a\xbf\x50\x44\x10\xca\xad\x72\xb7\xc2\x9f\x53\xd0\x1d\x9d\xd7\xf2\xec\x5e\x45\x9a\x04\x59\x2b\xdd\x66\x41\x66\x13\xe6\xed\xd0\x04\x56\x9e\x0e\x6c\x98\x82\x7b\x8c\x1d\x70\x02\xa6\xd1\xbf\x30\x3e\x18\x25\x95\x01\xdd\x89\xf6\xee\x94\x76\x6d\x18\xaf\x81\x04\x63\xeb\x13\xb2\xef\xdd\xf1\x72\x3a\xf7\x35\xa8\x87\x16\xe1\xfc\xb4\xb7\xb4\x3c\xb9\x7e\x1c\xc9\x03\xb2\x40\x8e\xf4\x53\xad\xa4\x16\x47\x86\xf0\x08\x45\xfb\xfa\x1f\xfc\xa5\xcc\x3e\x1c\x4b\xd9\x94\x0e\x7d\x99\xae\xf9\x19\x16\x6d\x05\x8b\x51\x45\x3c\x9c\x14\xfb\x9f\x32\x51\xec\x5f\xe4\xf1\x53\xc7\x0a\x44\x92\xdc\x34\x96\x29\x61\x86\xf2\x3a\xd4\x7e\xba\xd1\x3c\x66\xe6\x87\x27\xce\x50\xba\x94\x87\xf1\x80\x18\x90\xb6\x93\xef\xeb\xfc\x37\xbb\x5d\x95\xf8\xaf\x54\x8e\xc8\xd6\x49\x82\x89\xe5\x5f\x98\x83\xfc\x5b\xe8\x4c\x25\x6d\x2b\xc5\x48\x49\x38\xc7\x09\x82\x0d\x9b\x6b\x80\x59\xc0\xaa\x42\x67\xdd\xe6\x90\x78\xe4\x87\xc8\x86\x5c\x0b\x13\x0a\x0c\xa8\xca"}, +{{0x6e,0x26,0x51,0x05,0xee,0x71,0x71,0xd1,0xbd,0x79,0x3e,0xff,0xd8,0x7d,0x1e,0x2c,0x79,0x45,0x0d,0x5e,0x18,0x8b,0x57,0xbe,0x3a,0xa1,0x62,0xe2,0xa5,0x25,0x28,0xad,},{0x1f,0x40,0x3c,0x7a,0x75,0x50,0x31,0xc1,0x3c,0xa6,0x3a,0xf5,0x76,0x35,0xdc,0x6e,0x2c,0x4f,0x23,0xbd,0x6b,0x1d,0x67,0xca,0x65,0xda,0x68,0xb0,0x99,0x43,0xc5,0x54,},{0xb5,0xa8,0x3a,0x11,0x7a,0x60,0x34,0x5a,0x67,0xe4,0xa6,0x65,0xf3,0x7d,0xe7,0x22,0xa6,0xec,0x03,0x91,0x38,0x29,0x38,0x99,0x59,0xf3,0x76,0xee,0x62,0x64,0x77,0xe6,0x54,0xac,0x8d,0x72,0x0f,0xc7,0x27,0xd4,0xbb,0x8f,0xe1,0x54,0x4f,0x5d,0x0b,0x0b,0x85,0x05,0x14,0x29,0x0b,0x24,0x27,0x3c,0x4c,0xd4,0xb7,0x3a,0xca,0x4a,0x53,0x00,},"\xf8\xb9\xd4\xb0\x27\xeb\xb1\x0e\xe5\x11\x81\x9e\x6e\x56\xfb\x1b\xa9\x58\x40\x18\x41\x8d\x82\x88\x5a\x38\xa4\x49\x08\x60\x07\xb8\x78\x5b\x51\x05\xca\xf7\x82\xbf\x9b\x36\xda\x03\x9c\xc6\x0e\x22\x7c\x7e\x16\x14\xf2\x9b\x64\x0b\x1e\x9b\x22\x74\x7e\xea\x7a\x67\x25\x61\x4e\x89\xe0\x78\x3e\xbe\xbb\xb7\xee\x55\x7e\xf3\x6b\x2b\x46\xcf\x64\x61\xe5\xbe\x2a\xd1\xd7\xa7\xc2\x71\x1a\x47\x5c\xa4\xfb\xc3\x30\x92\xba\x42\x56\x67\xe3\x4d\x09\x00\x60\x51\x8f\x2f\xec\x63\x6b\x04\x91\x23\x87\x6a\xb2\x1c\x8b\xd9\xc5\x0d\xcc\xb9\x84\xca\x01\x1a\x02\xee\xa0\x20\x56\x4f\xa8\x21\xfc\x36\x2b\xfe\x39\x2a\xab\x50\xc2\x73\xfc\x7b\x5a\x04\x21\x88\xe3\x31\x62\x1b\x9d\x2f\x74\x3e\x5c\x8c\xf3\xab\x1f\xaf\xfa\xfe\x2a\x00\x04\xc8\xef\x7c\xdf\x5e\x6d\xbb\x5e\xb5\x44\xe4\x28\x9f\x71\xa6\xfd\x15\xc6\x38\xce\x29\xd2\x8e\xfb\x9c\x03\x9e\x47\x74\x29\xa3\x49\x7a\x83\x82\x7e\x76\xce\x77\xa4\x98\x16\xd9\x0b\x41\xa8\xe1\x52\xf3\x7a\x09\xe6\x34\x0d\xfe\x06\x9a\x4a\xc6\xf2\x7d\xd2\xea\xc7\x47\xfd\x21\xe3\x15\x20\x88\xc1\xb1\xec\xd3\x2a\xc6\x79\x92\x74\x90\x75\x04\x88\xc2\x91\x78\x51\x47\xb6\x3b\x0b\x8f\xf1\x1d\x18\x9b\x90\x49\xb8\xa3\x96\xb6\x93\x2f\x85\xbd\x6a\x15\xef\xf9\xf0\xce\x18\x08\x41\x1a\xf0\xf9\xc8\xe6\xe9\x7b\x81\x4f\x11\x0b\xd4\xdf\x13\x86\xa9\x79\x7d\xc5\x11\xf0\xaa\xb6\xab\x65\x07\x1d\x9e\xa8\x36\x53\x2c\xec\x51\xb9\x2c\xa7\xfb\xdb\x8d\xe1\xc8\x43\x66\x58\xde\x2e\xb6\x5e\xdd\x86\x04\x4f\x6c\x1a\xba\x31\x78\x64\x7a\xd6\x78\x61\x2e\xe7\x4f\x04\x6c\xa3\xc7\xfe\x2f\x39\xc0\x9d\xd2\xe0\x7d\xf2\xb4\x22\x70\x85\xfe\x93\x6e\x79\x4d\x22\xfd\x5f\x40\xa2\x5f\x08\x77\x15\x80\xac\x80\x1d\x98\x89\xf5\xa7\x6a\xea\xe1\xf0\xcc\x4a\x9e\x1e\xdb\xdd\xa3\x75\x0c\x74\xc8\x50\x52\x4b\x32\xf4\x49\x33\xfd\x88\x3b\x53\x72\xbf\xb7\xe7\x61\xe0\x69\xfe\x7c\x1c\x0e\x7f\xbd\x4a\x7f\x58\x46\x7e\xa6\x88\x3f\x9d\x5b\x7f\x66\xd3\x86\xb0\x49\x9b\xb6\xfb\x5e\xad\x89\xc9\xa1\xfd\x2c\xce\xb9\x73\xe2\x87\x9b\x5d\x03\xea\xa4\x52\xe1\x60\x22\xd5\x96\x17\xda\xa0\x48\x6f\x4d\x4c\x11\x78\x07\xfd\xa8\x49\x9d\xfb\x7a\x28\x6f\xd2\xf7\x1a\x8e\xb5\xfe\x64\x06\x5c\x41\xe4\xe1\xe2\x36\x2a\xb4\xe4\x77\x96\x9e\x3a\x40\x8a\x24\x7e\x3a\x56\xfc\x86\xf2\xb0\x1e\xf8\xd3\xcd\xda\x87\x25\x82\x34\xbc\x7f\x25\xb6\x69\x07\xf3\x64\xb3\x7b\x62\x45\x29\x6c\x4f\xdf\x49\x9f\x20\x23\x7f\x48\x64\x85\x2f\xc5\xd8\xcd\x5d\x05\x41\x8b\xe8\xb1\x38\x59\xee\x9a\x43\xe1\x7e\x1f\x57\xa4\xc3\x5e\xa2\x82\xed\x68\xeb\xcd\xa6\x82\x81\x74\x24\x5a\x49\xc6\xcb\x65\x90\xeb\x1f\x2d\xcf\xb0\x07\xbf\xa1\xc3\x20\x77\x95\x6d\xa9\xac\xbe\x3e\xf0\x72\x37\x99\xfd\xb8\x69\xd8\xde\x30\x70\x6a\x9c\x02\x68\x14\xd1\x6a\x01\xe0\x33\xc9\x1b\x59\x07\x0d\xfe\x44\x5c\x5b\x84\x8a\x51\x66\x12\xe5\x13\x1f\xe8\x48\x69\x21\xe3\x6b\x8e\x7e\xf1\x57\xa8\x88\x22\x88\x6c\x68\x1b\x5d\xa7\x1f\xea\x94\xd9\x57\xda\xfe\xc2\x6f\x41\x47\xa3\xb2\xac\x38\x3a\x5f\x47\xc8\x58\x5e\xb1\x7a\x8a\xc6\x57\x90\x64\x1b\x42\x18\xd7\x55\xf8\xbe\xa4\xd9\x7a\xe2\xa4\x5b\xdc\xdc\x23\x23\x62\x94\xd8\x52\xc9\x5d\x08\x40\x6d\x2e\x9b\xd3\x0c\x32\x64\x52\x53\x8c\x1f\x5e\x50\x04\xd4\xa1\xa8\x27\x20\xda\x32\xe5\x9d\xc3\xab\x18\xea\x08\xa0\x58\xf7\x91\xd2\x44\x18\x55\x60\x86\xc1\xe4\xed\xce\x89\x82\xaa\x23\xb1\x18\xfb\x26\x6e\x60\xb5\x42\x78\x0a\x69\x33\xad\xd9\x13\x26\x55\x12\xc0\x7b\x11\x49\x78\xd4\x4a\xf7\x3b\x20\x30\xec\x47\xb0\x6f\xd0\x9d\xda\x8c\x4f\x1d\x4e\x31\x37\x75\x46\x8c\x45\x1f\x9e\xe6\x11\xe9\xcd\x4c\x08\x45\xc2\x50\x19\x48\xa7\xb1\x4e\xf1\xd4\xb5\xcf"}, +{{0xc4,0x37,0x0d,0x2a,0xaf,0x35,0xac,0xd1,0x58,0xfc,0x0d,0x16,0x22,0xa3,0x99,0xc9,0x9f,0x41,0xb9,0xda,0x4e,0x97,0x0b,0x35,0x4e,0x5b,0xa0,0x5c,0xbe,0x84,0x4c,0xa8,},{0x35,0x45,0xd7,0xd4,0xc9,0x5c,0x3d,0xb6,0xa5,0x45,0x30,0x53,0x7a,0xfa,0xfa,0x4d,0x86,0xdd,0xec,0xf9,0xcc,0x7e,0x66,0xc3,0x19,0xba,0x9f,0x7d,0xd7,0xd0,0x7e,0xe7,},{0x9f,0xeb,0xab,0x5a,0xe1,0x61,0xd6,0x92,0xa6,0xa3,0x94,0x50,0x0a,0x28,0x90,0xd2,0x1c,0x7f,0x0e,0xe2,0x6f,0x46,0x40,0xaa,0xba,0x4f,0xe6,0x6b,0x90,0xb8,0x9e,0xdc,0xb8,0x0e,0xa4,0xcd,0xca,0xbb,0x4d,0x2c,0x3a,0x5c,0x41,0x54,0xe8,0xff,0x20,0xd0,0xe2,0x37,0xfe,0xfd,0x00,0xc7,0xba,0x97,0x82,0xe1,0x74,0x8f,0x64,0x88,0xac,0x01,},"\x61\x9f\x57\xde\x2b\x1d\xba\xee\x20\x9a\x82\x5d\x8c\xa9\x7f\x84\xee\x49\xeb\x12\xa0\xb1\x3d\xcd\xd2\xb3\xa4\xee\x45\xe0\x17\x6d\x47\x4c\xf0\x94\x60\xc8\x31\xa8\xae\x1d\x3f\x39\xbe\xeb\xd0\x88\x08\xb3\xed\x17\x61\x21\x3b\xa9\x53\x42\x18\x60\xcc\x07\xe2\xdb\x31\x2e\x68\x0d\xf0\x3e\x60\xa6\x87\x02\x64\xab\xca\x8f\xd5\x13\x01\xe1\xc1\x56\x20\x23\xd8\x02\xcc\xd5\xc7\xd1\x96\xdb\x39\xfb\xb8\x30\x4b\x0e\x59\xe3\x33\x16\x41\x92\xec\xc3\x33\x38\x7e\xef\x69\xc7\xa7\x8a\x5d\x11\x25\x88\x62\xd6\xc2\x81\xb1\x9c\x0b\xd3\x36\xcd\x3e\xdb\x2f\x9f\xaa\xd4\x02\x1a\xc2\xf2\x05\xc1\x68\x14\xb3\x85\x48\x43\x3f\xf9\xed\xdf\xd6\x11\x33\x77\x97\x69\xdc\x69\xaf\xac\x65\x8a\xfc\x1d\x1b\x41\x6d\x39\x0a\xd5\xb4\x5a\x1a\xd5\xcc\x4b\x00\xb4\xb2\x78\xfb\xe4\xb5\x9d\x52\xe6\x1a\x6a\x5f\xd0\x02\x41\xc6\xcb\xc3\x82\xd2\xd6\x21\xa3\xde\xd0\x02\x01\x9b\x33\x05\x60\xe3\x61\xfa\xab\x28\xf4\x1d\x1a\xf9\xc9\xc0\x02\x0f\x2b\xaf\x99\xe8\xd8\xee\x58\xe3\x12\x22\x02\x14\x7c\x0a\xdc\x57\xd6\x70\xc5\xb3\x80\xaf\x59\x4c\xc7\xed\x57\xb8\x7e\xc6\x67\x4a\xb6\x3f\x3a\x98\x49\x75\x3b\x94\x62\xaa\xb5\xde\x88\xc9\x48\xa8\xb1\x09\xaf\x4d\x49\x54\x92\x7a\xac\x58\xbe\xe9\x53\xbe\x0d\x8d\x7d\x71\xaa\x11\xd1\x1f\x1a\x87\xb1\x47\x7b\x91\x70\xbd\x73\x5c\xfc\x24\x49\xf0\x51\xb8\x2b\xc5\x9b\x0b\xee\x76\xa1\x72\xe8\xd3\x26\x70\xf5\x1d\xdd\xdb\x80\x4a\xd1\x10\xa5\x65\xe3\x84\xcd\xb7\x6f\xad\x04\xcf\xf6\x78\x93\x09\x1e\x41\xe6\x9c\xfd\xf7\x0e\xa9\x26\xc2\x63\x69\xa5\xb6\x19\x3b\x19\xab\x0a\x62\x55\x8d\xa5\x5f\xfa\xfe\xb8\x78\x97\x57\x71\x06\x44\xaa\x19\xf4\x74\xbe\x4a\xda\x9d\xc1\x84\x9b\x07\xd5\xe1\x7b\x85\xf9\x21\xe1\x01\x6a\x54\xaa\x60\x95\x77\x72\x53\xa7\x34\x26\xfc\x78\x64\xb9\x95\x5f\x04\x90\x70\x23\xdb\x20\x7f\x85\xdd\x21\xa6\x51\x06\xcf\x0d\x62\x23\x85\x87\x0c\x34\xc2\xda\x9a\x11\xe4\x72\x63\x95\x12\x1e\x4a\x67\x61\xfb\x52\x22\x29\xd9\xe5\xcc\x9d\xab\x35\xae\xb8\x7d\x0d\x79\x69\x3c\x00\x6f\xde\x1c\xfa\xf1\x16\x20\x8b\xba\x96\x20\x59\xcf\xc0\xd2\xd6\x37\x0a\xac\x77\x48\x36\x2e\xe6\xa0\xa3\xca\x7b\xf1\x33\xeb\xcf\xa2\x0f\x1c\x4e\xd8\x30\x7f\x80\x0c\xca\x7e\x6c\x4b\xea\xa3\xfb\x2a\xb0\x86\x12\x53\x64\x28\x5c\x44\xed\x1a\x73\x7a\x67\xcb\xf3\xb7\x63\xc9\xf8\xb1\x42\x7e\x89\xdf\xa9\x6d\x29\x0e\x9d\x48\x42\xfe\x63\x16\xaf\xef\x83\x4c\xd8\xcd\x1f\xdc\x1f\x12\x4c\xa3\xfe\x26\x26\x6d\xa6\x2e\x27\x5c\x0b\xf7\xfc\xc8\xe5\xf9\xbb\xa6\xc0\xd3\x8e\x23\xfa\xfa\xb1\xe0\x49\x48\x17\x94\xc1\x4f\x4a\x8c\x53\xbe\x1c\x96\xf7\x69\xc9\xb1\x3e\xac\xa3\x9a\x0e\x49\x36\x6d\x2c\x9f\xfe\x8f\x20\x63\x60\xa9\xd5\x03\xde\xc5\x98\x62\x11\x12\xe3\x77\x67\x13\xe7\xfc\x06\x49\x43\x3e\x25\x7e\x50\x3a\x54\x60\x59\xa9\x89\xda\x89\x15\x7d\x76\x47\x60\x05\xfd\x90\xe4\xb0\x7a\xaf\x0d\xb0\xbc\x0b\xc0\xb6\x7d\xb8\xdc\xba\xdf\xf3\x93\x74\xe1\xaf\xae\x55\x16\x34\xe0\xe3\x28\x31\xad\x0e\x5f\xa7\xd5\x21\x6f\xa7\xc6\x44\xf7\x3e\x1e\x8e\x07\x23\x83\x94\xa4\x16\xc1\x69\xaa\x9d\x53\x03\xf4\x69\xa5\xd4\x07\x43\x08\x72\x1f\xfd\xde\xff\x65\x59\xe5\xad\xf0\xc2\x77\x3b\x3f\x52\x64\xe7\xaa\xa8\xc2\xdb\x88\x8e\x28\xe8\x15\xc7\x10\x69\xc3\xb4\xce\x6c\x29\x03\x4c\x0a\xb3\xb5\xc1\x9a\x80\xa9\xd8\xc2\xe8\x74\x81\x35\x31\xc4\x22\x75\x2a\xd6\x2b\x3c\x5a\x1a\x3d\x6c\x5a\x5d\xb5\x87\x27\x06\x93\xaa\x75\xd5\xf1\x72\xee\xdd\xf4\xeb\x83\x9b\xd7\x93\xaf\xfb\x1c\x79\x6a\x1d\xf0\xe4\x42\xdd\xf9\x9b\x78\x0a\xa4\x1e\xea\x0f\xe6\xf8\x65\xbb\x53\x9c\xa5\x3a\xa4\x5d\xb9\xa8\x56\xcb\x75\xd0\x15\x1d\x35\xed\xea\x80\xf2\x94\x6d"}, +{{0xbd,0x3d,0xe1,0xa1,0xd1,0x64,0xbd,0x6e,0x9b,0xe0,0xa6,0xd1,0x07,0xf7,0x03,0xa6,0xdd,0x91,0x4c,0x86,0x67,0xcd,0x34,0x1d,0x13,0x9f,0x19,0x57,0x8d,0x93,0x3b,0x16,},{0x9b,0x02,0x49,0x64,0xbd,0xfa,0x85,0x2e,0xb2,0xd4,0x14,0x4f,0x35,0xb7,0xcd,0xc2,0x67,0x81,0x14,0x3c,0x2b,0xd7,0xf6,0x60,0x23,0x3f,0x8b,0x8a,0xa3,0x60,0x71,0xee,},{0x13,0xcc,0x15,0x8f,0xd0,0x61,0x79,0x2f,0xce,0xd1,0x56,0x87,0x95,0x98,0x25,0x1d,0xd0,0x1d,0x57,0x5b,0x40,0x0f,0xe3,0xe3,0x9a,0x70,0x08,0x63,0xaa,0xe8,0xdb,0x1f,0x91,0x97,0xfa,0x50,0x1c,0x0c,0xf9,0x93,0xe4,0x4d,0x6a,0xc5,0x51,0x80,0xb8,0x69,0x83,0x8e,0x8a,0xe2,0x4b,0x21,0x4f,0xa3,0x5e,0x24,0x4b,0x7a,0x6c,0xff,0x6d,0x0d,},"\x17\x69\xfc\xdb\xf5\x12\x47\xed\x4c\x83\xa0\x0b\xbb\xf0\x2f\x44\x28\xda\x6f\xce\xdd\xd0\x16\x1a\x02\xfc\xcd\x15\x00\x97\x06\x65\xe1\xc7\x63\x0a\xd2\x2e\x3d\x97\x49\xc7\x92\xe7\x1a\x26\x0c\xff\xf6\x05\x32\x56\xe0\x2f\x5b\x47\xbb\xa1\x4b\x76\x1a\xe5\x3c\xa7\x21\x9e\xd2\x80\x1d\x2d\x78\x8e\x26\x41\x9f\x36\xc8\x1e\xf9\x2c\x23\x03\x68\x37\x35\xc8\xa1\x75\x6a\xda\xb6\xa4\x87\x92\x31\x53\xe4\x35\x60\x3c\x96\xb2\x39\x55\x3e\xdf\xde\xb0\x93\x29\x8f\x7a\xe7\xdc\x90\xf1\x6a\x7e\x56\x64\xb9\xe4\xc0\x2b\xa7\x31\xa2\x3c\xf2\x23\x4e\x25\x0a\xc9\x74\x26\x33\xa9\x32\xa9\x48\xbb\x83\xdc\x3d\x79\x4d\x05\x9f\xed\xf4\xec\x86\x18\xc7\x43\x3c\x5d\x8f\xe5\xe6\x2c\xf0\x7b\x57\x68\xc4\xd9\xb2\x61\xc7\x15\x36\x80\x4f\xe2\xe7\xca\x70\x98\x87\x65\x21\xd5\x76\x77\x36\x14\x24\xe4\x7f\x1b\x95\x92\x37\xf9\x07\x10\x42\x1f\x5b\xc4\xf1\x09\xf7\xd4\x89\xc7\x55\xe9\x4e\xef\xdf\xb3\xc8\x5b\x90\xec\x01\x31\x81\xa2\x3b\xb9\x53\x5f\xee\xa4\x94\x1d\x0a\x06\xa5\x40\xbd\x6b\x58\x8e\x55\xb7\xf3\x57\x57\x14\x9c\xa3\xe6\x40\x96\x5e\x1a\x0f\xf7\xf3\xc8\x25\x92\x59\x95\x7f\xf5\xda\xb9\xfb\x87\x32\xea\xe7\x19\xb6\x24\xa4\x49\x28\x78\x17\x9b\x5a\x83\xab\xe5\x1c\xaf\x02\x08\x3d\x73\x7c\xeb\x4f\xcf\x04\x2f\x2e\x60\xba\x02\x97\xac\x72\xb8\x7f\xe3\xe1\x4b\xa5\xfb\xc5\x4b\x48\x09\x10\x73\x89\x68\x23\xbf\xa2\x89\xce\x8e\x16\x87\x3b\x48\x81\x2c\x32\xbf\xea\x5f\xf6\xbb\x22\x1d\x1e\xa5\x46\x3d\x32\x5b\xbe\x31\x1e\x7f\xd1\xe7\x83\xde\x65\x0b\x79\x52\xea\xe4\x61\xd6\x3b\xc7\x47\x05\x22\xaf\x5b\x77\x89\xf8\xfc\x2e\xb1\x92\xd2\xcf\x77\x6c\x5c\x24\xb4\x4e\x29\xcd\xb0\xcc\xcb\x1d\x90\x36\x14\x38\xe4\x95\x0f\xf3\x4d\xbc\xb3\xcb\x0e\x81\xcc\x45\xf8\xd0\xff\x57\x09\x49\xf7\x80\x84\xe1\x06\x0f\xf5\x59\x4a\xd5\x16\xf5\x0f\x1c\xb0\xa7\x65\xe1\xc0\xe0\x38\xd5\x94\x3b\x93\x6e\x4a\x8b\x49\x33\x54\xe7\x9a\xbc\x91\x7b\xb9\x27\x12\x66\xee\xba\x77\xa9\x3a\x65\x7f\x9a\xd8\x7b\x29\x1a\xc7\xea\x38\x6f\x5d\x4f\xcb\xc5\x82\xe7\x2d\x5c\x23\xd9\x2b\xa9\x44\xb0\x06\x4c\x20\xe3\xe2\xdc\xf5\x04\xbc\xc7\xc6\x96\x6c\x63\xf2\x08\x08\x43\x60\x0b\xa3\x13\xec\x27\xcb\xa9\x5e\x7e\xf3\x18\x16\x8c\x90\x67\xdc\xe8\x6c\x1e\xf0\xd5\xd9\xeb\x7a\x61\x58\x48\x9d\xf3\x2e\xd5\x8b\x69\x31\x03\x08\x18\xf0\x07\x05\xa0\xdc\x55\xd3\xdb\xf8\x00\x6a\x85\x46\x64\x1b\x18\x65\xd9\x19\xbc\x24\x22\x02\xcb\x3a\xe3\x00\xbf\x86\x53\xe3\xb3\x78\x94\xc3\xdc\x0e\x47\x7b\x9d\x7c\x41\xba\xf8\xd3\x88\x7c\x2e\xb5\x9b\x1e\x4d\x50\xbb\xb6\xf1\x79\x2a\x1c\x93\x67\xc6\x5c\xdb\x45\x0c\x2d\xfa\x21\x45\xe6\x11\xa9\x7a\xd8\x1c\xff\x1f\xd8\x3c\x6c\xf7\x23\x09\x47\xea\xff\x4c\x21\xdc\x1b\xaf\xb7\x1e\xc4\x1e\x5b\xc7\x2b\x37\x45\xec\x3e\x38\xbf\x59\x30\xc1\x26\xd0\x60\xf0\xc5\x0a\x89\x5f\x00\x9a\xa1\x8e\x87\xf2\x17\x4f\x58\xab\x53\x79\xa7\x21\xfd\x83\xaa\xd5\x51\x7f\xd9\x9d\xff\x14\x6e\xde\xea\x61\x52\x12\x35\xe2\xf1\xa1\x6e\xe5\x83\x03\xe0\x91\xbe\x8d\x57\x90\x94\xc1\xd8\xa2\x0b\xc7\x4a\x55\x0d\x77\xc0\x0d\x08\x75\x71\x51\x7a\x63\xcd\x41\x26\x93\x3a\x4f\x09\xa0\x70\xbf\x8e\xa4\xff\xb8\x46\xa9\x78\x0e\x97\x34\x04\x3b\xac\x4c\x0f\xf4\x7b\x1a\xfc\xcf\x52\x93\xac\x14\xbc\x73\xeb\xf6\x71\x29\x65\x7e\x4b\x8a\x8b\x33\xdd\xac\x7b\x0f\x4d\x71\x9d\x2d\xc6\x5d\xf6\xea\x0a\x3f\x24\xcf\x44\xc8\x33\x8e\xd6\x01\xa3\x93\x9c\xa3\x58\xfc\x4b\xe1\x3e\x8e\xde\x02\x75\x39\x71\x2c\xa2\x3e\x3f\xfb\xa7\x06\xe8\xfd\xd6\x2a\x07\x4e\xe0\xad\x74\x20\xf7\x80\x60\xcc\x96\xfb\x2a\xbf\x30\xe9\xea\xa2\x41\xc0\xf8\x7e\xbb\xe3\xec\x73\x51\x75\x96\xf7\xc3\xc5\xa8\x0c"}, +{{0xf6,0xae,0x51,0x6a,0x51,0x29,0x6f,0xc5,0x23,0xce,0xa5,0xf0,0x08,0xcf,0xbd,0x09,0xe7,0x3f,0x78,0xb6,0xfd,0xd3,0xb6,0x94,0x26,0x12,0x80,0x41,0xa5,0x60,0x4c,0xf9,},{0x37,0x6c,0x82,0xba,0x7b,0x87,0xaa,0x77,0x41,0x87,0x27,0xdb,0x33,0xd3,0x26,0xae,0x75,0x8b,0xf7,0xa1,0x35,0xc1,0x04,0x60,0xcd,0x8b,0xf8,0xfe,0xb8,0x3c,0x2b,0x10,},{0x0f,0xe4,0xdd,0x7e,0x1f,0x60,0x8e,0xe8,0x2b,0x7f,0xe8,0x63,0xd1,0xb0,0x3a,0x81,0x84,0x3c,0xe2,0x0c,0x76,0x2c,0xd8,0xbb,0x24,0xef,0xd4,0x6b,0xa0,0x25,0xff,0xf3,0x33,0x1d,0x87,0x57,0x52,0xca,0x72,0x20,0xc5,0x3d,0xd3,0xc7,0x1f,0x2b,0xc1,0xe2,0xc6,0x4a,0x2f,0x9c,0x58,0x86,0x5a,0x2a,0x24,0x48,0x09,0xf4,0x13,0x4e,0x53,0x07,},"\x83\x42\xf2\x5a\xc4\xb1\x7e\xba\xd6\xf7\x9b\x9a\x03\x31\x75\xc7\xf2\x8a\xf0\x9e\x65\x8e\x8c\xb9\x8c\x29\x4f\x15\xc3\xc8\x34\x26\x29\xcb\x2a\x32\x47\xdf\xc8\x75\xb8\x2f\x5b\x38\x0c\x5d\x11\x42\x6a\x2e\xeb\x62\x45\x0b\xd8\x85\x65\x01\x07\xc6\x83\x62\xa3\xb7\x2c\xe8\x23\xf2\xd1\x59\x42\xb7\xdd\xa3\x01\xd2\xfb\x63\x8f\x30\x2a\xa9\x57\x0b\x47\x91\x1d\xad\xd3\xbd\xdb\xfe\xd5\x54\xc1\xc8\x0b\xd7\x18\x07\x8b\x8b\xd2\xc9\xc3\x14\xa5\x16\x6f\x26\x5e\x82\x66\xee\x2d\xb3\x57\x56\x1a\x55\x85\xc4\x14\xa7\x84\x0b\xfa\xe6\x09\xd7\xcd\xdd\xe1\xfa\xde\x85\x56\x0f\x23\xd6\x38\xef\x3d\x52\xe5\x1f\x5c\xf3\x13\xa0\x72\xc5\xea\x0f\x81\x7f\x72\x81\xe2\xcb\xa5\xc5\xc8\xd2\x6c\x92\x85\x92\xb8\x1f\x0f\xf8\xcd\x18\xdb\x5a\x2c\x41\xd8\x80\xd7\x44\x73\x86\x3c\x7b\xbd\x00\x56\xfa\x4d\x4a\xfa\xbd\x17\xa3\xb8\x9d\x97\xd3\xfe\x5d\xc0\x6b\x0f\x61\x2a\x1d\x66\x42\x39\x23\xba\x8d\xfb\xb8\xec\x82\x46\x62\x4d\x83\x78\x4e\xba\x4f\x57\x36\xba\x38\x5e\x44\x22\x96\xc8\xcb\x0f\x1b\x68\xe0\x33\x42\xb2\xc6\xc1\x03\x34\x6f\x6d\xd7\x40\xe2\x6c\x3d\x13\xca\xef\x80\x1d\x1b\x26\x21\xd8\x9f\x06\x93\x91\xa0\x78\xd4\x3a\xe6\xff\x12\xee\xca\x66\xbc\x32\x63\x7b\x45\xf0\xac\x62\x7c\x2d\x7b\xbf\x8a\x49\xd9\x46\x81\x75\xe2\x68\x85\xe0\x28\x21\xd3\xa3\xba\xa2\xc3\xe3\xa6\xbb\x96\xb5\x75\x26\xe2\x24\xcf\x3d\x85\x9f\x66\x95\x73\xcb\xd5\xc8\x73\x93\x74\x61\x56\xf3\xd1\xc7\xa8\x03\x08\xdc\x1f\x24\x05\xbf\x0d\x40\xbe\x1c\xa7\x3b\x76\x7d\xed\xf4\x03\x13\x37\xc0\x81\xbf\xa3\xae\x6e\x54\xf6\x02\x3f\x42\xf0\xcb\xd8\x77\x62\xdb\x55\x91\x3c\x70\x72\x06\x03\x40\x10\xdf\x2a\xa8\x75\x3d\x03\x0f\x03\xc2\x67\xe7\x1a\x9d\xd2\xc6\xc1\x9d\xe3\xe1\x85\x1a\xbf\xac\xbb\xd5\xdd\x5b\xf8\x96\xfa\xb8\xe4\x15\x31\x7b\x49\xf1\xe4\x09\x6e\x3d\xa9\x9a\x5b\x5d\x0a\x3c\x42\xda\xf9\xde\x94\x84\x7c\x1e\x53\xc8\x81\x8a\x5b\x84\x33\x23\xf5\x01\xe3\xa7\xfa\x68\xdf\x89\xa5\xf4\x1f\x2c\x62\xc3\x8d\x17\xf2\x50\xb0\x2a\x67\xfa\xe4\x7d\xaf\x06\x3f\x55\x89\x42\x37\x7e\xf8\xa8\x90\x52\xf1\xa2\x15\xd7\x68\xf7\x91\x3a\x7e\xc1\x4e\x98\xb8\x1e\x4b\x2c\xcf\x26\xba\xca\xd6\xf3\x96\x64\xaf\xc0\xe9\x1a\x3c\xad\x69\x1d\xb2\xbf\x56\xa7\xab\x66\x77\xb4\x95\x96\xdb\x88\x7c\x97\xde\xf4\x35\x08\xa7\xa2\xec\x2a\xb7\x55\xec\x36\x8e\x2e\x53\xd1\xe1\x6b\x60\xff\xf0\x9c\x3b\x52\x26\x3f\x0f\x7c\x1e\xa9\xcc\x35\x37\x31\x97\xe9\x5c\x11\xe6\xd2\x2f\xa9\xd8\x29\x9c\x42\x37\x36\xf5\x81\x4f\x1e\x79\x8d\x22\x75\x18\x60\x0d\xf6\xa7\x90\x35\x8d\xea\xe3\x8d\x56\x39\xe1\x98\x3f\xe0\x18\x43\x6e\xa5\x8b\xa8\x46\x75\x48\xc9\x29\xef\xbb\x16\xdf\xea\x41\x02\x25\x3a\x35\x0f\xb8\x4d\x98\x31\xc4\xc2\xcb\xcb\x76\xe1\x8d\x7f\x3e\x95\x36\x41\xad\xa4\x14\x21\x39\x30\x91\xe6\x3d\xfe\x66\xde\x24\xc9\x92\x32\xc7\xd6\xa2\x83\x7a\x48\x98\x3c\xf5\xb1\x63\x31\xce\x00\x05\x0d\x1c\x71\x39\x58\xff\xce\x5f\x2e\x93\x48\xc5\x2f\x53\x12\x05\x79\xa7\xc9\xa1\x60\x08\xd1\x34\x83\x8e\x59\x61\x29\xc7\x02\xfc\xd2\x11\x48\xbd\xf9\x17\x4d\x48\xe2\xda\x0a\x8a\x66\x35\x9e\xde\xe0\x1c\x50\x09\xef\x67\x42\xfe\xc4\x1c\x1a\xce\xcd\x03\xef\xe1\xcc\xc9\xb1\x30\xd6\xe5\xac\x92\x57\x6a\x85\xcc\xb7\xcf\xc7\xd0\xe4\x23\x31\x06\x17\x29\x31\xa0\x86\x99\x79\x0b\xc4\x1a\xcf\xbb\x73\x1a\xdb\xb2\x6d\x56\xb3\x9a\xaa\x5b\x33\x3b\xc1\xa1\x0e\x2c\x70\x64\xca\x86\x11\x9d\x8c\x71\x71\x48\xf9\x24\x41\xaf\x24\xcd\x2a\xa8\xf5\x7c\x86\xba\x38\xa5\x9a\x10\x0b\x92\x76\xdf\x38\x27\xec\x7f\xb4\xd3\xfa\xf5\x8b\xe3\x1c\x6e\xca\xfd\x69\xcf\x1c\x64\x10\xa4\x9c\xd7\x08\x1f\xf6\xe9\xfc\x39\x7c\x2d\x20"}, +{{0x83,0xf7,0x89,0x90,0x0f,0x04,0x0d,0xc6,0x2f,0x4d,0x18,0x78,0x4c,0xb6,0x4b,0x63,0xc8,0x8e,0x8d,0x18,0x00,0x16,0x96,0xbb,0xeb,0x47,0x07,0xc4,0x69,0xd1,0x1a,0x5b,},{0xed,0xfc,0x2b,0xab,0x7e,0x79,0xf4,0x00,0x37,0xfe,0x4d,0x90,0x41,0xde,0x48,0xda,0x9a,0xee,0x8f,0x97,0x80,0x98,0xd7,0xb0,0xae,0x17,0x92,0x90,0x25,0xe4,0x27,0x3d,},{0xea,0x65,0x82,0xcc,0x23,0xe0,0x46,0x09,0x17,0xf7,0x82,0xd9,0x64,0xe3,0xbb,0x6d,0xcd,0xe0,0xae,0xea,0xc4,0x2c,0xc1,0x49,0x19,0xd3,0x6c,0xe7,0x8a,0xa0,0xaf,0xd9,0x80,0x72,0xf5,0x4c,0x79,0x5f,0xbf,0xd7,0xa4,0x1d,0x99,0xd7,0x06,0x06,0xc2,0x8a,0x5d,0xcf,0x19,0xbe,0x38,0xa0,0xce,0x2d,0x09,0xbb,0x8f,0x84,0x4c,0x31,0xbf,0x00,},"\x6c\x11\x2a\x20\xd3\x06\x57\xab\x5f\x8c\x5c\x04\x47\x8d\x6c\x42\xd1\xc6\xbd\xef\x38\xcd\x4f\xe0\x06\xac\x2a\x57\xe2\x90\xff\x29\x28\x78\x96\xee\xa8\xc3\x0a\x01\x39\xc1\x8f\xc8\xc9\x75\x64\x56\x3e\x86\xc8\xd3\x40\x56\xa6\x71\x9b\xfe\x47\x9d\x9e\x87\xe8\x1b\x19\x45\x23\x31\xbf\xa1\x54\x80\x68\x82\xe5\x03\x9a\x20\xc9\xe9\x54\xb1\xfc\x7c\x01\x5d\xcf\x58\x15\xbd\x7c\xf7\xb6\x35\x7d\xf9\x28\x0b\x9b\xd4\x3f\x89\xff\xc9\x19\x45\x32\x3b\x5a\xcb\x2a\xe0\x02\x54\xd4\x16\x28\x68\xd1\xc8\x3e\xc6\xe0\xfc\xbe\x7a\x8a\xb9\x25\x41\x92\x14\x9c\x6b\xc9\xe5\xfe\x35\x06\x94\x16\x5d\x66\x38\x33\x1e\xb2\x4e\x3b\x13\x90\xc6\x98\xc4\x83\x83\x78\xc0\x1b\x2c\x61\xa3\xeb\xe2\xc0\x60\xb9\x8b\xa6\xee\x02\xb5\x19\xb4\xea\xc1\xe0\xbc\xc0\x9b\x23\x24\xcc\xf5\xb1\xa7\xfe\x8f\xd0\xb1\x54\x5a\x94\x27\x83\x2a\xbb\x25\x74\x4e\xeb\x36\x32\x6b\xe6\x4e\xfe\xd3\xa7\xb0\x7d\x63\x0a\x21\xc3\x08\x1b\x55\x26\x1c\x35\x32\x87\xc6\x6c\x57\x66\x3a\x99\xdb\x46\x6a\x5d\xee\x22\x74\x6b\x81\xc7\x50\xef\x85\xbe\x51\x14\x3e\x22\x1e\xcd\xf1\x14\xfe\xf1\xb3\x08\x2f\xf5\x4f\xd0\x44\xbc\x88\x4b\xfb\x3c\xc5\xc5\x33\x59\x97\x00\x98\x67\xce\x94\x91\xa8\x0f\xe6\x96\x82\x5f\x99\x42\x6d\xef\xab\x6a\x49\xba\xdc\xde\x40\x3f\x58\xe8\x31\x79\x66\x21\x07\x47\xb5\x67\x75\x4d\xe5\x30\x76\xb3\xec\xbf\x65\x34\x6c\xb8\x39\x05\x83\x2e\x16\xd0\x1b\x50\xb9\x3d\x37\xeb\x9b\xfe\x20\x17\x2a\x31\x63\x0d\x25\xf3\x21\x7d\x87\xd9\x34\x65\xfd\x8a\xc5\x54\xcb\xbb\x39\xd9\x82\xea\xd7\x21\x93\x91\x23\x4c\x88\x9f\x0b\x92\xa2\xe0\x41\x3d\x86\x6c\xac\x08\x7d\x62\x8c\xe3\x1c\x61\xc6\x32\x3e\xcb\x8e\x68\x95\x55\xaf\x10\xde\x2b\x65\x6e\x6a\xea\x2c\xde\x93\x2e\x24\x1f\x6d\x1f\x8a\x9e\x33\x16\xcf\x13\xf1\x35\xac\xef\x83\xa0\xc0\xcf\x22\xf9\x5c\xa8\x18\xe6\x1f\x92\x76\x87\x74\xc6\x30\xe0\x92\x5b\xe9\x9d\xbd\x32\xb4\x99\xc0\xfe\x7d\x84\xa4\x2e\x39\x32\x87\xf6\xf5\xce\x3d\x0b\x27\x1f\x17\x00\x45\xa6\xd4\x8e\xab\x31\x6f\xe1\x7b\x18\x58\xb1\xff\xee\xe9\x08\x88\xf3\xa3\x7a\x24\x80\xdf\xd0\x4a\x4a\x86\x29\xf8\x68\xb5\xc0\xa8\x0e\xe1\xf0\x37\x19\xf3\xa4\x7d\x40\x95\xbe\xf1\x0e\x02\x34\xfc\x30\x0e\x2a\xf4\x82\x28\x5d\x78\x93\x79\x68\x31\x9d\xa9\x4b\xeb\x6c\x40\xe0\x78\x57\x7c\x02\x4f\x3a\x5c\xda\x00\x84\xe2\xf8\x55\xa9\x39\x6a\xaa\x9e\xe9\xbf\xaf\x2c\xc7\x71\xfe\x68\xc4\x0b\x62\x9e\x8d\xcf\x11\x5e\xf0\x3e\x75\x7a\x2a\xc9\xee\xf0\x73\xf1\xbd\xf9\xc5\xa4\x41\x00\x31\x55\x8a\x6d\x38\x2b\x5f\x16\x02\x4b\x15\x1b\x1c\x01\xee\x78\x17\x41\x3a\x3c\x4d\xe9\xdd\x64\x78\x78\x5b\x81\x10\x1d\xf5\x52\x24\x30\x05\x87\x80\x20\x7e\x79\x0f\x61\x2d\x78\xe5\x70\x5c\xee\xd4\x6b\x0e\xc0\x75\xe7\xc1\xdc\x07\x3b\x17\xb2\xb4\x3d\x72\x53\x59\x27\xbf\xd2\x71\xe9\x2e\x3c\x93\x63\x8e\x40\xa9\x60\x1d\xc2\xc1\xab\x76\xd9\x1a\x41\x03\xdf\x65\x7d\x91\x1c\x82\x9e\xe8\xa5\xf7\x47\xf7\x64\x2f\x5a\x91\x5a\x5f\x40\xf6\x30\xb4\x30\x39\xc7\xd4\xbd\x2a\xd2\xb3\x21\x29\xd9\x4e\x5b\x2f\x03\xad\x4a\x3d\x45\x57\x7e\xb8\x1f\x36\x9c\x9e\x3e\x2a\x4f\x6a\x8e\x41\xac\xf8\x28\x3b\xe5\x84\x25\xea\x99\x3b\x8e\x98\xee\xa6\x33\x05\x56\x64\x86\x18\xda\xd9\x8f\xa2\x55\x62\x0d\x83\x6d\x3c\x7f\x29\xb9\x07\x89\x58\x49\x28\x61\x67\xc7\x18\x1e\x2c\xaf\x55\xc2\xc1\x84\xa9\xa9\x11\xf8\xe4\x1c\xb0\x42\xe2\xcd\x48\xb0\x54\x4e\xa7\x9f\xe2\xef\x38\x1e\xbc\x5b\x15\xe3\x9a\x9b\x5c\x6d\x99\x8f\xae\xaa\xa7\x77\x3c\xfe\xc0\x84\xc0\xbf\xae\xd1\xbc\xab\x96\x3a\x4e\xf3\xd9\x4d\xbb\x3d\xfe\x72\x4c\x04\x0c\xe4\xd1\xe2\xee\x7f\xc2\xda\x4b\x25\x12\x7c\xe3\xa5\xdf\x69\x3f\xcf\x5a\x6e\xd1"}, +{{0x43,0xbf,0xf3,0xcd,0xd5,0x30,0x7e,0xd7,0xd2,0x5c,0xf9,0x6f,0xdb,0xba,0x64,0xab,0x18,0x11,0xc8,0xbb,0x93,0x4e,0x21,0x87,0xea,0x7f,0xfc,0x01,0x8d,0x85,0xe0,0xf2,},{0x00,0xf1,0xb5,0xd3,0xca,0xc6,0xe5,0x6c,0xa5,0xf8,0x94,0xd4,0xcd,0xbf,0x9b,0xeb,0xd9,0x68,0xd2,0x4d,0x5e,0xff,0xa5,0x05,0x8b,0x0e,0x20,0xbb,0x08,0x98,0xf6,0xf1,},{0xa6,0xb5,0x6b,0x76,0x86,0xdf,0x1d,0xc5,0xf4,0xed,0x54,0x4a,0x4d,0x97,0xe6,0x70,0x36,0x19,0x5a,0x32,0xb2,0x2e,0xcd,0x5d,0x31,0xea,0x17,0x30,0xe6,0xed,0x8f,0x81,0x0d,0x25,0x8b,0x44,0xc0,0x8e,0xa4,0x5f,0x03,0x2b,0x93,0x74,0x41,0xb7,0x2c,0xd0,0xdc,0x37,0x55,0x6f,0xd7,0x87,0x4e,0x9f,0xe6,0x4f,0x15,0x76,0x5c,0x52,0x10,0x03,},"\x64\x6f\x8b\x34\x18\x2d\x5e\x60\x2b\x51\xca\x73\x29\x34\x7c\x0e\x19\x8c\xb7\x47\xe4\xda\x0a\x6b\x80\xf3\xf6\xf9\xf3\x36\xf6\x70\x8d\x85\xcb\x42\x9a\xb2\xd6\xbe\xd3\x5d\x50\x13\x12\x9c\xd1\x00\x14\x2c\xdd\xce\xe8\x63\x51\x79\x02\x1b\x3e\x24\x92\x2b\x81\xae\xf1\x3c\x13\x70\x28\x69\x39\xd6\x3d\x6b\x6a\x41\x95\xed\xa1\xd8\x12\xca\x51\x82\x04\x76\x8f\x87\x34\x8c\x68\x89\x55\x2c\x63\xd1\x37\x2c\xde\x6a\x5e\x9d\xaa\x7f\x84\x45\xec\x8d\x61\x30\xa3\xf5\xae\xf0\xed\xea\xce\x01\x0b\x6c\x7f\x0b\x9d\x24\x16\x2a\x8d\x04\x45\x4b\x81\xd4\x8e\xa9\x09\x7b\xd8\xdf\x09\x34\x59\x71\x9c\xcb\x54\xaa\x10\xf5\x1c\x24\x6a\xa9\x9c\x58\x0b\xea\xf9\xc9\xc5\xbc\x60\xfa\xf0\xae\x5c\xec\x7f\x51\x37\xf6\xc5\xc1\x44\xdf\x45\xd1\x2e\xe9\x95\xad\xcc\xf2\x5a\x9d\xb8\x1b\x85\x58\xbd\xfb\x65\x83\x01\x86\xe7\xb9\xd4\xee\xd9\xf6\xb4\xd7\x32\xb1\xb5\x82\x2d\x03\xeb\x01\x7c\x07\x24\xf4\x8f\x87\xba\xaa\xe1\x04\x5d\x6f\xdb\x12\x5c\x91\x34\x06\x4f\xaf\x18\xdb\xed\x58\xd8\xfb\xac\xea\xcd\x4f\x09\x7d\xf9\xb3\x42\xe5\xc4\xa5\xbc\x85\xb2\x95\x97\xd4\xb6\x40\xf1\x55\x1c\x5b\x62\x4a\xb2\x1b\x48\xe9\x4a\x90\x30\x04\x9b\xe1\xf0\x5a\xa8\x51\xd0\x82\x7e\xaf\x87\x00\xdf\xe1\x47\xfd\xcd\xee\xdb\xc9\x8c\x4f\x15\x77\x4f\x01\x20\xfb\x59\x70\xa2\xf8\xb2\x17\x94\x34\x0b\x62\x83\x79\xa8\x02\xb9\xf7\xc0\x68\xb0\xdf\x63\x19\x3e\x51\x0f\xc7\xb2\xaf\x97\xee\x38\xde\x47\x92\x97\x85\x53\x55\x28\xd3\x50\xd8\x86\x20\x61\x0c\xfd\xb5\x5d\x24\x9e\x38\xfb\x73\xc8\x28\x71\x13\x91\x9c\xe3\x32\x67\xd7\xdb\x92\x4e\x49\x19\xa4\x4e\x6e\x29\xa9\x0d\xbe\x3b\x7b\x0d\x39\x21\x16\x3f\xeb\x5a\xc1\x05\x62\x4e\xd8\x52\xbe\xce\x35\x38\xe9\x91\x93\x30\x0c\x89\x33\x45\x69\x93\x50\xa8\xf9\x9e\x8c\x6a\x41\x09\x5f\xc9\xfc\x08\xda\x07\xf7\x57\x11\xf7\xdf\x03\x44\x06\xde\x14\xed\xd8\xe2\x2a\x63\x3a\x86\xe4\xa5\xa5\xc9\x75\xac\x5d\x34\x89\x1c\xcc\xfc\x85\x43\x77\x1f\xfa\x08\x0e\x0b\x45\xd6\x5a\xb8\x30\xa3\x61\xac\x4c\x42\x62\x94\xd3\x68\x5e\xa8\xc2\x60\x39\xc7\x1c\x90\xfc\x3f\xb5\x12\xbe\x9f\xc9\x48\x07\xd7\x6d\xbd\xaf\x8f\xfa\xa4\xfb\xf9\x84\x9d\x68\xe8\xa5\x7d\x30\xc4\xa0\xb9\x73\x5c\x23\xf0\x8e\xf2\xe2\x84\x45\x84\x67\xe1\x5d\x66\x53\x62\xcb\x64\x6f\xde\x69\x37\xec\xba\x53\x09\x12\x64\x63\x83\x57\xa7\x22\x42\x5b\xc6\x2d\x1e\x30\xec\x5f\x0d\xd8\xfe\xa2\x6b\x2e\xa4\xa8\x49\x00\x35\xde\x43\xf2\x74\x84\x6f\xb0\xcf\x02\x09\xec\x74\x37\xf3\xc3\xd0\xa5\x60\x37\x3d\x03\x4e\x5f\xd7\x9e\x25\xb6\x42\x4d\x9b\x2c\x17\x61\x63\x2b\x35\xa1\x21\x32\x52\x18\x27\x34\x5c\x55\xe4\xe7\x14\x2d\xd6\xfe\x94\xd6\x20\xfe\x51\x5c\x15\x3e\x83\x95\xb5\xd1\x30\xc7\x44\x13\x9b\x6a\x92\xef\xd3\x7f\x22\xba\x13\xfe\x4c\x09\x53\x73\x55\x0e\x2e\x4f\xcb\xa0\x32\x5b\x3e\xa3\xb9\xfe\x25\xcc\x7d\xd9\x2c\xbf\x42\xe1\x5f\x45\x54\xb7\x7a\xc2\x7a\x4a\x34\x63\x82\xff\x61\x00\x45\x15\x08\xd6\x02\xcf\x64\x3f\x60\xb6\xca\x42\x86\x35\x6f\x21\xa3\x11\x0d\x4e\x2c\x8a\x89\x62\xa7\x80\xfc\xff\x43\x9b\x3a\xa8\x04\x99\xdf\x27\x0f\xc3\xe6\xca\xd8\x89\x33\x48\x87\x2f\x0f\x70\x2f\x93\x90\x00\x0c\x7f\x6e\x06\x27\xd2\xbb\xb7\xb7\xce\xf5\xc4\xda\x25\xda\xdf\xea\x80\x32\xe5\x02\x32\x97\xa7\x0a\x65\x8e\x9a\xe7\x3b\xdd\xc3\xb2\x27\xa1\xc1\x17\x41\x13\x3f\x01\x2f\x0f\x48\xfe\x26\x44\x6f\xa6\x7e\x64\x72\x0f\xc8\xdc\x97\xf3\x0d\x0d\xd0\x26\xf6\xdc\x21\x64\xea\xd8\x57\x82\x4a\x0a\x7a\xeb\x20\xf1\x15\xd5\x0d\x1b\x65\xdd\x5d\x82\xe0\x9a\xbe\x83\x4e\x8c\xa8\x89\x57\xe3\x99\x84\x82\x49\x55\xa1\xa1\x3e\x3b\x94\xa0\x01\x57\x18\x6d\xcd\xc2\x89\xe3\x4b\x67\x8c\x91\xcb\x2a\x1a"}, +{{0x06,0x3b,0x90,0x25,0xe3,0x21,0xe9,0x72,0xd6,0x53,0xa0,0x62,0xbe,0x34,0xf9,0x93,0x65,0xaf,0xfd,0xcc,0x98,0xec,0x9f,0xf4,0x3e,0xf4,0x22,0xbe,0x0f,0x80,0x44,0x60,},{0x10,0xd0,0x1a,0x63,0x01,0x2a,0xc0,0x99,0x56,0xba,0x9e,0xd6,0x1d,0xf3,0x5b,0xb7,0xaf,0xe3,0x65,0x8b,0xb3,0x00,0x48,0x52,0xe4,0x71,0x74,0xbd,0x07,0xdd,0x4d,0xe7,},{0x85,0xc8,0x1d,0x6b,0x0d,0x85,0x78,0xfa,0x58,0xe1,0x3a,0xb3,0x91,0x00,0x15,0x28,0xb4,0x6a,0x1d,0x63,0xa0,0x32,0x7c,0x7a,0x4a,0x04,0x08,0x7f,0xc6,0x68,0x75,0x8a,0xa6,0x5c,0x01,0xd5,0xa1,0x50,0xf9,0x35,0x67,0x4e,0xf3,0x07,0x50,0x7e,0x6f,0x4c,0x91,0xe1,0xfc,0x35,0x00,0xb2,0x6f,0x64,0x9b,0xee,0xa8,0x7d,0x27,0x56,0x37,0x04,},"\xa7\xee\xd2\x96\x52\x84\x4e\xe0\x04\x9b\xaf\xb2\xcf\x63\x40\x29\x71\x02\x0d\x7e\x65\xc1\x0b\x91\xac\x57\x26\xee\xa8\x6f\x40\xdb\xc5\x3c\x3f\x0a\xbe\xde\xba\xf6\xcc\x44\x9b\x4f\xea\x48\xc0\x15\xfe\x4d\x90\x7b\x3e\x55\x05\xcf\xf5\x0a\x12\x18\x19\xa2\xe4\xa8\xa2\x96\xd5\x75\x10\x15\xbb\xcd\x7e\xf6\xfb\x7c\x27\x27\xbb\x00\x0b\xe1\x34\x2a\x7d\x14\xbc\xa9\x79\x04\xed\xfe\x8b\x18\xdd\xb6\x39\x33\x41\x83\x27\xa5\xaf\x81\x7e\x95\xba\xd7\x4e\xb7\x90\x20\x36\x15\xd0\x82\xe7\x14\x93\xea\xd4\x7c\xcc\x09\x01\xa2\xca\x9f\x50\x13\x3c\x44\xef\x85\x08\xd5\x1f\xb7\x3c\x61\x6f\x01\x47\x53\x22\x45\x82\x2d\xd1\x02\xb3\x37\xa1\xb2\xaa\xe2\xef\xc7\x2d\xca\x7a\x94\x19\xd5\x98\xa6\x47\x52\x33\xdc\x1a\x4e\xe0\xec\x6d\x05\xda\x12\xa2\xb2\x87\xcb\x77\xff\xaf\xdd\xe2\xd0\xac\xc2\x81\x99\x93\x3e\x66\x21\xee\xc1\x6a\xb4\x24\x51\x70\xcf\x02\xda\x80\xd4\x92\x26\x31\xa2\x32\x72\x91\x51\x65\xad\x88\x72\x27\x50\x03\x5d\x2a\x09\x77\xbc\x79\x1d\x14\xfb\x3d\x8c\xb0\x2b\xc7\x7f\x7c\x71\xbe\x52\x42\x62\x9a\x4c\x9a\x58\x8d\xfd\xde\x95\x78\x49\x4d\x8b\xaa\x4e\x68\xf5\x19\x4b\x80\x02\xc8\xe3\x78\xa0\xe8\x33\xb7\xc1\xa9\x69\x81\xc4\xfb\x05\xe4\x57\xff\x48\x26\x0b\x72\x49\x3c\xbc\xb8\x2a\xe1\x16\x73\xd1\x4c\xee\x85\x28\x8f\x63\x70\xbd\x4b\xca\x92\x51\xa7\xe2\x14\xc3\xeb\x79\xe7\xbb\x6f\xce\xbb\x16\xc9\xe0\x56\xf2\x9b\x62\x72\x74\x3e\xfa\x6f\xe8\xbf\xd2\x55\x97\xce\x86\x89\x8a\xb3\x05\x9e\xb0\x23\x1c\x73\xb5\x30\x59\x03\xfd\x13\x19\xbd\xf4\x9e\x59\x9d\x8b\xbc\xd7\x4a\x8b\x97\x67\x30\x8b\x61\x56\x3c\xcb\xac\xd3\x8f\xc5\x0c\x83\xab\x44\xca\x75\x9d\xc9\xb6\x5b\x2a\x4b\x54\x7c\x50\x97\xf2\x20\xc1\xc8\x8b\x2b\x0a\x48\xf6\x5f\x91\xfe\x78\xb1\x50\x12\x78\xe1\xe3\x04\xde\x58\xb4\xc8\x2a\x5c\x39\x99\x81\x09\x8a\x17\x84\xeb\x90\x42\x50\x18\x59\xf2\xa9\x3f\x31\x7e\x41\x77\x2f\xd5\x2f\x97\x2e\x51\xb0\x7e\xd9\x4d\x31\x4e\x1d\x1a\xf4\xed\x82\x90\x9a\x0b\xef\x67\x1f\x54\xb5\x5d\xb7\xb7\x0d\xa1\xf7\x18\xc8\xe6\x48\xae\xdd\x6d\xa6\x4b\x05\x77\x05\x26\xf1\x2b\xc4\x3f\x68\xb9\x55\x48\xda\xc5\x08\x09\xa6\x87\xdb\x97\xd7\x3f\x06\xf4\x7e\xd0\x88\x31\xb6\x0a\x28\xe9\x82\x92\x06\x32\x05\x8f\x0e\x6c\x90\xc0\x18\x7f\xf4\x45\x64\xf8\x1e\xfd\x8f\xd9\x3e\x32\x7b\xc6\xd8\x0b\x49\x0e\x08\x8b\x9a\x10\x03\x6c\x80\xdc\xda\xd4\x9d\x2b\xe0\x74\xfb\xba\x31\xe0\x6f\x71\x80\xe5\xad\x1c\x88\x23\xd6\x09\x66\xa9\xce\x15\x50\x3c\xe6\x0d\xd4\x0e\x91\xee\xf2\x35\x9d\x83\xd7\x0d\x98\x40\x1d\xde\x7b\xe3\xc6\xb0\x7e\x57\xd4\xe4\x7d\x04\x21\x76\x33\xd8\xe2\x63\xca\x34\x8f\x81\xfb\xe9\xa4\xa6\x2f\x45\xd7\x7c\x84\x3b\x6b\x1a\xd2\x84\x66\xd9\xda\xfb\x1b\x91\x0b\x34\x8e\xd8\x7c\x68\x6c\xab\x29\x2d\x48\x0c\x19\x1d\x18\x7b\x40\x4a\x9b\x1d\x13\x2b\xa4\xe2\x93\xd3\xad\xa9\x91\x72\xac\xc1\x21\xfe\x66\xb8\x45\xb9\x8b\x16\x0c\x58\x23\xf6\x01\xc7\x75\x8f\xb2\x6c\xae\xe8\x57\x01\x59\x5b\x2d\x52\xca\xa2\xf5\x68\x8a\xa2\xbf\x2f\x6c\x4b\xb6\x37\xf8\xe0\x0f\x49\xab\x6c\x26\xbc\x6a\xd8\x9e\x13\x67\xfd\x28\xe4\x91\x7d\x25\x08\x93\xa7\xb3\x2d\x39\x66\x0b\xde\x8d\xb4\x9f\x08\x6f\xb7\x39\xe5\x60\x12\xc3\x6b\xea\x0b\x26\xcf\x6d\x93\x57\x94\x0b\x00\xd5\xa4\x52\x8f\x90\x59\xaa\xf0\x86\x69\xe5\xf4\x6c\x99\x5e\x60\xf8\x87\xb5\xc4\xab\x88\xac\x74\x42\xed\x01\xa1\x4c\x6a\x42\x00\x6b\xaf\x1f\x34\x3f\xef\xe3\xe4\xac\xa8\x43\xa3\x24\xe1\x76\xb2\xfe\x7e\xc7\x88\x3d\x1c\xbd\x06\x8b\xc2\xfc\x96\x2f\xfa\x60\x24\x4f\x65\x4c\x77\xac\x56\x50\x81\x7d\xc0\x84\x46\x55\x45\xa9\x23\x0a\x74\x82\x6b\x0c\x50\xeb\x85\x25\x2a\x88\x6f\xf2\xb1\xaf\xea\xf8"}, +{{0x88,0x3c,0xc1,0x38,0x17,0x57,0xb0,0xfe,0x04,0x55,0xb7,0x7b,0xc9,0xcd,0x0d,0xd4,0x64,0xd2,0xb4,0xbf,0x0c,0x7a,0x3c,0x0c,0x2d,0xc7,0x75,0xfb,0x78,0xaa,0x37,0x32,},{0x83,0xa8,0xb6,0x69,0xcc,0xd0,0x12,0x45,0xce,0x3b,0x81,0x8d,0xcb,0x1b,0x58,0x8f,0x86,0x53,0x58,0x50,0xe6,0xc7,0x10,0xc7,0x92,0x17,0xfe,0x43,0x98,0x24,0xf3,0xfa,},{0xc7,0xcf,0xd5,0xc9,0xfe,0x93,0x0d,0x15,0xa1,0x1e,0xbb,0x34,0xe3,0x43,0x1f,0x48,0x9d,0xa0,0x10,0xeb,0x19,0x3e,0xdb,0xfa,0x6f,0x23,0xd5,0xd1,0x4d,0xd8,0xfe,0xab,0xd7,0x88,0x0d,0x2d,0x5a,0x56,0x00,0xd3,0x85,0x46,0xce,0x3b,0xc6,0x4a,0x86,0x29,0x1a,0x1c,0xe3,0x1f,0x27,0x2f,0xf0,0x20,0xdf,0x8c,0xb6,0xa0,0xfd,0x4d,0x3a,0x0d,},"\xff\xec\x29\x3d\x12\xea\x63\x6c\xa4\xc4\xa0\xa5\xe2\xdb\x15\x34\x26\x39\xc4\x76\x67\x4d\x2e\xbd\xab\x4a\xef\xd4\x04\x6b\x5d\xdb\x56\xae\xb2\x10\xc1\x19\xaf\xdf\xb8\xa8\x91\x28\xa3\x4f\x6d\x77\xf2\x61\xed\xea\x07\x72\xa2\xf8\xdb\x14\x0a\x26\x40\xfd\x8e\xca\xdb\x0b\x47\x92\x16\x9b\x6b\x28\x10\xae\xe2\xc5\xcd\x83\x52\x88\xbf\xf4\x93\xbc\xeb\xee\xea\x28\xa7\xa2\x48\xc3\x61\x16\x54\x0f\xa7\x17\x36\xd6\x6b\x0a\x47\x5b\x5f\xa9\x2c\x0d\x46\x00\x2f\xca\x7a\x1e\x69\xd1\xb5\x9e\x81\xa3\xa6\xd4\xf3\x39\x76\x9d\xae\xb2\x0b\x5f\x9d\x75\xc4\xc2\x8f\x69\x21\x32\xd2\x8d\x3c\x56\x4c\x09\xfe\x3d\xcc\xa0\x35\x9c\x3c\x63\xec\x37\x7a\x33\xf9\xee\x87\x4d\x8a\x78\x9d\x77\xc9\x6a\xc0\x5f\xdf\x3a\xb3\x8b\x2c\x82\x74\xa9\x02\xef\x8b\xb7\xf4\x67\xfc\x7e\x07\x3c\x77\xb1\xdb\x5f\xc8\xef\x96\x6c\x12\x0c\x4d\xae\x3f\xb7\xf5\xb7\x4a\xbb\x99\x01\x66\xc8\x12\xa5\x25\xd1\x23\xf7\x6e\xd5\x12\x12\x50\x80\xa1\x53\x4f\x3d\x8b\xdc\xcc\x54\x1f\xc9\x75\x90\x28\x75\x46\x09\x6f\xc8\x80\xbf\xcf\xdd\x00\xe6\x5c\x0e\xbf\x4a\x09\xfd\x64\x76\xce\x1b\x7c\x8f\xaa\xa5\xa1\xcc\x27\x86\x71\x9a\x30\xd8\x25\x58\x11\x18\x47\x52\xa8\x8b\x08\xac\x9f\x0f\xf1\xd6\x26\x2f\x25\x86\x94\x0a\xfe\x1f\xe4\x5e\x0b\x56\x34\x48\xa5\x5f\x30\x30\xe4\xc3\x9c\x1f\x3f\x86\xa7\x33\x67\x03\x80\xea\xb0\x88\xe3\x93\xde\x09\xd1\xf5\x08\xd2\xfb\xca\xfc\x64\x9a\xea\xe6\xb8\xc3\x0e\x32\x9e\xc3\xfd\x28\x29\xbe\x6d\xb0\xab\x8e\x63\x7e\xa1\x09\x5b\xdc\x3d\xf3\xac\xc2\x3d\x3c\xf7\x05\xa9\x54\x2c\x19\xe5\x90\x92\xec\x41\x3a\x4e\x2b\xd5\xde\xd2\x8c\xd3\x4d\xdb\x3d\x32\x94\x9a\xa4\x87\xf1\xc3\x37\xd6\x97\x9c\xf5\x12\x62\x2d\xbf\xb7\xda\x1c\xbb\x1c\x7e\x5a\xbe\xea\x70\x09\xe2\x94\x3f\xfb\xa2\x25\x2e\x1d\x86\xec\xa9\xd6\xd5\xc2\x46\xcd\x2e\x13\x4a\x3e\x5d\xad\x37\xef\xef\x71\xce\x39\x7a\xda\xfb\xd9\xe7\x2b\x3f\x9a\x86\xff\x0f\x5d\x81\x2c\x46\x22\x5b\xeb\xd0\x70\x3b\xc5\xcc\xe9\xc6\x45\x82\x00\x8f\x7e\x55\x8c\x40\xa3\xb3\x52\x20\x96\xd1\xaa\x2b\x61\xbc\x90\xcd\x88\xc6\x28\x5d\x94\x20\x87\xd8\xa4\x66\x5a\x0e\x64\xd3\x57\x2f\x74\x68\x9b\x4f\x24\xef\x40\x0d\x74\x1b\x57\x14\x06\x13\x47\x14\x44\xde\xcc\x65\x4a\xf0\xff\xb2\xed\xfd\xf9\xfd\xd0\x75\x09\x81\x90\xb3\x4c\xde\x28\xdd\x16\x68\x72\xc6\x08\x65\x67\xa6\x87\x61\xce\xf2\x5d\xa4\x0b\xd4\xc3\xd3\x4f\xdd\xd7\x2e\xe5\x65\xb0\xb9\x37\x67\x8e\xe8\x43\x49\xd1\x16\x0f\x5f\x07\x05\xf8\x95\xd0\xf1\x41\xce\x8f\x51\xa1\xe4\xfd\x2d\xc4\x70\x4b\x52\x7a\x40\x25\xa9\x39\xcb\x2b\xb7\x88\x57\xeb\x18\xd7\x88\x72\xed\xc9\xee\x70\xe6\x0b\x2a\x42\x70\x0a\x19\x8f\x4f\xff\x6c\x31\x92\x51\x68\xbe\x07\x7d\xc2\x3c\x32\x2a\xbb\xca\x97\x36\x1f\xec\xaa\x3f\xcb\x19\x6e\x65\x6c\x12\x8f\x39\x82\xfe\x11\xe5\x51\xa4\xa0\x88\x5d\xa6\x0d\x39\x7d\x0e\x40\xd0\xd8\x97\x26\x2f\x1b\x4b\x67\x2f\x78\xa2\xd2\xad\xfc\xdd\x6e\x15\x25\xc2\x6e\x71\x95\xfb\x9a\xc6\x06\xbb\x1b\xa4\xa9\x89\x08\x03\xb4\xbd\x84\x34\x6a\xe8\xd8\xc7\x19\x6c\x90\xae\xcc\xb2\x96\xa4\xc3\xeb\x4e\xfa\xcb\xfc\xb6\x2e\x38\x3b\x8a\x49\x4a\xc7\x23\x56\x2d\x0d\x8c\x37\x91\x87\xa9\x2e\x3b\xda\x6b\x15\x69\x47\x6a\xed\x21\xae\xd7\xa0\x56\xb4\xa5\x82\x67\x44\x01\x7c\xc0\x06\x0b\x4d\x55\xfa\x87\x72\xb5\xb1\xc1\x5f\x57\x48\xad\x72\x98\x00\x5a\xec\xbc\xbd\x90\xa3\xe5\xc6\x15\x9a\x86\x74\xab\xbb\xa3\x79\x14\x41\x50\x02\xb5\xa6\xef\x5d\xf3\xc6\x49\x42\x6e\xa1\x27\x5a\x01\xd8\x0a\xdf\x49\x0a\xc5\x46\x06\x2d\x93\x99\x9a\x6d\xcc\xac\xb9\x6a\x09\x04\xad\x33\xd9\x05\x76\xdc\x6a\x21\xb6\x72\xe8\xff\xb0\x66\x13\xfb\x3f\x14\xe6\xcb\xdd\xe8\x8c\x24\x37\xc9"}, +{{0x5e,0x40,0xa7,0xaa,0xbb,0xb0,0x83,0x0a,0x9a,0xb0,0xfd,0x79,0x69,0x0e,0xe0,0x43,0x39,0x01,0xc6,0xcb,0x06,0x76,0xab,0xe4,0xbb,0xa0,0x6f,0x5b,0xbe,0x58,0xfa,0xc2,},{0x4d,0x4f,0x28,0xfe,0x09,0xc4,0xaa,0xbf,0xca,0x01,0xef,0x6e,0xe7,0xfd,0x63,0x72,0xfb,0x62,0xdb,0x61,0xaa,0xee,0x82,0x7c,0x43,0xfd,0x1a,0x6d,0x1c,0x25,0x90,0x32,},{0x59,0x76,0x72,0xab,0x8d,0x3a,0x60,0xde,0x54,0x56,0xfc,0xc9,0xc3,0x82,0x53,0xf5,0xf3,0x7b,0x80,0xe7,0x4a,0x00,0x7c,0x9f,0x6d,0xb9,0x09,0xd2,0x7d,0x0e,0xad,0x16,0x27,0x89,0x24,0x49,0x94,0xf3,0x5b,0x80,0xd6,0x1b,0xe1,0x99,0xc4,0x17,0xc7,0xea,0x90,0x1b,0x98,0xcc,0x63,0xfe,0x3c,0x50,0xfc,0x3c,0x63,0x38,0x49,0x0f,0xa2,0x06,},"\xfd\x4e\xc8\xb3\x4f\xc6\xb7\x43\x81\x3f\x59\xe2\xfd\x1f\xef\xa8\x70\xf5\xa9\x70\xe2\xeb\x75\x16\xef\x7c\x30\x6f\x4b\x82\x3f\xfe\xe9\x2d\x60\x1f\x76\x5d\x79\xca\x14\x6a\xba\x8b\xc6\xe7\x98\x44\x55\x99\x35\xcd\xdc\x24\x26\x49\xc0\x59\xec\xf2\xdb\x84\xfd\xc2\x19\x36\x66\x88\xa8\x8f\xc2\x5b\x85\x1c\x36\x61\xe5\x19\x88\xc2\xbf\x73\xbb\x8e\x3d\xc1\x6d\x22\x41\x5a\xb1\xa7\xb3\x55\x79\xda\xac\x73\x25\xe3\x19\x15\x7d\x7d\xa5\xfe\xe8\x7c\x93\xa4\xdf\xcb\xaf\xc9\x2f\xba\x7e\x17\xcc\x68\xe3\x90\x37\x33\xc6\xc8\x01\x57\x2d\x90\x73\x20\xb2\xfe\xb5\x17\x10\xe8\x56\xa1\xf7\x6f\x85\xa7\xee\x1a\x11\xe6\x2d\x2e\x45\xa3\x52\x93\x8d\xd8\xcf\xc2\xbc\xcb\x90\x2d\xea\x44\x4f\xaa\xae\x6d\x84\xc5\xf3\x91\xe1\x0a\xef\x76\x92\x8a\x45\x15\x3d\xb6\xcd\x25\xa2\xbf\x35\x3d\x80\xd9\x7b\xf4\xb3\x80\x86\x05\xe8\x98\x00\xd2\x98\x40\xea\x60\x97\x8d\x9e\xc9\xb2\xc3\x02\x74\x98\x88\xf9\xde\xbc\x84\xdd\x1e\x2a\x79\xaa\x0b\x6b\xa0\x2a\x03\x91\x93\x08\x1b\xdb\xff\x05\x99\xa1\x4d\x91\x8c\x0c\x8d\xea\xc4\xf6\x0b\x6e\x99\x47\x4a\xb5\x30\x11\x74\x10\x34\xfe\x2a\x20\xcf\xf4\xe0\xf0\x23\x42\x4c\x8e\x57\x97\x76\x8a\xd5\x3d\xf6\xd0\x1a\x24\x01\x1f\xa9\x0f\x0b\xb1\xd5\x06\x9c\xdb\x36\xb4\x50\xf4\x33\x11\x0c\x2c\x56\xf3\x4a\x1d\xe4\x26\x09\x14\xcd\x46\x96\xb1\x4a\x09\xc0\x26\x8b\x2a\xe2\xe9\x8e\x6b\x4e\x99\x2b\x91\x25\xf8\x78\xf1\xac\x09\x82\x31\x70\x62\x83\x88\xf0\xf6\xe2\x56\x25\x9c\xa7\x86\xbb\xe1\x44\x88\x4c\xb2\x98\xcc\x04\x3d\x02\xf5\xc3\xdc\x68\x4f\x78\x7f\xaf\x16\xc1\x0f\xdd\x84\x37\xa8\xc3\x09\x74\x63\xbd\xb9\x9b\x78\x03\x0f\x94\x74\xfc\x5c\x99\x51\xdc\x75\x26\x49\x05\x86\xfe\x1c\x2d\xb0\x54\x11\x34\x14\x60\x23\x9d\x5e\x8b\xc5\x30\x65\x90\x2b\x95\xfb\xa2\x82\xc2\x76\x65\xe8\x69\xa1\x9d\xae\x84\x60\x6d\x17\x26\x67\x51\x55\xd3\x80\x39\xb9\xe5\x5d\xb4\xd5\xce\xec\x95\xcd\x6d\x87\xf8\x5e\x99\xdd\xe5\x4a\x04\x76\x1e\x6e\xad\xa6\x61\x9d\xa8\x95\xb6\x54\xfe\x38\x45\xe8\xa6\x0f\x3a\x3b\x32\x48\x3d\x6d\x27\x97\x8a\xf5\x45\x02\xb2\x20\xe4\x78\xdb\x78\xcf\xf7\x7a\x9c\x97\xfb\x79\xfb\x5a\xcf\x56\x28\x9f\x38\x1a\xcb\x10\xde\x64\xc3\xf2\x38\x42\xb1\x2b\xf5\xf1\xb2\x83\xbd\x25\xd4\x8d\x09\x12\x8f\xb5\x5d\xda\xe2\x55\xbe\xb7\xc6\x6a\x74\xcf\x6f\x06\x95\xa4\xf8\x28\xcb\x29\xe4\xaf\xdb\xb3\xb4\x2a\x23\x5d\x4f\xdb\x66\xb9\x63\xac\x8f\x68\xe8\x2b\x00\xa1\xc4\x50\x08\x63\x29\x62\x47\x17\x8c\xfd\xef\x80\x3b\xb7\xb1\x14\xf0\xc0\x32\x76\xf6\x71\x66\x9a\x08\x7d\x92\x28\xa3\x7a\xe7\xb9\x9b\x06\x15\x49\xc1\xcf\x8e\xc1\x72\x46\xea\x1e\xe0\x3d\xbc\x88\xbf\x42\x64\x16\xd5\x86\x57\x2f\xf1\x0a\x31\x45\x60\x6f\x27\x84\xe4\x35\x7b\xe4\xed\xee\xc6\xc3\xa7\xbf\x11\xbb\x5b\x0e\x90\xcf\x50\xed\xaf\x89\x1e\x51\xd2\x63\x57\xbf\xc8\x53\xce\x23\xb2\x99\x15\x5c\x82\xc1\x03\x1d\xfa\x64\x07\x4d\x72\xa0\x9d\x29\x72\x0e\xad\x6e\xbb\xbf\x75\xd5\x73\x8e\x32\xcd\xa6\xb6\x46\x6a\x8d\xef\x6b\x50\xa1\xed\x9b\x86\x5a\x9a\x88\xa0\x80\x18\xac\xb5\x01\xa4\xde\x9d\xb5\x4d\x05\x22\xce\x9c\xec\x7a\x06\xbd\x9a\x5f\x86\xb0\xb4\x6c\x07\xbf\x3e\x7f\x5a\x42\x6f\xf6\xb4\xbb\xe1\xe0\x03\x13\xa5\xac\x27\x19\xa9\x59\xed\x44\xee\x0a\x44\xbd\x97\xda\x6d\xb2\xcb\x97\x1b\xd6\x83\x34\x90\x89\x49\xed\x85\x0f\xbf\x73\xd0\xe0\x20\x49\xda\x18\x1c\xce\x9c\x2d\x9c\xa1\xb6\x24\xc8\xd8\x7c\xf9\x04\xeb\x82\x1d\xc7\x95\x92\x95\xda\x57\x77\x92\x06\x60\xb4\x3c\xcc\x25\xcd\x38\x9f\x15\x7f\x67\xfa\x03\x90\xfe\xac\x97\xa7\x52\xc1\xac\x20\x4c\x21\xdf\x56\xbb\x0f\x4f\xc0\x16\x41\xb4\x80\xaf\x2b\x89\xb5\xd1\x6d\x4a\x0b\xcb\x0a\x50\xb8\x2b\x0e\x04\x84"}, +{{0x3a,0x34,0x13,0x6a,0x97,0x34,0x80,0xd9,0x70,0x06,0xdc,0x27,0x93,0x58,0xe6,0x60,0x62,0x93,0xd8,0xcb,0xc1,0xa4,0x4e,0xe5,0x52,0x33,0xaf,0x2b,0x52,0x64,0xb9,0x0c,},{0xe5,0xef,0xfd,0x92,0x1b,0xe8,0xee,0xc5,0x30,0x75,0x2f,0xcc,0xc5,0x76,0xef,0x0d,0x9b,0xcd,0xe4,0xb3,0x2c,0xc6,0x49,0xd3,0xf7,0x95,0x47,0x17,0x56,0x28,0x60,0xcc,},{0x42,0x5f,0x27,0x22,0x12,0x83,0x57,0x55,0xad,0xcc,0x05,0x22,0xc6,0xf6,0xe0,0x5f,0x68,0x00,0x8a,0x3b,0xe9,0xba,0x59,0x74,0xe4,0x20,0xc4,0xc5,0xcb,0x56,0xe6,0xc5,0x5d,0xec,0x0d,0xe3,0x47,0xb1,0x6c,0xae,0xf8,0xbd,0x33,0xb7,0x1b,0x44,0xc8,0x35,0x7d,0x05,0xb6,0x32,0x1d,0x7b,0xf4,0x93,0xd2,0x58,0x61,0xdb,0x48,0x7b,0xd6,0x03,},"\x98\x1c\x8e\x10\x90\xe3\x96\x95\x1b\x07\x2e\xf8\x49\x70\x62\x02\x08\x97\xbf\x7d\xd7\xad\x50\x5b\x4d\x6d\xc1\x1b\x3e\x1d\xbc\xb0\xda\x24\x99\x84\xa1\x40\xe1\x64\xfc\x2e\x02\xb3\x1d\xa3\x98\x46\x55\x4a\xa8\x90\x5b\xc8\xb3\xdf\x8a\x76\xbf\x60\xeb\x5f\xfc\xf2\x2c\x97\xb6\x71\x22\x7d\x24\x90\x71\xda\x8f\xf6\xbb\xa7\x5b\x2f\x76\x68\xce\xc1\x9a\x89\xe6\x47\x5a\x12\x46\x3d\xab\xf3\x68\xb3\xca\x24\x45\xbb\x30\x35\xcc\x00\xfa\xe8\x5b\x70\x72\xfb\xcf\x59\x54\x01\x75\x5b\x80\x51\xe6\x09\x70\x65\xae\x42\x9f\x18\xee\xb1\x3f\xfa\x6d\xde\x59\xdf\x6f\x3c\x20\x6b\xfd\x9c\xe1\xf8\xa8\x00\xc8\x59\x0a\x40\x21\xd1\x60\xf6\x6d\x67\x40\xa3\x69\xae\x83\x56\x17\x53\x8b\x58\x90\x23\x1f\x13\xc5\x66\x7b\xaf\x51\x0a\x60\x6b\xda\xa8\x4b\x8d\x10\xee\x60\x15\xe1\x2a\x4c\x1e\xc0\xbd\x04\x21\xa2\x94\xc5\x1c\xf6\x3b\x5d\x1f\x05\x8e\x11\x53\xdc\x42\x5d\x10\xce\xe8\xb1\xb0\x84\xd6\xc2\x93\x47\xe9\x6f\x0f\x31\xb8\x39\x60\x7d\x07\x8b\x79\xa9\x0c\xa3\xd1\xf0\x63\x80\x7a\x46\x3b\x7c\x32\xf4\x5a\x53\x44\x98\xd7\x1d\x47\xed\xc3\xb1\x7a\x4d\xff\x27\xfe\xdc\xff\xab\x30\x1f\x34\xf1\xa6\x4c\x02\x78\xa5\x35\x89\x34\x9a\x23\x3a\xf3\x0b\x1e\xc1\xae\x41\x0f\x7b\x16\x30\xc7\x14\x5c\xa4\x2c\x96\x63\xf5\x12\xe8\xa5\x78\x26\x7d\xc9\x5e\x83\x28\x9c\x17\x03\x2e\x09\x78\x2e\x2f\xe8\xe1\x6e\xfb\x87\xf0\x3c\xa0\x3b\x11\x95\x61\x4f\x89\x96\x1c\xa3\x93\x9d\x3b\xdf\x73\x72\x21\xa2\x2d\x7a\x18\xec\x30\xfc\x12\x6d\x0c\xa6\x63\xe8\x8d\x60\x60\xd0\x4c\x6a\x44\xe5\x61\x6e\x55\x6e\x07\xd6\xd4\xa8\x47\xf1\x71\x1c\xf4\x37\x17\x81\x0c\x70\xaa\x4b\xe7\x30\x27\x8b\x3b\xd6\x55\x5c\x95\x4d\xc6\xed\xb0\x9d\xb0\x8f\x0e\x21\x18\x03\x59\x62\x80\xf3\xc7\x86\x8d\x23\x42\xcc\x23\x08\xea\xae\x4d\xa1\x91\x35\x14\x66\x4b\x1d\xb9\x62\xe9\x9c\x8a\x8c\xff\xe5\x79\x31\xf5\xdf\xcd\xdb\xc1\xcb\xb3\x6c\xe1\xc8\x42\xe2\xdd\xde\xad\xfd\x7e\x7d\x0a\x50\x48\xcd\xcb\x96\x1b\x14\xf3\x5f\x43\x5e\x73\xa6\x83\xc8\xce\x25\xc8\x16\x81\x25\x66\xfd\xf8\x17\xe0\xd3\x36\xae\x0b\xd2\x47\x32\x85\x12\xb2\xa8\x56\x76\x32\xbf\x20\x55\x3d\x9b\xd6\xfe\x15\x7f\x22\x0f\xfb\x0b\x46\xeb\xae\x89\xa7\x04\x59\x72\x8a\x57\xee\xd1\x79\x62\x56\xf1\xbd\x50\xb6\xd5\x47\xea\x3e\x25\xfa\x59\x13\xd3\x89\xa2\x25\x83\xe9\x15\xeb\x49\xde\x35\xa9\x7b\x5a\xcc\x52\x1d\xb0\xd0\x05\xc2\x95\x75\xe1\x66\x11\xa7\x55\xf2\x1a\x3a\x5a\x82\xa2\x0a\xa9\x00\xa7\x07\xce\x36\x82\x54\x92\xc3\xca\x15\x39\x5f\x17\x00\xb4\xaf\xab\x94\xda\xa7\xa0\x2f\x14\x53\xb1\xf9\xa6\xbd\x36\xef\xb2\x04\xd9\x28\xee\x1f\x4d\xcc\x86\x0f\x3a\x85\x9b\xad\xc0\x06\xfb\x30\x5f\xa1\x23\xd4\xc7\x9b\x23\xa2\x0e\x32\x29\x5d\x04\x0a\x7f\x8f\x6c\xac\xa2\x5d\x83\xf7\x1c\x62\xe3\xaf\x78\x36\xef\x76\xb9\x3a\x83\xd3\xc3\xb4\x93\xaf\x14\x17\x53\xda\x19\xe4\xcd\xcb\xa5\x66\x17\x27\x10\x34\xb4\xf4\xf3\x94\xc7\xc6\xb7\xd7\x96\x66\xf3\xaf\xb6\x92\x24\x4f\x06\x1c\x69\xa8\x88\x1d\x1b\x52\xb8\x84\x9f\xb5\x34\x99\x0a\xc2\x39\x19\x09\x47\x1e\xbb\xb7\x28\xe2\x9c\xd2\x0f\x42\x23\x54\xc4\x30\x97\x17\xeb\xff\x3e\xfd\x18\x33\x37\x08\x06\xd5\xbf\xb5\x3c\xa2\xda\x31\x6d\xac\xb5\x0a\xb7\xfb\x73\x96\x73\x23\x5a\x1d\xc5\x3a\xa8\x89\x30\x72\xd5\xb9\x1c\x9f\x6d\xb8\x3f\xc4\xea\x41\xd1\xee\xf4\x9a\xc2\x8a\xfc\x1c\xed\x8f\x36\x18\x90\xab\x9f\x77\x9d\x19\x30\x82\x83\x1c\xb8\xc4\x2f\xb2\x79\x2b\xee\x3b\x26\x29\x6b\x62\x95\xeb\x78\xa8\xd8\x53\x11\x76\x61\x62\x4e\x11\xf7\xf5\x7a\xfd\x60\x85\xa7\xb9\x12\x36\x79\xfd\xac\xa1\xcf\x2a\x78\xd3\x80\xbc\x4c\x36\x0a\xa7\xc3\xcb\xfd\xe0\xc0\x09\x1f\xe5\x3e\x22\x19\xc0\x70\xf2\xf0\x2f\x14\x83"}, +{{0xcf,0x33,0xe7,0x97,0x4d,0x8f,0x0b,0xf8,0x99,0xac,0x5b,0x83,0x4c,0x7c,0xf9,0x64,0x79,0xce,0x1c,0xfd,0x45,0x3a,0xf0,0x7f,0x97,0x05,0x27,0xf3,0x6a,0xa8,0x5c,0x1f,},{0x57,0x8f,0x60,0x33,0x8b,0x1f,0x04,0x1a,0x97,0xd3,0x19,0xfe,0xcf,0xa3,0x0c,0xfa,0xed,0x36,0x93,0x03,0xcc,0x00,0xb3,0xec,0x8c,0x5c,0x99,0x04,0x11,0x58,0xe2,0x0c,},{0x97,0xa5,0xb6,0xd2,0x68,0xa5,0xb4,0x17,0x5f,0xb0,0x6f,0x1f,0x37,0xd0,0xa6,0x33,0x51,0x92,0x96,0xed,0xc3,0x00,0x11,0xc9,0x54,0xd8,0xf0,0xb9,0xbb,0xe2,0x64,0x18,0x00,0x39,0x6c,0x4b,0x35,0xd4,0xb0,0xd7,0xd2,0xa1,0xd1,0x7c,0xbb,0xeb,0xdc,0x55,0xa8,0x09,0x46,0x2d,0x6c,0xc1,0x9a,0x6f,0xad,0xbe,0x1b,0xd1,0xba,0xe8,0x8a,0x01,},"\xe8\x13\x14\x4b\xd1\x16\xf6\xac\x36\x38\x92\x17\xb5\x17\x1a\x90\x2f\x06\xb7\xdd\x7b\x14\x4d\xf4\xf9\x09\x15\x53\xc7\xc7\x83\x57\x53\xa2\x96\xcb\xb0\xd7\xfa\xb9\x9c\xef\x77\xb6\x1f\x34\xa0\x4c\x8a\xf0\x4e\x7d\x5d\x1f\x96\x13\x02\xde\x89\xe2\x00\x5f\x29\x9f\x5a\x4a\xa1\x79\x24\x61\x7d\x00\x66\x93\x93\x77\x45\x53\x9c\x30\x48\xee\x36\xb8\xc2\x3a\xfe\xc0\xaf\x9f\xea\xa0\x06\x6c\x8a\xf8\xe0\xa7\xf0\x90\x93\x49\x82\x10\xf6\xd8\xdc\xc0\xaa\xad\xa5\x66\x87\x86\x91\x0f\xf7\xc5\xb3\x48\xd4\xcc\xd6\xee\xef\xfa\x3a\xcd\x18\x16\xd9\x01\x1a\x4c\x40\x25\xf6\xc2\xfd\x2c\x02\x0a\x10\x59\x36\x27\x52\x0d\x4d\xd9\x9e\x07\xc6\x2d\x2d\xbe\xbe\x84\x13\x9e\x1c\x7d\x86\x7c\x09\x35\x74\xfa\x60\x1e\x4e\xe3\x07\xac\x92\x6e\x5d\x36\xb6\x2d\x7e\xd8\x4a\x26\x15\x88\xb7\xe2\x88\x3c\x79\x26\x61\x2b\x4c\xc6\x7e\x2b\xb7\x25\x44\xa1\x0d\x6b\x49\x29\xc8\x8e\xf6\xc4\x7c\x26\x25\xd2\xf6\x81\x6b\xd7\x3c\x3b\xae\x89\xd2\xe0\xc8\x61\x71\xac\x4b\xd0\x80\xae\x55\x5d\x62\x74\x0d\x1d\x2a\x76\x1c\xed\x86\xdf\xc3\x28\xec\xc2\x7e\xe3\xdb\x6d\x40\x41\x08\xef\x4e\x0b\x64\x90\x62\x53\xb4\xc0\xa7\x71\xad\xef\xed\xc8\xa2\xc5\xb5\x3c\x42\x5a\x70\xcd\x6f\x63\x95\x6f\x7a\x0a\x61\x9f\xdf\xbf\xd0\x0a\xa0\x78\x41\x8e\xb4\x65\x2f\x8b\xc6\xf3\xc2\x53\xbe\xec\x98\x38\xb7\x7f\x9c\xbe\x2e\xf2\xb8\x05\x5c\x57\x73\x53\x9e\x35\x6b\xd8\x19\x26\x06\xec\x10\x1e\x3f\x60\x58\xb1\xdd\x08\xa6\x8f\xdb\xc5\x49\xdf\xe6\xb7\x72\x5d\xc2\x54\x9e\x8e\x3f\x90\xdc\x5b\xe3\xcc\xfb\x0a\x38\xba\xf9\x37\x7c\xb3\xf6\x50\x1d\x2e\x15\xcc\xb3\x55\x6a\x89\x5c\xcb\x23\xf0\xb6\xdf\x9f\xe5\x93\x11\xcf\xf5\x53\x74\xc3\xfb\x3a\x32\x98\x1c\xa2\x6a\xb4\x26\xf3\x66\x3d\x04\xe3\x16\x7e\x53\xa5\x37\xb7\x58\x9a\x9f\xb7\x36\x79\x09\x0a\x20\x55\x32\xc1\x32\x90\x66\x34\x33\x4a\x7e\x87\x49\x79\x3f\x8c\x59\x3f\x3f\xd6\x27\x8c\xe0\x05\x03\x83\x48\x7f\x3b\x24\x50\x67\xaf\x94\x88\x1a\xa1\xae\x96\x8d\x0c\xae\xba\x5f\xa5\xc7\xbe\x5f\x4e\x4b\x72\x57\x51\x86\x95\xd8\x9b\xcc\xde\xc5\x07\xb9\x67\xb4\xfd\x64\xb6\x89\x3b\x3e\xe7\x80\x3c\x1d\x36\xea\x8a\x02\xfc\x42\x6f\x9a\xfc\x8e\x9f\x24\x32\x15\x27\xec\x98\x44\xbc\x3c\x54\xa0\xf7\x66\x7e\x03\x43\x00\xbb\xb4\xfb\x02\x0f\x6d\x5b\xb9\x54\xe7\xb5\xa3\xa7\x06\xa4\x93\x9d\xb3\x3c\x15\x48\x92\x64\x34\x76\xa2\x91\xd4\x7d\xc1\xe6\xf7\x2c\xe9\x1d\x13\x6f\x11\xdb\x26\xb9\xc9\xba\x73\x6e\x40\xdf\x0a\x15\xc1\xa8\x91\x49\x99\x6b\x25\x1d\xd9\x88\xb3\x90\x04\xe6\xef\x41\xbd\xc0\x61\xdb\x58\x0b\x7b\x74\xde\x2a\x65\x18\x10\xbd\x89\x17\x53\xb9\x73\x86\xd7\xf8\xcb\xdb\xb6\xec\x38\x6f\xa2\xc3\x42\xf5\xef\x20\xe6\xe3\xa8\xbb\x4d\x51\x49\xa7\xd4\xde\x12\x24\xdf\xf1\xd1\x72\xc8\x75\x70\xf7\x76\xd5\xef\x45\x95\x9b\xe0\x93\x8a\xd7\x9f\x5d\x33\x95\xcb\x27\x21\x62\x71\x22\x88\x7b\xd7\xa8\x98\x3b\x64\x77\x97\xbd\x41\xd8\x82\x64\x1c\x81\x43\x1c\xe8\xd9\xb3\x06\x7a\xde\xc4\xcd\xe9\x26\xc5\x13\x13\xf0\xcf\x84\xc5\x29\x25\x62\xdd\x49\x08\x64\x2d\xd2\x45\x28\x84\x84\xc5\x56\x8a\x78\x7d\x0c\xed\x36\xa3\x52\xf0\x32\xda\x4f\x7e\x4d\xe0\x6b\x11\x47\x3f\x65\x0e\xec\x65\xdd\xa9\x96\x39\xaf\x2d\x42\xd8\x4e\xe2\x30\xf4\xf8\x36\x23\xd9\xc9\xaa\xa3\xb1\x6b\xda\x10\xdd\xaa\xd2\x5a\xf5\xc1\xc1\x0f\x81\xc8\xc5\x1c\x81\x1a\x3a\xa3\xe3\xdb\x58\xa7\x02\x5e\x43\x80\xe2\x85\xda\x47\x4a\x61\xba\x59\x17\x3f\xf0\x42\xa4\x6a\x79\xab\x18\x4b\x07\x01\x08\x41\x6f\x9d\x61\x58\xcf\x96\xd0\xe6\xdb\x44\x76\x14\xa0\xd9\x08\x9e\xbb\x6a\xee\x4e\xf1\x07\xbe\x45\x93\xd7\x1e\x79\xf6\x79\x86\x68\xa7\x40\xae\x4b\xac\x5a\xc7\x59\x4e\xcb\xd5\xdc\x82\xe7\xd0\xf9\xcb"}, +{{0x51,0xb1,0xad,0x0f,0xfc,0x21,0x49,0x7a,0x33,0xdb,0xdb,0x85,0xea,0x2b,0xc1,0xce,0x3d,0x0c,0x2d,0x95,0xd9,0x46,0x1a,0x39,0x09,0x73,0xfe,0xe3,0x77,0xfc,0x75,0xf4,},{0xba,0xd0,0x41,0x25,0x75,0xd3,0x80,0x13,0x01,0xed,0xee,0x6b,0xc0,0xf2,0x76,0xe7,0x87,0x35,0x7b,0x41,0x22,0xf5,0x2d,0xe9,0x81,0x88,0x58,0x51,0x88,0x42,0x49,0xcb,},{0xcf,0xb6,0x5b,0x6f,0xf0,0x37,0x7c,0xef,0x51,0x1f,0xd9,0x7b,0x90,0xc3,0xec,0xb8,0x08,0x33,0xf1,0x42,0xa7,0xcf,0x50,0x22,0xce,0xd3,0x0b,0x3f,0xb7,0x86,0x20,0x86,0xd0,0x13,0x39,0xb8,0x86,0x6a,0x23,0x8c,0xb0,0x70,0x27,0x6e,0x19,0x44,0xb5,0xfe,0x32,0xcc,0x40,0x99,0x47,0xcb,0x91,0xde,0xb1,0x43,0x2c,0x29,0x1b,0x60,0xfb,0x0d,},"\x78\x82\xe8\x6e\xf3\x40\x2f\x6d\xbc\x65\xcc\xe8\x31\x5b\x39\x76\x5f\xaa\x4b\x1f\xc8\x76\xfa\xd5\xf8\x22\x0c\xb2\x2a\x7d\xf2\xe3\x58\x0e\xab\x3a\x7e\x8f\xa7\xfb\xb6\xb5\x94\x82\xca\x0e\x36\x4a\x13\x13\x96\xdf\x79\x2a\x32\x41\xa0\x60\xe4\x41\x43\xb6\x76\x74\x93\xc6\xbf\x75\xf1\x87\xa9\x64\x3a\xa1\x1e\x11\xeb\xa7\xb0\xa8\x0f\x0a\x68\xb9\xf1\xb7\x9f\x75\xb6\x6c\xc5\x9d\x9d\xa7\x79\x55\xfd\x7e\x87\x99\xf9\x9d\x6e\xb0\x8f\x90\xd3\x18\xf4\xef\xcb\xfe\x71\x15\x9b\x10\xa8\x3a\xa5\xfd\x69\xbb\x75\x33\x6f\x5d\xf2\x96\xea\x06\x0a\x42\x6c\x95\x45\xdf\x94\x0b\xc1\x45\x4e\xfc\x1f\x9d\xc9\x65\xf1\xf2\x2d\x94\x73\x03\xfb\x8e\xc1\x24\x07\xff\xf6\xb1\xdb\xe4\x7e\x34\x21\xc3\x17\x64\xfd\x90\xc8\x3a\xc7\x11\xd1\x99\x26\xe2\x29\xa0\x64\xc6\x1f\xe3\x67\x6a\xf3\x00\xa1\x71\x6f\xab\xe4\xe3\x84\x22\x64\xad\xb3\x2e\x0d\x9c\x9f\x5d\x4a\x65\xd0\xd7\xb5\xc3\x77\x0d\x73\x7e\xe1\x3c\xbe\xd2\x1d\x7a\x1d\xa3\x6a\xaf\x7e\xc0\xf3\x6f\xcc\x47\x6f\x65\x96\x81\xe5\x16\x0a\x5a\x1f\x49\xe7\x59\xb9\xd0\xfc\xd4\xfd\xb8\x54\xec\xcd\x99\x17\x2a\x47\xd2\xc4\xef\xbe\x0b\x37\x57\x63\x1d\xf1\xba\xe1\x75\xf0\xfa\x74\xdd\x04\x8b\xb6\xa5\xfe\xd8\x43\x02\x84\x34\x9d\xa3\xd6\x7d\xf2\xa6\xf7\xe8\x26\x9b\xc7\x9f\xb2\xc5\xd5\xed\x60\x84\xe9\x07\x6f\x45\x5a\xb6\x38\x91\x90\x46\x36\x9a\x44\x6d\x57\xfc\xad\xa7\x01\x1c\xc7\x71\xbf\x6d\x87\x4a\x8e\x5d\x23\xc6\x87\x74\x7d\xe4\x1d\xd0\x4b\xff\xc7\x17\xd6\x12\x81\x83\x84\x6e\xb5\x94\xb3\xcb\x1c\x1a\x8a\xa0\x4f\x0d\x7e\xba\x53\xaf\x39\xcb\x1d\x4e\x6f\xec\xf3\x11\x3b\xd8\x42\x24\x16\xf4\xc4\x40\x37\xae\xee\x9e\x0f\xdc\x51\x7c\x48\x73\x1f\xd0\x4e\xe9\xc9\x9f\x5d\xbc\xa3\xd5\x74\x50\x9d\x7b\xaf\x32\x88\xf2\xc2\x30\xa0\x2d\x17\x03\xbd\xb1\x61\x1c\xde\x2a\x76\x6d\xac\x19\x3d\xe1\x67\x44\x3d\x20\x09\x0d\xc3\x4d\x29\x27\x7a\x86\xb1\xe9\x98\xb2\x45\x64\x51\x17\xe5\x11\x1f\x12\xf1\x46\x06\xc5\x54\x46\xdd\x91\x2d\x34\x75\xc1\x98\x76\xe1\x9a\xc5\x36\xd3\x17\x87\x6c\x4b\x0a\x2e\x0f\x98\x61\x61\x29\xa5\x68\x37\x32\xa4\x23\x17\xc5\xe8\x09\xdc\xa9\x56\xb2\xab\xb4\x84\xad\xa8\x10\xa1\x5c\x81\xcc\x85\x62\xb5\x55\xda\x94\x58\xf9\xb4\x43\x38\x49\x02\x30\xc7\x40\x4f\x3d\x48\x61\x1f\x84\x12\x7e\x73\xe2\x77\xd8\x8c\x62\x21\x2d\x2a\x3a\x35\x1f\xc6\x76\x65\xb1\x8d\x77\x21\x62\x30\x63\x2c\xbc\x78\x12\x88\xe1\x5c\xeb\xf3\xec\x33\xa7\x20\x5e\xb2\x2b\x9a\xbe\x4c\xdb\xc7\xdd\xba\xaa\x53\x64\x08\x75\xeb\x76\x3f\x52\x2c\x36\xcf\xff\x2e\xb2\x3e\xe5\x86\xd7\x75\x28\x62\x59\xfa\x94\xa4\x4f\xa7\xec\x01\x50\x96\xa2\xa4\x46\xb6\x73\x2b\x80\x02\x42\x67\xfe\x3d\x5d\x39\xd1\xc4\x85\x09\xb3\xec\xaa\x2e\x24\xe5\x4d\xe4\xd6\x1c\x09\x7b\x70\xf7\x53\xb5\xaf\x9a\x6d\xb6\xf9\x75\xd2\x5f\x4f\x83\xd0\x6f\x87\x9e\x17\xef\x7c\x50\x9a\x54\x14\x44\xba\x3e\xb6\x86\x78\x38\x09\x0e\x22\xda\xfd\xbb\x0e\xb3\xb0\x56\x5b\xe1\x57\x9c\xee\xcd\xed\x20\xf5\x44\x25\x6c\x7c\x4e\xde\x3b\x62\x84\x3c\x65\xb0\x46\x6b\xe6\xb7\xe2\x73\x05\xb9\x63\xca\x91\x4e\x3b\x7d\x21\x73\x61\x18\xed\xb3\xd6\x58\xd9\xd7\x6f\x50\x9d\xb3\xb9\xca\x2e\xae\x28\x96\x4a\x4b\x3b\x3c\x38\x4a\x81\xa4\x89\x0e\xe9\x6f\xbe\x93\x4a\x6f\x2a\xec\x8e\xeb\x6c\xfe\x59\xac\x9d\x3b\xbc\x16\x46\xba\x32\xa1\x14\x2f\xee\x59\xfe\xd6\xfb\x7b\xbc\x04\x98\xcc\x27\xde\xad\x41\x3b\x7b\x43\x51\xec\x20\x63\x43\xc0\xab\x89\xfc\xf8\x72\x43\xb1\xab\x45\x0e\x58\xff\x11\xa1\x14\x0a\x38\x3f\x19\x6a\xa3\x97\x6c\xe1\x7c\xf3\x45\x30\xf0\x49\xa1\xde\x90\xe3\x17\x53\xcd\x85\xe7\xf1\xfd\x5c\xf2\x04\x26\xc9\x37\x9f\xeb\x8c\x31\xb4\xbf\xec\x35\xea\x5a\x78\x95\x3d\x75\xc5\xcf"}, +{{0xfa,0x2f,0x46,0x1c,0xe8,0xc7,0x12,0x62,0x18,0xc4,0x7c,0x91,0x56,0x9e,0x87,0x99,0x79,0x7c,0x83,0x36,0x8f,0xc8,0x42,0xb6,0xe1,0xc2,0x2f,0xd5,0x2a,0xec,0x70,0xbf,},{0x6b,0x89,0xb2,0x3f,0x1e,0x11,0xa7,0x5a,0x53,0xf9,0x92,0xf6,0xca,0x57,0x75,0x00,0x8c,0x6e,0x9e,0x7e,0x49,0xc0,0xd8,0x51,0x0b,0x0e,0x83,0x69,0xb7,0xa2,0x0b,0xcc,},{0x84,0xf7,0x9d,0x9e,0x8f,0x30,0xe5,0xbb,0x63,0x62,0x23,0x97,0x14,0x55,0x6b,0x04,0x73,0x6f,0xa4,0x44,0x65,0xca,0xba,0xad,0x23,0xbe,0xaf,0x5a,0x99,0xfc,0x45,0x1a,0xd4,0xae,0x5a,0x18,0xc7,0xf6,0xf9,0x64,0xfa,0x41,0x03,0x92,0x16,0x01,0x8e,0xc5,0xa2,0xac,0xca,0xe1,0x07,0x5a,0x6b,0xb3,0xa6,0xec,0xbc,0x1f,0xca,0x02,0xb9,0x04,},"\x79\x9b\x39\x80\x2a\x18\x27\xe4\x5c\x41\x12\xfe\xe0\x26\x03\x4c\x0e\x59\x8a\xff\xce\x2c\x55\x0c\x19\x3f\xee\x73\xf1\xdf\x8c\x30\xc8\xd3\x87\x33\x40\x08\x8c\xe8\x59\xde\x34\x71\xe9\xd0\x57\x68\x6c\x82\x9b\x54\x08\x79\x5e\x08\xb3\xdc\x7a\xa3\xb6\x37\xc7\xde\x9d\x21\x72\xad\x03\x33\xc1\xbe\xa8\x61\xa6\x23\x2f\x47\xf0\x5a\x10\xbf\x5d\xf8\x08\x15\xa2\x71\x25\x6e\x37\xe8\x08\xa0\xe6\x2f\x1f\x07\xd9\xe1\x0e\xbb\x94\x7d\x3e\xfa\xbf\x8a\x28\xfa\x9d\xcc\xd9\xa1\xd5\x99\xf5\xfd\x61\x65\x50\x8e\xfd\x67\x9c\xf3\x56\x01\x50\x58\xbf\x4b\x34\x11\x8f\x83\xaa\x3e\x5b\xc2\xce\x19\xec\xa8\x4f\x71\x83\x98\xad\xbc\x0a\x52\x76\xcf\x9d\x8c\xaf\xfc\x27\xe3\xe6\xab\xbe\x34\x5b\x0e\x9e\xcf\x89\xc6\x77\x1b\x0e\x75\xd4\x08\xba\x2f\xbb\x90\xfc\xfd\x70\xc5\x3f\x2e\x4d\x52\xba\x54\xd9\x78\x4c\xf7\x1c\x34\x9e\xf6\xf1\x4a\xe4\x97\x0d\xef\x6e\xfb\x5f\x30\xe9\x84\xd6\x01\x6a\x19\x6d\xea\xec\x7e\x04\xb4\x76\x19\xc4\x8b\xf4\x9d\xc0\x2f\x7f\xef\x3e\x13\xb7\x56\x17\x4e\x90\xd0\x5f\xcb\xdd\x5e\x13\xf0\xe4\x34\xef\xd5\x42\x1b\x09\x1d\x51\x79\x00\xed\x0d\x57\x85\x96\x88\x62\xb4\xbf\xe5\x09\x3a\xb6\x72\x17\x18\x0d\x97\x55\x4c\xcd\x9c\xc3\x14\x29\x32\x6c\xab\x42\xf3\xf8\x39\x80\x60\xc1\x9d\xb4\x88\xb5\xd1\xc8\x0b\x29\x09\x0a\xfd\x1c\x6b\xac\x36\x42\x26\x48\x00\x21\x1b\xc2\x78\xfc\xb9\x9d\xae\x9d\xbf\x49\xda\xf1\xb2\x4a\xb5\x69\xdc\xbb\x87\xd4\xd3\x54\x73\x35\xe3\x5d\xb9\x84\x00\xcd\xfc\xe6\x79\x06\x82\xe9\x36\x00\x22\x0e\xc4\x99\x24\x5f\xa4\xee\x15\xd8\x43\x83\x1b\x56\xcc\x26\x41\x80\x25\xbf\x87\x00\x16\x05\xc6\x69\x1c\xa6\xbd\x40\xa4\xe2\x48\xc3\x09\x80\x1b\x76\xa7\x95\xed\xe8\xad\x53\x08\xbc\xb6\xd1\x75\x4a\xb3\x37\x1f\x00\x03\xbb\x8c\x4e\x4e\x47\x19\x54\xe2\x8b\x1e\x98\x66\x37\x9f\x82\xe1\xfb\xac\xb7\x9d\x50\xad\xdd\xad\x5b\x97\x78\xb5\x58\xcd\xdb\xb0\x03\x8a\x5f\xf3\xd5\xc9\x55\x7b\x96\x5d\xe3\xa7\x08\x2c\x45\xa8\xec\xf3\xe7\x72\x1e\xb6\x90\xb6\xc7\x1f\x3d\x89\x75\xd5\x30\x0f\x67\xc4\xdc\x4a\x73\x68\x46\xe4\xcc\xd2\x6f\x93\x46\x3d\x5b\xc6\xf4\x6e\xdc\x48\x86\x64\xbe\x96\x96\xbe\x12\xb0\x2d\xd1\x04\xd1\x0c\xc6\xb1\xd8\x2e\x81\x17\x81\x12\x14\xa6\x48\x7d\x17\x36\x7e\x39\x5a\xde\x2e\xf6\xb2\x6a\x17\x83\xa7\xe2\xf2\x45\x21\x3b\xc0\x3a\x75\x5d\xf3\xee\x8e\xf9\xf1\xef\xf9\x72\xc6\x91\x90\x65\xcb\x7b\x75\x66\x78\xd4\xdd\xfd\x19\x3e\xdd\xc0\xb4\x2e\x86\x89\x61\x36\x43\x14\x6d\x74\x28\xca\x37\xbf\x31\xbd\xf1\x4e\x31\x86\x78\x58\xf3\x9d\x23\x23\x70\x9e\xb3\xb7\xd7\xf4\xe3\x97\x02\x23\x78\x42\x4b\xde\xe9\xbc\xb7\x4e\x9d\x5d\xfd\x37\x1f\x47\x34\x99\x8f\xc1\x8d\xf4\xcd\xfb\x4b\x5c\x21\xc2\xe5\x0f\x8d\x6c\x15\xbc\x14\xbf\x4f\xda\x6c\xeb\x9d\x80\x82\xca\xe4\x32\xdf\xc9\x8b\xfb\x3e\xcd\x16\xb8\xd7\x4f\x83\x0b\x64\x2b\x04\x28\x75\xe9\x21\xb0\x54\xbd\x1a\xaa\x58\x1f\x60\xd7\x18\xdf\x66\x9f\x56\xdc\x2f\x10\xd4\x78\x99\x77\x22\x16\x2e\x83\x94\x0e\x61\xa1\xb6\xe4\x2d\xf2\xa4\xa3\xa7\xcb\xcd\xd6\x11\xce\x96\xcb\xcf\xb5\xa9\x5c\xc4\x73\x23\x1c\xa1\x3c\x06\x09\xd0\xce\x1a\xe5\xdd\xb5\x46\x6d\x6d\x65\xee\xfa\xd9\xda\xf2\xa3\x69\x01\xbc\xc9\x45\x84\x7d\xa1\xed\x6e\x2e\x24\x0e\x84\x8b\x23\x1b\x7d\x0e\x1a\xcd\x06\x54\x3e\xc9\x3e\x76\x8e\x59\x98\x5d\x7e\x96\xc8\xc3\x1f\xcd\x12\x10\xf0\x96\x42\x71\xe2\x18\x77\x52\x5c\xb1\x34\xbc\x35\x36\x25\x7d\xbb\x11\xd3\x0a\x3c\x4f\x94\x9f\xb8\x2a\xe0\xc3\x1c\xcd\xfe\x41\x94\x32\x51\xe5\x0a\xa4\x35\x53\x92\xac\x30\x9e\xf6\x0f\xc1\x74\x32\xa2\xbe\x4b\xdb\x2f\xcb\x28\x60\x7c\xc4\x5a\x52\xb6\x00\x16\xbb\x1d\x2e\x23\x97\x2f\xf2\xc2\xa2\x47\xd7\x25\x58\x5b\x1e\xf2\xb1\x5f"}, +{{0x1b,0xe2,0x94,0x9d,0x51,0xe7,0x20,0x81,0x75,0x82,0x62,0x13,0xee,0x6a,0xe3,0xc0,0x91,0x17,0x27,0x42,0xe8,0x8c,0xaa,0x02,0xed,0x0f,0x31,0x3e,0xcb,0xe5,0xd9,0x10,},{0xd7,0xbf,0x47,0x48,0xd6,0xdd,0xed,0x5b,0x57,0xa2,0xab,0xf7,0x97,0xfa,0xcc,0x56,0x0b,0x48,0x56,0x3d,0xfd,0x9d,0xcf,0xf4,0xbe,0x52,0x2c,0x71,0x7a,0x6c,0xfd,0xa9,},{0xf4,0x1f,0x2e,0xf6,0x59,0x5f,0x17,0x66,0x0b,0xb2,0xfe,0x93,0xe5,0x1f,0xc6,0xfa,0x9c,0x31,0xda,0xdc,0x9d,0xb9,0x0c,0x3f,0x46,0x60,0x7a,0x7f,0xb4,0x80,0x0b,0xb7,0x5a,0xd9,0x63,0x25,0xdc,0x7e,0xab,0x78,0x24,0x72,0xb0,0x4d,0xa6,0xd8,0xe6,0xfe,0x64,0x65,0x5d,0xea,0x55,0x1f,0xbd,0x50,0x49,0xe8,0x76,0xce,0x5a,0x40,0x5f,0x02,},"\x04\x5e\x2b\x0e\xc7\xbb\x20\x3a\x49\xbd\xcb\xa9\x41\xe2\xb7\x3c\x23\xc1\xfe\x59\xa1\x7d\x21\xa0\x12\x4e\xa2\x4b\x33\x7f\x92\xab\x9c\x92\x3a\x20\x57\x6b\x62\xd5\xd0\xf6\x24\xe7\x93\x2c\x11\x5b\x54\x74\xe0\xa4\x6a\x4d\xc9\xec\x51\xf6\xa0\xce\x8d\x54\x74\x4d\x1d\x52\x09\x33\x20\xe3\x9b\xe2\x03\xf7\x4a\x0f\x5d\xfa\xc5\x2c\xf0\xf9\x95\xc6\x6d\xf2\x91\x4b\x68\xad\x87\x1f\xbe\x81\x52\x5a\xd2\xd8\x8a\xc6\x99\x33\xa7\x5a\xea\x74\xac\xe4\xe3\x63\x43\xdd\xc0\x6d\x32\x08\xf1\x6d\x80\x5f\x5d\xd7\x86\xb4\xda\xaa\x16\x67\x48\xcf\xee\xc5\x71\x4c\x85\xc1\x04\x78\xb5\x97\xac\x7f\x6a\xe2\xc9\x88\x91\xe3\x8f\xd4\x14\xaa\x81\x1b\x76\x21\xd8\x05\xeb\x8f\xcc\x46\xcf\x4d\x56\x8a\x8a\x92\x58\x7c\xbb\xc1\xae\xcc\x12\xf1\x0d\x90\xac\x1e\x01\xae\x98\x6d\x14\xfe\x82\x95\x1c\x68\x2c\xea\xc8\xc9\x25\xfc\x66\x54\xd8\x38\xac\x93\x53\xae\x2f\x93\xf3\xc8\x8b\xf7\xb8\x2c\xbc\x43\xb1\xe4\x9e\x5c\xeb\xfb\x19\x49\xad\xe4\xb2\x2e\x4b\xcf\x1b\x40\x0c\x0a\x8f\xa8\xa6\xfe\x76\x70\xf6\x9f\xc3\xfa\xec\xd4\x80\x5b\x8c\x95\x4c\x01\xa5\x40\xd1\xa1\xe7\x88\x43\x6e\xae\x07\x3a\xe9\x56\xda\xe3\x17\x69\x05\xa8\xf0\xa3\xc6\x0f\xd9\x80\xda\xb4\x19\xd4\x1e\xc0\x6e\x52\x73\xfb\xb1\x3d\xb9\x38\x1f\x89\xb6\x63\xcc\xc4\xbd\x75\x3f\xd9\x0f\x14\xa7\x7b\x3d\x81\xc4\x5d\xd3\x56\x1c\xd1\xfa\x0e\x94\xd2\x34\xce\xf9\xd7\x85\x9a\x2e\xc9\x42\xbf\xc1\x88\x49\xd7\xf2\xad\xa3\xa5\xd6\x57\xbc\x19\x3d\x2e\x14\x91\x68\x2f\x16\x65\xa5\x34\xb1\xac\x20\x83\xb7\x38\xbe\x8f\x9e\x96\x3f\x59\x41\xed\x48\x3c\x6a\xcc\x82\xe9\x59\xb8\x1b\x8a\xf0\x2f\x47\x1c\x08\xf5\xf8\xb1\x2e\x10\xe0\x08\x19\x28\x98\xa4\x45\x02\x02\xaf\x73\x15\x92\xe7\x4e\xfe\x2a\x94\x8e\x51\xd0\x6e\x44\xde\x9b\x95\x6b\x7b\xc9\xa6\x9b\x6e\x74\x68\x7a\xb2\x06\xde\xc4\xd3\x5b\x31\x73\xfb\xc4\x38\x82\x9d\x50\x64\xbf\xbc\xf7\x43\xc1\xe2\xd4\x6f\x62\x8f\x2e\x51\xc6\x26\xd8\xe4\x16\xd7\xbe\x6e\x55\x5a\x24\x96\x91\xab\xb1\x67\xf1\xd9\x2f\x4f\xa3\x39\x2f\xde\x24\xe9\x93\xce\x7f\xf5\xc1\xb8\xe1\x57\x7a\x7c\x0e\x73\x02\x5c\xc6\xfc\xd7\x27\xa8\x2e\xf0\xc1\x29\xe9\x1e\x55\x33\xe0\x21\xa3\xcd\xbb\x99\xd5\x4b\xf7\xcd\xcd\x3f\xf1\x19\x15\x4f\x3f\xad\x92\x42\xb6\xed\x35\x0d\x10\x37\x2c\x97\x6f\xf3\xa4\x37\xd0\x97\x86\x7d\x9b\xfb\xa9\x1d\x84\xbd\xa5\x5a\x6b\xcd\x6e\x36\x41\xb2\x13\xa2\x18\xb3\x04\x15\x89\xc5\x5a\xfb\xb3\x44\xde\x6e\x97\xd8\xc3\x5b\x5c\x86\xcf\x3b\xe0\x63\xf9\x01\xff\xee\xa8\xcc\x91\x06\x99\x67\xd2\x34\x60\x35\xa9\x1e\xb5\x70\x6a\x3b\x53\xf6\xd1\xc3\x4d\x4d\x21\x16\x70\x6b\x65\xc2\x98\xec\x57\xde\x82\xab\xc4\x00\x3c\xe8\xcc\x5e\x0b\x88\xff\x71\x0d\xda\x1d\xce\xf6\xf1\x54\x27\x71\x06\xb8\x3e\xb4\x6c\x04\x5b\x08\x2d\x11\x3b\x36\x1d\x6a\x62\x58\x08\xc9\x13\x05\x84\xdf\xc9\x67\x07\xef\x89\x55\x90\x7b\xaa\x61\xcf\x88\xc6\x6b\x6d\x1f\x60\x58\x11\x19\xcb\x62\x17\xa8\x52\x15\x73\x36\x17\x8c\x68\x5e\x6e\xd4\x85\x26\xed\x5c\x4e\x3b\x79\x67\xd5\x1f\x99\xdf\x68\x76\xa1\xac\xfb\x84\x5c\x57\x1b\x89\x86\x56\xe5\xe3\xbc\x73\x98\x0b\x9b\xed\x11\x98\x86\x63\x59\xc9\xe9\xb1\xef\xa9\x15\xf8\x10\xd1\xef\x8a\xd6\xcb\x3f\xc2\x1f\xbf\xe6\x54\x30\x6d\xe6\xca\x13\xa3\xa6\xa4\x8e\x7a\x13\xed\x87\x46\xac\xbd\x07\xf4\x8e\xb0\x0c\x36\x37\x4b\x1e\xb4\xf3\xf0\x1c\x19\xe2\xe8\xd3\x7e\x9f\xc0\x64\xb3\x3c\x0d\x66\x9b\xba\x55\x4d\xdc\x68\x21\xa7\x7b\x40\x89\xca\xbd\xca\xfc\x97\xf6\x0e\x60\x50\xbc\xa4\x44\xae\x8c\xfc\x44\xd9\x3c\x40\xef\x53\x18\xbe\xe6\xf8\xcf\x0c\x06\x7b\x85\xcd\xdd\xc4\x59\x74\xa4\xea\xcf\xc3\xef\x51\x31\x5b\xa0\xf3\xf6\x29\x68\xc7\x00\x3a\x7f\xf4\x44\x61\x24\x00\xb1\x59"}, +{{0x3b,0x6b,0xa6,0xd5,0xcc,0x9c,0xd6,0x24,0x1d,0x8b,0x00,0x97,0xa3,0x72,0x2e,0x4d,0x06,0x6f,0xea,0x3d,0x56,0x0a,0xea,0xb4,0x67,0x3e,0x86,0xf1,0xf8,0xec,0x60,0x26,},{0x8c,0xa6,0x52,0x07,0x17,0xcf,0x36,0x3c,0x4c,0xef,0xfa,0x76,0x32,0x8a,0x0a,0x16,0x6f,0xf8,0x3e,0x45,0xca,0x7d,0x19,0x1c,0xc8,0xef,0x6c,0xa6,0xe5,0x24,0x33,0x67,},{0x78,0x8c,0x9f,0x45,0x54,0xdd,0xba,0x5c,0x7d,0x64,0xba,0x75,0x9e,0xc4,0x56,0x94,0xec,0x79,0xfb,0x85,0xe8,0x23,0x68,0xa0,0x74,0xbd,0xd8,0xdf,0x34,0x42,0x13,0xa5,0x6d,0xd0,0x9f,0x33,0x4c,0xd9,0xac,0xb9,0x41,0xbe,0x28,0x3d,0x98,0xc4,0xb1,0x5d,0xcf,0xec,0xd1,0x4e,0x93,0xf6,0xa2,0xe3,0xcb,0x0c,0x1a,0xa2,0xde,0xe7,0xd9,0x0b,},"\x36\xde\x93\x0c\xc8\xe1\x88\x60\x83\x6a\x0c\x82\x9d\x89\xe9\x63\xa5\x8b\xdd\x9c\x6b\x6e\xf5\xbc\x61\xf7\x59\x92\xd2\x07\x52\x42\xdc\xa2\x3e\x28\xde\x20\x5a\x33\xdf\xea\x86\x1f\xc4\x4a\x32\x62\x8e\x8e\x7c\xdd\x3e\xd7\xff\x49\xea\x6a\x70\x97\xe0\x09\x0c\xfd\x9f\xf5\xec\xab\x1d\xe8\x22\xfc\x0a\x4c\x37\x76\xdd\x56\xc1\x91\x92\x04\x51\x6a\x94\xce\xc5\x63\x8d\xa1\xd9\x9e\x52\xb8\x66\xf5\xec\x41\x62\xa9\x12\xed\xb4\x1c\x1e\x92\xed\xfc\x35\x3f\x67\x05\xe1\xc1\x2c\xd4\x1c\xb6\x2d\xed\x4a\xd8\x15\x79\x40\x05\x9b\xfc\xf5\x07\x19\xd3\xf2\xad\x00\x84\x85\x40\xce\x89\xf3\xf9\xaf\xa6\x10\xcc\xba\x5e\xcc\x37\xe3\xe2\xc1\x53\x4f\xcb\x38\xfc\xd3\x9a\x2d\x14\xd5\xb5\xda\x6f\xea\x24\xe0\x06\x65\x4e\x30\x90\x47\xa2\x9c\xad\x0a\xe4\xda\x8e\x70\x8f\x97\xa1\x8c\xad\x5f\xbd\xc9\xac\x84\x40\x0c\x53\x2c\xed\x54\x88\x86\x53\x9e\xdd\x6c\x54\x10\x74\x79\x0a\xe4\x50\x2f\xdf\xe9\xf3\x27\x3a\x87\x6a\x21\x86\x23\xa2\x57\x06\xa1\x52\x5e\x67\xe5\x7a\x16\xd2\x2c\x21\xb6\xa4\x5e\x23\x84\xe2\x87\xac\x44\x52\xae\xc4\xe0\x63\x05\x6b\x4c\x17\x8a\xb0\xe5\xb2\xa5\xba\xd3\xf4\x63\xc4\x72\xc4\xea\x1f\x9c\x1a\x66\xe5\x27\x04\x73\xa8\x35\x09\x4e\x8f\x0e\xef\x68\x0c\xd7\xb2\x0d\x0e\x70\xf4\xd6\xc9\x58\xfe\xe0\x8a\x93\x60\xaa\x60\x66\x88\x8f\x4d\xd7\xce\x5e\xc2\x22\x59\xfa\x0b\x53\xfe\x92\x71\xc0\x83\xc6\xfc\xdb\x72\x83\xb0\x90\x61\x08\x8c\x52\xf7\x1b\xfd\xd2\x77\x7c\xe0\x80\x1f\x41\xa6\xc4\xce\x90\xef\x13\x1d\xe1\xe1\x83\xcb\x89\x49\xce\x32\x3c\x9e\xb1\x3a\x4b\x0c\xac\xf9\x9d\xef\xdf\xdb\x68\xd5\xed\x1f\x68\x91\xb4\x8e\x21\x04\x76\x68\xd6\x9d\xe8\xa8\x0f\x8e\x56\x34\xde\xd0\x87\x36\xa4\xfb\x54\x10\xcd\xea\x9c\x72\x59\x6e\x36\xdf\x68\x41\xf2\xee\xa4\x68\x50\xc8\x74\x73\xc8\x95\x54\x02\x05\xb0\x92\x19\x60\xff\xa5\xd9\xd8\xff\xb8\xe2\x9c\xde\x96\xa3\xed\xe0\x15\xac\xbc\x26\x97\x40\x04\xd3\xe4\x38\xa8\x5b\x2e\x33\x85\xf6\x4d\x18\x14\x00\x39\x41\xff\xd3\x63\x99\x2d\x39\x40\xc6\xe6\xd8\x1f\xf8\xe4\x5f\xce\xd6\xd3\x6c\xe1\x98\xd8\xcc\xbe\xfe\xe4\x32\xa7\x7d\x8f\xca\xdd\x73\xfb\x79\x9f\x6b\xaf\xef\xb5\x1a\x2d\xa7\x98\x72\x1c\x3d\x46\x5b\x16\x3e\xf1\x3e\x6e\xcc\x65\xe6\x03\xb2\x89\x3e\xe4\xcc\x9e\x1c\x6d\x1d\xe7\xa6\x5c\xab\x5c\xbd\xf5\x36\x85\x5e\x28\x8c\x3c\xcd\xa8\xd2\xfa\x3c\xe1\x0c\xf4\x93\x58\xa2\xef\x4e\xf0\x76\xe5\xbf\xa9\x1b\xbc\xf3\xd9\x66\xdf\xa3\xdc\x6e\x71\x2f\x19\x56\xd4\xe5\x8a\xa3\x6e\x71\x2d\xd3\x34\x71\x69\xb1\x9c\x8d\x44\xbe\xc5\xbc\xb7\x30\x77\x8f\xcc\xcc\x58\x9e\xd5\xd3\x50\xd4\x4c\x17\xbd\xe2\xee\xbb\x6f\x5e\xc5\x9f\xb2\x40\xd6\x7d\x81\xae\xa9\x26\x7f\x34\xf1\x5e\xee\x2d\xe3\xf4\xfa\x67\x39\x14\x79\xbd\xbb\x43\x0f\x48\x43\x70\xfb\x0e\x08\x95\xb9\xae\x06\x5b\xbd\xd4\x3e\x23\x0c\x62\xac\x07\x18\x4e\x8b\x06\xb2\x4b\x8b\x97\xec\x02\xdc\x6f\x37\xef\x61\x64\x1e\xd5\x6e\x3f\x5e\xb8\xd2\x08\x0b\x51\x44\xef\x76\x0b\x51\x87\x52\xe1\x97\x54\x79\x2e\x19\x34\x3a\x38\x55\xe1\xe2\xf7\xa7\xdc\x62\x35\x17\xee\xd2\xf5\xd2\x65\x48\xa6\x8e\xb8\xff\xd7\xbf\x70\xf7\x8f\xd1\x86\xdb\x63\x49\x28\xbb\x98\x13\x8f\x2b\x8f\xe8\x44\x81\xcc\x53\xf5\xaa\x35\xe2\x66\x6c\x63\x25\xe1\xd2\xb8\xac\x5e\x2d\xf2\x93\x5b\x7f\x64\x13\x95\x2d\x10\xd6\x07\x6f\xfc\x75\xbb\x6a\xf6\x3b\x29\xb0\xb9\x66\x3b\xec\x37\x24\x7b\x66\xb5\x08\xdd\xe4\x1f\x2f\x11\xb8\x43\x33\x55\x9d\xfa\xc7\x3f\x76\x1b\xcd\xa8\x4a\x48\xd2\x66\x07\x3a\xef\x16\x38\x46\x08\x49\xe7\xa1\x72\x06\xa2\x5f\x68\x00\x77\x0b\x91\x4c\xc0\x26\xba\xf9\xe3\x25\x59\x14\xe1\x32\x58\x44\x1c\xef\x35\xad\x1d\x66\x83\x3e\x98\x7e\xbe\x44\x31\xe6\xa6\xbb\x22\x2c\xbb\x65\xaf"}, +{{0xdd,0x99,0x87,0xb1,0x8f,0x9a,0x92,0x2c,0x0f,0x6f,0xea,0x18,0xeb,0x00,0xb8,0x96,0xc7,0xa2,0xd3,0x09,0x3d,0xb3,0xea,0x31,0xd3,0x84,0x21,0xda,0x0d,0xe5,0x12,0x31,},{0x57,0x39,0x21,0xa9,0x55,0xfe,0xb6,0xdd,0xe4,0x1b,0x05,0x5c,0x8d,0xac,0xac,0xcd,0x1d,0xb7,0xfe,0x9e,0x36,0xb5,0x09,0xd3,0xc9,0xe3,0x6f,0x97,0x35,0x75,0x23,0x24,},{0x3e,0x9f,0x2b,0x00,0x7c,0x0e,0x29,0xec,0x87,0x59,0x95,0xa6,0x30,0x9b,0x97,0x3d,0xeb,0x8b,0xaf,0x11,0x3d,0xed,0x13,0xf1,0xe0,0x00,0x3e,0x9b,0x9b,0xf9,0x39,0x16,0xa4,0xdf,0xe4,0x79,0x37,0xda,0xdf,0xc7,0x8a,0xa6,0x63,0xc5,0x5f,0x67,0x4e,0xc3,0x5c,0x38,0x46,0x25,0x8f,0x18,0xe7,0xbb,0x93,0xfb,0xba,0x3e,0x82,0x6a,0x1f,0x0d,},"\x48\x16\x2f\xdc\x3a\xbf\x73\x19\xc6\xca\xab\x60\xcb\x8d\x05\x20\x87\x5c\xb4\xee\x8a\x07\x09\x27\x83\x16\x7d\x47\x33\xff\xe5\x20\x4e\x5f\xeb\xe7\xd2\x91\xe9\x53\x6b\xde\xa3\xdf\x06\x37\x15\x9a\x65\x3e\x09\xfd\x99\xaf\x66\x1d\x83\x00\xae\x74\x1a\x3e\x91\xa8\xbd\x85\xea\xd0\x5d\xc7\xd9\xe6\xf9\x29\x32\x33\x16\xed\xc4\xca\x62\x4e\xa7\x81\x8b\x25\xbd\xc0\x61\xf7\x14\x92\xfd\x22\xd4\x65\xab\x22\x6f\xd9\xa1\x0d\x8b\xab\xfc\x07\x4c\x68\x6c\x43\x6c\x24\xa3\xa5\x3f\x8f\xf3\x89\xce\x9c\xa1\xdb\xc8\x90\x74\x45\x88\x92\x41\xf8\xfd\xa3\xa7\xa3\xf5\x02\x4f\xa8\xcb\x0d\x04\x4b\xda\xf6\x71\x6d\x98\x3a\x6d\x83\x98\x14\xff\xe7\x0d\xdc\x55\xbb\xba\x11\xac\x97\x88\x7b\xdb\x4d\xad\xa9\x65\x65\xbb\x07\x5d\x5f\xc1\xd3\xc5\x24\x4b\x9f\xff\x77\xde\x58\x72\x9a\x05\x9a\x91\x1f\xb3\xe0\xeb\x16\x4f\xb8\x42\x9e\x26\x56\x85\xd1\x4a\x63\x23\x30\x46\xd2\x0e\xcf\x28\x9c\x55\x72\x31\x69\xa9\xd6\x3d\xda\x0d\x52\x55\x15\x3d\x9e\xf4\xa6\x1b\x92\x12\xf4\xb8\x20\x69\x7a\xe7\xc3\x08\xcf\xab\x40\x3b\x2c\x34\x31\x90\x62\x26\xe4\x5c\xe2\x19\x20\xdf\x52\x01\x60\x9d\xaf\x83\x0f\x28\xad\x79\x60\x05\xa9\xbd\x8e\xba\x62\x0c\xf8\x39\xc3\xba\x22\x7b\x96\x3c\x7b\xd0\x91\x48\x22\xdf\x2c\xa0\x3c\x22\x54\xd0\xcb\x8a\xca\xe0\xd5\x9e\x4c\x3e\x0e\xc2\x15\xc8\x36\x96\x9d\xcd\x1d\x49\xbf\xe1\x97\xe2\xf3\xee\xa3\xfa\x8a\x37\x3b\x55\x8d\x0f\xb9\x06\x3c\xf1\x56\x8e\x73\x9a\xad\x8f\x09\xfb\x43\x7c\xaf\xb5\xa2\x72\x37\x5f\x43\x60\x64\xee\xe1\x1b\xd9\x03\xd3\xaa\xea\xb4\xe3\xfd\xcd\x36\xbd\x20\x76\xee\xa1\x79\xa4\xf0\xd4\xfb\xc8\xdf\x42\xbf\x26\x60\xf0\x8d\xe7\xd5\xc6\x39\x7c\xae\x10\xb7\x27\x74\x58\xaa\x6c\xfa\x01\xe8\xa6\x73\x7e\xb1\x26\x22\x78\x56\x64\x66\x91\x68\x1c\x10\x6a\x15\x7a\x26\xae\xd2\x1b\x1a\xaf\x0e\xd2\x76\x64\x21\xcf\xc3\xd1\xc7\xdd\xfb\x72\xfc\xdf\x4b\x8b\x49\x0f\xc0\x9a\xce\x49\xae\xdd\x77\x12\xb2\x1a\xc5\x6f\x86\x01\xf6\x25\x56\x3c\x78\x43\x06\xf3\xb9\x17\x4a\xdd\xf7\x64\xe0\x51\xaa\xdf\xe1\x28\x31\xaf\x96\x69\xe6\x2c\xab\x12\x1c\x74\xdf\x34\x37\x24\x42\x9d\x6c\x26\x66\x02\x71\xc3\x2f\x40\xcf\x7c\x2d\x08\xbd\x0a\xfc\xc7\x28\xde\xf4\x13\x5d\x4e\xb5\x5b\x6a\x3e\x76\x29\xd8\x06\x86\x4a\x85\xb3\x6a\x32\xb9\xb2\x1a\xc0\xd3\x96\x80\xa2\xae\x4e\xc4\x18\x97\x09\x17\x8e\x34\x94\x97\xf3\x93\x99\xfb\xc7\x8b\x3c\x6c\xfa\xca\x6e\xde\xa7\xc3\x3d\xda\x3c\xc1\x1e\x43\x84\xf1\x58\x3d\x6c\xfc\x6b\x58\xf4\xea\xa2\xbc\x56\xab\xa4\x2f\x73\x8a\x42\x9b\x93\x58\x08\x50\xde\xe3\xfd\x25\x39\x94\xf8\xb0\xfa\x66\xee\x8e\x27\x3d\xec\xab\xd5\x32\x09\x5f\xb0\x4a\x4a\x3c\x34\x0a\xf0\xe5\x5b\x57\xef\xab\x43\x63\x0f\xc0\x2e\xf2\x0b\x42\x5c\xa2\x18\x7e\x3c\x6c\x5e\x10\xf1\x2d\x61\x8f\xd2\x43\xa2\x24\xf6\x50\x1e\xbe\xb9\xd3\x21\xc6\x38\x5b\x81\x27\xef\x9c\xdc\xd0\x97\xce\x7f\xa0\x21\xcf\x40\xd2\x1c\x39\x91\x23\x43\xf6\x7a\xcc\xe1\x82\x5e\x3a\x51\xb8\xa7\x18\xe8\xc3\x40\x62\x2f\xff\x65\xfe\x00\x53\xd2\x4a\xa3\x35\x1b\x6a\x24\x00\x18\x5d\x7a\xeb\x88\xe8\x7a\xc4\xa1\xd3\x94\x90\x9d\x49\x41\x4a\xef\xc2\x2b\xa0\x09\xaf\xf6\x96\x2c\x92\x17\xd7\x55\x69\x4e\x4d\x6a\xa8\xa5\xd6\xa8\x03\xce\xbb\x15\xde\x8f\x54\x16\x34\xb6\xfc\xeb\x0c\xac\x79\xdd\xa8\xa1\x8e\xef\xbb\x53\x7e\x70\xff\xe9\xaa\x5a\x6a\x6a\xaf\x92\x40\xfa\xc2\xea\xcb\xfb\xef\x01\xad\x6b\xdf\x50\x75\x87\x80\xf8\x6a\x4e\x48\x89\x85\x36\x2d\x58\x25\x01\x1f\x5e\x8b\x66\x42\x5a\x61\x6b\x7e\x10\x4e\xb2\x3f\xe8\xf1\x00\xcb\x02\x49\x82\x36\x62\xbd\xa3\xda\x47\xa4\xc3\xc1\xca\x2f\x91\x4b\x25\xb9\x73\x85\x34\x02\x60\x47\xdf\x6d\x7f\xf6\x31\xdf\x2c\x41\x31\xf6\x80\xe1\x37\x43\xc9\xcc\xf2"}, +{{0x38,0xd2,0xef,0x50,0x9f,0x93,0x05,0x1f,0x14,0x51,0x67,0x73,0x7c,0x22,0xe1,0xa5,0xbf,0xe8,0xf4,0xa9,0x1e,0xba,0x0b,0xb8,0x7c,0x39,0xce,0x04,0xa8,0x9b,0xae,0xc6,},{0x01,0x11,0x5f,0x6d,0x89,0xa5,0xda,0xab,0x54,0xf8,0x92,0xbb,0x4a,0x4b,0xda,0x1c,0xe5,0xd8,0xf6,0xc9,0xc8,0x8a,0x50,0xce,0xe8,0x3b,0xd9,0x87,0xa2,0xc0,0xdd,0xf7,},{0xde,0xc4,0x62,0x53,0x50,0x9b,0x11,0xe4,0xb5,0x2a,0x6a,0xe4,0xf3,0x66,0xb6,0x80,0xdf,0xfc,0x28,0x0d,0x0a,0x04,0x4f,0xc0,0xcb,0x79,0x0b,0x6e,0x75,0x13,0x81,0x46,0x1e,0x1e,0x60,0x2a,0x89,0xe3,0xb3,0xd3,0x06,0x4c,0x40,0x7f,0x60,0x2f,0x1c,0x22,0x40,0x4b,0x68,0x23,0xbd,0x24,0x67,0x54,0x93,0x14,0xa0,0x00,0x01,0x66,0x4a,0x08,},"\x42\x7b\x5a\x01\xe8\x59\x7f\x04\xfd\x42\x2f\x0a\x66\x2d\x0b\xe2\xdf\xa8\x53\xed\x5f\x9d\x3f\x60\xff\x90\xf2\xc5\xee\x08\xbb\x59\xfd\x03\xd4\x02\xb7\x54\xca\xf5\x4d\x00\x58\xf5\xa2\xcf\x87\xaf\x4f\xef\x21\x77\xd5\x9e\x18\x22\x62\x93\xfd\x2a\xf3\x76\xbc\x98\x7b\xf7\xb3\x20\xb9\xd1\xe2\x49\xab\x9e\xfb\x75\x07\x8e\x6d\x3d\xf2\x9e\x03\x50\x47\x76\x35\x43\x44\xaa\x69\xe7\x2e\x1e\xbc\x52\xa3\xc3\x8a\x4c\x2a\x16\x73\xb4\xe9\x74\xa2\xe4\xe1\x2a\x2e\x78\xea\x3e\x3f\xe5\x0c\x53\x63\x0d\x09\x6d\xa3\xe2\xfe\x82\x99\xf7\x1a\x1b\x44\x1b\x4c\xf0\xca\xeb\x93\x7a\xfa\x4a\x0e\x39\x15\xcc\xab\x39\x96\xc9\xf6\xa8\xf4\xfd\x37\x54\x3e\x8f\x75\x90\x0c\xfd\x47\x17\x53\x70\xef\xb8\x52\xa5\xf6\x9d\x67\x36\x83\xf9\x98\xfd\xcf\xf8\x5f\xf8\xf3\x2b\xaa\x80\x70\x66\x60\x44\x22\x02\x7d\x51\xa4\x35\xdd\xf9\x88\xed\x2f\xd8\xeb\x19\x1f\x10\xb4\x68\x07\x42\x00\x08\x75\x6e\xb4\xe3\x00\xc4\x09\x9c\x2d\x64\x50\xbc\xc6\xa4\xe7\xd0\x67\x31\x56\xb8\x37\xf0\x50\x63\x38\xf3\xd1\xb5\x73\x4b\x16\x6c\xa5\xcc\x2f\x24\xa4\xef\x02\x6c\xda\x2c\x4a\xe3\x10\x5b\x63\xca\x85\x70\xd1\x85\x46\xcf\xac\xb8\x60\x42\x96\x6a\x00\xef\x52\xc7\x29\x90\x19\xf6\x8a\x2d\xf0\x8c\x8b\x70\x4e\x85\xe7\x13\xc3\x48\xd7\xf1\x67\x76\x60\xe1\x8e\xba\xb5\x9b\xf4\xe1\x2e\x6f\xf2\xd7\x83\xd8\xd5\xd4\x2a\xab\x6e\xf0\x17\xb7\xa1\x96\x6a\xee\x8d\xc1\x4d\xda\xbe\xd4\x9b\x4b\x64\x3d\xf4\xe9\xb0\xb6\x03\x83\xc7\xd8\xb4\xb8\x8c\x65\xa8\x98\xc1\xc7\x7d\x43\xd6\xbd\x68\xb2\xa5\x74\x3f\x1f\xed\xd6\x54\xdc\x84\x49\x6d\xa0\x2c\xeb\x69\xb9\xb4\xd3\xa8\xe0\x0c\xcd\x72\xe7\xc7\x5f\xc5\x0a\x8d\xd0\x87\xe1\x83\xe6\xc1\xf5\x79\xba\xeb\xc5\xc6\x3f\x28\x07\x93\x67\x91\xb5\xfe\x48\x47\xcd\xcf\x15\x17\x74\x23\x52\x05\xcd\x2d\x7b\x8b\xf4\xae\x88\x19\x22\x5e\xa7\x08\xb7\xba\xac\x66\x99\x8f\x0c\xba\xb2\xc7\xdd\xf2\x51\xf3\xb1\xde\x10\x17\xd3\x97\x69\x22\x05\xee\xa6\x39\xf1\x2d\x77\xbe\xef\x6c\x13\xbb\x12\x10\x0f\xf8\x90\x64\x70\xbc\x7b\x21\x29\x80\x53\xbe\x1a\x61\xb7\xb3\xa4\x99\xed\xc3\x10\x99\x6c\x8b\xc0\x87\x19\x07\xca\x46\x8e\x89\xed\x31\x1a\xdc\xa2\xe2\xb8\x29\x30\x97\x5b\x3e\xfb\xbf\xc0\x3c\xdd\xf4\xd9\x48\xc4\x76\x5e\x8c\x10\x59\x08\x82\x16\x9a\xcd\xdb\x8f\x8c\x36\xd8\x4c\x2d\xac\x3b\x79\x8e\x7a\xbf\x84\x47\x12\xfa\x45\x8d\x27\x7c\x24\xe8\x14\x04\x7d\x74\x23\x19\xa8\x34\xdd\x9f\x92\x7a\x2b\x44\x85\xef\x13\x74\x5f\x7a\x60\xdd\x6b\xb3\x37\x93\x63\x04\xc9\x7d\x3f\x9f\x14\x4e\xb2\x9b\xb6\x95\xb8\xdc\x31\xb9\xd8\x49\x10\x61\x1d\x28\xd5\x81\xca\xa9\x36\x5d\x6d\xff\x52\xd4\x10\xa4\xad\x52\xbd\x12\x17\x29\xff\xf5\x28\x88\xf4\xda\xae\x17\x07\xf6\xf5\x6d\xac\x61\xff\xb9\x96\x1c\xda\x71\x76\xaf\x44\x60\xa6\xd5\x54\x2a\x20\x44\x6f\xb5\x14\x7f\xce\x72\x72\x04\xce\xc6\x89\x9b\x9a\x3d\x4f\xf6\x22\x6b\xb8\xa1\xc7\x8e\x36\xfc\xdd\x9e\x50\xc0\x40\xd7\x2d\x0f\x40\x07\xd3\xfa\x9a\xa7\x67\xe4\xab\xd0\xad\xd6\x2f\xdb\xcc\xde\xff\x67\x21\xeb\x25\x9e\x00\xa7\x21\x63\x20\x06\xbe\xde\x0d\x17\x3d\x38\x34\x4d\xea\x44\xf9\x6b\x67\xd9\xa2\xee\xa1\xd2\xaf\x5f\x74\x8e\x8e\xbd\xb4\x41\xbf\xb4\xe5\x8e\x2d\x42\xfe\xc7\x40\x56\x6a\xcf\x73\xa3\x03\x35\x8f\x7d\x89\xc8\x15\x8c\xf2\x1f\xe8\x5b\x0d\x4a\x41\x7e\xbd\xc8\x6d\x04\x69\xf6\xb9\x1c\x24\xad\x61\x0d\x48\x6d\xed\xc2\x18\xb2\xce\x7a\x8b\x96\x75\x47\x23\x15\x1f\x0d\x00\x76\xff\xf9\xf1\x9d\x11\x2d\x9c\x05\x92\xfb\x8d\x92\xc9\x9d\xcb\x8d\xdf\xaa\x46\xfb\xe0\xd9\x2d\xf4\x6b\x8c\x00\xca\x43\x45\xad\xb6\x9a\x5a\xca\x69\x4a\x86\xcf\x30\x64\x64\x51\xbb\x17\xba\x6e\x60\x7a\x91\x2b\xf1\x09\xd5\xfc\x2d\x3e\x27\xd0\x0d\x94\x56\x00\xa8\xa5\x7c"}, +{{0x43,0xbf,0xb3,0xdb,0xe4,0xd9,0xbd,0xaa,0x82,0xb3,0x54,0xdd,0x59,0x63,0x34,0xe6,0x60,0xd7,0x6f,0xc0,0xb2,0xeb,0x69,0x89,0x93,0xae,0xf3,0x76,0x7f,0x1c,0x7c,0x7f,},{0xd0,0x0a,0xec,0xef,0xf0,0xce,0xb8,0x32,0xc2,0x51,0xd1,0xfe,0x6b,0xcb,0xea,0xea,0xcb,0xb4,0x11,0x3f,0x52,0x81,0xba,0xba,0x4e,0x87,0x8f,0x7b,0x95,0xf9,0x3f,0x07,},{0xa9,0x99,0x55,0x23,0x02,0x0a,0x0d,0x22,0x2b,0xc4,0x8f,0x98,0xd0,0x55,0x04,0xe3,0x06,0x8f,0x30,0x4a,0x6d,0x19,0x70,0x06,0xcc,0x9c,0x03,0x5e,0xea,0xde,0x09,0x9e,0x7a,0xa9,0x7e,0x90,0x89,0x4e,0xad,0x17,0xe8,0xc3,0x0b,0x0a,0xa4,0xa9,0x80,0x88,0xf0,0x38,0xb9,0x22,0x44,0xc4,0xb2,0x0f,0xde,0x96,0x4f,0x85,0x34,0xe8,0xfb,0x03,},"\x3f\x3e\xed\xdc\xae\xf4\xe1\x66\x2a\xdb\x66\xbb\x1b\x20\x7d\x79\x3f\xcb\xef\x81\x50\x05\xe8\x26\x43\xed\x70\xc9\x85\x54\x03\xda\xc2\x8b\x52\x07\x27\xa9\x01\xa5\x32\xd2\x8b\x9b\xd1\x34\x8d\xb2\xf8\x96\x7b\xbb\x8c\x90\x98\xb0\x7f\x57\x0a\x2e\xae\x1e\xe4\x82\x64\x0c\x0b\x67\xa5\x2a\x38\x61\x21\x33\xa1\x5e\x25\x8e\xde\x38\xcd\xa8\x78\xff\x36\xed\x32\x1d\xff\x87\xcc\x6a\x01\x38\x3b\xa8\x40\x67\xd6\x0a\xf4\x17\x76\xac\xf8\x0a\x8a\x4e\xac\x77\xf7\xd8\x7c\x37\xa7\x04\xa3\xe2\xac\xa1\xe8\x81\x5e\x49\xfb\xca\xb7\x97\xc8\x56\x52\x95\x38\xbe\x07\xd5\x16\x96\x32\x1f\x69\xb0\x9b\x5d\xc5\xa1\x5e\x5f\x0e\x4c\x22\xd2\x28\x37\xf6\x2e\xe4\xc8\xbc\x7f\x25\xa9\x48\x7b\x96\x2c\xc2\x0f\x13\x3f\xcb\x87\x0e\xd1\x25\xcc\xa5\x85\xd1\x81\xbd\x39\xf9\xdf\xa6\x61\xf1\x9b\xe7\x6d\xa7\xf6\x5f\x22\xfb\xbc\x80\x75\x2a\xeb\x39\xe8\xd5\x9e\xd9\x6e\x14\xf5\x95\xd0\x49\x29\x40\x2b\x50\x29\xc6\x0c\xee\x37\xc0\x21\x7b\xc5\x31\xd8\x0d\xb3\x41\xda\xce\x3c\xce\x76\xe6\x43\xaa\xc5\x38\x87\x47\x3e\xdc\x6e\x19\xcb\x39\xfe\xcf\x6a\xf4\x24\xa2\x06\x63\x93\xd1\xc3\x3f\xc7\xb9\x36\x76\xd7\xe6\x10\x5b\x9b\xfc\x96\x7d\x1e\x29\xaf\xdc\x4c\xf1\x5b\xca\xfa\x09\xc2\x95\xa6\xf9\xde\xee\x33\x1a\xb3\xb0\xd4\x93\x12\x6e\x2b\x2f\xff\xb4\x2a\x6b\x68\xe7\x9e\x13\x8d\xb5\x50\x82\x72\x62\xe4\x87\xa8\x3f\x37\xf0\x1d\xd7\x92\x2b\xe7\x5e\x92\xfc\xf5\xd9\xd4\x80\x3b\x3a\xc2\xf3\x5d\xa2\x10\xfb\x38\xb2\x63\xb0\xff\xb6\xc2\x70\x8d\x4b\x55\xb7\x57\xaf\x52\x07\x7a\x7e\x31\x84\xd0\x1e\x82\xf6\x4d\x32\xcc\xe4\xfd\xee\x0f\x8d\x4e\x36\x4b\xcf\xb9\x58\xeb\xbf\xdb\xb6\x22\xb3\x8b\x51\xe9\x30\x27\x1c\x7b\x1b\x70\xaa\x9d\x4b\xb3\xaa\x4b\x99\x7c\x52\x14\x4d\x3a\xa6\x21\x62\x57\x3a\x3a\x1d\x9c\xe4\x6c\xdb\xee\xb8\x44\x9f\x12\x25\xc4\x49\x63\x1e\x88\x97\x52\x1c\xd0\xf6\x37\xb7\x21\xa1\x25\x2b\x8a\x10\xab\x0b\xe8\x70\xaf\xbc\xd8\x9d\x58\xb2\xeb\xb6\x32\x11\x95\x0c\xad\x7a\xb8\x2c\x81\x95\x02\x6b\x50\xea\x8b\x77\xb9\xe9\x0e\xd5\x59\xaf\x44\x84\x30\x88\x51\xa3\xa1\x56\x71\x68\x53\xa8\xac\x4e\xcb\x8c\x5c\xc7\xd9\x35\xb0\xf4\x66\x12\x41\x43\xb1\x17\x7f\x05\xd0\x8b\x97\xd1\xad\x54\x2e\xd2\xc2\x46\x5a\xf1\x85\xe7\xdb\x42\xb6\x9c\xb8\x02\xa7\x17\x94\xa3\x13\x98\x83\x02\x96\x70\xc9\x56\x74\x2a\xaa\xd7\x90\x7a\x71\xd9\x59\x85\xfc\x1d\x45\xb6\x59\x97\xb4\xec\x6c\xe8\x25\x5d\xe9\x59\x27\x0a\xfa\x7d\xe9\x0f\x29\x29\xde\x63\xf9\xb1\x72\x11\xd7\xf1\xae\x82\x0a\xda\x9c\xe3\xe4\x86\x49\x17\x9d\x60\xb0\x14\x94\x93\x48\x1f\x01\xd4\x59\xdb\x7d\xad\x05\x26\xb5\xbd\x9f\x4b\x33\x80\xd2\x5b\xa2\xc5\x02\xba\x8f\xa3\xc4\xd4\x13\x1b\x46\x62\xad\xde\xfb\x41\x82\x7f\x75\x9f\xa7\x1d\x44\x7d\x5f\x02\x92\x45\xf4\x8c\x62\x2e\xb7\xc6\x8c\x8e\x71\x08\x1f\x7f\x78\x9d\xe7\xa2\x83\xd2\xed\xa8\x3a\x7d\x17\x22\xa0\x5f\xb7\x2e\x17\x60\xc2\x40\x40\xc4\xd8\x34\xde\xf5\xdf\x5f\x74\x2e\x02\xb3\x04\x51\xc8\x93\xbc\xf7\xd7\x71\xdb\x78\x4c\xbb\xda\xec\x87\x6d\x8a\xc8\x67\x43\xb5\x29\xa2\x92\x00\x7a\xc7\x53\xc9\x9a\x57\x99\xcc\x32\x4f\xe5\xeb\xb5\x44\x8a\xb5\x54\xb1\x0d\x41\x36\x97\x4a\x12\x54\x2d\x25\xc6\x14\x7c\x67\xc5\xd2\x33\x6c\x9d\xb7\x5c\xba\x2f\xd6\x08\xcd\x43\xab\x95\xbe\xac\xd0\x43\xa1\x34\x9c\xef\xa8\x28\xe2\x3b\x5f\x0b\x6e\x0e\x29\x51\xf3\x35\x3b\xb9\x2b\xfd\x1f\x0a\x49\xc3\x3f\xb3\xcf\x37\x99\xa0\xb5\x43\x19\x8a\xd5\xd0\x3d\x26\x3c\x1a\x06\xc3\x5a\x26\xad\xe1\x51\x84\x91\xc8\xc1\xd2\x7a\x2d\xb0\x33\x80\x89\x32\xcd\x1c\x47\xb5\xa1\x26\x98\x5a\xcb\x8d\x88\x83\x60\xee\xcc\xfe\xb3\xbf\x51\xb0\xd1\x89\xb4\x19\x04\x40\x40\x4d\x12\xfb\xa6\x5d\x0a\x7a\x14\xc6\x20\xc5\x55\xf8\x22"}, +{{0x51,0x4e,0x07,0x0b,0x01,0x90,0xd1,0x8c,0xbe,0x98,0x1a,0x5a,0x15,0x1e,0x77,0x53,0x39,0x8a,0x27,0x2b,0xcf,0x01,0x48,0x13,0xad,0x37,0x97,0x22,0xc3,0x6e,0x13,0x3d,},{0x6f,0xbd,0xe0,0x47,0x4c,0xc4,0x81,0x0e,0xff,0xa5,0x0a,0x07,0x82,0x0c,0x96,0x5a,0xa0,0x03,0x95,0xff,0x3a,0x5b,0x3e,0x2e,0xdd,0x7d,0x35,0x6b,0x7d,0x6a,0xef,0x2b,},{0xb6,0xc3,0x55,0xc9,0x58,0xb5,0xba,0xa7,0xeb,0xe9,0x77,0xa9,0x3f,0xcf,0x53,0x95,0x89,0xa3,0x66,0xd4,0x01,0x60,0xe4,0xe0,0x31,0xb8,0x8a,0xb9,0x64,0x02,0xc7,0xbd,0x57,0x7f,0xf6,0x35,0xfc,0x07,0x78,0x24,0x23,0x59,0x8d,0xca,0x43,0x66,0x81,0x24,0xa8,0xb2,0x87,0x51,0x0e,0x2c,0xfd,0x07,0xa1,0xe8,0xf6,0x19,0xf6,0xc8,0x54,0x0a,},"\x83\x14\x55\x76\x2a\x5d\x80\x09\x7b\xb2\x84\x50\x42\xf4\xc8\x76\xe7\x10\x85\x35\xbe\xd6\x83\xe8\xc4\x46\x19\xd0\x81\x54\xa2\x29\x44\x4b\x10\x1e\x3e\xd7\xc0\x15\x07\xe8\x70\x94\x14\x46\xaf\x97\x8c\x0f\x53\x41\xd1\xac\x1d\xd1\x5b\x14\xe8\x96\x67\x12\xdf\x19\xf5\x2f\xeb\x51\x03\xcf\x62\xb6\x63\x27\x56\x44\x6c\xc7\x54\xdf\x00\xa3\xf6\xdd\x71\x99\x68\xa2\xce\xf6\x6c\x3a\xdf\xb7\xd1\xfc\x49\x1f\xbb\xf3\xd5\x92\x94\xab\x34\x61\x9e\x17\x6d\xb0\xd4\x46\x15\x1e\x37\xea\xa3\xda\xf1\x72\x40\x6e\x98\x3d\x9d\x23\xa6\xb6\x9e\x92\x97\x60\x30\xf5\xac\x70\x40\xad\x51\x14\x12\x9f\xea\xf9\x7a\xf1\x5b\x22\x96\xfa\xe7\x04\x92\xdb\xbe\xb2\xb4\x82\x76\x87\xfb\x79\x87\x15\xc9\xbb\x2c\x32\x55\x7a\x81\xd8\x91\xb8\x97\x05\x29\x00\x70\x71\x59\x75\x1f\x07\xdb\x07\x4c\x77\xf0\x71\x96\x71\xf1\x76\x66\x89\x02\x9a\x3c\xdd\xf3\x9d\xf3\x48\x3c\xf2\xb0\x4f\x71\xc2\x5d\xe0\x5f\xc2\xd0\x2b\xb4\x8e\x53\x9e\xaf\x1a\x32\x16\x46\xcd\x80\xef\x2f\x0a\xc7\x03\xf4\x5e\x73\x89\x53\x08\x00\xe5\xd4\x17\xcc\xea\x8a\x5c\x08\x66\x82\xf0\x47\x45\xd5\x0b\x5d\xfc\x8f\x6e\xdc\x87\xa9\x5c\x7d\x20\x2a\x9c\xfd\x99\x87\x14\xb7\x46\x92\x0e\xbb\xe2\x33\x5b\xca\x1a\x01\x71\x76\x20\x16\xf5\xe4\xbd\xa8\x9c\x57\xd0\xed\xc6\x91\x0c\x6d\x22\xc8\xf9\x09\xda\x3d\xb1\x35\x2f\x0c\x8b\xd1\x8f\x3b\x5a\xac\x25\xf1\x93\xb8\x94\x70\xf9\x76\xbc\x4f\x1a\xff\xb3\xc6\x6b\xc5\x87\x6c\x6f\xe2\xac\x75\x08\x53\x3d\x97\xbb\xcf\x77\x11\x9d\x9a\xae\x19\x3f\x07\xe0\xb6\x4b\x46\x1c\x9c\x6c\x3b\x9d\x29\x3b\xd3\x7d\xe3\xd8\xe1\xab\x1e\x8d\x87\x2c\xd9\x4e\x6c\xf0\xeb\x68\x43\x9f\xdc\xd3\xb2\x5c\xe8\x48\x34\x60\xbd\x8b\x7c\xce\x88\x9f\xb7\x22\xb4\x36\x1e\x11\x8d\xa9\x83\xef\x4a\x9e\x45\xce\xbc\x0c\x1b\x82\x29\xea\x53\xe6\xf5\x55\x05\xf6\x44\xe0\x9a\xca\xa4\xc4\xb8\xcc\x64\x0b\x2c\xd2\xb3\x12\xe1\xc3\xa2\xc0\x26\x69\xe1\xf9\xc0\x63\x11\xc7\x8d\x36\x00\x09\xdb\x9e\x67\xc3\x9b\x49\xd1\xe5\xd7\x70\xc0\x1d\x28\x4b\x0a\x17\xa4\x1b\x4e\x7c\xa7\x45\xd6\x65\xec\x07\x50\x0e\x4d\x9f\xc8\xeb\xc1\xcc\x6a\xf5\x3a\x3f\xc7\x6b\x0c\x3f\x14\x31\xd4\x98\x43\xf2\x0e\x18\x27\x82\xc8\x2b\x3b\x5a\xae\x36\xfe\x20\xca\x64\x26\x18\x06\x8b\xe2\x33\xd4\xb5\xef\x9e\xae\xff\x40\x15\x36\xdc\x59\x3a\x2b\xc1\x83\x44\xf5\x5a\xc5\xd5\xfc\x7b\x3e\xb5\x06\xd1\x1c\xb3\x75\x33\x00\x63\xc6\x20\xc5\x33\x4d\x72\x3c\x7d\x1f\x04\x28\x16\xbc\x47\x85\xb3\x5a\xc0\xe6\xf1\x74\xf7\x36\x87\x8b\x7b\x49\x16\x58\xca\x67\xd8\xfc\xab\x53\x8f\xc6\xec\xd2\x77\xea\xd9\x0d\x95\x4b\x46\x0d\xa4\x25\x3a\x1c\x3a\x30\xb3\xd8\x92\x8f\x69\xac\x98\x76\xa2\x89\x19\x69\xfc\x2d\x06\xa6\x68\x99\x2b\x8e\x21\x15\xdf\xe5\x35\x8a\x71\x24\xba\x7c\xcf\x42\x1d\x80\x54\xea\x04\x34\x44\xcd\xeb\x40\xb7\x16\xdc\x7a\x36\x59\xa3\xca\x94\x34\x72\x93\x48\x90\x60\xe2\xcf\x67\x12\xa2\xa6\xc7\xb8\xad\x14\x67\x85\xfc\x40\xcc\xb9\xda\x28\x78\x30\xd0\x11\xd0\xd2\x4d\xf3\xe7\xaf\xbe\x97\x2d\x6f\x41\x7d\xe5\xcd\x75\xf2\x59\xea\x07\xca\xfd\xde\x20\x5f\xc0\xa3\x65\x13\x5c\x23\x2c\xbd\x7c\x1b\xc5\x39\xfa\x4b\x7e\x1c\xce\x35\x18\x52\x37\xc2\x3f\x80\xae\x97\xc1\x86\xd0\xd3\xb1\x05\x03\xd5\x98\x4a\x20\xec\x41\xc3\xcd\x04\x2c\x28\xa4\xc3\x1f\x95\x74\xb0\x6a\x87\x2b\xf9\x59\xab\x0a\xdd\x1f\x5d\xee\x14\xa1\xe7\x41\xef\x23\x8d\xfc\xde\xc0\x85\xaa\x08\x8d\xcf\x39\xa3\x6d\xda\x8f\x2a\x85\xed\x0d\x36\x2c\xcb\x00\x5d\x02\xe5\xac\xcc\x09\x2a\x37\x6d\xc1\x1a\x56\x61\x70\xd5\x83\xdb\x35\xf1\xde\x0b\xe3\xf1\x59\x08\x59\x6e\x9b\x78\x1a\xc8\x1b\xe0\x7b\x9b\xd2\xaf\x46\xc5\x6f\xb4\xd9\xd8\x42\x76\x01\x1e\x46\x18\xb7\xf7\x6f\x96\x79\x4c\xd0\xfd\x57\xed\x41\x4b\x63"}, +{{0xbc,0x79,0x0a,0x73,0x85,0xdd,0x1d,0xdd,0xc7,0x62,0xe3,0xb2,0x02,0x21,0xdc,0x07,0x8b,0x6c,0x3d,0xa8,0x98,0x6d,0x41,0x80,0x94,0x07,0x27,0x25,0x7c,0xfd,0xcd,0xf1,},{0xc9,0x26,0x46,0x26,0xf6,0x8f,0xed,0xb5,0xb3,0x9c,0x28,0xf0,0x30,0x45,0x3b,0x54,0xd0,0xd5,0x1a,0x98,0xb1,0x77,0x21,0xf2,0x61,0x1d,0x7f,0x27,0x7e,0xf4,0x8b,0x81,},{0x6d,0x6b,0xd6,0x5f,0x37,0x26,0x79,0xfe,0x9d,0x94,0x5f,0xf5,0x65,0x16,0x33,0x3e,0xce,0x0b,0x7a,0x25,0xb1,0x5a,0xd2,0x48,0x73,0x81,0x67,0x0e,0x53,0x6f,0x52,0x46,0x77,0x5e,0xb3,0x9a,0x11,0x4d,0xb2,0xb9,0xcd,0x50,0xf3,0x12,0xb3,0x60,0xd9,0xd0,0xbe,0xa2,0x95,0xdc,0x37,0xb8,0x17,0xb3,0x32,0x89,0x0a,0xdb,0x65,0xe4,0xc4,0x01,},"\x14\x3d\xd7\xbf\xbf\xf2\xad\xc7\x1f\x5d\x12\x3d\x47\x4e\xa0\x69\xdf\x14\xae\x92\x3e\xd9\xbf\x8f\x98\x91\xe6\x0b\xae\x43\xf0\xc9\xf5\x55\x37\xac\x9d\x1a\xe5\x23\xce\x4e\xcf\xd3\x3b\x20\xae\x44\x5e\x9c\x42\x63\x72\x05\x0f\xa5\x21\x7c\x1e\x4f\xb0\x13\x53\xeb\xf2\xe3\x29\x04\xef\x7e\xef\xcf\x72\xe8\x02\x3b\xae\x06\xbb\xb6\x40\xcf\x77\x7d\x5b\x0e\x11\x52\x7b\xc8\x35\x49\x3a\xd6\x98\x0a\x15\x7b\xb2\xd5\x0b\xe2\x33\x65\xe7\x2c\xbf\x0b\x3f\x20\x9e\xf0\xc4\x4a\x00\xb4\x1a\x62\x26\x24\x88\x09\x6c\xae\x5a\x69\x6b\x4d\x64\xcb\xad\x34\x50\x0d\x41\xfb\x4e\x4b\xc7\x0f\x8b\xf6\x21\x44\xd0\x1c\x22\x75\xd6\xd2\x9f\x5d\xe7\x5b\x17\x21\xd5\x04\x6b\x68\x29\x16\x44\x43\xeb\xfd\x9c\x17\x81\x31\x9d\x88\xf5\x40\x10\xed\xc2\x96\xab\xbe\xd0\x2b\x7d\xad\x9b\xa5\x85\xb5\x52\xe0\x00\x5d\xcc\xa4\x00\xbf\x4f\x45\x9e\xed\x7d\xb8\x6e\xa8\x61\x2b\xe9\xe9\x18\xdf\xd4\xe2\x70\x0c\x47\x10\x08\x32\x83\x62\x6f\xac\x75\x44\x17\xe0\x08\x7d\x26\xba\x14\x5d\xfc\x45\xb1\xc9\xbf\x7b\x4d\xd7\x0e\x6c\x50\x87\x47\xef\x80\x5c\x9a\x02\x42\x5a\xeb\xc6\x42\x1e\x0d\xeb\x6a\x79\xd8\x9a\xce\xee\xe0\x1e\xce\xcc\x9f\x3c\xa3\x65\x38\x38\x26\x58\x4c\x43\x0e\xbd\x39\xec\xf0\xa7\x28\x66\xae\x0a\xce\xca\x5a\xd4\xf0\x40\x5b\x67\x77\x9c\x04\xc5\xde\x03\x30\x61\x4d\xa3\x47\x0b\x80\x5d\x78\x7c\xe7\x9a\xc5\xa6\x96\xdd\x6f\x6b\x55\x39\xb1\xa6\x51\xb4\x24\xce\xfb\x19\x49\x1d\xa6\xe0\x88\x92\x23\xcc\x98\x39\x8b\x42\xc0\x04\x14\xff\x8d\x6c\x06\x27\xeb\x97\xcf\xf2\x0a\x8c\xbe\x7f\xcc\xb4\x1d\x81\x0f\xcf\xe8\x58\xca\x74\x75\x24\x7e\xf6\x28\xe8\x4a\x09\xd0\x12\xfe\x12\x23\x5b\x38\xc1\xcc\x9d\x82\xe2\xb6\x9d\x01\xd6\x21\x8c\xfd\x48\xe8\x5f\x26\xae\xad\xd1\x95\x40\x8c\xdd\x4c\x2f\x80\x6a\x89\x04\x1f\xd0\x31\x7f\xb1\xa7\xb6\x20\x9f\x90\x42\x70\xd3\x4e\x60\x61\x95\x04\x72\x88\xb0\xfb\x11\xa5\x72\x29\x38\xf6\x7c\x22\xb3\x13\xf7\xf7\x4b\x20\x25\xc7\x5b\xcd\x1e\xcc\x5a\x9a\xdd\x4a\x64\x0a\x41\xf2\x99\x6e\xb6\x6e\x5a\xf1\x96\x19\x8d\xb5\x8a\x3f\xb9\x93\x8f\x34\x9f\x92\x2a\x24\xd8\x6f\x4e\xd8\xa9\x6a\x09\xa1\x96\xc2\x4d\x6d\x01\xed\x76\xf3\x81\x6c\x05\xc4\xf2\x6b\xac\xa9\xb9\xd6\xdc\xc7\x9b\x58\x0d\xfb\x75\xd6\xc9\x05\xd4\x80\xda\xd7\x69\x51\x85\x4b\xda\x1c\xaa\x7f\x4a\x81\x95\x43\xae\xd0\x1a\xe9\x56\xbf\x30\x58\xfe\x8b\x3c\x7d\x5d\x72\x49\x62\xf1\xa6\xa8\x31\x43\xdd\xad\x27\x4f\xda\x3a\xd5\x78\xe9\x8a\xa9\x67\xc4\x10\xee\x57\x57\x5e\xf0\x1c\x02\x58\x56\x0f\x0a\x1f\xa4\xb7\x93\x27\x79\x6d\xe9\x94\x20\xcf\xd0\xa4\x15\x50\x63\x60\xf1\x24\x2c\xcc\x58\xa6\x88\x09\x27\x75\x0d\xbb\xff\x13\xd7\xc1\xb4\xed\x51\x9c\xda\x35\x72\x10\xf1\x2f\xb0\xd1\xc4\xd4\x8f\x04\x11\xbd\x7e\x05\x8c\xc4\xcb\x93\xd3\xc7\x75\x97\xe2\x65\x3f\xfa\x28\x2d\x3c\x2f\x12\x8a\xc3\x3a\x23\x7a\xf2\xfc\xbc\x9e\xf9\xc8\x11\xf3\x78\x14\xba\x2b\x0b\x85\x09\x3d\x0f\xd1\x8b\x8c\x6f\xb0\x9a\x43\xce\x52\x25\x4d\x23\xd5\x5f\x32\xe1\xd3\x24\x2a\xed\x1f\x23\xd9\xcf\x20\x4a\xa0\xdf\xd4\x4a\x34\x6f\xe0\x9e\x55\xa4\xa0\x6c\xf1\xbe\xf8\xbb\xf3\x7b\xa1\xf1\x59\x8a\x58\xae\xf8\x95\x01\xec\xba\xc0\x45\x35\x43\xe4\x80\xed\x0a\xdd\xe9\x0c\x84\x1d\x95\xeb\xd6\xeb\x23\xba\xa9\xf7\x0f\x83\xc1\x49\xea\xb3\x2d\x09\x13\xc7\x9b\x09\x93\xd0\xe1\xd3\x57\x4f\x0f\x54\x2e\x56\xa2\x06\x16\xcf\xe4\xa8\xbd\x7a\xae\xeb\xe0\xb0\x83\xdc\x2c\xe0\x14\x61\x78\xc0\x74\x82\xa0\x11\x29\xbc\x6f\xef\xdc\x81\x41\xc1\x38\x48\x94\xb6\x9c\xbe\x2f\x29\xda\x18\x8f\x7f\xd4\xac\x34\x1a\x2d\xf6\xfd\x90\xde\xe6\xa4\x46\xd2\x74\x63\x24\xc7\x5c\x1e\xf5\xb1\xac\xe1\x87\xd3\xbc\x16\xd7\x05\x59\x89\x29\x75\xd7\xe4\x71\x38\xf0\x40\x63\x85\xea"}, +{{0xdb,0x3a,0x44,0xdf,0x40,0xd2,0x55,0xa2,0x5c,0xf2,0x3f,0x53,0xc4,0x52,0x23,0xb7,0xd8,0xf1,0xf1,0xf1,0x11,0xba,0x07,0x40,0x6b,0x71,0xe1,0x84,0xa8,0xcd,0x06,0x12,},{0x6b,0x12,0xbd,0x95,0x80,0xae,0x20,0x7a,0x9b,0x0b,0xaa,0x82,0x87,0xb8,0xbb,0x86,0x66,0x93,0x73,0xee,0x5e,0x5a,0x62,0x5a,0xb4,0xa6,0xef,0x2d,0x08,0x71,0x25,0x97,},{0xcc,0x28,0xb5,0xef,0x4b,0x97,0x73,0x63,0x7f,0xae,0x7e,0x5f,0x08,0x4b,0x69,0x94,0xaa,0x35,0x98,0xf8,0xf4,0xa6,0x5d,0x0b,0xb2,0x01,0xd1,0x72,0xd8,0x61,0xa3,0x01,0x49,0xb3,0x33,0x8d,0x3c,0x3a,0xb7,0x5b,0x32,0xb2,0x55,0x95,0xcd,0x8b,0x28,0x96,0x30,0xc3,0x37,0x6a,0xcd,0x10,0xba,0x2a,0xb2,0x6b,0xc1,0xab,0xa9,0x00,0x84,0x0e,},"\x52\xdd\x8b\xa4\xff\xfa\x34\x4d\x1e\x08\x11\xd9\x67\x5c\x31\x3f\x9c\xc0\xe5\xa1\x38\x47\x86\x91\x98\x9d\x2b\x7f\x73\x89\x02\x50\x68\xfa\x35\xf7\x4f\x9a\xea\xf1\xe9\x56\x65\xec\xf8\xd5\x70\x7f\x75\xf6\x5f\x22\x56\xee\xa9\x33\x98\xbe\x59\xc0\xd5\x38\xf5\xe8\x58\x4b\xfb\xb3\xa2\x40\xf5\x01\x6d\x79\x27\x23\x4c\xb3\xea\xc3\x5b\x39\x1b\x8b\x53\xf2\x0e\xd8\xba\xe0\xba\x11\x08\x96\x94\xbf\xea\xde\x11\x07\x16\x56\xd4\xcf\x18\xef\x2d\x36\x81\x92\xe0\x4e\x08\xe3\x02\x4f\xc1\xd2\xfd\xa6\x31\x2a\xfc\xa6\x8d\x10\xc9\xc3\x36\xa0\xe3\x68\x50\xbe\x1a\x4f\x35\xb0\x33\xa8\x5a\x2a\x95\x49\xf2\x67\x3a\x99\x5f\x2a\x9a\xb4\xbd\x46\xc8\xfd\x2d\x83\x8e\x64\xf7\x61\x71\x34\x27\x32\x9c\x9a\xf5\xe4\x21\x1a\x22\xab\x20\x8a\xaa\xb8\x0e\x19\x4c\xd0\xf6\xa5\x02\xb3\x08\xfe\xd6\xc5\x83\x51\x78\x01\xa4\x8e\xd4\x33\x0e\x2f\xad\xdc\xd4\x18\x09\xc3\x91\x9b\x30\xe8\x4d\xb3\xc6\x87\x31\x03\x1e\x79\x85\x7d\xd9\xf9\x7f\xfd\x12\x54\x7d\xa7\x06\x67\x98\x07\x41\x51\xec\x88\xa5\xfa\x96\x3b\x9d\x9d\x83\xba\x2f\xee\x13\x58\x33\x95\x0e\xf7\xbc\x62\xb3\x40\x1e\xa1\x1b\xb3\x6f\x25\x56\x1b\xc0\x52\x2b\xb0\x2d\x8d\xad\x05\x43\xf6\x3d\x54\x7b\xe7\x7d\x0a\x4c\x9b\xf6\x5d\x42\xf3\xa2\x76\x14\x4d\x2e\x47\x4e\x29\x42\xf3\x79\x02\x21\xe2\x6f\xba\xe7\xca\x91\xef\xd8\x59\x21\x99\x08\x35\xfa\xfb\x6d\xc6\x74\x63\x5c\x96\x01\x82\x10\x38\xb5\x27\x11\x34\x3d\x1a\xa2\x5f\x1c\x46\xba\x4e\x3c\x6e\x71\x2b\xac\x19\xe5\x3e\xae\x30\xe5\x24\x6e\x4f\x04\xdd\xf2\xac\xdb\xb3\x41\x63\xc2\x43\x67\x76\x90\xbe\x0b\xf2\xe3\xfa\x16\x48\x70\xb5\xe6\xf5\x36\xb2\x2f\xb8\x9e\x5e\x8e\x1d\x87\xcd\xb3\x40\x44\x97\x7e\xd2\x83\x6e\x54\x4d\x7b\xa4\x93\xdd\x42\xa2\xb6\x49\xbc\xf3\x13\xc5\xb3\x9a\x1d\xbf\xff\x3e\x7f\x2a\x59\xad\xe8\x7d\x3e\x7b\x25\x8f\x58\xe5\x65\xfd\xba\x3e\x4d\x92\xb1\xed\xb8\xbf\xf5\x4d\xc4\x9d\x86\xc5\x3c\x03\x0c\xf5\x8b\x97\xef\x06\x6d\x24\x1b\x54\x05\x30\x21\x39\x05\x73\x9d\x8e\x1a\xa7\x2e\xd9\x0f\x68\x5d\x39\x58\xea\xa2\x42\xb0\xcb\xf7\xa2\xeb\x97\x6e\xe9\x6a\x63\xe6\x67\x86\x46\x41\x69\xa7\x42\xd4\x57\xe4\xd9\x11\x7c\x7d\x66\x42\x84\x45\xa4\x69\x30\xc2\x8b\xa7\xa2\x65\x82\x41\x80\x5e\xbe\x72\xc7\x8e\x02\x03\x5d\x26\x3a\x21\x1e\x59\x0b\x49\x0c\xdb\x84\x41\x50\x62\xee\xd1\x4f\x13\xb8\xa1\xa9\xe7\x7c\x8d\x7b\x75\x51\x5b\x18\xfb\x85\x38\x6e\x4a\x7e\x05\x39\x80\xd3\x0f\x48\x99\xe8\x38\x63\xbe\xe8\x75\x58\x58\x87\xc5\xf4\x8b\x51\x6c\xcb\x73\x1c\x4b\xca\xa3\xdf\x07\xd0\x47\x95\x81\x40\x96\xc7\x9d\x7c\x5f\xdc\x4d\xab\xf5\xe2\x6a\x4c\xa1\x83\x8e\x0e\x5d\x87\xdb\x71\x30\x9b\x81\xea\x7c\xe4\x61\xe5\xe4\x4c\x7a\xb2\xf1\x05\xad\x75\xc5\x43\xc1\xe9\x17\x9c\x36\xa5\xfa\x55\x5e\xc9\x22\xff\xed\x1b\x76\xd2\x58\x01\xdd\x74\xf8\x0c\xd0\xa6\xba\x7b\xc2\x0d\xb0\xad\x58\x0b\x7b\xbb\x9d\xdc\xfd\x93\xad\x1c\x5f\x20\xf3\xe2\x7c\x3e\xa3\xa1\xe7\x1e\xb7\x4f\xf5\xf9\x44\xcd\x3b\x98\xf6\xd0\x45\x29\x59\x30\x11\xc4\xae\xce\xf6\xdc\xaa\x60\xfb\x18\x36\x8c\xb1\x2b\x6e\x39\x1b\x3f\x5d\xf7\x65\xcb\xab\xff\x15\x89\x8c\x84\x79\x6f\xc2\xb5\x3f\xa4\x90\x0d\xad\x03\x4a\x13\xb0\xce\x14\x45\xad\xda\x4e\xf7\x19\xbe\x74\x14\x19\xe2\x31\xe9\x2f\x1f\x66\x7a\x32\x84\x2a\x42\xdb\x79\xbd\x7a\x01\x4a\x80\x9c\x81\x59\x6e\x82\x62\x73\xd1\x6f\xe5\xd4\x04\x58\x24\x2a\xe1\x0e\x12\xe6\x0b\x34\x89\x53\x0c\x66\x22\xb5\xbb\x44\x45\x4f\x29\x61\x6e\x47\xe9\xa2\x97\xce\x1c\xa0\x74\x13\x7f\xd9\xae\x13\xe3\xee\x8e\xdb\xcf\x78\xaf\x26\x54\x59\xdb\x1a\xf3\x42\xdc\x0b\x2f\xc8\x09\xbd\xa0\x15\xb5\xa8\x2b\x2b\x7c\x54\xef\xe4\xe5\xfc\x25\x2e\xb1\x3d\x66\xe8\x08\x93\x6f\x19\x10\xf4\xc4\x8b\xe0\xef\x7a"}, +{{0x77,0x96,0x4d,0xad,0x52,0xb5,0x79,0xb8,0x96,0x67,0x53,0xda,0x31,0x86,0xd1,0xc5,0xe9,0xd3,0x3d,0x33,0xa4,0xdb,0x38,0xbc,0x0d,0x7a,0x1a,0x6c,0x11,0x2c,0x13,0xc2,},{0xfc,0x25,0x12,0x5e,0x78,0x29,0xf6,0x42,0x34,0x37,0x5e,0x52,0xae,0x9f,0x77,0xae,0x10,0x13,0xf9,0x9d,0xf5,0xf9,0x96,0x5a,0xd2,0xaa,0x16,0x58,0x95,0x96,0xd0,0x91,},{0x3d,0x1b,0x4b,0x4e,0x82,0x0d,0x25,0x0b,0xe2,0xa8,0xfa,0x97,0x1e,0x59,0x9e,0x1e,0x98,0x97,0x75,0x28,0xb2,0xf9,0x30,0x18,0x96,0x81,0xa9,0x3b,0x05,0xe1,0xa7,0x06,0xfc,0x80,0xef,0xfa,0x94,0xe9,0x29,0xbc,0x43,0x92,0x16,0x56,0x89,0x73,0x88,0x28,0x8a,0x9b,0x29,0x27,0x1f,0x37,0xa1,0x4b,0xe0,0x14,0xb8,0x73,0xc6,0x8f,0xc9,0x04,},"\xc3\x39\xe7\x18\xa7\x57\xf3\xf3\xbd\x1b\xab\xdd\x2e\x00\xaa\xa5\xcd\x7f\xc9\x00\x5e\xe3\x4b\x6f\xdc\x09\xd7\x1f\xbd\x9c\x92\x89\xab\x1d\xd1\x4d\xba\x2c\xad\x58\xcb\x80\x51\x16\x77\x7b\xd8\x0c\x85\x96\x64\x33\xad\x46\xf9\xca\x6e\x54\xf1\x3d\xd3\xca\x7e\x56\xe4\x7f\xea\x41\xe5\x48\x8a\x45\xad\x53\xbc\x5d\x65\x74\x27\xe1\xd7\x93\x8f\x55\x19\xf1\xb0\x9f\x5b\xdd\x98\xaa\xe5\xac\x96\x43\xef\x78\xeb\xa4\x93\x49\x25\x33\x9a\x15\x5d\xc6\x68\x28\x57\x10\x02\x09\x7a\x11\xa5\xce\xe7\xb5\x1a\x44\x1b\x75\x6b\x0c\xe6\x5b\x77\x9a\xfe\x19\xda\x6a\x18\xef\xc1\x45\xf6\x09\x0c\xe7\x70\xde\x9e\x0e\x91\xf5\x43\x27\x0a\x09\x85\xea\xb4\x75\x29\x3c\xcf\xdd\x31\x41\xc4\x14\x2e\x47\x22\x23\x3b\x26\x74\x99\x44\x76\x41\x23\x5d\x72\x8b\xd7\x5c\xd1\xad\xc0\xdb\x14\x2f\x73\x31\xad\xdd\xf8\xc5\xee\xa3\xd5\x76\x40\x5d\x86\x99\x15\xb5\x60\xf9\x64\xe3\xe0\x00\x3c\x91\xf5\xe9\x6b\xff\xbe\xee\xc7\x3e\x51\x02\x4e\xf5\x2c\x55\xc6\xdc\xb5\x4d\x58\x20\x3e\x62\xf4\xdd\xb6\xe1\x37\xeb\x08\xe1\xbf\x13\x26\x01\x8a\xfd\x1a\x86\xca\xb6\xc8\x41\xe0\x66\x1c\xe0\xa1\xa7\xae\x96\x7f\x24\xc1\xa7\x7f\xc7\xca\x50\x5f\x72\xe5\xf7\x93\x6e\x39\xc6\xf4\x83\x7e\x25\x95\x19\x5a\x69\xcd\x67\x65\x10\xa7\x16\x1a\x4d\xc5\xe3\x18\xf3\xd4\xf3\xac\x0a\xf0\x3f\x8c\x4a\xe5\xbc\xe3\x93\x24\xe9\x73\x8a\xea\x49\xf0\x02\xd3\x2d\x16\xde\x23\x17\xe9\x5a\x9f\x32\xee\x60\x4e\x13\xdb\x80\x38\xb2\x64\xcf\xc1\x7a\xed\x29\xc9\xde\xbf\x81\x91\xde\x9e\x0e\xfc\x95\x1a\xd6\xd5\x48\x67\x06\x8c\xf5\x0a\x26\x9c\x37\xa2\x41\xf8\x52\x06\x78\x8d\x23\x14\x31\x77\xf6\x59\xcc\xa6\x6c\xfc\xe0\x3b\xc0\x50\x22\x55\x33\x7f\x16\xb3\xda\xd6\xf7\x91\x32\xab\xf8\x0f\xf1\x2b\x6d\x22\x81\xe6\x37\xeb\x6c\x71\xf7\x6e\x26\x33\xa1\x14\x56\x52\x40\xee\xd0\x0f\xab\xea\x9e\xd8\xde\x28\xc8\x32\x21\xf8\xcb\x48\x5f\x51\x2d\x90\x08\xbf\xc7\x4a\x36\x6d\x4c\x2b\x4e\xd1\x72\xd3\x67\xe0\x24\x7c\xb6\x50\x98\xc1\x10\x28\x2e\x83\x1d\xf8\xe9\xbd\x4f\xbd\x5f\x4d\xd2\xb7\xf2\x42\x0c\x23\xb8\x5a\x63\x7a\xa2\x26\x2c\x3c\xb8\x84\x05\xf7\x07\x30\xc9\xab\x4c\x9d\x0f\x22\x7e\xe4\xfa\x4e\xf9\x1e\xfe\x9a\x59\xb3\xe6\xd8\x43\xdb\x87\x9f\x56\x50\x05\x9e\x99\xf0\xe4\xa0\x38\x68\x38\xe6\xf9\x87\x6f\x67\xd5\x0f\x89\x83\x2d\xda\x5f\x30\xa9\xcb\xfd\x71\x01\x34\xf9\xb5\xb5\x46\x27\x49\x6a\xa3\xa4\x32\x12\xb0\x7f\x03\xdb\x11\xd3\xd4\xf8\x75\xd4\x1d\x1f\x4a\xc4\x59\x69\xdd\xef\x69\xf8\x1a\x06\xd2\xb0\xc6\x46\xc9\xcd\x93\x1c\xf2\x50\x2f\xef\x0d\xd3\x2a\xbb\xf0\x95\x1e\xd3\x03\xf5\x28\x48\x25\x93\x43\x97\xfc\x22\xe7\x86\x98\xd3\x5a\xd8\x1d\x82\x25\x6b\xf9\xe1\x54\x00\xa1\x09\x16\x23\xa9\x82\x6f\x1e\x57\x79\x23\x67\x41\x7e\xf0\x25\x86\xd6\x4e\x65\x0d\xa9\xac\xe2\xf1\x8a\xa0\xa1\x26\xd8\x67\xca\xc4\xb5\xd4\xc9\x1b\xf5\x20\x9e\x53\x59\x55\x63\x86\xf8\x27\x08\x3e\xb5\x3e\x8b\x47\x09\xff\xfa\xbe\x92\xc6\x1d\x78\xff\xb5\xda\xf1\x02\x74\xe2\x42\xa7\x00\x91\xf3\xf9\xb9\xd5\x96\xc1\x25\x8c\x9a\x63\x38\x4f\x4b\x05\xb0\x28\x66\x12\x22\x18\x1c\x0f\xca\x96\x5f\x0a\x2c\xb5\x6e\x4b\x55\x6d\x6f\xbf\xf7\x1b\x64\xd9\xb3\x58\xda\x31\xaa\x37\xc7\x4f\xf5\x96\x2f\xb8\xd9\x6a\x38\x3d\x04\x97\x24\xc1\x9e\x24\x9c\x9e\xdb\xb2\xa3\x75\xb2\x3c\xe3\x10\x4d\xa0\xec\x58\xd2\x63\x5b\xa0\x3b\x55\x42\x3f\xa2\xdb\x7e\xb3\x49\xa4\xfc\x58\xa1\xef\x54\x0e\xe9\xa0\x2c\x2e\x70\x3c\x68\xd7\xf8\x47\x5f\x43\x4d\xdd\x32\x00\xdb\x1f\x06\x74\x57\x91\xa3\xac\xc3\x16\x0d\xba\x50\xa3\x93\x44\x7f\xfe\xef\x6d\xc7\xb9\x8f\xb0\x66\x84\xcc\x90\xfd\x85\x20\x3d\x11\x9d\xcd\x81\x99\xe4\xd9\xa8\x9a\xe3\x46\x7a\xe4\xbb\x19\xfb\x71\xcf\x74\x70\x29\xc2\x40\x96\xf9\xa5\x0e"}, +{{0x5c,0xaf,0xd8,0x17,0xa4,0x41,0x0c,0xcb,0x27,0x12,0x17,0x23,0xef,0x32,0x07,0xc1,0x73,0x1a,0x08,0x61,0x94,0x5b,0xe9,0x62,0x71,0x4c,0x0e,0xd9,0x50,0x38,0xa1,0x95,},{0x4e,0xa0,0x86,0xbe,0x43,0xec,0xe1,0xc3,0x2d,0x08,0x05,0x9b,0xba,0xdc,0x9e,0x9a,0x2b,0x2f,0x4f,0x3f,0xe3,0x70,0xf1,0xf5,0xcc,0xd7,0xdb,0xde,0xc0,0xaa,0xf3,0x03,},{0x28,0x85,0x15,0xfa,0x72,0x59,0xf1,0xeb,0x58,0x7f,0xe8,0xa2,0xc4,0x03,0x43,0x4c,0x46,0xf8,0xd7,0xe7,0x5b,0x6d,0x22,0xbb,0x38,0x96,0x56,0x6c,0x01,0x7d,0x09,0xb6,0x98,0xc2,0xc8,0x07,0x79,0x9c,0x2f,0x65,0xf9,0xcd,0xb4,0xeb,0x58,0x15,0x1c,0xcf,0xc4,0x8d,0x10,0x80,0x61,0xa6,0xb3,0x14,0x84,0x32,0xb2,0xbf,0xc1,0xcd,0xab,0x05,},"\x50\xb2\xf0\x53\x42\x41\x80\x46\xd1\x6a\x30\xbe\x4f\xc6\x2b\x67\xda\xf6\xc1\x8d\x2a\x74\x24\x2b\x7c\xb5\x5b\xa9\x0a\xd2\x0b\x6c\xaf\xdd\x60\x15\x57\x37\xc2\x9d\xe4\x8a\xa5\xd7\x99\xfe\x54\x95\xfe\x59\xdf\x5a\x9b\x8c\x0a\x8e\x54\x18\x90\x47\x63\xfb\xad\x83\xea\x69\x86\x65\x1b\xac\x31\x11\x79\x39\xce\xf4\xe0\xc7\x99\x30\xd5\x2d\xfd\x7d\xb4\x3c\x31\xad\xda\xe3\xcf\x93\xe3\xef\xc5\xa9\x16\xef\xd0\xd6\x5f\xdc\x30\x90\x9f\xa3\x56\xcc\xbc\x52\x47\xd7\xaa\xa0\x67\x13\x1b\x6b\x48\x20\xfd\x02\xf8\xe3\x95\xf5\xa9\x70\x4c\x9b\xdd\x75\x60\xa6\x11\xd6\x25\x59\xa8\xdf\xe1\xd2\x85\x9c\x52\x48\x6c\xc1\x1e\xd3\x33\x19\x92\x48\x8f\x41\x75\x20\xd9\x20\xdc\x73\xa3\x2d\x4f\x08\x11\x00\x82\x50\x0f\x5a\x96\x2a\x30\x69\x32\xc6\xa7\x80\x29\x55\xce\xda\xd7\xab\xf5\x3b\x0f\x19\xfe\x47\x94\xa3\x1d\x6b\x85\x53\x80\x28\x43\x06\xcc\xff\x71\xa4\x00\x78\x59\xa2\x32\x8b\xb1\x90\x24\xc4\x3e\x10\xd7\x70\x64\xd8\x66\xd9\x62\x2d\x14\x2c\x27\x35\x4b\x84\xac\x3b\x4f\x82\x32\xf7\xa2\xf8\xaf\x64\x09\xd5\xcc\x75\x7a\x18\xef\x81\x3d\xfa\xf4\xb9\xbc\x04\x0c\xb0\x06\xd7\x7f\x14\x36\x41\xaa\x20\x36\xac\x7b\xc9\x28\xdc\x96\x58\x5d\x9e\x36\xc7\xbc\x9c\x56\x4d\x25\xf1\xc2\xcc\x0b\xea\xb9\xd5\xf2\x07\xe8\x4b\x21\x5f\x1e\x7a\xa6\xfc\x32\x82\x37\xb7\x9c\x39\x92\x3a\x4e\x09\xc7\xc7\x3d\xc6\xb2\x4b\x14\x16\x29\x4d\x79\x8a\x4e\xd5\xf7\x58\x33\x6d\x91\x5a\x87\x0a\x7d\x6b\x75\x92\xb5\xb8\x8a\xac\xe2\xdc\x5f\x26\x7b\xdb\x49\x11\x41\xcb\xba\xe2\xa6\x77\x40\x7c\xc0\x95\x5f\x96\x19\x62\x59\x93\x04\xba\x0b\x83\x96\x71\xa5\xc0\x00\xe9\x20\x10\x8a\x05\x29\x80\x87\xe4\x97\x70\xae\xee\xaa\xb3\x63\x27\x24\xcb\x0f\xc2\x28\x57\x96\xdc\x41\x48\x14\xfd\xa7\x8a\x54\xe6\x7f\x00\xa0\x2f\x77\xd3\xcc\xde\x1e\xd9\xd7\xb1\xde\xf1\x4e\xa1\xf6\x19\x10\xbd\xf3\x0a\x11\x96\xfc\x63\x51\xb6\x22\x54\xd6\x44\x5e\x6c\x90\x44\x5b\x16\xef\xaf\xe2\x89\xa2\x78\x4b\x92\xe4\x2b\x78\xa4\xa9\x00\xc3\x5f\x55\x63\x0b\xbb\x77\x62\xff\x9e\xb7\xfe\xf7\xd0\x4c\x90\xb9\x57\x1c\x4f\xc7\x60\xa4\x10\xdb\xfc\x25\x29\x91\xd0\xba\x27\xf2\xd4\x14\xfe\x64\xee\xfd\xff\x4a\xbc\x18\x81\x7c\x97\x06\xc6\x31\xbf\xa2\x03\x82\x1d\x3b\x92\xcb\x33\x8b\xaa\xf5\xd1\x23\x2b\x46\x26\x47\x95\x4d\x09\x02\x46\x2f\xb1\x69\x6e\x99\x1f\x07\xfa\x9c\x3d\xbc\xf2\x87\x29\x60\x83\x1b\x4d\xed\x92\xa4\x21\xcf\x21\xb7\x53\x16\x5f\xf3\x09\xef\xe2\xef\x54\x38\xc0\x12\x70\xd1\x0c\x6a\x03\xd3\x4f\x71\xeb\xc2\xda\xb1\xda\x90\xda\xa3\x57\x98\x4d\x24\x62\xbc\xb3\x5e\xe3\xde\x55\xc3\xa5\x5f\x8b\x98\xae\xc2\x11\x4f\x74\xc8\x43\x41\xa6\x41\x27\x86\x3c\x12\x0b\x5e\xca\xd9\xe3\x29\xa5\x75\x6a\xe4\xa2\x55\x5d\x84\x92\xcd\xa8\x35\x22\x5a\x8d\xeb\x3f\x9c\x15\x58\xf0\xd4\x25\xbc\x17\x2f\xf7\x64\x0c\xc7\x9d\x97\x80\x04\x16\xfd\x62\x94\xcc\xcc\x70\xcd\x1c\xf5\xb6\xa8\xe2\xaa\x07\x28\x9b\xd5\x22\xbf\x99\xdc\x96\xc3\x6b\xfe\xe8\x0e\x84\x6f\x5d\xd7\x46\xdd\x4c\x50\x03\xe4\xbf\x7d\x29\xef\xee\xa7\x50\x8a\x01\x61\x23\x68\x82\xc9\xa8\x2a\x56\xaa\x2c\x25\x74\x66\x96\x52\xc6\x30\x92\x3a\xb4\x70\xdd\xb9\x5d\x45\x6f\x7b\x8e\x8f\x07\x59\x9b\xa0\xd1\xd3\x8b\xc7\xf8\x17\x6e\x3f\xdf\x02\x09\xbd\x6f\x75\xd4\xcc\x11\x80\x3a\xfb\x18\x56\xcb\xc0\xe9\x1c\x73\x73\x0e\x4f\xb9\x8f\x3c\x94\x8a\x87\xd5\xa7\xed\xcc\x0a\x6a\x8a\xc8\x10\xea\x3e\xaa\x6e\x06\x3c\xec\x5f\x55\x66\xcd\x6d\xed\xc5\x37\xdb\x6d\x68\x6b\x80\x21\xf6\xea\x82\x5a\xd7\x47\x5e\xc7\xf1\xc5\xdb\xde\x45\xd3\xff\x4b\x5e\xe5\x1c\x0d\x04\xf1\xd7\x40\x18\xeb\x91\xe5\x04\x0d\x01\xc8\xb7\x1a\x4a\xab\xbd\xe6\x09\x4d\x4a\xfe\xcc\xb1\x8d\xfc\xde\xd7\x3e\xa7\x5e\x3b\x9f\x8c\xe1\x67\xdf\x62\x09\xae"}, +{{0xd5,0xca,0xc8,0x55,0x21,0xaf,0x78,0x1f,0x3d,0x5f,0x66,0x86,0x2a,0x04,0xb0,0x87,0xd0,0xcc,0xdc,0xac,0x92,0x6c,0xfe,0x9e,0x74,0x7b,0xe8,0xd5,0xc2,0x63,0x3f,0x78,},{0x10,0x0d,0xcc,0x53,0x03,0x9b,0xf0,0x5e,0xa0,0xa9,0xf5,0x88,0x82,0x12,0x69,0x3d,0x4f,0x9e,0x0e,0x75,0x25,0x95,0xbb,0xcd,0x02,0x06,0x10,0xe0,0xae,0x21,0x35,0x96,},{0x5d,0xc0,0x33,0x63,0x41,0x4e,0xea,0xc0,0x08,0x6f,0xb6,0xfe,0xba,0x44,0x21,0x7c,0xef,0x4c,0x52,0x0d,0xb6,0x19,0x26,0xdf,0x68,0x0c,0xa6,0x02,0xdc,0x11,0x00,0x3c,0xe6,0xaf,0xbf,0x3d,0x13,0xc8,0xc5,0xb0,0x52,0x73,0xd2,0x14,0x15,0xe6,0x7c,0x14,0xa2,0xee,0x5d,0x0b,0x1d,0x53,0x52,0x41,0x9a,0xb9,0xb3,0x9c,0x00,0x3a,0x51,0x0c,},"\xd5\xe7\xdd\x59\x49\x09\x37\x5a\x4b\xe0\x8e\x74\x82\x5d\x59\x8d\x53\x5b\xf4\x6e\xc0\x84\xde\x52\xb5\x73\x91\xc1\x27\xef\xf5\x22\x4a\xb2\xd1\x94\xdf\xb2\x66\x33\x47\x8d\x02\xfb\xda\x74\xd1\xdc\x58\x21\xf7\x91\xbf\x96\x2d\x8d\xad\x9e\x4e\xf2\x42\x24\x89\x19\x07\xb0\x18\x9c\xcc\xc8\xb1\x33\xd3\xaa\x20\x78\x92\x6d\xae\xf2\x89\x8c\x19\xc2\xe0\xbf\xe0\x20\x41\xa9\x04\xb9\xf0\x4b\xe7\xcb\x50\xae\xd0\xd9\x62\xd1\xad\xd2\x0b\x40\xa8\x8a\xb7\xab\xad\x62\x6c\xf4\xda\x0a\x78\xf9\xf5\x36\x85\x50\x1f\xdf\xa5\x85\x43\xdd\xf2\xea\x0e\xea\x69\xe7\xba\x16\x0f\x8a\x17\x7a\x25\xfc\x21\xe8\xa2\x9c\x66\x16\x33\xe3\x0e\x52\x3b\x0e\xc0\x1b\x2a\xee\xe2\xd4\x26\xe4\xae\xad\x45\x74\x88\x10\x8f\xe5\xf5\x69\xcf\x6e\x2f\xdb\x68\xc2\x8f\x2b\x30\x52\x82\x35\x77\xcd\x93\x4e\x7b\x06\x2c\x8a\x34\x24\xcd\x43\x67\xfb\x31\x5b\x74\x4c\xa3\x52\x55\xd7\xf1\xaf\x4e\xdc\x9b\xc9\xd8\x83\x71\x23\xd9\x79\x03\xb4\x3d\xf3\x67\xc7\xd4\x18\xc7\x93\x47\xff\xaf\xe7\xc7\xb1\x72\x4b\xba\x34\xed\xe8\xd3\x56\x8d\xb5\x05\x98\x3e\xad\x47\xf6\x2b\x56\xe3\x61\x8c\x11\xdb\x8f\xf0\xbf\x49\x2a\xc6\x75\x97\xd2\xf9\x6a\x6f\x42\x0f\xf9\x85\x34\x1b\x78\x6a\xd6\xce\xae\xdd\x10\x5d\x0d\x15\x63\xb2\xd5\x35\x43\xd7\x8e\x72\x56\x72\x5d\x20\x4e\x82\xed\x3a\x2e\x6a\x6e\x83\xdf\x61\xfc\x28\x2a\x62\xca\x06\xe6\x21\x74\xb5\x5b\xef\x40\xa0\xbd\xf8\xd2\x3d\x1c\x33\x0c\x71\x44\x14\x85\xee\x85\xe7\x0c\xed\x12\x1e\xac\x60\x7f\x58\x06\x78\x16\x3e\x4b\xd7\x5c\x67\x09\xff\x3b\x41\xde\x80\x59\x4b\x9e\x2f\x2a\xa2\x78\xfe\xfc\x21\xd7\x3e\xe3\xf7\x28\x54\xb9\x58\xd9\xa8\xf6\x3e\x3d\x70\xf7\xfe\xad\x8c\x3d\xca\x8e\x71\xbf\x4b\x9c\x2a\x36\xf2\x12\xb3\x2e\xb3\x29\x2e\x63\x55\x80\x38\x65\x59\xee\x1a\x11\xdf\x15\x29\x3a\x0c\x21\xcd\x73\x60\x86\x98\x46\xba\x5b\x7b\xa8\x5c\x99\x4f\x5b\x2f\x9c\xc5\x0e\x5e\xea\x8e\x4b\x36\x91\xd8\x86\x06\x2a\x18\xcf\xb1\x82\xf1\xe8\xb6\x11\xfe\x1b\xc2\x63\x15\x9c\xb8\xa0\x86\x78\x7c\x81\x1b\xea\x48\x12\x53\x00\x08\xc7\x0c\xa0\xc4\x7e\x64\xeb\x2f\xba\xd5\xb0\x27\x27\xa6\x6f\x2c\xdd\x6d\xde\x86\xf5\xd2\xa9\x64\x5a\x1e\x9a\xa6\x6e\xe0\xe1\x5b\x97\xf5\xfd\x22\x95\x96\xee\x02\xe6\x61\xca\xb9\xa5\x4e\xee\x1b\x81\xf9\x8f\xe2\x56\xed\x6c\x54\xfe\xaa\xa0\xba\x04\x7e\xea\x35\x33\x44\xf6\xe5\xc6\x2b\xe1\xe9\xd5\xc0\x9a\x2a\x69\x94\x11\x11\x0c\x56\xd1\x94\x9e\x90\xc0\x7b\x19\x38\xba\x95\x55\xac\x1b\xe8\x51\x1b\x51\x02\x18\xd7\xcd\xe7\xe1\xd7\x4a\x68\xaf\xb6\x42\xf8\x17\x15\xfe\x9e\x6c\x96\xc5\x03\x81\xae\x5a\x9d\xf3\x06\x51\x87\x85\xdc\x4d\xbc\x3a\x64\xf6\x0f\x24\x5c\x56\x4b\x80\x29\x51\x2f\x38\x1b\x56\xee\x78\x77\x03\x42\x68\x03\xc8\x0a\xb1\xc3\x11\xf4\x77\xb8\x91\x70\x8b\x59\xfa\x74\x8f\x32\xde\xbf\x54\xd2\x41\x37\x71\x97\x8c\x26\x5c\x9b\x87\x11\x4a\xdf\x25\xb8\x33\x7a\xa9\x3b\x0e\x63\x2a\x5b\x6e\xda\x47\x4b\xec\x16\x32\x81\x59\xfb\xed\x06\x7b\x00\xb8\x7a\xdd\x61\x96\x54\x92\xec\xcc\x6f\xd3\x46\x1c\x10\x00\xe4\x03\x7a\xb1\xe8\xac\x89\xa8\x52\x4f\x78\xae\x09\xd3\x08\xea\x6c\x94\xff\x88\x37\x32\xb7\x12\xee\xc0\xef\x07\x71\x8d\x33\xc0\x11\xb9\x39\x8f\x8c\xfe\xa7\x33\x07\x5a\xf3\x31\xfb\x3f\x97\xcd\xc1\xe8\xc9\x9f\x6a\x10\x72\x5a\x68\xc5\xc5\x8f\xdd\x8b\x0b\xaa\x50\x22\x7f\x34\xd7\x3d\x23\x90\x52\x03\x69\x8e\xaf\xf6\x26\x65\x4c\xe8\x3d\x86\x51\x08\x49\x9b\xe6\x86\x1f\x61\x41\xbf\xa6\x21\x9d\x7a\xb8\xb5\x84\x51\x91\x99\xf8\x80\xcf\xa1\xb2\x6d\x91\x94\xd3\x01\x71\x1c\x30\xfb\x44\x6d\x6e\xa7\x64\xa4\x31\x0f\x70\xe4\xb8\x59\xcf\x95\xfd\x44\xaa\xf8\xc1\xe2\x40\xe8\x0a\x71\x61\x1d\xbc\xf5\x2d\xa5\x8e\xdc\x32\x03\x11\xde\x38\x8d\x5d\x9d\x76\x9e\xb5\x9b\xe0\x93"}, +{{0x15,0x9a,0x9e,0xdd,0xea,0x5d,0xe6,0x34,0x03,0x98,0x7b,0x56,0x70,0xdb,0x6f,0xac,0x98,0xff,0xe5,0xec,0x3a,0x6c,0xf0,0x15,0x16,0xee,0x2c,0x70,0xce,0x3b,0x3b,0xe0,},{0xf6,0x1f,0x4a,0x04,0xa5,0xa1,0x2c,0xca,0xec,0xfa,0xf4,0x4c,0x1c,0x9c,0x18,0x88,0x47,0x5a,0x2c,0x89,0xfb,0x02,0xf2,0x6b,0xb8,0x1a,0xb5,0xf7,0x8f,0x4c,0xe3,0xa8,},{0x05,0x43,0x71,0x2c,0xef,0xa2,0x9a,0x22,0x0d,0x90,0xf8,0x1b,0xaa,0x4e,0x4c,0xf7,0x7a,0xc6,0x52,0x08,0xb2,0xd5,0xce,0x9f,0xd1,0x7c,0xe2,0x14,0xad,0x4a,0x93,0x7b,0x7f,0xc5,0xc7,0x86,0x41,0x3b,0x58,0x05,0x1c,0xca,0x3b,0xb8,0xb2,0xeb,0x55,0x65,0x7d,0x89,0x57,0x2b,0xc5,0x0e,0xa2,0xe5,0xec,0xdc,0x55,0x50,0x88,0x49,0x16,0x03,},"\xd1\x95\xe5\x90\x0d\xd3\x93\x14\x81\xbc\x01\x2e\x77\xbf\x06\x0a\xaf\x31\xcc\xcb\x0f\xe1\xa6\xc4\x0e\xaf\x28\x6a\x61\x66\xa1\x66\xb1\xea\x37\x05\x34\x26\x28\x4b\x92\x0c\x67\xfe\xe1\xd4\xb9\xd8\x6f\xb8\x61\xcc\x6e\xdd\x34\xe1\x0c\x52\x23\x37\x34\xd9\xcd\x92\xf5\xdb\xf4\x33\x51\x2e\xd2\x55\xac\x6b\x26\xe5\x6f\x5c\x66\x4b\xcc\xb2\x60\x69\x2c\xf4\x9d\x08\x36\x3e\xe9\x4e\x33\x6a\xcc\x48\x96\x00\xa6\xaa\x51\x2a\x04\x0f\x10\xeb\xf1\x8f\x7d\x2c\xbe\xe9\xca\xd1\x4c\x4f\xf8\x73\x77\xa3\x26\x34\x19\xd8\x29\x75\x29\x40\x1f\x15\x33\x7a\x4c\x4d\x23\x25\xed\x7d\xef\x76\x3a\x0d\x47\x9c\xaa\x40\x82\x66\x83\x4d\xa2\x42\xf3\xa1\x6b\x79\xa4\x58\x66\xb9\xd9\xd7\x1a\x48\x29\x31\x76\x74\xcf\xf7\xae\x6c\x8c\x58\x7b\xa4\xd4\x98\x0e\x81\x86\x13\xd3\xad\x82\x50\x7a\x7a\xb0\x32\xbb\xf9\x9c\x5e\x9b\x64\x03\x71\xbb\x41\xb9\x1e\x96\x5d\xc3\x1e\x8c\x7d\x4b\x3b\xaf\xd4\x95\x70\x52\x7f\xaa\xa8\x7a\xbb\xf6\x41\x6c\x47\xb1\xb1\xb0\x9d\x34\x01\x25\x31\x26\xcb\x24\x6a\xe4\x5a\xcf\x5f\x10\x0b\xb1\xf9\x2f\x11\xa5\xc6\xc9\x37\xe0\x58\x8d\x8b\x14\x6b\x3e\x4d\x3c\x7e\x5b\xf5\x74\x84\xe9\x84\xfe\x3a\xfc\x47\x72\xf2\x4e\xbf\x89\x4c\xdb\x39\x83\x7f\xbd\x46\x9a\x92\x1a\x96\xac\x5a\xf5\xe0\x70\xf6\xc9\x62\x4c\x58\x8e\x9d\x4f\xe6\xdd\xfe\xed\x1f\x8f\xe2\x0e\xb9\xc4\x60\xce\x6e\xe3\x8b\xf4\x71\xdd\x56\xdc\xf2\xe3\xee\x99\x8b\x8e\x7f\xdc\xf6\x12\xe7\x8a\x2e\x7c\x71\x73\xc0\x16\x09\x82\xbe\xde\xcc\x2c\x62\x1e\x5f\x66\x11\xb4\xef\x21\x02\xe3\x2e\x7c\x29\x80\x3a\x7e\x25\xfe\xe1\x51\x24\x31\x58\xa7\x6e\xe5\xd8\xc1\xbb\x2e\x7d\x8c\x88\x87\x1b\xa4\x33\xc5\xe5\x41\xc2\x60\x26\x93\xd9\x01\x10\xbe\x79\x5b\x52\x3a\x8f\xad\xb6\x05\xd8\xe3\xd7\xe4\x93\xfe\x24\x5d\x9c\xc5\x32\x0d\x32\xb8\x5d\x61\x35\xa4\x4b\x11\x68\x72\x94\x14\xc2\xca\x21\x56\x0f\xb4\xfe\xec\xde\xef\x0c\xf7\xd8\xe0\x71\x27\x4e\x88\x56\xc0\x04\x03\x3e\x80\x01\x3c\x73\xaf\x71\x77\xc3\x19\x78\x16\xa5\x03\x2d\x90\x59\xb1\xb6\xe4\x15\x2c\x38\x61\x92\xdd\x54\xb9\x0f\x9d\x30\x8b\xe9\x8e\xd7\xd0\xca\x9d\x12\xe8\xaa\xf6\xf9\xd8\x69\x38\x6a\xa9\xdb\xb0\x15\x93\xd3\x7e\x72\xf0\x90\x12\x4d\x34\x55\x29\x8e\x9b\x4c\x9e\xc3\xca\xe7\x3b\xb8\xee\x41\xeb\x63\xe3\x8c\x56\x13\x3e\xfd\xba\xf4\x49\xb8\x4e\x1e\x49\x1e\x49\x6f\x1c\x70\xa4\x4d\x06\x99\x86\xba\x88\x18\x42\x20\x69\x06\x1b\xb6\xeb\xcb\x7b\x20\x54\xe6\x3d\xf3\x81\xba\x03\xc6\xa7\x67\x4a\xbd\x61\x05\x0d\x69\x3d\x41\xbf\xe3\xca\x50\x46\xc6\x5f\xfb\x06\xa0\x74\x98\x09\xe5\x8d\x4c\x93\xa9\xff\x69\xed\x30\x95\x0b\xde\x1f\x99\x21\x6f\xff\x29\x9f\x22\xf1\x6b\x07\xc2\x54\xc2\x65\xae\x0b\x12\xe3\x13\x16\x3c\xcd\xf5\x03\x6d\x49\x05\x5f\x9a\x96\x67\xb0\xb7\x12\x92\xbc\x3b\x62\x60\xcb\x87\x56\x8f\xd2\x67\x17\x0b\xc9\x40\xc3\x33\x29\xd7\x29\xc9\xe3\x2d\x0f\x91\x80\xb1\x34\xbf\xf8\xae\x93\xb1\xbf\xeb\xfa\x38\x42\xfe\xf2\x0b\xc0\x4a\x29\x7b\x00\xa8\x4a\x0f\x42\x8d\x5f\x42\xfa\xb8\x61\x42\x99\x6d\x4a\xd9\xef\xab\xc4\x98\x52\xf8\x81\x2f\x3b\xfb\x5e\x57\x53\x9e\x21\x86\xeb\x8a\xe2\x29\x58\x0b\xc6\x04\x48\xac\xde\xf5\x72\x3c\x88\x15\x88\xb5\x37\x89\xf0\x5b\x91\xe0\x22\x89\x22\x32\x52\xd7\x53\xf7\x98\x13\x77\x9a\xce\x70\x5e\x04\xae\xd1\x52\x65\xd3\xbd\xf2\xa2\xe4\xb1\x56\x54\x77\x0a\x27\x58\x54\xe6\x4c\xf4\x43\x90\x60\x7a\x45\xd7\xbb\xa9\xaf\x3e\x1a\x2e\x28\x30\x67\xfc\xd6\xe6\x33\xaa\x2d\x24\x03\xbd\x81\xf7\xc7\x92\x76\x55\x10\xb5\x98\x41\x2f\x6b\xda\x07\xb2\xa9\x45\xb9\xf6\xd4\x6a\xb2\xf7\xc3\x20\x07\x5b\xc6\xb6\x0a\x80\xda\xa4\x4a\xf3\x91\xf4\xcd\x56\x21\x31\xbb\xdd\x40\x7d\x66\xf8\xdb\x12\x59\xbd\x76\xfa\x7e\x4d\x52\x64\xe1\x45\x54\x6c\x94\x2d\xfe\x90\x07"}, +{{0xed,0xa0,0xfe,0xac,0x0f,0x2a,0xfe,0x01,0x74,0x49,0x15,0x52,0x48,0x7f,0x39,0x62,0x17,0x13,0x32,0xb8,0x22,0xdc,0x3d,0xa4,0x26,0xf9,0xa5,0xf6,0x2b,0xef,0x7b,0x8d,},{0xef,0xf2,0x7c,0xb5,0x1f,0x4d,0x39,0xc2,0x42,0xf3,0x23,0x01,0x9a,0x12,0x34,0x81,0x8e,0xf2,0xe4,0xcd,0x1b,0xda,0xbc,0x0f,0x2d,0x8d,0x21,0x34,0x58,0xdc,0x47,0x1a,},{0x6c,0xbc,0x7e,0x6f,0x5e,0x12,0x14,0x5b,0x01,0x68,0x7a,0xd9,0xca,0x6b,0xf6,0xe4,0x7f,0x94,0x17,0xc2,0xce,0xfa,0xd3,0xfb,0xd6,0x8f,0xd6,0x5d,0xd7,0x4f,0xaa,0x97,0x50,0xcb,0xa9,0x92,0xde,0x4c,0xeb,0xcf,0xcd,0x35,0x80,0x8c,0xbb,0x3f,0xf1,0x2c,0x8d,0x93,0x07,0x99,0xaf,0x36,0xef,0xe7,0x97,0x6b,0xf2,0xfe,0xa7,0x9e,0x3e,0x0e,},"\x90\x11\x19\xda\x4e\xd1\x81\xaa\x9e\x11\x17\x0b\x20\x62\x6e\x00\xab\xf0\xb5\x48\x24\x5e\x3d\xeb\xf9\x4b\xf5\xed\x50\xae\xef\xe9\x42\xb4\x02\xcc\x99\x48\x94\x78\x52\xde\xdf\x2b\x53\x04\x01\x76\x65\x74\x9c\xd4\x7c\x21\xfc\x65\x2e\xe9\x95\x67\x9f\xf9\x31\xe3\x0e\x94\xaf\x98\xb4\xa9\x8f\xd4\x4e\x84\x9e\x98\x47\x0f\xe0\xa7\x6c\xe8\x0c\x61\xf8\x3f\xb4\xe8\x5b\xa5\x23\xee\x3f\xd2\x5d\xb0\x00\x05\x3b\x49\xd0\x93\x0e\x3b\x07\x9e\x86\x6e\x15\x3f\x7d\x86\x36\x7f\x23\xa4\xc4\xab\xc6\x3b\x30\x75\x46\x1e\x90\xe4\xfd\x89\x6d\xa0\x49\x2e\x27\xd7\x14\x94\x1e\x96\x7f\x52\xc9\x3f\xfa\xec\x44\x80\x3f\x57\x87\x7d\x86\x6e\xb5\xf8\xc5\x28\x17\x85\xaa\x48\x26\x79\x2e\x39\x64\xc6\x65\x90\x82\x1e\xea\x66\x75\x20\x74\x26\x40\x18\xa5\x71\xf5\xb0\x13\xb3\x8e\x15\x2c\x95\xc0\x24\x8a\xe6\x03\x68\x22\xa6\x7a\xfc\x9e\x02\x69\x45\x73\x15\x2b\x86\x4c\x56\xc2\xf7\x30\xa0\x82\x10\xf8\x5e\xc4\x6f\x98\x4a\x64\x3d\x51\x6a\x15\xfc\xfa\xa8\x48\x40\xf5\x12\x04\x7d\x11\x0e\x07\x18\xd2\x93\x95\x5f\x01\x58\x25\x7f\xba\x0d\x78\xeb\x7d\xf2\xf0\xb7\x7e\x6e\xeb\x76\xdb\x5e\x71\x70\x73\x10\xe8\x27\x36\x1c\xd4\xe1\x19\x74\x0e\x63\x92\x2d\xb4\x2c\x2c\xeb\x5e\xe1\x75\xd5\x0d\xec\xc7\xb7\x49\xfd\x23\x25\xbc\xe1\xe6\xa8\xf7\x10\xff\xcc\x1e\x1c\x9b\x33\xc3\x80\xe5\x2a\x64\xda\xa9\x58\x5f\xab\xe4\x06\xd9\xcf\x24\x48\x8f\xe2\x6f\x3a\x49\x5f\xb0\xab\x50\xe1\xe2\xba\xd8\x23\x81\xaa\x22\x43\x10\x99\xcc\x8a\x56\x98\x13\xd7\x9c\x9d\x78\x56\x9c\x0d\x95\xda\x9a\xad\x2b\xfb\x57\x75\x8d\x52\xa3\x75\x27\x52\xe0\x23\xd6\x51\xc9\xcb\x66\xa4\x12\xa5\xc8\x0f\x6b\xa5\x47\x93\xf7\xec\x87\xb4\xc5\x98\xfe\xd2\xce\x24\xab\xd7\x60\x87\x08\x89\x5c\x46\x72\x73\x59\xff\xec\xa6\xd6\xc6\x2e\x10\xa6\x78\xca\xa7\x18\xb4\xcd\x26\x32\x92\xcf\xef\x53\x5b\x9f\xbe\x27\x56\xb7\x39\x6d\x69\x7b\x31\x46\xc5\x51\xe6\xaa\xc1\xf5\xf1\xc2\x4b\xe9\xb6\x7a\x1e\x2a\x2a\xff\x74\x53\x01\xba\x6a\x21\x22\x17\xc5\x3d\x68\x16\x81\xbb\xb4\x01\xbf\x4a\x43\x65\x6f\x5d\x15\xcd\xe9\x69\xc1\x78\x00\x99\xa3\x32\x37\xeb\x19\xa3\xb8\x58\x5d\x6b\x5d\xea\x2f\xb5\x77\x84\x5f\x25\xee\x2a\x82\xcc\xf4\xb2\x85\x02\xf9\x0f\xe8\x0b\x8c\xdc\xdf\x2c\xcf\x93\xc4\x34\xc0\xe6\xaa\x5d\x87\x52\xa4\x43\x43\xc2\xb1\x8d\x20\xfe\x40\x04\xc4\x70\x38\x65\x93\x56\xf8\x7a\xbe\xd5\x44\x50\x34\xd8\xe2\xd3\xd1\x47\x68\xf5\xef\x31\x2c\xf1\x02\xa9\x88\x46\x83\xbc\xc0\xcd\x8a\x71\xe3\xec\x36\xfb\xb6\x33\x4a\x1b\xba\xed\x5d\x2b\xf1\x04\x16\xd8\x2b\xd6\x53\x04\x75\x38\x0a\xb6\xe2\x57\x7b\xbc\x69\xce\xbd\xa7\x5f\xaf\x02\xad\x82\x7b\x54\x51\x82\x13\x20\x6f\xd4\xcd\x66\xf2\x52\xb2\x34\xac\xa9\xee\xde\x7e\x3e\xeb\x81\x5d\xdc\xd8\xd5\x19\xc5\xd7\xf5\xd9\xd1\xfb\x9c\xa0\xfa\x44\x67\x99\x00\x95\xfa\x46\x22\x0c\x20\xa2\x07\x1d\xfc\xaa\xd5\xf0\x24\xda\xe3\x41\x6f\x7c\x49\x2d\x75\x74\x88\xc4\x9a\x2e\x4d\xf4\x83\xbc\x9b\x80\x09\x8e\x0d\x5d\x68\x3f\xac\xb8\xc9\x60\x82\x9d\xff\x09\xb3\x03\x36\x9d\x46\xcb\x57\x33\x1f\xf2\x17\x91\xee\x25\xd6\xbe\x7d\xec\x7e\xba\xf1\xb3\x24\x79\xa7\xf5\x14\xdc\x64\x71\x05\xc9\x44\xc3\x6f\x7d\xbf\x0a\x5b\x58\x91\x28\xdb\xaa\xa4\x21\x71\xd6\x42\xf2\x5a\x98\x1c\xe1\xf8\x37\x9f\x91\x69\x0b\x36\xaf\x77\x46\x48\xd5\x62\x4c\x08\xdb\xd0\xa9\x0f\x70\x87\x16\xdf\xab\x20\x24\xda\xe8\x65\xb9\xc4\x9a\xb2\x74\x73\x82\x6c\xd4\xa0\x10\xbf\xdb\x52\x01\x1d\x8c\x7c\xb3\xf4\x21\xca\x8c\xa3\xcd\x04\x86\x88\x91\x88\xe6\x7d\xf0\x0f\xb8\xc2\xa6\x43\xe7\xad\xb2\xf8\x27\x9f\x76\x3e\x5b\x9a\x81\xb6\xdf\xc3\xf7\x21\xfc\x5f\x68\x49\xf6\x67\x36\x78\x8c\xc5\x57\xc4\xeb\xc6\xfc\x68\xd6\xf6\xac\x77\xbe\xdd\xa8\xac\xb3\x62\x24\x3b\xda\x74\xe7\xb2"}, +{{0xec,0x05,0x9f,0xc6,0xbe,0x98,0x3c,0x27,0xec,0xa9,0x3d,0xdc,0xdc,0xb5,0x3a,0xf7,0x28,0x62,0x55,0xda,0x91,0xe2,0xa5,0x6a,0x68,0x4f,0x64,0x1e,0xc2,0xd0,0x9d,0x6e,},{0xff,0xc6,0xcb,0x75,0x1c,0x70,0x07,0x1b,0x65,0xec,0x2a,0xc6,0xb4,0x5f,0xd1,0xd5,0x5f,0xe8,0x36,0x96,0x5f,0x80,0xb3,0xe7,0xc7,0x84,0xfc,0x70,0x4a,0xcb,0xdf,0x69,},{0xa7,0xb8,0x8e,0x5a,0xbf,0x13,0x28,0x24,0xbd,0xde,0x77,0xc5,0xf8,0xdf,0x94,0xab,0x26,0x48,0x1f,0x6b,0xee,0x66,0x0e,0xa1,0x62,0x24,0x70,0x82,0xa2,0x50,0xd3,0x90,0xc7,0x1d,0x32,0x0a,0xd0,0x60,0xd8,0xef,0x34,0x1f,0xb6,0x9a,0x48,0x32,0x94,0xf0,0xd6,0xde,0x72,0x6f,0x0c,0x86,0x2f,0xa3,0x7e,0xa4,0xbc,0x6d,0xab,0x52,0x15,0x09,},"\xd1\xac\x63\x25\xa4\xe6\x90\xfa\x79\x53\x68\x83\xd5\xc2\x0e\xac\xb7\xd9\x64\xc0\x17\x8f\x74\x2c\x2b\x23\x72\x7d\xeb\x62\x64\x5a\xf7\xc8\x19\x22\xa0\xe7\x2e\x5e\x30\xb5\x83\x9a\x2e\xd5\xe5\x67\xec\x31\xce\x22\x41\x15\xb8\x2d\x2b\xf2\x51\xb7\x39\x3f\x01\xb0\xd0\x3a\x60\x2b\xc1\x20\xae\x62\xaf\x7f\xbc\x37\x9d\xfc\xf9\x5b\xbb\xba\x98\x4a\xab\xa3\x4f\xe2\x12\xac\x99\x00\x33\x28\xb8\x32\xc3\x53\x2d\x42\xee\xe1\xe1\x87\x4d\xc2\x2a\xd6\x7d\xb6\xc9\x1d\xbb\xfb\x2b\x45\x78\x5d\xbc\xd3\x99\x17\xd3\x6f\xb4\x8c\x1b\x5d\x6f\x38\xbd\xda\x5d\x28\xfb\xba\x64\x17\x55\x75\xaf\xea\x46\xc8\xed\x67\x57\xff\x30\x16\x4e\x0d\xf2\xe7\x21\x76\xe8\xb6\xc9\xdb\x5b\x5e\xf3\x90\xb7\x2f\x2d\x4d\x94\xe3\xb6\x6f\x0d\x44\xa7\xe0\xf0\x6e\x89\xde\xbc\xdf\x13\x63\xc0\xe7\x5d\x50\xdb\x5b\xb7\x01\x90\xd1\x9f\x66\xa3\x9c\x6f\x7d\xba\x70\xdf\xcd\x4a\x9f\xed\x02\xc2\xf1\xd0\x67\xe7\xc7\x88\xc5\x8f\xdb\x3e\x17\xa2\x37\x7c\xe4\x86\xec\x65\x82\xf3\xba\x99\x7b\xb5\xf7\x0c\xd6\x21\x00\x29\x56\xf5\x13\x1a\xa3\xa1\x61\x7c\x0c\xeb\xcc\xd9\x39\x1d\xe1\x30\x7c\x85\x97\x0a\x8b\xc1\x55\xf5\x19\x87\x26\x68\x45\x0c\x91\x48\x86\x89\xf5\x3c\x2c\x1a\x7e\xd5\x3f\x38\x8c\xb1\x3a\x2c\x38\x96\xfe\x5b\x7d\x3a\x0d\xc1\x68\x3f\x27\x66\x4c\x8b\xea\xea\x68\x0c\x8c\xc5\x4a\x90\xe4\xc6\xf9\x9f\xbf\x05\xf2\xc2\x2d\xf6\x0d\xe9\xae\xc8\x0c\x79\xb7\xd6\x62\x07\x05\x06\x67\xb4\x52\xd7\x85\x7f\x9a\x8c\xa7\x23\x28\x0d\xac\x79\x92\xe2\x07\x92\x67\xec\x3a\xd9\x11\x40\x46\x42\xc4\xe3\x26\xbf\xb9\x6b\x43\xc8\x94\x34\xba\x4b\xc7\x8c\x25\x2f\x4d\x4c\xa8\xd1\x3a\x88\x74\xc6\xfc\x82\x52\xea\x0b\x56\xc6\xbc\x78\x68\x47\xd4\x31\x83\x06\xe1\xc6\x52\xc4\x52\x58\x5e\xef\xd0\xbd\x9d\xd3\xc1\x48\xa7\x3b\xa8\x6e\xed\xea\x94\x5f\x01\x67\x13\xed\x7d\xf0\x85\xd0\x06\x66\x89\xe7\x92\xda\xcb\x2b\xfc\x1e\xb5\xc8\x24\x37\x2a\x26\xc5\xe9\x44\xaa\x74\x44\xac\x97\x73\xd4\xa1\x92\x1e\x49\xbd\xd4\xf8\xf6\xd7\x88\xc2\x63\xfe\xe0\x4c\x7b\x44\x4c\x53\x05\xed\xb6\x33\xe1\xff\xe0\xba\x4e\xa8\xda\x01\x1a\x62\xf2\xbb\xfe\xf4\xb8\x95\xad\x3f\x22\x4c\x3b\xa3\xbf\xf0\xc9\x5d\x75\x75\x0c\x9b\xcc\x66\xff\x8a\x20\xb6\xc2\x4b\xde\x75\x81\xa7\xec\x38\x66\xf8\x71\x6f\x78\x1f\x46\xdc\xad\x45\xa9\xeb\xcb\x6e\xd4\x69\x53\x36\x83\x97\x01\x17\x35\xd4\xb5\x2d\x00\xe8\xdb\x39\x79\x95\xdb\xdb\x3d\x4f\x42\x54\x68\x7f\x04\x68\x8a\x26\x8c\x30\x5b\x2b\x1f\x62\x2c\xf5\x1b\x17\x47\x75\xba\xd7\xf6\x67\x4a\xdc\x2e\x58\xe0\x5c\xce\x86\x5f\x12\xd7\x56\x9c\x8e\x9b\x35\xbc\xdf\x3c\xcc\xe6\x33\x0d\x08\xce\x53\x40\xa7\xc6\x30\xf2\x7a\x6c\x80\x86\xb5\x14\x6b\x29\x2f\xcb\xf5\x0f\xf6\xaa\xae\xf8\x84\x8a\x70\x7b\x25\x43\xc6\x18\xd1\x7b\xd9\x76\xc2\x40\xbc\x79\xd3\x3e\x00\x4e\x49\x53\x48\x29\x15\xe7\xe6\xef\x94\x96\x4b\xde\xa4\xe0\x2d\xd7\xc2\xf4\x75\x23\x5f\x2b\x99\xe4\x32\x29\xc9\xac\x3a\xba\x0d\xb5\x9a\xc2\xda\x03\xa9\xee\x4f\x37\xdb\xf2\x47\xa3\x3e\x6d\xfe\x5b\xe7\xc7\xf8\x25\x84\xf0\x4a\x46\xd4\x9f\x66\x21\xda\x31\xb9\x1a\xc3\xda\xa4\xd6\x8d\x48\xa5\x66\x59\xb4\x48\xc0\xed\x36\x5c\xb4\xaa\x0c\xfd\x90\x88\x53\xdf\x5b\xbf\xa8\x8e\x60\xe1\x0a\x5a\x00\x2c\x32\xab\x33\x33\xf2\xc3\x9b\xbf\x3e\xe0\x1a\x4a\xa6\x0d\x2d\x01\x42\x3e\x60\x97\xdc\x54\x30\x5f\x81\xa2\xd9\x3e\x2f\x6b\x4e\x8b\x35\x19\x71\xcb\xf2\x45\x7d\xc7\x6e\x1f\xb8\x92\x93\x38\x47\x98\xef\x28\x23\x4e\x9b\x1a\x47\xde\xdc\x23\x36\xf8\x6b\x8e\x13\xc4\xae\xf7\x90\xf5\xa1\x12\x39\xc7\x47\xd9\xd8\x65\xc9\xa1\x5a\xde\xb0\x71\x07\x02\x67\xe5\x34\x62\x56\x64\x8a\xdc\x0f\xa4\xdb\xdf\xd7\x87\xca\x14\x65\xfc\x24\x0a\x32\x4c\x3c\xaf\x29\x31\xda\x41\x49\x9e\x27\x5f\xd4\xb3\x5f\x6d\x08\xdb"}, +{{0xf1,0x6a,0xbd,0xbc,0xc0,0xbc,0xc6,0x1a,0x1a,0xee,0x3a,0xbd,0x87,0x67,0xab,0x52,0xe5,0xf7,0x99,0x99,0xbb,0x77,0xa3,0x97,0x6c,0xbc,0x82,0x67,0x0d,0xfd,0x2f,0x73,},{0x10,0xf4,0x51,0x71,0x9d,0xb0,0xfd,0x21,0x37,0x6e,0x22,0x8a,0x41,0xc3,0x03,0x5c,0x8c,0x2b,0xc4,0x2e,0x5a,0xaa,0x92,0x6f,0xe6,0x08,0x87,0x8d,0xbb,0x0d,0xc7,0xab,},{0x33,0xd8,0x05,0x29,0x08,0x69,0xb8,0xe0,0x4f,0xf0,0x89,0xfa,0xa2,0xd1,0xfa,0xb8,0x37,0x43,0xba,0xda,0x68,0xad,0xe5,0xb3,0x8a,0xe5,0xf0,0xcc,0x58,0xc3,0x37,0x4e,0xba,0x43,0x94,0x3c,0x1f,0x51,0x10,0x67,0x8e,0xb3,0x9b,0x46,0x58,0x61,0x18,0x22,0xa2,0x6d,0x35,0xff,0xe1,0x9e,0x9c,0xfc,0xb9,0xba,0x95,0x89,0xe4,0xec,0x31,0x05,},"\xbf\xac\xd7\xdd\x4e\xea\x46\x7d\xcc\xe4\x04\xf4\xa3\x52\x0a\x45\xb9\x4e\xba\xa6\x22\x19\x7d\x02\xd6\x15\x29\xd2\xb3\xbf\x27\x3c\x4e\xe1\xfb\x95\xa1\x80\xc8\xf8\x7d\xe1\x90\xa2\xe5\xea\x70\xb8\x4a\xe1\xeb\x6f\xd4\x44\x7d\x8a\x3a\x8d\xed\x10\xf6\xed\xe2\x4f\x0e\xb9\x2b\xd3\x0b\xc6\x5d\x48\x71\xe8\xf5\xda\x08\xcb\xe8\xcd\x3c\x0a\xc6\x4f\xd5\xa5\x7a\x6b\x06\x4a\x89\xd5\x15\x9b\x42\xf8\xb3\xe5\xa1\x83\x8c\x9c\xb1\x9d\x88\x10\x6c\x07\x73\xa2\x75\xcd\x2a\x1d\x60\x99\x30\xbf\x6b\x30\xae\xca\x62\xb9\x7e\x31\x9b\xbf\xa9\x34\xf4\xd0\xa1\xe6\xac\x80\xba\xeb\xcb\xa2\xd8\xea\x4b\xed\x9c\xa8\x56\x2b\x4a\xcb\x56\x97\x9b\xf8\x85\x32\x4a\xc4\x0a\xb4\xa5\x0b\xfb\x9f\x34\x90\x49\xfc\x75\xa0\xe0\x3d\xe4\xcc\x43\xea\xe3\xc6\xa6\xcf\xfb\x5f\x6a\xe6\xc9\x45\x04\x41\x5e\x6c\x7e\xd3\x04\x5a\x93\x2f\x47\xfd\x20\xb9\xf3\x48\x3a\x77\xb6\xd4\x49\xd8\xdf\xd4\xa6\x38\xdb\xf5\x6f\x03\xf0\xf0\x31\x87\x90\x59\xb2\xfb\x49\x76\x79\x43\xf4\x6b\x38\x72\xe2\xde\x56\x7d\x5f\xef\x80\xb0\x29\x25\xe9\x86\x3e\x0f\x1d\x31\xa8\x0f\x4e\x64\x51\xc3\x25\x69\x4b\x80\xcf\x1f\x19\x18\xc6\xe4\x98\x87\x8e\xdc\x47\xc4\x53\x0c\xac\x46\x6f\x1a\x29\x4d\x55\xdf\x09\xaf\x4f\xdc\x80\x72\xad\xb1\xbf\x26\xca\x8c\x92\xf9\x12\xa2\xb9\xfe\xbc\x8b\x97\xb5\x8c\x1e\x9d\x32\xc7\x80\x32\x30\x52\x97\x2b\x6f\xbd\x53\x30\x4c\x05\x19\x3c\xae\xb6\x7c\x5b\xd3\xe6\x74\x79\x72\x5d\x29\x7d\xff\xb0\x68\x90\xab\xf8\xcd\x9e\x42\x45\x8e\x16\x8a\x61\x18\xf9\x05\xb1\xd5\x34\x86\x01\x6f\x85\xdc\xd9\x8d\xd3\x39\xe3\x46\x05\x33\xd0\xb8\xa4\x9f\xae\x6d\xc1\xa0\x71\x72\x5e\x6a\xe5\xf2\x94\x47\x9e\xe3\xbd\xca\xeb\x74\x06\x18\x41\xfb\x26\x08\xe8\x8a\x49\xfd\x0f\x38\x95\xb1\x8f\x85\xb9\x0f\x72\x41\xdd\x13\x87\x71\x00\x53\xfa\xa6\x2b\xae\x75\xe9\xae\x39\x36\x9c\x1c\x02\xde\x5d\x19\x24\x2e\xfa\x16\xe1\x1d\x44\xa4\xba\x57\x78\xce\x77\x22\xa9\x1c\xec\x0b\xc0\xa0\x8c\x06\x9b\xdf\xa1\x30\xd1\xc6\xc4\xb5\x6c\x6e\x93\x54\x24\x03\xcc\xf2\x76\x84\xde\xf5\x7d\xef\x26\xdf\x86\xce\xd5\x71\x28\x2d\xc9\x60\x97\x46\x18\xf0\xa7\x4a\x0c\xde\x35\xb6\x53\xcc\x6e\x77\x30\x43\x1b\x82\x5f\xfb\x9b\x8a\xaa\xb3\xc7\xa3\x97\xc9\x92\xbc\x2f\xa2\x32\x70\xfb\x11\xee\x43\x1a\xfd\x5f\x9a\x64\x44\x83\x01\x11\x73\x99\x3f\x19\x48\x5d\xd3\xcb\xdd\x18\x7b\xd3\xd9\x95\xeb\xf0\x03\x1b\x1b\x0d\xe4\xa8\xde\x9c\x14\xeb\x6f\x78\x0e\x36\xb8\x92\x57\x56\xb9\x79\x06\xa1\x96\x9d\x85\xe9\x67\xd8\x80\xe6\xe7\xdd\xa4\x2f\xd3\xc3\x00\x19\xf1\x1d\x70\x81\x07\x1e\xee\x66\x26\x42\x28\x36\xbb\xed\x27\xd4\x6d\xd0\xdf\x1f\xeb\x66\x10\xdc\x85\x9f\x51\x3c\x0b\xc6\x53\xd7\x02\x20\xfe\x04\x8d\x2e\x97\xc2\xe0\x6a\xf5\x30\xe1\x1b\xdc\x70\x29\xbc\xcc\x5c\x92\xed\xec\xef\x5e\x4a\x2e\x0b\xe2\xd2\x51\xf4\x41\x5d\xca\x3e\x55\xb3\xa8\x50\xf2\x63\x0b\x87\x9e\x4e\x03\x6c\xe8\x63\x3b\xf2\x09\x20\xb6\x80\x94\x21\x59\x29\xac\xcc\x7b\xe4\x0c\x57\x78\xbc\x55\x4e\x6e\xdd\x7e\x54\xc9\xe1\x45\xb2\xee\x07\xb6\x5d\x06\x1c\x11\xde\x0e\x83\xf3\x81\xce\x4f\x57\xc6\x48\x3f\x51\x06\x93\x63\x51\x10\x74\xc7\xa5\x77\x35\x3b\x45\xc6\xeb\x71\x19\x9d\xce\x50\x59\xfd\x2c\x46\x11\xb0\x54\x23\x8a\xaa\xdf\x2b\x6b\xa5\x34\xbf\xff\xc2\x72\x2a\xe3\xe3\x1f\xf7\x9a\xe2\xeb\xca\x99\xcc\x35\x07\xf8\xa0\x33\xcf\x4f\xea\x70\xc5\x2f\x7d\xb5\xde\x44\x2b\x42\xb8\xd4\x1e\x99\x01\x2e\x42\xca\x0e\x85\xa9\xfb\x6d\x4f\x16\x5b\x33\x0d\xe6\x38\x3c\x57\x26\xef\xca\x2f\xe9\x71\x34\x00\x02\xf5\x62\xdc\x6c\xb8\xf2\xfa\xf0\x66\x57\x25\xe0\x97\x79\x9d\x09\x60\x91\x86\x4d\x66\xa9\x50\xa5\x79\x09\x53\xee\x16\xb9\xea\x58\x20\x09\x21\x87\x08\xc4\xac\xcd\x81\x38\x13\x58\xa2\xc6\x89\xa0\x41\xd0\x2d\x78\x61\x21"}, +{{0xbe,0x79,0xd1,0xae,0xea,0x86,0xe8,0x6f,0x39,0x81,0x37,0xe6,0x2f,0xfd,0x79,0xe5,0x0e,0xff,0x9f,0x31,0x3f,0x25,0x19,0x2f,0x89,0xe5,0x2f,0x0b,0x4b,0xbd,0x5d,0x32,},{0x18,0x7d,0xac,0x85,0x5c,0xa4,0x42,0xfd,0x9a,0x3d,0xdc,0x32,0x89,0xc2,0x4e,0xb2,0xd2,0x6f,0x7a,0x40,0xfb,0x29,0xd8,0xe7,0x44,0x31,0xb2,0x50,0x22,0xc3,0xa0,0xcc,},{0x6d,0xab,0x59,0x3b,0xb1,0xd4,0x48,0xc9,0x74,0xa6,0x5c,0x6a,0x0b,0x6f,0xad,0x22,0xb4,0x73,0x26,0x32,0xd0,0x04,0x89,0x17,0x6e,0xf1,0x26,0xaa,0x59,0x01,0x09,0xe0,0xa7,0x23,0xa1,0x13,0x10,0x7b,0x53,0xe1,0x7d,0x69,0x0a,0x0d,0x40,0xb0,0xfa,0x33,0x6c,0xc8,0x7f,0xd5,0xfc,0xe8,0xf5,0x41,0xac,0xce,0xc6,0x7f,0x7d,0x1e,0xbc,0x06,},"\x6d\x63\x2a\x7d\x3c\x9b\xe5\x36\x49\xd0\xd1\xa5\xee\xdf\x51\x9a\x41\x3b\x13\xac\x64\xe9\xad\x85\x4d\xfa\x04\xf2\xe1\x73\x29\xd8\x22\xbe\x57\x3d\x9e\x35\xac\x06\x6f\x02\x22\x13\xa3\x44\x62\x0b\xba\x28\x9f\x53\x31\x69\x55\x84\xd1\x34\x3e\x81\x54\x05\xae\xab\xe3\x86\x1d\x63\xb3\xa5\xb9\x2b\x8c\xd8\xee\xed\x22\x80\x22\x2a\xbd\xe3\x0a\x1b\xcc\xd3\xf3\xe4\x11\xaa\xb9\x22\xfa\x1b\xaa\x09\x7a\xa5\xc7\x80\xd0\xea\xef\x94\xea\x10\xfe\x21\xf7\xd6\x39\xb7\x6d\x47\x88\xae\xb5\x92\x4a\x9d\x26\x2d\xcb\xc5\x68\x8a\x3e\x43\x54\x4b\xec\x08\x8c\xa2\xe0\xd0\x6d\x77\xa7\x1f\xb6\x41\xd5\x52\x26\x61\x44\x52\xb1\xe0\x80\x7a\x9f\xcd\x3c\xa6\x9b\xf7\xf2\x5d\x80\x41\x47\x0c\xeb\x7b\x21\xea\xd0\x3e\xc0\x37\xa1\x62\x9b\xd5\x00\xaa\x23\x3b\x59\xbe\x44\x97\x82\x10\xb6\xa3\x66\xf2\x23\xac\xfa\x07\x97\x95\x40\x07\xb0\x0e\xfb\x4f\xfa\xdb\x5f\xc9\x2b\xdb\x37\x86\x3e\x50\x2d\x7d\x70\x68\x10\x39\xed\xf3\x37\x70\xdf\x3d\x1d\xe3\x43\xdc\x35\xf2\x26\xd5\xe7\x39\x44\xba\x02\x55\xe2\xa8\x8e\xf6\xc4\x1e\x47\x2b\x21\x45\x67\xc2\x49\x59\x4a\x50\x87\x8b\x67\x31\xc1\xae\xb5\xb1\x0f\xa9\x1f\xa7\x6a\x37\xe1\xf9\xf1\xc0\x0f\xdb\xfe\x34\x85\xde\xd5\x4a\x00\x9a\xb6\x13\x39\x27\x11\x56\x68\xb5\x9f\x51\x15\x50\x8d\xa9\x37\x0f\x6b\xc9\x2a\x11\x85\xc0\xd5\xca\x01\xd2\x91\xe1\x8c\x54\xac\xfa\xca\x73\x8b\xd7\x19\x68\xa3\x42\xa0\xcb\xa6\x2e\x4b\xb1\x04\xa5\xbb\x37\x9f\xc8\x3e\xe1\x82\x0d\x1d\xb9\x80\x25\x3d\x6c\xb3\x83\xe9\x5a\xf1\x5f\x53\xc8\x5d\x17\x58\x90\xdd\xe5\xe4\xed\x03\xd2\xd0\x13\x5e\x3d\x60\xb1\x82\x93\xf5\xb5\x64\x1e\xf8\x3c\x6e\xce\x3d\x52\x59\x8f\xc6\x35\x36\x86\xe6\xf7\xb0\x9f\xde\xc1\xf6\xf1\x53\x67\x2d\x34\xb4\x89\xb4\x8a\x0d\xb9\xe4\x2c\xed\xa7\x17\x55\x48\x1c\x04\x70\x16\xc2\x25\x34\xe9\x0c\x6d\x20\x1e\xd7\x85\x96\x02\x63\x6e\xa7\x7a\xe8\xc6\x73\x4b\x7c\x4c\x5b\xd9\x95\x79\xc5\x08\x73\x1c\x72\x46\xa2\x95\x86\xe4\x06\xe1\xd9\x32\xf6\x71\x30\x71\xd4\xbe\xa6\x3d\xc5\xe2\xa3\x76\x1e\x16\x02\x4d\x2c\x32\x84\xf7\x09\xa1\xf2\xba\x08\x5e\xad\x32\x00\xc7\x04\x62\x75\xcb\x96\xb6\x1a\x60\xb5\xac\x55\x9b\xc4\x88\xbd\x10\x64\x67\xc3\xde\x50\xbf\x5d\x74\x0d\x05\xc9\xcd\x70\x1d\x65\xb7\xda\xea\x29\xe6\x4d\xd5\xa9\x7a\xdb\x6b\x5c\x82\xcf\x7f\x23\x01\x7a\xa7\xca\x1a\xc9\xa3\x9e\x58\x27\xeb\x47\xe2\x0d\x35\x9b\x67\xc7\xd4\xe1\xa8\xe3\xe2\x7c\x52\xd3\x3d\x93\x03\xa5\x92\x62\x34\x84\xd7\x97\xb4\x02\xcb\xb4\x58\xd1\xac\x2e\xa5\x3e\x1c\x4f\x7a\xbb\x70\xcc\x02\x95\x54\xa2\x34\x57\x4d\xef\x9b\xc3\xb0\xd3\x83\x5d\xc3\x14\x90\x2e\x25\xab\xb2\x2d\xfd\xed\xdc\x67\x9a\x3c\xc8\xf0\x73\x40\xb1\x5f\x57\x62\xf4\x40\x7f\x38\x03\x42\x55\x4e\xd0\xc6\x2f\x73\xb6\x18\x16\xea\x8c\x52\x94\x61\xe1\xbf\x0e\x9d\x1c\x2d\x5e\x4c\x57\x46\x33\x6b\xc0\xe1\x32\x87\x3c\xde\x0d\xc2\x15\x8b\x54\xfa\x1b\x67\x8a\x00\x6b\x4d\x95\xed\xa8\xa9\x55\x71\x42\x73\xb7\xcc\x5c\xf2\xad\xd9\x09\x4d\x46\xe4\x9a\xbc\x09\x6a\x45\xf4\x18\xe2\xed\xbe\x99\xdd\x85\x29\x11\x68\x80\x64\xdf\x7c\xf0\x61\xd0\x7a\xee\xf4\x27\x95\x69\x0f\x48\xc9\xba\x19\x56\x54\x75\xd5\x46\x8a\x9e\xf4\x5d\x7b\xf7\x5f\xd7\x11\x82\xdd\x6e\x64\x01\x38\xf1\x82\xa6\xa0\xc6\xcb\xbd\x00\xc4\x95\xc4\x38\x95\x30\xac\x8e\x67\x96\x0e\xb5\xc5\x76\x3f\x54\x84\xea\xb1\xc1\xab\x85\x01\x40\xda\x04\x2b\xa4\x7e\xd8\x52\x88\x00\xd4\x17\x87\xf0\x75\xfe\x0d\x85\x50\x1a\x7a\xb7\x66\x35\xd0\x34\x10\xd2\x86\xc0\xe1\x7d\xb4\x02\x3a\x76\x39\x74\x68\xcc\xb0\x91\xcc\x5a\xc1\xf6\x43\x45\x87\x91\x3e\xab\x92\x2b\x50\xca\x55\x67\x01\x6d\xde\xa3\x2f\xb5\x32\x55\xbe\x67\xf2\xdc\xf9\xff\xa8\x5d\x11\x7f\x1a\x65\x5f\xa7\x0d\xd3\xa5\x4c\xf9\x91\x53\x1f\x19\x13\x0e\xaa"}, +{{0x26,0x99,0x52,0x17,0x2c,0x3f,0xa9,0x76,0xde,0xfb,0xf4,0x0b,0xd6,0xed,0xd8,0xf1,0x5c,0xfd,0x4b,0xe1,0x0c,0x75,0x8e,0x37,0x41,0xd7,0x41,0x62,0xd8,0xea,0x22,0x9a,},{0x4a,0xea,0x57,0xc7,0x21,0xe3,0xdc,0xca,0x82,0x39,0xe9,0xad,0x9b,0x22,0xc1,0x9b,0xab,0x8d,0xf7,0x2c,0x88,0x79,0x3b,0x24,0xd8,0xdc,0x47,0xcf,0x97,0x40,0xfc,0xf8,},{0x3a,0xc8,0x0d,0x1e,0x8f,0x68,0xb4,0x05,0x8c,0x3a,0x04,0xda,0xd7,0x18,0x73,0x73,0x95,0x9f,0x26,0xa2,0x70,0x02,0x49,0x6f,0x8a,0xfa,0xac,0xcd,0x8b,0xea,0x09,0x01,0xc5,0x4c,0xab,0x87,0xb2,0xa2,0x30,0x2e,0x1f,0x36,0x25,0xc2,0xb0,0x6c,0x7e,0xbc,0xf3,0xce,0x96,0xde,0x3a,0xfd,0xf0,0x0f,0x51,0x94,0xa3,0x5e,0x05,0x52,0xc7,0x0e,},"\x7c\xcb\x6a\x05\x70\xc5\x33\x73\x7b\x9a\x53\x4a\x34\x1a\x7a\x96\xdc\x76\x52\x8b\x99\x7a\x9b\x48\xe6\xe0\xfd\xe1\x0f\x47\x4b\x27\xec\x98\x99\x12\xd1\x76\xca\xb7\x42\xd8\x9a\x84\x8b\x36\x66\xe9\x27\x7d\x69\x5b\x02\x2f\xd5\x3a\x9e\xb8\x9e\x88\xc7\x20\x39\x9e\x24\xed\x25\xdb\x9e\xb3\x5d\x6d\xa0\x09\xe9\xf0\x24\xef\x8e\x65\x51\x65\xbd\xef\x1c\x0d\x79\x7c\x74\xf0\x19\xcd\x59\x1a\x04\x42\xa1\x2d\x1c\xa8\x93\x83\x6c\xa2\x62\x8b\x33\xe8\x54\xf3\x42\x8e\xec\x4a\xa5\xed\x84\xf4\xbd\xd2\xee\xf8\xb6\xd2\x25\xca\xf9\x49\x6d\xf9\xed\xff\xd7\x35\xea\x54\xdb\x1b\xde\xa8\x83\xad\x5d\x47\xeb\x0b\xd4\xa6\x65\x3f\x0a\xb0\x37\xf0\x40\xa4\x15\x17\xa7\x74\x1f\x91\xe8\x2f\xdb\x6f\xda\x04\xf0\xdf\xa1\xbc\xf8\xb9\xb3\x7b\xf2\xbf\xbd\x87\x32\x7a\x63\x6f\x90\x7f\xdf\x96\x8d\x01\x89\xd1\xa1\x18\x09\xc4\x23\x0b\xa6\x9d\x5c\xbd\x84\xf5\x61\xbc\xac\x3a\xd0\x02\xe5\x58\xc5\xb9\xb0\x97\xa0\x19\x02\xf2\x9c\xe3\xf1\xec\x26\x41\x53\xd6\x68\xc7\x8b\x84\x51\x05\xb9\xcd\x2e\xf3\xc9\x43\x53\x1b\x75\xaa\x42\x8f\x17\x9e\x4b\x34\x18\xb1\xd5\xa4\xaa\x7a\xb1\x20\x3e\xfa\x49\x5c\x87\x69\x62\x8e\xb1\x06\x3a\x93\x7b\x73\xe4\xb5\xcd\x0c\xda\x33\xda\xb0\x1a\x50\xc6\x4f\xeb\xd9\x75\xc5\x7a\x1e\x84\x15\x08\xe8\x60\x60\x94\xd0\x82\x4f\xdd\x96\xcc\x6c\xfa\x18\xfa\x82\x09\xb3\x0f\x0a\x2a\x78\xea\xc9\xa7\x67\x17\x6f\x57\x3e\x78\xc0\x68\x80\x9b\x19\x9a\x69\xac\x6d\x33\x5d\x7c\x92\x09\x99\xc4\x0c\xba\xd8\x7c\xf4\xcc\x7c\xa5\xc6\x44\x29\x1d\x75\xad\x7a\x74\xbc\x1e\x63\x92\xd1\xce\x31\x1e\xcf\xd2\xeb\xc9\x16\xe3\x9e\xb6\xaa\x3e\x7d\x89\xfb\x80\x5a\x27\xa5\x5f\x17\x89\x12\xb1\x57\xbc\x01\xa0\x55\xf6\x7a\xef\xa7\x8e\x55\xc8\x06\xcb\xd9\xc0\x1b\xaf\x8e\xf9\x2c\xad\x22\x60\xb4\xbb\x14\xcf\xe6\x17\x82\xde\xe5\xc5\x99\x72\x50\x69\x41\xc4\x62\xa4\xda\x7e\xb8\x99\x53\x1c\xf9\x96\xbc\x98\xba\x36\x29\xef\xfe\x6f\xcd\x17\x06\xd1\xb4\xee\x4f\x2a\x14\xe9\x21\xbd\x40\x8f\x30\xe1\x2e\x73\xfb\x7a\xa8\x60\x53\x6b\x03\xe7\x7c\xa9\x37\x82\x32\x81\xa1\x64\x53\xfe\x82\x79\x35\x94\x32\x01\xe6\xec\x14\x3a\x67\xee\xfa\x4f\x94\xe9\xab\xf9\x4f\x7e\x3d\x41\xb7\x0a\x82\xbe\x69\xde\xd8\xa5\x30\x60\xc2\x30\x5f\x42\xf6\x2f\xe6\xa2\xf7\x04\xb6\x7a\x1e\x8f\xdd\xc7\xd9\x8b\xa7\xf3\x45\x71\x19\xb3\x11\xd4\x49\x66\x3e\xd9\xe3\x20\xd6\x18\xdc\x23\x68\xd4\x95\x08\x75\xb9\xc3\x8c\x5d\x8c\x03\x10\x4e\x2e\x32\xc4\x32\x5d\xed\xd2\xbc\x26\x7e\x2a\xcc\xb0\x11\x20\x18\xe9\xc5\xa8\x00\x7c\xca\xb2\xf6\xd7\xc7\x37\x79\x20\x02\xac\xb7\x30\xd7\x2e\x9f\x73\x08\x29\xeb\xc4\x2c\xa5\x64\xc1\xd9\x27\x1b\xf1\x86\x9c\x4d\x35\x83\x55\x89\xb7\x43\x1e\xf7\xa3\x1a\x07\x00\x60\xfe\x4a\x08\x9f\xb1\x1f\x2d\xd3\xdc\xe6\x5a\xe0\xfb\x45\xbc\x3a\x28\x60\x91\x7d\x93\x3b\xa2\xd0\x90\x56\x9e\xf5\xed\x43\xbc\x25\x32\xdb\x87\x9e\x0f\x1f\x22\x5e\xad\xcb\xef\x1c\x03\xd9\xed\x78\x29\x9e\x23\x3e\x4c\xf0\x7b\x06\x4a\x7b\xaa\xc3\x4c\x5a\x0c\x19\xfc\x3a\x55\x42\x08\x9f\x70\x16\x7b\xe2\xf8\x5b\x4a\x10\xe7\x78\x52\x52\x23\xbe\x8f\xfd\x5c\xff\x96\x48\xb1\x00\x5a\x09\x8b\x4b\x39\x24\x39\x8f\xb0\xbc\xab\xcc\x6e\xdf\x30\xc0\x61\xec\xe7\xae\xa3\x5f\xe9\x8a\x92\x03\xf8\x71\x13\x69\x53\x0f\xeb\x5e\x67\xbb\x2d\x4f\x59\xd9\xc8\xbc\x99\x38\x54\xdd\x47\x47\xcd\xe3\x99\xbd\x0e\x63\x74\x0c\x1c\xc8\x39\xad\x0f\x09\x8a\x38\xa8\x0b\xea\xdd\x64\x8e\x14\x36\xde\xee\x60\xe9\x31\xe6\x8f\x52\x97\x9c\xe4\x9f\x30\x1f\xe3\x9a\xfb\xb6\x15\x35\x20\x91\xc8\xb6\x58\x5f\xe8\x84\x47\xed\x6e\x59\xa0\x20\xb2\xbb\xe6\x6a\x94\x23\xae\x52\x28\xc2\x03\xbf\xd4\x84\x7b\x51\x81\xe2\xc3\xb4\xda\xd8\x3a\x6d\x4f\xa7\x69\x85\xee\xf7\x6a\xdd\xe3\xb3\x4e\xdb\xdd\x28\xd6\xa0\xb4\xa4\xee"}, +{{0xcc,0x31,0x38,0xe5,0x02,0xa5,0xff,0x6f,0x80,0xd2,0x46,0x36,0x6e,0x84,0xd6,0x5c,0x59,0xf1,0x2d,0x4f,0x49,0x63,0x97,0xe6,0xeb,0x99,0xb5,0x26,0x7b,0x8c,0xbe,0x2a,},{0x9e,0x2d,0x3e,0x88,0xaf,0x7b,0x52,0xdd,0xcf,0x00,0xe6,0xd0,0xc7,0x75,0x9c,0x12,0x38,0xb8,0xfb,0x3e,0xb1,0x44,0x21,0xfe,0x82,0xc3,0x48,0x33,0x43,0x78,0x35,0xbd,},{0xa2,0x70,0x0e,0x38,0x95,0xed,0x0c,0xc2,0xaa,0xf0,0x12,0xa4,0x0b,0xc7,0xbd,0x0b,0xd2,0x9d,0xd7,0x9c,0x69,0xc0,0xb4,0xa6,0xed,0xd0,0x53,0x0c,0xf3,0xe2,0x67,0xc0,0xf8,0x2d,0xd8,0x4e,0xda,0xf1,0x74,0x4d,0xc4,0x11,0xd6,0x2c,0x00,0x28,0x71,0x52,0x58,0x82,0x2d,0x7b,0x63,0xd3,0x97,0x05,0x61,0x2b,0x3f,0xad,0x4b,0x5e,0xfb,0x04,},"\x58\x5e\xcf\x2f\x09\xeb\x92\x3d\xf2\x0a\x85\x55\x64\x2a\x2b\xc0\xb6\x8c\x6a\x5f\xcf\xd6\xb8\x40\x1c\x4a\x0c\xba\xbb\x4c\x6e\x6a\x20\x67\x62\xb7\xa3\x9f\x2c\x54\x55\xd7\x80\x8e\xbf\xbe\xd5\x6d\x67\x60\xa4\x31\xc7\xd2\x0c\x2d\xc6\xef\x1b\x73\xca\xa3\xc4\x94\x88\xe3\x0b\x1c\xa2\x52\x0a\xd2\x0b\x26\xa1\x97\x00\x78\x0e\x5e\xf3\xce\x01\x44\x38\x8d\x84\x07\xb6\xa7\x0c\x1c\xda\x37\xdb\x7f\x12\x09\x1d\x89\x2f\x2e\x91\xad\x40\x78\xbb\x4d\xb1\x76\x2e\x46\x28\x5a\x7b\x66\x4b\x2a\xd3\xa3\x4d\x26\xd8\xa9\x4d\x64\x58\x7a\x84\x52\x77\x22\xea\x83\xcb\x8a\xa8\x89\x84\xe1\x48\x97\x43\xb4\x21\x4e\xa6\x04\x1a\xa1\x8e\x55\x20\x09\x54\xef\xc7\xed\xb3\x19\xdf\x94\x7e\xfb\xfc\x6c\x8d\x0f\xea\x48\xa1\x31\x61\x34\x65\xd8\xf4\xc4\x94\x98\xf2\x26\x91\x45\xc6\xda\xe5\x04\x78\x05\x25\x98\xe1\xca\x3b\xe0\xe3\x36\x11\x57\x1f\xa3\x84\x77\x1e\xee\x40\x2c\xc2\xb1\xd8\x48\x36\xc8\xf1\xad\x28\xf2\xad\x23\xde\xe9\xff\x1d\x7e\x1f\x25\x21\x63\x58\x74\x11\x5d\xef\x4d\x93\xe8\x9b\xe7\x61\x80\xbc\x55\xf7\x61\x14\x43\x60\xa8\xb2\x22\x89\x2d\x64\xd1\x57\xcc\xb5\xd8\xf4\x85\x5d\xca\x56\x70\x14\x95\xa0\xe1\x00\x2d\x34\x0a\x4a\x46\x15\x6b\x9b\x7f\xe0\x6b\x7c\x07\x59\xe0\xb6\xdf\x55\x9b\x69\x1e\xde\x78\xb5\x5a\xf6\x4e\x7c\x8d\xd9\x08\xb7\x88\xdd\x6b\xa3\x5a\x90\x2c\x81\xdc\xeb\x37\x88\xb6\x15\xde\x22\x5a\xfa\x58\xa8\x11\x81\xab\x24\xa7\x37\x05\xee\x83\x8b\x6e\x86\x3f\xe1\xbc\xc2\x6c\x1b\x94\x32\x39\x23\x0c\x27\xc6\xb3\x97\xb2\x3d\x13\xde\x6a\x02\xc9\x7f\x36\x45\xda\x91\xd4\x13\xf9\x16\x47\x3b\x01\x8a\x61\x59\x4b\x6f\x51\xce\xa4\x44\x57\xda\x1e\x3d\xbb\xba\x6d\xe1\x68\x66\x65\x7e\x92\xef\x02\x02\x71\x8a\x84\xad\x03\x33\xe8\x33\x6b\x05\x2b\x00\x47\x33\xe8\xe9\x5e\xc1\x3e\x5f\x91\xb3\x80\x6a\x98\xd3\xdb\x72\x9f\xb7\x35\xb8\x14\x7c\x4a\x98\x2a\x2d\x5b\x4e\xfa\xe9\xc0\x9d\x0a\x9b\xf8\x91\xcb\xbc\x3c\x8f\x53\x1e\x76\xe4\x04\x4e\xc9\x1f\x4d\x7c\x5c\xf7\x73\x10\xe2\xb2\xcd\xe2\xe0\x7c\xcf\x3e\x0a\x19\xdd\x6a\xe1\xb3\xfc\xb2\xdf\x42\x18\x6e\x9c\x72\x92\x2d\x2d\x4c\xe5\x1b\x30\x6e\x81\xb1\x6c\xfc\xf8\xf0\x0d\x51\x3f\xbd\x2c\x52\x39\xb4\x5a\xfc\x65\x4f\x6f\xe2\x1a\xcb\x7e\x8a\x0c\x9a\xa8\x7b\x0b\x60\x50\x74\xdf\x95\x76\xa6\xdd\xd9\x00\xac\xa5\x67\x61\x7c\xb7\x96\x56\xb3\xb5\xec\xb9\xff\x68\xb2\xf6\x24\x1e\xd0\xd0\x24\xac\x27\xaa\x6e\xb4\x86\xb6\x9f\xdc\x0a\x0d\xb9\x20\x96\xab\xf8\x60\x02\xde\xc7\xaf\xd8\x47\xa0\x06\xa3\xf6\x95\x5b\x49\x56\x90\x53\xbe\x9f\x1d\x0a\x49\xb7\x93\xa5\x41\x1e\x59\x16\xf4\x18\xec\xab\x95\x32\x43\x55\x3b\x66\xe6\xba\xdc\x4e\x90\x9b\xe0\xef\x5c\xc7\xc6\xd2\x71\x99\xec\x3f\x21\x42\x3b\xc4\x57\x73\xfb\x40\xb9\x7b\x61\x18\x5b\x57\x08\x0e\x8f\x0b\x89\xa3\xea\x57\xc8\x44\x4a\xb2\x7e\xcf\x70\x06\xa7\x66\x04\x7e\xef\xf5\x4d\x85\x56\xcf\xed\x23\xde\xf1\xda\x2c\xc8\xae\xbb\x48\xc9\x4e\x77\x9e\x82\x03\xae\x2c\x90\x2b\x51\xde\x0e\xde\x04\x56\xfb\x73\xfb\x4d\x5f\x51\x4a\x4c\xeb\xc4\x7f\xec\x3f\x94\x84\x69\xa5\x45\xc6\xbc\x57\xb4\x13\x8d\xb3\x4e\x7c\xc0\x06\xde\x26\xef\x50\x7b\x54\xd2\x81\x47\x56\x7a\x8c\x29\xac\x1e\xce\xf5\xbb\x84\xfb\x99\xac\xeb\x23\xa2\x02\x94\xd7\x4a\x85\xae\x36\xb3\x34\x50\x66\x8a\x5c\x26\x09\xd3\xa9\x39\x34\x58\x6f\xf9\x0c\x3b\x6d\x27\x32\x9e\xee\xf3\xa7\x54\xe9\xa9\xcb\xd5\x61\x7e\xf3\xb0\x93\x97\xbd\xc9\x71\x37\x07\x66\x58\x9a\x12\xd8\x90\x05\x0d\x16\x51\x45\x8b\x3f\xc5\x33\xc8\x43\xbf\xfd\xf9\x75\x4d\x93\x2c\x4e\xd7\x61\x1d\x4d\x27\xc3\x2a\x08\x75\x55\xb5\xea\xa3\x7a\xe9\x0c\x49\x79\xef\x54\x29\x9c\x42\x0a\xb5\xe2\x9a\xe2\x84\x5d\x4d\xcf\x21\x78\x92\x0a\x86\x51\x75\xfb\x9c\xc0\xe6\xb8\xc5\x24\xb1\xee\x49\x58\x05\xd5\x17\xbf\xe0"}, +{{0x5c,0x69,0x2c,0x68,0x11,0x98,0xb1,0x72,0xdf,0x2f,0xac,0x2a,0xec,0x3f,0xcf,0x70,0x15,0xc2,0xbb,0x68,0x30,0xf2,0xa9,0x8e,0x30,0xa3,0x96,0xb6,0x4a,0xf4,0x28,0x0e,},{0x33,0xb1,0x69,0xd4,0xca,0x27,0x10,0x40,0x92,0x6e,0xa8,0x78,0x35,0xe5,0x06,0x6f,0x9f,0x05,0x78,0x2f,0x08,0x7f,0xca,0x7a,0x55,0x6f,0x7b,0xf4,0xcb,0xa2,0xe8,0x86,},{0xad,0x8f,0x37,0x9c,0xaf,0x41,0xf7,0x2d,0xcc,0xad,0xc3,0xe9,0x15,0x35,0x7a,0xb0,0xcd,0x30,0x4e,0x10,0xf4,0x12,0x0e,0x0d,0xbb,0xfa,0xac,0x01,0xbf,0xfa,0xf2,0xbe,0x89,0x3f,0x70,0x07,0x2d,0xc9,0x64,0x06,0x91,0x81,0xbe,0xc1,0x7f,0xe0,0x25,0x10,0x55,0xb2,0x1e,0x23,0xde,0xe4,0x36,0x3b,0x27,0xef,0x1f,0xff,0x67,0xaa,0xfe,0x06,},"\xb1\x60\xee\x3a\x93\xcf\x6b\xc3\x45\x6e\x5b\xd0\x19\x7c\x09\xaa\x76\xc2\x25\x80\x52\xf9\xa3\x4d\xbc\x2e\xd5\x89\xf8\xdb\xe5\xff\x99\x69\xa6\x1c\xfe\x84\x6b\x2f\x67\x39\xdc\x7d\x4a\x14\x96\xe9\xad\x58\x60\x5b\x5a\x27\x58\xca\x07\x8c\x55\xa9\xfc\x1c\x4e\xeb\x54\x91\xa8\x4b\xfd\x46\x8a\x2c\xeb\x14\x1a\x77\x34\x93\xa9\xb3\xee\x82\x8b\x5d\xde\x9c\x00\xc2\x36\xff\x01\x56\xe4\xe2\xe4\x5f\xa0\x79\x31\xda\x68\xbb\xd2\x03\x0a\x88\x14\x05\xc4\xf7\x87\x28\x81\x3a\x5e\x04\x81\x24\x04\xc2\xa1\x9c\x9b\x87\xb1\xcf\xe9\xaf\x95\xe2\x73\xec\xf9\xc5\x18\xc5\x39\x35\xf8\x42\x56\x3b\x19\x2f\xae\x12\xa7\x3c\xef\x08\x5f\xe1\x9e\x89\x9e\x5b\xa0\x89\x79\xe3\x11\xfb\x28\x6f\xbf\xc7\xb2\x48\xaa\xbd\x40\xdc\x61\x61\x0e\x1d\x4f\xc9\x80\x6d\xd2\x12\x92\x39\x2d\xb2\xdb\x40\x42\x6c\x5d\x19\x6a\x48\x9c\x5d\xb7\x7e\x3e\x9c\xf0\xbd\x04\x1e\x3c\x23\xb5\xba\x1d\xb7\x81\xa1\x07\x90\xbe\x1f\xe0\x7a\x2b\x00\xca\x3a\xf8\x9c\xbd\x46\xef\xce\x88\x0e\x1e\xf2\x8b\x0c\xd7\x9d\x53\xb4\x2c\xd8\x0e\xaa\x13\x7e\xff\x7d\xf9\x0b\xcb\xcf\x95\xc9\x85\x8d\xc0\xcc\xc6\xd8\xca\x8a\xe3\x54\x7b\xdb\xf9\xff\x90\x24\xf3\xcf\x17\x01\x15\xeb\x28\xbf\x12\xb7\xd3\xb7\x01\x46\x0f\x48\xd1\xb4\xb2\x3d\x7f\x6f\xf7\x2f\xfd\xc9\xa6\xc5\x26\x24\xd1\x53\x12\xd7\xf1\x9d\xdb\x60\x26\xa1\x5e\xb5\x42\x95\xd3\x31\xfd\x79\x50\x91\x03\xbc\x59\xa3\xb6\xe1\xba\x7a\xc8\xc1\x12\xe4\xde\x28\x17\xe5\x1c\x1e\x16\x50\x7b\xa6\x6f\x25\x47\xbc\x89\x9f\x69\xc1\x20\x7a\xe5\xe3\x7b\xdb\x0e\x16\x1b\x15\xb6\x12\x30\x5b\xc0\x94\x0f\x9d\x1b\x38\x2a\x37\xec\x2d\xa6\x39\xa6\xec\xba\x1b\xcd\xfc\x51\x21\x4c\x32\x23\xc1\x1b\xba\xb7\x9f\x3f\xae\x3d\x55\xe2\xd4\xbe\x58\x4f\xd7\x60\x1e\x4e\x2e\x55\x8b\x3b\xe5\x70\x71\x15\xa6\x1f\x5a\x81\x5e\xc2\x4a\xac\x18\x09\x34\x57\xbc\x46\xc0\x5c\xfb\x7a\x3f\x25\x33\xea\xda\xdc\x9e\x6c\x1f\xe3\x10\x77\x9e\x69\x7f\x68\x30\x35\xce\x57\x87\x3d\xf5\x5d\x79\x1f\x6d\x2f\xb0\xe2\x10\x7e\x68\x66\xf8\x39\xc3\xa1\x26\xe9\x02\x38\x65\xce\xd1\xbc\xf6\x77\x99\x55\xaf\x54\x7e\x1d\x87\xeb\x32\xa9\xbf\x32\x28\x57\xfd\x12\x6b\x0c\xdc\x5d\x5e\x90\x4e\xb7\x6c\x67\x06\xe3\xc8\x97\xae\xfd\x6e\x47\x56\xfb\x8a\xca\x81\x70\xca\x5b\x39\x66\x90\x89\xaf\x1b\xb1\x41\xa2\x5d\x6b\x8b\x06\x03\x4d\x8b\x11\xab\xf1\xff\x8f\x8d\x43\x37\x58\x46\xfa\x8f\xa8\xa3\x4b\x5f\x26\x48\x20\x74\x4d\x31\x14\x9b\x7d\x57\x32\x6c\x59\xb1\xdb\x74\x13\x16\x78\xf6\x34\xe7\x23\x2c\xa5\xea\x51\x88\x76\x0a\x70\xdc\x35\xdc\x89\xf8\xe4\x53\xb4\xc6\x5b\x77\x2c\x2b\x6b\x62\x76\x8d\x83\x73\x23\x65\x51\xba\xaf\x24\xd3\xc3\x04\xc4\x1b\x62\xc3\x6e\x6a\x33\x83\xb3\xa1\x63\xb7\x3e\x78\xd8\xba\xdb\x75\x74\x1e\x50\x01\xd4\x19\xd3\x0e\x2e\xd7\x7c\x30\x96\xe8\xd8\xdf\x71\x3b\x93\x76\x2c\x97\x07\xbd\xd0\xf3\x65\xa8\x74\xb9\xda\x8a\xb7\x10\x49\x5d\xd5\x6a\xea\x93\xbb\x77\xfb\x22\x26\x35\xc6\x3b\xce\x9f\x63\xaf\x91\xfa\xc8\x9c\x66\x98\x6b\x8e\x21\x76\xdd\x45\x1d\x58\x33\x94\xc1\x90\x7c\xba\x17\x25\xf0\x6d\x25\xd1\xd0\x91\x2b\x3e\x5c\x6c\x7d\xcd\x34\x35\x8f\xad\x59\xdb\xc6\xf6\xb1\xc2\xef\x33\xd3\xca\x82\xf4\x35\x18\xfe\x4f\xf3\x13\x78\x01\x6e\x57\x8a\x7b\xab\x0b\x77\x67\x6e\xba\xe0\xd4\x8d\x08\x89\xd6\x90\x29\xd2\x09\xf2\x83\xce\x8f\xe0\xec\x23\xcd\x83\x2a\xdc\x12\xa9\xc3\xe3\xae\xc2\xd6\x03\x66\x95\x55\x6d\x93\x13\xf1\x2a\x89\x9d\xd5\x9a\x66\xbe\xf2\x8e\xde\x17\x5f\x8a\xae\xee\xb2\x94\x2b\xb9\x08\x92\xa0\x4b\x44\x0d\x04\xb6\x6f\x5e\xef\xf6\x1a\xda\x72\x79\x02\x94\xce\x55\xc8\x6c\x6d\x92\x78\x5d\xdd\x26\xc7\xa7\x31\x60\x3b\x06\x9c\x60\x3c\x92\xe4\xfe\x8f\xf7\x82\x54\x4c\x8e\x89\xb4\x0b\x8b\x55\xf9\x0e\x2a\x5e\x9a\x0f\x33\xc7\xfe\xc7\x7d\xad\x81\x52"}, +{{0x9d,0x5f,0x85,0xd2,0xe7,0xdf,0xd0,0x3b,0xb6,0x89,0xd9,0x00,0x28,0x5f,0xd4,0x46,0x15,0x38,0xa5,0xf2,0x71,0x0a,0x13,0xed,0x21,0xc7,0x75,0xf6,0xef,0xf6,0xb3,0xff,},{0xb8,0x67,0x97,0xe4,0xbe,0x02,0x86,0xae,0x39,0xe4,0x4d,0xf0,0xa0,0x0c,0x01,0x6d,0xb4,0x55,0x5e,0xf8,0x6f,0x2f,0x05,0xd0,0xa3,0xed,0x89,0xd8,0x9a,0x4c,0x3e,0x5e,},{0x17,0x6b,0x95,0x92,0xf8,0xc2,0x51,0x35,0x29,0x2a,0xdd,0x4d,0xaa,0xcc,0x9c,0x4f,0xaa,0x21,0xd4,0xf4,0x9b,0x27,0x84,0x80,0xc4,0xe8,0x88,0x1c,0x01,0x62,0x4d,0xf9,0xa3,0x7e,0x23,0xe1,0x8e,0x84,0xca,0x32,0xd0,0xd8,0xcb,0x85,0x10,0x54,0x22,0x2f,0x10,0xa4,0x95,0x41,0x9f,0x19,0x7e,0x7b,0x3d,0x18,0xdf,0x0a,0xdf,0xb1,0xb3,0x07,},"\xf7\x0b\x5b\x05\x3a\x46\x72\x51\x2c\x24\xb3\x16\x83\x92\xf6\xa1\x7d\xd7\x7d\x86\x89\xc2\x1c\x86\xef\xc2\x58\x29\xa1\xa0\x4f\xab\x4f\x76\xc8\x52\x16\x84\xd3\x20\x10\x45\x59\x07\xa2\x69\x08\x67\x7b\x40\xdc\x69\x47\xd6\x54\xf2\x91\x4c\x30\xec\xee\x72\x4f\xa6\x84\x46\xb5\x9d\x09\x1e\x25\x8f\xc8\x62\x41\x1c\x96\x4d\x66\x8d\xef\x83\x03\x4b\x62\x7e\xd4\x16\xdc\x19\x0b\xb5\xa2\x63\xa6\xff\x8d\x55\x9e\x13\xb8\x93\x62\x25\xfb\x4d\xab\x4f\x7b\xda\x04\x68\xe5\x47\xe7\x08\xcb\x04\xce\xbe\x1e\x5c\xfc\x69\xf7\x6a\x1d\x28\x3f\x28\x16\x82\x86\xf2\x4e\xce\xa5\x53\x5e\x44\x90\xa0\xc5\x55\x67\xa7\x34\x5e\xf9\x53\xce\x42\x6b\x20\x9a\x3d\xe3\xdf\x59\x5e\x80\xee\x61\xe5\x72\xa2\x78\xab\x02\x21\x95\x51\xb7\x3d\xa4\x19\x84\x80\x82\x85\xa8\x35\x98\xa0\x2d\x9b\x28\x67\x12\x10\x00\x4e\x31\xd8\xaf\x92\x42\xc1\x6f\x90\xd5\xea\x8f\x63\xa1\xff\x66\xcf\xe6\x0e\xcb\xe5\x37\x24\x5f\xa1\x2a\x9b\x15\x41\x15\x29\x58\x06\xea\x2d\x11\xf3\x67\x17\x82\xb9\xaf\x4f\xa8\x6a\x12\x88\xe1\x23\xcf\xd2\x40\x9a\x5d\xc9\x8f\x41\xb8\xf6\xdf\x29\x9b\xbc\xc4\xbb\x64\x47\xdc\x03\xa6\xd6\x0e\x9b\x2c\x5b\x8f\xfc\x40\xd9\x83\x95\x6b\xe9\x77\x68\xdd\x06\x12\xd4\x7c\xbf\xa7\x57\x1c\x99\x69\x85\x6c\x15\x2c\xd3\xb4\x73\xac\xe0\xb8\xa1\x44\xaa\xc2\x09\x5c\x0f\x72\xf1\xd3\x14\x71\x52\xb9\x08\xef\x66\x26\xd5\x22\x28\x19\xb2\x0b\xb3\x35\x0a\x46\x45\x2f\x67\x54\x90\xc2\xa8\x21\x50\xee\xc4\x0d\x75\xb6\x6a\x32\x5d\x6e\x92\x9a\x90\x5a\xde\x1e\x31\x60\xab\x95\x01\x81\xef\xc6\x6e\x59\x23\x08\x65\xd5\xe5\x99\x69\x8a\x8a\x3f\xf5\x60\xc4\xc6\x01\xa7\xa9\xa5\xda\x3b\x5d\x89\xbc\xa9\x3f\x7c\xf5\xbc\xf5\xbd\x5e\xcf\xf8\xf1\xa1\x85\xc8\x22\x0e\x4c\x77\x82\x1e\x62\xad\xf9\x5a\x03\x7f\x2d\xf7\xce\xf4\x3a\x4c\x60\xac\x75\x80\x1e\x9f\xcc\xdc\x5b\x08\xee\xd3\x28\xdd\x93\x10\x09\x04\x11\x56\x45\xec\x1e\xe0\x85\xcc\x77\x8b\x0f\x4e\x46\xe1\x72\x98\x98\x4a\x70\x2e\xce\xb3\xe1\x52\x83\xd8\x20\x00\x4f\x74\xa0\x79\x52\x0d\x63\xa7\x5f\xae\x33\xec\x3f\x4b\x83\x64\x69\xe1\xaa\x99\xea\x24\x4a\xf1\xfb\x08\xb0\x0a\x8c\x9d\xfd\x03\x30\x8d\xfc\x20\x23\x5e\xa9\xc8\x28\x3f\x4d\xa4\x7c\xfb\xcd\xbd\x03\x1a\x02\xd1\x64\x16\x0f\x2a\x58\x98\x67\x00\xb1\x95\x26\xd4\x1e\x4d\x7f\xd4\x58\x43\x4d\x72\x64\xbc\x8e\xb6\x42\xe6\xd8\xdd\x27\x59\xce\x2b\x85\xc9\x7b\x37\x02\xe7\x0d\xa7\x1f\x18\xed\xc5\x3e\x91\x40\xa6\x45\x62\x7e\x02\x78\xe8\xe7\x05\x39\x03\x74\x84\xdc\xd1\x8c\x62\xfa\x33\x07\x17\xd6\x14\x8a\x0d\x62\x3f\xf8\xb6\x5e\xa8\x56\x7e\xc7\xfa\x04\xc8\x92\xe3\xa1\xec\xee\x96\xe8\x32\xf4\x15\x50\x74\xc8\x3c\xbc\x93\xe9\x8c\xc6\x7f\x1f\xa1\x12\xaa\x06\xe9\x91\x5f\xa4\xd2\xde\xa9\x31\x55\x1e\x7c\x62\x3a\xa8\xa3\xa7\x61\x9e\xa2\x4f\xf9\x14\xe2\x64\xf3\x1f\xc7\x3d\xfa\x8c\x43\x0a\xc4\x6c\xe1\x6d\xc9\x68\xc5\xa4\x08\x5d\x5c\x38\x0d\x30\xcd\xc6\xf4\x3d\xee\x80\x6f\x38\xd1\xdf\x42\x0a\x06\x55\x74\x14\x47\x37\x05\x6d\xaa\x62\xf0\xc0\x98\xc9\xc5\x2f\xcc\x04\xcc\xa6\x42\xc4\x5d\x68\x73\x45\xa0\x94\x61\x3d\x4a\x3c\x6c\x87\x88\xbf\xa2\x18\x53\x8a\xd7\xec\xe1\xbd\xb6\xc9\x39\x24\xee\xc4\xba\xaa\x3e\xb1\x5d\xc1\x49\x4d\x65\xff\xa1\xa2\x3f\xf8\xe9\x85\x26\x34\x08\xfb\x02\xbf\xe3\x9a\x8c\x55\xb3\x00\xb1\xa0\x2e\xd3\x6c\x67\x14\xdd\x5a\xb7\x50\xd4\x7f\x02\x1f\x65\xe0\x8c\x63\x5f\x1d\x6b\x7b\xaf\x39\x6c\xb4\xf9\x3d\x56\xc1\xca\x46\x1b\xb1\x2e\x94\xde\x7e\x5d\x98\x65\x9a\x8a\xf0\xbf\x01\x9f\xc4\x22\x80\xe1\x11\xe0\x48\x00\xff\x80\xe0\xc1\x57\x15\x0e\x16\x56\x09\x45\x42\x81\xb2\x00\x07\xe3\xed\xfa\xa1\xea\x85\x44\x65\x54\x7a\x00\x6a\x4c\x32\x36\x41\x14\x95\xda\x16\x60\x98\xaf\x28\x23\xa4\x59\xcf\x10\x0a\x1f\x3c\x92\xc6\x39\x0c\x60\x66\xcd\xbf"}, +{{0x4a,0xaf,0x2d,0x13,0x28,0x84,0xf3,0x0d,0x11,0x27,0xcf,0x18,0x7e,0xe0,0x93,0x88,0xb4,0xa5,0xc4,0x4a,0x9a,0x92,0x67,0xe6,0x72,0x83,0x17,0x39,0x89,0x51,0xfb,0x61,},{0x83,0x72,0x7e,0x92,0x57,0x34,0x91,0x28,0x55,0x9e,0xbf,0x75,0x9f,0xdc,0x82,0x12,0x2c,0xce,0x76,0x74,0x66,0x39,0xc0,0xad,0xa9,0x76,0x1f,0x0d,0x60,0xb9,0x40,0xb1,},{0x5f,0x11,0xdf,0x39,0x06,0xa7,0x12,0xa9,0x53,0xf4,0x7c,0x85,0x98,0x06,0xb5,0x23,0x73,0x58,0xd0,0x8b,0xa9,0x5e,0x49,0xf9,0xe5,0x30,0xa3,0x71,0x65,0x83,0x5e,0x93,0x59,0xd9,0x76,0x9d,0xc2,0x1f,0xbb,0x4d,0x44,0x49,0x7b,0x93,0x90,0x5b,0xca,0x8d,0x99,0x17,0xc7,0x28,0x49,0x3f,0xee,0x3a,0xcd,0x5b,0x52,0x1d,0xbd,0x1e,0x24,0x08,},"\xd7\x3e\xaf\x11\x41\x3b\xf4\xd5\xbc\xcf\x6a\x2e\x80\x9c\xd6\x83\x2a\x51\x82\x3a\xa2\x2b\xd1\x6e\x09\xcf\x56\xff\x04\x5e\xef\x2d\x1a\xda\xdd\xa5\x0c\x2e\xbd\x67\xbb\xc4\xd7\x0e\x49\x3c\x96\x8c\xb4\xde\x49\x77\x06\x5d\x44\x63\x30\x06\x94\xc9\xca\xa5\x72\x06\xd6\x66\x46\x93\xd8\x46\x2c\x3c\x57\x6b\x52\x5c\xc7\xac\xf7\x9f\x26\xf9\x05\x5a\x1b\xcf\xa7\xd0\x77\xf4\x5e\xbe\x0b\x2d\x48\x1e\xbd\x63\xf7\x34\x0a\x33\xe4\xab\x68\xf1\x60\x49\x75\xec\x1d\xfe\xc4\x5a\x79\x1a\x2a\xbb\x10\x44\xd7\x5a\x4d\xb5\x5a\xdf\x59\xb8\x39\x4e\xbd\xe6\x82\x4c\x21\x14\x5b\x00\xef\x3b\x1b\x08\xed\x11\xfd\x51\xdd\xa5\x14\xed\x7e\x21\xe5\x4d\xba\xf6\xab\xb6\xd9\xe3\x17\xfc\xf9\xfd\x37\x5b\x18\x76\x4e\x64\xac\x9b\xe5\xb0\x8f\xec\x3b\x78\xab\xba\xb1\xd1\x2a\x2a\xb0\x9d\x55\x9a\xcd\xc7\x13\x3f\xb2\xe0\x00\x8e\x0c\x11\x4b\x7c\xad\xb4\xbf\x76\x30\x78\x67\x4d\x03\xe9\xc8\x07\xbe\xc1\xe2\xca\x71\xad\xcd\xaa\x31\x0d\x58\x7f\xa5\x69\x50\xfc\x0f\xb2\xe9\x79\x04\x3d\x50\xf9\xae\x23\xfa\x8f\x82\x1c\xd9\xd6\x23\x27\x89\xd0\xee\xcc\xfc\x4f\x47\xe3\xad\x80\x4e\x25\xcf\x5a\x42\x5f\x94\x37\x7d\x17\x87\x48\x33\xe6\xae\x36\x38\x17\x8c\x78\xb7\x95\x19\xd6\x4d\x97\x93\xf4\x50\x46\x06\xa0\xea\xb6\x87\x07\xf6\xe1\xf7\xcc\xcb\x51\x5b\xe3\xd1\x20\x1b\xcd\x19\xf2\xf0\xe2\x55\xc7\x22\xea\xb1\x2b\x43\xaf\xf8\xc8\xc5\x56\x11\x25\xfb\xca\x1f\x65\x42\x07\x6a\x06\x15\x2e\xb7\xe4\xb0\x78\x63\x24\xc2\x49\x5e\x79\xd7\x9c\x0a\x8e\x29\x5b\xb2\xe3\xdf\xd0\x5a\x90\x33\x19\x00\x65\xa2\x84\x55\x2a\x6e\x73\x60\x06\xac\xe4\x1f\x97\xcc\x43\x4a\x25\x12\x05\x1b\x72\x7c\xe5\xbc\x9c\x4a\x75\x52\x9e\xc5\x3d\xd7\xd1\xf1\x26\xe7\x93\x85\x77\x47\xb5\xba\x8d\x03\x15\x5d\x45\x55\xf5\x9e\x8b\xaf\x2f\x0c\xdb\xa8\x71\xac\x16\x0e\x75\x19\xa8\x52\xdb\x00\x4f\x70\x16\x41\xa4\x0a\x42\x2d\x4c\x38\xb6\xc0\xc3\xcc\x8f\xbb\xd0\x53\x22\xdd\xc0\x00\x1f\xb8\x67\x28\x6e\x29\x6c\xbd\x69\x86\x2c\xbc\xcc\x74\x47\x03\x8e\xb3\x0f\x8a\x81\x23\xb7\xb3\x13\x73\x98\x47\x02\xc3\xbe\x45\x7a\x4b\x8c\x54\xe6\xe5\x28\x04\x85\xa2\xc4\xff\x84\x52\x1f\x29\x8d\xde\xb3\xb3\xb2\xbc\x91\xf1\x14\xdd\xce\x67\x03\x02\x48\x04\x44\x69\xdc\x06\xf3\x62\xf2\x91\x9a\x3f\xec\xe5\x08\x23\x75\xd0\x40\x80\x37\x6f\xe2\x19\xd9\xb4\x57\x5b\x1c\xf1\xc9\xec\x4d\xca\xc5\x74\x9f\xc7\x78\xf5\x15\xdd\xa1\x3f\xa0\xd5\x86\xc2\x64\xb9\xbb\x61\x50\x33\x10\x76\x2c\x78\x9c\xa1\x16\x08\xd2\xfe\xe6\x74\xc7\x0a\xc4\xfc\x6d\x5e\xbc\xf6\x8c\x4a\xb8\x9b\xd8\x45\x55\xfc\x00\x75\x23\xc2\x8a\x7e\x1d\xd0\x8a\x98\x62\x04\x4d\x52\x45\xb9\x1a\x87\x78\xec\x9e\xe9\x84\xa4\x1a\x9e\x13\xb7\xab\xd6\x57\xae\x2a\x46\xae\x86\x01\x52\xc6\x44\xac\xd9\x53\x67\x67\x8f\xf6\x4c\xc5\x40\x06\xe3\x66\x14\x80\x5e\xd6\x18\xa7\xc6\xd0\xfd\x33\xa9\x08\x52\x30\x90\x84\x1c\x23\x0a\xf0\x98\x46\xd1\x32\xbb\x4c\x6b\x60\xe2\x44\x1f\x9d\x3c\x49\x87\x14\xf4\x70\xf6\xbc\x03\xa8\x0d\x14\xa2\x94\xb5\x65\xd1\xd5\xe7\x81\xcf\xfc\xb1\x30\x4e\xfd\xbb\xc7\xbf\xea\xbd\xed\xc8\x57\xac\xc4\x2e\x27\x62\xbb\xf9\x7a\xf8\x39\xa1\x66\x75\x2d\xa2\x95\x67\x28\x17\xf1\x0d\xbd\x47\x2d\x38\x1f\x53\x16\x55\x55\xac\x82\x22\xa7\x85\x35\xa8\x68\x05\xf1\xbe\xd4\x22\x88\x9f\x20\x61\x09\xaa\x74\x77\x2e\xdc\x0b\xb5\x1e\x8a\x98\x40\xcf\x62\xc9\x2f\xa6\x35\xb9\x0c\xae\x07\x6d\xd5\x0e\x5a\xed\x9d\xea\xc8\x43\xfa\x8a\x6b\x53\x99\x88\x28\x5f\xf1\xad\xab\xe4\xc7\xb8\x3d\x9e\x29\xac\x2d\x94\x09\x2d\xaa\xfe\xc9\xf6\x67\x36\x89\xba\x9e\x92\x52\xd8\x64\xd7\x57\x7a\xa8\x95\x05\xd3\x31\xfe\x78\x09\x86\x12\x77\x00\x2a\x0b\x44\xa9\x6b\xa6\xae\x4a\x52\xb3\x54\x8b\xf2\x68\xe7\x77\x78\x0c\x00\x20\x9b\x24\x5f\x8b\x14\x17\xee\x5e\x70\x1a\x12\x33\x4a\xd5"}, +{{0x4b,0xc7,0xda,0xab,0xc5,0x40,0x7c,0x22,0x6d,0x19,0x20,0xdb,0x4a,0xfd,0x21,0xb2,0xa5,0xb3,0xe5,0x9b,0x8e,0x92,0x46,0x05,0x3f,0x6a,0x1a,0x6a,0xfa,0x54,0xe7,0xe7,},{0xdc,0x53,0x98,0x85,0xfc,0x7b,0xee,0x00,0x2a,0xc5,0xde,0xba,0xe1,0x6b,0xdd,0xbe,0x4b,0x55,0x3f,0xa1,0x5e,0x81,0xee,0x79,0x88,0x76,0x94,0x0f,0x38,0xcf,0xc4,0xc5,},{0xa7,0xa6,0x48,0x88,0x39,0xbb,0xae,0x04,0xde,0xc9,0x2f,0x96,0xd7,0x28,0xc4,0x64,0x68,0x5d,0x7a,0x96,0xdf,0x51,0x2b,0x00,0x51,0x16,0x3d,0x22,0x53,0x8f,0x74,0x54,0x6f,0xa9,0x86,0xb1,0xb6,0x0a,0x6d,0x8c,0xc7,0x66,0xa2,0x6c,0x69,0x84,0xc9,0xcd,0x26,0x88,0x39,0x58,0x98,0xe2,0xb2,0xae,0x72,0xdc,0x6a,0x2d,0x5a,0x9f,0x75,0x0e,},"\x6a\xcc\xe9\x98\x43\xb2\x41\xaf\xe6\xed\xd5\xd0\xab\x78\xd0\xfb\x21\xc8\xc3\x5a\xff\x88\x13\x89\xd5\x05\xf2\xf1\xdd\x91\xaf\x1e\xb2\xad\x22\x92\x54\x92\x7c\x7f\x0e\xcf\xb7\xa8\x14\x16\x90\x57\x3a\x65\x5d\x69\x85\x3d\x74\xd0\x70\x8b\xf8\xb1\xe6\x0a\x03\x96\x30\x28\xa6\x25\xb7\x9f\x3d\xfe\xa2\xb1\x13\xff\xca\xb4\x6f\x3c\xfd\x4a\x62\x1e\x8f\xd8\xff\x0a\x96\x81\x43\xb0\xae\x03\xcc\xb6\xf4\x2e\x25\xe2\xd7\x4d\xbf\x51\x5b\xc3\x58\x69\x9b\x63\x50\x09\xb0\x1d\x61\xfe\x59\x7f\x1d\xc2\xc3\x5a\x7b\xa4\x55\x52\x78\xee\x0e\xa4\x56\xc7\xd3\x5f\xa8\x75\x7a\x41\x79\x24\xb1\xd0\xa8\x35\x1f\x22\x6a\x13\xec\x29\xd0\x25\xb4\x26\x96\xec\x1d\x99\x25\xb7\x69\xcd\x59\xc8\xe2\xf9\xcd\x3c\xe4\xe5\xc0\x20\xe0\x51\xe7\xa3\x6f\x3f\x97\xc1\xe8\xec\x71\x97\x4b\xc1\x6a\xc4\xde\x46\x51\xad\x4d\xf2\xe9\xc0\xee\xd6\x86\x92\x42\x24\xfe\x6d\xe6\xc6\x0d\xd4\xac\xc2\x6e\x0a\xab\xd8\x0c\x21\xd5\x09\xd9\x59\xb8\x0b\x43\x53\x95\x8d\x00\xe4\x4c\x51\x1d\x23\xbc\xf4\x45\x52\x60\x8b\xfa\x56\xa9\xc5\xae\x79\xde\x62\xbb\x23\xf1\x1d\x74\x0f\x48\x24\x0c\x27\xe1\x01\x99\x97\x51\xf2\x53\x47\x42\xc0\xa6\x91\x3f\xf6\x4b\x68\x3a\x18\x99\x5a\xbc\x39\x3f\xeb\x9d\x57\xc7\x1f\x49\xa0\x80\x55\x72\x98\xcc\x40\x5d\x11\xb7\x98\x8d\x71\x16\x84\x0c\x5a\xda\xf5\x3b\xc6\x72\xb4\x69\x23\xcc\x45\x7c\x70\x39\x94\x0a\xd4\xd5\xbf\x07\x3c\x6c\x88\x6b\x13\x39\x52\x59\x26\xd2\x81\xdb\xd1\xa7\x97\x39\xb2\xe3\x64\x14\xcb\xd3\x21\xb1\x85\xfc\x88\xf1\x8d\x2f\x81\xc8\x09\x97\x5b\xe9\xa0\x93\x64\x4c\xc5\x59\xed\x2a\xe5\xcc\x0e\x35\xcb\xdd\x18\x11\xf7\x02\x86\x05\x7a\x3f\x70\x30\x67\xed\xdd\xf5\xeb\x16\x90\xa7\x42\x7b\xb7\x3f\xe3\x02\x4e\xd0\xdb\x82\xa5\xce\x8f\x17\x16\x42\x8a\x76\xfd\x29\x2b\xa9\x9a\x30\x0c\x4b\x2f\x36\x0d\xa2\x12\x46\x17\x59\x0b\x10\xe3\xb1\x62\xa6\xe6\x7d\xd5\xd5\xa5\x9b\xcc\xa1\x0f\x61\x0f\xa0\x64\xaf\xfd\x55\xf8\x48\x3b\x98\xa6\x8d\x07\x6f\x27\x8a\xbf\x88\x8a\x08\xa0\x14\xe0\xea\x49\x91\x80\xfb\xc7\x98\x40\xce\xed\x13\xcc\x6b\x24\x58\xbf\xab\x9b\x0d\xd7\xae\x9d\x86\x46\x1f\xe2\x15\xe7\xc9\xf6\x3f\x76\x8c\xee\x4a\x88\x2d\xf0\xdd\x84\xe3\xeb\x4f\x2d\x7f\x6b\x18\xfa\x57\xd8\xbc\x7d\x9a\xfb\x63\xc2\x1a\xc4\x65\xe7\x90\x3b\x9b\xfb\x86\x38\xa2\x93\x61\xf7\xeb\xfc\x6e\x54\xe5\x46\x5a\x6c\xef\x46\x3a\xe2\x26\x43\xae\x41\x02\x58\x77\x9c\xa7\x4b\x70\x40\x1a\x94\x55\xa4\xd1\x57\xd7\x4a\x70\x29\xef\xe6\xb5\x19\xa8\xc4\xbe\x69\x67\x56\xe0\x45\xae\x40\x81\xb7\x7d\xd6\x03\x1f\x0d\x25\x0f\xa7\x61\xe6\x0f\x85\x9d\x90\x63\xfc\x10\x5a\xa0\xa1\xa7\x45\x0a\xf1\x53\xe7\x05\x47\x77\x77\xc4\x42\x58\x6d\xf4\x07\x40\x2b\xa2\x38\x75\x2f\xae\xf7\x4f\x33\x45\xc2\x6a\x45\x33\xbe\x9a\x61\xf5\xfc\x6b\xde\x48\xe3\xcb\xa7\x5c\x04\xd6\xf7\xb3\x33\xe3\x70\x06\xdd\x0c\x94\xfd\x3b\x6a\x13\x0b\xd6\xfc\xdb\x3c\x6a\xbe\x21\xca\x60\xeb\x43\x1c\xc2\xd8\xa2\xec\xe7\x16\x9d\x2d\xcf\xce\x27\x60\x82\x56\x57\xfd\x4c\x26\xf3\xc3\xb8\x30\xac\xdf\xd5\x08\x01\x1d\x14\x76\x4b\x3b\xe9\x17\x15\x57\x1a\x31\x83\x01\x8e\x0d\x22\x1f\xb9\x53\x2b\xb2\xe1\x71\x1e\x72\x5a\x27\x3a\xe0\xcc\x2f\xac\xcb\xa7\xd5\x50\x49\x29\x45\x9c\x99\x25\x17\xb0\x5c\x1d\xdd\x03\xaa\xcc\xd9\x37\xb8\x6e\xb6\x7b\xc8\x20\x2d\x01\xca\xb3\xd4\x89\x58\x6e\xea\x1a\xcc\xa7\xdc\x20\xcd\x0b\x64\x75\xc2\x58\xff\x67\x36\x61\x49\x6a\x22\xea\x96\xb8\x9d\xb4\xbf\x3f\xca\xae\x3b\xb0\x4f\x67\xdb\x09\x6a\x47\xff\x7e\x1e\xe2\x39\x56\x2d\xc1\x0d\x40\xf0\x53\x94\x4f\x3d\x7b\xcc\x3f\xf4\xc0\xff\x76\x56\x54\xba\x5e\xa6\x4f\x0e\xa6\x3e\x45\xa2\x1d\x9b\x12\x94\x9f\x14\xf7\xea\x70\x74\xe9\xb6\x59\xc5\xc5\xd4\x48\x16\x84\x2d\xe8\x96\x98\xa8\xfc\xca\xce\x43\xeb\x6b\x41\x35\xe0\xb3\x33\xac"}, +{{0xf2,0x6a,0xf2,0x10,0xe3,0xb2,0x01,0x73,0x99,0x0c,0x77,0x45,0x92,0x2c,0xdf,0x94,0x24,0x77,0x3a,0xbb,0x37,0x4d,0x77,0x7a,0x51,0x2c,0xf5,0xb9,0x7b,0x3a,0x00,0x0d,},{0x54,0x58,0x6a,0xbf,0x04,0x11,0x76,0xe0,0x6a,0xec,0x5b,0x60,0x10,0xe1,0x90,0x91,0x6d,0xa5,0x4a,0x8c,0x4b,0xde,0x28,0x8c,0xf2,0x4d,0x8c,0x10,0x7c,0xb3,0xb7,0x30,},{0xce,0x45,0x45,0x30,0xb9,0x22,0xba,0x5e,0xa1,0x62,0xf1,0xa4,0x52,0xe0,0x5c,0x00,0x36,0x3a,0x49,0xa9,0xdb,0x8a,0x56,0x94,0x97,0xc0,0x0c,0xaf,0x1c,0xbe,0xa9,0x91,0x80,0x77,0x05,0x54,0xed,0x4e,0x31,0x40,0xdf,0xca,0x45,0x55,0x15,0x9e,0xbf,0x48,0xef,0x5d,0x2a,0x50,0xf3,0x94,0xae,0xbd,0x78,0x21,0x16,0xed,0x65,0x69,0xa4,0x09,},"\x88\xe2\x6d\xa3\x5c\x54\x88\x4b\x47\x14\x6f\x4e\x3f\x01\x4a\xb6\x5b\x3d\x71\xaa\x7e\x3c\x33\x91\xad\xbe\xb1\x9e\xf2\xe7\xb9\x30\x2e\x28\x19\x91\xb2\x61\xb6\xa0\x99\x2e\x2e\x89\xa4\x9f\x48\x0c\xa2\xd8\xe6\x84\xb1\x2f\x9b\x15\x09\xb3\x8f\x6a\x7a\x98\xa5\xdd\xb4\xc2\xd8\x69\xfd\x03\x18\xe9\x8e\xcd\x8f\xd9\xdf\x49\x1b\xaf\x99\xa9\x29\x4d\xe4\x9e\x1c\xf8\xdd\x41\xee\x85\x73\x0a\xf0\x25\xa7\x01\x14\x3e\x4f\x0c\x8e\x3d\x92\xd5\x5b\x59\xca\x7d\x4a\x6c\x89\xad\x76\x0d\xff\xc0\xc2\x18\x92\x09\x50\x8e\xf6\xc2\x21\x4e\xdf\x99\x67\xb1\x7d\xef\x12\x3d\x86\x92\xc9\xe4\xe2\x0b\x1e\x98\x26\x88\x08\x70\x4f\x5f\x9f\xe1\xa6\xd6\x05\x5e\x32\xc8\x72\x56\x4b\xd1\x7e\xdb\x73\x59\x57\x86\x29\x01\x7f\x0c\x30\xfe\xab\x8b\x50\x4e\x22\x89\x23\xad\xc7\xe8\x1a\xe2\x0a\x85\x2d\xb0\xad\x67\x6a\x78\xe0\x81\x33\x6d\x6b\x04\x02\xf9\xcd\xc5\xd5\xe9\x01\x28\xca\x94\x5d\x10\x51\x5c\xa0\xc5\xef\x03\xf7\x31\xb1\xd4\x0a\x71\x07\x41\xd4\x1c\x1d\xd1\xca\x16\xb1\x06\x0f\xeb\xf2\xa0\x53\x2e\x6f\x5d\x76\x51\xef\x44\x63\x75\xec\x18\x09\x0c\xb8\x41\x8b\x82\x02\xf2\x5a\x03\x89\x03\x1b\x30\x7f\x22\x3c\x5b\x5f\x6a\xfe\x36\xa9\xad\xc1\x06\x8f\x2c\x6e\x0e\xa5\xb2\xb6\xcf\xeb\x8d\xc0\x04\xf7\xb8\x29\xc8\x04\x39\x06\x9b\x81\xa7\xbd\x90\x74\x77\xc6\x13\x5e\xf2\x82\xb7\x71\xf1\x41\xdb\xe7\x5a\x0f\xa0\x56\xe0\x6b\x8a\x1a\x1f\x98\xc2\x5f\xa5\x4d\x14\xc8\xfd\xb4\x2d\x65\x02\x59\x5c\x59\xd2\x5b\xac\xf1\xa1\x9a\xde\xfc\xc1\x31\x70\xf7\xa4\x31\x7b\x6a\xb6\x10\xb6\x09\xd4\x14\xb0\x07\x3e\xa0\x4a\xc2\x9e\xb1\x0e\xe7\x3c\xd7\x1a\x4c\xa6\x04\x09\xf8\xe7\x60\xe6\x0f\x93\x95\x10\x10\x0d\x0c\x8c\xd7\x6f\x26\x4b\xb3\x78\x11\xf9\x7a\xa5\x29\x9a\xc0\xb1\x2d\x41\x68\xff\x38\xec\xdf\xa8\x0b\x1e\x5c\x1b\x3b\xbd\x4d\x40\xd3\x54\x47\x35\xdf\x71\x67\xeb\x15\x8a\x9a\x9a\x23\x4d\x44\x5f\x1d\x66\x3d\xed\x71\x71\xed\xc6\x8d\x17\x2c\x92\x21\x4b\x82\xef\x13\xfe\x6b\x8c\x43\xaa\x89\xb7\x39\xb4\x99\x0a\xe9\x47\xa3\x4f\x02\x0a\x8d\x89\x43\xb0\xf7\xa5\xd6\x1d\xfa\x76\xad\xde\x02\x72\xe9\x8c\x11\x59\xc0\xfd\x8a\x1d\xe3\x3f\x2c\xef\x8e\xdd\x32\x85\x7b\x21\x89\xed\x96\x12\x80\x57\xeb\xde\xa8\x1f\x7a\x3a\x3d\xff\xe1\x89\x3b\x5b\xa8\x77\x55\x6c\x90\x38\x3f\xa2\xc5\xa6\xfd\x68\x0e\x8a\x67\xde\xe4\x80\x2d\x90\xdf\xe9\x71\x62\x3a\x7b\xe2\x2a\xb3\xca\x56\x06\x7b\x1e\x5c\x69\x4a\xa8\x4c\x19\xf1\x6d\x69\xe2\x84\xdd\xfa\x03\x9c\x10\x8d\x04\x35\x81\x38\x12\x39\x0d\x8e\xbc\x1e\x50\x13\x81\x76\xf2\x59\xdc\x0f\x26\xbc\xa1\x3b\xc9\x43\xf5\x0d\x5a\x35\x00\xb1\x8d\x59\x35\x74\xc6\x20\xfc\x09\x7a\xce\x43\x0f\xb8\x07\x28\xd3\xa1\xaa\x64\x4e\x50\x4b\x10\x09\xad\x67\x53\x6c\xeb\x01\x1f\x2a\x35\x7d\xbd\x00\x9e\x4a\x63\xf5\x24\xd5\xb5\x95\x7f\x33\x15\x67\xc5\xb4\xd1\x85\xa6\x1d\xf2\x2d\x70\x71\xd3\x1a\xe9\x21\x41\xe1\x99\xc1\x22\x89\x51\x5a\xed\x80\xc9\x10\x21\x45\x6b\xcd\x45\xcc\xc6\x34\x03\x7d\xcf\x69\xb4\x1d\x6b\x1f\xf5\x34\x71\x01\x0d\x99\xf1\x87\xf0\x46\x54\xf4\x36\x22\x28\x78\x71\xfe\xe6\xdc\xf5\xf3\x02\x3c\xbd\x09\x13\xd9\x9a\xff\x43\xfa\x95\xb3\x2e\xa2\xb1\x33\xb4\xc9\xac\x4b\x01\x7b\x7c\xf8\xf9\xbe\x50\x86\xfe\x92\xb4\x2c\xb8\xdb\xed\x5b\x63\x0b\xf0\x97\xc1\x8e\x2e\x55\xc3\xdd\x93\x27\x1e\x09\xc2\xd1\xcc\x6a\xf8\x7d\x83\xfd\xef\x3c\x3e\x3c\x4c\xba\xfb\xea\x9b\x60\xfd\x5e\x9c\xf0\x01\x1d\xe2\xe9\xe2\x6f\xbf\x09\xaf\xee\xf5\xc6\x98\x02\xa6\xc4\x6b\xdf\x54\xc1\x45\x86\x29\x44\x17\x3e\x01\x7e\x30\x14\x9e\xa5\xc0\x3c\x7a\xef\xa2\x8a\x9c\xac\x77\x67\x00\x2e\xa3\xfe\xfb\xde\xae\x5b\xae\x00\x5c\x37\x0d\xbc\x06\x42\x44\xd5\xb9\xbe\x55\x00\xa3\x57\x26\xa9\x9b\xc9\xe8\xc2\x75\x2d\x51\x0e\x13\x9a\xf2\x25\x58\x00\x98\xc8\x18\x9a\xa9\xc5\x20"}, +{{0x39,0xbf,0xfe,0x00,0x7f,0x8d,0xf7,0xce,0x4e,0x56,0xfd,0x17,0x6b,0x10,0x2b,0x92,0x3b,0xa4,0x8a,0xeb,0x82,0x69,0xfd,0x0c,0xd5,0x20,0xc2,0x3a,0x7b,0x23,0x6e,0x6c,},{0x95,0x32,0x63,0x68,0x00,0x01,0x0b,0x3d,0xd4,0x01,0x2e,0x34,0x1f,0xca,0xd6,0xd2,0x9a,0xfa,0xd4,0x84,0xe6,0xfd,0x73,0x6e,0x89,0xd5,0xbc,0x02,0xba,0x0a,0xc8,0x53,},{0xa2,0x7c,0xca,0x4b,0x9f,0x5b,0x95,0xad,0x0e,0x44,0xe4,0x74,0x0c,0x15,0xde,0xae,0xb9,0x3f,0x22,0xa9,0xb2,0x54,0xeb,0xbd,0x23,0x29,0x36,0x5a,0x00,0x96,0x6c,0x9f,0x4e,0xc1,0xe5,0x5c,0x58,0x94,0xe7,0xbf,0xc2,0x3d,0x39,0x8d,0x39,0x70,0xb9,0x46,0x5e,0x98,0xa8,0xd2,0x3e,0x72,0xda,0xe8,0xe3,0x50,0xda,0x35,0x31,0xae,0x69,0x08,},"\x7a\x8c\x20\xbf\x2e\xff\x69\xaf\x8b\xad\x6b\xdf\xab\xc7\x90\x9c\x58\xce\x74\x6c\xc4\xdf\x78\xb6\x9b\x33\xc1\x05\xba\x3b\xd8\xda\x75\x24\x47\x58\xb5\x17\x2d\x5c\x45\x01\xbc\x39\x97\x01\x85\xee\x3d\x43\x70\x83\xa9\x95\x9f\x81\xe7\x66\x5b\x82\x9a\x69\xa5\xd7\x2e\x03\x4d\x35\x1a\xdd\xdc\xeb\x3d\x3f\xff\x58\x99\x88\xdf\x18\x2b\x46\xfa\x53\xd2\x6e\x7c\x9e\xac\x06\x22\x15\x78\x8f\x23\x37\xbf\x90\xf0\x17\x7d\x8c\xa7\x44\xf9\x5f\x28\xfe\xa8\x54\x59\x3c\x43\x62\xc8\x2e\x9d\xed\x19\xb9\x04\xff\x99\xd2\xbe\xa8\x24\x32\x82\x2e\x52\xc3\xda\x6d\x46\x2d\xa7\x54\xff\x1f\x8b\xd1\x09\x94\x2d\xf5\x1d\xba\x25\xb7\xcd\xe8\x38\xd5\xf5\x24\x23\x9f\x13\x31\xf4\x63\x19\x4e\x10\xff\x56\x79\x5b\x29\x68\x78\xfe\xb1\xf5\x5d\x43\xec\x7d\xaf\x0c\xa5\xab\x3d\x68\x4b\x55\xbb\x0a\xa4\xc7\x20\xd4\xb5\xc2\xe8\x30\xc8\x58\x69\x4d\x3d\x0f\xdb\xaa\xd0\xbf\x67\xd8\x73\x18\x2d\x95\xb2\x41\x2f\xce\x5e\x7b\x00\xfa\x6b\xfc\x38\xb1\x32\xef\xb9\x6f\x87\xbc\x6c\x10\x07\x0a\x57\x16\xec\x9b\x33\xa2\x69\x2c\xdf\x5b\xc4\x1c\x7f\x73\x7e\x28\xc4\x22\x03\x17\xa4\x89\xb7\x32\x3d\x5e\x20\xf6\x5d\x37\x5d\x76\x9f\x9e\x79\x37\x6f\xd0\x2d\x85\x36\x86\x71\xe7\xe0\x81\xeb\x75\x3f\x88\x85\x45\xeb\xe5\xc0\x00\xb2\xf8\x01\x43\xeb\x35\x8d\x43\x18\x5e\x2f\x1c\x29\x4b\x9f\x29\xc8\xbb\x91\x48\x2d\x43\x87\x49\x4a\xad\x17\x6d\xeb\x85\x54\x0f\xd0\x05\xc9\x7d\x13\xe6\x66\x3f\x09\x94\x4e\xb4\x3a\x46\xe6\x23\x67\x94\xbf\x6e\x21\xf8\x1d\x0a\x42\x09\x0f\x9c\xce\xf9\x0a\x6c\x48\x07\xb5\xff\x54\x13\x00\xe5\x93\x48\x81\xa8\xd9\x21\x96\xb4\xce\xe8\x5d\x28\x09\x2a\x82\x8e\xa3\xbf\xc6\xb7\x45\xad\x21\x9b\xe9\xf5\xe9\x57\x41\x17\xd0\x79\xe0\x2f\x4b\x74\x8e\x2c\xc0\x1a\x32\x82\x6a\x37\x08\x23\x19\x14\xd2\x77\x2c\x76\x41\x19\xfd\x99\xd5\x3a\xb5\xb5\xa2\xe9\xd8\x91\xa4\x8a\x9a\xaa\xac\xc2\x63\x38\xb1\x82\x48\xdb\x8a\xb2\xd5\x25\xda\xf1\x5f\xf5\x3a\xcb\xc3\xaa\x98\xd4\xf2\xd4\xa3\x37\xbb\xaf\x6d\x1b\xe2\x19\x85\xa4\xaf\x60\x0e\x29\xbb\xb4\x2c\x8d\x89\xe6\xb3\x89\xc6\x6f\x42\x27\x0c\x3a\x0b\x05\x1b\xdb\x62\x38\x81\xe0\x2f\x2f\x42\x94\xce\xc3\x47\x63\x86\x74\x7a\xba\xe6\xc7\x70\x0b\x8f\x9b\x03\x87\xcd\xdf\xb7\x36\x68\xfb\x57\x69\x3d\x84\x74\x19\x6b\x33\xab\xd1\x2d\xce\x59\xa5\x7c\xf7\x2e\xe6\xcc\x1d\xdb\xaa\xdf\xb1\x9e\x90\xaf\x81\x31\xb3\xa9\x0f\x98\x67\xf4\xc7\xe1\x5b\xdf\x9e\x21\x84\x77\x01\x6b\xd0\xad\x3b\xe8\xdd\x05\x96\x71\xff\x65\x6c\xbd\x4e\xd8\x98\x08\x6d\xe4\xd4\x23\xf3\xdf\xb2\x70\xbb\xf1\x9d\x9f\x53\xf7\xf6\xf2\xd2\x2c\x6a\xc9\x02\x5c\xba\xdb\xa4\x42\xe3\x1d\x98\x11\xe3\x7e\x84\x7d\xbd\x48\x4d\x80\xcf\x74\x30\x39\xff\xa7\x04\x84\x70\xfb\xdc\x60\x80\xf6\xd3\x81\xdc\x7e\x3f\xa2\x71\x22\xdf\x53\xcc\x06\x39\x4e\xa6\xfc\x44\x6e\x1b\xa7\x25\x38\x73\x3e\xd3\xab\xb6\x85\xf1\x6d\xfd\x5c\xcf\x58\x5a\xe8\xfb\xf9\x95\x4b\x50\xf1\x0b\x7e\x54\x32\xa2\x2b\x36\x94\x06\xa9\xb7\x08\x89\x61\xf0\xae\x20\x74\x95\xae\x71\x85\x39\x6d\xcc\xf2\x92\xdc\x46\x3f\x41\xf3\x76\xa1\xca\x89\xee\xfb\xae\x19\x26\x91\x52\x03\x1b\xfd\x81\x52\x88\xe8\xb5\xba\xf3\x48\xc4\xf8\xff\x3d\xff\x4f\xd6\xd1\x08\xf8\x71\xda\xa3\x52\x11\x0f\xa6\x41\x88\xb0\x1b\x85\x26\xa8\x45\xaa\xed\x13\x3e\x45\x6b\x4c\x83\xc4\xfd\x4b\xbb\x16\x5b\x40\x90\x30\x7e\x8e\xb1\x7d\xf1\x76\xc3\x22\x52\x0f\x37\x59\x9c\x21\x05\xaa\x81\x20\x75\x83\x94\xa4\x22\x24\x73\x47\x67\x64\xcf\x0a\xf7\xc5\x51\x83\xeb\xa9\x68\x3d\x72\x70\x63\x14\x43\xf3\xc5\x1f\xb8\xab\x0c\x13\x0a\xc4\x36\xab\x60\x3f\xf4\xf1\xd8\x65\x6c\xdb\xed\x22\x9a\x20\x2b\x40\x00\x8e\xa1\x0b\x17\x15\x42\xf7\x4a\x70\xb7\xbb\xac\xc4\x01\x6b\x7f\x63\x6a\xa8\x96\x33\xb7\x66\x80\x58\xf1\x33\x12\xf5\x7c\x51\x62\xd1\x8e\x39\x9e"}, +{{0x3c,0x40,0x80,0xcd,0xa0,0xfc,0x3c,0x03,0xb6,0x14,0xd9,0x80,0xf2,0xff,0x83,0x1f,0x5b,0xe0,0xe7,0xa9,0x81,0xd5,0x38,0x1a,0x16,0x18,0xe0,0xb8,0xfd,0x00,0x17,0x76,},{0xf1,0xc3,0x26,0x9d,0x87,0x04,0x02,0xca,0xa4,0x38,0x82,0x13,0x5d,0x9d,0xba,0xdb,0xbb,0x16,0x2d,0xfc,0xa0,0xb3,0xda,0xd1,0x97,0xe6,0xb8,0xa7,0xee,0x67,0x9a,0x70,},{0xc9,0xd4,0xa4,0x72,0x8b,0x8f,0xdd,0x24,0x0d,0x9c,0x49,0x8a,0xa3,0x5d,0xe9,0x5a,0x4b,0xbd,0x51,0x78,0x5b,0x73,0xc8,0x40,0x3f,0xdf,0x04,0x0d,0xfa,0xed,0x94,0x47,0xef,0xad,0x00,0x69,0xb6,0x7c,0x78,0x3d,0x4b,0x81,0xd9,0x66,0xbe,0xf6,0xe3,0xd9,0xa8,0x08,0xa0,0x58,0x4b,0x98,0xec,0x2b,0x18,0x32,0x2c,0x4c,0x92,0x0e,0xb0,0x0a,},"\x0c\xee\xbc\x0e\x8a\x47\x72\x0f\x25\x83\x5e\x2b\x9a\xcf\x89\x1b\xcc\xa4\xbd\xa3\x86\x37\xf3\x63\x27\x44\x58\xba\xa9\xe2\xbb\xaf\xed\xd0\x93\x8f\x56\x88\x73\x4e\x22\xac\x50\xfb\x12\x0f\x66\x5f\x6c\x4c\x61\xc6\x53\x17\x39\xb9\x29\xac\x83\xcd\x77\xf8\x96\x3b\x75\x44\x88\xb9\xb8\x59\xc1\x38\x53\x63\x7c\xf0\x25\xc1\x4e\x8f\xdd\x11\x8f\xaa\x14\xcf\x39\x30\xce\xb3\x5f\x10\x4d\x95\x44\x1e\x56\x48\x94\x40\xf6\x20\x41\xef\x1a\xa7\xc4\xb0\x8b\x28\x07\xe3\x2b\xb9\x58\x4b\x90\x04\xd7\x6e\x76\x53\x33\x48\x50\x6d\x64\xf1\x12\xe1\xff\x6f\x93\x8f\x64\x22\x30\xbf\x38\xaf\x01\x0e\x41\x98\x72\x70\x24\x8b\x13\x63\x5a\x35\x67\xb3\x55\xbb\xa5\xb5\x74\x48\xc6\xd1\x3b\x74\xf3\xbe\xbf\x61\x79\x15\x82\x10\x28\xfc\xa5\xde\xfa\x4c\xe5\x42\x4c\xa1\x91\xcd\x54\xa2\x29\x44\xa3\xd9\x40\xe4\xee\x2e\x2b\xa5\xd5\x04\xc8\x5f\x95\x9b\x51\x4c\x4f\xab\x41\xcc\xb5\x74\x3d\x9c\xb2\xf9\xbf\x33\xd1\xd8\xc2\xa5\x86\x9e\x9f\x46\x60\xc3\xfb\x22\x4b\x39\x14\x1e\x31\x10\xc9\xee\x8a\xeb\x87\x1e\x14\xc6\x2c\x6b\xe3\x8f\xb9\xa4\x56\x8d\x73\x68\x10\xbb\x9d\x20\x73\x17\x8b\x6c\x7e\x87\xe3\x58\x2e\xfc\x62\xb5\x3c\x23\xc5\xd4\x65\x20\xba\x33\xff\xb3\xa9\xca\x64\x9e\xf2\x6f\xe7\x4a\x3c\xff\x61\x88\x42\x73\x26\xb8\xc9\x6f\x74\x35\x4c\xb3\xec\xaa\x61\x1b\x12\xcd\xed\x56\x5e\x59\xfe\x1f\x8f\x40\x00\x97\xe9\x3e\xa8\x59\x51\xb5\xb4\xe9\x00\x9e\xea\x7d\xb9\x37\xe4\x34\x9c\x4e\x5e\x00\xc4\x45\x6c\x6c\x5f\x4e\x57\x41\x1b\xaf\x4e\x46\xe7\x00\xac\x40\x02\x57\x76\x5f\x48\xda\xb0\x3e\x43\x9f\x76\xc1\x49\x9b\x51\x08\x04\x7c\x83\x01\x09\xdc\xe7\xf7\x40\xd1\x39\x37\x87\xe2\x9d\x37\x16\xd3\xc4\x7e\x75\x5c\xb8\x28\xe7\xd4\x40\xa9\x71\x97\x51\x97\xeb\xdb\x3f\x9b\x73\x7b\xa1\x1f\x7f\xd0\x38\x6a\x95\x92\x49\x01\x7d\xe7\x23\x4d\x5e\x5a\x9b\x47\x3b\xb9\x58\x3a\x37\x42\xc7\x74\xee\x55\x2a\x12\xa1\xf3\x6e\xb3\xf2\x6c\x88\x5b\xed\x22\xe9\x1c\x74\xcf\x32\xa8\xdd\x3e\xdb\x08\xb6\x74\xbf\x38\x6e\xf4\x27\x72\x79\x12\xd5\x7c\x5f\xaf\xaa\x1c\xfe\xb7\x40\xcd\x52\xb9\xde\xe9\x95\xe3\xd0\x16\x1c\xd9\x21\x3f\x38\xfd\x68\x1d\x53\x8a\xb8\xbf\x97\xb7\x45\xf5\x49\x80\x03\x0e\xf8\xb7\x26\x96\xd4\xe2\x74\x73\xfb\x0f\x1a\xcd\x5d\x0a\xae\x02\x97\x21\x16\x80\xea\x0f\xc5\x9d\x7b\x6d\x51\xc6\x32\x92\x58\x5a\x1d\x55\x3d\x0c\x89\x54\xb4\x2a\x4b\xd6\xfc\xd3\xa4\x95\x75\xbf\x5c\x88\x95\x3f\x1f\x4e\xa7\xfe\x0e\xd7\xa5\x79\xd1\x69\x7e\x64\x5e\x2a\x61\xc6\x9d\x1a\x56\xbc\x60\x5b\xb0\x40\x60\xa2\x77\x8d\x50\x9a\x8a\xad\xbf\x35\xd9\x46\x97\xcc\xee\x9d\x35\x43\xdd\x01\x28\x1a\x03\x1f\x2a\x0e\xb3\xa9\xeb\x13\xae\x56\xff\x44\xfa\x0a\xed\x4f\x34\x88\x74\x7d\x6a\xf8\x20\xf3\x98\x9b\x71\x33\xf4\x49\xea\x56\xd3\xa7\xf7\x31\xe7\x91\xb7\xed\x2a\x5d\xb9\x39\xbb\x75\x35\x2d\xe7\xda\xec\x50\x66\xfd\x57\x55\x71\x65\xad\xff\xa6\x31\xcd\x3f\x96\x7c\x3c\x7c\xfc\x11\xcc\x1f\x14\xfa\x23\xde\xfe\xc3\xeb\x02\x39\xb4\x5e\xd6\x01\xa3\xa8\x07\x8c\xcf\xc7\xf8\x38\x09\x02\xa8\x59\xee\x9c\xe2\xdb\x79\x5e\xfa\xca\x0a\x01\xdc\x08\x79\xd5\x06\xac\x97\xd1\x07\x04\xd7\x75\x7b\x3c\xcf\x3b\x37\xc3\x39\xb4\x2d\xb2\x37\x82\x27\x80\x23\xe4\xc2\xe7\x7d\x74\x24\x6c\x9e\x54\x41\x49\xa5\x5c\x0c\x92\x0e\xbf\x29\x86\xb4\xc5\xb4\xb3\x57\x2f\x74\x8c\x4b\x15\xc7\xf8\x63\x99\x9b\xc5\x13\x2a\xda\xd0\x97\x61\xeb\x76\x50\x50\x19\x76\x9f\xb5\x54\x22\xf6\x03\x18\x4e\x24\xc0\xd4\xf3\x76\x19\x87\xb5\xc5\x0f\xea\xfc\xce\x53\x30\x2a\x3a\x41\x5e\x20\xf5\x6a\x05\x48\x03\xe5\x53\xba\xcd\x24\x2a\x5e\x13\x64\xaa\x3b\x2d\x7c\xb3\xbc\x1e\x1b\x86\xa4\x74\x31\xcb\xd3\x96\x95\xb6\x7f\x55\x4c\x46\x45\xb7\x23\x69\x04\x09\x4c\x11\xaa\x1b\x40\x32\x6b\xa9\x1b\x8b\xf4\x87\x3e\x9a\x4d\xe0\x4e\x2b\xf4\x62\x59\x72"}, +{{0x45,0x43,0x8f,0x91,0x46,0x5d,0x74,0xa2,0x82,0x5b,0x0f,0x66,0xa3,0x5b,0xd7,0xc8,0xd0,0x05,0x86,0x54,0x79,0xb3,0xdc,0x10,0xa9,0xb5,0x6f,0x29,0x7d,0x31,0xb9,0x26,},{0xf0,0x92,0xb5,0x88,0x03,0x30,0x87,0x1e,0x5a,0xaf,0xdd,0x3c,0xeb,0x38,0x50,0xee,0x7e,0x09,0x41,0xa2,0xa1,0xdc,0x89,0xf4,0xfb,0x47,0x71,0xd7,0x5a,0x22,0xf6,0xf2,},{0xd9,0x28,0x7b,0x7f,0xec,0x01,0x7f,0x2e,0xa4,0x0a,0x14,0xa1,0xf6,0x2d,0xca,0x78,0xb0,0x2a,0x3d,0x66,0x32,0xdf,0x7c,0x60,0xeb,0xd9,0x0f,0xc5,0xe4,0x92,0xc5,0xc6,0x2c,0x43,0x16,0x6b,0xf8,0x56,0x58,0xfb,0x30,0xa0,0x8b,0x57,0xa5,0x81,0x31,0x21,0xb8,0x03,0x97,0x57,0x1a,0x31,0x2b,0x6d,0xd1,0x1b,0x65,0x39,0x20,0x54,0x16,0x02,},"\x30\x71\xd4\xb7\x20\xdf\x10\x93\x65\x99\x67\xcd\x4e\xef\xef\x2e\xf9\x67\x84\x75\xf7\xde\xc5\x8f\xec\xec\x1d\x92\x8d\xea\xf8\x02\x45\x7a\x19\x34\xe6\x04\x55\xf4\x96\xcf\x42\x51\x82\x0e\xd6\x0a\x3d\x81\x33\xb6\x24\xd3\x3a\xf2\x6a\x26\x27\x84\xb5\xa2\xfb\xa7\x3c\xca\x2a\xa5\xe5\x19\xe1\xf5\x39\x58\x47\x80\x64\x98\x64\xba\x5f\xbc\x1f\x01\x1d\xdd\xac\x38\x1f\x8d\x48\xd0\xd6\x0c\xe8\x23\x17\x01\x17\x3c\x9d\x2a\x30\x7a\x76\x30\x2e\xbc\x69\xdc\xbc\x93\x0d\x28\x43\x14\x75\xb5\x16\xf9\x8f\x77\x8e\xd2\xe1\xff\xf2\x72\x90\x9a\x27\x2c\xc3\xfb\xb6\xb3\x1c\x80\x41\xa3\x7c\xb7\x77\xe0\x62\xe4\x96\x49\xaf\xad\x12\xc1\xb5\xf7\xfc\xb8\x06\x5a\x99\xe7\x42\x33\x62\xad\x16\x90\x60\x31\x26\x5d\xb7\xe8\xb8\x97\x51\xf8\xa4\xa4\x07\xf2\x50\x26\x50\xfe\xd7\x53\xe4\x2c\x8c\x91\x1e\x50\xb9\x4b\x38\x00\x69\x5b\x0e\xba\x7d\xff\x06\xb7\xa7\x10\x11\x7e\x49\x20\xd4\xb1\xc6\x05\xa3\xeb\xf3\x2e\x06\x96\x67\x16\xed\xa1\x4b\x30\x42\x99\x8a\x3c\x7a\x5e\x9f\x83\x54\x2d\x7d\xde\x65\xe5\x28\xbe\xd6\x10\x1d\xeb\x33\x1d\xeb\x94\xcd\xd4\x60\x44\xbe\xf8\x8c\x09\x7b\xaf\xd4\x0d\x69\x21\xa7\xc4\x84\xc8\xf9\x66\x84\xdc\x37\x16\x71\xd9\x4e\xee\x7c\xbe\x5d\x58\x77\x15\x31\x4c\xff\x0d\x18\x77\x27\x2d\x81\x90\xa9\x0e\x18\xbf\xb3\x21\xd5\x2b\xf7\x47\x05\x13\x7b\x2a\xbf\x91\x65\x73\x17\x67\xa1\x3a\xdc\x9c\x85\xe0\x39\x7b\x47\xae\xf9\x6b\xad\xb2\xca\x7f\xcb\x82\x93\xb0\x1f\xd1\xde\x31\x6e\xe1\xe6\x5f\x35\x6b\x9d\x6e\x8e\xa1\xfd\xd8\x37\xbd\x96\x08\x11\x49\xea\x2d\xcd\x73\xc4\x88\x1f\x32\xb7\xde\xeb\xc3\x71\x5e\x2d\x7c\xdb\x64\x3e\x0d\x98\xf4\xe8\x46\x50\x8b\x04\xb3\x24\x39\xff\x14\xb1\x16\x4f\x46\x84\x6d\xf9\xaf\xae\x44\x46\x4c\xf5\x50\x10\x4c\xd3\xaa\xb3\x81\x75\x40\x47\x0a\xaa\x2a\xb9\x55\x9a\x68\xb7\xff\x6b\x1b\x9c\x0c\xe9\xf5\x86\x9c\xbd\xcd\xd6\x17\x09\x09\x42\xe3\x53\xb4\xc7\x7f\x09\x39\x58\x96\xbe\xcd\xdf\xf1\xab\x7f\x07\x58\x6a\x51\x4d\x81\xfb\x09\x63\x61\x55\x75\x66\x87\x0f\x16\x91\x98\x34\x85\xa8\x0c\x34\x13\xda\x98\xb8\xd1\x9c\x78\xe6\x37\x9f\x94\x3e\x5b\xd5\xa5\x69\x7a\xa3\x3c\x5e\x6b\xfc\xfb\x7b\x8d\xf1\xe1\x57\x4e\xe4\x16\xfa\xb3\xc8\xa7\xd0\x88\xb3\xa0\x57\xcf\x86\x53\x21\xb7\x4e\x61\x03\x52\x6d\xd9\xad\x15\xca\x5a\xd3\xc0\xf6\x97\x18\xe2\x70\x81\xd4\xb3\x4a\x7c\x6d\x1a\xab\x6b\x96\xc0\xa7\x54\xb9\x89\xb4\x94\x06\x38\xc9\xed\xe3\xd1\x7b\xd4\x9f\x65\xbf\x78\x3d\xc8\x5f\x1c\x4b\x14\x48\x76\xcd\xbd\xb2\x28\x2a\x95\x64\xaa\x81\xb5\x70\x92\x08\x0d\x64\x48\xfb\x65\x80\xec\xf0\x9f\x82\xa7\x55\x01\x0d\x55\xd4\xa5\xe4\xf3\x05\xe2\x59\xdb\xe9\x95\x08\xb4\x79\x25\x0d\x80\xec\x17\xc8\x76\x0a\x93\xe0\x5a\x29\x57\x1f\x68\x56\x07\x30\x22\xc8\x70\x69\x13\xc4\x6a\x2e\xfd\x2e\x9c\xaa\xe4\xff\xa1\xb4\x22\x2e\x3d\x70\xe9\x79\xe8\x1a\x71\x95\x1d\x7c\xb8\x30\xbc\xbc\xf9\x01\xaf\x24\x4f\x64\xe4\xad\x9f\x52\xfa\x3b\x62\x03\x1e\x35\x16\xda\x50\xbc\x2b\xce\x78\xeb\x9d\x61\xbf\xed\xd9\xb3\xf5\x7e\x89\x35\x5f\x17\x7d\xb6\x16\x2b\xf6\x1d\xa0\xe4\x54\xc3\x42\x88\xb9\x67\xc3\xfb\x4c\x34\x1b\x32\xd4\xd1\x3a\x31\x98\x69\xb8\xe3\x60\x46\xf9\xe3\x38\xb5\xf3\x6a\x1f\xc1\xa7\xed\xa7\xd7\xb0\xd4\x38\xe0\xa7\x5d\x84\xbb\xe4\xd6\x8c\x87\x9a\xda\x80\xdd\xe2\x3f\x71\x55\xb5\x32\xcc\xcf\x7a\x63\xf1\xbe\xdf\x84\xf8\x2f\x44\x0c\x9e\xc3\xcb\x0e\x45\xf3\x2c\x92\xf7\x64\x38\xf5\xb4\xb9\x10\x44\x1e\x67\x38\xaf\x3f\x5d\x20\x50\xd5\x79\xee\x96\xb8\x8f\x3b\x00\x81\x0a\xb1\x26\xff\x3a\x8f\xef\xd9\x71\x04\x43\x24\xdd\x4e\xb3\x44\x7d\xac\x5b\x77\x80\x9c\xda\x8c\x71\x68\x25\x49\xd7\xcf\x2d\xce\xe3\x40\xed\xcf\x94\x94\xac\xa4\x29\x01\xe2\xc1\x1e\xd9\x77\x90\xaf\x48\xbc\xea\x29\x52\x1e\xf0\xe3\xd0\x3c\xda\xde\xcd\xc8\x94\xdd\x07\x56"}, +{{0x72,0xcf,0xce,0xf4,0xc9,0xd6,0xa1,0x98,0x6d,0x19,0x03,0x11,0x84,0x0e,0x55,0xcb,0xaf,0xac,0xc8,0xa6,0xeb,0x5e,0xcc,0x72,0x93,0x4f,0xda,0x53,0x5b,0xdc,0xff,0xb2,},{0xa9,0x44,0x64,0xd8,0xcc,0x8f,0x3e,0x43,0x39,0x39,0x47,0x64,0x9f,0x91,0xc2,0x75,0x23,0x27,0xe4,0x0d,0xac,0xa1,0x1a,0x99,0x70,0xc5,0x18,0x1e,0xda,0x37,0xd6,0x06,},{0xdb,0x72,0x70,0xac,0xce,0x78,0xd7,0xfb,0x09,0x08,0x0a,0x32,0x79,0x41,0xbc,0xe7,0xeb,0x14,0x5b,0x9e,0x36,0x61,0x86,0x6a,0x86,0x83,0xf9,0xa1,0xa3,0xde,0x97,0xfb,0x02,0xb0,0x25,0xdb,0x9e,0xc7,0x6f,0xf3,0x25,0x60,0xfe,0x63,0x88,0x27,0x74,0x2e,0xa2,0xf4,0xeb,0xef,0x6b,0x7c,0xce,0x44,0xf9,0xaa,0xee,0x43,0x4f,0xd7,0xc1,0x08,},"\x66\xa6\xcb\xe8\x8a\x8a\xb9\xa3\x38\x47\x79\x7f\xc4\x80\xb2\x44\xe8\xa2\xb8\xec\x79\xe8\x0b\xc2\x63\x77\x53\xde\xb3\x6f\xa3\x01\x4f\x84\x3e\x22\xa4\x7d\xb0\xa3\x17\x78\x38\x5e\xc1\xf4\x55\x67\x2e\x0d\xff\x6c\xa2\x1c\xa4\xcf\xd2\xb9\x89\x47\x1b\x7f\xfc\x30\x78\x28\x13\x8b\x0a\xd4\xe6\x47\xc2\xd1\x3c\xef\x72\x44\x69\x05\x4a\xbd\x37\x40\x24\x5a\xea\x4b\x78\x9e\x24\x4e\x95\xcf\x9e\xcf\xd0\x8a\x0d\x13\xc7\xce\xd3\x93\x33\x27\x27\xa7\xf3\xd8\xfb\xda\xbd\x93\x9d\xe2\x8c\xaa\x41\xcc\x96\xc7\x08\x11\x98\xe2\x26\x53\xd9\x4e\x02\x4a\x61\xf5\xf3\xdc\x5a\xa3\x7f\xa9\xad\xdd\xc9\x6c\xf1\x69\xd3\x50\x62\xa0\xa2\x9b\xa4\x5a\x53\x9c\x87\xa6\x8a\x3a\x03\x04\x36\x13\x09\xd2\x13\xe6\x14\xee\x83\x73\xda\xfb\xa2\xa7\xd6\xed\x7d\x2a\xd3\x77\x04\xc0\x94\x6e\x4d\x09\x3e\x2d\x94\xd0\x61\x36\x4c\xc1\x23\x10\x63\x72\x91\x03\xa7\x7c\xcb\x50\x18\x91\xbb\xc3\x18\x54\x57\xbb\xd2\x86\x9e\xb6\x3d\xc6\x0f\x19\x6f\x10\xa3\x8b\x7b\x36\xcb\x3f\x64\x3d\x35\xdd\xbf\x43\x8a\x44\xbf\x0c\x8f\x57\x0f\xad\x41\xbd\xde\x26\x7f\x0f\xfc\xf1\xf2\xf9\x27\xd6\x26\xd1\xb0\xd9\x80\xa0\xce\x22\x3f\x2f\x00\x54\x84\x5a\xfe\x41\xd3\x9d\xe5\xa4\x57\x21\x9f\x27\x6c\x67\xe6\x9b\xe2\xd5\xc9\xe0\x70\x13\x16\x39\x56\x1c\x26\x75\x1f\xb0\x64\x35\xe0\xe4\x2e\x25\x08\xc5\xf4\x9c\xd1\x2b\x51\x7c\x98\x33\xff\x97\xf5\xe5\x1e\x1d\xce\xaf\xa9\x42\x6d\x3d\xc5\x2f\xd1\x37\x9c\x64\xcc\xaa\xbb\x26\xdb\x1a\xf6\xde\xd7\x15\x36\x28\x84\x2f\x0c\xbd\xbb\xbd\x6a\xa0\xcf\xa5\x40\x7f\x40\x94\x96\xc0\x65\x32\xdb\xea\xc9\x4d\xab\x9b\xab\xa0\xb3\xc9\x88\xfa\x03\xd3\x6f\x91\x1d\x80\xe4\x9b\x37\x0b\x68\x37\x03\x7f\xf2\x49\xe7\x6d\x69\x2c\xd1\x77\x37\xe0\xd0\x79\x65\xd3\x3f\x17\x04\x2b\xbc\xd1\xe9\x90\xe0\x40\xf7\x19\x36\xf6\xfc\xa2\x54\x2a\xe3\x37\x48\x36\x77\x87\xc0\x1b\xde\xa7\x5c\x9a\x0e\x66\x15\x02\x81\xc4\x68\xfe\x5c\x73\xaf\x9e\x5b\xec\x37\x2d\x50\x20\xc3\xd3\x7f\xa1\x03\x5a\x67\xe2\x24\xd0\x95\xf0\x66\xa5\x1f\xe1\xf6\x81\xc3\x07\x39\x39\x27\x2f\x6a\xf7\x75\x0e\xd8\xd1\x83\x49\x17\x8a\xb4\xa2\xee\xb4\xe9\xca\x82\xbb\x67\x29\x6e\x98\x90\xf3\x16\xc9\xd9\x49\x59\x53\xd6\x84\x36\xeb\x1c\x1a\x2f\xb6\xa1\xcc\xa4\x5a\x8e\x88\xa0\x9b\xdd\x65\xa5\x55\x80\x25\x61\x8b\x36\xd7\xf3\xcb\x38\x9d\x2e\x2a\xb1\xed\x23\x32\x28\xec\x92\xa3\x27\x97\x8c\x0a\xdc\xed\xdb\x6c\x96\x32\xd3\xab\xd7\x97\x16\x21\x71\x37\x54\x75\x8e\x21\x01\x3a\x0c\x3d\x00\x9b\x6e\x31\x93\xcc\x15\x2c\x57\xef\x73\x10\x7b\xd4\x35\x7d\x52\x8b\xe4\x08\x73\x02\x7b\xf1\x84\x0f\x68\x55\x36\x08\x0f\x12\xc5\xff\xa9\x3c\xa6\x29\x73\x67\x80\xe0\x15\xe8\x6d\x19\x09\xf0\xd8\xf3\x72\x01\x0c\x9c\xb7\x2c\x09\x89\x84\x5f\xc8\x83\x15\xe6\xb9\x37\x0d\xc9\x2d\x36\x83\xef\x44\xd3\xf7\x5f\xc9\x6c\x4b\x0e\x89\xe1\x3d\x68\x2d\x19\x88\xb6\x85\x71\x3e\xad\xa8\x42\xbe\x9d\x2b\xbe\x2a\x76\xbb\xa1\x5d\x38\xcb\xaf\xb6\x5c\x40\xc2\x15\x9b\x0c\xee\xb0\xd7\x69\xb9\xbe\x35\x55\x40\x73\x4f\xf3\x77\x36\xc0\xf0\xfa\xcb\x95\x15\x93\x09\x36\x5b\x96\x46\xbc\x4b\x34\x4f\xb1\x9a\x5c\x16\x39\xa8\x8e\x87\x31\x7b\xfb\x3b\x5e\x7b\x51\x30\xfa\x7d\x56\x43\xed\x4d\xa0\x64\x30\xc8\xa0\xc1\x85\x8c\xcf\x2f\x9a\x6e\x3d\x62\x01\x22\x53\xf0\x12\x2d\xba\xb4\xa3\x54\x75\xa6\xf6\x55\x89\xb2\xb0\x95\x99\x28\x26\xe4\xf1\xb5\x8f\xa0\x50\xb8\xf9\x5c\x4f\xeb\xa3\xfb\xaa\xdd\x2c\x22\x44\xad\x4a\xbd\x41\x01\x39\xad\xf4\xc1\x53\xcb\x5e\x69\x33\x7a\xf1\x76\xa7\x83\x7e\xea\xea\x99\xbd\xcd\x59\x38\x5a\xfd\xed\x34\xff\xba\x80\x63\xa3\x5f\x4f\x55\x8e\x4e\xeb\x48\xf1\x48\x7b\x56\xb1\xf8\xd1\xf7\x30\x67\x62\x1c\xb5\x48\xc8\x08\x75\x3e\x35\x26\xa2\xf2\xaa\xbd\xe1\x26\xbe\xa5\x21\xcf\x67\x3d\xea\xfa\x79\x2c\xa5\xbd\x22\x12\x79\x5b\xd6\x6b\x86"}, +{{0xa6,0x33,0x7e,0x4d,0x3b,0x1a,0x49,0xb1,0x26,0x31,0x67,0x78,0xc6,0x13,0x51,0x6c,0x03,0xac,0x88,0xc9,0x6d,0x92,0xff,0x5c,0xc7,0xe0,0xc8,0x52,0x7c,0xce,0x1a,0x62,},{0xf5,0xea,0xc4,0xfe,0x0e,0xa1,0xa5,0xf2,0x36,0xb4,0x9d,0xa3,0x3a,0x24,0xe2,0xf3,0xa8,0x3d,0x4b,0x26,0x0c,0x54,0xd3,0x41,0x6c,0x64,0x4e,0x05,0xc8,0x38,0xbf,0x51,},{0x78,0x13,0x76,0xc9,0x51,0x2f,0xa3,0x3c,0x45,0x70,0x47,0xa1,0xf4,0xf0,0xda,0x31,0x76,0xe6,0x0e,0xe4,0x77,0x82,0x86,0x9b,0x7e,0x9f,0xa5,0x84,0x1d,0x96,0x4f,0x3c,0x1a,0xd6,0x6b,0x70,0xc1,0x14,0xb1,0x77,0x1c,0x32,0x4c,0x83,0xff,0x6c,0xd9,0x97,0xae,0xfc,0xcd,0xc5,0x9c,0x11,0x4d,0xb9,0xf2,0xf3,0xca,0x7d,0x84,0xa7,0xb6,0x0f,},"\xe3\x34\x30\xc3\x8c\x4a\x40\xb3\xc6\x6e\x20\xcf\x3b\x70\xe9\xfe\xa8\xcc\x50\x76\x1f\x2a\xfe\x24\x9e\xc0\x59\xc0\x7b\xc3\xb3\x7e\x5b\x94\xf4\xa4\x3e\x31\x00\x99\xb1\x9a\x85\xf5\x9d\xff\x73\xa7\xe4\x95\xc4\xdf\x31\xf7\x47\x80\xcd\xef\x7b\xd6\xe4\x7c\x39\x4c\x18\x91\xea\x30\x52\xe3\xcc\xf5\xd8\x4b\xae\x08\x2d\x24\xba\x71\x78\xac\x65\xd2\x29\xad\x18\xa8\x49\x40\xf6\xb4\xdb\xc5\x96\xee\x63\xc1\x81\xb5\x7b\x5b\x49\x69\x89\x79\xc1\x86\x32\xfa\x82\x1c\xa6\x1e\x35\xa0\xd0\x35\x1f\xe1\x3d\x69\xe0\x6d\xdc\xc8\xd6\x66\xdc\xa2\x45\x02\x17\x7f\x34\x4e\x2f\x44\x05\x75\xd3\x9e\xbf\xe5\xe7\xf1\x06\x53\xb6\x5b\xef\x29\x1d\xc8\x13\xa0\x43\x4c\x97\x5d\xe1\x64\xc1\xa7\x6b\xf6\xfc\xef\x98\xf2\x31\x81\xc0\x09\xb9\x18\x30\xb6\x18\xe4\x87\x48\x47\xd2\xe2\x1b\xbd\xb9\x3f\x20\xcd\x8b\x1f\x4b\xaa\xdf\x99\x42\x8a\x22\x67\x43\x86\xa6\x68\x15\x2b\x4b\x90\x39\xff\x06\xab\xcf\xe3\x34\xa0\x62\xf7\x94\x05\x61\x72\xec\xbc\x07\x94\xdf\x98\x27\x1b\x9a\xcf\xe4\xb7\xda\x55\x3a\x87\x63\x42\x37\x63\x00\x09\xa0\x5b\x25\x7c\x18\x4c\xbe\x23\xd9\xcd\x5a\x03\x86\x58\x01\x0f\x57\x48\x99\xf3\xb2\xd1\x54\xd1\x85\xee\x67\x23\x09\x13\x65\x0c\x3a\x05\xb5\x4a\x2e\xdc\x24\x3a\x42\x87\x39\x8e\x37\x69\x28\xea\x9c\x6b\x2c\xba\xf3\x71\x25\x25\x40\xe2\xb8\x04\x3f\xcf\x55\x68\x13\x19\x6a\xe5\x72\xc2\x7c\xfb\x5a\x46\xab\xb9\x72\x9a\xf2\xdc\xfc\x29\xe0\x33\xdd\x11\xf3\x3e\x86\xcc\x6a\xc3\xbc\xe6\xf3\xf9\x57\x7d\x36\x78\x1a\x69\xed\x7e\xaf\x8c\x82\x63\xa0\xf1\x8e\xba\x0f\xe8\xa4\x81\xf3\xe1\x5a\x55\x59\x94\x34\x19\x5f\x7c\xb0\x57\xdd\x36\x4e\xaa\x07\xdd\x0d\xfd\x26\x6b\x80\x7f\x53\xa2\x07\x0f\xd7\x91\xe8\x72\x42\x2f\xd9\x07\x13\x4f\x4a\x8a\x78\xa8\x76\xbd\xcb\x03\x1a\xc8\x60\xdf\xe0\xbb\x57\xe1\x05\xdb\x82\x87\xb3\x1a\x60\x4e\xb7\x12\x69\xbe\x5b\xa2\x29\x98\x5c\xea\xbc\x2b\xdf\x16\x5a\xc7\x41\x65\x0b\x1f\x01\x3a\x66\xc9\xbd\x24\x3d\x03\xa8\xb1\xc5\x08\x13\x81\xcb\x92\xe2\x3f\x90\x57\x77\x1f\xc0\x7c\xa3\x2d\xff\x1d\xb9\x4f\x5a\xdf\xd2\xf4\xff\x9a\xf3\x1d\x25\x0d\xd4\xf8\x6b\x22\x59\x2f\x60\xa7\x45\x75\x15\x62\x13\xf1\x08\x46\xc7\x46\xa9\x20\xfe\x39\x85\x1b\x32\xfe\x4c\x8b\x87\x58\x76\x5b\xc5\xb8\xb9\xd5\xb9\x92\x63\xdf\x36\xf9\x78\x88\x05\x3f\xd1\x0f\x1d\x68\xf5\x77\xae\xd5\x59\xbc\xfd\xe7\x44\xbc\x65\x11\x07\x6c\xaf\xd6\x89\x44\xa0\xed\x10\x55\x2d\x11\x34\x4b\xc7\xe4\xd9\xef\x93\x6d\xac\xce\xd5\x27\x43\x31\x32\x95\x9b\x1c\x73\x24\xad\x1c\x4c\xbc\x3a\x1a\x73\x6b\x1f\x02\xaa\xe8\xe0\x61\x1a\xe2\x3f\xdd\x47\x4f\x5b\x8e\xe7\x05\x6f\xcb\x5a\xf6\x13\x3e\xcc\x08\x4b\xb9\xf1\xf5\x0c\xbd\xac\x66\x24\x44\x37\xb4\x34\x8f\x4e\xdf\xe2\x37\xfc\x3c\x38\x29\xab\x94\xeb\x4f\x14\xca\xb1\xcc\xd6\xca\xee\x36\xfa\xdc\x20\xa3\x10\xcf\x06\x90\x62\x2c\xdc\xa8\x48\xae\xd0\x3f\xf4\x03\xa6\x63\x3f\x4f\x65\x79\x94\xb7\x80\xdd\x60\x48\x14\x9c\x3b\xfb\xc1\x78\x89\xe3\x7d\x90\xb1\xe5\x42\x0e\xb3\xd4\x59\x6b\x91\xba\x11\xbc\x02\x29\xc6\x5d\x05\xb9\x3c\xd7\xe0\x45\x4d\x1f\x3c\x6e\x1e\x80\x71\x98\x37\x92\xc4\xd4\x36\x8d\x07\x78\xae\xf4\xe1\x23\x33\x5f\xd2\x96\x2c\x65\x7b\xd0\x51\x35\x71\xa5\xfc\xe2\x11\xde\x62\x87\x4f\x27\xca\x10\xdc\x15\xba\x2d\x44\x5f\x1c\xf4\xbe\x5f\x83\x3c\xf0\xb5\x64\xc0\x22\x57\x6b\x98\xc0\xa2\x43\x49\xb6\x70\x85\xf9\x22\x02\x67\x5d\x7d\xac\x48\xb9\x5e\x3b\xfd\x65\x55\xa9\xec\xb7\xc7\x2f\x08\xbf\xec\x0d\x22\x02\x22\x49\x2f\xdc\x96\x36\xf0\x36\xec\x45\x08\xa3\x65\xb7\xb7\x09\x79\xf9\xeb\x4a\x72\x63\xa8\xba\xcb\x1c\x1d\x01\x55\x73\x86\x46\xcd\xd4\x6a\xb9\x23\x4a\x17\x03\x11\x50\x0d\x0b\xae\x6e\x55\xa8\x63\xbd\xaa\x56\xf5\x16\x45\xad\x85\x29\x7a\x73\x81\xf8\xd2\x0c\xf9\x6c\x47\x4d\x1b\xb8\x1f\xce\x13\x2b\x14\x55\x5d\x1a"}, +{{0x10,0x7d,0xa9,0x8d,0x0e,0xe8,0xe7,0xc0,0x0f,0x6d,0x41,0xec,0x26,0x59,0x44,0xce,0x67,0xef,0x8c,0x8f,0xfb,0x51,0xf4,0xf1,0x1f,0x4e,0x5f,0x1a,0x27,0xfb,0xe8,0x05,},{0x3b,0xec,0x34,0xb1,0x61,0xb1,0xbc,0xff,0x00,0x9f,0x8c,0xfc,0x50,0xd8,0x4c,0xeb,0x6a,0x2d,0x5b,0x20,0x3b,0x52,0x38,0xa8,0xaa,0xd8,0xa8,0x36,0x18,0xb4,0x42,0xe7,},{0x53,0x25,0x2b,0x92,0x3a,0xd1,0x9c,0xc3,0x97,0x84,0xd3,0xa9,0xae,0x59,0xd6,0x2a,0x63,0x00,0xdc,0xc5,0x0a,0xc8,0xfd,0x07,0x13,0xcb,0x58,0x84,0x45,0x01,0xd8,0xd3,0x80,0x5a,0xfa,0x0f,0xda,0x64,0xc7,0x3e,0xa0,0xf6,0x0e,0x6a,0x8b,0x34,0x45,0xbf,0xff,0xe6,0xca,0x6b,0xfd,0xc8,0x7e,0x12,0x8b,0xaf,0x99,0xbf,0x62,0x68,0xfc,0x09,},"\x1a\x7b\x7f\x3e\x1c\x7c\x41\x49\x2a\x7c\xe7\x99\xef\xdb\x2d\x9d\xc2\xf2\x48\x9c\x84\xae\x28\xbb\x7d\x08\x4f\x32\xec\xa8\xfb\xb0\x66\x88\x5a\xc6\xf2\xef\x74\x49\xe7\x12\x26\xa8\x2e\x9f\x15\x37\x72\xa9\x93\xeb\x6b\x6b\xca\x64\x91\xd2\x6a\xca\x5d\xee\x98\xb7\x7a\x1d\xdc\x59\x92\x2b\x31\x45\xc4\x47\xde\x73\x7f\xaf\xac\xba\x5a\x75\xf2\xa8\x01\x37\xb5\x59\x46\x97\x22\x0d\x19\x61\x76\x74\xa6\x91\x13\xfd\xf7\x7c\x34\x3a\xf2\xb7\xe3\x86\x1b\x5b\x78\x22\xf5\x8d\x60\x08\x9c\x3c\xa5\x4c\x74\x9d\x27\xf8\x83\x79\xc0\x67\x59\x8f\x06\x39\x39\xba\x86\x31\xd1\xf5\x2d\xc9\xab\x45\x50\x45\xfb\x36\x0c\xc2\xa5\xb6\xb0\x12\x7f\xac\xfc\xf5\xb1\xb4\xc3\x3e\x3f\x19\x4f\xc9\x24\xb8\x54\x16\x8c\xb1\x16\x9a\xb1\x09\x97\xb4\x38\xb7\x1c\x80\x87\x83\x47\xbe\x88\x7a\xf4\x48\x10\x13\x4b\x51\x4c\x80\x69\x08\x20\x1a\x3d\x3e\x6d\x0c\x56\x12\x0c\x43\x14\x87\x4d\xc2\x94\x4d\x84\x44\xf0\x1b\xaf\xa3\x4a\xa6\x2e\xce\xf0\x98\x15\x45\xe5\xd0\x2f\x40\x16\xc0\xb1\x64\xfc\x05\xae\x18\xf5\x35\xc3\x1b\xf2\x0b\x86\xf3\x1f\x7a\x79\x4a\xba\x14\x89\x84\xc3\xff\x43\x3d\xc2\x22\xc4\x43\xb5\xd2\x6c\x1f\x66\xe6\xc5\xf1\x9d\x19\xcd\x6e\xad\xd4\xdc\x94\x10\x1b\x2f\x52\xb5\x8c\x9d\x45\x90\xcb\x10\xdb\xc5\xd6\xea\xcd\x11\xd4\x2e\xd0\x9f\x15\xbd\xe4\x4e\xe9\x27\x1d\xef\x29\x2f\x73\x1b\xf3\xb4\xac\x6c\xd1\x27\xe4\x88\x4c\x2c\xb3\x0b\x28\x5f\xc9\x24\x76\x38\xa2\x99\xe4\x16\x52\x06\x24\xd1\xec\x8d\x0d\xf2\x49\x89\x39\xc7\x19\xa9\xe7\xbd\x29\xa3\xc5\xc3\x2a\x3e\x82\x41\x36\x8d\x6e\x4f\x90\xfe\xa2\x9d\xc3\xa3\xf1\x47\xea\x9f\x76\xc5\x78\x0e\x73\x14\x3f\x55\xd3\xde\xc7\xb6\x63\x41\xd3\xf3\xea\xc1\xd9\x8f\x8e\x7d\x4e\x87\x75\x09\xb4\x43\x8c\x3a\x52\x46\x6d\x24\x2a\x10\xb4\xc2\x7c\x4a\x0d\xb9\x23\x2d\xad\x01\x14\x14\xeb\xfb\xd5\x79\x06\xf1\xa4\x10\x20\x7b\x52\x6b\x0d\x1f\x1b\x69\x86\xb3\xeb\xd7\x55\x0a\x2b\x3c\x15\xfc\x24\x09\xc7\x62\x6e\x0d\xd3\x30\xef\x67\x22\xe3\xba\x48\xb1\xd9\x20\x56\x52\xac\x19\x4c\x21\x47\x3c\xe2\x58\x55\x9d\xb5\x11\xef\xad\x3e\x5d\x55\xf2\xa7\x96\xd6\x5a\x6a\xb9\x7d\x86\x31\x06\x2a\x59\x3a\x13\xaa\xa0\x95\xdb\xc9\x3e\x62\x17\xce\xd6\x19\xcb\x16\xa5\x7e\x74\x43\x55\xa1\x6b\x15\xe7\x7d\x49\x79\x11\x92\x99\xbb\x04\x3e\x48\xfa\x3e\x61\x54\x60\xe1\x64\x88\x29\x84\xa2\x23\xd4\x18\xca\x95\x34\x0c\x5b\xfc\xda\x67\x3f\xcd\x13\xb2\x9f\x2c\x47\xd2\xf9\x7e\x3e\x8c\x61\x3b\x6c\x58\xdf\x0e\x62\xcf\x23\x06\x1d\x6f\x54\x5b\x75\x50\x33\xfd\x3d\xc1\x40\x5e\x5f\xef\x35\xa1\x3e\x01\x5f\x98\xb1\xcc\x42\xf7\x1b\x99\x68\x1f\x96\x81\x25\x82\x29\xa4\x47\x3d\x86\xea\xbb\x0c\x17\x92\x79\x41\xe5\x0c\x08\xf3\x4a\x76\xb4\x3b\xcc\x6d\x04\x2e\x56\x32\xef\x9c\xcc\x91\xb6\xe6\x95\x0f\x5d\x30\xf6\x70\xfb\x39\x02\xc3\xd4\x09\x31\x5a\x40\xb0\x82\x1c\xe8\xa9\x9a\x97\xfe\xca\x54\x78\xbf\xd7\x82\xe7\x87\x67\xb3\x11\xf3\x74\x16\x3f\x58\x96\xb0\xbe\xb9\x58\x38\xe6\x45\x87\x8c\x64\x99\x03\x85\x12\x3b\x61\x57\x5d\xd8\x42\xdc\x76\x35\x4b\xac\x9c\x6d\x5a\xcd\x99\x35\xb6\x09\xbc\xcc\xb8\x46\x3d\x39\x22\x5d\xa1\xaf\xb8\x91\x1d\x36\xe6\x09\x89\x2d\xd1\x72\x38\x52\xab\x9f\x82\x75\x8f\x3f\x1e\x4d\x28\xdc\xf0\x2c\xb0\x6e\xed\x26\x84\x4a\xae\x68\x82\xed\x44\xbc\xe4\x4a\xbc\xd1\xdf\xba\x63\x34\x18\xc9\xf1\x55\x87\x9c\x97\xab\x27\xf8\xae\x23\x83\x30\x39\x2b\xe5\x49\x1a\x07\x86\x62\xda\xaa\x02\xa3\xd5\x45\x8b\x77\xc5\x49\xc4\x9b\xe2\x01\x24\x5e\x7a\xae\xc0\xd9\x4e\x54\x37\xbe\xca\x6e\x5a\xb0\x46\xd6\x94\xe9\x6b\xf5\x1e\x04\xfb\x44\x37\x9b\x2b\x9b\x80\x16\x75\xfe\x14\x77\xf3\xe0\x89\x87\x4a\x60\x11\x71\xd8\xb6\x8f\x02\x02\x01\x46\x01\xa5\x3f\x81\x2f\x53\xe5\x81\xc3\xb9\x63\x12\xb3\x6b\x9e\xe0\x4f\xff\x11\xd9\xea\xb4\xe4\x51\x48\xdc\xc8\xf0\xfa\xb1"}, +{{0x8b,0xc2,0x29,0xfc,0x23,0x46,0x53,0xb1,0x3c,0x92,0x47,0x10,0xcb,0x46,0x8b,0x8f,0xa9,0xb2,0x80,0xe2,0xad,0xb4,0x9c,0xb4,0xb3,0x6b,0xf5,0x9d,0x6f,0xa4,0xa6,0x39,},{0x46,0x14,0x69,0x75,0xdf,0x67,0x04,0xcb,0xf4,0x53,0x20,0xa5,0xe6,0xcb,0x6d,0xe8,0x13,0x46,0x9f,0x31,0x31,0xe6,0x1d,0x44,0x7b,0xbc,0xa1,0xa4,0x77,0xa0,0xc5,0x57,},{0xd2,0x43,0xb8,0x7d,0x13,0x97,0xd5,0x94,0x13,0x9d,0x83,0xc3,0x9a,0xcf,0x85,0x01,0xd0,0x73,0xbd,0x4b,0xe7,0x18,0xb4,0xc2,0x06,0x98,0x07,0x29,0xe7,0x20,0xa4,0xc5,0xb0,0xea,0x91,0xa2,0x8e,0xa1,0x26,0x04,0xa9,0x87,0xe6,0x95,0x91,0xc5,0x43,0x04,0x9f,0x29,0x73,0xbb,0x91,0xc1,0x70,0x21,0x3c,0x32,0xa6,0x4a,0x0f,0xac,0x82,0x04,},"\xba\xe2\xdc\x7f\x94\xab\x5c\xcd\xca\xa8\xcf\x49\xed\xbe\xf0\xf6\xd7\xae\xb1\xfa\x89\x07\x80\x05\x33\xaf\x44\x92\x61\x11\x94\xe5\x6c\xef\x37\xb1\xf0\x33\x30\x37\x38\xae\x2c\x3b\xc4\x58\x8f\x5c\xb3\xd5\x5f\x34\x5b\x9a\x40\x7e\x78\x77\x42\xa0\x6a\xf0\xb6\xee\x20\xde\xe3\xdf\xe9\xc9\x1d\x76\x2a\x3e\xbd\x19\xae\xd0\x79\x07\xbb\xb9\x1c\xd7\x76\x32\x65\x40\xde\xd9\xf7\xff\x7d\xda\x76\x61\x5f\x97\x8e\x94\x90\xf4\x06\xed\x2d\x91\x16\xe2\x09\x3f\xa7\x85\xe9\x71\xb5\x06\x2d\x31\xcb\x40\xff\xf9\xe3\xc5\x51\xa7\x3b\x20\x24\x5d\x46\xdf\x4d\x7f\xd1\x30\x3a\x28\x18\x01\x72\xd9\xa2\xbf\x55\x93\xc4\x79\x17\xb5\x86\x90\x91\x7c\x1f\xb0\xe1\xe2\x99\x4d\x1f\xa9\x77\x35\xae\x37\x8d\xe6\xea\xfd\x5c\x1a\x25\xab\xaf\xa3\xcf\xd2\xdf\x7a\xea\xbd\x6e\x68\xfc\x44\xed\xf8\x2f\xc8\x36\x94\xe5\xd8\x41\xa1\x5b\x14\x56\x8b\x61\x10\xbe\x64\x4b\xf2\x2b\x71\xfc\x47\xd7\xf0\x7e\x16\x66\x95\x7d\x0f\x87\xda\x17\xf1\x3f\xcd\x63\xc1\xc2\x96\x6f\x68\x7d\x25\xdc\xbd\x99\x63\xf0\x1e\xff\x13\x2d\x5f\x2b\x86\x67\x78\x16\x58\x8c\x12\x3e\x94\x57\xbe\xfc\xce\xd2\xd3\xcd\x1d\x1b\xeb\xe8\xdd\x8f\xbb\x15\x87\xe5\x53\xcb\xcc\x4c\x87\x62\x06\x4c\xd3\x2e\xf7\xa1\x70\x24\x10\xf7\x7f\x15\x24\x0d\x7e\x2b\xb5\x82\xc6\x78\xc0\xda\x88\xef\x45\x22\x83\x0b\x14\x36\x60\xac\x9c\x43\x4d\x95\x77\x2e\x6e\xee\xed\x60\x14\xae\x16\x82\x4c\xcd\xc4\xdf\x2d\xf6\x4a\xeb\x69\x80\xb5\x1d\x11\x89\x85\xdc\xbb\xd1\x96\x1f\x31\x5e\x6a\x94\x33\xf0\xb9\x6b\x1e\x63\x51\x25\x7e\xad\x83\xe0\x5b\x4c\xc8\x9c\x92\x4b\xf8\x35\x58\xba\x7d\x2e\x7c\xa3\x7c\x03\x17\x9a\x8f\x85\xb8\x31\xe7\x21\x7b\xf4\xc5\x53\x83\x87\x61\xd3\x26\x02\x85\x3b\x81\x59\x3b\x0e\xbf\x8e\x4b\x9f\xfa\xf0\xec\x40\x5b\x2a\x83\xaf\x7d\xe5\x55\x4d\xaa\xd2\x8b\x58\x2e\xe0\x8b\xd8\x4b\x37\x55\x50\xca\xe0\x8a\xe4\xa5\xbd\xa7\x15\x81\xfc\x3b\x7b\x54\x49\x8c\x4e\x1a\xfb\x96\x6b\x4a\xf1\xd9\xc8\x43\xa6\xb2\x5b\x34\xe0\x4c\xfd\x9b\xd2\x37\x42\x44\xf1\xfe\x20\xec\x62\xbe\x3c\xcf\xab\x4e\xde\xf7\x9e\xd6\x4e\x6b\x71\xaa\x92\x28\x12\x7c\x63\x59\xea\x1c\x4a\x80\x87\x89\x08\x96\xff\xa4\x6e\x00\x92\xde\xc7\xef\xbc\x96\x0a\x17\xb7\x70\x91\x6f\x95\x40\x70\x13\x2e\x26\xd9\x8d\x97\x74\xa2\xac\xdf\x80\x9d\x58\x6d\xf0\x25\x2f\x67\xcf\xe8\xd9\x85\xa3\xe2\x48\xdb\x0f\x90\x73\x1a\xce\x7a\xbd\x99\x9c\x74\x6b\x69\x64\x8d\x5c\x3b\x4b\xd6\x11\x37\xe0\x8f\xcc\x8b\x2e\xfc\x56\x76\xbc\xd8\x56\xa1\x3b\x36\x21\x51\x47\x4c\x4a\x1e\xfd\xed\xc5\x92\xcf\x3e\xad\x1a\xba\xbc\xd4\x8e\xe2\x04\xd2\x77\x26\xad\x1b\xda\x4f\xe4\xb0\x9a\xb5\x10\x89\xd0\x16\xde\x6b\xa2\x59\xea\x81\x80\x7f\xaf\x21\x1c\x87\xe4\xc9\xef\xbf\x6a\x4c\x75\x3e\x08\xf7\x80\xed\x55\x33\x8c\x0f\xde\x14\xfb\x99\xb3\x07\x22\xb5\x59\x4b\x3a\xbe\x02\x04\x7f\x46\x62\x42\x42\x1f\xb8\x11\x76\xc9\xc4\xf0\xfd\x2b\x5e\x7c\x5a\x0f\x65\xa0\xc5\x9a\xa8\xc3\xa9\x86\x08\x7d\xe7\xba\x40\xba\xca\x77\xbd\x36\xac\x21\xce\x34\xe9\xfe\x97\xfa\xcc\x4e\x29\x83\x30\xee\xce\x1c\x8e\xc6\x23\xe6\x6a\x4b\x0f\x23\x42\xd2\xc5\xa0\x2c\x5f\x5a\xbd\xdc\x5f\xf1\xf1\xf2\xd0\x3c\x1d\x4e\xe9\xb4\xb3\x42\xed\x3b\x1c\xc2\x65\x61\xf3\x21\x7b\xf8\x50\x0e\x08\xf0\x27\x57\x1c\x53\xc9\x23\x26\x05\xa5\x3f\x2b\xda\x02\x4e\x39\x92\x91\x63\xa8\xe0\x07\x91\xac\x06\x56\xbb\x07\x83\x82\x5e\x71\x05\xff\xa9\xd9\x09\x69\xdc\x09\x4a\xf4\x6f\x70\x2e\x85\xcc\x11\xe4\x42\xb3\xd5\x53\x4c\x1d\x32\x75\x20\x7d\x6d\x29\xa9\x42\xc3\x58\xed\x5f\xa0\x75\x57\xc3\xc0\x14\xcf\x54\x1f\x9a\xae\xea\x60\x25\xb4\x1e\xcd\xd8\x48\x51\x2b\xa2\x5e\x72\x1e\x43\xd3\x29\x18\x5f\x8f\x94\x89\x2e\x9e\x2d\x5e\x7c\xbb\x99\xe7\xad\x25\xf6\x9e\x5b\xef\x73\x2c\xfc\xeb\x07\x86\x11\x55\x3c\xc7\x83\x77\x37\x5e\x74\xe6\x6f\x1b\x9d\x8d\x20"}, +{{0x3e,0xdb,0x50,0xff,0x07,0x4e,0xf9,0x71,0x7f,0x4f,0xb0,0xb6,0xce,0x25,0x2b,0xf4,0xbd,0x04,0x9c,0x90,0x83,0x77,0x5f,0x52,0x9e,0xaf,0x51,0xe9,0x75,0xcb,0x32,0x45,},{0x4b,0xc2,0x1f,0xe0,0x3e,0x67,0x9a,0xbb,0xfc,0xd8,0xc5,0xea,0x2b,0xcc,0x4d,0x83,0x8a,0x78,0x7d,0x48,0x40,0xc3,0xbc,0x39,0xde,0x4b,0x04,0xc4,0x17,0xc7,0x68,0xa5,},{0xde,0xb3,0xd9,0xfc,0x7b,0x2d,0x86,0xab,0x4b,0x92,0x6f,0x99,0x52,0x79,0x70,0xab,0xb5,0x18,0x38,0xbc,0xc2,0x91,0x9e,0x94,0xcd,0xa3,0x37,0x1f,0xd0,0xe7,0x69,0x3f,0xe3,0x7e,0x0c,0x40,0xe1,0x23,0x3b,0x09,0xff,0xa9,0x03,0xa0,0x34,0xdd,0xe2,0x87,0xc0,0x23,0x7d,0xc5,0x94,0xf5,0x3a,0xbc,0x87,0x84,0x48,0x69,0xdc,0xe9,0x20,0x02,},"\x97\x5e\xce\x4e\x81\xf0\x01\x5f\x5a\xc3\x04\x46\x09\xd0\xac\x3a\x8d\xf9\x14\x5b\x50\xc4\x28\x89\xdd\x31\x2f\x56\x3c\xf6\x12\x6e\x36\xff\xfa\xf2\x1e\xb6\xb8\x4f\xbd\xa1\x5a\xa8\x5c\x66\x14\x5f\x75\x41\xe5\xb4\x1a\x8e\x81\x70\x0b\xe3\x56\x22\x4f\xc1\x09\x32\x7a\x69\x19\x66\x56\x73\x53\x4f\x5c\x8a\x4a\x00\x17\x50\xb1\x99\xdb\xfd\x63\x06\x91\xaf\x55\x2d\x4d\x26\xa9\xd9\xaf\xb3\x3a\x16\xaf\x39\x11\x54\x12\x4b\x53\x42\x6c\x9f\x69\x50\x57\xb1\x81\x4f\xd6\xd3\x10\x29\x8a\xf6\xc8\x30\x68\x6a\x4a\x00\x7a\x14\xe0\x05\x7b\x72\xfb\xad\x5b\x80\x3a\xd3\x53\xd1\xc3\xfd\xb8\x90\xa9\xc8\x18\x08\xe8\x9f\x22\x91\x87\xbc\xb4\x4f\xee\x16\xa4\xeb\xca\xd5\xeb\xa4\x59\xb0\x28\x27\x2a\x56\x2c\x05\x07\x9f\xa7\xae\x3e\xca\xe8\x04\xa9\xe8\xc4\xf3\xf3\x15\x81\x3c\x5e\xe0\x84\x1b\xbc\xcf\xe4\xa9\x56\x23\xb5\x17\xa4\xb4\x2b\x2c\x6d\x97\xa3\xbf\x26\xac\xdb\xe2\xe9\x79\x63\x3f\x02\xaa\xc4\x66\x52\x6a\x3e\xbb\x14\xda\x19\xbc\x95\xf2\xc3\xfd\xf6\xbd\xb0\x8b\xe8\xbd\xe9\x7a\x86\x4c\x90\x7e\x91\x8c\x67\x9a\xb7\x26\xf8\x01\x77\x14\x58\x40\x21\x6b\x9d\xc3\xf9\x81\xef\x17\x87\x4f\x08\xb2\xfc\x66\x11\xa6\x34\x6c\x3d\xa6\xa5\x5e\xcf\xa7\x53\xc9\x91\x9f\x4f\x19\xe3\xc7\x90\x93\xbf\xd7\x8f\x86\x15\x98\xe4\x66\x6e\x1c\xab\x68\x8e\x46\x04\xd4\x6c\x9c\x58\x2e\xad\xb9\x2c\x98\x8f\x47\x8d\x16\x0f\x5a\x15\x18\x2b\x33\x40\x20\x17\x97\xd0\xb9\x55\x28\x2e\x4a\x21\x7b\x50\xb1\x4b\x10\xc9\xf4\x90\x67\xea\x3e\x84\xe5\x27\x4d\xca\xec\x74\x47\x4c\x57\x07\xc2\x8b\xba\x0d\xb8\xcd\xe3\xe8\x38\xd7\x31\x3c\x17\x1b\x85\xff\x2b\x9a\x3d\x2b\x16\x7e\x90\x61\xf8\x4d\xf3\xb1\x3b\xdd\x08\xb2\xd5\x01\xe5\x37\x92\xd6\x80\x54\xd0\x48\xab\xfe\x3b\xce\x98\xd9\x78\x25\x6f\x2f\xd2\xc6\xc4\xe7\x6f\x39\x68\x8c\xcc\xf0\xfe\x14\x9a\xf9\xd3\x47\xe7\xb0\x40\xef\x24\x1d\xd5\xa5\x3e\xaa\x5e\xab\x35\xa1\x8c\x68\xc7\x54\xa0\x6b\x03\x39\x9b\xbe\x56\xa2\x52\x68\xc8\x29\xa5\xba\x82\xb2\x81\x92\x04\x1d\x3b\xd2\x44\xeb\x08\xbf\x78\xe7\x6d\xef\x87\xcd\x09\xf3\x2b\xea\xc9\xbb\x63\x98\x23\xb3\x69\x67\xa5\x74\xd8\x96\x0d\x1b\xd0\x34\x35\x67\x9d\x93\xed\xdc\x55\x80\x63\xc5\x40\xb9\xc2\xf6\x09\xfe\xd2\xe2\xe3\x57\x6d\x19\xe6\x20\x9e\xab\x46\x6c\x20\x67\x91\xc3\xaa\x19\x96\x23\xfb\xae\x7d\x34\x97\xe8\x0f\xdd\x3f\xcb\xaf\x5b\x89\x11\x0e\xd7\x22\x44\x23\x4b\xe8\x5c\xca\x4b\x27\xa0\x9b\xb7\x0a\x26\xec\xe4\xeb\x8d\xd9\x70\xa2\x6e\x5b\x04\x36\x1f\xa5\x0e\x90\x38\x0e\xd6\x5f\x41\x4c\x1b\xe9\xf5\x06\x4f\x71\x42\x91\x16\x26\x7e\xdd\x69\x76\x42\x2a\xd9\x2d\xeb\x2b\x80\x4a\x92\xe8\x1c\x9f\x65\x22\xa0\xf3\xb5\xd8\xad\x36\xb4\xf8\x7d\xb5\x16\xa2\x28\x73\xe6\xf2\x72\x84\xf2\xca\x36\x0a\x2f\x40\xff\x3d\x8e\x23\xde\xc8\xef\x8a\x17\xa4\x3a\xcb\xb6\x12\x71\xa7\x27\xcb\x86\x90\xd2\x9b\xb8\x20\x16\x73\x6b\x31\x02\x62\x01\xdd\x3d\x38\x8d\x2c\x64\x3a\x73\xcf\xbd\x0a\x94\xe2\x05\x51\xfb\x5f\x8e\x1f\xfc\x39\x74\x12\x72\xaa\x23\x08\xdc\x8d\x21\x33\xa3\xfa\x9c\xf1\x09\x79\x6d\x69\xd2\xcc\x8a\xdd\xc4\x4a\xe2\x52\x77\x81\xee\x99\x3a\xf2\xa6\x37\xa8\x72\xf0\x2a\xff\x47\x4a\x70\x73\xf2\x9d\x9c\x89\x50\x77\x01\xfe\xcb\xbf\xd5\x10\x13\x53\x53\x7e\xba\x17\xc2\x96\x69\xda\xc0\x42\x7e\x38\xe2\x2d\xfa\xac\x91\xfc\x20\xd9\xe3\xfe\xe7\x91\xf4\x62\xa8\x63\xbb\x19\x08\xfb\x1e\x42\x04\xb6\x88\x80\x31\x4d\xda\xca\xaa\x35\xa1\x7a\xf5\xf5\x7a\x39\x9f\x19\x31\xe7\x8f\x5a\x37\x45\x4f\xd3\x8c\x57\xa6\x8e\x8d\x36\x78\x48\xa9\x73\x45\x18\x9c\x70\x07\x7f\xd1\xaa\x07\x54\xe7\x03\xe3\x52\x61\x80\x63\xb9\xe3\xfa\xf3\xb1\x4b\x5f\x0b\x27\x11\x36\x33\xc5\xd1\x73\x63\x74\x1e\x96\xa6\x7e\x81\x64\x01\xe8\x09\x8c\x17\xbf\xfe\x9c\x6f\x35\x87\x64\x6f\x40\xe9\xfd\xb6\x81\x9f\xd2\x2a\x74\x3a\x7a\x6e\x10\xfe\xba\x11"}, +{{0xcd,0xa4,0xba,0x93,0x94,0x0a,0xa0,0xc0,0xc3,0x15,0x0b,0x39,0x29,0xb9,0x5e,0xe7,0x76,0x9c,0xe4,0x3f,0xd9,0x8e,0xca,0xff,0x9c,0x4a,0x50,0x9e,0x73,0x6d,0x5c,0x8e,},{0xf4,0xc7,0xa2,0x5f,0x1a,0x74,0x3d,0xaf,0x41,0x41,0x7e,0x47,0xe0,0x27,0x53,0x7f,0x24,0xf4,0x81,0xbd,0x1a,0x75,0xe6,0xb1,0xd3,0x3e,0xc4,0xc8,0x2c,0x55,0xa2,0xd3,},{0x31,0x04,0x8d,0x33,0x4a,0xf0,0x5a,0x4f,0x27,0x5f,0xf8,0x27,0x54,0x4e,0xa2,0x96,0xa4,0xa7,0x75,0xfa,0x59,0xef,0xa0,0x00,0xc5,0x76,0x13,0xfa,0x6e,0x5c,0x49,0x3c,0x3a,0x9b,0x79,0xe8,0xce,0x56,0xe7,0x22,0x5b,0x0f,0xa3,0x26,0x20,0x4f,0x03,0x36,0xc2,0x13,0x53,0x5a,0xe5,0x89,0x17,0x7a,0x8e,0xae,0xdb,0x6d,0xf8,0xb2,0x02,0x03,},"\x3a\x1d\x66\x8c\x66\x88\x41\x48\x96\xa7\x69\x7f\x3c\x2e\x43\x10\x98\xed\xfc\x45\x7e\x04\xd2\xda\x86\x95\x68\xad\x5b\x33\x10\xe5\x9e\x4c\x72\x7c\x90\x3c\xbf\x18\x17\x40\x88\x02\x31\x9a\x8c\x23\x1b\x58\x02\x3d\xfa\xe4\x94\xc0\x13\xaf\x0f\xdb\x78\xc9\x1d\x5b\x45\x7f\x8c\x47\xa3\xdc\x31\xd8\xc8\x59\x4a\xa0\x8f\x14\x62\x03\xfa\x2c\x28\xb3\xdd\x79\x6a\x11\xa9\x7a\xde\xde\x6a\x7a\x70\x9b\x5a\x19\x18\xef\x1b\xea\x83\x53\x3c\x78\x34\x73\x70\x33\x56\xf5\xbe\xea\x7f\xd1\x8a\xc4\x4e\xc6\x89\x04\x95\xed\x17\x0d\x03\xf1\x5b\x41\x86\x08\xa7\xd9\xef\xd5\x2f\xa1\x09\x18\x63\x80\x51\xc4\x48\xd9\x8d\x57\x24\xf5\x67\xc8\xc6\x7f\xd5\xb6\xec\x8c\x3d\x63\x60\x08\xb9\xba\xe5\xe8\xb1\xe9\x84\xf8\xff\xb8\xb6\x4b\xee\xbd\x63\x45\xa1\x05\xc1\xc1\x08\x31\x32\xfd\x45\x08\xd6\xac\x0d\x4e\x91\x45\x50\x12\x10\xe5\x17\xd9\xb2\x24\x78\xe2\x15\xb6\x02\x59\x9f\x80\x37\x62\xdc\xd5\xa4\x09\xb3\x46\x0e\x7f\x34\x0f\x47\xef\x77\x28\x1a\xd2\x38\x3d\xe0\x8c\x5b\x80\x95\x38\xaa\xec\x92\x2b\xfc\xa0\xd6\x75\x2f\x14\x79\x72\x64\x6d\x0a\x8d\x83\x40\x77\x2c\x87\x1d\x3b\x34\xab\xc0\x60\x37\xde\x3a\xb4\xe3\x71\x29\x86\x5d\x5b\xa7\x0b\x6f\x3c\xc9\xa0\x59\xef\xb7\xdd\xdc\x38\x82\xf4\xfc\xfe\x13\xf4\x48\xc9\xbc\x66\x48\x88\x58\x96\x03\xba\x98\x68\x3a\x93\xb4\xb3\xb1\x01\x49\x92\xa5\x5c\x8e\x4e\xa1\xba\xf9\xcc\x00\xd1\xba\xdf\xf5\xfd\x7f\x5d\xa5\xe3\x07\xfb\xd1\xb4\xc9\x84\xe0\xfa\x0e\xde\xc5\xd3\x0b\xfe\xf5\xf4\x77\x30\x12\x63\xb5\xd7\x52\x00\x1b\x85\xdd\x52\xdf\x3b\x4a\x7a\xc2\x3b\x93\x0a\x91\xc0\xa4\x57\x65\xa6\x64\x88\xd8\xeb\x59\x01\x85\x70\x60\x06\x7b\x82\x37\x81\x88\x54\x92\x88\xdd\xc6\x18\x31\xe5\xb6\x84\x1b\x34\x4c\xae\x22\x50\x04\x22\x19\xcf\xb4\xac\xe0\x23\xe6\x91\xf9\xe4\x8d\x00\x6e\x9a\x07\xc6\x7d\x24\x68\xf9\x35\x93\xb4\xaf\xc1\x61\xc0\x76\x8b\x6c\xeb\x74\x4c\x24\xc9\x23\xda\x34\xaf\x3d\x5e\xd5\x77\xcc\x7f\x85\xd4\x91\x56\x0f\x4c\x0b\xcb\xcd\x1d\x5e\x34\x21\xbd\x1c\xcf\xaf\xb3\x73\xd6\x51\xbd\x61\xed\x71\xc0\x9e\x99\xf6\x12\x00\x17\x04\xd0\xc6\x30\xd8\x54\x7b\xd9\x70\xb6\x6e\x7f\x5c\xe7\xa0\x14\xe0\xff\x5a\x33\x7d\xc5\xc5\x6a\x99\xf1\x31\xb9\x12\x91\x40\xee\xea\x39\x39\x7c\x48\xca\xa9\xa8\x08\x6f\x9f\xd9\x91\x50\xbe\x7e\xf8\x7b\x6d\x4b\x94\xb1\xbd\x52\x87\x8b\xf3\xbb\xfc\xce\xac\xc2\xcc\x45\xe8\x97\x1c\x3a\x4d\x4a\x3e\xb8\x6a\xf9\x87\x4d\x4f\xa5\xe7\xca\xa7\xf4\x5d\x15\x53\xff\xbb\x41\x64\x5b\xf0\xf5\xe9\xb2\x97\x72\xe3\xdc\x08\x1b\x25\xb5\x2e\x1c\xb7\xe2\x16\x74\x83\xd5\x4f\xba\x69\x0d\xdb\x29\xd5\x46\x2d\x2a\x27\xa3\x5d\x85\xf0\x07\xad\xed\xe2\xa3\xdd\x72\x81\xf6\x54\x33\x6a\xfa\xfb\x73\x70\x78\x2b\x29\xca\xd6\x43\xd9\xd9\xdb\x2f\x05\xf2\x81\xb5\x3e\x13\x3e\xc3\x0e\xec\x09\xfb\x0d\x06\x1b\x74\x58\x1a\x2b\xd2\x79\x0b\x13\x73\x91\xf1\x93\x28\x88\x0f\x64\xc5\x3b\xe7\x00\xd0\xfa\xdd\xb7\x0d\xc1\x65\xd2\xd6\x2e\x67\x1e\xb9\x44\x9a\x2e\x6e\x9d\xf2\xc1\x6d\x8f\x49\xfa\x4b\x5b\x84\x30\x9f\x73\x35\x13\x3d\xbe\x87\x2c\x5a\x8f\xdc\xfb\xc4\x98\x0a\xbf\xb3\xc9\x59\x7d\x5d\x66\x7a\xd2\xf6\x88\xc7\xab\x24\xc9\xe4\x40\x29\x8d\x72\xb2\x8b\x0f\xcd\xe9\xc6\xf0\x71\xbc\xcc\x93\xe8\xdd\xbb\xa7\xb6\x0a\x0b\x54\x4a\x2e\x06\xc3\x9c\x67\x23\xd4\xf7\xdc\x18\x5c\x21\x13\x5f\xd1\x3a\x72\x77\x0b\x97\x61\x19\xe4\x9a\x1f\x81\xed\x47\x6b\xe0\x7c\x44\x3d\xe0\xb0\xee\x76\xfb\xd9\x19\x38\x93\x28\xb3\xeb\x86\x07\xbc\x2f\xe3\x8f\x85\x74\x5e\x28\xad\xb7\x48\x2b\x70\x1c\xcc\x66\x90\xe4\xae\x5a\x93\x32\xea\x44\x61\x31\x79\x38\x7d\xc6\xfc\x47\xc1\xd1\xec\x36\x60\x35\xe9\x91\xe1\x40\x43\x23\xbd\xbb\xf5\x35\xf1\xc3\x3c\xf5\x7b\x67\x23\xf1\x3c\xa6\xca\x32\x9e\x2a\xaa\x4b\x46\xb4\x26\x07\x33\x99\x06\xc7\xef\x49\xb3\x2d\xb8\x2c\xdf\x6a\x87\xad"}, +{{0x21,0x7e,0xcd,0x6a,0x7f,0xcc,0x98,0x71,0x92,0x10,0xc3,0x4c,0xc2,0xe1,0x4f,0x5e,0x2d,0x6b,0x5a,0x22,0xf2,0x68,0xc1,0x4b,0xc4,0xd8,0xa7,0xf2,0x81,0x72,0x00,0xc3,},{0xd5,0x91,0x91,0xce,0x28,0x2d,0x72,0xfe,0x3a,0xc4,0x58,0x78,0xe2,0x4b,0xb2,0xf2,0x8c,0x40,0x9b,0xa0,0x5d,0x76,0xce,0x9b,0xcf,0x22,0xf5,0x0b,0x0c,0x77,0x86,0x75,},{0xa0,0xb1,0x69,0xe8,0xe9,0xce,0x55,0x75,0x55,0xe0,0x33,0x4a,0x0d,0xe7,0x43,0x8e,0x55,0x36,0x75,0x48,0x9e,0xa4,0xba,0x9c,0xc6,0x3a,0x23,0x4d,0x00,0xde,0xd8,0xab,0x69,0x67,0xa3,0xbe,0x90,0xef,0x69,0xe0,0x76,0xdb,0x9e,0xa3,0xd5,0xca,0x23,0xb3,0x24,0x8d,0xd2,0x59,0x91,0xee,0x1f,0x4d,0x80,0x62,0x0b,0xf4,0xdb,0x43,0x8f,0x0e,},"\x9b\x53\x37\xe7\x8f\xb3\x82\xf2\x2e\xa6\x0e\x03\xc0\xbf\x3e\xe4\x70\x0b\x69\x78\xa9\x1e\xe6\xac\xdf\x6a\x40\x9e\x49\x18\xd1\x68\x48\x81\xfa\x1d\x11\x8c\x08\xc9\xf6\xf2\xca\x0c\xab\x56\x74\x02\xc9\x50\x10\xe7\xab\xdf\xe8\x48\xae\x79\xba\x24\x9a\xdc\xb9\x6e\xae\x1d\xfa\x08\x43\x95\x21\x39\xcf\x49\xb5\x88\x64\x78\x95\x69\x1a\x2e\x98\x80\x46\x6b\x7e\x77\xe5\x4f\x6f\x60\x81\x5e\xbf\xd5\xe5\x74\x8f\x41\x3c\x0e\x15\xf9\xd5\x76\x79\x9b\xcf\x31\x28\x47\x10\x63\x6f\x6e\x9d\xc7\x87\x85\x00\x79\x6e\xed\x80\xc8\xaf\x4b\xe2\x96\x19\x52\xea\x80\xbb\xed\x14\x04\xbd\x5d\xae\x9e\x6d\x05\xfd\x4f\x32\x5a\x3b\x83\xcd\x45\x28\xa0\x86\x9c\xef\x84\xb4\xd3\x0e\x02\xf9\x41\xd7\x49\xa8\xda\xc9\x7b\xb3\xfa\x83\x9d\x25\x73\x9b\x97\xec\x37\x45\x36\xbd\xea\x50\x04\x84\xa9\x41\xdb\x9f\x22\x99\x97\x06\x58\xd4\x11\x48\x29\x5c\xa0\x84\x6c\xa2\x36\x62\x38\xb6\x20\x1a\x48\xb3\xe4\x47\xed\xbe\xa7\xa4\xc8\xf7\x10\x20\x14\x27\x69\xe1\x5f\xa7\x2a\xe5\xf2\x87\x14\x0b\xc5\x95\x3b\x8a\x9a\x24\x2d\x20\x5f\xc0\x19\x09\x1f\x2a\xbe\xd0\xfd\xa4\x7f\x52\xd5\x9a\x02\x04\xce\x74\x01\xc1\x82\x9b\x58\x57\xb9\xa0\x91\x6f\xce\xbe\x2e\xef\x99\x1c\x41\x3a\xcd\x71\xb1\x8d\x85\x90\xd6\xb6\xd0\xfb\x39\x94\x30\x26\x78\xc2\x9f\x2b\x6a\x53\x02\x3f\x91\x87\xe4\x6c\x36\x79\x0b\xce\x73\x87\x3c\x54\x5a\x72\xbe\xb5\x53\x29\x4b\x1e\xe5\xd0\xd0\xdf\xf2\x39\xe2\x8e\xc6\x3b\x01\xe4\xd8\xfe\x0d\x6e\x69\xb1\x60\x1e\xfa\x24\x11\xf0\xc0\x60\x1e\x7e\x4f\x65\xc9\x84\xf8\x29\xf0\xdc\x2a\x84\x21\xe7\xf6\x6d\x93\x30\x53\x71\x51\xc7\x24\x3c\xa5\x24\xd7\xa5\x47\x35\xc6\xe3\x44\xf1\xfc\x93\x8e\xae\xea\x27\x79\xc9\x40\x89\x1d\x6d\x01\xaa\x55\xf4\x0c\xc1\xad\xba\x12\xe8\xa6\x7a\xd9\xa2\x7f\xe6\x3f\xb4\xf3\x8d\xc0\xf0\x18\x41\x92\x57\x18\x42\x72\x55\xbd\x66\x5d\x5e\xb3\xbc\x86\x98\x96\xdb\x86\x25\x20\x4a\xd4\xb0\x2f\x5a\x22\xaa\xee\xad\x6e\x30\x04\x71\xfe\xa6\x1d\xbb\x1b\x55\xc0\x71\x36\x5c\x58\xb1\x51\x1f\x38\xb0\x9a\x46\x71\xbd\x66\xb3\xfe\xdd\xa9\xc8\x7e\x43\xd1\xeb\xf3\x01\x76\x4e\x18\xfc\x0c\xf1\x6b\x2d\x2d\x67\xed\x23\x9b\x39\x3a\xc7\x19\x68\xa9\x03\xc0\x24\x77\xfb\x2d\xf9\xef\x01\xdb\xfc\x31\x67\xde\x72\x65\xf8\x91\xe4\xfd\x24\xd0\x2c\x63\x10\x35\x19\xb8\x6a\x70\x85\xb1\xec\x2f\xb4\x19\xdb\x76\x6b\xee\x7a\x64\x1a\x4b\xe4\x29\x61\x4a\xb8\x9f\x20\xf9\x75\x34\x10\x72\xbf\x04\x41\x9f\xb6\x9b\xe7\xa9\xee\x71\xa5\xb4\x9a\xf8\x3e\xd3\x22\xba\xc6\x8a\x42\x9f\xf5\xc5\x20\x67\x73\xbe\x54\x38\xb6\x5e\x53\xf6\x09\x72\x9f\x4f\x6a\x21\xc1\x33\x39\x11\x26\x4d\x63\x92\x70\x17\xe8\x13\x6b\x47\x25\xcd\x1c\xc9\x64\xe0\x8c\xa0\x93\x3a\x56\x1e\x7e\x3f\x59\x87\x76\x83\x30\xe2\xe5\x4f\x8d\x72\x8f\x59\xed\xfe\x2c\x91\xc4\xf9\x9a\xef\x97\xd1\x85\x59\x19\x5a\x3d\x8e\xb3\x15\xdf\xf9\x6f\xe2\x76\xda\x71\x37\xef\xf9\x30\x57\xac\x73\x1e\x06\xa6\x0a\x58\xbd\x8a\x9a\xe8\xc7\xcb\xaf\xf0\xcb\x33\x72\xc6\x8d\xaa\x17\x5c\x42\x8d\x52\xf1\x07\x3a\x38\xbf\x29\x46\x5d\x2a\x71\x28\xbb\x40\x07\x40\x06\xed\xcb\x72\x5a\x83\x1d\x81\x28\x64\xef\x43\xf3\xb8\x66\x7c\x9f\xb7\x10\x93\xa1\x67\x30\x49\xde\xc0\x5e\x09\x16\x9d\x86\xfe\xe9\x2d\xf2\x86\x00\x8a\xd9\x90\x65\xa2\x92\x97\x97\xa9\x13\xd0\x23\x3f\x4d\x1a\x95\xa2\x20\xbd\x91\xc1\x1d\xd9\xc4\x56\x85\xdc\xad\x38\x57\x80\xa0\xc4\x8b\x9c\x4a\xd2\xd6\x63\x03\xe8\xde\x4a\xf1\xdb\x3c\x04\xe4\xa3\xdd\x42\x19\xfe\x77\x3f\x83\xa8\x92\x4b\x0f\xcb\xff\xfc\xf2\x64\xab\xce\x32\x83\x29\x24\x03\x6b\xfa\xbb\xa6\x54\x6b\x1d\xf4\xe3\xf7\x88\xed\x8a\xd5\xc2\xcd\x92\xb2\x64\x1b\x47\x09\x0a\x10\x3c\xf5\xbd\xc4\x6d\x8b\x21\x43\x17\x47\x57\xda\x80\x1c\x36\x0a\x7a\xa1\x07\xfa\xc6\x54\xb3\x4c\x86\x0b\xd5\x4f\x76\xbb\xf4\x3c\x48\x47\x8d\xf4\xfe\x7a\xa5\x9c\xf9\x1d"}, +{{0x08,0xd1,0xd0,0x6f,0x3e,0xc2,0x9e,0xb5,0x22,0x93,0x90,0x7b,0x70,0x5e,0xc5,0x6c,0x5a,0xb3,0x54,0xfb,0x78,0x67,0x37,0x73,0xae,0x61,0x25,0x30,0x94,0xb8,0x9e,0x82,},{0xc1,0xb9,0x9a,0x87,0xad,0x15,0xbd,0x46,0xf6,0xc8,0x48,0x45,0x2a,0xf0,0xfa,0x3c,0xcc,0xcb,0x5c,0xdf,0x6e,0x34,0x8d,0x81,0x6e,0x36,0xc5,0xd0,0xfc,0xa6,0x6e,0x66,},{0x0b,0x8e,0xdc,0xb8,0xb1,0x5a,0x8c,0xd0,0x74,0xc4,0x1d,0xc2,0xa1,0xba,0x29,0xd9,0x64,0x8d,0x6a,0xcb,0xdc,0x33,0x83,0x14,0x70,0x7e,0xca,0x6f,0xb4,0x71,0x4c,0x99,0x54,0x3b,0x49,0x07,0xb9,0xf8,0x5e,0x57,0xee,0xcf,0xfe,0x0f,0x7a,0x6b,0x70,0x73,0xa8,0x09,0x46,0xf8,0x08,0x75,0x53,0xf4,0x68,0x31,0x09,0x27,0x3a,0x60,0x4a,0x08,},"\x12\x0b\x35\x57\x3c\x34\x91\x4b\x37\x30\x51\x88\x0d\xa2\x7e\xd2\x41\x37\x7f\x0e\x78\x97\x2c\x98\xd0\xfa\xeb\xaa\x76\x7e\xb7\xa7\xc7\xe7\xc6\xfc\x34\x05\xa4\x33\x6e\xf9\x5b\xc5\xda\x92\x25\xbb\xd0\x9e\x9e\x11\xf2\xa1\xbf\x14\x2a\xf4\xe8\xa0\xf9\x24\xd3\x23\xdd\x5a\x49\xdf\xe5\x84\xf0\x90\x43\x9c\x08\xe5\x15\x11\x34\x4d\x47\x0c\x62\x00\xac\x7e\x7c\xa1\x50\xd0\x88\xa9\x1e\x47\xc4\xc9\xff\x74\xe3\x8a\x42\xa3\x32\x15\x5d\x81\x52\xae\x4a\xbd\x11\x61\xad\xca\x93\x4c\x23\x4c\xe4\x60\xaf\x87\x89\xe5\x3f\x10\x9d\x7d\x31\xee\xde\x0a\x90\x9b\xd1\x93\xfc\x8d\x3c\x2c\xfe\xc1\x0b\x14\x3c\x31\x47\x67\x11\xbb\xec\x27\xe1\x96\xa5\x49\x85\xbc\x34\x71\x67\xac\xd2\x33\x50\x88\x27\xba\xd3\x6e\x54\x8c\x88\x06\x42\xb8\x6a\x28\xc6\xd3\x40\x4b\x51\x1d\xa2\x4f\x11\xdf\xaf\x6a\x8f\x46\xdd\xcb\xc9\xde\x9e\x39\x15\x97\x66\x9b\xdd\xfc\xa6\x56\x0f\x91\xac\xd3\x45\x9f\x32\x9b\xb0\x71\xdd\x80\xda\xdf\x35\xf0\xe5\x0d\xf5\xb1\x0f\x88\xd2\x67\xac\x9d\x30\x62\x33\x0d\xd9\x9a\x6b\xcf\xa1\x31\x87\xf4\x5c\x0c\x21\x4d\xcd\xe2\xcd\xf9\xc3\xba\x4d\x59\xe6\x33\xa3\x54\xa4\xe2\x77\xc6\x77\xbb\xdf\xa2\x41\x91\x17\x9c\xbc\xaf\x05\xa1\x0d\x40\x78\xd8\xad\xd9\x3b\xc9\xed\x8f\x6c\x6c\x49\x97\x57\x40\x36\x55\x34\x1f\x90\x4e\x37\xd9\x27\x75\x0c\x69\x9c\x26\x9d\xc9\x0d\xc2\x6d\x00\x56\x25\xc3\xf4\x12\x4b\xff\x66\xfe\xca\x59\xd4\xab\xff\x41\x72\xba\x3d\xf4\x5a\x87\x43\x02\x23\x10\x30\xfa\x78\x33\x84\xf5\x09\x99\xe3\xc4\xba\xa5\xea\xdb\x45\x14\x52\xc8\x88\xb5\x19\x27\x2e\x90\xf7\x3c\x68\x72\x76\x8e\x0d\xe2\x0e\xe2\xe5\xf9\x50\x2f\x35\xe4\x9f\xec\xc2\x8b\x75\x20\x18\x87\xfe\xd2\x81\x8e\xff\x54\x53\x98\x39\x2f\x5e\x5b\x68\x76\xbc\x55\x6a\xc1\x3a\x19\x03\xad\xa1\xb9\xd7\x25\xb0\x4a\x14\x20\x4b\x59\x9e\xc3\x3d\x62\xb7\xdc\xae\xea\x8c\x52\x87\x7b\x2c\xfd\xc3\x55\x8a\x91\xd2\xc9\x15\x75\x00\xa3\xbb\x6d\x45\x2e\x5e\x2f\xf0\x93\x29\x4f\xc4\x33\xcb\xd6\x34\x65\xbb\x19\x13\x07\xed\x80\x1a\x15\xb8\x5d\xc2\xff\x0b\xb3\x83\x12\xf8\xb8\x17\xa4\x36\xd4\x22\xcf\x46\x07\xc6\x4e\xe7\x03\x59\x23\xdb\x6b\x96\xa3\x89\x99\x10\x14\x9b\x0d\xa4\xaa\x3e\x96\x68\x5d\x71\x63\xaa\xcf\x9e\x61\x9d\xc6\x08\x13\xce\x4f\x34\x4f\x30\x79\xb4\x3f\x18\x7f\xa3\x1b\xda\xcb\x9a\x1d\x77\x20\xb9\x39\xd5\xbd\x24\x1b\x96\xa1\x77\xd7\xb7\x76\x8f\xfe\xbf\x79\x04\x4c\xd2\x95\x6d\x6f\x88\xdb\x1c\x24\x3a\x10\xfe\xde\x68\x14\x85\x2c\xf4\x04\xb2\xcd\xcf\xa7\x74\x07\x6d\xc1\x25\xc7\x0a\x57\xc6\x90\x7e\x99\xaf\xe3\x96\x22\xae\x11\xf5\x57\xe7\xd3\x4b\x39\xaa\xaf\x45\xf8\x34\x05\x8d\x2f\xe5\xf1\x5b\x5e\xb7\x0a\xc1\x5a\x90\xa3\xde\x58\x50\xab\x1d\xcb\x48\xb0\x6b\x6c\xca\xa4\xb4\x2f\x85\x7e\x71\xec\x00\xb8\xa3\xd8\x97\x4b\x0b\xea\x68\xfa\x0f\x66\x55\x92\x11\x5b\x4f\xa5\x55\x72\xcf\x0b\x07\x38\x64\x1f\xc8\x68\xd4\xa2\xe7\x14\xdb\x3a\xd7\x21\x9a\x82\x3d\x54\xb7\xf7\xc2\x65\x6b\xa5\xc5\xee\xbe\x35\x94\xc7\xdb\x12\x29\x8c\x16\x25\x1d\x98\x45\xbf\x2f\x78\x00\xb4\x19\x0b\x74\x6e\x21\xb0\xc1\xa5\xc4\x7a\x3d\xf9\xa0\x59\xce\x09\x56\x67\x4e\xb7\x03\xde\xcb\x0a\x00\x45\x43\x7d\xa4\xda\x10\xf2\x86\xd7\x20\xd1\xb9\xdf\x05\xfb\x24\x41\x5d\x68\xe0\x65\x57\x0e\x6b\x31\x50\x31\x42\xd0\x33\x35\xa8\x07\xbd\xca\x30\x89\x2e\xdb\x5f\x55\xf8\x98\x9d\x9e\x64\x96\x59\xc0\x74\x4c\x54\x33\xbf\xb4\xde\xeb\x11\xc2\x62\x6a\x86\x50\xe5\x4d\x4d\x39\x8b\xa1\x9b\x64\xf6\x8b\xed\x06\xd7\xfc\x40\x8f\x47\x0a\xc7\x04\xe2\xac\x92\x2a\xc1\x41\x1f\xee\x24\x54\x3e\x56\xf2\xf5\x0b\x6b\x08\x95\x3d\xc5\x6a\x7a\x75\xed\xae\x43\x0a\x6d\xf2\x8a\x22\x7a\xda\xc9\x1b\xa2\x6f\x0e\x19\x85\x95\x32\x77\x39\xcb\xa3\x03\xe9\xaa\x39\x3e\xa6\x61\x8a\x84\xf8\xf5\x03\xd0\x05\x6e\xe8\xd8\x7e\x37\x96\xe0\x36\xcc\x51\xcc\xb7\x91\xde\xb7\x95"}, +{{0xf0,0xc8,0x5c,0x76,0xb1,0x53,0x2e,0x89,0xae,0xa9,0x75,0x15,0x6d,0xdd,0xb1,0xd3,0xd0,0x66,0xf6,0x40,0x9f,0x84,0x1b,0xb4,0x41,0x09,0x22,0x72,0x5f,0x26,0x9d,0x86,},{0xfd,0x75,0xfc,0x75,0xc3,0x6f,0x83,0x49,0x8d,0x8f,0x08,0x27,0xf0,0x1d,0x3b,0x45,0x7f,0x8b,0xc4,0xd9,0xdc,0x55,0xe4,0xa4,0x62,0x74,0xdd,0xf0,0x03,0x4f,0xe1,0x6f,},{0x42,0x18,0xfe,0x4c,0x1d,0xce,0x79,0x5c,0xa9,0x2a,0x49,0xa6,0xf4,0x79,0x8e,0xb5,0x41,0x2d,0xc8,0x25,0x86,0x03,0x14,0xec,0x46,0x9f,0xed,0x45,0xde,0x3a,0x7b,0xf8,0xea,0x55,0xe8,0x53,0xa3,0x49,0x58,0x4b,0xd9,0x5a,0x82,0x6a,0x58,0x5a,0x50,0x3f,0xd5,0x0b,0xfe,0x4c,0x63,0x5e,0xf1,0x83,0xd0,0x73,0x01,0x36,0x7e,0x90,0x10,0x0a,},"\xae\x2e\xb0\x18\xd4\x8d\xbd\x4f\x21\x0b\x16\x77\x8b\x5b\xd2\xfd\x14\xc9\x4e\x6b\xbf\x2b\x3f\xf8\x55\x18\xe5\x60\xab\x8d\x3e\x72\x20\x1f\x43\x34\x20\xf0\x0f\x11\xbc\x78\xe0\xe9\xf3\x72\x08\x75\xb2\xe9\xdc\x11\xe0\x43\x25\xb8\xb3\xf0\xd4\x65\xdd\xab\x21\x51\x1c\x45\x7d\x6a\xca\xd8\xf2\xfd\x5f\xdc\x0d\x28\x23\xfe\x6c\xaa\x66\xa1\x91\xa3\xb6\x32\x6b\x32\xa1\x6b\xef\xd6\x4d\x15\xb3\x61\xa4\x15\x13\x64\x1b\xce\xba\x26\xbf\xe9\x3b\xdf\x85\x4a\x4f\x8f\x8a\x0b\x29\xf7\xe2\x82\x62\xe2\xd6\xe9\x8a\xa2\x4a\xc2\x7f\x6f\x78\x83\xac\x01\xa7\x4c\x40\xcc\xe9\x47\xeb\xac\x70\xe9\xfe\xf2\xa1\x6e\x62\x89\xe4\x68\x95\x0e\x39\x1e\x9e\x24\xef\x58\xe8\x8a\x44\x37\x72\x69\xce\xba\xfe\xd8\x98\x7d\x22\x0d\xca\xe2\xd8\xb1\x26\xb6\xbf\x81\x21\x67\xd0\x23\xd9\xba\xac\x95\x0d\x9d\xb8\xcf\x52\xde\x63\x06\xbd\x48\x99\x96\x10\xc0\xa4\x33\xfa\x9e\x17\x71\xcb\x83\x2d\x41\x97\xaa\x34\x0d\xd0\xcc\xd0\x74\x4f\xc6\xb6\x2f\x90\xbd\x3e\xbb\x53\x08\xca\xb5\xf9\x40\xe2\x91\x64\x23\xcf\x0f\x3b\xf0\x80\xc0\x6a\x94\xf0\x26\x91\x04\x60\xdd\xa8\x09\x37\x4e\x64\x57\xf0\x64\xf1\x78\xe3\x08\xe7\xa1\xb5\xaf\x4d\xef\x31\x90\x07\xd0\x41\x77\x8c\x3d\x6a\x41\x9f\x51\xba\xdf\x87\x66\x38\x79\x30\x2b\x53\xff\x26\x9d\xf4\x42\xd0\xe0\x5c\x95\x8d\x5b\xaa\xcc\xee\xd7\xf5\xf8\xaf\xc8\x11\xc1\x89\x00\xee\x3b\x0f\x61\xe5\xdc\xcf\xd5\xda\xc8\x53\x32\xd3\x2e\xbb\xa3\x71\xaa\x2d\x47\xa6\x06\xf5\x95\x46\xe4\xbb\xb6\x05\xa7\x46\x77\xb1\x9a\x0f\xe8\xe9\x5f\x9f\x77\xc0\xb8\xb7\x1d\x07\xe9\x83\x00\x4d\xc2\xab\x2c\xb3\x79\x3a\x32\x3c\x10\x8d\xfa\x79\x70\xda\x00\xdb\x19\x86\x74\xbd\x34\xbf\x73\x10\x76\x7f\x76\xa2\x24\xe0\x7b\xdb\xc6\x2b\x9d\x07\x8c\xbc\x75\x36\x7e\x2e\xba\xa2\xc5\xd2\x74\xbf\x34\x27\xf2\xa0\xcc\x5d\xbe\xf0\xaf\x4e\x63\xad\x88\x9e\x13\x1b\x12\xbc\x8c\xa3\x2d\x82\x7f\x72\x60\xb0\x44\x9d\x04\x43\xfa\x28\x84\x40\xef\xd1\x36\x4e\x3c\x98\x49\x47\x7e\x73\xee\x0b\xa4\x24\x0d\x49\x2a\xf5\xce\x13\xc3\x45\x61\xb4\x50\x10\xc1\x09\xd8\x42\xc1\xfe\xd1\xbe\x3f\xa9\xe1\x84\xaa\xa1\x40\x64\xf4\x3f\x6d\xea\x0b\x65\x9c\x5b\x97\x89\x3c\xf2\xa4\x33\xbc\xfb\x1d\x2a\x87\xeb\x56\x4b\xd9\x09\x2c\x26\x66\x70\x47\x31\xf8\x3e\x56\x43\x4b\x2a\x42\x99\x65\x0c\x70\x60\xf9\xff\x7e\x8a\xad\xcb\x45\x93\xf6\x09\x18\x8d\x8b\x46\x76\x46\xcf\xe9\x52\x70\x06\x7a\x1d\x35\xcd\x75\x9f\xe5\x81\xaf\x4e\x62\x60\x2c\x02\xef\x14\x74\x41\x43\xeb\x42\x4f\x2d\x9f\x33\xa6\x02\x88\xc1\xb2\x5f\x08\xe4\xb2\xf5\xfe\xae\x06\xcb\xcc\x2b\x20\x52\xbf\x38\x4e\x1a\x6f\xcd\x84\x71\xce\x5e\x56\x58\xd7\x7f\x40\xc3\x5c\x41\x5e\x2a\x9e\x09\xfb\x58\x3b\xb7\x47\x12\x58\xe7\xc8\x06\xf3\xc2\x18\x22\xdd\x10\xf5\x6a\x64\x0c\xdc\x00\x12\x8d\x3b\xa5\x56\xba\x51\xdc\xaa\xb4\x7c\x3b\xaf\x9f\x01\x97\xd3\x66\x3d\xe8\xd0\x93\xe8\x31\x73\x32\x5d\xef\x1e\x83\xa2\xf5\xf5\xac\xf1\x2a\xe0\x9f\x3c\xe9\x6c\xd8\x88\x03\x4d\xcb\xe6\x14\x7d\xc5\x99\x83\x62\xa4\xbc\x40\x6d\x28\x84\x6a\xb1\x50\x3c\x17\xc9\x4f\x9a\xfd\x90\x3c\x9a\x58\xe1\xce\xbb\x4a\xbb\x4f\xf6\xf2\xa4\x10\x24\xe0\x6d\xca\xad\x14\xf5\xb7\x0c\x1b\x26\xe6\x9f\x96\xec\xf1\x4b\x8d\xa3\x1c\x62\x1f\x9a\xd4\xe3\x0a\xeb\x98\x23\x78\x67\x1f\x7d\x1f\x2c\x4b\x57\x2c\x41\xbb\x88\x30\x84\x0a\xc5\xdd\xce\xd8\x81\xf8\xff\xf2\x10\xc3\xc7\xf2\x36\xd8\xc5\xf2\xcf\xda\xcd\xa2\x98\x93\x30\x2f\xde\x15\x28\x2d\xb5\x40\xcb\x54\x37\x37\xdd\x77\x85\x25\x69\x22\x1f\xdd\xcd\xd6\x8d\x87\xe2\x40\x21\x79\xd3\xa5\xa7\x77\x34\xc2\x75\xa1\xd5\x60\xa4\x62\xf4\x03\x18\xbb\x68\x19\x83\x7d\xa3\xd3\x05\xeb\x49\xb3\x86\x50\xef\xdc\x8f\xe4\x09\xd4\x0f\xb9\x4c\xd5\xdc\x3e\xb0\x27\x38\xf3\x88\x52\xf6\x71\xa0\xc4\x14\x14\xb7\x6f\xb4\x36\xf3\x41\x7b\x8e\xf3\x00\x92\x1c\x00\x9e\xbb\xd7\xcf\x8e\x11"}, +{{0x18,0xe2,0x68,0xb1,0x5a,0x25,0x01,0xdd,0x4c,0x97,0x9d,0xc1,0x03,0xca,0x6a,0x84,0x22,0x16,0x13,0x2b,0x3b,0x50,0x81,0xd7,0x75,0xf8,0x86,0x40,0xf8,0x9c,0x80,0x41,},{0xb3,0x4e,0x19,0xc1,0xe2,0x08,0xfb,0x48,0xa8,0x85,0x07,0x9d,0x9f,0xbf,0x37,0xc7,0x4f,0x92,0x71,0x09,0x60,0xf8,0x32,0x15,0x4f,0xab,0x18,0x57,0x0c,0xfb,0x4c,0x1d,},{0xf2,0xdc,0xfc,0x06,0xef,0x1d,0x8e,0xcc,0xd8,0xe4,0x0b,0xdf,0x01,0x30,0x7d,0xd1,0x96,0x83,0xf2,0x14,0xd4,0xf0,0x84,0xe6,0xb6,0x93,0x4f,0x63,0x72,0x78,0x30,0x0d,0xbb,0x18,0x89,0xf2,0xd3,0x7f,0x53,0xb3,0xae,0xf2,0x6f,0xbb,0x3e,0x36,0xbd,0x75,0x98,0x5f,0xa7,0xc8,0xea,0x6d,0xdf,0xfa,0x72,0xc8,0xe4,0x06,0xf2,0x4b,0xb2,0x0e,},"\x42\x4b\xdc\xf0\xb2\x56\x00\x14\x39\xd1\x69\x58\xff\xf6\x48\xcf\x7a\x86\x04\xaf\x22\xcf\xa5\xb4\x43\x31\xb4\xdc\x35\x6d\xff\x25\xcc\x05\x63\xda\x9d\x64\x01\x33\xac\xb7\x0b\x6a\x11\x76\xc4\x82\xdb\xc9\x40\x8c\xd6\x79\x3d\x56\xbc\x29\xcc\x40\x88\x23\xd3\x88\xed\x88\xb2\x4c\xeb\x66\x21\xdb\xac\x00\x23\xee\x69\xf7\x6f\x82\x96\xa7\x39\x52\x11\x68\x5b\x3c\xea\xa9\x95\xf0\x35\x5d\x9a\xad\x3d\x97\x35\x8f\x4a\x37\x9e\x59\x20\xec\x54\x5f\x46\x96\x21\xcf\x76\x8a\xbf\x55\xd2\xa5\x54\xc9\x49\xb0\xed\x70\x18\x7c\x22\x05\xad\x03\x29\x85\xc9\xb5\xb2\xe4\xba\x57\xe0\xb4\xa4\x7d\x34\x45\x12\xb8\x4b\xfe\x9f\x3a\xa5\x60\xfe\x6e\xcf\xc5\xbd\xf8\xc3\xb4\x18\x45\x29\x35\x73\xf8\x1e\xd3\xb7\x0e\xdc\x63\xa3\x0c\x70\xcd\xa3\xf4\x55\x90\x13\x13\xf6\xd2\x3d\xb3\x09\x47\x8f\x03\xe3\x4e\x71\x35\x6d\x83\xfa\x5d\xb9\x28\x0c\xc2\xb4\x36\x9c\x3d\x24\xdd\x90\x38\xf2\x47\x59\x6c\x39\x1e\x48\xb2\xf3\xf8\x90\xa1\x41\xca\x1d\x12\x07\x7c\x69\x34\x47\x35\xa5\x9b\x1d\xd4\x07\x6b\x22\xe1\x61\x89\x99\x1e\x5f\x1b\xe4\xfb\x76\x95\xaf\x90\xeb\xea\x5d\xf2\x86\x13\x5c\xec\x2a\x6e\x99\xaa\x1d\xda\x32\x8e\x62\xc0\xdf\xb6\x37\x42\x20\x2d\x63\x62\x4d\xcc\x0c\x5c\xf1\xa5\xdf\x79\xe2\x87\x8d\xbc\x71\xfa\x96\x57\x66\x01\xaf\x22\x84\x4f\x54\x57\x33\x12\x6a\xf7\xd3\x98\x4c\x3e\xd2\x52\xe6\xa8\x76\x44\x5c\x92\x25\x9f\xbb\x47\x0a\x10\x56\x9b\x49\xe5\x79\x1f\xd0\x18\x2c\xfe\x1c\x3f\x88\x29\x7f\xac\xc8\xc3\x1a\x53\x32\xf1\xf4\xeb\x49\x58\xdb\x13\xb6\xc0\x79\xaa\x9c\x94\x94\x87\x26\x34\x03\x19\x0c\x83\xc1\x1a\x43\x19\x1f\xfe\xc6\x02\x3f\xb3\x4c\xfa\xb2\x52\x5b\xeb\x54\x6c\xf9\x20\x0a\x96\xf5\x85\x4b\x2f\x78\xec\xb2\xd9\xa5\x3a\xa9\xd2\x87\xa9\x0d\x4d\x41\x0a\x63\xad\xa0\xe9\x75\xd3\x04\xd5\x14\x83\x53\x46\x3f\xa8\x05\xb4\x80\x5f\xb4\x68\x7e\xd8\x85\x7d\xfc\xe4\xbc\x6e\x80\x83\x3c\x8f\x9a\x79\xcd\x4f\x02\x9a\x2d\x80\x2b\xfd\xc8\x19\xed\x0c\x0a\xc8\xf2\x10\x23\x28\x7f\x2b\x4b\xaf\xbc\xc8\x99\x93\xfe\x46\xd5\x2a\x9c\x62\x46\xde\xad\x61\x7d\xf7\x97\xd4\x8e\xe9\x85\xf0\xf0\xdf\x9a\xa8\x2e\xa2\x0e\x0d\x0d\xb2\x8a\x25\x4a\x9a\x25\x3f\x39\xf9\xcf\x01\xe3\xdb\x8f\x3e\xbc\xf7\xcb\x97\xce\xc5\x8c\x4e\xfe\x03\x12\x69\xb4\xb3\x7e\x4c\xbb\x36\x1f\x73\xab\x4b\x49\x80\xbd\x90\x08\x49\x53\x88\x44\xc5\x2c\xb3\xac\x75\x83\xb8\xf8\x96\x53\xa0\xde\x65\xa8\xbe\x91\x58\x2c\x55\x23\x9c\xb8\xf5\xd5\x31\x8a\x88\xd1\x60\xe1\xc8\x71\xe5\xea\x7e\x75\xf5\xa6\x9c\xba\x85\x38\x22\x1a\xb4\x2c\xe2\xa2\xc4\xd9\xc3\xb7\xec\x85\x7f\x23\x0d\x57\x37\x31\x13\x36\x86\xae\x8a\x7e\xd6\x40\xf4\x2f\x31\x02\x94\x89\xe4\xe6\xaf\x2b\x3e\xa4\xc7\x94\x8e\xd5\x37\xc0\xc5\x90\x67\x26\xc2\xb6\x25\xfd\x5f\x94\x9e\x3a\x7c\xf3\xb6\xe9\x98\xec\x76\x1d\xd6\xe2\xb5\x17\x1a\x68\x74\x97\x52\xe7\x21\xb7\x88\xc3\x47\x7f\xa1\x90\xcd\x6e\xa8\x1d\x57\x9d\xce\x64\x62\xd9\xc6\x62\xad\x89\x62\xe7\x93\x38\x71\x0c\xc8\xd2\x73\x8a\x5f\xb0\x4a\xdf\xdb\x3f\x14\x32\xcf\xd8\x0e\x2e\x96\x7d\xa0\x00\xd8\x3a\x0f\xa8\x5a\xba\xe2\x95\x2f\x3f\x36\x83\xe2\x54\xd8\x68\xf4\xbf\x80\x9e\xb2\xe3\x00\xe7\xb2\x09\x73\x4a\x3c\x89\x4e\x96\x6b\x16\x08\x8d\x5e\xd3\x54\xbf\xfb\xff\xbb\xf2\xec\x2b\xe9\x3a\x32\xa8\xbe\x5c\xfa\x18\xfa\x56\x53\x01\x2e\xda\xe5\xaf\xd8\x70\x9c\xa5\x5c\x0c\xf2\x3a\x55\x0d\x34\xca\x0f\x32\xd8\xf6\x66\xfb\x47\xa1\x2f\x2b\x73\x53\xa4\x0c\x53\x79\xf7\x53\x66\xc1\x3f\x4a\xb9\xf1\x4c\xf8\x0a\x94\xe1\xf1\x3d\x8b\x09\xb7\x6f\xd8\xd1\x4f\xfa\x53\x8f\x31\xfd\x8a\xeb\x49\xd3\x34\x33\xf4\xdf\x7c\x2c\xa6\x73\x99\x57\x9f\xe9\x90\x78\xaa\x72\x1d\x6b\x6f\xc0\xc5\x0e\x8a\x91\xfc\x71\xca\x25\xea\xc1\x37\x6f\xc6\x71\xbf\x61\x53\xe7\x20\xb2\x5c\x7e\x97\xa3\xd4\xef\x84\x42\xac\x67\xac\xf5\x8b\x50\x4b\x67\x15\x8f\x91\x30\x25"}, +{{0x3c,0x39,0x3f,0x9d,0xf1,0xfb,0x0b,0x1e,0xec,0x09,0xb7,0xf2,0x70,0xb8,0x59,0x82,0xba,0x0f,0xd5,0xe4,0xb1,0x79,0x5e,0x1a,0x7f,0xa9,0x91,0x37,0xfe,0xe2,0x4d,0x7d,},{0x97,0x4f,0xe2,0x37,0x30,0xfc,0x17,0x94,0x56,0x70,0xfb,0xc1,0xf8,0x0b,0x93,0xf9,0x45,0x93,0xc8,0xd4,0x4b,0xc7,0x5d,0x18,0x9a,0x6b,0xbf,0xaa,0xba,0xf5,0xdb,0xd9,},{0x22,0x33,0x3e,0x56,0x41,0x0f,0xdc,0xbf,0x84,0xf6,0xa8,0xde,0x74,0x13,0x37,0x69,0x16,0x84,0x49,0x5b,0xa6,0x9e,0xff,0x59,0x6d,0xb9,0xc0,0x3a,0x28,0x12,0x10,0x88,0x1e,0x6c,0x91,0xef,0xa9,0x1b,0x21,0x83,0xc0,0xea,0xc9,0x16,0x15,0x28,0x17,0xa7,0x8c,0xa7,0x24,0xba,0x7c,0x8b,0x51,0xbb,0x4c,0xaa,0xde,0xa9,0xa3,0x41,0xeb,0x0e,},"\x54\xd8\xb8\xd5\xfa\xc2\x8c\xff\xa7\x7a\x09\x16\xd6\x33\x3c\x16\xed\xbc\x8b\xb7\x4a\xa0\x6e\x56\xdc\x00\xe4\x7e\x39\x29\xe4\x08\x64\xb8\x84\x0d\x91\x20\x79\x59\x7e\xac\xd8\x1d\xae\x43\xe2\x78\x5d\xfc\x68\x9f\x3e\x85\xf8\xc6\x65\x81\xef\xc5\xe8\x53\xd1\xfa\xaa\xc7\x44\x40\x0a\xb0\x8c\xbd\xb5\xd1\x61\x46\xfa\x60\xf9\x99\x05\xed\x84\xfd\x29\x36\xdd\x73\xf4\xbc\xa2\x57\x2b\x7c\xf5\x16\x05\x60\xff\xaa\x68\xda\x7a\x67\xe4\x0e\x08\xa7\xbb\x7a\xef\xc4\x04\x3e\xbe\xd5\xfe\x80\xa4\x14\x81\x7e\xdf\x2c\x63\xf6\x2f\xac\x0d\x47\x44\x6e\xd0\xbb\x58\x40\x58\xf4\x87\x2f\xec\xff\x62\x15\x59\x31\x1a\x27\x0a\xea\x37\xa6\x29\x68\x64\xe8\xd1\x68\xbf\x1e\x2f\x55\xcd\x3b\x27\x6e\xdf\xa6\x12\xb5\xd9\xc3\x36\x2e\x61\x8b\xe6\xe8\x2a\x6e\x5f\x82\x66\x79\x24\xf3\xd1\xd3\xdf\x82\x5f\x9d\x23\xf4\xd6\x14\x2d\x31\x00\xdf\xc7\x0f\x70\x60\x3a\xbf\x3f\xda\xda\xca\x69\xef\x6a\x18\xef\x90\x92\xb3\xc4\x1e\xc6\x58\xab\x27\x21\x6f\xc6\x14\x7a\x08\x0a\xcd\xa6\x0a\x84\x19\x84\xee\x83\xf4\x1a\xc4\x2a\x80\xea\xac\x91\xff\xfc\x82\x28\x39\x1e\xf5\x83\xab\x3e\xdd\xcf\x87\x65\x23\xc2\x02\x81\x35\x53\x00\xd8\x6c\x11\xa4\xe7\xc1\xad\xe8\xe5\x05\x60\xf4\x39\x06\xc9\xbc\x8c\xa5\xfb\xf8\x33\x9f\xbe\xbd\x02\xe3\x3e\x85\x18\xbe\xe5\xe8\x06\xb8\xc1\x0f\x82\x77\xf4\x10\x66\x47\x35\xa2\xbf\x55\x68\x39\x63\x54\x92\x45\x2e\x6c\xa0\x79\xde\xb9\x75\x1c\xfc\x67\x97\xf4\x9b\xca\x96\x13\xff\x2e\x7f\xdd\x36\x46\xf7\xc5\x23\x6a\x36\xbd\xf0\x05\x17\x45\xe5\x95\xdc\x00\x72\xfd\x66\x51\xd5\x76\x27\xa6\x00\x4c\x0f\x0c\xfa\xe8\x56\xbb\xc2\x8a\x12\x31\xcb\x83\x96\x65\xff\x04\x15\x2e\xc3\x1c\x00\x7b\x3e\x2e\xd0\xa9\x73\xb2\x4c\x93\x14\x9c\xe7\x01\xe6\xfd\x65\x39\x20\x6a\xe9\x1b\xec\x4c\xe6\x5a\x89\xdb\x26\xc7\xd3\x8c\xec\xb8\x91\x9f\x96\xfb\x6c\xb8\xf6\xc1\x93\x9d\x90\xfb\x3f\x90\xb8\x87\x78\x9f\x29\x57\x5a\xb2\x0e\x0b\x08\xbc\x35\x81\x53\xd8\xc0\x35\x21\xdc\x89\x18\x70\xb5\xf7\xee\xdc\xc1\xe6\x2b\xee\x7d\xa0\x63\xae\x66\xff\x0a\x4b\x7d\x98\xd1\xcb\x75\x8f\x69\x74\x3c\x3d\xb3\xae\x2a\x2c\x9b\xe1\xbe\x09\x4f\x17\xcd\x28\xf9\x2d\x8c\xcb\xca\x98\x3c\x74\x9c\x75\xc6\x10\xf8\x40\x83\x6e\x2c\x43\x0c\xcd\xef\xf0\xaf\xa5\x44\x44\xf1\x2b\x4a\x4f\x00\x2c\x60\x94\x51\x83\x42\x44\xc0\xc0\x7d\xf8\xe1\x22\x02\xa6\x5f\x94\x44\x7c\xd4\x90\x3a\xcb\x60\x6d\x77\x25\xa8\x6e\x4a\x23\x43\x98\x4e\x67\x9c\x4a\xf1\xb3\x67\x9c\x75\x5e\xa5\x0d\x0a\xbe\x2f\xcc\x0c\x1c\x33\x51\xa9\xee\x19\x6b\x46\x44\xc4\x24\x22\x2b\xe9\x9e\x2f\xb3\x73\xf9\x64\x1e\x3f\xae\xbf\xf4\x31\x70\xeb\x03\xfb\x8e\xc4\x55\x7d\x15\x1a\x55\xfa\xb6\xc4\x99\xd4\x44\xc8\x4b\xe8\x9f\x24\x47\x68\x2d\xe4\xe6\xf6\x35\x34\x75\xef\xcb\x8f\xc5\x32\x56\x76\x3a\x94\x8d\xc7\x5c\x51\x5f\xa3\x53\x54\x5d\x0c\xba\xd2\x9d\xf5\xe9\xdb\x5c\xc4\x57\xed\x30\x86\xcf\xfb\x3d\x75\xe8\x46\xc4\xe8\xd8\x81\x47\xfc\xd0\xd8\xaa\x5a\xba\xb4\x9b\x5e\x05\xc3\xd7\xfe\xef\x63\x79\x43\x34\x7a\xd3\xf4\x92\xee\x35\x6e\xf3\x48\x81\xcf\xd8\x5a\xbc\xe8\xa1\x44\xce\x77\x61\xe2\x84\xe8\xb8\xcb\x08\x96\x60\x49\x04\x7a\x99\x6e\x23\x55\x9f\x77\x6b\x1a\x9f\x41\xcb\xa3\x95\x41\x08\x48\x6e\x29\x27\xbe\xb6\x43\x3a\x36\xff\x8b\x2f\x03\xaa\x74\xb3\xd2\x09\xc4\x88\xe0\x77\xf9\x24\xf2\x31\xe2\x83\x45\x94\x2c\x7d\xcc\x2e\x61\xd7\xc9\xb5\x22\xb6\x59\xfc\xb5\x36\x62\xaf\xf3\x64\x8f\x66\xda\x3e\x83\xe5\x9b\x0d\xaa\x90\xb9\x4c\x51\x5d\xad\xab\x10\xd5\xa8\x39\xcb\x3a\x2f\x1d\x3c\xd0\x92\xde\x55\xd9\x95\x13\x8c\x3a\xc0\xb9\x07\xaf\x15\xac\x63\xec\x18\x74\x11\x43\x27\xe2\x19\x71\x34\x5e\xf1\x70\x31\xd5\x26\x17\xe7\x84\xda\x37\x71\x43\x9b\xe2\xe8\x41\x48\xbc\xfe\xa1\x32\xbd\xe1\x0e\x6f\xda\x54\x7d\xcb\xb1\xc4\xd8\xf7\x4d\xdc\xe1\xfc\xcf\x82\x13\xe0\xda\x6e\x97\xb8\x1f\x75"}, +{{0xf8,0x66,0x9c,0x88,0xf1,0x68,0x5b,0xbf,0x04,0x80,0xcc,0x92,0x21,0xac,0x2e,0xad,0x8f,0x55,0x1b,0xfa,0x87,0xec,0xba,0x2f,0xd4,0xdd,0xf3,0xba,0x34,0x76,0xeb,0xda,},{0x34,0x72,0x3f,0xb8,0xe2,0x53,0xad,0x9c,0x71,0xce,0xfd,0xe0,0x36,0x28,0xd2,0x04,0xe5,0x35,0xde,0x47,0x9e,0x10,0x48,0xe5,0x18,0x87,0x62,0xa1,0xf3,0x37,0xfe,0x5f,},{0x37,0x46,0xda,0x6c,0xd8,0xca,0x10,0x8b,0xee,0xf0,0x64,0x87,0xbe,0xe6,0x35,0x84,0xf8,0x12,0xc8,0xe0,0x69,0x5f,0xc8,0x63,0xb8,0x6e,0x5d,0xb1,0x32,0x38,0x0b,0x62,0xff,0x85,0x44,0xf6,0xf3,0x74,0x82,0x5b,0x0e,0x3e,0xa0,0x62,0x0e,0xf8,0x54,0xc1,0x33,0x11,0x14,0xd6,0x67,0xdf,0x1f,0x9e,0xa7,0x76,0xc3,0x96,0x38,0x70,0x29,0x0d,},"\x5b\x49\x41\xbe\xec\x22\x41\xc9\xfb\x76\xd8\x48\x4f\x4f\x3f\x3a\xb4\xff\xe8\xec\xc8\xe7\xae\xc7\x6d\xe2\xab\x8c\x36\x85\x84\xd7\x51\xb0\xd3\xfe\xb8\xa1\xdc\x81\x68\xcd\xc6\x94\x96\x8f\x66\xb2\xa0\xb0\x52\xaf\xbf\x8b\xe3\xa7\xd9\x51\x63\xe9\xda\x91\x41\xc5\x9c\xa5\x59\x76\xc2\x92\xc5\xc7\x4d\x31\x31\x8d\x6a\x91\xe7\x81\x7c\x5a\x8b\x2f\x81\x21\x18\xcb\xeb\xa3\xa1\x33\x23\xcd\x97\x48\xbf\x86\xed\x1a\x85\xdd\x4e\xbc\x0d\xf4\x95\xcf\xa3\xd4\x62\x74\x34\xbf\x14\xaa\xe8\xab\x67\x81\x46\x7a\x56\xd9\x65\xd1\x0e\x63\x71\x98\x9d\xfa\x0f\x6b\xc0\xf7\x85\x9f\x37\x71\xeb\x90\x04\xb3\x43\x67\xdb\x27\x05\xdb\xd6\x0f\xa8\xf7\x89\x5c\x1e\xad\xf5\x9f\x53\xda\xb1\x68\xb4\xf9\x36\x39\x79\x02\x55\x01\xdd\xd9\x68\x0d\xeb\xc0\x7c\xd1\xca\x4a\x09\x97\x87\x6e\x92\x11\xf3\x07\xd9\xb7\xb9\xd9\x04\xe4\x8d\x28\x61\xa7\x78\xb8\x79\xad\x59\x0a\x9a\x2f\x14\x1b\xd5\x68\xe3\xa1\xbb\x24\x94\x62\x8e\x9e\xc0\xc6\x42\x55\xae\xea\x6f\x0e\xed\xca\x30\xad\x38\xa1\xf3\xff\xec\x3b\x2b\x5e\x94\x2e\x21\x94\x01\x04\xe9\x14\xd1\x1a\x44\xc0\x0f\xdd\x47\xda\x3e\x55\x13\xaa\x85\x30\xae\xe2\x47\xc9\x5c\xa6\x6d\x08\xa2\x60\x8c\x75\xba\x98\x58\xda\x14\xf9\xa8\xa3\x2b\xe7\x13\xd3\x09\xe0\xf5\x84\xc8\x1e\xf5\xbe\x04\x0e\x00\x65\xf0\x7b\x77\x5a\xe1\x75\xdf\xe2\xc8\xb9\x0a\x88\xcc\xda\x17\xfa\x4f\x21\xc7\x7e\xad\xf5\xd2\x5b\x6e\x40\x4b\xf0\x04\x47\x9e\x05\xa0\x1a\xc0\x04\x2b\x89\x93\x7e\xb2\x78\xc1\xc3\x4f\x33\x02\x8d\xb7\x80\xba\x3b\x61\x79\x18\x59\x5a\x39\xc0\xfc\xad\x67\x4b\x85\xc4\x0c\xac\x8d\x34\x5b\x7c\xa0\xbb\x48\xa2\x8e\x66\xc4\x4d\x8b\xb5\xf2\x79\x41\xe4\x0b\x0e\x9c\x70\x97\x97\x6c\x62\xdf\xef\x50\xc9\x8f\x17\x56\x6c\xcb\xac\xc8\x7c\xb0\x3b\x94\xdf\xdf\xaf\x32\xf1\xe5\x6f\xfa\x63\x9d\x63\x61\x1e\x21\x3c\xeb\xf5\x4c\xd0\xa3\xe2\x17\x2d\x81\x1c\x0e\xbd\x75\xb1\xa8\x64\x62\x64\xdd\x8b\x1a\xbd\x46\xe5\x48\x97\x2a\x1b\x26\x2c\xd9\x5d\x51\x15\x36\xdd\xdc\xb4\x97\x29\xfe\x7b\xd0\x0b\x38\x38\xbd\x2f\x20\xa1\x42\x64\x0e\xdb\x1b\x6e\x76\x5b\x65\xda\x72\xe7\x23\x32\x61\xc8\x89\x2e\x2f\x49\x49\xbb\x51\xf3\x2a\x1a\x5a\x3e\xe1\x49\xbe\xa2\x6f\xdc\xed\xb9\x91\xd2\xcd\x12\x66\x37\xe2\x97\x1e\x9b\x6f\x0b\x78\x5d\xf2\x8a\x48\xf3\x01\x70\x73\x49\x42\x3f\x44\xe8\x46\x22\x89\xd7\x25\x49\x82\x30\x48\x9d\xf1\xb5\x1b\xe3\x0f\x08\xd7\xe3\x25\x05\x65\xc6\xef\x82\x4b\xc5\x3a\x1b\xa7\x4a\x57\xa2\x5c\x06\x86\xad\xcb\x6c\x82\x5a\xb1\xca\x70\xc8\xa5\xd4\x6d\xbb\xc6\xfa\x60\x74\x61\xe2\x6d\x16\xfe\x93\xbb\x3d\x3a\x94\x3a\x3d\xc0\x5f\x30\xea\x6d\xc8\xbb\x12\xd7\x08\x21\xd3\x20\xf1\xad\xf1\xce\xba\x4b\xe6\x57\x19\x4f\x7f\xcc\xd2\x19\x90\xf8\x62\x9d\x74\x46\x01\xcf\x52\xea\x6d\x94\x05\xaa\xa2\x87\x8f\x1e\xec\x40\x03\xb4\x5a\x42\x18\xd8\xf8\x0b\xb0\xf5\xaf\x04\x73\x26\x48\x77\x52\xe2\xb7\x6d\x68\x87\x25\x20\xbb\xea\xe7\xb3\x09\xd7\x82\x82\xa0\x73\xfe\x0b\x1a\x1a\x7a\x98\xda\x23\xdf\x68\xca\xf8\xc2\x69\x9b\x1c\x7d\x0f\x47\xbd\x7d\xe2\xc0\xbb\x23\x36\x99\x63\xe6\x8a\x69\x74\xc8\xe2\xb5\x95\xb8\x29\x3a\x9f\x4d\x98\xdf\x7e\x9a\xe3\xad\xd2\xa3\xf6\x4e\x83\x03\x97\x39\x64\x2d\x19\x22\x04\xe8\x5e\x6c\x48\xd5\xd6\x71\xf6\xc7\x5a\x0a\x89\x57\xed\xbb\x74\x18\x76\x20\xf2\xab\xa9\x9c\x1c\x62\x58\x4c\x59\xac\x00\x64\x7e\x3f\xb4\x02\x92\xb9\xdc\x1a\x33\x46\x86\x85\x53\x39\x2f\xd3\xf1\x1d\x6d\xc6\xf5\xf2\xf4\xe8\x5e\xe2\x51\x25\xcd\xd6\x44\x74\x3c\x7d\x45\x28\x1e\xda\xc6\x38\x4c\x77\xcb\x98\xa6\x7d\x9a\xe6\xfc\x9a\x0a\x76\xb9\xf6\xfa\x69\x6f\xdf\x4a\xce\xab\x5f\x79\x4e\xe5\x21\xb1\xe5\xa0\xee\x57\xaf\x53\xbd\xf1\x76\x80\x1b\x4f\x45\xcf\xb3\xca\xe3\x28\x72\x34\x23\x4b\x77\xce\x21\xed\xf8\x68\x0d\x68\xc4\xa8\xee\xcf\x1b\x03\x53\x7e\xa5\x69\x9a\xcb\x56\x27\x77\xe4\x2a\x48\x6f\xe7\xcd"}, +{{0xce,0xcc,0xc6,0x83,0x11,0xfc,0x45,0xb6,0xc2,0xa2,0xf1,0xff,0x9c,0xdd,0xe0,0x07,0xec,0x78,0x7f,0xdf,0x25,0xd0,0x2c,0xcd,0x2a,0x1c,0xad,0x9d,0xe3,0xfb,0x4c,0xff,},{0x6f,0x80,0x47,0x34,0xef,0x92,0x82,0x41,0x80,0xda,0x71,0xe5,0x5c,0xf3,0xbf,0x1a,0xfe,0xf6,0x5b,0xcf,0x56,0x09,0x62,0xe0,0xb0,0xac,0xbb,0x2d,0x8c,0xca,0x59,0x84,},{0x3c,0x44,0x62,0xaa,0x47,0x01,0x01,0x32,0xdb,0xb2,0x63,0x11,0xe4,0x44,0x72,0x72,0x79,0xed,0xad,0xe1,0x5a,0x4d,0x66,0x2c,0xf6,0x47,0xf3,0x27,0x5c,0xf3,0x25,0x3e,0x6d,0xe9,0x33,0x38,0x30,0xe0,0x51,0x7a,0xa5,0xfa,0x7b,0xc2,0xd0,0xe6,0x3e,0xa2,0x59,0x7a,0x94,0xb0,0xfe,0x92,0x70,0x6e,0xcd,0x17,0x2c,0x5e,0xc5,0xc7,0xf0,0x06,},"\xba\xc1\x86\xd9\xfe\x5a\xbd\xa7\x9c\x3a\x35\xa7\xa3\xc2\xea\xe6\xae\x6a\xb2\x82\x47\x91\x27\x70\xc8\x4e\xfd\x04\x8e\xbd\x3a\xba\x57\xc3\x7c\xf4\xc6\xc7\xf3\x0a\x79\xf6\x8a\x3f\x76\xb2\x0c\xd8\xc6\x63\x1f\xcc\x96\x67\x05\x22\x08\x0e\x6b\x62\xe8\x87\xae\x6f\x44\x36\xd4\xca\xf5\x69\x43\x13\x1c\x52\xdd\x28\x2b\x25\x1c\xd0\x75\xf1\xf7\xf8\xe0\xbd\xb6\xbe\xdf\xc9\xa0\x79\x6f\x55\x79\x04\x2b\x56\xe6\x93\x74\x96\x1b\x11\xdf\xd6\x1b\x12\xde\x2b\xb7\xd4\x9b\xfc\x50\x9c\xdb\x31\x38\xf3\x35\x6a\x0d\xde\xd9\x8f\x53\x01\xb7\xc4\xa7\x48\xbf\x89\xb2\x3d\xf4\xf7\x47\x2f\xf8\xb1\xf5\x05\xd7\x65\xc6\xff\x82\xdb\xad\x74\xb9\xd7\xae\xf2\x2f\xbc\xca\x0b\x7f\x35\x04\x2f\x9a\x76\x2b\xd0\x69\x02\xbb\x21\xc7\xf9\xf7\xf6\x6b\xef\x38\x90\x1d\x75\x01\x2d\x61\xd7\x44\xde\xe7\xaf\xd8\x9f\xc7\xe9\x08\xc4\x06\x85\xbd\x44\x0a\xed\xa4\x20\x4d\x00\x6f\x26\x30\x7d\x82\xa4\x96\x96\x31\x15\xf9\x0e\x09\xf7\x66\x88\x29\x1f\x4a\x67\xd6\x41\x1f\x76\xd1\x66\x17\x87\x5b\x2b\x99\x82\xdf\xdc\x5e\xe9\xb8\x3b\x98\x17\x00\x93\x19\x11\x0b\x54\x04\xc6\x31\x16\xfb\x6e\x94\x64\x84\x6f\xa0\x09\x55\x56\x32\xf0\x76\x98\x4c\x15\xe1\xf6\x08\x17\x33\xa0\xd4\x6f\x2d\x6a\x3c\xeb\xf7\x9e\xd9\x02\x0c\x9d\xec\x8d\xf1\x58\xa3\x34\x1f\x39\xea\xa5\xfc\xf1\xcf\x42\xa9\x48\x49\xb2\x35\x2c\x1a\x1e\xcd\x4f\xb8\x14\xc2\x0d\x07\xdf\xda\x31\x2b\xd4\xf2\xf5\x8c\x15\x76\xb4\xaa\x31\x5c\x96\xc8\x78\x6a\x4c\xfb\xb7\x36\xb2\xd2\x3c\x38\xb1\xd8\x1c\x46\x44\xea\x36\xaf\xa0\x76\xe0\x55\xbe\x59\x17\xcd\x7a\x92\x35\x0a\x7e\xd6\x6a\x5a\xb2\x25\x3f\x55\xc4\xfd\x1a\x0d\x0e\x6d\x4e\xda\xb5\xf7\x12\xed\xb4\x40\xc0\x6f\xac\x8f\x07\xe6\xd7\x3c\xc9\x0b\x2b\xa7\x13\xd7\x3c\x73\x80\x23\x61\xce\x46\xa4\xeb\x5e\xd1\x06\x0c\x4c\xf5\x32\x07\xd3\x01\xf0\xfc\xd4\xf0\xc9\xd1\x58\x0d\xb2\xfc\x10\x59\xd3\x72\x07\x64\x38\xa0\x11\x92\xa7\xf9\xfd\x6f\x78\x83\xf5\x64\x22\x86\x6f\xd9\xf0\xaf\xe5\x3f\xdc\x91\x0a\xfa\x5a\x75\x1c\xbf\xa3\x77\x59\x25\x79\x16\x5c\xb5\x6d\xc3\xeb\x4d\xce\x67\xe3\xdb\x33\xa9\x81\xa5\x6b\x7d\x9f\x7b\xde\xa7\x4f\xba\xea\x34\x78\xe6\xab\x2c\x64\x4f\xd7\x77\xb8\xbf\xa7\x2a\xa0\xf0\xa5\x21\x98\xd3\x6e\x5b\x63\x4d\x2c\x9a\x11\xb7\xfe\x0a\xb2\xf9\xa4\x09\x01\xc5\xb1\x48\xa0\x19\x2e\x95\xa1\x70\xba\xf7\xd5\x35\x0f\xe0\x1e\x56\x95\x42\xb9\x34\x85\xa4\x19\x71\x44\x34\x85\xfa\xf5\x7f\x67\xf5\x6d\xfe\x2c\x58\xe5\x39\xc9\xf9\xb4\x49\xc3\xf9\x12\x49\xa1\x0c\x1a\x1b\xe7\xe0\xb3\xea\xbe\x8e\xe0\xba\xb1\xf1\x1f\x89\x61\x4d\xce\xd4\x18\xc6\x2a\x07\xa0\xb5\x9a\x13\x70\xd6\x53\x1b\xa1\x77\x09\x1c\x6a\xd5\x95\xfb\x59\x48\x82\x04\xf6\x33\x44\x73\x6e\xa1\x01\x7a\xff\xbe\xb7\x53\xa9\x97\x86\xb1\xeb\x64\x51\x0e\x2e\x71\x7e\xc9\x0e\x02\x74\x4b\xc3\x52\xd3\xf1\xb2\xab\x7b\xe0\xeb\x65\x62\x3d\x04\xfb\x3a\x04\x6c\xe7\xf4\xda\x69\x7d\x82\x98\x28\xa5\x2c\x7b\x04\x3b\x2a\x82\xec\x97\xfb\x04\x1b\xf5\x19\xb4\xde\x31\x6f\x4e\x2f\x5b\x0d\xb6\x2a\xed\x0e\xed\x95\xca\xd4\x32\x0c\x19\x47\xc3\x5f\xd8\x84\x7a\x58\x67\x87\x28\x83\x56\x11\x19\xc0\x1b\x00\x89\x21\x3d\x84\xdb\x99\xd4\x39\xf0\xf6\x44\x4d\x87\x83\xdd\x4b\x64\xbe\x35\x77\xcd\x46\x1c\xf7\x53\xc8\xe6\x1c\x91\x2d\xe2\xe5\xd7\xa7\xe2\xba\xef\xa2\x58\x97\x5d\x16\xef\x31\x17\xda\x59\xa6\xc8\x93\xf3\x33\x91\x87\xdf\x31\x68\xb8\x9f\x0f\xb0\xb2\x19\x8b\xb6\xf1\x59\x4b\xb8\x8f\x3d\x61\x0f\xce\xc3\xe3\x6d\xe0\x4a\xe1\x03\x28\x11\x2e\x6f\xf7\x4f\x5a\x8c\xe6\x8d\x40\x71\x74\xb4\xc0\x69\x1c\x76\x02\xea\xb1\xbb\x10\xf3\xc4\x9d\xd2\x2b\x84\x50\x78\x2d\xea\xe9\xa7\x31\x5e\x3b\x88\xde\x79\xcd\x15\xe6\xc9\x26\x81\x65\xed\x3a\x0f\xb3\xf8\x9b\x18\x3e\x1a\x21\x21\x52\x00\x3f\x32\xa2\x66\x5d\x37\xcd\xd7\xf6\xb5\x6c\x24\x53\xe5\x58\x0c\x4d\x21\xf9\x98\x3f\x38\x79\x8e\x9b"}, +{{0x7b,0x30,0xb4,0x2d,0xc2,0xc6,0x70,0xa1,0x95,0xfe,0x2a,0xf8,0x79,0xfc,0x5d,0xe3,0x74,0x02,0x45,0x88,0xfe,0x3d,0xe4,0x3e,0x2d,0xd5,0x08,0x44,0xf4,0x8f,0x42,0xbe,},{0x82,0xa2,0xac,0x60,0x79,0xf2,0x12,0xb5,0xee,0xdd,0x0c,0x19,0xe9,0x39,0x4f,0xaf,0xac,0xd7,0x4d,0x71,0x6f,0xde,0xfb,0xfc,0x6c,0xb8,0xa7,0xea,0xf4,0x1c,0x03,0x62,},{0x0a,0x63,0xb8,0x4f,0x46,0x93,0x5f,0xaf,0x3e,0xa1,0x64,0xb0,0x0a,0xf2,0x27,0xb0,0x08,0x68,0xa0,0x3f,0x56,0x12,0x93,0x5e,0x18,0x61,0x9a,0x84,0xa2,0xe5,0x7b,0x88,0x51,0xd7,0x46,0xe6,0x3f,0xd9,0x10,0x07,0x87,0xf5,0x33,0x8d,0x51,0xc1,0x07,0x3c,0x2f,0xc5,0x30,0x30,0x99,0xe1,0x87,0x3e,0x5e,0x3d,0x3e,0x5c,0x03,0x6f,0xbe,0x01,},"\xc6\x68\x7a\xef\xeb\xc5\xc8\x16\xd1\xa3\x34\x53\xbe\xca\x50\x20\xd3\xa9\x7c\xda\x1d\xac\x56\x62\xf0\xaf\x72\xba\xd4\x44\xe2\xfd\x11\x76\xa7\xb0\x4c\x1b\xd0\x9d\x83\x26\x18\x20\x9b\xf3\xe3\x3e\x52\x35\x38\xd6\xda\xa7\x53\x04\x6e\x87\x1d\xd3\xb3\xc7\xac\xad\x33\xe7\x9c\x1b\xb7\x89\x64\x07\x86\x5d\x16\x8d\x4b\xc3\x75\x7b\xde\x4f\x82\x3c\x08\x77\x86\x26\xf8\xc7\x1f\xb7\xcf\xcf\xdf\x03\xa8\x24\x97\xbd\x8b\xe7\xd8\xf8\xef\x64\x90\x30\xb5\xf3\x6a\x33\x94\x59\x96\x8e\x24\x6a\x1e\x42\x08\x53\xda\xce\x41\xca\x85\x0a\x4e\xea\xe8\x34\xae\x11\x96\x10\xca\x4c\xd0\x66\x2a\xac\x39\x62\x15\x86\x99\x80\x27\xef\x2f\x61\x48\x5c\x02\x85\x06\x71\x4a\xe0\x9c\x76\x39\x9d\x87\x3e\x80\x81\x58\x57\x8a\xa5\x9e\x82\x12\xf5\x88\x65\x31\x9f\x9e\x0d\x2b\x8d\xa7\xad\x52\x9e\x0a\xc1\xf1\xeb\x43\x5a\xec\xfd\x35\xf5\xab\xb9\x2b\xea\x50\x73\x49\x6b\xf4\xc0\xbf\x15\xba\xa2\x73\xbf\xc5\xc3\x10\x44\x74\xa2\xdc\xf1\x32\xc3\x33\xeb\x36\xec\x2c\xbf\x04\xfa\x95\x80\xb7\x68\xf5\xce\xa7\xb5\x61\x7e\x58\x80\xaf\xf6\x32\x01\xc2\x74\xd6\x69\x74\x3e\x1b\xc5\x56\xb0\x67\x90\x2e\xee\x29\xd2\x91\x11\x28\x89\x69\xcf\xfa\x87\x9f\xc9\xcb\xf6\x6f\xbf\x93\x26\xd9\xd9\x25\xac\x41\x02\xfa\x9f\x1a\x06\x08\x1a\xde\xc0\x79\xcb\xc9\x67\x46\xd7\x9b\x63\xa0\x12\xed\x77\xd8\x2c\x9f\xfd\x4e\x3f\x16\x1f\x6c\xea\x28\xcc\x23\xfa\xc2\xa5\x43\xf5\xb1\xd0\x64\x4e\xc0\x48\x38\x32\x7b\xcc\x65\x2b\x85\x8f\x93\xff\x46\x3f\x7e\x94\x9e\xec\x8c\x9d\xb6\x56\x9a\x86\x98\x4f\x83\x1d\xf6\xac\x6d\x95\xf3\x8f\x46\xce\xbb\x6e\x65\x83\x65\x7f\xac\xd2\x10\x8d\xbc\xd0\xaf\x23\xab\x01\x01\xa1\x30\x1b\xeb\x48\xa4\x4c\xac\xcb\x91\x09\x44\x73\xd7\xe5\xa5\xc8\x8c\x64\x4f\xd3\x42\x05\x73\xb6\x78\xf1\x7b\x51\x74\xcb\x14\xe9\x0f\xac\x69\x4d\x1d\xbc\x6c\x96\x32\xb5\x97\x4a\xef\x28\xac\x08\xd7\x20\xb2\xea\x30\x44\x0d\x2a\xfb\x04\x93\xb4\x0d\xb2\x4e\xfb\xdb\xf5\x3c\x43\x09\x21\xe5\x2a\x10\xb5\x46\x61\xe1\x49\xd1\x65\x59\x1a\x7c\xf9\x1d\x65\x08\xea\x47\x2f\xb3\xbe\x16\x39\x5e\x30\x31\x2f\x19\xb8\x7c\x47\xe4\x68\x04\xa0\xfa\x29\xb5\x6b\x5a\xc9\x50\x67\x7b\xc6\x02\x38\xb5\xe9\x9e\x03\x0b\x1e\x55\x21\x46\xa0\xe8\x8c\x29\x4c\xfc\xa8\x35\xc1\x01\xc5\x5f\x34\x23\x87\x4c\xc1\x28\x75\x6e\x73\xa5\xde\xbe\x8e\x97\xfe\x21\x66\xb6\x5c\xb4\x46\x42\x77\x0c\x6d\x1d\x23\x90\xaf\x1b\x0f\x31\xb9\x58\xc8\x30\xe9\xac\x4f\xe2\xf5\xad\x59\x05\x82\xfb\xb8\x92\xbf\x94\x95\x84\x47\x7e\xf7\xbd\xe2\x3f\x7d\xd0\x2b\x63\xf7\xc2\x90\x88\xa5\x72\x51\x00\x91\x32\xff\xbb\x78\xed\x14\xde\xfb\xef\xd9\xfd\x31\xfd\xca\xb0\x3b\xa8\x0a\x23\xf3\x33\x98\x37\x60\xab\xad\x4f\x16\xdd\xf9\xdd\x44\x14\xf0\x4d\x00\xdb\x56\xba\x72\xd6\x3a\x3a\x13\xd2\xc4\x42\xf5\x49\xfd\x66\xc9\x88\xd2\xe4\x60\x1d\x13\xb5\x2f\x77\x50\x0d\xd6\x92\xbe\xc9\xd6\xbd\x3b\xaf\xa9\x24\x2f\xdc\xfa\xeb\x69\xb9\x8b\x0b\x57\x89\xb2\x80\x38\x40\xde\xc6\x37\xb4\x9a\xf4\x38\x1a\xe3\xfa\x42\x9f\xb5\x34\x61\xa0\xc6\x74\xeb\x5a\xa1\x8d\xbd\x60\x7a\x2b\x77\xa9\x6d\x3a\xb4\x64\xec\xd9\x74\x92\xf6\xde\x46\x0c\x9f\x11\xb5\xc1\x75\x6c\xb5\x9c\xb1\x34\x8d\xfd\x77\x95\x6b\x71\x90\x7c\x54\x82\x1e\x30\x3c\xb8\xb1\x49\x06\xc0\x03\xe3\x48\x4b\xe4\xea\x05\xa6\x90\x1d\x69\xb0\x74\x85\xe8\x58\xf7\xb4\x71\xc6\x35\xf9\x03\x95\xb9\xa3\xe2\x24\x7f\x1a\xd1\x2b\x11\x8f\xfa\xfc\x72\x21\xa5\x7b\x10\xe3\x19\xb6\x1a\xf1\xc1\x36\x06\xa8\x16\x16\xce\x3f\x1d\x62\xba\x93\x2f\xf4\xe6\x3e\x74\xb8\x42\x55\xe3\xaf\x52\x10\xbb\xd5\x71\xbd\xa4\x4c\xbf\x44\xb7\x14\x42\x2c\xb4\x5c\x2e\xf2\x1f\x98\x13\x1b\xa9\x6b\x7e\xdb\x9b\x03\xe3\x3d\x7d\x18\x8d\x5b\x8d\x90\x4c\xb4\x13\x6f\xe2\x69\xdb\x14\x69\x88\x16\x8e\x7e\xe2\x45\x35\x63\x54\xf0\x02\xa5\xea\x8b\x35\xa3\xa9\x9e\x83\xa1\x32\x72\x27\x41\x44\xb3\x3a\x60\xca"}, +{{0x66,0x56,0xf4,0xd4,0x71,0x81,0x57,0xc4,0xba,0xc3,0x8f,0xf7,0xab,0xe5,0xeb,0x1f,0x81,0x2c,0x0b,0x98,0x6d,0x9c,0x01,0x4a,0xba,0xd5,0xb0,0x9a,0xa6,0xc8,0xee,0x4a,},{0xf3,0x08,0x78,0x98,0xe4,0x52,0xbe,0x9e,0x30,0xae,0xcc,0x4e,0x8f,0xfe,0x0c,0x01,0x16,0x98,0x88,0x68,0x3f,0x62,0xa4,0x5b,0x8d,0xa3,0x82,0x99,0x01,0x4f,0x5b,0x4a,},{0x9c,0x2c,0x39,0x91,0x5a,0xed,0x6a,0xdd,0x00,0x4e,0x7d,0xd6,0x84,0xee,0x3d,0xcd,0xd1,0x0d,0x87,0xa4,0x87,0xf6,0x77,0xe7,0x3c,0x2b,0xce,0x0f,0xca,0x7d,0x50,0x87,0x96,0x46,0x41,0x50,0xa5,0x2a,0x44,0x0f,0x52,0x37,0x85,0x0a,0x00,0x9c,0x72,0x16,0x2d,0x9d,0x29,0x85,0x47,0x0a,0x33,0x49,0x0e,0x66,0xd3,0xc4,0x01,0x70,0x4c,0x05,},"\x94\xd9\xe5\xe5\xa7\xb7\x05\xd9\xd9\x76\xfe\x71\xe9\x4d\x3f\x7f\xa7\x86\x6a\xfb\xf7\xec\xe4\x24\xf1\x36\x32\x77\x99\xb2\xb2\x06\xce\x4e\xf4\xc3\xf3\xe7\x05\x55\x3a\xfc\x8f\xd5\xc1\x95\x2a\x4c\x16\x65\x8d\x4a\x78\xaf\xbb\x9a\x97\xf2\x71\x93\xc6\x5b\x65\xb8\x2e\x8f\x3b\x71\x51\x5f\xac\x82\x64\x0e\x0f\x8a\x5f\xb3\x5a\xe6\xfc\x6a\x3d\xb0\x51\xa2\x2d\x4a\x53\x00\x41\x3e\x6e\x33\xd1\x9c\x20\x13\xc2\x98\x3a\xca\x8a\xd6\xce\xc2\xce\x64\xa8\x14\x16\x4f\x06\x1a\x1a\x3c\x5a\x86\x10\xa7\x65\x0b\xfb\x54\x23\xd4\x36\x2c\xe0\x22\x06\xdb\xe4\xa6\xfa\x82\x6f\x03\xb4\x2a\xc3\xcd\x9e\xa4\xc6\x51\x40\x1b\x3c\xea\x82\xc3\x99\x3f\x6a\xf8\xb2\xc9\xe2\xe6\xff\xe6\x92\x80\xab\x3f\x09\xfb\xe9\x0d\xd5\x47\xcc\xda\x9d\x9e\x8e\x8a\x53\x7b\x3b\x36\x05\x54\x22\x7e\xd0\x70\x9f\x29\x31\x98\x98\x2e\xfb\x5e\xfb\x0e\x73\xe0\x00\x42\xd1\xa0\x63\xb5\x74\x52\x02\x7d\xce\x1a\x39\xe4\xb0\x06\x8f\x58\xb1\x11\xec\x5d\xc1\x42\xbf\x41\x9a\xd8\x93\xd5\x4f\x42\x60\xcb\xde\x76\x28\xf7\x83\xde\x84\x96\x38\x03\x06\xa4\xef\xf6\xd8\x28\x69\x10\x42\x59\xc9\x4c\x54\xad\x5a\xa8\xb0\x67\xc4\x24\x96\xcb\x88\xdd\x31\x15\x0e\xa0\x4d\x49\x9b\xfa\xc9\x1f\x4b\xb3\xe6\x8a\xf5\xaf\x7a\x56\x8a\x3e\x4c\xe7\xf1\x70\xd9\x86\x01\x16\x3f\x49\x52\xf1\xd2\x5e\x12\xe0\x0e\xf0\xa2\xd8\xf1\x11\xaf\xdb\x0f\xaf\xba\xd2\xbf\x8e\x8b\x9d\x49\x36\x3f\xca\x68\x18\x36\x17\xb5\x41\x27\x0d\xda\x46\x09\xb2\x61\x67\x29\xab\x1b\x8c\x42\xdb\xdd\x7b\xf9\x86\xaf\x8f\xba\x52\xe7\x33\xe4\x2b\xa0\x3c\x89\x2e\x1e\x1e\xc0\x6a\x90\xb1\x63\xf5\xa7\x9f\x61\x65\xeb\x73\x16\x97\x2a\xc1\xad\xbf\xcf\x1d\xca\xb0\x78\x47\xef\x82\xc2\xca\xb1\x01\x5d\xbb\x50\xaa\xdc\x79\xfe\x11\xc8\x32\x09\x8c\xac\xc3\x98\x20\xab\x08\x5b\x69\x63\xbd\x42\x16\x0e\xd6\x61\x3b\xae\x5e\x20\x1f\x17\xc0\xfd\x7f\x32\x35\x7a\xe3\x50\xce\x9c\xbb\xe9\x26\xfa\x42\xdc\xbd\x42\x2a\xc1\xbf\x09\xa1\x9a\xd1\xf6\x94\x69\xe4\xd1\xdc\xb1\x24\x11\x8e\xd4\x52\x2d\x35\x3c\x17\x42\x98\x65\x0f\xf8\x83\x82\xfa\x2f\xdb\xb2\x86\xc4\x5b\x18\xa9\xba\xf6\xf6\x76\x3a\xc2\x0c\x9c\xa4\x76\x7d\x34\x8c\x4b\x8d\xed\x63\x00\x76\x65\x7b\x85\xb1\x4c\x11\xae\x27\x37\xea\x29\xa4\x35\x15\xb7\xf0\x56\x74\xa0\xcd\x3e\xd4\xbf\x6a\x3d\x18\x9a\xe9\x72\x21\x8f\x87\x7c\xd8\xaa\x69\x49\x9d\x5a\x08\xc9\x9e\x44\x06\x94\xcc\xac\xcd\xf1\xf6\x42\xe1\x4e\x90\x10\x5b\xee\x6d\x98\xed\xee\xab\x3b\x4f\x33\x9f\x30\x01\x88\xae\xc0\xc1\x6b\xd6\x45\x21\xd9\x28\x73\x98\xe6\x48\xdb\x94\x33\x0e\xd8\xf6\xb9\xab\x6c\x7a\xd9\x3f\xfc\x43\xe8\x79\x2e\x63\x7c\x61\xbf\xf7\xd8\x56\xe5\x4e\xf4\x98\x73\x84\xe3\x12\xcb\x57\x01\x7a\x50\xea\xe5\x95\x2a\xbe\x19\xd8\x99\x9c\x8c\x82\xdf\xc4\x57\x98\xcc\x17\xc8\xd9\x49\x6b\xf5\x20\xec\xc5\xb7\x7f\xe2\x84\x91\x55\x66\xc4\x56\x85\xc3\x04\xa2\xac\xd5\x25\xef\x12\xc8\x6f\x38\xae\xf5\x54\xd8\xa2\x38\x47\x37\xcc\x41\x33\xfb\x7e\x2b\x65\xc1\x3b\xef\x31\x66\x8a\x6c\x2f\x60\xee\xcd\x84\x12\xee\xff\x7f\x6b\x60\x5c\xbe\x95\x08\x3e\x23\x3e\xc1\xa7\xbb\x36\xde\x23\x6c\x8a\x71\xba\x28\x72\xbe\x94\x6c\xd3\xb3\x89\x35\xf5\xda\x64\xc8\xfe\xc8\xe1\x4f\x45\xcc\xf6\x12\x4b\xab\x7f\x70\x56\x7c\x2f\x2b\xfd\xd5\x66\x67\x60\x95\x72\x03\x7c\x76\x14\x6c\x99\x17\x07\x65\x9b\x57\x09\xb0\x74\xe3\x45\x1f\x92\x1a\x2d\xf2\x83\xb9\x6a\xa2\x6a\xb4\x76\x62\x50\x16\xf1\x81\xad\x64\xc9\x91\x9c\xf4\x1d\x71\x4a\x1a\x9a\x5e\x2b\xb2\x6b\xaf\x87\x70\xb2\xeb\xa7\x7b\x77\x8a\x33\x26\x77\xa7\x57\x2e\xe3\xa2\xb1\xdc\x05\xf7\x35\x6b\xdc\xae\x5f\x55\xe3\x53\x29\xe3\x4c\xaa\x79\x43\x0b\x27\x0c\x03\x61\x60\xdc\x9f\xca\xab\x5b\x25\x45\x43\xac\x94\xb2\x46\x81\xf1\x71\x72\xb6\x15\x9d\x16\x62\x1d\x7a\xd0\xee\xbd\x89\x5a\x1e\x1d\x09\xb9\x16\xa8\x6f\xb4\x8e\x4c\x91\x66\x10\x57\xee\xe9\x5c\x08\x70\xed\x54"}, +{{0x14,0x38,0x3e,0x6e,0x56,0x04,0xc9,0x9c,0x24,0x8d,0x39,0xbe,0x51,0xd1,0x64,0xb1,0x34,0x42,0xb0,0x5e,0x51,0xd7,0x8e,0xcd,0x99,0x93,0x64,0x22,0x1a,0x45,0x03,0x6b,},{0x2f,0xc1,0x61,0x38,0x22,0x0a,0xb7,0x4b,0x3b,0xd4,0x46,0xf8,0xa7,0x14,0xb5,0x8d,0x54,0x63,0xd4,0x0d,0x43,0x67,0x92,0x50,0x07,0x47,0x4c,0x5b,0x9e,0x35,0xd4,0x94,},{0x45,0xe8,0xed,0x1a,0x75,0x1d,0xfc,0x3b,0x9b,0x7b,0xd7,0xa1,0x0b,0xf5,0xbd,0xcf,0x8c,0xa4,0x61,0x86,0x5a,0x49,0x0c,0x10,0x5f,0x10,0x45,0x29,0x41,0xcf,0x87,0x72,0x12,0x14,0xbf,0xbf,0x3a,0x35,0x60,0x6b,0x7c,0xe3,0x5d,0x6f,0x70,0xaa,0xf2,0xd5,0xea,0xdc,0xc0,0xde,0x03,0x5e,0x9b,0x2f,0x6d,0x7b,0x86,0x2f,0xc2,0x84,0x90,0x04,},"\xc4\x75\x3b\x7f\x7a\x6f\x6d\xea\x25\x15\xc6\xe3\xd2\x95\x61\x50\x6f\x4f\x36\xe0\xde\x84\x99\x92\x21\xf2\x28\xe2\x0b\xd5\x12\x8e\xd9\x3b\xdb\x8d\x11\x93\x23\x7d\x8e\x29\x41\x69\xa2\xbc\x44\x8a\xf9\xdd\x36\x06\x63\x01\xef\xb7\xfe\x12\x31\x35\x3c\x06\x23\xff\xe1\x11\x5d\xeb\xb6\x90\x5a\xc6\x94\x6e\xe3\x82\xa2\x7c\x3c\x09\xe1\xb1\xf5\xc1\x14\x93\xdb\xa3\x7d\xa0\xff\x6e\xea\x75\xd9\xfa\xb0\xee\x92\x6d\x70\x1d\xac\x2f\xc5\xb7\xef\x57\x88\x80\xa5\xd5\xee\xec\xad\xc1\xf4\xbc\xc4\xcd\x4e\xc6\xf2\xf1\x4f\x52\xa8\xc1\x64\x07\x2e\x6f\xde\x5a\xb2\xee\x9c\xee\x0b\x48\xe5\x1a\xf0\x55\xf9\xfe\xc7\xc6\x37\x50\xfe\xdf\x72\x33\x2b\x23\x86\x3a\x1e\x54\xc5\x2b\x46\x1a\x21\x50\x6d\xfd\xfc\x63\x88\x0e\x22\xd8\x9c\x89\x44\x12\x66\x6c\x92\x98\x21\xc0\xe4\x39\xe7\x45\x41\x5f\x71\x79\x69\xe6\x05\x85\x54\xd6\x4b\x94\x7a\x4f\xc9\xd1\x6a\xca\xe3\xe4\x9a\xec\x08\x80\x1a\x09\xd9\x72\xf7\x9e\xad\x68\xd5\x29\x76\x80\x69\x73\x5c\xaa\x74\x2b\x45\xa5\x83\x05\x81\xb8\x0c\xa0\x61\xa6\xc1\x51\x5e\x3f\x7d\x5a\x93\x37\x87\x8c\x19\xfc\x94\xee\xf2\x26\x98\xea\x6c\x4d\x05\xf9\xed\x41\x1b\x6b\x8f\x05\x2b\x5f\xf1\x5d\xc2\x3a\x64\xbe\xea\xae\x99\xf8\x48\x93\xde\x3d\xf9\x40\xa4\xe0\xb8\xe9\x93\x93\x01\x39\x05\x2d\x99\xbe\x47\xbc\xa8\x77\x5f\x85\x63\xbd\x40\x26\xb7\x13\x43\xd5\x19\x68\xf2\x33\x75\x28\xf4\xc9\xdb\x8b\xbd\x0a\x29\x8a\xf0\x4b\x27\x69\x5d\x86\xb7\xf7\xba\x6c\x4c\xcc\x62\x73\xfe\xbc\xd8\xf7\x5c\xff\x26\x69\x95\x24\x4f\xc1\xfa\x13\xd8\xd8\x43\xf0\xbf\xf4\x9c\xc2\xd5\x08\xf4\xa2\xb3\xaa\xd1\xd9\x5f\xb2\x2a\x2b\xc6\xad\x1b\x96\x6b\x08\x12\xd9\x90\x70\xbb\xa0\x7c\x92\x3e\xe4\xd0\x81\x07\x48\x6d\xc0\x1a\x06\xdb\xa6\xf1\xd5\xf1\x05\xac\xea\xde\x33\xb1\x66\x51\x0e\x42\x7e\xbb\xce\x52\xa3\xe7\x83\x1f\x0f\x78\xa3\xc6\xe0\x72\x60\x83\x34\xd8\x02\x1c\x33\x8a\x73\xcc\x0c\x47\xf1\x9c\x9f\xae\x40\x3b\x97\x16\xd0\xd1\x5f\xbd\xf6\x46\x6b\x08\xf6\xac\xce\x3f\x50\xa7\x03\xb1\xde\xa8\xd8\x26\xdf\x84\x2c\xa1\xba\x20\xd2\x9f\x45\x48\xac\xfc\x75\x4c\xf0\x11\xf5\x70\x68\x1b\x59\xe4\xda\x25\x38\x5e\xbd\x6d\x5c\x3a\xdc\x93\x05\x29\xe1\x66\xce\x67\x05\xf6\x01\x02\x10\xdb\x10\x64\x62\xb3\x33\x32\x04\xe7\xad\xad\xee\x66\x06\xa5\x62\x06\xb4\x7e\xef\x20\x74\xb1\x16\xe2\x2a\x61\x54\x18\xec\x2c\xdc\x33\x1f\x1e\x19\xe0\x7e\x8a\x37\xb9\x2d\x69\xdf\x07\x34\xe0\x85\xda\xee\xb9\x01\xec\x6e\x8c\x35\xf1\x03\xf1\xd8\x6e\xf0\xd2\xa2\x65\x2b\x01\xd1\x83\x59\x7e\x4c\xfd\xee\xdf\xe5\xdf\x9a\x7e\xf6\x6a\x1c\x79\x6a\x37\xa2\x71\x13\xb9\x44\xdd\x7b\xa1\x7c\x46\x00\x15\xab\x8a\xce\x45\x1c\x57\x85\x0e\xc6\xc2\x90\xc5\x4e\x51\x13\xf5\x5e\x99\xa8\xe6\xe4\x71\x1e\x3b\x78\x17\xbf\x91\xa5\xad\xb3\x7f\xb9\x46\x1b\xe6\xb1\xb5\x5d\x58\x60\x46\xe4\x2a\x54\xc5\xde\xf4\x07\x6f\x1f\xf6\xc3\x1b\x80\x6f\xc6\x02\x47\x43\x56\xaa\x28\x99\xea\xe7\x0f\x5e\x5a\xbf\x1f\x75\xa7\xf2\x4c\x13\x4c\xde\x11\x79\x3b\xb1\x62\xe0\x3a\x58\x3d\x5b\xe0\x46\xac\xc7\x34\x56\xd1\x2d\x50\x9d\x92\xf7\x70\x57\x68\x68\x6f\x6c\x71\x4a\x4e\x57\xec\x88\xb7\x13\x98\xe2\x3e\x83\x5d\x6d\x65\x47\x22\x59\x96\xb7\xed\x08\xf3\xb7\x44\x3b\xb1\x7c\x89\x94\x09\x49\x3d\x0e\xfe\x84\x55\xbe\xc8\xe8\xc2\x84\xa3\xb1\x49\xa5\xb4\xca\x63\x1e\xa6\x20\xb1\xbb\x81\x7c\xed\xab\xa5\x0b\x04\x44\x11\x84\x9d\x26\x0a\x6f\x2a\x0d\x3f\x2c\xce\xec\x38\x42\x71\x9a\x5e\xa4\xfe\x18\xdd\xe0\xd4\x2d\xcb\x33\xad\x21\xe6\x45\x33\x25\xaf\x6f\x3c\x00\x9f\x2b\xb9\x78\xd3\x0c\xee\xae\x9a\xa4\x92\x8b\xf7\x37\x67\xcd\xa9\x29\x2a\xb8\x93\xce\x5f\xa3\xaa\x4c\x23\x21\x63\xb4\x5c\x64\xed\x79\x77\x77\x9b\x1c\x0c\xaf\xcf\xc2\xb9\xfa\x08\x4a\x32\x4f\x11\x3a\xde\xec\x21\x8b\x47\x35\xb6\xb4\x64\xdb\x6d\x46\xc2\x79\x1a\xf3\x45\x5f\x1c\xa5\xea\x1e\x9a\x04\x8c\x05\x1a\x54\xdf\xa0"}, +{{0x59,0xb0,0x72,0x63,0xb2,0x2c,0x0a,0x38,0xbb,0xc5,0x91,0x05,0x95,0x94,0xb2,0xbd,0x92,0x7e,0x80,0x59,0x61,0xdd,0x07,0xe1,0xf9,0x42,0x45,0xb2,0x3a,0xa2,0xe0,0x16,},{0x0b,0x1e,0x4c,0xf5,0xaf,0xf2,0x78,0xec,0x65,0xb4,0x05,0xf5,0x10,0x8e,0x1b,0x5b,0x18,0xa9,0x69,0xad,0x1f,0x1e,0x63,0x81,0x91,0x2c,0x82,0xd6,0x98,0x90,0x7c,0xba,},{0x88,0x6d,0xa3,0x3e,0x35,0x53,0x28,0x5e,0xa5,0x9c,0x14,0x31,0xb6,0xe8,0x6e,0xa4,0x9b,0xb6,0x8b,0x2e,0x0e,0xfd,0x2b,0x15,0x7e,0x77,0x91,0xb7,0x4f,0x35,0xa2,0x42,0x1b,0xb3,0x59,0xf3,0xdc,0x1e,0x4c,0xe5,0xf1,0x1f,0x73,0x65,0x2e,0x03,0xbf,0xc0,0xb4,0x29,0xc5,0x8f,0x0f,0x2d,0x74,0x18,0xc7,0xc2,0x0b,0xce,0x2e,0x2d,0x19,0x01,},"\x08\xce\x0d\x4d\xb5\xc2\xaa\x50\x0a\x19\xef\xbc\x8d\xc8\x54\x92\x50\xf7\xdd\x46\xa7\xa9\xa5\x40\x74\x17\xb3\xd5\x18\x20\xe4\xb0\xd6\x12\x75\x58\x3f\x56\xf8\x97\xfd\x94\x2b\xdd\x73\x11\xad\x6b\xaf\x73\x81\x28\x56\x7a\xf6\x55\x8d\x75\x90\x6a\x02\xc4\x34\x3a\x99\x55\xd5\x9b\x11\x08\x8c\x58\x8d\xc7\xdd\x08\xf6\x79\x65\xc5\x60\x2a\x56\x92\x8d\xda\x4a\xe1\x64\x29\x31\x63\xb5\x17\xca\x17\xde\xd0\x4f\xe4\xab\x2f\x97\x89\x13\x0a\xe9\x6a\xb2\x31\xf0\x7e\x09\x01\x5b\x78\xf3\x84\x8c\xef\x43\x5d\xb0\xad\x9f\x35\xe0\xfb\xc9\x85\x1e\x3e\xcf\xc9\xfb\x18\x6d\x14\xd8\xda\x4d\xda\x45\xd0\xb3\xeb\x3e\xe4\x50\x0c\x10\x1e\x31\x94\xb5\x72\x14\x06\x89\xcd\x75\xda\x12\x87\xb2\x54\xf3\x74\xe3\xd9\x33\x26\xae\x5f\xaf\x11\x40\x18\xac\x71\x4b\xd0\x03\x75\xd9\x2a\x8b\xb6\x59\xc3\x29\x12\x83\x1f\x4f\x20\x77\x6e\x9e\x2c\x25\x02\x9f\x0a\xff\x39\xfd\xda\xc7\x24\x15\x43\xa0\x36\x6b\x84\xde\x7b\x1f\xf2\x3e\x8e\x4d\xc0\x93\xdf\x0d\x2d\xd5\xe5\x3e\x68\x47\x94\x8c\xf3\xd0\xff\x3f\x56\x4a\xd9\x4d\x9c\xc0\x0a\x5e\xa5\xb6\x95\xe4\x08\xbf\x50\xf5\xba\xb2\xf6\xea\x87\xba\x8a\xd3\xa1\x94\x01\x95\xcf\x1b\xc2\xb5\xb3\x48\x47\xad\x3a\x5e\xff\xb8\xa7\x82\x3d\xe9\x1e\xf1\x63\x38\x69\xd1\xf0\x46\x43\xaf\x4d\x82\x6a\x59\xe7\x8b\x9d\x18\x63\x12\xb3\xd9\x72\x26\x36\x54\xac\x55\x87\xb8\x0b\x71\x76\x46\xf3\x10\x03\xdb\x81\xac\x70\x86\x0d\x3f\xc8\xcd\x3a\x6a\x0a\x0d\x57\x6d\x25\x73\x1e\xf7\xb8\x96\x62\x63\xd7\xa0\x5b\x55\x00\x9e\x8a\x23\xda\xc0\xf9\xa2\x1a\x24\xb0\x6e\x13\x90\x0e\x44\x44\x46\xfd\xfe\x56\xcb\xc1\xa0\x26\xdf\x41\x06\x6b\x20\x1b\x14\x81\xe5\x61\x58\x92\x6c\x0c\x9e\xa9\x0f\x0c\x64\x5a\xab\x4b\xef\x12\xd4\xe0\x72\xcb\xfd\xc3\xc3\xd5\xe0\xc7\x2c\xf8\x8f\x16\x6d\xe0\x48\x87\x4f\x35\x34\xe0\x40\xc6\x2b\x16\x62\x82\x1b\xdd\x16\xb0\xe8\x58\x28\x17\x46\x1c\xb2\x68\x92\x79\xb4\x46\xd7\x0c\x8a\xc2\x0a\xd0\x3e\x59\x8c\xad\x49\x08\xc5\x2c\x35\x0d\x42\x43\xee\x8a\xed\xb8\x7a\x4a\xf9\x77\xf7\xdb\x57\xcd\x94\x7b\x47\xd6\xbb\x51\x40\x9d\x80\xd8\x1f\x6d\xb0\x3c\xb9\xa6\xa6\xb7\x98\x12\xf4\x70\x69\x0a\xfc\x18\x36\xa5\x31\x33\x80\x94\xcf\x26\xd3\xc1\x23\x2f\xd5\x60\x5d\x8f\x8c\x55\xb6\xf8\xa2\xa7\xef\x1e\x0c\x78\x15\x55\x94\xb2\x37\x95\x6d\x2a\xba\xd6\xa9\xad\xcd\x58\xe1\x1c\xcd\x35\xcc\x99\x5b\x9a\x0a\xec\xbf\x7f\x57\x41\xac\x05\x1b\x04\xef\x6b\x97\x44\xb5\x6f\xcc\xb4\x63\x98\x52\x8b\xb3\x1f\xbe\x84\xe0\x78\x84\x3e\x69\xbf\x33\x88\x98\xcd\xef\x69\xad\x41\x87\x23\x95\xe4\x6b\x59\x39\x04\x82\x55\x47\xe0\x0b\xda\xf2\x21\xf8\xfa\x58\x7e\xa2\x03\x7f\xfb\x9a\xc9\x30\x7d\xd3\xf8\xf3\x5e\xc5\x38\x6b\xa9\x66\x33\x3e\x2a\xc8\x72\x7b\x0e\x1b\x80\x61\x2d\x3c\x7f\x2c\xb8\x8b\xaa\xca\xdf\xe2\x16\x3b\xc3\x8c\x88\x84\x2e\x76\xa3\x94\x57\x1d\x40\x61\x0e\x8a\x29\x76\x02\x79\x37\x63\x29\x6e\x3e\xab\xf7\x20\xe9\x84\xb2\xed\xd2\x8c\xf5\xc4\xe0\xf9\xa0\xf7\x6a\xce\xba\x28\xcc\x1f\x1b\x69\xff\x1d\x35\xb4\xbd\x33\x47\xb7\xf9\xa9\x5a\x4c\x1e\xa1\x07\x34\xe1\xc9\x18\xeb\x96\x24\x9d\x0c\xc7\x0b\x47\x7f\x6f\x23\x80\x9b\xbd\xa9\x01\xd5\x3f\x48\x5a\x71\xf5\x08\x60\x02\xc1\xb7\x1e\xfc\xc4\x1c\xb1\xae\xb5\x12\x2a\x3f\x3b\xfc\x96\xc5\x1a\x55\xd7\x5c\x02\x98\x42\x88\xbe\x65\x78\x87\x85\x4c\xfa\x73\x89\x74\xbc\xd5\x44\x01\x46\xf9\xbb\x14\x04\x0d\xe5\x4f\x54\x44\xad\x43\xb7\x9a\xf9\xbd\xb2\x4e\xd6\xa4\x8e\xb2\xfd\xee\xd7\x1f\x31\xf0\xec\xe1\x02\xe9\x18\xe9\x56\x35\xc7\xa0\x38\x63\x3e\xe3\x48\xd8\xb5\x78\x16\x52\xd5\x05\x9d\x21\x5a\xc9\x7f\x30\xea\x20\xd2\x77\xeb\xbf\x15\x24\x69\x05\x42\x8a\x7b\xec\x02\xb8\xf9\x26\x31\x5b\xad\x67\x23\xfd\x64\xd7\x1f\xc9\x5f\x33\x33\x64\xcb\xe9\x0d\x46\x46\x33\x3c\x40\xdd\xa6\xd1\xd4\x33\xb7\xc1\x95\xa7\x58\xdb\xb4\x03\x8a\xf5\xdc\xc7\x23\x2d\x45\x47\xf5\x40\xe3\x94"}, +{{0x5c,0xc1,0x15,0xd8,0x39,0xe0,0x58,0xcd,0xb6,0x51,0x8e,0xe9,0xc1,0x61,0xc0,0x04,0xd8,0x8b,0xd3,0x90,0x8d,0x3c,0xf6,0xd5,0x2c,0x8f,0x29,0x6a,0x1a,0x07,0x6b,0x9b,},{0x1e,0x8f,0x33,0x05,0xbf,0x2f,0xa1,0x1b,0x17,0xd9,0x24,0x16,0xab,0x0e,0xa7,0x62,0x39,0x6d,0x88,0xf2,0xf9,0x70,0xef,0x0b,0x10,0x0e,0xd3,0xbf,0x5c,0xc1,0x34,0x40,},{0x03,0x71,0xc2,0xd6,0x4c,0x5e,0xc0,0xc8,0x27,0x6c,0xa5,0xff,0xa6,0x15,0xef,0xf4,0x2f,0x9e,0xff,0xfc,0x58,0xdd,0x8e,0xcf,0xcf,0x67,0x62,0x0a,0x9b,0xcb,0x38,0xfa,0xf1,0x18,0x93,0x2b,0xf2,0xcd,0x5b,0x92,0x05,0xfa,0x55,0x13,0x34,0xdf,0x2a,0x75,0x7c,0x59,0x77,0x44,0xf7,0x91,0xf3,0x71,0xfb,0xed,0xd9,0x8b,0x21,0xf7,0x34,0x05,},"\x53\x3e\x49\xc1\xd5\xf3\x3c\x5e\xc4\xbe\x84\xc6\x19\xf4\xec\x64\x9c\x25\xfd\x70\xbd\xcf\xe2\x57\xa6\x3c\x33\x73\xa4\xd0\x89\xc8\x9a\xf6\xee\xb7\x16\x0d\xd7\x7a\xb6\x6b\x1e\xe7\xe1\x08\x50\xab\x4f\xc1\xf3\x51\x32\x33\x2b\x53\x78\x9b\x2b\x01\x40\xc4\xf2\x0f\x97\xf2\x14\x20\x72\xd6\x24\xaf\xf7\xaa\xd3\x24\xaa\xcd\x06\x8c\x03\x5a\xff\x52\xfa\x71\x2f\x4e\x74\x83\x2d\xe0\x31\xb2\x64\x23\x14\xd1\x71\x10\xde\xe6\xfb\x85\x76\x2d\xc3\x0d\x7e\x97\x78\x2f\xd1\xfb\xff\x71\x79\xf0\x09\x17\xf5\x5a\xf7\x50\x3a\x5b\x7e\x23\xc6\xea\xdb\x65\xe1\x04\xf1\x51\x7b\x66\x24\xc9\xe5\x20\x4b\x3f\xd2\x9a\x65\x85\xe9\x2c\xe3\xa3\xee\xe2\xc5\xae\x17\x79\x20\xf7\xb4\xab\x2c\xac\x87\xd6\x72\xab\x6b\xaa\xc1\x18\x6d\x90\x4a\xea\x34\x98\x53\x4e\xb5\xab\x23\xe4\xac\x4c\x0d\xdb\x0d\x82\xa5\xae\x53\x1d\x76\x54\x9d\x36\x76\x28\x57\x7b\xac\x42\x35\xe8\x97\xd9\xfe\x20\x55\x22\x04\x7d\x21\x4f\xf6\xcc\xf3\x11\xc4\xe3\x97\x82\x7d\x97\xf2\x86\x8e\x70\xac\x17\xd2\x8e\x33\x49\x99\x74\x4d\x35\x93\x76\xa4\x82\xfd\xcb\x41\x4b\x02\xb2\x68\x7b\x96\x2e\xe8\x08\x6e\x57\x3f\xe0\x00\xdc\x51\xde\xe0\x68\x79\xc6\x84\xe2\x5f\x94\xce\xe5\xe8\x61\x34\x7e\x7b\xe7\xfc\xa5\x49\xa0\xf7\x65\x13\x6a\x2f\x4b\x88\xfe\xde\x07\x02\x4d\xd2\xfc\xe1\xf6\xd0\xc0\x35\x4d\xa1\xa1\x6e\xf3\x66\xb3\x15\xb3\xf7\x23\x30\x31\xf9\x79\xb7\x0e\xac\x6e\x23\xbf\x3b\x34\x9e\xfb\xd0\xe4\xf5\x3f\x4d\x5c\x41\xfc\x00\x42\x76\xa5\x96\x70\x65\x9f\x69\x05\xef\x03\xd2\xfc\x09\x8d\x58\x9f\xcb\xc1\x32\x82\x82\xfa\x22\xb1\x0d\xb8\x3c\x5d\x70\x86\x59\x94\xfd\x19\xd7\x60\xa3\x9d\x47\x6e\x02\x33\x0d\x2c\x6d\x19\xe7\x42\x26\x7d\xd3\x65\xbb\xe1\xfe\x5c\x71\x1a\x95\xb1\x84\x50\x8c\xe4\x8c\x1c\x96\xd7\xe6\x39\x90\xb4\x08\xd4\x50\x89\xbe\x79\xe3\x2f\x9c\xb0\x16\x2f\xd1\xe7\xd0\xd1\x9d\x97\xd0\xae\x78\xff\x82\x4c\xc6\x98\x94\x86\xc0\xbd\x03\x83\x52\x55\x1f\x37\x49\x9e\x9e\x98\x26\x80\x4e\x9d\x26\x24\xad\x0c\x7b\x75\x34\x56\x0f\x45\xfd\x7d\x32\x4b\x8e\x51\x7e\x01\xc9\xb2\x74\x3c\x14\x97\x9c\xfd\x51\x2b\xc3\xfe\x66\x72\x79\xb3\xa2\x77\xfb\x46\x3e\x9d\x73\x49\xb6\x4f\xfc\x9f\xe6\x08\x84\xc2\x1e\x48\x10\x81\xed\x70\xe6\xda\x5a\x35\x39\xc4\x48\x97\x1f\x0d\x97\x87\x28\x9f\xcb\x00\x80\xf2\x19\xe9\x94\x49\xf8\x29\x8c\x42\x47\x5f\x87\xfd\x10\xae\xb5\x09\xc5\x30\xcf\x6a\x57\x74\x8e\xb8\xf3\x56\x21\x61\xfa\x48\x75\xea\x95\x3f\x09\x65\x9c\x7d\xf7\xa9\x95\x0f\x03\x17\x46\x7c\xb4\xe5\x36\x6e\x19\x6e\x32\xf5\xe2\x69\x67\x33\xa2\x5e\xac\xbd\xe4\x92\x10\x49\x07\x62\x06\x0e\xa2\x31\x37\x0d\x40\x90\x42\x9b\xb0\x6b\xb8\x67\x39\x9e\x8d\x37\xbf\x5d\x21\xa0\xe7\x21\x47\xe4\x96\xcf\x3b\x7d\xd6\xfe\x6e\x5e\xde\xa9\x66\x8d\x80\x21\x90\xa9\x1c\x60\x0e\x29\x52\x3f\x8e\xb9\x04\xe4\x8b\x70\x41\x2b\xc1\x0a\x70\x20\x98\x4c\x5f\xf0\xf5\xf3\x83\xf2\x14\xae\x59\x4d\xc8\x59\x71\xe4\x80\x37\x28\x48\xd0\xd7\xe7\xcc\x5c\x18\xff\x88\xba\x9b\x26\x2d\x78\x84\x69\x8a\x41\xc6\xc7\x81\x9c\x03\x19\xfd\xc6\xbb\x07\xb9\x1d\xc1\x69\x4d\xaf\xe3\xaf\x37\xa5\x38\xbf\x2b\x2d\x8c\xac\xb2\x7d\x24\xcd\xc6\xea\xdb\x8c\x6a\x2e\x6b\x7d\xf8\xa4\x65\x4a\xe9\x37\x85\x0c\x89\x0a\xd9\x30\x98\x0a\xfc\xc1\x49\x2d\xb8\xa0\x16\x8c\xbc\x9f\x10\x65\x7e\xb4\x8d\x2a\xc8\x7f\x51\x75\xd2\x3c\xae\xd4\xb5\xe6\xf1\x0b\xbe\xaa\x5e\x33\xfc\x5f\x64\x18\xd6\x3b\xa3\x74\xab\x1a\x3c\xbd\x36\xb7\x29\xdd\xbd\xab\xa9\x89\xd4\x64\x5e\x3a\x66\x13\x0b\xae\x41\x7c\xad\x08\x6d\xad\xd3\x08\x43\x35\x25\x14\xc3\x75\xf2\x57\x1a\xba\xf9\x3e\x9a\x07\x71\xfa\x10\x3a\xe9\x25\x85\xb0\x4f\x55\xc4\x34\x76\x9b\x43\xd6\xd2\x2f\x75\x3f\x93\x06\x03\x6e\x53\x52\x4f\x6f\x4d\x9c\xcb\xd2\xc3\x03\x17\xa8\xe8\x99\xf3\x16\x14\x90\x35\x89\x4d\xa9\x45\xb7\x6d\x90\x82\xbf\xee\x32\x8e\x7a\x31\xb6\x63\x28\xee\x8b\x94\xe0\x68\xc7"}, +{{0x75,0xa5,0x03,0xf4,0x8f,0xfc,0x22,0x16,0x17,0x67,0x25,0x19,0x11,0x1b,0xf9,0x0d,0xa3,0x9d,0xa9,0xea,0xb2,0xe2,0x91,0x4f,0xd3,0x75,0x5f,0x10,0xf5,0x39,0x36,0x68,},{0xf6,0x80,0xcc,0x0f,0x63,0x58,0xcd,0xcf,0x53,0x7a,0xa7,0x11,0x28,0xcf,0xad,0xfc,0x0f,0x3a,0x89,0xc1,0x00,0xaa,0x34,0xbc,0xd2,0x42,0x7e,0x24,0x8b,0x6e,0xd5,0x0b,},{0xdf,0x28,0xe3,0xe6,0x30,0x36,0x08,0x67,0x86,0x4b,0xc4,0x1e,0x43,0xfd,0x7d,0xde,0xb5,0x28,0x76,0xdc,0xe9,0xb2,0x34,0xa3,0xfc,0xc3,0xd8,0x54,0x9d,0xb0,0x11,0x2e,0x17,0x63,0x90,0xa6,0x85,0xeb,0xd4,0x84,0x93,0x6e,0x25,0xc0,0x8c,0x8a,0x38,0x78,0xa3,0x7b,0x3c,0x4e,0x23,0x9a,0xd0,0xa0,0xe5,0x01,0x99,0x37,0xff,0xbc,0xd4,0x07,},"\x7b\x01\x09\x04\x23\x23\x6c\xb4\xb1\x3c\x41\x77\xfc\xe5\x2a\x7f\xf6\x58\x05\x88\xcc\x2e\xb5\xa3\xf3\x9f\xf5\xd0\xc7\x3e\x01\xe0\x1b\xf7\xbd\x74\xaf\xe4\x15\x12\x50\xc3\x91\x42\x6e\xa5\x07\x27\x1b\xea\x1d\x6d\x85\xf0\xb2\xfe\x35\xc4\x05\x00\xf9\x8d\x06\x56\xc6\x38\x8f\xc9\xef\xba\x18\x37\xdb\x22\xdf\xa2\x9d\x89\x26\x76\xf5\x0e\x57\x5f\xe8\x9f\xd2\x93\x89\xd0\x9d\x08\x0b\xad\x67\xba\x54\x4c\xac\xab\xf5\xa7\x73\x82\x37\xc5\x5e\x28\x75\xed\x49\x16\x30\x2a\x2b\x4d\xc4\x96\xe7\x42\x73\xbf\x05\x19\x11\x37\x81\x0e\x50\xe4\x81\x95\x26\x0b\xab\x6d\x81\xf9\xc8\x05\x62\xee\x73\xcc\xb9\x33\x3c\xd9\xb6\x1d\xaf\x5b\x00\x38\xa4\xe6\xc5\xc9\x58\xa9\x1f\x68\x50\x8c\x1d\x88\x25\x19\xc1\xaa\x4f\xfc\xc5\x35\x62\x46\x3a\x0a\xe3\x01\x63\x69\x6f\x84\xb9\x7c\xcb\xd8\x67\x98\x20\xed\xd3\x61\x7e\x7b\x89\x6e\xef\xfe\x34\x1e\xc6\xb5\xb0\x3f\x73\xb6\x25\xd7\x41\xc6\x55\xfe\x6e\x82\xd1\x1d\x47\x8a\x7d\x54\x3f\xf6\xc0\xfa\x3a\x3a\x8c\x94\xa6\x16\xfb\x84\x70\x70\xd1\xfb\xdd\xe6\x01\x0f\x02\x6b\x08\x9c\xd8\x63\xc3\xbd\x29\xb1\xc4\x26\x9f\x77\x65\x9e\x51\x57\x28\x89\x0c\x97\x3b\xe8\x7f\x0b\x83\x3c\xa5\xaf\x6b\x4c\x31\x33\xad\x4f\xa4\xf9\x16\x55\xc6\xad\xb5\xb7\x23\x5c\x27\xfe\x34\x82\x84\xf3\xf1\x33\x66\xa6\xa0\x3a\xd2\x2b\x87\xc6\xf5\x58\x4b\xde\xae\xa4\x8c\x70\x32\x5d\x6e\x33\xa4\x75\xf5\x05\x11\x06\x38\x75\x19\x2a\x87\xed\xc3\x88\x08\x9b\x84\x39\x53\x90\xc2\xa3\xad\x89\xa2\x25\x95\xdc\x4a\x71\x5a\x42\xa2\xc0\xef\xde\xf6\x7b\x35\x4b\x34\xfc\x75\xca\x98\xdf\x91\x3e\x75\x9e\x51\xc7\xf6\x25\xdd\xd5\x98\xac\x22\xd4\x21\xde\xcb\x57\xbe\xbd\x54\x22\x0e\xc6\xda\xa5\xec\xe7\x69\xd2\xe0\x1b\xe7\xb6\xbe\xe2\xff\x5a\x0b\x06\xb3\x2d\x6d\xa1\xd7\xbc\x05\x7e\x3a\xbf\xaa\xb2\x42\xa3\xf7\xe6\x64\x6a\x15\x9e\x4f\x50\x5e\x46\x62\x98\x2b\x13\xd0\xcc\x1f\xba\x91\xd1\x03\x09\xa4\x2d\xc1\x08\x7c\xf1\x0d\x36\xe3\x1f\x17\x06\x15\xa0\xac\xb5\x08\xbf\x68\x3e\x2d\xe0\x0c\x87\x64\x0d\x30\x4a\x94\x7b\xc4\x97\x1f\xf3\x61\x9c\x72\xab\xd8\x3c\x7b\x2c\xbb\x34\x64\xc4\x04\x0c\x26\x62\xb5\x85\x08\xb7\x46\x80\xcf\xa6\xde\x06\xe8\xd2\x1e\x3b\xec\x85\x11\x19\x93\x12\x68\x00\x09\x07\x1f\x70\x6b\x7b\x13\x3a\x24\x87\xd5\x74\x5f\xfa\xdd\x5d\xc0\xeb\x2b\x55\x3d\xf4\x40\x78\x7f\x01\x1d\xda\x37\x71\x9f\xa7\x13\x15\xe8\xb2\x91\xef\xd7\x7d\xa3\xba\x14\xfb\x99\x5f\x03\x57\x1a\x3d\xb5\x22\xb6\x3c\x60\xbe\x56\x19\x94\x16\x99\xb3\x92\x22\xb5\x9d\x0f\x23\xe5\xeb\x37\xea\xd4\xb7\xf7\x50\xed\x4a\xbf\x4d\xb8\x7c\x70\xda\x66\x5b\xef\x4d\x7a\x29\x21\xb2\xc9\x98\x97\xf2\x32\x1c\x9b\xe6\x07\x5e\x74\x4c\x82\x28\x63\x9a\xb7\x36\xdb\xeb\x2b\xea\xb4\x40\xc1\x56\xa3\x9a\x2e\xfd\x26\x1d\xb5\x08\x55\xe3\x04\xd9\xcf\xeb\x99\x14\x1c\x61\x35\x58\x10\x9f\x21\x47\x4d\x27\x2a\x2d\x90\x6d\x48\x93\x93\x4a\xff\x8e\x08\xa4\xfc\xee\x96\x4a\x5c\xd0\x07\x32\xfd\x33\xaf\x29\x84\x9c\x8d\xfc\xa6\x59\x79\x42\x18\x57\x18\x5c\xf6\x29\xf8\x68\x07\xa8\x59\x73\xd3\x44\x0a\x6b\xf8\x11\xa5\x8d\x04\x13\x87\x24\x98\x11\xec\x04\x7e\x5e\x8b\x34\x3b\x23\x87\xd0\x18\x1e\x0d\x0b\xd4\x61\xef\x10\xe8\x16\x4a\xae\x35\x7d\x9b\x29\xdc\x0a\xce\x3e\xc6\xd7\x43\xae\x34\x54\xab\x9f\x84\x2a\x28\xd5\x71\x02\x17\xdf\xfe\x50\x34\x4e\x8d\x93\x2f\x18\x01\xb0\xe8\xf9\x66\x19\x8e\xf1\xc9\xcc\x69\x69\xf3\x47\x34\xaa\x6a\x63\xae\xaa\xb4\x33\x9f\x75\xd3\x4f\xfa\x8a\xcb\x93\x7e\xd9\xc7\x30\x92\xa3\x09\xa9\xb8\x4a\x25\x01\x1e\x31\x14\xc2\x65\xe4\xf6\x02\x33\x7e\xb6\x99\xb5\xa2\x2d\x57\x2b\x03\xe4\xda\xd0\x3b\x04\x61\xc0\x0d\xb9\x67\x9b\x72\xfc\x5b\x49\x3e\xf4\x48\x6f\x85\x53\x5d\x81\x3a\x58\x08\x03\x85\xaf\xd4\xe8\xd8\x71\x82\x80\x34\x33\x4b\xfe\x44\x1d\x18\x98\x4e\x4d\xfc\xde\x02\x44\x03\xb5\xae\x66\xcc\x50\xa4\x73\x01\xb5\x7f\x9a\x32\xf7\x40\xbd\xc7\xff\x1d"}, +{{0xd8,0xaa,0x2a,0x0a,0xa5,0x14,0xfd,0x84,0x5f,0x7a,0xa6,0x6b,0x83,0xc0,0xea,0xbb,0x9c,0x16,0x02,0x3a,0xbc,0x16,0x95,0x77,0x34,0x50,0xb2,0xbb,0x33,0x25,0x22,0xf2,},{0xe4,0xe8,0xd6,0xb2,0x98,0x24,0x8c,0x15,0xfe,0x08,0xf8,0x7a,0x3b,0xc6,0x08,0x4b,0xf2,0xd6,0x4d,0x7f,0x1e,0x4b,0x2d,0x51,0x59,0x9e,0x9f,0xad,0x9c,0xc9,0x10,0x92,},{0x14,0x6f,0x65,0xd4,0x3e,0x71,0x55,0x42,0x89,0x4b,0x79,0x00,0xa2,0xf8,0xcd,0x4b,0x17,0xd3,0x87,0x0a,0x61,0x00,0xe3,0x7d,0xe0,0x05,0xb0,0xdb,0x5d,0x81,0x51,0x24,0x6d,0xe4,0xee,0x38,0x42,0xd3,0xeb,0xca,0x20,0xa5,0xda,0x22,0xa3,0x63,0xa7,0x57,0x5e,0x7a,0x55,0x12,0x82,0x95,0xf2,0x72,0x11,0x48,0x4a,0xf5,0x7c,0xd5,0x31,0x09,},"\x08\xde\xb3\xb8\x32\xf5\x2d\x65\x56\xf7\x8c\x3f\x0a\xbe\x46\xf1\xef\xe4\x5e\x3d\x5d\x88\xe7\xf8\xed\xf8\x03\x67\x0c\xe4\x61\x29\x21\x74\x9e\x9e\xce\x63\xfd\xc9\xbe\xf2\xba\x48\x38\x12\xbb\x62\x2b\xe7\x44\xd4\x04\x04\xfd\x6e\x09\xc9\xe1\xcb\x7c\xe1\x9d\xe8\x1a\x9d\xad\xf5\x56\x35\x2e\xe8\x98\x10\xc7\x6a\x9b\x10\x47\xac\x62\xb1\x6e\xbb\x7d\xa2\x3d\xdc\x2d\x4a\xb7\x6a\x02\x05\x61\xd0\x2d\x41\xb5\x8b\x94\x95\x3a\x23\xfa\xaf\xdd\xd7\x81\xb7\xdc\xa7\xb7\xfb\xee\x70\x6e\xc1\x0a\x73\x12\x5b\xf7\x44\x36\x05\x6b\xf3\xb4\xf2\xa0\x70\x1c\xfe\xf0\x5b\xeb\xd3\xdd\x8e\xef\x30\x6c\x1a\xc1\xb0\x09\x50\x88\x1f\xf0\x5a\xb5\xc8\x24\x8a\xd1\x09\x6a\xc9\x1d\x52\x6a\xe5\x9b\xa0\x58\x3b\x27\xdb\x7d\x1e\x39\x0f\x57\xa5\x88\x9e\x27\x99\xa4\xa1\x51\x9b\x15\xd9\x3d\xbf\x0b\x21\xd4\x50\x87\x3c\x76\xba\x52\x04\x61\xe8\xbb\x5c\x83\xc9\x01\x2e\xac\xd5\x57\xbe\xa6\x40\x58\x6e\xfc\xb8\x69\x00\x76\x47\xd4\x49\xf9\x1c\xcd\x52\xaf\xe3\xa8\x94\x77\xde\x7c\x2b\x64\x7e\xcc\x9b\xf9\x67\xfb\xf5\x76\x9d\x74\x88\x94\x47\xd9\x52\x2d\x9e\x80\x69\xc3\x49\x9a\xf6\xa8\xa1\x09\x7a\x95\xd3\xbc\xc5\xf8\x34\x33\x93\x44\x84\x31\x4c\xb3\x07\x58\xb5\x25\xfe\x53\xe9\x07\x21\xdf\x5c\xbe\x03\xd9\x6f\x0d\x0f\x98\x52\x1f\x01\xa5\xfb\xe5\x7c\xe8\x80\x4d\xbd\x18\xf8\xf5\xea\xc8\xf7\xdb\xb5\x8c\x41\x78\x9a\x44\x43\x3f\x8a\x8d\x12\x45\xd2\xad\xda\x8c\x78\xd8\x81\xc6\x5e\xa6\x61\xab\x17\x8d\x4f\xc2\x63\x4c\xd6\xcb\x51\x4a\xb6\xf2\x54\x3e\x91\x12\x18\x3f\x3f\xf7\x3a\x3f\x45\x01\x06\xb0\xee\x8a\x34\x7a\x80\xcb\x82\x4a\xc1\xf8\x01\x64\xe3\xbb\x51\x23\x69\x8d\xe0\xe7\x47\x35\x9c\xa3\x5a\xca\xa3\xba\x0c\x94\x3b\xea\xcd\x7a\x9b\xdf\x8f\xf7\x39\x78\xe9\xfb\x00\x20\x45\xe8\xfe\x56\x48\xcc\x0f\x9c\xfa\x88\xb0\xd8\x12\xe8\x1a\xa6\x2e\x0d\x9c\x73\xfe\x61\x3a\xfd\x95\x39\xbc\xb6\x15\x72\x1f\xb4\x97\xd6\x2f\x65\xc8\x3b\x87\xa6\xd2\x14\x3f\x9b\x1c\x88\x0e\xc8\x67\x1b\xd4\x2c\x8d\xe9\x57\xb1\xa6\x8e\xe4\x92\x26\xff\x71\x7c\xcc\x6e\x74\xf2\xee\xe4\x9c\x30\xde\xa5\x3f\xec\x3c\xd4\xd9\x0f\x2c\xcc\xd8\xf9\x7c\x55\xd5\xc7\x52\x45\x4b\xe2\xba\x7b\x6f\xf2\x03\x0b\xe6\x7e\x0d\xf5\x0c\x5e\x88\x38\x43\xe7\x16\x12\xf2\xb9\x53\x59\x54\x3e\x2b\xa1\xbf\x2e\x98\xde\xbc\xf5\x76\x8f\x2b\xe6\xfd\x50\x4d\x97\x83\xce\x92\x1a\x81\xe0\x94\x16\xdb\xcf\x2b\xb6\x55\xa9\x24\xb1\xef\x01\x12\xd6\x71\xf0\x84\xa5\xb6\x90\xb0\xb6\x4a\x8b\x9b\xf5\x03\x33\xc3\x59\xff\x3f\xef\x19\x96\x94\xf9\xb6\x29\x24\x24\xf0\x06\x66\xce\xf6\xd0\x6d\x16\x1a\x79\xe3\xa1\xb9\xb9\x62\x9e\xea\x53\x50\x5f\x5e\x36\xae\xad\xfe\x0d\x75\x96\x72\xb0\xff\xe4\x98\x39\x7d\x90\xa5\x5d\x99\x44\xb3\x05\x41\xa7\xe1\xbd\xac\x53\x02\x06\x40\x13\x7d\xc2\x52\xae\xf6\x22\xf3\x81\x9d\x36\xab\x49\x8d\x76\x3e\x43\x27\xba\x85\x80\xdd\x9f\x7e\x5f\x47\xc2\x4c\xc9\x92\x87\x34\xb7\xe6\x21\x12\xc5\x7e\x3e\x0c\xfe\xde\xcd\xcb\xac\xcb\x0c\x45\xaf\x82\x19\x45\x5e\xe7\x22\x3c\x71\xe7\xe2\x04\x10\xc5\x24\x4e\xb8\x27\xaf\x2f\x39\x35\xce\x47\x55\x44\x47\x47\xaa\x94\x5f\x4c\x26\xdb\x3a\x29\x85\x19\xe7\x5f\xc6\xba\xce\x91\x52\x99\x72\xe8\x69\x1b\x69\x4d\x30\xaa\x8b\x5e\xc4\xc1\xa0\x28\xd3\xbd\x10\xbd\x0c\x8a\x40\x8f\xb7\xd9\xd7\x03\x49\x55\x53\xec\xea\x59\x8d\x06\x22\xdc\xc7\x4d\xe4\x89\xba\x71\x95\xcd\xae\x8d\x5c\xff\x98\x55\x92\x18\x37\xb5\x28\x43\x3e\xe5\x5c\x0b\x70\x90\x85\x7a\x0c\x27\x84\xd9\x31\x0b\x48\x25\xa7\x99\x3a\xd9\xc6\xf1\x8f\x83\xbc\xa5\xcc\x6a\x25\x04\x71\x68\xa8\x37\x6b\x06\x2e\x3a\x48\xea\x90\xca\xd8\x8e\x33\x11\x87\xc2\xb6\xf2\x81\x42\x6f\x81\xf7\x88\x04\xa8\x95\xc4\xec\x06\xc3\x41\xfe\x84\x6a\xf4\x52\x7e\xa2\x60\x69\xdc\xf6\x1d\x81\x3f\xdd\xf0\xfc\x43\xc7\x07\x35\x0b\xfb\x2f\xc1\xcf\xfc\xee\x7d\x7c\xcd\x7d\x75\xf7\xa4\x65\xa3\xd1\x4d\x57\x30\x2c\x14\x6a\xba\x3e"}, +{{0xde,0x8f,0x1c,0x99,0xe7,0xf8,0x55,0x6d,0xf2,0x0b,0x59,0xb8,0x50,0x4c,0xff,0x7c,0x6c,0x52,0x41,0xa8,0xae,0xeb,0x30,0xb9,0x2e,0xab,0x97,0xbf,0x48,0x1d,0x0f,0xe9,},{0xe4,0x63,0x79,0x1d,0x0f,0x56,0x7e,0xe7,0x3a,0xbb,0xf4,0x7d,0xd5,0x71,0x67,0xa5,0x35,0x61,0x3b,0x05,0xcd,0x48,0xd9,0x2e,0xbc,0x7d,0x24,0xe6,0xeb,0xff,0x95,0x73,},{0x30,0xab,0xc4,0xe4,0xe4,0xb3,0x88,0x58,0x1e,0x66,0x8b,0xd4,0x09,0xee,0x18,0xa6,0xed,0xe8,0x1a,0x13,0x6c,0x28,0xa2,0x92,0x4d,0xf5,0xfc,0x00,0xd7,0xc2,0x80,0xd9,0x78,0x62,0xae,0x3a,0x67,0xa9,0x35,0xce,0x49,0x23,0x64,0x13,0x5e,0x65,0x9a,0xdb,0x5f,0xba,0xbe,0x68,0x98,0x16,0x59,0x1f,0x49,0xac,0x50,0x22,0xa3,0x87,0xcc,0x09,},"\x38\xd9\x3e\x5c\x98\x01\xdb\x90\x17\x97\xec\x75\xc6\xdd\xdc\x65\xae\x79\x80\xde\x21\x0b\xed\x43\xb3\x3e\xb4\x4c\xdc\x6d\xc9\x93\x3f\xb6\xbe\xc7\x42\x1d\xb1\x0f\x0a\x59\x32\x0b\x9e\x64\x2a\x21\xf1\xdd\x23\x56\x01\xfc\xd6\xc5\x3b\xe4\xa8\x77\xf4\xfe\xd3\xfa\x4a\x0a\xd4\xdc\x6e\x9b\x39\x1b\xcf\xa4\x34\x90\x69\x25\xba\x45\xec\xc5\xb4\x35\xd9\xab\x8c\xfa\xfc\x39\x4b\xdc\xca\x9b\x07\xd5\x66\x83\x93\x44\x6e\x34\x00\xe9\x03\x94\x35\xa1\xdc\x78\xcb\xc0\x88\x07\xa3\xfb\x24\xca\x8b\x19\xf6\x4e\xa0\x8b\x8b\xf6\xc2\x0a\x19\x5b\x51\xff\x80\x15\xf3\xe7\xc9\x1d\x08\xe4\xbc\x62\x41\x55\x95\xa5\xa8\x82\xfb\xa6\x51\xdc\x3a\x67\x51\x87\xaf\x61\x82\x49\x74\x7b\x46\x80\xd1\xd1\x5a\x20\x2e\xa9\xdf\x48\xb1\xc2\x14\xfd\x40\x34\x66\xfd\x1a\x26\x5f\x2d\xef\xaf\x8e\xd5\xa6\xbf\x0e\xb0\x8d\x18\x64\xf2\xa2\x8e\x94\x72\x14\x3c\x6f\xd1\x03\xb6\xb1\x08\xc0\xd1\xd1\x36\x3b\x99\xf9\x20\x2d\x11\xf0\x20\x56\xc2\x79\xcc\xa3\x15\xdb\x1a\xb6\xd3\x10\x18\x45\x8f\x57\xba\x33\x16\xcd\x27\x38\xe8\x0c\x49\x2d\x85\x7c\xb1\x74\x99\x25\xe3\x31\xc6\x58\x58\xb5\x09\x83\xcd\x98\x38\xcf\xd2\x18\x8a\x5e\x8f\x05\xb4\x71\xfd\x3c\xdd\xcd\x30\xd9\x69\x01\x19\x40\x20\xf1\x15\xfb\x46\x9a\xb5\x84\x90\x06\xdf\xfa\x2d\x54\x3a\x13\xb3\xb5\x06\xed\x65\xcc\x45\x75\x32\xb8\xaa\x3e\xe3\x1d\x9d\x8d\x9e\x52\x98\xd7\xac\x70\x7a\xc1\x5b\x82\x7a\x57\x8c\x81\xd4\x34\xf8\x4c\xb1\xb5\x61\x20\xd6\x67\xb2\xaf\xe6\xd1\x53\x0a\xfd\xdf\xb9\x66\xd9\x53\xbe\x7e\x32\xdf\x07\xde\x38\x9e\x2d\x04\xb2\x32\xd3\x51\x2c\x7d\xb9\x35\x8f\xc9\x44\xd1\xb1\x18\x07\x8e\x69\x99\xe8\x91\xbb\xfa\x4a\x43\x29\xf6\x5d\x80\x71\x88\xb5\x98\x58\xc4\x31\x21\x1b\x29\x57\x6f\x44\x96\x13\x8b\x7c\x0c\x12\x8f\x7b\xef\x5f\x79\xb0\xf4\x46\xfc\x6b\x4a\x0e\x20\xbc\xa4\xc4\x0a\x83\x57\x1a\x36\x64\x4a\xbf\xfa\xbd\x49\xcb\x58\x5f\xd0\x64\xc8\xe5\x09\xd9\xa0\xfc\xff\x46\x26\x76\xf0\xeb\xcb\x61\xce\xc6\x1e\x51\x2b\xe6\xf1\x82\xab\xd5\x9e\x09\xf6\x42\xaa\x61\x96\x34\x85\x34\x82\xec\xe8\xf8\x98\x00\xf9\xc5\xbc\xfb\x84\x14\x31\xca\x06\x91\xed\x8d\x80\xe0\xa2\xfc\xb7\x97\xa0\x36\x89\x7c\xfb\x65\x37\x58\x6b\x31\xc0\x0b\x79\x65\xef\xdd\xfd\xa7\x28\x61\x84\x50\x26\x45\x91\x57\xf7\x9e\xba\x1b\xca\xf6\xcd\x41\xd6\x18\xae\xb1\xbd\x8d\xa1\xbe\x98\xf0\xcd\xc7\xf2\xe0\x9b\x90\x3d\xe4\x9c\x0c\x1b\xe9\x1d\xcc\x17\x7b\x29\x80\x96\x83\x6d\xce\xa4\xf6\x01\xdd\x86\x69\x15\x55\x12\x83\x25\x43\x8b\xd9\xcc\xbf\xc0\xe7\x77\x92\x0a\xe8\xbb\xd5\x76\x34\xc6\x10\x4f\xe6\x9a\x3a\x72\x01\x2a\x23\x60\xb6\xe5\x52\x55\x0c\xff\xb4\xe2\xf0\xb4\x1f\xe1\x55\x37\xee\x0e\x6f\x37\xe7\x88\x0f\xb4\xd1\x2b\xef\x6c\xad\x26\x6c\xe5\x8d\xf9\x81\x6b\x35\x96\x0c\xd0\xbf\x86\x52\x86\x2e\xe7\x89\xcc\xc3\x1a\x7e\xfc\x21\xa8\x1b\xda\x46\x14\x6b\x11\x1f\xcf\xd9\x4f\x04\x85\x6a\xb6\x1a\x55\x7b\x1f\xf7\xc8\xe4\xea\x6d\x9c\x4b\xcd\xd9\x3b\x15\x1a\xa0\x84\x61\xc5\x68\xde\xfb\x2a\xef\xdf\xce\x96\x39\x4d\xc8\x22\xd4\xef\x6c\xc4\xb9\xa3\xe6\xc3\x32\x03\x9f\x65\x38\xaa\x0d\xf8\xde\x81\x26\xd9\x0c\x31\x2f\xf4\x96\x88\x74\x86\x11\x15\x65\x53\x43\x46\xa7\x46\x26\x25\xd6\x3d\xf6\x9f\xcb\x57\x41\x90\x6f\x19\xe0\x0f\xc8\x00\x3f\x08\xb9\x59\x85\xc3\x8b\x86\x74\xaf\x42\x3c\xa5\x6d\xe5\xf8\x81\xb5\x9c\x46\x62\x43\xa7\xad\xba\xdb\xa2\x9c\xaf\x57\xfa\x77\x71\x22\xe6\x18\x23\xb4\xe7\x08\x18\x2a\xaf\x37\x20\x6d\x7d\x5e\xd0\x51\xc1\x2a\x5c\x0f\x6b\x43\x71\x04\x3f\x56\x2c\xdc\x02\x9d\x5e\x1b\xa9\xb2\xbf\x5f\xfb\xf1\xf5\xf5\x23\xdb\x06\xfe\xca\x42\x7d\xb7\xa0\x88\x19\xff\xb2\xd0\x58\x52\x42\xe2\x0d\xa5\x8e\x32\x0b\x16\xb1\x6e\x44\x8d\x8b\xe0\xef\x74\x02\xd2\x4a\x71\x94\x25\x71\x33\xbd\xc9\x82\x31\x4d\x83\xad\xbc\xd1\x2e\x8a\xf3\x13\x03\x42\x6c\x59\xff\xd8\x26\x9c\xe4\xb9\x87\xca\x9b\x6f\x0f\xfd\xbb\x4d\x1d\x12"}, +{{0x07,0x36,0xf8,0x01,0x72,0x0a,0x94,0x7c,0x5c,0x2f,0x32,0x58,0xce,0x0d,0x51,0x1c,0x3e,0x17,0xe9,0x4e,0x37,0xb3,0x0a,0xdf,0xa5,0x20,0x95,0x92,0x11,0x71,0xd4,0x00,},{0x4f,0x69,0x42,0x55,0x92,0x0d,0x0c,0x38,0xde,0x6e,0x72,0xe1,0x65,0xc3,0x3a,0xee,0x76,0xb1,0xcb,0xf6,0xf4,0x83,0x7a,0xa5,0x90,0x14,0x75,0x66,0x7a,0xcd,0x28,0x26,},{0xc0,0x3c,0x03,0x14,0x85,0x12,0x79,0xed,0xcd,0xe9,0x70,0xc2,0x3e,0xfa,0x23,0x6f,0x23,0x5e,0xda,0x96,0x0d,0x2c,0x27,0xd3,0xca,0x94,0x6f,0x65,0x0c,0x20,0x0b,0x4e,0xba,0x04,0xbe,0x66,0x8f,0xf6,0x2e,0xaf,0xfa,0x6c,0xea,0x35,0x1a,0xbd,0xfc,0x54,0x40,0x1d,0xcc,0xce,0x3d,0xba,0x78,0x00,0x4a,0xec,0x95,0x81,0xa2,0xcc,0xf4,0x0f,},"\x7f\x87\xb5\x1f\x6e\xad\x2d\x44\x02\xa3\xbd\x3c\x37\x69\xa2\x67\xac\x8e\x82\xf7\x79\xad\x7b\x98\x6d\xec\x82\xcb\xfc\x1e\xa5\x12\x91\x88\x43\x26\xd9\x22\x69\x67\xcb\x66\xa9\x68\x73\x18\x4f\x0e\x83\xb3\xab\x25\xa5\xab\x2f\xa8\x05\xfe\x3a\x0e\x7b\x19\x0a\x62\x2d\x46\x1b\x78\x30\xa3\xf6\x97\xc8\x31\xc2\x9e\xa7\xc0\xcd\x4b\x68\xd8\xe7\x7a\xa6\x97\x11\xcf\x86\x4d\xc1\xd5\x39\x4f\x48\x45\xe2\xfb\xb5\x07\x64\x04\xe0\x9a\x88\xb7\x9f\x05\x67\x05\x51\xbc\xe2\xef\x54\x68\xb7\x9d\x57\x88\x8b\x98\x52\xa4\xbb\x47\x9a\x4f\xd0\xbe\xb6\x81\xfd\x52\x3f\xc5\xbf\x44\x58\xab\xbc\x38\xec\xe7\x2e\x10\x6e\x00\x22\x20\x15\xa5\x7e\xbe\xc5\x5b\xf4\x75\x13\xe2\x5c\x3c\x45\x54\x84\x3b\xda\xcb\xcf\xe9\xf1\xb8\xd0\xae\x35\x4e\x48\xd0\x3f\xde\xbd\xf2\x0d\x65\x5b\x52\x68\xd8\xbb\xbf\x33\xb1\x28\x89\x10\xf0\x44\x4f\xcd\x56\xc0\xda\x7b\x89\x03\x36\x2b\x7e\x37\xa8\x64\x65\x42\x77\xcf\xfb\xe6\xc6\x08\x57\xf0\xb3\x51\x4d\x22\xa4\x0b\x9d\xd2\xd3\xfe\x5c\xae\xa5\x50\x7a\x0d\xe3\x05\x1b\xb3\xa4\x01\x5f\xa0\xfe\x4c\x46\x2b\x98\xfe\xf2\x35\x7d\xcf\x6b\x97\xdc\x75\xde\xf3\x82\xf9\x01\xf9\x6f\x4a\x04\xa3\xef\xc6\x02\x54\x20\x0a\x2c\x4c\xdc\x8a\x58\xb2\x5d\x94\xe3\x29\x54\xea\xff\x15\x11\xac\x46\xe3\x60\x66\x63\xb6\x87\x5f\x13\x64\x99\xda\x6a\x76\x90\x97\x87\x9a\x6e\x08\x34\xd5\x64\xfa\x7f\xdb\x99\x58\x11\x83\xed\x0c\x9d\x48\xfd\x19\x5d\x7e\xcd\x9f\x4d\xd4\x86\x55\x65\xfd\x17\xa0\x08\x71\x8d\xcd\x76\xf6\x8a\x54\xe5\x16\xa2\xb7\x30\xed\x3d\xba\x5c\x2c\xf4\x06\x30\xbb\xfe\x7f\xa0\x3b\xb7\xcd\xd9\x67\x69\x54\x95\xa7\xc8\x6e\x2e\x84\xcb\x01\x7e\xc6\x96\x01\x92\x46\x31\x59\x5a\xff\xaa\x8c\xfd\x04\x8d\x14\x26\x7c\x73\xe5\x4c\xfa\x53\x90\x47\xe7\x17\x69\x1e\x39\x97\x37\xfa\x50\xcc\x48\x44\x96\x12\x57\xc9\x3d\x72\x53\xd2\x32\x26\xb7\xcd\x0d\x1b\xd3\x1f\x3f\x0d\x2d\x89\x2d\x07\x3d\x8c\x50\x73\xc6\x02\xf6\x1a\x04\xd6\x43\x7c\x39\x03\xeb\x4a\x64\xa0\x1f\xbc\xc0\xc7\xe1\x59\x20\x1c\xdc\x4a\xa4\x2e\xf3\xb1\xff\x9c\x78\xfc\x27\x5c\xfb\x11\xa0\x5f\xfe\xd8\xf9\xf2\x2d\x85\xba\x92\x4d\x8d\x32\x23\x1c\x25\x4d\x89\x8d\xa7\xf0\x67\x9a\x64\xca\xb8\x40\x26\x90\x6e\x9e\x85\xf9\x5e\xfd\x8e\xe2\xa1\x72\x56\x33\xf4\xde\x2b\xa6\x7d\x99\xaa\x7f\x05\x50\xaf\x13\x9e\x9f\x8c\x52\x93\x78\x67\x27\xd8\x26\x30\x29\x6d\x5d\xaa\x9e\x83\x0a\xa1\xb3\xb5\xb3\x02\xb8\xb6\x62\xac\x83\x2e\x92\x13\x01\x6b\xa4\x93\xa0\x3a\x28\xcc\x3e\x95\x40\xd0\xd6\x5a\xcd\xdb\xfe\x12\x52\xb5\xc1\x6a\x84\xa4\x45\xce\x75\x41\x5c\x6c\xd8\xab\x16\xfe\x5e\xef\x11\x70\x97\xd7\x1e\xb5\x67\x6b\x9a\x95\xb3\x58\x82\xa7\xc3\x50\x6b\xc5\xd0\x2f\x03\x91\x0a\x63\xd4\x68\x46\xb2\x13\xc3\xc9\xbb\x2f\xc3\x4e\x6c\x69\x01\x7d\x20\x65\xa1\xad\x3c\xe3\xfd\x14\xab\x00\x14\xf5\x84\xe5\x7e\xa9\xd9\x03\xe4\x0a\xce\xb2\x30\xa8\x69\x3f\xa2\xe6\x36\x41\xc2\x54\x38\xff\x7a\x16\x38\x76\x04\x38\x84\x4c\xdf\x00\x11\x80\xf5\xb1\x77\xbe\x69\xed\xf7\xef\x66\xb3\x93\x12\x80\x52\x14\xcb\x17\x70\x6c\xef\xe5\x45\xbe\x5a\x77\x01\x9a\x5e\xc5\x2b\xbf\x78\x85\x0f\xa3\xd9\x7d\xe2\xd4\xd7\x4a\xa6\x8b\x58\xca\x81\x2a\x1b\x15\x6a\x0c\x40\x01\x12\x9f\x06\x72\x32\xa6\xec\x91\xa5\xed\x42\x70\xf2\xa4\xc6\xef\xee\xe7\x87\x00\x47\x70\xc8\x59\xe4\x50\xe8\x37\xef\xb0\x4d\xc9\x98\xbd\x27\x3c\x27\xa0\x98\x55\xe4\xec\xa1\xa2\x2a\x9b\x88\xc1\x7b\xdb\xf2\x53\xa7\x97\x61\x07\x0a\x76\x81\x7a\x7f\x74\xff\x3f\x07\xfb\x71\x8b\xff\xa0\xb4\xf3\x26\xf2\x84\xe6\x2f\x83\x68\x32\x42\x7b\xe8\x2f\x48\x33\x73\x51\x5b\x9b\xf5\x9a\xf4\xa7\x6a\x57\xe2\xf4\x0b\x91\x03\x4d\xd5\x68\xec\x14\xac\x10\xe2\x30\x9b\x87\xe2\x92\x2f\x9c\xd9\xfc\x1a\x46\xa4\x7e\xd3\xbc\x7e\x1b\x9f\xeb\x9e\xe0\x67\x07\x3f\xa5\xdc\xe2\xa6\x75\x30\x52\x6d\xe6\x7e\xe0\xe5\x09\x66\x3c\x44\x46\x7e\xeb\x59\x42\x01\x03\xeb\xcd\xff\xa7\x09"}, +{{0xfa,0x75,0x65,0x04,0x91,0x04,0x74,0x28,0xd3,0x63,0xb5,0x82,0x22,0x22,0x12,0x2d,0xff,0xb5,0xa9,0xfd,0xdc,0x60,0x3c,0x33,0xc8,0xa6,0x08,0x61,0x83,0x75,0xdc,0xf3,},{0x98,0xc9,0x64,0x1f,0xa9,0xdf,0xa8,0xea,0x13,0xe0,0xd1,0xc7,0x16,0xb8,0x67,0x9e,0x26,0x4b,0xe1,0x5d,0xd2,0xd4,0xc0,0x6a,0xb4,0x3c,0xbe,0xe4,0x79,0x16,0xee,0x01,},{0x1e,0xff,0xbf,0x92,0x99,0xa1,0xb9,0x35,0x4f,0xe1,0xf1,0xde,0xc1,0x76,0x65,0x95,0xea,0x76,0x7a,0xb8,0xe4,0xda,0x9b,0xb5,0x7b,0x4f,0x69,0xbc,0xbd,0x8c,0xb3,0xd8,0x6f,0x76,0x83,0x92,0xf5,0x9b,0x39,0xfa,0xfa,0x8a,0x21,0x0a,0x65,0x09,0xfe,0x0d,0x60,0x08,0xd6,0x35,0x61,0x11,0xad,0xfb,0x37,0x99,0xc1,0xd5,0x59,0xc2,0x63,0x09,},"\xf5\x4e\x41\xb9\x39\xe3\x7d\xf1\x7c\x7d\x60\x43\xfd\xed\x14\xa9\x15\xd9\x34\xe8\x67\xc3\x45\x26\x9f\xdc\x01\x77\xf5\xbd\x10\xc4\x34\x8f\x31\x9e\x0a\xb9\xa6\x4c\xc0\xb7\xd4\xe0\xc9\x1c\xa9\xaa\xda\xab\x2e\xdc\xba\x54\x4f\x14\xed\x2c\xb5\x39\xca\x89\x75\x09\x7d\x87\x92\x70\x95\xb4\xeb\xd4\x90\x34\x43\x40\x06\x1e\xd9\x3c\x38\x16\x7e\xda\xa0\x96\xa2\x30\xdb\x59\x62\x4c\x67\xfb\x9a\x1e\x1d\xda\xc4\x02\x13\x3f\x4d\x47\xcf\xc1\x1e\x2f\xae\x6b\x3f\x3c\x50\x01\xcb\xa9\xa8\xae\xd9\x00\x73\x10\x32\x40\x22\x7e\x71\x6f\xf7\x1b\xf6\x8a\x59\x1b\xa2\xce\xff\x2d\x31\xb8\x6e\xf2\x1a\xb0\x12\xec\xcd\x40\x9a\xd5\xc2\x9d\x65\x9a\x1b\x37\xc4\xd8\x55\x05\x30\x41\x40\xfb\x2c\x34\x37\xa2\x06\x86\x8b\x13\x52\xc1\x02\xbb\xfa\x3b\x9a\x76\x52\x2a\x2b\xfc\x54\x06\xb2\x57\x69\x6d\xe7\x4e\xe7\xd3\x15\xc8\xe9\x9c\xaa\x96\xbd\x83\x80\x06\xc6\xda\x2a\x42\x33\x31\x5a\x85\x6a\xcb\x8e\x80\xc3\x31\x68\xb3\x33\x55\x1d\x91\xd0\x74\x05\x57\x34\x13\x0b\xd7\xd1\x4c\x56\x81\x1e\xba\xbf\x7d\x5a\x25\x0e\x60\x72\x59\x3d\x9f\x2f\x8b\x97\xc1\x2a\x70\x3c\x2c\x47\x9c\xb0\xb1\x5b\x7a\x27\x75\xc9\xdc\xd2\xca\x46\x24\x67\x23\x68\xa2\xe6\x14\x54\x67\xf3\xbe\x66\x15\xf9\x3b\x81\x20\xa0\xa1\x2d\xa1\x56\x06\x63\xa2\x6a\x61\x73\x19\x66\xb4\x4b\x29\x9e\xbf\xad\x2a\x95\xc6\x23\x60\xf3\x9c\xe0\x5d\x95\x58\xe3\x05\xee\x23\xa5\x2f\xa5\xce\x20\xf6\xbe\x5e\x26\x2a\xff\x3a\x86\x4d\x5d\xda\xbe\x23\xff\x94\x3f\x71\xd5\x99\x84\x93\xd9\x9f\xe2\xac\x23\x74\xb4\x64\xa6\x91\x83\xc3\xbc\x4f\x1d\xdb\x88\x36\x11\x14\x9d\x7d\xdb\xf1\xe8\x38\x0b\x54\x43\x35\xe2\xb8\x93\x95\x05\x4c\x9f\x25\x58\xdf\xc5\x6e\xa9\x3f\xf1\x4d\x0f\x15\xd2\xe0\xbd\x89\x37\xa5\x56\x38\x7d\xe9\x6e\x41\x8d\x8b\x3a\x7d\x66\x6f\xb1\x90\x36\x4b\x2c\x21\x90\xd3\xc2\x5f\x17\x52\xd5\x48\x3d\xcb\xb5\x96\x00\x64\xf0\xc8\x7f\xcf\x8f\x31\x3d\x28\x78\x1c\x11\x4a\x16\x9b\x69\x0a\x87\x01\xc5\x0d\x89\xc7\x73\x24\x53\x1c\x0f\x84\x9d\xba\xd1\x63\x3d\x92\x5a\xcd\x06\xc1\x6a\x9c\xea\x19\xa4\x34\xeb\xc4\x2a\xeb\xb1\xfd\xb9\xb0\xba\xcc\x93\xce\xc3\x99\x19\x94\x36\x64\xea\x1a\x95\x84\x06\xff\x9e\x49\x35\xc9\x2c\xa7\xc3\x97\x08\xf9\xca\xb7\x10\xa5\x83\x09\x6b\x4e\xd9\xf4\x8d\x9e\x09\x06\x47\x24\x0d\x76\xec\xcb\xab\xa5\x91\xf5\x5f\xe7\xe3\x6d\x72\xc2\x17\x27\xac\xba\x0f\x80\x30\x95\x4e\x62\xbc\x58\x0b\x8b\x67\x0c\x44\x57\xc3\x40\x3e\x36\x9a\xc2\x0e\x66\x0d\x66\x2f\x7f\x6a\x41\x42\x13\xea\x43\xf7\xc0\x10\x50\x09\xc1\xde\x81\x7a\xdf\x6f\xfd\x9c\xca\x3b\x45\xa6\x3a\x82\x22\x81\xc6\xe2\x77\x2f\xd7\xb7\x80\x96\x03\x18\x4b\x48\x79\xb1\x8c\x88\x79\x03\xf0\xfc\x8d\x8e\x1e\x2d\xbf\x6e\x77\x2f\x0b\x2d\x9b\x8a\x29\x92\x7a\xcc\x81\x71\x4a\x22\x56\xad\x8d\x7b\x73\x30\x52\x7d\x7d\xbf\x8b\xef\xd8\x2f\x8c\x9b\xb4\x01\xcf\x0a\x90\x24\x9a\x64\xca\x6f\x88\x33\xdb\x31\xbd\x03\xb9\xe7\x94\x6d\x06\xdd\x04\x38\x3d\x7c\x08\x2d\x70\xae\xb3\x7f\xf8\x4c\x2b\x05\x7d\x97\x3b\x89\x4b\x4a\x03\xec\x7b\xf0\x31\xae\xa6\x56\xa1\x90\x84\x88\x89\x4a\x4a\xda\x3f\xd7\xfa\xdf\x91\xed\xe9\x55\x0d\x38\x41\x5f\x82\xa0\x94\x55\xc0\xf4\x32\xfb\x55\x98\x71\x32\xf0\x00\x42\xaf\xd6\x0e\xa5\x1d\x1f\x1c\x6c\x1a\xfe\x0c\xf8\x7c\x34\x6e\x31\xe6\x3e\x26\xf4\x9b\x13\x71\x77\xb2\xd4\x7a\xb3\x0f\x07\xce\xa0\x71\x93\x12\x74\xcf\x01\x08\x36\xd6\x83\xff\xf3\xbe\x71\x34\xc7\x8b\x8b\xfd\x8b\x1b\x8f\xc2\x04\x9e\x18\xcc\xb1\xe1\x8a\x0a\x95\x85\xa7\xd8\xa1\xe2\x54\x92\x60\x86\x68\xc9\x6d\x62\xa0\xac\xa8\xef\x90\xe0\x48\xd2\x03\x78\xc1\x08\xd0\x6b\x03\xfe\x3e\xc4\xad\xb2\x75\x28\xae\x08\xf7\xde\xd9\x48\x78\x93\xae\x64\xca\x4b\x93\x92\x02\xaa\x4c\x17\xaf\xe7\x18\xcd\xca\x49\xff\x96\x16\xd0\xcd\xf8\x33\x4b\x6a\xee\x2d\x6d\x20\x94\x7c\xa4\xbd\x7d\xf5\x31\xdd\x1d\xa9\x95\x81\xff\x72\xea\x56\xfe\x62\xca\xa2\xc9\x5e\x35\x87"}, +{{0xe1,0xc1,0x29,0x46,0xd2,0x21,0xa1,0x94,0xf2,0x2f,0x27,0x62,0xc0,0xe5,0x1c,0xbe,0x3f,0x98,0xb9,0x14,0xa4,0x7d,0x3d,0xc4,0x1a,0x1f,0x45,0xc5,0x43,0x70,0x63,0x7c,},{0x10,0x40,0x81,0x36,0xa6,0x8f,0xc5,0x6c,0x7d,0x3b,0x36,0xb7,0xfe,0xf1,0x22,0x09,0x4d,0xe0,0x81,0x03,0x11,0x89,0xcc,0x84,0xa4,0x88,0x06,0xaa,0xf6,0xcb,0x91,0x85,},{0x8f,0xd7,0xfa,0x40,0x0c,0x03,0x2f,0xcf,0xbc,0x40,0x29,0x42,0xfc,0x78,0x63,0x75,0x26,0xbe,0x97,0xab,0x82,0xf2,0x37,0xbb,0x39,0x3e,0xa3,0x9e,0x35,0x73,0x8c,0x67,0xd7,0x54,0x09,0x54,0x3a,0x8b,0x3c,0x05,0x5f,0x08,0xbf,0x69,0x19,0x9a,0xf6,0x3b,0x69,0x11,0xa4,0x82,0xfb,0x4f,0x65,0x80,0x80,0x2e,0xc9,0xd2,0xdc,0x3c,0x11,0x06,},"\x87\x0f\x4c\xd9\x7c\xfc\x0a\xaf\xad\xa4\x00\x72\x31\x2f\xb5\x4b\xcc\xc0\x76\x28\x71\x4e\x49\x62\xd4\xbe\xf4\xee\xb5\xde\x40\xa1\x9a\x24\x6b\x5b\x7d\x52\xd4\x87\xb7\xe5\x2d\x65\x6f\x2c\x64\x03\xb9\x16\xd0\x2e\x02\xa6\xd2\x91\xc1\xe1\x82\x8d\xd9\x45\xa5\x83\xb4\x38\x52\x8d\x1c\x39\x76\x5a\x57\x20\x31\xff\xa9\x16\xb6\x83\x21\xf3\x2e\x66\x46\xf0\xdc\xc1\xc6\x02\x35\xff\xaa\x32\x35\xf4\x84\xa5\xc4\x97\x8f\xa3\xe6\xbf\x14\x30\x1d\x53\xe1\x2f\x4c\xc5\x21\x18\xb1\xf6\xf0\x7f\x53\x36\xf5\xd0\xa9\x37\x89\xbb\x01\xd1\x62\xfb\x31\x26\xdc\xd7\x56\xe0\x64\x2e\x7e\x69\x89\x63\xc0\x34\x59\x11\xa5\xcf\x3c\x99\x53\xf7\x73\x19\x42\x6c\xea\x2c\xde\xda\x3e\xfe\x98\x9e\xcb\x63\xcb\x9e\xb8\xb9\x20\xde\x76\x6c\x4f\xcf\x63\x36\xe5\xbc\x43\x71\xa0\x68\x37\x1f\xed\x95\xc8\xc2\xb6\x1e\xe9\xb7\xc3\xe3\x83\x1c\x20\xbf\xfe\x87\x07\xc0\xc9\x8b\xe9\x61\x53\xc8\xa8\x73\xd7\xf2\x8a\xfc\xa1\xbf\x71\x08\x5c\xe0\xe3\x89\x9e\xef\x55\x91\xbd\xd6\x66\xdc\x2d\x07\x64\x17\x72\xd7\x45\xc5\x16\x44\xa2\x60\x81\x5b\x20\x8c\x4d\xd3\x05\xf0\x5f\xe4\x63\xd0\xd9\xd5\xa9\xee\xff\x97\x79\xf5\xb1\xd4\x4f\x26\x08\x30\x78\x56\x6d\x0e\x5f\xf5\x6b\x3a\xf0\xe6\x4c\xc3\x87\x08\xaf\x5a\x65\xf6\x54\x35\x2d\xf1\x04\x37\xf1\xdd\xf9\x45\xa0\xda\x1f\x4d\xef\x6a\x71\xa0\x60\xe0\xc4\xad\xec\xca\xac\xf8\x5e\x09\x0f\x70\x90\x37\x0a\xe2\x4e\x52\x38\xd7\x68\xa0\x8f\xe6\xb4\xbb\x5e\xc4\x97\xa6\x60\x31\x98\x60\x84\x15\xc7\xc6\x49\x00\x48\xaa\x36\x73\x7c\x08\x50\x30\x08\xae\xce\x0f\x49\x42\x19\xdd\xf8\x9b\x72\xea\x77\x17\x1c\x6d\x31\x17\x08\x9e\xb8\x89\x07\xe8\xc3\x3f\xb9\xe7\x0b\x0d\xc2\x81\xf6\x64\xb5\xf9\x65\xb5\xd2\xad\xb1\x25\x07\x10\xef\x23\x52\x02\x5f\xb2\x93\x39\x5a\xe1\xd2\x3e\xe3\xb5\x92\xb4\xc5\xf2\xd5\x55\x69\xa5\x45\x86\x54\xce\x3f\xc2\x5d\xd0\xe3\xf7\xe6\x75\x7a\xa7\xb3\x47\xc1\xff\xd3\xba\x4d\x4f\x2c\x4b\x6d\x36\xaf\xd5\x98\x63\xa3\x2a\x59\x4e\x74\x53\x7e\xce\x9b\x8b\x1e\xc2\x69\xbb\xc4\xcb\x54\xd7\x62\x38\x21\x1f\x62\xa9\x8a\x46\xa4\xaf\x66\x2f\xa8\x1e\xba\x6f\x30\xf5\x14\xb8\x66\xb7\x94\x2b\xc1\x73\xf7\x21\x1a\x6c\x01\x4d\xa1\x4e\x74\x13\x27\xa5\x68\x62\x3d\x14\xb8\xf8\x35\xef\x1d\x5d\x62\xb2\x52\x3c\xfe\x6a\x85\xbc\x69\xfa\x05\x20\x0d\xea\xc1\x56\x8b\x94\x6a\x81\x6b\x75\xc5\xd7\x60\x31\x74\xfd\x4e\x2f\x91\x01\xa7\x90\x63\x79\x1b\xc3\xd5\x92\x97\xcd\xc1\x0b\xda\xa6\x63\xab\xf3\xc1\xbe\x2f\xda\x17\xe4\xe5\xce\x39\x4e\x90\xbd\x76\xb1\xf9\xe0\x40\x5f\x56\x75\xb9\x9d\x63\x8a\xbc\x2c\x1b\x2d\x8b\x53\xa6\xfd\x3d\xc8\x37\x58\x55\xec\x54\xcc\xbd\xa2\x4e\x67\x25\x27\x72\x3b\x07\xbb\x59\x9d\xb5\x4e\x38\x79\x33\x91\xcf\x09\xef\x3b\x1f\xd7\x61\x49\x90\x06\x5b\xbd\x4a\x19\xe8\xd3\xd1\x04\x82\x53\xba\x4c\x97\x1c\x2f\x98\xd2\xb3\x59\xdf\x50\x90\x87\x32\x3a\xa6\x90\x50\x29\xf5\xcc\x5e\x1a\x0a\xaf\x2f\x7c\x01\x08\xdd\xb1\xa4\x0f\x56\x2b\xe6\x4e\x57\xe6\x95\xed\x21\xdc\x7d\xb1\x7d\x53\x36\x77\xef\x12\xfc\xbb\xe2\x9f\x3b\x23\x7b\xb6\x34\x4b\x11\x09\xb3\x2a\x94\x62\xab\xc3\xad\x3c\x07\x10\xb0\x4f\x38\xc6\xf5\x95\x2d\xb2\x75\xe7\x7e\x2f\x37\xe9\x5d\x55\x09\x6b\xba\xf3\xe3\x05\xd5\xd7\x43\xd3\x65\x95\xbf\x05\x67\x89\x2c\x21\x0a\xc7\xba\xe7\x37\x1d\x16\x45\x84\x78\x5d\xd8\x90\x17\x41\x59\xb3\x93\x0a\x9a\x6c\xe3\xa1\x66\xdd\xa2\x38\x3e\x6e\x2a\xf2\x8c\x1b\xf3\x19\x24\x47\xe9\x05\x11\xdc\xd8\x0e\xbd\xf9\xee\x2c\x9b\xde\xdd\xee\xb6\x10\x55\x86\x41\x53\x2d\x07\xcd\x13\xda\x61\x25\x41\x54\xcc\x0f\xd9\xd4\x81\xe3\xb0\xa2\x37\xaf\x2e\xc2\x62\x56\xd4\xab\x21\x9f\xaf\x15\xad\x2b\x7e\x8e\x57\xab\x72\x6f\xf2\x72\x32\x16\xa5\x74\x58\x5e\x2a\x63\x9d\x94\x8c\x2c\x4f\x69\xee\xaa\xd2\x83\xe3\xa4\x4f\xf2\x68\xea\xef\xd7\xe6\x6b\x73\xed\xe4\x73\xa8\x39\x7c\x76\xb4\x8d\x56\xcb\x3c\xcd\xab\xc9\x1a\x89\x29\xcf\x42\x99\x83\x50\xe0"}, +{{0x76,0x2f,0x06,0xca,0x01,0xe3,0x14,0x71,0x5f,0x92,0xc9,0x0b,0xbe,0x72,0xa2,0x5b,0xf2,0x62,0x12,0xc8,0x1e,0xb1,0xd1,0xa0,0xda,0xe2,0xc3,0x11,0x30,0xf7,0xcd,0xbb,},{0xf9,0x62,0x6f,0xfd,0x69,0x27,0x31,0x92,0x5e,0x5a,0xac,0xfa,0x1b,0xde,0xd0,0x1a,0xa8,0xf7,0x30,0xb7,0x72,0xd5,0xe4,0x6a,0xdb,0xc3,0x15,0x56,0x5b,0x9b,0xf2,0xc9,},{0xe8,0x42,0xb4,0x9e,0x53,0x3d,0xbc,0x92,0x99,0x8d,0xc0,0x78,0xe5,0x97,0x93,0xa2,0xc2,0xfa,0x63,0x6b,0xdf,0xaf,0xdb,0x48,0x93,0x4c,0x93,0xcf,0x34,0x79,0x71,0x02,0x93,0x8d,0x13,0x7a,0xb7,0xea,0xd1,0xa0,0xf7,0x0e,0x94,0xa6,0x7d,0x57,0xef,0x6a,0x02,0xc9,0xec,0x77,0xd7,0x1f,0x70,0xcc,0x57,0xf1,0x53,0x3b,0xec,0x87,0x73,0x0e,},"\x94\x97\x48\x3a\x4f\xba\x78\x43\x3b\x38\xe9\xde\xb8\x91\x5c\x75\x0b\x6d\xa0\xf7\x8a\xf4\xa6\x8b\x62\xf9\xfc\x03\x91\xe3\x38\x87\x3b\x1d\x64\xb1\xb7\xf0\x9f\x12\xf0\x56\xa3\xc9\x16\x53\x49\x8a\xd5\x6e\x06\x9b\x8b\x16\x08\x87\xe8\xe3\x78\xa7\x6d\x8b\x3c\x66\x70\x83\xc0\xa2\xb2\xd2\x31\x7d\x3b\x87\x48\x57\xe5\x78\x62\xef\x0c\xb7\x04\x36\xa9\x02\x8f\x01\x91\xcc\xc6\x16\xe9\xd7\xc9\xbd\x86\x98\x08\xcf\x09\x48\x35\xff\x51\x86\x77\xb3\xfb\x08\x9f\x4c\x9d\x07\x7c\xc7\x74\x24\x05\xb4\x86\x3a\xc7\xa5\x96\x45\xc9\xcf\x54\x0d\x57\x39\x9d\xa6\xae\x9d\x07\xfd\x19\xfc\xa9\x5b\xc8\xa8\x6d\x8b\x8e\x24\xe4\x87\x33\xf3\x21\x58\xfd\x19\xa8\xa1\x11\x1d\x1d\xa1\xf9\xb5\x80\xa3\x9c\x10\x48\x46\x16\xcf\x2b\xc0\xec\x29\xf6\x3f\x77\xc8\x53\x56\x15\x8e\x16\xda\x59\x4b\x5a\x89\x0e\x55\xd0\xb6\x45\x99\xb3\x02\x93\xe9\x00\xed\x92\xad\x26\x19\x69\xe7\xdf\x4c\x4b\x1d\x0b\x60\x24\xbd\xce\xb6\x90\x67\xef\x48\x6c\x20\xfd\xcd\x22\xa1\x0d\x5d\xa4\x5f\xbf\x90\x5b\xa1\xe9\x35\xc9\x6f\x50\xaf\xb6\x35\x71\xbc\xff\x31\x30\x68\x4e\xda\x0b\x56\xe6\x0b\x26\xcf\x4c\x0e\xf9\x93\x8a\x92\x76\x8f\xc8\x63\x1f\xe3\x08\x23\x6b\x01\x2f\x92\xaf\x24\xa8\xf6\xe6\xec\xbe\x76\x62\x9b\xba\xf8\xff\xe5\x4c\xdb\xe8\x67\x1d\xe2\xba\x62\x4a\x7c\x0f\x61\x93\xbb\xa4\x11\x04\x12\x90\x2b\xac\x29\x90\x92\x2a\x9e\x5a\x81\x05\x3c\xf8\x76\xa4\xc8\x05\xa0\x4c\x56\xa8\x13\x9d\x34\x19\xe4\x54\xa6\x22\xd0\x34\x2b\xf4\x26\xe9\x80\x2c\x3d\xc1\xb4\x08\x0c\x75\x49\x2a\xfe\x9d\x7b\x15\x45\xfe\x08\x6d\x96\x35\x41\x32\x4f\xf5\x2a\x48\xc6\xbf\xae\xa2\x66\x68\xb3\xe0\x1e\x52\x36\xfd\x45\xfe\x54\x59\x45\x35\xc0\xb2\x3e\x28\x7e\xbd\x14\x28\xc8\xbe\x0a\xd1\x41\x60\x0e\x91\xcb\x51\xe1\xea\x66\x27\x1a\x64\x21\xfb\x68\x9e\x88\xa0\x79\x0a\x65\x1d\xbd\x21\xee\x20\x89\xb2\x74\x66\x6f\x66\x0c\xa0\x9c\xe2\xd6\x0e\x39\xe2\xee\x5f\x03\xb6\xeb\x82\xd1\x99\x76\x96\x6e\x79\x90\x0a\x81\x0f\x6d\x5b\x5c\x1a\x54\x8e\x50\x64\xf5\xc3\xd8\xa9\xf2\xde\xf0\x17\x9d\xf9\x9d\x14\x3f\xde\x69\xb0\x71\x2c\x09\x1c\x29\xe9\xb2\x5f\x40\xca\xfd\x57\xa0\x24\x65\x8d\x77\x74\x03\x76\x10\x34\x2f\x38\x00\xfd\x51\xf4\x9e\x79\xa5\xb3\xde\xcc\x11\x2f\x58\xd0\x3e\x3d\x29\x58\x75\x85\x88\xbc\x4b\x1c\x6a\x6c\xda\x7b\xc5\xf5\xbe\x18\x3e\x41\x51\x3c\x1f\x23\x0f\x3c\xc3\x64\x30\x4b\xf8\x24\x84\xb7\xcf\x19\xa0\x02\xe1\x50\xf9\x8c\x5e\x97\xc6\x16\x6e\xa1\x5b\x86\x34\x0b\x8c\x5e\xbe\x5c\x1a\x18\x3e\x55\x88\xe6\x6f\x55\x90\x50\x86\x31\x3f\x37\xa4\x09\xe8\x9b\x47\xdb\x31\xae\x97\x45\x3e\xdf\x69\xfe\xd7\xbe\x08\x11\x30\x71\xf3\x74\xb2\x6e\xc6\x04\x3f\x2a\x0e\x9c\xf8\xba\xd8\x02\xab\xad\x69\xe6\x17\xe7\x62\x43\xb3\xcc\x03\x4b\x09\x9d\x87\x29\xee\x40\x7a\x53\xeb\x03\xbd\xc6\x41\x0a\x03\x95\x04\xb3\xb1\x2c\x81\x9b\x64\x54\x5d\x40\x5c\x6a\x4f\x08\x49\x21\x93\x5b\xdf\xf4\x13\x0a\xe6\x29\xd9\x09\x62\x6b\x06\x26\x76\xe5\x38\xea\xfd\xff\xb1\xd6\x22\x9c\x08\x89\xd3\xcd\xdd\x33\x65\xdc\x3d\x65\x36\xf7\x24\x8c\x49\x31\x7c\xb5\x0c\x56\xfb\x57\x85\x55\x41\xd6\xfe\xeb\xac\x81\x6c\x99\x28\xfa\x66\x2d\x0a\xe8\x0a\x0f\x39\xe5\x70\xbb\x7d\x22\x41\x6f\x98\xf3\x71\xb6\x42\x47\x96\x89\x51\xa8\xa2\x46\xf7\x4b\x30\x61\x74\x3c\x9a\xf7\x68\x4b\xbb\x96\x6a\xe0\xbd\x78\xa8\x10\x49\x3e\xa4\xcc\xd7\x11\x74\x87\x1c\x82\xbb\x65\x2b\x27\x48\xe5\xbc\xcb\x0a\xb6\x38\x8a\x50\xf0\x53\xa0\x48\x08\x7f\xd9\x7e\xb1\x5c\x1a\x21\xb1\xee\x18\x25\xe5\x4a\xa1\x30\xd6\x63\x18\xaa\xf6\x61\xbb\xb2\x47\x63\x57\x7e\xb3\x7d\x31\x0e\x21\x9b\x0a\x9b\xba\x03\x75\xeb\x9c\x9b\x4a\xf8\xc4\xb9\x9a\x36\x99\xe0\xd3\x26\x67\x33\xb6\xe4\xe9\xc5\x34\x49\x0a\x13\x41\xcb\x19\x90\xca\x5b\x1c\x84\x7b\xc8\x12\x60\x26\xfe\xa9\x03\xa1\xf5\x49\xd6\x5a\xf8\xfe\x02\xa9\x16\x3f\xf8\xea\x28\x1e\x72\x26\x24\x3e\x2a\x15\x3b\x92\x18\x51\xde\x10\xf7"}, +{{0xc5,0xcc,0x0b,0x95,0x81,0x8c,0x4b,0xf3,0x8d,0xa1,0xd6,0x5f,0x02,0x16,0x27,0xe9,0xe5,0x7d,0x26,0x2b,0x02,0xec,0x6d,0x91,0x7a,0x7d,0x46,0xb1,0x1c,0x7f,0xe4,0x8a,},{0x45,0x7d,0xa4,0xef,0x14,0x51,0x9d,0x54,0x1e,0xdf,0x92,0xca,0xbe,0xd9,0xb0,0x4d,0x8a,0x2f,0x2a,0xfd,0x15,0x10,0xa9,0x2f,0x00,0x9b,0xb4,0xe8,0x75,0x4f,0x1e,0xba,},{0x3b,0xa0,0xaf,0x8a,0xf1,0x27,0xc4,0x58,0x48,0x26,0x09,0x0e,0xcd,0xaf,0x48,0x5e,0xbd,0xf0,0x7b,0x82,0xbc,0x49,0x9c,0x9a,0x2b,0xef,0xca,0x28,0xd4,0x93,0x44,0x97,0x4a,0xdd,0xbc,0x8d,0x80,0xa5,0x25,0x60,0xe0,0xf3,0xd7,0x3f,0xf5,0xcc,0xcc,0x72,0xc7,0x4b,0x5b,0x47,0xad,0x2e,0x6d,0xe9,0x61,0x2d,0x1a,0x00,0xae,0xc9,0x27,0x01,},"\xd6\x60\x8b\xf5\xac\x00\x0e\xca\xf9\x5f\xc0\x9f\x9c\xb7\x49\x8c\x51\x8a\x6e\x02\x55\x58\x6e\x63\x37\x85\x3b\x1d\x7d\x9d\x7d\xe4\xdf\xe1\x24\x5d\x59\x03\x1a\x31\x7d\x4e\x2b\x6a\x73\xc4\xc3\xf9\x5b\x58\x2e\x72\xa6\x42\x02\x21\x58\x7b\xac\x12\x0f\xb8\xed\x73\x48\x07\x0f\x28\x60\xd8\x58\x66\xa0\x9f\xe7\x56\x74\x34\x97\xf2\x11\x9b\xc1\xbf\xdf\x57\x3b\xe3\x5d\x10\x91\xbe\x37\xf1\x8b\xcd\xa6\x74\x1c\x90\xd5\x66\xcc\x92\x4b\x72\x16\x4b\x74\x9a\xf9\xa6\xf4\x0f\x71\xd3\xea\x5d\x87\x64\xcd\xc8\x17\x14\xbd\x73\x95\xe5\xf6\x79\x97\x36\x36\xef\xf1\xdb\x1c\xf0\x01\x29\x83\xf7\x1a\x2f\x2b\x12\xd4\x5a\x29\x4e\x5a\x38\x9f\x4c\xd2\x48\x3e\xb3\x9d\xa0\xdf\x26\xb7\x36\xc7\xaf\x6e\x41\xdd\x35\xa7\x8e\x45\x29\x2c\x39\x4e\x34\x68\x95\x32\x88\x87\x21\xf8\x63\xc5\x6d\xb9\x7d\xa1\xcd\x10\xa6\x6a\x20\xa6\x70\xb2\x7f\xe8\xce\x55\x68\xa4\x2b\x89\x37\x79\x0c\x7b\xe1\xaa\x42\x0d\x20\x3d\x7a\x88\x5c\x17\x29\xcd\x6b\x8e\x19\x71\x89\xe4\x79\xd5\x42\xcb\xcb\x9b\x53\x65\x6f\x2b\x9f\x53\x9c\x32\x5c\x34\xaa\x59\x8f\xd9\x1e\x7d\xf7\x0f\x9a\x74\xab\xec\x46\x76\x54\xb1\xc9\xa3\xd1\x44\x38\xe7\xc0\x83\x60\x40\xb7\x93\x87\x1e\xcb\xe9\xe5\xf6\x68\x0c\xcc\xcd\x5d\x46\x96\xa8\x7e\x37\xe8\x9e\xab\x28\xb6\xbd\x67\x9e\x8f\xe1\x62\x7b\xdc\x9d\x37\x3b\x82\xf5\x2c\xd8\xc4\x9b\xe9\xba\xcd\xc6\x30\xa3\x2f\xd1\x28\x35\x25\x5a\x54\x2f\xb7\xb1\x23\x93\x77\x9d\x44\x98\xaa\x06\xa0\xe7\xe1\xa4\x97\x79\x39\x81\x7e\xb2\x08\x8a\xf1\xe1\x9b\xb0\xe5\xac\xa8\x54\xc1\x25\xdc\x60\x3d\x83\x57\x36\xa0\x3d\x93\x80\x51\x53\x0c\x9a\xb1\xaa\x3b\xc7\x79\xb3\xba\xe7\x45\x0e\xf5\x7d\x1b\x3f\xc0\x93\xa3\x7d\xbe\x9d\x1b\xd6\xd0\x40\xf2\xf8\xee\xba\x77\xf7\xfa\x88\xc1\x49\xf0\x65\xc7\xac\xe3\x32\x77\xaa\x99\x69\xc2\x66\xea\x6d\x85\xca\xd6\x2c\xfa\xf5\x50\x8e\x70\x32\x71\x6b\xe6\x84\xa2\x28\x56\x41\x3e\x0e\x65\xe4\x2b\x6e\x9e\x6d\x86\x5a\x87\x36\x3c\xbb\x62\xd5\xbb\xb6\xa3\x73\x1d\xdd\xa0\xfa\x6a\xd0\x29\x3a\xf9\x89\x3c\x09\xa9\xe7\x43\x09\x0f\x2c\xee\x2f\x44\x37\x73\x6d\xd4\x33\xe2\xac\x74\x28\xbd\xc8\xc7\x7c\xb9\x96\x43\x55\xfa\x44\x15\xcc\x38\x31\xd8\xc7\xca\x5a\xf9\x3d\x51\x75\x2e\x71\x8c\x60\x66\xec\xa1\x42\x6a\x87\xc2\x98\x08\x28\x1a\x85\xac\x7e\x0b\x40\x44\xff\x6e\x28\x0e\x28\x01\x4b\x93\x83\xd1\x9c\x9d\x38\x7d\x29\xdc\x14\xde\x43\x3d\xa2\x60\x78\x4a\x49\x44\xca\x76\xc2\xfe\x8a\x08\x0d\x09\x96\xd9\xa6\xc2\xa3\xd3\xa7\x07\x72\x80\xed\xce\xe0\x38\x9a\xa8\xe5\x36\x5d\x1d\x9b\x34\x6e\xca\x09\x47\xb0\xff\x52\x65\x94\x3c\xcf\x09\x93\x9a\x4b\x4a\x8f\x98\x5f\x6a\x5e\x72\x72\x3c\x79\x5d\xa0\xbc\x36\x0d\xce\x50\x1f\x67\x3a\xb6\xea\x84\x43\xf1\x29\x42\x79\x52\x45\x3e\xb7\x2b\x3a\x8d\x0d\x97\x6c\x27\x8c\x5b\xd1\xa9\x85\x3c\x91\x8e\x0c\x24\x0c\x3c\x73\x49\x32\x95\x3f\xdb\x50\x39\xfb\xb0\x46\x87\x93\x7c\x9f\xf0\xab\x74\xa1\x6e\xae\x21\x2b\xc6\xf2\x0e\x70\x0a\x77\xc0\x92\xd2\x3d\x2e\xfb\x58\x0e\x0c\x19\xd6\x5f\x30\x41\x29\xab\x8e\x6c\xc1\x2e\x58\x05\x22\x57\xba\x09\x44\x9f\x30\xd3\xd9\x74\x39\x1a\xff\xf5\x63\x3d\xef\x2f\x5c\x4e\xbd\x57\x3a\x9e\x44\x4b\xf3\xa3\xdd\xac\xed\xf0\x2c\x05\xf3\xcc\x2e\x75\x06\x64\xa8\x4a\x1d\x24\xc5\xd2\x8b\x49\x67\x0d\xe8\xa2\xf2\x09\x08\x39\x48\x3c\xa3\x89\x59\x99\x1a\x7d\x37\x27\xe2\x1a\x15\xe8\x20\x16\xc1\x5a\x09\xee\x71\xf4\xf4\x3c\x0a\x60\x8b\x48\x48\x5c\x99\x34\xa3\x86\x14\x79\x4d\x62\x91\xda\xa3\x9c\x01\xc4\x5d\x3d\xeb\xe5\x79\xb5\x82\x3b\xf3\x40\x64\x04\xb4\xc8\x0e\xe6\xff\x34\x2b\x46\xb3\x34\xb0\xb8\x83\xb4\x0b\xfd\x2f\x9a\x53\x59\x5a\xb6\x2f\xd1\x35\x1e\xbc\x88\x30\x83\x70\x49\x72\x18\xdf\xc9\x8c\xe0\x81\x40\x7d\xa8\x12\xa4\x6d\x64\x97\xd7\xaf\x9e\xc6\xd8\x3e\x1c\x60\xee\xb7\x12\xd8\x89\xdf\xbe\xd0\xc8\x05\xaa\x11\xcf\x81\x7d\xd8\xf0\x43\x96\xef\x87\x1a\x26\x11\x2d\xcb\x7c\x0e\x1d\x2e\x68"}, +{{0x61,0xfa,0x86,0x77,0xee,0xda,0xde,0xd6,0x9b,0x16,0x5c,0x8d,0x27,0x7c,0x97,0x82,0x49,0x66,0x30,0x28,0x30,0x1d,0xf6,0x16,0x3e,0x39,0xb0,0x6a,0xc2,0xf5,0x62,0x5f,},{0x87,0x33,0x9e,0xb5,0x72,0x38,0xdb,0x2e,0x4e,0x60,0xf3,0xc2,0x8a,0x3f,0xd5,0xfb,0x61,0x1c,0x65,0xfd,0xdc,0x81,0xee,0xd7,0xcf,0x77,0x71,0xdf,0x34,0xd9,0x22,0x67,},{0xc0,0x4e,0xbd,0x11,0xc3,0xeb,0x09,0x39,0x6f,0xe8,0xd6,0x82,0x79,0x51,0x0a,0x9e,0xfe,0xe3,0x91,0xab,0xee,0x40,0x81,0xf0,0xd2,0x75,0x67,0x4a,0x30,0x47,0x94,0x83,0x5a,0xad,0x7f,0x3e,0x34,0x5b,0xcf,0x0a,0xf8,0x02,0x7f,0x97,0x47,0x7e,0x79,0xe6,0x79,0x2b,0x8f,0x29,0x98,0x46,0xae,0x28,0xcb,0x13,0xbd,0x88,0x75,0x37,0x99,0x0d,},"\x02\xc5\x81\xde\xe0\x3f\x2c\x60\x39\x35\xaf\x5e\xce\xec\xfa\x67\x71\x34\xa3\xe0\xae\xa5\x4f\xec\xaf\x42\x71\xfb\x52\x95\x1a\x27\xb7\x68\x77\xcc\xd4\x9a\xb4\x86\xdf\xc2\x27\xcf\x31\xc9\xd9\x57\xcc\x97\x30\x65\x73\xfc\x7f\xe1\xd3\x1b\x6c\x7d\xf3\xd7\x80\xf3\xa0\x5c\xa6\x39\x56\x57\xa9\x42\x43\x42\xc9\xc6\xb7\x03\x12\x7e\x03\x8d\xf0\x79\x21\x54\xe3\x0a\x49\x47\x61\x12\xcb\x92\xd0\xd5\xa2\xd2\x2e\x89\x57\x52\xa8\x6e\xdd\xdd\x91\x2f\xdc\x81\xb1\xe6\x4a\x7b\xb7\x50\xf0\x99\x18\x21\x32\xee\x48\x23\xfd\xe8\x45\x80\x2a\x94\x45\x39\xd4\x12\xb2\xa8\x1a\x15\xb0\x00\x71\xa9\x50\x50\x4c\x5b\x55\xa7\x1b\xdb\x8c\x5a\x58\x26\x39\xe8\x55\xe8\xbe\x24\x1c\xda\x1b\xa6\xb3\xb4\xf6\x45\x54\xd1\x78\x24\x90\x4c\xb3\x0c\xd7\xef\xd9\xac\x04\x9e\x39\x0b\xb7\x9f\x53\x59\x8e\xf1\xe8\xfc\x27\xdd\x7b\xf5\x99\xc9\x02\x8c\x9e\xbf\x92\xfc\x3b\xe1\x1d\xf3\x29\x61\x2a\x22\x8e\x0f\x56\x84\x68\x7b\xf4\x1f\xf2\x03\xe9\x7a\x76\x86\x12\x6a\x39\x36\x6b\xdc\x26\xd5\x0b\xe0\x25\xd5\x18\x7c\x6b\xa0\x66\x6e\x37\x9b\xe4\xa8\x0a\x9e\x62\xef\xfc\xd9\x16\xd7\xf9\x8d\xe6\x51\xe0\x0b\x97\xad\xf5\xd2\xd5\x3d\xaa\x7f\x8d\x69\x5a\x29\x15\x60\x75\x5c\x74\x44\x82\x36\x4c\x4f\x1f\xa4\x7e\xc0\xb1\xda\x16\x1a\xa3\x88\xf9\x59\x79\x89\xa9\x77\x26\xd3\xed\x2c\xec\x82\xf1\xa1\xbb\xc4\xac\x0b\xe0\xa0\x0c\xb4\xa8\xdb\x1f\xb7\xc1\x4b\xa0\x5d\x89\x63\x48\xdc\x05\x59\xd2\xa9\x0b\xea\xc2\x04\x1d\xd7\x7f\x82\xd6\xb1\x2a\xeb\x22\x43\xca\x0f\x41\x9a\x57\xd3\xca\x9c\x7d\x25\xa3\x0f\xf0\xe8\xbb\x0d\x94\x51\x55\xd1\xb3\x6a\xd1\x07\xb5\x5b\xea\xa9\x5b\x7d\x5e\x32\x00\x34\x07\x62\x9f\x15\x15\xf8\xa7\x08\x9e\x24\x88\xd0\xd7\x54\x4c\x2f\x7c\xc7\xc7\xf0\x98\x5d\xa4\x28\x40\xd4\x36\x8f\xf4\xf0\xfa\x4f\xa2\x98\xe3\xb7\x22\x93\x03\xab\xa5\x14\xae\x94\xe7\x02\x65\x35\xa3\xf4\x26\xff\xbb\x4e\x00\x1c\xd5\x0e\xd1\x2f\x21\x4b\x3a\xbe\xf9\x6e\x30\x16\x35\xc9\x87\xb1\x33\xfc\x5e\x61\x84\xe7\xb7\x57\x2b\xc3\xd9\x9a\x45\x23\xcb\xd5\xaf\xe5\x93\xce\xdf\x4c\x9c\xd0\x2f\xf2\xe3\x62\x37\xe4\xee\x12\xef\x1a\x22\xd1\x6d\x7c\xf4\xc0\x72\xdc\xed\x91\xcd\xd2\x6e\xe1\x44\xcc\x2b\xef\x49\x50\x02\x63\x49\xe9\x44\x47\x84\x08\x1f\xe4\xe0\x49\x8b\xc7\x5f\x72\xe6\x81\x8f\x45\x9b\xba\x90\x49\xc5\x61\x31\x6c\x9f\x49\x8e\x7b\x1a\x99\x4b\x0e\x93\x05\x5f\xe7\x3e\x44\x4c\xbd\xf9\x6a\xc3\x5e\x9c\x4e\x92\xe6\xb4\x9e\x3b\xc0\xe9\x9d\xe1\x71\x6d\xf8\xea\xca\xeb\x8d\x2f\xd7\x48\x70\x04\x4c\xb3\x9c\x0e\x36\x7a\x1f\xe3\x2a\x9b\xb2\x97\x44\x16\x36\x4e\x73\x0d\x52\x48\xdf\xb1\xdf\x16\x4a\x8d\x58\xca\xa1\x00\x5f\xdc\x91\xba\xc2\xbc\x01\xcc\x77\xde\xcc\x14\x89\x3e\xf9\x46\xfb\x3c\x81\xbe\x08\x32\xc7\x2f\xba\x37\x20\x62\xf8\x36\x0f\x4d\x8e\x6d\x5b\x74\x1c\xf7\x03\x2d\x8d\x89\xde\x2e\xdf\x4c\x71\x4a\x29\xf7\x5a\xbd\x8f\x5f\xf4\x3e\xcd\xd4\xb7\xa0\x4d\x7d\xb0\x88\x2d\x16\xe7\x44\x73\xa0\xfb\x79\xdb\x44\x4a\x78\xea\x44\xaa\x26\x31\xb8\xc0\xd7\xb0\x30\x0d\x55\xcb\x6a\xc4\x85\xf2\x4c\x0a\xcc\x64\x77\x47\xc4\x3d\xb3\xb2\xa8\x67\x7b\xaf\x65\x6f\xa7\x35\xa5\x75\xf1\x81\x3f\x36\x68\xa2\xac\xa9\x17\x57\x11\xb5\x25\xeb\x49\x6e\x9e\xf9\x71\x1d\x75\xf5\x90\xc7\xd9\xef\x99\xe0\xf5\x9e\x84\x83\xcb\xf9\xf2\x84\xe3\xf5\xa3\x3e\xe7\x78\x1e\x62\xb8\xb0\x55\x51\x77\x7e\xfe\x0f\xbf\xd1\x9e\x54\xb6\xbb\xd1\x42\x94\x4b\xc2\x95\x9a\x82\xeb\xd2\x95\xd2\x3d\x34\x43\xb6\xce\x65\x8c\x2d\x57\x9a\x76\x37\xb5\x49\x52\x04\x91\x90\x8e\x34\x28\x2e\xc2\x71\x69\x72\xe6\xf0\x35\x39\x29\x54\x7e\xf1\x53\x7a\xec\xc9\x6b\x2d\xf6\x16\x14\x85\x99\xb0\x9d\x9b\x81\x39\x4a\x13\xfe\x7d\xb8\x67\x60\xb1\xe2\xa0\x60\xef\xd4\x84\xe8\x18\x99\x39\xeb\xdf\x6f\x21\x64\x0d\x89\xd8\xe7\x36\xde\xe0\x82\xad\x72\xa0\x18\x4a\xde\xdd\x8d\xf2\x14\x74\xc9\xf5\x26\xbc\xfd\xf7\xe8\x56\x58\x19\x4b\xb6\xd9\x42\xe7\xf3\xfe\x96\xc2\x3f"}, +{{0x70,0x48,0xc6,0x52,0x1a,0xef,0xaf,0xa4,0xea,0xc6,0xd6,0xc3,0xa7,0x02,0xb9,0x52,0x54,0x80,0xa6,0x64,0x82,0xe4,0x96,0x98,0x96,0x75,0x7f,0x2c,0xd1,0xac,0x7d,0x5b,},{0xed,0x93,0x11,0x3c,0x16,0x43,0xa5,0x3a,0xa0,0x64,0xca,0xa6,0x31,0xce,0xb6,0xe2,0x0f,0x6d,0x6e,0xc2,0xfc,0x6c,0x07,0x11,0xcb,0x8a,0x1f,0xe7,0x31,0x39,0xaf,0x93,},{0x7c,0x45,0x70,0x3e,0xd3,0x94,0x2e,0x44,0x04,0x1c,0x7f,0xa1,0x85,0x8a,0xa5,0xf1,0xdc,0x38,0x1f,0x49,0x3a,0x45,0x2d,0xfb,0x52,0x70,0x80,0x17,0x89,0x8f,0x71,0x0e,0x31,0x11,0x8e,0x33,0x1f,0x00,0xaa,0x64,0xcb,0x73,0x88,0x36,0x68,0x2b,0x7d,0x17,0x7e,0x97,0x95,0x5c,0x00,0x31,0x9a,0xbd,0x79,0xa4,0x9e,0x0f,0xcd,0x16,0xfe,0x00,},"\x53\xf7\x4c\x72\x4d\xb1\x57\x8a\x1a\x29\x6a\x7c\xca\xc9\x04\xa2\x50\x4d\xd9\x00\x53\x89\xb4\xf8\xd4\xea\x4b\x63\x07\x29\x8f\xc6\xdc\xce\x98\xa6\xbc\x07\x28\x0d\x20\x36\x4e\x40\x5a\x46\x7e\x73\x65\x78\x96\x52\x69\xc8\x14\x61\xd6\x1f\xc6\xb7\xe4\xba\xd6\x8d\x2b\x6d\xd0\x00\x58\x50\x10\x5f\x0a\x67\xbb\xc6\xee\x22\x3e\xc1\x75\x4a\xf4\xe3\xb9\xaf\xa5\x06\x2d\x1c\x18\x61\x04\x8f\x18\x5b\x12\x8f\x1a\x5c\x0f\xb2\x5c\x39\x19\xb4\x83\x3e\x29\xe2\x02\xbc\x94\x1a\x90\x5e\x63\xc2\xc0\x5b\x10\x14\x64\x7b\xd7\xed\xe5\xbe\x9f\x99\x66\x15\x18\x7a\x3d\x3b\xb2\xc7\xdc\x4c\x28\xf7\x05\x3d\xef\x9b\x28\xb2\x9e\x23\x31\xf1\x62\x96\xdc\xe8\xf1\xed\xe4\x84\xca\xec\x99\x67\x02\xbd\x99\x02\xe5\x26\x84\xc8\x12\xc8\x74\x40\xf6\x9b\xd1\x41\xc7\xe0\x0c\x69\x47\xd1\xfc\x7c\x3b\xdc\x0b\xc5\x50\x6b\x6e\xa4\x62\xe6\x5f\x9e\x74\x3b\x72\xc0\x07\xdd\xc7\xa3\x77\x49\x37\x77\xd4\xeb\x12\x62\x0c\xa6\xc0\x19\xc8\xbf\xc4\xc2\x9e\xc8\xaf\x38\x2f\xc3\xea\xc8\x41\x02\x1a\x74\xe4\x67\x4b\xa3\xe4\x3e\x5d\x7b\x41\xe3\xfe\xeb\x17\xda\x00\xa7\xce\x45\x5a\x1c\xec\x70\xb0\xbe\x6e\x56\xf8\x5f\xc3\x7f\x64\xcf\x07\x33\xb7\xe3\x12\x41\xde\x64\x1a\x8a\x8e\x5b\x91\x89\x7b\xc1\x58\xfe\x93\xd1\x02\xc0\x1d\x1f\x5e\x16\x6d\x40\x81\x65\xfe\x3f\xcb\x13\xd5\x30\x45\x90\xab\x8e\xf0\xdc\x8d\x5a\x8c\x1d\x8a\x93\xfc\xeb\x85\x4f\xc1\xfa\x36\xd0\xcc\x48\x0c\xf8\x51\x2d\x80\xbe\xe6\x9b\x06\x50\xa9\x57\xda\xed\x28\x3c\xd7\x63\x81\x55\xed\x77\x30\x86\xe8\x6a\x8f\xfb\x19\x8a\xcc\x74\x23\xb5\xd1\xa6\x09\xa1\x75\xa5\x6b\x94\xc9\x6b\x73\x18\x51\xb9\x3a\x94\x97\x71\x01\xe2\x55\xf1\xce\x92\xe2\x32\xa0\x5e\x2e\x33\x87\xfc\xb4\xdc\x13\xa3\x1b\xee\x6e\xe2\x55\x07\x32\x2c\x73\xc9\x88\x30\x80\xa7\x4c\x00\xf8\x03\xa9\x98\xdd\x53\x0a\x79\x12\x6b\xb1\x44\xed\x55\x74\xc4\xb2\x31\x80\xe3\x4e\x09\x92\x83\xb4\xbb\x1d\x28\x82\x2f\xce\x37\x17\x04\x6f\xf3\x2e\xf9\xe2\xcd\xf9\x67\xe3\x18\xea\x72\x6a\x2a\xee\xc5\x78\x06\x64\x3a\xd4\x80\x1d\x3e\x0d\xa5\x2a\x1d\x77\xbf\x04\x3f\x5a\xe9\xf3\xae\xa9\xe4\xbc\x4f\xa7\x95\xd0\x84\x01\x08\x5c\xa9\x4c\xfc\x4c\xe7\x19\xda\xbc\x7b\x23\x90\xd0\x3d\x29\x4a\x65\xb7\xaf\x9b\xc3\x90\x72\x28\x5b\x77\x7b\x2f\x13\x3d\xc1\x1a\x70\xc0\xa9\xf0\x60\xe1\x04\x41\xf4\x02\x16\xac\xb6\x41\x63\x7a\x2e\xad\xf1\xf7\xb8\xd2\x62\xfe\xc1\xb4\xd0\xf0\xf4\xfa\xa9\x3f\x3f\x73\x2c\xac\x38\x2d\x8a\xc4\x2e\x17\x8e\x22\x44\x99\x9d\x76\x4a\x9d\x0e\x98\x17\x14\x68\x6e\xb4\x92\x44\x97\xe5\x6b\x50\x15\x7e\x99\x39\x03\x2c\x9f\x88\xeb\x65\x7c\xfd\xe4\x4a\xd3\x47\x14\xaf\x4a\x51\x32\x4e\x5e\x77\xd0\xde\xea\x99\xc9\xf2\x44\xd2\xe0\x9e\xa4\x25\x82\x0a\x74\x6d\x88\x3a\x0c\xf4\xb7\x05\xc2\x9d\xf8\xc0\x37\x44\x81\x54\xdc\x08\xa4\xd4\x33\x74\x05\xfb\x87\x65\x82\x31\x14\x37\x0b\x37\xed\x86\x08\x6e\xc5\xf8\xbd\x6c\x72\xab\xf1\x3f\x51\x84\x30\x71\x0f\x59\x7b\x06\x10\x8f\x65\xb3\x0a\x48\x34\x96\xe2\xed\x81\xda\xb1\x0f\xee\x94\x7f\xe0\x4b\x54\x85\xf2\xe3\x07\x40\x49\xd2\x22\x84\x26\x66\x51\xad\x10\xdd\x08\x6a\xaa\x5d\x45\x2e\x0d\x1a\x61\x12\x9d\x1e\x77\xc6\x63\xc2\x6d\x08\x89\x62\xb5\x54\x56\x45\xb7\xa1\xa8\x71\x3d\x51\x32\x7a\x7a\x35\x9b\x12\xda\xad\xb8\x5a\x2c\xd4\xb5\x41\x0d\x5c\x20\x26\x7f\xa7\x66\xb8\xc4\x2a\x84\xdc\x42\x66\x45\x88\x87\x9b\x3e\xae\xfd\x4c\xc8\xdc\x69\x3f\x98\xac\x20\x56\x09\xe5\x70\x66\x5b\x01\xea\x46\x55\xe3\x94\x29\xa7\xa7\xe5\x42\xef\xb4\xf7\x89\x0d\xbf\x4e\x34\xc6\xcf\xf0\x7e\x4d\x35\xbd\x3e\xee\xdf\x5b\x46\x28\x0f\x4a\x0d\xa0\xc2\xe7\x3c\x94\xea\x81\xcf\xea\xe7\xf9\xbd\x04\xfe\x2d\x45\x97\x65\x00\xf7\xdc\xac\xb0\xdf\x2a\x5d\xc7\x36\xa8\x23\x67\x1d\xb6\x79\xbe\x66\xcb\x33\xc1\x62\xfd\x2c\x74\xae\x71\xfb\xf4\xd2\xb0\x5a\xf0\x42\xb3\xa9\x77\xf5\xb9\x44\xb9\xfd\xb6\xc3\x44\x24\x42\x1b\xcf\x4f\x62\x23\x76\x84\x28\xfa\x14\x0f\xd4"}, +{{0x3e,0x63,0x73,0xb2,0x65,0xb9,0x67,0x89,0x00,0x7a,0xd2,0xa1,0x0c,0x30,0x9a,0x56,0x76,0x38,0xf2,0x55,0x87,0xd7,0x7e,0x28,0xb0,0x82,0x3a,0x4f,0x17,0x9a,0xe4,0xfe,},{0xa3,0x23,0x4e,0x5d,0x13,0xb0,0x34,0x72,0x16,0x50,0x36,0x40,0x4f,0x6d,0xe8,0x0e,0x70,0x28,0x39,0x50,0x0f,0x13,0xd9,0xc9,0x85,0xa0,0x77,0xd4,0x5c,0x69,0xff,0x45,},{0xf5,0x1e,0x0f,0x87,0x8a,0x5a,0x70,0x96,0x47,0xe8,0x5f,0xea,0x83,0x9f,0xd5,0x66,0xe6,0xf3,0x5c,0x8a,0x61,0x85,0xd0,0xc9,0xeb,0x13,0xe0,0xd5,0xb9,0xe6,0xe8,0xaa,0x95,0xc3,0x33,0xa8,0xf5,0x06,0x32,0xa4,0xd6,0x65,0x7b,0x51,0x8c,0xe4,0xcf,0xde,0x40,0xb8,0xf5,0xa0,0x5b,0x2d,0x9f,0x84,0x41,0xfc,0xc9,0xd2,0xd6,0x92,0xd5,0x09,},"\xb9\xd0\x68\xbb\xca\xe7\x72\x2f\x82\x8b\x0f\x8c\x98\xa7\x38\xe3\x6a\x7d\xf4\xc9\x97\xc7\x24\xba\x27\x53\x1a\xf3\x4a\x2f\x10\x6c\x75\x13\xa4\x4a\x46\x1a\x9a\xa4\x30\x9b\xc1\x5c\x4e\x0d\x42\x75\x91\x93\xea\x1c\xde\xa9\x56\xbb\x81\x59\x85\xf5\x78\x67\x14\x5e\x9e\x2c\x75\x85\xfc\x8d\x61\x02\x7e\x47\xd2\xd7\x35\xe2\x44\x8a\xf3\x78\x29\x09\x40\x4e\xde\xaa\xc0\xfd\x73\xf6\x04\x5d\xcd\xb0\x4f\x03\x77\x75\x8f\x02\x20\x4a\xae\x3a\x72\x20\x31\x1c\x0f\x47\x23\x58\x27\x10\xcc\x44\x0c\x36\xc9\x58\x7b\x5c\x9e\xbc\x40\x63\xfe\xa8\xca\x3f\x43\x19\x58\x94\xf7\x9a\x36\x50\x87\x13\x72\x82\x30\x2d\xbf\x2e\x7a\x0d\x41\x1a\xb5\x8b\x70\x26\xcc\xde\x19\x88\x69\xaa\x73\x43\x34\xc0\x52\x38\xe2\x75\xe3\xc3\xab\x21\x70\x83\x49\x57\x69\xe2\xfa\xd3\x74\x05\x14\x52\xd7\xf5\xb1\xdb\x0e\x78\x58\x36\xd4\xbd\x5e\x29\x78\xa3\xe9\x91\xaf\x0f\xf7\x16\xf4\x38\x89\xa0\x7f\x5d\xf2\x99\x60\x36\x21\xc3\x9e\x2c\xde\xe0\x89\x98\x5d\x9e\x6b\xf7\xb2\xfb\xd0\x23\x73\xae\x1b\x5e\x9b\x88\xf5\xb5\x4a\x07\x6e\x67\x6d\x77\x90\xbf\xc8\xf5\x7d\xcc\x59\xef\x52\x85\x0c\xe9\x92\xa7\x3b\xa7\xbc\x99\x1d\xeb\x4d\xde\x5e\xb0\xb2\x16\x70\xb1\xb3\xd4\xb6\x4f\x36\xcc\xa8\xe3\x07\x09\x85\x68\x49\x7d\x89\x16\xf6\xb5\xd0\xe9\xe8\x9f\x99\xf8\x60\x06\xf3\x9b\xd3\xa8\x10\x76\x9c\x8f\x78\x01\x77\x3c\x96\x38\xab\xcf\x5e\x27\x11\xb1\x9d\x11\x67\x59\x3a\xcb\xe8\x5e\x41\x61\x42\x89\x97\xa2\x19\x4d\xc5\xe7\xb7\x64\x0f\x0d\x2c\x1e\xb2\x05\x55\x3b\xe9\x16\x7f\xfb\xc2\x2b\x7c\x2e\x76\x98\xf3\xaf\xa1\x07\x54\xcb\x44\xd4\xb1\xd4\x5b\x83\x73\x03\xb1\x66\x90\x73\x41\x5a\x22\x60\x6b\x50\xf2\x1f\x82\x65\xe1\x39\xf2\x30\x5a\xc0\xe0\x12\x7a\xe0\x56\xce\x8a\xbe\xab\xa2\x0e\x1d\x26\x9a\x2b\x2e\x89\x9c\x49\x54\x72\x68\xa0\x69\x6a\xe4\x50\xdc\x02\x67\xf7\xf6\x3a\x8e\xdf\x07\x4c\x47\xd3\xc2\xdb\x1d\xa3\x63\x93\x73\x73\x04\xe6\xdd\x4f\xac\xcd\xb6\xab\x55\xe5\xf8\x52\x0c\x3d\xff\x5f\x6b\xea\xc3\x0b\xa8\x5b\x86\x08\x23\x51\xe3\xde\xd8\x40\x0a\xa5\x7f\x65\x0c\x0c\x33\x03\x6d\x65\xb3\x9b\x7d\x2f\xb6\x11\x28\x63\xd5\x9b\x72\x55\x82\x42\xe8\xb0\x45\xad\xdd\x35\x7d\xe6\xfd\x37\xa8\xf6\x61\x17\x65\xc9\xb5\xff\x19\xcc\x4d\xb7\xe1\x17\xc6\x5a\x00\x45\x89\x08\xb0\x24\x5d\x04\xf7\x90\x8f\xc7\x3b\x16\x5d\xff\x6e\x4b\xe4\xb4\x20\x32\xd8\xcf\xd7\xd6\xf7\x77\x2c\x1b\xfe\x72\x1d\x4b\xcf\xe2\xfc\x52\x79\x98\xf3\x4f\xb4\x41\x8a\x1f\xae\x1e\x6c\x37\x67\xc4\xd0\x78\x06\x21\xf9\x23\xda\x1f\x0a\x0d\x3d\x21\x9c\x03\x6a\xcf\xd3\x70\x9d\xad\x4c\xf2\x4d\x90\xbc\x69\x1d\x70\x0e\x6a\x9c\x80\xcc\xfd\x10\xbd\xe8\xe7\x91\xc0\xfe\xa8\x28\x80\xc0\x7b\xaa\xaa\x31\x1e\xef\x79\x24\x07\x84\xf6\x28\xa7\xd2\xa0\x91\x84\xe0\x16\xf8\x10\x08\xe7\x74\x29\xa8\x65\x8b\x15\x3e\x44\xe7\x9a\x98\xad\x24\x8f\x7f\xda\x23\xb5\x90\xd6\x46\xd7\xc1\xd8\x41\xf4\x92\x7d\x6e\x8b\xc7\x32\x14\xd1\x0a\x7f\x3c\x29\xc8\xf8\x39\xa8\x90\x8d\x20\xa7\x4e\x82\x7a\xf4\x67\xac\x5a\xbf\x0f\x1d\x0e\xd3\x9c\xdd\xd9\x69\xdd\xe9\xee\xb4\xa4\xb7\x52\x7a\xb3\xe2\x47\x5a\x19\x5e\x24\x47\x4a\x4e\x36\xb0\x90\x52\xe2\xda\xd4\xa5\xeb\x46\x91\xe2\x63\xb8\xc6\x1b\xbd\xe8\x77\x72\x20\x7e\x01\x1c\x4c\x1e\x14\x23\x5f\xb2\x4e\x4d\xa4\x38\x87\x5d\x18\x53\x0f\xef\x90\x26\x19\xdd\x48\x5d\x77\xb5\x45\xab\xb5\x6b\x69\xc7\x55\xaf\xe7\x58\x60\x69\x71\xab\x97\xdd\x3a\xce\x1c\x1a\x34\xa3\x37\x94\xc8\x15\x6d\xa7\x99\xe8\x22\x4d\x88\x5e\x18\x68\xf9\xcb\x46\x6d\x80\x2c\x82\x7c\xc3\xe1\xec\xd0\xae\x6e\x0b\x01\xf8\xf7\x91\xb1\x22\x08\xfc\xc0\xfe\xd3\x85\xb7\x96\xeb\x2f\x29\x08\xb5\x8d\x30\xb3\x73\x3f\x14\x70\xf2\xe2\xef\x12\xad\x43\xfe\xb7\x2d\x08\x16\xde\x3c\x13\xa8\xb5\xa5\x23\xe1\x4c\xdf\x5f\xf3\x72\x0b\xf8\x77\x69\xcd\xe7\x49\x5d\x22\x6b\xf3\x82\x38\xa8\x25\xf7\x5a\x09\xf6\xbb\x9a\xfc\xe5\x16\xa7\xbc\x70\x11\x43\x70\xbb\xc4\x0f\x17\xc7\xbc"}, +{{0xf5,0xe8,0x59,0x7e,0xac,0x0e,0xbf,0xa9,0xd3,0x85,0xde,0x85,0xa1,0xfb,0xaa,0x35,0x14,0x63,0x95,0xb1,0x34,0x57,0xb5,0xb1,0x4d,0x36,0x70,0xda,0xca,0x69,0x05,0xe7,},{0xce,0x93,0xe6,0x42,0xc2,0xf1,0x50,0x84,0xbc,0x83,0xba,0xfd,0xaa,0x19,0x67,0x63,0xde,0x2a,0x3c,0x51,0x3b,0x0e,0x44,0xf6,0x8d,0xdb,0xde,0x37,0x85,0x14,0xc4,0x41,},{0x57,0x65,0x43,0xfc,0x21,0xab,0x0a,0x7c,0x5f,0x63,0xb1,0xcf,0xf0,0x1b,0xf8,0x45,0xdf,0x91,0x79,0x2e,0x7a,0x97,0x50,0xc5,0x50,0x8b,0x51,0x66,0x5e,0x7f,0x89,0xf1,0x7c,0x6e,0xc3,0x35,0x5a,0x0a,0xed,0x87,0xdb,0x8c,0x77,0xbd,0xb2,0x71,0xfb,0xed,0xc7,0x14,0xff,0xad,0xb7,0x8b,0x5e,0x0f,0x97,0x81,0x16,0x77,0x1b,0xa7,0xcf,0x0b,},"\x27\x33\x41\xf2\x19\xff\x5c\xf3\x81\xc7\x7b\x2d\xd2\x26\xc5\x8f\x8f\x33\xc4\x52\x70\x48\xcb\x00\x6a\xff\xef\x8c\xee\x15\x1e\x30\x0e\xfe\xf6\x29\xfe\xd2\x1b\x70\x45\x1f\x72\x92\x92\x62\x7d\x1f\x3f\x1b\x52\x57\x35\x9e\xe5\xa6\x71\xcf\x62\xae\x57\x32\x49\x40\xf2\xd0\xb1\x5a\xac\x76\xff\x39\x82\x20\xc0\x80\x24\xe2\x9a\x8c\xf3\x65\x04\xe1\x2a\x4e\x96\x43\x8f\x42\xc3\xda\x0c\x00\x05\x41\xbc\x11\xf0\x91\x38\x1b\x0b\x72\xb5\x8a\x92\x08\x3f\x44\x6e\xca\x19\x91\x99\x68\x78\xde\x35\x08\x1c\xc4\xab\x90\x95\x8c\x96\xcf\x5c\x99\x79\x6c\xba\x79\x51\xee\x18\x6f\x26\x52\x7a\xed\xe6\x9d\xb3\x04\xce\x29\x41\xba\x15\xcc\x00\xba\x2f\x14\x11\xf2\x08\xda\xd4\x5e\x87\xbc\xf6\x38\x79\x2d\xe0\xa6\x86\x24\xb6\x67\x29\x7c\x27\xa3\x43\xdb\x4b\xaf\x34\xa0\x22\x8e\xaf\x0d\x10\x22\x00\x9b\x5d\x06\x8b\x25\x34\xd9\x20\x30\x2e\x71\x31\x0f\xeb\xf0\xdf\x1b\xb0\x2c\x2e\xf0\xad\x1a\xe1\x49\xde\xad\xf8\xc1\x84\x37\x3c\x0f\x7e\xb6\xb2\x56\x95\xbe\x82\xd1\x2c\x71\xb6\xc8\x32\x67\xd9\xa2\x33\x66\x7e\x77\xbc\x20\x59\x83\xf8\xb8\xd8\x77\xd8\x5a\xea\xd3\xf6\x0e\x82\x0f\xfc\xb1\x7a\xdd\xdd\x92\xa7\x71\x2b\xbe\xb3\x4e\xe7\x19\x66\xda\xfd\x99\x07\xd1\x93\xdd\x9d\x72\x5a\x31\xa6\x13\xd2\x9e\x32\xbe\x72\x13\x28\x08\x92\x6d\x94\x37\x47\x7f\xee\x25\xed\xa6\x10\xae\xb1\xdc\xe1\x2e\xa3\x16\xc6\xae\xc6\x68\x9e\x50\x1c\x55\x19\x23\x82\x5a\x34\xb4\x2c\x4f\x06\x75\xb8\x6a\xb2\x6a\xde\xea\x2e\x60\xda\xe6\xc6\xd1\xcd\xd0\xcb\x3c\x34\x7b\x16\x38\x40\x39\xa8\xe3\xfd\x60\x87\x38\x13\x87\xcb\x4b\xc7\x2d\xdb\x5f\x25\xb3\x74\x85\x9b\x02\xe5\xbb\x1b\xa0\x6d\x3c\xc6\x9e\xc4\x4c\xec\x4b\x98\x5c\x84\x76\xe3\x50\x32\xe9\x9a\xbf\x00\x1a\x1d\x44\xdd\xc6\xe2\x88\x9c\x3c\x2c\x3e\xca\xce\xd6\x09\xb2\xb2\x68\x0e\x00\xb1\xef\xa7\xe9\xd2\x6d\x62\xf2\xb3\xab\x36\xf9\x21\x04\x47\x90\xab\xbd\x49\x36\x07\x56\xdc\xff\xcc\xf2\x30\xf6\x6d\xbb\x70\x1a\xa1\x64\xda\xd6\x06\x9a\xa2\xb8\xb3\x30\x9f\x2f\xe4\x4d\x5e\x0b\x25\xbd\x55\x64\x31\xf0\xdf\x4c\x2e\xa9\x7a\xe7\x9e\xd4\xa5\x75\x78\xd6\x6f\xc6\x93\x9c\x57\x62\x8a\x90\xca\xc9\x7a\xdf\xa8\x70\x2a\x4a\x1c\x89\x65\xba\x1a\x90\x26\x25\x67\x28\x66\x64\x00\x30\x03\x53\x3c\xc9\x31\x4c\xaf\x7d\x3b\x98\x2e\x0a\x43\x2f\xf5\xaa\x4e\xd5\x74\x19\x83\xd9\xb5\x43\x23\xac\x7e\x29\x9b\x2b\x49\x56\xc1\xa2\xc1\x91\x55\x7b\x27\xd8\x6b\xe7\x14\xb5\xb6\x8f\xcb\x1d\x41\xf7\x8c\xa5\xdd\xb6\xb5\x3b\x3d\xfc\x8e\x7d\x6b\x3c\x3d\xb0\x59\xaf\x9f\x2d\xd7\x65\xef\x04\xb6\xd1\x6e\x67\x37\xc7\x27\xaa\x11\xf3\xdf\x37\x74\xa3\xfc\x96\x18\x2e\x28\x2a\xcc\x3d\x23\x3e\xea\xbf\x8c\x72\xd3\xf2\x46\xae\x18\x45\x05\x28\x8f\xef\x39\xb3\x67\x66\xb1\x0d\xd1\xbf\xbf\xbf\xa7\x0f\x97\xb3\xc9\x01\x72\x6d\x1e\x0d\x0a\x83\x7d\x11\xf0\x12\x3a\x34\xab\xad\x1a\x79\xaa\xbe\x80\xb1\x25\xb1\x28\xee\x16\x0b\x51\x18\x48\xf7\xf0\x4c\x49\xc8\xd5\xc2\xf2\x04\x1d\xa7\xd9\x59\x9c\x29\xb1\xda\xc8\xc6\x80\x77\xef\xac\x3e\xca\x58\xbb\xc1\x63\x7a\xad\xce\x21\xc7\x74\xfe\xa4\x2d\x2b\xcf\x4a\x0b\x98\x92\x30\x7e\x36\xfa\x25\x0a\xce\xe7\x95\xad\x2b\xfe\xcf\xbf\x60\x31\x9b\x81\x66\x3e\x2a\x26\x57\x19\x46\xf7\x5a\x8d\x96\x9a\xf1\x6b\x3b\x57\xc3\xec\x3e\x66\x15\x8a\xaf\x42\xcc\xf5\xe5\x8b\x93\x7a\xae\xf6\x13\x31\x86\x06\x60\x33\x17\xe5\xaa\x31\x8b\xe7\x0f\x8d\xa3\xc0\xc1\x6b\xe6\xc2\x9e\x3e\xc9\xfe\xf4\xe4\x6e\x8c\xa2\x41\xd9\x41\xd5\x80\x49\xa0\x63\xd9\x0a\xfc\x95\x3c\xa3\x2e\x8a\x50\xa6\x47\x36\x32\x58\x8a\xc4\x1e\xae\x97\xf2\x0c\xe9\xb7\x41\xed\x41\xc9\xa4\xaa\x65\x51\xfd\x82\x3c\xe0\xc8\x11\xa5\xbb\x5a\x17\x1c\x1e\xa4\x23\x8a\x02\x46\x81\x1e\x46\x9c\xf4\x98\xb7\x96\x21\xc3\x23\xeb\xa7\x98\x53\x44\xfe\x11\xe6\x74\x99\xed\xf4\x96\x74\x91\xaa\x74\x9f\x8f\x3f\xe3\x99\x61\xd7\x68\x92\xc9\x3a\xac\x3b\x19\xfa\x4b\x4f\xc1\x74\xd7\xd4\xd4\xd8\xbd\x6e\xe4\x75\x47\x50\x08"}, +{{0xcd,0xad,0xc5,0xb8,0x9c,0xb2,0xb6,0x30,0x8a,0x00,0x6f,0x2f,0x4e,0x95,0x5a,0x91,0xaa,0xf3,0xba,0x70,0x16,0x5f,0x2d,0x44,0x4e,0xf1,0xff,0xeb,0xbd,0xaa,0xa2,0x21,},{0x05,0x41,0x41,0x5f,0xf5,0x46,0x7f,0x28,0xce,0xac,0x83,0x9b,0x13,0xa1,0x76,0x6e,0x72,0xc9,0x9e,0x65,0x45,0x20,0x7d,0x9d,0x5d,0x96,0x97,0x41,0x1e,0xb6,0xbc,0xa7,},{0xff,0xed,0xe7,0x01,0xeb,0x18,0x29,0xce,0x23,0x61,0xcd,0xa2,0xc8,0xbb,0x63,0x33,0x85,0x39,0xd8,0xad,0x2f,0x66,0x77,0x58,0x55,0x31,0xe7,0xbf,0x1d,0x39,0x22,0x38,0x26,0x79,0xa1,0xae,0x84,0xff,0xeb,0x75,0x3f,0xc9,0x75,0x4e,0x50,0xc0,0x18,0x52,0xf9,0x55,0xe3,0xfd,0x60,0x9f,0xf6,0x4b,0xf0,0x5b,0xbe,0x70,0x75,0xcd,0xbe,0x00,},"\x91\x17\x27\x03\x6d\xb3\x09\xd6\xe2\xe3\x36\x9e\x4f\x17\xd9\x8d\x99\xec\x07\x0c\x33\x28\x3b\xb1\x24\x4e\xfd\x62\xe7\x6b\xd7\x0a\x69\xb9\x72\x3b\xd2\xb5\x20\x47\x2b\x98\xaa\x06\x59\x24\x36\x6d\xe7\x80\x90\x0b\xcd\x8b\x77\xb5\x0f\x87\xc3\xc3\x61\x87\x02\x4b\xbc\x59\xcc\xf4\x48\x2c\x7b\x4a\xad\xb5\x6e\x2e\x5e\xcc\x00\x03\xd9\x89\xd6\xaf\xc6\x3e\xc1\x02\x42\xe5\x74\x82\xfe\x39\x21\x52\x61\xd5\xfc\x95\xa0\x18\x5f\x95\xe9\x54\x0c\x55\xf7\x4d\x69\x60\x48\xbc\xa7\xab\x11\x26\x81\xa5\x55\x8e\xa9\x3c\x3b\x1f\x1c\xd3\x64\x65\x9e\x94\x33\xce\xee\xbe\x05\x4e\xe7\x13\xc4\x77\x60\xd7\xad\x13\x2a\x7f\x3f\x8f\xe3\xd5\x04\x1b\x81\x1a\x26\xb6\x5e\xfb\x1f\x34\x0e\x18\x1a\x4e\xc7\x20\xea\x13\x6b\x3a\xf3\xd9\xe5\x46\x1d\xd2\x43\x70\x33\x6f\x10\xe6\x35\x4c\x8c\x17\xac\xf9\x99\x85\x44\xce\xc0\x87\x3e\xfa\x68\x7c\xb1\x32\xae\xcf\x70\xae\xbb\xc5\x67\xba\x03\xc5\x36\x49\x9e\xf9\x6c\xc8\x41\x2e\x7a\xaa\xd5\xbf\x96\x42\x2b\xe4\x7c\xb9\x41\x36\x45\xdf\x2c\x17\x03\x19\x23\x47\xdc\xbb\x12\x31\x27\x45\x59\x71\xae\x15\x7e\x9f\xa2\xdb\xff\x88\x74\x5a\x96\xc6\x58\xb8\x65\xe4\x1f\x55\xae\xbf\x98\x39\x50\x05\xdd\xcb\xd5\x98\x3e\x6a\xe0\x2c\x4f\xbb\x5e\x17\x91\x67\x96\x32\x5f\x76\xed\xf5\xb6\x4a\xfa\x4e\xc5\xa7\x41\x8a\xfe\xd2\x3a\x97\xef\xad\xe6\x8b\x6a\x5b\x31\x45\xf0\x8a\x5d\x3d\xb9\xc2\x98\xa5\x12\xfa\xbd\xac\x68\x56\x2b\x3f\x55\x37\x7f\xf4\x4b\x00\xc1\xc2\xf3\xef\xd1\x81\x32\xda\x71\xf9\x71\xa9\x53\xa9\x31\x8c\x57\x52\x33\x61\xa1\x60\xf9\xb7\xe3\xb5\x1c\x52\x4e\x95\xdd\x5e\xf4\x56\x8e\xf1\x8a\x80\x07\x75\xe9\xd2\x6e\x07\x13\x19\x42\xd2\xbe\x4e\xf2\x2c\x0c\xbc\x13\xdf\x01\xc6\x8b\x1b\xcd\x3b\xce\x9b\xd5\x1c\x4c\xed\x65\x2a\xdc\x40\x07\xbe\x43\xb3\x7c\x67\xa5\xc5\x5e\xd4\x02\x9e\x8a\xd1\x5d\xef\x83\x05\xc9\x68\x62\x1a\xed\x4c\xd4\xbf\xe0\x79\xa6\xf4\x88\x84\xd8\x56\x80\x39\x2c\xa9\x2b\xa6\xe1\x2f\xea\x6f\x4a\x05\x6f\x79\xd6\x7b\x19\xb0\x5f\x90\xd6\x84\xbe\x7d\x45\x72\x5f\x79\x67\xc6\xa4\x67\xaf\x43\xb8\x6a\x6b\x1b\x9d\x9e\xed\x3a\x42\x48\x97\x1c\x76\xa7\xac\x29\xc2\x92\xdf\xba\x4d\x75\xc5\xf7\xba\x70\x9a\x39\x05\x8e\x96\xad\xf6\xdb\xd7\x60\xd3\xce\xf4\x02\x4b\xf3\xed\xc4\x41\xef\xbf\x11\x47\xa2\xc1\x08\xbd\x6f\x9e\xb4\x39\xc1\xc5\xc4\xd3\xa6\xea\x4e\xc3\xd9\x2c\xef\x38\x13\x61\x88\xbe\xc9\xe0\xb6\xc0\x51\x8d\x8b\x79\xba\x59\xc5\xdc\xba\x39\x3a\xed\xfd\xff\xb0\xb7\x0d\x77\x9c\x2b\x97\x65\xce\x44\x52\xe7\xe3\xb0\x8c\x44\x02\xb1\xa6\x08\x32\x08\x40\xfb\xe9\x6d\x1e\xb8\x65\x6e\xb1\xc2\x0d\x95\x51\xdd\xf5\x33\xb9\xf1\x5e\x4e\xb5\x78\x37\x56\xc5\x3d\xdd\x3b\x14\xd8\x07\xf8\x38\xac\x96\x80\xf8\x9f\x1a\xdf\xb7\x8d\x68\xcc\xb0\x67\x31\xa9\x0b\xea\xc5\xf0\xd7\x09\xd5\xb8\x8c\x75\x43\x7a\x66\x3c\xb9\x62\xd3\x7f\x96\xb8\xe8\x92\x84\x77\xb5\x61\x12\x28\x01\x5d\x33\x7f\x04\x9e\x8b\x62\xe4\xdf\xf8\xd0\xbb\x6c\xda\x24\xa5\xdf\x90\x83\xe3\x48\xbe\xf1\x25\x85\xf5\xf4\xc4\xd3\xbb\x3c\x7e\x78\xd5\x50\x19\x4a\x45\x25\x1a\x08\x79\xa1\x62\x4b\xf9\xdd\x35\xeb\x65\x5c\x39\x39\xfe\xa8\x90\x9f\x6d\xf3\x95\xbe\xbd\x02\xb6\x8a\x17\xa8\x97\xc9\xaa\xdd\xd6\xe2\xe2\x04\x61\xe3\x03\xf5\x7c\xde\xb0\x0a\xe0\xf2\x3e\x60\xa9\x4c\x19\xc7\x71\xd8\xaa\x60\x53\x3b\x93\xce\xdc\x1b\x76\xd2\x29\x0a\x01\xbf\x43\xb2\x72\x5f\x12\x5b\xef\xa5\x75\x15\x4e\x98\x6c\x9c\x62\x05\xa1\x59\x6c\xba\xa2\xd1\x34\x70\xc2\x34\x22\xf2\xdf\x7b\xec\xe4\xe6\xeb\xd7\x52\xe9\x38\x9a\xe6\x08\x57\xb5\x29\x69\xd2\xdd\xef\xa9\xc0\x34\xf1\xbf\x35\xae\x33\x16\x30\x4e\x94\x9c\x89\x90\x82\x0e\x26\xe6\xcf\xfa\xe4\xb3\x88\xd1\x50\x5f\x92\x37\x06\x29\x7f\x8d\xb5\x56\x53\x79\x19\xeb\xbe\x30\x86\x02\x3f\x12\xf4\xde\xd3\xb1\x1a\xcf\x2a\x6d\x97\x3d\xdd\x8e\xb2\x7b\x07\xc5\x80\xbf\x44\x8c\xaa\x5a\x2e\xa1\x16\xc5\xea\xf3\x6f\x7a\x6b\x17\xa8\x5b\x39\x55\xdc\x8a\x44\xa6\x20\xd8"}, +{{0x2d,0xdd,0x79,0xe7,0x60,0x64,0xc2,0xe6,0xb3,0x22,0xaf,0xb0,0xc5,0xc6,0x85,0xcd,0xbe,0xc6,0x28,0x21,0xcd,0xfc,0x0c,0xb1,0x4d,0xb7,0xd0,0x1b,0xa3,0xbf,0x21,0xa5,},{0xf5,0x5b,0x4a,0xb6,0x4a,0x25,0x82,0x21,0x2b,0x96,0xcc,0xac,0x06,0x40,0xe2,0x71,0x94,0x4a,0x34,0xa2,0x86,0xd0,0x35,0x83,0x30,0x45,0x81,0x0e,0x34,0x18,0x24,0xbb,},{0xa4,0xc3,0x96,0xe1,0x9d,0xd4,0x2e,0x03,0x91,0x84,0xcd,0x25,0x11,0x88,0xff,0xa2,0x45,0xf0,0x36,0x7c,0x69,0xc0,0x2d,0x12,0x47,0x4e,0x5c,0xa9,0xe5,0xc7,0x68,0xa7,0xee,0x3a,0x3d,0x47,0xeb,0x22,0xd1,0xac,0x9e,0x04,0xb7,0x04,0xa7,0x4f,0x41,0x69,0x47,0xf3,0xf4,0x9a,0x32,0x42,0x59,0x4e,0x7b,0x63,0x90,0xe8,0x2b,0x60,0xd5,0x05,},"\xa5\x66\x74\xa1\xe1\xf0\x97\x95\x25\x1a\xbe\x54\xab\x43\xc2\x98\x20\x8f\xef\xc9\xbb\x91\x76\xfd\xb2\x3e\x1e\x9f\x60\xf0\x32\x64\x79\x15\x56\x7e\xbd\xcc\x2b\x86\x9e\xdb\x70\x55\xf4\xab\xa6\x7e\xcf\xe7\xfa\x19\xed\xa4\x5c\x06\x04\x7c\x7a\x51\x84\x8b\xe9\x97\x32\x51\xf8\x5f\xf7\x6f\x1c\x59\xe3\x65\x43\x82\x85\x8c\x9b\xe1\x23\xdb\x8a\x94\x90\xc6\xc9\xb3\x09\xb8\x2d\x1e\x2c\xa6\xf4\xa0\x7d\x00\x12\x02\x83\xc6\xc2\x95\x64\x49\x95\xa9\x66\x28\x61\x2b\x8d\x67\x91\x57\x35\x18\xe2\x55\x6a\x68\x8a\x09\xf1\x49\xbc\x84\x6a\x68\xbd\x0e\xf7\x92\x79\x03\x57\x10\x03\x1e\xf0\xa8\xfe\xd1\xdd\x0b\xf0\x26\x12\x5d\xc6\x64\x8f\x86\xf6\x43\x09\x94\x2e\x18\xf2\x3b\x12\xd1\xdc\x68\xc6\xf2\x77\x0c\xa8\xb5\x48\x5b\x36\x9b\x0c\x92\x00\x7a\x94\x61\xc1\x39\xfc\xbb\x41\x17\x5f\x31\x6d\x44\x67\x06\x0a\xb4\x3d\x12\x22\xf5\x80\x24\x04\xbf\x63\xc2\xdf\x7e\x00\x4b\xdc\x40\x0c\xa8\x0f\xe0\xd2\xcb\x68\xa2\x10\xfb\xc3\xfc\x0b\x90\x32\x09\xd5\x47\x6e\x7a\x56\xba\xef\xb8\xfa\xd7\xf3\x28\xb7\x2f\x32\x71\x13\xe1\x39\x41\x4b\xa6\xf3\x4e\x99\xc2\xec\xcd\xe0\x44\xe7\xa3\xac\x70\xc5\x80\xcd\x26\xc7\x45\x01\x92\xca\x4c\x82\x3c\x7a\xc5\xea\xe8\x76\xc0\xd1\xc8\xc7\x68\xc1\xcb\x0b\x7e\xa4\x1f\xc9\xb7\xd2\x94\x37\xbb\xad\xab\x18\xe0\xf5\xed\x1d\xef\xe0\xcf\x6c\x0e\xba\xa6\xb6\xd7\x77\xf4\xda\xd9\xab\xdd\xbf\xc0\xfd\x6a\xb5\xee\xea\x80\x3c\xfa\x01\xc0\xbd\x46\xf6\x5f\xef\xa4\x69\x01\xab\xbe\x0d\x89\x10\x4e\x3b\xc4\xae\xe1\xf0\x59\x9c\x69\xb6\x7b\xa5\x45\xab\x9b\x54\xf5\xde\xe3\x40\xac\x69\xd8\x82\x99\xe8\x68\x22\xac\xdd\xdd\xce\x60\x11\x22\x01\x2f\x99\x29\x97\x74\xaa\xf1\x7c\x96\x4e\xde\xcb\x95\xe1\x27\x7d\x46\x2d\xe6\x4e\x91\x15\xa6\x1a\xd9\x8a\xa3\xd2\x2e\x3b\xa6\xf8\xf1\xcd\x69\xb6\xb5\x2b\x83\x38\x28\x23\xf3\x0e\x96\x6b\xda\xd1\xff\x5f\xc1\x98\xae\x32\xe9\xb6\x80\x55\xd4\x39\x2b\xc7\xc3\xdf\x10\x15\xf1\x28\xae\xe1\xe4\xfa\x3d\x49\x99\xe3\x29\xf2\x2f\x0f\xf6\xaa\x77\x8b\xae\x02\x94\xa1\xdf\x74\x36\xcb\x16\xa2\xbf\xcd\x74\xb4\x63\xab\xe7\xcb\x4b\xac\x53\x62\xc8\x9c\x9d\x1a\x37\x8a\x2c\xb8\x85\xcc\x3b\x26\xab\x4b\xe8\x81\xef\x1a\xfc\x14\x43\x0e\x10\xd2\x65\x39\xca\x35\x8c\x36\x76\x28\x6a\xd8\x1c\xe1\xc9\xe7\x85\x92\xaf\x66\xf1\x82\xbb\x1f\x7f\x86\x2f\xe7\x55\xbf\xfb\x5b\xe5\xc5\xf2\xb7\x31\xc1\x32\xe2\x38\x8a\x76\xa1\xa7\xb1\xcd\xdf\x05\xae\xd2\xac\x9e\xc4\x08\x47\x52\x71\x94\x2c\xca\xdd\x32\xe4\x9d\x87\x91\xed\xf8\xb8\xde\x11\x75\x51\xce\x26\x4a\x60\xb8\x41\x05\xea\xe8\x7e\x66\xf6\xa4\x01\xd1\x32\x2b\xb2\x1a\x98\xe8\xac\xd2\x77\x49\x32\x54\xe5\x04\x00\x4f\x72\xc7\x6e\x79\x03\xd2\xfa\x38\xfa\xb7\x17\xe9\x4c\xe6\x27\x94\x7c\x4e\xa3\x26\xbd\x25\x75\xc3\x73\x10\xf3\xb4\xd8\x43\xb9\x0f\xa7\x7d\x32\xd9\x95\x21\x94\x15\x0b\x62\xf8\x50\x18\x7a\x4f\xdf\x38\x46\x6d\xfa\x06\x56\xc0\xa2\xe0\xb3\xf0\x74\x92\xac\x8e\x37\xe5\xd0\xdf\x95\xcc\x89\xdf\x30\x85\xa2\x69\x29\x1d\xc2\x51\x22\x10\xd3\xfe\x44\x24\x8d\x7a\xb9\x96\xbe\x09\x9a\xf6\x4c\x22\x75\x66\x66\xf8\xde\xa5\x6c\x00\xb9\x06\x77\xd1\x18\x25\x00\xdd\x27\x4f\xd0\x76\x92\x53\x82\x6d\x67\x7a\xb1\x6a\x55\x7b\x08\xb3\xc5\x22\x65\x49\x8d\x85\xc4\xcb\x2b\x60\x0e\xe0\x48\x1b\x7c\x1c\x47\x6a\x9d\xaa\x8b\x88\xc7\x1f\xc2\x1b\x6f\x89\xbf\xdf\xec\xe5\x8d\xa9\xe8\xd5\x65\x65\x2e\x43\x95\xbd\xf4\xc8\x11\xb4\xf4\xf2\x2d\x2b\x96\x13\x26\x1f\x88\xc6\x04\xc2\x97\x4d\x3e\x97\x7d\x14\x0d\x04\x6e\x1b\x66\x25\xb7\x07\x16\x40\xd3\x52\xcb\x7e\x7e\x65\xd4\x6c\x61\x34\x47\xbe\x8d\xc5\xa2\x00\xaa\x9a\xca\xb4\x6a\xfc\xcf\xeb\xb6\xb1\xc3\x19\x73\x24\x6c\x34\xfa\xaf\x8d\x26\xea\x5e\x83\xbe\x15\x71\x8f\x8f\xdb\x0c\xfc\x44\x4e\x2e\xb6\x0f\x36\x59\xb0\x20\x16\x1c\x22\x8e\x6b\x92\x40\xb7\xac\x39\x4c\xab\x81\x2d\xe1\x05\x15\x76\x6f\x22\x47\x3e\xcc\xa5\x35\x59\x4c\xe5\x28\xa5\x7c\xf5\xda\xb2\xeb\x32\xab\x84"}, +{{0x3a,0xbb,0xdb,0x0b,0xa1,0x1a,0xa1,0x06,0x3b,0xd2,0x6b,0x02,0xc1,0x16,0x03,0x78,0x62,0x28,0x5b,0xab,0xd2,0x15,0xd2,0x40,0xbc,0x9c,0x09,0x26,0xf4,0xec,0xea,0x81,},{0xb8,0xfc,0x59,0x43,0x8f,0x8c,0xe9,0xe3,0x78,0x5a,0x47,0x3b,0x22,0xc8,0x89,0x2c,0x51,0xea,0xc2,0x56,0x8c,0x68,0x1d,0xcc,0x77,0xb6,0xf0,0xe0,0x79,0x9c,0x4e,0x33,},{0x98,0x1f,0x20,0x05,0x5a,0x45,0x75,0x25,0xae,0xe5,0x61,0x62,0x64,0xe6,0xaf,0x42,0xe8,0xb3,0x87,0xcb,0x08,0xf8,0xb4,0xa7,0x3f,0x9b,0xe0,0xb3,0x66,0xf1,0x03,0x5b,0xb3,0x0a,0x1c,0x87,0x48,0x94,0xcb,0xec,0xe0,0xa8,0x46,0xd8,0x49,0xb7,0xec,0xc5,0x56,0x58,0x5d,0x0d,0x3d,0x39,0x56,0x45,0x80,0x7f,0xf2,0xa3,0xca,0x5a,0x59,0x0c,},"\xdc\xcd\x55\xf9\x22\xcd\x27\x4f\x69\x75\x00\x0a\xdc\x8d\x98\x63\x0c\x6d\x75\x2c\x12\x02\xa9\xdd\x12\x10\x48\xb9\x39\x45\xaf\x2b\x11\x10\x96\x77\x88\xf9\x9e\xc0\x28\xe3\xd3\xb4\xcf\x82\xfb\x07\x17\x3e\xa4\x40\x1e\x3b\xb4\xb0\x7b\x7b\x0b\x24\xb0\x59\xa7\x66\x33\x95\x32\xd9\xdf\x3e\x31\xb7\x2c\x95\x8c\x11\x9d\x8d\xfa\x15\xa5\x07\xaf\x6c\x5f\x7e\x78\xfe\x27\x0f\xa8\x1b\x9d\xf0\xf2\xe4\xaf\x24\xbd\x99\xfb\xeb\x14\xe0\x03\x30\x84\xd7\xfb\xf8\x4d\xde\xdf\xd5\xce\x56\x75\x1d\x15\x90\x84\x75\xdf\x8a\xf0\x13\xd0\x91\x17\x3c\x13\x86\xb9\x13\x94\x26\xcc\x60\x81\xea\x16\x5b\x8c\xe4\x81\x94\xb8\xe1\x8a\x9b\x91\xa4\x63\x13\x44\xfe\x29\xc8\xe7\x28\x18\xb7\x1f\xa1\x5c\x92\x92\xd1\x3f\xdf\x5f\x9d\x18\xe2\x9b\xd0\x29\x1b\x81\x38\xde\x73\x8f\xd3\xa3\x6c\x35\x23\x90\x22\x36\x8b\x45\x6f\x1f\xac\xba\x90\xa0\xd8\x0d\x6e\x31\x1c\x5f\x6c\x6f\x04\x67\x7e\x92\x37\x3a\x5f\xc4\x73\x88\x94\xdb\xed\x20\x6c\x30\xda\x34\x1b\x3b\x19\x6c\x94\x78\x58\xa6\xd2\xad\xc6\x8a\xac\x3f\x20\xcf\xdb\xe0\x49\x79\x61\xda\xe3\x34\x70\x26\x6d\x17\xec\x71\x9a\x59\xf0\x58\x6f\x82\xf9\x9f\x1c\x90\xed\x70\x05\xa2\x07\x21\x9a\x55\xed\xc7\x60\xf4\xeb\x8f\x24\x02\x64\x7f\x6f\x77\x97\x1f\xf7\xb6\x34\x35\x7b\x6b\x29\xbb\xd7\xea\x05\xe2\xe2\x58\x54\xe9\x9c\x62\x0f\x4b\x8b\x64\x73\x90\x22\xff\x0b\x33\x8a\xfe\xf3\x5f\xb6\xf4\x1a\x53\x62\x9a\x51\x8e\xb9\x3d\x66\x02\x0f\xb3\x53\xae\xf8\xdd\x07\x1e\x09\xc9\x16\xd4\x70\x4a\xcd\xf7\x76\xb3\x8c\xa9\xc5\x9f\x21\x1f\xf8\x8c\x43\x0a\x57\xe8\xf1\x71\x39\x23\xb3\xf3\x0c\xa8\x69\x70\xa1\x4a\x52\xdb\x4b\xcb\xe6\x0d\xf4\xbc\x3c\xfd\xf2\x54\xbf\x10\xf8\xaf\xae\x87\xbd\x61\xb3\x58\xf4\x3c\xc2\x96\xc0\x41\x29\x64\xc4\xe0\x0f\x71\x21\x33\x97\x46\x85\x17\xcb\x01\x37\x9c\xb7\x29\xc7\xb9\xe3\x5b\xd5\x0b\xdd\x98\xc3\xd3\xb7\x62\x97\xa1\x38\xb5\x7c\xeb\x6c\x77\x74\x2d\xf0\x88\x1d\x07\x66\x8c\x08\xa6\x30\xa4\x4e\x6e\xd7\xeb\x20\x6d\x6a\x56\x44\x07\x10\x43\x8a\x51\x11\x42\x4b\x61\xaa\xee\xce\x40\xe9\x00\xf5\xe3\xc4\x57\xe9\xd6\xe3\x1a\x79\xec\x5b\x4b\x42\xb6\x8e\x66\xe1\x99\x30\x92\x87\xca\xd6\x53\x36\xfc\x7f\xe4\x3f\x43\xcd\x8c\x77\x3d\x3c\x65\x80\xd7\x21\x7e\x2c\xab\xec\xd3\xea\xbc\x48\x5c\x4a\xcf\x47\x71\x8c\x39\xb0\x2c\x78\x58\xff\x34\x7c\xec\x75\x35\xed\xdc\xd4\xfc\x81\x5d\xf8\x14\x56\x9a\x88\xae\x70\xf2\x73\x3a\x65\x39\xf2\x08\xc7\x9c\xf4\xe7\xc4\xf9\xea\x24\x1a\x92\xe9\x51\x51\x71\x36\x14\x18\xa4\xc2\xe5\x3c\x07\x6a\xaa\xbc\x47\xe4\xc9\x71\xbd\x04\xb1\x00\xc2\x62\x82\x30\x88\x57\xe0\x6e\x7e\x5f\xbc\x43\x42\x56\x4f\xb3\xb1\xea\x4a\x17\xa9\x25\xe9\x1e\xe6\x91\x22\x32\x1d\x39\x2b\x24\x69\x65\xb8\x6b\x54\xfd\x5c\x83\xfa\x5c\x47\x41\x63\xf9\x8a\x9f\x44\x7d\x88\xcb\x59\xfe\x2c\xdf\x9f\x54\x12\xfc\xbe\xb3\xef\xfa\xc8\x97\x67\x91\xc6\xa4\x7b\x66\x9a\x2f\xc5\x5a\xbe\x8e\x09\xe7\x41\x57\xef\xcd\x1c\xa7\x8f\xc1\x0f\xa6\x87\x01\x0c\x68\x26\xc6\xe8\x96\xef\x5c\xd7\x1d\x0f\xe4\xd1\xbd\x07\xc1\x0d\xac\x3b\x03\x48\x5e\xdd\x25\x69\xa7\xee\xcf\xbc\x4e\x5d\x2e\xe2\x37\x98\x59\xe2\x65\x26\x7b\xed\xaa\xd6\x9d\x93\xb7\xc1\xbd\x18\xf2\x7e\xa4\x24\x83\xc7\xe4\x10\x0e\xe0\x5b\x28\x30\x39\xbf\xb9\x89\x1d\x37\xc4\x67\xed\x83\xb8\x8c\x79\x4e\xab\x6b\xab\x9d\xc6\x77\x89\x26\x50\xe2\xd8\x96\xfb\xfe\xc1\xb1\xcd\xb7\x21\xbe\x30\xb0\xb8\xe5\x35\x87\x09\xe1\x65\xcb\xe3\xa1\x82\xc9\x3b\xc0\xa0\xce\xa2\xf8\xcf\x3a\x62\x57\xad\xf7\x64\x53\x40\x41\x20\x22\x41\xa5\x27\x9b\x66\x8e\x40\x12\x5f\xc0\x94\x58\x5a\x3c\x58\x8a\xba\x82\xb6\x7c\xd9\x1d\x48\x3e\x54\x30\x04\x28\x42\x68\x63\xa4\x23\x64\x04\x9d\x7c\x45\xa1\x69\x38\x5a\xa8\x9b\xf3\x77\xf0\xd3\x2b\x07\x80\x9b\x58\x71\x39\x5e\xc0\x53\xa2\x57\xd9\x3e\x48\xbb\xf4\x07\xeb\x60\x91\x40\x1e\x25\x65\x46\xe3\x1f\x9f\xcd\x24\xd2\xc5\xb3\x33\xcf\x65\x78\x50\x02\xf0\x8d\x54\x8d\xb2\x6a\xd1\xf3"}, +{{0x8a,0x44,0xd6,0xaf,0xc6,0xc8,0xee,0xe1,0xbc,0x7d,0x5f,0x69,0xe4,0x95,0xb0,0xb1,0x8c,0xa7,0xae,0xe0,0x07,0xde,0xa7,0xcf,0x0d,0x17,0x14,0xd7,0x85,0xa9,0xf4,0xed,},{0xd4,0xf3,0x66,0xb3,0x37,0x7f,0xa3,0x9b,0x36,0xf9,0xae,0x14,0xda,0x40,0x4e,0x22,0x40,0x49,0x0d,0xbd,0x8d,0x79,0x6b,0x1a,0xb8,0x72,0xdf,0xcb,0x83,0xa5,0x95,0x40,},{0xe0,0x72,0x7e,0xb7,0x2e,0x84,0xd2,0xb8,0x2c,0xdb,0xd0,0xa6,0xbd,0x2f,0x49,0x49,0x63,0x16,0xaa,0xe8,0x35,0x1e,0x49,0x02,0xac,0xd5,0xe3,0xcc,0x57,0x34,0x6e,0x7e,0xba,0xfd,0xd9,0x2a,0x90,0xde,0xd7,0x6f,0xd0,0xc6,0x69,0x0d,0x68,0xbb,0x2f,0xed,0xd6,0x13,0xe4,0x4f,0xa2,0x22,0xbe,0x01,0x26,0xda,0x52,0x0a,0xcc,0x2c,0x41,0x05,},"\xde\x80\x32\x69\x66\x53\x6c\xe9\x49\x96\xaf\x2d\xe7\xa0\x76\x05\xcc\x4f\xcb\x9e\x75\xee\x0a\x67\xa1\xe2\x09\x32\x11\x1d\xe9\xb3\x56\xd5\xbe\xea\xe8\x6c\xc5\xf5\x64\xc1\x0d\x66\xe3\xde\x95\xa5\xb9\x9e\x84\x49\x28\xea\x8e\x77\x58\x6c\xf3\xc1\x0a\xd3\x63\x3d\xde\xeb\x1d\x9d\xcf\x3f\x94\xb7\x0b\xf1\xef\x63\xd2\x38\xdf\x20\x4d\x70\x5c\x0b\x17\x4f\x83\x28\x25\x45\xf5\xe4\x07\x5f\x8d\x69\xa4\x81\x79\xc2\x9e\xab\xf5\xc1\x74\x2e\xf3\x9e\x1a\xd9\x63\xbe\xbb\xb6\x6f\xce\x94\x91\xa9\x84\x65\x12\x15\xc2\xe7\x50\xe6\xee\x83\x65\x76\x64\x40\xa8\x44\x19\xe5\x2d\xcf\x67\x1f\x1c\x52\xea\xa2\xb9\x90\x2b\xcc\xa4\xb3\x7c\xff\xdb\xac\x8e\x7e\x7e\x6b\x0a\x5c\x87\x48\xef\xbf\x45\x2d\xf6\x16\x3f\x4c\xa0\x7b\x61\xf9\xa0\x5e\xc2\x0a\x2b\xd6\x33\x38\x9e\x67\x0b\xb5\x45\x4a\xcd\x6f\x3a\x06\x33\x5b\x5d\xa9\xec\x32\x62\x64\xe9\x62\xc7\xd9\xd0\x6c\xe7\xe9\xff\x04\xa0\xa5\xbb\xdf\xaa\x4c\x41\x08\x66\xa5\x72\x01\x16\x51\x43\x9f\x2d\xbc\xe5\xde\xe6\x67\x92\x4a\xc4\x93\x4d\x20\x54\x96\xbd\x1d\x4d\xf0\x8b\xd0\xcb\x3f\xd2\xde\x73\xa2\xef\x34\x2f\xf0\x09\x1e\x10\xe1\x5b\x3b\x76\x0a\x57\x5d\xf9\x3c\xf1\xc9\x7c\x01\xc5\xab\x11\xc0\x94\xbf\x34\x87\x82\x06\x71\x8f\x6b\x28\x5a\xa5\xcc\x51\x27\xbd\x7f\x98\x8b\x84\xa9\x04\x95\x30\x6f\xd9\xe9\x9d\x89\x55\xe6\x68\xd1\xa3\xff\x10\xf6\x5b\x7c\x47\x9f\xac\x24\x11\x9a\x3c\x10\x12\x2d\x4d\x18\xa8\x05\xb2\x47\xdf\x16\x8c\x0a\x51\x00\x16\x9b\x55\x72\xd1\x70\x12\xd7\x51\xa4\x2e\x83\x37\x61\x15\xe1\x15\x61\xc1\x60\xc1\x5e\xfa\xd7\x6d\x21\xf7\xab\xb4\x30\x36\x64\x75\x23\x86\x31\xf8\x4c\x88\xf8\x38\xb0\xac\x40\x4c\x91\x3d\x2f\xa1\x24\x50\x23\x84\x85\xc3\x02\xfc\x20\x1f\x44\x15\x1c\x19\xbc\xbd\xc1\x19\x0c\x12\xd1\x54\x08\x31\xfb\x19\x58\x1c\xb9\x31\x72\xb0\xd2\xff\x5c\x65\xf3\x1c\xaf\xf2\x0f\x81\x38\x81\xf8\x4e\x5e\xf9\xd5\xc1\x65\xe0\x96\xd2\x54\xca\xdf\x89\x52\x49\xaa\xb8\xd4\x49\x6c\x94\x0a\x40\xf9\x07\xbd\x40\x93\x5a\x94\xf5\xe5\x5b\x6d\xd0\x51\x15\x41\x00\xfe\x33\x17\x70\xef\xf2\xba\xd6\x54\x56\x19\xb8\xa3\x3e\xf6\x46\x2a\x50\xc0\xb2\xc4\xed\x2f\xba\x4e\x4e\x38\x3e\xbf\x29\x32\xe6\x19\x27\x66\xa4\xaa\xd1\xd6\xe2\xb6\x92\xd9\xf2\xbd\xc2\x33\x93\xe8\xaa\xcf\xba\x32\x3b\x53\x4f\x84\xed\xf2\xdc\xed\x7c\x94\xd5\x16\x87\xda\xa2\x71\x98\xa9\x14\x4b\x31\x2b\x71\x6f\xe1\x70\x14\xa7\xbe\xd0\xc1\x4a\x24\x38\x73\x3d\x55\x5c\x65\x64\xc8\xc1\xa3\xd9\x97\xeb\xae\x7b\x3d\xe8\x87\x7a\xf5\x3c\x1d\x1a\x50\x29\x15\x8a\x80\xaa\x0c\x87\x48\x9f\xef\x27\x0c\xdf\xfe\x10\xd3\x4b\x15\xc1\xa9\x69\x3a\xe0\x39\x02\x43\xe3\x14\xcf\xac\x06\xef\x6e\xef\xeb\xcc\xf4\x3d\x42\xea\xc2\x4c\xe9\x87\x94\x29\xd2\xfc\x72\x53\xb3\xed\x17\x58\x25\xbc\x4d\xa0\x76\x2b\x49\x33\xa9\x8a\xfd\xb9\x4b\x06\xf4\xfc\xd2\xad\x36\x11\xaa\x99\x9d\x7c\x1c\x8d\x85\x2d\x01\xdd\x9e\x52\x64\x84\x55\xa0\x4e\xb2\x33\x0a\x76\xfd\x94\x2c\x53\x1e\x51\x4b\x5e\xc0\x72\x8a\x89\xd3\x4c\xa5\x90\xea\x99\xc8\x8f\xaa\x20\xdf\xb7\xbb\xf6\x56\x54\xaa\x6c\x21\x2b\xeb\x8a\xd6\xbf\x7c\x77\x73\x91\xcd\x49\xc3\x9c\xf8\xab\x51\xb9\x5b\x41\x9e\x3d\xfc\x8d\x94\xa9\x3a\x1e\xf0\x22\x3c\x6d\xe9\x0b\xf9\x62\x18\xd8\x04\x5b\xd4\x95\x2a\x0d\x83\x72\xa5\x57\x8c\x6a\xaf\xa7\x4b\xa6\x62\xe3\x18\x8e\x6a\x6e\x56\x7e\x4d\x2f\xe8\x22\x7d\x07\x43\x98\x2a\x41\xeb\xfa\x0d\x31\x0f\xe7\x9f\xed\x27\x04\x17\x90\xef\xd5\xaf\xac\x22\x43\xe1\xd1\x50\xb1\x45\x01\x5d\x9d\xea\xb0\xed\xed\x63\x94\xac\x36\xfc\x5f\xb2\x01\xf5\x20\x4f\xbd\x42\x2a\x36\x04\x23\x30\x15\xbb\x0a\x48\xa9\x20\xe2\xe5\xe0\xd4\xde\xed\x67\x20\x25\xf2\x3c\xfb\xa9\x38\x89\x59\x7e\x50\x4c\x88\x87\xad\xd4\x6c\xfe\xf4\x02\x4a\xfb\x8a\x26\xee\xb7\xdc\xdd\xb2\x39\x7b\x44\xa1\x79\x63\x67\x34\x00\x42\x13\x70\x28\xc3\x30\x76\x26\x81\x6c\x29\x31\xe6\x1e\xbb\x6b\x69\xed\xcb\xcb\x61\x2c\x9b\x18\x1a\x28\x53\x01\xce\x46\xf8\x2f"}, +{{0x8a,0x97,0x2d,0xd0,0xf1,0x19,0x0c,0x2b,0x9d,0x54,0x8f,0x4b,0xa5,0x82,0x64,0xbb,0x04,0x82,0x67,0x75,0x50,0x2a,0x8d,0x5c,0x2b,0x20,0x9e,0xe8,0x8d,0xce,0xa5,0xfb,},{0x6d,0x80,0x37,0x5f,0x3c,0xf1,0xaa,0xb2,0x83,0x55,0x1d,0xf4,0x45,0xd1,0x7e,0x7d,0x3b,0xaf,0x9b,0xcb,0xec,0xbb,0xb2,0x67,0x05,0x2e,0x02,0xfd,0xb6,0x91,0x44,0xd3,},{0xbd,0x45,0xb3,0xc0,0x45,0x85,0x0e,0xbe,0xf7,0xb8,0x0d,0xd1,0xde,0xab,0x48,0x03,0x7b,0x13,0x46,0xc7,0x1d,0xea,0xf1,0xe5,0x8f,0x2a,0x7b,0x16,0x26,0x74,0xf9,0x4d,0x1e,0xf3,0xd4,0x23,0x90,0x37,0x33,0x0b,0xd6,0x33,0x5f,0xe4,0xf0,0x14,0x92,0x50,0x90,0x1f,0x00,0xa8,0xe4,0x6b,0xe5,0xfa,0x0a,0xae,0xc6,0x9d,0xe0,0x6d,0x73,0x04,},"\x30\xb2\x89\x48\x93\x9a\xa2\x63\x43\x7e\x45\xc5\xc0\x25\x4f\xb2\x0e\x61\x7e\xd0\xf3\xfa\x7d\xac\xe5\xa0\xa8\xe0\xfe\x3c\x1f\xc4\xad\xb2\x80\x9b\x61\xc5\xe8\xd9\x2c\xd2\xf3\xde\x93\xb1\x73\xbe\x70\x7b\xad\xa9\x42\x40\xc6\x26\x2c\x16\x0e\x8c\x78\x21\x65\xbe\xef\x99\xd0\xbe\x8e\xcd\xad\x63\x16\xdc\xd7\x34\xbb\xb9\x0a\x66\xcb\xd5\xb1\xcb\x4f\xd8\xf2\x22\x6c\xea\x94\x8e\x4d\xf7\x6b\xbe\x25\x1d\x47\x8f\x5c\x3f\xe0\xd6\xde\x4b\xe5\x4f\x67\xf5\x02\xb2\x80\x4f\x62\x8b\x79\xa5\x50\xfb\x1a\xc4\x83\xad\x2b\xa1\x66\x37\xc4\xbc\x9d\xa6\x7f\xb4\xf9\x86\x59\xc4\xc4\x39\x4d\x16\xb6\xd1\x4b\x3e\x0b\x0c\x1e\x62\x5d\x71\x0d\xcc\x1c\x11\xdf\x5d\x34\x14\x7b\x1e\xc5\xa4\x17\xb9\xe2\x1f\x90\x8c\xfc\x52\x3d\x43\xe3\xf1\x81\xc7\x20\x9c\xc5\x6b\xdb\x5a\x21\x62\x86\x95\xed\x32\x0f\x8d\x4c\x07\xfd\x6d\x84\xaa\x03\x42\x6f\x21\x64\x4a\xae\xfe\xee\xc3\x11\xc7\x4e\x94\x99\x93\x60\x47\x35\x0a\x9b\xf5\xb7\x03\x96\x2e\x77\xce\x55\x13\x36\x83\x5f\xc3\x2c\xcb\xd2\xc9\x0a\xe5\x2e\x24\xd4\x7d\x8d\xcb\x98\x7a\xbd\x12\x1d\x3f\x74\x6b\x5d\xe2\x30\xf2\x64\x69\x60\x3f\xb0\xc4\xa8\xf6\xcd\x79\x73\xd7\xda\x88\x2e\xd1\xd6\xe4\xd9\xc5\xa4\x6e\xc2\xc2\x19\x40\xad\x33\x89\xa1\x86\x01\x4e\xe9\x72\x78\xe5\x35\x09\x88\xb1\x5e\xcd\x9e\xa7\x45\x6b\x3c\xb5\x5e\x4d\x30\x93\xf1\x3a\x87\x5b\x50\xd6\x51\x63\x78\xec\xaf\x58\xd7\x52\xc6\x37\x4e\xd1\x56\x38\x40\x93\x11\xfc\xd3\x79\xd1\x22\xc8\xd8\xc5\x9b\x86\xf4\xe8\xdc\x46\xad\xb7\x30\xa9\x33\x84\x6e\x0b\xd2\x48\xd3\x60\x82\x52\xd9\x70\xb5\x04\xc8\x13\xc6\xde\xa9\xfc\x88\xa3\xde\x64\x19\x56\xdc\xa2\x91\x20\x4d\x39\x0b\x6b\x39\x98\x1f\x8c\x0a\x6b\xcf\xc3\x1c\xa0\x74\x44\x20\x66\x2a\x9b\x35\xeb\x3f\xc2\x11\xf8\x10\xa3\xe8\x06\x25\x00\xb1\xe4\x9b\xdf\x85\x76\x65\xff\x32\xa9\xba\x76\x19\x4b\xbb\x77\xfb\x9c\x15\x41\x29\x64\x24\x4b\x98\x65\xf7\x3d\xed\x9f\x25\xb4\x9b\x42\x5a\xa2\x53\xd8\x07\xd9\x81\x82\x92\x76\x3a\x51\x3e\xc8\x07\x47\x34\x4f\xba\x0a\xcf\xe5\x93\xcc\x26\xb1\x33\x0b\xb9\xad\xe6\x6c\x4e\x88\xcf\x1b\xae\xd6\xd6\xe7\xb7\x50\xe6\xc7\x23\x9d\x7b\xcb\xfa\x3f\xbe\x45\x40\x5a\x63\xb9\x6d\x50\x34\xcc\x0c\x07\xff\xc3\xb5\x08\x58\x08\x1d\x19\x55\xe2\xd2\xfe\x5b\xe5\xfd\xa7\xa8\x99\x69\x43\x76\x8b\x05\x51\x70\xb7\xfd\x52\xf0\xa3\x20\x97\xfe\x1b\x7a\x94\xf1\xbf\x87\x9a\x0c\xba\xbe\x10\xac\x9a\x7c\xc1\xf9\xf5\x50\x68\xc4\x8e\x3c\xcc\x06\x51\x36\x43\x10\x18\xd3\x8d\x20\x10\x9d\xc9\x5d\x99\xcc\x2b\xbe\x7c\x62\x7a\xb1\xa8\xaa\x5f\x43\x16\x13\xb7\x90\xc2\xe6\x52\x6c\xf0\x4f\xdc\x9e\x55\xf5\x1c\x05\x5f\x3c\x20\x45\xa6\x75\xe3\xa1\xe5\x4b\xa4\x09\xf7\xae\xfa\x7e\x4a\xa0\x7a\x2b\xbd\x5e\x4a\xb1\x63\x21\xa9\xf0\x99\x69\x43\x91\xfd\xa6\x8a\x74\x58\x1e\x2f\x1f\x11\xdd\x9a\x6d\x52\x4b\x1b\x83\x26\x0d\xb5\x7b\x72\xef\x29\xc2\x8c\x8d\xb5\xc3\x7f\xd1\x85\xb7\xc2\xd8\x45\x50\x90\x65\x3a\xf3\x32\xdb\xc8\x2b\xfb\x0d\xb5\xdc\xca\xbf\xb6\xb2\x8c\xaa\x35\x05\x25\xcb\x54\xcc\x84\xe5\x53\xe1\xcf\x39\x54\xb6\x12\x39\x3e\x79\x93\xff\x7e\x8b\xf5\xec\xe3\xf1\x45\x09\x4d\xd7\xa2\x7c\xb4\x7f\x22\x74\x76\xf2\x89\x23\x52\x51\xf7\x72\xb3\xba\x77\x6b\xb7\x73\xaf\x0c\xc5\xf7\x86\xa3\xfb\x9e\x93\x1a\x53\x0c\xfb\xd8\x91\xcb\x5a\x5d\xfe\x25\x16\x9e\xf9\x33\xcc\x82\xc9\x08\x0f\x32\x39\x61\xa1\x20\x15\x8e\x4b\xbd\x71\x13\x4e\xf1\xf9\x01\x08\xb8\x15\xc2\x89\xd4\xe9\xa9\x58\x9e\xc6\x4c\x05\xfb\xb4\x2a\x21\xb2\x3d\x16\xe2\xa6\x46\x78\xae\xcf\xab\x65\xcd\x9a\x80\x6c\x59\x81\x03\xd4\x1f\x70\x09\x77\x63\x17\x83\x1f\xed\xdd\x1c\x90\x02\xd4\xa9\x22\x04\xf9\x7b\xa9\x49\x0c\x61\x46\x98\x03\x07\x21\x02\x52\x4b\x9d\xf5\x19\x00\x5f\x98\xaf\x54\xd6\x0c\xa5\xba\x60\xb5\x5b\x09\x6a\x4a\xc2\xb1\x6e\xb9\xcc\x81\x97\x3c\x31\x35\xd3\xfb\x68\x73\xdd\x96\x53\x80\x0a\x22\xbb\x5d\x0d\x61\x17\xca\x5d\x91\x65\x53\xbe\x39\xc9\xa3\xb5\x11\xeb\x3d\xb7\x30"}, +{{0x12,0x38,0x0c,0x45,0xa7,0x9a,0xde,0x0f,0x48,0x3c,0x88,0x1a,0xaa,0x37,0x30,0x43,0x8b,0x08,0x35,0x90,0xf4,0x04,0xdc,0x9e,0x60,0x1f,0x76,0x15,0xf3,0x75,0xa6,0x28,},{0xd6,0x6f,0xc5,0x9a,0xe9,0x17,0xf7,0x6d,0x24,0xce,0x8a,0xb8,0xee,0x03,0xfb,0xcb,0x71,0x5d,0x5e,0xea,0x4b,0x08,0x39,0x2b,0x59,0x1e,0x64,0x85,0x91,0xc7,0x3c,0x89,},{0x02,0xb2,0x51,0x74,0xa3,0xdd,0x52,0x19,0xed,0x48,0xb2,0xc9,0x4c,0xa2,0x12,0xb6,0x3a,0x6a,0x3a,0x25,0x97,0x70,0x3c,0x07,0xb7,0xf0,0xc9,0x65,0xc3,0xc6,0xac,0x2e,0xb4,0x50,0xef,0xe3,0x87,0x16,0xa2,0xa2,0x8b,0x3f,0x89,0x84,0x6b,0x06,0xeb,0xdc,0xa4,0xbd,0x09,0xaa,0x58,0x1f,0x24,0xe8,0x4d,0x80,0xfc,0x10,0xac,0x1a,0x00,0x0a,},"\x68\x45\x23\xc2\xe7\xfa\x8b\x4b\xd7\x54\x8c\x4b\xac\xaa\x86\x78\xa3\x30\xdb\xbb\x96\x06\x32\x94\x01\x66\xb2\xcc\x9a\xfc\x15\x35\xc8\x0c\x11\x2c\x8d\xc4\xad\xa7\x62\x92\x33\xfe\x90\x90\x55\x23\x7d\x51\x3e\x29\x2a\xf1\x5a\xd7\x69\x2f\x11\x5a\xa0\x92\xda\x65\x75\x32\xf5\x18\x99\xc3\xf7\xf5\xd9\xd4\x07\xed\x5c\x16\x3e\xb3\x95\x04\x80\xa4\x12\x2a\x09\x92\x98\x1f\x07\x7b\xc8\x67\xf9\x06\x07\x54\x07\xba\x98\x49\xc4\xea\x04\x73\xce\x54\x0a\x79\x67\x44\xef\xa3\x86\x03\x78\xe1\xb8\x93\x43\xe5\x83\xd0\x80\x7e\x5a\x67\xc4\xd5\xbd\x7c\xe6\x41\x29\xfe\x90\x2b\x8c\xfa\xbd\x2c\x21\xfa\x3d\x2a\x10\xe9\xbf\x9e\xa5\xe5\x47\x3a\xe2\x50\xc9\x16\x05\x09\x97\x26\x78\xf9\xa7\x40\xe6\xca\xdb\x3b\x52\xf5\x02\xfa\x61\x6c\xff\xae\x1d\xef\x89\x3d\x54\xe4\x1e\x54\xd3\x26\x46\x4c\x9f\x43\x5c\x63\x50\x5f\xb1\x5e\x3e\xea\xf5\x02\x1c\x65\xdc\xd0\x10\xf8\x40\xaa\xb3\x17\xc8\x60\x5d\xfb\x1a\x0c\x8a\x3d\x55\x49\x86\x1b\x69\xaf\x2c\x93\xd8\x6c\x98\x1d\xf3\xa5\x1c\x5b\xf5\x78\x5c\x2f\x85\x26\x10\xe4\x4f\xa4\xff\x1c\x71\x61\x15\x2e\x56\x18\x38\x47\x44\xfe\x83\xba\xbf\x0b\xcb\x75\x61\x78\x9a\x02\x31\x25\xf6\x24\x2a\x18\x3c\xac\x95\x49\xc9\x32\x73\x3a\x86\x8a\xa1\x82\x65\x6e\x2b\xa0\xa8\xc0\xbe\x10\x69\x96\xa8\x5c\xeb\xf1\xbd\xad\x12\x3b\x98\x2b\x4e\x05\x55\x10\x87\x94\x82\x02\x1d\xae\xa9\xd8\xf2\x6c\x58\x8e\x6c\xd1\x01\x26\xcb\x31\x96\x88\x03\x56\xbe\xe8\xf2\x98\xbc\xa3\x06\xec\x56\x99\xc7\x57\x6b\x76\x50\x87\xc2\x53\xa6\x02\x14\x01\x0c\x6e\xd7\x0d\x87\x1c\xfc\x87\x38\x01\x8a\x0e\xdb\x57\xf1\x06\xb4\x21\x8d\x85\x5e\xab\x2c\x91\xf3\x9f\x85\x8b\x3f\x25\x90\x56\x31\xa0\xee\xe2\x98\x56\xfd\x34\xf7\xb8\xc9\xba\x51\xc1\xc4\xc6\xa7\x35\xd6\xc7\xa1\x3d\x22\x0d\x7a\x56\x6c\x3f\x50\x6c\x72\xbc\x74\x17\xab\x37\xf0\xd6\xd7\x96\xff\xc7\x1d\xf9\xdc\x7c\x6e\x13\x7d\xa5\x6b\x7a\x3e\x10\xcf\x0b\x1a\xbb\x3f\xfb\x70\xbc\x66\x29\x3b\x5d\x75\xb4\x05\xed\x8b\xec\x0d\x6f\xcd\x06\x92\x5c\x38\x11\x68\xac\x18\x8d\x0b\x8a\x1a\xf0\x83\x9f\x5b\xde\x84\x3b\x69\x91\xe5\xa5\xd6\xcd\x66\xfe\x6b\x0f\xde\x86\x7c\x08\x6e\xd4\x38\x76\x91\x9a\x1b\x72\x33\xd8\xd7\xe1\xd2\x74\x2f\x61\xc7\x7d\x8e\x59\x91\x68\x9c\x83\x28\x67\x66\x55\xb7\x6a\x37\x50\x56\x0e\x75\xd1\xc7\xe8\x5e\x3c\x00\x85\x05\x93\x31\x09\x4b\xba\x57\x10\x03\x2c\xf6\x79\xa5\x25\xc7\x8b\x31\x70\x0e\x6d\x91\xf7\x52\x94\xc4\x22\x48\x92\x97\xe1\x73\x59\x43\xe4\x17\xfc\xd3\x55\x80\x58\x2f\xdd\x02\x39\xb5\x11\x46\x53\x0c\xc0\x9d\x83\xb2\x8f\x0a\x1d\x64\x22\x20\xdf\xb9\x9b\xad\x62\xf3\x95\x41\x03\x50\x81\xd6\x5d\x77\x8d\xdf\x32\x39\xba\x0e\x6f\xa9\x91\x4b\x17\xb3\x97\xa5\x34\xcb\x8f\xd3\xb4\xff\x42\xa8\xd8\xc8\xee\x66\x15\x3f\xbb\x1f\xf0\xfa\x54\xf7\xbd\x03\x27\x85\x16\xe6\x34\x1a\xf8\x0f\xcd\x1f\xce\xe7\x0c\x35\x9d\x20\x53\x68\xac\x49\x0d\x75\xa3\x54\x51\x2d\xa4\x6b\xa7\x63\x4c\x15\xb2\x84\xb2\x44\x77\x80\x8f\x17\x63\x33\x60\xa4\xb4\x9f\xb3\xbc\xaa\x84\x18\x41\xcf\x92\x41\x7e\xb2\x4c\xe4\x82\xd5\xa2\x4b\xfd\x2d\xac\x37\x22\x31\xda\x53\x9a\x05\x42\x00\x02\xff\x7a\x20\xc4\x76\x09\x7d\xa0\x6f\x59\xf0\x33\x14\xe6\x05\x9f\xad\x88\xc5\x0c\x3b\xaa\xc0\x3c\xef\xa7\xcd\x82\x11\xd2\x46\x1b\x16\x60\xea\x6b\xcf\x47\x68\x38\xc9\x1a\x10\x07\x4e\xb4\xb4\x0e\x6e\x97\x4a\x94\x5a\x67\xf6\xee\x69\x04\x23\x1e\xf0\x41\x88\xf1\xea\xd5\xba\xf3\x56\x94\xef\xe3\x01\xed\xc7\xe8\x66\xda\x23\xb5\xa6\xc5\x8f\x01\xb2\xa5\x2c\xf3\xab\x80\x5e\xdc\x5c\x13\x68\x62\x6b\x95\xb9\x4e\xb4\x64\x5b\x69\x3e\xc8\x80\xf2\xb8\x11\x7a\x69\x3a\xfb\xdc\xd2\x48\x24\x31\x89\x0f\x41\x0b\xc5\x80\x53\x0f\xef\x37\x58\x79\xc2\xe4\x60\x49\xca\x89\x1a\x2c\x3e\xcd\x60\x43\xae\x80\xd8\xaf\x34\x66\x34\x67\x4c\x6d\xfe\x90\x59\x97\xde\x5d\x05\xd6\x20\x09\xee\xed\x27\x75\x02\xfb\x5a\x5a\x31\x55\xee\xee\xb6\x73\x48\xb6\x0d\x89\xa3\x4a\x78\x12\x63\x9f\x54\x1f\xfe"}, +{{0xd1,0xb3,0x43,0x0d,0x4e,0x63,0xaa,0xbf,0xa9,0xef,0x96,0xbc,0xba,0xf1,0xfa,0x6a,0x9e,0xb5,0x21,0x9d,0xd4,0x4d,0xf3,0xb1,0xa6,0x15,0x63,0xdf,0xfe,0x1c,0xcb,0x28,},{0xc2,0x8a,0x05,0x19,0x52,0x45,0x29,0x0e,0xcd,0x38,0x53,0x55,0x85,0xce,0x51,0xf3,0xc2,0x35,0xc5,0xd6,0x50,0xc8,0xc5,0x7c,0x2f,0x79,0xbb,0x0a,0xc0,0xe8,0x08,0x34,},{0x4c,0xb6,0xff,0x5d,0xd7,0x06,0xb1,0xae,0x81,0x6c,0xdb,0xaf,0x9e,0x9e,0x1e,0xdc,0x80,0xa6,0x62,0x84,0xf9,0x46,0x52,0xd5,0x0e,0xc1,0x4e,0x28,0x3b,0x2a,0xdc,0x59,0x2f,0xd0,0x84,0x33,0x71,0x44,0xff,0xa7,0x12,0xdc,0x34,0xce,0x8e,0x61,0x06,0x68,0xa6,0x5e,0x96,0x9f,0x05,0xce,0xb5,0x47,0x86,0x30,0x4d,0x0d,0x58,0xd3,0x1a,0x08,},"\x07\x6c\x0c\x87\x62\xe4\xbc\x00\x3c\x36\x0a\x12\xa1\x95\x98\x05\x05\x51\xd1\x6b\x4b\x8d\xa0\xfb\x9c\x4a\xfc\xc8\x1a\xdb\xe6\x19\x95\xf2\x5c\xbc\x28\xdc\xa4\x20\xbf\xa9\x46\x10\x54\xd3\xee\x00\xad\x78\x18\x3e\x7f\x26\xdf\x68\x98\xaf\x9a\x4d\x22\x5f\xca\xb6\x7c\x04\x2e\x9a\x13\x52\x5d\x1f\x75\xff\x0e\x3d\x8d\xa8\x08\x96\xb7\x28\xf3\xe2\xdb\x65\x94\x4a\xe0\x71\x7d\x77\x59\x90\xb5\x9e\x5b\x70\x43\x4b\xd4\xb3\xee\x45\x2f\x10\xac\x06\x10\x57\x0b\x38\x22\x08\x32\x96\x8f\x54\x4d\x3e\x4d\x11\x9b\x1d\x4b\x50\x15\xc6\xcd\xf4\xcf\x22\x0b\x56\xb5\xc0\xcc\xd8\xe3\x98\xd5\xe4\xa5\x8d\xa3\xb0\xe2\xb2\x70\xa5\xd3\x9b\x82\xab\xb7\xf9\xd2\x7a\x41\x90\x18\x55\x0b\x62\x00\xae\x51\xc8\x48\x82\xf0\x86\xae\x7e\xa5\x35\x16\x71\xb6\xdd\x96\x09\x23\xad\x6b\xef\xc1\x34\x09\x87\x9a\x8d\xf6\x19\xbd\xf6\xc8\x8a\x6f\xe1\xec\xc0\xf0\xf3\xaa\x21\x9f\xb6\x19\x02\xbe\x48\xa5\x3d\xf2\xbc\x66\xc5\x6f\x1c\x1d\x17\xf7\xe6\x16\x7d\x25\x51\x65\xf1\x74\xba\xa9\xca\xf5\x3c\x73\xcb\xbb\x7c\xc2\xc7\xc0\x87\xf4\x3a\xbe\x2a\xed\x5a\x21\xfe\x42\x90\xb8\xd6\x79\x60\xa8\xa9\xcb\xc2\xa5\x7a\xbe\x22\x65\x4d\xc1\x84\xcf\xf9\x16\x8b\xb6\x97\x27\x03\x75\xfe\x88\xd5\xc4\x9c\xf9\x5b\x06\xcf\x9d\x0d\xac\x81\xfb\xd9\xc0\xd7\xb8\x2d\x05\xed\x2c\x3f\xd4\x9c\xcc\x29\x40\x44\x41\x71\x25\x45\xf9\xa9\x91\xe4\xf0\xdd\xb6\x21\x90\x83\x82\x96\xf9\x67\x29\x9a\x38\x60\x72\x26\xd8\xa6\x81\xf0\xa8\xf3\xc4\x38\x4f\xd1\x8b\x30\x25\x7c\x46\x3c\x0a\xbd\x0f\x4f\x6f\x12\x25\xa5\x1b\x76\x2d\x6d\x0a\xc7\xd5\x9c\xd2\xef\xd6\x98\xb8\xd1\x3e\x23\xd7\x04\x09\xf6\xb0\x7d\x69\x5c\x16\x71\xcd\x6f\x59\x44\x3b\x1d\xb0\xab\x35\xb9\xdc\x06\x40\xe4\xc6\xd1\xac\x50\x47\x5d\x28\xef\x94\xf8\x17\x90\xe2\xe5\xb2\x54\x55\x14\xb2\xa4\x9c\x5c\x21\x53\x45\x9b\xe5\x40\x89\x0f\x53\xbc\x18\xe4\xa1\x6d\xcb\x5d\xcf\x50\xf3\x7a\x95\xc6\x06\xfd\xf4\x85\x98\xe5\x2a\xf3\x17\x9a\x20\x48\x61\x5d\x93\xd9\x7e\x05\x99\xb7\x08\x8c\x11\x74\xbb\x9f\x15\xe3\x70\x18\xf9\x9a\xcb\xce\x5b\x13\x02\xf8\xd8\xce\x2a\xb8\x54\x37\xfe\xeb\x0c\xaa\x77\x84\xdc\x83\xc9\xe7\xc3\x6f\xe0\x59\x90\x6b\x03\x0a\x86\xa3\xde\xd0\xab\x9d\x8b\x73\x52\x9d\x47\x5e\x66\x1a\x08\x08\xd6\xd3\xf0\x90\x7f\x85\x28\x87\x3f\x08\xd5\x74\x8b\xe1\xd6\x97\x12\xe8\x52\x62\xd7\x7b\xdf\x13\xbf\xd1\x8a\x5c\xde\x6f\x71\x46\x26\x73\xab\x29\xb1\x61\x73\x15\xa9\xa6\xe9\x36\xa8\xe8\x1a\x8e\x43\xbd\x0f\x66\x44\xa5\xc6\x9e\xaa\xac\x89\xbd\xaa\x99\xcc\xa8\x03\x83\x37\x05\xe5\xaf\xa6\x9b\x3b\xd1\xd0\x25\x2b\x85\x46\x50\xf2\x19\x97\x91\xe6\xac\xa7\xc7\x5a\x86\x12\x83\x21\x62\x33\xa2\x63\x3a\x6a\xef\xf9\xd3\x01\xee\x5c\xb4\xdd\x72\xc0\x8a\x45\xcd\xae\x8f\x54\x58\xc0\x95\xb2\x2e\x75\x9c\x43\xb4\x9b\x98\xe9\xf4\xcb\x33\xd5\xde\xa8\x79\x44\x9e\xae\x73\xcb\x87\x4c\x73\x59\x43\x25\xeb\xf6\x8c\x1e\xd4\x06\x4b\x6f\x61\xab\x2f\x01\x4a\x2f\x19\xf3\x2e\x12\xb3\x3c\x5e\xaa\x8a\x29\x20\x4d\x5e\xba\x58\xdc\x07\x50\x72\xfe\x39\x9b\xe7\xd1\xab\x18\x08\x20\x8f\xb4\x08\x12\x3b\xdc\x0b\x4a\xb3\x13\x0f\x9f\x70\x6d\xc3\xeb\x19\x4b\x60\x5e\x73\xa3\x2f\x12\x5a\xe4\x91\x28\x5c\xe6\x03\x9f\xb6\x23\xc3\x8b\x81\xd5\xab\xa0\xf5\x59\x9f\x6c\x86\xe8\x72\x48\x6b\x4e\x96\x49\xda\xff\xe3\xa3\xd0\x6c\xb0\x73\xdd\x3b\xc6\xf4\xe1\x0a\x18\x70\x0e\x45\x72\x2d\x78\xa6\xb0\x97\x2d\xc9\x4d\x5c\x7a\x7b\x66\x41\x75\x7b\x79\x60\x75\x71\x9d\x7b\x8e\xc3\x6a\x1e\x79\x6f\xb5\xf8\xfe\x6f\x1b\x79\xa0\x85\x9c\xb4\xd6\x7c\xec\x05\xed\x91\x4c\xfa\x32\xc1\xdd\xfe\x21\x8e\xf9\x63\x43\x6c\x3a\x11\x48\xac\x2c\xf9\x09\xdf\x73\x59\x89\x06\x57\x46\x3a\x4e\xa2\x5f\xed\x59\x61\x8a\x06\x81\xa1\x21\x7e\x22\xd6\x4e\xf9\xd9\xb4\x55\x9d\x0a\x0f\x6b\x3c\xe8\xd8\x47\x93\x0b\x23\x23\x01\xca\xf4\x4c\xdf\x7a\x3f\x18\xa2\xac\x13\x0b\x92\xcf\xd9\xc0\x33\x60\x55\x7b\x5f\x7c\x47\x75\x46\x2a\x10\x71\xf7\x03\x44\xc7\x18\x37\x4b"}, +{{0x03,0x3e,0x00,0x3d,0x7a,0xab,0x7b,0xc7,0xfc,0x8a,0xc2,0x04,0xc7,0x33,0x79,0x9a,0xe5,0x53,0xc3,0xfe,0xc5,0x3f,0x10,0xdb,0xf7,0x95,0xb5,0xf4,0xb8,0x7f,0x1c,0x95,},{0x68,0x2f,0x46,0xf5,0xc0,0x56,0xdd,0x45,0xba,0x0b,0x5a,0x78,0x20,0x31,0xf9,0x59,0x6a,0x73,0xaa,0x29,0x2c,0xa2,0x32,0x6b,0xed,0xa7,0x4a,0x52,0xfc,0x32,0xb7,0x16,},{0xed,0xb4,0xe0,0x20,0xd6,0x76,0xfa,0xc6,0xa8,0x45,0x53,0x48,0x80,0xbf,0x61,0x36,0x37,0x4a,0x8b,0x7f,0x2c,0x53,0x85,0xbb,0x9e,0xe2,0x25,0x38,0x1f,0x49,0x4e,0xfb,0x74,0xa5,0x5b,0x41,0x3a,0xe0,0xea,0x70,0xad,0xd6,0x1b,0xfd,0xfb,0x87,0xfb,0x42,0xd5,0xbc,0x0c,0x53,0x59,0xdd,0xdd,0x57,0x3d,0x53,0x8a,0xe9,0x3a,0x6b,0x36,0x09,},"\x59\x6a\xa2\xc4\x0b\x33\x18\x87\x89\x38\xeb\xc1\x38\xdb\x27\x4b\xb3\x8a\x52\x01\xeb\x7c\xaf\x87\x5e\x6c\x64\x57\x91\xda\xe0\x12\xbd\xef\xd4\x85\xe6\xbd\x9d\x84\x99\xc4\x2a\x2a\xe8\x6c\xf3\x2b\x18\x00\x2e\x76\xbb\x58\x2c\xca\x0d\xec\x48\x15\xde\xd8\xa1\x21\x1f\x8f\xc8\x85\x7f\xce\x1d\x57\xf6\x15\x1d\x88\x78\x7b\x97\x8f\xab\x56\xbf\x92\x6b\x15\x33\xe1\x94\x99\xe8\xbb\x99\x15\x8c\xdd\x6e\x98\x0f\x6b\xa5\x43\xae\x83\x1f\x9d\xd1\x34\xb0\xfe\x6d\x5c\x24\x88\x7d\xc7\xa8\xd4\x78\x1d\xd9\xb7\xfc\x5d\xc9\x46\x4b\x04\x5c\xbf\x9d\x1e\xf5\x03\x6b\x5b\xf2\x8b\x54\x9a\xc7\xaa\x8f\xaf\xb9\x1a\xdc\x9f\xec\xa7\xa1\x45\x54\xd1\x10\xe3\x10\xc7\x49\xe4\x85\x33\xf3\x59\xc7\x0f\x05\xfb\x7a\xed\xef\x13\x66\x36\xb8\xef\x72\x23\x88\x65\x39\x86\x4e\xe5\x2d\x34\x11\x8b\x4b\x8b\x74\xe0\x8f\xe6\xb6\x58\x96\xe4\xb1\x9b\x6d\x7c\x3f\x25\x28\x26\x55\x85\x48\x17\x10\xd2\xd7\x49\x48\xeb\x4b\x17\x08\xa5\x0f\xa7\x40\x21\xbd\xa4\xb3\x61\xbc\x68\xd2\xa5\xd2\x02\x10\x9f\x8d\x28\xd8\xaa\x67\xd7\x8c\x11\x36\xcd\x2e\x90\x3c\x8d\xfa\x17\x5a\xf7\xbd\x96\x3b\x73\xda\xe4\x95\x87\x3c\xcd\xae\x62\xbf\xef\x88\x56\x36\xdd\x83\x55\x0f\xf9\xc0\x5c\x37\xba\x33\x89\xd1\x54\x36\x85\xd8\x94\x83\xb0\xc1\x04\xe7\xef\xbb\x77\x02\xc5\xa0\x39\x8a\xc7\x20\x48\x4c\x50\x93\x68\x35\xee\x9d\xf2\x53\xf0\xef\x8c\xbe\xf3\xe0\x7d\xe9\x69\x51\x1c\xcb\xf8\x75\x57\x49\x3a\x0b\x97\x2e\xf0\xe8\xe6\x29\xcf\x38\x22\xdb\x21\x28\x6e\xd7\x27\x66\x1b\xd3\x17\x86\xfc\xa1\x42\x11\x06\xda\xcd\xee\x1c\xaa\xf4\x94\x54\xe8\x54\x79\x4f\x70\x4d\x22\xa9\x5a\x4c\x8e\x6b\x1c\x2f\xee\xa5\x7e\x56\x23\x8c\x20\x96\xf1\xcc\x57\x86\x47\xfe\xa5\x44\xd6\x76\x44\x82\xbd\xf5\x14\x88\x79\xa2\x5f\x94\x3d\xb1\x6f\x29\x02\x1b\x9e\xcf\xe3\xe0\x90\xb4\x25\xc8\x1c\x70\x09\x84\x2e\x1c\x7a\x02\xd9\x1c\xa6\x0c\x12\x01\xc3\xbd\xae\x9c\x53\x73\xaf\x03\xf2\xf4\xdb\xef\x40\xde\x8d\x9b\x21\xfe\xd6\x8d\xee\x51\x0d\xe0\x42\x72\x34\xca\xa1\xc2\x0a\x3a\xe5\x49\x95\x48\x34\xc9\x33\x73\xd9\x13\xb8\x75\x0f\x23\xa0\x37\x80\xd7\xa9\x45\x4e\xd6\xfe\x51\xfd\x2d\x27\x6b\x9d\x4a\xa3\x2d\xe0\x5e\x03\x81\x6e\x64\xe9\x46\x6f\x4f\x0e\x22\x46\x51\x42\x8d\x34\x2c\xbc\xc6\x97\x17\x0a\x47\xef\x99\x6b\xda\xcb\xce\x91\x11\x7c\xa1\xf8\x45\x5b\x25\xb2\xb0\x84\x43\xe9\x91\x4e\x3d\x90\xc4\x89\xee\xaa\x77\x31\xdd\xea\x21\x23\xd5\x5d\x67\xb1\x66\x83\xfb\x7c\x82\x36\xaa\xa5\xa1\xb0\xfc\xaf\x8d\x17\x00\x11\xdb\xe9\xaa\x28\x57\xbe\x61\x2c\xbb\x85\xef\x69\xe5\x68\x31\xb4\xda\xcf\xbc\x7a\x59\xb4\x65\xa6\x6d\xc7\x41\x2d\xdb\x3d\x6a\xf4\xeb\xfd\x70\x58\x64\xe7\xd4\xfb\x99\xa6\xcc\xb4\x8b\x11\x83\x68\xfe\xab\x02\xa3\x40\xc4\x32\x76\x8d\xe0\xe0\x67\x87\x1e\x9e\xa8\x08\xd6\xd9\x93\x81\x58\x29\xe7\x1f\x6c\x04\x2b\x66\x49\x95\x09\x8f\xee\x94\xd5\x43\xdf\x15\xe5\xb1\x69\x57\x03\x1b\xd2\x38\xbc\xad\xbb\xdc\xc5\x76\xaf\xfb\x64\x03\x03\xd6\x9c\x5b\x25\x0b\x3a\x53\x9a\xfd\x12\x7f\x7e\xe2\x60\x9e\x52\xe5\x15\x4f\xbd\xff\x3e\x45\xf9\xc4\x40\x66\x65\x6d\x56\x1e\x0f\x64\xdf\xf2\x80\x5d\xf8\x8e\x30\xa3\x80\x53\x08\x22\x41\x3a\x7a\xb7\x6a\x1b\x9a\x86\x53\x78\xd2\x47\x63\x06\x9a\x81\x40\x02\xa9\xa9\xd0\x37\x95\xca\x8d\x2b\x5b\xd1\x09\x03\x93\xe9\xe4\xb1\xff\x7d\x7f\x0e\xb8\x4e\x71\x2a\x01\x8f\x68\xc9\xe3\x84\xf0\xa0\xae\xf3\x96\x78\x79\x28\x4f\x40\x9e\x30\xd2\x36\x50\x86\xe6\x69\x52\x27\x8c\xa9\xb6\xf9\x0e\x8f\x69\xa4\x8d\x9b\x28\xbb\x4c\x4e\xd6\x32\xab\xca\x3a\xf4\x14\x4d\xa7\x42\x2b\xf5\x19\x92\xf7\x34\x73\x14\x53\xc7\xa3\x3e\x15\xe5\x9f\x53\x08\x12\x9d\x6a\x77\x4a\x94\x58\x6f\x72\x33\x11\x17\x91\x76\xc0\x94\x8f\xff\x4e\x30\xc1\xb9\x59\x81\x2c\xac\x97\x7c\xc7\x43\x47\xb0\x07\x94\x0f\x2f\xb9\x62\xa9\x0d\x66\x06\x6a\x6d\xe8\x80\x19\x84\xde\xe4\xa5\x32\xd4\xb0\xac\xd6\xdc\xaf\x06\x72\x7b\xab\x70\xb3\x86\x62\x32\x23\x4c\x91\x00\xbf\xdc\x66\x9f\x77\xca\x49"}, +{{0xee,0x55,0xfc,0xf7,0x0a,0x27,0x5c,0x72,0x6b,0xd4,0x85,0x66,0x83,0xb3,0x47,0xde,0xcf,0xd4,0x22,0xf1,0x82,0x6c,0x07,0xa9,0x32,0xcb,0x85,0xbe,0x9f,0xa4,0xef,0x3c,},{0xdf,0xcf,0xfb,0x5e,0x15,0x53,0x78,0x9d,0x56,0xa9,0xf3,0x91,0x4b,0xce,0x50,0x0d,0x07,0xc5,0xac,0x31,0x1f,0x92,0x78,0x54,0xb2,0xcf,0x1e,0x58,0x33,0xc0,0x32,0x37,},{0x9d,0x8c,0xb2,0xea,0xf3,0xff,0x3e,0x0c,0x2b,0xc6,0x72,0xe1,0xd2,0x55,0xc5,0xb8,0xe8,0x07,0x31,0xbf,0xf6,0xf6,0xab,0xa5,0x17,0xe1,0x33,0x54,0xe8,0x51,0x08,0x0f,0x4a,0x8b,0xb8,0x12,0x1b,0x26,0x24,0x24,0x4c,0x9e,0xe9,0x5c,0x8a,0x09,0x2f,0x10,0x37,0x03,0xfb,0xe6,0x6f,0x9c,0xba,0x10,0x0d,0x2e,0x91,0xed,0x77,0x4a,0xc9,0x07,},"\xb8\xc8\x45\xcf\x7c\x54\x85\xf0\x62\x2d\x1d\xdc\x17\xf7\xa0\xf6\xf0\xfd\x70\x74\xfe\x19\x4b\x0e\x0c\xd4\x26\x50\xcf\xc8\x17\xf5\x7f\x09\x5f\x8c\xdf\xad\x1e\xbe\x0d\xfb\xc1\xbd\x76\x17\xab\x4f\x20\x4e\x9d\x55\xd8\x1a\x7c\x8a\x43\x39\x40\xec\x6f\x17\xc8\xa8\xe3\xd5\x6c\x1a\xfb\x0a\xf3\x74\xbd\x32\xd5\x4e\xf7\x13\x2d\x26\xb8\x9c\x47\x0c\x2a\xb5\xbe\x16\xfa\xbb\x4c\x75\x19\x3d\x6d\xa5\x9b\xa2\xfd\x15\x7e\x9e\xa4\xe0\xc5\xc0\x8a\x52\x02\xf5\xed\xc6\xa6\x17\x01\xf0\x8b\xb3\x44\xca\x64\x55\xd7\x5d\x14\x5a\xdb\x24\x4c\x53\x4c\x8c\xfc\x62\x3f\x4d\x4b\x67\x67\x59\x4b\x39\xa7\x69\x0b\xee\xec\x4d\xf9\x74\x6a\x57\xff\xee\x05\x14\x54\xc4\x27\x8e\xa4\x3c\x81\x0f\xf1\x3c\xd7\x69\x61\x5f\x9d\x05\xd4\xfe\x4a\x51\x58\x3e\x80\xc0\x15\xdc\xfe\xd9\xaf\x05\xf9\x3d\x05\x4d\x34\xff\xd9\x39\xbd\xd8\xf0\x51\x8f\xa3\x03\x0a\x96\x4d\xc9\xd8\x0d\xf0\x0f\x16\x35\x82\x40\x72\xcd\xf2\x9b\xc8\x02\x59\x20\x9d\x50\xf5\x6f\xca\x9f\xbd\x6a\xe1\x51\x4a\x67\x19\x89\xce\xa4\xf6\x84\x6b\xc1\x91\x79\x09\x7c\xca\x40\xc6\x24\xd7\xed\xbf\x91\xfb\x5b\x25\x39\xeb\xbd\x50\x2d\x36\x46\x71\x14\x30\xba\xe4\x23\xfd\x11\x58\x48\x09\x33\x18\xb7\xd0\x87\xef\x1e\x3b\x89\x4b\xc3\xb9\xea\x27\xaf\x85\x3f\xca\x85\x95\xd3\x6f\xb7\x29\x99\x69\x16\x2f\x2e\xd6\xa2\xb5\x50\x75\xb2\xc6\x30\x80\x28\x57\x17\x6d\xec\x4c\xb5\xac\xf2\xb1\x3a\x35\xa9\x94\x9b\x91\x2b\xb5\x7d\x81\xeb\x0c\x8a\x8a\xdf\x3c\xf6\x4c\xb5\x71\xbf\x5f\x3d\x71\xf9\x87\xd6\x4d\x74\xe9\x19\xa0\x03\x36\xe5\x7d\x35\xee\x4e\xec\xfc\x65\x70\x00\xdd\x5b\x12\x99\x5e\xe1\xb1\x16\x59\x1c\xe5\x8e\x56\xde\x25\xb2\x9c\x94\x82\x9d\x1d\x68\x52\x1b\x95\x58\xe4\x72\x5e\xc7\x70\x39\x06\x9c\x0c\xd1\x7b\x2a\x00\x33\x59\xe9\xe1\xe1\x12\xc7\x59\x01\x76\xce\xbc\xe7\xf0\x01\xf1\xd1\x36\xe8\x18\xf4\x81\x8c\xfd\x94\x74\x5a\xfa\xab\x56\xf1\xa4\x06\xf9\x7d\xd9\xe6\x1b\x73\x52\x66\xd6\x82\xad\x7d\xf2\x6d\xd7\x0c\xde\x0b\x57\xfe\xa7\xdb\x2d\xf8\x32\xfa\x88\xa3\x5f\x53\x97\x94\x88\x4d\xdc\x41\x21\x84\x03\x01\x6c\xb6\xd5\x22\x1f\x3f\xeb\x5d\x3a\xee\x4a\x98\x40\xa9\x13\x07\x2d\x29\xf8\xd1\xa9\x36\x7b\xb0\xbb\xf5\x45\xf7\xda\xe7\xc0\x0a\x0d\x0c\x03\x42\x23\x1a\xe4\x62\xbb\x74\x2e\x14\x98\xee\x58\x4a\xe6\xc8\x3f\x2f\x1f\x2d\x04\x52\xbe\xad\x98\x22\x68\xcd\x3c\xfd\xe7\x8f\xf4\x22\xe2\x26\xbf\x7b\x2a\xf1\x13\x77\x57\x79\x7f\xb0\x2e\x52\x75\xc3\x48\x09\xd5\x4c\xa9\xee\x2a\x65\x27\x5e\x6e\x5c\xff\xdd\x20\xad\x1f\xa1\xee\x0b\xd8\xb2\x1e\x04\xce\x82\x9e\x02\xcd\xb6\x3c\x48\xbf\xcd\xd8\x6d\x3a\x08\xc5\x97\x89\xc9\xd7\x8e\x36\x18\x1d\xef\xeb\x72\x27\x10\x72\x75\xed\x6b\x5c\xcb\x12\x7c\xd7\x2b\x37\x4e\x17\xf5\xee\x0b\x5e\x47\xb4\xb3\xe1\x4a\x8e\xc6\xd8\x6b\xb7\x50\x71\x87\xf2\x8d\xb3\x2b\x3f\x3f\xa1\xca\x13\x44\x6f\xe5\x25\x3e\xe7\x83\x64\x5e\x79\x42\x72\x79\x9a\x86\x3b\x4f\xca\x99\xe4\x43\xcb\xaa\x05\xde\x3c\x50\xed\xf3\xd5\xcd\x7c\x10\x52\x9c\x6c\x09\xa0\xc1\x45\x34\x06\xac\x7e\xca\xfa\x9b\x3a\x1f\x36\x9d\x68\xf3\xc6\x18\xf5\x8e\xfc\x35\x9d\xf2\xf3\xfc\xd2\x47\x8b\x55\xa4\x1a\x11\xf2\x48\x7e\x7f\x70\xec\x29\x3b\x3e\xcc\xc7\x00\xef\x44\x4a\x33\xd1\xea\xe9\x84\x9c\x5b\x76\xd2\x9a\xfd\x5a\x23\x86\x1a\xef\x4f\x2a\x7b\xa3\xf6\x66\x30\x1f\xde\xb5\xd3\xd8\xf0\xdc\x9e\xe2\xe0\x14\xb2\x4c\x74\x65\xde\xe3\xc0\x96\x4e\xdd\x49\xed\x49\xed\xab\xb5\xca\x7a\xfb\x99\x57\x4d\x00\x1e\x58\x12\xa0\x85\x23\x1f\x24\x1b\x6b\x08\xc7\x3e\x80\xfb\x44\xbb\x2a\xdf\x55\x4f\x14\xfd\x6d\xce\x94\xa6\xf6\x36\x23\xd9\xc1\xde\xb4\x1a\xd1\x01\x65\x1a\x6b\x67\xae\x52\x34\xda\xae\x81\x97\x9f\xbd\x82\x33\x89\x64\x9a\x3b\x0a\x06\xc6\x8b\x80\x46\x8a\x99\x1d\x30\x07\x74\x87\x51\xfa\x69\x28\x1d\xb1\xb9\x4d\x6c\x16\x0a\x1c\xab\x50\x94\x3c\xdb\xb8\xde\xa5\x75\x09\x06\xb3\xc6\x59\x5b\xb5\x80\xde\xdb\xfa\xe5\x74\x64\xcc\x7a\x65\x1d\x4c\x51\xdb\xb5\xfa\x98\x05\x97\xd1\x76\x69"}, +{{0x49,0xc2,0x98,0xa2,0xdb,0x3d,0x25,0x89,0xc9,0xfe,0x16,0xa4,0xe5,0x71,0xe5,0xaa,0x23,0xcb,0xaa,0x77,0x7b,0x86,0x47,0x02,0x90,0xa3,0xed,0xa7,0xa5,0xd3,0xe9,0x6b,},{0xda,0xc5,0x23,0xd6,0x37,0x4c,0x8f,0xf1,0x5f,0xc4,0xdd,0xc7,0x13,0x71,0x5a,0xc3,0x5c,0xf5,0x54,0x7f,0xc1,0xb1,0xb2,0x64,0x6b,0x63,0xfb,0x41,0xa7,0xf2,0x16,0x21,},{0x2a,0x43,0x9c,0x73,0xc9,0x81,0x17,0xfb,0x29,0x52,0xe2,0xb1,0x61,0xf7,0xf3,0xb9,0x9e,0x7d,0x39,0xbc,0x69,0x7f,0x79,0x40,0x75,0xdb,0x7b,0x63,0x4d,0x29,0xf1,0xff,0x57,0x24,0xf6,0x77,0xf8,0x31,0x2a,0xd5,0x15,0xb0,0x97,0xcc,0xa9,0xdf,0xc3,0x0e,0x79,0xee,0x8a,0x7c,0x9d,0xd7,0x28,0xbd,0xd4,0x5d,0xf8,0x59,0xc7,0xbd,0xe3,0x0a,},"\x35\x82\xee\xb0\xd3\x71\xdf\x38\x5d\xe8\x8b\xaa\xd3\x80\xcb\x0c\xdb\x60\xea\xb2\xba\xeb\xb3\xc7\x98\x37\x75\x3d\x08\xe1\xcb\x78\xc0\xbd\x76\xdd\x11\x04\x45\x49\x56\xd5\x71\xce\xb7\xe6\xb5\x71\xa5\x23\x68\x35\xd7\x84\xb5\x0f\xf6\x60\x57\xb1\x35\x95\xe7\xd0\xc8\xf2\x5d\x08\xae\x8b\x54\xb6\x12\x3b\xa0\x81\x51\xac\x7d\xb0\xc5\x6a\x98\x0f\x7f\x0b\xb3\x9a\x54\xb4\x37\xf5\x48\x51\x97\x99\x86\xab\x13\x67\x83\x5e\x5c\x4f\x3a\x3b\x3d\x76\x0d\x38\x27\xe7\x6c\x56\x8a\xe7\xae\xbb\xb6\x12\xe7\x75\xbd\xde\xcc\xd3\x34\xac\x6b\xcd\x32\x53\xab\xc2\x9d\x4b\x7c\x3f\x10\x36\x26\x66\xf6\xae\x75\x08\x03\x70\xa3\x6c\xba\x55\xdb\x3a\x91\xcb\x57\x89\xe4\xd6\xf9\xef\xea\x4d\xf1\xdd\x77\x30\xa5\xe2\x79\x60\xd5\x3b\x51\x21\x94\x8c\xce\x5a\xf6\x53\xff\xf1\xd5\xb4\xe5\xb0\xa8\x8c\x71\x8c\x49\xb3\x1c\x79\x3d\x88\xc1\xcc\x45\xab\x8d\xa2\x9d\x05\xe9\x06\xcd\x05\x94\xb5\xf6\x63\x8c\x8e\xc3\xf1\x76\x0b\xa4\x23\xb5\xab\x1d\x08\xa5\x87\x70\xaf\xb0\xf1\x39\xab\xd3\x49\xc1\xbf\x16\x0d\x89\x02\x23\x9c\xe2\x4f\x19\xb4\xe1\xbe\x09\x5f\x7e\xd1\x65\xf3\x93\x1e\x3c\xbc\xc3\x07\xe9\xfc\x5c\x65\x80\x31\x22\x8e\x55\xcb\xbe\xec\x0d\x0b\xcf\x8f\x69\x51\x54\xa9\xee\xd1\xbe\xf3\x52\x28\x78\x9b\xfc\x0d\x23\x8b\x83\x72\xd3\x18\x32\x8c\x13\x39\xfe\xa0\x88\x14\xdb\x86\x21\xab\xca\x3a\xeb\x82\x09\x8b\x5a\xa8\x7b\xb9\x8f\x5e\x40\x52\x2a\x08\x88\x53\x2c\x17\x48\x45\x3d\xb2\xd2\xb3\x94\x3e\x4a\xbb\x31\x2d\xe3\x19\xae\xc4\x8c\xc1\xc9\x47\x75\x97\x29\x53\xfb\x64\x96\xb8\x16\x89\x37\x62\x35\x10\xcd\x48\xc8\xb2\x47\x95\x6d\x31\x68\x48\x6c\x17\x6a\xe7\xa4\xcb\x38\x4e\xac\xfd\xab\xfa\xdd\x9f\xba\x30\xa2\x3b\x81\x1b\xd7\x79\xf3\xcb\xa5\x43\x38\xc2\x8b\xb3\x38\x22\x38\xed\x3b\x8d\xd2\x1b\xea\xb2\xf5\xca\xde\x28\xc5\xe0\x9b\x31\xa4\x54\x80\x8a\x53\x48\x12\x2e\x3a\xe3\x81\x22\x96\xf7\x86\x9c\x38\x65\xc3\xc9\xd8\xfe\x18\xbd\x81\x2f\x2e\x60\xe9\x14\x97\x5c\xfe\x1b\xef\x8d\xbb\x80\x97\x00\x6f\x0d\x7c\xf3\xfc\x15\xeb\x95\xc2\x78\x54\xb1\x43\x12\xb8\x8d\x52\x80\x15\xaf\x69\xfb\x75\x05\xb8\xf3\x27\x03\xf6\x4e\xb1\xc9\x58\xf0\x46\xdd\x25\x12\x42\xf8\xbe\xa7\x46\x7f\xc7\x29\x1d\x09\x5e\x96\x96\xe1\x1a\xa4\x5a\xbe\x79\x24\xe8\x56\x35\x15\x35\xaa\x07\x73\xd3\xd9\xe6\x1c\xc9\xa2\xd8\x9b\x5b\x07\x74\xd7\x64\x5e\xe1\xaf\x7e\xb6\xfc\xd4\x40\xbc\x69\xd4\x3e\xde\xaa\xf9\x35\xfd\x2a\x52\x95\xac\x19\xa9\x7d\x70\xaf\x92\x98\x83\x0f\x81\xc0\xa5\x09\xf2\x42\xf4\x73\x37\x24\x78\xfa\x58\x79\xfb\x2c\xb8\x51\x10\x80\xfc\x2e\xcd\x82\x59\xb8\xc3\xce\x9e\x8b\x64\x07\x61\xdc\x79\x27\xc3\x2e\x7f\x5b\xae\x97\xa8\xb8\xac\x93\x56\x62\xe5\xf4\x5d\x14\xca\xd6\xd3\x4a\xff\xc9\xa1\x94\x14\xc4\x56\x6f\x45\xf9\x77\x39\x67\x10\x89\x4c\x53\x99\xed\x44\x80\xf1\x8e\x90\x95\x7f\xaa\x76\xcc\xb5\x12\xa2\xd0\x75\x73\x05\x8a\x95\xb4\x2f\xe1\x81\x02\x49\xd1\xc8\x5e\xc4\x31\xa0\x49\xd1\xae\xcb\x0f\x11\x83\x79\xbd\xc3\xf1\xee\x49\x0b\xc8\xa0\x54\xc3\x2c\x3d\xac\x76\x59\x96\x6c\xdb\x66\xf9\x95\xac\x40\x3d\x5e\x79\xeb\x6b\x25\xb3\xf3\xf6\x5a\x6c\xee\xc2\x20\xd6\x6c\x05\xf8\xa8\xa9\x8b\x80\x79\x9b\xa4\xf2\xc6\xdb\xbb\x4d\xfb\x58\x62\xc9\xa4\x6b\xca\x01\x3e\xbd\xfa\xba\x74\x94\xa3\x0c\xe1\x46\x06\xaf\xc0\xb0\xf9\x93\x14\x3f\xed\xee\x78\x96\xd9\xa6\xbb\x81\x49\x91\x66\xed\x02\xe9\x41\x86\xaa\xf3\x21\x87\xae\xb6\xe2\x82\x50\x1b\xca\x43\xb5\x7b\x7e\xfa\x09\x39\xc9\x34\xbc\x8f\xbb\xd2\x6c\x44\xb6\x18\x33\x5a\x35\xc6\x92\xff\x99\x6a\x5b\x95\xd3\x27\xdf\x9b\x2a\x66\x21\xb3\xb0\xf1\x90\xdb\x1f\x36\xd9\x11\xd1\xa6\x63\xa4\xeb\xf9\xa2\x85\x4b\xb4\xf4\x06\x10\x95\xb6\x98\x12\xc8\x2c\x2f\xfe\x3f\x92\xe9\xb4\x4d\x2e\xa6\x31\x69\x88\x1c\xae\x84\x53\xd6\xee\xf7\xcf\x69\xc2\x5a\x28\xb3\xf8\xdd\xc7\x01\x48\xef\x26\x72\x1a\x3c\x1f\x2e\x62\xd9\xd1\x0c\xea\x42\xfc\xa3\xfa\xcd\x74\x67\x3a\x4e\x7f\x33\x50\x73\x64\xaa\x28\x6c\x0f\x38\xd7"}, +{{0x82,0x3f,0x0c,0x29,0xfb,0xfd,0xd3,0xd1,0x82,0x8f,0x30,0x55,0xe9,0xec,0x01,0xff,0xd1,0xb5,0xa3,0x75,0x11,0x8d,0xdd,0x7e,0x4e,0x0c,0x43,0x71,0x9f,0x57,0x3f,0xf7,},{0x73,0x12,0x5f,0xc8,0x3a,0xbb,0x8b,0x7c,0x65,0x85,0x59,0xfc,0x12,0x73,0x93,0x23,0x1d,0x03,0xca,0x58,0x46,0xe0,0xc8,0x81,0x18,0xd1,0x3d,0x55,0xca,0x44,0x78,0x9d,},{0xfa,0x74,0x7b,0x6f,0xe3,0x38,0x1a,0xd6,0xbc,0x82,0xa9,0x56,0x43,0xc1,0xf4,0xa2,0x0b,0x76,0xba,0x73,0xbf,0xf0,0x0e,0x63,0x5d,0x64,0x20,0x2d,0x8b,0x0d,0xf0,0x3d,0xbc,0x56,0xb0,0x13,0x8b,0x3a,0x6d,0x41,0x98,0xff,0xaf,0x58,0xcc,0xd3,0xd3,0x88,0xed,0x25,0xeb,0xcf,0x77,0x04,0x43,0xe4,0x1e,0x9d,0x21,0x47,0x95,0x0a,0x30,0x0b,},"\x80\x2c\x39\xce\x7f\x2a\x50\xbd\x81\x62\x2a\xdd\x0d\xf4\xe0\xfe\x03\xec\x3d\x2d\x30\x5a\x45\xa6\x16\x52\x71\xed\x79\xad\xd2\x43\xb9\xa0\x0e\x52\x18\x31\x92\xfe\xb2\x4c\x4f\xdb\xd2\x2c\x80\x7a\xe1\x00\xef\xcf\x16\x5b\x9c\x99\x61\x94\xe0\x0f\xa8\x17\x76\x5e\xa9\x4a\x03\x07\x0e\x48\x66\x86\xb4\x45\xfc\xb2\x63\xcc\xfe\x1f\x58\x62\xf3\xb8\x4b\x10\xf3\x90\x08\x0b\xfc\xae\x44\x7a\xe0\x06\x97\x42\xb8\x61\x8f\xa9\x57\x5f\x7e\x63\x7a\xd5\x4e\x83\x4c\xaf\x03\x94\xd7\x45\x03\x2c\xe1\xe2\x55\xc0\x27\x32\x50\xf1\x50\x4b\x37\xa0\xad\xd9\x4a\xa2\x45\xc7\xde\x52\xc8\x0e\x05\xd6\xe0\xa9\x6a\x14\x41\x05\x43\x82\x6a\x49\xe9\xb9\x45\x62\x6d\x4e\x89\xf5\x50\x27\x16\x3d\x4b\xd6\xd0\xe9\xbd\x1a\x24\x77\xf6\x7d\x3d\x56\x68\xa4\x2e\x94\xd8\xb6\x11\x93\xd8\x21\xe0\xd1\xb2\x30\xfc\xad\xc5\x36\x13\xb7\x5b\x02\xcf\xb8\x15\x84\x56\x07\x7e\xbd\xf5\xa5\xf0\x0c\x3b\x5b\x18\x63\x70\xca\xfe\xc4\xa2\x1c\x69\xdc\xe1\xf0\x1e\xfe\xf2\x3c\x37\xab\x90\xf8\x58\x23\x8a\xef\xbe\x21\x2b\x55\x6d\x2f\x07\x34\x06\x55\x9f\x1a\x51\xd8\x4e\xff\xfd\xce\x07\xb0\x0d\x01\xbb\xf3\x37\x71\xcc\x12\xc9\x60\xac\x89\x36\x5a\x9c\x82\xc5\x23\x43\xf7\x60\x33\x81\xb8\x90\x23\xc1\xa6\xe7\x02\xa5\xb1\xe4\xbd\x19\x1e\xa6\x97\x0b\x5e\xa4\x51\xea\x05\xb5\x9b\xf8\x3e\x55\xf2\x9a\x1f\x80\x32\x12\xbb\x2e\x58\xf0\x61\x63\x33\xd9\x11\x47\x08\x52\x9e\x8b\x6c\x60\x81\xde\xeb\x7c\x29\x9a\x5a\x2a\x53\xcc\xd2\x4e\xd5\x8f\xfb\xfe\x50\x3d\x80\x61\x4a\xdb\x05\xca\x11\xcf\x29\xde\xd0\x09\x04\xea\x12\x39\xf8\x2b\xa4\x0c\x79\x3e\xbc\x33\x97\x75\xf8\xb0\xfe\x39\x01\xf5\x48\x2e\x31\x0c\x79\x3c\x6e\x2c\xf0\x1d\xc1\x57\x72\x7a\xf2\x38\xf4\x9c\x98\x62\x80\x4b\x04\x75\x51\xfd\x88\x6f\x4a\x48\x99\xe2\x2a\x6a\x65\x70\x11\x17\xa3\x85\x80\x55\xbb\xfe\x96\x6e\x37\x0e\x73\x3e\x17\xef\xad\xa2\x85\x9f\xd8\xff\xa9\xe0\x1f\xce\x56\x06\xa2\x55\x36\x76\x78\xf4\xbd\x4e\x21\xe5\xda\x0f\xef\x30\x75\x7f\x34\xe3\x89\xf7\x6b\x7d\x57\xc4\xe4\x10\xa0\x02\xe9\x00\xe4\x8f\xb2\x18\xc8\xf2\x77\x8f\x14\x8f\xee\x56\x96\x5f\x5b\x47\x3e\x25\x25\x6c\x23\xa7\xaf\x19\x83\x42\xcf\x3e\xf0\x2b\x84\xdf\x2c\xd5\x80\x0a\x46\x1c\x1b\x07\xbd\xa2\xf4\x26\x28\xa6\x8a\xd2\x9d\xbb\x82\xa4\x70\x96\x7d\x73\x02\xc9\x93\xb2\x34\x13\x6e\x5b\xf2\x55\xe6\x24\x8b\x10\x2c\x2b\xff\xb2\x01\x72\x37\x1f\x1c\xa3\xe1\x0b\x08\x10\xe8\x64\x95\x03\x54\x6d\x9a\x73\x1c\xf1\x9b\x08\x33\x57\xd4\xcf\xec\xc8\x9b\xed\xb5\x35\x06\xfe\x19\x9b\x67\x03\x91\xa6\x20\x06\x9a\x30\x81\xf2\x53\xb4\xd7\x90\x88\x0a\xa2\x3b\x53\xe9\x7c\x75\xdc\x0c\x36\x05\x40\xe5\xb0\xa3\xef\xb1\xac\xcf\xfd\x13\x74\x14\xff\x84\x23\xd5\x46\x46\xfc\x56\xba\x5f\x53\xbd\x84\xc7\x26\x7c\x2f\x7e\xe3\xe3\x76\x07\x54\x41\x54\x36\x5f\x9f\x85\x08\x1d\xd7\xd2\xee\x75\xd3\x02\x27\x5c\x79\x9e\xf2\x42\x7c\xa6\x49\x63\x55\xdc\xda\x1d\x44\xe0\xd9\x77\xbf\x68\xdb\x30\x06\x50\x0a\xe3\xf4\x00\xd6\xa8\xc7\xcf\x47\x05\x7d\x4f\xc8\x7e\xee\xcb\x02\x11\x6b\x73\xee\xd6\xce\x1f\xcc\xef\x6e\x8f\xb8\xae\xa3\x63\xb2\xf6\xf5\x32\x2a\x5f\x07\x53\xf4\x58\x99\x53\x76\x46\xd5\x86\x51\xbe\x90\x37\xbf\x91\x42\x3c\x29\x86\xf5\xcc\x2b\xcb\xce\x4f\xae\xc9\x03\x49\x8b\x40\xfc\x2d\xea\xb6\x60\x3d\x6e\xea\x58\x5d\x27\x20\xd2\x1b\xb2\x72\x2b\xc0\x5b\x35\xae\xd2\xbc\xc0\xe8\x04\xfe\x9d\x23\x9f\xaf\xda\x7d\xda\xfe\x1d\x78\x60\xab\xb0\xfb\x28\xf4\xbf\x2b\x1f\xbb\x62\xa7\x86\xe4\x55\xbe\x02\x4b\x19\x3b\x78\x30\xbe\x0d\x55\x8f\x02\xc9\xf3\xae\x31\xdc\x10\x7e\xe9\x42\x1d\xc5\xf0\xb0\xf8\x94\x02\xb7\x1a\x45\x81\x40\x15\x36\xbc\x47\x30\x85\x06\xd9\x69\x39\xa2\x06\x36\x27\x44\xe2\x7d\xde\x94\x4f\x40\x96\xa1\x2b\x5f\x63\xda\xb6\x4d\x04\x14\x84\xd3\xfd\x91\xa6\x2c\x2f\x0e\xf9\xae\x78\x74\x22\xeb\x27\xfe\xd0\x80\x2e\x25\xf9\xbc\x77\x5c\x49\x15\xa8\x37\xfe\x3e\xb7\xb9\xd5\x84\x3e\x4d\x82\x10\xc6\xb4\x94\xb6\x12\x81\x63\x7a\x6b\xe3\x20\x52"}, +{{0x65,0x67,0x66,0x33,0x37,0x42,0x14,0xc4,0xac,0x4b,0x7b,0xce,0xa9,0xf1,0xcc,0x84,0xb1,0xb7,0xe7,0x94,0x11,0xe3,0x10,0x52,0x5a,0xce,0x38,0x5f,0x45,0x66,0xc1,0xd5,},{0x0e,0x6e,0xc5,0x80,0x1d,0x8b,0xd6,0xb1,0xeb,0x42,0x14,0x21,0xa1,0x40,0x8f,0x13,0x4c,0xf7,0x12,0x33,0x8e,0x0f,0xfc,0x24,0xcd,0xcc,0xdc,0x4f,0x7f,0xa3,0x1d,0xbe,},{0xe0,0xb8,0x67,0xc9,0xdb,0xda,0x35,0x32,0x34,0x33,0xc0,0x46,0xe0,0x83,0x0c,0x25,0x1b,0x43,0x46,0xc5,0x39,0x59,0x72,0x28,0x6b,0x3a,0x72,0x31,0x0e,0xd4,0x52,0x6e,0x54,0x5d,0xc0,0x9d,0x39,0x18,0xf2,0xeb,0x99,0x20,0xbc,0x9b,0x24,0x1e,0x90,0x50,0xd8,0x48,0xd3,0x83,0x02,0x88,0x65,0x15,0x91,0xf9,0x36,0xd3,0xba,0xe4,0x53,0x01,},"\x9d\x62\x2c\x20\x67\x87\x69\x40\x93\xc6\xf2\x9f\x93\x61\x9f\x21\xbb\x64\xc0\x39\x41\x6d\x20\xdc\x70\x8a\x08\x4a\x9d\x2e\x49\x0c\xf5\x65\x8e\x13\xd6\x2c\xb0\xd2\x1e\xab\x00\xe4\x2d\x85\x1b\xc6\xec\x75\xda\xf4\x05\xd2\x37\x32\x46\xee\xa4\x15\xe8\x66\x29\x1b\xab\xf7\x64\x97\x68\x0a\xaf\x04\x42\x5a\x42\x55\x2b\x10\x7d\x58\xcd\x18\x56\x1c\x8c\x94\x83\xf7\x40\x74\x4c\xbf\xa6\x05\x4c\x1b\x12\x6f\x5a\x76\x65\x9a\xc1\x9d\xdd\xad\x4a\xb5\xa0\x91\x55\xd8\xc0\x50\xb5\x35\x4e\x06\xa4\xdd\x3e\xe3\xa6\xf9\xc9\x1e\x8b\x4c\x7a\xf2\x74\x96\x64\xe7\xab\xe9\x70\x61\x58\x9e\x15\x3c\x58\xe2\x7c\xf2\x99\xa2\x5f\x2b\x53\x0c\x06\x07\x31\xec\x0f\x43\x66\xbd\x1d\xeb\xeb\x4d\x4e\x91\x2e\x76\xe5\x08\x53\x4d\x43\x3e\xc4\x8f\x96\xb6\x2e\x15\x0d\xe9\x39\x63\xa1\xb3\xe6\xc8\x09\x1b\x49\x5a\x96\x51\x8c\xe3\xd3\xb9\xa8\xdb\xdc\x2a\x13\xfd\xd0\x77\xf2\x23\x1d\xe8\xd7\x6f\x56\xd9\xab\x1c\x2f\x9e\xfa\xbc\xe4\x63\x83\x64\xf8\xfb\x2a\x2c\x68\x3c\xa8\x19\xb7\x03\xab\x45\x3b\x11\xd3\x7a\x69\xfa\x4b\xcb\x80\x23\x98\x08\x34\xf7\xb9\x02\xad\x18\x19\xfc\x02\x92\x12\xfd\xea\x0a\xbf\x11\xde\xc8\x8c\x55\xd6\x8e\xf8\x7a\x26\xdb\xb1\x5d\xc3\xd3\xdf\xbc\xdd\xdd\x5e\xd7\x1b\xe8\x6f\x32\xc7\x6e\xe2\x22\x1d\x92\x43\x68\x3d\xf9\x51\x65\x64\xb2\x6b\xab\x5c\x84\x5d\x4d\xfe\x0a\xdc\xc7\xcb\x9f\xe1\xee\x2c\x05\x1a\xf5\x90\x8c\xe0\xcc\x3a\x90\x90\x4d\xbc\x0d\x36\x80\xed\x49\x92\xf4\x6c\xe2\x5c\x2e\xe8\x51\xc4\x14\xf0\x18\x7d\x89\x3e\x5c\x3b\x01\x89\xa7\xbb\x68\x93\xd6\x83\xf5\xe3\x39\x4c\xc0\x46\x29\x9a\x16\xa1\xc1\xb5\x69\x59\x33\xa8\x9b\xb1\x30\x30\x85\x5b\x81\xb3\xc7\x46\x85\xf7\x19\xde\x01\x60\x57\x5a\x0f\xf0\xa9\x1f\xd9\x43\x47\xb8\xbc\xbe\x12\x5d\x1d\x3f\x9c\xe7\x72\xa8\x12\x6e\x00\xf5\x63\xb3\x18\x96\x56\xd5\x52\x2c\x18\x7a\xb8\x31\xa7\xad\xe7\xac\x06\xfd\xca\xc7\xf1\xd4\x58\x82\xe5\x1f\x9b\xf5\xb4\x4a\x2d\xab\xa4\xa5\x3d\xbb\x31\x97\x0b\x4a\x0f\x12\x72\xfe\x14\x08\x7e\x0c\x3c\x7e\x45\x42\x31\x2f\xe7\x4d\x76\x7f\x21\xe7\xea\x48\x7d\x52\x84\x28\x4f\x46\xf2\x0f\x32\xc5\xb1\x6e\x1e\x0a\xc8\xd7\x96\xab\x2f\x80\xb3\x44\xe7\xa8\xd8\x4d\x5d\xe8\x23\xa5\x08\x97\x75\x2d\xc5\x49\xa4\x8f\xc1\x0b\xcd\x43\x6a\x7a\x93\xe9\x7c\xd0\x5d\x78\x30\x13\x8f\x32\x38\x79\x68\x0c\x34\x3c\x16\x46\x7d\x26\x4d\x74\x9b\xf4\x5e\x40\xf3\x9f\xbc\x3a\x00\xc4\x3b\x00\x69\x3b\x01\x56\x76\x8f\xf2\xe3\xf8\xad\x9e\xb6\x40\x50\x22\xf5\xca\xda\x66\x94\xe8\xa3\x3c\xdc\x59\xc6\x67\x3c\x44\x11\x72\x44\xeb\x03\xfd\x7f\xd6\x75\x93\x0c\x29\x4e\xdd\x29\x40\xf5\xf1\x80\x95\x3d\x91\x0c\x55\x48\x5b\x20\x57\xae\x0c\x93\x02\xf4\xa8\xe8\x31\xa5\x53\x0e\x3c\xbb\xf6\xf4\x72\x22\x40\x83\xa9\x52\xa8\x39\x0a\xb0\x0d\xc0\xf6\x9d\xfd\x88\x0e\xea\x2d\x73\x9d\x21\x8d\x6a\x66\xf2\x37\xf1\x0d\x44\x01\xaa\x75\x8f\xf8\x12\x0c\x0a\xe2\x76\x61\x27\x84\x90\x24\xf5\xa4\xcc\x57\x4a\x5b\x02\xb9\x35\x96\x68\x12\xcd\x1f\xb6\xd7\x9d\x0c\x4f\x59\xff\x80\xf0\x35\xa0\xb1\x09\xcc\xcb\x22\xfb\x08\x53\x5b\x87\x41\x49\xed\xf2\xa0\x97\x0c\x14\x88\x84\x27\xd0\x7d\x1e\xaf\xa6\x84\xa6\xd3\x45\x4e\x49\xb2\x25\x18\x4c\x6b\x99\x3e\xc8\xdd\xb8\xb5\xa3\x5e\xe4\x5f\x87\xf6\x92\x66\xd4\x90\x96\xa3\x17\xd8\x6a\xde\x27\xf4\x52\x9f\xe7\x23\x64\xd0\xb9\x58\x00\x72\x99\xd9\xde\x87\xd6\xff\x9f\xb0\x4d\x57\x3a\xea\x46\xba\xc8\xeb\x76\x47\x52\xeb\x46\x5c\xaa\xab\xa6\x89\xa6\x46\x0c\x11\x07\x30\xbd\xd0\x8b\x16\x89\xde\x7b\x05\xde\x59\xaf\x9f\xe2\x44\xac\x36\x3e\x95\xc9\x8b\x66\x93\x59\xaf\x90\x31\xa3\xa9\x3b\xa6\x31\xab\xf1\xf6\x1d\x20\xef\x7f\xc6\x88\x3b\x48\x40\xfc\x92\x67\x12\xe1\x3d\x87\x4b\x72\x2f\x6a\x79\xb1\x60\x70\xc0\x31\x13\x25\xe9\xa7\x0f\xcd\x86\x91\x6c\xfa\x1d\xa7\xf9\xd0\x56\x3a\x22\xfe\x9b\xfe\x85\x4b\x0c\x18\x6c\x86\x63\xb0\x61\xb6\x5b\xc0\x71\xe8\x39\x93\x8d\x8f\xdd\x7c\xf8\xf6\x95\x2a\x64\x67\xfa\xd8\xe5\x84\x90\xed\x2b\x26\x81\x33\x01"}, +{{0xd2,0xed,0xed,0xcd,0x85,0x32,0x06,0xcb,0xf5,0x9b,0xd7,0x4a,0x25,0xa3,0x03,0xfa,0x2d,0x6c,0x39,0x36,0xbb,0x48,0xeb,0x42,0xf6,0xd9,0x00,0xcb,0xe8,0x07,0x72,0xbe,},{0x22,0x44,0x11,0x1e,0x2e,0x76,0x9e,0xab,0x81,0x87,0x1e,0x06,0xc5,0x80,0x17,0x8c,0x23,0x5c,0x7b,0xf4,0xa5,0x2d,0x2e,0xcc,0xe1,0x18,0x87,0xa9,0xb4,0x6c,0x45,0xc8,},{0xbe,0x3c,0x2b,0x56,0x7f,0xe8,0xc2,0x08,0xc9,0x8e,0x71,0x97,0x11,0x7e,0xb0,0x1b,0x3c,0x19,0x7b,0xdf,0xc8,0x58,0x56,0x2d,0xc5,0xcd,0x90,0xf8,0xe2,0xc0,0x35,0x70,0x42,0x30,0x39,0x95,0xba,0xba,0x2f,0x40,0xb7,0x34,0x5c,0x56,0xdb,0x0b,0x46,0x25,0x58,0x0a,0xa8,0xdc,0xc4,0x8d,0xf6,0x01,0x9d,0x23,0xa8,0x38,0xea,0x71,0x72,0x02,},"\x80\x70\xbc\x0d\xb0\x89\xa5\x92\x54\x46\x01\x9b\x7e\x40\x3c\x74\xec\x78\x90\x3e\x4b\xd5\x4b\xc1\xd0\x8a\x54\xa6\xf0\xed\x75\xa8\x5b\x76\x3f\xf5\x4d\xc3\x3a\x26\x00\xcc\xb4\x57\xfd\xba\xea\xe5\x48\x47\x7f\x6d\x69\x47\xae\x26\xde\xb7\x1e\xac\xd1\xd2\xd6\x22\x82\xa0\x83\x84\x3b\xe4\xe5\x93\x1d\x91\xc9\x3b\x62\x82\xc5\x88\x07\xce\x8f\x0d\x88\x0b\x14\x38\xda\xd8\xfd\xcb\xa8\x61\x2d\xf7\x3b\x9f\xaf\xf3\xa9\xf7\xdb\x30\x05\x25\x05\x36\xaa\xbd\x98\xae\x02\x7a\x89\x5e\x10\xb5\xcb\x7b\x69\x87\x5c\x0f\x39\x93\xaf\x24\x51\x92\xf4\x39\x3e\x9c\x4d\x34\x05\x74\x6e\x31\x1d\x3a\x91\x44\x7f\xcd\xbd\x73\x06\xb6\x02\x0c\x93\x3b\xba\xb9\xe3\x9d\x13\x49\x16\x25\x03\x5c\x9c\x63\x6e\xfa\x17\x39\xc3\x58\x87\x10\xa8\x79\xd9\xe3\xce\x17\x64\x61\x6f\x10\x82\xe8\xdf\xf5\x75\x59\xc3\xf5\xa5\xd7\x6d\xd3\x01\x12\x4f\xa4\x89\xfb\x94\x9e\x9e\x03\x9d\xd4\x62\x1b\xda\x60\xf0\xb8\x6b\x31\x1e\x78\xed\x0a\xb3\xb5\x28\x96\x50\x44\xb2\x3d\x78\xee\x2f\x81\x06\x1f\x8e\xdb\xd6\x92\x99\x33\xd1\x8c\x02\x07\xde\xc4\xb5\xb6\xb2\xfa\x4a\xca\x27\x47\xcf\x5b\x11\x0d\xf0\x0b\x0c\x98\x27\xbd\xb3\xd9\xdb\x2c\x7b\x03\x28\xd4\x0d\x99\xe1\xf6\xb2\x28\xe4\x0d\xad\xae\x78\xae\xda\x02\x89\xb6\xa2\x3d\x4e\xb5\x83\x70\x88\xe5\xd8\x84\x13\x63\x2c\xcc\x22\xe2\x1a\x73\x76\x8c\x67\x32\x01\xe9\xa8\xd8\xdc\x6e\xb6\xf7\x39\x7f\xed\xbd\x39\x8d\x26\xf9\x69\x2c\xa7\x2f\x6d\x6c\xf0\x56\xaa\xac\x50\xac\x2f\x3b\x26\x6d\xbe\x5e\x7b\xe7\xa0\x24\x77\x45\x78\xea\xd5\x85\x24\x5d\xaa\xa7\x3e\x0a\xaf\x83\x3c\x07\x0b\xa4\xb2\x04\x4c\xcb\x5e\x5c\xd1\x6f\x9c\x0a\xd9\x2e\xa8\x44\x80\x55\xdd\x82\x8c\x79\x93\x5a\xa6\xc0\x74\x1f\x9e\x2b\x81\x03\x24\xfd\xc6\xe6\x1e\x84\x2f\x94\x57\x22\x68\xbf\x7d\x5a\xdf\xa7\xab\x35\xb0\x7f\xb1\x9e\x78\x15\xa8\xaa\x5d\x81\x13\x01\x30\xac\x5c\xda\x8a\x47\x51\xee\x76\x03\x8c\x0a\x6b\xc2\xfa\xba\x4c\x49\x7e\x62\xb9\xf1\xf1\x94\xb8\xa5\x99\xb0\x77\x01\x81\x4b\x6d\xfb\x7d\x84\xbc\xdd\x5b\x7b\x5b\xc2\x24\x9f\x1d\x38\x45\xef\xf9\xef\x8c\xc7\x32\x85\x35\xd7\x0d\x53\xc7\xaa\x0c\x73\x05\x90\x1d\xe7\xc4\xed\x2f\xe1\x83\x82\x65\xd4\xa4\x17\xb8\x76\xad\xbd\x88\xeb\x93\x3f\x27\xc9\xaa\x48\xc8\xc7\xe3\x4e\x48\x14\x7c\xcf\xfb\x2f\xb6\x1a\x34\x8f\xea\x13\xef\x67\xcd\xf2\xe0\x39\xe3\x3f\xd8\x9e\x2c\x1a\xd2\xa4\x25\x4e\x3b\xf7\x48\x45\x2a\xa8\x3e\xfe\xca\x46\xe7\x80\xed\xe1\xd1\x3f\xf4\xcc\x5e\x7d\x01\xed\x45\xeb\x8c\x74\x81\x8d\x48\x60\xaf\x47\x59\xa8\x3e\x14\x88\x96\xab\x68\x73\x43\x95\x76\x0e\x00\x14\x6b\x79\x3c\x3e\x72\x89\x8a\xa0\xb3\xc5\xe0\xc1\xd3\xfd\xf1\x21\x58\xd2\xe8\xff\x11\x23\xa3\xa0\xc6\x4c\xf6\x37\x4a\x7f\x44\xf1\x1a\x57\x5e\x48\xa3\x79\x18\x1b\x30\xa4\x86\x5c\xfd\x02\x2a\xa9\x83\x27\x56\x35\xce\x4f\x2c\xc4\x0b\xfe\x06\x60\x67\xec\x4f\xe2\x41\xfa\x04\x7b\x55\x27\x0a\x1a\xd0\x77\x6c\x5f\x96\x86\x10\x14\xcb\xf4\x0a\x04\x32\xc5\x59\xf2\x2d\x79\x34\x2b\x79\xf8\xe7\x04\x2d\xcc\xfb\x1c\xf5\x0f\x83\x08\x5f\x80\x63\xfb\x18\x87\xed\x2d\xfc\x9d\xb7\xef\xc9\x6d\xaa\x0f\xf2\xbc\x4f\x52\x33\x5b\x02\x11\x2d\x16\x39\x2e\x13\x4c\x02\x23\xde\x45\x8f\xc0\x72\xcc\x22\xbf\x9e\x7e\xab\xc0\x62\x08\x18\x0a\x57\xe7\xce\x48\x05\xee\x4e\x0f\xc0\x15\x84\x09\x98\xfd\x56\x86\x44\xa0\x38\x6b\x3d\x8e\x7d\xda\x52\xab\xf6\x4f\x7d\xd0\x08\x68\xfc\x84\xf0\x36\xca\x8a\x78\xe9\xba\x81\x71\xca\x90\x26\x7c\x74\xe6\x15\x9a\xca\xc7\xaf\x5b\xf2\x37\x59\xab\xc5\x3d\x82\xe7\x93\xdb\x87\xfd\xad\xe1\x36\x33\x54\xff\xdc\xb0\xbd\x4c\xc9\x21\x3f\x5c\x84\x54\x45\xfc\x64\x9b\x2a\x1f\x32\x9f\x9d\x41\xd8\xa0\x31\xab\x46\xb4\x72\x16\x0f\x03\x43\x4b\x4b\x6b\xc5\xa4\x01\x52\x4d\x61\x79\xad\x66\xf9\xe2\x21\xc9\x06\x7f\xc8\x7f\xe4\xa7\x7e\x21\xe8\x02\x3b\x61\x69\xeb\xf1\x09\x0c\xd5\x56\xa9\xbe\x50\xb9\x18\x7f\xe4\x60\x7c\x59\x25\xe6\x0b\x41\x4f\x6a\x5c\xbf\x8a\xfa\x15\xed\x0e\xb3\x4b\x67\xb4\xc9\xc5\xd5\x4a\xdb\xe6\x40"}, +{{0xb5,0x69,0xf7,0xc1,0xaa,0xdf,0x56,0xed,0x1b,0x5f,0xa1,0xb6,0xfa,0xd6,0x48,0xd0,0xdc,0x54,0x4f,0xf8,0xfc,0xd1,0x73,0x78,0x0d,0xe4,0x1a,0x7d,0x4d,0xe6,0x0c,0xb6,},{0x9e,0xff,0xa4,0xae,0xd9,0xc6,0x58,0xe4,0x34,0x60,0x71,0x43,0x44,0x68,0xa0,0xb8,0xa0,0x4e,0xcf,0x78,0x41,0x69,0x9d,0x63,0xe8,0x88,0x7c,0xe2,0x05,0x57,0x0c,0xea,},{0x2e,0x32,0xba,0x05,0x56,0xbd,0xe9,0x74,0xd7,0xa1,0x9b,0x3b,0x9a,0x1e,0x92,0xf1,0x83,0x92,0x4c,0x4b,0x74,0xc5,0xd7,0x51,0xb5,0xab,0x3d,0x00,0x79,0x67,0x01,0x6e,0xc0,0x3a,0xfe,0x91,0xd7,0x42,0xfb,0x22,0xb6,0x3e,0x5e,0x55,0xb2,0xfc,0xb6,0xc6,0x1a,0x46,0xe9,0xdc,0xe7,0xfe,0x9f,0xa3,0x0b,0xbf,0x66,0xae,0xf4,0xb8,0x5f,0x09,},"\x7c\x5a\xa4\xdc\x80\x78\xaa\x77\xe8\xb3\xb7\xfe\xe6\x10\x84\xcf\xad\x76\x47\x62\xf1\xef\x26\xd8\xde\xb7\xf2\xf3\xb1\x86\xdf\xc7\x72\x48\x75\x50\x19\x78\x45\xfb\xa2\xf4\xc2\x3c\x83\x5b\x9b\x58\xdd\x0b\x63\x5c\x64\x91\x35\x13\x7f\x24\x8f\x5e\xf7\x13\x56\x4d\xe3\xc9\x66\xef\xa5\xf6\xdb\x6b\xea\x9e\x30\x97\x07\x49\xf8\xe8\x72\xd8\xd7\xae\x45\x35\xb7\x5e\x17\x6e\xa0\x48\x9b\x91\x5f\x34\x71\xd8\x27\xeb\x5b\x44\x45\x86\x48\x8c\xfc\x3f\xa6\xa4\x50\x82\xda\xcb\x82\x64\x95\xe5\x0a\x3b\x5d\xc6\xbb\x93\x0a\x33\x1f\x30\xc3\x85\xbc\x3b\x24\xce\x70\xb8\x95\x96\xdb\x6b\xfb\x68\x7d\x99\xa5\x81\x98\x7c\xa8\x76\xea\x0e\x75\x76\x96\xb3\xfc\x03\x77\x9a\x65\x81\x30\xc4\x10\xb3\x44\xed\xac\xc4\x27\x7d\x44\x84\x54\x99\xd6\x78\xe1\x41\x4f\x15\xf3\x6e\x16\x63\x35\x18\x95\x69\xce\xf3\x56\x7a\xc2\xe3\xab\x82\x1c\x91\xc9\x32\x74\xf5\xc2\x8a\x5d\x1f\x7c\x1b\xf5\x09\x9b\x10\xf8\x4e\xcb\x13\xa4\xe4\x53\x8f\x66\x49\xbf\x74\xf7\x39\x4b\x70\x3e\xf5\x36\x49\xd8\x15\x16\xcb\x1d\xb5\x21\x41\x60\x65\xcf\x9f\x27\x6a\xb8\x0c\x93\x08\x89\x7a\x27\xdf\xe3\x7e\x5e\x14\x2f\x18\x19\xb8\xd3\x48\xdf\x50\xa0\x46\xa1\x28\x88\xe3\xb7\xf2\xdc\xc7\x0f\x52\x18\xd1\x5e\xbb\x9a\xa7\x29\x1a\x1a\x92\xac\x44\x5c\x51\xd3\xa5\x3d\xd6\x91\xef\xff\xcf\x5a\x01\xe8\x76\xa7\x2a\xa4\x81\xeb\x4f\x12\x1a\x07\x23\x97\xd8\xcc\x93\xbb\xc2\xc9\xa6\xc2\x8c\xc8\x9b\x11\xff\xc0\xe9\x10\xd8\x2d\x9d\x62\x98\xa3\x67\xa0\xe1\xe3\xe8\xc8\x65\xe4\x32\x6a\x31\x9b\x22\x66\x6e\x52\x9f\x19\x98\xf1\xb3\xc8\xef\xb5\xfc\x21\xcc\xe9\x70\x40\xfb\x62\x47\xda\xa0\x00\x0a\xc5\x55\x4d\x89\xe7\xb2\x71\x59\xdd\x0b\x18\x00\xb7\x60\xb7\x9c\x91\xef\x6e\x97\x0b\x1e\x6c\x5f\xf4\x24\x42\xb1\xb3\xae\x4d\x3c\x43\x9e\x08\xec\x2f\x6b\x94\x17\x73\x87\xca\x5c\x01\xdf\x6f\x07\xf8\xe3\x4d\x25\xed\xbd\x49\xd8\xb7\x4e\x31\xa5\xe6\x5d\xec\x1f\x87\x60\xfa\x22\xc0\x0e\x6f\xb1\xcd\x55\x5b\xe6\x8b\x0a\xb4\x35\x99\xf0\xb9\xf4\xa5\x4a\x7c\xcb\x06\x26\x83\x89\x5d\x5e\xf6\x6d\x24\xdf\xb1\x67\x8c\xb0\xd0\xe8\xc8\x01\xd8\xe5\xff\xe7\x9b\x91\x39\xfc\x96\xd1\x18\xeb\x39\xb9\xc8\xd4\x40\x44\x89\x32\x5d\x45\xb4\xa3\x20\x2b\xea\xdc\xa6\x6f\x83\x1c\x68\xef\xb8\x15\x94\x15\x81\x93\x0e\xad\x29\xfd\x5f\x21\x1b\x90\xe7\xa3\x9f\x0d\x4f\xf4\x8c\x62\xa5\x45\xe2\x8a\xc2\xce\x29\xbe\xdc\x35\x6d\x92\xfc\x00\x34\x71\x76\xd7\x76\x23\xe0\xe1\x80\x9e\xff\x3f\xe6\x2b\x75\xa7\xd9\xde\xb7\x27\xd8\x61\x72\xd1\x4e\xdb\xf2\x78\x9a\x57\x14\x3c\x69\x92\x5c\x91\x7d\x43\x3b\x46\x83\xb0\x69\x3b\x3c\xd9\xe7\xe3\x77\x99\x64\x10\x72\x7f\x5e\x6f\xb8\xf5\xcc\xd1\x86\x0a\x20\x29\x4e\xcf\x33\xfa\xf9\x7a\x1e\x0f\x85\xb7\x61\x44\x7d\x47\x61\xb9\x6e\x4d\xf1\xb3\x12\xbd\x41\x4c\xab\xcf\x49\x84\x97\xb0\xea\xd6\x7c\xd1\xe5\x90\x1b\xbf\x3a\x16\xa8\x89\x1c\xcc\xed\x8a\x90\x7d\xf8\x87\x26\x95\x2d\x4a\xb3\x70\xa6\xb7\xdf\x29\x42\xcf\x13\x61\x5a\x5b\xc1\x2b\x4e\x10\x6d\xc3\x01\x3c\x68\xb8\xfb\x90\x63\x99\xdf\x15\xf1\xaa\x90\xd5\x6a\xa9\x74\xb1\xd2\xb2\x8c\x1a\x84\x53\xb9\xbf\x07\x92\xa5\x1c\x97\xce\x8a\x12\xaf\xc9\x34\x1b\xb4\xc0\xc3\x7b\x12\xdc\xb1\x2c\x63\x94\x49\x77\x5d\x9a\xc5\xc2\xec\x49\x67\x3d\xa5\xaa\xf7\x49\x3e\xd5\xf1\xf2\x11\x6e\xae\xf7\x2b\xb7\xfb\x1e\x09\x3e\xde\x2c\x26\x31\x7f\x4f\x4b\x6a\xd5\x85\x34\x62\x05\xdf\x91\xa6\xe9\x6b\xc6\x6d\x30\x64\xbc\xe9\x52\x39\x8f\xfc\xe8\x80\x71\xed\x9f\xf2\x75\x0c\x65\xc0\xc3\x04\x12\x5a\xc2\xca\xdc\x4f\xef\x71\xa8\x18\x73\x24\x96\xa8\x4c\xa5\x74\xd4\x82\xd5\xa3\xbb\xa2\x0e\x16\xdd\x2f\xa2\x4d\x32\x70\xf6\xc6\x09\x92\xf7\xf6\x3e\x88\xf5\x2e\xff\x62\x22\x99\x8e\xb4\x41\x67\x27\x38\x43\x75\xf5\x9f\x00\xe4\x75\x12\xee\x46\x4c\x31\x84\xac\xea\xff\x3c\xcf\xb0\x6b\xd1\x5c\x18\x3c\x5e\x48\x59\x26\x28\x8b\x99\x7b\xfa\xaa\xec\xf6\xec\xbb\xf7\xd2\xab\xf4\x90\x6d\xf7\x6b\x12\x77\xc5\xf5\xa8\x7e\x68\x17\xb1\xc6\x36\xe9\x1e\xfd\x7e\xcc\xf6\x4f"}, +{{0x32,0x34,0x65,0xd0,0x31,0x3d,0x10,0x01,0xa2,0x61,0xab,0xfd,0x44,0xfe,0x65,0xc3,0x8c,0x9a,0x00,0xca,0x0f,0x20,0x33,0x5d,0x65,0x53,0xde,0x49,0x26,0x99,0xfc,0x46,},{0xe2,0x2f,0x16,0xbd,0x4c,0xc7,0xe9,0x4c,0x46,0xba,0x31,0x96,0x1a,0xf8,0xc5,0x83,0xf9,0xd2,0x71,0x8c,0x68,0xf7,0x3d,0x85,0x06,0x9f,0x60,0x8e,0x15,0xba,0x87,0x66,},{0xda,0x3a,0xad,0xb3,0x43,0x60,0xb2,0xda,0x0c,0x26,0x54,0x2e,0xa7,0x1d,0xef,0xa8,0xa0,0xbf,0x7f,0xbd,0xae,0x3e,0xe9,0xe1,0x1c,0x84,0x08,0x4a,0xd0,0x5c,0xce,0x7b,0xa7,0xd9,0x4d,0xe2,0x5d,0x85,0x63,0x98,0x26,0x16,0xbc,0xdb,0x5b,0xb6,0x39,0x5f,0xac,0x4a,0x7e,0x84,0xbc,0x77,0xe2,0x1e,0xd3,0x6d,0xf7,0x5d,0xec,0x99,0x0b,0x06,},"\xbb\x10\x82\xe1\xcf\xdc\xd2\x9b\xfc\xa2\x46\x4d\x5c\xe4\x46\xb5\xba\x65\x4b\xa5\x8c\x22\x53\x8d\xa9\x26\xb8\x30\x3c\xab\xfd\x28\x4a\x7b\xd5\x99\x4a\x78\x6f\xa6\x6a\xed\xf0\xe1\x5f\x20\xc3\x82\xcd\xac\xf3\xd1\x45\x57\xff\x7a\x82\x67\xfa\x04\x67\x2c\xac\xab\x76\x70\x08\x65\x0a\xa9\xb4\xa7\xc9\x07\x1c\x47\x99\xf1\xff\xa4\x5c\xa4\xd5\x86\xe0\x20\x47\x44\x4c\x14\x23\x19\x43\x46\x7a\x3a\xba\xef\xa5\x39\x59\xda\x22\x6e\xb0\xc1\x53\x92\x01\x97\x60\x15\x96\x97\x74\x82\x93\xc0\x25\x56\x87\x83\x58\x8a\x39\x10\xe7\x8e\x5e\xa4\x27\xc4\x40\x7a\x89\x01\x06\x1b\x8b\x99\x2b\x82\xa2\xdf\x58\xc0\x4a\x1b\x2c\x5f\xad\x11\xc6\xb3\x79\x85\x6c\x2e\x0f\xef\x8a\x95\x0d\xe7\xe0\xfc\x22\x31\x03\x09\xe0\x8b\x13\x2b\x0c\xce\x4f\xc1\xec\xbf\x94\x57\x4a\x38\x8d\x4a\xe3\x66\x75\xd3\x29\x9a\x95\x15\x54\xeb\xf1\x80\xeb\x38\x1e\x1b\x5d\xf9\x77\xd9\x38\x43\x38\x91\xbc\x47\x8d\x76\x81\x85\x0b\x9d\xc9\xc5\xc7\x69\xd4\x05\xf5\xd8\x83\x9f\xc9\x73\x61\xd6\xcb\x30\x6c\x20\x30\x26\xcf\x2e\x2b\x3d\x39\x84\x9e\x1f\x4b\x12\x25\xeb\x25\xef\x8a\xcd\x40\xb0\x06\xf2\x0c\x64\x4d\xb6\x50\xc7\x5d\x38\xc0\xfc\xdd\x48\xf5\x98\xc7\xb4\xa6\x01\x06\xe6\x9e\x19\xcd\x71\x25\x89\xce\xdc\xcf\x50\x86\x4e\xa5\xf9\xe9\x5e\x01\xf1\xdd\x85\xc7\x51\x4f\x2c\x94\xb2\x83\x59\xde\x41\x32\xb8\x8c\x3e\xe1\xd1\x0a\x80\xa9\xfa\xdf\xb6\x90\xe3\xd8\x86\x41\xb3\x16\x8f\x0b\x89\x6a\xf8\x99\x0a\xdb\xf0\xe4\xf8\xe9\xd3\xf9\xd4\xcd\x31\x4e\x12\xc3\xbc\xe0\xcc\x87\x38\xe0\xcf\xc1\x90\x5b\xe5\xef\xa0\x71\xf7\x10\xb3\x2f\x8e\x58\x98\xc6\x0e\xb1\xbb\x8f\xee\xb7\x40\x00\x56\x0f\x41\xcb\x2e\xbc\x32\xb2\x60\x0b\x69\x80\xa2\xa4\x06\x4d\xfa\xa3\x79\x7e\xc4\x4c\xfb\x72\xd3\x79\xf8\x09\x73\x79\xca\xd6\x7e\xcd\xc0\xc3\x24\x14\xfa\x41\xc7\x2b\x1b\x9e\x4e\xdf\x55\x18\xcb\x39\xfe\x90\x92\xb4\x39\xaf\x3a\x4e\xbd\x5a\xfe\x79\xbe\xdc\x0e\xa8\xbf\x17\x47\x9a\x28\x21\xf5\xe9\xbd\x91\xd7\xf4\xaa\x5e\x38\x46\x99\x52\x37\x19\xb6\x95\x7f\x82\x36\x7c\xd8\x5f\xea\x9d\xed\x62\x36\xa2\x07\xc9\x4c\xb3\x73\xe3\x39\x3c\xb4\xfe\x11\xf9\x0a\x1b\x87\x79\xe4\xab\x4c\x34\x66\x13\x6b\xf2\x1e\x2a\xab\x78\xf7\xd2\x72\x6d\xb6\x41\x4f\xa5\xc4\xa3\xf7\x31\x3a\xd2\x11\x6a\x6d\x7c\xe4\x0a\xaa\x10\x01\xc2\x70\x4d\x5b\x05\xae\x54\xc7\xcc\x6f\x56\x72\x17\xf1\xa4\x7b\xfd\x0e\xe7\x38\xea\xea\x5e\xad\xb5\x37\x10\x75\xbe\x07\x6c\x87\x50\xae\xce\xfc\x41\x7e\xa7\xbf\xda\xac\x3c\xc3\x8b\xf1\x6c\xc2\x6d\xf7\x60\x0e\x3c\x7e\x8e\x43\x1f\x26\x76\xfc\x2a\x8c\x43\xa6\xa1\x43\x68\xba\x62\xbb\x32\x43\x9a\x06\xbe\xac\x38\xa0\x47\xb3\x74\x5e\x26\xf4\x07\xad\x82\x3d\x6a\xd1\xc0\xb6\xa4\x43\x41\xe1\x5f\xc9\xb3\x31\x21\x4f\xfc\x89\x69\x82\x11\xb0\x51\x33\xd6\xd3\x43\x3b\x5d\x59\xf7\xab\x4d\x10\x9e\x54\xe4\xc5\xd6\xf3\x2f\xcf\x72\x30\xfa\x4e\x25\x28\xc8\x61\xbb\x21\xcc\xc9\xe3\x10\xe9\x49\x7e\x07\x7e\xa6\x75\x51\x0d\xa7\x12\xb1\xa5\xdf\x57\x5c\x5d\x1b\xf7\x36\x2d\x07\x11\x80\x03\x9a\xec\xfa\xa5\xc8\x57\x3c\x24\xc0\xf4\xeb\xe8\x1c\x2f\x88\x9a\xed\x3d\xe5\xa0\x00\xbe\x12\xfe\x3d\x0a\xf2\xdc\x2c\xd4\x24\x0e\x31\x4a\x17\x6c\x55\x3e\xfd\x5c\xba\x79\x8d\x9f\xf1\xe3\xd4\xbd\x9e\x90\xbb\x81\x13\xe3\x84\x9d\x73\x5a\xfa\x4a\xf6\x94\x5c\xc5\x7d\x4c\x37\x8d\xb8\x4f\x20\x6e\xf7\xea\xb1\x1c\x63\x7a\x7f\x72\x60\xf1\x22\xa9\x7d\xff\x67\x47\xe9\xb4\xc1\x74\xed\x0d\x64\xf9\xef\xd7\xfc\xcc\xf9\x81\x51\x9e\xc5\x80\xa8\x18\x25\x47\xd1\x79\x68\xc4\x01\x51\xfd\xf6\xd5\x4b\xc5\x7a\x91\x15\xf0\x40\xfa\xb5\xc1\x00\xde\xb0\x39\x12\x2b\x7d\x2b\xfd\x98\xb6\xad\xf3\x8f\x42\xb2\x96\xea\x3b\x37\x8a\x90\x42\x59\xb7\x5d\x60\x70\x3b\x48\x40\xb3\xf5\xda\x09\x62\x0a\x54\x77\x62\x80\xe9\xca\x9e\x8c\xd9\x24\xae\xd2\xb5\xdd\x2b\x49\x83\x4e\x58\x1c\xae\xd5\x27\x1c\xd7\x8c\xe0\x8e\x4b\xba\x49\xb5\x9c\xd7\x7c\x1b\x62\x76\x64\x91\x48\xab\x72\x47\xf9\x7f\xc0\x13\x16\x35\xde\x47\x4d\x3c\x23\x49\x3c\xa9\x8d"}, +{{0x60,0xff,0xdb,0xae,0x00,0x3f,0xa2,0x79,0x4f,0xca,0xbb,0xf8,0xf5,0xb4,0x16,0x44,0xfe,0x3a,0x7f,0x44,0xed,0x6c,0x83,0x41,0x93,0xda,0x07,0xa9,0xdc,0x5e,0x26,0x65,},{0x35,0xb5,0xeb,0x31,0xab,0x55,0x64,0x92,0x57,0x8b,0x3d,0xbd,0x6c,0xf1,0x68,0x7d,0x1f,0xdb,0x21,0x6a,0x72,0x58,0x18,0x07,0x96,0x63,0x48,0x2f,0x22,0x1c,0xe4,0x21,},{0xb8,0xf3,0xe1,0xf3,0x78,0x5a,0x2a,0x39,0xbb,0x08,0x6c,0xa4,0x65,0xc0,0xab,0xf0,0xa3,0xe8,0x74,0x43,0x22,0x5a,0xc6,0xe9,0x66,0xed,0x9b,0x45,0x31,0xc5,0x4a,0x89,0x4a,0x9a,0xbd,0x01,0xac,0x31,0xb8,0x57,0x57,0xfe,0x75,0x30,0x8c,0x95,0x94,0xff,0x65,0xf9,0x7c,0xdd,0x91,0xe8,0xd8,0xa9,0x3c,0xf1,0x2b,0x9e,0x6d,0xbe,0xe9,0x0b,},"\x3f\x8f\xf2\x0b\xb4\xf0\x08\x34\xc8\x0f\x2e\xe6\x89\x3d\x6f\x73\xbf\x7a\xce\x27\x29\x60\x1b\xb2\x6a\x0f\xb2\x72\xa4\xd0\xee\xa1\xfa\xe1\xd3\x06\xac\x2c\x5f\x32\xad\xd6\x01\x35\x85\x1d\xa2\x7e\x4f\x12\xe6\x4e\xa5\xe9\xe9\x96\x0b\x13\x83\xb0\x4c\xe0\x5a\x98\xb0\x41\x4d\xad\x97\x1e\xa9\x89\x44\x87\x1d\x41\x5c\xc2\xc4\x6d\xa4\x03\x97\x6d\x9f\x21\x93\x89\x58\xd4\xea\x8c\x79\x03\xb1\x4f\x2a\x44\x85\xfd\x69\xaf\xb2\x4a\xbe\x10\x2d\x8f\xec\x26\x6f\xb4\x68\xb4\x11\xeb\x20\xa3\x39\x67\x7d\x88\xeb\x31\xc9\x97\xb4\xdc\x88\x56\x13\xf0\xbe\x7c\x70\xda\xf8\x56\xa3\xdf\x92\xda\x96\x02\xfb\xa2\xe6\x74\x9d\x2f\x42\x6b\xee\xf6\x86\x62\xd5\xb0\xc2\xfd\x31\x32\x1b\x22\xb5\xec\x59\x7d\xa5\xd7\xe6\xa2\x88\xeb\xd9\x44\x3c\x5f\x39\xeb\x87\xdc\xf4\xa5\xad\x9d\x56\xc6\xba\xf6\x08\x09\x96\xa7\x79\x36\xbd\x87\xdc\x3c\xb4\x2e\xd4\xc4\xd4\x26\x88\xa9\xe1\x93\x82\x9b\x76\x1f\xf3\x20\xe2\xa6\x6c\xc6\x76\x48\xe7\x0e\xea\x3a\x1f\x2f\x9b\x9d\x5b\x42\x02\xfb\x5a\x39\xe9\xad\xc6\x09\x08\x6a\x9b\xe2\xa8\x32\x3a\xc6\x69\x31\xbd\xf6\xc5\x04\xd3\x33\x62\x11\xe4\x6f\xde\xfc\x48\x1f\xbf\x17\xf6\x13\xda\xb1\xfc\x5c\x09\x7c\x92\xdb\x06\x09\x90\x6d\x78\xb2\x5a\x45\x5a\x30\x45\x71\x8e\xfd\x3e\x3b\x14\xe2\x52\xb1\xae\x59\xc7\xc3\x89\x3e\x31\x91\x3b\x2c\x26\x4c\x0f\xfc\x3b\x60\x6c\xa1\xb0\x1d\xc4\x7e\xe8\x28\xa0\x8e\x46\xaf\x60\x4e\x59\x0d\xef\x44\xd2\x7a\xab\x93\xa4\x03\x25\x1f\xca\x07\x72\xe9\xdf\x0f\xab\x7a\xf0\xcb\xc5\x18\x1e\xfd\xa4\xda\x91\x3d\x8e\xb6\x45\x2f\x6c\xec\xbd\xa2\x04\xbc\x72\xd7\xc9\x90\xf6\x0c\xe0\xdd\x83\xc6\x34\xe9\x12\x23\x60\x91\xb0\xa6\x67\x3a\x7c\x89\xea\x59\x30\x8d\x55\xbd\x7e\x63\xa8\x52\x67\x74\xcb\xdd\x7a\x13\x39\xfa\xc2\x12\x4c\x90\x22\xab\xd6\xfe\xce\x7f\x2d\xae\xdf\xd8\x7f\xa6\x83\xdc\x0e\x3e\xf4\x08\x06\xa0\xab\x19\x87\x69\xd3\xa9\x9f\xe8\x1a\x99\xb6\x86\x00\x31\x90\x87\xaf\xa4\xea\x79\xd7\xee\x45\xda\x9c\xd4\x08\x09\xf4\xee\x8f\x4e\x25\xa0\x17\x75\x21\xee\x9d\xba\x8b\x56\x21\x2e\x88\x71\x9b\xb7\x36\x73\x36\xf4\xa7\xbc\x71\x22\xb4\x1a\x7d\xfa\xa2\x67\x2f\x92\xf2\x34\x03\xa1\x0c\x4f\xb2\x53\x88\xc6\xb2\x00\x81\x09\x3d\x49\xf3\xbe\x8a\x9e\x1c\x63\x4e\xf7\xba\x96\xb6\xd5\x23\xdd\x6f\xf6\x13\xc0\xa2\x3b\x60\x45\x70\x26\xcd\x48\x5b\xa8\xdb\x61\xd8\x0a\x0d\xc6\x59\xd9\xaf\x42\xa3\x8c\xae\x77\x7f\xec\x68\xe3\x9c\x52\x98\x6f\xf9\xfc\x20\x78\x9c\x10\x58\x51\x07\xc0\x40\x47\xb6\x6b\xa1\x4e\x93\xfb\x90\x4e\xa9\x0d\xf7\xac\x9f\x01\x54\xc9\x6f\x32\x36\xac\xf6\xdc\x8b\x44\xf5\x54\xc0\xcd\x51\x31\x93\xe5\xdf\xd8\x7e\x08\x5a\xd4\xb3\x8a\xa4\xc5\xe3\x6b\x24\x27\x72\x20\x88\x81\x6e\xcd\x2b\xc3\xa3\xdd\xa0\x1e\x4f\xb3\xff\x5e\xec\x7a\x64\x17\x32\x2b\xa6\xa2\x77\x73\xd2\x44\x95\xa8\x39\x19\x4a\x4a\x58\x2f\xe5\xab\xdb\x8b\x5d\x53\x3a\x24\x26\x25\x89\x24\x1f\xc8\x1f\xdf\x5e\x79\xfd\x26\x77\x64\x28\xf8\xe1\xce\x9e\x92\x6c\xf2\x72\x71\x6e\x75\x83\xab\xfc\x67\xa9\x4a\xae\x08\x16\xc1\x00\x0a\x19\x61\x70\xbb\xff\x1f\x45\xe5\xed\x9e\x26\x7a\xce\x1e\x4d\x91\x5d\xce\x72\x16\xc5\xf4\x04\xde\xf6\xfe\x2b\xd8\xb2\x8b\x2e\xcc\xf3\xe2\xae\xa0\xc0\xd6\x62\x63\x90\x27\x4e\x47\xe7\x45\xed\x3a\x23\xbc\xfd\x21\xd2\x84\xc3\x95\x37\x9d\xc0\x20\x80\xf0\x79\x36\xbc\x15\x4e\x7b\x99\xee\x73\xdb\x18\x8b\xd2\xa3\x94\xe0\x3a\x01\xff\xe2\xd1\xb3\x30\xce\xb7\x21\x58\xf9\x58\xc7\x16\xa8\x17\x11\xdb\xf6\x5a\xff\x8c\xd1\x2f\x5d\xfa\x53\xb3\x76\xeb\xb8\xb9\x8f\x86\x28\xf1\x7e\xf8\xb2\xab\x9c\x0b\xb6\x84\x12\xf4\xe3\x47\xa6\x33\xe2\xf8\xda\x1a\x55\x6d\x96\xf4\xaf\x72\x11\xc0\x78\x07\x9c\x10\x54\x1c\x07\xdc\x37\x22\xd1\x8d\xab\x8f\xa8\xbc\x49\x25\xab\xa5\xc9\x66\xf8\x05\x04\x03\x22\xdf\xbb\xbe\x87\xfb\xfe\xb1\x96\x1f\x5c\xcd\x40\xa9\x1b\x99\x7e\x54\x31\x5a\x7e\xef\xc3\xa4\x7b\xb0\xc8\x7d\xc2\x37\x55\xce\x72\x27\x57\x49\x96\xf4\xbe\x7a\xa3\x44\xfe\x0d\x17\xb9\x7b\xc5\x0c\x58\x38\xf9\x92\x92"}, +{{0x17,0x4e,0x99,0x3d,0x9b,0x81,0xf2,0xaf,0x67,0xe9,0xff,0xb8,0xeb,0xd5,0xda,0x41,0x79,0x66,0xa9,0xe7,0x7f,0x66,0xc6,0x5c,0x76,0x77,0x38,0xfe,0x83,0x57,0xd0,0x7c,},{0x3b,0xb7,0x38,0x6f,0x1b,0x1c,0xbf,0xae,0x55,0x37,0x03,0x83,0x3e,0xbc,0xbf,0xe2,0xdf,0xff,0x8c,0x89,0x9a,0x07,0x92,0xd7,0xce,0x23,0x22,0xb5,0xba,0x64,0x5a,0x5f,},{0xe6,0x07,0xbc,0x9a,0x53,0x60,0xb3,0x1d,0xa5,0x6b,0xe1,0xc5,0x44,0xc2,0x00,0x02,0x84,0x95,0x1d,0x86,0x89,0xf4,0xb7,0x22,0xbc,0x46,0x73,0xa0,0xc8,0x48,0x9b,0x84,0x48,0x3e,0xd8,0xe7,0x6e,0x29,0x7e,0xa0,0x46,0xe8,0x5b,0x37,0xba,0x56,0x30,0x58,0x5e,0x53,0x75,0x56,0x6a,0x18,0x7a,0xfb,0x56,0x96,0x66,0x1e,0x5b,0xfd,0xc1,0x0e,},"\xa4\x01\x75\x0a\xfc\x48\x37\xdf\xe3\xaa\xcc\x28\x4a\x59\x71\x45\xdf\xef\x02\x62\x9e\xf8\x7b\xd0\x93\x8d\x44\x39\x79\xdf\x76\xf2\x9f\xcd\x66\xa5\xb7\x1e\xa8\xab\x78\x72\x77\xe3\x05\x6f\x6e\xa1\x1b\x08\xbd\x23\x89\x79\xf9\xd3\xb0\x62\x53\x8c\x4d\x60\x40\xa8\x6b\x6e\x32\x04\x7a\xec\xc5\x9c\x23\x77\xad\x0e\xa4\xc4\x0c\x79\xff\x9f\xe9\x8c\x95\x8b\x2b\xf2\x5f\x2f\xd6\x34\x24\x32\x63\x6f\x5f\x7d\x5b\xb0\xd2\xec\xf1\x81\x83\x42\x6c\x73\x14\x79\x84\xd9\x5b\xbe\x16\x2e\x11\x97\x2d\xdb\x78\xa2\xa7\xc3\x45\xc5\xc0\xbb\xba\xba\x9c\xf3\x8a\x2d\x5d\xd5\x09\xa7\xdf\x8b\x84\x28\x74\xa9\x6e\x64\xb5\xd6\x4f\x5c\x41\xa2\x1d\x20\x8d\x14\xce\xa7\x06\x6c\xf2\x2d\xee\x0c\xa4\x1a\xa4\x6a\xb9\x21\xd4\xce\xec\x89\xec\x87\x3f\x77\x96\x0e\xda\x60\xd9\x67\x6c\xfd\x0d\xbf\xae\xc8\x72\xc2\xad\xe8\xfb\xa4\x28\x5a\xac\xd5\x27\x14\x3a\xe0\x34\x1d\x67\xd0\x07\x81\x19\x65\x3b\x5d\x23\xd4\x6e\x6e\xf7\x02\x64\xb1\xb0\x91\x38\x70\x87\x76\x23\x71\x6d\x0f\x1a\x59\x02\x1b\xe7\x4c\x91\x4b\x43\x24\x71\xa4\x3a\x29\xf2\xb6\xdb\xeb\x6a\x22\x3e\x2d\xba\xab\xb8\x20\xb4\xad\xbe\x33\x78\x29\xe1\xde\x0c\x18\x4d\xd0\xd0\x9f\x9d\x01\xd4\x25\x27\xe5\xd4\x0a\xbb\xda\xcc\x8a\xc0\xf1\xb2\xc5\xc1\xcb\x2f\x23\x87\x6d\x2d\x1b\x6b\x43\xdf\xe4\x82\xf9\xd4\x5a\x18\xf5\xc2\x2b\x15\xf1\xfe\x52\x1e\xf5\x7b\x08\xae\xc6\xa3\x03\x39\x25\xc7\x45\x4c\x93\xe6\x31\x9e\x77\x8a\xc4\x94\xfb\x14\x0a\xe5\xf1\xa3\x1c\xc8\x32\xca\x24\x88\x65\x10\x04\x06\x3b\xcf\xf8\xfd\x9a\xe9\x26\x6a\xf5\x27\xf2\xc3\x1f\x6a\xcb\x8f\x3d\xeb\xd9\x97\x8e\xf9\xdf\x01\x08\xe3\xd5\x0c\x49\x19\x90\xc9\x0d\xd8\xee\x9d\x64\xea\x4e\xbf\xd7\x11\xc9\x9d\x90\x44\xec\x11\x34\x2c\x53\x83\xca\x39\x23\x2e\xd9\x7a\x07\xe4\xdc\x51\xdb\x4c\x1f\xe9\x47\x34\x8d\xff\xe7\x0a\x95\xc9\x9d\xb1\x47\x51\x31\x48\x01\xf1\x3f\xa2\xbf\x42\xd8\x67\x37\x5a\x08\xee\x9b\x3b\x79\x9e\x0b\x15\x27\x8e\x95\xe9\x1a\x89\x68\x06\x4d\x6d\xfd\x8f\x51\x15\x43\x8c\xcb\x8b\x51\x6c\xa0\xc4\x1d\xbb\x19\x87\x3c\x6e\x10\xa2\x36\xec\xc2\xda\xd5\x22\xf8\x0f\x01\xc1\x4e\x2f\xa1\x4a\x0d\x79\x2b\x9f\xc4\x86\xc6\xfb\x0e\xfb\xdf\x21\x30\xf0\x2d\xf1\x49\x7d\xb5\xab\xa8\xbe\x61\xca\x70\xb2\x93\x88\xe4\xee\xc7\xe0\x69\x4a\x38\xc0\xd0\x3c\x59\xbb\x6a\x2d\xc3\xcc\xd6\xdd\xe1\xe2\x9e\xe2\xc1\xb3\x25\xac\x72\xaa\x8e\x6f\xab\x91\x38\xf8\xb6\xf5\xd3\x24\xd4\x6a\xf3\xa3\x54\x2c\x8b\xd8\x7c\xb0\x4f\xaf\xc5\x4b\x5d\xb8\x27\xde\x60\x67\x62\xa0\x97\xb6\x22\x79\x9c\xa8\x27\xbd\xa9\xc1\xc0\xbb\x26\x7e\xba\x82\x54\xa8\x1c\x6b\x85\x8a\x37\x5b\x94\xbd\x09\xf3\x9e\xeb\x88\xcb\x14\xb8\xd4\x6e\x47\x40\xdc\x1a\xb4\x2a\x89\x5f\x86\xd2\xc5\x7f\xc2\x8b\x07\xb7\xf6\x0f\xc4\xf8\x84\x7b\x8b\xc8\xad\x83\xa2\x48\x1a\x28\xf2\x9b\xca\x35\x10\xff\x8b\xf1\xdd\x75\x81\xe3\x35\x71\x64\xf4\xfe\x92\x0f\x9d\xe8\x39\x37\x6d\xe0\x64\x90\x0d\xc7\xf8\xbc\xf5\x11\xdc\x57\x2e\x0f\x0f\x6a\x75\xb9\x29\x79\x7d\xa4\x1c\x52\xea\xe6\xfe\x13\x75\x0c\xe3\x51\xe8\x76\x76\x30\xba\xdf\x6d\x7d\x4e\xab\x90\xcd\x19\x04\xc9\x6c\x04\x8a\x9a\xcb\x21\x3a\x9e\x5b\x86\x46\x15\x73\x8a\x84\xf2\x22\x98\x6a\xc2\x35\x54\xcf\x4c\xe5\x4e\x80\xab\x57\x33\xc0\x65\xb8\x04\x59\x92\x1d\xd3\xd8\x37\x2d\x0e\x85\x94\xd4\x36\x43\x51\xbf\x04\x1c\x14\x6f\xa8\xd2\x3a\x19\x3e\xb8\x07\xec\xe2\x3f\x24\xab\x65\x95\xe9\x32\xc9\xce\x1a\x75\x9b\xf7\x88\x91\x4d\xb0\x08\xe8\x70\x98\xdd\x81\x46\x5e\x26\x10\x64\x7a\xc3\x8e\x08\x86\x66\xf6\x0e\xc5\xd0\xe2\x17\x33\x20\xa4\x0c\xd9\x85\xf0\xe0\x0d\xbc\x2b\x45\x70\x72\x74\x83\xa8\xc2\x5f\x6f\xc1\xe0\x93\xbb\x57\xcc\xaf\xd1\xca\x20\x2f\x29\x86\xc7\xc5\x54\x0a\x7c\x3e\x10\xc4\xa6\xfc\x26\xd1\xd6\x2c\x2c\xa5\xaf\x83\x05\xce\xeb\xe4\x2f\xf9\x6e\x7d\xc5\x48\x21\x43\x75\xe8\xa7\xf9\xf7\x12\xba\x8b\xd8\x75\xe4\x3c\xa1\x0c\xf9\xb1\x83\xf0\xc8\x51\x95\x12\x92\x85\x38\xa4\x78\xcb\x98\x25\x9b\xd8\xb3\xe3\x34\xbc\xc4\x63\x55\x95\xca\xd3"}, +{{0xe5,0x37,0x15,0xfe,0xc9,0xd3,0xb2,0x0e,0x9c,0x29,0x91,0xe5,0x4b,0x5e,0xb0,0xa8,0xcc,0x81,0x87,0x55,0x69,0xc9,0x5e,0x22,0xa2,0x00,0x13,0x60,0x02,0x17,0x60,0x04,},{0x53,0x51,0x89,0x9b,0x69,0xb2,0x11,0x6b,0xc7,0xf8,0xa8,0x81,0x4d,0x1e,0x5b,0x9f,0xc7,0x85,0x69,0x8b,0xeb,0xd9,0xab,0x14,0x27,0x7c,0x3e,0xcc,0x01,0xef,0x8b,0x1d,},{0x3d,0x0a,0xdc,0xe7,0x7a,0x4e,0x04,0x6f,0xcb,0x9b,0x49,0xad,0x5e,0x6c,0x68,0x09,0xc8,0xac,0x33,0x6c,0x73,0x34,0x04,0xe5,0xd3,0xf0,0x15,0xc9,0x22,0x5c,0x3d,0xf4,0x6e,0xf2,0x1e,0xa3,0x4c,0xff,0xb3,0xaf,0x69,0x97,0x4f,0x8b,0x7e,0xab,0x2d,0x23,0xfc,0xd5,0xa1,0xe1,0x75,0x3a,0x40,0x23,0xde,0xb3,0x81,0x86,0x29,0xa9,0x8a,0x0b,},"\x84\x31\xcd\x16\xd5\xc0\x93\x77\x5e\x18\xc0\x82\x52\xc4\x3f\x95\xb1\x01\x7e\xb7\x11\xfc\xaf\x73\xe1\xe0\x0c\x0c\xd6\xf3\x44\x87\x44\xab\x9b\x0e\x64\x33\x55\x18\xc4\x83\xae\x94\xde\xb9\x76\x77\xf8\x18\xf0\xe8\x1a\x74\x90\x61\x5b\x71\x41\xb9\xc3\x5f\x80\x55\x6e\x69\x71\xce\xa2\x8e\x9a\x32\xc3\x28\xcc\x26\x69\xfc\xa5\xb1\x23\xcb\x66\x2d\xeb\xab\x2b\x98\x15\x77\x64\x66\x80\x70\xe1\x8e\xdf\x76\x1a\xe1\x96\xbd\x4b\x24\x4f\xea\x7b\x74\x98\x45\x16\xbe\x2c\x00\x73\x9e\x76\xe6\xc4\xb6\x21\xcb\x39\x83\x76\x5a\x20\xd8\x47\x78\xd5\xa4\x35\x0b\x16\x8f\x6a\x0f\x71\x2a\x98\x20\xa8\x5a\x63\x6f\xaf\x92\xc7\x89\xc4\x28\xcf\xd2\x96\x2e\xd2\x07\xc3\xac\x88\x99\xc2\x58\xca\xc1\xad\xb5\x15\x9f\x76\x4b\xa3\x72\x29\xc5\xcb\xf7\x83\xfc\x9a\xa4\xd1\xea\x46\xec\xc8\x5f\xe0\x96\x14\x85\xd4\xfc\x5c\xb2\x1d\xf0\x01\x2a\xc9\xb9\x55\x37\x3b\x14\x22\xe5\x1a\xfa\x1c\x55\x09\x88\x86\x2c\x86\x13\x3b\x76\x0a\xa6\x30\xfc\x0a\xce\xe8\x98\x91\x17\xd1\xdd\x96\xe3\xe6\x28\x7b\x69\x28\x7c\x59\x0b\xdc\xa9\xcb\xc8\xee\xce\xf2\x81\xee\x6d\x1c\x8d\x88\x82\x2b\xfe\xa5\xfa\x0f\x53\x0f\x23\x27\x80\x93\xc7\xc8\x5a\x0d\x44\xc3\xa7\x74\x04\xee\x79\xf1\xc8\x36\x8c\xd7\x32\x1b\xf1\x48\xfd\xa4\xdc\xf2\xeb\x07\xe4\x63\x0e\xa4\x22\x58\x75\x86\x37\x17\x80\x51\x45\x36\xb8\x94\xc5\x24\xe6\xb8\x3d\x5a\x76\xa1\x5c\x83\xe9\x5a\xb3\x14\xe0\x7b\x34\xb9\x8c\xd9\x9e\x07\x70\xb4\xeb\x9b\x3f\x3f\x50\x5b\xae\x8a\x06\xf7\xf9\x50\x25\x8d\x79\x07\x48\x10\x71\x95\xeb\x4f\x6b\x84\x84\x0f\x8c\x05\x90\x72\x73\x96\xed\x14\xe3\xf5\x32\x39\x47\x6c\x4d\x2a\x72\x69\xb2\xe1\xf9\x72\xfb\xff\x33\xe4\x72\x44\x26\x74\x5e\xc8\x86\xa3\x29\x16\x29\x5e\x70\xd4\x68\xd0\x6c\x7d\xbb\x5f\xf9\xa3\x54\xe1\xac\x90\x3b\xb4\x5c\xa5\x26\xf0\x8b\x49\xa6\x5e\x82\x29\x7d\x8d\xd3\xfb\x25\xaa\x42\x8f\x64\x34\x5b\xca\x97\x40\xd9\x07\x8d\xac\x9e\x11\x38\xc9\x21\xbd\xd7\x48\x81\x67\x3d\x49\xd0\xcd\x20\x06\x81\x17\x23\xde\x28\x7c\x6c\x95\x83\xe4\x56\xa0\x1a\xb1\xa3\x4d\xfa\x1e\xaa\x96\x3b\x71\xe8\xbc\x7f\xa8\xa9\x8c\xad\x4f\x94\x1e\x4b\x37\xb6\x0e\xef\x92\x3b\x32\x94\x88\x23\x50\xb3\x8e\xa4\xea\xc0\xe9\x23\x2e\x93\xc5\x32\xdb\x5d\x7e\xec\x8e\xcf\xae\x65\xe0\x80\x47\x30\x78\x77\x7d\xdf\xdd\x11\x50\x8a\x6e\x59\xf0\xeb\xaa\x3f\x60\x44\x1f\x82\xa7\x1a\x73\xc8\x4b\xca\x06\xa3\x71\xff\x5c\x9f\x77\x21\x3a\x2d\xb7\x95\xd4\xa8\x89\x78\x23\xd8\x8f\xd9\x2a\xe3\xe0\x57\xe8\xbb\xd8\x0c\x99\x0a\xf8\x38\x6b\xdf\x26\xf1\x2d\x97\x3c\x8c\x5f\xf9\xed\x6f\x7b\x2d\x8e\x61\x83\xcf\x6e\x68\xf3\xbb\x89\x8f\x59\xa9\x3e\xc4\xde\x3b\xea\x60\x5a\x5d\x8b\x15\xdf\xab\x71\x3f\x35\x85\xc4\x8d\xc9\xa5\x76\x82\x42\xb3\x31\x01\x43\x80\x30\xe7\x04\x48\x80\xd1\x7c\x2e\xe8\x4f\x89\xd2\x6a\x1f\x7b\x19\x86\x19\x3f\x96\x63\xc5\x87\xd5\x0c\xa9\xdd\xf6\x18\x6a\x51\x76\xaf\xef\x1a\xdb\x24\x81\xb7\x92\x54\xb7\x8d\x3b\x34\xc6\x97\x90\xeb\x28\xb9\x0b\x14\x61\x17\x0c\x3d\x73\x81\x83\x76\xcd\xf3\x71\xaf\x0a\x0f\xea\xf1\x4f\xdf\x70\x16\xed\x6e\x7f\x08\xc0\xc1\x4b\x52\x70\x5c\x86\xd4\xf0\x00\x3b\x5e\x45\xf9\x74\xc0\x64\x16\xcc\xb5\xca\x3e\x9d\x52\x9a\xa9\xd4\x15\xc2\x5a\x44\x6f\xa2\xd6\x9e\x82\xf4\x99\x4e\x57\xe9\x22\xc1\x7c\x1c\x34\x2d\xd7\x28\x1e\x41\x00\x52\xd9\xe4\xaa\x1b\x30\x9b\x7d\x47\x0d\x45\x8c\x66\x3e\x17\xff\x25\x00\xd0\xbb\x8e\x46\xa9\xc4\x36\x7e\x09\x1c\xaf\x87\xdd\xfc\x06\x2a\xae\x08\xa6\x5c\xb9\xe0\xea\xa7\x1c\x99\x45\x9c\x5e\x7c\xb1\x12\xa2\xee\x98\xa5\xe4\xcb\xee\x0d\xc5\x20\xf8\x7c\x30\x22\xda\x65\x49\xbe\x1e\xe7\x0a\x0a\x73\xad\x84\x99\xc9\x7d\xd0\x6a\xa1\x4c\x9f\xd8\x62\x8a\x92\xca\x6d\xb4\x87\x32\x2d\xb9\x59\x8a\xda\x1f\xce\x28\xf4\xb9\xfc\x1d\x3c\xc3\x9d\xcf\x2e\xd1\xdf\x3d\x86\x2d\x87\xf5\x5c\xc1\x01\x6f\xb9\xe7\x3e\x7c\xc8\x97\xb9\x70\xd5\xff\x35\xac\xfe\xb0\x5c\x1c\x89\x19\x28\x08\xae\xeb\xfb\x2c\xd1\x7c\xb1\xc9\x4f\xab\x05\x98\x98\xfe\xdc\x2f\xbd\x44\xcc\xef"}, +{{0xab,0xfd,0x69,0x7b,0xfb,0xc5,0xb6,0xff,0x2b,0xdf,0xf3,0xbc,0xe1,0xd7,0x77,0xe0,0x5f,0xbe,0x3e,0xc8,0xb9,0x5c,0xe6,0x93,0xd6,0x23,0x93,0x12,0x09,0x31,0x3d,0x4f,},{0xa7,0x09,0x32,0x1a,0x02,0x10,0xcb,0x80,0xab,0x58,0xbf,0x95,0x5e,0xcd,0xeb,0x8a,0xaf,0x9e,0xe4,0xc3,0x75,0xf9,0x59,0xc5,0x30,0x89,0xd4,0x37,0x48,0x8c,0x08,0x2d,},{0x8c,0x36,0xb5,0xa1,0x11,0xc5,0xa8,0x11,0x9f,0x2d,0x9d,0xb5,0x7e,0xbb,0x59,0x2d,0xae,0x86,0xad,0x4b,0xf6,0x78,0xc1,0x49,0x2e,0x26,0xf3,0xc1,0x0f,0xbe,0x03,0xf1,0x05,0xca,0xe0,0xdc,0x68,0xb5,0x52,0x59,0xb9,0xb5,0x98,0x92,0x89,0xdb,0x33,0xd9,0x5d,0x2e,0xe6,0xb7,0x56,0xc7,0x60,0xf9,0xd3,0xaa,0x0e,0x68,0xa1,0x89,0xde,0x02,},"\x89\x6b\x7a\xb8\x41\x3f\xfe\x43\x9a\x2f\x44\x87\xec\x49\xd6\x4e\x31\xc7\x4f\x50\xac\x83\xf5\x5d\xa6\x1a\x70\x03\xaa\x71\x6c\x2a\x9d\xf6\xb4\x38\xe6\x2f\x53\xd8\xf0\x19\x2f\x37\x36\x32\x47\x60\xd7\xe8\xc4\x4a\xc0\xba\xca\x3a\xe2\xa6\xfb\x93\xf1\x3d\x96\x88\x67\x99\xfd\x2c\x45\x51\xb0\xab\x36\xf1\x73\x08\x55\x55\x12\x65\xa5\xa3\xc3\xc2\x1d\x95\x16\xa2\x37\xf5\xdb\xc1\xc8\xe7\x29\x99\xb7\x82\xc5\xca\x41\xa4\xf6\xe9\x30\x8e\x64\xaf\xde\xe0\xbf\x47\x9e\x54\x6b\x89\xc5\x1b\xc5\xe4\xf7\x1e\x57\xfb\x24\xce\x43\x7a\x8b\x81\xb9\x1d\xc7\x98\xb5\xab\x36\xf2\x9a\xfd\x5b\x48\xe8\x1c\x17\x6a\xe5\xed\xf9\x53\x71\xba\x32\x46\xfb\x43\x94\x05\xbd\x10\xee\xd3\x67\x8e\x3e\xc6\x23\x07\xa3\xb3\xdc\x1b\xad\xba\x05\x1f\x16\x77\x4b\x85\x08\x81\x88\xc2\xa9\xe3\x20\xa1\x61\x8d\x5f\x26\xce\x94\xee\x2b\x93\x3c\x30\x5f\x6d\x95\x84\x95\x8e\xea\x31\x56\xc3\xd1\xe0\xef\x39\xa1\x86\x27\x5e\xe6\x2c\x40\xf3\xc1\xac\xd1\x5d\x8b\xe6\xe0\x74\x35\x1f\x53\x49\xce\x3d\xf6\x95\x17\x50\x5f\x45\xfa\x06\xa8\x15\xc6\x9c\xa1\x8f\x45\x0f\x42\xb5\xcf\x4e\xbd\x99\x26\x84\x45\xe0\xf6\x81\x04\xa7\xde\xeb\x0a\x11\x5b\x81\x7b\x99\xe1\xa7\x3e\x0f\xa9\xd8\x7d\xb7\x1f\x8e\xc9\x4f\x87\x08\xc9\xbc\x2e\x62\x2b\x96\x33\x65\xeb\xcf\xb9\x7c\xfe\x73\x32\x63\x00\x70\xe9\x65\x4e\xaa\x60\x36\x1a\x45\xd4\x02\xdc\x0a\xb2\x97\x66\x52\x42\x66\x7f\xbd\x99\x40\xf6\xcd\x33\x19\x52\x46\xa8\xc2\x86\x9a\xf7\x59\xa8\x62\xd4\xb6\x41\xdb\x14\x4d\x57\x32\x36\x6b\x20\x63\x6c\x40\x27\x78\x7f\x55\x80\x27\xd7\x6f\xcb\xf8\x43\x2e\xb9\x3e\x6d\x14\x56\x7d\xf8\xdb\xf2\x11\xda\xeb\x56\x55\xdb\x10\xac\xdd\xd0\x5e\xca\x06\xac\xce\xe9\xfd\xa8\xd3\xb7\x0c\xa1\xe6\xdc\x58\x7f\xa4\xb7\x8f\x63\xcd\x66\x3f\xf0\x24\x38\x70\x57\x0f\x4d\xcb\xaa\x3f\xb6\x26\xb4\xe1\x13\xbd\xe4\x7d\x5c\x9d\xb2\xb4\xba\x6e\xc6\xdb\xf9\x18\xac\x05\x69\x49\xef\x3c\xfc\xb1\x15\x56\x16\x15\x77\x1a\x03\x5a\x43\xd3\x3b\xa2\x65\x1d\xbe\xb4\x63\x48\x26\x1c\xe3\xc4\xc9\xf2\x46\xd2\x3f\x94\xdb\xc2\xd0\xc1\x9b\x92\x1e\x24\xc7\x7d\xa5\x99\x2f\x1b\x4b\xdf\x2e\xde\xa4\x99\xf5\x41\x11\x68\xac\x0c\x12\xe9\x6f\x3b\x15\xd2\xe1\x2a\xc8\xd7\xb3\xed\x8d\x1e\x07\xc4\x26\x7a\x25\xd3\xa3\xc3\x53\xa4\x20\x8b\x74\x06\x27\x8a\xab\x9e\x70\x0f\x7b\x20\x6f\x48\xe6\xea\x7c\xc9\x7e\x55\x4f\x15\xc9\xbe\x34\x9d\xd9\x15\x14\xdb\xe8\xd8\x89\xf2\xdc\xbb\xfa\x18\x2c\x9f\xaf\x58\x07\xa6\x9b\x2e\x97\xfa\x77\x1a\x6f\x23\x1a\x4c\x7b\x31\xd1\x17\xb8\xed\x0e\x63\x0c\xdf\x13\xe0\x82\xbb\x4f\x63\xc3\xf9\xac\xb3\x55\x32\x04\xcc\xd7\x6e\x18\x35\xc4\x6e\xec\x3d\x43\xc5\x61\xbb\xf1\x7c\x92\x21\x4a\x6d\xb1\x21\x2b\x60\x03\xcf\x2c\xc2\x6c\x7a\xe6\x75\xfc\xd0\x53\xb9\x47\xe7\x22\xf9\xe8\x57\x62\xce\x8a\x16\xe4\x65\x4e\xc6\x34\x2f\xc6\x46\xe5\xca\xb4\x72\x79\x7e\xab\xf6\x58\xba\x4a\xfd\x14\x2f\xc8\xfc\x4c\x8f\x98\xf2\x3c\x24\xdc\x99\x84\x7a\xe8\xce\xf0\x87\x9e\x1a\xb3\xbb\x80\x97\xe4\xc3\x52\x9a\xdd\x2d\x8e\x8e\x2c\x20\x69\x21\x0f\x50\xac\xe1\xae\x32\xa6\xc8\xe6\x38\x4a\x2b\xf7\xd7\x9c\x66\xc7\x46\x14\x9c\x84\xad\x75\xa3\xa1\x76\xe4\x5e\x13\x6d\x94\x69\x5a\xed\x4b\xfd\x08\xb4\x26\xea\x8c\x4b\x93\x79\xf3\x74\x25\x50\xe1\xcf\x5a\xc8\x4c\x18\x17\x4d\x68\x0e\x92\xaf\x2c\x18\x74\xac\x1c\x13\xd2\x82\x32\xde\x19\x37\x68\xe5\x61\x94\x7c\xbd\x6b\x79\xe9\xb9\x9d\xa6\x5c\xfb\x74\xff\xb3\x2f\x7d\x3d\x20\x25\xc6\x07\x63\xdc\x07\xf5\x55\x39\xb4\xd2\x53\xde\x1e\x6c\x25\x82\x3a\x62\x58\xc7\xa9\xce\xd1\x50\x1d\xce\x27\x86\x89\x8a\x3e\x05\xc9\xbf\xf8\xfc\x5b\x21\x25\xd0\xf4\x71\x08\x8a\x13\x4b\x48\x73\xc8\xd5\x5c\x04\x45\xf6\xca\x39\x6b\x3d\x7b\x4b\xc2\xbf\x5c\x4d\x22\x40\xda\x41\x82\x93\xaf\x6a\x3e\xd8\x53\xde\xdd\x3b\xf6\x68\xd9\x37\xb3\x5a\xa0\xc2\xac\xbf\x23\x76\x6f\x9f\x3e\x96\x82\x84\x75\xab\x08\x64\x96\x61\x7a\x6e\x81\xd6\x53\x58\x9b\x2f\xe5\x0b\x7b\xa8\xf0\xcf\x1e\x5a\x44\xd8\xd6\x2f\x08\x37\x7a\xbf\xc2\x62\x97"}, +{{0xdc,0xfa,0xd5,0x9f,0xc6,0xb6,0x97,0x10,0x9e,0x72,0x7f,0xf6,0x6a,0x5f,0xe9,0x3a,0x6a,0x22,0x6f,0x63,0x1a,0x64,0xe5,0x79,0x7a,0xd8,0xd8,0xc8,0xb6,0x35,0x87,0x34,},{0xe7,0x9f,0x4f,0x51,0x13,0x72,0xe3,0x55,0xe7,0xe9,0xe0,0xe8,0xb5,0x34,0x6f,0xdb,0xcd,0x2d,0xf1,0xfc,0x5c,0x3a,0x18,0x90,0xd2,0x7f,0xa1,0xfa,0x92,0x8d,0x27,0xa6,},{0x05,0x2f,0xf7,0x95,0x40,0x73,0x74,0x56,0xc6,0xa4,0x2c,0x41,0xc9,0x7d,0x6b,0xf5,0x17,0xb8,0xcf,0x28,0x9b,0xc7,0x8b,0x50,0x3d,0xee,0x6a,0x30,0xef,0x51,0x68,0xb3,0x8f,0x75,0xbe,0xac,0xa1,0xe1,0x4d,0x97,0x1f,0x87,0x73,0xe3,0x94,0x1b,0xd6,0xdf,0x5c,0xb9,0x77,0x8d,0xea,0x12,0x5a,0x4c,0x4f,0xe0,0x11,0x6b,0x70,0xee,0x84,0x0b,},"\x7d\x92\xdd\xd8\x13\x3c\x61\xc6\x10\xc1\x30\x8c\x23\xae\xaf\x99\x38\x84\xa4\xe6\x7f\x7b\x94\xbb\x88\x6d\xad\x50\x98\x69\xa9\x32\xec\x4a\x27\xd4\x10\xd2\xc2\x9c\xa7\xae\xae\x6f\x92\x80\xcf\x6c\x4b\x06\x7e\xc7\x51\xe5\xe8\xc3\x9f\xf4\x44\xd4\x22\xce\xab\xae\x14\x5d\x42\xf0\x47\x45\x3d\xd4\x02\xd1\x79\x74\x05\x03\x34\x09\xe7\x2c\xc1\x9f\x79\x3d\x5d\x26\x8f\xb3\xfd\x2c\x11\xea\x2c\xb0\xd7\x04\x36\xe1\x8f\x9e\x88\xa0\x15\x15\xdc\x86\x5f\x6a\x1e\xb2\x36\x90\x32\x8f\xd7\x5d\xe2\x63\x21\xa3\x8f\x12\x19\x7a\x97\x20\x1b\x1d\x84\x52\x94\x4f\xbc\x54\x1c\xb6\x8c\x77\xd4\x95\x15\xdb\x53\x26\xf2\xb1\xd0\x76\x3e\xda\x06\xd2\x50\xce\x2a\x5e\x0b\xbd\x7d\x16\x76\xd7\xd4\x1f\xb3\xab\xe8\x8b\xdb\xe3\x72\xf9\x6b\xf7\xbb\x52\x6d\x6b\x65\xa2\x51\x5e\x83\xa5\x77\x04\x5b\x54\x79\xb3\x8b\x85\x2f\xe4\xab\x01\x1c\xbf\x21\xc0\x85\xef\x5f\x0a\x7c\x1b\xed\x76\x57\x2b\x0f\x86\x02\x28\x06\x7a\x89\x9f\x89\x5a\xe7\xf6\x25\x6e\xb6\x51\x40\x87\xf9\xd6\xf5\xc3\x55\x96\xc1\xf4\x80\xc7\x31\x13\x54\x6c\xb9\xcc\x30\xf5\x6a\xb0\x74\xa9\xff\x28\xac\xab\x7e\x42\x65\x0a\x96\x1d\xa3\x25\xac\x5b\x65\x94\xb8\x1c\x93\x25\x0a\xe7\xd3\x92\x67\xa1\x9c\x97\x62\x54\x07\xed\xda\x04\x04\xcb\xe5\xa3\x6e\x95\x9f\xc8\x20\xb2\x7e\xf5\xca\xd7\x96\xc1\x1e\xaf\xf1\xc0\xe2\xf9\xd4\xb3\xc6\x49\x15\x02\x19\x5d\xe0\x36\x59\xb3\x64\xe4\xe8\x7b\x2b\x2d\x73\x3e\xc2\x5e\x6f\x9b\x63\xd5\xf6\x91\x79\xe0\xd2\x7b\xd4\xae\xcc\x8f\x12\xa5\x07\xa9\x1b\xaa\x48\xd9\x9b\x3a\x42\x6c\xec\xeb\xae\xf3\x7d\x73\x61\x10\x6a\x84\x90\x64\x43\x09\xf6\xeb\x4d\x25\x96\x44\x3b\x6b\x01\x18\xb9\x45\xac\xec\xc6\x44\x3e\xa6\x1f\xcd\x15\x5b\x54\x32\x5b\xc2\xc3\x1b\xe0\x25\x0f\x94\x82\xe1\x3f\xd8\xeb\x44\xe2\xae\xd7\x6b\xe8\x12\xaf\x54\x53\xcb\x7f\x86\x32\x45\x8f\xc8\xa0\x2a\x2f\x45\x48\x0d\x79\xb0\x6c\x7d\xda\x38\xb4\x69\x5d\x08\xb5\xa4\x30\x50\x4f\x1a\xe2\x27\x5b\x05\xc9\x1e\x79\x9d\x44\x70\xf3\x8a\xbe\x77\x73\x6d\xfa\x89\x5c\x19\x7e\xa4\xb6\x3c\x2d\xf1\x8e\xfe\xb1\x41\x84\x83\x7b\x8d\xdf\x48\x90\x95\x20\xd9\x10\x45\xb9\xd9\x65\x5c\x22\x5a\x83\x17\x39\x60\xb4\xd7\xcd\x0d\x8b\xae\x30\x23\x75\x57\xf8\x69\x70\x8b\xe1\x38\xad\x52\x46\xc8\x66\xc6\xc0\x59\xdc\x59\x7a\xbf\xd4\x94\x32\x37\x37\x68\x96\x73\x6b\x97\xb7\xe0\x28\x9e\xf9\xbb\xd2\x94\x77\x74\x5c\xb6\x0f\x46\x20\x2f\x1d\xe9\x84\xf5\x09\xb1\x80\x88\x33\xf5\x80\x18\xcd\xe8\xc2\x6b\xef\x4c\x00\x5b\xdc\xa3\x85\xb0\x57\x35\x11\x0c\xa0\x2e\x56\x2b\x50\xed\xdf\xf6\xfd\xe9\xfb\xb8\xd0\x30\xce\xdf\x70\x31\xbb\xeb\x32\xb1\x2b\x24\x2b\xe4\x9f\xde\x01\x60\xc1\xfb\xde\x99\xb0\x3c\x06\x2a\x1a\x47\x06\x23\x45\xc9\x2e\x0b\x60\x4d\x08\x0f\xac\xce\x92\x43\x48\x15\x29\xc7\x05\x97\xdf\xd6\x43\x82\xcb\x54\x06\x91\xb5\x9b\x71\xb0\x94\x33\x2b\xaf\x0b\xbb\x12\x5b\x63\xa4\x46\xbb\x97\x49\x1c\x04\x64\x32\x8c\xab\xd7\x62\x7c\x46\xf3\x92\xf3\xb1\x24\x82\x2f\x20\x13\xc6\xe1\x6d\x3c\xa8\x7c\xc5\xbe\xcf\x56\xb0\xfc\x6e\xb2\xbf\x99\x23\xb3\x01\x2b\xa2\xb6\x12\x50\xa6\x33\xa4\xd2\xee\x39\x12\x56\xc5\x20\x95\x73\x82\xaf\xf9\x70\xc5\xd2\x23\x85\xc3\x34\x4c\x6d\x4b\x45\x61\x57\x1c\x96\x32\x9b\xf7\x56\x15\x29\x75\x16\xb9\xf2\xce\xb9\xf9\x97\xa3\x95\x23\xaa\x0f\x58\xb4\x88\x77\x2d\x82\xfc\x0d\x78\xc5\xdd\x52\xec\xfa\x6b\xfa\xc6\x3a\x76\xe1\x48\x08\x8b\x36\xf2\x4a\x88\xe6\x83\x85\x49\x6d\xda\xdf\x30\x23\xf7\x2d\x87\xc2\xef\xa2\x6e\x87\x7d\x32\xf1\xda\x97\xcd\xb4\x2c\x8f\x15\x71\x89\x88\xe4\x28\xcd\x02\xf4\xd0\x95\x43\xbd\x0b\xd5\xb2\xf4\x09\x96\x3d\x0f\xa3\x73\x53\x1f\x78\xb5\x92\xbd\x13\x7e\xea\xea\x0b\x4e\x7f\x91\x82\x08\xe1\xd5\x90\x08\xa8\xaf\x50\x58\xf5\xd9\x23\xc4\xf3\x2d\xf1\x99\x90\xf1\x0d\xd3\xf0\xeb\x20\x62\x93\xb2\xb3\x44\x3f\x4a\x5d\x2d\xcc\x5f\x7d\x3b\xba\xf6\xaf\x43\xfe\x45\xf5\xdb\xbe\x53\xec\xf4\xbf\x1b\x4a\x13\xe2\xd4\x6e\xf8\x02\x98\xd4\xf0\x1c\x40\x2e\x21\x0f\xcb\x9f\xf2\x08\x4e\xc0\x3e\x42\x00\x8d"}, +{{0x69,0x6d,0xc4,0x81,0xf6,0x19,0xa9,0x49,0x85,0x63,0xc8,0x3d,0x0d,0x0e,0x55,0x56,0x5c,0x14,0xa0,0x78,0x45,0xfe,0x4a,0x66,0xab,0xa2,0x24,0x7b,0x11,0x3f,0xf8,0xef,},{0xc9,0xd7,0x37,0xab,0xc4,0xa9,0xe7,0x3c,0x14,0x9e,0xad,0xc1,0x95,0xa8,0x37,0x89,0x9f,0x2c,0xd5,0x01,0x93,0x73,0xc3,0x0e,0xca,0xf6,0x2e,0x5f,0x8e,0x14,0xb6,0x45,},{0xde,0xd5,0xd9,0x91,0x93,0x5c,0xd1,0xf9,0x39,0x0f,0x1e,0x85,0x92,0x9c,0xa1,0x6d,0xab,0xfc,0x83,0xe6,0x5e,0x43,0x27,0x2e,0xb1,0x75,0x16,0x71,0xaa,0x31,0x93,0x0c,0x72,0x85,0x55,0x34,0x14,0x30,0xce,0x7c,0x80,0x48,0x5d,0xe5,0x80,0x06,0x42,0x71,0x29,0xa4,0xd3,0x4f,0xd6,0x81,0xd5,0x2d,0x84,0x0a,0x16,0xba,0xfa,0x15,0x30,0x02,},"\x2d\x4b\x3a\xd0\xcc\x99\xf9\x83\xe4\x1f\x9b\x48\xc4\xa8\x18\xef\xf7\x5f\xcf\xb9\x3a\x12\x29\xec\x27\x40\xed\x19\xc1\x07\xd6\x21\xdf\x78\x05\x8d\xe7\xc2\xdd\x72\x51\xf5\xff\x45\x43\x40\x86\x5f\x6c\x86\xda\x65\x83\x1f\x66\x72\xdb\x23\x17\x26\xfd\xfe\x4b\x9e\xe3\x15\xd9\x3c\x72\x44\xa9\x20\xdf\x37\x05\x4c\x82\x44\x9d\x31\x0f\x89\x29\x32\xdd\xba\xd9\x4c\xc9\xbb\x39\xac\x89\x37\xcc\x76\xc9\x65\x21\xd3\xfd\xc0\x28\xba\x23\x41\x0b\x29\x02\x3e\x81\x38\xfd\x3f\x52\x43\x19\x88\x4e\xe5\xda\xd0\xd2\x34\xc8\xdf\x66\x1f\x88\x24\xbe\x47\x7e\x21\x69\x9f\x63\x69\xb1\x5f\xf3\xff\xef\xc1\x51\xaa\x55\x5b\x3c\x3d\x76\xad\xb4\x5f\x25\x67\x2d\x38\x0d\x47\x2b\x31\x48\xda\xbd\xef\x42\x45\xb6\x8e\x82\x85\x62\xf2\x5c\xc5\xb8\x1d\x9b\xbb\x24\x1b\xca\x9d\x19\x34\xea\x35\x3f\x95\xf7\xdb\xf3\x64\x64\x33\xe8\x1a\x35\x4e\x1e\x20\x56\xb8\x1c\x15\xaa\x1f\xa8\xed\x7a\x9d\x1a\xf9\x92\x38\xcd\x5a\x5a\xe9\xe8\x41\xc4\x8d\xc3\x48\xae\x1d\xe7\xc4\x1a\xca\x23\x32\x82\x36\xbc\x38\xb4\x7f\x47\xc7\x36\xb2\x57\xa3\x07\x8d\x57\xd5\x74\xb6\x47\xa7\xfc\x8c\x4d\x01\xbc\x50\x30\x21\x50\xd5\x03\x2b\xfa\xcb\x04\xbb\x0f\xd1\x55\xd9\x4d\x92\x06\x66\x77\x20\xe1\x80\xa6\x45\xaf\x46\x24\x59\xe3\x32\x6d\x46\x0d\xa3\xc4\x8e\x75\x72\x67\x8e\x19\x19\x26\x8d\x3e\x47\x40\xd6\x2a\x26\xf7\xc8\x55\x9c\x1c\x43\x9b\x4b\x0b\x0c\x59\x42\xa6\x20\xcf\xdb\x93\xcc\x68\xaa\x15\x52\x0f\xf2\x86\x42\x69\xd7\xa0\xc1\x55\x78\x0a\xdc\x6c\x18\x8e\x0b\x56\x5f\xb9\x59\x43\x19\xe6\xf5\x1d\x15\xca\xf6\xb2\x80\xe7\x15\x8f\x25\x79\x94\x07\xf3\xba\x0d\xd1\xce\xea\x64\xb9\x32\x6d\x2c\xfd\xef\x01\x7e\x1f\x17\x2f\x4d\xde\x0f\x7e\x46\x13\x50\x1a\xf0\x1e\xe0\xac\x30\x09\x5f\x48\xb5\x95\x90\x90\x2b\x1a\xec\xfe\x09\x34\x13\x91\x8d\x83\x5a\xdf\x96\x2e\xcf\x18\x58\x0d\x16\xf9\xfd\x4f\x6f\xa1\x09\x8a\xf1\xd8\xa2\xbc\x24\xdc\x86\xf7\x1d\x0a\x61\xff\x15\x00\x10\x86\x7d\x08\x69\x87\xb5\x1d\xd0\x30\xf5\x0a\xb6\xe3\x74\xb8\xe0\x11\x84\xb3\xe2\xb2\x14\xab\x1c\x7f\xdf\xae\xdb\xc5\x45\xe3\x8c\x3c\xd2\xf6\x98\x29\x79\x54\x1f\xe0\xff\x88\xbe\xd6\x75\x06\xda\x95\x72\x7a\xf1\xa2\x03\x8f\x32\x40\xae\x5b\xfd\x30\xee\x09\x21\x0e\x00\xfd\xcf\x2a\x06\x4d\x5d\xb4\x61\x49\x46\xbd\xa9\x72\xc6\x70\x08\x1a\x6e\xe6\xa1\x0b\x63\xf6\x73\xc8\x3c\x91\x5c\xa5\x57\x3e\x0e\xd6\x87\xb0\x06\x7c\x40\x07\x92\xa9\xbc\xc3\x34\x4e\x0e\x43\xf5\xdf\x63\xfe\xd5\xef\xa8\x5e\x9a\xaf\x85\xe4\xd7\xa2\xc5\x3a\x6c\x92\x82\x8e\x07\xfe\x63\xe2\xd2\x3f\x1b\xdf\x97\xd8\x4a\xdc\x36\xe9\xfc\x95\xfa\xad\xf0\x3e\x06\xd6\x5a\x19\xc5\xe2\x85\xef\xfd\x0e\xa0\xcf\xa8\x39\xd5\x5a\x0a\x0d\xbf\x6d\xa2\x87\x85\xc7\x7f\x5c\x04\xbf\xd5\x99\x74\xef\x37\x93\xcd\xc3\x98\xdf\x7a\x1b\xbc\x9c\xfc\xfc\x3a\x51\xff\xa9\xa2\x0d\x60\xc4\x7b\x24\x5d\xaf\xa3\xe4\x46\x23\xcd\x71\x1d\x77\x62\xc5\x0a\x67\xd6\x50\xc7\xe8\xc4\xfd\x3b\xeb\xc0\xc4\x98\xd2\x15\x2a\xb9\x82\x7c\x70\x0c\x7b\x28\x61\x56\x57\x49\xb5\x86\x4f\xec\x95\xb7\xf6\xb1\x99\x4e\x78\xd8\xf8\x5d\x06\x9c\xc1\x1f\x85\xbe\xd9\x71\x2f\x7a\x9f\x06\x0b\x0b\xf6\x75\x32\xe8\x8e\xb9\xdf\x3e\xb4\xa8\xd2\xfb\xba\xa8\x5e\xda\x92\x6d\x81\xc4\x9f\xb8\x6e\x73\x73\x1b\x7e\xd2\xa1\x90\x50\x78\x51\x3f\x7c\xa0\xfd\xcc\x3b\x1d\x57\x6e\x6a\x60\x12\x4c\x44\x61\x8d\xf1\x89\x0e\x16\x97\x94\x95\x6c\xb1\xec\x50\x1b\xa2\x04\x99\x70\xc8\xe7\x4c\xc1\x80\x06\x4c\x18\x44\x68\xbe\x4f\x08\x9a\x3a\xe2\x26\x3c\x85\x58\x63\xb6\x2c\x28\x31\x3d\xdf\x9c\xa8\x5b\xf6\x6b\x08\xa2\x64\x15\x5a\xd7\xc3\x28\x23\x8d\xfe\x61\x4a\x07\xed\xe9\x15\x5a\x09\xcc\xaf\xf9\x22\x92\x24\x93\x41\xba\xed\xcb\xe0\xe6\x46\x6e\x2c\x76\x04\x5e\x46\xda\xd2\xfc\x89\x9a\x17\x82\xe0\x09\x98\xe7\x9a\x83\xab\xfa\xe9\xb7\x06\xf7\x07\xf5\x8e\x73\x02\x03\xe1\xd2\xcc\xa0\x28\xc9\x22\xbe\xb6\xd1\x57\xfa\x7a\x98\x13\x2a\x92\x1a\x3d\xa2\x1f\x2f\x76\x9b\xb6\xc1\xf5\xf1\x9e\x9e\x85\xa1\x3b\x78\x1a\xf1\x41\x03\x9d\x51\x4e\xe1\x07"}, +{{0xf3,0xf8,0xd6,0x2f,0xee,0x3a,0xf3,0x75,0x66,0x96,0x30,0xcb,0xf0,0x63,0xbf,0xa9,0x30,0x18,0x9a,0xf1,0x36,0xcd,0x75,0x91,0xe2,0x4d,0x57,0x8d,0x73,0x66,0xbf,0x61,},{0x47,0x14,0xc6,0x04,0xaa,0x95,0xe1,0x82,0x8a,0x28,0x36,0x7b,0xa7,0x87,0x60,0xb5,0x89,0x64,0x31,0x68,0x3e,0xe9,0x96,0xcf,0xf9,0x68,0x71,0x77,0x32,0x91,0x95,0x3c,},{0x8d,0x6f,0x7c,0xee,0xb9,0x30,0x8b,0x4a,0x30,0x38,0x79,0xfc,0x6c,0xfa,0x5c,0xa8,0xe0,0x5d,0xfc,0x3d,0xef,0xc2,0xb2,0xcd,0x29,0x10,0xdd,0x4b,0x17,0xc9,0x4e,0xae,0xe8,0x45,0xab,0xe6,0x5f,0xd7,0x15,0xdf,0x05,0xb0,0x12,0x8e,0x43,0x16,0xe2,0x33,0x47,0x99,0xc6,0xe8,0xfa,0x74,0x7e,0xbc,0x8a,0x04,0x0c,0x74,0xf5,0xa1,0x48,0x0c,},"\xe1\xdd\x1f\xfd\x73\x7a\xc6\xdc\x24\xb3\xb9\xce\x3b\x79\xe8\x35\xbf\x69\x8e\x93\x13\x03\xd8\x09\xce\xa1\x78\x2d\xc3\xaf\x63\xa0\xd5\xe6\x73\x92\x82\x3d\x14\x39\xe7\xb6\xe3\x37\xb0\x1c\x8b\x21\x54\x34\xc2\x78\x2b\x3b\xe7\x44\x3c\xb5\xc8\x81\xe5\xfb\x6c\xf3\xbb\x24\x41\x28\xb4\xda\x6a\x6f\x42\xb2\xbb\x2c\xd7\x51\x29\xd5\x64\x18\x85\x43\x48\xc3\x39\xdc\xd9\x12\xb4\x55\x57\xa9\x15\xe9\xfd\x7f\x37\x91\x62\x36\x51\x0c\xb6\xc3\x31\xc1\x40\xb8\x7d\x22\x53\x11\x60\x0b\x8d\x13\x2a\xc4\x74\x73\x83\x9c\x72\x0f\x9f\xf0\xf9\xc1\xdc\xaa\x85\x81\x5a\x9d\x27\xb9\x75\x8c\xd9\x1d\xc5\xd3\xe5\x33\x26\xfc\xdf\xb2\x73\x0e\x52\xbe\x31\x03\x95\x7a\xc8\x91\x49\xa4\xc3\x00\x4c\xb6\x03\x8c\x0d\x80\xfa\x72\xac\x63\x0d\x33\x3b\xe5\xad\x4a\xdb\x58\x5a\xeb\x71\xae\xf1\xcd\xfd\x57\xb9\x15\xfa\xc4\xf1\xaf\x78\xe7\xa5\x97\xf8\xd1\xba\x06\x67\x2b\x19\xc0\xb6\x58\x08\xa8\xa0\x71\xff\x84\x09\x03\x43\x79\x58\x9f\x3d\x41\x30\x2d\x2d\x39\xb3\x31\x8e\x8c\x00\x90\xfa\x36\xcb\x95\x88\x57\xff\x5b\x21\x1c\x96\x66\xe2\x7b\xc8\x95\xab\x9d\x00\x6a\xba\xf5\x95\x0a\x03\xff\x17\xea\x98\x21\x78\xa4\x46\xdd\xa2\x46\x6f\x5a\x40\xb8\xf8\x95\x50\x9e\x4f\x4d\x4a\x6a\x27\x39\x99\x7f\xbd\x49\x68\xf8\x94\x36\xce\xe3\xd8\xed\xb8\xa6\xda\x9b\xd3\xd5\x5b\x06\x64\x90\xe8\x33\x9c\x78\x93\x5b\x77\x88\x3f\x95\xb9\x32\xfa\x5e\x6b\xb7\xdf\x30\x3b\xe3\x0f\xa5\x67\x24\x9f\xff\xb4\x73\xa1\xe4\x64\x32\x2d\x7c\x10\x3f\xe8\x22\x4c\x7e\xc5\x7b\xd3\x9b\xcd\x03\x0b\x96\x78\x7a\xeb\xcd\x20\xe9\xad\x65\x1c\xfa\x2b\xf0\x4b\xa7\x0a\x1c\xf6\x48\xe0\xa5\x44\x95\x67\x20\x2a\x93\x7a\x45\xbe\xcb\xb6\xfc\xde\xd3\x0c\xf9\xb5\xc7\x48\xf8\x82\xb5\xdc\x2a\x4d\x65\xbe\x69\xfd\x7d\x9c\x38\x1e\x83\xd0\xdc\x2a\x34\xb6\xde\xe9\x12\x20\xba\x90\x6e\x51\x2f\xcd\x63\x36\x8e\x2c\xe7\x33\xe4\x66\xb4\xb8\x2b\x84\xfb\x0c\x71\x7d\xc8\x94\x5c\xaf\x6d\x46\xac\x1c\x2f\x64\x18\xf7\x72\x9e\xf4\xc3\x5e\x40\x24\x22\xd6\x4b\x1c\x3e\xbd\x1b\x32\xa3\x0f\xc4\xc5\xee\xce\x7d\x44\x08\xff\x67\x9f\xf0\x1a\x1c\x7b\x03\xca\x51\x7b\xe5\x2e\x6a\xe7\x65\x0f\x7b\xad\x38\x90\x1e\x34\x8a\x55\x93\xbc\x99\x8f\x7c\xf2\xea\x97\x72\x9c\xb0\x04\xf5\x61\xb3\xb5\x8f\xe5\x98\x09\xa4\x1f\xd4\xb3\xb7\x66\x60\x90\x6a\xd9\xed\xa2\x3b\xf9\x25\x43\x7e\xf4\x52\xb1\x6f\x54\x0b\x3b\x80\xa3\x5a\x70\x93\xc2\x73\x4e\xef\xe6\xfa\x97\xd8\x81\xd7\x9e\xf5\xb7\x67\xd9\x88\x9f\x11\x84\x77\xb7\x3f\x58\xa4\xc0\xcb\x15\xe0\xac\x81\x01\x12\x05\x71\xca\x32\xce\x87\x1f\x30\x8a\xd9\x05\x7a\x80\xc8\x28\x15\x4f\xb1\xbc\x2b\x20\x1d\x0c\xd1\x00\x6e\x02\x2d\x44\x4d\xc9\x3f\x1b\xcf\x22\x4d\xb7\x4a\x5b\x37\x3e\x15\x3e\x85\x18\x54\x94\x8b\x6d\xa1\x47\xb7\x32\x87\xcf\x17\xd1\xfb\x72\xb4\x82\x76\x11\x10\x36\x09\xca\xb2\xa1\x77\x9e\x97\x93\xb9\xa7\x08\x20\xfc\x6f\x38\x28\xa6\x4c\x9e\xac\x35\xef\x7a\xa7\xb1\x76\x09\xd8\xef\xf8\xa9\xe5\x2e\x4e\xbc\xd8\x6b\x1e\x14\xfd\x14\x0b\xea\x47\xc6\xb8\xdd\xc4\x1e\x8c\xd2\x71\xeb\x92\x28\x7c\xbd\x06\x10\x51\x22\x42\xf7\x6a\x1e\xf3\xea\xc1\xe4\xbb\xbc\x1a\xda\xe5\x00\x34\xa7\xa2\x64\x7e\x08\xb2\xfd\x20\xaa\x93\xa9\x3c\xb2\xff\xde\xbf\x2e\x46\x1e\xcc\xef\xbb\xd1\xfe\x89\x4c\xe7\x0a\xdf\x79\x01\x73\xba\xe9\x6f\x5a\x55\xa1\x88\x7e\x9a\xe0\x9f\xce\xd1\xd4\x30\x6c\x29\x1c\x6b\x19\xec\xac\x47\x07\xe9\xef\x71\x3e\xa1\x8a\x75\x62\xc6\x67\x83\x26\x22\x89\x92\x07\x7a\x46\x69\x73\x49\x66\x10\x80\x00\xb4\x14\x4f\x45\xa0\xc3\xa2\x86\x3a\x4c\x6a\x3c\x07\x63\x2c\xb9\x3e\xb1\x97\xd2\x94\x88\x4d\x9c\xa3\xdd\x4b\x21\xf3\x9d\xb7\x07\xf6\x3a\x7f\x9a\x57\x0f\x7f\x0f\xeb\x99\xb2\xca\x7d\xa7\xdf\x92\xa1\x77\xab\xcf\xe8\x6e\xc6\x61\xd3\x0b\xcd\xcf\x15\x22\xbd\xb1\xfe\x11\x67\x32\x58\xdf\x7e\x46\xef\x4d\x32\x66\x65\x09\x31\x56\x55\x3f\x28\xb3\x56\x3f\xe7\x19\x2f\x72\xf5\xf9\xb3\x90\x3d\x79\xfe\xa0\x4e\x2c\x48\x8b\x46\x5b\x49\x78\xd6\x9f\x26\xe0\x5a\x59\xd5\xed\x4e\xf4\xca\xb2\x32\xac\xfd\x56\x4f\xc6"}, +{{0x86,0x5a,0x43,0x2e,0xcc,0xe7,0xe7,0x8c,0x42,0x70,0x9f,0xc1,0xe5,0x31,0xdf,0x5e,0x39,0x59,0x13,0x2b,0x2b,0x6f,0x31,0x8f,0xd1,0xc3,0x45,0x21,0xf9,0xa2,0x6e,0x3b,},{0xc7,0xa8,0xca,0xf8,0x93,0x0b,0x62,0x2a,0x50,0x13,0x37,0xf9,0x28,0x40,0xed,0x96,0x61,0x1a,0x32,0x20,0x80,0xfd,0xe5,0xe4,0x9f,0x0a,0x2f,0x6e,0x33,0xb8,0x82,0x83,},{0x32,0xbb,0x75,0x20,0xe2,0x63,0x9c,0x6c,0xca,0x19,0xa2,0xb9,0x83,0x6b,0x08,0xf8,0xb0,0x83,0xca,0x33,0x36,0x9d,0xdf,0x5f,0x9a,0x87,0x7d,0x4c,0x7a,0x9e,0xb0,0x5f,0x9c,0x3d,0xc3,0x4e,0xd4,0xcf,0xa4,0xb2,0x83,0xe5,0x19,0x22,0xb0,0x94,0x06,0x6c,0xe9,0xff,0xa4,0xd9,0xdf,0x62,0x19,0x10,0xca,0x37,0xb0,0xb3,0x7f,0xba,0xbb,0x0e,},"\xb2\x31\xb6\xd2\xec\xde\x49\xf5\x13\xb0\xdf\x25\xaa\xfc\x3e\x5d\xa4\x5b\x6a\x99\x58\xd6\x0f\x54\x64\xca\x59\x3c\x03\x00\x5e\xcf\x36\x1e\xf1\x69\x6b\xb6\xe5\x5d\x65\x38\xe3\x4b\x38\xf3\x24\xc2\x1c\xea\x5c\xc8\x1a\x00\x73\x27\x8b\xb9\x27\x27\xef\xf8\x1a\xf5\x61\x80\x2d\xce\xf3\x3b\xec\x10\xad\x65\x94\xe2\x2d\x9c\x44\x18\xaf\x39\x88\xa4\x3e\xd0\x87\xb9\x95\x4b\xf8\xd6\x28\x3e\x4b\xea\xe8\xc0\x96\xde\x66\x06\x75\x1c\xbe\xd6\x85\x84\x6c\x66\x30\xb9\x52\x8f\xf3\x64\xa7\xc4\x84\x64\x11\x34\x72\xc9\x86\x0b\x33\x71\x96\x3c\x91\x14\x95\xa9\xc6\x28\xa3\xe3\xe4\x7a\xb0\x99\x1f\x10\xdd\x1d\xd3\x31\x61\x52\x52\x62\xd6\x3b\xab\x64\x88\x19\xd5\x7d\x12\x69\xe1\x14\x82\x5c\x54\x34\xe6\xb2\x84\x5f\x42\x79\x5d\x4f\xb0\x83\xad\x79\x40\x1f\x2a\x07\x61\xc6\x34\xa5\x45\xae\xc7\xcd\xb1\x3b\x5b\xe4\x49\xf1\xd8\x29\x32\x63\x78\xed\x1f\x49\x3f\xe8\xc8\xe9\xb0\x68\xcc\x1d\xbc\xf1\x65\x55\x0b\x81\x32\xc3\x19\xda\xc4\x87\xb8\x7b\xb2\x2a\x54\xcd\xf6\x0a\xac\x71\x51\x61\x82\xa4\xe6\x9b\xa0\x83\xf6\xe8\x6d\x1a\x4f\x05\x08\x3a\x77\x61\x9e\xf2\x39\xf7\x02\x39\x6d\x7e\x46\x96\x8c\xc0\x4a\x3b\x34\xdf\x32\x65\xec\xf1\x61\x57\xab\xe1\x5c\x64\x2c\xd7\x42\x70\x96\xd8\xd4\x0d\xb0\x02\xd1\x96\xca\xb1\xbe\x30\x4b\xcf\x32\x2d\x9d\x1a\x24\x51\xb6\xc1\x1e\xea\xf3\xe8\xe3\xd9\x29\xf4\x80\xb6\xb7\x78\x04\xfe\x84\x49\x6c\xa7\x57\xe0\x43\x37\x91\x4c\xe9\x44\x75\xd7\x99\x0c\x74\x57\xc8\xe6\x06\xf8\xbc\x20\x7d\x2d\x48\x11\x9c\x80\xa6\xb4\xa9\xe0\x7b\x22\x92\x26\x57\x0d\xcd\x99\x49\x89\xfe\xcc\x69\x4c\x6c\x2f\xb5\x97\x5c\x9a\x6a\x9b\x74\xe8\x15\x9c\x27\xdd\x36\x77\xdf\xd5\xcb\x65\x1f\x1e\x32\xad\xfa\xfd\x81\x0b\x6e\x5d\x5e\xfb\xac\xe3\x1a\xe6\xd9\xb1\x21\x91\xe8\x93\x98\xda\x06\x3f\x13\x8b\x75\x84\xc5\x8e\x77\xe7\xf9\xfd\xd7\xfb\x9e\xf5\xd6\x8a\xe4\x9c\x6c\xca\xd2\x8d\x18\xbc\x60\x09\xd4\x18\x7e\xd1\x42\x02\x24\xa5\x65\x8a\xad\xf1\x35\xb5\xa9\x53\xf2\xdc\x3c\x8b\xfc\xaf\x66\x9e\xd5\xda\x38\xd0\x14\x4f\xd9\x66\x5e\x6f\x06\x77\xd3\xfc\x88\x04\xe2\x1c\xc2\x5f\xd5\xe0\x1a\x3f\x3f\xa8\x3e\x57\x1e\xb2\xf8\x82\xa7\x65\x9c\xe5\xd8\x64\xd8\xbb\x54\x07\x2b\x09\x86\xa8\x54\xf1\xa7\xf2\xd2\x72\x0d\xf8\x57\xe6\xd4\x21\x96\x30\x84\x1b\x1c\xcd\xcf\xc6\x72\x6b\x91\xbf\xc1\x7e\x18\xc3\xe3\x48\x0c\x23\xa2\xc0\x5e\x4b\xfe\xdd\xd4\xdb\x9e\xf4\x23\x88\xf2\x34\xfd\x3e\x4f\x3d\xad\x66\x60\x26\xe2\x78\x06\x12\x37\x41\x61\x31\x6a\xfc\x76\x65\xf9\x41\x1b\x6c\x5a\xa7\x89\x33\xb1\x80\x21\xc0\x12\xb0\x84\xf3\x24\x47\x60\xa4\xea\x1b\xcf\x31\xcc\x9f\x5c\x40\x44\xa9\xbc\xc7\x5a\x98\x67\x07\xf3\x8f\x45\xac\x1c\x7f\xa1\x39\xee\x95\xa6\xd8\xf1\x6c\x3c\x1e\x12\x76\x4c\x4b\x0b\x11\x94\xc0\xfc\x5f\x7e\xef\xf9\xa8\x48\xc4\x05\x0b\x0e\x65\x16\x84\x71\x9d\x43\x8a\xad\x56\x01\x91\x64\xfa\xe4\xf4\x88\x82\x20\x5e\xce\x0b\x99\x73\x67\x91\x08\x4a\x75\x3b\xa7\xd5\x6e\x88\xfc\xee\xa5\x33\x56\x6c\x3a\x2c\xa4\x8d\xd6\xef\xc4\x9b\x27\xdb\xf1\x4f\x26\x16\xce\xd6\x52\xe1\x38\x33\xab\x90\x28\xad\xa4\x54\x43\x1c\x89\xb3\xcb\x74\x41\xfd\xb8\xf2\x3e\x12\xb6\x0a\x1a\x10\x4a\x2a\x8c\xf4\xa6\x4e\x87\x8a\xa2\x6f\x54\xe8\x88\x1a\x4b\x15\x1a\x16\xa9\x6d\xe8\xb9\x80\x7e\x72\x93\x96\xeb\xe3\xe3\xd3\x94\xf8\x08\xbd\x74\xb7\x31\x2f\xe6\xb8\x4b\x13\x12\xaf\x8a\x1e\x41\x33\x59\x9d\x07\xbd\xf3\x3d\xb2\x1e\x01\x6b\x5c\x19\x6c\x1b\xa3\x11\x57\x08\xf5\x81\xbb\x82\xf4\xb5\x7a\x6c\xa1\xa5\x29\xe6\x4d\x19\x30\x42\xc1\xdc\x5f\xaa\x0a\x03\xab\xf5\x38\x49\xe1\xbd\xef\xba\xb6\x4b\x1c\xb6\x0f\xe1\x0a\x3f\xc1\x82\x3a\x23\x4c\x45\xf3\xb0\xdc\xe6\x6a\x46\x73\x9c\x01\xae\xad\x12\xde\x6f\x03\x13\xc7\xbe\x71\x40\x5f\x3f\xdc\x4a\x50\x7a\x9d\x84\xe8\x68\x6f\x6f\xc9\x26\x35\xdb\x0f\x78\x56\xc7\x37\x3a\x61\x8a\x72\x52\xc1\x29\xa7\x76\x0e\x20\x29\x54\x3d\x72\x62\x28\xc2\x1d\x00\xad\x4a\xc5\x2e\x5b\x1a\x6e\x31\x20\x09\x17\xf1\x5a\xf5\x15\x85\x9e\x08\xf2\xa7\x9a\xce\x67\x99\x1e\xd6\x90\x44"}, +{{0x2b,0xe1,0xf9,0x8c,0xe6,0x55,0x3c,0x91,0x5b,0x6a,0x09,0x33,0xec,0x0d,0xe3,0x47,0xb3,0x70,0xe2,0x9c,0xa2,0x94,0xe8,0x00,0x55,0x41,0x23,0x9f,0x63,0xb4,0x30,0xd0,},{0x7a,0x6f,0x44,0x69,0xc3,0x0a,0x63,0xf5,0x60,0xf9,0x87,0x34,0xfc,0x19,0x06,0xeb,0xd1,0x37,0x1e,0xd8,0x01,0x25,0xfa,0x3e,0x4c,0x86,0xb4,0x3f,0x26,0x2c,0xab,0xbc,},{0x8e,0x65,0x9a,0x3f,0x53,0x5a,0x58,0x9a,0x5f,0xd2,0xd2,0x17,0xcb,0xcb,0x8b,0x77,0x7e,0x5a,0xf2,0x0b,0x23,0x44,0x32,0xf7,0xda,0xc2,0x9f,0x81,0x0a,0x2b,0x47,0x37,0xc5,0xca,0xb1,0x0b,0x59,0xdf,0xd0,0x14,0x4f,0x30,0x90,0xf5,0xf9,0xe0,0xe6,0x67,0xf0,0xe2,0x1a,0x9f,0x57,0x3f,0xe1,0x3b,0x1c,0x28,0xec,0xcb,0xb5,0x31,0xa2,0x05,},"\x62\x68\x20\x1f\x93\x2a\x7c\xd3\xf8\x79\xae\x6a\xb8\x38\x55\xa2\xf5\x02\x91\xde\x78\x4d\x7d\x9e\x9a\xda\xa1\xb9\xaf\xed\x6f\x5a\xea\x20\x24\x0e\x59\xfe\x93\xe5\xa7\x08\x8c\x95\xec\x8e\x15\x74\x5f\xb8\xfd\xeb\x91\xdf\x01\x51\xc7\xb4\x60\x50\x67\x56\x1e\xa0\x8d\xbf\x00\xc4\xff\xe1\xfd\x0a\xcf\x10\x36\x56\xa7\xb5\x4f\xad\x0f\x25\xab\x16\xb4\xbd\xa3\x47\x17\x9e\xd1\xca\xdb\x7b\x98\xbe\x08\x95\xe0\x50\xdc\xbc\x37\x9d\x1f\xd5\x53\xe9\x97\x95\x92\x8b\x67\xa7\x52\xf8\xd2\xec\x1b\x9d\x66\xbf\x6a\xc9\x97\xe7\x44\xdc\x32\x7f\x24\x22\x30\xf9\x2e\x79\xae\x31\x27\x45\xa5\xab\x6d\xde\xc1\x99\x8f\xb6\x3d\xc4\xf6\xb0\x5f\x14\x72\x22\xd4\xb6\x5a\xce\x90\x17\xdc\x1b\xcd\x67\x5e\x49\x5f\x9e\xab\xb5\xf6\x02\x13\x3f\x6c\x72\xe0\x53\xe9\xf4\xae\x30\xd8\x72\xd7\x8b\xf7\x1f\xeb\xa3\x7a\xcc\x59\x50\x55\xc3\xbe\xa5\x3a\x05\xef\x0c\x7f\x21\x2d\xcf\x4e\x0a\xf8\x38\xea\x29\x28\xf4\xcd\xc9\xfd\xc8\x37\xda\x25\xf2\x69\x66\xb2\x45\x6a\xbe\xa6\x6a\x5d\xfb\x8f\xaa\x8f\xa0\x91\xf7\x33\x1d\x54\x36\xe9\x8a\x8d\x63\x23\xcc\x9e\x9a\x91\xd5\xa0\x2a\x49\x51\x17\x14\x84\x9b\x47\x45\x4b\xaf\x99\xc5\xf8\x50\xa0\x8d\x3d\x98\x41\x0e\x93\x9a\x9e\x89\xb1\x50\x53\x82\x5f\x3e\x9a\xee\x71\x44\x74\x16\x14\x07\x82\xe1\xbf\x3b\x0d\x8b\x4f\xf6\x2e\x77\xa4\xa0\x3f\x71\x0a\x8a\xb7\x6c\xf6\x35\x92\xc0\x5c\x44\x0c\x8f\x06\x47\x70\x09\x91\x63\xc1\x22\x70\xf3\xd5\xec\x9a\x6b\xc9\x71\x5b\xff\xfe\xc7\x69\x61\x1d\x21\xfa\x00\x3c\x3c\xc8\x35\x6c\x97\x5d\x37\xb6\x2b\x88\xaa\xbb\x85\x97\xda\xca\x19\x6c\x96\x48\xa3\x1d\x15\xbb\x0b\x86\xcf\x07\x0e\xe0\x1e\x51\x1e\xf3\x73\xb4\xa4\x4c\x6a\x00\x16\x0a\x79\x7f\x2e\x82\x0b\x71\x6f\x5c\xa6\x44\x64\xe4\x18\x9a\x00\xfe\xe9\x78\xd3\x5b\xf2\x04\xf7\x1d\xb1\xf5\x01\xf9\xb6\xe5\xdf\xc8\x21\xa8\xaf\x5d\xbf\xef\xd3\x53\xad\x36\x81\xf9\xbc\x3c\x22\xc6\x7c\xb2\x11\xb4\x30\xb6\xa5\x5f\x3e\x73\xda\x7c\x3a\x07\xce\xb7\xd2\xfe\x25\x4b\x10\xc2\x70\x3a\xb2\xe2\x29\x4d\xd0\xd3\x15\x2d\xc7\xb2\x1a\xab\x87\xb1\x50\xf7\x37\xa9\x47\x46\x3f\xb2\x04\x17\x5d\xe8\x54\x32\x36\xfb\xb0\xda\x5c\x7d\x48\xc5\x7f\x61\x74\x4d\xe6\xf9\x84\xaa\x8e\x61\xb9\x70\xc6\x2d\x0e\xeb\x84\x9d\xa7\xe8\x9a\x61\x22\x2d\x43\x20\x79\xcb\xcf\x5f\x8a\x2b\xa9\x30\x30\x16\x83\xc0\x78\x5c\x26\xfd\xf8\x5d\xa3\x02\x08\x74\x60\x45\x99\xac\x6c\x84\x7e\xc2\x60\x86\x58\xb5\x78\x8c\x7b\x8d\x3a\x37\x44\xfd\x54\x42\xe2\x4c\x8e\xec\xcd\x42\x07\x56\xbd\xd8\xb8\xa7\x7c\xfd\x80\x58\x96\x05\xdc\xed\x9a\xfd\xa2\xbd\xb6\x30\xa0\xcb\x61\x2f\x73\x9c\xe6\x17\xd5\x4e\xde\x6c\xcf\x36\xaa\x31\xe7\xe3\x73\xd8\xa0\xfb\x1b\x7c\x99\x06\xf7\x6b\x5f\x9d\xe8\xc2\x68\x91\xde\x00\x6e\xb7\x97\xea\xd4\xa8\x6f\x70\x16\xf3\x4b\xcd\xe9\x2f\x94\xac\x3e\x92\x0b\xa5\x8d\x6d\xff\x77\x20\x78\xd8\x02\xa9\x4f\x56\xcb\x26\xbf\x79\x4f\xd9\x0c\xa0\xad\x4f\x2e\x7a\xcd\xc5\x92\x9b\xc7\x36\x49\x97\xde\xd9\x8c\xa6\x9c\x57\x39\x91\xbb\x9a\xb8\x5f\x23\x5b\x63\xe7\x6f\x77\xe0\xab\x45\xe7\x89\x12\x38\x98\x69\xaf\x21\xe7\x4e\x66\xf7\xc4\x56\xb8\x27\xe6\x70\xbe\xb0\xf0\x72\x66\x88\xbb\x1f\x90\x36\xd3\x8d\xa0\x7d\x69\xea\x36\x66\xf7\x6b\xd6\x05\xd8\x2e\x2d\xd6\x38\x7e\xce\x6e\x82\x4a\x56\x97\x00\xf0\x1b\x19\x5d\x1a\x9b\xdc\xb0\xf9\x6a\xb5\xc5\x4e\x06\xc2\x11\x9b\x40\x6b\xc4\x88\x84\x80\x66\x04\x18\xbb\x42\x88\xea\x2f\xda\x96\x63\x1b\x0e\x1f\x60\xac\x86\x1d\x6c\xcc\x4c\x84\x4b\x64\x7a\x7d\x74\x03\xbc\x2d\x15\xba\xfe\x4a\xf6\x77\xe8\x56\xfe\x0d\x2b\x5f\x66\x3b\xe4\xe4\x80\xb3\x8f\x6b\x76\x6a\xdc\xd3\xd0\x52\x98\xef\x13\x98\xd0\x4d\x15\x23\xa6\x8b\x91\xdd\x31\xcf\x5d\xc4\xb7\x3d\xec\xbf\xd7\x21\x3f\x98\x1b\x20\x7e\x1f\x6e\xf2\x25\xd7\x94\x8a\x1a\xa1\x7d\x8d\x57\xa1\x12\xf1\xd4\x46\x8d\x2d\x28\xf7\xec\x2e\x54\xb7\x4a\x69\x2c\x59\x58\x02\x2e\x82\x03\x1a\x41\xb3\x15\x09\x0e\xd4\xd5\xbd\x7b\xd0\xb4\x51\x47\x63\x38\xf7\x39\xa7\xd7\x03\x1a\xf2\xd3\x6c\xaa\x09\xff\xdb\xb7\xc3\x96\x50\x7c\x75"}, +{{0x10,0xbb,0xe6,0xe7,0x61,0xa7,0x5c,0x93,0x5b,0x51,0x7f,0x09,0x36,0xfe,0xcb,0x9e,0xc6,0xfc,0x21,0x5e,0x58,0x13,0x08,0x00,0xea,0x18,0xd1,0xff,0x44,0x2a,0x4f,0x13,},{0x86,0x43,0xdd,0xf8,0xaa,0x8d,0x9c,0x8a,0x78,0xb6,0xeb,0x69,0x9f,0xd2,0x0a,0x57,0xf6,0xf1,0x86,0x36,0xb0,0x6c,0xe6,0x9d,0xac,0xdc,0xa1,0x26,0x7a,0xcb,0x39,0x54,},{0xf0,0xf3,0x57,0x41,0x03,0x73,0x31,0x3b,0x7c,0x62,0x52,0xd6,0xd9,0x66,0x00,0x36,0x0c,0x23,0x75,0x2d,0x43,0x1c,0xa8,0x07,0x5b,0xcf,0xb7,0x72,0xd4,0x9c,0xd6,0x09,0xb6,0x5c,0x9c,0xd8,0x38,0xd6,0x34,0xd8,0xd9,0xb9,0x5d,0x1e,0xe3,0x0e,0xde,0xcc,0x13,0xe3,0xca,0x99,0x7b,0x24,0x37,0x30,0x3f,0x8a,0x33,0xa1,0xff,0xc8,0x33,0x06,},"\xe8\x10\x8c\x6d\xe4\x13\x37\x33\xdc\x19\x9a\x73\x39\x2e\x22\x6f\x71\x2c\x36\xa2\x4f\xa9\x1d\x6f\xb0\x9f\x92\xdf\x21\x8d\xeb\x2d\x28\x30\xa6\x68\xfd\x69\x4b\x48\x09\xd0\x25\x35\x07\x23\x12\x47\xc7\xf2\x58\xb4\xd6\x5c\x56\xbb\x69\x34\x5e\xf6\xaa\x97\xe7\xc5\x9e\x81\x53\x77\x5a\x5a\x3c\xf1\x09\xc4\xbc\xa9\x81\x55\x69\xda\x69\x32\xe8\x21\x83\x42\x5b\x42\xd7\x48\x3c\x9d\xbf\xcb\xd8\xeb\x38\xc8\x47\x29\x57\x1e\x8e\xc9\x39\x82\xc3\x17\x71\x67\x59\x59\x8c\x4f\x6a\x1b\x7f\x8d\xa7\x30\x6a\x78\x15\x72\x1c\xaf\x02\xe7\x02\x46\x71\x23\x14\xf7\x66\xbe\x9c\xb1\x77\xcd\x2f\xa3\xbd\xa2\x2c\xd6\x76\xc5\xd2\xe8\x6e\x8d\x79\x8f\xd3\x4f\x54\x3c\x9b\xe3\x12\x96\x51\xf2\x73\xf4\x84\xf0\xb9\x46\x7b\x14\x09\x55\xcd\x29\x81\xff\x26\x03\xc0\xbd\xbb\x43\x6a\xc0\x95\x5a\x11\x6c\x5e\x5f\xc3\x04\x25\xe1\xfe\x78\xf6\x41\x0f\x6e\xf7\x57\xf6\x04\x66\x88\x54\xba\xe7\x9b\xfe\x22\xe1\xa8\x5c\xe5\xee\x5d\x64\x34\xb4\x61\x01\x20\xea\x7e\x5d\x3d\x13\x7c\xe2\x07\x51\x4f\x85\x34\xad\x9b\xf3\x92\xb7\xdc\x53\x55\x51\x4b\x59\xf8\x35\x46\x6c\x8e\xb5\x6f\x44\xed\xdc\x5b\xad\x20\xcf\x0b\x48\x0b\x2e\x82\x2a\x6f\x46\xfd\x95\xf3\x0f\x18\x3c\x7b\xb3\x14\x3e\x4e\x61\x00\xe2\xdb\xc9\xf2\xbf\x0d\x43\x07\x3e\x0f\xe6\x5f\x01\xbc\xce\x6a\x1a\xe4\x01\xc1\x25\x41\xbe\x3a\xe6\x8c\xde\xac\x2a\x4a\xc7\x1f\x16\x63\xb5\xfd\xfc\x2e\x50\xf0\xe0\x77\xfb\x3a\x0a\x8b\x8e\xee\xad\x62\x7c\x1c\x3e\x79\xdd\x73\x61\x04\x6f\x7e\x57\xc1\x74\x36\xc3\x2d\xc4\x43\x2f\x05\x00\x28\xcc\x7a\xa4\x40\x8c\x2d\x29\xd1\xd7\x99\x8f\xdc\xdd\xa3\x2b\xb3\x2f\x70\x4d\xc2\x63\xdb\x9b\x8e\x06\xc5\x76\x30\x87\x0f\x8b\xb6\xec\x66\x1f\xde\x1b\x7d\xa9\x4d\x53\xb0\x47\x70\x1a\x45\x88\x47\x8c\x1c\x66\x23\x46\x74\x1a\xea\xc4\xc2\x53\x38\x55\x6a\x3d\x84\x8d\xe5\xb2\xa2\x3e\xce\xa6\x1b\x77\x6b\xd0\xe8\x03\x7e\xfb\x85\x01\xef\xf2\x39\xc7\xfa\xcc\xa6\xc8\x36\x7e\xd7\xc8\xad\xce\x91\x9f\xef\x1a\x15\x5a\xe0\xd5\x47\x8a\x98\x00\x2c\x95\xa1\x6f\xbf\x4c\x0e\xd0\x16\xea\x5d\x38\x66\xfe\x1d\xe4\x54\x83\x2a\x4e\x95\x65\x97\x6b\x60\xb3\xdd\x2e\xaf\x7f\xee\x61\x2f\x2b\xc0\x40\xd9\x39\x75\x43\x5e\xeb\xd1\x2f\x06\xeb\x09\xec\xea\x2c\x66\x76\x83\x08\xf5\x8c\x77\xac\x51\xed\x7b\xd2\x16\x36\xfc\x9c\xc3\xfd\x14\x87\x0b\xd0\x6b\xdf\x12\x8a\x81\xb1\x47\x92\xe6\x08\xc4\x7e\xa2\xd5\x35\xca\x7a\xa2\x1e\xb8\xa8\xa5\x6d\x76\x99\x16\x63\xa8\x19\x0a\x95\x05\x7d\x33\x67\x1e\x73\xc7\xcb\xce\x5a\x98\xd3\x1e\xf0\xd7\x3b\xd0\xb1\x63\x78\x7b\x7f\xdc\xd2\xdd\xfc\x72\x96\x0f\x2b\xe3\x20\x84\x6d\x4b\x29\x08\x0d\x7a\xeb\x5b\x7e\xa6\x45\xa2\xad\x5a\x59\xc0\x12\xbf\x7b\x95\x15\xd8\x59\xe1\xc1\x47\x2e\xf8\xa4\xd3\xc9\x5e\x71\x1a\xf9\x7a\xe4\x61\x8e\xfb\xab\x3d\xff\xe8\x8c\x9f\x6a\xf4\xa0\x9b\x0e\x73\x38\x7e\x25\x1b\x77\xd7\xbf\xf5\x21\x4f\x79\x18\x62\xdb\x69\x88\x41\x1e\x2a\xe2\xc7\x5b\xf2\x8d\x28\x60\x2a\x63\x7c\x26\xf4\x9c\x18\xd3\x09\xd2\xfc\x58\xa1\x26\x66\x7a\xd3\xc2\xec\x16\x0c\x99\xba\x40\xfb\xda\xc1\x7e\x7e\x4c\x21\xa5\xd5\x07\x85\x97\x62\xeb\xa0\x9c\x41\x60\xdf\x66\xf5\xfe\xef\xe6\x71\x5a\x28\xc5\x29\x6c\xf4\x3e\x5e\x77\x1f\x31\xfc\xe5\x13\x3b\xe9\x7c\xab\x57\x30\x1b\x4c\x9d\xf9\xcd\x9a\x4a\xcf\x1c\x33\xfa\xc9\x46\xfa\x15\x96\xfa\x65\xc8\xf3\x65\x8b\xe4\x7a\x47\x3a\x62\xc5\x21\x81\xec\xa1\x83\xe4\x24\x6c\xd6\x24\xd8\x78\x3d\xcc\xe5\xfd\xcc\x1f\xea\x17\x3f\x80\x71\xf7\x07\x4f\x55\x89\x7d\xe9\xbf\xe8\x4a\x6c\x4f\xdf\x80\x2d\x50\x26\xb8\x14\x5e\x6c\x8c\x89\x50\xaf\xc5\xb4\x0f\xd0\x35\x6f\xc5\x5e\xe1\x7e\x1f\x85\x3a\x4c\x2f\xcc\x34\xa1\x36\x9b\x87\xd2\x8d\xc2\xfd\x20\x10\xf1\x99\x03\xaf\xf8\xe4\x6d\xe0\x49\x38\xf4\x94\x82\x45\xd5\xb4\x25\xd0\x74\xac\xdf\x2b\xd8\x0b\xfc\x37\x35\xcc\x34\xa2\x25\x90\xf1\x94\xaf\x93\x13\xee\xf4\xab\x5f\xde\x61\xf1\xf9\xb5\x85\x78\x63\x8f\xcb\x4f\x28\x50\xb2\xfc\xe6\xe0\x3d\xb4\xd0\xa8\x34\x84\x81\x63\xc4\xb2\x7e\x12\x9f\x5c\xc7\x4f\x67\xf0\x08\xa2\x71\x2d\x1d"}, +{{0x18,0x6d,0xcc,0x7e,0xfc,0x5e,0xd7,0xe6,0x1a,0xe5,0x3d,0xc4,0x20,0x93,0xba,0xe8,0xf1,0x5d,0xd9,0x9f,0x0f,0x03,0x33,0x26,0xc5,0x76,0xff,0x75,0x69,0x50,0xd0,0x6d,},{0xc8,0xd1,0x41,0xac,0xb6,0x42,0xaa,0x9b,0xfb,0xd5,0x43,0x27,0x7c,0x2d,0xca,0x8a,0xa9,0x88,0x8e,0xef,0xf0,0x45,0x43,0xb3,0x78,0x9b,0x21,0xf2,0x6a,0xeb,0x0f,0x71,},{0x89,0x45,0x06,0x97,0x87,0xc1,0xc6,0x76,0xa8,0x4a,0x70,0x3c,0xae,0x1e,0x0b,0xac,0xae,0xff,0xd3,0x3e,0x91,0xbe,0xc3,0x60,0x3e,0x1f,0x13,0xfb,0x17,0x0e,0x31,0xe6,0xd7,0x04,0x9e,0xda,0x2b,0xf6,0x27,0x18,0x0f,0x45,0x6c,0x3f,0x7a,0xab,0xfc,0xd3,0x6c,0x49,0xa8,0xc0,0x4f,0x8a,0xe6,0x92,0x9e,0xc5,0xad,0xa0,0x7b,0x65,0x72,0x08,},"\x97\x43\x64\xd6\xc8\x38\x84\x2c\xcc\x4e\x74\x9e\x6a\xfd\x53\x71\x70\xdc\xd8\xcc\x50\xd6\x66\x54\xd1\x05\x48\x23\x39\xca\xbd\xf7\x4e\x32\x93\x5e\xe2\x19\x27\x2e\xa1\x68\x4f\xb9\x3c\x1f\xab\x42\xb5\x63\x18\x39\x24\x35\x91\xbd\x07\xd3\xbe\x94\x9b\x0d\xd1\x5e\x31\x96\xdf\x19\x6b\xa7\x52\xad\x11\x21\xac\x71\x12\xd5\x66\x94\x4e\x15\x3a\x4e\x06\x19\xb3\xa2\x32\x24\x1f\x02\x0b\xe0\x71\x9f\x6b\xec\x91\x8b\x26\x82\x8e\xb1\x67\x0e\xcf\xc7\x3c\x66\x84\x4e\xa3\xe4\x04\xc6\xa2\xfc\x01\xbe\xb4\x03\xc9\xd6\xca\x55\x1a\xd8\xa6\xe7\x1f\x46\x64\x7f\xa6\x05\x3f\x03\x14\xf8\x12\x4d\x8d\x2b\xc1\x2c\xc8\xfa\x8d\xb9\x5f\x2b\x73\x53\x75\x20\x1b\x81\x6a\x9c\xf4\x0f\x83\xee\x4b\x86\x71\x61\x80\x32\xde\x22\x9c\xe7\x62\x71\xd0\x3d\x26\x72\xa1\xae\x4a\x28\x8c\x85\xdc\xd2\x7f\xb8\x45\x2a\x81\x32\xe9\xff\x29\xe1\xe8\x9b\xf1\x1b\x1c\x83\x51\x92\xc0\x4b\x13\xbe\x14\xf3\xcd\xe5\xd3\x7c\xe9\x6f\x1d\xc2\xa9\xcc\xda\x0c\x4d\x73\x7b\xca\x1f\xa2\x20\xd2\x1b\xf3\x60\xb9\x05\x15\xbb\xd2\x26\xbb\x2a\x6c\x8d\x5f\x2a\xb0\x18\xd4\x08\x4e\x24\xee\x33\x3c\xe4\xe3\x9b\xcb\x6b\x46\xe7\xae\xb4\xdb\x9b\x6c\x65\xb2\x44\xd9\x82\x82\x3a\x77\x0f\x9c\x62\xa0\xbd\xe2\xcb\xb7\xec\x36\x84\x0d\x45\x51\x87\xfa\xff\x4e\x48\x8a\x5c\x60\x8e\xbd\xb7\xdb\x84\xd8\x7d\xad\x38\x67\xe3\xb0\xd0\x4b\x64\x71\x5e\x16\x56\x0a\x62\xf1\xee\x03\xdf\x61\x83\xfd\x5e\x37\x55\x5d\xa1\x97\x2f\xca\x06\x2d\x12\xbb\x84\x20\xe0\x82\xda\xcb\x8d\xeb\xb9\xc1\x43\x85\x41\xd0\xda\x24\x64\xef\x7e\xc5\x22\x63\xfb\x9b\x9a\x4c\x46\x9c\x83\x32\x3e\x48\x19\xdf\xdf\x4f\xa0\xa7\x70\xc3\xa7\x09\x25\x4e\x05\x31\x48\x30\xe8\x7f\xbb\x67\x36\xc7\x2d\x9d\xab\xe0\x1a\x31\x0e\x91\xeb\xbf\xae\x76\x7a\x1f\xcb\x62\xf6\x4f\xa3\xba\x8d\x53\x40\x0d\x64\x69\xad\x1c\xcb\x81\x1f\xb9\xe1\x15\xf1\x41\x27\xb1\x3e\x83\x64\xaa\x2f\xe8\x0b\xbc\x88\x6a\x10\xdf\x1b\x9c\xc4\xae\x46\x01\xf5\x46\x1a\xf0\x91\xf5\x26\xd2\x72\xda\x9b\x20\x38\x57\xa4\x44\x7e\xab\xde\xf4\x39\x83\x04\x96\xa5\x75\x9c\x21\xde\x65\xba\x3a\x3c\x8b\x8e\x93\x9c\x46\x13\x32\xa9\x24\x85\x2c\x20\x5c\x77\x11\xf3\xa6\x8a\x23\x67\xa9\x45\xde\xf4\xfb\xe5\xf8\x1c\x60\xcb\xb7\xe3\x94\xa2\xa4\x9b\xe9\xec\x2a\xae\xb1\xf3\x30\x57\x59\x79\x44\x6a\xd9\xd0\xd5\x4a\xbd\x43\x6f\x28\x60\xf0\x42\x34\x26\xf4\xbb\xc2\x6b\x3b\x9f\x65\x0d\x69\xb1\x00\x72\xd7\x47\xa3\x9e\x47\x8f\x45\x5e\xaa\x12\xc7\xc6\xe1\x2b\xfc\x45\x36\xa3\x59\x43\x44\xbd\x02\xb6\x20\xe3\xe2\xb4\xe0\xd5\x34\x08\x9d\xd7\xb0\x4f\xa6\x34\x80\x45\x67\x58\x6c\x62\xbe\x03\x91\xc7\xbd\xb0\xa9\xfb\xc1\xef\x3b\x33\x21\x1e\xdb\xf8\xef\x58\xc2\xb7\xa4\x9d\x06\x66\x79\x59\xd7\xe5\xd4\x46\x71\xee\x73\x57\xa1\x0b\xa0\xcb\x1a\x44\x5a\xe5\xd7\x09\xce\x25\x5e\x92\xde\x71\x59\x75\xaf\x94\xb8\x9d\x4a\x29\xc7\x1f\x9d\x88\xc8\x5b\x6c\xd1\x1d\x8b\x33\x5b\xf8\xf2\xc6\x58\xe6\xdd\x7c\x3f\x6c\x80\xad\x4d\x0e\x5a\x6c\x87\xdb\xa7\xb5\xb8\xa8\xa4\x7e\x72\xf4\xd1\xd3\xc7\x43\x63\x1d\xf9\xad\xfc\xfa\x45\xce\xe0\x49\x8d\x5a\x44\xa9\xf7\x5c\x83\xb7\x5b\x2a\x3c\x23\x0f\xf0\x76\x7d\x38\x88\xf9\x41\xee\x1b\x66\x24\xdd\x0e\x12\xd0\x6e\xd1\xab\x8b\xb1\x35\xff\xd3\x79\xe9\xde\x37\x88\xbe\x54\x1a\xad\xb2\xd6\xa7\xcc\x60\x13\x16\xf2\x1e\xb9\xaa\xa9\x22\xf5\x6a\x8e\x35\x26\xc9\xbd\x11\x77\xfe\xfc\x2f\xbe\x3e\x43\x0b\x62\x8e\xeb\xd6\x66\x1e\x3b\xa2\xd6\x31\xc6\xa8\x42\x2c\x24\x1e\xcd\x96\x99\x72\x41\x2f\x74\xda\x6b\x12\x43\xbf\x0f\xbe\xe8\xa8\x4d\x52\xe4\x0a\xee\x3f\x1e\x4f\xc8\x31\x40\x2c\x62\xf3\x57\x6b\x22\xe8\xe3\xc3\xdc\x4e\x16\x0b\xc3\xb6\xb9\xd2\xce\x00\x58\x53\x81\x2e\xaf\xc0\xa4\xe2\x5b\xa7\x12\x27\x9b\x00\xba\x3f\x91\x30\xff\x36\xe3\xef\x19\x71\xdd\xe7\x50\x8b\x27\x92\xfe\x64\xd4\x75\x68\x8f\xc6\xf3\x31\x3a\xad\xb7\x85\x30\x2e\x6b\x7f\x9a\x84\xf2\xdb\xc2\xf3\xcf\x06\x0e\xe0\x8b\x46\x37\x36\xf8\x36\xdb\xb2\x62\xd3\x29\x68\x4c\x20\x84\x92\xd1\x7d\x81\x12\x21\xbe\x02\xb6\x5e\xe2\x8e\x11\xb5\x46\x92"}, +{{0x07,0x05,0xb3,0x36,0xc8,0x9c,0xa3,0x5f,0xfd,0xde,0x0a,0xf0,0xf9,0x06,0xea,0xcf,0x62,0x3c,0x56,0xc3,0xf7,0x67,0x38,0x16,0x8e,0x76,0xfc,0xd5,0x88,0x2d,0xf7,0x9e,},{0xea,0xaa,0xf2,0xa1,0x5f,0x44,0xb6,0x34,0xce,0xf1,0x5a,0x63,0x8b,0x80,0x20,0x7f,0x61,0x09,0x9a,0x07,0x96,0xf5,0xd4,0x3f,0x3e,0x9d,0x04,0x8e,0x6a,0xe7,0x96,0xc1,},{0xd4,0xa9,0xba,0xe8,0xec,0xc4,0x72,0xc3,0x76,0xba,0xb8,0x05,0xc2,0xce,0x0c,0x1c,0x2e,0xd5,0xfc,0x77,0x37,0x15,0x46,0x8c,0xb1,0xa4,0x93,0x45,0x64,0xda,0xce,0xcf,0x43,0x8b,0x1d,0xd2,0xac,0x1b,0x5c,0x5e,0x33,0x6a,0x1e,0x20,0x70,0x1d,0x5d,0xcf,0x3c,0x8e,0xe3,0xad,0x22,0x3b,0x13,0x9f,0xa9,0x0a,0x1b,0x55,0x2e,0x1b,0x77,0x07,},"\x61\x6f\xe1\x5f\xcc\xb3\x31\x0f\x9e\xc7\x45\x64\x47\xda\xda\xf8\xe0\xa5\xfb\x26\x9b\xe1\x69\xb0\xc3\xea\x2c\xfd\xaa\xa5\x5d\x37\x93\x7f\xe7\x5b\x78\x32\x4a\xc2\x78\xa6\x50\x47\xe0\xae\x4f\x32\x7e\x97\xef\xfc\xb7\xbe\xd9\x1d\x09\xda\x72\x0b\x0a\x10\x1b\xe9\xe9\x6d\x0b\xa8\x5b\x1f\xf4\x9d\x8d\x1d\xf3\x62\xd3\x45\x4f\x0d\xb6\x82\x55\x96\x10\x1c\x97\xe5\xda\xca\xd0\x7e\xc4\x92\xd3\x0f\x2d\x0c\xb7\xe7\xde\x4e\x74\x4b\xb6\xa6\x10\x0b\x75\x4d\xa8\x47\x41\x1d\x09\xaa\xce\x8d\x5d\x41\x07\x58\xb8\x30\x87\xdb\x4b\x5e\x62\x97\x97\x9a\x21\xfb\x65\xaf\x39\x09\x52\xc4\xf9\x36\x26\x0e\x72\xd7\xc7\x83\x27\xb9\x4a\xa6\xcd\x61\x72\x78\xb0\xce\x9e\x1b\xd3\xfb\xed\x93\xb6\x9b\xc6\x49\x85\xdd\xe0\xe2\xc4\x35\x7b\x50\x2f\x05\x5e\xe7\xb0\xa0\x38\x84\x74\xda\xe0\x2d\x6c\x1a\x73\x1f\x87\x78\x5d\x75\x3a\xeb\x0d\x9c\xfd\xf8\x50\x02\xdf\x56\x6f\xc2\x50\x7d\xe7\xba\x6f\xd0\x35\xbe\xe1\x7a\x2e\x80\x8b\x4a\x75\x88\xc5\x83\x37\x5c\x82\x40\x7a\x40\xae\x9e\xeb\xdf\x94\xdf\x2f\xb8\xca\xbf\x17\x60\x6c\x43\x9e\xa7\x04\x59\xb2\x12\xaa\xe4\xa3\xf5\x30\xec\xad\xc5\xe8\x8e\x25\x48\xfa\x64\x3c\x7d\xdf\x50\x63\xb2\xe1\x06\x73\xe5\x9d\x07\xfe\x90\x68\x92\xb6\x7e\xb5\x8f\x93\x88\xa5\x6b\x37\x04\x52\xe9\x97\x77\x55\xfc\x04\xdf\xbc\x77\xda\x6c\x05\xbe\xdd\xeb\xf0\x36\x52\x56\xb5\x2c\x9a\xef\x8a\x82\x17\x3b\x8c\x89\xfb\xd9\x8c\xea\x36\xa8\xb8\x96\xfe\x66\xd3\x7c\xa7\x9b\xec\x7f\xbf\xe9\x58\xfe\x89\xf6\x76\x50\x85\xb3\x35\xdc\x77\x03\x43\xe2\x30\xca\xdd\xfa\x28\x33\xda\xa6\x62\xfe\x82\x08\xdd\x88\x5a\x6f\xdf\x72\xe3\x6e\xcf\x22\xbb\xbb\xcb\xe7\x9d\x37\x06\x50\x23\x69\x40\xbc\x2e\x6d\x4a\xc7\x4f\xe4\xd5\x54\xc9\xbc\x23\x2f\x07\xd2\xaf\x62\x20\xd1\x57\xbd\x2d\xa6\xa6\x61\x2a\x08\x1b\x4c\x99\x04\xa2\x86\x9b\x13\x7e\xe3\xa0\x85\x6f\x12\xb2\xeb\x87\x62\xdb\x94\xed\x0b\xa1\x36\xf2\x3e\x7f\xb4\xbd\x1f\xcd\xee\x10\xdd\x84\xe2\xcd\x3b\x0a\x49\x14\x8a\xc7\x4d\xb4\x66\xdb\xee\xf8\x1e\x6a\x8c\xe0\x86\x11\x02\xde\x9b\x1a\x3e\x1d\xcf\x5c\x6b\x03\x08\xa8\x2e\x3a\xc7\xc2\x28\x3c\x7c\xc2\xf3\x4f\xfa\x14\x5b\x9f\x74\xb7\x99\x04\xb3\x2b\x79\xe9\x60\xb8\x14\xaa\xde\x63\xa0\xdf\x01\x67\xdc\xd2\x4e\xd9\x0a\x8d\xa7\xb9\x34\xc7\x72\x93\x2f\x5a\x47\x8f\xe2\xa7\x2f\x94\x5a\x13\x09\x6e\xc3\x7c\xe7\x64\xb5\x81\xeb\x89\xe5\xf6\xb2\xbd\x7e\xb8\x8b\x85\xa8\x95\x87\x77\x4d\x45\x8c\x58\xcd\x87\x94\x57\x97\x3d\x64\x8e\xf7\x71\xc5\xf1\xde\xb2\x7a\x0c\xc5\xb2\x92\x46\xac\x2f\xa1\x2d\x18\xdd\xc6\xb9\xf9\xac\x9c\xf1\x46\xc3\xf2\x2b\x1e\x44\x99\xad\xee\xfb\xcd\x22\x49\x74\x0e\x13\xa2\x24\xe7\xb6\xb3\xef\x15\x60\x5e\x7e\x74\xe6\x8d\x7b\x72\x64\x24\x09\xb9\x0c\x4e\xc1\x61\xeb\x24\xc9\xb4\x0f\xf9\xc7\xe6\xe5\xda\x98\x32\x2a\xca\x52\xc4\x6a\x8d\xdc\x19\x0f\x1c\xab\x15\x7c\x4c\x76\x19\x60\x1a\x6b\x33\xdf\x6a\x50\xda\x66\x1b\xc7\x53\x60\xdf\xf6\x97\x50\xd3\x45\x74\x09\xcc\x02\x41\xc3\xe8\xc4\xb3\xe5\x06\xd4\x26\xaf\x52\xb7\x02\x31\xcd\x6c\x91\x26\x0c\xc4\x31\xe4\xcc\xfd\x49\x6c\xa1\x4c\xea\xae\x1c\xda\x78\x72\x1e\x16\x33\x9d\x52\x68\x2b\x69\x51\xf9\x66\xc7\xda\x5c\x6e\x10\xd9\x19\xae\x66\xa9\xf5\x2d\xec\x10\x86\x75\x38\xd3\xdf\x6d\x59\x3a\x32\xdb\x69\x5a\x8d\x77\x45\x70\x35\x16\xea\x56\xf8\xc1\xc8\xf0\xef\x53\xbd\xeb\x7f\x53\xc2\xd9\x44\xf5\x11\x94\x0c\xcb\x90\x62\x49\x22\xac\x59\x9f\x46\x19\xc3\x04\x62\x07\xd6\x05\xf6\xff\x94\xde\x78\x8d\x25\x34\x22\x29\xdc\x8a\xf9\x2b\x5f\xdf\x0d\xd7\x1d\xf2\xb4\x46\xcd\xf1\xd9\xa2\x05\x24\x33\x9e\xe1\xc3\x18\x26\x28\x7e\xf7\x27\x81\xa7\xa3\x52\x89\xf8\x5a\x15\xba\x57\xc7\xfd\x5d\x88\x5b\xd0\x55\x3a\xb4\x08\x05\xf5\x17\xe8\xf1\xb1\xb3\xc4\xfc\x67\x71\xe6\xf2\x24\xbc\x03\x11\x24\xb9\xc9\xae\xb1\x9c\x5a\x96\xbf\x14\x88\xe1\xe6\x6c\x6e\x88\x80\x92\x30\xc8\x3a\x74\x15\x55\x54\xa2\x19\xec\x37\x9a\xe5\x4a\x9f\xe7\x9d\xbe\xde\x3d\x57\x60\x42\xa6\x35\xd1\x97\xf4\xd8\x18\xc7\x78\x75\x5b\x8b\x45\xe5\x13\xde\xac\x88\xf6\x04\x25"}, +{{0x95,0x17,0x4a,0x09,0x15,0x68,0x4c,0xdb,0xb6,0x19,0xb0,0x55,0x49,0x5b,0x00,0xf1,0x92,0x82,0xcf,0xfc,0x3b,0x05,0x01,0x9e,0x6a,0xb7,0x09,0xa4,0xa1,0x74,0x2b,0xab,},{0xaa,0x8c,0x87,0x2d,0x7e,0x10,0xb6,0x7f,0x7f,0xf2,0x41,0x72,0xc3,0x63,0x7e,0x80,0x82,0x5a,0x0a,0x71,0xee,0x0c,0x48,0x86,0x3a,0x2a,0xcd,0xcb,0xe8,0xda,0x45,0x9a,},{0x78,0x0f,0x40,0xc2,0x0f,0xea,0x3b,0x11,0xc9,0x42,0x2a,0x43,0xb9,0xa6,0xf7,0x96,0x11,0xe7,0xf1,0xf5,0x9d,0x14,0x88,0xc1,0x5a,0x5f,0xd2,0xd3,0x2c,0x07,0xda,0xdc,0x39,0x1c,0x38,0x95,0x3e,0xdf,0x0d,0xe4,0x8b,0xe5,0x2d,0xa2,0xaf,0x33,0x5c,0x47,0xb8,0xd2,0xe4,0x4a,0xb9,0xd3,0xdf,0xb7,0x6b,0xa5,0x38,0xb0,0x66,0x49,0x52,0x08,},"\x5e\x1a\x74\x00\x45\x6c\xad\x4f\x9b\xa8\x66\x43\xbc\x7c\xbf\x3b\x35\x68\xdc\xb5\x22\xb3\x70\x55\xe8\xc3\x9d\x3c\x80\xf2\x28\x42\x38\xe5\x72\x7f\xd7\x51\x3c\xc8\xb3\x1c\x57\xae\x7b\x40\x50\xaa\x81\x9f\xc2\x36\x09\x30\xeb\x0d\xd6\x77\xa5\xb2\xc7\x29\xfe\xb2\xda\x3a\xd7\x9a\xe7\xfc\xcd\xdd\xb6\xc0\x84\x46\x26\x1e\xc9\xbb\xe5\x9c\x64\xe9\x9a\xbb\xc8\x6d\x3c\x48\x35\xf0\x0f\xef\xe5\x27\x43\x3a\x50\x1a\x3b\x6d\x57\x2c\xf5\xe1\x2a\x88\x01\x0b\x46\xa4\x72\xb9\xbd\x86\x91\xa4\x07\xc3\x65\xf9\xf7\x16\x34\xb4\xd9\x7e\xdf\xdf\xf0\x63\x14\xc0\xc1\xb4\xeb\x93\xc7\x60\x7f\x1d\x6f\xa3\x54\x65\x93\x22\xc2\x84\x07\x3f\x42\x60\x25\x18\xc5\x4f\xdf\x26\xea\x2c\x27\xc8\x0a\x6d\xfa\x20\x56\x83\x91\xab\x35\x72\x82\xc0\x6b\x23\xbe\xdc\x1d\xf1\x26\x4b\x61\x1c\x1e\x9c\xf1\x8a\xeb\xe2\x49\xfd\x86\x17\xc6\xe3\xee\x98\xc5\x3c\x0f\x6f\x21\x75\xc5\x7e\xf8\xe2\x06\xbd\x3c\xf1\x05\x62\x7a\x98\x92\xeb\x68\x99\x20\x21\x3a\xae\xb6\x3d\x87\x66\x3d\xbf\xa5\x3f\x0f\xb2\x81\x62\x69\x48\x29\x6b\x2d\xbc\xdd\xe1\xc5\x1a\xf8\x62\xee\xcf\x1c\xfe\x8a\x46\xa2\xc4\xb2\x8c\xfe\x71\x30\x33\x0a\xd1\x73\xf8\x71\x27\xaa\xca\xff\x43\xc0\xbd\xde\xa4\x8b\x00\x38\x97\x6e\x66\x2c\x04\xb6\xb0\x4a\xd0\x3d\xe1\x24\x62\xc2\x76\x5d\xb5\x35\x04\x95\x20\xcc\x11\x4a\xfd\xb6\xc9\x25\x49\xb0\x54\x6a\x90\x27\xd4\x49\x75\x5b\xeb\x8d\x4c\x17\xe6\xa2\xa4\x75\xf9\x67\x6a\x33\x7b\x4e\x86\x6d\x96\x32\x5e\x38\x9a\x52\xc1\x6c\x51\xe1\x8e\x0d\x81\x03\x34\x0c\x84\x17\xb2\xc5\x7a\x55\xd0\x42\xff\x5e\x5f\xc6\x5d\xf4\x23\xe0\x09\x2b\x0e\xa8\x8b\x96\xa9\x07\xc9\x51\x21\xc5\x47\xa6\x80\x61\xf2\x7b\xcf\xb5\x8c\xe6\xc0\x77\x28\xd4\x84\x6b\xdc\xbf\x0c\x62\x54\x10\xed\xf8\xde\xa8\xcb\x4c\x9d\x0b\xbe\xef\xcd\xe1\x92\x73\x36\x5f\x48\xd7\x5a\xec\x07\xd1\xc2\x2c\xcd\x23\x06\x8a\x97\xc3\xfe\x75\x2e\x87\xa3\x01\x18\xfe\x2d\xfd\x52\x18\xb6\xb1\x25\x15\x4e\x0e\xa3\x86\xcf\x23\x9e\x31\x37\xf8\xca\x6d\x8b\x74\x6b\x6a\x67\xd5\x08\xcf\x8c\x1a\xb6\x3e\x57\x15\xe6\x72\x1e\xda\x5c\x2b\xc3\x93\xa4\x93\xdb\xd2\xf9\xa1\xfa\x92\x6b\x9a\x59\xe4\x5a\x18\x0a\xee\xb0\x25\x99\xa8\xcd\xd6\x86\xf8\x89\xb4\x85\x27\x23\xcb\x6d\xbf\xb5\x01\x4c\xab\x5f\x65\x8a\x30\x9a\x47\x22\x39\x36\x0e\xea\xf6\x4f\xc8\x20\x3a\x3c\x70\x89\x70\xe1\x5c\xbc\xf1\x36\x25\x5d\x96\x44\x6c\x39\xa9\x27\x03\x1d\x26\x7d\x69\xec\xd5\x1d\x7a\xf6\xe9\x1f\xb4\xae\xf9\xd7\x8c\x33\x35\xe9\x07\x11\x33\xcf\xb8\xe2\x12\x99\x90\xc6\x46\x37\xc7\xad\xf1\xda\xef\x2d\xc2\x6c\x11\x63\x39\x9f\x3f\xe1\xe7\x92\x33\x80\x92\xef\x6f\x8d\xfa\xf2\x57\x30\xdd\x2f\xe8\xd9\x78\xf6\xf7\x70\xf5\x2b\x68\x23\x81\x76\x56\x4c\xee\x5f\xbb\x98\x50\xb3\xb3\xa0\x4d\x94\x84\x60\x41\x78\x26\xeb\x2e\xb2\x4f\xcc\x5f\xe3\x53\x34\xbb\x95\x21\xe8\x7b\xc4\xdb\xde\x2a\xc9\xe1\xc9\x89\x49\xdc\x2d\x29\xad\x27\x9e\x38\x84\xb9\x05\x26\x8e\xbd\x08\x08\xbf\x41\x82\x57\xe7\x5e\x26\x2b\x4d\x01\xb0\x24\xa6\xe9\xaa\x7b\xd5\x01\xdb\xa9\x4f\xf5\x06\x39\x4b\x4b\x0a\xe6\x08\x1e\xa7\x30\x30\xc4\x3a\x6a\x91\x76\x6e\x80\xf9\xf4\x2c\x0b\x68\xb9\x84\x19\xad\x4e\xee\x4e\x9a\x72\x8a\xde\xfb\xd7\x9e\x83\x1f\x70\xf4\x1e\x62\xb4\x3f\x0b\xf4\x2b\x3b\x2c\xd5\x3b\x55\x89\x11\x76\x64\xbc\xeb\xc4\x09\xa7\x64\x5b\x1e\xed\xda\x48\x2f\x6b\x68\x95\xa6\x57\xba\x78\x9b\x89\xe5\x02\xd6\x99\x87\x51\xd6\x30\x3d\xed\x5f\xa1\x56\xee\x7c\x7e\xaf\xe5\x46\x26\xd1\x03\x2c\x4d\x7d\xff\x97\x7f\x1d\xcc\x86\xaf\x89\xb1\xe6\x46\xa4\xaf\xc2\x42\x7e\xd0\x2c\x0a\xf5\xd3\x28\x90\xf9\x5f\x13\xf9\x8c\x1a\x5b\x1d\x9f\xbb\x78\x1a\x9a\x89\xb2\xd7\x90\xc1\x46\x5c\x2d\x15\x20\x92\x6f\xdf\x28\xc1\x7d\x9b\xa1\x58\x7a\xd7\x61\xf0\x65\xd3\x39\xbd\xbe\x38\xf4\x13\x3f\x45\xbb\x59\x78\x74\x26\x42\xf9\x0c\x06\x5e\xe4\x89\x25\x73\xf6\x05\x9f\x8b\x4c\xe2\xc1\x3e\x73\xb8\x91\xcd\x05\xf2\x37\x31\xed\x9a\x07\xe2\xb8\xff\xdc\x96\x3b\x06\xa5\x10\x20\x9c\x32\x99\x80\x94\x9f\x40\xd8\x07\x3a\x01\x3e\xf8\x43\xdf\xcc\x4a\x33\x94"}, +{{0x5a,0x84,0xaf,0x28,0xa5,0xdf,0xbb,0x32,0x33,0xa1,0x2f,0x08,0x37,0xf6,0xe8,0x65,0x4e,0x7b,0x0d,0xe1,0x6b,0x02,0xab,0x3c,0xd1,0x78,0x64,0x43,0x1e,0x27,0x46,0x67,},{0x80,0xd4,0xba,0x78,0x9f,0x8a,0x4b,0x20,0x47,0xad,0xaf,0xa5,0xed,0x26,0xcd,0x8c,0x54,0x67,0x33,0x29,0x2e,0x8b,0xf6,0x93,0xcf,0xd1,0x7e,0x28,0x4e,0xfc,0x68,0x71,},{0xa0,0xb8,0x4c,0xa5,0xaf,0x76,0x46,0xe6,0xf6,0x2a,0x69,0x35,0x37,0x94,0x73,0xfa,0x6e,0x4c,0x27,0x69,0x58,0x51,0xfc,0xbd,0xae,0x29,0x17,0xb2,0xdc,0x68,0xd7,0x96,0xe2,0x78,0xd7,0x0c,0xd6,0x7f,0xce,0xdf,0x6c,0xa6,0x29,0xb8,0x81,0xf7,0xc4,0xf2,0xaa,0x25,0x59,0xb2,0x0d,0x67,0x06,0x11,0x76,0x6b,0xd6,0x5a,0xa4,0xfe,0xf2,0x04,},"\x8a\xac\xd1\xb8\xa3\x9b\xf0\x8f\xd5\xc9\x18\x44\x6b\xe5\x76\xe6\xa3\xf2\x7f\x36\x11\x16\x07\xf2\x7b\x56\xa9\x12\x14\xe7\x63\xf9\xa8\x7f\xb1\xd1\x84\x48\x98\x96\x17\x97\x64\x44\x60\xbf\xf5\x48\x8c\x10\x3a\xf6\x05\xe8\x74\x0e\x46\x58\x8f\xb9\x3e\x44\x3c\x3b\xb2\x3b\x92\xc0\x98\x70\xa5\x57\x65\x3a\x1f\x22\xc2\x18\xcc\xbc\x2f\x07\x3a\x27\x2d\x17\xa8\x42\x23\xef\x14\x3f\x4c\x7c\xa2\x58\x46\x0b\x79\x81\x69\x67\x3d\xa1\x07\xd7\x1d\x53\x56\xce\x9f\x75\x59\xa9\xb0\x38\x39\x99\x51\xf5\x75\xc7\x7e\x5b\x9d\x05\x29\x57\x8e\xca\xa2\xe2\x08\x92\x66\xfc\x52\x6c\x5d\x40\x9f\xbd\x46\xbb\x86\x84\x1c\xb5\x54\xf5\xbd\x3c\x99\x71\x3b\x04\x3e\x40\x46\x53\xa7\xd0\x13\x44\xd4\xdb\x83\x1a\x21\x72\x82\xc4\xb3\x36\x40\x56\x53\xb8\x5d\x27\xa4\x6b\x25\x9c\x85\x5c\xdd\x85\xad\x6f\x7a\xed\xd8\x35\xff\x55\x00\xcc\x8b\xaf\x0f\xb2\xf0\x18\x09\x10\xc6\x46\x72\xb8\xa8\xd4\x9d\x98\x4a\x78\x29\x3c\xf5\x77\x9c\x91\x0c\x3a\xcb\xbc\xa4\x55\xa8\x54\x66\xe5\x35\x04\x4f\x34\x80\x26\x2c\x09\x0f\xbf\x4e\x0b\x0d\xb4\xd1\xef\x87\x59\xda\xaf\xdd\x8d\x05\x90\x74\x82\x46\x1f\xf9\x10\xc4\x37\x19\x5d\x5c\x7f\xed\x9d\x82\xcb\x94\xe7\xe4\xec\x24\xda\x05\x3e\x47\xf6\x2b\x48\x8e\xb7\xb2\x44\x65\x5c\x7d\xbb\x20\xed\x60\x7e\xed\x45\x31\x44\x9e\x07\x80\xe6\x1c\xfd\x57\x40\x86\xff\xc5\xdc\x52\x42\x83\x77\x5c\x44\xf7\x54\x7c\xda\xb0\x4a\x51\xee\xe4\xe1\xb7\xb6\x5a\x57\x57\x3a\x92\x48\x4a\x35\x90\x0a\x90\x9f\x81\xe4\x15\x02\x9d\x22\xca\x93\x7a\x3a\xcd\x9e\x61\xf8\xc0\xe6\x86\xb2\xd2\xad\x03\x77\xaf\x8e\xe1\x66\xe4\xa2\x0a\x82\xaf\xf4\x51\xe1\x51\x10\x3e\x0a\x17\x67\xb2\x71\xfa\x9c\x2b\x1d\xd1\x20\xf8\x05\x85\x3b\x3b\x8a\x56\x0f\xc8\xb9\x37\x62\x83\xb5\x11\x24\x32\x4a\x28\x4a\x0e\x9a\xc4\x9d\xf6\x9f\x52\x4c\x8e\x04\x2d\xf8\x2e\xfb\xcd\x16\x88\x1e\xc1\x31\xa1\x52\x10\xdf\x73\xde\x02\x94\x34\x47\xf2\x2a\x2e\xa1\xdc\x8b\xf9\x68\x29\x8e\xe9\x7f\x3a\xd5\x46\xd7\x8b\xc6\x60\x89\x7e\x08\xd2\xa2\x8b\x2b\xa6\x8b\x54\xb9\x54\xf1\x47\x64\x51\xc6\x92\x07\xe5\xdd\x24\x8a\xe4\x7e\xf3\x56\x94\x99\x0e\x6f\x05\x8b\xc0\x01\x7b\x74\x95\x10\x5c\xc8\x73\x90\x66\xaf\xb1\x1e\x1f\x26\x60\x19\x42\x54\x6a\xe8\x49\xff\x2f\x56\x73\x0f\x13\x26\xbb\xee\xa6\x40\xee\x17\x8f\xa2\x47\xad\xff\xef\xc0\x46\x49\x4f\xc7\xff\xc0\x77\x7d\x5d\xbe\x8a\x55\xda\xee\x61\x40\x6f\xe3\xc7\x08\x8d\x43\xd9\xe1\x4d\xa2\x1c\xa5\x2f\xd8\xc1\x60\x09\x1c\x8f\x99\xa6\x7d\xad\x65\xc6\x4f\xea\x9d\x18\xb1\x53\x7d\x06\x1f\x5d\xce\x87\x9e\x0b\xc4\x26\x48\xd2\xea\xa0\x2d\x97\x21\x85\x75\x3c\xb2\xf6\x22\x5d\x8d\x03\xbb\x07\xf9\x44\xb1\x0c\xf4\xea\x22\x27\x5c\x3d\x70\x84\x80\x20\xf3\x0c\x82\x3b\x76\x14\x3a\xcf\x54\x59\x99\xa2\xcc\x4b\x58\x98\xd9\x4b\x4a\x25\xef\xbe\x5a\x60\x33\x1c\xc0\x09\xfe\xc0\xa2\x5b\xc9\x89\x47\xb1\xb7\x13\x9e\x22\xd2\x32\x80\xff\x88\x54\xa1\xec\x76\x22\x1b\x1b\xf3\xd1\x08\x32\x8c\x8a\xc4\x63\xc6\x52\x63\xa2\xd7\xca\x74\x33\x48\x29\x31\xa1\xd8\xfc\x14\x4b\xbe\x9b\xef\x67\x8c\x92\xe1\xc2\xd1\x09\x21\xb6\xad\x43\xa7\x5c\x53\xbc\x07\x58\x54\xed\x2d\x99\xd8\x25\xf3\x0a\x5e\x10\xd5\x17\x43\x8e\x4d\x4f\x71\x13\x42\x9f\x1e\xdb\x38\x7d\x6b\xd7\xaa\xd2\x92\x74\xf8\xd2\xdc\x88\x9b\x7e\xfb\xeb\x58\x68\x6f\x8d\x66\x9c\xea\xef\x92\xc7\x5e\xd5\x30\x7f\x0c\x03\xf5\x90\x01\x81\xce\x57\x3c\x8f\xa2\x86\x75\x20\x5f\xb1\x05\x7f\x62\x6a\xa2\x30\xd0\x3e\x2e\xaa\x8c\xff\xcd\xe2\x00\x81\x47\x5d\x80\xb2\x45\xa1\xca\x60\x45\xba\x20\x4a\xb0\x00\x69\x07\x9c\x63\x7f\xc3\xfb\x3e\x80\xca\x04\x62\xe7\xa4\xcd\xd9\x28\x3f\xf9\x00\x85\x30\x36\x48\x16\x79\x2f\xdf\x3b\x9a\x4e\x4d\xc8\x37\x92\x28\xed\xcb\xb1\x54\xbe\xf3\x87\xd3\x77\x60\xd7\x9a\xfb\xb7\x36\x26\x0a\x1d\xb1\x01\x38\x36\x1f\x24\xb8\x26\xdb\xcd\x5f\x0f\xc9\xe7\x83\x0d\x26\xd8\x0c\x52\xa7\x92\x18\x92\x76\xbc\xe3\x47\x60\xfb\x77\xbe\x13\x12\xac\x8c\xf9\x7d\x92\xcb\xf3\xd0\x77\x80\x28\xdb\x5e\x8e\xae\x89\xe0\xb9\xbc\x87\x78\xae\xb1\x27\x8f\x04\x71\xcb"}, +{{0x79,0x3a,0xc8,0x8d,0x7d,0x3b,0x6f,0xa7,0xf4,0x7d,0xee,0xc3,0x1f,0x68,0xdd,0xcc,0xb7,0x01,0x82,0x0f,0x1b,0x13,0xdd,0xc6,0x52,0xf7,0xc6,0xa8,0x5b,0x60,0x52,0xa5,},{0x91,0xb6,0x22,0x7a,0xcd,0xd1,0x83,0xda,0x62,0xc5,0x19,0x65,0xc6,0x35,0x35,0x8b,0x20,0x4d,0x68,0x3e,0xe0,0x64,0x43,0xcb,0xd4,0x0e,0x71,0xc1,0xf7,0x6a,0xd1,0x02,},{0xa8,0x4f,0x55,0x2b,0xf4,0x43,0x22,0xa6,0xdb,0x24,0x5c,0xa0,0x06,0xd1,0xcf,0x78,0x0c,0x61,0x68,0x0f,0xe7,0x42,0x9a,0x89,0x47,0xc3,0x5f,0x21,0xbc,0x4b,0x44,0x22,0x8b,0xa3,0x0a,0xea,0x0c,0x74,0x4b,0x86,0x64,0x59,0xd3,0xb8,0xac,0xad,0x45,0x3b,0x06,0xac,0xe2,0x47,0xba,0x69,0x52,0x8c,0x6b,0x3b,0xc4,0xb2,0x0e,0x75,0x63,0x0e,},"\xec\x50\xaf\xad\x8a\xde\x74\x05\xe2\xc6\xf5\xc6\x24\x7b\xbb\xcc\xfb\x2c\x17\x16\x6f\x78\x84\xfe\xae\x10\xd9\x0f\x5d\x83\xc4\xb6\xf0\xbf\x76\xde\x2f\x78\x97\xba\x11\x94\xd6\xd3\x44\x9d\xdb\x80\xae\x74\xeb\x8e\xd6\x8f\x04\x9b\x35\xc6\xf2\x19\x16\xdb\x4d\xfc\x27\x24\xdc\x3a\xf7\xad\x8d\xd5\xc4\x4f\x60\xd2\xf4\x9f\xad\xd7\x00\x4d\xa1\x59\x30\x93\x94\x2c\xae\x52\x08\xbf\x54\xcf\x90\x3b\xee\x64\x69\x05\xfc\xe2\xeb\x2e\x37\x0d\x0d\xca\x48\xd8\x20\xad\xea\xb1\x6a\x3b\x67\x5e\x5a\x4a\x8e\x26\x7e\x34\xff\x96\xf3\x12\x2b\x18\xde\x0c\xad\x92\x92\xab\x63\xd2\x6e\x5f\x31\x0f\xa2\x16\x8c\x29\x66\xbd\xb6\x3b\x0d\xe0\x86\x26\x76\x7b\x37\x9d\xe4\x63\x3b\x9f\x3e\xda\x79\x17\x28\x1d\xad\x66\x1e\x9f\x77\x2b\x84\x4a\x79\xe8\x00\xfd\x84\x27\x02\x44\x6e\x4a\xa7\x31\x75\x71\x07\xf3\xfd\x65\x47\xbf\x40\x75\x96\x3d\x5f\xd5\xf5\x8e\x80\x85\x3f\xc4\x27\x51\xdc\xa0\x78\xa9\xfa\x8d\x5b\xb3\xd9\xa3\x4a\xbc\xab\x02\x93\xd6\xce\xae\xc4\x89\x67\xa1\xe6\x22\x43\x98\xca\xd0\xf6\x05\xa3\xbe\x8e\x67\x58\xea\x8f\x29\x20\x9d\x8e\x4c\x4c\xa1\x89\x3b\xaa\xd9\x1e\x37\x9b\xa3\xb1\x73\x30\xc1\x2a\x5b\x6f\x21\x9b\x38\x4a\x8a\xb9\x78\xbf\x1b\x37\xc3\x73\x1a\x1b\x47\x4b\x24\xb5\xd6\x7d\x4c\xec\x28\xaa\xc6\x51\x0b\x11\xf2\xcf\x21\xbc\x16\x96\x3d\x51\xf5\x53\x87\x27\x71\x8f\xc4\xe2\xe5\x17\x2e\x3c\x0c\xda\xbc\x27\x7f\x0d\x70\x37\xc3\x4c\xa6\x8f\x73\x28\x88\x48\xb9\x26\xbd\xe0\xcf\x47\xab\xfa\x66\x60\x09\x16\x94\x6f\x07\x65\x1c\x28\x0a\x20\x86\xb1\x4d\x52\x57\x0c\xc8\xa4\xb7\x43\x58\xb5\x9c\x30\x2b\x9d\x00\xe1\xb4\x98\xf3\xbc\x33\xee\x4e\xcf\x2b\xce\x2c\x65\xed\x7e\x8b\xa7\x4d\x35\xb7\x51\xd3\xc9\x9f\x40\x86\x19\x68\xc2\xb7\xf3\xa5\xbe\x34\x8c\x57\xd9\x3b\x40\xff\xd0\x51\xed\xd7\xca\xca\x6e\xe6\xbc\xa7\x21\xdc\xba\x8d\xb8\xd0\x06\x4f\x54\xd3\x6e\xc5\xe8\xd6\x2a\x71\xfd\x1c\x90\xf1\x49\x24\xf4\x1c\x16\x3f\x00\x7a\xfc\x6f\xbb\xfe\x86\x45\xfa\x47\xc3\xc9\x80\x24\x6d\x1b\x92\x27\x43\x85\x95\x3c\x53\x41\xcd\x64\xc3\x4a\xe9\x71\x7c\xc2\xc3\x7f\x58\x35\x9c\x0a\x99\x91\xc2\x3f\xe6\x37\xde\x6c\xdf\x08\x62\xf7\xd0\x32\x9f\xe7\x58\xaa\x89\x2a\xd4\x58\x3b\x9d\xf2\xf3\x33\x7d\x5b\xe5\x70\xba\x65\x49\x98\xed\x29\x2f\x11\xf0\x17\x72\x38\x2a\x04\x34\x2f\xdd\x99\xe6\x9e\x0d\x97\xc4\x3f\x10\xac\x9b\x96\xf1\x40\xa6\xf8\x3c\x47\x29\xe7\xa9\x00\x47\x1f\x2b\x1d\xf2\x40\x1b\xc5\xc6\x80\x42\x2b\x13\xb0\xc8\x00\x7d\x63\x68\x1f\x66\xa0\x59\x5a\x1c\x5d\x3a\xcd\xe5\xb7\x79\x42\x6e\x73\x6b\xc1\x00\xc5\xe6\xf5\x26\x08\xdc\x39\x1e\x3e\xf9\xb1\xbb\x6a\xf1\x3d\x24\x9b\x7d\x32\xce\x06\x80\xc3\x68\xf5\x4d\x5f\xe0\x39\xcf\xe1\x01\x30\x25\x1e\x4d\xb1\x4c\x79\xc8\xd0\x44\x06\x04\x65\x82\x29\x90\xd8\x80\x93\xcd\x73\x65\x32\x85\x2e\x44\x78\x89\xdb\x89\xcc\x60\x05\x29\x96\xa3\x2a\x64\x36\x5c\x07\x26\x05\x1c\x11\x9e\xda\x90\x1d\xe5\x76\xb3\x34\xfc\x70\x49\x48\x23\x92\xe2\x62\x0b\x0a\x3a\x13\xfa\xb1\xd3\x6f\xc0\xa5\xf2\x3d\xb1\x47\xfd\x85\x7b\x26\xa6\x98\x04\x8f\x8b\x81\x1e\x23\xd7\x22\xe2\xe9\x02\x7e\xd4\x12\x4b\x48\xdc\x5e\x57\x8a\x7a\xeb\x19\xa1\xb4\xf9\x48\xee\x5b\x46\xf6\x5b\x97\x96\x46\xe2\xbe\x07\x47\x14\x11\x8b\xaa\x4b\xfc\x15\xb0\x89\xa0\xe0\x66\x27\xda\x46\xe4\xbb\x06\xaa\x3c\x7c\x5d\xd6\x48\xe0\x3c\x9c\x2d\xec\x3f\xac\xd9\x56\x26\x56\x2f\x30\x00\x88\x32\x30\xd2\xb0\xa1\xf8\xa7\x47\x8c\xb7\x7f\x93\x9a\x5f\x18\x8f\x45\x8d\x10\x37\xb9\x01\x76\x66\x4d\x86\xea\x85\x0b\x8a\xf5\x08\x7f\x86\x60\x5a\x77\xe0\x25\xef\x6c\x7e\x6a\x2a\x59\xf0\x06\xcb\xa1\x89\xfa\xd9\x33\xf4\x2c\x53\x27\x08\x10\x9b\xc1\xaf\x81\x48\x19\x59\x5f\xfc\xb9\x5f\xbf\x5b\x7e\x93\xa7\x11\x97\xe4\x77\xee\x7c\x04\xb8\x51\xc1\xc3\x66\x22\xcd\xd8\xe6\xc8\x60\xd9\xab\x2c\xac\x56\xd2\xdc\x98\xfa\x69\x12\x4f\x2b\xb2\xa6\x47\x1e\x1c\x73\xb6\x61\xf0\x71\xf5\xd8\x6d\xe7\xd1\xde\xaf\xa4\xed\xcd\xc7\xbf\x1f\x70\x5c\x56\x30\x0a\xff\xd0\x58\xb9\x69\x77\x91\x41\x9e\x5f\xb2\xa5\xb7\xf7\x8c\xe3\x40\x1f\xf5\x50"}, +{{0x89,0xde,0x74,0x42,0xd7,0x4b,0xa9,0x38,0x59,0x69,0xc9,0x65,0x1a,0x88,0xfe,0x28,0xe0,0x40,0xd5,0x93,0x90,0x7d,0xac,0x1a,0x39,0x87,0x41,0x8b,0xdf,0xdb,0xad,0x89,},{0xfd,0x3b,0xa9,0xfa,0xd3,0x20,0xeb,0xa4,0x5d,0x07,0xb8,0x4a,0x49,0x7b,0xe1,0x7d,0x3f,0xc7,0xdd,0x99,0x99,0xc9,0x68,0x88,0x3c,0xd6,0xac,0x13,0xb0,0x66,0x9b,0x17,},{0xba,0xb5,0x72,0x84,0xd2,0x0e,0xe5,0x4c,0xc7,0xf9,0x70,0x8d,0x71,0x77,0x06,0xd8,0xfa,0xf6,0xe4,0x63,0x32,0xb0,0x69,0x1d,0x6f,0x21,0x3a,0x8d,0xb8,0x01,0x15,0x5b,0x4e,0x33,0x8c,0x13,0x61,0xb5,0x92,0xbe,0x75,0x85,0x01,0xb1,0x82,0x17,0x93,0xae,0x52,0x27,0xcc,0x3b,0xa8,0xdf,0x8a,0xdf,0xc6,0xed,0x9a,0xca,0xb5,0x4c,0xc4,0x01,},"\x9d\x52\x72\xf0\xb7\x84\x88\x2b\x94\xc7\x6d\xfb\x9d\x46\x0c\xa4\x95\x02\x5e\x0a\xec\x5d\x52\xcc\xff\xfe\xce\x9f\x81\x73\xc1\x05\x58\x26\x6c\x49\x85\x25\x89\x1a\x97\xbf\x38\x78\xe3\x3c\x3d\xe2\xfc\x2e\x52\x55\x0b\x43\x15\x62\xcb\xe4\xa3\xd0\x11\xec\xc9\xe7\x7e\xc3\x6a\xd3\x83\x41\x35\x8c\x88\x32\x1c\x03\xd0\x8b\xb4\x26\xa7\xd5\x85\x41\x71\xc0\x27\xec\x48\xd5\x78\x19\xa9\x1a\xfd\x02\xa6\x18\xcc\xbc\x25\xe6\x8e\x53\x09\xd0\x47\xb1\x56\xe3\x57\x05\x37\x3a\xda\x2e\xb8\x31\x32\x1a\x20\x3e\x1b\xd8\xf0\xef\xec\xc0\x96\x18\x64\x7b\x41\xdf\xf2\x2b\x39\xd0\x22\x35\xf8\x71\x53\x2f\x60\x85\xe9\xcc\x52\xec\x00\x9b\x33\xee\xbc\xdc\x26\x7d\x77\x67\xc9\x0c\x92\x7e\x15\x4f\x72\xf3\xf4\x8a\x34\x95\x63\x19\xb2\x93\xc8\xa8\xb3\xe3\x4e\xfc\x5f\x62\xf2\xb4\xe8\x01\x9b\x50\xa0\x8f\x5c\xcf\x95\xbc\x83\x1b\xaf\x40\x81\x1d\x87\xe5\xed\xbd\x2f\xd5\x36\x5b\x26\xa4\x31\xae\x95\x80\x0f\xf3\x81\xcd\x62\xca\x40\xe1\x86\x6d\x95\x0d\xce\x14\xf0\x30\x91\x8a\xba\xc6\x8e\x79\x16\xdd\xb9\x5a\xdc\x19\x71\x28\x78\x74\xd0\x7e\xb0\xed\xef\x64\x29\x66\x52\xc4\x80\x44\xb0\xc5\x52\x1a\x8d\x27\x0d\x53\xd7\x4e\xc6\x3b\x89\x0f\x33\x63\xf9\x20\x7f\x66\x52\xae\x8e\x78\x35\xc3\x82\x0a\xd6\xd9\xe3\x63\x3f\x4b\xfd\x53\x79\xa4\x4f\x29\xd6\x5f\x36\x09\xfe\x35\x58\x17\xdc\xa5\x51\x8d\xfe\x3b\xd7\x69\x32\x0a\x03\x19\x02\xe9\xcf\x66\x69\xc2\x4f\x88\xb0\x1e\xb3\x69\x95\xbd\xb8\xdb\xed\x6e\xe0\xc9\xb7\xf3\x22\x95\xc6\x1b\xa8\x90\x5e\x55\x98\xf3\xc9\xe1\xc8\xbf\x72\x64\xf9\x82\x93\xfa\xea\x17\x74\x7f\x88\x44\x0c\x31\x81\x8c\x43\x3e\xa3\xd2\x3c\x01\xf4\xf7\xe9\xc3\xdd\x3d\x5f\x32\xec\x9e\xac\xd7\x1a\x09\xe3\xa9\x97\x38\x1f\x1c\xbf\xfd\xf4\xb5\xba\x49\x79\xde\xb7\xb0\x98\x41\xaf\xa3\xb0\x3d\x1c\x93\x11\x09\x7b\x86\x2c\xae\x11\x70\x7c\xbd\x3a\x4a\xe6\xc8\xa2\x6a\x30\x6a\x68\x7c\x41\x4a\x4e\xa1\xe8\x12\xf1\x15\xf6\x0f\x70\xbd\xa7\xf8\xfb\xe7\xbc\x2d\x50\xcc\x55\x0b\xba\x29\x1d\x5e\xc5\x23\x22\x9a\x08\xed\x56\x8b\x5c\xee\x18\xfe\x6f\x46\x78\x2c\x17\xcd\x82\x88\x01\x63\x92\x15\xbc\x5e\x9b\xe4\x55\x5c\x9a\x18\x00\x97\x67\xa6\xc5\xc7\x4a\x82\x29\xd2\xff\xaa\x39\x9d\x8e\x64\x32\x4e\x88\x42\x23\xd5\x07\x0f\x73\x5a\x75\xd8\x5f\xf6\xc9\x4a\x9f\xbc\x2b\x36\x51\x38\x6d\xe5\xa2\x3c\xce\x95\xc8\x78\x81\xc7\x93\x99\xae\x71\xf0\x90\x73\x7e\x21\x87\xfe\x90\x4a\xab\x1d\x92\xd6\x18\x67\x95\xc9\xb4\x6c\x62\xa5\x91\x4f\x36\x30\xfd\xcb\xac\x3b\xd4\xb0\xda\x4e\xc3\x13\x6a\x1f\xb2\xba\x40\x32\x2d\x7c\xc4\x08\x5e\x16\x70\x09\xcf\x74\x50\xfc\x6a\x28\x6c\x2f\x79\x51\xd5\x1a\xae\x23\xb8\xf3\x30\x20\xef\xb5\xe3\x24\x5b\xa6\xa3\x54\x3a\x2b\xde\xc4\x47\xd5\x1a\xe0\x0b\x5e\x16\x78\xb7\x60\x93\xcf\x21\x6b\x95\x07\xc9\x63\xeb\xfc\x02\x4c\xcd\x6e\xf6\xc7\x8c\x45\x72\x27\x3b\xea\xaf\x55\x07\x6d\xc4\x4a\x22\x4b\x58\x61\x57\x05\x79\x19\x65\x30\x7c\xef\xd4\x86\x72\xc0\x81\xbc\xcf\xbc\x1d\x15\xb0\x62\xb3\x8b\x4f\xba\x9b\x9b\xec\x95\x6c\xd1\x44\x44\xee\x43\x7e\x79\x60\xcc\x60\x1e\xdd\xc0\x2f\x1a\x76\xb6\x85\x74\xd5\xf8\x84\x31\x50\xc0\xb9\x00\x99\x34\xa2\xbf\xaf\x60\x57\x70\xc1\x36\xba\x29\xf3\xdc\x7e\x29\x59\x7a\x24\x80\xdb\x23\xe2\xb2\x67\x7e\xc6\xc5\x1b\xd3\x01\xf2\xb5\xa3\x9d\xfd\xa7\xb4\x77\xbe\xdd\x1c\xda\xed\x10\xe2\x9d\x29\x54\x62\x9b\x98\x76\xf8\xee\x54\xe4\x04\x73\x69\xd5\x34\xca\xb5\x4a\xea\x44\x1d\xc9\x47\xeb\x3f\x59\x38\x2b\x21\x83\x60\x57\x2f\x26\x59\x58\x31\x53\xc0\xe2\xb9\x12\xcf\x30\xc8\x15\xb2\x6f\x05\x85\x3d\xd3\x05\x51\xee\xcf\x64\xb8\x58\xa4\x41\xbb\x8c\x6d\xb8\xa9\xfd\xe7\x7a\x32\xa7\xb4\x6a\xf6\x6f\x8c\xb9\xf3\x5e\xe0\xfa\xfb\x0b\xd4\x2d\x9e\x65\xb2\xa9\x05\x82\x41\xa3\x1b\x8c\xa1\x11\x54\x34\x23\x76\x70\xaa\xb4\xef\xf3\x60\x10\xed\x03\x71\xf4\x65\x95\xda\x1b\xdd\x57\x9b\xbb\x67\xaa\xdb\x68\xe7\x7a\xd3\xa3\x8c\x8f\x26\xd2\xaf\x5a\x71\x03\xba\x5f\x22\xb4\x2c\xc1\x2a\x8c\x3c\xe5\xc9\x21\xc9\x1c\xfc\x0e\x63\xdf\x90\x27\xd2\x62\x29\xb1\x04\x7c\xbc\x18\xf6\xb0"}, +{{0x26,0x22,0xbd,0x9b,0xbe,0xf7,0xff,0x4a,0x87,0x62,0x9e,0xa0,0x15,0x3d,0xc4,0xd6,0x08,0xc3,0x1f,0xa5,0x84,0x79,0x88,0xff,0x50,0x0d,0x88,0x06,0x81,0xf1,0x13,0x72,},{0x19,0x97,0x58,0xa9,0xc3,0xd0,0xee,0x3e,0xeb,0xcb,0xbd,0xa3,0xe1,0xef,0x54,0x55,0xff,0x46,0xd7,0x36,0xbb,0x4e,0xf0,0xc0,0x6a,0x73,0x9f,0x9a,0xc5,0x84,0x83,0x95,},{0x43,0x78,0x96,0x6b,0x78,0x31,0xde,0xf4,0xae,0xcb,0x49,0x89,0xbc,0xaf,0x9c,0xae,0x99,0x46,0x1c,0xb9,0xb5,0x9d,0x19,0x51,0x8c,0xc1,0xec,0x7b,0x83,0x51,0xbc,0xd1,0xf7,0x23,0xaa,0xc5,0xf0,0x61,0xb3,0x83,0x63,0x57,0x4f,0xf9,0x6b,0xa1,0x0e,0x19,0x6b,0x1b,0x05,0x31,0xe1,0x18,0x30,0x36,0xa4,0x25,0xe6,0x9c,0x45,0x98,0x04,0x0c,},"\x89\x1e\x82\x12\x25\x47\xd6\x1e\x83\xb0\xab\xaf\x27\xc7\x30\x3f\x05\x22\xa2\xec\x4a\xf4\x4e\xf0\xac\x19\x6a\x99\x78\xb1\xc6\x23\xef\x1f\xa7\x2b\xaf\x70\x91\x0a\x5c\x51\xc4\xf7\x8e\x0f\xe9\xfe\x37\xe2\x43\x9c\x47\x95\x91\x6c\xfa\x22\xab\x47\x1a\x25\x57\xcc\x7b\xa6\xb6\x69\x56\x06\x3d\xde\xb3\x9c\x50\xf1\x4f\x06\x34\x8f\xa6\x6b\x60\x64\xdc\xff\xca\x50\x43\x96\x7f\x05\x25\x4d\x57\x7a\xbf\x22\xae\x8c\x90\x00\x0c\xe2\xe6\xa1\xa8\xb2\xe3\xa6\xb3\xab\xc5\x63\xeb\xff\xb2\x04\x45\xf0\x91\x1c\xc4\x2a\x98\x7f\x84\x56\xef\xba\x41\x30\xe6\x8f\x01\xfc\xdf\x7b\xf7\x71\xfc\x1d\x35\x37\x1a\x0d\x75\xdd\x5f\x90\x00\x2c\x90\xb6\xcb\xad\xe4\x0d\x5b\x23\xfd\xb4\x9a\xba\xcb\x72\x19\xae\x27\x56\x1a\xa2\xa8\x79\xda\x88\xdf\x34\xa8\xc5\x81\xf0\xc6\x71\x98\xff\xc6\x08\xfe\x91\x95\xb5\x55\x5c\x8a\xe9\x34\xc8\x30\xaa\xe2\x88\x5b\xea\x87\x48\x74\x48\xe1\x1b\x4f\x2f\x17\x2e\x4d\x5c\xfe\x4f\xd1\x13\xf9\xd2\x01\x6c\x24\xa7\x34\x51\x2b\xb9\x18\xf5\x75\xe7\x54\x13\x97\x18\xe3\xd2\x0e\x79\x0a\xbb\x94\x2c\xba\x3e\xc8\xb2\xdb\x59\x07\x96\xdc\x43\x5f\x13\x9f\xc6\x4d\xdc\x85\xa2\x24\x94\xef\x2b\xfa\x1f\x5c\x0f\x18\x75\xea\x58\xe8\x4e\xb3\x74\xec\xf8\xce\xc6\x46\x8b\x6b\x09\xd1\xe7\x4f\x15\x41\xed\x45\x4a\x28\x07\xd3\xf4\x05\x35\x66\xb0\xe4\xe2\xc6\xae\xce\xd1\x0d\xc0\x07\xe9\xdf\x41\x6f\x26\x7f\xcb\x3f\xe1\x7b\x8b\xac\xe0\x3f\x07\x43\xe0\xe6\xd4\xa4\x8c\xe7\x6e\xdf\xf6\x0c\x0e\x3a\x30\x84\x56\x99\x54\x13\xc1\x07\x6f\xf3\x7e\xcf\x23\x81\xa0\xd4\xe9\xe4\xa9\x13\xa2\x58\xd9\x83\xb9\x69\x6b\x5c\x45\xaf\x37\xc8\x68\x40\x70\xe4\x00\xb8\xf8\x65\xa5\x04\x04\x3f\x45\xd7\x8b\x97\x13\xf3\x35\xaa\x41\x6a\x46\x16\x64\x10\x73\x5f\xb5\xd8\x22\x10\x45\x8d\x5a\x08\xa1\x04\xd4\x00\x2a\xb6\x11\x88\xf9\xdf\x45\x7d\xd7\xed\x59\x37\xca\x50\x77\x60\x6b\x41\x8b\xbc\x86\x84\xa1\xd5\x25\xbf\xa5\x51\x08\x76\x40\xb1\xd1\x77\xca\x6d\x4f\x64\x71\xb3\x9b\x2c\xe4\x3a\xfb\xf8\x28\x5e\xcd\x68\x7e\x43\x8f\x44\x25\xdf\x56\x8a\xb8\x6f\xa2\x31\x63\x49\xa1\x10\x2b\x41\x43\xd7\x1e\xf4\xe2\x4f\x5c\x53\x0c\x77\xaf\xb0\x10\x07\x88\x63\x64\x40\xe7\x40\x67\x5a\x61\x74\xc5\xf0\x57\x10\xb2\x53\xa4\x11\x17\x3f\x9e\x82\xce\x6e\x22\xf4\x09\x5e\x77\x14\xb8\x73\x7e\x14\x7a\xa0\xf2\x31\x91\x57\x8f\xfd\x93\x82\x3c\xe4\xbf\x91\xc1\xd1\x10\x98\x2a\x5d\xa0\xe4\xb8\x1b\xd2\x5b\x9b\x9c\x21\x42\xa7\x67\x1e\xe9\x37\xc9\x0f\xd0\x71\x5e\xc9\xaf\xa4\x4d\x86\x04\x68\x98\xb4\x2f\x75\x35\x89\xd2\x26\x8d\x2a\xaa\xa9\x85\xcc\x90\xe0\xf9\xe8\x27\xa3\x92\x3e\x77\x16\x34\x6f\x4f\x89\x31\xc7\x28\x21\xb3\xeb\x64\x5d\xaa\x74\x52\xc8\xaf\xc8\x98\xd7\x97\x55\x45\xc1\x2d\xa1\xbd\xb2\x09\x04\x5c\xb0\x0f\x4b\xfd\x53\x83\xdf\x01\xf0\x03\x68\x0b\x97\x34\x40\xf1\xa3\x9c\x9d\x82\x09\x59\xef\x6f\x85\xbd\x33\x63\x90\x65\xae\xfd\xc8\xbc\xfe\xcb\xd9\xb9\x55\x40\x49\x73\x8a\xf2\x9f\x12\x94\x63\x9d\x39\x15\xd6\x32\x99\x5e\x8f\xaf\x71\x3e\xf2\xee\x3c\x29\x8b\x55\x96\xfa\x10\xc9\x9f\x94\x6d\xdb\x32\x34\x06\x95\xdf\x1c\x19\x45\x94\xea\xf3\x77\x8d\x73\xc8\xba\x60\x40\xc0\x4e\xb3\xa4\xff\x86\x77\x93\x6b\x88\xe0\xc5\xf0\x44\x14\x80\xd1\x07\xd7\xac\x22\x02\xb3\xb6\x94\xe5\x7c\xcc\xa6\xd8\x25\xe2\xa0\x7e\x81\x2e\xd2\x9b\x2c\x20\xd5\xc6\x05\x47\x15\x79\xe3\xed\xff\xc2\x23\xf2\x42\xc5\x93\x91\xdb\x41\xe9\x8d\x5f\x3d\x6c\x5b\x1e\x32\xac\x82\x37\xfc\xfd\x10\x20\x54\x3a\x40\x41\xe0\x3d\x92\xad\x3e\x2e\xc5\x52\x91\x47\x07\xc7\x7c\xd0\x1f\x3e\x48\x01\x14\x44\x28\x3f\x09\x68\xfa\x4d\xee\xee\x55\xc4\x56\xed\x1f\x87\x7a\xde\x04\xac\x8e\x8d\x2c\xb6\xc8\x58\x20\xb4\x92\x9b\x25\xbf\x31\xe9\x25\x43\x5d\x6b\xcc\x50\xd3\xe2\xe9\xb8\x51\x02\xe9\x70\xd7\x89\x5c\x25\xad\xe5\x21\x61\xa3\xb6\xbf\x50\x1a\xb0\x19\x61\xcb\x63\xed\x99\x0a\xeb\x93\xed\xa3\x82\x8b\xf0\x4c\xa5\x28\x53\xc7\xb6\xb8\xe9\xe4\x9e\x34\x9d\x69\xb5\x3b\xe0\x74\x85\xf5\x42\xb7\xcd\xd0\x6b\x52\x7d\x41\xdd\x11\x9c\x70\xb5\x64\xf1\xa9\x3a\xec\x62\xae\x74\xe6\xe8\xf8\x55"}, +{{0xae,0xb1,0x3c,0xcb,0x90,0xc8,0xcb,0xef,0x90,0xd5,0x53,0xda,0x3f,0x69,0x01,0xb3,0xd7,0x5c,0x13,0x01,0x1f,0x02,0x49,0x74,0xda,0xf7,0x9a,0x17,0x89,0xc8,0xc6,0x32,},{0x5f,0xaa,0xfe,0xb5,0x95,0xf1,0x6d,0x33,0x8f,0x1c,0x72,0xa9,0xf3,0xe4,0x98,0xf3,0x8b,0xab,0x69,0xa8,0x1b,0x37,0xd2,0xd0,0x92,0xb7,0xbf,0x7e,0x50,0x5d,0x82,0x0d,},{0x06,0x11,0xb1,0x9a,0x74,0x72,0xa4,0x43,0xe8,0x7e,0x54,0xd7,0xc6,0x64,0x7f,0xaa,0xb1,0xb7,0x9a,0x83,0xfd,0x43,0x71,0xc9,0x2b,0x97,0x54,0x00,0xfd,0x62,0x8a,0xcf,0xc3,0x25,0x77,0xcc,0xbb,0xaf,0x03,0xd8,0x8f,0x89,0x3c,0x88,0xf2,0xca,0xc7,0x84,0xc7,0x22,0xa0,0x8f,0x38,0x7a,0xbc,0x31,0x9a,0x70,0x2c,0x86,0x84,0x79,0x65,0x0b,},"\x86\x1a\x10\x18\xd6\xbd\xc4\x80\x5a\x5c\x4d\xf8\x7e\xfa\xa4\x62\xc6\x8b\x4b\xf4\x06\x5c\x68\x4c\x2a\xf1\x31\xc6\x37\x73\x88\xba\xee\x58\xc6\xc8\xf8\x84\x23\x62\xec\x6e\x3b\xce\x07\xc8\xaf\x55\x88\x5e\x82\xdb\x87\xa1\x52\x27\x80\x0d\xd3\x3a\xfc\x5e\x5f\xd1\x57\x01\xe9\x5f\x53\x50\x1b\x1a\x6f\xf8\x3c\x64\xe8\x51\x71\x49\xbf\x3f\xf0\x11\xb0\x94\xa0\x9c\x67\x3d\x0f\xc4\xa3\x9e\xe5\x5e\x69\xf0\x71\x17\x7b\x8a\xa3\x64\xe1\xe2\x56\x06\x4c\xf7\x02\x79\xcc\x76\x69\x5a\xe4\x9d\xaf\xcd\x80\xca\x0a\x14\xe1\x69\x1d\xb9\x46\x42\x2e\xc7\x5a\xb4\xf7\x86\x59\x15\xa6\x9b\xd4\x8d\x89\xb1\x2a\xdf\x48\x7d\x4d\xb9\xbe\x87\xcd\xdc\xa2\x11\xaa\x88\xe9\xbb\xe8\x49\xda\x21\x39\x89\xeb\x08\x44\x59\x2a\xd6\x3e\x28\x1b\x2e\x4a\xfe\x6a\x88\x36\x00\x66\x09\x92\x6c\x0f\x78\x7e\x84\xf2\xa9\x5b\x46\xb6\x6f\x0e\x45\x55\xc9\x48\x3c\xe2\x17\x6f\xc6\x3f\x7c\xc9\xf4\xf2\xa2\x2d\xb0\x55\xaa\xe2\xe6\x8b\x30\xa0\xda\x5f\xeb\x80\xc2\xa6\x0e\xa1\x0d\xbf\x67\xfb\xbc\xdb\xe0\xbe\x33\xf2\xe9\xc1\x3c\x46\x9e\x77\x68\xf2\xff\x59\x60\xa5\x5e\xb4\x82\xec\x11\xd4\x7e\x15\x4b\x7c\x42\xa5\xfb\x75\x6c\x8a\xd5\x39\xb3\x3d\x12\x5a\x4a\x65\x19\x2c\x6c\x9b\xd5\x76\x23\x8c\xa7\x2a\x73\xcd\x17\x9e\x8c\xf5\xcd\x04\x8e\xd3\x30\x21\x38\x23\xab\xba\xfc\x36\x82\xb2\xb7\xf6\x8c\x5b\xc4\x6f\xd0\x9a\x8c\xb2\xa3\xfd\x09\x95\x73\xee\x2e\x6f\x28\xc8\x2e\x27\x1b\xb5\xef\x93\x4b\x0b\x0c\x38\x1c\xfa\xae\xc6\x66\xd7\x17\x10\x6a\x87\x4a\xf3\x0a\xa7\x41\x25\xea\xe9\xac\xc2\xf1\xf2\x41\x18\xcb\x4e\x68\x3a\x73\x1e\x37\xe5\xe4\x64\xa1\xea\x3d\x2a\x53\xcc\x0d\xca\xd4\xc1\x7c\xea\x9a\x43\xe2\x36\x5f\x3a\xe3\xdd\x89\xeb\x39\x97\x74\x20\x04\x55\x50\x74\x5f\xc2\x67\xfc\x7d\xcc\x56\x02\xe9\x14\x97\x2a\x4d\xa6\xeb\xeb\x68\x7f\x68\xa0\xcd\x7d\x8b\x4f\xdd\x73\x72\x21\x06\xa8\xe4\x36\xb9\x3e\x5b\x58\xf5\x98\x2a\xce\xcd\xec\xfd\xb3\x82\xfe\x98\x53\x82\x61\x42\x6b\xa6\x40\x52\x55\x76\x43\xce\x9f\xec\x71\xea\x43\xcf\x5b\x6c\xba\xde\xb4\x95\x31\x93\xff\x3e\xd1\xa1\xf9\x22\xa9\xaf\x2e\xc6\xf3\x38\xe7\xfb\x0a\xff\xe3\xd1\x3c\x33\xe3\x95\x87\x3e\x4a\x7a\x7f\xb0\x44\x98\x1e\x05\xa6\x71\x97\xb9\x96\xb1\x99\xb4\x30\x11\x11\x93\x63\xe5\x61\xd5\xb8\xa5\x17\x84\xfd\xff\x58\xab\x80\xed\x4c\x49\xe9\x3f\x0c\xf4\x19\x24\xf9\x83\x5e\xfb\x09\xf6\x44\x63\xb6\x55\x17\xb6\x7b\x15\xdc\x3f\x28\xad\x9a\x9b\x2d\x29\x46\x8d\xe2\xc6\x3e\x62\x00\x4b\x6a\x3f\xd0\xc5\xc2\xe2\xaa\xa6\xcf\xa1\x5e\x4f\xaa\xfa\x1e\x2c\x71\x3e\x98\xd3\xfd\x25\xca\xb9\xe5\x17\x03\x59\xc8\x36\x51\x52\xb4\x74\x27\x6e\xd0\x03\x7c\xdf\x77\x18\x28\xe2\xfb\x7c\xce\xc4\x89\x5f\x21\xad\xcc\x5b\x68\x87\xc8\x6e\x51\xad\x05\xf2\x55\xf6\xe9\xda\xd2\xc4\x1f\x56\xb9\x8b\x7b\xbb\xf9\xfc\xb6\xba\x8c\xad\xfd\x38\xad\x8c\x62\xf9\x2d\xd8\x77\x40\xfa\x1e\x1b\xd1\x70\xc0\x0b\x20\x49\xc5\x13\x0f\xe7\x33\xf1\x6b\x1f\x2c\x7f\x00\xb2\xef\x97\xb3\xa9\x54\x58\xc5\x3f\x19\x9d\x46\x53\x36\xd5\xff\x59\x77\x80\x6e\x1a\xfd\xe3\xea\xa2\x46\xd8\x5c\xab\xf7\xe1\x23\x48\x1e\x23\x92\x99\x76\xed\x19\xc4\x0e\x29\xff\x33\xd8\x0e\x7d\xea\xb1\x92\x71\xde\xcd\x5e\xe0\x61\x72\xb0\xb0\xa1\x39\xbd\x62\xa2\xe7\xc8\x3a\x8a\x65\x60\x1d\x0a\x05\xd6\x1a\xf9\xc6\x03\x2d\xf5\x80\x01\xd4\x73\xe2\x0d\xd6\xc6\xaf\xd7\x8d\xdb\xd7\xcd\x17\x8e\x9c\x27\x1e\x05\x72\xf8\x59\x82\x82\x3c\xe6\xc4\x02\x93\x0c\xf8\x0f\x5e\x0c\x7c\xda\x85\x12\x2a\x76\xd1\xce\x02\x1b\x1e\x3d\xe2\x55\x6d\x1b\x45\xac\x7b\x01\xb5\x9c\xad\xa2\x52\x91\xd6\x38\xa5\x2a\x5e\x7d\xbc\xdd\xf9\x6b\xb1\x77\x4a\xb0\xb0\x77\xe4\xb3\xda\x5a\x95\x8f\xe1\x1d\xee\x4a\x02\xe6\x9b\x91\x8d\xdb\xfa\x1c\x5b\x3b\x7d\xca\x9f\x87\x84\xbb\x6b\x0b\x9d\x5a\x7f\xee\x74\xbb\x03\x74\x7f\x61\xc2\xb2\xf1\xb4\x92\x45\x2d\x3b\x56\x0b\x48\xd3\x9d\x87\x21\xe9\x83\x75\x25\x56\xd4\x4d\xa6\xb0\x28\xd9\xae\xf8\xbf\xf9\xaa\x37\x9c\x8e\x2b\x0a\x63\x6d\x74\x88\x60\xab\xd8\xe6\x4f\xc8\xe9\x65\x20\xa3\x4a\x27\xf7\x67\xaa\x97\xa8\xf7\x7b\x60\x95\x21\x8e\xad"}, +{{0x73,0x87,0x2b,0x14,0x76,0x2f,0x68,0xda,0xe4,0xfc,0x10,0xdf,0xd6,0xf4,0x2d,0x3f,0x96,0x22,0xbf,0x2a,0xfe,0x6b,0x34,0xa9,0x56,0x49,0xaa,0x38,0x74,0x24,0xee,0x6c,},{0xdf,0xab,0x2c,0xe1,0xab,0x99,0x81,0xaa,0x7c,0xbf,0x32,0x07,0x35,0x00,0x07,0xfa,0x6c,0xe6,0xca,0x60,0xa2,0xed,0x7b,0x59,0x0f,0x3c,0x2f,0x62,0x92,0x2d,0x8f,0x61,},{0x85,0x25,0xc3,0x46,0xca,0x3a,0x6a,0x6c,0x5f,0x65,0xc4,0x17,0x78,0x59,0x93,0x77,0x65,0x98,0x70,0xcb,0x6d,0xf9,0xa4,0xa0,0xe5,0x5b,0x40,0xc3,0x5b,0xeb,0xa5,0x5c,0x8e,0x00,0x9e,0x56,0x00,0xb6,0x44,0x7d,0xc7,0x40,0x2b,0xa2,0x77,0x49,0x29,0x7e,0x8f,0x95,0x28,0x69,0x18,0x56,0xf7,0x2d,0x2a,0xd7,0x61,0xed,0x1b,0xc1,0x53,0x09,},"\x43\x3d\x71\x78\x1c\xea\xb2\xb4\x7d\x82\x6e\x67\xd3\x9f\x9b\x80\xd2\xff\xd7\x25\xf8\xc5\xae\xb4\x0c\xbe\x4f\x9b\x5f\x48\xef\x93\x52\x1c\xce\xc6\x04\x36\x0b\x96\x47\x32\x31\x90\xbf\xef\x75\xac\x93\x15\x62\xd2\x7f\x4a\x4e\x31\xf4\x6e\x57\xbc\x99\xfa\x51\x58\xc8\x2e\x12\xb7\x37\xe4\x5c\x5d\xe9\xf7\xdd\x7c\x86\x22\xd4\xa7\xea\xad\xf7\x20\x2f\xb4\x9d\x81\x9c\x9a\xd2\x4f\x88\x07\x31\x3c\x5f\x37\xdc\x20\x45\x3b\xdf\x05\xc9\xbf\x1a\x3c\x21\x17\xc9\x3e\x7f\x3c\xc8\xa2\x54\x20\x98\xe8\xfc\x1c\x64\x2f\xa4\x7b\x05\x54\x36\x57\xb8\x5f\x48\x0b\xc8\x6e\xc4\x28\x00\xbb\x14\x22\x35\x9c\x7c\x3e\x8f\xf4\xbe\x59\x8b\xd5\x4f\x1d\xc5\x86\xac\xae\x45\xa4\x74\x06\x22\xb9\x62\x74\x2b\xc8\x6e\x17\xcf\xa6\x3e\x77\x53\x54\xe7\x70\x7e\x50\x79\x58\x9e\x8d\x10\x8b\x1f\x11\xda\xce\x05\x75\xcb\x9a\x6d\x26\xb5\x9f\xce\x98\x14\x65\xd9\xbc\x34\x4e\xa6\x94\x5a\x95\xb8\x62\x79\x63\x84\xfa\x81\x70\x56\x08\x57\x45\x7b\xef\xf9\x5a\x9b\x5a\xc3\xd6\xad\x28\x2d\x44\x92\x9a\x30\x30\x26\xb4\xbb\xed\xd6\x0e\x2e\xf0\x55\xa3\x1f\x52\xd7\xce\x8d\xf2\xca\x5d\x18\x51\xc5\xb1\x67\xdb\x08\x09\x25\x9b\xb8\x12\x56\x90\x74\x10\x5c\x73\x4c\x85\xd6\x23\x12\x73\x75\x5f\x3a\x8b\x56\xdc\x50\x8d\xb5\xc2\x3d\xac\xb7\xa0\x61\x67\xbd\xa5\x1b\xc0\x13\x50\xf0\x16\xcd\x41\xb2\x1e\x8c\xc5\xbc\x93\x34\x3a\x9b\xb6\xea\x47\x38\xc5\xc8\x4b\x78\xfa\x96\x3c\x41\x0e\x43\x3d\xc5\x98\x19\x6c\x22\xe5\xb7\x91\xe1\x2a\x4b\x34\x3f\x7c\xd4\x7b\xbb\x0e\xb0\x78\x2b\xdb\x1a\x4e\x46\x68\x46\xa0\x30\x52\x8e\xeb\x89\x05\x6f\x73\x25\x71\x93\xad\xaa\xbc\x1b\x22\x98\x62\x03\x48\x78\xc3\x25\x8a\x53\x25\x48\x76\x2e\x29\xec\xc0\x01\xab\xd9\x89\x64\x9d\xa5\xe1\x44\xcf\x35\xd4\x86\x99\xf2\x3b\xc4\x6c\x5b\x34\xe0\x4a\x53\xe7\x27\x24\xb2\xb0\xb8\x78\x98\x25\x75\xd6\x88\xe2\x3c\xbe\x3a\x34\x06\x7f\x49\x71\xe5\x55\x97\x2e\xc2\x90\x8a\xe5\xf0\x3e\x88\x31\xec\x67\x75\x5b\xe9\x56\x87\xce\x63\x72\x93\x9e\x1e\x2f\xb6\x95\x1e\xc9\xec\xf4\xbf\x7d\x15\x35\x43\x1e\x25\x9f\x29\xad\x43\x12\x22\xb5\x4b\x65\xaa\x7d\x07\xcf\xb5\xdf\x16\x2a\x87\xc4\xd0\x34\x81\xeb\x44\x1f\x22\x1d\x7f\x58\x62\x7a\x14\x16\x4e\x7f\x4c\x2e\x3a\x1d\x50\x7e\x89\x9d\x53\x58\xe0\x08\x29\xb0\x8c\xf3\xae\xcb\x8a\x75\xb2\xa3\x1c\x31\x85\xa5\x80\xe1\x2b\x13\xf0\x64\x28\x69\xff\xfb\x05\x67\x23\xe9\x61\xaa\xf6\xfe\xfe\x67\xb4\xa7\xc4\xc9\x3d\xb3\xfe\x1f\x61\xad\xcc\x76\x55\x69\xa9\x9c\x09\xa3\xc8\x24\xed\x4a\x98\xba\xbe\xae\x43\xef\xb1\xf3\x51\xba\x13\x0e\x22\xaa\x97\x81\x19\x86\xbe\x92\x3c\xc4\x18\x0a\x7c\x4b\x78\xbc\xc1\x40\xce\xc1\x55\x74\x65\x4a\xa6\xd6\x5a\x06\xb9\x7e\xcf\xa5\xf3\xa9\x35\x5f\x96\xe4\xee\xaa\x76\x89\x21\x7b\x66\x3f\xba\x4d\xab\x0d\x99\xb1\x9c\x8d\x8d\xbf\x47\xa1\x57\xe5\xd5\x96\x9a\x35\xef\x84\xdf\xf9\x56\x2e\xdd\x43\x4e\x73\xae\xe7\xd0\xd8\x92\xdd\xa7\x2a\x36\x2a\x22\xa7\xe9\xfa\x86\x34\xa5\x7e\xeb\xd1\xa9\x07\x48\x5c\xa8\x92\x1b\xdc\x19\xee\x9e\xe5\x88\xf3\x95\x68\x7d\x3f\xc8\xf8\xc2\x5f\x2e\x95\x76\xca\x60\x31\x3f\xbb\x2c\x26\x5a\x99\xf2\xcd\xd5\x57\x5b\x1d\xd5\x30\x60\x4e\x9a\xd6\x69\x5c\x9f\xb3\x59\x94\xa8\xb8\x7d\x5c\x85\x70\x54\x9a\x4d\x32\x9b\x9f\xe0\x87\x06\x9a\xb7\xeb\x0d\x71\x4a\x94\xe1\x92\x61\xf8\x6e\x44\x8f\x2d\xa9\xb1\xcb\x0c\x0d\xbe\x41\xd4\x4c\x3a\x82\x47\x83\xd1\xbd\xbd\x73\x26\x05\x1a\xeb\x10\xad\xab\x80\x5c\x5c\x59\xd0\xe8\x3b\x1c\x11\xa2\xfd\xd3\x5e\x44\x4a\x49\x9e\xd1\x5d\xaf\xd8\x38\x62\x77\x5f\x6c\xdf\xc6\x75\x95\x81\x84\x07\xbe\x55\xec\xbf\x7b\xf8\x6c\x73\x06\x9a\xac\xe5\x77\x62\x6a\x85\x63\x53\x6f\x60\x50\x42\xcf\x7c\xaa\xf6\xfc\x8e\x3b\x54\x5b\x77\x41\x4d\xf8\xd9\xf6\x49\xb9\x9e\xe4\x25\x41\xda\x38\xc3\xaa\xe6\x27\x20\x78\x45\xb8\xf4\x14\xa8\x07\x4d\x70\x86\x8a\x5c\x0b\x07\xb0\x70\xc3\xc6\x53\xbe\x04\x07\x6b\x83\xca\xd7\xb0\x30\x5d\x95\x00\xaa\x44\x45\x5c\xb8\x60\xdc\xc7\x64\x00\xaf\x93\xc3\xd2\xef\xb4\x2a\xe0\x56\xf1\x42\x8b\x65\xf1\x22\xe1\xc7\xb9\x58\x4d\x81\x4d\x50\xac\x72\xef\xdb"}, +{{0x67,0xcf,0x27,0x15,0x52,0x87,0xbe,0x6b,0xfa,0xb6,0x62,0x15,0xe0,0x17,0xc3,0x46,0x63,0x22,0xf2,0x1e,0x6e,0xb1,0x40,0xbe,0x4f,0x1b,0xde,0xcf,0x55,0xab,0xfd,0xc1,},{0xd0,0x70,0xaa,0xb2,0x95,0xa8,0xaf,0x93,0x57,0x27,0xc3,0xbe,0x44,0x2b,0x25,0x1d,0xb9,0xe7,0x74,0xd2,0xf4,0x4b,0x3c,0x24,0x24,0xc5,0x2f,0xc8,0x96,0x56,0xe1,0x69,},{0xc9,0x34,0xa3,0xa1,0xaa,0xab,0x78,0xd9,0x26,0x9d,0x1e,0x9d,0x13,0x39,0x2f,0x72,0xc6,0x37,0xbc,0x5d,0xe5,0x4f,0x04,0x69,0x1e,0xfc,0x29,0xd4,0x73,0xb4,0x75,0x02,0x5d,0x8d,0x8f,0xe3,0xc5,0x23,0xd2,0xd2,0x9c,0x41,0xc5,0xf3,0xde,0xc6,0xca,0x38,0xce,0x6d,0x68,0xd7,0xff,0x09,0xb6,0x13,0x5b,0xa2,0x4d,0x0d,0x32,0xcc,0x15,0x02,},"\x0f\xf0\x52\x97\x03\x1c\x89\x27\x74\xcb\x2c\x01\xe8\xca\x60\xdd\xd0\xce\xac\xc0\xb8\xd5\x91\xa8\x91\xe3\x3b\x19\xe1\xbe\x9e\x36\x3b\xc6\x42\x0d\x6f\x52\x9f\x04\x84\x0b\x3b\x08\x85\x3c\x83\x5a\x03\xe0\x36\x97\x8b\x04\xa4\xf9\xec\x6b\xe4\xae\xf3\x31\x95\x61\x90\x99\x6d\xea\x27\x26\x19\xf1\x68\x6d\x33\xbe\xf0\x3d\xbc\x08\x5a\x92\x3a\x0f\x11\x5b\x78\xf6\x53\xfe\xeb\x60\xbb\x9e\x45\xf3\x4f\xb8\xbe\x5a\x4c\xbb\x64\x8c\x7d\x29\x95\x6f\x0d\x0e\x96\xbd\xd3\xc8\xd0\x64\x97\x20\x62\x4c\xbc\x20\x79\xe8\x4f\xd6\xd0\x10\x24\x11\x24\x09\x84\x59\xf1\x2a\xf2\x99\x1d\x38\x28\x77\x0f\x50\xb1\x04\xea\x6e\x5f\x51\xfd\xad\x30\xa9\xb8\x07\x9d\x21\x59\xe4\x6d\x64\xaf\x91\xd0\x7c\x10\xed\x19\x81\x4d\xf2\xaf\xe6\x60\xd7\xd8\xf2\x40\x35\x34\xe9\x2c\x62\xe1\xea\x6d\x68\x82\x03\xbc\xa3\xd9\x7c\x2a\xfd\xa8\x3b\x25\x55\x20\xff\xe9\x2a\x33\x62\x57\x72\x51\x3b\x1f\xe3\x4f\xaf\xe3\x2b\x6a\x9b\x8c\xf9\x94\xdf\x7e\x63\x4e\x68\x65\x91\xe5\xf0\x07\x3a\xba\xbc\x64\xa8\x92\x10\xba\x53\xa4\x99\x1c\x11\x55\x7e\x03\x34\xe6\xc6\xa5\x03\x6c\x64\x2a\x31\x8f\x22\x95\x11\x71\x39\x08\x5f\xb3\x40\x75\x64\x70\x06\x75\x8e\x32\xbc\x00\xad\x10\x9f\xe8\x03\xf7\xee\x9f\x5e\xc2\xaf\x4d\x25\xc3\x07\x0a\xbc\x51\xcf\x4d\x78\xe1\x3a\x7c\xe2\x83\xd4\xfb\x4e\xb4\x1d\x3e\x8c\xe9\x02\x38\x50\x0a\xe0\xce\xda\x32\x0e\xc5\x92\x2e\xfa\x10\xb9\x03\x74\x8e\x1e\x85\x3a\x37\x29\xd2\x4c\x10\x54\x39\xdf\x2f\x70\x00\x12\x3d\xb9\xb2\xc0\x15\x33\xbb\xf0\xd0\x28\xeb\xb2\xfc\x00\xdc\xe3\x8a\xd0\x63\x28\xee\x9e\xcd\x84\x9a\x6e\xfc\x3a\xe8\x84\xef\x69\x33\xcf\xeb\xed\x05\x5b\xb2\x96\x8a\x0b\x06\x76\xb5\x72\x92\x16\x17\x8c\x75\x19\xef\x07\x88\x59\x3f\xc0\xdc\xff\x50\xd7\xe0\xb1\xeb\xb3\xcf\x49\xbb\xd1\xbf\xa5\xc3\x0e\xa7\xb8\x8c\x36\xe1\xa1\x59\x3a\xef\x0b\xb3\xf9\xe2\x09\x1c\x85\x89\xf7\x41\x4b\xee\xd8\xdf\x46\x6a\x2e\xd8\x7b\x2c\xb5\xf3\x5f\x1d\x31\x24\x6c\xeb\x96\x86\x09\x25\x36\x15\xd7\x80\x43\x51\x73\x79\xee\x69\x74\xa6\x69\xcb\x48\xda\x6a\xc2\xf9\x6d\x70\x0b\x7e\x44\xa4\x35\xcf\xef\xec\x40\x2a\x1e\x31\x10\xe7\x69\x81\x92\x4f\x26\x01\xc0\x1d\xc0\x35\x46\xfd\x4f\x51\x16\x49\x30\x2f\x06\x33\xdf\xbd\x25\x65\x1c\x5a\x59\x9c\x90\x95\x44\x89\xc7\x6a\x65\xec\x05\xa7\xe4\xcc\x74\x61\x6c\xe2\x56\x01\xcc\x37\xb8\x04\xe1\xf0\xbc\xc8\x65\x10\x23\xb1\x2e\x13\x56\x84\x41\xe8\xb8\xef\x4c\x30\x5f\xcd\xad\x3d\x2b\x13\xfa\x08\x03\x24\xb2\xfd\x6b\x61\x99\x8c\xf8\x64\xb6\x58\xbc\x7f\xef\xcc\x48\xa5\xa7\x68\x1d\x7c\x86\x6c\x34\x2c\x7f\x5d\x6c\xf1\x08\x81\x52\x2c\xc7\x10\x25\x7d\x25\xa4\xc1\xe3\x52\xd2\x70\xe9\x02\x08\x2a\xb9\x54\x1d\x59\x00\xce\xff\xa0\x91\x4b\x16\xb5\x5e\x0d\xd3\x78\x6e\x98\xd4\x17\x20\x87\x5a\x14\x8e\xb4\xab\xdb\x01\x53\x85\x66\x79\xfb\x98\xc0\xec\x48\x5e\x5f\x45\x8d\x63\x5b\x78\x61\xa2\xb3\xa8\xba\x5e\xc2\xc1\x44\x4d\x35\x39\x80\x20\x0e\x5e\x07\x18\x08\x85\x4a\x26\x8c\xc7\x6c\x60\x5c\x94\xf3\x73\x29\xc3\x61\x87\xa4\x1f\xdd\xf9\x2a\xab\xdb\x49\x96\xa0\xe1\x0b\x31\x55\x26\xaf\xea\xc8\x0e\xb2\xfa\x32\xaf\x78\x6a\x34\x31\x6b\x36\x11\x1e\xe9\x35\x21\x08\x14\x4d\x70\xf7\xd1\x72\x3b\x32\xf4\xdb\xaa\x82\x20\x13\x53\x41\x1d\x65\x77\x13\xe5\x5e\x35\xdf\x78\x58\x0b\x1b\xc0\x86\x80\xf0\x15\x9f\xa1\x16\xfa\xf4\x63\x56\x6a\xaf\xe8\xae\xa6\x98\x57\xe7\x2e\x44\xac\x80\x9a\xc4\x3f\x5c\x45\x93\x9d\x85\xa1\xa5\xf4\xa3\x70\xa1\x89\x96\xc8\x51\x4a\x46\xf3\x43\x71\xef\x9e\x5f\xb2\x04\x42\x2c\x93\x4a\x1d\x29\x3d\x10\x1b\x8c\x16\xf9\x9c\xc0\x73\xea\x36\x6a\x13\xa4\x5c\x43\x7d\x62\x0d\x13\x2b\x74\x40\x9c\xbf\x8b\x9c\x07\x5b\x41\x63\xf7\x26\xaa\x67\xe5\x09\xa2\x48\x74\xfc\x1b\x1f\xb6\xfb\x7c\x73\x55\x15\x9c\x02\xaa\x13\xe6\x4b\xad\xf1\x50\x35\x6b\x18\x41\xb3\x21\xf8\x04\x1e\x13\xed\x77\xe8\x46\x1c\xfb\xb8\xe8\x28\x48\x8b\xf5\x17\xa5\xd2\x9f\xf8\x2e\x73\x67\x48\x0a\x8e\xdd\xde\xb5\x35\x0e\x7a\x83\x42\x3b\xd0\xb1\xc5\x5f\x7b\xb4\x24\xca\x04\xc2\x05\x72\x3c\xd5\x40\x56\x71\xe7\x33\xf3\x91\x60\x0a"}, +{{0x18,0xc2,0x1c,0x0d,0x0d,0xe1,0x3d,0x4c,0x64,0x49,0x7e,0xf0,0x26,0x0d,0x66,0xcf,0xd3,0x42,0x16,0x98,0x1a,0x1b,0x49,0x39,0x1a,0xe5,0xcb,0x0e,0x41,0x43,0x6e,0x9f,},{0xf7,0xd4,0xdd,0x1e,0x05,0x9c,0x36,0xf6,0xd1,0x21,0xc0,0xaf,0xfe,0xb2,0x1f,0x0c,0x57,0x2b,0x45,0x99,0x2f,0x84,0x94,0x8b,0x09,0xaa,0xfb,0xcd,0x86,0xbb,0x53,0x5c,},{0xc9,0xc0,0x99,0xe2,0x1d,0x09,0x5a,0xfa,0xdd,0x4e,0x71,0xc9,0xab,0xf6,0xb7,0x08,0x33,0x24,0x77,0x62,0x25,0xb5,0x87,0xb6,0x0a,0x0e,0x60,0x92,0xec,0xb3,0xd3,0x3c,0xff,0x39,0xc6,0x7d,0x34,0x77,0x6a,0xe9,0x9d,0xda,0x75,0x4a,0x3c,0x2b,0x3f,0x78,0x11,0x35,0xa3,0x8c,0x78,0xed,0x64,0x55,0xaa,0xf0,0xae,0x0c,0x31,0x3b,0x62,0x05,},"\x68\xab\xca\x7c\x16\x6a\xfe\x06\x3e\x47\x7b\x80\xe3\x7d\xb2\x24\xe1\xa2\x35\xde\x8f\xcd\xeb\x7f\x42\x7a\xf6\x7e\x00\x12\x47\xcc\x5e\x05\x71\x82\xfd\x9b\x6d\xb8\xba\xba\xa6\x58\xcf\x3b\x3f\xe4\xb0\x76\x3b\xf8\x8d\x67\x31\x1b\x11\x90\xbe\x83\x40\x18\xcf\x57\xa3\x32\x92\x24\x13\x76\x46\x20\xac\xe0\x54\x45\xee\x01\x9a\x06\xdf\xf9\x8b\x23\x89\x79\xad\x6d\x30\x90\x1b\xef\xa3\xc6\x4f\x6b\xd8\xc6\xeb\x09\x2c\x2e\x62\x84\x13\x88\xfd\x8c\x4e\x84\x19\xe2\x77\x89\x84\x89\x67\x37\xed\x90\xa2\xcd\xb2\x19\x96\xae\xf7\xc2\x16\x38\xd6\xcb\xe6\x80\x32\x2d\x08\x99\x65\x97\xa9\xe3\x03\xf6\xf5\xf4\x79\x40\xf8\xc5\xba\x5f\x5f\x76\x38\x3e\x7e\x18\x06\x4a\x3d\x2d\xff\x5f\xdf\x95\xe9\x0c\x5e\xb3\x0f\x4d\x8d\x45\x9e\xe1\xd5\x06\xa8\xcd\x29\xcd\xc6\x9b\x67\x54\x96\x3b\x84\xd6\x74\x94\xb3\x53\x05\xd1\x0d\x12\xb9\x48\x74\x17\xb2\xce\x28\xad\xcb\x10\xb6\x5c\xc9\x31\xfb\x33\x81\xae\x02\xe7\xaf\x79\xa0\x2b\xf9\x9e\x25\x8a\x56\x36\x10\x90\xe0\xb7\x12\x22\xb3\xac\x60\xbf\x2f\xb7\xba\x83\x2d\x03\x4f\x5b\x6b\xc6\xfa\x66\x3a\xe7\x41\xf7\x6d\x97\xc1\xac\x32\xbc\xb7\x41\x15\x07\xd5\x18\xd2\xf6\x05\x4b\x57\x83\x28\xc5\xf6\x7f\x75\x8a\xc0\x1b\xfe\x6f\x4d\x35\x90\x0f\x50\xa5\xdc\xd3\x0d\x2f\x92\x61\xb6\xbb\xec\x4c\x1d\x1f\xc1\x8d\x2a\x7e\x70\xc4\xd3\x6c\x21\xfa\xf8\xcf\x94\xa5\x87\xc3\xa0\xd1\xa9\xcd\xe7\x83\x1a\xe6\x26\x77\x54\x68\xdd\xcd\x40\xa8\xba\x18\xf4\x2b\x34\x18\x8d\xe5\x74\x1e\x1b\xe8\x30\x7b\x10\x84\x58\x65\x15\xec\x01\x5e\x4e\x37\x1d\x29\x44\x3a\x40\xb0\xc0\x69\xc6\x41\xd8\xce\xe5\xe4\x61\x18\x62\x98\x7c\x3e\x35\x6b\x12\x93\xb0\x51\x8b\x4a\x4c\x8e\xa9\x7f\xc5\xa4\xdb\x1f\x01\x29\xab\xee\x72\xfb\x80\x92\xea\x35\xc2\xda\xb6\x75\x73\x85\x02\x07\xb8\xe8\x27\x18\x99\x9a\xd9\x9c\x4c\x83\x9e\xac\x14\x63\x6b\xd5\xe4\xd8\x43\x6a\x27\x0d\xd9\x0b\x8e\x32\x13\x02\xe5\x2a\x92\xd8\x91\xff\x18\x91\x54\x2a\xe2\xca\xa0\xd6\x6e\x0f\x66\x1e\xae\x37\xb2\x5b\x08\xbb\x2e\x0e\xee\xc4\x83\x80\x09\x77\x8c\xd5\x25\x98\x43\x80\x98\x3b\x2b\xaa\xdd\x71\x02\xa1\xe3\x56\x73\x4e\x41\xd7\x61\x83\x82\x9e\xa9\xab\x82\x44\xc3\x36\x59\x7c\xa2\xd6\x79\x88\xf2\x81\x43\x84\x67\xe4\x53\xf5\x62\xc6\x7b\x22\xd0\xa4\xdd\x9f\xcb\x46\xa5\xf8\x0d\x29\x9d\xb5\xf0\x1f\x59\x16\x0a\x19\xd7\x4c\x64\x4f\xa5\xa9\x40\xe3\x2c\x9d\x8d\x98\x3b\xab\x7e\xfb\x0d\x7c\x7d\xa4\xe3\xfd\xa1\xcd\x0d\x18\xa4\x55\x8e\xb9\xfe\x46\x40\x8a\xab\x50\x85\x91\x2b\xf2\xf4\x6a\xb6\x3a\x93\x54\xf9\x02\x7c\x93\x69\x12\x23\xff\xaa\xb8\x46\x3b\xac\x4c\x4b\xc3\xb1\x1a\xbc\x46\xba\x68\x71\x7c\x91\x78\x0d\x3f\x30\x47\x0d\xbd\xd8\x8b\x37\x80\xa1\x94\xc8\xa4\x0a\x2c\x0a\x81\xa4\xd5\x6d\xec\x2d\x89\x62\xc3\x4d\x2a\xb7\x33\x69\x02\x8e\x1b\xfe\xaa\x6b\xb5\x82\x41\xff\x4f\x89\x8f\x80\xad\x3b\xb1\xc6\x91\xb8\x64\x7f\x2c\x69\x83\x95\x4c\x1c\x77\x95\x74\x58\xee\xbf\x1c\x50\x55\xc3\x16\x93\xab\xce\xd0\x53\x84\x73\x5a\x4f\x74\x19\x68\xbd\x6a\xc3\x15\x65\xcf\xee\x71\xc8\x84\xc1\xe2\x9e\x9e\x7a\xe0\xf7\xec\xd0\x4d\x46\x3b\x1d\xc3\x89\xc3\x60\x37\xe8\x14\x58\xdc\xec\x61\xd0\x76\x40\x32\xdd\x58\x9b\x92\xaf\xda\x2f\xc9\x02\x8f\x41\xab\x53\xcc\xa2\xd0\x4e\xc6\xa9\x56\x59\x55\xcb\xcf\x1a\x34\x63\x98\x9c\x71\x39\xbb\x90\x2a\x59\x21\xe8\xb2\xc9\x9c\x48\xe1\x37\x11\xf0\xbc\xc3\x99\x25\x95\x16\xc8\x1a\xe9\x42\xa6\x79\xd4\xba\x33\x97\x9e\xb1\x2f\xcd\x28\x60\x60\x2e\x47\x24\xb1\x33\x0f\x1c\xd2\x57\xb5\xb2\x89\x1d\xae\xe8\xef\x4c\x92\xfc\x3b\xfd\xb3\x4e\x53\x2d\x58\x70\xf3\x80\x59\x86\xac\x97\xb5\x03\xfd\x85\x87\x35\x48\xe3\x09\x50\x00\x0f\x8a\x70\xbe\x51\xfa\x75\x76\x03\x50\x1f\x2d\x30\xe8\x52\xef\xea\xc4\x82\x68\x62\xae\xd7\xf6\xd2\x0c\x9a\x8c\x8d\xbe\x36\x2d\xfe\xe4\x18\x93\xf2\x7e\x6f\xd5\xe9\x1d\x0e\x7e\x3d\x4f\xd8\x15\x5f\x44\xfd\x8e\xf1\x7a\xf1\x4a\x84\x8d\x44\xa8\x76\x31\xae\xee\x75\x14\x62\xb2\xa5\x40\x87\x06\x8d\xae\xab\x3e\xa3\x28\x9e\xce\x62\x12\xb3\xb5\x2c\xe7\xa8\x88\x6d\xf2\xa7\x27\xb7\x2a\x57\x0c\x2f\xb9\xc5\x03\x41"}, +{{0xdb,0x9a,0xae,0xe1,0x98,0xcd,0x26,0xa5,0x2b,0x11,0x81,0xfa,0x3f,0xd9,0x2a,0xbe,0x42,0x5e,0x66,0x6d,0x89,0x0b,0xf9,0x69,0x46,0x7d,0xd2,0xce,0x28,0x0e,0xd4,0xa7,},{0x3c,0x89,0x7c,0xaf,0xe2,0xb4,0x99,0xec,0xb2,0xe1,0xdd,0x01,0xea,0x55,0xf3,0xfc,0x88,0xf6,0x8c,0x25,0xb6,0x4a,0x63,0x6b,0x31,0xa1,0xfd,0x1c,0x78,0xf3,0x7f,0x3f,},{0xb2,0xe3,0xd9,0xc5,0xd0,0xff,0x32,0x99,0x96,0xbc,0x89,0xd2,0x6f,0xb3,0xac,0x12,0x6b,0xde,0xd3,0x13,0xcb,0xf8,0xdf,0x86,0x71,0x86,0x38,0xc1,0x99,0xe0,0x57,0x27,0x3d,0x09,0xeb,0x16,0x3c,0x6c,0x18,0x1f,0xd8,0xbc,0xe5,0x1f,0x72,0xd4,0xd9,0xd2,0xe8,0x4a,0xbb,0xe0,0x83,0x30,0x77,0x3b,0x9f,0xcc,0x21,0x66,0xf1,0x40,0xd6,0x0e,},"\x47\xfb\x62\x15\x61\xf8\xb7\xee\xce\xc6\x03\x3f\x2b\xcb\x6f\x43\xac\x68\xc9\x58\xdf\xd2\x65\x6f\x52\xa0\xc2\x9b\x4a\xcd\x44\xf4\x30\x4c\x6b\xf7\x7e\xea\xa0\xc5\xf6\xd3\xb2\x2d\xb1\x96\x99\xc3\xdc\xde\xde\x69\x8a\xbd\xe6\x23\xec\x4b\x2b\x90\x91\x0c\x80\xac\x3a\xf3\x9c\x55\x0b\x6d\xd4\x09\xe6\x3d\x77\x70\x66\x55\xa9\x19\x9c\xb5\xc0\x25\x8f\x5b\xa3\x82\x85\xff\xdc\x64\xb8\xa8\xf3\x73\xd1\xfb\x29\xba\x87\xf8\x4d\xdf\x5f\x34\xd8\xf1\x40\xbb\xc1\x7b\x39\x61\x68\x2d\xf5\xd0\xa8\xf9\x10\x2e\x37\x9a\x99\x98\x13\x9d\xfe\x40\xab\x8c\xe7\x53\xbf\x56\x26\x10\x82\x37\x77\x1a\x7d\x8e\x10\x9e\x9e\x0a\xfe\x9b\x66\xd0\x42\x09\x42\xe1\x63\xa4\xf3\xc0\x3f\x71\x81\x3e\xe0\x78\xbd\x09\x0a\xc3\xd0\x77\x2e\x26\x22\xc2\x59\xe6\x82\x55\x2c\x75\xb0\x8d\xd0\x55\xa4\xa5\xeb\x5e\x60\x94\x40\xbc\xd3\xf3\xa6\xfe\xb8\x76\xfd\x16\x92\x15\x20\xc6\xcb\x68\x84\x71\x0d\x2e\x15\xcd\xad\x6d\xaa\xee\xd9\x59\x62\xdd\xa2\x1c\x67\x88\xf7\x84\x91\x79\x17\x98\x2e\x1c\xcb\xb5\xfd\xd9\xbd\xc1\x76\x9d\xb6\xb6\xdb\x57\xca\x35\x4e\x01\xa1\x33\x9d\x8e\x77\xe9\xdb\xbb\x58\x12\xfb\xab\x6a\x14\xc5\x40\x85\xc0\x65\x95\x99\xf1\x50\xe2\x24\x72\x47\x0f\x1e\x5e\x67\x2c\x42\x5f\x37\x5f\x9e\x0d\x6e\x8d\x52\xfa\x17\xb7\xa8\xd7\xa4\xd7\xca\x3e\x12\xf4\xdb\x53\x83\x6a\xed\x2b\xeb\xd7\x45\x89\xba\xca\x8c\xe9\x10\x02\x91\xbf\xb7\xe4\x56\xdb\x7f\x2f\x0a\x84\xdc\x0a\x74\x88\x85\x13\x66\xa9\xa5\xfe\xa0\xe3\xef\xc7\x4b\x9c\xdd\x4b\xd9\x7b\x65\xab\xf3\x61\x39\x3c\xe1\x70\x3d\x85\x71\x80\x5e\xe6\x8a\x13\xd3\x65\x4f\x03\xdc\xec\xfb\x77\xa5\x34\x30\xd0\x94\x96\xad\x73\xec\x01\x75\x99\x57\xe5\x10\x46\xaa\x73\x96\xf5\x92\x33\x86\x50\x11\x7a\xc7\xb4\xdd\x35\x73\xeb\x53\xd9\xc9\xf9\xdf\xa6\x2e\x23\x69\xc7\x7a\xf9\xc0\xd4\x2f\x61\xba\xe7\x4b\x28\x7d\xdf\xa2\x7b\x7f\x1c\x1b\xe9\x88\x3a\x04\x46\x91\xd5\x6d\xc1\x37\x34\xad\x4e\xe3\xa3\x2a\x9f\x40\xe3\x28\xc5\x00\xd0\xfe\xd8\xea\x05\x10\xe9\x38\xf2\x75\x80\x04\x02\x2b\xca\xa6\x90\x2b\xda\x10\x14\xb8\xae\x33\x65\x27\x28\x29\xed\x94\xfa\xba\x63\xcb\x14\xa3\x6c\xf8\x13\x90\xec\xa8\x3f\xc1\xc6\x27\x17\x20\x13\x26\x1b\x39\x93\x77\x9a\xa0\x76\xa5\xc5\xd8\x1d\x90\xd2\x70\x62\xe1\xa6\xd9\x0b\x5c\xf1\x00\x5c\x70\x19\x17\xb7\xad\xac\x18\x0c\xb7\x5b\xbc\xe0\xf2\x7f\x2f\x18\x0e\x2c\xb9\x01\x40\xc1\x4c\xc6\x00\x9d\x2d\x41\xaa\xb1\xdb\x94\x18\xf9\x1d\x4c\xf3\x94\x00\x2c\xd7\x0a\xc9\xdc\x11\xce\x86\x53\x47\xfa\x3f\x56\xf8\x7c\x14\x9e\x2b\x17\xd2\xc7\x2b\x66\x3a\x58\xe3\x18\x7b\xb1\x9b\x9b\xac\x2d\x11\x48\x3b\xa1\x2f\x77\x0a\xc0\x4d\xc4\x6d\x38\x85\x18\xfa\x54\xdc\x15\x2e\x9a\x9d\xfb\xff\x14\xf1\x4c\x61\xcb\x37\x58\x97\xe3\x0c\x53\xe6\xde\x42\xd5\xe1\x40\x1d\xae\x1b\x22\xba\xaa\x0e\x8a\x41\xc6\xaf\x9d\x0e\x0b\x13\xa9\x1a\x23\xd9\xb7\xd5\x55\x20\x47\x02\x9a\x35\x21\x94\x6c\x71\x20\xd3\xd2\x58\xb3\xae\xfc\xf7\x54\xd1\x95\x94\x87\xa1\xfe\x77\x43\xac\x7e\x1c\xc8\x9e\x36\x8b\x19\x78\x09\xc3\xa2\x73\x17\xe0\xec\x48\xd5\x46\xdb\x1e\x21\xeb\x62\x9a\x29\xbc\x62\x47\xcd\xd4\xa1\x37\x14\x37\x56\x3e\xdd\x12\xfa\xea\x2c\x5c\xb7\x7e\xed\xed\xbf\xc5\x80\x08\xfa\xd1\xf6\x5a\xf3\x58\x43\xfa\x27\x4c\x73\x4e\x3f\xbb\xaa\x9c\xc5\x0d\x68\x37\x48\xb7\x5a\x48\x5f\x94\xd6\x30\xb0\x32\xa5\xf1\x06\x7d\x1d\xeb\x30\xe9\xd2\x21\x8c\x93\x5c\x98\x1d\x01\xc0\xc5\x47\xfd\x68\x41\x31\x36\xed\xf4\xc0\xc7\x70\x28\x6e\x82\x34\x42\xe1\xc5\x13\x65\x19\x29\x21\x3c\x12\x1c\x1d\xe7\x00\x98\x91\x41\xab\x4a\xf3\xb3\xfe\x74\x04\xb4\xd2\xa3\x8c\x53\x0b\xaf\xb4\x98\xe6\x49\x53\xce\x1c\x0f\xb7\xd3\x40\xe2\x11\x35\xbf\x8a\xfd\xd8\xdd\x65\xb1\xb1\x8c\xf1\xc8\xfb\x9f\x40\x2b\x26\x70\x40\x0b\x86\xdd\xaf\xb1\x84\xcc\x51\xd5\xfd\xa2\x73\xb8\x0c\x26\x52\x1f\x91\x2f\x35\x83\xb4\xae\x30\x1d\xae\x15\x1c\xb5\x5c\x75\x70\x3a\xad\xef\x03\x24\x15\x22\x7d\x53\xe3\x95\xdb\x6c\x15\x0a\x1e\xe8\x39\xad\x26\xba\xe5\x52\xe1\xab\x73\x62\x14\xdc\x04\xb0\xf3\xc4\x1b\x7c\xfb\xd0\x49\x68\x1b\xc8\x4c\x3d\x16\x53\x07\x68"}, +{{0xa8,0x04,0xc3,0x3b,0x4d,0x38,0xcb,0x3c,0xe3,0x1c,0xf3,0xba,0xc1,0x04,0x9e,0x0d,0x4e,0xc6,0x3a,0x1a,0x0b,0x7b,0x59,0xfd,0x8a,0x36,0xee,0x37,0x54,0x16,0x56,0xaa,},{0x60,0x72,0x25,0x6d,0x65,0x74,0xa2,0x93,0xbd,0x7c,0x22,0x1c,0x55,0x1c,0x32,0xcf,0x2f,0x77,0x15,0xe1,0x9e,0x43,0x3a,0x49,0xd9,0xb8,0xb0,0x49,0x0e,0x56,0xef,0x62,},{0xb1,0xb4,0x4a,0x14,0x2a,0x7c,0x4c,0x3d,0x0b,0xf4,0x66,0x1e,0xda,0xc5,0xb7,0x67,0x00,0x57,0x26,0xc1,0x4a,0x27,0x69,0xb7,0xc2,0x14,0xfb,0x58,0x73,0x7e,0xc2,0xe4,0xbc,0x51,0xc3,0xa1,0x95,0xd2,0xba,0x1b,0x74,0xa5,0x4e,0xff,0x4c,0x33,0xa9,0x0f,0x41,0xcc,0xde,0xfa,0x9e,0x93,0x65,0xfd,0xe8,0xdd,0x85,0x9f,0xd3,0x97,0x8c,0x0a,},"\xdb\xfe\x30\x7f\x2a\xae\x9e\x07\xec\x7c\x4b\x68\x21\x06\xd2\xc9\x36\x7b\x0c\x4a\xaa\x58\xae\x80\x4e\x0a\x39\x04\x75\x4e\x6c\xf8\xfe\xe7\x3c\xf9\xe2\xd4\x5d\x02\x89\xe5\x07\x82\x93\xdf\xc4\x69\xd4\x6e\xa6\x70\x26\xc5\xaa\x69\x2d\x2f\x2c\x9f\xb4\xec\x57\xcd\xab\x4c\x04\x3f\xf9\xae\x61\x85\xf2\x7a\x70\x44\x54\xe5\xf5\x39\x50\xaa\xbd\x25\xc9\x91\x04\x74\xd4\x5a\xf8\x83\x68\x62\x72\x3e\x0e\x6a\x27\x82\x3d\x82\xbc\xbb\x68\xa9\x60\x52\x42\x2a\x18\x19\x51\x2e\x3b\x43\x40\x8c\xf4\x89\x57\xad\x6a\xe2\x35\xb7\x23\x3d\xf1\x82\x84\x74\x91\x53\xdf\xa5\x7d\xe3\x50\x74\xa3\x0e\xdf\xab\x8a\x56\xdf\x28\xab\x2e\x29\x40\x30\x6c\x22\x1a\xa5\x54\x90\xcc\x66\x4e\x14\x68\x3f\x30\xee\x61\x5e\x2d\x93\xfd\xf9\x71\xf5\x96\x66\x34\x65\x84\x3b\x3a\xdd\x63\x92\xba\x33\x90\x31\x1e\xf8\xdc\x59\xf2\x51\x44\x5d\x66\x9e\x10\xa0\x06\x19\x91\xe1\x13\x56\x19\x23\xaa\x21\x52\x44\x46\x3d\x82\x64\x19\x9a\xc5\x88\x92\x4e\x23\x1e\x84\x19\xd8\x68\x5f\x33\x8e\x59\x9b\x5f\x40\xbf\x9b\xd1\xae\xce\x77\x25\x35\xbb\xbc\xb8\xf6\x88\x1c\x2e\x80\x04\x91\xab\x3b\x57\xb4\x4b\x8a\xe4\x3a\xeb\x5c\x4a\xe5\xe7\xed\xeb\x22\x8f\xed\xc9\xf6\xb9\xca\xde\xa1\x76\xe1\x34\x93\x6d\xed\x60\xaf\x1c\x22\x87\x34\xfb\x00\x57\x0f\x23\x74\xbb\xbf\xa1\xbb\x17\x07\x85\x80\x5d\x6b\x6c\x70\x1e\x82\x09\x52\xea\xe4\x5b\x8c\x23\x66\x11\x3a\x1d\xfb\x2e\x35\x85\x2a\xf4\x19\xb7\x54\xf9\xcf\x7a\x08\x1c\x3d\xde\x6c\x80\x53\xbf\x1c\xe0\xc8\x53\x39\xd5\x69\x9c\x42\x24\x76\xfc\x21\xf2\x6c\xe7\x5d\x2a\x7f\xed\x09\xfc\x0f\x41\x75\x78\x98\x47\xd8\x76\xc5\x1a\xa4\xe0\xbf\x7c\xe8\x42\xb8\x30\x8d\xc7\xa2\x8c\x82\x39\x52\x07\x14\xdc\x23\x31\x36\xe0\x9f\x55\x7c\x7e\xf3\xe0\xf8\x3b\xad\x63\xcb\x28\xac\x61\x6d\x39\x28\xf3\x83\x7d\xce\x1d\xd5\x8a\xcb\x8d\xdb\xc7\x2e\x82\x2d\xee\xe4\x5f\x00\x77\x6a\xcc\x88\xe0\x0c\xd3\xa9\xdb\x48\x6d\x92\xd5\x35\xa5\x7a\x0f\xdc\x4f\x90\x3b\x62\xe5\x17\x22\x1c\x30\x8c\xba\x2e\x30\xff\xe7\xb9\x19\x37\xa9\x94\x17\x72\x1f\x56\xfe\x6d\xf4\x48\x40\xe9\xe4\x11\x36\x92\x9c\x0c\xa3\xdc\x28\xdd\xf2\x37\x9e\x4d\xcf\xde\x83\x72\x3e\x2d\x4c\x9e\x23\x29\x9c\x05\x6a\xfb\x31\xd3\xe7\x0d\x08\x5d\x0a\x31\x2c\x5c\xd5\x70\xb6\x99\xde\xa8\x71\x74\x58\x53\x13\x48\xc9\x6f\x6e\xb5\x2d\x7e\xe6\x1d\x56\x60\xf6\x5e\x90\x9a\x14\xce\x10\x33\xdc\x85\x3f\x2f\x25\xd0\x9c\xf4\xe4\x0d\x07\xef\xf7\x2e\x15\xa3\x90\x56\x4a\x2b\xe3\xc0\x42\xd8\x9a\x68\x66\x0a\x97\xff\xac\xec\x49\x67\xa4\xb6\x18\x71\x2d\x70\x60\x75\x65\x20\xc2\x9e\xe8\xd9\x22\x0a\xd8\x61\x5c\x4f\xcf\x39\x69\xbd\x3b\x2e\x09\x47\xe1\xf0\xbe\x7e\x2d\x80\xe0\xa6\x14\x80\xc3\x16\x6d\xb5\x58\x22\x18\xbb\x0a\x8b\xe9\x84\x8e\xfd\x41\xb6\xce\x0c\xd7\x95\xc4\x86\xab\xb6\x72\x10\xbe\xb6\x0c\xd0\x78\xb4\x6a\xeb\x7f\x4f\x48\x50\x31\x90\x2b\xcd\x71\x31\xe0\x0b\x70\x35\xaa\x2d\x43\xfe\xe0\x63\xf7\xf3\x0b\xd5\x70\xda\x1d\xbb\x65\xc0\xca\x92\xa4\x81\x26\x32\xe4\x32\x77\x85\x53\xe3\x5e\x85\x6c\xaa\x82\x18\x22\x1f\xd6\x31\x6a\xb0\x86\x91\x73\xb3\x84\x09\xbc\xef\xe6\xd2\xdb\x92\x10\xf9\x02\x41\x73\xb6\x6d\xbb\x92\x67\x7c\xbc\x71\xc8\xa1\xcd\x58\x3f\xa6\xf3\x54\xd3\xc9\x3f\xa8\xb1\x6c\x71\x37\x4f\x25\xa0\x0c\x33\x2f\x85\xa8\xbe\xfd\x54\x03\x88\xfb\x50\xdb\x9f\x5d\x96\xe4\xe4\xe6\x98\x83\x3c\xe3\xd6\x3c\x10\xb8\xee\xc7\x0a\x24\x3b\x90\x15\xdb\x45\x94\x31\xb6\x2f\x56\x68\xbb\xa6\x0f\x07\x04\xf6\xbd\xfe\x95\x46\xea\x47\x5c\xef\x2e\xbc\xcb\xa4\xb7\x68\x08\x48\xe8\x2b\xef\xf5\x85\x4e\x49\xf6\x5b\xb7\x73\xa4\x92\x2e\x90\xf9\xb8\xaf\xc7\xcf\x81\x87\x30\x58\x8e\xd5\xaa\x7b\x39\x98\x26\xaa\xdd\x54\x37\x2f\xcb\x76\x14\x58\xb6\x4d\xe6\x68\x57\xf4\xad\xac\xd4\xc3\x29\x00\xcb\x77\x13\x6a\x53\x5d\x7b\xbb\xb5\x54\x59\x7a\xec\xf3\x9f\xf6\x98\xb4\x5e\x6a\x21\x8d\xf1\xd2\xab\xe6\x15\xeb\x8d\x9e\x18\x24\xc0\xbe\xcc\xe9\x07\x67\x89\x9e\xbf\xd2\xc7\x30\x14\x4b\x32\xc7\x46\x04\xc0\xe5\x3e\x25\x05\xbb\x15\xd2\x80\x07\xa8\x7b\x99\x31\xd6\xee\xc0\xa6\xcb\x5b\x0f\x96\xd3\x19\x4b\x24\x23"}, +{{0xf8,0x20,0xe6,0xf2,0x4a,0x84,0x18,0xb6,0xac,0xda,0x16,0x5f,0x29,0xa3,0x60,0xf7,0x67,0xcd,0xed,0xde,0x8f,0x64,0xd7,0x68,0xb9,0x5f,0xc2,0xa5,0xf3,0xf4,0x04,0xe7,},{0x79,0xc4,0xb2,0x63,0xb2,0xe5,0x8f,0x67,0x86,0x28,0xd4,0xea,0x82,0xb1,0x75,0xac,0xa2,0x30,0xb9,0xa2,0x02,0x85,0xc8,0x28,0xf9,0x4e,0x1f,0xfd,0x63,0xd7,0x5b,0x23,},{0xf9,0xfd,0x72,0xf3,0x21,0xca,0x21,0x33,0xbf,0x85,0x85,0x90,0x8d,0x9c,0xa7,0xb8,0xe3,0x36,0x22,0x7e,0x3f,0xfb,0x37,0x49,0xa1,0xfb,0xe8,0xc9,0xb1,0xe5,0xd5,0x0e,0xf0,0x1f,0x9d,0xb5,0xf0,0xd2,0xa7,0xc7,0xc1,0x39,0x9b,0x97,0xc9,0x04,0x4e,0x1b,0xc1,0xad,0xc3,0x2b,0x8b,0xea,0x46,0xda,0xd7,0xb8,0x10,0x26,0x46,0x96,0x03,0x03,},"\xab\x6b\xd4\x5b\xb0\x6d\xfb\x90\x69\x11\x8f\xf9\x98\xf3\xbd\x39\x3e\xa8\xe9\x44\x97\x9e\x89\xe0\x49\xf2\x50\x5c\xd8\x93\x1b\x93\x08\x6b\x7e\x9d\x8e\xe7\x64\xe9\xb4\x47\xea\x4e\xa1\x21\x38\xbb\x45\x27\x5a\x21\xa1\x98\x43\xf7\x5d\xc5\x42\x1d\x61\xff\xd8\x61\x83\x8e\x58\x33\x82\x5d\x67\x16\x2f\x32\x59\xc2\x64\x47\xbe\x51\xdc\x18\x02\xef\x5a\x04\xba\x73\xb7\x83\x93\x57\x06\xab\xb4\x2c\x51\x3b\x65\xf2\xbb\xc4\x4f\x83\xda\x10\x61\x24\x2f\x2d\x5e\x51\x98\xf3\x8c\x10\x71\x7a\x86\xa3\xa1\x97\xe7\xcd\x90\x34\xf6\x36\x11\x44\x99\x03\x72\x77\xac\xb4\x72\x2c\x06\xa9\x1c\xb2\xf6\x5e\x21\xeb\x8d\x22\xd3\x6a\xd7\x3b\x42\x65\xf7\xa7\x94\x7e\x00\xe7\x22\xbd\xa6\x70\x43\xcd\x12\x81\xbc\xd8\x7e\x76\x3f\xc9\x7b\x54\xc8\xf8\x68\x36\xcd\xbf\x08\xc9\xa1\xf7\x00\xf4\xea\xed\x9e\xa5\x9a\x6f\xc1\xbc\x0d\xf8\xc9\xec\x1f\xc2\x97\x7c\xad\x60\xf9\x78\xab\xc0\xc8\x38\x1a\xa9\xfb\x06\x0e\x3f\x99\x37\x8a\x51\xb2\xd9\xaf\xbe\xf3\x58\xd5\x51\x62\xa3\x89\x22\xeb\xb8\x7d\x2a\x3e\x0f\x0f\x40\x00\xb1\xc3\x9b\x15\x02\xe9\x59\x45\xe8\xac\x9f\x4a\x3e\xa7\xc9\xdd\xb5\x81\xa5\xec\x06\xc0\x0b\xa8\x7a\x73\x70\x84\xb3\x84\xfa\xba\x09\xc8\x48\x71\xdd\xd6\x7d\xc1\xbe\xbb\x2f\x7f\xbd\x94\xa5\x59\x7d\x01\x9f\xe6\x29\xe5\xbf\x12\xbe\xa2\xe3\x3c\xa8\x4c\x68\x0d\xc5\xa3\x98\x9b\xbf\x3a\xf9\xee\xec\xe8\xab\x8f\xc8\x61\xe3\xb8\xbf\xc1\xe6\x7e\x2a\xee\x32\x6b\x37\xfb\x9b\x51\xcf\xa0\xb5\xf5\xfc\x16\x00\x69\xb4\x50\xb7\x04\xe0\xfa\xb7\xfb\x6c\x5a\xb3\xc4\x0b\x8f\x0b\x3d\x09\x30\xb9\x11\x2d\x64\xb9\xda\xca\xb4\xdd\x87\x5f\x29\xd8\xc5\x8c\x5d\x20\x53\xad\x91\x48\xff\xde\x22\xd9\x0b\xc0\xd5\x0f\x5d\xec\xa6\x8d\x3e\xa2\x5c\x5b\x4c\x76\x88\x87\x1c\x0c\x77\xdb\xce\xea\xcb\xd0\xa4\x22\x9f\x49\x70\xec\x87\xb3\x44\x99\xe2\x78\x30\x3c\x06\x69\x4c\x30\xac\x68\x52\x4d\x11\xb1\x72\x79\x4b\x48\x12\x73\xa5\xda\xc4\x61\x22\xd2\x47\x20\x95\xa5\x63\xa4\x35\xd1\x85\xd5\xe9\x1d\xa7\x26\xe7\x45\x92\x99\x9c\xda\xc6\x88\xa3\x3f\x38\xf7\xc0\x35\x58\x8f\x62\x5d\xc6\xac\x73\xd0\x04\x7a\xb3\xd6\xd1\x2f\x1a\xe3\x3d\x8b\x62\xd6\xd6\xc6\xca\xcf\xf0\xbd\xd8\x94\xb5\x7e\x31\x89\x12\xac\x0c\xf4\xa5\x34\x76\x2b\x2f\x6d\x26\x3c\x93\x58\x04\x42\x3e\xd8\x68\xcf\x8c\xfb\xb8\xbe\x8f\x6d\x8a\x71\x4a\x26\x8a\x39\x0e\xdc\x2d\xd5\x09\xd2\xdc\x96\x85\x1d\x1b\xd4\x32\x49\xbd\x0f\x69\xb0\xc4\xcb\x2f\xf4\x08\x0d\x1f\xd5\x62\x2b\xc2\x38\xdd\xa6\xe9\x30\x02\x5d\x8a\x2b\x12\xb9\x72\xf9\xeb\xa1\x74\x21\xd4\xce\xa6\x42\xf4\x0a\xd9\xea\x85\x47\xae\x59\x49\x8c\x3a\xd1\xb9\xa0\xc3\x4e\xd8\xc0\x1a\xae\x3b\xd2\x1a\xc1\x77\x43\xb5\x77\xf9\x51\x5c\xfb\xdd\xe2\x70\x4d\xc5\x7e\x80\xf1\x25\x32\x3d\x55\x10\x0b\x9f\x69\x79\x27\xd4\x31\xdf\xe7\x36\x31\xb5\x8e\x52\xaa\x6a\xeb\x04\x78\xbf\x45\x95\x52\x43\x86\x89\xfb\xeb\x9c\x60\xd8\x7a\xae\x09\x95\x43\x62\xcd\x02\xa2\xb0\xb4\x79\xef\xd3\x8f\x17\x82\x1a\xf3\x9b\x21\x92\x6e\xe0\x2f\x7d\x97\x2a\xd0\xf5\x4e\xa6\x57\x2c\xc3\xeb\xd0\x20\xb1\xee\x26\x88\x25\x33\xbd\x19\x11\x43\x23\x81\x5f\x67\x2e\xc8\xc9\x05\x68\x73\x0a\x58\xe4\xe1\xe3\x5f\x68\x21\x21\x9a\x32\xb8\xa6\xc5\x2c\xed\x6f\x95\x73\xd9\xf3\xbe\xb2\x85\x13\xba\x62\xfb\x20\x1f\x7f\xd4\x1b\xb1\x0c\xa3\x4b\xb1\xc7\x0f\x2f\xd7\xbb\x92\x99\xa7\xc5\xf7\xf2\xe0\xfa\x1d\x1a\xf0\xe9\xae\xf5\xed\xe7\xc1\x69\x50\xe8\x60\xec\xd6\x1f\x18\x42\xa1\xa2\x2c\x98\x31\xc0\xc0\xd4\xed\xa8\x40\xb0\x88\xa5\x45\x20\xc9\xb1\x8c\x76\xeb\xa9\xbe\xbc\xd5\x91\x38\x1c\x18\x0d\x7f\x86\xa0\xe5\x8a\xdd\x92\xb9\xb0\xc8\x07\x6a\x7c\xdc\xab\x60\xde\xa4\xc1\xaf\xb1\x8c\x8b\x94\xb1\xb3\x92\xcc\xfb\x4d\xae\x27\x11\xe7\xd1\x2d\x2b\xc7\xc7\x82\x5f\x63\x99\x2e\xc3\x24\x71\x63\xc2\x83\xb1\x07\x5e\x32\x24\x5f\x69\xcf\x47\x24\x0a\xef\x0d\xb4\x3e\xfa\xe8\x6f\xc1\xfd\x3b\xb9\x9c\xf5\xb7\x89\xf5\xbc\xba\x95\x04\x65\x7d\x9e\x62\x2a\x4a\xa1\x6f\x01\xd4\xd8\x44\x41\x31\x24\x44\x7d\x6d\x1a\x44\x23\xe7\xb5\x5d\xb7\xe6\xa3\x1a\x31\x9f\x4b\xac\xae\x43\x0a\x33\xa9\xbd\xd4\xef\x36\x80"}, +{{0x0a,0x05,0x6b,0xe0,0x39,0xfd,0x55,0xda,0xda,0x44,0x1d,0x03,0x73,0x61,0x27,0x3f,0x20,0x6e,0x00,0x0a,0x74,0xa0,0x5c,0x51,0xc0,0xcb,0xb6,0x27,0x43,0xf1,0xf3,0x40,},{0x73,0x14,0x02,0x17,0xa4,0x93,0xa1,0x78,0x66,0xff,0xf5,0x15,0x48,0x32,0x27,0x3d,0xf7,0x9d,0x58,0x11,0x54,0x3c,0x22,0x2a,0x39,0xd0,0x56,0xb8,0xc9,0x70,0xdb,0xfa,},{0xfa,0xb8,0xe5,0xd9,0x3d,0x7d,0x46,0xc6,0x5e,0xe1,0x17,0xc5,0x37,0x5e,0x73,0xc9,0x70,0x5f,0x87,0x54,0x17,0x7f,0xdd,0x46,0xef,0xed,0x47,0x37,0xc2,0x87,0x68,0xcc,0x4b,0x95,0xa9,0xc8,0x4c,0x52,0x9b,0x4b,0x91,0x6b,0x28,0xda,0xbd,0x87,0x41,0x18,0x31,0x44,0xbc,0xdb,0x48,0x3d,0xf9,0x8a,0xf8,0x9d,0x82,0x40,0xcf,0x09,0x46,0x04,},"\xa5\xab\x14\x76\x84\xe4\xd4\xa7\xbc\xb5\xa9\x6f\xb3\x98\x18\xe2\x3f\x56\xc2\xd8\xa7\x44\xe9\x12\x3d\x62\x08\x39\x30\xab\x1d\x0b\xb5\x32\xe6\x87\x14\xfc\xec\x7e\x6c\x41\x13\x4b\x6b\x19\xdd\xd8\x67\xfe\x63\x5c\x9e\xd6\x53\x93\xee\x39\xc5\xe8\xfa\xb4\x56\xcb\x5b\x32\x79\x78\x83\xf3\xcd\x9a\x09\x02\xb9\x79\x63\x48\xee\x66\xc6\x91\xfb\x4f\x2b\xb1\x47\x64\x41\x06\x57\xc7\x4a\xb3\x64\x56\x78\x79\xb6\xfa\x0a\x6f\x4d\xaf\xd9\x30\xd9\x23\x4c\xd7\x83\x4f\xb9\xd0\xee\xdf\xbb\x5a\x39\x4b\xf0\x84\x6e\xc6\x96\x9c\x2e\xf7\xce\x39\xe3\x85\x38\x95\xff\x5b\x4d\xa3\x1e\x54\x34\x1b\x42\x72\xe4\xa2\x60\x49\x18\x9f\xf2\x82\x41\xce\xef\xfb\x7d\x2e\x1f\xaf\x4f\x77\x9f\xa6\x5c\xac\x0f\x57\x83\xc6\x0a\xe7\x7d\xe3\x0a\xd4\x46\x5f\xdb\x39\x0d\x42\x57\x1e\xff\x4a\x63\x13\x63\x49\x93\x7d\x6c\xae\xef\xcd\xae\x22\x9e\x2f\x28\xce\xa8\xab\xf3\xff\xae\x3c\x3e\xcc\xd9\x06\x70\xa4\x21\x2a\x2b\xee\x1c\xa6\xa5\xb5\x4f\x09\x4f\xc3\x23\x10\x58\xf5\xcb\x9e\xce\xb9\x99\x3b\xe4\x70\x27\xd5\x1c\x18\xde\xca\x41\xcd\xda\xf4\xe8\xbc\x56\xa9\x9f\xd2\x70\x35\x5f\xf4\x59\x71\x95\x0e\x34\x37\xa1\x98\xcc\xc3\x25\x41\x68\xdf\xc1\x57\x40\x80\x80\x2e\xe1\x01\xa6\x17\xfb\x60\x4e\x86\x8f\x8f\xa8\xfb\x30\xda\xeb\x43\x07\x4d\xe1\x1f\x24\x83\xd9\x16\xde\x56\x43\xb7\xca\xc2\x3d\x93\x40\x50\x8a\x3f\xd6\x21\xec\xd2\x50\x04\x35\x6a\x53\x55\x4a\xd3\xad\x7d\x5d\x25\x81\x7a\xd7\xc9\xa6\x10\x00\x8c\x67\xac\x16\xba\x42\x11\xc4\x2f\x5d\xad\xf8\x6c\x2c\x3a\xed\x82\x5c\xf2\xa9\xb5\x23\xbf\xc0\x3d\xd7\xde\x40\x0c\x67\x80\x7e\x13\x9e\xa5\xdb\xce\x4e\xe1\xf7\xd3\x18\x88\x9b\x01\xa9\xf4\x48\x03\xc3\x22\xac\x3b\x61\xe2\x0e\x63\x12\xd0\xa0\x3b\xf9\x92\x7f\xa3\x3f\x04\xed\x7e\x20\x7b\x16\xf2\x65\x02\xc2\x98\x3a\x3a\x96\x1f\x22\x44\x61\xfe\x9b\x64\x92\x3b\x1d\x09\x18\x94\x76\xae\x8d\x00\x1d\x0e\xca\xae\x4d\xf6\x0d\xb3\x5f\x44\x8b\xb6\x12\xf9\x65\x5a\x5f\xb1\x44\xdf\x11\xd8\x3a\xa6\x93\x68\x86\xc3\x04\x94\x9e\x59\xaa\x46\xdf\x65\xc2\x2c\xe7\xbf\x28\x9b\x3c\x77\xc2\x5d\x89\x6b\xe6\xd5\x1d\xee\x10\x74\x82\x61\x68\x8c\x8b\x07\x1c\x85\x6f\x99\x62\xc6\x67\x75\xdd\xf1\x60\x83\xda\xe0\x65\x87\xe3\x2a\x63\x61\x19\x9d\x72\x09\x7e\x38\x3a\xd7\x43\x94\x91\xb5\xa5\x63\xa3\xe6\xd5\x8d\xa3\xd5\xab\xb1\xde\x84\x89\x0a\x36\xb4\x21\xce\x03\xd4\x84\xdf\xd6\x00\x39\x63\x8d\x46\xed\xfb\x60\x65\x9e\x3a\x25\xac\x6e\x9a\x93\x5a\xd6\xda\xd5\x0f\x92\x7b\xcc\x2f\xf9\x9f\x99\x24\xa5\xb7\x99\x5d\xc2\x3c\x8f\x30\x1c\xcc\x77\x69\xf7\x1c\x18\x26\x09\x04\xa3\xdc\xfb\x81\x7d\x2d\x80\x5c\xb1\xf1\x96\xbe\x8b\x6e\xcf\x35\x2b\xc2\x96\xbc\x3f\x76\xea\x91\x35\x3f\x8c\xf3\x5b\xcd\x2b\x57\xeb\x59\x42\x77\x3d\x68\x34\xac\x50\xee\xad\xc7\xe6\x64\x61\xd1\xda\x09\x8c\xce\xc7\x5f\xf7\x20\x52\x15\xf5\x24\x59\xd9\x76\x20\xf9\xf0\x28\x9e\x93\x91\x1d\xb3\x9b\x21\xdf\x81\x8f\xdf\x0b\xed\x45\x50\x92\x44\x63\x3d\xf0\x1c\xdd\xdb\x4b\x75\x97\x2f\xa7\xea\x6f\x73\x28\x1c\xbd\xbb\xd1\xbc\xb0\x0c\x3b\xc1\xb1\x72\x8e\xea\xe0\xbb\xa1\x72\xb1\x31\xf5\xd3\x08\x90\xa3\x41\xe6\xb7\x2f\x7e\x89\xdd\x4b\x6d\xb3\xe7\x9b\x69\x27\x58\x6c\xf2\xc8\xac\x38\xdd\x14\xf3\x74\xd7\xf5\xbb\xa9\xf4\x35\x3d\xef\x10\xdd\xc9\x4d\x3d\x11\x18\xc5\x69\x9e\x38\xb6\xb5\x04\x91\x8e\x58\x9e\xfe\x3f\x7e\x97\x3f\xb4\x0e\x2e\xbd\x05\x7d\xe1\x38\x5e\x39\xd6\x99\xa8\xf6\x83\xb9\x62\xfa\xe4\xf3\x90\x28\x81\xf1\xaf\xbe\xd7\xc7\x83\x82\x35\x58\xc3\x6d\x68\xc6\x87\x5d\x16\x6f\xa2\x43\xeb\x2a\xe1\x4f\x7e\x63\x15\xa6\xd2\xab\x4e\x79\xea\x8e\x16\xe6\x9d\x30\xed\xc7\x08\xf1\xe7\xaf\x7a\xda\xfe\xdc\xd3\x16\x88\x98\xb3\x31\x87\x81\x78\xc4\xba\x88\x33\xd2\x0b\x3c\xac\x9d\x32\xb8\x88\x8c\xc6\x78\x32\x06\x39\x74\x70\xa2\xe7\xcc\x4c\x98\x09\xff\x79\xce\xac\x9d\xc2\x4c\xa1\x43\x8c\x91\x9c\x8a\x41\x5e\x82\xf0\x90\x2b\x4d\x9c\xf4\xcc\xd5\x76\x96\x8d\x5b\xee\x81\xc5\xf1\x9c\x7d\x57\xb9\xba\xda\x8e\xab\x47\x56\xea\x27\x0d\xd2\x61\x29\xe6\x12\x2e\xe2\xd6\x15\x24\x2b\xc7\xfa\xbf\xf4\xf8\x31\x2e\x68\x6c\x8f"}, +{{0x22,0x05,0x24,0x86,0x0c,0xb8,0x9a,0xb2,0x95,0xbd,0x88,0x4f,0x98,0x8a,0x57,0x91,0x18,0x68,0x69,0x3d,0x6b,0x10,0x5a,0x80,0xb2,0x30,0xf2,0x1e,0x57,0x80,0x5a,0x7d,},{0x4a,0xb3,0x2b,0xc1,0x56,0x6a,0x76,0x77,0xe7,0x99,0x73,0x4d,0xc8,0x41,0x81,0xfb,0xb6,0x54,0xb8,0x13,0x37,0x91,0x80,0xf1,0xdd,0x35,0xae,0xf2,0xd3,0x24,0xc1,0x2c,},{0xdb,0x1c,0xc0,0xc5,0xdb,0x77,0x3e,0xc5,0x16,0x89,0xbe,0x28,0x84,0x2f,0xa6,0x79,0x1a,0x7d,0x75,0xe2,0x9c,0x22,0x8a,0xe9,0x59,0x3a,0x58,0x0e,0x08,0x75,0xb1,0x67,0x0f,0x09,0xb0,0x34,0x42,0x92,0x9a,0x18,0xf1,0xe9,0x41,0x4e,0xa3,0x43,0x15,0xff,0x09,0xd9,0x1d,0x92,0x2e,0xe4,0x7f,0x10,0xf7,0x1d,0xa4,0xab,0x13,0xb7,0xd9,0x01,},"\x02\x4a\x54\xac\x5e\x01\x63\xb3\xa4\xfd\xd0\x2f\x59\x36\x88\x8a\xe2\xf9\xb7\x4a\x64\x14\xb5\x3c\x63\x81\x17\x3b\x09\x5a\x4d\xda\xcf\xc3\xa6\x9f\x19\x16\x7d\x0f\x1a\xe0\xc1\x20\xbb\xa7\xe9\xfc\xb7\xcc\xfc\x79\x6d\x89\xea\x46\xef\x80\x58\x86\x6e\xf6\xda\x7d\x01\xa6\xa1\x42\xea\x69\xd7\x20\xc4\xf8\x05\xac\x54\x05\xa8\x01\x2c\x3c\x2a\x82\x63\xb5\x37\x2d\x59\xbf\x7f\x40\x99\x29\x90\x13\xd2\x62\x59\xdf\xd5\x19\x3e\xce\x56\x17\x97\x77\xbe\x51\xb8\x6b\xd1\xce\x5f\x1f\xc9\x15\x6f\x2b\x3a\x32\xc0\x9d\x86\xbc\x61\x32\xde\x57\x61\x02\xe2\xf0\x3c\x71\x6d\xb5\x36\x6c\xcb\xe7\x42\xae\xe3\x55\x2a\xc3\xb3\x9d\x0e\xc7\xd4\xe4\xe9\x62\x6b\xf8\xec\xe0\x31\xd6\x78\xd3\x48\x09\x05\xc0\xe3\x38\xfb\x7c\xc0\x26\xe3\xe7\x9c\xf2\xc2\x78\x1a\xc2\xa5\xa4\x0d\xf4\x28\x4e\x23\x5a\x03\x89\xe9\x28\xfc\x63\x55\x7d\xc6\xf1\x99\xfc\xec\x5f\x36\x1e\xa2\x47\x59\xfa\x7c\x5f\x71\x97\x8c\x0b\xa2\x45\xe4\xb0\x3a\xe4\x35\x94\x1c\x86\xc8\x1a\x51\x43\x0c\x2d\xc9\x92\x7e\x3b\x0f\x4e\xc4\xeb\xa7\xc2\x74\x5b\x49\x39\x87\x15\x4d\x7d\xa8\x5b\x67\xde\x21\xc5\x98\x40\x7f\xb2\xa7\x60\x80\x4a\xd0\x5b\xfd\xfa\x45\xa6\x13\x22\x4b\x22\xa0\x85\x88\xcc\xea\x3c\xbd\xf4\x7a\x19\x8b\xeb\xf8\xcf\xed\x86\x49\xd6\xd5\xf3\xfa\x50\x13\x76\xbd\xfb\xa4\x00\x3d\xac\x22\x37\xdc\xac\xe5\x31\x5b\x7f\xef\xb8\x79\xa8\x9a\x85\xbc\xe6\xda\x52\x6f\xc3\x60\xcb\xb4\xfd\x55\x4e\xf0\x13\xf3\x3b\x73\x84\xcd\x2b\x22\xa8\x85\x77\xf3\xa2\xd3\x66\x42\x2a\xae\x46\x41\x7b\xa9\x16\xe1\x64\x6e\x24\x40\x4a\x88\xb5\xd5\x3f\xf1\xae\xd2\xa4\x7b\xaf\x81\xfc\xb4\x28\x63\x97\x99\x13\x94\xb2\xec\xc3\x96\x67\xac\x46\xc2\xbd\xb6\xd0\x23\xb3\x3d\xb0\x13\x45\x7c\x40\x05\xd8\x39\x01\x5d\x88\x51\xf0\x28\xac\x33\x4f\xb2\x4b\xba\xd2\x90\x2a\x4d\x63\xae\x68\xe0\xec\xa7\xea\xea\x1e\x85\x65\x29\x64\x7b\xaf\x14\x12\x21\x37\x54\xed\x50\xaf\x3f\x43\x6e\x9b\xaf\xc1\x60\x16\x39\xb3\x9d\x3e\x52\xa9\x3a\x89\x8f\xb6\x01\x9f\xd5\xed\x6e\x7d\xfc\x05\x0e\x7c\xe5\xf3\xd3\x5c\xeb\x50\x67\x02\x1c\x0f\xbd\xc7\x08\xd3\xf2\x6b\xd6\x05\x68\xd1\xed\x2b\x61\x2b\x69\x62\x35\xd5\x33\x33\x18\xf9\xa6\xc9\x87\x23\x5a\x7a\x07\xf8\xc6\xa9\x35\x4f\xb8\xe7\x34\x76\x30\x65\xaf\xcd\x4d\x93\x77\x64\xa4\xf0\x37\xcc\x7e\x7e\x2b\x93\x21\x7f\x16\x41\x68\x4f\xa8\x1b\x7f\xf7\x98\x6a\x28\xb3\x8e\x95\xb3\x32\xe7\x46\x49\xe8\x3d\x0d\xed\x79\x5c\x57\xf2\x4c\xf2\x76\xe0\x14\x39\x01\xba\xfe\xf0\xf1\x69\x3f\xe7\xcf\x10\x90\x4f\xb0\xd8\x80\xd7\x2e\x44\x71\x6a\x70\x69\xda\xaa\xe7\x42\xcf\x0f\xf3\xed\x92\xf5\xf7\xd1\xe1\x0e\x04\x9d\x8d\xf0\x43\x63\x1e\xd0\xed\x4c\x4a\xc4\x02\x2d\x84\x03\xcb\x04\x21\xb4\x54\xcb\xfb\x6f\x48\xa3\x0e\x9e\xe1\x60\x9a\xd7\xb6\x82\x11\x97\x7a\xcb\x33\xb9\xc1\xa1\xbe\x73\x58\x14\xc5\x8f\x66\xdb\x5f\x0b\x8a\xc7\x73\xb1\xd5\x8d\x4e\x6b\xc4\x5d\xfd\x48\xa2\x94\xbb\xd2\x5e\x92\x67\x1f\x56\xf3\x02\xf2\x9b\x50\xd8\x04\x31\xc8\xf2\xea\x33\x99\x62\x57\xb2\x08\xe0\x57\xea\x76\x72\xcc\x2d\x1c\xd4\x20\x4b\x85\xb2\xab\x50\x90\x27\x13\x13\x59\xae\xb4\x2e\x3e\xcc\xdb\xae\xcf\xe2\xcd\x3e\x5a\x33\x13\x26\x6e\x76\x11\x94\xff\x69\xca\xe9\xe3\x7e\x51\xcc\x0a\x54\xf0\x86\xdd\xe1\x3c\xb3\x31\x18\xe3\x4f\xe3\x3c\x74\xd7\x35\x58\x27\x52\xd6\x8d\x21\xc7\x9e\x5c\x3a\xae\xa9\x4b\xa1\x07\xcb\x7e\xe8\xa7\x0a\x3f\x9a\x01\xe9\x80\x8c\x0a\xeb\xa6\x66\x53\x15\xb4\x56\x25\x84\x0a\x03\x3a\x6e\x2a\x87\x54\x95\x05\x79\x42\xed\x9b\xb2\xce\x6e\x4e\xe6\x0b\xed\x47\xcd\x9d\x58\x4b\xc2\x45\x24\x39\x7a\x10\x94\x98\xee\x2a\x97\x3a\xad\x6a\x29\xb7\x0a\x1c\xfb\xfe\x9a\xa5\xc7\xcb\x9f\x35\xf0\xfa\x00\x22\x7f\x43\x98\x8d\x07\x61\x9b\x6f\xb2\xf6\xd3\xbe\xe2\x8e\x10\xee\x70\x53\x47\x01\x5a\x92\x2e\x2e\x88\xd3\x4f\xb0\xce\x51\x5b\x08\xdf\x3a\x1b\x63\x4f\xf9\xec\x15\xd0\x59\x41\x82\xc8\x6e\xbb\x0d\xb7\x83\x61\x2a\x7d\x19\xe4\xb2\x2e\x82\x2d\x56\x62\x45\xae\xd7\x2e\x69\x4c\x3d\x10\x1b\xfa\x4c\xa8\x79\x86\x2e\x5f\x99\xc2\x3a\x5d\x66\x08\x3c\xe0\x6d\x87\xf3\x99\xaa\x78\x88\xab\x83\xb8\x66\x44\x72"}, +{{0x4e,0xf6,0x0f,0x06,0x91,0xd7,0x37,0xe6,0x4d,0x43,0x7b,0xfd,0x33,0x98,0x33,0x0e,0x55,0xe3,0xc0,0x94,0xcf,0x41,0xfc,0x55,0x7b,0x0f,0xe0,0xb6,0x43,0x90,0x9a,0xb8,},{0x30,0x6a,0xb1,0x46,0xe5,0xc8,0xcd,0x63,0x0f,0x9b,0x48,0xbf,0x8b,0x68,0x5d,0xb0,0xb6,0xb5,0x53,0xef,0x69,0x68,0x68,0x53,0xb6,0xb5,0x31,0x96,0x01,0x18,0x54,0x8c,},{0xcb,0xf7,0xcf,0x22,0x08,0x1c,0x5f,0x23,0x5d,0xba,0x35,0x63,0x0f,0xb3,0xf0,0x40,0x8f,0xce,0xcc,0xef,0xeb,0x28,0xb9,0x9d,0x74,0xdb,0xd9,0x8c,0x90,0x2c,0x7d,0x99,0xba,0x9c,0xa7,0xfa,0xb3,0x74,0x7c,0x50,0x4c,0xc2,0x19,0xf4,0xdd,0x10,0x10,0x81,0xf5,0x8c,0xe6,0x16,0xe2,0x92,0x80,0xe3,0x62,0x53,0x9f,0xe4,0x9f,0x34,0xd7,0x05,},"\x0a\x18\x8a\xc2\x6f\x3c\x5d\x89\xf3\xd5\x88\x37\x4f\xac\x5e\xcf\x9a\x46\x7e\x21\x65\xb3\x1d\x0b\x0f\x23\x50\x1b\xd2\x2e\x62\xbf\x35\x55\xff\xba\x94\x63\x1d\xe7\x4a\x6a\x3c\x3c\xf6\x3b\x03\xac\x1b\xbb\x37\xd2\x33\xec\xa5\x99\x3b\x09\x70\xa0\x22\x0d\xe8\xd6\xc4\x1a\x97\x03\x07\x30\x9a\x52\xda\x05\x76\xdc\x33\x4d\x80\x64\x47\xaa\x09\xd0\xb2\x45\xea\xcd\x0b\x42\xc4\xe1\x9f\xa3\xd6\xfb\xdc\x22\x94\x30\xeb\x3c\x75\x58\xaf\x53\x31\xc6\xe7\xfc\xc2\xe5\x52\xce\x35\xd5\x79\x07\x3b\x54\x8d\xc1\x15\xbb\xd2\x7e\x5a\x33\xce\x1c\x47\xfc\x84\x61\xe3\x91\xb6\xd7\x67\x95\x34\x87\xcc\x52\xee\x67\x3b\xc4\xbe\x96\x56\x9c\x85\x57\x36\x9e\xbb\x6e\x02\xf7\x92\x38\x10\x8c\x3b\x58\x56\xee\x38\x1a\x79\xff\x46\x4c\x8f\x60\x09\xfd\x47\xe6\x7b\x4c\x80\x20\x1e\x11\xe6\x1a\xb8\xf5\x9b\xa5\xd0\x7b\x15\xac\xe3\xfb\x37\x4c\x64\xb6\xb4\xc3\x45\xe2\xb0\x0e\x91\x51\xab\x8e\x1c\x5c\x98\x56\x8b\xc5\x8d\xd0\x81\x2a\xaa\x3b\xee\xe1\x65\xe7\xea\xe5\x8f\xbd\xe6\x30\x77\x20\x3c\x4f\xd6\xe1\x60\x68\xd7\x6e\x3d\x3a\x13\xf1\xcd\xd7\x32\x88\xbd\x5e\x4d\xa4\x4e\xb1\x19\xa0\x4c\x4d\x32\xef\xa2\xf1\x3e\x74\x26\xa2\xf4\x1c\x56\x23\xc9\xb0\x66\xb1\x30\x36\x39\xb8\xfc\xea\x0d\x87\x74\xcc\x08\x04\x5f\x7e\x34\x63\x65\xff\x31\xd3\xb1\xed\x99\xe9\x7b\xca\x5f\x25\xc9\x2b\x28\x43\xac\x58\x5d\x02\x19\x3a\x2f\xd3\x94\x66\xf7\x3a\xaa\x98\x9b\x1f\xa0\x5b\x9a\x15\x7f\xd0\x27\x7c\x5e\x74\x5d\x25\x8e\x02\x78\x03\xa5\x24\xad\x94\x30\x94\x25\xc3\xf4\xde\xc3\x1c\x0e\xfc\x54\x77\x52\xf4\xc7\x19\x4c\xbb\x27\x2f\x84\x9a\x52\x16\x9c\x6a\x07\x8d\x20\xed\xe1\x43\x20\x16\x52\x84\x77\xb5\x8c\x2b\xdf\x60\x63\xf9\x44\x7e\x33\x83\x7c\xcb\x43\x7d\x8d\x6b\x95\xcf\x4c\x44\xbe\x70\xc8\x19\x3a\xd9\x80\xa1\x05\xf3\xdb\x6f\x99\x30\xba\xb4\x67\x8c\x77\x63\x42\xfa\xf1\x70\xed\xf7\x42\x48\xd3\xb1\xca\x96\xf7\x31\xb9\xd0\x26\xd8\xf0\xf7\xc3\x4e\xd3\x72\xc1\xcd\xe1\x76\xf5\x5f\x55\x86\x75\xcc\x31\x80\xc2\x39\x02\xf4\xba\x95\x08\xd1\xc9\x1c\x3c\x9e\x68\x87\x30\x32\x7f\x3f\x7b\x63\x7a\x8f\xee\x54\x37\x37\x59\xfc\xb1\x7c\x92\x17\xea\x44\xce\x43\x69\x1a\x8f\x64\x63\x64\x0a\x4a\x5e\x15\x1e\x62\x54\xc4\xef\x12\x62\x3b\x49\x39\x4d\xa7\xcc\x79\x45\x26\x93\x81\x7d\x6b\xae\xa9\xa0\xa7\x58\x76\x94\x8b\x1f\x8d\x3b\x71\x7f\x9e\xc3\x67\x53\xf5\x32\x63\x71\x03\x83\xb9\x82\x62\xae\x63\x54\xff\x2a\x22\x83\x22\x0a\xd4\x2c\x5c\xb2\xcb\xbd\xf1\x2c\x87\x95\x13\x71\x0b\x16\xbe\x85\x6f\x3b\x13\x55\xb3\x6f\x4b\x80\xc0\x17\xc2\x1b\xe8\x5e\x96\x05\x3d\xa0\x50\xc4\x03\x12\x10\x0a\xbb\x64\x0b\x87\x3d\x88\xfb\x6e\xe0\xd1\x9e\x9e\x61\xb0\x4c\x97\x0b\xd1\xf0\x60\xdd\x31\x1b\xbb\x9a\x6e\x35\xb9\x85\xfd\xca\x17\xca\xee\x8c\xd5\xdb\x63\x7a\xcd\x90\xcb\x8e\x82\x32\x55\xc0\x56\x01\x8f\xef\x59\x20\xdb\x64\x0d\x22\x01\xc5\xed\xdb\xd8\xa9\xc9\x47\x4d\xa8\xde\xf7\xe1\x32\x5b\x3c\xc4\x36\xc7\x4f\x81\x5d\xb1\xe4\x2b\x42\x1f\xaa\xb6\x26\xa4\x37\x8c\x2d\x84\x26\x1b\xf6\x49\xa5\x3b\x32\x1f\x59\x8c\x44\xbb\xd3\x00\x2b\x06\xcf\x7f\x1f\xde\xf8\x4a\xb3\x5f\x73\xed\x7d\xc6\x50\x96\xcb\x1d\xc0\xcc\x0e\x34\xc5\x61\xc8\xa1\x5c\xf5\x27\x9a\xbb\xed\x9b\x16\xff\x24\xa9\x74\x4e\x3f\x5e\x64\x9c\xc9\xd8\x88\x4f\x89\x1c\x3f\xb7\x89\x02\x03\x1f\xfe\x0e\x01\x21\xc7\x20\x80\xad\x10\xc2\x47\xb7\xc9\x3a\x9e\xbb\x2d\x84\xd4\xf8\x77\x75\x0d\x7b\x34\x16\x39\x3d\x03\x04\x52\x26\xbb\x79\x94\xee\xa5\x8e\x27\x2d\xc1\x8c\x46\xb3\x82\xd1\xf9\x7b\x23\x76\x5f\xda\x7a\x8c\xe2\x1f\xc6\xb9\x8d\x72\x3f\xfc\xcd\x99\xac\x46\x55\xcc\x5d\x10\x10\x5a\x2a\x5b\x7c\x8c\xfb\xfb\x90\xe2\x7a\x9a\x80\x9e\x41\xae\x64\x00\x63\x28\x64\x05\xa9\xbe\x83\xac\x5d\x29\x07\xa4\x5f\x16\x3c\x77\x64\xb0\x9f\x99\xa5\x55\x93\x22\x0d\x69\x01\x29\x2b\x9b\x58\x03\xa0\xfe\x71\xb0\xe4\x44\x1c\xbf\xef\x84\x1c\x33\xce\xbc\x98\x36\x4d\x66\x6e\x5a\x9f\x5e\x7e\x69\xa1\x50\x8e\x43\x80\xed\x36\x13\x45\xb7\x24\x8a\x4c\x1c\x1c\xe0\x87\x69\xbc\x71\x52\xdd\xb3\x32\xfb\xa1\x76\x20\x0f\x5a\xbb\xae\x38\x12\xf4\x06\xda\x72\xdd\xe5\xdb"}, +{{0x19,0x7e,0x15,0xdc,0xe4,0xc4,0x7d,0x73,0x4d,0xbc,0xe4,0x68,0x8a,0x7a,0xd5,0xfe,0x41,0xeb,0xf2,0xaa,0x29,0xa2,0xbd,0xdb,0x2b,0xee,0x62,0x84,0x29,0xc1,0xbc,0x02,},{0x30,0xfa,0xc3,0x23,0x04,0x8b,0x0c,0x78,0x1a,0x9f,0x63,0xc1,0xee,0x69,0xf2,0xb9,0xe7,0x5a,0x27,0x06,0xd2,0x49,0x51,0x2a,0x27,0x39,0x60,0x7f,0x26,0xdb,0x13,0x8f,},{0x2c,0x3c,0x8c,0xd2,0x99,0xc9,0x06,0x0b,0x65,0x99,0x9b,0x03,0xa6,0x57,0x9b,0xc5,0x0e,0xf1,0xfe,0x0d,0x85,0x1f,0x23,0xbe,0x9c,0xb5,0x8f,0x8f,0xb8,0xc6,0x72,0xee,0x08,0x6a,0x53,0x9e,0xad,0x94,0x9e,0x08,0x7d,0xf0,0x91,0x12,0x2d,0x26,0xfa,0xaa,0xd2,0x06,0xa5,0xc5,0x2f,0xcd,0x58,0xb5,0x14,0xd7,0xa9,0x35,0xbe,0x01,0x79,0x08,},"\xfd\x97\x1d\x48\x94\x6b\x51\xff\xed\x7b\x62\xc5\xd0\x99\xc1\xe5\x6b\x13\x58\xb9\x22\x35\xe1\x01\x0e\x3f\x23\x84\x4d\xdb\x73\xbc\xee\x8d\x2e\x1c\x99\x77\x35\x3b\xc9\x6a\x22\x1c\x05\x60\x29\x31\xfa\x16\xcc\xc2\xab\x6d\x0f\x01\xc8\x46\xc2\x92\x0e\x99\xde\x02\x6d\xc2\x89\x7f\x3d\x5f\x3c\xee\x17\x4c\xe7\x51\xd4\xa8\x05\xee\x19\x59\xa3\xc6\x9c\xfd\x42\xd7\xc9\xaf\xd3\x1f\xa9\xb1\xcf\x05\x78\x6d\x8f\x90\x42\xa4\xf9\xf8\x1c\xf7\xac\x9c\x1c\x39\xb3\x6f\x1e\xe9\x5b\x98\xcf\x7e\xe3\xf4\x3e\x2c\x34\x37\x33\xd1\xd8\x2c\xc0\x8b\x2c\xde\xb7\x8d\x98\x20\x34\x08\x5f\xf4\xdc\x65\x36\xcd\x15\x4a\x79\x0c\x85\xc8\x61\x3e\xc4\xe5\xe1\xdc\x37\x7d\x38\xa7\x45\xd9\x38\xcf\xb1\x5c\x8b\x8a\xa8\x61\x21\x83\x5f\x2e\x25\xe9\xe6\xd0\xde\x68\x02\x5d\x81\x0c\x3d\xc9\xdf\x99\x1d\xad\xad\x39\xdc\x69\x81\xfd\xba\xc1\xff\x9b\x7a\x79\x1c\x39\x60\xd8\x56\x43\x66\xe5\xaa\x39\xa9\xe9\xc7\xcb\xf1\xd3\xf0\xf8\x20\xd1\xb9\x01\x08\x75\x1a\xc7\x64\xda\xbe\x05\xc5\x1c\x18\x52\x9d\xa1\xb0\x34\x96\x14\x66\x84\x24\xab\x4e\x93\x64\x40\xc4\xa2\x51\x3b\xe5\x28\x53\x93\x72\xee\xe7\x87\x54\x58\x9d\xbe\x79\x94\xfa\xa1\xf6\x22\x91\x24\xf8\x39\x95\x0e\xd0\x92\x3f\x43\x23\x31\x5a\xc9\x63\xbb\xe4\xc8\xe1\x77\xda\xc5\x16\xe7\x34\x22\x38\xf1\xcd\xf1\x40\xbe\xfc\x8a\xcd\xca\x3d\x00\x2b\x16\xc1\x39\x8d\x86\x86\x00\x30\x4c\x7e\x98\x53\xb2\x3a\x51\xb1\x7d\x9f\xd0\x61\x56\xe1\xd1\xd0\x8a\x28\x46\x09\x09\xfa\x20\x9c\xcc\xcc\x4c\xec\xbd\xb1\xa4\x63\x48\x08\x91\x15\x31\x86\x81\xa9\x5a\xe5\x80\xab\x67\x66\x04\x13\x84\x65\x1c\xc4\xe6\x14\x51\x03\x92\x3b\xdf\x4a\x32\xa9\x3d\x93\xee\xd3\x18\x79\x1f\x20\x80\x5f\x7e\xa8\x4b\x74\x3e\xe1\x1e\xad\x9e\x4c\xa0\x3d\xa7\x6d\xdd\x24\x9f\xd4\x47\x5f\xc1\xa3\x53\xc7\x0a\x83\x38\x9b\xfa\xc5\x20\x98\xdb\x06\x6d\x10\x29\xc4\xef\xfb\xed\x86\x4e\xbe\x7f\x10\x7e\x01\x03\xb3\xa8\xf3\xfd\x1d\x6a\xb4\x36\x0b\x99\xe8\xb1\x40\xc5\xea\x13\x3e\x92\x3c\x39\x2b\x8e\x40\x63\xaa\x6e\x52\x26\x38\xf6\x1d\x7a\x71\xc9\x22\x58\x97\xd9\xf8\xa1\xe1\x6c\xfc\xc8\x01\xe7\xd5\x41\x04\xeb\x10\xe6\x1a\x5a\xe6\x3c\x5c\x85\xa5\xb2\x93\x92\xab\x3a\xb8\xe5\xc0\x39\xf1\x00\xd0\xf4\x60\x0c\x61\x0e\x02\x09\x43\x6e\xf2\xec\xe4\xd0\xbd\xb0\xba\xb4\x37\xb2\xdb\x5f\x37\x08\xfd\xdf\x96\x66\x0f\x6f\xb1\xa9\x0d\x60\x48\xd3\x95\xaf\xaf\xa7\x60\xcc\xaf\x15\xde\xaa\x0e\xff\xeb\x26\xec\x17\x68\x1d\x17\x2c\x13\x30\xf7\x8e\x78\xa8\x73\x6b\x28\x5f\x61\x5f\x15\xd4\xf2\xc3\x13\xd2\x5f\x30\xae\xe9\xd1\xdb\x39\xf5\x35\xfc\xdd\x0e\xbc\x8e\x71\xb8\x9c\xe6\xb3\xfc\xb5\x67\xcd\x0f\xa2\x88\xf4\x8e\xd3\xa7\x59\xbb\x2e\xd2\x00\xfd\xc2\x30\x91\x50\x2f\xd9\xca\x65\x1c\xe5\xe3\x42\x2a\x98\x33\x5a\x81\xd7\x4a\x65\xcc\x15\x00\xe9\x07\x0a\xbb\x60\x9c\x1c\x1f\x68\xfc\x2c\xa9\x4c\xdd\x55\x0f\x99\xbc\xb2\xd0\x92\x41\x6b\x9b\xd3\x88\x41\x0b\x8f\xe7\x48\xfb\x8c\x9a\x5a\xb8\x61\x5f\x2e\xd9\x68\xf8\x5d\xcb\x27\x27\x72\x69\x84\xbe\xad\xa7\xa1\x8a\xfd\xb0\xc7\x2a\xa6\x5d\xe7\xab\xb7\xa8\x6f\x11\x16\x9a\x6e\xad\xf1\xc2\x1d\x61\x4e\x52\xc0\xc8\xf0\x19\x74\x7d\x34\x1a\x05\xd8\x5e\x37\xbf\x58\xd8\x32\x7e\x99\x39\xc2\x38\x7c\x27\x44\xed\xf8\x38\x56\x3c\xb3\x7f\x0b\x16\xe8\xa0\x6f\xc6\x28\xa9\x72\x30\x50\x6f\xa4\x18\x39\x54\xdc\x74\x81\x5f\x3b\xe2\xeb\x2a\xff\x4a\x13\xc0\x65\xf7\x43\xb7\xd8\x5d\xe8\x04\xeb\x28\xef\xe5\x70\xed\x5e\xcc\x71\xab\xa9\x7f\x97\x63\xb4\x36\x17\x32\x47\xf3\x8e\x0c\xf6\x29\x72\x09\xb6\x51\x28\x46\x5a\x38\x26\x64\xce\xd8\x01\x1f\xcc\x3d\x0e\x56\x3f\x15\x5b\xc6\x3c\x94\xdd\xe7\x3c\x7b\x17\x24\x7b\x8c\x3a\x4e\x80\x34\xeb\xd4\x36\x46\x35\x18\x5c\xe9\xc7\x08\x1d\xbd\xbe\x85\x45\xf7\x9d\x01\xaa\x53\x2a\x0d\xc5\x2c\xb7\x90\xa3\x1f\xc2\xff\x41\xac\xeb\xad\x27\xcc\xe9\x24\x45\x54\xdb\x65\x2f\xa2\x87\xba\xe7\xde\xcb\xcc\x8c\xe9\xe0\x1d\x1a\x88\xab\x41\x2b\x6c\x65\x78\x20\x3b\x42\xde\xc9\x82\xb7\xf3\xb8\x23\x14\xdb\x2c\xc7\xc5\xc3\xdc\x1d\x3d\x8b\x17\x14\x4d\xa7\xfe\x60\xe7\xa8\x72\x5f\xd0\xa9\x7c\x61\x06\x07\xcf\x41\x3c\x72"}, +{{0x08,0xb5,0xfd,0x4e,0x41,0x9d,0x23,0x70,0xc0,0xfc,0xd6,0xc3,0xb9,0x2f,0x8d,0xb3,0xaf,0xd4,0x22,0x68,0xf5,0x33,0x08,0x5d,0x9f,0xce,0x32,0xb5,0x22,0x82,0x4e,0x34,},{0xcd,0x0d,0xa6,0x99,0x37,0x9e,0x4f,0x94,0x25,0xe8,0x4b,0x97,0x57,0x30,0x0a,0x51,0xa1,0x63,0xf3,0x58,0x73,0x4c,0xc3,0x7a,0x91,0xff,0x0e,0xa4,0x88,0xd2,0x97,0x79,},{0x42,0xa1,0x37,0x56,0xb7,0x5c,0x67,0x22,0x48,0x5f,0xa3,0xf6,0x94,0x04,0x1b,0x39,0xb7,0xd7,0xc5,0xfd,0x40,0xeb,0xc0,0x6a,0x52,0xe0,0xff,0x34,0xce,0x14,0xd8,0xd4,0x0f,0xa8,0x2a,0x95,0x08,0xb5,0x68,0x53,0x7d,0x26,0xd0,0xdd,0x7c,0x0a,0x31,0xbe,0x71,0x0d,0xa8,0x0a,0xab,0x35,0x19,0x6a,0x03,0x9b,0x60,0x64,0x1d,0xb1,0xe1,0x01,},"\x3c\xee\xee\xa3\x0f\xa4\x01\x56\x3d\xf3\x6b\x19\x8b\x9b\x59\x69\x8c\x10\xe1\x00\xa2\xf3\x0e\x6f\x78\xfe\x62\xb9\x2e\xca\xc9\x89\xe8\xaa\x09\xec\x76\x0e\x89\xca\xc0\xa1\x6b\xde\x3c\xac\x73\x62\x2a\x86\x27\xef\xed\xfa\x4e\xc0\x9b\x87\x3f\x7e\x10\x00\xe7\x69\x82\x91\x0c\xa0\xaa\x4a\xfb\x1f\xf5\xa8\x44\x8b\x76\xf7\xb0\xd2\xa2\xd5\x2a\x7f\x40\xde\xde\xfc\x68\xd6\x0c\xe6\x62\x2c\xa0\x80\xd6\x69\x8e\xa6\xc3\xbd\x72\x10\xb3\xb6\x48\xf5\x32\x52\x29\x14\x94\xb3\x5a\x55\xff\x40\xfa\x1a\x63\x1a\x57\xc5\x10\x01\x1a\x46\xbf\xb9\xe2\x71\xba\xe1\xe7\x8c\xe6\xc6\xea\x60\xc5\x5b\xa0\xcc\xe3\x60\x59\xbf\xb0\x1e\x39\x45\x56\x98\x7f\x74\x4b\x72\xae\xbb\xdb\x4b\x1b\xdb\xb3\xbb\xaa\xee\x1b\x8b\x2f\x31\x74\x50\x6a\x79\x3f\x0a\x51\x1b\x2b\x56\x90\x49\xb3\x0a\x2e\x08\x41\x42\x41\x84\xa4\x8e\xca\x9e\x2d\x83\x78\x3a\xc5\xb6\x1e\xb9\x47\xcb\xd8\xba\xb7\xad\x38\xb0\xc6\x84\x27\xd8\xf9\x4a\xe2\x85\x19\x0d\xbb\x6e\x0c\x6d\x58\x0a\x25\x14\x23\x94\xbe\x94\x81\x58\xd8\xda\x83\xb4\xf3\x4a\x8d\x25\x8b\x97\x07\x56\x32\xb3\xc2\x8b\xfa\xe3\x10\x5e\xd1\x87\x2e\x35\x6e\x43\xae\xd5\x93\x97\xb9\x11\x0b\xbf\x9d\x8c\xa2\xa0\x44\xd5\x27\x1e\x6c\xc3\x61\xe1\x4e\x69\xa9\x32\x51\x76\x83\xec\x81\x81\x8f\x02\xcf\xa0\x29\x5e\x56\x61\xce\xa3\xe5\x86\xaf\xc0\xdb\x41\xba\x95\x55\x3e\xe7\x5b\x20\x0b\x0f\x97\x90\x11\x1d\x37\x57\xa7\x39\xe5\x63\x55\x7a\xff\x9b\x70\xca\x14\xe8\x7b\x79\x54\x37\xba\x91\xa9\x5d\xd0\x7e\xa6\x9a\x11\x35\x9f\x36\xca\x03\x29\x8e\x0b\xfa\x4f\x91\x2f\x64\xa2\x92\x4a\xd9\x01\x97\x5a\x2a\x96\x0b\xa1\xbe\x89\x92\x1b\x1f\x54\x85\x49\x6b\x7e\xa5\xda\x6d\x8a\x69\x37\xac\x10\x5b\xf3\x76\x0e\x48\x76\x99\x0a\x0f\x5c\x5a\x63\x4f\x74\xcb\x57\xdf\x7c\x17\x2c\x8a\x41\x53\x72\xe6\xd9\x03\x29\x87\x17\x49\x96\x16\xf8\x97\x1c\x68\xbb\xec\xe9\x2e\xa8\x78\xa1\x8e\x23\xf3\x27\xc3\x64\x9b\x6a\x85\x2e\xf2\x3b\x7b\x3e\x60\x3c\xdf\x80\x45\x2d\xbf\x1b\xe2\xfb\x77\xe8\x14\xd2\x52\x54\x96\xbb\x31\xfb\x6e\x4e\xd2\x53\x32\x48\xb3\x9d\x5f\xbe\x23\x90\xa9\xb6\xfc\xca\xba\x99\x7e\x8b\x49\xb5\x98\x36\xe3\xe0\x95\x29\xea\x5e\x41\x13\xee\xe4\x51\xc9\xc6\xbb\x26\x74\x1d\x0e\x4c\x58\x6f\x53\xd6\x04\xc6\xea\x0c\x0e\x60\xdb\x02\xe5\x10\x9f\x37\x34\xf5\x1c\xdd\x89\x85\xaf\xeb\x3e\xca\xff\x65\xe0\x59\xe3\x12\xcd\x50\xfa\x34\x9f\xf2\x8b\xdc\x9b\x70\xb7\xf5\x32\xdb\xab\x1d\xf4\x3b\x03\x16\x7c\x1d\x2e\x3f\xa6\xee\x8c\x9b\x17\x4a\x0b\x2c\xf8\xaa\x9f\xfa\x40\x6b\xf5\xbd\x72\x88\x78\x0c\x9c\x4a\x6b\x69\x79\x49\xb4\x86\x38\xd4\x20\x79\xc8\xc6\x6e\x14\xd9\xb5\x72\xa2\x10\xa0\x93\xea\xf1\xd2\xf7\xa7\x03\xb5\xcd\x20\xad\xc4\xf9\x92\x7a\x6e\xa8\xea\x78\xfa\xa6\x1b\xc6\x2b\x3c\x5c\xbd\x3a\x53\x25\x25\x66\xd0\x43\xba\x55\x65\x90\xd9\xa7\x63\xbe\x7f\xea\x4b\x20\xe1\xe9\xcf\xbe\xbf\xae\x15\x43\x9b\x33\x4d\xc5\x39\xb1\x7d\xad\xa2\xe4\x34\xe9\xc8\x32\x25\xb1\xe8\xf6\xbe\xb7\xd5\x56\xb4\x7d\x7f\x69\xf7\xeb\x7d\xf5\xed\xe2\xee\xbd\x84\xe2\x50\xb7\xc9\x46\x8c\x21\xfd\xc0\x17\x0e\xa8\xdf\x66\x2d\x61\x80\x58\x1f\x65\x7f\xe7\x6c\xef\x18\x58\xb6\xb0\x2f\x73\x25\xc7\x21\x96\x43\xfb\xa2\xf7\xe9\x96\x3a\x33\x32\x2d\x65\x04\xab\x91\xbf\x10\xa9\x78\xfa\x07\xb4\x7d\x5d\xb0\xbe\x00\x0d\xcd\x00\x2b\xdd\xaf\x67\x6b\x77\x25\x9c\x9f\x60\xad\x0b\x11\x67\x1c\xd5\x77\x7c\x1e\x80\xb1\x3f\x82\xeb\x0f\xb6\xa1\x80\xb5\x66\x62\x93\xa4\x32\x40\x86\x2f\xbf\xa3\x97\x8d\x95\x31\x19\x71\xaf\xab\x9e\x1c\xc8\xab\x14\xa8\x76\xb6\x57\x2a\xc8\xa4\xb7\xe0\xb4\x0a\xaf\x6b\x52\xa1\xcf\x4c\x1e\xbc\x6c\x1c\x48\x7d\xf5\xa3\xcb\xc4\x00\x5a\x0e\xe3\x29\xca\xbc\x28\x6d\xb1\x0f\x17\xd0\xf1\x78\x2e\x07\xd3\x32\x4f\x0c\x73\xef\xbd\x3c\x2f\xb5\x2b\x71\xf9\x8a\xd9\x5d\xb9\x50\x62\xd9\x14\x25\xe7\x34\x67\xbc\x1e\x4e\x9b\xf5\x52\xe8\xa2\x44\x29\xd9\x7d\xb1\xd6\x6d\xd4\xd9\x95\xe5\xf8\xd2\x4e\x9c\x91\x0b\x2e\xb1\x75\x8e\xf7\x55\x25\xc3\xd6\x5a\x3f\x43\x0a\x02\x73\x48\x82\x0c\xe3\x05\x3b\x6f\x3a\xf4\xec\x96\xd0\x49\x37\x31\xc8\x18\xc6\xb1\xa7\x0c\x25\x0a\xc6\x86\xa4\xfc"}, +{{0x1e,0x85,0xc9,0xe4,0x51,0xb7,0xac,0xf8,0x01,0xd1,0x6b,0xc8,0x26,0x8e,0xb4,0x2a,0xe8,0x5c,0x72,0xc6,0x8e,0x9f,0x90,0x92,0x7a,0xa0,0xf3,0xb5,0x0b,0xef,0xd2,0x29,},{0xa6,0x9d,0x05,0x7f,0x4b,0x74,0x38,0x11,0xe0,0x7a,0xc7,0x45,0x61,0xc2,0x25,0xbe,0x03,0x81,0xc7,0xd5,0x84,0x9e,0x60,0x18,0x79,0x37,0x01,0xa8,0xcb,0x6c,0x99,0xb5,},{0x6c,0x36,0xda,0x9a,0xd6,0xc4,0x56,0x34,0x3c,0xe6,0x42,0xac,0xa4,0x54,0x92,0x3a,0x52,0xa2,0x84,0x4c,0xe5,0xee,0x58,0x94,0x7c,0x8d,0xf7,0xba,0xb2,0xeb,0xe4,0x67,0x82,0x3c,0x56,0x33,0xe5,0x30,0xb1,0x67,0xd7,0x1c,0x47,0xad,0x95,0x49,0xdf,0x05,0x94,0x3f,0x99,0x42,0x1e,0x17,0x47,0x5c,0x4d,0x4f,0x08,0xde,0xdf,0x6f,0x32,0x05,},"\x18\x9e\xa9\xc8\xd9\xed\x14\xb0\xde\x82\xb4\x4c\xbd\xd5\x87\x57\xa2\x7c\x68\x38\x3f\xba\x59\x77\x61\xf9\xe8\x62\xe0\x8d\xe1\x5b\x1e\x44\xc3\xdb\x1b\xad\xbd\xe7\x69\x80\xee\x39\xe6\x99\x62\x9f\x6f\xcf\xef\x32\xd3\x6b\x33\x93\xda\x2c\xa5\xa8\x1f\x95\x9c\x8b\x0f\x1b\x80\x1b\x5f\xa4\xc4\x7c\xa3\x95\x91\xe6\x12\xa2\x43\x5c\x5b\xaf\xd7\x7a\x5c\x7a\xb7\x43\x59\x21\x09\x06\xf4\x75\x33\xb1\x87\x9e\x2a\x5a\xf5\x86\x4d\x96\x1c\x81\x46\xe2\x5d\xac\x77\x25\x55\xe0\x42\xa8\x87\x26\x14\x19\xab\x8c\x9f\x6f\x62\x56\x25\x48\x1d\xa5\xb9\x35\x26\xa1\x31\xf3\x7b\x53\x4a\x00\x50\xa8\xa4\x62\xb3\x3f\x20\xa7\xe9\x4b\x89\x15\x30\xb1\x9b\xf6\x54\xee\x95\x34\xc9\xa8\x36\x1d\x03\x63\x5d\x8d\x27\xd4\x6b\xe7\xbf\x84\x78\x1a\xd0\xd4\x2d\x1e\x7c\x48\x54\xa4\x9b\xa1\xba\x45\x82\x62\xfe\x5e\xa1\x90\x21\xb9\x35\xa6\x94\x94\x92\xd7\x0b\x60\x5e\x15\x19\x89\xef\x26\x41\xb2\xbf\x81\xec\x4b\x92\x02\x0f\xc7\x07\x4c\x2a\x63\x22\x9d\x51\xa9\x44\x18\x6a\x28\x89\x5e\x8e\xa9\x52\x92\xc2\xf8\x72\xbb\x21\xa3\x14\x93\x99\xe2\x3c\xcd\x8e\x2f\xc4\xf1\x7a\x46\xb5\x9c\x28\x2c\x51\xb5\x8d\x00\x26\x6a\x5c\x16\xb1\xce\x35\x0d\x54\x85\xe8\xd8\x01\x6d\xd0\xa5\x0a\x59\x84\xcc\x94\x81\x54\xcd\x5c\xe7\xcd\xa0\xee\x0a\xb1\xd7\x25\x1b\xdc\x70\xa1\x78\x5b\x8e\x91\x03\x91\x7f\x4b\x91\x7a\xb2\xb4\x94\xf3\x48\x33\x89\xa2\xf9\x23\x75\x41\x84\x9e\xd3\xbd\x56\x5c\xff\xac\x9e\x75\x6d\xb5\x6e\xf5\xe2\x34\x95\xbc\x77\x1e\x88\xbf\xfa\x87\x07\xce\xea\x5c\x09\xbe\xca\xdd\x05\x9a\xb8\x89\xd1\xdf\x7e\x88\x7b\x71\xa9\xe6\xc2\x38\x37\x8f\xbe\x0c\x36\x30\x38\x66\x16\x36\x3f\x20\x7b\x16\xc3\x27\x0d\x39\xac\xde\xd5\x11\x52\x99\x92\xf4\xe5\x98\x78\x91\x21\xd3\x16\x13\x58\x10\x63\x6b\xaa\xde\x8a\x28\xed\xc6\x6b\xbf\x5e\xde\x3f\x40\x4a\x70\xb4\x7d\x35\x98\x8b\xe7\x06\xb4\xea\xa0\x30\x23\xa3\x90\x93\xd5\x83\xcd\x4c\xd8\xbf\x4c\x74\x34\x1a\x02\x8c\x19\xd6\x0d\xa3\x1b\x6a\x7a\x03\x4c\x08\x1a\x2b\x03\x0f\xeb\x3c\xd2\xf0\x3d\x0f\xaa\xbf\xfb\x58\xe3\xfc\x36\xc0\x06\xcf\xb9\x29\x47\xa7\xde\x5b\xa8\x74\x76\xc1\xb0\x51\xe1\x82\x83\xc0\x3e\x9c\x6e\x5a\x5c\x3c\x27\x77\xd9\xa0\x75\x73\x72\x37\x96\x64\xe8\x2f\x84\x85\x82\x4f\xed\xb7\x0a\x4b\xc4\xe3\x56\xed\xd1\xb5\xce\x0f\xb6\xe4\x1d\xe0\x17\x16\x21\xb8\x4f\xaf\xa0\x01\x89\xaf\xa8\xa6\xa9\x00\xb1\x4c\x70\x75\x8f\x7a\xa4\xfb\x82\x40\x0e\x0d\x18\xab\x3c\xd7\xe4\x8a\xcf\xd4\x89\xca\xb0\xe7\x2e\x71\x9f\x79\xa0\x7d\x06\x6c\x53\x1a\x89\x1c\x55\x29\x1f\x22\x45\xdb\xbe\xe4\x4e\x52\xb1\xdf\xc8\x72\x7a\xae\x38\x7a\xb9\xe7\x19\x94\xa3\x85\x4e\x1a\xdd\x73\xd9\xa7\x96\x5c\x77\x55\x21\xc2\xf5\x40\x84\x22\x76\xdd\x30\x9e\x2f\x6a\x34\x1e\x7f\x0f\x37\xf2\x2b\xb6\x62\x7b\x6e\x9c\xb2\x5b\xa2\x4c\x6c\x4f\x4e\xb9\xf5\xe7\x62\x2d\x88\xda\x19\x84\xe2\x9c\x5d\xa0\x01\x03\x9c\x44\x04\x2b\x59\x35\x14\x06\xa4\x13\x36\xdd\x77\x2d\x49\x7d\x3f\xc8\xaa\xc4\x11\x72\xeb\x5a\xa6\x41\x7f\xe4\x22\xec\x7c\x15\x0b\x96\xb0\x45\x4e\xe3\x31\x24\x7c\xb1\x53\x8a\xef\xf3\xec\xa2\xd5\x0e\x53\xd6\xd1\x31\x70\xa7\x6a\x00\x49\xea\x0c\x05\x90\x4a\x63\x90\xed\x14\xce\x74\x91\xe9\x7f\x75\x4c\x52\x22\xda\xc4\xb6\x11\x8b\xa3\x81\xf5\x52\xe7\x3e\xa8\x49\x1e\x3b\x7a\xc9\x49\x56\x9b\x56\x9c\xf2\xd2\x9a\x80\x41\x0e\x06\x5b\x5c\xc4\xa4\x66\xbb\x04\xeb\x7a\x15\xf5\x96\x79\x2e\x84\x90\xba\x70\x02\xec\x36\x15\x71\xaf\x5d\x8f\x57\x67\x5c\x95\x64\x49\x47\x0a\x2f\x99\x55\x40\x73\x67\xe4\x09\xa2\x32\x89\x95\x53\x12\x0a\x27\x7d\xb8\x63\xe9\xa8\x2d\xda\xba\xe8\x7b\x78\x91\x45\xba\x89\x8d\xf3\xc2\x8b\x96\xfb\xe3\x01\x4c\xd0\x85\xc6\xe6\x0e\xe8\x83\x17\x01\x03\x6d\x99\xc5\x42\x5d\x58\xe8\xbc\xc9\xfd\x92\x71\xd4\x6a\xec\x1e\xb9\x55\x13\x01\x02\xea\xaa\xb4\x4e\x07\x70\xc3\x0b\x2b\x12\x7e\xfb\x0e\x5f\x8a\x3f\x7a\x0c\xa3\x4e\xc9\x98\x4a\x46\x01\x1b\xc2\x6b\xfd\xe0\xc0\x81\x9b\xb5\x47\x06\xb5\x65\x63\x8b\x75\x42\xdc\x4b\x8b\xf8\x09\x8d\xc0\x1f\x16\x1b\x3b\x12\x96\x18\xb5\x9a\xde\xd3\x3c\xb5\x9c\xe9\x18\x9a\x67\x62\xdb\xae\x5b\x0d\x34\xb7\x1c\x8d\xbf"}, +{{0x51,0xcf,0x86,0x8f,0x82,0x0e,0xed,0xa0,0xdb,0xd1,0x01,0x80,0xf7,0x77,0xe6,0x06,0x5c,0x93,0xa4,0x83,0xc5,0x8a,0x77,0x8b,0x67,0xe7,0xd8,0x42,0x30,0x2f,0xb7,0x67,},{0xab,0x08,0x8f,0x50,0x2f,0xbc,0xf2,0x15,0x0e,0x48,0x46,0xb3,0x4d,0x2c,0x80,0x97,0xff,0x01,0x3c,0x02,0xa8,0xb9,0x7c,0xfc,0xf2,0xb9,0x5a,0x1c,0x72,0xdf,0x3e,0x24,},{0xe1,0x53,0x42,0xa1,0x1c,0xaf,0x89,0x28,0x95,0xe4,0x66,0x22,0x88,0x63,0xd0,0x83,0xb0,0x69,0x2f,0x01,0x06,0x10,0x74,0x8c,0x23,0xdf,0x2f,0x11,0xd2,0x94,0x75,0xba,0xfc,0xe9,0x27,0xca,0xfe,0x7f,0x07,0xef,0xb8,0xc3,0x47,0xed,0x56,0x63,0xe7,0x3b,0xea,0x89,0x53,0x1c,0xed,0xc0,0xc3,0x48,0xe7,0x9b,0x6e,0x58,0xa7,0x57,0x49,0x07,},"\x7c\x2d\x8e\xe8\x2d\x9a\xbf\x8a\xa9\xc7\x24\xc7\x5b\x90\x99\x04\x73\xf1\x31\x76\x3f\xe9\x3b\x30\xcb\x04\x72\x35\x88\x62\x1d\xa2\xa3\x27\x92\x8b\x22\x64\x9f\xa0\x62\xcd\xea\xbd\x77\x76\x15\x38\xb2\x70\x9b\x8f\xb7\xa2\x00\x6e\x50\x35\x09\x13\x4c\x92\x9c\x30\x11\xe1\xd7\x28\xa5\x7a\x4e\x17\x51\x98\x07\x5e\x21\x42\x53\xf3\xf3\x0e\x01\xb6\xe0\x4e\xab\xd4\xde\x06\x78\x95\x58\xe6\x98\xb1\x86\xef\xe3\x4b\x32\x12\x95\x68\xb3\xe8\xd0\xd7\xea\x3f\xf0\x0b\x3f\x25\xa4\x22\x36\x89\x3a\xa8\xa4\x1b\x67\x4a\x0a\xb5\xf4\x1e\x7b\x28\xcf\x5a\x7c\xb7\x65\xe1\x8e\xad\x6d\xe6\xa3\x53\xa7\x82\x4a\x3c\x49\x78\x60\x38\xd6\xf4\x93\x7f\x32\x64\xd6\xcc\xf0\xc0\xa2\x46\x5b\xb6\x93\xe5\x2b\x3d\x1e\x6e\xb9\xae\x4c\xb6\x5d\x09\xcf\xf5\x48\x42\xe8\x53\x62\x85\x7a\x59\xf7\x19\x8a\x68\x8a\x3d\xf3\x85\x13\xcd\xd6\x1e\x21\xdf\xd8\x59\x14\x2c\x83\x44\xa3\xb8\xb2\xa7\xc7\xdb\x17\x0f\x39\xf8\x7c\xa3\xff\x8e\xd4\x27\x96\x2b\x2b\x1a\x14\xd1\x22\xfa\x2d\x5a\xea\x2a\x66\x40\x11\x7d\xd2\x58\xfa\x0f\xc5\x4a\xc6\xe9\x40\xbc\x16\xd2\x11\xec\x9a\xdf\x91\x4a\xb1\x65\x78\xf5\x21\xf6\x55\xd2\x12\x7e\x79\xe8\x71\xbf\x7f\xa7\x54\x47\x19\xd5\x8e\xd8\x47\x85\x0c\xb2\x7b\x99\xeb\x8f\x29\xb1\x6c\xdc\xc2\x8b\x15\xc1\x25\x9a\xb4\xd5\x89\x70\x5a\x40\x66\x88\xf6\x05\xa2\xeb\xf5\x80\x51\xc4\x3a\x77\xc4\xe0\x1f\xd6\xf7\x49\xd3\x2d\xb4\xe8\x9f\x26\x3c\x2c\x16\xde\x18\x1f\x0e\x6b\xdd\x0a\x6a\x64\xff\xe6\xf1\x82\x94\x44\x09\x6d\x9f\x3e\x2b\x67\xe4\xbb\x00\x66\x50\xb5\x92\x9d\x1f\x82\xeb\x11\xbb\xed\x24\xe8\xf1\x01\x8a\x73\x84\x60\x5a\x3c\xf2\x9a\xb5\x98\x33\x79\x39\xc7\x6a\x3b\xe8\x61\xe4\x83\xc5\x80\x5e\xc3\xce\xe4\x5e\x34\x24\x84\x7a\x08\x55\x8d\xcc\x99\x49\x9f\xb9\x38\x2a\xca\xe5\x6c\xdc\x87\xfb\xd5\xb2\x6f\xf9\x4c\x86\xf2\xe1\x08\x79\x43\x83\x50\x1c\x8b\x33\x36\x68\x50\xa7\x6a\x0d\xfc\x0a\x7c\xd7\x89\xa0\x3f\x01\xa3\xe9\xd9\xe9\xae\x39\xfd\x72\x45\xdc\x29\x29\x9d\x24\xf3\xb4\xb1\x67\xca\xcc\xd2\x23\xa9\x9b\x6b\x20\xa3\xb6\x73\xdc\x5f\x74\x66\xd0\xb2\xf8\x15\x09\x8a\x49\x7c\xca\xf8\x04\x20\x16\x8e\xdd\xbf\x4d\xa5\x7b\x86\x66\xe9\xd3\x3c\x48\xeb\x30\x4b\x4c\xfc\xf4\x57\xcd\x76\x59\x54\x3f\x6d\x1e\x66\x18\x90\xf5\x62\xb4\x3b\x8b\x6d\x1c\x4d\xcc\x07\x7b\x60\xbf\xa5\x33\xff\xab\x92\x8d\xbf\xd9\x55\xdc\x51\x16\xd7\x70\x95\x0b\x69\x0e\x21\x06\xad\x52\xd4\x2c\x31\xc2\x2b\x88\x48\x89\x43\x32\xb5\xc6\x99\xe5\xc3\x31\xfb\x38\x1e\x58\x12\xe7\x52\x6f\xdf\x4b\x8a\xa2\xda\xaa\x2c\xa2\xcf\xb9\xc9\x21\x11\xb6\x1c\xbc\x3d\x1e\xef\x6c\x8c\x67\x37\xf0\x55\x88\xf0\x44\x67\xdb\x83\x30\x84\x3a\xcc\x98\xdc\x1a\x16\xfb\xd9\xd9\xd9\x4b\xd8\xbf\xde\x26\xc3\xf7\x1d\xee\x72\xb5\x09\x10\xc3\x6b\x24\x0f\x80\x2a\x61\xca\x16\x37\x2f\x6f\xfa\xad\xb2\xbe\x4e\x85\x3c\x5e\xd6\x9a\x3d\x1f\x6c\x7b\x2d\xe5\x13\xc5\x3a\x3f\xdd\x0a\x67\x6f\x83\xd0\x9d\x5c\x51\x17\x60\x47\xd9\x20\x07\x16\xbf\x22\xba\xe4\x5f\xe0\x1b\x3e\x0c\x2c\x51\xc1\x6e\x46\xad\x06\x37\xf7\x9f\x9b\x4d\x83\x86\x77\x04\xfe\xda\x9f\x22\x78\x31\xde\xa2\x63\x39\x9c\xa2\x77\x1a\x4e\x78\xb4\xdf\x8a\xc0\xde\x6a\x94\x1e\xab\x37\x0b\x1f\xdb\x47\xda\xf6\x64\x2a\xae\xaa\x63\x17\x0f\xa9\xb3\xd1\xe1\x62\x8f\x7c\x4e\x7c\xf0\xea\x8b\x8a\x8e\x51\x8c\xba\xce\xf9\xad\xe8\x4d\xf0\x32\x48\x48\x47\xff\xb6\x1b\xbd\x07\xe8\x72\x7c\xc4\xc2\x5d\xa5\x77\xb2\x64\x51\x9b\x49\x99\xfa\x7c\x0b\xc3\x23\xd4\xf3\xf9\x73\x9f\x78\x0b\x9b\x2c\x23\xc7\x78\x55\xee\x5f\x6d\xcc\x40\x15\x44\xd6\xb6\x4b\x27\x70\x15\x8f\xdc\x6c\x12\xf4\xd8\x9b\xeb\x04\x4e\x0e\x85\xac\x7a\x68\xd4\x29\x17\xb1\x34\x51\x14\xb9\xa6\x72\xd1\x23\x1b\x2c\x6c\x0f\x96\x9f\x20\x35\x31\xe7\x1b\xbb\x40\x05\xb1\x03\xa7\xdc\x3a\x58\xb5\xb8\x24\xa7\xe0\x1b\x6e\xb9\xf4\x96\xdf\xa6\x4d\x64\xd8\xc6\x77\x7f\x53\xaa\x58\xd5\xda\x04\x6d\x72\x6f\x55\x45\x4c\x88\xb6\xd7\xd4\xab\x0d\x21\x98\xa8\x97\x09\xf1\x18\xa6\xb3\x24\x60\xb9\xeb\xce\xff\x3f\xdd\xc6\x05\xda\x77\xef\x3d\x1b\xa3\x0f\xec\xf0\x7b\xe2\xf5\x31\x3f\x4e\xe6\x35\xaf\x5e\x95\x61\xd8\x77\xe9\x9c"}, +{{0x54,0x3d,0x5f,0x1d,0x4a,0x6e,0x10,0x29,0xb1,0x91,0x41,0x38,0xfb,0x1f,0x46,0x59,0xe6,0x94,0x56,0x55,0x72,0x07,0x40,0x66,0x88,0xa2,0x03,0x5c,0xbb,0xb2,0xa6,0x8a,},{0x3c,0x83,0x79,0x0c,0x3b,0x45,0x53,0xde,0xae,0x4f,0x84,0x3b,0x50,0x1d,0x26,0xf6,0x16,0x70,0x93,0xee,0x54,0xe2,0x79,0x75,0x9f,0xfa,0xd8,0xcb,0xc0,0x61,0xe7,0x20,},{0x55,0x20,0x11,0x94,0x02,0x6f,0xd6,0x44,0x8b,0x1d,0x52,0xf8,0x3e,0xd2,0x0a,0xc2,0x84,0xe7,0xe7,0x7f,0xa9,0x2d,0x52,0x95,0xd3,0x38,0x25,0xce,0xa3,0xac,0xa4,0x7e,0xc7,0xaa,0xca,0x2f,0xc0,0x86,0x79,0xf9,0xac,0xfc,0xed,0xb3,0x76,0xfd,0xa4,0x61,0x9b,0xe3,0x27,0x2c,0x74,0x45,0xe8,0x70,0x5c,0x30,0x61,0x41,0xcd,0xe1,0x6c,0x0f,},"\xfe\x00\x57\xf0\x62\xfc\x87\x13\x24\xb8\xbd\x5d\x42\x7e\x9a\x52\x76\x23\x1b\xd3\x09\x90\x7e\x58\x81\xd7\xae\x53\xb1\xf3\x70\xc2\xa4\x33\x02\xa1\x65\x10\xb4\x60\x64\xa3\x07\x36\xba\xc9\x09\x51\xf1\xd9\x88\x1a\xf6\x2c\x70\x14\x83\xeb\xb9\x27\x2a\xd7\x72\x12\xee\xb5\xfc\xbc\x7e\xc2\x28\xd9\x69\xf8\x90\x27\x32\x11\x3b\x98\xe3\xbf\x82\xdf\xea\xdd\x0d\xe5\xe7\x65\xd2\x87\x0b\x12\xd1\xf9\xb5\xa2\x82\x97\xc9\xfd\xd1\x49\x5c\xf8\x77\x89\x19\x6a\x7d\x64\x4e\xec\xd9\x35\x87\xdb\xf2\x0c\x28\xeb\x09\xda\x28\x66\x03\xc5\x82\xd2\x12\x9a\x65\x7d\xb2\xd1\x7a\xdd\x35\x58\xdd\xe0\x29\xce\x27\xb8\x83\x52\xde\x3f\x95\xab\xa1\x7e\x1e\xd1\x91\x37\x22\xdb\x08\xa7\x95\xdf\xbb\x70\xd6\x2a\x88\x02\x72\x4c\xb0\xf5\x35\xf8\x48\xd0\x52\xaa\x3d\xde\x91\x66\x96\x3a\x80\x41\xfc\xcc\x4e\x60\xbf\xb1\x1d\xe2\xbf\x28\x6e\xb6\x02\xa4\xaf\x84\x2f\x4d\x1a\x34\x0d\x78\xbb\xbc\xb2\x85\x7f\x0c\x30\x8f\x44\xbb\x10\x1e\x7b\xc8\xb7\x41\xd5\x06\x09\x4e\x27\xbb\xaf\xa7\x24\x28\xef\x66\x6e\xa6\xea\x16\xf7\x99\xb4\xee\x58\x27\x8f\x04\x59\x74\xd8\x6d\xc7\x2c\xf5\x26\x0d\x96\xf9\xc0\x9b\x2f\x11\x81\xe1\xa4\x50\x0f\x92\x83\xdc\x67\x7f\x38\x4f\xf6\x4e\x51\xe8\x9f\x76\x58\x20\x20\x32\x6c\x38\x8c\x08\xa0\xfd\x00\xde\x73\xd5\xd4\x9c\x06\xc0\xc6\x84\x19\x1a\x26\x4f\xff\x72\x6d\x87\x2d\xc3\xae\x49\x6c\x7b\x47\x8c\xfc\x61\xb5\x17\x14\x19\x2f\x76\x46\x3e\x3d\x0a\xab\x41\x0e\xa1\x15\xe8\xbe\xfe\xdb\x99\x7d\xdd\x16\x99\x21\xb3\x20\x7e\xa6\x6c\x1f\x59\x45\x0b\x76\x23\x12\x9f\xd1\xe2\xdd\x3d\xa8\xf5\x20\x63\x91\x17\x13\x38\xea\x0e\xc8\xef\x3c\x59\xed\x8a\xfc\x69\xf3\x86\x5c\x29\xa0\x72\x3a\x9b\xbe\x95\xa7\x42\x68\x1e\xf9\x85\x7e\x81\xab\xc8\x0c\x92\xd2\xa7\x18\xa8\x04\xf5\x30\x4f\xef\x3c\x63\xd7\x99\xa6\xef\x87\x82\xa7\xdb\x46\x68\x1d\x0d\xe3\x50\x64\x46\x98\x22\x67\xb2\x15\x2b\x0c\x32\x18\x69\xe2\x3c\xce\x8c\x4e\xbe\xbe\xaf\x4a\xa1\xeb\xe9\x28\x3b\x69\x26\x05\x26\x0f\xf6\x21\xb0\x3c\x10\x82\x2a\xa5\xf6\xd0\x3b\xde\xf4\x9c\x46\x2a\x68\xd4\x71\xe8\x49\xe1\x64\xe3\x87\x4f\x6e\x9f\x6c\xb3\xb5\xf2\x93\xeb\x38\xae\x52\x45\xa1\x59\xec\x42\x61\xa9\xbf\x6b\x5f\x7b\x76\x15\xfd\x33\x9e\xa1\x27\x33\x11\x3c\xe7\x67\xf8\x83\xae\x66\x75\x41\x7f\xc7\x70\xb5\x0b\xd6\x0e\x6f\x20\xad\xdb\x29\xc1\xf7\x50\x62\x33\xe3\x2a\x7e\xbf\xad\xab\xff\x98\xcf\xd0\x9b\x2b\x3b\xbd\x3e\xae\x00\x69\x54\x8b\x9d\x89\x87\xaf\x46\xca\x98\xeb\x09\x5b\xac\xbd\x87\x47\x24\xba\x10\xf3\x63\x3a\xa0\x8a\xb6\xec\x26\x49\x4d\xdf\x68\x54\x30\x9b\x55\xd4\x3b\xdb\xd2\x9a\x75\x56\xf1\x2d\xfb\x23\xcd\x0d\xb4\xeb\x39\x37\xa6\x5c\x4a\xed\x96\xe8\x7b\x34\x65\x55\xf9\xfc\x68\x97\x94\x3a\x0f\xae\xe6\x5c\xcf\x39\x4b\xd8\x9b\x38\x1b\xee\xce\x25\xd1\xba\x68\xf8\xfe\x32\xc2\x3b\x33\x54\xf5\xbe\x7e\x3e\xa3\xc0\xde\xc0\xf7\xec\x2d\xd8\x3f\x92\xb7\x30\x58\x89\x2b\x63\x8d\x4c\x3b\x72\x42\xbb\x8f\x55\xbf\x08\x7b\xa4\x5a\x19\x0a\x69\x8b\xae\x67\x5e\x0c\xd5\xe8\x44\x6f\x2b\x21\xae\xb6\x3d\x2c\xae\xa0\xf6\x79\xa8\x37\xe7\x93\x57\x30\x8d\x9f\x0b\x8a\xf3\x1f\x9d\x08\x00\x8c\x39\xee\x8d\x34\x75\x28\x71\x3c\x88\x50\x01\x7a\x7f\x4a\xb9\x8a\x35\xc7\x53\x19\x40\xfa\x76\x21\xe6\x72\x03\xee\x78\x2d\xb3\xa2\xfa\xa3\x0f\x3a\xa8\x50\xa5\xff\x7a\xae\xd8\x4c\x00\xff\xd2\x14\xf2\xc9\x26\x17\x35\xfa\xc3\x25\x9d\x50\xe0\x3c\x26\x52\x50\x52\x79\xd9\x12\x51\x92\x7d\xe5\xe5\x6a\x8b\x90\x64\xcc\xf9\xf4\x5d\xcb\xef\x46\xe1\x18\x9c\xed\x2b\xc7\x9e\x6f\xf6\x52\xe6\x90\x97\xac\xe5\x56\x8b\xb2\xd5\xbe\xf3\xce\x21\xa2\x5b\x3f\x79\xee\x27\x5e\xa3\x4e\x62\x13\x80\x56\x6d\x70\x4c\xd9\x3f\x24\xdd\x90\x20\x93\x2c\xc0\x52\x18\xc2\x3b\x5b\x22\xff\xfa\x7e\x99\xee\x7f\xe4\x57\x87\x6a\x5e\x33\x64\xc9\xa8\xe8\xb0\x49\xcf\xa2\x09\x69\x77\x4f\x50\x6d\x19\x96\xcb\xe6\xef\x5a\x37\x79\x3e\xcd\xb0\x4c\xfd\xea\xed\x7d\xcf\x79\xab\x27\x84\x74\xdd\x77\x08\x22\xd4\xb3\x6f\xc6\x8e\x4b\x2d\xd6\x61\xef\x99\xde\x01\xde\x6e\xec\x57\xfa\x57\x3e\xde\x10\xfb\xbd\x5a\xc6\xfd\x6c\xd8\xbb\x4e\xee\x50\x9d\xbb\x46\x10\x37\x44\x01"}, +{{0xf8,0xd2,0x57,0xfd,0xfc,0xf9,0x97,0x96,0xf8,0xce,0x4d,0x8a,0xad,0xe3,0xb2,0x25,0xa5,0x3c,0x26,0xfe,0xec,0xef,0x39,0x5b,0x95,0x61,0xd9,0xd5,0x87,0xf5,0xa3,0x3c,},{0xf6,0x6b,0xd4,0x87,0x7d,0xf7,0x8a,0xec,0x04,0xca,0x7e,0x77,0x73,0x28,0x99,0xde,0x06,0x77,0x7e,0x69,0x86,0x29,0xf2,0x99,0x69,0xf8,0xfa,0x9c,0x2f,0x47,0xab,0x9e,},{0x92,0x35,0xd4,0x48,0x07,0x86,0x98,0x16,0xe2,0x8e,0x42,0xc8,0x1c,0x80,0x1f,0xfb,0x12,0x1d,0xe8,0x26,0xc0,0xd3,0x3d,0xcc,0x4a,0x4e,0x1c,0x93,0x2d,0x52,0x28,0xb6,0x39,0xbb,0x29,0x4e,0x16,0x09,0x0a,0x93,0xd1,0xf6,0x90,0x4a,0x70,0x04,0x22,0x2f,0xda,0x0a,0x55,0x44,0x6d,0x99,0x01,0xc7,0x23,0x40,0x00,0x7b,0xb4,0x5a,0xe1,0x03,},"\x23\x3e\x1e\xf9\x01\xab\xcb\x69\xfb\x48\x60\x85\xd8\xdb\x02\x33\xff\x78\xf3\x7b\x13\x6f\x0a\xfe\x24\xf7\xda\xc1\x94\x4c\x36\x78\xe7\x4f\xed\x58\xa1\xad\x54\x83\x5b\x7d\xbc\xb4\x6f\xff\x6c\x35\x24\x31\x22\x73\x30\x0b\x6d\x87\x8a\x93\xe0\x60\x8a\x4a\xba\xca\x4e\x31\x94\x72\x2b\xb9\xe2\x3d\x17\x19\x4d\x86\x67\xb8\x4f\x2d\xb0\x38\xc2\x4e\xfb\x8f\x53\x40\x9c\xf5\x59\x4f\xdd\xb8\xbc\xd6\x1f\x74\xcf\x07\x26\xb5\x1c\x65\x1c\xe0\x1e\xb6\x6a\x59\xb4\x55\xf7\xd8\xa7\xd6\x0d\x39\x27\xe0\xc6\xc5\x4b\x13\x8e\x01\x92\x53\x71\xd2\xd9\xd9\x62\xaa\x98\x2f\x5e\x60\x85\x28\x0c\xc0\x5f\x35\x69\x93\x91\x1f\xd2\x03\x9d\xfc\x34\x21\x17\x97\x02\x91\x38\x1d\x82\x02\x7d\xb3\x6c\x79\x91\x00\x05\x7d\x93\x52\xb2\xcd\x87\x9d\x9c\x82\xaf\x73\x4b\x7f\xa2\x97\xd2\x11\x49\xc9\x78\xaa\x5e\x12\x5b\x20\x37\x2a\x9b\x2e\x0e\xd3\x57\x33\x7e\xfa\xea\x13\x91\xf3\xb9\xef\x11\xe3\xe5\x13\x5b\xb7\x0b\xdb\xe3\x2a\x9b\xdb\x7c\x3c\x42\xd5\xd5\x7c\xc8\xda\xb6\x81\x16\x28\xa0\x10\x89\x49\x5c\xb8\xa4\xa7\x6a\x48\x29\x6c\xd8\xdf\xaf\xc0\x05\xad\x49\xd7\x0b\xb1\x9f\xac\xa2\x08\x4a\x1b\x6f\x5e\x48\xd2\x3c\x03\xfb\xcf\x6f\x10\x6d\xb7\x70\xf0\x7c\x33\xe8\xe7\xf4\x75\x7d\xa9\x04\xa4\x4d\xd0\xe7\x38\xf3\xd5\x73\x3a\x32\x93\x75\xce\xd7\x4f\x3c\x42\xbf\xcd\xbb\x91\x01\x00\x45\x5d\x6a\xa7\xd2\xe3\xe3\xaa\xa5\x8a\x82\x96\x30\xd3\x76\xb0\xb4\x66\xdc\x85\xaa\xc4\x8f\xe2\x69\x94\x6a\x7b\xc7\x2d\x91\xeb\x37\xde\xd2\xf4\xa7\x7c\x68\x4b\xe0\x10\x93\xfd\x12\xde\x9d\x9d\x83\x19\x9c\xcc\x50\x95\x9a\x48\xd6\xe9\xa4\x14\x27\x56\x60\x92\xf0\x4a\x0f\x95\xca\x52\x37\x2e\x07\x62\xb9\x66\xce\x62\x32\x05\x5a\x4f\xd7\x57\xc6\x1b\x8b\xad\x83\xba\xef\x91\xa3\xc2\x77\x2f\xb3\x2e\xad\x8f\x59\x1a\xc1\xe0\x2b\xbf\x90\xa7\xf6\xc3\x90\x79\xb8\x6f\xb8\x14\xcc\x24\x2e\x98\x0f\x0b\x8b\x1a\x2c\xec\xb8\xe6\xd4\xe8\xa5\x21\x1b\xf8\xba\xbf\x38\xe8\x29\xab\x98\x83\x60\x8b\xd6\xd5\x9e\xa5\xe8\x36\xa9\xb4\xa4\xfb\xed\xed\x1b\xea\x2f\xfe\x97\x7e\x8c\xf3\x61\x5c\xa4\xa5\x0f\xea\x1f\x05\xf1\xfe\x53\xc8\xea\xc5\x00\x32\x3e\x1f\x52\xa8\x06\x83\x15\x39\x95\x79\x88\xd7\x9a\xcc\x7b\x54\xf7\xd0\x2b\x48\x0c\x46\x9f\xd6\x95\x40\xfe\xa4\xbd\xd6\x8c\xbd\xc6\x8c\xf9\xc7\x87\x2f\xd7\x92\x59\x1b\x01\xe9\xd9\x90\x2d\x8a\x61\x4f\x4c\x21\x82\x3f\x23\x50\x8f\xfd\x49\xff\x21\x8b\xea\x92\x2e\xc1\x41\xef\xf6\x0d\xa1\x77\xcc\xad\x7d\x7b\x9d\x44\x4f\x3b\x03\x45\x81\x15\xf1\x16\xcc\x6e\x37\x62\x5c\x39\xcb\xad\xf0\x93\x62\xf3\x1d\x33\xf4\xc1\x3c\x33\xb6\x29\x20\x07\xf2\xca\xfd\x19\x4f\x62\xc6\x43\xe7\xa2\x55\x71\x56\x4f\xeb\xad\x7d\x33\xe3\x64\xb6\x33\xd0\x08\xb0\x90\xd7\xa0\x91\x35\x8b\xc6\x9c\x56\x7b\x95\x22\xb5\xc1\xcd\x01\x21\x8d\x38\x52\x9a\xeb\xb0\x3d\x9c\x2a\x5e\xb2\x28\x5a\x71\x76\xf9\x8c\x28\x03\x6f\x21\xe1\x9e\x92\xb4\x06\xe9\x48\x95\xfa\x28\x1b\x35\x22\x8f\xbf\x76\xe7\x3e\x17\x58\xaf\x1b\x43\x4a\x4d\xf9\x8e\x8c\xc5\x56\xb9\xd8\x3f\x6b\x0b\x7f\xf5\x2c\x68\x0f\x65\xef\xe4\xe0\x0c\x59\xb4\x6c\xe5\x93\xbf\x98\x89\x98\x05\xd0\x2b\x91\x65\xb7\x42\x98\x49\xe7\x39\x53\x77\x0a\xe3\x93\xe4\xf1\xf9\x7c\xb9\x0c\xd6\x15\x9c\xc9\x39\x52\xae\x8a\x4d\x3d\x56\xa9\xa9\x5d\xf7\xcf\xab\xac\xd4\xd0\x30\xd7\x36\xea\x45\x4d\xfa\x4b\x4a\xed\x1b\xcd\x88\x5d\x2f\xbe\xa5\xff\xa2\xcf\x29\x27\xc1\x37\xc8\x6b\xe4\xfe\x01\x64\x12\x62\x8f\xe7\xa0\xa0\xf0\x2b\x6b\x6a\x9a\x21\x68\x93\x2b\x94\x3f\xf8\xb2\x8d\xd5\x87\xe7\x72\x87\x79\x0a\xaa\xa6\x9a\x98\x50\x6c\x76\x4e\x6f\x5b\xa6\x33\x8c\x09\xf3\x82\xe1\xb9\x87\xd9\x9f\x14\xa3\xe1\x95\x8c\xb6\x2a\xe6\x70\x5a\x57\x7f\x9f\xfc\x67\x30\x64\x01\x12\x87\x41\xa8\xd0\xaf\x03\xc0\xaa\xaf\x6a\xf0\x6b\xd8\x8e\xe4\xb0\xaf\x67\x03\xe0\xea\x60\xb0\x40\x9a\xce\x24\x57\x2f\xb3\x86\xe0\x7e\x9c\x22\xc9\x68\x6b\xdc\x66\xd4\xfc\xf3\xc7\x46\x1d\x38\x33\xa4\xc3\x01\x32\x43\x60\x7d\x4d\x15\x82\x17\x18\x73\x26\xdf\x51\x72\x5a\x6b\xc5\x11\x6e\x99\x0b\xef\x8a\x5a\x95\x79\x60\x02\x07\x20\x6b\xfc\x3a\x6d\xcf\x07\x46\xef\x75\x6f\xd9\x39\xe1\x87\xf6\x68\x75\x07\x16\xc0"}, +{{0x8d,0xa9,0xf5,0x4d,0xa0,0xb6,0xa5,0xa3,0x89,0x85,0xb8,0x8b,0x71,0x33,0x9d,0xc7,0x38,0x4c,0xfd,0x5a,0x60,0xbe,0xe1,0x59,0xc3,0x94,0xc2,0x23,0x63,0xbc,0x7e,0xdd,},{0x1a,0xc1,0xa8,0xed,0xeb,0x21,0x7a,0xe9,0xb3,0xa3,0xde,0x53,0x0d,0x24,0xd8,0x3e,0x11,0xfb,0x65,0x38,0xcc,0x70,0x9b,0x52,0x99,0x4f,0xa9,0xc3,0xf1,0xfa,0xdd,0xc8,},{0xf6,0xdc,0xc2,0xd2,0x7b,0xaf,0x16,0xc4,0xf4,0x81,0x7f,0x87,0x49,0x91,0x57,0xd3,0xac,0x1f,0x84,0xed,0x39,0x8a,0x5e,0x8b,0x0d,0x50,0xf4,0x2e,0xdd,0x73,0x85,0xcf,0x06,0x33,0x7a,0x02,0x36,0x10,0x99,0x70,0xb7,0x9c,0xa0,0x9d,0x7c,0x98,0x31,0xc8,0x76,0xa8,0x02,0x79,0x94,0x21,0xc2,0xab,0xd0,0x75,0x87,0xf5,0xeb,0x66,0x16,0x0f,},"\xbd\x53\xba\xba\x66\x57\xd8\xdb\x8b\xec\xae\x6e\xab\xff\xa5\x2b\x01\x5a\x5a\x05\xfd\xd2\xe0\x70\x64\x7d\xe9\x6f\x9c\xa4\xdd\x21\x9f\xe0\xda\x60\x8f\xa0\x44\x7f\x46\xd1\x7c\x9a\x35\x82\x44\xcd\x54\x08\x59\x65\x82\xcc\xd3\xcd\xd0\x15\x1d\x6f\x09\x23\xe6\x3d\x16\x68\x37\x84\x5f\x27\x3f\xca\x7a\xf6\xc8\x9d\x8d\x52\x46\x17\x5c\x21\x67\xfb\xb9\xc2\xeb\xf6\xa7\x59\x54\x91\xf9\x7a\x97\x13\xb0\x2b\xdf\x41\x3e\x20\x9a\xb2\x2d\xb7\xdd\x2b\x37\xfc\x49\x43\x69\x18\xcc\xeb\xe5\x74\x6b\xc6\x4d\xdd\x6d\xce\x19\xec\x45\x58\xc4\x0e\x08\x96\xe2\x19\x09\x28\x0c\xba\x06\xd1\x6b\x72\xf3\x1d\x98\x76\x85\xd0\x71\xdb\x81\x55\xe9\x9e\xbc\xc6\xc8\x21\xd9\x26\x83\xfd\xce\xe0\x86\x68\xa5\xed\x58\xf8\x39\xd9\xed\xaf\xb9\xf1\x45\x9d\x48\xde\x8e\x1b\xb6\xf7\xce\x84\xda\x0b\xe4\x11\xc8\xf7\xbe\x1b\x9a\x24\xbc\x5d\x0f\xe3\xa9\x6b\x02\x35\x07\x50\xa5\xcb\x25\x0b\x49\x55\x5a\x48\x76\x72\xbd\xff\x3c\x3f\x78\x4e\x3f\xb6\x3c\x1c\x97\xba\x6a\xe4\x3a\x10\xe1\x96\xf1\x88\xdc\xc6\x35\xe2\x14\xe2\x9d\xf5\x09\xe5\x60\x8a\x53\x67\xaa\x28\x00\xc1\xa9\x6a\xd9\x36\xa9\xe2\xa5\x79\xb8\x59\x2e\xc1\x3a\x35\x93\x36\xa6\x27\x88\xc3\xec\x55\xc0\xff\xd6\xa7\xd4\x9e\xcb\x7c\x68\x2e\xfa\x30\x81\x99\xf7\x08\xd7\x9d\x0e\x88\x56\x36\x6d\x26\x9f\xab\x24\xeb\x1a\x07\x5c\x96\xc8\x81\xca\xb8\x97\x08\xce\xd2\x79\x23\x0d\x3f\x1f\x3e\xe1\x73\x67\x22\x83\xeb\x8d\x8a\x82\x40\x38\xf6\x48\xac\x43\x72\x75\xd7\x5a\x0e\x15\xf7\x1c\xe5\x6a\x8a\xeb\x77\x1f\x07\xa7\xf3\x2a\xfc\x9d\x61\x2a\x13\xbd\x83\xb7\xf9\x39\x90\xd3\x8f\xc3\xf4\xf4\xab\x8a\xa9\x43\x0c\x65\x73\x6e\xb6\x4b\x16\x80\x6e\x99\x5c\x1c\xe9\xdc\xf4\xc5\x54\x4e\x7b\x3d\x01\x54\x1c\x57\x21\xbb\x4b\xe4\xcf\x0a\xe3\x82\xa0\xc1\xb1\x69\xd8\xe4\x18\xde\xfd\x55\x94\x42\xac\xea\x14\xb0\x0d\x70\x5b\xcf\xa7\x8b\xe0\x75\x6a\x8f\x37\x7c\xbf\x18\x3b\xf2\x59\x06\x87\x41\x15\xd8\xce\x4c\x3b\xa8\x74\x10\x29\x38\xa4\xea\x16\x03\x6d\x91\xa4\x2c\x5f\x8f\x18\x86\x55\xca\xcb\x00\xc8\x8e\x3a\x68\x50\x88\x16\xe5\xe1\xc3\x1d\x27\x18\x0b\xbb\xa9\x51\x8a\x96\x30\x72\x6d\x7d\x04\x7d\xd8\xd2\xc0\x40\x12\x19\xe1\x4e\x6b\xad\xfc\x9b\x95\xb7\x7a\x6a\xce\x9b\xea\x71\xd1\xb4\x7c\x21\x89\x03\xa1\x15\xad\x02\x9e\x7f\x20\x39\xea\x23\xcf\xd1\xfa\x6a\x44\xd0\x89\xfc\xac\xb6\x78\x15\x3d\x67\x4c\x0e\x08\x17\x64\x99\x55\x95\xcb\x68\x94\x89\x5f\x08\xe2\x5b\x98\x4e\x3a\x69\x4c\x92\xfc\x7c\xbe\x0f\xfc\x46\x97\x23\x0b\xcb\x0c\xa4\x08\xc2\xd7\x08\x5c\x11\xba\xde\xb3\xe6\xc0\xe7\x5e\x6c\x49\x8d\xb1\xbe\xc1\xed\x2a\x3e\x24\x45\xc3\x2b\x19\x13\xa8\x95\x00\xf6\x9e\x7f\x23\xf4\x1d\x62\xe5\xc1\x89\xf3\x9a\x05\x6c\xb9\xfc\x68\xa4\x52\x02\x3a\x33\x3f\x75\x22\x0c\xb9\xb9\x44\x84\xac\xac\x6b\xbc\x67\x1f\x59\xff\xa0\x72\xb7\x1a\x18\x96\xa1\xb3\x06\xe9\xdc\x55\x8d\xa0\xec\x20\xf3\x73\xe4\xc3\x55\xe0\xc5\xec\xcb\xbf\x13\x50\xc8\xc0\x79\x14\x89\x2c\x45\x4d\xef\xce\xfb\x71\x7b\xe3\x4d\x08\x7a\xeb\x24\x4a\x86\xff\x49\xa6\xc4\x70\xaf\xb3\x6b\x40\xfe\x8b\x71\xc5\x05\xa4\xff\x7a\xf2\x98\x4c\x65\x28\x49\x38\xec\x0e\x40\x52\x31\x52\x1f\x48\x10\x14\x7d\xc4\xe3\x73\xfd\xab\x66\x47\xb8\x6f\x79\x82\x75\x02\xfd\x08\x7e\x27\xf3\x10\xd6\xb3\x12\x36\x31\x13\x84\x21\x55\xc5\x7a\x32\xba\x03\xb6\xcf\xf9\x65\x53\x0b\xd7\x95\xfc\x29\x2e\x24\x1c\x9b\x6c\xa0\x85\x14\x00\x32\xef\xe7\x46\xf3\x7d\x57\xe9\x58\x42\x11\x84\xb8\xa4\xc1\xa6\xa1\xe3\x7d\x45\xe0\x77\x31\x98\x33\x06\x8d\xdc\xb8\x9d\x38\xc7\x5b\xeb\xa1\xa6\xe8\xe4\x05\x28\x88\xec\x18\x16\x2d\xd6\xff\x0c\x59\xa2\xfd\x0b\x47\xf3\x11\x91\x95\x68\x0f\xfc\xcd\xdf\x5f\x76\xb3\x5f\x02\x2a\xa6\x6b\xd1\xac\x56\xf1\xae\x33\x3e\x9b\x9d\x04\x6f\x0b\x79\xa8\x92\xec\xc4\xf8\xd2\xf3\x1e\x17\x53\x6c\x4c\x62\xa9\xb5\xe0\x63\xdd\x2d\xce\x37\xd3\xd0\xac\xb4\x20\x23\xeb\x2f\x2e\xa3\x29\xd3\x87\x6c\x23\x86\xa0\x22\x76\xff\xf9\xd3\x08\xab\xba\xdb\x72\x74\x30\x1a\x69\x62\xec\xae\xeb\x20\xbe\xf5\xe3\x6a\xff\xfc\x38\x7c\xa8\xe1\x85\xe5\x62\xb8\x65\xb4\x92\x04\xc1\x7b\x2a\x70\x11\x9b\x06\x1c\x29\xc0\xfe\x90\x04"}, +{{0x7a,0x2e,0xfd,0x39,0x01,0x24,0xd3,0xfb,0xef,0xc5,0x4a,0x57,0x71,0x06,0xe7,0x4b,0x2d,0x1f,0x5d,0xd5,0x04,0xc0,0x50,0xd0,0xd3,0x59,0xe5,0x3c,0x0f,0x5c,0x87,0x2b,},{0xef,0xc3,0x03,0xd9,0x22,0xe8,0x8f,0x70,0xf3,0x8c,0x1a,0x2b,0x92,0x06,0x84,0xef,0x66,0x30,0x34,0xa1,0xb2,0x3a,0xb9,0xd6,0x9b,0x6c,0xe8,0xed,0x87,0x06,0xf7,0xf7,},{0xc2,0x8b,0x34,0x80,0x48,0x05,0xd8,0x1f,0x7a,0xef,0x78,0x49,0x70,0x67,0x0e,0xda,0xa4,0x17,0x23,0x2b,0xcc,0x67,0xda,0x9b,0x51,0xe9,0xc3,0xd7,0x4f,0xc4,0x99,0x1b,0xde,0x97,0xa0,0x6b,0xd5,0x3f,0xa0,0x0b,0xb4,0x40,0xfd,0x56,0x16,0xcd,0x0d,0xe6,0xe9,0xb0,0xd1,0x9f,0x2f,0x68,0xbf,0xaf,0x9d,0x4c,0x51,0x72,0xc4,0xe5,0x20,0x0a,},"\x23\x8f\xbe\x9f\xb3\x5c\x72\x5c\x6c\x1f\x32\x92\x48\x09\x4b\xc7\xda\x1b\x27\x3e\xdc\x76\x99\xa7\xe3\x45\x2b\x57\x88\xd8\x78\x67\xde\xfc\x40\xa0\x05\x90\xe8\x75\x80\xd2\xc0\x27\x5d\xf5\xab\xcc\xe0\xe1\xaa\xa1\x82\x90\xbf\x93\xb4\x4e\x5a\xd9\xd7\x60\xdd\x21\xf1\xaa\xca\x38\x31\x78\xf9\xff\xf9\x13\x0f\x73\x18\x7b\xa9\xd3\x1e\xa3\x60\x4a\x1c\xdf\x39\x11\xe1\x43\x77\xa0\xce\x8b\x44\x18\x9a\xda\xa7\xaa\xc2\x3b\x6c\xdc\x7a\x42\x5b\x7e\xa7\x45\x50\x84\x55\x70\x4f\x9a\xd7\xa8\x95\x27\x18\xc3\x98\xb4\x21\xb6\xe0\x9c\xb7\x8c\xb5\x2a\x18\x14\xee\x2e\x96\x39\xec\x68\xd3\x61\xf0\xa3\x20\x41\xd6\xe7\x42\x5b\x4b\xb3\x3c\x70\x19\x6e\x24\x00\xeb\x81\x2d\xb8\x50\x6c\x9f\x32\x45\xbd\x98\x8f\xbc\x89\x1b\xe2\x0c\xb0\x69\x15\x59\xfc\x91\x6b\x57\xff\x96\xc9\xb1\x44\x89\xe0\x99\x3c\xb7\x39\xa3\x9d\xa2\x46\xd0\x1a\x6e\xbd\x07\x58\x35\x81\xf2\x50\xbf\x48\x0b\xc4\x4b\x2c\x33\x91\x54\x2d\x59\x5e\x4d\x39\x94\x90\x19\x5f\x84\x45\xdf\x63\x8f\x34\x69\x8f\x1a\x96\xed\x27\xb3\x53\x3e\x3e\xb6\x7e\x8f\x86\x58\x65\xfa\x95\x55\xed\x34\xdf\x11\x15\x76\x41\xa0\x0e\x6d\x60\xcf\x62\x3f\xec\x1a\x92\xb8\x7a\x15\xd7\x65\x18\x5f\xd9\x05\x5a\xcb\x38\xd7\x5c\x99\xdb\x4f\xce\x7b\x0e\x39\xfd\xc3\xf8\x51\xda\xf6\x5c\x7a\x33\xf4\x64\x81\x69\x31\x83\x9f\xef\xe8\xe5\x8d\x9a\xb7\x42\xb8\x61\x87\x3f\xd2\x29\x18\x9e\x59\xcd\x4c\xe8\x23\x9f\xc9\x54\x3f\x53\x9d\x2d\x29\x61\x14\x26\x6e\xa8\xc6\xfd\x15\x2a\xc6\xb3\x42\xe5\xd1\xa5\x57\xab\x35\xca\xc5\x1e\x2d\x12\x12\xee\x31\x7c\x4d\x26\x71\x68\x29\xe2\x57\x46\xdf\x17\xd2\xa6\x22\xc2\x43\xf3\xec\xbb\x65\xf5\x7a\xb0\xf4\x27\x0e\x3d\x06\x68\xa9\x62\x50\x22\x45\xb9\x4c\x06\xdf\x0c\x5e\x39\xe3\x53\xaa\x84\x2e\xa0\x80\xcf\x50\x27\x08\xb1\xdd\xa2\xd0\x01\x82\x4d\xe4\x58\xd3\x77\x62\xaf\x2c\xdf\xd5\xa6\xd3\xf3\x5e\x08\xa1\x8e\x14\xaa\x7a\x64\x2c\x51\xe4\x04\x7e\x63\x75\x17\x84\x6d\xf6\x46\xd0\x73\x36\xfb\x17\x24\x34\xe0\x88\x3e\x2b\x77\xd8\xed\x1c\x52\xc9\xcc\x63\x6a\x56\xa1\x9e\x57\xa5\xf1\x61\xb9\x2d\x1d\xcb\xfa\x49\x6f\x34\x4a\xe6\xd4\xdf\xdc\x95\x69\xad\xe4\x57\xa4\x90\x91\x36\x2e\x5a\x0c\xdd\x81\xb3\x75\x32\x43\xfd\xac\x30\xa2\xd2\x7e\xa0\x26\xa5\xe6\x01\x44\x1e\xcd\x55\x37\xa7\x20\x1b\xdc\xb7\xfd\x58\xb2\x40\xd0\x22\x9f\xdd\x9b\xab\xf1\x12\xb5\x69\x48\x12\x25\x0e\x76\x8d\x7c\x0c\xe6\xca\x56\x5a\xd0\x6a\xb8\xf7\x8a\x5c\x99\x50\xee\xf5\x38\x72\x6f\x57\x6c\x4b\xd2\xe0\x75\x5c\x7f\x98\x39\x29\x37\x2a\x5f\xe1\x1c\x73\xf9\xe1\xfa\x45\x3a\xb5\x4b\x58\x17\xaa\xd3\x59\x67\x56\x12\x7d\x84\xe3\x11\x94\x53\xe8\x82\x5b\xb8\x46\x0d\x85\x1f\x1f\x7e\x4a\x28\x38\xa2\xbe\x78\x6b\x23\x35\x04\xa6\x91\xdb\x0f\xa2\x2a\x5f\x41\xfe\x3f\xd3\xc9\xb5\x38\xb0\x4f\x40\x9e\x09\x18\x09\x48\x6b\x28\xad\x0d\xed\xa7\xb3\x8a\x42\xce\xfc\x48\xde\x7d\x86\x79\xc0\x3b\xf8\x77\x23\x85\x11\x82\x0d\x07\x70\xcc\x8d\x7b\x41\x72\x37\x78\x23\xa0\xb9\x91\x49\xab\xb8\x91\x8b\xfb\x66\xd5\xab\xfc\xd1\x00\x60\xb0\x5c\xb4\xf2\x39\xdd\x42\x81\xd9\x34\x83\x50\x4b\x73\x1e\xaf\x5a\xdd\x51\x5f\x1f\x3c\x3b\x52\xb4\xe3\xbd\xaf\x97\x6a\x17\xb3\xc9\xec\x61\xbf\xc8\xe7\x71\x16\x71\x58\x04\x53\x2c\xf2\xdb\xf2\x0b\x7b\xa5\xea\xd8\x5a\xfb\x95\x2b\xee\xc2\xfc\xcf\xf8\x5f\xf5\x07\x2b\xa4\xed\x6b\x54\x38\xab\x15\x20\xc6\xef\x4b\x0b\x26\xf1\x2e\x84\xae\xdd\x65\xce\x5c\x7b\xbe\x6a\xcb\x67\x72\xf5\x93\xa6\xb4\xf8\x1d\xdd\x9d\x50\x27\x46\x50\x50\x47\xc8\x12\xa0\x06\x7a\xfc\xeb\x8d\xc9\xbf\xf3\x0d\x40\x87\xf8\xd5\xa3\x75\xec\xa6\x05\xa0\x62\x27\x84\xd8\xfe\xa2\x78\xcd\x1a\x52\x41\xad\x4b\x3f\x1b\x91\x4f\x74\xf7\x3b\xc3\x6e\xe7\xcc\x82\xd9\x6e\xfd\xa6\x3a\x3b\x67\x99\x73\x0f\x20\x65\x6c\x12\x35\x6c\x79\x06\x9b\x2b\xe6\xf9\xb7\x7b\xe1\x01\x98\x31\x18\x82\x3e\xa6\x6e\x7c\x20\x98\xfb\xc7\x2f\xc9\xc0\x39\xdf\xe3\x0f\x2d\xab\xa1\x3c\x3b\xde\xfb\x8a\x78\x0b\xeb\x5c\xb1\xb6\xc2\x86\xa6\xb3\xef\x48\xfd\x15\xc6\x6c\x04\x5b\xa2\x9f\x09\x70\x41\x3b\x98\x8d\x0e\xa0\x04\xab\x84\xc9\x39\x19\xf0\x4f\x9b\xf8\xca\xf5\x8c\x4e\xb4\x78\xf3\x58\xef\x8b\x68"}, +{{0xef,0x36,0x48,0xcb,0xe7,0x34,0x02,0xab,0x45,0x0c,0xd6,0xec,0x37,0xe5,0x45,0xd0,0xcd,0x2c,0x99,0x9e,0xcc,0x1f,0xa3,0x81,0xa4,0x5c,0x66,0x0e,0x18,0x53,0x30,0x32,},{0x52,0xa1,0xa4,0x52,0x73,0x87,0x26,0x76,0x58,0x2c,0xc7,0x67,0x33,0x99,0x26,0x41,0x4c,0xd5,0xd0,0x3d,0x98,0x0c,0xf6,0x29,0xdd,0xa2,0xd1,0xa2,0x05,0xe9,0x83,0x0a,},{0xf6,0x70,0x79,0x29,0x42,0xec,0x41,0x44,0x28,0x47,0x56,0x38,0x85,0x3c,0x42,0x72,0x8e,0x86,0xba,0x12,0xbb,0xe8,0x59,0x48,0xb3,0x91,0x34,0xcf,0x6e,0x2b,0xd1,0x28,0x13,0xe0,0xd8,0x3e,0x51,0xe6,0x57,0xc9,0x01,0x07,0xad,0x93,0xa4,0x78,0x8a,0xa3,0x83,0x13,0xfa,0x96,0x2f,0x67,0x67,0xa8,0xf7,0x80,0x5b,0xde,0x65,0xca,0x42,0x0d,},"\x6a\x93\x37\x8f\x88\x0c\xf0\xff\xdb\x8e\x07\xd6\x83\xcc\x35\x2e\x2a\x10\x33\xc4\x50\xba\xa0\xe8\xc4\xe1\x62\x05\xfd\x0c\x02\x74\x3b\x0e\xa0\x64\x97\x1d\x91\x1e\x49\x47\x13\xe6\xd9\x4a\x02\x17\x2e\xd0\x14\xd5\x06\x59\x2e\xc6\xc7\x0a\x9c\x97\x85\x52\x46\xbf\x3d\x26\xf3\xcf\x74\xf4\x93\xc1\xb6\x97\xa0\xc4\x14\x16\x0c\x34\x14\x12\x83\x09\x85\x43\x08\x06\xa0\xcb\x3c\x84\x75\xe7\xe5\xa9\x73\x68\x6c\x24\xd5\xef\x1b\xe7\xd0\x06\x50\x96\xfe\xb5\x2e\xab\x26\x0b\x5c\x48\x8a\xf0\x92\x70\xde\x6d\xec\xd3\x3f\xea\x85\x89\xdd\x10\x21\xba\xf4\x1e\x3f\x25\x5f\xb8\xfa\x19\x16\xeb\xd8\x53\x1e\xeb\x2f\x88\x6b\xb3\xb3\xb0\x4f\x9a\xf6\xb2\x76\xc3\x59\x23\xf1\x0d\x3a\x0a\xf1\xe3\xf5\x8b\x0d\x15\xae\xd1\x65\x04\x5f\x20\x6f\x3f\x43\x0a\xbd\xff\x09\x44\x90\x97\xe4\xb2\x6d\x00\xa8\xf9\xf1\xe8\xf7\xa1\x9f\x38\x58\x81\x24\xc3\x28\xec\x43\xa9\xcf\xb4\x3d\x3b\x2c\x6b\xdf\x6a\x3c\x1a\x10\x2e\x0e\x33\x3d\xe1\xac\x21\x4a\x6d\xf7\x6d\xab\x44\xba\x76\xbf\x03\x52\x73\xb7\xff\x62\x38\xec\x82\x48\x3b\x2d\x2d\x9d\x54\x29\x1a\x72\x27\x0f\x88\x93\x3b\x78\x6c\xac\x05\x1d\x99\x0b\x3c\xf7\x40\x84\x5f\xed\x3a\x67\x86\x7d\x7c\x7c\x05\x67\x4e\x7c\xb0\x2c\xa5\xb7\xac\xdf\xba\x38\x52\x80\x3a\x3d\x56\xc4\xd5\xc1\x3b\xb1\xd7\x72\x34\x67\x74\x1e\xac\x1f\x2a\x7a\xcd\x3a\x95\xf3\xa5\x16\x10\xa4\x86\xfc\x53\xa9\x85\x16\x28\xc5\x57\xd3\x6d\x8a\x4c\xd3\x7a\xae\x9c\x41\x74\xdb\xbd\xb6\xbd\x88\x5c\xf4\x0b\x38\x2b\x8d\xed\x24\xa4\x52\x2a\x27\x8f\xef\x76\xc4\x53\x19\x06\x7e\x55\x28\x6e\x7b\x08\xc6\x03\x48\x6e\x38\xa0\xac\xf4\x7e\xde\xf8\x48\xec\xbe\x94\x2e\xce\xad\xb8\x63\x6c\x83\x3f\xeb\x88\x2a\x51\xa4\x59\x5e\x24\xf6\x07\xca\x3c\x9d\xa1\xb2\x40\x4c\xe5\xc7\x47\xe0\x62\x64\x17\x4d\x64\x50\x43\x31\x70\x9b\xef\x30\x05\x5a\x5d\x69\x5e\x09\x53\x7c\x8f\x8c\x1e\x5a\x3a\x5d\xb0\x65\x99\xe3\x19\xdf\xdb\x28\x72\x96\x65\x27\x3b\xf8\x68\x95\x5e\xa5\x64\x27\xf0\x8b\xac\xd7\x77\xf1\x79\xb3\x02\xf3\xf6\x8d\x04\xf3\xf3\x88\x3d\x34\x49\x55\xb6\x55\xdd\xc6\xd5\x28\x2b\x6d\x4d\xf1\xd8\x36\x30\x21\x0e\x69\x91\x78\xe1\x1f\x72\x2e\x9e\x5c\xda\x67\x28\x92\xae\x9b\x23\xe8\x16\x9c\xbb\x54\x80\x93\xb8\x3e\x64\x3e\xb4\x99\xd9\x37\xd2\x8f\x38\x11\x59\x7b\x64\x84\x10\x2f\x0c\x8e\xb8\xc8\x88\x8c\xda\xc2\x29\xae\xbf\x89\x08\x6a\x64\x95\xac\x55\x1f\x3b\xbd\xf2\xd1\xc9\xa9\x3e\xd1\xd3\xa8\x61\xee\xcd\x9e\xb8\x39\x94\x9b\xfb\xe6\xa4\xf6\xe6\x48\x6e\xde\xda\xb5\x22\x9d\x53\x2b\x58\x97\x6d\x67\x51\x2f\x9f\x71\xae\x79\xb4\x14\x5c\xa2\xfa\x49\x7a\x16\x5f\x11\x07\x17\x66\x6c\xa3\x34\x0b\xbd\xa8\xdf\x1f\x82\xb8\xc0\x54\xcf\x76\x54\xc3\x56\x90\x16\x8f\x96\x27\x7d\x41\xc1\xc2\x36\xb6\x81\x98\x17\x3c\x6e\x2b\x0a\x20\x8e\xf8\x3c\x02\xa4\x3e\x47\x3d\x90\x68\x6a\xce\x75\xb5\xbd\x32\x1b\x3f\x54\x28\x13\x27\xa6\x73\xca\xd4\xd4\xad\x30\x40\xd4\x8c\xf4\x93\xea\x23\x1b\x3f\xec\x06\xf3\x99\x32\xd7\xf7\x0a\x38\x42\x8d\xf8\xfe\xe4\x37\x05\x32\xae\x5f\xb1\x12\x05\x9f\x0a\x1d\x4f\xbe\x11\xb5\xa2\x3b\xb8\x76\x35\x42\x9e\xd3\x3a\xd1\xf6\x14\x80\x14\xcb\xc1\x60\xd9\x3c\xa2\x59\x20\x53\xa6\xe9\x53\x78\xd6\xcd\x3f\x50\xdb\x52\xbe\x92\x8e\x40\x92\xfe\x5d\x2b\x70\x95\xa9\x56\x68\x64\xad\xfd\xa5\x9f\xd5\xf2\xfb\x62\x54\xbd\x59\x17\xb7\x0f\xa1\x46\x99\x66\x5a\x37\x29\x7c\x98\x3c\x1b\xb9\xef\xe1\xc6\x7b\x41\x3d\xd1\xa8\x53\x0c\xbf\x22\x72\x97\xa8\xbb\xf9\x3a\x8a\x02\x45\x4e\x8e\x46\x1a\xc2\x12\xb8\x46\xa7\x0d\x5d\x56\xd6\xc3\xa6\xe6\x5a\x03\xbe\x05\x80\x21\x9b\xdd\xec\x88\xd4\x03\x89\x11\xfd\x95\x74\x56\x3f\x33\xe0\xf9\xe6\x04\x46\x88\xd3\xdd\x48\xfa\xc7\x03\x86\x9a\xa0\x9d\x96\xef\xee\x7d\x6c\x68\x07\x1d\x99\x22\xd5\xe8\xed\x8d\xc4\x0f\x1b\x79\x8f\x1c\x58\x0f\x78\x59\xcb\x84\xf1\xe1\x4b\x5e\x74\xdd\xea\x16\xad\x5c\xbe\xea\x4c\x48\xfb\xcf\xfd\x29\x53\x1a\xcc\xc0\x63\x39\x38\xe3\xbc\xb2\x21\x26\x76\xb6\x1e\xf9\x01\xe9\xc8\x31\xa4\x17\x74\xd8\x31\x7e\xf3\x5a\xf7\x69\x90\xbd\x24\x93\x1f\xde\x6d\x40\x7e\x22\xe7\x63\xcf\x6a\x57\x90\xb2\x37\x61\x90\x8e\xee\x60\x96\x37\xa2\xc1\x10\x59"}, +{{0x2c,0x8e,0xe7,0xfa,0x9b,0xa2,0x8c,0xe7,0x04,0x96,0x76,0x08,0x7b,0x11,0x63,0xb2,0x41,0x11,0x8d,0x34,0xcd,0xf5,0x34,0xae,0xbe,0x8b,0xa5,0x92,0x82,0xa6,0x2a,0xc2,},{0x24,0x4c,0x24,0xf5,0xec,0xb2,0xdd,0x1d,0x14,0x63,0x51,0x22,0x21,0x32,0x5d,0x73,0xc8,0x1e,0xe4,0xd8,0xad,0xb8,0xe0,0x1e,0x23,0x34,0x5c,0xaf,0x9c,0xa5,0x35,0x3b,},{0xca,0x0b,0xb6,0xc1,0x23,0x56,0x55,0x5f,0x6e,0x1d,0x8f,0x5c,0x8a,0xa7,0xb5,0xe8,0x0c,0xd2,0x80,0xe8,0xb1,0xb9,0xba,0x2e,0xc9,0x55,0x0f,0x62,0x2f,0x48,0x2c,0x3a,0x9a,0xd3,0xbe,0x03,0xa4,0xc9,0xdf,0xc1,0x0d,0x01,0x12,0xb0,0x18,0x9d,0xe9,0x4b,0xff,0xaf,0xd7,0x03,0x41,0x14,0xe0,0xe0,0xd4,0x2c,0x23,0xf3,0x2d,0xc8,0x18,0x07,},"\x07\x66\x9a\x89\x64\xf0\x63\x80\xd2\xd4\x98\x2c\xb6\x34\x9d\xe5\x50\xb3\x8c\xbc\x35\xdb\x2c\xe5\x72\xde\x88\x7f\x66\x30\x55\x73\x6f\xaa\xc7\xec\x07\xc3\x2d\xf6\x0e\xe2\x59\x84\x22\xbf\x37\xe7\xcf\x31\x9a\xb3\xc9\x05\x56\x08\xca\x0c\x49\x75\x7d\x76\x88\xe2\x01\x3b\x82\x44\xf3\x54\x04\xf4\x5a\xc2\x19\x49\x7f\xe9\x24\xde\x93\xa5\x8d\x0f\x72\x1a\xed\x78\x25\xf6\x3b\x26\x67\x07\x7c\x16\x1e\xb4\xdd\x8b\xf7\xdd\xbd\xbb\xc1\x9a\x9e\xae\x59\x78\x97\x8d\x5a\xeb\x33\xa0\x6d\xde\x18\xe6\x12\xe0\x5b\xdb\xca\xe0\x16\x1a\xa2\x38\x90\x38\x02\x64\x29\x96\x0d\xda\x3a\xa1\x7e\x96\x7d\x10\x77\x3c\xa4\x97\x35\xd8\xec\xd7\x40\x9b\xe1\x65\xc0\x9b\xb0\xb5\x09\x69\x1d\x59\x1c\x18\x5c\x93\xcd\xee\xae\x95\x35\x23\x16\x54\x46\x80\x52\x38\x21\x45\x8c\xac\xcf\x52\x8a\xc0\x45\x4e\x4c\xdd\xc6\xdf\x0d\x1e\xa5\xf1\xf5\xcc\x1e\xee\xe0\x5e\x19\xa2\xad\x0b\x6a\x49\x73\x6e\xd8\x55\x23\x36\xfc\xfc\xad\xbd\x93\x1b\x0b\x8e\x96\x3b\xe0\x5c\x8e\x70\x37\x38\x85\x52\x51\x2b\x68\x23\x58\x3e\x4a\x14\x38\x4c\xef\x50\x29\x23\x2d\x3e\x0b\xaf\xe4\x66\x35\x1b\x4b\xb3\xf5\x67\x54\x5a\xb4\x1f\xa4\x6b\xff\xaf\xa8\x77\xa1\x2b\x38\xa2\x7a\xbd\x64\xf7\x7f\xbb\x4d\xb4\x66\xff\x7f\x70\x65\x04\x14\x1d\x3a\xdd\x0d\x73\x72\xf1\x6f\xe3\xd8\xc6\x9f\x62\x99\xd9\x39\x66\xd6\x24\xa3\x07\x0e\xad\xb8\xb4\x9f\x29\xfa\xb4\x84\x4c\x75\x28\xa2\xa4\x0b\x66\x98\x70\x60\x69\x5c\xaa\x66\xb8\x67\x18\xc5\x10\x49\xac\xf4\xcf\xad\x38\x53\xed\xb4\x92\xe3\x68\xcb\xd0\x73\x96\x8e\xca\xa4\xa1\xee\x60\x46\xb5\xe8\x26\xe9\x01\xf4\xa8\x08\xc0\x42\x7c\x02\x6f\xe2\xf7\xb2\xe1\x96\x86\x67\xb5\x3a\x7d\x36\xd7\x02\xf2\xff\x82\xc6\x42\xd3\x49\x19\xf8\xe9\xaa\xaf\xe4\x62\xa3\xd4\xf9\x26\x92\xde\xac\x75\x2b\xe3\x48\xf5\x4c\xf0\x89\xdd\x9c\xd0\x51\x84\x6b\x04\xb7\x19\x31\xe1\x9e\x89\xd1\x25\x86\x4b\xfa\x89\x48\xac\xe0\xef\xf3\x3c\x45\x11\x05\x69\xa0\xdf\x37\x53\xf4\xc5\x8d\x80\x02\xb5\xbc\x38\x10\x2e\xc2\xec\xf6\x95\xfa\xfa\x89\x16\xda\x90\x02\x38\x7e\x44\xf9\x6d\xab\xf8\xa9\x82\xc5\x3c\x9b\xad\xbc\x37\xbd\xe4\x37\xf1\x46\xf7\x7d\x8f\x7b\xaf\x12\x87\x31\x96\xb0\xc3\x61\x93\xaf\x55\xf5\x42\xd9\x96\x8a\xed\x80\x69\xab\x9f\xbc\xd6\x81\x4e\xc4\x72\x79\x9a\xd0\x9c\x73\x0d\x41\xed\xde\xca\x3b\x62\x69\xd3\x1a\xb5\x23\xb5\x95\x47\x07\x73\x76\x34\x5b\x05\xf2\xae\x69\xb4\xee\x72\x8c\x86\x3d\x1b\xc0\x4e\x9b\x7d\x3d\x0f\xcc\xeb\x35\x9c\xbd\x08\x58\x59\x7a\xf2\xd6\x06\x3e\x25\x3f\xae\x2c\x3f\x25\x03\x4c\x33\xed\x59\xed\xd2\x78\x28\x68\x29\x86\x81\xca\xf5\x64\xdb\x8d\x19\x36\x6f\x34\xea\xe8\x5b\xa7\x3c\x1e\x23\x89\xb0\xdd\x78\xa9\xd2\xca\xa0\xf2\x3c\x9a\xd5\xf6\xcd\x9f\x2c\x4a\xd5\xd5\x89\x46\xad\xb7\x18\xcb\x83\xda\x58\xe2\xfc\xbb\x60\x25\xbe\xf4\x66\x0a\x83\xe0\xaf\x55\xe2\x03\x08\x02\x93\x2f\x2a\x89\x6a\x09\x60\x79\xb7\x54\xc9\x9f\x7b\x64\x23\xb4\x5a\x86\x47\x2e\x67\x23\xef\x88\x96\xc4\x32\x4c\x73\xd3\x4a\xd5\x8a\x4c\x01\xb3\x8a\x97\xc7\x3b\xe5\xaa\x7f\x74\xa2\xfa\x4d\x07\x95\xaf\x6d\xbf\xcd\x6d\x4e\xb4\x42\xa7\xe2\x04\xdb\x4e\xcb\x1f\x8a\x22\x6b\xdf\xa2\x1b\x6e\xb1\x71\xc9\xe5\x9f\x1a\x19\x2e\x23\xa7\x6c\x35\x2b\x04\xd8\xa8\x02\x33\x98\x5b\x77\xa2\x9c\x02\x01\x19\xce\x65\x1c\x7f\x41\x83\xd0\xe9\xc1\x9f\xe1\x8a\xa1\x02\x0c\x25\xe4\x58\x9d\xee\x34\xb9\x01\xbd\xaf\x9f\xf9\x45\x0c\x91\xaf\x3c\x1d\xb6\x70\xb4\x77\xe0\xac\x21\x07\x69\x6c\x9e\xc0\xd3\x1d\x82\x64\x7b\x68\xea\x19\x49\x9f\xe3\x4a\x8e\x2e\x7b\x37\x8d\xc7\xe7\x54\x24\xe8\xc4\x56\x45\xb0\xc2\x81\x8e\x9f\x88\x5a\x1c\x58\x41\x5b\xba\x1c\x3f\x2a\x77\x54\x9b\xdc\x46\x80\xdb\xcd\x16\x50\xc7\x5d\x0f\x45\x2a\x6b\x20\x85\x91\xdf\x0f\xa6\xe1\x81\xda\x2a\xbf\xab\x44\x46\x21\xd5\xf7\x7c\x2c\xd7\x95\x56\x46\x72\x46\x44\x7a\x89\xf0\xaa\xac\xad\x66\x0c\x9a\x92\x5e\xba\xfb\xad\x43\xc4\x78\xa3\xc8\x50\xa2\x7e\x01\x01\x9d\x88\xa5\xb1\xdc\x81\xb5\xd2\xe9\xf7\x40\xa0\x28\xcc\xb7\x2c\x1a\xcf\x89\x7e\xa5\xad\x89\xe0\xf9\x44\x88\x88\xd5\xb1\x5c\xe6\xe4\x29\x77\xf7\xa7\x29\x15\x5a\x28\x4d\x11\x87\x58\xac\x65\xf3\xfb\xb9\x8d\xeb\x65"}, +{{0xdd,0xd8,0xe9,0xff,0x85,0x56,0x79,0x89,0x6a,0x13,0x97,0xb4,0x27,0xdb,0x85,0x43,0xab,0xe8,0xbb,0x5d,0xd1,0x22,0xe3,0xe3,0x02,0xcc,0xfc,0xe5,0xfd,0xc6,0x3e,0x12,},{0x5a,0x9a,0x31,0x2e,0x89,0x2a,0x10,0xb9,0x8d,0x0d,0xcd,0xd2,0x8d,0xb3,0x48,0x1c,0x3c,0x28,0xad,0xd5,0xad,0x0b,0x19,0x46,0x16,0xda,0x4a,0x3d,0xf7,0x66,0x01,0x09,},{0xdf,0x84,0x9b,0x7b,0xd2,0x97,0x45,0xf8,0xbe,0xcd,0xdd,0xf6,0xc9,0xba,0xf0,0x94,0xd7,0xa9,0x8c,0xc9,0x33,0x8c,0x34,0x4e,0xca,0x17,0xfd,0xe0,0x75,0xfd,0xa8,0xd1,0x54,0x32,0x99,0xf6,0x25,0x98,0x23,0x17,0xdb,0x7b,0x3c,0x77,0x3b,0x64,0xf7,0xd1,0xf2,0x86,0x92,0xac,0x45,0x3b,0x81,0xd7,0xec,0x7b,0x7e,0xc3,0x41,0x7a,0xce,0x04,},"\x5e\x8f\xee\xc5\x09\x35\x0d\x2e\xe7\x95\x5b\x6f\x3e\x27\x82\x78\xa4\xcb\x48\xae\x72\xb4\x65\x89\xe4\x78\xbe\x59\x74\x7d\xf5\x39\x4a\x16\x9f\x19\xe1\x0d\xb5\x32\x02\xa6\xa5\x23\x20\xb6\x3a\x9a\x2b\x72\x3f\xd3\x1a\xa2\xdb\x6d\x58\xc5\x73\x32\xda\x31\x78\xbc\xf9\x66\xc5\x3a\xbd\xa3\x5f\x12\xda\xef\x9e\xdc\xf3\x99\xe4\xa8\xc5\xf8\x3d\x36\xf4\x4a\x17\xd7\x98\x46\xbf\xc9\x6c\xe6\x90\x19\x4c\x21\x9a\x29\x89\x2f\x03\x67\xa7\xab\x38\x44\x83\x78\x79\xe3\x81\x8d\xb8\xd7\x0c\x4e\x3f\xba\x4d\x28\x07\x34\x64\xdf\x20\x85\x95\x10\x38\xfe\xa4\x32\x81\xb6\xb6\x06\xdc\x88\x46\xb3\x0b\x07\x63\xf2\xca\x82\xbd\x50\x21\xf9\x11\x70\x35\xa7\x7b\xcd\x10\x75\x47\x7c\x5f\x43\x21\x43\x34\xd4\xd4\xce\xdd\x18\xf7\x38\xd6\x76\xc7\xb5\x1a\x18\x5f\xfa\x8d\x04\x10\x11\x86\xa4\x95\x2b\xbd\x87\x22\xf5\x39\x90\xb6\x06\x37\x04\x1e\x11\x4a\xeb\x8c\xe7\x11\x11\x31\xd4\xdb\x3f\xb4\xd3\x5d\x99\x5a\xd8\xd6\x65\x0c\x0c\x4c\xcd\xce\x9d\xcc\x39\xdb\x18\x8a\x68\x78\x55\x62\x74\x06\x26\xb3\xae\x3e\x02\x3f\x40\x77\x2d\xed\x87\x6a\x45\xcb\xef\x74\xa0\x58\xfd\x78\xc1\xa1\xff\x2c\x24\x51\xe1\x11\xac\x1b\x4b\x7e\xe4\xc8\x1c\xd7\x63\x10\xd4\xd2\x98\xfb\x3c\x49\xf5\xe6\x40\x19\x08\xa6\x30\xfa\x85\xdb\x74\x71\x80\x4f\xe9\x90\x84\x7f\x0f\x75\x94\x72\xf5\x93\xdc\xf0\x2e\x11\x3e\x15\xe5\x64\xd3\x0d\x59\x84\x69\x2d\xa5\x5b\x0b\x7f\x22\x19\xc4\xac\x16\x26\x51\x1a\xcf\x19\x4d\xc7\x02\x6e\xb9\xd3\x67\xa4\xa2\xf1\xdf\xb5\x15\xcb\x2c\x08\xda\x4f\xe5\x95\xc8\x58\x11\x12\x0c\xba\x2a\xe7\xb6\x6e\x67\xc9\x1f\xb8\xfb\xcb\x9d\x99\xf1\x3e\x50\xfd\x67\x46\x4d\x90\xc8\xdc\xf6\x93\x55\x23\xcf\x6d\x13\xfd\xd1\x06\x35\xb9\x23\x2b\x7a\x61\xdc\xec\x9a\x2b\x92\x10\x61\x41\x0d\xf1\xde\x6a\x45\x16\x7f\xb9\xf6\xf1\x09\xdc\xc0\x88\x91\xf2\x03\xb2\x74\xa3\xb6\x82\x71\xb3\xf3\x5e\x74\xf9\x4b\xdc\xed\x0c\x5f\xf8\x63\x71\x73\xa1\x76\xe7\xda\xcc\x81\xf2\xcd\xc4\xfb\x0d\x52\xd1\xdf\xa7\xf2\x7b\x55\x2f\xd8\xd8\x7a\x1c\x55\xd6\x94\x7f\xd9\x2e\xd3\x25\x3f\x95\x94\xdb\x7d\xf1\x7a\x7f\xc6\xa7\x5e\xcf\x4f\xaa\x4d\x1e\x21\xb6\x76\xb3\x72\x7d\x77\xfb\xd4\x3f\xa7\xbe\x76\xbf\xb5\x8f\xc3\x09\xe5\x67\x5f\x0a\x85\x9c\xc4\x7f\x37\xb1\xbf\x45\x59\x32\xd8\x24\xe8\x63\x78\xde\x7a\x7e\x8c\x40\xce\xd2\x20\x90\x04\x4d\xbb\xf9\x1c\x70\xe5\x28\xea\xcd\xef\x37\x85\xba\x3c\x69\xa3\x73\x5a\xf6\x70\x9c\xd7\x6a\xab\x28\xa6\xac\xa6\xe8\x44\x97\x4b\x10\xb3\xfb\x7b\x09\x86\x00\x7a\x72\x7c\x2c\x8f\xc9\x5b\x25\xf3\x1f\x14\x6b\x36\xac\xd4\xc5\x37\x07\x49\x20\xaf\xf2\x47\xde\x0f\x17\x9c\x13\xca\x57\x79\x0a\x6a\x71\xd6\x2e\x23\x32\x1c\xcc\x75\xb7\xf3\xb0\xaf\xa0\xd0\x35\x27\xc9\x11\x4a\x7d\x4e\x30\xc1\xac\xe6\xd7\x71\x20\x13\xde\xe6\x66\x99\xaf\x9c\x56\x1c\x44\xae\x61\x98\xed\x39\x10\x4e\x60\x61\xae\x2c\x45\xa9\xa3\xc7\x4b\x5d\x0f\xbc\x4a\x33\xe8\xdf\xe2\xa8\xac\xc9\x51\x1e\xf7\xe6\x56\x71\x33\xf9\xfe\x35\x54\x28\x4a\x75\xa0\x59\xa6\x49\xdd\x24\xec\x04\xa5\x77\x30\xc6\xd2\xe9\xbf\x11\x4e\xa5\x8a\x89\x94\xab\xdb\x0c\x19\x43\x24\x15\x72\xc7\x9e\xad\x04\x3a\xd1\xc8\xca\xaf\x5c\x9d\xa5\x3d\xd0\x55\x22\xfe\xbc\x40\x33\x54\xd6\x2f\xe3\xff\x93\x88\x2d\xf7\x5f\xb2\x94\x58\xd2\x2e\x69\x96\xc3\x5b\x69\xfa\xae\xf2\xe0\xc4\x16\x38\x86\xcb\x3c\x3d\x0f\x60\xe1\x50\xd3\x63\xd6\xdb\x59\xfe\xfc\x62\x6b\x1b\xbb\x1e\x05\x2a\x62\x41\x4c\x4b\x78\x56\xd7\x20\x93\x43\x2b\x08\xf8\x21\xbc\x78\x4a\x5a\x6b\x0b\xc2\x64\x9c\x2d\xaa\x50\x86\x58\x98\x0d\x80\x22\x91\xe7\x34\xab\xaf\xf0\x6a\xfb\xf2\x79\x5e\x4e\x35\x4d\x52\x21\xdc\x4f\x52\xcc\x96\xd6\xb8\xcf\x18\x08\xb1\xa8\x20\x8d\xb7\xda\xa8\x0a\xb7\x10\xc5\x6a\x8b\x0e\x9c\xb8\x08\x1d\xee\x93\xf5\xf0\x15\xf0\x76\x64\x46\x3a\x3d\xcc\xff\x7c\x8a\xd1\x99\x23\xa9\x7e\x39\x04\x5b\xcc\x4d\xce\x0a\x73\xd4\x9c\x56\xd5\xe9\x37\xbd\x11\xe6\x18\x23\x40\x1c\x06\x62\x06\xe3\x13\xe6\x0b\x47\x53\x7e\x34\x70\x4d\x7d\x35\x15\x55\x9b\xb9\xd0\x53\x2d\x02\x8e\x28\xa5\x7a\x87\x9f\xd6\x17\xcc\x61\xf7\xf7\x76\xbd\x6a\x00\x8c\xd4\xf8\x12\x37\x8e\xd3\x7f\x39\x4b\xb9\x7e\x6e\x75\x6d\xa8\x19"}, +{{0xa8,0x86,0xf4,0xd3,0xf3,0x4e,0x32,0x0e,0xc6,0xd5,0xf4,0xca,0xa8,0x63,0xf8,0x14,0x77,0xdf,0x77,0x2e,0xff,0x97,0xe6,0x4a,0x37,0xa0,0x5f,0x42,0x11,0xd1,0x90,0xa8,},{0xe9,0xbc,0x96,0xc8,0x1e,0x87,0x81,0x10,0x26,0x8b,0x55,0xde,0xf7,0xea,0x40,0x07,0xa4,0xef,0x9f,0x54,0xd3,0x83,0xd5,0xfb,0x0f,0x6d,0x43,0x43,0xe1,0x01,0x0f,0x38,},{0xab,0xf2,0x83,0xdb,0x1f,0x80,0xc5,0x4c,0x58,0x3b,0x49,0x9d,0xbe,0x20,0xaa,0x04,0x24,0x8c,0x1d,0xce,0x12,0x1f,0x39,0x11,0x67,0x78,0x13,0xac,0x3e,0x01,0x1f,0xd1,0x59,0xad,0x0b,0xf7,0x6b,0x1a,0xa7,0xcc,0x7b,0x14,0xd7,0xb5,0x50,0x84,0x86,0x88,0x25,0x2a,0xcc,0x7f,0xec,0xe9,0x04,0x87,0x24,0x0c,0x3d,0x39,0x9d,0xd3,0x43,0x08,},"\x8b\x83\x1b\x87\x7b\xc3\xa9\x9f\x61\x3c\x89\xcd\xa6\x98\xb3\x75\x9d\x64\x38\x22\xb5\xa8\x8f\xaf\x38\x22\xec\xb2\xce\x98\xf6\x71\xd7\x55\x43\x21\xb2\x4b\x74\xb4\xe3\x0a\x66\x3f\x7a\x55\x70\xae\x91\x7f\x47\x9b\xda\x29\x89\x4b\x1a\x8c\x02\x8c\x9d\x19\x3e\x4e\x7a\xc1\x19\x16\xdd\x8e\x9c\x3f\x0e\xc0\xef\x80\xbd\x27\xfd\xfe\xee\x80\xc1\x70\xc7\x81\x40\xb2\x4c\x15\x27\x14\x15\xac\xf7\x5c\x26\x95\x6a\x4d\x4b\xf9\x9d\x40\xe8\x61\xe9\x07\x83\x20\xd0\x97\xe1\x25\x9e\x5e\xc1\x7b\x58\x3a\x95\xe5\x24\x30\xdd\x8c\x00\x8e\xd8\xc7\xdd\x1d\xe1\xbe\xcd\xd1\xe6\xbf\xec\x4b\xf3\x34\x7a\x22\xdd\x24\x9f\x3a\xc3\x07\xa2\x94\x5e\x91\x37\xfa\x4a\x8c\x26\xc8\x02\x10\x77\x23\x9c\xb3\x24\x81\x6a\x8d\xad\x32\xb0\x1e\xe3\x4a\x08\x90\x30\x98\xcb\x9c\x42\x45\x29\x1b\x90\x3c\x96\x27\x07\x40\x95\x24\x9e\x78\x28\x13\x47\x70\x32\xba\x32\xef\x04\x1a\x07\x48\x6e\xb4\x47\x8c\x57\xb9\xd5\x32\x26\x9a\x4a\x47\xcb\x5e\x97\x4d\xf7\xe0\x10\x96\xfb\xe4\xf1\xcc\xd4\xe6\x63\x66\x34\x87\x97\x4c\x62\xcd\xd9\x4d\x77\x71\x6c\x84\x79\xd7\x9f\x6b\x6a\x7d\x9c\x15\x59\x88\xcf\x39\x02\xfb\x69\x74\x24\x96\x3e\xc4\xec\x34\xff\x2a\x35\xd7\x42\xc4\x45\x5a\x59\x3b\xac\xff\xc4\xd9\x69\x9b\xa7\x62\x6c\x76\xcb\x1a\x61\x62\x53\x75\x18\x87\xf6\xff\xe2\xbe\x20\x8c\x71\x3d\xf1\xab\x63\x6d\x72\x2e\xa0\x6c\x1c\x03\xa5\x7f\x2c\xec\x08\x03\x86\x6c\xca\x33\x35\xc2\x8b\xf4\x1c\x7d\xef\x81\xac\xb3\x88\x58\xdc\x10\xe5\x94\x67\x20\x86\x24\x96\x7e\x2e\x22\xd9\xe5\x66\x1b\xb9\x45\xf9\xe0\x51\x76\x87\xdc\x80\xf9\xb8\xfd\xec\xc8\xa9\x76\x00\xb6\xc2\x19\xa3\xb2\x3a\x90\xb6\xd1\x8a\xaa\xce\x2c\x78\x40\x0f\xf3\x8c\x8c\x05\x96\x7f\x54\x4b\x6a\x60\x6c\x71\xac\x19\x9e\xaf\xd0\x7e\xb5\x84\x8d\xf1\x65\x7e\xfb\x23\x3f\xba\xba\xe6\x3a\x05\x63\x81\x91\xa0\xaf\x74\x84\xa1\xba\xe1\x58\x13\x75\x67\x2c\x57\x1e\x26\x4f\x60\x42\x25\x17\x3a\x54\xa3\x8d\xd6\x2a\xe7\x13\x0d\x05\xdd\x29\x1a\xd1\x23\x54\xde\x86\xa6\xe1\x13\xe8\x3f\x6d\x66\x85\x16\x15\x7b\x79\x67\x02\x0d\xc6\x51\x7d\x8c\xf4\x2d\xd7\xb1\xa8\x97\xfe\x1b\x4e\x04\x55\x3c\xe2\x6e\x29\x99\x80\xaa\x5f\x7c\xe0\x17\x9b\xf4\x95\x4f\x01\xc2\xa2\x36\x54\xe5\xe9\x73\x1e\x14\x47\x34\x7f\xa4\x3a\xa8\xb2\xcb\xd6\xd4\xb2\xdf\x93\xfa\x54\xaf\x71\xe5\x02\x8a\x6d\xa8\xc7\x1e\xf3\xc5\x0c\x0d\xe2\x4d\xca\xee\x78\x56\x78\xe9\x2a\xaf\xab\xeb\x23\x3b\x01\x1f\x45\xc1\x06\x49\x65\x08\x5d\x25\x47\x05\x0f\x21\xc6\x52\xaa\x53\x3a\xfe\x91\x8a\xa0\xf9\xbd\xaa\x26\x07\xb8\x73\xcc\xd3\xdb\xd1\xd3\xa8\xcc\x62\x17\x2c\xeb\x43\xb9\x21\xef\x6b\x25\xc0\x6b\x09\x92\xe4\xdf\x2b\x91\xe3\x71\xb0\xef\x2b\x39\x47\x38\x8d\xae\xc8\xec\x6f\x7e\x38\x67\xd1\xf6\x10\x72\xaf\x59\x01\x54\xfa\x61\x9a\x07\xf8\x7e\x02\xbd\xdc\x74\x06\x31\x42\x70\xaf\x1c\x15\xe8\xee\x88\xb3\x9c\x01\xbe\x60\x2e\x4f\x0b\x52\xd9\xa0\x72\x4e\x71\xed\xdd\x7f\xa9\x13\x41\x69\xc5\xfa\xab\x91\x59\x79\xee\xa9\x36\x2d\x0f\x1f\x91\x60\x26\x81\x62\xdd\x38\xdb\x02\xfc\xfb\x41\x35\x0a\xa0\x8e\x1e\x14\x09\xb2\x28\x8d\xb1\xfe\x4a\x0e\x58\x6b\x59\x10\xf4\xde\x89\x4b\xf9\x97\x4f\x6a\x49\x83\x01\x3a\x19\x0e\x7a\x73\x6d\x14\xec\x54\xc3\x64\x4a\x3e\xe9\x58\xa5\xbd\xfb\xcb\x62\x97\xab\xa4\x3a\xf6\xc7\x27\x46\xbb\x13\x54\x10\x50\x7d\x8f\xdd\xe7\x3a\x2a\x48\xb7\x46\xf9\x18\xbe\xf9\xed\x92\xc5\xbe\x62\xdd\x55\x23\xfe\x14\xb1\x6d\x63\x84\xca\x46\xef\x59\xb2\x18\x5f\xe9\x33\x38\x3a\x2c\x7a\x9b\xf0\x2d\xa9\xd0\xfd\x8b\x0c\x7d\x7b\xde\x6b\x43\x9f\x99\x60\x15\x5e\x34\x5d\x68\x5d\x4d\xc3\xc7\x14\x04\xd6\x56\x81\x19\x23\xaa\x3c\x47\xd4\xb0\x9a\x0b\xae\xf0\xa1\x2e\x75\xb6\x43\x9b\xa8\x13\x5d\xb1\x58\x65\x87\x42\x22\xcd\x7a\xa4\x28\xf5\xca\x5c\xe5\x14\x0e\x22\xff\x92\x69\x7f\x37\xfc\x70\xb5\xb4\xc9\x4d\x33\x14\xe6\xaa\x16\xb2\x14\x6b\xca\x4f\xc9\x41\x57\x95\x1f\xc4\x92\x45\xda\x53\xf6\xc4\x3d\x1b\xeb\xd8\x94\xe3\x1a\x13\x49\x88\x4d\x71\x1b\x55\xdb\xe7\x78\xff\xa7\x27\x16\x5c\xf7\xcb\x67\x64\x35\x86\x6c\x2d\x2c\xb8\x39\x74\x5c\xa4\x01\x66\xa2\xf7\xcf\xc7\x7a\x84\x24\x68\xb5\x1a\x8e\x76\x57\x5f\xc9\xdd\xfb\x5f"}, +{{0x49,0x7e,0x3e,0xbd,0x9e,0x4c,0xaa,0x81,0xc5,0xa8,0x97,0x3d,0x52,0xf1,0xd2,0x3f,0x60,0xc1,0x34,0xca,0x53,0xf6,0x2a,0x85,0x3a,0x0a,0xc0,0x43,0xe5,0x1c,0xb5,0x17,},{0x71,0xc0,0xca,0x7c,0xfa,0x05,0xca,0xfa,0xbb,0x14,0x3d,0x84,0xae,0x41,0xde,0x83,0x84,0x6f,0x42,0xc7,0x7c,0xaa,0x7a,0x91,0xa2,0xe3,0x48,0x39,0x7d,0x07,0xd5,0x2f,},{0x12,0x74,0x08,0x39,0xb3,0xc9,0xf1,0xba,0x87,0x98,0x96,0xdf,0xf6,0xd7,0x25,0xe8,0x4e,0x04,0x43,0xef,0x96,0xc3,0x49,0xef,0xf9,0x4d,0xc4,0x83,0x31,0x43,0xe5,0xb4,0x19,0x80,0x4d,0xa9,0xdb,0x11,0x8a,0x95,0x92,0xb1,0xb1,0xca,0x48,0xaf,0x18,0xf7,0x5b,0xef,0x1c,0xa4,0x68,0xa1,0xa5,0xc7,0x4c,0x7a,0xc8,0x13,0xbb,0x2c,0xf3,0x06,},"\xe1\x32\xf9\xd6\x7b\x17\x29\x38\x9b\x82\x8a\x9f\xae\x05\xa6\x7a\xa5\x7f\x0e\xf7\xe7\xd4\xd1\xba\x24\x4d\xec\x87\x04\xdb\x96\x95\x65\xd1\xca\xb8\x09\xe4\x8f\xc0\xab\xf9\x50\xbc\xd4\xa3\x7d\x97\xae\xac\xe6\xda\x54\x6d\x49\x14\xcb\x5b\x86\xd6\xab\x18\x1d\x83\x18\x70\xc3\x09\xbc\xa6\x16\x46\x8f\x2a\x34\xd3\xdf\xaf\xcd\xbb\x75\x80\xb0\xc5\xd9\xff\x98\xe2\xc5\x4e\xc8\x03\xbe\x0d\x3f\xda\x1d\x4b\x8c\x0d\x77\x09\xc8\x9e\x68\x0b\x00\x8b\xf9\xb8\xd9\x03\xb5\xe9\x34\xb0\x19\x70\x5f\xe0\xb0\xc8\xcf\xbc\x3c\x09\x67\x84\x3b\x0a\x1f\xa1\xb3\xf1\x62\x77\x6e\xbe\x96\xb7\x40\xed\xd6\x4a\xd7\xc3\x5b\x3f\xd1\xa0\x85\xc9\x9d\x16\xf5\x41\x67\x82\xde\x17\x35\x85\x87\x47\x0d\xd1\x3b\x51\x94\xf2\x0f\x23\x23\x2b\x2f\x70\x2f\x10\xaa\xfc\xaa\x59\xc7\x06\x6f\x24\xc4\xc4\x71\xe4\x2f\xa8\x6c\x6b\x9c\x5c\x3e\x1e\x8f\x83\x65\xf4\xdd\x75\xac\xb3\x2f\xff\xc0\x53\xc9\xaf\x41\xc6\xfd\x2e\xfa\xc3\x0e\xcf\x6a\x2d\xd0\x08\x5d\xe9\xb1\xd8\xcd\xc5\x0b\x16\x60\xa8\x66\xdf\x77\x67\x19\x8b\xd9\xc8\x73\x70\x61\x5d\x2b\xca\x99\xf7\x7b\x84\xd9\x8d\x7b\x24\xc9\xc2\x0f\xd7\x76\x8f\xd0\x38\x0d\x6b\x37\x36\x03\x40\xd1\x35\x98\x04\x78\x20\xdc\xed\x88\xa8\xd4\x2d\x57\x29\x37\xb6\xef\xa1\x69\x21\xa1\xb2\xb2\xd0\xeb\x93\x16\x73\x07\x08\x38\xe6\x11\xe6\xc0\x23\x29\x0d\x86\xfe\x90\x2f\x14\xac\x3a\xcd\x02\x9e\x33\x97\xfe\xb9\x7b\x17\x16\x62\x45\xab\x40\x7a\x76\x6d\x2e\x09\x04\x42\x4d\x33\xcd\x3d\x6e\x2e\x62\xa5\x2c\x65\xdf\x7c\xf0\x04\xd1\x41\x5c\x0b\x43\x0c\x11\x27\x62\x3d\xab\x27\x2a\x2c\x2e\x2b\x43\xe0\x2b\x48\x1b\xe9\x28\xe8\x99\x54\x27\x28\x32\xbe\x09\x8b\x50\x2b\x8b\x56\x43\xc6\x74\x82\xf5\xde\x44\x03\x03\x25\x81\xf0\x8a\xfb\x0a\xea\x48\x86\x85\x82\x60\x7b\xb3\x91\x98\xc1\xbf\x13\xa8\x69\xb6\x32\x58\xa7\x58\x90\xb6\x94\x45\xff\xd3\x45\x64\x02\x3e\x47\xf8\xb1\x88\x4a\x5e\x49\xb7\xd9\x42\x5f\x28\xd5\x15\x30\x13\xfe\x37\x55\xc6\xcb\x11\x4d\xb1\x80\xe6\x0b\x3d\xc4\xad\xb3\x6a\x21\x42\x81\x28\x00\x5a\x77\x2f\xb5\x71\x89\x34\x55\x65\xbb\xd1\x75\x98\x13\x52\x3b\xad\x62\x85\x5e\x79\x28\xee\xf5\x88\x0d\x3b\xff\xf1\xd0\xec\x65\xc2\x45\x92\x33\x5c\xda\x47\xcf\xcc\x5b\x5f\xa6\x52\xb4\x72\x63\x22\x52\x24\x84\x6a\x20\x9a\x3d\xd7\x76\x66\x61\xfc\xa4\xcc\xca\x59\xc4\x56\xfc\x9c\xc3\xe1\xcf\x80\x42\x55\xaa\x5f\x39\x7b\xab\x19\x98\x04\x33\x6b\xde\x29\xe5\x5c\x6c\x37\x7d\x58\x3f\x08\x2c\xe6\x47\x23\x73\x9e\x4f\x02\x46\x06\xf9\x06\xc1\x10\xd0\xa5\xb6\x10\xe5\xfe\xd9\x6d\xab\x5f\x08\xf4\xcb\x3c\xfc\x40\xa3\x55\x57\xe1\xa7\x40\xb8\xc7\xc0\x1f\x7d\x32\x79\xdd\x9c\x4e\x87\x64\xc9\x0b\xc1\x4f\x41\x61\xdb\x5a\x37\xf0\x98\x9b\x7b\xd8\x03\x5f\x8b\xea\x39\x4e\xa1\xd6\x00\x2c\xe9\xc3\x4f\x1e\x9c\x52\xc6\xa1\x5d\x15\xbc\x5b\x25\xc6\xc1\x5a\xb0\x0d\xfd\x6a\x5b\x1b\xc9\x17\xaf\x0b\x1b\x05\xfd\x10\xd0\x61\xb3\x68\x3d\x75\xb5\xf9\xef\xfb\x22\xae\x72\x08\x5b\xe4\xf6\x79\x7b\x58\xcb\x0c\xab\x56\x18\x44\x12\x1f\x98\xbf\xd9\x58\x3e\x0b\xcc\xb7\x0f\xad\x76\x98\x0a\x7a\x73\xb2\x3c\x70\xb3\xfd\x02\xf7\x75\x7c\x11\xa3\xc2\x1d\x19\xe0\x56\x50\xff\xb8\x2b\x9e\x0d\xf8\xa6\x73\x5d\x48\x01\x56\xf4\x79\x49\xd4\x45\x85\x1b\xae\xaa\x5e\xe2\x38\x14\xa4\x1b\x25\x23\x4f\xb9\x2c\xc0\xdf\x19\x80\xd0\x23\xd5\x1b\x5c\xf4\xc3\x11\x85\xc1\x18\xe3\xee\x3c\x0c\x0a\x46\xe0\xa2\xbe\x6f\x1d\x3a\xe4\x52\xcb\xb6\x6f\x0f\xd9\x19\x71\x34\x2d\xa7\xb1\xb9\x96\x58\x9d\x94\x09\x67\x81\x55\x21\x95\xc4\x33\xca\xf1\x9c\x37\xf9\xf1\x4f\xa0\xae\x15\xae\x0b\x02\xb9\x39\xe4\x02\x03\x4f\xf8\x18\x85\x93\x9d\x94\x4e\x60\x4f\x47\x4f\x21\x52\x43\x89\x39\x0f\xda\xda\x06\xe3\x0d\x69\x06\x8c\x88\x48\xcf\x0a\x95\x1e\xab\x25\xc4\x91\x25\x62\x94\x4f\x40\x24\x68\x18\x7a\x23\x23\x9d\x33\x63\x2f\x29\x12\x3d\x49\xb7\xde\x13\x08\x33\x98\xdb\xa9\x7d\xed\xe1\x2f\x79\x59\xb9\x52\x47\xa0\x8f\xc8\xe4\xb5\x39\x9d\x1c\x03\x5c\x08\x94\xcc\x75\xae\x98\x1c\x2d\xd4\x93\x54\x13\xbb\xeb\x68\x53\xfe\x04\x65\x5c\x77\xd1\x58\xc1\x23\x7b\x3e\x0d\xec\xa5\x63\x6d\x69\xe0\xdb\xc5\xac\xaf\x72\xb6\x0c\x10\xbb\x98\xcc\xdd\x60\x09\x8a\x03"}, +{{0x85,0xb4,0xd7,0x64,0x16,0x91,0x28,0x62,0x6f,0xd9,0xc7,0x82,0xad,0x61,0x16,0x22,0x9e,0xdd,0x77,0x63,0x1c,0x2b,0xc9,0xb8,0xee,0x54,0xb3,0x65,0x42,0xc1,0x49,0xeb,},{0x6a,0x09,0x89,0x7e,0x62,0x9b,0xb4,0x37,0x04,0xde,0xbb,0x67,0x15,0xc9,0xde,0xa5,0xd8,0x92,0xb6,0x34,0x30,0x64,0x40,0x99,0x7c,0x3c,0x9e,0x94,0xbe,0x8a,0xb5,0x47,},{0x4a,0x79,0xc4,0x42,0xa4,0xc3,0x9c,0x62,0x89,0x26,0x17,0xef,0x8e,0x80,0xb4,0x09,0x11,0xc4,0xb9,0xd3,0xff,0x0a,0x56,0x73,0xb5,0x7b,0xdb,0x84,0x54,0xad,0x73,0x67,0x69,0xdf,0x27,0xc7,0x8a,0x4b,0xf7,0xad,0x56,0x60,0x40,0xe7,0x47,0x27,0x8b,0x11,0xeb,0x65,0xcf,0x9e,0xc7,0xeb,0xa8,0x66,0x12,0x0a,0x36,0x54,0xf4,0x71,0x6e,0x00,},"\xb2\xa0\x49\x3d\x47\x1c\x33\x91\xf7\xad\xd1\xe2\xcf\x0b\xfb\x32\xab\x05\xdb\xcb\x14\xf6\xe4\xf5\xf3\x46\x3a\xa8\xd9\x95\x52\xf4\x33\x02\x20\x46\xd2\xf8\xeb\x76\x3c\x01\x71\xfc\xb1\xe7\x4a\x04\x9f\xfe\xb4\xb8\xf0\x10\x0b\x82\x10\xfc\xe8\x56\xb2\xe1\xa8\xe7\x39\xd2\xf9\x36\x73\xef\x8f\x8f\x40\x49\x8b\x30\x81\xfa\x1f\xd7\x85\x19\x8c\x6d\x37\x0e\x16\x2d\x41\xab\xe8\x31\x86\xf2\x32\x97\x83\x40\x8b\x9b\x88\x0d\x00\xf8\x1d\x53\x10\x0b\x42\xd2\x7a\x26\x1f\x20\xcd\xee\xd1\x9c\xc5\x8c\xb8\x63\x12\x81\xd8\x0d\xb1\x92\x53\x10\xe2\x35\xe4\x49\x66\x30\x9b\x87\x9b\xdf\xc2\x32\x22\x14\x33\xba\xe5\xca\xe4\x66\x90\xcb\x52\x7b\x67\x79\xe1\x1f\x1b\xd2\xa5\x6b\x59\xc5\x6e\xd4\xd9\x4f\xdf\x7a\xa8\x9d\xfa\x9b\xf2\x0d\xbf\xa6\xa4\x39\x8b\x98\x38\x45\x17\xe1\xdd\x5d\x2c\xd9\xce\x52\x4a\x47\x36\x2e\xf3\x2a\xc7\x92\x74\x2a\x12\x9c\x9e\x06\x13\x08\x76\xab\x5a\xd5\x51\x8e\xab\xc5\xe8\x0b\x02\x2d\x8f\xa1\x3e\x50\xd5\x5d\xed\x58\x95\x33\xe6\xea\x32\x24\x2c\x1b\x3f\xd7\xe6\x5f\x80\xde\xe7\x20\xb6\xd8\x7d\xcf\xf3\xe3\xdf\x04\xc8\x02\xd2\xe9\x14\xa8\x7a\x36\x29\xc9\x0b\xb6\x9e\x0a\x6f\x8b\xbb\x5e\xe5\x05\xf1\x43\xc9\x97\x73\x75\xad\xb0\x65\xc3\xe3\xd3\x91\xf9\x05\xfa\x3c\x33\x6c\x9d\xa4\x1e\x4a\x23\x20\xbc\xf4\x60\x97\x6f\xc7\xeb\x1f\xb6\xc6\xa3\xc3\x95\xdb\xd1\xd2\x8a\x1b\x09\xcd\xb9\xae\x9f\x9a\xae\xe4\xd9\xc5\x66\xa2\xac\x40\xad\xd8\x70\x47\x9f\xaf\x54\xad\x1b\x76\x97\x71\x0b\x4e\xb6\xf7\x32\x02\x44\xb5\x97\x57\xd1\xea\xc3\xd9\x22\xb7\xa7\x30\xb1\xac\xf0\xde\x9a\x45\xd4\xac\x87\x9d\x21\xfc\x61\x6e\xf3\x96\x5d\x74\x34\x5e\xd7\x07\x79\xeb\x68\x32\x80\xce\xe2\x5b\xf3\x73\x9b\xeb\x6b\x4c\xdf\xa2\x5d\x20\x2d\xa1\x3a\x4a\x67\x30\x40\xd9\x70\x48\x65\x8b\x92\x05\x47\x95\x05\xd0\xbe\xe4\x88\x0a\x73\x99\x7c\x70\x82\x5a\x6e\xc5\xfd\x9f\x95\x2e\x65\xfa\x02\x22\x54\x45\xfc\x3b\xdf\x4a\xde\xa3\xd4\xd2\x25\x51\xcb\xac\xeb\x38\x74\x79\x8d\x6a\x33\xa6\x66\x3f\xe3\x75\x70\x81\xd6\x24\x3d\xfd\x7c\xd2\xee\xbf\x60\xa3\x89\x9f\xa1\xf8\xf6\xc9\x56\xa3\xb1\x83\xf8\x9b\x9e\x7d\x2c\xa3\x64\x48\x58\x4d\x53\xaa\x8b\x44\xe6\x5a\xd3\xe5\x27\xf7\x87\x23\xfa\x6f\x59\x22\x42\x98\xdf\x31\xd5\xe8\xad\xa5\x67\xc8\xd1\xb1\x1f\x3b\x13\x14\x75\x53\x31\xc1\x73\x2d\xc5\x4a\x12\xa4\x35\x6e\xdd\xa4\x7e\x3c\x13\x0b\x32\x52\x82\xa3\x54\xbf\xe1\x5c\x30\x00\xd2\x07\x82\x29\x31\x79\x41\x87\xe0\x97\x3a\xb8\xef\x87\xbf\x89\xc3\x54\xa0\x35\xa8\x1f\x45\x91\x12\x23\x56\x3b\xfd\x99\xf9\x0a\x75\xe5\x3d\x01\x0d\x89\x29\xf4\xf8\x5a\x5a\x5a\x4f\x9f\xcc\x1c\x78\xf0\xa2\xfc\x46\x6f\x5f\x1c\x65\x22\xcf\x62\xa7\xbe\x37\x88\x07\x96\xe9\xb3\xca\x09\x11\xec\xca\x3f\x22\xc3\xb2\x4d\x5d\x9d\xaa\x68\x88\xf8\x9a\x8f\x71\xa1\x58\x59\x35\x9c\xea\x46\x8e\xf2\x38\xec\xf6\x46\x19\x27\x83\xa2\x57\xad\xda\xde\x90\x47\xe1\x3e\xdd\x8b\xcc\x1f\xd4\x17\x7c\xb2\x0f\x88\xd1\x19\x98\xd9\xc7\x26\x2d\x64\x8c\x2b\xf6\x6f\xb2\x27\xb9\xb3\xa9\xed\x46\x96\x2d\x22\x57\xa4\x20\xf6\x4b\xea\xd9\xe2\x86\x57\xb5\x21\xdb\x2e\x22\x16\x52\x87\x79\x1f\x3a\x1b\xec\x4c\x78\x22\xa6\xca\xbd\xe5\xec\x77\x01\x88\xcb\x74\x49\x8a\x4f\x08\xe5\xa3\xa7\x63\x9d\x24\x0a\xe3\xf4\xfd\x03\x53\xc0\xdd\xa8\xae\x41\x0b\x9f\xa7\xf4\x3f\xee\xd1\x3e\x9f\x13\xe6\xc9\x41\x0a\x1d\x24\xcd\xfc\x2c\x8e\x64\xa1\x5a\x12\xf7\x55\x45\xb0\xa5\x75\x71\x35\x23\xd4\xdf\xa1\xa4\x74\x27\xa8\x85\x1b\xa9\xac\xcc\xad\x78\xb4\xef\x6a\x18\x5f\x5c\x3b\x00\x11\x90\xdd\x8f\x37\x08\x8a\x00\x0a\xcc\xf4\x48\xbe\x8d\x49\x37\x1d\x9d\xa2\xe1\xcb\x5f\xfe\x07\xd4\x1a\x5c\x22\xe9\x46\x60\xac\x37\x13\x5a\xc8\x58\xcb\x17\x69\xcb\x66\xe8\x26\x9f\xd5\x33\x58\xec\xac\xf5\xdd\x92\xc7\xeb\x61\x86\xb4\xd4\xd6\x13\x0a\x73\x2d\xc1\x0b\xbb\x2b\xe3\x2f\x9b\x1d\x69\x51\x01\x4a\x63\x5c\x12\xd2\x2f\x0d\xc5\xbd\x5c\x2a\x3f\x96\xae\xc6\x2e\x77\x77\x94\x7e\xaa\x02\x28\x12\xca\xce\xd3\x3a\x5b\xef\x9f\xf8\x83\x5f\x88\x03\x67\xa3\x7b\x0b\x76\xd2\xdd\xe3\x96\xc6\x14\xe1\xa4\x72\x1e\x00\x0c\x00\xf1\x61\x93\x5b\x14\xa7\x38\xa1\xb7\x0f\x6e\xa5\x42\x55\xb7\x95\x18\x69\x64\x62\x12"}, +{{0x33,0xd4,0x77,0x60,0x2f,0x29,0x63,0x05,0xa6,0x71,0x9e,0xa6,0x94,0xc0,0x44,0xe9,0x0d,0x23,0x3c,0x2d,0xea,0x85,0xc4,0x6a,0xbe,0x19,0x20,0xe8,0x8c,0x31,0x78,0x49,},{0xff,0x6f,0xee,0xa0,0x28,0xec,0x34,0x6d,0xd4,0x91,0x07,0xbb,0x71,0x3f,0xdd,0xbb,0x28,0x2e,0xbc,0xd0,0x34,0xe2,0xea,0xfc,0x7c,0xdb,0x1c,0x5a,0xdf,0x92,0x63,0x90,},{0xca,0xa2,0x87,0x98,0x95,0xd4,0xf6,0x20,0xb9,0xeb,0x5f,0xed,0x22,0xb4,0x56,0x2e,0xeb,0x1a,0xd6,0x38,0x22,0x96,0x8f,0x76,0xad,0x91,0x07,0x6b,0x16,0x6c,0x05,0xee,0x20,0x86,0x4d,0x98,0xbb,0xbc,0x6e,0x79,0xdd,0x03,0x62,0xca,0xcf,0x7a,0x21,0xb4,0xcf,0xc2,0x30,0xd6,0x35,0x5d,0x43,0x12,0x0c,0xff,0xfb,0x94,0x8b,0x8f,0x6c,0x0e,},"\xcf\xea\x07\xa7\x79\xf1\x53\x7e\x49\x81\x23\xc6\x76\x29\x05\x73\xef\xcc\x5d\xb7\x02\x45\xd9\x3d\xea\x5c\x05\x72\x6f\x87\x13\xd0\x02\xae\x66\xc1\xc9\x69\x07\x47\xca\x92\x30\xb1\x62\x9d\x36\x62\xab\x73\xd6\x6b\x94\x98\x79\x16\x4b\x21\xa3\x5f\x40\xcf\x37\x99\x04\x19\x08\xed\x6f\x92\x29\xec\xb3\x90\xc5\xf2\x22\x34\xe1\xc5\xf2\x6b\x3a\xb5\xba\x59\xe7\x8c\x64\x96\x98\x71\xb4\x28\xb7\x85\x16\x77\x75\x55\xaf\x4e\x89\xc6\xfb\xc1\x93\xa9\x46\x95\x22\x6c\x6d\x32\x99\x91\xa1\x1b\xd5\x80\xd1\x89\x56\x08\x9b\x58\xa0\xe4\x2c\xa3\x5f\x6c\x6d\x26\x09\xad\xe0\xd0\xb6\x19\xd4\x89\x25\xc6\x8c\xd9\xd2\x25\x0d\xff\x27\xcf\x2f\x0d\x44\x44\x87\x09\xb6\x79\xf3\x5b\xbd\xce\x0f\x49\x6b\x0a\x16\xca\x67\xea\xce\xec\x25\x8b\x1a\xec\x91\x77\x5a\x3a\x2e\xe8\x01\xb1\xc9\xa2\x26\xa6\xb0\x01\x92\x6a\x05\x7a\x06\x30\x67\x27\xee\xda\xe8\xc5\x77\x53\x1d\xf0\x4a\xc0\x9b\x5b\x49\xbc\xde\xab\xde\xb8\xac\x4e\x8e\x82\xcf\x1e\x7a\xf8\x35\xfc\x61\x1c\xa7\xa6\x84\xb8\x35\x26\x04\x24\x15\xb1\xd6\x65\x2e\x86\x34\x31\x1e\x19\x46\x27\xea\xe7\x8d\x01\x1e\x6f\x40\xf6\x45\x79\x4e\x36\x89\x5a\x23\xe1\xbd\x84\x88\x3a\x39\x3e\xcf\xe5\xa2\x48\x02\x6a\xea\x86\x44\x70\x59\xf7\xa4\x29\x36\x8f\x21\xc8\x9e\x01\x45\x20\x79\x78\xb9\x13\xc8\x0a\x22\xd7\xca\xf2\x67\x3f\x7c\x76\xf6\xc2\x6c\xf8\x84\x41\x2e\x17\xd0\xc2\x55\x43\x0f\x50\x2b\xce\x74\xe3\xa3\x10\xd1\x7f\x6f\x4d\x48\x5d\xa2\x80\xed\x5b\x5e\xea\x6c\x49\xba\x74\x8d\x76\x48\x14\xb9\xe3\xda\xf6\xfc\xc2\x18\xc2\x74\x0c\xa7\x70\x18\xf7\x13\x44\x51\x9d\xa8\x2a\xda\x31\xe0\x01\x92\x4f\xc7\x76\x79\xe3\xe9\xff\x9f\xab\x67\xdd\x09\xa6\x19\x24\xc8\x21\xa1\xfd\x99\x9f\x74\xdf\xa3\xf8\x19\xad\xb3\x1d\x15\xe5\xed\x8a\xaa\x52\xc1\xbd\x7c\xca\x26\x67\x11\xa7\x4d\xd6\x21\x04\xef\x3c\x2b\xf7\x37\xfc\xe6\x94\x2b\x34\x8a\x33\xc3\xdf\xd6\xd9\x2a\x72\x4b\x6d\x58\x78\x42\x1a\xeb\x23\x0a\x53\x3f\xe2\x1c\x8b\x2f\xd3\xda\x59\x6a\x61\x80\xa4\x5c\x98\x6d\x7e\xce\x4c\xdc\x8a\xd6\x81\xea\xd6\x90\x64\xbb\xdd\xfc\x20\xf3\xc5\x21\x25\xf8\x33\x95\xbe\xd1\x55\x7f\x67\x18\x2b\x9f\xe9\x91\x38\xaf\x3c\x35\x6c\x5e\x65\x29\x78\xdd\x23\x8b\x76\x1c\x74\x2f\x81\x58\xe2\x31\x4b\x96\x42\x08\x33\x09\x78\xb0\x62\x0a\x13\xa1\x6d\x76\x1d\x52\xf0\x6e\x46\x6a\x40\x94\xb6\x5c\xd6\xf2\x68\x54\xae\xd6\xf9\xa8\xc2\xa8\x84\xa0\xd0\xbf\x4e\xe5\x87\xee\xb8\xb6\x02\x48\x72\x39\xa7\xe5\x81\x72\xc8\x09\x98\x3a\x8d\xb1\xc1\xfc\x7c\xe8\xc4\x8b\xc8\xa6\xfb\x81\x2d\x6a\xa9\xe8\x3a\x3a\xb4\xdd\xf7\xa8\xd4\x0d\x3f\xe0\x0e\xa1\x6e\x04\x06\x2b\x8a\xce\xb9\xc9\x9e\xef\xa4\x1f\x4f\x87\x44\x78\x28\x12\x6d\x0d\x9c\x9f\x86\x05\xe8\x46\x7c\x5e\x4d\x67\x1d\x5c\x6d\x9f\xa7\x0d\x74\x70\x98\xd9\x41\x21\x12\x23\xb9\xbc\xf2\x61\x93\x8d\x67\x04\xa3\x2d\x22\xc6\x1e\x30\xf3\x57\x0a\x1f\x5d\x09\x98\xb4\x79\x10\x80\x88\x2a\xa5\x62\x31\x67\xb6\x3a\x23\xf3\x40\xf0\xe7\xc6\xf9\xa8\x30\xa7\x5b\x74\x63\x1f\xa5\xb5\x7a\xfd\xb1\xe6\xbc\x22\x69\x9b\xb0\x31\x56\x67\x5d\x59\x83\x53\xa5\xd1\xb5\x58\x97\xe4\xc1\x10\x61\xdd\x14\x5f\x23\xe8\x53\x7c\x63\x2f\x75\xc1\x0d\xf0\x5b\x25\x54\x72\x38\x57\x40\x17\xfe\x7b\x64\xb8\xe9\x98\x69\x15\x7f\xee\x35\xf7\xad\x7e\x63\xe9\x95\x93\x30\x29\x29\x50\x3a\x96\x76\x80\x23\xb4\x12\x5a\xd7\x49\xdf\xf4\xb9\x92\xee\x5c\x2b\x4f\x3a\xda\x48\x89\xe4\xae\x62\xec\x15\xd2\xdb\x59\x69\xd7\x30\xdb\x30\x75\x47\xf6\x38\xc3\x18\x50\x32\xb1\x2f\x75\xfb\xb3\x17\xe4\x7d\xf7\xb9\x29\x2a\xe9\xe7\x6a\x2c\x0a\x06\xfc\xad\x10\x8c\xdd\x23\x5f\x6e\x38\xd9\x67\xb6\x37\x95\x11\xff\x69\x65\xc2\x2f\x2c\x66\x80\xa1\x2b\x03\x04\xeb\x2b\x29\x6c\x99\xa7\x6c\x27\x29\xd9\x8e\x0a\x78\x24\xb6\x7f\x3f\xe8\x42\xd6\xf6\xab\x27\x3e\x89\x48\x45\xb3\x2d\xc6\xdd\xfc\x7a\x22\x0f\x76\xbd\x96\x5c\x69\x85\x81\x83\xc8\xf3\x57\x39\x5f\xc5\x7d\xc8\x29\xde\xfa\xac\xb5\x60\x3a\x75\x78\x68\xd5\xe5\x62\xf9\x78\x1e\xe3\x9e\x0e\x94\x68\x8a\xd3\x54\x5b\x32\xdd\x73\x66\xb6\xb0\x47\xe8\xd1\xd3\xd5\x65\x99\x7b\x23\x6e\x7f\x75\x96\xc5\xf8\xd7\xc1\xc1\x1b\xcf\x4a\x24\x46\x20\xcb\xd2\x1d\x55\x9a\x7c\x9b\x3f"}, +{{0x70,0x74,0x56,0x86,0x11,0xa6,0x6d,0xfc,0xa8,0x30,0x7c,0xae,0x60,0x8b,0xb2,0x69,0x95,0x84,0x4d,0xf4,0x35,0xe5,0x30,0x0e,0x5b,0x4d,0x72,0x91,0xcc,0x22,0x90,0x7f,},{0xdd,0xab,0xdd,0xd1,0x5e,0xaf,0x83,0x11,0x5d,0xdd,0x06,0x5d,0x7e,0x22,0x0b,0x1e,0xfc,0x26,0x2a,0x61,0xc5,0x2e,0x91,0x43,0x47,0x44,0x2b,0xde,0x6d,0x00,0x25,0x06,},{0x7f,0x65,0x31,0x34,0xc0,0xb9,0x0f,0x44,0xa4,0x89,0xf0,0xb0,0x5f,0xc4,0x07,0x07,0xad,0x9f,0x13,0x98,0xf3,0x40,0xb4,0x47,0xa3,0xc9,0x86,0x1f,0x51,0x1c,0x9f,0x15,0x68,0x80,0x3b,0x76,0x84,0xa0,0x4a,0x89,0x8c,0x45,0x15,0x4d,0xd4,0x86,0xbd,0x50,0x75,0x89,0x98,0xe1,0x26,0x43,0x93,0x78,0xb3,0xf5,0x9f,0xf3,0x67,0x49,0x2a,0x0a,},"\x6c\x13\x74\x23\xea\xc7\x90\xb8\xe8\xe4\x18\xb2\x90\xe0\x57\x9c\x7b\x86\xb1\x4a\xed\x81\x8d\xe8\xce\x53\xce\xa3\xf3\x40\xa1\xa9\x53\x91\xf9\x84\x96\x8f\x2b\x42\x29\x28\x2a\x81\x61\xc0\x9a\xb1\x49\xcd\xac\xd6\x69\x70\xb4\x01\x3f\x52\xe5\xe6\x8e\xa8\xc9\xdb\x68\x5b\x2c\x53\x07\x35\x00\xe5\xb3\x5e\x29\xea\x0b\xa1\xf4\xd1\x59\xa5\x58\xd3\x61\xb0\x65\x16\x83\x6c\xf7\xb9\xea\x50\x1f\xa0\x50\x6b\x98\x5f\x03\x6a\x82\xd9\xe0\x84\x48\x9d\x3b\xfe\xd3\x40\x93\xe2\xd6\xd9\xed\xf5\x57\x85\xed\x35\xa9\x0c\xe5\x6c\x76\x16\x86\xcc\x3e\xa1\xa2\xc7\x6a\xda\x5e\xc8\xc1\x45\xd8\x18\xb0\x47\xcc\x51\x6e\xec\x5d\x2d\x6a\x93\xa5\x55\x92\xd8\x92\xe3\xd5\xcd\x10\xc2\x50\xc0\x4b\x04\x9b\x38\xfc\x7e\xc0\xf3\x9a\xba\x15\x82\x40\x07\x33\x6c\x2b\x0f\x7f\x81\xd6\x4d\x5c\xa3\xe2\x9d\x6f\xda\x4c\x23\xd9\xba\x65\xd9\xfe\x3c\xb4\xe0\x39\x13\x69\x72\x87\xb4\x6a\x0b\x1f\xcc\xd2\x62\x4e\x39\x7a\xe9\x5c\x52\x54\xbc\xd8\x8d\x2c\x7c\x8f\x70\xfd\xc8\x17\x3f\x64\xc1\xde\x32\x28\x1a\xb4\x18\x46\x93\xb4\x8a\x34\x9e\x67\x82\xbc\x89\x92\xb4\x3c\x7d\xe7\xcb\x9d\x33\x92\x9b\xf9\x53\x06\xc2\xaf\x7e\x93\x8d\x84\x86\xb3\x86\xf9\xfd\x3f\x0f\x71\x61\xe0\xe6\x86\x2d\x4f\x92\x81\x44\x68\x65\xa1\xc9\xbe\x24\x60\xef\xbc\x20\x15\x1b\x06\xe7\x9d\x01\x46\x17\xd0\x30\x0e\x67\x1d\x48\x76\x74\x58\x59\x66\x25\xb7\x6d\xff\xc5\x58\xaa\x9b\x40\x61\x21\x96\xec\x82\x7e\x1c\x6f\xff\x51\x8f\xb7\xad\x4b\xf8\xc4\x6f\xcb\x27\x88\x85\xaa\x49\x1b\x77\xa2\x89\x95\xcf\xb9\xd7\x96\x40\xaa\xd1\x74\xc6\xdf\x43\x93\x8e\x3f\x13\x85\x20\x5c\x54\x59\x5b\x33\xde\xde\x50\x14\x37\x46\xa1\x70\x5e\x7e\x0b\x69\xaf\x4a\x26\xc3\xb7\x65\x15\x05\x18\x92\xb1\x5c\xa6\xe4\x8c\x3d\x91\xfb\xc7\x5e\x8f\xe4\xa0\xfe\x8e\xd2\xc2\x6c\x10\x73\xbe\xb7\x0e\xa3\x8d\x09\x27\x02\x92\x78\x40\x67\x55\xae\x6e\x11\xda\x37\x86\x53\x64\x95\x15\xe0\x08\x5b\x5e\xa7\xdb\x32\x49\x20\x8e\x33\xa6\xc8\xb6\xae\x8c\xd8\x0c\x9b\xd6\xb9\x83\xe7\x3e\x9b\x91\xdb\xec\x09\x1f\xae\x99\x5f\x80\x32\x42\x7e\xde\xc0\x2c\xad\x90\x55\xeb\x8b\x7d\xbc\xfa\x80\xd4\xf6\x4f\x57\x27\xa1\x52\xf1\x1c\x47\xe5\x2d\x75\x3a\x57\xb6\xe5\xfd\xdf\x77\x4c\xea\x4d\xa9\x10\x02\x68\x19\xc4\x1e\x32\xb4\xf1\x99\x72\x7e\x23\xc5\x4a\xb5\xd7\x01\x42\xb8\x54\xa2\x7b\x04\xe6\x4c\xf4\x4a\xf2\xa8\x99\x5e\x12\x00\xbd\x11\x7c\x7a\x16\x74\xed\xef\x59\xbc\x53\xf7\x3a\xda\xf6\x38\xe0\x77\x3b\x85\xb5\x63\x34\xaf\xf6\xe1\x17\x43\xe3\xa3\xd3\x61\x4a\xa8\xa3\x75\xb3\x78\x1e\xc8\x14\xcc\x08\xe7\x1e\xfa\x78\x18\x51\x9c\xb2\x4a\xf8\x2c\x33\x1d\xfd\x6a\xc7\x8e\xc1\x7f\xd7\x17\x4b\x61\x02\x1e\x8c\xf9\x01\xa2\xaa\xa6\xad\xbc\x90\x2a\x91\x6b\x2a\x2f\x4f\x79\xe5\x51\x50\x1f\xbf\x01\xdf\x6b\x85\x18\x50\x4c\x1e\x94\x64\x69\x38\xbe\xd1\xa8\x50\x9c\x2a\x38\xfb\x6a\x79\x8a\x78\x58\xf4\x09\xb0\xf2\xfb\x9b\x3f\x48\x17\xe5\x68\xc5\x2d\x9a\xbf\xe2\x16\x8c\xc3\x65\x0f\xc4\x3e\x0f\x99\x75\xfe\x29\xe3\x3a\xed\x1a\x7b\xf3\x0d\x86\x31\x15\x07\x90\x65\x0a\x3c\xb7\x8c\x36\x8f\x1a\xea\x9a\xc6\x0c\x5e\xeb\x96\x9a\x45\xf8\x4a\xa3\x73\x66\xa8\x39\x77\x19\x0f\x41\xae\x42\x1e\x0c\x46\xfd\xa3\xfa\x01\xb9\x26\xfc\xef\x82\x24\xfd\xa3\x6d\xf4\xf8\xa8\x77\x01\xfe\x79\xfe\x06\x28\xef\x0c\xc0\x2d\xf2\xbd\x78\x32\x07\xc7\xdb\x87\x11\x9a\x03\x69\xfe\x16\xee\xb3\x8f\xdc\x9f\xb3\x5d\x9e\x19\x5f\xe1\x4f\x8c\x10\x38\x20\x8a\xb9\x77\x00\xaf\x79\xf2\xe2\xe0\x54\x96\x83\x02\x07\xc7\xda\x8d\xbe\x8e\x9b\xb7\x3b\xc4\x71\xa4\x3f\x1b\xe6\x50\xfa\x92\x81\x9a\xeb\x5d\xc7\xee\xd7\xee\xd8\x17\x12\x70\xd2\x19\x25\x7d\x19\x61\x0b\x89\xd2\xd6\x2d\x3f\x5b\x64\x8e\x13\x9e\xed\xf1\xff\x74\xbe\x01\xa5\xef\x1d\x95\xf8\x12\x92\x26\x01\xee\x92\x51\x51\x57\xc4\xec\xad\xfa\x3e\xef\x9f\x2a\x67\x7c\x00\x3c\xa4\xab\x9b\x2c\x45\x47\x2c\xe5\x5e\x18\xf4\x0a\x21\xfe\x1b\x0d\x45\xb5\x0b\x50\xc5\x2a\x0b\x1a\x5d\x7c\x37\xd8\xeb\xc1\x5e\x02\x05\x84\xd9\xed\xd7\xb5\x65\x05\xf8\x20\x78\xe0\xf8\x99\x38\x91\x35\x01\x4c\x86\xd1\xe2\xed\x49\xf9\xcd\x31\x90\x76\x94\x35\x53\xa3\x12\xae\x05\xab\x33\x35\x26\xe1\x36\x71\x4f\x09\xa4\x02\xb3\xc8"}, +{{0x7d,0x7c,0xa8,0xe8,0xd3,0xb8,0x43,0x44,0xa5,0xe4,0xde,0xa0,0x8b,0x33,0x8d,0x8f,0xaa,0x5f,0xfc,0x11,0x9c,0xe5,0x66,0xef,0x65,0x6f,0x0f,0x45,0x84,0x77,0x5b,0x21,},{0x0b,0xde,0x34,0xb7,0x46,0xd2,0xc5,0x49,0x08,0x53,0x06,0x4d,0x48,0xc6,0xb4,0xc1,0xcb,0xbc,0x3e,0xe7,0xbe,0xff,0x5e,0x8f,0x68,0x4c,0x12,0x0f,0x31,0x5d,0x7e,0x4e,},{0xd0,0xc3,0xe2,0x48,0xa8,0xcb,0x2d,0xdc,0x7e,0x9f,0x21,0xc9,0xc5,0xb0,0x09,0xf7,0x0e,0xa2,0x9d,0xa6,0x89,0x7c,0xd9,0x2c,0x26,0x0f,0x04,0x7e,0xd6,0x8a,0xa1,0xc8,0xb9,0x65,0x7f,0x9d,0x82,0x6e,0x88,0xf4,0xa5,0x12,0xc5,0x00,0x3b,0xe6,0x40,0x68,0x80,0x74,0x12,0x63,0xae,0x7c,0xe6,0x86,0x0e,0xfe,0x73,0xad,0x54,0xd4,0x82,0x04,},"\x0b\x72\x70\x75\x34\x5d\x61\x9f\x5c\xdc\x7f\xc4\xc4\x3c\xdc\x19\x10\x58\x11\xd9\x5d\x06\x9f\x81\xc0\xa6\x2f\xe1\xe1\x17\x8c\xf1\xc3\x5d\xb0\x5e\x2d\xe8\x7d\x11\xae\x1a\x6f\x53\xef\x38\xb3\x9b\xf4\xed\x8f\xbf\x56\xef\x01\x7a\x1d\x3c\x15\xb6\x4f\xe4\xb2\x61\x0b\xf6\x9b\xd1\x9a\xc7\xaf\xd4\x6a\x2b\x87\xb4\x88\xb6\xc7\x8a\xd4\x56\x81\x1c\x1d\xd6\xbd\x4a\x6b\x5d\xa6\x98\x73\x9f\xd1\xa1\x4c\xeb\x9f\x27\xf1\x24\xb6\x9f\x6b\xd1\x6d\xe5\x53\x7a\xad\x80\x68\x1c\x56\x33\x58\x03\x94\xda\x3b\x84\xe9\xb7\xa5\x5e\xba\xb8\x52\x2d\x2d\x6b\xf1\xaa\x4e\x7b\x15\x9c\xbf\x4e\x20\xb5\x0b\xfe\x9c\x71\x1a\xa0\x47\x11\x9f\x1d\xad\x87\x49\x26\x0b\x87\x63\x9e\x9c\x14\x1d\xef\x62\x02\x6a\x99\x03\x73\xdc\xfd\x99\xf7\x7b\x0f\x5e\xa6\xad\xfd\x8f\x59\x4b\x9c\xe4\x10\x64\xa5\xed\x30\x7b\xf2\xd8\xd1\x73\x70\x49\x8a\xd7\xf4\x5f\x9c\x4d\xd2\x6c\x42\x0f\x45\x0f\x53\x62\x3b\xb6\xd7\xf3\xf4\x6a\x14\x9d\x8f\x13\x5b\xc2\x91\x33\x10\xfb\x8f\x90\x43\xd0\x99\x27\x8b\xbe\xba\x39\x17\x9f\xa3\x67\xb0\x16\x73\xe1\xc9\x53\xef\xfd\x2c\xae\xa7\x31\x1c\x47\xc0\x37\x27\x44\x09\x5b\x1c\x8f\x90\xee\xf5\xf1\x92\x9d\xb1\x99\x6c\xd5\x84\xf6\x15\xd5\x6f\xae\x3a\xec\xac\x3e\xe8\x8b\xd0\xb2\x96\xf4\x49\xcc\x27\x13\xc5\x2d\xa6\x95\x24\x8f\xaa\x8e\x38\x9b\x05\xa0\xbc\xac\x69\xdc\xe9\x71\x97\x23\x19\x4f\x43\x3b\x02\x97\xeb\x08\x59\x01\x9f\x14\x1a\x20\x7c\xe8\xcc\xb5\x98\x82\xca\xa6\xe1\x8f\x0b\x43\xbd\xdd\xb9\x0a\x0a\x85\xff\xd5\x77\xd6\x39\x4a\x1d\x80\x48\x94\x10\xf9\x2a\xfb\x85\xba\x50\x6a\xa9\xf3\xf4\x27\x44\x5d\x21\x22\x4b\x9c\xb0\x46\xc0\x5f\x1b\xac\xd7\xb7\x49\xfb\x7b\x10\x24\xd0\x92\xe4\xee\x4b\x30\xa4\x6e\xdf\x71\x84\x70\xc9\x94\x91\xc6\x8f\x48\x79\xd6\x2b\xfc\xe7\x04\x6d\x81\x38\xcb\xb9\xe7\x21\x29\x99\xa4\x49\x8b\x45\x5f\xc9\x0a\xc2\x83\xe9\x35\xde\x04\xdf\x6f\xc9\x99\xe4\x43\x4b\xe1\x10\x63\xd6\xe4\xee\x9e\x09\x6a\x87\xbc\x71\x6d\x2c\x81\x99\x16\xc3\x7a\x4e\x62\x98\xc4\x99\x45\x36\x6e\xc3\xf5\x00\x72\x0b\x06\xdc\x99\xd3\xd8\xac\x30\x3e\x6c\x26\x4e\x28\xa7\xc2\xd4\x19\xec\x62\x2a\x97\xa7\x11\x54\x4f\xb1\xf4\x73\x5b\x11\xf8\xbb\x1d\x7e\x2c\x81\x6a\x15\x62\x87\xb4\xcc\x0c\x65\xaa\xa2\x80\xb8\x37\x73\x7f\x0a\x84\xe3\x6d\xe2\xdf\x2f\xc3\xa5\x0d\xf9\x80\x91\x8f\xb9\xe5\x83\x4b\x42\xac\x0e\x0c\x72\x78\xd7\xfe\x8d\xb4\xdb\xde\xca\x01\x41\xd5\xfe\xf5\xdc\x61\x51\xf8\x7b\x86\x34\xc2\x41\xa8\xfa\x0a\x82\x71\x78\x99\x77\x3a\xe8\x9f\x53\x78\x90\xb9\x15\x5a\x7a\x05\xbc\xe4\x78\x66\xec\x20\x28\xa4\x78\x98\xd4\x85\x82\x3a\x2e\x99\x23\x19\x68\x0e\xb6\x99\xb0\xdd\x53\x58\xf5\x46\xfc\x53\x7c\x73\xd3\xa4\xb2\x23\xa0\x94\x15\x18\xb6\xd1\xe6\x6b\x27\x67\x6c\x1b\x1f\xc7\x6a\x08\x32\x05\x24\xa7\x2e\x29\x7f\xce\x17\xaa\x80\xd8\xea\x7b\x38\x8a\x55\x16\x8e\x7d\xad\xb8\x36\xe9\xde\xe7\x07\xed\x25\xc0\xee\x4d\xb2\x5b\xee\x3c\x48\x5b\x39\x64\x92\x04\xef\xaf\x28\x20\xb2\x73\x63\x68\xfc\x77\x3c\xe0\x90\xc3\x85\x37\x80\x02\xc4\x71\xb0\x94\x79\x5c\xb2\x66\xd3\x9e\xb7\x58\x0d\x70\x1b\xe4\xc8\x91\x6f\x6b\x38\xbf\xe2\x5f\xdf\x36\xd6\xc4\xad\xaf\xa9\xae\x98\x64\xc5\x7b\xb7\x37\xb4\x95\x06\xed\x38\xd6\x2d\xe6\x0c\xc0\x59\x9e\xc6\xbb\x1a\xcf\x24\xb1\xd3\x7d\x60\xef\xde\xb7\xd9\x42\xc5\x36\x03\xa2\xf0\x47\x6e\x95\x12\xc9\x38\xb2\x8d\x49\x5a\x6f\x26\xa9\x07\xc3\x96\xb8\x41\xae\xdd\x8e\x14\xac\x44\x7b\x49\x5d\xf1\xf6\x76\xda\xcc\xd5\xa7\x40\xc0\x42\xf5\x77\x2b\x7d\xb1\x7f\x4f\x1a\x3a\x1c\x8e\x7c\x48\x83\x70\xe7\x36\xb5\x1e\x69\x0f\xd2\xdd\xcb\x5a\xa6\x19\x57\xa7\xc7\x97\x5a\xcb\x2d\xcb\x91\x5d\x07\x4d\x74\x42\x79\xea\x1c\x41\x69\xf8\x68\x87\x3a\xc5\xc2\x08\x90\x16\x2c\x1d\xf9\x65\x64\x19\x97\x5a\x43\xd3\x19\x8e\x18\xc3\x09\xa1\xeb\x7c\x1d\x87\x87\x3f\xb1\x5c\x6d\xa4\x7f\x54\x8a\x01\xf6\x9b\xda\xb9\xc3\x9e\xf0\x0d\x41\x8a\x6f\x61\x9d\xd7\x3d\x7d\xb4\x5c\xbb\x6a\xd2\x25\xa2\xde\x78\x7b\xa7\x77\xbc\x73\xd2\x8f\xc3\x04\xf1\x00\x09\xf4\x02\x2c\x2c\xf8\x4d\xe0\x08\xd7\x0f\xcd\xc8\xba\x7f\x10\x7c\x36\x98\x59\xe9\xc9\x0c\xa8\xa3\x93\xb5\x53\xf2\x66\x05\xff\xd7\x23\x0c\x92\x14\x90\x70\x0f"}, +{{0xd2,0x1f,0xdd,0x7b,0x10,0xe5,0x4a,0x8b,0x6b,0xe9,0x5a,0x02,0x24,0xad,0x70,0x66,0x4d,0xd9,0x21,0x12,0xe2,0x68,0x3a,0x4f,0xd2,0x79,0xc4,0x07,0xdb,0x38,0x71,0xbb,},{0xf8,0x9c,0x27,0x2e,0x7d,0x1c,0xc9,0x3d,0x69,0xf6,0x94,0xde,0xc9,0xcc,0xe0,0x5a,0xc2,0x47,0x73,0x45,0x04,0x82,0x9c,0x56,0x99,0x74,0x13,0xc8,0x95,0x8b,0x93,0x30,},{0x6d,0x69,0xe8,0x3b,0x3e,0x7e,0xd5,0x5a,0x85,0xf9,0xfc,0x9d,0x25,0x19,0xda,0x0b,0x0a,0x1e,0xb4,0xda,0xae,0xe9,0x91,0xa6,0x65,0x1f,0x5c,0x89,0x19,0x0c,0x0d,0xe7,0x23,0x73,0xcd,0x98,0x9d,0x46,0xbe,0x13,0x67,0xf9,0xda,0xf1,0xb9,0x2f,0xed,0x3b,0x52,0xbb,0xa5,0x4a,0x1e,0x4c,0xca,0x5b,0xc8,0x72,0x6e,0xd0,0x7f,0x30,0x25,0x01,},"\xb8\x64\x4a\xdb\xef\x9c\x7c\xab\x91\x20\xac\xed\xc8\xe7\x5c\x43\x3d\x03\x6f\xfa\xe0\xf9\x55\xbe\x6a\x48\x8f\x1f\x42\x7a\x68\xa8\x90\x2d\x02\x6e\x63\xdd\x6c\x9b\xf9\xd9\x7d\xe7\x86\xb3\x1d\xd4\xf4\xc9\xa4\xf8\xa6\x22\xf1\xff\xc8\x4d\xa6\x96\x7c\xa7\x74\x33\xc3\x98\xf4\xd3\xf1\xc4\x43\x49\x89\xb7\xac\x9d\x0f\x3b\x1b\xe0\xc8\xb3\x52\x82\x4f\x4e\x7a\x08\x3f\x34\x2e\xc1\xbe\x1d\xa8\xfb\x75\x52\x42\xa6\x54\x88\x0e\xf2\x98\xf0\x59\x79\xff\x02\x6d\xdc\xc0\x44\x86\x0e\x67\x57\xa2\x9c\xfa\xa2\x22\xa3\x59\x7e\x38\xf1\x77\x99\x62\xa4\x1a\x4c\x8c\xe6\xa6\x5b\x87\x81\x99\xb4\xd8\x0f\x4a\x03\x90\xca\xc1\x9c\x22\x6e\xea\x4b\x60\x36\xe5\x7a\xd8\x30\xec\xfc\x00\x69\x3e\x26\x13\xd3\xed\xf4\x65\xfc\x8c\x4f\xa2\x93\xfd\x8c\xfc\x36\xdc\x8e\x37\xbc\xeb\xab\xec\x03\x49\xeb\xd8\x84\xe1\xb2\x8b\xce\x82\x4e\x0d\x55\xb6\xd0\x15\x38\x38\x01\x66\x8b\x34\xf5\xba\x72\x3d\x2a\xc0\xa2\x64\xfa\xb2\xc7\x28\x60\x8f\x16\x2d\xe0\x11\x79\x25\x9b\xe2\xcc\xb0\x81\x50\x02\xfd\xed\x8e\x0d\x78\xb0\x28\x07\x31\x3e\x91\x0e\xb3\xa7\x33\x7c\x53\x4e\x84\x6f\x9e\xe1\x55\x42\x6e\x4a\xef\x64\x36\x61\xb0\xed\xb4\x45\x96\xfd\xdc\xd0\xb3\xe8\x14\xc1\x37\x81\x7a\x42\x2b\xaa\x40\xc9\x05\x3d\x03\x86\xc6\xec\xdb\x58\x90\x52\x59\x47\x42\x67\x7c\x48\xdc\xfc\x8c\xd4\xa9\x36\x67\xed\x4d\x87\x64\x60\x01\xed\xa0\x79\xe8\xb9\x9d\x52\xba\x21\xc5\xec\x56\x69\xfe\xdf\x6f\x40\x44\x7a\x7f\xf8\x90\x1d\xb0\xef\x18\x47\xd3\xca\xcf\x01\x98\xa2\xf3\xbd\x7b\xcf\x2d\xd8\x11\xa0\x97\xfc\x5e\x51\x88\xb0\x3f\xdf\x54\xe5\x17\x63\x7a\x14\x50\x10\x00\xd0\xd3\x55\x16\xca\xf0\x69\x94\x02\xb4\x8f\x8d\x8c\xc3\xaf\xb1\x7a\x56\x13\x2d\x08\x23\x70\x35\xa0\xc9\x54\x90\xbf\xe5\xd7\xb7\xfb\x40\x17\x8f\x28\x1e\x4d\x87\x2e\x47\xa0\xe9\x55\xce\x97\x36\xf3\xc3\x33\xa6\xad\xf5\x0a\xd3\x19\x94\xeb\x9f\x45\x32\x7f\xac\xc8\xc5\xd1\x13\xfa\xd4\x71\x3f\xe7\xf1\x98\x01\x0d\x42\x04\x6b\xbf\xe6\x8b\x0d\xaa\x79\xdc\xb8\x75\x59\x29\xbe\x92\xf9\xca\xa1\x50\xdf\xbd\xe3\xfc\x9e\x39\x2b\x2b\x70\x1c\x30\x21\xc2\x40\xe4\x67\x9d\xe4\x11\x24\xb1\x88\x8e\x5d\xb5\xa8\x3d\x05\xce\xaf\x49\xeb\x44\x0d\xc4\x50\x26\xd4\x50\xbc\x98\x4b\x8d\x6f\x02\x85\x0e\xcb\x57\x0e\xee\x0a\x38\x19\xb1\x2b\xc2\x63\x67\xb5\xb9\x8e\x1b\x14\x1c\x9b\x0a\x96\x90\xea\x4a\x37\x00\xda\xd1\x23\x95\xf9\x75\xd1\x1c\xd7\x7f\x96\x36\x88\x31\xf2\x1f\x4e\x96\x8c\xc5\xba\x9e\xf8\x24\x74\x03\x8b\xc7\xaa\x26\x12\x2d\x21\x8b\x74\x30\x41\x50\x6a\xeb\xbd\x1f\x98\x79\x59\xfd\x16\x0d\x6e\xb7\xd5\x8d\x4f\x57\x6f\x8c\x0c\xa8\xaf\x86\x8e\x39\xb5\xea\x87\x20\x39\x37\xe0\x30\x8a\xcb\xea\xe9\x1e\x10\x60\x7e\x44\xe8\xab\x49\x5b\xc0\x1d\xd5\x73\xfb\xad\xc9\x44\x79\xff\x92\x08\x2c\x7b\xb7\x51\x34\x79\xc7\x0f\x04\x07\x76\x90\x25\xd3\x4d\x72\x14\x0c\x25\xd8\x21\xf0\x34\xa3\x98\x51\xa9\x3c\x62\x3b\x71\xc9\x40\x0e\x94\x26\x39\xf2\x8b\xbd\x03\x2e\x1d\x8d\x3c\x05\x9f\x7c\x2c\xd3\x1d\x74\x76\x46\x2d\x27\x76\x03\x5d\x07\x88\x02\x02\xdb\xfe\x9e\x07\xd1\x54\x62\x2d\x7a\xc6\x17\x5a\x5a\xfa\x79\xfe\xd4\xdc\xc1\x37\x12\x62\x0c\x41\x99\x4e\x11\xd9\x24\x30\x8f\xb2\xff\x3a\x1e\xda\x44\xc7\x61\xbc\x73\x6f\x34\x51\x22\xf0\x2a\x40\xae\x6f\x7d\xbd\x03\xd9\xfe\x96\xee\x3d\x7a\x3b\x4a\x5e\xef\xbf\xcc\x56\xdc\x42\xef\x27\xbd\x80\x85\x17\x60\x38\xb9\xeb\xae\x63\xaa\x75\x03\x52\x75\xec\x34\xe4\x18\x57\x39\xd6\x36\x24\x67\x70\xac\xcc\xc6\xdc\x62\x0e\x2f\xc9\x15\x6f\xa9\x48\x3e\x0d\x9c\xae\x0e\x8c\x46\x39\x48\xa3\xd9\x7a\xe8\xdd\xa5\x96\x6c\x88\xf0\x70\x93\x29\x2c\xce\x22\xbb\xda\x06\x2b\xaa\xfa\x7f\xe8\x4d\x0b\xa2\xd2\xdd\x29\x5b\x23\x45\x8b\xca\xeb\x2e\xf7\x42\xa2\xed\x1c\x83\x44\x83\xcd\x70\x93\x85\xaf\xea\xdc\xbc\x0a\x9c\x6a\x4f\x38\x7b\xab\xf7\xe3\xdc\x36\xc8\x10\xdb\x20\x9b\xeb\x66\xc8\x66\x64\x04\xc6\x61\xdf\xe9\xd3\x2c\x4c\x08\xaf\xc6\xf3\xb1\x25\x7d\x64\x84\xa7\x55\xf5\xac\x70\x1e\xb1\x3f\x87\x76\x3f\xee\x33\x0f\xfa\x04\x22\xcd\x80\xa9\x20\x38\xc6\xf4\x52\x92\xbd\xee\x5f\x89\xe9\x4c\x7a\x65\x21\x97\xfc\x19\x06\xb4\x82\x58\x37\x24\x49\xb1\x08\x1c\x6b\x97\x13\x4c\x43\xc8\x9e\xe2"}, +{{0xd3,0x36,0xfd,0x84,0x08,0x19,0x6d,0x22,0xfb,0x69,0x8e,0xb2,0x5b,0x76,0x54,0xfd,0xa4,0x6f,0x5d,0xe4,0xc9,0xb4,0xd0,0x49,0x50,0xc3,0x98,0xb5,0x9a,0x44,0x29,0x0a,},{0xf3,0xcd,0x96,0x34,0x7c,0xea,0x63,0xe5,0x00,0xa4,0xc9,0x2c,0x3b,0xf2,0x15,0x66,0x2d,0xd0,0x40,0x07,0x84,0xdb,0xf8,0xb5,0x95,0xdd,0x3d,0x39,0x5f,0x90,0xcc,0x12,},{0xaf,0x7e,0x2d,0xf7,0x52,0x9f,0xd1,0x8d,0x1b,0x21,0xb8,0xfd,0x4c,0x06,0x81,0x50,0x59,0x18,0xe2,0x51,0x14,0x34,0xfe,0x4e,0x49,0x54,0xe7,0x43,0xc1,0xcf,0xa4,0x5e,0x41,0x09,0xd3,0x6c,0x3e,0xec,0xf2,0xe2,0x5d,0x20,0x9b,0x9b,0x5d,0x25,0xf7,0xcb,0xc3,0x80,0x29,0x6d,0x64,0x77,0x52,0xe3,0x0d,0x3b,0xea,0x3b,0x92,0x9b,0x09,0x03,},"\xfb\x49\xc1\x9b\xc4\x44\x4c\x28\xeb\x26\x25\xf3\x1d\x99\x6d\x5e\x36\xc5\x7f\xa6\xfd\xd7\x72\xe6\x7b\x71\x99\xce\xc6\x7e\xda\x54\x51\x71\x2d\xf7\xa6\x9d\xbb\xd5\x6e\x7c\x39\x87\x96\xb2\x00\x1d\xef\x65\x1c\x4b\x9c\x05\xee\x31\xd9\x56\x79\x53\x5c\x81\x2a\x37\xd3\x1d\xdb\x30\x73\x19\x9c\xd7\x04\xff\x7c\xa2\x98\x1f\x7b\x9c\x92\x7a\x7f\x7d\x77\x6f\xb6\xf6\x09\xf7\x27\xe6\xea\x70\x9c\xe7\xf4\x3a\x60\x79\x35\x04\x16\x9a\x89\x05\xd9\xb2\x31\x09\xf0\xd8\x67\x96\x6a\xa3\xe3\x00\xc7\xe1\x1d\xde\xdb\x9c\xc1\x17\xb9\x04\xf6\x29\x27\xe4\x8e\x4d\x73\xfe\x1a\x6c\xec\xcc\x4c\xeb\x08\xe6\x4a\xb5\x5f\x25\xc9\x82\x16\xce\xc9\x37\x60\x8a\xd7\x93\x14\x69\x98\xf1\x4c\x29\x85\xe6\xc2\x91\x0d\xf7\xb1\x38\x8f\x9d\xd8\x63\xf1\xe4\xd7\xd1\x62\x14\x79\xb8\x51\x2c\xdb\x34\xe6\x73\xeb\x02\xa4\x89\x34\xe3\x9c\x2d\x18\xd7\x0f\x96\x6d\x67\x6a\x2b\xd7\x5d\xb5\x43\xd2\x5c\x5d\xcd\xc3\xef\x3b\x8b\xc8\x20\x18\x48\xc3\x09\x61\xe9\x15\xd9\x68\xbd\xc3\x19\x46\xb0\xd1\x8e\xde\x7c\xb0\x16\x6d\xbe\x1f\xfe\xff\x94\x39\xc9\xc3\x40\x4a\xf6\x01\x6c\x73\xed\xeb\x25\x3d\x93\xf5\x62\xa1\xa6\xcd\xd5\x78\x98\xa9\xb3\x42\x25\x87\xd5\xf5\x6a\xf3\xd0\x6b\x3f\x6c\x25\x75\x1f\x44\x46\x0f\xb3\x29\x96\x56\xdc\x11\x22\x7e\xf4\x83\x7a\xab\xdd\xee\x40\x0f\xa5\x3f\x69\xe5\xce\xd0\x53\xc7\x6d\xce\xcd\xf0\xad\xc9\xef\x80\xf4\xb3\x30\x54\x2f\xf1\xfa\x2d\xf0\xb8\xd4\x3c\xd1\xc3\x11\xb1\xb9\x95\x5c\x63\x2c\x8e\x5f\x04\x91\x93\x1c\x04\xde\x43\x4d\xf8\xf7\xa3\x94\xe5\xfe\xf0\x16\xdb\x2e\xb7\xc8\x7b\x2a\xc7\xa4\xa7\x30\x43\xbd\x7f\x98\xad\x0a\x4d\x45\x3a\xbf\xb0\xbe\x8b\xe4\xcb\x14\x57\x42\xaa\x56\xaa\x5e\xf2\xdf\xf1\x22\x30\xa5\x10\xe3\xb7\xf8\x2f\x78\x47\x70\x0e\xee\xa5\x90\x5b\x02\x89\x69\x6c\x4c\x14\x2b\xf3\x4b\xcf\x81\xa9\x62\xd7\x5b\x8d\x09\x10\x55\x73\x37\x79\x33\x5b\x7f\xd4\x7a\x20\xd1\x7c\x94\x8a\xb7\x32\x94\x78\x32\x67\x43\x71\xe2\x2e\x71\x11\x34\xf5\xc9\x19\x79\x23\x57\xf7\x9b\xf7\x0c\x44\x70\x78\x75\x28\x43\x4f\xc0\xb4\xca\x09\x3e\xe9\x25\x43\x42\x0d\x1c\xa8\x11\x24\xf5\x58\x53\x17\xe2\x50\x82\x1a\x4f\x3d\x8c\xe0\xf9\x19\xde\x9f\xbf\x01\x27\x08\x7e\x67\x69\x03\xf6\xcb\x39\x02\x5b\xcc\x73\xa0\x76\x29\x54\xb7\x2e\x66\xa6\xbe\x9b\x96\xc9\x7b\x6f\x60\x30\xbf\x5c\xa0\xbc\x27\x27\xa9\xa1\x79\xcf\x9d\x94\x05\xf3\xfe\x18\xf3\x49\x23\x89\x07\x9a\x5b\x65\xbc\xb1\x3a\x0d\x5e\xf4\x1c\x2c\xd9\x7e\x70\x2c\xee\x4a\x2f\xeb\x1e\x67\x02\xbd\x4c\x63\xfe\x0a\x4a\xe9\x94\xc4\x28\x7a\x83\x7b\xc3\xf6\x4c\x2d\x89\x88\x57\xcd\xb3\x2a\xcd\x4b\xd1\x33\x67\x6e\x51\xf7\x7b\xc7\x11\x0e\x3c\xe5\x2d\x92\x04\xfd\x26\x91\xa6\xd3\x70\x78\xf6\x8e\x7b\xce\xf3\x0f\xc9\xc4\x83\x98\x58\x22\xb6\x61\x11\x92\x38\xe4\x0f\x9c\xfd\xca\xbe\xf2\xd7\xb1\x6b\x05\x9a\xb2\x4a\xdc\x05\x00\x37\x12\xbb\xb1\x28\x09\x6e\x37\xf9\x1b\xc4\xc5\xc8\x15\x08\xbe\x27\xfa\x0b\x84\x94\x0b\xe3\x6b\xce\xd2\xe6\x5c\xd3\x6b\x39\xfb\xdc\x5e\xa6\x86\x14\x15\x92\x28\xca\x65\xc5\xd8\x40\x7b\xaf\x66\x3b\x52\x8e\x7d\x87\x73\x4c\x7b\xc7\x7d\xc8\x43\x1a\x1d\xd6\x87\x3c\xfd\xdf\xc3\xe7\x57\xd9\xad\x1f\xed\xd3\xc7\x98\xf1\xfe\x60\xe7\x15\xee\x48\xa6\xbc\xbb\x13\xb6\x16\xa8\x9a\x38\xe3\x36\x48\x9d\x3d\x6c\xcb\x72\x69\x14\x11\x2a\x1b\xc5\xd9\x77\xc9\xb2\xa3\xfa\xc1\x07\xad\x09\x4b\x03\x8a\xb7\x54\x68\x26\x3c\x34\xbd\xa8\x17\xc0\x56\xe0\x7a\x6c\x56\x69\x7c\xb6\x4a\x0b\x1f\x96\x6f\x6d\xe0\xbb\x1c\x0a\x71\xc8\xa5\xfe\x13\x3b\xa2\x03\x6d\x24\xda\xcc\xad\x3f\xa0\x3b\x39\xcd\x27\xf8\x32\x75\x27\x51\x05\x5a\x81\x55\x91\x3d\x04\x0f\x51\xda\xe7\x8d\x71\x94\x6c\xa0\x4d\x83\xc7\xc8\x94\xc2\x80\xaa\xec\x28\x55\x43\xe5\xfd\x5e\x32\x7a\xcc\xca\x9a\xbe\xf1\x56\xa1\x3b\x95\x71\x44\x6b\xd8\x00\x7f\xf9\x2d\xbc\x0f\xba\xf2\x3a\x94\x41\xb5\x3c\x1c\xd7\x40\xc3\x4c\x28\x29\x29\x10\x1a\xd2\xea\x8b\x85\xd7\x00\x52\x99\x1b\x77\x4e\x92\xff\x75\xcc\x85\x11\x3e\x09\x00\xb5\x1b\x86\x3e\x1f\x2a\xda\xab\x2d\xbc\xf4\x6a\xf4\x79\xea\x24\x8e\xc2\x88\x9a\xfb\xfe\x73\x74\x08\x39\x3a\x2b\x1b\x33\x01\xf6\x5c\x1f\xac\x8b\x67\x67\x95\xab\x5b\xf4\x47\xf0\x5e\x0d\xaf\x67\x76"}, +{{0x65,0x73,0x22,0x78,0x41,0xf6,0xf9,0x28,0x31,0x14,0x6c,0x44,0xc0,0xe4,0x80,0xcd,0xf5,0x44,0xbb,0x87,0x65,0x52,0xcc,0x5f,0x9d,0x42,0xf1,0x5b,0xdc,0xc0,0x44,0xb8,},{0x19,0x22,0x57,0xa5,0x4c,0xe5,0xd0,0x4c,0x19,0x43,0x9f,0xdc,0x9e,0xde,0x18,0xec,0x85,0x6e,0x29,0x87,0x0e,0x24,0xd3,0x73,0x1f,0xe2,0x22,0x47,0x99,0x94,0x9b,0x7e,},{0x53,0x8e,0xac,0xe4,0x93,0xde,0x53,0x38,0x4b,0x1e,0x98,0x5b,0xb9,0x07,0xc0,0x94,0xf8,0x16,0x84,0x30,0xda,0xb1,0x4d,0x37,0x79,0x1b,0xe6,0xe7,0x8f,0xf3,0xf5,0xa3,0x06,0xec,0x70,0xdc,0xac,0x86,0xd9,0x93,0xa4,0xc1,0xf7,0x58,0x50,0x78,0x6d,0x79,0x5f,0x02,0x2b,0x79,0xbe,0x6a,0x54,0x77,0x69,0xe4,0x15,0x69,0xc5,0xa9,0xa3,0x0a,},"\x6e\x7c\x6b\x12\x2a\xb3\x6b\xd1\x35\xf6\x9e\x2b\x85\xe7\xfc\xce\xfb\x07\x2c\x12\xcf\x08\x8a\x32\x29\xd8\x76\xef\xf5\x32\x38\x9f\x05\x77\x11\x6f\x7a\xf2\x9f\x11\x95\xe3\x82\x88\x39\x38\x13\x80\x46\x71\x78\xb2\x29\xc5\xa1\x8d\x7c\x49\x43\xec\x97\x0d\xd1\x8b\xce\x72\x3b\xd0\xca\x91\xff\xa9\x55\x63\x54\x6a\x32\x4f\xe0\xb9\xbf\x6c\x04\x55\xd4\x27\x60\x39\xe8\xd2\x91\xfc\x72\x76\xaa\x55\xa1\xcd\x3e\xa0\x52\x82\x65\x4a\x7f\x97\x00\xad\xcb\xc7\x80\x77\xc5\xdd\x0f\xc8\x6e\xce\xd4\x8f\x4a\x60\xcc\xb7\x6b\xfb\x8b\x45\x62\xba\xc2\x2a\x02\xd1\x9e\x44\x89\x39\x4a\xb9\x71\x9f\xc1\x44\xf5\xdb\x2e\xf0\x39\xb3\x7f\x3b\x51\xd1\xd6\x57\xa0\xcf\x83\x5d\x71\xf1\xa4\xaf\x01\xeb\x9f\xd8\x85\xc6\x04\xa6\x24\xcb\xe9\x10\xbf\xde\x09\x3a\xd3\xf0\xcb\xfd\x9a\x48\x30\x73\x29\xd4\x42\x34\xbd\x01\x19\x1d\x56\xe5\x22\xd7\x2b\x54\xe1\xfe\x47\x33\xda\x3a\xec\x68\x27\xea\xb3\x55\x48\x98\xe0\x3e\x57\x7b\x4e\x7b\x9d\xd3\xf3\x08\xe6\x16\x80\x8d\x02\x94\x49\x9f\x28\x86\x29\x5e\x54\xc3\x60\x19\x9c\xa8\x3a\x83\xff\x46\x19\x5e\xa3\xc4\x84\xa6\x68\x38\xd5\x1a\xcb\xe9\x61\x1e\xee\x03\x6a\xe2\x81\xc6\x79\x3c\xbd\x45\x1f\x92\x71\xfb\x5d\x25\xea\x7c\x18\x99\xab\x5d\x43\xed\x8b\x9d\x06\x7b\xc5\x6d\x8d\x4a\x15\xf1\xda\xb8\xd8\xd9\x5d\x1b\x17\xaf\x64\xcb\x18\xc1\x14\x75\x51\x14\x7a\xdd\xcb\xdd\x53\xfb\xcc\xd9\x02\x6f\x85\x55\x47\x13\x1b\xee\x95\x07\x16\x39\xf6\x49\xf2\xd0\x35\xa2\x5a\x3e\x42\xe3\x8e\x22\xbb\xf0\x38\x10\x6c\xe8\xbc\x4a\xd6\x76\x8a\xb9\x2c\xd5\x7a\xfa\xcd\x04\xee\x55\xcf\x07\x14\xb7\x68\x95\x2d\xac\x24\x0b\x1e\x9b\x28\x35\xec\xf7\xb0\xd6\xc4\x07\xc8\x25\x24\xa9\x23\xb9\xf5\x4d\x1b\x8f\x12\x56\x4a\x87\x21\x44\xef\xad\x3f\x3a\x7d\x23\x97\xcd\x12\x17\xdc\x5a\x9c\x96\xe4\x3b\x29\x60\xa8\x42\x5e\x97\xe0\x7a\x02\xb0\xda\xc9\x0f\x34\x6b\x91\xa3\x46\xa2\x3e\xd2\xbb\x7f\xe6\x91\x9c\x22\xdf\xf0\x3f\x62\xda\x7d\xba\x17\x6e\x8d\xdb\x22\xf3\xf3\xa6\x68\x89\x1d\x3f\x4e\x69\x54\x8d\x0a\xc4\xe7\x1e\x6d\x28\xed\x5a\x67\xab\x5a\xc6\x11\xd4\x60\xb6\x7a\x20\x1f\x4f\x56\xa5\x00\x3c\xa7\xa7\xd1\xcd\x1d\xb6\xc1\x00\x75\xb0\x92\x27\xcb\x8c\x5d\xc1\x66\x6f\x8b\xe7\x10\xb4\xb7\xbc\x2b\x95\xae\x60\xda\x4f\x64\x17\x9a\x50\xd2\xf8\x87\x44\x36\x15\x91\x67\x1d\x36\xb7\x29\x63\x15\xf6\x99\x64\x39\xad\x79\x82\x1d\xa8\xe7\x72\xdf\xbf\x55\xa9\x0d\x5d\x52\xef\x7d\x76\xb3\x5f\xfe\xbd\x42\xe3\x52\x5f\x45\x30\xc5\x4a\x0f\x23\xb4\xd0\x7c\x5f\x59\x74\x47\x0e\x89\x40\x4d\x17\x6e\xef\xf9\xef\x23\x33\x61\x96\x91\xc5\x9b\x7a\xad\xd4\x2c\x29\x6b\x1d\x0d\x32\x8d\x9a\x3b\xd5\x9a\x54\xbb\xa9\x3a\x0c\x1f\x1d\x62\x41\x8c\x21\x90\xc3\x81\x74\xb6\xab\xea\x02\xdb\x66\xe8\x18\x32\x0e\xc4\xb8\xba\xc1\xc1\x2f\x18\xf3\x0d\xad\xe2\x7e\x63\xc5\x8f\x9e\x7c\xaf\x4b\xf6\x9b\x26\x5a\x2f\x9d\x91\x80\x08\x61\xac\xf4\x79\xe6\x5e\xc1\x7e\x68\x05\x77\xe0\x58\xcb\x16\xc1\x09\xbc\xf9\xb2\x90\x9f\xce\x33\x61\xa2\xc2\x68\x5c\x10\xbe\x85\x40\xa1\x22\x2d\xb5\xec\xf0\xcc\x4d\x53\xa4\x21\x4b\x7b\xf6\x24\x8a\xdc\x3a\x86\x1e\x34\x84\x1a\x37\x79\xc4\x60\x46\xc5\x36\x4f\x1e\xa9\x1a\x78\xc9\x70\x0d\x46\x2e\xcf\xaa\xe3\x6b\xa7\x60\xc1\xbd\x6a\x23\x7c\x96\x1e\xdf\x40\x22\xce\xde\xfe\x5e\x93\x7b\xbe\xd7\x05\x1a\xe6\x1b\x96\xd0\x8b\x04\x87\xce\x05\x68\xff\x0d\x32\x74\x0b\xbd\x49\xad\x0d\xb8\x6e\x09\x10\x2a\xb2\x1a\x91\x56\x16\xe9\xdf\xdd\xc8\x1e\xbf\xb3\x6c\x90\x3e\x07\xa4\x0c\xd2\xdd\x11\x9f\xf4\xa5\x0b\x93\xfc\x6f\xdf\xc0\xf3\x6e\x59\xe0\x14\x8f\xcf\xf3\xfe\x8e\x2c\xd6\xd3\x0a\x9e\x4b\x8f\x01\x55\x67\xd1\x18\xb6\x27\x4e\x1e\xd7\x5b\x22\xe4\x4c\xa9\xd9\xdb\xfc\x16\x07\x42\xcf\xac\x58\x1e\x1a\x0b\xf5\xff\x33\x26\xbc\x5f\x78\x96\xb9\xca\x05\xa8\x11\xd5\x5e\x97\xc8\x34\xd3\x7a\x64\x95\xcc\x26\xcf\x44\x2b\xd2\xd9\x01\x29\x89\x5e\x9c\xc0\xed\x01\xe2\x15\x52\x93\xf4\x7a\x07\xab\x58\x80\xc6\xca\x29\xed\x44\xd9\xcc\xbc\xaa\xda\x7f\x3e\xb6\x04\x02\x18\x14\x88\x65\x4e\x04\x91\x15\x78\xb1\xaa\x9c\xdd\x4b\x86\xb0\xdd\x24\x50\xdf\x3a\x43\x08\x1e\x41\x10\xab\x58\xde\x76\x39\x24\xd3\xc8\x91\x52\xe9\x92\x93\xe6\x38\xf9\xac\xd8\xd7"}, +{{0xa6,0x3c,0x1f,0x54,0xb2,0xca,0x05,0x8f,0xed,0x2e,0xe2,0x50,0x4b,0x98,0x3f,0xf3,0x3d,0x57,0x0a,0x9b,0xab,0xa5,0x83,0xc0,0x86,0xce,0xfe,0x19,0xf4,0x3e,0xc4,0x9d,},{0x32,0x9b,0x86,0x6b,0xca,0x41,0x94,0x29,0x7f,0xc1,0xad,0x5a,0x0e,0xba,0x0d,0xf9,0x56,0x69,0x9c,0x74,0xab,0x7d,0xa5,0xfa,0x54,0x62,0xbd,0x06,0x61,0x47,0x10,0x20,},{0x28,0x33,0x59,0xbe,0x41,0x29,0x0a,0x51,0xe6,0xa7,0xc5,0xd5,0x72,0x5c,0xa4,0xea,0x0a,0x68,0xf1,0x4a,0xca,0x14,0xb0,0xf0,0x25,0x66,0xde,0xe2,0x1f,0x49,0x0d,0xa3,0xc7,0xe9,0x5f,0x7a,0xb7,0x39,0xbc,0x35,0xa7,0xf4,0xf2,0x32,0xe9,0x71,0xaa,0x15,0x76,0x57,0xa6,0x33,0xeb,0xa0,0xe7,0x2d,0xc9,0x7a,0xf3,0x2c,0xdb,0x92,0x87,0x02,},"\x79\x1b\x86\xfd\x58\x77\x13\x47\x8f\x92\x34\xff\x30\xce\xfc\x12\x3c\xd7\xc3\xeb\x12\x5f\xa7\x4e\x4c\x6d\xb6\x4e\x78\x44\xf7\xc8\x5b\x16\x86\xe7\x1e\xd0\x8d\x1a\x6a\x04\xe0\xeb\xbd\xff\x4a\xb1\x60\xc9\x76\xc8\xab\x9b\x50\x5f\x6a\x7e\xb0\xa1\x84\x27\xe9\x99\xa8\x82\x8d\xf1\x06\x84\xf8\xc7\x5b\x6a\x6b\x0a\x64\xc0\xaf\xa4\xbb\x22\xbe\xd1\xcb\x93\x25\x35\x9c\xac\x3b\x8c\x50\x8d\x98\xbc\xb0\xeb\xcd\x74\x8d\xc1\x32\xf1\xd6\xa3\x60\xa4\x45\x0d\x12\x92\xa1\xfe\xfc\x4e\x57\xe4\x10\x7a\x22\x3f\x42\x1e\x7d\x14\xa3\x84\xb8\x5c\x18\x84\x4d\x0b\x9e\xed\x2e\xcb\x81\xbb\x74\xe8\xa1\x26\x52\xd9\x85\x05\x79\x5a\x01\x31\x16\xa7\x07\x6c\xcb\x54\x93\xd6\xa7\x11\xf7\x63\x7e\x97\xa7\x80\xe7\x4d\xa1\xb3\x9b\x15\xcc\x7b\xbd\xe2\xe6\xc4\xd0\xd3\xe8\x30\x05\x97\xc8\x36\xe8\x0b\xcb\x8d\x80\x81\xd9\x74\xe0\x24\x32\xea\xc8\x83\x68\x21\x1d\x3a\xaa\xe8\x9a\x14\x41\x71\x08\xe1\xff\x67\x37\x08\x38\x49\xc6\x25\xb4\x0d\x63\x1f\x6c\x83\x57\x22\x0c\x7f\x37\x38\x0b\x3b\x2c\xc5\xd0\xe2\xdf\x6b\x4d\x11\x96\x57\x9d\xbc\x57\xb6\xc9\xea\x0d\x41\xf4\xfa\x0e\x55\x6f\x94\x3c\x94\x48\xef\x42\xfc\x78\xdf\x59\x96\x64\x8c\xe2\xf3\xde\x04\xd8\xa6\x63\xf9\x67\xf3\xd9\x33\xd4\xf6\x53\x57\xab\x29\xba\x5b\x64\x05\xfb\x16\x29\x72\x57\x8d\xdb\xb2\x36\x7b\xed\x14\x3c\x85\x4c\x10\x88\xde\x92\x1d\x79\xf5\xa9\x2a\x85\x48\x37\xeb\x77\x02\xe1\xba\x92\x5c\x6e\xac\x23\xd1\x34\xba\x1b\xaf\xc5\xd4\x6d\xe2\xa1\x94\x2c\x7f\x36\x6f\x70\x1b\x0a\xfa\xbb\x75\xcb\x1d\x80\x8e\x1a\x1e\x4e\x3a\xe5\xde\x88\xe8\xe9\x98\x97\x57\x45\x8b\xdd\xd8\xa8\x06\xc1\x10\xcc\x3a\x73\x3d\x1d\x4a\xc5\x8a\x40\x5c\x4d\x81\x13\x4f\xbc\x24\xcc\xde\x7d\x5a\xfe\x42\x0f\x9f\x17\x85\xf0\xa5\x02\x0f\xaf\xbb\x22\x61\x22\x25\x08\xaa\x05\x28\xb7\xb4\x8b\x56\x72\x00\x95\x84\x25\xef\xcb\x42\x93\x4a\x88\x0b\x13\x34\x44\xbb\x10\x9f\x2a\x95\x4c\xfa\x35\xa2\xd1\x7c\xb0\x5e\xe3\xf1\x6d\x06\xb3\x21\xa1\x5f\x91\x33\x9a\xbe\xda\x24\x3a\xd6\xc0\x91\x9f\xac\x51\xe9\x07\xe0\x53\xfd\xee\xd1\xcf\x03\x00\x37\x34\x13\x77\x93\x94\x1b\x8a\xdf\x9a\xb6\xaf\x81\x9c\x24\x5d\x6d\x56\xf1\x69\x64\xc8\xa7\x5b\x07\x56\xa8\xcb\x0c\xa8\xc1\x2a\xc6\xe6\xb3\x94\x2e\xeb\xec\x2f\x86\x88\x35\xf8\x1b\x10\x9d\xb4\x98\xa4\xca\x2e\x02\x1f\xa7\x65\x60\x8d\x23\xd8\x03\xde\xdc\x9e\x51\x45\x3f\xc1\xd2\xa6\xa3\x8a\x4a\xab\x25\x7c\x0f\xe7\xd6\x7d\x32\xa5\x41\xe0\x14\xb6\x0e\x10\x13\xa9\x2c\x1b\x3a\xd9\xe6\xf1\x1b\xe2\x93\xb2\x46\xf9\xa0\xc6\x44\x0b\x0b\x54\xfe\xe7\x5f\xed\x2f\xb7\x5c\xc9\x1e\xcb\x32\x73\x8c\x49\x58\x31\x58\x6a\x11\x24\x2d\x87\xdc\xb4\x88\x3e\xdf\x67\x57\xa5\x0b\x18\x84\x37\x59\xb9\x8d\xd0\xce\xf4\xa3\xfe\x10\xd7\x63\x70\xec\xda\x8c\x83\xfa\xb8\x7e\xee\x26\x56\xc5\xf2\x61\xc3\x40\xea\x91\xa5\x60\xd0\xe2\xc6\x42\x89\x26\x7f\x00\x36\xba\x35\x94\x48\x00\xa5\xa0\xae\xf3\xf1\xdf\x83\x9a\x72\x4e\x18\x1d\x79\xb8\xa3\xc1\x6f\x65\xae\x27\x95\x3c\x4a\xae\x8c\xcd\x30\xff\x5a\xcc\x4b\x31\xe4\x76\x5c\x68\xfb\x38\x31\x9f\x10\xac\xf8\x92\x47\xb5\xa3\x9b\x3b\x08\xa1\x91\x75\x4a\x24\xac\xa9\x59\x6a\x1f\x8a\x70\xb6\xe4\xf0\x3a\x20\x04\xa9\x08\x6f\xf6\xed\x07\x65\x2a\x92\x6e\x1e\x2d\xf7\xbd\xcc\xd5\xbe\xc1\x6e\x5c\x4e\x96\x83\x64\xa0\x9a\xbf\x9d\xed\x93\xdf\x5f\xca\x0b\xcc\xa5\xc8\x12\x97\x6e\x5c\xfb\x3c\x34\x93\xfc\x17\x5d\x1d\x92\xee\x8d\x1c\x98\xfb\x33\x82\xb3\xab\x90\xc5\xc0\xe4\xbd\xf6\xa3\xac\x94\x76\x7b\x68\xd4\x7e\x6b\x9c\x24\x42\x65\xe3\xb1\xab\x06\x23\xa8\xf0\x10\x02\x73\xf2\xc6\x07\xde\x89\x61\x2c\x72\xd3\x9b\xe4\xc0\xb4\xd7\x7a\x3c\x61\x36\x8d\xf4\x0b\x36\x08\x65\x29\x89\xd1\xe1\x9c\x0a\xaf\x0e\x3c\x25\x3e\x56\x2c\x64\x09\xfe\x64\x48\x92\x9b\x33\x75\x3d\xe1\x62\xe6\xde\x5b\xd4\x66\xa5\x11\x4f\xc0\xe5\xf5\x71\x02\x75\x5e\x29\x54\x4f\x03\xb2\x8d\x4f\x78\xde\x9a\x02\x4d\xd4\xc4\xe8\xc3\xc2\xd4\x41\x15\xa7\xae\x15\xed\xb4\xf5\x58\xaa\x7d\xba\x64\x26\xe7\xe3\x72\xc5\x4f\x79\x40\xbd\x77\x14\x46\x7f\x8c\x3a\x1a\xdd\x3c\x64\x01\x89\xc3\x16\x60\xd8\xcc\x01\xd3\xc5\x38\x2e\x42\xab\xc1\x04\xc7\x23\xf9\x48\xa8\x04\xca\x85\x30\x47\xb6\xb8\x7b\x5b\x6e\xf4"}, +{{0x5b,0x67,0xa6,0xd7,0xc6,0x50,0xdd,0x92,0xdd,0xd0,0x36,0xce,0x7a,0x30,0x5b,0xc9,0x59,0xa4,0x97,0xc5,0xe5,0x15,0xa6,0x84,0x93,0x03,0x5c,0xb3,0x85,0x0e,0xe0,0x3d,},{0x4c,0x6f,0xc1,0x64,0x05,0x05,0xfb,0x46,0x66,0x9f,0x93,0x04,0x8f,0x8e,0xf5,0x57,0x09,0x9f,0x3f,0xd9,0x2a,0x53,0x06,0x4b,0x16,0x33,0x63,0xa3,0x1b,0x7f,0x00,0xaa,},{0x0f,0x07,0x3c,0x9a,0x58,0x6f,0x6f,0x5e,0x08,0x38,0x9a,0x2a,0x5e,0x18,0x08,0xe2,0x70,0xf0,0xed,0xb6,0xaf,0x10,0x44,0x96,0xf9,0x37,0x57,0x62,0x3f,0xea,0x53,0x13,0x3a,0x73,0x1c,0x44,0x5a,0xc2,0x35,0x78,0xcd,0x56,0xa3,0x88,0x3c,0x08,0x95,0x86,0x68,0x63,0x1f,0xed,0xf1,0x44,0x6c,0xe3,0x4f,0x85,0x7f,0x90,0x82,0x2b,0xa8,0x0a,},"\x62\xcc\xde\x31\x77\x2c\x57\xe4\x85\x3a\xaf\x2a\x81\x81\xfd\xb5\x3f\xb8\x27\x90\xea\x65\x01\xbf\xc8\xf5\xd4\xae\x8d\xbd\x52\xde\x42\xce\x2e\x89\x61\xac\x17\x31\xf4\xbc\x08\x5f\xb5\x61\xef\x09\xa2\x44\x29\x70\xb6\x29\x79\x01\xae\xaa\x2e\xe5\x55\xb7\xd5\xe3\x95\x1c\x7c\x35\x12\x39\xdd\xee\x95\xff\x54\xf9\x24\xda\x95\xca\xe7\xb1\x5b\xa6\xa9\xa1\x33\x7b\x8c\xe4\x92\x1e\xd9\x13\xcd\x79\x1c\x1c\x69\x41\x08\x0e\x54\x8f\x3c\x36\xe8\x45\xac\xbf\xd8\xd8\xce\x35\xe2\xfd\xc2\xa2\xad\x6c\x7e\x24\x61\xbf\xcb\xf1\xaa\xbc\x55\xcf\x0f\xae\x42\x88\x85\xbe\x5e\x86\x53\x33\x08\xc9\x75\x68\x05\x21\x9a\xbd\x7f\xfc\x16\x57\xb6\xf4\x63\x29\x20\xa0\xc1\x0e\x0e\x36\x33\x19\xd9\x00\xfc\xd6\x1e\x7d\xdb\xcd\x6e\x76\x2a\x7d\xb9\x24\x80\xc3\x63\xb2\xc0\x64\x0c\x6b\xf3\x2d\x69\x0d\xd8\x29\xd8\x40\x5f\xa6\x6e\x47\x83\xeb\xe1\xcb\xde\x95\x47\x95\x4a\x90\xba\xad\x9f\x77\x4e\x94\x54\x9a\xbb\xff\x2c\x1f\x5c\xae\xc2\xbf\xd2\x8e\x41\x5d\x36\x42\x9d\x58\x51\x8c\x3e\x17\xe8\x69\x9e\x19\x89\xd4\x7b\x8d\x62\x7e\xf9\xab\x4d\x1e\x7d\x12\x0b\x37\x2c\x21\x41\x30\x4f\x7f\xab\xd0\x26\x5b\x8b\xe4\x1f\x54\x67\xf4\xde\x9e\x65\xc1\x25\xee\x1f\x27\xa2\x89\xc4\xf7\xc9\xa1\xfb\xf2\x5b\xfc\x2f\x8d\x30\x8e\x7f\xf5\x21\x91\xcb\x76\x44\xc6\xaf\x20\x45\x22\xf2\xac\x87\xb5\xf4\x05\x25\xfd\x43\xd3\x08\xc8\xdb\xc6\xa8\x61\xd2\x5d\xb2\x3e\xe2\x76\x67\x8a\x1b\x6e\x8e\x91\x28\x3b\xe0\x24\x70\x48\x2e\xd6\xcc\x9f\x6e\x39\x63\x51\xd1\x1b\x1c\x7e\x22\x32\x9c\x09\x1f\xe7\xd3\x68\xf6\x06\x53\xf9\x3b\x0f\x6a\x3f\x71\x2c\x20\xf9\xd2\xd8\xa9\xa0\x81\x98\x72\xf0\xc7\x1d\x7b\x1c\x0b\xc1\x68\x3a\x15\x2b\x48\x4b\xc2\x1c\xf5\x56\x09\x3a\xb4\xc0\xac\x16\xd3\x22\xff\x0b\xf4\x52\xe5\x58\x1e\x1e\x72\x41\x67\x38\x84\x02\x3c\x7d\x6e\x17\xe2\xde\x80\x59\xf6\x0e\x4c\x18\xe1\x3b\xd5\x5f\xcf\xee\x62\x3f\xd0\x46\x9c\x0d\x09\x11\x61\x1d\x09\x9a\x25\x70\x20\xf2\xf3\x1b\xf5\x07\x8e\x6e\x65\xa1\x35\xd5\xbf\x40\x76\x20\x23\x6d\x6c\xc7\x59\x31\x0f\xa7\x28\xff\x8b\xb5\xec\x56\xab\xbe\x1a\x3c\xd1\x51\x53\xf8\x92\xd9\x58\xd3\x0d\x16\x2d\x01\xee\x66\x5f\x5b\x56\x27\x81\xd8\xdc\xf8\x42\x80\x59\xe5\xfd\x22\x5a\xd7\x8a\x99\xea\x76\x0f\xe5\xd9\xee\x82\x19\xc9\x5a\xcb\x18\xd0\x56\x22\xe1\x0a\x9b\x6c\x67\xf6\xd4\xf6\xed\x11\x63\x5c\x5e\x2e\x0f\x85\xdd\x5d\x3c\xbd\xa6\x5a\xa4\x23\xd5\x94\xa8\x0b\x40\x42\x7b\xc3\x21\xe0\xee\xf9\xaf\xd2\xbc\x87\x46\xab\x73\x99\xff\x6d\x0e\x12\x87\xb6\x61\xdd\xc4\x06\x2d\x07\x20\x18\xf4\xc1\x0e\x86\xcf\xae\xd7\x2d\x9e\x68\x6e\xd0\x9d\x52\x55\xd3\x60\xe3\xee\xa2\xc2\x9b\x9e\xae\xa0\x5f\xc7\x8c\x8c\xdb\x8c\x9d\x4a\xfc\x7a\xdc\x6d\x4a\xa0\x67\xb7\xab\xfb\x0a\x4e\x94\x0a\x77\x58\x0e\xc2\x06\x45\x6c\xb9\xe9\xf9\x5f\x6d\x56\x5d\x53\x6e\x53\x5a\x16\x7e\xde\x8e\x20\xec\x36\x08\x1e\x2f\xc5\x5a\xef\xaf\x24\xd2\x27\xff\xfe\x5e\x6c\xb0\x30\x93\xf4\x43\xb4\xc5\x16\x55\xd9\x1c\xa6\xf2\x75\x95\x9d\x1a\x80\x2a\xde\xab\x44\x70\x1b\x31\xe8\xb0\xfd\x02\x22\xc4\x99\x96\x6c\x72\xd1\x02\x0a\xd9\x37\x0e\x28\x02\xbe\x04\xc9\x93\x3f\x6b\x77\x4f\x6e\x8c\x69\xfc\x0b\xfd\x31\x59\x39\xa1\x27\xb4\xe0\x6d\x0f\x6f\x5e\xde\x67\x1c\xe1\x16\x12\x12\x6b\x51\x87\xb5\x33\x29\xb0\xa9\xcb\x7d\xa3\xb1\xcc\xd6\x7b\x8c\x07\xba\xb9\x9a\x66\x2d\xf8\xce\x85\x1f\x50\x2f\xc4\xe1\xed\x16\x32\xb6\xba\x55\x55\x44\x01\x8f\x75\x27\xe3\x62\xef\xc7\xe3\xb2\xba\x6f\x75\xa1\x25\x4f\x42\x8b\x3b\x7e\x0b\xea\x69\x54\x9e\x7f\x9c\x73\x62\x75\x55\x00\x80\xae\xe3\xaf\x59\x14\xe3\xa3\x4b\xe6\x56\xc7\x7f\x6b\x29\x42\x0e\x54\x33\xf3\xdf\xf3\x81\x1f\x35\x28\x20\x8e\x9d\x85\x0a\xa3\xc2\x9b\x0f\x77\x8a\x24\x27\xd5\xfd\xe3\x07\x32\xdf\xe5\x04\x43\xa9\xc1\xad\x55\xc7\x2a\x08\xab\x26\xff\xaf\x8e\xfb\x90\xbc\xaf\xd3\x72\x6b\x00\xc0\x05\xc8\xc0\xf0\xdb\xf2\xa1\x35\x30\x86\x72\x1e\x44\x65\x45\xb8\x13\x44\x11\x94\xa7\x55\xfd\x26\xb9\x63\xaf\xd9\x77\x27\x8d\x1b\x10\xf0\x90\x01\xc7\xed\x97\x54\x03\xc1\x5c\xbe\x7f\x99\x2a\xb0\x7b\x84\x70\xc9\x39\xf8\x66\xf4\x20\xf7\x7d\xb7\x79\xaf\x83\x97\x00\x32\x9e\x07\x77\xa6\x11\x63\x65\xd7\x6c\x36\xd0\x9d\x86\x04\x72\xa5"}, +{{0x26,0x31,0xc8,0xc3,0x4d,0x29,0x48,0xdd,0xd5,0x99,0x6b,0x41,0x49,0xce,0xfd,0x23,0x8e,0xa7,0x45,0x2e,0xc2,0x2e,0x24,0x61,0x24,0xdf,0xa2,0x79,0xcc,0xc2,0x7d,0xb8,},{0xc3,0x90,0x67,0x86,0xff,0xb8,0xa7,0xc2,0x7c,0x44,0xc2,0x44,0x7f,0x9d,0xde,0x7d,0x66,0x6d,0xfe,0x58,0x8c,0xfc,0x54,0xf2,0xd2,0x50,0x40,0x51,0x2a,0x37,0x1b,0xc1,},{0x0a,0xdc,0x6f,0xa4,0x0f,0xfb,0x81,0xf6,0xef,0x4e,0x41,0x87,0x55,0x49,0x17,0x77,0x5c,0xf4,0x65,0xe7,0xb5,0xe8,0x57,0xf2,0xe1,0xe7,0xf4,0x00,0x97,0x71,0x06,0xd2,0x37,0x7e,0xbc,0x76,0xab,0xb1,0xdb,0x92,0x4c,0x64,0x86,0x7e,0x3c,0x6f,0xe3,0x8c,0x0b,0x4f,0xcb,0x1d,0x0f,0x94,0x68,0xe8,0xfb,0x23,0x50,0x29,0xa8,0x1c,0xe6,0x04,},"\x6f\x9b\xdc\xe1\x44\x3f\x28\x56\xd4\xa2\xf2\x27\x82\x83\x50\x12\xb7\x81\x8a\x0e\x02\x0d\xbc\xc2\x2a\x82\x16\x58\x30\x5f\x13\x42\x34\xd1\x4c\xea\x63\x61\x00\xed\x89\x6c\x2a\x8f\xb0\xe8\x70\x48\xec\x6f\x8b\x31\x48\x4f\x78\xeb\x17\x10\x45\xad\xd7\x2c\x85\x71\x0e\xc9\xf9\xb5\xd4\x36\x23\x41\x7b\x56\x53\xbe\x86\xe7\xfb\xf8\xb4\xff\x91\x11\x0a\x80\x8c\xb4\x1a\xcf\x66\xd4\x36\xe8\x9a\x73\x7f\xae\xa4\xef\xf3\x54\x49\x60\xf1\x14\xb8\x33\xb0\xb4\xeb\xc2\xc1\x40\x70\xb0\xbf\xb7\xb0\x05\x7e\xeb\xb8\x42\xbd\x1c\x1e\xd4\x58\xad\x34\x28\xf8\xf7\x2a\x1d\x1d\xb3\xc4\xcb\x47\x97\xa3\x99\xd4\x7a\x1e\x6d\xb7\x4d\xcb\x2e\xe2\x4a\xe8\x15\x85\xcf\x66\xef\x6d\x9b\xd2\x23\xf0\xf5\x4b\xc8\xc1\xce\xc1\xbb\x44\x60\xbe\xf4\xff\xd3\x2e\xe8\x05\xc3\xca\x5e\xe9\x76\xff\x9c\x14\x55\x9f\x8d\x75\x66\x62\xa2\xbc\x19\xe4\xc5\x98\x54\x06\xa0\x73\x05\xc9\x95\x0d\x86\x6c\x9a\x79\xa3\xe5\xf6\xc5\x96\x97\x53\xa1\x70\xe0\xfc\x4c\xc0\x9c\x6d\x87\xa1\x2b\x44\xcd\xf3\xbe\x16\x23\x15\x9e\x90\xca\xb7\xa8\xa3\xe6\xf0\x1f\x26\x85\x95\xb0\x21\xb1\xef\x7d\x00\x76\x94\x77\x27\x0d\x55\x84\xc9\x12\xe2\x2a\x36\x74\x38\x27\x7f\x59\xdf\x20\xc5\x62\x0d\xd5\xbe\xaa\x9b\xb6\x0b\xee\x47\xf4\xaf\x52\x7d\x89\x29\x57\xb2\xd1\x2b\x67\x8b\x52\x79\xa3\xf8\x32\x64\x65\x4c\x0a\x0f\x8d\x21\xe7\x09\x66\x8f\x30\xfb\x6e\x68\xf0\x47\xd0\xd9\xa7\xc2\xae\x9a\x28\xf7\xcb\x9d\xbf\x18\xf6\x3f\xc1\x66\x1f\x07\xd3\x10\xe5\x40\xc7\x76\x31\xf5\xbd\xac\x58\x24\x68\x5d\x7c\x9a\xba\x0f\xe1\xd0\x94\x07\xa9\x66\x2e\xf1\x8e\xb3\xe2\x8f\xd1\xe8\xbc\x89\x26\x57\xbc\x38\x24\x3a\x2e\x64\x53\xbd\xae\xab\xb2\x79\x1f\xc5\x48\x95\x21\x29\x54\x57\xad\x04\x18\x0c\xa8\x71\xf6\x31\x87\x92\xbd\x15\xfd\x18\x00\xce\x59\xdd\x3e\xcc\x7e\x0b\x72\x97\x92\x67\xd8\x18\x3e\x80\x4f\xdd\x45\xda\xad\x84\xfc\x4c\xaf\xeb\x56\x1e\xa8\xd6\xa7\x4a\x7c\xde\x72\x2d\x96\x25\x3a\xb3\xe7\x5f\x0a\xdd\xe0\x2a\x61\xfd\x5e\x1f\x59\xcb\x1f\x5f\x1b\x2e\x05\x26\x43\x58\x9a\x9e\x4b\xe4\xdd\x6e\xe6\x45\x38\xcb\x0b\x10\x9a\x11\x3f\x30\xa5\x8b\x35\x65\x62\x40\x43\x66\x2a\xbe\x17\xf6\x0e\x31\xe8\x9c\x36\xc9\x95\xe0\x0a\xe0\x7f\x56\xa9\x11\x8a\x31\xae\xc2\x4a\xd5\x44\xbc\x96\x58\x11\x21\x8d\xf8\x27\xc1\x73\x0b\xb9\x04\xbb\x79\xb6\x86\x13\xf6\xc9\x94\x67\x9b\x69\x90\xd7\x75\xb5\xcb\x32\xdb\x97\x19\x4b\xd8\x10\x19\xbe\xa4\x1f\x3a\x7e\xef\x50\x1b\xf8\x49\x1b\x0e\xa8\x59\x38\x84\x52\xe3\xec\xbe\x16\xaa\x7d\x56\x91\x51\x0a\x66\x06\xc4\x93\xe4\xc2\x93\x96\x1b\xf4\x0b\x4c\xd3\x00\xd9\xd2\x2e\xa1\xa7\x72\x4c\x07\x8b\x8b\xab\x1f\xd1\x65\x04\xe9\x89\xb1\x36\xd9\x25\x1a\xc9\xf1\xed\x94\xa5\xe9\xac\xbd\x9c\x04\xf8\x05\x8a\xfe\x03\x04\x9a\xed\x8b\xa2\x9f\xa2\xe8\xfb\x44\xf8\xe8\xc0\x4e\x87\x27\xf3\x99\xe7\x35\xe6\xc1\x49\x6a\x91\xa9\xb2\xcd\x2a\xb0\x2d\x43\xb2\x85\xe9\xd7\x61\x02\x93\xb6\x74\x9d\xf1\x04\x4b\x30\xe2\xda\x99\xa5\x64\x42\x9a\x23\xe6\x8c\x96\xfc\xe9\x2b\x08\xa0\x0b\x7b\x74\x2b\xa9\x7a\x62\xee\x58\x77\x6d\x7d\xd5\x65\xa4\x90\x07\x1d\x4b\x19\xdc\x64\x8e\x03\x32\x9c\xc5\xc8\x25\xd3\x87\xeb\xa4\x9e\x2e\xff\x6c\x43\x41\x86\x5c\x46\x4f\x13\xf1\xbe\xb1\x82\x7a\x7f\x26\x8c\xc1\x5a\x98\x24\x80\xbf\x08\x4f\xe3\x65\x2c\x1b\x0e\x0b\x4a\xd2\x62\x55\x85\x9a\xbf\x1c\x8a\x7f\x9b\x3b\xef\x09\x8a\x94\x07\xfd\xea\x0a\x53\x9e\xb0\x08\xfd\xd7\x49\xfa\x01\x86\xcc\x01\x69\xd9\xd9\xe6\x8f\xe5\xe5\x4c\xac\x32\xce\x57\xb5\xc8\x4c\x2d\x80\x5e\xca\x39\xc2\xdb\xbd\xd2\xe0\x2f\x7d\x22\x88\x26\x71\x2f\xf4\xa6\x14\x11\xca\x0a\xeb\x6f\x01\xa1\xf8\x0e\xf2\x9e\xeb\x07\x1a\x43\x22\x2d\x94\x97\x18\x4b\xd8\x5d\x9e\x44\xb1\x66\xbe\x97\xcf\xd2\xa7\x32\xaf\x4a\x23\x34\x63\xd3\xab\x54\x3a\x7a\x3c\x7a\xec\x55\x56\x56\x56\x88\x40\xf4\xdf\xea\x21\x7f\x65\x53\xaa\x98\xaf\x32\x4c\x12\xb2\xc3\x21\x4e\xe7\x6e\xec\x70\x06\x70\xaf\x68\xc8\xc1\xf3\x69\x46\xef\xd7\xff\x09\x33\xe5\x45\x3f\x12\x8e\x97\x15\xfd\xb3\x34\x4a\xc1\x0c\x4b\xb7\xec\x8f\x10\xdd\xf5\xdb\x71\xf1\xcf\x0e\xfe\x40\xf7\x5e\x5b\x63\x34\xef\x8c\xf8\x42\x9b\x32\x91\xe6\xe4\xce\x37\x9c\x17\x8a\xff\xcb\xc6\x10\x30\xeb\x89\x6d\x74\x4d"}, +{{0x39,0x76,0x9a,0x66,0xf0,0xca,0x12,0x90,0xfd,0xa1,0x43,0x75,0xb3,0x5c,0x66,0x3f,0x6a,0x4b,0x2a,0xb3,0x60,0x71,0x79,0xab,0xd9,0x90,0x63,0xe2,0xef,0xa2,0xc6,0xa8,},{0xf9,0xfd,0x4c,0x19,0x1f,0x38,0xf1,0x21,0x90,0xd3,0x28,0x5e,0x20,0xc6,0xce,0xe5,0x4c,0xfd,0x6f,0xf3,0x15,0x30,0x0a,0x4e,0xfd,0xc8,0xa9,0x0e,0x80,0xaf,0x40,0x83,},{0x14,0x42,0xde,0xa2,0x80,0x7e,0x03,0x11,0x59,0xec,0x6a,0x41,0x2d,0x8e,0x07,0xbb,0x3e,0x29,0x93,0x08,0x09,0x0f,0x21,0x8f,0xa7,0xc1,0x0a,0x9c,0x50,0x68,0xef,0x9b,0x64,0xef,0x11,0xca,0x9f,0xb9,0x2b,0xe1,0xd0,0x21,0x6b,0x99,0x31,0x8f,0xf0,0xf0,0x3c,0xb8,0x71,0xcd,0x7d,0xd6,0x3a,0x38,0xae,0x17,0x02,0x31,0x3e,0x5b,0x25,0x0c,},"\xff\x4d\x89\x87\xe3\xfa\x36\x01\x2b\x75\x86\x73\x6b\x79\x3d\x65\x97\x54\x69\x8c\xd1\x2b\x65\xe5\xba\x9d\x75\x8c\xac\x16\x49\x28\x8d\x20\x22\x43\x77\x28\x3e\xa5\x42\x5d\xec\x10\xab\x99\x17\xd1\x8c\xd1\x3d\x1b\xdf\x4a\x76\x9f\x37\x04\x4c\x84\xfa\xa2\xa4\x49\xc6\x89\xe0\x04\xc1\x4e\x00\x5c\x49\xda\x41\x06\xff\x75\xce\x13\x03\x36\x1c\x6e\x3e\x34\xcc\xfe\xe7\x5e\xe9\xc3\x1c\xbd\x06\xa4\xbc\xdb\xb4\x2f\xd6\x49\xbe\x4d\xfc\xd6\x64\x00\x6d\x6a\x5f\x61\x07\x7c\x04\xa6\xa8\x1d\xb3\x6b\xe8\x6b\xa4\x2c\x29\x51\xf0\x51\xae\xda\x64\xac\xea\x49\x6c\xb9\x24\x98\x2b\x9f\x7d\x23\x4a\xc9\x72\x3f\xef\x98\xa8\xe1\x27\x55\xe3\x26\xa5\x2f\xbe\x35\x85\x1f\x41\x1e\xeb\x86\x76\x06\xd4\x5b\x51\x3f\x54\x52\x63\x91\xc5\x54\x63\x5c\x18\x0b\x8f\xd0\xee\x45\x1a\xfc\x96\xe4\xef\xd3\x60\xb6\x1e\x6b\xaf\x03\xdd\x6d\x19\xba\x51\x5c\x31\xec\x1c\xdd\x3a\xff\xff\xdb\x27\x35\x4e\x3e\x6b\x56\xe9\xe1\xa1\xa1\xb7\xd4\xb5\x7d\x9d\x76\x89\xbb\x2f\xea\x6c\x8d\x3f\x9c\xe0\xdf\x2d\x9e\xe9\x19\xc4\x23\x0a\x1f\x20\xb8\x5d\xfe\xfe\x1e\xa3\xd7\xf7\x7d\xb4\x70\xe4\x02\x24\x29\xef\x60\x9b\x0f\xf4\x49\x46\x44\x0a\xcb\x44\xcd\x13\x44\x5b\xcf\xa3\xf2\x05\x03\xc2\x6c\x2f\xb6\x63\xc8\x90\x65\xfb\x93\x34\xa6\x03\xeb\x9a\xb7\x15\x2e\x62\x62\x92\x33\xc4\x4c\xb0\x0e\x77\x71\x6d\x9b\x72\xc8\x4f\xd1\xb3\x40\x63\x4f\xf1\xce\xa3\x47\x50\x15\x76\x10\x0e\xcb\x0f\xd1\xbb\x76\xae\x0d\xff\x1c\x2b\x09\x48\xeb\x71\xee\x2c\xc3\x1e\x79\xd3\x01\x5d\x72\xdb\xee\x22\x4a\x98\x0e\x0f\x95\xa6\x9f\x79\x3d\xa8\x3a\x2d\xaa\x56\xef\xe5\x7b\x2f\x8c\xea\xac\x9e\x55\xf4\x43\xca\x9e\x73\x2b\x48\xc7\x5f\xac\x21\xc3\x6f\xa7\x72\x73\xc3\xf3\x48\x35\xff\xd8\x3c\x96\xf0\x0a\xc6\xe8\x6c\xff\xed\x08\x15\x36\x46\xc1\xce\xa2\x23\xda\x9c\xa3\x60\xca\xb9\x7e\x03\xb2\xb6\xc8\xfb\xa7\xc1\x95\xa3\x9a\xe5\x2e\xb2\xee\x86\x43\x00\xae\x56\xa1\x0f\x54\x7f\x99\xa3\x16\x98\x72\x24\x9f\x97\x77\x4b\x17\x98\x93\x55\x36\xf2\xf5\xf0\x11\xce\x57\x61\x3a\x94\xfc\xb7\xe7\x28\x6a\x6d\x49\xc1\x0f\xd9\x29\xd7\x67\x1c\xbb\x8c\xf1\x7d\xfc\xad\x4b\x24\x85\xc3\xd8\xfd\x79\x12\x87\x21\xe5\x5d\x84\x80\x87\x63\xc2\xaf\xa9\xc5\x5e\x3b\x0c\xd7\xbf\x2f\x0a\x66\xb5\xe4\x67\xbe\xc5\xee\x89\xad\x57\x0b\x60\xf1\x88\xb3\xf7\xb4\xa5\x11\xff\x85\x93\x12\xde\xd0\x78\xd8\xd0\x09\x11\x34\xfd\x49\xbc\x79\x2d\x2d\x7d\x60\xb3\x04\x94\x1c\x7f\x23\x20\x6f\x99\xe8\x63\xb1\xe2\xd8\xc9\xec\xff\xd2\xff\x0a\x3a\x3c\x75\x49\x85\x61\x5a\x9a\x92\xed\xce\xad\x00\xfe\x0e\x05\x49\x3b\x19\x8d\x1f\x7c\x90\x08\x84\x46\xbb\xa4\x60\x38\xa7\x1f\x32\x65\x3b\x59\x12\xb2\x4f\x43\x13\x77\x48\xb7\x5a\xec\x2c\x15\xfe\x4b\xf5\xa6\xf8\x6b\x8a\x6c\xdd\x9c\x74\x47\xf2\xeb\xb0\xf4\x3b\x01\xca\x15\x23\xe0\xd4\x96\x24\x00\x06\xad\x7f\xff\xfa\xfe\x0d\xf5\x75\x4b\x34\x2c\xaf\xf3\x55\x5d\x72\xa2\x7d\x0b\x92\xca\x16\x67\x66\x5c\xec\x43\xbf\xb5\x83\x07\x7a\x9c\x17\x41\xfa\x49\x2c\xe3\xdc\x2c\x75\x29\xcd\xed\x81\xb8\x28\x1a\x3f\x37\x59\x48\xb8\xa7\xce\xd0\x96\xb2\xfa\xcc\x25\xe3\x90\x29\xe2\x21\xb6\x6a\x53\xd3\x97\x9e\x1f\x40\x5f\xd8\x8a\xfc\x06\xec\x6e\x43\x09\xdc\x85\xe6\x9d\x6e\xf2\xb4\xb4\x92\x66\x16\x4a\x9d\x9d\x1c\x31\xee\x39\x21\x12\x7b\x13\x38\x1b\xfb\x74\x0d\xd3\x8d\xc1\xc7\x31\x59\x21\xf9\xc2\xfe\x58\xb6\x1b\x63\x1a\x7d\x9f\xde\x2d\xd8\xa4\xbe\x3d\xed\x04\x90\xae\x3b\x83\x76\x79\x19\x55\xc1\xc4\xb4\xfe\xd0\x0b\x9f\x4c\x38\xab\x73\x50\xfc\x2e\x37\xa3\x15\x0c\x18\x16\x2b\x1f\xaf\x03\x37\x89\x4b\xc2\x3e\x74\xf5\x95\xe4\xbe\x33\x46\x6d\xea\xb3\x54\x58\xbe\x97\xb4\xf7\x56\x58\x97\xf0\x68\x52\xf7\x1c\x60\xfe\xf9\x10\x1d\x72\x6b\x72\xe0\x10\x2a\x97\xb2\xca\x52\x11\xe3\x80\x68\x34\xb0\xac\x1a\x7d\xf8\x7c\x2a\x07\x8d\xf2\x63\xef\x8b\xa4\x57\xdc\x89\x1b\x7f\x2e\x62\x78\x11\xab\x62\x2b\x99\x46\xf8\xc6\xb7\x31\xf2\x40\x78\xd1\x7b\x06\xb2\x00\xc3\x44\x7f\x80\x32\xaa\x3e\x7a\x24\x3e\xe4\x22\xdd\xa2\xe6\x52\xfd\x75\x71\x3a\xfb\xce\x8a\x59\xef\x85\x36\x65\x3a\x48\xdc\xf4\x2a\x70\xe7\x62\x1f\x9b\x28\x02\x40\x9b\xe1\xc1\xa6\x1f\x32\xe3\x67\x89\xa5\xc5\x05\x5e\x1a\x82\x68\xe9\xdc\x43\x8c\x2e\x15\x27"}, +{{0x0c,0x80,0x8b,0x06,0x6f,0x0c,0x8e,0x8d,0xbb,0x1c,0x23,0xd6,0xc2,0xce,0xdd,0x0b,0xe8,0x66,0xd8,0x42,0x5f,0x24,0x1a,0x92,0x85,0x70,0x0e,0xa5,0x45,0x36,0xcf,0x6d,},{0x44,0xee,0x72,0x90,0x04,0x50,0xc5,0x6a,0xb2,0x1f,0x26,0x86,0xd2,0x95,0x25,0xd0,0x66,0x3e,0x0b,0xdd,0x87,0x72,0x5b,0xea,0xc5,0xd6,0x8b,0xac,0xeb,0x69,0xf1,0xd2,},{0x38,0xc6,0x82,0xce,0xde,0xfb,0x13,0xe4,0x6b,0x11,0xf7,0xb5,0xf8,0x00,0xcc,0x81,0x20,0xd4,0x5a,0x83,0xcd,0x8d,0x8d,0xec,0x10,0xc5,0x77,0xbb,0x01,0x53,0xd5,0x09,0xba,0x4f,0xdf,0x40,0x09,0x98,0x78,0x8b,0x70,0x60,0x07,0xce,0x16,0x2b,0x96,0x94,0x5c,0x71,0x40,0xbe,0xee,0x74,0xe1,0x9d,0x07,0x43,0xaf,0xa4,0xec,0xfd,0x25,0x0a,},"\xc9\x45\x71\x41\x00\x58\x1f\x4e\x24\xda\x11\xfc\x0f\x6c\x6d\x02\x10\x43\x3f\x97\x77\x52\x51\x24\xc5\x5e\xe0\x72\xd8\x5d\x79\x8b\x70\x5f\x9d\x31\xc8\xf9\x77\xdb\x6e\xdf\xb7\xa6\x5c\x78\xad\x2d\x7d\x31\xd6\xb7\xb5\xbe\x40\xff\x11\x78\xd3\x03\xb6\x83\x9b\xb0\xc6\x32\x10\xc1\xd3\x38\xc1\x03\xaf\xa0\xd4\x53\xec\xa1\xbc\xa2\x77\xd9\x30\x77\x8a\xd5\x08\x02\x27\x2f\x03\xdb\xe2\x18\x4f\xc3\x1e\xf8\xea\x6a\xbe\x21\x69\x97\x19\x9f\x7c\x1b\x33\x77\x37\x96\x89\x07\x27\x2a\xa5\x1b\xd4\x9c\x07\x38\x9c\x95\x46\x8c\xef\x4f\xd9\x9a\xe7\x8c\xa4\x54\x2a\x2b\xbc\x0e\x8a\xa9\x52\x14\xad\x1c\xff\xf9\xd5\x08\x5a\x43\x43\x94\x47\x3b\x84\xb7\x4b\xe9\xbf\x2f\x02\x02\xad\x1e\xe4\x61\x66\x04\xca\x1d\xd7\x5f\x4a\x19\x53\x42\xeb\xbf\x8f\xc5\x9f\x3f\x79\x61\x65\x54\xdc\x7b\xfd\xd5\x56\xbe\x43\x72\x21\xc1\x0b\xfa\xd3\x9e\x11\x9e\x06\x04\x5b\xe5\xfe\xd6\x83\xd3\x53\x4f\xb6\xcf\xed\x33\x89\x1c\x96\xf9\xc3\x30\xf2\x8b\x68\x4f\x8f\xba\xd4\x7c\x01\x41\x8e\xab\x6c\xee\xcc\x2e\xd7\x77\xf4\xc2\x18\xa2\x7a\xc2\x25\x82\x39\x23\x15\xc5\x3a\xa7\x30\x9e\xc5\x4c\x61\x75\x23\x6e\x44\x24\xdc\x97\x84\x65\xab\x62\x8d\x95\x44\xb0\xbe\x84\x10\x3e\xb5\x6f\x1b\xaf\xe5\xe5\xea\xed\x04\xc9\x8b\xfe\x2e\x8a\x24\x18\xc6\xc5\x2a\x61\xea\xce\x85\x23\x6b\x66\xc7\xb3\xb8\x70\x7e\xd5\x56\x41\xdd\x9d\x5d\xa9\x7c\x99\xc1\x1c\xbe\xb9\xaa\x2d\xb1\x47\x82\x0d\xc7\x24\x80\x0a\x9d\x80\xf5\x05\xfa\x5a\xf2\x09\x21\xca\xd2\x43\x56\x83\xbb\x4f\xc6\x0b\xdd\xd4\x75\xf8\x63\xe2\xf5\x95\x0d\x23\x63\x99\xd8\xd7\x5b\x40\x4b\x39\x4a\x54\x67\x37\xf9\x3a\x62\x40\x87\x00\xb3\xab\x3c\x1e\x92\x2b\x1a\x85\x9a\x29\x15\xc2\xd3\x53\x68\x81\x5c\xd4\x5b\x85\xb2\xac\x08\x31\x21\xff\x00\x0f\x05\x0d\xcd\xf4\x15\xe5\x27\x5a\x5c\x42\xda\xe3\xb1\x54\x00\xf3\xdd\xaf\x93\x39\xf2\x0a\x12\x61\xa8\x8c\xd9\x02\x05\x63\x97\x63\x21\x11\x52\xdf\x41\x4a\x9a\x6a\x62\x18\xf5\x6b\x35\xa2\xde\x9e\x84\x82\x44\x9f\x6d\xa7\x7c\x9e\x3d\x4a\xf0\x49\x30\x15\xa7\x26\x21\x7f\x82\xac\x58\x95\x4f\xe3\xe2\xe3\x44\x40\x35\x6b\x11\x2e\x06\xa6\xf6\x71\xfb\x5a\x6e\xf4\x61\x9a\x6e\xa7\xb4\xe0\x4d\xb3\x75\x7f\xb6\x64\xc3\x96\xb3\x41\xca\x89\x00\x1d\xc1\x60\x4b\x51\xfa\x91\x53\xf9\x13\x0c\x10\x20\xff\x88\x90\x92\x87\x82\x3a\xb3\x91\x5c\xcc\x85\xc4\xe3\x5d\xf6\xc2\xf8\xe6\xf9\x02\xbe\x82\xba\x21\x29\x7f\xd3\x83\x5a\xff\x5c\xe0\x2f\x3c\x07\xdc\x09\x3f\xcb\x1a\xba\x26\xe0\x6d\xfe\x6f\x02\xdf\x79\x29\x1a\xac\xa0\x69\xec\xab\x93\x81\x40\x4c\x9c\x3e\xa1\xad\x40\x9a\xdf\x29\x2a\x91\xe3\xa5\x82\xd5\xa7\xb6\x8f\xfb\xe1\x0a\x03\x05\x24\x8e\x09\x67\xe6\xdf\x37\x2f\x28\x1b\xd1\x92\xe1\x39\x97\x9c\x98\x66\xca\x8f\xe1\xe1\x0e\x06\x16\xdc\x2d\x4f\x85\xe1\x19\xe0\xcb\x4b\xfe\x8c\xc3\x1d\x9f\x5c\x01\x8b\x65\x40\x85\x24\x00\x0a\x30\x16\xa2\x3d\x99\x14\xd5\x7e\x95\x55\x76\xe2\x66\x0b\x0e\x0d\x96\xc8\x49\x5a\x12\xc3\xd7\x31\x22\xd2\x00\xb0\xf0\xe5\xeb\xd4\x46\x56\x2b\x08\xf4\x79\x34\xab\x49\x9a\x96\x99\x1d\xcf\x99\xc9\x6a\x62\x88\x07\x39\x84\x5d\x29\x82\x01\x50\x55\x3e\xae\x9b\xe0\xbb\x41\xd5\x3d\x3a\xf0\x1d\x98\x67\xbb\x47\x32\xc9\x0b\xf6\xe1\x37\x31\x6e\x3b\x1e\xdc\xc2\x09\xa8\xa0\x9f\xb0\x62\xa6\xef\x05\xf3\x7e\x57\xf2\xc5\xd1\xd0\xca\xba\xf0\x7a\x8e\xd7\xd4\x14\x55\x40\x7b\x09\x67\x54\x18\x0a\xa9\x6d\x3d\x96\x59\x19\x45\xdd\x7a\x10\x40\xa2\xde\x60\xd8\xe1\xc0\x54\xf7\x85\x46\x52\xb7\x32\xe7\xa8\xf5\xb6\x47\x4c\x3b\xaa\x18\x40\xfb\xe8\x1b\x1e\x6b\x54\xe2\x01\xef\x0b\xc8\xd0\xf2\x13\xd7\xce\xc1\xd8\x24\xd2\x22\x09\xac\x72\x52\x5a\x64\xb9\x03\xe7\x73\xb8\x3f\x1b\x68\xf6\x40\x27\x9f\x15\x05\x3d\x21\xec\x15\xce\x2f\xf7\x59\x22\x17\x6b\x75\x84\xa1\x6b\xf1\xa1\xf0\xd6\x36\xb7\x94\x2a\x3d\x61\x86\x2f\x6f\xd1\x30\x99\x72\xd3\x14\x1e\xb7\x69\x31\x4c\xa9\x75\xd0\x20\xbf\x02\xbf\xdd\xf1\x7d\x14\xb6\x0e\xb7\x86\xbf\x9f\x55\x98\x9f\xe4\x73\x32\x0d\x44\x29\x67\x7e\x30\x1c\x68\x26\x33\xf8\x13\xff\x26\xc0\xa3\xda\x92\xf6\xd0\x68\x06\x16\x10\x5b\x04\x25\xaf\x33\x8c\x2e\xa6\x15\x3b\xdd\x52\x16\xfa\xe2\xaf\xe4\x61\xe9\x24\x9c\x05\xe3\x2f\x76\xad\x7c\x42\x9d\x92\x53\x4b\x68\x6d\xd1"}, +{{0x04,0x9d,0xac,0x3c,0x97,0x7d,0x9d,0xf5,0x03,0x49,0x6b,0x43,0xd7,0x6e,0x55,0x40,0xe3,0x15,0x00,0x1a,0xd5,0x7f,0x15,0xea,0x9f,0x08,0x70,0xca,0xd2,0xd4,0xf9,0xe9,},{0xfc,0x6f,0x4b,0x7e,0xb3,0x9a,0x71,0x16,0x80,0xf9,0x66,0xd4,0x68,0xa6,0x1a,0xbb,0x13,0xa9,0xb6,0x44,0x9b,0xb9,0x9f,0xda,0x3d,0x12,0xce,0x1b,0x50,0x6d,0x1b,0x4b,},{0x75,0x32,0xd1,0xa6,0x1a,0x98,0x1f,0x30,0x3d,0x7c,0x24,0x54,0x35,0x4f,0x99,0x54,0x0c,0xd4,0x84,0xcd,0xe9,0xab,0x33,0x7d,0x6f,0x7b,0x51,0xf1,0x79,0x22,0x0f,0x7f,0xa2,0x07,0x34,0x76,0xb4,0x1c,0x71,0x52,0x9f,0x98,0x36,0xdb,0x6b,0x1d,0x0f,0x5a,0x48,0x2b,0xbb,0x4c,0x68,0x36,0x61,0x76,0xed,0x14,0xd4,0xd8,0xee,0xfa,0xde,0x0d,},"\x7f\x31\xe3\x46\xf6\x8d\xa7\x37\x16\xaa\xcb\x16\xee\xa1\x9b\xb2\x41\x42\xdc\x28\x3e\x72\x63\xff\xc3\xf7\x04\xa2\x2a\xe5\x27\x5a\x0e\xf9\x5f\x06\x69\xba\xe5\xa5\x4c\x7f\xeb\x84\xbc\x74\x87\x3c\xca\x0f\x33\x5d\x6c\xff\x3d\x8b\x4a\x20\x05\x6c\x64\xf5\xe8\x82\xcb\xbb\xd2\xac\x74\x20\x76\x76\x46\x7e\x54\x66\xdd\xd5\x6a\xed\xf5\x6e\x09\x7c\x7f\x59\xd9\x45\x91\x5e\xb0\xeb\xd0\xc3\xc8\x3d\x48\x88\x8d\x3e\x9e\xde\x51\xad\x2d\xd8\xa0\xee\x1e\xab\x4c\xf8\x7f\xfa\x78\x63\x5a\xfc\x4d\x6e\xf3\xe8\x7d\xda\x3b\x65\x56\x5c\x29\x85\xa4\xad\x0a\xcf\xdf\xb8\x1c\xb0\xe6\x1c\x67\x82\x6a\x6e\xa0\xbe\xd4\xc0\x8a\xa1\xa5\x41\xde\x60\x45\x87\x04\xac\x21\xca\x12\xf1\xc8\x11\x8b\xb3\x09\x2c\x35\xa4\x0c\x92\x1e\x68\x45\x64\x56\x2c\x2c\x10\x49\xdc\xdc\x2b\x8d\x6a\x97\xe3\x56\x7d\x35\x6b\xff\xb5\x69\x2a\x41\xd8\x9d\xdd\xa0\xec\x35\x52\x15\x2a\x27\x57\x7f\x1c\xce\x57\xd0\x09\x86\xdc\xa7\x7e\xdf\x5e\x25\x18\x15\x82\x00\xad\xf6\x90\xaf\xfb\x31\xaa\xf2\xb5\x74\x83\x68\x39\x44\x09\x99\xf1\x57\x91\xce\xa8\x53\x42\xac\x94\xa9\x6c\x7a\xf7\xa1\x9e\x49\x43\x10\xae\x26\x67\x5f\x43\xc3\x52\x58\xe8\x5b\x68\x40\xb9\x9c\x6b\x09\xcf\xa5\x8d\x19\xf1\xe4\x3a\x77\xe3\x97\xb0\x8c\x0d\xb1\x83\x0b\xca\x67\xb3\x9e\xcd\x87\x52\xda\x61\x1e\x08\x32\xc6\xca\xe7\xbb\x8c\xe7\x4a\x82\xe7\xe7\x33\x0b\xe5\x06\x2e\xd0\x5a\xa5\xc8\x44\x57\xb0\x07\xfb\x5c\xcd\xc2\x0a\x55\xd5\x4d\x8e\x04\x09\xc8\xbd\x83\x88\x3d\x2e\x02\x9d\xff\x26\xea\x5d\xb2\x75\xdc\xe0\x99\xe4\x18\x65\x9a\x04\x00\xf1\x3b\xe9\xff\xdc\x14\xe7\xd6\x45\xa9\x46\x77\xca\x84\x69\x70\xb7\xe6\xac\x52\x7f\xa0\x09\xa3\x59\x45\x4b\x3c\x49\x36\x49\x05\x18\x9f\xb4\x9c\x9b\xac\xb6\x50\xc0\x3c\xd8\x28\x75\x89\x4e\x35\x46\xba\x03\xc3\x2e\x33\x6f\xc6\x51\x6a\x87\x67\x6c\x50\xd5\xb8\x0b\x30\x54\x27\x3b\x15\x7c\x5d\x76\x75\x14\xe5\x45\x74\xb8\xa1\x01\x98\x5a\x8e\x96\x7e\x95\xda\x8f\x92\x98\x00\x26\x0e\x08\x14\x8b\xee\xe2\xd7\x78\x1e\x9e\x85\xd4\x63\xa9\x4f\xfe\xfd\xbb\x75\xc2\x8f\xa8\x89\x80\x15\x68\x09\x99\x42\x9c\xee\x79\x8b\x3f\xd2\xd9\x67\x37\x86\x8a\x26\x3f\xba\x9f\xb6\xf4\xaa\xd5\x6a\x15\xc6\x41\x2f\xf8\x5e\x7d\x37\x52\x10\x2d\xaa\xf2\x5e\x74\x5f\xa5\xf6\xf1\x74\xa2\x31\xfc\xce\x86\x24\xdd\x70\x85\x6f\x9b\xab\xcc\x20\x91\x44\xff\x68\x64\x64\x8d\xea\x0d\x68\x84\x56\x6a\x4c\x39\x14\x78\x05\xbe\x08\x4e\x47\x40\xbc\x50\x93\x09\xbc\xb1\x42\x96\x4b\xb0\xcf\xcf\x67\x26\xa0\xe0\x4b\xbf\x32\xae\x68\x34\x73\x2b\xda\x03\x84\xce\xa8\xf4\xa4\x84\x9b\xba\x0d\x18\x64\x6c\x1c\x34\x47\x18\x96\xb5\xbe\xf1\x49\xf8\xca\xb9\xec\x83\x72\x2b\x0f\xb2\x09\xef\xe8\xa0\x4c\x4a\x23\x5d\xc8\xdd\xb2\x0a\xcd\x92\x76\x5a\xfb\xf3\x05\x87\x40\xea\x70\xb9\xc1\x0d\x9c\x5a\xef\x86\x06\x29\x8f\xe4\x15\x15\x93\xb2\x1f\x79\x7d\x92\xae\x9f\x1e\x08\x81\xb0\xd2\x71\xb0\xd5\xb1\x0c\x6e\xd8\x3c\x34\x9e\xc2\x47\x3f\xbf\x2f\xf7\x80\xdc\xd0\x76\xd8\xcf\x0a\xea\xfa\x71\xfe\x2b\x8c\x51\x28\x01\x5f\x8f\xbb\xcf\xec\xd5\x28\x1c\xd5\xea\xcb\x6f\xe9\xac\x6e\xaa\x6e\x47\xd6\x67\xb9\xad\x4b\x7e\x41\x1e\x6c\xb7\x46\x3d\x56\x76\x07\xaf\xbf\xd0\x41\x8c\x4e\xb0\x6a\xfe\x84\x7f\x5e\x40\xb4\x99\x44\x38\x28\xd5\xa2\x73\xa4\xa8\x7e\x46\xde\xf2\x1a\x91\x9d\x73\x86\x3a\xf0\x05\x4a\x09\x9e\x3a\xdc\x54\x50\xb8\xe3\x2f\x51\xea\x52\xc5\x99\xa4\xa2\xa3\x53\x51\x78\x8a\xf7\xcb\x71\xe5\xc4\x4b\xcb\x8d\xf5\x4a\x60\x1e\x6e\xc2\xc1\x82\x8b\x48\xc4\xb1\xae\x44\x63\x10\x6f\x10\xef\xa5\xca\xf3\x09\x1a\xbf\x99\xaa\xba\x52\x52\xf4\x84\xd3\xbb\xc6\x2b\xfa\x6b\x2a\x80\x6d\x23\xc6\x33\x1a\x62\xfc\x46\xbc\x62\x76\x79\xe7\x3e\xc8\x2d\xcc\x08\xf7\x91\x43\xf4\xb7\x1e\xcf\x35\x7e\xa2\xf0\xd7\x4e\x6d\x30\x58\xe6\x06\x04\x3f\x6e\x8f\xed\x70\x42\x82\xc1\x6b\x1f\x98\x8f\xfa\x36\x5c\xfa\xe9\xa3\xcf\x79\x2e\x0c\x5b\xaa\xd7\x0c\xa7\xe2\x57\x76\x01\x8b\x5e\x7f\x0e\x95\x44\xe1\xd7\x3f\x3e\x5d\x1e\x41\x6a\x5e\x50\xfb\xed\x29\x6d\xc1\xbf\x4b\x29\xa3\xfb\xe3\x2e\xfb\xd7\xe9\x9c\x83\x01\x5d\x27\xf5\x35\xad\xec\xf1\x75\xfc\x36\xc1\xea\x4f\x44\x23\xb3\x6d\xcd\xc0\x54\xba\x99\x32\x78\xe8\x5a\xc3\x62\x2d\x43\x5f\x52\x37\xba\x61\xb4\x9a"}, +{{0xf0,0x7d,0x61,0xb5,0xca,0x1c,0x27,0x00,0xcb,0x50,0xf9,0x00,0xc2,0x6b,0x7c,0x28,0xf6,0xc6,0x94,0x08,0x08,0xc7,0xba,0xff,0xf7,0x4f,0xca,0x4b,0x11,0xf4,0x25,0xd4,},{0xeb,0x24,0x3d,0xfa,0xcc,0x2d,0xc6,0x43,0x57,0x76,0xd5,0x54,0xec,0xed,0x8b,0xf9,0x23,0x90,0x60,0x4b,0x35,0x55,0x7c,0xda,0x51,0xfd,0x20,0x3e,0xdd,0xb4,0x93,0xfa,},{0xc1,0x9b,0x53,0x2b,0x82,0x48,0x56,0x39,0x32,0x63,0x97,0x01,0xbf,0x15,0xbc,0x01,0x5f,0xae,0xbb,0x17,0xbb,0x98,0xd8,0x71,0x61,0x6e,0x10,0x48,0xd6,0x4c,0xa5,0xf9,0x55,0xf5,0x58,0xf6,0x3b,0x53,0x53,0xa1,0x57,0x6f,0xa1,0xac,0xae,0xf3,0x9b,0xcb,0xc9,0x02,0x17,0x56,0xdf,0x5d,0x1a,0xb3,0xbc,0x74,0x1a,0xcc,0xf9,0x05,0x9b,0x04,},"\xc1\xc6\x78\x43\xd6\x9a\x0e\x62\xe7\xbf\x71\xf9\x02\x06\xa3\xd5\x59\x5c\xa3\xc4\x82\xaa\xa7\x67\xe9\x31\xb0\xd6\xc2\xf4\x75\x2a\xb8\x69\x91\xf0\x35\x83\xbb\x13\x8e\x9f\x72\xfa\xb5\x8f\xd6\x02\xa4\xb6\xb2\x96\x02\xcf\x89\x14\x08\xaf\x5a\x1b\xfd\x33\x98\xc0\x17\x8c\x44\x14\x61\xe3\xf4\x9b\xc8\x1d\x64\xc0\xd9\x7f\x5d\xed\x69\x2c\x75\xd4\xd6\x4d\xac\x5d\x80\xd6\x3b\xd4\xdc\x52\x10\xc1\xd9\x35\x0b\x14\x2b\xa6\xe7\x68\xf1\x50\x80\x7a\xb8\xa8\x6c\xac\xdb\x59\xd8\x4d\xdf\x66\x0b\xe5\x62\x03\xc0\x14\xfb\xa1\xe0\xdc\x16\xfa\x6d\x32\x69\x4e\x14\xb1\x28\xed\xd1\xf6\xc6\xab\x44\x5a\x3a\xd3\x41\x74\xfa\x9e\x4b\x01\xf2\x5b\x1d\x5e\x6e\xb7\x69\x83\xb4\x29\x5c\xe4\x91\x4d\x3a\xe4\x8c\x70\x4a\x30\xe5\x54\xfc\x1f\x86\x8b\x62\x72\xef\xf0\x6d\xa2\x4b\xfe\x17\xe4\xe0\xf0\xfa\x46\xbb\x08\xff\xb9\x07\xcb\x61\xbe\xbe\x52\xdf\x31\x1a\x64\xcb\x57\x8b\x30\xfd\x62\x7d\xf1\x12\x21\xae\x40\x03\xa0\xb0\xc6\x8e\x3c\x6f\x95\xa2\x1c\x85\x00\xd4\x1b\x2c\x58\x9c\xc4\x6a\x13\x9c\xac\xff\x57\xdc\xf0\x07\x59\xf5\x2e\x9c\xa3\xda\xbd\xb1\x78\x8a\xb6\xb3\x8a\x50\x48\xf5\x8e\x08\xe0\x5c\x39\x4f\x9d\x3c\x72\x11\x3d\x45\x2b\x70\x84\xc5\x19\xf8\x6c\x16\x89\xff\xdb\xae\x50\x6e\xd8\x45\x05\x22\xcb\xe4\x3d\xe2\x7a\xa3\xbf\xdd\x92\xa9\x1b\x71\xe5\x2a\x3c\xbf\x77\xc1\xbd\x28\x93\xea\xbd\x40\x7a\x57\xfe\x5e\x14\x68\x73\xbf\xb2\x04\x3f\x4a\x61\x47\xdf\x08\x3e\x54\xa2\x20\x8d\x19\x25\x81\x3f\xa4\x04\xe4\xc4\x74\x06\xe7\x72\x86\x43\xeb\xfb\x0b\x10\x14\x2f\x90\x9e\xf8\x56\xfd\x3a\x91\x6b\xc0\x85\x15\x43\xb8\x2a\x55\xf8\xcd\x52\x9b\xd2\x1d\x9e\x29\x09\xd6\xd7\xe7\x7b\xdc\xea\x46\x73\xe5\x45\xff\x4a\x67\xfa\x37\xd6\x5f\x1f\x63\xf1\x1d\x5d\x0d\x55\x97\x4a\x30\xab\xe1\x88\x33\x5d\xb5\xdc\xbd\x35\x66\x58\xf9\xb7\x76\x82\xd9\x6d\xab\xb2\x58\xea\x95\x95\x1a\x05\x59\xae\xa4\x06\x4d\x5e\xa1\x68\x05\x01\xdc\xb4\x22\x8f\x2c\x95\x6f\x81\xd2\x10\x11\x44\xaf\x74\xc7\x16\xbc\x8b\xf4\x29\x6d\xc3\xb8\x31\x72\x5c\xc1\x7d\x3b\xfd\x90\x66\xa2\x99\x53\xb2\xec\xd7\x50\x59\x43\x5b\x49\xa2\x5a\xc5\x25\xb4\xfb\xab\x17\x79\x02\x2d\xfb\x6d\xe5\x25\x14\x9d\xcd\x90\x2a\xc8\xa7\xe2\x1f\x34\x4f\x5f\x01\x01\x48\x06\x92\xd6\x16\x08\x95\x2c\x71\x41\x3e\x30\x03\x79\x45\xe2\x06\xc5\xee\xad\xfc\x3e\xdc\x4b\xae\x0d\x79\x6c\xa0\xc5\xf5\x6d\x6f\xfb\x3f\x09\x69\xdf\x9d\xf8\xa7\x94\xf5\xdc\x83\xa3\xb2\xf5\xc3\xab\x36\xbb\x90\x1b\xcc\x31\x55\x1c\x55\x0c\x63\xfa\x41\xd6\xa8\xd5\x7b\xdb\x9b\x5c\x65\xbc\x61\x0c\x3a\x98\x97\x52\xab\x28\xa0\x15\xe7\xc2\xf6\xb2\xfb\xf1\x99\xa7\x6b\x97\x50\xc0\xd3\xd5\x92\x11\x9c\x8b\x40\x22\xfa\x45\xba\xde\x2f\xbb\x41\x43\x26\x79\xb5\x2a\xcb\x46\x08\xa9\x5c\x34\xaa\x40\xbf\xfe\xc1\x0b\xc9\x8f\x47\x29\xdf\xcc\xb6\x50\xb2\xa0\x52\xdf\xb0\x68\x95\x9e\x64\x8a\x92\xd5\xaa\x4d\xd2\xd1\x7d\xde\x67\xcd\xf2\xe6\x37\x7a\xf0\xd4\xae\x37\x96\x07\x38\x9d\x7e\x35\x96\x44\x1b\x9f\x42\x22\xcf\xf6\xaf\x73\xb3\x30\x02\x70\xce\x54\x80\x0b\xd9\x34\xa9\x10\x9a\x02\x56\x3a\xdc\x56\xae\x46\x58\x44\x51\xcd\xaf\x4a\x77\x53\x81\x57\xe5\x87\x0f\x4a\xe1\x2d\xbc\x81\x87\x0f\x5d\xb4\x1a\x2c\xb5\x5e\x00\xdb\x3d\x22\x31\x62\x8f\x17\x27\xc3\xac\xb9\x9e\xd3\xac\xd8\xb6\x71\x56\xa8\x00\x5a\x4c\xc8\xf3\xd3\x55\x5b\x79\xa0\x37\x73\xa9\x31\xf1\x4e\xeb\xce\x40\xb9\xfe\x46\xed\xe5\xda\x08\x81\xfb\x22\x07\x17\xe4\x18\xe8\xb5\xa0\xfe\x5e\x47\x7e\x72\x85\xc5\x54\xe8\x59\xe1\x64\x41\x67\x2b\x48\x99\x34\xa3\xa9\xee\xb8\x8d\x78\xfc\xc5\xc1\xdb\x2d\x1f\xbd\xde\x39\x27\x73\xf6\xc9\x39\x97\x2e\xe8\xfa\x31\x89\xf4\xe9\x87\x2b\x4a\xbd\xc8\x3b\x37\x9c\x0c\x10\xe8\x18\xdc\xff\x75\xc8\x3d\x68\x70\x72\x92\x84\xce\xd4\x1f\x2f\xf5\x5a\x87\xc9\x60\xe6\x3d\x12\x11\xf0\x80\x71\x29\x3f\x6a\xc6\x3f\x9b\xde\xf3\x8f\xd5\x91\x9c\xa9\x0b\x3f\x5e\x25\xa6\xc0\xc6\x64\xc4\xec\xf8\x31\xc6\x4e\x2d\x4c\x6e\x79\x8a\x98\xa3\xa0\xf7\xbe\x7a\x24\x63\xea\xda\xa6\xa2\xa3\x48\xf9\xa4\x94\x71\x71\x23\xcc\x0a\x28\xc0\xa5\xea\xe3\xf5\xb5\x85\xf2\xcb\x8c\xb2\x60\xc2\xc5\x03\xe4\x15\x78\x57\x3c\xd9\xb7\xcb\xa1\x40\x8d\xca\x9d\x86\x0a\xe4\xf8\xc3\xd3\xf3\x22\xa4\x5b\x58\xa2\xc4"}, +{{0x50,0x86,0x4a,0x75,0xaa,0x0c,0x69,0xb5,0x93,0x50,0x07,0x7c,0x20,0x4b,0x20,0x75,0x7f,0x2b,0x8b,0x68,0x55,0xc3,0x7e,0xd7,0x21,0xb4,0x9f,0x2a,0xc9,0x17,0xd6,0xb2,},{0xcf,0xf3,0xeb,0xd5,0xea,0x0c,0x8b,0x55,0x31,0xd9,0x21,0x1e,0x22,0x19,0xe4,0xcf,0xe5,0xde,0xd9,0x91,0xd8,0xec,0x42,0x4d,0xf5,0x4c,0xf5,0x3c,0x83,0x76,0xf9,0xbd,},{0x17,0x74,0x55,0xa7,0x16,0x94,0xf1,0x2b,0x76,0x2f,0xd1,0x7e,0x08,0xbd,0xf0,0x10,0xa7,0xfc,0x91,0xd1,0x91,0x41,0xd7,0xae,0x23,0x99,0xbd,0x24,0x1a,0x99,0x8a,0x6a,0x50,0xa9,0x72,0x2a,0xc1,0x23,0x2c,0x59,0xe4,0xe2,0xaa,0xa8,0x28,0x07,0x8b,0x2b,0x92,0xf4,0xa5,0x4c,0xdf,0x0e,0xfe,0xbb,0xa2,0xc1,0x6d,0xbe,0xaf,0x07,0x22,0x03,},"\xb3\x65\xf4\x76\xac\x92\xe7\x60\x12\xa7\xff\xd8\x78\x2a\xf1\x5a\x3f\x5e\xe1\x47\xf6\x03\xa3\x67\xad\xf2\xf9\x72\x46\x13\xe8\x76\x5b\x03\x7a\xc0\xeb\x1f\x67\x37\x36\xe1\x13\x63\xe3\x52\xed\x5a\xe9\xeb\x5a\x67\x12\x5e\xd8\x18\x90\x03\x42\xae\x93\x37\x1c\x43\x3b\x91\xf6\x02\x1d\x4b\xe2\xa0\x52\xb0\xda\x43\xb3\x68\x2e\x7f\x74\x0a\xe8\x01\xd0\x54\x10\x57\x85\x8e\xb0\xc9\xc2\x8d\x98\xf0\x3b\x45\xe1\x28\xaa\xa3\x42\xc6\xb6\x02\x77\x67\x92\xaa\x81\x24\x1c\xad\x06\xf1\x33\x8f\xa0\xc7\x17\x57\x18\x0f\x58\x8c\x83\x01\xd9\x1c\x27\x67\x9b\x50\x21\xcd\x75\xd7\xf6\x17\x1e\xe9\xf8\xd5\x6e\x43\x77\x67\x98\x12\xf6\xec\x5e\xd4\x65\x38\xca\xed\x50\x0c\x1d\x15\xf5\xfc\x86\xea\xf9\xed\x9c\xf9\xa0\x60\x6b\x22\x61\x4f\xaf\x67\x64\x62\x13\x4e\x3d\xb3\x58\x23\x32\xb4\x83\xdf\xa5\x4c\xa2\x9a\x5e\xb0\xd6\xba\xe3\x38\x0e\x19\xd0\x60\x11\x34\x53\xf3\x2b\xba\xb7\xe1\x18\x62\x7b\x40\xbc\xab\xf1\x71\x1b\xcf\xea\xb8\x95\x7d\xe3\x39\x43\x6c\x70\x88\xbb\x88\x31\x01\x53\x9a\x09\xd3\xbe\xf0\x88\xfc\x1f\x84\x07\x64\x03\x6f\xfb\xb3\x3d\xec\xd1\x2a\xac\x57\xfd\x26\xf8\x48\x23\xe1\x95\x53\xd4\xd6\x7e\x00\x0e\x94\x36\xca\x32\x3d\xe0\x99\xbc\x1c\xe7\x5e\xbf\x5d\xdc\xcb\x44\x8c\xd7\xa2\xe4\xbb\xd6\xb3\x2e\x3f\x20\x24\xf9\x6c\xc5\xc7\x15\x2b\x8b\xe8\xed\x0b\xd8\xe4\x36\xd3\x24\xd1\xce\x1d\xd3\xcf\xcc\x45\x2a\x28\xc7\x3a\x95\xaf\x84\x82\xaa\x77\x2a\xe5\x3d\x5b\xe1\x29\x2e\x39\xd1\x71\x6b\x43\x75\x8f\xe5\x63\xc8\xaa\x3b\x74\xbb\xa5\xc0\x2d\x04\x77\x8d\x91\xe3\xd4\x3d\xcc\x72\xbb\x7c\x7b\x04\x3c\x05\xc8\x74\x5b\x70\x5e\xe7\x5b\x5a\x4e\xc7\xb9\x5b\x65\x43\x59\xfb\x5e\x85\x33\x38\x21\x98\x51\xd4\x0a\x8a\xfb\xb4\xf9\x1e\xcb\xb4\x1e\xb8\x15\x34\x19\x6c\xc0\xcc\x9d\x3e\xb7\x14\x39\x6c\xaf\x04\x5b\x23\x17\x22\xd4\x48\x65\x03\x64\x04\x19\x98\x84\x80\xa7\x81\x58\x08\xbe\x97\x42\x87\x37\x2c\xfc\x48\x99\x65\xaa\xc5\xb8\x09\x5c\x63\x75\x81\xeb\x91\x0f\x90\x55\xcd\x1c\x0a\x0a\x3b\x0b\x33\xac\xa9\x0f\x7c\x5b\x8e\x6e\xf6\x83\xab\xf0\xce\x53\xae\xba\x51\xbe\xc4\xfc\x7b\x42\x7a\x23\x47\x36\x0f\xca\x86\x36\xd3\xf1\x46\x92\x84\xf2\x69\xa9\xab\xf0\xcb\x1a\x24\x4a\x15\xd6\xb4\x04\x65\xe7\x5c\xf8\x90\x92\x47\x4a\x8b\xed\xa0\x33\x39\x1d\xd3\x11\xc4\x99\x51\x9a\x08\xc4\xf0\x34\xe7\x19\x18\xd7\xca\xd4\x18\x45\x32\x7c\x89\xe7\xb1\xe9\x4a\xfb\x07\x23\x78\x2c\xe5\xc5\x53\xef\x36\x79\x1b\xba\x63\xde\x17\xd7\x46\x49\x18\x94\x01\x2c\xeb\xd8\x7b\x18\x37\xa8\x21\xef\x5c\x62\x4b\xbc\x84\xcc\x50\x35\xf5\xe7\x0c\xd9\xf2\x1b\x42\x21\x9a\x2d\xce\x30\xe0\xe6\x5c\x25\x0d\x0d\x19\x4d\x2b\x52\x48\x6b\x03\xee\x66\x33\x29\x81\xa5\x22\x51\x74\xdb\x17\xe5\xa8\xbb\x4a\x10\xed\x9c\x8a\x44\x5c\x41\x44\x2f\x3b\xcd\xb6\xb4\xf4\x9e\x4e\x1d\xc8\x76\x61\xa7\xb6\xe4\x1f\x35\xf5\x5d\xd6\x7b\xd4\xcb\xc6\xff\x58\xbf\xbf\xfa\xff\xd2\xc3\x82\xfc\xad\x0c\xae\x8f\x0d\xf9\xaf\x6a\xcf\x09\x40\x00\x76\x18\xa5\x4a\xee\x31\xd9\x32\xcb\xd8\xe8\xb4\x1c\xa0\x38\x21\xc4\x28\xa0\xef\x8e\x58\xd2\x43\x5e\xec\xd5\x03\xc5\x4d\xa9\xc1\x62\x8f\x3c\x74\x9b\x77\x05\x19\xf5\x3b\xf2\xd5\x7e\xd7\x12\xd0\x75\xd3\x73\x37\xb7\x7a\x2b\x10\xa7\x2d\x2d\x59\x0c\x20\xd5\xce\xc2\xca\xcc\x6c\x3a\x8d\xc1\x13\xe2\xd1\x6e\xf2\xd1\xb3\x90\xed\x96\xe4\x03\x6a\xcd\x30\x4e\x0c\x7c\xef\x9d\x43\x1f\x88\x21\x8a\xa1\xf8\x38\x28\xdd\xa6\x36\xb9\x4a\xa7\x61\xc7\x31\x7e\xcf\x11\x6c\xbf\xc6\x11\xe5\xba\x6d\x94\xc5\x0e\x99\x46\x93\x02\x3b\xdf\x2d\x24\x8e\xd6\x03\xf8\x5b\xe7\x3a\x00\x08\xb7\x5a\xde\xf9\x51\xdc\xcf\xa3\x0e\x42\xe9\xf5\xbb\x05\x02\x3a\xde\x79\x75\x06\xcb\xf9\x0b\xb6\xdc\xe4\x3c\xf3\xa1\xc3\x14\x1a\x5c\xc5\xfd\x9a\x4f\x3c\xc5\x57\xb9\x0e\x18\x04\x9b\x3c\x13\x0f\x46\x1e\x4f\x32\x29\x9f\xa1\xd1\xcf\x9c\x7f\x2e\xa2\x05\x35\x65\xe8\x16\x0a\x34\x1c\xdd\xf9\x9a\xcd\xdd\x49\x16\x97\xfa\x70\x51\x24\xab\xda\xb4\x2a\x5e\x8f\xcf\x04\x8d\xd9\xf1\x79\x38\x4e\xc9\x2a\x46\x9a\xeb\x11\xe8\xbc\x62\xb6\x9d\xbc\xfc\xec\x66\x81\x75\x47\x57\xe4\xc5\xd0\xfd\xd9\xb9\xcf\xda\x49\xaf\x09\xb8\x3a\x5a\x4a\x10\xae\xd9\xa4\xcf\x7d\xdf\xa2\x89\x20\x9d\x47\x5a\xb3\x31\x8c\xd4\xb9\x65\xe0\x07\xdc\xe1"}, +{{0xe5,0x5f,0x22,0x0f,0xff,0x80,0x79,0x14,0x8b,0x25,0x41,0x89,0xbb,0x29,0x41,0x74,0xf8,0xe2,0xc5,0x75,0xe5,0x7f,0x39,0xd4,0xba,0xc8,0x16,0x5c,0x5e,0x56,0xe7,0x69,},{0x7f,0xd5,0x07,0xd0,0x3f,0xe1,0xd6,0xe3,0xf9,0x11,0xf0,0x59,0x59,0x7b,0x0e,0x29,0x2e,0xa0,0x96,0xf5,0xbc,0x85,0x18,0x52,0x91,0x6b,0xf1,0x21,0x7c,0xaf,0xdc,0x6c,},{0xc1,0x02,0x3a,0x70,0x68,0x74,0x3e,0xc4,0x66,0x8f,0x49,0x5e,0xb7,0xbd,0x4d,0xb5,0x81,0x29,0xc1,0x1e,0x58,0x29,0x9e,0xa8,0x7d,0x6f,0xac,0xd3,0x02,0xbf,0x29,0x6a,0x98,0xe2,0x98,0xfd,0xb4,0x8e,0xdd,0xf9,0xc4,0x4e,0x79,0xae,0x86,0x41,0xf7,0x34,0x50,0x3b,0xb8,0x3d,0xc0,0xb3,0x1f,0x61,0x0d,0xf1,0xd1,0xe9,0xd6,0x19,0xa7,0x05,},"\x1e\x2c\xe8\xbf\x0e\xa7\x87\x5d\xf2\x85\xb1\xdb\xd3\x4b\xbe\x67\x30\x7f\x2e\x8a\xc8\xbc\x14\x2c\x3b\xa3\x14\xc1\x64\x2c\x65\xa2\xd6\x2e\xb2\xc7\x83\xf9\x16\x28\x3c\xa4\xec\x3e\x53\x6d\x3e\xeb\x65\xcf\xdc\xc0\x54\x9a\xc4\xf6\xa4\x5f\x53\x9a\xc5\xdf\x79\xa6\xd5\x76\x82\x19\x73\x9d\x0c\x9a\x0c\xdb\xb3\x12\x42\x29\x6c\x33\x12\xb7\xed\x56\x00\x43\xf5\x36\xcd\x1d\xe9\xa9\xc2\xb2\x89\x64\x1a\x1c\x2d\x84\xf9\xa6\x8b\x7c\x03\xb8\xb8\x56\x7e\x5d\xc7\x13\x8c\x2c\xb9\x67\xc6\x28\xaa\x25\xb2\xea\xb4\x34\xd4\x49\x0b\x23\x50\x74\x09\x71\x7c\xde\x94\xda\x59\xdc\x1d\xc2\x5c\x7b\xe4\x2a\x8a\xa0\x2e\xdc\xf4\xd9\x95\x36\x8e\x6b\xa0\xee\x1f\x95\x36\x00\xdb\x98\xd2\x2d\xe0\xf8\xd2\x57\x02\x0e\x0a\x40\x6e\xe1\x66\x9b\xd5\x27\xb9\xfe\x1c\x61\x1f\x9b\xe5\xa3\xd7\x52\x8e\x8b\x61\x51\x67\x0a\x86\x63\xd2\xed\x1a\x58\xd3\xe3\x69\xbb\x72\x2a\x63\x02\xd7\xc1\x72\xa1\x9b\xda\xf3\x57\xee\xdb\x02\x27\x91\x56\xe3\xb9\x03\x44\x31\xa7\xd6\x8a\x39\x52\x8e\xb4\x02\x35\x87\x57\x3e\xb8\x8f\x30\xf9\x4e\x83\x3e\x8a\x23\xb9\xd0\xac\x7b\x5c\xa8\x78\x24\x59\x6b\xbb\x0a\x3d\x0c\xa1\xb1\x6a\x68\x78\xfd\xf7\xe2\xce\xa3\x4a\x6f\xfb\x95\xa9\xff\x4e\x88\x8a\x97\x59\x37\x35\xb8\x68\xda\x75\xd8\x70\x7b\xbf\xdb\x1d\x93\xeb\x86\xa5\x1e\x2d\x21\x5f\x1d\xd9\xdc\xf7\x83\x88\x72\x9a\x3e\xb0\xf0\x66\xdd\xc9\x41\xe9\x50\xc9\x21\x27\x19\x8b\xce\x63\xa5\x48\x68\xd9\x97\x02\x95\x72\xff\xa6\xf6\xfe\xa1\xd3\xa6\x91\x64\xc9\x99\x69\x53\xdc\x8b\x6f\x9d\xad\x06\x35\xc9\xb0\x81\xf5\x5f\x98\x33\x40\xf0\x81\x4b\xf5\x47\x08\x03\x09\x0e\x79\x97\xf7\xab\x79\x6c\x2b\x15\xad\xaf\x40\x21\xd6\x7c\xff\xaf\x6e\x1e\xf6\x28\x67\x50\x39\x45\xc2\x1a\x32\x96\x64\xe0\x8a\x95\xa4\x15\x82\x30\x0d\xa9\xbe\xd2\x08\x44\x4c\xe6\xaa\x12\xb3\xf8\x67\x79\x5c\x6e\xe4\xc4\xc9\x25\x70\x18\x62\x73\x61\x29\x3b\xd5\x27\x82\x1a\x29\xa3\x39\xb4\x04\xa2\xda\x4b\xd9\x94\x4f\x87\x70\x40\x79\x8b\xb5\x4a\xbd\x2d\x76\xcb\xb1\x8d\xf4\x29\x7f\x4c\xe3\x33\x7f\x64\xd2\x05\x80\xaa\x64\xbd\xec\xac\x37\x6a\x6a\x4f\xf7\x4d\x01\x44\xb2\xfe\x74\xce\xf8\x2d\x50\xa5\xe6\xbd\xd7\x99\xe5\x5f\xf6\x96\x62\xba\xc5\x37\xad\xcb\x68\x81\x22\x8c\xb6\x37\x04\x50\x0c\x14\x3a\x4f\x4d\x1d\xb2\x8d\x45\x56\xbe\xe6\x04\xa3\x99\xff\xd2\x06\x54\x65\x97\xde\xe9\x22\x52\x54\x7f\x6c\x65\x7f\x36\x84\x1a\x87\xd5\x65\xf6\x55\x27\x16\xc2\x5a\x21\x15\x14\x77\xbe\xe9\xef\x96\x18\x55\xfb\x1a\xf2\xda\x80\x68\xf2\x8c\xe9\xff\x70\xd5\x25\x2c\x7a\x63\xa2\xe1\x4d\xed\x6b\x89\x77\xb1\xd7\x69\x1a\x77\xed\x2e\x57\xd2\x2f\xf2\xe1\xfc\x4c\xdb\xce\xb5\xe8\x05\x85\x8d\x90\x38\x96\xea\x67\x07\xe4\x8b\x34\x5f\x60\xe2\x81\x8b\x2f\xce\xc4\xdb\xa4\x8c\xae\xa9\xef\xa3\x82\x79\xfb\x83\xd5\xb0\xf4\x6a\x45\xe4\x2c\x41\x76\x5d\x01\x71\xba\xac\xd8\xd6\xdd\xa7\x99\x13\x14\xb3\x4e\x15\xfd\x36\x12\x7c\x46\x7d\x1d\xe0\x1c\x01\xa3\xa7\x8a\x8c\x1b\x10\x3b\xee\x17\xa7\xa0\xb7\xac\x55\x76\xfd\xc2\x26\xdd\x24\x59\x77\x31\x46\xcf\x38\x26\x14\x17\xca\x19\x13\x5d\xbd\xa9\xbd\xbe\x54\xcd\x17\xaa\x7d\xdd\x38\xfd\xca\xc2\xab\xa3\x96\xb3\x65\xce\xae\x98\x91\x9f\x6c\x51\x77\xfc\x58\x3f\x5b\xee\x3f\x48\x70\x49\x14\x30\x6a\xa1\x9e\xe9\x0e\x3f\xd0\xde\x55\x91\xc6\x69\xff\x35\xab\x16\xfe\xf3\x8d\xee\x18\x7b\xae\x1e\x5a\xaa\x56\x6d\xf1\x05\x44\xb7\xd6\xd4\xeb\x00\xda\x7e\xbe\xb4\xec\xdc\xc4\xd8\xe3\x2b\x49\xcb\xbd\xc6\xe6\x66\x40\xbd\xb0\xf7\x2e\x05\x91\x8a\x05\xc3\x5d\x9b\xff\x7e\x0e\x88\xf2\x41\xd7\xc6\xc8\xcb\x2f\xed\xcc\xdf\x65\x56\x0a\xf0\xe7\x83\x3e\xfe\x34\xaf\x79\x0d\xb6\x31\x89\x02\x2c\xfd\x71\xfc\x8a\xcf\x88\x86\x01\x27\xbd\x4f\xbf\x02\x6b\xcb\xe3\x60\xe3\x3a\x89\x95\xe6\x36\xd0\x3b\xb8\x6d\xfd\x01\x98\xad\xa9\x59\x34\x2d\x8e\x9c\x9e\xd9\x3e\x23\x29\x7d\xa9\x8d\x66\xa0\xd4\xfc\x96\x51\x62\x73\x3b\xc8\x65\x41\xb9\x5a\x6c\x90\x97\xcb\x55\xa9\x73\xc6\xfa\xc1\x94\xe8\xf8\xa1\x64\x27\x4c\x47\x9c\x51\x0e\x62\xd8\xa0\x35\xeb\x75\x11\x81\xb5\x02\xaf\xb6\x14\xd8\xc4\x46\x7b\x54\x45\xc2\x68\xdc\x3d\xd0\xab\xbd\x57\x70\x04\xc0\xbc\x47\xb1\x5f\xcb\x80\x1b\x79\x35\x97\x57\xb5\xea\x89\xcf\x8c\xf7\x7f\xc6\xd1\x60\xe6\xcd\x73\xc4"}, +{{0xd5,0xe3,0xa4,0x06,0x71,0xbd,0x45,0xf0,0x88,0x42,0xdd,0xc7,0x8a,0xbe,0x57,0xde,0x3b,0x9c,0xe5,0x64,0x6b,0x73,0x0d,0x2e,0x59,0xfe,0xcf,0x5a,0x7d,0xf8,0x0f,0x40,},{0x41,0x6c,0x37,0xae,0x1a,0xd1,0x5b,0x63,0x2b,0x0e,0xa4,0x39,0x32,0xc1,0x76,0x37,0x28,0x2c,0xd9,0x1d,0x59,0x79,0x55,0x2e,0x5e,0xeb,0xb9,0x9a,0x41,0x9d,0x5c,0x97,},{0x63,0xde,0x6a,0x98,0x11,0x42,0x36,0x5a,0x3e,0x59,0x26,0x31,0xc8,0x27,0x72,0x37,0x80,0x97,0x39,0xd1,0xc9,0x8f,0x5a,0x1c,0xb2,0xcc,0xcd,0x34,0x06,0x7d,0x1c,0xa5,0xdc,0x8f,0x2f,0xc6,0x3b,0x8a,0xe1,0xa6,0x89,0xdc,0xaa,0x29,0x1b,0xa6,0xb6,0x9b,0x1a,0x67,0x95,0xc5,0x79,0xa5,0xdb,0x6d,0xcc,0xee,0x73,0xf6,0xa4,0x20,0xac,0x0a,},"\x09\xfe\x6f\xfa\x8b\xf0\x94\x2a\x64\x92\x13\x57\x65\x9d\xbc\x6e\x4f\x8b\x63\xca\x3b\x9e\xa4\x75\xea\x39\xd7\x92\x52\x90\xa1\x48\xd8\x7b\xb1\x55\x74\x1d\xfa\x28\xae\x1b\xea\xdc\x1f\x3e\x1a\xb7\x67\x37\xeb\x5d\x5d\xda\xde\xd0\xbb\x38\x2d\x7e\x11\xea\x81\xa5\xe7\x80\x16\x12\x69\x62\x60\xba\x3b\xd0\x9c\x80\xb6\x23\xf6\x36\x38\x0a\xa0\x20\x8f\xee\x0a\xff\x70\x81\x2d\x53\x07\xb2\x71\x83\x83\x23\x43\xde\xba\xa3\x60\x5d\xda\xd1\x7d\xdd\x70\xd6\x11\x40\x0d\xdd\x10\xd6\x38\xaa\x3d\x6c\x68\xa2\x8c\xf0\xe9\x7c\x1d\xed\xf6\xcc\xd9\xc7\x31\xa8\x4f\xf0\x40\x5a\x3a\x22\xdc\xba\x00\xab\x44\xd5\xb2\x18\x44\xf1\x4d\x13\x74\xac\x0c\xb1\xe5\x8d\xf4\xa9\x0c\x41\x25\x63\xcf\xe6\x9d\x88\x2d\x35\x0f\x6a\xaf\xbf\xa6\x4f\xa2\xf9\xff\x82\x60\x32\x32\x67\x80\xae\xcf\x93\x05\xd8\x21\x7c\x17\x9d\xbb\x63\xc1\x51\x54\x12\x32\xeb\x65\x97\x92\x65\xd8\x76\xc4\xbc\x43\x05\xc0\x2f\x40\xbc\x1d\x05\xdb\xaf\x7d\xcf\x4f\x7d\xd9\x23\x2c\x17\xee\x0f\x7a\x05\x55\xf5\x04\xba\x37\x74\x54\x84\x88\x93\x3e\x75\x71\xeb\x3f\x71\xc4\xcb\xb2\x0c\xc4\xe4\xa7\x32\x2f\x35\xac\x0e\x79\xa5\x91\x55\x79\x8d\xd0\xf5\xb3\xc1\x13\x19\xb7\xd8\xf3\xea\x79\xee\x3a\xcc\x68\xbd\xb9\xf3\x7c\x7d\x4c\x8f\x9c\xab\xa1\xeb\xf8\xeb\x7f\x43\xb4\x62\xae\xfd\x38\xe8\xc0\xd4\xc6\x39\x79\xcf\x66\x31\xde\xc3\x1a\xb5\xce\xd3\x93\x7e\xf5\xb2\x36\x2c\xb0\x9c\x71\xdd\x09\x66\x57\x70\x0f\xd9\x6b\xda\x55\x5e\x22\x71\x2f\x71\xae\xc1\x1a\xe5\xe9\x1b\x24\xbd\x16\x49\x49\x8b\x8d\x9f\x86\x7f\xb6\xc4\x1e\x07\x60\x80\xf7\x40\xd0\x74\xc2\xa2\x55\x72\xd3\x4e\x66\x6b\x63\x67\xbf\x7c\xbb\x3d\xd4\x2a\x23\x82\xdc\x19\x73\x96\x12\x68\x60\x53\x96\x81\x0a\x45\x6a\xc0\x81\xbb\xfd\x3a\x54\xb4\x48\x81\xfc\xfc\x45\xb4\x24\x5e\xe7\x24\x65\xb4\x87\xd0\x7f\x2e\xf3\xf7\x4a\xdd\x71\xcd\xfd\xd1\x6e\x92\xfe\x25\x7d\x33\x46\x45\xb0\xa9\xbc\x7d\x07\x26\x13\xfb\x9c\x0c\xde\xa9\xdb\x4c\x72\xbc\x87\x10\x9e\x10\x2d\x7c\xba\xf3\x66\xec\xd6\x7f\xbe\x3d\xed\x32\x74\x73\x07\xa7\xae\xef\x61\x73\x5a\xd3\xaa\x5c\xe9\x5d\xee\xcc\x16\xa1\x6e\xb2\xa0\xbc\xc7\xad\xc0\xa1\x1d\x88\x80\x32\x26\x0e\x7c\x7e\xc9\xe5\x4f\x5a\x25\x31\x70\x2a\x7e\x5d\xfb\x87\xc3\x6c\xe3\x13\xa3\x14\x75\x88\xae\xf9\x62\xc7\x2f\xa9\x66\xd2\x41\x63\x7c\x38\x8b\x83\xdd\xec\x93\x43\xbb\x86\x34\x3e\x92\x0b\x12\xce\x1c\xc9\x15\xc8\x3b\x31\xe9\x98\x62\x69\x06\x74\xea\x49\x35\xa4\x88\x09\xd4\xd2\x79\x05\x41\x37\x54\x63\x92\xad\x9f\x08\xe7\xb8\xde\x61\xae\x73\xe8\x1e\x48\x3d\x3c\x63\xb5\xae\x73\x4e\x18\xe7\xa2\x2f\xee\xd1\x23\x3d\x0c\xa6\x33\x55\xf3\xa4\x8a\x33\x06\x7e\x1a\x0e\x19\x71\xf3\x6a\xa9\x29\xfe\x06\x13\xc2\x1c\x4a\xef\xf9\x41\x84\x29\xc3\xb0\x72\xa5\x98\x49\x59\x28\x7a\x5e\x5c\x40\xbe\x02\xbd\x22\xb9\xa7\x9c\x7f\x3f\x53\x59\xd2\xbb\xe4\x93\xf5\x56\xda\xcb\xb0\xcb\x4c\x29\x3c\x7d\x94\x12\x65\xe7\x77\x39\x2d\x14\x8d\x68\xc0\x7a\x13\xc8\xde\xc8\xe5\xd1\xe1\xc7\xf0\x41\xe8\x98\x3e\xdd\xda\xa4\x64\x9d\xac\x15\x72\xa3\x9a\xe4\xc6\x48\x0c\xa5\x50\xe2\xe4\x46\x2d\xcc\x84\x9c\x1b\xab\x78\x1d\x28\xa3\x55\x2b\x2d\x98\xe0\x2e\x15\x18\xe6\x55\x53\x40\xfb\x76\xd6\x8d\xb5\x89\x16\xd5\x56\xa7\xb8\x15\x63\xab\xa8\x1d\x9a\x57\xae\x50\xf0\x4c\xf5\x68\x60\x21\x84\x7d\x79\xb6\xbb\x3d\xa8\x01\x7a\x60\xb1\xc3\xbe\xef\xd4\x8d\x2b\x3c\xd3\x9c\x6f\x53\xc0\x8b\xcc\x96\x7d\x93\x06\x9f\x56\x2b\xb3\x6e\x0c\x4f\x4c\xa6\xbc\xcc\x5e\x57\xd3\x59\x03\xcd\x80\x0a\x61\x78\x5a\x93\x77\x0e\x37\x7f\x4f\xe8\xe9\xf4\xb6\x66\x80\x98\x49\x68\xf9\x64\x9e\x10\x5e\x7a\x11\x9d\x97\x63\x6f\x3a\x05\xca\xea\xb1\xd7\xea\x0b\xc8\x13\x34\xb4\x2d\x5c\xc0\x80\x83\x0e\xc2\x4d\x36\x9c\xf8\x67\x3a\x49\x0d\x59\xeb\x4c\xb0\x81\x81\xda\x39\xa4\x6d\x96\x6e\x23\xfe\xd8\xd3\x8a\x5f\xab\xc7\xe8\x43\xbc\xfb\x01\x5a\x44\x74\xbf\xd4\x6d\x4a\x43\xff\x4a\x51\xa9\x56\x76\x61\xe2\x69\x6d\xb8\x7c\x37\x58\xd3\xb5\x4c\xe7\x84\x6d\x13\x91\xd7\xf4\x65\x26\xef\x30\x84\x4d\x49\x32\x00\x18\xd7\x49\xb5\xd4\xdf\xd3\x0d\x38\x0c\x6e\x57\x3f\xc4\x14\xd8\xfe\xfc\x5d\x71\x04\x70\x75\x6b\xec\x00\xd8\x8a\xc4\xaf\xc9\x25\xd1\xed\xe3\x7e\xae\xe6\x00\x4a\x23\xea\x0e\xf8\xb6\x0e\x48"}, +{{0x4e,0xd7,0x04,0x8a,0xa1,0x28,0x4d,0xbb,0xcc,0x24,0x89,0x38,0xb4,0x0c,0x35,0x74,0x21,0x93,0x59,0x7a,0xdd,0xaf,0xdd,0xe0,0x64,0x13,0xb8,0xd4,0xcc,0xfb,0xe1,0x37,},{0xbf,0x84,0x1f,0xe4,0x44,0xad,0xd1,0xf7,0xc3,0xea,0xcd,0xfd,0x07,0x84,0xb4,0xe8,0x55,0xd2,0x40,0x5f,0x40,0x21,0xcd,0x9d,0x82,0x66,0x07,0x1c,0x32,0xc8,0xa2,0x73,},{0x10,0x6a,0x9d,0xeb,0x23,0x27,0xf3,0x38,0xcc,0xb7,0x1b,0xcc,0x94,0xe2,0xfe,0x3d,0x2e,0x97,0x3c,0xe6,0xdd,0x8f,0xa7,0xba,0xca,0x80,0x8b,0x41,0x11,0x81,0x3e,0x3b,0xc3,0xb4,0xd8,0x8e,0xfa,0x6a,0x00,0xc4,0x71,0x0b,0xbf,0xe5,0x31,0x96,0xf9,0xab,0x3a,0x15,0x0b,0x16,0x54,0xb9,0x08,0xfe,0xac,0xf9,0xc1,0x3d,0xf2,0xd6,0x38,0x02,},"\xdc\xff\x95\x87\xd6\x04\x6c\x11\x32\xbe\x07\xdf\x26\xdf\x63\x82\xff\x92\xcf\xc8\xeb\x53\x45\xc5\x1d\xd5\x0d\xd1\x88\xee\x76\x9f\x10\xa4\xde\x5e\x88\x83\xd1\x16\x96\x7b\xea\x97\xd3\xb3\x2b\xc8\xae\xbb\x9f\x01\x3d\x6d\xf9\x52\xf2\x51\xc1\xa3\x12\x34\x6e\x72\xce\xe1\x35\xa1\xbf\xd7\x6b\xf3\x08\x0a\x35\xc8\x38\xb4\x4d\x75\x5f\x26\x3d\x21\x03\x10\xfa\x8d\x28\xc4\xca\x52\xf0\x8c\xac\x5b\x83\xa8\xa3\xb1\xdf\xc4\x6d\x9b\x75\x2d\x9f\xc7\x36\x49\xd0\x0b\xb9\xee\x99\x26\x50\x63\x9c\x22\x5d\xea\xc1\xf3\x9b\x9e\x80\x36\x89\xd1\x9e\x6d\x9f\x8e\xf4\xf5\x1f\x1d\x11\x60\x1f\xac\xf4\x10\xdb\x64\x8b\xcc\x82\xbf\x64\x87\x69\xa7\xdd\x59\xc6\xe8\xa2\x37\xdb\x23\x9d\x3f\x66\x1d\x78\x52\xc4\x26\xd3\x94\xa9\x05\x09\x52\x6a\x85\x9b\x47\x64\x59\xde\xdb\xe6\xd8\x99\x36\xc0\xf3\x98\x99\x95\x51\x1d\x4a\x57\x6e\x54\x2c\xce\x5e\x0d\xd7\xee\xef\xeb\x03\x26\xd3\x3f\x25\xc2\x2a\xb6\xe7\x69\x06\x33\xf4\xc9\xed\x2a\xad\xf1\xd2\x4f\x94\x86\x21\x23\xa4\x64\x04\x2c\xea\x19\x3a\x2f\x04\x79\xd3\x9b\xcd\x1b\xbd\x1c\x7a\x0c\xa7\xe6\x25\x8e\xd3\x73\x23\x72\xf5\x4e\x0e\xd5\xe3\xf1\xe2\xe4\xd4\xa0\x4c\x51\x0b\xee\x08\xd1\xc6\xd5\x70\xcf\xd6\x3a\xbf\x14\xb4\xee\xf0\xb9\x6f\x39\xca\x29\xe4\x3c\x52\xf2\xca\x3d\xfd\x46\x0f\x66\xe3\x02\x35\xb1\x59\xaa\xef\x2c\xc1\x56\x01\x29\x69\xfd\x3d\x15\x99\x78\xd6\xca\xa0\xa9\x45\x22\x29\x1f\x79\x89\xd8\xaf\x10\x83\x19\x96\x13\x7b\x68\xd9\x7f\xc1\x7f\x6a\x9b\xc2\x84\x5e\xf3\xdd\x47\xcb\xc3\x86\xe8\x97\x7a\x86\x54\x36\x34\x12\xda\xc3\xac\x51\xc6\x38\x17\xb7\xc0\x51\x87\x8d\xcf\x45\x8a\xb3\x63\x0d\xd7\xae\xf6\x8d\x27\x0f\x8d\xa7\x88\x0a\x46\x7b\x33\x04\xf5\xba\xed\xfb\xa9\x17\x3e\x7e\xfd\x00\x7c\x41\x2d\x17\x20\x9c\x56\xd2\x39\x68\xe3\x40\xb8\xa0\xed\xb4\x1b\x7e\x2a\x40\x88\xbe\xc0\x1b\x53\x2d\xf8\x9b\x52\x15\x81\x31\x31\x10\x7b\x7b\x47\x4f\x03\xc2\xe4\x7d\x43\x17\xf1\x1c\x4f\x51\x60\x90\x43\x04\x99\x7e\x76\xa1\x21\xa9\x56\x02\x35\x20\x8d\x79\xb2\xda\xb4\xf7\xe1\x96\x79\x32\x02\xc0\x90\x2c\xe9\xc4\xbf\xc1\x0b\x8f\xe3\x97\xe3\x5c\xa0\x25\x64\x54\x66\x2a\xe8\x78\xef\xb0\xa0\xa6\x06\xfa\xc0\xa9\x52\xc9\xf6\xba\xae\xb2\xd4\x5b\x25\x8c\x61\x75\x59\xc0\xed\x25\x28\xa8\x8b\x49\xaa\x44\xee\x43\x03\x5b\x0d\x79\x3a\xad\x39\x53\xc1\xa5\xa3\x46\x38\x66\xbc\x81\x5b\x1f\xfc\xe2\xff\x2b\x65\xe0\xfd\x47\xdb\xc1\x5f\x4e\x7a\x06\xbf\xab\xc2\x90\xfc\x62\x09\x0b\xf7\xd9\x48\x53\xf7\x7c\x04\x44\xa9\xb9\x0e\xfe\x77\xd1\xce\xb4\xbd\x39\xe2\x03\xbc\x88\x40\x11\x62\x4e\x68\x46\xe2\xa3\x71\x05\x8d\xab\xa6\x3c\x23\xf8\x6c\x42\xc3\xe3\x1e\xaa\x4b\xd7\xd7\xa4\x2a\xf2\xd5\x24\x89\x6e\x31\xba\xa3\xe2\x07\x63\xf8\x5d\xcf\xd5\x27\x75\xf2\x80\x72\xd8\x9f\x0b\xd4\xfa\xe3\x0d\x0b\x13\x7e\xe3\x7a\xb0\x63\xba\x06\xfe\x9d\x4e\xc6\x2a\xbb\x2f\xea\x0f\x81\xb8\xcb\xee\xfc\x03\x00\x80\xb8\x02\x6a\x58\xfd\x18\x67\xf6\x6b\xe1\x15\x4e\x65\xbf\xea\x7d\xce\xc5\x5f\xe3\x2d\x51\xfb\x0b\x4a\x8a\x5a\x8a\x04\x42\x63\x94\x3d\x6a\xc8\x01\x1c\x6e\x67\x01\xbe\xec\x3a\x88\x65\x58\x40\xc4\x89\x2d\x45\x0d\x31\x2b\x76\x52\xd2\x51\x47\x69\xf2\x3b\xfd\x6e\x70\x46\x46\x7d\xf2\x9a\x28\x7f\xf3\xc4\xc9\xd0\xe6\x4e\x6d\x9e\x4e\xde\xe1\xb9\x35\xd0\x76\x81\xd4\x70\x04\x35\x28\x86\xe8\x47\xb0\xc6\xd5\x76\x2f\xd4\x5a\x81\xa5\x3c\xce\x94\x76\xc8\x87\x22\x1a\xea\x6c\x0c\x82\xbb\xf3\xb2\x97\x93\x2e\x5b\x11\xe5\x38\xa3\x24\x5d\x63\xd7\xb7\xb0\x91\xdf\xa1\xd7\xb9\xa0\xe2\xdb\x66\x98\xa4\xc5\xe9\xfe\x93\x16\x62\xd7\xc6\xec\x6d\x9d\x5b\x92\xbc\x7e\x04\x15\x55\xdf\x4d\xf0\xca\x11\xca\xbc\x48\x5f\x9c\x55\x61\x38\xa7\x17\x45\xf0\x3b\x97\x83\xbb\x20\x0b\x72\xd2\x33\x69\x7e\x8b\xcf\x6b\x41\x17\xee\x67\x63\xd7\x92\xd7\x42\x22\x64\x85\x2f\x4f\x30\xf8\xd1\x89\x0e\x2e\xa0\x80\x98\x04\x0f\x7f\x28\x8e\x4a\xbe\x90\xb6\x3c\xab\x2c\x14\x37\x30\x60\x84\x0e\xf8\x27\xec\xc8\x46\xcd\x56\x0e\x90\xa2\x0b\x83\x05\xf4\x63\xc3\x6e\xa0\x38\x84\xa5\xdf\x4c\x25\xf1\xba\x9e\xa1\x25\x95\x2d\xc0\x91\xb9\x75\x16\xde\x1d\x28\x7c\x0e\x2b\xf5\x29\x77\x5b\xa6\xd2\xf8\xed\xe0\x3c\xb4\x2c\x1e\x40\x0e\xc8\x04\xa9\xdf\x08\xe4\x6f\x44\xb5\x06\x63\x46\xe3\xf7\xc7\xa1\xa8"}, +{{0xc7,0xec,0xa8,0x3e,0x94,0x85,0x76,0xbd,0x9f,0x27,0x8f,0xd7,0xb8,0x28,0x00,0xa4,0x1d,0x92,0xda,0x9b,0x72,0xd5,0xa1,0xcc,0xdb,0xbc,0x65,0x58,0x10,0x52,0x56,0x8b,},{0x07,0x6b,0x83,0x52,0xdc,0xa8,0x03,0x1e,0x85,0x3c,0x8d,0x90,0x99,0xc2,0xef,0x57,0x93,0x37,0xcc,0x7b,0x2b,0x4c,0x75,0xd1,0xa0,0x63,0xea,0x3e,0xc7,0x25,0xb7,0xfd,},{0x86,0x99,0x6a,0x1b,0x8e,0x49,0x5d,0x42,0x52,0x77,0xe9,0x7c,0xc0,0x83,0x05,0x49,0x34,0x9b,0xc2,0xb6,0xf3,0xdc,0xda,0x60,0xf3,0xb7,0xd3,0x50,0x1b,0x8b,0x50,0xb5,0xb4,0x58,0xcd,0xa5,0x8b,0x43,0x6e,0x23,0xc0,0x2c,0xd4,0xa2,0x2b,0x23,0x48,0x13,0xaa,0x9b,0xcc,0x3c,0x61,0xf9,0x83,0xc0,0xb7,0xef,0xec,0xa0,0xf1,0xbe,0xc2,0x0d,},"\x8d\x8c\xef\xd6\x73\x85\x5c\xcd\x8e\xb8\x53\x4c\x31\x2d\x33\x80\x05\xbb\x05\xf5\xb9\x50\x7d\x58\x85\x9e\x1e\x95\x3b\x0a\x4d\x91\x3b\xe7\x59\xd8\xed\xfa\x92\x89\x8c\x6e\x70\xa5\x3f\x81\x95\x4f\xc3\x44\xb4\xad\x62\x46\xb0\x10\x94\x81\xba\x6f\x73\xae\x63\x31\xab\xf2\xdf\x10\x8e\xb2\xe8\x5c\xeb\x08\x7c\x1f\x6f\xcf\xc9\xde\x2c\x1f\x13\x9b\xa1\x77\x1b\x72\x68\x03\x02\xd8\x11\xcc\xd0\xcc\xd4\xe0\xc7\xfe\xb0\x13\x2e\xb2\x0b\x33\x4e\x5a\xab\xe5\xf6\x11\x9f\xd8\x94\x7d\x9e\x88\x52\xe1\xeb\x1b\x74\x10\x7e\x17\x41\x00\xe3\xe6\xdf\x0c\x3a\x68\x13\x0c\xa6\x30\x94\x02\x59\x4b\xb5\x0c\x1c\x8e\x27\x74\xf1\x32\x14\x49\x6a\x7b\x1f\x34\x83\x85\xea\xbf\xbc\xcb\xac\x16\x5a\x5a\x2e\x7d\x9d\xea\x5f\xfd\x58\xb0\xbd\x88\xb4\x9c\xb3\x31\xec\xb7\xf4\xe9\xd6\xba\xe9\x79\x1a\xd7\x88\xe6\xab\x89\x26\xc1\xcc\x16\x15\xde\xaf\x4c\xc4\x00\xc7\x7a\x31\x61\x97\xbc\xa1\x90\x49\x95\xe1\x36\x5d\x1b\x97\x02\x64\x83\x76\x11\x69\x30\xf6\xf9\x11\x66\xe6\x14\x86\x29\xe7\x5b\xe2\xd0\x68\x95\xf6\xa8\xd1\x5d\x5a\x94\xca\x69\xb7\x12\xf3\x3b\xcf\x95\xbe\x0c\x1b\xe6\x90\x2b\xb7\x8b\x8a\x23\x0d\x7a\x85\x60\xc4\xd8\x4e\x23\x89\x55\x2a\x81\x57\x1a\xa6\x65\xc1\x9c\x2e\x93\xb0\xd4\x3e\x8c\x2c\xbd\x9e\x88\x5d\x70\x52\x51\x8b\x77\xc4\x7e\x84\x1d\x11\x9d\xc2\x8b\x65\xa7\x50\x4f\x66\x42\x71\xf0\x6c\x7f\xf3\x93\xf8\x25\xb1\xe5\x93\x0d\x02\xb9\xc7\x00\x35\xe2\x92\x41\x1c\x4a\xed\xf6\x60\x47\x00\x69\x70\xe3\x49\xdf\xca\x7f\xb4\x1c\x10\xfd\x53\x7e\x35\x25\x2e\x10\x9e\x33\x36\xd7\xa8\x2a\x14\xde\x5d\x55\x40\xc6\xfc\x65\x71\xd5\x77\x4f\x39\xb7\xc4\x03\xe7\xb8\x87\x5e\xc2\x15\x87\x7e\xfc\x6c\xc8\xea\x48\xb1\x86\xb4\x68\x21\xea\x5e\xf2\xba\x8b\xac\xd4\x0d\x79\x7e\x6a\xdd\x06\x41\x32\x83\x14\x5b\x60\x46\x2b\x35\x03\xc5\xb8\x81\xd7\x9a\x59\x29\x55\xd1\x8a\xfa\x08\x96\x9e\x31\x45\x7f\x5b\x27\xda\xec\x01\x03\x38\xed\x86\x7f\x30\x08\x78\xfd\x87\xce\x32\x18\x80\xb8\x60\xa0\xc6\x42\x84\xca\x2d\xc1\x5f\x5e\x53\x10\xe1\x0e\x6a\x73\xa7\xea\x65\x0e\xa9\xd3\x73\x69\x4d\xa4\xdd\x42\x9a\xe7\x41\x2e\xf9\xb2\x9c\x83\xb3\xb0\x68\xc7\x47\x69\xf4\x31\xce\x06\x15\xf9\xff\x4f\x82\xba\xac\x47\xb4\xbc\xe9\x04\x49\xec\x41\xc2\xa2\xd5\x73\xd9\x2b\x92\xe0\x56\x31\x48\x61\x65\xbc\x71\x0e\xf5\x84\x0f\x80\xda\xe9\xf9\xdd\x5c\xff\xd4\xeb\xf5\xd1\x07\x46\x51\x0c\x5f\xcb\xfe\x62\xcb\x97\x03\xc0\xb1\x54\xc8\x6f\x10\x81\x66\x72\x49\x76\x70\xa3\xb0\x15\x0b\xb4\xe1\xb0\x3b\x3b\xd5\x44\xc1\x2a\x90\xc3\xed\xcc\xd7\x90\x0e\xbb\x5b\x31\xc9\x11\x17\xcc\x82\x81\xa3\xc4\xed\x04\x99\x8e\x99\xae\xd4\x1b\xb4\x1f\xce\x99\x90\xa4\x06\x48\x5b\x14\xdb\xe3\xbc\x1a\x5f\xcf\x77\x19\x50\x79\x90\xda\x3b\x0b\x3c\x68\xad\x40\xd8\x95\x0c\x0d\x49\xce\xd1\x01\x93\x19\xa3\xf3\x6a\xff\x6c\xaf\x75\xd7\xf9\xa0\x93\x3d\xd3\xab\xdd\x76\x92\xa1\x56\x2f\x06\x13\xfe\x4a\x27\x8d\x5c\xe4\xc8\xda\xfb\xb5\x5b\x2e\xc2\xaf\x2b\x24\xe8\x39\x6f\x58\x7b\x17\x0c\x9c\xa6\x54\x75\x08\xfa\xcd\xe7\x34\x90\xdf\xb0\x1e\xb6\x65\x7e\x3f\x4f\x27\x23\x04\xb7\x0b\xf0\x47\xa4\x3a\x2b\x58\xe5\x56\x8b\xc5\x2b\x2c\x8d\x4c\x03\x21\x9a\x5a\x8b\xd3\xdc\x06\x43\x18\x59\x13\xc0\xaf\x74\x11\xf8\x1b\x77\xbe\x2a\x9b\xfd\x5c\xb2\x69\x77\x11\x3d\x26\x58\xa9\x71\x92\xb4\x1c\xf6\xc7\x01\x1b\x0f\xf6\xa1\x1c\xbf\xf3\x50\x55\x46\x32\x2f\x0b\xef\x60\x97\xe4\x6b\x36\x49\x2b\x01\x6a\x45\x62\xe0\x92\xb6\x7c\x3f\xcc\xc7\x78\x0e\xa2\x74\xd9\x6d\x59\x58\x49\xf7\xe2\xa5\x6d\x79\xed\xcb\x32\xd7\x84\x04\x9f\xc1\x32\x4a\x5b\xee\xfc\x24\x19\x3a\x66\xe1\xca\xc4\xa1\x3a\x81\x1b\x90\x95\x83\xcc\x91\x0c\xf0\x8d\x4b\x10\x4d\xbd\xb8\xa6\xf2\xb2\x1f\xbc\x1d\xb1\x17\x5a\x1a\x23\x56\xa6\x3d\x3e\xea\x9d\xbb\x85\x37\xd2\xc6\x86\x27\x54\x3d\xf0\xd1\xf8\xfd\x8d\x57\xa1\x8b\x0d\xbd\x69\xb9\x20\xcb\x9b\x28\x6e\x3c\x07\xae\x44\xae\x2e\x1b\xee\xc0\x1c\xee\x6b\xa9\x88\xb5\xd1\xaf\xb9\x97\x90\xb1\xdd\x91\x06\x55\xc4\x3d\x7f\x2a\x3e\xd3\x75\x4b\xa4\x65\x16\xd2\x78\x70\x55\x59\xf5\x74\x16\x22\xa9\xab\xb5\xc8\xf2\x3f\xa9\x76\xa9\xd1\x46\x94\x8a\xde\x6b\xa6\x60\x8a\x35\xe4\xe0\xd3\x30\xe8\x2e\x96\xa2\xbe\x6c\x78\xad\x0c\xd4\xd8\x70\x4e\x57\xce\xa1\x46"}, +{{0x7b,0x46,0x9d,0xf9,0xc8,0xf7,0x84,0x89,0xab,0x47,0xcc,0x70,0xa8,0x85,0x03,0xf1,0xb8,0xf3,0xd9,0x29,0xc3,0x3f,0xea,0xb1,0xc5,0x03,0xf0,0x96,0x9a,0x3a,0xc3,0x7b,},{0xa8,0x14,0xc7,0xe3,0x73,0xd0,0x11,0x3b,0x90,0x62,0x4a,0x8a,0xb2,0xbc,0xa5,0xcf,0x53,0xbf,0x52,0x8e,0x39,0xfc,0x3d,0x36,0x7d,0xe1,0x54,0xb9,0x4b,0xb2,0x2f,0x1d,},{0x18,0xfa,0xf8,0x2d,0x08,0xe1,0x06,0x8e,0x9f,0x98,0x3d,0x81,0x2f,0x05,0xfd,0xb6,0x92,0x9d,0x27,0x23,0xdb,0x1f,0x77,0xc4,0x5a,0x74,0xbb,0x09,0xcf,0xf2,0x77,0x73,0xb5,0x4c,0xe8,0xf4,0x3b,0x30,0x15,0x41,0x91,0x12,0xe7,0x25,0xea,0x7a,0xcd,0xa4,0xb2,0x3b,0x81,0x20,0xe7,0xb0,0xcf,0x42,0x01,0x53,0xe5,0xb0,0x3d,0xd0,0x61,0x09,},"\x1c\x0f\xd7\x45\x0e\x29\x67\x5c\x93\x09\x16\x38\xc2\xac\x93\x3c\xa9\x97\x76\x6e\x38\x0e\xc3\x3a\x92\xb8\xa7\xe1\xa1\xed\x98\x21\xc7\x5f\xcc\xb5\xc5\xf3\x76\x0e\x76\xd0\xe8\x81\x03\x11\xdd\xc6\x24\xea\x87\x42\x13\x1c\x1c\x43\x08\xf4\x17\x8e\x04\xd0\x49\x60\x69\x3d\x84\x6c\x1f\x51\xd8\x77\x3b\x6d\xeb\x34\x43\xd8\x74\xb9\xe2\xde\x3b\x77\x78\x51\x85\x51\x8b\x2e\x9e\xe7\x36\xc6\x3a\x39\xc8\x21\x2c\xa8\x66\x9e\x16\x1d\x13\x1b\x1a\xb2\x26\x4f\xdd\x72\xdc\x56\x28\xb1\x1c\x06\xf2\xaf\x9f\x07\x89\x04\x7b\xdd\x4e\xbb\x5d\x55\x89\x9f\x74\xdc\x4e\x12\xe7\x97\x53\x63\xf6\x3a\x8d\xa7\x6b\x55\x85\xc1\x6b\xb6\xd5\x5b\x05\xfa\xde\x87\x13\xd1\x9c\xad\x1a\x21\x16\x40\x26\x26\x91\xaa\xc9\xb4\x37\xa9\xec\xf8\x9a\x92\x46\xec\xdb\xa1\xff\x0b\xea\x78\x49\x4c\xee\x15\x29\x62\x16\xea\x6b\xb8\x82\x47\x9d\x24\x37\xc9\x49\x4a\xc7\xfa\x4f\x30\x15\xd1\xd3\x14\x9d\x55\x64\xd7\xc1\x1a\x7e\x7b\x61\x4f\x7d\x3e\x9d\x45\x4f\x0a\x05\xb0\x40\xa1\xe0\x6f\xe7\x83\x7c\x2a\x9d\xa2\x79\x4d\x91\x8b\xff\xa9\xe6\x1a\x0c\x3f\x08\x9f\x6c\x9f\x7e\xea\xc5\x86\xe3\x4b\xf9\x44\x70\xd9\x13\xda\x41\x37\x1c\xac\xdf\xc7\xee\x8b\xd1\x13\x56\x55\x56\x69\x24\xea\xdf\x09\x6a\xc0\x30\xa6\x59\x02\xc1\x03\xb1\x72\xd1\x2e\x88\xf0\x53\xfc\x56\xee\x73\xf3\x18\x70\x81\x70\x83\xaf\xa8\x02\xf7\x66\x8b\x81\x5e\xe7\x90\xf7\xd4\x0b\x43\x7a\x2e\x6d\xb2\xf0\xfb\x26\x83\x6b\x4b\x23\x31\xeb\xa5\x55\x39\x61\x4c\x0f\xe1\x72\x40\x24\x2d\xd3\xaf\x73\x83\xbc\xff\x7d\x3f\x47\xd6\x54\x4b\x08\x72\x0c\x0a\x52\x44\x1f\x74\x11\x93\x5d\xd4\xa9\x52\xd3\x86\x51\xa8\x00\x05\xfa\x3e\xb0\xea\xec\xc7\x35\xd2\x90\xe8\xbd\x5e\x31\xb7\x40\x14\x0e\x13\x6b\x2c\x00\x25\x23\xd8\xeb\x2a\x0a\xb5\xbd\x68\x70\x02\xb3\xb9\x26\xf7\x5e\xb6\x90\xd1\xda\x73\xad\x23\x58\x92\xf3\xb2\x3a\x75\x6b\x60\x5a\x43\x7c\x00\xe0\x62\x13\x04\xe8\x10\xf9\x9e\x31\x4c\x4d\x63\xe3\x22\xd9\xb6\x98\x15\xf3\x82\xff\xa1\xec\x62\x80\xfc\x0e\x64\x1c\x8a\x6f\x6f\x7f\x61\x98\x5b\xd3\x56\x7e\x0f\x44\x0d\xe9\xf7\x62\x17\x15\xda\xcd\x07\x42\x8c\x00\x90\x15\x4d\x59\xce\x6d\xb4\x01\x69\xc6\x58\xac\x5b\xf4\x4b\x67\x67\x1f\xe1\x9e\x4b\x5b\x38\xaa\xd2\xd3\xd4\xe1\x90\xa5\x50\xaa\xd4\x18\x83\x52\xf7\x98\x1a\x6d\x88\x06\x25\x02\xdf\x86\x79\x13\x50\x39\x2d\x41\xce\xfa\xcb\x24\xe3\x7b\xc7\x00\xcb\x02\x91\x90\xc3\xb1\x82\x14\x77\xe1\x17\xd5\xa4\x62\xfb\x3e\x79\x13\x3b\x10\x73\x59\x89\x66\xf5\x2b\x63\x25\x6d\xbf\x32\x6a\xce\x14\xdb\x0c\x80\x05\x8c\xf0\x0d\x68\x9a\x0a\x58\x11\x1a\xf1\x69\x27\x44\xbf\x79\x1b\xcb\xb4\x27\xa3\x72\x24\x6e\x95\x01\xa8\x5c\xd5\x20\xc6\x1a\x1e\x59\xee\x18\x0e\x8c\x97\x19\x2f\x60\xfa\x5d\x3a\xb0\x5d\xf8\xd8\x55\x1c\x1a\xc6\xca\x0a\x9a\x01\x2f\xfe\xce\xb3\xc1\xf5\x21\x41\x1e\xdb\x65\x09\xbc\x27\x8a\x65\x1e\x12\x9e\x96\xb0\xad\xc7\xae\xd7\x07\x22\x1c\xae\xac\x22\x98\x84\x41\x3d\xaa\x10\x59\x5d\x22\xd1\xdb\x70\x82\x12\x5f\x4f\x96\x95\x00\xa1\xd4\x8d\xac\xda\xe8\x0f\x40\x29\xc1\x63\xdc\xd7\x9d\xdc\x64\x68\xfc\xda\x16\x37\xb8\x7d\xdc\xf2\xa3\xd9\xb4\xd2\x99\xa0\xe5\x39\x4d\xf9\x0e\xd0\x3b\x62\x13\x7b\xa6\x7b\x9f\xea\x8a\xe1\xf0\xd2\x2f\x91\xc6\x3a\x24\xb5\x93\x4f\x74\xc2\x65\xc4\x3f\x1b\x92\x3d\xb9\x80\xad\xfc\xee\x83\x13\xda\x52\x01\x76\x73\x0e\xf9\x73\x6b\x27\xe6\xba\x32\xd1\x7e\xa6\x9d\xca\xc6\xf4\xa0\x16\xed\xfe\x2d\xb5\xa5\xbb\x3b\x64\x93\x2f\x70\x11\xf1\xc4\x53\xbb\xe8\x8b\xba\xc8\xc7\x03\x5f\x93\xfe\x39\xb5\x81\xfc\xaa\x7a\xaf\x08\x2f\xbe\xd0\x04\xfd\x1f\xd5\xa4\xe2\xd9\xc1\x97\x16\x60\x4b\x19\xce\x19\x9e\x21\x69\xa7\xbe\x51\x8d\x5f\xad\xd2\xac\x31\xb9\x54\x78\x08\x2a\xc9\x13\x06\x00\x8d\xe4\xec\x0e\xf4\xc9\xf9\xd6\xf9\x6d\x2f\x66\xd6\x2f\xaf\xc2\x19\x40\x82\x80\x8a\xf0\xd6\x7b\x9f\xba\x0d\x18\x9b\x05\x5f\x06\x1c\xca\xc2\x4b\x27\x61\x0b\xfb\xd5\xa2\x23\x2d\xd6\xf3\xc8\x90\xa9\xb1\x26\x64\x71\xb3\x22\xe9\xe1\xbf\x97\x75\x7b\xef\x72\xab\xce\xe9\x3b\x05\x1f\xc9\x23\xcf\xd4\xe7\x23\xbe\x3e\x17\x14\x3f\x38\xee\xbb\x90\x0b\x5b\xbc\xf7\x30\x47\x32\xb9\xc0\xa1\xc5\xfc\x95\x09\xa6\x93\x58\x0a\xe7\x3a\x4c\xdf\xc5\xfb\xf2\x0c\xe8\x1e\xbc\x83\x5c\x6c\x90\x9d\x83\x11\x41\xb1\x94\xf6"}, +{{0xdf,0xec,0xde,0x7a,0x56,0xa1,0x8c,0x1f,0x19,0xd8,0x0a,0x19,0xa4,0xf1,0xda,0xdd,0xd0,0xbc,0xec,0xb0,0x1e,0xec,0xad,0x6d,0xfc,0xa0,0xf9,0x57,0xa9,0x14,0xed,0x7a,},{0xaf,0xba,0xa6,0xe7,0x3e,0x85,0xb0,0x2b,0x25,0xa4,0xb5,0x87,0xec,0xb8,0xc4,0xdf,0xb7,0x9a,0xa9,0x20,0x27,0x61,0xef,0xa8,0xd1,0xdf,0x2c,0xd0,0xaa,0x63,0x16,0xc4,},{0xb4,0xfd,0xe5,0x5b,0x91,0x6c,0xf6,0x00,0x68,0xf1,0x9b,0x25,0x35,0x1c,0x14,0x10,0xdc,0xf6,0x6b,0xfc,0x40,0xf9,0x6d,0x1b,0xa2,0x36,0x8b,0xc2,0xb9,0x11,0x5a,0xaa,0x5b,0x2d,0x1c,0xf0,0xe3,0xdf,0xca,0x02,0xac,0x90,0x2a,0x94,0x3e,0x24,0x89,0xa5,0x68,0x1b,0xba,0xfe,0xd3,0x9c,0x6e,0x33,0x21,0x1a,0x9c,0xb2,0xff,0x6e,0x54,0x09,},"\xae\x6e\x8f\xf6\x5c\xcd\xe6\xf2\x64\x84\x95\x08\x26\xb4\x36\x23\x05\x8a\x5e\xfe\x02\x0b\xb1\x9b\x7d\x8b\x4e\x25\x76\x8b\x69\x27\x34\xfe\x07\xc9\x13\xb9\xe8\x81\x26\xbe\xcb\xf1\x4a\x0f\xd0\x20\x5b\x39\xfc\xc2\xae\xc3\x73\xf8\xc1\x84\xc6\xa9\xbb\xbb\x84\x44\x9a\x7c\xa3\xb9\x20\xad\xa0\x88\x01\xdf\xc6\x6f\xf1\x9a\xeb\x92\xf2\x55\x53\x99\xa4\x30\x27\x7a\xe2\x2d\x23\x75\x4e\xaa\xce\x3c\x73\x84\x67\x97\x53\x6d\xd7\x1a\x56\xf4\xb5\x84\x2c\x0f\x41\x0d\x19\x89\xac\xac\x5d\x80\x5d\x26\x57\x2c\x0f\x3a\x64\xdd\x20\x71\x66\x22\x12\xd5\x2f\xe9\x9e\x59\xd9\x66\x04\x77\x77\xf9\x03\x0f\xa4\xfd\x2e\xe7\x4b\x7a\x7c\x9f\x7c\x34\xa6\xdc\x7e\x03\x59\x3a\x13\xd6\x4c\xe6\x24\x53\xee\x3c\xa3\x0d\x84\x67\x28\x39\xf1\x9f\x1c\x15\xd0\xc4\x5d\x27\x55\xbb\x39\x4a\xcf\x4d\xcb\x7f\x7f\x07\x11\xac\x40\xea\x46\x61\x2e\xa3\x7a\x76\x07\xad\x32\xe8\x18\x26\x5f\xab\x19\x33\xf5\x09\x4e\x2d\x03\xbc\xfa\xa5\xf6\x16\x67\xf3\xb3\x7f\x00\xc4\xc5\x8d\x9b\x41\xb9\xaf\x39\x00\x48\x2b\x0f\xfb\x4f\xa4\x37\x6a\xa0\x40\x00\x9d\xec\x2f\x45\x25\x79\x9c\xb0\x05\xf3\x9d\x74\xcb\x2d\x8d\xce\x8c\x20\xc2\xc3\xf5\x40\x97\x03\xaf\x15\x6c\xfb\xa2\x8a\x9d\x91\x64\x39\xcb\x29\xf8\x3d\x24\x29\xce\x62\x23\x51\x9e\x75\xe1\x5c\x7c\x7f\xa2\x15\x11\x9e\x07\x3f\xa7\x97\x4d\xb1\x4f\x7a\x01\x09\x3f\xaa\x94\xad\x52\xab\x1e\xad\xce\x1a\x89\x36\x6c\xa1\x3a\xdb\x89\x06\x64\x38\xa2\xbe\xb7\x30\x34\x17\x0a\xa4\x2d\x9c\x2d\xdb\x97\xc1\x4a\x17\xc3\x09\x43\x76\xd2\xa3\xff\xd8\x09\x5f\xc4\x05\x3d\x91\xd1\x6e\x06\xd2\x76\x93\xa1\x31\x0f\x01\xa7\x51\x11\xcf\xed\xa8\x92\xc3\x97\x2a\x13\x3a\x09\xad\xda\xa8\xf7\x41\x45\xf8\x86\x81\xb6\xd2\x77\x96\x4b\xfe\x38\x55\x1a\x2c\x61\x9f\xa3\xca\xe3\x94\xac\xb2\x9c\x94\x10\xb4\x5e\x10\x1b\x17\x40\xe8\xb2\xaa\x6f\xeb\xc3\xa4\x5d\xad\xb9\xd9\x58\x9d\x59\x7e\x57\xcd\x94\x7b\x68\x4c\xc3\x55\x24\x6c\xe6\xc3\x26\xdd\x98\xcf\x92\xb6\xee\xa3\xba\x5a\xb0\x37\x00\x62\x26\x36\x32\x4d\xc1\x22\x2c\xd7\x48\xfa\x07\xbf\xd3\x9a\x1e\x06\x98\x09\xe5\x67\x14\x1a\x61\x3e\x2e\x8b\xe9\xdd\x39\x8a\xb6\xbe\xaa\xfd\x85\xff\x36\x28\xee\x2a\xa3\x2d\x0a\x57\xbb\xac\xf9\x56\x19\x0b\x5c\x42\x42\xeb\x5b\x85\x87\xd2\xfd\xcb\x07\x41\xb9\x41\x6a\x05\xf5\xfe\xcb\x1f\xb2\xd6\x47\x88\xdc\xe7\x83\xc1\xf6\x3e\x60\x64\x1f\xce\x5e\x1d\x2b\x18\xa9\x50\x0c\xd6\xa1\xfd\x33\x5c\xc1\xdb\x46\xef\x04\x75\x2b\x2d\x22\x07\x2e\x6d\xfc\xfc\xfa\x56\x9b\xb2\x5e\x45\x7a\xfe\xb6\x3a\x4f\xbe\xdc\x29\x3a\xd9\xd1\xab\xa4\xe3\x94\xaa\x10\x97\xe1\x2b\x0f\xc9\x0c\x89\xf7\x6d\xf0\xd6\x44\x1f\xa9\x98\x08\xb6\x0b\xe0\x7d\xfc\xc7\xf9\x01\x0b\xbf\x90\x33\x55\x6d\x5e\xe2\xd4\x48\x93\x7b\x78\x34\x93\x92\x0f\x68\x1e\x4d\xa7\x08\x67\x10\x97\xe1\x99\x48\x1b\x8e\xf0\xe0\x15\x0d\x7c\x28\x51\xdf\x44\xc5\x45\x12\x2f\x9b\x0e\x5b\xa2\xee\xff\x2d\x98\x8d\x56\xd9\xbb\xb5\x5d\x98\x96\x11\x11\x51\xa4\x36\xaf\x06\x5e\x0c\xad\x17\x8a\x2c\x9f\xa8\xf6\x97\x4e\xcd\xf0\x9a\xdf\x01\x33\x00\xcf\xfe\xda\xf4\xb8\x79\x1b\x46\x7b\xa7\x93\x3a\xda\x5d\x63\x2d\xb4\x4e\xd6\xdc\xf2\xaa\x64\x89\x17\xbe\x63\x37\xd2\xe2\xd2\x06\x85\x6d\x08\xf9\xee\x7b\x5e\x2f\x14\xdd\xc6\xd3\xac\x42\x92\x15\xa8\x79\x23\xad\x32\xd5\xdc\xfe\xe3\x68\x63\x16\xdd\xd1\xb2\x7b\xb1\x93\xa5\xfc\x05\xc8\x93\xa9\x39\xa5\xb9\x89\x87\x36\x6c\x82\x9e\x39\x2f\x48\x5e\xa1\x5e\x22\xcd\x8f\x85\x7a\x13\x4a\xfa\x98\xf3\x72\x15\x57\x6d\xdc\x5a\xab\x4f\x2d\x10\xca\xaf\x05\x00\x59\xa3\x35\xf2\x4b\xcd\xcb\xac\x81\x9f\x66\xdb\x07\xaa\xbd\xfb\x76\x27\x1d\x17\xbc\xe2\x2c\xba\x46\x3a\x80\xaa\x89\x2d\x0d\x8e\x05\x5f\x94\x8d\xf7\xf6\xe6\xc3\x00\xda\xef\xfd\x3a\x23\x6d\xdd\xcf\x23\x8f\xe1\x06\x66\xa5\x7c\x6e\x3a\xe7\xe3\x67\x3d\x35\x57\x8f\x8b\x8e\xa6\x9d\x3c\x08\xe0\x14\x0a\xfd\x3e\xe0\x30\xb2\x2a\x37\x21\x60\xf9\x08\xa3\x78\xf8\x10\x1b\x5f\x59\x69\xfe\xa3\x10\xee\xd3\x7a\x00\xd9\x73\x02\xd5\xc2\xdb\xe8\xcc\x60\x00\x75\xdc\xcd\x33\xad\x63\xd2\x65\xaa\xf6\x0e\x24\x1c\xe3\x11\xbe\xd7\xdd\x5e\x27\x45\x24\x1a\xe0\x2a\xe5\x32\xd1\x5c\x18\x88\x6e\x81\x81\x38\x75\x1a\xfc\x51\x85\x0e\x50\x6c\x6d\x31\xa8\xee\xf4\x51\xad\xfd\x4b\x3d\x26\x6b\x41\x5a\x7e"}, +{{0x07,0x82,0x8c,0x58,0x0e,0xbf,0x9e,0x1d,0x82,0x5a,0x59,0xc3,0xbf,0x35,0xf0,0x72,0xae,0x12,0x33,0x55,0xbd,0xcc,0x24,0x9e,0xec,0x7f,0x2f,0xc5,0x75,0x5e,0x29,0xb5,},{0x58,0xe5,0xed,0x85,0x10,0x0b,0xbd,0x9b,0x22,0x21,0xaf,0xc9,0xc9,0x31,0x84,0x33,0x0a,0xd5,0x9e,0x13,0x85,0x60,0x62,0x44,0xbf,0x00,0x3b,0x8d,0x20,0x18,0x50,0x1b,},{0xbb,0x09,0x36,0x04,0x39,0xa8,0x2d,0xee,0x5c,0x7d,0x85,0x77,0x9e,0x54,0xc1,0x3f,0x88,0xe0,0x6d,0x38,0xf4,0xb9,0x49,0x60,0xfe,0x17,0xa1,0xeb,0xca,0xa3,0xee,0x2f,0x33,0x0c,0x64,0x91,0x54,0xbb,0xc8,0x75,0xa4,0x07,0x6c,0xf0,0xbb,0xf7,0xee,0xbf,0x7b,0x8d,0x08,0xd5,0xaa,0x4b,0xe7,0x41,0x38,0x81,0x24,0x5f,0xc2,0xd2,0xb6,0x01,},"\x0e\xda\xd5\xca\xe6\xed\x98\x43\xe9\x1c\x50\xd9\x34\xcf\x55\xdd\x65\x8f\x3d\x25\x20\x39\xcd\x6c\x75\xbe\x4f\x6b\x86\x6f\xb7\x5f\x35\xc8\xf9\x8f\x17\x21\xd7\xe6\xd9\xd9\x8a\x22\xe0\xb4\x93\x4d\xcc\x12\x92\x61\xbf\x67\x23\xb2\xfa\x7a\x99\x5e\x35\xc4\xbd\x79\xc5\x81\x6a\x32\x16\x07\xd9\xdc\xce\x39\xfe\xfa\x1d\x55\xde\x4e\x76\x17\x54\x8e\xc3\x85\xc3\xde\x01\xe3\x66\xbf\x50\xc4\x57\xa5\x55\xe9\x32\x07\x0e\x2a\x5a\x01\x97\xb7\x9e\xfb\xe7\x00\x6f\x0c\xec\x78\xb6\x0e\xbb\x8f\xa8\x78\x1d\x8e\xb7\x32\x6e\xdc\x30\xe6\x2d\x32\x97\xa1\xe0\xa1\x11\x71\x08\xc4\x6e\xe5\xdb\xef\xc6\x59\x42\x89\x33\x5e\x78\x0d\x55\xa0\x84\xf5\x52\xda\x3f\x36\xd3\xc4\xc6\x17\x8b\xa7\x4d\x4d\xec\xef\xc5\xa3\xb8\xc4\x7c\x16\xf5\x34\xbd\xb6\x08\x95\xd3\xd5\x4c\xd2\xbb\x26\x6b\x39\x9e\x4d\x4f\xb4\x8d\x7a\x8c\xde\x17\xf4\x24\x12\x56\x07\x37\xd3\xc0\x6e\x29\xdf\x52\x4d\x0c\xbd\x30\x93\xef\xca\x1c\x8f\xed\xca\xa1\x24\xab\xb2\x7a\xbd\xac\x6a\x29\xe0\xe8\x24\x6a\xbd\x6f\x5f\x53\x19\x50\x03\x7f\x76\x32\x3a\xa5\x6c\xc3\xfe\xfa\x60\x30\x41\xd5\x5f\x19\x29\xe2\x77\xe7\x2c\xda\x1f\x96\x54\x1d\x2a\xf3\xe9\x0c\x0f\x0e\x28\xbe\x19\x6d\x8f\x69\x21\xf3\xcd\x57\xa7\x92\x6b\x86\x0a\xa1\xbc\x40\x35\x76\x89\x2a\x96\xb9\x31\x90\xae\x38\x3f\x63\x1b\x72\x80\x26\x58\xb2\xe8\x45\x1d\x52\xa2\xf4\x5d\xb4\xf8\xbc\x3b\x0e\x4e\x50\xb6\xd6\x03\xa5\xbd\xd3\x0c\x23\x42\x00\xad\x7d\xeb\xb9\x63\xf5\x8a\x4f\xa2\x03\x30\xb3\x69\x64\x49\x44\x5a\xa3\x71\x82\x48\x42\xfb\xf3\x26\xd9\x01\xdf\xe3\xbe\x04\x54\x52\xa3\x74\x0d\xd1\x60\xe7\x27\x33\xf6\xe2\x73\x35\x25\xa2\x9a\x86\x5f\x6f\x50\xd5\x3b\xf7\x19\x1c\x59\x9c\x87\x6f\x5c\x9c\xa1\xe3\xfa\xd7\x96\x06\x48\xe0\xd4\x71\xf7\xd5\xc0\x1c\x67\x3f\x42\xd6\x59\xbc\x3d\x98\xdb\xf0\x7d\x8f\xeb\xfb\x99\x5d\x17\xf9\xa0\x2c\xd6\xc3\x9f\x2d\xdc\xd0\xf1\xd2\x22\xb9\xe1\x1f\x2d\xd7\xd3\xc7\x51\x82\x24\xbb\x6b\xfb\x8b\x7c\x58\xfe\x8a\xc1\x05\x40\x59\x03\xa1\xb9\xda\x75\x16\x71\x5b\x7a\xfc\x38\xa5\x55\xe6\xbb\xcd\xba\xd4\x6e\x34\xe5\x76\xfe\xa3\x4c\xe3\x57\x34\xed\x20\xaf\x5d\x88\xee\xb1\x04\x7a\x26\x60\x64\x8b\xbb\x11\x3a\xd9\xdb\x8c\x53\xed\xb6\xed\x98\x71\xa1\xe4\x4c\x9e\xd2\xdf\x56\x56\xfb\x2b\x28\x06\xec\xf0\x3b\x1e\xca\x9e\xab\x50\xa6\xea\xab\x55\xb9\x33\xb2\xdd\x1f\x21\xd4\x50\xde\x9d\x5c\xb2\x23\x2f\x07\xa3\x92\x08\x1b\x0b\x4b\x88\x5d\x54\x78\x9e\x2f\x75\xbf\x2c\x4c\xda\xd8\x78\x98\x9b\x1d\x6d\xab\xd9\xed\x23\xc7\xc5\xb0\x35\x6a\x7d\x9e\x73\x35\x29\x0d\x7c\x85\xb9\x66\xe8\x01\x84\xbd\x07\x99\x86\x02\x88\x6d\x70\x76\x19\x35\x65\xc8\x1c\xcc\xda\x4c\xc7\xd3\x3c\x85\xd9\x05\xb1\xbe\xb6\xe8\xe7\x41\x8e\x8a\xca\xed\xf0\xd9\xa3\x2a\x7d\x29\xd0\x7c\xf4\x4d\x31\x19\xd4\xe7\x89\x68\x20\xb7\x7d\xe6\x4b\x65\x5e\x4f\x14\x88\x00\x43\x4a\xf7\xbd\xb2\xa5\x6b\x25\xeb\x94\xea\x39\xf2\x16\x95\x96\xbb\x2b\x11\x76\x1f\x08\x2b\xae\xc0\x88\x85\xf4\xa0\xeb\x6c\x95\x76\x71\x35\xa7\xf7\xcd\x72\xe7\x43\xd2\xdf\xf1\x44\xdd\x8b\xaf\xb1\xb3\x18\x00\x6e\x58\x76\xf8\xe2\xcb\x44\xaa\x58\x8f\x90\x62\x66\xac\x67\x11\x9c\x17\xf5\xde\x11\x4e\x72\xe4\x2a\x1f\xb3\x99\x44\x32\x1a\x11\x1f\xa7\x95\xff\x70\x17\xf2\xfb\x8c\xaf\x48\x2f\x55\xd7\x7a\x80\x85\x54\x28\xde\xd7\xec\x20\xac\xec\xca\x83\xf8\xd1\xeb\x13\x7b\x58\x8c\xcb\x74\x5c\x10\x5f\x2b\x2c\xa4\x1c\x3a\x9f\x49\xd3\xc6\xe9\xd7\xc6\x48\xb0\x03\xb9\x70\x7c\x90\x64\x62\xed\xad\x61\x7a\x8c\xfb\xf9\xbc\xc6\xc5\xfb\x6f\xa9\x84\x32\x5d\x65\x82\xe2\x8f\x62\x00\x53\x83\xf3\x38\xdf\x5b\x38\xfa\x9d\x19\xc2\x2a\x2a\x7e\xa1\xd6\x8a\x92\xd1\xd9\x3b\x7f\xb0\xb8\xf3\x3b\xc8\x76\x0f\x28\xae\xb1\x43\x9a\x8b\x07\xf3\xda\x58\xdd\xb1\x55\xb4\x98\xcb\x09\xc7\x5a\x55\x96\x83\x8a\x65\x01\x3e\x24\xd5\x64\x0d\x08\x42\xa7\x69\x93\x22\xcf\x3f\xfc\xb5\x70\x3f\x41\x4f\xfd\x16\x88\x60\xba\xd3\xe3\x08\xb2\xb5\xbf\x3c\xdf\x7f\x36\x3b\xf9\xaa\xf4\xb3\xbc\x42\x4c\x14\x6c\x6f\x54\x21\x43\x0f\x9f\x47\x6a\xa3\x4a\x0c\x6e\xe8\x01\x31\xfc\x4d\x4d\x97\x07\x23\xa2\x18\x6a\xe3\x62\x5e\x28\x6d\x17\xdd\xdc\x43\x5c\xcb\x00\x83\x16\x78\xab\xa5\x84\xa6\x2d\xbf\xf0\x02\xbe\xad\x6e\x11\xe2\x3c\x54\xd3\x3c\xf3\xa4\xb2\x31\xa9\x08"}, +{{0xf0,0x8e,0xe8,0xda,0xa7,0x3e,0x1f,0xeb,0x61,0xa8,0x8e,0x06,0x2d,0xfb,0x10,0x03,0xc8,0x57,0x8a,0x0d,0x53,0xbd,0x3b,0xc9,0xe5,0x89,0xef,0xb9,0x2f,0x68,0xbe,0x14,},{0x76,0x69,0x2c,0xe8,0xd1,0x16,0xec,0xcb,0x89,0x70,0x77,0xed,0xca,0xaf,0xdd,0x3e,0xb4,0x4e,0xa1,0xa4,0x86,0xb9,0x0e,0x49,0xe9,0x7f,0x96,0x69,0x01,0x01,0x55,0x02,},{0x66,0xdf,0xa4,0xc1,0x57,0x5b,0xef,0xf2,0xf5,0xa2,0x30,0xb2,0x8c,0x58,0xc3,0xee,0xa0,0x73,0x6d,0xf3,0x79,0xd7,0x55,0x59,0xbc,0x9d,0x37,0xa9,0x57,0x9d,0x12,0x1c,0x05,0xc3,0x73,0xe8,0x48,0x4c,0x97,0x47,0xef,0x44,0x77,0xe8,0x0c,0x4b,0x2c,0xb4,0xdd,0xf1,0x6a,0xe9,0xfd,0xfa,0x08,0xa0,0x75,0x47,0xd1,0x07,0xdc,0xea,0x12,0x03,},"\x64\xde\x90\x04\x4d\x0e\x76\xbc\x02\xfc\xff\xcb\x75\x26\x36\x67\xb3\xbd\x73\x3b\x40\xbf\xb2\x6c\x6c\x52\xfd\xb4\xb0\x78\x22\x78\xca\xba\xe4\x1e\x21\x29\xea\x40\x17\xe9\x4d\xe8\x60\x87\x96\x4f\x66\xd8\x62\x07\x98\x74\x67\xa1\x68\x8f\x9f\xab\x3f\xfb\x2f\x1d\x00\x63\xbf\x62\x6c\x94\x13\x67\xc1\x2e\x31\x9a\xb7\xca\x30\x20\xc9\xb3\xa7\x21\x5a\x19\x30\x3e\x2d\x0e\x89\x88\x79\x1d\xe0\xd8\xe1\x63\x2d\xaa\x38\xc7\xf3\xe7\xf6\xe4\x8c\xe1\x22\x14\x3d\x1e\x2c\xb6\x61\xba\x77\xc6\x9e\x6a\x71\x09\x11\x64\x4b\xc1\x10\xff\x58\xbb\x00\xb5\x29\x08\x20\xce\x30\x97\x0e\x7f\xde\x18\x9e\x14\x0e\x5c\x70\xc7\x83\xee\xd5\x3f\x0e\x2a\xc7\xec\xae\x4f\x27\xdb\x81\xd1\x5b\x86\x46\xfa\xa9\xc5\xa3\xae\x2b\x7f\x47\xcd\x58\x0d\x77\x07\xb0\x02\x49\x9b\x4c\xfe\xb8\xc5\x91\xaf\xdf\x1c\xc6\x2a\xf2\x59\x5c\x18\x4a\xbc\xf0\xb2\x62\x3a\x1b\xae\x60\xaf\x70\x26\xb2\x8d\x05\x40\xb4\x15\x26\xe3\x02\x0f\x81\xb8\x94\xeb\x3f\xe3\x1b\x72\xb2\x1a\x32\x60\xda\xe3\x21\x0c\x4c\xe4\xfd\x69\xe2\xe5\xea\x0c\x86\x32\xa5\x83\x26\x2a\x12\xb3\xa8\xb1\x6c\x9c\x12\x06\xad\x73\x02\x30\x37\xcf\x30\x65\x3c\xb8\x0a\xa7\xdf\x83\x14\xb0\xf5\xbc\x6e\x9d\x5f\xa0\x0b\x00\x9d\x55\x52\xd8\x3b\x79\x70\xb5\xbc\x4b\x99\x84\xf6\x9d\x1c\xca\x9c\xe4\xcb\x74\xdd\xd2\xd8\x79\xd3\x73\x12\xa0\xe1\x59\xd7\xa6\xaf\xb7\x7a\xc5\x85\xe6\xb4\x59\xc5\x51\x30\x4e\x1e\xeb\xfb\xca\xb4\x3a\x10\xb5\x05\x92\x4e\x03\xea\x33\x2f\x5d\x02\x0a\x55\xc7\xaa\x68\x3c\x54\x1d\xcf\x77\x90\xa2\x40\xaf\x07\x9b\xab\xa9\x40\x96\xb4\x60\x60\xfd\x7a\xfe\x90\x56\xca\x99\xe6\x88\xdf\x28\x0a\x9b\xe8\xc8\xc7\x3e\x6e\x6f\xb0\x52\xa3\x3e\xb3\x32\x8a\x7f\x60\x25\x42\xfe\x28\x0c\x89\x0e\x3c\xca\xf2\x2c\x7f\x34\xf8\x7b\x5e\x5b\xa7\x84\xb4\x72\xb1\xe1\xa9\x93\x47\xa9\xe0\xd2\x40\x85\x8d\x12\x77\xa5\xc6\xb3\x49\x38\x3f\xe4\xfd\x55\xcf\x92\xe6\x9f\xaa\xd3\x26\xb8\xd6\xdb\x46\x23\x30\x26\x22\x1e\xe6\xd0\xa1\xc4\x24\x65\x33\xc4\xa0\xe5\xbd\x17\x2e\xb8\x93\x6a\x9c\x0d\x30\x06\x65\x38\xe3\xeb\x4a\xd5\xcb\x98\x77\xfd\x86\x1b\x48\x2b\x30\x15\x0a\x06\x10\x41\x61\x64\x7e\x01\xd0\x04\xd9\x97\x40\x3e\xe0\x67\x26\xcb\x97\xe2\xe2\x5f\x18\xc6\x68\xee\xe4\xc5\xbf\x72\x52\x98\x03\x18\x9e\xe6\xa7\xae\xc2\x38\xd5\x90\x6e\xa5\xae\x10\x72\x2c\x9a\x61\xa7\x8a\xea\x52\xaf\x33\xea\xac\x75\x40\x6b\x1a\x60\xbe\xfb\xaa\xd4\x84\x76\xd9\xff\x88\x7f\xd2\x83\xeb\x16\x55\xbc\xc0\x7c\xf7\x53\x33\x14\x36\xdb\x5b\x3b\x13\x03\x2f\xf9\xc3\xd6\x96\x38\x0e\x9f\x5a\xbf\x50\xd3\x55\x6f\xda\x0d\xf0\xb5\x38\x97\xa7\x37\xac\x7a\x3b\x87\xc2\xa8\x32\xb0\xc7\x27\x3e\xa9\xfc\x54\xa7\x67\xf1\xa8\x12\xbf\x01\x64\xbf\x75\x21\x63\x0b\x81\xb9\xdd\x93\x0d\x92\xee\x2c\xa2\x8e\x32\x03\xb7\x7b\xc0\x82\xce\xb3\x7d\x55\xed\xbc\xb7\x1d\xf0\xb7\x92\x36\x78\x9a\x25\xd4\x18\xcb\xb9\x55\x44\xe2\xce\xf3\x3b\xbd\xeb\x27\xa3\xf7\x90\x9c\x1f\x49\x8f\x47\x13\x5a\xe9\x03\x3a\xdf\x25\x0a\xd4\xf6\x57\x53\x61\xe4\xcf\xcc\x9b\xcf\x4b\x90\xc3\xad\x47\xa3\x44\x22\x97\xa2\x23\xcc\xa8\x43\xd7\x20\x5e\xd0\x8a\x9b\x87\x16\x0a\x6d\x01\xb4\x6a\x7d\x1c\x84\x4e\x8d\x1f\x18\xf6\x18\x68\x2b\xfb\x22\x95\x5f\x39\x5b\x2a\x57\x90\xa5\x1a\x69\x64\x99\xd9\xe7\x1a\x50\x1f\x3f\xa5\x46\xde\x9b\x10\xae\x47\xbc\xee\x42\xba\x7f\x86\x9f\xb9\xce\x4e\xd7\xc6\x45\x33\x26\xc0\x34\xcf\x05\xd9\xf1\xe3\xc2\x00\x70\x1b\xa7\x52\xda\xbb\xd8\x68\x52\x1c\x3d\x8f\x80\x67\x2d\x42\xf6\xcf\x45\x64\xf0\x8c\xd7\xb3\x90\xe6\xd4\x9d\xd9\x00\x90\xaf\xdb\x84\x48\x6f\xfc\xaa\x4e\x84\xd8\x86\x82\x74\x4d\xc0\xa8\x78\xfa\xa7\xcd\x44\x0a\x8b\x27\x67\x10\x90\x20\x81\xf4\xdc\x84\x17\x46\x19\xa6\x6e\xa3\xa3\x71\xf9\x55\x05\x40\x0d\x99\xfa\x99\x90\x17\x71\x0c\x8e\x27\x14\xbe\x60\x94\x9d\x46\x13\x10\xf7\xd4\x3a\x0d\xc1\x23\x51\x6d\x77\xd3\x62\x21\x3f\x9f\x75\xa5\xa1\xc3\x93\xaf\xfc\x49\xea\x15\x1d\x46\xa8\x1f\xfa\xd2\x39\xf2\x8c\x07\xf6\x5f\x59\xea\x07\x7d\x9a\x4d\x9c\x75\x2d\xe4\x9b\x9e\xf3\x6b\xe6\x0d\x11\x2d\x79\x5f\x58\x8b\x00\xef\x6e\x77\x30\xde\xa6\x5e\x10\x16\xda\x0d\xd4\x62\x37\x0e\x0b\xa5\xc6\x60\x00\x1e\x45\x7c\x08\xb4\x36\xda\x29\x03\xb6\x29\x06\x93\x20\x84\x72\x8c\x81\x67\x1c\xbf\xb0\x79\xbb\x29"}, +{{0x27,0x2d,0x64,0xde,0x50,0xb1,0x31,0x2b,0xee,0x23,0xd7,0xf4,0xce,0xa5,0x08,0xa8,0xfc,0xcf,0x3e,0x9b,0x32,0x4e,0x97,0xb1,0xc8,0xe7,0x25,0x02,0xf6,0x1f,0xbf,0x45,},{0x33,0x49,0x8c,0x3b,0x71,0x2a,0xb9,0xc0,0x1e,0xc7,0x6b,0x2e,0xfe,0x2b,0x83,0xad,0xd1,0xe1,0xf2,0xb5,0xeb,0x78,0xf2,0x16,0x92,0x32,0x34,0x51,0x82,0x0c,0xbe,0x10,},{0x33,0x81,0x4c,0x6e,0xf3,0x75,0xab,0x96,0x37,0x69,0xb2,0xde,0x4a,0x25,0xe7,0x02,0x0f,0xcd,0x97,0xf7,0x8f,0x8f,0xc9,0x34,0x55,0xc4,0xb1,0xc2,0xbd,0x45,0xd4,0xb0,0x1e,0x19,0x29,0x00,0xe3,0x12,0x22,0x65,0xfc,0x55,0x2c,0xd5,0xc5,0xf0,0x0e,0x93,0x1e,0x3a,0x18,0x3c,0xca,0x5b,0xa0,0x80,0x2d,0xaf,0xde,0xbb,0x79,0xeb,0xeb,0x03,},"\xd6\x26\x0d\x7e\xec\x5d\x43\x62\x08\xe7\xe7\x37\x65\x5e\x09\x71\x81\x42\x70\x19\x44\x05\xe3\x6e\x39\xf8\xf1\x7b\x64\x9f\xbc\x16\xc0\xf3\xd7\xf2\xbe\xf5\xeb\xc0\x2b\xb1\xc4\xdf\x48\xe8\x47\x0a\x3e\xae\x8a\x3c\xca\xf6\x40\xab\xcc\x09\x4a\xa9\x11\x50\xff\x1a\x8c\xf1\x16\x96\x93\xeb\xf5\xac\x00\x34\xb9\xb9\x19\xec\xf1\x7d\xb7\x91\xdf\xe5\xfe\xdc\x90\x91\x8b\x23\xe5\x4e\x90\x04\xa1\xae\x77\x1c\x21\x3e\xd7\xed\x73\x34\x43\x4e\x5b\xc0\x2c\x0d\xda\x2b\xd1\xa8\x76\xfb\x82\x4a\x19\x7b\xc9\x96\x13\xb1\x40\x9e\x70\x52\x31\x0b\x08\x20\xda\x71\x44\x69\x29\xae\x7c\xfd\x3a\xfb\xa0\x42\xde\x54\x57\x8a\x5b\xfd\x94\xc1\x54\x43\x91\xa3\xd9\xac\xbd\x56\x63\xef\x65\xc6\x92\x0d\x78\x51\x6d\xec\x1c\xd5\x5f\x6e\xb7\x29\x0b\xa0\xaa\xf9\xa1\x71\x65\x82\x00\xb2\x4a\x47\xa0\x71\xb9\x6f\xea\x03\xc6\xca\x7e\xd0\xd6\xfe\x67\x5d\xd6\x37\x61\x83\x3d\x75\xbc\x5e\x58\xa9\x58\x58\x2d\xb0\x2a\x60\xc6\xce\x0a\x63\xf4\x2b\xa8\x37\xae\x77\xc1\x7a\x32\x70\x5f\xd9\xca\xfa\x58\x7b\x55\x5d\xd4\x61\x98\x51\x07\x97\x94\xe2\x4e\xb4\x46\x08\x83\x5a\x6f\x48\x24\x92\x0d\x57\x7a\x27\x03\x96\xc9\x57\x3b\xc7\xd8\x2f\xe2\xaa\x04\x65\x95\x66\x13\xa2\xc5\x08\xcf\x24\x32\x33\x7a\x36\x5e\x6c\x98\x4c\xba\x91\x7f\x0c\xf8\x42\xaf\x12\x2d\xc8\x9d\xea\x95\x8d\x41\x8c\xae\x44\xa6\xe4\xed\x26\x3a\x41\x5f\xf9\x94\xa5\xff\xb2\xff\x13\x91\x3d\xf2\x14\xbb\xfe\x90\xa3\x4b\x24\x7e\x71\xab\x73\xf7\xff\x00\x4c\x23\xac\xfd\x90\xc7\x67\x61\x1a\xa5\x58\x14\xc6\x69\x64\x16\x8e\x56\x8b\xa7\x5b\xf3\x49\x03\x59\x7c\xdc\xac\x78\xc2\x4b\xb9\xf1\x4f\x5c\x86\xa5\x1f\x36\x4f\x9a\xb4\x1e\x46\x4a\xee\x64\xfa\x50\xa1\xc1\x59\xcb\xd8\x50\x83\x2c\x50\x4a\xb4\x2a\x58\x4a\x96\xd5\xae\xe0\x82\xd8\x2c\x1e\xdd\xa1\x93\x38\x16\x0b\x8d\xcf\xa3\x41\x9b\x3a\xf6\x4d\x9c\xfb\x10\x4f\x98\xf9\xd3\x5e\x53\x94\xe2\x32\x28\xe2\x75\xc8\x7d\xb5\x0c\xa8\x67\x54\x0b\x88\x0c\x7a\xf2\x9f\xbf\x53\x42\x94\x58\x1c\x22\x24\x0b\xcd\x4d\x7d\x2c\x20\xff\xc3\x67\x33\xad\xa2\x76\x53\xd3\xae\x1a\x8c\x22\x03\xea\xc6\x26\xe2\xe9\xbb\x4b\x52\xce\x52\x3e\x5a\xdb\x3b\x2c\x10\xdc\xf7\x8c\x2a\x1e\x62\x6a\x16\xeb\xfa\x1b\xdb\x8c\x16\x14\x93\xa5\xaa\xa2\xd8\x4b\xfa\xa0\xf2\x02\x7f\xfe\x4e\x9e\xae\xb3\x32\xeb\xda\x7c\xbb\xb6\x77\x76\x9d\x78\x51\x7a\xdf\x72\xf8\x23\xa7\xf8\x44\x16\x5a\x07\x98\x78\xd2\x58\xfd\x95\x22\x5c\x21\x17\x78\x37\xe6\x9c\x19\x68\x5a\x05\x1c\xa9\x2b\x12\x0b\x7d\x86\xd7\x85\x95\x47\x1f\xfc\x42\xa5\xe6\xe6\x43\x1b\xe7\xb6\x4f\x80\x76\x45\x8b\xac\xd6\xc7\x29\x03\xcc\x34\xfc\x63\xa4\x0c\xf3\xdf\x00\xef\xf9\xd6\xee\x9a\x8f\x39\xd2\x5e\xad\x81\xa8\x12\x88\x88\xb0\xa1\xac\x0e\x5e\x3a\xd9\x27\x71\x2c\x14\x14\x6a\xdf\x82\x87\x70\xff\x95\x87\x09\xeb\x19\x28\x8e\x77\xbb\x70\x73\x48\x81\xe9\xe0\x16\xcd\x29\xe7\xd0\x89\x93\x41\xff\x6b\x29\x7a\xc7\x96\xbb\xde\x48\x6e\xc3\x59\x49\xf6\xa3\x2b\x2c\xa6\x47\x38\x59\x15\xec\xba\x3b\x9f\x02\x25\x08\x71\x45\xc1\x8d\x65\x59\xd3\xa3\x1d\x6f\x22\xfc\x49\xf8\xa6\x31\x5f\x1d\x32\xab\xee\xb7\xcf\x2c\x2c\x77\x6e\xa7\x35\x0f\xd5\xeb\xc0\xe0\xf2\x65\xba\xcc\xc2\x69\x7a\x7c\x8c\xa4\x0c\x13\x5f\x6c\xfc\xb0\xb5\x8a\x61\x43\x19\x60\xff\xa9\x06\x57\x09\xa9\x61\xa6\x33\xd5\x70\xb7\x3f\xb4\x49\x1d\xe5\x2a\xd0\xd7\xb2\x04\xb6\xe9\x97\xb0\x37\xed\xe3\xf7\xec\xa8\x20\xa7\xcd\xb2\xc6\x9a\xc2\x91\x48\xbe\x35\x23\x50\x8a\xe7\xe4\xc3\xd1\xa7\x17\xf5\x5a\x82\x1d\x14\xc3\xb6\x4f\x08\xca\x9a\xe4\x96\x13\xb1\x15\x77\x3e\xf6\x18\xd3\x21\xc9\x08\xbd\x21\x56\x71\x7a\x43\x4e\x50\x89\xa5\x94\x8c\x04\x5c\x8d\xa8\xa4\xbd\x86\xed\x5f\xab\xc6\xb1\x34\x66\xe6\xde\xda\x58\x32\x07\xd2\xad\xa2\xb2\xab\x9c\xb1\x54\x3d\xf7\xa3\x73\x4d\xfb\xc6\xfc\x42\x81\x06\xd4\x84\x47\x24\xa1\x3d\xf4\x2f\xaa\xb1\x8c\xa8\x9d\xb2\x0a\xc9\xbc\x27\xb8\x53\x94\x66\x7c\x5a\x27\x79\xca\x63\xed\x7a\xc2\xb7\xc0\xd4\x12\x23\x91\xee\x46\x02\xd6\x1e\xa0\x38\x17\x64\xfb\x72\xdc\xc2\x24\xe6\x5e\xae\x2b\xc4\x50\x6b\x0f\x09\xe2\x32\x05\xd0\xbb\x21\xc7\x7d\x82\x87\xc1\x65\xe0\xb4\x2c\x55\x15\x79\x77\x8a\xcb\x72\x58\xa2\x47\x9d\x7c\xf2\x5b\x90\x2e\x8d\x0d\xa4\x29\xbd\xe3\x6b\x45\x90\xda\xe9\x6f\x52\x54\x81\xac\x83\x78"}, +{{0x0c,0x9f,0xe5,0x59,0xad,0x1e,0xd3,0xba,0x16,0x4d,0xac,0xea,0xcb,0x02,0x35,0x67,0xb2,0x43,0x03,0x20,0xb6,0x71,0x5d,0xe7,0x32,0xa0,0x3c,0x59,0xc7,0x30,0x31,0x30,},{0xe7,0x0f,0xc4,0x66,0xfb,0x2a,0xcd,0x74,0xe0,0x99,0xc3,0x6e,0x2c,0x22,0xfa,0x51,0x29,0x0b,0xdd,0xe9,0x6d,0xf9,0xc3,0x1b,0x6d,0xfb,0xfd,0xc2,0xe2,0xc1,0x4a,0x40,},{0x6c,0xd8,0xae,0xd9,0x7d,0x9c,0x62,0xd5,0xfd,0xae,0x59,0x7d,0x06,0x1c,0x0c,0x2b,0xc3,0x7e,0x42,0xdf,0x06,0xb8,0x32,0x7a,0x46,0x8f,0x92,0xb3,0xf4,0x38,0xa1,0xe6,0xb6,0xb1,0xef,0x2b,0xe7,0x85,0x49,0xa2,0x89,0xfd,0x3f,0xc1,0xa6,0x29,0x9e,0x5a,0x33,0xd5,0x39,0x6c,0xb4,0xfa,0xc1,0xe8,0xe9,0x98,0x2f,0x0c,0xb3,0xd2,0x0d,0x07,},"\x26\xeb\xc6\x48\xcf\x8c\x79\x65\xec\x6e\xbe\x96\x5d\x9c\x79\x2b\xed\x90\x65\x5a\xd4\x40\x18\x3c\x6d\x70\xea\x64\x67\xbb\x8e\x6f\x04\xec\x84\x3f\x33\x31\x56\x91\x7b\xf4\xc5\x1d\x0e\xd0\xf2\x8b\x7c\xd3\x1b\xc1\x2c\xf8\x40\x68\x6b\x82\xb0\xc2\xc3\x50\xbb\xda\xc8\x05\x33\x37\x25\xd6\xb6\x9c\x2a\xb7\xf3\x4e\xe5\x93\xfa\x1c\xcc\xed\xf3\xf0\x64\x2a\x68\x8f\xcc\x1c\xd9\x8b\x09\x87\xd0\x1f\x71\x3a\x2f\xa6\x41\x6c\x96\x19\x21\xde\x0c\xc2\xc9\xec\x7a\x55\x58\x55\xe7\xfc\xd4\xc7\xdd\xaa\x14\xfd\x91\xec\xb0\x42\x24\xe1\x76\x1b\x7d\x6b\x35\xf4\xaa\x56\x18\xa5\x00\xca\x00\xd1\xca\x24\x51\xb5\xd3\x68\xaf\xde\x3a\x40\x7e\x78\x31\x35\xf3\x90\x19\xa5\xb9\x84\xe8\x2a\xc2\x79\xc0\x5e\x48\xc2\x95\xeb\xd1\x56\x38\x21\xa0\x74\x3c\x52\x24\x6b\x5d\x2b\x20\x34\xe3\xae\xb6\xce\x7c\x5c\xf9\x19\xe7\x4a\x9c\x7b\xbc\x9e\x25\xda\x30\x43\x0e\xb1\x6e\xcf\x38\x37\xeb\x38\xa0\xf5\x59\x79\x2a\x72\x98\x90\xba\x83\x10\x26\x0f\x8a\xeb\x9b\x5a\xf0\x0e\xb6\x33\xc1\x2d\xee\x02\x26\x28\xba\x41\x8d\x75\xcf\x18\xde\x2f\x2e\x65\xe4\x9b\x1a\x69\x68\x4d\x61\x27\xef\x48\x1c\xa8\x61\xec\xbc\xe3\xbe\x86\x49\x7e\x65\xdf\x4c\x5f\xcd\x08\x17\xc9\x71\x6b\x59\xf2\xa2\x63\xd5\xe9\xeb\x60\x68\x39\xf8\x5c\x5a\x36\x58\x37\xb0\xfb\xe2\xc4\x27\x4d\x66\xcb\x2c\x65\xed\x36\x5f\xab\xf5\x8f\x15\xbe\x52\xb5\x1c\xb6\x01\x18\xca\x4f\x73\x0d\x44\x73\x59\xf7\xef\x34\x6b\x75\x02\x17\xd4\x7b\x2e\x79\xc8\x6c\x0c\x62\x81\x6a\x0c\x7c\x18\xa2\xce\x2b\x68\x8e\x0c\xce\x0d\x75\x23\x21\xe7\x9b\x42\x38\x57\xda\xc5\x9f\x8f\xbe\xb0\x94\x11\xe7\x16\x69\xef\x9a\x26\x43\xf2\xe9\x9f\x38\x7a\xc1\x83\xe0\xb0\xac\x72\xc5\x9a\x0c\x3c\x18\xc0\xde\x8b\x01\x08\x78\x07\x4a\xcc\x1a\x2b\x39\xf9\xdf\x99\xd9\xf8\xf8\xb5\x2f\xef\xe4\x94\x3c\x52\x5f\xd4\xd0\x6a\xd8\x78\xe4\x66\x08\xab\xf2\x7a\x54\xbc\x50\x06\xf6\x47\xdb\x72\x48\x51\xdb\x7c\x45\x78\xae\x66\x58\x3d\xc4\xbb\x51\x8e\xf0\x28\x89\x03\x47\xe8\xfc\xe0\x92\x7d\x7d\x9a\xf3\xab\x5d\x0d\x2d\x20\x2a\x40\x26\xaa\x2e\xa7\x48\x79\x62\x67\x6a\x60\x32\x98\xe7\xd2\xe7\xb9\x09\x21\xee\x1b\x52\x80\x6d\x71\xa7\x64\xe0\x3e\x25\xdd\xd6\x84\x8f\x61\xd4\x6f\xad\x3d\x00\x8e\x10\xee\x5c\xd5\xa3\x39\x0f\x9d\x15\x8a\x44\x37\xef\x61\x5f\xc9\x0a\xc5\xbf\x3a\x9d\x68\x2e\x12\xc3\x39\x8a\xc7\x76\x80\xd2\x2c\xd1\xa6\xa5\x6e\xc3\xb2\x5c\xed\xe8\x67\xed\xd3\x83\x15\x9c\x61\x64\xd6\x3e\x9c\xd1\xc9\x56\xac\x72\x35\xff\xfa\xe9\x36\x16\x6c\xcd\x35\x89\x8e\x29\xc9\xb4\xca\x4e\x29\x25\xda\x32\x3b\x6f\xbf\x67\xcf\xd5\x96\xc8\x8a\x1a\x35\xa8\x35\x98\x51\xdd\xcb\xa8\xf6\x13\x4a\x9f\xaa\x24\x4d\xcb\x47\xe6\x91\x27\x6e\xe6\x25\xcc\x20\xad\xce\xc2\x1c\xbe\x77\xa3\xac\xb9\xba\x72\xf0\xc9\xd3\xda\x7e\x9c\xd5\xbe\x3b\x95\x99\x0b\xa5\x4a\x9f\x31\xaf\x17\x1f\x95\xae\xea\xd3\x33\x1c\xb1\x88\xa5\xb2\xc6\xf5\x39\xac\xb4\x8b\x98\xb3\xf7\x34\x1f\x60\x25\x1c\xb6\x04\x29\xcc\xd9\xcf\x32\xf0\x09\x20\x5f\x27\x53\xfb\xbb\x26\xaa\x53\x17\x43\x42\xad\x18\x4d\xab\x68\x70\xc0\xfb\x52\x93\x01\x19\xd9\xf9\x7d\x84\x89\xa6\x00\x76\xaa\xdb\x2e\x96\x05\x4a\xc7\xcb\x7f\x84\xe1\x3c\x75\xbb\xf9\xe4\xd9\x24\xd2\x27\x2a\xfe\xf0\x87\x19\x15\xe2\x43\xce\x66\xfc\x2a\x88\x88\x51\x35\x35\xb1\x0b\xb4\x07\x9c\x80\x6b\xd9\x49\x28\x1e\x28\x28\x35\x23\xd0\xd2\x10\xb3\x1e\xf6\x2a\x95\xdc\xae\x0c\xd2\x52\x90\xc7\xed\xf2\xc2\x4b\x43\x28\x22\xde\xbe\x34\x7f\x1c\xae\x94\x5f\x57\x28\xc7\x1b\x54\x03\xef\x14\xe7\x2c\x3d\x83\x42\xe1\x98\xb3\x62\xee\x20\xf8\x09\xe4\x6a\xca\x01\x5f\x35\x47\x7f\xf8\x9a\xc4\xb3\x7e\x66\x15\x85\x6f\x7e\xa2\x51\xfb\xfe\x13\xf9\x06\x52\x59\xb0\x94\x6a\xae\xf2\x49\x43\x27\x0a\x85\x4d\xe8\x89\x78\x00\x33\xd6\x3d\xda\x54\x47\x99\x8a\x3e\xd7\xe5\x06\xae\xb5\x1e\xa3\x7b\x68\x1a\xc3\x07\x67\x97\xac\xdb\xfc\xc2\x78\x83\x63\x0a\xdb\x72\x26\x0a\x46\xaf\x0a\x60\xd5\x3f\x66\x54\x56\x6e\x20\xd6\x08\x8c\xd4\x8e\x23\xb2\x8d\x81\xf0\xee\xd2\x05\xb9\x2a\xaf\xd9\x61\x64\xd6\xd3\xca\x3f\xc8\xb1\x71\x80\x4e\xe9\xfc\xe7\xab\xae\xd2\xea\x4d\xdf\x9c\xb2\xb3\xae\x73\xa7\x0e\xd6\x3d\xe4\x5e\x14\x10\x14\x28\xd0\xa7\xa2\x26\xdb\x39\xab\x6c\xd0\x43\x74\x08\x0e\x69\x83\xf0\x18\xce\x93\xda\x4c\x89\xac"}, +{{0x15,0xd7,0x5a,0xd8,0xe4,0xaf,0xb1,0x26,0x34,0xcc,0x8e,0x60,0x0f,0x1a,0x42,0x67,0xef,0x95,0x84,0xf4,0xc4,0xac,0x44,0xff,0xfe,0x4b,0x9f,0xcb,0x88,0x5c,0x9d,0x2a,},{0x09,0xd1,0x26,0xf0,0x17,0xe0,0x16,0x97,0x74,0xe8,0xc3,0x7a,0xb3,0x79,0x26,0x3a,0x80,0x75,0x74,0x61,0x27,0xc2,0xd1,0x1e,0xcb,0x0e,0x4c,0xb4,0x54,0x70,0x9f,0xf1,},{0xa8,0xf2,0xf4,0xb9,0xe2,0x07,0x2c,0xa9,0xfa,0xde,0x37,0xfd,0xd6,0x2d,0x8d,0x02,0x42,0xfd,0x4d,0xaa,0x09,0xfd,0x85,0x6e,0x75,0xf4,0xe3,0x43,0xc7,0x26,0x0e,0xa6,0x77,0xf7,0x53,0xa6,0x27,0xae,0xd0,0x8c,0xb9,0x6c,0x44,0x4e,0x29,0xbd,0xb5,0xb5,0x38,0x5d,0x43,0x84,0x3b,0xbe,0x79,0xa3,0xdd,0xa3,0x6e,0x1e,0x11,0x01,0xc5,0x0f,},"\xd1\xce\xa2\xb7\xe9\xaf\xc1\xf0\xfa\xb8\x90\xd2\x70\x0a\x5a\xe4\x1e\x15\xe7\xd3\x4d\x3b\xf1\x9d\x0f\x34\xd9\xf9\xf0\xab\x98\x12\xdc\x7c\x2a\x8d\xc4\x4c\x8e\xe7\xf3\x78\x87\x61\xec\xd9\x88\xee\x72\xc7\x36\xb6\x2a\x7c\xac\x3c\xc9\xb7\x38\xe9\x38\xdf\x77\x87\x37\x7e\xb9\xff\xd1\x20\xd4\xff\x58\xcf\x1c\x06\x75\x63\x3f\x7e\x83\xc4\xb1\x15\x54\x8f\x14\xd2\xf7\x0c\x6d\x48\x22\x11\x44\x3a\x84\x99\x59\x95\x58\xc1\x42\x77\x98\x0f\xa4\x2a\x78\x42\x79\x07\xf7\x3a\x41\xf5\xf6\x69\x3b\x2f\x75\xfe\x5e\x7a\x6f\xf0\xa6\xc3\xa4\xe2\xed\x1d\x0d\x96\x8d\x5c\xc9\xd6\xf1\x3d\x41\xc3\xd2\x91\x39\x6a\xe7\xe4\x34\xe6\x64\xb2\xff\x24\x3e\x7f\x6d\x88\x01\x02\x10\x07\x8c\x39\xb5\xa5\x76\xca\xf4\x09\xbb\x47\x11\xb3\xee\xfc\x48\x6b\x67\xb7\xff\xea\xe0\xcb\xac\x6a\x0f\xbd\xf5\x34\x3f\xb2\xae\x4e\x05\x7e\xdc\x8c\x9d\x2e\xd3\x1e\xae\x9e\xc8\x3d\x2b\xed\xd2\x19\xeb\x98\x9b\x2d\x44\x19\x61\x8c\x2d\x3c\xe4\x49\x0e\x35\xfb\xca\xd4\x32\xb0\x12\x47\x95\xf9\xc5\xcb\xdc\x1e\xb0\xc3\x07\x2b\x4a\xa8\x01\xd2\x6f\xbc\xc7\xb0\x7b\x82\x57\xf5\xfe\x47\xac\xd9\xbc\x58\x7b\x56\x57\xcf\x07\xca\x54\x5b\xb5\x68\xc9\xe4\xe7\x3c\xdd\xf6\x25\x4e\x22\xf7\x8a\xb2\xf8\x06\x45\x19\xf8\xab\xfd\x16\xfc\xfa\x90\xf8\x76\x87\xdb\x0c\x42\x09\xbe\x2c\x6c\x79\xa5\x52\x1f\x44\x18\x96\x78\xd9\x32\xc5\x45\x85\x70\x0a\x24\x37\x70\x2e\x56\xaa\xb5\x88\xa1\x7c\xb2\xcc\x94\xc0\x0e\x87\x57\x0e\xf3\xac\x51\x33\xd7\x53\x03\x8a\xa4\x65\x10\xa2\x60\xc1\xfe\x80\x47\x9b\xc0\x2e\xed\x9a\x8d\x1d\xe9\x93\x54\xac\x26\x48\xb4\x8b\x96\xab\x1b\x80\xcc\xa6\xca\xe1\x87\x7f\x37\xd7\x04\x28\xbb\x50\x85\x0e\x03\x08\xdb\x0b\x42\x30\x87\xbf\x7d\xde\x27\x9e\x09\x67\x66\xf2\xab\x3a\xb2\x38\x5b\x04\x64\xa5\xbe\xd7\xbb\xd8\xd4\x57\xe9\x35\xe2\x00\xaa\xaa\x8d\x95\x15\x70\xe0\x53\x07\x6d\xb1\x8a\x6a\x62\xf7\x2b\x31\x95\x79\x88\x4a\x08\x26\xba\x2b\x43\x63\x71\xdd\x21\x8b\x01\xa0\xc5\xe5\x8d\x0c\xd5\xff\x98\x25\xe4\x46\x6f\xe9\x66\xdf\x05\xcc\x31\xc8\x03\xe5\x21\x21\x83\xdd\xf2\x9c\xef\x7f\xb9\x16\x48\xa4\xf8\xee\x19\xfd\x5f\x8d\xbd\x8a\x56\xbe\x7a\xbf\x33\x65\x9a\x92\x24\xa1\xe2\x7a\x10\x24\xef\xfd\xfb\x88\xe8\x80\x61\x48\xd0\xd1\x78\x09\x06\xaf\x1e\xbe\x3e\x5f\x14\x36\x31\x90\xd8\x8c\xc6\xe5\x08\x94\x44\xf1\x25\xd0\x63\x15\x5d\xcf\x86\xca\x92\x63\xf2\xf5\xf1\x83\xc2\x69\x74\xfe\x00\x0b\x93\x42\xd2\x4c\x78\x1e\x20\x58\x28\x7c\xb6\xf3\xf1\xe3\x27\x0c\x22\xb7\x70\x7b\x83\x23\xa5\xcc\x8d\xb8\x1a\xa9\x06\xbb\x59\xd6\x96\xcb\x97\xcc\x74\xe3\x59\x59\x5f\xfb\x83\x73\xca\xd3\x71\x0e\xa0\x9e\xa9\x74\x4c\x20\xe9\xa1\x2e\x05\xbe\x5a\x95\xf0\x85\xac\x56\x16\x78\xd7\xda\x43\x2e\x4c\x7c\xb5\x3e\x12\x71\xdf\x5c\xd5\xa3\x39\xd2\xd7\x52\x0f\x1c\x18\x48\xd1\x50\x71\xd8\xc6\x98\x46\xb2\x3c\x5d\x24\x32\xc7\x38\x90\xf2\xed\xed\x37\xc3\xd2\x96\x4a\x4b\x5b\x55\x22\x58\x88\xe8\x92\xf5\x26\xd1\xca\xc3\x1e\xac\x35\x6f\x36\x1c\x2b\xf3\x36\xc4\x62\xd6\x0c\x82\xe8\x2b\x61\x6f\x2a\x51\x9c\x2f\x67\xbf\x01\x29\x03\x69\xbe\x9b\x55\xe9\xf5\xc8\xce\xc4\xf2\xe1\xb2\xab\x30\x25\x06\xc9\x03\xdc\x3e\x7b\x9c\x97\x81\x41\xdc\x90\x4b\x01\xb1\xc2\x3d\x25\x00\x43\x99\xbf\x8b\x73\xd6\x9c\xd5\x39\xc7\x9a\xf5\xe9\xa0\xa5\x11\xec\xa2\x21\x07\x8a\x1f\xf7\xb0\xf6\x04\xae\xa8\x42\x46\xc3\xcb\x32\xdb\x93\x81\xbe\x12\x17\x67\xe0\x97\xbe\xa5\x17\xbf\xcd\x82\xdf\xe9\x21\x37\x98\x40\xef\xb4\xb6\xf0\x2a\x48\xec\xda\xf1\x2d\x2c\xd3\x89\x30\xd4\x47\x3a\xdf\x97\xcd\x71\xdc\x4e\xa1\x03\x82\xf4\xf5\xd1\xdd\x75\x62\xcd\x4b\xf5\x11\x59\x32\xf6\xc4\x70\x0a\xa8\xfe\x8d\xec\xa9\xd5\xe7\x27\x79\x02\xb8\xf8\x86\x52\x97\x65\xdb\x24\x86\x07\x4b\x23\xa1\x9f\xd4\xb0\x43\x56\xbf\xa6\x22\x6c\x82\xba\xf6\x9a\x08\x7d\x9c\xa1\x88\x23\xf8\xe3\xe6\x83\x08\xe1\x6b\x80\x4c\x36\x3d\xf5\xb6\x30\x7e\x76\x24\x0d\xb1\xed\x84\x1b\x61\x2d\x65\x54\x8d\xdf\xbe\x83\x67\xda\x60\x77\x2c\x6a\xff\x55\x4d\xc8\x5d\x04\x19\x48\x34\x5e\x56\x7d\xa9\x33\x31\x51\x85\x8f\xdf\x69\x93\x27\x39\x25\xbf\xdc\x71\x81\xb5\xf6\x46\xd0\x63\xa8\xc8\xf3\x10\x56\x9b\x0e\xd0\x93\xbd\x9d\xff\x04\xfe\xbf\x0b\x41\xc6\xdc\x55\x16\x9a\x14\xa3\xc8\x62\xe5\x41\x6f\x1e\x58\x2f\xde\xe8\xfe\x87\xdc"}, +{{0xbf,0x3c,0x0c,0xbb,0xbe,0x20,0xbe,0x2a,0xcf,0xaf,0xb2,0x7a,0x36,0x11,0xb4,0x89,0x21,0xa7,0x28,0xab,0x17,0x33,0x4b,0x8a,0xfd,0xee,0x83,0x05,0x17,0x8f,0x61,0x3b,},{0x45,0x00,0xa0,0x3c,0x3a,0x3f,0xc7,0x8a,0xc7,0x9d,0x0c,0x6e,0x03,0xdf,0xc2,0x7c,0xfc,0x36,0x16,0xa4,0x2e,0xd2,0xc8,0xc1,0x87,0x88,0x6d,0x4e,0x6e,0x0c,0x27,0xfd,},{0x8f,0x87,0x03,0xbc,0xf4,0xc0,0x32,0x94,0x17,0x33,0x9e,0xb0,0x26,0xf2,0xb7,0x2d,0x31,0x4d,0x92,0x2e,0x9a,0xcc,0xb5,0xd8,0xbb,0x7e,0xec,0x87,0xe0,0x7e,0x61,0x38,0x55,0x16,0x72,0xa6,0x13,0x2c,0xb4,0xf8,0x75,0x50,0x8e,0xd3,0x29,0x95,0x67,0xb4,0xa7,0x41,0x34,0xd2,0xbd,0xf0,0xd8,0x57,0xf9,0x80,0x86,0x1d,0x18,0xbe,0x7e,0x01,},"\x8f\x30\xba\x2f\x79\x2e\x9a\x97\xf6\xea\xfe\x29\xf9\x76\xa4\x80\x28\xcb\x88\x57\xb5\xc7\x98\xbc\x2b\x61\x68\xc4\x64\x44\xc0\xce\x69\x60\x70\x37\x4c\x5e\x6a\x40\xc3\xd1\x8a\x5d\xc7\x66\x9f\xc4\x1d\xb9\xa8\x1c\xff\x75\x9b\x8c\xa0\x15\x98\x71\xc3\x44\x2e\x8c\x75\x12\x69\x8f\xa4\x47\xb5\x78\x3e\xe0\x1d\x1b\x61\x14\x49\xab\xad\x23\x71\x62\x92\x2b\x02\xd1\xae\xc5\xde\x1d\x66\x6f\x17\xda\x16\x13\x10\x63\x01\xd3\x05\x86\xd1\x16\xe2\xac\x09\x00\x7d\xd7\x1e\x81\x23\xed\xe4\xc5\xa6\xa9\xac\x07\x7f\xe3\xd9\x39\x09\xda\x62\x8e\x86\x58\x70\xa4\xe2\x5c\xb3\x55\x91\x67\x5a\x06\x90\xbe\xc4\xaf\x02\x81\x71\x4f\xe6\x66\x1b\xd5\xc0\x0a\x27\xd7\x9f\x95\x9f\xb4\xd4\xfb\x16\x36\xa6\xa3\x57\x5f\x4f\x01\x47\x06\x63\x89\x9d\x73\x74\x72\xb0\x96\xbe\x4d\xb7\x23\x71\x53\x67\xa4\x1a\x3a\x4c\x13\xf7\x42\xd9\x08\xf4\xd9\x21\xcf\xdd\x15\x6e\x75\x86\x82\x61\xba\x9c\x10\xd8\x58\x74\xca\x2d\x6c\x0c\x9e\x72\x95\xe5\x66\x2b\xd9\x16\xa3\x63\xc7\xa7\x96\xea\xd6\x17\xc4\x25\x1e\x67\x94\xda\x06\xc3\xd0\x8f\x2f\xdc\x38\x86\x94\x4a\x75\x09\xe6\x40\x9c\x90\x6b\x59\x31\x13\xb4\xb1\xf9\x85\x01\x32\x96\x0d\x9f\x3a\x4e\xeb\x73\x86\xfa\x59\x2f\x61\x93\xbe\xab\x8e\x0f\xf0\xf2\x89\x08\xa0\xd5\x48\xdb\x87\xba\xe9\x78\xb0\x5a\xbb\xca\x9b\x3e\x96\xd8\x79\x5b\x88\x07\x7f\x62\x0f\x21\x24\xe3\x15\x90\xeb\x09\x9e\x94\xe0\xe6\xe3\xcd\x62\x0a\xe6\x29\x0f\x3e\x2d\x01\x46\x7e\x5b\xef\x4f\xab\xde\xf7\x9d\x9a\xb9\x23\x9e\x75\x3e\xc4\xfa\x0b\xb1\x10\xff\x1d\x39\x3f\xca\x02\x24\x35\x02\xd7\xe9\x87\x99\x1e\xb7\x6d\x08\xf8\xbe\x7e\xb2\xb1\xee\x00\xc3\xb6\x8b\xbf\x72\xa6\x23\xba\xa1\x5b\xe8\x96\xb3\x21\x5e\xbe\x8a\x82\x31\x31\x09\xfc\x62\x9b\x0c\xce\x64\x91\xf8\x13\xc2\x49\x70\xe4\xff\xe6\x86\x9e\x40\xb4\x6b\x4e\xd2\x29\x86\xd0\x04\x21\x55\x27\x6c\x23\x0d\xe4\xc0\x5d\x67\x85\x52\xf2\xe8\x51\xca\xcf\x5a\x47\x21\x57\xdb\xb1\xa9\x9a\x2b\x42\xff\x40\x37\xf0\xdc\x63\x80\x67\x29\x21\xc9\x09\x20\x6e\x80\x05\x0e\x61\xa6\xb3\x05\x6b\x17\xe3\xae\x83\x50\x09\xb2\x04\x19\xa3\xb9\x84\x6d\x37\x48\x92\xe7\x19\xf1\xb3\x5b\xc1\x25\x7d\xa9\x3c\xcc\x6d\x8f\x8f\xca\xa8\xe6\x09\xa8\xd2\x04\xdf\x10\x8b\xe7\x19\x34\x67\xe7\xf1\x05\x93\x52\x82\xc3\xfe\x66\x70\xa5\x32\x94\x42\xea\x3e\xdd\xa2\x37\x6a\x03\xa1\xcf\xe8\x72\x3a\x90\x9c\x06\x4d\x30\xfe\x9b\xb0\x21\x2c\x33\xaf\xe2\xbe\xa3\x0c\x91\x43\xc0\x01\xda\x01\xc7\xed\x50\x45\x59\xb9\x7f\xe2\xce\xa0\x9b\xeb\x9d\xb5\x19\x00\xdc\x13\x67\x05\x92\x1e\x20\x29\x78\x45\xba\x72\xa9\x7a\xa7\xc9\x53\x81\x45\x71\xbe\x3f\x08\xce\xf9\x68\x04\x5a\x5a\xc3\x40\x04\xf6\x7f\xbf\xa5\x4e\x99\x6b\x31\x1b\xd8\xdc\x52\x7d\x89\xe1\xd4\xf5\x34\x53\xa6\x71\x37\x20\x10\x1c\x45\xa6\x0e\xe3\xa0\x5c\x2e\xe6\x6f\x13\x4b\x5a\xf4\x0e\x4b\x70\xef\x37\xba\x3f\x0a\xfd\xef\xc0\x39\xf3\x42\xc2\x8a\xf9\x19\x82\x51\x38\x1a\x10\x79\xa5\xdd\x03\x5a\x8c\x28\x97\x6c\x6b\x7f\x4d\xb0\x9e\xa3\x83\xa3\xa8\x7f\x0f\x85\x1f\xd3\x31\xae\xa7\xfa\x4b\xfc\xd9\x56\x31\xd6\x52\xfa\x2f\x50\xf1\xc2\x3f\xf2\xbc\x13\x7a\x06\x04\xe3\xd9\xf3\x9c\xcb\x96\x51\x45\xbc\xa4\x8b\x06\xdc\x8a\x81\x75\x47\xb6\x25\xef\xfa\x79\x6d\x00\x0c\x37\x74\xba\xd1\x98\xdb\x12\x41\xbe\x7a\x2c\x0d\xc4\xa4\x64\x1b\x9a\x8c\xb9\xcb\x8c\x8c\x38\x87\x57\x6f\x52\x72\xc3\x3a\xaf\xfe\x45\x61\x5f\x51\xa9\x6f\xae\x76\xcf\x51\x25\xbc\x69\xad\x0a\x40\x38\x79\x07\x99\xb5\xc2\x62\x44\x21\xa6\x43\x3d\xba\xb3\x9c\xcc\xb0\xb1\x78\x7b\x5b\xce\x28\x95\x94\x48\x9d\x17\xed\xb5\xf9\x31\x03\x74\x80\x7d\x36\xc6\xe6\x73\x47\x26\xbb\x33\x00\x4e\xca\xe8\xbb\x69\x1d\xcd\x38\x76\x01\xf4\xea\x91\x1b\x4b\x90\xeb\xff\x75\x6d\x7d\x8d\x9e\xb4\x22\xcb\xb9\xaa\xf7\xf4\x77\x2e\x0a\x54\x36\x43\x06\x85\xe5\x7b\x69\x74\x54\xe8\x2e\xea\xdc\xe4\xab\xa0\x62\xb7\x76\x82\xcf\x21\x9b\xe1\xfd\x9b\x00\xf1\xcb\x11\x35\xa1\x02\x13\x49\x53\x9a\x4b\x93\xae\x21\x3f\x19\x3d\x29\x32\x73\x8e\xf7\x29\x20\x49\x9b\x7b\xe2\xa8\x1c\x9b\xaa\xed\x17\xc5\x46\x41\xa5\x97\x4d\x27\x22\x32\x41\xe3\xc6\xa0\x95\x22\x6b\xd2\x37\xe0\x59\x1e\x00\x2b\x3a\xf0\x56\x5d\xf3\xe9\x76\x42\x0f\x97\x64\xa0\x9a\xe8\xbf\xa2\x79\x5f\x8f\xad\x7f\xc6\x87\xbd\x2d\xe2\x3d\x14\x88\xf4\x49\xd8"}, +{{0x28,0x7f,0xaf,0xd2,0x13,0x74,0x57,0x2f,0x57,0x81,0x00,0x47,0xd0,0xd9,0x8c,0xb1,0xff,0x3d,0x01,0x20,0xfa,0xa4,0x88,0x61,0x32,0x24,0x57,0x32,0xc1,0xa6,0xab,0x78,},{0xe8,0x25,0x20,0x63,0xf5,0xad,0x7e,0x95,0xbd,0x05,0xc5,0x02,0xa8,0xbc,0x4a,0x17,0x55,0x63,0x60,0x86,0x9b,0x9d,0xe0,0xa3,0xb8,0x58,0x93,0x8e,0x11,0x11,0x76,0x19,},{0x62,0x01,0xe3,0x05,0x91,0xd3,0x6b,0x7b,0x22,0x6e,0x36,0xfd,0xf5,0x64,0x34,0xc4,0x7c,0xd3,0x05,0x18,0x37,0xaf,0x31,0x31,0x3a,0x99,0x17,0xfd,0x02,0xdd,0xed,0x2b,0x5b,0xbb,0x4b,0xbc,0x36,0x8b,0x3b,0xd1,0x5d,0x06,0x20,0x45,0xf1,0x05,0xb6,0xe7,0x34,0x1b,0x15,0x15,0x0d,0x36,0xf9,0x00,0x87,0x59,0x1d,0x83,0x99,0x01,0xb8,0x01,},"\xb3\xc4\x43\xe4\xe5\x89\x9c\x16\xd3\x9e\x81\xb4\xf8\x07\x40\x42\xa9\x04\xa7\x35\x07\x4b\x27\x95\xd9\xac\x06\xb1\x37\x9e\xf7\x61\x8d\x2a\x53\x4b\x6b\xef\x81\x56\x9e\x60\x71\x92\x67\xbf\x29\xcd\x9d\x16\xac\xc9\xa1\x74\xd8\x02\x6b\x14\xb1\x27\xd0\xd2\xd8\xb4\x58\x39\x98\x89\x5a\xd7\xef\x72\xfe\xdc\x53\xb8\xf0\x8a\x22\x50\x10\x0e\x1f\x1f\x0a\xab\x48\xbc\x70\x74\x64\x34\x88\xe6\xb6\x70\xe1\xb0\x72\x7c\x38\x5a\x34\xff\x65\xa0\xd7\xe8\x3b\xa8\x60\x83\xb8\x73\xdf\xf0\x55\x92\x09\xb1\x4b\x2a\xc4\x2b\xf7\xc5\x72\xd0\xc5\x91\x7a\xc4\x2e\x4a\xe4\xda\xe1\xdd\x42\x35\x79\x52\x76\xa0\x76\x13\x2c\xfe\x3e\x0c\x35\x0b\x26\x58\x0f\xbb\x3a\xf8\x17\x77\xb9\x3a\xd9\x5c\xb7\xff\x17\xc2\xd9\x80\xce\x0d\x49\x2f\x6d\x40\xfa\x90\xba\x3f\xca\xa2\x1b\xb6\x87\x35\xee\x1e\xf2\x08\x49\x5e\xbf\x7b\x02\x27\x6f\xfa\x1e\xfc\x08\x16\x58\xbb\x44\xcd\x27\x61\xef\x5e\x3e\x1c\xa6\x0e\xc8\xb5\xd8\x16\xd4\xab\xac\xd0\xbc\xc8\x02\x68\xd8\xf4\xdf\x8b\x3a\x52\x04\x9d\xb0\x15\x7e\x2b\x6e\x81\xac\xd6\xf3\xf2\x89\x47\xc0\x76\x27\x95\x5c\xda\xc9\xea\xa1\xde\x17\xd4\xb9\xda\xa3\x61\xfb\x49\x78\x26\x64\xd7\xd6\xd2\xca\x5c\xec\x6d\x14\x89\x3c\x3e\x80\xb6\xd1\x6d\xaa\xcf\xfc\xc0\xb7\x59\x37\xe8\xbe\xf6\xf9\xe1\x12\xa8\x7f\x4b\x03\x5f\x90\x36\x07\x0a\x2c\xcc\x55\xc2\xaa\xd9\x39\xdf\x67\x4f\x7e\x4e\x12\x68\x5e\x01\x6e\xa0\xe4\x90\x2a\xaa\xaf\xaf\xfe\x38\xdd\xb2\xf9\x0d\x9c\xf7\x85\x37\xf6\x13\x91\x69\x6f\xf0\x33\x0a\xe8\xf7\x9a\x1c\x1e\xd5\xd5\x2b\x4e\xe2\xa6\x2d\x90\xfb\x82\xd9\xa4\x83\x93\xfa\x33\x81\x0b\x40\xd0\x45\x59\x02\xd5\x74\xff\x05\x20\x03\xe0\x16\x0c\x0f\x47\xb5\xe5\x80\xa0\x78\xbc\xee\xf0\x60\x73\xdd\xa8\xb2\xd1\xf1\x04\xa5\x95\xe9\x0b\xb6\xa4\x8e\xdd\xd8\x65\xf1\xca\xe4\xf1\x78\xfe\x22\xe7\x5f\x2f\x61\x24\xa9\xda\x06\x82\x44\x71\x12\xb3\xdb\x5b\xe8\xc4\x24\x72\xb2\x41\xe9\x44\xfd\x23\x70\xc2\xdc\x27\x15\xc0\x5a\x41\xbd\xbc\x89\x0c\x41\xc6\x5f\xb0\x8c\x2f\x59\x31\x74\x39\x1a\xc8\x80\xf3\xcb\x67\xd1\xb7\x4f\xf8\x02\xef\x96\x2a\xfe\xf7\xb9\xf3\xea\x32\x6f\x95\x27\xe7\xfb\xa6\x98\x18\x79\x24\xb6\x4c\xcd\xd0\x86\x62\x48\xc7\x6e\xe6\x4c\x79\x06\x9b\xe0\xa0\x57\xb1\x0a\xe1\x90\xf3\x8f\xf5\xab\xa8\x44\xe3\x93\x31\xcf\x1d\xb1\x3c\x90\x09\x06\xbe\xe0\xd7\xe7\x54\x6e\xf5\x23\x24\xe3\x7c\x59\x06\x75\xf1\x39\xf5\x8f\x57\x3a\x49\x4f\x4a\xe8\x2c\x4e\xc8\x10\x66\xa6\x8e\x2d\x92\x90\x01\x91\xc4\x7d\x30\x62\xf0\xf9\xaa\xed\x19\x11\x37\xcd\xa9\xb8\x3c\xd1\x30\xe8\x26\x29\x60\xe6\x24\x4f\x8f\x6e\xf3\x9f\x15\xa4\xfe\xd1\x3c\xb6\x69\xed\xc1\x9f\x5c\xe1\x62\xce\xb8\xd2\x42\xb9\xad\xdb\xfb\xa8\x77\x2c\xe7\x49\x85\xa5\xf3\x72\x0d\x59\x0a\x92\x0e\x1d\xca\x75\xa8\x79\xb1\xaa\x45\x9f\x74\x62\xff\xf2\xe9\x50\x72\x76\x1b\x20\x92\x54\xfe\x38\xc5\x4d\x83\x3a\x8e\x2c\xb8\xfc\x40\xc5\x98\xf3\xc7\xf7\xd6\xc5\x70\x57\x15\xd0\x30\x8d\xc3\x0e\xaa\x84\x67\x6d\x20\x9d\x7b\x7b\x31\x34\x47\x56\xe6\x9a\x9a\x4c\xb4\xe4\xa2\x51\x81\x7a\x37\x86\xfe\xa6\x72\x8d\xd6\x08\x22\x33\x6b\x45\xae\x5d\x47\xc7\x04\xb4\x5c\x4c\xad\x38\xc1\xe0\x1a\xb9\x3d\x14\x16\x92\xd5\x5d\x12\xfd\xb9\x74\x0f\x1d\x18\x15\x82\xf1\xc4\x8c\xe5\x43\x48\x60\xd9\x30\xf0\xe7\xe7\x0e\xdc\xff\xb8\x55\x60\xa5\x3d\xba\x95\xd5\x7b\x31\xe8\x92\x41\x37\xbc\x2c\x19\xe3\x4b\xb9\xc9\x86\x68\x77\x17\x42\x80\xe8\x0c\x23\x97\x8d\x57\x79\x58\x64\xa7\x37\x4a\xef\x38\x3f\x3b\xf6\x37\x53\x59\xbf\x63\x56\x47\x40\x09\x84\x61\xa6\xc7\x6e\x8f\x23\x89\x13\x28\x87\x69\xa1\xcb\x1c\x95\xb2\x2c\x32\xa9\xeb\xb3\xec\xeb\x04\x8e\xe3\x24\xcf\x0d\x7e\x85\xa3\x89\xb0\x4d\xed\xbb\xcb\xee\xf2\x98\xd0\x52\x78\x16\x08\x5c\x0c\x83\xef\xaa\x29\x85\x46\xe8\x39\x0b\xd1\xbf\xe4\x65\xec\x1b\xaf\xae\x69\xee\x52\x18\xe7\x2c\xae\xdb\x9b\x64\x9c\xf7\x3e\xec\x45\x4a\x2b\x48\x49\x65\x17\x96\x72\xde\xbc\xf9\x44\x13\x63\x99\x5a\x8a\x90\x7d\xe1\x7d\xc0\x68\x4f\x2a\xea\x57\x9a\x2f\xb4\x48\x41\x95\xdb\x41\x15\xca\x32\xe9\x70\x52\x6d\xc0\x0a\x5c\xac\xaf\x58\x87\x11\xdb\xd4\x69\xce\x80\xbd\x29\x7c\x4f\x41\xd6\xfa\x28\xa5\x97\xc6\x37\x2c\x0d\x21\x49\x60\xb5\x45\x98\xcd\x8b\xc8\x49\xeb\xdc\xa3\x6d\x62\x25\xb2\x0d\xec\x0d\x03\x11\x69\xce\xbb\x36\xea\xdc\x3a"}, +{{0x9a,0xd0,0x49,0x10,0x08,0x51,0xd0,0xf7,0x9b,0x71,0x12,0x25,0xc9,0x88,0x47,0x79,0x5a,0xcf,0xc3,0x60,0x1c,0x14,0xb8,0xa9,0x77,0x8d,0x62,0x70,0xcd,0x4c,0x05,0xed,},{0xe7,0xca,0xcf,0x4f,0x37,0x14,0x54,0x3c,0x27,0xa3,0xe9,0xed,0x83,0x3b,0xaf,0x3b,0xde,0x4c,0x09,0x56,0x3b,0xef,0x59,0xe7,0x63,0xfa,0xb7,0x1f,0xb5,0xe4,0xff,0x56,},{0xfe,0xc0,0xaf,0x34,0xcb,0xc5,0xcf,0xfc,0x56,0xe9,0x6d,0xd5,0xed,0x59,0x68,0xe5,0x2c,0xbd,0x42,0x69,0x84,0x4f,0xc3,0x0e,0x3a,0xb0,0xd3,0x47,0x2b,0x5d,0x18,0x0c,0x8d,0x1b,0x76,0x90,0x51,0x8f,0x41,0xf1,0x44,0x38,0xe7,0xf3,0xa8,0x3d,0x5e,0x89,0x76,0xcb,0x9a,0x26,0x15,0x1f,0xc4,0x14,0x9a,0x32,0x98,0xd7,0xe4,0x2c,0x05,0x03,},"\xc2\x84\xbd\xd8\xf8\x27\x5b\x49\xac\x80\x8c\x39\x04\x5e\x50\xe1\xed\x50\xc8\xa1\xaf\xd0\x11\xaf\xe5\xdb\x3d\xda\x62\x0b\xe8\xae\xc3\x7f\x45\x60\x57\x62\xe2\x25\xd0\x41\x11\xf2\x1b\x49\xfc\xef\xca\x3f\x3d\x5f\x81\x3b\x20\x20\xa5\x2c\x49\xf9\x5c\x4a\xd6\x1c\xa2\x14\x61\x8a\xde\x7e\xed\x6c\xd8\xd3\x14\xdc\x4c\x63\x55\x95\x52\x77\xd4\x57\x46\x2f\x03\xb9\xfb\xa2\xe2\x25\xb1\xb5\x37\xcd\x4b\x52\x37\x50\x5c\x90\xd4\x32\x05\xe1\x71\x5c\x39\x63\xcc\xfb\xec\x37\x9e\x6c\x17\x05\xe0\x80\x34\xa3\x1a\xfc\xe6\x46\x72\x7e\x78\xa2\x0e\xed\x88\xae\xb0\xdc\xda\xbc\x5c\x86\xe8\x69\x79\xe6\x3a\x5c\x26\xc3\xe2\x17\x79\x73\xb6\x98\x3c\xeb\xfe\xda\x9f\x31\x47\x93\x61\xb6\x61\x76\x3a\xa7\x26\x1c\x09\x39\xca\xd4\x8b\x71\x90\x8e\xa9\x07\x68\xbb\x6c\x95\x83\xd8\xea\xeb\x9e\x03\x38\x51\x5a\xca\x12\x42\x62\x6d\xc6\xbe\x04\xec\xc4\x42\x9e\x4c\xbb\x4f\xf3\x36\x09\x61\x92\xf7\x50\x1e\xc4\x71\xb5\x96\xa9\x9d\x4c\x02\x75\x82\xcc\x69\xe2\x04\xb6\xfb\xcd\xdf\x59\xf5\xbf\x74\x62\xdd\xcd\x59\x89\x12\x1f\xd1\x0f\x11\xa0\x67\x5b\x6c\x4e\x4f\x65\x20\xd2\x7d\x7c\x61\x43\x1b\xa7\xd1\x74\xf5\x73\x95\xa0\xbf\x72\xd3\x8c\x11\x42\x73\x6d\xed\x6b\x91\xe4\x81\x1c\x0e\x85\x41\xa6\xc0\xd9\x96\xc5\xa1\x7d\xc9\x7d\xb3\x88\xf7\x21\xd2\x35\x7d\x3c\x6a\xf5\xc8\x6b\x1d\x5e\x47\x6e\xa0\xac\x0b\x1c\x11\xd4\x38\x7f\x76\x90\x39\xbd\xf5\x38\xa0\x21\x6e\xdd\x00\x45\xee\x6d\xd8\x9e\xef\x82\xa4\x25\xa8\x3f\xaa\x1b\x12\x80\x70\x38\xca\x19\xeb\xec\x00\x2e\x8b\x3c\x15\x34\x4c\x61\xcf\xd1\xe5\xf0\xe3\xb0\x27\x3d\xeb\x37\x27\x8c\xf1\x97\xd8\xa8\x3b\x13\xd9\x92\x30\x8a\x51\x37\x3e\xb3\x81\x14\xc9\xe4\x5b\x43\x87\x80\x27\x7d\x1e\x32\xf3\x97\x29\x62\xa3\xe1\x4a\x8d\x08\xdb\x9f\x09\xae\xc3\xdd\x32\xa5\xb9\x94\x23\xe6\x1f\x5e\x79\x94\x4a\xb5\x7a\x36\xf6\xec\x07\xcc\x32\x04\xf9\x16\x5e\xe0\x21\xad\xa9\x3e\x6f\xec\xb7\xec\x45\x6a\xa0\x28\x8c\x37\x8a\x75\xaf\xd6\xe9\xda\xd6\xc6\xf8\x8e\x95\x9a\x2c\xf2\x8b\xfe\x56\xd2\xe6\x1b\x2a\xda\xec\xf0\xd8\x6d\xd8\x92\x8b\xce\xda\x26\xb0\x54\x02\x46\xb7\x33\x7f\x5c\xdc\xec\x11\xfb\x0c\x1a\x59\xd6\x31\xfc\xca\x19\x40\x8f\x95\x22\xb6\x8a\x39\xf8\x6e\xf9\x70\xb8\x83\xa0\xf0\xbd\x6b\x7b\x14\x15\xec\x9a\xa0\x43\xb5\x2e\x19\xba\xc1\x76\xd6\x7b\x79\xe2\xa5\xdc\xa8\xbf\xd2\x91\x02\xac\x60\x8e\x47\x3e\x9f\x98\x2c\x3e\xc8\x93\x2d\x8a\xa8\xcd\x56\x52\x84\x49\x1d\xe5\x2f\x51\x6b\x9e\xbf\xb7\xdb\xe1\x29\x95\x11\xae\x73\x2c\x2a\xd1\xee\x49\x92\xb0\x77\xfa\xff\xc6\x5f\x48\x8f\x1b\xa2\x15\xda\x69\x79\x60\x09\x71\x19\x6d\x0f\xf3\xa0\x8a\xd9\xf0\x0e\x82\x9c\x1d\xe1\xaf\xca\x10\xca\x47\x6b\xe6\x64\xaa\xd2\x61\x88\x9b\x0e\xb7\xae\xb6\xed\x86\x37\x61\x89\x00\xac\xf4\x81\xe2\xd2\x24\xec\x64\xa6\xe6\xcf\x4f\xa4\xdf\x73\x1b\x7a\x4f\xee\xff\x25\x80\xc9\x9b\x6d\x75\xb4\xdc\xd0\x97\x69\x65\xcb\x2b\x0b\x56\x35\x22\x78\x42\xd0\x8a\x7d\x90\x7a\xae\xbc\x2f\xde\xd8\x00\x98\x11\xdc\xdd\x73\x35\x49\x21\x75\x3b\xc5\xde\xc0\x17\x68\x93\x35\xf5\x6d\x0f\xb7\xae\x21\x3b\x41\x79\x2b\x1f\x4e\xb1\x4a\x24\x53\x59\x77\xa3\x05\xb1\x9e\xb9\x83\x8d\xc6\xb5\x15\x28\xb9\x8a\x39\xbd\xa0\x60\x10\x71\x7a\x20\x8c\x34\x7a\xa1\x58\xee\xcd\xfd\x9a\x04\x72\xd3\xb8\xd9\x20\xf9\x69\xe1\x2b\x65\x91\x9b\xda\x38\xb4\x61\x94\x98\x50\xcc\x9c\xc1\x8d\x8e\x3b\xaa\x8c\x88\x6d\x93\xcd\x09\x6a\x20\x9d\x54\x3c\xa3\x37\x5f\xc4\xe7\xd6\x51\x03\xcb\x64\x24\xbe\xab\x44\xe8\xbc\x4a\x5b\x62\xc2\x9a\x01\xbc\xf4\x4d\xcc\x61\xe7\x67\x5c\x02\x5d\xec\x07\x24\x20\x01\x94\xbd\xe7\x4d\x72\xc0\x2e\x94\xa9\x46\xa7\x52\xf3\x60\x84\x57\xfd\x91\xf2\x92\x71\x57\x71\x48\x7d\x26\xca\xd4\xe5\xcf\x6e\xf7\xc6\xf7\x16\x27\xa4\xda\xf8\xa4\xc9\xb8\x91\xc1\xee\x8f\x04\xae\xaa\x99\xfe\x0c\x8b\x4e\x83\x3b\x76\x09\x06\x6b\x61\x32\xa9\x68\x89\x0e\x26\x95\xda\x22\xb2\xd8\x57\xc8\xc0\xad\x91\x87\xc9\x60\x69\xe4\x76\xe2\x7e\x46\x32\xc4\x47\xee\x76\x71\x4a\x31\xd1\xe5\x14\x9e\xcb\x33\x7e\xe1\x32\xf3\x55\x2d\xa3\x3a\xb2\xd6\xfa\x9d\x7e\x93\xf6\x8a\x77\xcb\xf1\x91\xcb\x06\xbc\x22\xf3\x47\x0a\xf6\xd7\x58\x1e\x3a\xcc\xbe\xca\x0b\x6f\xeb\x08\xa1\x4b\x9a\x80\xc1\xef\x59\x37\x4c\xcd\xc0\x52\x3c\x36\x84\x50\x4c\x01\x04\xbb\xa2\x2c\x10"}, +{{0xde,0x54,0xe1,0x3f,0x9e,0x2c,0xc7,0x54,0x54,0x6c,0x99,0xb3,0x3b,0x3d,0x72,0xf4,0xd1,0xf7,0x71,0x50,0x38,0xa9,0x65,0x9f,0x33,0x63,0x65,0x77,0xbb,0x52,0x6a,0xdb,},{0x36,0x33,0x8d,0xb3,0x32,0x6b,0x00,0x5e,0x5c,0x61,0xff,0x78,0x2b,0xe2,0xea,0xb1,0x66,0xd4,0xeb,0x72,0x34,0xa9,0x8e,0xa1,0xcd,0x85,0x5e,0x1a,0xd5,0x35,0xe9,0x4c,},{0x37,0xac,0xa8,0xf2,0x48,0x39,0x4a,0x9e,0x04,0xd0,0x6a,0x7d,0xa8,0x4a,0x7d,0xef,0xa3,0x9d,0xe4,0xda,0x2b,0xcb,0x18,0xd5,0xf6,0x4c,0xc3,0x4d,0xb0,0x86,0x51,0xaf,0x4a,0xbb,0x19,0xfa,0x2a,0x92,0xa7,0xdd,0xa5,0x6e,0xc9,0x93,0x0b,0x81,0xae,0xbd,0x23,0x99,0x05,0x11,0xf6,0x84,0xc6,0xd1,0x5b,0xa5,0x95,0xf7,0xd4,0xa2,0x74,0x0e,},"\xdc\x40\x41\xad\x61\x42\x3a\x12\xa0\x41\x13\x18\xa6\xe6\x2a\x5e\xf6\x4a\x19\xab\xe2\xd9\x85\x22\x97\xbe\x2d\x4a\x35\xeb\x86\x70\xca\x36\xc5\x21\x53\x1b\x30\x38\xac\xda\xee\xa2\xea\x01\xa0\xb6\x18\x78\x62\xa4\xe1\xa8\x9d\x4b\x81\xc5\x31\x8e\xd4\xd6\x71\x31\xbc\x38\xf8\x41\xa1\x42\xa2\xf6\xf3\x16\xdf\xf0\x76\x93\x9d\xc0\xeb\x81\xb2\x30\xfe\xa9\x88\x1f\x8f\x0f\xf7\xed\x0b\x29\x3f\x69\xb2\x89\xfe\x77\x08\x81\xfb\x37\x10\x80\x8e\x8e\x59\xe6\x4e\x19\x0c\x1e\x37\x9b\x9d\xd3\x48\xb0\x2c\x23\x47\xd7\xe2\x06\x96\x79\x0b\x62\x77\x6a\x2e\x82\x5b\xed\x69\x17\x03\x7c\xb6\x35\xc9\x2f\xbc\x76\xb4\xc5\x85\x10\x27\xe7\xf1\x38\x52\xee\x7e\x7c\x52\x57\x3a\x90\x30\xb7\x9f\x22\xb6\x0d\x58\x69\xef\xe6\x80\xc0\x16\x64\x92\x9f\xe9\xa0\x6f\xa3\x33\x05\x2b\xe1\xd6\xaf\x3a\x0b\x48\x2c\x33\x2e\x18\x05\x1e\x78\xb3\x33\x83\x9d\x6c\xb9\x3d\x93\xeb\xfb\x27\x7e\x42\x68\xfb\xee\xee\xba\x1e\x8f\x96\xa5\xc9\xe3\x28\xc4\x26\x72\x12\xca\xc2\x51\x21\x5b\xfa\xa7\x8f\xd8\x8a\x87\x41\x7a\x80\x60\x2d\xcd\x88\x28\xe8\x04\x00\xda\x30\x4e\x98\x98\x62\xd1\x32\x01\x08\x2d\xe3\x53\x09\x25\xe0\xed\xc2\xc1\x30\xa9\xa4\x19\x07\x1b\x31\x08\x8d\xa6\xf6\xff\x40\x56\x30\x1c\x12\x9f\xc2\x13\x52\x33\x62\x8d\x16\xd8\xbf\x16\x0f\x6c\xe8\x6d\x83\xcd\x4e\x29\xae\x0c\x73\x84\x3d\x70\xb5\x30\x56\xc5\xaf\x3f\x3d\xc5\x61\x27\x1c\xb5\xaf\xf3\x93\xf0\x80\x3a\xde\x07\x2d\x9c\xeb\x74\x5b\x61\x87\xb2\x8d\x24\x69\x67\x67\xd5\xc2\x1f\x4d\x4a\xc5\x8d\x5b\xb6\x6c\x5c\xad\xfe\xfb\x16\x26\xef\x93\xf7\x14\xc7\x82\xb6\xef\x3c\xcf\x4b\x44\xee\x75\xf0\xbb\x75\x7a\x25\xd9\xb4\x6a\x9d\x93\x1a\x03\x72\x7d\x49\x6a\x22\x81\x0c\x63\x4f\x5c\x1a\xe6\x0c\xbd\xf2\xf1\xea\x29\xb5\x46\x07\xcf\xf5\x0d\x9f\x8e\x03\xa0\xa4\x51\x3c\xf6\x8d\xfb\x61\x97\x73\x41\x1b\x61\x80\x95\x9a\x8a\xac\x30\xb2\xee\xe4\xad\x32\x79\x15\xf6\x0a\xe5\x2b\x90\xe0\x4a\x9b\xce\xf8\xdc\x67\xe7\x1e\xa1\x0a\xca\x55\x3d\xb9\x89\x5c\xd8\x00\x84\x57\xd7\x6f\x02\xce\xb5\x35\x00\x21\x11\x09\xe8\x96\x03\xf3\x04\xd8\x80\xaa\xf0\x28\x61\xfe\x37\xc9\x53\x4a\x9d\x67\x2d\x83\x71\x3c\xd3\x26\xc9\xab\x81\xc3\x53\x76\x4c\xa5\xad\x5a\xc0\xe7\xf1\xff\x88\x0f\xb4\x8a\xcd\x9c\xbb\x94\x90\x64\xe2\x11\x83\xbc\x38\xfb\x1d\x90\xcf\xe6\x19\xa8\xb8\xfb\xf5\x32\x18\x89\xbb\x15\xc0\x2a\x53\xe4\xd3\x67\xfc\x66\x88\x77\xb6\x62\x28\x1c\x4a\x2a\xf6\x78\xf8\x6e\x69\x1d\xaa\x8a\xfd\xca\xc1\xb8\x20\x18\x9f\xe5\xc2\x50\x8c\xe3\x6e\xdd\x9c\x6f\x8f\x51\x57\x50\x71\x83\x94\x39\xa0\x03\x35\x2c\x15\x73\xe1\x27\x68\xdd\x6d\xeb\xdf\x1e\xd4\xf9\x4a\xc7\x9d\xf1\xab\x6a\x0b\xc2\x50\x79\xc0\x93\x54\x77\xd9\x14\x99\x88\xec\x3b\x87\x93\xef\xcd\xa8\x59\xac\xc3\x92\xab\x3f\xa9\x94\x93\xd7\xae\x0a\x65\x75\xb6\x95\xa1\xce\x07\x65\x32\x86\x02\x87\xdd\x49\x89\x67\xc4\x6f\x7a\xdd\x49\x49\x4c\x02\xe7\x44\xc4\x02\x80\x19\x57\x82\xe2\x42\x44\x76\x16\x5e\x72\xce\xe2\x36\x42\xe5\x1c\xec\x43\x21\x91\x11\x6a\xec\x59\xb5\x9f\xcf\x0a\x36\x83\xb9\x5f\x76\x07\x60\xa2\x0b\xd6\x74\x54\xd8\xde\x64\x7c\x0f\x9f\xfc\x4f\x90\xf6\xe4\x5a\xc9\x3d\x80\x2f\x33\x82\x99\xef\x28\x0d\x3b\xb7\xa4\xa8\x9d\xb8\xc5\x9a\x12\x52\x6f\x27\x83\x02\x4c\x8a\xde\x90\x02\xf0\x0e\x3d\x52\x9b\x78\xdc\xdd\x49\x03\xda\xf5\x76\x7a\x2b\xed\x75\x14\x53\x96\xef\xb6\x97\x90\x71\x2d\xe6\xa5\x90\x1e\x6d\x8c\x15\x28\x01\x82\x38\x82\x85\x02\x1d\x0e\x70\x92\x92\x15\xd9\xf2\xb7\x99\xbb\x92\xf2\xca\x56\xf4\x8e\x8c\xbb\xa2\xf1\x9b\x08\x58\x45\x12\x65\x67\xcf\xaf\xa6\x03\xc2\x94\x6e\xa1\xe7\xd2\x74\x55\x4a\x38\xbf\x7d\x86\x51\x1f\x3e\x47\x4f\x9f\xa5\xcb\x11\x10\x5f\xb5\x2f\xc6\x81\x77\xf3\x38\x5f\xe1\x39\x7b\xe5\x84\xa7\x00\x89\xdc\x74\x1b\x4b\x00\x95\xbf\x7e\xb2\x99\x3b\x41\x8d\xf8\x7b\x14\xa1\xf9\x79\x26\xe8\x68\xdf\x6e\x56\x8b\xec\xa2\x21\x5f\x2d\xd7\xce\x8a\x3c\x9e\xe8\x49\xcb\x41\x34\x6c\x68\x4f\x7f\xfe\xf0\xa7\x92\xed\xf4\x33\xca\x99\xef\x34\xc7\x3f\x92\x72\xa7\xeb\x97\x58\x7c\x8f\xce\x4a\x51\x36\x44\x47\x37\x13\x8d\x53\xea\xdf\x3a\x84\xf5\x01\xbb\x10\x45\x6e\x8e\x4a\x40\x47\x08\x2c\x9e\x14\x35\xf5\x76\x52\x6c\x21\x64\x71\x4d\x70\xb3\xd0\xa6\xe9\xc0\x8a\x53\xe3\x23\x84\x0f\x4d\xcf\xe8\xf2\xd1\x9f\x0b\xe2\xc8\x8e"}, +{{0x85,0x04,0xfb,0xca,0xab,0xa6,0x76,0x83,0xf8,0x15,0x49,0x92,0x82,0xb6,0xeb,0xd4,0x97,0xa8,0x1a,0x91,0x56,0xf5,0x3e,0x02,0x5c,0x2d,0x3e,0xce,0xe0,0xdb,0x65,0x59,},{0xe6,0x2d,0xa8,0x64,0x93,0xa0,0xca,0xf5,0x29,0x21,0xd5,0x60,0x2f,0xbd,0xc3,0xdd,0x3a,0x84,0x36,0x94,0x1f,0x6b,0xe2,0x40,0xb3,0x15,0x09,0x68,0x12,0x38,0x74,0x6d,},{0xc0,0xea,0x07,0x4b,0xf9,0xad,0xde,0xe2,0xe3,0x35,0x0a,0x96,0x9e,0x7c,0x56,0x9e,0x3a,0xea,0x1a,0x41,0x88,0xee,0x5a,0xf3,0x4c,0xb7,0x3f,0x38,0x82,0x98,0x65,0x3d,0x29,0x9b,0x5d,0xbd,0x94,0x16,0x3f,0xba,0x20,0x9e,0x8f,0x7d,0xc2,0xe2,0x63,0x4d,0x3a,0x52,0xa0,0x28,0x10,0xa8,0x8c,0x61,0x52,0x94,0x5b,0xc1,0x6b,0xbd,0xfb,0x0c,},"\x6c\x63\xed\xbd\x40\xa0\x38\x74\xec\xae\xf8\x16\x02\xcd\x68\x50\xc0\x9f\x49\x15\xb7\xaa\xf4\x18\x25\x8c\x56\x83\x64\x53\x8e\x83\x92\xa8\xc3\x79\x83\x8b\x0c\x95\x34\x5b\xf6\x4c\x3d\xbc\x17\x58\x53\xfb\x64\x1f\x35\x0f\x0b\x53\xa0\x5a\x8e\xc2\x90\x28\x8c\x03\x26\xd4\x35\xff\x77\x6f\x86\x83\xa2\x73\x33\x3f\x9b\xb2\x80\x21\x84\xec\xc5\x3b\x06\xb2\x8c\x2c\x40\x2a\x54\xbf\x13\x4c\x1a\x23\x29\x97\x49\xa6\xce\x2b\x51\xa7\xba\x22\x23\x21\x48\x79\x7e\x99\x3f\xf2\x58\x28\x6e\x94\x77\x78\xa8\x74\x2d\x3f\x36\xcc\x78\x42\x97\x60\x43\xfc\x23\xda\x8a\x97\xec\xb9\x71\x5f\xc0\x5f\xb0\xf2\x3f\xa7\x32\x1d\xdc\x19\x32\x86\x16\x31\x60\x4e\xba\x2e\xf2\x5d\x8b\x75\x6c\xe4\x73\x36\x56\xbf\xd1\xe1\x47\x08\x92\x3a\xc7\xc6\x0a\x79\x84\x61\x36\xd7\x41\x97\x3b\xa5\x51\x41\x89\x72\x0b\xc0\xf7\x77\x4b\x7b\xd3\x57\x45\x95\xbd\xe2\x51\x50\x31\xb2\x5b\x62\x65\x4b\x16\x10\x35\x77\x80\x70\xac\xe1\x49\x71\xdf\x1f\xe0\xbe\x4e\xa1\xef\x55\xcf\x87\x47\xd3\x71\x6c\x1c\xe7\x07\xb1\xa7\xc8\x52\x0e\x6d\xeb\x33\x4e\xb1\x86\x33\x8f\xc9\x30\x00\x76\x8e\xb2\xbe\x40\xc6\xe0\xdc\x3f\x5d\xf8\x31\xb3\x2c\x3a\x2c\x33\xe2\x88\x98\xd6\x76\x2a\x15\x22\xd3\xd4\x8d\xae\xe5\x6a\x02\x69\xbd\xdf\x6c\xfc\x9d\x73\xf8\xd1\x78\xae\xcc\xbf\xfe\xf7\xce\x16\x4f\x98\xaf\xea\x22\x4a\x9b\x60\xed\xe4\x6a\x95\xfa\xdc\x9f\xc5\xd9\x4d\x20\x9c\x16\x6d\x9b\x8d\xe2\x53\x38\x1e\xa2\x24\x88\x62\x94\x6b\x9c\xf5\x34\x94\x74\x55\xc2\x44\x58\xcf\x56\x68\x3a\x0e\xc4\x7a\x2c\x65\x07\x5c\x69\x4c\x7c\x3d\x6a\xdf\x9a\xe5\xe8\xad\x31\xac\x76\x9f\x83\xaa\x26\xe3\x12\xc5\xb0\x1a\x9a\x09\x40\x4b\x15\xb8\x14\xba\xa7\x66\x6b\x3e\x03\xf0\x6a\x8d\x63\x48\xab\x8c\xcb\x9b\x60\xa4\xa4\xfa\xf8\x6f\x71\x35\xdf\x03\x9d\x95\x5c\x07\xbd\x92\xe7\xb8\xe3\x27\xee\x6c\x1b\x40\x19\x6a\x28\xb4\x44\x6a\xa5\xa9\xb2\xb9\x77\x3a\xb7\x6e\x3c\xe2\x11\x80\xf0\x9d\x6c\x08\xd2\x77\xc6\x77\x1d\x67\xe2\x2d\x84\x54\x0f\xa4\x3b\x38\xf6\x34\xcf\xc4\x6e\x5b\x8c\x33\xf1\x5a\x56\x8a\x77\xe4\x91\x4a\xad\x9a\xb8\xc9\xf7\xfe\xa4\x7f\x76\x77\xc0\x18\x80\xb3\xe8\x5d\x2d\x0e\x3f\xbd\x6d\xc6\xe9\x9e\x43\x7d\xdc\x73\x6f\x92\xb5\xa2\xff\x29\x27\xe0\xb4\x42\x14\x2f\x08\x97\xd0\xb8\xa1\x9a\xc2\x03\x63\x3d\xf4\x13\xfe\xaf\x8e\xf5\x0a\x5f\x76\x7b\xed\xaf\x20\xf1\xc1\x3f\x3b\x89\xd1\xe8\xb7\xbd\x18\xd5\x91\xf9\xde\x11\x6e\xe3\x4f\x98\x24\xe4\xea\xd1\xae\x9d\xa2\xe8\xca\xae\xf8\x8b\x29\x51\x6a\xa9\x42\xde\x77\xa7\x46\x7b\x6f\xb2\x6a\x66\x6f\x30\x64\x8c\x71\x5a\x2e\xe9\xf9\x46\x74\x3b\x54\x3a\x44\x28\xe0\xdf\xd0\x61\x78\xe7\xe9\x3e\xc6\xf2\x6e\x00\x3e\x05\x8b\xec\x14\xa4\xaa\x2e\x3b\x8d\xe1\x12\x95\xa7\x64\xca\xb3\x0b\x31\x3f\xcc\x57\x43\xb2\xfb\x89\x96\x2d\xdc\x5c\xdc\x6a\xa0\xd2\xe4\xa3\x06\xe7\x7a\xf7\x6a\x05\xa5\x98\x92\x3f\x62\x8a\x85\xdf\x1c\xc7\x3a\xd3\xbc\x01\xc4\xb9\x79\xbd\x7c\xb2\x96\x59\x0a\x88\xb0\xa4\x1b\x44\x5d\x50\xa0\x84\x23\xe4\xed\x80\xf1\x76\x3c\x71\x6b\x6c\x45\x7d\x84\x5d\xfa\xa6\x8d\x12\xb0\xd0\x3c\x55\xfd\xe8\xae\x6b\x2b\x92\xbc\x63\x22\x94\x3d\xbe\x54\xc7\x06\xbc\x8e\x5f\xce\xe7\x06\x54\xb2\x6f\x3b\xfd\x87\x7f\x5f\x53\x39\xac\x18\x2d\x54\x17\xbd\x4c\x07\x35\xd8\x25\xbf\x70\xe8\x5e\xab\x82\x16\xed\xda\x63\x2a\xe7\xe2\x2b\x3e\x53\xd0\x78\xa8\xb2\x0b\x5a\x7e\x23\x85\x33\x7c\xf9\x2b\x3c\x16\xb0\x23\x56\x3e\x11\xcb\x50\x43\xb7\x04\xd3\x7e\xb5\xed\x9e\x85\xfc\xdc\x95\xcf\x7a\x6e\xad\xe4\x08\x03\x17\x5a\x00\x8e\xf6\x53\xac\x61\x36\xf1\x61\x29\xab\xae\x11\x37\xc5\x82\x34\x00\x74\x8a\x81\x25\x62\x54\xd3\x17\xcf\xc9\x39\xe2\x6e\xa0\xce\xf9\xf6\x54\x8d\xb4\x28\x90\xc4\x8b\xeb\x04\x79\x10\x3b\xa0\x89\xe5\x14\x11\x80\x38\xb1\xb9\x09\x43\xd7\x16\xf7\xa8\xd4\xcd\xa5\x98\x3a\x67\x4b\x83\xa0\x02\xd8\xac\x9c\x65\x73\x4a\x28\xb7\x7b\x76\x0c\x8e\x38\x03\xf8\x78\x1e\xa9\x19\x9f\x79\x7c\xe7\x29\xe0\x6b\xff\xfe\x8c\x29\xb2\x0b\xc8\x52\x27\xc0\x9c\xc0\x52\x19\xff\x2b\xa3\x8e\x18\x05\x10\x83\x73\x2f\x83\xcb\xfc\xcc\x31\x07\x56\x45\x0b\x26\x1d\x5b\xe1\x83\xd9\xfb\x44\xec\x18\x52\x9f\x2c\xc9\x84\x8c\x40\x11\x9c\x60\x76\x76\xbc\x4d\x90\x15\xfd\x4b\xd2\xfc\x91\x8d\xc8\x03\x1e\xc1\x9a\x05\xff\x36\x2c\x18\x40\x43\xbe\x7f\xe0\x66\x01\x9a\xc5"}, +{{0xea,0xc0,0xf0,0x6c,0x2c,0x14,0xf3,0x7d,0x43,0x4b,0xc9,0x98,0x97,0x22,0x5d,0xd2,0xe3,0xf1,0xed,0x74,0xaa,0x74,0x42,0xc5,0x50,0x33,0x9d,0xf7,0x7d,0x0b,0x7b,0x32,},{0x43,0xe6,0x20,0x55,0xdb,0x6e,0x13,0x49,0xc9,0x4d,0x89,0x02,0x91,0x87,0x88,0x20,0x20,0xcb,0xcf,0x9d,0x75,0xe0,0x3e,0xb6,0x56,0xfa,0x0a,0x15,0xb1,0x90,0x02,0xd7,},{0x45,0xf2,0x80,0x3a,0xfe,0xb0,0xfc,0x44,0xd3,0xaa,0x96,0x5b,0x12,0x65,0x9b,0xf5,0x02,0xe4,0x72,0x95,0x70,0x61,0x84,0xb2,0xa1,0xc6,0xf1,0x6d,0x05,0x06,0x13,0xf5,0x96,0xa2,0x00,0x13,0x94,0xe0,0x0e,0x2a,0x44,0xc4,0x6c,0xf6,0x50,0x5d,0x5c,0xf5,0xb8,0xab,0x84,0x12,0xf0,0x7e,0xda,0x95,0x1a,0x15,0x00,0x5e,0x33,0x8f,0x3c,0x0e,},"\x27\xb7\xfd\x0e\x71\xad\xf1\x94\xcf\x54\x07\xb6\x77\x17\x93\x06\x0d\xe0\xfc\xa7\xca\x0a\xe6\x48\x35\xc4\x31\x87\x40\x8a\x70\x4f\x53\x3d\x5e\xa0\xc8\x3a\x65\x43\x87\xba\x7d\xb1\x6e\xd5\x8e\xc8\x37\x22\x6d\xf5\x7c\x1f\xe6\x38\x2c\x59\x19\xe9\x22\x13\xf6\xf1\x8c\xbb\x57\x35\xd1\x78\xa4\x76\xaf\x35\xd3\x90\xb7\xcd\x25\x56\x21\x7c\x53\x0f\x3a\x1f\x8a\xb2\x33\x9c\x1a\x5e\x8d\x96\x93\x87\xef\xd3\x94\x14\xb5\x6b\xb7\x84\xdf\xd5\xeb\x89\xb8\x59\xe1\xf4\x03\xa2\x38\xec\xa2\xa9\x41\xe6\xdb\x56\xac\x45\x6b\x73\x45\x06\x98\xd1\x45\x5e\xc1\xe9\xb3\x9a\x1e\x90\x7d\x6b\xc7\xe6\xcf\xf4\x24\xa2\x8e\xed\x57\x9a\xf1\x63\x10\x11\x5b\x67\xf5\xfc\xf7\xf8\x34\x6b\x3f\xa0\x26\x0c\x6d\xa2\xe2\x77\x55\xac\xa5\x70\xba\xbb\x3d\x30\x3c\xc8\x32\x46\x0c\x96\x3b\xfd\xd5\xc1\xff\xb2\xfc\x19\x92\x19\x29\xdd\xa2\xa7\x17\xfb\xcb\xeb\x2b\x85\x25\x76\x1b\xd6\x60\xce\x4a\x0f\x76\x85\x28\x5d\x7f\xad\x61\x15\xab\x09\xf8\xe6\x3f\x5f\x77\x39\x14\x49\x4e\x20\xbe\x1b\x51\x2d\x11\x14\xcc\xe3\xf0\xf6\x8c\x7d\x94\xf5\x48\x57\x69\x4f\x22\xaf\x4c\x69\x8d\x78\x2c\xe8\x37\xb0\xc1\x72\x2b\xb7\x31\x3b\xb2\xc4\x1f\x6d\x3d\xd1\xa0\x28\x77\xfb\x42\x96\xd8\x66\x2a\x9e\x86\x25\x98\x4d\xc1\xfd\x1a\x95\x10\xeb\xa9\xd6\x43\xac\x58\xa8\x86\xa0\x45\xcd\x0e\x53\xc0\x56\xa8\x33\xf9\x68\xb3\x5d\x01\x32\x0e\x9c\xc0\xb4\x35\xd3\xf6\xbf\xad\x26\xf9\xeb\x57\x54\xd3\x8d\xdf\x6d\x5c\x4b\xf6\x15\xa7\x64\x4a\x23\xf9\x82\x6b\xcc\x97\x60\x92\xd8\x2d\x81\xd5\x47\x00\x0d\xe0\x08\x1b\x7a\x40\xa9\x3f\xbd\xda\xc1\x3f\x7d\x99\x70\x8c\xcd\xee\xb9\x40\x5c\xd6\x34\xca\x07\x48\xca\xd2\xc1\xd8\xf1\x64\xf5\xd7\x7a\x4f\x36\x4a\xe4\x88\xbe\xdc\xf1\xf2\x0e\xb9\x54\xbc\x8a\x27\x8a\xf8\x14\x32\x41\x78\x56\xa9\x00\xf8\xf1\x52\x92\x1a\xfb\xe1\x79\x14\x22\x9a\x51\x3b\xd7\x1a\xb7\xe6\x61\xcd\xe1\x29\xaf\x93\xe2\x50\x94\xc5\x61\x18\xed\x1f\x22\xdb\x64\x44\x28\xb4\x74\x65\x1f\xe3\x6b\xe8\x2f\xa3\x69\x5c\x41\xfc\x86\x99\x66\x7e\x05\x37\x43\xb0\xa4\x11\x55\xc3\x1f\x1e\x26\x79\xc6\xe8\xcb\x9c\x9d\x1f\x5f\x4b\x40\xa3\x20\xa9\xfd\x9f\x47\xda\x9b\x94\x21\x1b\xa6\x01\xb2\x2a\x11\x52\x10\xd9\xf5\x59\xc4\x49\x6f\x01\x73\x24\x58\xf4\x9a\xc3\x4e\xb3\x86\x63\x6c\x8b\x6c\x68\xc7\xbb\xc0\x07\x8a\xb6\xf3\x98\xa6\x24\xb8\xba\xfb\x1c\x62\x29\x58\x56\x2d\x23\x1d\xff\xd4\xdb\x09\x61\x96\xbb\x87\x47\x9e\x42\xea\x22\xac\xbd\xcd\xe8\xde\xb1\x0e\x31\x16\x32\xf0\x2f\xca\x14\x78\x7f\xd3\x14\x05\x69\xb9\x42\x89\x91\x54\x3e\xc6\xe8\x34\xe1\x0b\x14\x9f\x23\xc7\x4b\xb9\x9a\xc7\xb3\x79\x9a\x20\x96\xd2\x2e\x38\x7a\x71\x2b\x6f\x90\x11\xea\x34\xc5\xbe\x4c\x46\x85\x81\xac\x62\xce\x66\x20\x63\x25\x2e\x06\x6a\x9a\x3b\x15\xc9\x57\x0d\x06\x5d\xc1\x61\x99\x29\xf0\x6b\xc7\x5a\x31\x79\x46\x8b\xc8\xa1\x6e\x3d\xdc\x4f\xe1\x85\xce\xba\x0a\x92\xa5\x46\xb8\x67\x5f\xc1\xad\xe5\x63\x07\x15\x0c\x7e\x4c\x84\x4f\x6a\xa5\xf1\xed\xbf\xb5\x4a\xc6\x32\xca\x2b\x25\x9c\x32\xa3\x3e\xe2\x86\x78\x56\xc3\x39\x0a\x67\x40\x36\x4c\xb0\xdf\xb9\x76\xe5\x3d\x0c\xc6\xc4\x2a\x10\x6a\x1c\x26\x91\x8c\x8a\x6a\x03\x3b\x2a\xa3\xc7\xf2\xe4\x39\x2e\x79\xf8\xec\xa5\xb3\x36\xba\xc5\x06\x1d\x76\x98\xa3\xbf\xe7\xc2\xc2\x92\x89\x25\x54\x03\x0d\xe6\xce\x7c\x0d\x06\xee\xfc\x54\x90\x6f\x81\xe0\x09\x7f\xcf\xf2\x7d\x14\xb9\xb7\x99\x4a\x79\x70\xe1\xa5\xf5\xc6\xb6\x40\x5d\xca\x22\x03\x3d\xff\x0e\xae\x13\x8a\xd8\x99\xf6\xee\x68\x12\x0b\x8f\x22\x74\x4b\x02\x69\xa9\xa8\x98\x9b\x6f\x7e\x08\xaf\xfa\xe7\x7b\xca\x21\x68\xad\xe2\x40\x58\xae\x68\xa7\xf8\x00\xe0\x2e\x7c\x38\x39\x1b\xaf\x56\x5d\xd4\x0b\x55\xfa\x3a\xb3\xc2\x47\xb9\xce\xb4\xd9\x67\x47\x17\x75\xe6\x63\xd6\xa1\xc6\xc7\xe1\x73\x50\xbb\xd6\xb9\xa3\xeb\x1e\x48\x4a\xc2\xe7\xa7\xa5\xc8\x4f\x50\x83\xe5\xac\xe8\x73\x0d\xe8\x9c\x47\xe8\xdc\xf8\x34\x1e\x40\xba\x34\x5d\xbd\x66\xba\xe0\xf7\xf0\x76\xa7\x05\xb1\xbb\x7f\x47\x0e\x3e\xdf\xb2\xb7\x8e\x4d\x63\x59\x41\x3d\x18\xd3\x32\x80\xb4\x54\xa0\xdb\xb8\x81\xd8\x60\x67\x26\xfa\x9b\xea\x27\x24\x75\xe7\x9f\xea\x6a\x54\xcb\x4c\x06\x19\x54\x1b\x4e\x77\xc1\x70\xc8\x61\x68\x74\xb9\x54\xbe\xb8\xd1\x05\xb8\x6b\xd1\x91\x7e\x25\xcf\xba\x92\x67\x18\x7e\xe2\x03\x8b\x3f\x00\x78\xf4\xc3\x18\xb5\x87\xcf\x44"}, +{{0xe6,0x08,0xd5,0xde,0x97,0x97,0x90,0x7d,0xb6,0xd9,0x8e,0x03,0x45,0xd5,0xca,0xf2,0xad,0x33,0xe0,0xed,0xde,0xbf,0x18,0xb8,0x1d,0x61,0xe8,0x37,0x3e,0xcf,0xb4,0x99,},{0x60,0xe0,0xc1,0x6a,0xda,0x58,0x6e,0x36,0x46,0x91,0x2a,0x5f,0x2b,0xb3,0x18,0xfb,0xc3,0xd5,0x0b,0x57,0xd3,0x6f,0xab,0xb6,0x37,0x69,0x6f,0x9d,0x8d,0x4d,0xc7,0x61,},{0x0d,0x8f,0x09,0x5e,0x42,0xa2,0x73,0x0a,0x3c,0x7b,0xed,0xf4,0x2d,0x5c,0x83,0x39,0x8b,0x5c,0x0e,0xe9,0xc7,0x7c,0x5a,0x61,0xd9,0x82,0x29,0x13,0x96,0xa9,0x18,0x2a,0x08,0x02,0xa3,0x7f,0x32,0x4b,0xc4,0xfb,0x5d,0x4a,0xa4,0xed,0x60,0x44,0x4b,0x66,0x14,0x4b,0xac,0xbc,0x86,0x51,0x05,0xd7,0x69,0x0f,0x14,0x06,0x50,0x69,0x1d,0x03,},"\xe6\x10\xfa\x7d\x83\x85\xc0\x9c\x78\x98\x9e\xd5\xef\x7a\x23\x05\x47\xf0\x13\xcb\x7e\x8d\xdf\x31\x74\x9f\xfc\x31\xce\xe1\x0a\xb3\xef\xac\xa3\xf1\x4e\xa1\x94\x51\x0f\x09\x85\xa8\x18\xef\x8b\x04\x0e\x10\xc3\xa5\x11\x4d\xe1\xac\x08\x0f\x14\xc3\xd6\x5d\x3c\x24\x4f\x92\x42\xf7\x54\x92\xca\xba\xe8\x00\xfc\xfc\x9b\xc2\x75\xea\x1f\x27\x72\x8c\x92\x0c\x25\x8f\xe7\xaa\x73\x94\x80\x60\x29\x9c\xb8\x78\x35\x79\x2e\xdc\xc0\x72\x15\x0b\x73\xce\xfe\xb0\xd5\x15\x62\xe5\x3b\x46\x81\x0e\x27\xa4\xd7\xf6\xab\xd3\x2e\x95\x9f\x7d\x73\x1d\xde\x01\xd9\x4b\xc4\x1e\xd8\x35\xef\xcd\x42\xc9\x22\x43\x70\x37\xa8\x7d\xd3\x66\xff\xad\x2e\xec\xab\x6a\xba\xeb\x4f\xcf\x07\x39\x2b\x3a\xb4\x0c\xfa\xef\xea\xa4\x26\x6b\xc5\x37\x67\x16\x93\xc9\x09\x3d\xab\xe8\xa0\x53\x8c\xaf\xd1\x2c\x63\x9a\x04\xbd\x2b\xa8\x0c\xe0\xf2\x9a\xdb\xfc\x66\xbd\x46\x37\xca\x05\x43\xa5\x3b\x0e\x37\x1d\x0e\x2e\x47\x0d\x31\xba\x36\x06\x42\xa4\x5a\xb4\xcf\xe3\xe7\x90\xf5\x87\xf6\xc5\xa5\x58\x3f\xd1\x5b\x18\x99\x78\x38\xa2\x00\x92\x1c\x1c\x39\x9c\x0b\x16\x27\x8b\x7d\xd6\xd3\xaa\xab\x6f\x32\x5b\x16\xaf\xdf\x76\x1a\x1b\xbf\x86\x7d\xe2\xbd\xd4\x86\x15\xf1\x5b\x52\x67\x70\xed\x20\xd7\x9f\x0f\x30\x71\x4b\xee\xed\xa5\x8f\x52\xa3\xcc\x0c\x5a\x61\x83\x15\xe5\x22\xb9\xeb\xe7\xcd\x99\xb6\x5e\xd5\x32\xa6\x2e\x0f\x0d\xf7\x27\x64\xd6\xec\x6d\x6d\x1b\xa4\x0e\xf4\x0e\x05\x42\x63\x60\x79\x5d\x6d\xd8\x5b\xb3\x9f\x73\x21\xd3\xfb\x06\x27\x5d\xe0\x96\xaa\xe4\xa2\xfa\x22\x93\xf3\x1b\x33\xf4\xad\x4d\x7c\x25\x1a\xc1\x3e\x8e\x15\xc2\xbf\xb1\xf9\x8f\x49\x62\xc5\x4b\x6c\xe0\x33\xb0\x8a\xa6\x26\xf2\x90\x5d\x46\x3f\x55\xb7\x1c\xbd\xad\xec\xdb\x3e\x0b\x36\x5d\xae\x07\xb1\x70\x30\x19\x83\xae\xb8\x3b\x1e\x9f\x2f\x28\xcf\x65\x41\x9f\xd6\xb0\xa1\xa9\xc2\x6c\xb5\x4b\x59\x49\xf4\xbc\x01\xa9\x86\x81\x84\x4b\x43\x03\x4c\x37\x2a\x45\x3d\x38\xf0\x47\x3d\x0d\xdc\x70\x9d\x9f\x49\xc8\x75\x3a\x75\xb8\x56\xc7\xe9\x77\x55\x17\xdf\x57\x4a\x09\xa3\x95\x3b\xde\x5d\xae\xdf\x8e\x4a\x8d\xa9\xd7\x73\xa2\x15\x12\x0e\x26\x9f\xa1\x86\x11\x33\xcd\x4c\xea\xeb\x91\xd5\xcc\xa2\x60\x63\x25\x45\x8e\x50\xcb\x96\x6d\x14\x05\x5b\x22\x44\x7e\xb6\x5d\xc1\x01\x18\xda\x08\x31\xdf\x28\xc3\xb4\xee\x8b\x11\xf0\x73\x2f\x15\x21\xbb\x94\x82\xb1\x1f\x5a\x86\xb2\x2f\x18\xe8\x3d\xd1\xd9\x67\xd3\x94\x42\x85\xe5\xd6\x3a\x5a\x98\x98\x17\xab\x24\x18\xbc\x7e\xd8\x91\xa3\x73\x84\x67\x47\xa1\x2b\x52\x7c\x2f\x44\xee\x01\x97\xb9\x46\xc6\x7e\x67\xfa\x4a\xa1\xc2\x9f\x33\x79\xd4\x6f\xe0\x7d\x3a\xab\x83\xda\x17\xf9\xd7\x6b\xed\xd3\x84\x36\xa0\x55\xe3\x4c\xa1\xd3\xaf\x5a\x87\x54\xd3\x8c\x17\xb9\xba\x4e\x64\x19\xcb\xab\x51\x5f\x43\x1a\x25\x95\x95\x4e\x42\x8c\x26\x70\xfa\xe3\xbe\xd6\x2b\x45\x96\x17\x9c\xb5\x9e\x21\x10\x87\x08\xd0\x71\xbc\xf9\xc6\x21\xc6\xdf\xf0\x3d\x3c\xdc\x92\x02\x02\x94\x54\x01\x3b\x9d\x13\x38\x47\xf2\x65\x44\x81\x1c\x01\x69\x77\x0f\xdc\x6f\xe5\x63\x8b\xfd\x7a\x72\x0d\x8b\x38\xf7\xe3\x0a\x7e\x68\x79\x06\x0b\x5f\x28\xc8\xab\x17\xb0\x02\x00\x71\x32\x07\xe8\x63\x7b\xff\x48\x44\xd8\x42\xd9\xca\x78\x83\x91\x34\x01\x98\xa3\xfe\x01\x72\xdf\xa7\x4d\xe1\xe5\x5a\xde\xfb\xc2\xe9\xbc\x7e\x88\x54\x76\xd1\xb9\xc0\x55\x81\x34\x08\xa4\x75\x28\x43\x43\x55\xbf\x03\xfd\xd4\xe2\x7d\x8b\x34\x61\xb0\xfb\x66\xab\x3e\x15\xa8\x79\xa1\x84\x45\x7e\x9e\xd9\xea\x6c\x51\xb6\x63\xb3\x1e\xdc\x8c\x4a\x3c\xd4\x54\xf6\x9d\x9c\xe5\x18\xd1\xb8\x78\x88\xee\x3d\x9d\xd5\x41\x6e\x43\xe1\x14\xac\x05\x72\x13\x52\xdf\xfc\x2c\xa8\x85\x97\x37\x7b\xbc\x41\x40\x09\xb0\xc2\xfd\x36\x9b\xe5\xba\x35\xa6\xdc\xe3\x47\x8b\x6c\x11\xb3\x3c\x0a\x33\x91\x8b\x6e\xe5\xac\x4c\xd4\xc2\xf1\xca\x6b\xd1\x90\xa0\x00\xa8\x38\xda\x38\xf5\x30\x77\x56\x03\x35\x59\x6d\x13\x58\x93\x77\x93\x96\x38\x10\xa7\x9a\x21\xb8\xd4\x61\x40\xe7\x68\x89\x8d\xcd\xa8\x8a\x0f\xaf\x8d\xdd\x0d\x63\x38\x47\xaa\xea\x0e\x03\x0b\xe6\x45\x5b\x41\xe3\xed\xe1\xe2\x87\x37\x30\xeb\x84\x81\xac\xaa\x7a\x51\x9c\xf9\x19\x58\x47\xa8\x6a\xfa\x57\xf9\x07\x1d\x44\xf4\xaf\x4c\xa0\xd3\x43\xc9\x0c\x0d\x22\xd9\x46\x14\x65\x85\xf0\x0e\xf3\xae\xf5\x7f\x0f\x9e\x55\xe8\x18\xc0\x12\x8a\xe2\x55\xdb\xc3\x11\x6c\xf0\xfe\x02\x16\x6d\x54\x85\x9d\xec\xbf\xdc\xcc"}, +{{0x0e,0x86,0x87,0x2c,0x78,0x62,0x0f,0x10,0xcb,0x6d,0xfc,0x46,0x3d,0x2c,0x28,0x72,0xc4,0xda,0x66,0x07,0x48,0xc9,0xcd,0xa0,0x1a,0xb1,0x45,0x69,0x58,0xaf,0xba,0x7f,},{0xde,0x49,0x89,0x98,0x92,0x69,0xca,0xbd,0x8f,0x4f,0x40,0x9c,0xf1,0xa4,0xd9,0x74,0x03,0x8b,0x27,0x55,0x02,0x27,0x35,0x57,0xf3,0x12,0xd5,0x55,0x3f,0xab,0x93,0xc3,},{0x20,0x37,0xe9,0x77,0x41,0xc3,0xe6,0x40,0x9c,0x66,0xfc,0x67,0x82,0xaa,0xb3,0x89,0xc5,0xd7,0x78,0x09,0x7a,0xc7,0x78,0x99,0x9e,0x85,0x76,0xe4,0x9e,0xf4,0xf6,0xa0,0xc7,0x73,0x0b,0xd9,0xe0,0x93,0xdd,0x3c,0x0a,0xe7,0xec,0x76,0x20,0x33,0x80,0xda,0x65,0x71,0x47,0xd3,0x3a,0x8d,0x9d,0xd6,0x5e,0xd0,0x0c,0xf7,0x62,0x24,0xd6,0x01,},"\xa9\x00\xf3\xe9\xc6\x43\xa5\x64\x9b\x07\x6f\xb6\x9c\x3b\x2a\xc0\x84\xd5\x2c\xcb\xaf\xcd\xca\x5a\x9d\xb1\xda\xa7\x05\x00\xde\x99\x33\xd2\x3d\x15\x3f\x74\x95\x4e\x1b\xd5\xf5\x7b\x89\x9f\xe8\xa4\xb1\x34\xc1\x95\x41\x2b\x49\x83\x3b\x6e\x50\x95\xa6\x55\x4e\xaa\x6d\x84\x4b\x11\xf1\x58\x4c\x85\x05\x5b\x87\xf4\x1c\x99\x96\x69\x04\x6c\x71\xae\xb5\xc0\x45\x3f\xd6\xa3\xc4\x37\xf8\x15\xf0\x68\x98\x7c\x38\x68\xcc\x07\xaa\x2a\xf6\x58\x19\x04\x6c\x30\x7b\xaf\xb7\x53\x0d\xe8\x4f\x71\x30\xae\xa7\x8e\xf0\x05\xd5\xff\xf5\x2f\x8d\xea\xf1\xd5\xe9\xc3\x26\xd3\x21\x7f\xc5\x5b\x94\xf6\x28\xaa\x10\x4f\x6a\x24\xa3\x95\xe6\x2d\x1b\x62\xbd\x9c\x0d\x82\x43\x63\x19\xc5\xd7\x3e\x57\x65\x43\x5f\x3b\xa8\x56\xa4\x73\x4f\xd6\x0a\xe6\x17\xf7\xf0\xc3\xba\x57\x22\xa7\x33\x66\xc8\x8a\x6d\xfe\xca\x85\xc4\x44\x63\x9f\x44\x1f\x2c\x55\xfd\xc4\x64\xec\xb2\x99\xee\xe3\x6d\x8e\xae\x06\x3b\xb9\x4b\xb2\x43\x9d\xa0\x4f\xa5\xeb\xc5\x09\x23\x38\xa5\x03\x5e\x48\x0f\x08\x34\xae\xee\x8d\x71\x1f\x28\xc4\x6d\xc9\x60\xde\x1b\xe9\xdf\x30\x7c\x18\xc5\xc1\x78\xb2\x62\x96\xdc\x56\x7f\x15\xbf\x60\x86\x3a\x36\x71\x08\x67\xe9\x2f\xd5\x10\x48\x86\x56\x74\xc2\xaf\x0c\x53\xb2\xe7\xa2\x48\xae\x5b\xd0\x9a\x49\xaa\x03\x06\x18\x49\x5f\x82\x48\x0c\x42\x0a\xe1\x06\x88\x9b\xec\x00\x62\x78\xb9\x22\x72\x07\x57\x09\xfe\xc9\x54\x87\xcf\xb1\x00\x61\xe6\x72\x2b\x93\xee\xbf\xc0\xbc\x58\x7b\xf7\xba\x5f\x66\x92\xb0\x74\xf5\x5a\x98\xd5\xc3\x02\x76\x0b\x1b\xf1\xd0\x9f\x7e\x86\x68\x47\x9c\xa6\xf0\x1e\xed\xa2\xfd\xaf\x58\x4a\xc2\x05\x8f\xbf\x7c\xf3\x10\x0d\x06\xb8\x09\x1b\xfe\xab\x51\xc0\xc0\xb1\xd4\xee\x3a\x82\x57\xf6\x9b\x16\x17\x60\x4f\xce\x95\x3b\xb5\xf7\xf2\x71\xc6\xa1\x88\x0e\xa1\xb3\xf6\x62\x67\xe2\x43\x9f\x34\x58\x06\x28\x91\x78\x77\xc6\x6e\xc0\xfe\xd7\x6e\x44\xe8\xbb\x2b\x91\xa8\x80\x6d\xf4\xba\xca\x6c\xc9\x28\x89\xb8\x80\x50\x70\xc9\xa6\x17\xf8\x07\x15\x75\x30\x75\x1c\xc1\x7c\x47\xb0\x9e\xeb\xa9\x4d\x22\xb4\xe5\x47\xc3\x70\xce\x7a\x49\x6f\xca\xa3\x41\x2a\xff\xff\xb8\xc9\xb4\xde\x89\xb9\xf1\x21\xaa\xec\x5f\x54\x4b\x0c\x72\x5e\xc5\xee\x9d\x4b\x34\x76\xad\xc9\xd0\x50\xed\xb0\xfd\xba\xf0\x2c\xa9\xe3\x8a\xf1\x5f\x51\x50\x15\xa2\x67\x29\x2e\xc9\xaa\x54\x44\xed\x1d\xec\xd9\xcd\x9e\x1e\xad\x64\x87\xa0\xcc\xef\x99\x5b\x1c\x60\x0a\x03\x69\x35\x83\x86\x60\xac\xab\x27\x6d\x8b\x0e\x5b\x07\xd9\xf3\x63\x53\x21\x4b\xf8\x0f\x94\x1a\xc8\x8c\xf4\x0a\x08\xaf\x91\x79\x26\x23\x41\x12\xec\xcd\xaa\x16\x2d\xc9\x9d\xe3\xe2\x5b\xaf\xf6\x5b\xb0\x1e\x49\x89\x89\x86\x33\x2b\xdc\x2d\x70\x5d\x5a\xea\x40\xf9\xbc\x4f\xbb\x28\x06\x89\x44\x96\x03\x8d\xa2\x36\xe9\xdc\x29\x60\x0c\x9c\xed\xea\xc3\xb6\x16\xcc\x56\xd8\x9e\xc2\xfa\x67\x38\x96\x66\xc6\xc4\xfe\x23\x3b\x63\x91\x05\x02\x3e\x10\x1b\x87\x4a\x63\x30\xfe\x57\x3f\x80\xac\xe5\x5d\x03\x7c\xc6\x12\xe6\xdf\xd5\xa6\xe6\x86\xf9\xa8\x30\x54\xfc\x46\xe1\x5b\xb6\xda\x45\x3d\x81\x0c\xf1\x38\xa1\x78\xbf\x03\x9d\x1e\x18\x16\x14\xff\x40\xcb\xe6\xbb\x3b\x47\x36\x63\x75\x2e\xa8\x02\x5f\xf7\xf7\x39\xee\x4b\x67\x11\x0f\x96\x80\x89\xb2\x47\x3c\xd0\x44\xd4\x8b\x00\x9d\x06\x77\xf7\x91\xf5\x4e\x2d\xf6\xaf\xdc\x3a\xcb\x9e\x99\xdd\x69\x58\xa4\x50\xc0\xe1\xb6\xdd\x5e\x97\xa2\xcc\x46\x29\x8b\x4f\x48\xac\x6a\xda\xf0\x13\xd7\x5b\x2c\x42\x07\x2d\x2e\xe1\x3f\x73\x36\x87\xee\x83\xc3\xf7\x0c\x4f\xdd\x97\x20\xfd\x17\x98\xc6\x62\xfe\xf3\xba\x01\x2b\xed\xd4\x45\xc4\x72\x9f\x21\x30\x48\x4f\xe7\x7a\xc1\xb4\xc4\xdd\xeb\x81\xfa\xf6\x0f\x76\xe3\xbd\x7d\x21\xa9\xa6\xc5\x7a\x69\xa9\xcd\x9c\xc2\x03\xfc\x63\xb5\x9e\xe8\x4b\x89\x15\xb3\xc1\x8a\x59\x54\xe2\x27\xc8\x6e\xbb\xb7\xd4\xc4\xc1\xa0\x8d\x0c\x5e\x46\x7c\x68\xa0\x69\x70\x75\x1e\xf5\x84\xbd\xd6\x11\xe1\xdd\x1b\x48\x90\x0a\xb3\x54\xb9\x9c\xec\x6e\x1d\xf3\xbd\x41\x46\xea\x07\x55\x35\x0d\xc1\x1c\x3a\x3f\x60\x0d\x47\x0a\x74\xf4\x75\xe4\xfe\xed\xaf\x08\x65\x27\x6f\xa8\xa9\x77\x13\x47\x1d\x0c\xa9\x95\x5c\x71\x35\x88\x33\x9d\xee\x79\x65\x6e\x56\x7e\x6a\xb1\xdb\xf9\x83\x07\x03\x81\x7a\xe6\x20\x92\x9a\x06\x84\xa5\xca\xf2\x0f\xef\x81\xa8\xee\x89\x7b\xe7\xe5\x05\xad\xe6\x49\x6b\x9a\xef\x02\x72\xbd\x8f\x35\x08\x60\x23\x3b\x33\x8c\x2e\x36\xd3\x13\x8d\xb6\x95\x38"}, +{{0x52,0x03,0x54,0xd8,0x5a,0x87,0xd7,0xc2,0x2c,0xa6,0xf7,0x84,0x71,0x44,0x10,0xec,0x98,0xbf,0x6a,0x65,0xf8,0x03,0xef,0x93,0x79,0xbd,0xc8,0x04,0x35,0x9b,0x23,0x49,},{0xd8,0x51,0x1c,0xea,0xc2,0xfd,0x66,0x1a,0xcb,0xff,0xb0,0x1b,0xa2,0x74,0x1c,0xad,0x88,0x99,0x34,0xde,0x63,0x92,0x96,0x1b,0xde,0xc6,0xfa,0x46,0x12,0x3b,0x7f,0x0f,},{0x75,0x4e,0x60,0xd3,0xf6,0xf4,0xab,0x4f,0x5d,0x0d,0xdb,0xb0,0x01,0x53,0x20,0x09,0x16,0x63,0x88,0x48,0x7f,0x78,0x0b,0x76,0xf6,0x0b,0xd0,0xbc,0x9f,0xef,0xab,0xfa,0xab,0x6b,0xe2,0xae,0x78,0x69,0x57,0x3a,0x64,0x79,0x6e,0xf2,0x84,0x6e,0x85,0xe5,0xcd,0xae,0x52,0xdb,0x10,0x44,0xfe,0xfa,0x79,0x6b,0xac,0xf4,0x8b,0x96,0x8b,0x0d,},"\xa1\xd4\xad\x48\x6e\xbb\x7c\x1a\x0a\xcb\x8f\x11\x70\x13\xe8\xe4\x74\x67\x89\xc6\x24\x4a\x56\xc9\xed\xfb\xf1\xef\x37\xac\x13\x09\xaa\xf5\x1c\x93\x75\xfc\x12\xca\xcd\x68\x97\xa4\x47\x95\x45\xf2\xbf\x39\x0a\xb7\xc0\xc0\xe5\xc5\x92\xf5\x50\x6e\x99\x38\x37\x8a\x11\xb6\x36\xbf\x85\x70\x29\xb9\x68\x54\x7a\xa5\x06\xc4\xa0\x82\x9a\x15\xfd\x39\x95\xfe\xad\x4f\x86\x0f\xd7\xc6\x23\xc6\x3e\x86\x95\x43\x6e\xae\x55\x81\x64\x14\x77\x83\x47\x09\x2f\x5f\x4d\x42\x2b\xb1\xb5\xe5\xa0\x69\x66\x24\x1e\xfe\xc1\x4f\x1e\x4f\xca\x06\x63\x91\x14\x71\x8c\x30\xeb\xca\xdd\x4c\x6d\x8a\xbe\x7f\xe9\x3b\x25\xd1\x71\x73\x53\x39\x54\x18\x8b\x1a\xb0\x3f\xcb\x77\x92\xcb\x63\x5c\xe3\x6e\x9b\xdb\xdd\xe7\xa5\x61\xc5\xf6\x69\x20\xd9\x10\xcb\x26\x9c\x8c\x1c\x3f\x59\x32\x65\x09\x00\x72\xc4\x89\x32\xe6\x92\xa9\xc7\x38\xc7\x04\x89\x74\x89\xa7\x15\xc2\xb3\x94\xd5\xa8\x6f\x70\x36\xa4\xca\xc5\xdc\xb5\xb8\x5c\xfa\x16\x21\x56\xe0\xbc\x6b\xfe\x02\xfb\x4c\x38\x60\x8c\xfb\x23\xc9\x2b\x8b\x6a\x3c\xb4\x6e\x48\x7d\x60\xe0\xdc\x97\xaa\x2e\x33\xe3\xda\xda\x92\x5e\x4e\x66\x12\xcc\x5a\xf1\x25\xe5\xac\xa4\x58\x17\xa2\xfd\x6c\x3f\xf1\x0b\x18\x93\x8b\x44\xbd\x4d\xd2\x0d\x7f\xcc\xf7\xf2\x6b\x40\xa6\x6f\x48\xaa\xff\xc9\xa5\x41\xe6\xd3\x71\x38\xfc\x55\x46\x98\x68\xe2\xd1\x03\x65\xef\xf3\x7f\xac\x36\x0f\xab\x3d\xc5\x54\x37\xac\x2d\x8f\xea\x74\x74\x40\x5f\xb3\x63\x0f\x79\x63\xd2\xd4\x59\x58\xf9\x09\xd1\x48\x30\x28\x6f\xf1\x52\xaa\x75\x2f\x51\x0c\xe9\x80\xbd\x57\x54\xe3\xfa\x32\xc6\x99\x24\xdd\x95\xd5\xc1\x52\xa7\x37\xa8\xfa\xdc\xfd\x0a\x45\x60\xe0\xb1\x14\xf8\xe8\xaa\xa6\x18\xd4\x38\xb9\x87\x71\x11\xda\x17\x40\xef\x81\x7c\x44\x19\x39\xec\xec\x79\x9b\xa1\x6b\x1b\x17\x1c\xa9\xb6\x49\xb7\xd7\x8f\xa0\x52\xd1\x49\x7a\x50\x76\x88\xbe\xde\x49\x00\xab\xc5\x3a\x96\x48\xda\x59\x17\x03\x5c\xef\xfe\x0d\xa2\x1c\x25\xc0\x9b\x06\xd6\x18\x5b\xdd\xa2\xd7\x78\xf7\xed\xe6\x15\x3e\x3e\xaf\xf4\x95\xc9\x79\x6d\x4d\x16\x6d\x2d\x2e\xa4\x18\xe4\xa4\xaa\x6e\x67\x8f\xaf\x06\x96\xe7\x52\xa0\x9e\x02\xea\xad\xe7\x63\x07\x0e\x08\x8e\x99\x64\x91\x9f\xf4\xaa\x4c\x82\xf8\x62\x9a\x3d\x5c\x79\x7c\x2a\x64\x59\x4d\x20\x68\x35\xda\x0b\xfa\x43\xcc\xd9\xdd\xfc\xdb\x6a\xac\x4d\x48\x6e\x03\xc8\x41\x22\x37\x59\x39\xa5\x27\x0b\xc1\x51\x9e\x07\x07\xe5\x1c\x3f\x46\xf1\xe5\xc5\x66\xb3\x3a\x24\x5f\xa0\xc2\x02\x83\x84\x72\x36\x3d\xe9\xf0\xed\xde\x2e\x79\x1d\x82\x29\x30\x95\xf7\x50\xbf\xf5\x45\xe6\xc3\x47\x39\xdc\xc5\x4d\xb0\xa3\x6a\xe2\xe2\xaa\x39\xb0\x7c\xb4\xf6\xa9\x64\x62\x40\xd2\xd3\x14\x88\xf6\x78\x15\xb2\x95\x45\xd2\x20\xbe\x92\x9e\x33\x39\xf8\x28\x1a\x93\x7e\x05\xa8\xc5\xc3\x88\x7e\x06\x04\x8e\xa7\xb1\x8a\x48\xf8\xd9\x1b\x1e\x3a\xf5\xca\xb5\xce\xda\x0e\xbd\x71\xbf\x54\xed\xec\x20\x3d\x37\x16\x5e\x4c\x9f\x9f\x80\x46\x1c\xd2\x9f\xcd\x99\xdd\xea\x43\x96\x93\x94\x1b\x5d\x53\xff\x94\x37\x9c\xf6\x42\x57\x1d\xd5\x59\xa1\x1f\x8f\x38\x3d\x94\x3f\x22\x55\xcf\x71\x58\x00\xaf\x77\x6b\x10\x45\xbf\x19\xa9\xc9\xbb\x09\x51\x55\xdf\xb6\x46\xb6\x5f\x4a\x28\x0f\x2a\x97\xef\x92\x7d\xda\xbe\x24\xa2\xf9\x71\xa8\x17\x0d\xd4\x2a\x08\x92\x76\x82\x5c\xb9\x14\x8c\x01\x5a\xae\x1e\x9d\xad\xf2\x2c\x10\xe7\x54\x8c\x59\xbf\x6b\x86\x8b\x20\xe8\x6c\x83\xa9\xe7\x34\x3a\xec\x27\x54\xee\x62\x25\xf9\xfd\xce\xaf\x8e\x51\xc4\x0e\x95\x5b\xda\x49\xc3\x5d\xed\x38\xfa\x8b\xcc\x1e\x6c\x8f\xc9\xc2\x41\x2e\x91\x04\xc5\xc2\x36\x8b\x1f\x99\x23\xe0\x10\xfa\x2e\xde\x91\x1d\x42\xb1\x39\xf4\x00\x7e\x34\x26\x92\x2f\xfb\x61\x58\xec\xa9\x7b\x47\xcf\xc9\x97\x85\x35\x12\xbb\x9d\x4c\xa2\xf0\x17\xc2\xc2\x63\xdc\x19\x9f\x3b\xf1\xeb\x4f\x15\x08\xef\x82\x8b\x0e\x00\xdb\x21\x00\x27\x36\xa7\xf2\x2e\xc9\x12\x98\x19\x45\x83\x13\x9a\xd7\x5f\x58\xe2\x1b\x51\x8d\xaa\x49\xa4\x07\x6c\x63\x75\xfa\xa6\x08\x91\xa6\x9e\x52\xa6\x56\x69\x9d\x80\x34\xa7\xab\x7f\xcb\xe4\x21\x75\x49\x14\x41\xfe\x61\xb1\x78\x3e\x83\x78\x57\x52\x22\x15\xa5\xfa\xc5\x59\x0b\xed\x2e\x9d\x20\x66\x06\x09\x6d\x3b\xe8\xee\x92\x87\x3b\xfc\x30\xca\xb1\x5c\xe9\xf9\x91\x0d\x01\xa1\x17\xf8\x99\x26\xcc\x3a\xfa\x8d\x10\x4f\x79\x9f\xf3\x80\x98\xde\x28\xb8\xff\x0f\x03\x87\x25\xc2\x90\x3b\x24\xc1\x42\x9c\xea\x49\x25\x24\x9d\x87\x81"}, +{{0x06,0x1b,0xcf,0x1a,0xa6,0xfd,0x98,0x98,0x97,0xb3,0x22,0xe5,0x91,0xcc,0xef,0x54,0x54,0xef,0x4a,0x5a,0xdb,0x1a,0x48,0x00,0xf3,0x26,0x11,0xcf,0xf2,0xb5,0xbc,0x78,},{0x73,0xc8,0x0b,0x73,0x4b,0xfc,0x94,0x17,0xd5,0x76,0x89,0x0c,0x20,0x16,0x6d,0xa5,0xc7,0xfa,0xbd,0x61,0x3f,0x75,0x47,0x4f,0x76,0x49,0x73,0x2e,0x00,0x29,0x5b,0xe2,},{0x5a,0xda,0xa9,0x43,0x30,0xa0,0x35,0x37,0x12,0xa3,0x4d,0xbe,0x97,0x3b,0x75,0x18,0xf9,0xa2,0xc7,0x13,0xf8,0xaa,0xd1,0x00,0x25,0x1b,0x08,0x6a,0xe8,0xde,0x26,0xf6,0xd2,0xb6,0xcc,0xf0,0x52,0x8c,0xc5,0xde,0xdc,0xa3,0x18,0xdf,0x19,0xcc,0x7e,0x45,0xde,0xae,0x28,0x1e,0x13,0x24,0xb9,0x6e,0x32,0xfe,0xf4,0x5a,0xaf,0x60,0xb1,0x0c,},"\xd6\x3b\xb9\x20\x8c\x1f\x4c\x7d\x43\x32\x6c\xf3\x5f\xa5\xd8\x39\x33\x15\x18\x04\xab\x89\x1d\x49\xb0\xbd\xaf\x42\x9e\x4c\x39\xa3\x21\x42\x8e\x0d\x90\xaa\x00\x31\x8b\x97\xe0\x8c\x70\x24\xc9\x12\xcf\x38\x88\x79\xf3\xcf\x97\x4b\xb2\x53\xa1\xe7\xa4\xc8\xee\xc1\x93\xbf\x4c\x14\xaf\x6f\xb9\x79\x4d\xf0\xd4\x97\x85\x0e\xdb\x04\xd5\x74\xc9\x7e\xd7\x6c\x70\x21\x39\x96\x84\x01\xb4\x0e\xb5\x43\x94\xef\x4c\xfa\xa7\xe5\xd3\xcd\x94\x3a\xf1\x21\x92\x53\x8d\xde\xe5\x93\xc2\xa2\x4a\x26\x7a\xfa\x13\x71\xfd\x77\xfe\xee\x20\x71\xf4\x36\x9f\xbe\xf8\x79\x76\xe7\xeb\xd8\x1d\x1e\x5b\x31\xd6\xe0\x9e\x02\xd8\x30\x35\x7d\x36\xbf\xf8\x59\x67\x03\xe4\x14\x6d\x08\x27\xbe\xc9\xc0\xf8\x7b\x26\xf3\x11\x95\xc9\x6c\x93\xb6\xd8\xc4\x67\x67\xec\x1b\xc6\xde\x39\xf0\x00\x8a\x41\xff\x87\x5d\xa0\x50\xa3\xf8\x65\xab\x92\xcb\xf2\x9c\x38\xa2\x80\xf3\xbf\x69\xf6\x8e\x92\xb5\xf4\x30\xcd\xee\x35\x01\x98\x1d\x0b\x3d\x18\x90\x96\xe0\xae\xac\xd6\x4c\x33\x10\x24\x21\x34\x88\x12\x15\x8b\xb6\x1e\x51\xae\x93\x65\x92\xb2\xf8\xf1\xb9\x10\x94\x9e\xf3\x72\x32\x58\xa9\xb4\x4e\x4e\x1b\xda\xdf\x1a\xe2\xcf\xc1\x8e\x37\xd2\xed\x0d\xd1\x73\x44\x04\xb8\xba\xa5\xf3\x93\xcd\x56\x06\x9e\xce\xbf\x7e\xdd\x7c\x06\xcf\x6c\x8a\xa3\xe8\xe1\x2f\xbf\x94\x6d\x7b\x32\xd8\x45\x3b\x6f\xbb\x65\x35\x52\x6c\x8f\xb8\xfc\x1d\x58\x15\x56\x0b\xb3\x1b\x99\x5d\xf2\xad\xbd\x83\x6a\xdd\x92\x9a\x56\xfd\xd9\x3a\x17\x47\xd9\x3a\x40\xc0\x5e\x12\x9e\xb6\xf8\x58\x3c\x29\x21\xcc\x9d\xbd\xda\x42\x25\xe1\x76\xdb\x38\x6a\x02\xec\x40\xaf\x10\x32\xc9\xb6\x2e\x95\x14\x70\x25\xf4\xac\x8d\xd5\x84\x33\xb6\x4a\xc0\x73\x15\x0c\x69\xb9\xc4\x15\x4d\xcb\xb0\x03\x44\xf3\x08\x11\x3c\xd9\x19\x9c\xcf\xb5\x07\x58\x01\xc7\x05\xb8\xfc\x43\xb7\xc8\xbc\x16\x73\x65\xe4\x62\x93\xd0\x6c\x4f\x48\x35\xc6\x4e\xe5\xd5\x38\x3f\x68\x90\xca\x35\xa8\x0a\xf9\x17\x74\x81\x62\xdf\x25\x18\xab\x14\x68\xf1\x53\x62\x98\x99\x40\x6c\xde\x66\xce\x07\xfa\x7d\x29\x93\xda\xbe\x0c\x60\x08\x9c\x91\x89\x24\x88\xf3\xbc\xaa\xec\x40\x8a\x0c\xd0\x8c\x9a\xa9\x8e\x09\x37\xe0\x2c\x41\xad\x52\xd2\x41\xa9\x98\x33\xe3\xb8\x3f\x7d\x3f\x1b\x07\x8c\x31\xd4\x5c\x34\xfa\x01\x75\xab\xbd\x0f\x32\x2b\x8f\xd2\xdc\x83\x49\x1d\xa2\x92\xad\x00\x76\x2e\x3e\x57\x7b\x9e\xee\x0a\xae\x08\x72\x90\x70\xac\x25\xe3\x3b\xc9\x45\x25\xbc\x0d\x2a\xb5\x97\x04\xef\xec\x5c\x01\x48\x42\x1a\x47\x92\x8d\x34\xb1\xe4\x5c\xe7\x21\xee\x64\x47\xfb\x08\x2a\xc4\x00\xb3\xe6\x84\x6d\x20\x4f\x7f\x9d\xb6\xf0\xa3\x2b\x2a\x69\x73\x8b\x3e\xe9\xdd\xbb\x0d\xbd\x7e\x0f\x04\x1d\x7e\xa5\x3a\x5d\x64\x7f\xb5\x0b\x39\xae\x24\xd7\x8c\x8b\x07\xcf\xc4\xe0\x52\x71\x1f\x0d\x46\x39\xe7\x21\xd5\xc3\x6f\x31\xb5\x88\x86\x67\x12\xb7\x57\x10\x8a\x40\xcc\x7a\xbb\xb9\x91\x30\x83\x30\x3a\xae\x05\xa0\xf1\xaf\x0e\xc6\x87\x84\x41\xa2\x5c\xf8\x72\x9a\xba\x42\xa3\xa9\x4c\xe9\xb7\x38\x88\xa0\xf5\xc9\xe4\x0c\x9f\xc4\x54\x10\xf0\x68\x1f\xa7\xf9\x08\x98\x56\x2c\xcb\x4b\xbc\x55\xf0\xab\x1f\xe9\xc7\x0e\xa6\x60\x26\xdd\xa8\xd7\x09\x0f\x7b\x38\xed\xb5\xae\xc1\x55\x7b\x11\x66\x98\x7c\xd4\x1a\x70\x59\xcd\xee\x60\x9b\x74\xd8\xfe\x06\xb7\x05\x9b\x77\x24\xbf\xf5\x30\x07\xf7\xe1\x10\x46\x2f\x06\xad\x14\xd0\x7e\xe1\xb4\xd6\x9a\xc8\x23\xbc\xf5\x76\xd2\xfa\x9e\x2e\x8e\xd7\xf3\x19\x80\x40\xd4\x71\x29\x60\x63\x13\x7c\x98\x1a\xdb\xf3\x64\xcb\x20\xf0\xa1\xad\x20\x54\x47\x2f\x7c\xee\x25\x27\xf9\x98\x09\x61\x5d\x2e\x4b\x73\x4b\x06\xf3\x5d\xee\xcb\xd6\x26\x19\x66\x3d\xde\x81\xd6\xe2\x35\x28\xb0\xc9\x71\x32\xaf\x0a\x23\xba\xd6\x3d\x9c\x08\x14\x2a\x26\xe2\x74\x3f\x86\x18\xec\xfe\x72\x3b\x19\xff\xdd\x0b\x19\xab\xd9\xa3\xf4\xfe\x21\x0b\x1e\x71\xac\xdf\xe3\x8a\xbe\xbe\x23\xf7\xfd\xef\x66\x38\x1c\xbc\x75\xf3\x07\xe5\x57\x72\x35\xb0\x2e\x4c\xd9\xcf\xaa\x15\x03\x08\x68\xed\x14\x53\xda\x58\xf7\x83\xb7\x35\x2b\x04\x65\x68\x44\xc0\x42\x44\x1e\xfe\x6a\x3b\x4f\x8f\xec\x8f\x7d\xe8\x07\x44\x54\x0c\x4f\xc7\xa1\x07\xf4\xe1\xbf\xcb\xd9\x9d\xa2\x5b\x97\x46\x09\x5d\xdf\x01\x25\xd5\x6d\xa7\xe7\xf8\x60\x3f\x04\xd3\x59\xa0\x88\xb4\xc0\x44\xf9\x36\xcc\xb7\xd8\xf8\x9e\xd5\x3c\xc9\x91\xa3\x49\x7c\xa9\x52\x09\x4f\xf3\xc3\x30\x46\xf2\x60\x9d\x07\xb2\x9b\x63\x39\x81\x36\x9c\xb2\xf0\xee\xcd"}, +{{0x2e,0x19,0xcd,0x44,0x2f,0x22,0xa4,0xa9,0x9d,0xff,0xc5,0x5e,0x7b,0xf6,0x25,0xf8,0x9d,0x13,0x44,0xb5,0x63,0xf6,0x78,0x53,0x13,0xa7,0xee,0xe9,0x73,0xb4,0xaa,0x36,},{0xee,0x3d,0xa7,0x6a,0x8f,0xcf,0x40,0x3a,0x29,0x58,0xd4,0x55,0x1d,0xa0,0xa7,0x2b,0x2e,0x73,0x85,0x22,0xb2,0xe6,0xb2,0x0f,0xba,0x6a,0xa2,0x6b,0x32,0x30,0x73,0x57,},{0x28,0x32,0x6b,0x5b,0x97,0x8e,0x0d,0xbd,0xab,0x5d,0xde,0x70,0x37,0x85,0xa6,0x67,0xa7,0xef,0x43,0x9d,0x81,0xea,0x47,0xe0,0x66,0xb0,0x89,0xd1,0x16,0xc2,0x5a,0x34,0xbb,0x63,0x3f,0x26,0x0d,0x55,0xf4,0x5b,0xdf,0x6b,0xcd,0xa7,0x48,0x03,0xd7,0x62,0x4b,0x19,0x27,0xce,0xc1,0x8e,0xb1,0x99,0x22,0x60,0xbe,0xef,0xc3,0x99,0xd9,0x0e,},"\x1b\xfc\x5c\x6a\xa6\xa5\x35\x4f\xbb\x86\x14\x69\x79\x63\x48\xac\x63\x19\x12\x4d\xa3\xf1\x0d\x20\xd5\x0b\xbd\xc7\x15\x9d\x41\xb5\xab\xb1\x36\xc7\x99\x6a\x77\x37\x97\x12\x2b\x52\x5e\x8e\x2d\xca\x19\x54\xf6\x39\x17\x07\x30\x1d\x90\xf2\x10\x1b\x46\xc7\xb0\x86\xef\xa1\x58\x77\xca\xdc\xd0\x58\x12\xdb\x34\xb9\x96\xcb\x4f\x53\x1a\xbc\xd1\xe9\x8d\xb0\x8a\x5c\xf1\x36\x8e\x8f\x4b\x11\x09\x14\x2e\x95\x62\xbd\x00\x85\xff\xae\x5e\x66\x0f\x59\xc9\x30\x79\x3e\xbd\xb6\xe8\x0b\x0a\x2f\x4f\x3f\x59\xbf\x9d\x39\x5c\x48\xd2\x6e\x0a\x72\xa6\x0f\x9d\x1f\xf8\x7f\xd2\xd7\xa3\xf5\x38\x3a\xa9\x02\xad\xed\xed\xeb\xc6\xcd\x1b\xef\xd0\x38\x33\x61\x62\x74\x9d\x91\xa9\x57\xca\x2e\x3d\xd4\x70\x91\xc5\x59\x31\x13\xda\x87\xc3\xd6\x6a\x02\xc8\x0a\x6e\xdd\xb5\x35\xc4\x8c\xa1\xf3\x4a\x97\xfd\x1c\x95\xeb\xc2\xe5\x70\xfc\x8f\xaf\xe6\xe5\xd6\x54\x6d\x1f\x3a\x9b\xa8\xda\xac\x33\x4c\xf4\x7b\xf1\x17\xe1\x28\x0d\x0e\xbd\xf1\x4b\x0f\xcd\xbb\x43\xb8\xd2\x48\xcc\x6b\x61\x32\x0f\xdb\x04\x49\xed\x5f\x5d\xe8\xba\xb1\x21\xaf\x0d\x85\x54\x95\x6e\x6a\x12\x01\x6b\x42\x67\x7b\x44\x36\x78\x92\xc3\xb2\x0a\xfc\xc2\xcb\x9c\xfb\x5b\x10\x0a\x95\xb5\x1e\x8b\x07\xda\x9f\x51\x41\x5f\x4c\xd7\x78\x1a\x31\x37\x65\xe2\x0d\xb2\x7f\x23\x43\xe0\xf7\x19\xec\xea\x9a\xf0\x26\x95\x6f\x33\x87\xe9\xea\x7e\xd0\xa2\x93\x75\x9b\x4a\x26\x22\x02\x80\x7b\x41\x30\x9f\xb8\x0f\x50\x18\x5d\xb6\xa5\xf8\xbd\xca\x17\x88\x41\xbe\xc0\x6a\xdd\xc7\x61\x0d\xf7\x60\x17\xb5\x14\xbc\x41\x42\xf2\x6a\x36\xbf\x5b\xac\xec\xb0\x12\xfa\x41\x71\x0d\xd8\x49\xbe\xf7\xa7\xe4\x51\x43\x28\x36\xfe\x9b\x32\x65\xfd\x5b\x59\xee\x40\xb0\x4d\xad\x85\xcf\x48\xf8\x91\x46\x5a\x84\x2c\xd4\x50\x0a\x10\x24\xee\xfd\xf0\xf5\x54\xf0\xca\x17\xec\x9f\x7b\x71\x52\x56\xa9\xb9\xdb\xe2\x79\x66\x38\x6d\x8a\xc3\x7d\x3c\x51\x58\x96\xde\x0f\x7c\xdf\x7c\xf5\xb3\x20\xff\x7a\x8e\xf6\xb3\x4b\xa8\x20\xab\xa9\x06\x6d\xd2\x53\xc5\xb7\x76\x37\x77\xf9\x4b\x2d\x6a\xd8\xc7\x10\x22\x1e\x11\x37\x53\x5d\xff\x8a\x1b\x75\x65\xec\x81\xbd\x8d\xde\xb5\x02\xe3\xd5\x8f\xf8\xf1\xfe\x6e\x86\xb8\xdc\x15\xa3\xaa\xec\x68\x8b\xbb\xec\xd4\x68\x82\x81\xdb\x0f\x81\x8d\xe0\xf7\x26\x1b\xa9\xcc\x58\xc8\xbc\x0d\x02\xe0\x66\x32\xef\xe7\x28\x7a\xd7\xa8\x43\x31\xa8\x24\xd9\x28\x73\x44\xef\xaa\xa7\x4f\x1f\xc5\x76\xd0\x26\x94\x30\xf8\x56\xa8\x56\x52\x65\xb9\xd6\xef\x71\xfe\x13\x4d\x25\x10\xab\x06\xb6\x0b\xf3\xc1\x53\xb5\x7e\xcf\xd2\xe6\x34\x24\x03\xfe\x67\x8b\x58\x86\xb6\xb7\x34\xb7\xd3\x69\x06\x62\xb6\xc8\xc6\xf6\xe2\x50\xe5\xaf\x6a\x81\x83\x16\x6d\xdc\xd0\xa1\x7f\x0c\xdd\xc8\x63\x6e\xf1\xa6\x84\x98\xbe\x50\xb6\x59\x95\x39\xd4\x6b\x4c\xea\x97\x13\x0e\x08\xf9\x4c\xa5\x3e\x88\x46\x44\xed\xa7\x5d\x23\xcd\x2c\x03\x8a\x5f\x17\xb5\x91\xe2\x13\x69\x37\x8c\xd3\xfb\x57\x62\xd1\xa7\xc3\xe6\x6a\x11\xae\x6e\x91\xcb\xae\x61\x6a\xd0\x55\xe3\x9d\xc4\x1e\x15\x4f\x4f\xce\xd7\xb2\x69\x6d\x9d\xc6\x73\x80\xbb\x8e\xef\x47\x4e\x9a\xa8\x3c\xec\x47\xfa\xfa\xfb\x94\x1d\x62\x65\x64\xb2\x07\x5b\xcc\x08\x56\xda\x8d\x6e\x1b\x0b\x8f\x18\xba\xf7\x51\x3b\xbd\x14\xe4\x91\xed\x51\x79\x68\xc4\xf7\x24\x1a\xf2\x50\x98\xee\x8d\xf1\x30\xb7\xa3\x4d\x59\x73\x6d\x78\x36\xd3\x23\xfe\x3f\x43\xf5\x08\xcd\xcb\x75\x58\x95\xf5\x9a\x00\xc8\x04\xed\x16\x4c\xc3\x39\x92\xf3\xae\xe9\x62\xae\x9e\x99\x0b\x74\x27\x2e\xb9\x87\xb1\x2d\x90\xb2\x73\x14\xd5\x74\x00\xe7\x37\xd1\x34\x3e\x97\x09\x85\xc4\x27\x10\x60\x87\x6a\xbc\xd7\x04\x9e\x7c\x9f\xe2\x44\xff\x3e\xf9\x85\x60\x99\x5b\x74\x82\xd3\x1b\xc7\xc0\x9d\x99\x69\xf7\xcd\x41\xf4\xe4\xe2\x52\x75\x0d\xc1\x6c\xcd\xb2\x9b\x98\x53\x14\xa0\xb6\xe7\x49\xc9\x5f\x9b\xd2\x83\x8d\x5a\xc4\x9e\xe0\x31\xfd\x07\x9b\xec\x30\x28\xdd\x9d\xd0\x7d\xb6\xfa\x62\x2a\xd6\x21\xb3\xb1\xe1\x27\xe8\xfc\xa3\x7b\xd1\x46\xe3\xcf\x70\x3e\x91\x17\x01\xb7\xa1\x6c\x2d\x30\x36\x9c\x94\x64\x8e\xcc\x03\xdf\x10\xd7\xdd\x5c\x05\x58\xfa\x95\x93\x42\x5d\x94\x87\x27\xd6\x86\x0c\x3a\x14\xf8\x11\x24\x51\x06\x61\x6d\x2a\x5f\xa9\x81\xc6\xb7\xf4\x7e\xc9\xde\xf6\x54\x12\xd1\x32\xac\xc6\x91\x9d\xa4\xe8\x85\x97\xaa\x91\x90\xca\x61\x4b\x21\x80\x66\xa0\xf7\xb1\x69\x97\xee\x74\x7c\x5a\x09\x78\x5e\x50\xd0\xa8\x91\xd9\x59\x37\x86\x3d\x61\x3c\xef\xf7"}, +{{0x82,0x10,0x90,0x99,0xd1,0xea,0xfe,0xed,0x5a,0x85,0x20,0x60,0x46,0x49,0x1b,0x34,0xd0,0x6d,0xcd,0xe3,0x3f,0x08,0x09,0x60,0x28,0x7b,0x10,0xfb,0x23,0xff,0x9f,0x78,},{0x08,0x1c,0xfd,0xf2,0xd7,0x58,0x65,0x4c,0x41,0xc4,0x47,0xe1,0xe6,0x27,0x38,0x10,0xf8,0xa7,0x38,0xa7,0x33,0xaf,0xc4,0x22,0x94,0xa2,0xb1,0xbb,0xb7,0x69,0xef,0xce,},{0xb3,0x98,0x7f,0x32,0x4b,0xc7,0xe7,0x76,0xc0,0xf2,0x87,0xfa,0x13,0xad,0x28,0x74,0x16,0x95,0xe2,0xe7,0xbc,0xe8,0xd1,0x43,0xe2,0x9f,0xad,0x5d,0x00,0x99,0x47,0x58,0xe2,0x25,0xfb,0x80,0x21,0x00,0xd2,0x3f,0xd6,0xcc,0xaf,0xee,0x8e,0x0a,0x95,0xbc,0x47,0x9b,0xe8,0xc2,0x3a,0x11,0x31,0x97,0x45,0x76,0x5b,0x7c,0xd4,0x7e,0x70,0x06,},"\x84\xf4\x7d\xd7\x94\x97\x7a\x6c\x15\x05\xac\x8c\x05\x68\x0c\x56\x15\xa2\xd5\xb0\x57\xe3\x9b\x04\xf8\x5e\x3f\x9f\xf0\x49\x60\xe0\xe0\x16\x68\x5a\x86\xee\xbc\xec\xf6\xfb\xce\x5f\xdd\xcd\xac\x1a\x47\x4c\x8a\x0d\x50\x2c\x40\xe1\x0f\x94\x86\x46\xfd\xac\x6c\x81\xf1\xff\xbb\x17\x7a\x2a\x49\x63\xb6\x78\x25\x90\x3c\xde\x65\xb5\xdb\xe0\xd8\x94\x1d\x54\x6c\xff\xa2\xbf\x8a\x8c\xa8\xd6\xc6\x40\x85\x30\xa6\x29\x0f\x5d\x08\x82\xf1\xa1\x67\x2d\xbf\x97\x8e\x10\xc5\xc8\xaf\x5e\x0a\x62\x39\xf0\x65\x5e\xe7\xfd\x9e\x66\x96\x30\x77\xa0\xe8\x47\x13\x73\x97\xd1\xf0\x69\x99\xdc\x6f\x8a\x94\x5c\x60\x03\xea\x4e\xa7\xfd\x58\x37\x8a\xcb\x44\xed\x57\x80\xea\xa3\x67\x79\x6b\xee\xa3\x7d\xdc\x23\x69\x99\xd0\x12\xd6\xa7\x16\xd7\x91\x56\x49\xcc\x28\xe5\x88\x75\x64\x7e\x9f\x5a\xc0\x55\x3c\x0f\x54\x4d\xf5\x64\x69\xc6\x70\x81\xd5\xe3\x03\x95\xf3\xe9\x60\xe6\xa5\x2f\x08\x33\x19\x2c\x54\x8c\xd5\x7c\x92\x6b\x82\xdb\x48\xc3\x61\xbd\xe7\x03\x33\xa3\x70\x08\x3e\xaa\xa0\x68\xdc\x2a\xe4\x52\xd2\x1e\xf1\x33\x1a\xed\x19\x0b\xd3\xe1\x28\x9a\x10\x4c\xf6\x67\x83\x43\x77\xcf\x7b\x5a\x29\x77\x48\x07\xc3\xf1\xea\x9e\x7b\x28\x83\x1d\x0f\x6c\x42\x94\x78\x58\x67\xb1\x37\xb6\x50\x28\xc1\x4f\x93\x2a\x1b\xa8\xe6\xf9\xf5\x96\x24\xfe\x0c\x39\x68\x43\xea\x19\xe4\x6f\xba\x09\x14\x2c\xf9\xd4\x24\x97\x31\x2f\x36\x02\x44\x03\x2f\x1e\x00\xf3\x8d\xd0\xde\x29\xf9\x63\xb5\xcc\xc1\xef\x12\xb2\xcc\x62\x04\xb9\x94\xaf\x1f\x3b\xaf\x19\x6d\x9e\x21\xe8\xfa\x4f\x09\x73\x20\xc6\x44\x04\xd0\xb7\xd5\xab\x38\x56\x0c\xa0\x65\x53\x64\xb0\xb0\x9c\xd6\xdc\x0f\x0e\x05\xb8\xc9\x11\x03\x64\xf1\x42\x4a\x96\x72\xb7\xef\xdf\x7e\x1f\x37\x8e\x23\x45\x50\x56\x6d\xbe\x13\xb0\x15\x78\xb0\x41\x53\xe9\xc3\x7b\x55\x3e\x32\xa4\x44\x1b\xc9\x7e\x29\x53\xbe\xc2\xe4\x14\x55\x51\x0f\x98\x02\xef\x94\x8d\xcb\xf1\x3f\xad\xdd\x72\x2e\xde\x57\x36\x27\xb2\x58\xd5\x5e\x83\xc0\x89\x5b\x22\x91\x9e\x4b\xe5\xce\x8d\x81\x9c\xe6\xad\x84\x3b\x2d\xd0\x9d\xf6\x40\x04\xc8\x26\xc1\xdd\xe7\xce\x64\x80\xa2\x71\xa8\x58\xa1\xdb\x16\x9e\x14\x94\xd4\x46\x90\x32\xbc\xc1\xcc\xd8\x96\x53\x19\x8b\x7c\x07\x3f\x76\xa2\x6a\x29\x99\xb5\x64\x8c\xba\xdc\x15\x74\xc7\x8e\xad\x8e\xec\xe8\x3b\x91\xe1\x29\xc4\x37\xf9\xee\xec\x04\xc8\x07\x45\x90\x02\xe6\x6d\xcc\xa9\xbf\xc2\xca\xed\x9e\x6c\x0b\xa2\x3d\x23\x55\xde\xf7\x56\x65\x74\x94\x30\xee\x92\xc5\x32\xa6\x95\x47\x9f\xec\x92\x91\x74\xf4\x40\xec\xb6\x1a\x5a\xe8\xb2\xb7\xe9\x58\x92\x05\x58\x26\x89\x78\xf7\xfb\x4d\xa1\xb3\x8b\x12\x01\x4f\x5d\x61\xb0\xfd\xd7\xf6\x13\x6b\xa4\x28\x1b\x41\xa3\xa3\xcd\x18\x80\x52\xb6\x98\x76\x5b\x6f\x05\xe4\x1e\x78\x37\x3e\xa8\x30\x46\x97\x87\xa3\x75\x10\x99\x3d\x12\xf9\x3e\x96\xc7\x2d\x72\xf4\x46\x19\x84\xf6\x91\xa4\x1c\x7d\x33\x97\xdd\xd5\xa1\xb3\x92\x37\xd1\x30\x88\x64\xd4\x15\xfc\x6c\x22\xb6\x3f\x37\x6c\xed\xde\x37\xf5\x25\x2b\x51\xec\x72\xe5\x15\x5f\x3b\xdb\x4f\xcd\x54\x12\x49\x8b\xd2\xe0\xc1\xf9\x85\x0b\x3a\x85\xd1\xdf\xd2\x51\x67\xa3\xcd\x77\x1e\x8e\x4c\x9d\x86\x8c\x95\xa7\x17\x5e\x37\x75\xf6\xce\xf1\x7e\x4e\x36\x49\x7c\xe9\xe4\x55\x32\xbd\x7f\x44\xb2\x77\x6e\x40\xf9\x1a\x07\xca\x4f\xa1\xb9\x5d\xbe\x81\xcf\x8f\x49\xe4\x6b\x6c\x82\xa6\xee\x43\x47\x91\x8a\x76\x43\xb0\xd9\xa3\x88\x57\x21\x2c\x69\x3e\xad\xac\xfd\x37\xa5\xf1\xd9\x15\x58\xf5\x45\x4d\xcd\xd0\x59\x35\xf2\x90\xe6\x2d\x7e\x65\x00\x6c\xd5\x49\xf6\x55\x3c\xe7\x41\xdf\x44\xd3\x96\x44\x00\x1e\xb4\x79\xca\x69\x56\x8a\xd1\xf2\x3b\xba\x09\x9a\x41\xa4\x72\x94\xdb\x93\x87\x31\xc5\x30\xaf\x1c\xeb\x92\x17\xd2\x9b\xc2\x70\x56\x13\xc1\xa1\xfe\x9c\x20\x8d\x0b\x01\xba\x6f\x4d\x9b\x4c\x7b\xa8\xf0\x21\xdf\x91\xea\x2d\x57\x8c\xe0\x83\x12\x3e\x83\xba\x4b\x9c\x50\x40\x7f\x66\x66\xfb\xe6\x11\x58\xb0\xd1\xb9\x57\x77\x72\xe3\xea\xff\x8f\xb4\x29\xd0\xf6\xd2\xe3\x84\x12\x61\x30\xf2\x1b\x44\x9f\xb1\xdc\x17\x0d\xb4\x5a\xf5\x05\xbd\x31\x82\x67\x8a\x9b\x5f\x9f\xdf\xf6\x5f\x04\x13\xb6\x72\xc4\x78\x63\x40\xfc\xf2\x52\x2e\xa7\xf3\xd8\xad\xe8\xa0\x59\x52\x96\x49\xdb\xda\x9c\xe5\x1f\xf0\x5a\x2a\x2a\x3d\x66\xd2\x16\x6b\xf2\xc9\xc6\x77\x2b\xa0\xef\x41\x05\xe6\x8c\x05\x5e\x02\x13\xd4\x2c\x1e\xe1\x23\xb3\xc1\x21\x78\x43\xe6\xec\x57\x5d\x75\x4d\xf3\xc9\x0a\x75"}, +{{0x65,0xfc,0xbd,0x62,0x6d,0x00,0x21,0x11,0x33,0x4b,0xaa,0xd4,0xe6,0xa8,0x00,0x6e,0x47,0xa1,0xf9,0x13,0x97,0xbe,0xe6,0xdd,0x6c,0xd7,0xda,0x5a,0x0e,0x02,0x48,0xa4,},{0x20,0x40,0x9a,0x14,0x6b,0x42,0xc9,0x6b,0xea,0xb0,0xb4,0x2e,0xa7,0xf2,0xc2,0x51,0x93,0x11,0x9d,0x0d,0xf4,0x4d,0xc2,0xbf,0x14,0xd1,0x1a,0x32,0xfd,0x73,0x36,0x15,},{0xbc,0x78,0xe1,0x6b,0xa6,0x74,0xe0,0xa7,0xdb,0xa5,0x7a,0x19,0x09,0x4f,0x97,0x33,0xc5,0x5d,0x74,0xb9,0xd1,0x5f,0x8a,0x44,0xd1,0xbb,0xc0,0xa0,0x23,0xf7,0x01,0x55,0xde,0x29,0x77,0x11,0x1a,0x41,0x7e,0xef,0xa8,0xcb,0x30,0xec,0x12,0xab,0xc8,0x38,0x42,0x28,0x16,0x7c,0x70,0x98,0x2a,0x82,0x06,0xb1,0xff,0xb7,0x21,0x74,0xaf,0x01,},"\xe4\xc0\x94\x7f\xc8\xca\x78\xfa\x88\x63\xf4\xd0\x44\x49\x9d\x03\x6e\x2e\x7e\xf8\xc1\x7e\x83\x8f\x2f\xac\x02\x67\x5b\x7b\x53\x81\xe5\xf9\xab\xce\xaf\xd0\xd8\x88\x6a\x92\x9d\x9d\x9b\x49\xfc\xb7\x38\x61\xb2\x9d\x15\x18\xac\x5f\x83\xf7\xf8\xfc\x26\xbd\x1c\xeb\xc2\x2d\x87\x3a\x9a\x08\x23\x14\x06\xfb\x03\x2e\x48\x66\xe5\xf5\x5c\x7c\x04\x41\xc5\x19\x04\x1b\xb2\xcc\x73\xf9\x22\x6d\xd5\xd0\x7e\xce\xb6\x60\xd6\xc9\x67\xdb\x23\x36\x55\x74\xbe\xe8\xfc\x10\x22\x29\x28\x76\x77\x13\x57\x1a\x71\xc9\x3a\x85\x27\x8d\x42\x29\x9a\x70\x59\x9c\xa9\x93\x26\xcc\x86\xf6\xd9\x8d\xaa\xc0\x00\xfd\xfa\x71\x05\x62\xf4\x81\xfa\xa0\x20\xc7\x2a\x76\xe2\x06\x7d\x15\x4c\x23\x5a\x7a\x4f\x29\x70\x8c\xc5\x44\x53\x3b\xd7\x99\xed\x63\x63\xeb\x3b\x56\xaa\x4a\x6d\x0e\x37\x9b\xbf\x07\x60\x05\x95\xc2\x3a\xb1\xf3\xf9\xf1\x70\x8e\x00\x70\x26\x1b\xbb\xf4\xbf\xea\xf6\xd6\xce\xd4\xd7\xff\x72\x2c\x9c\xc5\x2d\x91\x33\xea\x68\xd4\x95\xdc\x94\x89\xc3\xed\xf6\x83\x02\x31\x35\x1f\x65\xcb\x52\x72\xf5\x39\x6e\x2c\x4a\x1a\x5c\x88\x66\x1a\x10\x18\x92\x24\x9e\x23\xd6\xce\x9f\xdb\x6a\x9a\xbf\x74\x27\x2c\x2f\x59\xc3\xd8\xfd\x87\x43\xcc\xe4\x61\x12\x6c\xa0\xa8\xb8\x32\xb4\xb2\x18\x33\x6b\x1a\xe1\x4d\xa6\x77\xba\x7f\x1b\x2c\xc5\xca\x3c\x71\x58\xf7\x27\xa9\xe1\xb8\xfd\xd9\xed\xf5\xc2\x18\x7f\xcb\x83\xdb\x86\x2a\xd0\xc6\xb3\x92\x16\xde\x31\x16\x91\x95\x56\x46\x51\x00\xad\xe0\xa4\x2b\xd6\xba\x10\xd9\x54\x18\xb6\x9a\x3e\x00\x5e\x9f\x10\x45\x89\xea\x59\x48\xb2\xb5\x1b\xc7\xb1\xa9\xa0\x74\x9d\xa8\xf0\x13\x78\x1b\xc0\x5c\x80\x5b\xb5\x1e\x18\x77\x61\xac\x24\xc7\x64\x14\xf6\x68\xeb\x45\xfb\x0a\x50\x24\xdf\xe5\xa5\xca\x06\xf0\x40\x3a\x02\xe3\xb2\xfe\xf7\xa2\xc4\xbc\xfb\x1d\x07\x5d\x31\x0d\x51\x97\xe6\x59\xcd\x14\x02\x3f\xae\xc2\x0e\x04\x5c\xab\xcb\x86\xb2\x21\xa1\xd4\x82\x71\x13\xff\x32\x67\xa6\x4d\xeb\xe9\x93\x90\x04\xca\xba\xc8\x5e\x5c\x74\x61\xe7\xe8\x2a\x97\x5a\xcf\xae\x0b\x6c\x51\x6a\x1c\x60\x53\x74\xcf\xea\x7d\x81\x90\x44\xef\xd6\xd7\x46\x54\x42\x4f\xd5\xc9\x0f\xf2\x57\x4f\xcd\x8e\x00\x77\x40\xd9\x75\x86\x1d\x0d\xf5\x25\x9f\xe4\x3e\x43\x63\x9e\x36\xe5\x28\x95\x43\x9b\xa2\xc2\x7c\x1e\x88\x9c\x93\x09\x41\x04\xfe\x91\x49\x21\xbd\x6f\x25\xd3\x98\x5a\xb1\xf2\x2c\xa5\x57\xb0\xe4\x9a\xfc\x73\x75\x24\x3c\x52\x1c\x6d\x5f\xaf\xe0\x38\x1c\xce\xa8\x28\xe8\x8e\x64\x7f\xd9\x09\x76\xb3\xfb\xec\x19\xfe\x9a\xdb\x11\x3c\x64\x04\xbd\x35\x2b\xfc\x00\x04\x46\xd2\x10\x05\xb5\xf9\x50\xae\x07\xe5\x1c\x76\x8c\xa3\xff\x61\x77\xb2\xea\xc5\x0f\x10\xdd\x2e\x64\x61\x0f\xa8\xab\x57\x88\xfa\xee\xe2\x9d\x12\x90\x09\xd7\xfe\x46\xaa\x3d\xa6\xb9\xd8\x6c\x73\x06\x5e\xb5\x16\x1f\xbd\xbd\xfa\xc5\x77\x7c\x4e\x75\x45\x2e\x6e\x16\xae\x9f\xd6\x6b\xb7\xd9\xaa\xa4\x26\xbc\xb7\xa6\x91\x5f\x0f\xf4\x4a\x1f\x8e\xc7\x13\x94\xe9\x35\x2f\xdf\x20\xe0\x2f\xaf\xe1\xe0\xce\xfe\x50\x74\x4c\x31\x94\x95\x6f\x92\x8f\x82\x53\x37\x55\x37\x38\x38\xdc\xc1\x29\x6a\x89\x1a\xdf\x64\x1c\x73\x82\xd6\x9b\x4f\x5a\x43\xd4\xaf\x77\x72\xa4\xa1\xee\x87\x92\x92\xd7\xa4\xf3\x2a\xc3\x5e\xe1\x21\xc6\xc3\x4c\xa5\xf9\x84\x87\xa9\x41\xfc\xb1\xe6\x5b\x44\xd4\x45\x61\x27\xee\xdb\x2f\xcc\x1c\x3f\x48\xef\xf9\x30\x09\x81\xe5\x2a\xc3\x8b\x49\x6a\xb8\xbb\xce\x14\x4a\x85\xeb\x9c\x07\x63\x8b\x31\xfd\xaa\x78\x17\x44\xbc\xe1\x7e\x8d\x93\xdc\xdc\x60\xaf\xed\xa4\x88\x80\x76\x17\xf8\x8d\x6a\xa5\x44\x22\xfd\x34\x7d\xda\xdd\xef\xf3\x7a\x56\x3d\xbf\x19\x97\x4b\x2a\x23\xbe\x30\x0f\xbf\xa6\xc7\xfc\x41\xf8\x4c\x69\x05\x41\x52\x69\xf1\x95\x99\x0b\x5b\x4d\xe1\x26\x68\xc7\x1c\x87\xb5\x04\xf4\x11\x24\xbf\x94\x43\x6f\x33\x30\x45\x63\x15\x18\x15\x2c\x51\x62\xa2\x47\x5c\x40\xef\xb6\xcb\xda\xaf\x9a\xf4\x28\xfe\xd3\x25\xb3\xa7\xd9\x4c\x17\x52\x0f\xd8\x9e\x00\xdd\xf0\x8b\x22\xad\xf6\x61\xf0\xac\xd7\x23\xb3\x96\x9d\xc6\x43\x4e\xa6\xf9\x2e\xf5\x8e\x8d\xfa\xe5\xb0\xcc\x28\x85\xba\x98\x7e\xa1\xd1\x6c\x39\xb3\x4e\xf6\x50\x23\x00\x9d\x63\x45\xe4\x8e\x36\x91\xa4\x1f\x02\xa7\x7b\x7f\xe1\x33\xea\x9d\xe7\x56\x5f\x15\x7a\x20\x78\xae\x98\x8b\xbb\x26\x6d\x22\xd5\xfa\x91\xa7\xb2\x63\xe9\x8a\xd2\xdc\x07\x31\xfe\x5a\x29\x02\x5a\x0c\xb4\x36\x86\x4a\x5a\x60\xdb\x25\x7f\x1e\x76\xb5\xc6\x08\xf2\x5c\xde\xcc\x87\xea\xe6"}, +{{0xb5,0x00,0x76,0x8a,0x28,0x23,0x91,0x5c,0x4a,0x68,0x48,0xd3,0x5f,0x64,0x87,0xd4,0x3b,0xd7,0x66,0xd2,0xce,0x09,0x45,0xf8,0xa3,0xcc,0xdb,0x8d,0x82,0xa3,0x89,0x2b,},{0xb8,0xce,0xa2,0x15,0xa0,0x12,0x4e,0xed,0x27,0x00,0x57,0x25,0xd8,0x97,0x78,0x1e,0xa0,0x64,0xdc,0xef,0xb2,0x14,0x22,0xc8,0xbd,0x24,0x02,0xc5,0x6a,0x10,0x57,0x1c,},{0xe3,0xdb,0x47,0xa1,0x1e,0x10,0xe7,0x88,0x92,0x5d,0x14,0xb1,0xe2,0x8b,0x54,0xc9,0xfc,0xf9,0xb6,0xac,0xc1,0xdf,0x8c,0x14,0xf6,0x83,0xa5,0x67,0x2f,0xd5,0x04,0xdd,0x4a,0x47,0x5a,0x33,0x93,0xb3,0xef,0x8b,0xce,0xac,0x23,0x61,0xdb,0xba,0x35,0x30,0xaf,0x25,0xc2,0x46,0xc3,0xec,0x4c,0x05,0x89,0x9b,0x51,0x7f,0x6c,0xd3,0x4f,0x0a,},"\x0a\x9f\xda\x8b\x8c\xfc\xa7\xa5\xb0\x5d\x78\x11\x6f\xce\xe1\x9a\xb8\x03\xc1\xc6\x01\x0c\xe1\x1d\xaa\x8e\x93\xa6\x6d\x12\xc1\x2e\x47\x4e\xb9\x1c\x26\x40\xd9\x7a\x81\x3d\x9a\x83\x0d\x26\x88\x68\xeb\x2e\x37\x70\x42\x5f\x10\xc7\x58\x40\x46\x8e\x66\x9d\xc7\xf6\x1d\x3b\xe2\xde\x88\xae\x0e\x54\x2b\xc8\x09\x67\x91\x13\x95\x7a\x14\xda\x4e\xaf\xf5\x49\xbf\xde\x63\x7d\x7c\xaf\xdc\x6a\xa8\x39\x94\x83\x73\x97\xf8\x6e\x4f\xde\x86\xd4\x02\xfa\x9a\xef\x7f\x65\x54\x9a\x21\x43\x73\xe5\x60\xe6\xd7\xa1\xc2\x76\x9e\x0c\x7d\x5a\x01\x71\xe7\xcc\x00\xdf\xf3\x6e\x04\x29\x79\x8b\x53\xaa\x62\x16\x24\xbd\xa7\x4d\x6d\xf0\xbf\xff\xfb\xd8\xfd\x7b\xef\x1a\x64\xf3\x6c\x00\x07\x82\xf6\xed\x03\x1a\xf5\xc2\xa7\x4a\x18\x96\x35\x98\xc9\xba\x06\x23\x92\xde\x96\x02\x03\x67\x94\xb7\xb5\xe6\x8c\x25\xc9\x3f\xe7\xcf\xad\x47\xa7\xc5\xb9\x79\xd4\x76\xcd\x51\x3a\x12\xbf\x03\x07\xcb\x16\x31\x74\x00\x42\xa9\xfb\xf3\xeb\x0b\xe5\x17\x06\x20\xda\xfd\x5f\x16\xed\x89\x34\x2c\x26\x25\xd7\x83\xe7\x4e\xe0\xd7\x84\xbf\x05\x19\x43\x74\x0c\x88\xb0\xbe\xf7\xbc\x85\xe1\xa6\xa4\xa5\x17\xd4\x92\xfb\x73\x7e\x77\x66\x99\x59\x0c\x93\x22\x4c\xd4\xd9\x24\x5d\x4e\x93\x71\xa3\x67\xc0\x71\x2f\x87\x49\x0f\x92\x47\xc4\x9a\xdd\x93\x13\xf2\x77\xa4\xd9\xf2\x6b\x75\xaa\xe4\xde\xd6\xa3\xde\xf8\x5f\x83\xfc\x99\x59\x10\x40\x55\x48\xaf\x67\x0e\xd8\xaa\xa3\x05\x24\xab\x82\x9c\xcb\x56\xa5\x00\x5b\x58\xbc\xe8\x68\xc9\xe8\x07\x4f\x07\xdd\x7f\x38\x18\xf2\x99\xe4\xe0\x86\xbe\xd9\xea\xb9\x02\xcf\x11\xb3\x98\xd5\x31\xb8\x63\x2e\x7d\x52\x3a\x8f\x87\x76\x95\xf4\x6c\xcf\x9c\xe2\x4e\x62\xca\xb2\xc7\xcd\x0a\xae\xe1\x7d\xb5\x26\x76\xa4\xb5\x05\x8e\x9c\x1d\x7c\x47\xbf\xfc\xb6\x41\xb0\xea\x2b\x09\x44\xf3\x9a\x75\x66\x5a\x7e\xf2\x9b\x7f\x02\xa8\x78\xdb\x82\x38\x83\xbd\xac\xfb\x0f\xbe\x5d\xfe\x5a\x9b\xed\x9f\xda\xc7\xe4\x14\x2e\x3e\xb5\x0d\x5e\x84\x0b\xd0\xac\x0b\xec\xf4\xfa\x97\xe1\xfc\x48\x27\xc3\x97\xa5\x24\x65\xd9\x16\x88\x99\x54\xb3\x70\x1b\x0f\xac\x61\x15\x9b\x23\x09\x2f\x46\x85\xf4\x78\x8b\xad\x35\xd0\x0d\xa2\x67\x9e\xcc\x54\x92\x1f\x1a\x86\x47\x10\x16\x57\xab\x49\x47\x74\x20\x56\x7a\xed\x67\xc8\x60\x59\x30\x44\x4b\x5d\x07\x92\x7c\x17\xef\xf1\xf8\x57\x0c\xf2\xaf\x29\xe7\x19\xf8\x5c\xa7\x84\x9b\x89\x55\x49\xf1\x3d\xfe\xca\x68\xbb\xef\x71\xe3\xce\x8b\x6c\xed\xd2\xff\x68\xd3\x2b\x02\xca\xf5\x95\x1a\x0b\x3e\x6b\x0b\xae\x6a\x96\xc0\x20\x58\x19\x1f\x30\x5e\x09\x07\x11\xc4\x6d\xad\xdc\xd5\xae\xee\x76\x9c\x3a\x10\x5e\x9a\x82\x7b\xbd\x19\x5d\x32\x92\x31\xc2\x62\x38\x47\x9a\x9b\xb0\x07\x1a\xfb\x16\x0e\xf9\x55\xe8\x74\xd7\xa4\x20\xc5\x67\x85\xf4\x4a\xe0\xa1\x8c\x52\xd8\x28\x0c\x59\x98\xcf\x38\x88\xfe\xaf\x89\x89\x81\x34\xbc\x8d\x41\x1f\xc9\xf6\xc5\x76\x8e\xa7\xa2\x49\x72\x94\x13\x73\x9e\x53\x2b\x64\x39\x37\x15\x2c\xdf\xb8\xd2\xff\x87\xfd\x48\x08\x4d\xd8\xae\xeb\xea\xf0\xf7\xb1\x0d\x87\xb6\xe4\x42\x32\x28\xc9\xfc\x8d\xc5\xe3\x85\x2a\xa8\xb8\xac\xc5\x45\xd1\x8f\x25\xc5\x5d\x73\xda\x1b\xb8\x2e\x3e\xb3\x76\xf9\xef\x05\xb2\x74\xd7\xec\xb1\x84\x5d\x65\xca\x0c\xd2\x62\x9f\x03\x8a\x2d\x66\x4d\x7a\x69\x78\x1c\x84\xe9\x8d\xe2\xc2\x09\xc4\x6e\xfc\x51\x16\x21\x72\x85\x66\x49\x46\x9e\x67\x33\x08\xdc\xc1\x45\xea\xf7\x83\xf5\xcb\x5b\x4b\xe7\xd9\xfd\x58\xee\x09\x74\xc9\x81\xa3\x8f\xea\x8e\x31\x26\x7a\xbf\xa4\x10\xe6\x9e\x46\x48\x2f\x51\x34\xf3\xda\x1f\xfe\x38\x1b\xd6\x9d\x8d\x0b\x78\xea\x90\x9b\x4a\xf9\x39\x6d\xca\xff\x89\x96\x0a\x04\x9e\xda\x69\x46\x61\x6f\xc2\x7c\xcf\x9a\x9e\x5b\xa1\xa0\x13\x57\x64\xf3\x77\x19\xda\x4d\x28\x07\x81\x85\xd0\x4d\x72\x41\x9c\x2c\x70\xf2\x90\xd9\x7e\x1f\x82\xb8\x79\xf7\x1b\x9e\x19\xd5\x04\xd3\x64\xcd\x3b\xa2\x2c\xf9\x05\x25\x0f\xd3\x7d\x58\xe5\xfe\x40\x20\x9f\x60\x72\xa0\x6d\x8b\x5b\xa7\x01\x96\x23\x05\x77\x87\x7e\xc4\x61\x53\x16\x7a\x7c\x7a\xea\x27\x0f\xa1\x09\x8a\xba\x9e\x3a\x74\xac\xb3\x6a\x11\xb0\x9b\xd0\x7a\x3b\x88\xea\x65\x4e\x26\x83\x65\x62\x5b\x58\x9b\x22\x06\xc7\x10\xd9\x60\xf4\x2e\xa4\x19\xb7\xe4\xe3\xda\x47\x59\xfc\xbc\xa5\x0e\x4b\xf4\xcc\x55\xcf\x88\xf7\x0b\x31\x80\xc8\x05\xa7\x04\x50\x86\xaf\xa0\x4c\x6b\xe2\x32\x23\xec\xae\x5f\x82\xc1\x46\xd5\x43\x11\xd1\x80\x7c\x2e\x4a\x53\xf9\xe0\xa4\x48\x2b\x4e\x1e"}, +{{0x9e,0xb5,0xc9,0xef,0x13,0x53,0x5f,0x80,0x81,0x09,0xf4,0xa4,0x3c,0xfa,0xd5,0x68,0x4f,0x80,0xda,0xf0,0x2e,0xed,0x54,0x10,0xac,0x0b,0x0a,0x09,0xa6,0x08,0x2d,0x69,},{0x36,0x7e,0xea,0x1e,0xcb,0x4e,0x5e,0xec,0xdf,0x7e,0x47,0x1b,0x90,0xbb,0x34,0xf9,0xb7,0x98,0x2c,0x8c,0xd6,0x6d,0x42,0x55,0x5c,0x24,0x0b,0x41,0xcd,0x87,0x39,0xdb,},{0x42,0x9c,0xe1,0xfe,0x84,0x6d,0x25,0x08,0x49,0xec,0xa7,0xd4,0x56,0xf8,0xc5,0x9f,0x86,0x75,0xb1,0xf4,0xc1,0x3f,0x2b,0xe4,0x16,0x88,0xdf,0xb8,0xca,0x2a,0x3b,0x24,0xae,0x29,0xd5,0xb6,0xbf,0x47,0x11,0x57,0xbc,0xb6,0xe2,0xec,0x9d,0x4a,0x26,0xb0,0x38,0xe6,0xec,0x28,0x58,0x4c,0xc2,0x3f,0x2a,0x03,0x55,0x6d,0xbb,0x37,0xe9,0x00,},"\x2d\x7c\xb0\x5e\x61\xdb\xae\x26\x25\x8e\x38\x61\xc6\x39\xef\x0e\x1d\x17\xfc\x71\x1a\x00\xf3\x35\xba\x3c\x02\x71\x37\xe0\x07\x08\xd7\x08\xc1\xff\x45\x7f\xf2\xc6\x51\x12\xf7\xdc\xd7\xd0\x2f\x24\xd5\x6f\x07\x21\x58\xea\x1c\x71\x83\x25\x50\xa5\x83\x66\xfd\x91\x97\x29\x6b\xbe\x61\xaa\x4d\x00\xde\x18\xa4\x53\xef\x91\x74\xfa\x81\x96\x83\x05\xc4\x1c\x34\x55\xf4\x2d\x44\x7a\x92\x34\xf0\x6e\x13\xbf\x8b\xca\xa1\xba\xbb\x11\x69\x5f\xaf\xdc\x08\xf7\xa5\x84\xb2\xea\x1f\x61\xe9\x38\x92\x60\xce\x73\x35\xa0\x7d\xe7\x2c\x89\x11\xa5\x8a\x31\x3f\x10\x88\xdc\xdf\x5c\x8d\x4c\x45\x6c\xba\x2d\xcb\x4f\x2d\x15\x6b\x49\x43\xb9\x5b\xd4\x93\xea\x4f\xe1\xa8\x2d\x4e\x3e\xa0\x2a\xa0\x29\x72\x40\x0b\x5e\xe1\x78\x42\x83\x2d\x59\x97\x9f\xc1\x79\xf8\x43\xc4\x4b\x03\xeb\x3c\x30\x24\x16\xd0\xcd\xaf\x11\xc4\xca\x8a\x66\xcc\xbb\x69\x97\x39\x5e\xdf\x6f\xca\x2e\xa0\x04\xcf\x34\x86\x97\x10\x04\xa4\x20\x42\xaf\x8e\xce\x00\x5b\x94\x46\x1d\x86\xdc\xde\x21\x2a\x2e\xb1\xbe\x3b\x91\x4c\x78\x3e\x48\xac\x1a\xd4\x6c\xac\xd7\x3e\x1e\xb4\x48\x36\x83\x22\xd2\x67\x8e\xfc\xb2\xab\xff\x52\x09\x3d\xb0\xf2\x59\xdc\xe5\xc1\xe1\x9a\x51\x28\x20\xf2\x35\xd6\xae\xaf\x0e\x1a\x72\x3c\x2c\x65\x0c\xff\x1e\xe3\xb6\xb4\xf4\xcc\x98\x9c\x0b\x7d\x6d\xe3\xcd\x7e\x6d\xaa\x39\xbb\x69\x07\x10\xdf\x00\xa7\x19\x4c\x17\x20\x1f\x0e\x81\xbe\x64\xb6\x73\x9e\x1c\x1e\x81\x76\xb7\xe1\x2a\x35\x34\x27\xc0\x67\xc1\x93\x14\xdb\x64\x2e\x5c\x76\x26\x6b\x64\x0e\xb1\xcc\x0c\x73\xf8\x4f\xc0\x22\x7e\x5a\x96\x06\x0d\x81\x40\x71\xcd\xe2\xfe\xd9\x44\x76\x7b\x74\x66\xf9\x00\x1d\xfc\x22\x36\x85\x42\x9b\xc4\xe5\xe4\x8f\x5c\x13\xa6\x3a\x4e\x0d\x82\x61\x33\xad\x92\x0d\x11\x77\x21\x45\xad\x6e\x13\xc9\x38\x97\x39\x8a\x8a\x40\x1f\x93\xdb\xd1\x03\x00\x5c\x7d\xae\x44\x38\x7f\x3e\x80\xb7\x93\x60\x7d\x05\xd2\xd8\xbc\x0d\x03\x51\xa3\xa4\x52\xb8\xce\x75\x9c\x1a\xd4\x8d\xf7\xb9\xba\x9e\x4a\x17\xdf\x61\xfd\xab\xb9\xb5\x77\xb5\xce\xc3\xe9\x46\x1f\xbb\x5e\x12\x81\x55\xa3\xc9\xc8\x9f\x8f\x6b\xeb\xb7\x32\x2a\x16\x67\x8e\x8e\xcb\x98\x95\x3d\x95\x83\x10\xdb\x1b\x06\x34\x48\xc3\x49\xf3\x6e\x16\x8f\xac\x48\x4c\xb3\xc0\xd4\xcb\x2c\x25\x1b\xd9\x2e\xf8\xe9\x26\x2b\x44\x09\x3d\x7e\x65\x0a\x7d\x3b\xed\x37\x91\xfa\x88\x10\x0f\xee\x6e\xf0\xd5\xe2\x3d\x1e\x9a\x80\x99\xcc\x03\x35\x20\x2a\x4f\x10\x6c\x24\x77\x7e\x98\xf8\x1d\x26\xef\xba\x15\xc9\xad\x15\x41\xe0\xad\xbf\x1d\x1d\x76\x07\x6b\x0d\xfd\x7b\x7d\x6c\x8b\x82\xf9\xc0\x93\x46\x8c\xd1\x96\x67\x2d\xc5\x47\x8e\x91\xce\x70\x1c\xdd\x7b\x68\xb3\x53\xc9\x71\x11\xf0\x42\x97\x60\x63\x57\x62\xf8\x68\x3a\xe9\x70\x56\x4b\xce\xba\x91\x20\x51\x76\x42\xe8\xb3\xa2\xba\xaa\x85\xc2\x5b\x54\xa9\x43\x76\x61\x84\x90\x4c\x72\xd9\x29\x63\x4e\xc5\xf0\xc2\x84\x73\x41\x5f\x12\x53\x89\x06\xc6\x78\xfc\xa4\xe6\x82\xdb\x48\x79\x75\x84\x92\x53\x7e\x78\x50\xb9\xbf\xef\x3e\xb9\x05\x3b\x43\x92\x0d\x81\x0e\x55\xbe\x96\x6a\xec\x68\xc9\xdd\x3b\x62\xcc\xf5\x7e\x81\x78\xcb\x5e\xf6\xd1\x6d\x17\x2a\x56\xdd\x92\x4f\x00\xf2\xd3\xb5\xe9\x3a\xaa\x92\xb2\x9f\xb8\x33\x6d\x73\xe2\x9e\x59\xd1\xc4\x7e\xa6\x23\x0c\xda\x1d\x5b\x03\xbb\xa5\xdf\xdb\x33\x1f\xeb\x19\x44\x3f\x12\x3d\x2a\x03\xff\x4f\x10\xec\xa1\x66\xc2\x99\x85\x88\xf1\xe5\x84\xed\x19\x4d\xd6\xf7\x3c\x8a\xca\x84\x66\x31\x90\x4d\x9f\xe4\xa9\x8b\x36\x78\x23\xe4\x6e\xdb\xa2\x88\x51\x29\x87\x9e\x92\x77\xe1\x50\xf0\x29\xb8\xfa\x7b\xd1\x1e\xab\x9c\xe1\x33\x67\x77\xc8\x0b\x56\xb3\xa1\xf0\x81\x1a\xdb\xca\x0f\x5b\x40\x25\xa5\x50\x3c\x81\x96\x66\x1a\xee\x90\x00\x6e\x9c\x85\xbb\xfa\x4c\x5a\x0e\x90\x28\x85\xc8\xce\x51\x21\x2e\xe6\x7f\x0f\xe0\xb6\xaf\xbc\x8b\xad\x45\x37\x27\x54\x3b\x3c\x68\xb8\x90\xdd\xab\xa2\x69\xd2\x5f\xc1\x64\x3f\x54\x83\x51\x36\xa1\xa2\x5b\xa1\x8d\x91\x6c\xed\xd6\xa4\x7f\xc0\x7a\xdf\x6f\xc6\x9f\xa5\x08\x94\x9d\xc1\x0d\x9d\xc5\xe0\x26\x1b\x52\xf3\x65\x71\x70\x38\x4e\xcc\xd9\xc8\x05\x41\x35\x4b\x1c\xe0\xf6\xfb\x5e\xd3\xe8\xd5\x4a\xf0\xb5\xbf\x0a\x92\x83\x51\x25\xc7\xd9\xbc\x4f\x09\x2f\xf3\x80\xe5\xe8\x96\xfb\xf3\x02\x55\x2b\x14\xd5\xb6\x1a\x22\x4d\x86\xe3\x01\xc7\xa6\x6a\x66\xe4\xe4\x32\x9a\xac\x0a\x66\xb1\x56\x77\x23\x74\xdc\x1c\x71\x68\xd5\xb5\x61\x65\x2f\x8f\x43\x87\xe4\xf2\x89\xb6\x36\x6a"}, +{{0xef,0x09,0x48,0xe1,0x32,0x81,0xf3,0xcf,0x35,0x2c,0xbf,0xaf,0x8d,0x89,0xd1,0x17,0x76,0x85,0x52,0xd5,0xa1,0x54,0x8e,0xcb,0xaf,0x37,0x41,0x2e,0x97,0x67,0x0f,0xac,},{0x58,0xc2,0x45,0x7f,0x5a,0x5e,0x3c,0xfb,0xf4,0x71,0x19,0xa8,0x7f,0x2a,0xff,0x19,0x18,0xf1,0xe6,0x7a,0xe6,0xfa,0x91,0x71,0xd3,0xf4,0x1e,0xee,0x07,0xa8,0x68,0x72,},{0xcc,0x12,0xf6,0x9d,0xb6,0x3a,0x67,0x8e,0xc4,0x77,0xa6,0x05,0xa5,0x05,0xc5,0x7d,0xc2,0xb8,0x10,0xef,0x85,0xe3,0xe3,0x45,0x19,0xcb,0x25,0xc5,0x10,0x63,0xaa,0x66,0x35,0x5d,0x3f,0x1e,0x29,0x74,0x69,0x58,0x66,0xed,0xf6,0xf1,0x71,0x71,0xce,0x37,0x84,0x2f,0xba,0xb5,0x07,0x5f,0xc8,0x95,0xd1,0x8e,0xd7,0x43,0xc5,0x46,0x08,0x0c,},"\x7e\xc4\x7f\x2f\x1f\xe3\xb7\x0a\x6d\x1d\x82\xc7\xcd\x92\x4b\x4b\xf9\xb2\x02\x9f\xc1\x2c\x52\xa6\xe1\xcc\x06\xcf\x5a\xbf\xc0\xa4\x42\xe7\xcf\x14\x5c\x15\x42\xb9\xb1\x35\x04\x96\x65\x71\x10\x35\xe3\xc2\x9a\x91\xd4\xfd\xae\xd6\x12\x70\x57\xa8\x12\xc2\x2c\xd7\x5a\xd1\x87\x9b\xe1\xd2\xc6\x11\x0e\x79\xe9\x87\x52\x4e\x4e\x8f\x27\xf1\x6e\xda\x90\xcb\xd4\x73\x3f\x11\x18\x25\xb5\x16\xd1\x06\x7f\x81\xec\xa5\xe6\x94\x85\x76\xd5\xbf\xed\xb3\x27\x7c\x1a\xbc\x1e\x60\xf3\x74\xd0\x70\x1b\x32\xcc\xfd\x6a\x5e\x9c\x8d\x16\x59\xaa\xf3\xd0\x81\x86\x13\x61\x3b\x7e\x28\x8d\x84\x5e\x9a\xaa\xba\x2e\x3e\x9b\x41\x1d\x50\x1d\xff\xe8\x56\xfd\x31\x3e\x9f\xcc\x9e\x74\x30\xb9\x98\x3f\x20\xab\x4e\xbf\x4e\xb6\x16\xbd\x63\xe2\xc5\x77\x43\x65\x89\x95\xed\x0a\x14\x9a\xe6\x20\xa3\x95\x61\x37\x19\xb3\xed\x7c\xed\x45\x88\xd5\x91\x5d\x70\xa2\xf0\xc6\x87\x68\x0e\xc3\x4f\xe3\xe9\xf7\x23\x92\xe1\x89\xe1\x3a\x47\x49\xd5\xca\x9f\xac\x65\x1b\x92\xc0\x84\xc4\x06\x6f\xdf\x98\xa8\x69\x22\x3e\x4e\x0c\x9b\xec\x58\x12\xb5\xc1\x90\x0e\x6e\x60\xd3\xa1\x88\xd4\x8a\x74\xdf\xd4\x15\xb5\xca\xd2\xe9\x1f\xf7\x6d\xf7\x50\x89\xd2\x0a\x75\x5f\x26\x07\x56\xc8\xf1\x38\x2a\x29\xf7\xb9\x37\x26\xe7\x31\x07\x1c\xd4\x77\x45\x8c\x6f\x20\x22\xdf\xad\x7d\x4f\xc7\xab\x23\x80\x54\x18\x64\xf6\xb5\x87\x74\xf9\xae\x8e\x5f\x07\x7c\x1a\x8d\xa0\x73\xc3\x98\x53\xeb\x2f\xd4\x77\x22\x0b\x45\xa3\xd9\x22\x63\xdc\x7e\x14\xd3\xbb\x2b\x36\xfc\xa4\x66\xc7\xef\x8a\x24\x75\x38\x72\x5f\x2f\xce\x5c\x72\x21\xbc\x75\x1c\xde\x13\x94\x60\x4f\x59\x31\xd7\x33\x36\x0c\xcd\x47\xce\x08\x77\x12\x95\x81\x80\xad\x84\xfa\xe7\x13\xb5\x43\xf0\x5e\xef\x6a\xbc\x06\x61\x43\x31\x21\xed\x3b\x45\x06\xa1\x46\x50\x25\x31\x6f\xb8\xf9\xd6\x45\x35\xcc\x45\x38\xac\xd4\x06\x4d\xd5\x76\xb0\x74\x0e\x1b\xeb\x13\xbc\xea\xf1\x55\x54\x3d\xc8\x90\x97\xca\x5c\xa1\xcf\xfa\x0a\xd6\x5a\x10\xbc\xb7\x59\x35\x4e\xab\x8a\x42\xde\x73\x4a\xf9\x09\xc2\xfe\xba\x38\x0d\x66\x40\x9f\x32\x5d\x5f\x17\xaf\x9c\xa7\xf8\xcb\x41\x34\xfd\x6a\x2b\x6a\x52\x8d\x9e\x60\xd9\x61\x2b\x8e\x8b\x40\x62\xf8\xe0\xfa\xd1\xe7\xee\xb9\xcb\xfe\xf6\xe9\x73\x8e\xc7\x97\x3e\x1c\xb2\xba\x23\x27\xde\xca\x4e\xa4\x65\x68\xf3\x1e\x12\xf7\x30\xe2\x47\xc1\xd0\x70\x29\xfd\x44\x22\xb2\x98\xff\x23\x98\x02\x3b\x41\x20\xa3\xa4\x25\xff\xb6\x52\x88\x0c\x19\xea\x69\xf3\x63\x9e\x0f\x6d\xf4\xf0\x08\x76\xcc\x45\x28\xe2\x67\xe8\x1d\x59\x43\x19\x9d\x0f\xeb\x6c\xb4\xe1\xba\xf4\x04\xbb\x6f\x8b\x39\xb1\x2d\xbc\xe9\xfd\xc3\x5d\xc1\x58\x06\x6e\x99\x75\xae\x5b\xd3\xb5\x5f\x2a\x41\xa7\x91\xba\xf3\xe8\x35\x1e\xc6\x04\x94\x47\x90\xa2\x2c\x93\x3c\x80\xb1\x59\x0b\xa1\x97\xa4\x70\x6f\x7f\x51\x28\x68\x2e\xdc\xd7\x4d\xd7\x8d\x43\x5e\x78\x7c\x2b\x76\xa5\x7b\x3f\x4e\x7d\x7b\xe2\xef\xd2\x6d\xa5\xf9\xa8\x29\x11\x9b\x01\x50\x8b\x70\x72\xc7\x69\x9c\xe5\x2b\xb5\x78\xcc\x5b\x1b\x93\x66\x1b\x51\x72\xfb\x84\xda\xf1\xba\x36\x4d\x2c\xbd\x80\xe2\xc9\x9b\xca\x9c\xae\xa8\x73\xcc\x0a\x16\x29\xea\xc3\x84\xe9\xb2\x06\x84\x2a\x6e\x61\x83\x38\x75\x91\xb4\xaa\x34\xa9\x5f\xd8\x9b\x49\xd8\xd1\x5d\x91\xe2\x19\x40\xe1\x7d\xca\xf1\xef\xf8\xa0\xa4\x7a\x0d\x7a\x95\xda\xea\xd8\x2a\xa3\xdf\x82\x04\xa0\xcd\x20\x69\x24\xae\x51\x0f\xec\x8a\x9c\x4e\x8d\x85\xd4\x66\xfd\xb4\xdd\x36\x5d\xc9\x93\x36\xb2\x2c\xe0\xb9\x56\xb5\xee\x00\x17\xf2\x9d\x25\xee\x66\xfb\xdc\xec\xb0\xd9\x96\xff\xb9\x7c\x8d\xef\xde\x40\xa9\xff\x99\x93\x19\x3c\xa8\xf1\x68\x50\x67\xc1\x9c\x52\x6e\x0e\xfe\xd2\x36\xf8\xed\xb8\xde\xf6\xc2\xa0\x3e\x21\x95\x2c\x86\x12\xd6\x24\xe6\x88\x6a\x31\x1f\xfb\x9e\x2f\x15\xda\x44\xab\xe1\x80\xd2\x6a\x14\xb1\x5f\x63\x56\x1e\x09\x7a\x73\x0e\xca\xbb\x79\x2c\x7c\x23\x5f\xdd\x36\x0f\x57\x1f\x27\xef\x68\x67\x7a\x7d\x63\xbe\xb4\x97\x59\x82\xcb\x19\x9a\x56\x0f\x81\x6e\xe1\x29\x89\x44\x5f\x7f\x75\xb8\x3e\xb2\x78\xd6\x28\x25\x94\x7d\x84\x09\x9a\xf2\xa6\xff\x2e\xad\xbb\xf5\x89\xb5\xeb\x2f\x72\xed\x11\x4c\x73\x15\x11\x53\xae\x00\x22\xbc\x95\x64\xd1\x5c\x2d\x5c\xdb\xba\xab\xbe\xf6\x38\xf0\x30\x95\xf5\x3e\xeb\xac\x96\x83\x40\x9a\xd3\x06\x0c\xfb\x7c\x70\x37\xb9\xb0\xbe\xfe\x06\x9c\x92\xa0\x2b\xe9\x53\x38\x8e\x9e\xa4\x5d\x36\xdd\xf4\xf5\xa8\x38\x94\x32\xcc\xf5\x04\xc5\x08\x08\xb0\x7f\x69"}, +{{0x90,0x3f,0x3b,0x53,0x99,0x89,0x2e,0x29,0xcc,0xfa,0xfb,0xaf,0xbd,0x7c,0xc4,0x53,0x3c,0x15,0x4a,0x62,0x56,0x82,0x40,0x6c,0x89,0xbf,0x89,0x4c,0x88,0x9e,0x43,0xf4,},{0x8f,0xa5,0xff,0x5b,0x6b,0x26,0xbd,0x67,0xdf,0x86,0x40,0x46,0x42,0x9d,0xf1,0x24,0xb5,0x23,0x00,0x5d,0xd8,0x94,0x44,0x27,0x5c,0x8a,0xb7,0xeb,0xdd,0xb6,0xf4,0xdb,},{0x49,0x5a,0x8f,0x99,0x19,0x41,0xc6,0x29,0xbd,0x64,0x1a,0x67,0x47,0x1a,0xb8,0x60,0xbf,0xd3,0x9b,0x72,0xf2,0x33,0x55,0xf7,0x27,0x09,0x09,0xd5,0x30,0x7c,0x77,0xb1,0xb9,0x4b,0xae,0x3e,0xd1,0x94,0x50,0x78,0x0e,0x90,0x85,0x30,0x5f,0x31,0xb1,0xe1,0x68,0x3f,0xac,0xf0,0xd1,0xfc,0x88,0x40,0xae,0xc7,0x7d,0xf6,0x7a,0xea,0xb3,0x02,},"\xa2\xc1\x1b\x5f\xb8\x84\xa8\x22\xfa\xe6\x4d\xa8\xdc\xb4\x45\x2c\xfd\x7a\x04\xca\x6d\x7a\x5a\xbc\x8d\x82\x71\xe9\x3f\x93\x44\x9e\x1f\xeb\x8e\x02\x97\x5f\x49\x6b\x90\x34\x40\x0d\x35\x99\xab\x97\xaa\x39\x97\xda\xd1\xc9\xff\xab\x5b\x9f\x8d\xf4\xaa\xa5\xb8\x40\xd9\x0d\x86\x2f\xff\x7f\xf0\xcf\x73\xa6\x0c\x66\x15\x00\x09\xe0\x1c\x93\x7b\xd1\xaf\x68\x07\xb5\xba\x2e\xf6\x12\xee\x13\xd6\xde\xf4\x0b\xb0\x9c\x46\x81\x1a\x2d\x4e\x46\x8e\x03\x8b\x32\x30\x55\xf9\xdf\xbd\x01\x82\x9a\xe2\xf1\xa5\x35\xef\x02\x95\xca\x1e\xd1\x76\xe4\x6d\xe9\x96\xcc\x87\xba\xce\x45\x35\x62\x33\x21\x18\x35\xb6\xf4\x75\x7c\x99\xbd\x52\x7e\x76\x6a\x5f\x0b\x12\x7c\x8c\xff\x8e\x6d\x66\xf8\xba\xb8\x6d\x00\x00\x45\x2c\xd7\xf6\x7b\xe5\x57\x78\x85\x13\xec\x07\x09\xb5\x37\xb0\x07\xb4\x20\x16\xe7\xa8\x96\x83\x46\x9b\xd8\xff\x8d\x21\xeb\x10\xc1\x49\x17\xd4\x7f\x2d\xc4\xf8\x26\x32\x4f\x7c\x01\xb2\x4f\x8d\xcf\xf0\x4a\xa6\xd8\x50\x95\xd9\xab\x15\x4b\xa5\xc3\xbd\x91\x9c\x9d\x72\x8d\xbd\xc9\x90\xd1\x9c\xeb\x23\x7b\x45\x29\x07\xbd\xbe\x21\xf9\xf0\x8c\xdd\xae\x5b\xe4\x79\x27\x67\x09\xb8\xae\x73\xf8\x97\x4c\x4b\x11\x38\x41\xad\x53\x5d\x6f\xf6\x22\x3e\xea\x47\xd1\x85\xc8\xe8\xa6\x5f\xde\xe2\xc2\xd4\x58\x00\xc1\x7c\xb5\x56\xea\xfd\x67\x66\x47\xd9\x96\x8e\x55\xca\x9c\x59\x23\x2b\x97\x70\xad\x10\xf9\x55\xfc\xb5\x85\x8e\xdf\x0b\x74\x83\xad\xc1\x81\x7c\x0f\x8d\x02\x24\x04\x82\xca\xa7\x6f\x43\xc6\xd2\xe9\x6a\x4f\xf9\x59\x1c\xd7\xb8\x78\xea\x61\x9e\xa5\x6d\x1b\x58\x86\x31\xe7\x63\x3c\x5e\xcb\x2b\xa6\x99\x83\x98\xcb\x06\xe3\xcf\x75\xae\xb3\xe0\x8d\xab\x19\x63\x2d\x45\x4f\xf7\xdc\x0e\x2a\x41\xf0\x97\x37\xe8\xee\x82\x3d\x1b\x9e\x24\xdd\xa8\x4a\x2c\xe0\x31\x3c\xb9\xfc\xe3\x1c\xb6\x63\xc5\x5c\x05\x64\x5e\x63\x40\x17\x56\xe8\xad\x38\xf5\x17\x4c\x02\xa6\x63\xd8\x15\xad\x64\x42\x2f\xf7\x72\x7d\x4f\xda\x16\xe4\x8d\x4b\xf8\xf6\x60\x2e\x72\x60\xda\x62\x33\x0e\x68\x78\xc3\x47\x64\xe1\x29\xaf\xbd\x55\x22\x08\xf6\xbe\xd4\xf7\xce\xe9\xb6\x71\xf4\x88\x38\x88\x15\xd7\x4b\x49\x51\xb8\x68\x2c\xe7\x6c\xfe\x31\xe9\x38\xc4\x70\xb8\xf7\xa4\x5f\xd6\x3a\x96\x91\xf4\x26\xa7\x5c\x58\xed\x3d\xbc\xe3\xae\x8f\xd9\xd1\x0a\x83\x52\xe4\x7c\xc1\xb1\x2c\x91\x92\xac\x86\x26\xd1\xb3\x84\xb7\x7a\x18\xb9\x86\xe7\x1a\x99\x86\x46\xc1\x37\x99\x2b\x67\xc4\x81\x7e\x34\x63\x45\xfa\xf5\x0a\x26\x59\xfd\xc5\xca\xd5\xc7\x19\x64\x8e\xfe\xe3\x84\x7c\x0f\xf6\xbd\x70\x95\xc2\x8b\x4c\x51\x95\x96\x7c\x90\xcf\x84\xe1\xef\x68\xa1\xad\xa0\x1f\x62\x74\xed\xe3\x63\xfb\x82\xe0\xb5\x49\xa8\x70\x24\x5d\x60\x8c\xae\x82\x34\xf6\xd8\x4a\xbe\xb6\x1b\x71\x84\x66\x09\x36\x20\xd8\x5c\x58\x4a\xb0\x1e\xed\xa0\x91\xee\x8a\xff\x1c\xf6\x7a\x46\x75\x67\x9a\x1f\x40\x03\xe6\x6a\xaf\x43\x87\x1b\x88\xec\xda\x6a\x16\xdc\x5a\xcb\x05\x39\x5f\x2d\xa9\xdf\x70\xd3\xbd\xb6\x14\x38\xe1\xc3\xd4\x09\x81\xe0\x34\x62\x7d\x02\x6e\xe1\xd2\xe7\x9f\x65\xcb\xb8\x18\x9f\xcb\xb3\xcc\x8b\x5c\x2e\x7e\x79\x6b\x5d\x28\x89\x41\x1d\x56\x41\xfb\x86\x9c\x7b\x0a\x58\x9c\x43\x25\x4f\x8c\x54\x38\xaa\xf5\xac\x42\x38\x32\xf0\x18\xd7\x9a\x51\xb9\x6f\x24\x2e\x2d\xe0\xc8\x51\xcc\x5f\xc2\xb2\x06\xbc\xa4\xb5\xbe\x83\x61\x25\xac\xa1\x44\xbb\xc3\x8c\x8c\x63\x8b\xe0\xd3\xbb\xe0\x25\xa1\xbe\x8b\x3d\x03\xd5\x92\x9b\xaa\x64\x9c\x35\x44\xa3\x2a\x91\x5e\x92\x6a\x38\x79\x1b\x13\x4a\x97\x1b\xc5\x2d\x1b\x6c\xa6\x25\xef\xb7\xc2\xf3\xbb\x47\xab\x51\xd4\x3c\x8e\x37\x4d\x16\xcd\xa8\x82\x20\x4b\x71\xca\xfe\x90\x93\xcb\x60\x78\xef\x2b\xdf\xad\x59\xed\xea\xf3\x6d\x0c\x1a\x4d\xc4\x25\xb9\xe7\x18\xc4\x51\x85\x22\x5a\x9c\x30\x84\xb7\x82\xbf\xe1\x63\x49\x2f\x8e\x84\x82\xec\x9a\xa0\x73\xf6\x90\x1f\xf3\xd1\x11\x7c\xe9\x17\xe1\x91\x22\xfa\x67\x65\x0d\x85\x8f\x8f\x82\xb3\x76\x69\x72\x3c\x22\x6d\x72\x16\x97\xe7\xae\x33\x59\xf5\xa6\xb0\x24\x24\xee\x87\x94\xcb\xea\xa6\x41\xed\xbb\xf7\x53\xb1\x03\xa5\xfe\x15\x8b\xe0\xba\x60\xd8\xa2\x12\xd4\x2f\x8c\x5c\x2a\xf2\x54\xbf\x1b\x9c\x80\xdf\x6f\x1c\xf0\x9d\x70\x79\x3c\xae\x1a\xbb\x46\x27\xb1\x78\x0f\x1b\xce\x7f\x61\x7e\xe5\x0f\x6b\xd4\xb0\x83\xb2\xfc\x7c\xd8\x44\xaf\xb7\x23\x80\xd5\xcb\x6b\x25\x5b\xf4\x7e\xa7\x1c\xad\x6c\x6c\x4d\xf0\x21\xf8\x1b\x54\x8f\x43\x2c\x18\xac\x36\x6c\x6a\xec\xd0\x3b\x6c\x8c\xe2"}, +{{0xee,0x81,0xe0,0xfb,0x05,0x2e,0x23,0xad,0x75,0x9d,0xe6,0xaa,0x98,0x38,0xde,0x98,0xe3,0x6d,0x48,0x20,0xdc,0x0e,0x1b,0x7b,0x3e,0xf1,0x14,0x1a,0xb9,0xde,0x33,0x40,},{0x98,0xf3,0xc9,0x88,0x07,0x94,0xde,0x64,0xfa,0x26,0x9b,0xdf,0x33,0x60,0x95,0xe0,0xe0,0x1b,0x1a,0x3b,0x37,0x5f,0x96,0x5b,0x93,0x70,0x0b,0xbd,0xf4,0xb9,0x68,0x69,},{0xf0,0xd8,0x73,0xbe,0x15,0xcf,0x45,0x4c,0x74,0x34,0xde,0xab,0x71,0xde,0x25,0xcf,0xe9,0x9e,0x81,0xa4,0x8d,0x2d,0xce,0x6a,0x35,0xd1,0x63,0x37,0x14,0xdf,0x0f,0x8b,0x40,0x29,0xe0,0x58,0x25,0x11,0xef,0xc4,0xd0,0x68,0x92,0xf6,0x72,0x85,0x02,0x46,0xbc,0xf0,0x70,0xc4,0x6f,0xad,0xc2,0xfa,0xab,0x44,0xdc,0x43,0x50,0x45,0xde,0x00,},"\x28\xd9\x9e\x95\x18\xb8\x82\x83\xc2\x20\xe7\x6d\xe2\x05\xd7\xb6\x16\x23\x59\xb1\xdf\xec\x1f\xba\xab\x98\xec\x0e\xf1\xdf\x8d\xa4\x0b\x6b\x7a\x77\x5e\x97\x28\x45\x0a\xeb\x23\x51\xfe\x5c\x16\xaf\xda\x3a\xec\x0d\x71\x04\x9d\xa4\xcb\x7d\x4c\x63\x71\x3a\x24\x10\xab\xb0\x22\xf8\x16\x11\xcc\x06\x45\x87\xc8\x04\x7d\x43\x83\xc0\x0c\x3c\x56\x2e\x9c\xee\xa3\x57\x75\x09\x53\x91\xb5\xf3\xdd\xa0\xe3\x73\xc4\xa7\x7f\xf6\x18\xa2\x8e\xf6\x87\x87\xeb\xfc\x3e\xbc\xcc\xc5\xd1\xce\x32\xdd\xf4\x3b\xfc\xe5\x72\x03\xda\x76\xa8\x66\x4b\x3c\x61\x6a\x88\x69\x28\x2d\xb0\xb7\x28\x11\xb5\xfd\x5a\x2a\x03\xa4\xff\x66\x72\x4b\x04\x89\xea\x2e\x10\x73\xd7\x81\xc3\xf1\x89\x11\x5d\x79\xba\x20\xa4\x6d\x1d\xfa\xf5\xb1\xa5\x84\x7b\x2a\x2e\x31\xb2\x80\x87\x37\x56\x9e\x60\xb5\x72\x31\xe6\xa9\x9a\xf2\x6f\x58\xaf\xeb\x15\x77\x08\x10\x47\x48\x12\xfe\x4a\xfa\xcf\x88\x45\x06\xb8\xc3\x14\xbc\x67\x51\xbb\x42\xb4\xbd\x6e\x87\xd2\xe5\xde\x70\xfe\xc5\xf0\x01\x4c\x42\x57\xb1\x34\x72\xa3\xb0\x11\x1a\x7a\x8c\xf8\x3b\x1d\xc0\xcf\x96\x20\x22\xcd\x44\x46\x8a\x3a\xb1\xf0\x01\x6b\x70\xca\xfb\x1d\x02\x46\xac\xd7\x05\x39\x37\xc9\xac\x40\x20\x7c\xf1\x3b\x50\xdd\x15\xe2\xa2\xe1\x5f\x50\xa0\x5b\xca\x2f\x28\xe7\x70\x26\x23\x71\xda\xce\xe0\x2e\x25\xb2\xa5\x96\x58\xed\x90\xc0\x60\x0f\xa2\x65\xb7\xde\x3d\x44\xf8\xef\x07\x21\xbf\x39\xec\x4d\x4e\xca\x58\x88\x52\x7b\x77\x80\x67\xb1\xd6\x59\xc0\x05\x14\xc8\xd7\x05\x62\x73\xa2\x94\xcb\xaf\xe4\x50\x90\xd0\x69\xbb\xd0\x9f\x92\xf4\x61\xe6\x48\xf3\xe6\x82\x88\x2c\x71\x57\x6e\x97\x4d\xeb\xb0\xcb\x7e\x0e\x83\x16\x40\x66\x60\x15\x0d\xab\xb5\x8e\x76\x24\x66\x14\xa2\x91\xc1\x2c\xe9\xe0\x34\x6c\x02\x77\x4d\x4d\x09\xce\xcc\x23\x69\x67\x12\xfe\xe2\x50\xc0\xbb\x5d\xf7\xa2\xa4\xc4\x3a\x55\x63\x33\x1b\xcb\xbf\x84\xbe\x3f\x2e\xeb\x06\x54\x53\x2e\x85\xec\x59\x7b\x53\xb3\x2f\x39\x54\xcc\xaf\x0c\xd4\x26\xde\xf9\x1e\xc4\xb2\x08\x41\x69\x48\xaf\x27\xde\x04\xd8\x32\x70\x58\x97\xa0\x4c\x5e\x24\xa2\xe8\x8b\x20\x04\x0f\xd4\xec\xa3\x08\x9f\xdb\x91\x8a\x92\xe3\x5c\x4d\x31\xda\x26\x85\x0b\x9d\xd3\x41\x18\xc7\x44\x49\xa8\x55\xff\x4b\xc9\xff\xf0\xd1\x44\x78\x39\x65\x4b\x00\x41\x79\x99\xfa\x4e\xb8\x91\x02\x13\x3c\xd3\x20\x40\x91\x53\x58\x49\x57\xc1\x04\x89\xdb\x4b\x72\x44\xc9\x59\x07\x98\x8e\x83\xdc\x82\x12\x71\xdc\x1a\xb6\x43\xd6\x99\x2d\x0f\xd8\x20\x49\x2a\xe6\x42\xe2\x4d\x19\xa1\x79\xfa\x75\xd9\x36\x3b\x32\x16\x62\x60\x6f\xd9\x4a\x47\xfd\xb2\xe6\x8d\x3f\x30\xc0\x46\x73\xf8\x09\xde\x01\x44\x94\x5e\xa4\xd4\x18\x3d\x48\xf1\x75\x07\x9e\xed\x50\x32\x3c\x6b\x19\x2e\x02\x0e\x16\x2a\x35\x03\xaa\x58\x2f\xb0\x8b\x40\x36\x24\xa2\x3e\x35\x7e\xed\xa0\x8d\x90\x43\x86\xf3\x58\xc3\x6c\x64\xd3\x14\xc7\x7c\xd9\xd4\xd2\x3d\x58\x1e\xe5\x3d\x81\xff\x97\xad\xa0\x19\xcf\xcf\x04\xeb\x9d\xcc\x1d\xe9\xb7\x4c\x3d\xb6\xb8\x11\x57\x8b\xd4\xf2\x19\xc5\xca\x48\xef\x4c\x82\x6b\x09\xe6\xc9\x6d\x03\x1f\x65\xdd\x48\xb6\xe7\x3d\x0c\x10\x05\x86\xb2\x1d\xf0\x29\x3a\x03\xd2\xed\x7e\x50\x09\xad\x02\x53\x40\xc2\x1d\x09\x06\x06\x91\xf5\xcd\x8a\xf2\xab\x12\xf9\xb8\x60\xee\x87\x81\x5e\x1a\x9f\x40\x0c\x2a\x6f\x63\x4e\xa8\xf9\xb3\x42\x5a\x08\xd1\x0b\x3c\x81\x53\x67\x38\x8f\x4d\x1b\xe3\x56\x31\x8e\xcf\x90\x35\xd0\xee\x97\x5a\xff\xa8\x59\xca\xac\x28\xeb\xcc\xd0\x59\x9b\xb2\xf6\xf3\x52\x36\x61\xbd\x17\x8f\xc9\xe4\xca\xc3\x78\xbb\x9d\xd4\x71\x6b\xb0\x69\x23\xfd\x2b\xbd\x56\xc9\x59\xc4\x2b\x95\xd5\x01\x93\xf8\xbf\x29\x9f\xcc\xa3\xb2\xee\xa9\x4e\xc5\xf9\x85\x83\x92\x4c\x08\x04\x16\xe2\x8b\x54\xfe\x57\x65\x84\x58\xb0\x55\xce\x4d\xe8\xa7\x5f\xc8\x27\x15\xca\xe9\x1d\x37\x5c\xf6\x92\x81\x37\x80\x51\xbb\x61\xfd\xd7\xbb\x00\x68\xf6\x3e\xfa\x6d\x6e\x83\xd8\xfd\x42\x57\xaf\x80\x97\x0f\x4a\x9e\x69\x24\xb2\xde\x0a\xd9\x66\xdf\xfe\x6f\xa4\xa1\x13\xb0\xe7\x72\xf1\x76\x87\x85\xb3\xb4\x20\x49\xf7\x6c\x48\xad\x80\xf2\xc6\x7f\xb0\xf9\x1a\x5f\xc4\x10\x79\x12\x52\x0d\x8d\x68\x3c\x06\x2c\x3a\x22\x2b\xcd\xa7\xe7\x10\xba\xcd\x47\x8e\xe8\x83\x67\xb6\xa0\x59\xa4\x52\xfd\x26\xf1\x14\xa5\xac\xbd\x69\x79\xba\x01\x9f\x7d\xa6\x8a\xc0\x4a\x19\x30\x26\xbc\x1c\x27\xe4\x83\x7b\x1d\xe2\x9c\xce\x09\x0e\x33\x80\xd5\x05\x1a\x58\x64\x09\xe6\x28\xe3\x14\x56\x65\xbb\x1d\x84\xec\xd8"}, +{{0x69,0xd0,0x1d,0x82,0x91,0x13,0x08,0x1c,0xbf,0x5d,0x0c,0x6e,0xf7,0x7b,0x21,0x77,0x5c,0x8d,0x9b,0x68,0x00,0x00,0x05,0x6f,0x03,0xc7,0x5a,0x7d,0x0a,0x05,0x87,0xd2,},{0xee,0x84,0x69,0xdd,0x61,0xcf,0x5d,0xe4,0x00,0xda,0x7d,0x7a,0x47,0x9a,0x44,0x18,0xe6,0x77,0x2e,0x69,0xff,0x53,0x30,0xce,0x5c,0xa7,0x78,0x59,0xfe,0x27,0x17,0x55,},{0x40,0x8c,0xef,0xcf,0x01,0x41,0x7e,0x2d,0xc6,0xa8,0xa1,0x82,0x84,0xe4,0x11,0x65,0x7f,0x03,0x92,0x50,0xc3,0x12,0x78,0xdb,0x28,0x19,0xf9,0xea,0xea,0x42,0x93,0xfb,0xf6,0x83,0x1a,0x28,0x01,0xfc,0x1e,0xa6,0x87,0x16,0x57,0xb8,0x41,0xe1,0x73,0xf4,0x51,0xb0,0xd5,0x75,0xa9,0x37,0x9e,0x35,0x85,0x7e,0x8c,0x72,0x97,0xfa,0x14,0x04,},"\x0b\x9e\x11\x0f\x29\xd1\x98\x16\xa1\x7b\x2c\x75\x47\x8f\x13\xce\xe9\x53\x81\x1a\x19\x83\x01\x4c\xb7\xeb\x0f\x75\x52\x69\x12\x04\x4c\x3e\xa6\x82\x97\x80\xe6\x57\xf8\x17\xc5\x59\x7d\x46\x61\x08\x0d\x90\x34\xc9\x77\x87\x22\x41\x8f\x2c\x3a\xee\xca\xef\x6b\x69\x0c\x5b\xd3\xb5\x93\x70\x10\x86\x98\x8e\x43\x40\xae\xc3\x4e\x01\x72\x75\x8e\xb2\x40\x87\xd0\x3a\x8f\x76\xe7\xcb\xca\x53\xaa\xaf\xc4\xd2\x15\x5c\x75\x32\xab\x54\xbe\x48\x87\x26\x53\x06\x6f\xa1\xfd\xd5\x4a\xcf\xe9\xda\xae\xca\x35\x6c\x29\x0e\x6b\xe6\x33\x55\xb6\xd9\xfc\x52\xeb\x5e\x4f\xcc\xbb\xc6\x08\x35\x07\x13\x2d\xe4\x85\xbf\xae\x9f\x42\xe1\x97\x12\x23\x2b\x71\x64\x02\xc2\x3f\xea\x74\xef\xa6\x9d\x73\xc8\xc2\xe3\xa8\x66\x2b\x8b\x65\xb0\xfd\x00\x77\x41\x01\x3e\x1f\x6e\x3c\xfe\x43\x45\xd5\xc8\x30\x68\x2f\xe6\x00\x21\xd7\x08\xe1\x0a\x9e\x9f\x40\x52\xff\x7a\x6a\xbf\x28\xac\xb1\xd6\xb5\xfb\x03\x8e\xed\x3f\x72\x51\x3c\x35\x5b\xbf\xd5\xc2\x27\x4f\xa8\x5f\xc4\xf4\x46\x97\x4b\x2d\x1b\xc0\x36\x50\x7a\x1e\xb5\xfc\xf5\x5d\xbd\x44\x21\x0e\x53\x82\x74\xde\x80\x8b\x90\x0b\xf1\xc0\xfc\xc0\x24\x12\x70\xdb\x8d\xbd\xcd\x88\x34\x9d\x67\x22\x4f\x08\x7e\x5f\x07\xf6\x99\xb0\xba\xe6\x8b\x2e\xbc\x9a\x4e\x27\xc7\x0d\x3a\xc7\xd9\x96\xfa\x7d\x4d\xab\xd5\x68\x37\x8e\x3f\x93\x90\x5b\x1c\x89\xc6\x52\xd3\x84\xc1\x6c\x2b\xcb\x1c\x98\x44\xc3\x8f\x71\xbb\x13\xe0\xc6\xa2\xea\x95\xb6\x12\xe3\x90\xc5\xf8\x6d\x24\x8e\xa5\x31\xf2\xec\x6f\x63\x9a\x40\x2d\xfa\xcc\xf3\x72\x17\x00\x53\x44\x03\x07\x45\xd1\xf1\xe5\x20\xcc\x19\x5d\xaf\xdd\x7f\x29\x5f\x37\x7b\x8d\x61\x47\x16\x70\x38\x36\x21\x9b\xb7\xb0\x9f\xea\x7a\xae\x9a\xc3\x3e\x42\xdc\xab\x65\xcc\x61\x42\xfc\xd8\xce\x15\xe9\x77\x17\xfd\xb3\x3e\x95\x38\xc4\x4f\x6c\xd9\xc1\xc6\x5d\xb6\x27\x51\xf5\x52\xf8\x70\xf1\x01\x42\xc9\x6f\x9d\xf1\x85\x5a\xbb\x39\xe4\x27\x06\xa5\x63\xab\x15\x45\x11\xfd\xce\x68\x7c\x95\x76\xf9\xed\xc3\xb4\xba\x55\x34\x6c\xe6\x68\x02\xff\xfe\xf4\xb1\xb5\xe1\x20\x15\xce\x8b\x57\xde\x54\x58\xca\xa0\xda\xf3\x41\x96\x81\x28\x58\x42\x88\xc2\xf2\x7c\xbf\xb7\x6e\xab\x28\x6b\xac\x5f\x66\xaa\xd0\x04\x9e\x0c\xa6\x0a\x90\x14\xe1\x79\x01\xc4\x13\x0e\x83\xce\xae\xb4\xc2\x71\x3e\x97\x1a\x23\x5e\xff\x99\x5a\x81\x3a\xe4\xea\x64\xa5\x83\xff\xde\xfd\xac\x82\xac\x76\xea\xf4\xd4\x7c\x4a\xc8\x25\x0f\xcb\xaf\xd6\xb8\x8f\xae\xb4\x80\x15\xf5\xb4\x2b\x53\x34\xa5\x0b\x31\xd4\x50\x2e\xa4\x91\xda\x90\xdc\xe9\x3c\x08\xfd\x56\xf5\xc5\x8e\xed\xb3\x79\x16\x6a\x23\x76\x2b\xe5\xe4\xad\xea\xa6\xf4\xae\x1c\x24\xe0\xca\xc4\xdd\xca\x03\x83\x45\x85\x60\xcd\xc4\x8b\x8c\xd1\xf4\x2a\x3b\xa2\xf6\xff\xb6\x07\x79\x09\xfc\xb2\x94\xad\x1e\xf4\xa4\x4c\x22\xec\x4b\x39\x87\xdd\xbe\xef\x32\x5b\x98\xce\xd5\x68\x15\xea\x7d\x5f\xcc\xf5\xaf\xdf\xe9\x8e\x0e\x6d\x92\x0f\x7a\xda\x2e\xb5\xc9\x16\x24\xc7\x6c\xbb\xa2\x99\x3a\x9c\x7a\x55\x02\x1d\x12\x7a\x66\x7b\x39\xe2\x35\xdf\x4f\x81\xde\xe7\xdd\x14\x28\x98\x77\x8d\xbd\x92\x13\x5b\x70\xb3\xac\xf5\x9f\x6c\x29\xa2\xc9\xd4\xa7\x00\x6e\xf1\x1a\x91\x8b\x3a\x29\x06\x26\x4a\x15\xd6\xb5\x29\x30\x8c\xbc\x89\xf8\x56\x01\xfc\x1e\xa1\x31\x4d\x67\xf7\x56\x6c\xf1\x09\x16\x5c\x7f\x92\xde\x1a\x18\xd7\x0d\xeb\xe0\x24\x34\x9d\xb3\x56\x0a\x6e\x52\x7e\x2a\xc3\xe0\x67\x89\x46\x87\x04\xe6\xb8\xf1\x87\x1f\x16\xba\xe9\x82\x73\x92\xb4\x18\xf1\x08\x6c\xc4\x97\x08\x6c\xed\x14\xb1\x24\x9d\x6d\x87\x94\xf2\x3b\xb8\x77\x9d\x41\x86\x48\xf2\x15\x56\x56\xa6\xfd\xa7\x44\x0c\x56\x28\x4d\x9b\x21\x88\xfa\x7d\x17\x36\xbc\xcc\x9c\xff\x0b\xe5\xb1\xe1\xf5\x51\xff\x81\x37\xff\x59\x66\xed\x9d\x0f\x7f\x01\xc3\xdf\xf2\x98\xe9\x10\x2f\xfb\xd3\x24\xbf\xca\x5f\xfe\x09\x68\xe6\x6f\x9d\x82\xf4\x87\xd3\x03\x93\x4f\x27\xf7\x8b\x28\x37\x8e\xb7\x2c\x38\x27\x29\x62\xa5\xf7\x35\xd7\x39\x2e\x5d\x33\x3f\xd8\x6d\xe1\x67\x26\x9c\x17\xa1\x65\xb9\x2d\x31\xa4\x88\x0a\x41\xe1\x36\xf7\x18\x96\x0a\x91\x9b\x3d\x7c\x4e\x74\xcb\xd7\x3c\x73\xf9\x21\xbe\x51\x3f\x73\x9a\xff\xb2\xe4\x1f\x80\x42\x6b\xb8\xcf\xb4\x56\x4b\x98\xfc\x4d\xe5\x32\x55\xce\x3f\x98\xb4\xd2\x2a\xe6\xfc\xe9\x19\x0b\x55\xbf\x2c\x93\x86\x1c\x1d\xca\xc1\x01\xb5\xe1\x6c\xf0\x99\x91\xc5\xde\xfa\x33\xf8\xd5\x10\x56\xd9\x34\xbb\x4b\x47\x7b\x65\x20\xd4\xc7\xae\x22\xea\x7f\xb3\x10\x9d\xe7\xf4"}, +{{0x4b,0x8e,0xd2,0x97,0x31,0xf1,0x04,0x79,0x5e,0x97,0xde,0xe7,0xc8,0xb4,0x01,0xa0,0x2a,0xfa,0xa9,0xa7,0x95,0xe6,0x13,0x35,0x3d,0x2b,0x95,0x00,0x17,0x65,0x02,0x7a,},{0xf2,0x22,0x98,0x21,0x0b,0x09,0xfd,0x61,0x7f,0xc8,0xb3,0x50,0x74,0xca,0x18,0x01,0xe6,0x07,0x5d,0xc9,0x2a,0x8f,0x50,0x34,0x4b,0x80,0xe8,0x54,0x05,0xa0,0x38,0xf5,},{0x23,0x45,0x88,0x66,0x86,0xeb,0x39,0xb5,0x19,0x9c,0xaa,0xa9,0x61,0x5b,0xc6,0xb4,0x89,0x6f,0x07,0x6e,0x8b,0xd7,0x36,0xc0,0x03,0x8a,0x65,0x17,0xf9,0xc2,0xb1,0x67,0xe7,0x59,0xf3,0x73,0x72,0x26,0x8a,0x69,0x7e,0x9b,0x78,0x60,0x5f,0x2e,0xd9,0x47,0x25,0xf6,0x90,0x5a,0x79,0x00,0x15,0x3f,0xc9,0xe8,0xbe,0xed,0x31,0xff,0xae,0x05,},"\xcb\xb5\xf1\x3a\x0e\xf2\x83\x7b\x80\x5d\x3b\x78\x51\x09\xf9\xf2\xe0\xd0\xa0\x17\xbf\xe7\x69\x2d\x91\xec\x23\xdd\xab\x78\x17\x33\x0b\xef\x24\x7f\xd9\x1a\xb2\xc7\x7d\xd4\x41\x25\x19\xcb\xd3\x84\x75\xce\x0c\xb3\x9b\x14\x80\x09\x2b\xc7\x38\xd4\x15\x2b\x8a\x6d\x55\x24\x8e\x3b\x9f\x32\xcd\xcd\x15\xec\x5d\x05\x9e\xc3\xc8\x84\x75\x54\xee\x47\x00\x53\x94\x97\x4d\x8e\xb2\x35\x92\xd1\x7f\x5a\x39\x6e\x3c\x19\xf8\xe8\x98\x37\x06\x79\xfe\xf5\x31\x8c\x4d\xd2\x99\xc6\x21\x7d\x6a\xbc\xc9\xb6\x1a\x5b\x2d\x0c\xfe\xf6\x95\xd1\x70\xca\x20\xa8\x3d\x6f\xd3\xc6\x66\xc8\xfd\x1c\x10\xad\x97\x0e\x2f\xa6\xaf\x10\xff\x0e\xd0\xcb\xfe\x75\x22\x46\xd0\x3f\x3a\x3c\x60\x32\xdb\xb3\x19\xbc\xfd\xac\x4d\xaf\xc5\x0b\xc3\xe6\xbf\x59\x5f\x49\x1d\xec\x38\x8b\x34\x41\xb8\xce\xe0\xdf\x91\xf5\x5c\xc7\x80\x7d\x07\xf8\xf5\x41\xed\x73\x22\xff\xc3\x9d\x18\xf8\x95\x60\xe4\x12\x3a\xec\x1d\x77\x96\x9c\xf1\x87\x77\x86\xf4\xcf\x94\xb1\x77\x0b\x10\x90\x65\x5e\x8c\x72\xee\xce\xa4\x57\x2e\x46\xf5\x80\xf9\x63\x96\x6d\xb2\xa1\x08\x5e\xea\xbc\x57\xbf\x4a\x84\x72\x4b\x9c\x85\x99\xa4\x33\xab\xf5\x8b\xca\x80\x40\x91\xd3\xd5\xe6\xe5\x04\x8e\xc2\x7b\xf8\x12\x9b\x67\x0c\xc2\xc8\x8d\x9c\xac\x47\x18\x59\xf4\x69\xb9\x18\xf3\xf6\xd7\x0f\x7d\x66\x63\x50\x1f\xfb\xef\xef\x02\x6d\x79\xea\x70\x92\x7c\xcf\x60\x75\xee\x51\x05\x42\x33\x21\xe1\x1a\xee\x9a\xd1\x6f\x98\x7e\xfb\xdd\x00\xb6\x2a\xff\x69\x8e\x52\x1a\xdf\x92\x03\xb1\x5e\x9f\x0f\x3a\xd0\x7d\xca\xd9\xdd\xcc\xaa\xe9\xb4\x90\x24\x7f\x12\xc3\x11\xde\xe6\xb7\x3b\x8f\x91\x24\xfd\xce\x12\x99\xb4\x7f\xb1\x91\x4c\xee\x7e\x3a\x07\x81\x4e\x31\x2c\x3c\xe5\x69\x27\x67\x2c\x51\xb3\x18\x59\x80\xcd\xe5\x7f\x3a\x75\x9b\x50\xbc\xfc\x4c\xb0\x75\x3b\x95\x4d\x97\x13\x5d\xeb\x2a\x05\x32\xe9\x8b\x66\xf3\x9a\x7c\x08\xcf\x4d\x54\x85\x39\xe2\xeb\x9f\x42\x2f\x66\x49\x65\x88\x93\xa7\xc3\xc2\x5a\x4f\xc9\x01\xf8\xc3\x98\xb8\xc7\x27\x33\x91\x1a\x00\x72\xed\x6b\xd2\xf4\x18\x93\x89\xae\x10\xa8\x14\xf6\x48\xd7\x1f\x69\xc3\x7e\x82\x95\x78\x44\x28\x18\x3b\x93\xc8\x01\x3b\x96\x4a\x9f\xef\x86\xb4\x8f\x48\x93\x16\xbc\x22\x2e\x96\xb3\xbd\x15\xff\x14\x9b\x96\x82\x03\x29\x55\x1c\x15\xe0\xd0\x95\xd1\x56\x9b\x1e\x21\x31\xc7\x87\x51\x56\x5c\x30\x41\xf2\x97\x85\x39\x5b\x97\x15\x13\x17\xf6\x2e\x35\x82\xe4\x07\xb1\x64\x9e\x60\xd0\x3a\x85\x99\x12\x0a\x30\x2a\x46\x95\xfa\x86\x2b\x41\x20\xf9\x4d\x22\xec\xae\x72\x39\x8d\x20\x94\xd1\x08\xad\x2d\xbc\x1b\x95\x97\x35\x90\x21\x42\xaa\x5f\xe6\xe7\x99\x65\x59\xf6\xf6\x01\x44\x8a\xea\x02\xf3\x56\xf8\xdc\xdd\x14\x43\x40\xeb\x36\x19\xf9\x86\x5b\xf7\x67\x2a\xea\x32\x6c\x4e\x93\xc9\x9f\x0e\xd1\xf9\xed\x86\x6b\xe1\x5d\x3a\xf2\x67\x5f\x6d\xd6\xe2\x96\x60\x2c\xa3\x73\xa8\x15\xb0\xbe\x46\xbc\x2a\x3f\xbb\xa0\x6b\x88\x05\xc7\x31\xfe\x08\x00\x7d\xaa\x06\x05\x09\x61\xb2\x4d\x14\x69\x3a\x72\x89\x8c\xcf\xb8\xb8\xfe\xdc\x60\xa4\xee\xf8\xff\x79\xb6\xdd\x75\x92\x59\x18\x33\xb5\x76\xef\x48\x29\x4e\x5e\x04\x85\x94\x2e\x57\xc1\x19\x60\x2e\xdd\xf8\x8b\x1f\xae\xa5\x17\xf2\xfc\x2e\x3d\x14\xd2\x46\xa5\x2c\xbd\x71\xa1\x08\xc6\x6b\x6c\xc4\xf2\xd4\x58\x04\xa2\x82\xec\xed\xb1\xb0\xad\x3d\xc3\xb4\x88\x0a\xb2\xff\x78\xb8\xdd\xde\x48\xf7\x46\x6c\x14\xfe\xd3\x49\xe9\x5b\x50\x53\xab\xf1\xbf\x09\x91\x12\x60\x31\xd9\x75\x47\xd1\x43\xc2\xae\x16\x49\x28\xb6\x1c\x07\x08\xaf\x8c\xa3\xe4\xf5\x51\x54\xd1\x3d\x75\xe9\x7d\xb4\xba\x3e\x69\xd3\x6e\x9b\x37\x08\x23\x68\xc2\xf7\x21\xbd\x3f\x95\x12\x6a\x1e\x00\x4e\xb2\xa1\xbf\x26\x83\x43\xae\x21\xd2\x99\x50\x44\xa2\xca\xdd\x67\xff\xac\x9e\x15\x38\x17\x5b\x3c\xc4\x4d\xb5\xd2\x6f\x1d\x5c\xc8\x9c\xa0\xe1\xc1\xee\x85\x37\xa8\xa9\x1d\x32\x4c\x2e\x02\xe1\x8b\x9f\xb9\x73\x0d\x6d\xda\x55\xf7\x2d\x84\x33\x89\x69\x3e\xbf\xcb\xa7\xfb\xe1\xa0\xbc\xff\xb9\xaa\x28\x4f\x4a\xe6\x6f\x44\xa8\xb8\x93\x02\x98\x3b\x22\x73\x6d\x0c\x72\xd6\xa0\x44\xe4\x29\x16\x24\x24\x3a\x4e\x0c\xe6\x5d\x5e\x53\x46\xd6\x7f\xed\x37\x60\xdd\xb0\xc5\x10\xb5\x0f\xf3\xee\xf0\xa1\x8a\x26\x7d\xe7\x30\x47\x6d\xd8\x2d\xff\x70\x72\xcb\xa0\x98\x48\x25\xa0\x04\xdd\x4b\xcd\x8c\x37\xfd\xaf\x1f\x68\x3d\x1d\x93\x80\xe1\x35\xa9\x5d\x24\xb8\x9f\xad\x0b\xe9\x41\xc5\x48\x25\x1b\xec\x90\xcc\xae\x01\x5b\xc0\x56\x7d\xa8\x4b\x37\x1e\x50"}, +{{0x08,0x0d,0x7f,0x76,0x18,0x2e,0xe6,0xbc,0xea,0x89,0x4b,0x1e,0x00,0x60,0x55,0x8b,0x3b,0x12,0x5a,0x34,0x99,0xdf,0x39,0x73,0xb8,0xdd,0x66,0x93,0x40,0x8e,0xe4,0x69,},{0x41,0x24,0x71,0x3d,0x7c,0x2d,0xf5,0x0f,0x93,0x05,0x57,0x30,0xd1,0xb2,0x81,0xda,0xec,0x30,0x28,0xcf,0x2c,0x1e,0x48,0x58,0xd1,0x28,0x70,0x7a,0x23,0xd6,0xde,0xb0,},{0x18,0x5f,0xb1,0xb6,0xd8,0x6d,0xc4,0x44,0x48,0x10,0xcf,0x5e,0xc6,0xfe,0xf0,0xab,0xda,0xfa,0x2a,0x6f,0xcc,0xb4,0x5d,0x11,0xcf,0xb5,0x4b,0xa1,0x6a,0x68,0x43,0xf2,0x80,0xd3,0x80,0x47,0x10,0x02,0xae,0x0d,0x71,0x50,0x85,0x56,0xc7,0x8e,0xd5,0x41,0x5e,0x42,0x33,0x8c,0x16,0x1f,0x2b,0x62,0x1e,0x74,0xcb,0xa4,0xf6,0xa1,0xd4,0x02,},"\xab\x0a\x6d\xe2\x35\x1b\x9a\x84\x98\xf6\x82\x72\xd9\xa0\xa7\xa0\x57\x36\x5d\x34\xef\xa0\xfd\x34\xcc\x3b\xf8\x62\xe4\x9c\xdc\x30\x2b\x2b\xd5\xa3\x0d\x60\x1a\x13\x0e\xc4\x03\x2f\x54\x1a\xe6\xcb\x7b\xa9\x7f\x84\x18\x3d\x2d\x25\x81\x28\x7c\xa7\x01\xd7\xd7\xa9\xab\xa1\x10\xce\x58\xb9\x46\xac\x08\x24\x30\x5d\xf7\x92\x9f\x3d\xd7\xfc\x9c\x87\x32\x23\x86\x37\xe2\xb1\x81\xd6\xe1\x16\xc7\xf6\x6e\x32\x26\xaa\xe3\xce\xd1\x61\x02\x62\xda\x1a\x0a\x4a\xa5\x0a\x1b\x94\x43\xec\x82\x83\x29\xe4\x73\x4d\x28\xfc\x25\xab\x9c\x1d\xe9\xb8\x98\x7e\x5d\xc0\xc8\x13\x19\x16\xc5\xf1\x89\x28\x70\x4a\x71\xe8\x06\x22\xb1\x49\x2b\xf2\xfe\xc5\xd4\xb6\xdb\xe4\x15\xc8\xaf\x2c\xe3\xef\x10\x9b\x34\xdd\x5e\x64\xd5\x68\x46\xf0\x85\x93\x5a\x4a\x5d\x10\x73\x49\x7f\xb3\xfb\x8f\xb7\x7e\x8f\x5d\x5e\x3f\xd0\x0c\x30\x65\x2e\x3c\x5c\xde\x40\xa3\x35\xd1\x4e\x54\x25\xff\xba\x94\x28\x85\xed\x17\xbd\x36\xdf\x50\x69\x24\x23\x7e\x75\xbe\x84\xda\x82\x19\x50\xb9\x14\x24\xfd\x9f\x16\xc1\xb2\xc7\x83\xe9\x0f\x8c\xc2\xcc\xc7\x98\x0c\xe9\x15\xc7\x69\x6b\x06\xa5\x86\x73\x02\x59\xe6\xd1\x45\x88\x58\x2b\xab\x9d\x2a\x39\xf6\x9e\x98\xe7\xf2\xae\x9b\xc0\xc2\x61\x0d\x7e\x04\x57\xf2\x6a\x5d\x66\x54\x3b\xe1\xd6\x5b\x79\xc4\xb7\xc0\xd8\xee\x73\xd0\xc2\xb6\x7b\xf5\x0d\x80\x82\xf0\x06\xf9\x6d\x11\x95\x05\x87\x31\x93\xdf\xdb\xd4\x32\xbb\x1c\x9e\xe0\xd0\x3e\xe5\x4c\xf9\x5d\x20\xe9\x1f\x7f\x3a\x06\x9b\x62\x56\xf4\x21\x59\xcd\xc1\xe6\x00\xa9\xa1\xc2\xf5\xa8\xe4\x67\xd5\xc2\xa9\xdf\xf8\x73\x0e\x6b\xe8\x26\xfb\x2a\x1e\x64\x48\xbf\xc4\xfc\xaa\xaa\xcd\xaa\x76\x62\x35\x1f\xaa\xdc\x91\xf7\xca\xa7\x73\x7d\xc8\x2e\xc3\xd4\xb2\x19\x36\xbc\xa1\xbd\x7c\xe3\x73\xad\x66\x26\x4a\xf1\x32\x41\x16\x75\x49\x31\x8c\xdd\x78\xe5\x63\x82\x7f\x85\xea\xb2\x0e\x0b\x42\xbc\x55\x4a\x71\x2c\x00\x51\xa5\x01\x0d\xc2\xf2\xc7\xdb\x85\xac\xf6\x54\x9f\x9d\x10\x2c\x90\x3c\x1b\xe5\xa0\x52\x92\xc3\x0f\x21\xab\x1b\x2b\x8a\xbc\xbb\xf1\x04\x72\x3c\x63\xf0\xeb\xc5\x54\xfb\xee\x42\x02\x0c\xcb\x14\xf4\x43\x47\x8d\xf7\x7c\x6a\xa4\x4d\xb9\xa5\x7f\x8f\xd4\x4d\x97\xea\x09\x9e\x47\x74\x82\x3e\xbe\x12\x3f\xcf\x50\x16\xa6\x6e\x83\x7b\x2f\x65\xc1\x84\x5e\x68\x1e\xe2\xa7\x05\x9f\xb1\x29\x0c\xd0\xa9\x33\x12\x98\x55\xcc\x83\xc8\x7e\x0b\x3b\xb6\x1e\x44\x13\x4a\xdd\xd3\x63\x78\x50\x24\x6c\xdc\xda\xa2\x9f\x15\xc4\x1a\x3d\x4d\xd2\xc1\xd7\x60\x06\x21\x24\x33\x31\x24\xcf\x09\x14\x35\xfd\xce\x71\x1f\x52\x31\x63\x68\x99\x9b\xef\xa4\xc8\x0a\x39\xb3\x75\x0e\x4e\x38\x62\x89\xe4\xe2\x85\x5e\x97\xb6\x19\xb0\xa2\x57\x99\x91\x24\x08\xb7\xd5\x8a\x4d\xd9\x81\x95\x71\xe9\x01\x43\x0f\x6d\x55\x55\x29\xdd\x63\x0a\x18\x67\x45\x9b\x80\x22\xd0\xe0\xad\xd6\xab\x4f\x12\xf6\x0b\xaa\xc7\x59\x79\xbb\xff\x7f\x62\x58\xd2\x8d\x67\x60\xb1\xff\x24\x3c\x39\xe4\xbb\xd6\xcf\x9b\xea\x57\x2a\x9c\x08\x2d\x05\xad\xcf\xd4\xcc\xf9\xfa\x02\x6f\x2c\x90\x4b\x6e\x78\x2e\xd7\x09\xdf\x77\x48\xa3\x07\xcd\x2d\xc3\xa0\xfc\x41\x23\xdf\x58\x0c\xbf\x49\xe0\x5c\xee\xab\xc9\xf3\x9e\x57\xb7\xf3\x00\x90\x5d\x8b\x31\x00\x91\xfb\x95\x3f\x3d\xef\x36\xde\xb3\xe8\xbf\x37\x2f\x59\x16\xb5\x15\x97\xdf\x02\x4c\xe8\x5c\xc4\xc3\x6e\xab\xdc\x58\x0b\x5c\xf1\x52\x99\x46\x48\xf1\xd7\xf3\x5f\xed\x5c\xd1\x0f\x6e\x29\x49\x16\x1a\x33\x59\xb3\x03\x4d\x45\x0e\xa6\xf6\x1c\xdf\x1d\x5a\xf7\x6d\x40\x10\x2b\x60\x29\x4f\x4e\x49\x07\x82\x49\x02\x6d\x62\xfe\x35\xfd\xf2\x24\x92\x8b\x0c\x49\xba\x2b\x53\x39\xeb\xb1\x92\xc5\xab\x7f\x05\xcd\xb9\x46\xe3\x7d\x67\x1a\x4a\x5e\xf2\xa5\x82\x72\x20\xb4\x43\x8c\xbd\xa0\x57\x36\x29\x28\x06\x64\x8f\x5b\xdd\x52\x42\x0f\xa7\x6b\x84\xa6\xad\xdb\x12\x63\xeb\x0c\x50\x0e\x81\x56\x6d\x71\x8d\x50\x66\x02\x6d\xa0\x97\x05\x4a\x86\x63\x10\x16\xdd\xfb\x70\x6a\x56\x77\xd5\x02\xef\x84\xaa\x73\xb5\x86\x3b\xc4\x0f\xdc\x42\xcb\x73\x21\xac\x5f\x00\xe2\x92\x8f\xed\x7b\x04\x18\x59\x6d\xb4\xb6\x15\x1d\xd6\xbc\x6e\x81\x8f\x02\x53\x55\x2b\xf1\x37\x41\xe6\x96\x80\xe9\x66\xc9\x2c\x29\x3e\x13\xc9\x0f\x7c\x99\x99\xbd\x1e\xc6\xaf\xe3\xb4\xaf\xfb\x47\x34\x0c\x89\x85\x98\x29\xfe\xb5\x99\xdb\x3a\x8c\x3d\x33\xfc\x8d\x45\xfa\x53\x81\x07\x8a\xe9\xf7\x5d\x85\xc1\x49\x6f\x5f\xb5\xad\xdf\x4e\x40\x09\xb7\x64\xbc\xc9\x11\x8e\x92\x75\xdc\x72\x19\xf2\x81\xd0\xd1\xef\x71\x58"}, +{{0x49,0x84,0x6a,0xda,0x7a,0xe6,0x84,0x97,0x1d,0xd9,0x17,0x10,0x79,0x90,0x90,0xb3,0x7f,0xe5,0xad,0x56,0x1d,0x72,0xa3,0x5f,0x2e,0xfb,0x40,0x5f,0x19,0x6a,0xb0,0xec,},{0x4d,0x37,0x0a,0x81,0x94,0xa3,0x04,0x5b,0x09,0xb3,0xbd,0xaf,0xa2,0x7f,0xb9,0xac,0xd5,0x99,0x43,0xa5,0x4a,0xe1,0x4c,0xba,0xaa,0x22,0x00,0xeb,0x0f,0x3d,0xa7,0x1b,},{0xa5,0xc8,0x09,0xd1,0xca,0x4c,0xfb,0xb3,0xdc,0x70,0xa2,0xa3,0xa1,0xf2,0x67,0xc2,0x73,0x30,0x42,0x07,0x19,0xe3,0x60,0x62,0x18,0xa1,0x47,0x1c,0xac,0x57,0xcb,0x67,0x4b,0x9b,0x42,0x82,0x7c,0x5e,0x9a,0x7b,0x25,0xc8,0x13,0x9c,0x13,0xdf,0xf6,0x0b,0xde,0x6c,0x2d,0xba,0xd3,0xa8,0x36,0x11,0x97,0xc1,0xfb,0x19,0xd2,0xcd,0x52,0x0b,},"\xab\x39\x8d\x94\xf9\x28\xb1\xd4\x21\x02\xa3\xe5\x13\xcc\xd1\xcb\x10\x89\x90\x11\x03\x94\x10\xa8\x88\x8b\xba\x26\xdf\x1a\x03\x72\xbd\xba\x0c\xe8\xd8\x54\xaf\x51\xe9\x33\x0a\x8d\xaa\x93\xc1\x05\x80\x90\x6a\x8a\xc7\x2d\x29\x4a\xeb\x95\x66\xfe\x1c\x78\xba\x84\x71\xc0\x6c\x4a\x8a\x75\x11\x3b\x34\x89\x3f\x62\x76\xed\x81\x32\x92\x05\x3b\x95\x6a\x46\x5d\x84\x7d\x2e\xce\x86\xe2\xda\x8a\x9f\x0f\xe3\xdb\x52\xa5\xaa\xc7\x46\xef\x96\x48\x5e\xf8\x1f\x13\x62\xb5\xa4\x2e\xaa\xee\x1f\xbb\x06\x46\x70\x44\x71\xa2\x1b\xf7\x63\x67\xbe\xaa\x07\x81\x2b\x3d\x32\xad\xcd\xed\xde\xd7\x53\x9e\x3a\x50\x1b\x83\xc0\x5b\x19\xa4\x9b\x52\x0e\xde\xdc\x9a\x78\xa5\xfc\x2d\x50\x12\xf1\xd4\xe3\x81\x84\x4e\x79\x2e\xd9\x0b\x0f\x57\xbc\xe3\x75\xc7\x5a\x65\x8b\x2c\x78\xc6\xff\x7d\x9e\xfc\xd4\xbf\xa3\x5c\x47\x68\xcb\xb1\x95\xe4\x82\x3d\x9b\xbd\x83\x5a\x37\x4f\xa0\x4c\xa1\xea\xae\x9c\x56\x6d\x8f\xd5\xaa\x7c\xa5\xef\xe0\xdf\xc3\x17\xff\xfa\x40\x9e\xf1\x02\x2f\x1c\x3b\x37\x6a\x93\x5a\xf5\x57\x08\x3e\x95\x28\x7b\x07\xa9\x8a\xc6\xc1\xb7\xbd\x8b\xb2\x6b\x60\xfa\x7c\x4b\xc9\x19\x73\xb2\x01\xb2\x99\x22\xb4\xb9\xd0\x3d\xd6\x88\x2a\x0b\xd3\xb7\xd9\xe5\xb8\x1e\xe7\x4c\x36\xbe\xc6\x65\xe4\x34\x3c\x8c\x9a\xd3\x36\xda\x38\x50\xc9\xb2\x69\x7f\xe1\xcc\xe2\x9c\x37\x86\x22\xa3\x3c\x24\x8f\x44\x8c\x88\xf4\x8d\xf0\x26\x01\x43\xb2\xa3\x42\xf1\xdd\xee\x74\xd3\xb9\x7c\xa3\xe1\x16\x6b\x15\x69\x93\xda\xd3\x0c\x49\xd8\x10\xd7\x40\x48\xbc\x6d\x46\x76\x52\x00\x4d\x7e\xdb\x65\xc6\xda\xc3\xa2\xc5\xd3\x00\xb9\x7e\xe3\xa1\x0a\x9e\x14\xb6\x9f\x3c\xad\x67\x59\x72\x96\x2e\x1f\x8e\xd9\x75\x47\xad\xed\xc4\x7d\x1c\xf3\x47\x1e\xf3\xb2\x2f\xdb\xf7\x8e\x34\xf3\x1a\x3b\xb7\x66\x9c\x41\xbd\x92\x92\xc3\x80\xbc\xe9\xa4\x2d\x84\xbc\x27\xac\x92\x8b\x8b\xfc\x3c\x63\xd2\x0c\xcd\xb4\x78\xdf\x7d\xdf\x42\x1f\xb1\xcd\x90\x5f\xfc\x4c\x04\x78\x6f\xd9\xae\xf0\x6b\x89\x38\xab\x8e\xf5\x22\x21\x7b\x2c\x04\x51\x5f\x61\xa1\xc3\x12\xea\x83\x25\x3f\x84\x58\xc0\x91\x8f\xcf\xe8\x74\xe6\xe7\xfb\x11\x27\x5d\xb2\xa2\xec\x79\xa2\xd8\x68\x30\x32\x33\xc1\xb6\x97\x95\x2a\x3b\xfd\x3a\xd0\xa6\xf6\xcd\xd5\xe7\x2c\xc9\x40\x9f\x74\x10\xa4\x0d\x5b\x45\x36\xdd\x46\xeb\x16\x11\xae\x86\x70\x36\x71\xb3\xa0\x51\x5a\x03\x77\xbe\xa1\x56\x54\xba\x0a\x0d\x1e\x4e\x96\x02\x63\x28\x42\xf2\xac\xd4\xef\x99\x32\x36\xe9\x93\xf2\x65\x0d\x59\x92\x3f\x24\xe2\xcd\x30\x93\x2d\x8b\xf8\xae\xec\x64\x44\x72\xba\x46\xa0\x78\x81\x49\x6c\x92\xa0\x13\x5c\x67\x5a\xeb\x0c\xe6\x18\x10\x88\xdb\x8f\x15\x6c\xfe\x74\x35\xca\xc6\xc9\x7d\xa6\x37\xdb\x4a\x89\xf5\x13\x31\xda\x13\x73\x1e\x74\x1f\xcc\xc0\x35\x55\x42\xce\x11\xef\xa6\x9d\x05\x38\xd3\xef\x12\x7a\xa6\x87\x45\xed\x30\x85\xd2\x9d\xa9\x0d\xc5\x83\x70\x1b\x6b\x3a\x70\xa3\xef\x3e\x16\xa9\x24\xb3\x32\x03\xb9\x23\x96\xc4\xb9\x45\xf1\x27\xa7\x88\x8f\xa0\x50\x15\xc0\x60\x30\x07\x56\x67\x29\x23\x7c\xc0\x78\x2b\x30\xc0\x20\xd9\x95\x95\x47\xfe\xec\x9f\x4d\x67\x64\x60\xbf\xe0\xc5\xc1\x9c\xea\xba\xee\x06\x82\xdb\x8b\xe6\x91\x35\x18\x1e\xc0\xfd\xd9\xf7\xa6\x6d\x50\xbd\xc3\x79\xe4\xa2\xc5\x98\x17\x8f\x95\x93\x94\x6a\xca\x64\x05\xb1\x77\xfc\xad\xe0\xf8\x64\x21\x58\x3e\xd6\x7e\xba\x18\x72\x22\xa1\xe4\x44\x95\xb3\xae\x54\x4f\xdc\xa2\x8e\x2c\x14\x48\x5e\xab\x04\x71\xaa\xa8\x03\xc2\x9a\x9d\x8a\x48\x92\x67\x64\xfc\xa1\xdf\x51\x40\x7a\xd3\x3e\xc1\x7e\x94\x1e\x6e\x26\x17\x23\x7a\x84\x30\x98\x73\xdc\x71\x36\x55\x87\xbd\xe4\x27\x4b\x5d\xc3\x27\xcc\xb1\xe1\xe9\xc8\x57\xe0\x42\xcc\xca\x8d\x85\x52\xba\x28\x8c\x97\x8c\xfa\x0a\xf9\x9d\x67\xcd\x03\x40\x60\x62\x8e\x23\x52\x5d\xbc\xa2\x07\x67\x9c\xe2\x96\x90\x87\x84\x48\x55\x3c\xd3\x86\x75\xbc\xe0\x7b\xf9\x7b\x93\x17\xdc\x44\x46\x8b\x76\x8b\x15\x8b\x0c\x11\x1d\x63\xa5\x72\x23\x56\x55\xc4\x0e\x16\x59\x7c\xa0\x59\xf4\x0c\x3d\x8a\xc5\xbd\x61\xa4\x87\xc1\x53\x13\x84\x6a\x70\x4a\x78\x11\xb8\xbc\x0c\xee\x61\xe3\x47\x62\xb6\xc1\xb7\xce\xa1\xc4\x6e\x60\x87\xe9\xa3\x6f\x89\x91\x8a\x25\x8b\x3f\xa7\x76\x20\xbe\x10\xc1\x84\xc3\xfc\x39\x73\x90\x24\xe9\x82\x78\xfd\x65\xb8\x2c\xad\x83\x69\x9f\x3a\xd8\xc6\xec\xcb\xec\x8b\x7b\x1b\xd7\x91\x4d\x3f\x6c\x3d\x02\xbf\x40\x28\x3b\x1c\x1f\x1e\x98\xe3\x08\xbe\xae\xbb\xf8\x94\xb8\xf5\xe9\x1b\xbb\xc6\x25\x35\xf9\x23"}, +{{0x83,0x34,0x3e,0x37,0xad,0x09,0x1a,0x85,0xee,0xc3,0x70,0x70,0x1b,0x81,0xa5,0x8f,0x93,0x70,0xa4,0xb0,0x42,0x3a,0x07,0x0d,0x60,0xf9,0x2d,0x8d,0x18,0x09,0x84,0x4e,},{0x50,0xb6,0x8b,0xf7,0x26,0xea,0xbc,0xa5,0x3a,0xc6,0xc9,0x0d,0x4e,0xac,0x55,0x47,0x03,0x71,0x2d,0x22,0x10,0x55,0x54,0xf0,0x5b,0xf7,0x9f,0x9d,0x08,0xfc,0xc4,0x93,},{0x9c,0x69,0x89,0xcb,0xe1,0x7e,0x16,0xca,0xa2,0x53,0xff,0xb1,0xa6,0x4a,0x10,0x6f,0xb0,0x17,0x82,0xc9,0x9b,0x17,0x22,0xba,0xf1,0xac,0xaa,0x42,0xae,0x5b,0x36,0xb7,0x9b,0x2a,0x2c,0xd8,0xfc,0x91,0xf5,0xad,0x89,0x23,0x81,0x70,0x25,0xa7,0x78,0x25,0xa0,0x5d,0xf8,0xc4,0x17,0xec,0x53,0xc4,0xa3,0xaa,0x1c,0x0e,0xfd,0x5b,0xbe,0x0f,},"\xc7\xda\xdc\xac\x5d\x87\x95\xe1\x74\xb6\x91\x38\x91\x2e\x70\xff\x41\xe7\xa7\x25\xfa\xf3\x85\xb7\x73\xed\x15\x09\x89\x72\xb3\x0d\x9b\x73\x93\x72\xd9\x75\xb4\x80\xcc\xfd\xfc\x58\x0e\x2e\x2d\xdf\x5e\x3c\x27\xee\x79\x12\x79\xab\x95\xe4\x38\x2b\x14\x59\xdd\x8d\x41\xae\x36\x0d\x4a\x87\x88\x46\x69\x29\x24\xfe\xef\x39\x0c\x0d\xbb\xfa\x35\xe4\xb8\x2d\x7c\xbc\x33\xee\x15\x81\xc5\x2b\xd9\x49\x38\x5b\x2e\xe4\x02\x63\xa5\x7d\xa1\x17\x4b\xb4\xac\xad\x37\xcd\x8a\xe2\xa6\xb4\x5f\x7a\x6d\x6b\xbe\xf5\xa7\x98\xce\x85\xb9\xe0\x5e\x76\x47\xe3\x34\xec\xfc\x77\x63\x78\xde\x17\x4c\x49\x7c\x0f\x40\x75\xe6\x25\xaf\x7a\xed\x50\x2c\xd1\xcf\x7f\x58\x8d\x0d\x80\x7f\x02\xe3\x2f\x43\x00\xf2\x28\xa5\x0a\x66\x7b\x5a\xd1\xfb\xbc\x17\xe0\xb3\xc5\x70\x51\xdd\xc6\x02\xf5\x76\x07\x9f\x6f\xc5\x88\x9b\x7f\x29\x00\x71\x13\x34\x42\x0f\xc6\x66\xf6\x6d\xba\xff\x41\x26\x33\x6c\x35\x3f\x1e\x5b\x56\x4a\x66\x45\x37\xf8\x37\x86\xda\x5c\x56\x27\x74\x54\x06\xd7\xb2\xfe\x32\x33\xbf\xd5\x8e\xf4\x64\xa0\x6c\x95\xcf\xd0\xb9\x88\xa7\x6d\x05\x3a\x64\x4b\xcc\x15\x9c\xad\x53\xa7\xc5\xdb\xb4\x0e\xef\x5c\xd0\x47\x05\x6a\x3f\x09\x26\x5b\x13\x25\x69\x9c\x7d\x15\x9d\x5c\x90\x24\x40\x17\x33\x57\xff\xab\x8f\x7a\x5e\x38\x9f\x46\x8c\x33\x3b\x78\x2f\x80\x17\x0a\xe9\x09\x83\xaf\x15\x3f\x2e\x73\xbd\x2b\xef\x12\x5e\x3d\x38\x68\xc2\xab\x9e\xcf\x03\xaf\xf7\x6e\xcb\xeb\x18\x16\x7c\xa2\xf7\x11\xcd\x56\x58\x51\xd7\xf0\x4e\xe9\xd9\xb0\x1b\x6d\x83\xa7\x60\x57\x22\x62\x0d\x28\xc8\x4d\x6c\x1a\xf4\x2f\x6a\x76\x92\x58\xf5\x3c\x1f\x66\xda\x36\x66\x6d\xa5\xca\xa9\xbd\x9e\x8f\xbc\x16\x92\x11\xb1\xae\xd9\xc2\x55\x8f\x6a\xaf\x5b\x14\x5a\xbc\x72\x1a\xbb\x00\x72\x01\x94\xe0\x27\x03\x54\x68\xbd\xe3\xfe\x0b\x88\x88\x4f\x4e\x9b\x26\xe7\x71\xe6\xc7\xa0\xa5\x5e\xa3\x6f\xc5\x0d\xec\x8c\xef\x16\x2f\x9b\xba\x5b\x4b\x16\x10\x5a\xfd\x6e\x37\x4e\x03\x8d\x5c\x85\x87\xcf\xd7\xdd\x88\x29\x0b\x2c\x9c\xab\x45\xa2\x64\xd6\x54\x0e\xa1\x41\x6e\x6e\x4e\x74\xa1\x2f\x45\xa2\xef\x13\xcc\x8a\x36\xe7\xb0\xa2\x6b\x90\x2c\x3d\x96\xe2\xe2\x22\x92\x02\xe2\x57\x65\x69\x4b\x94\x33\x73\xd1\x6e\x60\x0b\xd7\x86\xd9\x55\xa4\xb3\xf1\x02\x16\x40\xc3\x9a\x0b\x6c\x69\x15\x00\x28\x1a\xe0\xd0\x98\xcc\x7f\x38\x5e\x18\xa0\x7e\x62\xfa\x4a\x10\x1e\xf5\xb7\x85\x51\xfa\x29\xbd\x15\xee\x03\x53\xa1\xa5\xef\x9b\x21\x6e\x8b\x0f\xa5\x07\x50\xa3\x41\x62\xb6\x35\xa0\xbc\x5e\x5d\x72\x30\xaa\x19\xaf\xa1\x28\xab\xa6\x42\x2d\x38\xeb\x77\xa3\xf0\xbb\x9d\xd8\xe4\x65\x2f\x12\x07\x0a\x37\x36\x1c\x37\x25\x50\x3c\x9d\x22\xe2\xfa\xce\x2e\xa7\x4a\x70\x02\x40\x62\x47\xdd\x86\x97\x5f\x07\x57\x5c\x9e\x7c\x6f\x41\xb5\x3b\x26\xd5\xcf\x52\xc5\xac\xc2\xc5\xd9\x82\x71\x43\x4e\x9f\xa5\x09\xc6\xdf\xbd\x72\x43\x72\xaa\x5c\x13\x45\x1a\xae\x39\x3d\xe0\xa1\x86\x46\x4f\x5d\x33\x7e\x9f\x62\x7b\x4f\x1c\x29\x09\x46\x70\x65\xe8\x9a\x42\x2e\xc4\x0e\xe1\xd8\x0a\x13\x39\x00\xa6\x2f\x4e\x4f\x7e\x94\xeb\x72\x61\x5e\x7e\xc2\x99\x6c\x6c\x24\x30\xc3\xe9\x57\xce\xae\x21\x05\xa1\xe9\x0e\xae\xac\x0d\x31\xaf\xfa\x9f\x57\x92\x6d\x71\xd9\x72\xa9\xa2\xde\x11\x25\x8c\xc1\xe7\x28\x59\x9c\x9f\xb3\x87\x24\x91\x84\x7e\x10\xc6\x7e\xfa\xef\x6b\x69\x6a\x03\x0f\xf0\x53\x3a\x58\x3b\xea\x1d\x04\xdf\x25\xf7\xee\xf3\xa1\x3b\x8e\x31\xaa\xd1\x33\x85\x7d\xf1\xb4\xe5\xff\xbd\xee\x37\xf4\x0f\x38\xd2\x24\xc7\x0a\xe0\x4e\xf3\x3b\x41\xb0\x2e\x71\x91\xa8\x66\x56\xb0\xd7\x2b\x2c\xbb\x53\xc4\x90\x8c\xa2\x06\xf7\x57\x34\xb2\x77\x08\x15\x4f\xcd\x8a\x97\x42\x9c\xfd\x1f\x2d\xa2\x42\x97\x78\x43\x80\x03\xf5\xb5\xb9\xc2\x1d\x9e\xd2\x3b\x8a\xd8\xa2\x28\xeb\x4f\x65\xc2\x4c\x1c\x59\x69\x9a\x5c\x90\xaf\xf7\x73\xe5\xc6\x76\xdb\x36\x2a\x19\x30\xba\x16\xab\xa7\x6e\xf8\xda\xa4\x2b\x3e\xb2\xcc\xc4\x5c\x93\x4d\x23\xd4\x92\x9a\x7a\xd9\xe3\xef\x46\x8b\x06\xa4\x99\x5c\x80\xdd\x23\x6a\x7b\xcf\x38\x79\xd8\xb7\x94\x67\xf7\x2b\x33\x84\xc1\x60\xcc\x18\x17\x14\xe9\x2f\x20\x35\xe7\xb9\x72\xa2\xcc\x52\x42\xd9\x32\x52\x5e\xae\x7c\x50\xbd\x26\x3b\x0f\xa0\x9c\xbd\x9d\x6f\x98\x4b\x9c\xf6\x15\x2d\x9a\x13\x3c\x27\x84\x32\x02\xd1\xe8\x7f\xa5\xa6\xe1\x23\x5d\x9c\x75\x6b\xb8\xe6\x8b\x05\xb9\x8d\xa5\x41\x95\x22\x3f\xdf\x02\x10\x25\x32\x50\x63\x3c\x11\xc5\xf6\x0b\x5e\x67\xd7\xee\xfc\xaa\x6c\x2d\xaa\x52\x31\x37"}, +{{0xda,0x01,0x32,0x21,0xb2,0xf5,0x88,0xaf,0x40,0xe2,0x11,0xa0,0xf9,0x75,0xd4,0x4f,0x9d,0x65,0x02,0x81,0x60,0x51,0x4c,0x39,0x61,0x89,0xf2,0x7c,0x7b,0x06,0x66,0xea,},{0x07,0x11,0x7c,0x6b,0x0d,0xb5,0xb6,0xfd,0xa1,0xed,0xc4,0x39,0x6c,0x47,0xc2,0x2b,0x54,0xee,0x0c,0xe5,0x37,0x5c,0x3e,0xc6,0x33,0xc8,0x3a,0xfc,0x53,0xad,0x6c,0xe4,},{0x10,0xcb,0x52,0xd6,0x10,0xe4,0xa8,0x1d,0x32,0x86,0x9b,0xff,0xce,0x38,0x07,0xe6,0x39,0x1f,0x78,0x2f,0xcd,0x53,0x8b,0x55,0x4d,0x09,0x03,0x7f,0xda,0x72,0x28,0x5b,0x96,0x62,0xb1,0xb1,0x10,0x7c,0x40,0x81,0x78,0xac,0x00,0x9f,0x05,0x25,0x96,0x73,0x88,0xa7,0xd8,0x5f,0xa1,0x23,0x59,0xd3,0xce,0x38,0x75,0x03,0x7d,0xcf,0x6a,0x04,},"\xbc\x93\xee\x1e\xc4\x72\x8a\xc6\x36\xa6\x24\x8f\xcc\x45\x51\xc9\xd1\x59\x80\xdb\x8e\x5f\x54\xb0\xef\x07\x5a\x71\x97\x0e\x17\x6a\x3c\xb9\x18\x2e\x32\xda\x7a\x8c\x2a\xc0\xcd\x7e\x59\x57\x74\x57\x5f\x9c\x83\x50\x6a\x60\x6f\xac\xe8\x95\x12\x13\x5d\x03\x2a\xb0\x5e\x39\xff\xf9\xc8\xca\x6c\x25\xcd\x5d\x78\xec\xc3\xac\x32\x32\x90\xc9\xc8\x16\x26\x73\x5e\x19\x0e\xb5\xae\x34\x5c\xa7\xa9\x58\x40\x9f\x77\x43\xb0\xb1\x61\x49\x16\x83\x22\x17\xc5\x7e\xee\x1b\x4f\x8e\x62\x2a\xc0\x52\xa9\x3d\xd5\xb3\x9d\x07\x61\xe4\x0e\x9f\xbd\x83\x96\xf6\x0a\x3b\xf6\x66\x0c\x5f\xa9\x9c\xd8\x13\x9f\x68\xcb\xe0\x89\x4e\x5c\x67\xe1\x68\xcc\x74\xb2\x72\x4e\x9d\x91\xd6\x00\x0a\x0c\xec\x58\x7a\x11\x46\x3f\x72\xee\x6e\xd2\x55\xbd\x87\xeb\x30\xfd\x45\x75\x96\xf6\x88\xca\x0e\xa7\x3f\x30\x49\x72\x38\xde\x21\xc9\x3f\xbb\x12\x94\xdb\x61\xe4\xa5\x60\x89\x10\x6d\x1c\xf7\xce\x5a\x65\xec\x3d\x12\x17\x0c\xe7\x84\x0f\x08\x8a\x8d\x0e\x3a\xef\x17\xe5\x31\xde\x47\x80\x03\x57\x02\x58\xe9\x27\xf1\x56\xe7\x96\x10\x65\xaf\xa6\x66\xaf\x38\x58\x2b\x35\x3c\xc4\x77\xba\x77\x5c\xae\x45\x94\x6d\x08\xdb\x75\x21\x59\x14\xda\x32\x61\xb6\x22\x94\xe9\x2a\xfb\x38\x14\x59\xc2\x1d\xda\x4e\xa6\xed\x79\x5f\x79\x25\x7c\x09\x4d\xd6\x08\xdc\x8e\x1b\x7c\x40\xcd\x29\xfe\xa2\x22\x08\x8f\x65\x69\x7e\xa8\x88\x95\xd1\x0a\xce\xa8\x79\x73\x60\xdc\xba\xce\xe2\x69\xc6\x06\x60\x0a\xdf\xfd\xcf\x9c\x7c\x38\x1d\x0a\xd6\x69\x69\x67\xd9\xff\x03\xe6\x1a\x24\x90\x65\x02\xb2\x95\xe7\x6f\x4d\x08\x75\x65\x5b\x01\xe6\xff\xca\xcc\x8e\xf0\x11\x29\xc7\x2a\x58\x46\xb6\x0e\xc8\x00\x17\x37\x4e\x75\xd3\x06\x40\x3d\x9e\xcc\xf2\x64\x95\xd2\x98\x12\x0a\x06\x33\x83\x5c\x5d\x1e\xff\x17\xc9\xc6\x24\x76\xf7\x52\xc8\x97\x10\xad\xfa\x4d\x51\x61\x7b\x59\x18\x17\x3c\xba\x72\x25\x40\xe3\x88\xff\xbf\xfb\x96\x68\x74\xdb\x00\x40\x4d\x06\xb0\xce\x11\x39\xba\x74\x14\x3c\x76\xb8\xf4\xd3\x3b\x21\x16\xe1\xcc\xe1\x75\x17\x3a\x96\xfc\x15\x1e\xa2\x39\xbf\xc2\x0d\x66\xfb\xb6\xf5\x2a\x66\x6c\x0e\x81\xcc\x2b\x80\x20\x91\x06\xe2\x48\x0e\x41\x11\xc7\x0e\x7b\xe4\xaa\xbb\x68\x42\x2f\x0b\x8c\x6b\xa1\x5c\x14\x2f\x82\xe6\xc7\xf3\x78\xd7\x80\x0a\x09\xea\xa4\xda\x25\x3c\x2f\xd9\x1e\x12\x63\xc6\xb6\x55\xbf\x70\x25\x5d\x7e\x3b\xb4\x77\x55\x23\xa0\xa9\xe7\xff\x03\x79\x7e\xe3\xff\xca\x8a\x50\xd1\x0f\x20\xd5\xe5\xa8\x89\xec\x5e\x33\x4e\xf2\x6c\xf7\x99\x8b\x08\x36\xf6\x56\x45\x68\x88\xe1\x37\xf3\x9d\x3e\x43\xe2\xce\x3c\x6e\xf5\x40\xd9\x5d\x9a\x20\xc4\x2c\xb8\xae\x2d\x9d\x0f\x25\xa8\x91\xc3\x63\xea\xd9\xcc\x42\x3f\x9a\x32\x3f\xe2\x32\x28\x1f\xb6\x7f\x5b\xe1\xc0\x78\x43\x61\x46\x04\x68\xa8\x7e\x95\xdf\xa3\x5d\x7f\x0f\xfa\x22\x11\xbe\x6b\x5f\xb3\x2d\x42\xba\x65\x18\xab\x6e\xa9\x37\x80\xf4\x31\xd3\x00\x67\x31\xbe\x44\x40\xe7\x12\x97\x4f\x74\xba\xea\x41\x9f\x40\x22\xfa\x25\x02\xe1\xb2\x39\x8e\x93\x86\x16\x7d\x93\xec\xa9\x2c\xa6\x0d\xd7\xd9\x1f\xe8\x23\x24\xf6\x82\xd9\x4a\xa7\xa8\x6a\xb0\x34\xf8\xa9\xe9\x52\xe8\xfc\x95\xbf\xf4\xdf\xed\x6a\x43\x31\x3a\xbb\x92\x40\x1b\x30\xc3\x3c\x79\xa7\xba\x3e\xfd\xbe\x16\x28\x04\x0f\xba\xf4\x43\xf3\xf9\x80\x84\x6f\xdb\x28\x3d\xcc\xd9\x3f\xab\x09\x70\x8b\x7d\x54\x86\x1d\x74\xb1\xfe\x8f\x10\x70\x1f\x21\x1b\xa3\xd3\x90\xe8\xa6\xae\x40\x77\x39\x64\x6a\x79\xa5\x83\x37\xa7\x17\xa8\x72\x00\x9c\x2d\xf6\x76\x1c\x24\x25\xa3\x2a\x00\x18\xaa\xf9\x64\x64\x70\xcb\xc8\x7c\x3a\x65\xc0\xe0\xef\xfb\xaa\x52\x8f\xe4\x78\x3c\x77\x2a\xb2\x66\xb8\xf2\x82\x68\xcf\x14\xaf\x23\x4b\x15\x81\x6d\x1a\x3a\x49\x1a\xf5\xf2\x97\xe3\x3d\x57\x29\x71\x5d\x51\x2c\x37\x3f\xef\x5e\xcc\x3f\x39\x54\xa6\x0a\x2a\x0f\x64\xd8\x29\x47\x41\x19\xca\x1a\x18\xf1\x05\x78\xd0\x4d\x63\x8d\x5e\xea\xfc\x37\x1a\x94\x6f\x6c\xe7\xef\xbd\x2a\xcc\xe3\x4e\x20\x44\x1c\xde\x9a\x37\xd5\xa8\x7d\xc6\x19\xb0\xa7\x27\x59\x6c\xd1\x2e\x15\xcd\x97\x84\xbb\x91\xf1\x39\x9a\x59\xfc\x0a\x7a\x4a\xf6\x8b\x0d\x57\x5d\x93\x38\x71\x72\x97\x33\x75\xc4\x65\xdf\x5d\x2d\x5e\x06\x1a\x2a\x9b\x23\xb4\x91\x5a\x0a\x8b\x8c\x1f\x09\x42\x09\x4a\xf7\x28\xc8\xc3\x11\x45\xfa\x7a\xaf\x74\xa2\x1a\x3b\x03\x2b\xb0\x9c\x39\x22\x05\xbf\x09\x5b\xda\x98\x6e\x5d\xd6\x62\x7c\x1e\x41\x7f\x65\x03\x26\xdf\xe3\xa9\xc9\x99\x4c\x6e\x0e\x01\x27\x6f\x91\xf2\x98\x7d\x2b\x85\xde\xda\x96\x54\x91"}, +{{0x5a,0x86,0x8f,0xb7,0x5e,0xa0,0x72,0x1f,0x7e,0x86,0xc7,0xbc,0x10,0x6d,0x74,0x13,0xc8,0xcf,0x4d,0x03,0x3c,0xe1,0x40,0x05,0xdf,0x23,0xce,0x4c,0x15,0x5b,0xbd,0x27,},{0x6d,0x1e,0x29,0xf3,0x9d,0xed,0xa2,0xbb,0xfb,0xb5,0x7c,0xb0,0x1c,0xb3,0x9e,0x58,0x80,0x82,0x78,0xe5,0x19,0x6a,0xda,0x1c,0x02,0x76,0x46,0xf2,0x04,0x87,0xd2,0x52,},{0x38,0xc4,0x8d,0xba,0x99,0xa6,0x52,0x4a,0x18,0x8d,0x5c,0xd7,0x8a,0x98,0xe6,0x77,0xdd,0x26,0x3e,0xf6,0xb4,0xdf,0x44,0x6b,0x31,0x0b,0x3d,0xd8,0x9c,0xaf,0xdd,0xb9,0xb1,0x7a,0x65,0xbb,0xa8,0xe1,0x39,0x68,0xbd,0xc2,0x5b,0x1d,0x84,0xb6,0xe2,0x43,0x6e,0xdf,0x31,0xaa,0x75,0x6e,0x3a,0x48,0x72,0x6d,0x6f,0x91,0xc8,0x08,0xee,0x0e,},"\xd5\xaa\x11\x82\x5b\x99\x44\x8c\x80\x63\x06\x23\xd8\xc7\x46\x01\x7c\xfe\x3d\xe6\xfa\x8a\x0c\x6e\xd6\x62\x71\x27\xcf\xc1\xf8\x4d\x4e\x0a\x54\xe6\xa7\xd9\x08\xd3\x71\x9f\x14\x21\xd1\xd4\xc7\x8b\x3c\xdd\x94\x76\x9a\xb6\x03\x3b\xce\x97\x9d\xd9\x0e\x10\x68\x02\xeb\xa9\xa0\x32\x95\xd4\x8f\x9b\x9a\x95\xd5\x7e\xe7\x74\x54\x02\xa4\x80\x23\xbf\x3b\xdd\xd5\xc6\xb9\x1c\x77\x3e\x49\x19\x13\xa3\x8a\xc3\x46\x26\x05\xcf\x28\x2d\xea\xc7\x57\x42\xfb\xd2\x75\x29\x27\x6e\x81\xdc\xce\x8d\xff\x96\x05\x03\x5e\x8c\xf0\x5d\xf6\xa4\x3d\xb1\x51\xf0\x41\x57\x65\xbc\xbd\x1f\x1b\xb6\x68\xad\x62\x73\xb8\x91\xc0\xdc\x4f\x3d\xba\x59\x0e\xa8\x2f\x83\x63\x76\x9b\x9c\x77\x51\x19\x47\x11\x73\x75\xdc\x49\x04\xd4\x8b\x88\xb6\x8a\x25\x5b\x28\x01\x1b\x11\x04\x81\x94\x09\x3e\x98\x20\x7a\xb1\xcf\x75\x6a\xb8\x33\x1f\x8d\x6f\x9d\x5b\xe2\xe1\x19\x05\x73\xe9\x5e\x71\x0f\x2a\x35\x01\xb5\x3a\xa0\x82\x5d\x6c\x12\xdc\xfb\x94\xac\x80\xdc\x10\x82\xcb\x4a\xd2\x62\xe6\xd4\x93\xad\xce\xb6\xbc\x19\x14\x5f\xbf\x73\x8d\xf7\x6f\x21\x34\xfa\x04\xcb\xbe\x44\xff\xc5\x5f\xfe\x5f\x9d\x3e\x9b\xeb\xd1\x59\xa0\x01\xaa\x9b\xf7\x88\x92\xa1\x65\x38\xa5\x20\x82\x3c\xde\x5d\x61\xe2\x9a\x56\xa7\x7a\xb9\x6e\x49\xe3\x00\xd9\x86\x59\x62\xc7\xe7\xfb\x8b\xcf\x5d\xe0\xb9\x38\x29\x7c\x3f\x4d\x6f\x60\x21\xe2\x4d\xfd\xad\x98\x61\x65\x2f\x34\x0f\x42\x1e\x7a\xf2\xc7\x1e\xd9\xa7\x15\x87\xfc\x75\x3b\x11\x55\x49\xb2\xf7\xf7\xcb\x29\x69\x0e\xa2\xb1\x58\xa9\x4c\xd2\xbc\x42\xe7\x06\x3d\x61\x9b\x93\x9d\x52\x3e\x3c\x23\x7e\xb1\xf4\x08\x10\xde\x0b\x44\xaa\x69\x37\x86\x3d\x62\x9e\xdd\x55\x75\xe6\xc0\x47\x52\x61\xb6\x27\x47\x30\x92\x77\x5c\x84\x36\x00\x11\xd5\x7c\x57\x20\x9c\x2e\x87\x5a\x3f\x89\x63\xe8\xb2\x41\xa7\xaa\x75\xef\x30\xc4\xa7\x18\xac\x4d\xd4\x66\xdc\x7a\x3e\x40\xe5\x87\x4f\x15\x7a\x84\x9e\xd3\xa3\xa9\xd4\xae\xb7\xd9\x4d\xf0\x9b\xb5\x5a\x0b\x2b\xc9\xf8\xb6\x95\xc3\x71\x79\x30\x23\x67\x60\x63\x67\xc5\xf3\x24\x82\x8c\xe7\x5a\x94\x4f\x50\x70\x3a\x47\x90\x6a\x80\x88\xf3\xa1\x1c\xfe\x4a\x85\x4e\x01\xf1\x74\x12\x52\xc4\x86\x33\x7d\x06\xb1\xcc\x6c\x6b\x9b\x12\x95\x43\x1e\xe0\x73\x59\x35\x7b\x3a\x78\xef\x50\x75\xb6\x5d\x7f\xed\x5e\xb7\x42\xe5\x10\x15\x98\x44\x4b\x46\x62\x3f\x89\xa3\x03\xac\xc1\x0c\x73\x24\x49\x51\x3b\x70\xdc\x45\x6a\x79\xd3\x7c\x48\xe5\xe7\x26\xc2\xf5\x58\xda\x0a\x1c\x46\xef\xbd\x2d\x92\x03\x26\xa6\x78\xb8\xa2\x2f\x09\x44\xbe\x4a\xf5\x5b\x6c\x71\xf4\x53\xfb\xae\x40\x0e\x6a\xcc\x04\xe0\xe9\x5c\xa2\x00\x16\x7e\x96\xee\x98\xea\x83\x93\x16\xda\x93\xa1\x2c\x2d\x76\xf1\x1a\xee\xbe\xb7\x8e\x65\xea\x48\xf7\xfe\xeb\xbb\x13\x7b\x2a\xc6\x7e\xae\xf0\x2a\x2d\x9e\x64\x71\xdd\x63\x4a\x03\x7d\x4f\x5d\x35\xa2\xf7\x8a\xf4\x1a\x8e\xa5\xaf\x5b\xc8\x15\x0a\x99\xed\x68\xa6\xa0\xcc\xff\x2b\x1d\x79\x65\xd8\xbc\x3e\xf9\x28\x5b\xa6\x42\x1d\x87\xc3\x3a\xad\x81\x03\xa5\x87\xbe\x01\x92\x68\x45\xbf\xbd\xdb\xaf\xc6\x9c\x4b\x92\x52\x88\x67\x20\xd4\x18\x50\x9f\x40\xf3\xdc\xf5\x57\x65\xdc\xcc\x3d\xee\xd8\x27\x72\x15\xe6\x9f\x05\x6b\xa3\x1b\x8a\x30\xb5\x00\x94\xea\x8f\x14\x47\x20\x76\x0c\x8f\x8c\x05\x5c\xf1\xa8\x69\x64\xff\xcb\xb8\xee\x1b\xb2\x18\x12\x76\xea\x99\xa7\xb8\xe7\x10\x67\xfa\x31\x0b\xa4\x47\x1e\x84\x27\x90\x37\xbc\x49\x2a\x55\xde\x20\x55\x48\xe7\x7b\x01\x45\x04\xee\x66\x64\xc4\x98\x8c\xbb\x9e\xd9\x1f\xf3\x2e\x22\x59\xed\x4c\xfd\x61\xa1\x97\xd0\xdb\xc3\x2c\x68\xf6\x54\x9c\x0d\x29\xfc\x45\xf3\x6a\xcb\x26\xb1\x64\xde\x97\xcc\xdc\x37\x90\x0d\x93\xcd\xbc\xf9\x68\x7e\xf5\x3f\x1f\x4d\xa1\xb1\xae\x42\x25\xb8\x84\x20\x9e\x81\xba\x43\x11\x52\x04\x77\xed\x42\x11\xb0\x92\x40\xbd\x7b\x82\x5e\x54\x73\x9f\xe2\x5d\x86\x24\xaf\x04\xb8\x6f\x6d\x11\x06\xd1\x81\x70\xe5\x06\x4d\x1a\x73\xc1\xfb\x1a\x27\xb2\x89\xa9\x48\xd7\x71\xa2\xf6\xb8\xb0\x9a\x63\x5d\xb9\x6c\x62\x51\xc3\x5a\x18\x76\xd3\x69\x62\x66\x99\x41\x6c\x0e\x40\x29\x8a\x68\x1f\xda\xf5\x25\x5f\x58\xc2\x55\x77\x59\xd8\xf5\xdf\x14\x8d\xec\x9d\xbe\x1c\xe6\xdf\x04\x1c\x36\xf8\x3e\x69\xcc\xfb\x4a\xac\xa5\xcb\x48\xfa\x6a\x85\xc8\xff\x66\x06\x15\x24\xd8\xb1\x1b\xd7\xff\xae\xd9\x9d\x0c\xd4\x5c\x42\x01\x0f\x21\xd3\x6c\xc3\x16\xca\x86\x09\x55\x63\x5b\xff\xaa\x7d\x9a\xac\x57\x2d\xcc\xf3\x15\x3d\x42\xee\x8a\x2b\x12\xba\xa5\x7c\x16\x0b\xd0\xad"}, +{{0xc5,0x4b,0xd3,0x43,0x1f,0x26,0x59,0x28,0x1d,0x31,0xe9,0x3b,0x30,0x78,0x76,0x68,0xbc,0xba,0x6e,0x5e,0xe4,0x7d,0xb4,0x6e,0x50,0xde,0xab,0xe3,0xf4,0x8c,0x9e,0xd8,},{0x1e,0xba,0x6e,0xb3,0xf7,0xf2,0x4c,0xdf,0x80,0xab,0xf8,0xa1,0x9d,0x30,0x8c,0x24,0xf1,0xe2,0x5b,0xa1,0x59,0x70,0xed,0xa7,0x11,0x67,0x07,0xb0,0xf1,0x2c,0xf9,0x32,},{0xdf,0x45,0x41,0xdf,0xf1,0xa9,0x79,0x7f,0xeb,0x61,0x7f,0x98,0xe4,0xb5,0x7a,0xa7,0x71,0x41,0x31,0xee,0x8f,0xf5,0x45,0xed,0x50,0x82,0xe3,0x56,0x8e,0xfd,0x1c,0x39,0x9c,0xdc,0x56,0xf5,0x58,0x29,0x91,0xeb,0x87,0x85,0xfb,0x33,0x86,0x4e,0xef,0x7f,0x55,0x3f,0x3e,0x24,0x82,0x62,0xed,0x54,0x8a,0x1a,0x68,0x88,0xf9,0x2e,0x92,0x0e,},"\x6f\x8c\xdd\x75\xe1\xb8\x56\xbb\xbe\x9c\xdc\x25\x53\x7f\xdf\x7e\x82\x36\xcb\x02\x9a\xcd\x39\x84\x49\x21\x10\xd0\xc3\x04\x41\xd4\x21\x84\xb5\xfb\x18\x3d\xa9\xf3\x14\x03\x78\xdf\xa7\xd7\x4c\xcc\x9e\xf5\x00\x19\x3c\xc9\x57\x9f\xff\xa6\x0b\xd2\xa8\xab\x9e\x09\x58\x15\x00\xcf\x06\xcd\x35\xab\xc1\x71\xd9\xd1\x2c\x65\x80\xd9\x68\x2f\x9f\x49\xfe\x36\xd0\xa3\x17\x72\x38\xfa\x50\xe7\xeb\x4c\x27\xe4\x60\xf5\xe4\x58\x0a\x56\x56\x8a\x19\xe0\x3d\x95\xb0\xff\x4f\x4a\x23\x18\x24\xcd\x2f\x34\x42\xe0\xba\x40\x0b\xc1\x1b\x7a\x98\x9d\x50\x1f\x5d\xf3\x5e\x43\x01\x50\x8f\x72\xa8\x52\x01\x4b\xfb\xf4\x00\x1e\x28\x09\x54\x73\xd9\x65\x9e\xed\x60\x67\xba\xf6\x8f\x92\xbe\xf3\x12\xc0\x9b\x19\xaa\xf7\xc4\xfb\xa3\xd9\x02\xb9\xf6\xcf\x95\x2e\xb9\xb9\xa5\x3c\xa8\xbc\xbd\x04\x2d\x84\x2e\x98\x53\xb6\x72\xa1\xd0\x09\xd8\x23\x83\x8b\xeb\xe5\x63\x7c\x4c\x07\xed\x1b\x19\x48\x55\x4b\x23\xb3\x2d\xe1\xd6\xc1\x16\xf9\x33\xb3\x54\xf2\x8b\xbb\x77\x9f\xa6\x54\x8c\x48\x29\x2b\x61\x2c\x7f\x55\x1a\x75\xfb\xc4\x6c\x02\x73\x6b\xf9\x9e\x9c\x8e\xad\x56\xf0\x5a\xb0\x42\x7a\x6e\xc6\x16\xe3\xdc\xc7\x75\x7e\xfd\xb7\x62\x8d\x4e\x96\x32\x5f\xe0\xae\x25\x4c\xef\x5c\xb7\xa7\x04\xb3\x5a\x92\x0c\xb3\xfa\x2a\x03\xe9\x61\xda\xf3\x71\x82\x1b\xe0\xb3\x0f\x19\xae\x49\x52\x44\x1e\x08\xa7\xd2\x2f\x54\x31\x39\x0a\x5b\xe8\x09\x7f\xd5\x79\x7a\x1a\x62\x97\x66\x4d\xa4\x2c\x20\x08\xd0\x32\x10\x60\xeb\xe3\x18\x1e\xb7\x95\xa7\x28\x92\x58\x08\xda\x78\x67\x29\x3b\x72\x08\xf3\x77\xd3\xa7\x71\x18\x5e\x6d\x2c\x1c\x8c\xe1\x83\x76\xfe\x3c\x0c\x14\x58\xc7\xf5\xbe\x34\xf4\x28\xa0\xd5\x75\x93\x10\x74\xc9\x7c\xbf\xce\x8a\xd8\x13\x13\xec\xca\x73\xa9\xf3\xdb\x43\x4f\xba\xd4\xbb\xbf\xf5\x02\xbf\x72\x97\xe1\x7a\x97\xa8\x86\x42\x11\xe6\x78\x9b\xa1\x92\x03\x6e\xa5\x9a\x34\xd8\x4f\xf2\xa1\x11\x07\x4c\x3f\x23\x73\xb1\x01\x11\xb5\xda\xa7\x89\x56\x0c\xb3\x54\x90\x95\x4c\x88\xea\x00\xc4\x10\xdf\x85\x0a\xd0\x0c\xae\x2f\x28\xe7\x19\xfb\x06\x71\x69\x88\xa9\xbb\x0b\xfc\x6c\x98\x9d\x58\x7e\x56\x85\xae\x88\x3c\x2c\x2e\x74\xdd\xbf\x91\x5c\x98\x56\xaa\xe8\xf3\x28\x8f\xc6\x25\xbf\xb2\xfe\x26\x8d\x74\xf5\x9f\x8b\x7d\x83\x63\x74\x97\x69\x16\x90\x07\xd5\xe6\x7b\x7d\x0b\x8c\x8f\x5a\x9d\x9f\x9c\x7b\x74\x5c\x0a\x42\x94\x76\x2c\xbe\xca\x42\xd5\x38\x49\x61\xe9\x21\xa7\xef\xb6\x5d\xa8\xd1\xe0\x3b\x67\x45\xcd\xf3\x08\x09\x7f\xb1\x3d\x64\xfd\x2f\x8c\x10\xfa\x95\x09\xeb\x2d\x91\x38\x7f\x00\x64\x5c\xa7\xd0\x48\x3b\x2c\xd1\x4c\x20\x6b\x8d\x7a\xe0\xa3\xfb\x7c\x09\xbc\x68\x43\xd1\x02\xad\xcd\xa1\x9f\x8b\xbd\x85\x1e\xb6\x83\xc4\x43\x5c\xeb\x4b\x3d\x23\xd3\x8f\x56\xd4\xd1\x11\x4e\xef\x0f\xc6\xf2\x4d\xf5\x27\x70\xd8\xf1\xf3\xf8\x2f\x47\x20\xe8\x92\xb3\x15\x24\x4e\xf5\x6c\x36\xb2\x3f\xcd\x40\x79\x78\x52\x41\x40\x38\x2e\x11\x74\x0f\xd4\x6f\xe4\x29\x99\x23\xf5\x2b\x88\xb4\xa9\xcf\xf4\xb2\xb4\xb2\x3a\x2e\x76\x0a\xd8\x1c\x78\xba\x87\x69\x31\xd9\xaa\xa4\xbe\xed\x40\xfb\x10\xa7\x99\xeb\x30\xd3\x7f\x75\x47\x78\xba\xc8\x5b\xf0\x63\x1d\x85\x2b\xe7\xd7\x4a\x64\x31\xf3\x84\xa4\x02\x5c\x10\x91\x42\x1d\x67\xa4\xe9\xc9\x4c\x1b\xe3\x69\x0c\x6b\xf8\x1d\x06\xbd\xaf\x32\xfe\xab\xba\xf1\xdc\x26\x3f\x27\x3a\x0b\x9e\xd6\x54\x60\xba\xef\xce\xfc\xf6\xac\xcc\xda\x0e\xdd\x23\xdf\x9e\x05\x12\x8e\x29\xd6\x61\xc4\xb4\x4b\xd9\x2d\x64\x0f\xaa\x85\x3a\xfd\x83\x70\xe5\x63\xb4\x0a\xe0\x14\x9a\x14\x28\xe0\x6e\x3d\xd8\xe6\x6b\x79\xda\x21\xcc\x75\x3d\xdc\x47\x6e\x3d\x76\xe2\xf3\x6f\x2b\x6c\x6b\xc1\xb6\x50\x87\xd5\xf8\x6c\x8a\xc3\x54\x71\x1a\x8c\x08\xf3\x48\x6e\x47\x9d\x6a\xe9\x43\xf8\x84\x63\x32\xd4\xe5\xb4\xbb\x2e\x82\x57\xe3\x08\x3d\xf4\xf8\x1d\xd4\xf0\xc1\xee\x1d\x97\x18\x21\x66\x16\x1a\x18\x59\x7e\xe0\xb9\x59\xde\x1c\x45\x59\x1a\xbf\x7c\x51\x03\x3d\x7c\x66\x35\x2d\xee\xb6\x82\xe7\x77\xae\xae\x2f\xa8\xd3\xa7\x7f\x47\x0d\xb7\x8d\xdc\x1b\x1f\xc8\x28\x40\xc4\x06\x57\x76\xd9\xbf\xca\x9d\x39\x2d\x92\x88\xee\x91\x32\xaa\x3e\x4f\x2d\x19\xd0\xd9\x3e\x01\xb6\x66\xf3\x64\x7a\xba\xf2\x25\xc2\x92\x41\x9c\x8a\x82\xeb\xa3\xe1\x1a\xb1\x03\x84\x6f\xcd\x49\x35\xf4\x12\x41\x47\x7c\x0f\x15\x2b\x79\x65\xad\x54\xbb\x72\xbc\x3d\xe2\xe0\xb7\x9d\x62\x25\xe8\xfa\x7a\x62\x86\xb5\xfc\xcb\xb3\x58\x22\xe8\x0c\x8b\xfe\xa7\x4c\xb4\x8a\x22\xd2\x41\x38\x53\x95\xc2"}, +{{0xea,0x60,0xda,0x01,0x79,0xbc,0xaf,0x6b,0x21,0x81,0x42,0xb1,0x11,0x90,0x46,0xff,0xe6,0xd8,0x5a,0x74,0x1b,0x0d,0x16,0x62,0x30,0xbc,0x6d,0xe3,0x30,0x4f,0x67,0x73,},{0x50,0x6b,0x2e,0xbb,0x49,0xbd,0x9b,0x9f,0xf6,0x6e,0x6b,0x7b,0x1f,0xab,0x96,0x68,0xcb,0x18,0x1b,0x4f,0xb5,0xe4,0x34,0x3d,0xdd,0xd3,0xf8,0xa9,0xd7,0x02,0x03,0x1c,},{0x27,0xfb,0x6b,0x5f,0x06,0x52,0x8a,0x64,0x19,0x8a,0x3e,0x7d,0x67,0xc7,0x38,0x84,0x0a,0x8c,0xff,0x4b,0x48,0x2b,0x4d,0x52,0x4b,0x12,0x2d,0x17,0xd2,0xae,0xbc,0xc0,0x38,0x9b,0xe2,0xc6,0xe2,0x8e,0x2c,0xdf,0xc4,0x84,0xc1,0x8d,0xe4,0x25,0xdb,0x56,0xcd,0xfa,0x56,0x1c,0x50,0x7c,0xd9,0x70,0x60,0x2d,0x3a,0x38,0x5d,0x3a,0xea,0x0f,},"\x61\x2d\x6e\xf6\xe4\x34\x9f\xfa\xe5\x16\xe9\x83\xe8\xfa\x7b\x52\xd9\xfd\x13\x42\x82\x24\x0d\x95\x14\x38\x24\xbd\x4a\xae\x03\x23\x4b\x76\xa8\xcd\x6d\x40\x68\xcf\x00\x9e\x48\x1c\x26\x85\x36\x1c\x75\x50\x42\xc4\xe6\xab\x87\x03\xec\xbf\x8f\x02\x0c\xf5\x73\x9a\x4c\x2a\x03\xc3\x73\x1e\x9c\xf7\x5a\xee\x25\x96\x61\x53\xb9\x71\x15\x15\xc6\xc3\x9a\xfa\x95\xf2\x21\xac\x33\x95\xb0\x89\xc9\x7a\xc9\xb5\x14\xe1\x7d\x55\xf7\x96\xa3\xec\xc1\x35\xfa\xaa\xee\x90\x7a\xab\x10\x29\x64\x7b\x48\xac\x81\x74\x9b\xab\x26\x62\x7c\xf7\x09\x5d\x74\xc2\xfc\xee\x35\x67\x1c\x8b\xb4\x60\x53\xf5\x15\x1b\x0c\x2e\x5d\xab\xe0\xf2\xd6\xaa\x20\x41\x33\x05\x02\x0b\x2a\xfd\x9e\xe3\x38\x7b\x2c\x9e\xd0\xbc\x3f\xe2\x90\x2a\xf4\x10\x0c\xec\x23\x32\x7b\x0f\x1e\x4c\xa3\x9e\xf6\xea\xf6\xfd\xf5\xd5\xac\xf9\x3f\xc8\x68\x53\x6d\x8c\xba\x40\x17\x69\x32\x9f\xbe\x93\xef\xfc\x7e\xe6\xbf\x93\xa6\xe5\x88\xbd\x55\x1e\xaa\x51\x28\x53\x95\x2c\x81\xb2\x45\xe5\xd2\x29\xd2\x94\xe4\x13\x70\xb8\x67\x80\x86\x67\x88\x7a\x6f\x9e\xba\x2a\x8d\x56\xa7\xa7\x04\xe6\x6b\x1c\x02\xf9\x6e\x73\x89\x5f\x48\x3e\x44\xa5\xc5\x66\xcb\x1a\xf2\x65\x73\xbf\xe2\xaf\xce\x06\xb1\xfb\x58\x77\xe5\x1e\xf3\x12\x6a\x3f\x21\x0f\xbf\x21\x3e\xd6\x5d\x5c\xa4\x6c\x46\xce\x4a\xa9\x45\xbd\x8c\xa6\x11\xe3\x83\x62\x50\xf5\x64\xf7\xea\x35\x42\x39\x82\xf9\x70\x5f\xcd\x6b\xef\x46\xae\x16\xcb\x0f\x6b\xc9\x12\xc3\xf2\x86\x42\xb8\xd8\x77\x75\xb8\x18\xe4\xe4\xe8\x06\x11\x67\x89\x9b\xd2\x7a\x7e\x2f\xb8\x18\x7e\xe9\x91\x7d\x2d\x58\x6b\xf9\xd4\x99\xe8\xfa\xbc\xa8\x3d\xdf\x58\xc7\x43\x7e\xaa\xce\xc4\xf4\x44\xfb\x2b\xf7\x45\xdc\xcd\x8c\xae\x38\x94\x45\x71\xde\xde\x20\x37\xdc\x41\xf0\x81\x8a\x3d\x91\xe3\x02\x0a\x72\x74\xc6\x67\x42\x47\x87\x60\x83\xd0\xe3\x97\x46\xc9\x68\x40\x61\xbf\x74\xad\x58\x84\x36\xce\x1b\x76\x3d\xbf\x4b\xfc\xf8\xde\x6e\x35\xc5\xa7\x62\x66\x75\xc1\x27\x29\x2b\x21\xdf\x3c\x16\xf8\x10\x63\x32\x2a\x75\xf3\x43\x88\x86\xf1\xf0\xce\xbf\xc1\xa9\x6f\x41\x38\x4c\xbd\xd8\x61\xb0\x4f\x51\x9f\xf6\xa9\x34\x4d\x94\xf3\xd3\xa0\xab\xa8\x40\x9d\xfc\xf1\x8d\x01\xf2\xb5\xb4\x55\x17\x16\x39\xee\xa7\x7d\xee\x70\x6e\xa8\x3d\xcd\x2b\x8b\x1f\xc5\xec\x0d\x74\x07\x61\xa5\xf0\x5f\x7e\xc8\xd8\x7a\xd1\xf2\x92\xa5\x0c\x8b\xae\x0a\xd3\x2b\x03\x41\x9a\x95\x0d\x9f\xe3\xb3\xec\xc4\xd8\xd3\xaa\x95\xe0\x2b\x51\xb1\x83\x1d\x83\xea\xde\xaa\x44\x23\x86\x35\xf9\xc6\x5e\xfe\x2f\x67\x44\xa7\x0b\x9a\xe4\x1e\xf1\x5d\x97\x90\x8c\x05\x33\x93\x44\x12\xf7\x95\x83\xd0\xe9\xb3\xd7\x06\xa1\x28\xe8\x8f\xb5\x1e\xed\xb6\x5e\x46\xd8\xa2\xb3\x8b\xbd\xd6\x45\x55\x54\x96\x7a\x8d\xc0\xc6\x8b\xdd\xfe\xae\x0f\x8f\x72\xf0\xb8\x86\xc3\xc7\x41\xfa\xc4\xf9\x1e\x5c\x49\x1d\xba\xe9\xda\x45\x94\x83\x6c\xf1\xd9\xfb\x6e\xe1\x30\x02\x50\x89\xae\xd3\x50\xef\x24\x7b\xc9\x88\x7a\x20\x50\x15\x9d\xde\xd1\x42\x8f\xfd\x9b\x07\xb9\xec\x2e\x3d\x4b\xbd\xc2\xdd\xb5\x4e\x87\x3b\x63\xf2\x47\x52\x33\xe1\x91\x33\xa1\x4b\x66\x58\x50\x94\x57\x00\x81\x86\xd6\x22\x59\x95\xa9\x67\x26\xb5\x29\xf4\x42\x81\xaa\x24\xfe\xfd\x1c\xff\x8f\x81\x5d\x93\xa5\x98\x69\x31\x66\x22\x90\xb3\xee\x16\x83\x3c\x60\xf0\xaf\xce\xf2\xcb\xc0\x00\x62\x3f\x39\x31\x90\x9c\xa9\x76\xa0\x94\xe2\xb0\xfd\xb7\xdc\xf7\xc4\x85\xe1\x49\x88\xa3\x6f\x19\xb6\x64\x25\x38\x5f\x56\x32\xce\xf6\x5d\x1d\x34\x14\x62\x3a\xe3\xee\x81\x6e\x76\x3a\x5f\x60\x64\x66\x62\x2b\xe6\x60\x21\x14\x50\x29\x51\xcf\x0c\x09\x7c\x16\x48\xa7\x2e\x2c\x43\xd9\xaf\xa9\x68\x9f\x2c\x3c\xfe\x02\x6c\xdc\xe3\xbd\x1b\xf9\xeb\xf7\x77\x56\x2e\xcd\x8f\xf1\xb0\xd7\x75\x30\x6d\x90\x04\x43\xf3\x0a\x84\x33\x10\xb8\xde\x6a\x38\xff\x10\x8b\x72\x39\x13\xd7\x89\x9b\x9f\xbe\x7c\x3d\x76\x6e\xf8\xbd\xfb\x6d\x8b\x0b\x52\x95\x6c\xb1\xce\xc9\x93\x6d\x70\xb4\x87\xc0\x14\x40\xa8\x42\xb2\xfa\xbe\x38\xe7\xb8\x85\x1a\x38\x7d\x35\x8b\xe7\xef\x12\xa7\xe4\xf2\xb5\x27\xe8\x30\x90\xd6\x7e\xb0\x13\xc9\xc2\xcf\xd3\xde\x5a\x1a\x3f\x99\x74\x8a\x41\xf4\x81\x9d\x90\x36\xe5\x00\xc5\x04\xc9\x88\xbf\xd2\x4f\x61\x7d\x6e\xbd\xca\xb2\xdd\xea\xa6\x15\x79\x41\x4f\x36\x0b\x46\x9a\x33\xa6\xde\xd9\x6b\xa1\xd8\xc1\x40\xc4\xff\xc9\x49\x90\xd8\xad\xf7\x8c\xd3\x87\x80\xbd\x68\x66\x3d\x1a\x0e\xe3\x3f\x53\x7c\xdf\x89\x2d\x56\x2e\x82\xdc\xd1\xd9\x12\xca\xd3\x8d\x65\x56\x7d\x29\x14\x06"}, +{{0xb6,0x2c,0x24,0x18,0x78,0x27,0x35,0x13,0xe0,0xbf,0x6f,0x33,0xd2,0x10,0x43,0x65,0xb2,0xce,0x9c,0x5a,0x1b,0x78,0x60,0x58,0xe9,0xc5,0xb4,0xd1,0xd1,0x92,0xf8,0x7f,},{0xbb,0xf6,0xfc,0x51,0x98,0xf3,0xfb,0xa5,0xab,0x00,0x7f,0x8a,0x63,0x2d,0x28,0xd1,0xaf,0x86,0x5d,0x29,0x0f,0xa0,0xa9,0x0f,0xaa,0x9a,0x9b,0x5b,0x9c,0x13,0xf3,0xfb,},{0xc5,0x90,0x39,0x58,0x7b,0x38,0xdc,0x14,0x1e,0x05,0x5a,0x93,0x85,0x01,0x04,0xd6,0x29,0xe3,0x80,0x70,0x5b,0x8f,0xc9,0x18,0x84,0x7c,0x5e,0x2a,0x35,0x2d,0xa3,0xa0,0x2f,0xce,0x7f,0x71,0x99,0xf4,0xae,0x2b,0x1e,0x2a,0x59,0x48,0x34,0x18,0x93,0x2e,0x18,0x5f,0x7e,0x45,0xb5,0x05,0x0c,0x64,0x2c,0xec,0xc7,0xe7,0x81,0x99,0x85,0x07,},"\x26\xa3\xc2\x6a\x5a\x18\x9c\xad\x40\x7c\xba\xa3\xa6\x86\x7a\xc0\xa2\x60\x88\xc7\x5f\x9d\x0f\xa1\x9b\xd5\x02\x74\xce\xc5\x75\x5a\x49\x71\x09\xa4\x73\x28\x4d\x6f\xc8\x1a\xd4\xb9\xec\x29\xfa\x7e\xc9\x76\x4f\xd3\x09\x9f\x06\x0e\x36\x83\x65\x52\xff\x24\x13\xe3\xd5\x09\x5f\xe0\xb1\xa8\xbf\xcf\x67\xee\x06\xaa\x90\x32\xe7\xbb\x32\x49\x69\x80\x47\x71\x4d\x28\x14\x15\x27\x3c\x98\x34\xad\x9e\xb6\x65\xa7\xd9\x72\x20\xe7\x2d\x9c\xa7\x3f\x31\xaf\xa7\x73\x86\x75\xba\x31\x62\xef\xef\xe7\x47\x9a\x5b\xc4\xbc\xe2\xe8\xb7\xaf\x47\x41\xd7\x03\xdc\x9b\xbd\x60\xb4\xcf\x4b\x90\x87\xf6\xcf\x86\xcf\x53\xae\xd0\x2b\xf4\xca\x6a\x18\xf6\x07\xcb\x52\xa3\x03\xd7\x8e\x85\xad\x88\xfd\xfc\x86\xdc\xb7\x18\x77\x27\xb0\x3b\xe2\x27\x74\x5b\xea\x74\x4f\xd0\x06\x52\x5b\xc5\x9a\x4d\xdd\xab\x91\x5c\xef\x40\xa8\xf3\x08\x02\x91\x3b\x79\x13\xea\xf9\x74\x33\x65\x52\xe2\xf1\x45\x6a\xd8\x03\xdc\x58\xc9\xb4\xb1\x8e\xfa\xf7\xf7\xe3\x57\xe2\xcd\x77\xd1\x38\xd9\x00\x80\xe2\x96\xd1\x36\x4a\x2f\x32\x4d\x3e\x0d\x6e\xdc\x20\xb8\xbd\xaa\x9d\x2e\x87\x1f\x5e\x7b\x05\x1f\xb6\xfc\xdb\x55\x95\xf2\x1d\x3f\x8d\xe2\x9f\xb7\x86\x78\xfa\x47\x9e\xaa\x32\x57\x9c\x78\x4d\x51\x3a\xc5\xf8\x36\xd9\x54\xd0\xd3\xfc\x0e\x5f\xc8\xa6\xee\xab\x90\x20\x2b\x4c\x4a\x2b\xec\x24\xcf\x63\xea\x67\xc4\x70\x09\x62\x18\xcd\x43\x1e\x88\x31\x05\xfc\x9c\x27\xf9\xea\x77\xc1\x8e\xda\x69\xbc\x00\xa2\x24\x2b\xd4\x20\xf0\x95\xc9\xb9\xa9\x2d\x95\x6c\xcc\x5a\x85\x72\xb0\x57\xa7\xfe\x17\x3e\xeb\x2a\x31\x66\xcb\x20\x89\xd1\x13\xa8\x16\x46\x2b\x25\x80\x5b\x8a\xba\xff\x5b\x0b\x22\x87\xc5\x08\xec\x2b\x8c\x34\xb2\x19\x5c\x33\x28\x70\xd3\xcc\x39\x60\x17\xa1\x6b\x9e\x0d\xa6\x18\x2d\x07\x1d\x3b\xf3\x63\xd3\xf1\xe7\xb7\xda\x11\xd7\x11\x25\x0a\x58\xaf\xd7\x4e\xd3\xe3\x15\x8d\x47\x18\xba\xd4\xd2\x74\xbb\x34\x44\xcf\xc3\x18\x07\x4b\x53\xbe\xba\x44\xa2\xa3\x4f\xf8\xeb\x72\x6e\x4a\x1d\xaa\x91\x10\x51\x62\x16\x51\x89\x8b\x88\x71\x69\xf6\x2b\x9c\x0f\x40\x20\x48\x3e\xf5\x44\xf8\xf5\x72\xfa\x6a\x66\x40\xa4\xcf\xfc\xe9\x76\xcb\x70\x24\xf8\x47\xbd\xc9\x5d\x1d\x7c\xe6\x53\x50\x5d\xeb\xfc\x69\x88\xed\x28\x9d\xd4\x7a\x9e\xb2\x61\x25\x9e\x3e\x65\xe4\x5f\xc9\xd7\x14\x94\x69\x35\xcd\x8e\xa1\x3b\xc6\xdb\x5e\xaa\xb9\xe8\xb1\x0d\xae\x0f\xdd\x69\x79\xc2\x03\x5c\xfb\x80\x98\x25\x2f\x22\x05\x44\x3b\x80\x88\x16\xbf\x77\x87\xb7\xf1\xe7\x8b\xc9\x8a\x72\x85\xe7\x33\xd4\x5f\xc4\x61\x0c\x20\x97\x7c\xa3\x22\x98\x89\xbb\x8c\xd2\xb6\x94\xce\x9e\x3f\xe7\x83\x03\xaf\x83\xe1\x06\x42\x25\x42\xfb\x79\x61\xd3\x2e\xb1\xd2\xc5\xfb\xe6\x07\x51\x67\x4b\x07\x47\x73\xee\x06\x16\xe0\x29\x73\xf6\xa7\x4a\x3a\xe4\x66\x4a\x26\x50\x91\x5a\x3e\x10\x49\x3b\x9e\x66\xa3\x9f\xa5\xc8\x9c\x61\xd4\x47\x35\xf1\x07\xd3\x37\x57\xae\x67\x9b\x43\xa8\xd4\x3a\x01\x75\x7a\xe1\xf3\x27\x9e\x86\x24\x42\xe1\x50\x71\x55\x50\xee\x82\xe4\x9c\x0d\x49\x43\xfa\xf1\x3f\x22\x79\x1f\x0e\x66\xf2\x4a\xc5\x0a\xb3\xc0\x03\x85\x2b\x21\xe1\x5b\x2f\x00\x6e\xdc\x2c\xd6\xa8\x79\xc4\x76\xab\x5b\x35\x2e\xb1\x09\x9d\xad\x4c\x50\x37\x24\x00\xfa\xa5\x49\x8d\x78\xc6\xb8\x57\x03\x4c\x25\xca\xf7\xb9\x33\xfa\xf6\xbd\x7c\x59\xfa\x3d\xa5\x73\x97\xb6\x03\xde\x9c\xb9\xd8\x0e\x51\xf7\x99\x7b\xaa\x46\x2a\xcd\x53\x7e\x2c\x41\x94\xc7\x6c\x7e\x0b\xe6\x51\x2b\xce\x4d\x63\x66\x0b\x36\xc7\xcc\x46\x63\x1f\xb9\x67\x1a\xd8\xc5\xd2\x8e\x2f\x2e\xe2\xed\xce\x81\x95\x44\x21\xb8\xa3\xd9\xff\x6f\x66\x69\x9f\x4b\xce\x88\xbc\xb8\xef\x19\x2c\x26\x2a\x74\xab\x7e\x19\x1e\xee\x91\x01\xa2\x8d\x4b\x66\x28\x2b\x51\x22\x09\x3d\x14\x1c\x64\x96\xc7\xab\xa4\xd3\x52\xe4\x72\xee\x74\x40\xe0\x5a\xf6\x0d\xa0\xcf\xc9\x3e\x30\x36\x42\xba\x8f\xb8\xe5\xc5\x68\x68\x7a\xbd\x63\xaf\xb3\xed\x6a\x32\xb6\xda\xe5\x6a\x7e\x5d\x73\xde\xba\xf4\x1d\x35\xca\x36\xad\xb9\x7a\x22\xc0\xad\xbe\x71\x8b\xec\x1f\xa5\x19\x98\xde\x9b\x4b\x96\xa7\x9c\x5b\x96\x55\xb0\x16\x5d\x5e\x1b\x9a\x8c\xc5\x52\xe8\xc9\x32\x9e\xde\x58\xdf\x74\xc6\x7b\x2b\xa1\xa8\x42\xfd\x3e\x81\x58\xc1\xfe\xa3\xa9\x9b\x56\xa2\xc2\xa9\x62\x07\x85\x3d\x26\x02\x2c\xec\x17\x0d\x7e\x79\x94\x4d\x2f\x56\xaa\xb1\xf1\x91\xbf\xd4\x8d\x72\x54\x90\xca\x82\xb8\xd9\x06\xf0\x68\x0e\x69\xee\xb9\x57\x57\x74\xfb\x9d\x60\x45\x13\xfb\xc2\x6f\x5d\x30\x3b\x68\x85\xca\xc0\xbf\x8e\xfe\xe0\x53\x8f\x92"}, +{{0x0f,0x77,0xf7,0x7a,0x1c,0x7e,0x04,0xbd,0xa8,0xe5,0x34,0xf4,0xe3,0xef,0xf9,0xa2,0x38,0xcc,0x14,0x87,0x6b,0x7e,0x3e,0xca,0x8b,0xed,0xe1,0x92,0x3a,0x33,0x64,0x06,},{0x10,0x45,0xea,0x9f,0xe2,0x14,0x58,0x3a,0x0c,0xdb,0xc4,0x94,0x93,0x2b,0xc4,0x4a,0xfe,0xeb,0x08,0x0b,0xec,0x48,0x5c,0xc2,0x34,0xfd,0xdc,0xff,0x13,0x9c,0xce,0x00,},{0xb2,0x0b,0x9c,0x42,0x46,0xf0,0xd2,0x97,0x01,0x38,0xaf,0x7d,0xc9,0xaf,0x62,0x9b,0x68,0xfb,0xc3,0x7d,0xf8,0x7a,0xfd,0xca,0xdc,0xb5,0x45,0xc1,0x76,0x83,0x76,0xa0,0x9c,0x3b,0xab,0xc3,0xeb,0x1a,0xf3,0xb7,0x51,0x98,0x52,0xf7,0x5f,0xab,0x1c,0x9c,0x11,0x9c,0x66,0x2c,0x58,0x77,0xfb,0x2f,0x72,0x99,0xca,0xb5,0x7f,0xad,0x3d,0x0e,},"\x0e\xcb\x74\x6d\xbd\xb0\x16\x14\x21\xaf\xeb\x7a\xde\xa7\xa3\x7c\x2e\xa4\x40\x8a\x59\x2c\x9d\x78\x1e\xd6\xac\x6f\x4e\xe5\xcc\x65\xd5\x27\x0e\x4c\xf2\x76\x32\xf7\xc5\xc1\x33\xd4\x39\xb7\x8d\x1f\x71\xaa\x6d\xd8\x07\x13\xd9\x0b\x15\x1e\x19\x12\x1b\xfa\x87\x71\x0e\x84\xa4\x85\x0a\x3b\x5b\x02\x65\xba\x26\x03\xd0\x71\x6e\x9b\x7e\x11\x22\x10\x9c\x39\xc6\xf1\x02\x7f\xce\x18\x79\x8c\xbb\x4f\x6b\xc5\xe4\xd7\xac\xa4\x70\x46\x90\xf5\xc9\x81\x51\x08\x71\xc3\x13\x59\x57\x98\x33\x86\x81\x10\x7f\x2b\x57\x94\xd4\x6f\x6e\x0b\xde\x2c\xd0\x64\xb3\xb1\xfc\x00\xca\x47\x18\x8b\xbb\xc1\xf4\xa0\xce\x30\x5c\xc6\xd8\xa8\x96\x92\x0e\xb9\xeb\xae\x57\x9f\xd3\x38\x5f\x8f\x1f\x35\x97\x62\x88\xf4\xc5\x8f\xfc\x47\x60\xf3\x59\xb0\x03\xc8\x72\xe9\xa2\x40\x55\x35\x5e\xa9\x58\x5e\x95\x10\x69\xdc\xa2\x5f\xd0\xcc\x0b\x9d\xb5\x2a\xae\xaf\x19\xd4\x3f\x2e\xab\x4f\x83\x56\x03\xad\x12\xd2\xdc\x49\xb3\x10\x25\x6b\x94\xbe\xd5\x48\x96\xa1\x6b\x69\xb0\x9c\xb4\xc8\xff\x5c\x23\xcc\xe5\x59\x3d\x87\xad\xe2\xa8\x2a\xda\x50\x85\x9e\x15\x44\xc1\x86\x18\xa6\x5c\x00\x7e\xf4\x24\xc9\x85\x4a\x17\x5b\x6e\x6c\x0e\x64\xb2\xc8\xeb\x8a\xd4\xd2\x8b\x97\x7d\x68\xe7\x81\x69\x91\x51\x98\x97\x53\x94\xd3\xb9\xb2\x69\xca\xb0\xd3\x26\x1b\x2b\x56\xcd\x2c\xc4\xbd\xdb\xd4\xf1\x43\x9e\x0d\xbe\x2c\x9b\x3f\x3f\x75\x14\xed\xac\x5e\xbb\x46\x22\xb9\x2a\x69\xa8\x40\xa9\x02\x85\x50\xb2\x21\xdb\x59\xdd\xfb\x00\x13\x96\xf8\x63\x92\xa1\x7f\x08\xcc\xb1\x94\xcd\x9e\x1a\x00\x81\xd7\xdd\x9c\xca\x23\x57\xfe\xb8\xb7\x95\xe5\x17\x02\x9f\x79\xc8\x2a\x3b\xe6\xf9\xa0\x31\xdd\x1a\xf1\xe7\x9e\x49\x82\xbf\x8e\x76\xb3\x10\xf9\xd3\x55\xef\xcd\x5b\x1e\xfa\x9f\x35\x9c\x17\xcf\x3b\x51\x0d\x51\x3e\x8c\xd5\x78\x6a\x0d\x34\x45\xdc\x59\xa8\x43\x3a\x46\x48\x86\x87\xb0\xf5\x8b\x1b\xd6\x56\x7c\x2a\xf4\x87\x3b\x51\xfc\x84\x5e\x76\x7e\x24\x30\x05\x19\x2f\x8f\x06\x74\xf2\x81\x26\x5a\x55\xd7\x6c\xea\x32\x22\x60\xc9\x32\xce\xa6\x71\x7a\xdb\x98\xa2\xdd\xa8\xc6\x98\xe2\xe8\x92\x55\xfe\xb7\x7d\xa7\x64\x81\x67\xbc\x1e\x58\x87\x7f\xeb\x72\xd1\xd1\x4b\x0c\x30\x4f\x07\x37\x2d\x95\x56\x75\x23\x7c\x49\xf7\xa6\xdb\xc9\x15\xe6\x81\x4a\xba\xe6\xcc\xe4\xca\xf9\xf4\x80\x87\xe9\xdf\xb2\x82\xd8\xf3\x40\x37\x7c\x1e\x29\xc6\x73\x1c\xcc\x26\x67\xda\x66\x95\xb7\x12\xbe\x03\x12\xd8\x65\x11\x19\x34\xf1\x68\xd5\x54\x43\x65\xdd\xae\x27\xab\xc6\x4a\xef\xbc\xb3\x22\xdb\x7d\x97\xd9\x0d\x95\x7a\x63\x7b\xd8\x26\xc2\x27\xe9\xeb\x18\x0b\x45\xa4\x31\x62\x6a\x6f\xd8\x90\xc0\xe5\xf4\xed\x7e\x85\x64\x74\x75\x2f\x80\xb5\xae\xf6\xe7\x3e\xfd\xaa\x6c\x2c\x45\x1b\xd7\x4c\x1e\xf4\x66\xca\x3a\xaa\x25\x73\xbb\x52\xcb\x2b\x1c\xa9\x6a\x1b\x57\x44\x03\xce\xae\x1c\xf0\x5f\xfc\x53\x43\x0e\x1e\x4c\xd5\x59\x3b\xd1\xef\x84\xbc\xbf\xe2\x19\xf0\x81\x60\xd1\x66\xf2\x73\x1d\x99\xb8\xd7\xa3\x2b\x12\x99\x1f\x77\x77\x5a\x26\x7e\xc0\x82\x97\xec\x51\x2d\x7b\x72\x43\x56\x32\x52\x5c\x04\x00\x0f\xb0\x0a\x79\x3f\x8b\x5f\x8f\x37\x47\xb5\x53\x59\xdf\x21\xb7\xe2\xc4\x9f\x2b\x0b\x9a\xe0\x82\xaf\xc7\x0a\x14\x68\x71\x37\x0b\x8d\x50\x08\x6d\xe0\x0f\x94\x48\xbe\x89\x02\x17\x4b\xa2\xcc\x85\x1f\xa3\x79\xdd\x70\x31\xca\x45\x7a\x88\x69\xaf\x4b\x6c\x27\x29\xda\xc5\x19\x55\x6b\x8b\xb4\xab\x51\x9e\xf1\xbb\x02\x4e\xa8\xb7\xf0\x17\x71\xc9\xaa\xb7\x48\xe5\x73\x81\xa0\x19\x2a\x6e\x39\x8c\xbe\x6d\xd9\xf3\x67\xcc\x7b\x33\x54\xf8\x3b\x79\xbc\xda\x46\xb7\x93\xa4\xad\xa8\x55\x49\xc8\xd6\xbd\xd6\x16\x81\x24\x36\x2f\xf9\x08\xaa\x1a\x0c\xb7\x8a\xa3\x30\xc4\x2d\x5a\x5d\x48\x12\x35\xac\xac\x3a\x91\x9b\x96\x9c\x50\x98\x72\x66\xd4\x04\xd1\x5d\x0e\x70\x6f\xd9\x00\x76\x34\xf6\x9e\x13\xc5\x6e\xc4\x71\x33\x88\x4f\xca\xdd\xc1\x6b\xee\xee\xd1\x9e\x0c\xd9\x17\xaa\x49\x63\x67\x86\x7d\xfc\xea\x27\x4e\x1a\x47\xda\x77\x4f\x3c\x93\x63\x02\x1e\x7c\x8d\x6b\xf8\xf0\x00\x53\xfa\xcc\x11\xcb\x68\xa9\xd6\xe1\xfc\x2d\x6d\x19\x17\x5d\x63\x24\xff\x7c\xa6\xc2\x30\x58\xb8\xb6\x93\xd8\xfd\x4e\x0b\x51\xdc\xbb\x11\x35\x43\xf2\xfc\xc0\x45\x2e\xb9\xd9\x67\xac\x0f\xa9\xb2\x3e\x9e\x0b\x1d\xa8\xd8\x3a\x3c\x1f\xc9\xe9\xec\x97\x1f\x0f\x67\xfc\x74\x5b\xb1\x73\x76\xbc\x46\x24\x5f\x52\x8c\xb6\xe5\xfe\xe1\x1b\xcd\xda\x86\x7b\x7f\x79\x01\x9c\xf9\xdb\x59\x18\x58\x23\x0a\xec\xb4\xd1\xe9\x3d\x16\x7c\xd8\x6b\x42\xdd\x87\x9a\x13\xfa\x0e"}, +{{0xc5,0xa5,0x05,0x34,0x77,0xae,0x31,0x15,0x8e,0x74,0x69,0xdd,0x15,0x04,0x86,0x76,0x50,0xd4,0x6f,0x15,0x89,0x06,0x7f,0x5c,0xd8,0x81,0xca,0xf2,0x5c,0x26,0xcb,0x21,},{0x70,0xf8,0x5d,0xb9,0x80,0x7b,0x26,0xfc,0xf3,0xe6,0x69,0x0b,0x91,0x72,0x4f,0x7a,0xe3,0xd2,0x0e,0xc3,0x60,0x4a,0xb7,0xd6,0x30,0x8d,0x90,0x94,0x30,0x8b,0x2d,0x59,},{0xf5,0x19,0x1b,0x44,0xbd,0x6c,0xc3,0xea,0x28,0x17,0x71,0xdf,0x12,0x54,0x9b,0xa2,0xbe,0x22,0x8b,0x51,0xeb,0x79,0x1b,0x9e,0x5e,0xd2,0x81,0x5f,0x86,0x2a,0xa6,0x30,0xb5,0x69,0x67,0xcd,0xef,0x8b,0x6a,0xf0,0xb9,0xd2,0x1a,0xb8,0xc9,0x7a,0x6d,0xff,0x68,0x1c,0xce,0xd9,0xf5,0x01,0x97,0x13,0xd4,0x35,0x7c,0xb3,0xe5,0x4c,0x0d,0x08,},"\x85\x71\xff\x39\x03\x48\x6a\x43\xa6\x12\x6c\x32\x3e\x7b\x3a\x74\x14\x1d\x13\x85\xd4\xbd\x70\x3f\x19\xe2\xd1\xb6\x4b\x50\x28\x1d\x27\x16\x8a\xe3\xe7\x69\xc6\xdd\x9d\xf7\xd9\x78\x64\xfb\x37\x82\x2f\x00\x21\x85\x2e\x31\x68\xab\x7d\x84\x5a\x65\x45\xed\x0c\x37\x7d\x9f\x7c\x04\x8a\x2b\x96\xe8\xdc\xf4\x45\x77\x96\x84\xa0\x58\xc2\xb9\xc2\x1a\xc6\x8a\x0c\x34\x1d\x1d\x6c\x09\x81\x45\x64\x57\x45\x8e\xb7\xce\xbf\x66\x67\x87\x40\x77\x7e\xca\x26\xe0\x1e\x1c\x8f\x53\xb5\xd4\x75\x6c\xc5\xf0\xb9\x0f\x0c\x5d\xb0\x53\x93\xcd\x4b\x8e\x44\xf6\x81\x0c\xaa\x5a\x11\x6a\x33\x57\x77\x24\x39\x5d\x41\x3a\xf6\x19\x63\x2a\x6f\xed\x14\xe2\x15\xc2\xf1\x9d\x10\x5c\xe2\xbf\x14\x98\xe6\xd2\xab\x4f\x65\x0f\x61\xba\x5c\xf6\xd0\xc7\x3b\xbb\xde\x98\xe3\x04\x29\x91\x0a\x4e\x67\xdf\xbc\x71\x7c\xb0\x91\x18\x2d\x59\x70\x58\xb5\xd7\x65\xd0\x97\xe6\x87\x58\x31\xb5\x88\xaa\xeb\x3e\x73\x27\xe8\x56\xb4\x2f\xa9\x83\xfd\x25\x4e\xf1\xf9\x18\xb0\x43\xd1\xdd\x3d\x7b\x7e\x30\xb3\x15\x38\x6e\xec\x91\xe7\xf9\x4d\x59\x8f\x4b\xeb\x3b\x27\xb4\x2f\x4e\xe1\xfb\xf7\xaf\xb4\x86\xbd\xcc\x60\x81\xcc\xb8\x67\xf0\x41\x11\x04\x4f\x4b\xbb\xe3\xc8\x12\x2e\xde\xad\xef\xa9\xd6\x93\x90\x6e\x0d\x6e\x13\x3b\xf6\xf2\xda\x61\x58\xfe\xed\xbd\xa0\x24\x41\x0f\x12\x08\x6e\x7a\xcc\xf1\xc6\x8e\x15\x57\xf0\x0c\x14\xe9\xc7\xea\x76\xa5\xed\x13\x37\xa0\x54\xac\x2c\x94\x9c\x05\x97\x7e\x03\x02\x74\xf6\xa4\xf2\xa6\xb3\x0a\x15\xc5\x70\xec\x94\x33\xf7\x4f\x47\x52\x80\x87\xc9\xce\x9a\x62\x92\x95\x1c\x54\x35\x49\x96\xfb\x28\x3c\x0d\xc4\xcf\x33\xc0\x01\xbc\x96\x87\x5e\xa6\xe1\xf4\x6f\x83\x7f\xf1\x8d\xd9\x54\x5f\xb9\x93\x46\x55\x34\x2b\x12\xc2\x99\x0b\x9f\x1c\x6f\xf4\xd6\x64\x89\xd6\xae\xdc\xe7\x5c\x7c\xb0\x3a\xc1\x34\xbf\xd3\x9b\x18\x1d\xfb\x7f\x9a\x97\xce\x73\x7f\xe5\x70\xad\x5f\x81\x34\x59\x39\xa6\xde\x5a\x40\xa3\x3a\x0e\x44\xbf\x95\x75\x03\xd5\xca\x02\x83\x51\x2e\x57\xfb\xa8\xa3\xa6\xf2\xc3\x90\x68\x7b\x1b\x77\x08\x67\x6e\x0f\xd0\x3b\x7c\x18\x8d\x45\x61\xc1\x87\x91\x63\xea\xf2\xb5\x96\xdd\xd5\xf3\xc1\xf4\xda\xdb\xc1\x39\xc2\x16\x48\x92\x82\x0b\x2f\xe0\x9c\xbc\x3d\x19\x08\x80\x76\x36\x45\x10\x25\x4f\x2b\x6d\x41\x03\x29\xe7\x0f\x2e\x5a\x94\x5b\xba\xcd\x2c\xa8\x9b\xd4\xb6\xe1\xf5\xe2\xe1\xd4\xf4\xed\x2f\xe0\x11\x3b\xcf\x32\x96\x2f\x00\xd5\xc3\x3b\x1d\xf9\x88\x40\x2b\xa0\xdc\x88\x04\xc1\xaf\x66\xcc\xae\x26\x70\xef\xa3\x13\x4c\x67\xfc\x90\xfe\xed\x8d\x8d\xee\xdc\xcf\x6a\x46\xf2\x29\x40\x45\x4a\xf2\xbb\x67\x54\xcf\x23\x5d\xdb\xb0\x00\x1c\x6c\x74\x1b\xf8\x74\xbc\xd8\xd4\x1d\x9d\xba\x81\x62\x58\x1c\x37\x46\xd7\xf3\x0e\x73\xde\xf6\x94\x15\xaf\x51\x81\xc1\x49\x91\x42\x95\x12\x2d\x45\x98\x2f\x94\x94\x3e\x20\xb0\xff\xc7\xfe\x6d\xdf\x19\xa0\x22\xe8\x7a\x52\x13\x33\x57\xa1\xe8\x0f\x37\xf2\x8a\x4c\x4a\x8a\x61\xc1\x48\xdd\x87\x5c\x1e\x8e\xcd\xcd\x84\x0d\xd8\x63\xe4\x4d\x9b\xcb\x16\xb6\xe5\xaf\x01\x47\xb3\x4a\x7a\x90\x52\xc8\xd3\xf4\x52\x01\x3d\x2d\x35\x4f\x68\x03\xf9\xea\xf6\x05\x6f\x3b\x01\x3c\x61\x6e\x47\xf3\x98\x81\x91\x46\x32\x0a\x5e\x3d\xbd\xf1\x68\x43\xea\x29\xde\xf2\x62\xcc\x9a\x34\x36\x72\xcf\x96\xbc\xcc\x6e\x87\xe6\xa6\xba\xf0\x71\x2e\x6e\xe8\x9a\xa6\x04\x89\xf1\x7c\xb7\x2d\xdc\x44\xba\xd1\x61\x58\x7d\x87\xf5\x4d\x67\xcc\x0a\x27\x78\x49\x7d\x83\x10\x88\x31\x5f\xfe\xee\x3d\x26\x8c\x59\xbe\xfe\x88\x4c\x3a\xa0\xe0\xae\x22\x96\xbb\xb6\x0e\xac\x90\x97\xcd\xf8\xdc\x09\x87\xce\xb1\x74\x2b\x05\x86\xdf\xce\x79\xec\x10\x42\x5b\x28\xf4\xe6\x45\x20\xd7\x12\xe3\xf4\x6e\xa8\x3b\xe2\xde\x6a\x15\x74\x07\x3b\xc5\xc7\x55\x7b\x8e\x25\xb6\x41\x11\x84\xea\x28\x3d\x88\x00\x23\x2c\x79\x06\x94\x21\x81\x1f\x88\x3c\x29\x94\xe7\xb7\xe2\xad\x9f\x8d\xc4\x89\xc9\x34\x77\x24\x39\x46\x09\xc9\x89\x09\xa6\xc2\x60\x17\xb5\x0f\x20\xd5\x0c\xca\xcb\xde\x36\xb7\x6b\xa6\x46\xa7\x6d\xc6\xa5\xb0\xf5\x06\x49\xc5\x65\x8b\xbd\xfd\xd3\xb5\xca\xfc\x54\x79\xa2\xf4\x8e\xe5\x15\x42\xf2\x3e\x9f\xc9\x21\x32\x06\x0f\xd6\x35\xef\xf4\x52\x11\x1c\xda\xf3\xef\xbd\xb7\xdb\x9e\x7d\x47\x16\xd0\xd6\x01\x1c\x29\x11\x8a\x55\xd4\xc1\xa4\x36\xab\xe2\x4e\x3c\xbf\x40\x23\x5b\x76\xdd\x19\x23\x50\x3c\x5f\x35\x98\x12\x4e\x2d\xf5\x5a\x2d\x1f\x24\x6e\x90\xde\x4b\x71\x64\x5d\x51\x75\xb6\x1b\x01\x74\xe7\xe5\x7d\xf1\x28\x5c\xcf\x8c\x86\xb8\x38\x2c\x25\x80\x79"}, +{{0x05,0xc7,0x19,0xca,0xe0,0x6e,0x2b,0xb7,0xd8,0x78,0x63,0xab,0x31,0x50,0x27,0x2c,0xb2,0xf8,0xc3,0xaa,0x24,0x21,0x91,0x2d,0x87,0xf9,0x8e,0x75,0x89,0x63,0x8c,0xe9,},{0x90,0x21,0x17,0x96,0xfe,0xd3,0xd5,0x3b,0x81,0xf8,0xfe,0xeb,0x1b,0xad,0x1f,0xfc,0x93,0x3e,0x5f,0x10,0xd3,0xbc,0x1b,0x36,0xdd,0xf2,0x10,0xa4,0x79,0x23,0xdf,0x03,},{0xba,0x6e,0xb7,0x51,0x37,0x1d,0xf7,0x21,0xb7,0x70,0x7a,0x5b,0x33,0x39,0xed,0xb5,0x5f,0x13,0x86,0x40,0xb9,0x7b,0xe6,0x33,0x4d,0x6c,0xda,0x51,0x91,0xa3,0xff,0x63,0x67,0x91,0x17,0x61,0x88,0x2a,0x4a,0x00,0x7f,0x16,0x1b,0x74,0x8c,0xec,0x95,0xb1,0x9e,0x99,0x5f,0x28,0x58,0xc2,0x57,0xcd,0x61,0x69,0x25,0x66,0x62,0x30,0x11,0x02,},"\xec\x24\x19\x18\x41\x8e\x60\x52\x20\x42\xe6\x73\x39\xe6\x64\x94\x99\xf3\x1a\x6c\x7c\xf8\x92\x5f\x1f\x61\xdd\xe8\x94\x60\x36\x02\xae\x8b\xb5\xf5\x88\x09\x82\x1f\x83\x34\x4f\x23\xcd\x31\xe6\x4e\xc9\xff\xe7\x9a\x98\x6b\x7e\x29\xe4\x31\x9a\x63\x41\x43\x16\xbd\x6e\xe2\x0e\x02\xa5\x0d\xa4\x40\x12\xbd\x2d\x6f\x9f\x67\x9e\x88\xed\x0c\x8b\xb1\xe2\xca\xd5\x5e\x56\x57\x89\x88\x33\x45\xb7\x54\x6f\x3d\x54\xb1\xb3\x62\xb1\xc6\x50\x50\x2c\x01\x9d\x73\x13\xaf\xbc\x82\x68\x9b\x23\xa3\xa5\x2d\x8f\x1a\xf9\xf8\x1e\x18\x8d\xbd\xf2\x03\xfb\x53\x00\xb4\x22\x5b\xfb\x67\x73\x33\x7b\xe6\x75\x0b\x3d\xb8\x8c\xe0\x97\x34\x3f\x62\xee\x2c\x11\x85\x74\xef\x15\x0c\xbd\x4c\x62\x76\x0c\x3e\x43\xdc\xbc\x39\x21\x8b\xd6\xd9\x85\x65\xfa\x38\x98\x11\xb1\xa6\x74\xf6\x17\xfd\x75\x67\x33\xdc\xb5\x67\xa9\x2d\xbf\x38\x55\xb5\x7b\x1f\x4a\x46\xd5\xb8\x97\x4b\x39\xac\x0d\x0e\x24\xd9\x9d\x20\x37\xc0\x4f\x60\xd9\x14\x0f\x64\xb0\x7a\x77\xd7\xea\xa1\xce\x8a\x78\xe8\x44\xb1\xdc\xf0\xe3\x74\x24\xf3\xf9\xd2\x53\xa5\x48\x56\x1a\x03\x75\xa8\xd4\x34\x12\x97\xbf\xed\xb7\x04\x8c\x79\x35\xe1\x48\x14\x18\xf9\xbb\xa9\x27\x1f\x9f\xd6\x02\x62\x24\xe7\x8e\x05\x5d\x8a\x09\x39\xfa\x2f\xe1\xdb\xc0\xfc\x7b\x58\x3e\x4c\xff\x34\x90\xe1\xd0\xf6\x10\xb2\x52\xe3\x0d\x84\x97\xd0\x0e\x4a\xac\xb3\x75\xf1\x9a\x47\x19\xf7\x9c\xa1\xea\x58\x3a\x2f\x8b\x14\x06\xa4\xaa\x5c\xb5\x5c\x08\xb6\x59\x3b\x67\x6e\xb5\xc3\x4a\xbe\x89\x39\x2d\x62\xd2\x33\x08\xa3\x34\x8b\x57\xaf\xfb\xba\x77\x39\xcd\xe8\xe1\x90\x9d\x34\x25\xee\xb2\x09\x26\xa9\x77\xd3\xa9\x4a\x86\xe0\xba\x10\xb3\x86\x92\x66\x98\x82\x7e\x86\xb4\xfd\x6c\x61\x80\x04\x7c\x87\xec\x3b\x31\x61\x9d\x05\xa9\xdf\x34\xef\xd3\xd7\x6a\x83\x69\x62\xb2\xef\x60\x4d\x07\xaf\x09\x75\xeb\x8f\x3d\xd2\x25\x94\x32\x38\x02\x56\x4c\x92\x9b\x3f\x65\xda\xcb\x57\x2b\x32\x55\x3d\x69\xb3\x1a\x19\x76\x90\xa9\xbb\x86\x0b\x08\x0a\x77\xcf\xbb\x3c\x17\x5a\xaf\xce\x01\x46\xa8\x2a\x4d\x06\xe8\xc7\x50\x52\x1b\x72\x6e\xf1\xcb\x29\xd0\x21\xe5\x91\x5e\x5e\x84\x62\xed\xe5\x39\x54\x45\x24\x5c\x9a\xe8\x82\xee\xc4\xb1\x74\x5e\x11\x79\x1f\x76\x21\xd3\xfe\x70\x2c\xac\x15\x25\xe1\xf7\xb4\x6e\x11\x05\xcd\xd0\x6d\xa2\xaf\xde\x26\x47\x5d\xc1\xf7\x8d\xf8\xe2\xd7\x2b\x0e\xc3\xef\x7d\xd9\x56\x19\x3c\x99\x68\x42\xa4\x32\x69\x65\x38\xcf\x12\x3d\x76\x87\x21\x1f\xfc\xd0\x90\xb9\x38\x1e\xab\xec\x87\x9f\x76\x9a\xac\x0d\x35\x64\xe1\x6d\xf7\x94\xfa\x24\x72\x8d\x71\x72\xfd\x07\x73\x2e\xab\x07\x7e\xd8\x1c\x22\x08\x4f\x6f\x78\x1b\x62\x6d\xac\x67\x42\x8a\x9d\xdf\x3b\x0d\xb0\x46\x52\x51\x22\x0d\x18\xb8\xbf\x62\x04\x64\xc5\x1a\x57\x8d\xec\xcc\xbb\xab\xa5\x45\xed\x44\x2c\xf1\x2c\x4c\x66\xf6\xcb\x6e\x69\x01\xea\x54\xae\xda\x23\x6e\xc4\x5e\xef\x88\x6a\x7d\xdd\x2c\x04\x1c\xab\xa3\xa6\xce\xe3\x39\x71\x5b\x6c\xe9\x7e\x76\x5e\xc3\x47\x9f\x3d\x52\x82\x4a\x81\x94\xbe\xc2\xa8\x96\x47\xe8\xc6\x3f\xf7\x64\x5f\xf6\xd0\x53\x67\xc7\x67\xbc\x48\xcc\x96\xba\xf0\x5d\x6a\x41\x5b\x2a\x5a\xff\x9b\xfb\x21\x79\x48\xfa\xd3\x57\xb9\x8f\x47\xdf\xed\x62\xff\x12\x85\xeb\x9f\x46\x8f\x0f\x29\xed\xd7\x5a\xdc\x0c\x8c\x2f\xf6\xa5\x65\xed\xb8\xed\xfb\x48\xbe\xa0\x3b\x70\xc4\x47\x36\x9c\x52\xd8\x81\xee\xa0\xee\xdb\x08\xc3\x15\xcd\xf0\xbf\xeb\x97\x9c\x1c\x02\x50\x94\x6b\xb1\x00\xc2\x86\x6b\x41\x69\xb8\xcb\xd4\x4d\x65\x8f\x02\x36\xe1\xe9\xf3\xaa\x13\xbb\x8e\x80\x22\xa3\x8c\xe9\x97\xc9\x4b\x5b\xaf\x97\xe0\xba\x62\x1f\x7e\x09\x67\x1c\xe6\x38\xc2\xa3\x9e\xe6\xc6\xe2\x5a\x68\x80\x19\xdd\x16\x76\x75\xce\xae\xc2\x1c\x6b\x42\xa7\xc8\xc4\x76\xd1\x29\xdc\xc6\x93\xc3\x92\xa0\x2b\xe9\x1b\x87\x43\x7a\x08\xa0\xeb\xf1\xa7\xbd\x97\x6b\xa2\x37\x74\x76\x68\x38\xb8\xd6\x02\x4f\x5b\xb9\xb0\x7f\x3c\x6b\x71\x9b\x4d\xe1\x5b\x72\x44\x80\x48\xab\x70\xdb\x3d\x4b\xea\x77\xba\x35\x9b\x51\xb1\xec\x17\xdb\xe8\x01\x0a\xef\x02\x44\xa8\x07\x9c\xa8\xb9\xa2\xa7\x97\xf3\xb1\xfe\x04\x7c\x8d\xd5\xca\xb7\xfb\x48\x68\x29\x23\x9c\x4e\xf6\xd9\xa3\x83\x70\xd4\x88\xc4\x7b\x7c\x03\x0e\x49\xa5\x50\x0c\x9a\xbb\x39\xa9\xa5\xab\xfe\x72\xe9\x18\xb7\x63\x84\xec\xaa\xfe\x16\x27\x26\x6c\xd1\x4e\x69\x6c\x09\xd2\x51\x2e\x31\x25\x82\xa8\xa9\x11\xe7\xb7\xbf\xa0\x4c\x21\x81\x9a\xf6\x87\xf0\x4c\x5e\x0c\xbe\x9a\x2c\xe2\x4d\x4d\x3f\xd1\x21\x90\xb2\x53\xda\xbc\x12\xc6\x3c\xab\xfa\x94"}, +{{0x53,0x11,0xf3,0xc9,0x61,0x01,0xcb,0x8b,0x7a,0xbc,0x62,0x2b,0xb9,0x32,0x6b,0x8f,0x51,0x3c,0x2b,0x16,0xd2,0x94,0xdf,0x79,0x7f,0x56,0xdf,0xd8,0x20,0x3d,0xda,0x27,},{0x23,0x0b,0x70,0x02,0xf5,0x7c,0x79,0xae,0x2e,0x6b,0xfd,0xb8,0xdf,0x30,0xdb,0x3e,0x90,0x07,0x56,0xb5,0x4a,0xf3,0x96,0x8c,0x67,0x0e,0xe2,0xf3,0x2b,0xb1,0x1e,0x0a,},{0x3c,0xbb,0xb2,0x60,0x88,0x70,0xde,0xa1,0xef,0xee,0xbb,0x3f,0xbf,0x68,0x1e,0x27,0x70,0x5c,0x35,0xe4,0xdd,0xee,0xa8,0x6c,0x1b,0x34,0x2a,0x77,0xdc,0x29,0x6b,0x49,0x84,0x19,0x80,0x8e,0xac,0xbc,0x78,0x85,0x56,0x11,0xff,0xbc,0x92,0x65,0xa7,0x47,0x98,0xe5,0x18,0x27,0xe6,0xe5,0xd8,0x11,0x81,0x6d,0x3c,0xa2,0x1e,0x8b,0x9c,0x06,},"\x61\xb1\x5b\xe3\x7c\x4e\xb3\x97\xd9\xe7\x7e\x00\x15\x1a\x28\xed\x3e\x86\xd5\x0a\x95\x52\xbb\x48\x50\xb6\x21\x76\x3f\x01\x2e\x7e\x77\xbb\x5d\xb8\xf3\xdf\x7d\xcf\x76\x9f\x2d\x1d\x46\xd8\xd6\x0b\xae\x40\xc8\xca\x6e\x25\xc6\x41\x0b\x60\x07\x8a\x93\xfd\x05\x90\x21\x14\xbd\x91\x04\x5c\x06\x19\x2c\x70\xc4\x2c\x9f\x41\xf8\x16\x1c\xa4\x65\x64\xeb\xc2\x1a\x4b\xdd\x81\x90\xeb\xa2\xae\xb3\x09\x82\x30\x72\xec\x2c\x02\x00\xce\x64\x98\xf9\xd7\x2b\x37\xb3\xfb\x46\x67\x74\x32\x6d\xf3\x7a\xd8\x80\xd8\xed\xdb\x32\xaf\x67\x3e\x45\xd8\x8e\xec\x49\xb1\x57\x7b\x43\xb8\x63\x91\x11\xc2\xe0\xb9\x41\x87\xd2\xd4\xe0\x17\x3c\x00\x0f\x4c\x37\xbe\x84\x5d\x68\x81\x0b\x78\x89\xff\x2a\x04\x9f\x3f\x9f\x24\x5e\xc7\x0f\x21\xde\xf9\x77\x80\xb6\x11\x40\x0a\x83\xc3\x1a\x79\xd9\x3a\x8e\x98\xb6\x08\xfd\xcf\x24\x88\xb0\x68\xfe\x1a\xe4\x21\x72\x93\xa9\x36\x7b\xb7\x34\xb5\xbc\x7b\xd8\x81\x9b\x37\x7f\x09\x0b\x4f\x8f\xdb\xff\x50\x79\x9c\x76\x88\x0d\x19\x13\x35\x80\xe1\xdd\xfc\x2b\x9b\xaa\xdd\xba\xb3\x4f\xc6\xfd\xc0\x78\x01\x4b\xd1\xff\x73\x9d\xaa\xfe\x54\x76\xf3\xf7\x9d\x4d\xbe\xc2\x16\xfa\x76\x80\xee\x8e\x84\x00\x2d\xcb\x9d\xdb\xc7\xfc\x1e\x1c\x8e\xf4\xf1\xb2\xa2\x08\x1b\x92\x82\x24\x3d\xa6\x15\x3c\x1f\xce\x09\x05\xcf\x35\xf8\x3a\x68\x4c\x01\xb0\x45\x57\xec\x84\xf7\xe9\xa9\x4f\xc2\x88\x2e\x2f\xf1\x9f\xea\x21\xd2\xce\x61\x67\x86\x1c\xe0\x1d\xf8\xb8\xd3\xc3\xe8\xd2\x55\x61\x0b\x7a\xf2\x59\x6c\xd5\xcf\x00\x16\x73\x49\x42\xcc\x71\x4c\x27\x2c\x05\xfd\xa9\xd3\x47\x23\x62\x66\x46\xa4\x61\x30\x18\x2c\xeb\xcf\x17\x9e\xc0\x0a\x6a\x17\x3b\xd8\x57\x7f\xa8\x45\xc4\x4d\x19\xc6\x99\x79\x44\x75\x5f\x2b\x4e\x46\x85\x63\xa7\x5e\x90\x16\x52\x3b\x87\xdd\xac\x3e\xee\x21\xbc\xbc\xa0\x8f\xcc\x29\x54\x6a\x43\xcb\xe0\xd8\xd1\x0a\x0e\x8d\xdc\xba\x17\x2d\x1d\xed\x15\x03\x78\xe1\x8b\x36\x8c\x77\x63\x91\x3e\x4b\x40\x70\x12\xfd\x76\xa8\x72\xd2\xcb\x04\x93\x0b\x8e\x22\xb3\x08\x24\x3d\x4c\xc2\x78\xfd\xf2\xe1\xf9\x40\xae\x89\xac\x89\x1b\x9e\x06\x61\xae\xe5\x53\x93\x7b\xf3\x50\xb4\x07\x07\x0a\x1b\xdf\xc4\xf7\xa3\x78\x7e\xf3\x99\xd2\xca\xf4\xec\x74\x43\x9c\x58\x73\x76\xc7\x7b\xe0\xc3\xde\x53\x9d\x3a\xc2\x60\x89\x76\x5b\x9b\xe1\x0b\x90\x38\x69\x46\x36\xe2\x62\xd7\xba\xa0\xb3\xa8\x94\x1a\x20\x15\x96\x76\x39\xf6\x04\x4c\x67\xe5\x9b\xc8\x1c\xf2\xfb\xa7\x04\xac\x0d\xf4\x8d\xa6\x03\x74\x05\xa8\xe8\xb8\xa7\xce\x3c\x58\xef\x38\xa8\x83\x53\x8b\x24\x7f\xfe\x18\x09\x7a\xf0\x95\x24\x2b\x05\x8b\xdd\x1e\x3e\x24\x5e\xec\xe0\xa7\x1b\x75\xb9\x7d\x52\xf2\x0d\x6d\x51\xbb\x97\x66\xb0\xda\x0f\xc0\x9c\x8a\xc2\xa3\x0f\xb6\xe7\xb3\x2e\xe0\x6d\xad\xf4\x6d\x73\x59\xcc\x06\x6a\xa9\x47\x85\xd8\xa8\x82\xff\x09\x7d\x78\xa8\x6b\xe2\xd4\x56\x00\xdd\x3d\x30\x60\x12\x5f\x01\xc0\x63\xe4\x88\xd5\xc3\xef\xee\x1b\xca\x1e\x58\x51\x64\x55\xff\xca\xec\x1b\x81\xef\x43\x38\x76\xbf\x09\xff\xa5\x1d\x6f\x50\x18\x58\x52\x24\x57\x9c\xb6\x7b\x56\xce\x1c\x21\x6e\xc0\xa8\x83\xe0\x6c\x8e\x15\x63\x42\x1e\xa7\x2b\x0c\x10\xd4\xbb\x31\xe4\x91\xc2\xae\x2f\xe8\x13\x9f\x24\x9e\xc9\x27\xd8\x06\xba\x08\xdb\x52\xb1\xb5\x06\x66\x90\x47\xf0\xc1\x16\xff\x37\xac\x5b\xa6\xcd\xb1\xea\xaf\x33\xfd\xad\xb0\x70\x5c\x79\x9d\x35\xac\x6d\x9c\x80\xda\x90\xc1\x43\x8b\x58\x5f\xfd\x59\x35\x0a\x26\x86\xb1\xec\x35\x16\x6c\xb9\xb6\x9a\xd0\xf5\x65\x86\xaa\x03\x27\x4d\x78\x2e\x3f\x85\x8d\xb6\x4a\xdf\xbf\x04\xd5\x22\x8a\x7b\x1c\x4a\x20\x48\xbb\xcd\xb9\x41\x15\x3a\x43\x6d\x74\x2c\x38\xb5\x8b\x4d\x7d\x13\xc9\xf1\xd6\x0e\x15\x2a\xa2\x79\x23\x49\xa3\xd9\x4e\x7e\x6b\x11\x04\xaa\x1b\x87\x09\x98\xc1\x8d\xd7\x06\x56\x54\xa8\x52\x81\xbb\x6f\x02\x7f\xaa\xd5\x56\xb1\xf5\x32\xe7\xa1\xe2\x2d\x56\x40\x69\x28\x95\x87\xa0\xef\xc9\xc1\x58\x5d\x13\x5f\x31\x23\x3c\x41\xf4\x40\x46\x6e\x71\xfe\x90\x12\xe5\xf9\xa0\xd7\x4a\x72\x82\xee\x39\x2f\xb0\x16\x5d\xb7\x9f\xf1\xd3\x17\x6e\xd0\x8a\xfe\x1d\xaa\x66\xcf\xbf\x43\x05\xae\x16\xac\x17\x92\x33\x43\x99\xf7\x1b\x19\x17\xdd\xec\x27\x0a\xcf\xf6\x65\xea\x05\xd1\x84\xc2\xc5\xcd\x2c\xcd\x90\x2b\x22\xf9\xb7\x19\x5e\x66\xa6\x55\x56\xca\x88\x4b\xa6\xf5\xda\x04\xdc\xd4\x61\x7f\x33\xdc\x2b\x44\xa0\xea\x74\x2a\xeb\x2b\x93\xf3\xa4\x1d\xf7\x95\x7a\x02\x67\x97\xa5\x85\xce\xee\x81\x4b\x19\x75\xf5\x23\xd2\xdb\x5d\xbb\x9b\xe0\xca\x64\x9d\x1d\x45\xdc\xfd"}, +{{0xd2,0x90,0xff,0xd9,0x33,0x95,0xbd,0x5f,0xc5,0x87,0xd1,0xab,0x51,0x18,0x66,0xe7,0x2b,0x37,0x1a,0x17,0x35,0x73,0x2d,0x9d,0x5c,0x6a,0x18,0xdd,0x46,0x5e,0x93,0x63,},{0xfd,0x4a,0xad,0x73,0xb0,0x32,0x46,0x1c,0xa0,0xaa,0xe8,0x71,0xca,0x70,0x16,0x38,0x3b,0x2b,0xe0,0x16,0x90,0x53,0xfd,0xbf,0x6c,0x59,0x14,0xfd,0xd6,0xdd,0x6f,0x92,},{0x21,0x70,0x4d,0x5e,0x62,0x6d,0xcf,0x6a,0x9d,0xcd,0xef,0x93,0x54,0x29,0xeb,0x7f,0xb5,0xb2,0x57,0xee,0xcd,0x7b,0xf7,0x4a,0xcb,0x0c,0xd3,0x0e,0xcf,0xcf,0x60,0x8d,0x0c,0x5b,0x63,0x3a,0x4a,0x8a,0x9b,0xa2,0xcc,0x82,0xa2,0x1e,0x03,0x35,0x5e,0x01,0xd8,0x5d,0xae,0x7e,0xca,0xc8,0x89,0x6d,0xc1,0x5d,0xae,0x04,0x85,0x70,0x71,0x04,},"\xeb\xd9\x00\xbc\x91\x0c\x5e\xcc\x4d\x97\xda\xf7\xcb\x5e\xbb\x54\x91\x50\x0b\x7a\xd1\x16\xe3\x06\x60\x95\x07\x09\xd8\x08\x4b\xb6\x43\x4c\x5b\xea\x4a\x8c\xcc\x1e\xd5\xa8\x01\xbe\xbb\x1a\x11\x78\x78\xc0\x37\x47\x00\x3e\x14\x8e\xd9\x14\x34\x83\x2e\x89\x66\x24\x1a\x7f\xff\x22\xfe\x1d\x6d\x8c\x3c\x3d\xdd\x72\x15\xa1\xef\xaf\x4b\x07\xaf\xee\x1b\x25\x67\x3a\x14\x39\xea\xac\x32\x4e\x89\x5d\x4b\xe8\x39\xe9\x76\xc0\x3a\xc0\x01\x25\x48\x76\x88\x8c\xca\xaf\x39\x12\x72\x7a\x60\x10\x6a\x87\xbe\x69\x24\x7c\x9e\x43\x8c\x31\xfc\xa8\xd9\xc6\x1b\xae\x36\x8c\x83\xe4\x09\x01\xa9\x97\x00\xdf\xf8\x39\xb5\x13\xba\x8d\xc4\x2d\x93\xce\x09\x87\xa2\x33\x34\x70\xa9\xf9\x83\x31\x3f\x91\x98\x86\x59\xda\x54\x03\x9e\x49\x9c\xd1\xaf\x2b\x8f\xa0\xeb\xe7\x50\xe2\x4d\x55\xc2\xa5\xbd\x1a\xde\x3f\x68\x00\x92\x54\x2b\xd1\xbe\x0b\x97\x35\xba\x39\x3a\xd5\x69\x7d\x24\x1e\x8e\x8b\x28\x64\x6d\xb2\x7d\x2f\xb5\xa9\x40\xe8\xfa\xea\xf0\xb6\xc9\xef\xda\x88\x61\x5d\xec\x89\x1c\xe7\x32\x93\x08\x13\xbf\xbb\xd0\xbc\x5f\x82\x10\xab\xe8\x43\xbe\xb5\xe4\xf0\x28\xf4\x9b\xea\x34\xf1\xe5\xb0\x9e\xac\x4c\x66\x62\xc7\x4f\xba\x39\xde\x4a\x96\x02\xa9\x69\x4a\x85\xc7\xc1\x37\x5f\xda\xdf\xda\x6a\x19\x57\xfc\x5b\x59\x87\xa6\x87\xb0\x39\x95\xe5\x16\x97\xa1\xab\x5b\xb6\xcb\x11\xb6\x63\xc1\x37\x2f\xad\xe4\xc0\xac\xa8\xfb\xeb\xb4\xeb\x54\xce\x7c\xe3\x6c\x69\x04\xea\xf6\xea\xb2\xf3\x4f\xac\xd8\xc7\x68\xc8\xd3\x6d\xa2\x39\x7b\x1a\x02\x73\x5a\xea\x72\xcf\xaa\xd0\x39\x34\x10\xdb\x52\x7a\x8a\xb2\x36\xd4\xcd\xab\xdc\x88\x8f\xac\x6f\x18\x21\x48\xb1\x32\x61\x44\x25\xd3\x90\xff\x03\x6e\x54\x85\x5e\x42\x03\xc5\x12\x03\xc1\xf4\x3e\x37\xbb\xf6\xb9\xbf\x27\xf5\xb7\xe7\xc6\x65\x15\x14\x65\x40\x1a\xc3\x2c\xbe\x9e\x33\x50\x53\x5e\xdf\x48\xa7\xbc\x36\x03\xe2\x23\x2e\x93\x8f\x9a\x81\x5a\xc4\xd1\xde\xec\x99\x1e\xf9\x62\x09\x48\x44\x1f\x7a\x2f\x4a\x46\xe2\xc4\x00\xab\x91\x4c\x4b\xe5\x1d\xca\xad\x8e\xd8\x23\x9c\xbb\xe9\x77\xa9\xf0\x9c\x02\x69\x83\x19\xd9\xfe\x2a\x8c\x6e\xb6\x0b\x79\x9f\x29\xae\x76\x59\x97\x0d\x2e\xbd\xff\x3c\x6c\xf7\x09\xbb\xf6\xf4\xbb\x55\xb9\xdf\x4f\x61\xa2\x41\xde\xc1\x44\xb5\x99\x3f\x08\x7e\x78\x4b\x97\xbe\x1e\x53\x60\x8c\x2e\x81\x7c\xe3\xd9\xaa\xf9\x14\xe6\xb7\x23\xf5\xb4\xaf\xff\xd2\xa6\xb9\xfe\x9d\x2d\x73\x91\x5c\x7a\xd1\xff\xb1\x3e\xfc\xb7\x3c\x56\x23\x81\x95\x64\x52\x03\x98\x4c\x99\xaa\xfd\x02\x35\xf7\x3b\x3f\x88\x2e\x07\x39\x39\xbf\x78\x66\x57\x28\x01\x38\xdb\x05\xb8\x6f\xcc\x94\x60\xb3\x85\xef\x45\x59\x20\x4e\xcd\x81\xe2\xf1\x2f\x5f\x06\x2a\xa4\x48\xdc\xcc\x82\xea\x8d\x89\x46\x6d\xd1\xbe\x46\xf8\x2c\x4f\x87\xbf\x0d\xb2\xb8\x78\xac\xbb\x0d\x91\x12\xc8\xdb\x6f\x51\xd3\x5f\x6d\x42\xf7\x49\x85\x6b\x99\xe5\x50\xb6\xc4\x54\xe9\xe8\xbe\x4d\xa1\x75\xf0\xb5\xe8\x6b\xe6\x6c\x97\x9f\xd8\x78\x23\x7e\x57\xf6\x91\xf0\xd2\xac\xd0\x28\xfb\xff\xa5\xb0\x66\x87\x75\x03\x4d\xb1\xf2\x1d\xdb\xe7\x11\x4e\xe3\xdc\x0b\x44\xda\xca\x64\xc5\xa0\x3a\x2f\xee\xae\xab\xeb\x70\x63\xbf\xcc\xcc\x55\x9b\xaf\x27\xf1\xcc\xb2\x20\x2f\xa4\xd1\xb2\xbf\x44\xc0\x4b\x2c\x2f\x81\xf9\x4e\x28\x1b\x1a\x5a\xdc\x85\x0d\xa1\xb9\x47\x9f\xca\xbd\xda\xde\xa5\x6a\x11\x5b\xb5\xf0\x6c\xc0\x16\xf1\x41\xc0\xfc\xb5\xe8\x3a\xb2\x48\xea\xec\x90\x15\x8d\x8b\xe6\x47\xaf\xf1\x2e\x7e\xeb\x5e\x57\xdb\xcc\x29\x3c\xb3\xb6\xaa\xcb\x55\x23\x6d\x4a\x83\x9a\x06\x20\xf4\x76\x23\x87\xdd\x17\x14\xdf\x5c\x13\x5e\x3d\x9d\x68\x24\xf9\x3b\x7c\x90\xd3\xae\x38\xc5\x18\xd6\x07\x12\x0c\x83\x95\x70\x41\x3b\x46\xb8\xcc\xd7\x37\x04\x92\xd8\xae\x5c\x60\x9e\x00\xcf\x82\x51\xe2\xe7\xdf\x81\xe5\xb4\xf9\xc1\x6a\x5a\x53\x9f\x0a\xfc\xce\x41\xbb\x43\x62\xe5\xea\xa5\xf9\x40\xa1\x70\x6f\x4a\xfb\x6b\x14\x43\x2c\x81\xd4\xba\x1a\x33\xd3\x22\xdb\xf1\x06\x45\xab\x63\x73\x7e\xad\xc8\x6f\xe6\xe0\x97\x6f\x76\x33\x97\xfb\x89\x86\x37\x59\x5d\xfd\x36\x93\x47\x92\xd7\x79\xe2\x4c\x2a\x3f\x0b\xac\xf5\x3e\x04\x73\xc5\xfd\xa9\xc6\x12\x84\xe4\x41\x9b\xdc\x0e\xef\x5d\x22\xf4\xd9\xbf\x42\xe8\xc0\x49\x33\xbb\x93\xb5\x3c\x29\x5d\x7a\xc9\x39\x5a\xbb\x6d\xcb\xd7\x42\xb1\xe1\xbc\x3b\x0e\xa4\x43\x4e\xa2\x1b\x8e\xca\x9a\xe6\x82\xd3\x31\x5a\x41\xe9\xc3\xc3\x37\x18\x40\x76\x1d\xc5\x9c\xac\x45\xda\x7e\x38\x13\xe2\x87\x88\xdc\x89\xde\x35\x5b\x5a\xee\x08\x80\x90\xa3\x8d\xd3\x9d\x83\xe5\xe4"}, +{{0xd7,0xfd,0x73,0xd1,0xd2,0x29,0xa6,0x58,0x94,0x42,0x0e,0x4b,0xa7,0x34,0x27,0x0d,0x5a,0x20,0x75,0x83,0x64,0xde,0x89,0x7d,0x85,0x55,0xe2,0x41,0x97,0x45,0x3c,0x19,},{0x3c,0x22,0x77,0x2a,0xec,0x0a,0x0c,0x15,0x59,0x07,0x7f,0x2c,0xfd,0x1f,0x24,0x65,0xd4,0xb4,0x84,0x95,0xc5,0xd0,0x5f,0x1f,0x83,0x7c,0x31,0x84,0x5f,0x34,0xca,0xd1,},{0x40,0x0c,0x35,0x05,0xf1,0xdf,0xa8,0x0d,0xf4,0xb2,0x6d,0xb2,0x4c,0x02,0x7e,0xb8,0x19,0x77,0xf0,0xfb,0x9b,0x5a,0xca,0x52,0x4a,0xd5,0x12,0x00,0xf4,0xbf,0xb1,0x33,0xdb,0x83,0x48,0x23,0x31,0x41,0x95,0xf4,0xed,0xc2,0x92,0xd5,0xf5,0x30,0xd0,0x85,0x56,0xe7,0x80,0x9c,0xaf,0x23,0x39,0x76,0x8a,0xa3,0x80,0x29,0xfd,0xbc,0x28,0x0f,},"\xc9\x22\x58\x59\xd5\x55\xbc\x42\x01\x1a\xf1\xb4\xf1\x49\x98\xe6\xe9\xb0\xa6\x5e\x21\x72\x71\x3e\x96\x83\x80\xfb\x6c\xee\xdd\xa2\x2e\x02\x2c\x51\x30\x30\x31\xd9\x93\x1c\xce\xf2\xf7\xbc\x70\x5c\x9e\x21\x5c\x1d\x08\x9d\x48\x8d\xad\xda\xee\x15\x5c\x93\x9b\x62\x02\xca\x53\xbf\xc7\xf6\xe8\x8e\x15\x29\xd8\x2f\xb4\x5e\x02\xb5\xd0\x5a\x82\xbb\xb9\xdb\x5f\x41\x5c\x58\xba\x8b\xd5\x6c\xff\xd9\x22\x70\xb2\x47\x49\xe5\x6d\x12\xc9\x9a\xe9\x0c\x78\x00\xf5\x4f\x55\x25\x4e\xa4\x2d\xa5\xdc\xfb\xe0\xe1\xd9\x89\xcd\x2f\x68\x97\xe2\x32\xdf\x04\x70\x7b\x34\xaf\x75\xfa\x7f\xec\x33\xe5\x5e\xd5\x6a\xee\x39\xc2\x2b\x04\x5b\xed\xd1\x61\x08\x3b\xc5\x51\x4c\x1f\x81\xca\x90\x7b\x7c\x76\x03\x17\xa7\xfd\x5a\x5a\x02\xa5\xd4\x0e\x2e\x82\x3e\x24\xad\x96\xae\xf6\xda\x8e\xa9\x82\xb5\x16\x1c\xc3\x9d\x84\xaa\x2f\xfd\x95\x44\xc1\x1b\x63\x40\x37\xab\x0a\x1c\x8e\x36\xac\x63\x01\x9d\xa1\xb2\xd9\x95\xcb\x7b\xd3\xd6\x2f\xe5\x74\xde\xab\xcc\xbd\x0d\x3a\xe7\xa5\x6e\x5b\xec\x91\xe4\xba\x3f\x3d\xb8\xbf\xea\x88\xe6\x7d\xa6\x2e\x88\x27\x8a\x6e\x3b\x41\x8d\xce\xea\x05\x89\xf2\x5f\x7d\xd8\xad\x19\xdd\x84\x50\x89\x41\x9b\x47\x2e\xfc\xcc\x87\x9c\x17\x2b\x32\xee\x4a\x4d\xbc\x2e\x6c\x2e\x86\x5b\xb3\xb8\xca\x0a\xdc\xb7\x1f\xdf\x89\xe1\x97\x39\x10\xef\x24\x29\x15\xf3\x3e\x23\x6d\x2f\x7c\x8e\x9f\x1e\xe5\xb0\x7c\x6e\x3c\x25\x36\x0f\x8c\xb1\x46\x0b\xe8\x7d\xb3\x1a\x29\x1d\x4d\xee\x34\x95\x3e\x75\xc6\x75\xbf\x18\x1b\xb7\xa0\xb7\xb5\xc1\xbe\xfd\xc8\x6a\xda\x07\x2a\x48\xf6\xac\x75\x5d\x49\x9b\xd6\x8d\x62\x5d\x85\x14\x52\x5c\xc3\xab\x8f\x54\xce\x15\xa8\x71\x29\x17\x78\xde\x13\x05\xd2\x21\x93\x61\xaa\x30\xe3\x32\xa2\xe0\x69\x07\x7c\x5c\x53\x45\x75\x20\x37\x9d\x8b\x90\xd2\x4b\xd8\xa3\xa7\x70\x0f\xf7\x66\x23\x1c\xb5\x69\x7f\x9a\xce\x52\x1a\x99\xe8\x96\xda\x54\xc4\x07\x93\xbc\x7c\x1f\xb1\x58\x4b\xb1\xc8\x61\x94\xd2\xfb\x7a\x4b\x80\x2f\x30\x88\x5e\x0e\xe8\xaf\x88\xd6\x88\x6e\x3a\x3a\x4d\x4c\x85\x46\x49\xcc\x01\xab\xdf\x35\x31\x9a\x08\x56\xcc\x65\xd0\x92\xa3\x86\xf8\x86\x96\x25\xcd\x0a\xca\xc0\x87\xe9\x35\x17\x90\xcc\xb4\xa8\x65\xf6\x51\xa8\x81\xc3\xeb\xf1\x09\x07\x27\x74\xf9\x40\xf5\xaa\x98\xa2\xa2\xaa\x3d\xd3\x66\x47\xd0\xde\x83\x00\x1a\xa7\xcd\xc0\x31\xcc\x4a\x4d\x75\xdc\x11\xce\x55\x16\x76\xa2\xad\x43\xa3\xf6\xa1\x6a\x4b\xc5\xae\xe8\x0e\x53\x64\x20\x60\x87\x36\x4e\xb8\xb2\xb1\x5f\xb7\x05\x38\x0a\x07\x2d\x7c\x8b\x51\x99\x59\x43\xaa\x76\x2e\x8d\xeb\x4c\x56\x8c\xda\xa1\x41\x1a\xb6\x8f\x28\x48\x9e\x13\x23\xbb\x61\x56\xce\x25\x00\xb0\x6e\x77\x93\xc5\x10\xa3\xde\x29\x15\x08\x40\xbf\xdb\x0b\x2b\x7b\x21\xc2\xbb\x8a\x77\x46\x16\x7c\x92\x9d\xd0\xad\xad\x44\xfe\xd8\xf3\x6e\x83\x81\xb3\x42\x08\x0b\x2a\x7d\x82\xa3\xf8\x1f\xf7\x26\x30\xcb\x78\xdf\x91\xf7\xb6\x5a\x44\xef\xf6\xed\x64\xd4\x8a\xfe\xd1\x09\xdd\x7a\x69\x3a\x1b\xa8\xc3\x7e\x00\x8f\xcb\x15\x7e\x37\x29\x7d\x32\xeb\xa7\x65\xa6\xc7\x19\x3e\x73\xbd\x97\x64\x79\x85\xb1\x60\x38\xc7\x4a\x08\x4a\x8f\x25\x65\x4c\xd8\xcd\x2c\xdd\x27\xff\x17\x33\x4e\x06\xad\xaa\x05\x82\x64\x01\x7a\x3b\x2d\xa7\x8e\x57\x38\xa2\x7e\x35\x0d\x88\x2f\x5f\xae\x19\x92\x78\xd4\xe5\x0b\x8b\xad\xf5\x7c\x21\x41\xdf\xdc\x3c\xff\x99\xdf\x5d\xe8\x6f\xec\x29\x3c\x76\xcb\x94\xb6\xb1\x9b\xa3\x03\x4e\x46\x0f\x84\xc2\x80\xa2\xe6\x41\x2f\xab\x56\x98\xce\x89\x02\x07\xca\xba\xbc\xa0\xa9\x5b\x5a\xd5\x33\xce\x11\x4b\xf7\x1a\x40\x4a\x87\x59\x0d\x35\xfa\x7c\xed\xba\x43\x13\x1c\x4e\xe9\x23\x44\x83\x9f\x25\xcb\xfa\xeb\x12\xae\xeb\xc8\x04\x08\x93\x95\x1a\x34\x6b\xd2\x8f\xdd\x16\x7b\xd2\x0f\x71\xa1\xe5\x9f\xb6\x0d\x55\xe1\xc5\x67\xf4\x78\xf0\x27\xcf\x67\x9a\x37\xd1\xd9\xdb\x86\x7e\x17\xbf\xdd\x60\xb3\x47\xd8\x9d\x32\x26\x39\xd3\x15\xbb\x7a\x2c\x91\x34\xf0\x0e\xa0\x3a\x36\x7f\x30\x5e\xa4\xd6\x0d\xc9\xd5\x67\xcf\x92\x48\x51\xe4\x69\xea\x95\x4e\xd3\xea\x63\xea\x86\x06\xf7\x9f\x07\x73\x39\xbf\xa2\xb5\x1a\xe4\x9b\xaa\x0f\xb2\x53\x77\x82\x1d\x7c\x11\xef\x9a\xd4\xbb\x4c\x0f\xe4\x89\xac\xba\xb0\xef\x00\x0d\x61\x8c\x7a\xf5\xef\xd2\x05\xd6\x85\x99\xfc\xbd\xd9\x5e\x28\xf8\x36\xe0\x91\x6f\x9f\xf5\x48\xd0\xba\x17\xda\x62\x53\x6e\x74\x64\x68\x01\xee\xb6\x12\x2b\xa3\x2c\x41\x07\x3a\xe0\x4e\x42\xc6\xc1\xd5\xd8\xd2\x29\x76\xa5\x62\x26\xdd\xf4\xb6\xac\x95\x45\x5f\xb5\x30\x99\xf2\x02\x15\xb2\xeb\xc9\x07"}, +{{0xfd,0xa7,0xcb,0x08,0x40,0x16,0xba,0x51,0x3c,0x7c,0x4f,0x8f,0x71,0x80,0x48,0x0b,0xb1,0x81,0xe9,0x56,0x95,0xea,0x68,0x73,0x7f,0xa3,0x4a,0x40,0xec,0xbd,0xf3,0xef,},{0xa2,0xde,0x3a,0x0e,0xf9,0x72,0x98,0xfd,0x71,0x61,0x06,0xe2,0xf3,0xf5,0x45,0x13,0x05,0x7a,0x40,0x07,0x2d,0x23,0x4c,0x35,0x18,0x15,0x4c,0x1b,0xd1,0x2d,0xe0,0x37,},{0x33,0x61,0x4b,0x7a,0x94,0xf7,0x5e,0x03,0x65,0x34,0xd7,0x6e,0x30,0x14,0x7e,0xcc,0xdd,0x2a,0x04,0xe0,0x0c,0xd4,0x70,0x4a,0xb6,0xe8,0x07,0xd6,0xa2,0xac,0xc1,0xe1,0xd9,0x63,0xb8,0xee,0xe0,0x81,0x0d,0x41,0x2d,0x9d,0x56,0xe5,0x45,0x56,0x30,0x2b,0x10,0x73,0x0c,0x15,0xab,0xf8,0x9c,0x29,0xa0,0x27,0x30,0x3e,0xa8,0x8a,0xe7,0x01,},"\xc2\x1b\xb3\xf8\xe3\x7b\xef\xa3\x67\xc9\x13\x67\x31\x01\xba\x30\xd3\xb5\xc7\x4b\xd8\xbd\xb0\x9c\xd2\x86\x40\x01\x2d\xb4\x11\x20\xc2\xbc\xc4\x08\x5d\xe2\xa0\xf9\x5c\x92\x15\xdd\xef\x8c\xb5\xfc\x8d\x8b\x12\x51\xb4\x15\x27\xc6\x7d\xfa\xa3\xf9\x5b\xa3\x57\x83\x91\xea\x5a\x66\x29\xa7\x33\x09\x5f\xd0\xa4\x3f\xdb\xa4\x0f\xfe\x26\x0f\xff\x82\xac\xee\x2e\xbe\x98\x0e\x9e\xce\xcc\xfe\x7e\x10\xb2\xed\x8c\x2e\x6b\x41\x0d\x54\x7a\x12\x86\x57\x1d\xf3\xd7\x01\x17\x4e\x57\x9f\xcf\x19\xd3\xbd\x80\x86\xc0\x42\x3f\x37\x11\x77\x89\xf3\x05\xd9\x67\x0a\xd2\x8c\x99\x67\x4f\x52\xcf\x64\x21\x1a\x08\x1d\x0c\x6c\x30\x96\xda\x2c\x71\xbf\x5f\x57\x99\xa7\x91\x0e\x6f\x38\x10\x4a\x37\xa6\x55\x7c\x2d\xae\xf3\x40\x81\x4a\x1f\x83\x0d\x59\x37\x73\xc6\xcf\x48\xd8\x3e\xa0\x72\x94\xb9\x4e\xb0\x80\xb8\x5d\x69\x70\xe2\x8f\x40\x51\xd5\x06\x6d\xb1\x0e\x96\x19\x73\xa6\x26\xa8\x26\xae\xaf\x8a\x06\xec\x0d\x56\x6b\x7e\x0c\x4e\xf6\x0f\x0c\x56\x78\xfc\xbb\x5b\x2a\xc6\x3f\x7b\xed\x06\x44\x8a\x24\x7b\x3d\x42\x7b\x87\x08\x6d\x33\x57\x3f\xb2\xd7\x22\x8c\x5c\x34\xea\x66\x40\xee\xfa\x95\x64\x48\x5a\x79\x63\x8e\x9c\x97\xc0\xaf\x84\xcf\xee\x7c\xe4\xa7\x39\x22\x0c\x84\x29\xe0\x67\x14\x39\x53\xd5\x50\x66\x8d\xad\xc8\x4e\x7b\xed\x9a\xb0\x70\xa5\x94\x33\x90\xc6\x11\xd7\x5b\x1c\xb1\x28\x73\xa3\x7d\x98\x50\x66\x1a\x00\x77\xbf\xa9\xca\x9b\x8b\x26\x37\x66\xc1\x49\xff\x0e\xe4\xb4\xad\xba\x25\xea\xf7\xd7\xf5\x01\xf3\x62\x45\x42\x56\xbc\x12\x69\x37\x8e\xf3\x35\x9a\x8e\xd6\xb9\x60\xb8\x66\x21\xfa\x3b\x61\x3e\xb1\x32\x12\x2f\x49\xf2\xeb\x2c\xeb\x68\x32\xa3\x99\x1e\x96\x1c\xb0\xe7\x8b\x74\x2e\xf4\xd6\x5e\x8d\xe3\x46\x96\x66\xfe\xc7\xc5\xb8\x74\x78\x95\x71\xc5\xc9\x9a\x2c\x02\xa0\x53\xff\x7d\x2f\xc9\x00\x76\xba\xfe\x1f\x26\x7f\xa8\x1a\x39\x90\xf2\x7f\xf1\x4f\x03\x00\x0a\xf0\x0c\x59\x28\x6c\xb9\xbb\x98\xe2\x04\xe9\x01\x90\xae\x2a\x50\xed\xef\x04\x9e\xa9\x2a\x1f\x78\x50\x88\xf9\x4a\xdf\x65\x88\xfb\x43\xbb\x40\xfb\xe2\x32\x42\x35\xcc\x7e\x16\x8b\x80\x26\x4b\x06\x9f\x94\x4f\x50\x36\x92\xc9\x49\x23\x4d\x5b\x76\xbc\xff\xab\xe2\x9f\xf9\x06\x4b\xd7\xcb\xed\x9e\x00\xe5\xb7\xfd\xda\x43\x12\xeb\x80\x14\x65\xf1\x27\xd0\xca\x68\x83\x2a\x7f\x4e\xd0\xea\xed\x8f\x55\x9c\x16\x31\xcd\x4d\x34\xf0\xdc\x41\x4d\x9f\xcf\xe8\x49\xa9\x1e\x25\xf3\xe0\xff\x01\x3a\x8c\xff\xa8\x06\xed\x8e\x93\xd0\x8a\x1e\x5a\x75\x76\x82\xca\x3d\x26\xab\xc8\x69\xc7\x6f\x1c\x79\x00\x7d\x55\x9d\xfe\x67\xe7\x8d\x8a\xf0\x19\x58\x08\xb0\xe7\x71\xc7\x1e\x64\xb5\x71\x6f\xb3\x63\x09\xc2\x50\x25\xfa\xe6\x41\x4c\x28\xbb\xdb\xd4\xde\x59\x7a\x74\x99\x6c\x9d\xa9\x74\x92\x0d\x59\xe6\xf4\xc2\xed\xfe\x11\x0f\xf8\x17\xfd\x48\x0a\x50\x80\x97\x80\x48\x86\x57\x12\x05\x8c\x5f\xe7\xb5\x60\xb1\x2b\x67\xf7\x37\xea\x6e\x2a\xf9\x24\x2c\xf0\x7a\xd0\xa8\xa6\x79\xf2\x64\x30\x04\x6a\xdc\x3e\x70\x66\x4c\xc9\xc0\xee\x5a\xbc\xef\x6d\x72\x6b\x4e\x04\x17\x60\x48\xb7\x95\xbe\x12\x85\x1b\xdb\x74\x00\x3a\x13\x20\x41\x19\xb8\x68\x64\xd6\x53\x5b\xa0\x95\x04\x0a\x85\xd9\x78\x1c\xf4\xf3\x48\x0a\x30\x4e\x22\x7f\x78\x7a\xd5\x38\xe6\x8f\x4b\xab\x01\x41\x79\xe3\x0d\x3f\xde\xf9\xef\xf1\x1b\xcf\x47\x1f\xa3\xa0\xbc\x74\xb5\x57\x6f\x30\x2d\x3a\x6b\x49\x9f\x11\xf2\xef\x32\x6a\xc0\x26\xc9\x8d\xb1\x0e\x27\x41\x41\x3f\x32\x22\x28\xb3\xcf\xf0\xf3\x37\xba\x2f\x29\x4c\x78\xef\x73\xf0\xe8\x77\x87\x8f\x8f\xc7\xff\x6d\x10\xbc\xe6\x6a\xd6\x28\x43\x79\xb8\x0c\xa8\x93\x27\xd4\xdb\x0b\xf1\x4e\x6d\x8f\x01\xb2\x2a\xb2\x02\xb7\x16\xcc\x07\xe3\xc8\x86\x6d\x16\x8a\x50\x94\xba\xc5\xa4\x95\xe7\x38\x68\xee\xdc\x27\x22\x2e\x64\x44\xf8\x3b\xcf\x65\xac\xdc\x3e\xc8\x91\x20\xbb\x50\xe8\xab\xfc\x28\xb7\x8e\x6d\x98\x0c\x77\x5f\x48\x49\xa0\xe8\xca\xda\x80\x24\x0b\xca\x24\x5e\x39\x96\x6e\x89\xa0\x34\x4d\xf8\x36\x3a\x7d\xcc\x81\xb2\x01\xce\x9c\x75\x3a\xd5\x44\xe1\x12\x4e\x21\x02\x0d\x4c\x62\xde\xda\x9e\xd9\xb9\xd1\xf2\xfb\x7c\x54\xca\x7a\xb0\x9f\x38\x3b\xef\x48\xcf\xc6\x84\x8c\x27\x13\x02\xa1\x0f\xa6\x87\xf5\x6e\x00\xe0\xa7\xd0\x93\xc9\x27\xb4\xfd\xd8\xf1\xbe\xdf\x62\x88\xa0\xe3\x02\x84\x8a\x80\x12\xf1\x27\xa7\x9d\x2d\x30\xa0\x6c\xe1\x7d\x94\xaa\x6f\x7f\x8a\x1e\x6e\xb9\xd0\x68\x1c\x37\x74\xf6\x14\xcc\x6d\xbc\xb2\xa8\x13\xf9\x25\xc6\x30\x6a\x63\x05\x72\xa8\x3e\xc1\x09\xd5\xf5\x33\xc0\x58\x4c\xb4\x21\xd9\x19"}, +{{0xa1,0xac,0x48,0xaa,0x5f,0xfa,0x3d,0x80,0x08,0x19,0xd0,0x3b,0x7f,0x62,0xba,0xbf,0x29,0x1f,0x20,0x90,0x4c,0x11,0xa6,0x40,0x0e,0x4f,0x45,0x20,0x5f,0x10,0x3e,0x38,},{0x08,0x54,0xe0,0x34,0x0f,0x81,0x49,0x85,0xfb,0x12,0x2b,0x78,0x72,0x94,0x79,0xe3,0xfd,0xe8,0x55,0xc2,0x11,0xca,0xde,0xae,0x56,0xf0,0xd4,0xdc,0x08,0x28,0xd5,0xfa,},{0xc5,0x7e,0x3c,0x09,0x1e,0xd2,0x4e,0x5e,0x84,0x66,0x5b,0xd9,0xbb,0x10,0x2d,0xb4,0x97,0x97,0xdf,0x90,0x08,0xf0,0x55,0x57,0xfa,0x0d,0x5a,0xd7,0xa2,0x95,0xe5,0xe4,0xd2,0xa4,0x71,0x6b,0x17,0xf8,0xc9,0x1c,0xb1,0x2f,0x5a,0xbf,0xb1,0xaf,0x02,0x7f,0xb0,0x41,0x11,0x99,0xac,0xc5,0xd2,0x85,0xd8,0x42,0xa4,0xb6,0x5b,0xde,0x49,0x02,},"\xd6\xf1\x24\xed\x75\x20\x21\xc1\x09\x26\x97\x2a\x0c\x26\xf3\xb1\x83\x8b\x3c\x7a\xf2\x47\xc1\x80\x09\xa2\x31\xec\xce\x96\x4b\xf6\x69\x86\x37\x83\x3f\x60\x7d\xca\x83\x6f\x8a\x60\x6c\x72\xae\x3c\xb1\x70\x17\x44\x47\xa2\xcc\xe5\x83\xf6\xe2\x44\xdb\xc1\x63\xe2\x15\xb9\x82\x0d\xe7\x49\x6f\xfc\x5b\x70\x50\xc4\x8f\x28\x30\x24\x66\x78\xcb\xa4\xdc\x5c\xaa\x07\xc1\x45\x85\x63\xaa\x2d\x10\xdc\xb7\x77\x0e\xf8\xfe\xde\x02\x7d\xd7\xf2\x0d\xdc\x8c\xc7\x8c\x3a\x2e\x2e\x95\x8b\xd1\x8c\x00\x06\xcf\x8f\xb8\x2d\x44\xe5\x3e\x1d\xa7\xaa\x80\xfd\x10\x06\xf3\xb2\x30\x0c\x9b\x07\x9d\x8a\x66\xf1\xe4\xa3\xf4\x70\x61\xf9\xe2\xf4\x5d\xae\x35\xdc\x29\x52\x04\xb1\x94\x60\xca\x57\x07\xab\x57\xce\x21\x5a\x24\xc1\x0f\xaa\xb3\xfa\x20\xbc\xcd\x10\x1e\x7a\x7d\x70\x07\x75\x99\xf3\xd6\x72\x57\x07\x55\x21\x29\xca\xd7\x57\xd6\x51\x4c\x1b\x28\x99\x7e\x47\x1f\x94\xb0\xfd\xed\x8f\xbb\xd0\x65\xde\xad\x19\x6d\x2c\x07\xd3\xdf\xa7\xb9\xfb\x3b\xae\x76\x80\xf7\x66\x21\x20\x0d\x09\x9e\xeb\xeb\xbe\xa0\xe8\x95\x7d\xf5\xb5\xe2\x04\xca\x3e\x9e\x29\x52\xb8\xa3\x0f\x0a\x13\x1a\x68\x67\xb1\x38\x1e\x39\x4b\x1b\x44\x43\x10\xf0\x76\x32\x66\x56\xcf\x93\x41\x67\x80\x08\xe9\x52\x51\x47\xd8\xd6\x1c\xe9\x3d\x3b\xf5\x39\x00\xca\xb9\x12\x66\x37\x17\xe0\x98\x72\x93\x83\x3d\x19\x02\xd7\xfb\x04\x7b\x99\x7b\x86\x02\x6c\x46\x7d\x7b\xb1\x7c\xf4\x57\x96\x73\x8f\x7a\x77\x4a\xc1\x26\x76\x4e\xd4\xeb\x45\x12\x43\x09\xf4\x58\x62\x60\x17\x6b\xa4\x65\x91\x8d\x48\x33\x0a\x9c\xc1\x8c\x4e\xce\xa0\xdd\xaf\x38\x94\x6a\xcc\x0e\x36\x1d\xd4\x0a\x7e\x91\x33\xce\xb5\x0e\x1c\x31\x7e\xa4\x2b\xd0\x98\x0a\x72\xb8\xba\x3d\x8a\x6c\x76\x93\xdd\x56\x02\xf3\x74\xf2\x66\x4d\xf4\xba\x56\xdf\x01\xe8\x82\xfc\xa4\x2c\xb4\xdb\x62\x1f\x47\x6c\x76\xe1\xea\x9f\xd1\x05\x91\x1a\x74\xb7\x79\x52\xd9\x91\x4a\x5a\xc0\xf9\x8a\x90\x0c\x1b\x2e\x1a\x56\xc4\xea\x85\x18\xa9\xee\x47\xc4\xed\x14\xd0\xbd\x35\xec\xa5\x60\x31\x9c\x8e\xa2\x47\x55\xd7\x1a\x4e\x03\x08\x50\xbc\x4d\xc6\x03\x89\xf3\x25\x80\x40\x21\x20\x4c\xce\xbc\x25\xfe\xdb\xd3\x2e\xdd\x8d\x84\x46\xaa\x23\xce\x56\xa8\x5f\x77\x9e\x85\x8d\x36\xaf\x7c\x07\x3c\x11\x5e\x34\x1f\x41\x2c\x66\x0f\xab\x80\x0f\xe7\x4c\x50\xe7\x14\xee\x08\x6e\x2f\xbc\x8d\x7a\xbb\xf3\xe9\x8f\xb4\x0c\xa2\x7f\x1f\x01\xa9\xaa\xdd\x8c\xc2\x27\x5c\x2d\xd3\xf7\x6e\x4c\x1d\x81\xc4\xb7\x92\xda\xec\xc9\xfe\x66\x04\x49\x41\xb8\xb2\x91\x84\x86\xdd\x4a\xcb\x56\x2a\x7b\x58\xad\x8c\x60\xc2\x1b\x83\xcf\x48\xae\xfa\x72\x56\xa1\xed\x80\x9e\x66\x98\x11\xf4\x84\x36\x49\x70\xbc\x56\x95\x08\x99\x19\xbc\x32\xd2\x8e\xa7\x52\xe8\xe3\x18\xce\xff\x46\x7f\x77\xae\x19\x77\xc5\xff\xd7\x9c\x17\xc2\xda\x8b\xc7\xf8\x23\xdd\x94\x39\x86\x83\x18\x99\x45\xf8\xb7\x92\x38\xa4\xe8\x15\xb1\x42\xb8\x66\xac\xbd\xbc\xb7\xae\xa7\xf1\x43\xff\xfb\x7c\xc2\xb4\xb5\x4b\xbf\x36\x1a\xfd\xa9\x13\xad\x6d\xf1\xe4\x9d\xfd\x6b\x53\x26\x42\xe6\x3f\x55\xd8\x93\xa4\x70\xd4\x03\x70\x66\x5c\xfb\x74\xef\xd3\xf5\x9c\xb0\xff\x60\x06\x17\x4c\xa3\x5f\x53\xb9\x7c\x54\x3e\x08\xaf\x4b\xf5\xbb\x75\xff\x90\x31\x61\x06\x52\xa3\xf6\xf2\xa0\xcf\xe9\x7e\x7a\x52\x1f\x3d\x2a\x28\x91\x14\xde\xd3\x47\x72\xb0\xe4\x98\x17\xbd\xe1\xcb\x92\x4f\xf5\x14\xe2\x86\x6a\x09\xe3\xed\xe0\x78\x2d\x2c\x0c\x98\xe6\x81\x4b\x8c\x1e\x77\x8c\xf8\x30\x63\x48\xc9\x33\xad\xb2\xe4\x72\xdb\xa0\x9d\xb9\x54\xff\x49\x64\x83\x73\x39\x5a\x2f\x01\x81\x95\x8f\xeb\x1e\xa2\x83\x4c\x99\x53\x28\x73\xdb\x5c\x88\xeb\x52\x89\xc7\x7e\x90\x01\x52\x03\xef\x50\x2a\xc8\xe1\xc4\x8f\xa1\xa0\x6d\xaf\xa6\x51\x9d\x52\xda\xe3\xc5\x56\x75\x70\xdd\x24\x34\xe6\x71\x92\x7c\x66\x36\x3f\x78\x31\x56\x89\x3f\x13\x8a\x84\xc7\x56\x64\xb3\x0a\xe4\x27\x51\x12\x73\x6d\x53\xd4\xf3\x99\xdd\xda\x3d\x23\x06\x7c\x07\x3f\x52\x1a\xfb\xa1\xf7\xbe\x58\x55\x13\xc2\xce\xc9\xc8\xf0\x8d\x2a\x22\xc3\xc8\x53\x92\xcd\x2a\xe5\x0f\x39\x28\x25\x1f\x86\xb3\x10\xc6\x9a\x0f\x8c\x4e\x85\x3a\xb3\xf3\xe8\x12\x9b\x05\x66\xef\x4b\xbb\xe8\x0b\x8c\x02\xc8\x92\x8a\x4d\xe5\x6c\x0d\x11\x9a\x45\xbb\xf5\xaf\x18\x08\xd4\x88\x85\x2d\x8a\x45\xbe\xb0\xd6\x83\x24\x8a\x4d\x65\xde\x15\x26\xb3\xd1\xd2\xff\xc1\xf2\x22\x15\xb6\x08\x46\x8c\xbc\x3b\xd3\x95\x14\xb3\x97\xfc\x0d\xb0\xf1\x13\xdb\xe6\xfc\xe4\x65\x2e\x82\xff\x89\x5b\x2b\x43\x87\xe0\x41\xd7\xe4\xe7\xbd\xe4\x69\x47\x69\x66\x5e\x81"}, +{{0xf5,0xe5,0x76,0x7c,0xf1,0x53,0x31,0x95,0x17,0x63,0x0f,0x22,0x68,0x76,0xb8,0x6c,0x81,0x60,0xcc,0x58,0x3b,0xc0,0x13,0x74,0x4c,0x6b,0xf2,0x55,0xf5,0xcc,0x0e,0xe5,},{0x27,0x81,0x17,0xfc,0x14,0x4c,0x72,0x34,0x0f,0x67,0xd0,0xf2,0x31,0x6e,0x83,0x86,0xce,0xff,0xbf,0x2b,0x24,0x28,0xc9,0xc5,0x1f,0xef,0x7c,0x59,0x7f,0x1d,0x42,0x6e,},{0x0a,0xab,0x4c,0x90,0x05,0x01,0xb3,0xe2,0x4d,0x7c,0xdf,0x46,0x63,0x32,0x6a,0x3a,0x87,0xdf,0x5e,0x48,0x43,0xb2,0xcb,0xdb,0x67,0xcb,0xf6,0xe4,0x60,0xfe,0xc3,0x50,0xaa,0x53,0x71,0xb1,0x50,0x8f,0x9f,0x45,0x28,0xec,0xea,0x23,0xc4,0x36,0xd9,0x4b,0x5e,0x8f,0xcd,0x4f,0x68,0x1e,0x30,0xa6,0xac,0x00,0xa9,0x70,0x4a,0x18,0x8a,0x03,},"\x08\xb8\xb2\xb7\x33\x42\x42\x43\x76\x0f\xe4\x26\xa4\xb5\x49\x08\x63\x21\x10\xa6\x6c\x2f\x65\x91\xea\xbd\x33\x45\xe3\xe4\xeb\x98\xfa\x6e\x26\x4b\xf0\x9e\xfe\x12\xee\x50\xf8\xf5\x4e\x9f\x77\xb1\xe3\x55\xf6\xc5\x05\x44\xe2\x3f\xb1\x43\x3d\xdf\x73\xbe\x84\xd8\x79\xde\x7c\x00\x46\xdc\x49\x96\xd9\xe7\x73\xf4\xbc\x9e\xfe\x57\x38\x82\x9a\xdb\x26\xc8\x1b\x37\xc9\x3a\x1b\x27\x0b\x20\x32\x9d\x65\x86\x75\xfc\x6e\xa5\x34\xe0\x81\x0a\x44\x32\x82\x6b\xf5\x8c\x94\x1e\xfb\x65\xd5\x7a\x33\x8b\xbd\x2e\x26\x64\x0f\x89\xff\xbc\x1a\x85\x8e\xfc\xb8\x55\x0e\xe3\xa5\xe1\x99\x8b\xd1\x77\xe9\x3a\x73\x63\xc3\x44\xfe\x6b\x19\x9e\xe5\xd0\x2e\x82\xd5\x22\xc4\xfe\xba\x15\x45\x2f\x80\x28\x8a\x82\x1a\x57\x91\x16\xec\x6d\xad\x2b\x3b\x31\x0d\xa9\x03\x40\x1a\xa6\x21\x00\xab\x5d\x1a\x36\x55\x3e\x06\x20\x3b\x33\x89\x0c\xc9\xb8\x32\xf7\x9e\xf8\x05\x60\xcc\xb9\xa3\x9c\xe7\x67\x96\x7e\xd6\x28\xc6\xad\x57\x3c\xb1\x16\xdb\xef\xef\xd7\x54\x99\xda\x96\xbd\x68\xa8\xa9\x7b\x92\x8a\x8b\xbc\x10\x3b\x66\x21\xfc\xde\x2b\xec\xa1\x23\x1d\x20\x6b\xe6\xcd\x9e\xc7\xaf\xf6\xf6\xc9\x4f\xcd\x72\x04\xed\x34\x55\xc6\x8c\x83\xf4\xa4\x1d\xa4\xaf\x2b\x74\xef\x5c\x53\xf1\xd8\xac\x70\xbd\xcb\x7e\xd1\x85\xce\x81\xbd\x84\x35\x9d\x44\x25\x4d\x95\x62\x9e\x98\x55\xa9\x4a\x7c\x19\x58\xd1\xf8\xad\xa5\xd0\x53\x2e\xd8\xa5\xaa\x3f\xb2\xd1\x7b\xa7\x0e\xb6\x24\x8e\x59\x4e\x1a\x22\x97\xac\xbb\xb3\x9d\x50\x2f\x1a\x8c\x6e\xb6\xf1\xce\x22\xb3\xde\x1a\x1f\x40\xcc\x24\x55\x41\x19\xa8\x31\xa9\xaa\xd6\x07\x9c\xad\x88\x42\x5d\xe6\xbd\xe1\xa9\x18\x7e\xbb\x60\x92\xcf\x67\xbf\x2b\x13\xfd\x65\xf2\x70\x88\xd7\x8b\x7e\x88\x3c\x87\x59\xd2\xc4\xf5\xc6\x5a\xdb\x75\x53\x87\x8a\xd5\x75\xf9\xfa\xd8\x78\xe8\x0a\x0c\x9b\xa6\x3b\xcb\xcc\x27\x32\xe6\x94\x85\xbb\xc9\xc9\x0b\xfb\xd6\x24\x81\xd9\x08\x9b\xec\xcf\x80\xcf\xe2\xdf\x16\xa2\xcf\x65\xbd\x92\xdd\x59\x7b\x07\x07\xe0\x91\x7a\xf4\x8b\xbb\x75\xfe\xd4\x13\xd2\x38\xf5\x55\x5a\x7a\x56\x9d\x80\xc3\x41\x4a\x8d\x08\x59\xdc\x65\xa4\x61\x28\xba\xb2\x7a\xf8\x7a\x71\x31\x4f\x31\x8c\x78\x2b\x23\xeb\xfe\x80\x8b\x82\xb0\xce\x26\x40\x1d\x2e\x22\xf0\x4d\x83\xd1\x25\x5d\xc5\x1a\xdd\xd3\xb7\x5a\x2b\x1a\xe0\x78\x45\x04\xdf\x54\x3a\xf8\x96\x9b\xe3\xea\x70\x82\xff\x7f\xc9\x88\x8c\x14\x4d\xa2\xaf\x58\x42\x9e\xc9\x60\x31\xdb\xca\xd3\xda\xd9\xaf\x0d\xcb\xaa\xaf\x26\x8c\xb8\xfc\xff\xea\xd9\x4f\x3c\x7c\xa4\x95\xe0\x56\xa9\xb4\x7a\xcd\xb7\x51\xfb\x73\xe6\x66\xc6\xc6\x55\xad\xe8\x29\x72\x97\xd0\x7a\xd1\xba\x5e\x43\xf1\xbc\xa3\x23\x01\x65\x13\x39\xe2\x29\x04\xcc\x8c\x42\xf5\x8c\x30\xc0\x4a\xaf\xdb\x03\x8d\xda\x08\x47\xdd\x98\x8d\xcd\xa6\xf3\xbf\xd1\x5c\x4b\x4c\x45\x25\x00\x4a\xa0\x6e\xef\xf8\xca\x61\x78\x3a\xac\xec\x57\xfb\x3d\x1f\x92\xb0\xfe\x2f\xd1\xa8\x5f\x67\x24\x51\x7b\x65\xe6\x14\xad\x68\x08\xd6\xf6\xee\x34\xdf\xf7\x31\x0f\xdc\x82\xae\xbf\xd9\x04\xb0\x1e\x1d\xc5\x4b\x29\x27\x09\x4b\x2d\xb6\x8d\x6f\x90\x3b\x68\x40\x1a\xde\xbf\x5a\x7e\x08\xd7\x8f\xf4\xef\x5d\x63\x65\x3a\x65\x04\x0c\xf9\xbf\xd4\xac\xa7\x98\x4a\x74\xd3\x71\x45\x98\x67\x80\xfc\x0b\x16\xac\x45\x16\x49\xde\x61\x88\xa7\xdb\xdf\x19\x1f\x64\xb5\xfc\x5e\x2a\xb4\x7b\x57\xf7\xf7\x27\x6c\xd4\x19\xc1\x7a\x3c\xa8\xe1\xb9\x39\xae\x49\xe4\x88\xac\xba\x6b\x96\x56\x10\xb5\x48\x01\x09\xc8\xb1\x7b\x80\xe1\xb7\xb7\x50\xdf\xc7\x59\x8d\x5d\x50\x11\xfd\x2d\xcc\x56\x00\xa3\x2e\xf5\xb5\x2a\x1e\xcc\x82\x0e\x30\x8a\xa3\x42\x72\x1a\xac\x09\x43\xbf\x66\x86\xb6\x4b\x25\x79\x37\x65\x04\xcc\xc4\x93\xd9\x7e\x6a\xed\x3f\xb0\xf9\xcd\x71\xa4\x3d\xd4\x97\xf0\x1f\x17\xc0\xe2\xcb\x37\x97\xaa\x2a\x2f\x25\x66\x56\x16\x8e\x6c\x49\x6a\xfc\x5f\xb9\x32\x46\xf6\xb1\x11\x63\x98\xa3\x46\xf1\xa6\x41\xf3\xb0\x41\xe9\x89\xf7\x91\x4f\x90\xcc\x2c\x7f\xff\x35\x78\x76\xe5\x06\xb5\x0d\x33\x4b\xa7\x7c\x22\x5b\xc3\x07\xba\x53\x71\x52\xf3\xf1\x61\x0e\x4e\xaf\xe5\x95\xf6\xd9\xd9\x0d\x11\xfa\xa9\x33\xa1\x5e\xf1\x36\x95\x46\x86\x8a\x7f\x3a\x45\xa9\x67\x68\xd4\x0f\xd9\xd0\x34\x12\xc0\x91\xc6\x31\x5c\xf4\xfd\xe7\xcb\x68\x60\x69\x37\x38\x0d\xb2\xea\xaa\x70\x7b\x4c\x41\x85\xc3\x2e\xdd\xcd\xd3\x06\x70\x5e\x4d\xc1\xff\xc8\x72\xee\xee\x47\x5a\x64\xdf\xac\x86\xab\xa4\x1c\x06\x18\x98\x3f\x87\x41\xc5\xef\x68\xd3\xa1\x01\xe8\xa3\xb8\xca\xc6\x0c\x90\x5c\x15\xfc\x91\x08\x40\xb9\x4c\x00\xa0\xb9\xd0"}, diff --git a/src/wraith/src/ext/ed25519/donna/test-internals.c b/src/wraith/src/ext/ed25519/donna/test-internals.c new file mode 100644 index 000000000..fe9db9d66 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/test-internals.c @@ -0,0 +1,190 @@ +/* Tor: Removed, file is inclued in ed25519.c instead. */ +/* #include */ +/* #include "ed25519-donna.h" */ + +static int +test_adds(void) { +#if defined(HAVE_UINT128) && !defined(ED25519_SSE2) + /* largest result for each limb from a mult or square: all elements except r1 reduced, r1 overflowed as far as possible */ + static const bignum25519 max_bignum = { + 0x7ffffffffffff,0x8000000001230,0x7ffffffffffff,0x7ffffffffffff,0x7ffffffffffff + }; + +#if 0 + /* what max_bignum should fully reduce to */ + static const unsigned char max_bignum_raw[32] = { + 0x12,0x00,0x00,0x00,0x00,0x00,0x88,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + }; +#endif + + /* (max_bignum + max_bignum)^2 */ + static const unsigned char max_bignum2_squared_raw[32] = { + 0x10,0x05,0x00,0x00,0x00,0x00,0x80,0xdc,0x51,0x00,0x00,0x00,0x00,0x61,0xed,0x4a, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + }; + + /* ((max_bignum + max_bignum) + max_bignum)^2 */ + static const unsigned char max_bignum3_squared_raw[32] = { + 0x64,0x0b,0x00,0x00,0x00,0x00,0x20,0x30,0xb8,0x00,0x00,0x00,0x40,0x1a,0x96,0xe8, + 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + }; +#else + /* largest result for each limb from a mult or square: all elements except r1 reduced, r1 overflowed as far as possible */ + static const bignum25519 ALIGN(16) max_bignum = { + 0x3ffffff,0x2000300,0x3ffffff,0x1ffffff,0x3ffffff, + 0x1ffffff,0x3ffffff,0x1ffffff,0x3ffffff,0x1ffffff + }; + + /* what max_bignum should fully reduce to */ + static const unsigned char max_bignum2_squared_raw[32] = { + 0x10,0x05,0x00,0x40,0xc2,0x06,0x40,0x80,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + }; + + /* (max_bignum * max_bignum) */ + static const unsigned char max_bignum3_squared_raw[32] = { + 0x64,0x0b,0x00,0x10,0x35,0x0f,0x90,0x60,0x13,0x05,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + }; +#endif + unsigned char result[32]; + /* static const bignum25519 ALIGN(16) zero = {0}; */ + bignum25519 ALIGN(16) a, b /* , c */; + /* size_t i; */ + + /* a = (max_bignum + max_bignum) */ + curve25519_add(a, max_bignum, max_bignum); + + /* b = ((max_bignum + max_bignum) * (max_bignum + max_bignum)) */ + curve25519_mul(b, a, a); + curve25519_contract(result, b); + if (memcmp(result, max_bignum2_squared_raw, 32) != 0) + return -1; + curve25519_square(b, a); + curve25519_contract(result, b); + if (memcmp(result, max_bignum2_squared_raw, 32) != 0) + return -1; + + /* b = (max_bignum + max_bignum + max_bignum) */ + curve25519_add_after_basic(b, a, max_bignum); + + /* a = ((max_bignum + max_bignum + max_bignum) * (max_bignum + max_bignum + max_bignum)) */ + curve25519_mul(a, b, b); + curve25519_contract(result, a); + if (memcmp(result, max_bignum3_squared_raw, 32) != 0) + return -1; + curve25519_square(a, b); + curve25519_contract(result, a); + if (memcmp(result, max_bignum3_squared_raw, 32) != 0) + return -1; + + return 0; +} + +static int +test_subs(void) { +#if defined(HAVE_UINT128) && !defined(ED25519_SSE2) + /* largest result for each limb from a mult or square: all elements except r1 reduced, r1 overflowed as far as possible */ + static const bignum25519 max_bignum = { + 0x7ffffffffffff,0x8000000001230,0x7ffffffffffff,0x7ffffffffffff,0x7ffffffffffff + }; + + /* what max_bignum should fully reduce to */ + static const unsigned char max_bignum_raw[32] = { + 0x12,0x00,0x00,0x00,0x00,0x00,0x88,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + }; + + /* (max_bignum * max_bignum) */ + static const unsigned char max_bignum_squared_raw[32] = { + 0x44,0x01,0x00,0x00,0x00,0x00,0x20,0x77,0x14,0x00,0x00,0x00,0x40,0x58,0xbb,0x52, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + }; +#else + /* largest result for each limb from a mult or square: all elements except r1 reduced, r1 overflowed as far as possible */ + static const bignum25519 ALIGN(16) max_bignum = { + 0x3ffffff,0x2000300,0x3ffffff,0x1ffffff,0x3ffffff, + 0x1ffffff,0x3ffffff,0x1ffffff,0x3ffffff,0x1ffffff + }; + + /* what max_bignum should fully reduce to */ + static const unsigned char max_bignum_raw[32] = { + 0x12,0x00,0x00,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + }; + + /* (max_bignum * max_bignum) */ + static const unsigned char max_bignum_squared_raw[32] = { + 0x44,0x01,0x00,0x90,0xb0,0x01,0x10,0x60,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + }; +#endif + unsigned char result[32]; + static const bignum25519 ALIGN(16) zero = {0}; + bignum25519 ALIGN(16) a, b /* , c */; + /* size_t i; */ + + /* a = max_bignum - 0, which expands to 2p + max_bignum - 0 */ + curve25519_sub(a, max_bignum, zero); + curve25519_contract(result, a); + if (memcmp(result, max_bignum_raw, 32) != 0) + return -1; + + /* b = (max_bignum * max_bignum) */ + curve25519_mul(b, a, a); + curve25519_contract(result, b); + if (memcmp(result, max_bignum_squared_raw, 32) != 0) + return -1; + curve25519_square(b, a); + curve25519_contract(result, b); + if (memcmp(result, max_bignum_squared_raw, 32) != 0) + return -1; + + /* b = ((a - 0) - 0) */ + curve25519_sub_after_basic(b, a, zero); + curve25519_contract(result, b); + if (memcmp(result, max_bignum_raw, 32) != 0) + return -1; + + /* a = (max_bignum * max_bignum) */ + curve25519_mul(a, b, b); + curve25519_contract(result, a); + if (memcmp(result, max_bignum_squared_raw, 32) != 0) + return -1; + curve25519_square(a, b); + curve25519_contract(result, a); + if (memcmp(result, max_bignum_squared_raw, 32) != 0) + return -1; + + + return 0; +} + +/* Tor: Removed, tests are invoked as a function instead. */ +#if 0 +int +main() { + int ret = 0; + int single; + single = test_adds(); + if (single) printf("test_adds: FAILED\n"); + ret |= single; + single = test_subs(); + if (single) printf("test_subs: FAILED\n"); + ret |= single; + if (!ret) printf("success\n"); + return ret; +} +#endif + +/* Tor: Added for initialization self-testing. */ +int +ed25519_donna_selftest(void) +{ + int ret = 0; + ret |= test_adds(); + ret |= test_subs(); + return (ret == 0) ? 0 : -1; +} + diff --git a/src/wraith/src/ext/ed25519/donna/test-ticks.h b/src/wraith/src/ext/ed25519/donna/test-ticks.h new file mode 100644 index 000000000..0103e03dd --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/test-ticks.h @@ -0,0 +1,50 @@ +#include "ed25519-donna-portable-identify.h" + +/* ticks - not tested on anything other than x86 */ +static uint64_t +get_ticks(void) { +#if defined(CPU_X86) || defined(CPU_X86_64) + #if defined(COMPILER_INTEL) + return _rdtsc(); + #elif defined(COMPILER_MSVC) + return __rdtsc(); + #elif defined(COMPILER_GCC) + uint32_t lo, hi; + __asm__ __volatile__("rdtsc" : "=a" (lo), "=d" (hi)); + return ((uint64_t)lo | ((uint64_t)hi << 32)); + #else + need rdtsc for this compiler + #endif +#elif defined(OS_SOLARIS) + return (uint64_t)gethrtime(); +#elif defined(CPU_SPARC) && !defined(OS_OPENBSD) + uint64_t t; + __asm__ __volatile__("rd %%tick, %0" : "=r" (t)); + return t; +#elif defined(CPU_PPC) + uint32_t lo = 0, hi = 0; + __asm__ __volatile__("mftbu %0; mftb %1" : "=r" (hi), "=r" (lo)); + return ((uint64_t)lo | ((uint64_t)hi << 32)); +#elif defined(CPU_IA64) + uint64_t t; + __asm__ __volatile__("mov %0=ar.itc" : "=r" (t)); + return t; +#elif defined(OS_NIX) + timeval t2; + gettimeofday(&t2, NULL); + t = ((uint64_t)t2.tv_usec << 32) | (uint64_t)t2.tv_sec; + return t; +#else + need ticks for this platform +#endif +} + +#define timeit(x,minvar) \ + ticks = get_ticks(); \ + x; \ + ticks = get_ticks() - ticks; \ + if (ticks < minvar) \ + minvar = ticks; + +#define maxticks 0xffffffffffffffffull + diff --git a/src/wraith/src/ext/ed25519/donna/test.c b/src/wraith/src/ext/ed25519/donna/test.c new file mode 100644 index 000000000..615449250 --- /dev/null +++ b/src/wraith/src/ext/ed25519/donna/test.c @@ -0,0 +1,260 @@ +/* + Validate ed25519 implementation against the official test vectors from + http://ed25519.cr.yp.to/software.html +*/ + +#include +#include +#include "ed25519.h" + +#include "test-ticks.h" + +static void +edassert(int check, int round, const char *failreason) { + if (check) + return; + printf("round %d, %s\n", round, failreason); + exit(1); +} + +static void +edassert_die(const unsigned char *a, const unsigned char *b, size_t len, int round, const char *failreason) { + size_t i; + if (round > 0) + printf("round %d, %s\n", round, failreason); + else + printf("%s\n", failreason); + printf("want: "); for (i = 0; i < len; i++) printf("%02x,", a[i]); printf("\n"); + printf("got : "); for (i = 0; i < len; i++) printf("%02x,", b[i]); printf("\n"); + printf("diff: "); for (i = 0; i < len; i++) if (a[i] ^ b[i]) printf("%02x,", a[i] ^ b[i]); else printf(" ,"); printf("\n\n"); + exit(1); +} + +static void +edassert_equal(const unsigned char *a, const unsigned char *b, size_t len, const char *failreason) { + if (memcmp(a, b, len) == 0) + return; + edassert_die(a, b, len, -1, failreason); +} + +static void +edassert_equal_round(const unsigned char *a, const unsigned char *b, size_t len, int round, const char *failreason) { + if (memcmp(a, b, len) == 0) + return; + edassert_die(a, b, len, round, failreason); +} + + +/* test data */ +typedef struct test_data_t { + unsigned char sk[32], pk[32], sig[64]; + const char *m; +} test_data; + + +test_data dataset[] = { +#include "regression.h" +}; + +/* result of the curve25519 scalarmult ((|255| * basepoint) * basepoint)... 1024 times */ +const curved25519_key curved25519_expected = { + 0xac,0xce,0x24,0xb1,0xd4,0xa2,0x36,0x21, + 0x15,0xe2,0x3e,0x84,0x3c,0x23,0x2b,0x5f, + 0x95,0x6c,0xc0,0x7b,0x95,0x82,0xd7,0x93, + 0xd5,0x19,0xb6,0xf1,0xfb,0x96,0xd6,0x04 +}; + + +/* from ed25519-donna-batchverify.h */ +extern unsigned char batch_point_buffer[3][32]; + +/* y coordinate of the final point from 'amd64-51-30k' with the same random generator */ +static const unsigned char batch_verify_y[32] = { + 0x51,0xe7,0x68,0xe0,0xf7,0xa1,0x88,0x45, + 0xde,0xa1,0xcb,0xd9,0x37,0xd4,0x78,0x53, + 0x1b,0x95,0xdb,0xbe,0x66,0x59,0x29,0x3b, + 0x94,0x51,0x2f,0xbc,0x0d,0x66,0xba,0x3f +}; + +/* +static const unsigned char batch_verify_y[32] = { + 0x5c,0x63,0x96,0x26,0xca,0xfe,0xfd,0xc4, + 0x2d,0x11,0xa8,0xe4,0xc4,0x46,0x42,0x97, + 0x97,0x92,0xbe,0xe0,0x3c,0xef,0x96,0x01, + 0x50,0xa1,0xcc,0x8f,0x50,0x85,0x76,0x7d +}; + +Introducing the 128 bit r scalars to the heap _before_ the largest scalar +fits in to 128 bits alters the heap shape and produces a different, +yet still neutral/valid y/z value. + +This was the value of introducing the r scalars when the largest scalar fit +in to 135-256 bits. You can produce it with amd64-64-24k / amd64-51-32k +with the random sequence used in the first pass by changing + + unsigned long long hlen=((npoints+1)/2)|1; + +to + + unsigned long long hlen=npoints; + +in ge25519_multi_scalarmult.c + +ed25519-donna-batchverify.h has been modified to match the +default amd64-64-24k / amd64-51-32k behaviour +*/ + + + +/* batch test */ +#define test_batch_count 64 +#define test_batch_rounds 96 + +typedef enum batch_test_t { + batch_no_errors = 0, + batch_wrong_message = 1, + batch_wrong_pk = 2, + batch_wrong_sig = 3 +} batch_test; + +static int +test_batch_instance(batch_test type, uint64_t *ticks) { + ed25519_secret_key sks[test_batch_count]; + ed25519_public_key pks[test_batch_count]; + ed25519_signature sigs[test_batch_count]; + unsigned char messages[test_batch_count][128]; + size_t message_lengths[test_batch_count]; + const unsigned char *message_pointers[test_batch_count]; + const unsigned char *pk_pointers[test_batch_count]; + const unsigned char *sig_pointers[test_batch_count]; + int valid[test_batch_count], ret, validret; + size_t i; + uint64_t t; + + /* generate keys */ + for (i = 0; i < test_batch_count; i++) { + ed25519_randombytes_unsafe(sks[i], sizeof(sks[i])); + ed25519_publickey(sks[i], pks[i]); + pk_pointers[i] = pks[i]; + } + + /* generate messages */ + ed25519_randombytes_unsafe(messages, sizeof(messages)); + for (i = 0; i < test_batch_count; i++) { + message_pointers[i] = messages[i]; + message_lengths[i] = (i & 127) + 1; + } + + /* sign messages */ + for (i = 0; i < test_batch_count; i++) { + ed25519_sign(message_pointers[i], message_lengths[i], sks[i], pks[i], sigs[i]); + sig_pointers[i] = sigs[i]; + } + + validret = 0; + if (type == batch_wrong_message) { + message_pointers[0] = message_pointers[1]; + validret = 1|2; + } else if (type == batch_wrong_pk) { + pk_pointers[0] = pk_pointers[1]; + validret = 1|2; + } else if (type == batch_wrong_sig) { + sig_pointers[0] = sig_pointers[1]; + validret = 1|2; + } + + /* batch verify */ + t = get_ticks(); + ret = ed25519_sign_open_batch(message_pointers, message_lengths, pk_pointers, sig_pointers, test_batch_count, valid); + *ticks = get_ticks() - t; + edassert_equal((unsigned char *)&validret, (unsigned char *)&ret, sizeof(int), "batch return code"); + for (i = 0; i < test_batch_count; i++) { + validret = ((type == batch_no_errors) || (i != 0)) ? 1 : 0; + edassert_equal((unsigned char *)&validret, (unsigned char *)&valid[i], sizeof(int), "individual batch return code"); + } + return ret; +} + +static void +test_batch(void) { + uint64_t dummy_ticks, ticks[test_batch_rounds], best = maxticks, sum; + size_t i, count; + + /* check the first pass for the expected result */ + test_batch_instance(batch_no_errors, &dummy_ticks); + edassert_equal(batch_verify_y, batch_point_buffer[1], 32, "failed to generate expected result"); + + /* make sure ge25519_multi_scalarmult_vartime throws an error on the entire batch with wrong data */ + for (i = 0; i < 4; i++) { + test_batch_instance(batch_wrong_message, &dummy_ticks); + test_batch_instance(batch_wrong_pk, &dummy_ticks); + test_batch_instance(batch_wrong_sig, &dummy_ticks); + } + + /* speed test */ + for (i = 0; i < test_batch_rounds; i++) { + test_batch_instance(batch_no_errors, &ticks[i]); + if (ticks[i] < best) + best = ticks[i]; + } + + /* take anything within 1% of the best time */ + for (i = 0, sum = 0, count = 0; i < test_batch_rounds; i++) { + if (ticks[i] < (best * 1.01)) { + sum += ticks[i]; + count++; + } + } + printf("%.0f ticks/verification\n", (double)sum / (count * test_batch_count)); +} + +static void +test_main(void) { + int i, res; + ed25519_public_key pk; + ed25519_signature sig; + unsigned char forge[1024] = {'x'}; + curved25519_key csk[2] = {{255}}; + uint64_t ticks, pkticks = maxticks, signticks = maxticks, openticks = maxticks, curvedticks = maxticks; + + for (i = 0; i < 1024; i++) { + ed25519_publickey(dataset[i].sk, pk); + edassert_equal_round(dataset[i].pk, pk, sizeof(pk), i, "public key didn't match"); + ed25519_sign((unsigned char *)dataset[i].m, i, dataset[i].sk, pk, sig); + edassert_equal_round(dataset[i].sig, sig, sizeof(sig), i, "signature didn't match"); + edassert(!ed25519_sign_open((unsigned char *)dataset[i].m, i, pk, sig), i, "failed to open message"); + + memcpy(forge, dataset[i].m, i); + if (i) + forge[i - 1] += 1; + + edassert(ed25519_sign_open(forge, (i) ? i : 1, pk, sig), i, "opened forged message"); + } + + for (i = 0; i < 1024; i++) + curved25519_scalarmult_basepoint(csk[(i & 1) ^ 1], csk[i & 1]); + edassert_equal(curved25519_expected, csk[0], sizeof(curved25519_key), "curve25519 failed to generate correct value"); + + for (i = 0; i < 2048; i++) { + timeit(ed25519_publickey(dataset[0].sk, pk), pkticks) + edassert_equal_round(dataset[0].pk, pk, sizeof(pk), i, "public key didn't match"); + timeit(ed25519_sign((unsigned char *)dataset[0].m, 0, dataset[0].sk, pk, sig), signticks) + edassert_equal_round(dataset[0].sig, sig, sizeof(sig), i, "signature didn't match"); + timeit(res = ed25519_sign_open((unsigned char *)dataset[0].m, 0, pk, sig), openticks) + edassert(!res, 0, "failed to open message"); + timeit(curved25519_scalarmult_basepoint(csk[1], csk[0]), curvedticks); + } + + printf("%.0f ticks/public key generation\n", (double)pkticks); + printf("%.0f ticks/signature\n", (double)signticks); + printf("%.0f ticks/signature verification\n", (double)openticks); + printf("%.0f ticks/curve25519 basepoint scalarmult\n", (double)curvedticks); +} + +int +main(void) { + test_main(); + test_batch(); + return 0; +} + diff --git a/src/wraith/src/ext/ed25519/ref10/README.tor b/src/wraith/src/ext/ed25519/ref10/README.tor new file mode 100644 index 000000000..38ed97ba0 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/README.tor @@ -0,0 +1,23 @@ + +We've made the following changes to the stock ed25519_ref10 from +supercop-20140622: + + * We added the necessary glue to provide integers of fixed bit + sizes, SHA512, and to compile without warnings everywhere we need + to build. + + * Secret keys are stored in expanded format. There are functions + to expand them from the 32-byte seed. + + * Signatures are made and processed detached from the messages that + they sign. (In other words, we support "make signature" and + "check signature", not "create signed message" and "check and + unpack signed message".) + + * There's an implementation of 'convert a curve25519 key to an + ed25519 key' so we can do cross-certification with curve25519 keys. + (keyconv.c) + + * There's an implementation of multiplicative key blinding so we + can use it for next-gen hidden srevice descriptors. (blinding.c) + diff --git a/src/wraith/src/ext/ed25519/ref10/api.h b/src/wraith/src/ext/ed25519/ref10/api.h new file mode 100644 index 000000000..d88dae0c3 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/api.h @@ -0,0 +1,4 @@ +#define CRYPTO_SECRETKEYBYTES 64 +#define CRYPTO_PUBLICKEYBYTES 32 +#define CRYPTO_BYTES 64 +#define CRYPTO_DETERMINISTIC 1 diff --git a/src/wraith/src/ext/ed25519/ref10/base.h b/src/wraith/src/ext/ed25519/ref10/base.h new file mode 100644 index 000000000..573bd8a05 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/base.h @@ -0,0 +1,1344 @@ +{ + { + { 25967493,-14356035,29566456,3660896,-12694345,4014787,27544626,-11754271,-6079156,2047605 }, + { -12545711,934262,-2722910,3049990,-727428,9406986,12720692,5043384,19500929,-15469378 }, + { -8738181,4489570,9688441,-14785194,10184609,-12363380,29287919,11864899,-24514362,-4438546 }, + }, + { + { -12815894,-12976347,-21581243,11784320,-25355658,-2750717,-11717903,-3814571,-358445,-10211303 }, + { -21703237,6903825,27185491,6451973,-29577724,-9554005,-15616551,11189268,-26829678,-5319081 }, + { 26966642,11152617,32442495,15396054,14353839,-12752335,-3128826,-9541118,-15472047,-4166697 }, + }, + { + { 15636291,-9688557,24204773,-7912398,616977,-16685262,27787600,-14772189,28944400,-1550024 }, + { 16568933,4717097,-11556148,-1102322,15682896,-11807043,16354577,-11775962,7689662,11199574 }, + { 30464156,-5976125,-11779434,-15670865,23220365,15915852,7512774,10017326,-17749093,-9920357 }, + }, + { + { -17036878,13921892,10945806,-6033431,27105052,-16084379,-28926210,15006023,3284568,-6276540 }, + { 23599295,-8306047,-11193664,-7687416,13236774,10506355,7464579,9656445,13059162,10374397 }, + { 7798556,16710257,3033922,2874086,28997861,2835604,32406664,-3839045,-641708,-101325 }, + }, + { + { 10861363,11473154,27284546,1981175,-30064349,12577861,32867885,14515107,-15438304,10819380 }, + { 4708026,6336745,20377586,9066809,-11272109,6594696,-25653668,12483688,-12668491,5581306 }, + { 19563160,16186464,-29386857,4097519,10237984,-4348115,28542350,13850243,-23678021,-15815942 }, + }, + { + { -15371964,-12862754,32573250,4720197,-26436522,5875511,-19188627,-15224819,-9818940,-12085777 }, + { -8549212,109983,15149363,2178705,22900618,4543417,3044240,-15689887,1762328,14866737 }, + { -18199695,-15951423,-10473290,1707278,-17185920,3916101,-28236412,3959421,27914454,4383652 }, + }, + { + { 5153746,9909285,1723747,-2777874,30523605,5516873,19480852,5230134,-23952439,-15175766 }, + { -30269007,-3463509,7665486,10083793,28475525,1649722,20654025,16520125,30598449,7715701 }, + { 28881845,14381568,9657904,3680757,-20181635,7843316,-31400660,1370708,29794553,-1409300 }, + }, + { + { 14499471,-2729599,-33191113,-4254652,28494862,14271267,30290735,10876454,-33154098,2381726 }, + { -7195431,-2655363,-14730155,462251,-27724326,3941372,-6236617,3696005,-32300832,15351955 }, + { 27431194,8222322,16448760,-3907995,-18707002,11938355,-32961401,-2970515,29551813,10109425 }, + }, +}, +{ + { + { -13657040,-13155431,-31283750,11777098,21447386,6519384,-2378284,-1627556,10092783,-4764171 }, + { 27939166,14210322,4677035,16277044,-22964462,-12398139,-32508754,12005538,-17810127,12803510 }, + { 17228999,-15661624,-1233527,300140,-1224870,-11714777,30364213,-9038194,18016357,4397660 }, + }, + { + { -10958843,-7690207,4776341,-14954238,27850028,-15602212,-26619106,14544525,-17477504,982639 }, + { 29253598,15796703,-2863982,-9908884,10057023,3163536,7332899,-4120128,-21047696,9934963 }, + { 5793303,16271923,-24131614,-10116404,29188560,1206517,-14747930,4559895,-30123922,-10897950 }, + }, + { + { -27643952,-11493006,16282657,-11036493,28414021,-15012264,24191034,4541697,-13338309,5500568 }, + { 12650548,-1497113,9052871,11355358,-17680037,-8400164,-17430592,12264343,10874051,13524335 }, + { 25556948,-3045990,714651,2510400,23394682,-10415330,33119038,5080568,-22528059,5376628 }, + }, + { + { -26088264,-4011052,-17013699,-3537628,-6726793,1920897,-22321305,-9447443,4535768,1569007 }, + { -2255422,14606630,-21692440,-8039818,28430649,8775819,-30494562,3044290,31848280,12543772 }, + { -22028579,2943893,-31857513,6777306,13784462,-4292203,-27377195,-2062731,7718482,14474653 }, + }, + { + { 2385315,2454213,-22631320,46603,-4437935,-15680415,656965,-7236665,24316168,-5253567 }, + { 13741529,10911568,-33233417,-8603737,-20177830,-1033297,33040651,-13424532,-20729456,8321686 }, + { 21060490,-2212744,15712757,-4336099,1639040,10656336,23845965,-11874838,-9984458,608372 }, + }, + { + { -13672732,-15087586,-10889693,-7557059,-6036909,11305547,1123968,-6780577,27229399,23887 }, + { -23244140,-294205,-11744728,14712571,-29465699,-2029617,12797024,-6440308,-1633405,16678954 }, + { -29500620,4770662,-16054387,14001338,7830047,9564805,-1508144,-4795045,-17169265,4904953 }, + }, + { + { 24059557,14617003,19037157,-15039908,19766093,-14906429,5169211,16191880,2128236,-4326833 }, + { -16981152,4124966,-8540610,-10653797,30336522,-14105247,-29806336,916033,-6882542,-2986532 }, + { -22630907,12419372,-7134229,-7473371,-16478904,16739175,285431,2763829,15736322,4143876 }, + }, + { + { 2379352,11839345,-4110402,-5988665,11274298,794957,212801,-14594663,23527084,-16458268 }, + { 33431127,-11130478,-17838966,-15626900,8909499,8376530,-32625340,4087881,-15188911,-14416214 }, + { 1767683,7197987,-13205226,-2022635,-13091350,448826,5799055,4357868,-4774191,-16323038 }, + }, +}, +{ + { + { 6721966,13833823,-23523388,-1551314,26354293,-11863321,23365147,-3949732,7390890,2759800 }, + { 4409041,2052381,23373853,10530217,7676779,-12885954,21302353,-4264057,1244380,-12919645 }, + { -4421239,7169619,4982368,-2957590,30256825,-2777540,14086413,9208236,15886429,16489664 }, + }, + { + { 1996075,10375649,14346367,13311202,-6874135,-16438411,-13693198,398369,-30606455,-712933 }, + { -25307465,9795880,-2777414,14878809,-33531835,14780363,13348553,12076947,-30836462,5113182 }, + { -17770784,11797796,31950843,13929123,-25888302,12288344,-30341101,-7336386,13847711,5387222 }, + }, + { + { -18582163,-3416217,17824843,-2340966,22744343,-10442611,8763061,3617786,-19600662,10370991 }, + { 20246567,-14369378,22358229,-543712,18507283,-10413996,14554437,-8746092,32232924,16763880 }, + { 9648505,10094563,26416693,14745928,-30374318,-6472621,11094161,15689506,3140038,-16510092 }, + }, + { + { -16160072,5472695,31895588,4744994,8823515,10365685,-27224800,9448613,-28774454,366295 }, + { 19153450,11523972,-11096490,-6503142,-24647631,5420647,28344573,8041113,719605,11671788 }, + { 8678025,2694440,-6808014,2517372,4964326,11152271,-15432916,-15266516,27000813,-10195553 }, + }, + { + { -15157904,7134312,8639287,-2814877,-7235688,10421742,564065,5336097,6750977,-14521026 }, + { 11836410,-3979488,26297894,16080799,23455045,15735944,1695823,-8819122,8169720,16220347 }, + { -18115838,8653647,17578566,-6092619,-8025777,-16012763,-11144307,-2627664,-5990708,-14166033 }, + }, + { + { -23308498,-10968312,15213228,-10081214,-30853605,-11050004,27884329,2847284,2655861,1738395 }, + { -27537433,-14253021,-25336301,-8002780,-9370762,8129821,21651608,-3239336,-19087449,-11005278 }, + { 1533110,3437855,23735889,459276,29970501,11335377,26030092,5821408,10478196,8544890 }, + }, + { + { 32173121,-16129311,24896207,3921497,22579056,-3410854,19270449,12217473,17789017,-3395995 }, + { -30552961,-2228401,-15578829,-10147201,13243889,517024,15479401,-3853233,30460520,1052596 }, + { -11614875,13323618,32618793,8175907,-15230173,12596687,27491595,-4612359,3179268,-9478891 }, + }, + { + { 31947069,-14366651,-4640583,-15339921,-15125977,-6039709,-14756777,-16411740,19072640,-9511060 }, + { 11685058,11822410,3158003,-13952594,33402194,-4165066,5977896,-5215017,473099,5040608 }, + { -20290863,8198642,-27410132,11602123,1290375,-2799760,28326862,1721092,-19558642,-3131606 }, + }, +}, +{ + { + { 7881532,10687937,7578723,7738378,-18951012,-2553952,21820786,8076149,-27868496,11538389 }, + { -19935666,3899861,18283497,-6801568,-15728660,-11249211,8754525,7446702,-5676054,5797016 }, + { -11295600,-3793569,-15782110,-7964573,12708869,-8456199,2014099,-9050574,-2369172,-5877341 }, + }, + { + { -22472376,-11568741,-27682020,1146375,18956691,16640559,1192730,-3714199,15123619,10811505 }, + { 14352098,-3419715,-18942044,10822655,32750596,4699007,-70363,15776356,-28886779,-11974553 }, + { -28241164,-8072475,-4978962,-5315317,29416931,1847569,-20654173,-16484855,4714547,-9600655 }, + }, + { + { 15200332,8368572,19679101,15970074,-31872674,1959451,24611599,-4543832,-11745876,12340220 }, + { 12876937,-10480056,33134381,6590940,-6307776,14872440,9613953,8241152,15370987,9608631 }, + { -4143277,-12014408,8446281,-391603,4407738,13629032,-7724868,15866074,-28210621,-8814099 }, + }, + { + { 26660628,-15677655,8393734,358047,-7401291,992988,-23904233,858697,20571223,8420556 }, + { 14620715,13067227,-15447274,8264467,14106269,15080814,33531827,12516406,-21574435,-12476749 }, + { 236881,10476226,57258,-14677024,6472998,2466984,17258519,7256740,8791136,15069930 }, + }, + { + { 1276410,-9371918,22949635,-16322807,-23493039,-5702186,14711875,4874229,-30663140,-2331391 }, + { 5855666,4990204,-13711848,7294284,-7804282,1924647,-1423175,-7912378,-33069337,9234253 }, + { 20590503,-9018988,31529744,-7352666,-2706834,10650548,31559055,-11609587,18979186,13396066 }, + }, + { + { 24474287,4968103,22267082,4407354,24063882,-8325180,-18816887,13594782,33514650,7021958 }, + { -11566906,-6565505,-21365085,15928892,-26158305,4315421,-25948728,-3916677,-21480480,12868082 }, + { -28635013,13504661,19988037,-2132761,21078225,6443208,-21446107,2244500,-12455797,-8089383 }, + }, + { + { -30595528,13793479,-5852820,319136,-25723172,-6263899,33086546,8957937,-15233648,5540521 }, + { -11630176,-11503902,-8119500,-7643073,2620056,1022908,-23710744,-1568984,-16128528,-14962807 }, + { 23152971,775386,27395463,14006635,-9701118,4649512,1689819,892185,-11513277,-15205948 }, + }, + { + { 9770129,9586738,26496094,4324120,1556511,-3550024,27453819,4763127,-19179614,5867134 }, + { -32765025,1927590,31726409,-4753295,23962434,-16019500,27846559,5931263,-29749703,-16108455 }, + { 27461885,-2977536,22380810,1815854,-23033753,-3031938,7283490,-15148073,-19526700,7734629 }, + }, +}, +{ + { + { -8010264,-9590817,-11120403,6196038,29344158,-13430885,7585295,-3176626,18549497,15302069 }, + { -32658337,-6171222,-7672793,-11051681,6258878,13504381,10458790,-6418461,-8872242,8424746 }, + { 24687205,8613276,-30667046,-3233545,1863892,-1830544,19206234,7134917,-11284482,-828919 }, + }, + { + { 11334899,-9218022,8025293,12707519,17523892,-10476071,10243738,-14685461,-5066034,16498837 }, + { 8911542,6887158,-9584260,-6958590,11145641,-9543680,17303925,-14124238,6536641,10543906 }, + { -28946384,15479763,-17466835,568876,-1497683,11223454,-2669190,-16625574,-27235709,8876771 }, + }, + { + { -25742899,-12566864,-15649966,-846607,-33026686,-796288,-33481822,15824474,-604426,-9039817 }, + { 10330056,70051,7957388,-9002667,9764902,15609756,27698697,-4890037,1657394,3084098 }, + { 10477963,-7470260,12119566,-13250805,29016247,-5365589,31280319,14396151,-30233575,15272409 }, + }, + { + { -12288309,3169463,28813183,16658753,25116432,-5630466,-25173957,-12636138,-25014757,1950504 }, + { -26180358,9489187,11053416,-14746161,-31053720,5825630,-8384306,-8767532,15341279,8373727 }, + { 28685821,7759505,-14378516,-12002860,-31971820,4079242,298136,-10232602,-2878207,15190420 }, + }, + { + { -32932876,13806336,-14337485,-15794431,-24004620,10940928,8669718,2742393,-26033313,-6875003 }, + { -1580388,-11729417,-25979658,-11445023,-17411874,-10912854,9291594,-16247779,-12154742,6048605 }, + { -30305315,14843444,1539301,11864366,20201677,1900163,13934231,5128323,11213262,9168384 }, + }, + { + { -26280513,11007847,19408960,-940758,-18592965,-4328580,-5088060,-11105150,20470157,-16398701 }, + { -23136053,9282192,14855179,-15390078,-7362815,-14408560,-22783952,14461608,14042978,5230683 }, + { 29969567,-2741594,-16711867,-8552442,9175486,-2468974,21556951,3506042,-5933891,-12449708 }, + }, + { + { -3144746,8744661,19704003,4581278,-20430686,6830683,-21284170,8971513,-28539189,15326563 }, + { -19464629,10110288,-17262528,-3503892,-23500387,1355669,-15523050,15300988,-20514118,9168260 }, + { -5353335,4488613,-23803248,16314347,7780487,-15638939,-28948358,9601605,33087103,-9011387 }, + }, + { + { -19443170,-15512900,-20797467,-12445323,-29824447,10229461,-27444329,-15000531,-5996870,15664672 }, + { 23294591,-16632613,-22650781,-8470978,27844204,11461195,13099750,-2460356,18151676,13417686 }, + { -24722913,-4176517,-31150679,5988919,-26858785,6685065,1661597,-12551441,15271676,-15452665 }, + }, +}, +{ + { + { 11433042,-13228665,8239631,-5279517,-1985436,-725718,-18698764,2167544,-6921301,-13440182 }, + { -31436171,15575146,30436815,12192228,-22463353,9395379,-9917708,-8638997,12215110,12028277 }, + { 14098400,6555944,23007258,5757252,-15427832,-12950502,30123440,4617780,-16900089,-655628 }, + }, + { + { -4026201,-15240835,11893168,13718664,-14809462,1847385,-15819999,10154009,23973261,-12684474 }, + { -26531820,-3695990,-1908898,2534301,-31870557,-16550355,18341390,-11419951,32013174,-10103539 }, + { -25479301,10876443,-11771086,-14625140,-12369567,1838104,21911214,6354752,4425632,-837822 }, + }, + { + { -10433389,-14612966,22229858,-3091047,-13191166,776729,-17415375,-12020462,4725005,14044970 }, + { 19268650,-7304421,1555349,8692754,-21474059,-9910664,6347390,-1411784,-19522291,-16109756 }, + { -24864089,12986008,-10898878,-5558584,-11312371,-148526,19541418,8180106,9282262,10282508 }, + }, + { + { -26205082,4428547,-8661196,-13194263,4098402,-14165257,15522535,8372215,5542595,-10702683 }, + { -10562541,14895633,26814552,-16673850,-17480754,-2489360,-2781891,6993761,-18093885,10114655 }, + { -20107055,-929418,31422704,10427861,-7110749,6150669,-29091755,-11529146,25953725,-106158 }, + }, + { + { -4234397,-8039292,-9119125,3046000,2101609,-12607294,19390020,6094296,-3315279,12831125 }, + { -15998678,7578152,5310217,14408357,-33548620,-224739,31575954,6326196,7381791,-2421839 }, + { -20902779,3296811,24736065,-16328389,18374254,7318640,6295303,8082724,-15362489,12339664 }, + }, + { + { 27724736,2291157,6088201,-14184798,1792727,5857634,13848414,15768922,25091167,14856294 }, + { -18866652,8331043,24373479,8541013,-701998,-9269457,12927300,-12695493,-22182473,-9012899 }, + { -11423429,-5421590,11632845,3405020,30536730,-11674039,-27260765,13866390,30146206,9142070 }, + }, + { + { 3924129,-15307516,-13817122,-10054960,12291820,-668366,-27702774,9326384,-8237858,4171294 }, + { -15921940,16037937,6713787,16606682,-21612135,2790944,26396185,3731949,345228,-5462949 }, + { -21327538,13448259,25284571,1143661,20614966,-8849387,2031539,-12391231,-16253183,-13582083 }, + }, + { + { 31016211,-16722429,26371392,-14451233,-5027349,14854137,17477601,3842657,28012650,-16405420 }, + { -5075835,9368966,-8562079,-4600902,-15249953,6970560,-9189873,16292057,-8867157,3507940 }, + { 29439664,3537914,23333589,6997794,-17555561,-11018068,-15209202,-15051267,-9164929,6580396 }, + }, +}, +{ + { + { -12185861,-7679788,16438269,10826160,-8696817,-6235611,17860444,-9273846,-2095802,9304567 }, + { 20714564,-4336911,29088195,7406487,11426967,-5095705,14792667,-14608617,5289421,-477127 }, + { -16665533,-10650790,-6160345,-13305760,9192020,-1802462,17271490,12349094,26939669,-3752294 }, + }, + { + { -12889898,9373458,31595848,16374215,21471720,13221525,-27283495,-12348559,-3698806,117887 }, + { 22263325,-6560050,3984570,-11174646,-15114008,-566785,28311253,5358056,-23319780,541964 }, + { 16259219,3261970,2309254,-15534474,-16885711,-4581916,24134070,-16705829,-13337066,-13552195 }, + }, + { + { 9378160,-13140186,-22845982,-12745264,28198281,-7244098,-2399684,-717351,690426,14876244 }, + { 24977353,-314384,-8223969,-13465086,28432343,-1176353,-13068804,-12297348,-22380984,6618999 }, + { -1538174,11685646,12944378,13682314,-24389511,-14413193,8044829,-13817328,32239829,-5652762 }, + }, + { + { -18603066,4762990,-926250,8885304,-28412480,-3187315,9781647,-10350059,32779359,5095274 }, + { -33008130,-5214506,-32264887,-3685216,9460461,-9327423,-24601656,14506724,21639561,-2630236 }, + { -16400943,-13112215,25239338,15531969,3987758,-4499318,-1289502,-6863535,17874574,558605 }, + }, + { + { -13600129,10240081,9171883,16131053,-20869254,9599700,33499487,5080151,2085892,5119761 }, + { -22205145,-2519528,-16381601,414691,-25019550,2170430,30634760,-8363614,-31999993,-5759884 }, + { -6845704,15791202,8550074,-1312654,29928809,-12092256,27534430,-7192145,-22351378,12961482 }, + }, + { + { -24492060,-9570771,10368194,11582341,-23397293,-2245287,16533930,8206996,-30194652,-5159638 }, + { -11121496,-3382234,2307366,6362031,-135455,8868177,-16835630,7031275,7589640,8945490 }, + { -32152748,8917967,6661220,-11677616,-1192060,-15793393,7251489,-11182180,24099109,-14456170 }, + }, + { + { 5019558,-7907470,4244127,-14714356,-26933272,6453165,-19118182,-13289025,-6231896,-10280736 }, + { 10853594,10721687,26480089,5861829,-22995819,1972175,-1866647,-10557898,-3363451,-6441124 }, + { -17002408,5906790,221599,-6563147,7828208,-13248918,24362661,-2008168,-13866408,7421392 }, + }, + { + { 8139927,-6546497,32257646,-5890546,30375719,1886181,-21175108,15441252,28826358,-4123029 }, + { 6267086,9695052,7709135,-16603597,-32869068,-1886135,14795160,-7840124,13746021,-1742048 }, + { 28584902,7787108,-6732942,-15050729,22846041,-7571236,-3181936,-363524,4771362,-8419958 }, + }, +}, +{ + { + { 24949256,6376279,-27466481,-8174608,-18646154,-9930606,33543569,-12141695,3569627,11342593 }, + { 26514989,4740088,27912651,3697550,19331575,-11472339,6809886,4608608,7325975,-14801071 }, + { -11618399,-14554430,-24321212,7655128,-1369274,5214312,-27400540,10258390,-17646694,-8186692 }, + }, + { + { 11431204,15823007,26570245,14329124,18029990,4796082,-31446179,15580664,9280358,-3973687 }, + { -160783,-10326257,-22855316,-4304997,-20861367,-13621002,-32810901,-11181622,-15545091,4387441 }, + { -20799378,12194512,3937617,-5805892,-27154820,9340370,-24513992,8548137,20617071,-7482001 }, + }, + { + { -938825,-3930586,-8714311,16124718,24603125,-6225393,-13775352,-11875822,24345683,10325460 }, + { -19855277,-1568885,-22202708,8714034,14007766,6928528,16318175,-1010689,4766743,3552007 }, + { -21751364,-16730916,1351763,-803421,-4009670,3950935,3217514,14481909,10988822,-3994762 }, + }, + { + { 15564307,-14311570,3101243,5684148,30446780,-8051356,12677127,-6505343,-8295852,13296005 }, + { -9442290,6624296,-30298964,-11913677,-4670981,-2057379,31521204,9614054,-30000824,12074674 }, + { 4771191,-135239,14290749,-13089852,27992298,14998318,-1413936,-1556716,29832613,-16391035 }, + }, + { + { 7064884,-7541174,-19161962,-5067537,-18891269,-2912736,25825242,5293297,-27122660,13101590 }, + { -2298563,2439670,-7466610,1719965,-27267541,-16328445,32512469,-5317593,-30356070,-4190957 }, + { -30006540,10162316,-33180176,3981723,-16482138,-13070044,14413974,9515896,19568978,9628812 }, + }, + { + { 33053803,199357,15894591,1583059,27380243,-4580435,-17838894,-6106839,-6291786,3437740 }, + { -18978877,3884493,19469877,12726490,15913552,13614290,-22961733,70104,7463304,4176122 }, + { -27124001,10659917,11482427,-16070381,12771467,-6635117,-32719404,-5322751,24216882,5944158 }, + }, + { + { 8894125,7450974,-2664149,-9765752,-28080517,-12389115,19345746,14680796,11632993,5847885 }, + { 26942781,-2315317,9129564,-4906607,26024105,11769399,-11518837,6367194,-9727230,4782140 }, + { 19916461,-4828410,-22910704,-11414391,25606324,-5972441,33253853,8220911,6358847,-1873857 }, + }, + { + { 801428,-2081702,16569428,11065167,29875704,96627,7908388,-4480480,-13538503,1387155 }, + { 19646058,5720633,-11416706,12814209,11607948,12749789,14147075,15156355,-21866831,11835260 }, + { 19299512,1155910,28703737,14890794,2925026,7269399,26121523,15467869,-26560550,5052483 }, + }, +}, +{ + { + { -3017432,10058206,1980837,3964243,22160966,12322533,-6431123,-12618185,12228557,-7003677 }, + { 32944382,14922211,-22844894,5188528,21913450,-8719943,4001465,13238564,-6114803,8653815 }, + { 22865569,-4652735,27603668,-12545395,14348958,8234005,24808405,5719875,28483275,2841751 }, + }, + { + { -16420968,-1113305,-327719,-12107856,21886282,-15552774,-1887966,-315658,19932058,-12739203 }, + { -11656086,10087521,-8864888,-5536143,-19278573,-3055912,3999228,13239134,-4777469,-13910208 }, + { 1382174,-11694719,17266790,9194690,-13324356,9720081,20403944,11284705,-14013818,3093230 }, + }, + { + { 16650921,-11037932,-1064178,1570629,-8329746,7352753,-302424,16271225,-24049421,-6691850 }, + { -21911077,-5927941,-4611316,-5560156,-31744103,-10785293,24123614,15193618,-21652117,-16739389 }, + { -9935934,-4289447,-25279823,4372842,2087473,10399484,31870908,14690798,17361620,11864968 }, + }, + { + { -11307610,6210372,13206574,5806320,-29017692,-13967200,-12331205,-7486601,-25578460,-16240689 }, + { 14668462,-12270235,26039039,15305210,25515617,4542480,10453892,6577524,9145645,-6443880 }, + { 5974874,3053895,-9433049,-10385191,-31865124,3225009,-7972642,3936128,-5652273,-3050304 }, + }, + { + { 30625386,-4729400,-25555961,-12792866,-20484575,7695099,17097188,-16303496,-27999779,1803632 }, + { -3553091,9865099,-5228566,4272701,-5673832,-16689700,14911344,12196514,-21405489,7047412 }, + { 20093277,9920966,-11138194,-5343857,13161587,12044805,-32856851,4124601,-32343828,-10257566 }, + }, + { + { -20788824,14084654,-13531713,7842147,19119038,-13822605,4752377,-8714640,-21679658,2288038 }, + { -26819236,-3283715,29965059,3039786,-14473765,2540457,29457502,14625692,-24819617,12570232 }, + { -1063558,-11551823,16920318,12494842,1278292,-5869109,-21159943,-3498680,-11974704,4724943 }, + }, + { + { 17960970,-11775534,-4140968,-9702530,-8876562,-1410617,-12907383,-8659932,-29576300,1903856 }, + { 23134274,-14279132,-10681997,-1611936,20684485,15770816,-12989750,3190296,26955097,14109738 }, + { 15308788,5320727,-30113809,-14318877,22902008,7767164,29425325,-11277562,31960942,11934971 }, + }, + { + { -27395711,8435796,4109644,12222639,-24627868,14818669,20638173,4875028,10491392,1379718 }, + { -13159415,9197841,3875503,-8936108,-1383712,-5879801,33518459,16176658,21432314,12180697 }, + { -11787308,11500838,13787581,-13832590,-22430679,10140205,1465425,12689540,-10301319,-13872883 }, + }, +}, +{ + { + { 5414091,-15386041,-21007664,9643570,12834970,1186149,-2622916,-1342231,26128231,6032912 }, + { -26337395,-13766162,32496025,-13653919,17847801,-12669156,3604025,8316894,-25875034,-10437358 }, + { 3296484,6223048,24680646,-12246460,-23052020,5903205,-8862297,-4639164,12376617,3188849 }, + }, + { + { 29190488,-14659046,27549113,-1183516,3520066,-10697301,32049515,-7309113,-16109234,-9852307 }, + { -14744486,-9309156,735818,-598978,-20407687,-5057904,25246078,-15795669,18640741,-960977 }, + { -6928835,-16430795,10361374,5642961,4910474,12345252,-31638386,-494430,10530747,1053335 }, + }, + { + { -29265967,-14186805,-13538216,-12117373,-19457059,-10655384,-31462369,-2948985,24018831,15026644 }, + { -22592535,-3145277,-2289276,5953843,-13440189,9425631,25310643,13003497,-2314791,-15145616 }, + { -27419985,-603321,-8043984,-1669117,-26092265,13987819,-27297622,187899,-23166419,-2531735 }, + }, + { + { -21744398,-13810475,1844840,5021428,-10434399,-15911473,9716667,16266922,-5070217,726099 }, + { 29370922,-6053998,7334071,-15342259,9385287,2247707,-13661962,-4839461,30007388,-15823341 }, + { -936379,16086691,23751945,-543318,-1167538,-5189036,9137109,730663,9835848,4555336 }, + }, + { + { -23376435,1410446,-22253753,-12899614,30867635,15826977,17693930,544696,-11985298,12422646 }, + { 31117226,-12215734,-13502838,6561947,-9876867,-12757670,-5118685,-4096706,29120153,13924425 }, + { -17400879,-14233209,19675799,-2734756,-11006962,-5858820,-9383939,-11317700,7240931,-237388 }, + }, + { + { -31361739,-11346780,-15007447,-5856218,-22453340,-12152771,1222336,4389483,3293637,-15551743 }, + { -16684801,-14444245,11038544,11054958,-13801175,-3338533,-24319580,7733547,12796905,-6335822 }, + { -8759414,-10817836,-25418864,10783769,-30615557,-9746811,-28253339,3647836,3222231,-11160462 }, + }, + { + { 18606113,1693100,-25448386,-15170272,4112353,10045021,23603893,-2048234,-7550776,2484985 }, + { 9255317,-3131197,-12156162,-1004256,13098013,-9214866,16377220,-2102812,-19802075,-3034702 }, + { -22729289,7496160,-5742199,11329249,19991973,-3347502,-31718148,9936966,-30097688,-10618797 }, + }, + { + { 21878590,-5001297,4338336,13643897,-3036865,13160960,19708896,5415497,-7360503,-4109293 }, + { 27736861,10103576,12500508,8502413,-3413016,-9633558,10436918,-1550276,-23659143,-8132100 }, + { 19492550,-12104365,-29681976,-852630,-3208171,12403437,30066266,8367329,13243957,8709688 }, + }, +}, +{ + { + { 12015105,2801261,28198131,10151021,24818120,-4743133,-11194191,-5645734,5150968,7274186 }, + { 2831366,-12492146,1478975,6122054,23825128,-12733586,31097299,6083058,31021603,-9793610 }, + { -2529932,-2229646,445613,10720828,-13849527,-11505937,-23507731,16354465,15067285,-14147707 }, + }, + { + { 7840942,14037873,-33364863,15934016,-728213,-3642706,21403988,1057586,-19379462,-12403220 }, + { 915865,-16469274,15608285,-8789130,-24357026,6060030,-17371319,8410997,-7220461,16527025 }, + { 32922597,-556987,20336074,-16184568,10903705,-5384487,16957574,52992,23834301,6588044 }, + }, + { + { 32752030,11232950,3381995,-8714866,22652988,-10744103,17159699,16689107,-20314580,-1305992 }, + { -4689649,9166776,-25710296,-10847306,11576752,12733943,7924251,-2752281,1976123,-7249027 }, + { 21251222,16309901,-2983015,-6783122,30810597,12967303,156041,-3371252,12331345,-8237197 }, + }, + { + { 8651614,-4477032,-16085636,-4996994,13002507,2950805,29054427,-5106970,10008136,-4667901 }, + { 31486080,15114593,-14261250,12951354,14369431,-7387845,16347321,-13662089,8684155,-10532952 }, + { 19443825,11385320,24468943,-9659068,-23919258,2187569,-26263207,-6086921,31316348,14219878 }, + }, + { + { -28594490,1193785,32245219,11392485,31092169,15722801,27146014,6992409,29126555,9207390 }, + { 32382935,1110093,18477781,11028262,-27411763,-7548111,-4980517,10843782,-7957600,-14435730 }, + { 2814918,7836403,27519878,-7868156,-20894015,-11553689,-21494559,8550130,28346258,1994730 }, + }, + { + { -19578299,8085545,-14000519,-3948622,2785838,-16231307,-19516951,7174894,22628102,8115180 }, + { -30405132,955511,-11133838,-15078069,-32447087,-13278079,-25651578,3317160,-9943017,930272 }, + { -15303681,-6833769,28856490,1357446,23421993,1057177,24091212,-1388970,-22765376,-10650715 }, + }, + { + { -22751231,-5303997,-12907607,-12768866,-15811511,-7797053,-14839018,-16554220,-1867018,8398970 }, + { -31969310,2106403,-4736360,1362501,12813763,16200670,22981545,-6291273,18009408,-15772772 }, + { -17220923,-9545221,-27784654,14166835,29815394,7444469,29551787,-3727419,19288549,1325865 }, + }, + { + { 15100157,-15835752,-23923978,-1005098,-26450192,15509408,12376730,-3479146,33166107,-8042750 }, + { 20909231,13023121,-9209752,16251778,-5778415,-8094914,12412151,10018715,2213263,-13878373 }, + { 32529814,-11074689,30361439,-16689753,-9135940,1513226,22922121,6382134,-5766928,8371348 }, + }, +}, +{ + { + { 9923462,11271500,12616794,3544722,-29998368,-1721626,12891687,-8193132,-26442943,10486144 }, + { -22597207,-7012665,8587003,-8257861,4084309,-12970062,361726,2610596,-23921530,-11455195 }, + { 5408411,-1136691,-4969122,10561668,24145918,14240566,31319731,-4235541,19985175,-3436086 }, + }, + { + { -13994457,16616821,14549246,3341099,32155958,13648976,-17577068,8849297,65030,8370684 }, + { -8320926,-12049626,31204563,5839400,-20627288,-1057277,-19442942,6922164,12743482,-9800518 }, + { -2361371,12678785,28815050,4759974,-23893047,4884717,23783145,11038569,18800704,255233 }, + }, + { + { -5269658,-1773886,13957886,7990715,23132995,728773,13393847,9066957,19258688,-14753793 }, + { -2936654,-10827535,-10432089,14516793,-3640786,4372541,-31934921,2209390,-1524053,2055794 }, + { 580882,16705327,5468415,-2683018,-30926419,-14696000,-7203346,-8994389,-30021019,7394435 }, + }, + { + { 23838809,1822728,-15738443,15242727,8318092,-3733104,-21672180,-3492205,-4821741,14799921 }, + { 13345610,9759151,3371034,-16137791,16353039,8577942,31129804,13496856,-9056018,7402518 }, + { 2286874,-4435931,-20042458,-2008336,-13696227,5038122,11006906,-15760352,8205061,1607563 }, + }, + { + { 14414086,-8002132,3331830,-3208217,22249151,-5594188,18364661,-2906958,30019587,-9029278 }, + { -27688051,1585953,-10775053,931069,-29120221,-11002319,-14410829,12029093,9944378,8024 }, + { 4368715,-3709630,29874200,-15022983,-20230386,-11410704,-16114594,-999085,-8142388,5640030 }, + }, + { + { 10299610,13746483,11661824,16234854,7630238,5998374,9809887,-16694564,15219798,-14327783 }, + { 27425505,-5719081,3055006,10660664,23458024,595578,-15398605,-1173195,-18342183,9742717 }, + { 6744077,2427284,26042789,2720740,-847906,1118974,32324614,7406442,12420155,1994844 }, + }, + { + { 14012521,-5024720,-18384453,-9578469,-26485342,-3936439,-13033478,-10909803,24319929,-6446333 }, + { 16412690,-4507367,10772641,15929391,-17068788,-4658621,10555945,-10484049,-30102368,-4739048 }, + { 22397382,-7767684,-9293161,-12792868,17166287,-9755136,-27333065,6199366,21880021,-12250760 }, + }, + { + { -4283307,5368523,-31117018,8163389,-30323063,3209128,16557151,8890729,8840445,4957760 }, + { -15447727,709327,-6919446,-10870178,-29777922,6522332,-21720181,12130072,-14796503,5005757 }, + { -2114751,-14308128,23019042,15765735,-25269683,6002752,10183197,-13239326,-16395286,-2176112 }, + }, +}, +{ + { + { -19025756,1632005,13466291,-7995100,-23640451,16573537,-32013908,-3057104,22208662,2000468 }, + { 3065073,-1412761,-25598674,-361432,-17683065,-5703415,-8164212,11248527,-3691214,-7414184 }, + { 10379208,-6045554,8877319,1473647,-29291284,-12507580,16690915,2553332,-3132688,16400289 }, + }, + { + { 15716668,1254266,-18472690,7446274,-8448918,6344164,-22097271,-7285580,26894937,9132066 }, + { 24158887,12938817,11085297,-8177598,-28063478,-4457083,-30576463,64452,-6817084,-2692882 }, + { 13488534,7794716,22236231,5989356,25426474,-12578208,2350710,-3418511,-4688006,2364226 }, + }, + { + { 16335052,9132434,25640582,6678888,1725628,8517937,-11807024,-11697457,15445875,-7798101 }, + { 29004207,-7867081,28661402,-640412,-12794003,-7943086,31863255,-4135540,-278050,-15759279 }, + { -6122061,-14866665,-28614905,14569919,-10857999,-3591829,10343412,-6976290,-29828287,-10815811 }, + }, + { + { 27081650,3463984,14099042,-4517604,1616303,-6205604,29542636,15372179,17293797,960709 }, + { 20263915,11434237,-5765435,11236810,13505955,-10857102,-16111345,6493122,-19384511,7639714 }, + { -2830798,-14839232,25403038,-8215196,-8317012,-16173699,18006287,-16043750,29994677,-15808121 }, + }, + { + { 9769828,5202651,-24157398,-13631392,-28051003,-11561624,-24613141,-13860782,-31184575,709464 }, + { 12286395,13076066,-21775189,-1176622,-25003198,4057652,-32018128,-8890874,16102007,13205847 }, + { 13733362,5599946,10557076,3195751,-5557991,8536970,-25540170,8525972,10151379,10394400 }, + }, + { + { 4024660,-16137551,22436262,12276534,-9099015,-2686099,19698229,11743039,-33302334,8934414 }, + { -15879800,-4525240,-8580747,-2934061,14634845,-698278,-9449077,3137094,-11536886,11721158 }, + { 17555939,-5013938,8268606,2331751,-22738815,9761013,9319229,8835153,-9205489,-1280045 }, + }, + { + { -461409,-7830014,20614118,16688288,-7514766,-4807119,22300304,505429,6108462,-6183415 }, + { -5070281,12367917,-30663534,3234473,32617080,-8422642,29880583,-13483331,-26898490,-7867459 }, + { -31975283,5726539,26934134,10237677,-3173717,-605053,24199304,3795095,7592688,-14992079 }, + }, + { + { 21594432,-14964228,17466408,-4077222,32537084,2739898,6407723,12018833,-28256052,4298412 }, + { -20650503,-11961496,-27236275,570498,3767144,-1717540,13891942,-1569194,13717174,10805743 }, + { -14676630,-15644296,15287174,11927123,24177847,-8175568,-796431,14860609,-26938930,-5863836 }, + }, +}, +{ + { + { 12962541,5311799,-10060768,11658280,18855286,-7954201,13286263,-12808704,-4381056,9882022 }, + { 18512079,11319350,-20123124,15090309,18818594,5271736,-22727904,3666879,-23967430,-3299429 }, + { -6789020,-3146043,16192429,13241070,15898607,-14206114,-10084880,-6661110,-2403099,5276065 }, + }, + { + { 30169808,-5317648,26306206,-11750859,27814964,7069267,7152851,3684982,1449224,13082861 }, + { 10342826,3098505,2119311,193222,25702612,12233820,23697382,15056736,-21016438,-8202000 }, + { -33150110,3261608,22745853,7948688,19370557,-15177665,-26171976,6482814,-10300080,-11060101 }, + }, + { + { 32869458,-5408545,25609743,15678670,-10687769,-15471071,26112421,2521008,-22664288,6904815 }, + { 29506923,4457497,3377935,-9796444,-30510046,12935080,1561737,3841096,-29003639,-6657642 }, + { 10340844,-6630377,-18656632,-2278430,12621151,-13339055,30878497,-11824370,-25584551,5181966 }, + }, + { + { 25940115,-12658025,17324188,-10307374,-8671468,15029094,24396252,-16450922,-2322852,-12388574 }, + { -21765684,9916823,-1300409,4079498,-1028346,11909559,1782390,12641087,20603771,-6561742 }, + { -18882287,-11673380,24849422,11501709,13161720,-4768874,1925523,11914390,4662781,7820689 }, + }, + { + { 12241050,-425982,8132691,9393934,32846760,-1599620,29749456,12172924,16136752,15264020 }, + { -10349955,-14680563,-8211979,2330220,-17662549,-14545780,10658213,6671822,19012087,3772772 }, + { 3753511,-3421066,10617074,2028709,14841030,-6721664,28718732,-15762884,20527771,12988982 }, + }, + { + { -14822485,-5797269,-3707987,12689773,-898983,-10914866,-24183046,-10564943,3299665,-12424953 }, + { -16777703,-15253301,-9642417,4978983,3308785,8755439,6943197,6461331,-25583147,8991218 }, + { -17226263,1816362,-1673288,-6086439,31783888,-8175991,-32948145,7417950,-30242287,1507265 }, + }, + { + { 29692663,6829891,-10498800,4334896,20945975,-11906496,-28887608,8209391,14606362,-10647073 }, + { -3481570,8707081,32188102,5672294,22096700,1711240,-33020695,9761487,4170404,-2085325 }, + { -11587470,14855945,-4127778,-1531857,-26649089,15084046,22186522,16002000,-14276837,-8400798 }, + }, + { + { -4811456,13761029,-31703877,-2483919,-3312471,7869047,-7113572,-9620092,13240845,10965870 }, + { -7742563,-8256762,-14768334,-13656260,-23232383,12387166,4498947,14147411,29514390,4302863 }, + { -13413405,-12407859,20757302,-13801832,14785143,8976368,-5061276,-2144373,17846988,-13971927 }, + }, +}, +{ + { + { -2244452,-754728,-4597030,-1066309,-6247172,1455299,-21647728,-9214789,-5222701,12650267 }, + { -9906797,-16070310,21134160,12198166,-27064575,708126,387813,13770293,-19134326,10958663 }, + { 22470984,12369526,23446014,-5441109,-21520802,-9698723,-11772496,-11574455,-25083830,4271862 }, + }, + { + { -25169565,-10053642,-19909332,15361595,-5984358,2159192,75375,-4278529,-32526221,8469673 }, + { 15854970,4148314,-8893890,7259002,11666551,13824734,-30531198,2697372,24154791,-9460943 }, + { 15446137,-15806644,29759747,14019369,30811221,-9610191,-31582008,12840104,24913809,9815020 }, + }, + { + { -4709286,-5614269,-31841498,-12288893,-14443537,10799414,-9103676,13438769,18735128,9466238 }, + { 11933045,9281483,5081055,-5183824,-2628162,-4905629,-7727821,-10896103,-22728655,16199064 }, + { 14576810,379472,-26786533,-8317236,-29426508,-10812974,-102766,1876699,30801119,2164795 }, + }, + { + { 15995086,3199873,13672555,13712240,-19378835,-4647646,-13081610,-15496269,-13492807,1268052 }, + { -10290614,-3659039,-3286592,10948818,23037027,3794475,-3470338,-12600221,-17055369,3565904 }, + { 29210088,-9419337,-5919792,-4952785,10834811,-13327726,-16512102,-10820713,-27162222,-14030531 }, + }, + { + { -13161890,15508588,16663704,-8156150,-28349942,9019123,-29183421,-3769423,2244111,-14001979 }, + { -5152875,-3800936,-9306475,-6071583,16243069,14684434,-25673088,-16180800,13491506,4641841 }, + { 10813417,643330,-19188515,-728916,30292062,-16600078,27548447,-7721242,14476989,-12767431 }, + }, + { + { 10292079,9984945,6481436,8279905,-7251514,7032743,27282937,-1644259,-27912810,12651324 }, + { -31185513,-813383,22271204,11835308,10201545,15351028,17099662,3988035,21721536,-3148940 }, + { 10202177,-6545839,-31373232,-9574638,-32150642,-8119683,-12906320,3852694,13216206,14842320 }, + }, + { + { -15815640,-10601066,-6538952,-7258995,-6984659,-6581778,-31500847,13765824,-27434397,9900184 }, + { 14465505,-13833331,-32133984,-14738873,-27443187,12990492,33046193,15796406,-7051866,-8040114 }, + { 30924417,-8279620,6359016,-12816335,16508377,9071735,-25488601,15413635,9524356,-7018878 }, + }, + { + { 12274201,-13175547,32627641,-1785326,6736625,13267305,5237659,-5109483,15663516,4035784 }, + { -2951309,8903985,17349946,601635,-16432815,-4612556,-13732739,-15889334,-22258478,4659091 }, + { -16916263,-4952973,-30393711,-15158821,20774812,15897498,5736189,15026997,-2178256,-13455585 }, + }, +}, +{ + { + { -8858980,-2219056,28571666,-10155518,-474467,-10105698,-3801496,278095,23440562,-290208 }, + { 10226241,-5928702,15139956,120818,-14867693,5218603,32937275,11551483,-16571960,-7442864 }, + { 17932739,-12437276,-24039557,10749060,11316803,7535897,22503767,5561594,-3646624,3898661 }, + }, + { + { 7749907,-969567,-16339731,-16464,-25018111,15122143,-1573531,7152530,21831162,1245233 }, + { 26958459,-14658026,4314586,8346991,-5677764,11960072,-32589295,-620035,-30402091,-16716212 }, + { -12165896,9166947,33491384,13673479,29787085,13096535,6280834,14587357,-22338025,13987525 }, + }, + { + { -24349909,7778775,21116000,15572597,-4833266,-5357778,-4300898,-5124639,-7469781,-2858068 }, + { 9681908,-6737123,-31951644,13591838,-6883821,386950,31622781,6439245,-14581012,4091397 }, + { -8426427,1470727,-28109679,-1596990,3978627,-5123623,-19622683,12092163,29077877,-14741988 }, + }, + { + { 5269168,-6859726,-13230211,-8020715,25932563,1763552,-5606110,-5505881,-20017847,2357889 }, + { 32264008,-15407652,-5387735,-1160093,-2091322,-3946900,23104804,-12869908,5727338,189038 }, + { 14609123,-8954470,-6000566,-16622781,-14577387,-7743898,-26745169,10942115,-25888931,-14884697 }, + }, + { + { 20513500,5557931,-15604613,7829531,26413943,-2019404,-21378968,7471781,13913677,-5137875 }, + { -25574376,11967826,29233242,12948236,-6754465,4713227,-8940970,14059180,12878652,8511905 }, + { -25656801,3393631,-2955415,-7075526,-2250709,9366908,-30223418,6812974,5568676,-3127656 }, + }, + { + { 11630004,12144454,2116339,13606037,27378885,15676917,-17408753,-13504373,-14395196,8070818 }, + { 27117696,-10007378,-31282771,-5570088,1127282,12772488,-29845906,10483306,-11552749,-1028714 }, + { 10637467,-5688064,5674781,1072708,-26343588,-6982302,-1683975,9177853,-27493162,15431203 }, + }, + { + { 20525145,10892566,-12742472,12779443,-29493034,16150075,-28240519,14943142,-15056790,-7935931 }, + { -30024462,5626926,-551567,-9981087,753598,11981191,25244767,-3239766,-3356550,9594024 }, + { -23752644,2636870,-5163910,-10103818,585134,7877383,11345683,-6492290,13352335,-10977084 }, + }, + { + { -1931799,-5407458,3304649,-12884869,17015806,-4877091,-29783850,-7752482,-13215537,-319204 }, + { 20239939,6607058,6203985,3483793,-18386976,-779229,-20723742,15077870,-22750759,14523817 }, + { 27406042,-6041657,27423596,-4497394,4996214,10002360,-28842031,-4545494,-30172742,-4805667 }, + }, +}, +{ + { + { 11374242,12660715,17861383,-12540833,10935568,1099227,-13886076,-9091740,-27727044,11358504 }, + { -12730809,10311867,1510375,10778093,-2119455,-9145702,32676003,11149336,-26123651,4985768 }, + { -19096303,341147,-6197485,-239033,15756973,-8796662,-983043,13794114,-19414307,-15621255 }, + }, + { + { 6490081,11940286,25495923,-7726360,8668373,-8751316,3367603,6970005,-1691065,-9004790 }, + { 1656497,13457317,15370807,6364910,13605745,8362338,-19174622,-5475723,-16796596,-5031438 }, + { -22273315,-13524424,-64685,-4334223,-18605636,-10921968,-20571065,-7007978,-99853,-10237333 }, + }, + { + { 17747465,10039260,19368299,-4050591,-20630635,-16041286,31992683,-15857976,-29260363,-5511971 }, + { 31932027,-4986141,-19612382,16366580,22023614,88450,11371999,-3744247,4882242,-10626905 }, + { 29796507,37186,19818052,10115756,-11829032,3352736,18551198,3272828,-5190932,-4162409 }, + }, + { + { 12501286,4044383,-8612957,-13392385,-32430052,5136599,-19230378,-3529697,330070,-3659409 }, + { 6384877,2899513,17807477,7663917,-2358888,12363165,25366522,-8573892,-271295,12071499 }, + { -8365515,-4042521,25133448,-4517355,-6211027,2265927,-32769618,1936675,-5159697,3829363 }, + }, + { + { 28425966,-5835433,-577090,-4697198,-14217555,6870930,7921550,-6567787,26333140,14267664 }, + { -11067219,11871231,27385719,-10559544,-4585914,-11189312,10004786,-8709488,-21761224,8930324 }, + { -21197785,-16396035,25654216,-1725397,12282012,11008919,1541940,4757911,-26491501,-16408940 }, + }, + { + { 13537262,-7759490,-20604840,10961927,-5922820,-13218065,-13156584,6217254,-15943699,13814990 }, + { -17422573,15157790,18705543,29619,24409717,-260476,27361681,9257833,-1956526,-1776914 }, + { -25045300,-10191966,15366585,15166509,-13105086,8423556,-29171540,12361135,-18685978,4578290 }, + }, + { + { 24579768,3711570,1342322,-11180126,-27005135,14124956,-22544529,14074919,21964432,8235257 }, + { -6528613,-2411497,9442966,-5925588,12025640,-1487420,-2981514,-1669206,13006806,2355433 }, + { -16304899,-13605259,-6632427,-5142349,16974359,-10911083,27202044,1719366,1141648,-12796236 }, + }, + { + { -12863944,-13219986,-8318266,-11018091,-6810145,-4843894,13475066,-3133972,32674895,13715045 }, + { 11423335,-5468059,32344216,8962751,24989809,9241752,-13265253,16086212,-28740881,-15642093 }, + { -1409668,12530728,-6368726,10847387,19531186,-14132160,-11709148,7791794,-27245943,4383347 }, + }, +}, +{ + { + { -28970898,5271447,-1266009,-9736989,-12455236,16732599,-4862407,-4906449,27193557,6245191 }, + { -15193956,5362278,-1783893,2695834,4960227,12840725,23061898,3260492,22510453,8577507 }, + { -12632451,11257346,-32692994,13548177,-721004,10879011,31168030,13952092,-29571492,-3635906 }, + }, + { + { 3877321,-9572739,32416692,5405324,-11004407,-13656635,3759769,11935320,5611860,8164018 }, + { -16275802,14667797,15906460,12155291,-22111149,-9039718,32003002,-8832289,5773085,-8422109 }, + { -23788118,-8254300,1950875,8937633,18686727,16459170,-905725,12376320,31632953,190926 }, + }, + { + { -24593607,-16138885,-8423991,13378746,14162407,6901328,-8288749,4508564,-25341555,-3627528 }, + { 8884438,-5884009,6023974,10104341,-6881569,-4941533,18722941,-14786005,-1672488,827625 }, + { -32720583,-16289296,-32503547,7101210,13354605,2659080,-1800575,-14108036,-24878478,1541286 }, + }, + { + { 2901347,-1117687,3880376,-10059388,-17620940,-3612781,-21802117,-3567481,20456845,-1885033 }, + { 27019610,12299467,-13658288,-1603234,-12861660,-4861471,-19540150,-5016058,29439641,15138866 }, + { 21536104,-6626420,-32447818,-10690208,-22408077,5175814,-5420040,-16361163,7779328,109896 }, + }, + { + { 30279744,14648750,-8044871,6425558,13639621,-743509,28698390,12180118,23177719,-554075 }, + { 26572847,3405927,-31701700,12890905,-19265668,5335866,-6493768,2378492,4439158,-13279347 }, + { -22716706,3489070,-9225266,-332753,18875722,-1140095,14819434,-12731527,-17717757,-5461437 }, + }, + { + { -5056483,16566551,15953661,3767752,-10436499,15627060,-820954,2177225,8550082,-15114165 }, + { -18473302,16596775,-381660,15663611,22860960,15585581,-27844109,-3582739,-23260460,-8428588 }, + { -32480551,15707275,-8205912,-5652081,29464558,2713815,-22725137,15860482,-21902570,1494193 }, + }, + { + { -19562091,-14087393,-25583872,-9299552,13127842,759709,21923482,16529112,8742704,12967017 }, + { -28464899,1553205,32536856,-10473729,-24691605,-406174,-8914625,-2933896,-29903758,15553883 }, + { 21877909,3230008,9881174,10539357,-4797115,2841332,11543572,14513274,19375923,-12647961 }, + }, + { + { 8832269,-14495485,13253511,5137575,5037871,4078777,24880818,-6222716,2862653,9455043 }, + { 29306751,5123106,20245049,-14149889,9592566,8447059,-2077124,-2990080,15511449,4789663 }, + { -20679756,7004547,8824831,-9434977,-4045704,-3750736,-5754762,108893,23513200,16652362 }, + }, +}, +{ + { + { -33256173,4144782,-4476029,-6579123,10770039,-7155542,-6650416,-12936300,-18319198,10212860 }, + { 2756081,8598110,7383731,-6859892,22312759,-1105012,21179801,2600940,-9988298,-12506466 }, + { -24645692,13317462,-30449259,-15653928,21365574,-10869657,11344424,864440,-2499677,-16710063 }, + }, + { + { -26432803,6148329,-17184412,-14474154,18782929,-275997,-22561534,211300,2719757,4940997 }, + { -1323882,3911313,-6948744,14759765,-30027150,7851207,21690126,8518463,26699843,5276295 }, + { -13149873,-6429067,9396249,365013,24703301,-10488939,1321586,149635,-15452774,7159369 }, + }, + { + { 9987780,-3404759,17507962,9505530,9731535,-2165514,22356009,8312176,22477218,-8403385 }, + { 18155857,-16504990,19744716,9006923,15154154,-10538976,24256460,-4864995,-22548173,9334109 }, + { 2986088,-4911893,10776628,-3473844,10620590,-7083203,-21413845,14253545,-22587149,536906 }, + }, + { + { 4377756,8115836,24567078,15495314,11625074,13064599,7390551,10589625,10838060,-15420424 }, + { -19342404,867880,9277171,-3218459,-14431572,-1986443,19295826,-15796950,6378260,699185 }, + { 7895026,4057113,-7081772,-13077756,-17886831,-323126,-716039,15693155,-5045064,-13373962 }, + }, + { + { -7737563,-5869402,-14566319,-7406919,11385654,13201616,31730678,-10962840,-3918636,-9669325 }, + { 10188286,-15770834,-7336361,13427543,22223443,14896287,30743455,7116568,-21786507,5427593 }, + { 696102,13206899,27047647,-10632082,15285305,-9853179,10798490,-4578720,19236243,12477404 }, + }, + { + { -11229439,11243796,-17054270,-8040865,-788228,-8167967,-3897669,11180504,-23169516,7733644 }, + { 17800790,-14036179,-27000429,-11766671,23887827,3149671,23466177,-10538171,10322027,15313801 }, + { 26246234,11968874,32263343,-5468728,6830755,-13323031,-15794704,-101982,-24449242,10890804 }, + }, + { + { -31365647,10271363,-12660625,-6267268,16690207,-13062544,-14982212,16484931,25180797,-5334884 }, + { -586574,10376444,-32586414,-11286356,19801893,10997610,2276632,9482883,316878,13820577 }, + { -9882808,-4510367,-2115506,16457136,-11100081,11674996,30756178,-7515054,30696930,-3712849 }, + }, + { + { 32988917,-9603412,12499366,7910787,-10617257,-11931514,-7342816,-9985397,-32349517,7392473 }, + { -8855661,15927861,9866406,-3649411,-2396914,-16655781,-30409476,-9134995,25112947,-2926644 }, + { -2504044,-436966,25621774,-5678772,15085042,-5479877,-24884878,-13526194,5537438,-13914319 }, + }, +}, +{ + { + { -11225584,2320285,-9584280,10149187,-33444663,5808648,-14876251,-1729667,31234590,6090599 }, + { -9633316,116426,26083934,2897444,-6364437,-2688086,609721,15878753,-6970405,-9034768 }, + { -27757857,247744,-15194774,-9002551,23288161,-10011936,-23869595,6503646,20650474,1804084 }, + }, + { + { -27589786,15456424,8972517,8469608,15640622,4439847,3121995,-10329713,27842616,-202328 }, + { -15306973,2839644,22530074,10026331,4602058,5048462,28248656,5031932,-11375082,12714369 }, + { 20807691,-7270825,29286141,11421711,-27876523,-13868230,-21227475,1035546,-19733229,12796920 }, + }, + { + { 12076899,-14301286,-8785001,-11848922,-25012791,16400684,-17591495,-12899438,3480665,-15182815 }, + { -32361549,5457597,28548107,7833186,7303070,-11953545,-24363064,-15921875,-33374054,2771025 }, + { -21389266,421932,26597266,6860826,22486084,-6737172,-17137485,-4210226,-24552282,15673397 }, + }, + { + { -20184622,2338216,19788685,-9620956,-4001265,-8740893,-20271184,4733254,3727144,-12934448 }, + { 6120119,814863,-11794402,-622716,6812205,-15747771,2019594,7975683,31123697,-10958981 }, + { 30069250,-11435332,30434654,2958439,18399564,-976289,12296869,9204260,-16432438,9648165 }, + }, + { + { 32705432,-1550977,30705658,7451065,-11805606,9631813,3305266,5248604,-26008332,-11377501 }, + { 17219865,2375039,-31570947,-5575615,-19459679,9219903,294711,15298639,2662509,-16297073 }, + { -1172927,-7558695,-4366770,-4287744,-21346413,-8434326,32087529,-1222777,32247248,-14389861 }, + }, + { + { 14312628,1221556,17395390,-8700143,-4945741,-8684635,-28197744,-9637817,-16027623,-13378845 }, + { -1428825,-9678990,-9235681,6549687,-7383069,-468664,23046502,9803137,17597934,2346211 }, + { 18510800,15337574,26171504,981392,-22241552,7827556,-23491134,-11323352,3059833,-11782870 }, + }, + { + { 10141598,6082907,17829293,-1947643,9830092,13613136,-25556636,-5544586,-33502212,3592096 }, + { 33114168,-15889352,-26525686,-13343397,33076705,8716171,1151462,1521897,-982665,-6837803 }, + { -32939165,-4255815,23947181,-324178,-33072974,-12305637,-16637686,3891704,26353178,693168 }, + }, + { + { 30374239,1595580,-16884039,13186931,4600344,406904,9585294,-400668,31375464,14369965 }, + { -14370654,-7772529,1510301,6434173,-18784789,-6262728,32732230,-13108839,17901441,16011505 }, + { 18171223,-11934626,-12500402,15197122,-11038147,-15230035,-19172240,-16046376,8764035,12309598 }, + }, +}, +{ + { + { 5975908,-5243188,-19459362,-9681747,-11541277,14015782,-23665757,1228319,17544096,-10593782 }, + { 5811932,-1715293,3442887,-2269310,-18367348,-8359541,-18044043,-15410127,-5565381,12348900 }, + { -31399660,11407555,25755363,6891399,-3256938,14872274,-24849353,8141295,-10632534,-585479 }, + }, + { + { -12675304,694026,-5076145,13300344,14015258,-14451394,-9698672,-11329050,30944593,1130208 }, + { 8247766,-6710942,-26562381,-7709309,-14401939,-14648910,4652152,2488540,23550156,-271232 }, + { 17294316,-3788438,7026748,15626851,22990044,113481,2267737,-5908146,-408818,-137719 }, + }, + { + { 16091085,-16253926,18599252,7340678,2137637,-1221657,-3364161,14550936,3260525,-7166271 }, + { -4910104,-13332887,18550887,10864893,-16459325,-7291596,-23028869,-13204905,-12748722,2701326 }, + { -8574695,16099415,4629974,-16340524,-20786213,-6005432,-10018363,9276971,11329923,1862132 }, + }, + { + { 14763076,-15903608,-30918270,3689867,3511892,10313526,-21951088,12219231,-9037963,-940300 }, + { 8894987,-3446094,6150753,3013931,301220,15693451,-31981216,-2909717,-15438168,11595570 }, + { 15214962,3537601,-26238722,-14058872,4418657,-15230761,13947276,10730794,-13489462,-4363670 }, + }, + { + { -2538306,7682793,32759013,263109,-29984731,-7955452,-22332124,-10188635,977108,699994 }, + { -12466472,4195084,-9211532,550904,-15565337,12917920,19118110,-439841,-30534533,-14337913 }, + { 31788461,-14507657,4799989,7372237,8808585,-14747943,9408237,-10051775,12493932,-5409317 }, + }, + { + { -25680606,5260744,-19235809,-6284470,-3695942,16566087,27218280,2607121,29375955,6024730 }, + { 842132,-2794693,-4763381,-8722815,26332018,-12405641,11831880,6985184,-9940361,2854096 }, + { -4847262,-7969331,2516242,-5847713,9695691,-7221186,16512645,960770,12121869,16648078 }, + }, + { + { -15218652,14667096,-13336229,2013717,30598287,-464137,-31504922,-7882064,20237806,2838411 }, + { -19288047,4453152,15298546,-16178388,22115043,-15972604,12544294,-13470457,1068881,-12499905 }, + { -9558883,-16518835,33238498,13506958,30505848,-1114596,-8486907,-2630053,12521378,4845654 }, + }, + { + { -28198521,10744108,-2958380,10199664,7759311,-13088600,3409348,-873400,-6482306,-12885870 }, + { -23561822,6230156,-20382013,10655314,-24040585,-11621172,10477734,-1240216,-3113227,13974498 }, + { 12966261,15550616,-32038948,-1615346,21025980,-629444,5642325,7188737,18895762,12629579 }, + }, +}, +{ + { + { 14741879,-14946887,22177208,-11721237,1279741,8058600,11758140,789443,32195181,3895677 }, + { 10758205,15755439,-4509950,9243698,-4879422,6879879,-2204575,-3566119,-8982069,4429647 }, + { -2453894,15725973,-20436342,-10410672,-5803908,-11040220,-7135870,-11642895,18047436,-15281743 }, + }, + { + { -25173001,-11307165,29759956,11776784,-22262383,-15820455,10993114,-12850837,-17620701,-9408468 }, + { 21987233,700364,-24505048,14972008,-7774265,-5718395,32155026,2581431,-29958985,8773375 }, + { -25568350,454463,-13211935,16126715,25240068,8594567,20656846,12017935,-7874389,-13920155 }, + }, + { + { 6028182,6263078,-31011806,-11301710,-818919,2461772,-31841174,-5468042,-1721788,-2776725 }, + { -12278994,16624277,987579,-5922598,32908203,1248608,7719845,-4166698,28408820,6816612 }, + { -10358094,-8237829,19549651,-12169222,22082623,16147817,20613181,13982702,-10339570,5067943 }, + }, + { + { -30505967,-3821767,12074681,13582412,-19877972,2443951,-19719286,12746132,5331210,-10105944 }, + { 30528811,3601899,-1957090,4619785,-27361822,-15436388,24180793,-12570394,27679908,-1648928 }, + { 9402404,-13957065,32834043,10838634,-26580150,-13237195,26653274,-8685565,22611444,-12715406 }, + }, + { + { 22190590,1118029,22736441,15130463,-30460692,-5991321,19189625,-4648942,4854859,6622139 }, + { -8310738,-2953450,-8262579,-3388049,-10401731,-271929,13424426,-3567227,26404409,13001963 }, + { -31241838,-15415700,-2994250,8939346,11562230,-12840670,-26064365,-11621720,-15405155,11020693 }, + }, + { + { 1866042,-7949489,-7898649,-10301010,12483315,13477547,3175636,-12424163,28761762,1406734 }, + { -448555,-1777666,13018551,3194501,-9580420,-11161737,24760585,-4347088,25577411,-13378680 }, + { -24290378,4759345,-690653,-1852816,2066747,10693769,-29595790,9884936,-9368926,4745410 }, + }, + { + { -9141284,6049714,-19531061,-4341411,-31260798,9944276,-15462008,-11311852,10931924,-11931931 }, + { -16561513,14112680,-8012645,4817318,-8040464,-11414606,-22853429,10856641,-20470770,13434654 }, + { 22759489,-10073434,-16766264,-1871422,13637442,-10168091,1765144,-12654326,28445307,-5364710 }, + }, + { + { 29875063,12493613,2795536,-3786330,1710620,15181182,-10195717,-8788675,9074234,1167180 }, + { -26205683,11014233,-9842651,-2635485,-26908120,7532294,-18716888,-9535498,3843903,9367684 }, + { -10969595,-6403711,9591134,9582310,11349256,108879,16235123,8601684,-139197,4242895 }, + }, +}, +{ + { + { 22092954,-13191123,-2042793,-11968512,32186753,-11517388,-6574341,2470660,-27417366,16625501 }, + { -11057722,3042016,13770083,-9257922,584236,-544855,-7770857,2602725,-27351616,14247413 }, + { 6314175,-10264892,-32772502,15957557,-10157730,168750,-8618807,14290061,27108877,-1180880 }, + }, + { + { -8586597,-7170966,13241782,10960156,-32991015,-13794596,33547976,-11058889,-27148451,981874 }, + { 22833440,9293594,-32649448,-13618667,-9136966,14756819,-22928859,-13970780,-10479804,-16197962 }, + { -7768587,3326786,-28111797,10783824,19178761,14905060,22680049,13906969,-15933690,3797899 }, + }, + { + { 21721356,-4212746,-12206123,9310182,-3882239,-13653110,23740224,-2709232,20491983,-8042152 }, + { 9209270,-15135055,-13256557,-6167798,-731016,15289673,25947805,15286587,30997318,-6703063 }, + { 7392032,16618386,23946583,-8039892,-13265164,-1533858,-14197445,-2321576,17649998,-250080 }, + }, + { + { -9301088,-14193827,30609526,-3049543,-25175069,-1283752,-15241566,-9525724,-2233253,7662146 }, + { -17558673,1763594,-33114336,15908610,-30040870,-12174295,7335080,-8472199,-3174674,3440183 }, + { -19889700,-5977008,-24111293,-9688870,10799743,-16571957,40450,-4431835,4862400,1133 }, + }, + { + { -32856209,-7873957,-5422389,14860950,-16319031,7956142,7258061,311861,-30594991,-7379421 }, + { -3773428,-1565936,28985340,7499440,24445838,9325937,29727763,16527196,18278453,15405622 }, + { -4381906,8508652,-19898366,-3674424,-5984453,15149970,-13313598,843523,-21875062,13626197 }, + }, + { + { 2281448,-13487055,-10915418,-2609910,1879358,16164207,-10783882,3953792,13340839,15928663 }, + { 31727126,-7179855,-18437503,-8283652,2875793,-16390330,-25269894,-7014826,-23452306,5964753 }, + { 4100420,-5959452,-17179337,6017714,-18705837,12227141,-26684835,11344144,2538215,-7570755 }, + }, + { + { -9433605,6123113,11159803,-2156608,30016280,14966241,-20474983,1485421,-629256,-15958862 }, + { -26804558,4260919,11851389,9658551,-32017107,16367492,-20205425,-13191288,11659922,-11115118 }, + { 26180396,10015009,-30844224,-8581293,5418197,9480663,2231568,-10170080,33100372,-1306171 }, + }, + { + { 15121113,-5201871,-10389905,15427821,-27509937,-15992507,21670947,4486675,-5931810,-14466380 }, + { 16166486,-9483733,-11104130,6023908,-31926798,-1364923,2340060,-16254968,-10735770,-10039824 }, + { 28042865,-3557089,-12126526,12259706,-3717498,-6945899,6766453,-8689599,18036436,5803270 }, + }, +}, +{ + { + { -817581,6763912,11803561,1585585,10958447,-2671165,23855391,4598332,-6159431,-14117438 }, + { -31031306,-14256194,17332029,-2383520,31312682,-5967183,696309,50292,-20095739,11763584 }, + { -594563,-2514283,-32234153,12643980,12650761,14811489,665117,-12613632,-19773211,-10713562 }, + }, + { + { 30464590,-11262872,-4127476,-12734478,19835327,-7105613,-24396175,2075773,-17020157,992471 }, + { 18357185,-6994433,7766382,16342475,-29324918,411174,14578841,8080033,-11574335,-10601610 }, + { 19598397,10334610,12555054,2555664,18821899,-10339780,21873263,16014234,26224780,16452269 }, + }, + { + { -30223925,5145196,5944548,16385966,3976735,2009897,-11377804,-7618186,-20533829,3698650 }, + { 14187449,3448569,-10636236,-10810935,-22663880,-3433596,7268410,-10890444,27394301,12015369 }, + { 19695761,16087646,28032085,12999827,6817792,11427614,20244189,-1312777,-13259127,-3402461 }, + }, + { + { 30860103,12735208,-1888245,-4699734,-16974906,2256940,-8166013,12298312,-8550524,-10393462 }, + { -5719826,-11245325,-1910649,15569035,26642876,-7587760,-5789354,-15118654,-4976164,12651793 }, + { -2848395,9953421,11531313,-5282879,26895123,-12697089,-13118820,-16517902,9768698,-2533218 }, + }, + { + { -24719459,1894651,-287698,-4704085,15348719,-8156530,32767513,12765450,4940095,10678226 }, + { 18860224,15980149,-18987240,-1562570,-26233012,-11071856,-7843882,13944024,-24372348,16582019 }, + { -15504260,4970268,-29893044,4175593,-20993212,-2199756,-11704054,15444560,-11003761,7989037 }, + }, + { + { 31490452,5568061,-2412803,2182383,-32336847,4531686,-32078269,6200206,-19686113,-14800171 }, + { -17308668,-15879940,-31522777,-2831,-32887382,16375549,8680158,-16371713,28550068,-6857132 }, + { -28126887,-5688091,16837845,-1820458,-6850681,12700016,-30039981,4364038,1155602,5988841 }, + }, + { + { 21890435,-13272907,-12624011,12154349,-7831873,15300496,23148983,-4470481,24618407,8283181 }, + { -33136107,-10512751,9975416,6841041,-31559793,16356536,3070187,-7025928,1466169,10740210 }, + { -1509399,-15488185,-13503385,-10655916,32799044,909394,-13938903,-5779719,-32164649,-15327040 }, + }, + { + { 3960823,-14267803,-28026090,-15918051,-19404858,13146868,15567327,951507,-3260321,-573935 }, + { 24740841,5052253,-30094131,8961361,25877428,6165135,-24368180,14397372,-7380369,-6144105 }, + { -28888365,3510803,-28103278,-1158478,-11238128,-10631454,-15441463,-14453128,-1625486,-6494814 }, + }, +}, +{ + { + { 793299,-9230478,8836302,-6235707,-27360908,-2369593,33152843,-4885251,-9906200,-621852 }, + { 5666233,525582,20782575,-8038419,-24538499,14657740,16099374,1468826,-6171428,-15186581 }, + { -4859255,-3779343,-2917758,-6748019,7778750,11688288,-30404353,-9871238,-1558923,-9863646 }, + }, + { + { 10896332,-7719704,824275,472601,-19460308,3009587,25248958,14783338,-30581476,-15757844 }, + { 10566929,12612572,-31944212,11118703,-12633376,12362879,21752402,8822496,24003793,14264025 }, + { 27713862,-7355973,-11008240,9227530,27050101,2504721,23886875,-13117525,13958495,-5732453 }, + }, + { + { -23481610,4867226,-27247128,3900521,29838369,-8212291,-31889399,-10041781,7340521,-15410068 }, + { 4646514,-8011124,-22766023,-11532654,23184553,8566613,31366726,-1381061,-15066784,-10375192 }, + { -17270517,12723032,-16993061,14878794,21619651,-6197576,27584817,3093888,-8843694,3849921 }, + }, + { + { -9064912,2103172,25561640,-15125738,-5239824,9582958,32477045,-9017955,5002294,-15550259 }, + { -12057553,-11177906,21115585,-13365155,8808712,-12030708,16489530,13378448,-25845716,12741426 }, + { -5946367,10645103,-30911586,15390284,-3286982,-7118677,24306472,15852464,28834118,-7646072 }, + }, + { + { -17335748,-9107057,-24531279,9434953,-8472084,-583362,-13090771,455841,20461858,5491305 }, + { 13669248,-16095482,-12481974,-10203039,-14569770,-11893198,-24995986,11293807,-28588204,-9421832 }, + { 28497928,6272777,-33022994,14470570,8906179,-1225630,18504674,-14165166,29867745,-8795943 }, + }, + { + { -16207023,13517196,-27799630,-13697798,24009064,-6373891,-6367600,-13175392,22853429,-4012011 }, + { 24191378,16712145,-13931797,15217831,14542237,1646131,18603514,-11037887,12876623,-2112447 }, + { 17902668,4518229,-411702,-2829247,26878217,5258055,-12860753,608397,16031844,3723494 }, + }, + { + { -28632773,12763728,-20446446,7577504,33001348,-13017745,17558842,-7872890,23896954,-4314245 }, + { -20005381,-12011952,31520464,605201,2543521,5991821,-2945064,7229064,-9919646,-8826859 }, + { 28816045,298879,-28165016,-15920938,19000928,-1665890,-12680833,-2949325,-18051778,-2082915 }, + }, + { + { 16000882,-344896,3493092,-11447198,-29504595,-13159789,12577740,16041268,-19715240,7847707 }, + { 10151868,10572098,27312476,7922682,14825339,4723128,-32855931,-6519018,-10020567,3852848 }, + { -11430470,15697596,-21121557,-4420647,5386314,15063598,16514493,-15932110,29330899,-15076224 }, + }, +}, +{ + { + { -25499735,-4378794,-15222908,-6901211,16615731,2051784,3303702,15490,-27548796,12314391 }, + { 15683520,-6003043,18109120,-9980648,15337968,-5997823,-16717435,15921866,16103996,-3731215 }, + { -23169824,-10781249,13588192,-1628807,-3798557,-1074929,-19273607,5402699,-29815713,-9841101 }, + }, + { + { 23190676,2384583,-32714340,3462154,-29903655,-1529132,-11266856,8911517,-25205859,2739713 }, + { 21374101,-3554250,-33524649,9874411,15377179,11831242,-33529904,6134907,4931255,11987849 }, + { -7732,-2978858,-16223486,7277597,105524,-322051,-31480539,13861388,-30076310,10117930 }, + }, + { + { -29501170,-10744872,-26163768,13051539,-25625564,5089643,-6325503,6704079,12890019,15728940 }, + { -21972360,-11771379,-951059,-4418840,14704840,2695116,903376,-10428139,12885167,8311031 }, + { -17516482,5352194,10384213,-13811658,7506451,13453191,26423267,4384730,1888765,-5435404 }, + }, + { + { -25817338,-3107312,-13494599,-3182506,30896459,-13921729,-32251644,-12707869,-19464434,-3340243 }, + { -23607977,-2665774,-526091,4651136,5765089,4618330,6092245,14845197,17151279,-9854116 }, + { -24830458,-12733720,-15165978,10367250,-29530908,-265356,22825805,-7087279,-16866484,16176525 }, + }, + { + { -23583256,6564961,20063689,3798228,-4740178,7359225,2006182,-10363426,-28746253,-10197509 }, + { -10626600,-4486402,-13320562,-5125317,3432136,-6393229,23632037,-1940610,32808310,1099883 }, + { 15030977,5768825,-27451236,-2887299,-6427378,-15361371,-15277896,-6809350,2051441,-15225865 }, + }, + { + { -3362323,-7239372,7517890,9824992,23555850,295369,5148398,-14154188,-22686354,16633660 }, + { 4577086,-16752288,13249841,-15304328,19958763,-14537274,18559670,-10759549,8402478,-9864273 }, + { -28406330,-1051581,-26790155,-907698,-17212414,-11030789,9453451,-14980072,17983010,9967138 }, + }, + { + { -25762494,6524722,26585488,9969270,24709298,1220360,-1677990,7806337,17507396,3651560 }, + { -10420457,-4118111,14584639,15971087,-15768321,8861010,26556809,-5574557,-18553322,-11357135 }, + { 2839101,14284142,4029895,3472686,14402957,12689363,-26642121,8459447,-5605463,-7621941 }, + }, + { + { -4839289,-3535444,9744961,2871048,25113978,3187018,-25110813,-849066,17258084,-7977739 }, + { 18164541,-10595176,-17154882,-1542417,19237078,-9745295,23357533,-15217008,26908270,12150756 }, + { -30264870,-7647865,5112249,-7036672,-1499807,-6974257,43168,-5537701,-32302074,16215819 }, + }, +}, +{ + { + { -6898905,9824394,-12304779,-4401089,-31397141,-6276835,32574489,12532905,-7503072,-8675347 }, + { -27343522,-16515468,-27151524,-10722951,946346,16291093,254968,7168080,21676107,-1943028 }, + { 21260961,-8424752,-16831886,-11920822,-23677961,3968121,-3651949,-6215466,-3556191,-7913075 }, + }, + { + { 16544754,13250366,-16804428,15546242,-4583003,12757258,-2462308,-8680336,-18907032,-9662799 }, + { -2415239,-15577728,18312303,4964443,-15272530,-12653564,26820651,16690659,25459437,-4564609 }, + { -25144690,11425020,28423002,-11020557,-6144921,-15826224,9142795,-2391602,-6432418,-1644817 }, + }, + { + { -23104652,6253476,16964147,-3768872,-25113972,-12296437,-27457225,-16344658,6335692,7249989 }, + { -30333227,13979675,7503222,-12368314,-11956721,-4621693,-30272269,2682242,25993170,-12478523 }, + { 4364628,5930691,32304656,-10044554,-8054781,15091131,22857016,-10598955,31820368,15075278 }, + }, + { + { 31879134,-8918693,17258761,90626,-8041836,-4917709,24162788,-9650886,-17970238,12833045 }, + { 19073683,14851414,-24403169,-11860168,7625278,11091125,-19619190,2074449,-9413939,14905377 }, + { 24483667,-11935567,-2518866,-11547418,-1553130,15355506,-25282080,9253129,27628530,-7555480 }, + }, + { + { 17597607,8340603,19355617,552187,26198470,-3176583,4593324,-9157582,-14110875,15297016 }, + { 510886,14337390,-31785257,16638632,6328095,2713355,-20217417,-11864220,8683221,2921426 }, + { 18606791,11874196,27155355,-5281482,-24031742,6265446,-25178240,-1278924,4674690,13890525 }, + }, + { + { 13609624,13069022,-27372361,-13055908,24360586,9592974,14977157,9835105,4389687,288396 }, + { 9922506,-519394,13613107,5883594,-18758345,-434263,-12304062,8317628,23388070,16052080 }, + { 12720016,11937594,-31970060,-5028689,26900120,8561328,-20155687,-11632979,-14754271,-10812892 }, + }, + { + { 15961858,14150409,26716931,-665832,-22794328,13603569,11829573,7467844,-28822128,929275 }, + { 11038231,-11582396,-27310482,-7316562,-10498527,-16307831,-23479533,-9371869,-21393143,2465074 }, + { 20017163,-4323226,27915242,1529148,12396362,15675764,13817261,-9658066,2463391,-4622140 }, + }, + { + { -16358878,-12663911,-12065183,4996454,-1256422,1073572,9583558,12851107,4003896,12673717 }, + { -1731589,-15155870,-3262930,16143082,19294135,13385325,14741514,-9103726,7903886,2348101 }, + { 24536016,-16515207,12715592,-3862155,1511293,10047386,-3842346,-7129159,-28377538,10048127 }, + }, +}, +{ + { + { -12622226,-6204820,30718825,2591312,-10617028,12192840,18873298,-7297090,-32297756,15221632 }, + { -26478122,-11103864,11546244,-1852483,9180880,7656409,-21343950,2095755,29769758,6593415 }, + { -31994208,-2907461,4176912,3264766,12538965,-868111,26312345,-6118678,30958054,8292160 }, + }, + { + { 31429822,-13959116,29173532,15632448,12174511,-2760094,32808831,3977186,26143136,-3148876 }, + { 22648901,1402143,-22799984,13746059,7936347,365344,-8668633,-1674433,-3758243,-2304625 }, + { -15491917,8012313,-2514730,-12702462,-23965846,-10254029,-1612713,-1535569,-16664475,8194478 }, + }, + { + { 27338066,-7507420,-7414224,10140405,-19026427,-6589889,27277191,8855376,28572286,3005164 }, + { 26287124,4821776,25476601,-4145903,-3764513,-15788984,-18008582,1182479,-26094821,-13079595 }, + { -7171154,3178080,23970071,6201893,-17195577,-4489192,-21876275,-13982627,32208683,-1198248 }, + }, + { + { -16657702,2817643,-10286362,14811298,6024667,13349505,-27315504,-10497842,-27672585,-11539858 }, + { 15941029,-9405932,-21367050,8062055,31876073,-238629,-15278393,-1444429,15397331,-4130193 }, + { 8934485,-13485467,-23286397,-13423241,-32446090,14047986,31170398,-1441021,-27505566,15087184 }, + }, + { + { -18357243,-2156491,24524913,-16677868,15520427,-6360776,-15502406,11461896,16788528,-5868942 }, + { -1947386,16013773,21750665,3714552,-17401782,-16055433,-3770287,-10323320,31322514,-11615635 }, + { 21426655,-5650218,-13648287,-5347537,-28812189,-4920970,-18275391,-14621414,13040862,-12112948 }, + }, + { + { 11293895,12478086,-27136401,15083750,-29307421,14748872,14555558,-13417103,1613711,4896935 }, + { -25894883,15323294,-8489791,-8057900,25967126,-13425460,2825960,-4897045,-23971776,-11267415 }, + { -15924766,-5229880,-17443532,6410664,3622847,10243618,20615400,12405433,-23753030,-8436416 }, + }, + { + { -7091295,12556208,-20191352,9025187,-17072479,4333801,4378436,2432030,23097949,-566018 }, + { 4565804,-16025654,20084412,-7842817,1724999,189254,24767264,10103221,-18512313,2424778 }, + { 366633,-11976806,8173090,-6890119,30788634,5745705,-7168678,1344109,-3642553,12412659 }, + }, + { + { -24001791,7690286,14929416,-168257,-32210835,-13412986,24162697,-15326504,-3141501,11179385 }, + { 18289522,-14724954,8056945,16430056,-21729724,7842514,-6001441,-1486897,-18684645,-11443503 }, + { 476239,6601091,-6152790,-9723375,17503545,-4863900,27672959,13403813,11052904,5219329 }, + }, +}, +{ + { + { 20678546,-8375738,-32671898,8849123,-5009758,14574752,31186971,-3973730,9014762,-8579056 }, + { -13644050,-10350239,-15962508,5075808,-1514661,-11534600,-33102500,9160280,8473550,-3256838 }, + { 24900749,14435722,17209120,-15292541,-22592275,9878983,-7689309,-16335821,-24568481,11788948 }, + }, + { + { -3118155,-11395194,-13802089,14797441,9652448,-6845904,-20037437,10410733,-24568470,-1458691 }, + { -15659161,16736706,-22467150,10215878,-9097177,7563911,11871841,-12505194,-18513325,8464118 }, + { -23400612,8348507,-14585951,-861714,-3950205,-6373419,14325289,8628612,33313881,-8370517 }, + }, + { + { -20186973,-4967935,22367356,5271547,-1097117,-4788838,-24805667,-10236854,-8940735,-5818269 }, + { -6948785,-1795212,-32625683,-16021179,32635414,-7374245,15989197,-12838188,28358192,-4253904 }, + { -23561781,-2799059,-32351682,-1661963,-9147719,10429267,-16637684,4072016,-5351664,5596589 }, + }, + { + { -28236598,-3390048,12312896,6213178,3117142,16078565,29266239,2557221,1768301,15373193 }, + { -7243358,-3246960,-4593467,-7553353,-127927,-912245,-1090902,-4504991,-24660491,3442910 }, + { -30210571,5124043,14181784,8197961,18964734,-11939093,22597931,7176455,-18585478,13365930 }, + }, + { + { -7877390,-1499958,8324673,4690079,6261860,890446,24538107,-8570186,-9689599,-3031667 }, + { 25008904,-10771599,-4305031,-9638010,16265036,15721635,683793,-11823784,15723479,-15163481 }, + { -9660625,12374379,-27006999,-7026148,-7724114,-12314514,11879682,5400171,519526,-1235876 }, + }, + { + { 22258397,-16332233,-7869817,14613016,-22520255,-2950923,-20353881,7315967,16648397,7605640 }, + { -8081308,-8464597,-8223311,9719710,19259459,-15348212,23994942,-5281555,-9468848,4763278 }, + { -21699244,9220969,-15730624,1084137,-25476107,-2852390,31088447,-7764523,-11356529,728112 }, + }, + { + { 26047220,-11751471,-6900323,-16521798,24092068,9158119,-4273545,-12555558,-29365436,-5498272 }, + { 17510331,-322857,5854289,8403524,17133918,-3112612,-28111007,12327945,10750447,10014012 }, + { -10312768,3936952,9156313,-8897683,16498692,-994647,-27481051,-666732,3424691,7540221 }, + }, + { + { 30322361,-6964110,11361005,-4143317,7433304,4989748,-7071422,-16317219,-9244265,15258046 }, + { 13054562,-2779497,19155474,469045,-12482797,4566042,5631406,2711395,1062915,-5136345 }, + { -19240248,-11254599,-29509029,-7499965,-5835763,13005411,-6066489,12194497,32960380,1459310 }, + }, +}, +{ + { + { 19852034,7027924,23669353,10020366,8586503,-6657907,394197,-6101885,18638003,-11174937 }, + { 31395534,15098109,26581030,8030562,-16527914,-5007134,9012486,-7584354,-6643087,-5442636 }, + { -9192165,-2347377,-1997099,4529534,25766844,607986,-13222,9677543,-32294889,-6456008 }, + }, + { + { -2444496,-149937,29348902,8186665,1873760,12489863,-30934579,-7839692,-7852844,-8138429 }, + { -15236356,-15433509,7766470,746860,26346930,-10221762,-27333451,10754588,-9431476,5203576 }, + { 31834314,14135496,-770007,5159118,20917671,-16768096,-7467973,-7337524,31809243,7347066 }, + }, + { + { -9606723,-11874240,20414459,13033986,13716524,-11691881,19797970,-12211255,15192876,-2087490 }, + { -12663563,-2181719,1168162,-3804809,26747877,-14138091,10609330,12694420,33473243,-13382104 }, + { 33184999,11180355,15832085,-11385430,-1633671,225884,15089336,-11023903,-6135662,14480053 }, + }, + { + { 31308717,-5619998,31030840,-1897099,15674547,-6582883,5496208,13685227,27595050,8737275 }, + { -20318852,-15150239,10933843,-16178022,8335352,-7546022,-31008351,-12610604,26498114,66511 }, + { 22644454,-8761729,-16671776,4884562,-3105614,-13559366,30540766,-4286747,-13327787,-7515095 }, + }, + { + { -28017847,9834845,18617207,-2681312,-3401956,-13307506,8205540,13585437,-17127465,15115439 }, + { 23711543,-672915,31206561,-8362711,6164647,-9709987,-33535882,-1426096,8236921,16492939 }, + { -23910559,-13515526,-26299483,-4503841,25005590,-7687270,19574902,10071562,6708380,-6222424 }, + }, + { + { 2101391,-4930054,19702731,2367575,-15427167,1047675,5301017,9328700,29955601,-11678310 }, + { 3096359,9271816,-21620864,-15521844,-14847996,-7592937,-25892142,-12635595,-9917575,6216608 }, + { -32615849,338663,-25195611,2510422,-29213566,-13820213,24822830,-6146567,-26767480,7525079 }, + }, + { + { -23066649,-13985623,16133487,-7896178,-3389565,778788,-910336,-2782495,-19386633,11994101 }, + { 21691500,-13624626,-641331,-14367021,3285881,-3483596,-25064666,9718258,-7477437,13381418 }, + { 18445390,-4202236,14979846,11622458,-1727110,-3582980,23111648,-6375247,28535282,15779576 }, + }, + { + { 30098053,3089662,-9234387,16662135,-21306940,11308411,-14068454,12021730,9955285,-16303356 }, + { 9734894,-14576830,-7473633,-9138735,2060392,11313496,-18426029,9924399,20194861,13380996 }, + { -26378102,-7965207,-22167821,15789297,-18055342,-6168792,-1984914,15707771,26342023,10146099 }, + }, +}, +{ + { + { -26016874,-219943,21339191,-41388,19745256,-2878700,-29637280,2227040,21612326,-545728 }, + { -13077387,1184228,23562814,-5970442,-20351244,-6348714,25764461,12243797,-20856566,11649658 }, + { -10031494,11262626,27384172,2271902,26947504,-15997771,39944,6114064,33514190,2333242 }, + }, + { + { -21433588,-12421821,8119782,7219913,-21830522,-9016134,-6679750,-12670638,24350578,-13450001 }, + { -4116307,-11271533,-23886186,4843615,-30088339,690623,-31536088,-10406836,8317860,12352766 }, + { 18200138,-14475911,-33087759,-2696619,-23702521,-9102511,-23552096,-2287550,20712163,6719373 }, + }, + { + { 26656208,6075253,-7858556,1886072,-28344043,4262326,11117530,-3763210,26224235,-3297458 }, + { -17168938,-14854097,-3395676,-16369877,-19954045,14050420,21728352,9493610,18620611,-16428628 }, + { -13323321,13325349,11432106,5964811,18609221,6062965,-5269471,-9725556,-30701573,-16479657 }, + }, + { + { -23860538,-11233159,26961357,1640861,-32413112,-16737940,12248509,-5240639,13735342,1934062 }, + { 25089769,6742589,17081145,-13406266,21909293,-16067981,-15136294,-3765346,-21277997,5473616 }, + { 31883677,-7961101,1083432,-11572403,22828471,13290673,-7125085,12469656,29111212,-5451014 }, + }, + { + { 24244947,-15050407,-26262976,2791540,-14997599,16666678,24367466,6388839,-10295587,452383 }, + { -25640782,-3417841,5217916,16224624,19987036,-4082269,-24236251,-5915248,15766062,8407814 }, + { -20406999,13990231,15495425,16395525,5377168,15166495,-8917023,-4388953,-8067909,2276718 }, + }, + { + { 30157918,12924066,-17712050,9245753,19895028,3368142,-23827587,5096219,22740376,-7303417 }, + { 2041139,-14256350,7783687,13876377,-25946985,-13352459,24051124,13742383,-15637599,13295222 }, + { 33338237,-8505733,12532113,7977527,9106186,-1715251,-17720195,-4612972,-4451357,-14669444 }, + }, + { + { -20045281,5454097,-14346548,6447146,28862071,1883651,-2469266,-4141880,7770569,9620597 }, + { 23208068,7979712,33071466,8149229,1758231,-10834995,30945528,-1694323,-33502340,-14767970 }, + { 1439958,-16270480,-1079989,-793782,4625402,10647766,-5043801,1220118,30494170,-11440799 }, + }, + { + { -5037580,-13028295,-2970559,-3061767,15640974,-6701666,-26739026,926050,-1684339,-13333647 }, + { 13908495,-3549272,30919928,-6273825,-21521863,7989039,9021034,9078865,3353509,4033511 }, + { -29663431,-15113610,32259991,-344482,24295849,-12912123,23161163,8839127,27485041,7356032 }, + }, +}, +{ + { + { 9661027,705443,11980065,-5370154,-1628543,14661173,-6346142,2625015,28431036,-16771834 }, + { -23839233,-8311415,-25945511,7480958,-17681669,-8354183,-22545972,14150565,15970762,4099461 }, + { 29262576,16756590,26350592,-8793563,8529671,-11208050,13617293,-9937143,11465739,8317062 }, + }, + { + { -25493081,-6962928,32500200,-9419051,-23038724,-2302222,14898637,3848455,20969334,-5157516 }, + { -20384450,-14347713,-18336405,13884722,-33039454,2842114,-21610826,-3649888,11177095,14989547 }, + { -24496721,-11716016,16959896,2278463,12066309,10137771,13515641,2581286,-28487508,9930240 }, + }, + { + { -17751622,-2097826,16544300,-13009300,-15914807,-14949081,18345767,-13403753,16291481,-5314038 }, + { -33229194,2553288,32678213,9875984,8534129,6889387,-9676774,6957617,4368891,9788741 }, + { 16660756,7281060,-10830758,12911820,20108584,-8101676,-21722536,-8613148,16250552,-11111103 }, + }, + { + { -19765507,2390526,-16551031,14161980,1905286,6414907,4689584,10604807,-30190403,4782747 }, + { -1354539,14736941,-7367442,-13292886,7710542,-14155590,-9981571,4383045,22546403,437323 }, + { 31665577,-12180464,-16186830,1491339,-18368625,3294682,27343084,2786261,-30633590,-14097016 }, + }, + { + { -14467279,-683715,-33374107,7448552,19294360,14334329,-19690631,2355319,-19284671,-6114373 }, + { 15121312,-15796162,6377020,-6031361,-10798111,-12957845,18952177,15496498,-29380133,11754228 }, + { -2637277,-13483075,8488727,-14303896,12728761,-1622493,7141596,11724556,22761615,-10134141 }, + }, + { + { 16918416,11729663,-18083579,3022987,-31015732,-13339659,-28741185,-12227393,32851222,11717399 }, + { 11166634,7338049,-6722523,4531520,-29468672,-7302055,31474879,3483633,-1193175,-4030831 }, + { -185635,9921305,31456609,-13536438,-12013818,13348923,33142652,6546660,-19985279,-3948376 }, + }, + { + { -32460596,11266712,-11197107,-7899103,31703694,3855903,-8537131,-12833048,-30772034,-15486313 }, + { -18006477,12709068,3991746,-6479188,-21491523,-10550425,-31135347,-16049879,10928917,3011958 }, + { -6957757,-15594337,31696059,334240,29576716,14796075,-30831056,-12805180,18008031,10258577 }, + }, + { + { -22448644,15655569,7018479,-4410003,-30314266,-1201591,-1853465,1367120,25127874,6671743 }, + { 29701166,-14373934,-10878120,9279288,-17568,13127210,21382910,11042292,25838796,4642684 }, + { -20430234,14955537,-24126347,8124619,-5369288,-5990470,30468147,-13900640,18423289,4177476 }, + }, +}, diff --git a/src/wraith/src/ext/ed25519/ref10/base.py b/src/wraith/src/ext/ed25519/ref10/base.py new file mode 100644 index 000000000..84accc858 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/base.py @@ -0,0 +1,65 @@ +b = 256 +q = 2**255 - 19 +l = 2**252 + 27742317777372353535851937790883648493 + +def expmod(b,e,m): + if e == 0: return 1 + t = expmod(b,e/2,m)**2 % m + if e & 1: t = (t*b) % m + return t + +def inv(x): + return expmod(x,q-2,q) + +d = -121665 * inv(121666) +I = expmod(2,(q-1)/4,q) + +def xrecover(y): + xx = (y*y-1) * inv(d*y*y+1) + x = expmod(xx,(q+3)/8,q) + if (x*x - xx) % q != 0: x = (x*I) % q + if x % 2 != 0: x = q-x + return x + +By = 4 * inv(5) +Bx = xrecover(By) +B = [Bx % q,By % q] + +def edwards(P,Q): + x1 = P[0] + y1 = P[1] + x2 = Q[0] + y2 = Q[1] + x3 = (x1*y2+x2*y1) * inv(1+d*x1*x2*y1*y2) + y3 = (y1*y2+x1*x2) * inv(1-d*x1*x2*y1*y2) + return [x3 % q,y3 % q] + +def radix255(x): + x = x % q + if x + x > q: x -= q + x = [x,0,0,0,0,0,0,0,0,0] + bits = [26,25,26,25,26,25,26,25,26,25] + for i in range(9): + carry = (x[i] + 2**(bits[i]-1)) / 2**bits[i] + x[i] -= carry * 2**bits[i] + x[i + 1] += carry + result = "" + for i in range(9): + result = result+str(x[i])+"," + result = result+str(x[9]) + return result + +Bi = B +for i in range(32): + print "{" + Bij = Bi + for j in range(8): + print " {" + print " {",radix255(Bij[1]+Bij[0]),"}," + print " {",radix255(Bij[1]-Bij[0]),"}," + print " {",radix255(2*d*Bij[0]*Bij[1]),"}," + Bij = edwards(Bij,Bi) + print " }," + print "}," + for k in range(8): + Bi = edwards(Bi,Bi) diff --git a/src/wraith/src/ext/ed25519/ref10/base2.h b/src/wraith/src/ext/ed25519/ref10/base2.h new file mode 100644 index 000000000..8c538440f --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/base2.h @@ -0,0 +1,40 @@ + { + { 25967493,-14356035,29566456,3660896,-12694345,4014787,27544626,-11754271,-6079156,2047605 }, + { -12545711,934262,-2722910,3049990,-727428,9406986,12720692,5043384,19500929,-15469378 }, + { -8738181,4489570,9688441,-14785194,10184609,-12363380,29287919,11864899,-24514362,-4438546 }, + }, + { + { 15636291,-9688557,24204773,-7912398,616977,-16685262,27787600,-14772189,28944400,-1550024 }, + { 16568933,4717097,-11556148,-1102322,15682896,-11807043,16354577,-11775962,7689662,11199574 }, + { 30464156,-5976125,-11779434,-15670865,23220365,15915852,7512774,10017326,-17749093,-9920357 }, + }, + { + { 10861363,11473154,27284546,1981175,-30064349,12577861,32867885,14515107,-15438304,10819380 }, + { 4708026,6336745,20377586,9066809,-11272109,6594696,-25653668,12483688,-12668491,5581306 }, + { 19563160,16186464,-29386857,4097519,10237984,-4348115,28542350,13850243,-23678021,-15815942 }, + }, + { + { 5153746,9909285,1723747,-2777874,30523605,5516873,19480852,5230134,-23952439,-15175766 }, + { -30269007,-3463509,7665486,10083793,28475525,1649722,20654025,16520125,30598449,7715701 }, + { 28881845,14381568,9657904,3680757,-20181635,7843316,-31400660,1370708,29794553,-1409300 }, + }, + { + { -22518993,-6692182,14201702,-8745502,-23510406,8844726,18474211,-1361450,-13062696,13821877 }, + { -6455177,-7839871,3374702,-4740862,-27098617,-10571707,31655028,-7212327,18853322,-14220951 }, + { 4566830,-12963868,-28974889,-12240689,-7602672,-2830569,-8514358,-10431137,2207753,-3209784 }, + }, + { + { -25154831,-4185821,29681144,7868801,-6854661,-9423865,-12437364,-663000,-31111463,-16132436 }, + { 25576264,-2703214,7349804,-11814844,16472782,9300885,3844789,15725684,171356,6466918 }, + { 23103977,13316479,9739013,-16149481,817875,-15038942,8965339,-14088058,-30714912,16193877 }, + }, + { + { -33521811,3180713,-2394130,14003687,-16903474,-16270840,17238398,4729455,-18074513,9256800 }, + { -25182317,-4174131,32336398,5036987,-21236817,11360617,22616405,9761698,-19827198,630305 }, + { -13720693,2639453,-24237460,-7406481,9494427,-5774029,-6554551,-15960994,-2449256,-14291300 }, + }, + { + { -3151181,-5046075,9282714,6866145,-31907062,-863023,-18940575,15033784,25105118,-7894876 }, + { -24326370,15950226,-31801215,-14592823,-11662737,-5090925,1573892,-2625887,2198790,-15804619 }, + { -3099351,10324967,-2241613,7453183,-5446979,-2735503,-13812022,-16236442,-32461234,-12290683 }, + }, diff --git a/src/wraith/src/ext/ed25519/ref10/base2.py b/src/wraith/src/ext/ed25519/ref10/base2.py new file mode 100644 index 000000000..5e4e8739d --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/base2.py @@ -0,0 +1,60 @@ +b = 256 +q = 2**255 - 19 +l = 2**252 + 27742317777372353535851937790883648493 + +def expmod(b,e,m): + if e == 0: return 1 + t = expmod(b,e/2,m)**2 % m + if e & 1: t = (t*b) % m + return t + +def inv(x): + return expmod(x,q-2,q) + +d = -121665 * inv(121666) +I = expmod(2,(q-1)/4,q) + +def xrecover(y): + xx = (y*y-1) * inv(d*y*y+1) + x = expmod(xx,(q+3)/8,q) + if (x*x - xx) % q != 0: x = (x*I) % q + if x % 2 != 0: x = q-x + return x + +By = 4 * inv(5) +Bx = xrecover(By) +B = [Bx % q,By % q] + +def edwards(P,Q): + x1 = P[0] + y1 = P[1] + x2 = Q[0] + y2 = Q[1] + x3 = (x1*y2+x2*y1) * inv(1+d*x1*x2*y1*y2) + y3 = (y1*y2+x1*x2) * inv(1-d*x1*x2*y1*y2) + return [x3 % q,y3 % q] + +def radix255(x): + x = x % q + if x + x > q: x -= q + x = [x,0,0,0,0,0,0,0,0,0] + bits = [26,25,26,25,26,25,26,25,26,25] + for i in range(9): + carry = (x[i] + 2**(bits[i]-1)) / 2**bits[i] + x[i] -= carry * 2**bits[i] + x[i + 1] += carry + result = "" + for i in range(9): + result = result+str(x[i])+"," + result = result+str(x[9]) + return result + +Bi = B + +for i in range(8): + print " {" + print " {",radix255(Bi[1]+Bi[0]),"}," + print " {",radix255(Bi[1]-Bi[0]),"}," + print " {",radix255(2*d*Bi[0]*Bi[1]),"}," + print " }," + Bi = edwards(B,edwards(B,Bi)) diff --git a/src/wraith/src/ext/ed25519/ref10/blinding.c b/src/wraith/src/ext/ed25519/ref10/blinding.c new file mode 100644 index 000000000..a3b32fa80 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/blinding.c @@ -0,0 +1,119 @@ +/* Added to ref10 for Tor. We place this in the public domain. Alternatively, + * you may have it under the Creative Commons 0 "CC0" license. */ +//#include "fe.h" +#include "ge.h" +#include "sc.h" +#include "crypto_hash_sha512.h" +#include "ed25519_ref10.h" + +#include +#include "crypto.h" + +static void +ed25519_ref10_gettweak(unsigned char *out, const unsigned char *param) +{ + memcpy(out, param, 32); + + out[0] &= 248; /* Is this necessary necessary ? */ + out[31] &= 63; + out[31] |= 64; +} + +int ed25519_ref10_blind_secret_key(unsigned char *out, + const unsigned char *inp, + const unsigned char *param) +{ + const char str[] = "Derive temporary signing key hash input"; + unsigned char tweak[64]; + unsigned char zero[32]; + ed25519_ref10_gettweak(tweak, param); + + memset(zero, 0, 32); + sc_muladd(out, inp, tweak, zero); + + crypto_hash_sha512_2(tweak, (const unsigned char *)str, strlen(str), + inp+32, 32); + memcpy(out+32, tweak, 32); + + memwipe(tweak, 0, sizeof(tweak)); + + return 0; +} + +int ed25519_ref10_blind_public_key(unsigned char *out, + const unsigned char *inp, + const unsigned char *param) +{ + unsigned char tweak[64]; + unsigned char zero[32]; + unsigned char pkcopy[32]; + ge_p3 A; + ge_p2 Aprime; + int retval = -1; + + ed25519_ref10_gettweak(tweak, param); + + memset(zero, 0, sizeof(zero)); + /* Not the greatest implementation of all of this. I wish I had + * better-suited primitives to work with here... (but I don't wish that so + * strongly that I'm about to code my own ge_scalarmult_vartime). */ + + /* We negate the public key first, so that we can pass it to + * frombytes_negate_vartime, which negates it again. If there were a + * "ge_frombytes", we'd use that, but there isn't. */ + memcpy(pkcopy, inp, 32); + pkcopy[31] ^= (1<<7); + if (ge_frombytes_negate_vartime(&A, pkcopy) != 0) { + goto done; + } + /* There isn't a regular ge_scalarmult -- we have to do tweak*A + zero*B. */ + ge_double_scalarmult_vartime(&Aprime, tweak, &A, zero); + ge_tobytes(out, &Aprime); + + retval = 0; + + done: + memwipe(tweak, 0, sizeof(tweak)); + memwipe(&A, 0, sizeof(A)); + memwipe(&Aprime, 0, sizeof(Aprime)); + memwipe(pkcopy, 0, sizeof(pkcopy)); + + return retval; +} + +/* This is the group order encoded in a format that + * ge_double_scalarmult_vartime() understands. The group order m is: + * m = 2^252 + 27742317777372353535851937790883648493 = + * 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed + */ +static const uint8_t modm_m[32] = {0xed,0xd3,0xf5,0x5c,0x1a,0x63,0x12,0x58, + 0xd6,0x9c,0xf7,0xa2,0xde,0xf9,0xde,0x14, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10}; + +/* Do the scalar multiplication of pubkey with the group order + * modm_m. Place the result in out which must be at least 32 + * bytes long. */ +int +ed25519_ref10_scalarmult_with_group_order(unsigned char *out, + const unsigned char *pubkey) +{ + unsigned char pkcopy[32]; + unsigned char zero[32] = {0}; + ge_p3 Point; + ge_p2 Result; + + /* All this is done to fit 'pubkey' in 'Point' so that it can be used by + * ed25519 ref code. Same thing as in blinding function */ + memcpy(pkcopy, pubkey, 32); + pkcopy[31] ^= (1<<7); + if (ge_frombytes_negate_vartime(&Point, pkcopy) != 0) { + return -1; /* error: bail out */ + } + + /* There isn't a regular scalarmult -- we have to do r = l*P + 0*B */ + ge_double_scalarmult_vartime(&Result, modm_m, &Point, zero); + ge_tobytes(out, &Result); + + return 0; +} diff --git a/src/wraith/src/ext/ed25519/ref10/crypto_hash_sha512.h b/src/wraith/src/ext/ed25519/ref10/crypto_hash_sha512.h new file mode 100644 index 000000000..5dad935c7 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/crypto_hash_sha512.h @@ -0,0 +1,32 @@ +/* Added for Tor. */ +#include "crypto.h" + +/* Set 'out' to the 512-bit SHA512 hash of the 'len'-byte string in 'inp' */ +#define crypto_hash_sha512(out, inp, len) \ + crypto_digest512((char *)(out), (const char *)(inp), (len), DIGEST_SHA512) + +/* Set 'out' to the 512-bit SHA512 hash of the 'len1'-byte string in 'inp1', + * concatenated with the 'len2'-byte string in 'inp2'. */ +#define crypto_hash_sha512_2(out, inp1, len1, inp2, len2) \ + do { \ + crypto_digest_t *sha_ctx_; \ + sha_ctx_ = crypto_digest512_new(DIGEST_SHA512); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp1), (len1)); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp2), (len2)); \ + crypto_digest_get_digest(sha_ctx_, (char *)out, DIGEST512_LEN); \ + crypto_digest_free(sha_ctx_); \ + } while (0) + +/* Set 'out' to the 512-bit SHA512 hash of the 'len1'-byte string in 'inp1', + * concatenated with the 'len2'-byte string in 'inp2', concatenated with + * the 'len3'-byte string in 'len3'. */ +#define crypto_hash_sha512_3(out, inp1, len1, inp2, len2, inp3, len3) \ + do { \ + crypto_digest_t *sha_ctx_; \ + sha_ctx_ = crypto_digest512_new(DIGEST_SHA512); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp1), (len1)); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp2), (len2)); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp3), (len3)); \ + crypto_digest_get_digest(sha_ctx_, (char *)out, DIGEST512_LEN); \ + crypto_digest_free(sha_ctx_); \ + } while(0) diff --git a/src/wraith/src/ext/ed25519/ref10/crypto_int32.h b/src/wraith/src/ext/ed25519/ref10/crypto_int32.h new file mode 100644 index 000000000..dd13c91bd --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/crypto_int32.h @@ -0,0 +1,25 @@ +/* Added for Tor. */ + +#ifndef CRYPTO_INT32_H +#define CRYPTO_INT32_H + +#include "torint.h" +#define crypto_int32 int32_t +#define crypto_uint32 uint32_t + +/* + Stop signed left shifts overflowing + by using unsigned types for bitwise operations + */ + +#ifndef OVERFLOW_SAFE_SIGNED_LSHIFT +#define OVERFLOW_SAFE_SIGNED_LSHIFT(s, lshift, utype, stype) \ + ((stype)((utype)(s) << (utype)(lshift))) +#endif + +#define SHL32(s, lshift) \ + OVERFLOW_SAFE_SIGNED_LSHIFT(s, lshift, crypto_uint32, crypto_int32) +#define SHL8(s, lshift) \ + OVERFLOW_SAFE_SIGNED_LSHIFT(s, lshift, unsigned char, signed char) + +#endif /* CRYPTO_INT32_H */ diff --git a/src/wraith/src/ext/ed25519/ref10/crypto_int64.h b/src/wraith/src/ext/ed25519/ref10/crypto_int64.h new file mode 100644 index 000000000..46e8852ed --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/crypto_int64.h @@ -0,0 +1,23 @@ +/* Added for Tor. */ + +#ifndef CRYPTO_INT64_H +#define CRYPTO_INT64_H + +#include "torint.h" +#define crypto_int64 int64_t +#define crypto_uint64 uint64_t + +/* + Stop signed left shifts overflowing + by using unsigned types for bitwise operations + */ + +#ifndef OVERFLOW_SAFE_SIGNED_LSHIFT +#define OVERFLOW_SAFE_SIGNED_LSHIFT(s, lshift, utype, stype) \ + ((stype)((utype)(s) << (utype)(lshift))) +#endif + +#define SHL64(s, lshift) \ + OVERFLOW_SAFE_SIGNED_LSHIFT(s, lshift, crypto_uint64, crypto_int64) + +#endif /* CRYPTO_INT64_H */ diff --git a/src/wraith/src/ext/ed25519/ref10/crypto_sign.h b/src/wraith/src/ext/ed25519/ref10/crypto_sign.h new file mode 100644 index 000000000..549626793 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/crypto_sign.h @@ -0,0 +1,9 @@ +/* Added for Tor */ +#define crypto_sign ed25519_ref10_sign +#define crypto_sign_keypair ed25519_ref10_keygen +#define crypto_sign_seckey ed25519_ref10_seckey +#define crypto_sign_seckey_expand ed25519_ref10_seckey_expand +#define crypto_sign_pubkey ed25519_ref10_pubkey +#define crypto_sign_open ed25519_ref10_open + +#include "ed25519_ref10.h" diff --git a/src/wraith/src/ext/ed25519/ref10/crypto_uint32.h b/src/wraith/src/ext/ed25519/ref10/crypto_uint32.h new file mode 100644 index 000000000..62655a5b6 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/crypto_uint32.h @@ -0,0 +1,3 @@ +/* Added for Tor. */ +#include "torint.h" +#define crypto_uint32 uint32_t diff --git a/src/wraith/src/ext/ed25519/ref10/crypto_uint64.h b/src/wraith/src/ext/ed25519/ref10/crypto_uint64.h new file mode 100644 index 000000000..cbda882a6 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/crypto_uint64.h @@ -0,0 +1,3 @@ +/* Added for Tor. */ +#include "torint.h" +#define crypto_uint64 uint64_t diff --git a/src/wraith/src/ext/ed25519/ref10/crypto_verify_32.h b/src/wraith/src/ext/ed25519/ref10/crypto_verify_32.h new file mode 100644 index 000000000..0f63efc7a --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/crypto_verify_32.h @@ -0,0 +1,5 @@ +/* Added for Tor. */ +#include "di_ops.h" +#define crypto_verify_32(a,b) \ + (! tor_memeq((a), (b), 32)) + diff --git a/src/wraith/src/ext/ed25519/ref10/d.h b/src/wraith/src/ext/ed25519/ref10/d.h new file mode 100644 index 000000000..e25f57835 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/d.h @@ -0,0 +1 @@ +-10913610,13857413,-15372611,6949391,114729,-8787816,-6275908,-3247719,-18696448,-12055116 diff --git a/src/wraith/src/ext/ed25519/ref10/d.py b/src/wraith/src/ext/ed25519/ref10/d.py new file mode 100644 index 000000000..8995bb86a --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/d.py @@ -0,0 +1,28 @@ +q = 2**255 - 19 + +def expmod(b,e,m): + if e == 0: return 1 + t = expmod(b,e/2,m)**2 % m + if e & 1: t = (t*b) % m + return t + +def inv(x): + return expmod(x,q-2,q) + +def radix255(x): + x = x % q + if x + x > q: x -= q + x = [x,0,0,0,0,0,0,0,0,0] + bits = [26,25,26,25,26,25,26,25,26,25] + for i in range(9): + carry = (x[i] + 2**(bits[i]-1)) / 2**bits[i] + x[i] -= carry * 2**bits[i] + x[i + 1] += carry + result = "" + for i in range(9): + result = result+str(x[i])+"," + result = result+str(x[9]) + return result + +d = -121665 * inv(121666) +print radix255(d) diff --git a/src/wraith/src/ext/ed25519/ref10/d2.h b/src/wraith/src/ext/ed25519/ref10/d2.h new file mode 100644 index 000000000..01aaec751 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/d2.h @@ -0,0 +1 @@ +-21827239,-5839606,-30745221,13898782,229458,15978800,-12551817,-6495438,29715968,9444199 diff --git a/src/wraith/src/ext/ed25519/ref10/d2.py b/src/wraith/src/ext/ed25519/ref10/d2.py new file mode 100644 index 000000000..79841758b --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/d2.py @@ -0,0 +1,28 @@ +q = 2**255 - 19 + +def expmod(b,e,m): + if e == 0: return 1 + t = expmod(b,e/2,m)**2 % m + if e & 1: t = (t*b) % m + return t + +def inv(x): + return expmod(x,q-2,q) + +def radix255(x): + x = x % q + if x + x > q: x -= q + x = [x,0,0,0,0,0,0,0,0,0] + bits = [26,25,26,25,26,25,26,25,26,25] + for i in range(9): + carry = (x[i] + 2**(bits[i]-1)) / 2**bits[i] + x[i] -= carry * 2**bits[i] + x[i + 1] += carry + result = "" + for i in range(9): + result = result+str(x[i])+"," + result = result+str(x[9]) + return result + +d = -121665 * inv(121666) +print radix255(d*2) diff --git a/src/wraith/src/ext/ed25519/ref10/ed25519_ref10.h b/src/wraith/src/ext/ed25519/ref10/ed25519_ref10.h new file mode 100644 index 000000000..596569497 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ed25519_ref10.h @@ -0,0 +1,34 @@ +/* Added for Tor */ +#ifndef SRC_EXT_ED25519_REF10_H_INCLUDED_ +#define SRC_EXT_ED25519_REF10_H_INCLUDED_ +#include + +int ed25519_ref10_seckey(unsigned char *sk); +int ed25519_ref10_seckey_expand(unsigned char *sk, const unsigned char *sk_seed); +int ed25519_ref10_pubkey(unsigned char *pk,const unsigned char *sk); +int ed25519_ref10_keygen(unsigned char *pk,unsigned char *sk); +int ed25519_ref10_open( + const unsigned char *signature, + const unsigned char *m, size_t mlen, + const unsigned char *pk); +int ed25519_ref10_sign( + unsigned char *sig, + const unsigned char *m, size_t mlen, + const unsigned char *sk, const unsigned char *pk); + +/* Added in Tor */ +int ed25519_ref10_pubkey_from_curve25519_pubkey(unsigned char *out, + const unsigned char *inp, + int signbit); +int ed25519_ref10_blind_secret_key(unsigned char *out, + const unsigned char *inp, + const unsigned char *param); +int ed25519_ref10_blind_public_key(unsigned char *out, + const unsigned char *inp, + const unsigned char *param); + +int +ed25519_ref10_scalarmult_with_group_order(unsigned char *out, + const unsigned char *pubkey); + +#endif diff --git a/src/wraith/src/ext/ed25519/ref10/fe.h b/src/wraith/src/ext/ed25519/ref10/fe.h new file mode 100644 index 000000000..60c308ba4 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe.h @@ -0,0 +1,56 @@ +#ifndef FE_H +#define FE_H + +#include "crypto_int32.h" + +typedef crypto_int32 fe[10]; + +/* +fe means field element. +Here the field is \Z/(2^255-19). +An element t, entries t[0]...t[9], represents the integer +t[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9]. +Bounds on each t[i] vary depending on context. +*/ + +#define fe_frombytes crypto_sign_ed25519_ref10_fe_frombytes +#define fe_tobytes crypto_sign_ed25519_ref10_fe_tobytes +#define fe_copy crypto_sign_ed25519_ref10_fe_copy +#define fe_isnonzero crypto_sign_ed25519_ref10_fe_isnonzero +#define fe_isnegative crypto_sign_ed25519_ref10_fe_isnegative +#define fe_0 crypto_sign_ed25519_ref10_fe_0 +#define fe_1 crypto_sign_ed25519_ref10_fe_1 +#define fe_cswap crypto_sign_ed25519_ref10_fe_cswap +#define fe_cmov crypto_sign_ed25519_ref10_fe_cmov +#define fe_add crypto_sign_ed25519_ref10_fe_add +#define fe_sub crypto_sign_ed25519_ref10_fe_sub +#define fe_neg crypto_sign_ed25519_ref10_fe_neg +#define fe_mul crypto_sign_ed25519_ref10_fe_mul +#define fe_sq crypto_sign_ed25519_ref10_fe_sq +#define fe_sq2 crypto_sign_ed25519_ref10_fe_sq2 +#define fe_mul121666 crypto_sign_ed25519_ref10_fe_mul121666 +#define fe_invert crypto_sign_ed25519_ref10_fe_invert +#define fe_pow22523 crypto_sign_ed25519_ref10_fe_pow22523 + +extern void fe_frombytes(fe,const unsigned char *); +extern void fe_tobytes(unsigned char *,const fe); + +extern void fe_copy(fe,const fe); +extern int fe_isnonzero(const fe); +extern int fe_isnegative(const fe); +extern void fe_0(fe); +extern void fe_1(fe); +extern void fe_cswap(fe,fe,unsigned int); +extern void fe_cmov(fe,const fe,unsigned int); + +extern void fe_add(fe,const fe,const fe); +extern void fe_sub(fe,const fe,const fe); +extern void fe_neg(fe,const fe); +extern void fe_mul(fe,const fe,const fe); +extern void fe_sq(fe,const fe); +extern void fe_sq2(fe,const fe); +extern void fe_mul121666(fe,const fe); +extern void fe_invert(fe,const fe); +extern void fe_pow22523(fe,const fe); + +#endif diff --git a/src/wraith/src/ext/ed25519/ref10/fe_0.c b/src/wraith/src/ext/ed25519/ref10/fe_0.c new file mode 100644 index 000000000..ec879d733 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_0.c @@ -0,0 +1,19 @@ +#include "fe.h" + +/* +h = 0 +*/ + +void fe_0(fe h) +{ + h[0] = 0; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_1.c b/src/wraith/src/ext/ed25519/ref10/fe_1.c new file mode 100644 index 000000000..8cf778484 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_1.c @@ -0,0 +1,19 @@ +#include "fe.h" + +/* +h = 1 +*/ + +void fe_1(fe h) +{ + h[0] = 1; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_add.c b/src/wraith/src/ext/ed25519/ref10/fe_add.c new file mode 100644 index 000000000..e6a81da20 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_add.c @@ -0,0 +1,57 @@ +#include "fe.h" + +/* +h = f + g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +void fe_add(fe h,const fe f,const fe g) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 h0 = f0 + g0; + crypto_int32 h1 = f1 + g1; + crypto_int32 h2 = f2 + g2; + crypto_int32 h3 = f3 + g3; + crypto_int32 h4 = f4 + g4; + crypto_int32 h5 = f5 + g5; + crypto_int32 h6 = f6 + g6; + crypto_int32 h7 = f7 + g7; + crypto_int32 h8 = f8 + g8; + crypto_int32 h9 = f9 + g9; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_cmov.c b/src/wraith/src/ext/ed25519/ref10/fe_cmov.c new file mode 100644 index 000000000..8ca584fb1 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_cmov.c @@ -0,0 +1,63 @@ +#include "fe.h" + +/* +Replace (f,g) with (g,g) if b == 1; +replace (f,g) with (f,g) if b == 0. + +Preconditions: b in {0,1}. +*/ + +void fe_cmov(fe f,const fe g,unsigned int b) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 x0 = f0 ^ g0; + crypto_int32 x1 = f1 ^ g1; + crypto_int32 x2 = f2 ^ g2; + crypto_int32 x3 = f3 ^ g3; + crypto_int32 x4 = f4 ^ g4; + crypto_int32 x5 = f5 ^ g5; + crypto_int32 x6 = f6 ^ g6; + crypto_int32 x7 = f7 ^ g7; + crypto_int32 x8 = f8 ^ g8; + crypto_int32 x9 = f9 ^ g9; + b = -b; + x0 &= b; + x1 &= b; + x2 &= b; + x3 &= b; + x4 &= b; + x5 &= b; + x6 &= b; + x7 &= b; + x8 &= b; + x9 &= b; + f[0] = f0 ^ x0; + f[1] = f1 ^ x1; + f[2] = f2 ^ x2; + f[3] = f3 ^ x3; + f[4] = f4 ^ x4; + f[5] = f5 ^ x5; + f[6] = f6 ^ x6; + f[7] = f7 ^ x7; + f[8] = f8 ^ x8; + f[9] = f9 ^ x9; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_copy.c b/src/wraith/src/ext/ed25519/ref10/fe_copy.c new file mode 100644 index 000000000..9c5bf865a --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_copy.c @@ -0,0 +1,29 @@ +#include "fe.h" + +/* +h = f +*/ + +void fe_copy(fe h,const fe f) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + h[0] = f0; + h[1] = f1; + h[2] = f2; + h[3] = f3; + h[4] = f4; + h[5] = f5; + h[6] = f6; + h[7] = f7; + h[8] = f8; + h[9] = f9; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_frombytes.c b/src/wraith/src/ext/ed25519/ref10/fe_frombytes.c new file mode 100644 index 000000000..98b8e5f7c --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_frombytes.c @@ -0,0 +1,73 @@ +#include "fe.h" +#include "crypto_int64.h" +#include "crypto_uint64.h" + +static crypto_uint64 load_3(const unsigned char *in) +{ + crypto_uint64 result; + result = (crypto_uint64) in[0]; + result |= ((crypto_uint64) in[1]) << 8; + result |= ((crypto_uint64) in[2]) << 16; + return result; +} + +static crypto_uint64 load_4(const unsigned char *in) +{ + crypto_uint64 result; + result = (crypto_uint64) in[0]; + result |= ((crypto_uint64) in[1]) << 8; + result |= ((crypto_uint64) in[2]) << 16; + result |= ((crypto_uint64) in[3]) << 24; + return result; +} + +/* +Ignores top bit of h. +*/ + +void fe_frombytes(fe h,const unsigned char *s) +{ + crypto_int64 h0 = load_4(s); + crypto_int64 h1 = load_3(s + 4) << 6; + crypto_int64 h2 = load_3(s + 7) << 5; + crypto_int64 h3 = load_3(s + 10) << 3; + crypto_int64 h4 = load_3(s + 13) << 2; + crypto_int64 h5 = load_4(s + 16); + crypto_int64 h6 = load_3(s + 20) << 7; + crypto_int64 h7 = load_3(s + 23) << 5; + crypto_int64 h8 = load_3(s + 26) << 4; + crypto_int64 h9 = (load_3(s + 29) & 8388607) << 2; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= SHL64(carry9,25); + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= SHL64(carry1,25); + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= SHL64(carry3,25); + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= SHL64(carry5,25); + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= SHL64(carry7,25); + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= SHL64(carry2,26); + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= SHL64(carry6,26); + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= SHL64(carry8,26); + + h[0] = (crypto_int32) h0; + h[1] = (crypto_int32) h1; + h[2] = (crypto_int32) h2; + h[3] = (crypto_int32) h3; + h[4] = (crypto_int32) h4; + h[5] = (crypto_int32) h5; + h[6] = (crypto_int32) h6; + h[7] = (crypto_int32) h7; + h[8] = (crypto_int32) h8; + h[9] = (crypto_int32) h9; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_invert.c b/src/wraith/src/ext/ed25519/ref10/fe_invert.c new file mode 100644 index 000000000..bcfdb8ff8 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_invert.c @@ -0,0 +1,14 @@ +#include "fe.h" + +void fe_invert(fe out,const fe z) +{ + fe t0; + fe t1; + fe t2; + fe t3; + int i; + +#include "pow225521.h" + + return; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_isnegative.c b/src/wraith/src/ext/ed25519/ref10/fe_isnegative.c new file mode 100644 index 000000000..3b2c8b8d5 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_isnegative.c @@ -0,0 +1,16 @@ +#include "fe.h" + +/* +return 1 if f is in {1,3,5,...,q-2} +return 0 if f is in {0,2,4,...,q-1} + +Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +int fe_isnegative(const fe f) +{ + unsigned char s[32]; + fe_tobytes(s,f); + return s[0] & 1; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_isnonzero.c b/src/wraith/src/ext/ed25519/ref10/fe_isnonzero.c new file mode 100644 index 000000000..47568001c --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_isnonzero.c @@ -0,0 +1,19 @@ +#include "fe.h" +#include "crypto_verify_32.h" + +/* +return 1 if f == 0 +return 0 if f != 0 + +Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +static const unsigned char zero[32]; + +int fe_isnonzero(const fe f) +{ + unsigned char s[32]; + fe_tobytes(s,f); + return crypto_verify_32(s,zero); +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_mul.c b/src/wraith/src/ext/ed25519/ref10/fe_mul.c new file mode 100644 index 000000000..ace63e64c --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_mul.c @@ -0,0 +1,253 @@ +#include "fe.h" +#include "crypto_int64.h" + +/* +h = f * g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +Notes on implementation strategy: + +Using schoolbook multiplication. +Karatsuba would save a little in some cost models. + +Most multiplications by 2 and 19 are 32-bit precomputations; +cheaper than 64-bit postcomputations. + +There is one remaining multiplication by 19 in the carry chain; +one *19 precomputation can be merged into this, +but the resulting data flow is considerably less clean. + +There are 12 carries below. +10 of them are 2-way parallelizable and vectorizable. +Can get away with 11 carries, but then data flow is much deeper. + +With tighter constraints on inputs can squeeze carries into int32. +*/ + +void fe_mul(fe h,const fe f,const fe g) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 g1_19 = 19 * g1; /* 1.959375*2^29 */ + crypto_int32 g2_19 = 19 * g2; /* 1.959375*2^30; still ok */ + crypto_int32 g3_19 = 19 * g3; + crypto_int32 g4_19 = 19 * g4; + crypto_int32 g5_19 = 19 * g5; + crypto_int32 g6_19 = 19 * g6; + crypto_int32 g7_19 = 19 * g7; + crypto_int32 g8_19 = 19 * g8; + crypto_int32 g9_19 = 19 * g9; + crypto_int32 f1_2 = 2 * f1; + crypto_int32 f3_2 = 2 * f3; + crypto_int32 f5_2 = 2 * f5; + crypto_int32 f7_2 = 2 * f7; + crypto_int32 f9_2 = 2 * f9; + crypto_int64 f0g0 = f0 * (crypto_int64) g0; + crypto_int64 f0g1 = f0 * (crypto_int64) g1; + crypto_int64 f0g2 = f0 * (crypto_int64) g2; + crypto_int64 f0g3 = f0 * (crypto_int64) g3; + crypto_int64 f0g4 = f0 * (crypto_int64) g4; + crypto_int64 f0g5 = f0 * (crypto_int64) g5; + crypto_int64 f0g6 = f0 * (crypto_int64) g6; + crypto_int64 f0g7 = f0 * (crypto_int64) g7; + crypto_int64 f0g8 = f0 * (crypto_int64) g8; + crypto_int64 f0g9 = f0 * (crypto_int64) g9; + crypto_int64 f1g0 = f1 * (crypto_int64) g0; + crypto_int64 f1g1_2 = f1_2 * (crypto_int64) g1; + crypto_int64 f1g2 = f1 * (crypto_int64) g2; + crypto_int64 f1g3_2 = f1_2 * (crypto_int64) g3; + crypto_int64 f1g4 = f1 * (crypto_int64) g4; + crypto_int64 f1g5_2 = f1_2 * (crypto_int64) g5; + crypto_int64 f1g6 = f1 * (crypto_int64) g6; + crypto_int64 f1g7_2 = f1_2 * (crypto_int64) g7; + crypto_int64 f1g8 = f1 * (crypto_int64) g8; + crypto_int64 f1g9_38 = f1_2 * (crypto_int64) g9_19; + crypto_int64 f2g0 = f2 * (crypto_int64) g0; + crypto_int64 f2g1 = f2 * (crypto_int64) g1; + crypto_int64 f2g2 = f2 * (crypto_int64) g2; + crypto_int64 f2g3 = f2 * (crypto_int64) g3; + crypto_int64 f2g4 = f2 * (crypto_int64) g4; + crypto_int64 f2g5 = f2 * (crypto_int64) g5; + crypto_int64 f2g6 = f2 * (crypto_int64) g6; + crypto_int64 f2g7 = f2 * (crypto_int64) g7; + crypto_int64 f2g8_19 = f2 * (crypto_int64) g8_19; + crypto_int64 f2g9_19 = f2 * (crypto_int64) g9_19; + crypto_int64 f3g0 = f3 * (crypto_int64) g0; + crypto_int64 f3g1_2 = f3_2 * (crypto_int64) g1; + crypto_int64 f3g2 = f3 * (crypto_int64) g2; + crypto_int64 f3g3_2 = f3_2 * (crypto_int64) g3; + crypto_int64 f3g4 = f3 * (crypto_int64) g4; + crypto_int64 f3g5_2 = f3_2 * (crypto_int64) g5; + crypto_int64 f3g6 = f3 * (crypto_int64) g6; + crypto_int64 f3g7_38 = f3_2 * (crypto_int64) g7_19; + crypto_int64 f3g8_19 = f3 * (crypto_int64) g8_19; + crypto_int64 f3g9_38 = f3_2 * (crypto_int64) g9_19; + crypto_int64 f4g0 = f4 * (crypto_int64) g0; + crypto_int64 f4g1 = f4 * (crypto_int64) g1; + crypto_int64 f4g2 = f4 * (crypto_int64) g2; + crypto_int64 f4g3 = f4 * (crypto_int64) g3; + crypto_int64 f4g4 = f4 * (crypto_int64) g4; + crypto_int64 f4g5 = f4 * (crypto_int64) g5; + crypto_int64 f4g6_19 = f4 * (crypto_int64) g6_19; + crypto_int64 f4g7_19 = f4 * (crypto_int64) g7_19; + crypto_int64 f4g8_19 = f4 * (crypto_int64) g8_19; + crypto_int64 f4g9_19 = f4 * (crypto_int64) g9_19; + crypto_int64 f5g0 = f5 * (crypto_int64) g0; + crypto_int64 f5g1_2 = f5_2 * (crypto_int64) g1; + crypto_int64 f5g2 = f5 * (crypto_int64) g2; + crypto_int64 f5g3_2 = f5_2 * (crypto_int64) g3; + crypto_int64 f5g4 = f5 * (crypto_int64) g4; + crypto_int64 f5g5_38 = f5_2 * (crypto_int64) g5_19; + crypto_int64 f5g6_19 = f5 * (crypto_int64) g6_19; + crypto_int64 f5g7_38 = f5_2 * (crypto_int64) g7_19; + crypto_int64 f5g8_19 = f5 * (crypto_int64) g8_19; + crypto_int64 f5g9_38 = f5_2 * (crypto_int64) g9_19; + crypto_int64 f6g0 = f6 * (crypto_int64) g0; + crypto_int64 f6g1 = f6 * (crypto_int64) g1; + crypto_int64 f6g2 = f6 * (crypto_int64) g2; + crypto_int64 f6g3 = f6 * (crypto_int64) g3; + crypto_int64 f6g4_19 = f6 * (crypto_int64) g4_19; + crypto_int64 f6g5_19 = f6 * (crypto_int64) g5_19; + crypto_int64 f6g6_19 = f6 * (crypto_int64) g6_19; + crypto_int64 f6g7_19 = f6 * (crypto_int64) g7_19; + crypto_int64 f6g8_19 = f6 * (crypto_int64) g8_19; + crypto_int64 f6g9_19 = f6 * (crypto_int64) g9_19; + crypto_int64 f7g0 = f7 * (crypto_int64) g0; + crypto_int64 f7g1_2 = f7_2 * (crypto_int64) g1; + crypto_int64 f7g2 = f7 * (crypto_int64) g2; + crypto_int64 f7g3_38 = f7_2 * (crypto_int64) g3_19; + crypto_int64 f7g4_19 = f7 * (crypto_int64) g4_19; + crypto_int64 f7g5_38 = f7_2 * (crypto_int64) g5_19; + crypto_int64 f7g6_19 = f7 * (crypto_int64) g6_19; + crypto_int64 f7g7_38 = f7_2 * (crypto_int64) g7_19; + crypto_int64 f7g8_19 = f7 * (crypto_int64) g8_19; + crypto_int64 f7g9_38 = f7_2 * (crypto_int64) g9_19; + crypto_int64 f8g0 = f8 * (crypto_int64) g0; + crypto_int64 f8g1 = f8 * (crypto_int64) g1; + crypto_int64 f8g2_19 = f8 * (crypto_int64) g2_19; + crypto_int64 f8g3_19 = f8 * (crypto_int64) g3_19; + crypto_int64 f8g4_19 = f8 * (crypto_int64) g4_19; + crypto_int64 f8g5_19 = f8 * (crypto_int64) g5_19; + crypto_int64 f8g6_19 = f8 * (crypto_int64) g6_19; + crypto_int64 f8g7_19 = f8 * (crypto_int64) g7_19; + crypto_int64 f8g8_19 = f8 * (crypto_int64) g8_19; + crypto_int64 f8g9_19 = f8 * (crypto_int64) g9_19; + crypto_int64 f9g0 = f9 * (crypto_int64) g0; + crypto_int64 f9g1_38 = f9_2 * (crypto_int64) g1_19; + crypto_int64 f9g2_19 = f9 * (crypto_int64) g2_19; + crypto_int64 f9g3_38 = f9_2 * (crypto_int64) g3_19; + crypto_int64 f9g4_19 = f9 * (crypto_int64) g4_19; + crypto_int64 f9g5_38 = f9_2 * (crypto_int64) g5_19; + crypto_int64 f9g6_19 = f9 * (crypto_int64) g6_19; + crypto_int64 f9g7_38 = f9_2 * (crypto_int64) g7_19; + crypto_int64 f9g8_19 = f9 * (crypto_int64) g8_19; + crypto_int64 f9g9_38 = f9_2 * (crypto_int64) g9_19; + crypto_int64 h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38; + crypto_int64 h1 = f0g1+f1g0 +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19; + crypto_int64 h2 = f0g2+f1g1_2 +f2g0 +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38; + crypto_int64 h3 = f0g3+f1g2 +f2g1 +f3g0 +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19; + crypto_int64 h4 = f0g4+f1g3_2 +f2g2 +f3g1_2 +f4g0 +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38; + crypto_int64 h5 = f0g5+f1g4 +f2g3 +f3g2 +f4g1 +f5g0 +f6g9_19+f7g8_19+f8g7_19+f9g6_19; + crypto_int64 h6 = f0g6+f1g5_2 +f2g4 +f3g3_2 +f4g2 +f5g1_2 +f6g0 +f7g9_38+f8g8_19+f9g7_38; + crypto_int64 h7 = f0g7+f1g6 +f2g5 +f3g4 +f4g3 +f5g2 +f6g1 +f7g0 +f8g9_19+f9g8_19; + crypto_int64 h8 = f0g8+f1g7_2 +f2g6 +f3g5_2 +f4g4 +f5g3_2 +f6g2 +f7g1_2 +f8g0 +f9g9_38; + crypto_int64 h9 = f0g9+f1g8 +f2g7 +f3g6 +f4g5 +f5g4 +f6g3 +f7g2 +f8g1 +f9g0 ; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + /* + |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38)) + i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8 + |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19)) + i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9 + */ + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); + /* |h0| <= 2^25 */ + /* |h4| <= 2^25 */ + /* |h1| <= 1.71*2^59 */ + /* |h5| <= 1.71*2^59 */ + + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= SHL64(carry1,25); + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= SHL64(carry5,25); + /* |h1| <= 2^24; from now on fits into int32 */ + /* |h5| <= 2^24; from now on fits into int32 */ + /* |h2| <= 1.41*2^60 */ + /* |h6| <= 1.41*2^60 */ + + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= SHL64(carry2,26); + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= SHL64(carry6,26); + /* |h2| <= 2^25; from now on fits into int32 unchanged */ + /* |h6| <= 2^25; from now on fits into int32 unchanged */ + /* |h3| <= 1.71*2^59 */ + /* |h7| <= 1.71*2^59 */ + + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= SHL64(carry3,25); + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= SHL64(carry7,25); + /* |h3| <= 2^24; from now on fits into int32 unchanged */ + /* |h7| <= 2^24; from now on fits into int32 unchanged */ + /* |h4| <= 1.72*2^34 */ + /* |h8| <= 1.41*2^60 */ + + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= SHL64(carry8,26); + /* |h4| <= 2^25; from now on fits into int32 unchanged */ + /* |h8| <= 2^25; from now on fits into int32 unchanged */ + /* |h5| <= 1.01*2^24 */ + /* |h9| <= 1.71*2^59 */ + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= SHL64(carry9,25); + /* |h9| <= 2^24; from now on fits into int32 unchanged */ + /* |h0| <= 1.1*2^39 */ + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); + /* |h0| <= 2^25; from now on fits into int32 unchanged */ + /* |h1| <= 1.01*2^24 */ + + h[0] = (crypto_int32) h0; + h[1] = (crypto_int32) h1; + h[2] = (crypto_int32) h2; + h[3] = (crypto_int32) h3; + h[4] = (crypto_int32) h4; + h[5] = (crypto_int32) h5; + h[6] = (crypto_int32) h6; + h[7] = (crypto_int32) h7; + h[8] = (crypto_int32) h8; + h[9] = (crypto_int32) h9; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_neg.c b/src/wraith/src/ext/ed25519/ref10/fe_neg.c new file mode 100644 index 000000000..2078ce528 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_neg.c @@ -0,0 +1,45 @@ +#include "fe.h" + +/* +h = -f + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +void fe_neg(fe h,const fe f) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 h0 = -f0; + crypto_int32 h1 = -f1; + crypto_int32 h2 = -f2; + crypto_int32 h3 = -f3; + crypto_int32 h4 = -f4; + crypto_int32 h5 = -f5; + crypto_int32 h6 = -f6; + crypto_int32 h7 = -f7; + crypto_int32 h8 = -f8; + crypto_int32 h9 = -f9; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_pow22523.c b/src/wraith/src/ext/ed25519/ref10/fe_pow22523.c new file mode 100644 index 000000000..56675a590 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_pow22523.c @@ -0,0 +1,13 @@ +#include "fe.h" + +void fe_pow22523(fe out,const fe z) +{ + fe t0; + fe t1; + fe t2; + int i; + +#include "pow22523.h" + + return; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_sq.c b/src/wraith/src/ext/ed25519/ref10/fe_sq.c new file mode 100644 index 000000000..0022a1751 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_sq.c @@ -0,0 +1,149 @@ +#include "fe.h" +#include "crypto_int64.h" + +/* +h = f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +void fe_sq(fe h,const fe f) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 f0_2 = 2 * f0; + crypto_int32 f1_2 = 2 * f1; + crypto_int32 f2_2 = 2 * f2; + crypto_int32 f3_2 = 2 * f3; + crypto_int32 f4_2 = 2 * f4; + crypto_int32 f5_2 = 2 * f5; + crypto_int32 f6_2 = 2 * f6; + crypto_int32 f7_2 = 2 * f7; + crypto_int32 f5_38 = 38 * f5; /* 1.959375*2^30 */ + crypto_int32 f6_19 = 19 * f6; /* 1.959375*2^30 */ + crypto_int32 f7_38 = 38 * f7; /* 1.959375*2^30 */ + crypto_int32 f8_19 = 19 * f8; /* 1.959375*2^30 */ + crypto_int32 f9_38 = 38 * f9; /* 1.959375*2^30 */ + crypto_int64 f0f0 = f0 * (crypto_int64) f0; + crypto_int64 f0f1_2 = f0_2 * (crypto_int64) f1; + crypto_int64 f0f2_2 = f0_2 * (crypto_int64) f2; + crypto_int64 f0f3_2 = f0_2 * (crypto_int64) f3; + crypto_int64 f0f4_2 = f0_2 * (crypto_int64) f4; + crypto_int64 f0f5_2 = f0_2 * (crypto_int64) f5; + crypto_int64 f0f6_2 = f0_2 * (crypto_int64) f6; + crypto_int64 f0f7_2 = f0_2 * (crypto_int64) f7; + crypto_int64 f0f8_2 = f0_2 * (crypto_int64) f8; + crypto_int64 f0f9_2 = f0_2 * (crypto_int64) f9; + crypto_int64 f1f1_2 = f1_2 * (crypto_int64) f1; + crypto_int64 f1f2_2 = f1_2 * (crypto_int64) f2; + crypto_int64 f1f3_4 = f1_2 * (crypto_int64) f3_2; + crypto_int64 f1f4_2 = f1_2 * (crypto_int64) f4; + crypto_int64 f1f5_4 = f1_2 * (crypto_int64) f5_2; + crypto_int64 f1f6_2 = f1_2 * (crypto_int64) f6; + crypto_int64 f1f7_4 = f1_2 * (crypto_int64) f7_2; + crypto_int64 f1f8_2 = f1_2 * (crypto_int64) f8; + crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38; + crypto_int64 f2f2 = f2 * (crypto_int64) f2; + crypto_int64 f2f3_2 = f2_2 * (crypto_int64) f3; + crypto_int64 f2f4_2 = f2_2 * (crypto_int64) f4; + crypto_int64 f2f5_2 = f2_2 * (crypto_int64) f5; + crypto_int64 f2f6_2 = f2_2 * (crypto_int64) f6; + crypto_int64 f2f7_2 = f2_2 * (crypto_int64) f7; + crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19; + crypto_int64 f2f9_38 = f2 * (crypto_int64) f9_38; + crypto_int64 f3f3_2 = f3_2 * (crypto_int64) f3; + crypto_int64 f3f4_2 = f3_2 * (crypto_int64) f4; + crypto_int64 f3f5_4 = f3_2 * (crypto_int64) f5_2; + crypto_int64 f3f6_2 = f3_2 * (crypto_int64) f6; + crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38; + crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19; + crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38; + crypto_int64 f4f4 = f4 * (crypto_int64) f4; + crypto_int64 f4f5_2 = f4_2 * (crypto_int64) f5; + crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19; + crypto_int64 f4f7_38 = f4 * (crypto_int64) f7_38; + crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19; + crypto_int64 f4f9_38 = f4 * (crypto_int64) f9_38; + crypto_int64 f5f5_38 = f5 * (crypto_int64) f5_38; + crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19; + crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38; + crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19; + crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38; + crypto_int64 f6f6_19 = f6 * (crypto_int64) f6_19; + crypto_int64 f6f7_38 = f6 * (crypto_int64) f7_38; + crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19; + crypto_int64 f6f9_38 = f6 * (crypto_int64) f9_38; + crypto_int64 f7f7_38 = f7 * (crypto_int64) f7_38; + crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19; + crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38; + crypto_int64 f8f8_19 = f8 * (crypto_int64) f8_19; + crypto_int64 f8f9_38 = f8 * (crypto_int64) f9_38; + crypto_int64 f9f9_38 = f9 * (crypto_int64) f9_38; + crypto_int64 h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; + crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; + crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; + crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; + crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; + crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; + crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; + crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; + crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; + crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); + + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= SHL64(carry1,25); + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= SHL64(carry5,25); + + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= SHL64(carry2,26); + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= SHL64(carry6,26); + + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= SHL64(carry3,25); + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= SHL64(carry7,25); + + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= SHL64(carry8,26); + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= SHL64(carry9,25); + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); + + h[0] = (crypto_int32) h0; + h[1] = (crypto_int32) h1; + h[2] = (crypto_int32) h2; + h[3] = (crypto_int32) h3; + h[4] = (crypto_int32) h4; + h[5] = (crypto_int32) h5; + h[6] = (crypto_int32) h6; + h[7] = (crypto_int32) h7; + h[8] = (crypto_int32) h8; + h[9] = (crypto_int32) h9; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_sq2.c b/src/wraith/src/ext/ed25519/ref10/fe_sq2.c new file mode 100644 index 000000000..e8faa69ec --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_sq2.c @@ -0,0 +1,160 @@ +#include "fe.h" +#include "crypto_int64.h" + +/* +h = 2 * f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +void fe_sq2(fe h,const fe f) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 f0_2 = 2 * f0; + crypto_int32 f1_2 = 2 * f1; + crypto_int32 f2_2 = 2 * f2; + crypto_int32 f3_2 = 2 * f3; + crypto_int32 f4_2 = 2 * f4; + crypto_int32 f5_2 = 2 * f5; + crypto_int32 f6_2 = 2 * f6; + crypto_int32 f7_2 = 2 * f7; + crypto_int32 f5_38 = 38 * f5; /* 1.959375*2^30 */ + crypto_int32 f6_19 = 19 * f6; /* 1.959375*2^30 */ + crypto_int32 f7_38 = 38 * f7; /* 1.959375*2^30 */ + crypto_int32 f8_19 = 19 * f8; /* 1.959375*2^30 */ + crypto_int32 f9_38 = 38 * f9; /* 1.959375*2^30 */ + crypto_int64 f0f0 = f0 * (crypto_int64) f0; + crypto_int64 f0f1_2 = f0_2 * (crypto_int64) f1; + crypto_int64 f0f2_2 = f0_2 * (crypto_int64) f2; + crypto_int64 f0f3_2 = f0_2 * (crypto_int64) f3; + crypto_int64 f0f4_2 = f0_2 * (crypto_int64) f4; + crypto_int64 f0f5_2 = f0_2 * (crypto_int64) f5; + crypto_int64 f0f6_2 = f0_2 * (crypto_int64) f6; + crypto_int64 f0f7_2 = f0_2 * (crypto_int64) f7; + crypto_int64 f0f8_2 = f0_2 * (crypto_int64) f8; + crypto_int64 f0f9_2 = f0_2 * (crypto_int64) f9; + crypto_int64 f1f1_2 = f1_2 * (crypto_int64) f1; + crypto_int64 f1f2_2 = f1_2 * (crypto_int64) f2; + crypto_int64 f1f3_4 = f1_2 * (crypto_int64) f3_2; + crypto_int64 f1f4_2 = f1_2 * (crypto_int64) f4; + crypto_int64 f1f5_4 = f1_2 * (crypto_int64) f5_2; + crypto_int64 f1f6_2 = f1_2 * (crypto_int64) f6; + crypto_int64 f1f7_4 = f1_2 * (crypto_int64) f7_2; + crypto_int64 f1f8_2 = f1_2 * (crypto_int64) f8; + crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38; + crypto_int64 f2f2 = f2 * (crypto_int64) f2; + crypto_int64 f2f3_2 = f2_2 * (crypto_int64) f3; + crypto_int64 f2f4_2 = f2_2 * (crypto_int64) f4; + crypto_int64 f2f5_2 = f2_2 * (crypto_int64) f5; + crypto_int64 f2f6_2 = f2_2 * (crypto_int64) f6; + crypto_int64 f2f7_2 = f2_2 * (crypto_int64) f7; + crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19; + crypto_int64 f2f9_38 = f2 * (crypto_int64) f9_38; + crypto_int64 f3f3_2 = f3_2 * (crypto_int64) f3; + crypto_int64 f3f4_2 = f3_2 * (crypto_int64) f4; + crypto_int64 f3f5_4 = f3_2 * (crypto_int64) f5_2; + crypto_int64 f3f6_2 = f3_2 * (crypto_int64) f6; + crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38; + crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19; + crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38; + crypto_int64 f4f4 = f4 * (crypto_int64) f4; + crypto_int64 f4f5_2 = f4_2 * (crypto_int64) f5; + crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19; + crypto_int64 f4f7_38 = f4 * (crypto_int64) f7_38; + crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19; + crypto_int64 f4f9_38 = f4 * (crypto_int64) f9_38; + crypto_int64 f5f5_38 = f5 * (crypto_int64) f5_38; + crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19; + crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38; + crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19; + crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38; + crypto_int64 f6f6_19 = f6 * (crypto_int64) f6_19; + crypto_int64 f6f7_38 = f6 * (crypto_int64) f7_38; + crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19; + crypto_int64 f6f9_38 = f6 * (crypto_int64) f9_38; + crypto_int64 f7f7_38 = f7 * (crypto_int64) f7_38; + crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19; + crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38; + crypto_int64 f8f8_19 = f8 * (crypto_int64) f8_19; + crypto_int64 f8f9_38 = f8 * (crypto_int64) f9_38; + crypto_int64 f9f9_38 = f9 * (crypto_int64) f9_38; + crypto_int64 h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; + crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; + crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; + crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; + crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; + crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; + crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; + crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; + crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; + crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + + h0 += h0; + h1 += h1; + h2 += h2; + h3 += h3; + h4 += h4; + h5 += h5; + h6 += h6; + h7 += h7; + h8 += h8; + h9 += h9; + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); + + carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= SHL64(carry1,25); + carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= SHL64(carry5,25); + + carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= SHL64(carry2,26); + carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= SHL64(carry6,26); + + carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= SHL64(carry3,25); + carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= SHL64(carry7,25); + + carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); + carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= SHL64(carry8,26); + + carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= SHL64(carry9,25); + + carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); + + h[0] = (crypto_int32) h0; + h[1] = (crypto_int32) h1; + h[2] = (crypto_int32) h2; + h[3] = (crypto_int32) h3; + h[4] = (crypto_int32) h4; + h[5] = (crypto_int32) h5; + h[6] = (crypto_int32) h6; + h[7] = (crypto_int32) h7; + h[8] = (crypto_int32) h8; + h[9] = (crypto_int32) h9; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_sub.c b/src/wraith/src/ext/ed25519/ref10/fe_sub.c new file mode 100644 index 000000000..6e26b7df8 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_sub.c @@ -0,0 +1,57 @@ +#include "fe.h" + +/* +h = f - g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +void fe_sub(fe h,const fe f,const fe g) +{ + crypto_int32 f0 = f[0]; + crypto_int32 f1 = f[1]; + crypto_int32 f2 = f[2]; + crypto_int32 f3 = f[3]; + crypto_int32 f4 = f[4]; + crypto_int32 f5 = f[5]; + crypto_int32 f6 = f[6]; + crypto_int32 f7 = f[7]; + crypto_int32 f8 = f[8]; + crypto_int32 f9 = f[9]; + crypto_int32 g0 = g[0]; + crypto_int32 g1 = g[1]; + crypto_int32 g2 = g[2]; + crypto_int32 g3 = g[3]; + crypto_int32 g4 = g[4]; + crypto_int32 g5 = g[5]; + crypto_int32 g6 = g[6]; + crypto_int32 g7 = g[7]; + crypto_int32 g8 = g[8]; + crypto_int32 g9 = g[9]; + crypto_int32 h0 = f0 - g0; + crypto_int32 h1 = f1 - g1; + crypto_int32 h2 = f2 - g2; + crypto_int32 h3 = f3 - g3; + crypto_int32 h4 = f4 - g4; + crypto_int32 h5 = f5 - g5; + crypto_int32 h6 = f6 - g6; + crypto_int32 h7 = f7 - g7; + crypto_int32 h8 = f8 - g8; + crypto_int32 h9 = f9 - g9; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} diff --git a/src/wraith/src/ext/ed25519/ref10/fe_tobytes.c b/src/wraith/src/ext/ed25519/ref10/fe_tobytes.c new file mode 100644 index 000000000..3c7f38962 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/fe_tobytes.c @@ -0,0 +1,119 @@ +#include "fe.h" + +/* +Preconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Write p=2^255-19; q=floor(h/p). +Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). + +Proof: + Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. + Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4. + + Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). + Then 0> 25; + q = (h0 + q) >> 26; + q = (h1 + q) >> 25; + q = (h2 + q) >> 26; + q = (h3 + q) >> 25; + q = (h4 + q) >> 26; + q = (h5 + q) >> 25; + q = (h6 + q) >> 26; + q = (h7 + q) >> 25; + q = (h8 + q) >> 26; + q = (h9 + q) >> 25; + + /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ + h0 += 19 * q; + /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ + + carry0 = h0 >> 26; h1 += carry0; h0 -= SHL32(carry0,26); + carry1 = h1 >> 25; h2 += carry1; h1 -= SHL32(carry1,25); + carry2 = h2 >> 26; h3 += carry2; h2 -= SHL32(carry2,26); + carry3 = h3 >> 25; h4 += carry3; h3 -= SHL32(carry3,25); + carry4 = h4 >> 26; h5 += carry4; h4 -= SHL32(carry4,26); + carry5 = h5 >> 25; h6 += carry5; h5 -= SHL32(carry5,25); + carry6 = h6 >> 26; h7 += carry6; h6 -= SHL32(carry6,26); + carry7 = h7 >> 25; h8 += carry7; h7 -= SHL32(carry7,25); + carry8 = h8 >> 26; h9 += carry8; h8 -= SHL32(carry8,26); + carry9 = h9 >> 25; h9 -= SHL32(carry9,25); + /* h10 = carry9 */ + + /* + Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. + Have h0+...+2^230 h9 between 0 and 2^255-1; + evidently 2^255 h10-2^255 q = 0. + Goal: Output h0+...+2^230 h9. + */ + + s[0] = h0 >> 0; + s[1] = h0 >> 8; + s[2] = h0 >> 16; + s[3] = (h0 >> 24) | SHL32(h1,2); + s[4] = h1 >> 6; + s[5] = h1 >> 14; + s[6] = (h1 >> 22) | SHL32(h2,3); + s[7] = h2 >> 5; + s[8] = h2 >> 13; + s[9] = (h2 >> 21) | SHL32(h3,5); + s[10] = h3 >> 3; + s[11] = h3 >> 11; + s[12] = (h3 >> 19) | SHL32(h4,6); + s[13] = h4 >> 2; + s[14] = h4 >> 10; + s[15] = h4 >> 18; + s[16] = h5 >> 0; + s[17] = h5 >> 8; + s[18] = h5 >> 16; + s[19] = (h5 >> 24) | SHL32(h6,1); + s[20] = h6 >> 7; + s[21] = h6 >> 15; + s[22] = (h6 >> 23) | SHL32(h7,3); + s[23] = h7 >> 5; + s[24] = h7 >> 13; + s[25] = (h7 >> 21) | SHL32(h8,4); + s[26] = h8 >> 4; + s[27] = h8 >> 12; + s[28] = (h8 >> 20) | SHL32(h9,6); + s[29] = h9 >> 2; + s[30] = h9 >> 10; + s[31] = h9 >> 18; +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge.h b/src/wraith/src/ext/ed25519/ref10/ge.h new file mode 100644 index 000000000..55e95f95b --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge.h @@ -0,0 +1,95 @@ +#ifndef GE_H +#define GE_H + +/* +ge means group element. + +Here the group is the set of pairs (x,y) of field elements (see fe.h) +satisfying -x^2 + y^2 = 1 + d x^2y^2 +where d = -121665/121666. + +Representations: + ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z + ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT + ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T + ge_precomp (Duif): (y+x,y-x,2dxy) +*/ + +#include "fe.h" + +typedef struct { + fe X; + fe Y; + fe Z; +} ge_p2; + +typedef struct { + fe X; + fe Y; + fe Z; + fe T; +} ge_p3; + +typedef struct { + fe X; + fe Y; + fe Z; + fe T; +} ge_p1p1; + +typedef struct { + fe yplusx; + fe yminusx; + fe xy2d; +} ge_precomp; + +typedef struct { + fe YplusX; + fe YminusX; + fe Z; + fe T2d; +} ge_cached; + +#define ge_frombytes_negate_vartime crypto_sign_ed25519_ref10_ge_frombytes_negate_vartime +#define ge_tobytes crypto_sign_ed25519_ref10_ge_tobytes +#define ge_p3_tobytes crypto_sign_ed25519_ref10_ge_p3_tobytes + +#define ge_p2_0 crypto_sign_ed25519_ref10_ge_p2_0 +#define ge_p3_0 crypto_sign_ed25519_ref10_ge_p3_0 +#define ge_precomp_0 crypto_sign_ed25519_ref10_ge_precomp_0 +#define ge_p3_to_p2 crypto_sign_ed25519_ref10_ge_p3_to_p2 +#define ge_p3_to_cached crypto_sign_ed25519_ref10_ge_p3_to_cached +#define ge_p1p1_to_p2 crypto_sign_ed25519_ref10_ge_p1p1_to_p2 +#define ge_p1p1_to_p3 crypto_sign_ed25519_ref10_ge_p1p1_to_p3 +#define ge_p2_dbl crypto_sign_ed25519_ref10_ge_p2_dbl +#define ge_p3_dbl crypto_sign_ed25519_ref10_ge_p3_dbl + +#define ge_madd crypto_sign_ed25519_ref10_ge_madd +#define ge_msub crypto_sign_ed25519_ref10_ge_msub +#define ge_add crypto_sign_ed25519_ref10_ge_add +#define ge_sub crypto_sign_ed25519_ref10_ge_sub +#define ge_scalarmult_base crypto_sign_ed25519_ref10_ge_scalarmult_base +#define ge_double_scalarmult_vartime crypto_sign_ed25519_ref10_ge_double_scalarmult_vartime + +extern void ge_tobytes(unsigned char *,const ge_p2 *); +extern void ge_p3_tobytes(unsigned char *,const ge_p3 *); +extern int ge_frombytes_negate_vartime(ge_p3 *,const unsigned char *); + +extern void ge_p2_0(ge_p2 *); +extern void ge_p3_0(ge_p3 *); +extern void ge_precomp_0(ge_precomp *); +extern void ge_p3_to_p2(ge_p2 *,const ge_p3 *); +extern void ge_p3_to_cached(ge_cached *,const ge_p3 *); +extern void ge_p1p1_to_p2(ge_p2 *,const ge_p1p1 *); +extern void ge_p1p1_to_p3(ge_p3 *,const ge_p1p1 *); +extern void ge_p2_dbl(ge_p1p1 *,const ge_p2 *); +extern void ge_p3_dbl(ge_p1p1 *,const ge_p3 *); + +extern void ge_madd(ge_p1p1 *,const ge_p3 *,const ge_precomp *); +extern void ge_msub(ge_p1p1 *,const ge_p3 *,const ge_precomp *); +extern void ge_add(ge_p1p1 *,const ge_p3 *,const ge_cached *); +extern void ge_sub(ge_p1p1 *,const ge_p3 *,const ge_cached *); +extern void ge_scalarmult_base(ge_p3 *,const unsigned char *); +extern void ge_double_scalarmult_vartime(ge_p2 *,const unsigned char *,const ge_p3 *,const unsigned char *); + +#endif diff --git a/src/wraith/src/ext/ed25519/ref10/ge_add.c b/src/wraith/src/ext/ed25519/ref10/ge_add.c new file mode 100644 index 000000000..da7ff5d2e --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_add.c @@ -0,0 +1,11 @@ +#include "ge.h" + +/* +r = p + q +*/ + +void ge_add(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q) +{ + fe t0; +#include "ge_add.h" +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_add.h b/src/wraith/src/ext/ed25519/ref10/ge_add.h new file mode 100644 index 000000000..7481f8ffb --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_add.h @@ -0,0 +1,97 @@ + +/* qhasm: enter ge_add */ + +/* qhasm: fe X1 */ + +/* qhasm: fe Y1 */ + +/* qhasm: fe Z1 */ + +/* qhasm: fe Z2 */ + +/* qhasm: fe T1 */ + +/* qhasm: fe ZZ */ + +/* qhasm: fe YpX2 */ + +/* qhasm: fe YmX2 */ + +/* qhasm: fe T2d2 */ + +/* qhasm: fe X3 */ + +/* qhasm: fe Y3 */ + +/* qhasm: fe Z3 */ + +/* qhasm: fe T3 */ + +/* qhasm: fe YpX1 */ + +/* qhasm: fe YmX1 */ + +/* qhasm: fe A */ + +/* qhasm: fe B */ + +/* qhasm: fe C */ + +/* qhasm: fe D */ + +/* qhasm: YpX1 = Y1+X1 */ +/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ +fe_add(r->X,p->Y,p->X); + +/* qhasm: YmX1 = Y1-X1 */ +/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ +fe_sub(r->Y,p->Y,p->X); + +/* qhasm: A = YpX1*YpX2 */ +/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,YplusX); */ +fe_mul(r->Z,r->X,q->YplusX); + +/* qhasm: B = YmX1*YmX2 */ +/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,YminusX); */ +fe_mul(r->Y,r->Y,q->YminusX); + +/* qhasm: C = T2d2*T1 */ +/* asm 1: fe_mul(>C=fe#4,C=r->T,T2d,T); */ +fe_mul(r->T,q->T2d,p->T); + +/* qhasm: ZZ = Z1*Z2 */ +/* asm 1: fe_mul(>ZZ=fe#1,ZZ=r->X,Z,Z); */ +fe_mul(r->X,p->Z,q->Z); + +/* qhasm: D = 2*ZZ */ +/* asm 1: fe_add(>D=fe#5,D=t0,X,X); */ +fe_add(t0,r->X,r->X); + +/* qhasm: X3 = A-B */ +/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ +fe_sub(r->X,r->Z,r->Y); + +/* qhasm: Y3 = A+B */ +/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ +fe_add(r->Y,r->Z,r->Y); + +/* qhasm: Z3 = D+C */ +/* asm 1: fe_add(>Z3=fe#3,Z3=r->Z,T); */ +fe_add(r->Z,t0,r->T); + +/* qhasm: T3 = D-C */ +/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T); */ +fe_sub(r->T,t0,r->T); + +/* qhasm: return */ diff --git a/src/wraith/src/ext/ed25519/ref10/ge_add.q b/src/wraith/src/ext/ed25519/ref10/ge_add.q new file mode 100644 index 000000000..a6572ab0f --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_add.q @@ -0,0 +1,49 @@ +:name:fe:r->X:r->Y:r->Z:r->T:t0:t1:t2:t3:t4:t5:p->X:p->Y:p->Z:p->T:q->YplusX:q->YminusX:q->Z:q->T2d: +fe r:var/r=fe: + +enter f:enter/f:>X1=fe#11:>Y1=fe#12:>Z1=fe#13:>T1=fe#14:>YpX2=fe#15:>YmX2=fe#16:>Z2=fe#17:>T2d2=fe#18: +return:nofallthrough:h=fe:asm/fe_add(>h,h=fe:asm/fe_sub(>h,h=fe:asm/fe_mul(>h,h=fe:asm/fe_sq(>h,h=fe:asm/fe_add(>h,> 3] >> (i & 7)); + + for (i = 0;i < 256;++i) + if (r[i]) { + for (b = 1;b <= 6 && i + b < 256;++b) { + if (r[i + b]) { + if (r[i] + (r[i + b] << b) <= 15) { + r[i] += r[i + b] << b; r[i + b] = 0; + } else if (r[i] - (r[i + b] << b) >= -15) { + r[i] -= r[i + b] << b; + for (k = i + b;k < 256;++k) { + if (!r[k]) { + r[k] = 1; + break; + } + r[k] = 0; + } + } else + break; + } + } + } + +} + +static ge_precomp Bi[8] = { +#include "base2.h" +} ; + +/* +r = a * A + b * B +where a = a[0]+256*a[1]+...+256^31 a[31]. +and b = b[0]+256*b[1]+...+256^31 b[31]. +B is the Ed25519 base point (x,4/5) with x positive. +*/ + +void ge_double_scalarmult_vartime(ge_p2 *r,const unsigned char *a,const ge_p3 *A,const unsigned char *b) +{ + signed char aslide[256]; + signed char bslide[256]; + ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */ + ge_p1p1 t; + ge_p3 u; + ge_p3 A2; + int i; + + slide(aslide,a); + slide(bslide,b); + + ge_p3_to_cached(&Ai[0],A); + ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t); + ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u); + ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u); + ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u); + ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u); + ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u); + ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u); + ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u); + + ge_p2_0(r); + + for (i = 255;i >= 0;--i) { + if (aslide[i] || bslide[i]) break; + } + + for (;i >= 0;--i) { + ge_p2_dbl(&t,r); + + if (aslide[i] > 0) { + ge_p1p1_to_p3(&u,&t); + ge_add(&t,&u,&Ai[aslide[i]/2]); + } else if (aslide[i] < 0) { + ge_p1p1_to_p3(&u,&t); + ge_sub(&t,&u,&Ai[(-aslide[i])/2]); + } + + if (bslide[i] > 0) { + ge_p1p1_to_p3(&u,&t); + ge_madd(&t,&u,&Bi[bslide[i]/2]); + } else if (bslide[i] < 0) { + ge_p1p1_to_p3(&u,&t); + ge_msub(&t,&u,&Bi[(-bslide[i])/2]); + } + + ge_p1p1_to_p2(r,&t); + } +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_frombytes.c b/src/wraith/src/ext/ed25519/ref10/ge_frombytes.c new file mode 100644 index 000000000..1a059ee93 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_frombytes.c @@ -0,0 +1,50 @@ +#include "ge.h" + +static const fe d = { +#include "d.h" +} ; + +static const fe sqrtm1 = { +#include "sqrtm1.h" +} ; + +int ge_frombytes_negate_vartime(ge_p3 *h,const unsigned char *s) +{ + fe u; + fe v; + fe v3; + fe vxx; + fe check; + + fe_frombytes(h->Y,s); + fe_1(h->Z); + fe_sq(u,h->Y); + fe_mul(v,u,d); + fe_sub(u,u,h->Z); /* u = y^2-1 */ + fe_add(v,v,h->Z); /* v = dy^2+1 */ + + fe_sq(v3,v); + fe_mul(v3,v3,v); /* v3 = v^3 */ + fe_sq(h->X,v3); + fe_mul(h->X,h->X,v); + fe_mul(h->X,h->X,u); /* x = uv^7 */ + + fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */ + fe_mul(h->X,h->X,v3); + fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */ + + fe_sq(vxx,h->X); + fe_mul(vxx,vxx,v); + fe_sub(check,vxx,u); /* vx^2-u */ + if (fe_isnonzero(check)) { + fe_add(check,vxx,u); /* vx^2+u */ + if (fe_isnonzero(check)) return -1; + fe_mul(h->X,h->X,sqrtm1); + } + + if (fe_isnegative(h->X) == (s[31] >> 7)) + fe_neg(h->X,h->X); + + fe_mul(h->T,h->X,h->Y); + return 0; +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_madd.c b/src/wraith/src/ext/ed25519/ref10/ge_madd.c new file mode 100644 index 000000000..622571774 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_madd.c @@ -0,0 +1,11 @@ +#include "ge.h" + +/* +r = p + q +*/ + +void ge_madd(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q) +{ + fe t0; +#include "ge_madd.h" +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_madd.h b/src/wraith/src/ext/ed25519/ref10/ge_madd.h new file mode 100644 index 000000000..ecae84952 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_madd.h @@ -0,0 +1,88 @@ + +/* qhasm: enter ge_madd */ + +/* qhasm: fe X1 */ + +/* qhasm: fe Y1 */ + +/* qhasm: fe Z1 */ + +/* qhasm: fe T1 */ + +/* qhasm: fe ypx2 */ + +/* qhasm: fe ymx2 */ + +/* qhasm: fe xy2d2 */ + +/* qhasm: fe X3 */ + +/* qhasm: fe Y3 */ + +/* qhasm: fe Z3 */ + +/* qhasm: fe T3 */ + +/* qhasm: fe YpX1 */ + +/* qhasm: fe YmX1 */ + +/* qhasm: fe A */ + +/* qhasm: fe B */ + +/* qhasm: fe C */ + +/* qhasm: fe D */ + +/* qhasm: YpX1 = Y1+X1 */ +/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ +fe_add(r->X,p->Y,p->X); + +/* qhasm: YmX1 = Y1-X1 */ +/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ +fe_sub(r->Y,p->Y,p->X); + +/* qhasm: A = YpX1*ypx2 */ +/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,yplusx); */ +fe_mul(r->Z,r->X,q->yplusx); + +/* qhasm: B = YmX1*ymx2 */ +/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,yminusx); */ +fe_mul(r->Y,r->Y,q->yminusx); + +/* qhasm: C = xy2d2*T1 */ +/* asm 1: fe_mul(>C=fe#4,C=r->T,xy2d,T); */ +fe_mul(r->T,q->xy2d,p->T); + +/* qhasm: D = 2*Z1 */ +/* asm 1: fe_add(>D=fe#5,D=t0,Z,Z); */ +fe_add(t0,p->Z,p->Z); + +/* qhasm: X3 = A-B */ +/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ +fe_sub(r->X,r->Z,r->Y); + +/* qhasm: Y3 = A+B */ +/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ +fe_add(r->Y,r->Z,r->Y); + +/* qhasm: Z3 = D+C */ +/* asm 1: fe_add(>Z3=fe#3,Z3=r->Z,T); */ +fe_add(r->Z,t0,r->T); + +/* qhasm: T3 = D-C */ +/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T); */ +fe_sub(r->T,t0,r->T); + +/* qhasm: return */ diff --git a/src/wraith/src/ext/ed25519/ref10/ge_madd.q b/src/wraith/src/ext/ed25519/ref10/ge_madd.q new file mode 100644 index 000000000..aa3db454e --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_madd.q @@ -0,0 +1,46 @@ +:name:fe:r->X:r->Y:r->Z:r->T:t0:t1:t2:t3:t4:t5:p->X:p->Y:p->Z:p->T:q->yplusx:q->yminusx:q->xy2d: +fe r:var/r=fe: + +enter f:enter/f:>X1=fe#11:>Y1=fe#12:>Z1=fe#13:>T1=fe#14:>ypx2=fe#15:>ymx2=fe#16:>xy2d2=fe#17: +return:nofallthrough:h=fe:asm/fe_add(>h,h=fe:asm/fe_sub(>h,h=fe:asm/fe_mul(>h,h=fe:asm/fe_sq(>h,h=fe:asm/fe_add(>h,YpX1=fe#1,YpX1=r->X,Y,X); */ +fe_add(r->X,p->Y,p->X); + +/* qhasm: YmX1 = Y1-X1 */ +/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ +fe_sub(r->Y,p->Y,p->X); + +/* qhasm: A = YpX1*ymx2 */ +/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,yminusx); */ +fe_mul(r->Z,r->X,q->yminusx); + +/* qhasm: B = YmX1*ypx2 */ +/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,yplusx); */ +fe_mul(r->Y,r->Y,q->yplusx); + +/* qhasm: C = xy2d2*T1 */ +/* asm 1: fe_mul(>C=fe#4,C=r->T,xy2d,T); */ +fe_mul(r->T,q->xy2d,p->T); + +/* qhasm: D = 2*Z1 */ +/* asm 1: fe_add(>D=fe#5,D=t0,Z,Z); */ +fe_add(t0,p->Z,p->Z); + +/* qhasm: X3 = A-B */ +/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ +fe_sub(r->X,r->Z,r->Y); + +/* qhasm: Y3 = A+B */ +/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ +fe_add(r->Y,r->Z,r->Y); + +/* qhasm: Z3 = D-C */ +/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,T); */ +fe_sub(r->Z,t0,r->T); + +/* qhasm: T3 = D+C */ +/* asm 1: fe_add(>T3=fe#4,T3=r->T,T); */ +fe_add(r->T,t0,r->T); + +/* qhasm: return */ diff --git a/src/wraith/src/ext/ed25519/ref10/ge_msub.q b/src/wraith/src/ext/ed25519/ref10/ge_msub.q new file mode 100644 index 000000000..e3cadd882 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_msub.q @@ -0,0 +1,46 @@ +:name:fe:r->X:r->Y:r->Z:r->T:t0:t1:t2:t3:t4:t5:p->X:p->Y:p->Z:p->T:q->yplusx:q->yminusx:q->xy2d: +fe r:var/r=fe: + +enter f:enter/f:>X1=fe#11:>Y1=fe#12:>Z1=fe#13:>T1=fe#14:>ypx2=fe#15:>ymx2=fe#16:>xy2d2=fe#17: +return:nofallthrough:h=fe:asm/fe_add(>h,h=fe:asm/fe_sub(>h,h=fe:asm/fe_mul(>h,h=fe:asm/fe_sq(>h,h=fe:asm/fe_add(>h,X,p->X,p->T); + fe_mul(r->Y,p->Y,p->Z); + fe_mul(r->Z,p->Z,p->T); +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_p1p1_to_p3.c b/src/wraith/src/ext/ed25519/ref10/ge_p1p1_to_p3.c new file mode 100644 index 000000000..2f57b1096 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_p1p1_to_p3.c @@ -0,0 +1,13 @@ +#include "ge.h" + +/* +r = p +*/ + +extern void ge_p1p1_to_p3(ge_p3 *r,const ge_p1p1 *p) +{ + fe_mul(r->X,p->X,p->T); + fe_mul(r->Y,p->Y,p->Z); + fe_mul(r->Z,p->Z,p->T); + fe_mul(r->T,p->X,p->Y); +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_p2_0.c b/src/wraith/src/ext/ed25519/ref10/ge_p2_0.c new file mode 100644 index 000000000..6191d1e6e --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_p2_0.c @@ -0,0 +1,8 @@ +#include "ge.h" + +void ge_p2_0(ge_p2 *h) +{ + fe_0(h->X); + fe_1(h->Y); + fe_1(h->Z); +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.c b/src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.c new file mode 100644 index 000000000..2e332b5ce --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.c @@ -0,0 +1,11 @@ +#include "ge.h" + +/* +r = 2 * p +*/ + +void ge_p2_dbl(ge_p1p1 *r,const ge_p2 *p) +{ + fe t0; +#include "ge_p2_dbl.h" +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.h b/src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.h new file mode 100644 index 000000000..128efed90 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.h @@ -0,0 +1,73 @@ + +/* qhasm: enter ge_p2_dbl */ + +/* qhasm: fe X1 */ + +/* qhasm: fe Y1 */ + +/* qhasm: fe Z1 */ + +/* qhasm: fe A */ + +/* qhasm: fe AA */ + +/* qhasm: fe XX */ + +/* qhasm: fe YY */ + +/* qhasm: fe B */ + +/* qhasm: fe X3 */ + +/* qhasm: fe Y3 */ + +/* qhasm: fe Z3 */ + +/* qhasm: fe T3 */ + +/* qhasm: XX=X1^2 */ +/* asm 1: fe_sq(>XX=fe#1,XX=r->X,X); */ +fe_sq(r->X,p->X); + +/* qhasm: YY=Y1^2 */ +/* asm 1: fe_sq(>YY=fe#3,YY=r->Z,Y); */ +fe_sq(r->Z,p->Y); + +/* qhasm: B=2*Z1^2 */ +/* asm 1: fe_sq2(>B=fe#4,B=r->T,Z); */ +fe_sq2(r->T,p->Z); + +/* qhasm: A=X1+Y1 */ +/* asm 1: fe_add(>A=fe#2,A=r->Y,X,Y); */ +fe_add(r->Y,p->X,p->Y); + +/* qhasm: AA=A^2 */ +/* asm 1: fe_sq(>AA=fe#5,AA=t0,Y); */ +fe_sq(t0,r->Y); + +/* qhasm: Y3=YY+XX */ +/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,X); */ +fe_add(r->Y,r->Z,r->X); + +/* qhasm: Z3=YY-XX */ +/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,Z,X); */ +fe_sub(r->Z,r->Z,r->X); + +/* qhasm: X3=AA-Y3 */ +/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Y); */ +fe_sub(r->X,t0,r->Y); + +/* qhasm: T3=B-Z3 */ +/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T,Z); */ +fe_sub(r->T,r->T,r->Z); + +/* qhasm: return */ diff --git a/src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.q b/src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.q new file mode 100644 index 000000000..170d42f9a --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_p2_dbl.q @@ -0,0 +1,41 @@ +:name:fe:r->X:r->Y:r->Z:r->T:t0:t1:t2:t3:t4:t5:p->X:p->Y:p->Z: +fe r:var/r=fe: + +enter f:enter/f:>X1=fe#11:>Y1=fe#12:>Z1=fe#13: +return:nofallthrough:h=fe:asm/fe_add(>h,h=fe:asm/fe_sub(>h,h=fe:asm/fe_mul(>h,h=fe:asm/fe_sq(>h,h=fe:asm/fe_sq2(>h,h=fe:asm/fe_add(>h,X); + fe_1(h->Y); + fe_1(h->Z); + fe_0(h->T); +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_p3_dbl.c b/src/wraith/src/ext/ed25519/ref10/ge_p3_dbl.c new file mode 100644 index 000000000..0d8a05915 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_p3_dbl.c @@ -0,0 +1,12 @@ +#include "ge.h" + +/* +r = 2 * p +*/ + +void ge_p3_dbl(ge_p1p1 *r,const ge_p3 *p) +{ + ge_p2 q; + ge_p3_to_p2(&q,p); + ge_p2_dbl(r,&q); +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_p3_to_cached.c b/src/wraith/src/ext/ed25519/ref10/ge_p3_to_cached.c new file mode 100644 index 000000000..bde64228c --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_p3_to_cached.c @@ -0,0 +1,17 @@ +#include "ge.h" + +/* +r = p +*/ + +static const fe d2 = { +#include "d2.h" +} ; + +extern void ge_p3_to_cached(ge_cached *r,const ge_p3 *p) +{ + fe_add(r->YplusX,p->Y,p->X); + fe_sub(r->YminusX,p->Y,p->X); + fe_copy(r->Z,p->Z); + fe_mul(r->T2d,p->T,d2); +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_p3_to_p2.c b/src/wraith/src/ext/ed25519/ref10/ge_p3_to_p2.c new file mode 100644 index 000000000..e532a9e4c --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_p3_to_p2.c @@ -0,0 +1,12 @@ +#include "ge.h" + +/* +r = p +*/ + +extern void ge_p3_to_p2(ge_p2 *r,const ge_p3 *p) +{ + fe_copy(r->X,p->X); + fe_copy(r->Y,p->Y); + fe_copy(r->Z,p->Z); +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_p3_tobytes.c b/src/wraith/src/ext/ed25519/ref10/ge_p3_tobytes.c new file mode 100644 index 000000000..21cb2fc65 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_p3_tobytes.c @@ -0,0 +1,14 @@ +#include "ge.h" + +void ge_p3_tobytes(unsigned char *s,const ge_p3 *h) +{ + fe recip; + fe x; + fe y; + + fe_invert(recip,h->Z); + fe_mul(x,h->X,recip); + fe_mul(y,h->Y,recip); + fe_tobytes(s,y); + s[31] ^= fe_isnegative(x) << 7; +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_precomp_0.c b/src/wraith/src/ext/ed25519/ref10/ge_precomp_0.c new file mode 100644 index 000000000..2e218861d --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_precomp_0.c @@ -0,0 +1,8 @@ +#include "ge.h" + +void ge_precomp_0(ge_precomp *h) +{ + fe_1(h->yplusx); + fe_1(h->yminusx); + fe_0(h->xy2d); +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_scalarmult_base.c b/src/wraith/src/ext/ed25519/ref10/ge_scalarmult_base.c new file mode 100644 index 000000000..5292f8322 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_scalarmult_base.c @@ -0,0 +1,109 @@ +#include "ge.h" +#include "crypto_uint32.h" + +/* Rename this so as not to interfere with select() which torint.h apparently + * grabs. :p */ +#define select ed25519_ref10_select + +static unsigned char equal(signed char b,signed char c) +{ + unsigned char ub = b; + unsigned char uc = c; + unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */ + crypto_uint32 y = x; /* 0: yes; 1..255: no */ + y -= 1; /* 4294967295: yes; 0..254: no */ + y >>= 31; /* 1: yes; 0: no */ + return y; +} + +static unsigned char negative(signed char b) +{ + uint64_t x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */ + x >>= 63; /* 1: yes; 0: no */ + return x; +} + +static void cmov(ge_precomp *t,ge_precomp *u,unsigned char b) +{ + fe_cmov(t->yplusx,u->yplusx,b); + fe_cmov(t->yminusx,u->yminusx,b); + fe_cmov(t->xy2d,u->xy2d,b); +} + +/* base[i][j] = (j+1)*256^i*B */ +static ge_precomp base[32][8] = { +#include "base.h" +} ; + +static void select(ge_precomp *t,int pos,signed char b) +{ + ge_precomp minust; + unsigned char bnegative = negative(b); + unsigned char babs = b - SHL8( (-bnegative) & (unsigned char)b, 1); + + ge_precomp_0(t); + cmov(t,&base[pos][0],equal(babs,1)); + cmov(t,&base[pos][1],equal(babs,2)); + cmov(t,&base[pos][2],equal(babs,3)); + cmov(t,&base[pos][3],equal(babs,4)); + cmov(t,&base[pos][4],equal(babs,5)); + cmov(t,&base[pos][5],equal(babs,6)); + cmov(t,&base[pos][6],equal(babs,7)); + cmov(t,&base[pos][7],equal(babs,8)); + fe_copy(minust.yplusx,t->yminusx); + fe_copy(minust.yminusx,t->yplusx); + fe_neg(minust.xy2d,t->xy2d); + cmov(t,&minust,bnegative); +} + +/* +h = a * B +where a = a[0]+256*a[1]+...+256^31 a[31] +B is the Ed25519 base point (x,4/5) with x positive. + +Preconditions: + a[31] <= 127 +*/ + +void ge_scalarmult_base(ge_p3 *h,const unsigned char *a) +{ + signed char e[64]; + signed char carry; + ge_p1p1 r; + ge_p2 s; + ge_precomp t; + int i; + + for (i = 0;i < 32;++i) { + e[2 * i + 0] = (a[i] >> 0) & 15; + e[2 * i + 1] = (a[i] >> 4) & 15; + } + /* each e[i] is between 0 and 15 */ + /* e[63] is between 0 and 7 */ + + carry = 0; + for (i = 0;i < 63;++i) { + e[i] += carry; + carry = e[i] + 8; + carry >>= 4; + e[i] -= SHL8(carry,4); + } + e[63] += carry; + /* each e[i] is between -8 and 8 */ + + ge_p3_0(h); + for (i = 1;i < 64;i += 2) { + select(&t,i / 2,e[i]); + ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r); + } + + ge_p3_dbl(&r,h); ge_p1p1_to_p2(&s,&r); + ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r); + ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r); + ge_p2_dbl(&r,&s); ge_p1p1_to_p3(h,&r); + + for (i = 0;i < 64;i += 2) { + select(&t,i / 2,e[i]); + ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r); + } +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_sub.c b/src/wraith/src/ext/ed25519/ref10/ge_sub.c new file mode 100644 index 000000000..69f3d5406 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_sub.c @@ -0,0 +1,11 @@ +#include "ge.h" + +/* +r = p - q +*/ + +void ge_sub(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q) +{ + fe t0; +#include "ge_sub.h" +} diff --git a/src/wraith/src/ext/ed25519/ref10/ge_sub.h b/src/wraith/src/ext/ed25519/ref10/ge_sub.h new file mode 100644 index 000000000..b4ef1f5dd --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_sub.h @@ -0,0 +1,97 @@ + +/* qhasm: enter ge_sub */ + +/* qhasm: fe X1 */ + +/* qhasm: fe Y1 */ + +/* qhasm: fe Z1 */ + +/* qhasm: fe Z2 */ + +/* qhasm: fe T1 */ + +/* qhasm: fe ZZ */ + +/* qhasm: fe YpX2 */ + +/* qhasm: fe YmX2 */ + +/* qhasm: fe T2d2 */ + +/* qhasm: fe X3 */ + +/* qhasm: fe Y3 */ + +/* qhasm: fe Z3 */ + +/* qhasm: fe T3 */ + +/* qhasm: fe YpX1 */ + +/* qhasm: fe YmX1 */ + +/* qhasm: fe A */ + +/* qhasm: fe B */ + +/* qhasm: fe C */ + +/* qhasm: fe D */ + +/* qhasm: YpX1 = Y1+X1 */ +/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ +fe_add(r->X,p->Y,p->X); + +/* qhasm: YmX1 = Y1-X1 */ +/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ +fe_sub(r->Y,p->Y,p->X); + +/* qhasm: A = YpX1*YmX2 */ +/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,YminusX); */ +fe_mul(r->Z,r->X,q->YminusX); + +/* qhasm: B = YmX1*YpX2 */ +/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,YplusX); */ +fe_mul(r->Y,r->Y,q->YplusX); + +/* qhasm: C = T2d2*T1 */ +/* asm 1: fe_mul(>C=fe#4,C=r->T,T2d,T); */ +fe_mul(r->T,q->T2d,p->T); + +/* qhasm: ZZ = Z1*Z2 */ +/* asm 1: fe_mul(>ZZ=fe#1,ZZ=r->X,Z,Z); */ +fe_mul(r->X,p->Z,q->Z); + +/* qhasm: D = 2*ZZ */ +/* asm 1: fe_add(>D=fe#5,D=t0,X,X); */ +fe_add(t0,r->X,r->X); + +/* qhasm: X3 = A-B */ +/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ +fe_sub(r->X,r->Z,r->Y); + +/* qhasm: Y3 = A+B */ +/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ +fe_add(r->Y,r->Z,r->Y); + +/* qhasm: Z3 = D-C */ +/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,T); */ +fe_sub(r->Z,t0,r->T); + +/* qhasm: T3 = D+C */ +/* asm 1: fe_add(>T3=fe#4,T3=r->T,T); */ +fe_add(r->T,t0,r->T); + +/* qhasm: return */ diff --git a/src/wraith/src/ext/ed25519/ref10/ge_sub.q b/src/wraith/src/ext/ed25519/ref10/ge_sub.q new file mode 100644 index 000000000..2779a4a20 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/ge_sub.q @@ -0,0 +1,49 @@ +:name:fe:r->X:r->Y:r->Z:r->T:t0:t1:t2:t3:t4:t5:p->X:p->Y:p->Z:p->T:q->YplusX:q->YminusX:q->Z:q->T2d: +fe r:var/r=fe: + +enter f:enter/f:>X1=fe#11:>Y1=fe#12:>Z1=fe#13:>T1=fe#14:>YpX2=fe#15:>YmX2=fe#16:>Z2=fe#17:>T2d2=fe#18: +return:nofallthrough:h=fe:asm/fe_add(>h,h=fe:asm/fe_sub(>h,h=fe:asm/fe_mul(>h,h=fe:asm/fe_sq(>h,h=fe:asm/fe_add(>h,Z); + fe_mul(x,h->X,recip); + fe_mul(y,h->Y,recip); + fe_tobytes(s,y); + s[31] ^= fe_isnegative(x) << 7; +} diff --git a/src/wraith/src/ext/ed25519/ref10/keyconv.c b/src/wraith/src/ext/ed25519/ref10/keyconv.c new file mode 100644 index 000000000..854b150d6 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/keyconv.c @@ -0,0 +1,37 @@ +/* Added to ref10 for Tor. We place this in the public domain. Alternatively, + * you may have it under the Creative Commons 0 "CC0" license. */ +#include "fe.h" +#include "ed25519_ref10.h" + +int ed25519_ref10_pubkey_from_curve25519_pubkey(unsigned char *out, + const unsigned char *inp, + int signbit) +{ + fe u; + fe one; + fe y; + fe uplus1; + fe uminus1; + fe inv_uplus1; + + /* From prop228: + + Given a curve25519 x-coordinate (u), we can get the y coordinate + of the ed25519 key using + + y = (u-1)/(u+1) + */ + fe_frombytes(u, inp); + fe_1(one); + fe_sub(uminus1, u, one); + fe_add(uplus1, u, one); + fe_invert(inv_uplus1, uplus1); + fe_mul(y, uminus1, inv_uplus1); + + fe_tobytes(out, y); + + /* propagate sign. */ + out[31] |= (!!signbit) << 7; + + return 0; +} diff --git a/src/wraith/src/ext/ed25519/ref10/keypair.c b/src/wraith/src/ext/ed25519/ref10/keypair.c new file mode 100644 index 000000000..68a88f9ad --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/keypair.c @@ -0,0 +1,52 @@ +/* Modified for Tor: new API, 64-byte secret keys. */ + +#include "randombytes.h" +#include +#include "crypto_sign.h" +#include "crypto_hash_sha512.h" +#include "ge.h" + +int +crypto_sign_seckey(unsigned char *sk) +{ + unsigned char seed[32]; + + if (randombytes(seed,32) < 0) + return -1; + + crypto_sign_seckey_expand(sk, seed); + + memwipe(seed, 0, 32); + + return 0; +} + +int crypto_sign_seckey_expand(unsigned char *sk, const unsigned char *skseed) +{ + crypto_hash_sha512(sk,skseed,32); + sk[0] &= 248; + sk[31] &= 63; + sk[31] |= 64; + + return 0; +} + +int crypto_sign_pubkey(unsigned char *pk,const unsigned char *sk) +{ + ge_p3 A; + + ge_scalarmult_base(&A,sk); + ge_p3_tobytes(pk,&A); + + return 0; +} + + +int crypto_sign_keypair(unsigned char *pk,unsigned char *sk) +{ + crypto_sign_seckey(sk); + crypto_sign_pubkey(pk, sk); + + return 0; +} + diff --git a/src/wraith/src/ext/ed25519/ref10/open.c b/src/wraith/src/ext/ed25519/ref10/open.c new file mode 100644 index 000000000..3ab7b7d6e --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/open.c @@ -0,0 +1,43 @@ +/* (Modified by Tor to verify signature separately from message) */ + +#include "crypto_sign.h" +#include +#include "crypto_hash_sha512.h" +#include "crypto_verify_32.h" +#include "ge.h" +#include "sc.h" + +/* 'signature' must be 64-bytes long. */ +int crypto_sign_open( + const unsigned char *signature, + const unsigned char *m, size_t mlen, + const unsigned char *pk +) +{ + unsigned char pkcopy[32]; + unsigned char rcopy[32]; + unsigned char scopy[32]; + unsigned char h[64]; + unsigned char rcheck[32]; + ge_p3 A; + ge_p2 R; + + if (signature[63] & 224) goto badsig; + if (ge_frombytes_negate_vartime(&A,pk) != 0) goto badsig; + + memmove(pkcopy,pk,32); + memmove(rcopy,signature,32); + memmove(scopy,signature + 32,32); + + crypto_hash_sha512_3(h, rcopy, 32, pkcopy, 32, m, mlen); + sc_reduce(h); + + ge_double_scalarmult_vartime(&R,h,&A,scopy); + ge_tobytes(rcheck,&R); + if (crypto_verify_32(rcheck,rcopy) == 0) { + return 0; + } + +badsig: + return -1; +} diff --git a/src/wraith/src/ext/ed25519/ref10/pow22523.h b/src/wraith/src/ext/ed25519/ref10/pow22523.h new file mode 100644 index 000000000..9204ff838 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/pow22523.h @@ -0,0 +1,161 @@ +/* Modified by Tor: pointless loops removed to appease analysis tools */ + +/* qhasm: fe z1 */ + +/* qhasm: fe z2 */ + +/* qhasm: fe z8 */ + +/* qhasm: fe z9 */ + +/* qhasm: fe z11 */ + +/* qhasm: fe z22 */ + +/* qhasm: fe z_5_0 */ + +/* qhasm: fe z_10_5 */ + +/* qhasm: fe z_10_0 */ + +/* qhasm: fe z_20_10 */ + +/* qhasm: fe z_20_0 */ + +/* qhasm: fe z_40_20 */ + +/* qhasm: fe z_40_0 */ + +/* qhasm: fe z_50_10 */ + +/* qhasm: fe z_50_0 */ + +/* qhasm: fe z_100_50 */ + +/* qhasm: fe z_100_0 */ + +/* qhasm: fe z_200_100 */ + +/* qhasm: fe z_200_0 */ + +/* qhasm: fe z_250_50 */ + +/* qhasm: fe z_250_0 */ + +/* qhasm: fe z_252_2 */ + +/* qhasm: fe z_252_3 */ + +/* qhasm: enter pow22523 */ + +/* qhasm: z2 = z1^2^1 */ +/* asm 1: fe_sq(>z2=fe#1,z2=fe#1,>z2=fe#1); */ +/* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ +fe_sq(t0,z); /* DEADCODE This loop has no effect: for (i = 1;i < 1;++i) fe_sq(t0,t0); */ + +/* qhasm: z8 = z2^2^2 */ +/* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ +/* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ +fe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1); + +/* qhasm: z9 = z1*z8 */ +/* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#1,z22=fe#1,>z22=fe#1); */ +/* asm 2: fe_sq(>z22=t0,z22=t0,>z22=t0); */ +fe_sq(t0,t0); /* DEADCODE This loop has no effect: for (i = 1;i < 1;++i) fe_sq(t0,t0); */ + +/* qhasm: z_5_0 = z9*z22 */ +/* asm 1: fe_mul(>z_5_0=fe#1,z_5_0=t0,z_10_5=fe#2,z_10_5=fe#2,>z_10_5=fe#2); */ +/* asm 2: fe_sq(>z_10_5=t1,z_10_5=t1,>z_10_5=t1); */ +fe_sq(t1,t0); for (i = 1;i < 5;++i) fe_sq(t1,t1); + +/* qhasm: z_10_0 = z_10_5*z_5_0 */ +/* asm 1: fe_mul(>z_10_0=fe#1,z_10_0=t0,z_20_10=fe#2,z_20_10=fe#2,>z_20_10=fe#2); */ +/* asm 2: fe_sq(>z_20_10=t1,z_20_10=t1,>z_20_10=t1); */ +fe_sq(t1,t0); for (i = 1;i < 10;++i) fe_sq(t1,t1); + +/* qhasm: z_20_0 = z_20_10*z_10_0 */ +/* asm 1: fe_mul(>z_20_0=fe#2,z_20_0=t1,z_40_20=fe#3,z_40_20=fe#3,>z_40_20=fe#3); */ +/* asm 2: fe_sq(>z_40_20=t2,z_40_20=t2,>z_40_20=t2); */ +fe_sq(t2,t1); for (i = 1;i < 20;++i) fe_sq(t2,t2); + +/* qhasm: z_40_0 = z_40_20*z_20_0 */ +/* asm 1: fe_mul(>z_40_0=fe#2,z_40_0=t1,z_50_10=fe#2,z_50_10=fe#2,>z_50_10=fe#2); */ +/* asm 2: fe_sq(>z_50_10=t1,z_50_10=t1,>z_50_10=t1); */ +fe_sq(t1,t1); for (i = 1;i < 10;++i) fe_sq(t1,t1); + +/* qhasm: z_50_0 = z_50_10*z_10_0 */ +/* asm 1: fe_mul(>z_50_0=fe#1,z_50_0=t0,z_100_50=fe#2,z_100_50=fe#2,>z_100_50=fe#2); */ +/* asm 2: fe_sq(>z_100_50=t1,z_100_50=t1,>z_100_50=t1); */ +fe_sq(t1,t0); for (i = 1;i < 50;++i) fe_sq(t1,t1); + +/* qhasm: z_100_0 = z_100_50*z_50_0 */ +/* asm 1: fe_mul(>z_100_0=fe#2,z_100_0=t1,z_200_100=fe#3,z_200_100=fe#3,>z_200_100=fe#3); */ +/* asm 2: fe_sq(>z_200_100=t2,z_200_100=t2,>z_200_100=t2); */ +fe_sq(t2,t1); for (i = 1;i < 100;++i) fe_sq(t2,t2); + +/* qhasm: z_200_0 = z_200_100*z_100_0 */ +/* asm 1: fe_mul(>z_200_0=fe#2,z_200_0=t1,z_250_50=fe#2,z_250_50=fe#2,>z_250_50=fe#2); */ +/* asm 2: fe_sq(>z_250_50=t1,z_250_50=t1,>z_250_50=t1); */ +fe_sq(t1,t1); for (i = 1;i < 50;++i) fe_sq(t1,t1); + +/* qhasm: z_250_0 = z_250_50*z_50_0 */ +/* asm 1: fe_mul(>z_250_0=fe#1,z_250_0=t0,z_252_2=fe#1,z_252_2=fe#1,>z_252_2=fe#1); */ +/* asm 2: fe_sq(>z_252_2=t0,z_252_2=t0,>z_252_2=t0); */ +fe_sq(t0,t0); for (i = 1;i < 2;++i) fe_sq(t0,t0); + +/* qhasm: z_252_3 = z_252_2*z1 */ +/* asm 1: fe_mul(>z_252_3=fe#12,z_252_3=out,z1=fe#11: +return:nofallthrough:h=fe:asm/fe_mul(>h,h=fe:#k:asm/fe_sq(>h,h,>h);: + +: + +fe z1 +fe z2 +fe z8 +fe z9 +fe z11 +fe z22 +fe z_5_0 +fe z_10_5 +fe z_10_0 +fe z_20_10 +fe z_20_0 +fe z_40_20 +fe z_40_0 +fe z_50_10 +fe z_50_0 +fe z_100_50 +fe z_100_0 +fe z_200_100 +fe z_200_0 +fe z_250_50 +fe z_250_0 +fe z_252_2 +fe z_252_3 + +enter pow22523 + +z2 = z1^2^1 +z8 = z2^2^2 +z9 = z1*z8 +z11 = z2*z9 +z22 = z11^2^1 +z_5_0 = z9*z22 +z_10_5 = z_5_0^2^5 +z_10_0 = z_10_5*z_5_0 +z_20_10 = z_10_0^2^10 +z_20_0 = z_20_10*z_10_0 +z_40_20 = z_20_0^2^20 +z_40_0 = z_40_20*z_20_0 +z_50_10 = z_40_0^2^10 +z_50_0 = z_50_10*z_10_0 +z_100_50 = z_50_0^2^50 +z_100_0 = z_100_50*z_50_0 +z_200_100 = z_100_0^2^100 +z_200_0 = z_200_100*z_100_0 +z_250_50 = z_200_0^2^50 +z_250_0 = z_250_50*z_50_0 +z_252_2 = z_250_0^2^2 +z_252_3 = z_252_2*z1 + +return diff --git a/src/wraith/src/ext/ed25519/ref10/pow225521.h b/src/wraith/src/ext/ed25519/ref10/pow225521.h new file mode 100644 index 000000000..fe2af94c0 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/pow225521.h @@ -0,0 +1,161 @@ +/* Modified by Tor: pointless loops removed to appease analysis tools */ + +/* qhasm: fe z1 */ + +/* qhasm: fe z2 */ + +/* qhasm: fe z8 */ + +/* qhasm: fe z9 */ + +/* qhasm: fe z11 */ + +/* qhasm: fe z22 */ + +/* qhasm: fe z_5_0 */ + +/* qhasm: fe z_10_5 */ + +/* qhasm: fe z_10_0 */ + +/* qhasm: fe z_20_10 */ + +/* qhasm: fe z_20_0 */ + +/* qhasm: fe z_40_20 */ + +/* qhasm: fe z_40_0 */ + +/* qhasm: fe z_50_10 */ + +/* qhasm: fe z_50_0 */ + +/* qhasm: fe z_100_50 */ + +/* qhasm: fe z_100_0 */ + +/* qhasm: fe z_200_100 */ + +/* qhasm: fe z_200_0 */ + +/* qhasm: fe z_250_50 */ + +/* qhasm: fe z_250_0 */ + +/* qhasm: fe z_255_5 */ + +/* qhasm: fe z_255_21 */ + +/* qhasm: enter pow225521 */ + +/* qhasm: z2 = z1^2^1 */ +/* asm 1: fe_sq(>z2=fe#1,z2=fe#1,>z2=fe#1); */ +/* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ +fe_sq(t0,z); /* DEADCODE This loop has no effect: for (i = 1;i < 1;++i) fe_sq(t0,t0); */ + +/* qhasm: z8 = z2^2^2 */ +/* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ +/* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ +fe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1); + +/* qhasm: z9 = z1*z8 */ +/* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#3,z22=fe#3,>z22=fe#3); */ +/* asm 2: fe_sq(>z22=t2,z22=t2,>z22=t2); */ +fe_sq(t2,t0); /* DEADCODE This loop has no effect for (i = 1;i < 1;++i) fe_sq(t2,t2); */ + +/* qhasm: z_5_0 = z9*z22 */ +/* asm 1: fe_mul(>z_5_0=fe#2,z_5_0=t1,z_10_5=fe#3,z_10_5=fe#3,>z_10_5=fe#3); */ +/* asm 2: fe_sq(>z_10_5=t2,z_10_5=t2,>z_10_5=t2); */ +fe_sq(t2,t1); for (i = 1;i < 5;++i) fe_sq(t2,t2); + +/* qhasm: z_10_0 = z_10_5*z_5_0 */ +/* asm 1: fe_mul(>z_10_0=fe#2,z_10_0=t1,z_20_10=fe#3,z_20_10=fe#3,>z_20_10=fe#3); */ +/* asm 2: fe_sq(>z_20_10=t2,z_20_10=t2,>z_20_10=t2); */ +fe_sq(t2,t1); for (i = 1;i < 10;++i) fe_sq(t2,t2); + +/* qhasm: z_20_0 = z_20_10*z_10_0 */ +/* asm 1: fe_mul(>z_20_0=fe#3,z_20_0=t2,z_40_20=fe#4,z_40_20=fe#4,>z_40_20=fe#4); */ +/* asm 2: fe_sq(>z_40_20=t3,z_40_20=t3,>z_40_20=t3); */ +fe_sq(t3,t2); for (i = 1;i < 20;++i) fe_sq(t3,t3); + +/* qhasm: z_40_0 = z_40_20*z_20_0 */ +/* asm 1: fe_mul(>z_40_0=fe#3,z_40_0=t2,z_50_10=fe#3,z_50_10=fe#3,>z_50_10=fe#3); */ +/* asm 2: fe_sq(>z_50_10=t2,z_50_10=t2,>z_50_10=t2); */ +fe_sq(t2,t2); for (i = 1;i < 10;++i) fe_sq(t2,t2); + +/* qhasm: z_50_0 = z_50_10*z_10_0 */ +/* asm 1: fe_mul(>z_50_0=fe#2,z_50_0=t1,z_100_50=fe#3,z_100_50=fe#3,>z_100_50=fe#3); */ +/* asm 2: fe_sq(>z_100_50=t2,z_100_50=t2,>z_100_50=t2); */ +fe_sq(t2,t1); for (i = 1;i < 50;++i) fe_sq(t2,t2); + +/* qhasm: z_100_0 = z_100_50*z_50_0 */ +/* asm 1: fe_mul(>z_100_0=fe#3,z_100_0=t2,z_200_100=fe#4,z_200_100=fe#4,>z_200_100=fe#4); */ +/* asm 2: fe_sq(>z_200_100=t3,z_200_100=t3,>z_200_100=t3); */ +fe_sq(t3,t2); for (i = 1;i < 100;++i) fe_sq(t3,t3); + +/* qhasm: z_200_0 = z_200_100*z_100_0 */ +/* asm 1: fe_mul(>z_200_0=fe#3,z_200_0=t2,z_250_50=fe#3,z_250_50=fe#3,>z_250_50=fe#3); */ +/* asm 2: fe_sq(>z_250_50=t2,z_250_50=t2,>z_250_50=t2); */ +fe_sq(t2,t2); for (i = 1;i < 50;++i) fe_sq(t2,t2); + +/* qhasm: z_250_0 = z_250_50*z_50_0 */ +/* asm 1: fe_mul(>z_250_0=fe#2,z_250_0=t1,z_255_5=fe#2,z_255_5=fe#2,>z_255_5=fe#2); */ +/* asm 2: fe_sq(>z_255_5=t1,z_255_5=t1,>z_255_5=t1); */ +fe_sq(t1,t1); for (i = 1;i < 5;++i) fe_sq(t1,t1); + +/* qhasm: z_255_21 = z_255_5*z11 */ +/* asm 1: fe_mul(>z_255_21=fe#12,z_255_21=out,z1=fe#11: +return:nofallthrough:h=fe:asm/fe_mul(>h,h=fe:#k:asm/fe_sq(>h,h,>h);: + +: + +fe z1 +fe z2 +fe z8 +fe z9 +fe z11 +fe z22 +fe z_5_0 +fe z_10_5 +fe z_10_0 +fe z_20_10 +fe z_20_0 +fe z_40_20 +fe z_40_0 +fe z_50_10 +fe z_50_0 +fe z_100_50 +fe z_100_0 +fe z_200_100 +fe z_200_0 +fe z_250_50 +fe z_250_0 +fe z_255_5 +fe z_255_21 + +enter pow225521 + +z2 = z1^2^1 +z8 = z2^2^2 +z9 = z1*z8 +z11 = z2*z9 +z22 = z11^2^1 +z_5_0 = z9*z22 +z_10_5 = z_5_0^2^5 +z_10_0 = z_10_5*z_5_0 +z_20_10 = z_10_0^2^10 +z_20_0 = z_20_10*z_10_0 +z_40_20 = z_20_0^2^20 +z_40_0 = z_40_20*z_20_0 +z_50_10 = z_40_0^2^10 +z_50_0 = z_50_10*z_10_0 +z_100_50 = z_50_0^2^50 +z_100_0 = z_100_50*z_50_0 +z_200_100 = z_100_0^2^100 +z_200_0 = z_200_100*z_100_0 +z_250_50 = z_200_0^2^50 +z_250_0 = z_250_50*z_50_0 +z_255_5 = z_250_0^2^5 +z_255_21 = z_255_5*z11 + +return diff --git a/src/wraith/src/ext/ed25519/ref10/q2h.sh b/src/wraith/src/ext/ed25519/ref10/q2h.sh new file mode 100644 index 000000000..47ec5110e --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/q2h.sh @@ -0,0 +1,4 @@ +#!/bin/sh +sed 's/^#.*//' \ +| qhasm-generic \ +| sed 's_//\(.*\)$_/*\1 */_' diff --git a/src/wraith/src/ext/ed25519/ref10/randombytes.h b/src/wraith/src/ext/ed25519/ref10/randombytes.h new file mode 100644 index 000000000..8bf31631f --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/randombytes.h @@ -0,0 +1,4 @@ +/* Added for Tor. */ +#include "crypto.h" +#define randombytes(b, n) \ + (crypto_strongest_rand((b), (n)), 0) diff --git a/src/wraith/src/ext/ed25519/ref10/sc.h b/src/wraith/src/ext/ed25519/ref10/sc.h new file mode 100644 index 000000000..d32ed2e8c --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/sc.h @@ -0,0 +1,15 @@ +#ifndef SC_H +#define SC_H + +/* +The set of scalars is \Z/l +where l = 2^252 + 27742317777372353535851937790883648493. +*/ + +#define sc_reduce crypto_sign_ed25519_ref10_sc_reduce +#define sc_muladd crypto_sign_ed25519_ref10_sc_muladd + +extern void sc_reduce(unsigned char *); +extern void sc_muladd(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *); + +#endif diff --git a/src/wraith/src/ext/ed25519/ref10/sc_muladd.c b/src/wraith/src/ext/ed25519/ref10/sc_muladd.c new file mode 100644 index 000000000..20b94c104 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/sc_muladd.c @@ -0,0 +1,368 @@ +#include "sc.h" +#include "crypto_int64.h" +#include "crypto_uint32.h" +#include "crypto_uint64.h" + +static crypto_uint64 load_3(const unsigned char *in) +{ + crypto_uint64 result; + result = (crypto_uint64) in[0]; + result |= ((crypto_uint64) in[1]) << 8; + result |= ((crypto_uint64) in[2]) << 16; + return result; +} + +static crypto_uint64 load_4(const unsigned char *in) +{ + crypto_uint64 result; + result = (crypto_uint64) in[0]; + result |= ((crypto_uint64) in[1]) << 8; + result |= ((crypto_uint64) in[2]) << 16; + result |= ((crypto_uint64) in[3]) << 24; + return result; +} + +/* +Input: + a[0]+256*a[1]+...+256^31*a[31] = a + b[0]+256*b[1]+...+256^31*b[31] = b + c[0]+256*c[1]+...+256^31*c[31] = c + +Output: + s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l + where l = 2^252 + 27742317777372353535851937790883648493. +*/ + +void sc_muladd(unsigned char *s,const unsigned char *a,const unsigned char *b,const unsigned char *c) +{ + crypto_int64 a0 = 2097151 & load_3(a); + crypto_int64 a1 = 2097151 & (load_4(a + 2) >> 5); + crypto_int64 a2 = 2097151 & (load_3(a + 5) >> 2); + crypto_int64 a3 = 2097151 & (load_4(a + 7) >> 7); + crypto_int64 a4 = 2097151 & (load_4(a + 10) >> 4); + crypto_int64 a5 = 2097151 & (load_3(a + 13) >> 1); + crypto_int64 a6 = 2097151 & (load_4(a + 15) >> 6); + crypto_int64 a7 = 2097151 & (load_3(a + 18) >> 3); + crypto_int64 a8 = 2097151 & load_3(a + 21); + crypto_int64 a9 = 2097151 & (load_4(a + 23) >> 5); + crypto_int64 a10 = 2097151 & (load_3(a + 26) >> 2); + crypto_int64 a11 = (load_4(a + 28) >> 7); + crypto_int64 b0 = 2097151 & load_3(b); + crypto_int64 b1 = 2097151 & (load_4(b + 2) >> 5); + crypto_int64 b2 = 2097151 & (load_3(b + 5) >> 2); + crypto_int64 b3 = 2097151 & (load_4(b + 7) >> 7); + crypto_int64 b4 = 2097151 & (load_4(b + 10) >> 4); + crypto_int64 b5 = 2097151 & (load_3(b + 13) >> 1); + crypto_int64 b6 = 2097151 & (load_4(b + 15) >> 6); + crypto_int64 b7 = 2097151 & (load_3(b + 18) >> 3); + crypto_int64 b8 = 2097151 & load_3(b + 21); + crypto_int64 b9 = 2097151 & (load_4(b + 23) >> 5); + crypto_int64 b10 = 2097151 & (load_3(b + 26) >> 2); + crypto_int64 b11 = (load_4(b + 28) >> 7); + crypto_int64 c0 = 2097151 & load_3(c); + crypto_int64 c1 = 2097151 & (load_4(c + 2) >> 5); + crypto_int64 c2 = 2097151 & (load_3(c + 5) >> 2); + crypto_int64 c3 = 2097151 & (load_4(c + 7) >> 7); + crypto_int64 c4 = 2097151 & (load_4(c + 10) >> 4); + crypto_int64 c5 = 2097151 & (load_3(c + 13) >> 1); + crypto_int64 c6 = 2097151 & (load_4(c + 15) >> 6); + crypto_int64 c7 = 2097151 & (load_3(c + 18) >> 3); + crypto_int64 c8 = 2097151 & load_3(c + 21); + crypto_int64 c9 = 2097151 & (load_4(c + 23) >> 5); + crypto_int64 c10 = 2097151 & (load_3(c + 26) >> 2); + crypto_int64 c11 = (load_4(c + 28) >> 7); + crypto_int64 s0; + crypto_int64 s1; + crypto_int64 s2; + crypto_int64 s3; + crypto_int64 s4; + crypto_int64 s5; + crypto_int64 s6; + crypto_int64 s7; + crypto_int64 s8; + crypto_int64 s9; + crypto_int64 s10; + crypto_int64 s11; + crypto_int64 s12; + crypto_int64 s13; + crypto_int64 s14; + crypto_int64 s15; + crypto_int64 s16; + crypto_int64 s17; + crypto_int64 s18; + crypto_int64 s19; + crypto_int64 s20; + crypto_int64 s21; + crypto_int64 s22; + crypto_int64 s23; + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + crypto_int64 carry10; + crypto_int64 carry11; + crypto_int64 carry12; + crypto_int64 carry13; + crypto_int64 carry14; + crypto_int64 carry15; + crypto_int64 carry16; + crypto_int64 carry17; + crypto_int64 carry18; + crypto_int64 carry19; + crypto_int64 carry20; + crypto_int64 carry21; + crypto_int64 carry22; + + s0 = c0 + a0*b0; + s1 = c1 + a0*b1 + a1*b0; + s2 = c2 + a0*b2 + a1*b1 + a2*b0; + s3 = c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0; + s4 = c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0; + s5 = c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0; + s6 = c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0; + s7 = c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0; + s8 = c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0; + s9 = c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0; + s10 = c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0; + s11 = c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0; + s12 = a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1; + s13 = a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2; + s14 = a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3; + s15 = a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4; + s16 = a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5; + s17 = a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6; + s18 = a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7; + s19 = a8*b11 + a9*b10 + a10*b9 + a11*b8; + s20 = a9*b11 + a10*b10 + a11*b9; + s21 = a10*b11 + a11*b10; + s22 = a11*b11; + s23 = 0; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= SHL64(carry0,21); + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= SHL64(carry2,21); + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= SHL64(carry4,21); + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= SHL64(carry6,21); + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= SHL64(carry8,21); + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= SHL64(carry10,21); + carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= SHL64(carry12,21); + carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= SHL64(carry14,21); + carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= SHL64(carry16,21); + carry18 = (s18 + (1<<20)) >> 21; s19 += carry18; s18 -= SHL64(carry18,21); + carry20 = (s20 + (1<<20)) >> 21; s21 += carry20; s20 -= SHL64(carry20,21); + carry22 = (s22 + (1<<20)) >> 21; s23 += carry22; s22 -= SHL64(carry22,21); + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= SHL64(carry1,21); + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= SHL64(carry3,21); + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= SHL64(carry5,21); + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= SHL64(carry7,21); + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= SHL64(carry9,21); + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= SHL64(carry11,21); + carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= SHL64(carry13,21); + carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= SHL64(carry15,21); + carry17 = (s17 + (1<<20)) >> 21; s18 += carry17; s17 -= SHL64(carry17,21); + carry19 = (s19 + (1<<20)) >> 21; s20 += carry19; s19 -= SHL64(carry19,21); + carry21 = (s21 + (1<<20)) >> 21; s22 += carry21; s21 -= SHL64(carry21,21); + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= SHL64(carry6,21); + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= SHL64(carry8,21); + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= SHL64(carry10,21); + carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= SHL64(carry12,21); + carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= SHL64(carry14,21); + carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= SHL64(carry16,21); + + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= SHL64(carry7,21); + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= SHL64(carry9,21); + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= SHL64(carry11,21); + carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= SHL64(carry13,21); + carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= SHL64(carry15,21); + + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= SHL64(carry0,21); + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= SHL64(carry2,21); + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= SHL64(carry4,21); + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= SHL64(carry6,21); + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= SHL64(carry8,21); + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= SHL64(carry10,21); + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= SHL64(carry1,21); + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= SHL64(carry3,21); + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= SHL64(carry5,21); + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= SHL64(carry7,21); + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= SHL64(carry9,21); + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= SHL64(carry11,21); + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= SHL64(carry0,21); + carry1 = s1 >> 21; s2 += carry1; s1 -= SHL64(carry1,21); + carry2 = s2 >> 21; s3 += carry2; s2 -= SHL64(carry2,21); + carry3 = s3 >> 21; s4 += carry3; s3 -= SHL64(carry3,21); + carry4 = s4 >> 21; s5 += carry4; s4 -= SHL64(carry4,21); + carry5 = s5 >> 21; s6 += carry5; s5 -= SHL64(carry5,21); + carry6 = s6 >> 21; s7 += carry6; s6 -= SHL64(carry6,21); + carry7 = s7 >> 21; s8 += carry7; s7 -= SHL64(carry7,21); + carry8 = s8 >> 21; s9 += carry8; s8 -= SHL64(carry8,21); + carry9 = s9 >> 21; s10 += carry9; s9 -= SHL64(carry9,21); + carry10 = s10 >> 21; s11 += carry10; s10 -= SHL64(carry10,21); + carry11 = s11 >> 21; s12 += carry11; s11 -= SHL64(carry11,21); + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= SHL64(carry0,21); + carry1 = s1 >> 21; s2 += carry1; s1 -= SHL64(carry1,21); + carry2 = s2 >> 21; s3 += carry2; s2 -= SHL64(carry2,21); + carry3 = s3 >> 21; s4 += carry3; s3 -= SHL64(carry3,21); + carry4 = s4 >> 21; s5 += carry4; s4 -= SHL64(carry4,21); + carry5 = s5 >> 21; s6 += carry5; s5 -= SHL64(carry5,21); + carry6 = s6 >> 21; s7 += carry6; s6 -= SHL64(carry6,21); + carry7 = s7 >> 21; s8 += carry7; s7 -= SHL64(carry7,21); + carry8 = s8 >> 21; s9 += carry8; s8 -= SHL64(carry8,21); + carry9 = s9 >> 21; s10 += carry9; s9 -= SHL64(carry9,21); + carry10 = s10 >> 21; s11 += carry10; s10 -= SHL64(carry10,21); + + s[0] = s0 >> 0; + s[1] = s0 >> 8; + s[2] = (s0 >> 16) | SHL64(s1,5); + s[3] = s1 >> 3; + s[4] = s1 >> 11; + s[5] = (s1 >> 19) | SHL64(s2,2); + s[6] = s2 >> 6; + s[7] = (s2 >> 14) | SHL64(s3,7); + s[8] = s3 >> 1; + s[9] = s3 >> 9; + s[10] = (s3 >> 17) | SHL64(s4,4); + s[11] = s4 >> 4; + s[12] = s4 >> 12; + s[13] = (s4 >> 20) | SHL64(s5,1); + s[14] = s5 >> 7; + s[15] = (s5 >> 15) | SHL64(s6,6); + s[16] = s6 >> 2; + s[17] = s6 >> 10; + s[18] = (s6 >> 18) | SHL64(s7,3); + s[19] = s7 >> 5; + s[20] = s7 >> 13; + s[21] = s8 >> 0; + s[22] = s8 >> 8; + s[23] = (s8 >> 16) | SHL64(s9,5); + s[24] = s9 >> 3; + s[25] = s9 >> 11; + s[26] = (s9 >> 19) | SHL64(s10,2); + s[27] = s10 >> 6; + s[28] = (s10 >> 14) | SHL64(s11,7); + s[29] = s11 >> 1; + s[30] = s11 >> 9; + s[31] = s11 >> 17; +} diff --git a/src/wraith/src/ext/ed25519/ref10/sc_reduce.c b/src/wraith/src/ext/ed25519/ref10/sc_reduce.c new file mode 100644 index 000000000..c5afa5374 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/sc_reduce.c @@ -0,0 +1,275 @@ +#include "sc.h" +#include "crypto_int64.h" +#include "crypto_uint32.h" +#include "crypto_uint64.h" + +static crypto_uint64 load_3(const unsigned char *in) +{ + crypto_uint64 result; + result = (crypto_uint64) in[0]; + result |= ((crypto_uint64) in[1]) << 8; + result |= ((crypto_uint64) in[2]) << 16; + return result; +} + +static crypto_uint64 load_4(const unsigned char *in) +{ + crypto_uint64 result; + result = (crypto_uint64) in[0]; + result |= ((crypto_uint64) in[1]) << 8; + result |= ((crypto_uint64) in[2]) << 16; + result |= ((crypto_uint64) in[3]) << 24; + return result; +} + +/* +Input: + s[0]+256*s[1]+...+256^63*s[63] = s + +Output: + s[0]+256*s[1]+...+256^31*s[31] = s mod l + where l = 2^252 + 27742317777372353535851937790883648493. + Overwrites s in place. +*/ + +void sc_reduce(unsigned char *s) +{ + crypto_int64 s0 = 2097151 & load_3(s); + crypto_int64 s1 = 2097151 & (load_4(s + 2) >> 5); + crypto_int64 s2 = 2097151 & (load_3(s + 5) >> 2); + crypto_int64 s3 = 2097151 & (load_4(s + 7) >> 7); + crypto_int64 s4 = 2097151 & (load_4(s + 10) >> 4); + crypto_int64 s5 = 2097151 & (load_3(s + 13) >> 1); + crypto_int64 s6 = 2097151 & (load_4(s + 15) >> 6); + crypto_int64 s7 = 2097151 & (load_3(s + 18) >> 3); + crypto_int64 s8 = 2097151 & load_3(s + 21); + crypto_int64 s9 = 2097151 & (load_4(s + 23) >> 5); + crypto_int64 s10 = 2097151 & (load_3(s + 26) >> 2); + crypto_int64 s11 = 2097151 & (load_4(s + 28) >> 7); + crypto_int64 s12 = 2097151 & (load_4(s + 31) >> 4); + crypto_int64 s13 = 2097151 & (load_3(s + 34) >> 1); + crypto_int64 s14 = 2097151 & (load_4(s + 36) >> 6); + crypto_int64 s15 = 2097151 & (load_3(s + 39) >> 3); + crypto_int64 s16 = 2097151 & load_3(s + 42); + crypto_int64 s17 = 2097151 & (load_4(s + 44) >> 5); + crypto_int64 s18 = 2097151 & (load_3(s + 47) >> 2); + crypto_int64 s19 = 2097151 & (load_4(s + 49) >> 7); + crypto_int64 s20 = 2097151 & (load_4(s + 52) >> 4); + crypto_int64 s21 = 2097151 & (load_3(s + 55) >> 1); + crypto_int64 s22 = 2097151 & (load_4(s + 57) >> 6); + crypto_int64 s23 = (load_4(s + 60) >> 3); + crypto_int64 carry0; + crypto_int64 carry1; + crypto_int64 carry2; + crypto_int64 carry3; + crypto_int64 carry4; + crypto_int64 carry5; + crypto_int64 carry6; + crypto_int64 carry7; + crypto_int64 carry8; + crypto_int64 carry9; + crypto_int64 carry10; + crypto_int64 carry11; + crypto_int64 carry12; + crypto_int64 carry13; + crypto_int64 carry14; + crypto_int64 carry15; + crypto_int64 carry16; + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= SHL64(carry6,21); + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= SHL64(carry8,21); + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= SHL64(carry10,21); + carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= SHL64(carry12,21); + carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= SHL64(carry14,21); + carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= SHL64(carry16,21); + + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= SHL64(carry7,21); + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= SHL64(carry9,21); + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= SHL64(carry11,21); + carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= SHL64(carry13,21); + carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= SHL64(carry15,21); + + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= SHL64(carry0,21); + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= SHL64(carry2,21); + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= SHL64(carry4,21); + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= SHL64(carry6,21); + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= SHL64(carry8,21); + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= SHL64(carry10,21); + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= SHL64(carry1,21); + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= SHL64(carry3,21); + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= SHL64(carry5,21); + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= SHL64(carry7,21); + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= SHL64(carry9,21); + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= SHL64(carry11,21); + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= SHL64(carry0,21); + carry1 = s1 >> 21; s2 += carry1; s1 -= SHL64(carry1,21); + carry2 = s2 >> 21; s3 += carry2; s2 -= SHL64(carry2,21); + carry3 = s3 >> 21; s4 += carry3; s3 -= SHL64(carry3,21); + carry4 = s4 >> 21; s5 += carry4; s4 -= SHL64(carry4,21); + carry5 = s5 >> 21; s6 += carry5; s5 -= SHL64(carry5,21); + carry6 = s6 >> 21; s7 += carry6; s6 -= SHL64(carry6,21); + carry7 = s7 >> 21; s8 += carry7; s7 -= SHL64(carry7,21); + carry8 = s8 >> 21; s9 += carry8; s8 -= SHL64(carry8,21); + carry9 = s9 >> 21; s10 += carry9; s9 -= SHL64(carry9,21); + carry10 = s10 >> 21; s11 += carry10; s10 -= SHL64(carry10,21); + carry11 = s11 >> 21; s12 += carry11; s11 -= SHL64(carry11,21); + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= SHL64(carry0,21); + carry1 = s1 >> 21; s2 += carry1; s1 -= SHL64(carry1,21); + carry2 = s2 >> 21; s3 += carry2; s2 -= SHL64(carry2,21); + carry3 = s3 >> 21; s4 += carry3; s3 -= SHL64(carry3,21); + carry4 = s4 >> 21; s5 += carry4; s4 -= SHL64(carry4,21); + carry5 = s5 >> 21; s6 += carry5; s5 -= SHL64(carry5,21); + carry6 = s6 >> 21; s7 += carry6; s6 -= SHL64(carry6,21); + carry7 = s7 >> 21; s8 += carry7; s7 -= SHL64(carry7,21); + carry8 = s8 >> 21; s9 += carry8; s8 -= SHL64(carry8,21); + carry9 = s9 >> 21; s10 += carry9; s9 -= SHL64(carry9,21); + carry10 = s10 >> 21; s11 += carry10; s10 -= SHL64(carry10,21); + + s[0] = s0 >> 0; + s[1] = s0 >> 8; + s[2] = (s0 >> 16) | SHL64(s1,5); + s[3] = s1 >> 3; + s[4] = s1 >> 11; + s[5] = (s1 >> 19) | SHL64(s2,2); + s[6] = s2 >> 6; + s[7] = (s2 >> 14) | SHL64(s3,7); + s[8] = s3 >> 1; + s[9] = s3 >> 9; + s[10] = (s3 >> 17) | SHL64(s4,4); + s[11] = s4 >> 4; + s[12] = s4 >> 12; + s[13] = (s4 >> 20) | SHL64(s5,1); + s[14] = s5 >> 7; + s[15] = (s5 >> 15) | SHL64(s6,6); + s[16] = s6 >> 2; + s[17] = s6 >> 10; + s[18] = (s6 >> 18) | SHL64(s7,3); + s[19] = s7 >> 5; + s[20] = s7 >> 13; + s[21] = s8 >> 0; + s[22] = s8 >> 8; + s[23] = (s8 >> 16) | SHL64(s9,5); + s[24] = s9 >> 3; + s[25] = s9 >> 11; + s[26] = (s9 >> 19) | SHL64(s10,2); + s[27] = s10 >> 6; + s[28] = (s10 >> 14) | SHL64(s11,7); + s[29] = s11 >> 1; + s[30] = s11 >> 9; + s[31] = s11 >> 17; +} diff --git a/src/wraith/src/ext/ed25519/ref10/sign.c b/src/wraith/src/ext/ed25519/ref10/sign.c new file mode 100644 index 000000000..1190a0fc9 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/sign.c @@ -0,0 +1,29 @@ +/* (Modified by Tor to generate detached signatures.) */ +#include +#include "crypto_sign.h" +#include "crypto_hash_sha512.h" +#include "ge.h" +#include "sc.h" + +int crypto_sign( + unsigned char *sig, + const unsigned char *m, size_t mlen, + const unsigned char *sk,const unsigned char *pk +) +{ + unsigned char nonce[64]; + unsigned char hram[64]; + ge_p3 R; + + crypto_hash_sha512_2(nonce, sk+32, 32, m, mlen); + + sc_reduce(nonce); + ge_scalarmult_base(&R,nonce); + ge_p3_tobytes(sig,&R); + + crypto_hash_sha512_3(hram, sig, 32, pk, 32, m, mlen); + sc_reduce(hram); + sc_muladd(sig + 32,hram,sk,nonce); + + return 0; +} diff --git a/src/wraith/src/ext/ed25519/ref10/sqrtm1.h b/src/wraith/src/ext/ed25519/ref10/sqrtm1.h new file mode 100644 index 000000000..d8caa23b6 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/sqrtm1.h @@ -0,0 +1 @@ +-32595792,-7943725,9377950,3500415,12389472,-272473,-25146209,-2005654,326686,11406482 diff --git a/src/wraith/src/ext/ed25519/ref10/sqrtm1.py b/src/wraith/src/ext/ed25519/ref10/sqrtm1.py new file mode 100644 index 000000000..9a47fbc12 --- /dev/null +++ b/src/wraith/src/ext/ed25519/ref10/sqrtm1.py @@ -0,0 +1,28 @@ +q = 2**255 - 19 + +def expmod(b,e,m): + if e == 0: return 1 + t = expmod(b,e/2,m)**2 % m + if e & 1: t = (t*b) % m + return t + +def inv(x): + return expmod(x,q-2,q) + +def radix255(x): + x = x % q + if x + x > q: x -= q + x = [x,0,0,0,0,0,0,0,0,0] + bits = [26,25,26,25,26,25,26,25,26,25] + for i in range(9): + carry = (x[i] + 2**(bits[i]-1)) / 2**bits[i] + x[i] -= carry * 2**bits[i] + x[i + 1] += carry + result = "" + for i in range(9): + result = result+str(x[i])+"," + result = result+str(x[9]) + return result + +I = expmod(2,(q-1)/4,q) +print radix255(I) diff --git a/src/wraith/src/ext/ht.h b/src/wraith/src/ext/ht.h new file mode 100644 index 000000000..99da773fa --- /dev/null +++ b/src/wraith/src/ext/ht.h @@ -0,0 +1,620 @@ +/* Copyright (c) 2002, Christopher Clark. + * Copyright (c) 2005-2006, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See license at end. */ + +/* Based on ideas by Christopher Clark and interfaces from Niels Provos. */ + +/* + These macros provide an intrustive implementation for a typesafe chaining + hash table, loosely based on the BSD tree.h and queue.h macros. Here's + how to use them. + + First, pick a the structure that you'll be storing in the hashtable. Let's + say that's "struct dinosaur". To this structure, you add an HT_ENTRY() + member, as such: + + struct dinosaur { + HT_ENTRY(dinosaur) node; // The name inside the () must match the + // struct. + + // These are just fields from the dinosaur structure... + long dinosaur_id; + char *name; + long age; + int is_ornithischian; + int is_herbivorous; + }; + + You can declare the hashtable itself as: + + HT_HEAD(dinosaur_ht, dinosaur); + + This declares a new 'struct dinosaur_ht' type. + + Now you need to declare two functions to help implement the hashtable: one + compares two dinosaurs for equality, and one computes the hash of a + dinosaur. Let's say that two dinosaurs are equal if they have the same ID + and name. + + int + dinosaurs_equal(const struct dinosaur *d1, const struct dinosaur *d2) + { + return d1->dinosaur_id == d2->dinosaur_id && + 0 == strcmp(d1->name, d2->name); + } + + unsigned + dinosaur_hash(const struct dinosaur *d) + { + // This is a very bad hash function. Use siphash24g instead. + return (d->dinosaur_id + d->name[0] ) * 1337 + d->name[1] * 1337; + } + + Now you'll need to declare the functions that manipulate the hash table. + To do this, you put this declaration either in a header file, or inside + a regular module, depending on what visibility you want. + + HT_PROTOTYPE(dinosaur_ht, // The name of the hashtable struct + dinosaur, // The name of the element struct, + node, // The name of HT_ENTRY member + dinosaur_hash, dinosaurs_equal); + + Later, inside a C function, you use this macro to declare the hashtable + functions. + + HT_GENERATE2(dinosaur_ht, dinosaur, node, dinosaur_hash, dinosaurs_equal, + 0.6, tor_reallocarray, tor_free_); + + Note the use of tor_free_, not tor_free. The 0.6 is magic. + + Now you can use the hashtable! You can initialize one with + + struct dinosaur_ht my_dinos = HT_INITIALIZER(); + + Or create one in core with + + struct dinosaur_ht *dinos = tor_malloc(sizeof(dinosaur_ht)); + HT_INIT(dinosaur_ht, dinos); + + To the hashtable, you use the HT_FOO(dinosaur_ht, ...) macros. For + example, to put new_dino into dinos, you say: + + HT_REPLACE(dinosaur_ht, dinos, new_dino); + + If you're searching for an element, you need to use a dummy 'key' element in + the search. For example. + + struct dinosaur dino_key; + dino_key.dinosaur_id = 12345; + dino_key.name = tor_strdup("Atrociraptor"); + + struct dinosaur *found = HT_FIND(dinosaurs_ht, dinos, &dino_key); + + Have fun with your hash table! + + */ + +#ifndef HT_H_INCLUDED_ +#define HT_H_INCLUDED_ + +#define HT_HEAD(name, type) \ + struct name { \ + /* The hash table itself. */ \ + struct type **hth_table; \ + /* How long is the hash table? */ \ + unsigned hth_table_length; \ + /* How many elements does the table contain? */ \ + unsigned hth_n_entries; \ + /* How many elements will we allow in the table before resizing it? */ \ + unsigned hth_load_limit; \ + /* Position of hth_table_length in the primes table. */ \ + int hth_prime_idx; \ + } + +#define HT_INITIALIZER() \ + { NULL, 0, 0, 0, -1 } + +#ifdef HT_NO_CACHE_HASH_VALUES +#define HT_ENTRY(type) \ + struct { \ + struct type *hte_next; \ + } +#else +#define HT_ENTRY(type) \ + struct { \ + struct type *hte_next; \ + unsigned hte_hash; \ + } +#endif + +/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ +#define HT_EMPTY(head) \ + (((head)->hth_n_entries == 0) || 0) + +/* How many elements in 'head'? */ +#define HT_SIZE(head) \ + ((head)->hth_n_entries) + +/* Return memory usage for a hashtable (not counting the entries themselves) */ +#define HT_MEM_USAGE(head) \ + (sizeof(*head) + (head)->hth_table_length * sizeof(void*)) + +#define HT_FIND(name, head, elm) name##_HT_FIND((head), (elm)) +#define HT_INSERT(name, head, elm) name##_HT_INSERT((head), (elm)) +#define HT_REPLACE(name, head, elm) name##_HT_REPLACE((head), (elm)) +#define HT_REMOVE(name, head, elm) name##_HT_REMOVE((head), (elm)) +#define HT_START(name, head) name##_HT_START(head) +#define HT_NEXT(name, head, elm) name##_HT_NEXT((head), (elm)) +#define HT_NEXT_RMV(name, head, elm) name##_HT_NEXT_RMV((head), (elm)) +#define HT_CLEAR(name, head) name##_HT_CLEAR(head) +#define HT_INIT(name, head) name##_HT_INIT(head) +#define HT_REP_IS_BAD_(name, head) name##_HT_REP_IS_BAD_(head) +#define HT_FOREACH_FN(name, head, fn, data) \ + name##_HT_FOREACH_FN((head), (fn), (data)) +/* Helper: */ +static inline unsigned +ht_improve_hash(unsigned h) +{ + /* Aim to protect against poor hash functions by adding logic here + * - logic taken from java 1.4 hashtable source */ + h += ~(h << 9); + h ^= ((h >> 14) | (h << 18)); /* >>> */ + h += (h << 4); + h ^= ((h >> 10) | (h << 22)); /* >>> */ + return h; +} + +#if 0 +/** Basic string hash function, from Java standard String.hashCode(). */ +static inline unsigned +ht_string_hash(const char *s) +{ + unsigned h = 0; + int m = 1; + while (*s) { + h += ((signed char)*s++)*m; + m = (m<<5)-1; /* m *= 31 */ + } + return h; +} +#endif + +#if 0 +/** Basic string hash function, from Python's str.__hash__() */ +static inline unsigned +ht_string_hash(const char *s) +{ + unsigned h; + const unsigned char *cp = (const unsigned char *)s; + h = *cp << 7; + while (*cp) { + h = (1000003*h) ^ *cp++; + } + /* This conversion truncates the length of the string, but that's ok. */ + h ^= (unsigned)(cp-(const unsigned char*)s); + return h; +} +#endif + +#ifndef HT_NO_CACHE_HASH_VALUES +#define HT_SET_HASH_(elm, field, hashfn) \ + do { (elm)->field.hte_hash = hashfn(elm); } while (0) +#define HT_SET_HASHVAL_(elm, field, val) \ + do { (elm)->field.hte_hash = (val); } while (0) +#define HT_ELT_HASH_(elm, field, hashfn) \ + ((elm)->field.hte_hash) +#else +#define HT_SET_HASH_(elm, field, hashfn) \ + ((void)0) +#define HT_ELT_HASH_(elm, field, hashfn) \ + (hashfn(elm)) +#define HT_SET_HASHVAL_(elm, field, val) \ + ((void)0) +#endif + +#define HT_BUCKET_NUM_(head, field, elm, hashfn) \ + (HT_ELT_HASH_(elm,field,hashfn) % head->hth_table_length) + +/* Helper: alias for the bucket containing 'elm'. */ +#define HT_BUCKET_(head, field, elm, hashfn) \ + ((head)->hth_table[HT_BUCKET_NUM_(head, field, elm, hashfn)]) + +#define HT_FOREACH(x, name, head) \ + for ((x) = HT_START(name, head); \ + (x) != NULL; \ + (x) = HT_NEXT(name, head, x)) + +#ifndef HT_NDEBUG +#define HT_ASSERT_(x) tor_assert(x) +#else +#define HT_ASSERT_(x) (void)0 +#endif + +#define HT_PROTOTYPE(name, type, field, hashfn, eqfn) \ + int name##_HT_GROW(struct name *ht, unsigned min_capacity); \ + void name##_HT_CLEAR(struct name *ht); \ + int name##_HT_REP_IS_BAD_(const struct name *ht); \ + static inline void \ + name##_HT_INIT(struct name *head) { \ + head->hth_table_length = 0; \ + head->hth_table = NULL; \ + head->hth_n_entries = 0; \ + head->hth_load_limit = 0; \ + head->hth_prime_idx = -1; \ + } \ + /* Helper: returns a pointer to the right location in the table \ + * 'head' to find or insert the element 'elm'. */ \ + static inline struct type ** \ + name##_HT_FIND_P_(struct name *head, struct type *elm) \ + { \ + struct type **p; \ + if (!head->hth_table) \ + return NULL; \ + p = &HT_BUCKET_(head, field, elm, hashfn); \ + while (*p) { \ + if (eqfn(*p, elm)) \ + return p; \ + p = &(*p)->field.hte_next; \ + } \ + return p; \ + } \ + /* Return a pointer to the element in the table 'head' matching 'elm', \ + * or NULL if no such element exists */ \ + ATTR_UNUSED static inline struct type * \ + name##_HT_FIND(const struct name *head, struct type *elm) \ + { \ + struct type **p; \ + struct name *h = (struct name *) head; \ + HT_SET_HASH_(elm, field, hashfn); \ + p = name##_HT_FIND_P_(h, elm); \ + return p ? *p : NULL; \ + } \ + /* Insert the element 'elm' into the table 'head'. Do not call this \ + * function if the table might already contain a matching element. */ \ + ATTR_UNUSED static inline void \ + name##_HT_INSERT(struct name *head, struct type *elm) \ + { \ + struct type **p; \ + if (!head->hth_table || head->hth_n_entries >= head->hth_load_limit) \ + name##_HT_GROW(head, head->hth_n_entries+1); \ + ++head->hth_n_entries; \ + HT_SET_HASH_(elm, field, hashfn); \ + p = &HT_BUCKET_(head, field, elm, hashfn); \ + elm->field.hte_next = *p; \ + *p = elm; \ + } \ + /* Insert the element 'elm' into the table 'head'. If there already \ + * a matching element in the table, replace that element and return \ + * it. */ \ + ATTR_UNUSED static inline struct type * \ + name##_HT_REPLACE(struct name *head, struct type *elm) \ + { \ + struct type **p, *r; \ + if (!head->hth_table || head->hth_n_entries >= head->hth_load_limit) \ + name##_HT_GROW(head, head->hth_n_entries+1); \ + HT_SET_HASH_(elm, field, hashfn); \ + p = name##_HT_FIND_P_(head, elm); \ + HT_ASSERT_(p != NULL); /* this holds because we called HT_GROW */ \ + r = *p; \ + *p = elm; \ + if (r && (r!=elm)) { \ + elm->field.hte_next = r->field.hte_next; \ + r->field.hte_next = NULL; \ + return r; \ + } else { \ + ++head->hth_n_entries; \ + return NULL; \ + } \ + } \ + /* Remove any element matching 'elm' from the table 'head'. If such \ + * an element is found, return it; otherwise return NULL. */ \ + ATTR_UNUSED static inline struct type * \ + name##_HT_REMOVE(struct name *head, struct type *elm) \ + { \ + struct type **p, *r; \ + HT_SET_HASH_(elm, field, hashfn); \ + p = name##_HT_FIND_P_(head,elm); \ + if (!p || !*p) \ + return NULL; \ + r = *p; \ + *p = r->field.hte_next; \ + r->field.hte_next = NULL; \ + --head->hth_n_entries; \ + return r; \ + } \ + /* Invoke the function 'fn' on every element of the table 'head', \ + * using 'data' as its second argument. If the function returns \ + * nonzero, remove the most recently examined element before invoking \ + * the function again. */ \ + ATTR_UNUSED static inline void \ + name##_HT_FOREACH_FN(struct name *head, \ + int (*fn)(struct type *, void *), \ + void *data) \ +{ \ + unsigned idx; \ + struct type **p, **nextp, *next; \ + if (!head->hth_table) \ + return; \ + for (idx=0; idx < head->hth_table_length; ++idx) { \ + p = &head->hth_table[idx]; \ + while (*p) { \ + nextp = &(*p)->field.hte_next; \ + next = *nextp; \ + if (fn(*p, data)) { \ + --head->hth_n_entries; \ + *p = next; \ + } else { \ + p = nextp; \ + } \ + } \ + } \ + } \ + /* Return a pointer to the first element in the table 'head', under \ + * an arbitrary order. This order is stable under remove operations, \ + * but not under others. If the table is empty, return NULL. */ \ + ATTR_UNUSED static inline struct type ** \ + name##_HT_START(struct name *head) \ + { \ + unsigned b = 0; \ + while (b < head->hth_table_length) { \ + if (head->hth_table[b]) { \ + HT_ASSERT_(b == \ + HT_BUCKET_NUM_(head,field,head->hth_table[b],hashfn)); \ + return &head->hth_table[b]; \ + } \ + ++b; \ + } \ + return NULL; \ + } \ + /* Return the next element in 'head' after 'elm', under the arbitrary \ + * order used by HT_START. If there are no more elements, return \ + * NULL. If 'elm' is to be removed from the table, you must call \ + * this function for the next value before you remove it. \ + */ \ + ATTR_UNUSED static inline struct type ** \ + name##_HT_NEXT(struct name *head, struct type **elm) \ + { \ + if ((*elm)->field.hte_next) { \ + HT_ASSERT_(HT_BUCKET_NUM_(head,field,*elm,hashfn) == \ + HT_BUCKET_NUM_(head,field,(*elm)->field.hte_next,hashfn)); \ + return &(*elm)->field.hte_next; \ + } else { \ + unsigned b = HT_BUCKET_NUM_(head,field,*elm,hashfn)+1; \ + while (b < head->hth_table_length) { \ + if (head->hth_table[b]) { \ + HT_ASSERT_(b == \ + HT_BUCKET_NUM_(head,field,head->hth_table[b],hashfn)); \ + return &head->hth_table[b]; \ + } \ + ++b; \ + } \ + return NULL; \ + } \ + } \ + ATTR_UNUSED static inline struct type ** \ + name##_HT_NEXT_RMV(struct name *head, struct type **elm) \ + { \ + unsigned h = HT_ELT_HASH_(*elm, field, hashfn); \ + *elm = (*elm)->field.hte_next; \ + --head->hth_n_entries; \ + if (*elm) { \ + return elm; \ + } else { \ + unsigned b = (h % head->hth_table_length)+1; \ + while (b < head->hth_table_length) { \ + if (head->hth_table[b]) \ + return &head->hth_table[b]; \ + ++b; \ + } \ + return NULL; \ + } \ + } + +#define HT_GENERATE2(name, type, field, hashfn, eqfn, load, reallocarrayfn, \ + freefn) \ + /* Primes that aren't too far from powers of two. We stop at */ \ + /* P=402653189 because P*sizeof(void*) is less than SSIZE_MAX */ \ + /* even on a 32-bit platform. */ \ + static unsigned name##_PRIMES[] = { \ + 53, 97, 193, 389, \ + 769, 1543, 3079, 6151, \ + 12289, 24593, 49157, 98317, \ + 196613, 393241, 786433, 1572869, \ + 3145739, 6291469, 12582917, 25165843, \ + 50331653, 100663319, 201326611, 402653189 \ + }; \ + static unsigned name##_N_PRIMES = \ + (unsigned)(sizeof(name##_PRIMES)/sizeof(name##_PRIMES[0])); \ + /* Expand the internal table of 'head' until it is large enough to \ + * hold 'size' elements. Return 0 on success, -1 on allocation \ + * failure. */ \ + int \ + name##_HT_GROW(struct name *head, unsigned size) \ + { \ + unsigned new_len, new_load_limit; \ + int prime_idx; \ + struct type **new_table; \ + if (head->hth_prime_idx == (int)name##_N_PRIMES - 1) \ + return 0; \ + if (head->hth_load_limit > size) \ + return 0; \ + prime_idx = head->hth_prime_idx; \ + do { \ + new_len = name##_PRIMES[++prime_idx]; \ + new_load_limit = (unsigned)(load*new_len); \ + } while (new_load_limit <= size && \ + prime_idx < (int)name##_N_PRIMES); \ + if ((new_table = reallocarrayfn(NULL, new_len, sizeof(struct type*)))) { \ + unsigned b; \ + memset(new_table, 0, new_len*sizeof(struct type*)); \ + for (b = 0; b < head->hth_table_length; ++b) { \ + struct type *elm, *next; \ + unsigned b2; \ + elm = head->hth_table[b]; \ + while (elm) { \ + next = elm->field.hte_next; \ + b2 = HT_ELT_HASH_(elm, field, hashfn) % new_len; \ + elm->field.hte_next = new_table[b2]; \ + new_table[b2] = elm; \ + elm = next; \ + } \ + } \ + if (head->hth_table) \ + freefn(head->hth_table); \ + head->hth_table = new_table; \ + } else { \ + unsigned b, b2; \ + new_table = reallocarrayfn(head->hth_table, new_len, sizeof(struct type*)); \ + if (!new_table) return -1; \ + memset(new_table + head->hth_table_length, 0, \ + (new_len - head->hth_table_length)*sizeof(struct type*)); \ + for (b=0; b < head->hth_table_length; ++b) { \ + struct type *e, **pE; \ + for (pE = &new_table[b], e = *pE; e != NULL; e = *pE) { \ + b2 = HT_ELT_HASH_(e, field, hashfn) % new_len; \ + if (b2 == b) { \ + pE = &e->field.hte_next; \ + } else { \ + *pE = e->field.hte_next; \ + e->field.hte_next = new_table[b2]; \ + new_table[b2] = e; \ + } \ + } \ + } \ + head->hth_table = new_table; \ + } \ + head->hth_table_length = new_len; \ + head->hth_prime_idx = prime_idx; \ + head->hth_load_limit = new_load_limit; \ + return 0; \ + } \ + /* Free all storage held by 'head'. Does not free 'head' itself, or \ + * individual elements. */ \ + void \ + name##_HT_CLEAR(struct name *head) \ + { \ + if (head->hth_table) \ + freefn(head->hth_table); \ + head->hth_table_length = 0; \ + name##_HT_INIT(head); \ + } \ + /* Debugging helper: return false iff the representation of 'head' is \ + * internally consistent. */ \ + int \ + name##_HT_REP_IS_BAD_(const struct name *head) \ + { \ + unsigned n, i; \ + struct type *elm; \ + if (!head->hth_table_length) { \ + if (!head->hth_table && !head->hth_n_entries && \ + !head->hth_load_limit && head->hth_prime_idx == -1) \ + return 0; \ + else \ + return 1; \ + } \ + if (!head->hth_table || head->hth_prime_idx < 0 || \ + !head->hth_load_limit) \ + return 2; \ + if (head->hth_n_entries > head->hth_load_limit) \ + return 3; \ + if (head->hth_table_length != name##_PRIMES[head->hth_prime_idx]) \ + return 4; \ + if (head->hth_load_limit != (unsigned)(load*head->hth_table_length)) \ + return 5; \ + for (n = i = 0; i < head->hth_table_length; ++i) { \ + for (elm = head->hth_table[i]; elm; elm = elm->field.hte_next) { \ + if (HT_ELT_HASH_(elm, field, hashfn) != hashfn(elm)) \ + return 1000 + i; \ + if (HT_BUCKET_NUM_(head,field,elm,hashfn) != i) \ + return 10000 + i; \ + ++n; \ + } \ + } \ + if (n != head->hth_n_entries) \ + return 6; \ + return 0; \ + } + +#define HT_GENERATE(name, type, field, hashfn, eqfn, load, mallocfn, \ + reallocfn, freefn) \ + static void * \ + name##_reallocarray(void *arg, size_t a, size_t b) \ + { \ + if ((b) && (a) > SIZE_MAX / (b)) \ + return NULL; \ + if (arg) \ + return reallocfn((arg),(a)*(b)); \ + else \ + return mallocfn((a)*(b)); \ + } \ + HT_GENERATE2(name, type, field, hashfn, eqfn, load, \ + name##_reallocarray, freefn) + +/** Implements an over-optimized "find and insert if absent" block; + * not meant for direct usage by typical code, or usage outside the critical + * path.*/ +#define HT_FIND_OR_INSERT_(name, field, hashfn, head, eltype, elm, var, y, n) \ + { \ + struct name *var##_head_ = head; \ + struct eltype **var; \ + if (!var##_head_->hth_table || \ + var##_head_->hth_n_entries >= var##_head_->hth_load_limit) \ + name##_HT_GROW(var##_head_, var##_head_->hth_n_entries+1); \ + HT_SET_HASH_((elm), field, hashfn); \ + var = name##_HT_FIND_P_(var##_head_, (elm)); \ + HT_ASSERT_(var); /* Holds because we called HT_GROW */ \ + if (*var) { \ + y; \ + } else { \ + n; \ + } \ + } +#define HT_FOI_INSERT_(field, head, elm, newent, var) \ + { \ + HT_SET_HASHVAL_(newent, field, (elm)->field.hte_hash); \ + newent->field.hte_next = NULL; \ + *var = newent; \ + ++((head)->hth_n_entries); \ + } + +/* + * Copyright 2005, Nick Mathewson. Implementation logic is adapted from code + * by Christopher Clark, retrofit to allow drop-in memory management, and to + * use the same interface as Niels Provos's tree.h. This is probably still + * a derived work, so the original license below still applies. + * + * Copyright (c) 2002, Christopher Clark + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#endif + diff --git a/src/wraith/src/ext/include.am b/src/wraith/src/ext/include.am new file mode 100644 index 000000000..7ec2e4331 --- /dev/null +++ b/src/wraith/src/ext/include.am @@ -0,0 +1,176 @@ + +AM_CPPFLAGS += -I$(srcdir)/src/ext -Isrc/ext + +EXTRA_DIST += src/ext/README + +EXTHEADERS = \ + src/ext/ht.h \ + src/ext/byteorder.h \ + src/ext/tinytest.h \ + src/ext/tor_readpassphrase.h \ + src/ext/strlcat.c \ + src/ext/strlcpy.c \ + src/ext/tinytest_macros.h \ + src/ext/tor_queue.h \ + src/ext/siphash.h \ + src/ext/timeouts/timeout.h \ + src/ext/timeouts/timeout-debug.h \ + src/ext/timeouts/timeout-bitops.c \ + src/ext/timeouts/timeout.c + +noinst_HEADERS+= $(EXTHEADERS) + +src_ext_ed25519_ref10_libed25519_ref10_a_CFLAGS=\ + @CFLAGS_CONSTTIME@ + +src_ext_ed25519_ref10_libed25519_ref10_a_SOURCES= \ + src/ext/ed25519/ref10/fe_0.c \ + src/ext/ed25519/ref10/fe_1.c \ + src/ext/ed25519/ref10/fe_add.c \ + src/ext/ed25519/ref10/fe_cmov.c \ + src/ext/ed25519/ref10/fe_copy.c \ + src/ext/ed25519/ref10/fe_frombytes.c \ + src/ext/ed25519/ref10/fe_invert.c \ + src/ext/ed25519/ref10/fe_isnegative.c \ + src/ext/ed25519/ref10/fe_isnonzero.c \ + src/ext/ed25519/ref10/fe_mul.c \ + src/ext/ed25519/ref10/fe_neg.c \ + src/ext/ed25519/ref10/fe_pow22523.c \ + src/ext/ed25519/ref10/fe_sq.c \ + src/ext/ed25519/ref10/fe_sq2.c \ + src/ext/ed25519/ref10/fe_sub.c \ + src/ext/ed25519/ref10/fe_tobytes.c \ + src/ext/ed25519/ref10/ge_add.c \ + src/ext/ed25519/ref10/ge_double_scalarmult.c \ + src/ext/ed25519/ref10/ge_frombytes.c \ + src/ext/ed25519/ref10/ge_madd.c \ + src/ext/ed25519/ref10/ge_msub.c \ + src/ext/ed25519/ref10/ge_p1p1_to_p2.c \ + src/ext/ed25519/ref10/ge_p1p1_to_p3.c \ + src/ext/ed25519/ref10/ge_p2_0.c \ + src/ext/ed25519/ref10/ge_p2_dbl.c \ + src/ext/ed25519/ref10/ge_p3_0.c \ + src/ext/ed25519/ref10/ge_p3_dbl.c \ + src/ext/ed25519/ref10/ge_p3_to_cached.c \ + src/ext/ed25519/ref10/ge_p3_to_p2.c \ + src/ext/ed25519/ref10/ge_p3_tobytes.c \ + src/ext/ed25519/ref10/ge_precomp_0.c \ + src/ext/ed25519/ref10/ge_scalarmult_base.c \ + src/ext/ed25519/ref10/ge_sub.c \ + src/ext/ed25519/ref10/ge_tobytes.c \ + src/ext/ed25519/ref10/keypair.c \ + src/ext/ed25519/ref10/open.c \ + src/ext/ed25519/ref10/sc_muladd.c \ + src/ext/ed25519/ref10/sc_reduce.c \ + src/ext/ed25519/ref10/sign.c \ + src/ext/ed25519/ref10/keyconv.c \ + src/ext/ed25519/ref10/blinding.c + +ED25519_REF10_HDRS = \ + src/ext/ed25519/ref10/api.h \ + src/ext/ed25519/ref10/base.h \ + src/ext/ed25519/ref10/base2.h \ + src/ext/ed25519/ref10/crypto_hash_sha512.h \ + src/ext/ed25519/ref10/crypto_int32.h \ + src/ext/ed25519/ref10/crypto_int64.h \ + src/ext/ed25519/ref10/crypto_sign.h \ + src/ext/ed25519/ref10/crypto_uint32.h \ + src/ext/ed25519/ref10/crypto_uint64.h \ + src/ext/ed25519/ref10/crypto_verify_32.h \ + src/ext/ed25519/ref10/d.h \ + src/ext/ed25519/ref10/d2.h \ + src/ext/ed25519/ref10/ed25519_ref10.h \ + src/ext/ed25519/ref10/fe.h \ + src/ext/ed25519/ref10/ge.h \ + src/ext/ed25519/ref10/ge_add.h \ + src/ext/ed25519/ref10/ge_madd.h \ + src/ext/ed25519/ref10/ge_msub.h \ + src/ext/ed25519/ref10/ge_p2_dbl.h \ + src/ext/ed25519/ref10/ge_sub.h \ + src/ext/ed25519/ref10/pow22523.h \ + src/ext/ed25519/ref10/pow225521.h \ + src/ext/ed25519/ref10/randombytes.h \ + src/ext/ed25519/ref10/sc.h \ + src/ext/ed25519/ref10/sqrtm1.h + +noinst_HEADERS += $(ED25519_REF10_HDRS) + +LIBED25519_REF10=src/ext/ed25519/ref10/libed25519_ref10.a +noinst_LIBRARIES += $(LIBED25519_REF10) + +src_ext_ed25519_donna_libed25519_donna_a_CFLAGS=\ + @CFLAGS_CONSTTIME@ \ + -DED25519_CUSTOMRANDOM \ + -DED25519_CUSTOMHASH \ + -DED25519_SUFFIX=_donna + +src_ext_ed25519_donna_libed25519_donna_a_SOURCES= \ + src/ext/ed25519/donna/ed25519_tor.c + +ED25519_DONNA_HDRS = \ + src/ext/ed25519/donna/curve25519-donna-32bit.h \ + src/ext/ed25519/donna/curve25519-donna-64bit.h \ + src/ext/ed25519/donna/curve25519-donna-helpers.h \ + src/ext/ed25519/donna/curve25519-donna-sse2.h \ + src/ext/ed25519/donna/ed25519-donna-32bit-sse2.h \ + src/ext/ed25519/donna/ed25519-donna-32bit-tables.h \ + src/ext/ed25519/donna/ed25519-donna-64bit-sse2.h \ + src/ext/ed25519/donna/ed25519-donna-64bit-tables.h \ + src/ext/ed25519/donna/ed25519-donna-64bit-x86-32bit.h \ + src/ext/ed25519/donna/ed25519-donna-64bit-x86.h \ + src/ext/ed25519/donna/ed25519-donna-basepoint-table.h \ + src/ext/ed25519/donna/ed25519-donna-batchverify.h \ + src/ext/ed25519/donna/ed25519-donna.h \ + src/ext/ed25519/donna/ed25519-donna-impl-base.h \ + src/ext/ed25519/donna/ed25519-donna-impl-sse2.h \ + src/ext/ed25519/donna/ed25519-donna-portable.h \ + src/ext/ed25519/donna/ed25519-donna-portable-identify.h \ + src/ext/ed25519/donna/ed25519_donna_tor.h \ + src/ext/ed25519/donna/ed25519.h \ + src/ext/ed25519/donna/ed25519-hash-custom.h \ + src/ext/ed25519/donna/ed25519-hash.h \ + src/ext/ed25519/donna/ed25519-randombytes-custom.h \ + src/ext/ed25519/donna/ed25519-randombytes.h \ + src/ext/ed25519/donna/modm-donna-32bit.h \ + src/ext/ed25519/donna/modm-donna-64bit.h \ + src/ext/ed25519/donna/regression.h \ + src/ext/ed25519/donna/test-ticks.h \ + src/ext/ed25519/donna/test-internals.c + +noinst_HEADERS += $(ED25519_DONNA_HDRS) + +LIBED25519_DONNA=src/ext/ed25519/donna/libed25519_donna.a +noinst_LIBRARIES += $(LIBED25519_DONNA) + +src_ext_keccak_tiny_libkeccak_tiny_a_CFLAGS=\ + @CFLAGS_CONSTTIME@ + +src_ext_keccak_tiny_libkeccak_tiny_a_SOURCES= \ + src/ext/keccak-tiny/keccak-tiny-unrolled.c + +LIBKECCAK_TINY_HDRS = \ + src/ext/keccak-tiny/keccak-tiny.h + +noinst_HEADERS += $(LIBKECCAK_TINY_HDRS) + +LIBKECCAK_TINY=src/ext/keccak-tiny/libkeccak-tiny.a +noinst_LIBRARIES += $(LIBKECCAK_TINY) + +EXTRA_DIST += \ + src/ext/timeouts/bench/bench-add.lua \ + src/ext/timeouts/bench/bench-aux.lua \ + src/ext/timeouts/bench/bench.c \ + src/ext/timeouts/bench/bench-del.lua \ + src/ext/timeouts/bench/bench-expire.lua \ + src/ext/timeouts/bench/bench.h \ + src/ext/timeouts/bench/bench-heap.c \ + src/ext/timeouts/bench/bench-llrb.c \ + src/ext/timeouts/bench/bench.plt \ + src/ext/timeouts/bench/bench-wheel.c \ + src/ext/timeouts/bench/Rules.mk \ + src/ext/timeouts/lua/Rules.mk \ + src/ext/timeouts/lua/timeout-lua.c \ + src/ext/timeouts/Makefile \ + src/ext/timeouts/Rules.shrc \ + src/ext/timeouts/test-timeout.c + diff --git a/src/wraith/src/ext/keccak-tiny/README.markdown b/src/wraith/src/ext/keccak-tiny/README.markdown new file mode 100644 index 000000000..784d6f6bd --- /dev/null +++ b/src/wraith/src/ext/keccak-tiny/README.markdown @@ -0,0 +1,82 @@ +# libkeccak-tiny + +An implementation of the FIPS-202-defined SHA-3 and SHAKE functions +in 120 cloc (156 lines). One C file, one header. + +The `Keccak-f[1600]` permutation is fully unrolled; it's nearly as fast +as the Keccak team's optimized permutation. + +## Building + + > clang -O3 -march=native -std=c11 -Wextra -dynamic -shared keccak-tiny.c -o libkeccak-tiny.dylib + +If you don't have a modern libc that includes the `memset_s` function, +you can just add `-D"memset_s(W,WL,V,OL)=memset(W,V,OL)` to the command +line. + +## Using + +Build the library, include the header, and do, e.g., + + shake256(out, 256, in, inlen); + +That's it. + +(Note: You can request less output from the fixed-output-length +functions, but not more.) + +## TweetShake + +The relevant tweets: + +```C +// @hashbreaker Inspired by TweetNaCl! +// Keccak and SHA-3 are supposedly hard to implement. So, how many tweets does it take to get to the center of a sponge...? +#define decshake(bits) int shake##bits(unsigned char* o, unsigned long, unsigned char*, unsigned long); /*begin keccak.h*/ +#define decsha3(bits) int sha3_##bits(unsigned char*,unsigned long,unsigned char*,unsigned long); +decshake(128) decshake(256) decsha3(224) decsha3(256) decsha3(384) decsha3(512) /*end keccak.h*/ +#define K static const /* Keccak constants: rho rotations, pi lanes, and iota RCs */ /*begin keccak.c*/ +typedef unsigned char byte;typedef byte*bytes;typedef unsigned long z;typedef unsigned long long u8;K u8 V=1ULL<<63;K u8 W=1ULL<<31;/*!gcc*/ +#define V (1ULL<<63) +#define W (1ULL<31) +K byte rho[24]={1,3,6,10,15,21,28,36,45,55,2,14,27,41,56,8,25,43,62,18,39,61,20,44};K u8 RC[24]={1,0x8082,V|0x808a,V|W|0x8000,0x808b,W|1,V|W +|0x8081,V|0x8009,138,136,W|0x8009,W|10,W|0x808b,V|0x8b,V|0x8089,V|0x8003,V|0x8002,V|0x80,0x800a,V|W|0xa,V|W|0x8081,V|0x8080,W|1,V|W|0x8008}; +K byte pi[25]={10,7,11,17,18,3,5,16,8,21,24,4,15,23,19,13,12,2,20,14,22,9,6,1}; /**helpers:*/static inline z min(z a,z b){return (a> (64-s))) /**macros to fully unroll the Keccak-f[1600] permutation:*/ +#define R24(e) /* repeat 24 times */ e e e e e e e e e e e e e e e e e e e e e e e e +#define L5(v,s,e) /* 5-unroll a loop */ v=0; e; v+=s; e; v+=s; e; v+=s; e; v+=s; e; v+=s; /**the permutation:*/ +static inline void keccakf(u8* a){u8 b[5]={0};u8 t=0;byte x,y,i=0; /*24 rounds:*/R24( L5(x,1,b[x]=0;L5(y,5, /*parity*/ b[x] ^= a[x+y])) +L5(x,1,L5(y,5,/*theta*/a[y+x] ^= b[(x+4)%5] ^ ROL(b[(x+1)%5],1))) t=a[1];x=0;R24(b[0]=a[pi[x]];/*rho*/a[pi[x]]=ROL(t, rho[x]);t=b[0];x++;) +L5(y,5,L5(x,1, /*chi*/ b[x] = a[y+x]) L5(x,1, a[y+x] = b[x] ^ ~b[(x+1)%5] & b[(x+2)%5])) /*iota*/ a[0] ^= RC[i]; i++; )} /**keccak-f!**/ +#define FOR(i, ST, L, S) /*obvious*/ do { for (z i = 0; i < L; i += ST) { S; } } while (0) /**now, the sponge construction in hash mode**/ +#define appl(NAME, S) /*macro to define array comprehensions*/ static inline void NAME(bytes dst, bytes src, z len) { FOR(i, 1, len, S); } +/*helpers:*/ static inline void clear(bytes a) { FOR(i,1,200,a[i]=0); } appl(xorin, dst[i] ^= src[i]) appl(set, src[i] = dst[i]) +#define foldP(I, L, F) /* macro to fold app P F */ while (L >= r) { /*apply F*/ F(a, I, r); /*permute*/ keccakf(A); I += r; L -= r; } +static inline int hash(bytes o,z olen,bytes in,z ilen,z r,byte D){ if((o == (void*)0)||((in == (void*)0)&&ilen != 0)||(r >= 200))return -1; +/*absorb*/u8 A[25]={0};bytes a=(bytes)A;/*full blocks*/foldP(in,ilen,xorin);/*last block*/xorin(a,in,ilen);/**ds+padstart*/a[ilen]^=D; +/*padend:*/a[r-1]^=0x80; /**permute**/keccakf(A); /**squeeze:**/foldP(o,olen,set);/*last bytes*/set(a,o,olen);/*done!*/clear(a);return 0;} +#define defshake(bits) int shake##bits(bytes o, z olen, bytes in, z ilen) {return hash(o,olen,in,ilen,200-(bits/4),0x1f);} +#define defsha3(bits) int sha3_##bits(bytes o,z olen,bytes in,z ilen) {return hash(o,min(olen,200-(bits/4)),in,ilen,200-(bits/4),0x06);} +/*define the SHA3 and SHAKE instances:*/defshake(128) defshake(256) defsha3(224) defsha3(256) defsha3(384) defsha3(512)/*end keccak.c*/ +// ...chomp. 24 kinda legible tweets (3232 bytes). And a simple interface: shake256(digest, digestlen, in, inlen) +// Clang recommended. GCC users will need to insert "#define V (1ULL<<63)" and "#define W (1ULL<31)" at the point marked "/*!gcc*/" +// If you're using as a prefix MAC, you MUST replace the body of "clear" with "memset_s(a, 200, 0, 200)" to avoid misoptimization. +// @everyone_who_is_still_using_sha1 Please stop using SHA-1. +// Oh, one more thing: a C11-threaded, memmapped shake256sum in 10 tweets. (Your libc may need a shim for C11 thread support.) +// echo -n string stdio stdint fcntl sys/mman sys/stat sys/types unistd threads|tr ' ' \\n|xargs -n1 -I_ echo '#include <_.h>' +#include "kcksum_tweet.h" +#define E(LABEL, MSG) if (err != 0) { strerror_r(err, serr, 1024); fprintf(stderr, "%s: '%s' %s\n", serr, fn, MSG); goto LABEL;} +static mtx_t iomtx;void h(void* v);void h(void* v){char* fn=(char*)v;int err=0;char serr[1024]={0};/*open file*/int fd=open(fn, O_RDONLY); +err=!fd;E(ret,"couldn't be opened.");/*stat it*/struct stat stat;err=fstat(fd,&stat);E(close,"doesn't exist.");err=!!(stat.st_mode&S_IFDIR); +E(close,"not a regular file.");z length=(size_t)stat.st_size;/*mmap the file*/bytes in=length?mmap(0,length,PROT_READ,MAP_SHARED,fd,0):NULL; +if(length&&(in==MAP_FAILED)){E(close,"mmap-ing failed.");}byte out[64]={0};/*hash it*/shake256(out,64,in,length);length&&munmap(in,length); +/*lock io*/mtx_lock(&iomtx);printf("SHAKE256('%s') = ", fn);FOR(i,1,64,printf("%02x",out[i]));printf("\n");mtx_unlock(&iomtx);/*unlock io*/ +close:close(fd);ret:thrd_exit(err);}int main(int argc,char** argv){int err=0; mtx_init(&iomtx, mtx_plain); thrd_t t[4]; int res[4],i,j,k; +for(i=1;i +#include "crypto.h" +#include "byteorder.h" + +/******** Endianness conversion helpers ********/ + +static inline uint64_t +loadu64le(const unsigned char *x) { + uint64_t r; + memcpy(&r, x, sizeof(r)); + return _le64toh(r); +} + +static inline void +storeu64le(uint8_t *x, uint64_t u) { + uint64_t val = _le64toh(u); + memcpy(x, &val, sizeof(u)); +} + +/******** The Keccak-f[1600] permutation ********/ + +/*** Constants. ***/ +static const uint8_t rho[24] = \ + { 1, 3, 6, 10, 15, 21, + 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, + 62, 18, 39, 61, 20, 44}; +static const uint8_t pi[24] = \ + {10, 7, 11, 17, 18, 3, + 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, + 20, 14, 22, 9, 6, 1}; +static const uint64_t RC[24] = \ + {1ULL, 0x8082ULL, 0x800000000000808aULL, 0x8000000080008000ULL, + 0x808bULL, 0x80000001ULL, 0x8000000080008081ULL, 0x8000000000008009ULL, + 0x8aULL, 0x88ULL, 0x80008009ULL, 0x8000000aULL, + 0x8000808bULL, 0x800000000000008bULL, 0x8000000000008089ULL, 0x8000000000008003ULL, + 0x8000000000008002ULL, 0x8000000000000080ULL, 0x800aULL, 0x800000008000000aULL, + 0x8000000080008081ULL, 0x8000000000008080ULL, 0x80000001ULL, 0x8000000080008008ULL}; + +/*** Helper macros to unroll the permutation. ***/ +#define rol(x, s) (((x) << s) | ((x) >> (64 - s))) +#define REPEAT6(e) e e e e e e +#define REPEAT24(e) REPEAT6(e e e e) +#define REPEAT5(e) e e e e e +#define FOR5(v, s, e) \ + v = 0; \ + REPEAT5(e; v += s;) + +/*** Keccak-f[1600] ***/ +static inline void keccakf(void* state) { + uint64_t* a = (uint64_t*)state; + uint64_t b[5] = {0}; + uint64_t t = 0; + uint8_t x, y, i = 0; + + REPEAT24( + // Theta + FOR5(x, 1, + b[x] = 0; + FOR5(y, 5, + b[x] ^= a[x + y]; )) + FOR5(x, 1, + FOR5(y, 5, + a[y + x] ^= b[(x + 4) % 5] ^ rol(b[(x + 1) % 5], 1); )) + // Rho and pi + t = a[1]; + x = 0; + REPEAT24(b[0] = a[pi[x]]; + a[pi[x]] = rol(t, rho[x]); + t = b[0]; + x++; ) + // Chi + FOR5(y, + 5, + FOR5(x, 1, + b[x] = a[y + x];) + FOR5(x, 1, + a[y + x] = b[x] ^ ((~b[(x + 1) % 5]) & b[(x + 2) % 5]); )) + // Iota + a[0] ^= RC[i]; + i++; ) +} + +/******** The FIPS202-defined functions. ********/ + +/*** Some helper macros. ***/ + +// `xorin` modified to handle Big Endian systems, `buf` being unaligned on +// systems that care about such things. Assumes that len is a multiple of 8, +// which is always true for the rates we use, and the modified finalize. +static inline void +xorin8(uint8_t *dst, const uint8_t *src, size_t len) { + uint64_t* a = (uint64_t*)dst; // Always aligned. + for (size_t i = 0; i < len; i += 8) { + a[i/8] ^= loadu64le(src + i); + } +} + +// `setout` likewise modified to handle Big Endian systems. Assumes that len +// is a multiple of 8, which is true for every rate we use. +static inline void +setout8(const uint8_t *src, uint8_t *dst, size_t len) { + const uint64_t *si = (const uint64_t*)src; // Always aligned. + for (size_t i = 0; i < len; i+= 8) { + storeu64le(dst+i, si[i/8]); + } +} + +#define P keccakf +#define Plen KECCAK_MAX_RATE + +#define KECCAK_DELIM_DIGEST 0x06 +#define KECCAK_DELIM_XOF 0x1f + +// Fold P*F over the full blocks of an input. +#define foldP(I, L, F) \ + while (L >= s->rate) { \ + F(s->a, I, s->rate); \ + P(s->a); \ + I += s->rate; \ + L -= s->rate; \ + } + +static inline void +keccak_absorb_blocks(keccak_state *s, const uint8_t *buf, size_t nr_blocks) +{ + size_t blen = nr_blocks * s->rate; + foldP(buf, blen, xorin8); +} + +static int +keccak_update(keccak_state *s, const uint8_t *buf, size_t len) +{ + if (s->finalized) + return -1; + if ((buf == NULL) && len != 0) + return -1; + + size_t remaining = len; + while (remaining > 0) { + if (s->offset == 0) { + const size_t blocks = remaining / s->rate; + size_t direct_bytes = blocks * s->rate; + if (direct_bytes > 0) { + keccak_absorb_blocks(s, buf, blocks); + remaining -= direct_bytes; + buf += direct_bytes; + } + } + + const size_t buf_avail = s->rate - s->offset; + const size_t buf_bytes = (buf_avail > remaining) ? remaining : buf_avail; + if (buf_bytes > 0) { + memcpy(&s->block[s->offset], buf, buf_bytes); + s->offset += buf_bytes; + remaining -= buf_bytes; + buf += buf_bytes; + } + if (s->offset == s->rate) { + keccak_absorb_blocks(s, s->block, 1); + s->offset = 0; + } + } + return 0; +} + +static void +keccak_finalize(keccak_state *s) +{ + // Xor in the DS and pad frame. + s->block[s->offset++] = s->delim; // DS. + for (size_t i = s->offset; i < s->rate; i++) { + s->block[i] = 0; + } + s->block[s->rate - 1] |= 0x80; // Pad frame. + + // Xor in the last block. + xorin8(s->a, s->block, s->rate); + + memwipe(s->block, 0, sizeof(s->block)); + s->finalized = 1; + s->offset = s->rate; +} + +static inline void +keccak_squeeze_blocks(keccak_state *s, uint8_t *out, size_t nr_blocks) +{ + for (size_t n = 0; n < nr_blocks; n++) { + keccakf(s->a); + setout8(s->a, out, s->rate); + out += s->rate; + } +} + +static int +keccak_squeeze(keccak_state *s, uint8_t *out, size_t outlen) +{ + if (!s->finalized) + return -1; + + size_t remaining = outlen; + while (remaining > 0) { + if (s->offset == s->rate) { + const size_t blocks = remaining / s->rate; + const size_t direct_bytes = blocks * s->rate; + if (blocks > 0) { + keccak_squeeze_blocks(s, out, blocks); + out += direct_bytes; + remaining -= direct_bytes; + } + + if (remaining > 0) { + keccak_squeeze_blocks(s, s->block, 1); + s->offset = 0; + } + } + + const size_t buf_bytes = s->rate - s->offset; + const size_t indirect_bytes = (buf_bytes > remaining) ? remaining : buf_bytes; + if (indirect_bytes > 0) { + memcpy(out, &s->block[s->offset], indirect_bytes); + out += indirect_bytes; + s->offset += indirect_bytes; + remaining -= indirect_bytes; + } + } + return 0; +} + +int +keccak_digest_init(keccak_state *s, size_t bits) +{ + if (s == NULL) + return -1; + if (bits != 224 && bits != 256 && bits != 384 && bits != 512) + return -1; + + keccak_cleanse(s); + s->rate = KECCAK_RATE(bits); + s->delim = KECCAK_DELIM_DIGEST; + return 0; +} + +int +keccak_digest_update(keccak_state *s, const uint8_t *buf, size_t len) +{ + if (s == NULL) + return -1; + if (s->delim != KECCAK_DELIM_DIGEST) + return -1; + + return keccak_update(s, buf, len); +} + +int +keccak_digest_sum(const keccak_state *s, uint8_t *out, size_t outlen) +{ + if (s == NULL) + return -1; + if (s->delim != KECCAK_DELIM_DIGEST) + return -1; + if (out == NULL || outlen > 4 * (KECCAK_MAX_RATE - s->rate) / 8) + return -1; + + // Work in a copy so that incremental/rolling hashes are easy. + keccak_state s_tmp; + keccak_clone(&s_tmp, s); + keccak_finalize(&s_tmp); + int ret = keccak_squeeze(&s_tmp, out, outlen); + keccak_cleanse(&s_tmp); + return ret; +} + +int +keccak_xof_init(keccak_state *s, size_t bits) +{ + if (s == NULL) + return -1; + if (bits != 128 && bits != 256) + return -1; + + keccak_cleanse(s); + s->rate = KECCAK_RATE(bits); + s->delim = KECCAK_DELIM_XOF; + return 0; +} + +int +keccak_xof_absorb(keccak_state *s, const uint8_t *buf, size_t len) +{ + if (s == NULL) + return -1; + if (s->delim != KECCAK_DELIM_XOF) + return -1; + + return keccak_update(s, buf, len); +} + +int +keccak_xof_squeeze(keccak_state *s, uint8_t *out, size_t outlen) +{ + if (s == NULL) + return -1; + if (s->delim != KECCAK_DELIM_XOF) + return -1; + + if (!s->finalized) + keccak_finalize(s); + + return keccak_squeeze(s, out, outlen); +} + +void +keccak_clone(keccak_state *out, const keccak_state *in) +{ + memcpy(out, in, sizeof(keccak_state)); +} + +void +keccak_cleanse(keccak_state *s) +{ + memwipe(s, 0, sizeof(keccak_state)); +} + +/** The sponge-based hash construction. **/ +static inline int hash(uint8_t* out, size_t outlen, + const uint8_t* in, size_t inlen, + size_t bits, uint8_t delim) { + if ((out == NULL) || ((in == NULL) && inlen != 0)) { + return -1; + } + + int ret = 0; + keccak_state s; + keccak_cleanse(&s); + + switch (delim) { + case KECCAK_DELIM_DIGEST: + ret |= keccak_digest_init(&s, bits); + ret |= keccak_digest_update(&s, in, inlen); + // Use the internal API instead of sum to avoid the memcpy. + keccak_finalize(&s); + ret |= keccak_squeeze(&s, out, outlen); + break; + case KECCAK_DELIM_XOF: + ret |= keccak_xof_init(&s, bits); + ret |= keccak_xof_absorb(&s, in, inlen); + ret |= keccak_xof_squeeze(&s, out, outlen); + break; + default: + return -1; + } + keccak_cleanse(&s); + return ret; +} + +/*** Helper macros to define SHA3 and SHAKE instances. ***/ +#define defshake(bits) \ + int shake##bits(uint8_t* out, size_t outlen, \ + const uint8_t* in, size_t inlen) { \ + return hash(out, outlen, in, inlen, bits, KECCAK_DELIM_XOF); \ + } +#define defsha3(bits) \ + int sha3_##bits(uint8_t* out, size_t outlen, \ + const uint8_t* in, size_t inlen) { \ + if (outlen > (bits/8)) { \ + return -1; \ + } \ + return hash(out, outlen, in, inlen, bits, KECCAK_DELIM_DIGEST); \ + } + +/*** FIPS202 SHAKE VOFs ***/ +defshake(128) +defshake(256) + +/*** FIPS202 SHA3 FOFs ***/ +defsha3(224) +defsha3(256) +defsha3(384) +defsha3(512) diff --git a/src/wraith/src/ext/keccak-tiny/keccak-tiny.c b/src/wraith/src/ext/keccak-tiny/keccak-tiny.c new file mode 100644 index 000000000..76d89fa78 --- /dev/null +++ b/src/wraith/src/ext/keccak-tiny/keccak-tiny.c @@ -0,0 +1,163 @@ +/** libkeccak-tiny + * + * A single-file implementation of SHA-3 and SHAKE. + * + * Implementor: David Leon Gil + * License: CC0, attribution kindly requested. Blame taken too, + * but not liability. + */ +#include "keccak-tiny.h" + +#include +#include +#include +#include + +/******** The Keccak-f[1600] permutation ********/ + +/*** Constants. ***/ +static const uint8_t rho[24] = \ + { 1, 3, 6, 10, 15, 21, + 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, + 62, 18, 39, 61, 20, 44}; +static const uint8_t pi[24] = \ + {10, 7, 11, 17, 18, 3, + 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, + 20, 14, 22, 9, 6, 1}; +static const uint64_t RC[24] = \ + {1ULL, 0x8082ULL, 0x800000000000808aULL, 0x8000000080008000ULL, + 0x808bULL, 0x80000001ULL, 0x8000000080008081ULL, 0x8000000000008009ULL, + 0x8aULL, 0x88ULL, 0x80008009ULL, 0x8000000aULL, + 0x8000808bULL, 0x800000000000008bULL, 0x8000000000008089ULL, 0x8000000000008003ULL, + 0x8000000000008002ULL, 0x8000000000000080ULL, 0x800aULL, 0x800000008000000aULL, + 0x8000000080008081ULL, 0x8000000000008080ULL, 0x80000001ULL, 0x8000000080008008ULL}; + +/*** Helper macros to unroll the permutation. ***/ +#define rol(x, s) (((x) << s) | ((x) >> (64 - s))) +#define REPEAT6(e) e e e e e e +#define REPEAT24(e) REPEAT6(e e e e) +#define REPEAT5(e) e e e e e +#define FOR5(v, s, e) \ + v = 0; \ + REPEAT5(e; v += s;) + +/*** Keccak-f[1600] ***/ +static inline void keccakf(void* state) { + uint64_t* a = (uint64_t*)state; + uint64_t b[5] = {0}; + uint64_t t = 0; + uint8_t x, y; + + for (int i = 0; i < 24; i++) { + // Theta + FOR5(x, 1, + b[x] = 0; + FOR5(y, 5, + b[x] ^= a[x + y]; )) + FOR5(x, 1, + FOR5(y, 5, + a[y + x] ^= b[(x + 4) % 5] ^ rol(b[(x + 1) % 5], 1); )) + // Rho and pi + t = a[1]; + x = 0; + REPEAT24(b[0] = a[pi[x]]; + a[pi[x]] = rol(t, rho[x]); + t = b[0]; + x++; ) + // Chi + FOR5(y, + 5, + FOR5(x, 1, + b[x] = a[y + x];) + FOR5(x, 1, + a[y + x] = b[x] ^ ((~b[(x + 1) % 5]) & b[(x + 2) % 5]); )) + // Iota + a[0] ^= RC[i]; + } +} + +/******** The FIPS202-defined functions. ********/ + +/*** Some helper macros. ***/ + +#define _(S) do { S } while (0) +#define FOR(i, ST, L, S) \ + _(for (size_t i = 0; i < L; i += ST) { S; }) +#define mkapply_ds(NAME, S) \ + static inline void NAME(uint8_t* dst, \ + const uint8_t* src, \ + size_t len) { \ + FOR(i, 1, len, S); \ + } +#define mkapply_sd(NAME, S) \ + static inline void NAME(const uint8_t* src, \ + uint8_t* dst, \ + size_t len) { \ + FOR(i, 1, len, S); \ + } + +mkapply_ds(xorin, dst[i] ^= src[i]) // xorin +mkapply_sd(setout, dst[i] = src[i]) // setout + +#define P keccakf +#define Plen 200 + +// Fold P*F over the full blocks of an input. +#define foldP(I, L, F) \ + while (L >= rate) { \ + F(a, I, rate); \ + P(a); \ + I += rate; \ + L -= rate; \ + } + +/** The sponge-based hash construction. **/ +static inline int hash(uint8_t* out, size_t outlen, + const uint8_t* in, size_t inlen, + size_t rate, uint8_t delim) { + if ((out == NULL) || ((in == NULL) && inlen != 0) || (rate >= Plen)) { + return -1; + } + uint8_t a[Plen] = {0}; + // Absorb input. + foldP(in, inlen, xorin); + // Xor in the DS and pad frame. + a[inlen] ^= delim; + a[rate - 1] ^= 0x80; + // Xor in the last block. + xorin(a, in, inlen); + // Apply P + P(a); + // Squeeze output. + foldP(out, outlen, setout); + setout(a, out, outlen); + memset_s(a, 200, 0, 200); + return 0; +} + +/*** Helper macros to define SHA3 and SHAKE instances. ***/ +#define defshake(bits) \ + int shake##bits(uint8_t* out, size_t outlen, \ + const uint8_t* in, size_t inlen) { \ + return hash(out, outlen, in, inlen, 200 - (bits / 4), 0x1f); \ + } +#define defsha3(bits) \ + int sha3_##bits(uint8_t* out, size_t outlen, \ + const uint8_t* in, size_t inlen) { \ + if (outlen > (bits/8)) { \ + return -1; \ + } \ + return hash(out, outlen, in, inlen, 200 - (bits / 4), 0x06); \ + } + +/*** FIPS202 SHAKE VOFs ***/ +defshake(128) +defshake(256) + +/*** FIPS202 SHA3 FOFs ***/ +defsha3(224) +defsha3(256) +defsha3(384) +defsha3(512) diff --git a/src/wraith/src/ext/keccak-tiny/keccak-tiny.h b/src/wraith/src/ext/keccak-tiny/keccak-tiny.h new file mode 100644 index 000000000..7efea2319 --- /dev/null +++ b/src/wraith/src/ext/keccak-tiny/keccak-tiny.h @@ -0,0 +1,66 @@ +#ifndef KECCAK_FIPS202_H +#define KECCAK_FIPS202_H + +#include +#include "torint.h" + +#define KECCAK_MAX_RATE 200 + +/* Calculate the rate (block size) from the security target. */ +#define KECCAK_RATE(bits) (KECCAK_MAX_RATE - (bits / 4)) + +/* The internal structure of a FIPS202 hash/xof instance. Most callers + * should treat this as an opaque structure. + */ +typedef struct keccak_state { + uint8_t a[KECCAK_MAX_RATE]; + size_t rate; + uint8_t delim; + + uint8_t block[KECCAK_MAX_RATE]; + size_t offset; + + uint8_t finalized : 1; +} keccak_state; + +/* Initialize a Keccak instance suitable for SHA-3 hash functions. */ +int keccak_digest_init(keccak_state *s, size_t bits); + +/* Feed more data into the SHA-3 hash instance. */ +int keccak_digest_update(keccak_state *s, const uint8_t *buf, size_t len); + +/* Calculate the SHA-3 hash digest. The state is unmodified to support + * calculating multiple/rolling digests. + */ +int keccak_digest_sum(const keccak_state *s, uint8_t *out, size_t outlen); + +/* Initialize a Keccak instance suitable for XOFs (SHAKE-128/256). */ +int keccak_xof_init(keccak_state *s, size_t bits); + +/* Absorb more data into the XOF. Must not be called after a squeeze call. */ +int keccak_xof_absorb(keccak_state *s, const uint8_t *buf, size_t len); + +/* Squeeze data out of the XOF. Must not attempt to absorb additional data, + * after a squeeze has been called. + */ +int keccak_xof_squeeze(keccak_state *s, uint8_t *out, size_t outlen); + +/* Clone an existing hash/XOF instance. */ +void keccak_clone(keccak_state *out, const keccak_state *in); + +/* Cleanse sensitive data from a given hash instance. */ +void keccak_cleanse(keccak_state *s); + +#define decshake(bits) \ + int shake##bits(uint8_t*, size_t, const uint8_t*, size_t); + +#define decsha3(bits) \ + int sha3_##bits(uint8_t*, size_t, const uint8_t*, size_t); + +decshake(128) +decshake(256) +decsha3(224) +decsha3(256) +decsha3(384) +decsha3(512) +#endif diff --git a/src/wraith/src/ext/mulodi/LICENSE.TXT b/src/wraith/src/ext/mulodi/LICENSE.TXT new file mode 100644 index 000000000..a17dc12b2 --- /dev/null +++ b/src/wraith/src/ext/mulodi/LICENSE.TXT @@ -0,0 +1,91 @@ +============================================================================== +compiler_rt License +============================================================================== + +The compiler_rt library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2016 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== +Copyrights and Licenses for Third Party Software Distributed with LLVM: +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + diff --git a/src/wraith/src/ext/mulodi/mulodi4.c b/src/wraith/src/ext/mulodi/mulodi4.c new file mode 100644 index 000000000..9891bbf1a --- /dev/null +++ b/src/wraith/src/ext/mulodi/mulodi4.c @@ -0,0 +1,67 @@ +/*===-- mulodi4.c - Implement __mulodi4 -----------------------------------=== + * + * The LLVM Compiler Infrastructure + * + * This file is dual licensed under the MIT and the University of Illinois Open + * Source Licenses. See LICENSE.TXT for details. + * + * ===----------------------------------------------------------------------=== + * + * This file implements __mulodi4 for the compiler_rt library. + * + * ===----------------------------------------------------------------------=== + */ + +#if 0 +#include "int_lib.h" +#else +#define COMPILER_RT_ABI +#define di_int int64_t +#define di_uint uint64_t +#include "torint.h" + +di_int __mulodi4(di_int a, di_int b, int* overflow); +#endif + +/* Returns: a * b */ + +/* Effects: sets *overflow to 1 if a * b overflows */ + +COMPILER_RT_ABI di_int +__mulodi4(di_int a, di_int b, int* overflow) +{ + const int N = (int)(sizeof(di_int) * CHAR_BIT); + const di_int MIN = (di_int) ((di_uint)1 << (N-1)); + const di_int MAX = ~MIN; + *overflow = 0; + di_int result = a * b; + if (a == MIN) + { + if (b != 0 && b != 1) + *overflow = 1; + return result; + } + if (b == MIN) + { + if (a != 0 && a != 1) + *overflow = 1; + return result; + } + di_int sa = a >> (N - 1); + di_int abs_a = (a ^ sa) - sa; + di_int sb = b >> (N - 1); + di_int abs_b = (b ^ sb) - sb; + if (abs_a < 2 || abs_b < 2) + return result; + if (sa == sb) + { + if (abs_a > MAX / abs_b) + *overflow = 1; + } + else + { + if (abs_a > MIN / -abs_b) + *overflow = 1; + } + return result; +} diff --git a/src/wraith/src/ext/readpassphrase.c b/src/wraith/src/ext/readpassphrase.c new file mode 100644 index 000000000..e0df05d7b --- /dev/null +++ b/src/wraith/src/ext/readpassphrase.c @@ -0,0 +1,222 @@ +/* $OpenBSD: readpassphrase.c,v 1.22 2010/01/13 10:20:54 dtucker Exp $ */ + +/* + * Copyright (c) 2000-2002, 2007 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* OPENBSD ORIGINAL: lib/libc/gen/readpassphrase.c */ + +#include "orconfig.h" + +#ifndef HAVE_READPASSPHRASE + +#include +#include +#include +#include +#include "tor_readpassphrase.h" +#include +#include +#include + +#ifndef _PATH_TTY +# define _PATH_TTY "/dev/tty" +#endif + +#ifdef TCSASOFT +# define _T_FLUSH (TCSAFLUSH|TCSASOFT) +#else +# define _T_FLUSH (TCSAFLUSH) +#endif + +/* SunOS 4.x which lacks _POSIX_VDISABLE, but has VDISABLE */ +#if !defined(_POSIX_VDISABLE) && defined(VDISABLE) +# define _POSIX_VDISABLE VDISABLE +#endif + +#ifndef _NSIG +# ifdef NSIG +# define _NSIG NSIG +# else +# define _NSIG 128 +# endif +#endif + +static volatile sig_atomic_t signo[_NSIG]; + +static void handler(int); + +char * +readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags) +{ + ssize_t bytes_written = 0; + ssize_t nr; + int input, output, save_errno, i, need_restart; + char ch, *p, *end; + struct termios term, oterm; + struct sigaction sa, savealrm, saveint, savehup, savequit, saveterm; + struct sigaction savetstp, savettin, savettou, savepipe; + + /* I suppose we could alloc on demand in this case (XXX). */ + if (bufsiz == 0) { + errno = EINVAL; + return(NULL); + } + +restart: + for (i = 0; i < _NSIG; i++) + signo[i] = 0; + nr = -1; + save_errno = 0; + need_restart = 0; + /* + * Read and write to /dev/tty if available. If not, read from + * stdin and write to stderr unless a tty is required. + */ + if ((flags & RPP_STDIN) || + (input = output = open(_PATH_TTY, O_RDWR)) == -1) { + if (flags & RPP_REQUIRE_TTY) { + errno = ENOTTY; + return(NULL); + } + input = STDIN_FILENO; + output = STDERR_FILENO; + } + + /* + * Catch signals that would otherwise cause the user to end + * up with echo turned off in the shell. Don't worry about + * things like SIGXCPU and SIGVTALRM for now. + */ + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; /* don't restart system calls */ + sa.sa_handler = handler; + (void)sigaction(SIGALRM, &sa, &savealrm); + (void)sigaction(SIGHUP, &sa, &savehup); + (void)sigaction(SIGINT, &sa, &saveint); + (void)sigaction(SIGPIPE, &sa, &savepipe); + (void)sigaction(SIGQUIT, &sa, &savequit); + (void)sigaction(SIGTERM, &sa, &saveterm); + (void)sigaction(SIGTSTP, &sa, &savetstp); + (void)sigaction(SIGTTIN, &sa, &savettin); + (void)sigaction(SIGTTOU, &sa, &savettou); + + /* Turn off echo if possible. */ + if (input != STDIN_FILENO && tcgetattr(input, &oterm) == 0) { + memcpy(&term, &oterm, sizeof(term)); + if (!(flags & RPP_ECHO_ON)) + term.c_lflag &= ~(ECHO | ECHONL); +#ifdef VSTATUS + if (term.c_cc[VSTATUS] != _POSIX_VDISABLE) + term.c_cc[VSTATUS] = _POSIX_VDISABLE; +#endif + (void)tcsetattr(input, _T_FLUSH, &term); + } else { + memset(&term, 0, sizeof(term)); + term.c_lflag |= ECHO; + memset(&oterm, 0, sizeof(oterm)); + oterm.c_lflag |= ECHO; + } + + /* No I/O if we are already backgrounded. */ + if (signo[SIGTTOU] != 1 && signo[SIGTTIN] != 1) { + if (!(flags & RPP_STDIN)) + bytes_written = write(output, prompt, strlen(prompt)); + end = buf + bufsiz - 1; + p = buf; + while ((nr = read(input, &ch, 1)) == 1 && ch != '\n' && ch != '\r') { + if (p < end) { +#if 0 + if ((flags & RPP_SEVENBIT)) + ch &= 0x7f; + if (isalpha(ch)) { + if ((flags & RPP_FORCELOWER)) + ch = (char)tolower(ch); + if ((flags & RPP_FORCEUPPER)) + ch = (char)toupper(ch); + } +#endif + *p++ = ch; + } + } + *p = '\0'; + save_errno = errno; + if (!(term.c_lflag & ECHO)) + bytes_written = write(output, "\n", 1); + } + + (void) bytes_written; + + /* Restore old terminal settings and signals. */ + if (memcmp(&term, &oterm, sizeof(term)) != 0) { + while (tcsetattr(input, _T_FLUSH, &oterm) == -1 && + errno == EINTR) + continue; + } + (void)sigaction(SIGALRM, &savealrm, NULL); + (void)sigaction(SIGHUP, &savehup, NULL); + (void)sigaction(SIGINT, &saveint, NULL); + (void)sigaction(SIGQUIT, &savequit, NULL); + (void)sigaction(SIGPIPE, &savepipe, NULL); + (void)sigaction(SIGTERM, &saveterm, NULL); + (void)sigaction(SIGTSTP, &savetstp, NULL); + (void)sigaction(SIGTTIN, &savettin, NULL); + (void)sigaction(SIGTTOU, &savettou, NULL); + if (input != STDIN_FILENO) + (void)close(input); + + /* + * If we were interrupted by a signal, resend it to ourselves + * now that we have restored the signal handlers. + */ + for (i = 0; i < _NSIG; i++) { + if (signo[i]) { + kill(getpid(), i); + switch (i) { + case SIGTSTP: + case SIGTTIN: + case SIGTTOU: + need_restart = 1; + } + } + } + if (need_restart) + goto restart; + + if (save_errno) + errno = save_errno; + return(nr == -1 ? NULL : buf); +} + +#if 0 +char * +getpass(const char *prompt) +{ + static char buf[_PASSWORD_LEN + 1]; + + return(readpassphrase(prompt, buf, sizeof(buf), RPP_ECHO_OFF)); +} +#endif + +static void handler(int s) +{ + + signo[s] = 1; +} +#endif /* HAVE_READPASSPHRASE */ diff --git a/src/wraith/src/ext/rust/README b/src/wraith/src/ext/rust/README new file mode 100644 index 000000000..f7b7f0ded --- /dev/null +++ b/src/wraith/src/ext/rust/README @@ -0,0 +1,5 @@ +The crates directory is a local mirror for the crates.io repository. Use + + cargo vendor -x -v /crates + +to update when adding a new dependency or when updating an older version. diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/.cargo-checksum.json b/src/wraith/src/ext/rust/crates/libc-0.2.22/.cargo-checksum.json new file mode 100644 index 000000000..e0a2dd3fd --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"7150ee9391a955b2ef7e0762fc61c0c1aab167620ca36d88d78062d93b8334ba",".travis.yml":"41a754a0d21cff3671a09503cae51bac20357bb0c9640ee5edba2208e573429c","Cargo.toml":"fc8266c859a18b4d550dd9c48a22700a5e002df0a85ad7d3caf58659d9cf9684","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"a2ffaf2a812cec7c243fd753891c7e2eada5b61d9846dd5318d7c99d4514c988","appveyor.yml":"483ae27670e061eb91f055699a9ad88255050b7b300f183b8580340407751bb4","ci/README.md":"be804f15e2128e5fd4b160cb0b13cff5f19e7d77b55ec5254aa6fd8731c84f0d","ci/android-accept-licenses.sh":"84ad00815f628005ed22c5d6cd14990ebc97812a7163bd275b2877904eddab53","ci/android-install-ndk.sh":"73c5f21438c024ce1b8c793184447ff9aecd83c87cbde8de580b782842b3563f","ci/android-install-sdk.sh":"891900fe4e4ceb04717b91a253753858270defc6d6401936d08c09801c1de178","ci/docker/aarch64-linux-android/Dockerfile":"68f375c6e0b3716f8c0b6ed217bc6c3631fa2b86c578b983a0bf60d0344efd74","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"62ca7317439f9c303990e897450a91cd467be05eb75dfc01456d417932ac8672","ci/docker/arm-linux-androideabi/Dockerfile":"1193bf048efbeb9be3c9fac0836dcf6ae07e12cdf09b36b386dd4cbd62abbffa","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"e349f7caa463adbde8d6ec4d2b9f7720ed81c77f48d75bbfb78c89751f55c2dc","ci/docker/i686-linux-android/Dockerfile":"7c353aecdf0b21d8584392cc6ea31d455adad769034c3ea09191a1b26a2521e1","ci/docker/i686-unknown-linux-gnu/Dockerfile":"07e9df6ba91025cbec7ae81ade63f8cfb8a54c5e1e5a8f8def0617e17bd59db0","ci/docker/i686-unknown-linux-musl/Dockerfile":"fcaedc90fbb90375186b36b4324bff0a042aae70695be0f2b632e3cf7479eae6","ci/docker/mips-unknown-linux-gnu/Dockerfile":"860299d96ee50ebdbd788e65eb6ba1f561ef66107647bddffcb2567ac350896b","ci/docker/mips-unknown-linux-musl/Dockerfile":"711c43122fa34cee83a69944493213924b0ff1fccd78c7a141cb2b2127526484","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"163776e0fd38f66df7415421202ac29efc7d345a628947434e573c3885594ab5","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"aef213df08da03ab6a723c3e6e5594a0586251950d81482cf53179d8e64e95c7","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"08b846a338c2ee70100f4e80db812668dc58bfb536c44a95cd1cf004d965186b","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"4da285ffd035d16f5da9e3701841eb86049c8cfa417fa81e53da4ef74152eac0","ci/docker/x86_64-linux-android/Dockerfile":"aecf2b18b70cebe04738f04eaafa7054fece5bc4dc6123786c130ad5446404cd","ci/docker/x86_64-rumprun-netbsd/Dockerfile":"44c3107fb30380785aaed6ff73fa334017a5bb4e3b5c7d4876154f09023a2b99","ci/docker/x86_64-unknown-freebsd/Dockerfile":"ef0f9f63065218728d2daafaa5ba71b17e4ccc23d72e859e0a7133fc64c0815e","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"67fabbc8c6ac02376cf9344251ad49ecdac396b71accb572fd1ae65225325bc0","ci/docker/x86_64-unknown-linux-musl/Dockerfile":"f71019fed5204b950843ef5e56144161fda7e27fad68ed0e8bc4353c388c7bcf","ci/docker/x86_64-unknown-openbsd/Dockerfile":"dfa5c23a6cff8c7a9a846668118c71a8406a360801fd3632fb12e8fbda6b7338","ci/dox.sh":"9ea240a4a607036235fd68c01b5d2a59f365768d103d3be774dcf34aa3ff563e","ci/ios/deploy_and_run_on_ios_simulator.rs":"3175066fd7f82390f6226d881e1a1dda9767ea2705656870e0d7774e2731800e","ci/landing-page-footer.html":"b70b3112c2147f5c967e7481061ef38bc2d79a28dd55a16fb916d9c9426da2c4","ci/landing-page-head.html":"ad69663fac7924f27d0209bc519d55838e86edfc4133713a6fd08caadac1b142","ci/run-docker.sh":"655712ba6127eb2efe2c641cf4cf1246f3e485096d72ec57b423e9d2bff6fb73","ci/run-qemu.sh":"bb859421170871ef23a8940c5e150efec0c01b95e32d2ce2d37b79a45d9d346c","ci/run.sh":"d2bac724d7541379577545d3b4be000acb6a4eea7c101bc8615b36a319217335","ci/style.rs":"60564abc1d5197ed1598426dd0d6ee9939a16d2875b03373538f58843bb616c4","src/dox.rs":"f732d3c0dcd6ace854ee32d8f898b96ac42204a799c6e386c4ba88f6e58673dc","src/lib.rs":"651696755aed40230cde8a505a2dfef61bea52d6349c9b9343497a5c7158ec92","src/macros.rs":"bd9802772b0e5c8b3c550d1c24307f06c0d1e4ce656b4ae1cf092142bbe5412c","src/redox.rs":"3dd158ba9fbbabe96ce2607e91dbf07b93b37c0427734118702dcb4901fe8964","src/unix/bsd/apple/b32.rs":"110ecff78da0e8d405d861447904da403d8b3f6da1f0f9dc9987633f3f04fe46","src/unix/bsd/apple/b64.rs":"2c51c1c063bfb5076ecf08fbc9371ce9473878d2e046c186eb9433955f6f8ba6","src/unix/bsd/apple/mod.rs":"4bc8b16112609cc0a72be6916c89bdca531fa02fc823bf34ad4ec2c4af9c576e","src/unix/bsd/freebsdlike/dragonfly/mod.rs":"54b3b30c4cac35ced9197e7267f209b0f168de8a6899ab0cba290c5ae399f0e7","src/unix/bsd/freebsdlike/freebsd/aarch64.rs":"c7f46b9ae23fde5a9e245a28ed1380066e67f081323b4d253a18e9da3b97b860","src/unix/bsd/freebsdlike/freebsd/mod.rs":"ba1bd1487b41be91115a21e3968d15e4d877043ba4946cd11ed2be2ee66afc19","src/unix/bsd/freebsdlike/freebsd/x86.rs":"54311d3ebf2bb091ab22361e377e6ef9224aec2ecfe459fbfcedde4932db9c58","src/unix/bsd/freebsdlike/freebsd/x86_64.rs":"c7f46b9ae23fde5a9e245a28ed1380066e67f081323b4d253a18e9da3b97b860","src/unix/bsd/freebsdlike/mod.rs":"321c6b9157152e07045ad3d662e5a3a96c3ab0b0d50dc3585a32106147ee4a91","src/unix/bsd/mod.rs":"6c8511618608536d5026222c8e8f1c93af576a4bad7452bc1cd954d72c47615b","src/unix/bsd/netbsdlike/mod.rs":"50ca4e29f06669a0ebff72f2f24b2b08ff55478f580b1684e16a0cf6938a6a50","src/unix/bsd/netbsdlike/netbsd/mod.rs":"5b5c8d295a462ffca8dd65b826ead5d2d210e6a7a71a2909db600fa9aae36151","src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs":"927eeccaf3269d299db4c2a55f8010807bf43dfa894aea6a783215f5d3560baa","src/unix/bsd/netbsdlike/netbsd/other/mod.rs":"4d9f7091af8e166943ac6f42ce85558909e5b6e61325039bff7adfbcf4b90212","src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs":"f8cd05dacd3a3136c58da5a2fbe26f703767823b28e74fe8a2b57a7bd98d6d5c","src/unix/bsd/netbsdlike/openbsdlike/mod.rs":"2d4a17eb74ae5ced13fcd9bb1df283e5623a52754ec75b23cf7b76cb03d5f2a7","src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs":"31686679c2df5f11437a338b9281fa0dd4f8d061dcd895d67619992171e115c9","src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs":"927eeccaf3269d299db4c2a55f8010807bf43dfa894aea6a783215f5d3560baa","src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs":"f5d8db6f54efd05520b31b764a6bacbf612e1aebce097d2d5bfaaef3b91f37b5","src/unix/haiku/b32.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/haiku/b64.rs":"b422430c550c0ba833c9206d1350861e344e3a2eb33d7d58693efb35044be1cc","src/unix/haiku/mod.rs":"fe24d9863133ee2663b07ff872f4982ea36821c432fb569a9676436506c9a98a","src/unix/mod.rs":"63e28708e4791ae7f5d47d899b4060f141231c34a50d81e701c4ea987d1412c1","src/unix/notbsd/android/b32/arm.rs":"d63a234f3a2399bdef1fa13c6a209386cb5ddac04c90f2c6d42badc8235dc49d","src/unix/notbsd/android/b32/mod.rs":"c09b53e42b286a7ec56fb28d0a3e71ec42fecaec39b2015d1d4a3338b172c570","src/unix/notbsd/android/b32/x86.rs":"10e6879dcbf136f0e907337987a0609b357e27e0f24ccb907525fcad881c24c3","src/unix/notbsd/android/b64/aarch64.rs":"d0a25e73f8d02f8412fa9237e41d3f4993b45603a2a8f8d1690bc6624a190d42","src/unix/notbsd/android/b64/mod.rs":"567710245750e8d1e4c99e145b7079b59c1f67514616cbea14734202a8c79c0c","src/unix/notbsd/android/b64/x86_64.rs":"a2b048dad18c60ede035645bbfea2ba3dd75197c1ee0d54fb5fcab14d6c35194","src/unix/notbsd/android/mod.rs":"fd065159dd2a9cbb705d2013b407eb24714bc85c454fb60673e88a839b5427ad","src/unix/notbsd/linux/mips/mips32.rs":"b268f603f71d854614c20cea00431812def9b683d43e6254ae62a8f88a14f7c3","src/unix/notbsd/linux/mips/mips64.rs":"8bce84a47a6ad7fc95234fdd3513ddb8c78634f4ac18209c0276ab705c092ebe","src/unix/notbsd/linux/mips/mod.rs":"9c263551896f5a4403282a20f39f2113f02cb34d968dc65bd80dc73c65fbeb25","src/unix/notbsd/linux/mod.rs":"98b9e87bf4d4396c2195d19f95fa1f6129a92f2aa3783d328438cd35e90d6758","src/unix/notbsd/linux/musl/b32/arm.rs":"d43ba5c528926261b1ccd529ab55636254360a084ab84a7ec22a4eb5afddb8f8","src/unix/notbsd/linux/musl/b32/asmjs.rs":"085e410f990312de76f74cb9bbf9fcc27d686e94334143b34511f565d1b8bb91","src/unix/notbsd/linux/musl/b32/mips.rs":"941c88bc413ba2b87eb6a6cfe03355ee148b865f39598456965b3d04b3adbbe6","src/unix/notbsd/linux/musl/b32/mod.rs":"fc7e055edbe6fa170c2bda6b3415066c1871b3e60ebb70a6329d008f77100f0b","src/unix/notbsd/linux/musl/b32/x86.rs":"ffa5781b52a7d2774a34b1e3e2034a498b919fd96eb85e88098dba2e674a3797","src/unix/notbsd/linux/musl/b64/aarch64.rs":"4009c7eaf703472daef2a70bdac910d9fc395a33689ef2e8cf1c4e692445d3f0","src/unix/notbsd/linux/musl/b64/mod.rs":"d9b03a59a54a568b07ffa4380103a926cbb45dbfd87745edef79cd971ef31283","src/unix/notbsd/linux/musl/b64/powerpc64.rs":"dc28f5b7284235d6cf5519053cac59a1c16dc39223b71cca0871e4880755f852","src/unix/notbsd/linux/musl/b64/x86_64.rs":"43291acc0dfc92c2fec8ba6ce77ee9ca3c20bcdccec18e149f95ba911cee704b","src/unix/notbsd/linux/musl/mod.rs":"52391104b2e6e4f75be7c7625fb44b421514be19ad1fa3b04141b7d59bf93034","src/unix/notbsd/linux/other/b32/arm.rs":"d373022fd152341ec8f5d106937c7898dd68fb4c0346bd94a37526542a605e9a","src/unix/notbsd/linux/other/b32/mod.rs":"6122be151c5d85b9df6a3aaefc5cafd0657b371cafa9cb31ed9b1a394976af45","src/unix/notbsd/linux/other/b32/powerpc.rs":"cc85e75675abc37414fc7701dda7c3f6396e7b2d3c52eea7febdc41f7b033ea9","src/unix/notbsd/linux/other/b32/x86.rs":"1ec7dbfa52d59d3f79c46d5b6854e2dd3bd44dd0f020d4e32183eed4c00bbd52","src/unix/notbsd/linux/other/b64/aarch64.rs":"ce342b37a4a60c216625c8e177a50b3f328bdfd5c527e32e06c73f4aa5926829","src/unix/notbsd/linux/other/b64/mod.rs":"bee90e8d9217ee344d0e99fd483766a1b28e8b1ded930d44a0400a5e5224bb6a","src/unix/notbsd/linux/other/b64/powerpc64.rs":"fc7131f39a75a9e35d474d70b0bc829c52590dadf472ae5785972a94ffb95f12","src/unix/notbsd/linux/other/b64/sparc64.rs":"0ba7f399349bc586ebb73d0caef5c67f195c9e3a942eabfb2efd133b4cea9872","src/unix/notbsd/linux/other/b64/x86_64.rs":"a5e62a7e12891fb545d4b9a40c139c254ba392fd3b285a7f317668f8533c3e4f","src/unix/notbsd/linux/other/mod.rs":"808ea561c7e2a0f58bb1f7a6ecf00c5a3287925e1f6cdb634b44b754df193e55","src/unix/notbsd/linux/s390x.rs":"463f942d676a31d82913fc8ac23912770c2c683db3eb459c0c837cbbdb13610e","src/unix/notbsd/mod.rs":"5a4a2a7799c7b244c439a9599d8885c17dad0cf6179e8f31fb1de4e72f153b53","src/unix/solaris/mod.rs":"ba70c4ebd371f2580c1fb8f3f6cd32a391ec017e1eed9812137caa94e5149a03","src/windows.rs":"acccbd341e81206cb1dc66af41762c193ac0dd719d700b64f7e26c967ee7d670"},"package":"babb8281da88cba992fa1f4ddec7d63ed96280a1a53ec9b919fd37b53d71e502"} \ No newline at end of file diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/.cargo-ok b/src/wraith/src/ext/rust/crates/libc-0.2.22/.cargo-ok new file mode 100644 index 000000000..e69de29bb diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/.gitignore b/src/wraith/src/ext/rust/crates/libc-0.2.22/.gitignore new file mode 100644 index 000000000..f0ff2599d --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/.gitignore @@ -0,0 +1,3 @@ +target +Cargo.lock +*~ diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/.travis.yml b/src/wraith/src/ext/rust/crates/libc-0.2.22/.travis.yml new file mode 100644 index 000000000..22d86e033 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/.travis.yml @@ -0,0 +1,132 @@ +language: rust +sudo: required +dist: trusty +services: + - docker +install: + - if [ -z "$NO_ADD" ]; then rustup target add $TARGET; fi +script: + - cargo build + - cargo build --no-default-features + - cargo generate-lockfile --manifest-path libc-test/Cargo.toml + - if [[ $TRAVIS_OS_NAME = "linux" ]]; then + sh ci/run-docker.sh $TARGET; + else + export CARGO_TARGET_DIR=`pwd`/target; + sh ci/run.sh $TARGET; + fi + - rustc ci/style.rs && ./style src +env: + global: + secure: "e2/3QjgRN9atOuSHp22TrYG7QVKcYUWY48Hi9b60w+r1+BhPkTseIJLte7WefRhdXtqpjjUJTooKDhnurFOeHaCT+nmBgiv+FPU893sBl4bhesY4m0vgUJVbNZcs6lTImYekWVb+aqjGdgV/XAgCw7c3kPmrZV0MzGDWL64Xaps=" +matrix: + include: + # 1.0.0 compat + - os: linux + env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1 + rust: 1.0.0 + script: cargo build + install: + + # build documentation + - os: linux + env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1 + rust: nightly + script: sh ci/dox.sh + + # stable compat + - os: linux + env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1 + rust: stable + - os: linux + env: TARGET=i686-unknown-linux-gnu + rust: stable + - os: osx + env: TARGET=x86_64-apple-darwin NO_ADD=1 + rust: stable + - os: osx + env: TARGET=i686-apple-darwin + rust: stable + - os: linux + env: TARGET=arm-linux-androideabi + rust: stable + - os: linux + env: TARGET=aarch64-linux-android + rust: stable + - os: linux + env: TARGET=i686-linux-android + rust: stable + - os: linux + env: TARGET=x86_64-unknown-linux-musl + rust: stable + - os: linux + env: TARGET=i686-unknown-linux-musl + rust: stable + - os: linux + env: TARGET=arm-unknown-linux-gnueabihf + rust: stable + - os: linux + env: TARGET=aarch64-unknown-linux-gnu + rust: stable + - os: osx + osx_image: xcode8.2 + env: TARGET=i386-apple-ios + rust: stable + - os: osx + osx_image: xcode8.2 + env: TARGET=x86_64-apple-ios + rust: stable + - os: linux + env: TARGET=x86_64-rumprun-netbsd + rust: stable + - os: linux + env: TARGET=powerpc-unknown-linux-gnu + rust: stable + - os: linux + env: TARGET=powerpc64-unknown-linux-gnu + rust: beta + - os: linux + env: TARGET=mips-unknown-linux-musl + rust: stable + - os: linux + env: TARGET=mipsel-unknown-linux-musl + rust: stable + - os: linux + env: TARGET=mips64-unknown-linux-gnuabi64 + rust: beta + - os: linux + env: TARGET=mips-unknown-linux-gnu + rust: beta + + # beta + - os: linux + env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1 + rust: beta + - os: osx + env: TARGET=x86_64-apple-darwin NO_ADD=1 + rust: beta + + # nightly + - os: linux + env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1 + rust: nightly + - os: osx + env: TARGET=x86_64-apple-darwin NO_ADD=1 + rust: nightly + + # QEMU based targets that compile in an emulator + - os: linux + env: TARGET=x86_64-unknown-freebsd + rust: stable + - os: linux + env: TARGET=x86_64-unknown-openbsd QEMU=openbsd.qcow2 + rust: stable + script: sh ci/run-docker.sh $TARGET + install: + +cache: cargo + +notifications: + email: + on_success: never + webhooks: https://buildbot.rust-lang.org/homu/travis diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/Cargo.toml b/src/wraith/src/ext/rust/crates/libc-0.2.22/Cargo.toml new file mode 100644 index 000000000..2362eec9e --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/Cargo.toml @@ -0,0 +1,21 @@ +[package] + +name = "libc" +version = "0.2.22" +authors = ["The Rust Project Developers"] +license = "MIT/Apache-2.0" +readme = "README.md" +repository = "https://github.com/rust-lang/libc" +homepage = "https://github.com/rust-lang/libc" +documentation = "http://doc.rust-lang.org/libc" +description = """ +A library for types and bindings to native C functions often found in libc or +other common platform libraries. +""" + +[features] +default = ["use_std"] +use_std = [] + +[workspace] +members = ["libc-test", "libc-test/generate-files"] diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/LICENSE-APACHE b/src/wraith/src/ext/rust/crates/libc-0.2.22/LICENSE-APACHE new file mode 100644 index 000000000..16fe87b06 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/LICENSE-MIT b/src/wraith/src/ext/rust/crates/libc-0.2.22/LICENSE-MIT new file mode 100644 index 000000000..39d4bdb5a --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright (c) 2014 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/README.md b/src/wraith/src/ext/rust/crates/libc-0.2.22/README.md new file mode 100644 index 000000000..83ae7b935 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/README.md @@ -0,0 +1,137 @@ +libc +==== + +A Rust library with native bindings to the types and functions commonly found on +various systems, including libc. + +[![Build Status](https://travis-ci.org/rust-lang/libc.svg?branch=master)](https://travis-ci.org/rust-lang/libc) +[![Build status](https://ci.appveyor.com/api/projects/status/github/rust-lang/libc?svg=true)](https://ci.appveyor.com/project/rust-lang-libs/libc) + +[Documentation](#platforms-and-documentation) + +## Usage + +First, add the following to your `Cargo.toml`: + +```toml +[dependencies] +libc = "0.2" +``` + +Next, add this to your crate root: + +```rust +extern crate libc; +``` + +Currently libc by default links to the standard library, but if you would +instead like to use libc in a `#![no_std]` situation or crate you can request +this via: + +```toml +[dependencies] +libc = { version = "0.2", default-features = false } +``` + +## What is libc? + +The primary purpose of this crate is to provide all of the definitions necessary +to easily interoperate with C code (or "C-like" code) on each of the platforms +that Rust supports. This includes type definitions (e.g. `c_int`), constants +(e.g. `EINVAL`) as well as function headers (e.g. `malloc`). + +This crate does not strive to have any form of compatibility across platforms, +but rather it is simply a straight binding to the system libraries on the +platform in question. + +## Public API + +This crate exports all underlying platform types, functions, and constants under +the crate root, so all items are accessible as `libc::foo`. The types and values +of all the exported APIs match the platform that libc is compiled for. + +More detailed information about the design of this library can be found in its +[associated RFC][rfc]. + +[rfc]: https://github.com/rust-lang/rfcs/blob/master/text/1291-promote-libc.md + +## Adding an API + +Want to use an API which currently isn't bound in `libc`? It's quite easy to add +one! + +The internal structure of this crate is designed to minimize the number of +`#[cfg]` attributes in order to easily be able to add new items which apply +to all platforms in the future. As a result, the crate is organized +hierarchically based on platform. Each module has a number of `#[cfg]`'d +children, but only one is ever actually compiled. Each module then reexports all +the contents of its children. + +This means that for each platform that libc supports, the path from a +leaf module to the root will contain all bindings for the platform in question. +Consequently, this indicates where an API should be added! Adding an API at a +particular level in the hierarchy means that it is supported on all the child +platforms of that level. For example, when adding a Unix API it should be added +to `src/unix/mod.rs`, but when adding a Linux-only API it should be added to +`src/unix/notbsd/linux/mod.rs`. + +If you're not 100% sure at what level of the hierarchy an API should be added +at, fear not! This crate has CI support which tests any binding against all +platforms supported, so you'll see failures if an API is added at the wrong +level or has different signatures across platforms. + +With that in mind, the steps for adding a new API are: + +1. Determine where in the module hierarchy your API should be added. +2. Add the API. +3. Send a PR to this repo. +4. Wait for CI to pass, fixing errors. +5. Wait for a merge! + +### Test before you commit + +We have two automated tests running on [Travis](https://travis-ci.org/rust-lang/libc): + +1. [`libc-test`](https://github.com/alexcrichton/ctest) + - `cd libc-test && cargo run` + - Use the `skip_*()` functions in `build.rs` if you really need a workaround. +2. Style checker + - `rustc ci/style.rs && ./style src` + +## Platforms and Documentation + +The following platforms are currently tested and have documentation available: + +Tested: + * [`i686-pc-windows-msvc`](https://doc.rust-lang.org/libc/i686-pc-windows-msvc/libc/) + * [`x86_64-pc-windows-msvc`](https://doc.rust-lang.org/libc/x86_64-pc-windows-msvc/libc/) + (Windows) + * [`i686-pc-windows-gnu`](https://doc.rust-lang.org/libc/i686-pc-windows-gnu/libc/) + * [`x86_64-pc-windows-gnu`](https://doc.rust-lang.org/libc/x86_64-pc-windows-gnu/libc/) + * [`i686-apple-darwin`](https://doc.rust-lang.org/libc/i686-apple-darwin/libc/) + * [`x86_64-apple-darwin`](https://doc.rust-lang.org/libc/x86_64-apple-darwin/libc/) + (OSX) + * `i386-apple-ios` + * `x86_64-apple-ios` + * [`i686-unknown-linux-gnu`](https://doc.rust-lang.org/libc/i686-unknown-linux-gnu/libc/) + * [`x86_64-unknown-linux-gnu`](https://doc.rust-lang.org/libc/x86_64-unknown-linux-gnu/libc/) + (Linux) + * [`x86_64-unknown-linux-musl`](https://doc.rust-lang.org/libc/x86_64-unknown-linux-musl/libc/) + (Linux MUSL) + * [`aarch64-unknown-linux-gnu`](https://doc.rust-lang.org/libc/aarch64-unknown-linux-gnu/libc/) + * [`mips-unknown-linux-gnu`](https://doc.rust-lang.org/libc/mips-unknown-linux-gnu/libc/) + * [`arm-unknown-linux-gnueabihf`](https://doc.rust-lang.org/libc/arm-unknown-linux-gnueabihf/libc/) + * [`arm-linux-androideabi`](https://doc.rust-lang.org/libc/arm-linux-androideabi/libc/) + (Android) + * [`x86_64-unknown-freebsd`](https://doc.rust-lang.org/libc/x86_64-unknown-freebsd/libc/) + * [`x86_64-unknown-openbsd`](https://doc.rust-lang.org/libc/x86_64-unknown-openbsd/libc/) + * [`x86_64-rumprun-netbsd`](https://doc.rust-lang.org/libc/x86_64-unknown-netbsd/libc/) + +The following may be supported, but are not guaranteed to always work: + + * `i686-unknown-freebsd` + * [`x86_64-unknown-bitrig`](https://doc.rust-lang.org/libc/x86_64-unknown-bitrig/libc/) + * [`x86_64-unknown-dragonfly`](https://doc.rust-lang.org/libc/x86_64-unknown-dragonfly/libc/) + * `i686-unknown-haiku` + * `x86_64-unknown-haiku` + * [`x86_64-unknown-netbsd`](https://doc.rust-lang.org/libc/x86_64-unknown-netbsd/libc/) diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/appveyor.yml b/src/wraith/src/ext/rust/crates/libc-0.2.22/appveyor.yml new file mode 100644 index 000000000..b6c666c8b --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/appveyor.yml @@ -0,0 +1,25 @@ +environment: + matrix: + - TARGET: x86_64-pc-windows-gnu + MSYS2_BITS: 64 + - TARGET: i686-pc-windows-gnu + MSYS2_BITS: 32 + - TARGET: x86_64-pc-windows-msvc + - TARGET: i686-pc-windows-msvc +install: + - appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe + - rustup-init.exe -y --default-host %TARGET% + - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin + - if defined MSYS2_BITS set PATH=%PATH%;C:\msys64\mingw%MSYS2_BITS%\bin + - rustc -V + - cargo -V + +build: false + +test_script: + - cargo test --target %TARGET% + - cargo run --manifest-path libc-test/Cargo.toml --target %TARGET% + +cache: + - target + - C:\Users\appveyor\.cargo\registry diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/README.md b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/README.md new file mode 100644 index 000000000..13c7c8da5 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/README.md @@ -0,0 +1,203 @@ +The goal of the libc crate is to have CI running everywhere to have the +strongest guarantees about the definitions that this library contains, and as a +result the CI is pretty complicated and also pretty large! Hopefully this can +serve as a guide through the sea of scripts in this directory and elsewhere in +this project. + +# Files + +First up, let's talk about the files in this directory: + +* `run-travis.sh` - a shell script run by all Travis builders, this is + responsible for setting up the rest of the environment such as installing new + packages, downloading Rust target libraries, etc. + +* `run.sh` - the actual script which runs tests for a particular architecture. + Called from the `run-travis.sh` script this will run all tests for the target + specified. + +* `cargo-config` - Cargo configuration of linkers to use copied into place by + the `run-travis.sh` script before builds are run. + +* `dox.sh` - script called from `run-travis.sh` on only the linux 64-bit nightly + Travis bots to build documentation for this crate. + +* `landing-page-*.html` - used by `dox.sh` to generate a landing page for all + architectures' documentation. + +* `run-qemu.sh` - see discussion about QEMU below + +* `mips`, `rumprun` - instructions to build the docker image for each respective + CI target + +# CI Systems + +Currently this repository leverages a combination of Travis CI and AppVeyor for +running tests. The triples tested are: + +* AppVeyor + * `{i686,x86_64}-pc-windows-{msvc,gnu}` +* Travis + * `{i686,x86_64,mips,aarch64}-unknown-linux-gnu` + * `x86_64-unknown-linux-musl` + * `arm-unknown-linux-gnueabihf` + * `arm-linux-androideabi` + * `{i686,x86_64}-apple-{darwin,ios}` + * `x86_64-rumprun-netbsd` + * `x86_64-unknown-freebsd` + * `x86_64-unknown-openbsd` + +The Windows triples are all pretty standard, they just set up their environment +then run tests, no need for downloading any extra target libs (we just download +the right installer). The Intel Linux/OSX builds are similar in that we just +download the right target libs and run tests. Note that the Intel Linux/OSX +builds are run on stable/beta/nightly, but are the only ones that do so. + +The remaining architectures look like: + +* Android runs in a [docker image][android-docker] with an emulator, the NDK, + and the SDK already set up. The entire build happens within the docker image. +* The MIPS, ARM, and AArch64 builds all use the QEMU userspace emulator to run + the generated binary to actually verify the tests pass. +* The MUSL build just has to download a MUSL compiler and target libraries and + then otherwise runs tests normally. +* iOS builds need an extra linker flag currently, but beyond that they're built + as standard as everything else. +* The rumprun target builds an entire kernel from the test suite and then runs + it inside QEMU using the serial console to test whether it succeeded or + failed. +* The BSD builds, currently OpenBSD and FreeBSD, use QEMU to boot up a system + and compile/run tests. More information on that below. + +[android-docker]: https://github.com/rust-lang/rust-buildbot/blob/master/slaves/android/Dockerfile + +## QEMU + +Lots of the architectures tested here use QEMU in the tests, so it's worth going +over all the crazy capabilities QEMU has and the various flavors in which we use +it! + +First up, QEMU has userspace emulation where it doesn't boot a full kernel, it +just runs a binary from another architecture (using the `qemu-` wrappers). +We provide it the runtime path for the dynamically loaded system libraries, +however. This strategy is used for all Linux architectures that aren't intel. +Note that one downside of this QEMU system is that threads are barely +implemented, so we're careful to not spawn many threads. + +For the rumprun target the only output is a kernel image, so we just use that +plus the `rumpbake` command to create a full kernel image which is then run from +within QEMU. + +Finally, the fun part, the BSDs. Quite a few hoops are jumped through to get CI +working for these platforms, but the gist of it looks like: + +* Cross compiling from Linux to any of the BSDs seems to be quite non-standard. + We may be able to get it working but it might be difficult at that point to + ensure that the libc definitions align with what you'd get on the BSD itself. + As a result, we try to do compiles within the BSD distro. +* On Travis we can't run a VM-in-a-VM, so we resort to userspace emulation + (QEMU). +* Unfortunately on Travis we also can't use KVM, so the emulation is super slow. + +With all that in mind, the way BSD is tested looks like: + +1. Download a pre-prepared image for the OS being tested. +2. Generate the tests for the OS being tested. This involves running the `ctest` + library over libc to generate a Rust file and a C file which will then be + compiled into the final test. +3. Generate a disk image which will later be mounted by the OS being tested. + This image is mostly just the libc directory, but some modifications are made + to compile the generated files from step 2. +4. The kernel is booted in QEMU, and it is configured to detect the libc-test + image being available, run the test script, and then shut down afterwards. +5. Look for whether the tests passed in the serial console output of the kernel. + +There's some pretty specific instructions for setting up each image (detailed +below), but the main gist of this is that we must avoid a vanilla `cargo run` +inside of the `libc-test` directory (which is what it's intended for) because +that would compile `syntex_syntax`, a large library, with userspace emulation. +This invariably times out on Travis, so we can't do that. + +Once all those hoops are jumped through, however, we can be happy that we're +testing almost everything! + +Below are some details of how to set up the initial OS images which are +downloaded. Each image must be enabled have input/output over the serial +console, log in automatically at the serial console, detect if a second drive in +QEMU is available, and if so mount it, run a script (it'll specifically be +`run-qemu.sh` in this folder which is copied into the generated image talked +about above), and then shut down. + +### QEMU setup - FreeBSD + +1. Download CD installer (most minimal is fine) +2. `qemu-img create -f qcow2 foo.qcow2 2G` +3. `qemu -cdrom foo.iso -drive if=virtio,file=foo.qcow2 -net nic,model=virtio -net user` +4. run installer +5. `echo 'console="comconsole"' >> /boot/loader.conf` +6. `echo 'autoboot_delay="0"' >> /boot/loader.conf` +7. look at /etc/ttys, see what getty argument is for ttyu0 +8. edit /etc/gettytab, look for ttyu0 argument, prepend `:al=root` to line + beneath + +(note that the current image has a `freebsd` user, but this isn't really +necessary) + +Once that's done, arrange for this script to run at login: + +``` +#!/bin/sh + +sudo kldload ext2fs +[ -e /dev/vtbd1 ] || exit 0 +sudo mount -t ext2fs /dev/vtbd1 /mnt +sh /mnt/run.sh /mnt +sudo poweroff +``` + +Helpful links + +* https://en.wikibooks.org/wiki/QEMU/Images +* https://blog.nekoconeko.nl/blog/2015/06/04/creating-an-openstack-freebsd-image.html +* https://www.freebsd.org/doc/handbook/serialconsole-setup.html + + +### QEMU setup - OpenBSD + +1. Download CD installer +2. `qemu-img create -f qcow2 foo.qcow2 2G` +3. `qemu -cdrom foo.iso -drive if=virtio,file=foo.qcow2 -net nic,model=virtio -net user` +4. run installer +5. `echo 'set tty com0' >> /etc/boot.conf` +6. `echo 'boot' >> /etc/boot.conf` +7. Modify /etc/ttys, change the `tty00` at the end from 'unknown off' to + 'vt220 on secure' +8. Modify same line in /etc/ttys to have `"/root/foo.sh"` as the shell +9. Add this script to `/root/foo.sh` + +``` +#!/bin/sh +exec 1>/dev/tty00 +exec 2>&1 + +if mount -t ext2fs /dev/sd1c /mnt; then + sh /mnt/run.sh /mnt + shutdown -ph now +fi + +# limited shell... +exec /bin/sh < /dev/tty00 +``` + +10. `chmod +x /root/foo.sh` + +Helpful links: + +* https://en.wikibooks.org/wiki/QEMU/Images +* http://www.openbsd.org/faq/faq7.html#SerCon + +# Questions? + +Hopefully that's at least somewhat of an introduction to everything going on +here, and feel free to ping @alexcrichton with questions! + diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-accept-licenses.sh b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-accept-licenses.sh new file mode 100644 index 000000000..8d8f60a5e --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-accept-licenses.sh @@ -0,0 +1,15 @@ +#!/usr/bin/expect -f +# ignore-license + +set timeout 1800 +set cmd [lindex $argv 0] +set licenses [lindex $argv 1] + +spawn {*}$cmd +expect { + "Do you accept the license '*'*" { + exp_send "y\r" + exp_continue + } + eof +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-install-ndk.sh b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-install-ndk.sh new file mode 100644 index 000000000..75bcd20f2 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-install-ndk.sh @@ -0,0 +1,36 @@ +#!/bin/sh +# Copyright 2016 The Rust Project Developers. See the COPYRIGHT +# file at the top-level directory of this distribution and at +# http://rust-lang.org/COPYRIGHT. +# +# Licensed under the Apache License, Version 2.0 or the MIT license +# , at your +# option. This file may not be copied, modified, or distributed +# except according to those terms. + +set -ex + +curl -O https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip +unzip -q android-ndk-r13b-linux-x86_64.zip + +case "$1" in + aarch64) + arch=arm64 + ;; + + i686) + arch=x86 + ;; + + *) + arch=$1 + ;; +esac; + +android-ndk-r13b/build/tools/make_standalone_toolchain.py \ + --install-dir /android/ndk-$1 \ + --arch $arch \ + --api 24 + +rm -rf ./android-ndk-r13b-linux-x86_64.zip ./android-ndk-r13b diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-install-sdk.sh b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-install-sdk.sh new file mode 100644 index 000000000..d03b7623b --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/android-install-sdk.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# Copyright 2016 The Rust Project Developers. See the COPYRIGHT +# file at the top-level directory of this distribution and at +# http://rust-lang.org/COPYRIGHT. +# +# Licensed under the Apache License, Version 2.0 or the MIT license +# , at your +# option. This file may not be copied, modified, or distributed +# except according to those terms. + +set -ex + +# Prep the SDK and emulator +# +# Note that the update process requires that we accept a bunch of licenses, and +# we can't just pipe `yes` into it for some reason, so we take the same strategy +# located in https://github.com/appunite/docker by just wrapping it in a script +# which apparently magically accepts the licenses. + +mkdir sdk +curl https://dl.google.com/android/repository/tools_r25.2.5-linux.zip -O +unzip -d sdk tools_r25.2.5-linux.zip + +filter="platform-tools,android-24" + +case "$1" in + arm | armv7) + abi=armeabi-v7a + ;; + + aarch64) + abi=arm64-v8a + ;; + + i686) + abi=x86 + ;; + + x86_64) + abi=x86_64 + ;; + + *) + echo "invalid arch: $1" + exit 1 + ;; +esac; + +filter="$filter,sys-img-$abi-android-24" + +./android-accept-licenses.sh "android - update sdk -a --no-ui --filter $filter" + +echo "no" | android create avd \ + --name $1 \ + --target android-24 \ + --abi $abi diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-linux-android/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-linux-android/Dockerfile new file mode 100644 index 000000000..7ad84926b --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-linux-android/Dockerfile @@ -0,0 +1,32 @@ +FROM ubuntu:16.04 + +RUN dpkg --add-architecture i386 && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + file \ + curl \ + ca-certificates \ + python \ + unzip \ + expect \ + openjdk-9-jre \ + libstdc++6:i386 \ + libpulse0 \ + gcc \ + libc6-dev + +WORKDIR /android/ +COPY android* /android/ + +ENV ANDROID_ARCH=aarch64 +ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools + +RUN sh /android/android-install-ndk.sh $ANDROID_ARCH +RUN sh /android/android-install-sdk.sh $ANDROID_ARCH +RUN mv /root/.android /tmp +RUN chmod 777 -R /tmp/.android +RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/* + +ENV PATH=$PATH:/rust/bin \ + CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=aarch64-linux-android-gcc \ + HOME=/tmp diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-unknown-linux-gnu/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-unknown-linux-gnu/Dockerfile new file mode 100644 index 000000000..2ba69e154 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-unknown-linux-gnu/Dockerfile @@ -0,0 +1,7 @@ +FROM ubuntu:16.10 +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc libc6-dev ca-certificates \ + gcc-aarch64-linux-gnu libc6-dev-arm64-cross qemu-user +ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \ + PATH=$PATH:/rust/bin diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-linux-androideabi/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-linux-androideabi/Dockerfile new file mode 100644 index 000000000..054941416 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-linux-androideabi/Dockerfile @@ -0,0 +1,32 @@ +FROM ubuntu:16.04 + +RUN dpkg --add-architecture i386 && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + file \ + curl \ + ca-certificates \ + python \ + unzip \ + expect \ + openjdk-9-jre \ + libstdc++6:i386 \ + libpulse0 \ + gcc \ + libc6-dev + +WORKDIR /android/ +COPY android* /android/ + +ENV ANDROID_ARCH=arm +ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools + +RUN sh /android/android-install-ndk.sh $ANDROID_ARCH +RUN sh /android/android-install-sdk.sh $ANDROID_ARCH +RUN mv /root/.android /tmp +RUN chmod 777 -R /tmp/.android +RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/* + +ENV PATH=$PATH:/rust/bin \ + CARGO_TARGET_ARM_LINUX_ANDROIDEABI_LINKER=arm-linux-androideabi-gcc \ + HOME=/tmp diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile new file mode 100644 index 000000000..3824c0466 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile @@ -0,0 +1,7 @@ +FROM ubuntu:16.10 +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc libc6-dev ca-certificates \ + gcc-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-user +ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \ + PATH=$PATH:/rust/bin diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-linux-android/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-linux-android/Dockerfile new file mode 100644 index 000000000..bee904379 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-linux-android/Dockerfile @@ -0,0 +1,32 @@ +FROM ubuntu:16.04 + +RUN dpkg --add-architecture i386 && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + file \ + curl \ + ca-certificates \ + python \ + unzip \ + expect \ + openjdk-9-jre \ + libstdc++6:i386 \ + libpulse0 \ + gcc \ + libc6-dev + +WORKDIR /android/ +COPY android* /android/ + +ENV ANDROID_ARCH=i686 +ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools + +RUN sh /android/android-install-ndk.sh $ANDROID_ARCH +RUN sh /android/android-install-sdk.sh $ANDROID_ARCH +RUN mv /root/.android /tmp +RUN chmod 777 -R /tmp/.android +RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/* + +ENV PATH=$PATH:/rust/bin \ + CARGO_TARGET_I686_LINUX_ANDROID_LINKER=i686-linux-android-gcc \ + HOME=/tmp diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-gnu/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-gnu/Dockerfile new file mode 100644 index 000000000..c149d8407 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-gnu/Dockerfile @@ -0,0 +1,5 @@ +FROM ubuntu:16.10 +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc-multilib libc6-dev ca-certificates +ENV PATH=$PATH:/rust/bin diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-musl/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-musl/Dockerfile new file mode 100644 index 000000000..bdc2272a3 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-musl/Dockerfile @@ -0,0 +1,23 @@ +FROM ubuntu:16.10 + +RUN dpkg --add-architecture i386 +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc-multilib make libc6-dev git curl ca-certificates libc6:i386 +# Below we're cross-compiling musl for i686 using the system compiler on an +# x86_64 system. This is an awkward thing to be doing and so we have to jump +# through a couple hoops to get musl to be happy. In particular: +# +# * We specifically pass -m32 in CFLAGS and override CC when running ./configure, +# since otherwise the script will fail to find a compiler. +# * We manually unset CROSS_COMPILE when running make; otherwise the makefile +# will call the non-existent binary 'i686-ar'. +RUN curl https://www.musl-libc.org/releases/musl-1.1.15.tar.gz | \ + tar xzf - && \ + cd musl-1.1.15 && \ + CC=gcc CFLAGS=-m32 ./configure --prefix=/musl-i686 --disable-shared --target=i686 && \ + make CROSS_COMPILE= install -j4 && \ + cd .. && \ + rm -rf musl-1.1.15 +ENV PATH=$PATH:/musl-i686/bin:/rust/bin \ + CC_i686_unknown_linux_musl=musl-gcc diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-gnu/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-gnu/Dockerfile new file mode 100644 index 000000000..eea1f652c --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-gnu/Dockerfile @@ -0,0 +1,10 @@ +FROM ubuntu:16.10 + +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc libc6-dev qemu-user ca-certificates \ + gcc-mips-linux-gnu libc6-dev-mips-cross \ + qemu-system-mips + +ENV CARGO_TARGET_MIPS_UNKNOWN_LINUX_GNU_LINKER=mips-linux-gnu-gcc \ + PATH=$PATH:/rust/bin diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-musl/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-musl/Dockerfile new file mode 100644 index 000000000..cbc41c24d --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-musl/Dockerfile @@ -0,0 +1,17 @@ +FROM ubuntu:16.10 + +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc libc6-dev qemu-user ca-certificates qemu-system-mips curl \ + bzip2 + +RUN mkdir /toolchain + +# Note that this originally came from: +# https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/OpenWrt-SDK-ar71xx-generic_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 +RUN curl -L https://s3.amazonaws.com/rust-lang-ci/libc/OpenWrt-SDK-ar71xx-generic_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 | \ + tar xjf - -C /toolchain --strip-components=1 + +ENV PATH=$PATH:/rust/bin:/toolchain/staging_dir/toolchain-mips_34kc_gcc-5.3.0_musl-1.1.15/bin \ + CC_mips_unknown_linux_musl=mips-openwrt-linux-gcc \ + CARGO_TARGET_MIPS_UNKNOWN_LINUX_MUSL_LINKER=mips-openwrt-linux-gcc diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile new file mode 100644 index 000000000..2eb5de245 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile @@ -0,0 +1,11 @@ +FROM ubuntu:16.10 + +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc libc6-dev qemu-user ca-certificates \ + gcc-mips64-linux-gnuabi64 libc6-dev-mips64-cross \ + qemu-system-mips64 + +ENV CARGO_TARGET_MIPS64_UNKNOWN_LINUX_GNUABI64_LINKER=mips64-linux-gnuabi64-gcc \ + CC_mips64_unknown_linux_gnuabi64=mips64-linux-gnuabi64-gcc \ + PATH=$PATH:/rust/bin diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mipsel-unknown-linux-musl/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mipsel-unknown-linux-musl/Dockerfile new file mode 100644 index 000000000..4c7ee8bcf --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/mipsel-unknown-linux-musl/Dockerfile @@ -0,0 +1,17 @@ +FROM ubuntu:16.10 + +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc libc6-dev qemu-user ca-certificates qemu-system-mips curl \ + bzip2 + +RUN mkdir /toolchain + +# Note that this originally came from: +# https://downloads.openwrt.org/snapshots/trunk/malta/generic/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 +RUN curl -L https://s3.amazonaws.com/rust-lang-ci/libc/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 | \ + tar xjf - -C /toolchain --strip-components=2 + +ENV PATH=$PATH:/rust/bin:/toolchain/bin \ + CC_mipsel_unknown_linux_musl=mipsel-openwrt-linux-gcc \ + CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=mipsel-openwrt-linux-gcc diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc-unknown-linux-gnu/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc-unknown-linux-gnu/Dockerfile new file mode 100644 index 000000000..d9d7db0f4 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc-unknown-linux-gnu/Dockerfile @@ -0,0 +1,10 @@ +FROM ubuntu:16.10 + +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc libc6-dev qemu-user ca-certificates \ + gcc-powerpc-linux-gnu libc6-dev-powerpc-cross \ + qemu-system-ppc + +ENV CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_LINKER=powerpc-linux-gnu-gcc \ + PATH=$PATH:/rust/bin diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile new file mode 100644 index 000000000..df0e6057b --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile @@ -0,0 +1,11 @@ +FROM ubuntu:16.10 + +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc libc6-dev qemu-user ca-certificates \ + gcc-powerpc64-linux-gnu libc6-dev-ppc64-cross \ + qemu-system-ppc + +ENV CARGO_TARGET_POWERPC64_UNKNOWN_LINUX_GNU_LINKER=powerpc64-linux-gnu-gcc \ + CC=powerpc64-linux-gnu-gcc \ + PATH=$PATH:/rust/bin diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-linux-android/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-linux-android/Dockerfile new file mode 100644 index 000000000..bf4793e06 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-linux-android/Dockerfile @@ -0,0 +1,32 @@ +FROM ubuntu:16.04 + +RUN dpkg --add-architecture i386 && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + file \ + curl \ + ca-certificates \ + python \ + unzip \ + expect \ + openjdk-9-jre \ + libstdc++6:i386 \ + libpulse0 \ + gcc \ + libc6-dev + +WORKDIR /android/ +COPY android* /android/ + +ENV ANDROID_ARCH=x86_64 +ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools + +RUN sh /android/android-install-ndk.sh $ANDROID_ARCH +RUN sh /android/android-install-sdk.sh $ANDROID_ARCH +RUN mv /root/.android /tmp +RUN chmod 777 -R /tmp/.android +RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/* + +ENV PATH=$PATH:/rust/bin \ + CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=x86_64-linux-android-gcc \ + HOME=/tmp diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-rumprun-netbsd/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-rumprun-netbsd/Dockerfile new file mode 100644 index 000000000..129771e76 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-rumprun-netbsd/Dockerfile @@ -0,0 +1,6 @@ +FROM mato/rumprun-toolchain-hw-x86_64 +USER root +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + qemu +ENV PATH=$PATH:/rust/bin diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-freebsd/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-freebsd/Dockerfile new file mode 100644 index 000000000..12b0bdffc --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-freebsd/Dockerfile @@ -0,0 +1,13 @@ +FROM alexcrichton/rust-slave-linux-cross:2016-04-15 +USER root + +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + qemu genext2fs + +ENTRYPOINT ["sh"] + +ENV PATH=$PATH:/rust/bin \ + QEMU=2016-11-06/freebsd.qcow2.gz \ + CAN_CROSS=1 \ + CARGO_TARGET_X86_64_UNKNOWN_FREEBSD_LINKER=x86_64-unknown-freebsd10-gcc diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-gnu/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-gnu/Dockerfile new file mode 100644 index 000000000..4af3f834c --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-gnu/Dockerfile @@ -0,0 +1,5 @@ +FROM ubuntu:16.10 +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc libc6-dev ca-certificates +ENV PATH=$PATH:/rust/bin diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-musl/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-musl/Dockerfile new file mode 100644 index 000000000..9c2499948 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-musl/Dockerfile @@ -0,0 +1,13 @@ +FROM ubuntu:16.10 + +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc make libc6-dev git curl ca-certificates +RUN curl https://www.musl-libc.org/releases/musl-1.1.15.tar.gz | \ + tar xzf - && \ + cd musl-1.1.15 && \ + ./configure --prefix=/musl-x86_64 && \ + make install -j4 && \ + cd .. && \ + rm -rf musl-1.1.15 +ENV PATH=$PATH:/musl-x86_64/bin:/rust/bin diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-openbsd/Dockerfile b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-openbsd/Dockerfile new file mode 100644 index 000000000..518baf870 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-openbsd/Dockerfile @@ -0,0 +1,8 @@ +FROM ubuntu:16.10 + +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + gcc libc6-dev qemu curl ca-certificates \ + genext2fs +ENV PATH=$PATH:/rust/bin \ + QEMU=2016-11-06/openbsd-6.0-without-pkgs.qcow2 diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/dox.sh b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/dox.sh new file mode 100644 index 000000000..85e924394 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/dox.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +# Builds documentation for all target triples that we have a registered URL for +# in liblibc. This scrapes the list of triples to document from `src/lib.rs` +# which has a bunch of `html_root_url` directives we pick up. + +set -e + +TARGETS=`grep html_root_url src/lib.rs | sed 's/.*".*\/\(.*\)"/\1/'` + +rm -rf target/doc +mkdir -p target/doc + +cp ci/landing-page-head.html target/doc/index.html + +for target in $TARGETS; do + echo documenting $target + + rustdoc -o target/doc/$target --target $target src/lib.rs --cfg dox \ + --crate-name libc + + echo "
    • $target
    • " \ + >> target/doc/index.html +done + +cat ci/landing-page-footer.html >> target/doc/index.html + +# If we're on travis, not a PR, and on the right branch, publish! +if [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$TRAVIS_BRANCH" = "master" ]; then + pip install ghp_import --install-option="--prefix=$HOME/.local" + $HOME/.local/bin/ghp-import -n target/doc + git push -qf https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages +fi diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/ios/deploy_and_run_on_ios_simulator.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/ios/deploy_and_run_on_ios_simulator.rs new file mode 100644 index 000000000..b14615036 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/ios/deploy_and_run_on_ios_simulator.rs @@ -0,0 +1,171 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// This is a script to deploy and execute a binary on an iOS simulator. +// The primary use of this is to be able to run unit tests on the simulator and +// retrieve the results. +// +// To do this through Cargo instead, use Dinghy +// (https://github.com/snipsco/dinghy): cargo dinghy install, then cargo dinghy +// test. + +use std::env; +use std::fs::{self, File}; +use std::io::Write; +use std::path::Path; +use std::process; +use std::process::Command; + +macro_rules! t { + ($e:expr) => (match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with: {}", stringify!($e), e), + }) +} + +// Step one: Wrap as an app +fn package_as_simulator_app(crate_name: &str, test_binary_path: &Path) { + println!("Packaging simulator app"); + drop(fs::remove_dir_all("ios_simulator_app")); + t!(fs::create_dir("ios_simulator_app")); + t!(fs::copy(test_binary_path, + Path::new("ios_simulator_app").join(crate_name))); + + let mut f = t!(File::create("ios_simulator_app/Info.plist")); + t!(f.write_all(format!(r#" + + + + + CFBundleExecutable + {} + CFBundleIdentifier + com.rust.unittests + + + "#, crate_name).as_bytes())); +} + +// Step two: Start the iOS simulator +fn start_simulator() { + println!("Looking for iOS simulator"); + let output = t!(Command::new("xcrun").arg("simctl").arg("list").output()); + assert!(output.status.success()); + let mut simulator_exists = false; + let mut simulator_booted = false; + let mut found_rust_sim = false; + let stdout = t!(String::from_utf8(output.stdout)); + for line in stdout.lines() { + if line.contains("rust_ios") { + if found_rust_sim { + panic!("Duplicate rust_ios simulators found. Please \ + double-check xcrun simctl list."); + } + simulator_exists = true; + simulator_booted = line.contains("(Booted)"); + found_rust_sim = true; + } + } + + if simulator_exists == false { + println!("Creating iOS simulator"); + Command::new("xcrun") + .arg("simctl") + .arg("create") + .arg("rust_ios") + .arg("com.apple.CoreSimulator.SimDeviceType.iPhone-SE") + .arg("com.apple.CoreSimulator.SimRuntime.iOS-10-2") + .check_status(); + } else if simulator_booted == true { + println!("Shutting down already-booted simulator"); + Command::new("xcrun") + .arg("simctl") + .arg("shutdown") + .arg("rust_ios") + .check_status(); + } + + println!("Starting iOS simulator"); + // We can't uninstall the app (if present) as that will hang if the + // simulator isn't completely booted; just erase the simulator instead. + Command::new("xcrun").arg("simctl").arg("erase").arg("rust_ios").check_status(); + Command::new("xcrun").arg("simctl").arg("boot").arg("rust_ios").check_status(); +} + +// Step three: Install the app +fn install_app_to_simulator() { + println!("Installing app to simulator"); + Command::new("xcrun") + .arg("simctl") + .arg("install") + .arg("booted") + .arg("ios_simulator_app/") + .check_status(); +} + +// Step four: Run the app +fn run_app_on_simulator() { + println!("Running app"); + let output = t!(Command::new("xcrun") + .arg("simctl") + .arg("launch") + .arg("--console") + .arg("booted") + .arg("com.rust.unittests") + .output()); + + println!("stdout --\n{}\n", String::from_utf8_lossy(&output.stdout)); + println!("stderr --\n{}\n", String::from_utf8_lossy(&output.stderr)); + + let stdout = String::from_utf8_lossy(&output.stdout); + let passed = stdout.lines() + .find(|l| l.contains("PASSED")) + .map(|l| l.contains("tests")) + .unwrap_or(false); + + println!("Shutting down simulator"); + Command::new("xcrun") + .arg("simctl") + .arg("shutdown") + .arg("rust_ios") + .check_status(); + if !passed { + panic!("tests didn't pass"); + } +} + +trait CheckStatus { + fn check_status(&mut self); +} + +impl CheckStatus for Command { + fn check_status(&mut self) { + println!("\trunning: {:?}", self); + assert!(t!(self.status()).success()); + } +} + +fn main() { + let args: Vec = env::args().collect(); + if args.len() != 2 { + println!("Usage: {} ", args[0]); + process::exit(-1); + } + + let test_binary_path = Path::new(&args[1]); + let crate_name = test_binary_path.file_name().unwrap(); + + package_as_simulator_app(crate_name.to_str().unwrap(), test_binary_path); + start_simulator(); + install_app_to_simulator(); + run_app_on_simulator(); +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/landing-page-footer.html b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/landing-page-footer.html new file mode 100644 index 000000000..941cc8d2b --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/landing-page-footer.html @@ -0,0 +1,3 @@ +
    + + diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/landing-page-head.html b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/landing-page-head.html new file mode 100644 index 000000000..fc69fa88e --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/landing-page-head.html @@ -0,0 +1,7 @@ + + + + + + +
      diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run-docker.sh b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run-docker.sh new file mode 100644 index 000000000..e963078af --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run-docker.sh @@ -0,0 +1,36 @@ +# Small script to run tests for a target (or all targets) inside all the +# respective docker images. + +set -ex + +run() { + echo $1 + # use -f so we can use ci/ as build context + docker build -t libc -f ci/docker/$1/Dockerfile ci/ + mkdir -p target + if [ -w /dev/kvm ]; then + kvm="--volume /dev/kvm:/dev/kvm" + fi + docker run \ + --user `id -u`:`id -g` \ + --rm \ + --volume $HOME/.cargo:/cargo \ + $kvm \ + --env CARGO_HOME=/cargo \ + --volume `rustc --print sysroot`:/rust:ro \ + --volume `pwd`:/checkout:ro \ + --volume `pwd`/target:/checkout/target \ + --env CARGO_TARGET_DIR=/checkout/target \ + --workdir /checkout \ + --privileged \ + libc \ + ci/run.sh $1 +} + +if [ -z "$1" ]; then + for d in `ls ci/docker/`; do + run $d + done +else + run $1 +fi diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run-qemu.sh b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run-qemu.sh new file mode 100644 index 000000000..b2f457df9 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run-qemu.sh @@ -0,0 +1,32 @@ +# Initial script which is run inside of all qemu images. The first argument to +# this script (as arranged by the qemu image itself) is the path to where the +# libc crate is mounted. +# +# For qemu images we currently need to install Rust manually as this wasn't done +# by the initial run-travis.sh script +# +# FIXME: feels like run-travis.sh should be responsible for downloading the +# compiler. + +set -ex + +ROOT=$1 +cp -r $ROOT/libc /tmp/libc +cd /tmp/libc + +TARGET=$(cat $ROOT/TARGET) +export CARGO_TARGET_DIR=/tmp + +case $TARGET in + *-openbsd) + pkg_add cargo gcc%4.9 rust + export CC=egcc + ;; + + *) + echo "Unknown target: $TARGET" + exit 1 + ;; +esac + +exec sh ci/run.sh $TARGET diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run.sh b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run.sh new file mode 100644 index 000000000..4b8825f8d --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/run.sh @@ -0,0 +1,179 @@ +#!/bin/sh + +# Builds and runs tests for a particular target passed as an argument to this +# script. + +set -ex + +TARGET=$1 + +# If we're going to run tests inside of a qemu image, then we don't need any of +# the scripts below. Instead, download the image, prepare a filesystem which has +# the current state of this repository, and then run the image. +# +# It's assume that all images, when run with two disks, will run the `run.sh` +# script from the second which we place inside. +if [ "$QEMU" != "" ]; then + tmpdir=/tmp/qemu-img-creation + mkdir -p $tmpdir + + if [ -z "${QEMU#*.gz}" ]; then + # image is .gz : download and uncompress it + qemufile=$(echo ${QEMU%.gz} | sed 's/\//__/g') + if [ ! -f $tmpdir/$qemufile ]; then + curl https://s3.amazonaws.com/rust-lang-ci/libc/$QEMU | \ + gunzip -d > $tmpdir/$qemufile + fi + else + # plain qcow2 image: just download it + qemufile=$(echo ${QEMU} | sed 's/\//__/g') + if [ ! -f $tmpdir/$qemufile ]; then + curl https://s3.amazonaws.com/rust-lang-ci/libc/$QEMU \ + > $tmpdir/$qemufile + fi + fi + + # Create a mount a fresh new filesystem image that we'll later pass to QEMU. + # This will have a `run.sh` script will which use the artifacts inside to run + # on the host. + rm -f $tmpdir/libc-test.img + mkdir $tmpdir/mount + + # If we have a cross compiler, then we just do the standard rigamarole of + # cross-compiling an executable and then the script to run just executes the + # binary. + # + # If we don't have a cross-compiler, however, then we need to do some crazy + # acrobatics to get this to work. Generate all.{c,rs} on the host which will + # be compiled inside QEMU. Do this here because compiling syntex_syntax in + # QEMU would time out basically everywhere. + if [ "$CAN_CROSS" = "1" ]; then + cargo build --manifest-path libc-test/Cargo.toml --target $TARGET + cp $CARGO_TARGET_DIR/$TARGET/debug/libc-test $tmpdir/mount/ + echo 'exec $1/libc-test' > $tmpdir/mount/run.sh + else + rm -rf $tmpdir/generated + mkdir -p $tmpdir/generated + cargo build --manifest-path libc-test/generate-files/Cargo.toml + (cd libc-test && TARGET=$TARGET OUT_DIR=$tmpdir/generated SKIP_COMPILE=1 \ + $CARGO_TARGET_DIR/debug/generate-files) + + # Copy this folder into the mounted image, the `run.sh` entry point, and + # overwrite the standard libc-test Cargo.toml with the overlay one which will + # assume the all.{c,rs} test files have already been generated + mkdir $tmpdir/mount/libc + cp -r Cargo.* libc-test src ci $tmpdir/mount/libc/ + ln -s libc-test/target $tmpdir/mount/libc/target + cp ci/run-qemu.sh $tmpdir/mount/run.sh + echo $TARGET | tee -a $tmpdir/mount/TARGET + cp $tmpdir/generated/* $tmpdir/mount/libc/libc-test + cp libc-test/run-generated-Cargo.toml $tmpdir/mount/libc/libc-test/Cargo.toml + fi + + du -sh $tmpdir/mount + genext2fs \ + --root $tmpdir/mount \ + --size-in-blocks 100000 \ + $tmpdir/libc-test.img + + # Pass -snapshot to prevent tampering with the disk images, this helps when + # running this script in development. The two drives are then passed next, + # first is the OS and second is the one we just made. Next the network is + # configured to work (I'm not entirely sure how), and then finally we turn off + # graphics and redirect the serial console output to out.log. + qemu-system-x86_64 \ + -m 1024 \ + -snapshot \ + -drive if=virtio,file=$tmpdir/$qemufile \ + -drive if=virtio,file=$tmpdir/libc-test.img \ + -net nic,model=virtio \ + -net user \ + -nographic \ + -vga none 2>&1 | tee $CARGO_TARGET_DIR/out.log + exec grep "^PASSED .* tests" $CARGO_TARGET_DIR/out.log +fi + +case "$TARGET" in + *-apple-ios) + cargo rustc --manifest-path libc-test/Cargo.toml --target $TARGET -- \ + -C link-args=-mios-simulator-version-min=7.0 + ;; + + *) + cargo build --manifest-path libc-test/Cargo.toml --target $TARGET + ;; +esac + +case "$TARGET" in + arm-linux-androideabi | aarch64-linux-android | i686-linux-android | x86_64-linux-android) + # set SHELL so android can detect a 64bits system, see + # http://stackoverflow.com/a/41789144 + # https://issues.jenkins-ci.org/browse/JENKINS-26930?focusedCommentId=230791&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-230791 + export SHELL=/bin/dash + arch=$(echo $TARGET | cut -d- -f1) + accel="-no-accel" + if emulator -accel-check; then + accel="" + fi + emulator @$arch -no-window $accel & + adb wait-for-device + adb push $CARGO_TARGET_DIR/$TARGET/debug/libc-test /data/local/tmp/libc-test + adb shell /data/local/tmp/libc-test 2>&1 | tee /tmp/out + grep "^PASSED .* tests" /tmp/out + ;; + + i386-apple-ios) + rustc -O ./ci/ios/deploy_and_run_on_ios_simulator.rs + ./deploy_and_run_on_ios_simulator $CARGO_TARGET_DIR/$TARGET/debug/libc-test + ;; + + x86_64-apple-ios) + rustc -O ./ci/ios/deploy_and_run_on_ios_simulator.rs + ./deploy_and_run_on_ios_simulator $CARGO_TARGET_DIR/$TARGET/debug/libc-test + ;; + + arm-unknown-linux-gnueabihf) + qemu-arm -L /usr/arm-linux-gnueabihf $CARGO_TARGET_DIR/$TARGET/debug/libc-test + ;; + + mips-unknown-linux-gnu) + qemu-mips -L /usr/mips-linux-gnu $CARGO_TARGET_DIR/$TARGET/debug/libc-test + ;; + + mips64-unknown-linux-gnuabi64) + qemu-mips64 -L /usr/mips64-linux-gnuabi64 $CARGO_TARGET_DIR/$TARGET/debug/libc-test + ;; + + mips-unknown-linux-musl) + qemu-mips -L /toolchain/staging_dir/toolchain-mips_34kc_gcc-5.3.0_musl-1.1.15 \ + $CARGO_TARGET_DIR/$TARGET/debug/libc-test + ;; + + mipsel-unknown-linux-musl) + qemu-mipsel -L /toolchain $CARGO_TARGET_DIR/$TARGET/debug/libc-test + ;; + + powerpc-unknown-linux-gnu) + qemu-ppc -L /usr/powerpc-linux-gnu $CARGO_TARGET_DIR/$TARGET/debug/libc-test + ;; + + powerpc64-unknown-linux-gnu) + qemu-ppc64 -L /usr/powerpc64-linux-gnu $CARGO_TARGET_DIR/$TARGET/debug/libc-test + ;; + + aarch64-unknown-linux-gnu) + qemu-aarch64 -L /usr/aarch64-linux-gnu/ $CARGO_TARGET_DIR/$TARGET/debug/libc-test + ;; + + *-rumprun-netbsd) + rumprun-bake hw_virtio /tmp/libc-test.img $CARGO_TARGET_DIR/$TARGET/debug/libc-test + qemu-system-x86_64 -nographic -vga none -m 64 \ + -kernel /tmp/libc-test.img 2>&1 | tee /tmp/out & + sleep 5 + grep "^PASSED .* tests" /tmp/out + ;; + + *) + $CARGO_TARGET_DIR/$TARGET/debug/libc-test + ;; +esac diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/style.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/style.rs new file mode 100644 index 000000000..32e4ba772 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/ci/style.rs @@ -0,0 +1,204 @@ +//! Simple script to verify the coding style of this library +//! +//! ## How to run +//! +//! The first argument to this script is the directory to run on, so running +//! this script should be as simple as: +//! +//! ```notrust +//! rustc ci/style.rs +//! ./style src +//! ``` +//! +//! ## Guidelines +//! +//! The current style is: +//! +//! * No trailing whitespace +//! * No tabs +//! * 80-character lines +//! * `extern` instead of `extern "C"` +//! * Specific module layout: +//! 1. use directives +//! 2. typedefs +//! 3. structs +//! 4. constants +//! 5. f! { ... } functions +//! 6. extern functions +//! 7. modules + pub use +//! +//! Things not verified: +//! +//! * alignment +//! * 4-space tabs +//! * leading colons on paths + +use std::env; +use std::fs; +use std::io::prelude::*; +use std::path::Path; + +macro_rules! t { + ($e:expr) => (match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + }) +} + +fn main() { + let arg = env::args().skip(1).next().unwrap_or(".".to_string()); + + let mut errors = Errors { errs: false }; + walk(Path::new(&arg), &mut errors); + + if errors.errs { + panic!("found some lint errors"); + } else { + println!("good style!"); + } +} + +fn walk(path: &Path, err: &mut Errors) { + for entry in t!(path.read_dir()).map(|e| t!(e)) { + let path = entry.path(); + if t!(entry.file_type()).is_dir() { + walk(&path, err); + continue + } + + let name = entry.file_name().into_string().unwrap(); + match &name[..] { + n if !n.ends_with(".rs") => continue, + + "dox.rs" | + "lib.rs" | + "macros.rs" => continue, + + _ => {} + } + + let mut contents = String::new(); + t!(t!(fs::File::open(&path)).read_to_string(&mut contents)); + + check_style(&contents, &path, err); + } +} + +struct Errors { + errs: bool, +} + +#[derive(Clone, Copy, PartialEq)] +enum State { + Start, + Imports, + Typedefs, + Structs, + Constants, + FunctionDefinitions, + Functions, + Modules, +} + +fn check_style(file: &str, path: &Path, err: &mut Errors) { + let mut state = State::Start; + let mut s_macros = 0; + let mut f_macros = 0; + let mut prev_blank = false; + + for (i, line) in file.lines().enumerate() { + if line == "" { + if prev_blank { + err.error(path, i, "double blank line"); + } + prev_blank = true; + } else { + prev_blank = false; + } + if line != line.trim_right() { + err.error(path, i, "trailing whitespace"); + } + if line.contains("\t") { + err.error(path, i, "tab character"); + } + if line.len() > 80 { + err.error(path, i, "line longer than 80 chars"); + } + if line.contains("extern \"C\"") { + err.error(path, i, "use `extern` instead of `extern \"C\""); + } + if line.contains("#[cfg(") && !line.contains(" if ") { + if state != State::Structs { + err.error(path, i, "use cfg_if! and submodules \ + instead of #[cfg]"); + } + } + + let line = line.trim_left(); + let is_pub = line.starts_with("pub "); + let line = if is_pub {&line[4..]} else {line}; + + let line_state = if line.starts_with("use ") { + if is_pub { + State::Modules + } else { + State::Imports + } + } else if line.starts_with("const ") { + State::Constants + } else if line.starts_with("type ") { + State::Typedefs + } else if line.starts_with("s! {") { + s_macros += 1; + State::Structs + } else if line.starts_with("f! {") { + f_macros += 1; + State::FunctionDefinitions + } else if line.starts_with("extern ") { + State::Functions + } else if line.starts_with("mod ") { + State::Modules + } else { + continue + }; + + if state as usize > line_state as usize { + err.error(path, i, &format!("{} found after {} when \ + it belongs before", + line_state.desc(), state.desc())); + } + + if f_macros == 2 { + f_macros += 1; + err.error(path, i, "multiple f! macros in one module"); + } + if s_macros == 2 { + s_macros += 1; + err.error(path, i, "multiple s! macros in one module"); + } + + state = line_state; + } +} + +impl State { + fn desc(&self) -> &str { + match *self { + State::Start => "start", + State::Imports => "import", + State::Typedefs => "typedef", + State::Structs => "struct", + State::Constants => "constant", + State::FunctionDefinitions => "function definition", + State::Functions => "extern function", + State::Modules => "module", + } + } +} + +impl Errors { + fn error(&mut self, path: &Path, line: usize, msg: &str) { + self.errs = true; + println!("{}:{} - {}", path.display(), line + 1, msg); + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/dox.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/dox.rs new file mode 100644 index 000000000..fbec3f2d4 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/dox.rs @@ -0,0 +1,172 @@ +pub use self::imp::*; + +#[cfg(not(dox))] +mod imp { + pub use core::option::Option; + pub use core::clone::Clone; + pub use core::marker::Copy; + pub use core::mem; +} + +#[cfg(dox)] +mod imp { + pub enum Option { + Some(T), + None, + } + impl Copy for Option {} + impl Clone for Option { + fn clone(&self) -> Option { loop {} } + } + + pub trait Clone { + fn clone(&self) -> Self; + } + + #[lang = "copy"] + pub trait Copy {} + + #[lang = "sync"] + pub trait Sync {} + impl Sync for T {} + + #[lang = "sized"] + pub trait Sized {} + + macro_rules! each_int { + ($mac:ident) => ( + $mac!(u8); + $mac!(u16); + $mac!(u32); + $mac!(u64); + $mac!(usize); + each_signed_int!($mac); + ) + } + + macro_rules! each_signed_int { + ($mac:ident) => ( + $mac!(i8); + $mac!(i16); + $mac!(i32); + $mac!(i64); + $mac!(isize); + ) + } + + #[lang = "div"] + pub trait Div { + type Output; + fn div(self, rhs: RHS) -> Self::Output; + } + + macro_rules! impl_div { + ($($i:ident)*) => ($( + impl Div<$i> for $i { + type Output = $i; + fn div(self, rhs: $i) -> $i { self / rhs } + } + )*) + } + each_int!(impl_div); + + #[lang = "shl"] + pub trait Shl { + type Output; + fn shl(self, rhs: RHS) -> Self::Output; + } + + macro_rules! impl_shl { + ($($i:ident)*) => ($( + impl Shl<$i> for $i { + type Output = $i; + fn shl(self, rhs: $i) -> $i { self << rhs } + } + )*) + } + each_int!(impl_shl); + + #[lang = "mul"] + pub trait Mul { + type Output; + fn mul(self, rhs: RHS) -> Self::Output; + } + + macro_rules! impl_mul { + ($($i:ident)*) => ($( + impl Mul for $i { + type Output = $i; + fn mul(self, rhs: $i) -> $i { self * rhs } + } + )*) + } + each_int!(impl_mul); + + #[lang = "sub"] + pub trait Sub { + type Output; + fn sub(self, rhs: RHS) -> Self::Output; + } + + macro_rules! impl_sub { + ($($i:ident)*) => ($( + impl Sub for $i { + type Output = $i; + fn sub(self, rhs: $i) -> $i { self - rhs } + } + )*) + } + each_int!(impl_sub); + + #[lang = "bitor"] + pub trait Bitor { + type Output; + fn bitor(self, rhs: RHS) -> Self::Output; + } + + macro_rules! impl_bitor { + ($($i:ident)*) => ($( + impl Bitor for $i { + type Output = $i; + fn bitor(self, rhs: $i) -> $i { self | rhs } + } + )*) + } + each_int!(impl_bitor); + + #[lang = "neg"] + pub trait Neg { + type Output; + fn neg(self) -> Self::Output; + } + + macro_rules! impl_neg { + ($($i:ident)*) => ($( + impl Neg for $i { + type Output = $i; + fn neg(self) -> $i { -self } + } + )*) + } + each_signed_int!(impl_neg); + + #[lang = "not"] + pub trait Not { + type Output; + fn not(self) -> Self::Output; + } + + macro_rules! impl_not { + ($($i:ident)*) => ($( + impl Not for $i { + type Output = $i; + fn not(self) -> $i { !self } + } + )*) + } + each_int!(impl_not); + + pub mod mem { + pub fn size_of_val(_: &T) -> usize { 4 } + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/lib.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/lib.rs new file mode 100644 index 000000000..c17a50478 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/lib.rs @@ -0,0 +1,279 @@ +// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Crate docs + +#![allow(bad_style, overflowing_literals, improper_ctypes)] +#![crate_type = "rlib"] +#![crate_name = "libc"] +#![cfg_attr(dox, feature(no_core, lang_items))] +#![cfg_attr(dox, no_core)] +#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png", + html_favicon_url = "https://doc.rust-lang.org/favicon.ico")] + +#![cfg_attr(all(target_os = "linux", target_arch = "x86_64"), doc( + html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-linux-gnu" +))] +#![cfg_attr(all(target_os = "linux", target_arch = "x86"), doc( + html_root_url = "https://doc.rust-lang.org/libc/i686-unknown-linux-gnu" +))] +#![cfg_attr(all(target_os = "linux", target_arch = "arm"), doc( + html_root_url = "https://doc.rust-lang.org/libc/arm-unknown-linux-gnueabihf" +))] +#![cfg_attr(all(target_os = "linux", target_arch = "mips"), doc( + html_root_url = "https://doc.rust-lang.org/libc/mips-unknown-linux-gnu" +))] +#![cfg_attr(all(target_os = "linux", target_arch = "aarch64"), doc( + html_root_url = "https://doc.rust-lang.org/libc/aarch64-unknown-linux-gnu" +))] +#![cfg_attr(all(target_os = "linux", target_env = "musl"), doc( + html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-linux-musl" +))] +#![cfg_attr(all(target_os = "macos", target_arch = "x86_64"), doc( + html_root_url = "https://doc.rust-lang.org/libc/x86_64-apple-darwin" +))] +#![cfg_attr(all(target_os = "macos", target_arch = "x86"), doc( + html_root_url = "https://doc.rust-lang.org/libc/i686-apple-darwin" +))] +#![cfg_attr(all(windows, target_arch = "x86_64", target_env = "gnu"), doc( + html_root_url = "https://doc.rust-lang.org/libc/x86_64-pc-windows-gnu" +))] +#![cfg_attr(all(windows, target_arch = "x86", target_env = "gnu"), doc( + html_root_url = "https://doc.rust-lang.org/libc/i686-pc-windows-gnu" +))] +#![cfg_attr(all(windows, target_arch = "x86_64", target_env = "msvc"), doc( + html_root_url = "https://doc.rust-lang.org/libc/x86_64-pc-windows-msvc" +))] +#![cfg_attr(all(windows, target_arch = "x86", target_env = "msvc"), doc( + html_root_url = "https://doc.rust-lang.org/libc/i686-pc-windows-msvc" +))] +#![cfg_attr(target_os = "android", doc( + html_root_url = "https://doc.rust-lang.org/libc/arm-linux-androideabi" +))] +#![cfg_attr(target_os = "freebsd", doc( + html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-freebsd" +))] +#![cfg_attr(target_os = "openbsd", doc( + html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-openbsd" +))] +#![cfg_attr(target_os = "bitrig", doc( + html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-bitrig" +))] +#![cfg_attr(target_os = "netbsd", doc( + html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-netbsd" +))] +#![cfg_attr(target_os = "dragonfly", doc( + html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-dragonfly" +))] + +// Attributes needed when building as part of the standard library +#![cfg_attr(stdbuild, feature(no_std, core, core_slice_ext, staged_api, custom_attribute, cfg_target_vendor))] +#![cfg_attr(stdbuild, feature(link_cfg))] +#![cfg_attr(stdbuild, no_std)] +#![cfg_attr(stdbuild, staged_api)] +#![cfg_attr(stdbuild, allow(warnings))] +#![cfg_attr(stdbuild, unstable(feature = "libc", + reason = "use `libc` from crates.io", + issue = "27783"))] + +#![cfg_attr(not(feature = "use_std"), no_std)] + +#[cfg(all(not(stdbuild), not(dox), feature = "use_std"))] +extern crate std as core; + +#[macro_use] mod macros; +mod dox; + +// Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help enable +// more optimization opportunities around it recognizing things like +// malloc/free. +#[repr(u8)] +pub enum c_void { + // Two dummy variants so the #[repr] attribute can be used. + #[doc(hidden)] + __variant1, + #[doc(hidden)] + __variant2, +} + +pub type int8_t = i8; +pub type int16_t = i16; +pub type int32_t = i32; +pub type int64_t = i64; +pub type uint8_t = u8; +pub type uint16_t = u16; +pub type uint32_t = u32; +pub type uint64_t = u64; + +pub type c_schar = i8; +pub type c_uchar = u8; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_float = f32; +pub type c_double = f64; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; + +pub type size_t = usize; +pub type ptrdiff_t = isize; +pub type intptr_t = isize; +pub type uintptr_t = usize; +pub type ssize_t = isize; + +pub enum FILE {} +pub enum fpos_t {} // TODO: fill this out with a struct + +extern { + pub fn isalnum(c: c_int) -> c_int; + pub fn isalpha(c: c_int) -> c_int; + pub fn iscntrl(c: c_int) -> c_int; + pub fn isdigit(c: c_int) -> c_int; + pub fn isgraph(c: c_int) -> c_int; + pub fn islower(c: c_int) -> c_int; + pub fn isprint(c: c_int) -> c_int; + pub fn ispunct(c: c_int) -> c_int; + pub fn isspace(c: c_int) -> c_int; + pub fn isupper(c: c_int) -> c_int; + pub fn isxdigit(c: c_int) -> c_int; + pub fn tolower(c: c_int) -> c_int; + pub fn toupper(c: c_int) -> c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "fopen$UNIX2003")] + pub fn fopen(filename: *const c_char, + mode: *const c_char) -> *mut FILE; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "freopen$UNIX2003")] + pub fn freopen(filename: *const c_char, mode: *const c_char, + file: *mut FILE) -> *mut FILE; + pub fn fflush(file: *mut FILE) -> c_int; + pub fn fclose(file: *mut FILE) -> c_int; + pub fn remove(filename: *const c_char) -> c_int; + pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int; + pub fn tmpfile() -> *mut FILE; + pub fn setvbuf(stream: *mut FILE, + buffer: *mut c_char, + mode: c_int, + size: size_t) -> c_int; + pub fn setbuf(stream: *mut FILE, buf: *mut c_char); + pub fn getchar() -> c_int; + pub fn putchar(c: c_int) -> c_int; + pub fn fgetc(stream: *mut FILE) -> c_int; + pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char; + pub fn fputc(c: c_int, stream: *mut FILE) -> c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "fputs$UNIX2003")] + pub fn fputs(s: *const c_char, stream: *mut FILE)-> c_int; + pub fn puts(s: *const c_char) -> c_int; + pub fn ungetc(c: c_int, stream: *mut FILE) -> c_int; + pub fn fread(ptr: *mut c_void, + size: size_t, + nobj: size_t, + stream: *mut FILE) + -> size_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "fwrite$UNIX2003")] + pub fn fwrite(ptr: *const c_void, + size: size_t, + nobj: size_t, + stream: *mut FILE) + -> size_t; + pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int; + pub fn ftell(stream: *mut FILE) -> c_long; + pub fn rewind(stream: *mut FILE); + #[cfg_attr(target_os = "netbsd", link_name = "__fgetpos50")] + pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__fsetpos50")] + pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int; + pub fn feof(stream: *mut FILE) -> c_int; + pub fn ferror(stream: *mut FILE) -> c_int; + pub fn perror(s: *const c_char); + pub fn atoi(s: *const c_char) -> c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "strtod$UNIX2003")] + pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double; + pub fn strtol(s: *const c_char, + endp: *mut *mut c_char, base: c_int) -> c_long; + pub fn strtoul(s: *const c_char, endp: *mut *mut c_char, + base: c_int) -> c_ulong; + pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void; + pub fn malloc(size: size_t) -> *mut c_void; + pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void; + pub fn free(p: *mut c_void); + pub fn abort() -> !; + pub fn exit(status: c_int) -> !; + pub fn _exit(status: c_int) -> !; + pub fn atexit(cb: extern fn()) -> c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "system$UNIX2003")] + pub fn system(s: *const c_char) -> c_int; + pub fn getenv(s: *const c_char) -> *mut c_char; + + pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char; + pub fn strncpy(dst: *mut c_char, src: *const c_char, n: size_t) + -> *mut c_char; + pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char; + pub fn strncat(s: *mut c_char, ct: *const c_char, n: size_t) -> *mut c_char; + pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int; + pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strdup(cs: *const c_char) -> *mut c_char; + pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strlen(cs: *const c_char) -> size_t; + pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "strerror$UNIX2003")] + pub fn strerror(n: c_int) -> *mut c_char; + pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char; + pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t; + pub fn wcslen(buf: *const wchar_t) -> size_t; + pub fn wcstombs(dest: *mut c_char, src: *const wchar_t, n: size_t) -> ::size_t; + + pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; + pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int; + pub fn memcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memmove(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void; +} + +// These are all inline functions on android, so they end up just being entirely +// missing on that platform. +#[cfg(not(target_os = "android"))] +extern { + pub fn abs(i: c_int) -> c_int; + pub fn atof(s: *const c_char) -> c_double; + pub fn labs(i: c_long) -> c_long; + pub fn rand() -> c_int; + pub fn srand(seed: c_uint); +} + +cfg_if! { + if #[cfg(windows)] { + mod windows; + pub use windows::*; + } else if #[cfg(target_os = "redox")] { + mod redox; + pub use redox::*; + } else if #[cfg(unix)] { + mod unix; + pub use unix::*; + } else { + // Unknown target_family + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/macros.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/macros.rs new file mode 100644 index 000000000..5811c84c3 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/macros.rs @@ -0,0 +1,108 @@ +/// A macro for defining #[cfg] if-else statements. +/// +/// This is similar to the `if/elif` C preprocessor macro by allowing definition +/// of a cascade of `#[cfg]` cases, emitting the implementation which matches +/// first. +/// +/// This allows you to conveniently provide a long list #[cfg]'d blocks of code +/// without having to rewrite each clause multiple times. +macro_rules! cfg_if { + ($( + if #[cfg($($meta:meta),*)] { $($it:item)* } + ) else * else { + $($it2:item)* + }) => { + __cfg_if_items! { + () ; + $( ( ($($meta),*) ($($it)*) ), )* + ( () ($($it2)*) ), + } + } +} + +macro_rules! __cfg_if_items { + (($($not:meta,)*) ; ) => {}; + (($($not:meta,)*) ; ( ($($m:meta),*) ($($it:item)*) ), $($rest:tt)*) => { + __cfg_if_apply! { cfg(all(not(any($($not),*)), $($m,)*)), $($it)* } + __cfg_if_items! { ($($not,)* $($m,)*) ; $($rest)* } + } +} + +macro_rules! __cfg_if_apply { + ($m:meta, $($it:item)*) => { + $(#[$m] $it)* + } +} + +macro_rules! s { + ($($(#[$attr:meta])* pub struct $i:ident { $($field:tt)* })*) => ($( + __item! { + #[repr(C)] + $(#[$attr])* + pub struct $i { $($field)* } + } + impl ::dox::Copy for $i {} + impl ::dox::Clone for $i { + fn clone(&self) -> $i { *self } + } + )*) +} + +macro_rules! f { + ($(pub fn $i:ident($($arg:ident: $argty:ty),*) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + #[cfg(not(dox))] + pub unsafe extern fn $i($($arg: $argty),*) -> $ret { + $($body);* + } + + #[cfg(dox)] + #[allow(dead_code)] + pub unsafe extern fn $i($($arg: $argty),*) -> $ret { + loop {} + } + )*) +} + +macro_rules! __item { + ($i:item) => ($i) +} + +#[cfg(test)] +mod tests { + cfg_if! { + if #[cfg(test)] { + use std::option::Option as Option2; + fn works1() -> Option2 { Some(1) } + } else { + fn works1() -> Option { None } + } + } + + cfg_if! { + if #[cfg(foo)] { + fn works2() -> bool { false } + } else if #[cfg(test)] { + fn works2() -> bool { true } + } else { + fn works2() -> bool { false } + } + } + + cfg_if! { + if #[cfg(foo)] { + fn works3() -> bool { false } + } else { + fn works3() -> bool { true } + } + } + + #[test] + fn it_works() { + assert!(works1().is_some()); + assert!(works2()); + assert!(works3()); + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/redox.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/redox.rs new file mode 100644 index 000000000..3f2ed9c1a --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/redox.rs @@ -0,0 +1,57 @@ +pub type c_char = i8; +pub type c_long = i64; +pub type c_ulong = u64; + +pub type wchar_t = i16; + +pub type off_t = usize; +pub type mode_t = u16; +pub type time_t = i64; +pub type pid_t = usize; +pub type gid_t = usize; +pub type uid_t = usize; + +pub type in_addr_t = u32; +pub type in_port_t = u16; + +pub type socklen_t = u32; +pub type sa_family_t = u16; + +s! { + pub struct in_addr { + pub s_addr: in_addr_t, + } + + pub struct in6_addr { + pub s6_addr: [u8; 16], + __align: [u32; 0], + } + + pub struct sockaddr { + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in { + pub sin_family: sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [u8; 8], + } + + pub struct sockaddr_in6 { + pub sin6_family: sa_family_t, + pub sin6_port: in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } +} + +extern { + pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; +} + +#[link(name = "c")] +#[link(name = "m")] +extern {} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b32.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b32.rs new file mode 100644 index 000000000..8ca025449 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b32.rs @@ -0,0 +1,19 @@ +//! 32-bit specific Apple (ios/darwin) definitions + +pub type c_long = i32; +pub type c_ulong = u32; + +s! { + pub struct pthread_attr_t { + __sig: c_long, + __opaque: [::c_char; 36] + } +} + +pub const __PTHREAD_MUTEX_SIZE__: usize = 40; +pub const __PTHREAD_COND_SIZE__: usize = 24; +pub const __PTHREAD_CONDATTR_SIZE__: usize = 4; +pub const __PTHREAD_RWLOCK_SIZE__: usize = 124; + +pub const TIOCTIMESTAMP: ::c_ulong = 0x40087459; +pub const TIOCDCDTIMESTAMP: ::c_ulong = 0x40087458; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b64.rs new file mode 100644 index 000000000..3f8323080 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b64.rs @@ -0,0 +1,21 @@ +//! 64-bit specific Apple (ios/darwin) definitions + +pub type c_long = i64; +pub type c_ulong = u64; + +s! { + pub struct pthread_attr_t { + __sig: c_long, + __opaque: [::c_char; 56] + } +} + +pub const __PTHREAD_MUTEX_SIZE__: usize = 56; +pub const __PTHREAD_COND_SIZE__: usize = 40; +pub const __PTHREAD_CONDATTR_SIZE__: usize = 8; +pub const __PTHREAD_RWLOCK_SIZE__: usize = 192; + +pub const TIOCTIMESTAMP: ::c_ulong = 0x40107459; +pub const TIOCDCDTIMESTAMP: ::c_ulong = 0x40107458; + +pub const FIONREAD: ::c_ulong = 0x4004667f; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/mod.rs new file mode 100644 index 000000000..6652bb8c0 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/mod.rs @@ -0,0 +1,1687 @@ +//! Apple (ios/darwin)-specific definitions +//! +//! This covers *-apple-* triples currently + +pub type clock_t = c_ulong; +pub type time_t = c_long; +pub type suseconds_t = i32; +pub type dev_t = i32; +pub type ino_t = u64; +pub type mode_t = u16; +pub type nlink_t = u16; +pub type blksize_t = i32; +pub type rlim_t = u64; +pub type mach_timebase_info_data_t = mach_timebase_info; +pub type pthread_key_t = c_ulong; +pub type sigset_t = u32; +pub type fsblkcnt_t = ::c_uint; +pub type fsfilcnt_t = ::c_uint; +pub type speed_t = ::c_ulong; +pub type tcflag_t = ::c_ulong; +pub type nl_item = ::c_int; +pub type id_t = ::c_uint; +pub type sem_t = ::c_int; +pub type idtype_t = ::c_uint; + +pub enum timezone {} + +s! { + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_offset: ::off_t, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_reqprio: ::c_int, + pub aio_sigevent: sigevent, + pub aio_lio_opcode: ::c_int + } + + pub struct utmpx { + pub ut_user: [::c_char; _UTX_USERSIZE], + pub ut_id: [::c_char; _UTX_IDSIZE], + pub ut_line: [::c_char; _UTX_LINESIZE], + pub ut_pid: ::pid_t, + pub ut_type: ::c_short, + pub ut_tv: ::timeval, + pub ut_host: [::c_char; _UTX_HOSTSIZE], + ut_pad: [::uint32_t; 16], + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + __unused1: ::c_int, + pub gl_offs: ::size_t, + __unused2: ::c_int, + pub gl_pathv: *mut *mut ::c_char, + + __unused3: *mut ::c_void, + + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + __unused8: *mut ::c_void, + } + + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: ::sa_family_t, + __ss_pad1: [u8; 6], + __ss_align: i64, + __ss_pad2: [u8; 112], + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: ::socklen_t, + pub ai_canonname: *mut ::c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut addrinfo, + } + + pub struct mach_timebase_info { + pub numer: u32, + pub denom: u32, + } + + pub struct stat { + pub st_dev: dev_t, + pub st_mode: mode_t, + pub st_nlink: nlink_t, + pub st_ino: ino_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: dev_t, + pub st_atime: time_t, + pub st_atime_nsec: c_long, + pub st_mtime: time_t, + pub st_mtime_nsec: c_long, + pub st_ctime: time_t, + pub st_ctime_nsec: c_long, + pub st_birthtime: time_t, + pub st_birthtime_nsec: c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: blksize_t, + pub st_flags: ::uint32_t, + pub st_gen: ::uint32_t, + pub st_lspare: ::int32_t, + pub st_qspare: [::int64_t; 2], + } + + pub struct dirent { + pub d_ino: u64, + pub d_seekoff: u64, + pub d_reclen: u16, + pub d_namlen: u16, + pub d_type: u8, + pub d_name: [::c_char; 1024], + } + + pub struct pthread_mutex_t { + __sig: ::c_long, + __opaque: [u8; __PTHREAD_MUTEX_SIZE__], + } + + pub struct pthread_mutexattr_t { + __sig: ::c_long, + __opaque: [u8; 8], + } + + pub struct pthread_cond_t { + __sig: ::c_long, + __opaque: [u8; __PTHREAD_COND_SIZE__], + } + + pub struct pthread_condattr_t { + __sig: ::c_long, + __opaque: [u8; __PTHREAD_CONDATTR_SIZE__], + } + + pub struct pthread_rwlock_t { + __sig: ::c_long, + __opaque: [u8; __PTHREAD_RWLOCK_SIZE__], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub si_pid: ::pid_t, + pub si_uid: ::uid_t, + pub si_status: ::c_int, + pub si_addr: *mut ::c_void, + _pad: [usize; 9], + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: sigset_t, + pub sa_flags: ::c_int, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct fstore_t { + pub fst_flags: ::c_uint, + pub fst_posmode: ::c_int, + pub fst_offset: ::off_t, + pub fst_length: ::off_t, + pub fst_bytesalloc: ::off_t, + } + + pub struct radvisory { + pub ra_offset: ::off_t, + pub ra_count: ::c_int, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::c_char; 8], + } + + pub struct statfs { + pub f_bsize: ::uint32_t, + pub f_iosize: ::int32_t, + pub f_blocks: ::uint64_t, + pub f_bfree: ::uint64_t, + pub f_bavail: ::uint64_t, + pub f_files: ::uint64_t, + pub f_ffree: ::uint64_t, + pub f_fsid: ::fsid_t, + pub f_owner: ::uid_t, + pub f_type: ::uint32_t, + pub f_flags: ::uint32_t, + pub f_fssubtype: ::uint32_t, + pub f_fstypename: [::c_char; 16], + pub f_mntonname: [::c_char; 1024], + pub f_mntfromname: [::c_char; 1024], + pub f_reserved: [::uint32_t; 8], + } + + // FIXME: this should have align 4 but it's got align 8 on 64-bit + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: ::int16_t, + pub flags: ::uint16_t, + pub fflags: ::uint32_t, + pub data: ::intptr_t, + pub udata: *mut ::c_void, + } + + pub struct kevent64_s { + pub ident: ::uint64_t, + pub filter: ::int16_t, + pub flags: ::uint16_t, + pub fflags: ::uint32_t, + pub data: ::int64_t, + pub udata: ::uint64_t, + pub ext: [::uint64_t; 2], + } + + pub struct dqblk { + pub dqb_bhardlimit: ::uint64_t, + pub dqb_bsoftlimit: ::uint64_t, + pub dqb_curbytes: ::uint64_t, + pub dqb_ihardlimit: ::uint32_t, + pub dqb_isoftlimit: ::uint32_t, + pub dqb_curinodes: ::uint32_t, + pub dqb_btime: ::uint32_t, + pub dqb_itime: ::uint32_t, + pub dqb_id: ::uint32_t, + pub dqb_spare: [::uint32_t; 4], + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_cc: [::cc_t; ::NCCS], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } + + pub struct flock { + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + pub l_type: ::c_short, + pub l_whence: ::c_short, + } + + pub struct sf_hdtr { + pub headers: *mut ::iovec, + pub hdr_cnt: ::c_int, + pub trailers: *mut ::iovec, + pub trl_cnt: ::c_int, + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct sigevent { + pub sigev_notify: ::c_int, + pub sigev_signo: ::c_int, + pub sigev_value: ::sigval, + __unused1: *mut ::c_void, //actually a function pointer + pub sigev_notify_attributes: *mut ::pthread_attr_t + } +} + +pub const _UTX_USERSIZE: usize = 256; +pub const _UTX_LINESIZE: usize = 32; +pub const _UTX_IDSIZE: usize = 4; +pub const _UTX_HOSTSIZE: usize = 256; + +pub const EMPTY: ::c_short = 0; +pub const RUN_LVL: ::c_short = 1; +pub const BOOT_TIME: ::c_short = 2; +pub const OLD_TIME: ::c_short = 3; +pub const NEW_TIME: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const USER_PROCESS: ::c_short = 7; +pub const DEAD_PROCESS: ::c_short = 8; +pub const ACCOUNTING: ::c_short = 9; +pub const SIGNATURE: ::c_short = 10; +pub const SHUTDOWN_TIME: ::c_short = 11; + +pub const LC_COLLATE_MASK: ::c_int = (1 << 0); +pub const LC_CTYPE_MASK: ::c_int = (1 << 1); +pub const LC_MESSAGES_MASK: ::c_int = (1 << 2); +pub const LC_MONETARY_MASK: ::c_int = (1 << 3); +pub const LC_NUMERIC_MASK: ::c_int = (1 << 4); +pub const LC_TIME_MASK: ::c_int = (1 << 5); +pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK + | LC_CTYPE_MASK + | LC_MESSAGES_MASK + | LC_MONETARY_MASK + | LC_NUMERIC_MASK + | LC_TIME_MASK; + +pub const CODESET: ::nl_item = 0; +pub const D_T_FMT: ::nl_item = 1; +pub const D_FMT: ::nl_item = 2; +pub const T_FMT: ::nl_item = 3; +pub const T_FMT_AMPM: ::nl_item = 4; +pub const AM_STR: ::nl_item = 5; +pub const PM_STR: ::nl_item = 6; + +pub const DAY_1: ::nl_item = 7; +pub const DAY_2: ::nl_item = 8; +pub const DAY_3: ::nl_item = 9; +pub const DAY_4: ::nl_item = 10; +pub const DAY_5: ::nl_item = 11; +pub const DAY_6: ::nl_item = 12; +pub const DAY_7: ::nl_item = 13; + +pub const ABDAY_1: ::nl_item = 14; +pub const ABDAY_2: ::nl_item = 15; +pub const ABDAY_3: ::nl_item = 16; +pub const ABDAY_4: ::nl_item = 17; +pub const ABDAY_5: ::nl_item = 18; +pub const ABDAY_6: ::nl_item = 19; +pub const ABDAY_7: ::nl_item = 20; + +pub const MON_1: ::nl_item = 21; +pub const MON_2: ::nl_item = 22; +pub const MON_3: ::nl_item = 23; +pub const MON_4: ::nl_item = 24; +pub const MON_5: ::nl_item = 25; +pub const MON_6: ::nl_item = 26; +pub const MON_7: ::nl_item = 27; +pub const MON_8: ::nl_item = 28; +pub const MON_9: ::nl_item = 29; +pub const MON_10: ::nl_item = 30; +pub const MON_11: ::nl_item = 31; +pub const MON_12: ::nl_item = 32; + +pub const ABMON_1: ::nl_item = 33; +pub const ABMON_2: ::nl_item = 34; +pub const ABMON_3: ::nl_item = 35; +pub const ABMON_4: ::nl_item = 36; +pub const ABMON_5: ::nl_item = 37; +pub const ABMON_6: ::nl_item = 38; +pub const ABMON_7: ::nl_item = 39; +pub const ABMON_8: ::nl_item = 40; +pub const ABMON_9: ::nl_item = 41; +pub const ABMON_10: ::nl_item = 42; +pub const ABMON_11: ::nl_item = 43; +pub const ABMON_12: ::nl_item = 44; + +pub const ERA: ::nl_item = 45; +pub const ERA_D_FMT: ::nl_item = 46; +pub const ERA_D_T_FMT: ::nl_item = 47; +pub const ERA_T_FMT: ::nl_item = 48; +pub const ALT_DIGITS: ::nl_item = 49; + +pub const RADIXCHAR: ::nl_item = 50; +pub const THOUSEP: ::nl_item = 51; + +pub const YESEXPR: ::nl_item = 52; +pub const NOEXPR: ::nl_item = 53; + +pub const YESSTR: ::nl_item = 54; +pub const NOSTR: ::nl_item = 55; + +pub const CRNCYSTR: ::nl_item = 56; + +pub const D_MD_ORDER: ::nl_item = 57; + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 2147483647; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 2; +pub const _IOLBF: ::c_int = 1; +pub const BUFSIZ: ::c_uint = 1024; +pub const FOPEN_MAX: ::c_uint = 20; +pub const FILENAME_MAX: ::c_uint = 1024; +pub const L_tmpnam: ::c_uint = 1024; +pub const TMP_MAX: ::c_uint = 308915776; +pub const _PC_LINK_MAX: ::c_int = 1; +pub const _PC_MAX_CANON: ::c_int = 2; +pub const _PC_MAX_INPUT: ::c_int = 3; +pub const _PC_NAME_MAX: ::c_int = 4; +pub const _PC_PATH_MAX: ::c_int = 5; +pub const _PC_PIPE_BUF: ::c_int = 6; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 7; +pub const _PC_NO_TRUNC: ::c_int = 8; +pub const _PC_VDISABLE: ::c_int = 9; +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; +pub const O_APPEND: ::c_int = 8; +pub const O_CREAT: ::c_int = 512; +pub const O_EXCL: ::c_int = 2048; +pub const O_NOCTTY: ::c_int = 131072; +pub const O_TRUNC: ::c_int = 1024; +pub const O_CLOEXEC: ::c_int = 0x1000000; +pub const O_DIRECTORY: ::c_int = 0x100000; +pub const S_IFIFO: mode_t = 4096; +pub const S_IFCHR: mode_t = 8192; +pub const S_IFBLK: mode_t = 24576; +pub const S_IFDIR: mode_t = 16384; +pub const S_IFREG: mode_t = 32768; +pub const S_IFLNK: mode_t = 40960; +pub const S_IFSOCK: mode_t = 49152; +pub const S_IFMT: mode_t = 61440; +pub const S_IEXEC: mode_t = 64; +pub const S_IWRITE: mode_t = 128; +pub const S_IREAD: mode_t = 256; +pub const S_IRWXU: mode_t = 448; +pub const S_IXUSR: mode_t = 64; +pub const S_IWUSR: mode_t = 128; +pub const S_IRUSR: mode_t = 256; +pub const S_IRWXG: mode_t = 56; +pub const S_IXGRP: mode_t = 8; +pub const S_IWGRP: mode_t = 16; +pub const S_IRGRP: mode_t = 32; +pub const S_IRWXO: mode_t = 7; +pub const S_IXOTH: mode_t = 1; +pub const S_IWOTH: mode_t = 2; +pub const S_IROTH: mode_t = 4; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; +pub const F_GETLK: ::c_int = 7; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const MAP_FILE: ::c_int = 0x0000; +pub const MAP_SHARED: ::c_int = 0x0001; +pub const MAP_PRIVATE: ::c_int = 0x0002; +pub const MAP_FIXED: ::c_int = 0x0010; +pub const MAP_ANON: ::c_int = 0x1000; + +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const MS_ASYNC: ::c_int = 0x0001; +pub const MS_INVALIDATE: ::c_int = 0x0002; +pub const MS_SYNC: ::c_int = 0x0010; + +pub const MS_KILLPAGES: ::c_int = 0x0004; +pub const MS_DEACTIVATE: ::c_int = 0x0008; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EDEADLK: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EAGAIN: ::c_int = 35; +pub const EWOULDBLOCK: ::c_int = EAGAIN; +pub const EINPROGRESS: ::c_int = 36; +pub const EALREADY: ::c_int = 37; +pub const ENOTSOCK: ::c_int = 38; +pub const EDESTADDRREQ: ::c_int = 39; +pub const EMSGSIZE: ::c_int = 40; +pub const EPROTOTYPE: ::c_int = 41; +pub const ENOPROTOOPT: ::c_int = 42; +pub const EPROTONOSUPPORT: ::c_int = 43; +pub const ESOCKTNOSUPPORT: ::c_int = 44; +pub const ENOTSUP: ::c_int = 45; +pub const EPFNOSUPPORT: ::c_int = 46; +pub const EAFNOSUPPORT: ::c_int = 47; +pub const EADDRINUSE: ::c_int = 48; +pub const EADDRNOTAVAIL: ::c_int = 49; +pub const ENETDOWN: ::c_int = 50; +pub const ENETUNREACH: ::c_int = 51; +pub const ENETRESET: ::c_int = 52; +pub const ECONNABORTED: ::c_int = 53; +pub const ECONNRESET: ::c_int = 54; +pub const ENOBUFS: ::c_int = 55; +pub const EISCONN: ::c_int = 56; +pub const ENOTCONN: ::c_int = 57; +pub const ESHUTDOWN: ::c_int = 58; +pub const ETOOMANYREFS: ::c_int = 59; +pub const ETIMEDOUT: ::c_int = 60; +pub const ECONNREFUSED: ::c_int = 61; +pub const ELOOP: ::c_int = 62; +pub const ENAMETOOLONG: ::c_int = 63; +pub const EHOSTDOWN: ::c_int = 64; +pub const EHOSTUNREACH: ::c_int = 65; +pub const ENOTEMPTY: ::c_int = 66; +pub const EPROCLIM: ::c_int = 67; +pub const EUSERS: ::c_int = 68; +pub const EDQUOT: ::c_int = 69; +pub const ESTALE: ::c_int = 70; +pub const EREMOTE: ::c_int = 71; +pub const EBADRPC: ::c_int = 72; +pub const ERPCMISMATCH: ::c_int = 73; +pub const EPROGUNAVAIL: ::c_int = 74; +pub const EPROGMISMATCH: ::c_int = 75; +pub const EPROCUNAVAIL: ::c_int = 76; +pub const ENOLCK: ::c_int = 77; +pub const ENOSYS: ::c_int = 78; +pub const EFTYPE: ::c_int = 79; +pub const EAUTH: ::c_int = 80; +pub const ENEEDAUTH: ::c_int = 81; +pub const EPWROFF: ::c_int = 82; +pub const EDEVERR: ::c_int = 83; +pub const EOVERFLOW: ::c_int = 84; +pub const EBADEXEC: ::c_int = 85; +pub const EBADARCH: ::c_int = 86; +pub const ESHLIBVERS: ::c_int = 87; +pub const EBADMACHO: ::c_int = 88; +pub const ECANCELED: ::c_int = 89; +pub const EIDRM: ::c_int = 90; +pub const ENOMSG: ::c_int = 91; +pub const EILSEQ: ::c_int = 92; +pub const ENOATTR: ::c_int = 93; +pub const EBADMSG: ::c_int = 94; +pub const EMULTIHOP: ::c_int = 95; +pub const ENODATA: ::c_int = 96; +pub const ENOLINK: ::c_int = 97; +pub const ENOSR: ::c_int = 98; +pub const ENOSTR: ::c_int = 99; +pub const EPROTO: ::c_int = 100; +pub const ETIME: ::c_int = 101; +pub const EOPNOTSUPP: ::c_int = 102; +pub const ENOPOLICY: ::c_int = 103; +pub const ENOTRECOVERABLE: ::c_int = 104; +pub const EOWNERDEAD: ::c_int = 105; +pub const EQFULL: ::c_int = 106; +pub const ELAST: ::c_int = 106; + +pub const EAI_SYSTEM: ::c_int = 11; + +pub const F_DUPFD: ::c_int = 0; +pub const F_DUPFD_CLOEXEC: ::c_int = 67; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; +pub const F_PREALLOCATE: ::c_int = 42; +pub const F_RDADVISE: ::c_int = 44; +pub const F_RDAHEAD: ::c_int = 45; +pub const F_NOCACHE: ::c_int = 48; +pub const F_GETPATH: ::c_int = 50; +pub const F_FULLFSYNC: ::c_int = 51; +pub const F_FREEZE_FS: ::c_int = 53; +pub const F_THAW_FS: ::c_int = 54; +pub const F_GLOBAL_NOCACHE: ::c_int = 55; +pub const F_NODIRECT: ::c_int = 62; + +pub const F_ALLOCATECONTIG: ::c_uint = 0x02; +pub const F_ALLOCATEALL: ::c_uint = 0x04; + +pub const F_PEOFPOSMODE: ::c_int = 3; +pub const F_VOLPOSMODE: ::c_int = 4; + +pub const AT_FDCWD: ::c_int = -2; +pub const AT_EACCESS: ::c_int = 0x0010; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x0020; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x0040; +pub const AT_REMOVEDIR: ::c_int = 0x0080; + +pub const O_ACCMODE: ::c_int = 3; + +pub const TIOCMODG: ::c_ulong = 0x40047403; +pub const TIOCMODS: ::c_ulong = 0x80047404; +pub const TIOCM_LE: ::c_int = 0x1; +pub const TIOCM_DTR: ::c_int = 0x2; +pub const TIOCM_RTS: ::c_int = 0x4; +pub const TIOCM_ST: ::c_int = 0x8; +pub const TIOCM_SR: ::c_int = 0x10; +pub const TIOCM_CTS: ::c_int = 0x20; +pub const TIOCM_CAR: ::c_int = 0x40; +pub const TIOCM_CD: ::c_int = 0x40; +pub const TIOCM_RNG: ::c_int = 0x80; +pub const TIOCM_RI: ::c_int = 0x80; +pub const TIOCM_DSR: ::c_int = 0x100; +pub const TIOCEXCL: ::c_int = 0x2000740d; +pub const TIOCNXCL: ::c_int = 0x2000740e; +pub const TIOCFLUSH: ::c_ulong = 0x80047410; +pub const TIOCGETD: ::c_ulong = 0x4004741a; +pub const TIOCSETD: ::c_ulong = 0x8004741b; +pub const TIOCIXON: ::c_uint = 0x20007481; +pub const TIOCIXOFF: ::c_uint = 0x20007480; +pub const TIOCSBRK: ::c_uint = 0x2000747b; +pub const TIOCCBRK: ::c_uint = 0x2000747a; +pub const TIOCSDTR: ::c_uint = 0x20007479; +pub const TIOCCDTR: ::c_uint = 0x20007478; +pub const TIOCGPGRP: ::c_ulong = 0x40047477; +pub const TIOCSPGRP: ::c_ulong = 0x80047476; +pub const TIOCOUTQ: ::c_ulong = 0x40047473; +pub const TIOCSTI: ::c_ulong = 0x80017472; +pub const TIOCNOTTY: ::c_uint = 0x20007471; +pub const TIOCPKT: ::c_ulong = 0x80047470; +pub const TIOCPKT_DATA: ::c_int = 0x0; +pub const TIOCPKT_FLUSHREAD: ::c_int = 0x1; +pub const TIOCPKT_FLUSHWRITE: ::c_int = 0x2; +pub const TIOCPKT_STOP: ::c_int = 0x4; +pub const TIOCPKT_START: ::c_int = 0x8; +pub const TIOCPKT_NOSTOP: ::c_int = 0x10; +pub const TIOCPKT_DOSTOP: ::c_int = 0x20; +pub const TIOCPKT_IOCTL: ::c_int = 0x40; +pub const TIOCSTOP: ::c_uint = 0x2000746f; +pub const TIOCSTART: ::c_uint = 0x2000746e; +pub const TIOCMSET: ::c_ulong = 0x8004746d; +pub const TIOCMBIS: ::c_ulong = 0x8004746c; +pub const TIOCMBIC: ::c_ulong = 0x8004746b; +pub const TIOCMGET: ::c_ulong = 0x4004746a; +pub const TIOCREMOTE: ::c_ulong = 0x80047469; +pub const TIOCGWINSZ: ::c_ulong = 0x40087468; +pub const TIOCSWINSZ: ::c_ulong = 0x80087467; +pub const TIOCUCNTL: ::c_ulong = 0x80047466; +pub const TIOCSTAT: ::c_uint = 0x20007465; +pub const TIOCSCONS: ::c_uint = 0x20007463; +pub const TIOCCONS: ::c_ulong = 0x80047462; +pub const TIOCSCTTY: ::c_uint = 0x20007461; +pub const TIOCEXT: ::c_ulong = 0x80047460; +pub const TIOCSIG: ::c_uint = 0x2000745f; +pub const TIOCDRAIN: ::c_uint = 0x2000745e; +pub const TIOCMSDTRWAIT: ::c_ulong = 0x8004745b; +pub const TIOCMGDTRWAIT: ::c_ulong = 0x4004745a; +pub const TIOCSDRAINWAIT: ::c_ulong = 0x80047457; +pub const TIOCGDRAINWAIT: ::c_ulong = 0x40047456; +pub const TIOCDSIMICROCODE: ::c_uint = 0x20007455; +pub const TIOCPTYGRANT: ::c_uint = 0x20007454; +pub const TIOCPTYGNAME: ::c_uint = 0x40807453; +pub const TIOCPTYUNLK: ::c_uint = 0x20007452; + +pub const B0: speed_t = 0; +pub const B50: speed_t = 50; +pub const B75: speed_t = 75; +pub const B110: speed_t = 110; +pub const B134: speed_t = 134; +pub const B150: speed_t = 150; +pub const B200: speed_t = 200; +pub const B300: speed_t = 300; +pub const B600: speed_t = 600; +pub const B1200: speed_t = 1200; +pub const B1800: speed_t = 1800; +pub const B2400: speed_t = 2400; +pub const B4800: speed_t = 4800; +pub const B9600: speed_t = 9600; +pub const B19200: speed_t = 19200; +pub const B38400: speed_t = 38400; +pub const B7200: speed_t = 7200; +pub const B14400: speed_t = 14400; +pub const B28800: speed_t = 28800; +pub const B57600: speed_t = 57600; +pub const B76800: speed_t = 76800; +pub const B115200: speed_t = 115200; +pub const B230400: speed_t = 230400; +pub const EXTA: speed_t = 19200; +pub const EXTB: speed_t = 38400; + +pub const SIGTRAP: ::c_int = 5; + +pub const GLOB_APPEND : ::c_int = 0x0001; +pub const GLOB_DOOFFS : ::c_int = 0x0002; +pub const GLOB_ERR : ::c_int = 0x0004; +pub const GLOB_MARK : ::c_int = 0x0008; +pub const GLOB_NOCHECK : ::c_int = 0x0010; +pub const GLOB_NOSORT : ::c_int = 0x0020; +pub const GLOB_NOESCAPE: ::c_int = 0x2000; + +pub const GLOB_NOSPACE : ::c_int = -1; +pub const GLOB_ABORTED : ::c_int = -2; +pub const GLOB_NOMATCH : ::c_int = -3; + +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; + +pub const _SC_IOV_MAX: ::c_int = 56; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 70; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 71; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 73; +pub const _SC_MQ_PRIO_MAX: ::c_int = 75; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 82; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 83; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 85; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 86; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 87; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 88; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 89; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 90; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 91; +pub const _SC_THREAD_STACK_MIN: ::c_int = 93; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 94; +pub const _SC_THREADS: ::c_int = 96; +pub const _SC_TTY_NAME_MAX: ::c_int = 101; +pub const _SC_ATEXIT_MAX: ::c_int = 107; +pub const _SC_XOPEN_CRYPT: ::c_int = 108; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 109; +pub const _SC_XOPEN_LEGACY: ::c_int = 110; +pub const _SC_XOPEN_REALTIME: ::c_int = 111; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 112; +pub const _SC_XOPEN_SHM: ::c_int = 113; +pub const _SC_XOPEN_UNIX: ::c_int = 115; +pub const _SC_XOPEN_VERSION: ::c_int = 116; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 121; + +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 1; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 2; +pub const PTHREAD_STACK_MIN: ::size_t = 8192; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_AS: ::c_int = 5; +pub const RLIMIT_RSS: ::c_int = RLIMIT_AS; +pub const RLIMIT_MEMLOCK: ::c_int = 6; +pub const RLIMIT_NPROC: ::c_int = 7; +pub const RLIMIT_NOFILE: ::c_int = 8; +pub const RLIM_NLIMITS: ::c_int = 9; +pub const _RLIMIT_POSIX_FLAG: ::c_int = 0x1000; + +pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff; + +pub const RUSAGE_SELF: ::c_int = 0; +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; +pub const MADV_FREE: ::c_int = 5; +pub const MADV_ZERO_WIRED_PAGES: ::c_int = 6; +pub const MADV_FREE_REUSABLE: ::c_int = 7; +pub const MADV_FREE_REUSE: ::c_int = 8; +pub const MADV_CAN_REUSE: ::c_int = 9; + +pub const MINCORE_INCORE: ::c_int = 0x1; +pub const MINCORE_REFERENCED: ::c_int = 0x2; +pub const MINCORE_MODIFIED: ::c_int = 0x4; +pub const MINCORE_REFERENCED_OTHER: ::c_int = 0x8; +pub const MINCORE_MODIFIED_OTHER: ::c_int = 0x10; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_LOCAL: ::c_int = 1; +pub const AF_UNIX: ::c_int = AF_LOCAL; +pub const AF_INET: ::c_int = 2; +pub const AF_IMPLINK: ::c_int = 3; +pub const AF_PUP: ::c_int = 4; +pub const AF_CHAOS: ::c_int = 5; +pub const AF_NS: ::c_int = 6; +pub const AF_ISO: ::c_int = 7; +pub const AF_OSI: ::c_int = AF_ISO; +pub const AF_ECMA: ::c_int = 8; +pub const AF_DATAKIT: ::c_int = 9; +pub const AF_CCITT: ::c_int = 10; +pub const AF_SNA: ::c_int = 11; +pub const AF_DECnet: ::c_int = 12; +pub const AF_DLI: ::c_int = 13; +pub const AF_LAT: ::c_int = 14; +pub const AF_HYLINK: ::c_int = 15; +pub const AF_APPLETALK: ::c_int = 16; +pub const AF_ROUTE: ::c_int = 17; +pub const AF_LINK: ::c_int = 18; +pub const pseudo_AF_XTP: ::c_int = 19; +pub const AF_COIP: ::c_int = 20; +pub const AF_CNT: ::c_int = 21; +pub const pseudo_AF_RTIP: ::c_int = 22; +pub const AF_IPX: ::c_int = 23; +pub const AF_SIP: ::c_int = 24; +pub const pseudo_AF_PIP: ::c_int = 25; +pub const AF_ISDN: ::c_int = 28; +pub const AF_E164: ::c_int = AF_ISDN; +pub const pseudo_AF_KEY: ::c_int = 29; +pub const AF_INET6: ::c_int = 30; +pub const AF_NATM: ::c_int = 31; +pub const AF_SYSTEM: ::c_int = 32; +pub const AF_NETBIOS: ::c_int = 33; +pub const AF_PPP: ::c_int = 34; +pub const pseudo_AF_HDRCMPLT: ::c_int = 35; +#[doc(hidden)] +pub const AF_MAX: ::c_int = 40; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_LOCAL: ::c_int = AF_LOCAL; +pub const PF_UNIX: ::c_int = PF_LOCAL; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_IMPLINK: ::c_int = AF_IMPLINK; +pub const PF_PUP: ::c_int = AF_PUP; +pub const PF_CHAOS: ::c_int = AF_CHAOS; +pub const PF_NS: ::c_int = AF_NS; +pub const PF_ISO: ::c_int = AF_ISO; +pub const PF_OSI: ::c_int = AF_ISO; +pub const PF_ECMA: ::c_int = AF_ECMA; +pub const PF_DATAKIT: ::c_int = AF_DATAKIT; +pub const PF_CCITT: ::c_int = AF_CCITT; +pub const PF_SNA: ::c_int = AF_SNA; +pub const PF_DECnet: ::c_int = AF_DECnet; +pub const PF_DLI: ::c_int = AF_DLI; +pub const PF_LAT: ::c_int = AF_LAT; +pub const PF_HYLINK: ::c_int = AF_HYLINK; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_LINK: ::c_int = AF_LINK; +pub const PF_XTP: ::c_int = pseudo_AF_XTP; +pub const PF_COIP: ::c_int = AF_COIP; +pub const PF_CNT: ::c_int = AF_CNT; +pub const PF_SIP: ::c_int = AF_SIP; +pub const PF_IPX: ::c_int = AF_IPX; +pub const PF_RTIP: ::c_int = pseudo_AF_RTIP; +pub const PF_PIP: ::c_int = pseudo_AF_PIP; +pub const PF_ISDN: ::c_int = AF_ISDN; +pub const PF_KEY: ::c_int = pseudo_AF_KEY; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_NATM: ::c_int = AF_NATM; +pub const PF_SYSTEM: ::c_int = AF_SYSTEM; +pub const PF_NETBIOS: ::c_int = AF_NETBIOS; +pub const PF_PPP: ::c_int = AF_PPP; +#[doc(hidden)] +pub const PF_MAX: ::c_int = AF_MAX; + +#[doc(hidden)] +pub const NET_MAXID: ::c_int = AF_MAX; + +pub const NET_RT_DUMP: ::c_int = 1; +pub const NET_RT_FLAGS: ::c_int = 2; +pub const NET_RT_IFLIST: ::c_int = 3; +#[doc(hidden)] +pub const NET_RT_MAXID: ::c_int = 10; + +pub const SOMAXCONN: ::c_int = 128; + +pub const SOCK_MAXADDRLEN: ::c_int = 255; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_RDM: ::c_int = 4; +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const IPPROTO_ICMP: ::c_int = 1; +pub const IPPROTO_ICMPV6: ::c_int = 58; +pub const IPPROTO_TCP: ::c_int = 6; +pub const IPPROTO_IP: ::c_int = 0; +pub const IPPROTO_IPV6: ::c_int = 41; +pub const IP_MULTICAST_TTL: ::c_int = 10; +pub const IP_MULTICAST_LOOP: ::c_int = 11; +pub const IP_TTL: ::c_int = 4; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_ADD_MEMBERSHIP: ::c_int = 12; +pub const IP_DROP_MEMBERSHIP: ::c_int = 13; +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; + +pub const TCP_NODELAY: ::c_int = 0x01; +pub const TCP_KEEPALIVE: ::c_int = 0x10; +pub const SOL_SOCKET: ::c_int = 0xffff; + +pub const SO_DEBUG: ::c_int = 0x01; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_TIMESTAMP: ::c_int = 0x0400; +pub const SO_DONTTRUNC: ::c_int = 0x2000; +pub const SO_WANTMORE: ::c_int = 0x4000; +pub const SO_WANTOOBFLAG: ::c_int = 0x8000; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_NREAD: ::c_int = 0x1020; +pub const SO_NKE: ::c_int = 0x1021; +pub const SO_NOSIGPIPE: ::c_int = 0x1022; +pub const SO_NOADDRERR: ::c_int = 0x1023; +pub const SO_NWRITE: ::c_int = 0x1024; + +pub const MSG_OOB: ::c_int = 0x1; +pub const MSG_PEEK: ::c_int = 0x2; +pub const MSG_DONTROUTE: ::c_int = 0x4; +pub const MSG_EOR: ::c_int = 0x8; +pub const MSG_TRUNC: ::c_int = 0x10; +pub const MSG_CTRUNC: ::c_int = 0x20; +pub const MSG_WAITALL: ::c_int = 0x40; +pub const MSG_DONTWAIT: ::c_int = 0x80; +pub const MSG_EOF: ::c_int = 0x100; +pub const MSG_FLUSH: ::c_int = 0x400; +pub const MSG_HOLD: ::c_int = 0x800; +pub const MSG_SEND: ::c_int = 0x1000; +pub const MSG_HAVEMORE: ::c_int = 0x2000; +pub const MSG_RCVMORE: ::c_int = 0x4000; +// pub const MSG_COMPAT: ::c_int = 0x8000; + +pub const SCM_RIGHTS: ::c_int = 0x01; +pub const SCM_TIMESTAMP: ::c_int = 0x02; +pub const SCM_CREDS: ::c_int = 0x03; + +pub const IFF_LOOPBACK: ::c_int = 0x8; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +pub const O_DSYNC: ::c_int = 4194304; +pub const O_SYNC: ::c_int = 128; +pub const O_NONBLOCK: ::c_int = 4; + +pub const MAP_COPY: ::c_int = 0x0002; +pub const MAP_RENAME: ::c_int = 0x0020; +pub const MAP_NORESERVE: ::c_int = 0x0040; +pub const MAP_NOEXTEND: ::c_int = 0x0100; +pub const MAP_HASSEMAPHORE: ::c_int = 0x0200; +pub const MAP_NOCACHE: ::c_int = 0x0400; +pub const MAP_JIT: ::c_int = 0x0800; + +pub const IPPROTO_RAW: ::c_int = 255; + +pub const _SC_ARG_MAX: ::c_int = 1; +pub const _SC_CHILD_MAX: ::c_int = 2; +pub const _SC_CLK_TCK: ::c_int = 3; +pub const _SC_NGROUPS_MAX: ::c_int = 4; +pub const _SC_OPEN_MAX: ::c_int = 5; +pub const _SC_JOB_CONTROL: ::c_int = 6; +pub const _SC_SAVED_IDS: ::c_int = 7; +pub const _SC_VERSION: ::c_int = 8; +pub const _SC_BC_BASE_MAX: ::c_int = 9; +pub const _SC_BC_DIM_MAX: ::c_int = 10; +pub const _SC_BC_SCALE_MAX: ::c_int = 11; +pub const _SC_BC_STRING_MAX: ::c_int = 12; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 13; +pub const _SC_EXPR_NEST_MAX: ::c_int = 14; +pub const _SC_LINE_MAX: ::c_int = 15; +pub const _SC_RE_DUP_MAX: ::c_int = 16; +pub const _SC_2_VERSION: ::c_int = 17; +pub const _SC_2_C_BIND: ::c_int = 18; +pub const _SC_2_C_DEV: ::c_int = 19; +pub const _SC_2_CHAR_TERM: ::c_int = 20; +pub const _SC_2_FORT_DEV: ::c_int = 21; +pub const _SC_2_FORT_RUN: ::c_int = 22; +pub const _SC_2_LOCALEDEF: ::c_int = 23; +pub const _SC_2_SW_DEV: ::c_int = 24; +pub const _SC_2_UPE: ::c_int = 25; +pub const _SC_STREAM_MAX: ::c_int = 26; +pub const _SC_TZNAME_MAX: ::c_int = 27; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 28; +pub const _SC_PAGESIZE: ::c_int = 29; +pub const _SC_MEMLOCK: ::c_int = 30; +pub const _SC_MEMLOCK_RANGE: ::c_int = 31; +pub const _SC_MEMORY_PROTECTION: ::c_int = 32; +pub const _SC_MESSAGE_PASSING: ::c_int = 33; +pub const _SC_PRIORITIZED_IO: ::c_int = 34; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 35; +pub const _SC_REALTIME_SIGNALS: ::c_int = 36; +pub const _SC_SEMAPHORES: ::c_int = 37; +pub const _SC_FSYNC: ::c_int = 38; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 39; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 40; +pub const _SC_TIMERS: ::c_int = 41; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 42; +pub const _SC_AIO_MAX: ::c_int = 43; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 44; +pub const _SC_DELAYTIMER_MAX: ::c_int = 45; +pub const _SC_MQ_OPEN_MAX: ::c_int = 46; +pub const _SC_MAPPED_FILES: ::c_int = 47; +pub const _SC_RTSIG_MAX: ::c_int = 48; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 49; +pub const _SC_SEM_VALUE_MAX: ::c_int = 50; +pub const _SC_SIGQUEUE_MAX: ::c_int = 51; +pub const _SC_TIMER_MAX: ::c_int = 52; +pub const _SC_NPROCESSORS_CONF: ::c_int = 57; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 58; +pub const _SC_2_PBS: ::c_int = 59; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 60; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 61; +pub const _SC_2_PBS_LOCATE: ::c_int = 62; +pub const _SC_2_PBS_MESSAGE: ::c_int = 63; +pub const _SC_2_PBS_TRACK: ::c_int = 64; +pub const _SC_ADVISORY_INFO: ::c_int = 65; +pub const _SC_BARRIERS: ::c_int = 66; +pub const _SC_CLOCK_SELECTION: ::c_int = 67; +pub const _SC_CPUTIME: ::c_int = 68; +pub const _SC_FILE_LOCKING: ::c_int = 69; +pub const _SC_HOST_NAME_MAX: ::c_int = 72; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 74; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 76; +pub const _SC_REGEXP: ::c_int = 77; +pub const _SC_SHELL: ::c_int = 78; +pub const _SC_SPAWN: ::c_int = 79; +pub const _SC_SPIN_LOCKS: ::c_int = 80; +pub const _SC_SPORADIC_SERVER: ::c_int = 81; +pub const _SC_THREAD_CPUTIME: ::c_int = 84; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 92; +pub const _SC_TIMEOUTS: ::c_int = 95; +pub const _SC_TRACE: ::c_int = 97; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 98; +pub const _SC_TRACE_INHERIT: ::c_int = 99; +pub const _SC_TRACE_LOG: ::c_int = 100; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 102; +pub const _SC_V6_ILP32_OFF32: ::c_int = 103; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = 104; +pub const _SC_V6_LP64_OFF64: ::c_int = 105; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 106; +pub const _SC_IPV6: ::c_int = 118; +pub const _SC_RAW_SOCKETS: ::c_int = 119; +pub const _SC_SYMLOOP_MAX: ::c_int = 120; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_XOPEN_STREAMS: ::c_int = 114; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = 122; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 123; +pub const _SC_XBS5_LP64_OFF64: ::c_int = 124; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 125; +pub const _SC_SS_REPL_MAX: ::c_int = 126; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 127; +pub const _SC_TRACE_NAME_MAX: ::c_int = 128; +pub const _SC_TRACE_SYS_MAX: ::c_int = 129; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 130; +pub const _SC_PASS_MAX: ::c_int = 131; + +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; +pub const _PTHREAD_MUTEX_SIG_init: ::c_long = 0x32AAABA7; +pub const _PTHREAD_COND_SIG_init: ::c_long = 0x3CB0B1BB; +pub const _PTHREAD_RWLOCK_SIG_init: ::c_long = 0x2DA8B3B4; +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + __sig: _PTHREAD_MUTEX_SIG_init, + __opaque: [0; __PTHREAD_MUTEX_SIZE__], +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + __sig: _PTHREAD_COND_SIG_init, + __opaque: [0; __PTHREAD_COND_SIZE__], +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + __sig: _PTHREAD_RWLOCK_SIG_init, + __opaque: [0; __PTHREAD_RWLOCK_SIZE__], +}; + +pub const SIGSTKSZ: ::size_t = 131072; + +pub const FD_SETSIZE: usize = 1024; + +pub const ST_NOSUID: ::c_ulong = 2; + +pub const EVFILT_READ: ::int16_t = -1; +pub const EVFILT_WRITE: ::int16_t = -2; +pub const EVFILT_AIO: ::int16_t = -3; +pub const EVFILT_VNODE: ::int16_t = -4; +pub const EVFILT_PROC: ::int16_t = -5; +pub const EVFILT_SIGNAL: ::int16_t = -6; +pub const EVFILT_TIMER: ::int16_t = -7; +pub const EVFILT_MACHPORT: ::int16_t = -8; +pub const EVFILT_FS: ::int16_t = -9; +pub const EVFILT_USER: ::int16_t = -10; +pub const EVFILT_VM: ::int16_t = -12; + +pub const EV_ADD: ::uint16_t = 0x1; +pub const EV_DELETE: ::uint16_t = 0x2; +pub const EV_ENABLE: ::uint16_t = 0x4; +pub const EV_DISABLE: ::uint16_t = 0x8; +pub const EV_ONESHOT: ::uint16_t = 0x10; +pub const EV_CLEAR: ::uint16_t = 0x20; +pub const EV_RECEIPT: ::uint16_t = 0x40; +pub const EV_DISPATCH: ::uint16_t = 0x80; +pub const EV_FLAG0: ::uint16_t = 0x1000; +pub const EV_POLL: ::uint16_t = 0x1000; +pub const EV_FLAG1: ::uint16_t = 0x2000; +pub const EV_OOBAND: ::uint16_t = 0x2000; +pub const EV_ERROR: ::uint16_t = 0x4000; +pub const EV_EOF: ::uint16_t = 0x8000; +pub const EV_SYSFLAGS: ::uint16_t = 0xf000; + +pub const NOTE_TRIGGER: ::uint32_t = 0x01000000; +pub const NOTE_FFNOP: ::uint32_t = 0x00000000; +pub const NOTE_FFAND: ::uint32_t = 0x40000000; +pub const NOTE_FFOR: ::uint32_t = 0x80000000; +pub const NOTE_FFCOPY: ::uint32_t = 0xc0000000; +pub const NOTE_FFCTRLMASK: ::uint32_t = 0xc0000000; +pub const NOTE_FFLAGSMASK: ::uint32_t = 0x00ffffff; +pub const NOTE_LOWAT: ::uint32_t = 0x00000001; +pub const NOTE_DELETE: ::uint32_t = 0x00000001; +pub const NOTE_WRITE: ::uint32_t = 0x00000002; +pub const NOTE_EXTEND: ::uint32_t = 0x00000004; +pub const NOTE_ATTRIB: ::uint32_t = 0x00000008; +pub const NOTE_LINK: ::uint32_t = 0x00000010; +pub const NOTE_RENAME: ::uint32_t = 0x00000020; +pub const NOTE_REVOKE: ::uint32_t = 0x00000040; +pub const NOTE_NONE: ::uint32_t = 0x00000080; +pub const NOTE_EXIT: ::uint32_t = 0x80000000; +pub const NOTE_FORK: ::uint32_t = 0x40000000; +pub const NOTE_EXEC: ::uint32_t = 0x20000000; +pub const NOTE_REAP: ::uint32_t = 0x10000000; +pub const NOTE_SIGNAL: ::uint32_t = 0x08000000; +pub const NOTE_EXITSTATUS: ::uint32_t = 0x04000000; +pub const NOTE_EXIT_DETAIL: ::uint32_t = 0x02000000; +pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff; +pub const NOTE_PCTRLMASK: ::uint32_t = 0xfff00000; +pub const NOTE_EXIT_REPARENTED: ::uint32_t = 0x00080000; +pub const NOTE_EXIT_DETAIL_MASK: ::uint32_t = 0x00070000; +pub const NOTE_EXIT_DECRYPTFAIL: ::uint32_t = 0x00010000; +pub const NOTE_EXIT_MEMORY: ::uint32_t = 0x00020000; +pub const NOTE_EXIT_CSERROR: ::uint32_t = 0x00040000; +pub const NOTE_VM_PRESSURE: ::uint32_t = 0x80000000; +pub const NOTE_VM_PRESSURE_TERMINATE: ::uint32_t = 0x40000000; +pub const NOTE_VM_PRESSURE_SUDDEN_TERMINATE: ::uint32_t = 0x20000000; +pub const NOTE_VM_ERROR: ::uint32_t = 0x10000000; +pub const NOTE_SECONDS: ::uint32_t = 0x00000001; +pub const NOTE_USECONDS: ::uint32_t = 0x00000002; +pub const NOTE_NSECONDS: ::uint32_t = 0x00000004; +pub const NOTE_ABSOLUTE: ::uint32_t = 0x00000008; +pub const NOTE_LEEWAY: ::uint32_t = 0x00000010; +pub const NOTE_CRITICAL: ::uint32_t = 0x00000020; +pub const NOTE_BACKGROUND: ::uint32_t = 0x00000040; +pub const NOTE_TRACK: ::uint32_t = 0x00000001; +pub const NOTE_TRACKERR: ::uint32_t = 0x00000002; +pub const NOTE_CHILD: ::uint32_t = 0x00000004; + +pub const NL0: ::c_int = 0x00000000; +pub const NL1: ::c_int = 0x00000100; +pub const TAB0: ::c_int = 0x00000000; +pub const TAB1: ::c_int = 0x00000400; +pub const TAB2: ::c_int = 0x00000800; +pub const CR0: ::c_int = 0x00000000; +pub const CR1: ::c_int = 0x00001000; +pub const CR2: ::c_int = 0x00002000; +pub const CR3: ::c_int = 0x00003000; +pub const FF0: ::c_int = 0x00000000; +pub const FF1: ::c_int = 0x00004000; +pub const BS0: ::c_int = 0x00000000; +pub const BS1: ::c_int = 0x00008000; +pub const TAB3: ::c_int = 0x00000004; +pub const VT0: ::c_int = 0x00000000; +pub const VT1: ::c_int = 0x00010000; +pub const IUTF8: ::tcflag_t = 0x00004000; +pub const CRTSCTS: ::tcflag_t = 0x00030000; + +pub const NI_MAXHOST: ::socklen_t = 1025; + +pub const Q_GETQUOTA: ::c_int = 0x300; +pub const Q_SETQUOTA: ::c_int = 0x400; + +pub const RTLD_LOCAL: ::c_int = 0x4; +pub const RTLD_FIRST: ::c_int = 0x100; +pub const RTLD_NODELETE: ::c_int = 0x80; +pub const RTLD_NOLOAD: ::c_int = 0x10; +pub const RTLD_GLOBAL: ::c_int = 0x8; + +pub const _WSTOPPED: ::c_int = 0o177; + +pub const LOG_NETINFO: ::c_int = 12 << 3; +pub const LOG_REMOTEAUTH: ::c_int = 13 << 3; +pub const LOG_INSTALL: ::c_int = 14 << 3; +pub const LOG_RAS: ::c_int = 15 << 3; +pub const LOG_LAUNCHD: ::c_int = 24 << 3; +pub const LOG_NFACILITIES: ::c_int = 25; + +pub const CTLTYPE: ::c_int = 0xf; +pub const CTLTYPE_NODE: ::c_int = 1; +pub const CTLTYPE_INT: ::c_int = 2; +pub const CTLTYPE_STRING: ::c_int = 3; +pub const CTLTYPE_QUAD: ::c_int = 4; +pub const CTLTYPE_OPAQUE: ::c_int = 5; +pub const CTLTYPE_STRUCT: ::c_int = CTLTYPE_OPAQUE; +pub const CTLFLAG_RD: ::c_int = 0x80000000; +pub const CTLFLAG_WR: ::c_int = 0x40000000; +pub const CTLFLAG_RW: ::c_int = CTLFLAG_RD | CTLFLAG_WR; +pub const CTLFLAG_NOLOCK: ::c_int = 0x20000000; +pub const CTLFLAG_ANYBODY: ::c_int = 0x10000000; +pub const CTLFLAG_SECURE: ::c_int = 0x08000000; +pub const CTLFLAG_MASKED: ::c_int = 0x04000000; +pub const CTLFLAG_NOAUTO: ::c_int = 0x02000000; +pub const CTLFLAG_KERN: ::c_int = 0x01000000; +pub const CTLFLAG_LOCKED: ::c_int = 0x00800000; +pub const CTLFLAG_OID2: ::c_int = 0x00400000; +pub const CTL_UNSPEC: ::c_int = 0; +pub const CTL_KERN: ::c_int = 1; +pub const CTL_VM: ::c_int = 2; +pub const CTL_VFS: ::c_int = 3; +pub const CTL_NET: ::c_int = 4; +pub const CTL_DEBUG: ::c_int = 5; +pub const CTL_HW: ::c_int = 6; +pub const CTL_MACHDEP: ::c_int = 7; +pub const CTL_USER: ::c_int = 8; +pub const CTL_MAXID: ::c_int = 9; +pub const KERN_OSTYPE: ::c_int = 1; +pub const KERN_OSRELEASE: ::c_int = 2; +pub const KERN_OSREV: ::c_int = 3; +pub const KERN_VERSION: ::c_int = 4; +pub const KERN_MAXVNODES: ::c_int = 5; +pub const KERN_MAXPROC: ::c_int = 6; +pub const KERN_MAXFILES: ::c_int = 7; +pub const KERN_ARGMAX: ::c_int = 8; +pub const KERN_SECURELVL: ::c_int = 9; +pub const KERN_HOSTNAME: ::c_int = 10; +pub const KERN_HOSTID: ::c_int = 11; +pub const KERN_CLOCKRATE: ::c_int = 12; +pub const KERN_VNODE: ::c_int = 13; +pub const KERN_PROC: ::c_int = 14; +pub const KERN_FILE: ::c_int = 15; +pub const KERN_PROF: ::c_int = 16; +pub const KERN_POSIX1: ::c_int = 17; +pub const KERN_NGROUPS: ::c_int = 18; +pub const KERN_JOB_CONTROL: ::c_int = 19; +pub const KERN_SAVED_IDS: ::c_int = 20; +pub const KERN_BOOTTIME: ::c_int = 21; +pub const KERN_NISDOMAINNAME: ::c_int = 22; +pub const KERN_DOMAINNAME: ::c_int = KERN_NISDOMAINNAME; +pub const KERN_MAXPARTITIONS: ::c_int = 23; +pub const KERN_KDEBUG: ::c_int = 24; +pub const KERN_UPDATEINTERVAL: ::c_int = 25; +pub const KERN_OSRELDATE: ::c_int = 26; +pub const KERN_NTP_PLL: ::c_int = 27; +pub const KERN_BOOTFILE: ::c_int = 28; +pub const KERN_MAXFILESPERPROC: ::c_int = 29; +pub const KERN_MAXPROCPERUID: ::c_int = 30; +pub const KERN_DUMPDEV: ::c_int = 31; +pub const KERN_IPC: ::c_int = 32; +pub const KERN_DUMMY: ::c_int = 33; +pub const KERN_PS_STRINGS: ::c_int = 34; +pub const KERN_USRSTACK32: ::c_int = 35; +pub const KERN_LOGSIGEXIT: ::c_int = 36; +pub const KERN_SYMFILE: ::c_int = 37; +pub const KERN_PROCARGS: ::c_int = 38; +pub const KERN_NETBOOT: ::c_int = 40; +pub const KERN_SYSV: ::c_int = 42; +pub const KERN_AFFINITY: ::c_int = 43; +pub const KERN_TRANSLATE: ::c_int = 44; +pub const KERN_CLASSIC: ::c_int = KERN_TRANSLATE; +pub const KERN_EXEC: ::c_int = 45; +pub const KERN_CLASSICHANDLER: ::c_int = KERN_EXEC; +pub const KERN_AIOMAX: ::c_int = 46; +pub const KERN_AIOPROCMAX: ::c_int = 47; +pub const KERN_AIOTHREADS: ::c_int = 48; +pub const KERN_COREFILE: ::c_int = 50; +pub const KERN_COREDUMP: ::c_int = 51; +pub const KERN_SUGID_COREDUMP: ::c_int = 52; +pub const KERN_PROCDELAYTERM: ::c_int = 53; +pub const KERN_SHREG_PRIVATIZABLE: ::c_int = 54; +pub const KERN_LOW_PRI_WINDOW: ::c_int = 56; +pub const KERN_LOW_PRI_DELAY: ::c_int = 57; +pub const KERN_POSIX: ::c_int = 58; +pub const KERN_USRSTACK64: ::c_int = 59; +pub const KERN_NX_PROTECTION: ::c_int = 60; +pub const KERN_TFP: ::c_int = 61; +pub const KERN_PROCNAME: ::c_int = 62; +pub const KERN_THALTSTACK: ::c_int = 63; +pub const KERN_SPECULATIVE_READS: ::c_int = 64; +pub const KERN_OSVERSION: ::c_int = 65; +pub const KERN_SAFEBOOT: ::c_int = 66; +pub const KERN_RAGEVNODE: ::c_int = 68; +pub const KERN_TTY: ::c_int = 69; +pub const KERN_CHECKOPENEVT: ::c_int = 70; +pub const KERN_THREADNAME: ::c_int = 71; +pub const KERN_MAXID: ::c_int = 72; +pub const KERN_RAGE_PROC: ::c_int = 1; +pub const KERN_RAGE_THREAD: ::c_int = 2; +pub const KERN_UNRAGE_PROC: ::c_int = 3; +pub const KERN_UNRAGE_THREAD: ::c_int = 4; +pub const KERN_OPENEVT_PROC: ::c_int = 1; +pub const KERN_UNOPENEVT_PROC: ::c_int = 2; +pub const KERN_TFP_POLICY: ::c_int = 1; +pub const KERN_TFP_POLICY_DENY: ::c_int = 0; +pub const KERN_TFP_POLICY_DEFAULT: ::c_int = 2; +pub const KERN_KDEFLAGS: ::c_int = 1; +pub const KERN_KDDFLAGS: ::c_int = 2; +pub const KERN_KDENABLE: ::c_int = 3; +pub const KERN_KDSETBUF: ::c_int = 4; +pub const KERN_KDGETBUF: ::c_int = 5; +pub const KERN_KDSETUP: ::c_int = 6; +pub const KERN_KDREMOVE: ::c_int = 7; +pub const KERN_KDSETREG: ::c_int = 8; +pub const KERN_KDGETREG: ::c_int = 9; +pub const KERN_KDREADTR: ::c_int = 10; +pub const KERN_KDPIDTR: ::c_int = 11; +pub const KERN_KDTHRMAP: ::c_int = 12; +pub const KERN_KDPIDEX: ::c_int = 14; +pub const KERN_KDSETRTCDEC: ::c_int = 15; +pub const KERN_KDGETENTROPY: ::c_int = 16; +pub const KERN_KDWRITETR: ::c_int = 17; +pub const KERN_KDWRITEMAP: ::c_int = 18; +pub const KERN_KDENABLE_BG_TRACE: ::c_int = 19; +pub const KERN_KDDISABLE_BG_TRACE: ::c_int = 20; +pub const KERN_KDREADCURTHRMAP: ::c_int = 21; +pub const KERN_KDSET_TYPEFILTER: ::c_int = 22; +pub const KERN_KDBUFWAIT: ::c_int = 23; +pub const KERN_KDCPUMAP: ::c_int = 24; +pub const KERN_PROC_ALL: ::c_int = 0; +pub const KERN_PROC_PID: ::c_int = 1; +pub const KERN_PROC_PGRP: ::c_int = 2; +pub const KERN_PROC_SESSION: ::c_int = 3; +pub const KERN_PROC_TTY: ::c_int = 4; +pub const KERN_PROC_UID: ::c_int = 5; +pub const KERN_PROC_RUID: ::c_int = 6; +pub const KERN_PROC_LCID: ::c_int = 7; +pub const KIPC_MAXSOCKBUF: ::c_int = 1; +pub const KIPC_SOCKBUF_WASTE: ::c_int = 2; +pub const KIPC_SOMAXCONN: ::c_int = 3; +pub const KIPC_MAX_LINKHDR: ::c_int = 4; +pub const KIPC_MAX_PROTOHDR: ::c_int = 5; +pub const KIPC_MAX_HDR: ::c_int = 6; +pub const KIPC_MAX_DATALEN: ::c_int = 7; +pub const KIPC_MBSTAT: ::c_int = 8; +pub const KIPC_NMBCLUSTERS: ::c_int = 9; +pub const KIPC_SOQLIMITCOMPAT: ::c_int = 10; +pub const VM_METER: ::c_int = 1; +pub const VM_LOADAVG: ::c_int = 2; +pub const VM_MACHFACTOR: ::c_int = 4; +pub const VM_SWAPUSAGE: ::c_int = 5; +pub const VM_MAXID: ::c_int = 6; +pub const HW_MACHINE: ::c_int = 1; +pub const HW_MODEL: ::c_int = 2; +pub const HW_NCPU: ::c_int = 3; +pub const HW_BYTEORDER: ::c_int = 4; +pub const HW_PHYSMEM: ::c_int = 5; +pub const HW_USERMEM: ::c_int = 6; +pub const HW_PAGESIZE: ::c_int = 7; +pub const HW_DISKNAMES: ::c_int = 8; +pub const HW_DISKSTATS: ::c_int = 9; +pub const HW_EPOCH: ::c_int = 10; +pub const HW_FLOATINGPT: ::c_int = 11; +pub const HW_MACHINE_ARCH: ::c_int = 12; +pub const HW_VECTORUNIT: ::c_int = 13; +pub const HW_BUS_FREQ: ::c_int = 14; +pub const HW_CPU_FREQ: ::c_int = 15; +pub const HW_CACHELINE: ::c_int = 16; +pub const HW_L1ICACHESIZE: ::c_int = 17; +pub const HW_L1DCACHESIZE: ::c_int = 18; +pub const HW_L2SETTINGS: ::c_int = 19; +pub const HW_L2CACHESIZE: ::c_int = 20; +pub const HW_L3SETTINGS: ::c_int = 21; +pub const HW_L3CACHESIZE: ::c_int = 22; +pub const HW_TB_FREQ: ::c_int = 23; +pub const HW_MEMSIZE: ::c_int = 24; +pub const HW_AVAILCPU: ::c_int = 25; +pub const HW_MAXID: ::c_int = 26; +pub const USER_CS_PATH: ::c_int = 1; +pub const USER_BC_BASE_MAX: ::c_int = 2; +pub const USER_BC_DIM_MAX: ::c_int = 3; +pub const USER_BC_SCALE_MAX: ::c_int = 4; +pub const USER_BC_STRING_MAX: ::c_int = 5; +pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6; +pub const USER_EXPR_NEST_MAX: ::c_int = 7; +pub const USER_LINE_MAX: ::c_int = 8; +pub const USER_RE_DUP_MAX: ::c_int = 9; +pub const USER_POSIX2_VERSION: ::c_int = 10; +pub const USER_POSIX2_C_BIND: ::c_int = 11; +pub const USER_POSIX2_C_DEV: ::c_int = 12; +pub const USER_POSIX2_CHAR_TERM: ::c_int = 13; +pub const USER_POSIX2_FORT_DEV: ::c_int = 14; +pub const USER_POSIX2_FORT_RUN: ::c_int = 15; +pub const USER_POSIX2_LOCALEDEF: ::c_int = 16; +pub const USER_POSIX2_SW_DEV: ::c_int = 17; +pub const USER_POSIX2_UPE: ::c_int = 18; +pub const USER_STREAM_MAX: ::c_int = 19; +pub const USER_TZNAME_MAX: ::c_int = 20; +pub const USER_MAXID: ::c_int = 21; +pub const CTL_DEBUG_NAME: ::c_int = 0; +pub const CTL_DEBUG_VALUE: ::c_int = 1; +pub const CTL_DEBUG_MAXID: ::c_int = 20; + +pub const POLLRDNORM: ::c_short = 0x040; +pub const POLLWRNORM: ::c_short = 0x004; +pub const POLLRDBAND: ::c_short = 0x080; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const PRIO_DARWIN_THREAD: ::c_int = 3; +pub const PRIO_DARWIN_PROCESS: ::c_int = 4; +pub const PRIO_DARWIN_BG: ::c_int = 0x1000; +pub const PRIO_DARWIN_NONUI: ::c_int = 0x1001; + +pub const SEM_FAILED: *mut sem_t = -1isize as *mut ::sem_t; + +pub const SIGEV_NONE: ::c_int = 0; +pub const SIGEV_SIGNAL: ::c_int = 1; +pub const SIGEV_THREAD: ::c_int = 3; + +pub const AIO_CANCELED: ::c_int = 2; +pub const AIO_NOTCANCELED: ::c_int = 4; +pub const AIO_ALLDONE: ::c_int = 1; +pub const AIO_LISTIO_MAX: ::c_int = 16; +pub const LIO_NOP: ::c_int = 0; +pub const LIO_WRITE: ::c_int = 2; +pub const LIO_READ: ::c_int = 1; +pub const LIO_WAIT: ::c_int = 2; +pub const LIO_NOWAIT: ::c_int = 1; + +pub const WEXITED: ::c_int = 0x00000004; +pub const WSTOPPED: ::c_int = 0x00000008; +pub const WCONTINUED: ::c_int = 0x00000010; +pub const WNOWAIT: ::c_int = 0x00000020; + +pub const P_ALL: idtype_t = 0; +pub const P_PID: idtype_t = 1; +pub const P_PGID: idtype_t = 2; + +f! { + pub fn WSTOPSIG(status: ::c_int) -> ::c_int { + status >> 8 + } + + pub fn _WSTATUS(status: ::c_int) -> ::c_int { + status & 0x7f + } + + pub fn WIFCONTINUED(status: ::c_int) -> bool { + _WSTATUS(status) == _WSTOPPED && WSTOPSIG(status) == 0x13 + } + + pub fn WIFSIGNALED(status: ::c_int) -> bool { + _WSTATUS(status) != _WSTOPPED && _WSTATUS(status) != 0 + } + + pub fn WIFSTOPPED(status: ::c_int) -> bool { + _WSTATUS(status) == _WSTOPPED && WSTOPSIG(status) != 0x13 + } +} + +extern { + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "aio_suspend$UNIX2003")] + pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int, + timeout: *const ::timespec) -> ::c_int; + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb, + nitems: ::c_int, sevp: *mut sigevent) -> ::c_int; + + pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; + + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn setutxent(); + pub fn endutxent(); + pub fn utmpxname(file: *const ::c_char) -> ::c_int; + + pub fn getnameinfo(sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int) -> ::c_int; + pub fn mincore(addr: *const ::c_void, len: ::size_t, + vec: *mut ::c_char) -> ::c_int; + pub fn sysctlnametomib(name: *const ::c_char, + mibp: *mut ::c_int, + sizep: *mut ::size_t) + -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "mprotect$UNIX2003")] + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) + -> ::c_int; + pub fn shm_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::c_int; + pub fn sysctl(name: *mut ::c_int, + namelen: ::c_uint, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t) + -> ::c_int; + pub fn sysctlbyname(name: *const ::c_char, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t) + -> ::c_int; + pub fn mach_absolute_time() -> u64; + pub fn mach_timebase_info(info: *mut ::mach_timebase_info) -> ::c_int; + pub fn pthread_setname_np(name: *const ::c_char) -> ::c_int; + pub fn pthread_get_stackaddr_np(thread: ::pthread_t) -> *mut ::c_void; + pub fn pthread_get_stacksize_np(thread: ::pthread_t) -> ::size_t; + pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, + pshared: ::c_int) -> ::c_int; + pub fn pthread_condattr_getpshared(attr: *const pthread_condattr_t, + pshared: *mut ::c_int) -> ::c_int; + pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t, + pshared: ::c_int) -> ::c_int; + pub fn pthread_mutexattr_getpshared(attr: *const pthread_mutexattr_t, + pshared: *mut ::c_int) -> ::c_int; + pub fn __error() -> *mut ::c_int; + pub fn backtrace(buf: *mut *mut ::c_void, + sz: ::c_int) -> ::c_int; + #[cfg_attr(target_os = "macos", link_name = "statfs$INODE64")] + pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; + #[cfg_attr(target_os = "macos", link_name = "fstatfs$INODE64")] + pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; + pub fn kevent(kq: ::c_int, + changelist: *const ::kevent, + nchanges: ::c_int, + eventlist: *mut ::kevent, + nevents: ::c_int, + timeout: *const ::timespec) -> ::c_int; + pub fn kevent64(kq: ::c_int, + changelist: *const ::kevent64_s, + nchanges: ::c_int, + eventlist: *mut ::kevent64_s, + nevents: ::c_int, + flags: ::c_uint, + timeout: *const ::timespec) -> ::c_int; + pub fn mount(src: *const ::c_char, + target: *const ::c_char, + flags: ::c_int, + data: *mut ::c_void) -> ::c_int; + pub fn ptrace(requeset: ::c_int, + pid: ::pid_t, + addr: *mut ::c_char, + data: ::c_int) -> ::c_int; + pub fn quotactl(special: *const ::c_char, + cmd: ::c_int, + id: ::c_int, + data: *mut ::c_char) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::c_int) -> ::c_int; + pub fn sendfile(fd: ::c_int, + s: ::c_int, + offset: ::off_t, + len: *mut ::off_t, + hdtr: *mut ::sf_hdtr, + flags: ::c_int) -> ::c_int; + pub fn openpty(amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize) -> ::c_int; + pub fn forkpty(amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize) -> ::pid_t; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t) -> ::c_int; + pub fn localeconv_l(loc: ::locale_t) -> *mut lconv; + pub fn newlocale(mask: ::c_int, + locale: *const ::c_char, + base: ::locale_t) -> ::locale_t; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char; + pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; + + pub fn initgroups(user: *const ::c_char, basegroup: ::c_int) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "waitid$UNIX2003")] + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, + options: ::c_int) -> ::c_int; + +} + +cfg_if! { + if #[cfg(any(target_arch = "arm", target_arch = "x86"))] { + mod b32; + pub use self::b32::*; + } else if #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] { + mod b64; + pub use self::b64::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/dragonfly/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/dragonfly/mod.rs new file mode 100644 index 000000000..e60825a52 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/dragonfly/mod.rs @@ -0,0 +1,420 @@ +pub type clock_t = u64; +pub type ino_t = u64; +pub type nlink_t = u32; +pub type blksize_t = i64; +pub type clockid_t = ::c_ulong; + +pub type c_long = i64; +pub type c_ulong = u64; +pub type time_t = i64; +pub type suseconds_t = i64; + +pub type uuid_t = ::uuid; + +pub type fsblkcnt_t = u64; +pub type fsfilcnt_t = u64; + +pub type sem_t = *mut sem; + +pub enum sem {} + +s! { + + pub struct exit_status { + pub e_termination: u16, + pub e_exit: u16 + } + + pub struct utmpx { + pub ut_name: [::c_char; 32], + pub ut_id: [::c_char; 4], + + pub ut_line: [::c_char; 32], + pub ut_host: [::c_char; 256], + + pub ut_unused: [u8; 16], + pub ut_session: u16, + pub ut_type: u16, + pub ut_pid: ::pid_t, + ut_exit: exit_status, + ut_ss: ::sockaddr_storage, + pub ut_tv: ::timeval, + pub ut_unused2: [u8; 16], + } + + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_offset: ::off_t, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: sigevent, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + _aio_val: ::c_int, + _aio_err: ::c_int + } + + pub struct dirent { + pub d_fileno: ::ino_t, + pub d_namlen: u16, + pub d_type: u8, + __unused1: u8, + __unused2: u32, + pub d_name: [::c_char; 256], + } + + pub struct uuid { + pub time_low: u32, + pub time_mid: u16, + pub time_hi_and_version: u16, + pub clock_seq_hi_and_reserved: u8, + pub clock_seq_low: u8, + pub node: [u8; 6], + } + + pub struct sigevent { + pub sigev_notify: ::c_int, + // The union is 8-byte in size, so it is aligned at a 8-byte offset. + #[cfg(target_pointer_width = "64")] + __unused1: ::c_int, + pub sigev_signo: ::c_int, //actually a union + // pad the union + #[cfg(target_pointer_width = "64")] + __unused2: ::c_int, + pub sigev_value: ::sigval, + __unused3: *mut ::c_void //actually a function pointer + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub f_owner: ::uid_t, + pub f_type: ::c_uint, + pub f_syncreads: u64, + pub f_syncwrites: u64, + pub f_asyncreads: u64, + pub f_asyncwrites: u64, + pub f_fsid_uuid: ::uuid_t, + pub f_uid_uuid: ::uuid_t, + } + + pub struct stat { + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_dev: ::dev_t, + pub st_mode: ::mode_t, + pub st_padding1: ::uint16_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::int64_t, + pub st_blksize: ::uint32_t, + pub st_flags: ::uint32_t, + pub st_gen: ::uint32_t, + pub st_lspare: ::int32_t, + pub st_qspare1: ::int64_t, + pub st_qspare2: ::int64_t, + } +} + +pub const RAND_MAX: ::c_int = 0x7fff_ffff; +pub const PTHREAD_STACK_MIN: ::size_t = 1024; +pub const SIGSTKSZ: ::size_t = 40960; +pub const MADV_INVAL: ::c_int = 10; +pub const O_CLOEXEC: ::c_int = 0x00020000; +pub const F_GETLK: ::c_int = 7; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; +pub const ELAST: ::c_int = 99; +pub const RLIMIT_POSIXLOCKS: ::c_int = 11; +pub const RLIM_NLIMITS: ::rlim_t = 12; + +pub const Q_GETQUOTA: ::c_int = 0x300; +pub const Q_SETQUOTA: ::c_int = 0x400; + +pub const CLOCK_REALTIME: clockid_t = 0; +pub const CLOCK_VIRTUAL: clockid_t = 1; +pub const CLOCK_PROF: clockid_t = 2; +pub const CLOCK_MONOTONIC: clockid_t = 4; +pub const CLOCK_UPTIME: clockid_t = 5; +pub const CLOCK_UPTIME_PRECISE: clockid_t = 7; +pub const CLOCK_UPTIME_FAST: clockid_t = 8; +pub const CLOCK_REALTIME_PRECISE: clockid_t = 9; +pub const CLOCK_REALTIME_FAST: clockid_t = 10; +pub const CLOCK_MONOTONIC_PRECISE: clockid_t = 11; +pub const CLOCK_MONOTONIC_FAST: clockid_t = 12; +pub const CLOCK_SECOND: clockid_t = 13; +pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 14; +pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 15; + +pub const CTL_UNSPEC: ::c_int = 0; +pub const CTL_KERN: ::c_int = 1; +pub const CTL_VM: ::c_int = 2; +pub const CTL_VFS: ::c_int = 3; +pub const CTL_NET: ::c_int = 4; +pub const CTL_DEBUG: ::c_int = 5; +pub const CTL_HW: ::c_int = 6; +pub const CTL_MACHDEP: ::c_int = 7; +pub const CTL_USER: ::c_int = 8; +pub const CTL_P1003_1B: ::c_int = 9; +pub const CTL_LWKT: ::c_int = 10; +pub const CTL_MAXID: ::c_int = 11; +pub const KERN_OSTYPE: ::c_int = 1; +pub const KERN_OSRELEASE: ::c_int = 2; +pub const KERN_OSREV: ::c_int = 3; +pub const KERN_VERSION: ::c_int = 4; +pub const KERN_MAXVNODES: ::c_int = 5; +pub const KERN_MAXPROC: ::c_int = 6; +pub const KERN_MAXFILES: ::c_int = 7; +pub const KERN_ARGMAX: ::c_int = 8; +pub const KERN_SECURELVL: ::c_int = 9; +pub const KERN_HOSTNAME: ::c_int = 10; +pub const KERN_HOSTID: ::c_int = 11; +pub const KERN_CLOCKRATE: ::c_int = 12; +pub const KERN_VNODE: ::c_int = 13; +pub const KERN_PROC: ::c_int = 14; +pub const KERN_FILE: ::c_int = 15; +pub const KERN_PROF: ::c_int = 16; +pub const KERN_POSIX1: ::c_int = 17; +pub const KERN_NGROUPS: ::c_int = 18; +pub const KERN_JOB_CONTROL: ::c_int = 19; +pub const KERN_SAVED_IDS: ::c_int = 20; +pub const KERN_BOOTTIME: ::c_int = 21; +pub const KERN_NISDOMAINNAME: ::c_int = 22; +pub const KERN_UPDATEINTERVAL: ::c_int = 23; +pub const KERN_OSRELDATE: ::c_int = 24; +pub const KERN_NTP_PLL: ::c_int = 25; +pub const KERN_BOOTFILE: ::c_int = 26; +pub const KERN_MAXFILESPERPROC: ::c_int = 27; +pub const KERN_MAXPROCPERUID: ::c_int = 28; +pub const KERN_DUMPDEV: ::c_int = 29; +pub const KERN_IPC: ::c_int = 30; +pub const KERN_DUMMY: ::c_int = 31; +pub const KERN_PS_STRINGS: ::c_int = 32; +pub const KERN_USRSTACK: ::c_int = 33; +pub const KERN_LOGSIGEXIT: ::c_int = 34; +pub const KERN_IOV_MAX: ::c_int = 35; +pub const KERN_MAXPOSIXLOCKSPERUID: ::c_int = 36; +pub const KERN_MAXID: ::c_int = 37; +pub const KERN_PROC_ALL: ::c_int = 0; +pub const KERN_PROC_PID: ::c_int = 1; +pub const KERN_PROC_PGRP: ::c_int = 2; +pub const KERN_PROC_SESSION: ::c_int = 3; +pub const KERN_PROC_TTY: ::c_int = 4; +pub const KERN_PROC_UID: ::c_int = 5; +pub const KERN_PROC_RUID: ::c_int = 6; +pub const KERN_PROC_ARGS: ::c_int = 7; +pub const KERN_PROC_CWD: ::c_int = 8; +pub const KERN_PROC_PATHNAME: ::c_int = 9; +pub const KERN_PROC_FLAGMASK: ::c_int = 0x10; +pub const KERN_PROC_FLAG_LWP: ::c_int = 0x10; +pub const KIPC_MAXSOCKBUF: ::c_int = 1; +pub const KIPC_SOCKBUF_WASTE: ::c_int = 2; +pub const KIPC_SOMAXCONN: ::c_int = 3; +pub const KIPC_MAX_LINKHDR: ::c_int = 4; +pub const KIPC_MAX_PROTOHDR: ::c_int = 5; +pub const KIPC_MAX_HDR: ::c_int = 6; +pub const KIPC_MAX_DATALEN: ::c_int = 7; +pub const KIPC_MBSTAT: ::c_int = 8; +pub const KIPC_NMBCLUSTERS: ::c_int = 9; +pub const HW_MACHINE: ::c_int = 1; +pub const HW_MODEL: ::c_int = 2; +pub const HW_NCPU: ::c_int = 3; +pub const HW_BYTEORDER: ::c_int = 4; +pub const HW_PHYSMEM: ::c_int = 5; +pub const HW_USERMEM: ::c_int = 6; +pub const HW_PAGESIZE: ::c_int = 7; +pub const HW_DISKNAMES: ::c_int = 8; +pub const HW_DISKSTATS: ::c_int = 9; +pub const HW_FLOATINGPT: ::c_int = 10; +pub const HW_MACHINE_ARCH: ::c_int = 11; +pub const HW_MACHINE_PLATFORM: ::c_int = 12; +pub const HW_SENSORS: ::c_int = 13; +pub const HW_MAXID: ::c_int = 14; +pub const USER_CS_PATH: ::c_int = 1; +pub const USER_BC_BASE_MAX: ::c_int = 2; +pub const USER_BC_DIM_MAX: ::c_int = 3; +pub const USER_BC_SCALE_MAX: ::c_int = 4; +pub const USER_BC_STRING_MAX: ::c_int = 5; +pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6; +pub const USER_EXPR_NEST_MAX: ::c_int = 7; +pub const USER_LINE_MAX: ::c_int = 8; +pub const USER_RE_DUP_MAX: ::c_int = 9; +pub const USER_POSIX2_VERSION: ::c_int = 10; +pub const USER_POSIX2_C_BIND: ::c_int = 11; +pub const USER_POSIX2_C_DEV: ::c_int = 12; +pub const USER_POSIX2_CHAR_TERM: ::c_int = 13; +pub const USER_POSIX2_FORT_DEV: ::c_int = 14; +pub const USER_POSIX2_FORT_RUN: ::c_int = 15; +pub const USER_POSIX2_LOCALEDEF: ::c_int = 16; +pub const USER_POSIX2_SW_DEV: ::c_int = 17; +pub const USER_POSIX2_UPE: ::c_int = 18; +pub const USER_STREAM_MAX: ::c_int = 19; +pub const USER_TZNAME_MAX: ::c_int = 20; +pub const USER_MAXID: ::c_int = 21; +pub const CTL_P1003_1B_ASYNCHRONOUS_IO: ::c_int = 1; +pub const CTL_P1003_1B_MAPPED_FILES: ::c_int = 2; +pub const CTL_P1003_1B_MEMLOCK: ::c_int = 3; +pub const CTL_P1003_1B_MEMLOCK_RANGE: ::c_int = 4; +pub const CTL_P1003_1B_MEMORY_PROTECTION: ::c_int = 5; +pub const CTL_P1003_1B_MESSAGE_PASSING: ::c_int = 6; +pub const CTL_P1003_1B_PRIORITIZED_IO: ::c_int = 7; +pub const CTL_P1003_1B_PRIORITY_SCHEDULING: ::c_int = 8; +pub const CTL_P1003_1B_REALTIME_SIGNALS: ::c_int = 9; +pub const CTL_P1003_1B_SEMAPHORES: ::c_int = 10; +pub const CTL_P1003_1B_FSYNC: ::c_int = 11; +pub const CTL_P1003_1B_SHARED_MEMORY_OBJECTS: ::c_int = 12; +pub const CTL_P1003_1B_SYNCHRONIZED_IO: ::c_int = 13; +pub const CTL_P1003_1B_TIMERS: ::c_int = 14; +pub const CTL_P1003_1B_AIO_LISTIO_MAX: ::c_int = 15; +pub const CTL_P1003_1B_AIO_MAX: ::c_int = 16; +pub const CTL_P1003_1B_AIO_PRIO_DELTA_MAX: ::c_int = 17; +pub const CTL_P1003_1B_DELAYTIMER_MAX: ::c_int = 18; +pub const CTL_P1003_1B_UNUSED1: ::c_int = 19; +pub const CTL_P1003_1B_PAGESIZE: ::c_int = 20; +pub const CTL_P1003_1B_RTSIG_MAX: ::c_int = 21; +pub const CTL_P1003_1B_SEM_NSEMS_MAX: ::c_int = 22; +pub const CTL_P1003_1B_SEM_VALUE_MAX: ::c_int = 23; +pub const CTL_P1003_1B_SIGQUEUE_MAX: ::c_int = 24; +pub const CTL_P1003_1B_TIMER_MAX: ::c_int = 25; +pub const CTL_P1003_1B_MAXID: ::c_int = 26; + +pub const EVFILT_READ: ::int16_t = -1; +pub const EVFILT_WRITE: ::int16_t = -2; +pub const EVFILT_AIO: ::int16_t = -3; +pub const EVFILT_VNODE: ::int16_t = -4; +pub const EVFILT_PROC: ::int16_t = -5; +pub const EVFILT_SIGNAL: ::int16_t = -6; +pub const EVFILT_TIMER: ::int16_t = -7; +pub const EVFILT_USER: ::int16_t = -9; +pub const EVFILT_FS: ::int16_t = -10; + +pub const EV_ADD: ::uint16_t = 0x1; +pub const EV_DELETE: ::uint16_t = 0x2; +pub const EV_ENABLE: ::uint16_t = 0x4; +pub const EV_DISABLE: ::uint16_t = 0x8; +pub const EV_ONESHOT: ::uint16_t = 0x10; +pub const EV_CLEAR: ::uint16_t = 0x20; +pub const EV_RECEIPT: ::uint16_t = 0x40; +pub const EV_DISPATCH: ::uint16_t = 0x80; +pub const EV_NODATA: ::uint16_t = 0x1000; +pub const EV_FLAG1: ::uint16_t = 0x2000; +pub const EV_ERROR: ::uint16_t = 0x4000; +pub const EV_EOF: ::uint16_t = 0x8000; +pub const EV_SYSFLAGS: ::uint16_t = 0xf000; + +pub const NOTE_TRIGGER: ::uint32_t = 0x01000000; +pub const NOTE_FFNOP: ::uint32_t = 0x00000000; +pub const NOTE_FFAND: ::uint32_t = 0x40000000; +pub const NOTE_FFOR: ::uint32_t = 0x80000000; +pub const NOTE_FFCOPY: ::uint32_t = 0xc0000000; +pub const NOTE_FFCTRLMASK: ::uint32_t = 0xc0000000; +pub const NOTE_FFLAGSMASK: ::uint32_t = 0x00ffffff; +pub const NOTE_LOWAT: ::uint32_t = 0x00000001; +pub const NOTE_OOB: ::uint32_t = 0x00000002; +pub const NOTE_DELETE: ::uint32_t = 0x00000001; +pub const NOTE_WRITE: ::uint32_t = 0x00000002; +pub const NOTE_EXTEND: ::uint32_t = 0x00000004; +pub const NOTE_ATTRIB: ::uint32_t = 0x00000008; +pub const NOTE_LINK: ::uint32_t = 0x00000010; +pub const NOTE_RENAME: ::uint32_t = 0x00000020; +pub const NOTE_REVOKE: ::uint32_t = 0x00000040; +pub const NOTE_EXIT: ::uint32_t = 0x80000000; +pub const NOTE_FORK: ::uint32_t = 0x40000000; +pub const NOTE_EXEC: ::uint32_t = 0x20000000; +pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff; +pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000; +pub const NOTE_TRACK: ::uint32_t = 0x00000001; +pub const NOTE_TRACKERR: ::uint32_t = 0x00000002; +pub const NOTE_CHILD: ::uint32_t = 0x00000004; + +pub const SO_SNDSPACE: ::c_int = 0x100a; +pub const SO_CPUHINT: ::c_int = 0x1030; + +pub const AF_BLUETOOTH: ::c_int = 33; +pub const AF_MPLS: ::c_int = 34; +pub const AF_IEEE80211: ::c_int = 35; +pub const AF_MAX: ::c_int = 36; + +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; +pub const PF_MAX: ::c_int = AF_MAX; + +pub const NET_RT_DUMP: ::c_int = 1; +pub const NET_RT_FLAGS: ::c_int = 2; +pub const NET_RT_IFLIST: ::c_int = 3; +pub const NET_RT_MAXID: ::c_int = 4; + +pub const SOMAXOPT_SIZE: ::c_int = 65536; + +#[doc(hidden)] +pub const NET_MAXID: ::c_int = AF_MAX; + +pub const MSG_UNUSED09: ::c_int = 0x00000200; +pub const MSG_NOSIGNAL: ::c_int = 0x00000400; +pub const MSG_SYNC: ::c_int = 0x00000800; +pub const MSG_CMSG_CLOEXEC: ::c_int = 0x00001000; +pub const MSG_FBLOCKING: ::c_int = 0x00010000; +pub const MSG_FNONBLOCKING: ::c_int = 0x00020000; +pub const MSG_FMASK: ::c_int = 0xFFFF0000; + +pub const EMPTY: ::c_short = 0; +pub const RUN_LVL: ::c_short = 1; +pub const BOOT_TIME: ::c_short = 2; +pub const OLD_TIME: ::c_short = 3; +pub const NEW_TIME: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const USER_PROCESS: ::c_short = 7; +pub const DEAD_PROCESS: ::c_short = 8; + +pub const LC_COLLATE_MASK: ::c_int = (1 << 0); +pub const LC_CTYPE_MASK: ::c_int = (1 << 1); +pub const LC_MONETARY_MASK: ::c_int = (1 << 2); +pub const LC_NUMERIC_MASK: ::c_int = (1 << 3); +pub const LC_TIME_MASK: ::c_int = (1 << 4); +pub const LC_MESSAGES_MASK: ::c_int = (1 << 5); +pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK + | LC_CTYPE_MASK + | LC_MESSAGES_MASK + | LC_MONETARY_MASK + | LC_NUMERIC_MASK + | LC_TIME_MASK; + +pub const TIOCSIG: ::c_uint = 0x2000745f; +pub const BTUARTDISC: ::c_int = 0x7; +pub const TIOCDCDTIMESTAMP: ::c_uint = 0x40107458; +pub const TIOCISPTMASTER: ::c_uint = 0x20007455; +pub const TIOCMODG: ::c_uint = 0x40047403; +pub const TIOCMODS: ::c_ulong = 0x80047404; +pub const TIOCREMOTE: ::c_ulong = 0x80047469; + +extern { + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) + -> ::c_int; + pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; + + pub fn setutxdb(_type: ::c_uint, file: *mut ::c_char) -> ::c_int; + + pub fn aio_waitcomplete(iocbp: *mut *mut aiocb, + timeout: *mut ::timespec) -> ::c_int; + + pub fn freelocale(loc: ::locale_t); +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/aarch64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/aarch64.rs new file mode 100644 index 000000000..a2da8452c --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/aarch64.rs @@ -0,0 +1,30 @@ +pub type c_long = i64; +pub type c_ulong = u64; +pub type time_t = i64; +pub type suseconds_t = i64; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::fflags_t, + pub st_gen: ::uint32_t, + pub st_lspare: ::int32_t, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/mod.rs new file mode 100644 index 000000000..fb113ded3 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/mod.rs @@ -0,0 +1,577 @@ +pub type fflags_t = u32; +pub type clock_t = i32; +pub type ino_t = u32; +pub type lwpid_t = i32; +pub type nlink_t = u16; +pub type blksize_t = u32; +pub type clockid_t = ::c_int; +pub type sem_t = _sem; + +pub type fsblkcnt_t = ::uint64_t; +pub type fsfilcnt_t = ::uint64_t; +pub type idtype_t = ::c_uint; + +pub type key_t = ::c_long; +pub type msglen_t = ::c_ulong; +pub type msgqnum_t = ::c_ulong; + +s! { + pub struct utmpx { + pub ut_type: ::c_short, + pub ut_tv: ::timeval, + pub ut_id: [::c_char; 8], + pub ut_pid: ::pid_t, + pub ut_user: [::c_char; 32], + pub ut_line: [::c_char; 16], + pub ut_host: [::c_char; 128], + pub __ut_spare: [::c_char; 64], + } + + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_offset: ::off_t, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + __unused1: [::c_int; 2], + __unused2: *mut ::c_void, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + // unused 3 through 5 are the __aiocb_private structure + __unused3: ::c_long, + __unused4: ::c_long, + __unused5: *mut ::c_void, + pub aio_sigevent: sigevent + } + + pub struct dirent { + pub d_fileno: u32, + pub d_reclen: u16, + pub d_type: u8, + pub d_namlen: u8, + pub d_name: [::c_char; 256], + } + + pub struct jail { + pub version: u32, + pub path: *mut ::c_char, + pub hostname: *mut ::c_char, + pub jailname: *mut ::c_char, + pub ip4s: ::c_uint, + pub ip6s: ::c_uint, + pub ip4: *mut ::in_addr, + pub ip6: *mut ::in6_addr, + } + + pub struct sigevent { + pub sigev_notify: ::c_int, + pub sigev_signo: ::c_int, + pub sigev_value: ::sigval, + //The rest of the structure is actually a union. We expose only + //sigev_notify_thread_id because it's the most useful union member. + pub sigev_notify_thread_id: ::lwpid_t, + #[cfg(target_pointer_width = "64")] + __unused1: ::c_int, + __unused2: [::c_long; 7] + } + + pub struct statvfs { + pub f_bavail: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_blocks: ::fsblkcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_bsize: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_fsid: ::c_ulong, + pub f_namemax: ::c_ulong, + } + + // internal structure has changed over time + pub struct _sem { + data: [u32; 4], + } + + pub struct ipc_perm { + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub mode: ::mode_t, + pub seq: ::c_ushort, + pub key: ::key_t, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + pub msg_cbytes: ::msglen_t, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::c_int, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + } +} + +pub const SIGEV_THREAD_ID: ::c_int = 4; + +pub const RAND_MAX: ::c_int = 0x7fff_fffd; +pub const PTHREAD_STACK_MIN: ::size_t = 2048; +pub const PTHREAD_MUTEX_ADAPTIVE_NP: ::c_int = 4; +pub const SIGSTKSZ: ::size_t = 34816; +pub const SF_NODISKIO: ::c_int = 0x00000001; +pub const SF_MNOWAIT: ::c_int = 0x00000002; +pub const SF_SYNC: ::c_int = 0x00000004; +pub const O_CLOEXEC: ::c_int = 0x00100000; +pub const F_GETLK: ::c_int = 11; +pub const F_SETLK: ::c_int = 12; +pub const F_SETLKW: ::c_int = 13; +pub const ELAST: ::c_int = 96; +pub const RLIMIT_NPTS: ::c_int = 11; +pub const RLIMIT_SWAP: ::c_int = 12; +pub const RLIM_NLIMITS: ::rlim_t = 13; + +pub const Q_GETQUOTA: ::c_int = 0x700; +pub const Q_SETQUOTA: ::c_int = 0x800; + +pub const POSIX_FADV_NORMAL: ::c_int = 0; +pub const POSIX_FADV_RANDOM: ::c_int = 1; +pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_FADV_WILLNEED: ::c_int = 3; +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const EVFILT_READ: ::int16_t = -1; +pub const EVFILT_WRITE: ::int16_t = -2; +pub const EVFILT_AIO: ::int16_t = -3; +pub const EVFILT_VNODE: ::int16_t = -4; +pub const EVFILT_PROC: ::int16_t = -5; +pub const EVFILT_SIGNAL: ::int16_t = -6; +pub const EVFILT_TIMER: ::int16_t = -7; +pub const EVFILT_FS: ::int16_t = -9; +pub const EVFILT_LIO: ::int16_t = -10; +pub const EVFILT_USER: ::int16_t = -11; + +pub const EV_ADD: ::uint16_t = 0x1; +pub const EV_DELETE: ::uint16_t = 0x2; +pub const EV_ENABLE: ::uint16_t = 0x4; +pub const EV_DISABLE: ::uint16_t = 0x8; +pub const EV_ONESHOT: ::uint16_t = 0x10; +pub const EV_CLEAR: ::uint16_t = 0x20; +pub const EV_RECEIPT: ::uint16_t = 0x40; +pub const EV_DISPATCH: ::uint16_t = 0x80; +pub const EV_DROP: ::uint16_t = 0x1000; +pub const EV_FLAG1: ::uint16_t = 0x2000; +pub const EV_ERROR: ::uint16_t = 0x4000; +pub const EV_EOF: ::uint16_t = 0x8000; +pub const EV_SYSFLAGS: ::uint16_t = 0xf000; + +pub const NOTE_TRIGGER: ::uint32_t = 0x01000000; +pub const NOTE_FFNOP: ::uint32_t = 0x00000000; +pub const NOTE_FFAND: ::uint32_t = 0x40000000; +pub const NOTE_FFOR: ::uint32_t = 0x80000000; +pub const NOTE_FFCOPY: ::uint32_t = 0xc0000000; +pub const NOTE_FFCTRLMASK: ::uint32_t = 0xc0000000; +pub const NOTE_FFLAGSMASK: ::uint32_t = 0x00ffffff; +pub const NOTE_LOWAT: ::uint32_t = 0x00000001; +pub const NOTE_DELETE: ::uint32_t = 0x00000001; +pub const NOTE_WRITE: ::uint32_t = 0x00000002; +pub const NOTE_EXTEND: ::uint32_t = 0x00000004; +pub const NOTE_ATTRIB: ::uint32_t = 0x00000008; +pub const NOTE_LINK: ::uint32_t = 0x00000010; +pub const NOTE_RENAME: ::uint32_t = 0x00000020; +pub const NOTE_REVOKE: ::uint32_t = 0x00000040; +pub const NOTE_EXIT: ::uint32_t = 0x80000000; +pub const NOTE_FORK: ::uint32_t = 0x40000000; +pub const NOTE_EXEC: ::uint32_t = 0x20000000; +pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff; +pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000; +pub const NOTE_TRACK: ::uint32_t = 0x00000001; +pub const NOTE_TRACKERR: ::uint32_t = 0x00000002; +pub const NOTE_CHILD: ::uint32_t = 0x00000004; +pub const NOTE_SECONDS: ::uint32_t = 0x00000001; +pub const NOTE_MSECONDS: ::uint32_t = 0x00000002; +pub const NOTE_USECONDS: ::uint32_t = 0x00000004; +pub const NOTE_NSECONDS: ::uint32_t = 0x00000008; + +pub const MADV_PROTECT: ::c_int = 10; +pub const RUSAGE_THREAD: ::c_int = 1; + +pub const CLOCK_REALTIME: clockid_t = 0; +pub const CLOCK_VIRTUAL: clockid_t = 1; +pub const CLOCK_PROF: clockid_t = 2; +pub const CLOCK_MONOTONIC: clockid_t = 4; +pub const CLOCK_UPTIME: clockid_t = 5; +pub const CLOCK_UPTIME_PRECISE: clockid_t = 7; +pub const CLOCK_UPTIME_FAST: clockid_t = 8; +pub const CLOCK_REALTIME_PRECISE: clockid_t = 9; +pub const CLOCK_REALTIME_FAST: clockid_t = 10; +pub const CLOCK_MONOTONIC_PRECISE: clockid_t = 11; +pub const CLOCK_MONOTONIC_FAST: clockid_t = 12; +pub const CLOCK_SECOND: clockid_t = 13; +pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 14; +pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 15; + +pub const CTL_UNSPEC: ::c_int = 0; +pub const CTL_KERN: ::c_int = 1; +pub const CTL_VM: ::c_int = 2; +pub const CTL_VFS: ::c_int = 3; +pub const CTL_NET: ::c_int = 4; +pub const CTL_DEBUG: ::c_int = 5; +pub const CTL_HW: ::c_int = 6; +pub const CTL_MACHDEP: ::c_int = 7; +pub const CTL_USER: ::c_int = 8; +pub const CTL_P1003_1B: ::c_int = 9; +pub const KERN_OSTYPE: ::c_int = 1; +pub const KERN_OSRELEASE: ::c_int = 2; +pub const KERN_OSREV: ::c_int = 3; +pub const KERN_VERSION: ::c_int = 4; +pub const KERN_MAXVNODES: ::c_int = 5; +pub const KERN_MAXPROC: ::c_int = 6; +pub const KERN_MAXFILES: ::c_int = 7; +pub const KERN_ARGMAX: ::c_int = 8; +pub const KERN_SECURELVL: ::c_int = 9; +pub const KERN_HOSTNAME: ::c_int = 10; +pub const KERN_HOSTID: ::c_int = 11; +pub const KERN_CLOCKRATE: ::c_int = 12; +pub const KERN_VNODE: ::c_int = 13; +pub const KERN_PROC: ::c_int = 14; +pub const KERN_FILE: ::c_int = 15; +pub const KERN_PROF: ::c_int = 16; +pub const KERN_POSIX1: ::c_int = 17; +pub const KERN_NGROUPS: ::c_int = 18; +pub const KERN_JOB_CONTROL: ::c_int = 19; +pub const KERN_SAVED_IDS: ::c_int = 20; +pub const KERN_BOOTTIME: ::c_int = 21; +pub const KERN_NISDOMAINNAME: ::c_int = 22; +pub const KERN_UPDATEINTERVAL: ::c_int = 23; +pub const KERN_OSRELDATE: ::c_int = 24; +pub const KERN_NTP_PLL: ::c_int = 25; +pub const KERN_BOOTFILE: ::c_int = 26; +pub const KERN_MAXFILESPERPROC: ::c_int = 27; +pub const KERN_MAXPROCPERUID: ::c_int = 28; +pub const KERN_DUMPDEV: ::c_int = 29; +pub const KERN_IPC: ::c_int = 30; +pub const KERN_DUMMY: ::c_int = 31; +pub const KERN_PS_STRINGS: ::c_int = 32; +pub const KERN_USRSTACK: ::c_int = 33; +pub const KERN_LOGSIGEXIT: ::c_int = 34; +pub const KERN_IOV_MAX: ::c_int = 35; +pub const KERN_HOSTUUID: ::c_int = 36; +pub const KERN_ARND: ::c_int = 37; +pub const KERN_PROC_ALL: ::c_int = 0; +pub const KERN_PROC_PID: ::c_int = 1; +pub const KERN_PROC_PGRP: ::c_int = 2; +pub const KERN_PROC_SESSION: ::c_int = 3; +pub const KERN_PROC_TTY: ::c_int = 4; +pub const KERN_PROC_UID: ::c_int = 5; +pub const KERN_PROC_RUID: ::c_int = 6; +pub const KERN_PROC_ARGS: ::c_int = 7; +pub const KERN_PROC_PROC: ::c_int = 8; +pub const KERN_PROC_SV_NAME: ::c_int = 9; +pub const KERN_PROC_RGID: ::c_int = 10; +pub const KERN_PROC_GID: ::c_int = 11; +pub const KERN_PROC_PATHNAME: ::c_int = 12; +pub const KERN_PROC_OVMMAP: ::c_int = 13; +pub const KERN_PROC_OFILEDESC: ::c_int = 14; +pub const KERN_PROC_KSTACK: ::c_int = 15; +pub const KERN_PROC_INC_THREAD: ::c_int = 0x10; +pub const KERN_PROC_VMMAP: ::c_int = 32; +pub const KERN_PROC_FILEDESC: ::c_int = 33; +pub const KERN_PROC_GROUPS: ::c_int = 34; +pub const KERN_PROC_ENV: ::c_int = 35; +pub const KERN_PROC_AUXV: ::c_int = 36; +pub const KERN_PROC_RLIMIT: ::c_int = 37; +pub const KERN_PROC_PS_STRINGS: ::c_int = 38; +pub const KERN_PROC_UMASK: ::c_int = 39; +pub const KERN_PROC_OSREL: ::c_int = 40; +pub const KERN_PROC_SIGTRAMP: ::c_int = 41; +pub const KIPC_MAXSOCKBUF: ::c_int = 1; +pub const KIPC_SOCKBUF_WASTE: ::c_int = 2; +pub const KIPC_SOMAXCONN: ::c_int = 3; +pub const KIPC_MAX_LINKHDR: ::c_int = 4; +pub const KIPC_MAX_PROTOHDR: ::c_int = 5; +pub const KIPC_MAX_HDR: ::c_int = 6; +pub const KIPC_MAX_DATALEN: ::c_int = 7; +pub const HW_MACHINE: ::c_int = 1; +pub const HW_MODEL: ::c_int = 2; +pub const HW_NCPU: ::c_int = 3; +pub const HW_BYTEORDER: ::c_int = 4; +pub const HW_PHYSMEM: ::c_int = 5; +pub const HW_USERMEM: ::c_int = 6; +pub const HW_PAGESIZE: ::c_int = 7; +pub const HW_DISKNAMES: ::c_int = 8; +pub const HW_DISKSTATS: ::c_int = 9; +pub const HW_FLOATINGPT: ::c_int = 10; +pub const HW_MACHINE_ARCH: ::c_int = 11; +pub const HW_REALMEM: ::c_int = 12; +pub const USER_CS_PATH: ::c_int = 1; +pub const USER_BC_BASE_MAX: ::c_int = 2; +pub const USER_BC_DIM_MAX: ::c_int = 3; +pub const USER_BC_SCALE_MAX: ::c_int = 4; +pub const USER_BC_STRING_MAX: ::c_int = 5; +pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6; +pub const USER_EXPR_NEST_MAX: ::c_int = 7; +pub const USER_LINE_MAX: ::c_int = 8; +pub const USER_RE_DUP_MAX: ::c_int = 9; +pub const USER_POSIX2_VERSION: ::c_int = 10; +pub const USER_POSIX2_C_BIND: ::c_int = 11; +pub const USER_POSIX2_C_DEV: ::c_int = 12; +pub const USER_POSIX2_CHAR_TERM: ::c_int = 13; +pub const USER_POSIX2_FORT_DEV: ::c_int = 14; +pub const USER_POSIX2_FORT_RUN: ::c_int = 15; +pub const USER_POSIX2_LOCALEDEF: ::c_int = 16; +pub const USER_POSIX2_SW_DEV: ::c_int = 17; +pub const USER_POSIX2_UPE: ::c_int = 18; +pub const USER_STREAM_MAX: ::c_int = 19; +pub const USER_TZNAME_MAX: ::c_int = 20; +pub const CTL_P1003_1B_ASYNCHRONOUS_IO: ::c_int = 1; +pub const CTL_P1003_1B_MAPPED_FILES: ::c_int = 2; +pub const CTL_P1003_1B_MEMLOCK: ::c_int = 3; +pub const CTL_P1003_1B_MEMLOCK_RANGE: ::c_int = 4; +pub const CTL_P1003_1B_MEMORY_PROTECTION: ::c_int = 5; +pub const CTL_P1003_1B_MESSAGE_PASSING: ::c_int = 6; +pub const CTL_P1003_1B_PRIORITIZED_IO: ::c_int = 7; +pub const CTL_P1003_1B_PRIORITY_SCHEDULING: ::c_int = 8; +pub const CTL_P1003_1B_REALTIME_SIGNALS: ::c_int = 9; +pub const CTL_P1003_1B_SEMAPHORES: ::c_int = 10; +pub const CTL_P1003_1B_FSYNC: ::c_int = 11; +pub const CTL_P1003_1B_SHARED_MEMORY_OBJECTS: ::c_int = 12; +pub const CTL_P1003_1B_SYNCHRONIZED_IO: ::c_int = 13; +pub const CTL_P1003_1B_TIMERS: ::c_int = 14; +pub const CTL_P1003_1B_AIO_LISTIO_MAX: ::c_int = 15; +pub const CTL_P1003_1B_AIO_MAX: ::c_int = 16; +pub const CTL_P1003_1B_AIO_PRIO_DELTA_MAX: ::c_int = 17; +pub const CTL_P1003_1B_DELAYTIMER_MAX: ::c_int = 18; +pub const CTL_P1003_1B_MQ_OPEN_MAX: ::c_int = 19; +pub const CTL_P1003_1B_PAGESIZE: ::c_int = 20; +pub const CTL_P1003_1B_RTSIG_MAX: ::c_int = 21; +pub const CTL_P1003_1B_SEM_NSEMS_MAX: ::c_int = 22; +pub const CTL_P1003_1B_SEM_VALUE_MAX: ::c_int = 23; +pub const CTL_P1003_1B_SIGQUEUE_MAX: ::c_int = 24; +pub const CTL_P1003_1B_TIMER_MAX: ::c_int = 25; +pub const TIOCGPTN: ::c_uint = 0x4004740f; +pub const TIOCPTMASTER: ::c_uint = 0x2000741c; +pub const TIOCSIG: ::c_uint = 0x2004745f; +pub const TIOCM_DCD: ::c_int = 0x40; +pub const H4DISC: ::c_int = 0x7; + +pub const JAIL_API_VERSION: u32 = 2; +pub const JAIL_CREATE: ::c_int = 0x01; +pub const JAIL_UPDATE: ::c_int = 0x02; +pub const JAIL_ATTACH: ::c_int = 0x04; +pub const JAIL_DYING: ::c_int = 0x08; +pub const JAIL_SET_MASK: ::c_int = 0x0f; +pub const JAIL_GET_MASK: ::c_int = 0x08; +pub const JAIL_SYS_DISABLE: ::c_int = 0; +pub const JAIL_SYS_NEW: ::c_int = 1; +pub const JAIL_SYS_INHERIT: ::c_int = 2; + +pub const SO_BINTIME: ::c_int = 0x2000; +pub const SO_NO_OFFLOAD: ::c_int = 0x4000; +pub const SO_NO_DDP: ::c_int = 0x8000; +pub const SO_LABEL: ::c_int = 0x1009; +pub const SO_PEERLABEL: ::c_int = 0x1010; +pub const SO_LISTENQLIMIT: ::c_int = 0x1011; +pub const SO_LISTENQLEN: ::c_int = 0x1012; +pub const SO_LISTENINCQLEN: ::c_int = 0x1013; +pub const SO_SETFIB: ::c_int = 0x1014; +pub const SO_USER_COOKIE: ::c_int = 0x1015; +pub const SO_PROTOCOL: ::c_int = 0x1016; +pub const SO_PROTOTYPE: ::c_int = SO_PROTOCOL; +pub const SO_VENDOR: ::c_int = 0x80000000; + +pub const AF_SLOW: ::c_int = 33; +pub const AF_SCLUSTER: ::c_int = 34; +pub const AF_ARP: ::c_int = 35; +pub const AF_BLUETOOTH: ::c_int = 36; +pub const AF_IEEE80211: ::c_int = 37; +pub const AF_INET_SDP: ::c_int = 40; +pub const AF_INET6_SDP: ::c_int = 42; +#[doc(hidden)] +pub const AF_MAX: ::c_int = 42; + +pub const IPPROTO_DIVERT: ::c_int = 258; + +pub const PF_SLOW: ::c_int = AF_SLOW; +pub const PF_SCLUSTER: ::c_int = AF_SCLUSTER; +pub const PF_ARP: ::c_int = AF_ARP; +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; +pub const PF_IEEE80211: ::c_int = AF_IEEE80211; +pub const PF_INET_SDP: ::c_int = AF_INET_SDP; +pub const PF_INET6_SDP: ::c_int = AF_INET6_SDP; +#[doc(hidden)] +pub const PF_MAX: ::c_int = AF_MAX; + +pub const NET_RT_DUMP: ::c_int = 1; +pub const NET_RT_FLAGS: ::c_int = 2; +pub const NET_RT_IFLIST: ::c_int = 3; +pub const NET_RT_IFMALIST: ::c_int = 4; +pub const NET_RT_IFLISTL: ::c_int = 5; + +// System V IPC +pub const IPC_PRIVATE: ::key_t = 0; +pub const IPC_CREAT: ::c_int = 0o1000; +pub const IPC_EXCL: ::c_int = 0o2000; +pub const IPC_NOWAIT: ::c_int = 0o4000; +pub const IPC_RMID: ::c_int = 0; +pub const IPC_SET: ::c_int = 1; +pub const IPC_STAT: ::c_int = 2; +pub const IPC_INFO: ::c_int = 3; +pub const IPC_R : ::c_int = 0o400; +pub const IPC_W : ::c_int = 0o200; +pub const IPC_M : ::c_int = 0o10000; +pub const MSG_NOERROR: ::c_int = 0o10000; +pub const SHM_RDONLY: ::c_int = 0o10000; +pub const SHM_RND: ::c_int = 0o20000; +pub const SHM_R: ::c_int = 0o400; +pub const SHM_W: ::c_int = 0o200; +pub const SHM_LOCK: ::c_int = 11; +pub const SHM_UNLOCK: ::c_int = 12; +pub const SHM_STAT: ::c_int = 13; +pub const SHM_INFO: ::c_int = 14; + +// The *_MAXID constants never should've been used outside of the +// FreeBSD base system. And with the exception of CTL_P1003_1B_MAXID, +// they were all removed in svn r262489. They remain here for backwards +// compatibility only, and are scheduled to be removed in libc 1.0.0. +#[doc(hidden)] +pub const NET_MAXID: ::c_int = AF_MAX; +#[doc(hidden)] +pub const CTL_MAXID: ::c_int = 10; +#[doc(hidden)] +pub const KERN_MAXID: ::c_int = 38; +#[doc(hidden)] +pub const HW_MAXID: ::c_int = 13; +#[doc(hidden)] +pub const USER_MAXID: ::c_int = 21; +#[doc(hidden)] +pub const CTL_P1003_1B_MAXID: ::c_int = 26; + +pub const MSG_NOTIFICATION: ::c_int = 0x00002000; +pub const MSG_NBIO: ::c_int = 0x00004000; +pub const MSG_COMPAT: ::c_int = 0x00008000; +pub const MSG_CMSG_CLOEXEC: ::c_int = 0x00040000; +pub const MSG_NOSIGNAL: ::c_int = 0x20000; + +pub const EMPTY: ::c_short = 0; +pub const BOOT_TIME: ::c_short = 1; +pub const OLD_TIME: ::c_short = 2; +pub const NEW_TIME: ::c_short = 3; +pub const USER_PROCESS: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const DEAD_PROCESS: ::c_short = 7; +pub const SHUTDOWN_TIME: ::c_short = 8; + +pub const LC_COLLATE_MASK: ::c_int = (1 << 0); +pub const LC_CTYPE_MASK: ::c_int = (1 << 1); +pub const LC_MESSAGES_MASK: ::c_int = (1 << 2); +pub const LC_MONETARY_MASK: ::c_int = (1 << 3); +pub const LC_NUMERIC_MASK: ::c_int = (1 << 4); +pub const LC_TIME_MASK: ::c_int = (1 << 5); +pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK + | LC_CTYPE_MASK + | LC_MESSAGES_MASK + | LC_MONETARY_MASK + | LC_NUMERIC_MASK + | LC_TIME_MASK; + +pub const WSTOPPED: ::c_int = 2; // same as WUNTRACED +pub const WCONTINUED: ::c_int = 4; +pub const WNOWAIT: ::c_int = 8; +pub const WEXITED: ::c_int = 16; +pub const WTRAPPED: ::c_int = 32; + +// FreeBSD defines a great many more of these, we only expose the +// standardized ones. +pub const P_PID: idtype_t = 0; +pub const P_PGID: idtype_t = 2; +pub const P_ALL: idtype_t = 7; + +pub const B460800: ::speed_t = 460800; +pub const B921600: ::speed_t = 921600; + +extern { + pub fn __error() -> *mut ::c_int; + + pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int) + -> ::c_int; + + pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; + + pub fn jail(jail: *mut ::jail) -> ::c_int; + pub fn jail_attach(jid: ::c_int) -> ::c_int; + pub fn jail_remove(jid: ::c_int) -> ::c_int; + pub fn jail_get(iov: *mut ::iovec, niov: ::c_uint, flags: ::c_int) + -> ::c_int; + pub fn jail_set(iov: *mut ::iovec, niov: ::c_uint, flags: ::c_int) + -> ::c_int; + + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, + len: ::off_t) -> ::c_int; + pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, + advise: ::c_int) -> ::c_int; + pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; + pub fn mkostemps(template: *mut ::c_char, + suffixlen: ::c_int, + flags: ::c_int) -> ::c_int; + + pub fn getutxuser(user: *const ::c_char) -> *mut utmpx; + pub fn setutxdb(_type: ::c_int, file: *const ::c_char) -> ::c_int; + + pub fn aio_waitcomplete(iocbp: *mut *mut aiocb, + timeout: *mut ::timespec) -> ::ssize_t; + + pub fn freelocale(loc: ::locale_t) -> ::c_int; + pub fn waitid(idtype: idtype_t, id: ::id_t, infop: *mut ::siginfo_t, + options: ::c_int) -> ::c_int; + + pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t; + pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + pub fn shmat(shmid: ::c_int, shmaddr: *const ::c_void, + shmflg: ::c_int) -> *mut ::c_void; + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + pub fn shmctl(shmid: ::c_int, cmd: ::c_int, + buf: *mut ::shmid_ds) -> ::c_int; + pub fn msgctl(msqid: ::c_int, cmd: ::c_int, + buf: *mut ::msqid_ds) -> ::c_int; + pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int; + pub fn msgrcv(msqid: ::c_int, msgp: *mut ::c_void, msgsz: ::size_t, + msgtyp: ::c_long, msgflg: ::c_int) -> ::c_int; + pub fn msgsnd(msqid: ::c_int, msgp: *const ::c_void, msgsz: ::size_t, + msgflg: ::c_int) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_arch = "x86")] { + mod x86; + pub use self::x86::*; + } else if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86.rs new file mode 100644 index 000000000..8a5e5f9fb --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86.rs @@ -0,0 +1,31 @@ +pub type c_long = i32; +pub type c_ulong = u32; +pub type time_t = i32; +pub type suseconds_t = i32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::fflags_t, + pub st_gen: ::uint32_t, + pub st_lspare: ::int32_t, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + __unused: [u8; 8], + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86_64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86_64.rs new file mode 100644 index 000000000..a2da8452c --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86_64.rs @@ -0,0 +1,30 @@ +pub type c_long = i64; +pub type c_ulong = u64; +pub type time_t = i64; +pub type suseconds_t = i64; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::fflags_t, + pub st_gen: ::uint32_t, + pub st_lspare: ::int32_t, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/mod.rs new file mode 100644 index 000000000..5cfa3b114 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/mod.rs @@ -0,0 +1,1041 @@ +pub type dev_t = u32; +pub type mode_t = u16; +pub type pthread_attr_t = *mut ::c_void; +pub type rlim_t = i64; +pub type pthread_mutex_t = *mut ::c_void; +pub type pthread_mutexattr_t = *mut ::c_void; +pub type pthread_cond_t = *mut ::c_void; +pub type pthread_condattr_t = *mut ::c_void; +pub type pthread_rwlock_t = *mut ::c_void; +pub type pthread_key_t = ::c_int; +pub type tcflag_t = ::c_uint; +pub type speed_t = ::c_uint; +pub type nl_item = ::c_int; +pub type id_t = i64; + +pub enum timezone {} + +s! { + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_matchc: ::size_t, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + pub gl_pathv: *mut *mut ::c_char, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + __unused8: *mut ::c_void, + } + + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: ::c_short, + pub flags: ::c_ushort, + pub fflags: ::c_uint, + pub data: ::intptr_t, + pub udata: *mut ::c_void, + } + + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: ::sa_family_t, + __ss_pad1: [u8; 6], + __ss_align: i64, + __ss_pad2: [u8; 112], + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: ::socklen_t, + pub ai_canonname: *mut ::c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut addrinfo, + } + + pub struct sigset_t { + bits: [u32; 4], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub si_pid: ::pid_t, + pub si_uid: ::uid_t, + pub si_status: ::c_int, + pub si_addr: *mut ::c_void, + _pad: [::c_int; 12], + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_flags: ::c_int, + pub sa_mask: sigset_t, + } + + pub struct stack_t { + // In FreeBSD 11 and later, ss_sp is actually a void* + pub ss_sp: *mut ::c_char, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct sched_param { + pub sched_priority: ::c_int, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::c_char; 8], + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_cc: [::cc_t; ::NCCS], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } + + pub struct flock { + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + pub l_type: ::c_short, + pub l_whence: ::c_short, + #[cfg(not(target_os = "dragonfly"))] + pub l_sysid: ::c_int, + } + + pub struct sf_hdtr { + pub headers: *mut ::iovec, + pub hdr_cnt: ::c_int, + pub trailers: *mut ::iovec, + pub trl_cnt: ::c_int, + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } +} + +pub const AIO_LISTIO_MAX: ::c_int = 16; +pub const AIO_CANCELED: ::c_int = 1; +pub const AIO_NOTCANCELED: ::c_int = 2; +pub const AIO_ALLDONE: ::c_int = 3; +pub const LIO_NOP: ::c_int = 0; +pub const LIO_WRITE: ::c_int = 1; +pub const LIO_READ: ::c_int = 2; +pub const LIO_WAIT: ::c_int = 1; +pub const LIO_NOWAIT: ::c_int = 0; + +pub const SIGEV_NONE: ::c_int = 0; +pub const SIGEV_SIGNAL: ::c_int = 1; +pub const SIGEV_THREAD: ::c_int = 2; +pub const SIGEV_KEVENT: ::c_int = 3; + +pub const CODESET: ::nl_item = 0; +pub const D_T_FMT: ::nl_item = 1; +pub const D_FMT: ::nl_item = 2; +pub const T_FMT: ::nl_item = 3; +pub const T_FMT_AMPM: ::nl_item = 4; +pub const AM_STR: ::nl_item = 5; +pub const PM_STR: ::nl_item = 6; + +pub const DAY_1: ::nl_item = 7; +pub const DAY_2: ::nl_item = 8; +pub const DAY_3: ::nl_item = 9; +pub const DAY_4: ::nl_item = 10; +pub const DAY_5: ::nl_item = 11; +pub const DAY_6: ::nl_item = 12; +pub const DAY_7: ::nl_item = 13; + +pub const ABDAY_1: ::nl_item = 14; +pub const ABDAY_2: ::nl_item = 15; +pub const ABDAY_3: ::nl_item = 16; +pub const ABDAY_4: ::nl_item = 17; +pub const ABDAY_5: ::nl_item = 18; +pub const ABDAY_6: ::nl_item = 19; +pub const ABDAY_7: ::nl_item = 20; + +pub const MON_1: ::nl_item = 21; +pub const MON_2: ::nl_item = 22; +pub const MON_3: ::nl_item = 23; +pub const MON_4: ::nl_item = 24; +pub const MON_5: ::nl_item = 25; +pub const MON_6: ::nl_item = 26; +pub const MON_7: ::nl_item = 27; +pub const MON_8: ::nl_item = 28; +pub const MON_9: ::nl_item = 29; +pub const MON_10: ::nl_item = 30; +pub const MON_11: ::nl_item = 31; +pub const MON_12: ::nl_item = 32; + +pub const ABMON_1: ::nl_item = 33; +pub const ABMON_2: ::nl_item = 34; +pub const ABMON_3: ::nl_item = 35; +pub const ABMON_4: ::nl_item = 36; +pub const ABMON_5: ::nl_item = 37; +pub const ABMON_6: ::nl_item = 38; +pub const ABMON_7: ::nl_item = 39; +pub const ABMON_8: ::nl_item = 40; +pub const ABMON_9: ::nl_item = 41; +pub const ABMON_10: ::nl_item = 42; +pub const ABMON_11: ::nl_item = 43; +pub const ABMON_12: ::nl_item = 44; + +pub const ERA: ::nl_item = 45; +pub const ERA_D_FMT: ::nl_item = 46; +pub const ERA_D_T_FMT: ::nl_item = 47; +pub const ERA_T_FMT: ::nl_item = 48; +pub const ALT_DIGITS: ::nl_item = 49; + +pub const RADIXCHAR: ::nl_item = 50; +pub const THOUSEP: ::nl_item = 51; + +pub const YESEXPR: ::nl_item = 52; +pub const NOEXPR: ::nl_item = 53; + +pub const YESSTR: ::nl_item = 54; +pub const NOSTR: ::nl_item = 55; + +pub const CRNCYSTR: ::nl_item = 56; + +pub const D_MD_ORDER: ::nl_item = 57; + +pub const ALTMON_1: ::nl_item = 58; +pub const ALTMON_2: ::nl_item = 59; +pub const ALTMON_3: ::nl_item = 60; +pub const ALTMON_4: ::nl_item = 61; +pub const ALTMON_5: ::nl_item = 62; +pub const ALTMON_6: ::nl_item = 63; +pub const ALTMON_7: ::nl_item = 64; +pub const ALTMON_8: ::nl_item = 65; +pub const ALTMON_9: ::nl_item = 66; +pub const ALTMON_10: ::nl_item = 67; +pub const ALTMON_11: ::nl_item = 68; +pub const ALTMON_12: ::nl_item = 69; + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 2; +pub const _IOLBF: ::c_int = 1; +pub const BUFSIZ: ::c_uint = 1024; +pub const FOPEN_MAX: ::c_uint = 20; +pub const FILENAME_MAX: ::c_uint = 1024; +pub const L_tmpnam: ::c_uint = 1024; +pub const TMP_MAX: ::c_uint = 308915776; + +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; +pub const O_ACCMODE: ::c_int = 3; +pub const O_APPEND: ::c_int = 8; +pub const O_CREAT: ::c_int = 512; +pub const O_EXCL: ::c_int = 2048; +pub const O_NOCTTY: ::c_int = 32768; +pub const O_TRUNC: ::c_int = 1024; +pub const S_IFIFO: mode_t = 4096; +pub const S_IFCHR: mode_t = 8192; +pub const S_IFBLK: mode_t = 24576; +pub const S_IFDIR: mode_t = 16384; +pub const S_IFREG: mode_t = 32768; +pub const S_IFLNK: mode_t = 40960; +pub const S_IFSOCK: mode_t = 49152; +pub const S_IFMT: mode_t = 61440; +pub const S_IEXEC: mode_t = 64; +pub const S_IWRITE: mode_t = 128; +pub const S_IREAD: mode_t = 256; +pub const S_IRWXU: mode_t = 448; +pub const S_IXUSR: mode_t = 64; +pub const S_IWUSR: mode_t = 128; +pub const S_IRUSR: mode_t = 256; +pub const S_IRWXG: mode_t = 56; +pub const S_IXGRP: mode_t = 8; +pub const S_IWGRP: mode_t = 16; +pub const S_IRGRP: mode_t = 32; +pub const S_IRWXO: mode_t = 7; +pub const S_IXOTH: mode_t = 1; +pub const S_IWOTH: mode_t = 2; +pub const S_IROTH: mode_t = 4; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; +pub const F_DUPFD_CLOEXEC: ::c_int = 17; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const MAP_FILE: ::c_int = 0x0000; +pub const MAP_SHARED: ::c_int = 0x0001; +pub const MAP_PRIVATE: ::c_int = 0x0002; +pub const MAP_FIXED: ::c_int = 0x0010; +pub const MAP_ANON: ::c_int = 0x1000; + +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const MS_SYNC: ::c_int = 0x0000; +pub const MS_ASYNC: ::c_int = 0x0001; +pub const MS_INVALIDATE: ::c_int = 0x0002; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EDEADLK: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EAGAIN: ::c_int = 35; +pub const EWOULDBLOCK: ::c_int = 35; +pub const EINPROGRESS: ::c_int = 36; +pub const EALREADY: ::c_int = 37; +pub const ENOTSOCK: ::c_int = 38; +pub const EDESTADDRREQ: ::c_int = 39; +pub const EMSGSIZE: ::c_int = 40; +pub const EPROTOTYPE: ::c_int = 41; +pub const ENOPROTOOPT: ::c_int = 42; +pub const EPROTONOSUPPORT: ::c_int = 43; +pub const ESOCKTNOSUPPORT: ::c_int = 44; +pub const EOPNOTSUPP: ::c_int = 45; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 46; +pub const EAFNOSUPPORT: ::c_int = 47; +pub const EADDRINUSE: ::c_int = 48; +pub const EADDRNOTAVAIL: ::c_int = 49; +pub const ENETDOWN: ::c_int = 50; +pub const ENETUNREACH: ::c_int = 51; +pub const ENETRESET: ::c_int = 52; +pub const ECONNABORTED: ::c_int = 53; +pub const ECONNRESET: ::c_int = 54; +pub const ENOBUFS: ::c_int = 55; +pub const EISCONN: ::c_int = 56; +pub const ENOTCONN: ::c_int = 57; +pub const ESHUTDOWN: ::c_int = 58; +pub const ETOOMANYREFS: ::c_int = 59; +pub const ETIMEDOUT: ::c_int = 60; +pub const ECONNREFUSED: ::c_int = 61; +pub const ELOOP: ::c_int = 62; +pub const ENAMETOOLONG: ::c_int = 63; +pub const EHOSTDOWN: ::c_int = 64; +pub const EHOSTUNREACH: ::c_int = 65; +pub const ENOTEMPTY: ::c_int = 66; +pub const EPROCLIM: ::c_int = 67; +pub const EUSERS: ::c_int = 68; +pub const EDQUOT: ::c_int = 69; +pub const ESTALE: ::c_int = 70; +pub const EREMOTE: ::c_int = 71; +pub const EBADRPC: ::c_int = 72; +pub const ERPCMISMATCH: ::c_int = 73; +pub const EPROGUNAVAIL: ::c_int = 74; +pub const EPROGMISMATCH: ::c_int = 75; +pub const EPROCUNAVAIL: ::c_int = 76; +pub const ENOLCK: ::c_int = 77; +pub const ENOSYS: ::c_int = 78; +pub const EFTYPE: ::c_int = 79; +pub const EAUTH: ::c_int = 80; +pub const ENEEDAUTH: ::c_int = 81; +pub const EIDRM: ::c_int = 82; +pub const ENOMSG: ::c_int = 83; +pub const EOVERFLOW: ::c_int = 84; +pub const ECANCELED: ::c_int = 85; +pub const EILSEQ: ::c_int = 86; +pub const ENOATTR: ::c_int = 87; +pub const EDOOFUS: ::c_int = 88; +pub const EBADMSG: ::c_int = 89; +pub const EMULTIHOP: ::c_int = 90; +pub const ENOLINK: ::c_int = 91; +pub const EPROTO: ::c_int = 92; + +pub const EAI_SYSTEM: ::c_int = 11; + +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; + +pub const AT_EACCESS: ::c_int = 0x100; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x200; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400; +pub const AT_REMOVEDIR: ::c_int = 0x800; + +pub const SIGTRAP: ::c_int = 5; + +pub const GLOB_APPEND : ::c_int = 0x0001; +pub const GLOB_DOOFFS : ::c_int = 0x0002; +pub const GLOB_ERR : ::c_int = 0x0004; +pub const GLOB_MARK : ::c_int = 0x0008; +pub const GLOB_NOCHECK : ::c_int = 0x0010; +pub const GLOB_NOSORT : ::c_int = 0x0020; +pub const GLOB_NOESCAPE: ::c_int = 0x2000; + +pub const GLOB_NOSPACE : ::c_int = -1; +pub const GLOB_ABORTED : ::c_int = -2; +pub const GLOB_NOMATCH : ::c_int = -3; + +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; + +pub const _SC_IOV_MAX: ::c_int = 56; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 70; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 71; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 73; +pub const _SC_MQ_PRIO_MAX: ::c_int = 75; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 58; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 82; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 83; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 85; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 86; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 87; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 88; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 89; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 90; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 91; +pub const _SC_THREAD_STACK_MIN: ::c_int = 93; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 94; +pub const _SC_THREADS: ::c_int = 96; +pub const _SC_TTY_NAME_MAX: ::c_int = 101; +pub const _SC_ATEXIT_MAX: ::c_int = 107; +pub const _SC_XOPEN_CRYPT: ::c_int = 108; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 109; +pub const _SC_XOPEN_LEGACY: ::c_int = 110; +pub const _SC_XOPEN_REALTIME: ::c_int = 111; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 112; +pub const _SC_XOPEN_SHM: ::c_int = 113; +pub const _SC_XOPEN_UNIX: ::c_int = 115; +pub const _SC_XOPEN_VERSION: ::c_int = 116; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 117; + +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_MEMLOCK: ::c_int = 6; +pub const RLIMIT_NPROC: ::c_int = 7; +pub const RLIMIT_NOFILE: ::c_int = 8; +pub const RLIMIT_SBSIZE: ::c_int = 9; +pub const RLIMIT_VMEM: ::c_int = 10; +pub const RLIMIT_AS: ::c_int = RLIMIT_VMEM; +pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff; + +pub const RUSAGE_SELF: ::c_int = 0; +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; +pub const MADV_FREE: ::c_int = 5; +pub const MADV_NOSYNC: ::c_int = 6; +pub const MADV_AUTOSYNC: ::c_int = 7; +pub const MADV_NOCORE: ::c_int = 8; +pub const MADV_CORE: ::c_int = 9; + +pub const MINCORE_INCORE: ::c_int = 0x1; +pub const MINCORE_REFERENCED: ::c_int = 0x2; +pub const MINCORE_MODIFIED: ::c_int = 0x4; +pub const MINCORE_REFERENCED_OTHER: ::c_int = 0x8; +pub const MINCORE_MODIFIED_OTHER: ::c_int = 0x10; +pub const MINCORE_SUPER: ::c_int = 0x20; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_LOCAL: ::c_int = 1; +pub const AF_UNIX: ::c_int = AF_LOCAL; +pub const AF_INET: ::c_int = 2; +pub const AF_IMPLINK: ::c_int = 3; +pub const AF_PUP: ::c_int = 4; +pub const AF_CHAOS: ::c_int = 5; +pub const AF_NETBIOS: ::c_int = 6; +pub const AF_ISO: ::c_int = 7; +pub const AF_OSI: ::c_int = AF_ISO; +pub const AF_ECMA: ::c_int = 8; +pub const AF_DATAKIT: ::c_int = 9; +pub const AF_CCITT: ::c_int = 10; +pub const AF_SNA: ::c_int = 11; +pub const AF_DECnet: ::c_int = 12; +pub const AF_DLI: ::c_int = 13; +pub const AF_LAT: ::c_int = 14; +pub const AF_HYLINK: ::c_int = 15; +pub const AF_APPLETALK: ::c_int = 16; +pub const AF_ROUTE: ::c_int = 17; +pub const AF_LINK: ::c_int = 18; +pub const pseudo_AF_XTP: ::c_int = 19; +pub const AF_COIP: ::c_int = 20; +pub const AF_CNT: ::c_int = 21; +pub const pseudo_AF_RTIP: ::c_int = 22; +pub const AF_IPX: ::c_int = 23; +pub const AF_SIP: ::c_int = 24; +pub const pseudo_AF_PIP: ::c_int = 25; +pub const AF_ISDN: ::c_int = 26; +pub const AF_E164: ::c_int = AF_ISDN; +pub const pseudo_AF_KEY: ::c_int = 27; +pub const AF_INET6: ::c_int = 28; +pub const AF_NATM: ::c_int = 29; +pub const AF_ATM: ::c_int = 30; +pub const pseudo_AF_HDRCMPLT: ::c_int = 31; +pub const AF_NETGRAPH: ::c_int = 32; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_LOCAL: ::c_int = AF_LOCAL; +pub const PF_UNIX: ::c_int = PF_LOCAL; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_IMPLINK: ::c_int = AF_IMPLINK; +pub const PF_PUP: ::c_int = AF_PUP; +pub const PF_CHAOS: ::c_int = AF_CHAOS; +pub const PF_NETBIOS: ::c_int = AF_NETBIOS; +pub const PF_ISO: ::c_int = AF_ISO; +pub const PF_OSI: ::c_int = AF_ISO; +pub const PF_ECMA: ::c_int = AF_ECMA; +pub const PF_DATAKIT: ::c_int = AF_DATAKIT; +pub const PF_CCITT: ::c_int = AF_CCITT; +pub const PF_SNA: ::c_int = AF_SNA; +pub const PF_DECnet: ::c_int = AF_DECnet; +pub const PF_DLI: ::c_int = AF_DLI; +pub const PF_LAT: ::c_int = AF_LAT; +pub const PF_HYLINK: ::c_int = AF_HYLINK; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_LINK: ::c_int = AF_LINK; +pub const PF_XTP: ::c_int = pseudo_AF_XTP; +pub const PF_COIP: ::c_int = AF_COIP; +pub const PF_CNT: ::c_int = AF_CNT; +pub const PF_SIP: ::c_int = AF_SIP; +pub const PF_IPX: ::c_int = AF_IPX; +pub const PF_RTIP: ::c_int = pseudo_AF_RTIP; +pub const PF_PIP: ::c_int = pseudo_AF_PIP; +pub const PF_ISDN: ::c_int = AF_ISDN; +pub const PF_KEY: ::c_int = pseudo_AF_KEY; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_NATM: ::c_int = AF_NATM; +pub const PF_ATM: ::c_int = AF_ATM; +pub const PF_NETGRAPH: ::c_int = AF_NETGRAPH; + +pub const SOMAXCONN: ::c_int = 128; + +pub const MSG_OOB: ::c_int = 0x00000001; +pub const MSG_PEEK: ::c_int = 0x00000002; +pub const MSG_DONTROUTE: ::c_int = 0x00000004; +pub const MSG_EOR: ::c_int = 0x00000008; +pub const MSG_TRUNC: ::c_int = 0x00000010; +pub const MSG_CTRUNC: ::c_int = 0x00000020; +pub const MSG_WAITALL: ::c_int = 0x00000040; +pub const MSG_DONTWAIT: ::c_int = 0x00000080; +pub const MSG_EOF: ::c_int = 0x00000100; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_RDM: ::c_int = 4; +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const SOCK_CLOEXEC: ::c_int = 0x10000000; +pub const SOCK_NONBLOCK: ::c_int = 0x20000000; +pub const SOCK_MAXADDRLEN: ::c_int = 255; +pub const IPPROTO_ICMP: ::c_int = 1; +pub const IPPROTO_ICMPV6: ::c_int = 58; +pub const IPPROTO_TCP: ::c_int = 6; +pub const IPPROTO_IP: ::c_int = 0; +pub const IPPROTO_IPV6: ::c_int = 41; +pub const IP_MULTICAST_TTL: ::c_int = 10; +pub const IP_MULTICAST_LOOP: ::c_int = 11; +pub const IP_TTL: ::c_int = 4; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_ADD_MEMBERSHIP: ::c_int = 12; +pub const IP_DROP_MEMBERSHIP: ::c_int = 13; +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; + +pub const TCP_NODELAY: ::c_int = 1; +pub const TCP_KEEPIDLE: ::c_int = 256; +pub const SOL_SOCKET: ::c_int = 0xffff; +pub const SO_DEBUG: ::c_int = 0x01; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_TIMESTAMP: ::c_int = 0x0400; +pub const SO_NOSIGPIPE: ::c_int = 0x0800; +pub const SO_ACCEPTFILTER: ::c_int = 0x1000; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; + +pub const IFF_LOOPBACK: ::c_int = 0x8; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +pub const O_SYNC: ::c_int = 128; +pub const O_NONBLOCK: ::c_int = 4; + +pub const MAP_COPY: ::c_int = 0x0002; +pub const MAP_RENAME: ::c_int = 0x0020; +pub const MAP_NORESERVE: ::c_int = 0x0040; +pub const MAP_HASSEMAPHORE: ::c_int = 0x0200; +pub const MAP_STACK: ::c_int = 0x0400; +pub const MAP_NOSYNC: ::c_int = 0x0800; +pub const MAP_NOCORE: ::c_int = 0x020000; + +pub const IPPROTO_RAW: ::c_int = 255; + +pub const _SC_ARG_MAX: ::c_int = 1; +pub const _SC_CHILD_MAX: ::c_int = 2; +pub const _SC_CLK_TCK: ::c_int = 3; +pub const _SC_NGROUPS_MAX: ::c_int = 4; +pub const _SC_OPEN_MAX: ::c_int = 5; +pub const _SC_JOB_CONTROL: ::c_int = 6; +pub const _SC_SAVED_IDS: ::c_int = 7; +pub const _SC_VERSION: ::c_int = 8; +pub const _SC_BC_BASE_MAX: ::c_int = 9; +pub const _SC_BC_DIM_MAX: ::c_int = 10; +pub const _SC_BC_SCALE_MAX: ::c_int = 11; +pub const _SC_BC_STRING_MAX: ::c_int = 12; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 13; +pub const _SC_EXPR_NEST_MAX: ::c_int = 14; +pub const _SC_LINE_MAX: ::c_int = 15; +pub const _SC_RE_DUP_MAX: ::c_int = 16; +pub const _SC_2_VERSION: ::c_int = 17; +pub const _SC_2_C_BIND: ::c_int = 18; +pub const _SC_2_C_DEV: ::c_int = 19; +pub const _SC_2_CHAR_TERM: ::c_int = 20; +pub const _SC_2_FORT_DEV: ::c_int = 21; +pub const _SC_2_FORT_RUN: ::c_int = 22; +pub const _SC_2_LOCALEDEF: ::c_int = 23; +pub const _SC_2_SW_DEV: ::c_int = 24; +pub const _SC_2_UPE: ::c_int = 25; +pub const _SC_STREAM_MAX: ::c_int = 26; +pub const _SC_TZNAME_MAX: ::c_int = 27; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 28; +pub const _SC_MAPPED_FILES: ::c_int = 29; +pub const _SC_MEMLOCK: ::c_int = 30; +pub const _SC_MEMLOCK_RANGE: ::c_int = 31; +pub const _SC_MEMORY_PROTECTION: ::c_int = 32; +pub const _SC_MESSAGE_PASSING: ::c_int = 33; +pub const _SC_PRIORITIZED_IO: ::c_int = 34; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 35; +pub const _SC_REALTIME_SIGNALS: ::c_int = 36; +pub const _SC_SEMAPHORES: ::c_int = 37; +pub const _SC_FSYNC: ::c_int = 38; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 39; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 40; +pub const _SC_TIMERS: ::c_int = 41; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 42; +pub const _SC_AIO_MAX: ::c_int = 43; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 44; +pub const _SC_DELAYTIMER_MAX: ::c_int = 45; +pub const _SC_MQ_OPEN_MAX: ::c_int = 46; +pub const _SC_PAGESIZE: ::c_int = 47; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_RTSIG_MAX: ::c_int = 48; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 49; +pub const _SC_SEM_VALUE_MAX: ::c_int = 50; +pub const _SC_SIGQUEUE_MAX: ::c_int = 51; +pub const _SC_TIMER_MAX: ::c_int = 52; +pub const _SC_HOST_NAME_MAX: ::c_int = 72; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = 0 as *mut _; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = 0 as *mut _; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = 0 as *mut _; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 3; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_ERRORCHECK; + +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_OTHER: ::c_int = 2; +pub const SCHED_RR: ::c_int = 3; + +pub const FD_SETSIZE: usize = 1024; + +pub const ST_NOSUID: ::c_ulong = 2; + +pub const NI_MAXHOST: ::size_t = 1025; + +pub const RTLD_LOCAL: ::c_int = 0; +pub const RTLD_NODELETE: ::c_int = 0x1000; +pub const RTLD_NOLOAD: ::c_int = 0x2000; +pub const RTLD_GLOBAL: ::c_int = 0x100; + +pub const LOG_NTP: ::c_int = 12 << 3; +pub const LOG_SECURITY: ::c_int = 13 << 3; +pub const LOG_CONSOLE: ::c_int = 14 << 3; +pub const LOG_NFACILITIES: ::c_int = 24; + +pub const TIOCEXCL: ::c_uint = 0x2000740d; +pub const TIOCNXCL: ::c_uint = 0x2000740e; +pub const TIOCFLUSH: ::c_ulong = 0x80047410; +pub const TIOCGETA: ::c_uint = 0x402c7413; +pub const TIOCSETA: ::c_ulong = 0x802c7414; +pub const TIOCSETAW: ::c_ulong = 0x802c7415; +pub const TIOCSETAF: ::c_ulong = 0x802c7416; +pub const TIOCGETD: ::c_uint = 0x4004741a; +pub const TIOCSETD: ::c_ulong = 0x8004741b; +pub const TIOCGDRAINWAIT: ::c_uint = 0x40047456; +pub const TIOCSDRAINWAIT: ::c_ulong = 0x80047457; +pub const TIOCTIMESTAMP: ::c_uint = 0x40107459; +pub const TIOCMGDTRWAIT: ::c_uint = 0x4004745a; +pub const TIOCMSDTRWAIT: ::c_ulong = 0x8004745b; +pub const TIOCDRAIN: ::c_uint = 0x2000745e; +pub const TIOCEXT: ::c_ulong = 0x80047460; +pub const TIOCSCTTY: ::c_uint = 0x20007461; +pub const TIOCCONS: ::c_ulong = 0x80047462; +pub const TIOCGSID: ::c_uint = 0x40047463; +pub const TIOCSTAT: ::c_uint = 0x20007465; +pub const TIOCUCNTL: ::c_ulong = 0x80047466; +pub const TIOCSWINSZ: ::c_ulong = 0x80087467; +pub const TIOCGWINSZ: ::c_uint = 0x40087468; +pub const TIOCMGET: ::c_uint = 0x4004746a; +pub const TIOCM_LE: ::c_int = 0x1; +pub const TIOCM_DTR: ::c_int = 0x2; +pub const TIOCM_RTS: ::c_int = 0x4; +pub const TIOCM_ST: ::c_int = 0x8; +pub const TIOCM_SR: ::c_int = 0x10; +pub const TIOCM_CTS: ::c_int = 0x20; +pub const TIOCM_RI: ::c_int = 0x80; +pub const TIOCM_DSR: ::c_int = 0x100; +pub const TIOCM_CD: ::c_int = 0x40; +pub const TIOCM_CAR: ::c_int = 0x40; +pub const TIOCM_RNG: ::c_int = 0x80; +pub const TIOCMBIC: ::c_ulong = 0x8004746b; +pub const TIOCMBIS: ::c_ulong = 0x8004746c; +pub const TIOCMSET: ::c_ulong = 0x8004746d; +pub const TIOCSTART: ::c_uint = 0x2000746e; +pub const TIOCSTOP: ::c_uint = 0x2000746f; +pub const TIOCPKT: ::c_ulong = 0x80047470; +pub const TIOCPKT_DATA: ::c_int = 0x0; +pub const TIOCPKT_FLUSHREAD: ::c_int = 0x1; +pub const TIOCPKT_FLUSHWRITE: ::c_int = 0x2; +pub const TIOCPKT_STOP: ::c_int = 0x4; +pub const TIOCPKT_START: ::c_int = 0x8; +pub const TIOCPKT_NOSTOP: ::c_int = 0x10; +pub const TIOCPKT_DOSTOP: ::c_int = 0x20; +pub const TIOCPKT_IOCTL: ::c_int = 0x40; +pub const TIOCNOTTY: ::c_uint = 0x20007471; +pub const TIOCSTI: ::c_ulong = 0x80017472; +pub const TIOCOUTQ: ::c_uint = 0x40047473; +pub const TIOCSPGRP: ::c_ulong = 0x80047476; +pub const TIOCGPGRP: ::c_uint = 0x40047477; +pub const TIOCCDTR: ::c_uint = 0x20007478; +pub const TIOCSDTR: ::c_uint = 0x20007479; +pub const TIOCCBRK: ::c_uint = 0x2000747a; +pub const TIOCSBRK: ::c_uint = 0x2000747b; +pub const TTYDISC: ::c_int = 0x0; +pub const SLIPDISC: ::c_int = 0x4; +pub const PPPDISC: ::c_int = 0x5; +pub const NETGRAPHDISC: ::c_int = 0x6; + +pub const B0: speed_t = 0; +pub const B50: speed_t = 50; +pub const B75: speed_t = 75; +pub const B110: speed_t = 110; +pub const B134: speed_t = 134; +pub const B150: speed_t = 150; +pub const B200: speed_t = 200; +pub const B300: speed_t = 300; +pub const B600: speed_t = 600; +pub const B1200: speed_t = 1200; +pub const B1800: speed_t = 1800; +pub const B2400: speed_t = 2400; +pub const B4800: speed_t = 4800; +pub const B9600: speed_t = 9600; +pub const B19200: speed_t = 19200; +pub const B38400: speed_t = 38400; +pub const B7200: speed_t = 7200; +pub const B14400: speed_t = 14400; +pub const B28800: speed_t = 28800; +pub const B57600: speed_t = 57600; +pub const B76800: speed_t = 76800; +pub const B115200: speed_t = 115200; +pub const B230400: speed_t = 230400; +pub const EXTA: speed_t = 19200; +pub const EXTB: speed_t = 38400; + +pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t; + +pub const CRTSCTS: ::tcflag_t = 0x00030000; + +f! { + pub fn WIFCONTINUED(status: ::c_int) -> bool { + status == 0x13 + } + + pub fn WSTOPSIG(status: ::c_int) -> ::c_int { + status >> 8 + } + + pub fn WIFSIGNALED(status: ::c_int) -> bool { + (status & 0o177) != 0o177 && (status & 0o177) != 0 + } + + pub fn WIFSTOPPED(status: ::c_int) -> bool { + (status & 0o177) == 0o177 + } +} + +extern { + pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; + pub fn endutxent(); + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn setutxent(); +} + +#[link(name = "util")] +extern { + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int, + timeout: *const ::timespec) -> ::c_int; + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb, + nitems: ::c_int, sevp: *mut sigevent) -> ::c_int; + pub fn getnameinfo(sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::size_t, + serv: *mut ::c_char, + servlen: ::size_t, + flags: ::c_int) -> ::c_int; + pub fn kevent(kq: ::c_int, + changelist: *const ::kevent, + nchanges: ::c_int, + eventlist: *mut ::kevent, + nevents: ::c_int, + timeout: *const ::timespec) -> ::c_int; + pub fn mincore(addr: *const ::c_void, len: ::size_t, + vec: *mut ::c_char) -> ::c_int; + pub fn sysctlnametomib(name: *const ::c_char, + mibp: *mut ::c_int, + sizep: *mut ::size_t) + -> ::c_int; + pub fn shm_open(name: *const ::c_char, oflag: ::c_int, mode: ::mode_t) + -> ::c_int; + pub fn sysctl(name: *const ::c_int, + namelen: ::c_uint, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *const ::c_void, + newlen: ::size_t) + -> ::c_int; + pub fn sysctlbyname(name: *const ::c_char, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *const ::c_void, + newlen: ::size_t) + -> ::c_int; + pub fn sched_setscheduler(pid: ::pid_t, + policy: ::c_int, + param: *const sched_param) -> ::c_int; + pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; + pub fn memrchr(cx: *const ::c_void, + c: ::c_int, + n: ::size_t) -> *mut ::c_void; + pub fn sendfile(fd: ::c_int, + s: ::c_int, + offset: ::off_t, + nbytes: ::size_t, + hdtr: *mut ::sf_hdtr, + sbytes: *mut ::off_t, + flags: ::c_int) -> ::c_int; + pub fn sigtimedwait(set: *const sigset_t, + info: *mut siginfo_t, + timeout: *const ::timespec) -> ::c_int; + pub fn sigwaitinfo(set: *const sigset_t, + info: *mut siginfo_t) -> ::c_int; + pub fn openpty(amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize) -> ::c_int; + pub fn forkpty(amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize) -> ::pid_t; + pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn newlocale(mask: ::c_int, + locale: *const ::c_char, + base: ::locale_t) -> ::locale_t; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char; + pub fn accept4(s: ::c_int, addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, flags: ::c_int) -> ::c_int; + pub fn pthread_set_name_np(tid: ::pthread_t, name: *const ::c_char); + pub fn pthread_attr_get_np(tid: ::pthread_t, + attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t) -> ::c_int; + pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t) -> ::c_int; + pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, + pshared: ::c_int) -> ::c_int; + pub fn pthread_condattr_getpshared(attr: *const pthread_condattr_t, + pshared: *mut ::c_int) -> ::c_int; + pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t, + pshared: ::c_int) -> ::c_int; + pub fn pthread_mutexattr_getpshared(attr: *const pthread_mutexattr_t, + pshared: *mut ::c_int) -> ::c_int; + pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int; + + pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; + + pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t, dev: dev_t) -> ::c_int; + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t) -> ::c_int; + pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t, + clock_id: *mut clockid_t) -> ::c_int; + pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, + clock_id: clockid_t) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::c_int) -> ::c_int; + pub fn sem_timedwait(sem: *mut sem_t, + abstime: *const ::timespec) -> ::c_int; + pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t, + abstime: *const ::timespec) -> ::c_int; + pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; + pub fn ppoll(fds: *mut ::pollfd, + nfds: ::nfds_t, + timeout: *const ::timespec, + sigmask: *const sigset_t) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_os = "freebsd")] { + mod freebsd; + pub use self::freebsd::*; + } else if #[cfg(target_os = "dragonfly")] { + mod dragonfly; + pub use self::dragonfly::*; + } else { + // ... + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/mod.rs new file mode 100644 index 000000000..69c71389a --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/mod.rs @@ -0,0 +1,449 @@ +use dox::{mem, Option}; + +pub type c_char = i8; +pub type wchar_t = i32; +pub type off_t = i64; +pub type useconds_t = u32; +pub type blkcnt_t = i64; +pub type socklen_t = u32; +pub type sa_family_t = u8; +pub type pthread_t = ::uintptr_t; +pub type nfds_t = ::c_uint; + +s! { + pub struct sockaddr { + pub sa_len: u8, + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in6 { + pub sin6_len: u8, + pub sin6_family: sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct sockaddr_un { + pub sun_len: u8, + pub sun_family: sa_family_t, + pub sun_path: [c_char; 104] + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_change: ::time_t, + pub pw_class: *mut ::c_char, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + pub pw_expire: ::time_t, + + #[cfg(not(any(target_os = "macos", + target_os = "ios", + target_os = "netbsd", + target_os = "openbsd")))] + pub pw_fields: ::c_int, + } + + pub struct ifaddrs { + pub ifa_next: *mut ifaddrs, + pub ifa_name: *mut ::c_char, + pub ifa_flags: ::c_uint, + pub ifa_addr: *mut ::sockaddr, + pub ifa_netmask: *mut ::sockaddr, + pub ifa_dstaddr: *mut ::sockaddr, + pub ifa_data: *mut ::c_void + } + + pub struct fd_set { + #[cfg(all(target_pointer_width = "64", + any(target_os = "freebsd", target_os = "dragonfly")))] + fds_bits: [i64; FD_SETSIZE / 64], + #[cfg(not(all(target_pointer_width = "64", + any(target_os = "freebsd", target_os = "dragonfly"))))] + fds_bits: [i32; FD_SETSIZE / 32], + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + pub tm_gmtoff: ::c_long, + pub tm_zone: *mut ::c_char, + } + + pub struct utsname { + #[cfg(not(target_os = "dragonfly"))] + pub sysname: [::c_char; 256], + #[cfg(target_os = "dragonfly")] + pub sysname: [::c_char; 32], + #[cfg(not(target_os = "dragonfly"))] + pub nodename: [::c_char; 256], + #[cfg(target_os = "dragonfly")] + pub nodename: [::c_char; 32], + #[cfg(not(target_os = "dragonfly"))] + pub release: [::c_char; 256], + #[cfg(target_os = "dragonfly")] + pub release: [::c_char; 32], + #[cfg(not(target_os = "dragonfly"))] + pub version: [::c_char; 256], + #[cfg(target_os = "dragonfly")] + pub version: [::c_char; 32], + #[cfg(not(target_os = "dragonfly"))] + pub machine: [::c_char; 256], + #[cfg(target_os = "dragonfly")] + pub machine: [::c_char; 32], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct fsid_t { + __fsid_val: [::int32_t; 2], + } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } +} + +pub const LC_ALL: ::c_int = 0; +pub const LC_COLLATE: ::c_int = 1; +pub const LC_CTYPE: ::c_int = 2; +pub const LC_MONETARY: ::c_int = 3; +pub const LC_NUMERIC: ::c_int = 4; +pub const LC_TIME: ::c_int = 5; +pub const LC_MESSAGES: ::c_int = 6; + +pub const FIOCLEX: ::c_ulong = 0x20006601; +pub const FIONBIO: ::c_ulong = 0x8004667e; + +pub const PATH_MAX: ::c_int = 1024; + +pub const SA_ONSTACK: ::c_int = 0x0001; +pub const SA_SIGINFO: ::c_int = 0x0040; +pub const SA_RESTART: ::c_int = 0x0002; +pub const SA_RESETHAND: ::c_int = 0x0004; +pub const SA_NOCLDSTOP: ::c_int = 0x0008; +pub const SA_NODEFER: ::c_int = 0x0010; +pub const SA_NOCLDWAIT: ::c_int = 0x0020; + +pub const SS_ONSTACK: ::c_int = 1; +pub const SS_DISABLE: ::c_int = 4; + +pub const SIGCHLD: ::c_int = 20; +pub const SIGBUS: ::c_int = 10; +pub const SIGUSR1: ::c_int = 30; +pub const SIGUSR2: ::c_int = 31; +pub const SIGCONT: ::c_int = 19; +pub const SIGSTOP: ::c_int = 17; +pub const SIGTSTP: ::c_int = 18; +pub const SIGURG: ::c_int = 16; +pub const SIGIO: ::c_int = 23; +pub const SIGSYS: ::c_int = 12; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGINFO: ::c_int = 29; + +pub const SIG_SETMASK: ::c_int = 3; +pub const SIG_BLOCK: ::c_int = 0x1; +pub const SIG_UNBLOCK: ::c_int = 0x2; + +pub const IPV6_MULTICAST_LOOP: ::c_int = 11; +pub const IPV6_V6ONLY: ::c_int = 27; + +pub const ST_RDONLY: ::c_ulong = 1; + +pub const NCCS: usize = 20; + +pub const O_ASYNC: ::c_int = 0x40; +pub const O_FSYNC: ::c_int = 0x80; +pub const O_NDELAY: ::c_int = 0x4; +pub const O_NOFOLLOW: ::c_int = 0x100; + +pub const F_GETOWN: ::c_int = 5; +pub const F_SETOWN: ::c_int = 6; + +pub const MNT_FORCE: ::c_int = 0x80000; + +pub const Q_SYNC: ::c_int = 0x600; +pub const Q_QUOTAON: ::c_int = 0x100; +pub const Q_QUOTAOFF: ::c_int = 0x200; + +pub const TCIOFF: ::c_int = 3; +pub const TCION: ::c_int = 4; +pub const TCOOFF: ::c_int = 1; +pub const TCOON: ::c_int = 2; +pub const TCIFLUSH: ::c_int = 1; +pub const TCOFLUSH: ::c_int = 2; +pub const TCIOFLUSH: ::c_int = 3; +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; +pub const VEOF: usize = 0; +pub const VEOL: usize = 1; +pub const VEOL2: usize = 2; +pub const VERASE: usize = 3; +pub const VWERASE: usize = 4; +pub const VKILL: usize = 5; +pub const VREPRINT: usize = 6; +pub const VINTR: usize = 8; +pub const VQUIT: usize = 9; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 12; +pub const VSTOP: usize = 13; +pub const VLNEXT: usize = 14; +pub const VDISCARD: usize = 15; +pub const VMIN: usize = 16; +pub const VTIME: usize = 17; +pub const IGNBRK: ::tcflag_t = 0x00000001; +pub const BRKINT: ::tcflag_t = 0x00000002; +pub const IGNPAR: ::tcflag_t = 0x00000004; +pub const PARMRK: ::tcflag_t = 0x00000008; +pub const INPCK: ::tcflag_t = 0x00000010; +pub const ISTRIP: ::tcflag_t = 0x00000020; +pub const INLCR: ::tcflag_t = 0x00000040; +pub const IGNCR: ::tcflag_t = 0x00000080; +pub const ICRNL: ::tcflag_t = 0x00000100; +pub const IXON: ::tcflag_t = 0x00000200; +pub const IXOFF: ::tcflag_t = 0x00000400; +pub const IXANY: ::tcflag_t = 0x00000800; +pub const IMAXBEL: ::tcflag_t = 0x00002000; +pub const OPOST: ::tcflag_t = 0x1; +pub const ONLCR: ::tcflag_t = 0x2; +pub const OXTABS: ::tcflag_t = 0x4; +pub const ONOEOT: ::tcflag_t = 0x8; +pub const CSIZE: ::tcflag_t = 0x00000300; +pub const CS5: ::tcflag_t = 0x00000000; +pub const CS6: ::tcflag_t = 0x00000100; +pub const CS7: ::tcflag_t = 0x00000200; +pub const CS8: ::tcflag_t = 0x00000300; +pub const CSTOPB: ::tcflag_t = 0x00000400; +pub const CREAD: ::tcflag_t = 0x00000800; +pub const PARENB: ::tcflag_t = 0x00001000; +pub const PARODD: ::tcflag_t = 0x00002000; +pub const HUPCL: ::tcflag_t = 0x00004000; +pub const CLOCAL: ::tcflag_t = 0x00008000; +pub const ECHOKE: ::tcflag_t = 0x00000001; +pub const ECHOE: ::tcflag_t = 0x00000002; +pub const ECHOK: ::tcflag_t = 0x00000004; +pub const ECHO: ::tcflag_t = 0x00000008; +pub const ECHONL: ::tcflag_t = 0x00000010; +pub const ECHOPRT: ::tcflag_t = 0x00000020; +pub const ECHOCTL: ::tcflag_t = 0x00000040; +pub const ISIG: ::tcflag_t = 0x00000080; +pub const ICANON: ::tcflag_t = 0x00000100; +pub const IEXTEN: ::tcflag_t = 0x00000400; +pub const EXTPROC: ::tcflag_t = 0x00000800; +pub const TOSTOP: ::tcflag_t = 0x00400000; +pub const FLUSHO: ::tcflag_t = 0x00800000; +pub const PENDIN: ::tcflag_t = 0x20000000; +pub const NOFLSH: ::tcflag_t = 0x80000000; + +pub const WNOHANG: ::c_int = 0x00000001; +pub const WUNTRACED: ::c_int = 0x00000002; + +pub const RTLD_NOW: ::c_int = 0x2; +pub const RTLD_DEFAULT: *mut ::c_void = -2isize as *mut ::c_void; + +pub const LOG_CRON: ::c_int = 9 << 3; +pub const LOG_AUTHPRIV: ::c_int = 10 << 3; +pub const LOG_FTP: ::c_int = 11 << 3; +pub const LOG_PERROR: ::c_int = 0x20; + +pub const PIPE_BUF: usize = 512; + +f! { + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] &= !(1 << (fd % bits)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool { + let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + return ((*set).fds_bits[fd / bits] & (1 << (fd % bits))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] |= 1 << (fd % bits); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } + + pub fn WTERMSIG(status: ::c_int) -> ::c_int { + status & 0o177 + } + + pub fn WIFEXITED(status: ::c_int) -> bool { + (status & 0o177) == 0 + } + + pub fn WEXITSTATUS(status: ::c_int) -> ::c_int { + status >> 8 + } + + pub fn WCOREDUMP(status: ::c_int) -> bool { + (status & 0o200) != 0 + } +} + +extern { + pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; + pub fn freeifaddrs(ifa: *mut ::ifaddrs); + pub fn setgroups(ngroups: ::c_int, + ptr: *const ::gid_t) -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; + pub fn kqueue() -> ::c_int; + pub fn unmount(target: *const ::c_char, arg: ::c_int) -> ::c_int; + pub fn syscall(num: ::c_int, ...) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__getpwnam_r50")] + pub fn getpwnam_r(name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__getpwuid_r50")] + pub fn getpwuid_r(uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__getpwent50")] + pub fn getpwent() -> *mut passwd; + pub fn setpwent(); + pub fn getprogname() -> *const ::c_char; + pub fn setprogname(name: *const ::c_char); + pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); + + pub fn getpeereid(socket: ::c_int, + euid: *mut ::uid_t, + egid: *mut ::gid_t) -> ::c_int; + + #[cfg_attr(target_os = "macos", link_name = "glob$INODE64")] + #[cfg_attr(target_os = "netbsd", link_name = "__glob30")] + pub fn glob(pattern: *const ::c_char, + flags: ::c_int, + errfunc: Option ::c_int>, + pglob: *mut ::glob_t) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__globfree30")] + pub fn globfree(pglob: *mut ::glob_t); + + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) + -> ::c_int; + + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), + link_name = "seekdir$INODE64")] + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "seekdir$INODE64$UNIX2003")] + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + + #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), + link_name = "telldir$INODE64")] + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "telldir$INODE64$UNIX2003")] + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) + -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "msync$UNIX2003")] + #[cfg_attr(target_os = "netbsd", link_name = "__msync13")] + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "recvfrom$UNIX2003")] + pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, + flags: ::c_int, addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t) -> ::ssize_t; + pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; + pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "bind$UNIX2003")] + pub fn bind(socket: ::c_int, address: *const ::sockaddr, + address_len: ::socklen_t) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "writev$UNIX2003")] + pub fn writev(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::ssize_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "readv$UNIX2003")] + pub fn readv(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::ssize_t; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "sendmsg$UNIX2003")] + pub fn sendmsg(fd: ::c_int, + msg: *const ::msghdr, + flags: ::c_int) -> ::ssize_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "recvmsg$UNIX2003")] + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) + -> ::ssize_t; +} + +cfg_if! { + if #[cfg(any(target_os = "macos", target_os = "ios"))] { + mod apple; + pub use self::apple::*; + } else if #[cfg(any(target_os = "openbsd", target_os = "netbsd", + target_os = "bitrig"))] { + mod netbsdlike; + pub use self::netbsdlike::*; + } else if #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))] { + mod freebsdlike; + pub use self::freebsdlike::*; + } else { + // Unknown target_os + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/mod.rs new file mode 100644 index 000000000..1471e6f38 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/mod.rs @@ -0,0 +1,626 @@ +pub type time_t = i64; +pub type mode_t = u32; +pub type nlink_t = ::uint32_t; +pub type ino_t = ::uint64_t; +pub type pthread_key_t = ::c_int; +pub type rlim_t = u64; +pub type speed_t = ::c_uint; +pub type tcflag_t = ::c_uint; +pub type nl_item = c_long; +pub type clockid_t = ::c_int; +pub type id_t = ::uint32_t; +pub type sem_t = *mut sem; + +pub enum timezone {} +pub enum sem {} + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::int8_t; 8], + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_cc: [::cc_t; ::NCCS], + pub c_ispeed: ::c_int, + pub c_ospeed: ::c_int, + } + + pub struct flock { + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + pub l_type: ::c_short, + pub l_whence: ::c_short, + } +} + +pub const D_T_FMT: ::nl_item = 0; +pub const D_FMT: ::nl_item = 1; +pub const T_FMT: ::nl_item = 2; +pub const T_FMT_AMPM: ::nl_item = 3; +pub const AM_STR: ::nl_item = 4; +pub const PM_STR: ::nl_item = 5; + +pub const DAY_1: ::nl_item = 6; +pub const DAY_2: ::nl_item = 7; +pub const DAY_3: ::nl_item = 8; +pub const DAY_4: ::nl_item = 9; +pub const DAY_5: ::nl_item = 10; +pub const DAY_6: ::nl_item = 11; +pub const DAY_7: ::nl_item = 12; + +pub const ABDAY_1: ::nl_item = 13; +pub const ABDAY_2: ::nl_item = 14; +pub const ABDAY_3: ::nl_item = 15; +pub const ABDAY_4: ::nl_item = 16; +pub const ABDAY_5: ::nl_item = 17; +pub const ABDAY_6: ::nl_item = 18; +pub const ABDAY_7: ::nl_item = 19; + +pub const MON_1: ::nl_item = 20; +pub const MON_2: ::nl_item = 21; +pub const MON_3: ::nl_item = 22; +pub const MON_4: ::nl_item = 23; +pub const MON_5: ::nl_item = 24; +pub const MON_6: ::nl_item = 25; +pub const MON_7: ::nl_item = 26; +pub const MON_8: ::nl_item = 27; +pub const MON_9: ::nl_item = 28; +pub const MON_10: ::nl_item = 29; +pub const MON_11: ::nl_item = 30; +pub const MON_12: ::nl_item = 31; + +pub const ABMON_1: ::nl_item = 32; +pub const ABMON_2: ::nl_item = 33; +pub const ABMON_3: ::nl_item = 34; +pub const ABMON_4: ::nl_item = 35; +pub const ABMON_5: ::nl_item = 36; +pub const ABMON_6: ::nl_item = 37; +pub const ABMON_7: ::nl_item = 38; +pub const ABMON_8: ::nl_item = 39; +pub const ABMON_9: ::nl_item = 40; +pub const ABMON_10: ::nl_item = 41; +pub const ABMON_11: ::nl_item = 42; +pub const ABMON_12: ::nl_item = 43; + +pub const RADIXCHAR: ::nl_item = 44; +pub const THOUSEP: ::nl_item = 45; +pub const YESSTR: ::nl_item = 46; +pub const YESEXPR: ::nl_item = 47; +pub const NOSTR: ::nl_item = 48; +pub const NOEXPR: ::nl_item = 49; +pub const CRNCYSTR: ::nl_item = 50; + +pub const CODESET: ::nl_item = 51; + +pub const EXIT_FAILURE : ::c_int = 1; +pub const EXIT_SUCCESS : ::c_int = 0; +pub const RAND_MAX : ::c_int = 2147483647; +pub const EOF : ::c_int = -1; +pub const SEEK_SET : ::c_int = 0; +pub const SEEK_CUR : ::c_int = 1; +pub const SEEK_END : ::c_int = 2; +pub const _IOFBF : ::c_int = 0; +pub const _IONBF : ::c_int = 2; +pub const _IOLBF : ::c_int = 1; +pub const BUFSIZ : ::c_uint = 1024; +pub const FOPEN_MAX : ::c_uint = 20; +pub const FILENAME_MAX : ::c_uint = 1024; +pub const L_tmpnam : ::c_uint = 1024; +pub const O_RDONLY : ::c_int = 0; +pub const O_WRONLY : ::c_int = 1; +pub const O_RDWR : ::c_int = 2; +pub const O_ACCMODE : ::c_int = 3; +pub const O_APPEND : ::c_int = 8; +pub const O_CREAT : ::c_int = 512; +pub const O_EXCL : ::c_int = 2048; +pub const O_NOCTTY : ::c_int = 32768; +pub const O_TRUNC : ::c_int = 1024; +pub const O_SYNC : ::c_int = 128; +pub const S_IFIFO : mode_t = 4096; +pub const S_IFCHR : mode_t = 8192; +pub const S_IFBLK : mode_t = 24576; +pub const S_IFDIR : mode_t = 16384; +pub const S_IFREG : mode_t = 32768; +pub const S_IFLNK : mode_t = 40960; +pub const S_IFSOCK : mode_t = 49152; +pub const S_IFMT : mode_t = 61440; +pub const S_IEXEC : mode_t = 64; +pub const S_IWRITE : mode_t = 128; +pub const S_IREAD : mode_t = 256; +pub const S_IRWXU : mode_t = 448; +pub const S_IXUSR : mode_t = 64; +pub const S_IWUSR : mode_t = 128; +pub const S_IRUSR : mode_t = 256; +pub const S_IRWXG : mode_t = 56; +pub const S_IXGRP : mode_t = 8; +pub const S_IWGRP : mode_t = 16; +pub const S_IRGRP : mode_t = 32; +pub const S_IRWXO : mode_t = 7; +pub const S_IXOTH : mode_t = 1; +pub const S_IWOTH : mode_t = 2; +pub const S_IROTH : mode_t = 4; +pub const F_OK : ::c_int = 0; +pub const R_OK : ::c_int = 4; +pub const W_OK : ::c_int = 2; +pub const X_OK : ::c_int = 1; +pub const STDIN_FILENO : ::c_int = 0; +pub const STDOUT_FILENO : ::c_int = 1; +pub const STDERR_FILENO : ::c_int = 2; +pub const F_LOCK : ::c_int = 1; +pub const F_TEST : ::c_int = 3; +pub const F_TLOCK : ::c_int = 2; +pub const F_ULOCK : ::c_int = 0; +pub const F_GETLK: ::c_int = 7; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; +pub const SIGHUP : ::c_int = 1; +pub const SIGINT : ::c_int = 2; +pub const SIGQUIT : ::c_int = 3; +pub const SIGILL : ::c_int = 4; +pub const SIGABRT : ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE : ::c_int = 8; +pub const SIGKILL : ::c_int = 9; +pub const SIGSEGV : ::c_int = 11; +pub const SIGPIPE : ::c_int = 13; +pub const SIGALRM : ::c_int = 14; +pub const SIGTERM : ::c_int = 15; +pub const SIGSTKSZ : ::size_t = 40960; + +pub const PROT_NONE : ::c_int = 0; +pub const PROT_READ : ::c_int = 1; +pub const PROT_WRITE : ::c_int = 2; +pub const PROT_EXEC : ::c_int = 4; + +pub const MAP_FILE : ::c_int = 0x0000; +pub const MAP_SHARED : ::c_int = 0x0001; +pub const MAP_PRIVATE : ::c_int = 0x0002; +pub const MAP_FIXED : ::c_int = 0x0010; +pub const MAP_ANON : ::c_int = 0x1000; + +pub const MAP_FAILED : *mut ::c_void = !0 as *mut ::c_void; + +pub const MCL_CURRENT : ::c_int = 0x0001; +pub const MCL_FUTURE : ::c_int = 0x0002; + +pub const MS_ASYNC : ::c_int = 0x0001; + +pub const EPERM : ::c_int = 1; +pub const ENOENT : ::c_int = 2; +pub const ESRCH : ::c_int = 3; +pub const EINTR : ::c_int = 4; +pub const EIO : ::c_int = 5; +pub const ENXIO : ::c_int = 6; +pub const E2BIG : ::c_int = 7; +pub const ENOEXEC : ::c_int = 8; +pub const EBADF : ::c_int = 9; +pub const ECHILD : ::c_int = 10; +pub const EDEADLK : ::c_int = 11; +pub const ENOMEM : ::c_int = 12; +pub const EACCES : ::c_int = 13; +pub const EFAULT : ::c_int = 14; +pub const ENOTBLK : ::c_int = 15; +pub const EBUSY : ::c_int = 16; +pub const EEXIST : ::c_int = 17; +pub const EXDEV : ::c_int = 18; +pub const ENODEV : ::c_int = 19; +pub const ENOTDIR : ::c_int = 20; +pub const EISDIR : ::c_int = 21; +pub const EINVAL : ::c_int = 22; +pub const ENFILE : ::c_int = 23; +pub const EMFILE : ::c_int = 24; +pub const ENOTTY : ::c_int = 25; +pub const ETXTBSY : ::c_int = 26; +pub const EFBIG : ::c_int = 27; +pub const ENOSPC : ::c_int = 28; +pub const ESPIPE : ::c_int = 29; +pub const EROFS : ::c_int = 30; +pub const EMLINK : ::c_int = 31; +pub const EPIPE : ::c_int = 32; +pub const EDOM : ::c_int = 33; +pub const ERANGE : ::c_int = 34; +pub const EAGAIN : ::c_int = 35; +pub const EWOULDBLOCK : ::c_int = 35; +pub const EINPROGRESS : ::c_int = 36; +pub const EALREADY : ::c_int = 37; +pub const ENOTSOCK : ::c_int = 38; +pub const EDESTADDRREQ : ::c_int = 39; +pub const EMSGSIZE : ::c_int = 40; +pub const EPROTOTYPE : ::c_int = 41; +pub const ENOPROTOOPT : ::c_int = 42; +pub const EPROTONOSUPPORT : ::c_int = 43; +pub const ESOCKTNOSUPPORT : ::c_int = 44; +pub const EOPNOTSUPP : ::c_int = 45; +pub const EPFNOSUPPORT : ::c_int = 46; +pub const EAFNOSUPPORT : ::c_int = 47; +pub const EADDRINUSE : ::c_int = 48; +pub const EADDRNOTAVAIL : ::c_int = 49; +pub const ENETDOWN : ::c_int = 50; +pub const ENETUNREACH : ::c_int = 51; +pub const ENETRESET : ::c_int = 52; +pub const ECONNABORTED : ::c_int = 53; +pub const ECONNRESET : ::c_int = 54; +pub const ENOBUFS : ::c_int = 55; +pub const EISCONN : ::c_int = 56; +pub const ENOTCONN : ::c_int = 57; +pub const ESHUTDOWN : ::c_int = 58; +pub const ETOOMANYREFS : ::c_int = 59; +pub const ETIMEDOUT : ::c_int = 60; +pub const ECONNREFUSED : ::c_int = 61; +pub const ELOOP : ::c_int = 62; +pub const ENAMETOOLONG : ::c_int = 63; +pub const EHOSTDOWN : ::c_int = 64; +pub const EHOSTUNREACH : ::c_int = 65; +pub const ENOTEMPTY : ::c_int = 66; +pub const EPROCLIM : ::c_int = 67; +pub const EUSERS : ::c_int = 68; +pub const EDQUOT : ::c_int = 69; +pub const ESTALE : ::c_int = 70; +pub const EREMOTE : ::c_int = 71; +pub const EBADRPC : ::c_int = 72; +pub const ERPCMISMATCH : ::c_int = 73; +pub const EPROGUNAVAIL : ::c_int = 74; +pub const EPROGMISMATCH : ::c_int = 75; +pub const EPROCUNAVAIL : ::c_int = 76; +pub const ENOLCK : ::c_int = 77; +pub const ENOSYS : ::c_int = 78; +pub const EFTYPE : ::c_int = 79; +pub const EAUTH : ::c_int = 80; +pub const ENEEDAUTH : ::c_int = 81; + +pub const F_DUPFD : ::c_int = 0; +pub const F_GETFD : ::c_int = 1; +pub const F_SETFD : ::c_int = 2; +pub const F_GETFL : ::c_int = 3; +pub const F_SETFL : ::c_int = 4; + +pub const SIGTRAP : ::c_int = 5; + +pub const GLOB_APPEND : ::c_int = 0x0001; +pub const GLOB_DOOFFS : ::c_int = 0x0002; +pub const GLOB_ERR : ::c_int = 0x0004; +pub const GLOB_MARK : ::c_int = 0x0008; +pub const GLOB_NOCHECK : ::c_int = 0x0010; +pub const GLOB_NOSORT : ::c_int = 0x0020; +pub const GLOB_NOESCAPE : ::c_int = 0x1000; + +pub const GLOB_NOSPACE : ::c_int = -1; +pub const GLOB_ABORTED : ::c_int = -2; +pub const GLOB_NOMATCH : ::c_int = -3; +pub const GLOB_NOSYS : ::c_int = -4; + +pub const POSIX_MADV_NORMAL : ::c_int = 0; +pub const POSIX_MADV_RANDOM : ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL : ::c_int = 2; +pub const POSIX_MADV_WILLNEED : ::c_int = 3; +pub const POSIX_MADV_DONTNEED : ::c_int = 4; + +pub const _SC_XOPEN_SHM : ::c_int = 30; + +pub const PTHREAD_CREATE_JOINABLE : ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED : ::c_int = 1; + +// http://man.openbsd.org/OpenBSD-current/man2/clock_getres.2 +// The man page says clock_gettime(3) can accept various values as clockid_t but +// http://fxr.watson.org/fxr/source/kern/kern_time.c?v=OPENBSD;im=excerpts#L161 +// the implementation rejects anything other than the below two +// +// http://netbsd.gw.com/cgi-bin/man-cgi?clock_gettime +// https://github.com/jsonn/src/blob/HEAD/sys/kern/subr_time.c#L222 +// Basically the same goes for NetBSD +pub const CLOCK_REALTIME: clockid_t = 0; +pub const CLOCK_MONOTONIC: clockid_t = 3; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_MEMLOCK: ::c_int = 6; +pub const RLIMIT_NPROC: ::c_int = 7; +pub const RLIMIT_NOFILE: ::c_int = 8; + +pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff; +pub const RLIM_SAVED_MAX: rlim_t = RLIM_INFINITY; +pub const RLIM_SAVED_CUR: rlim_t = RLIM_INFINITY; + +pub const RUSAGE_SELF: ::c_int = 0; +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const MADV_NORMAL : ::c_int = 0; +pub const MADV_RANDOM : ::c_int = 1; +pub const MADV_SEQUENTIAL : ::c_int = 2; +pub const MADV_WILLNEED : ::c_int = 3; +pub const MADV_DONTNEED : ::c_int = 4; +pub const MADV_FREE : ::c_int = 6; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_LOCAL: ::c_int = 1; +pub const AF_UNIX: ::c_int = AF_LOCAL; +pub const AF_INET: ::c_int = 2; +pub const AF_IMPLINK: ::c_int = 3; +pub const AF_PUP: ::c_int = 4; +pub const AF_CHAOS: ::c_int = 5; +pub const AF_NS: ::c_int = 6; +pub const AF_ISO: ::c_int = 7; +pub const AF_OSI: ::c_int = AF_ISO; +pub const AF_DATAKIT: ::c_int = 9; +pub const AF_CCITT: ::c_int = 10; +pub const AF_SNA: ::c_int = 11; +pub const AF_DECnet: ::c_int = 12; +pub const AF_DLI: ::c_int = 13; +pub const AF_LAT: ::c_int = 14; +pub const AF_HYLINK: ::c_int = 15; +pub const AF_APPLETALK: ::c_int = 16; +pub const AF_LINK: ::c_int = 18; +pub const pseudo_AF_XTP: ::c_int = 19; +pub const AF_COIP: ::c_int = 20; +pub const AF_CNT: ::c_int = 21; +pub const pseudo_AF_RTIP: ::c_int = 22; +pub const AF_IPX: ::c_int = 23; +pub const AF_INET6: ::c_int = 24; +pub const pseudo_AF_PIP: ::c_int = 25; +pub const AF_ISDN: ::c_int = 26; +pub const AF_E164: ::c_int = AF_ISDN; +pub const AF_NATM: ::c_int = 27; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_LOCAL: ::c_int = AF_LOCAL; +pub const PF_UNIX: ::c_int = PF_LOCAL; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_IMPLINK: ::c_int = AF_IMPLINK; +pub const PF_PUP: ::c_int = AF_PUP; +pub const PF_CHAOS: ::c_int = AF_CHAOS; +pub const PF_NS: ::c_int = AF_NS; +pub const PF_ISO: ::c_int = AF_ISO; +pub const PF_OSI: ::c_int = AF_ISO; +pub const PF_DATAKIT: ::c_int = AF_DATAKIT; +pub const PF_CCITT: ::c_int = AF_CCITT; +pub const PF_SNA: ::c_int = AF_SNA; +pub const PF_DECnet: ::c_int = AF_DECnet; +pub const PF_DLI: ::c_int = AF_DLI; +pub const PF_LAT: ::c_int = AF_LAT; +pub const PF_HYLINK: ::c_int = AF_HYLINK; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_LINK: ::c_int = AF_LINK; +pub const PF_XTP: ::c_int = pseudo_AF_XTP; +pub const PF_COIP: ::c_int = AF_COIP; +pub const PF_CNT: ::c_int = AF_CNT; +pub const PF_IPX: ::c_int = AF_IPX; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_RTIP: ::c_int = pseudo_AF_RTIP; +pub const PF_PIP: ::c_int = pseudo_AF_PIP; +pub const PF_ISDN: ::c_int = AF_ISDN; +pub const PF_NATM: ::c_int = AF_NATM; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const IPPROTO_ICMP: ::c_int = 1; +pub const IPPROTO_ICMPV6: ::c_int = 58; +pub const IPPROTO_TCP: ::c_int = 6; +pub const IPPROTO_IP: ::c_int = 0; +pub const IPPROTO_IPV6: ::c_int = 41; +pub const IP_MULTICAST_TTL: ::c_int = 10; +pub const IP_MULTICAST_LOOP: ::c_int = 11; +pub const IP_TTL: ::c_int = 4; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_ADD_MEMBERSHIP: ::c_int = 12; +pub const IP_DROP_MEMBERSHIP: ::c_int = 13; + +pub const TCP_NODELAY: ::c_int = 0x01; +pub const SOL_SOCKET: ::c_int = 0xffff; +pub const SO_DEBUG: ::c_int = 0x01; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; + +pub const SOMAXCONN: ::c_int = 128; + +pub const MSG_OOB: ::c_int = 0x1; +pub const MSG_PEEK: ::c_int = 0x2; +pub const MSG_DONTROUTE: ::c_int = 0x4; +pub const MSG_EOR: ::c_int = 0x8; +pub const MSG_TRUNC: ::c_int = 0x10; +pub const MSG_CTRUNC: ::c_int = 0x20; +pub const MSG_WAITALL: ::c_int = 0x40; +pub const MSG_DONTWAIT: ::c_int = 0x80; +pub const MSG_BCAST: ::c_int = 0x100; +pub const MSG_MCAST: ::c_int = 0x200; +pub const MSG_NOSIGNAL: ::c_int = 0x400; +pub const MSG_CMSG_CLOEXEC: ::c_int = 0x800; + +pub const SCM_RIGHTS: ::c_int = 0x01; + +pub const IFF_LOOPBACK: ::c_int = 0x8; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +pub const O_NONBLOCK : ::c_int = 4; + +pub const IPPROTO_RAW : ::c_int = 255; + +pub const _SC_ARG_MAX : ::c_int = 1; +pub const _SC_CHILD_MAX : ::c_int = 2; +pub const _SC_NGROUPS_MAX : ::c_int = 4; +pub const _SC_OPEN_MAX : ::c_int = 5; +pub const _SC_JOB_CONTROL : ::c_int = 6; +pub const _SC_SAVED_IDS : ::c_int = 7; +pub const _SC_VERSION : ::c_int = 8; +pub const _SC_BC_BASE_MAX : ::c_int = 9; +pub const _SC_BC_DIM_MAX : ::c_int = 10; +pub const _SC_BC_SCALE_MAX : ::c_int = 11; +pub const _SC_BC_STRING_MAX : ::c_int = 12; +pub const _SC_COLL_WEIGHTS_MAX : ::c_int = 13; +pub const _SC_EXPR_NEST_MAX : ::c_int = 14; +pub const _SC_LINE_MAX : ::c_int = 15; +pub const _SC_RE_DUP_MAX : ::c_int = 16; +pub const _SC_2_VERSION : ::c_int = 17; +pub const _SC_2_C_BIND : ::c_int = 18; +pub const _SC_2_C_DEV : ::c_int = 19; +pub const _SC_2_CHAR_TERM : ::c_int = 20; +pub const _SC_2_FORT_DEV : ::c_int = 21; +pub const _SC_2_FORT_RUN : ::c_int = 22; +pub const _SC_2_LOCALEDEF : ::c_int = 23; +pub const _SC_2_SW_DEV : ::c_int = 24; +pub const _SC_2_UPE : ::c_int = 25; +pub const _SC_STREAM_MAX : ::c_int = 26; +pub const _SC_TZNAME_MAX : ::c_int = 27; +pub const _SC_PAGESIZE : ::c_int = 28; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_FSYNC : ::c_int = 29; + +pub const Q_GETQUOTA: ::c_int = 0x300; +pub const Q_SETQUOTA: ::c_int = 0x400; + +pub const RTLD_GLOBAL: ::c_int = 0x100; + +pub const LOG_NFACILITIES: ::c_int = 24; + +pub const HW_NCPU: ::c_int = 3; + +pub const B0: speed_t = 0; +pub const B50: speed_t = 50; +pub const B75: speed_t = 75; +pub const B110: speed_t = 110; +pub const B134: speed_t = 134; +pub const B150: speed_t = 150; +pub const B200: speed_t = 200; +pub const B300: speed_t = 300; +pub const B600: speed_t = 600; +pub const B1200: speed_t = 1200; +pub const B1800: speed_t = 1800; +pub const B2400: speed_t = 2400; +pub const B4800: speed_t = 4800; +pub const B9600: speed_t = 9600; +pub const B19200: speed_t = 19200; +pub const B38400: speed_t = 38400; +pub const B7200: speed_t = 7200; +pub const B14400: speed_t = 14400; +pub const B28800: speed_t = 28800; +pub const B57600: speed_t = 57600; +pub const B76800: speed_t = 76800; +pub const B115200: speed_t = 115200; +pub const B230400: speed_t = 230400; +pub const EXTA: speed_t = 19200; +pub const EXTB: speed_t = 38400; + +pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t; + +f! { + pub fn WSTOPSIG(status: ::c_int) -> ::c_int { + status >> 8 + } + + pub fn WIFSIGNALED(status: ::c_int) -> bool { + (status & 0o177) != 0o177 && (status & 0o177) != 0 + } + + pub fn WIFSTOPPED(status: ::c_int) -> bool { + (status & 0o177) == 0o177 + } +} + +#[link(name = "util")] +extern { + pub fn mincore(addr: *mut ::c_void, len: ::size_t, + vec: *mut ::c_char) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__clock_getres50")] + pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__clock_gettime50")] + pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__clock_settime50")] + pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn __errno() -> *mut ::c_int; + pub fn shm_open(name: *const ::c_char, oflag: ::c_int, mode: ::mode_t) + -> ::c_int; + pub fn memrchr(cx: *const ::c_void, + c: ::c_int, + n: ::size_t) -> *mut ::c_void; + pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; + pub fn mkostemps(template: *mut ::c_char, + suffixlen: ::c_int, + flags: ::c_int) -> ::c_int; + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn fdatasync(fd: ::c_int) -> ::c_int; + pub fn openpty(amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize) -> ::c_int; + pub fn forkpty(amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize) -> ::pid_t; + pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; + + pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; + + pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t, dev: dev_t) -> ::c_int; + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t) -> ::c_int; + pub fn sem_timedwait(sem: *mut sem_t, + abstime: *const ::timespec) -> ::c_int; + pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, + clock_id: clockid_t) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t, + abstime: *const ::timespec) -> ::c_int; + pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_os = "netbsd")] { + mod netbsd; + pub use self::netbsd::*; + } else if #[cfg(any(target_os = "openbsd", target_os = "bitrig"))] { + mod openbsdlike; + pub use self::openbsdlike::*; + } else { + // Unknown target_os + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/mod.rs new file mode 100644 index 000000000..ffe8d75cb --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/mod.rs @@ -0,0 +1,725 @@ +pub type clock_t = ::c_uint; +pub type suseconds_t = ::c_int; +pub type dev_t = u64; +pub type blksize_t = ::int32_t; +pub type fsblkcnt_t = ::uint64_t; +pub type fsfilcnt_t = ::uint64_t; +pub type idtype_t = ::c_int; + +s! { + pub struct aiocb { + pub aio_offset: ::off_t, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_fildes: ::c_int, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_sigevent: ::sigevent, + _state: ::c_int, + _errno: ::c_int, + _retval: ::ssize_t + } + + pub struct dirent { + pub d_fileno: ::ino_t, + pub d_reclen: u16, + pub d_namlen: u16, + pub d_type: u8, + pub d_name: [::c_char; 512], + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_matchc: ::size_t, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + pub gl_pathv: *mut *mut ::c_char, + + __unused3: *mut ::c_void, + + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + __unused8: *mut ::c_void, + } + + pub struct sigevent { + pub sigev_notify: ::c_int, + pub sigev_signo: ::c_int, + pub sigev_value: ::sigval, + __unused1: *mut ::c_void, //actually a function pointer + pub sigev_notify_attributes: *mut ::c_void + } + + pub struct sigset_t { + __bits: [u32; 4], + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_mode: ::mode_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atimensec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtimensec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctimensec: ::c_long, + pub st_birthtime: ::time_t, + pub st_birthtimensec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::uint32_t, + pub st_gen: ::uint32_t, + pub st_spare: [::uint32_t; 2], + } + + pub struct statvfs { + pub f_flag: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_iosize: ::c_ulong, + + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_bresvd: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fresvd: ::fsfilcnt_t, + + pub f_syncreads: ::uint64_t, + pub f_syncwrites: ::uint64_t, + + pub f_asyncreads: ::uint64_t, + pub f_asyncwrites: ::uint64_t, + + pub f_fsidx: ::fsid_t, + pub f_fsid: ::c_ulong, + pub f_namemax: ::c_ulong, + pub f_owner: ::uid_t, + + pub f_spare: [::uint32_t; 4], + + pub f_fstypename: [::c_char; 32], + pub f_mntonname: [::c_char; 1024], + pub f_mntfromname: [::c_char; 1024], + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: ::socklen_t, + pub ai_canonname: *mut ::c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut ::addrinfo, + } + + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: ::sa_family_t, + __ss_pad1: [u8; 6], + __ss_pad2: i64, + __ss_pad3: [u8; 112], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + __pad1: ::c_int, + pub si_addr: *mut ::c_void, + __pad2: [u64; 13], + } + + pub struct pthread_attr_t { + pta_magic: ::c_uint, + pta_flags: ::c_int, + pta_private: *mut ::c_void, + } + + pub struct pthread_mutex_t { + ptm_magic: ::c_uint, + ptm_errorcheck: ::c_uchar, + ptm_pad1: [u8; 3], + ptm_interlock: ::c_uchar, + ptm_pad2: [u8; 3], + ptm_owner: ::pthread_t, + ptm_waiters: *mut u8, + ptm_recursed: ::c_uint, + ptm_spare2: *mut ::c_void, + } + + pub struct pthread_mutexattr_t { + ptma_magic: ::c_uint, + ptma_private: *mut ::c_void, + } + + pub struct pthread_cond_t { + ptc_magic: ::c_uint, + ptc_lock: ::c_uchar, + ptc_waiters_first: *mut u8, + ptc_waiters_last: *mut u8, + ptc_mutex: *mut ::pthread_mutex_t, + ptc_private: *mut ::c_void, + } + + pub struct pthread_condattr_t { + ptca_magic: ::c_uint, + ptca_private: *mut ::c_void, + } + + pub struct pthread_rwlock_t { + ptr_magic: ::c_uint, + ptr_interlock: ::c_uchar, + ptr_rblocked_first: *mut u8, + ptr_rblocked_last: *mut u8, + ptr_wblocked_first: *mut u8, + ptr_wblocked_last: *mut u8, + ptr_nreaders: ::c_uint, + ptr_owner: ::pthread_t, + ptr_private: *mut ::c_void, + } + + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: ::uint32_t, + pub flags: ::uint32_t, + pub fflags: ::uint32_t, + pub data: ::int64_t, + pub udata: ::intptr_t, + } + + pub struct dqblk { + pub dqb_bhardlimit: ::uint32_t, + pub dqb_bsoftlimit: ::uint32_t, + pub dqb_curblocks: ::uint32_t, + pub dqb_ihardlimit: ::uint32_t, + pub dqb_isoftlimit: ::uint32_t, + pub dqb_curinodes: ::uint32_t, + pub dqb_btime: ::int32_t, + pub dqb_itime: ::int32_t, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *const ::c_void, + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } +} + +pub const AT_FDCWD: ::c_int = -100; +pub const AT_EACCESS: ::c_int = 0x100; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x200; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400; +pub const AT_REMOVEDIR: ::c_int = 0x800; + +pub const LC_COLLATE_MASK: ::c_int = (1 << ::LC_COLLATE); +pub const LC_CTYPE_MASK: ::c_int = (1 << ::LC_CTYPE); +pub const LC_MONETARY_MASK: ::c_int = (1 << ::LC_MONETARY); +pub const LC_NUMERIC_MASK: ::c_int = (1 << ::LC_NUMERIC); +pub const LC_TIME_MASK: ::c_int = (1 << ::LC_TIME); +pub const LC_MESSAGES_MASK: ::c_int = (1 << ::LC_MESSAGES); +pub const LC_ALL_MASK: ::c_int = !0; + +pub const ERA: ::nl_item = 52; +pub const ERA_D_FMT: ::nl_item = 53; +pub const ERA_D_T_FMT: ::nl_item = 54; +pub const ERA_T_FMT: ::nl_item = 55; +pub const ALT_DIGITS: ::nl_item = 56; + +pub const O_CLOEXEC: ::c_int = 0x400000; +pub const O_ALT_IO: ::c_int = 0x40000; +pub const O_NOSIGPIPE: ::c_int = 0x1000000; +pub const O_SEARCH: ::c_int = 0x800000; +pub const O_EXLOCK: ::c_int = 0x20; +pub const O_SHLOCK: ::c_int = 0x10; +pub const O_DIRECTORY: ::c_int = 0x200000; + +pub const MS_SYNC : ::c_int = 0x4; +pub const MS_INVALIDATE : ::c_int = 0x2; + +pub const RLIM_NLIMITS: ::c_int = 12; + +pub const ENOATTR : ::c_int = 93; +pub const EILSEQ : ::c_int = 85; +pub const EOVERFLOW : ::c_int = 84; +pub const ECANCELED : ::c_int = 87; +pub const EIDRM : ::c_int = 82; +pub const ENOMSG : ::c_int = 83; +pub const ENOTSUP : ::c_int = 86; +pub const ELAST : ::c_int = 96; + +pub const F_DUPFD_CLOEXEC : ::c_int = 12; +pub const F_CLOSEM: ::c_int = 10; +pub const F_GETNOSIGPIPE: ::c_int = 13; +pub const F_SETNOSIGPIPE: ::c_int = 14; +pub const F_MAXFD: ::c_int = 11; + +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; + +pub const SOCK_CONN_DGRAM: ::c_int = 6; +pub const SOCK_DCCP: ::c_int = SOCK_CONN_DGRAM; +pub const SOCK_NOSIGPIPE: ::c_int = 0x40000000; +pub const SOCK_FLAGS_MASK: ::c_int = 0xf0000000; + +pub const SO_SNDTIMEO: ::c_int = 0x100b; +pub const SO_RCVTIMEO: ::c_int = 0x100c; +pub const SO_ACCEPTFILTER: ::c_int = 0x1000; +pub const SO_TIMESTAMP: ::c_int = 0x2000; +pub const SO_OVERFLOWED: ::c_int = 0x1009; +pub const SO_NOHEADER: ::c_int = 0x100a; + +pub const AF_OROUTE: ::c_int = 17; +pub const AF_ARP: ::c_int = 28; +pub const pseudo_AF_KEY: ::c_int = 29; +pub const pseudo_AF_HDRCMPLT: ::c_int = 30; +pub const AF_BLUETOOTH: ::c_int = 31; +pub const AF_IEEE80211: ::c_int = 32; +pub const AF_MPLS: ::c_int = 33; +pub const AF_ROUTE: ::c_int = 34; +pub const AF_MAX: ::c_int = 35; + +pub const NET_MAXID: ::c_int = AF_MAX; +pub const NET_RT_DUMP: ::c_int = 1; +pub const NET_RT_FLAGS: ::c_int = 2; +pub const NET_RT_OOIFLIST: ::c_int = 3; +pub const NET_RT_OIFLIST: ::c_int = 4; +pub const NET_RT_IFLIST: ::c_int = 5; +pub const NET_RT_MAXID: ::c_int = 6; + +pub const PF_OROUTE: ::c_int = AF_OROUTE; +pub const PF_ARP: ::c_int = AF_ARP; +pub const PF_KEY: ::c_int = pseudo_AF_KEY; +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; +pub const PF_MPLS: ::c_int = AF_MPLS; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_MAX: ::c_int = AF_MAX; + +pub const MSG_NBIO: ::c_int = 0x1000; +pub const MSG_WAITFORONE: ::c_int = 0x2000; +pub const MSG_NOTIFICATION: ::c_int = 0x4000; + +pub const SCM_TIMESTAMP: ::c_int = 0x08; +pub const SCM_CREDS: ::c_int = 0x10; + +pub const O_DSYNC : ::c_int = 0x10000; + +pub const MAP_RENAME : ::c_int = 0x20; +pub const MAP_NORESERVE : ::c_int = 0x40; +pub const MAP_HASSEMAPHORE : ::c_int = 0x200; +pub const MAP_WIRED: ::c_int = 0x800; + +pub const _SC_IOV_MAX : ::c_int = 32; +pub const _SC_GETGR_R_SIZE_MAX : ::c_int = 47; +pub const _SC_GETPW_R_SIZE_MAX : ::c_int = 48; +pub const _SC_LOGIN_NAME_MAX : ::c_int = 37; +pub const _SC_MQ_PRIO_MAX : ::c_int = 55; +pub const _SC_NPROCESSORS_ONLN : ::c_int = 1002; +pub const _SC_THREADS : ::c_int = 41; +pub const _SC_THREAD_ATTR_STACKADDR : ::c_int = 61; +pub const _SC_THREAD_ATTR_STACKSIZE : ::c_int = 62; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS : ::c_int = 57; +pub const _SC_THREAD_KEYS_MAX : ::c_int = 58; +pub const _SC_THREAD_PRIO_INHERIT : ::c_int = 64; +pub const _SC_THREAD_PRIO_PROTECT : ::c_int = 65; +pub const _SC_THREAD_PRIORITY_SCHEDULING : ::c_int = 63; +pub const _SC_THREAD_PROCESS_SHARED : ::c_int = 66; +pub const _SC_THREAD_SAFE_FUNCTIONS : ::c_int = 67; +pub const _SC_THREAD_STACK_MIN : ::c_int = 59; +pub const _SC_THREAD_THREADS_MAX : ::c_int = 60; +pub const _SC_TTY_NAME_MAX : ::c_int = 68; +pub const _SC_ATEXIT_MAX : ::c_int = 40; +pub const _SC_CLK_TCK : ::c_int = 39; +pub const _SC_AIO_LISTIO_MAX : ::c_int = 51; +pub const _SC_AIO_MAX : ::c_int = 52; +pub const _SC_ASYNCHRONOUS_IO : ::c_int = 50; +pub const _SC_MAPPED_FILES : ::c_int = 33; +pub const _SC_MEMLOCK : ::c_int = 34; +pub const _SC_MEMLOCK_RANGE : ::c_int = 35; +pub const _SC_MEMORY_PROTECTION : ::c_int = 36; +pub const _SC_MESSAGE_PASSING : ::c_int = 53; +pub const _SC_MQ_OPEN_MAX : ::c_int = 54; +pub const _SC_PRIORITY_SCHEDULING : ::c_int = 56; +pub const _SC_SEMAPHORES : ::c_int = 42; +pub const _SC_SHARED_MEMORY_OBJECTS : ::c_int = 87; +pub const _SC_SYNCHRONIZED_IO : ::c_int = 31; +pub const _SC_TIMERS : ::c_int = 44; +pub const _SC_HOST_NAME_MAX : ::c_int = 69; + +pub const FD_SETSIZE: usize = 0x100; + +pub const ST_NOSUID: ::c_ulong = 8; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + ptm_magic: 0x33330003, + ptm_errorcheck: 0, + ptm_interlock: 0, + ptm_waiters: 0 as *mut _, + ptm_owner: 0, + ptm_pad1: [0; 3], + ptm_pad2: [0; 3], + ptm_recursed: 0, + ptm_spare2: 0 as *mut _, +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + ptc_magic: 0x55550005, + ptc_lock: 0, + ptc_waiters_first: 0 as *mut _, + ptc_waiters_last: 0 as *mut _, + ptc_mutex: 0 as *mut _, + ptc_private: 0 as *mut _, +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + ptr_magic: 0x99990009, + ptr_interlock: 0, + ptr_rblocked_first: 0 as *mut _, + ptr_rblocked_last: 0 as *mut _, + ptr_wblocked_first: 0 as *mut _, + ptr_wblocked_last: 0 as *mut _, + ptr_nreaders: 0, + ptr_owner: 0, + ptr_private: 0 as *mut _, +}; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; + +pub const EVFILT_AIO: ::int32_t = 2; +pub const EVFILT_PROC: ::int32_t = 4; +pub const EVFILT_READ: ::int32_t = 0; +pub const EVFILT_SIGNAL: ::int32_t = 5; +pub const EVFILT_TIMER: ::int32_t = 6; +pub const EVFILT_VNODE: ::int32_t = 3; +pub const EVFILT_WRITE: ::int32_t = 1; + +pub const EV_ADD: ::uint32_t = 0x1; +pub const EV_DELETE: ::uint32_t = 0x2; +pub const EV_ENABLE: ::uint32_t = 0x4; +pub const EV_DISABLE: ::uint32_t = 0x8; +pub const EV_ONESHOT: ::uint32_t = 0x10; +pub const EV_CLEAR: ::uint32_t = 0x20; +pub const EV_RECEIPT: ::uint32_t = 0x40; +pub const EV_DISPATCH: ::uint32_t = 0x80; +pub const EV_FLAG1: ::uint32_t = 0x2000; +pub const EV_ERROR: ::uint32_t = 0x4000; +pub const EV_EOF: ::uint32_t = 0x8000; +pub const EV_SYSFLAGS: ::uint32_t = 0xf000; + +pub const NOTE_LOWAT: ::uint32_t = 0x00000001; +pub const NOTE_DELETE: ::uint32_t = 0x00000001; +pub const NOTE_WRITE: ::uint32_t = 0x00000002; +pub const NOTE_EXTEND: ::uint32_t = 0x00000004; +pub const NOTE_ATTRIB: ::uint32_t = 0x00000008; +pub const NOTE_LINK: ::uint32_t = 0x00000010; +pub const NOTE_RENAME: ::uint32_t = 0x00000020; +pub const NOTE_REVOKE: ::uint32_t = 0x00000040; +pub const NOTE_EXIT: ::uint32_t = 0x80000000; +pub const NOTE_FORK: ::uint32_t = 0x40000000; +pub const NOTE_EXEC: ::uint32_t = 0x20000000; +pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff; +pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000; +pub const NOTE_TRACK: ::uint32_t = 0x00000001; +pub const NOTE_TRACKERR: ::uint32_t = 0x00000002; +pub const NOTE_CHILD: ::uint32_t = 0x00000004; + +pub const CRTSCTS: ::tcflag_t = 0x00010000; + +pub const TMP_MAX : ::c_uint = 308915776; + +pub const NI_MAXHOST: ::socklen_t = 1025; + +pub const RTLD_NOLOAD: ::c_int = 0x2000; +pub const RTLD_LOCAL: ::c_int = 0x200; + +pub const CTL_MAXNAME: ::c_int = 12; +pub const SYSCTL_NAMELEN: ::c_int = 32; +pub const SYSCTL_DEFSIZE: ::c_int = 8; +pub const CTLTYPE_NODE: ::c_int = 1; +pub const CTLTYPE_INT: ::c_int = 2; +pub const CTLTYPE_STRING: ::c_int = 3; +pub const CTLTYPE_QUAD: ::c_int = 4; +pub const CTLTYPE_STRUCT: ::c_int = 5; +pub const CTLTYPE_BOOL: ::c_int = 6; +pub const CTLFLAG_READONLY: ::c_int = 0x00000000; +pub const CTLFLAG_READWRITE: ::c_int = 0x00000070; +pub const CTLFLAG_ANYWRITE: ::c_int = 0x00000080; +pub const CTLFLAG_PRIVATE: ::c_int = 0x00000100; +pub const CTLFLAG_PERMANENT: ::c_int = 0x00000200; +pub const CTLFLAG_OWNDATA: ::c_int = 0x00000400; +pub const CTLFLAG_IMMEDIATE: ::c_int = 0x00000800; +pub const CTLFLAG_HEX: ::c_int = 0x00001000; +pub const CTLFLAG_ROOT: ::c_int = 0x00002000; +pub const CTLFLAG_ANYNUMBER: ::c_int = 0x00004000; +pub const CTLFLAG_HIDDEN: ::c_int = 0x00008000; +pub const CTLFLAG_ALIAS: ::c_int = 0x00010000; +pub const CTLFLAG_MMAP: ::c_int = 0x00020000; +pub const CTLFLAG_OWNDESC: ::c_int = 0x00040000; +pub const CTLFLAG_UNSIGNED: ::c_int = 0x00080000; +pub const SYSCTL_VERS_MASK: ::c_int = 0xff000000; +pub const SYSCTL_VERS_0: ::c_int = 0x00000000; +pub const SYSCTL_VERS_1: ::c_int = 0x01000000; +pub const SYSCTL_VERSION: ::c_int = SYSCTL_VERS_1; +pub const CTL_EOL: ::c_int = -1; +pub const CTL_QUERY: ::c_int = -2; +pub const CTL_CREATE: ::c_int = -3; +pub const CTL_CREATESYM: ::c_int = -4; +pub const CTL_DESTROY: ::c_int = -5; +pub const CTL_MMAP: ::c_int = -6; +pub const CTL_DESCRIBE: ::c_int = -7; +pub const CTL_UNSPEC: ::c_int = 0; +pub const CTL_KERN: ::c_int = 1; +pub const CTL_VM: ::c_int = 2; +pub const CTL_VFS: ::c_int = 3; +pub const CTL_NET: ::c_int = 4; +pub const CTL_DEBUG: ::c_int = 5; +pub const CTL_HW: ::c_int = 6; +pub const CTL_MACHDEP: ::c_int = 7; +pub const CTL_USER: ::c_int = 8; +pub const CTL_DDB: ::c_int = 9; +pub const CTL_PROC: ::c_int = 10; +pub const CTL_VENDOR: ::c_int = 11; +pub const CTL_EMUL: ::c_int = 12; +pub const CTL_SECURITY: ::c_int = 13; +pub const CTL_MAXID: ::c_int = 14; +pub const KERN_OSTYPE: ::c_int = 1; +pub const KERN_OSRELEASE: ::c_int = 2; +pub const KERN_OSREV: ::c_int = 3; +pub const KERN_VERSION: ::c_int = 4; +pub const KERN_MAXVNODES: ::c_int = 5; +pub const KERN_MAXPROC: ::c_int = 6; +pub const KERN_MAXFILES: ::c_int = 7; +pub const KERN_ARGMAX: ::c_int = 8; +pub const KERN_SECURELVL: ::c_int = 9; +pub const KERN_HOSTNAME: ::c_int = 10; +pub const KERN_HOSTID: ::c_int = 11; +pub const KERN_CLOCKRATE: ::c_int = 12; +pub const KERN_VNODE: ::c_int = 13; +pub const KERN_PROC: ::c_int = 14; +pub const KERN_FILE: ::c_int = 15; +pub const KERN_PROF: ::c_int = 16; +pub const KERN_POSIX1: ::c_int = 17; +pub const KERN_NGROUPS: ::c_int = 18; +pub const KERN_JOB_CONTROL: ::c_int = 19; +pub const KERN_SAVED_IDS: ::c_int = 20; +pub const KERN_OBOOTTIME: ::c_int = 21; +pub const KERN_DOMAINNAME: ::c_int = 22; +pub const KERN_MAXPARTITIONS: ::c_int = 23; +pub const KERN_RAWPARTITION: ::c_int = 24; +pub const KERN_NTPTIME: ::c_int = 25; +pub const KERN_TIMEX: ::c_int = 26; +pub const KERN_AUTONICETIME: ::c_int = 27; +pub const KERN_AUTONICEVAL: ::c_int = 28; +pub const KERN_RTC_OFFSET: ::c_int = 29; +pub const KERN_ROOT_DEVICE: ::c_int = 30; +pub const KERN_MSGBUFSIZE: ::c_int = 31; +pub const KERN_FSYNC: ::c_int = 32; +pub const KERN_OLDSYSVMSG: ::c_int = 33; +pub const KERN_OLDSYSVSEM: ::c_int = 34; +pub const KERN_OLDSYSVSHM: ::c_int = 35; +pub const KERN_OLDSHORTCORENAME: ::c_int = 36; +pub const KERN_SYNCHRONIZED_IO: ::c_int = 37; +pub const KERN_IOV_MAX: ::c_int = 38; +pub const KERN_MBUF: ::c_int = 39; +pub const KERN_MAPPED_FILES: ::c_int = 40; +pub const KERN_MEMLOCK: ::c_int = 41; +pub const KERN_MEMLOCK_RANGE: ::c_int = 42; +pub const KERN_MEMORY_PROTECTION: ::c_int = 43; +pub const KERN_LOGIN_NAME_MAX: ::c_int = 44; +pub const KERN_DEFCORENAME: ::c_int = 45; +pub const KERN_LOGSIGEXIT: ::c_int = 46; +pub const KERN_PROC2: ::c_int = 47; +pub const KERN_PROC_ARGS: ::c_int = 48; +pub const KERN_FSCALE: ::c_int = 49; +pub const KERN_CCPU: ::c_int = 50; +pub const KERN_CP_TIME: ::c_int = 51; +pub const KERN_OLDSYSVIPC_INFO: ::c_int = 52; +pub const KERN_MSGBUF: ::c_int = 53; +pub const KERN_CONSDEV: ::c_int = 54; +pub const KERN_MAXPTYS: ::c_int = 55; +pub const KERN_PIPE: ::c_int = 56; +pub const KERN_MAXPHYS: ::c_int = 57; +pub const KERN_SBMAX: ::c_int = 58; +pub const KERN_TKSTAT: ::c_int = 59; +pub const KERN_MONOTONIC_CLOCK: ::c_int = 60; +pub const KERN_URND: ::c_int = 61; +pub const KERN_LABELSECTOR: ::c_int = 62; +pub const KERN_LABELOFFSET: ::c_int = 63; +pub const KERN_LWP: ::c_int = 64; +pub const KERN_FORKFSLEEP: ::c_int = 65; +pub const KERN_POSIX_THREADS: ::c_int = 66; +pub const KERN_POSIX_SEMAPHORES: ::c_int = 67; +pub const KERN_POSIX_BARRIERS: ::c_int = 68; +pub const KERN_POSIX_TIMERS: ::c_int = 69; +pub const KERN_POSIX_SPIN_LOCKS: ::c_int = 70; +pub const KERN_POSIX_READER_WRITER_LOCKS: ::c_int = 71; +pub const KERN_DUMP_ON_PANIC: ::c_int = 72; +pub const KERN_SOMAXKVA: ::c_int = 73; +pub const KERN_ROOT_PARTITION: ::c_int = 74; +pub const KERN_DRIVERS: ::c_int = 75; +pub const KERN_BUF: ::c_int = 76; +pub const KERN_FILE2: ::c_int = 77; +pub const KERN_VERIEXEC: ::c_int = 78; +pub const KERN_CP_ID: ::c_int = 79; +pub const KERN_HARDCLOCK_TICKS: ::c_int = 80; +pub const KERN_ARND: ::c_int = 81; +pub const KERN_SYSVIPC: ::c_int = 82; +pub const KERN_BOOTTIME: ::c_int = 83; +pub const KERN_EVCNT: ::c_int = 84; +pub const KERN_MAXID: ::c_int = 85; +pub const KERN_PROC_ALL: ::c_int = 0; +pub const KERN_PROC_PID: ::c_int = 1; +pub const KERN_PROC_PGRP: ::c_int = 2; +pub const KERN_PROC_SESSION: ::c_int = 3; +pub const KERN_PROC_TTY: ::c_int = 4; +pub const KERN_PROC_UID: ::c_int = 5; +pub const KERN_PROC_RUID: ::c_int = 6; +pub const KERN_PROC_GID: ::c_int = 7; +pub const KERN_PROC_RGID: ::c_int = 8; + +pub const EAI_SYSTEM: ::c_int = 11; + +pub const AIO_CANCELED: ::c_int = 1; +pub const AIO_NOTCANCELED: ::c_int = 2; +pub const AIO_ALLDONE: ::c_int = 3; +pub const LIO_NOP: ::c_int = 0; +pub const LIO_WRITE: ::c_int = 1; +pub const LIO_READ: ::c_int = 2; +pub const LIO_WAIT: ::c_int = 1; +pub const LIO_NOWAIT: ::c_int = 0; + +pub const SIGEV_NONE: ::c_int = 0; +pub const SIGEV_SIGNAL: ::c_int = 1; +pub const SIGEV_THREAD: ::c_int = 2; + +pub const WSTOPPED: ::c_int = 0x00000002; // same as WUNTRACED +pub const WCONTINUED: ::c_int = 0x00000010; +pub const WEXITED: ::c_int = 0x000000020; +pub const WNOWAIT: ::c_int = 0x00010000; + +pub const P_ALL: idtype_t = 0; +pub const P_PID: idtype_t = 1; +pub const P_PGID: idtype_t = 4; + +pub const B460800: ::speed_t = 460800; +pub const B921600: ::speed_t = 921600; + +extern { + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + #[link_name = "__aio_suspend50"] + pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int, + timeout: *const ::timespec) -> ::c_int; + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb, + nitems: ::c_int, sevp: *mut sigevent) -> ::c_int; + + pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; + pub fn getnameinfo(sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int) -> ::c_int; + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) + -> ::c_int; + pub fn sysctl(name: *const ::c_int, + namelen: ::c_uint, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *const ::c_void, + newlen: ::size_t) + -> ::c_int; + pub fn sysctlbyname(name: *const ::c_char, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *const ::c_void, + newlen: ::size_t) + -> ::c_int; + #[link_name = "__kevent50"] + pub fn kevent(kq: ::c_int, + changelist: *const ::kevent, + nchanges: ::size_t, + eventlist: *mut ::kevent, + nevents: ::size_t, + timeout: *const ::timespec) -> ::c_int; + #[link_name = "__mount50"] + pub fn mount(src: *const ::c_char, + target: *const ::c_char, + flags: ::c_int, + data: *mut ::c_void, + size: ::size_t) -> ::c_int; + pub fn ptrace(requeset: ::c_int, + pid: ::pid_t, + addr: *mut ::c_void, + data: ::c_int) -> ::c_int; + pub fn pthread_setname_np(t: ::pthread_t, + name: *const ::c_char, + arg: *mut ::c_void) -> ::c_int; + pub fn pthread_getattr_np(native: ::pthread_t, + attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t) -> ::c_int; + pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t) -> ::c_int; + #[link_name = "__sigtimedwait50"] + pub fn sigtimedwait(set: *const sigset_t, + info: *mut siginfo_t, + timeout: *const ::timespec) -> ::c_int; + pub fn sigwaitinfo(set: *const sigset_t, + info: *mut siginfo_t) -> ::c_int; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t); + pub fn localeconv_l(loc: ::locale_t) -> *mut lconv; + pub fn newlocale(mask: ::c_int, + locale: *const ::c_char, + base: ::locale_t) -> ::locale_t; +} + +mod other; +pub use self::other::*; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs new file mode 100644 index 000000000..9b0b338b9 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs @@ -0,0 +1,2 @@ +pub type c_long = i32; +pub type c_ulong = u32; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs new file mode 100644 index 000000000..b07c476aa --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs @@ -0,0 +1,2 @@ +pub type c_long = i64; +pub type c_ulong = u64; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/mod.rs new file mode 100644 index 000000000..3a9bf0866 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/mod.rs @@ -0,0 +1,14 @@ +cfg_if! { + if #[cfg(any(target_arch = "sparc64", + target_arch = "x86_64"))] { + mod b64; + pub use self::b64::*; + } else if #[cfg(any(target_arch = "arm", + target_arch = "powerpc", + target_arch = "x86"))] { + mod b32; + pub use self::b32::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs new file mode 100644 index 000000000..695cf68dc --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs @@ -0,0 +1,75 @@ +s! { + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } +} + +pub const LC_COLLATE_MASK: ::c_int = (1 << 0); +pub const LC_CTYPE_MASK: ::c_int = (1 << 1); +pub const LC_MESSAGES_MASK: ::c_int = (1 << 2); +pub const LC_MONETARY_MASK: ::c_int = (1 << 3); +pub const LC_NUMERIC_MASK: ::c_int = (1 << 4); +pub const LC_TIME_MASK: ::c_int = (1 << 5); +pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK + | LC_CTYPE_MASK + | LC_MESSAGES_MASK + | LC_MONETARY_MASK + | LC_NUMERIC_MASK + | LC_TIME_MASK; + +pub const ERA: ::nl_item = 52; +pub const ERA_D_FMT: ::nl_item = 53; +pub const ERA_D_T_FMT: ::nl_item = 54; +pub const ERA_T_FMT: ::nl_item = 55; +pub const ALT_DIGITS: ::nl_item = 56; + +pub const D_MD_ORDER: ::nl_item = 57; + +pub const ALTMON_1: ::nl_item = 58; +pub const ALTMON_2: ::nl_item = 59; +pub const ALTMON_3: ::nl_item = 60; +pub const ALTMON_4: ::nl_item = 61; +pub const ALTMON_5: ::nl_item = 62; +pub const ALTMON_6: ::nl_item = 63; +pub const ALTMON_7: ::nl_item = 64; +pub const ALTMON_8: ::nl_item = 65; +pub const ALTMON_9: ::nl_item = 66; +pub const ALTMON_10: ::nl_item = 67; +pub const ALTMON_11: ::nl_item = 68; +pub const ALTMON_12: ::nl_item = 69; + +pub const KERN_RND: ::c_int = 31; + +extern { + pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t) -> ::c_int; + pub fn newlocale(mask: ::c_int, + locale: *const ::c_char, + base: ::locale_t) -> ::locale_t; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char; +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/mod.rs new file mode 100644 index 000000000..b0d8128c0 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/mod.rs @@ -0,0 +1,504 @@ +pub type clock_t = i64; +pub type suseconds_t = ::c_long; +pub type dev_t = i32; +pub type sigset_t = ::c_uint; +pub type blksize_t = ::int32_t; +pub type fsblkcnt_t = ::uint64_t; +pub type fsfilcnt_t = ::uint64_t; +pub type pthread_attr_t = *mut ::c_void; +pub type pthread_mutex_t = *mut ::c_void; +pub type pthread_mutexattr_t = *mut ::c_void; +pub type pthread_cond_t = *mut ::c_void; +pub type pthread_condattr_t = *mut ::c_void; +pub type pthread_rwlock_t = *mut ::c_void; + +s! { + pub struct dirent { + pub d_fileno: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: u16, + pub d_type: u8, + pub d_namlen: u8, + __d_padding: [u8; 4], + pub d_name: [::c_char; 256], + } + + pub struct glob_t { + pub gl_pathc: ::c_int, + pub gl_matchc: ::c_int, + pub gl_offs: ::c_int, + pub gl_flags: ::c_int, + pub gl_pathv: *mut *mut ::c_char, + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + } + + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: ::c_short, + pub flags: ::c_ushort, + pub fflags: ::c_uint, + pub data: ::int64_t, + pub udata: *mut ::c_void, + } + + pub struct stat { + pub st_mode: ::mode_t, + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::uint32_t, + pub st_gen: ::uint32_t, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: ::socklen_t, + pub ai_addr: *mut ::sockaddr, + pub ai_canonname: *mut ::c_char, + pub ai_next: *mut ::addrinfo, + } + + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: ::sa_family_t, + __ss_pad1: [u8; 6], + __ss_pad2: i64, + __ss_pad3: [u8; 240], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + pub si_addr: *mut ::c_char, + #[cfg(target_pointer_width = "32")] + __pad: [u8; 112], + #[cfg(target_pointer_width = "64")] + __pad: [u8; 108], + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct lastlog { + ll_time: ::time_t, + ll_line: [::c_char; UT_LINESIZE], + ll_host: [::c_char; UT_HOSTSIZE], + } + + pub struct utmp { + pub ut_line: [::c_char; UT_LINESIZE], + pub ut_name: [::c_char; UT_NAMESIZE], + pub ut_host: [::c_char; UT_HOSTSIZE], + pub ut_time: ::time_t, + } +} + +pub const UT_NAMESIZE: usize = 32; +pub const UT_LINESIZE: usize = 8; +pub const UT_HOSTSIZE: usize = 256; + +pub const O_CLOEXEC: ::c_int = 0x10000; + +pub const MS_SYNC : ::c_int = 0x0002; +pub const MS_INVALIDATE : ::c_int = 0x0004; + +pub const PTHREAD_STACK_MIN : ::size_t = 2048; + +pub const ENOATTR : ::c_int = 83; +pub const EILSEQ : ::c_int = 84; +pub const EOVERFLOW : ::c_int = 87; +pub const ECANCELED : ::c_int = 88; +pub const EIDRM : ::c_int = 89; +pub const ENOMSG : ::c_int = 90; +pub const ENOTSUP : ::c_int = 91; +pub const ELAST : ::c_int = 91; + +pub const F_DUPFD_CLOEXEC : ::c_int = 10; + +pub const AT_FDCWD: ::c_int = -100; +pub const AT_EACCESS: ::c_int = 0x01; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x02; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x04; +pub const AT_REMOVEDIR: ::c_int = 0x08; + +pub const RLIM_NLIMITS: ::c_int = 9; + +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_BINDANY: ::c_int = 0x1000; +pub const SO_NETPROC: ::c_int = 0x1020; +pub const SO_RTABLE: ::c_int = 0x1021; +pub const SO_PEERCRED: ::c_int = 0x1022; +pub const SO_SPLICE: ::c_int = 0x1023; + +pub const AF_ECMA: ::c_int = 8; +pub const AF_ROUTE: ::c_int = 17; +pub const AF_ENCAP: ::c_int = 28; +pub const AF_SIP: ::c_int = 29; +pub const AF_KEY: ::c_int = 30; +pub const pseudo_AF_HDRCMPLT: ::c_int = 31; +pub const AF_BLUETOOTH: ::c_int = 32; +pub const AF_MPLS: ::c_int = 33; +pub const pseudo_AF_PFLOW: ::c_int = 34; +pub const pseudo_AF_PIPEX: ::c_int = 35; +#[doc(hidden)] +pub const AF_MAX: ::c_int = 36; + +#[doc(hidden)] +pub const NET_MAXID: ::c_int = AF_MAX; +pub const NET_RT_DUMP: ::c_int = 1; +pub const NET_RT_FLAGS: ::c_int = 2; +pub const NET_RT_IFLIST: ::c_int = 3; +pub const NET_RT_STATS: ::c_int = 4; +pub const NET_RT_TABLE: ::c_int = 5; +pub const NET_RT_IFNAMES: ::c_int = 6; +#[doc(hidden)] +pub const NET_RT_MAXID: ::c_int = 7; + +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; + +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_ECMA: ::c_int = AF_ECMA; +pub const PF_ENCAP: ::c_int = AF_ENCAP; +pub const PF_SIP: ::c_int = AF_SIP; +pub const PF_KEY: ::c_int = AF_KEY; +pub const PF_BPF: ::c_int = pseudo_AF_HDRCMPLT; +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; +pub const PF_MPLS: ::c_int = AF_MPLS; +pub const PF_PFLOW: ::c_int = pseudo_AF_PFLOW; +pub const PF_PIPEX: ::c_int = pseudo_AF_PIPEX; +#[doc(hidden)] +pub const PF_MAX: ::c_int = AF_MAX; + +pub const SCM_TIMESTAMP: ::c_int = 0x04; + +pub const O_DSYNC : ::c_int = 128; + +pub const MAP_RENAME : ::c_int = 0x0000; +pub const MAP_NORESERVE : ::c_int = 0x0000; +pub const MAP_HASSEMAPHORE : ::c_int = 0x0000; + +pub const EIPSEC : ::c_int = 82; +pub const ENOMEDIUM : ::c_int = 85; +pub const EMEDIUMTYPE : ::c_int = 86; + +pub const EAI_SYSTEM: ::c_int = -11; + +pub const RUSAGE_THREAD: ::c_int = 1; + +pub const MAP_COPY : ::c_int = 0x0002; +pub const MAP_NOEXTEND : ::c_int = 0x0000; + +pub const _SC_CLK_TCK : ::c_int = 3; +pub const _SC_IOV_MAX : ::c_int = 51; +pub const _SC_GETGR_R_SIZE_MAX : ::c_int = 100; +pub const _SC_GETPW_R_SIZE_MAX : ::c_int = 101; +pub const _SC_LOGIN_NAME_MAX : ::c_int = 102; +pub const _SC_MQ_PRIO_MAX : ::c_int = 59; +pub const _SC_NPROCESSORS_ONLN : ::c_int = 503; +pub const _SC_THREADS : ::c_int = 91; +pub const _SC_THREAD_ATTR_STACKADDR : ::c_int = 77; +pub const _SC_THREAD_ATTR_STACKSIZE : ::c_int = 78; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS : ::c_int = 80; +pub const _SC_THREAD_KEYS_MAX : ::c_int = 81; +pub const _SC_THREAD_PRIO_INHERIT : ::c_int = 82; +pub const _SC_THREAD_PRIO_PROTECT : ::c_int = 83; +pub const _SC_THREAD_PRIORITY_SCHEDULING : ::c_int = 84; +pub const _SC_THREAD_PROCESS_SHARED : ::c_int = 85; +pub const _SC_THREAD_SAFE_FUNCTIONS : ::c_int = 103; +pub const _SC_THREAD_STACK_MIN : ::c_int = 89; +pub const _SC_THREAD_THREADS_MAX : ::c_int = 90; +pub const _SC_TTY_NAME_MAX : ::c_int = 107; +pub const _SC_ATEXIT_MAX : ::c_int = 46; +pub const _SC_AIO_LISTIO_MAX : ::c_int = 42; +pub const _SC_AIO_MAX : ::c_int = 43; +pub const _SC_ASYNCHRONOUS_IO : ::c_int = 45; +pub const _SC_MAPPED_FILES : ::c_int = 53; +pub const _SC_MEMLOCK : ::c_int = 54; +pub const _SC_MEMLOCK_RANGE : ::c_int = 55; +pub const _SC_MEMORY_PROTECTION : ::c_int = 56; +pub const _SC_MESSAGE_PASSING : ::c_int = 57; +pub const _SC_MQ_OPEN_MAX : ::c_int = 58; +pub const _SC_PRIORITY_SCHEDULING : ::c_int = 61; +pub const _SC_SEMAPHORES : ::c_int = 67; +pub const _SC_SHARED_MEMORY_OBJECTS : ::c_int = 68; +pub const _SC_SYNCHRONIZED_IO : ::c_int = 75; +pub const _SC_TIMERS : ::c_int = 94; +pub const _SC_XOPEN_CRYPT : ::c_int = 117; +pub const _SC_XOPEN_ENH_I18N : ::c_int = 118; +pub const _SC_XOPEN_LEGACY : ::c_int = 119; +pub const _SC_XOPEN_REALTIME : ::c_int = 120; +pub const _SC_XOPEN_REALTIME_THREADS : ::c_int = 121; +pub const _SC_XOPEN_UNIX : ::c_int = 123; +pub const _SC_XOPEN_VERSION : ::c_int = 125; +pub const _SC_SEM_NSEMS_MAX : ::c_int = 31; +pub const _SC_SEM_VALUE_MAX : ::c_int = 32; +pub const _SC_AIO_PRIO_DELTA_MAX : ::c_int = 44; +pub const _SC_DELAYTIMER_MAX : ::c_int = 50; +pub const _SC_PRIORITIZED_IO : ::c_int = 60; +pub const _SC_REALTIME_SIGNALS : ::c_int = 64; +pub const _SC_RTSIG_MAX : ::c_int = 66; +pub const _SC_SIGQUEUE_MAX : ::c_int = 70; +pub const _SC_TIMER_MAX : ::c_int = 93; +pub const _SC_HOST_NAME_MAX : ::c_int = 33; + +pub const FD_SETSIZE: usize = 1024; + +pub const ST_NOSUID: ::c_ulong = 2; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = 0 as *mut _; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = 0 as *mut _; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = 0 as *mut _; + +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 3; +pub const PTHREAD_MUTEX_STRICT_NP: ::c_int = 4; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_STRICT_NP; + +pub const EVFILT_AIO: ::int16_t = -3; +pub const EVFILT_PROC: ::int16_t = -5; +pub const EVFILT_READ: ::int16_t = -1; +pub const EVFILT_SIGNAL: ::int16_t = -6; +pub const EVFILT_TIMER: ::int16_t = -7; +pub const EVFILT_VNODE: ::int16_t = -4; +pub const EVFILT_WRITE: ::int16_t = -2; + +pub const EV_ADD: ::uint16_t = 0x1; +pub const EV_DELETE: ::uint16_t = 0x2; +pub const EV_ENABLE: ::uint16_t = 0x4; +pub const EV_DISABLE: ::uint16_t = 0x8; +pub const EV_ONESHOT: ::uint16_t = 0x10; +pub const EV_CLEAR: ::uint16_t = 0x20; +pub const EV_FLAG1: ::uint16_t = 0x2000; +pub const EV_ERROR: ::uint16_t = 0x4000; +pub const EV_EOF: ::uint16_t = 0x8000; +pub const EV_SYSFLAGS: ::uint16_t = 0xf000; + +pub const NOTE_LOWAT: ::uint32_t = 0x00000001; +pub const NOTE_EOF: ::uint32_t = 0x00000002; +pub const NOTE_DELETE: ::uint32_t = 0x00000001; +pub const NOTE_WRITE: ::uint32_t = 0x00000002; +pub const NOTE_EXTEND: ::uint32_t = 0x00000004; +pub const NOTE_ATTRIB: ::uint32_t = 0x00000008; +pub const NOTE_LINK: ::uint32_t = 0x00000010; +pub const NOTE_RENAME: ::uint32_t = 0x00000020; +pub const NOTE_REVOKE: ::uint32_t = 0x00000040; +pub const NOTE_TRUNCATE: ::uint32_t = 0x00000080; +pub const NOTE_EXIT: ::uint32_t = 0x80000000; +pub const NOTE_FORK: ::uint32_t = 0x40000000; +pub const NOTE_EXEC: ::uint32_t = 0x20000000; +pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff; +pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000; +pub const NOTE_TRACK: ::uint32_t = 0x00000001; +pub const NOTE_TRACKERR: ::uint32_t = 0x00000002; +pub const NOTE_CHILD: ::uint32_t = 0x00000004; + +pub const TMP_MAX : ::c_uint = 0x7fffffff; + +pub const NI_MAXHOST: ::size_t = 256; + +pub const RTLD_LOCAL: ::c_int = 0; +pub const CTL_MAXNAME: ::c_int = 12; +pub const CTLTYPE_NODE: ::c_int = 1; +pub const CTLTYPE_INT: ::c_int = 2; +pub const CTLTYPE_STRING: ::c_int = 3; +pub const CTLTYPE_QUAD: ::c_int = 4; +pub const CTLTYPE_STRUCT: ::c_int = 5; +pub const CTL_UNSPEC: ::c_int = 0; +pub const CTL_KERN: ::c_int = 1; +pub const CTL_VM: ::c_int = 2; +pub const CTL_FS: ::c_int = 3; +pub const CTL_NET: ::c_int = 4; +pub const CTL_DEBUG: ::c_int = 5; +pub const CTL_HW: ::c_int = 6; +pub const CTL_MACHDEP: ::c_int = 7; +pub const CTL_DDB: ::c_int = 9; +pub const CTL_VFS: ::c_int = 10; +pub const CTL_MAXID: ::c_int = 11; +pub const KERN_OSTYPE: ::c_int = 1; +pub const KERN_OSRELEASE: ::c_int = 2; +pub const KERN_OSREV: ::c_int = 3; +pub const KERN_VERSION: ::c_int = 4; +pub const KERN_MAXVNODES: ::c_int = 5; +pub const KERN_MAXPROC: ::c_int = 6; +pub const KERN_MAXFILES: ::c_int = 7; +pub const KERN_ARGMAX: ::c_int = 8; +pub const KERN_SECURELVL: ::c_int = 9; +pub const KERN_HOSTNAME: ::c_int = 10; +pub const KERN_HOSTID: ::c_int = 11; +pub const KERN_CLOCKRATE: ::c_int = 12; +pub const KERN_PROF: ::c_int = 16; +pub const KERN_POSIX1: ::c_int = 17; +pub const KERN_NGROUPS: ::c_int = 18; +pub const KERN_JOB_CONTROL: ::c_int = 19; +pub const KERN_SAVED_IDS: ::c_int = 20; +pub const KERN_BOOTTIME: ::c_int = 21; +pub const KERN_DOMAINNAME: ::c_int = 22; +pub const KERN_MAXPARTITIONS: ::c_int = 23; +pub const KERN_RAWPARTITION: ::c_int = 24; +pub const KERN_MAXTHREAD: ::c_int = 25; +pub const KERN_NTHREADS: ::c_int = 26; +pub const KERN_OSVERSION: ::c_int = 27; +pub const KERN_SOMAXCONN: ::c_int = 28; +pub const KERN_SOMINCONN: ::c_int = 29; +pub const KERN_USERMOUNT: ::c_int = 30; +pub const KERN_NOSUIDCOREDUMP: ::c_int = 32; +pub const KERN_FSYNC: ::c_int = 33; +pub const KERN_SYSVMSG: ::c_int = 34; +pub const KERN_SYSVSEM: ::c_int = 35; +pub const KERN_SYSVSHM: ::c_int = 36; +pub const KERN_ARND: ::c_int = 37; +pub const KERN_MSGBUFSIZE: ::c_int = 38; +pub const KERN_MALLOCSTATS: ::c_int = 39; +pub const KERN_CPTIME: ::c_int = 40; +pub const KERN_NCHSTATS: ::c_int = 41; +pub const KERN_FORKSTAT: ::c_int = 42; +pub const KERN_NSELCOLL: ::c_int = 43; +pub const KERN_TTY: ::c_int = 44; +pub const KERN_CCPU: ::c_int = 45; +pub const KERN_FSCALE: ::c_int = 46; +pub const KERN_NPROCS: ::c_int = 47; +pub const KERN_MSGBUF: ::c_int = 48; +pub const KERN_POOL: ::c_int = 49; +pub const KERN_STACKGAPRANDOM: ::c_int = 50; +pub const KERN_SYSVIPC_INFO: ::c_int = 51; +pub const KERN_SPLASSERT: ::c_int = 54; +pub const KERN_PROC_ARGS: ::c_int = 55; +pub const KERN_NFILES: ::c_int = 56; +pub const KERN_TTYCOUNT: ::c_int = 57; +pub const KERN_NUMVNODES: ::c_int = 58; +pub const KERN_MBSTAT: ::c_int = 59; +pub const KERN_SEMINFO: ::c_int = 61; +pub const KERN_SHMINFO: ::c_int = 62; +pub const KERN_INTRCNT: ::c_int = 63; +pub const KERN_WATCHDOG: ::c_int = 64; +pub const KERN_PROC: ::c_int = 66; +pub const KERN_MAXCLUSTERS: ::c_int = 67; +pub const KERN_EVCOUNT: ::c_int = 68; +pub const KERN_TIMECOUNTER: ::c_int = 69; +pub const KERN_MAXLOCKSPERUID: ::c_int = 70; +pub const KERN_CPTIME2: ::c_int = 71; +pub const KERN_CACHEPCT: ::c_int = 72; +pub const KERN_FILE: ::c_int = 73; +pub const KERN_CONSDEV: ::c_int = 75; +pub const KERN_NETLIVELOCKS: ::c_int = 76; +pub const KERN_POOL_DEBUG: ::c_int = 77; +pub const KERN_PROC_CWD: ::c_int = 78; +pub const KERN_PROC_NOBROADCASTKILL: ::c_int = 79; +pub const KERN_PROC_VMMAP: ::c_int = 80; +pub const KERN_GLOBAL_PTRACE: ::c_int = 81; +pub const KERN_CONSBUFSIZE: ::c_int = 82; +pub const KERN_CONSBUF: ::c_int = 83; +pub const KERN_MAXID: ::c_int = 84; +pub const KERN_PROC_ALL: ::c_int = 0; +pub const KERN_PROC_PID: ::c_int = 1; +pub const KERN_PROC_PGRP: ::c_int = 2; +pub const KERN_PROC_SESSION: ::c_int = 3; +pub const KERN_PROC_TTY: ::c_int = 4; +pub const KERN_PROC_UID: ::c_int = 5; +pub const KERN_PROC_RUID: ::c_int = 6; +pub const KERN_PROC_KTHREAD: ::c_int = 7; +pub const KERN_PROC_SHOW_THREADS: ::c_int = 0x40000000; +pub const KERN_SYSVIPC_MSG_INFO: ::c_int = 1; +pub const KERN_SYSVIPC_SEM_INFO: ::c_int = 2; +pub const KERN_SYSVIPC_SHM_INFO: ::c_int = 3; +pub const KERN_PROC_ARGV: ::c_int = 1; +pub const KERN_PROC_NARGV: ::c_int = 2; +pub const KERN_PROC_ENV: ::c_int = 3; +pub const KERN_PROC_NENV: ::c_int = 4; +pub const KI_NGROUPS: ::c_int = 16; +pub const KI_MAXCOMLEN: ::c_int = 24; +pub const KI_WMESGLEN: ::c_int = 8; +pub const KI_MAXLOGNAME: ::c_int = 32; +pub const KI_EMULNAMELEN: ::c_int = 8; + +extern { + pub fn getnameinfo(sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::size_t, + serv: *mut ::c_char, + servlen: ::size_t, + flags: ::c_int) -> ::c_int; + pub fn kevent(kq: ::c_int, + changelist: *const ::kevent, + nchanges: ::c_int, + eventlist: *mut ::kevent, + nevents: ::c_int, + timeout: *const ::timespec) -> ::c_int; + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) + -> ::c_int; + pub fn pthread_main_np() -> ::c_int; + pub fn pthread_set_name_np(tid: ::pthread_t, name: *const ::c_char); + pub fn pthread_stackseg_np(thread: ::pthread_t, + sinfo: *mut ::stack_t) -> ::c_int; + pub fn sysctl(name: *const ::c_int, + namelen: ::c_uint, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t) + -> ::c_int; + pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; + pub fn pledge(promises: *const ::c_char, + paths: *mut *const ::c_char) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_os = "openbsd")] { + mod openbsd; + pub use self::openbsd::*; + } else if #[cfg(target_os = "bitrig")] { + mod bitrig; + pub use self::bitrig::*; + } else { + // Unknown target_os + } +} + +mod other; +pub use self::other::*; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs new file mode 100644 index 000000000..8b36ee5ce --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs @@ -0,0 +1,33 @@ +s! { + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } +} + +extern { + pub fn accept4(s: ::c_int, addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, flags: ::c_int) -> ::c_int; +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs new file mode 100644 index 000000000..9b0b338b9 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs @@ -0,0 +1,2 @@ +pub type c_long = i32; +pub type c_ulong = u32; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs new file mode 100644 index 000000000..b07c476aa --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs @@ -0,0 +1,2 @@ +pub type c_long = i64; +pub type c_ulong = u64; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs new file mode 100644 index 000000000..e4087da7b --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs @@ -0,0 +1,11 @@ +cfg_if! { + if #[cfg(target_arch = "x86_64")] { + mod b64; + pub use self::b64::*; + } else if #[cfg(target_arch = "x86")] { + mod b32; + pub use self::b32::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b32.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b32.rs new file mode 100644 index 000000000..9b0b338b9 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b32.rs @@ -0,0 +1,2 @@ +pub type c_long = i32; +pub type c_ulong = u32; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b64.rs new file mode 100644 index 000000000..5d63ce9ce --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b64.rs @@ -0,0 +1,2 @@ +pub type c_ulong = u64; +pub type c_long = i64; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/mod.rs new file mode 100644 index 000000000..829c2258b --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/mod.rs @@ -0,0 +1,817 @@ +use dox::{mem, Option}; + +pub type rlim_t = ::uintptr_t; +pub type sa_family_t = u8; +pub type pthread_key_t = ::c_int; +pub type nfds_t = ::c_long; +pub type tcflag_t = ::c_uint; +pub type speed_t = ::c_uint; +pub type c_char = i8; +pub type clock_t = i32; +pub type clockid_t = i32; +pub type time_t = i32; +pub type suseconds_t = i32; +pub type wchar_t = i32; +pub type off_t = i64; +pub type ino_t = i64; +pub type blkcnt_t = i64; +pub type blksize_t = i32; +pub type dev_t = i32; +pub type mode_t = u32; +pub type nlink_t = i32; +pub type useconds_t = u32; +pub type socklen_t = u32; +pub type pthread_t = ::uintptr_t; +pub type pthread_mutexattr_t = ::uintptr_t; +pub type sigset_t = u64; +pub type fsblkcnt_t = i64; +pub type fsfilcnt_t = i64; +pub type pthread_attr_t = *mut ::c_void; +pub type nl_item = ::c_int; +pub type id_t = i32; +pub type idtype_t = ::c_uint; + +pub enum timezone {} + +s! { + pub struct sockaddr { + pub sa_len: u8, + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 30], + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [u8; 24], + } + + pub struct sockaddr_in6 { + pub sin6_len: u8, + pub sin6_family: sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct sockaddr_un { + pub sun_len: u8, + pub sun_family: sa_family_t, + pub sun_path: [::c_char; 126] + } + + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: sa_family_t, + __ss_pad1: [u8; 6], + __ss_pad2: u64, + __ss_pad3: [u8; 112], + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: socklen_t, + pub ai_canonname: *mut c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut addrinfo, + } + + pub struct fd_set { + fds_bits: [c_ulong; FD_SETSIZE / ULONG_SIZE], + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + pub tm_gmtoff: ::c_long, + pub tm_zone: *const ::c_char, + } + + pub struct utsname { + pub sysname: [::c_char; 32], + pub nodename: [::c_char; 32], + pub release: [::c_char; 32], + pub version: [::c_char; 32], + pub machine: [::c_char; 32], + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::c_char, + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + pub c_cc: [::cc_t; ::NCCS], + } + + pub struct stat { + pub st_dev: dev_t, + pub st_ino: ino_t, + pub st_mode: mode_t, + pub st_nlink: nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_size: off_t, + pub st_rdev: dev_t, + pub st_blksize: blksize_t, + pub st_atime: time_t, + pub st_atime_nsec: c_long, + pub st_mtime: time_t, + pub st_mtime_nsec: c_long, + pub st_ctime: time_t, + pub st_ctime_nsec: c_long, + pub st_crtime: time_t, + pub st_crtime_nsec: c_long, + pub st_type: u32, + pub st_blocks: blkcnt_t, + } + + pub struct dirent { + pub d_dev: dev_t, + pub d_pdev: dev_t, + pub d_ino: ino_t, + pub d_pino: i64, + pub d_reclen: ::c_ushort, + pub d_name: [::c_char; 1024], // Max length is _POSIX_PATH_MAX + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + __unused1: ::size_t, + pub gl_offs: ::size_t, + __unused2: ::size_t, + pub gl_pathv: *mut *mut c_char, + + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + __unused8: *mut ::c_void, + } + + pub struct pthread_mutex_t { + flags: u32, + lock: i32, + unused: i32, + owner: i32, + owner_count: i32, + } + + pub struct pthread_cond_t { + flags: u32, + unused: i32, + mutex: *mut ::c_void, + waiter_count: i32, + lock: i32, + } + + pub struct pthread_rwlock_t { + flags: u32, + owner: i32, + lock_sem: i32, // this is actually a union + lock_count: i32, + reader_count: i32, + writer_count: i32, + waiters: [*mut ::c_void; 2], + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + pub pw_gecos: *mut ::c_char, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + pub si_pid: ::pid_t, + pub si_uid: ::uid_t, + pub si_addr: *mut ::c_void, + pub si_status: ::c_int, + pub si_band: c_long, + pub sigval: *mut ::c_void, + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + sa_userdata: *mut ::c_void, + } + + pub struct sem_t { + pub se_type: i32, + pub se_named_id: i32, // this is actually a union + pub se_unnamed: i32, + pub se_padding: [i32; 4], + } + + pub struct pthread_condattr_t { + pub process_shared: bool, + pub clock_id: i32, + } +} + +// intentionally not public, only used for fd_set +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + const ULONG_SIZE: usize = 32; + } else if #[cfg(target_pointer_width = "64")] { + const ULONG_SIZE: usize = 64; + } else { + // Unknown target_pointer_width + } +} + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 2147483647; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 2; +pub const _IOLBF: ::c_int = 1; + +pub const F_DUPFD: ::c_int = 0x0001; +pub const F_GETFD: ::c_int = 0x0002; +pub const F_SETFD: ::c_int = 0x0004; +pub const F_GETFL: ::c_int = 0x0008; +pub const F_SETFL: ::c_int = 0x0010; + +pub const SIGTRAP: ::c_int = 22; + +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; + +pub const CLOCK_REALTIME: ::c_int = -1; +pub const CLOCK_MONOTONIC: ::c_int = 0; + +pub const RLIMIT_CORE: ::c_int = 0; +pub const RLIMIT_CPU: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_FSIZE: ::c_int = 3; +pub const RLIMIT_NOFILE: ::c_int = 4; +pub const RLIMIT_AS: ::c_int = 6; +// Haiku specific +pub const RLIMIT_NOVMON: ::c_int = 7; +pub const RLIMIT_NLIMITS: ::c_int = 8; + +pub const RUSAGE_SELF: ::c_int = 0; + +pub const NCCS: usize = 11; + +pub const O_RDONLY: ::c_int = 0x0000; +pub const O_WRONLY: ::c_int = 0x0001; +pub const O_RDWR: ::c_int = 0x0002; +pub const O_ACCMODE: ::c_int = 0x0003; + +pub const O_EXCL: ::c_int = 0x0100; +pub const O_CREAT: ::c_int = 0x0200; +pub const O_TRUNC: ::c_int = 0x0400; +pub const O_NOCTTY: ::c_int = 0x1000; +pub const O_NOTRAVERSE: ::c_int = 0x2000; + +pub const O_CLOEXEC: ::c_int = 0x00000040; +pub const O_NONBLOCK: ::c_int = 0x00000080; +pub const O_APPEND: ::c_int = 0x00000800; +pub const O_SYNC: ::c_int = 0x00010000; +pub const O_RSYNC: ::c_int = 0x00020000; +pub const O_DSYNC: ::c_int = 0x00040000; +pub const O_NOFOLLOW: ::c_int = 0x00080000; +pub const O_NOCACHE: ::c_int = 0x00100000; +pub const O_DIRECTORY: ::c_int = 0x00200000; + +pub const S_IFIFO: ::mode_t = 61440; +pub const S_IFCHR: ::mode_t = 49152; +pub const S_IFBLK: ::mode_t = 24576; +pub const S_IFDIR: ::mode_t = 16384; +pub const S_IFREG: ::mode_t = 32768; +pub const S_IFLNK: ::mode_t = 40960; +pub const S_IFSOCK: ::mode_t = 49152; +pub const S_IFMT: ::mode_t = 61440; +pub const S_IRWXU: ::mode_t = 448; +pub const S_IXUSR: ::mode_t = 64; +pub const S_IWUSR: ::mode_t = 128; +pub const S_IRUSR: ::mode_t = 256; +pub const S_IRWXG: ::mode_t = 70; +pub const S_IXGRP: ::mode_t = 10; +pub const S_IWGRP: ::mode_t = 20; +pub const S_IRGRP: ::mode_t = 40; +pub const S_IRWXO: ::mode_t = 7; +pub const S_IXOTH: ::mode_t = 1; +pub const S_IWOTH: ::mode_t = 2; +pub const S_IROTH: ::mode_t = 4; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 7; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const EAI_SYSTEM: ::c_int = 11; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const LC_ALL: ::c_int = 0; +pub const LC_COLLATE: ::c_int = 1; +pub const LC_CTYPE: ::c_int = 2; +pub const LC_MONETARY: ::c_int = 3; +pub const LC_NUMERIC: ::c_int = 4; +pub const LC_TIME: ::c_int = 5; +pub const LC_MESSAGES: ::c_int = 6; + +// TODO: Haiku does not have MAP_FILE, but libstd/os.rs requires it +pub const MAP_FILE: ::c_int = 0x00; +pub const MAP_SHARED: ::c_int = 0x01; +pub const MAP_PRIVATE: ::c_int = 0x02; +pub const MAP_FIXED: ::c_int = 0x004; + +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +pub const MS_ASYNC: ::c_int = 0x01; +pub const MS_INVALIDATE: ::c_int = 0x04; +pub const MS_SYNC: ::c_int = 0x02; + +pub const EPERM : ::c_int = -2147483633; +pub const ENOENT : ::c_int = -2147459069; +pub const ESRCH : ::c_int = -2147454963; +pub const EINTR : ::c_int = -2147483638; +pub const EIO : ::c_int = -2147483647; +pub const ENXIO : ::c_int = -2147454965; +pub const E2BIG : ::c_int = -2147454975; +pub const ENOEXEC : ::c_int = -2147478782; +pub const EBADF : ::c_int = -2147459072; +pub const ECHILD : ::c_int = -2147454974; +pub const EDEADLK : ::c_int = -2147454973; +pub const ENOMEM : ::c_int = -2147454976; +pub const EACCES : ::c_int = -2147483646; +pub const EFAULT : ::c_int = -2147478783; +// pub const ENOTBLK : ::c_int = 15; +pub const EBUSY : ::c_int = -2147483634; +pub const EEXIST : ::c_int = -2147459070; +pub const EXDEV : ::c_int = -2147459061; +pub const ENODEV : ::c_int = -2147454969; +pub const ENOTDIR : ::c_int = -2147459067; +pub const EISDIR : ::c_int = -2147459063; +pub const EINVAL : ::c_int = -2147483643; +pub const ENFILE : ::c_int = -2147454970; +pub const EMFILE : ::c_int = -2147459062; +pub const ENOTTY : ::c_int = -2147454966; +pub const ETXTBSY : ::c_int = -2147454917; +pub const EFBIG : ::c_int = -2147454972; +pub const ENOSPC : ::c_int = -2147459065; +pub const ESPIPE : ::c_int = -2147454964; +pub const EROFS : ::c_int = -2147459064; +pub const EMLINK : ::c_int = -2147454971; +pub const EPIPE : ::c_int = -2147459059; +pub const EDOM : ::c_int = -2147454960; +pub const ERANGE : ::c_int = -2147454959; +pub const EAGAIN : ::c_int = -2147483637; +pub const EWOULDBLOCK : ::c_int = -2147483637; + +pub const EINPROGRESS : ::c_int = -2147454940; +pub const EALREADY : ::c_int = -2147454939; +pub const ENOTSOCK : ::c_int = -2147454932; +pub const EDESTADDRREQ : ::c_int = -2147454928; +pub const EMSGSIZE : ::c_int = -2147454934; +pub const EPROTOTYPE : ::c_int = -2147454958; +pub const ENOPROTOOPT : ::c_int = -2147454942; +pub const EPROTONOSUPPORT : ::c_int = -2147454957; +pub const EOPNOTSUPP : ::c_int = -2147454933; +pub const EPFNOSUPPORT : ::c_int = -2147454956; +pub const EAFNOSUPPORT : ::c_int = -2147454955; +pub const EADDRINUSE : ::c_int = -2147454954; +pub const EADDRNOTAVAIL : ::c_int = -2147454953; +pub const ENETDOWN : ::c_int = -2147454953; +pub const ENETUNREACH : ::c_int = -2147454951; +pub const ENETRESET : ::c_int = -2147454950; +pub const ECONNABORTED : ::c_int = -2147454949; +pub const ECONNRESET : ::c_int = -2147454948; +pub const ENOBUFS : ::c_int = -2147454941; +pub const EISCONN : ::c_int = -2147454947; +pub const ENOTCONN : ::c_int = -2147454946; +pub const ESHUTDOWN : ::c_int = -2147454945; +pub const ETIMEDOUT : ::c_int = -2147483639; +pub const ECONNREFUSED : ::c_int = -2147454944; +pub const ELOOP : ::c_int = -2147459060; +pub const ENAMETOOLONG : ::c_int = -2147459068; +pub const EHOSTDOWN : ::c_int = -2147454931; +pub const EHOSTUNREACH : ::c_int = -2147454943; +pub const ENOTEMPTY : ::c_int = -2147459066; +pub const EDQUOT : ::c_int = -2147454927; +pub const ESTALE : ::c_int = -2147454936; +pub const ENOLCK : ::c_int = -2147454968; +pub const ENOSYS : ::c_int = -2147454967; +pub const EIDRM : ::c_int = -2147454926; +pub const ENOMSG : ::c_int = -2147454937; +pub const EOVERFLOW : ::c_int = -2147454935; +pub const ECANCELED : ::c_int = -2147454929; +pub const EILSEQ : ::c_int = -2147454938; +pub const ENOATTR : ::c_int = -2147454916; +pub const EBADMSG : ::c_int = -2147454930; +pub const EMULTIHOP : ::c_int = -2147454925; +pub const ENOLINK : ::c_int = -2147454923; +pub const EPROTO : ::c_int = -2147454919; + +pub const IPPROTO_RAW: ::c_int = 255; + +// These are prefixed with POSIX_ on Haiku +pub const MADV_NORMAL: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_RANDOM: ::c_int = 3; +pub const MADV_WILLNEED: ::c_int = 4; +pub const MADV_DONTNEED: ::c_int = 5; + +pub const IFF_LOOPBACK: ::c_int = 0x0008; + +pub const AF_UNIX: ::c_int = 9; +pub const AF_INET: ::c_int = 1; +pub const AF_INET6: ::c_int = 6; +pub const SOCK_RAW: ::c_int = 3; +pub const IPPROTO_ICMP: ::c_int = 1; +pub const IPPROTO_ICMPV6: ::c_int = 58; +pub const IPPROTO_TCP: ::c_int = 6; +pub const IPPROTO_IP: ::c_int = 0; +pub const IPPROTO_IPV6: ::c_int = 41; +pub const IP_MULTICAST_TTL: ::c_int = 10; +pub const IP_MULTICAST_LOOP: ::c_int = 11; +pub const IP_TTL: ::c_int = 4; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_ADD_MEMBERSHIP: ::c_int = 12; +pub const IP_DROP_MEMBERSHIP: ::c_int = 13; + +pub const TCP_NODELAY: ::c_int = 0x01; +pub const TCP_MAXSEG: ::c_int = 0x02; +pub const TCP_NOPUSH: ::c_int = 0x04; +pub const TCP_NOOPT: ::c_int = 0x08; + +pub const IPV6_MULTICAST_LOOP: ::c_int = 26; +pub const IPV6_JOIN_GROUP: ::c_int = 28; +pub const IPV6_LEAVE_GROUP: ::c_int = 29; +pub const IPV6_V6ONLY: ::c_int = 30; + +pub const SO_DEBUG: ::c_int = 0x00000004; + +pub const MSG_PEEK: ::c_int = 0x2; +pub const MSG_NOSIGNAL: ::c_int = 0x0800; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 0x01; +pub const LOCK_EX: ::c_int = 0x02; +pub const LOCK_NB: ::c_int = 0x04; +pub const LOCK_UN: ::c_int = 0x08; + +pub const SIGSTKSZ: ::size_t = 16384; + +pub const SA_NODEFER: ::c_int = 0x08; +pub const SA_RESETHAND: ::c_int = 0x04; +pub const SA_RESTART: ::c_int = 0x10; +pub const SA_NOCLDSTOP: ::c_int = 0x01; + +pub const FD_SETSIZE: usize = 1024; + +pub const RTLD_NOW: ::c_int = 0x1; +pub const RTLD_DEFAULT: *mut ::c_void = 0isize as *mut ::c_void; + +pub const BUFSIZ: ::c_uint = 8192; +pub const FILENAME_MAX: ::c_uint = 256; +pub const FOPEN_MAX: ::c_uint = 128; +pub const L_tmpnam: ::c_uint = 512; +pub const TMP_MAX: ::c_uint = 32768; +pub const _PC_NAME_MAX: ::c_int = 4; + +pub const FIONBIO: ::c_int = 0xbe000000; + +pub const _SC_IOV_MAX : ::c_int = 32; +pub const _SC_GETGR_R_SIZE_MAX : ::c_int = 25; +pub const _SC_GETPW_R_SIZE_MAX : ::c_int = 26; +pub const _SC_PAGESIZE : ::c_int = 27; +pub const _SC_THREAD_ATTR_STACKADDR : ::c_int = 48; +pub const _SC_THREAD_ATTR_STACKSIZE : ::c_int = 49; +pub const _SC_THREAD_PRIORITY_SCHEDULING : ::c_int = 50; +pub const _SC_THREAD_PROCESS_SHARED : ::c_int = 46; +pub const _SC_THREAD_STACK_MIN : ::c_int = 47; +pub const _SC_THREADS : ::c_int = 31; +pub const _SC_ATEXIT_MAX : ::c_int = 37; + +pub const PTHREAD_STACK_MIN: ::size_t = 8192; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + flags: 0, + lock: 0, + unused: -42, + owner: -1, + owner_count: 0, +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + flags: 0, + unused: -42, + mutex: 0 as *mut _, + waiter_count: 0, + lock: 0, +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + flags: 0, + owner: 0, + lock_sem: 0, + lock_count: 0, + reader_count: 0, + writer_count: 0, + waiters: [0 as *mut _; 2], +}; + +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = 0; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 1; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 3; + +pub const FIOCLEX: c_ulong = 0; // TODO: does not exist on Haiku! + +pub const SA_ONSTACK: c_ulong = 0x20; +pub const SA_SIGINFO: c_ulong = 0x40; +pub const SA_NOCLDWAIT: c_ulong = 0x02; + +pub const SIGCHLD: ::c_int = 5; +pub const SIGBUS: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 3; + +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const SOL_SOCKET: ::c_int = -1; +pub const SO_ACCEPTCONN: ::c_int = 0x00000001; +pub const SO_BROADCAST: ::c_int = 0x00000002; +pub const SO_DONTROUTE: ::c_int = 0x00000008; +pub const SO_KEEPALIVE: ::c_int = 0x00000010; +pub const SO_OOBINLINE: ::c_int = 0x00000020; +pub const SO_REUSEADDR: ::c_int = 0x00000040; +pub const SO_REUSEPORT: ::c_int = 0x00000080; +pub const SO_USELOOPBACK: ::c_int = 0x00000100; +pub const SO_LINGER: ::c_int = 0x00000200; +pub const SO_SNDBUF: ::c_int = 0x40000001; +pub const SO_SNDLOWAT: ::c_int = 0x40000002; +pub const SO_SNDTIMEO: ::c_int = 0x40000003; +pub const SO_RCVBUF: ::c_int = 0x40000004; +pub const SO_RCVLOWAT: ::c_int = 0x40000005; +pub const SO_RCVTIMEO: ::c_int = 0x40000006; +pub const SO_ERROR: ::c_int = 0x40000007; +pub const SO_TYPE: ::c_int = 0x40000008; +pub const SO_NONBLOCK: ::c_int = 0x40000009; +pub const SO_BINDTODEVICE: ::c_int = 0x4000000a; +pub const SO_PEERCRED: ::c_int = 0x4000000b; + +pub const NI_MAXHOST: ::size_t = 1025; + +pub const WNOHANG: ::c_int = 0x01; +pub const WUNTRACED: ::c_int = 0x02; +pub const WCONTINUED: ::c_int = 0x04; +pub const WEXITED: ::c_int = 0x08; +pub const WSTOPPED: ::c_int = 0x10; +pub const WNOWAIT: ::c_int = 0x20; + +pub const P_ALL: idtype_t = 0; +pub const P_PID: idtype_t = 1; +pub const P_PGID: idtype_t = 2; + +f! { + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] &= !(1 << (fd % size)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool { + let fd = fd as usize; + let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; + return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] |= 1 << (fd % size); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } + + pub fn WIFEXITED(status: ::c_int) -> bool { + (status >> 8) == 0 + } + + pub fn WEXITSTATUS(status: ::c_int) -> ::c_int { + (status & 0xff) + } + + pub fn WTERMSIG(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } +} + +extern { + pub fn clock_gettime(clk_id: ::c_int, tp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(clk_id: ::c_int, tp: *const ::timespec) -> ::c_int; + pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t) -> ::c_int; + pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t) -> ::c_int; + pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t, + clock_id: *mut clockid_t) -> ::c_int; + pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, + clock_id: clockid_t) -> ::c_int; + pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; + pub fn setgroups(ngroups: ::size_t, + ptr: *const ::gid_t) -> ::c_int; + pub fn getpwuid_r(uid: ::uid_t, + pwd: *mut passwd, + buffer: *mut ::c_char, + bufferSize: ::size_t, + result: *mut *mut passwd) -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int) + -> ::c_int; + pub fn getnameinfo(sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::size_t, + serv: *mut ::c_char, + sevlen: ::size_t, + flags: ::c_int) -> ::c_int; + pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t, + abstime: *const ::timespec) -> ::c_int; + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, + options: ::c_int) -> ::c_int; + + pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; + pub fn glob(pattern: *const ::c_char, + flags: ::c_int, + errfunc: Option ::c_int>, + pglob: *mut ::glob_t) -> ::c_int; + pub fn globfree(pglob: *mut ::glob_t); + + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) + -> ::c_int; + + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) + -> ::c_int; + + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + + pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, + flags: ::c_int, addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t) -> ::ssize_t; + pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; + pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + + pub fn bind(socket: ::c_int, address: *const ::sockaddr, + address_len: ::socklen_t) -> ::c_int; + + pub fn writev(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::ssize_t; + + pub fn sendmsg(fd: ::c_int, + msg: *const ::msghdr, + flags: ::c_int) -> ::ssize_t; + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) + -> ::ssize_t; +} + +cfg_if! { + if #[cfg(target_pointer_width = "64")] { + mod b64; + pub use self::b64::*; + } else { + mod b32; + pub use self::b32::*; + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/mod.rs new file mode 100644 index 000000000..7ebf0d9e0 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/mod.rs @@ -0,0 +1,873 @@ +//! Definitions found commonly among almost all Unix derivatives +//! +//! More functions and definitions can be found in the more specific modules +//! according to the platform in question. + +use dox::Option; + +pub type pid_t = i32; +pub type uid_t = u32; +pub type gid_t = u32; +pub type in_addr_t = u32; +pub type in_port_t = u16; +pub type sighandler_t = ::size_t; +pub type cc_t = ::c_uchar; + +pub enum DIR {} +pub enum locale_t {} + +s! { + pub struct group { + pub gr_name: *mut ::c_char, + pub gr_passwd: *mut ::c_char, + pub gr_gid: ::gid_t, + pub gr_mem: *mut *mut ::c_char, + } + + pub struct utimbuf { + pub actime: time_t, + pub modtime: time_t, + } + + pub struct timeval { + pub tv_sec: time_t, + pub tv_usec: suseconds_t, + } + + pub struct timespec { + pub tv_sec: time_t, + pub tv_nsec: c_long, + } + + pub struct rlimit { + pub rlim_cur: rlim_t, + pub rlim_max: rlim_t, + } + + pub struct rusage { + pub ru_utime: timeval, + pub ru_stime: timeval, + pub ru_maxrss: c_long, + pub ru_ixrss: c_long, + pub ru_idrss: c_long, + pub ru_isrss: c_long, + pub ru_minflt: c_long, + pub ru_majflt: c_long, + pub ru_nswap: c_long, + pub ru_inblock: c_long, + pub ru_oublock: c_long, + pub ru_msgsnd: c_long, + pub ru_msgrcv: c_long, + pub ru_nsignals: c_long, + pub ru_nvcsw: c_long, + pub ru_nivcsw: c_long, + + #[cfg(any(target_env = "musl"))] + __reserved: [c_long; 16], + } + + #[cfg_attr(target_os = "netbsd", repr(packed))] + pub struct in_addr { + pub s_addr: in_addr_t, + } + + pub struct in6_addr { + pub s6_addr: [u8; 16], + __align: [u32; 0], + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct ipv6_mreq { + pub ipv6mr_multiaddr: in6_addr, + #[cfg(target_os = "android")] + pub ipv6mr_interface: ::c_int, + #[cfg(not(target_os = "android"))] + pub ipv6mr_interface: ::c_uint, + } + + pub struct hostent { + pub h_name: *mut ::c_char, + pub h_aliases: *mut *mut ::c_char, + pub h_addrtype: ::c_int, + pub h_length: ::c_int, + pub h_addr_list: *mut *mut ::c_char, + } + + pub struct iovec { + pub iov_base: *mut ::c_void, + pub iov_len: ::size_t, + } + + pub struct pollfd { + pub fd: ::c_int, + pub events: ::c_short, + pub revents: ::c_short, + } + + pub struct winsize { + pub ws_row: ::c_ushort, + pub ws_col: ::c_ushort, + pub ws_xpixel: ::c_ushort, + pub ws_ypixel: ::c_ushort, + } + + pub struct linger { + pub l_onoff: ::c_int, + pub l_linger: ::c_int, + } + + pub struct sigval { + // Actually a union of an int and a void* + pub sival_ptr: *mut ::c_void + } +} + +pub const SIG_DFL: sighandler_t = 0 as sighandler_t; +pub const SIG_IGN: sighandler_t = 1 as sighandler_t; +pub const SIG_ERR: sighandler_t = !0 as sighandler_t; + +pub const DT_FIFO: u8 = 1; +pub const DT_CHR: u8 = 2; +pub const DT_DIR: u8 = 4; +pub const DT_BLK: u8 = 6; +pub const DT_REG: u8 = 8; +pub const DT_LNK: u8 = 10; +pub const DT_SOCK: u8 = 12; + +pub const FD_CLOEXEC: ::c_int = 0x1; + +pub const USRQUOTA: ::c_int = 0; +pub const GRPQUOTA: ::c_int = 1; + +pub const SIGIOT: ::c_int = 6; + +pub const S_ISUID: ::c_int = 0x800; +pub const S_ISGID: ::c_int = 0x400; +pub const S_ISVTX: ::c_int = 0x200; + +pub const POLLIN: ::c_short = 0x1; +pub const POLLPRI: ::c_short = 0x2; +pub const POLLOUT: ::c_short = 0x4; +pub const POLLERR: ::c_short = 0x8; +pub const POLLHUP: ::c_short = 0x10; +pub const POLLNVAL: ::c_short = 0x20; + +pub const IF_NAMESIZE: ::size_t = 16; + +pub const RTLD_LAZY: ::c_int = 0x1; + +pub const LOG_EMERG: ::c_int = 0; +pub const LOG_ALERT: ::c_int = 1; +pub const LOG_CRIT: ::c_int = 2; +pub const LOG_ERR: ::c_int = 3; +pub const LOG_WARNING: ::c_int = 4; +pub const LOG_NOTICE: ::c_int = 5; +pub const LOG_INFO: ::c_int = 6; +pub const LOG_DEBUG: ::c_int = 7; + +pub const LOG_KERN: ::c_int = 0; +pub const LOG_USER: ::c_int = 1 << 3; +pub const LOG_MAIL: ::c_int = 2 << 3; +pub const LOG_DAEMON: ::c_int = 3 << 3; +pub const LOG_AUTH: ::c_int = 4 << 3; +pub const LOG_SYSLOG: ::c_int = 5 << 3; +pub const LOG_LPR: ::c_int = 6 << 3; +pub const LOG_NEWS: ::c_int = 7 << 3; +pub const LOG_UUCP: ::c_int = 8 << 3; +pub const LOG_LOCAL0: ::c_int = 16 << 3; +pub const LOG_LOCAL1: ::c_int = 17 << 3; +pub const LOG_LOCAL2: ::c_int = 18 << 3; +pub const LOG_LOCAL3: ::c_int = 19 << 3; +pub const LOG_LOCAL4: ::c_int = 20 << 3; +pub const LOG_LOCAL5: ::c_int = 21 << 3; +pub const LOG_LOCAL6: ::c_int = 22 << 3; +pub const LOG_LOCAL7: ::c_int = 23 << 3; + +pub const LOG_PID: ::c_int = 0x01; +pub const LOG_CONS: ::c_int = 0x02; +pub const LOG_ODELAY: ::c_int = 0x04; +pub const LOG_NDELAY: ::c_int = 0x08; +pub const LOG_NOWAIT: ::c_int = 0x10; + +pub const LOG_PRIMASK: ::c_int = 7; +pub const LOG_FACMASK: ::c_int = 0x3f8; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +pub const PRIO_MIN: ::c_int = -20; +pub const PRIO_MAX: ::c_int = 20; + +cfg_if! { + if #[cfg(dox)] { + // on dox builds don't pull in anything + } else if #[cfg(all(not(stdbuild), feature = "use_std"))] { + // cargo build, don't pull in anything extra as the libstd dep + // already pulls in all libs. + } else if #[cfg(any(all(target_env = "musl", not(target_arch = "mips"))))] { + #[link(name = "c", kind = "static", cfg(target_feature = "crt-static"))] + #[link(name = "c", cfg(not(target_feature = "crt-static")))] + extern {} + } else if #[cfg(target_os = "emscripten")] { + #[link(name = "c")] + extern {} + } else if #[cfg(all(target_os = "netbsd", target_vendor = "rumprun"))] { + // Since we don't use -nodefaultlibs on Rumprun, libc is always pulled + // in automatically by the linker. We avoid passing it explicitly, as it + // causes some versions of binutils to crash with an assertion failure. + #[link(name = "m")] + extern {} + } else if #[cfg(any(target_os = "macos", + target_os = "ios", + target_os = "android", + target_os = "openbsd", + target_os = "bitrig"))] { + #[link(name = "c")] + #[link(name = "m")] + extern {} + } else if #[cfg(target_os = "haiku")] { + #[link(name = "root")] + #[link(name = "network")] + extern {} + } else if #[cfg(target_os = "fuchsia")] { + #[link(name = "c")] + #[link(name = "mxio")] + extern {} + } else { + #[link(name = "c")] + #[link(name = "m")] + #[link(name = "rt")] + #[link(name = "pthread")] + extern {} + } +} + +extern { + pub fn getgrnam(name: *const ::c_char) -> *mut group; + pub fn getgrgid(gid: ::gid_t) -> *mut group; + + pub fn endpwent(); + #[cfg_attr(target_os = "netbsd", link_name = "__getpwnam50")] + pub fn getpwnam(name: *const ::c_char) -> *mut passwd; + #[cfg_attr(target_os = "netbsd", link_name = "__getpwuid50")] + pub fn getpwuid(uid: ::uid_t) -> *mut passwd; + + pub fn fprintf(stream: *mut ::FILE, + format: *const ::c_char, ...) -> ::c_int; + pub fn printf(format: *const ::c_char, ...) -> ::c_int; + pub fn snprintf(s: *mut ::c_char, n: ::size_t, + format: *const ::c_char, ...) -> ::c_int; + pub fn sprintf(s: *mut ::c_char, format: *const ::c_char, ...) -> ::c_int; + pub fn fscanf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int; + pub fn scanf(format: *const ::c_char, ...) -> ::c_int; + pub fn sscanf(s: *const ::c_char, format: *const ::c_char, ...) -> ::c_int; + pub fn getchar_unlocked() -> ::c_int; + pub fn putchar_unlocked(c: ::c_int) -> ::c_int; + + #[cfg_attr(target_os = "netbsd", link_name = "__socket30")] + pub fn socket(domain: ::c_int, ty: ::c_int, protocol: ::c_int) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "connect$UNIX2003")] + pub fn connect(socket: ::c_int, address: *const sockaddr, + len: socklen_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "listen$UNIX2003")] + pub fn listen(socket: ::c_int, backlog: ::c_int) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "accept$UNIX2003")] + pub fn accept(socket: ::c_int, address: *mut sockaddr, + address_len: *mut socklen_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "getpeername$UNIX2003")] + pub fn getpeername(socket: ::c_int, address: *mut sockaddr, + address_len: *mut socklen_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "getsockname$UNIX2003")] + pub fn getsockname(socket: ::c_int, address: *mut sockaddr, + address_len: *mut socklen_t) -> ::c_int; + pub fn setsockopt(socket: ::c_int, level: ::c_int, name: ::c_int, + value: *const ::c_void, + option_len: socklen_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "socketpair$UNIX2003")] + pub fn socketpair(domain: ::c_int, type_: ::c_int, protocol: ::c_int, + socket_vector: *mut ::c_int) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "sendto$UNIX2003")] + pub fn sendto(socket: ::c_int, buf: *const ::c_void, len: ::size_t, + flags: ::c_int, addr: *const sockaddr, + addrlen: socklen_t) -> ::ssize_t; + pub fn shutdown(socket: ::c_int, how: ::c_int) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "chmod$UNIX2003")] + pub fn chmod(path: *const c_char, mode: mode_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "fchmod$UNIX2003")] + pub fn fchmod(fd: ::c_int, mode: mode_t) -> ::c_int; + + #[cfg_attr(target_os = "macos", link_name = "fstat$INODE64")] + #[cfg_attr(target_os = "netbsd", link_name = "__fstat50")] + pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int; + + pub fn mkdir(path: *const c_char, mode: mode_t) -> ::c_int; + + #[cfg_attr(target_os = "macos", link_name = "stat$INODE64")] + #[cfg_attr(target_os = "netbsd", link_name = "__stat50")] + pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "popen$UNIX2003")] + pub fn popen(command: *const c_char, + mode: *const c_char) -> *mut ::FILE; + pub fn pclose(stream: *mut ::FILE) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "fdopen$UNIX2003")] + pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE; + pub fn fileno(stream: *mut ::FILE) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "open$UNIX2003")] + pub fn open(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "creat$UNIX2003")] + pub fn creat(path: *const c_char, mode: mode_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "fcntl$UNIX2003")] + pub fn fcntl(fd: ::c_int, cmd: ::c_int, ...) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), + link_name = "opendir$INODE64")] + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "opendir$INODE64$UNIX2003")] + #[cfg_attr(target_os = "netbsd", link_name = "__opendir30")] + pub fn opendir(dirname: *const c_char) -> *mut ::DIR; + #[cfg_attr(target_os = "macos", link_name = "readdir$INODE64")] + #[cfg_attr(target_os = "netbsd", link_name = "__readdir30")] + pub fn readdir(dirp: *mut ::DIR) -> *mut ::dirent; + #[cfg_attr(target_os = "macos", link_name = "readdir_r$INODE64")] + #[cfg_attr(target_os = "netbsd", link_name = "__readdir_r30")] + #[cfg_attr(target_os = "solaris", link_name = "__posix_readdir_r")] + pub fn readdir_r(dirp: *mut ::DIR, entry: *mut ::dirent, + result: *mut *mut ::dirent) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "closedir$UNIX2003")] + pub fn closedir(dirp: *mut ::DIR) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), + link_name = "rewinddir$INODE64")] + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "rewinddir$INODE64$UNIX2003")] + pub fn rewinddir(dirp: *mut ::DIR); + + pub fn openat(dirfd: ::c_int, pathname: *const ::c_char, + flags: ::c_int, ...) -> ::c_int; + pub fn faccessat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::c_int, flags: ::c_int) -> ::c_int; + pub fn fchmodat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t, flags: ::c_int) -> ::c_int; + pub fn fchown(fd: ::c_int, + owner: ::uid_t, + group: ::gid_t) -> ::c_int; + pub fn fchownat(dirfd: ::c_int, pathname: *const ::c_char, + owner: ::uid_t, group: ::gid_t, + flags: ::c_int) -> ::c_int; + #[cfg_attr(target_os = "macos", link_name = "fstatat$INODE64")] + pub fn fstatat(dirfd: ::c_int, pathname: *const ::c_char, + buf: *mut stat, flags: ::c_int) -> ::c_int; + pub fn linkat(olddirfd: ::c_int, oldpath: *const ::c_char, + newdirfd: ::c_int, newpath: *const ::c_char, + flags: ::c_int) -> ::c_int; + pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t) -> ::c_int; + pub fn readlinkat(dirfd: ::c_int, pathname: *const ::c_char, + buf: *mut ::c_char, bufsiz: ::size_t) -> ::ssize_t; + pub fn renameat(olddirfd: ::c_int, oldpath: *const ::c_char, + newdirfd: ::c_int, newpath: *const ::c_char) + -> ::c_int; + pub fn symlinkat(target: *const ::c_char, newdirfd: ::c_int, + linkpath: *const ::c_char) -> ::c_int; + pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char, + flags: ::c_int) -> ::c_int; + + pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int; + pub fn alarm(seconds: ::c_uint) -> ::c_uint; + pub fn chdir(dir: *const c_char) -> ::c_int; + pub fn fchdir(dirfd: ::c_int) -> ::c_int; + pub fn chown(path: *const c_char, uid: uid_t, + gid: gid_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "lchown$UNIX2003")] + pub fn lchown(path: *const c_char, uid: uid_t, + gid: gid_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "close$UNIX2003")] + pub fn close(fd: ::c_int) -> ::c_int; + pub fn dup(fd: ::c_int) -> ::c_int; + pub fn dup2(src: ::c_int, dst: ::c_int) -> ::c_int; + pub fn execl(path: *const c_char, + arg0: *const c_char, ...) -> ::c_int; + pub fn execle(path: *const ::c_char, + arg0: *const ::c_char, ...) -> ::c_int; + pub fn execlp(file: *const ::c_char, + arg0: *const ::c_char, ...) -> ::c_int; + pub fn execv(prog: *const c_char, + argv: *const *const c_char) -> ::c_int; + pub fn execve(prog: *const c_char, argv: *const *const c_char, + envp: *const *const c_char) + -> ::c_int; + pub fn execvp(c: *const c_char, + argv: *const *const c_char) -> ::c_int; + pub fn fork() -> pid_t; + pub fn fpathconf(filedes: ::c_int, name: ::c_int) -> c_long; + pub fn getcwd(buf: *mut c_char, size: ::size_t) -> *mut c_char; + pub fn getegid() -> gid_t; + pub fn geteuid() -> uid_t; + pub fn getgid() -> gid_t; + pub fn getgroups(ngroups_max: ::c_int, groups: *mut gid_t) + -> ::c_int; + pub fn getlogin() -> *mut c_char; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "getopt$UNIX2003")] + pub fn getopt(argc: ::c_int, argv: *const *mut c_char, + optstr: *const c_char) -> ::c_int; + pub fn getpgid(pid: pid_t) -> pid_t; + pub fn getpgrp() -> pid_t; + pub fn getpid() -> pid_t; + pub fn getppid() -> pid_t; + pub fn getuid() -> uid_t; + pub fn isatty(fd: ::c_int) -> ::c_int; + pub fn link(src: *const c_char, dst: *const c_char) -> ::c_int; + pub fn lseek(fd: ::c_int, offset: off_t, whence: ::c_int) -> off_t; + pub fn pathconf(path: *const c_char, name: ::c_int) -> c_long; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pause$UNIX2003")] + pub fn pause() -> ::c_int; + pub fn pipe(fds: *mut ::c_int) -> ::c_int; + pub fn posix_memalign(memptr: *mut *mut ::c_void, + align: ::size_t, + size: ::size_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "read$UNIX2003")] + pub fn read(fd: ::c_int, buf: *mut ::c_void, count: ::size_t) + -> ::ssize_t; + pub fn rmdir(path: *const c_char) -> ::c_int; + pub fn setgid(gid: gid_t) -> ::c_int; + pub fn setpgid(pid: pid_t, pgid: pid_t) -> ::c_int; + pub fn setsid() -> pid_t; + pub fn setuid(uid: uid_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "sleep$UNIX2003")] + pub fn sleep(secs: ::c_uint) -> ::c_uint; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "nanosleep$UNIX2003")] + #[cfg_attr(target_os = "netbsd", link_name = "__nanosleep50")] + pub fn nanosleep(rqtp: *const timespec, + rmtp: *mut timespec) -> ::c_int; + pub fn tcgetpgrp(fd: ::c_int) -> pid_t; + pub fn tcsetpgrp(fd: ::c_int, pgrp: ::pid_t) -> ::c_int; + pub fn ttyname(fd: ::c_int) -> *mut c_char; + pub fn unlink(c: *const c_char) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "wait$UNIX2003")] + pub fn wait(status: *mut ::c_int) -> pid_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "waitpid$UNIX2003")] + pub fn waitpid(pid: pid_t, status: *mut ::c_int, options: ::c_int) + -> pid_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "write$UNIX2003")] + pub fn write(fd: ::c_int, buf: *const ::c_void, count: ::size_t) + -> ::ssize_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pread$UNIX2003")] + pub fn pread(fd: ::c_int, buf: *mut ::c_void, count: ::size_t, + offset: off_t) -> ::ssize_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pwrite$UNIX2003")] + pub fn pwrite(fd: ::c_int, buf: *const ::c_void, count: ::size_t, + offset: off_t) -> ::ssize_t; + pub fn umask(mask: mode_t) -> mode_t; + + #[cfg_attr(target_os = "netbsd", link_name = "__utime50")] + pub fn utime(file: *const c_char, buf: *const utimbuf) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "kill$UNIX2003")] + pub fn kill(pid: pid_t, sig: ::c_int) -> ::c_int; + + pub fn mlock(addr: *const ::c_void, len: ::size_t) -> ::c_int; + pub fn munlock(addr: *const ::c_void, len: ::size_t) -> ::c_int; + pub fn mlockall(flags: ::c_int) -> ::c_int; + pub fn munlockall() -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "mmap$UNIX2003")] + pub fn mmap(addr: *mut ::c_void, + len: ::size_t, + prot: ::c_int, + flags: ::c_int, + fd: ::c_int, + offset: off_t) + -> *mut ::c_void; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "munmap$UNIX2003")] + pub fn munmap(addr: *mut ::c_void, len: ::size_t) -> ::c_int; + + pub fn if_nametoindex(ifname: *const c_char) -> ::c_uint; + pub fn if_indextoname(ifindex: ::c_uint, + ifname: *mut ::c_char) -> *mut ::c_char; + + #[cfg_attr(target_os = "macos", link_name = "lstat$INODE64")] + #[cfg_attr(target_os = "netbsd", link_name = "__lstat50")] + pub fn lstat(path: *const c_char, buf: *mut stat) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "fsync$UNIX2003")] + pub fn fsync(fd: ::c_int) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "setenv$UNIX2003")] + pub fn setenv(name: *const c_char, val: *const c_char, + overwrite: ::c_int) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "unsetenv$UNIX2003")] + #[cfg_attr(target_os = "netbsd", link_name = "__unsetenv13")] + pub fn unsetenv(name: *const c_char) -> ::c_int; + + pub fn symlink(path1: *const c_char, + path2: *const c_char) -> ::c_int; + + pub fn ftruncate(fd: ::c_int, length: off_t) -> ::c_int; + + pub fn signal(signum: ::c_int, handler: sighandler_t) -> sighandler_t; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "getrlimit$UNIX2003")] + pub fn getrlimit(resource: ::c_int, rlim: *mut rlimit) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "setrlimit$UNIX2003")] + pub fn setrlimit(resource: ::c_int, rlim: *const rlimit) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__getrusage50")] + pub fn getrusage(resource: ::c_int, usage: *mut rusage) -> ::c_int; + + pub fn getdtablesize() -> ::c_int; + #[cfg_attr(any(target_os = "macos", target_os = "ios"), + link_name = "realpath$DARWIN_EXTSN")] + pub fn realpath(pathname: *const ::c_char, resolved: *mut ::c_char) + -> *mut ::c_char; + + pub fn flock(fd: ::c_int, operation: ::c_int) -> ::c_int; + + #[cfg_attr(target_os = "netbsd", link_name = "__gettimeofday50")] + pub fn gettimeofday(tp: *mut ::timeval, + tz: *mut ::c_void) -> ::c_int; + + pub fn pthread_self() -> ::pthread_t; + pub fn pthread_create(native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_join$UNIX2003")] + pub fn pthread_join(native: ::pthread_t, + value: *mut *mut ::c_void) -> ::c_int; + pub fn pthread_atfork(prepare: Option, + parent: Option, + child: Option) -> ::c_int; + pub fn pthread_exit(value: *mut ::c_void); + pub fn pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_setstacksize(attr: *mut ::pthread_attr_t, + stack_size: ::size_t) -> ::c_int; + pub fn pthread_attr_setdetachstate(attr: *mut ::pthread_attr_t, + state: ::c_int) -> ::c_int; + pub fn pthread_detach(thread: ::pthread_t) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__libc_thr_yield")] + pub fn sched_yield() -> ::c_int; + pub fn pthread_key_create(key: *mut pthread_key_t, + dtor: Option) + -> ::c_int; + pub fn pthread_key_delete(key: pthread_key_t) -> ::c_int; + pub fn pthread_getspecific(key: pthread_key_t) -> *mut ::c_void; + pub fn pthread_setspecific(key: pthread_key_t, value: *const ::c_void) + -> ::c_int; + pub fn pthread_mutex_init(lock: *mut pthread_mutex_t, + attr: *const pthread_mutexattr_t) -> ::c_int; + pub fn pthread_mutex_destroy(lock: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_mutex_lock(lock: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_mutex_trylock(lock: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_mutex_unlock(lock: *mut pthread_mutex_t) -> ::c_int; + + pub fn pthread_mutexattr_init(attr: *mut pthread_mutexattr_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_mutexattr_destroy$UNIX2003")] + pub fn pthread_mutexattr_destroy(attr: *mut pthread_mutexattr_t) -> ::c_int; + pub fn pthread_mutexattr_settype(attr: *mut pthread_mutexattr_t, + _type: ::c_int) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_cond_init$UNIX2003")] + pub fn pthread_cond_init(cond: *mut pthread_cond_t, + attr: *const pthread_condattr_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_cond_wait$UNIX2003")] + pub fn pthread_cond_wait(cond: *mut pthread_cond_t, + lock: *mut pthread_mutex_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_cond_timedwait$UNIX2003")] + pub fn pthread_cond_timedwait(cond: *mut pthread_cond_t, + lock: *mut pthread_mutex_t, + abstime: *const ::timespec) -> ::c_int; + pub fn pthread_cond_signal(cond: *mut pthread_cond_t) -> ::c_int; + pub fn pthread_cond_broadcast(cond: *mut pthread_cond_t) -> ::c_int; + pub fn pthread_cond_destroy(cond: *mut pthread_cond_t) -> ::c_int; + pub fn pthread_condattr_init(attr: *mut pthread_condattr_t) -> ::c_int; + pub fn pthread_condattr_destroy(attr: *mut pthread_condattr_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_destroy$UNIX2003")] + pub fn pthread_rwlock_destroy(lock: *mut pthread_rwlock_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_rdlock$UNIX2003")] + pub fn pthread_rwlock_rdlock(lock: *mut pthread_rwlock_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_tryrdlock$UNIX2003")] + pub fn pthread_rwlock_tryrdlock(lock: *mut pthread_rwlock_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_wrlock$UNIX2003")] + pub fn pthread_rwlock_wrlock(lock: *mut pthread_rwlock_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_trywrlock$UNIX2003")] + pub fn pthread_rwlock_trywrlock(lock: *mut pthread_rwlock_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_unlock$UNIX2003")] + pub fn pthread_rwlock_unlock(lock: *mut pthread_rwlock_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_sigmask$UNIX2003")] + pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t, + oldset: *mut sigset_t) -> ::c_int; + pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; + #[cfg_attr(all(target_os = "linux", not(target_env = "musl")), + link_name = "__xpg_strerror_r")] + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, + buflen: ::size_t) -> ::c_int; + + pub fn getsockopt(sockfd: ::c_int, + level: ::c_int, + optname: ::c_int, + optval: *mut ::c_void, + optlen: *mut ::socklen_t) -> ::c_int; + pub fn raise(signum: ::c_int) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__sigaction14")] + pub fn sigaction(signum: ::c_int, + act: *const sigaction, + oldact: *mut sigaction) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "sigaltstack$UNIX2003")] + #[cfg_attr(target_os = "netbsd", link_name = "__sigaltstack14")] + pub fn sigaltstack(ss: *const stack_t, + oss: *mut stack_t) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch ="x86"), + link_name = "sigwait$UNIX2003")] + #[cfg_attr(target_os = "solaris", link_name = "__posix_sigwait")] + pub fn sigwait(set: *const sigset_t, + sig: *mut ::c_int) -> ::c_int; + + #[cfg_attr(target_os = "netbsd", link_name = "__utimes50")] + pub fn utimes(filename: *const ::c_char, + times: *const ::timeval) -> ::c_int; + pub fn dlopen(filename: *const ::c_char, + flag: ::c_int) -> *mut ::c_void; + pub fn dlerror() -> *mut ::c_char; + pub fn dlsym(handle: *mut ::c_void, + symbol: *const ::c_char) -> *mut ::c_void; + pub fn dlclose(handle: *mut ::c_void) -> ::c_int; + pub fn dladdr(addr: *const ::c_void, info: *mut Dl_info) -> ::c_int; + + pub fn getaddrinfo(node: *const c_char, + service: *const c_char, + hints: *const addrinfo, + res: *mut *mut addrinfo) -> ::c_int; + pub fn freeaddrinfo(res: *mut addrinfo); + pub fn gai_strerror(errcode: ::c_int) -> *const ::c_char; + + #[cfg_attr(target_os = "netbsd", link_name = "__gmtime_r50")] + pub fn gmtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; + #[cfg_attr(target_os = "netbsd", link_name = "__localtime_r50")] + pub fn localtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "mktime$UNIX2003")] + #[cfg_attr(target_os = "netbsd", link_name = "__mktime50")] + pub fn mktime(tm: *mut tm) -> time_t; + #[cfg_attr(target_os = "netbsd", link_name = "__time50")] + pub fn time(time: *mut time_t) -> time_t; + #[cfg_attr(target_os = "netbsd", link_name = "__locatime50")] + pub fn localtime(time: *const time_t) -> *mut tm; + + #[cfg_attr(target_os = "netbsd", link_name = "__mknod50")] + pub fn mknod(pathname: *const ::c_char, mode: ::mode_t, + dev: ::dev_t) -> ::c_int; + pub fn uname(buf: *mut ::utsname) -> ::c_int; + pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; + pub fn gethostname(name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn chroot(name: *const ::c_char) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "usleep$UNIX2003")] + pub fn usleep(secs: ::c_uint) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "send$UNIX2003")] + pub fn send(socket: ::c_int, buf: *const ::c_void, len: ::size_t, + flags: ::c_int) -> ::ssize_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "recv$UNIX2003")] + pub fn recv(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, + flags: ::c_int) -> ::ssize_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "putenv$UNIX2003")] + #[cfg_attr(target_os = "netbsd", link_name = "__putenv50")] + pub fn putenv(string: *mut c_char) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "poll$UNIX2003")] + pub fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: ::c_int) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), + link_name = "select$1050")] + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "select$UNIX2003")] + #[cfg_attr(target_os = "netbsd", link_name = "__select50")] + pub fn select(nfds: ::c_int, + readfs: *mut fd_set, + writefds: *mut fd_set, + errorfds: *mut fd_set, + timeout: *mut timeval) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__setlocale50")] + pub fn setlocale(category: ::c_int, + locale: *const ::c_char) -> *mut ::c_char; + pub fn localeconv() -> *mut lconv; + + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; + pub fn sem_close(sem: *mut sem_t) -> ::c_int; + pub fn sem_unlink(name: *const ::c_char) -> ::c_int; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "sem_wait$UNIX2003")] + pub fn sem_wait(sem: *mut sem_t) -> ::c_int; + pub fn sem_trywait(sem: *mut sem_t) -> ::c_int; + pub fn sem_post(sem: *mut sem_t) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, + pshared: ::c_int, + value: ::c_uint) + -> ::c_int; + pub fn statvfs(path: *const c_char, buf: *mut statvfs) -> ::c_int; + pub fn fstatvfs(fd: ::c_int, buf: *mut statvfs) -> ::c_int; + + pub fn readlink(path: *const c_char, + buf: *mut c_char, + bufsz: ::size_t) + -> ::ssize_t; + + #[cfg_attr(target_os = "netbsd", link_name = "__sigemptyset14")] + pub fn sigemptyset(set: *mut sigset_t) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__sigaddset14")] + pub fn sigaddset(set: *mut sigset_t, signum: ::c_int) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__sigfillset14")] + pub fn sigfillset(set: *mut sigset_t) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__sigdelset14")] + pub fn sigdelset(set: *mut sigset_t, signum: ::c_int) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__sigismember14")] + pub fn sigismember(set: *const sigset_t, signum: ::c_int) -> ::c_int; + + #[cfg_attr(target_os = "netbsd", link_name = "__sigprocmask14")] + pub fn sigprocmask(how: ::c_int, + set: *const sigset_t, + oldset: *mut sigset_t) + -> ::c_int; + + #[cfg_attr(target_os = "netbsd", link_name = "__timegm50")] + pub fn timegm(tm: *mut ::tm) -> time_t; + + pub fn getsid(pid: pid_t) -> pid_t; + + pub fn sysconf(name: ::c_int) -> ::c_long; + + pub fn mkfifo(path: *const c_char, mode: mode_t) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), + link_name = "pselect$1050")] + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pselect$UNIX2003")] + #[cfg_attr(target_os = "netbsd", link_name = "__pselect50")] + pub fn pselect(nfds: ::c_int, + readfs: *mut fd_set, + writefds: *mut fd_set, + errorfds: *mut fd_set, + timeout: *const timespec, + sigmask: *const sigset_t) -> ::c_int; + pub fn fseeko(stream: *mut ::FILE, + offset: ::off_t, + whence: ::c_int) -> ::c_int; + pub fn ftello(stream: *mut ::FILE) -> ::off_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "tcdrain$UNIX2003")] + pub fn tcdrain(fd: ::c_int) -> ::c_int; + pub fn cfgetispeed(termios: *const ::termios) -> ::speed_t; + pub fn cfgetospeed(termios: *const ::termios) -> ::speed_t; + pub fn cfmakeraw(termios: *mut ::termios); + pub fn cfsetispeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int; + pub fn cfsetospeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int; + pub fn cfsetspeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int; + pub fn tcgetattr(fd: ::c_int, termios: *mut ::termios) -> ::c_int; + pub fn tcsetattr(fd: ::c_int, + optional_actions: ::c_int, + termios: *const ::termios) -> ::c_int; + pub fn tcflow(fd: ::c_int, action: ::c_int) -> ::c_int; + pub fn tcflush(fd: ::c_int, action: ::c_int) -> ::c_int; + pub fn tcsendbreak(fd: ::c_int, duration: ::c_int) -> ::c_int; + pub fn mkstemp(template: *mut ::c_char) -> ::c_int; + pub fn mkdtemp(template: *mut ::c_char) -> *mut ::c_char; + + pub fn tmpnam(ptr: *mut ::c_char) -> *mut ::c_char; + + pub fn openlog(ident: *const ::c_char, logopt: ::c_int, facility: ::c_int); + pub fn closelog(); + pub fn setlogmask(maskpri: ::c_int) -> ::c_int; + pub fn syslog(priority: ::c_int, message: *const ::c_char, ...); + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "nice$UNIX2003")] + pub fn nice(incr: ::c_int) -> ::c_int; + + pub fn grantpt(fd: ::c_int) -> ::c_int; + pub fn posix_openpt(flags: ::c_int) -> ::c_int; + pub fn ptsname(fd: ::c_int) -> *mut ::c_char; + pub fn unlockpt(fd: ::c_int) -> ::c_int; +} + +cfg_if! { + if #[cfg(any(target_os = "linux", + target_os = "android", + target_os = "emscripten", + target_os = "fuchsia"))] { + mod notbsd; + pub use self::notbsd::*; + } else if #[cfg(any(target_os = "macos", + target_os = "ios", + target_os = "freebsd", + target_os = "dragonfly", + target_os = "openbsd", + target_os = "netbsd", + target_os = "bitrig"))] { + mod bsd; + pub use self::bsd::*; + } else if #[cfg(target_os = "solaris")] { + mod solaris; + pub use self::solaris::*; + } else if #[cfg(target_os = "haiku")] { + mod haiku; + pub use self::haiku::*; + } else { + // Unknown target_os + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/arm.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/arm.rs new file mode 100644 index 000000000..1c9d033d1 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/arm.rs @@ -0,0 +1,6 @@ +pub type c_char = u8; +pub type wchar_t = u32; + +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/mod.rs new file mode 100644 index 000000000..32f88e498 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/mod.rs @@ -0,0 +1,199 @@ +// The following definitions are correct for arm and i686, +// but may be wrong for mips + +pub type c_long = i32; +pub type c_ulong = u32; +pub type mode_t = u16; +pub type off64_t = ::c_longlong; +pub type sigset_t = ::c_ulong; +pub type socklen_t = i32; +pub type time64_t = i64; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_ulong, + pub sa_restorer: ::dox::Option, + } + + pub struct rlimit64 { + pub rlim_cur: u64, + pub rlim_max: u64, + } + + pub struct stat { + pub st_dev: ::c_ulonglong, + __pad0: [::c_uchar; 4], + __st_ino: ::ino_t, + pub st_mode: ::c_uint, + pub st_nlink: ::c_uint, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulonglong, + __pad3: [::c_uchar; 4], + pub st_size: ::c_longlong, + pub st_blksize: ::blksize_t, + pub st_blocks: ::c_ulonglong, + pub st_atime: ::c_ulong, + pub st_atime_nsec: ::c_ulong, + pub st_mtime: ::c_ulong, + pub st_mtime_nsec: ::c_ulong, + pub st_ctime: ::c_ulong, + pub st_ctime_nsec: ::c_ulong, + pub st_ino: ::c_ulonglong, + } + + pub struct stat64 { + pub st_dev: ::c_ulonglong, + __pad0: [::c_uchar; 4], + __st_ino: ::ino_t, + pub st_mode: ::c_uint, + pub st_nlink: ::c_uint, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulonglong, + __pad3: [::c_uchar; 4], + pub st_size: ::c_longlong, + pub st_blksize: ::blksize_t, + pub st_blocks: ::c_ulonglong, + pub st_atime: ::c_ulong, + pub st_atime_nsec: ::c_ulong, + pub st_mtime: ::c_ulong, + pub st_mtime_nsec: ::c_ulong, + pub st_ctime: ::c_ulong, + pub st_ctime_nsec: ::c_ulong, + pub st_ino: ::c_ulonglong, + } + + pub struct pthread_attr_t { + pub flags: ::uint32_t, + pub stack_base: *mut ::c_void, + pub stack_size: ::size_t, + pub guard_size: ::size_t, + pub sched_policy: ::int32_t, + pub sched_priority: ::int32_t, + } + + pub struct pthread_mutex_t { value: ::c_int } + + pub struct pthread_cond_t { value: ::c_int } + + pub struct pthread_rwlock_t { + lock: pthread_mutex_t, + cond: pthread_cond_t, + numLocks: ::c_int, + writerThreadId: ::c_int, + pendingReaders: ::c_int, + pendingWriters: ::c_int, + attr: i32, + __reserved: [::c_char; 12], + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct statfs { + pub f_type: ::uint32_t, + pub f_bsize: ::uint32_t, + pub f_blocks: ::uint64_t, + pub f_bfree: ::uint64_t, + pub f_bavail: ::uint64_t, + pub f_files: ::uint64_t, + pub f_ffree: ::uint64_t, + pub f_fsid: ::__fsid_t, + pub f_namelen: ::uint32_t, + pub f_frsize: ::uint32_t, + pub f_flags: ::uint32_t, + pub f_spare: [::uint32_t; 4], + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 8], + } +} + +pub const RTLD_GLOBAL: ::c_int = 2; +pub const RTLD_NOW: ::c_int = 0; +pub const RTLD_DEFAULT: *mut ::c_void = -1isize as *mut ::c_void; + +pub const PTRACE_GETFPREGS: ::c_int = 14; +pub const PTRACE_SETFPREGS: ::c_int = 15; +pub const PTRACE_GETREGS: ::c_int = 12; +pub const PTRACE_SETREGS: ::c_int = 13; + +pub const SYS_gettid: ::c_long = 224; +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + value: 0, +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + value: 0, +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + lock: PTHREAD_MUTEX_INITIALIZER, + cond: PTHREAD_COND_INITIALIZER, + numLocks: 0, + writerThreadId: 0, + pendingReaders: 0, + pendingWriters: 0, + attr: 0, + __reserved: [0; 12], +}; +pub const PTHREAD_STACK_MIN: ::size_t = 4096 * 2; +pub const CPU_SETSIZE: ::size_t = 32; +pub const __CPU_BITS: ::size_t = 32; + +pub const UT_LINESIZE: usize = 8; +pub const UT_NAMESIZE: usize = 8; +pub const UT_HOSTSIZE: usize = 16; + +extern { + pub fn bind(socket: ::c_int, address: *const ::sockaddr, + address_len: socklen_t) -> ::c_int; + + pub fn writev(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::ssize_t; + + pub fn sendmsg(fd: ::c_int, + msg: *const ::msghdr, + flags: ::c_int) -> ::ssize_t; + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) + -> ::ssize_t; + + pub fn timegm64(tm: *const ::tm) -> ::time64_t; +} + +cfg_if! { + if #[cfg(target_arch = "x86")] { + mod x86; + pub use self::x86::*; + } else if #[cfg(target_arch = "arm")] { + mod arm; + pub use self::arm::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/x86.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/x86.rs new file mode 100644 index 000000000..c4b8197de --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/x86.rs @@ -0,0 +1,6 @@ +pub type c_char = i8; +pub type wchar_t = i32; + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/aarch64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/aarch64.rs new file mode 100644 index 000000000..89c505d06 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/aarch64.rs @@ -0,0 +1,56 @@ +pub type c_char = u8; +pub type wchar_t = u32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::c_uint, + pub st_nlink: ::c_uint, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: ::c_ulong, + pub st_size: ::off64_t, + pub st_blksize: ::c_int, + __pad2: ::c_int, + pub st_blocks: ::c_long, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_ulong, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_ulong, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_ulong, + __unused4: ::c_uint, + __unused5: ::c_uint, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::c_uint, + pub st_nlink: ::c_uint, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: ::c_ulong, + pub st_size: ::off64_t, + pub st_blksize: ::c_int, + __pad2: ::c_int, + pub st_blocks: ::c_long, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_ulong, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_ulong, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_ulong, + __unused4: ::c_uint, + __unused5: ::c_uint, + } +} + +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; + +pub const SYS_gettid: ::c_long = 178; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/mod.rs new file mode 100644 index 000000000..57982a222 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/mod.rs @@ -0,0 +1,162 @@ +// The following definitions are correct for aarch64 and x86_64, +// but may be wrong for mips64 + +pub type c_long = i64; +pub type c_ulong = u64; +pub type mode_t = u32; +pub type off64_t = i64; +pub type socklen_t = u32; + +s! { + pub struct sigset_t { + __val: [::c_ulong; 1], + } + + pub struct sigaction { + pub sa_flags: ::c_uint, + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + _restorer: *mut ::c_void, + } + + pub struct rlimit64 { + pub rlim_cur: ::c_ulonglong, + pub rlim_max: ::c_ulonglong, + } + + pub struct pthread_attr_t { + pub flags: ::uint32_t, + pub stack_base: *mut ::c_void, + pub stack_size: ::size_t, + pub guard_size: ::size_t, + pub sched_policy: ::int32_t, + pub sched_priority: ::int32_t, + __reserved: [::c_char; 16], + } + + pub struct pthread_mutex_t { + value: ::c_int, + __reserved: [::c_char; 36], + } + + pub struct pthread_cond_t { + value: ::c_int, + __reserved: [::c_char; 44], + } + + pub struct pthread_rwlock_t { + numLocks: ::c_int, + writerThreadId: ::c_int, + pendingReaders: ::c_int, + pendingWriters: ::c_int, + attr: i32, + __reserved: [::c_char; 36], + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct statfs { + pub f_type: ::uint64_t, + pub f_bsize: ::uint64_t, + pub f_blocks: ::uint64_t, + pub f_bfree: ::uint64_t, + pub f_bavail: ::uint64_t, + pub f_files: ::uint64_t, + pub f_ffree: ::uint64_t, + pub f_fsid: ::__fsid_t, + pub f_namelen: ::uint64_t, + pub f_frsize: ::uint64_t, + pub f_flags: ::uint64_t, + pub f_spare: [::uint64_t; 4], + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 0], + } +} + +pub const RTLD_GLOBAL: ::c_int = 0x00100; +pub const RTLD_NOW: ::c_int = 2; +pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + value: 0, + __reserved: [0; 36], +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + value: 0, + __reserved: [0; 44], +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + numLocks: 0, + writerThreadId: 0, + pendingReaders: 0, + pendingWriters: 0, + attr: 0, + __reserved: [0; 36], +}; +pub const PTHREAD_STACK_MIN: ::size_t = 4096 * 4; +pub const CPU_SETSIZE: ::size_t = 1024; +pub const __CPU_BITS: ::size_t = 64; + +pub const UT_LINESIZE: usize = 32; +pub const UT_NAMESIZE: usize = 32; +pub const UT_HOSTSIZE: usize = 256; + +// Some weirdness in Android +extern { + // address_len should be socklen_t, but it is c_int! + pub fn bind(socket: ::c_int, address: *const ::sockaddr, + address_len: ::c_int) -> ::c_int; + + // the return type should be ::ssize_t, but it is c_int! + pub fn writev(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::c_int; + + // the return type should be ::ssize_t, but it is c_int! + pub fn readv(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::c_int; + + // the return type should be ::ssize_t, but it is c_int! + pub fn sendmsg(fd: ::c_int, + msg: *const ::msghdr, + flags: ::c_int) -> ::c_int; + + // the return type should be ::ssize_t, but it is c_int! + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/x86_64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/x86_64.rs new file mode 100644 index 000000000..58d07e104 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/x86_64.rs @@ -0,0 +1,50 @@ +pub type c_char = i8; +pub type wchar_t = i32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::c_ulong, + pub st_mode: ::c_uint, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::c_long, + pub st_blocks: ::c_long, + pub st_atime: ::c_ulong, + pub st_atime_nsec: ::c_ulong, + pub st_mtime: ::c_ulong, + pub st_mtime_nsec: ::c_ulong, + pub st_ctime: ::c_ulong, + pub st_ctime_nsec: ::c_ulong, + __unused: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::c_ulong, + pub st_mode: ::c_uint, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::c_long, + pub st_blocks: ::c_long, + pub st_atime: ::c_ulong, + pub st_atime_nsec: ::c_ulong, + pub st_mtime: ::c_ulong, + pub st_mtime_nsec: ::c_ulong, + pub st_ctime: ::c_ulong, + pub st_ctime_nsec: ::c_ulong, + __unused: [::c_long; 3], + } +} + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; + +pub const SYS_gettid: ::c_long = 186; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/mod.rs new file mode 100644 index 000000000..3eace010a --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/mod.rs @@ -0,0 +1,806 @@ +//! Android-specific definitions for linux-like values + +use dox::mem; + +pub type clock_t = ::c_long; +pub type time_t = ::c_long; +pub type suseconds_t = ::c_long; +pub type off_t = ::c_long; +pub type blkcnt_t = ::c_ulong; +pub type blksize_t = ::c_ulong; +pub type nlink_t = u32; +pub type useconds_t = u32; +pub type pthread_t = ::c_long; +pub type pthread_mutexattr_t = ::c_long; +pub type pthread_condattr_t = ::c_long; +pub type fsfilcnt_t = ::c_ulong; +pub type fsblkcnt_t = ::c_ulong; +pub type nfds_t = ::c_uint; +pub type rlim_t = ::c_ulong; +pub type dev_t = ::c_ulong; +pub type ino_t = ::c_ulong; +pub type __CPU_BITTYPE = ::c_ulong; +pub type idtype_t = ::c_int; + +s! { + pub struct dirent { + pub d_ino: u64, + pub d_off: i64, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + pub struct dirent64 { + pub d_ino: u64, + pub d_off: i64, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct __fsid_t { + __val: [::c_int; 2], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::size_t, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::size_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct cpu_set_t { + #[cfg(target_pointer_width = "64")] + __bits: [__CPU_BITTYPE; 16], + #[cfg(target_pointer_width = "32")] + __bits: [__CPU_BITTYPE; 1], + } + + pub struct sem_t { + count: ::c_uint, + #[cfg(target_pointer_width = "64")] + __reserved: [::c_int; 3], + } + + pub struct lastlog { + ll_time: ::time_t, + ll_line: [::c_char; UT_LINESIZE], + ll_host: [::c_char; UT_HOSTSIZE], + } + + pub struct exit_status { + pub e_termination: ::c_short, + pub e_exit: ::c_short, + } + + pub struct utmp { + pub ut_type: ::c_short, + pub ut_pid: ::pid_t, + pub ut_line: [::c_char; UT_LINESIZE], + pub ut_id: [::c_char; 4], + + pub ut_user: [::c_char; UT_NAMESIZE], + pub ut_host: [::c_char; UT_HOSTSIZE], + pub ut_exit: exit_status, + pub ut_session: ::c_long, + pub ut_tv: ::timeval, + + pub ut_addr_v6: [::int32_t; 4], + unused: [::c_char; 20], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + #[cfg(target_pointer_width = "64")] + __f_reserved: [u32; 6], + } +} + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const USER_PROCESS: ::c_short = 7; + +pub const BUFSIZ: ::c_uint = 1024; +pub const FILENAME_MAX: ::c_uint = 1024; +pub const FOPEN_MAX: ::c_uint = 20; +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; +pub const L_tmpnam: ::c_uint = 1024; +pub const TMP_MAX: ::c_uint = 308915776; +pub const _PC_LINK_MAX: ::c_int = 1; +pub const _PC_MAX_CANON: ::c_int = 2; +pub const _PC_MAX_INPUT: ::c_int = 3; +pub const _PC_NAME_MAX: ::c_int = 4; +pub const _PC_PATH_MAX: ::c_int = 5; +pub const _PC_PIPE_BUF: ::c_int = 6; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 14; +pub const _PC_NO_TRUNC: ::c_int = 15; +pub const _PC_VDISABLE: ::c_int = 16; + +pub const FIONBIO: ::c_int = 0x5421; + +pub const _SC_ARG_MAX: ::c_int = 0; +pub const _SC_BC_BASE_MAX: ::c_int = 1; +pub const _SC_BC_DIM_MAX: ::c_int = 2; +pub const _SC_BC_SCALE_MAX: ::c_int = 3; +pub const _SC_BC_STRING_MAX: ::c_int = 4; +pub const _SC_CHILD_MAX: ::c_int = 5; +pub const _SC_CLK_TCK: ::c_int = 6; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 7; +pub const _SC_EXPR_NEST_MAX: ::c_int = 8; +pub const _SC_LINE_MAX: ::c_int = 9; +pub const _SC_NGROUPS_MAX: ::c_int = 10; +pub const _SC_OPEN_MAX: ::c_int = 11; +pub const _SC_2_C_BIND: ::c_int = 13; +pub const _SC_2_C_DEV: ::c_int = 14; +pub const _SC_2_C_VERSION: ::c_int = 15; +pub const _SC_2_CHAR_TERM: ::c_int = 16; +pub const _SC_2_FORT_DEV: ::c_int = 17; +pub const _SC_2_FORT_RUN: ::c_int = 18; +pub const _SC_2_LOCALEDEF: ::c_int = 19; +pub const _SC_2_SW_DEV: ::c_int = 20; +pub const _SC_2_UPE: ::c_int = 21; +pub const _SC_2_VERSION: ::c_int = 22; +pub const _SC_JOB_CONTROL: ::c_int = 23; +pub const _SC_SAVED_IDS: ::c_int = 24; +pub const _SC_VERSION: ::c_int = 25; +pub const _SC_RE_DUP_MAX: ::c_int = 26; +pub const _SC_STREAM_MAX: ::c_int = 27; +pub const _SC_TZNAME_MAX: ::c_int = 28; +pub const _SC_XOPEN_CRYPT: ::c_int = 29; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 30; +pub const _SC_XOPEN_SHM: ::c_int = 31; +pub const _SC_XOPEN_VERSION: ::c_int = 32; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 33; +pub const _SC_XOPEN_REALTIME: ::c_int = 34; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 35; +pub const _SC_XOPEN_LEGACY: ::c_int = 36; +pub const _SC_ATEXIT_MAX: ::c_int = 37; +pub const _SC_IOV_MAX: ::c_int = 38; +pub const _SC_PAGESIZE: ::c_int = 39; +pub const _SC_PAGE_SIZE: ::c_int = 40; +pub const _SC_XOPEN_UNIX: ::c_int = 41; +pub const _SC_MQ_PRIO_MAX: ::c_int = 51; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 71; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 72; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 73; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 74; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 75; +pub const _SC_THREAD_STACK_MIN: ::c_int = 76; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 77; +pub const _SC_TTY_NAME_MAX: ::c_int = 78; +pub const _SC_THREADS: ::c_int = 79; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 80; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 81; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 82; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 83; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 84; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 85; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 97; + +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; + +pub const FIOCLEX: ::c_int = 0x5451; + +pub const SA_ONSTACK: ::c_ulong = 0x08000000; +pub const SA_SIGINFO: ::c_ulong = 0x00000004; +pub const SA_NOCLDWAIT: ::c_ulong = 0x00000002; +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGUNUSED: ::c_int = 31; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const LC_PAPER: ::c_int = 7; +pub const LC_NAME: ::c_int = 8; +pub const LC_ADDRESS: ::c_int = 9; +pub const LC_TELEPHONE: ::c_int = 10; +pub const LC_MEASUREMENT: ::c_int = 11; +pub const LC_IDENTIFICATION: ::c_int = 12; +pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER); +pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME); +pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS); +pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE); +pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT); +pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION); +pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK + | ::LC_NUMERIC_MASK + | ::LC_TIME_MASK + | ::LC_COLLATE_MASK + | ::LC_MONETARY_MASK + | ::LC_MESSAGES_MASK + | LC_PAPER_MASK + | LC_NAME_MASK + | LC_ADDRESS_MASK + | LC_TELEPHONE_MASK + | LC_MEASUREMENT_MASK + | LC_IDENTIFICATION_MASK; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; + +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SOL_SOCKET: ::c_int = 1; +pub const SOL_UDP: ::c_int = 17; +pub const SOL_SCTP: ::c_int = 132; +pub const SOL_IPX: ::c_int = 256; +pub const SOL_AX25: ::c_int = 257; +pub const SOL_ATALK: ::c_int = 258; +pub const SOL_NETROM: ::c_int = 259; +pub const SOL_ROSE: ::c_int = 260; + +#[doc(hidden)] +pub const AF_MAX: ::c_int = 39; +#[doc(hidden)] +pub const PF_MAX: ::c_int = AF_MAX; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_LINGER: ::c_int = 13; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_ACCEPTCONN: ::c_int = 30; + +pub const O_ACCMODE: ::c_int = 3; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 0x101000; +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const NI_MAXHOST: ::size_t = 1025; + +pub const NCCS: usize = 19; +pub const TCSBRKP: ::c_int = 0x5425; +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 0x1; +pub const TCSAFLUSH: ::c_int = 0x2; +pub const VEOF: usize = 4; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5; +pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff; +pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245; +pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45; +pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53; +pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849; +pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6; +pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660; +pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6; +pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f; +pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f; +pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468; +pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478; +pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44; +pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c; +pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969; +pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1; +pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0; +pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f; +pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973; +pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b; +pub const TMPFS_MAGIC: ::c_long = 0x01021994; +pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2; + +pub const MADV_HUGEPAGE: ::c_int = 14; +pub const MADV_NOHUGEPAGE: ::c_int = 15; +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const PTRACE_TRACEME: ::c_int = 0; +pub const PTRACE_PEEKTEXT: ::c_int = 1; +pub const PTRACE_PEEKDATA: ::c_int = 2; +pub const PTRACE_PEEKUSER: ::c_int = 3; +pub const PTRACE_POKETEXT: ::c_int = 4; +pub const PTRACE_POKEDATA: ::c_int = 5; +pub const PTRACE_POKEUSER: ::c_int = 6; +pub const PTRACE_CONT: ::c_int = 7; +pub const PTRACE_KILL: ::c_int = 8; +pub const PTRACE_SINGLESTEP: ::c_int = 9; +pub const PTRACE_ATTACH: ::c_int = 16; +pub const PTRACE_DETACH: ::c_int = 17; +pub const PTRACE_SYSCALL: ::c_int = 24; +pub const PTRACE_SETOPTIONS: ::c_int = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_int = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_int = 0x4203; + +pub const EFD_NONBLOCK: ::c_int = 0x800; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; + +pub const TCGETS: ::c_int = 0x5401; +pub const TCSETS: ::c_int = 0x5402; +pub const TCSETSW: ::c_int = 0x5403; +pub const TCSETSF: ::c_int = 0x5404; +pub const TCGETA: ::c_int = 0x5405; +pub const TCSETA: ::c_int = 0x5406; +pub const TCSETAW: ::c_int = 0x5407; +pub const TCSETAF: ::c_int = 0x5408; +pub const TCSBRK: ::c_int = 0x5409; +pub const TCXONC: ::c_int = 0x540A; +pub const TCFLSH: ::c_int = 0x540B; +pub const TIOCGSOFTCAR: ::c_int = 0x5419; +pub const TIOCSSOFTCAR: ::c_int = 0x541A; +pub const TIOCINQ: ::c_int = 0x541B; +pub const TIOCLINUX: ::c_int = 0x541C; +pub const TIOCGSERIAL: ::c_int = 0x541E; +pub const TIOCEXCL: ::c_int = 0x540C; +pub const TIOCNXCL: ::c_int = 0x540D; +pub const TIOCSCTTY: ::c_int = 0x540E; +pub const TIOCGPGRP: ::c_int = 0x540F; +pub const TIOCSPGRP: ::c_int = 0x5410; +pub const TIOCOUTQ: ::c_int = 0x5411; +pub const TIOCSTI: ::c_int = 0x5412; +pub const TIOCGWINSZ: ::c_int = 0x5413; +pub const TIOCSWINSZ: ::c_int = 0x5414; +pub const TIOCMGET: ::c_int = 0x5415; +pub const TIOCMBIS: ::c_int = 0x5416; +pub const TIOCMBIC: ::c_int = 0x5417; +pub const TIOCMSET: ::c_int = 0x5418; +pub const FIONREAD: ::c_int = 0x541B; +pub const TIOCCONS: ::c_int = 0x541D; + +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t; + +pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead; +pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793; +pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278; +pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448; +pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216; + +pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567; +pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123; +pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF; +pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000; +pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC; +pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4; +pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2; +pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const EAI_SYSTEM: ::c_int = 11; + +pub const NETLINK_ROUTE: ::c_int = 0; +pub const NETLINK_UNUSED: ::c_int = 1; +pub const NETLINK_USERSOCK: ::c_int = 2; +pub const NETLINK_FIREWALL: ::c_int = 3; +pub const NETLINK_SOCK_DIAG: ::c_int = 4; +pub const NETLINK_NFLOG: ::c_int = 5; +pub const NETLINK_XFRM: ::c_int = 6; +pub const NETLINK_SELINUX: ::c_int = 7; +pub const NETLINK_ISCSI: ::c_int = 8; +pub const NETLINK_AUDIT: ::c_int = 9; +pub const NETLINK_FIB_LOOKUP: ::c_int = 10; +pub const NETLINK_CONNECTOR: ::c_int = 11; +pub const NETLINK_NETFILTER: ::c_int = 12; +pub const NETLINK_IP6_FW: ::c_int = 13; +pub const NETLINK_DNRTMSG: ::c_int = 14; +pub const NETLINK_KOBJECT_UEVENT: ::c_int = 15; +pub const NETLINK_GENERIC: ::c_int = 16; +pub const NETLINK_SCSITRANSPORT: ::c_int = 18; +pub const NETLINK_ECRYPTFS: ::c_int = 19; +pub const NETLINK_RDMA: ::c_int = 20; +pub const NETLINK_CRYPTO: ::c_int = 21; +pub const NETLINK_INET_DIAG: ::c_int = NETLINK_SOCK_DIAG; + +pub const MAX_LINKS: ::c_int = 32; + +pub const NLM_F_REQUEST: ::c_int = 1; +pub const NLM_F_MULTI: ::c_int = 2; +pub const NLM_F_ACK: ::c_int = 4; +pub const NLM_F_ECHO: ::c_int = 8; +pub const NLM_F_DUMP_INTR: ::c_int = 16; + +pub const NLM_F_ROOT: ::c_int = 0x100; +pub const NLM_F_MATCH: ::c_int = 0x200; +pub const NLM_F_ATOMIC: ::c_int = 0x400; +pub const NLM_F_DUMP: ::c_int = NLM_F_ROOT | NLM_F_MATCH; + +pub const NLM_F_REPLACE: ::c_int = 0x100; +pub const NLM_F_EXCL: ::c_int = 0x200; +pub const NLM_F_CREATE: ::c_int = 0x400; +pub const NLM_F_APPEND: ::c_int = 0x800; + +pub const NLMSG_NOOP: ::c_int = 0x1; +pub const NLMSG_ERROR: ::c_int = 0x2; +pub const NLMSG_DONE: ::c_int = 0x3; +pub const NLMSG_OVERRUN: ::c_int = 0x4; +pub const NLMSG_MIN_TYPE: ::c_int = 0x10; + +pub const NETLINK_ADD_MEMBERSHIP: ::c_int = 1; +pub const NETLINK_DROP_MEMBERSHIP: ::c_int = 2; +pub const NETLINK_PKTINFO: ::c_int = 3; +pub const NETLINK_BROADCAST_ERROR: ::c_int = 4; +pub const NETLINK_NO_ENOBUFS: ::c_int = 5; +pub const NETLINK_RX_RING: ::c_int = 6; +pub const NETLINK_TX_RING: ::c_int = 7; + +pub const NLA_F_NESTED: ::c_int = 1 << 15; +pub const NLA_F_NET_BYTEORDER: ::c_int = 1 << 14; +pub const NLA_TYPE_MASK: ::c_int = !(NLA_F_NESTED | NLA_F_NET_BYTEORDER); + +pub const SIGEV_THREAD_ID: ::c_int = 4; + +f! { + pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { + for slot in cpuset.__bits.iter_mut() { + *slot = 0; + } + } + + pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in___bits = 8 * mem::size_of_val(&cpuset.__bits[0]); + let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits); + cpuset.__bits[idx] |= 1 << offset; + () + } + + pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in___bits = 8 * mem::size_of_val(&cpuset.__bits[0]); + let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits); + cpuset.__bits[idx] &= !(1 << offset); + () + } + + pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { + let size_in___bits = 8 * mem::size_of_val(&cpuset.__bits[0]); + let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits); + 0 != (cpuset.__bits[idx] & (1 << offset)) + } + + pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool { + set1.__bits == set2.__bits + } +} + +extern { + static mut __progname: *mut ::c_char; +} + +extern { + pub fn madvise(addr: *const ::c_void, len: ::size_t, advice: ::c_int) + -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + pub fn msync(addr: *const ::c_void, len: ::size_t, + flags: ::c_int) -> ::c_int; + pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int) + -> ::c_int; + pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, + flags: ::c_int, addr: *const ::sockaddr, + addrlen: *mut ::socklen_t) -> ::ssize_t; + pub fn getnameinfo(sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::size_t, + serv: *mut ::c_char, + sevlen: ::size_t, + flags: ::c_int) -> ::c_int; + pub fn ptrace(request: ::c_int, ...) -> ::c_long; + pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int; + pub fn __sched_cpualloc(count: ::size_t) -> *mut ::cpu_set_t; + pub fn __sched_cpufree(set: *mut ::cpu_set_t); + pub fn __sched_cpucount(setsize: ::size_t, set: *mut cpu_set_t) -> ::c_int; + pub fn sched_getcpu() -> ::c_int; + + pub fn utmpname(name: *const ::c_char) -> ::c_int; + pub fn setutent(); + pub fn getutent() -> *mut utmp; + + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, + len: ::off_t) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + mod b32; + pub use self::b32::*; + } else if #[cfg(target_pointer_width = "64")] { + mod b64; + pub use self::b64::*; + } else { + // Unknown target_pointer_width + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips32.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips32.rs new file mode 100644 index 000000000..22bb33b72 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips32.rs @@ -0,0 +1,287 @@ +pub type c_char = i8; +pub type c_long = i32; +pub type c_ulong = u32; +pub type clock_t = i32; +pub type time_t = i32; +pub type suseconds_t = i32; +pub type wchar_t = i32; +pub type off_t = i32; +pub type ino_t = u32; +pub type blkcnt_t = i32; +pub type blksize_t = i32; +pub type nlink_t = u32; +pub type fsblkcnt_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type rlim_t = c_ulong; + +s! { + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: ::sigevent, + __next_prio: *mut aiocb, + __abs_prio: ::c_int, + __policy: ::c_int, + __error_code: ::c_int, + __return_value: ::ssize_t, + pub aio_offset: off_t, + __unused1: [::c_char; 4], + __glibc_reserved: [::c_char; 32] + } + + pub struct stat { + pub st_dev: ::c_ulong, + st_pad1: [::c_long; 3], + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulong, + pub st_pad2: [::c_long; 2], + pub st_size: ::off_t, + st_pad3: ::c_long, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + st_pad5: [::c_long; 14], + } + + pub struct stat64 { + pub st_dev: ::c_ulong, + st_pad1: [::c_long; 3], + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulong, + st_pad2: [::c_long; 2], + pub st_size: ::off64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + st_pad3: ::c_long, + pub st_blocks: ::blkcnt64_t, + st_pad5: [::c_long; 14], + } + + pub struct pthread_attr_t { + __size: [u32; 9] + } + + pub struct sigaction { + pub sa_flags: ::c_int, + pub sa_sigaction: ::sighandler_t, + pub sa_mask: sigset_t, + _restorer: *mut ::c_void, + _resv: [::c_int; 1], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct sigset_t { + __val: [::c_ulong; 32], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + pub _pad: [::c_int; 29], + } + + pub struct glob64_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut ::c_char, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_uint, + pub __seq: ::c_ushort, + __pad1: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + #[cfg(target_endian = "big")] + __glibc_reserved1: ::c_ulong, + pub msg_stime: ::time_t, + #[cfg(target_endian = "little")] + __glibc_reserved1: ::c_ulong, + #[cfg(target_endian = "big")] + __glibc_reserved2: ::c_ulong, + pub msg_rtime: ::time_t, + #[cfg(target_endian = "little")] + __glibc_reserved2: ::c_ulong, + #[cfg(target_endian = "big")] + __glibc_reserved3: ::c_ulong, + pub msg_ctime: ::time_t, + #[cfg(target_endian = "little")] + __glibc_reserved3: ::c_ulong, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_frsize: ::c_long, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_files: ::fsblkcnt_t, + pub f_ffree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::c_long, + f_spare: [::c_long; 6], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::size_t, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::size_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_sysid: ::c_long, + pub l_pid: ::pid_t, + pad: [::c_long; 4], + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 8], + } + + // FIXME this is actually a union + pub struct sem_t { + #[cfg(target_pointer_width = "32")] + __size: [::c_char; 16], + #[cfg(target_pointer_width = "64")] + __size: [::c_char; 32], + __align: [::c_long; 0], + } +} + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; + +pub const RLIM_INFINITY: ::rlim_t = 0x7fffffff; + +pub const SYS_gettid: ::c_long = 4222; // Valid for O32 + +#[link(name = "util")] +extern { + pub fn sysctl(name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t) + -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; + pub fn backtrace(buf: *mut *mut ::c_void, + sz: ::c_int) -> ::c_int; + pub fn glob64(pattern: *const ::c_char, + flags: ::c_int, + errfunc: ::dox::Option ::c_int>, + pglob: *mut glob64_t) -> ::c_int; + pub fn globfree64(pglob: *mut glob64_t); + pub fn ptrace(request: ::c_uint, ...) -> ::c_long; + pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t, + cpusetsize: ::size_t, + cpuset: *mut ::cpu_set_t) -> ::c_int; + pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t, + cpusetsize: ::size_t, + cpuset: *const ::cpu_set_t) -> ::c_int; +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips64.rs new file mode 100644 index 000000000..947859998 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips64.rs @@ -0,0 +1,225 @@ +pub type blkcnt_t = i64; +pub type blksize_t = i64; +pub type c_char = i8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type fsblkcnt_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type ino_t = u64; +pub type nlink_t = u64; +pub type off_t = i64; +pub type rlim_t = ::c_ulong; +pub type suseconds_t = i64; +pub type time_t = i64; +pub type wchar_t = i32; + +s! { + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: ::sigevent, + __next_prio: *mut aiocb, + __abs_prio: ::c_int, + __policy: ::c_int, + __error_code: ::c_int, + __return_value: ::ssize_t, + pub aio_offset: off_t, + __glibc_reserved: [::c_char; 32] + } + + pub struct stat { + pub st_dev: ::c_ulong, + st_pad1: [::c_long; 2], + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulong, + st_pad2: [::c_ulong; 1], + pub st_size: ::off_t, + st_pad3: ::c_long, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + st_pad4: ::c_long, + pub st_blocks: ::blkcnt_t, + st_pad5: [::c_long; 7], + } + + pub struct stat64 { + pub st_dev: ::c_ulong, + st_pad1: [::c_long; 2], + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulong, + st_pad2: [::c_long; 2], + pub st_size: ::off64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + st_pad3: ::c_long, + pub st_blocks: ::blkcnt64_t, + st_pad5: [::c_long; 7], + } + + pub struct pthread_attr_t { + __size: [::c_ulong; 7] + } + + pub struct sigaction { + pub sa_flags: ::c_int, + pub sa_sigaction: ::sighandler_t, + pub sa_mask: sigset_t, + _restorer: *mut ::c_void, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct sigset_t { + __size: [::c_ulong; 16], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + _pad: ::c_int, + _pad2: [::c_long; 14], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_uint, + pub __seq: ::c_ushort, + __pad1: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_frsize: ::c_long, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_files: ::fsblkcnt_t, + pub f_ffree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::c_long, + f_spare: [::c_long; 6], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::size_t, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::size_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 0], + } + + // FIXME this is actually a union + pub struct sem_t { + __size: [::c_char; 32], + __align: [::c_long; 0], + } +} + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; + +pub const RLIM_INFINITY: ::rlim_t = 0xffff_ffff_ffff_ffff; + +pub const SYS_gettid: ::c_long = 5178; // Valid for n64 + +#[link(name = "util")] +extern { + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mod.rs new file mode 100644 index 000000000..7b1c15e2f --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mod.rs @@ -0,0 +1,509 @@ +pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const BUFSIZ: ::c_uint = 8192; +pub const TMP_MAX: ::c_uint = 238328; +pub const FOPEN_MAX: ::c_uint = 16; +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; +pub const _SC_2_C_VERSION: ::c_int = 96; +pub const O_ACCMODE: ::c_int = 3; +pub const O_DIRECT: ::c_int = 0x8000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const ST_RELATIME: ::c_ulong = 4096; +pub const NI_MAXHOST: ::socklen_t = 1025; + +pub const RLIMIT_NOFILE: ::c_int = 5; +pub const RLIMIT_AS: ::c_int = 6; +pub const RLIMIT_RSS: ::c_int = 7; +pub const RLIMIT_NPROC: ::c_int = 8; +pub const RLIMIT_MEMLOCK: ::c_int = 9; +pub const RLIMIT_NLIMITS: ::c_int = 16; + +pub const O_APPEND: ::c_int = 8; +pub const O_CREAT: ::c_int = 256; +pub const O_EXCL: ::c_int = 1024; +pub const O_NOCTTY: ::c_int = 2048; +pub const O_NONBLOCK: ::c_int = 128; +pub const O_SYNC: ::c_int = 0x4010; +pub const O_RSYNC: ::c_int = 0x4010; +pub const O_DSYNC: ::c_int = 0x10; +pub const O_FSYNC: ::c_int = 0x4010; +pub const O_ASYNC: ::c_int = 0x1000; +pub const O_NDELAY: ::c_int = 0x80; + +pub const SOCK_NONBLOCK: ::c_int = 128; + +pub const EDEADLK: ::c_int = 45; +pub const ENAMETOOLONG: ::c_int = 78; +pub const ENOLCK: ::c_int = 46; +pub const ENOSYS: ::c_int = 89; +pub const ENOTEMPTY: ::c_int = 93; +pub const ELOOP: ::c_int = 90; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const ECHRNG: ::c_int = 37; +pub const EL2NSYNC: ::c_int = 38; +pub const EL3HLT: ::c_int = 39; +pub const EL3RST: ::c_int = 40; +pub const ELNRNG: ::c_int = 41; +pub const EUNATCH: ::c_int = 42; +pub const ENOCSI: ::c_int = 43; +pub const EL2HLT: ::c_int = 44; +pub const EBADE: ::c_int = 50; +pub const EBADR: ::c_int = 51; +pub const EXFULL: ::c_int = 52; +pub const ENOANO: ::c_int = 53; +pub const EBADRQC: ::c_int = 54; +pub const EBADSLT: ::c_int = 55; +pub const EDEADLOCK: ::c_int = 56; +pub const EMULTIHOP: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 79; +pub const ENOTUNIQ: ::c_int = 80; +pub const EBADFD: ::c_int = 81; +pub const EBADMSG: ::c_int = 77; +pub const EREMCHG: ::c_int = 82; +pub const ELIBACC: ::c_int = 83; +pub const ELIBBAD: ::c_int = 84; +pub const ELIBSCN: ::c_int = 85; +pub const ELIBMAX: ::c_int = 86; +pub const ELIBEXEC: ::c_int = 87; +pub const EILSEQ: ::c_int = 88; +pub const ERESTART: ::c_int = 91; +pub const ESTRPIPE: ::c_int = 92; +pub const EUSERS: ::c_int = 94; +pub const ENOTSOCK: ::c_int = 95; +pub const EDESTADDRREQ: ::c_int = 96; +pub const EMSGSIZE: ::c_int = 97; +pub const EPROTOTYPE: ::c_int = 98; +pub const ENOPROTOOPT: ::c_int = 99; +pub const EPROTONOSUPPORT: ::c_int = 120; +pub const ESOCKTNOSUPPORT: ::c_int = 121; +pub const EOPNOTSUPP: ::c_int = 122; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 123; +pub const EAFNOSUPPORT: ::c_int = 124; +pub const EADDRINUSE: ::c_int = 125; +pub const EADDRNOTAVAIL: ::c_int = 126; +pub const ENETDOWN: ::c_int = 127; +pub const ENETUNREACH: ::c_int = 128; +pub const ENETRESET: ::c_int = 129; +pub const ECONNABORTED: ::c_int = 130; +pub const ECONNRESET: ::c_int = 131; +pub const ENOBUFS: ::c_int = 132; +pub const EISCONN: ::c_int = 133; +pub const ENOTCONN: ::c_int = 134; +pub const ESHUTDOWN: ::c_int = 143; +pub const ETOOMANYREFS: ::c_int = 144; +pub const ETIMEDOUT: ::c_int = 145; +pub const ECONNREFUSED: ::c_int = 146; +pub const EHOSTDOWN: ::c_int = 147; +pub const EHOSTUNREACH: ::c_int = 148; +pub const EALREADY: ::c_int = 149; +pub const EINPROGRESS: ::c_int = 150; +pub const ESTALE: ::c_int = 151; +pub const EUCLEAN: ::c_int = 135; +pub const ENOTNAM: ::c_int = 137; +pub const ENAVAIL: ::c_int = 138; +pub const EISNAM: ::c_int = 139; +pub const EREMOTEIO: ::c_int = 140; +pub const EDQUOT: ::c_int = 1133; +pub const ENOMEDIUM: ::c_int = 159; +pub const EMEDIUMTYPE: ::c_int = 160; +pub const ECANCELED: ::c_int = 158; +pub const ENOKEY: ::c_int = 161; +pub const EKEYEXPIRED: ::c_int = 162; +pub const EKEYREVOKED: ::c_int = 163; +pub const EKEYREJECTED: ::c_int = 164; +pub const EOWNERDEAD: ::c_int = 165; +pub const ENOTRECOVERABLE: ::c_int = 166; +pub const ERFKILL: ::c_int = 167; + +pub const LC_PAPER: ::c_int = 7; +pub const LC_NAME: ::c_int = 8; +pub const LC_ADDRESS: ::c_int = 9; +pub const LC_TELEPHONE: ::c_int = 10; +pub const LC_MEASUREMENT: ::c_int = 11; +pub const LC_IDENTIFICATION: ::c_int = 12; +pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER); +pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME); +pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS); +pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE); +pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT); +pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION); +pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK + | ::LC_NUMERIC_MASK + | ::LC_TIME_MASK + | ::LC_COLLATE_MASK + | ::LC_MONETARY_MASK + | ::LC_MESSAGES_MASK + | LC_PAPER_MASK + | LC_NAME_MASK + | LC_ADDRESS_MASK + | LC_TELEPHONE_MASK + | LC_MEASUREMENT_MASK + | LC_IDENTIFICATION_MASK; + +pub const MAP_NORESERVE: ::c_int = 0x400; +pub const MAP_ANON: ::c_int = 0x800; +pub const MAP_ANONYMOUS: ::c_int = 0x800; +pub const MAP_GROWSDOWN: ::c_int = 0x1000; +pub const MAP_DENYWRITE: ::c_int = 0x2000; +pub const MAP_EXECUTABLE: ::c_int = 0x4000; +pub const MAP_LOCKED: ::c_int = 0x8000; +pub const MAP_POPULATE: ::c_int = 0x10000; +pub const MAP_NONBLOCK: ::c_int = 0x20000; +pub const MAP_STACK: ::c_int = 0x40000; + +pub const SOCK_STREAM: ::c_int = 2; +pub const SOCK_DGRAM: ::c_int = 1; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SOL_SOCKET: ::c_int = 0xffff; + +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_STYLE: ::c_int = SO_TYPE; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_ACCEPTCONN: ::c_int = 0x1009; +pub const SO_PROTOCOL: ::c_int = 0x1028; +pub const SO_DOMAIN: ::c_int = 0x1029; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_PASSCRED: ::c_int = 17; +pub const SO_PEERCRED: ::c_int = 18; +pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; +pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; +pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; +pub const SO_BINDTODEVICE: ::c_int = 25; +pub const SO_ATTACH_FILTER: ::c_int = 26; +pub const SO_DETACH_FILTER: ::c_int = 27; +pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; +pub const SO_PEERNAME: ::c_int = 28; +pub const SO_TIMESTAMP: ::c_int = 29; +pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; +pub const SO_PEERSEC: ::c_int = 30; +pub const SO_SNDBUFFORCE: ::c_int = 31; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_PASSSEC: ::c_int = 34; +pub const SO_TIMESTAMPNS: ::c_int = 35; +pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; +pub const SO_MARK: ::c_int = 36; +pub const SO_TIMESTAMPING: ::c_int = 37; +pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; +pub const SO_RXQ_OVFL: ::c_int = 40; +pub const SO_WIFI_STATUS: ::c_int = 41; +pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; +pub const SO_PEEK_OFF: ::c_int = 42; +pub const SO_NOFCS: ::c_int = 43; +pub const SO_LOCK_FILTER: ::c_int = 44; +pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; +pub const SO_BUSY_POLL: ::c_int = 46; +pub const SO_MAX_PACING_RATE: ::c_int = 47; +pub const SO_BPF_EXTENSIONS: ::c_int = 48; +pub const SO_INCOMING_CPU: ::c_int = 49; +pub const SO_ATTACH_BPF: ::c_int = 50; +pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; + +pub const FIOCLEX: ::c_ulong = 0x6601; +pub const FIONBIO: ::c_ulong = 0x667e; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000008; +pub const SA_NOCLDWAIT: ::c_int = 0x00010000; + +pub const SIGCHLD: ::c_int = 18; +pub const SIGBUS: ::c_int = 10; +pub const SIGTTIN: ::c_int = 26; +pub const SIGTTOU: ::c_int = 27; +pub const SIGXCPU: ::c_int = 30; +pub const SIGXFSZ: ::c_int = 31; +pub const SIGVTALRM: ::c_int = 28; +pub const SIGPROF: ::c_int = 29; +pub const SIGWINCH: ::c_int = 20; +pub const SIGUSR1: ::c_int = 16; +pub const SIGUSR2: ::c_int = 17; +pub const SIGCONT: ::c_int = 25; +pub const SIGSTOP: ::c_int = 23; +pub const SIGTSTP: ::c_int = 24; +pub const SIGURG: ::c_int = 21; +pub const SIGIO: ::c_int = 22; +pub const SIGSYS: ::c_int = 12; +pub const SIGPOLL: ::c_int = 22; +pub const SIGPWR: ::c_int = 19; +pub const SIG_SETMASK: ::c_int = 3; +pub const SIG_BLOCK: ::c_int = 0x1; +pub const SIG_UNBLOCK: ::c_int = 0x2; + +pub const POLLRDNORM: ::c_short = 0x040; +pub const POLLWRNORM: ::c_short = 0x004; +pub const POLLRDBAND: ::c_short = 0x080; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const PTHREAD_STACK_MIN: ::size_t = 131072; + +pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5; +pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff; +pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245; +pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45; +pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53; +pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849; +pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6; +pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660; +pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6; +pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f; +pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f; +pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468; +pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478; +pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44; +pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c; +pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969; +pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1; +pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0; +pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f; +pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973; +pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b; +pub const TMPFS_MAGIC: ::c_long = 0x01021994; +pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2; + +pub const VEOF: usize = 16; +pub const VEOL: usize = 17; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const IEXTEN: ::tcflag_t = 0x00000100; +pub const TOSTOP: ::tcflag_t = 0x00008000; +pub const FLUSHO: ::tcflag_t = 0x00002000; +pub const EXTPROC: ::tcflag_t = 0o200000; +pub const TCSANOW: ::c_int = 0x540e; +pub const TCSADRAIN: ::c_int = 0x540f; +pub const TCSAFLUSH: ::c_int = 0x5410; + +pub const CPU_SETSIZE: ::c_int = 0x400; + +pub const PTRACE_TRACEME: ::c_uint = 0; +pub const PTRACE_PEEKTEXT: ::c_uint = 1; +pub const PTRACE_PEEKDATA: ::c_uint = 2; +pub const PTRACE_PEEKUSER: ::c_uint = 3; +pub const PTRACE_POKETEXT: ::c_uint = 4; +pub const PTRACE_POKEDATA: ::c_uint = 5; +pub const PTRACE_POKEUSER: ::c_uint = 6; +pub const PTRACE_CONT: ::c_uint = 7; +pub const PTRACE_KILL: ::c_uint = 8; +pub const PTRACE_SINGLESTEP: ::c_uint = 9; +pub const PTRACE_ATTACH: ::c_uint = 16; +pub const PTRACE_DETACH: ::c_uint = 17; +pub const PTRACE_SYSCALL: ::c_uint = 24; +pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203; +pub const PTRACE_GETFPREGS: ::c_uint = 14; +pub const PTRACE_SETFPREGS: ::c_uint = 15; +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; +pub const PTRACE_GETREGS: ::c_uint = 12; +pub const PTRACE_SETREGS: ::c_uint = 13; + +pub const MAP_HUGETLB: ::c_int = 0x080000; + +pub const EFD_NONBLOCK: ::c_int = 0x80; + +pub const F_GETLK: ::c_int = 14; +pub const F_GETOWN: ::c_int = 23; +pub const F_SETOWN: ::c_int = 24; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; + +pub const SFD_NONBLOCK: ::c_int = 0x80; + +pub const TCGETS: ::c_ulong = 0x540d; +pub const TCSETS: ::c_ulong = 0x540e; +pub const TCSETSW: ::c_ulong = 0x540f; +pub const TCSETSF: ::c_ulong = 0x5410; +pub const TCGETA: ::c_ulong = 0x5401; +pub const TCSETA: ::c_ulong = 0x5402; +pub const TCSETAW: ::c_ulong = 0x5403; +pub const TCSETAF: ::c_ulong = 0x5404; +pub const TCSBRK: ::c_ulong = 0x5405; +pub const TCXONC: ::c_ulong = 0x5406; +pub const TCFLSH: ::c_ulong = 0x5407; +pub const TIOCGSOFTCAR: ::c_ulong = 0x5481; +pub const TIOCSSOFTCAR: ::c_ulong = 0x5482; +pub const TIOCINQ: ::c_ulong = 0x467f; +pub const TIOCLINUX: ::c_ulong = 0x5483; +pub const TIOCGSERIAL: ::c_ulong = 0x5484; +pub const TIOCEXCL: ::c_ulong = 0x740d; +pub const TIOCNXCL: ::c_ulong = 0x740e; +pub const TIOCSCTTY: ::c_ulong = 0x5480; +pub const TIOCGPGRP: ::c_ulong = 0x40047477; +pub const TIOCSPGRP: ::c_ulong = 0x80047476; +pub const TIOCOUTQ: ::c_ulong = 0x7472; +pub const TIOCSTI: ::c_ulong = 0x5472; +pub const TIOCGWINSZ: ::c_ulong = 0x40087468; +pub const TIOCSWINSZ: ::c_ulong = 0x80087467; +pub const TIOCMGET: ::c_ulong = 0x741d; +pub const TIOCMBIS: ::c_ulong = 0x741b; +pub const TIOCMBIC: ::c_ulong = 0x741c; +pub const TIOCMSET: ::c_ulong = 0x741a; +pub const FIONREAD: ::c_ulong = 0x467f; +pub const TIOCCONS: ::c_ulong = 0x80047478; + +pub const RTLD_DEEPBIND: ::c_int = 0x10; +pub const RTLD_GLOBAL: ::c_int = 0x4; +pub const RTLD_NOLOAD: ::c_int = 0x8; + +pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead; +pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793; +pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278; +pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448; +pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216; + +pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567; +pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123; +pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF; +pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000; +pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC; +pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4; +pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2; +pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +cfg_if! { + if #[cfg(target_arch = "mips")] { + mod mips32; + pub use self::mips32::*; + } else if #[cfg(target_arch = "mips64")] { + mod mips64; + pub use self::mips64::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mod.rs new file mode 100644 index 000000000..9774f93f6 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mod.rs @@ -0,0 +1,978 @@ +//! Linux-specific definitions for linux-like values + +use dox::{mem, Option}; + +pub type useconds_t = u32; +pub type dev_t = u64; +pub type socklen_t = u32; +pub type pthread_t = c_ulong; +pub type mode_t = u32; +pub type ino64_t = u64; +pub type off64_t = i64; +pub type blkcnt64_t = i64; +pub type rlim64_t = u64; +pub type shmatt_t = ::c_ulong; +pub type mqd_t = ::c_int; +pub type msgqnum_t = ::c_ulong; +pub type msglen_t = ::c_ulong; +pub type nfds_t = ::c_ulong; +pub type nl_item = ::c_int; +pub type idtype_t = ::c_uint; + +pub enum fpos64_t {} // TODO: fill this out with a struct + +s! { + pub struct dirent { + pub d_ino: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + pub struct dirent64 { + pub d_ino: ::ino64_t, + pub d_off: ::off64_t, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + pub struct rlimit64 { + pub rlim_cur: rlim64_t, + pub rlim_max: rlim64_t, + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut c_char, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + } + + pub struct ifaddrs { + pub ifa_next: *mut ifaddrs, + pub ifa_name: *mut c_char, + pub ifa_flags: ::c_uint, + pub ifa_addr: *mut ::sockaddr, + pub ifa_netmask: *mut ::sockaddr, + pub ifa_ifu: *mut ::sockaddr, // FIXME This should be a union + pub ifa_data: *mut ::c_void + } + + pub struct pthread_mutex_t { + #[cfg(any(target_arch = "mips", target_arch = "arm", + target_arch = "powerpc"))] + __align: [::c_long; 0], + #[cfg(not(any(target_arch = "mips", target_arch = "arm", + target_arch = "powerpc")))] + __align: [::c_longlong; 0], + size: [u8; __SIZEOF_PTHREAD_MUTEX_T], + } + + pub struct pthread_rwlock_t { + #[cfg(any(target_arch = "mips", target_arch = "arm", + target_arch = "powerpc"))] + __align: [::c_long; 0], + #[cfg(not(any(target_arch = "mips", target_arch = "arm", + target_arch = "powerpc")))] + __align: [::c_longlong; 0], + size: [u8; __SIZEOF_PTHREAD_RWLOCK_T], + } + + pub struct pthread_mutexattr_t { + #[cfg(any(target_arch = "x86_64", target_arch = "powerpc64", + target_arch = "mips64", target_arch = "s390x", + target_arch = "sparc64"))] + __align: [::c_int; 0], + #[cfg(not(any(target_arch = "x86_64", target_arch = "powerpc64", + target_arch = "mips64", target_arch = "s390x", + target_arch = "sparc64")))] + __align: [::c_long; 0], + size: [u8; __SIZEOF_PTHREAD_MUTEXATTR_T], + } + + pub struct pthread_cond_t { + #[cfg(any(target_env = "musl"))] + __align: [*const ::c_void; 0], + #[cfg(not(any(target_env = "musl")))] + __align: [::c_longlong; 0], + size: [u8; __SIZEOF_PTHREAD_COND_T], + } + + pub struct pthread_condattr_t { + __align: [::c_int; 0], + size: [u8; __SIZEOF_PTHREAD_CONDATTR_T], + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct spwd { + pub sp_namp: *mut ::c_char, + pub sp_pwdp: *mut ::c_char, + pub sp_lstchg: ::c_long, + pub sp_min: ::c_long, + pub sp_max: ::c_long, + pub sp_warn: ::c_long, + pub sp_inact: ::c_long, + pub sp_expire: ::c_long, + pub sp_flag: ::c_ulong, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + #[cfg(target_endian = "little")] + pub f_fsid: ::c_ulong, + #[cfg(target_pointer_width = "32")] + __f_unused: ::c_int, + #[cfg(target_endian = "big")] + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct dqblk { + pub dqb_bhardlimit: ::uint64_t, + pub dqb_bsoftlimit: ::uint64_t, + pub dqb_curspace: ::uint64_t, + pub dqb_ihardlimit: ::uint64_t, + pub dqb_isoftlimit: ::uint64_t, + pub dqb_curinodes: ::uint64_t, + pub dqb_btime: ::uint64_t, + pub dqb_itime: ::uint64_t, + pub dqb_valid: ::uint32_t, + } + + pub struct signalfd_siginfo { + pub ssi_signo: ::uint32_t, + pub ssi_errno: ::int32_t, + pub ssi_code: ::int32_t, + pub ssi_pid: ::uint32_t, + pub ssi_uid: ::uint32_t, + pub ssi_fd: ::int32_t, + pub ssi_tid: ::uint32_t, + pub ssi_band: ::uint32_t, + pub ssi_overrun: ::uint32_t, + pub ssi_trapno: ::uint32_t, + pub ssi_status: ::int32_t, + pub ssi_int: ::int32_t, + pub ssi_ptr: ::uint64_t, + pub ssi_utime: ::uint64_t, + pub ssi_stime: ::uint64_t, + pub ssi_addr: ::uint64_t, + _pad: [::uint8_t; 48], + } + + pub struct fsid_t { + __val: [::c_int; 2], + } + + pub struct mq_attr { + pub mq_flags: ::c_long, + pub mq_maxmsg: ::c_long, + pub mq_msgsize: ::c_long, + pub mq_curmsgs: ::c_long, + pad: [::c_long; 4] + } + + pub struct cpu_set_t { + #[cfg(target_pointer_width = "32")] + bits: [u32; 32], + #[cfg(target_pointer_width = "64")] + bits: [u64; 16], + } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } + + // System V IPC + pub struct msginfo { + pub msgpool: ::c_int, + pub msgmap: ::c_int, + pub msgmax: ::c_int, + pub msgmnb: ::c_int, + pub msgmni: ::c_int, + pub msgssz: ::c_int, + pub msgtql: ::c_int, + pub msgseg: ::c_ushort, + } +} + +pub const ABDAY_1: ::nl_item = 0x20000; +pub const ABDAY_2: ::nl_item = 0x20001; +pub const ABDAY_3: ::nl_item = 0x20002; +pub const ABDAY_4: ::nl_item = 0x20003; +pub const ABDAY_5: ::nl_item = 0x20004; +pub const ABDAY_6: ::nl_item = 0x20005; +pub const ABDAY_7: ::nl_item = 0x20006; + +pub const DAY_1: ::nl_item = 0x20007; +pub const DAY_2: ::nl_item = 0x20008; +pub const DAY_3: ::nl_item = 0x20009; +pub const DAY_4: ::nl_item = 0x2000A; +pub const DAY_5: ::nl_item = 0x2000B; +pub const DAY_6: ::nl_item = 0x2000C; +pub const DAY_7: ::nl_item = 0x2000D; + +pub const ABMON_1: ::nl_item = 0x2000E; +pub const ABMON_2: ::nl_item = 0x2000F; +pub const ABMON_3: ::nl_item = 0x20010; +pub const ABMON_4: ::nl_item = 0x20011; +pub const ABMON_5: ::nl_item = 0x20012; +pub const ABMON_6: ::nl_item = 0x20013; +pub const ABMON_7: ::nl_item = 0x20014; +pub const ABMON_8: ::nl_item = 0x20015; +pub const ABMON_9: ::nl_item = 0x20016; +pub const ABMON_10: ::nl_item = 0x20017; +pub const ABMON_11: ::nl_item = 0x20018; +pub const ABMON_12: ::nl_item = 0x20019; + +pub const MON_1: ::nl_item = 0x2001A; +pub const MON_2: ::nl_item = 0x2001B; +pub const MON_3: ::nl_item = 0x2001C; +pub const MON_4: ::nl_item = 0x2001D; +pub const MON_5: ::nl_item = 0x2001E; +pub const MON_6: ::nl_item = 0x2001F; +pub const MON_7: ::nl_item = 0x20020; +pub const MON_8: ::nl_item = 0x20021; +pub const MON_9: ::nl_item = 0x20022; +pub const MON_10: ::nl_item = 0x20023; +pub const MON_11: ::nl_item = 0x20024; +pub const MON_12: ::nl_item = 0x20025; + +pub const AM_STR: ::nl_item = 0x20026; +pub const PM_STR: ::nl_item = 0x20027; + +pub const D_T_FMT: ::nl_item = 0x20028; +pub const D_FMT: ::nl_item = 0x20029; +pub const T_FMT: ::nl_item = 0x2002A; +pub const T_FMT_AMPM: ::nl_item = 0x2002B; + +pub const ERA: ::nl_item = 0x2002C; +pub const ERA_D_FMT: ::nl_item = 0x2002E; +pub const ALT_DIGITS: ::nl_item = 0x2002F; +pub const ERA_D_T_FMT: ::nl_item = 0x20030; +pub const ERA_T_FMT: ::nl_item = 0x20031; + +pub const CODESET: ::nl_item = 14; + +pub const CRNCYSTR: ::nl_item = 0x4000F; + +pub const RUSAGE_THREAD: ::c_int = 1; +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const RADIXCHAR: ::nl_item = 0x10000; +pub const THOUSEP: ::nl_item = 0x10001; + +pub const YESEXPR: ::nl_item = 0x50000; +pub const NOEXPR: ::nl_item = 0x50001; +pub const YESSTR: ::nl_item = 0x50002; +pub const NOSTR: ::nl_item = 0x50003; + +pub const FILENAME_MAX: ::c_uint = 4096; +pub const L_tmpnam: ::c_uint = 20; +pub const _PC_LINK_MAX: ::c_int = 0; +pub const _PC_MAX_CANON: ::c_int = 1; +pub const _PC_MAX_INPUT: ::c_int = 2; +pub const _PC_NAME_MAX: ::c_int = 3; +pub const _PC_PATH_MAX: ::c_int = 4; +pub const _PC_PIPE_BUF: ::c_int = 5; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 6; +pub const _PC_NO_TRUNC: ::c_int = 7; +pub const _PC_VDISABLE: ::c_int = 8; + +pub const _SC_ARG_MAX: ::c_int = 0; +pub const _SC_CHILD_MAX: ::c_int = 1; +pub const _SC_CLK_TCK: ::c_int = 2; +pub const _SC_NGROUPS_MAX: ::c_int = 3; +pub const _SC_OPEN_MAX: ::c_int = 4; +pub const _SC_STREAM_MAX: ::c_int = 5; +pub const _SC_TZNAME_MAX: ::c_int = 6; +pub const _SC_JOB_CONTROL: ::c_int = 7; +pub const _SC_SAVED_IDS: ::c_int = 8; +pub const _SC_REALTIME_SIGNALS: ::c_int = 9; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 10; +pub const _SC_TIMERS: ::c_int = 11; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 12; +pub const _SC_PRIORITIZED_IO: ::c_int = 13; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 14; +pub const _SC_FSYNC: ::c_int = 15; +pub const _SC_MAPPED_FILES: ::c_int = 16; +pub const _SC_MEMLOCK: ::c_int = 17; +pub const _SC_MEMLOCK_RANGE: ::c_int = 18; +pub const _SC_MEMORY_PROTECTION: ::c_int = 19; +pub const _SC_MESSAGE_PASSING: ::c_int = 20; +pub const _SC_SEMAPHORES: ::c_int = 21; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 22; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 23; +pub const _SC_AIO_MAX: ::c_int = 24; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 25; +pub const _SC_DELAYTIMER_MAX: ::c_int = 26; +pub const _SC_MQ_OPEN_MAX: ::c_int = 27; +pub const _SC_MQ_PRIO_MAX: ::c_int = 28; +pub const _SC_VERSION: ::c_int = 29; +pub const _SC_PAGESIZE: ::c_int = 30; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_RTSIG_MAX: ::c_int = 31; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 32; +pub const _SC_SEM_VALUE_MAX: ::c_int = 33; +pub const _SC_SIGQUEUE_MAX: ::c_int = 34; +pub const _SC_TIMER_MAX: ::c_int = 35; +pub const _SC_BC_BASE_MAX: ::c_int = 36; +pub const _SC_BC_DIM_MAX: ::c_int = 37; +pub const _SC_BC_SCALE_MAX: ::c_int = 38; +pub const _SC_BC_STRING_MAX: ::c_int = 39; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 40; +pub const _SC_EXPR_NEST_MAX: ::c_int = 42; +pub const _SC_LINE_MAX: ::c_int = 43; +pub const _SC_RE_DUP_MAX: ::c_int = 44; +pub const _SC_2_VERSION: ::c_int = 46; +pub const _SC_2_C_BIND: ::c_int = 47; +pub const _SC_2_C_DEV: ::c_int = 48; +pub const _SC_2_FORT_DEV: ::c_int = 49; +pub const _SC_2_FORT_RUN: ::c_int = 50; +pub const _SC_2_SW_DEV: ::c_int = 51; +pub const _SC_2_LOCALEDEF: ::c_int = 52; +pub const _SC_IOV_MAX: ::c_int = 60; +pub const _SC_THREADS: ::c_int = 67; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 68; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 69; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 70; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 71; +pub const _SC_TTY_NAME_MAX: ::c_int = 72; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 73; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 74; +pub const _SC_THREAD_STACK_MIN: ::c_int = 75; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 76; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 77; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 78; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 79; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 80; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 81; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 84; +pub const _SC_ATEXIT_MAX: ::c_int = 87; +pub const _SC_XOPEN_VERSION: ::c_int = 89; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 90; +pub const _SC_XOPEN_UNIX: ::c_int = 91; +pub const _SC_XOPEN_CRYPT: ::c_int = 92; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 93; +pub const _SC_XOPEN_SHM: ::c_int = 94; +pub const _SC_2_CHAR_TERM: ::c_int = 95; +pub const _SC_2_UPE: ::c_int = 97; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = 125; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 126; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 128; +pub const _SC_XOPEN_LEGACY: ::c_int = 129; +pub const _SC_XOPEN_REALTIME: ::c_int = 130; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 131; +pub const _SC_HOST_NAME_MAX: ::c_int = 180; + +pub const RLIM_SAVED_MAX: ::rlim_t = RLIM_INFINITY; +pub const RLIM_SAVED_CUR: ::rlim_t = RLIM_INFINITY; + +pub const GLOB_ERR: ::c_int = 1 << 0; +pub const GLOB_MARK: ::c_int = 1 << 1; +pub const GLOB_NOSORT: ::c_int = 1 << 2; +pub const GLOB_DOOFFS: ::c_int = 1 << 3; +pub const GLOB_NOCHECK: ::c_int = 1 << 4; +pub const GLOB_APPEND: ::c_int = 1 << 5; +pub const GLOB_NOESCAPE: ::c_int = 1 << 6; + +pub const GLOB_NOSPACE: ::c_int = 1; +pub const GLOB_ABORTED: ::c_int = 2; +pub const GLOB_NOMATCH: ::c_int = 3; + +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; + +pub const S_IEXEC: mode_t = 64; +pub const S_IWRITE: mode_t = 128; +pub const S_IREAD: mode_t = 256; + +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; + +pub const ST_RDONLY: ::c_ulong = 1; +pub const ST_NOSUID: ::c_ulong = 2; +pub const ST_NODEV: ::c_ulong = 4; +pub const ST_NOEXEC: ::c_ulong = 8; +pub const ST_SYNCHRONOUS: ::c_ulong = 16; +pub const ST_MANDLOCK: ::c_ulong = 64; +pub const ST_WRITE: ::c_ulong = 128; +pub const ST_APPEND: ::c_ulong = 256; +pub const ST_IMMUTABLE: ::c_ulong = 512; +pub const ST_NOATIME: ::c_ulong = 1024; +pub const ST_NODIRATIME: ::c_ulong = 2048; + +pub const RTLD_NEXT: *mut ::c_void = -1i64 as *mut ::c_void; +pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; +pub const RTLD_NODELETE: ::c_int = 0x1000; +pub const RTLD_NOW: ::c_int = 0x2; + +pub const TCP_MD5SIG: ::c_int = 14; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + __align: [], + size: [0; __SIZEOF_PTHREAD_MUTEX_T], +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + __align: [], + size: [0; __SIZEOF_PTHREAD_COND_T], +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + __align: [], + size: [0; __SIZEOF_PTHREAD_RWLOCK_T], +}; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; +pub const __SIZEOF_PTHREAD_COND_T: usize = 48; + +pub const SCHED_OTHER: ::c_int = 0; +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_RR: ::c_int = 2; +pub const SCHED_BATCH: ::c_int = 3; +pub const SCHED_IDLE: ::c_int = 5; + +pub const AF_IB: ::c_int = 27; +pub const AF_MPLS: ::c_int = 28; +pub const AF_NFC: ::c_int = 39; +pub const AF_VSOCK: ::c_int = 40; +#[doc(hidden)] +pub const AF_MAX: ::c_int = 42; +pub const PF_IB: ::c_int = AF_IB; +pub const PF_MPLS: ::c_int = AF_MPLS; +pub const PF_NFC: ::c_int = AF_NFC; +pub const PF_VSOCK: ::c_int = AF_VSOCK; +#[doc(hidden)] +pub const PF_MAX: ::c_int = AF_MAX; + +// System V IPC +pub const IPC_PRIVATE: ::key_t = 0; + +pub const IPC_CREAT: ::c_int = 0o1000; +pub const IPC_EXCL: ::c_int = 0o2000; +pub const IPC_NOWAIT: ::c_int = 0o4000; + +pub const IPC_RMID: ::c_int = 0; +pub const IPC_SET: ::c_int = 1; +pub const IPC_STAT: ::c_int = 2; +pub const IPC_INFO: ::c_int = 3; +pub const MSG_STAT: ::c_int = 11; +pub const MSG_INFO: ::c_int = 12; + +pub const MSG_NOERROR: ::c_int = 0o10000; +pub const MSG_EXCEPT: ::c_int = 0o20000; +pub const MSG_COPY: ::c_int = 0o40000; + +pub const SHM_R: ::c_int = 0o400; +pub const SHM_W: ::c_int = 0o200; + +pub const SHM_RDONLY: ::c_int = 0o10000; +pub const SHM_RND: ::c_int = 0o20000; +pub const SHM_REMAP: ::c_int = 0o40000; +pub const SHM_EXEC: ::c_int = 0o100000; + +pub const SHM_LOCK: ::c_int = 11; +pub const SHM_UNLOCK: ::c_int = 12; + +pub const SHM_HUGETLB: ::c_int = 0o4000; +pub const SHM_NORESERVE: ::c_int = 0o10000; + +pub const EPOLLRDHUP: ::c_int = 0x2000; +pub const EPOLLEXCLUSIVE: ::c_int = 0x10000000; +pub const EPOLLONESHOT: ::c_int = 0x40000000; + +pub const QFMT_VFS_OLD: ::c_int = 1; +pub const QFMT_VFS_V0: ::c_int = 2; + +pub const EFD_SEMAPHORE: ::c_int = 0x1; + +pub const LOG_NFACILITIES: ::c_int = 24; + +pub const SEM_FAILED: *mut ::sem_t = 0 as *mut sem_t; + +pub const RB_AUTOBOOT: ::c_int = 0x01234567u32 as i32; +pub const RB_HALT_SYSTEM: ::c_int = 0xcdef0123u32 as i32; +pub const RB_ENABLE_CAD: ::c_int = 0x89abcdefu32 as i32; +pub const RB_DISABLE_CAD: ::c_int = 0x00000000u32 as i32; +pub const RB_POWER_OFF: ::c_int = 0x4321fedcu32 as i32; +pub const RB_SW_SUSPEND: ::c_int = 0xd000fce2u32 as i32; +pub const RB_KEXEC: ::c_int = 0x45584543u32 as i32; + +pub const AI_PASSIVE: ::c_int = 0x0001; +pub const AI_CANONNAME: ::c_int = 0x0002; +pub const AI_NUMERICHOST: ::c_int = 0x0004; +pub const AI_V4MAPPED: ::c_int = 0x0008; +pub const AI_ALL: ::c_int = 0x0010; +pub const AI_ADDRCONFIG: ::c_int = 0x0020; + +pub const AI_NUMERICSERV: ::c_int = 0x0400; + +pub const EAI_BADFLAGS: ::c_int = -1; +pub const EAI_NONAME: ::c_int = -2; +pub const EAI_AGAIN: ::c_int = -3; +pub const EAI_FAIL: ::c_int = -4; +pub const EAI_FAMILY: ::c_int = -6; +pub const EAI_SOCKTYPE: ::c_int = -7; +pub const EAI_SERVICE: ::c_int = -8; +pub const EAI_MEMORY: ::c_int = -10; +pub const EAI_OVERFLOW: ::c_int = -12; + +pub const NI_NUMERICHOST: ::c_int = 1; +pub const NI_NUMERICSERV: ::c_int = 2; +pub const NI_NOFQDN: ::c_int = 4; +pub const NI_NAMEREQD: ::c_int = 8; +pub const NI_DGRAM: ::c_int = 16; + +pub const SYNC_FILE_RANGE_WAIT_BEFORE: ::c_uint = 1; +pub const SYNC_FILE_RANGE_WRITE: ::c_uint = 2; +pub const SYNC_FILE_RANGE_WAIT_AFTER: ::c_uint = 4; + +pub const EAI_SYSTEM: ::c_int = -11; + +pub const AIO_CANCELED: ::c_int = 0; +pub const AIO_NOTCANCELED: ::c_int = 1; +pub const AIO_ALLDONE: ::c_int = 2; +pub const LIO_READ: ::c_int = 0; +pub const LIO_WRITE: ::c_int = 1; +pub const LIO_NOP: ::c_int = 2; +pub const LIO_WAIT: ::c_int = 0; +pub const LIO_NOWAIT: ::c_int = 1; + +pub const MREMAP_MAYMOVE: ::c_int = 1; +pub const MREMAP_FIXED: ::c_int = 2; + +pub const PR_SET_PDEATHSIG: ::c_int = 1; +pub const PR_GET_PDEATHSIG: ::c_int = 2; + +pub const PR_GET_DUMPABLE: ::c_int = 3; +pub const PR_SET_DUMPABLE: ::c_int = 4; + +pub const PR_GET_UNALIGN: ::c_int = 5; +pub const PR_SET_UNALIGN: ::c_int = 6; +pub const PR_UNALIGN_NOPRINT: ::c_int = 1; +pub const PR_UNALIGN_SIGBUS: ::c_int = 2; + +pub const PR_GET_KEEPCAPS: ::c_int = 7; +pub const PR_SET_KEEPCAPS: ::c_int = 8; + +pub const PR_GET_FPEMU: ::c_int = 9; +pub const PR_SET_FPEMU: ::c_int = 10; +pub const PR_FPEMU_NOPRINT: ::c_int = 1; +pub const PR_FPEMU_SIGFPE: ::c_int = 2; + +pub const PR_GET_FPEXC: ::c_int = 11; +pub const PR_SET_FPEXC: ::c_int = 12; +pub const PR_FP_EXC_SW_ENABLE: ::c_int = 0x80; +pub const PR_FP_EXC_DIV: ::c_int = 0x010000; +pub const PR_FP_EXC_OVF: ::c_int = 0x020000; +pub const PR_FP_EXC_UND: ::c_int = 0x040000; +pub const PR_FP_EXC_RES: ::c_int = 0x080000; +pub const PR_FP_EXC_INV: ::c_int = 0x100000; +pub const PR_FP_EXC_DISABLED: ::c_int = 0; +pub const PR_FP_EXC_NONRECOV: ::c_int = 1; +pub const PR_FP_EXC_ASYNC: ::c_int = 2; +pub const PR_FP_EXC_PRECISE: ::c_int = 3; + +pub const PR_GET_TIMING: ::c_int = 13; +pub const PR_SET_TIMING: ::c_int = 14; +pub const PR_TIMING_STATISTICAL: ::c_int = 0; +pub const PR_TIMING_TIMESTAMP: ::c_int = 1; + +pub const PR_SET_NAME: ::c_int = 15; +pub const PR_GET_NAME: ::c_int = 16; + +pub const PR_GET_ENDIAN: ::c_int = 19; +pub const PR_SET_ENDIAN: ::c_int = 20; +pub const PR_ENDIAN_BIG: ::c_int = 0; +pub const PR_ENDIAN_LITTLE: ::c_int = 1; +pub const PR_ENDIAN_PPC_LITTLE: ::c_int = 2; + +pub const PR_GET_SECCOMP: ::c_int = 21; +pub const PR_SET_SECCOMP: ::c_int = 22; + +pub const PR_CAPBSET_READ: ::c_int = 23; +pub const PR_CAPBSET_DROP: ::c_int = 24; + +pub const PR_GET_TSC: ::c_int = 25; +pub const PR_SET_TSC: ::c_int = 26; +pub const PR_TSC_ENABLE: ::c_int = 1; +pub const PR_TSC_SIGSEGV: ::c_int = 2; + +pub const PR_GET_SECUREBITS: ::c_int = 27; +pub const PR_SET_SECUREBITS: ::c_int = 28; + +pub const PR_SET_TIMERSLACK: ::c_int = 29; +pub const PR_GET_TIMERSLACK: ::c_int = 30; + +pub const PR_TASK_PERF_EVENTS_DISABLE: ::c_int = 31; +pub const PR_TASK_PERF_EVENTS_ENABLE: ::c_int = 32; + +pub const PR_MCE_KILL: ::c_int = 33; +pub const PR_MCE_KILL_CLEAR: ::c_int = 0; +pub const PR_MCE_KILL_SET: ::c_int = 1; + +pub const PR_MCE_KILL_LATE: ::c_int = 0; +pub const PR_MCE_KILL_EARLY: ::c_int = 1; +pub const PR_MCE_KILL_DEFAULT: ::c_int = 2; + +pub const PR_MCE_KILL_GET: ::c_int = 34; + +pub const PR_SET_MM: ::c_int = 35; +pub const PR_SET_MM_START_CODE: ::c_int = 1; +pub const PR_SET_MM_END_CODE: ::c_int = 2; +pub const PR_SET_MM_START_DATA: ::c_int = 3; +pub const PR_SET_MM_END_DATA: ::c_int = 4; +pub const PR_SET_MM_START_STACK: ::c_int = 5; +pub const PR_SET_MM_START_BRK: ::c_int = 6; +pub const PR_SET_MM_BRK: ::c_int = 7; +pub const PR_SET_MM_ARG_START: ::c_int = 8; +pub const PR_SET_MM_ARG_END: ::c_int = 9; +pub const PR_SET_MM_ENV_START: ::c_int = 10; +pub const PR_SET_MM_ENV_END: ::c_int = 11; +pub const PR_SET_MM_AUXV: ::c_int = 12; +pub const PR_SET_MM_EXE_FILE: ::c_int = 13; +pub const PR_SET_MM_MAP: ::c_int = 14; +pub const PR_SET_MM_MAP_SIZE: ::c_int = 15; + +pub const PR_SET_PTRACER: ::c_int = 0x59616d61; + +pub const PR_SET_CHILD_SUBREAPER: ::c_int = 36; +pub const PR_GET_CHILD_SUBREAPER: ::c_int = 37; + +pub const PR_SET_NO_NEW_PRIVS: ::c_int = 38; +pub const PR_GET_NO_NEW_PRIVS: ::c_int = 39; + +pub const PR_GET_TID_ADDRESS: ::c_int = 40; + +pub const PR_SET_THP_DISABLE: ::c_int = 41; +pub const PR_GET_THP_DISABLE: ::c_int = 42; + +pub const PR_MPX_ENABLE_MANAGEMENT: ::c_int = 43; +pub const PR_MPX_DISABLE_MANAGEMENT: ::c_int = 44; + +pub const PR_SET_FP_MODE: ::c_int = 45; +pub const PR_GET_FP_MODE: ::c_int = 46; +pub const PR_FP_MODE_FR: ::c_int = 1 << 0; +pub const PR_FP_MODE_FRE: ::c_int = 1 << 1; + +pub const PR_CAP_AMBIENT: ::c_int = 47; +pub const PR_CAP_AMBIENT_IS_SET: ::c_int = 1; +pub const PR_CAP_AMBIENT_RAISE: ::c_int = 2; +pub const PR_CAP_AMBIENT_LOWER: ::c_int = 3; +pub const PR_CAP_AMBIENT_CLEAR_ALL: ::c_int = 4; + +f! { + pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { + for slot in cpuset.bits.iter_mut() { + *slot = 0; + } + } + + pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + cpuset.bits[idx] |= 1 << offset; + () + } + + pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + cpuset.bits[idx] &= !(1 << offset); + () + } + + pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { + let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + 0 != (cpuset.bits[idx] & (1 << offset)) + } + + pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool { + set1.bits == set2.bits + } +} + +extern { + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int, + timeout: *const ::timespec) -> ::c_int; + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb, + nitems: ::c_int, sevp: *mut ::sigevent) -> ::c_int; + + pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; + + pub fn setpwent(); + pub fn getpwent() -> *mut passwd; + pub fn setspent(); + pub fn endspent(); + pub fn getspent() -> *mut spwd; + pub fn getspnam(__name: *const ::c_char) -> *mut spwd; + + pub fn shm_open(name: *const c_char, oflag: ::c_int, + mode: mode_t) -> ::c_int; + + // System V IPC + pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + pub fn shmat(shmid: ::c_int, + shmaddr: *const ::c_void, + shmflg: ::c_int) -> *mut ::c_void; + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + pub fn shmctl(shmid: ::c_int, + cmd: ::c_int, + buf: *mut ::shmid_ds) -> ::c_int; + pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t; + pub fn msgctl(msqid: ::c_int, cmd: ::c_int, buf: *mut msqid_ds) -> ::c_int; + pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int; + pub fn msgrcv(msqid: ::c_int, msgp: *mut ::c_void, msgsz: ::size_t, + msgtyp: ::c_long, msgflg: ::c_int) -> ::ssize_t; + pub fn msgsnd(msqid: ::c_int, msgp: *const ::c_void, msgsz: ::size_t, + msgflg: ::c_int) -> ::c_int; + + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) + -> ::c_int; + pub fn __errno_location() -> *mut ::c_int; + + pub fn fopen64(filename: *const c_char, + mode: *const c_char) -> *mut ::FILE; + pub fn freopen64(filename: *const c_char, mode: *const c_char, + file: *mut ::FILE) -> *mut ::FILE; + pub fn tmpfile64() -> *mut ::FILE; + pub fn fgetpos64(stream: *mut ::FILE, ptr: *mut fpos64_t) -> ::c_int; + pub fn fsetpos64(stream: *mut ::FILE, ptr: *const fpos64_t) -> ::c_int; + pub fn fseeko64(stream: *mut ::FILE, + offset: ::off64_t, + whence: ::c_int) -> ::c_int; + pub fn ftello64(stream: *mut ::FILE) -> ::off64_t; + pub fn fallocate(fd: ::c_int, mode: ::c_int, + offset: ::off_t, len: ::off_t) -> ::c_int; + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, + len: ::off_t) -> ::c_int; + pub fn readahead(fd: ::c_int, offset: ::off64_t, + count: ::size_t) -> ::ssize_t; + pub fn getxattr(path: *const c_char, name: *const c_char, + value: *mut ::c_void, size: ::size_t) -> ::ssize_t; + pub fn lgetxattr(path: *const c_char, name: *const c_char, + value: *mut ::c_void, size: ::size_t) -> ::ssize_t; + pub fn fgetxattr(filedes: ::c_int, name: *const c_char, + value: *mut ::c_void, size: ::size_t) -> ::ssize_t; + pub fn setxattr(path: *const c_char, name: *const c_char, + value: *const ::c_void, size: ::size_t, + flags: ::c_int) -> ::c_int; + pub fn lsetxattr(path: *const c_char, name: *const c_char, + value: *const ::c_void, size: ::size_t, + flags: ::c_int) -> ::c_int; + pub fn fsetxattr(filedes: ::c_int, name: *const c_char, + value: *const ::c_void, size: ::size_t, + flags: ::c_int) -> ::c_int; + pub fn listxattr(path: *const c_char, list: *mut c_char, + size: ::size_t) -> ::ssize_t; + pub fn llistxattr(path: *const c_char, list: *mut c_char, + size: ::size_t) -> ::ssize_t; + pub fn flistxattr(filedes: ::c_int, list: *mut c_char, + size: ::size_t) -> ::ssize_t; + pub fn removexattr(path: *const c_char, name: *const c_char) -> ::c_int; + pub fn lremovexattr(path: *const c_char, name: *const c_char) -> ::c_int; + pub fn fremovexattr(filedes: ::c_int, name: *const c_char) -> ::c_int; + pub fn signalfd(fd: ::c_int, + mask: *const ::sigset_t, + flags: ::c_int) -> ::c_int; + pub fn pwritev(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off_t) -> ::ssize_t; + pub fn preadv(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off_t) -> ::ssize_t; + pub fn quotactl(cmd: ::c_int, + special: *const ::c_char, + id: ::c_int, + data: *mut ::c_char) -> ::c_int; + pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t; + pub fn mq_close(mqd: ::mqd_t) -> ::c_int; + pub fn mq_unlink(name: *const ::c_char) -> ::c_int; + pub fn mq_receive(mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msq_prio: *mut ::c_uint) -> ::ssize_t; + pub fn mq_send(mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msq_prio: ::c_uint) -> ::c_int; + pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int; + pub fn mq_setattr(mqd: ::mqd_t, + newattr: *const ::mq_attr, + oldattr: *mut ::mq_attr) -> ::c_int; + pub fn epoll_pwait(epfd: ::c_int, + events: *mut ::epoll_event, + maxevents: ::c_int, + timeout: ::c_int, + sigmask: *const ::sigset_t) -> ::c_int; + pub fn dup3(oldfd: ::c_int, newfd: ::c_int, flags: ::c_int) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; + pub fn mkostemps(template: *mut ::c_char, + suffixlen: ::c_int, + flags: ::c_int) -> ::c_int; + pub fn sigtimedwait(set: *const sigset_t, + info: *mut siginfo_t, + timeout: *const ::timespec) -> ::c_int; + pub fn sigwaitinfo(set: *const sigset_t, + info: *mut siginfo_t) -> ::c_int; + pub fn openpty(amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *const termios, + winp: *const ::winsize) -> ::c_int; + pub fn forkpty(amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *const termios, + winp: *const ::winsize) -> ::pid_t; + pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; + pub fn getnameinfo(sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int) -> ::c_int; + pub fn prlimit(pid: ::pid_t, resource: ::c_int, new_limit: *const ::rlimit, + old_limit: *mut ::rlimit) -> ::c_int; + pub fn prlimit64(pid: ::pid_t, + resource: ::c_int, + new_limit: *const ::rlimit64, + old_limit: *mut ::rlimit64) -> ::c_int; + pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; + pub fn process_vm_readv(pid: ::pid_t, + local_iov: *const ::iovec, + liovcnt: ::c_ulong, + remote_iov: *const ::iovec, + riovcnt: ::c_ulong, + flags: ::c_ulong) -> isize; + pub fn process_vm_writev(pid: ::pid_t, + local_iov: *const ::iovec, + liovcnt: ::c_ulong, + remote_iov: *const ::iovec, + riovcnt: ::c_ulong, + flags: ::c_ulong) -> isize; + pub fn reboot(how_to: ::c_int) -> ::c_int; + pub fn setfsgid(gid: ::gid_t) -> ::c_int; + pub fn setfsuid(uid: ::uid_t) -> ::c_int; + pub fn setresgid(rgid: ::gid_t, egid: ::gid_t, sgid: ::gid_t) -> ::c_int; + pub fn setresuid(ruid: ::uid_t, euid: ::uid_t, suid: ::uid_t) -> ::c_int; + + // Not available now on Android + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t) -> ::c_int; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); + pub fn sync_file_range(fd: ::c_int, offset: ::off64_t, + nbytes: ::off64_t, flags: ::c_uint) -> ::c_int; + pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; + pub fn freeifaddrs(ifa: *mut ::ifaddrs); + + pub fn mremap(addr: *mut ::c_void, + len: ::size_t, + new_len: ::size_t, + flags: ::c_int, + ...) -> *mut ::c_void; + + pub fn glob(pattern: *const c_char, + flags: ::c_int, + errfunc: Option ::c_int>, + pglob: *mut ::glob_t) -> ::c_int; + pub fn globfree(pglob: *mut ::glob_t); + + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) + -> ::c_int; + + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) + -> ::c_int; + + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + + pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, + flags: ::c_int, addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t) -> ::ssize_t; + pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; + pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + + pub fn bind(socket: ::c_int, address: *const ::sockaddr, + address_len: ::socklen_t) -> ::c_int; + + pub fn writev(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::ssize_t; + + pub fn sendmsg(fd: ::c_int, + msg: *const ::msghdr, + flags: ::c_int) -> ::ssize_t; + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) + -> ::ssize_t; +} + +cfg_if! { + if #[cfg(any(target_env = "musl", + target_os = "fuchsia", + target_os = "emscripten"))] { + mod musl; + pub use self::musl::*; + } else if #[cfg(any(target_arch = "mips", + target_arch = "mips64"))] { + mod mips; + pub use self::mips::*; + } else if #[cfg(any(target_arch = "s390x"))] { + mod s390x; + pub use self::s390x::*; + } else { + mod other; + pub use self::other::*; + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/arm.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/arm.rs new file mode 100644 index 000000000..ce198aca9 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/arm.rs @@ -0,0 +1,346 @@ +pub type c_char = u8; +pub type wchar_t = u32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_int, + pub shm_dtime: ::time_t, + __unused2: ::c_int, + pub shm_ctime: ::time_t, + __unused3: ::c_int, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __unused1: ::c_int, + pub msg_rtime: ::time_t, + __unused2: ::c_int, + pub msg_ctime: ::time_t, + __unused3: ::c_int, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } +} + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_ASYNC: ::c_int = 0x2000; + +pub const FIOCLEX: ::c_int = 0x5451; +pub const FIONBIO: ::c_int = 0x5421; + +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_AS: ::c_int = 9; +pub const RLIMIT_NPROC: ::c_int = 6; +pub const RLIMIT_MEMLOCK: ::c_int = 8; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; + +pub const SOCK_NONBLOCK: ::c_int = 2048; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SOL_SOCKET: ::c_int = 1; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PASSCRED: ::c_int = 16; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const F_GETLK: ::c_int = 12; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 13; +pub const F_SETLKW: ::c_int = 14; +pub const F_SETOWN: ::c_int = 8; + +pub const VEOF: usize = 4; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const TCGETS: ::c_int = 0x5401; +pub const TCSETS: ::c_int = 0x5402; +pub const TCSETSW: ::c_int = 0x5403; +pub const TCSETSF: ::c_int = 0x5404; +pub const TCGETA: ::c_int = 0x5405; +pub const TCSETA: ::c_int = 0x5406; +pub const TCSETAW: ::c_int = 0x5407; +pub const TCSETAF: ::c_int = 0x5408; +pub const TCSBRK: ::c_int = 0x5409; +pub const TCXONC: ::c_int = 0x540A; +pub const TCFLSH: ::c_int = 0x540B; +pub const TIOCGSOFTCAR: ::c_int = 0x5419; +pub const TIOCSSOFTCAR: ::c_int = 0x541A; +pub const TIOCLINUX: ::c_int = 0x541C; +pub const TIOCGSERIAL: ::c_int = 0x541E; +pub const TIOCEXCL: ::c_int = 0x540C; +pub const TIOCNXCL: ::c_int = 0x540D; +pub const TIOCSCTTY: ::c_int = 0x540E; +pub const TIOCGPGRP: ::c_int = 0x540F; +pub const TIOCSPGRP: ::c_int = 0x5410; +pub const TIOCOUTQ: ::c_int = 0x5411; +pub const TIOCSTI: ::c_int = 0x5412; +pub const TIOCGWINSZ: ::c_int = 0x5413; +pub const TIOCSWINSZ: ::c_int = 0x5414; +pub const TIOCMGET: ::c_int = 0x5415; +pub const TIOCMBIS: ::c_int = 0x5416; +pub const TIOCMBIC: ::c_int = 0x5417; +pub const TIOCMSET: ::c_int = 0x5418; +pub const FIONREAD: ::c_int = 0x541B; +pub const TIOCCONS: ::c_int = 0x541D; + +pub const SYS_gettid: ::c_long = 224; +pub const SYS_perf_event_open: ::c_long = 364; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/asmjs.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/asmjs.rs new file mode 100644 index 000000000..e890a3458 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/asmjs.rs @@ -0,0 +1,336 @@ +pub type c_char = u8; +pub type wchar_t = u32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_int, + pub shm_dtime: ::time_t, + __unused2: ::c_int, + pub shm_ctime: ::time_t, + __unused3: ::c_int, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __unused1: ::c_int, + pub msg_rtime: ::time_t, + __unused2: ::c_int, + pub msg_ctime: ::time_t, + __unused3: ::c_int, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } +} + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_ASYNC: ::c_int = 0x2000; + +pub const FIOCLEX: ::c_int = 0x5451; +pub const FIONBIO: ::c_int = 0x5421; + +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_AS: ::c_int = 9; +pub const RLIMIT_NPROC: ::c_int = 6; +pub const RLIMIT_MEMLOCK: ::c_int = 8; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; + +pub const SOCK_NONBLOCK: ::c_int = 2048; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SOL_SOCKET: ::c_int = 1; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_LINGER: ::c_int = 13; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_ACCEPTCONN: ::c_int = 30; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const F_GETLK: ::c_int = 12; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 13; +pub const F_SETLKW: ::c_int = 14; +pub const F_SETOWN: ::c_int = 8; + +pub const VEOF: usize = 4; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const TCGETS: ::c_int = 0x5401; +pub const TCSETS: ::c_int = 0x5402; +pub const TCSETSW: ::c_int = 0x5403; +pub const TCSETSF: ::c_int = 0x5404; +pub const TCGETA: ::c_int = 0x5405; +pub const TCSETA: ::c_int = 0x5406; +pub const TCSETAW: ::c_int = 0x5407; +pub const TCSETAF: ::c_int = 0x5408; +pub const TCSBRK: ::c_int = 0x5409; +pub const TCXONC: ::c_int = 0x540A; +pub const TCFLSH: ::c_int = 0x540B; +pub const TIOCGSOFTCAR: ::c_int = 0x5419; +pub const TIOCSSOFTCAR: ::c_int = 0x541A; +pub const TIOCLINUX: ::c_int = 0x541C; +pub const TIOCGSERIAL: ::c_int = 0x541E; +pub const TIOCEXCL: ::c_int = 0x540C; +pub const TIOCNXCL: ::c_int = 0x540D; +pub const TIOCSCTTY: ::c_int = 0x540E; +pub const TIOCGPGRP: ::c_int = 0x540F; +pub const TIOCSPGRP: ::c_int = 0x5410; +pub const TIOCOUTQ: ::c_int = 0x5411; +pub const TIOCSTI: ::c_int = 0x5412; +pub const TIOCGWINSZ: ::c_int = 0x5413; +pub const TIOCSWINSZ: ::c_int = 0x5414; +pub const TIOCMGET: ::c_int = 0x5415; +pub const TIOCMBIS: ::c_int = 0x5416; +pub const TIOCMBIC: ::c_int = 0x5417; +pub const TIOCMSET: ::c_int = 0x5418; +pub const FIONREAD: ::c_int = 0x541B; +pub const TIOCCONS: ::c_int = 0x541D; + +pub const SYS_gettid: ::c_long = 224; // Valid for arm (32-bit) and x86 (32-bit) + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mips.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mips.rs new file mode 100644 index 000000000..23c1a267e --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mips.rs @@ -0,0 +1,354 @@ +pub type c_char = i8; +pub type wchar_t = ::c_int; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + __st_padding1: [::c_long; 2], + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_padding2: [::c_long; 2], + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + __st_padding3: ::c_long, + pub st_blocks: ::blkcnt_t, + __st_padding4: [::c_long; 14], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __st_padding1: [::c_long; 2], + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_padding2: [::c_long; 2], + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + __st_padding3: ::c_long, + pub st_blocks: ::blkcnt64_t, + __st_padding4: [::c_long; 14], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + #[cfg(target_endian = "big")] + __unused1: ::c_int, + pub msg_stime: ::time_t, + #[cfg(target_endian = "little")] + __unused1: ::c_int, + #[cfg(target_endian = "big")] + __unused2: ::c_int, + pub msg_rtime: ::time_t, + #[cfg(target_endian = "little")] + __unused2: ::c_int, + #[cfg(target_endian = "big")] + __unused3: ::c_int, + pub msg_ctime: ::time_t, + #[cfg(target_endian = "little")] + __unused3: ::c_int, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 5], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } +} + +pub const O_DIRECT: ::c_int = 0o100000; +pub const O_DIRECTORY: ::c_int = 0o200000; +pub const O_NOFOLLOW: ::c_int = 0o400000; +pub const O_ASYNC: ::c_int = 0o10000; + +pub const FIOCLEX: ::c_int = 0x6601; +pub const FIONBIO: ::c_int = 0x667E; + +pub const RLIMIT_RSS: ::c_int = 7; +pub const RLIMIT_NOFILE: ::c_int = 5; +pub const RLIMIT_AS: ::c_int = 6; +pub const RLIMIT_NPROC: ::c_int = 8; +pub const RLIMIT_MEMLOCK: ::c_int = 9; + +pub const O_APPEND: ::c_int = 0o010; +pub const O_CREAT: ::c_int = 0o400; +pub const O_EXCL: ::c_int = 0o2000; +pub const O_NOCTTY: ::c_int = 0o4000; +pub const O_NONBLOCK: ::c_int = 0o200; +pub const O_SYNC: ::c_int = 0o40020; +pub const O_RSYNC: ::c_int = 0o40020; +pub const O_DSYNC: ::c_int = 0o020; + +pub const SOCK_NONBLOCK: ::c_int = 0o200; + +pub const MAP_ANON: ::c_int = 0x800; +pub const MAP_GROWSDOWN: ::c_int = 0x1000; +pub const MAP_DENYWRITE: ::c_int = 0x2000; +pub const MAP_EXECUTABLE: ::c_int = 0x4000; +pub const MAP_LOCKED: ::c_int = 0x8000; +pub const MAP_NORESERVE: ::c_int = 0x0400; +pub const MAP_POPULATE: ::c_int = 0x10000; +pub const MAP_NONBLOCK: ::c_int = 0x20000; +pub const MAP_STACK: ::c_int = 0x40000; + +pub const EDEADLK: ::c_int = 45; +pub const ENAMETOOLONG: ::c_int = 78; +pub const ENOLCK: ::c_int = 46; +pub const ENOSYS: ::c_int = 89; +pub const ENOTEMPTY: ::c_int = 93; +pub const ELOOP: ::c_int = 90; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const ECHRNG: ::c_int = 37; +pub const EL2NSYNC: ::c_int = 38; +pub const EL3HLT: ::c_int = 39; +pub const EL3RST: ::c_int = 40; +pub const ELNRNG: ::c_int = 41; +pub const EUNATCH: ::c_int = 42; +pub const ENOCSI: ::c_int = 43; +pub const EL2HLT: ::c_int = 44; +pub const EBADE: ::c_int = 50; +pub const EBADR: ::c_int = 51; +pub const EXFULL: ::c_int = 52; +pub const ENOANO: ::c_int = 53; +pub const EBADRQC: ::c_int = 54; +pub const EBADSLT: ::c_int = 55; +pub const EDEADLOCK: ::c_int = 56; +pub const EMULTIHOP: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 79; +pub const ENOTUNIQ: ::c_int = 80; +pub const EBADFD: ::c_int = 81; +pub const EBADMSG: ::c_int = 77; +pub const EREMCHG: ::c_int = 82; +pub const ELIBACC: ::c_int = 83; +pub const ELIBBAD: ::c_int = 84; +pub const ELIBSCN: ::c_int = 85; +pub const ELIBMAX: ::c_int = 86; +pub const ELIBEXEC: ::c_int = 87; +pub const EILSEQ: ::c_int = 88; +pub const ERESTART: ::c_int = 91; +pub const ESTRPIPE: ::c_int = 92; +pub const EUSERS: ::c_int = 94; +pub const ENOTSOCK: ::c_int = 95; +pub const EDESTADDRREQ: ::c_int = 96; +pub const EMSGSIZE: ::c_int = 97; +pub const EPROTOTYPE: ::c_int = 98; +pub const ENOPROTOOPT: ::c_int = 99; +pub const EPROTONOSUPPORT: ::c_int = 120; +pub const ESOCKTNOSUPPORT: ::c_int = 121; +pub const EOPNOTSUPP: ::c_int = 122; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 123; +pub const EAFNOSUPPORT: ::c_int = 124; +pub const EADDRINUSE: ::c_int = 125; +pub const EADDRNOTAVAIL: ::c_int = 126; +pub const ENETDOWN: ::c_int = 127; +pub const ENETUNREACH: ::c_int = 128; +pub const ENETRESET: ::c_int = 129; +pub const ECONNABORTED: ::c_int = 130; +pub const ECONNRESET: ::c_int = 131; +pub const ENOBUFS: ::c_int = 132; +pub const EISCONN: ::c_int = 133; +pub const ENOTCONN: ::c_int = 134; +pub const ESHUTDOWN: ::c_int = 143; +pub const ETOOMANYREFS: ::c_int = 144; +pub const ETIMEDOUT: ::c_int = 145; +pub const ECONNREFUSED: ::c_int = 146; +pub const EHOSTDOWN: ::c_int = 147; +pub const EHOSTUNREACH: ::c_int = 148; +pub const EALREADY: ::c_int = 149; +pub const EINPROGRESS: ::c_int = 150; +pub const ESTALE: ::c_int = 151; +pub const EUCLEAN: ::c_int = 135; +pub const ENOTNAM: ::c_int = 137; +pub const ENAVAIL: ::c_int = 138; +pub const EISNAM: ::c_int = 139; +pub const EREMOTEIO: ::c_int = 140; +pub const EDQUOT: ::c_int = 1133; +pub const ENOMEDIUM: ::c_int = 159; +pub const EMEDIUMTYPE: ::c_int = 160; +pub const ECANCELED: ::c_int = 158; +pub const ENOKEY: ::c_int = 161; +pub const EKEYEXPIRED: ::c_int = 162; +pub const EKEYREVOKED: ::c_int = 163; +pub const EKEYREJECTED: ::c_int = 164; +pub const EOWNERDEAD: ::c_int = 165; +pub const ENOTRECOVERABLE: ::c_int = 166; +pub const EHWPOISON: ::c_int = 168; +pub const ERFKILL: ::c_int = 167; + +pub const SOCK_STREAM: ::c_int = 2; +pub const SOCK_DGRAM: ::c_int = 1; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SOL_SOCKET: ::c_int = 65535; + +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_ACCEPTCONN: ::c_int = 0x1009; +pub const SO_PROTOCOL: ::c_int = 0x1028; +pub const SO_DOMAIN: ::c_int = 0x1029; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_PASSCRED: ::c_int = 17; +pub const SO_PEERCRED: ::c_int = 18; +pub const SO_SNDBUFFORCE: ::c_int = 31; +pub const SO_RCVBUFFORCE: ::c_int = 33; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 8; +pub const SA_NOCLDWAIT: ::c_int = 0x10000; + +pub const SIGCHLD: ::c_int = 18; +pub const SIGBUS: ::c_int = 10; +pub const SIGTTIN: ::c_int = 26; +pub const SIGTTOU: ::c_int = 27; +pub const SIGXCPU: ::c_int = 30; +pub const SIGXFSZ: ::c_int = 31; +pub const SIGVTALRM: ::c_int = 28; +pub const SIGPROF: ::c_int = 29; +pub const SIGWINCH: ::c_int = 20; +pub const SIGUSR1: ::c_int = 16; +pub const SIGUSR2: ::c_int = 17; +pub const SIGCONT: ::c_int = 25; +pub const SIGSTOP: ::c_int = 23; +pub const SIGTSTP: ::c_int = 24; +pub const SIGURG: ::c_int = 21; +pub const SIGIO: ::c_int = 22; +pub const SIGSYS: ::c_int = 12; +pub const SIGSTKFLT: ::c_int = 7; +pub const SIGPOLL: ::c_int = ::SIGIO; +pub const SIGPWR: ::c_int = 19; +pub const SIG_SETMASK: ::c_int = 3; +pub const SIG_BLOCK: ::c_int = 1; +pub const SIG_UNBLOCK: ::c_int = 2; + +pub const EXTPROC: ::tcflag_t = 0o200000; + +pub const MAP_HUGETLB: ::c_int = 0x80000; + +pub const F_GETLK: ::c_int = 33; +pub const F_GETOWN: ::c_int = 23; +pub const F_SETLK: ::c_int = 34; +pub const F_SETLKW: ::c_int = 35; +pub const F_SETOWN: ::c_int = 24; + +pub const VEOF: usize = 16; +pub const VEOL: usize = 17; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const IEXTEN: ::tcflag_t = 0o000400; +pub const TOSTOP: ::tcflag_t = 0o100000; +pub const FLUSHO: ::tcflag_t = 0o020000; + +pub const TCGETS: ::c_int = 0x540D; +pub const TCSETS: ::c_int = 0x540E; +pub const TCSETSW: ::c_int = 0x540F; +pub const TCSETSF: ::c_int = 0x5410; +pub const TCGETA: ::c_int = 0x5401; +pub const TCSETA: ::c_int = 0x5402; +pub const TCSETAW: ::c_int = 0x5403; +pub const TCSETAF: ::c_int = 0x5404; +pub const TCSBRK: ::c_int = 0x5405; +pub const TCXONC: ::c_int = 0x5406; +pub const TCFLSH: ::c_int = 0x5407; +pub const TIOCGSOFTCAR: ::c_int = 0x5481; +pub const TIOCSSOFTCAR: ::c_int = 0x5482; +pub const TIOCLINUX: ::c_int = 0x5483; +pub const TIOCGSERIAL: ::c_int = 0x5484; +pub const TIOCEXCL: ::c_int = 0x740D; +pub const TIOCNXCL: ::c_int = 0x740E; +pub const TIOCSCTTY: ::c_int = 0x5480; +pub const TIOCGPGRP: ::c_int = 0x40047477; +pub const TIOCSPGRP: ::c_int = 0x80047476; +pub const TIOCOUTQ: ::c_int = 0x7472; +pub const TIOCSTI: ::c_int = 0x5472; +pub const TIOCGWINSZ: ::c_int = 0x40087468; +pub const TIOCSWINSZ: ::c_int = 0x80087467; +pub const TIOCMGET: ::c_int = 0x741D; +pub const TIOCMBIS: ::c_int = 0x741B; +pub const TIOCMBIC: ::c_int = 0x741C; +pub const TIOCMSET: ::c_int = 0x741A; +pub const FIONREAD: ::c_int = 0x467F; +pub const TIOCCONS: ::c_int = 0x80047478; + +pub const SYS_gettid: ::c_long = 4222; // Valid for O32 +pub const SYS_perf_event_open: ::c_long = 4333; // Valid for O32 + +pub const POLLWRNORM: ::c_short = 0x4; +pub const POLLWRBAND: ::c_short = 0x100; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mod.rs new file mode 100644 index 000000000..61eb6dba1 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mod.rs @@ -0,0 +1,56 @@ +pub type c_long = i32; +pub type c_ulong = u32; +pub type nlink_t = u32; + +s! { + pub struct pthread_attr_t { + __size: [u32; 9] + } + + pub struct sigset_t { + __val: [::c_ulong; 32], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct sem_t { + __val: [::c_int; 4], + } +} + +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24; + +cfg_if! { + if #[cfg(any(target_arch = "x86"))] { + mod x86; + pub use self::x86::*; + } else if #[cfg(any(target_arch = "mips"))] { + mod mips; + pub use self::mips::*; + } else if #[cfg(any(target_arch = "arm"))] { + mod arm; + pub use self::arm::*; + } else if #[cfg(any(target_arch = "asmjs", target_arch = "wasm32"))] { + // For the time being asmjs and wasm32 are the same, and both + // backed by identical emscripten runtimes + mod asmjs; + pub use self::asmjs::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/x86.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/x86.rs new file mode 100644 index 000000000..9daeb58b9 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/x86.rs @@ -0,0 +1,360 @@ +pub type c_char = i8; +pub type wchar_t = i32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_int, + pub shm_dtime: ::time_t, + __unused2: ::c_int, + pub shm_ctime: ::time_t, + __unused3: ::c_int, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __unused1: ::c_int, + pub msg_rtime: ::time_t, + __unused2: ::c_int, + pub msg_ctime: ::time_t, + __unused3: ::c_int, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct mcontext_t { + __private: [u32; 22] + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + __private: [u8; 112], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } +} + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_ASYNC: ::c_int = 0x2000; + +pub const FIOCLEX: ::c_int = 0x5451; +pub const FIONBIO: ::c_int = 0x5421; + +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_AS: ::c_int = 9; +pub const RLIMIT_NPROC: ::c_int = 6; +pub const RLIMIT_MEMLOCK: ::c_int = 8; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; + +pub const SOCK_NONBLOCK: ::c_int = 2048; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SOL_SOCKET: ::c_int = 1; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PASSCRED: ::c_int = 16; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_32BIT: ::c_int = 0x0040; + +pub const F_GETLK: ::c_int = 12; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 13; +pub const F_SETLKW: ::c_int = 14; +pub const F_SETOWN: ::c_int = 8; + +pub const VEOF: usize = 4; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const TCGETS: ::c_int = 0x5401; +pub const TCSETS: ::c_int = 0x5402; +pub const TCSETSW: ::c_int = 0x5403; +pub const TCSETSF: ::c_int = 0x5404; +pub const TCGETA: ::c_int = 0x5405; +pub const TCSETA: ::c_int = 0x5406; +pub const TCSETAW: ::c_int = 0x5407; +pub const TCSETAF: ::c_int = 0x5408; +pub const TCSBRK: ::c_int = 0x5409; +pub const TCXONC: ::c_int = 0x540A; +pub const TCFLSH: ::c_int = 0x540B; +pub const TIOCGSOFTCAR: ::c_int = 0x5419; +pub const TIOCSSOFTCAR: ::c_int = 0x541A; +pub const TIOCLINUX: ::c_int = 0x541C; +pub const TIOCGSERIAL: ::c_int = 0x541E; +pub const TIOCEXCL: ::c_int = 0x540C; +pub const TIOCNXCL: ::c_int = 0x540D; +pub const TIOCSCTTY: ::c_int = 0x540E; +pub const TIOCGPGRP: ::c_int = 0x540F; +pub const TIOCSPGRP: ::c_int = 0x5410; +pub const TIOCOUTQ: ::c_int = 0x5411; +pub const TIOCSTI: ::c_int = 0x5412; +pub const TIOCGWINSZ: ::c_int = 0x5413; +pub const TIOCSWINSZ: ::c_int = 0x5414; +pub const TIOCMGET: ::c_int = 0x5415; +pub const TIOCMBIS: ::c_int = 0x5416; +pub const TIOCMBIC: ::c_int = 0x5417; +pub const TIOCMSET: ::c_int = 0x5418; +pub const FIONREAD: ::c_int = 0x541B; +pub const TIOCCONS: ::c_int = 0x541D; + +pub const SYS_gettid: ::c_long = 224; +pub const SYS_perf_event_open: ::c_long = 336; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/aarch64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/aarch64.rs new file mode 100644 index 000000000..23f7dd35e --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/aarch64.rs @@ -0,0 +1,3 @@ +pub type c_char = u8; + +pub const SYS_perf_event_open: ::c_long = 241; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/mod.rs new file mode 100644 index 000000000..fab0b58fe --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/mod.rs @@ -0,0 +1,387 @@ +pub type wchar_t = i32; +pub type c_long = i64; +pub type c_ulong = u64; +pub type nlink_t = u64; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __reserved: [::c_long; 3], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct pthread_attr_t { + __size: [u64; 7] + } + + pub struct sigset_t { + __val: [::c_ulong; 16], + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + __pad1: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + __pad2: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub __pad1: ::c_int, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct sem_t { + __val: [::c_int; 8], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } +} + +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_ASYNC: ::c_int = 0x2000; + +pub const FIOCLEX: ::c_int = 0x5451; +pub const FIONBIO: ::c_int = 0x5421; + +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_AS: ::c_int = 9; +pub const RLIMIT_NPROC: ::c_int = 6; +pub const RLIMIT_MEMLOCK: ::c_int = 8; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; + +pub const SOCK_NONBLOCK: ::c_int = 2048; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_32BIT: ::c_int = 0x0040; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SOL_SOCKET: ::c_int = 1; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PASSCRED: ::c_int = 16; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_SETOWN: ::c_int = 8; + +pub const VEOF: usize = 4; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const TCGETS: ::c_int = 0x5401; +pub const TCSETS: ::c_int = 0x5402; +pub const TCSETSW: ::c_int = 0x5403; +pub const TCSETSF: ::c_int = 0x5404; +pub const TCGETA: ::c_int = 0x5405; +pub const TCSETA: ::c_int = 0x5406; +pub const TCSETAW: ::c_int = 0x5407; +pub const TCSETAF: ::c_int = 0x5408; +pub const TCSBRK: ::c_int = 0x5409; +pub const TCXONC: ::c_int = 0x540A; +pub const TCFLSH: ::c_int = 0x540B; +pub const TIOCGSOFTCAR: ::c_int = 0x5419; +pub const TIOCSSOFTCAR: ::c_int = 0x541A; +pub const TIOCLINUX: ::c_int = 0x541C; +pub const TIOCGSERIAL: ::c_int = 0x541E; +pub const TIOCEXCL: ::c_int = 0x540C; +pub const TIOCNXCL: ::c_int = 0x540D; +pub const TIOCSCTTY: ::c_int = 0x540E; +pub const TIOCGPGRP: ::c_int = 0x540F; +pub const TIOCSPGRP: ::c_int = 0x5410; +pub const TIOCOUTQ: ::c_int = 0x5411; +pub const TIOCSTI: ::c_int = 0x5412; +pub const TIOCGWINSZ: ::c_int = 0x5413; +pub const TIOCSWINSZ: ::c_int = 0x5414; +pub const TIOCMGET: ::c_int = 0x5415; +pub const TIOCMBIS: ::c_int = 0x5416; +pub const TIOCMBIC: ::c_int = 0x5417; +pub const TIOCMSET: ::c_int = 0x5418; +pub const FIONREAD: ::c_int = 0x541B; +pub const TIOCCONS: ::c_int = 0x541D; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(any(target_arch = "powerpc64"))] { + mod powerpc64; + pub use self::powerpc64::*; + } else if #[cfg(any(target_arch = "x86_64"))] { + mod x86_64; + pub use self::x86_64::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/powerpc64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/powerpc64.rs new file mode 100644 index 000000000..4b8ca10aa --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/powerpc64.rs @@ -0,0 +1,3 @@ +pub type c_char = u8; + +pub const SYS_perf_event_open: ::c_long = 319; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/x86_64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/x86_64.rs new file mode 100644 index 000000000..2cfd903ca --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/x86_64.rs @@ -0,0 +1,20 @@ +pub type c_char = i8; + +s! { + pub struct mcontext_t { + __private: [u64; 32], + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + __private: [u8; 512], + } +} + +pub const SYS_gettid: ::c_long = 186; + +pub const SYS_perf_event_open: ::c_long = 298; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/mod.rs new file mode 100644 index 000000000..a0d947bc4 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/mod.rs @@ -0,0 +1,337 @@ +pub type clock_t = c_long; +pub type time_t = c_long; +pub type suseconds_t = c_long; +pub type ino_t = u64; +pub type off_t = i64; +pub type blkcnt_t = i64; + +pub type blksize_t = c_long; +pub type fsblkcnt_t = ::c_ulonglong; +pub type fsfilcnt_t = ::c_ulonglong; +pub type rlim_t = ::c_ulonglong; + +s! { + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: ::sigevent, + __td: *mut ::c_void, + __lock: [::c_int; 2], + __err: ::c_int, + __ret: ::ssize_t, + pub aio_offset: off_t, + __next: *mut ::c_void, + __prev: *mut ::c_void, + #[cfg(target_pointer_width = "32")] + __dummy4: [::c_char; 24], + #[cfg(target_pointer_width = "64")] + __dummy4: [::c_char; 16], + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + _restorer: *mut ::c_void, + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __unused1: ::c_long, + __unused2: ::c_long + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + pub __c_ispeed: ::speed_t, + pub __c_ospeed: ::speed_t, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct sysinfo { + pub uptime: ::c_ulong, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub __reserved: [::c_char; 256], + } +} + +pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const BUFSIZ: ::c_uint = 1024; +pub const TMP_MAX: ::c_uint = 10000; +pub const FOPEN_MAX: ::c_uint = 1000; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_EXEC: ::c_int = 0o10000000; +pub const O_SEARCH: ::c_int = 0o10000000; +pub const O_ACCMODE: ::c_int = 0o10000003; +pub const O_NDELAY: ::c_int = O_NONBLOCK; +pub const NI_MAXHOST: ::socklen_t = 255; +pub const PTHREAD_STACK_MIN: ::size_t = 2048; +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const POSIX_MADV_DONTNEED: ::c_int = 4; + +pub const RLIM_INFINITY: ::rlim_t = !0; +pub const RLIMIT_RTTIME: ::c_int = 15; +pub const RLIMIT_NLIMITS: ::c_int = 16; + +pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; + +pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15; +pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16; +pub const TCP_THIN_DUPACK: ::c_int = 17; +pub const TCP_USER_TIMEOUT: ::c_int = 18; +pub const TCP_REPAIR: ::c_int = 19; +pub const TCP_REPAIR_QUEUE: ::c_int = 20; +pub const TCP_QUEUE_SEQ: ::c_int = 21; +pub const TCP_REPAIR_OPTIONS: ::c_int = 22; +pub const TCP_FASTOPEN: ::c_int = 23; +pub const TCP_TIMESTAMP: ::c_int = 24; + +pub const SIGUNUSED: ::c_int = ::SIGSYS; + +pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01; +pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; + +pub const CPU_SETSIZE: ::c_int = 128; + +pub const QFMT_VFS_V1: ::c_int = 4; + +pub const PTRACE_TRACEME: ::c_int = 0; +pub const PTRACE_PEEKTEXT: ::c_int = 1; +pub const PTRACE_PEEKDATA: ::c_int = 2; +pub const PTRACE_PEEKUSER: ::c_int = 3; +pub const PTRACE_POKETEXT: ::c_int = 4; +pub const PTRACE_POKEDATA: ::c_int = 5; +pub const PTRACE_POKEUSER: ::c_int = 6; +pub const PTRACE_CONT: ::c_int = 7; +pub const PTRACE_KILL: ::c_int = 8; +pub const PTRACE_SINGLESTEP: ::c_int = 9; +pub const PTRACE_ATTACH: ::c_int = 16; +pub const PTRACE_DETACH: ::c_int = 17; +pub const PTRACE_SYSCALL: ::c_int = 24; +pub const PTRACE_SETOPTIONS: ::c_int = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_int = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_int = 0x4203; +pub const PTRACE_GETREGSET: ::c_int = 0x4204; +pub const PTRACE_SETREGSET: ::c_int = 0x4205; +pub const PTRACE_SEIZE: ::c_int = 0x4206; +pub const PTRACE_INTERRUPT: ::c_int = 0x4207; +pub const PTRACE_LISTEN: ::c_int = 0x4208; +pub const PTRACE_PEEKSIGINFO: ::c_int = 0x4209; + +pub const PTRACE_O_EXITKILL: ::c_int = 1048576; +pub const PTRACE_O_TRACECLONE: ::c_int = 8; +pub const PTRACE_O_TRACEEXEC: ::c_int = 16; +pub const PTRACE_O_TRACEEXIT: ::c_int = 64; +pub const PTRACE_O_TRACEFORK: ::c_int = 2; +pub const PTRACE_O_TRACESYSGOOD: ::c_int = 1; +pub const PTRACE_O_TRACEVFORK: ::c_int = 4; +pub const PTRACE_O_TRACEVFORKDONE: ::c_int = 32; +pub const PTRACE_O_SUSPEND_SECCOMP: ::c_int = 2097152; + +pub const MADV_DODUMP: ::c_int = 17; +pub const MADV_DONTDUMP: ::c_int = 16; + +pub const EPOLLWAKEUP: ::c_int = 0x20000000; + +pub const POLLRDNORM: ::c_short = 0x040; +pub const POLLRDBAND: ::c_short = 0x080; + +pub const MADV_HUGEPAGE: ::c_int = 14; +pub const MADV_NOHUGEPAGE: ::c_int = 15; + +pub const PTRACE_GETFPREGS: ::c_uint = 14; +pub const PTRACE_SETFPREGS: ::c_uint = 15; +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; +pub const PTRACE_GETREGS: ::c_uint = 12; +pub const PTRACE_SETREGS: ::c_uint = 13; + +pub const EFD_NONBLOCK: ::c_int = ::O_NONBLOCK; + +pub const SFD_NONBLOCK: ::c_int = ::O_NONBLOCK; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const TIOCINQ: ::c_int = ::FIONREAD; + +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; + +// TODO(#247) Temporarily musl-specific (available since musl 0.9.12 / Linux +// kernel 3.10). See also notbsd/mod.rs +pub const CLOCK_SGI_CYCLE: ::clockid_t = 10; +pub const CLOCK_TAI: ::clockid_t = 11; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +extern { + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + pub fn ptrace(request: ::c_int, ...) -> ::c_long; + pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; +} + +cfg_if! { + if #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] { + mod b64; + pub use self::b64::*; + } else if #[cfg(any(target_arch = "x86", + target_arch = "mips", + target_arch = "arm", + target_arch = "asmjs", + target_arch = "wasm32"))] { + mod b32; + pub use self::b32::*; + } else { } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/arm.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/arm.rs new file mode 100644 index 000000000..ee6d67403 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/arm.rs @@ -0,0 +1,203 @@ +pub type c_char = u8; +pub type wchar_t = u32; + +s! { + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __pad1: ::c_uint, + __st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_uint, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino64_t, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_ulong, + pub shm_dtime: ::time_t, + __unused2: ::c_ulong, + pub shm_ctime: ::time_t, + __unused3: ::c_ulong, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __glibc_reserved1: ::c_ulong, + pub msg_rtime: ::time_t, + __glibc_reserved2: ::c_ulong, + pub msg_ctime: ::time_t, + __glibc_reserved3: ::c_ulong, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } +} + +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; + +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; + +pub const EDEADLOCK: ::c_int = 35; + +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; + +pub const FIOCLEX: ::c_ulong = 0x5451; +pub const FIONBIO: ::c_ulong = 0x5421; + +pub const SYS_gettid: ::c_long = 224; +pub const SYS_perf_event_open: ::c_long = 364; + +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; +pub const EXTPROC: ::tcflag_t = 0x00010000; +pub const TCGETS: ::c_ulong = 0x5401; +pub const TCSETS: ::c_ulong = 0x5402; +pub const TCSETSW: ::c_ulong = 0x5403; +pub const TCSETSF: ::c_ulong = 0x5404; +pub const TCGETA: ::c_ulong = 0x5405; +pub const TCSETA: ::c_ulong = 0x5406; +pub const TCSETAW: ::c_ulong = 0x5407; +pub const TCSETAF: ::c_ulong = 0x5408; +pub const TCSBRK: ::c_ulong = 0x5409; +pub const TCXONC: ::c_ulong = 0x540A; +pub const TCFLSH: ::c_ulong = 0x540B; +pub const TIOCINQ: ::c_ulong = 0x541B; +pub const TIOCGPGRP: ::c_ulong = 0x540F; +pub const TIOCSPGRP: ::c_ulong = 0x5410; +pub const TIOCOUTQ: ::c_ulong = 0x5411; +pub const TIOCGWINSZ: ::c_ulong = 0x5413; +pub const TIOCSWINSZ: ::c_ulong = 0x5414; +pub const FIONREAD: ::c_ulong = 0x541B; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/mod.rs new file mode 100644 index 000000000..0f936c7e2 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/mod.rs @@ -0,0 +1,284 @@ +//! 32-bit specific definitions for linux-like values + +pub type c_long = i32; +pub type c_ulong = u32; +pub type clock_t = i32; +pub type time_t = i32; +pub type suseconds_t = i32; +pub type ino_t = u32; +pub type off_t = i32; +pub type blkcnt_t = i32; +pub type __fsword_t = i32; + +pub type blksize_t = i32; +pub type nlink_t = u32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + __pad1: ::c_short, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_short, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused4: ::c_long, + __unused5: ::c_long, + } + + pub struct pthread_attr_t { + __size: [u32; 9] + } + + pub struct sigset_t { + __val: [::c_ulong; 32], + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 8], + } +} + +pub const TIOCGSOFTCAR: ::c_ulong = 0x5419; +pub const TIOCSSOFTCAR: ::c_ulong = 0x541A; + +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_NPROC: ::c_int = 6; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; + +pub const MAP_GROWSDOWN: ::c_int = 0x0100; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SOL_SOCKET: ::c_int = 1; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_LINGER: ::c_int = 13; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_ACCEPTCONN: ::c_int = 30; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const PTRACE_DETACH: ::c_uint = 17; + +pub const EFD_NONBLOCK: ::c_int = 0x800; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; + +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const TIOCEXCL: ::c_ulong = 0x540C; +pub const TIOCNXCL: ::c_ulong = 0x540D; +pub const TIOCSCTTY: ::c_ulong = 0x540E; +pub const TIOCSTI: ::c_ulong = 0x5412; +pub const TIOCMGET: ::c_ulong = 0x5415; +pub const TIOCMBIS: ::c_ulong = 0x5416; +pub const TIOCMBIC: ::c_ulong = 0x5417; +pub const TIOCMSET: ::c_ulong = 0x5418; +pub const TIOCCONS: ::c_ulong = 0x541D; +pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; + +pub const PTRACE_GETFPREGS: ::c_uint = 14; +pub const PTRACE_SETFPREGS: ::c_uint = 15; +pub const PTRACE_GETREGS: ::c_uint = 12; +pub const PTRACE_SETREGS: ::c_uint = 13; + +cfg_if! { + if #[cfg(target_arch = "x86")] { + mod x86; + pub use self::x86::*; + } else if #[cfg(target_arch = "arm")] { + mod arm; + pub use self::arm::*; + } else if #[cfg(target_arch = "powerpc")] { + mod powerpc; + pub use self::powerpc::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/powerpc.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/powerpc.rs new file mode 100644 index 000000000..035bfe19c --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/powerpc.rs @@ -0,0 +1,207 @@ +pub type c_char = u8; +pub type wchar_t = i32; + +s! { + pub struct ipc_perm { + __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + __seq: ::uint32_t, + __pad1: ::uint32_t, + __glibc_reserved1: ::uint64_t, + __glibc_reserved2: ::uint64_t, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_ushort, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + __glibc_reserved1: ::c_uint, + pub shm_atime: ::time_t, + __glibc_reserved2: ::c_uint, + pub shm_dtime: ::time_t, + __glibc_reserved3: ::c_uint, + pub shm_ctime: ::time_t, + __glibc_reserved4: ::c_uint, + pub shm_segsz: ::size_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __glibc_reserved5: ::c_ulong, + __glibc_reserved6: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + __glibc_reserved1: ::c_uint, + pub msg_stime: ::time_t, + __glibc_reserved2: ::c_uint, + pub msg_rtime: ::time_t, + __glibc_reserved3: ::c_uint, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } +} + +pub const O_DIRECT: ::c_int = 0x20000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; + +pub const MAP_LOCKED: ::c_int = 0x00080; +pub const MAP_NORESERVE: ::c_int = 0x00040; + +pub const EDEADLOCK: ::c_int = 58; + +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_RCVLOWAT: ::c_int = 16; +pub const SO_SNDLOWAT: ::c_int = 17; +pub const SO_RCVTIMEO: ::c_int = 18; +pub const SO_SNDTIMEO: ::c_int = 19; +pub const SO_PASSCRED: ::c_int = 20; +pub const SO_PEERCRED: ::c_int = 21; + +pub const FIOCLEX: ::c_ulong = 0x20006601; +pub const FIONBIO: ::c_ulong = 0x8004667e; + +pub const SYS_gettid: ::c_long = 207; +pub const SYS_perf_event_open: ::c_long = 319; + +pub const MCL_CURRENT: ::c_int = 0x2000; +pub const MCL_FUTURE: ::c_int = 0x4000; + +pub const SIGSTKSZ: ::size_t = 0x4000; +pub const MINSIGSTKSZ: ::size_t = 4096; +pub const CBAUD: ::tcflag_t = 0xff; +pub const TAB1: ::c_int = 0x400; +pub const TAB2: ::c_int = 0x800; +pub const TAB3: ::c_int = 0xc00; +pub const CR1: ::c_int = 0x1000; +pub const CR2: ::c_int = 0x2000; +pub const CR3: ::c_int = 0x3000; +pub const FF1: ::c_int = 0x4000; +pub const BS1: ::c_int = 0x8000; +pub const VT1: ::c_int = 0x10000; +pub const VWERASE: usize = 0xa; +pub const VREPRINT: usize = 0xb; +pub const VSUSP: usize = 0xc; +pub const VSTART: usize = 0xd; +pub const VSTOP: usize = 0xe; +pub const VDISCARD: usize = 0x10; +pub const VTIME: usize = 0x7; +pub const IXON: ::tcflag_t = 0x200; +pub const IXOFF: ::tcflag_t = 0x400; +pub const ONLCR: ::tcflag_t = 0x2; +pub const CSIZE: ::tcflag_t = 0x300; +pub const CS6: ::tcflag_t = 0x100; +pub const CS7: ::tcflag_t = 0x200; +pub const CS8: ::tcflag_t = 0x300; +pub const CSTOPB: ::tcflag_t = 0x400; +pub const CREAD: ::tcflag_t = 0x800; +pub const PARENB: ::tcflag_t = 0x1000; +pub const PARODD: ::tcflag_t = 0x2000; +pub const HUPCL: ::tcflag_t = 0x4000; +pub const CLOCAL: ::tcflag_t = 0x8000; +pub const ECHOKE: ::tcflag_t = 0x1; +pub const ECHOE: ::tcflag_t = 0x2; +pub const ECHOK: ::tcflag_t = 0x4; +pub const ECHONL: ::tcflag_t = 0x10; +pub const ECHOPRT: ::tcflag_t = 0x20; +pub const ECHOCTL: ::tcflag_t = 0x40; +pub const ISIG: ::tcflag_t = 0x80; +pub const ICANON: ::tcflag_t = 0x100; +pub const PENDIN: ::tcflag_t = 0x20000000; +pub const NOFLSH: ::tcflag_t = 0x80000000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const CBAUDEX: ::speed_t = 0o000020; +pub const B57600: ::speed_t = 0o0020; +pub const B115200: ::speed_t = 0o0021; +pub const B230400: ::speed_t = 0o0022; +pub const B460800: ::speed_t = 0o0023; +pub const B500000: ::speed_t = 0o0024; +pub const B576000: ::speed_t = 0o0025; +pub const B921600: ::speed_t = 0o0026; +pub const B1000000: ::speed_t = 0o0027; +pub const B1152000: ::speed_t = 0o0030; +pub const B1500000: ::speed_t = 0o0031; +pub const B2000000: ::speed_t = 0o0032; +pub const B2500000: ::speed_t = 0o0033; +pub const B3000000: ::speed_t = 0o0034; +pub const B3500000: ::speed_t = 0o0035; +pub const B4000000: ::speed_t = 0o0036; + +pub const VEOL: usize = 6; +pub const VEOL2: usize = 8; +pub const VMIN: usize = 5; +pub const IEXTEN: ::tcflag_t = 0x400; +pub const TOSTOP: ::tcflag_t = 0x400000; +pub const FLUSHO: ::tcflag_t = 0x800000; +pub const EXTPROC: ::tcflag_t = 0x10000000; +pub const TCGETS: ::c_ulong = 0x403c7413; +pub const TCSETS: ::c_ulong = 0x803c7414; +pub const TCSETSW: ::c_ulong = 0x803c7415; +pub const TCSETSF: ::c_ulong = 0x803c7416; +pub const TCGETA: ::c_ulong = 0x40147417; +pub const TCSETA: ::c_ulong = 0x80147418; +pub const TCSETAW: ::c_ulong = 0x80147419; +pub const TCSETAF: ::c_ulong = 0x8014741c; +pub const TCSBRK: ::c_ulong = 0x2000741d; +pub const TCXONC: ::c_ulong = 0x2000741e; +pub const TCFLSH: ::c_ulong = 0x2000741f; +pub const TIOCINQ: ::c_ulong = 0x4004667f; +pub const TIOCGPGRP: ::c_ulong = 0x40047477; +pub const TIOCSPGRP: ::c_ulong = 0x80047476; +pub const TIOCOUTQ: ::c_ulong = 0x40047473; +pub const TIOCGWINSZ: ::c_ulong = 0x40087468; +pub const TIOCSWINSZ: ::c_ulong = 0x80087467; +pub const FIONREAD: ::c_ulong = 0x4004667f; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/x86.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/x86.rs new file mode 100644 index 000000000..263e1406b --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/x86.rs @@ -0,0 +1,254 @@ +pub type c_char = i8; +pub type wchar_t = i32; +pub type greg_t = i32; + +s! { + pub struct _libc_fpreg { + pub significand: [u16; 4], + pub exponent: u16, + } + + pub struct _libc_fpstate { + pub cw: ::c_ulong, + pub sw: ::c_ulong, + pub tag: ::c_ulong, + pub ipoff: ::c_ulong, + pub cssel: ::c_ulong, + pub dataoff: ::c_ulong, + pub datasel: ::c_ulong, + pub _st: [_libc_fpreg; 8], + pub status: ::c_ulong, + } + + pub struct mcontext_t { + pub gregs: [greg_t; 19], + pub fpregs: *mut _libc_fpstate, + pub oldmask: ::c_ulong, + pub cr2: ::c_ulong, + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + __private: [u8; 112], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __pad1: ::c_uint, + __st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_uint, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino64_t, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_ulong, + pub shm_dtime: ::time_t, + __unused2: ::c_ulong, + pub shm_ctime: ::time_t, + __unused3: ::c_ulong, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __glibc_reserved1: ::c_ulong, + pub msg_rtime: ::time_t, + __glibc_reserved2: ::c_ulong, + pub msg_ctime: ::time_t, + __glibc_reserved3: ::c_ulong, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } +} + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; + +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_32BIT: ::c_int = 0x0040; + +pub const EDEADLOCK: ::c_int = 35; + +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_PASSCRED: ::c_int = 16; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; + +pub const FIOCLEX: ::c_ulong = 0x5451; +pub const FIONBIO: ::c_ulong = 0x5421; + +pub const SYS_gettid: ::c_long = 224; +pub const SYS_perf_event_open: ::c_long = 336; + +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; +pub const EXTPROC: ::tcflag_t = 0x00010000; +pub const TCGETS: ::c_ulong = 0x5401; +pub const TCSETS: ::c_ulong = 0x5402; +pub const TCSETSW: ::c_ulong = 0x5403; +pub const TCSETSF: ::c_ulong = 0x5404; +pub const TCGETA: ::c_ulong = 0x5405; +pub const TCSETA: ::c_ulong = 0x5406; +pub const TCSETAW: ::c_ulong = 0x5407; +pub const TCSETAF: ::c_ulong = 0x5408; +pub const TCSBRK: ::c_ulong = 0x5409; +pub const TCXONC: ::c_ulong = 0x540A; +pub const TCFLSH: ::c_ulong = 0x540B; +pub const TIOCINQ: ::c_ulong = 0x541B; +pub const TIOCGPGRP: ::c_ulong = 0x540F; +pub const TIOCSPGRP: ::c_ulong = 0x5410; +pub const TIOCOUTQ: ::c_ulong = 0x5411; +pub const TIOCGWINSZ: ::c_ulong = 0x5413; +pub const TIOCSWINSZ: ::c_ulong = 0x5414; +pub const FIONREAD: ::c_ulong = 0x541B; + +extern { + pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int; + pub fn setcontext(ucp: *const ucontext_t) -> ::c_int; + pub fn makecontext(ucp: *mut ucontext_t, + func: extern fn (), + argc: ::c_int, ...); + pub fn swapcontext(uocp: *mut ucontext_t, + ucp: *const ucontext_t) -> ::c_int; +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/aarch64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/aarch64.rs new file mode 100644 index 000000000..77cee3d21 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/aarch64.rs @@ -0,0 +1,447 @@ +//! AArch64-specific definitions for 64-bit linux-like values + +pub type c_char = u8; +pub type wchar_t = u32; +pub type nlink_t = u32; +pub type blksize_t = i32; +pub type suseconds_t = i64; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + __pad2: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + __pad2: ::c_int, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2], + } + + pub struct pthread_attr_t { + __size: [u64; 8] + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_uint, + pub __seq: ::c_ushort, + __pad1: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } +} + +pub const TIOCGSOFTCAR: ::c_ulong = 0x5419; +pub const TIOCSSOFTCAR: ::c_ulong = 0x541A; + +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_NPROC: ::c_int = 6; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; + +pub const MAP_GROWSDOWN: ::c_int = 0x0100; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SOL_SOCKET: ::c_int = 1; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PASSCRED: ::c_int = 16; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; +pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; +pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; +pub const SO_BINDTODEVICE: ::c_int = 25; +pub const SO_ATTACH_FILTER: ::c_int = 26; +pub const SO_DETACH_FILTER: ::c_int = 27; +pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; +pub const SO_PEERNAME: ::c_int = 28; +pub const SO_TIMESTAMP: ::c_int = 29; +pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_PEERSEC: ::c_int = 31; +pub const SO_PASSSEC: ::c_int = 34; +pub const SO_TIMESTAMPNS: ::c_int = 35; +pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; +pub const SO_MARK: ::c_int = 36; +pub const SO_TIMESTAMPING: ::c_int = 37; +pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; +pub const SO_RXQ_OVFL: ::c_int = 40; +pub const SO_WIFI_STATUS: ::c_int = 41; +pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; +pub const SO_PEEK_OFF: ::c_int = 42; +pub const SO_NOFCS: ::c_int = 43; +pub const SO_LOCK_FILTER: ::c_int = 44; +pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; +pub const SO_BUSY_POLL: ::c_int = 46; +pub const SO_MAX_PACING_RATE: ::c_int = 47; +pub const SO_BPF_EXTENSIONS: ::c_int = 48; +pub const SO_INCOMING_CPU: ::c_int = 49; +pub const SO_ATTACH_BPF: ::c_int = 50; +pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const PTRACE_DETACH: ::c_uint = 17; + +pub const EFD_NONBLOCK: ::c_int = 0x800; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; + +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const TIOCEXCL: ::c_ulong = 0x540C; +pub const TIOCNXCL: ::c_ulong = 0x540D; +pub const TIOCSCTTY: ::c_ulong = 0x540E; +pub const TIOCSTI: ::c_ulong = 0x5412; +pub const TIOCMGET: ::c_ulong = 0x5415; +pub const TIOCMBIS: ::c_ulong = 0x5416; +pub const TIOCMBIC: ::c_ulong = 0x5417; +pub const TIOCMSET: ::c_ulong = 0x5418; +pub const TIOCCONS: ::c_ulong = 0x541D; + +pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 8; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 48; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 8; + +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; + +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; + +pub const EDEADLOCK: ::c_int = 35; + +pub const FIOCLEX: ::c_ulong = 0x5451; +pub const FIONBIO: ::c_ulong = 0x5421; + +pub const SYS_gettid: ::c_long = 178; +pub const SYS_perf_event_open: ::c_long = 241; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 16384; +pub const MINSIGSTKSZ: ::size_t = 5120; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; +pub const EXTPROC: ::tcflag_t = 0x00010000; +pub const TCGETS: ::c_ulong = 0x5401; +pub const TCSETS: ::c_ulong = 0x5402; +pub const TCSETSW: ::c_ulong = 0x5403; +pub const TCSETSF: ::c_ulong = 0x5404; +pub const TCGETA: ::c_ulong = 0x5405; +pub const TCSETA: ::c_ulong = 0x5406; +pub const TCSETAW: ::c_ulong = 0x5407; +pub const TCSETAF: ::c_ulong = 0x5408; +pub const TCSBRK: ::c_ulong = 0x5409; +pub const TCXONC: ::c_ulong = 0x540A; +pub const TCFLSH: ::c_ulong = 0x540B; +pub const TIOCINQ: ::c_ulong = 0x541B; +pub const TIOCGPGRP: ::c_ulong = 0x540F; +pub const TIOCSPGRP: ::c_ulong = 0x5410; +pub const TIOCOUTQ: ::c_ulong = 0x5411; +pub const TIOCGWINSZ: ::c_ulong = 0x5413; +pub const TIOCSWINSZ: ::c_ulong = 0x5414; +pub const FIONREAD: ::c_ulong = 0x541B; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/mod.rs new file mode 100644 index 000000000..2fcec73a8 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/mod.rs @@ -0,0 +1,67 @@ +//! 64-bit specific definitions for linux-like values + +pub type c_long = i64; +pub type c_ulong = u64; +pub type clock_t = i64; +pub type time_t = i64; +pub type ino_t = u64; +pub type off_t = i64; +pub type blkcnt_t = i64; +pub type __fsword_t = ::c_long; + +s! { + pub struct sigset_t { + __val: [::c_ulong; 16], + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 0], + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } +} + +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(any(target_arch = "powerpc64"))] { + mod powerpc64; + pub use self::powerpc64::*; + } else if #[cfg(any(target_arch = "sparc64"))] { + mod sparc64; + pub use self::sparc64::*; + } else if #[cfg(any(target_arch = "x86_64"))] { + mod x86_64; + pub use self::x86_64::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/powerpc64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/powerpc64.rs new file mode 100644 index 000000000..8c19b0713 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/powerpc64.rs @@ -0,0 +1,446 @@ +//! PowerPC64-specific definitions for 64-bit linux-like values + +pub type c_char = u8; +pub type wchar_t = i32; +pub type nlink_t = u64; +pub type blksize_t = i64; +pub type suseconds_t = i64; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __reserved: [::c_long; 3], + } + + pub struct pthread_attr_t { + __size: [u64; 7] + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::uint32_t, + __pad1: ::uint32_t, + __unused1: ::uint64_t, + __unused2: ::c_ulong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_segsz: ::size_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } +} + +pub const TIOCGSOFTCAR: ::c_ulong = 0x5419; +pub const TIOCSSOFTCAR: ::c_ulong = 0x541A; + +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_NPROC: ::c_int = 6; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; + +pub const MAP_GROWSDOWN: ::c_int = 0x0100; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SOL_SOCKET: ::c_int = 1; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PASSCRED: ::c_int = 20; +pub const SO_PEERCRED: ::c_int = 21; +pub const SO_RCVLOWAT: ::c_int = 16; +pub const SO_SNDLOWAT: ::c_int = 17; +pub const SO_RCVTIMEO: ::c_int = 18; +pub const SO_SNDTIMEO: ::c_int = 19; +pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; +pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; +pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; +pub const SO_BINDTODEVICE: ::c_int = 25; +pub const SO_ATTACH_FILTER: ::c_int = 26; +pub const SO_DETACH_FILTER: ::c_int = 27; +pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; +pub const SO_PEERNAME: ::c_int = 28; +pub const SO_TIMESTAMP: ::c_int = 29; +pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_PEERSEC: ::c_int = 31; +pub const SO_PASSSEC: ::c_int = 34; +pub const SO_TIMESTAMPNS: ::c_int = 35; +pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; +pub const SO_MARK: ::c_int = 36; +pub const SO_TIMESTAMPING: ::c_int = 37; +pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; +pub const SO_RXQ_OVFL: ::c_int = 40; +pub const SO_WIFI_STATUS: ::c_int = 41; +pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; +pub const SO_PEEK_OFF: ::c_int = 42; +pub const SO_NOFCS: ::c_int = 43; +pub const SO_LOCK_FILTER: ::c_int = 44; +pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; +pub const SO_BUSY_POLL: ::c_int = 46; +pub const SO_MAX_PACING_RATE: ::c_int = 47; +pub const SO_BPF_EXTENSIONS: ::c_int = 48; +pub const SO_INCOMING_CPU: ::c_int = 49; +pub const SO_ATTACH_BPF: ::c_int = 50; +pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const PTRACE_DETACH: ::c_uint = 17; + +pub const EFD_NONBLOCK: ::c_int = 0x800; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; + +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const TIOCEXCL: ::c_ulong = 0x540C; +pub const TIOCNXCL: ::c_ulong = 0x540D; +pub const TIOCSCTTY: ::c_ulong = 0x540E; +pub const TIOCSTI: ::c_ulong = 0x5412; +pub const TIOCMGET: ::c_ulong = 0x5415; +pub const TIOCMBIS: ::c_ulong = 0x5416; +pub const TIOCMBIC: ::c_ulong = 0x5417; +pub const TIOCMSET: ::c_ulong = 0x5418; +pub const TIOCCONS: ::c_ulong = 0x541D; + +pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; + +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_DIRECT: ::c_int = 0x20000; + +pub const MAP_LOCKED: ::c_int = 0x00080; +pub const MAP_NORESERVE: ::c_int = 0x00040; + +pub const EDEADLOCK: ::c_int = 58; + +pub const FIOCLEX: ::c_ulong = 0x20006601; +pub const FIONBIO: ::c_ulong = 0x8004667e; + +pub const SYS_gettid: ::c_long = 207; +pub const SYS_perf_event_open: ::c_long = 319; + +pub const MCL_CURRENT: ::c_int = 0x2000; +pub const MCL_FUTURE: ::c_int = 0x4000; + +pub const SIGSTKSZ: ::size_t = 0x4000; +pub const MINSIGSTKSZ: ::size_t = 4096; +pub const CBAUD: ::tcflag_t = 0xff; +pub const TAB1: ::c_int = 0x400; +pub const TAB2: ::c_int = 0x800; +pub const TAB3: ::c_int = 0xc00; +pub const CR1: ::c_int = 0x1000; +pub const CR2: ::c_int = 0x2000; +pub const CR3: ::c_int = 0x3000; +pub const FF1: ::c_int = 0x4000; +pub const BS1: ::c_int = 0x8000; +pub const VT1: ::c_int = 0x10000; +pub const VWERASE: usize = 0xa; +pub const VREPRINT: usize = 0xb; +pub const VSUSP: usize = 0xc; +pub const VSTART: usize = 0xd; +pub const VSTOP: usize = 0xe; +pub const VDISCARD: usize = 0x10; +pub const VTIME: usize = 0x7; +pub const IXON: ::tcflag_t = 0x200; +pub const IXOFF: ::tcflag_t = 0x400; +pub const ONLCR: ::tcflag_t = 0x2; +pub const CSIZE: ::tcflag_t = 0x300; +pub const CS6: ::tcflag_t = 0x100; +pub const CS7: ::tcflag_t = 0x200; +pub const CS8: ::tcflag_t = 0x300; +pub const CSTOPB: ::tcflag_t = 0x400; +pub const CREAD: ::tcflag_t = 0x800; +pub const PARENB: ::tcflag_t = 0x1000; +pub const PARODD: ::tcflag_t = 0x2000; +pub const HUPCL: ::tcflag_t = 0x4000; +pub const CLOCAL: ::tcflag_t = 0x8000; +pub const ECHOKE: ::tcflag_t = 0x1; +pub const ECHOE: ::tcflag_t = 0x2; +pub const ECHOK: ::tcflag_t = 0x4; +pub const ECHONL: ::tcflag_t = 0x10; +pub const ECHOPRT: ::tcflag_t = 0x20; +pub const ECHOCTL: ::tcflag_t = 0x40; +pub const ISIG: ::tcflag_t = 0x80; +pub const ICANON: ::tcflag_t = 0x100; +pub const PENDIN: ::tcflag_t = 0x20000000; +pub const NOFLSH: ::tcflag_t = 0x80000000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const CBAUDEX: ::speed_t = 0o000020; +pub const B57600: ::speed_t = 0o0020; +pub const B115200: ::speed_t = 0o0021; +pub const B230400: ::speed_t = 0o0022; +pub const B460800: ::speed_t = 0o0023; +pub const B500000: ::speed_t = 0o0024; +pub const B576000: ::speed_t = 0o0025; +pub const B921600: ::speed_t = 0o0026; +pub const B1000000: ::speed_t = 0o0027; +pub const B1152000: ::speed_t = 0o0030; +pub const B1500000: ::speed_t = 0o0031; +pub const B2000000: ::speed_t = 0o0032; +pub const B2500000: ::speed_t = 0o0033; +pub const B3000000: ::speed_t = 0o0034; +pub const B3500000: ::speed_t = 0o0035; +pub const B4000000: ::speed_t = 0o0036; + +pub const VEOL: usize = 6; +pub const VEOL2: usize = 8; +pub const VMIN: usize = 5; +pub const IEXTEN: ::tcflag_t = 0x400; +pub const TOSTOP: ::tcflag_t = 0x400000; +pub const FLUSHO: ::tcflag_t = 0x800000; +pub const EXTPROC: ::tcflag_t = 0x10000000; +pub const TCGETS: ::c_ulong = 0x403c7413; +pub const TCSETS: ::c_ulong = 0x803c7414; +pub const TCSETSW: ::c_ulong = 0x803c7415; +pub const TCSETSF: ::c_ulong = 0x803c7416; +pub const TCGETA: ::c_ulong = 0x40147417; +pub const TCSETA: ::c_ulong = 0x80147418; +pub const TCSETAW: ::c_ulong = 0x80147419; +pub const TCSETAF: ::c_ulong = 0x8014741c; +pub const TCSBRK: ::c_ulong = 0x2000741d; +pub const TCXONC: ::c_ulong = 0x2000741e; +pub const TCFLSH: ::c_ulong = 0x2000741f; +pub const TIOCINQ: ::c_ulong = 0x4004667f; +pub const TIOCGPGRP: ::c_ulong = 0x40047477; +pub const TIOCSPGRP: ::c_ulong = 0x80047476; +pub const TIOCOUTQ: ::c_ulong = 0x40047473; +pub const TIOCGWINSZ: ::c_ulong = 0x40087468; +pub const TIOCSWINSZ: ::c_ulong = 0x80087467; +pub const FIONREAD: ::c_ulong = 0x4004667f; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/sparc64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/sparc64.rs new file mode 100644 index 000000000..12598e052 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/sparc64.rs @@ -0,0 +1,370 @@ +//! SPARC64-specific definitions for 64-bit linux-like values + +pub type c_char = i8; +pub type wchar_t = i32; +pub type nlink_t = u32; +pub type blksize_t = i64; +pub type suseconds_t = i32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + __pad0: u64, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: u64, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 2], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __pad0: u64, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_int, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __reserved: [::c_long; 2], + } + + pub struct pthread_attr_t { + __size: [u64; 7] + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + __pad0: u16, + pub __seq: ::c_ushort, + __unused1: ::c_ulonglong, + __unused2: ::c_ulonglong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_segsz: ::size_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __reserved1: ::c_ulong, + __reserved2: ::c_ulong + } +} + +pub const TIOCGSOFTCAR: ::c_ulong = 0x40047464; +pub const TIOCSSOFTCAR: ::c_ulong = 0x80047465; + +pub const RLIMIT_NOFILE: ::c_int = 6; +pub const RLIMIT_NPROC: ::c_int = 7; + +pub const O_APPEND: ::c_int = 0x8; +pub const O_CREAT: ::c_int = 0x200; +pub const O_EXCL: ::c_int = 0x800; +pub const O_NOCTTY: ::c_int = 0x8000; +pub const O_NONBLOCK: ::c_int = 0x4000; +pub const O_SYNC: ::c_int = 0x802000; +pub const O_RSYNC: ::c_int = 0x802000; +pub const O_DSYNC: ::c_int = 0x2000; +pub const O_FSYNC: ::c_int = 0x802000; + +pub const MAP_GROWSDOWN: ::c_int = 0x0200; + +pub const EDEADLK: ::c_int = 78; +pub const ENAMETOOLONG: ::c_int = 63; +pub const ENOLCK: ::c_int = 79; +pub const ENOSYS: ::c_int = 90; +pub const ENOTEMPTY: ::c_int = 66; +pub const ELOOP: ::c_int = 62; +pub const ENOMSG: ::c_int = 75; +pub const EIDRM: ::c_int = 77; +pub const ECHRNG: ::c_int = 94; +pub const EL2NSYNC: ::c_int = 95; +pub const EL3HLT: ::c_int = 96; +pub const EL3RST: ::c_int = 97; +pub const ELNRNG: ::c_int = 98; +pub const EUNATCH: ::c_int = 99; +pub const ENOCSI: ::c_int = 100; +pub const EL2HLT: ::c_int = 101; +pub const EBADE: ::c_int = 102; +pub const EBADR: ::c_int = 103; +pub const EXFULL: ::c_int = 104; +pub const ENOANO: ::c_int = 105; +pub const EBADRQC: ::c_int = 106; +pub const EBADSLT: ::c_int = 107; +pub const EMULTIHOP: ::c_int = 87; +pub const EOVERFLOW: ::c_int = 92; +pub const ENOTUNIQ: ::c_int = 115; +pub const EBADFD: ::c_int = 93; +pub const EBADMSG: ::c_int = 76; +pub const EREMCHG: ::c_int = 89; +pub const ELIBACC: ::c_int = 114; +pub const ELIBBAD: ::c_int = 112; +pub const ELIBSCN: ::c_int = 124; +pub const ELIBMAX: ::c_int = 123; +pub const ELIBEXEC: ::c_int = 110; +pub const EILSEQ: ::c_int = 122; +pub const ERESTART: ::c_int = 116; +pub const ESTRPIPE: ::c_int = 91; +pub const EUSERS: ::c_int = 68; +pub const ENOTSOCK: ::c_int = 38; +pub const EDESTADDRREQ: ::c_int = 39; +pub const EMSGSIZE: ::c_int = 40; +pub const EPROTOTYPE: ::c_int = 41; +pub const ENOPROTOOPT: ::c_int = 42; +pub const EPROTONOSUPPORT: ::c_int = 43; +pub const ESOCKTNOSUPPORT: ::c_int = 44; +pub const EOPNOTSUPP: ::c_int = 45; +pub const EPFNOSUPPORT: ::c_int = 46; +pub const EAFNOSUPPORT: ::c_int = 47; +pub const EADDRINUSE: ::c_int = 48; +pub const EADDRNOTAVAIL: ::c_int = 49; +pub const ENETDOWN: ::c_int = 50; +pub const ENETUNREACH: ::c_int = 51; +pub const ENETRESET: ::c_int = 52; +pub const ECONNABORTED: ::c_int = 53; +pub const ECONNRESET: ::c_int = 54; +pub const ENOBUFS: ::c_int = 55; +pub const EISCONN: ::c_int = 56; +pub const ENOTCONN: ::c_int = 57; +pub const ESHUTDOWN: ::c_int = 58; +pub const ETOOMANYREFS: ::c_int = 59; +pub const ETIMEDOUT: ::c_int = 60; +pub const ECONNREFUSED: ::c_int = 61; +pub const EHOSTDOWN: ::c_int = 64; +pub const EHOSTUNREACH: ::c_int = 65; +pub const EALREADY: ::c_int = 37; +pub const EINPROGRESS: ::c_int = 36; +pub const ESTALE: ::c_int = 70; +pub const EDQUOT: ::c_int = 69; +pub const ENOMEDIUM: ::c_int = 125; +pub const EMEDIUMTYPE: ::c_int = 126; +pub const ECANCELED: ::c_int = 127; +pub const ENOKEY: ::c_int = 128; +pub const EKEYEXPIRED: ::c_int = 129; +pub const EKEYREVOKED: ::c_int = 130; +pub const EKEYREJECTED: ::c_int = 131; +pub const EOWNERDEAD: ::c_int = 132; +pub const ENOTRECOVERABLE: ::c_int = 133; +pub const EHWPOISON: ::c_int = 135; +pub const ERFKILL: ::c_int = 134; + +pub const SOL_SOCKET: ::c_int = 0xffff; + +pub const SO_REUSEADDR: ::c_int = 4; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_DONTROUTE: ::c_int = 16; +pub const SO_BROADCAST: ::c_int = 32; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_KEEPALIVE: ::c_int = 8; +pub const SO_OOBINLINE: ::c_int = 0x100; +pub const SO_LINGER: ::c_int = 128; +pub const SO_REUSEPORT: ::c_int = 0x200; +pub const SO_ACCEPTCONN: ::c_int = 0x8000; + +pub const SA_ONSTACK: ::c_int = 1; +pub const SA_SIGINFO: ::c_int = 0x200; +pub const SA_NOCLDWAIT: ::c_int = 0x100; + +pub const SIGCHLD: ::c_int = 20; +pub const SIGBUS: ::c_int = 10; +pub const SIGUSR1: ::c_int = 30; +pub const SIGUSR2: ::c_int = 31; +pub const SIGCONT: ::c_int = 19; +pub const SIGSTOP: ::c_int = 17; +pub const SIGTSTP: ::c_int = 18; +pub const SIGURG: ::c_int = 16; +pub const SIGIO: ::c_int = 23; +pub const SIGSYS: ::c_int = 12; +pub const SIGPOLL: ::c_int = 23; +pub const SIGPWR: ::c_int = 29; +pub const SIG_SETMASK: ::c_int = 4; +pub const SIG_BLOCK: ::c_int = 1; +pub const SIG_UNBLOCK: ::c_int = 2; + +pub const POLLWRNORM: ::c_short = 4; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const O_ASYNC: ::c_int = 0x40; +pub const O_NDELAY: ::c_int = 0x4004; + +pub const PTRACE_DETACH: ::c_uint = 11; + +pub const EFD_NONBLOCK: ::c_int = 0x4000; + +pub const F_GETLK: ::c_int = 7; +pub const F_GETOWN: ::c_int = 5; +pub const F_SETOWN: ::c_int = 6; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; + +pub const SFD_NONBLOCK: ::c_int = 0x4000; + +pub const TIOCEXCL: ::c_ulong = 0x2000740d; +pub const TIOCNXCL: ::c_ulong = 0x2000740e; +pub const TIOCSCTTY: ::c_ulong = 0x20007484; +pub const TIOCSTI: ::c_ulong = 0x80017472; +pub const TIOCMGET: ::c_ulong = 0x4004746a; +pub const TIOCMBIS: ::c_ulong = 0x8004746c; +pub const TIOCMBIC: ::c_ulong = 0x8004746b; +pub const TIOCMSET: ::c_ulong = 0x8004746d; +pub const TIOCCONS: ::c_ulong = 0x20007424; + +pub const SFD_CLOEXEC: ::c_int = 0x400000; + +pub const NCCS: usize = 17; +pub const O_TRUNC: ::c_int = 0x400; + +pub const O_CLOEXEC: ::c_int = 0x400000; + +pub const EBFONT: ::c_int = 109; +pub const ENOSTR: ::c_int = 72; +pub const ENODATA: ::c_int = 111; +pub const ETIME: ::c_int = 73; +pub const ENOSR: ::c_int = 74; +pub const ENONET: ::c_int = 80; +pub const ENOPKG: ::c_int = 113; +pub const EREMOTE: ::c_int = 71; +pub const ENOLINK: ::c_int = 82; +pub const EADV: ::c_int = 83; +pub const ESRMNT: ::c_int = 84; +pub const ECOMM: ::c_int = 85; +pub const EPROTO: ::c_int = 86; +pub const EDOTDOT: ::c_int = 88; + +pub const SA_NODEFER: ::c_int = 0x20; +pub const SA_RESETHAND: ::c_int = 0x4; +pub const SA_RESTART: ::c_int = 0x2; +pub const SA_NOCLDSTOP: ::c_int = 0x00000008; + +pub const EPOLL_CLOEXEC: ::c_int = 0x400000; + +pub const EFD_CLOEXEC: ::c_int = 0x400000; +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; + +pub const O_DIRECTORY: ::c_int = 0o200000; +pub const O_NOFOLLOW: ::c_int = 0o400000; +pub const O_DIRECT: ::c_int = 0x100000; + +pub const MAP_LOCKED: ::c_int = 0x0100; +pub const MAP_NORESERVE: ::c_int = 0x00040; + +pub const EDEADLOCK: ::c_int = 108; + +pub const SO_PEERCRED: ::c_int = 0x40; +pub const SO_RCVLOWAT: ::c_int = 0x800; +pub const SO_SNDLOWAT: ::c_int = 0x1000; +pub const SO_RCVTIMEO: ::c_int = 0x2000; +pub const SO_SNDTIMEO: ::c_int = 0x4000; + +pub const FIOCLEX: ::c_ulong = 0x20006601; +pub const FIONBIO: ::c_ulong = 0x8004667e; + +pub const SYS_gettid: ::c_long = 143; +pub const SYS_perf_event_open: ::c_long = 327; + +pub const MCL_CURRENT: ::c_int = 0x2000; +pub const MCL_FUTURE: ::c_int = 0x4000; + +pub const SIGSTKSZ: ::size_t = 16384; +pub const MINSIGSTKSZ: ::size_t = 4096; +pub const CBAUD: ::tcflag_t = 0x0000100f; +pub const TAB1: ::c_int = 0x800; +pub const TAB2: ::c_int = 0x1000; +pub const TAB3: ::c_int = 0x1800; +pub const CR1: ::c_int = 0x200; +pub const CR2: ::c_int = 0x400; +pub const CR3: ::c_int = 0x600; +pub const FF1: ::c_int = 0x8000; +pub const BS1: ::c_int = 0x2000; +pub const VT1: ::c_int = 0x4000; +pub const VWERASE: usize = 0xe; +pub const VREPRINT: usize = 0xc; +pub const VSUSP: usize = 0xa; +pub const VSTART: usize = 0x8; +pub const VSTOP: usize = 0x9; +pub const VDISCARD: usize = 0xd; +pub const VTIME: usize = 0x5; +pub const IXON: ::tcflag_t = 0x400; +pub const IXOFF: ::tcflag_t = 0x1000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x30; +pub const CS6: ::tcflag_t = 0x10; +pub const CS7: ::tcflag_t = 0x20; +pub const CS8: ::tcflag_t = 0x30; +pub const CSTOPB: ::tcflag_t = 0x40; +pub const CREAD: ::tcflag_t = 0x80; +pub const PARENB: ::tcflag_t = 0x100; +pub const PARODD: ::tcflag_t = 0x200; +pub const HUPCL: ::tcflag_t = 0x400; +pub const CLOCAL: ::tcflag_t = 0x800; +pub const ECHOKE: ::tcflag_t = 0x800; +pub const ECHOE: ::tcflag_t = 0x10; +pub const ECHOK: ::tcflag_t = 0x20; +pub const ECHONL: ::tcflag_t = 0x40; +pub const ECHOPRT: ::tcflag_t = 0x400; +pub const ECHOCTL: ::tcflag_t = 0x200; +pub const ISIG: ::tcflag_t = 0x1; +pub const ICANON: ::tcflag_t = 0x2; +pub const PENDIN: ::tcflag_t = 0x4000; +pub const NOFLSH: ::tcflag_t = 0x80; + +pub const VEOL: usize = 5; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const IEXTEN: ::tcflag_t = 0x8000; +pub const TOSTOP: ::tcflag_t = 0x100; +pub const FLUSHO: ::tcflag_t = 0x2000; +pub const EXTPROC: ::tcflag_t = 0x10000; +pub const TCGETS: ::c_ulong = 0x40245408; +pub const TCSETS: ::c_ulong = 0x80245409; +pub const TCSETSW: ::c_ulong = 0x8024540a; +pub const TCSETSF: ::c_ulong = 0x8024540b; +pub const TCGETA: ::c_ulong = 0x40125401; +pub const TCSETA: ::c_ulong = 0x80125402; +pub const TCSETAW: ::c_ulong = 0x80125403; +pub const TCSETAF: ::c_ulong = 0x80125404; +pub const TCSBRK: ::c_ulong = 0x20005405; +pub const TCXONC: ::c_ulong = 0x20005406; +pub const TCFLSH: ::c_ulong = 0x20005407; +pub const TIOCINQ: ::c_ulong = 0x4004667f; +pub const TIOCGPGRP: ::c_ulong = 0x40047483; +pub const TIOCSPGRP: ::c_ulong = 0x80047482; +pub const TIOCOUTQ: ::c_ulong = 0x40047473; +pub const TIOCGWINSZ: ::c_ulong = 0x40087468; +pub const TIOCSWINSZ: ::c_ulong = 0x80087467; +pub const FIONREAD: ::c_ulong = 0x4004667f; diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/x86_64.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/x86_64.rs new file mode 100644 index 000000000..b39ccb391 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/x86_64.rs @@ -0,0 +1,515 @@ +//! x86_64-specific definitions for 64-bit linux-like values + +pub type c_char = i8; +pub type wchar_t = i32; +pub type nlink_t = u64; +pub type blksize_t = i64; +pub type greg_t = i64; +pub type suseconds_t = i64; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __reserved: [::c_long; 3], + } + + pub struct pthread_attr_t { + __size: [u64; 7] + } + + pub struct _libc_fpxreg { + pub significand: [u16; 4], + pub exponent: u16, + __private: [u16; 3], + } + + pub struct _libc_xmmreg { + pub element: [u32; 4], + } + + pub struct _libc_fpstate { + pub cwd: u16, + pub swd: u16, + pub ftw: u16, + pub fop: u16, + pub rip: u64, + pub rdp: u64, + pub mxcsr: u32, + pub mxcr_mask: u32, + pub _st: [_libc_fpxreg; 8], + pub _xmm: [_libc_xmmreg; 16], + __private: [u64; 12], + } + + pub struct mcontext_t { + pub gregs: [greg_t; 23], + pub fpregs: *mut _libc_fpstate, + __private: [u64; 8], + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + __private: [u8; 512], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } +} + +pub const TIOCGSOFTCAR: ::c_ulong = 0x5419; +pub const TIOCSSOFTCAR: ::c_ulong = 0x541A; + +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_NPROC: ::c_int = 6; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; + +pub const MAP_GROWSDOWN: ::c_int = 0x0100; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SOL_SOCKET: ::c_int = 1; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PASSCRED: ::c_int = 16; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; +pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; +pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; +pub const SO_BINDTODEVICE: ::c_int = 25; +pub const SO_ATTACH_FILTER: ::c_int = 26; +pub const SO_DETACH_FILTER: ::c_int = 27; +pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; +pub const SO_PEERNAME: ::c_int = 28; +pub const SO_TIMESTAMP: ::c_int = 29; +pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_PEERSEC: ::c_int = 31; +pub const SO_PASSSEC: ::c_int = 34; +pub const SO_TIMESTAMPNS: ::c_int = 35; +pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; +pub const SO_MARK: ::c_int = 36; +pub const SO_TIMESTAMPING: ::c_int = 37; +pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; +pub const SO_RXQ_OVFL: ::c_int = 40; +pub const SO_WIFI_STATUS: ::c_int = 41; +pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; +pub const SO_PEEK_OFF: ::c_int = 42; +pub const SO_NOFCS: ::c_int = 43; +pub const SO_LOCK_FILTER: ::c_int = 44; +pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; +pub const SO_BUSY_POLL: ::c_int = 46; +pub const SO_MAX_PACING_RATE: ::c_int = 47; +pub const SO_BPF_EXTENSIONS: ::c_int = 48; +pub const SO_INCOMING_CPU: ::c_int = 49; +pub const SO_ATTACH_BPF: ::c_int = 50; +pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const PTRACE_DETACH: ::c_uint = 17; + +pub const EFD_NONBLOCK: ::c_int = 0x800; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; + +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const TIOCEXCL: ::c_ulong = 0x540C; +pub const TIOCNXCL: ::c_ulong = 0x540D; +pub const TIOCSCTTY: ::c_ulong = 0x540E; +pub const TIOCSTI: ::c_ulong = 0x5412; +pub const TIOCMGET: ::c_ulong = 0x5415; +pub const TIOCMBIS: ::c_ulong = 0x5416; +pub const TIOCMBIC: ::c_ulong = 0x5417; +pub const TIOCMSET: ::c_ulong = 0x5418; +pub const TIOCCONS: ::c_ulong = 0x541D; + +pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; + +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_32BIT: ::c_int = 0x0040; + +pub const EDEADLOCK: ::c_int = 35; + +pub const FIOCLEX: ::c_ulong = 0x5451; +pub const FIONBIO: ::c_ulong = 0x5421; + +pub const PTRACE_GETFPREGS: ::c_uint = 14; +pub const PTRACE_SETFPREGS: ::c_uint = 15; +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; +pub const PTRACE_GETREGS: ::c_uint = 12; +pub const PTRACE_SETREGS: ::c_uint = 13; +pub const PTRACE_O_EXITKILL: ::c_uint = 1048576; +pub const PTRACE_O_TRACECLONE: ::c_uint = 8; +pub const PTRACE_O_TRACEEXEC: ::c_uint = 16; +pub const PTRACE_O_TRACEEXIT: ::c_uint = 64; +pub const PTRACE_O_TRACEFORK: ::c_uint = 2; +pub const PTRACE_O_TRACESYSGOOD: ::c_uint = 1; +pub const PTRACE_O_TRACEVFORK: ::c_uint = 4; +pub const PTRACE_O_TRACEVFORKDONE: ::c_uint = 32; +pub const PTRACE_O_TRACESECCOMP: ::c_uint = 128; +pub const PTRACE_O_SUSPEND_SECCOMP: ::c_uint = 2097152; +pub const PTRACE_PEEKSIGINFO_SHARED: ::c_uint = 1; + +pub const SYS_gettid: ::c_long = 186; +pub const SYS_perf_event_open: ::c_long = 298; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; +pub const EXTPROC: ::tcflag_t = 0x00010000; +pub const TCGETS: ::c_ulong = 0x5401; +pub const TCSETS: ::c_ulong = 0x5402; +pub const TCSETSW: ::c_ulong = 0x5403; +pub const TCSETSF: ::c_ulong = 0x5404; +pub const TCGETA: ::c_ulong = 0x5405; +pub const TCSETA: ::c_ulong = 0x5406; +pub const TCSETAW: ::c_ulong = 0x5407; +pub const TCSETAF: ::c_ulong = 0x5408; +pub const TCSBRK: ::c_ulong = 0x5409; +pub const TCXONC: ::c_ulong = 0x540A; +pub const TCFLSH: ::c_ulong = 0x540B; +pub const TIOCINQ: ::c_ulong = 0x541B; +pub const TIOCGPGRP: ::c_ulong = 0x540F; +pub const TIOCSPGRP: ::c_ulong = 0x5410; +pub const TIOCOUTQ: ::c_ulong = 0x5411; +pub const TIOCGWINSZ: ::c_ulong = 0x5413; +pub const TIOCSWINSZ: ::c_ulong = 0x5414; +pub const FIONREAD: ::c_ulong = 0x541B; + +extern { + pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int; + pub fn setcontext(ucp: *const ucontext_t) -> ::c_int; + pub fn makecontext(ucp: *mut ucontext_t, + func: extern fn (), + argc: ::c_int, ...); + pub fn swapcontext(uocp: *mut ucontext_t, + ucp: *const ucontext_t) -> ::c_int; +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/mod.rs new file mode 100644 index 000000000..13a5c68d6 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/mod.rs @@ -0,0 +1,521 @@ +pub type fsblkcnt_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type rlim_t = c_ulong; +pub type __priority_which_t = ::c_uint; + +s! { + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: ::sigevent, + __next_prio: *mut aiocb, + __abs_prio: ::c_int, + __policy: ::c_int, + __error_code: ::c_int, + __return_value: ::ssize_t, + pub aio_offset: off_t, + #[cfg(target_pointer_width = "32")] + __unused1: [::c_char; 4], + __glibc_reserved: [::c_char; 32] + } + + pub struct __exit_status { + pub e_termination: ::c_short, + pub e_exit: ::c_short, + } + + pub struct __timeval { + pub tv_sec: ::int32_t, + pub tv_usec: ::int32_t, + } + + pub struct utmpx { + pub ut_type: ::c_short, + pub ut_pid: ::pid_t, + pub ut_line: [::c_char; __UT_LINESIZE], + pub ut_id: [::c_char; 4], + + pub ut_user: [::c_char; __UT_NAMESIZE], + pub ut_host: [::c_char; __UT_HOSTSIZE], + pub ut_exit: __exit_status, + + #[cfg(any(target_arch = "aarch64", + target_arch = "sparc64", + target_pointer_width = "32"))] + pub ut_session: ::c_long, + #[cfg(any(target_arch = "aarch64", + target_arch = "sparc64", + target_pointer_width = "32"))] + pub ut_tv: ::timeval, + + #[cfg(not(any(target_arch = "aarch64", + target_arch = "sparc64", + target_pointer_width = "32")))] + pub ut_session: ::int32_t, + #[cfg(not(any(target_arch = "aarch64", + target_arch = "sparc64", + target_pointer_width = "32")))] + pub ut_tv: __timeval, + + pub ut_addr_v6: [::int32_t; 4], + __glibc_reserved: [::c_char; 20], + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + #[cfg(target_arch = "sparc64")] + __reserved0: ::c_int, + pub sa_flags: ::c_int, + _restorer: *mut ::c_void, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct glob64_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut ::c_char, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + } + + pub struct ucred { + pub pid: ::pid_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + } + + pub struct statfs { + pub f_type: __fsword_t, + pub f_bsize: __fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: __fsword_t, + pub f_frsize: __fsword_t, + f_spare: [__fsword_t; 5], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::size_t, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::size_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + #[cfg(not(target_arch = "sparc64"))] + pub c_ispeed: ::speed_t, + #[cfg(not(target_arch = "sparc64"))] + pub c_ospeed: ::speed_t, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + // FIXME this is actually a union + pub struct sem_t { + #[cfg(target_pointer_width = "32")] + __size: [::c_char; 16], + #[cfg(target_pointer_width = "64")] + __size: [::c_char; 32], + __align: [::c_long; 0], + } +} + +pub const __UT_LINESIZE: usize = 32; +pub const __UT_NAMESIZE: usize = 32; +pub const __UT_HOSTSIZE: usize = 256; +pub const EMPTY: ::c_short = 0; +pub const RUN_LVL: ::c_short = 1; +pub const BOOT_TIME: ::c_short = 2; +pub const NEW_TIME: ::c_short = 3; +pub const OLD_TIME: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const USER_PROCESS: ::c_short = 7; +pub const DEAD_PROCESS: ::c_short = 8; +pub const ACCOUNTING: ::c_short = 9; + +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_AS: ::c_int = 9; +pub const RLIMIT_MEMLOCK: ::c_int = 8; +pub const RLIM_INFINITY: ::rlim_t = !0; +pub const RLIMIT_RTTIME: ::c_int = 15; +pub const RLIMIT_NLIMITS: ::c_int = 16; + +pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK; + +pub const SOL_RXRPC: ::c_int = 272; +pub const SOL_PPPOL2TP: ::c_int = 273; +pub const SOL_BLUETOOTH: ::c_int = 274; +pub const SOL_PNPIPE: ::c_int = 275; +pub const SOL_RDS: ::c_int = 276; +pub const SOL_IUCV: ::c_int = 277; +pub const SOL_CAIF: ::c_int = 278; +pub const SOL_ALG: ::c_int = 279; +pub const SOL_NFC: ::c_int = 280; + +pub const MSG_TRYHARD: ::c_int = 4; + +pub const LC_PAPER: ::c_int = 7; +pub const LC_NAME: ::c_int = 8; +pub const LC_ADDRESS: ::c_int = 9; +pub const LC_TELEPHONE: ::c_int = 10; +pub const LC_MEASUREMENT: ::c_int = 11; +pub const LC_IDENTIFICATION: ::c_int = 12; +pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER); +pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME); +pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS); +pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE); +pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT); +pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION); +pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK + | ::LC_NUMERIC_MASK + | ::LC_TIME_MASK + | ::LC_COLLATE_MASK + | ::LC_MONETARY_MASK + | ::LC_MESSAGES_MASK + | LC_PAPER_MASK + | LC_NAME_MASK + | LC_ADDRESS_MASK + | LC_TELEPHONE_MASK + | LC_MEASUREMENT_MASK + | LC_IDENTIFICATION_MASK; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; + +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15; +pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16; +pub const TCP_THIN_DUPACK: ::c_int = 17; +pub const TCP_USER_TIMEOUT: ::c_int = 18; +pub const TCP_REPAIR: ::c_int = 19; +pub const TCP_REPAIR_QUEUE: ::c_int = 20; +pub const TCP_QUEUE_SEQ: ::c_int = 21; +pub const TCP_REPAIR_OPTIONS: ::c_int = 22; +pub const TCP_FASTOPEN: ::c_int = 23; +pub const TCP_TIMESTAMP: ::c_int = 24; + +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; + +pub const SIGEV_THREAD_ID: ::c_int = 4; + +pub const POLLRDNORM: ::c_short = 0x040; +pub const POLLRDBAND: ::c_short = 0x080; + +pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01; +pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02; + +pub const BUFSIZ: ::c_uint = 8192; +pub const TMP_MAX: ::c_uint = 238328; +pub const FOPEN_MAX: ::c_uint = 16; +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; +pub const _SC_2_C_VERSION: ::c_int = 96; +pub const O_ACCMODE: ::c_int = 3; +pub const ST_RELATIME: ::c_ulong = 4096; +pub const NI_MAXHOST: ::socklen_t = 1025; + +pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5; +pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff; +pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245; +pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45; +pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53; +pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849; +pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6; +pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660; +pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6; +pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f; +pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f; +pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468; +pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478; +pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44; +pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c; +pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969; +pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1; +pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0; +pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f; +pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973; +pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b; +pub const TMPFS_MAGIC: ::c_long = 0x01021994; +pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2; + +pub const VEOF: usize = 4; + +pub const CPU_SETSIZE: ::c_int = 0x400; + +pub const QFMT_VFS_V1: ::c_int = 4; + +pub const PTRACE_TRACEME: ::c_uint = 0; +pub const PTRACE_PEEKTEXT: ::c_uint = 1; +pub const PTRACE_PEEKDATA: ::c_uint = 2; +pub const PTRACE_PEEKUSER: ::c_uint = 3; +pub const PTRACE_POKETEXT: ::c_uint = 4; +pub const PTRACE_POKEDATA: ::c_uint = 5; +pub const PTRACE_POKEUSER: ::c_uint = 6; +pub const PTRACE_CONT: ::c_uint = 7; +pub const PTRACE_KILL: ::c_uint = 8; +pub const PTRACE_SINGLESTEP: ::c_uint = 9; +pub const PTRACE_ATTACH: ::c_uint = 16; +pub const PTRACE_SYSCALL: ::c_uint = 24; +pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203; +pub const PTRACE_GETREGSET: ::c_uint = 0x4204; +pub const PTRACE_SETREGSET: ::c_uint = 0x4205; +pub const PTRACE_SEIZE: ::c_uint = 0x4206; +pub const PTRACE_INTERRUPT: ::c_uint = 0x4207; +pub const PTRACE_LISTEN: ::c_uint = 0x4208; +pub const PTRACE_PEEKSIGINFO: ::c_uint = 0x4209; + +pub const MADV_DODUMP: ::c_int = 17; +pub const MADV_DONTDUMP: ::c_int = 16; + +pub const EPOLLWAKEUP: ::c_int = 0x20000000; + +pub const MADV_HUGEPAGE: ::c_int = 14; +pub const MADV_NOHUGEPAGE: ::c_int = 15; +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const SEEK_DATA: ::c_int = 3; +pub const SEEK_HOLE: ::c_int = 4; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const TIOCLINUX: ::c_ulong = 0x541C; +pub const TIOCGSERIAL: ::c_ulong = 0x541E; + +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead; +pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793; +pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278; +pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448; +pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216; + +pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567; +pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123; +pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF; +pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000; +pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC; +pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4; +pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2; +pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543; + +pub const NETLINK_ROUTE: ::c_int = 0; +pub const NETLINK_UNUSED: ::c_int = 1; +pub const NETLINK_USERSOCK: ::c_int = 2; +pub const NETLINK_FIREWALL: ::c_int = 3; +pub const NETLINK_SOCK_DIAG: ::c_int = 4; +pub const NETLINK_NFLOG: ::c_int = 5; +pub const NETLINK_XFRM: ::c_int = 6; +pub const NETLINK_SELINUX: ::c_int = 7; +pub const NETLINK_ISCSI: ::c_int = 8; +pub const NETLINK_AUDIT: ::c_int = 9; +pub const NETLINK_FIB_LOOKUP: ::c_int = 10; +pub const NETLINK_CONNECTOR: ::c_int = 11; +pub const NETLINK_NETFILTER: ::c_int = 12; +pub const NETLINK_IP6_FW: ::c_int = 13; +pub const NETLINK_DNRTMSG: ::c_int = 14; +pub const NETLINK_KOBJECT_UEVENT: ::c_int = 15; +pub const NETLINK_GENERIC: ::c_int = 16; +pub const NETLINK_SCSITRANSPORT: ::c_int = 18; +pub const NETLINK_ECRYPTFS: ::c_int = 19; +pub const NETLINK_RDMA: ::c_int = 20; +pub const NETLINK_CRYPTO: ::c_int = 21; +pub const NETLINK_INET_DIAG: ::c_int = NETLINK_SOCK_DIAG; + +pub const MAX_LINKS: ::c_int = 32; + +pub const NLM_F_REQUEST: ::c_int = 1; +pub const NLM_F_MULTI: ::c_int = 2; +pub const NLM_F_ACK: ::c_int = 4; +pub const NLM_F_ECHO: ::c_int = 8; +pub const NLM_F_DUMP_INTR: ::c_int = 16; +pub const NLM_F_DUMP_FILTERED: ::c_int = 32; + +pub const NLM_F_ROOT: ::c_int = 0x100; +pub const NLM_F_MATCH: ::c_int = 0x200; +pub const NLM_F_ATOMIC: ::c_int = 0x400; +pub const NLM_F_DUMP: ::c_int = NLM_F_ROOT | NLM_F_MATCH; + +pub const NLM_F_REPLACE: ::c_int = 0x100; +pub const NLM_F_EXCL: ::c_int = 0x200; +pub const NLM_F_CREATE: ::c_int = 0x400; +pub const NLM_F_APPEND: ::c_int = 0x800; + +pub const NLMSG_NOOP: ::c_int = 0x1; +pub const NLMSG_ERROR: ::c_int = 0x2; +pub const NLMSG_DONE: ::c_int = 0x3; +pub const NLMSG_OVERRUN: ::c_int = 0x4; +pub const NLMSG_MIN_TYPE: ::c_int = 0x10; + +pub const NETLINK_ADD_MEMBERSHIP: ::c_int = 1; +pub const NETLINK_DROP_MEMBERSHIP: ::c_int = 2; +pub const NETLINK_PKTINFO: ::c_int = 3; +pub const NETLINK_BROADCAST_ERROR: ::c_int = 4; +pub const NETLINK_NO_ENOBUFS: ::c_int = 5; +pub const NETLINK_RX_RING: ::c_int = 6; +pub const NETLINK_TX_RING: ::c_int = 7; +pub const NETLINK_LISTEN_ALL_NSID: ::c_int = 8; +pub const NETLINK_LIST_MEMBERSHIPS: ::c_int = 9; +pub const NETLINK_CAP_ACK: ::c_int = 10; + +pub const NLA_F_NESTED: ::c_int = 1 << 15; +pub const NLA_F_NET_BYTEORDER: ::c_int = 1 << 14; +pub const NLA_TYPE_MASK: ::c_int = !(NLA_F_NESTED | NLA_F_NET_BYTEORDER); + +cfg_if! { + if #[cfg(any(target_arch = "arm", target_arch = "x86", + target_arch = "x86_64"))] { + pub const PTHREAD_STACK_MIN: ::size_t = 16384; + } else if #[cfg(target_arch = "sparc64")] { + pub const PTHREAD_STACK_MIN: ::size_t = 0x6000; + } else { + pub const PTHREAD_STACK_MIN: ::size_t = 131072; + } +} + +extern { + pub fn utmpxname(file: *const ::c_char) -> ::c_int; + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn setutxent(); + pub fn endutxent(); + pub fn getpt() -> ::c_int; +} + +#[link(name = "util")] +extern { + pub fn sysctl(name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t) + -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; + pub fn backtrace(buf: *mut *mut ::c_void, + sz: ::c_int) -> ::c_int; + pub fn glob64(pattern: *const ::c_char, + flags: ::c_int, + errfunc: ::dox::Option ::c_int>, + pglob: *mut glob64_t) -> ::c_int; + pub fn globfree64(pglob: *mut glob64_t); + pub fn ptrace(request: ::c_uint, ...) -> ::c_long; + pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t, + cpusetsize: ::size_t, + cpuset: *mut ::cpu_set_t) -> ::c_int; + pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t, + cpusetsize: ::size_t, + cpuset: *const ::cpu_set_t) -> ::c_int; + pub fn getpriority(which: ::__priority_which_t, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::__priority_which_t, who: ::id_t, + prio: ::c_int) -> ::c_int; + pub fn pthread_getaffinity_np(thread: ::pthread_t, + cpusetsize: ::size_t, + cpuset: *mut ::cpu_set_t) -> ::c_int; + pub fn pthread_setaffinity_np(thread: ::pthread_t, + cpusetsize: ::size_t, + cpuset: *const ::cpu_set_t) -> ::c_int; + pub fn sched_getcpu() -> ::c_int; +} + +cfg_if! { + if #[cfg(any(target_arch = "x86", + target_arch = "arm", + target_arch = "powerpc"))] { + mod b32; + pub use self::b32::*; + } else if #[cfg(any(target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "powerpc64", + target_arch = "sparc64"))] { + mod b64; + pub use self::b64::*; + } else { + // Unknown target_arch + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/s390x.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/s390x.rs new file mode 100644 index 000000000..f9f741679 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/s390x.rs @@ -0,0 +1,738 @@ +pub type blkcnt_t = i64; +pub type blksize_t = i64; +pub type c_char = u8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type fsblkcnt_t = u64; +pub type fsfilcnt_t = u64; +pub type ino_t = u64; +pub type nlink_t = u64; +pub type off_t = i64; +pub type rlim_t = u64; +pub type suseconds_t = i64; +pub type time_t = i64; +pub type wchar_t = i32; +pub type greg_t = u64; +pub type clock_t = i64; +pub type __fsword_t = ::c_long; +pub type __priority_which_t = ::c_uint; + +s! { + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: ::sigevent, + __next_prio: *mut aiocb, + __abs_prio: ::c_int, + __policy: ::c_int, + __error_code: ::c_int, + __return_value: ::ssize_t, + pub aio_offset: off_t, + #[cfg(target_pointer_width = "32")] + __unused1: [::c_char; 4], + __glibc_reserved: [::c_char; 32] + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + st_pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + __glibc_reserved: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + st_pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + __glibc_reserved: [::c_long; 3], + } + + pub struct pthread_attr_t { + __size: [::c_ulong; 7] + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + __glibc_reserved0: ::c_int, + pub sa_flags: ::c_int, + _restorer: *mut ::c_void, + pub sa_mask: sigset_t, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t, + } + + pub struct sigset_t { + __size: [::c_ulong; 16], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + _pad: ::c_int, + _pad2: [::c_long; 14], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_ushort, + __pad1: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct statfs { + pub f_type: ::c_uint, + pub f_bsize: ::c_uint, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_uint, + pub f_frsize: ::c_uint, + pub f_flags: ::c_uint, + f_spare: [::c_uint; 4], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::size_t, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::size_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 0], + } + + pub struct glob64_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut ::c_char, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + } + + pub struct ucred { + pub pid: ::pid_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + // FIXME this is actually a union + pub struct sem_t { + __size: [::c_char; 32], + __align: [::c_long; 0], + } + + pub struct __psw_t { + pub mask: u64, + pub addr: u64, + } + + // FIXME: This is actually a union. + pub struct fpreg_t { + pub d: ::c_double, + // f: ::c_float, + } + + pub struct fpregset_t { + pub fpc: u32, + __pad: u32, + pub fprs: [fpreg_t; 16], + } + + pub struct mcontext_t { + pub psw: __psw_t, + pub gregs: [u64; 16], + pub aregs: [u32; 16], + pub fpregs: fpregset_t, + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } +} + +pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const POSIX_FADV_DONTNEED: ::c_int = 6; +pub const POSIX_FADV_NOREUSE: ::c_int = 7; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; + +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNREFUSED: ::c_int = 111; +pub const ECONNRESET: ::c_int = 104; +pub const EDEADLK: ::c_int = 35; +pub const ENOSYS: ::c_int = 38; +pub const ENOTCONN: ::c_int = 107; +pub const ETIMEDOUT: ::c_int = 110; +pub const FIOCLEX: ::c_ulong = 0x5451; +pub const FIONBIO: ::c_ulong = 0x5421; +pub const MAP_ANON: ::c_int = 0x20; +pub const O_ACCMODE: ::c_int = 3; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NONBLOCK: ::c_int = 2048; +pub const PTHREAD_STACK_MIN: ::size_t = 16384; +pub const RLIM_INFINITY: ::rlim_t = 0xffffffffffffffff; +pub const SA_NOCLDWAIT: ::c_int = 2; +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 4; +pub const SIGBUS: ::c_int = 7; +pub const SIGSTKSZ: ::size_t = 0x2000; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const SIG_SETMASK: ::c_int = 2; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_STREAM: ::c_int = 1; +pub const SOL_SOCKET: ::c_int = 1; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_ERROR: ::c_int = 4; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_SNDTIMEO: ::c_int = 21; + +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_AS: ::c_int = 9; +pub const RLIMIT_NPROC: ::c_int = 6; +pub const RLIMIT_MEMLOCK: ::c_int = 8; +pub const RLIMIT_RTTIME: ::c_int = 15; +pub const RLIMIT_NLIMITS: ::c_int = 16; + +pub const O_NOCTTY: ::c_int = 256; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; + +pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK; + +pub const LC_PAPER: ::c_int = 7; +pub const LC_NAME: ::c_int = 8; +pub const LC_ADDRESS: ::c_int = 9; +pub const LC_TELEPHONE: ::c_int = 10; +pub const LC_MEASUREMENT: ::c_int = 11; +pub const LC_IDENTIFICATION: ::c_int = 12; +pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER); +pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME); +pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS); +pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE); +pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT); +pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION); +pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK + | ::LC_NUMERIC_MASK + | ::LC_TIME_MASK + | ::LC_COLLATE_MASK + | ::LC_MONETARY_MASK + | ::LC_MESSAGES_MASK + | LC_PAPER_MASK + | LC_NAME_MASK + | LC_ADDRESS_MASK + | LC_TELEPHONE_MASK + | LC_MEASUREMENT_MASK + | LC_IDENTIFICATION_MASK; + +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; + +pub const EDEADLOCK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SO_TYPE: ::c_int = 3; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_LINGER: ::c_int = 13; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_ACCEPTCONN: ::c_int = 30; + +pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15; +pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16; +pub const TCP_THIN_DUPACK: ::c_int = 17; +pub const TCP_USER_TIMEOUT: ::c_int = 18; +pub const TCP_REPAIR: ::c_int = 19; +pub const TCP_REPAIR_QUEUE: ::c_int = 20; +pub const TCP_QUEUE_SEQ: ::c_int = 21; +pub const TCP_REPAIR_OPTIONS: ::c_int = 22; +pub const TCP_FASTOPEN: ::c_int = 23; +pub const TCP_TIMESTAMP: ::c_int = 24; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGUNUSED: ::c_int = 31; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01; +pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02; + +pub const BUFSIZ: ::c_uint = 8192; +pub const TMP_MAX: ::c_uint = 238328; +pub const FOPEN_MAX: ::c_uint = 16; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; +pub const _SC_2_C_VERSION: ::c_int = 96; +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; +pub const ST_RELATIME: ::c_ulong = 4096; +pub const NI_MAXHOST: ::socklen_t = 1025; + +pub const ADFS_SUPER_MAGIC: ::c_int = 0x0000adf5; +pub const AFFS_SUPER_MAGIC: ::c_int = 0x0000adff; +pub const CODA_SUPER_MAGIC: ::c_int = 0x73757245; +pub const CRAMFS_MAGIC: ::c_int = 0x28cd3d45; +pub const EFS_SUPER_MAGIC: ::c_int = 0x00414a53; +pub const EXT2_SUPER_MAGIC: ::c_int = 0x0000ef53; +pub const EXT3_SUPER_MAGIC: ::c_int = 0x0000ef53; +pub const EXT4_SUPER_MAGIC: ::c_int = 0x0000ef53; +pub const HPFS_SUPER_MAGIC: ::c_int = 0xf995e849; +pub const HUGETLBFS_MAGIC: ::c_int = 0x958458f6; +pub const ISOFS_SUPER_MAGIC: ::c_int = 0x00009660; +pub const JFFS2_SUPER_MAGIC: ::c_int = 0x000072b6; +pub const MINIX_SUPER_MAGIC: ::c_int = 0x0000137f; +pub const MINIX_SUPER_MAGIC2: ::c_int = 0x0000138f; +pub const MINIX2_SUPER_MAGIC: ::c_int = 0x00002468; +pub const MINIX2_SUPER_MAGIC2: ::c_int = 0x00002478; +pub const MSDOS_SUPER_MAGIC: ::c_int = 0x00004d44; +pub const NCP_SUPER_MAGIC: ::c_int = 0x0000564c; +pub const NFS_SUPER_MAGIC: ::c_int = 0x00006969; +pub const OPENPROM_SUPER_MAGIC: ::c_int = 0x00009fa1; +pub const PROC_SUPER_MAGIC: ::c_int = 0x00009fa0; +pub const QNX4_SUPER_MAGIC: ::c_int = 0x0000002f; +pub const REISERFS_SUPER_MAGIC: ::c_int = 0x52654973; +pub const SMB_SUPER_MAGIC: ::c_int = 0x0000517b; +pub const TMPFS_MAGIC: ::c_int = 0x01021994; +pub const USBDEVICE_SUPER_MAGIC: ::c_int = 0x00009fa2; + +pub const VEOF: usize = 4; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const CPU_SETSIZE: ::c_int = 0x400; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const QFMT_VFS_V1: ::c_int = 4; + +pub const PTRACE_TRACEME: ::c_uint = 0; +pub const PTRACE_PEEKTEXT: ::c_uint = 1; +pub const PTRACE_PEEKDATA: ::c_uint = 2; +pub const PTRACE_PEEKUSER: ::c_uint = 3; +pub const PTRACE_POKETEXT: ::c_uint = 4; +pub const PTRACE_POKEDATA: ::c_uint = 5; +pub const PTRACE_POKEUSER: ::c_uint = 6; +pub const PTRACE_CONT: ::c_uint = 7; +pub const PTRACE_KILL: ::c_uint = 8; +pub const PTRACE_SINGLESTEP: ::c_uint = 9; +pub const PTRACE_GETREGS: ::c_uint = 12; +pub const PTRACE_SETREGS: ::c_uint = 13; +pub const PTRACE_GETFPREGS: ::c_uint = 14; +pub const PTRACE_SETFPREGS: ::c_uint = 15; +pub const PTRACE_ATTACH: ::c_uint = 16; +pub const PTRACE_DETACH: ::c_uint = 17; +pub const PTRACE_SYSCALL: ::c_uint = 24; +pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203; +pub const PTRACE_GETREGSET: ::c_uint = 0x4204; +pub const PTRACE_SETREGSET: ::c_uint = 0x4205; +pub const PTRACE_SEIZE: ::c_uint = 0x4206; +pub const PTRACE_INTERRUPT: ::c_uint = 0x4207; +pub const PTRACE_LISTEN: ::c_uint = 0x4208; +pub const PTRACE_PEEKSIGINFO: ::c_uint = 0x4209; + +pub const MADV_DODUMP: ::c_int = 17; +pub const MADV_DONTDUMP: ::c_int = 16; + +pub const EPOLLWAKEUP: ::c_int = 0x20000000; + +pub const MADV_HUGEPAGE: ::c_int = 14; +pub const MADV_NOHUGEPAGE: ::c_int = 15; +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const EFD_NONBLOCK: ::c_int = 0x800; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; + +pub const SEEK_DATA: ::c_int = 3; +pub const SEEK_HOLE: ::c_int = 4; + +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const TCGETS: ::c_ulong = 0x5401; +pub const TCSETS: ::c_ulong = 0x5402; +pub const TCSETSW: ::c_ulong = 0x5403; +pub const TCSETSF: ::c_ulong = 0x5404; +pub const TCGETA: ::c_ulong = 0x5405; +pub const TCSETA: ::c_ulong = 0x5406; +pub const TCSETAW: ::c_ulong = 0x5407; +pub const TCSETAF: ::c_ulong = 0x5408; +pub const TCSBRK: ::c_ulong = 0x5409; +pub const TCXONC: ::c_ulong = 0x540A; +pub const TCFLSH: ::c_ulong = 0x540B; +pub const TIOCGSOFTCAR: ::c_ulong = 0x5419; +pub const TIOCSSOFTCAR: ::c_ulong = 0x541A; +pub const TIOCINQ: ::c_ulong = 0x541B; +pub const TIOCLINUX: ::c_ulong = 0x541C; +pub const TIOCGSERIAL: ::c_ulong = 0x541E; +pub const TIOCEXCL: ::c_ulong = 0x540C; +pub const TIOCNXCL: ::c_ulong = 0x540D; +pub const TIOCSCTTY: ::c_ulong = 0x540E; +pub const TIOCGPGRP: ::c_ulong = 0x540F; +pub const TIOCSPGRP: ::c_ulong = 0x5410; +pub const TIOCOUTQ: ::c_ulong = 0x5411; +pub const TIOCSTI: ::c_ulong = 0x5412; +pub const TIOCGWINSZ: ::c_ulong = 0x5413; +pub const TIOCSWINSZ: ::c_ulong = 0x5414; +pub const TIOCMGET: ::c_ulong = 0x5415; +pub const TIOCMBIS: ::c_ulong = 0x5416; +pub const TIOCMBIC: ::c_ulong = 0x5417; +pub const TIOCMSET: ::c_ulong = 0x5418; +pub const FIONREAD: ::c_ulong = 0x541B; +pub const TIOCCONS: ::c_ulong = 0x541D; + +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead; +pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793; +pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278; +pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448; +pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216; + +pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567; +pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123; +pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF; +pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000; +pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC; +pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4; +pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2; +pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543; + +pub const SYS_gettid: ::c_long = 236; +pub const SYS_perf_event_open: ::c_long = 331; + +#[link(name = "util")] +extern { + pub fn sysctl(name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t) + -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; + pub fn backtrace(buf: *mut *mut ::c_void, + sz: ::c_int) -> ::c_int; + pub fn glob64(pattern: *const ::c_char, + flags: ::c_int, + errfunc: ::dox::Option ::c_int>, + pglob: *mut glob64_t) -> ::c_int; + pub fn globfree64(pglob: *mut glob64_t); + pub fn ptrace(request: ::c_uint, ...) -> ::c_long; + pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t, + cpusetsize: ::size_t, + cpuset: *mut ::cpu_set_t) -> ::c_int; + pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t, + cpusetsize: ::size_t, + cpuset: *const ::cpu_set_t) -> ::c_int; + pub fn getpriority(which: ::__priority_which_t, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::__priority_which_t, who: ::id_t, + prio: ::c_int) -> ::c_int; + pub fn pthread_getaffinity_np(thread: ::pthread_t, + cpusetsize: ::size_t, + cpuset: *mut ::cpu_set_t) -> ::c_int; + pub fn pthread_setaffinity_np(thread: ::pthread_t, + cpusetsize: ::size_t, + cpuset: *const ::cpu_set_t) -> ::c_int; + pub fn sched_getcpu() -> ::c_int; + pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int; + pub fn setcontext(ucp: *const ucontext_t) -> ::c_int; + pub fn makecontext(ucp: *mut ucontext_t, + func: extern fn (), + argc: ::c_int, ...); + pub fn swapcontext(uocp: *mut ucontext_t, + ucp: *const ucontext_t) -> ::c_int; +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/mod.rs new file mode 100644 index 000000000..b20d043d7 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/mod.rs @@ -0,0 +1,998 @@ +use dox::mem; + +pub type sa_family_t = u16; +pub type pthread_key_t = ::c_uint; +pub type speed_t = ::c_uint; +pub type tcflag_t = ::c_uint; +pub type loff_t = ::c_longlong; +pub type clockid_t = ::c_int; +pub type key_t = ::c_int; +pub type id_t = ::c_uint; + +pub enum timezone {} + +s! { + pub struct sockaddr { + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in { + pub sin_family: sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [u8; 8], + } + + pub struct sockaddr_in6 { + pub sin6_family: sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct sockaddr_un { + pub sun_family: sa_family_t, + pub sun_path: [::c_char; 108] + } + + pub struct sockaddr_storage { + pub ss_family: sa_family_t, + __ss_align: ::size_t, + #[cfg(target_pointer_width = "32")] + __ss_pad2: [u8; 128 - 2 * 4], + #[cfg(target_pointer_width = "64")] + __ss_pad2: [u8; 128 - 2 * 8], + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: socklen_t, + + #[cfg(any(target_os = "linux", + target_os = "emscripten", + target_os = "fuchsia"))] + pub ai_addr: *mut ::sockaddr, + + pub ai_canonname: *mut c_char, + + #[cfg(target_os = "android")] + pub ai_addr: *mut ::sockaddr, + + pub ai_next: *mut addrinfo, + } + + pub struct sockaddr_nl { + pub nl_family: ::sa_family_t, + nl_pad: ::c_ushort, + pub nl_pid: u32, + pub nl_groups: u32 + } + + pub struct sockaddr_ll { + pub sll_family: ::c_ushort, + pub sll_protocol: ::c_ushort, + pub sll_ifindex: ::c_int, + pub sll_hatype: ::c_ushort, + pub sll_pkttype: ::c_uchar, + pub sll_halen: ::c_uchar, + pub sll_addr: [::c_uchar; 8] + } + + pub struct fd_set { + fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE], + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + pub tm_gmtoff: ::c_long, + pub tm_zone: *const ::c_char, + } + + pub struct sched_param { + pub sched_priority: ::c_int, + #[cfg(any(target_env = "musl"))] + pub sched_ss_low_priority: ::c_int, + #[cfg(any(target_env = "musl"))] + pub sched_ss_repl_period: ::timespec, + #[cfg(any(target_env = "musl"))] + pub sched_ss_init_budget: ::timespec, + #[cfg(any(target_env = "musl"))] + pub sched_ss_max_repl: ::c_int, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + #[cfg_attr(any(all(target_arch = "x86", + not(target_env = "musl"), + not(target_os = "android")), + target_arch = "x86_64"), + repr(packed))] + pub struct epoll_event { + pub events: ::uint32_t, + pub u64: ::uint64_t, + } + + pub struct utsname { + pub sysname: [::c_char; 65], + pub nodename: [::c_char; 65], + pub release: [::c_char; 65], + pub version: [::c_char; 65], + pub machine: [::c_char; 65], + pub domainname: [::c_char; 65] + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct sigevent { + pub sigev_value: ::sigval, + pub sigev_signo: ::c_int, + pub sigev_notify: ::c_int, + // Actually a union. We only expose sigev_notify_thread_id because it's + // the most useful member + pub sigev_notify_thread_id: ::c_int, + #[cfg(target_pointer_width = "64")] + __unused1: [::c_int; 11], + #[cfg(target_pointer_width = "32")] + __unused1: [::c_int; 12] + } +} + +// intentionally not public, only used for fd_set +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + const ULONG_SIZE: usize = 32; + } else if #[cfg(target_pointer_width = "64")] { + const ULONG_SIZE: usize = 64; + } else { + // Unknown target_pointer_width + } +} + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 2147483647; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 2; +pub const _IOLBF: ::c_int = 1; + +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; + +// Linux-specific fcntls +pub const F_SETLEASE: ::c_int = 1024; +pub const F_GETLEASE: ::c_int = 1025; +pub const F_NOTIFY: ::c_int = 1026; +pub const F_DUPFD_CLOEXEC: ::c_int = 1030; +pub const F_SETPIPE_SZ: ::c_int = 1031; +pub const F_GETPIPE_SZ: ::c_int = 1032; + +// TODO(#235): Include file sealing fcntls once we have a way to verify them. + +pub const SIGTRAP: ::c_int = 5; + +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; + +pub const CLOCK_REALTIME: clockid_t = 0; +pub const CLOCK_MONOTONIC: clockid_t = 1; +pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 2; +pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 3; +pub const CLOCK_MONOTONIC_RAW: clockid_t = 4; +pub const CLOCK_REALTIME_COARSE: clockid_t = 5; +pub const CLOCK_MONOTONIC_COARSE: clockid_t = 6; +pub const CLOCK_BOOTTIME: clockid_t = 7; +pub const CLOCK_REALTIME_ALARM: clockid_t = 8; +pub const CLOCK_BOOTTIME_ALARM: clockid_t = 9; +// TODO(#247) Someday our Travis shall have glibc 2.21 (released in Sep +// 2014.) See also musl/mod.rs +// pub const CLOCK_SGI_CYCLE: clockid_t = 10; +// pub const CLOCK_TAI: clockid_t = 11; +pub const TIMER_ABSTIME: ::c_int = 1; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_LOCKS: ::c_int = 10; +pub const RLIMIT_SIGPENDING: ::c_int = 11; +pub const RLIMIT_MSGQUEUE: ::c_int = 12; +pub const RLIMIT_NICE: ::c_int = 13; +pub const RLIMIT_RTPRIO: ::c_int = 14; + +pub const RUSAGE_SELF: ::c_int = 0; + +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; +pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; + +pub const SOCK_CLOEXEC: ::c_int = O_CLOEXEC; + +pub const S_IFIFO: ::mode_t = 4096; +pub const S_IFCHR: ::mode_t = 8192; +pub const S_IFBLK: ::mode_t = 24576; +pub const S_IFDIR: ::mode_t = 16384; +pub const S_IFREG: ::mode_t = 32768; +pub const S_IFLNK: ::mode_t = 40960; +pub const S_IFSOCK: ::mode_t = 49152; +pub const S_IFMT: ::mode_t = 61440; +pub const S_IRWXU: ::mode_t = 448; +pub const S_IXUSR: ::mode_t = 64; +pub const S_IWUSR: ::mode_t = 128; +pub const S_IRUSR: ::mode_t = 256; +pub const S_IRWXG: ::mode_t = 56; +pub const S_IXGRP: ::mode_t = 8; +pub const S_IWGRP: ::mode_t = 16; +pub const S_IRGRP: ::mode_t = 32; +pub const S_IRWXO: ::mode_t = 7; +pub const S_IXOTH: ::mode_t = 1; +pub const S_IWOTH: ::mode_t = 2; +pub const S_IROTH: ::mode_t = 4; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const LC_CTYPE: ::c_int = 0; +pub const LC_NUMERIC: ::c_int = 1; +pub const LC_TIME: ::c_int = 2; +pub const LC_COLLATE: ::c_int = 3; +pub const LC_MONETARY: ::c_int = 4; +pub const LC_MESSAGES: ::c_int = 5; +pub const LC_ALL: ::c_int = 6; +pub const LC_CTYPE_MASK: ::c_int = (1 << LC_CTYPE); +pub const LC_NUMERIC_MASK: ::c_int = (1 << LC_NUMERIC); +pub const LC_TIME_MASK: ::c_int = (1 << LC_TIME); +pub const LC_COLLATE_MASK: ::c_int = (1 << LC_COLLATE); +pub const LC_MONETARY_MASK: ::c_int = (1 << LC_MONETARY); +pub const LC_MESSAGES_MASK: ::c_int = (1 << LC_MESSAGES); +// LC_ALL_MASK defined per platform + +pub const MAP_FILE: ::c_int = 0x0000; +pub const MAP_SHARED: ::c_int = 0x0001; +pub const MAP_PRIVATE: ::c_int = 0x0002; +pub const MAP_FIXED: ::c_int = 0x0010; + +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +// MS_ flags for msync(2) +pub const MS_ASYNC: ::c_int = 0x0001; +pub const MS_INVALIDATE: ::c_int = 0x0002; +pub const MS_SYNC: ::c_int = 0x0004; + +// MS_ flags for mount(2) +pub const MS_RDONLY: ::c_ulong = 0x01; +pub const MS_NOSUID: ::c_ulong = 0x02; +pub const MS_NODEV: ::c_ulong = 0x04; +pub const MS_NOEXEC: ::c_ulong = 0x08; +pub const MS_SYNCHRONOUS: ::c_ulong = 0x10; +pub const MS_REMOUNT: ::c_ulong = 0x20; +pub const MS_MANDLOCK: ::c_ulong = 0x40; +pub const MS_DIRSYNC: ::c_ulong = 0x80; +pub const MS_NOATIME: ::c_ulong = 0x0400; +pub const MS_NODIRATIME: ::c_ulong = 0x0800; +pub const MS_BIND: ::c_ulong = 0x1000; +pub const MS_MOVE: ::c_ulong = 0x2000; +pub const MS_REC: ::c_ulong = 0x4000; +pub const MS_SILENT: ::c_ulong = 0x8000; +pub const MS_POSIXACL: ::c_ulong = 0x010000; +pub const MS_UNBINDABLE: ::c_ulong = 0x020000; +pub const MS_PRIVATE: ::c_ulong = 0x040000; +pub const MS_SLAVE: ::c_ulong = 0x080000; +pub const MS_SHARED: ::c_ulong = 0x100000; +pub const MS_RELATIME: ::c_ulong = 0x200000; +pub const MS_KERNMOUNT: ::c_ulong = 0x400000; +pub const MS_I_VERSION: ::c_ulong = 0x800000; +pub const MS_STRICTATIME: ::c_ulong = 0x1000000; +pub const MS_ACTIVE: ::c_ulong = 0x40000000; +pub const MS_NOUSER: ::c_ulong = 0x80000000; +pub const MS_MGC_VAL: ::c_ulong = 0xc0ed0000; +pub const MS_MGC_MSK: ::c_ulong = 0xffff0000; +pub const MS_RMT_MASK: ::c_ulong = 0x800051; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EWOULDBLOCK: ::c_int = EAGAIN; + +pub const SCM_RIGHTS: ::c_int = 0x01; +pub const SCM_CREDENTIALS: ::c_int = 0x02; + +pub const IPPROTO_RAW: ::c_int = 255; + +pub const PROT_GROWSDOWN: ::c_int = 0x1000000; +pub const PROT_GROWSUP: ::c_int = 0x2000000; + +pub const MAP_TYPE: ::c_int = 0x000f; + +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; +pub const MADV_REMOVE: ::c_int = 9; +pub const MADV_DONTFORK: ::c_int = 10; +pub const MADV_DOFORK: ::c_int = 11; +pub const MADV_MERGEABLE: ::c_int = 12; +pub const MADV_UNMERGEABLE: ::c_int = 13; +pub const MADV_HWPOISON: ::c_int = 100; + +pub const IFF_UP: ::c_int = 0x1; +pub const IFF_BROADCAST: ::c_int = 0x2; +pub const IFF_DEBUG: ::c_int = 0x4; +pub const IFF_LOOPBACK: ::c_int = 0x8; +pub const IFF_POINTOPOINT: ::c_int = 0x10; +pub const IFF_NOTRAILERS: ::c_int = 0x20; +pub const IFF_RUNNING: ::c_int = 0x40; +pub const IFF_NOARP: ::c_int = 0x80; +pub const IFF_PROMISC: ::c_int = 0x100; +pub const IFF_ALLMULTI: ::c_int = 0x200; +pub const IFF_MASTER: ::c_int = 0x400; +pub const IFF_SLAVE: ::c_int = 0x800; +pub const IFF_MULTICAST: ::c_int = 0x1000; +pub const IFF_PORTSEL: ::c_int = 0x2000; +pub const IFF_AUTOMEDIA: ::c_int = 0x4000; +pub const IFF_DYNAMIC: ::c_int = 0x8000; + +pub const SOL_IP: ::c_int = 0; +pub const SOL_TCP: ::c_int = 6; +pub const SOL_IPV6: ::c_int = 41; +pub const SOL_ICMPV6: ::c_int = 58; +pub const SOL_RAW: ::c_int = 255; +pub const SOL_DECNET: ::c_int = 261; +pub const SOL_X25: ::c_int = 262; +pub const SOL_PACKET: ::c_int = 263; +pub const SOL_ATM: ::c_int = 264; +pub const SOL_AAL: ::c_int = 265; +pub const SOL_IRDA: ::c_int = 266; +pub const SOL_NETBEUI: ::c_int = 267; +pub const SOL_LLC: ::c_int = 268; +pub const SOL_DCCP: ::c_int = 269; +pub const SOL_NETLINK: ::c_int = 270; +pub const SOL_TIPC: ::c_int = 271; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_UNIX: ::c_int = 1; +pub const AF_LOCAL: ::c_int = 1; +pub const AF_INET: ::c_int = 2; +pub const AF_AX25: ::c_int = 3; +pub const AF_IPX: ::c_int = 4; +pub const AF_APPLETALK: ::c_int = 5; +pub const AF_NETROM: ::c_int = 6; +pub const AF_BRIDGE: ::c_int = 7; +pub const AF_ATMPVC: ::c_int = 8; +pub const AF_X25: ::c_int = 9; +pub const AF_INET6: ::c_int = 10; +pub const AF_ROSE: ::c_int = 11; +pub const AF_DECnet: ::c_int = 12; +pub const AF_NETBEUI: ::c_int = 13; +pub const AF_SECURITY: ::c_int = 14; +pub const AF_KEY: ::c_int = 15; +pub const AF_NETLINK: ::c_int = 16; +pub const AF_ROUTE: ::c_int = AF_NETLINK; +pub const AF_PACKET: ::c_int = 17; +pub const AF_ASH: ::c_int = 18; +pub const AF_ECONET: ::c_int = 19; +pub const AF_ATMSVC: ::c_int = 20; +pub const AF_RDS: ::c_int = 21; +pub const AF_SNA: ::c_int = 22; +pub const AF_IRDA: ::c_int = 23; +pub const AF_PPPOX: ::c_int = 24; +pub const AF_WANPIPE: ::c_int = 25; +pub const AF_LLC: ::c_int = 26; +pub const AF_CAN: ::c_int = 29; +pub const AF_TIPC: ::c_int = 30; +pub const AF_BLUETOOTH: ::c_int = 31; +pub const AF_IUCV: ::c_int = 32; +pub const AF_RXRPC: ::c_int = 33; +pub const AF_ISDN: ::c_int = 34; +pub const AF_PHONET: ::c_int = 35; +pub const AF_IEEE802154: ::c_int = 36; +pub const AF_CAIF: ::c_int = 37; +pub const AF_ALG: ::c_int = 38; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_UNIX: ::c_int = AF_UNIX; +pub const PF_LOCAL: ::c_int = AF_LOCAL; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_AX25: ::c_int = AF_AX25; +pub const PF_IPX: ::c_int = AF_IPX; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_NETROM: ::c_int = AF_NETROM; +pub const PF_BRIDGE: ::c_int = AF_BRIDGE; +pub const PF_ATMPVC: ::c_int = AF_ATMPVC; +pub const PF_X25: ::c_int = AF_X25; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_ROSE: ::c_int = AF_ROSE; +pub const PF_DECnet: ::c_int = AF_DECnet; +pub const PF_NETBEUI: ::c_int = AF_NETBEUI; +pub const PF_SECURITY: ::c_int = AF_SECURITY; +pub const PF_KEY: ::c_int = AF_KEY; +pub const PF_NETLINK: ::c_int = AF_NETLINK; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_PACKET: ::c_int = AF_PACKET; +pub const PF_ASH: ::c_int = AF_ASH; +pub const PF_ECONET: ::c_int = AF_ECONET; +pub const PF_ATMSVC: ::c_int = AF_ATMSVC; +pub const PF_RDS: ::c_int = AF_RDS; +pub const PF_SNA: ::c_int = AF_SNA; +pub const PF_IRDA: ::c_int = AF_IRDA; +pub const PF_PPPOX: ::c_int = AF_PPPOX; +pub const PF_WANPIPE: ::c_int = AF_WANPIPE; +pub const PF_LLC: ::c_int = AF_LLC; +pub const PF_CAN: ::c_int = AF_CAN; +pub const PF_TIPC: ::c_int = AF_TIPC; +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; +pub const PF_IUCV: ::c_int = AF_IUCV; +pub const PF_RXRPC: ::c_int = AF_RXRPC; +pub const PF_ISDN: ::c_int = AF_ISDN; +pub const PF_PHONET: ::c_int = AF_PHONET; +pub const PF_IEEE802154: ::c_int = AF_IEEE802154; +pub const PF_CAIF: ::c_int = AF_CAIF; +pub const PF_ALG: ::c_int = AF_ALG; + +pub const SOMAXCONN: ::c_int = 128; + +pub const MSG_OOB: ::c_int = 1; +pub const MSG_PEEK: ::c_int = 2; +pub const MSG_DONTROUTE: ::c_int = 4; +pub const MSG_CTRUNC: ::c_int = 8; +pub const MSG_TRUNC: ::c_int = 0x20; +pub const MSG_DONTWAIT: ::c_int = 0x40; +pub const MSG_EOR: ::c_int = 0x80; +pub const MSG_WAITALL: ::c_int = 0x100; +pub const MSG_FIN: ::c_int = 0x200; +pub const MSG_SYN: ::c_int = 0x400; +pub const MSG_CONFIRM: ::c_int = 0x800; +pub const MSG_RST: ::c_int = 0x1000; +pub const MSG_ERRQUEUE: ::c_int = 0x2000; +pub const MSG_NOSIGNAL: ::c_int = 0x4000; +pub const MSG_MORE: ::c_int = 0x8000; +pub const MSG_WAITFORONE: ::c_int = 0x10000; +pub const MSG_FASTOPEN: ::c_int = 0x20000000; +pub const MSG_CMSG_CLOEXEC: ::c_int = 0x40000000; + +pub const SOCK_RAW: ::c_int = 3; +pub const IPPROTO_ICMP: ::c_int = 1; +pub const IPPROTO_ICMPV6: ::c_int = 58; +pub const IPPROTO_TCP: ::c_int = 6; +pub const IPPROTO_IP: ::c_int = 0; +pub const IPPROTO_IPV6: ::c_int = 41; +pub const IP_MULTICAST_TTL: ::c_int = 33; +pub const IP_MULTICAST_LOOP: ::c_int = 34; +pub const IP_TTL: ::c_int = 2; +pub const IP_HDRINCL: ::c_int = 3; +pub const IP_ADD_MEMBERSHIP: ::c_int = 35; +pub const IP_DROP_MEMBERSHIP: ::c_int = 36; +pub const IP_TRANSPARENT: ::c_int = 19; +pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20; +pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21; + +pub const TCP_NODELAY: ::c_int = 1; +pub const TCP_MAXSEG: ::c_int = 2; +pub const TCP_CORK: ::c_int = 3; +pub const TCP_KEEPIDLE: ::c_int = 4; +pub const TCP_KEEPINTVL: ::c_int = 5; +pub const TCP_KEEPCNT: ::c_int = 6; +pub const TCP_SYNCNT: ::c_int = 7; +pub const TCP_LINGER2: ::c_int = 8; +pub const TCP_DEFER_ACCEPT: ::c_int = 9; +pub const TCP_WINDOW_CLAMP: ::c_int = 10; +pub const TCP_INFO: ::c_int = 11; +pub const TCP_QUICKACK: ::c_int = 12; +pub const TCP_CONGESTION: ::c_int = 13; + +pub const IPV6_MULTICAST_LOOP: ::c_int = 19; +pub const IPV6_V6ONLY: ::c_int = 26; + +pub const SO_DEBUG: ::c_int = 1; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +pub const SS_ONSTACK: ::c_int = 1; +pub const SS_DISABLE: ::c_int = 2; + +pub const PATH_MAX: ::c_int = 4096; + +pub const FD_SETSIZE: usize = 1024; + +pub const EPOLLIN: ::c_int = 0x1; +pub const EPOLLPRI: ::c_int = 0x2; +pub const EPOLLOUT: ::c_int = 0x4; +pub const EPOLLRDNORM: ::c_int = 0x40; +pub const EPOLLRDBAND: ::c_int = 0x80; +pub const EPOLLWRNORM: ::c_int = 0x100; +pub const EPOLLWRBAND: ::c_int = 0x200; +pub const EPOLLMSG: ::c_int = 0x400; +pub const EPOLLERR: ::c_int = 0x8; +pub const EPOLLHUP: ::c_int = 0x10; +pub const EPOLLET: ::c_int = 0x80000000; + +pub const EPOLL_CTL_ADD: ::c_int = 1; +pub const EPOLL_CTL_MOD: ::c_int = 3; +pub const EPOLL_CTL_DEL: ::c_int = 2; + +pub const MNT_DETACH: ::c_int = 0x2; +pub const MNT_EXPIRE: ::c_int = 0x4; + +pub const Q_GETFMT: ::c_int = 0x800004; +pub const Q_GETINFO: ::c_int = 0x800005; +pub const Q_SETINFO: ::c_int = 0x800006; +pub const QIF_BLIMITS: ::uint32_t = 1; +pub const QIF_SPACE: ::uint32_t = 2; +pub const QIF_ILIMITS: ::uint32_t = 4; +pub const QIF_INODES: ::uint32_t = 8; +pub const QIF_BTIME: ::uint32_t = 16; +pub const QIF_ITIME: ::uint32_t = 32; +pub const QIF_LIMITS: ::uint32_t = 5; +pub const QIF_USAGE: ::uint32_t = 10; +pub const QIF_TIMES: ::uint32_t = 48; +pub const QIF_ALL: ::uint32_t = 63; + +pub const MNT_FORCE: ::c_int = 0x1; + +pub const Q_SYNC: ::c_int = 0x800001; +pub const Q_QUOTAON: ::c_int = 0x800002; +pub const Q_QUOTAOFF: ::c_int = 0x800003; +pub const Q_GETQUOTA: ::c_int = 0x800007; +pub const Q_SETQUOTA: ::c_int = 0x800008; + +pub const TCIOFF: ::c_int = 2; +pub const TCION: ::c_int = 3; +pub const TCOOFF: ::c_int = 0; +pub const TCOON: ::c_int = 1; +pub const TCIFLUSH: ::c_int = 0; +pub const TCOFLUSH: ::c_int = 1; +pub const TCIOFLUSH: ::c_int = 2; +pub const NL0: ::c_int = 0x00000000; +pub const NL1: ::c_int = 0x00000100; +pub const TAB0: ::c_int = 0x00000000; +pub const CR0: ::c_int = 0x00000000; +pub const FF0: ::c_int = 0x00000000; +pub const BS0: ::c_int = 0x00000000; +pub const VT0: ::c_int = 0x00000000; +pub const VERASE: usize = 2; +pub const VKILL: usize = 3; +pub const VINTR: usize = 0; +pub const VQUIT: usize = 1; +pub const VLNEXT: usize = 15; +pub const IGNBRK: ::tcflag_t = 0x00000001; +pub const BRKINT: ::tcflag_t = 0x00000002; +pub const IGNPAR: ::tcflag_t = 0x00000004; +pub const PARMRK: ::tcflag_t = 0x00000008; +pub const INPCK: ::tcflag_t = 0x00000010; +pub const ISTRIP: ::tcflag_t = 0x00000020; +pub const INLCR: ::tcflag_t = 0x00000040; +pub const IGNCR: ::tcflag_t = 0x00000080; +pub const ICRNL: ::tcflag_t = 0x00000100; +pub const IXANY: ::tcflag_t = 0x00000800; +pub const IMAXBEL: ::tcflag_t = 0x00002000; +pub const IUTF8: ::tcflag_t = 0x00004000; +pub const OPOST: ::tcflag_t = 0x1; +pub const CS5: ::tcflag_t = 0x00000000; +pub const CRTSCTS: ::tcflag_t = 0x80000000; +pub const ECHO: ::tcflag_t = 0x00000008; + +pub const CLONE_VM: ::c_int = 0x100; +pub const CLONE_FS: ::c_int = 0x200; +pub const CLONE_FILES: ::c_int = 0x400; +pub const CLONE_SIGHAND: ::c_int = 0x800; +pub const CLONE_PTRACE: ::c_int = 0x2000; +pub const CLONE_VFORK: ::c_int = 0x4000; +pub const CLONE_PARENT: ::c_int = 0x8000; +pub const CLONE_THREAD: ::c_int = 0x10000; +pub const CLONE_NEWNS: ::c_int = 0x20000; +pub const CLONE_SYSVSEM: ::c_int = 0x40000; +pub const CLONE_SETTLS: ::c_int = 0x80000; +pub const CLONE_PARENT_SETTID: ::c_int = 0x100000; +pub const CLONE_CHILD_CLEARTID: ::c_int = 0x200000; +pub const CLONE_DETACHED: ::c_int = 0x400000; +pub const CLONE_UNTRACED: ::c_int = 0x800000; +pub const CLONE_CHILD_SETTID: ::c_int = 0x01000000; +pub const CLONE_NEWUTS: ::c_int = 0x04000000; +pub const CLONE_NEWIPC: ::c_int = 0x08000000; +pub const CLONE_NEWUSER: ::c_int = 0x10000000; +pub const CLONE_NEWPID: ::c_int = 0x20000000; +pub const CLONE_NEWNET: ::c_int = 0x40000000; +pub const CLONE_IO: ::c_int = 0x80000000; + +pub const WNOHANG: ::c_int = 0x00000001; +pub const WUNTRACED: ::c_int = 0x00000002; +pub const WSTOPPED: ::c_int = WUNTRACED; +pub const WEXITED: ::c_int = 0x00000004; +pub const WCONTINUED: ::c_int = 0x00000008; +pub const WNOWAIT: ::c_int = 0x01000000; + +pub const __WNOTHREAD: ::c_int = 0x20000000; +pub const __WALL: ::c_int = 0x40000000; +pub const __WCLONE: ::c_int = 0x80000000; + +pub const SPLICE_F_MOVE: ::c_uint = 0x01; +pub const SPLICE_F_NONBLOCK: ::c_uint = 0x02; +pub const SPLICE_F_MORE: ::c_uint = 0x04; +pub const SPLICE_F_GIFT: ::c_uint = 0x08; + +pub const RTLD_LOCAL: ::c_int = 0; + +pub const POSIX_FADV_NORMAL: ::c_int = 0; +pub const POSIX_FADV_RANDOM: ::c_int = 1; +pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_FADV_WILLNEED: ::c_int = 3; + +pub const AT_FDCWD: ::c_int = -100; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x100; +pub const AT_REMOVEDIR: ::c_int = 0x200; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400; +pub const AT_NO_AUTOMOUNT: ::c_int = 0x800; +pub const AT_EMPTY_PATH: ::c_int = 0x1000; + +pub const LOG_CRON: ::c_int = 9 << 3; +pub const LOG_AUTHPRIV: ::c_int = 10 << 3; +pub const LOG_FTP: ::c_int = 11 << 3; +pub const LOG_PERROR: ::c_int = 0x20; + +pub const PIPE_BUF: usize = 4096; + +pub const SI_LOAD_SHIFT: ::c_uint = 16; + +pub const SIGEV_SIGNAL: ::c_int = 0; +pub const SIGEV_NONE: ::c_int = 1; +pub const SIGEV_THREAD: ::c_int = 2; + +pub const P_ALL: idtype_t = 0; +pub const P_PID: idtype_t = 1; +pub const P_PGID: idtype_t = 2; + +pub const UTIME_OMIT: c_long = 1073741822; +pub const UTIME_NOW: c_long = 1073741823; + +f! { + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] &= !(1 << (fd % size)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool { + let fd = fd as usize; + let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; + return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] |= 1 << (fd % size); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } + + pub fn WIFSTOPPED(status: ::c_int) -> bool { + (status & 0xff) == 0x7f + } + + pub fn WSTOPSIG(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub fn WIFCONTINUED(status: ::c_int) -> bool { + status == 0xffff + } + + pub fn WIFSIGNALED(status: ::c_int) -> bool { + ((status & 0x7f) + 1) as i8 >= 2 + } + + pub fn WTERMSIG(status: ::c_int) -> ::c_int { + status & 0x7f + } + + pub fn WIFEXITED(status: ::c_int) -> bool { + (status & 0x7f) == 0 + } + + pub fn WEXITSTATUS(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub fn WCOREDUMP(status: ::c_int) -> bool { + (status & 0x80) != 0 + } +} + +extern { + pub fn getpwnam_r(name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd) -> ::c_int; + pub fn getpwuid_r(uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd) -> ::c_int; + pub fn fdatasync(fd: ::c_int) -> ::c_int; + pub fn mincore(addr: *mut ::c_void, len: ::size_t, + vec: *mut ::c_uchar) -> ::c_int; + pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_nanosleep(clk_id: clockid_t, + flags: ::c_int, + rqtp: *const ::timespec, + rmtp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn prctl(option: ::c_int, ...) -> ::c_int; + pub fn pthread_getattr_np(native: ::pthread_t, + attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t) -> ::c_int; + pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t) -> ::c_int; + pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; + pub fn setgroups(ngroups: ::size_t, + ptr: *const ::gid_t) -> ::c_int; + pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int; + pub fn sched_setscheduler(pid: ::pid_t, + policy: ::c_int, + param: *const sched_param) -> ::c_int; + pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; + pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int; + pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; + pub fn epoll_create(size: ::c_int) -> ::c_int; + pub fn epoll_create1(flags: ::c_int) -> ::c_int; + pub fn epoll_ctl(epfd: ::c_int, + op: ::c_int, + fd: ::c_int, + event: *mut epoll_event) -> ::c_int; + pub fn epoll_wait(epfd: ::c_int, + events: *mut epoll_event, + maxevents: ::c_int, + timeout: ::c_int) -> ::c_int; + pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; + pub fn mount(src: *const ::c_char, + target: *const ::c_char, + fstype: *const ::c_char, + flags: ::c_ulong, + data: *const ::c_void) -> ::c_int; + pub fn umount(target: *const ::c_char) -> ::c_int; + pub fn umount2(target: *const ::c_char, flags: ::c_int) -> ::c_int; + pub fn clone(cb: extern fn(*mut ::c_void) -> ::c_int, + child_stack: *mut ::c_void, + flags: ::c_int, + arg: *mut ::c_void, ...) -> ::c_int; + pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; + pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; + pub fn memrchr(cx: *const ::c_void, + c: ::c_int, + n: ::size_t) -> *mut ::c_void; + pub fn syscall(num: ::c_long, ...) -> ::c_long; + pub fn sendfile(out_fd: ::c_int, + in_fd: ::c_int, + offset: *mut off_t, + count: ::size_t) -> ::ssize_t; + pub fn splice(fd_in: ::c_int, + off_in: *mut ::loff_t, + fd_out: ::c_int, + off_out: *mut ::loff_t, + len: ::size_t, + flags: ::c_uint) -> ::ssize_t; + pub fn tee(fd_in: ::c_int, + fd_out: ::c_int, + len: ::size_t, + flags: ::c_uint) -> ::ssize_t; + pub fn vmsplice(fd: ::c_int, + iov: *const ::iovec, + nr_segs: ::size_t, + flags: ::c_uint) -> ::ssize_t; + + pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, + advise: ::c_int) -> ::c_int; + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn utimensat(dirfd: ::c_int, path: *const ::c_char, + times: *const ::timespec, flag: ::c_int) -> ::c_int; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t); + pub fn newlocale(mask: ::c_int, + locale: *const ::c_char, + base: ::locale_t) -> ::locale_t; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn creat64(path: *const c_char, mode: mode_t) -> ::c_int; + pub fn fstat64(fildes: ::c_int, buf: *mut stat64) -> ::c_int; + pub fn ftruncate64(fd: ::c_int, length: off64_t) -> ::c_int; + pub fn getrlimit64(resource: ::c_int, rlim: *mut rlimit64) -> ::c_int; + pub fn lseek64(fd: ::c_int, offset: off64_t, whence: ::c_int) -> off64_t; + pub fn lstat64(path: *const c_char, buf: *mut stat64) -> ::c_int; + pub fn mmap64(addr: *mut ::c_void, + len: ::size_t, + prot: ::c_int, + flags: ::c_int, + fd: ::c_int, + offset: off64_t) + -> *mut ::c_void; + pub fn open64(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; + pub fn openat64(fd: ::c_int, + path: *const c_char, + oflag: ::c_int, ...) -> ::c_int; + pub fn pread64(fd: ::c_int, buf: *mut ::c_void, count: ::size_t, + offset: off64_t) -> ::ssize_t; + pub fn pwrite64(fd: ::c_int, buf: *const ::c_void, count: ::size_t, + offset: off64_t) -> ::ssize_t; + pub fn readdir64(dirp: *mut ::DIR) -> *mut ::dirent64; + pub fn readdir64_r(dirp: *mut ::DIR, entry: *mut ::dirent64, + result: *mut *mut ::dirent64) -> ::c_int; + pub fn setrlimit64(resource: ::c_int, rlim: *const rlimit64) -> ::c_int; + pub fn stat64(path: *const c_char, buf: *mut stat64) -> ::c_int; + pub fn truncate64(path: *const c_char, length: off64_t) -> ::c_int; + pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; + pub fn sysinfo (info: *mut ::sysinfo) -> ::c_int; + + pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; + + pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t, dev: dev_t) -> ::c_int; + pub fn ppoll(fds: *mut ::pollfd, + nfds: nfds_t, + timeout: *const ::timespec, + sigmask: *const sigset_t) -> ::c_int; + pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t, + clock_id: *mut clockid_t) -> ::c_int; + pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, + clock_id: clockid_t) -> ::c_int; + pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, + pshared: ::c_int) -> ::c_int; + pub fn pthread_condattr_getpshared(attr: *const pthread_condattr_t, + pshared: *mut ::c_int) -> ::c_int; + pub fn sched_getaffinity(pid: ::pid_t, + cpusetsize: ::size_t, + cpuset: *mut cpu_set_t) -> ::c_int; + pub fn sched_setaffinity(pid: ::pid_t, + cpusetsize: ::size_t, + cpuset: *const cpu_set_t) -> ::c_int; + pub fn unshare(flags: ::c_int) -> ::c_int; + pub fn setns(fd: ::c_int, nstype: ::c_int) -> ::c_int; + pub fn sem_timedwait(sem: *mut sem_t, + abstime: *const ::timespec) -> ::c_int; + pub fn accept4(fd: ::c_int, addr: *mut ::sockaddr, len: *mut ::socklen_t, + flg: ::c_int) -> ::c_int; + pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t, + abstime: *const ::timespec) -> ::c_int; + pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t, + pshared: ::c_int) -> ::c_int; + pub fn pthread_mutexattr_getpshared(attr: *const pthread_mutexattr_t, + pshared: *mut ::c_int) -> ::c_int; + pub fn ptsname_r(fd: ::c_int, + buf: *mut ::c_char, + buflen: ::size_t) -> ::c_int; + pub fn clearenv() -> ::c_int; + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, + options: ::c_int) -> ::c_int; +} + +cfg_if! { + if #[cfg(any(target_os = "linux", + target_os = "emscripten", + target_os = "fuchsia"))] { + mod linux; + pub use self::linux::*; + } else if #[cfg(target_os = "android")] { + mod android; + pub use self::android::*; + } else { + // Unknown target_os + } +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/solaris/mod.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/solaris/mod.rs new file mode 100644 index 000000000..757d5817e --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/unix/solaris/mod.rs @@ -0,0 +1,1194 @@ +use dox::{mem, Option}; + +pub type c_char = i8; +pub type c_long = i64; +pub type c_ulong = u64; + +pub type clockid_t = ::c_int; +pub type blkcnt_t = ::c_long; +pub type clock_t = ::c_long; +pub type daddr_t = ::c_long; +pub type dev_t = ::c_ulong; +pub type fsblkcnt_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type ino_t = ::c_ulong; +pub type key_t = ::c_int; +pub type major_t = ::c_uint; +pub type minor_t = ::c_uint; +pub type mode_t = ::c_uint; +pub type nlink_t = ::c_uint; +pub type rlim_t = ::c_ulong; +pub type speed_t = ::c_uint; +pub type tcflag_t = ::c_uint; +pub type time_t = ::c_long; +pub type wchar_t = ::c_int; +pub type nfds_t = ::c_ulong; + +pub type suseconds_t = ::c_long; +pub type off_t = ::c_long; +pub type useconds_t = ::c_uint; +pub type socklen_t = ::c_uint; +pub type sa_family_t = u16; +pub type pthread_t = ::c_uint; +pub type pthread_key_t = ::c_uint; +pub type blksize_t = ::c_int; +pub type fflags_t = ::c_int; +pub type nl_item = ::c_int; +pub type id_t = ::c_int; +pub type idtype_t = ::c_uint; + +pub enum timezone {} + +s! { + pub struct sockaddr { + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in { + pub sin_family: sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::c_char; 8] + } + + pub struct sockaddr_in6 { + pub sin6_family: sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + pub __sin6_src_id: u32 + } + + pub struct sockaddr_un { + pub sun_family: sa_family_t, + pub sun_path: [c_char; 108] + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_age: *mut ::c_char, + pub pw_comment: *mut ::c_char, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char + } + + pub struct ifaddrs { + pub ifa_next: *mut ifaddrs, + pub ifa_name: *mut ::c_char, + pub ifa_flags: ::c_ulong, + pub ifa_addr: *mut ::sockaddr, + pub ifa_netmask: *mut ::sockaddr, + pub ifa_dstaddr: *mut ::sockaddr, + pub ifa_data: *mut ::c_void + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int + } + + pub struct utsname { + pub sysname: [::c_char; 257], + pub nodename: [::c_char; 257], + pub release: [::c_char; 257], + pub version: [::c_char; 257], + pub machine: [::c_char; 257], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct fd_set { + #[cfg(target_pointer_width = "64")] + fds_bits: [i64; FD_SETSIZE / 64], + #[cfg(target_pointer_width = "32")] + fds_bits: [i32; FD_SETSIZE / 32], + } + + pub struct pthread_attr_t { + __pthread_attrp: *mut ::c_void + } + + pub struct pthread_mutex_t { + __pthread_mutex_flag1: u16, + __pthread_mutex_flag2: u8, + __pthread_mutex_ceiling: u8, + __pthread_mutex_type: u16, + __pthread_mutex_magic: u16, + __pthread_mutex_lock: u64, + __pthread_mutex_data: u64 + } + + pub struct pthread_mutexattr_t { + __pthread_mutexattrp: *mut ::c_void + } + + pub struct pthread_cond_t { + __pthread_cond_flag: [u8; 4], + __pthread_cond_type: u16, + __pthread_cond_magic: u16, + __pthread_cond_data: u64 + } + + pub struct pthread_condattr_t { + __pthread_condattrp: *mut ::c_void, + } + + pub struct pthread_rwlock_t { + __pthread_rwlock_readers: i32, + __pthread_rwlock_type: u16, + __pthread_rwlock_magic: u16, + __pthread_rwlock_mutex: ::pthread_mutex_t, + __pthread_rwlock_readercv: ::pthread_cond_t, + __pthread_rwlock_writercv: ::pthread_cond_t + } + + pub struct dirent { + pub d_ino: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: u16, + pub d_name: [::c_char; 1] + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut ::c_char, + pub gl_offs: ::size_t, + __unused1: *mut ::c_void, + __unused2: ::c_int, + __unused3: ::c_int, + __unused4: ::c_int, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + __unused8: *mut ::c_void, + __unused9: *mut ::c_void, + __unused10: *mut ::c_void, + } + + pub struct sockaddr_storage { + pub ss_family: ::sa_family_t, + __ss_pad1: [u8; 6], + __ss_align: i64, + __ss_pad2: [u8; 240], + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: ::socklen_t, + pub ai_canonname: *mut ::c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut addrinfo, + } + + pub struct sigset_t { + bits: [u32; 4], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + pub si_pad: ::c_int, + pub si_addr: *mut ::c_void, + __pad: [u8; 232], + } + + pub struct sigaction { + pub sa_flags: ::c_int, + pub sa_sigaction: ::sighandler_t, + pub sa_mask: sigset_t, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_basetype: [::c_char; 16], + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub f_fstr: [::c_char; 32] + } + + pub struct sched_param { + pub sched_priority: ::c_int, + sched_pad: [::c_int; 8] + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + __unused: [::c_char; 16] + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_cc: [::cc_t; ::NCCS] + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct sem_t { + pub sem_count: u32, + pub sem_type: u16, + pub sem_magic: u16, + pub sem_pad1: [u64; 3], + pub sem_pad2: [u64; 2] + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_sysid: ::c_int, + pub l_pid: ::pid_t, + pub l_pad: [::c_long; 4] + } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } + + pub struct port_event { + pub portev_events: ::c_int, + pub portev_source: ::c_ushort, + pub portev_pad: ::c_ushort, + pub portev_object: ::uintptr_t, + pub portev_user: ::uintptr_t, + } +} + +pub const LC_CTYPE: ::c_int = 0; +pub const LC_NUMERIC: ::c_int = 1; +pub const LC_TIME: ::c_int = 2; +pub const LC_COLLATE: ::c_int = 3; +pub const LC_MONETARY: ::c_int = 4; +pub const LC_MESSAGES: ::c_int = 5; +pub const LC_ALL: ::c_int = 6; +pub const LC_CTYPE_MASK: ::c_int = (1 << LC_CTYPE); +pub const LC_NUMERIC_MASK: ::c_int = (1 << LC_NUMERIC); +pub const LC_TIME_MASK: ::c_int = (1 << LC_TIME); +pub const LC_COLLATE_MASK: ::c_int = (1 << LC_COLLATE); +pub const LC_MONETARY_MASK: ::c_int = (1 << LC_MONETARY); +pub const LC_MESSAGES_MASK: ::c_int = (1 << LC_MESSAGES); +pub const LC_ALL_MASK: ::c_int = LC_CTYPE_MASK + | LC_NUMERIC_MASK + | LC_TIME_MASK + | LC_COLLATE_MASK + | LC_MONETARY_MASK + | LC_MESSAGES_MASK; + +pub const DAY_1: ::nl_item = 1; +pub const DAY_2: ::nl_item = 2; +pub const DAY_3: ::nl_item = 3; +pub const DAY_4: ::nl_item = 4; +pub const DAY_5: ::nl_item = 5; +pub const DAY_6: ::nl_item = 6; +pub const DAY_7: ::nl_item = 7; + +pub const ABDAY_1: ::nl_item = 8; +pub const ABDAY_2: ::nl_item = 9; +pub const ABDAY_3: ::nl_item = 10; +pub const ABDAY_4: ::nl_item = 11; +pub const ABDAY_5: ::nl_item = 12; +pub const ABDAY_6: ::nl_item = 13; +pub const ABDAY_7: ::nl_item = 14; + +pub const MON_1: ::nl_item = 15; +pub const MON_2: ::nl_item = 16; +pub const MON_3: ::nl_item = 17; +pub const MON_4: ::nl_item = 18; +pub const MON_5: ::nl_item = 19; +pub const MON_6: ::nl_item = 20; +pub const MON_7: ::nl_item = 21; +pub const MON_8: ::nl_item = 22; +pub const MON_9: ::nl_item = 23; +pub const MON_10: ::nl_item = 24; +pub const MON_11: ::nl_item = 25; +pub const MON_12: ::nl_item = 26; + +pub const ABMON_1: ::nl_item = 27; +pub const ABMON_2: ::nl_item = 28; +pub const ABMON_3: ::nl_item = 29; +pub const ABMON_4: ::nl_item = 30; +pub const ABMON_5: ::nl_item = 31; +pub const ABMON_6: ::nl_item = 32; +pub const ABMON_7: ::nl_item = 33; +pub const ABMON_8: ::nl_item = 34; +pub const ABMON_9: ::nl_item = 35; +pub const ABMON_10: ::nl_item = 36; +pub const ABMON_11: ::nl_item = 37; +pub const ABMON_12: ::nl_item = 38; + +pub const RADIXCHAR: ::nl_item = 39; +pub const THOUSEP: ::nl_item = 40; +pub const YESSTR: ::nl_item = 41; +pub const NOSTR: ::nl_item = 42; +pub const CRNCYSTR: ::nl_item = 43; + +pub const D_T_FMT: ::nl_item = 44; +pub const D_FMT: ::nl_item = 45; +pub const T_FMT: ::nl_item = 46; +pub const AM_STR: ::nl_item = 47; +pub const PM_STR: ::nl_item = 48; + +pub const CODESET: ::nl_item = 49; +pub const T_FMT_AMPM: ::nl_item = 50; +pub const ERA: ::nl_item = 51; +pub const ERA_D_FMT: ::nl_item = 52; +pub const ERA_D_T_FMT: ::nl_item = 53; +pub const ERA_T_FMT: ::nl_item = 54; +pub const ALT_DIGITS: ::nl_item = 55; +pub const YESEXPR: ::nl_item = 56; +pub const NOEXPR: ::nl_item = 57; +pub const _DATE_FMT: ::nl_item = 58; +pub const MAXSTRMSG: ::nl_item = 58; + +pub const PATH_MAX: ::c_int = 1024; + +pub const SA_ONSTACK: ::c_int = 0x00000001; +pub const SA_RESETHAND: ::c_int = 0x00000002; +pub const SA_RESTART: ::c_int = 0x00000004; +pub const SA_SIGINFO: ::c_int = 0x00000008; +pub const SA_NODEFER: ::c_int = 0x00000010; +pub const SA_NOCLDWAIT: ::c_int = 0x00010000; +pub const SA_NOCLDSTOP: ::c_int = 0x00020000; + +pub const SS_ONSTACK: ::c_int = 1; +pub const SS_DISABLE: ::c_int = 2; + +pub const FIOCLEX: ::c_int = 0x20006601; +pub const FIONCLEX: ::c_int = 0x20006602; +pub const FIONREAD: ::c_int = 0x4004667f; +pub const FIONBIO: ::c_int = 0x8004667e; +pub const FIOASYNC: ::c_int = 0x8004667d; +pub const FIOSETOWN: ::c_int = 0x8004667c; +pub const FIOGETOWN: ::c_int = 0x4004667b; + +pub const SIGCHLD: ::c_int = 18; +pub const SIGBUS: ::c_int = 10; +pub const SIGINFO: ::c_int = 41; +pub const SIG_BLOCK: ::c_int = 1; +pub const SIG_UNBLOCK: ::c_int = 2; +pub const SIG_SETMASK: ::c_int = 3; + +pub const IPV6_MULTICAST_LOOP: ::c_int = 0x8; +pub const IPV6_V6ONLY: ::c_int = 0x27; + +cfg_if! { + if #[cfg(target_pointer_width = "64")] { + pub const FD_SETSIZE: usize = 65536; + } else { + pub const FD_SETSIZE: usize = 1024; + } +} + +pub const ST_RDONLY: ::c_ulong = 1; +pub const ST_NOSUID: ::c_ulong = 2; + +pub const NI_MAXHOST: ::socklen_t = 1025; + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 32767; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 4; +pub const _IOLBF: ::c_int = 64; +pub const BUFSIZ: ::c_uint = 1024; +pub const FOPEN_MAX: ::c_uint = 20; +pub const FILENAME_MAX: ::c_uint = 1024; +pub const L_tmpnam: ::c_uint = 25; +pub const TMP_MAX: ::c_uint = 17576; + +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; +pub const O_SEARCH: ::c_int = 0x200000; +pub const O_EXEC: ::c_int = 0x400000; +pub const O_APPEND: ::c_int = 8; +pub const O_CREAT: ::c_int = 256; +pub const O_EXCL: ::c_int = 1024; +pub const O_NOCTTY: ::c_int = 2048; +pub const O_TRUNC: ::c_int = 512; +pub const O_CLOEXEC: ::c_int = 0x800000; +pub const O_ACCMODE: ::c_int = 0x600003; +pub const S_IFIFO: mode_t = 4096; +pub const S_IFCHR: mode_t = 8192; +pub const S_IFBLK: mode_t = 24576; +pub const S_IFDIR: mode_t = 16384; +pub const S_IFREG: mode_t = 32768; +pub const S_IFLNK: mode_t = 40960; +pub const S_IFSOCK: mode_t = 49152; +pub const S_IFMT: mode_t = 61440; +pub const S_IEXEC: mode_t = 64; +pub const S_IWRITE: mode_t = 128; +pub const S_IREAD: mode_t = 256; +pub const S_IRWXU: mode_t = 448; +pub const S_IXUSR: mode_t = 64; +pub const S_IWUSR: mode_t = 128; +pub const S_IRUSR: mode_t = 256; +pub const S_IRWXG: mode_t = 56; +pub const S_IXGRP: mode_t = 8; +pub const S_IWGRP: mode_t = 16; +pub const S_IRGRP: mode_t = 32; +pub const S_IRWXO: mode_t = 7; +pub const S_IXOTH: mode_t = 1; +pub const S_IWOTH: mode_t = 2; +pub const S_IROTH: mode_t = 4; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; +pub const F_DUPFD_CLOEXEC: ::c_int = 37; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_GETLK: ::c_int = 14; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGSYS: ::c_int = 12; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; +pub const SIGUSR1: ::c_int = 16; +pub const SIGUSR2: ::c_int = 17; +pub const SIGPWR: ::c_int = 19; +pub const SIGWINCH: ::c_int = 20; +pub const SIGURG: ::c_int = 21; +pub const SIGPOLL: ::c_int = 22; +pub const SIGIO: ::c_int = SIGPOLL; +pub const SIGSTOP: ::c_int = 23; +pub const SIGTSTP: ::c_int = 24; +pub const SIGCONT: ::c_int = 25; +pub const SIGTTIN: ::c_int = 26; +pub const SIGTTOU: ::c_int = 27; +pub const SIGVTALRM: ::c_int = 28; +pub const SIGPROF: ::c_int = 29; +pub const SIGXCPU: ::c_int = 30; +pub const SIGXFSZ: ::c_int = 31; + +pub const WNOHANG: ::c_int = 0x40; +pub const WUNTRACED: ::c_int = 0x04; + +pub const WEXITED: ::c_int = 0x01; +pub const WTRAPPED: ::c_int = 0x02; +pub const WSTOPPED: ::c_int = WUNTRACED; +pub const WCONTINUED: ::c_int = 0x08; +pub const WNOWAIT: ::c_int = 0x80; + +// Solaris defines a great many more of these; we only expose the +// standardized ones. +pub const P_PID: idtype_t = 0; +pub const P_PGID: idtype_t = 2; +pub const P_ALL: idtype_t = 7; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const MAP_SHARED: ::c_int = 0x0001; +pub const MAP_PRIVATE: ::c_int = 0x0002; +pub const MAP_FIXED: ::c_int = 0x0010; +pub const MAP_NORESERVE: ::c_int = 0x40; +pub const MAP_ANON: ::c_int = 0x0100; +pub const MAP_RENAME: ::c_int = 0x20; +pub const MAP_ALIGN: ::c_int = 0x200; +pub const MAP_TEXT: ::c_int = 0x400; +pub const MAP_INITDATA: ::c_int = 0x800; +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const MS_SYNC: ::c_int = 0x0004; +pub const MS_ASYNC: ::c_int = 0x0001; +pub const MS_INVALIDATE: ::c_int = 0x0002; +pub const MS_INVALCURPROC: ::c_int = 0x0008; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const ECHRNG: ::c_int = 37; +pub const EL2NSYNC: ::c_int = 38; +pub const EL3HLT: ::c_int = 39; +pub const EL3RST: ::c_int = 40; +pub const ELNRNG: ::c_int = 41; +pub const EUNATCH: ::c_int = 42; +pub const ENOCSI: ::c_int = 43; +pub const EL2HLT: ::c_int = 44; +pub const EDEADLK: ::c_int = 45; +pub const ENOLCK: ::c_int = 46; +pub const ECANCELED: ::c_int = 47; +pub const ENOTSUP: ::c_int = 48; +pub const EDQUOT: ::c_int = 49; +pub const EBADE: ::c_int = 50; +pub const EBADR: ::c_int = 51; +pub const EXFULL: ::c_int = 52; +pub const ENOANO: ::c_int = 53; +pub const EBADRQC: ::c_int = 54; +pub const EBADSLT: ::c_int = 55; +pub const EDEADLOCK: ::c_int = 56; +pub const EBFONT: ::c_int = 57; +pub const EOWNERDEAD: ::c_int = 58; +pub const ENOTRECOVERABLE: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const ELOCKUNMAPPED: ::c_int = 72; +pub const ENOTACTIVE: ::c_int = 73; +pub const EMULTIHOP: ::c_int = 74; +pub const EADI: ::c_int = 75; +pub const EBADMSG: ::c_int = 77; +pub const ENAMETOOLONG: ::c_int = 78; +pub const EOVERFLOW: ::c_int = 79; +pub const ENOTUNIQ: ::c_int = 80; +pub const EBADFD: ::c_int = 81; +pub const EREMCHG: ::c_int = 82; +pub const ELIBACC: ::c_int = 83; +pub const ELIBBAD: ::c_int = 84; +pub const ELIBSCN: ::c_int = 85; +pub const ELIBMAX: ::c_int = 86; +pub const ELIBEXEC: ::c_int = 87; +pub const EILSEQ: ::c_int = 88; +pub const ENOSYS: ::c_int = 89; +pub const ELOOP: ::c_int = 90; +pub const ERESTART: ::c_int = 91; +pub const ESTRPIPE: ::c_int = 92; +pub const ENOTEMPTY: ::c_int = 93; +pub const EUSERS: ::c_int = 94; +pub const ENOTSOCK: ::c_int = 95; +pub const EDESTADDRREQ: ::c_int = 96; +pub const EMSGSIZE: ::c_int = 97; +pub const EPROTOTYPE: ::c_int = 98; +pub const ENOPROTOOPT: ::c_int = 99; +pub const EPROTONOSUPPORT: ::c_int = 120; +pub const ESOCKTNOSUPPORT: ::c_int = 121; +pub const EOPNOTSUPP: ::c_int = 122; +pub const EPFNOSUPPORT: ::c_int = 123; +pub const EAFNOSUPPORT: ::c_int = 124; +pub const EADDRINUSE: ::c_int = 125; +pub const EADDRNOTAVAIL: ::c_int = 126; +pub const ENETDOWN: ::c_int = 127; +pub const ENETUNREACH: ::c_int = 128; +pub const ENETRESET: ::c_int = 129; +pub const ECONNABORTED: ::c_int = 130; +pub const ECONNRESET: ::c_int = 131; +pub const ENOBUFS: ::c_int = 132; +pub const EISCONN: ::c_int = 133; +pub const ENOTCONN: ::c_int = 134; +pub const ESHUTDOWN: ::c_int = 143; +pub const ETOOMANYREFS: ::c_int = 144; +pub const ETIMEDOUT: ::c_int = 145; +pub const ECONNREFUSED: ::c_int = 146; +pub const EHOSTDOWN: ::c_int = 147; +pub const EHOSTUNREACH: ::c_int = 148; +pub const EWOULDBLOCK: ::c_int = EAGAIN; +pub const EALREADY: ::c_int = 149; +pub const EINPROGRESS: ::c_int = 150; + +pub const EAI_SYSTEM: ::c_int = 11; + +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; + +pub const SIGTRAP: ::c_int = 5; + +pub const GLOB_APPEND : ::c_int = 32; +pub const GLOB_DOOFFS : ::c_int = 16; +pub const GLOB_ERR : ::c_int = 1; +pub const GLOB_MARK : ::c_int = 2; +pub const GLOB_NOCHECK : ::c_int = 8; +pub const GLOB_NOSORT : ::c_int = 4; +pub const GLOB_NOESCAPE: ::c_int = 64; + +pub const GLOB_NOSPACE : ::c_int = -2; +pub const GLOB_ABORTED : ::c_int = -1; +pub const GLOB_NOMATCH : ::c_int = -3; + +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; + +pub const _SC_IOV_MAX: ::c_int = 77; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 569; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 570; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 571; +pub const _SC_MQ_PRIO_MAX: ::c_int = 30; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 577; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 578; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 568; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 572; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 580; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 581; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 579; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 582; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 583; +pub const _SC_THREAD_STACK_MIN: ::c_int = 573; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 574; +pub const _SC_THREADS: ::c_int = 576; +pub const _SC_TTY_NAME_MAX: ::c_int = 575; +pub const _SC_ATEXIT_MAX: ::c_int = 76; +pub const _SC_XOPEN_CRYPT: ::c_int = 62; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 63; +pub const _SC_XOPEN_LEGACY: ::c_int = 717; +pub const _SC_XOPEN_REALTIME: ::c_int = 718; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 719; +pub const _SC_XOPEN_SHM: ::c_int = 64; +pub const _SC_XOPEN_UNIX: ::c_int = 78; +pub const _SC_XOPEN_VERSION: ::c_int = 12; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 67; + +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 0x40; +pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; +pub const PTHREAD_PROCESS_PRIVATE: u16 = 0; +pub const PTHREAD_STACK_MIN: ::size_t = 4096; + +pub const SIGSTKSZ: ::size_t = 8192; + +// https://illumos.org/man/3c/clock_gettime +// https://github.com/illumos/illumos-gate/ +// blob/HEAD/usr/src/lib/libc/amd64/sys/__clock_gettime.s +// clock_gettime(3c) doesn't seem to accept anything other than CLOCK_REALTIME +// or __CLOCK_REALTIME0 +// +// https://github.com/illumos/illumos-gate/ +// blob/HEAD/usr/src/uts/common/sys/time_impl.h +// Confusing! CLOCK_HIGHRES==CLOCK_MONOTONIC==4 +// __CLOCK_REALTIME0==0 is an obsoleted version of CLOCK_REALTIME==3 +pub const CLOCK_REALTIME: clockid_t = 3; +pub const CLOCK_MONOTONIC: clockid_t = 4; +pub const TIMER_RELTIME: ::c_int = 0; +pub const TIMER_ABSTIME: ::c_int = 1; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_NOFILE: ::c_int = 5; +pub const RLIMIT_VMEM: ::c_int = 6; +pub const RLIMIT_AS: ::c_int = RLIMIT_VMEM; + +pub const RLIM_NLIMITS: rlim_t = 7; +pub const RLIM_INFINITY: rlim_t = 0x7fffffff; + +pub const RUSAGE_SELF: ::c_int = 0; +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; +pub const MADV_FREE: ::c_int = 5; + +pub const AF_INET: ::c_int = 2; +pub const AF_INET6: ::c_int = 26; +pub const AF_UNIX: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 1; +pub const SOCK_STREAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 4; +pub const SOCK_RDM: ::c_int = 5; +pub const SOCK_SEQPACKET: ::c_int = 6; +pub const IPPROTO_ICMP: ::c_int = 1; +pub const IPPROTO_ICMPV6: ::c_int = 58; +pub const IPPROTO_TCP: ::c_int = 6; +pub const IPPROTO_IP: ::c_int = 0; +pub const IPPROTO_IPV6: ::c_int = 41; +pub const IP_MULTICAST_TTL: ::c_int = 17; +pub const IP_MULTICAST_LOOP: ::c_int = 18; +pub const IP_TTL: ::c_int = 4; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_ADD_MEMBERSHIP: ::c_int = 19; +pub const IP_DROP_MEMBERSHIP: ::c_int = 20; +pub const IPV6_JOIN_GROUP: ::c_int = 9; +pub const IPV6_LEAVE_GROUP: ::c_int = 10; + +pub const TCP_NODELAY: ::c_int = 1; +pub const TCP_KEEPIDLE: ::c_int = 34; +pub const SOL_SOCKET: ::c_int = 0xffff; +pub const SO_DEBUG: ::c_int = 0x01; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; + +pub const MSG_PEEK: ::c_int = 0x2; + +pub const IFF_LOOPBACK: ::c_int = 0x8; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +pub const F_RDLCK: ::c_short = 1; +pub const F_WRLCK: ::c_short = 2; +pub const F_UNLCK: ::c_short = 3; + +pub const O_SYNC: ::c_int = 16; +pub const O_NONBLOCK: ::c_int = 128; + +pub const IPPROTO_RAW: ::c_int = 255; + +pub const _SC_ARG_MAX: ::c_int = 1; +pub const _SC_CHILD_MAX: ::c_int = 2; +pub const _SC_CLK_TCK: ::c_int = 3; +pub const _SC_NGROUPS_MAX: ::c_int = 4; +pub const _SC_OPEN_MAX: ::c_int = 5; +pub const _SC_JOB_CONTROL: ::c_int = 6; +pub const _SC_SAVED_IDS: ::c_int = 7; +pub const _SC_VERSION: ::c_int = 8; +pub const _SC_PAGESIZE: ::c_int = 11; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 15; +pub const _SC_STREAM_MAX: ::c_int = 16; +pub const _SC_TZNAME_MAX: ::c_int = 17; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 18; +pub const _SC_AIO_MAX: ::c_int = 19; +pub const _SC_BC_BASE_MAX: ::c_int = 54; +pub const _SC_BC_DIM_MAX: ::c_int = 55; +pub const _SC_BC_SCALE_MAX: ::c_int = 56; +pub const _SC_BC_STRING_MAX: ::c_int = 57; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 58; +pub const _SC_EXPR_NEST_MAX: ::c_int = 59; +pub const _SC_LINE_MAX: ::c_int = 60; +pub const _SC_RE_DUP_MAX: ::c_int = 61; +pub const _SC_2_VERSION: ::c_int = 53; +pub const _SC_2_C_BIND: ::c_int = 45; +pub const _SC_2_C_DEV: ::c_int = 46; +pub const _SC_2_CHAR_TERM: ::c_int = 66; +pub const _SC_2_FORT_DEV: ::c_int = 48; +pub const _SC_2_FORT_RUN: ::c_int = 49; +pub const _SC_2_LOCALEDEF: ::c_int = 50; +pub const _SC_2_SW_DEV: ::c_int = 51; +pub const _SC_2_UPE: ::c_int = 52; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 21; +pub const _SC_MAPPED_FILES: ::c_int = 24; +pub const _SC_MEMLOCK: ::c_int = 25; +pub const _SC_MEMLOCK_RANGE: ::c_int = 26; +pub const _SC_MEMORY_PROTECTION: ::c_int = 27; +pub const _SC_MESSAGE_PASSING: ::c_int = 28; +pub const _SC_PRIORITIZED_IO: ::c_int = 31; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 32; +pub const _SC_REALTIME_SIGNALS: ::c_int = 33; +pub const _SC_SEMAPHORES: ::c_int = 35; +pub const _SC_FSYNC: ::c_int = 23; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 38; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 42; +pub const _SC_TIMERS: ::c_int = 43; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 20; +pub const _SC_DELAYTIMER_MAX: ::c_int = 22; +pub const _SC_MQ_OPEN_MAX: ::c_int = 29; +pub const _SC_RTSIG_MAX: ::c_int = 34; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 36; +pub const _SC_SEM_VALUE_MAX: ::c_int = 37; +pub const _SC_SIGQUEUE_MAX: ::c_int = 39; +pub const _SC_TIMER_MAX: ::c_int = 44; + +pub const _MUTEX_MAGIC: u16 = 0x4d58; // MX +pub const _COND_MAGIC: u16 = 0x4356; // CV +pub const _RWL_MAGIC: u16 = 0x5257; // RW + +pub const NCCS: usize = 19; + +pub const LOG_CRON: ::c_int = 15 << 3; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + __pthread_mutex_flag1: 0, + __pthread_mutex_flag2: 0, + __pthread_mutex_ceiling: 0, + __pthread_mutex_type: PTHREAD_PROCESS_PRIVATE, + __pthread_mutex_magic: _MUTEX_MAGIC, + __pthread_mutex_lock: 0, + __pthread_mutex_data: 0 +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + __pthread_cond_flag: [0; 4], + __pthread_cond_type: PTHREAD_PROCESS_PRIVATE, + __pthread_cond_magic: _COND_MAGIC, + __pthread_cond_data: 0 +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + __pthread_rwlock_readers: 0, + __pthread_rwlock_type: PTHREAD_PROCESS_PRIVATE, + __pthread_rwlock_magic: _RWL_MAGIC, + __pthread_rwlock_mutex: PTHREAD_MUTEX_INITIALIZER, + __pthread_rwlock_readercv: PTHREAD_COND_INITIALIZER, + __pthread_rwlock_writercv: PTHREAD_COND_INITIALIZER +}; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 4; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; + +pub const RTLD_NEXT: *mut ::c_void = -1isize as *mut ::c_void; +pub const RTLD_DEFAULT: *mut ::c_void = -2isize as *mut ::c_void; +pub const RTLD_SELF: *mut ::c_void = -3isize as *mut ::c_void; +pub const RTLD_PROBE: *mut ::c_void = -4isize as *mut ::c_void; + +pub const RTLD_NOW: ::c_int = 0x2; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_LOCAL: ::c_int = 0x0; +pub const RTLD_PARENT: ::c_int = 0x200; +pub const RTLD_GROUP: ::c_int = 0x400; +pub const RTLD_WORLD: ::c_int = 0x800; +pub const RTLD_NODELETE: ::c_int = 0x1000; +pub const RTLD_FIRST: ::c_int = 0x2000; +pub const RTLD_CONFGEN: ::c_int = 0x10000; + +pub const PORT_SOURCE_AIO: ::c_int = 1; +pub const PORT_SOURCE_TIMER: ::c_int = 2; +pub const PORT_SOURCE_USER: ::c_int = 3; +pub const PORT_SOURCE_FD: ::c_int = 4; +pub const PORT_SOURCE_ALERT: ::c_int = 5; +pub const PORT_SOURCE_MQ: ::c_int = 6; +pub const PORT_SOURCE_FILE: ::c_int = 7; +pub const PORT_SOURCE_POSTWAIT: ::c_int = 8; +pub const PORT_SOURCE_SIGNAL: ::c_int = 9; + +f! { + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] &= !(1 << (fd % bits)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool { + let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + return ((*set).fds_bits[fd / bits] & (1 << (fd % bits))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] |= 1 << (fd % bits); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } + + pub fn WIFEXITED(status: ::c_int) -> bool { + (status & 0xFF) == 0 + } + + pub fn WEXITSTATUS(status: ::c_int) -> ::c_int { + (status >> 8) & 0xFF + } + + pub fn WTERMSIG(status: ::c_int) -> ::c_int { + status & 0x7F + } +} + +extern { + pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; + pub fn freeifaddrs(ifa: *mut ::ifaddrs); + + pub fn stack_getbounds(sp: *mut ::stack_t) -> ::c_int; + pub fn mincore(addr: *const ::c_void, len: ::size_t, + vec: *mut c_char) -> ::c_int; + pub fn setgroups(ngroups: ::c_int, + ptr: *const ::gid_t) -> ::c_int; + pub fn ioctl(fildes: ::c_int, request: ::c_int, ...) -> ::c_int; + pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int) + -> ::c_int; + pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_nanosleep(clk_id: clockid_t, + flags: ::c_int, + rqtp: *const ::timespec, + rmtp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn getnameinfo(sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int) -> ::c_int; + #[link_name = "__posix_getpwnam_r"] + pub fn getpwnam_r(name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd) -> ::c_int; + + #[link_name = "__posix_getpwuid_r"] + pub fn getpwuid_r(uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd) -> ::c_int; + pub fn setpwent(); + pub fn getpwent() -> *mut passwd; + pub fn fdatasync(fd: ::c_int) -> ::c_int; + pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t); + pub fn newlocale(mask: ::c_int, + locale: *const ::c_char, + base: ::locale_t) -> ::locale_t; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn getprogname() -> *const ::c_char; + pub fn setprogname(name: *const ::c_char); + pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; + pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int; + + pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; + + pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t, dev: dev_t) -> ::c_int; + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); + pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t, + clock_id: *mut clockid_t) -> ::c_int; + pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, + clock_id: clockid_t) -> ::c_int; + pub fn sem_timedwait(sem: *mut sem_t, + abstime: *const ::timespec) -> ::c_int; + pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t, + abstime: *const ::timespec) -> ::c_int; + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, + options: ::c_int) -> ::c_int; + + pub fn glob(pattern: *const ::c_char, + flags: ::c_int, + errfunc: Option ::c_int>, + pglob: *mut ::glob_t) -> ::c_int; + + pub fn globfree(pglob: *mut ::glob_t); + + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) + -> ::c_int; + + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) + -> ::c_int; + + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + + pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, + flags: ::c_int, addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t) -> ::ssize_t; + pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; + pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + + pub fn bind(socket: ::c_int, address: *const ::sockaddr, + address_len: ::socklen_t) -> ::c_int; + + pub fn writev(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int) -> ::ssize_t; + + pub fn sendmsg(fd: ::c_int, + msg: *const ::msghdr, + flags: ::c_int) -> ::ssize_t; + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) + -> ::ssize_t; + + pub fn port_create() -> ::c_int; + pub fn port_associate(port: ::c_int, source: ::c_int, object: ::uintptr_t, + events: ::c_int, user: ::uintptr_t) -> ::c_int; + pub fn port_dissociate(port: ::c_int, source: ::c_int, object: ::uintptr_t) + -> ::c_int; + pub fn port_get(port: ::c_int, pe: *mut port_event, + timeout: *const ::timespec) -> ::c_int; + pub fn port_getn(port: ::c_int, pe_list: *mut port_event, max: ::c_uint, + nget: *mut ::c_uint, timeout: *const ::timespec) + -> ::c_int; +} diff --git a/src/wraith/src/ext/rust/crates/libc-0.2.22/src/windows.rs b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/windows.rs new file mode 100644 index 000000000..6c8332a62 --- /dev/null +++ b/src/wraith/src/ext/rust/crates/libc-0.2.22/src/windows.rs @@ -0,0 +1,235 @@ +//! Windows CRT definitions + +pub type c_char = i8; +pub type c_long = i32; +pub type c_ulong = u32; +pub type wchar_t = u16; + +pub type clock_t = i32; + +cfg_if! { + if #[cfg(all(target_arch = "x86", target_env = "gnu"))] { + pub type time_t = i32; + } else { + pub type time_t = i64; + } +} + +pub type off_t = i32; +pub type dev_t = u32; +pub type ino_t = u16; +pub enum timezone {} +pub type time64_t = i64; + +s! { + // note this is the struct called stat64 in Windows. Not stat, nor stati64. + pub struct stat { + pub st_dev: dev_t, + pub st_ino: ino_t, + pub st_mode: u16, + pub st_nlink: ::c_short, + pub st_uid: ::c_short, + pub st_gid: ::c_short, + pub st_rdev: dev_t, + pub st_size: i64, + pub st_atime: time64_t, + pub st_mtime: time64_t, + pub st_ctime: time64_t, + } + + // note that this is called utimbuf64 in Windows + pub struct utimbuf { + pub actime: time64_t, + pub modtime: time64_t, + } + + pub struct timeval { + pub tv_sec: c_long, + pub tv_usec: c_long, + } + + pub struct timespec { + pub tv_sec: time_t, + pub tv_nsec: c_long, + } +} + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 32767; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 4; +pub const _IOLBF: ::c_int = 64; +pub const BUFSIZ: ::c_uint = 512; +pub const FOPEN_MAX: ::c_uint = 20; +pub const FILENAME_MAX: ::c_uint = 260; + +cfg_if! { + if #[cfg(all(target_env = "gnu"))] { + pub const L_tmpnam: ::c_uint = 14; + pub const TMP_MAX: ::c_uint = 0x7fff; + } else if #[cfg(all(target_env = "msvc"))] { + pub const L_tmpnam: ::c_uint = 260; + pub const TMP_MAX: ::c_uint = 0x7fff_ffff; + } else { + // Unknown target_env + } +} + +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; +pub const O_APPEND: ::c_int = 8; +pub const O_CREAT: ::c_int = 256; +pub const O_EXCL: ::c_int = 1024; +pub const O_TEXT: ::c_int = 16384; +pub const O_BINARY: ::c_int = 32768; +pub const O_NOINHERIT: ::c_int = 128; +pub const O_TRUNC: ::c_int = 512; +pub const S_IFCHR: ::c_int = 8192; +pub const S_IFDIR: ::c_int = 16384; +pub const S_IFREG: ::c_int = 32768; +pub const S_IFMT: ::c_int = 61440; +pub const S_IEXEC: ::c_int = 64; +pub const S_IWRITE: ::c_int = 128; +pub const S_IREAD: ::c_int = 256; + +pub const LC_ALL: ::c_int = 0; +pub const LC_COLLATE: ::c_int = 1; +pub const LC_CTYPE: ::c_int = 2; +pub const LC_MONETARY: ::c_int = 3; +pub const LC_NUMERIC: ::c_int = 4; +pub const LC_TIME: ::c_int = 5; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EDEADLK: ::c_int = 36; +pub const EDEADLOCK: ::c_int = 36; +pub const ENAMETOOLONG: ::c_int = 38; +pub const ENOLCK: ::c_int = 39; +pub const ENOSYS: ::c_int = 40; +pub const ENOTEMPTY: ::c_int = 41; +pub const EILSEQ: ::c_int = 42; +pub const STRUNCATE: ::c_int = 80; + +#[cfg(all(target_env = "msvc", stdbuild))] // " if " -- appease style checker +#[link(name = "msvcrt", cfg(not(target_feature = "crt-static")))] +#[link(name = "libcmt", cfg(target_feature = "crt-static"))] +extern {} + +extern { + #[link_name = "_chmod"] + pub fn chmod(path: *const c_char, mode: ::c_int) -> ::c_int; + #[link_name = "_wchmod"] + pub fn wchmod(path: *const wchar_t, mode: ::c_int) -> ::c_int; + #[link_name = "_mkdir"] + pub fn mkdir(path: *const c_char) -> ::c_int; + #[link_name = "_wrmdir"] + pub fn wrmdir(path: *const wchar_t) -> ::c_int; + #[link_name = "_fstat64"] + pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int; + #[link_name = "_stat64"] + pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int; + #[link_name = "_wstat64"] + pub fn wstat(path: *const wchar_t, buf: *mut stat) -> ::c_int; + #[link_name = "_wutime64"] + pub fn wutime(file: *const wchar_t, buf: *mut utimbuf) -> ::c_int; + #[link_name = "_popen"] + pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; + #[link_name = "_pclose"] + pub fn pclose(stream: *mut ::FILE) -> ::c_int; + #[link_name = "_fdopen"] + pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE; + #[link_name = "_fileno"] + pub fn fileno(stream: *mut ::FILE) -> ::c_int; + #[link_name = "_open"] + pub fn open(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; + #[link_name = "_wopen"] + pub fn wopen(path: *const wchar_t, oflag: ::c_int, ...) -> ::c_int; + #[link_name = "_creat"] + pub fn creat(path: *const c_char, mode: ::c_int) -> ::c_int; + #[link_name = "_access"] + pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int; + #[link_name = "_chdir"] + pub fn chdir(dir: *const c_char) -> ::c_int; + #[link_name = "_close"] + pub fn close(fd: ::c_int) -> ::c_int; + #[link_name = "_dup"] + pub fn dup(fd: ::c_int) -> ::c_int; + #[link_name = "_dup2"] + pub fn dup2(src: ::c_int, dst: ::c_int) -> ::c_int; + #[link_name = "_execv"] + pub fn execv(prog: *const c_char, argv: *const *const c_char) -> ::intptr_t; + #[link_name = "_execve"] + pub fn execve(prog: *const c_char, argv: *const *const c_char, + envp: *const *const c_char) -> ::c_int; + #[link_name = "_execvp"] + pub fn execvp(c: *const c_char, argv: *const *const c_char) -> ::c_int; + #[link_name = "_execvpe"] + pub fn execvpe(c: *const c_char, argv: *const *const c_char, + envp: *const *const c_char) -> ::c_int; + #[link_name = "_getcwd"] + pub fn getcwd(buf: *mut c_char, size: ::c_int) -> *mut c_char; + #[link_name = "_getpid"] + pub fn getpid() -> ::c_int; + #[link_name = "_isatty"] + pub fn isatty(fd: ::c_int) -> ::c_int; + #[link_name = "_lseek"] + pub fn lseek(fd: ::c_int, offset: c_long, origin: ::c_int) -> c_long; + #[link_name = "_pipe"] + pub fn pipe(fds: *mut ::c_int, + psize: ::c_uint, + textmode: ::c_int) -> ::c_int; + #[link_name = "_read"] + pub fn read(fd: ::c_int, buf: *mut ::c_void, count: ::c_uint) -> ::c_int; + #[link_name = "_rmdir"] + pub fn rmdir(path: *const c_char) -> ::c_int; + #[link_name = "_unlink"] + pub fn unlink(c: *const c_char) -> ::c_int; + #[link_name = "_write"] + pub fn write(fd: ::c_int, buf: *const ::c_void, count: ::c_uint) -> ::c_int; + #[link_name = "_commit"] + pub fn commit(fd: ::c_int) -> ::c_int; + #[link_name = "_get_osfhandle"] + pub fn get_osfhandle(fd: ::c_int) -> ::intptr_t; + #[link_name = "_open_osfhandle"] + pub fn open_osfhandle(osfhandle: ::intptr_t, flags: ::c_int) -> ::c_int; + pub fn setlocale(category: ::c_int, locale: *const c_char) -> *mut c_char; + #[link_name = "_wsetlocale"] + pub fn wsetlocale(category: ::c_int, + locale: *const wchar_t) -> *mut wchar_t; +} diff --git a/src/wraith/src/ext/siphash.h b/src/wraith/src/ext/siphash.h new file mode 100644 index 000000000..d9b34b898 --- /dev/null +++ b/src/wraith/src/ext/siphash.h @@ -0,0 +1,13 @@ +#ifndef SIPHASH_H +#define SIPHASH_H + +struct sipkey { + uint64_t k0; + uint64_t k1; +}; +uint64_t siphash24(const void *src, unsigned long src_sz, const struct sipkey *key); + +void siphash_set_global_key(const struct sipkey *key); +uint64_t siphash24g(const void *src, unsigned long src_sz); + +#endif diff --git a/src/wraith/src/ext/strlcat.c b/src/wraith/src/ext/strlcat.c new file mode 100644 index 000000000..316733bcc --- /dev/null +++ b/src/wraith/src/ext/strlcat.c @@ -0,0 +1,70 @@ +/* $OpenBSD: strlcat.c,v 1.8 2001/05/13 15:40:15 deraadt Exp $ */ + +/* + * Copyright (c) 1998 Todd C. Miller + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char *rcsid = "$OpenBSD: strlcat.c,v 1.8 2001/05/13 15:40:15 deraadt Exp $"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * Appends src to string dst of size siz (unlike strncat, siz is the + * full size of dst, not space left). At most siz-1 characters + * will be copied. Always NUL terminates (unless siz <= strlen(dst)). + * Returns strlen(src) + MIN(siz, strlen(initial dst)). + * If retval >= siz, truncation occurred. + */ +size_t +strlcat(char *dst, const char *src, size_t siz) +{ + register char *d = dst; + register const char *s = src; + register size_t n = siz; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (n-- != 0 && *d != '\0') + d++; + dlen = d - dst; + n = siz - dlen; + + if (n == 0) + return(dlen + strlen(s)); + while (*s != '\0') { + if (n != 1) { + *d++ = *s; + n--; + } + s++; + } + *d = '\0'; + + return(dlen + (s - src)); /* count does not include NUL */ +} diff --git a/src/wraith/src/ext/strlcpy.c b/src/wraith/src/ext/strlcpy.c new file mode 100644 index 000000000..9fc47903a --- /dev/null +++ b/src/wraith/src/ext/strlcpy.c @@ -0,0 +1,60 @@ +/* $OpenBSD: strlcpy.c,v 1.2 1998/11/06 04:33:16 wvdputte Exp $ */ + +/* + * Copyright (c) 1998 Todd C. Miller + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char *rcsid = "$OpenBSD: strlcpy.c,v 1.2 1998/11/06 04:33:16 wvdputte Exp $"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * Copy src to string dst of size siz. At most siz-1 characters + * will be copied. Always NUL terminates (unless siz == 0). + * Returns strlen(src); if retval >= siz, truncation occurred. + */ +size_t strlcpy(char *dst, const char *src, size_t siz) +{ + register char *d = dst; + register const char *s = src; + register size_t n = siz; + + if (n == 0) + return(strlen(s)); + while (*s != '\0') { + if (n != 1) { + *d++ = *s; + n--; + } + s++; + } + *d = '\0'; + + return(s - src); /* count does not include NUL */ +} diff --git a/src/wraith/src/ext/timeouts/Rules.shrc b/src/wraith/src/ext/timeouts/Rules.shrc new file mode 100644 index 000000000..ece75d42d --- /dev/null +++ b/src/wraith/src/ext/timeouts/Rules.shrc @@ -0,0 +1,40 @@ +# convert to absolute paths +top_srcdir="$(cd "${top_srcdir}" && pwd -L)" +top_builddir="$(cd "${top_builddir}" && pwd -L)" + +# Paths for Lua modules (benchmarks and installed modules) +export LUA_CPATH="${top_builddir}/lua/5.1/?.so;${top_builddir}/bench/?.so;;" +export LUA_PATH="${top_srcdir}/lua/?.lua;${top_srcdir}/bench/?.lua;;" +export LUA_CPATH_5_2="${top_builddir}/lua/5.2/?.so;${top_builddir}/bench/?.so;;" +export LUA_PATH_5_2="${top_srcdir}/lua/?.lua;${top_srcdir}/bench/?.lua;;" +export LUA_CPATH_5_3="${top_builddir}/lua/5.3/?.so;${top_builddir}/bench/?.so;;" +export LUA_PATH_5_3="${top_srcdir}/lua/?.lua;${top_srcdir}/bench/?.lua;;" + +# preserve stdout so we can print commands to terminal +exec 9>&1; +echo_cmd() { + printf "%s\n" "$*" >&9; + "$@"; +} + +auto_soflags() { + case "$(uname -s)" in + Darwin) + printf -- "-bundle -undefined dynamic_lookup" + ;; + *) + printf -- "-fPIC -shared" + ;; + esac +} + +auto_libs() { + case "$(uname -s)" in + Linux) + printf -- "-lrt" + ;; + *) + ;; + esac +} + diff --git a/src/wraith/src/ext/timeouts/bench/Rules.mk b/src/wraith/src/ext/timeouts/bench/Rules.mk new file mode 100644 index 000000000..3ee72f3ef --- /dev/null +++ b/src/wraith/src/ext/timeouts/bench/Rules.mk @@ -0,0 +1,49 @@ +BENCH_MODS = bench.so $(BENCH_ALGOS:%=bench-%.so) +BENCH_ALGOS = wheel heap llrb +BENCH_OPS = add del expire + +$(top_builddir)/bench/bench.so: $(top_srcdir)/bench/bench.c +$(top_builddir)/bench/bench-wheel.so: $(top_srcdir)/bench/bench-wheel.c +$(top_builddir)/bench/bench-heap.so: $(top_srcdir)/bench/bench-heap.c +$(top_builddir)/bench/bench-llrb.so: $(top_srcdir)/bench/bench-llrb.c + +$(BENCH_MODS:%=$(top_builddir)/bench/%): $(top_srcdir)/timeout.h $(top_srcdir)/timeout.c $(top_srcdir)/bench/bench.h + mkdir -p $(@D) + @$(SHRC); echo_cmd $(CC) -o $@ $(top_srcdir)/bench/$(@F:%.so=%.c) $(ALL_CPPFLAGS) $(ALL_CFLAGS) $(ALL_SOFLAGS) $(ALL_LDFLAGS) $(ALL_LIBS) + +$(BENCH_OPS:%=$(top_builddir)/bench/wheel-%.dat): $(top_builddir)/bench/bench-wheel.so $(top_builddir)/bench/bench.so $(top_srcdir)/bench/bench-aux.lua +$(BENCH_OPS:%=$(top_builddir)/bench/heap-%.dat): $(top_builddir)/bench/bench-heap.so $(top_builddir)/bench/bench.so $(top_srcdir)/bench/bench-aux.lua +$(BENCH_OPS:%=$(top_builddir)/bench/llrb-%.dat): $(top_builddir)/bench/bench-llrb.so $(top_builddir)/bench/bench.so $(top_srcdir)/bench/bench-aux.lua + +$(BENCH_ALGOS:%=$(top_builddir)/bench/%-add.dat): $(top_srcdir)/bench/bench-add.lua + @$(SHRC); echo_cmd cd $(@D) && echo_cmd $(LUA) $${top_srcdir}/bench/bench-add.lua $${top_builddir}/bench/bench-$(@F:%-add.dat=%).so > $(@F).tmp + mv $@.tmp $@ + +$(BENCH_ALGOS:%=$(top_builddir)/bench/%-del.dat): $(top_srcdir)/bench/bench-del.lua + @$(SHRC); echo_cmd cd $(@D) && echo_cmd $(LUA) $${top_srcdir}/bench/bench-del.lua $${top_builddir}/bench/bench-$(@F:%-del.dat=%).so > $(@F).tmp + mv $@.tmp $@ + +$(BENCH_ALGOS:%=$(top_builddir)/bench/%-expire.dat): $(top_srcdir)/bench/bench-expire.lua + @$(SHRC); echo_cmd cd $(@D) && echo_cmd $(LUA) $${top_srcdir}/bench/bench-expire.lua $${top_builddir}/bench/bench-$(@F:%-expire.dat=%).so > $(@F).tmp + mv $@.tmp $@ + +$(top_builddir)/bench/bench.eps: \ + $(BENCH_OPS:%=$(top_builddir)/bench/wheel-%.dat) \ + $(BENCH_OPS:%=$(top_builddir)/bench/heap-%.dat) +# $(BENCH_OPS:%=$(top_builddir)/bench/llrb-%.dat) + +$(top_builddir)/bench/bench.eps: $(top_srcdir)/bench/bench.plt + @$(SHRC); echo_cmd cd $(@D) && echo_cmd gnuplot $${top_srcdir}/bench/bench.plt > $(@F).tmp + mv $@.tmp $@ + +$(top_builddir)/bench/bench.pdf: $(top_builddir)/bench/bench.eps + @$(SHRC); echo_cmd ps2pdf $${top_builddir}/bench/bench.eps $@ + +bench-mods: $(BENCH_MODS:%=$(top_builddir)/bench/%) + +bench-all: $(top_builddir)/bench/bench.pdf + +bench-clean: + $(RM) -r $(top_builddir)/bench/*.so $(top_builddir)/bench/*.dSYM + $(RM) $(top_builddir)/bench/*.dat $(top_builddir)/bench/*.tmp + $(RM) $(top_builddir)/bench/bench.{eps,pdf} diff --git a/src/wraith/src/ext/timeouts/bench/bench-add.lua b/src/wraith/src/ext/timeouts/bench/bench-add.lua new file mode 100644 index 000000000..64a921d3d --- /dev/null +++ b/src/wraith/src/ext/timeouts/bench/bench-add.lua @@ -0,0 +1,30 @@ +#!/usr/bin/env lua + +local bench = require"bench" +local aux = require"bench-aux" + +local lib = ... or aux.optenv("BENCH_L", "bench-wheel.so") +local limit = tonumber(aux.optenv("BENCH_N", 1000000)) +local step = tonumber(aux.optenv("BENCH_S", limit / 100)) +local exp_step = tonumber(aux.optenv("BENCH_E", 1.0)) +local verbose = aux.toboolean(os.getenv("BENCH_V", false)) + +local B = bench.new(lib, count, nil, verbose) +local fill_count, fill_last = B:fill(limit) + +for i=0,limit,step do + local exp_elapsed, fill_elapsed, fill_rate + + -- expire all timeouts + --exp_elapsed = aux.time(B.expire, B, fill_count, fill_last * exp_step) + exp_elapsed = aux.time(B.del, B, 0, fill_count) + assert(B:empty()) + + -- add i timeouts + fill_elapsed, fill_count, fill_last = aux.time(B.fill, B, i) + assert(fill_count == i) + fill_rate = fill_elapsed > 0 and (fill_count / fill_elapsed) or 0 + + local fmt = verbose and "%d\t%f\t(%d/s)\t(exp:%f)" or "%d\t%f" + aux.say(fmt, i, fill_elapsed, fill_rate, exp_elapsed) +end diff --git a/src/wraith/src/ext/timeouts/bench/bench-aux.lua b/src/wraith/src/ext/timeouts/bench/bench-aux.lua new file mode 100644 index 000000000..632124742 --- /dev/null +++ b/src/wraith/src/ext/timeouts/bench/bench-aux.lua @@ -0,0 +1,30 @@ +local bench = require"bench" +local clock = bench.clock + +local aux = {} + +local function time_return(begun, ...) + local duration = clock() - begun + return duration, ... +end + +function aux.time(f, ...) + local begun = clock() + return time_return(begun, f(...)) +end + +function aux.say(...) + print(string.format(...)) +end + +function aux.toboolean(s) + return tostring(s):match("^[1TtYy]") and true or false +end + +function aux.optenv(k, def) + local s = os.getenv(k) + + return (s and #s > 0 and s) or def +end + +return aux diff --git a/src/wraith/src/ext/timeouts/bench/bench-del.lua b/src/wraith/src/ext/timeouts/bench/bench-del.lua new file mode 100644 index 000000000..4306745f2 --- /dev/null +++ b/src/wraith/src/ext/timeouts/bench/bench-del.lua @@ -0,0 +1,25 @@ +#!/usr/bin/env lua + +local bench = require"bench" +local aux = require"bench-aux" + +local lib = ... or aux.optenv("BENCH_L", "bench-wheel.so") +local limit = tonumber(aux.optenv("BENCH_N", 1000000)) +local step = tonumber(aux.optenv("BENCH_S", limit / 100)) +local verbose = aux.toboolean(os.getenv("BENCH_V", false)) + +local B = bench.new(lib, count) + +for i=0,limit,step do + -- add i timeouts + local fill_elapsed, fill_count = aux.time(B.fill, B, i, 60 * 1000000) + assert(i == fill_count) + + --- delete i timeouts + local del_elapsed = aux.time(B.del, B, 0, fill_count) + assert(B:empty()) + local del_rate = i > 0 and i / del_elapsed or 0 + + local fmt = verbose and "%d\t%f\t(%d/s)\t(fill:%f)" or "%d\t%f" + aux.say(fmt, i, del_elapsed, del_rate, fill_elapsed) +end diff --git a/src/wraith/src/ext/timeouts/bench/bench-expire.lua b/src/wraith/src/ext/timeouts/bench/bench-expire.lua new file mode 100644 index 000000000..3e6374ed5 --- /dev/null +++ b/src/wraith/src/ext/timeouts/bench/bench-expire.lua @@ -0,0 +1,29 @@ +#!/usr/bin/env lua + +local bench = require"bench" +local aux = require"bench-aux" + +local lib = ... or aux.optenv("BENCH_L", "bench-wheel.so") +local limit = tonumber(aux.optenv("BENCH_N", 1000000)) +local step = tonumber(aux.optenv("BENCH_S", limit / 100)) +-- expire 1/1000 * #timeouts per clock update +local exp_step = tonumber(aux.optenv("BENCH_E", 0.0001)) +local verbose = aux.toboolean(os.getenv("BENCH_V", false)) + +local B = require"bench".new(lib, count) + +for i=0,limit,step do + -- add i timeouts + local fill_elapsed, fill_count, fill_last = aux.time(B.fill, B, i) + + -- expire timeouts by iteratively updating clock. exp_step is the + -- approximate number of timeouts (as a fraction of the total number + -- of timeouts) that will expire per update. + local exp_elapsed, exp_count = aux.time(B.expire, B, fill_count, math.floor(fill_last * exp_step)) + assert(exp_count == i) + assert(B:empty()) + local exp_rate = i > 0 and i / exp_elapsed or 0 + + local fmt = verbose and "%d\t%f\t(%d/s)\t(fill:%f)" or "%d\t%f" + aux.say(fmt, i, exp_elapsed, exp_rate, fill_elapsed) +end diff --git a/src/wraith/src/ext/timeouts/bench/bench-heap.c b/src/wraith/src/ext/timeouts/bench/bench-heap.c new file mode 100644 index 000000000..f1166a4d7 --- /dev/null +++ b/src/wraith/src/ext/timeouts/bench/bench-heap.c @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2006 Maxim Yegorushkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _MIN_HEAP_H_ +#define _MIN_HEAP_H_ + +#include +#include +#include "timeout.h" +#include "bench.h" + +#define min_heap_idx interval + +typedef timeout_t min_heap_idx_t; + +typedef struct min_heap +{ + struct timeout** p; + unsigned n, a; + timeout_t curtime; +} min_heap_t; + +static inline void min_heap_ctor(min_heap_t* s); +static inline void min_heap_dtor(min_heap_t* s); +static inline void min_heap_elem_init(struct timeout* e); +static inline int min_heap_elem_greater(struct timeout *a, struct timeout *b); +static inline int min_heap_empty(min_heap_t* s); +static inline unsigned min_heap_size(min_heap_t* s); +static inline struct timeout* min_heap_top(min_heap_t* s); +static inline int min_heap_reserve(min_heap_t* s, unsigned n); +static inline int min_heap_push(min_heap_t* s, struct timeout* e); +static inline struct timeout* min_heap_pop(min_heap_t* s); +static inline int min_heap_erase(min_heap_t* s, struct timeout* e); +static inline void min_heap_shift_up_(min_heap_t* s, unsigned hole_index, struct timeout* e); +static inline void min_heap_shift_down_(min_heap_t* s, unsigned hole_index, struct timeout* e); + +int min_heap_elem_greater(struct timeout *a, struct timeout *b) +{ + return a->expires > b->expires; +} + +void min_heap_ctor(min_heap_t* s) { s->p = 0; s->n = 0; s->a = 0; } +void min_heap_dtor(min_heap_t* s) { if(s->p) free(s->p); } +void min_heap_elem_init(struct timeout* e) { e->min_heap_idx = -1; } +int min_heap_empty(min_heap_t* s) { return 0u == s->n; } +unsigned min_heap_size(min_heap_t* s) { return s->n; } +struct timeout* min_heap_top(min_heap_t* s) { return s->n ? *s->p : 0; } + +int min_heap_push(min_heap_t* s, struct timeout* e) +{ + if(min_heap_reserve(s, s->n + 1)) + return -1; + min_heap_shift_up_(s, s->n++, e); + return 0; +} + +struct timeout* min_heap_pop(min_heap_t* s) +{ + if(s->n) + { + struct timeout* e = *s->p; + min_heap_shift_down_(s, 0u, s->p[--s->n]); + e->min_heap_idx = -1; + return e; + } + return 0; +} + +int min_heap_erase(min_heap_t* s, struct timeout* e) +{ + if(((min_heap_idx_t)-1) != e->min_heap_idx) + { + struct timeout *last = s->p[--s->n]; + unsigned parent = (e->min_heap_idx - 1) / 2; + /* we replace e with the last element in the heap. We might need to + shift it upward if it is less than its parent, or downward if it is + greater than one or both its children. Since the children are known + to be less than the parent, it can't need to shift both up and + down. */ + if (e->min_heap_idx > 0 && min_heap_elem_greater(s->p[parent], last)) + min_heap_shift_up_(s, e->min_heap_idx, last); + else + min_heap_shift_down_(s, e->min_heap_idx, last); + e->min_heap_idx = -1; + return 0; + } + return -1; +} + +int min_heap_reserve(min_heap_t* s, unsigned n) +{ + if(s->a < n) + { + struct timeout** p; + unsigned a = s->a ? s->a * 2 : 8; + if(a < n) + a = n; + if(!(p = (struct timeout**)realloc(s->p, a * sizeof *p))) + return -1; + s->p = p; + s->a = a; + } + return 0; +} + +void min_heap_shift_up_(min_heap_t* s, unsigned hole_index, struct timeout* e) +{ + unsigned parent = (hole_index - 1) / 2; + while(hole_index && min_heap_elem_greater(s->p[parent], e)) + { + (s->p[hole_index] = s->p[parent])->min_heap_idx = hole_index; + hole_index = parent; + parent = (hole_index - 1) / 2; + } + (s->p[hole_index] = e)->min_heap_idx = hole_index; +} + +void min_heap_shift_down_(min_heap_t* s, unsigned hole_index, struct timeout* e) +{ + unsigned min_child = 2 * (hole_index + 1); + while(min_child <= s->n) + { + min_child -= min_child == s->n || min_heap_elem_greater(s->p[min_child], s->p[min_child - 1]); + if(!(min_heap_elem_greater(e, s->p[min_child]))) + break; + (s->p[hole_index] = s->p[min_child])->min_heap_idx = hole_index; + hole_index = min_child; + min_child = 2 * (hole_index + 1); + } + min_heap_shift_up_(s, hole_index, e); +} + +#endif /* _MIN_HEAP_H_ */ + + +static void *init(struct timeout *timeout, size_t count, int verbose) { + min_heap_t *H; + size_t i; + + H = calloc(1, sizeof *H); + + min_heap_ctor(H); + if (0 != min_heap_reserve(H, count)) + err(1, "realloc"); + + for (i = 0; i < count; i++) { + min_heap_elem_init(&timeout[i]); + } + + return H; +} /* init() */ + + +static void add(void *ctx, struct timeout *to, timeout_t expires) { + min_heap_t *H = ctx; + min_heap_erase(H, to); + to->expires = H->curtime + expires; + if (0 != min_heap_push(H, to)) + err(1, "realloc"); +} /* add() */ + + +static void del(void *ctx, struct timeout *to) { + min_heap_erase(ctx, to); +} /* del() */ + + +static struct timeout *get(void *ctx) { + min_heap_t *H = ctx; + struct timeout *to; + + if ((to = min_heap_top(H)) && to->expires <= H->curtime) + return min_heap_pop(H); + + return NULL; +} /* get() */ + + +static void update(void *ctx, timeout_t ts) { + min_heap_t *H = ctx; + H->curtime = ts; +} /* update() */ + + +static void check(void *ctx) { + return; +} /* check() */ + + +static int empty(void *ctx) { + min_heap_t *H = ctx; + + return (NULL == min_heap_top(H)); +} /* empty() */ + + +static void destroy(void *H) { + free(H); + return; +} /* destroy() */ + + +const struct benchops benchops = { + .init = &init, + .add = &add, + .del = &del, + .get = &get, + .update = &update, + .check = &check, + .empty = &empty, + .destroy = &destroy, +}; + diff --git a/src/wraith/src/ext/timeouts/bench/bench-llrb.c b/src/wraith/src/ext/timeouts/bench/bench-llrb.c new file mode 100644 index 000000000..bdb02f070 --- /dev/null +++ b/src/wraith/src/ext/timeouts/bench/bench-llrb.c @@ -0,0 +1,425 @@ +/* ========================================================================== + * llrb.h - Iterative Left-leaning Red-Black Tree. + * -------------------------------------------------------------------------- + * Copyright (c) 2011, 2013 William Ahern + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do so, subject to the + * following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * -------------------------------------------------------------------------- + * CREDITS: + * o Algorithm courtesy of Robert Sedgewick, "Left-leaning Red-Black + * Trees" (September 2008); and Robert Sedgewick and Kevin Wayne, + * Algorithms (4th ed. 2011). + * + * Sedgewick touts the simplicity of the recursive implementation, + * but at least for the 2-3 tree variant the iterative approach is + * almost line-for-line identical. The magic of C pointers helps; + * it'd be uglier with Java. + * + * A couple of missing NULL checks were added to Sedgewick's deletion + * example, and insert was optimized to short-circuit rotations when + * walking up the tree. + * + * o Code implemented in the fashion of Niels Provos' excellent *BSD + * sys/tree.h pre-processor library. + * + * Regarding relative performance, I've refrained from sharing my own + * benchmarks. Differences in run-time speed were too correlated to + * compiler options and other external factors. + * + * Provos' delete implementation doesn't need to start at the root of + * the tree. However, RB_REMOVE must be passed the actual node to be + * removed. LLRB_REMOVE merely requires a key, much like + * RB_FIND/LLRB_FIND. + * ========================================================================== + */ +#ifndef LLRB_H +#define LLRB_H + +#define LLRB_VENDOR "william@25thandClement.com" +#define LLRB_VERSION 0x20130925 + +#ifndef LLRB_STATIC +#ifdef __GNUC__ +#define LLRB_STATIC __attribute__((__unused__)) static +#else +#define LLRB_STATIC static +#endif +#endif + +#define LLRB_HEAD(name, type) \ +struct name { struct type *rbh_root; } + +#define LLRB_INITIALIZER(root) { 0 } + +#define LLRB_INIT(root) do { (root)->rbh_root = 0; } while (0) + +#define LLRB_BLACK 0 +#define LLRB_RED 1 + +#define LLRB_ENTRY(type) \ +struct { struct type *rbe_left, *rbe_right, *rbe_parent; _Bool rbe_color; } + +#define LLRB_LEFT(elm, field) (elm)->field.rbe_left +#define LLRB_RIGHT(elm, field) (elm)->field.rbe_right +#define LLRB_PARENT(elm, field) (elm)->field.rbe_parent +#define LLRB_EDGE(head, elm, field) (((elm) == LLRB_ROOT(head))? &LLRB_ROOT(head) : ((elm) == LLRB_LEFT(LLRB_PARENT((elm), field), field))? &LLRB_LEFT(LLRB_PARENT((elm), field), field) : &LLRB_RIGHT(LLRB_PARENT((elm), field), field)) +#define LLRB_COLOR(elm, field) (elm)->field.rbe_color +#define LLRB_ROOT(head) (head)->rbh_root +#define LLRB_EMPTY(head) ((head)->rbh_root == 0) +#define LLRB_ISRED(elm, field) ((elm) && LLRB_COLOR((elm), field) == LLRB_RED) + +#define LLRB_PROTOTYPE(name, type, field, cmp) \ + LLRB_PROTOTYPE_INTERNAL(name, type, field, cmp,) +#define LLRB_PROTOTYPE_STATIC(name, type, field, cmp) \ + LLRB_PROTOTYPE_INTERNAL(name, type, field, cmp, LLRB_STATIC) +#define LLRB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ +attr struct type *name##_LLRB_INSERT(struct name *, struct type *); \ +attr struct type *name##_LLRB_DELETE(struct name *, struct type *); \ +attr struct type *name##_LLRB_FIND(struct name *, struct type *); \ +attr struct type *name##_LLRB_MIN(struct type *); \ +attr struct type *name##_LLRB_MAX(struct type *); \ +attr struct type *name##_LLRB_NEXT(struct type *); + +#define LLRB_GENERATE(name, type, field, cmp) \ + LLRB_GENERATE_INTERNAL(name, type, field, cmp,) +#define LLRB_GENERATE_STATIC(name, type, field, cmp) \ + LLRB_GENERATE_INTERNAL(name, type, field, cmp, LLRB_STATIC) +#define LLRB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ +static inline void name##_LLRB_ROTL(struct type **pivot) { \ + struct type *a = *pivot; \ + struct type *b = LLRB_RIGHT(a, field); \ + if ((LLRB_RIGHT(a, field) = LLRB_LEFT(b, field))) \ + LLRB_PARENT(LLRB_RIGHT(a, field), field) = a; \ + LLRB_LEFT(b, field) = a; \ + LLRB_COLOR(b, field) = LLRB_COLOR(a, field); \ + LLRB_COLOR(a, field) = LLRB_RED; \ + LLRB_PARENT(b, field) = LLRB_PARENT(a, field); \ + LLRB_PARENT(a, field) = b; \ + *pivot = b; \ +} \ +static inline void name##_LLRB_ROTR(struct type **pivot) { \ + struct type *b = *pivot; \ + struct type *a = LLRB_LEFT(b, field); \ + if ((LLRB_LEFT(b, field) = LLRB_RIGHT(a, field))) \ + LLRB_PARENT(LLRB_LEFT(b, field), field) = b; \ + LLRB_RIGHT(a, field) = b; \ + LLRB_COLOR(a, field) = LLRB_COLOR(b, field); \ + LLRB_COLOR(b, field) = LLRB_RED; \ + LLRB_PARENT(a, field) = LLRB_PARENT(b, field); \ + LLRB_PARENT(b, field) = a; \ + *pivot = a; \ +} \ +static inline void name##_LLRB_FLIP(struct type *root) { \ + LLRB_COLOR(root, field) = !LLRB_COLOR(root, field); \ + LLRB_COLOR(LLRB_LEFT(root, field), field) = !LLRB_COLOR(LLRB_LEFT(root, field), field); \ + LLRB_COLOR(LLRB_RIGHT(root, field), field) = !LLRB_COLOR(LLRB_RIGHT(root, field), field); \ +} \ +static inline void name##_LLRB_FIXUP(struct type **root) { \ + if (LLRB_ISRED(LLRB_RIGHT(*root, field), field) && !LLRB_ISRED(LLRB_LEFT(*root, field), field)) \ + name##_LLRB_ROTL(root); \ + if (LLRB_ISRED(LLRB_LEFT(*root, field), field) && LLRB_ISRED(LLRB_LEFT(LLRB_LEFT(*root, field), field), field)) \ + name##_LLRB_ROTR(root); \ + if (LLRB_ISRED(LLRB_LEFT(*root, field), field) && LLRB_ISRED(LLRB_RIGHT(*root, field), field)) \ + name##_LLRB_FLIP(*root); \ +} \ +attr struct type *name##_LLRB_INSERT(struct name *head, struct type *elm) { \ + struct type **root = &LLRB_ROOT(head); \ + struct type *parent = 0; \ + while (*root) { \ + int comp = (cmp)((elm), (*root)); \ + parent = *root; \ + if (comp < 0) \ + root = &LLRB_LEFT(*root, field); \ + else if (comp > 0) \ + root = &LLRB_RIGHT(*root, field); \ + else \ + return *root; \ + } \ + LLRB_LEFT((elm), field) = 0; \ + LLRB_RIGHT((elm), field) = 0; \ + LLRB_COLOR((elm), field) = LLRB_RED; \ + LLRB_PARENT((elm), field) = parent; \ + *root = (elm); \ + while (parent && (LLRB_ISRED(LLRB_LEFT(parent, field), field) || LLRB_ISRED(LLRB_RIGHT(parent, field), field))) { \ + root = LLRB_EDGE(head, parent, field); \ + parent = LLRB_PARENT(parent, field); \ + name##_LLRB_FIXUP(root); \ + } \ + LLRB_COLOR(LLRB_ROOT(head), field) = LLRB_BLACK; \ + return 0; \ +} \ +static inline void name##_LLRB_MOVL(struct type **pivot) { \ + name##_LLRB_FLIP(*pivot); \ + if (LLRB_ISRED(LLRB_LEFT(LLRB_RIGHT(*pivot, field), field), field)) { \ + name##_LLRB_ROTR(&LLRB_RIGHT(*pivot, field)); \ + name##_LLRB_ROTL(pivot); \ + name##_LLRB_FLIP(*pivot); \ + } \ +} \ +static inline void name##_LLRB_MOVR(struct type **pivot) { \ + name##_LLRB_FLIP(*pivot); \ + if (LLRB_ISRED(LLRB_LEFT(LLRB_LEFT(*pivot, field), field), field)) { \ + name##_LLRB_ROTR(pivot); \ + name##_LLRB_FLIP(*pivot); \ + } \ +} \ +static inline struct type *name##_DELETEMIN(struct name *head, struct type **root) { \ + struct type **pivot = root, *deleted, *parent; \ + while (LLRB_LEFT(*pivot, field)) { \ + if (!LLRB_ISRED(LLRB_LEFT(*pivot, field), field) && !LLRB_ISRED(LLRB_LEFT(LLRB_LEFT(*pivot, field), field), field)) \ + name##_LLRB_MOVL(pivot); \ + pivot = &LLRB_LEFT(*pivot, field); \ + } \ + deleted = *pivot; \ + parent = LLRB_PARENT(*pivot, field); \ + *pivot = 0; \ + while (root != pivot) { \ + pivot = LLRB_EDGE(head, parent, field); \ + parent = LLRB_PARENT(parent, field); \ + name##_LLRB_FIXUP(pivot); \ + } \ + return deleted; \ +} \ +attr struct type *name##_LLRB_DELETE(struct name *head, struct type *elm) { \ + struct type **root = &LLRB_ROOT(head), *parent = 0, *deleted = 0; \ + int comp; \ + while (*root) { \ + parent = LLRB_PARENT(*root, field); \ + comp = (cmp)(elm, *root); \ + if (comp < 0) { \ + if (LLRB_LEFT(*root, field) && !LLRB_ISRED(LLRB_LEFT(*root, field), field) && !LLRB_ISRED(LLRB_LEFT(LLRB_LEFT(*root, field), field), field)) \ + name##_LLRB_MOVL(root); \ + root = &LLRB_LEFT(*root, field); \ + } else { \ + if (LLRB_ISRED(LLRB_LEFT(*root, field), field)) { \ + name##_LLRB_ROTR(root); \ + comp = (cmp)(elm, *root); \ + } \ + if (!comp && !LLRB_RIGHT(*root, field)) { \ + deleted = *root; \ + *root = 0; \ + break; \ + } \ + if (LLRB_RIGHT(*root, field) && !LLRB_ISRED(LLRB_RIGHT(*root, field), field) && !LLRB_ISRED(LLRB_LEFT(LLRB_RIGHT(*root, field), field), field)) { \ + name##_LLRB_MOVR(root); \ + comp = (cmp)(elm, *root); \ + } \ + if (!comp) { \ + struct type *orphan = name##_DELETEMIN(head, &LLRB_RIGHT(*root, field)); \ + LLRB_COLOR(orphan, field) = LLRB_COLOR(*root, field); \ + LLRB_PARENT(orphan, field) = LLRB_PARENT(*root, field); \ + if ((LLRB_RIGHT(orphan, field) = LLRB_RIGHT(*root, field))) \ + LLRB_PARENT(LLRB_RIGHT(orphan, field), field) = orphan; \ + if ((LLRB_LEFT(orphan, field) = LLRB_LEFT(*root, field))) \ + LLRB_PARENT(LLRB_LEFT(orphan, field), field) = orphan; \ + deleted = *root; \ + *root = orphan; \ + parent = *root; \ + break; \ + } else \ + root = &LLRB_RIGHT(*root, field); \ + } \ + } \ + while (parent) { \ + root = LLRB_EDGE(head, parent, field); \ + parent = LLRB_PARENT(parent, field); \ + name##_LLRB_FIXUP(root); \ + } \ + if (LLRB_ROOT(head)) \ + LLRB_COLOR(LLRB_ROOT(head), field) = LLRB_BLACK; \ + return deleted; \ +} \ +attr struct type *name##_LLRB_FIND(struct name *head, struct type *key) { \ + struct type *elm = LLRB_ROOT(head); \ + while (elm) { \ + int comp = (cmp)(key, elm); \ + if (comp < 0) \ + elm = LLRB_LEFT(elm, field); \ + else if (comp > 0) \ + elm = LLRB_RIGHT(elm, field); \ + else \ + return elm; \ + } \ + return 0; \ +} \ +attr struct type *name##_LLRB_MIN(struct type *elm) { \ + while (elm && LLRB_LEFT(elm, field)) \ + elm = LLRB_LEFT(elm, field); \ + return elm; \ +} \ +attr struct type *name##_LLRB_MAX(struct type *elm) { \ + while (elm && LLRB_RIGHT(elm, field)) \ + elm = LLRB_RIGHT(elm, field); \ + return elm; \ +} \ +attr struct type *name##_LLRB_NEXT(struct type *elm) { \ + if (LLRB_RIGHT(elm, field)) { \ + return name##_LLRB_MIN(LLRB_RIGHT(elm, field)); \ + } else if (LLRB_PARENT(elm, field)) { \ + if (elm == LLRB_LEFT(LLRB_PARENT(elm, field), field)) \ + return LLRB_PARENT(elm, field); \ + while (LLRB_PARENT(elm, field) && elm == LLRB_RIGHT(LLRB_PARENT(elm, field), field)) \ + elm = LLRB_PARENT(elm, field); \ + return LLRB_PARENT(elm, field); \ + } else return 0; \ +} + +#define LLRB_INSERT(name, head, elm) name##_LLRB_INSERT((head), (elm)) +#define LLRB_DELETE(name, head, elm) name##_LLRB_DELETE((head), (elm)) +#define LLRB_REMOVE(name, head, elm) name##_LLRB_DELETE((head), (elm)) +#define LLRB_FIND(name, head, elm) name##_LLRB_FIND((head), (elm)) +#define LLRB_MIN(name, head) name##_LLRB_MIN(LLRB_ROOT((head))) +#define LLRB_MAX(name, head) name##_LLRB_MAX(LLRB_ROOT((head))) +#define LLRB_NEXT(name, head, elm) name##_LLRB_NEXT((elm)) + +#define LLRB_FOREACH(elm, name, head) \ +for ((elm) = LLRB_MIN(name, head); (elm); (elm) = name##_LLRB_NEXT((elm))) + +#endif /* LLRB_H */ + + +#include + +#include "timeout.h" +#include "bench.h" + + +struct rbtimeout { + timeout_t expires; + + int pending; + + LLRB_ENTRY(rbtimeout) rbe; +}; + +struct rbtimeouts { + timeout_t curtime; + LLRB_HEAD(tree, rbtimeout) tree; +}; + + +static int timeoutcmp(struct rbtimeout *a, struct rbtimeout *b) { + if (a->expires < b->expires) { + return -1; + } else if (a->expires > b->expires) { + return 1; + } else if (a < b) { + return -1; + } else if (a > b) { + return 1; + } else { + return 0; + } +} /* timeoutcmp() */ + +LLRB_GENERATE_STATIC(tree, rbtimeout, rbe, timeoutcmp) + +static void *init(struct timeout *timeout, size_t count, int verbose) { + struct rbtimeouts *T; + size_t i; + + T = malloc(sizeof *T); + T->curtime = 0; + LLRB_INIT(&T->tree); + + for (i = 0; i < count; i++) { + struct rbtimeout *to = (void *)&timeout[i]; + to->expires = 0; + to->pending = 0; + } + + return T; +} /* init() */ + + +static void add(void *ctx, struct timeout *_to, timeout_t expires) { + struct rbtimeouts *T = ctx; + struct rbtimeout *to = (void *)_to; + + if (to->pending) + LLRB_REMOVE(tree, &T->tree, to); + + to->expires = T->curtime + expires; + LLRB_INSERT(tree, &T->tree, to); + to->pending = 1; +} /* add() */ + + +static void del(void *ctx, struct timeout *_to) { + struct rbtimeouts *T = ctx; + struct rbtimeout *to = (void *)_to; + + LLRB_REMOVE(tree, &T->tree, to); + to->pending = 0; + to->expires = 0; +} /* del() */ + + +static struct timeout *get(void *ctx) { + struct rbtimeouts *T = ctx; + struct rbtimeout *to; + + if ((to = LLRB_MIN(tree, &T->tree)) && to->expires <= T->curtime) { + LLRB_REMOVE(tree, &T->tree, to); + to->pending = 0; + to->expires = 0; + + return (void *)to; + } + + return NULL; +} /* get() */ + + +static void update(void *ctx, timeout_t ts) { + struct rbtimeouts *T = ctx; + T->curtime = ts; +} /* update() */ + + +static void check(void *ctx) { + return; +} /* check() */ + + +static int empty(void *ctx) { + struct rbtimeouts *T = ctx; + + return LLRB_EMPTY(&T->tree); +} /* empty() */ + + +static void destroy(void *ctx) { + free(ctx); + return; +} /* destroy() */ + + +const struct benchops benchops = { + .init = &init, + .add = &add, + .del = &del, + .get = &get, + .update = &update, + .check = &check, + .empty = &empty, + .destroy = &destroy, +}; + diff --git a/src/wraith/src/ext/timeouts/bench/bench-wheel.c b/src/wraith/src/ext/timeouts/bench/bench-wheel.c new file mode 100644 index 000000000..0cba1af83 --- /dev/null +++ b/src/wraith/src/ext/timeouts/bench/bench-wheel.c @@ -0,0 +1,81 @@ +#include + +#define TIMEOUT_PUBLIC static + +#include "timeout.h" +#include "timeout.c" +#include "bench.h" + + +static void *init(struct timeout *timeout, size_t count, int verbose) { + struct timeouts *T; + size_t i; + int error; + + T = timeouts_open(TIMEOUT_mHZ, &error); + + for (i = 0; i < count; i++) { + timeout_init(&timeout[i], 0); + } + +#if TIMEOUT_DEBUG - 0 + timeout_debug = verbose; +#endif + + return T; +} /* init() */ + + +static void add(void *T, struct timeout *to, timeout_t expires) { + timeouts_add(T, to, expires); +} /* add() */ + + +static void del(void *T, struct timeout *to) { + timeouts_del(T, to); +} /* del() */ + + +static struct timeout *get(void *T) { + return timeouts_get(T); +} /* get() */ + + +static void update(void *T, timeout_t ts) { + timeouts_update(T, ts); +} /* update() */ + + +static void (check)(void *T) { + if (!timeouts_check(T, stderr)) + _Exit(1); +} /* check() */ + + +static int empty(void *T) { + return !(timeouts_pending(T) || timeouts_expired(T)); +} /* empty() */ + + +static struct timeout *next(void *T, struct timeouts_it *it) { + return timeouts_next(T, it); +} /* next() */ + + +static void destroy(void *T) { + timeouts_close(T); +} /* destroy() */ + + +const struct benchops benchops = { + .init = &init, + .add = &add, + .del = &del, + .get = &get, + .update = &update, + .check = &check, + .empty = &empty, + .next = &next, + .destroy = &destroy +}; + diff --git a/src/wraith/src/ext/timeouts/bench/bench.c b/src/wraith/src/ext/timeouts/bench/bench.c new file mode 100644 index 000000000..0d4cee44a --- /dev/null +++ b/src/wraith/src/ext/timeouts/bench/bench.c @@ -0,0 +1,293 @@ +#include +#include +#include +#include +#include +#include + +#if __APPLE__ +#include +#endif + +#include +#include +#include + +#include "timeout.h" +#include "bench.h" + +#if LUA_VERSION_NUM < 502 +static int lua_absindex(lua_State *L, int idx) { + return (idx > 0 || idx <= LUA_REGISTRYINDEX)? idx : lua_gettop(L) + idx + 1; +} /* lua_absindex() */ + +static void luaL_setfuncs(lua_State *L, const luaL_Reg *l, int nup) { + int i, t = lua_absindex(L, -1 - nup); + + for (; l->name; l++) { + for (i = 0; i < nup; i++) + lua_pushvalue(L, -nup); + lua_pushcclosure(L, l->func, nup); + lua_setfield(L, t, l->name); + } + + lua_pop(L, nup); +} /* luaL_setfuncs() */ + +#define luaL_newlibtable(L, l) \ + lua_createtable(L, 0, (sizeof (l) / sizeof *(l)) - 1) + +#define luaL_newlib(L, l) \ + (luaL_newlibtable((L), (l)), luaL_setfuncs((L), (l), 0)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b))? (a) : (b)) +#endif + + +struct bench { + const char *path; + void *solib; + size_t count; + timeout_t timeout_max; + int verbose; + + void *state; + struct timeout *timeout; + struct benchops ops; + timeout_t curtime; +}; /* struct bench */ + + +#if __APPLE__ +static mach_timebase_info_data_t timebase; +#endif + + +static int long long monotime(void) { +#if __APPLE__ + unsigned long long abt; + + abt = mach_absolute_time(); + abt = abt * timebase.numer / timebase.denom; + + return abt / 1000LL; +#else + struct timespec ts; + + clock_gettime(CLOCK_MONOTONIC, &ts); + + return (ts.tv_sec * 1000000L) + (ts.tv_nsec / 1000L); +#endif +} /* monotime() */ + + +static int bench_clock(lua_State *L) { + lua_pushnumber(L, (double)monotime() / 1000000L); + + return 1; +} /* bench_clock() */ + + +static int bench_new(lua_State *L) { + const char *path = luaL_checkstring(L, 1); + size_t count = luaL_optinteger(L, 2, 1000000); + timeout_t timeout_max = luaL_optinteger(L, 3, 300 * 1000000L); + int verbose = (lua_isnone(L, 4))? 0 : lua_toboolean(L, 4); + struct bench *B; + struct benchops *ops; + + B = lua_newuserdata(L, sizeof *B); + memset(B, 0, sizeof *B); + + luaL_getmetatable(L, "BENCH*"); + lua_setmetatable(L, -2); + + B->count = count; + B->timeout_max = timeout_max; + B->verbose = verbose; + + if (!(B->timeout = calloc(count, sizeof *B->timeout))) + return luaL_error(L, "%s", strerror(errno)); + + if (!(B->solib = dlopen(path, RTLD_NOW|RTLD_LOCAL))) + return luaL_error(L, "%s: %s", path, dlerror()); + + if (!(ops = dlsym(B->solib, "benchops"))) + return luaL_error(L, "%s: %s", path, dlerror()); + + B->ops = *ops; + B->state = B->ops.init(B->timeout, B->count, B->verbose); + + return 1; +} /* bench_new() */ + + +static int bench_add(lua_State *L) { + struct bench *B = lua_touserdata(L, 1); + unsigned i; + timeout_t t; + + i = (lua_isnoneornil(L, 2))? random() % B->count : (unsigned)luaL_checkinteger(L, 2); + t = (lua_isnoneornil(L, 3))? random() % B->timeout_max : (unsigned)luaL_checkinteger(L, 3); + + B->ops.add(B->state, &B->timeout[i], t); + + return 0; +} /* bench_add() */ + + +static int bench_del(lua_State *L) { + struct bench *B = lua_touserdata(L, 1); + size_t i = luaL_optinteger(L, 2, random() % B->count); + size_t j = luaL_optinteger(L, 3, i); + + while (i <= j && i < B->count) { + B->ops.del(B->state, &B->timeout[i]); + ++i; + } + + return 0; +} /* bench_del() */ + + +static int bench_fill(lua_State *L) { + struct bench *B = lua_touserdata(L, 1); + size_t count = luaL_optinteger(L, 2, B->count); + long timeout_inc = luaL_optinteger(L, 3, -1), timeout_max = 0, timeout; + size_t i; + + if (timeout_inc < 0) { + for (i = 0; i < count; i++) { + timeout = random() % B->timeout_max; + B->ops.add(B->state, &B->timeout[i], timeout); + timeout_max = MAX(timeout, timeout_max); + } + } else { + for (i = 0; i < count; i++) { + timeout = timeout_inc + i; + B->ops.add(B->state, &B->timeout[i], timeout_inc + i); + timeout_max = MAX(timeout, timeout_max); + } + } + + lua_pushinteger(L, (lua_Integer)count); + lua_pushinteger(L, (lua_Integer)timeout_max); + + return 2; +} /* bench_fill() */ + + +static int bench_expire(lua_State *L) { + struct bench *B = lua_touserdata(L, 1); + unsigned count = luaL_optinteger(L, 2, B->count); + unsigned step = luaL_optinteger(L, 3, 300000); + size_t i = 0; + + while (i < count && !B->ops.empty(B->state)) { + B->curtime += step; + B->ops.update(B->state, B->curtime); + + while (B->ops.get(B->state)) + i++; + } + + lua_pushinteger(L, (lua_Integer)i); + + return 1; +} /* bench_expire() */ + + +static int bench_empty(lua_State *L) { + struct bench *B = lua_touserdata(L, 1); + + lua_pushboolean(L, B->ops.empty(B->state)); + + return 1; +} /* bench_empty() */ + + +static int bench__next(lua_State *L) { + struct bench *B = lua_touserdata(L, lua_upvalueindex(1)); + struct timeouts_it *it = lua_touserdata(L, lua_upvalueindex(2)); + struct timeout *to; + + if (!B->ops.next || !(to = B->ops.next(B->state, it))) + return 0; + + lua_pushinteger(L, luaL_optinteger(L, 2, 0) + 1); + + lua_newtable(L); + lua_pushinteger(L, to->expires); + lua_setfield(L, -2, "expires"); + + return 2; +} /* bench__next() */ + +static int bench__pairs(lua_State *L) { + struct timeouts_it *it; + + lua_settop(L, 1); + + it = lua_newuserdata(L, sizeof *it); + TIMEOUTS_IT_INIT(it, TIMEOUTS_ALL); + + lua_pushcclosure(L, &bench__next, 2); + lua_pushvalue(L, 1); + lua_pushinteger(L, 0); + + return 3; +} /* bench__pairs() */ + + +static int bench__gc(lua_State *L) { + struct bench *B = lua_touserdata(L, 1); + + if (B->state) { + B->ops.destroy(B->state); + B->state = NULL; + } + + return 0; +} /* bench__gc() */ + + +static const luaL_Reg bench_methods[] = { + { "add", &bench_add }, + { "del", &bench_del }, + { "fill", &bench_fill }, + { "expire", &bench_expire }, + { "empty", &bench_empty }, + { "close", &bench__gc }, + { NULL, NULL } +}; + +static const luaL_Reg bench_metatable[] = { + { "__pairs", &bench__pairs }, + { "__gc", &bench__gc }, + { NULL, NULL } +}; + +static const luaL_Reg bench_globals[] = { + { "new", &bench_new }, + { "clock", &bench_clock }, + { NULL, NULL } +}; + +int luaopen_bench(lua_State *L) { +#if __APPLE__ + mach_timebase_info(&timebase); +#endif + + if (luaL_newmetatable(L, "BENCH*")) { + luaL_setfuncs(L, bench_metatable, 0); + luaL_newlib(L, bench_methods); + lua_setfield(L, -2, "__index"); + } + + luaL_newlib(L, bench_globals); + + return 1; +} /* luaopen_bench() */ + diff --git a/src/wraith/src/ext/timeouts/bench/bench.h b/src/wraith/src/ext/timeouts/bench/bench.h new file mode 100644 index 000000000..bc1f7cf17 --- /dev/null +++ b/src/wraith/src/ext/timeouts/bench/bench.h @@ -0,0 +1,11 @@ +struct benchops { + void *(*init)(struct timeout *, size_t, int); + void (*add)(void *, struct timeout *, timeout_t); + void (*del)(void *, struct timeout *); + struct timeout *(*get)(void *); + void (*update)(void *, timeout_t); + void (*check)(void *); + int (*empty)(void *); + struct timeout *(*next)(void *, struct timeouts_it *); + void (*destroy)(void *); +}; /* struct benchops() */ diff --git a/src/wraith/src/ext/timeouts/bench/bench.plt b/src/wraith/src/ext/timeouts/bench/bench.plt new file mode 100644 index 000000000..6e143c65e --- /dev/null +++ b/src/wraith/src/ext/timeouts/bench/bench.plt @@ -0,0 +1,19 @@ +set terminal postscript color + +set key top left +set xlabel "Number of timeouts" +set ylabel "Time\n(microseconds)" +#set logscale x + +set title "Time spent installing timeouts" font ",20" +plot 'heap-add.dat' using 1:($2*1000000) title "min-heap" with lines ls 1 lw 3 lc "red", \ + 'wheel-add.dat' using 1:($2*1000000) title "hierarchical wheel" with lines ls 1 lw 3 lc "forest-green" + +set title "Time spent deleting timeouts" font ",20" +plot 'heap-del.dat' using 1:($2*1000000) title "min-heap" with lines ls 1 lw 3 lc "red", \ + 'wheel-del.dat' using 1:($2*1000000) title "hierarchical wheel" with lines ls 1 lw 3 lc "forest-green" + +set title "Time spent expiring timeouts\n(by iteratively updating clock ~1000 times)" font ",20" +plot 'heap-expire.dat' using 1:($2*1000000) title "min-heap" with lines ls 1 lw 3 lc "red", \ + 'wheel-expire.dat' using 1:($2*1000000) title "hierarchical wheel" with lines ls 1 lw 3 lc "forest-green" + diff --git a/src/wraith/src/ext/timeouts/lua/Rules.mk b/src/wraith/src/ext/timeouts/lua/Rules.mk new file mode 100644 index 000000000..0f06fce30 --- /dev/null +++ b/src/wraith/src/ext/timeouts/lua/Rules.mk @@ -0,0 +1,20 @@ +$(LUA_APIS:%=$(top_builddir)/lua/%/timeout.so): $(top_srcdir)/lua/timeout-lua.c $(top_srcdir)/timeout.h $(top_srcdir)/timeout.c + mkdir -p $(@D) + @$(SHRC); echo_cmd $(CC) -o $@ $(top_srcdir)/lua/timeout-lua.c -I$(top_srcdir) -DWHEEL_BIT=$(WHEEL_BIT) -DWHEEL_NUM=$(WHEEL_NUM) $(LUA53_CPPFLAGS) $(ALL_CPPFLAGS) $(ALL_CFLAGS) $(ALL_SOFLAGS) $(ALL_LDFLAGS) $(ALL_LIBS) + +$(top_builddir)/lua/5.1/timeouts.so: $(top_builddir)/lua/5.1/timeout.so +$(top_builddir)/lua/5.2/timeouts.so: $(top_builddir)/lua/5.2/timeout.so +$(top_builddir)/lua/5.3/timeouts.so: $(top_builddir)/lua/5.3/timeout.so + +$(LUA_APIS:%=$(top_builddir)/lua/%/timeouts.so): + cd $(@D) && ln -fs timeout.so timeouts.so + +lua-5.1: $(top_builddir)/lua/5.1/timeout.so $(top_builddir)/lua/5.1/timeouts.so +lua-5.2: $(top_builddir)/lua/5.2/timeout.so $(top_builddir)/lua/5.2/timeouts.so +lua-5.3: $(top_builddir)/lua/5.3/timeout.so $(top_builddir)/lua/5.3/timeouts.so + +lua-clean: + $(RM) -r $(top_builddir)/lua/5.? + +clean: lua-clean + diff --git a/src/wraith/src/ext/timeouts/lua/timeout-lua.c b/src/wraith/src/ext/timeouts/lua/timeout-lua.c new file mode 100644 index 000000000..4d4e54cba --- /dev/null +++ b/src/wraith/src/ext/timeouts/lua/timeout-lua.c @@ -0,0 +1,396 @@ +#include +#include + +#include +#include +#include + +#if LUA_VERSION_NUM != 503 +#error only Lua 5.3 supported +#endif + +#define TIMEOUT_PUBLIC static +#include "timeout.h" +#include "timeout.c" + +#define TIMEOUT_METANAME "struct timeout" +#define TIMEOUTS_METANAME "struct timeouts*" + +static struct timeout * +to_checkudata(lua_State *L, int index) +{ + return luaL_checkudata(L, index, TIMEOUT_METANAME); +} + +static struct timeouts * +tos_checkudata(lua_State *L, int index) +{ + return *(struct timeouts **)luaL_checkudata(L, index, TIMEOUTS_METANAME); +} + +static void +tos_bind(lua_State *L, int tos_index, int to_index) +{ + lua_getuservalue(L, tos_index); + lua_pushlightuserdata(L, to_checkudata(L, to_index)); + lua_pushvalue(L, to_index); + lua_rawset(L, -3); + lua_pop(L, 1); +} + +static void +tos_unbind(lua_State *L, int tos_index, int to_index) +{ + lua_getuservalue(L, tos_index); + lua_pushlightuserdata(L, to_checkudata(L, to_index)); + lua_pushnil(L); + lua_rawset(L, -3); + lua_pop(L, 1); +} + +static int +to__index(lua_State *L) +{ + struct timeout *to = to_checkudata(L, 1); + + if (lua_type(L, 2 == LUA_TSTRING)) { + const char *key = lua_tostring(L, 2); + + if (!strcmp(key, "flags")) { + lua_pushinteger(L, to->flags); + + return 1; + } else if (!strcmp(key, "expires")) { + lua_pushinteger(L, to->expires); + + return 1; + } + } + + if (LUA_TNIL != lua_getuservalue(L, 1)) { + lua_pushvalue(L, 2); + if (LUA_TNIL != lua_rawget(L, -2)) + return 1; + } + + lua_pushvalue(L, 2); + if (LUA_TNIL != lua_rawget(L, lua_upvalueindex(1))) + return 1; + + return 0; +} + +static int +to__newindex(lua_State *L) +{ + if (LUA_TNIL == lua_getuservalue(L, 1)) { + lua_newtable(L); + lua_pushvalue(L, -1); + lua_setuservalue(L, 1); + } + + lua_pushvalue(L, 2); + lua_pushvalue(L, 3); + lua_rawset(L, -3); + + return 0; +} + +static int +to__gc(lua_State *L) +{ + struct timeout *to = to_checkudata(L, 1); + + /* + * NB: On script exit it's possible for a timeout to still be + * associated with a timeouts object, particularly when the timeouts + * object was created first. + */ + timeout_del(to); + + return 0; +} + +static int +to_new(lua_State *L) +{ + int flags = luaL_optinteger(L, 1, 0); + struct timeout *to; + + to = lua_newuserdata(L, sizeof *to); + timeout_init(to, flags); + luaL_setmetatable(L, TIMEOUT_METANAME); + + return 1; +} + +static const luaL_Reg to_methods[] = { + { NULL, NULL }, +}; + +static const luaL_Reg to_metatable[] = { + { "__index", &to__index }, + { "__newindex", &to__newindex }, + { "__gc", &to__gc }, + { NULL, NULL }, +}; + +static const luaL_Reg to_globals[] = { + { "new", &to_new }, + { NULL, NULL }, +}; + +static void +to_newmetatable(lua_State *L) +{ + if (luaL_newmetatable(L, TIMEOUT_METANAME)) { + /* + * fill metamethod table, capturing the methods table as an + * upvalue for use by __index metamethod + */ + luaL_newlib(L, to_methods); + luaL_setfuncs(L, to_metatable, 1); + } +} + +int +luaopen_timeout(lua_State *L) +{ + to_newmetatable(L); + + luaL_newlib(L, to_globals); + lua_pushinteger(L, TIMEOUT_INT); + lua_setfield(L, -2, "INT"); + lua_pushinteger(L, TIMEOUT_ABS); + lua_setfield(L, -2, "ABS"); + + return 1; +} + +static int +tos_update(lua_State *L) +{ + struct timeouts *T = tos_checkudata(L, 1); + lua_Number n = luaL_checknumber(L, 2); + + timeouts_update(T, timeouts_f2i(T, n)); + + lua_pushvalue(L, 1); + + return 1; +} + +static int +tos_step(lua_State *L) +{ + struct timeouts *T = tos_checkudata(L, 1); + lua_Number n = luaL_checknumber(L, 2); + + timeouts_step(T, timeouts_f2i(T, n)); + + lua_pushvalue(L, 1); + + return 1; +} + +static int +tos_timeout(lua_State *L) +{ + struct timeouts *T = tos_checkudata(L, 1); + + lua_pushnumber(L, timeouts_i2f(T, timeouts_timeout(T))); + + return 1; +} + +static int +tos_add(lua_State *L) +{ + struct timeouts *T = tos_checkudata(L, 1); + struct timeout *to = to_checkudata(L, 2); + lua_Number timeout = luaL_checknumber(L, 3); + + tos_bind(L, 1, 2); + timeouts_addf(T, to, timeout); + + return lua_pushvalue(L, 1), 1; +} + +static int +tos_del(lua_State *L) +{ + struct timeouts *T = tos_checkudata(L, 1); + struct timeout *to = to_checkudata(L, 2); + + timeouts_del(T, to); + tos_unbind(L, 1, 2); + + return lua_pushvalue(L, 1), 1; +} + +static int +tos_get(lua_State *L) +{ + struct timeouts *T = tos_checkudata(L, 1); + struct timeout *to; + + if (!(to = timeouts_get(T))) + return 0; + + lua_getuservalue(L, 1); + lua_rawgetp(L, -1, to); + + if (!timeout_pending(to)) + tos_unbind(L, 1, lua_absindex(L, -1)); + + return 1; +} + +static int +tos_pending(lua_State *L) +{ + struct timeouts *T = tos_checkudata(L, 1); + + lua_pushboolean(L, timeouts_pending(T)); + + return 1; +} + +static int +tos_expired(lua_State *L) +{ + struct timeouts *T = tos_checkudata(L, 1); + + lua_pushboolean(L, timeouts_expired(T)); + + return 1; +} + +static int +tos_check(lua_State *L) +{ + struct timeouts *T = tos_checkudata(L, 1); + + lua_pushboolean(L, timeouts_check(T, NULL)); + + return 1; +} + +static int +tos__next(lua_State *L) +{ + struct timeouts *T = tos_checkudata(L, lua_upvalueindex(1)); + struct timeouts_it *it = lua_touserdata(L, lua_upvalueindex(2)); + struct timeout *to; + + if (!(to = timeouts_next(T, it))) + return 0; + + lua_getuservalue(L, lua_upvalueindex(1)); + lua_rawgetp(L, -1, to); + + return 1; +} + +static int +tos_timeouts(lua_State *L) +{ + int flags = luaL_checkinteger(L, 2); + struct timeouts_it *it; + + tos_checkudata(L, 1); + lua_pushvalue(L, 1); + it = lua_newuserdata(L, sizeof *it); + TIMEOUTS_IT_INIT(it, flags); + lua_pushcclosure(L, &tos__next, 2); + + return 1; +} + +static int +tos__gc(lua_State *L) +{ + struct timeouts **tos = luaL_checkudata(L, 1, TIMEOUTS_METANAME); + struct timeout *to; + + TIMEOUTS_FOREACH(to, *tos, TIMEOUTS_ALL) { + timeouts_del(*tos, to); + } + + timeouts_close(*tos); + *tos = NULL; + + return 0; +} + +static int +tos_new(lua_State *L) +{ + timeout_t hz = luaL_optinteger(L, 1, 0); + struct timeouts **T; + int error; + + T = lua_newuserdata(L, sizeof *T); + luaL_setmetatable(L, TIMEOUTS_METANAME); + + lua_newtable(L); + lua_setuservalue(L, -2); + + if (!(*T = timeouts_open(hz, &error))) + return luaL_error(L, "%s", strerror(error)); + + return 1; +} + +static const luaL_Reg tos_methods[] = { + { "update", &tos_update }, + { "step", &tos_step }, + { "timeout", &tos_timeout }, + { "add", &tos_add }, + { "del", &tos_del }, + { "get", &tos_get }, + { "pending", &tos_pending }, + { "expired", &tos_expired }, + { "check", &tos_check }, + { "timeouts", &tos_timeouts }, + { NULL, NULL }, +}; + +static const luaL_Reg tos_metatable[] = { + { "__gc", &tos__gc }, + { NULL, NULL }, +}; + +static const luaL_Reg tos_globals[] = { + { "new", &tos_new }, + { NULL, NULL }, +}; + +static void +tos_newmetatable(lua_State *L) +{ + if (luaL_newmetatable(L, TIMEOUTS_METANAME)) { + luaL_setfuncs(L, tos_metatable, 0); + luaL_newlib(L, tos_methods); + lua_setfield(L, -2, "__index"); + } +} + +int +luaopen_timeouts(lua_State *L) +{ + to_newmetatable(L); + tos_newmetatable(L); + + luaL_newlib(L, tos_globals); + lua_pushinteger(L, TIMEOUTS_PENDING); + lua_setfield(L, -2, "PENDING"); + lua_pushinteger(L, TIMEOUTS_EXPIRED); + lua_setfield(L, -2, "EXPIRED"); + lua_pushinteger(L, TIMEOUTS_ALL); + lua_setfield(L, -2, "ALL"); + lua_pushinteger(L, TIMEOUTS_CLEAR); + lua_setfield(L, -2, "CLEAR"); + + return 1; +} diff --git a/src/wraith/src/ext/timeouts/test-timeout.c b/src/wraith/src/ext/timeouts/test-timeout.c new file mode 100644 index 000000000..807712937 --- /dev/null +++ b/src/wraith/src/ext/timeouts/test-timeout.c @@ -0,0 +1,530 @@ +#include +#include +#include +#include +#include + +#include "timeout.h" + +#define THE_END_OF_TIME ((timeout_t)-1) + +static int check_misc(void) { + if (TIMEOUT_VERSION != timeout_version()) + return 1; + if (TIMEOUT_V_REL != timeout_v_rel()) + return 1; + if (TIMEOUT_V_API != timeout_v_api()) + return 1; + if (TIMEOUT_V_ABI != timeout_v_abi()) + return 1; + if (strcmp(timeout_vendor(), TIMEOUT_VENDOR)) + return 1; + return 0; +} + +static int check_open_close(timeout_t hz_set, timeout_t hz_expect) { + int err=0; + struct timeouts *tos = timeouts_open(hz_set, &err); + if (!tos) + return 1; + if (err) + return 1; + if (hz_expect != timeouts_hz(tos)) + return 1; + timeouts_close(tos); + return 0; +} + +/* Not very random */ +static timeout_t random_to(timeout_t min, timeout_t max) +{ + if (max <= min) + return min; + /* Not actually all that random, but should exercise the code. */ + timeout_t rand64 = random() * (timeout_t)INT_MAX + random(); + return min + (rand64 % (max-min)); +} + +/* configuration for check_randomized */ +struct rand_cfg { + /* When creating timeouts, smallest possible delay */ + timeout_t min_timeout; + /* When creating timeouts, largest possible delay */ + timeout_t max_timeout; + /* First time to start the clock at. */ + timeout_t start_at; + /* Do not advance the clock past this time. */ + timeout_t end_at; + /* Number of timeouts to create and monitor. */ + int n_timeouts; + /* Advance the clock by no more than this each step. */ + timeout_t max_step; + /* Use relative timers and stepping */ + int relative; + /* Every time the clock ticks, try removing this many timeouts at + * random. */ + int try_removing; + /* When we're done, advance the clock to the end of time. */ + int finalize; +}; + +static int check_randomized(const struct rand_cfg *cfg) +{ +#define FAIL() do { \ + printf("Failure on line %d\n", __LINE__); \ + goto done; \ + } while (0) + + int i, err; + int rv = 1; + struct timeout *t = calloc(cfg->n_timeouts, sizeof(struct timeout)); + timeout_t *timeouts = calloc(cfg->n_timeouts, sizeof(timeout_t)); + uint8_t *fired = calloc(cfg->n_timeouts, sizeof(uint8_t)); + uint8_t *found = calloc(cfg->n_timeouts, sizeof(uint8_t)); + uint8_t *deleted = calloc(cfg->n_timeouts, sizeof(uint8_t)); + struct timeouts *tos = timeouts_open(0, &err); + timeout_t now = cfg->start_at; + int n_added_pending = 0, cnt_added_pending = 0; + int n_added_expired = 0, cnt_added_expired = 0; + struct timeouts_it it_p, it_e, it_all; + int p_done = 0, e_done = 0, all_done = 0; + struct timeout *to = NULL; + const int rel = cfg->relative; + + if (!t || !timeouts || !tos || !fired || !found || !deleted) + FAIL(); + timeouts_update(tos, cfg->start_at); + + for (i = 0; i < cfg->n_timeouts; ++i) { + if (&t[i] != timeout_init(&t[i], rel ? 0 : TIMEOUT_ABS)) + FAIL(); + if (timeout_pending(&t[i])) + FAIL(); + if (timeout_expired(&t[i])) + FAIL(); + + timeouts[i] = random_to(cfg->min_timeout, cfg->max_timeout); + + timeouts_add(tos, &t[i], timeouts[i] - (rel ? now : 0)); + if (timeouts[i] <= cfg->start_at) { + if (timeout_pending(&t[i])) + FAIL(); + if (! timeout_expired(&t[i])) + FAIL(); + ++n_added_expired; + } else { + if (! timeout_pending(&t[i])) + FAIL(); + if (timeout_expired(&t[i])) + FAIL(); + ++n_added_pending; + } + } + + if (!!n_added_pending != timeouts_pending(tos)) + FAIL(); + if (!!n_added_expired != timeouts_expired(tos)) + FAIL(); + + /* Test foreach, interleaving a few iterators. */ + TIMEOUTS_IT_INIT(&it_p, TIMEOUTS_PENDING); + TIMEOUTS_IT_INIT(&it_e, TIMEOUTS_EXPIRED); + TIMEOUTS_IT_INIT(&it_all, TIMEOUTS_ALL); + while (! (p_done && e_done && all_done)) { + if (!p_done) { + to = timeouts_next(tos, &it_p); + if (to) { + i = to - &t[0]; + ++found[i]; + ++cnt_added_pending; + } else { + p_done = 1; + } + } + if (!e_done) { + to = timeouts_next(tos, &it_e); + if (to) { + i = to - &t[0]; + ++found[i]; + ++cnt_added_expired; + } else { + e_done = 1; + } + } + if (!all_done) { + to = timeouts_next(tos, &it_all); + if (to) { + i = to - &t[0]; + ++found[i]; + } else { + all_done = 1; + } + } + } + + for (i = 0; i < cfg->n_timeouts; ++i) { + if (found[i] != 2) + FAIL(); + } + if (cnt_added_expired != n_added_expired) + FAIL(); + if (cnt_added_pending != n_added_pending) + FAIL(); + + while (NULL != (to = timeouts_get(tos))) { + i = to - &t[0]; + assert(&t[i] == to); + if (timeouts[i] > cfg->start_at) + FAIL(); /* shouldn't have happened yet */ + + --n_added_expired; /* drop expired timeouts. */ + ++fired[i]; + } + + if (n_added_expired != 0) + FAIL(); + + while (now < cfg->end_at) { + int n_fired_this_time = 0; + timeout_t first_at = timeouts_timeout(tos) + now; + + timeout_t oldtime = now; + timeout_t step = random_to(1, cfg->max_step); + int another; + now += step; + if (rel) + timeouts_step(tos, step); + else + timeouts_update(tos, now); + + for (i = 0; i < cfg->try_removing; ++i) { + int idx = random() % cfg->n_timeouts; + if (! fired[idx]) { + timeout_del(&t[idx]); + ++deleted[idx]; + } + } + + another = (timeouts_timeout(tos) == 0); + + while (NULL != (to = timeouts_get(tos))) { + if (! another) + FAIL(); /* Thought we saw the last one! */ + i = to - &t[0]; + assert(&t[i] == to); + if (timeouts[i] > now) + FAIL(); /* shouldn't have happened yet */ + if (timeouts[i] <= oldtime) + FAIL(); /* should have happened already */ + if (timeouts[i] < first_at) + FAIL(); /* first_at should've been earlier */ + fired[i]++; + n_fired_this_time++; + another = (timeouts_timeout(tos) == 0); + } + if (n_fired_this_time && first_at > now) + FAIL(); /* first_at should've been earlier */ + if (another) + FAIL(); /* Huh? We think there are more? */ + if (!timeouts_check(tos, stderr)) + FAIL(); + } + + for (i = 0; i < cfg->n_timeouts; ++i) { + if (fired[i] > 1) + FAIL(); /* Nothing fired twice. */ + if (timeouts[i] <= now) { + if (!(fired[i] || deleted[i])) + FAIL(); + } else { + if (fired[i]) + FAIL(); + } + if (fired[i] && deleted[i]) + FAIL(); + if (cfg->finalize > 1) { + if (!fired[i]) + timeout_del(&t[i]); + } + } + + /* Now nothing more should fire between now and the end of time. */ + if (cfg->finalize) { + timeouts_update(tos, THE_END_OF_TIME); + if (cfg->finalize > 1) { + if (timeouts_get(tos)) + FAIL(); + TIMEOUTS_FOREACH(to, tos, TIMEOUTS_ALL) + FAIL(); + } + } + rv = 0; + + done: + if (tos) timeouts_close(tos); + if (t) free(t); + if (timeouts) free(timeouts); + if (fired) free(fired); + if (found) free(found); + if (deleted) free(deleted); + return rv; +} + +struct intervals_cfg { + const timeout_t *timeouts; + int n_timeouts; + timeout_t start_at; + timeout_t end_at; + timeout_t skip; +}; + +int +check_intervals(struct intervals_cfg *cfg) +{ + int i, err; + int rv = 1; + struct timeout *to; + struct timeout *t = calloc(cfg->n_timeouts, sizeof(struct timeout)); + unsigned *fired = calloc(cfg->n_timeouts, sizeof(unsigned)); + struct timeouts *tos = timeouts_open(0, &err); + + timeout_t now = cfg->start_at; + if (!t || !tos || !fired) + FAIL(); + + timeouts_update(tos, now); + + for (i = 0; i < cfg->n_timeouts; ++i) { + if (&t[i] != timeout_init(&t[i], TIMEOUT_INT)) + FAIL(); + if (timeout_pending(&t[i])) + FAIL(); + if (timeout_expired(&t[i])) + FAIL(); + + timeouts_add(tos, &t[i], cfg->timeouts[i]); + if (! timeout_pending(&t[i])) + FAIL(); + if (timeout_expired(&t[i])) + FAIL(); + } + + while (now < cfg->end_at) { + timeout_t delay = timeouts_timeout(tos); + if (cfg->skip && delay < cfg->skip) + delay = cfg->skip; + timeouts_step(tos, delay); + now += delay; + + while (NULL != (to = timeouts_get(tos))) { + i = to - &t[0]; + assert(&t[i] == to); + fired[i]++; + if (0 != (to->expires - cfg->start_at) % cfg->timeouts[i]) + FAIL(); + if (to->expires <= now) + FAIL(); + if (to->expires > now + cfg->timeouts[i]) + FAIL(); + } + if (!timeouts_check(tos, stderr)) + FAIL(); + } + + timeout_t duration = now - cfg->start_at; + for (i = 0; i < cfg->n_timeouts; ++i) { + if (cfg->skip) { + if (fired[i] > duration / cfg->timeouts[i]) + FAIL(); + } else { + if (fired[i] != duration / cfg->timeouts[i]) + FAIL(); + } + if (!timeout_pending(&t[i])) + FAIL(); + } + + rv = 0; + done: + if (t) free(t); + if (fired) free(fired); + if (tos) free(tos); + return rv; +} + +int +main(int argc, char **argv) +{ + int j; + int n_failed = 0; +#define DO(fn) do { \ + printf("."); fflush(stdout); \ + if (fn) { \ + ++n_failed; \ + printf("%s failed\n", #fn); \ + } \ + } while (0) + +#define DO_N(n, fn) do { \ + for (j = 0; j < (n); ++j) { \ + DO(fn); \ + } \ + } while (0) + + DO(check_misc()); + DO(check_open_close(1000, 1000)); + DO(check_open_close(0, TIMEOUT_mHZ)); + + struct rand_cfg cfg1 = { + .min_timeout = 1, + .max_timeout = 100, + .start_at = 5, + .end_at = 1000, + .n_timeouts = 1000, + .max_step = 10, + .relative = 0, + .try_removing = 0, + .finalize = 2, + }; + DO_N(300,check_randomized(&cfg1)); + + struct rand_cfg cfg2 = { + .min_timeout = 20, + .max_timeout = 1000, + .start_at = 10, + .end_at = 100, + .n_timeouts = 1000, + .max_step = 5, + .relative = 1, + .try_removing = 0, + .finalize = 2, + }; + DO_N(300,check_randomized(&cfg2)); + + struct rand_cfg cfg2b = { + .min_timeout = 20, + .max_timeout = 1000, + .start_at = 10, + .end_at = 100, + .n_timeouts = 1000, + .max_step = 5, + .relative = 1, + .try_removing = 0, + .finalize = 1, + }; + DO_N(300,check_randomized(&cfg2b)); + + struct rand_cfg cfg2c = { + .min_timeout = 20, + .max_timeout = 1000, + .start_at = 10, + .end_at = 100, + .n_timeouts = 1000, + .max_step = 5, + .relative = 1, + .try_removing = 0, + .finalize = 0, + }; + DO_N(300,check_randomized(&cfg2c)); + + struct rand_cfg cfg3 = { + .min_timeout = 2000, + .max_timeout = ((uint64_t)1) << 50, + .start_at = 100, + .end_at = ((uint64_t)1) << 49, + .n_timeouts = 1000, + .max_step = 1<<31, + .relative = 0, + .try_removing = 0, + .finalize = 2, + }; + DO_N(10,check_randomized(&cfg3)); + + struct rand_cfg cfg3b = { + .min_timeout = ((uint64_t)1) << 50, + .max_timeout = ((uint64_t)1) << 52, + .start_at = 100, + .end_at = ((uint64_t)1) << 53, + .n_timeouts = 1000, + .max_step = ((uint64_t)1)<<48, + .relative = 0, + .try_removing = 0, + .finalize = 2, + }; + DO_N(10,check_randomized(&cfg3b)); + + struct rand_cfg cfg4 = { + .min_timeout = 2000, + .max_timeout = ((uint64_t)1) << 30, + .start_at = 100, + .end_at = ((uint64_t)1) << 26, + .n_timeouts = 10000, + .max_step = 1<<16, + .relative = 0, + .try_removing = 3, + .finalize = 2, + }; + DO_N(10,check_randomized(&cfg4)); + + const timeout_t primes[] = { + 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53, + 59,61,67,71,73,79,83,89,97 + }; + const timeout_t factors_of_1337[] = { + 1, 7, 191, 1337 + }; + const timeout_t multiples_of_five[] = { + 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 + }; + + struct intervals_cfg icfg1 = { + .timeouts = primes, + .n_timeouts = sizeof(primes)/sizeof(timeout_t), + .start_at = 50, + .end_at = 5322, + .skip = 0, + }; + DO(check_intervals(&icfg1)); + + struct intervals_cfg icfg2 = { + .timeouts = factors_of_1337, + .n_timeouts = sizeof(factors_of_1337)/sizeof(timeout_t), + .start_at = 50, + .end_at = 50000, + .skip = 0, + }; + DO(check_intervals(&icfg2)); + + struct intervals_cfg icfg3 = { + .timeouts = multiples_of_five, + .n_timeouts = sizeof(multiples_of_five)/sizeof(timeout_t), + .start_at = 49, + .end_at = 5333, + .skip = 0, + }; + DO(check_intervals(&icfg3)); + + struct intervals_cfg icfg4 = { + .timeouts = primes, + .n_timeouts = sizeof(primes)/sizeof(timeout_t), + .start_at = 50, + .end_at = 5322, + .skip = 16, + }; + DO(check_intervals(&icfg4)); + + if (n_failed) { + puts("\nFAIL"); + } else { + puts("\nOK"); + } + return !!n_failed; +} + +/* TODO: + + * Solve PR#3. + + * Investigate whether any untaken branches are possible. + + */ diff --git a/src/wraith/src/ext/timeouts/timeout-bitops.c b/src/wraith/src/ext/timeouts/timeout-bitops.c new file mode 100644 index 000000000..e99af8f9c --- /dev/null +++ b/src/wraith/src/ext/timeouts/timeout-bitops.c @@ -0,0 +1,255 @@ +#include +#include +#ifdef _MSC_VER +#include /* _BitScanForward, _BitScanReverse */ +#endif + +/* First define ctz and clz functions; these are compiler-dependent if + * you want them to be fast. */ +#if defined(__GNUC__) && !defined(TIMEOUT_DISABLE_GNUC_BITOPS) + +#ifndef LONG_BIT +#define LONG_BIT (SIZEOF_LONG*CHAR_BIT) +#endif + +/* On GCC and clang and some others, we can use __builtin functions. They + * are not defined for n==0, but timeout.s never calls them with n==0. */ + +#define ctz64(n) __builtin_ctzll(n) +#define clz64(n) __builtin_clzll(n) +#if LONG_BIT == 32 +#define ctz32(n) __builtin_ctzl(n) +#define clz32(n) __builtin_clzl(n) +#else +#define ctz32(n) __builtin_ctz(n) +#define clz32(n) __builtin_clz(n) +#endif + +#elif defined(_MSC_VER) && !defined(TIMEOUT_DISABLE_MSVC_BITOPS) + +/* On MSVC, we have these handy functions. We can ignore their return + * values, since we will never supply val == 0. */ + +static __inline int ctz32(unsigned long val) +{ + DWORD zeros = 0; + _BitScanForward(&zeros, val); + return zeros; +} +static __inline int clz32(unsigned long val) +{ + DWORD zeros = 0; + _BitScanReverse(&zeros, val); + return zeros; +} +#ifdef _WIN64 +/* According to the documentation, these only exist on Win64. */ +static __inline int ctz64(uint64_t val) +{ + DWORD zeros = 0; + _BitScanForward64(&zeros, val); + return zeros; +} +static __inline int clz64(uint64_t val) +{ + DWORD zeros = 0; + _BitScanReverse64(&zeros, val); + return zeros; +} +#else +static __inline int ctz64(uint64_t val) +{ + uint32_t lo = (uint32_t) val; + uint32_t hi = (uint32_t) (val >> 32); + return lo ? ctz32(lo) : 32 + ctz32(hi); +} +static __inline int clz64(uint64_t val) +{ + uint32_t lo = (uint32_t) val; + uint32_t hi = (uint32_t) (val >> 32); + return hi ? clz32(hi) : 32 + clz32(lo); +} +#endif + +/* End of MSVC case. */ + +#else + +/* TODO: There are more clever ways to do this in the generic case. */ + + +#define process_(one, cz_bits, bits) \ + if (x < ( one << (cz_bits - bits))) { rv += bits; x <<= bits; } + +#define process64(bits) process_((UINT64_C(1)), 64, (bits)) +static inline int clz64(uint64_t x) +{ + int rv = 0; + + process64(32); + process64(16); + process64(8); + process64(4); + process64(2); + process64(1); + return rv; +} +#define process32(bits) process_((UINT32_C(1)), 32, (bits)) +static inline int clz32(uint32_t x) +{ + int rv = 0; + + process32(16); + process32(8); + process32(4); + process32(2); + process32(1); + return rv; +} + +#undef process_ +#undef process32 +#undef process64 +#define process_(one, bits) \ + if ((x & ((one << (bits))-1)) == 0) { rv += bits; x >>= bits; } + +#define process64(bits) process_((UINT64_C(1)), bits) +static inline int ctz64(uint64_t x) +{ + int rv = 0; + + process64(32); + process64(16); + process64(8); + process64(4); + process64(2); + process64(1); + return rv; +} + +#define process32(bits) process_((UINT32_C(1)), bits) +static inline int ctz32(uint32_t x) +{ + int rv = 0; + + process32(16); + process32(8); + process32(4); + process32(2); + process32(1); + return rv; +} + +#undef process32 +#undef process64 +#undef process_ + +/* End of generic case */ + +#endif /* End of defining ctz */ + +#ifdef TEST_BITOPS +#include +#include + +static uint64_t testcases[] = { + 13371337 * 10, + 100, + 385789752, + 82574, + (((uint64_t)1)<<63) + (((uint64_t)1)<<31) + 10101 +}; + +static int +naive_clz(int bits, uint64_t v) +{ + int r = 0; + uint64_t bit = ((uint64_t)1) << (bits-1); + while (bit && 0 == (v & bit)) { + r++; + bit >>= 1; + } + /* printf("clz(%d,%lx) -> %d\n", bits, v, r); */ + return r; +} + +static int +naive_ctz(int bits, uint64_t v) +{ + int r = 0; + uint64_t bit = 1; + while (bit && 0 == (v & bit)) { + r++; + bit <<= 1; + if (r == bits) + break; + } + /* printf("ctz(%d,%lx) -> %d\n", bits, v, r); */ + return r; +} + +static int +check(uint64_t vv) +{ + uint32_t v32 = (uint32_t) vv; + + if (vv == 0) + return 1; /* c[tl]z64(0) is undefined. */ + + if (ctz64(vv) != naive_ctz(64, vv)) { + printf("mismatch with ctz64: %d\n", ctz64(vv)); + exit(1); + return 0; + } + if (clz64(vv) != naive_clz(64, vv)) { + printf("mismatch with clz64: %d\n", clz64(vv)); + exit(1); + return 0; + } + + if (v32 == 0) + return 1; /* c[lt]z(0) is undefined. */ + + if (ctz32(v32) != naive_ctz(32, v32)) { + printf("mismatch with ctz32: %d\n", ctz32(v32)); + exit(1); + return 0; + } + if (clz32(v32) != naive_clz(32, v32)) { + printf("mismatch with clz32: %d\n", clz32(v32)); + exit(1); + return 0; + } + return 1; +} + +int +main(int c, char **v) +{ + unsigned int i; + const unsigned int n = sizeof(testcases)/sizeof(testcases[0]); + int result = 0; + + for (i = 0; i <= 63; ++i) { + uint64_t x = 1; + x <<= i; + if (!check(x)) + result = 1; + --x; + if (!check(x)) + result = 1; + } + + for (i = 0; i < n; ++i) { + if (! check(testcases[i])) + result = 1; + } + if (result) { + puts("FAIL"); + } else { + puts("OK"); + } + return result; +} +#endif + diff --git a/src/wraith/src/ext/timeouts/timeout-debug.h b/src/wraith/src/ext/timeouts/timeout-debug.h new file mode 100644 index 000000000..fc727a6b4 --- /dev/null +++ b/src/wraith/src/ext/timeouts/timeout-debug.h @@ -0,0 +1,77 @@ +/* + * D E B U G R O U T I N E S + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#if TIMEOUT_DEBUG - 0 +#include +#include + +#undef TIMEOUT_DEBUG +#define TIMEOUT_DEBUG 1 +#define DEBUG_LEVEL timeout_debug + +static int timeout_debug; + +#define SAYit_(lvl, fmt, ...) do { \ + if (DEBUG_LEVEL >= (lvl)) \ + fprintf(stderr, fmt "%s", __FILE__, __LINE__, __func__, __VA_ARGS__); \ +} while (0) + +#define SAYit(lvl, ...) SAYit_((lvl), "%s:%d:%s: " __VA_ARGS__, "\n") + +#define PANIC(...) do { \ + SAYit(0, __VA_ARGS__); \ + _Exit(EXIT_FAILURE); \ +} while (0) +#else +#undef TIMEOUT_DEBUG +#define TIMEOUT_DEBUG 0 +#define DEBUG_LEVEL 0 + +#define SAYit(...) (void)0 +#endif + +#define SAY(...) SAYit(1, __VA_ARGS__) +#define HAI SAY("HAI") + + +static inline char *fmt_(char *buf, uint64_t ts, int wheel_bit, int wheel_num) { + char *p = buf; + int wheel, n, i; + + for (wheel = wheel_num - 2; wheel >= 0; wheel--) { + n = ((1 << wheel_bit) - 1) & (ts >> (wheel * WHEEL_BIT)); + + for (i = wheel_bit - 1; i >= 0; i--) { + *p++ = '0' + !!(n & (1 << i)); + } + + if (wheel != 0) + *p++ = ':'; + } + + *p = 0; + + return buf; +} /* fmt_() */ + +#define fmt(ts) fmt_(((char[((1 << WHEEL_BIT) * WHEEL_NUM) + WHEEL_NUM + 1]){ 0 }), (ts), WHEEL_BIT, WHEEL_NUM) + + +static inline char *bin64_(char *buf, uint64_t n, int wheel_bit) { + char *p = buf; + int i; + + for (i = 0; i < (1 << wheel_bit); i++) { + *p++ = "01"[0x1 & (n >> (((1 << wheel_bit) - 1) - i))]; + } + + *p = 0; + + return buf; +} /* bin64_() */ + +#define bin64(ts) bin64_(((char[((1 << WHEEL_BIT) * WHEEL_NUM) + 1]){ 0 }), (ts), WHEEL_BIT) + + diff --git a/src/wraith/src/ext/timeouts/timeout.c b/src/wraith/src/ext/timeouts/timeout.c new file mode 100644 index 000000000..713ec219c --- /dev/null +++ b/src/wraith/src/ext/timeouts/timeout.c @@ -0,0 +1,754 @@ +/* ========================================================================== + * timeout.c - Tickless hierarchical timing wheel. + * -------------------------------------------------------------------------- + * Copyright (c) 2013, 2014 William Ahern + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do so, subject to the + * following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * ========================================================================== + */ +#ifdef HAVE_CONFIG_H +#include "orconfig.h" +#endif +#include /* CHAR_BIT */ + +#include /* NULL */ +#include /* malloc(3) free(3) */ +#include /* FILE fprintf(3) */ + +#include /* UINT64_C uint64_t */ + +#include /* memset(3) */ + +#include /* errno */ + +#include "tor_queue.h" /* TAILQ(3) */ + +#include "timeout.h" + +#ifndef TIMEOUT_DEBUG +#define TIMEOUT_DEBUG 0 +#endif + +#if TIMEOUT_DEBUG - 0 +#include "timeout-debug.h" +#endif + +#ifdef TIMEOUT_DISABLE_RELATIVE_ACCESS +#define TO_SET_TIMEOUTS(to, T) ((void)0) +#else +#define TO_SET_TIMEOUTS(to, T) ((to)->timeouts = (T)) +#endif + +/* + * A N C I L L A R Y R O U T I N E S + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#define abstime_t timeout_t /* for documentation purposes */ +#define reltime_t timeout_t /* "" */ + +#if !defined countof +#define countof(a) (sizeof (a) / sizeof *(a)) +#endif + +#if !defined endof +#define endof(a) (&(a)[countof(a)]) +#endif + +#if !defined MIN +#define MIN(a, b) (((a) < (b))? (a) : (b)) +#endif + +#if !defined MAX +#define MAX(a, b) (((a) > (b))? (a) : (b)) +#endif + +#if !defined TOR_TAILQ_CONCAT +#define TOR_TAILQ_CONCAT(head1, head2, field) do { \ + if (!TOR_TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + TOR_TAILQ_INIT((head2)); \ + } \ +} while (0) +#endif + +#if !defined TOR_TAILQ_FOREACH_SAFE +#define TOR_TAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TOR_TAILQ_FIRST(head); \ + (var) && ((tvar) = TOR_TAILQ_NEXT(var, field), 1); \ + (var) = (tvar)) +#endif + + +/* + * B I T M A N I P U L A T I O N R O U T I N E S + * + * The macros and routines below implement wheel parameterization. The + * inputs are: + * + * WHEEL_BIT - The number of value bits mapped in each wheel. The + * lowest-order WHEEL_BIT bits index the lowest-order (highest + * resolution) wheel, the next group of WHEEL_BIT bits the + * higher wheel, etc. + * + * WHEEL_NUM - The number of wheels. WHEEL_BIT * WHEEL_NUM = the number of + * value bits used by all the wheels. For the default of 6 and + * 4, only the low 24 bits are processed. Any timeout value + * larger than this will cycle through again. + * + * The implementation uses bit fields to remember which slot in each wheel + * is populated, and to generate masks of expiring slots according to the + * current update interval (i.e. the "tickless" aspect). The slots to + * process in a wheel are (populated-set & interval-mask). + * + * WHEEL_BIT cannot be larger than 6 bits because 2^6 -> 64 is the largest + * number of slots which can be tracked in a uint64_t integer bit field. + * WHEEL_BIT cannot be smaller than 3 bits because of our rotr and rotl + * routines, which only operate on all the value bits in an integer, and + * there's no integer smaller than uint8_t. + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#if !defined WHEEL_BIT +#define WHEEL_BIT 6 +#endif + +#if !defined WHEEL_NUM +#define WHEEL_NUM 4 +#endif + +#define WHEEL_LEN (1U << WHEEL_BIT) +#define WHEEL_MAX (WHEEL_LEN - 1) +#define WHEEL_MASK (WHEEL_LEN - 1) +#define TIMEOUT_MAX ((TIMEOUT_C(1) << (WHEEL_BIT * WHEEL_NUM)) - 1) + +#include "timeout-bitops.c" + +#if WHEEL_BIT == 6 +#define ctz(n) ctz64(n) +#define clz(n) clz64(n) +#define fls(n) ((int)(64 - clz64(n))) +#else +#define ctz(n) ctz32(n) +#define clz(n) clz32(n) +#define fls(n) ((int)(32 - clz32(n))) +#endif + +#if WHEEL_BIT == 6 +#define WHEEL_C(n) UINT64_C(n) +#define WHEEL_PRIu PRIu64 +#define WHEEL_PRIx PRIx64 + +typedef uint64_t wheel_t; + +#elif WHEEL_BIT == 5 + +#define WHEEL_C(n) UINT32_C(n) +#define WHEEL_PRIu PRIu32 +#define WHEEL_PRIx PRIx32 + +typedef uint32_t wheel_t; + +#elif WHEEL_BIT == 4 + +#define WHEEL_C(n) UINT16_C(n) +#define WHEEL_PRIu PRIu16 +#define WHEEL_PRIx PRIx16 + +typedef uint16_t wheel_t; + +#elif WHEEL_BIT == 3 + +#define WHEEL_C(n) UINT8_C(n) +#define WHEEL_PRIu PRIu8 +#define WHEEL_PRIx PRIx8 + +typedef uint8_t wheel_t; + +#else +#error invalid WHEEL_BIT value +#endif + + +static inline wheel_t rotl(const wheel_t v, int c) { + if (!(c &= (sizeof v * CHAR_BIT - 1))) + return v; + + return (v << c) | (v >> (sizeof v * CHAR_BIT - c)); +} /* rotl() */ + + +static inline wheel_t rotr(const wheel_t v, int c) { + if (!(c &= (sizeof v * CHAR_BIT - 1))) + return v; + + return (v >> c) | (v << (sizeof v * CHAR_BIT - c)); +} /* rotr() */ + + +/* + * T I M E R R O U T I N E S + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +TOR_TAILQ_HEAD(timeout_list, timeout); + +struct timeouts { + struct timeout_list wheel[WHEEL_NUM][WHEEL_LEN], expired; + + wheel_t pending[WHEEL_NUM]; + + timeout_t curtime; + timeout_t hertz; +}; /* struct timeouts */ + + +static struct timeouts *timeouts_init(struct timeouts *T, timeout_t hz) { + unsigned i, j; + + for (i = 0; i < countof(T->wheel); i++) { + for (j = 0; j < countof(T->wheel[i]); j++) { + TOR_TAILQ_INIT(&T->wheel[i][j]); + } + } + + TOR_TAILQ_INIT(&T->expired); + + for (i = 0; i < countof(T->pending); i++) { + T->pending[i] = 0; + } + + T->curtime = 0; + T->hertz = (hz)? hz : TIMEOUT_mHZ; + + return T; +} /* timeouts_init() */ + + +TIMEOUT_PUBLIC struct timeouts *timeouts_open(timeout_t hz, int *error) { + struct timeouts *T; + + if ((T = malloc(sizeof *T))) + return timeouts_init(T, hz); + + *error = errno; + + return NULL; +} /* timeouts_open() */ + + +static void timeouts_reset(struct timeouts *T) { + struct timeout_list reset; + struct timeout *to; + unsigned i, j; + + TOR_TAILQ_INIT(&reset); + + for (i = 0; i < countof(T->wheel); i++) { + for (j = 0; j < countof(T->wheel[i]); j++) { + TOR_TAILQ_CONCAT(&reset, &T->wheel[i][j], tqe); + } + } + + TOR_TAILQ_CONCAT(&reset, &T->expired, tqe); + + TOR_TAILQ_FOREACH(to, &reset, tqe) { + to->pending = NULL; + TO_SET_TIMEOUTS(to, NULL); + } +} /* timeouts_reset() */ + + +TIMEOUT_PUBLIC void timeouts_close(struct timeouts *T) { + /* + * NOTE: Delete installed timeouts so timeout_pending() and + * timeout_expired() worked as expected. + */ + timeouts_reset(T); + + free(T); +} /* timeouts_close() */ + + +TIMEOUT_PUBLIC timeout_t timeouts_hz(struct timeouts *T) { + return T->hertz; +} /* timeouts_hz() */ + + +TIMEOUT_PUBLIC void timeouts_del(struct timeouts *T, struct timeout *to) { + if (to->pending) { + TOR_TAILQ_REMOVE(to->pending, to, tqe); + + if (to->pending != &T->expired && TOR_TAILQ_EMPTY(to->pending)) { + ptrdiff_t index_ = to->pending - &T->wheel[0][0]; + int wheel = (int) (index_ / WHEEL_LEN); + int slot = index_ % WHEEL_LEN; + + T->pending[wheel] &= ~(WHEEL_C(1) << slot); + } + + to->pending = NULL; + TO_SET_TIMEOUTS(to, NULL); + } +} /* timeouts_del() */ + + +static inline reltime_t timeout_rem(struct timeouts *T, struct timeout *to) { + return to->expires - T->curtime; +} /* timeout_rem() */ + + +static inline int timeout_wheel(timeout_t timeout) { + /* must be called with timeout != 0, so fls input is nonzero */ + return (fls(MIN(timeout, TIMEOUT_MAX)) - 1) / WHEEL_BIT; +} /* timeout_wheel() */ + + +static inline int timeout_slot(int wheel, timeout_t expires) { + return WHEEL_MASK & ((expires >> (wheel * WHEEL_BIT)) - !!wheel); +} /* timeout_slot() */ + + +static void timeouts_sched(struct timeouts *T, struct timeout *to, timeout_t expires) { + timeout_t rem; + int wheel, slot; + + timeouts_del(T, to); + + to->expires = expires; + + TO_SET_TIMEOUTS(to, T); + + if (expires > T->curtime) { + rem = timeout_rem(T, to); + + /* rem is nonzero since: + * rem == timeout_rem(T,to), + * == to->expires - T->curtime + * and above we have expires > T->curtime. + */ + wheel = timeout_wheel(rem); + slot = timeout_slot(wheel, to->expires); + + to->pending = &T->wheel[wheel][slot]; + TOR_TAILQ_INSERT_TAIL(to->pending, to, tqe); + + T->pending[wheel] |= WHEEL_C(1) << slot; + } else { + to->pending = &T->expired; + TOR_TAILQ_INSERT_TAIL(to->pending, to, tqe); + } +} /* timeouts_sched() */ + + +#ifndef TIMEOUT_DISABLE_INTERVALS +static void timeouts_readd(struct timeouts *T, struct timeout *to) { + to->expires += to->interval; + + if (to->expires <= T->curtime) { + /* If we've missed the next firing of this timeout, reschedule + * it to occur at the next multiple of its interval after + * the last time that it fired. + */ + timeout_t n = T->curtime - to->expires; + timeout_t r = n % to->interval; + to->expires = T->curtime + (to->interval - r); + } + + timeouts_sched(T, to, to->expires); +} /* timeouts_readd() */ +#endif + + +TIMEOUT_PUBLIC void timeouts_add(struct timeouts *T, struct timeout *to, timeout_t timeout) { +#ifndef TIMEOUT_DISABLE_INTERVALS + if (to->flags & TIMEOUT_INT) + to->interval = MAX(1, timeout); +#endif + + if (to->flags & TIMEOUT_ABS) + timeouts_sched(T, to, timeout); + else + timeouts_sched(T, to, T->curtime + timeout); +} /* timeouts_add() */ + + +TIMEOUT_PUBLIC void timeouts_update(struct timeouts *T, abstime_t curtime) { + timeout_t elapsed = curtime - T->curtime; + struct timeout_list todo; + int wheel; + + TOR_TAILQ_INIT(&todo); + + /* + * There's no avoiding looping over every wheel. It's best to keep + * WHEEL_NUM smallish. + */ + for (wheel = 0; wheel < WHEEL_NUM; wheel++) { + wheel_t pending; + + /* + * Calculate the slots expiring in this wheel + * + * If the elapsed time is greater than the maximum period of + * the wheel, mark every position as expiring. + * + * Otherwise, to determine the expired slots fill in all the + * bits between the last slot processed and the current + * slot, inclusive of the last slot. We'll bitwise-AND this + * with our pending set below. + * + * If a wheel rolls over, force a tick of the next higher + * wheel. + */ + if ((elapsed >> (wheel * WHEEL_BIT)) > WHEEL_MAX) { + pending = (wheel_t)~WHEEL_C(0); + } else { + wheel_t _elapsed = WHEEL_MASK & (elapsed >> (wheel * WHEEL_BIT)); + int oslot, nslot; + + /* + * TODO: It's likely that at least one of the + * following three bit fill operations is redundant + * or can be replaced with a simpler operation. + */ + oslot = WHEEL_MASK & (T->curtime >> (wheel * WHEEL_BIT)); + pending = rotl(((UINT64_C(1) << _elapsed) - 1), oslot); + + nslot = WHEEL_MASK & (curtime >> (wheel * WHEEL_BIT)); + pending |= rotr(rotl(((WHEEL_C(1) << _elapsed) - 1), nslot), (int)_elapsed); + pending |= WHEEL_C(1) << nslot; + } + + while (pending & T->pending[wheel]) { + /* ctz input cannot be zero: loop condition. */ + int slot = ctz(pending & T->pending[wheel]); + TOR_TAILQ_CONCAT(&todo, &T->wheel[wheel][slot], tqe); + T->pending[wheel] &= ~(UINT64_C(1) << slot); + } + + if (!(0x1 & pending)) + break; /* break if we didn't wrap around end of wheel */ + + /* if we're continuing, the next wheel must tick at least once */ + elapsed = MAX(elapsed, (WHEEL_LEN << (wheel * WHEEL_BIT))); + } + + T->curtime = curtime; + + while (!TOR_TAILQ_EMPTY(&todo)) { + struct timeout *to = TOR_TAILQ_FIRST(&todo); + + TOR_TAILQ_REMOVE(&todo, to, tqe); + to->pending = NULL; + + timeouts_sched(T, to, to->expires); + } + + return; +} /* timeouts_update() */ + +TIMEOUT_PUBLIC timeout_t timeouts_get_curtime(struct timeouts *T) { + return T->curtime; +} /* timeouts_get_curtime() */ + +TIMEOUT_PUBLIC void timeouts_step(struct timeouts *T, reltime_t elapsed) { + timeouts_update(T, T->curtime + elapsed); +} /* timeouts_step() */ + + +TIMEOUT_PUBLIC bool timeouts_pending(struct timeouts *T) { + wheel_t pending = 0; + int wheel; + + for (wheel = 0; wheel < WHEEL_NUM; wheel++) { + pending |= T->pending[wheel]; + } + + return !!pending; +} /* timeouts_pending() */ + + +TIMEOUT_PUBLIC bool timeouts_expired(struct timeouts *T) { + return !TOR_TAILQ_EMPTY(&T->expired); +} /* timeouts_expired() */ + + +/* + * Calculate the interval before needing to process any timeouts pending on + * any wheel. + * + * (This is separated from the public API routine so we can evaluate our + * wheel invariant assertions irrespective of the expired queue.) + * + * This might return a timeout value sooner than any installed timeout if + * only higher-order wheels have timeouts pending. We can only know when to + * process a wheel, not precisely when a timeout is scheduled. Our timeout + * accuracy could be off by 2^(N*M)-1 units where N is the wheel number and + * M is WHEEL_BIT. Only timeouts which have fallen through to wheel 0 can be + * known exactly. + * + * We should never return a timeout larger than the lowest actual timeout. + */ +static timeout_t timeouts_int(struct timeouts *T) { + timeout_t timeout = ~TIMEOUT_C(0), _timeout; + timeout_t relmask; + int wheel, slot; + + relmask = 0; + + for (wheel = 0; wheel < WHEEL_NUM; wheel++) { + if (T->pending[wheel]) { + slot = WHEEL_MASK & (T->curtime >> (wheel * WHEEL_BIT)); + + /* ctz input cannot be zero: T->pending[wheel] is + * nonzero, so rotr() is nonzero. */ + _timeout = (ctz(rotr(T->pending[wheel], slot)) + !!wheel) << (wheel * WHEEL_BIT); + /* +1 to higher order wheels as those timeouts are one rotation in the future (otherwise they'd be on a lower wheel or expired) */ + + _timeout -= relmask & T->curtime; + /* reduce by how much lower wheels have progressed */ + + timeout = MIN(_timeout, timeout); + } + + relmask <<= WHEEL_BIT; + relmask |= WHEEL_MASK; + } + + return timeout; +} /* timeouts_int() */ + + +/* + * Calculate the interval our caller can wait before needing to process + * events. + */ +TIMEOUT_PUBLIC timeout_t timeouts_timeout(struct timeouts *T) { + if (!TOR_TAILQ_EMPTY(&T->expired)) + return 0; + + return timeouts_int(T); +} /* timeouts_timeout() */ + + +TIMEOUT_PUBLIC struct timeout *timeouts_get(struct timeouts *T) { + if (!TOR_TAILQ_EMPTY(&T->expired)) { + struct timeout *to = TOR_TAILQ_FIRST(&T->expired); + + TOR_TAILQ_REMOVE(&T->expired, to, tqe); + to->pending = NULL; + TO_SET_TIMEOUTS(to, NULL); + +#ifndef TIMEOUT_DISABLE_INTERVALS + if ((to->flags & TIMEOUT_INT) && to->interval > 0) + timeouts_readd(T, to); +#endif + + return to; + } else { + return 0; + } +} /* timeouts_get() */ + + +/* + * Use dumb looping to locate the earliest timeout pending on the wheel so + * our invariant assertions can check the result of our optimized code. + */ +static struct timeout *timeouts_min(struct timeouts *T) { + struct timeout *to, *min = NULL; + unsigned i, j; + + for (i = 0; i < countof(T->wheel); i++) { + for (j = 0; j < countof(T->wheel[i]); j++) { + TOR_TAILQ_FOREACH(to, &T->wheel[i][j], tqe) { + if (!min || to->expires < min->expires) + min = to; + } + } + } + + return min; +} /* timeouts_min() */ + + +/* + * Check some basic algorithm invariants. If these invariants fail then + * something is definitely broken. + */ +#define report(...) do { \ + if ((fp)) \ + fprintf(fp, __VA_ARGS__); \ +} while (0) + +#define check(expr, ...) do { \ + if (!(expr)) { \ + report(__VA_ARGS__); \ + return 0; \ + } \ +} while (0) + +TIMEOUT_PUBLIC bool timeouts_check(struct timeouts *T, FILE *fp) { + timeout_t timeout; + struct timeout *to; + + if ((to = timeouts_min(T))) { + check(to->expires > T->curtime, "missed timeout (expires:%" TIMEOUT_PRIu " <= curtime:%" TIMEOUT_PRIu ")\n", to->expires, T->curtime); + + timeout = timeouts_int(T); + check(timeout <= to->expires - T->curtime, "wrong soft timeout (soft:%" TIMEOUT_PRIu " > hard:%" TIMEOUT_PRIu ") (expires:%" TIMEOUT_PRIu "; curtime:%" TIMEOUT_PRIu ")\n", timeout, (to->expires - T->curtime), to->expires, T->curtime); + + timeout = timeouts_timeout(T); + check(timeout <= to->expires - T->curtime, "wrong soft timeout (soft:%" TIMEOUT_PRIu " > hard:%" TIMEOUT_PRIu ") (expires:%" TIMEOUT_PRIu "; curtime:%" TIMEOUT_PRIu ")\n", timeout, (to->expires - T->curtime), to->expires, T->curtime); + } else { + timeout = timeouts_timeout(T); + + if (!TOR_TAILQ_EMPTY(&T->expired)) + check(timeout == 0, "wrong soft timeout (soft:%" TIMEOUT_PRIu " != hard:%" TIMEOUT_PRIu ")\n", timeout, TIMEOUT_C(0)); + else + check(timeout == ~TIMEOUT_C(0), "wrong soft timeout (soft:%" TIMEOUT_PRIu " != hard:%" TIMEOUT_PRIu ")\n", timeout, ~TIMEOUT_C(0)); + } + + return 1; +} /* timeouts_check() */ + + +#define ENTER \ + do { \ + static const int pc0 = __LINE__; \ + switch (pc0 + it->pc) { \ + case __LINE__: (void)0 + +#define SAVE_AND_DO(do_statement) \ + do { \ + it->pc = __LINE__ - pc0; \ + do_statement; \ + case __LINE__: (void)0; \ + } while (0) + +#define YIELD(rv) \ + SAVE_AND_DO(return (rv)) + +#define LEAVE \ + SAVE_AND_DO(break); \ + } \ + } while (0) + +TIMEOUT_PUBLIC struct timeout *timeouts_next(struct timeouts *T, struct timeouts_it *it) { + struct timeout *to; + + ENTER; + + if (it->flags & TIMEOUTS_EXPIRED) { + if (it->flags & TIMEOUTS_CLEAR) { + while ((to = timeouts_get(T))) { + YIELD(to); + } + } else { + TOR_TAILQ_FOREACH_SAFE(to, &T->expired, tqe, it->to) { + YIELD(to); + } + } + } + + if (it->flags & TIMEOUTS_PENDING) { + for (it->i = 0; it->i < countof(T->wheel); it->i++) { + for (it->j = 0; it->j < countof(T->wheel[it->i]); it->j++) { + TOR_TAILQ_FOREACH_SAFE(to, &T->wheel[it->i][it->j], tqe, it->to) { + YIELD(to); + } + } + } + } + + LEAVE; + + return NULL; +} /* timeouts_next */ + +#undef LEAVE +#undef YIELD +#undef SAVE_AND_DO +#undef ENTER + + +/* + * T I M E O U T R O U T I N E S + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +TIMEOUT_PUBLIC struct timeout *timeout_init(struct timeout *to, int flags) { + memset(to, 0, sizeof *to); + + to->flags = flags; + + return to; +} /* timeout_init() */ + + +#ifndef TIMEOUT_DISABLE_RELATIVE_ACCESS +TIMEOUT_PUBLIC bool timeout_pending(struct timeout *to) { + return to->pending && to->pending != &to->timeouts->expired; +} /* timeout_pending() */ + + +TIMEOUT_PUBLIC bool timeout_expired(struct timeout *to) { + return to->pending && to->pending == &to->timeouts->expired; +} /* timeout_expired() */ + + +TIMEOUT_PUBLIC void timeout_del(struct timeout *to) { + timeouts_del(to->timeouts, to); +} /* timeout_del() */ +#endif + + +/* + * V E R S I O N I N T E R F A C E S + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +TIMEOUT_PUBLIC int timeout_version(void) { + return TIMEOUT_VERSION; +} /* timeout_version() */ + + +TIMEOUT_PUBLIC const char *timeout_vendor(void) { + return TIMEOUT_VENDOR; +} /* timeout_version() */ + + +TIMEOUT_PUBLIC int timeout_v_rel(void) { + return TIMEOUT_V_REL; +} /* timeout_version() */ + + +TIMEOUT_PUBLIC int timeout_v_abi(void) { + return TIMEOUT_V_ABI; +} /* timeout_version() */ + + +TIMEOUT_PUBLIC int timeout_v_api(void) { + return TIMEOUT_V_API; +} /* timeout_version() */ + diff --git a/src/wraith/src/ext/timeouts/timeout.h b/src/wraith/src/ext/timeouts/timeout.h new file mode 100644 index 000000000..b35874e15 --- /dev/null +++ b/src/wraith/src/ext/timeouts/timeout.h @@ -0,0 +1,256 @@ +/* ========================================================================== + * timeout.h - Tickless hierarchical timing wheel. + * -------------------------------------------------------------------------- + * Copyright (c) 2013, 2014 William Ahern + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do so, subject to the + * following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * ========================================================================== + */ +#ifndef TIMEOUT_H +#define TIMEOUT_H + +#include /* bool */ +#include /* FILE */ + +#include /* PRIu64 PRIx64 PRIX64 uint64_t */ + +#include "tor_queue.h" /* TAILQ(3) */ + + +/* + * V E R S I O N I N T E R F A C E S + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#if !defined TIMEOUT_PUBLIC +#define TIMEOUT_PUBLIC +#endif + +#define TIMEOUT_VERSION TIMEOUT_V_REL +#define TIMEOUT_VENDOR "william@25thandClement.com" + +#define TIMEOUT_V_REL 0x20160226 +#define TIMEOUT_V_ABI 0x20160224 +#define TIMEOUT_V_API 0x20160226 + +TIMEOUT_PUBLIC int timeout_version(void); + +TIMEOUT_PUBLIC const char *timeout_vendor(void); + +TIMEOUT_PUBLIC int timeout_v_rel(void); + +TIMEOUT_PUBLIC int timeout_v_abi(void); + +TIMEOUT_PUBLIC int timeout_v_api(void); + + +/* + * I N T E G E R T Y P E I N T E R F A C E S + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#define TIMEOUT_C(n) UINT64_C(n) +#define TIMEOUT_PRIu PRIu64 +#define TIMEOUT_PRIx PRIx64 +#define TIMEOUT_PRIX PRIX64 + +#define TIMEOUT_mHZ TIMEOUT_C(1000) +#define TIMEOUT_uHZ TIMEOUT_C(1000000) +#define TIMEOUT_nHZ TIMEOUT_C(1000000000) + +typedef uint64_t timeout_t; + +#define timeout_error_t int /* for documentation purposes */ + + +/* + * C A L L B A C K I N T E R F A C E + * + * Callback function parameters unspecified to make embedding into existing + * applications easier. + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef TIMEOUT_CB_OVERRIDE +struct timeout_cb { + void (*fn)(void); + void *arg; +}; /* struct timeout_cb */ +#endif + +/* + * T I M E O U T I N T E R F A C E S + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef TIMEOUT_DISABLE_INTERVALS +#define TIMEOUT_INT 0x01 /* interval (repeating) timeout */ +#endif +#define TIMEOUT_ABS 0x02 /* treat timeout values as absolute */ + +#define TIMEOUT_INITIALIZER(flags) { (flags) } + +#define timeout_setcb(to, fn, arg) do { \ + (to)->callback.fn = (fn); \ + (to)->callback.arg = (arg); \ +} while (0) + +struct timeout { + int flags; + + timeout_t expires; + /* absolute expiration time */ + + struct timeout_list *pending; + /* timeout list if pending on wheel or expiry queue */ + + TOR_TAILQ_ENTRY(timeout) tqe; + /* entry member for struct timeout_list lists */ + +#ifndef TIMEOUT_DISABLE_CALLBACKS + struct timeout_cb callback; + /* optional callback information */ +#endif + +#ifndef TIMEOUT_DISABLE_INTERVALS + timeout_t interval; + /* timeout interval if periodic */ +#endif + +#ifndef TIMEOUT_DISABLE_RELATIVE_ACCESS + struct timeouts *timeouts; + /* timeouts collection if member of */ +#endif +}; /* struct timeout */ + + +TIMEOUT_PUBLIC struct timeout *timeout_init(struct timeout *, int); +/* initialize timeout structure (same as TIMEOUT_INITIALIZER) */ + +#ifndef TIMEOUT_DISABLE_RELATIVE_ACCESS +TIMEOUT_PUBLIC bool timeout_pending(struct timeout *); +/* true if on timing wheel, false otherwise */ + +TIMEOUT_PUBLIC bool timeout_expired(struct timeout *); +/* true if on expired queue, false otherwise */ + +TIMEOUT_PUBLIC void timeout_del(struct timeout *); +/* remove timeout from any timing wheel (okay if not member of any) */ +#endif + +/* + * T I M I N G W H E E L I N T E R F A C E S + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +struct timeouts; + +TIMEOUT_PUBLIC struct timeouts *timeouts_open(timeout_t, timeout_error_t *); +/* open a new timing wheel, setting optional HZ (for float conversions) */ + +TIMEOUT_PUBLIC void timeouts_close(struct timeouts *); +/* destroy timing wheel */ + +TIMEOUT_PUBLIC timeout_t timeouts_hz(struct timeouts *); +/* return HZ setting (for float conversions) */ + +TIMEOUT_PUBLIC void timeouts_update(struct timeouts *, timeout_t); +/* update timing wheel with current absolute time */ + +TIMEOUT_PUBLIC void timeouts_step(struct timeouts *, timeout_t); +/* step timing wheel by relative time */ + +TIMEOUT_PUBLIC timeout_t timeouts_get_curtime(struct timeouts *); +/* Return the current tick. */ + +TIMEOUT_PUBLIC timeout_t timeouts_timeout(struct timeouts *); +/* return interval to next required update */ + +TIMEOUT_PUBLIC void timeouts_add(struct timeouts *, struct timeout *, timeout_t); +/* add timeout to timing wheel */ + +TIMEOUT_PUBLIC void timeouts_del(struct timeouts *, struct timeout *); +/* remove timeout from any timing wheel or expired queue (okay if on neither) */ + +TIMEOUT_PUBLIC struct timeout *timeouts_get(struct timeouts *); +/* return any expired timeout (caller should loop until NULL-return) */ + +TIMEOUT_PUBLIC bool timeouts_pending(struct timeouts *); +/* return true if any timeouts pending on timing wheel */ + +TIMEOUT_PUBLIC bool timeouts_expired(struct timeouts *); +/* return true if any timeouts on expired queue */ + +TIMEOUT_PUBLIC bool timeouts_check(struct timeouts *, FILE *); +/* return true if invariants hold. describes failures to optional file handle. */ + +#define TIMEOUTS_PENDING 0x10 +#define TIMEOUTS_EXPIRED 0x20 +#define TIMEOUTS_ALL (TIMEOUTS_PENDING|TIMEOUTS_EXPIRED) +#define TIMEOUTS_CLEAR 0x40 + +#define TIMEOUTS_IT_INITIALIZER(flags) { (flags), 0, 0, 0, 0 } + +#define TIMEOUTS_IT_INIT(cur, _flags) do { \ + (cur)->flags = (_flags); \ + (cur)->pc = 0; \ +} while (0) + +struct timeouts_it { + int flags; + unsigned pc, i, j; + struct timeout *to; +}; /* struct timeouts_it */ + +TIMEOUT_PUBLIC struct timeout *timeouts_next(struct timeouts *, struct timeouts_it *); +/* return next timeout in pending wheel or expired queue. caller can delete + * the returned timeout, but should not otherwise manipulate the timing + * wheel. in particular, caller SHOULD NOT delete any other timeout as that + * could invalidate cursor state and trigger a use-after-free. + */ + +#define TIMEOUTS_FOREACH(var, T, flags) \ + struct timeouts_it _it = TIMEOUTS_IT_INITIALIZER((flags)); \ + while (((var) = timeouts_next((T), &_it))) + + +/* + * B O N U S W H E E L I N T E R F A C E S + * + * I usually use floating point timeouts in all my code, but it's cleaner to + * separate it to keep the core algorithmic code simple. + * + * Using macros instead of static inline routines where routines + * might be used to keep -lm linking optional. + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include /* ceil(3) */ + +#define timeouts_f2i(T, f) \ + ((timeout_t)ceil((f) * timeouts_hz((T)))) /* prefer late expiration over early */ + +#define timeouts_i2f(T, i) \ + ((double)(i) / timeouts_hz((T))) + +#define timeouts_addf(T, to, timeout) \ + timeouts_add((T), (to), timeouts_f2i((T), (timeout))) + +#endif /* TIMEOUT_H */ diff --git a/src/wraith/src/ext/tinytest.c b/src/wraith/src/ext/tinytest.c new file mode 100644 index 000000000..3fb1b39c7 --- /dev/null +++ b/src/wraith/src/ext/tinytest.c @@ -0,0 +1,501 @@ +/* tinytest.c -- Copyright 2009-2012 Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifdef TINYTEST_LOCAL +#include "tinytest_local.h" +#endif + +#include +#include +#include +#include + +#ifndef NO_FORKING + +#ifdef _WIN32 +#include +#else +#include +#include +#include +#endif + +#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) +#if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 && \ + __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) +/* Workaround for a stupid bug in OSX 10.6 */ +#define FORK_BREAKS_GCOV +#include +#endif +#endif + +#endif /* !NO_FORKING */ + +#ifndef __GNUC__ +#define __attribute__(x) +#endif + +#include "tinytest.h" +#include "tinytest_macros.h" + +#define LONGEST_TEST_NAME 16384 + +static int in_tinytest_main = 0; /**< true if we're in tinytest_main().*/ +static int n_ok = 0; /**< Number of tests that have passed */ +static int n_bad = 0; /**< Number of tests that have failed. */ +static int n_skipped = 0; /**< Number of tests that have been skipped. */ + +static int opt_forked = 0; /**< True iff we're called from inside a win32 fork*/ +static int opt_nofork = 0; /**< Suppress calls to fork() for debugging. */ +static int opt_verbosity = 1; /**< -==quiet,0==terse,1==normal,2==verbose */ +static const char *verbosity_flag = ""; + +static const struct testlist_alias_t *cfg_aliases=NULL; + +enum outcome { SKIP=2, OK=1, FAIL=0 }; +static enum outcome cur_test_outcome = 0; +/** prefix of the current test group */ +static const char *cur_test_prefix = NULL; +/** Name of the current test, if we haven't logged is yet. Used for --quiet */ +static const char *cur_test_name = NULL; + +#ifdef _WIN32 +/* Copy of argv[0] for win32. */ +static char commandname[MAX_PATH+1]; +#endif + +static void usage(struct testgroup_t *groups, int list_groups) + __attribute__((noreturn)); +static int process_test_option(struct testgroup_t *groups, const char *test); + +static enum outcome +testcase_run_bare_(const struct testcase_t *testcase) +{ + void *env = NULL; + int outcome; + if (testcase->setup) { + env = testcase->setup->setup_fn(testcase); + if (!env) + return FAIL; + else if (env == (void*)TT_SKIP) + return SKIP; + } + + cur_test_outcome = OK; + testcase->fn(env); + outcome = cur_test_outcome; + + if (testcase->setup) { + if (testcase->setup->cleanup_fn(testcase, env) == 0) + outcome = FAIL; + } + + return outcome; +} + +#define MAGIC_EXITCODE 42 + +#ifndef NO_FORKING + +static enum outcome +testcase_run_forked_(const struct testgroup_t *group, + const struct testcase_t *testcase) +{ +#ifdef _WIN32 + /* Fork? On Win32? How primitive! We'll do what the smart kids do: + we'll invoke our own exe (whose name we recall from the command + line) with a command line that tells it to run just the test we + want, and this time without forking. + + (No, threads aren't an option. The whole point of forking is to + share no state between tests.) + */ + int ok; + char buffer[LONGEST_TEST_NAME+256]; + STARTUPINFOA si; + PROCESS_INFORMATION info; + DWORD exitcode; + + if (!in_tinytest_main) { + printf("\nERROR. On Windows, testcase_run_forked_ must be" + " called from within tinytest_main.\n"); + abort(); + } + if (opt_verbosity>0) + printf("[forking] "); + + snprintf(buffer, sizeof(buffer), "%s --RUNNING-FORKED %s %s%s", + commandname, verbosity_flag, group->prefix, testcase->name); + + memset(&si, 0, sizeof(si)); + memset(&info, 0, sizeof(info)); + si.cb = sizeof(si); + + ok = CreateProcessA(commandname, buffer, NULL, NULL, 0, + 0, NULL, NULL, &si, &info); + if (!ok) { + printf("CreateProcess failed!\n"); + return 0; + } + WaitForSingleObject(info.hProcess, INFINITE); + GetExitCodeProcess(info.hProcess, &exitcode); + CloseHandle(info.hProcess); + CloseHandle(info.hThread); + if (exitcode == 0) + return OK; + else if (exitcode == MAGIC_EXITCODE) + return SKIP; + else + return FAIL; +#else + int outcome_pipe[2]; + pid_t pid; + (void)group; + + if (pipe(outcome_pipe)) + perror("opening pipe"); + + if (opt_verbosity>0) + printf("[forking] "); + pid = fork(); +#ifdef FORK_BREAKS_GCOV + vproc_transaction_begin(0); +#endif + if (!pid) { + /* child. */ + int test_r, write_r; + char b[1]; + close(outcome_pipe[0]); + test_r = testcase_run_bare_(testcase); + assert(0<=(int)test_r && (int)test_r<=2); + b[0] = "NYS"[test_r]; + write_r = (int)write(outcome_pipe[1], b, 1); + if (write_r != 1) { + perror("write outcome to pipe"); + exit(1); + } + exit(0); + return FAIL; /* unreachable */ + } else { + /* parent */ + int status, r; + char b[1]; + /* Close this now, so that if the other side closes it, + * our read fails. */ + close(outcome_pipe[1]); + r = (int)read(outcome_pipe[0], b, 1); + if (r == 0) { + printf("[Lost connection!] "); + return 0; + } else if (r != 1) { + perror("read outcome from pipe"); + } + waitpid(pid, &status, 0); + close(outcome_pipe[0]); + return b[0]=='Y' ? OK : (b[0]=='S' ? SKIP : FAIL); + } +#endif +} + +#endif /* !NO_FORKING */ + +int +testcase_run_one(const struct testgroup_t *group, + const struct testcase_t *testcase) +{ + enum outcome outcome; + + if (testcase->flags & (TT_SKIP|TT_OFF_BY_DEFAULT)) { + if (opt_verbosity>0) + printf("%s%s: %s\n", + group->prefix, testcase->name, + (testcase->flags & TT_SKIP) ? "SKIPPED" : "DISABLED"); + ++n_skipped; + return SKIP; + } + + if (opt_verbosity>0 && !opt_forked) { + printf("%s%s: ", group->prefix, testcase->name); + } else { + if (opt_verbosity==0) printf("."); + cur_test_prefix = group->prefix; + cur_test_name = testcase->name; + } + +#ifndef NO_FORKING + if ((testcase->flags & TT_FORK) && !(opt_forked||opt_nofork)) { + outcome = testcase_run_forked_(group, testcase); + } else { +#else + { +#endif + outcome = testcase_run_bare_(testcase); + } + + if (outcome == OK) { + ++n_ok; + if (opt_verbosity>0 && !opt_forked) + puts(opt_verbosity==1?"OK":""); + } else if (outcome == SKIP) { + ++n_skipped; + if (opt_verbosity>0 && !opt_forked) + puts("SKIPPED"); + } else { + ++n_bad; + if (!opt_forked) + printf("\n [%s FAILED]\n", testcase->name); + } + + if (opt_forked) { + exit(outcome==OK ? 0 : (outcome==SKIP?MAGIC_EXITCODE : 1)); + return 1; /* unreachable */ + } else { + return (int)outcome; + } +} + +int +tinytest_set_flag_(struct testgroup_t *groups, const char *arg, int set, unsigned long flag) +{ + int i, j; + size_t length = LONGEST_TEST_NAME; + char fullname[LONGEST_TEST_NAME]; + int found=0; + if (strstr(arg, "..")) + length = strstr(arg,"..")-arg; + for (i=0; groups[i].prefix; ++i) { + for (j=0; groups[i].cases[j].name; ++j) { + struct testcase_t *testcase = &groups[i].cases[j]; + snprintf(fullname, sizeof(fullname), "%s%s", + groups[i].prefix, testcase->name); + if (!flag) { /* Hack! */ + printf(" %s", fullname); + if (testcase->flags & TT_OFF_BY_DEFAULT) + puts(" (Off by default)"); + else if (testcase->flags & TT_SKIP) + puts(" (DISABLED)"); + else + puts(""); + } + if (!strncmp(fullname, arg, length)) { + if (set) + testcase->flags |= flag; + else + testcase->flags &= ~flag; + ++found; + } + } + } + return found; +} + +static void +usage(struct testgroup_t *groups, int list_groups) +{ + puts("Options are: [--verbose|--quiet|--terse] [--no-fork]"); + puts(" Specify tests by name, or using a prefix ending with '..'"); + puts(" To skip a test, prefix its name with a colon."); + puts(" To enable a disabled test, prefix its name with a plus."); + puts(" Use --list-tests for a list of tests."); + if (list_groups) { + puts("Known tests are:"); + tinytest_set_flag_(groups, "..", 1, 0); + } + exit(0); +} + +static int +process_test_alias(struct testgroup_t *groups, const char *test) +{ + int i, j, n, r; + for (i=0; cfg_aliases && cfg_aliases[i].name; ++i) { + if (!strcmp(cfg_aliases[i].name, test)) { + n = 0; + for (j = 0; cfg_aliases[i].tests[j]; ++j) { + r = process_test_option(groups, cfg_aliases[i].tests[j]); + if (r<0) + return -1; + n += r; + } + return n; + } + } + printf("No such test alias as @%s!",test); + return -1; +} + +static int +process_test_option(struct testgroup_t *groups, const char *test) +{ + int flag = TT_ENABLED_; + int n = 0; + if (test[0] == '@') { + return process_test_alias(groups, test + 1); + } else if (test[0] == ':') { + ++test; + flag = TT_SKIP; + } else if (test[0] == '+') { + ++test; + ++n; + if (!tinytest_set_flag_(groups, test, 0, TT_OFF_BY_DEFAULT)) { + printf("No such test as %s!\n", test); + return -1; + } + } else { + ++n; + } + if (!tinytest_set_flag_(groups, test, 1, flag)) { + printf("No such test as %s!\n", test); + return -1; + } + return n; +} + +void +tinytest_set_aliases(const struct testlist_alias_t *aliases) +{ + cfg_aliases = aliases; +} + +int +tinytest_main(int c, const char **v, struct testgroup_t *groups) +{ + int i, j, n=0; + +#ifdef _WIN32 + const char *sp = strrchr(v[0], '.'); + const char *extension = ""; + if (!sp || stricmp(sp, ".exe")) + extension = ".exe"; /* Add an exe so CreateProcess will work */ + snprintf(commandname, sizeof(commandname), "%s%s", v[0], extension); + commandname[MAX_PATH]='\0'; +#endif + for (i=1; i= 1) + printf("%d tests ok. (%d skipped)\n", n_ok, n_skipped); + + return (n_bad == 0) ? 0 : 1; +} + +int +tinytest_get_verbosity_(void) +{ + return opt_verbosity; +} + +void +tinytest_set_test_failed_(void) +{ + if (opt_verbosity <= 0 && cur_test_name) { + if (opt_verbosity==0) puts(""); + printf("%s%s: ", cur_test_prefix, cur_test_name); + cur_test_name = NULL; + } + cur_test_outcome = 0; +} + +void +tinytest_set_test_skipped_(void) +{ + if (cur_test_outcome==OK) + cur_test_outcome = SKIP; +} + +char * +tinytest_format_hex_(const void *val_, unsigned long len) +{ + const unsigned char *val = val_; + char *result, *cp; + size_t i; + int ellipses = 0; + + if (!val) + return strdup("null"); + if (len > 1024) { + ellipses = 3; + len = 1024; + } + if (!(result = malloc(len*2+4))) + return strdup(""); + cp = result; + for (i=0;i> 4)&0x0f]; + *cp++ = "0123456789ABCDEF"[val[i] & 0x0f]; + } + while (ellipses--) + *cp++ = '.'; + *cp = 0; + return result; +} diff --git a/src/wraith/src/ext/tinytest.h b/src/wraith/src/ext/tinytest.h new file mode 100644 index 000000000..ed07b26bc --- /dev/null +++ b/src/wraith/src/ext/tinytest.h @@ -0,0 +1,100 @@ +/* tinytest.h -- Copyright 2009-2012 Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TINYTEST_H_INCLUDED_ +#define TINYTEST_H_INCLUDED_ + +/** Flag for a test that needs to run in a subprocess. */ +#define TT_FORK (1<<0) +/** Runtime flag for a test we've decided to skip. */ +#define TT_SKIP (1<<1) +/** Internal runtime flag for a test we've decided to run. */ +#define TT_ENABLED_ (1<<2) +/** Flag for a test that's off by default. */ +#define TT_OFF_BY_DEFAULT (1<<3) +/** If you add your own flags, make them start at this point. */ +#define TT_FIRST_USER_FLAG (1<<4) + +typedef void (*testcase_fn)(void *); + +struct testcase_t; + +/** Functions to initialize/teardown a structure for a testcase. */ +struct testcase_setup_t { + /** Return a new structure for use by a given testcase. */ + void *(*setup_fn)(const struct testcase_t *); + /** Clean/free a structure from setup_fn. Return 1 if ok, 0 on err. */ + int (*cleanup_fn)(const struct testcase_t *, void *); +}; + +/** A single test-case that you can run. */ +struct testcase_t { + const char *name; /**< An identifier for this case. */ + testcase_fn fn; /**< The function to run to implement this case. */ + unsigned long flags; /**< Bitfield of TT_* flags. */ + const struct testcase_setup_t *setup; /**< Optional setup/cleanup fns*/ + void *setup_data; /**< Extra data usable by setup function */ +}; +#define END_OF_TESTCASES { NULL, NULL, 0, NULL, NULL } + +/** A group of tests that are selectable together. */ +struct testgroup_t { + const char *prefix; /**< Prefix to prepend to testnames. */ + struct testcase_t *cases; /** Array, ending with END_OF_TESTCASES */ +}; +#define END_OF_GROUPS { NULL, NULL} + +struct testlist_alias_t { + const char *name; + const char **tests; +}; +#define END_OF_ALIASES { NULL, NULL } + +/** Implementation: called from a test to indicate failure, before logging. */ +void tinytest_set_test_failed_(void); +/** Implementation: called from a test to indicate that we're skipping. */ +void tinytest_set_test_skipped_(void); +/** Implementation: return 0 for quiet, 1 for normal, 2 for loud. */ +int tinytest_get_verbosity_(void); +/** Implementation: Set a flag on tests matching a name; returns number + * of tests that matched. */ +int tinytest_set_flag_(struct testgroup_t *, const char *, int set, unsigned long); +/** Implementation: Put a chunk of memory into hex. */ +char *tinytest_format_hex_(const void *, unsigned long); + +/** Set all tests in 'groups' matching the name 'named' to be skipped. */ +#define tinytest_skip(groups, named) \ + tinytest_set_flag_(groups, named, 1, TT_SKIP) + +/** Run a single testcase in a single group. */ +int testcase_run_one(const struct testgroup_t *,const struct testcase_t *); + +void tinytest_set_aliases(const struct testlist_alias_t *aliases); + +/** Run a set of testcases from an END_OF_GROUPS-terminated array of groups, + as selected from the command line. */ +int tinytest_main(int argc, const char **argv, struct testgroup_t *groups); + +#endif diff --git a/src/wraith/src/ext/tinytest_demo.c b/src/wraith/src/ext/tinytest_demo.c new file mode 100644 index 000000000..c07f09979 --- /dev/null +++ b/src/wraith/src/ext/tinytest_demo.c @@ -0,0 +1,264 @@ +/* tinytest_demo.c -- Copyright 2009-2012 Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/* Welcome to the example file for tinytest! I'll show you how to set up + * some simple and not-so-simple testcases. */ + +/* Make sure you include these headers. */ +#include "tinytest.h" +#include "tinytest_macros.h" + +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#else +#include +#endif + +/* ============================================================ */ + +/* First, let's see if strcmp is working. (All your test cases should be + * functions declared to take a single void * as an argument.) */ +void +test_strcmp(void *data) +{ + (void)data; /* This testcase takes no data. */ + + /* Let's make sure the empty string is equal to itself */ + if (strcmp("","")) { + /* This macro tells tinytest to stop the current test + * and go straight to the "end" label. */ + tt_abort_msg("The empty string was not equal to itself"); + } + + /* Pretty often, calling tt_abort_msg to indicate failure is more + heavy-weight than you want. Instead, just say: */ + tt_assert(strcmp("testcase", "testcase") == 0); + + /* Occasionally, you don't want to stop the current testcase just + because a single assertion has failed. In that case, use + tt_want: */ + tt_want(strcmp("tinytest", "testcase") > 0); + + /* You can use the tt_*_op family of macros to compare values and to + fail unless they have the relationship you want. They produce + more useful output than tt_assert, since they display the actual + values of the failing things. + + Fail unless strcmp("abc, "abc") == 0 */ + tt_int_op(strcmp("abc", "abc"), OP_EQ, 0); + + /* Fail unless strcmp("abc, "abcd") is less than 0 */ + tt_int_op(strcmp("abc", "abcd"), OP_LT, 0); + + /* Incidentally, there's a test_str_op that uses strcmp internally. */ + tt_str_op("abc", OP_LT, "abcd"); + + + /* Every test-case function needs to finish with an "end:" + label and (optionally) code to clean up local variables. */ + end: + ; +} + +/* ============================================================ */ + +/* Now let's mess with setup and teardown functions! These are handy if + you have a bunch of tests that all need a similar environment, and you + want to reconstruct that environment freshly for each one. */ + +/* First you declare a type to hold the environment info, and functions to + set it up and tear it down. */ +struct data_buffer { + /* We're just going to have couple of character buffer. Using + setup/teardown functions is probably overkill for this case. + + You could also do file descriptors, complicated handles, temporary + files, etc. */ + char buffer1[512]; + char buffer2[512]; +}; +/* The setup function needs to take a const struct testcase_t and return + void* */ +void * +setup_data_buffer(const struct testcase_t *testcase) +{ + struct data_buffer *db = malloc(sizeof(struct data_buffer)); + + /* If you had a complicated set of setup rules, you might behave + differently here depending on testcase->flags or + testcase->setup_data or even or testcase->name. */ + + /* Returning a NULL here would mean that we couldn't set up for this + test, so we don't need to test db for null. */ + return db; +} +/* The clean function deallocates storage carefully and returns true on + success. */ +int +clean_data_buffer(const struct testcase_t *testcase, void *ptr) +{ + struct data_buffer *db = ptr; + + if (db) { + free(db); + return 1; + } + return 0; +} +/* Finally, declare a testcase_setup_t with these functions. */ +struct testcase_setup_t data_buffer_setup = { + setup_data_buffer, clean_data_buffer +}; + + +/* Now let's write our test. */ +void +test_memcpy(void *ptr) +{ + /* This time, we use the argument. */ + struct data_buffer *db = ptr; + + /* We'll also introduce a local variable that might need cleaning up. */ + char *mem = NULL; + + /* Let's make sure that memcpy does what we'd like. */ + strcpy(db->buffer1, "String 0"); + memcpy(db->buffer2, db->buffer1, sizeof(db->buffer1)); + tt_str_op(db->buffer1, OP_EQ, db->buffer2); + + /* tt_mem_op() does a memcmp, as opposed to the strcmp in tt_str_op() */ + db->buffer2[100] = 3; /* Make the buffers unequal */ + tt_mem_op(db->buffer1, OP_LT, db->buffer2, sizeof(db->buffer1)); + + /* Now we've allocated memory that's referenced by a local variable. + The end block of the function will clean it up. */ + mem = strdup("Hello world."); + tt_assert(mem); + + /* Another rather trivial test. */ + tt_str_op(db->buffer1, OP_NE, mem); + + end: + /* This time our end block has something to do. */ + if (mem) + free(mem); +} + +void +test_timeout(void *ptr) +{ + time_t t1, t2; + (void)ptr; + t1 = time(NULL); +#ifdef _WIN32 + Sleep(5000); +#else + sleep(5); +#endif + t2 = time(NULL); + + tt_int_op(t2-t1, OP_GE, 4); + + tt_int_op(t2-t1, OP_LE, 6); + + end: + ; +} + +/* ============================================================ */ + +/* Now we need to make sure that our tests get invoked. First, you take + a bunch of related tests and put them into an array of struct testcase_t. +*/ + +struct testcase_t demo_tests[] = { + /* Here's a really simple test: it has a name you can refer to it + with, and a function to invoke it. */ + { "strcmp", test_strcmp, }, + + /* The second test has a flag, "TT_FORK", to make it run in a + subprocess, and a pointer to the testcase_setup_t that configures + its environment. */ + { "memcpy", test_memcpy, TT_FORK, &data_buffer_setup }, + + /* This flag is off-by-default, since it takes a while to run. You + * can enable it manually by passing +demo/timeout at the command line.*/ + { "timeout", test_timeout, TT_OFF_BY_DEFAULT }, + + /* The array has to end with END_OF_TESTCASES. */ + END_OF_TESTCASES +}; + +/* Next, we make an array of testgroups. This is mandatory. Unlike more + heavy-duty testing frameworks, groups can't nest. */ +struct testgroup_t groups[] = { + + /* Every group has a 'prefix', and an array of tests. That's it. */ + { "demo/", demo_tests }, + + END_OF_GROUPS +}; + +/* We can also define test aliases. These can be used for types of tests that + * cut across groups. */ +const char *alltests[] = { "+..", NULL }; +const char *slowtests[] = { "+demo/timeout", NULL }; +struct testlist_alias_t aliases[] = { + + { "ALL", alltests }, + { "SLOW", slowtests }, + + END_OF_ALIASES +}; + + +int +main(int c, const char **v) +{ + /* Finally, just call tinytest_main(). It lets you specify verbose + or quiet output with --verbose and --quiet. You can list + specific tests: + + tinytest-demo demo/memcpy + + or use a ..-wildcard to select multiple tests with a common + prefix: + + tinytest-demo demo/.. + + If you list no tests, you get them all by default, so that + "tinytest-demo" and "tinytest-demo .." mean the same thing. + + */ + tinytest_set_aliases(aliases); + return tinytest_main(c, v, groups); +} diff --git a/src/wraith/src/ext/tinytest_macros.h b/src/wraith/src/ext/tinytest_macros.h new file mode 100644 index 000000000..c3728d1fd --- /dev/null +++ b/src/wraith/src/ext/tinytest_macros.h @@ -0,0 +1,199 @@ +/* tinytest_macros.h -- Copyright 2009-2012 Nick Mathewson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TINYTEST_MACROS_H_INCLUDED_ +#define TINYTEST_MACROS_H_INCLUDED_ + +/* Helpers for defining statement-like macros */ +#define TT_STMT_BEGIN do { +#define TT_STMT_END } while (0) + +/* Redefine this if your test functions want to abort with something besides + * "goto end;" */ +#ifndef TT_EXIT_TEST_FUNCTION +#define TT_EXIT_TEST_FUNCTION TT_STMT_BEGIN goto end; TT_STMT_END +#endif + +/* Redefine this if you want to note success/failure in some different way. */ +#ifndef TT_DECLARE +#define TT_DECLARE(prefix, args) \ + TT_STMT_BEGIN \ + printf("\n %s %s:%d: ",prefix,__FILE__,__LINE__); \ + printf args ; \ + TT_STMT_END +#endif + +/* Announce a failure. Args are parenthesized printf args. */ +#define TT_GRIPE(args) TT_DECLARE("FAIL", args) + +/* Announce a non-failure if we're verbose. */ +#define TT_BLATHER(args) \ + TT_STMT_BEGIN \ + if (tinytest_get_verbosity_()>1) TT_DECLARE(" OK", args); \ + TT_STMT_END + +#define TT_DIE(args) \ + TT_STMT_BEGIN \ + tinytest_set_test_failed_(); \ + TT_GRIPE(args); \ + TT_EXIT_TEST_FUNCTION; \ + TT_STMT_END + +#define TT_FAIL(args) \ + TT_STMT_BEGIN \ + tinytest_set_test_failed_(); \ + TT_GRIPE(args); \ + TT_STMT_END + +/* Fail and abort the current test for the reason in msg */ +#define tt_abort_printf(msg) TT_DIE(msg) +#define tt_abort_perror(op) TT_DIE(("%s: %s [%d]",(op),strerror(errno), errno)) +#define tt_abort_msg(msg) TT_DIE(("%s", msg)) +#define tt_abort() TT_DIE(("%s", "(Failed.)")) + +/* Fail but do not abort the current test for the reason in msg. */ +#define tt_failprint_f(msg) TT_FAIL(msg) +#define tt_fail_perror(op) TT_FAIL(("%s: %s [%d]",(op),strerror(errno), errno)) +#define tt_fail_msg(msg) TT_FAIL(("%s", msg)) +#define tt_fail() TT_FAIL(("%s", "(Failed.)")) + +/* End the current test, and indicate we are skipping it. */ +#define tt_skip() \ + TT_STMT_BEGIN \ + tinytest_set_test_skipped_(); \ + TT_EXIT_TEST_FUNCTION; \ + TT_STMT_END + +#define tt_want_(b, msg, fail) \ + TT_STMT_BEGIN \ + if (!(b)) { \ + tinytest_set_test_failed_(); \ + TT_GRIPE(("%s",msg)); \ + fail; \ + } else { \ + TT_BLATHER(("%s",msg)); \ + } \ + TT_STMT_END + +/* Assert b, but do not stop the test if b fails. Log msg on failure. */ +#define tt_want_msg(b, msg) \ + tt_want_(b, msg, ); + +/* Assert b and stop the test if b fails. Log msg on failure. */ +#define tt_assert_msg(b, msg) \ + tt_want_(b, msg, TT_EXIT_TEST_FUNCTION); + +/* Assert b, but do not stop the test if b fails. */ +#define tt_want(b) tt_want_msg( (b), "want("#b")") +/* Assert b, and stop the test if b fails. */ +#define tt_assert(b) tt_assert_msg((b), "assert("#b")") + +#define tt_assert_test_fmt_type(a,b,str_test,type,test,printf_type,printf_fmt, \ + setup_block,cleanup_block,die_on_fail) \ + TT_STMT_BEGIN \ + type val1_ = (a); \ + type val2_ = (b); \ + int tt_status_ = (test); \ + if (!tt_status_ || tinytest_get_verbosity_()>1) { \ + printf_type print_; \ + printf_type print1_; \ + printf_type print2_; \ + type value_ = val1_; \ + setup_block; \ + print1_ = print_; \ + value_ = val2_; \ + setup_block; \ + print2_ = print_; \ + TT_DECLARE(tt_status_?" OK":"FAIL", \ + ("assert(%s): "printf_fmt" vs "printf_fmt, \ + str_test, print1_, print2_)); \ + print_ = print1_; \ + cleanup_block; \ + print_ = print2_; \ + cleanup_block; \ + if (!tt_status_) { \ + tinytest_set_test_failed_(); \ + die_on_fail ; \ + } \ + } \ + TT_STMT_END + +#define tt_assert_test_type(a,b,str_test,type,test,fmt,die_on_fail) \ + tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt, \ + {print_=value_;},{},die_on_fail) + +#define tt_assert_test_type_opt(a,b,str_test,type,test,fmt,die_on_fail) \ + tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt, \ + {print_=value_?value_:"";},{},die_on_fail) + +/* Helper: assert that a op b, when cast to type. Format the values with + * printf format fmt on failure. */ +#define tt_assert_op_type(a,op,b,type,fmt) \ + tt_assert_test_type(a,b,#a" "#op" "#b,type,(val1_ op val2_),fmt, \ + TT_EXIT_TEST_FUNCTION) + +#define tt_int_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_), \ + "%ld",TT_EXIT_TEST_FUNCTION) + +#define tt_uint_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,unsigned long, \ + (val1_ op val2_),"%lu",TT_EXIT_TEST_FUNCTION) + +#define tt_ptr_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,const void*, \ + (val1_ op val2_),"%p",TT_EXIT_TEST_FUNCTION) + +#define tt_str_op(a,op,b) \ + tt_assert_test_type_opt(a,b,#a" "#op" "#b,const char *, \ + (val1_ && val2_ && strcmp(val1_,val2_) op 0),"<%s>", \ + TT_EXIT_TEST_FUNCTION) + +#define tt_mem_op(expr1, op, expr2, len) \ + tt_assert_test_fmt_type(expr1,expr2,#expr1" "#op" "#expr2, \ + const void *, \ + (val1_ && val2_ && memcmp(val1_, val2_, len) op 0), \ + char *, "%s", \ + { print_ = tinytest_format_hex_(value_, (len)); }, \ + { if (print_) free(print_); }, \ + TT_EXIT_TEST_FUNCTION \ + ); + +#define tt_want_int_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_),"%ld",(void)0) + +#define tt_want_uint_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,unsigned long, \ + (val1_ op val2_),"%lu",(void)0) + +#define tt_want_ptr_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,const void*, \ + (val1_ op val2_),"%p",(void)0) + +#define tt_want_str_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,const char *, \ + (strcmp(val1_,val2_) op 0),"<%s>",(void)0) + +#endif diff --git a/src/wraith/src/ext/tor_queue.h b/src/wraith/src/ext/tor_queue.h new file mode 100644 index 000000000..a6530c2b9 --- /dev/null +++ b/src/wraith/src/ext/tor_queue.h @@ -0,0 +1,575 @@ +/* $OpenBSD: queue.h,v 1.36 2012/04/11 13:29:14 naddy Exp $ */ +/* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */ + +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + */ + +#ifndef TOR_QUEUE_H_ +#define TOR_QUEUE_H_ + +/* + * This file defines five types of data structures: singly-linked lists, + * lists, simple queues, tail queues, and circular queues. + * + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A simple queue is headed by a pair of pointers, one the head of the + * list and the other to the tail of the list. The elements are singly + * linked to save space, so elements can only be removed from the + * head of the list. New elements can be added to the list before or after + * an existing element, at the head of the list, or at the end of the + * list. A simple queue may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * A circle queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or after + * an existing element, at the head of the list, or at the end of the list. + * A circle queue may be traversed in either direction, but has a more + * complex end of list detection. + * + * For details on the use of these macros, see the queue(3) manual page. + */ + +#if defined(QUEUE_MACRO_DEBUG) || (defined(_KERNEL) && defined(DIAGNOSTIC)) +#define TOR_Q_INVALIDATE_(a) (a) = ((void *)-1) +#else +#define TOR_Q_INVALIDATE_(a) +#endif + +/* + * Singly-linked List definitions. + */ +#define TOR_SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define TOR_SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define TOR_SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List access methods. + */ +#define TOR_SLIST_FIRST(head) ((head)->slh_first) +#define TOR_SLIST_END(head) NULL +/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ +#define TOR_SLIST_EMPTY(head) ((SLIST_FIRST(head) == TOR_SLIST_END(head)) || 0) +#define TOR_SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#define TOR_SLIST_FOREACH(var, head, field) \ + for((var) = TOR_SLIST_FIRST(head); \ + (var) != TOR_SLIST_END(head); \ + (var) = TOR_SLIST_NEXT(var, field)) + +#define TOR_SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TOR_SLIST_FIRST(head); \ + (var) && ((tvar) = TOR_SLIST_NEXT(var, field), 1); \ + (var) = (tvar)) + +/* + * Singly-linked List functions. + */ +#define TOR_SLIST_INIT(head) { \ + TOR_SLIST_FIRST(head) = TOR_SLIST_END(head); \ +} + +#define TOR_SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ +} while (0) + +#define TOR_SLIST_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.sle_next = (head)->slh_first; \ + (head)->slh_first = (elm); \ +} while (0) + +#define TOR_SLIST_REMOVE_AFTER(elm, field) do { \ + (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next; \ +} while (0) + +#define TOR_SLIST_REMOVE_HEAD(head, field) do { \ + (head)->slh_first = (head)->slh_first->field.sle_next; \ +} while (0) + +#define TOR_SLIST_REMOVE(head, elm, type, field) do { \ + if ((head)->slh_first == (elm)) { \ + TOR_SLIST_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->slh_first; \ + \ + while (curelm->field.sle_next != (elm)) \ + curelm = curelm->field.sle_next; \ + curelm->field.sle_next = \ + curelm->field.sle_next->field.sle_next; \ + TOR_Q_INVALIDATE_((elm)->field.sle_next); \ + } \ +} while (0) + +/* + * List definitions. + */ +#define TOR_LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define TOR_LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define TOR_LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +/* + * List access methods + */ +#define TOR_LIST_FIRST(head) ((head)->lh_first) +#define TOR_LIST_END(head) NULL +/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ +#define TOR_LIST_EMPTY(head) \ + ((TOR_LIST_FIRST(head) == TOR_LIST_END(head)) || 0) +#define TOR_LIST_NEXT(elm, field) ((elm)->field.le_next) + +#define TOR_LIST_FOREACH(var, head, field) \ + for((var) = TOR_LIST_FIRST(head); \ + (var)!= TOR_LIST_END(head); \ + (var) = TOR_LIST_NEXT(var, field)) + +#define TOR_LIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TOR_LIST_FIRST(head); \ + (var) && ((tvar) = TOR_LIST_NEXT(var, field), 1); \ + (var) = (tvar)) + +/* + * List functions. + */ +#define TOR_LIST_INIT(head) do { \ + TOR_LIST_FIRST(head) = TOR_LIST_END(head); \ +} while (0) + +#define TOR_LIST_INSERT_AFTER(listelm, elm, field) do { \ + if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ + (listelm)->field.le_next->field.le_prev = \ + &(elm)->field.le_next; \ + (listelm)->field.le_next = (elm); \ + (elm)->field.le_prev = &(listelm)->field.le_next; \ +} while (0) + +#define TOR_LIST_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + (elm)->field.le_next = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &(elm)->field.le_next; \ +} while (0) + +#define TOR_LIST_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.le_next = (head)->lh_first) != NULL) \ + (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ + (head)->lh_first = (elm); \ + (elm)->field.le_prev = &(head)->lh_first; \ +} while (0) + +#define TOR_LIST_REMOVE(elm, field) do { \ + if ((elm)->field.le_next != NULL) \ + (elm)->field.le_next->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = (elm)->field.le_next; \ + TOR_Q_INVALIDATE_((elm)->field.le_prev); \ + TOR_Q_INVALIDATE_((elm)->field.le_next); \ +} while (0) + +#define TOR_LIST_REPLACE(elm, elm2, field) do { \ + if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \ + (elm2)->field.le_next->field.le_prev = \ + &(elm2)->field.le_next; \ + (elm2)->field.le_prev = (elm)->field.le_prev; \ + *(elm2)->field.le_prev = (elm2); \ + TOR_Q_INVALIDATE_((elm)->field.le_prev); \ + TOR_Q_INVALIDATE_((elm)->field.le_next); \ +} while (0) + +/* + * Simple queue definitions. + */ +#define TOR_SIMPLEQ_HEAD(name, type) \ +struct name { \ + struct type *sqh_first; /* first element */ \ + struct type **sqh_last; /* addr of last next element */ \ +} + +#define TOR_SIMPLEQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).sqh_first } + +#define TOR_SIMPLEQ_ENTRY(type) \ +struct { \ + struct type *sqe_next; /* next element */ \ +} + +/* + * Simple queue access methods. + */ +#define TOR_SIMPLEQ_FIRST(head) ((head)->sqh_first) +#define TOR_SIMPLEQ_END(head) NULL +/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ +#define TOR_SIMPLEQ_EMPTY(head) \ + ((TOR_SIMPLEQ_FIRST(head) == TOR_SIMPLEQ_END(head)) || 0) +#define TOR_SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) + +#define TOR_SIMPLEQ_FOREACH(var, head, field) \ + for((var) = TOR_SIMPLEQ_FIRST(head); \ + (var) != TOR_SIMPLEQ_END(head); \ + (var) = TOR_SIMPLEQ_NEXT(var, field)) + +#define TOR_SIMPLEQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TOR_SIMPLEQ_FIRST(head); \ + (var) && ((tvar) = TOR_SIMPLEQ_NEXT(var, field), 1); \ + (var) = (tvar)) + +/* + * Simple queue functions. + */ +#define TOR_SIMPLEQ_INIT(head) do { \ + (head)->sqh_first = NULL; \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (0) + +#define TOR_SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (head)->sqh_first = (elm); \ +} while (0) + +#define TOR_SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.sqe_next = NULL; \ + *(head)->sqh_last = (elm); \ + (head)->sqh_last = &(elm)->field.sqe_next; \ +} while (0) + +#define TOR_SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (listelm)->field.sqe_next = (elm); \ +} while (0) + +#define TOR_SIMPLEQ_REMOVE_HEAD(head, field) do { \ + if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (0) + +#define TOR_SIMPLEQ_REMOVE_AFTER(head, elm, field) do { \ + if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) \ + == NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ +} while (0) + +/* + * Tail queue definitions. + */ +#define TOR_TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ +} + +#define TOR_TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first } + +#define TOR_TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ +} + +/* + * tail queue access methods + */ +#define TOR_TAILQ_FIRST(head) ((head)->tqh_first) +#define TOR_TAILQ_END(head) NULL +#define TOR_TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) +#define TOR_TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) +/* XXX */ +#define TOR_TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) +/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ +#define TOR_TAILQ_EMPTY(head) \ + ((TOR_TAILQ_FIRST(head) == TOR_TAILQ_END(head)) || 0) + +#define TOR_TAILQ_FOREACH(var, head, field) \ + for((var) = TOR_TAILQ_FIRST(head); \ + (var) != TOR_TAILQ_END(head); \ + (var) = TOR_TAILQ_NEXT(var, field)) + +#define TOR_TAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TOR_TAILQ_FIRST(head); \ + (var) != TOR_TAILQ_END(head) && \ + ((tvar) = TOR_TAILQ_NEXT(var, field), 1); \ + (var) = (tvar)) + + +#define TOR_TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for((var) = TOR_TAILQ_LAST(head, headname); \ + (var) != TOR_TAILQ_END(head); \ + (var) = TOR_TAILQ_PREV(var, headname, field)) + +#define TOR_TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ + for ((var) = TOR_TAILQ_LAST(head, headname); \ + (var) != TOR_TAILQ_END(head) && \ + ((tvar) = TOR_TAILQ_PREV(var, headname, field), 1); \ + (var) = (tvar)) + +/* + * Tail queue functions. + */ +#define TOR_TAILQ_INIT(head) do { \ + (head)->tqh_first = NULL; \ + (head)->tqh_last = &(head)->tqh_first; \ +} while (0) + +#define TOR_TAILQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ + (head)->tqh_first->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (head)->tqh_first = (elm); \ + (elm)->field.tqe_prev = &(head)->tqh_first; \ +} while (0) + +#define TOR_TAILQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.tqe_next = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &(elm)->field.tqe_next; \ +} while (0) + +#define TOR_TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ + (elm)->field.tqe_next->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (listelm)->field.tqe_next = (elm); \ + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ +} while (0) + +#define TOR_TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + (elm)->field.tqe_next = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ +} while (0) + +#define TOR_TAILQ_REMOVE(head, elm, field) do { \ + if (((elm)->field.tqe_next) != NULL) \ + (elm)->field.tqe_next->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ + TOR_Q_INVALIDATE_((elm)->field.tqe_prev); \ + TOR_Q_INVALIDATE_((elm)->field.tqe_next); \ +} while (0) + +#define TOR_TAILQ_REPLACE(head, elm, elm2, field) do { \ + if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL) \ + (elm2)->field.tqe_next->field.tqe_prev = \ + &(elm2)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm2)->field.tqe_next; \ + (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \ + *(elm2)->field.tqe_prev = (elm2); \ + TOR_Q_INVALIDATE_((elm)->field.tqe_prev); \ + TOR_Q_INVALIDATE_((elm)->field.tqe_next); \ +} while (0) + +/* + * Circular queue definitions. + */ +#define TOR_CIRCLEQ_HEAD(name, type) \ +struct name { \ + struct type *cqh_first; /* first element */ \ + struct type *cqh_last; /* last element */ \ +} + +#define TOR_CIRCLEQ_HEAD_INITIALIZER(head) \ + { TOR_CIRCLEQ_END(&head), TOR_CIRCLEQ_END(&head) } + +#define TOR_CIRCLEQ_ENTRY(type) \ +struct { \ + struct type *cqe_next; /* next element */ \ + struct type *cqe_prev; /* previous element */ \ +} + +/* + * Circular queue access methods + */ +#define TOR_CIRCLEQ_FIRST(head) ((head)->cqh_first) +#define TOR_CIRCLEQ_LAST(head) ((head)->cqh_last) +#define TOR_CIRCLEQ_END(head) ((void *)(head)) +#define TOR_CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) +#define TOR_CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) +/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ +#define TOR_CIRCLEQ_EMPTY(head) \ + ((TOR_CIRCLEQ_FIRST(head) == TOR_CIRCLEQ_END(head)) || 0) + +#define TOR_CIRCLEQ_FOREACH(var, head, field) \ + for((var) = TOR_CIRCLEQ_FIRST(head); \ + (var) != TOR_CIRCLEQ_END(head); \ + (var) = TOR_CIRCLEQ_NEXT(var, field)) + +#define TOR_CIRCLEQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TOR_CIRCLEQ_FIRST(head); \ + (var) != TOR_CIRCLEQ_END(head) && \ + ((tvar) = TOR_CIRCLEQ_NEXT(var, field), 1); \ + (var) = (tvar)) + +#define TOR_CIRCLEQ_FOREACH_REVERSE(var, head, field) \ + for((var) = TOR_CIRCLEQ_LAST(head); \ + (var) != TOR_CIRCLEQ_END(head); \ + (var) = TOR_CIRCLEQ_PREV(var, field)) + +#define TOR_CIRCLEQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ + for ((var) = TOR_CIRCLEQ_LAST(head, headname); \ + (var) != TOR_CIRCLEQ_END(head) && \ + ((tvar) = TOR_CIRCLEQ_PREV(var, headname, field), 1); \ + (var) = (tvar)) + +/* + * Circular queue functions. + */ +#define TOR_CIRCLEQ_INIT(head) do { \ + (head)->cqh_first = TOR_CIRCLEQ_END(head); \ + (head)->cqh_last = TOR_CIRCLEQ_END(head); \ +} while (0) + +#define TOR_CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm)->field.cqe_next; \ + (elm)->field.cqe_prev = (listelm); \ + if ((listelm)->field.cqe_next == TOR_CIRCLEQ_END(head)) \ + (head)->cqh_last = (elm); \ + else \ + (listelm)->field.cqe_next->field.cqe_prev = (elm); \ + (listelm)->field.cqe_next = (elm); \ +} while (0) + +#define TOR_CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm); \ + (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ + if ((listelm)->field.cqe_prev == TOR_CIRCLEQ_END(head)) \ + (head)->cqh_first = (elm); \ + else \ + (listelm)->field.cqe_prev->field.cqe_next = (elm); \ + (listelm)->field.cqe_prev = (elm); \ +} while (0) + +#define TOR_CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.cqe_next = (head)->cqh_first; \ + (elm)->field.cqe_prev = TOR_CIRCLEQ_END(head); \ + if ((head)->cqh_last == TOR_CIRCLEQ_END(head)) \ + (head)->cqh_last = (elm); \ + else \ + (head)->cqh_first->field.cqe_prev = (elm); \ + (head)->cqh_first = (elm); \ +} while (0) + +#define TOR_CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.cqe_next = TOR_CIRCLEQ_END(head); \ + (elm)->field.cqe_prev = (head)->cqh_last; \ + if ((head)->cqh_first == TOR_CIRCLEQ_END(head)) \ + (head)->cqh_first = (elm); \ + else \ + (head)->cqh_last->field.cqe_next = (elm); \ + (head)->cqh_last = (elm); \ +} while (0) + +#define TOR_CIRCLEQ_REMOVE(head, elm, field) do { \ + if ((elm)->field.cqe_next == TOR_CIRCLEQ_END(head)) \ + (head)->cqh_last = (elm)->field.cqe_prev; \ + else \ + (elm)->field.cqe_next->field.cqe_prev = \ + (elm)->field.cqe_prev; \ + if ((elm)->field.cqe_prev == TOR_CIRCLEQ_END(head)) \ + (head)->cqh_first = (elm)->field.cqe_next; \ + else \ + (elm)->field.cqe_prev->field.cqe_next = \ + (elm)->field.cqe_next; \ + TOR_Q_INVALIDATE_((elm)->field.cqe_prev); \ + TOR_Q_INVALIDATE_((elm)->field.cqe_next); \ +} while (0) + +#define TOR_CIRCLEQ_REPLACE(head, elm, elm2, field) do { \ + if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == \ + TOR_CIRCLEQ_END(head)) \ + (head).cqh_last = (elm2); \ + else \ + (elm2)->field.cqe_next->field.cqe_prev = (elm2); \ + if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == \ + TOR_CIRCLEQ_END(head)) \ + (head).cqh_first = (elm2); \ + else \ + (elm2)->field.cqe_prev->field.cqe_next = (elm2); \ + TOR_Q_INVALIDATE_((elm)->field.cqe_prev); \ + TOR_Q_INVALIDATE_((elm)->field.cqe_next); \ +} while (0) + +#endif /* !_SYS_QUEUE_H_ */ diff --git a/src/wraith/src/ext/tor_queue.txt b/src/wraith/src/ext/tor_queue.txt new file mode 100644 index 000000000..f284e7192 --- /dev/null +++ b/src/wraith/src/ext/tor_queue.txt @@ -0,0 +1,883 @@ +Below follows the manpage for tor_queue.h, as included with OpenBSD's +sys/queue.h. License follows at the end of the file. + +====================================================================== +QUEUE(3) OpenBSD Programmer's Manual QUEUE(3) + +NAME + SLIST_ENTRY, SLIST_HEAD, SLIST_HEAD_INITIALIZER, SLIST_FIRST, SLIST_NEXT, + SLIST_END, SLIST_EMPTY, SLIST_FOREACH, SLIST_FOREACH_SAFE, SLIST_INIT, + SLIST_INSERT_AFTER, SLIST_INSERT_HEAD, SLIST_REMOVE_AFTER, + SLIST_REMOVE_HEAD, SLIST_REMOVE, LIST_ENTRY, LIST_HEAD, + LIST_HEAD_INITIALIZER, LIST_FIRST, LIST_NEXT, LIST_END, LIST_EMPTY, + LIST_FOREACH, LIST_FOREACH_SAFE, LIST_INIT, LIST_INSERT_AFTER, + LIST_INSERT_BEFORE, LIST_INSERT_HEAD, LIST_REMOVE, LIST_REPLACE, + SIMPLEQ_ENTRY, SIMPLEQ_HEAD, SIMPLEQ_HEAD_INITIALIZER, SIMPLEQ_FIRST, + SIMPLEQ_NEXT, SIMPLEQ_END, SIMPLEQ_EMPTY, SIMPLEQ_FOREACH, + SIMPLEQ_FOREACH_SAFE, SIMPLEQ_INIT, SIMPLEQ_INSERT_AFTER, + SIMPLEQ_INSERT_HEAD, SIMPLEQ_INSERT_TAIL, SIMPLEQ_REMOVE_AFTER, + SIMPLEQ_REMOVE_HEAD, TAILQ_ENTRY, TAILQ_HEAD, TAILQ_HEAD_INITIALIZER, + TAILQ_FIRST, TAILQ_NEXT, TAILQ_END, TAILQ_LAST, TAILQ_PREV, TAILQ_EMPTY, + TAILQ_FOREACH, TAILQ_FOREACH_SAFE, TAILQ_FOREACH_REVERSE, + TAILQ_FOREACH_REVERSE_SAFE, TAILQ_INIT, TAILQ_INSERT_AFTER, + TAILQ_INSERT_BEFORE, TAILQ_INSERT_HEAD, TAILQ_INSERT_TAIL, TAILQ_REMOVE, + TAILQ_REPLACE, CIRCLEQ_ENTRY, CIRCLEQ_HEAD, CIRCLEQ_HEAD_INITIALIZER, + CIRCLEQ_FIRST, CIRCLEQ_LAST, CIRCLEQ_END, CIRCLEQ_NEXT, CIRCLEQ_PREV, + CIRCLEQ_EMPTY, CIRCLEQ_FOREACH, CIRCLEQ_FOREACH_SAFE, + CIRCLEQ_FOREACH_REVERSE_SAFE, CIRCLEQ_INIT, CIRCLEQ_INSERT_AFTER, + CIRCLEQ_INSERT_BEFORE, CIRCLEQ_INSERT_HEAD, CIRCLEQ_INSERT_TAIL, + CIRCLEQ_REMOVE, CIRCLEQ_REPLACE - implementations of singly-linked lists, + doubly-linked lists, simple queues, tail queues, and circular queues + +SYNOPSIS + #include + + SLIST_ENTRY(TYPE); + + SLIST_HEAD(HEADNAME, TYPE); + + SLIST_HEAD_INITIALIZER(SLIST_HEAD head); + + struct TYPE * + SLIST_FIRST(SLIST_HEAD *head); + + struct TYPE * + SLIST_NEXT(struct TYPE *listelm, SLIST_ENTRY NAME); + + struct TYPE * + SLIST_END(SLIST_HEAD *head); + + int + SLIST_EMPTY(SLIST_HEAD *head); + + SLIST_FOREACH(VARNAME, SLIST_HEAD *head, SLIST_ENTRY NAME); + + SLIST_FOREACH_SAFE(VARNAME, SLIST_HEAD *head, SLIST_ENTRY + NAME, TEMP_VARNAME); + + void + SLIST_INIT(SLIST_HEAD *head); + + void + SLIST_INSERT_AFTER(struct TYPE *listelm, struct TYPE *elm, SLIST_ENTRY + NAME); + + void + SLIST_INSERT_HEAD(SLIST_HEAD *head, struct TYPE *elm, SLIST_ENTRY NAME); + + void + SLIST_REMOVE_AFTER(struct TYPE *elm, SLIST_ENTRY NAME); + + void + SLIST_REMOVE_HEAD(SLIST_HEAD *head, SLIST_ENTRY NAME); + + void + SLIST_REMOVE(SLIST_HEAD *head, struct TYPE *elm, TYPE, SLIST_ENTRY NAME); + + LIST_ENTRY(TYPE); + + LIST_HEAD(HEADNAME, TYPE); + + LIST_HEAD_INITIALIZER(LIST_HEAD head); + + struct TYPE * + LIST_FIRST(LIST_HEAD *head); + + struct TYPE * + LIST_NEXT(struct TYPE *listelm, LIST_ENTRY NAME); + + struct TYPE * + LIST_END(LIST_HEAD *head); + + int + LIST_EMPTY(LIST_HEAD *head); + + LIST_FOREACH(VARNAME, LIST_HEAD *head, LIST_ENTRY NAME); + + LIST_FOREACH_SAFE(VARNAME, LIST_HEAD *head, LIST_ENTRY + NAME, TEMP_VARNAME); + + void + LIST_INIT(LIST_HEAD *head); + + void + LIST_INSERT_AFTER(struct TYPE *listelm, struct TYPE *elm, LIST_ENTRY + NAME); + + void + LIST_INSERT_BEFORE(struct TYPE *listelm, struct TYPE *elm, LIST_ENTRY + NAME); + + void + LIST_INSERT_HEAD(LIST_HEAD *head, struct TYPE *elm, LIST_ENTRY NAME); + + void + LIST_REMOVE(struct TYPE *elm, LIST_ENTRY NAME); + + void + LIST_REPLACE(struct TYPE *elm, struct TYPE *elm2, LIST_ENTRY NAME); + + SIMPLEQ_ENTRY(TYPE); + + SIMPLEQ_HEAD(HEADNAME, TYPE); + + SIMPLEQ_HEAD_INITIALIZER(SIMPLEQ_HEAD head); + + struct TYPE * + SIMPLEQ_FIRST(SIMPLEQ_HEAD *head); + + struct TYPE * + SIMPLEQ_NEXT(struct TYPE *listelm, SIMPLEQ_ENTRY NAME); + + struct TYPE * + SIMPLEQ_END(SIMPLEQ_HEAD *head); + + int + SIMPLEQ_EMPTY(SIMPLEQ_HEAD *head); + + SIMPLEQ_FOREACH(VARNAME, SIMPLEQ_HEAD *head, SIMPLEQ_ENTRY NAME); + + SIMPLEQ_FOREACH_SAFE(VARNAME, SIMPLEQ_HEAD *head, SIMPLEQ_ENTRY + NAME, TEMP_VARNAME); + + void + SIMPLEQ_INIT(SIMPLEQ_HEAD *head); + + void + SIMPLEQ_INSERT_AFTER(SIMPLEQ_HEAD *head, struct TYPE *listelm, struct + TYPE *elm, SIMPLEQ_ENTRY NAME); + + void + SIMPLEQ_INSERT_HEAD(SIMPLEQ_HEAD *head, struct TYPE *elm, SIMPLEQ_ENTRY + NAME); + + void + SIMPLEQ_INSERT_TAIL(SIMPLEQ_HEAD *head, struct TYPE *elm, SIMPLEQ_ENTRY + NAME); + + void + SIMPLEQ_REMOVE_AFTER(SIMPLEQ_HEAD *head, struct TYPE *elm, SIMPLEQ_ENTRY + NAME); + + void + SIMPLEQ_REMOVE_HEAD(SIMPLEQ_HEAD *head, SIMPLEQ_ENTRY NAME); + + TAILQ_ENTRY(TYPE); + + TAILQ_HEAD(HEADNAME, TYPE); + + TAILQ_HEAD_INITIALIZER(TAILQ_HEAD head); + + struct TYPE * + TAILQ_FIRST(TAILQ_HEAD *head); + + struct TYPE * + TAILQ_NEXT(struct TYPE *listelm, TAILQ_ENTRY NAME); + + struct TYPE * + TAILQ_END(TAILQ_HEAD *head); + + struct TYPE * + TAILQ_LAST(TAILQ_HEAD *head, HEADNAME NAME); + + struct TYPE * + TAILQ_PREV(struct TYPE *listelm, HEADNAME NAME, TAILQ_ENTRY NAME); + + int + TAILQ_EMPTY(TAILQ_HEAD *head); + + TAILQ_FOREACH(VARNAME, TAILQ_HEAD *head, TAILQ_ENTRY NAME); + + TAILQ_FOREACH_SAFE(VARNAME, TAILQ_HEAD *head, TAILQ_ENTRY + NAME, TEMP_VARNAME); + + TAILQ_FOREACH_REVERSE(VARNAME, TAILQ_HEAD *head, HEADNAME, TAILQ_ENTRY + NAME); + + TAILQ_FOREACH_REVERSE_SAFE(VARNAME, TAILQ_HEAD + *head, HEADNAME, TAILQ_ENTRY NAME, TEMP_VARNAME); + + void + TAILQ_INIT(TAILQ_HEAD *head); + + void + TAILQ_INSERT_AFTER(TAILQ_HEAD *head, struct TYPE *listelm, struct TYPE + *elm, TAILQ_ENTRY NAME); + + void + TAILQ_INSERT_BEFORE(struct TYPE *listelm, struct TYPE *elm, TAILQ_ENTRY + NAME); + + void + TAILQ_INSERT_HEAD(TAILQ_HEAD *head, struct TYPE *elm, TAILQ_ENTRY NAME); + + void + TAILQ_INSERT_TAIL(TAILQ_HEAD *head, struct TYPE *elm, TAILQ_ENTRY NAME); + + void + TAILQ_REMOVE(TAILQ_HEAD *head, struct TYPE *elm, TAILQ_ENTRY NAME); + + void + TAILQ_REPLACE(TAILQ_HEAD *head, struct TYPE *elm, struct TYPE + *elm2, TAILQ_ENTRY NAME); + + CIRCLEQ_ENTRY(TYPE); + + CIRCLEQ_HEAD(HEADNAME, TYPE); + + CIRCLEQ_HEAD_INITIALIZER(CIRCLEQ_HEAD head); + + struct TYPE * + CIRCLEQ_FIRST(CIRCLEQ_HEAD *head); + + struct TYPE * + CIRCLEQ_LAST(CIRCLEQ_HEAD *head); + + struct TYPE * + CIRCLEQ_END(CIRCLEQ_HEAD *head); + + struct TYPE * + CIRCLEQ_NEXT(struct TYPE *listelm, CIRCLEQ_ENTRY NAME); + + struct TYPE * + CIRCLEQ_PREV(struct TYPE *listelm, CIRCLEQ_ENTRY NAME); + + int + CIRCLEQ_EMPTY(CIRCLEQ_HEAD *head); + + CIRCLEQ_FOREACH(VARNAME, CIRCLEQ_HEAD *head, CIRCLEQ_ENTRY NAME); + + CIRCLEQ_FOREACH_SAFE(VARNAME, CIRCLEQ_HEAD *head, CIRCLEQ_ENTRY + NAME, TEMP_VARNAME); + + CIRCLEQ_FOREACH_REVERSE(VARNAME, CIRCLEQ_HEAD *head, CIRCLEQ_ENTRY NAME); + + CIRCLEQ_FOREACH_REVERSE_SAFE(VARNAME, CIRCLEQ_HEAD *head, CIRCLEQ_ENTRY + NAME, TEMP_VARNAME); + + void + CIRCLEQ_INIT(CIRCLEQ_HEAD *head); + + void + CIRCLEQ_INSERT_AFTER(CIRCLEQ_HEAD *head, struct TYPE *listelm, struct + TYPE *elm, CIRCLEQ_ENTRY NAME); + + void + CIRCLEQ_INSERT_BEFORE(CIRCLEQ_HEAD *head, struct TYPE *listelm, struct + TYPE *elm, CIRCLEQ_ENTRY NAME); + + void + CIRCLEQ_INSERT_HEAD(CIRCLEQ_HEAD *head, struct TYPE *elm, CIRCLEQ_ENTRY + NAME); + + void + CIRCLEQ_INSERT_TAIL(CIRCLEQ_HEAD *head, struct TYPE *elm, CIRCLEQ_ENTRY + NAME); + + void + CIRCLEQ_REMOVE(CIRCLEQ_HEAD *head, struct TYPE *elm, CIRCLEQ_ENTRY NAME); + + void + CIRCLEQ_REPLACE(CIRCLEQ_HEAD *head, struct TYPE *elm, struct TYPE + *elm2, CIRCLEQ_ENTRY NAME); + +DESCRIPTION + These macros define and operate on five types of data structures: singly- + linked lists, simple queues, lists, tail queues, and circular queues. + All five structures support the following functionality: + + 1. Insertion of a new entry at the head of the list. + 2. Insertion of a new entry after any element in the list. + 3. Removal of an entry from the head of the list. + 4. Forward traversal through the list. + + Singly-linked lists are the simplest of the five data structures and + support only the above functionality. Singly-linked lists are ideal for + applications with large datasets and few or no removals, or for + implementing a LIFO queue. + + Simple queues add the following functionality: + + 1. Entries can be added at the end of a list. + + However: + + 1. All list insertions must specify the head of the list. + 2. Each head entry requires two pointers rather than one. + 3. Code size is about 15% greater and operations run about 20% + slower than singly-linked lists. + + Simple queues are ideal for applications with large datasets and few or + no removals, or for implementing a FIFO queue. + + All doubly linked types of data structures (lists, tail queues, and + circle queues) additionally allow: + + 1. Insertion of a new entry before any element in the list. + 2. Removal of any entry in the list. + + However: + + 1. Each element requires two pointers rather than one. + 2. Code size and execution time of operations (except for + removal) is about twice that of the singly-linked data- + structures. + + Lists are the simplest of the doubly linked data structures and support + only the above functionality over singly-linked lists. + + Tail queues add the following functionality: + + 1. Entries can be added at the end of a list. + 2. They may be traversed backwards, at a cost. + + However: + + 1. All list insertions and removals must specify the head of the + list. + 2. Each head entry requires two pointers rather than one. + 3. Code size is about 15% greater and operations run about 20% + slower than singly-linked lists. + + Circular queues add the following functionality: + + 1. Entries can be added at the end of a list. + 2. They may be traversed backwards, from tail to head. + + However: + + 1. All list insertions and removals must specify the head of the + list. + 2. Each head entry requires two pointers rather than one. + 3. The termination condition for traversal is more complex. + 4. Code size is about 40% greater and operations run about 45% + slower than lists. + + In the macro definitions, TYPE is the name tag of a user defined + structure that must contain a field of type SLIST_ENTRY, LIST_ENTRY, + SIMPLEQ_ENTRY, TAILQ_ENTRY, or CIRCLEQ_ENTRY, named NAME. The argument + HEADNAME is the name tag of a user defined structure that must be + declared using the macros SLIST_HEAD(), LIST_HEAD(), SIMPLEQ_HEAD(), + TAILQ_HEAD(), or CIRCLEQ_HEAD(). See the examples below for further + explanation of how these macros are used. + +SINGLY-LINKED LISTS + A singly-linked list is headed by a structure defined by the SLIST_HEAD() + macro. This structure contains a single pointer to the first element on + the list. The elements are singly linked for minimum space and pointer + manipulation overhead at the expense of O(n) removal for arbitrary + elements. New elements can be added to the list after an existing + element or at the head of the list. A SLIST_HEAD structure is declared + as follows: + + SLIST_HEAD(HEADNAME, TYPE) head; + + where HEADNAME is the name of the structure to be defined, and struct + TYPE is the type of the elements to be linked into the list. A pointer + to the head of the list can later be declared as: + + struct HEADNAME *headp; + + (The names head and headp are user selectable.) + + The HEADNAME facility is often not used, leading to the following bizarre + code: + + SLIST_HEAD(, TYPE) head, *headp; + + The SLIST_ENTRY() macro declares a structure that connects the elements + in the list. + + The SLIST_INIT() macro initializes the list referenced by head. + + The list can also be initialized statically by using the + SLIST_HEAD_INITIALIZER() macro like this: + + SLIST_HEAD(HEADNAME, TYPE) head = SLIST_HEAD_INITIALIZER(head); + + The SLIST_INSERT_HEAD() macro inserts the new element elm at the head of + the list. + + The SLIST_INSERT_AFTER() macro inserts the new element elm after the + element listelm. + + The SLIST_REMOVE_HEAD() macro removes the first element of the list + pointed by head. + + The SLIST_REMOVE_AFTER() macro removes the list element immediately + following elm. + + The SLIST_REMOVE() macro removes the element elm of the list pointed by + head. + + The SLIST_FIRST() and SLIST_NEXT() macros can be used to traverse the + list: + + for (np = SLIST_FIRST(&head); np != NULL; np = SLIST_NEXT(np, NAME)) + + Or, for simplicity, one can use the SLIST_FOREACH() macro: + + SLIST_FOREACH(np, head, NAME) + + The macro SLIST_FOREACH_SAFE() traverses the list referenced by head in a + forward direction, assigning each element in turn to var. However, + unlike SLIST_FOREACH() it is permitted to remove var as well as free it + from within the loop safely without interfering with the traversal. + + The SLIST_EMPTY() macro should be used to check whether a simple list is + empty. + +SINGLY-LINKED LIST EXAMPLE + SLIST_HEAD(listhead, entry) head; + struct entry { + ... + SLIST_ENTRY(entry) entries; /* Simple list. */ + ... + } *n1, *n2, *np; + + SLIST_INIT(&head); /* Initialize simple list. */ + + n1 = malloc(sizeof(struct entry)); /* Insert at the head. */ + SLIST_INSERT_HEAD(&head, n1, entries); + + n2 = malloc(sizeof(struct entry)); /* Insert after. */ + SLIST_INSERT_AFTER(n1, n2, entries); + + SLIST_FOREACH(np, &head, entries) /* Forward traversal. */ + np-> ... + + while (!SLIST_EMPTY(&head)) { /* Delete. */ + n1 = SLIST_FIRST(&head); + SLIST_REMOVE_HEAD(&head, entries); + free(n1); + } + + +LISTS + A list is headed by a structure defined by the LIST_HEAD() macro. This + structure contains a single pointer to the first element on the list. + The elements are doubly linked so that an arbitrary element can be + removed without traversing the list. New elements can be added to the + list after an existing element, before an existing element, or at the + head of the list. A LIST_HEAD structure is declared as follows: + + LIST_HEAD(HEADNAME, TYPE) head; + + where HEADNAME is the name of the structure to be defined, and struct + TYPE is the type of the elements to be linked into the list. A pointer + to the head of the list can later be declared as: + + struct HEADNAME *headp; + + (The names head and headp are user selectable.) + + The HEADNAME facility is often not used, leading to the following bizarre + code: + + LIST_HEAD(, TYPE) head, *headp; + + The LIST_ENTRY() macro declares a structure that connects the elements in + the list. + + The LIST_INIT() macro initializes the list referenced by head. + + The list can also be initialized statically by using the + LIST_HEAD_INITIALIZER() macro like this: + + LIST_HEAD(HEADNAME, TYPE) head = LIST_HEAD_INITIALIZER(head); + + The LIST_INSERT_HEAD() macro inserts the new element elm at the head of + the list. + + The LIST_INSERT_AFTER() macro inserts the new element elm after the + element listelm. + + The LIST_INSERT_BEFORE() macro inserts the new element elm before the + element listelm. + + The LIST_REMOVE() macro removes the element elm from the list. + + The LIST_REPLACE() macro replaces the list element elm with the new + element elm2. + + The LIST_FIRST() and LIST_NEXT() macros can be used to traverse the list: + + for (np = LIST_FIRST(&head); np != NULL; np = LIST_NEXT(np, NAME)) + + Or, for simplicity, one can use the LIST_FOREACH() macro: + + LIST_FOREACH(np, head, NAME) + + The macro LIST_FOREACH_SAFE() traverses the list referenced by head in a + forward direction, assigning each element in turn to var. However, + unlike LIST_FOREACH() it is permitted to remove var as well as free it + from within the loop safely without interfering with the traversal. + + The LIST_EMPTY() macro should be used to check whether a list is empty. + +LIST EXAMPLE + LIST_HEAD(listhead, entry) head; + struct entry { + ... + LIST_ENTRY(entry) entries; /* List. */ + ... + } *n1, *n2, *np; + + LIST_INIT(&head); /* Initialize list. */ + + n1 = malloc(sizeof(struct entry)); /* Insert at the head. */ + LIST_INSERT_HEAD(&head, n1, entries); + + n2 = malloc(sizeof(struct entry)); /* Insert after. */ + LIST_INSERT_AFTER(n1, n2, entries); + + n2 = malloc(sizeof(struct entry)); /* Insert before. */ + LIST_INSERT_BEFORE(n1, n2, entries); + /* Forward traversal. */ + LIST_FOREACH(np, &head, entries) + np-> ... + + while (!LIST_EMPTY(&head)) /* Delete. */ + n1 = LIST_FIRST(&head); + LIST_REMOVE(n1, entries); + free(n1); + } + +SIMPLE QUEUES + A simple queue is headed by a structure defined by the SIMPLEQ_HEAD() + macro. This structure contains a pair of pointers, one to the first + element in the simple queue and the other to the last element in the + simple queue. The elements are singly linked. New elements can be added + to the queue after an existing element, at the head of the queue or at + the tail of the queue. A SIMPLEQ_HEAD structure is declared as follows: + + SIMPLEQ_HEAD(HEADNAME, TYPE) head; + + where HEADNAME is the name of the structure to be defined, and struct + TYPE is the type of the elements to be linked into the queue. A pointer + to the head of the queue can later be declared as: + + struct HEADNAME *headp; + + (The names head and headp are user selectable.) + + The SIMPLEQ_ENTRY() macro declares a structure that connects the elements + in the queue. + + The SIMPLEQ_INIT() macro initializes the queue referenced by head. + + The queue can also be initialized statically by using the + SIMPLEQ_HEAD_INITIALIZER() macro like this: + + SIMPLEQ_HEAD(HEADNAME, TYPE) head = SIMPLEQ_HEAD_INITIALIZER(head); + + The SIMPLEQ_INSERT_AFTER() macro inserts the new element elm after the + element listelm. + + The SIMPLEQ_INSERT_HEAD() macro inserts the new element elm at the head + of the queue. + + The SIMPLEQ_INSERT_TAIL() macro inserts the new element elm at the end of + the queue. + + The SIMPLEQ_REMOVE_AFTER() macro removes the queue element immediately + following elm. + + The SIMPLEQ_REMOVE_HEAD() macro removes the first element from the queue. + + The SIMPLEQ_FIRST() and SIMPLEQ_NEXT() macros can be used to traverse the + queue. The SIMPLEQ_FOREACH() is used for queue traversal: + + SIMPLEQ_FOREACH(np, head, NAME) + + The macro SIMPLEQ_FOREACH_SAFE() traverses the queue referenced by head + in a forward direction, assigning each element in turn to var. However, + unlike SIMPLEQ_FOREACH() it is permitted to remove var as well as free it + from within the loop safely without interfering with the traversal. + + The SIMPLEQ_EMPTY() macro should be used to check whether a list is + empty. + +SIMPLE QUEUE EXAMPLE + SIMPLEQ_HEAD(listhead, entry) head = SIMPLEQ_HEAD_INITIALIZER(head); + struct entry { + ... + SIMPLEQ_ENTRY(entry) entries; /* Simple queue. */ + ... + } *n1, *n2, *np; + + n1 = malloc(sizeof(struct entry)); /* Insert at the head. */ + SIMPLEQ_INSERT_HEAD(&head, n1, entries); + + n2 = malloc(sizeof(struct entry)); /* Insert after. */ + SIMPLEQ_INSERT_AFTER(&head, n1, n2, entries); + + n2 = malloc(sizeof(struct entry)); /* Insert at the tail. */ + SIMPLEQ_INSERT_TAIL(&head, n2, entries); + /* Forward traversal. */ + SIMPLEQ_FOREACH(np, &head, entries) + np-> ... + /* Delete. */ + while (!SIMPLEQ_EMPTY(&head)) { + n1 = SIMPLEQ_FIRST(&head); + SIMPLEQ_REMOVE_HEAD(&head, entries); + free(n1); + } + +TAIL QUEUES + A tail queue is headed by a structure defined by the TAILQ_HEAD() macro. + This structure contains a pair of pointers, one to the first element in + the tail queue and the other to the last element in the tail queue. The + elements are doubly linked so that an arbitrary element can be removed + without traversing the tail queue. New elements can be added to the + queue after an existing element, before an existing element, at the head + of the queue, or at the end of the queue. A TAILQ_HEAD structure is + declared as follows: + + TAILQ_HEAD(HEADNAME, TYPE) head; + + where HEADNAME is the name of the structure to be defined, and struct + TYPE is the type of the elements to be linked into the tail queue. A + pointer to the head of the tail queue can later be declared as: + + struct HEADNAME *headp; + + (The names head and headp are user selectable.) + + The TAILQ_ENTRY() macro declares a structure that connects the elements + in the tail queue. + + The TAILQ_INIT() macro initializes the tail queue referenced by head. + + The tail queue can also be initialized statically by using the + TAILQ_HEAD_INITIALIZER() macro. + + The TAILQ_INSERT_HEAD() macro inserts the new element elm at the head of + the tail queue. + + The TAILQ_INSERT_TAIL() macro inserts the new element elm at the end of + the tail queue. + + The TAILQ_INSERT_AFTER() macro inserts the new element elm after the + element listelm. + + The TAILQ_INSERT_BEFORE() macro inserts the new element elm before the + element listelm. + + The TAILQ_REMOVE() macro removes the element elm from the tail queue. + + The TAILQ_REPLACE() macro replaces the list element elm with the new + element elm2. + + TAILQ_FOREACH() and TAILQ_FOREACH_REVERSE() are used for traversing a + tail queue. TAILQ_FOREACH() starts at the first element and proceeds + towards the last. TAILQ_FOREACH_REVERSE() starts at the last element and + proceeds towards the first. + + TAILQ_FOREACH(np, &head, NAME) + TAILQ_FOREACH_REVERSE(np, &head, HEADNAME, NAME) + + The macros TAILQ_FOREACH_SAFE() and TAILQ_FOREACH_REVERSE_SAFE() traverse + the list referenced by head in a forward or reverse direction + respectively, assigning each element in turn to var. However, unlike + their unsafe counterparts, they permit both the removal of var as well as + freeing it from within the loop safely without interfering with the + traversal. + + The TAILQ_FIRST(), TAILQ_NEXT(), TAILQ_LAST() and TAILQ_PREV() macros can + be used to manually traverse a tail queue or an arbitrary part of one. + + The TAILQ_EMPTY() macro should be used to check whether a tail queue is + empty. + +TAIL QUEUE EXAMPLE + TAILQ_HEAD(tailhead, entry) head; + struct entry { + ... + TAILQ_ENTRY(entry) entries; /* Tail queue. */ + ... + } *n1, *n2, *np; + + TAILQ_INIT(&head); /* Initialize queue. */ + + n1 = malloc(sizeof(struct entry)); /* Insert at the head. */ + TAILQ_INSERT_HEAD(&head, n1, entries); + + n1 = malloc(sizeof(struct entry)); /* Insert at the tail. */ + TAILQ_INSERT_TAIL(&head, n1, entries); + + n2 = malloc(sizeof(struct entry)); /* Insert after. */ + TAILQ_INSERT_AFTER(&head, n1, n2, entries); + + n2 = malloc(sizeof(struct entry)); /* Insert before. */ + TAILQ_INSERT_BEFORE(n1, n2, entries); + /* Forward traversal. */ + TAILQ_FOREACH(np, &head, entries) + np-> ... + /* Manual forward traversal. */ + for (np = n2; np != NULL; np = TAILQ_NEXT(np, entries)) + np-> ... + /* Delete. */ + while ((np = TAILQ_FIRST(&head))) { + TAILQ_REMOVE(&head, np, entries); + free(np); + } + + +CIRCULAR QUEUES + A circular queue is headed by a structure defined by the CIRCLEQ_HEAD() + macro. This structure contains a pair of pointers, one to the first + element in the circular queue and the other to the last element in the + circular queue. The elements are doubly linked so that an arbitrary + element can be removed without traversing the queue. New elements can be + added to the queue after an existing element, before an existing element, + at the head of the queue, or at the end of the queue. A CIRCLEQ_HEAD + structure is declared as follows: + + CIRCLEQ_HEAD(HEADNAME, TYPE) head; + + where HEADNAME is the name of the structure to be defined, and struct + TYPE is the type of the elements to be linked into the circular queue. A + pointer to the head of the circular queue can later be declared as: + + struct HEADNAME *headp; + + (The names head and headp are user selectable.) + + The CIRCLEQ_ENTRY() macro declares a structure that connects the elements + in the circular queue. + + The CIRCLEQ_INIT() macro initializes the circular queue referenced by + head. + + The circular queue can also be initialized statically by using the + CIRCLEQ_HEAD_INITIALIZER() macro. + + The CIRCLEQ_INSERT_HEAD() macro inserts the new element elm at the head + of the circular queue. + + The CIRCLEQ_INSERT_TAIL() macro inserts the new element elm at the end of + the circular queue. + + The CIRCLEQ_INSERT_AFTER() macro inserts the new element elm after the + element listelm. + + The CIRCLEQ_INSERT_BEFORE() macro inserts the new element elm before the + element listelm. + + The CIRCLEQ_REMOVE() macro removes the element elm from the circular + queue. + + The CIRCLEQ_REPLACE() macro replaces the list element elm with the new + element elm2. + + The CIRCLEQ_FIRST(), CIRCLEQ_LAST(), CIRCLEQ_END(), CIRCLEQ_NEXT() and + CIRCLEQ_PREV() macros can be used to traverse a circular queue. The + CIRCLEQ_FOREACH() is used for circular queue forward traversal: + + CIRCLEQ_FOREACH(np, head, NAME) + + The CIRCLEQ_FOREACH_REVERSE() macro acts like CIRCLEQ_FOREACH() but + traverses the circular queue backwards. + + The macros CIRCLEQ_FOREACH_SAFE() and CIRCLEQ_FOREACH_REVERSE_SAFE() + traverse the list referenced by head in a forward or reverse direction + respectively, assigning each element in turn to var. However, unlike + their unsafe counterparts, they permit both the removal of var as well as + freeing it from within the loop safely without interfering with the + traversal. + + The CIRCLEQ_EMPTY() macro should be used to check whether a circular + queue is empty. + +CIRCULAR QUEUE EXAMPLE + CIRCLEQ_HEAD(circleq, entry) head; + struct entry { + ... + CIRCLEQ_ENTRY(entry) entries; /* Circular queue. */ + ... + } *n1, *n2, *np; + + CIRCLEQ_INIT(&head); /* Initialize circular queue. */ + + n1 = malloc(sizeof(struct entry)); /* Insert at the head. */ + CIRCLEQ_INSERT_HEAD(&head, n1, entries); + + n1 = malloc(sizeof(struct entry)); /* Insert at the tail. */ + CIRCLEQ_INSERT_TAIL(&head, n1, entries); + + n2 = malloc(sizeof(struct entry)); /* Insert after. */ + CIRCLEQ_INSERT_AFTER(&head, n1, n2, entries); + + n2 = malloc(sizeof(struct entry)); /* Insert before. */ + CIRCLEQ_INSERT_BEFORE(&head, n1, n2, entries); + /* Forward traversal. */ + CIRCLEQ_FOREACH(np, &head, entries) + np-> ... + /* Reverse traversal. */ + CIRCLEQ_FOREACH_REVERSE(np, &head, entries) + np-> ... + /* Delete. */ + while (!CIRCLEQ_EMPTY(&head)) { + n1 = CIRCLEQ_FIRST(&head); + CIRCLEQ_REMOVE(&head, n1, entries); + free(n1); + } + +NOTES + It is an error to assume the next and previous fields are preserved after + an element has been removed from a list or queue. Using any macro + (except the various forms of insertion) on an element removed from a list + or queue is incorrect. An example of erroneous usage is removing the + same element twice. + + The SLIST_END(), LIST_END(), SIMPLEQ_END() and TAILQ_END() macros are + provided for symmetry with CIRCLEQ_END(). They expand to NULL and don't + serve any useful purpose. + + Trying to free a list in the following way is a common error: + + LIST_FOREACH(var, head, entry) + free(var); + free(head); + + Since var is free'd, the FOREACH macros refer to a pointer that may have + been reallocated already. A similar situation occurs when the current + element is deleted from the list. In cases like these the data + structure's FOREACH_SAFE macros should be used instead. + +HISTORY + The queue functions first appeared in 4.4BSD. + +OpenBSD 5.0 April 11, 2012 OpenBSD 5.0 +====================================================================== +.\" $OpenBSD: queue.3,v 1.56 2012/04/11 13:29:14 naddy Exp $ +.\" $NetBSD: queue.3,v 1.4 1995/07/03 00:25:36 mycroft Exp $ +.\" +.\" Copyright (c) 1993 The Regents of the University of California. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. + diff --git a/src/wraith/src/ext/tor_readpassphrase.h b/src/wraith/src/ext/tor_readpassphrase.h new file mode 100644 index 000000000..64f5668ca --- /dev/null +++ b/src/wraith/src/ext/tor_readpassphrase.h @@ -0,0 +1,48 @@ +/* $OpenBSD: readpassphrase.h,v 1.5 2003/06/17 21:56:23 millert Exp $ */ + +/* + * Copyright (c) 2000, 2002 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* OPENBSD ORIGINAL: include/readpassphrase.h */ + +#ifndef _READPASSPHRASE_H_ +#define _READPASSPHRASE_H_ + +#include "orconfig.h" + +#ifndef HAVE_READPASSPHRASE + +#define RPP_ECHO_OFF 0x00 /* Turn off echo (default). */ +#define RPP_ECHO_ON 0x01 /* Leave echo on. */ +#define RPP_REQUIRE_TTY 0x02 /* Fail if there is no tty. */ +#if 0 +#define RPP_FORCELOWER 0x04 /* Force input to lower case. */ +#define RPP_FORCEUPPER 0x08 /* Force input to upper case. */ +#define RPP_SEVENBIT 0x10 /* Strip the high bit from input. */ +#endif +#define RPP_STDIN 0x20 /* Read from stdin, not /dev/tty */ + +char * readpassphrase(const char *, char *, size_t, int); + +#define HAVE_READPASSPHRASE + +#endif /* HAVE_READPASSPHRASE */ + +#endif /* !_READPASSPHRASE_H_ */ diff --git a/src/wraith/src/ext/trunnel/trunnel-impl.h b/src/wraith/src/ext/trunnel/trunnel-impl.h new file mode 100644 index 000000000..b233cf763 --- /dev/null +++ b/src/wraith/src/ext/trunnel/trunnel-impl.h @@ -0,0 +1,311 @@ +/* trunnel-impl.h -- copied from Trunnel v1.5.2 + * https://gitweb.torproject.org/trunnel.git + * You probably shouldn't edit this file. + */ +/* trunnel-impl.h -- Implementation helpers for trunnel, included by + * generated trunnel files + * + * Copyright 2014-2017, The Tor Project, Inc. + * See license at the end of this file for copying information. + */ + +#ifndef TRUNNEL_IMPL_H_INCLUDED_ +#define TRUNNEL_IMPL_H_INCLUDED_ +#ifdef TRUNNEL_LOCAL_H +#include "trunnel-local.h" +#endif +#include "trunnel.h" +#include +#include +#include + +#if defined(_MSC_VER) && (_MSC_VER < 1600) +#define uint8_t unsigned char +#define uint16_t unsigned short +#define uint32_t unsigned int +#define uint64_t unsigned __int64 +#define inline __inline +#else +#include +#endif + +#ifdef _WIN32 +uint32_t trunnel_htonl(uint32_t a); +uint32_t trunnel_ntohl(uint32_t a); +uint16_t trunnel_htons(uint16_t a); +uint16_t trunnel_ntohs(uint16_t a); +#else +#include +#define trunnel_htonl(x) htonl(x) +#define trunnel_htons(x) htons(x) +#define trunnel_ntohl(x) ntohl(x) +#define trunnel_ntohs(x) ntohs(x) +#endif +uint64_t trunnel_htonll(uint64_t a); +uint64_t trunnel_ntohll(uint64_t a); + +#ifndef trunnel_assert +#define trunnel_assert(x) assert(x) +#endif + +static inline void +trunnel_set_uint64(void *p, uint64_t v) { + memcpy(p, &v, 8); +} +static inline void +trunnel_set_uint32(void *p, uint32_t v) { + memcpy(p, &v, 4); +} +static inline void +trunnel_set_uint16(void *p, uint16_t v) { + memcpy(p, &v, 2); +} +static inline void +trunnel_set_uint8(void *p, uint8_t v) { + memcpy(p, &v, 1); +} + +static inline uint64_t +trunnel_get_uint64(const void *p) { + uint64_t x; + memcpy(&x, p, 8); + return x; +} +static inline uint32_t +trunnel_get_uint32(const void *p) { + uint32_t x; + memcpy(&x, p, 4); + return x; +} +static inline uint16_t +trunnel_get_uint16(const void *p) { + uint16_t x; + memcpy(&x, p, 2); + return x; +} +static inline uint8_t +trunnel_get_uint8(const void *p) { + return *(const uint8_t*)p; +} + + +#ifdef TRUNNEL_DEBUG_FAILING_ALLOC +extern int trunnel_provoke_alloc_failure; + +static inline void * +trunnel_malloc(size_t n) +{ + if (trunnel_provoke_alloc_failure) { + if (--trunnel_provoke_alloc_failure == 0) + return NULL; + } + return malloc(n); +} +static inline void * +trunnel_calloc(size_t a, size_t b) +{ + if (trunnel_provoke_alloc_failure) { + if (--trunnel_provoke_alloc_failure == 0) + return NULL; + } + return calloc(a,b); +} +static inline char * +trunnel_strdup(const char *s) +{ + if (trunnel_provoke_alloc_failure) { + if (--trunnel_provoke_alloc_failure == 0) + return NULL; + } + return strdup(s); +} +#else +#ifndef trunnel_malloc +#define trunnel_malloc(x) (malloc((x))) +#endif +#ifndef trunnel_calloc +#define trunnel_calloc(a,b) (calloc((a),(b))) +#endif +#ifndef trunnel_strdup +#define trunnel_strdup(s) (strdup((s))) +#endif +#endif + +#ifndef trunnel_realloc +#define trunnel_realloc(a,b) realloc((a),(b)) +#endif + +#ifndef trunnel_free_ +#define trunnel_free_(x) (free(x)) +#endif +#define trunnel_free(x) ((x) ? (trunnel_free_(x),0) : (0)) + +#ifndef trunnel_abort +#define trunnel_abort() abort() +#endif + +#ifndef trunnel_memwipe +#define trunnel_memwipe(mem, len) ((void)0) +#define trunnel_wipestr(s) ((void)0) +#else +#define trunnel_wipestr(s) do { \ + if (s) \ + trunnel_memwipe(s, strlen(s)); \ + } while (0) +#endif + +/* ====== dynamic arrays ======== */ + +#ifdef NDEBUG +#define TRUNNEL_DYNARRAY_GET(da, n) \ + ((da)->elts_[(n)]) +#else +/** Return the 'n'th element of 'da'. */ +#define TRUNNEL_DYNARRAY_GET(da, n) \ + (((n) >= (da)->n_ ? (trunnel_abort(),0) : 0), (da)->elts_[(n)]) +#endif + +/** Change the 'n'th element of 'da' to 'v'. */ +#define TRUNNEL_DYNARRAY_SET(da, n, v) do { \ + trunnel_assert((n) < (da)->n_); \ + (da)->elts_[(n)] = (v); \ + } while (0) + +/** Expand the dynamic array 'da' of 'elttype' so that it can hold at least + * 'howmanymore' elements than its current capacity. Always tries to increase + * the length of the array. On failure, run the code in 'on_fail' and goto + * trunnel_alloc_failed. */ +#define TRUNNEL_DYNARRAY_EXPAND(elttype, da, howmanymore, on_fail) do { \ + elttype *newarray; \ + newarray = trunnel_dynarray_expand(&(da)->allocated_, \ + (da)->elts_, (howmanymore), \ + sizeof(elttype)); \ + if (newarray == NULL) { \ + on_fail; \ + goto trunnel_alloc_failed; \ + } \ + (da)->elts_ = newarray; \ + } while (0) + +/** Add 'v' to the end of the dynamic array 'da' of 'elttype', expanding it if + * necessary. code in 'on_fail' and goto trunnel_alloc_failed. */ +#define TRUNNEL_DYNARRAY_ADD(elttype, da, v, on_fail) do { \ + if ((da)->n_ == (da)->allocated_) { \ + TRUNNEL_DYNARRAY_EXPAND(elttype, da, 1, on_fail); \ + } \ + (da)->elts_[(da)->n_++] = (v); \ + } while (0) + +/** Return the number of elements in 'da'. */ +#define TRUNNEL_DYNARRAY_LEN(da) ((da)->n_) + +/** Remove all storage held by 'da' and set it to be empty. Does not free + * storage held by the elements themselves. */ +#define TRUNNEL_DYNARRAY_CLEAR(da) do { \ + trunnel_free((da)->elts_); \ + (da)->elts_ = NULL; \ + (da)->n_ = (da)->allocated_ = 0; \ + } while (0) + +/** Remove all storage held by 'da' and set it to be empty. Does not free + * storage held by the elements themselves. */ +#define TRUNNEL_DYNARRAY_WIPE(da) do { \ + trunnel_memwipe((da)->elts_, (da)->allocated_ * sizeof((da)->elts_[0])); \ + } while (0) + +/** Helper: wraps or implements an OpenBSD-style reallocarray. Behaves + * as realloc(a, x*y), but verifies that no overflow will occur in the + * multiplication. Returns NULL on failure. */ +#ifndef trunnel_reallocarray +void *trunnel_reallocarray(void *a, size_t x, size_t y); +#endif + +/** Helper to expand a dynamic array. Behaves as TRUNNEL_DYNARRAY_EXPAND(), + * taking the array of elements in 'ptr', a pointer to thethe current number + * of allocated elements in allocated_p, the minimum numbeer of elements to + * add in 'howmanymore', and the size of a single element in 'eltsize'. + * + * On success, adjust *allocated_p, and return the new value for the array of + * elements. On failure, adjust nothing and return NULL. + */ +void *trunnel_dynarray_expand(size_t *allocated_p, void *ptr, + size_t howmanymore, size_t eltsize); + +/** Type for a function to free members of a dynarray of pointers. */ +typedef void (*trunnel_free_fn_t)(void *); + +/** + * Helper to change the length of a dynamic array. Takes pointers to the + * current allocated and n fields of the array in 'allocated_p' and 'len_p', + * and the current array of elements in 'ptr'; takes the length of a single + * element in 'eltsize'. Changes the length to 'newlen'. If 'newlen' is + * greater than the current length, pads the new elements with 0. If newlen + * is less than the current length, and free_fn is non-NULL, treat the + * array as an array of void *, and invoke free_fn() on each removed element. + * + * On success, adjust *allocated_p and *len_p, and return the new value for + * the array of elements. On failure, adjust nothing, set *errcode_ptr to 1, + * and return NULL. + */ +void *trunnel_dynarray_setlen(size_t *allocated_p, size_t *len_p, + void *ptr, size_t newlen, + size_t eltsize, trunnel_free_fn_t free_fn, + uint8_t *errcode_ptr); + +/** + * Helper: return a pointer to the value of 'str' as a NUL-terminated string. + * Might have to reallocate the storage for 'str' in order to fit in the final + * NUL character. On allocation failure, return NULL. + */ +const char *trunnel_string_getstr(trunnel_string_t *str); + +/** + * Helper: change the contents of 'str' to hold the 'len'-byte string in + * 'inp'. Adjusts the storage to have a terminating NUL that doesn't count + * towards the length of the string. On success, return 0. On failure, set + * *errcode_ptr to 1 and return -1. + */ +int trunnel_string_setstr0(trunnel_string_t *str, const char *inp, size_t len, + uint8_t *errcode_ptr); + +/** + * As trunnel_dynarray_setlen, but adjusts a string rather than a dynamic + * array, and ensures that the new string is NUL-terminated. + */ +int trunnel_string_setlen(trunnel_string_t *str, size_t newlen, + uint8_t *errcode_ptr); + +#endif + + +/* +Copyright 2014 The Tor Project, Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + + * Neither the names of the copyright owners nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ diff --git a/src/wraith/src/ext/trunnel/trunnel.c b/src/wraith/src/ext/trunnel/trunnel.c new file mode 100644 index 000000000..b749d8136 --- /dev/null +++ b/src/wraith/src/ext/trunnel/trunnel.c @@ -0,0 +1,247 @@ +/* trunnel.c -- copied from Trunnel v1.5.2 + * https://gitweb.torproject.org/trunnel.git + * You probably shouldn't edit this file. + */ +/* trunnel.c -- Helper functions to implement trunnel. + * + * Copyright 2014-2017, The Tor Project, Inc. + * See license at the end of this file for copying information. + * + * See trunnel-impl.h for documentation of these functions. + */ + +#include "trunnel-impl.h" +#include +#include + +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define IS_LITTLE_ENDIAN 1 +#elif defined(BYTE_ORDER) && defined(ORDER_LITTLE_ENDIAN) && \ + BYTE_ORDER == __ORDER_LITTLE_ENDIAN +# define IS_LITTLE_ENDIAN 1 +#elif defined(_WIN32) +# define IS_LITTLE_ENDIAN 1 +#elif defined(__APPLE__) +# include +# define BSWAP64(x) OSSwapLittleToHostInt64(x) +#elif defined(sun) || defined(__sun) +# include +# ifndef _BIG_ENDIAN +# define IS_LITTLE_ENDIAN +# endif +#else +# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) +# include +# else +# include +# endif +# if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ + __BYTE_ORDER == __LITTLE_ENDIAN +# define IS_LITTLE_ENDIAN +# endif +#endif + +#ifdef _WIN32 +uint16_t +trunnel_htons(uint16_t s) +{ + return (s << 8) | (s >> 8); +} +uint16_t +trunnel_ntohs(uint16_t s) +{ + return (s << 8) | (s >> 8); +} +uint32_t +trunnel_htonl(uint32_t s) +{ + return (s << 24) | + ((s << 8)&0xff0000) | + ((s >> 8)&0xff00) | + (s >> 24); +} +uint32_t +trunnel_ntohl(uint32_t s) +{ + return (s << 24) | + ((s << 8)&0xff0000) | + ((s >> 8)&0xff00) | + (s >> 24); +} +#endif + +uint64_t +trunnel_htonll(uint64_t a) +{ +#ifdef IS_LITTLE_ENDIAN + return trunnel_htonl((uint32_t)(a>>32)) + | (((uint64_t)trunnel_htonl((uint32_t)a))<<32); +#else + return a; +#endif +} + +uint64_t +trunnel_ntohll(uint64_t a) +{ + return trunnel_htonll(a); +} + +#ifdef TRUNNEL_DEBUG_FAILING_ALLOC +/** Used for debugging and running tricky test cases: Makes the nth + * memoryation allocation call from now fail. + */ +int trunnel_provoke_alloc_failure = 0; +#endif + +void * +trunnel_dynarray_expand(size_t *allocated_p, void *ptr, + size_t howmanymore, size_t eltsize) +{ + size_t newsize = howmanymore + *allocated_p; + void *newarray = NULL; + if (newsize < 8) + newsize = 8; + if (newsize < *allocated_p * 2) + newsize = *allocated_p * 2; + if (newsize <= *allocated_p || newsize < howmanymore) + return NULL; + newarray = trunnel_reallocarray(ptr, newsize, eltsize); + if (newarray == NULL) + return NULL; + + *allocated_p = newsize; + return newarray; +} + +#ifndef trunnel_reallocarray +void * +trunnel_reallocarray(void *a, size_t x, size_t y) +{ +#ifdef TRUNNEL_DEBUG_FAILING_ALLOC + if (trunnel_provoke_alloc_failure) { + if (--trunnel_provoke_alloc_failure == 0) + return NULL; + } +#endif + if (x > SIZE_MAX / y) + return NULL; + return trunnel_realloc(a, x * y); +} +#endif + +const char * +trunnel_string_getstr(trunnel_string_t *str) +{ + trunnel_assert(str->allocated_ >= str->n_); + if (str->allocated_ == str->n_) { + TRUNNEL_DYNARRAY_EXPAND(char, str, 1, {}); + } + str->elts_[str->n_] = 0; + return str->elts_; +trunnel_alloc_failed: + return NULL; +} + +int +trunnel_string_setstr0(trunnel_string_t *str, const char *val, size_t len, + uint8_t *errcode_ptr) +{ + if (len == SIZE_MAX) + goto trunnel_alloc_failed; + if (str->allocated_ <= len) { + TRUNNEL_DYNARRAY_EXPAND(char, str, len + 1 - str->allocated_, {}); + } + memcpy(str->elts_, val, len); + str->n_ = len; + str->elts_[len] = 0; + return 0; +trunnel_alloc_failed: + *errcode_ptr = 1; + return -1; +} + +int +trunnel_string_setlen(trunnel_string_t *str, size_t newlen, + uint8_t *errcode_ptr) +{ + if (newlen == SIZE_MAX) + goto trunnel_alloc_failed; + if (str->allocated_ < newlen + 1) { + TRUNNEL_DYNARRAY_EXPAND(char, str, newlen + 1 - str->allocated_, {}); + } + if (str->n_ < newlen) { + memset(& (str->elts_[str->n_]), 0, (newlen - str->n_)); + } + str->n_ = newlen; + str->elts_[newlen] = 0; + return 0; + + trunnel_alloc_failed: + *errcode_ptr = 1; + return -1; +} + +void * +trunnel_dynarray_setlen(size_t *allocated_p, size_t *len_p, + void *ptr, size_t newlen, + size_t eltsize, trunnel_free_fn_t free_fn, + uint8_t *errcode_ptr) +{ + if (*allocated_p < newlen) { + void *newptr = trunnel_dynarray_expand(allocated_p, ptr, + newlen - *allocated_p, eltsize); + if (newptr == NULL) + goto trunnel_alloc_failed; + ptr = newptr; + } + if (free_fn && *len_p > newlen) { + size_t i; + void **elts = (void **) ptr; + for (i = newlen; i < *len_p; ++i) { + free_fn(elts[i]); + elts[i] = NULL; + } + } + if (*len_p < newlen) { + memset( ((char*)ptr) + (eltsize * *len_p), 0, (newlen - *len_p) * eltsize); + } + *len_p = newlen; + return ptr; + trunnel_alloc_failed: + *errcode_ptr = 1; + return NULL; +} + +/* +Copyright 2014 The Tor Project, Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + + * Neither the names of the copyright owners nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ diff --git a/src/wraith/src/ext/trunnel/trunnel.h b/src/wraith/src/ext/trunnel/trunnel.h new file mode 100644 index 000000000..32c80bac2 --- /dev/null +++ b/src/wraith/src/ext/trunnel/trunnel.h @@ -0,0 +1,64 @@ +/* trunnel.h -- copied from Trunnel v1.5.2 + * https://gitweb.torproject.org/trunnel.git + * You probably shouldn't edit this file. + */ +/* trunnel.h -- Public declarations for trunnel, to be included + * in trunnel header files. + + * Copyright 2014-2017, The Tor Project, Inc. + * See license at the end of this file for copying information. + */ + +#ifndef TRUNNEL_H_INCLUDED_ +#define TRUNNEL_H_INCLUDED_ + +#include + +/** Macro to declare a variable-length dynamically allocated array. Trunnel + * uses these to store all variable-length arrays. */ +#define TRUNNEL_DYNARRAY_HEAD(name, elttype) \ + struct name { \ + size_t n_; \ + size_t allocated_; \ + elttype *elts_; \ + } + +/** Initializer for a dynamic array of a given element type. */ +#define TRUNNEL_DYNARRAY_INIT(elttype) { 0, 0, (elttype*)NULL } + +/** Typedef used for storing variable-length arrays of char. */ +typedef TRUNNEL_DYNARRAY_HEAD(trunnel_string_st, char) trunnel_string_t; + +#endif + +/* +Copyright 2014 The Tor Project, Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + + * Neither the names of the copyright owners nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ diff --git a/src/wraith/src/include.am b/src/wraith/src/include.am new file mode 100644 index 000000000..90ecf90d4 --- /dev/null +++ b/src/wraith/src/include.am @@ -0,0 +1,11 @@ +include src/ext/include.am +include src/trunnel/include.am +include src/common/include.am +include src/or/include.am +include src/rust/include.am +include src/test/include.am +include src/tools/include.am +include src/win32/include.am +include src/config/include.am +include src/test/fuzz/include.am +include src/trace/include.am diff --git a/src/wraith/src/rust/.cargo/config.in b/src/wraith/src/rust/.cargo/config.in new file mode 100644 index 000000000..301e7fdbe --- /dev/null +++ b/src/wraith/src/rust/.cargo/config.in @@ -0,0 +1,8 @@ +[source] + +@RUST_DL@ [source.crates-io] +@RUST_DL@ registry = 'https://github.com/rust-lang/crates.io-index' +@RUST_DL@ replace-with = 'vendored-sources' + +@RUST_DL@ [source.vendored-sources] +@RUST_DL@ directory = '@TOR_RUST_DEPENDENCIES@' diff --git a/src/wraith/src/rust/.rustfmt.toml b/src/wraith/src/rust/.rustfmt.toml new file mode 100644 index 000000000..f25bd5188 --- /dev/null +++ b/src/wraith/src/rust/.rustfmt.toml @@ -0,0 +1,2 @@ +max_width = 80 +comment_width = 80 diff --git a/src/wraith/src/rust/Cargo.lock b/src/wraith/src/rust/Cargo.lock new file mode 100644 index 000000000..224d2135b --- /dev/null +++ b/src/wraith/src/rust/Cargo.lock @@ -0,0 +1,55 @@ +[root] +name = "tor_util" +version = "0.0.1" +dependencies = [ + "libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", + "tor_allocate 0.0.1", +] + +[[package]] +name = "external" +version = "0.0.1" +dependencies = [ + "libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libc" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "protover" +version = "0.0.1" +dependencies = [ + "external 0.0.1", + "libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", + "smartlist 0.0.1", + "tor_allocate 0.0.1", + "tor_util 0.0.1", +] + +[[package]] +name = "smartlist" +version = "0.0.1" +dependencies = [ + "libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tor_allocate" +version = "0.0.1" +dependencies = [ + "libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tor_rust" +version = "0.1.0" +dependencies = [ + "protover 0.0.1", + "tor_util 0.0.1", +] + +[metadata] +"checksum libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)" = "babb8281da88cba992fa1f4ddec7d63ed96280a1a53ec9b919fd37b53d71e502" diff --git a/src/wraith/src/rust/Cargo.toml b/src/wraith/src/rust/Cargo.toml new file mode 100644 index 000000000..953c9b96b --- /dev/null +++ b/src/wraith/src/rust/Cargo.toml @@ -0,0 +1,7 @@ +[workspace] +members = ["tor_util", "protover", "smartlist", "external", "tor_allocate", "tor_rust"] + +[profile.release] +debug = true +panic = "abort" + diff --git a/src/wraith/src/rust/external/Cargo.toml b/src/wraith/src/rust/external/Cargo.toml new file mode 100644 index 000000000..bccd7033a --- /dev/null +++ b/src/wraith/src/rust/external/Cargo.toml @@ -0,0 +1,13 @@ +[package] +authors = ["The Tor Project"] +version = "0.0.1" +name = "external" + +[dependencies] +libc = "0.2.22" + +[lib] +name = "external" +path = "lib.rs" +crate_type = ["rlib", "staticlib"] + diff --git a/src/wraith/src/rust/external/external.rs b/src/wraith/src/rust/external/external.rs new file mode 100644 index 000000000..b9e17f021 --- /dev/null +++ b/src/wraith/src/rust/external/external.rs @@ -0,0 +1,33 @@ +// Copyright (c) 2016-2017, The Tor Project, Inc. */ +// See LICENSE for licensing information */ + +use libc::{c_char, c_int}; +use std::ffi::CString; + +extern "C" { + fn tor_version_as_new_as( + platform: *const c_char, + cutoff: *const c_char, + ) -> c_int; +} + +/// Wrap calls to tor_version_as_new_as, defined in src/or/routerparse.c +pub fn c_tor_version_as_new_as(platform: &str, cutoff: &str) -> bool { + // CHK: These functions should log a warning if an error occurs. This + // can be added when integration with tor's logger is added to rust + let c_platform = match CString::new(platform) { + Ok(n) => n, + Err(_) => return false, + }; + + let c_cutoff = match CString::new(cutoff) { + Ok(n) => n, + Err(_) => return false, + }; + + let result: c_int = unsafe { + tor_version_as_new_as(c_platform.as_ptr(), c_cutoff.as_ptr()) + }; + + result == 1 +} diff --git a/src/wraith/src/rust/external/lib.rs b/src/wraith/src/rust/external/lib.rs new file mode 100644 index 000000000..0af0d6452 --- /dev/null +++ b/src/wraith/src/rust/external/lib.rs @@ -0,0 +1,14 @@ +//! Copyright (c) 2016-2017, The Tor Project, Inc. */ +//! See LICENSE for licensing information */ + +//! Interface for external calls to tor C ABI +//! +//! The purpose of this module is to provide a clean interface for when Rust +//! modules need to interact with functionality in tor C code rather than each +//! module implementing this functionality repeatedly. + +extern crate libc; + +mod external; + +pub use external::*; diff --git a/src/wraith/src/rust/include.am b/src/wraith/src/rust/include.am new file mode 100644 index 000000000..9c4337484 --- /dev/null +++ b/src/wraith/src/rust/include.am @@ -0,0 +1,26 @@ +include src/rust/tor_rust/include.am + +EXTRA_DIST +=\ + src/rust/Cargo.toml \ + src/rust/Cargo.lock \ + src/rust/.cargo/config.in \ + src/rust/external/Cargo.toml \ + src/rust/external/external.rs \ + src/rust/external/lib.rs \ + src/rust/protover/Cargo.toml \ + src/rust/protover/ffi.rs \ + src/rust/protover/lib.rs \ + src/rust/protover/protover.rs \ + src/rust/protover/tests/protover.rs \ + src/rust/smartlist/Cargo.toml \ + src/rust/smartlist/lib.rs \ + src/rust/smartlist/smartlist.rs \ + src/rust/tor_allocate/Cargo.toml \ + src/rust/tor_allocate/lib.rs \ + src/rust/tor_allocate/tor_allocate.rs \ + src/rust/tor_rust/Cargo.toml \ + src/rust/tor_rust/include.am \ + src/rust/tor_rust/lib.rs \ + src/rust/tor_util/Cargo.toml \ + src/rust/tor_util/ffi.rs \ + src/rust/tor_util/lib.rs diff --git a/src/wraith/src/rust/protover/Cargo.toml b/src/wraith/src/rust/protover/Cargo.toml new file mode 100644 index 000000000..04d2f2ed7 --- /dev/null +++ b/src/wraith/src/rust/protover/Cargo.toml @@ -0,0 +1,25 @@ +[package] +authors = ["The Tor Project"] +version = "0.0.1" +name = "protover" + +[dependencies] +libc = "0.2.22" + +[dependencies.smartlist] +path = "../smartlist" + +[dependencies.external] +path = "../external" + +[dependencies.tor_util] +path = "../tor_util" + +[dependencies.tor_allocate] +path = "../tor_allocate" + +[lib] +name = "protover" +path = "lib.rs" +crate_type = ["rlib", "staticlib"] + diff --git a/src/wraith/src/rust/protover/ffi.rs b/src/wraith/src/rust/protover/ffi.rs new file mode 100644 index 000000000..3eb22c933 --- /dev/null +++ b/src/wraith/src/rust/protover/ffi.rs @@ -0,0 +1,219 @@ +// Copyright (c) 2016-2017, The Tor Project, Inc. */ +// See LICENSE for licensing information */ + +//! FFI functions, only to be called from C. +//! +//! Equivalent C versions of this api are in `src/or/protover.c` + +use libc::{c_char, c_int, uint32_t}; +use std::ffi::CStr; +use std::ffi::CString; + +use protover::*; +use smartlist::*; +use tor_allocate::allocate_and_copy_string; + +/// Translate C enums to Rust Proto enums, using the integer value of the C +/// enum to map to its associated Rust enum +/// +/// C_RUST_COUPLED: src/or/protover.h `protocol_type_t` +fn translate_to_rust(c_proto: uint32_t) -> Result { + match c_proto { + 0 => Ok(Proto::Link), + 1 => Ok(Proto::LinkAuth), + 2 => Ok(Proto::Relay), + 3 => Ok(Proto::DirCache), + 4 => Ok(Proto::HSDir), + 5 => Ok(Proto::HSIntro), + 6 => Ok(Proto::HSRend), + 7 => Ok(Proto::Desc), + 8 => Ok(Proto::Microdesc), + 9 => Ok(Proto::Cons), + _ => Err("Invalid protocol type"), + } +} + +/// Provide an interface for C to translate arguments and return types for +/// protover::all_supported +#[no_mangle] +pub extern "C" fn protover_all_supported( + c_relay_version: *const c_char, + missing_out: *mut *mut c_char, +) -> c_int { + + if c_relay_version.is_null() { + return 1; + } + + // Require an unsafe block to read the version from a C string. The pointer + // is checked above to ensure it is not null. + let c_str: &CStr = unsafe { CStr::from_ptr(c_relay_version) }; + + let relay_version = match c_str.to_str() { + Ok(n) => n, + Err(_) => return 1, + }; + + let (is_supported, unsupported) = all_supported(relay_version); + + if unsupported.len() > 0 { + let c_unsupported = match CString::new(unsupported) { + Ok(n) => n, + Err(_) => return 1, + }; + + let ptr = c_unsupported.into_raw(); + unsafe { *missing_out = ptr }; + } + + return if is_supported { 1 } else { 0 }; +} + +/// Provide an interface for C to translate arguments and return types for +/// protover::list_supports_protocol +#[no_mangle] +pub extern "C" fn protocol_list_supports_protocol( + c_protocol_list: *const c_char, + c_protocol: uint32_t, + version: uint32_t, +) -> c_int { + if c_protocol_list.is_null() { + return 1; + } + + // Require an unsafe block to read the version from a C string. The pointer + // is checked above to ensure it is not null. + let c_str: &CStr = unsafe { CStr::from_ptr(c_protocol_list) }; + + let protocol_list = match c_str.to_str() { + Ok(n) => n, + Err(_) => return 1, + }; + + let protocol = match translate_to_rust(c_protocol) { + Ok(n) => n, + Err(_) => return 0, + }; + + let is_supported = + protover_string_supports_protocol(protocol_list, protocol, version); + + return if is_supported { 1 } else { 0 }; +} + +/// Provide an interface for C to translate arguments and return types for +/// protover::list_supports_protocol_or_later +#[no_mangle] +pub extern "C" fn protocol_list_supports_protocol_or_later( + c_protocol_list: *const c_char, + c_protocol: uint32_t, + version: uint32_t, +) -> c_int { + if c_protocol_list.is_null() { + return 1; + } + + // Require an unsafe block to read the version from a C string. The pointer + // is checked above to ensure it is not null. + let c_str: &CStr = unsafe { CStr::from_ptr(c_protocol_list) }; + + let protocol_list = match c_str.to_str() { + Ok(n) => n, + Err(_) => return 1, + }; + + let protocol = match translate_to_rust(c_protocol) { + Ok(n) => n, + Err(_) => return 0, + }; + + let is_supported = + protover_string_supports_protocol_or_later( + protocol_list, protocol, version); + + return if is_supported { 1 } else { 0 }; +} + +/// Provide an interface for C to translate arguments and return types for +/// protover::get_supported_protocols +#[no_mangle] +pub extern "C" fn protover_get_supported_protocols() -> *mut c_char { + // Not handling errors when unwrapping as the content is controlled + // and is an empty string + let empty = CString::new("").unwrap(); + + let supported = get_supported_protocols(); + let c_supported = match CString::new(supported) { + Ok(n) => n, + Err(_) => return empty.into_raw(), + }; + + c_supported.into_raw() +} + +/// Provide an interface for C to translate arguments and return types for +/// protover::compute_vote +#[no_mangle] +pub extern "C" fn protover_compute_vote( + list: *const Stringlist, + threshold: c_int, +) -> *mut c_char { + + if list.is_null() { + let empty = String::new(); + return allocate_and_copy_string(&empty); + } + + // Dereference of raw pointer requires an unsafe block. The pointer is + // checked above to ensure it is not null. + let data: Vec = unsafe { (*list).get_list() }; + + let vote = compute_vote(data, threshold); + + allocate_and_copy_string(&vote) +} + +/// Provide an interface for C to translate arguments and return types for +/// protover::is_supported_here +#[no_mangle] +pub extern "C" fn protover_is_supported_here( + c_protocol: uint32_t, + version: uint32_t, +) -> c_int { + let protocol = match translate_to_rust(c_protocol) { + Ok(n) => n, + Err(_) => return 0, + }; + + let is_supported = is_supported_here(protocol, version); + + return if is_supported { 1 } else { 0 }; +} + +/// Provide an interface for C to translate arguments and return types for +/// protover::compute_for_old_tor +#[no_mangle] +pub extern "C" fn protover_compute_for_old_tor( + version: *const c_char, +) -> *mut c_char { + // Not handling errors when unwrapping as the content is controlled + // and is an empty string + let empty = String::new(); + + if version.is_null() { + return allocate_and_copy_string(&empty); + } + + // Require an unsafe block to read the version from a C string. The pointer + // is checked above to ensure it is not null. + let c_str: &CStr = unsafe { CStr::from_ptr(version) }; + + let version = match c_str.to_str() { + Ok(n) => n, + Err(_) => return allocate_and_copy_string(&empty), + }; + + let supported = compute_for_old_tor(&version); + + allocate_and_copy_string(&supported) +} diff --git a/src/wraith/src/rust/protover/lib.rs b/src/wraith/src/rust/protover/lib.rs new file mode 100644 index 000000000..5a5dea440 --- /dev/null +++ b/src/wraith/src/rust/protover/lib.rs @@ -0,0 +1,33 @@ +//! Copyright (c) 2016-2017, The Tor Project, Inc. */ +//! See LICENSE for licensing information */ + +//! Versioning information for different pieces of the Tor protocol. +//! +//! The below description is taken from src/rust/protover.c, which is currently +//! enabled by default. We are in the process of experimenting with Rust in +//! tor, and this protover module is implemented to help achieve this goal. +//! +//! Starting in version 0.2.9.3-alpha, Tor places separate version numbers on +//! each of the different components of its protocol. Relays use these numbers +//! to advertise what versions of the protocols they can support, and clients +//! use them to find what they can ask a given relay to do. Authorities vote +//! on the supported protocol versions for each relay, and also vote on the +//! which protocols you should have to support in order to be on the Tor +//! network. All Tor instances use these required/recommended protocol versions +//! to tell what level of support for recent protocols each relay has, and +//! to decide whether they should be running given their current protocols. +//! +//! The main advantage of these protocol versions numbers over using Tor +//! version numbers is that they allow different implementations of the Tor +//! protocols to develop independently, without having to claim compatibility +//! with specific versions of Tor. + +extern crate libc; +extern crate smartlist; +extern crate external; +extern crate tor_allocate; + +mod protover; +pub mod ffi; + +pub use protover::*; diff --git a/src/wraith/src/rust/protover/protover.rs b/src/wraith/src/rust/protover/protover.rs new file mode 100644 index 000000000..7d5947ca2 --- /dev/null +++ b/src/wraith/src/rust/protover/protover.rs @@ -0,0 +1,906 @@ +// Copyright (c) 2016-2017, The Tor Project, Inc. */ +// See LICENSE for licensing information */ + +use external::c_tor_version_as_new_as; + +use std::str::FromStr; +use std::fmt; +use std::collections::{HashMap, HashSet}; +use std::string::String; + +/// The first version of Tor that included "proto" entries in its descriptors. +/// Authorities should use this to decide whether to guess proto lines. +/// +/// C_RUST_COUPLED: +/// src/or/protover.h `FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS` +const FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS: &'static str = "0.2.9.3-alpha"; + +/// The maximum number of subprotocol version numbers we will attempt to expand +/// before concluding that someone is trying to DoS us +/// +/// C_RUST_COUPLED: src/or/protover.c `MAX_PROTOCOLS_TO_EXPAND` +const MAX_PROTOCOLS_TO_EXPAND: u32 = 500; + +/// Currently supported protocols and their versions +/// +/// C_RUST_COUPLED: src/or/protover.c `protover_get_supported_protocols` +const SUPPORTED_PROTOCOLS: &'static [&'static str] = &[ + "Cons=1-2", + "Desc=1-2", + "DirCache=1-2", + "HSDir=1-2", + "HSIntro=3-4", + "HSRend=1-2", + "Link=1-4", + "LinkAuth=1,3", + "Microdesc=1-2", + "Relay=1-2", +]; + +/// Known subprotocols in Tor. Indicates which subprotocol a relay supports. +/// +/// C_RUST_COUPLED: src/or/protover.h `protocol_type_t` +#[derive(Hash, Eq, PartialEq, Debug)] +pub enum Proto { + Cons, + Desc, + DirCache, + HSDir, + HSIntro, + HSRend, + Link, + LinkAuth, + Microdesc, + Relay, +} + +impl fmt::Display for Proto { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{:?}", self) + } +} + +/// Translates a string representation of a protocol into a Proto type. +/// Error if the string is an unrecognized protocol name. +/// +/// C_RUST_COUPLED: src/or/protover.c `PROTOCOL_NAMES` +impl FromStr for Proto { + type Err = &'static str; + + fn from_str(s: &str) -> Result { + match s { + "Cons" => Ok(Proto::Cons), + "Desc" => Ok(Proto::Desc), + "DirCache" => Ok(Proto::DirCache), + "HSDir" => Ok(Proto::HSDir), + "HSIntro" => Ok(Proto::HSIntro), + "HSRend" => Ok(Proto::HSRend), + "Link" => Ok(Proto::Link), + "LinkAuth" => Ok(Proto::LinkAuth), + "Microdesc" => Ok(Proto::Microdesc), + "Relay" => Ok(Proto::Relay), + _ => Err("Not a valid protocol type"), + } + } +} + +/// Get the string representation of current supported protocols +/// +/// # Returns +/// +/// A `String` whose value is the existing protocols supported by tor. +/// Returned data is in the format as follows: +/// +/// "HSDir=1-1 LinkAuth=1" +/// +pub fn get_supported_protocols() -> String { + SUPPORTED_PROTOCOLS.join(" ") +} + +/// Translates a vector representation of a protocol list into a HashMap +fn parse_protocols( + protocols: &[&str], +) -> Result>, &'static str> { + let mut parsed = HashMap::new(); + + for subproto in protocols { + let (name, version) = get_proto_and_vers(subproto)?; + parsed.insert(name, version); + } + Ok(parsed) +} + +/// Translates a string representation of a protocol list to a HashMap +fn parse_protocols_from_string<'a>( + protocol_string: &'a str, +) -> Result>, &'static str> { + let protocols: &[&'a str] = + &protocol_string.split(" ").collect::>()[..]; + + parse_protocols(protocols) +} + +/// Translates supported tor versions from a string into a HashMap, which is +/// useful when looking up a specific subprotocol. +/// +/// # Returns +/// +/// A `Result` whose `Ok` value is a `HashMap>` holding all +/// subprotocols and versions currently supported by tor. +/// +/// The returned `Result`'s `Err` value is an `&'static str` with a description +/// of the error. +/// +fn tor_supported() -> Result>, &'static str> { + parse_protocols(&SUPPORTED_PROTOCOLS) +} + +/// Get the unique version numbers supported by a subprotocol. +/// +/// # Inputs +/// +/// * `version_string`, a string comprised of "[0-9,-]" +/// +/// # Returns +/// +/// A `Result` whose `Ok` value is a `HashSet` holding all of the unique +/// version numbers. If there were ranges in the `version_string`, then these +/// are expanded, i.e. `"1-3"` would expand to `HashSet::new([1, 2, 3])`. +/// The returned HashSet is *unordered*. +/// +/// The returned `Result`'s `Err` value is an `&'static str` with a description +/// of the error. +/// +/// # Errors +/// +/// This function will error if: +/// +/// * the `version_string` is empty or contains an equals (`"="`) sign, +/// * the expansion of a version range produces an error (see +/// `expand_version_range`), +/// * any single version number is not parseable as an `u32` in radix 10, or +/// * there are greater than 2^16 version numbers to expand. +/// +fn get_versions(version_string: &str) -> Result, &'static str> { + if version_string.is_empty() { + return Err("version string is empty"); + } + + let mut versions = HashSet::::new(); + + for piece in version_string.split(",") { + if piece.contains("-") { + for p in expand_version_range(piece)? { + versions.insert(p); + } + } else { + versions.insert(u32::from_str(piece).or( + Err("invalid protocol entry"), + )?); + } + + if versions.len() > MAX_PROTOCOLS_TO_EXPAND as usize { + return Err("Too many versions to expand"); + } + } + Ok(versions) +} + + +/// Parse the subprotocol type and its version numbers. +/// +/// # Inputs +/// +/// * A `protocol_entry` string, comprised of a keyword, an "=" sign, and one +/// or more version numbers. +/// +/// # Returns +/// +/// A `Result` whose `Ok` value is a tuple of `(Proto, HashSet)`, where the +/// first element is the subprotocol type (see `protover::Proto`) and the last +/// element is a(n unordered) set of unique version numbers which are supported. +/// Otherwise, the `Err` value of this `Result` is a description of the error +/// +fn get_proto_and_vers<'a>( + protocol_entry: &'a str, +) -> Result<(Proto, HashSet), &'static str> { + let mut parts = protocol_entry.splitn(2, "="); + + let proto = match parts.next() { + Some(n) => n, + None => return Err("invalid protover entry"), + }; + + let vers = match parts.next() { + Some(n) => n, + None => return Err("invalid protover entry"), + }; + + let versions = get_versions(vers)?; + let proto_name = proto.parse()?; + + Ok((proto_name, versions)) +} + +/// Parses a single subprotocol entry string into subprotocol and version +/// parts, and then checks whether any of those versions are unsupported. +/// Helper for protover::all_supported +/// +/// # Inputs +/// +/// Accepted data is in the string format as follows: +/// +/// "HSDir=1-1" +/// +/// # Returns +/// +/// Returns `true` if the protocol entry is well-formatted and only contains +/// versions that are also supported in tor. Otherwise, returns false +/// +fn contains_only_supported_protocols(proto_entry: &str) -> bool { + let (name, mut vers) = match get_proto_and_vers(proto_entry) { + Ok(n) => n, + Err(_) => return false, + }; + + let currently_supported: HashMap> = + match tor_supported() { + Ok(n) => n, + Err(_) => return false, + }; + + let supported_versions = match currently_supported.get(&name) { + Some(n) => n, + None => return false, + }; + + vers.retain(|x| !supported_versions.contains(x)); + vers.is_empty() +} + +/// Determine if we support every protocol a client supports, and if not, +/// determine which protocols we do not have support for. +/// +/// # Inputs +/// +/// Accepted data is in the string format as follows: +/// +/// "HSDir=1-1 LinkAuth=1-2" +/// +/// # Returns +/// +/// Return `true` if every protocol version is one that we support. +/// Otherwise, return `false`. +/// Optionally, return parameters which the client supports but which we do not +/// +/// # Examples +/// ``` +/// use protover::all_supported; +/// +/// let (is_supported, unsupported) = all_supported("Link=1"); +/// assert_eq!(true, is_supported); +/// +/// let (is_supported, unsupported) = all_supported("Link=5-6"); +/// assert_eq!(false, is_supported); +/// assert_eq!("Link=5-6", unsupported); +/// +pub fn all_supported(protocols: &str) -> (bool, String) { + let unsupported = protocols + .split_whitespace() + .filter(|v| !contains_only_supported_protocols(v)) + .collect::>(); + + (unsupported.is_empty(), unsupported.join(" ")) +} + +/// Return true iff the provided protocol list includes support for the +/// indicated protocol and version. +/// Otherwise, return false +/// +/// # Inputs +/// +/// * `list`, a string representation of a list of protocol entries. +/// * `proto`, a `Proto` to test support for +/// * `vers`, a `u32` version which we will go on to determine whether the +/// specified protocol supports. +/// +/// # Examples +/// ``` +/// use protover::*; +/// +/// let is_supported = protover_string_supports_protocol("Link=3-4 Cons=1", +/// Proto::Cons,1); +/// assert_eq!(true, is_supported); +/// +/// let is_not_supported = protover_string_supports_protocol("Link=3-4 Cons=1", +/// Proto::Cons,5); +/// assert_eq!(false, is_not_supported) +/// ``` +pub fn protover_string_supports_protocol( + list: &str, + proto: Proto, + vers: u32, +) -> bool { + let supported: HashMap>; + + match parse_protocols_from_string(list) { + Ok(result) => supported = result, + Err(_) => return false, + } + + let supported_versions = match supported.get(&proto) { + Some(n) => n, + None => return false, + }; + + supported_versions.contains(&vers) +} + +/// As protover_string_supports_protocol(), but also returns True if +/// any later version of the protocol is supported. +/// +/// # Examples +/// ``` +/// use protover::*; +/// +/// let is_supported = protover_string_supports_protocol_or_later( +/// "Link=3-4 Cons=5", Proto::Cons, 5); +/// +/// assert_eq!(true, is_supported); +/// +/// let is_supported = protover_string_supports_protocol_or_later( +/// "Link=3-4 Cons=5", Proto::Cons, 4); +/// +/// assert_eq!(true, is_supported); +/// +/// let is_supported = protover_string_supports_protocol_or_later( +/// "Link=3-4 Cons=5", Proto::Cons, 6); +/// +/// assert_eq!(false, is_supported); +/// ``` +pub fn protover_string_supports_protocol_or_later( + list: &str, + proto: Proto, + vers: u32, +) -> bool { + let supported: HashMap>; + + match parse_protocols_from_string(list) { + Ok(result) => supported = result, + Err(_) => return false, + } + + let supported_versions = match supported.get(&proto) { + Some(n) => n, + None => return false, + }; + + supported_versions.iter().any(|v| v >= &vers) +} + +/// Fully expand a version range. For example, 1-3 expands to 1,2,3 +/// Helper for get_versions +/// +/// # Inputs +/// +/// `range`, a string comprised of "[0-9,-]" +/// +/// # Returns +/// +/// A `Result` whose `Ok` value a vector of unsigned integers representing the +/// expanded range of supported versions by a single protocol. +/// Otherwise, the `Err` value of this `Result` is a description of the error +/// +/// # Errors +/// +/// This function will error if: +/// +/// * the specified range is empty +/// * the version range does not contain both a valid lower and upper bound. +/// +fn expand_version_range(range: &str) -> Result, &'static str> { + if range.is_empty() { + return Err("version string empty"); + } + + let mut parts = range.split("-"); + + let lower_string = parts.next().ok_or( + "cannot parse protocol range lower bound", + )?; + + let lower = u32::from_str_radix(lower_string, 10).or(Err( + "cannot parse protocol range lower bound", + ))?; + + let higher_string = parts.next().ok_or( + "cannot parse protocol range upper bound", + )?; + + let higher = u32::from_str_radix(higher_string, 10).or(Err( + "cannot parse protocol range upper bound", + ))?; + + // We can use inclusive range syntax when it becomes stable. + Ok((lower..higher + 1).collect()) +} + +/// Checks to see if there is a continuous range of integers, starting at the +/// first in the list. Returns the last integer in the range if a range exists. +/// Helper for compute_vote +/// +/// # Inputs +/// +/// `list`, an ordered vector of `u32` integers of "[0-9,-]" representing the +/// supported versions for a single protocol. +/// +/// # Returns +/// +/// A `bool` indicating whether the list contains a range, starting at the +/// first in the list, and an `u32` of the last integer in the range. +/// +/// For example, if given vec![1, 2, 3, 5], find_range will return true, +/// as there is a continuous range, and 3, which is the last number in the +/// continuous range. +/// +fn find_range(list: &Vec) -> (bool, u32) { + if list.len() == 0 { + return (false, 0); + } + + let mut iterable = list.iter().peekable(); + let mut range_end = match iterable.next() { + Some(n) => *n, + None => return (false, 0), + }; + + let mut has_range = false; + + while iterable.peek().is_some() { + let n = *iterable.next().unwrap(); + if n != range_end + 1 { + break; + } + + has_range = true; + range_end = n; + } + + (has_range, range_end) +} + +/// Contracts a HashSet representation of supported versions into a string. +/// Helper for compute_vote +/// +/// # Inputs +/// +/// `supported_set`, a set of integers of "[0-9,-]" representing the +/// supported versions for a single protocol. +/// +/// # Returns +/// +/// A `String` representation of this set in ascending order. +/// +fn contract_protocol_list<'a>(supported_set: &'a HashSet) -> String { + let mut supported: Vec = supported_set.iter() + .map(|x| *x) + .collect(); + supported.sort(); + + let mut final_output: Vec = Vec::new(); + + while supported.len() != 0 { + let (has_range, end) = find_range(&supported); + let current = supported.remove(0); + + if has_range { + final_output.push(format!( + "{}-{}", + current.to_string(), + &end.to_string(), + )); + supported.retain(|&x| x > end); + } else { + final_output.push(current.to_string()); + } + } + + final_output.join(",") +} + +/// Parses a protocol list without validating the protocol names +/// +/// # Inputs +/// +/// * `protocol_string`, a string comprised of keys and values, both which are +/// strings. The keys are the protocol names while values are a string +/// representation of the supported versions. +/// +/// The input is _not_ expected to be a subset of the Proto types +/// +/// # Returns +/// +/// A `Result` whose `Ok` value is a `HashSet` holding all of the unique +/// version numbers. +/// +/// The returned `Result`'s `Err` value is an `&'static str` with a description +/// of the error. +/// +/// # Errors +/// +/// This function will error if: +/// +/// * The protocol string does not follow the "protocol_name=version_list" +/// expected format +/// * If the version string is malformed. See `get_versions`. +/// +fn parse_protocols_from_string_with_no_validation<'a>( + protocol_string: &'a str, +) -> Result>, &'static str> { + let protocols = &protocol_string.split(" ").collect::>()[..]; + + let mut parsed: HashMap> = HashMap::new(); + + for subproto in protocols { + let mut parts = subproto.splitn(2, "="); + + let name = match parts.next() { + Some(n) => n, + None => return Err("invalid protover entry"), + }; + + let vers = match parts.next() { + Some(n) => n, + None => return Err("invalid protover entry"), + }; + + let versions = get_versions(vers)?; + + parsed.insert(String::from(name), versions); + } + Ok(parsed) +} + +/// Protocol voting implementation. +/// +/// Given a list of strings describing protocol versions, return a new +/// string encoding all of the protocols that are listed by at +/// least threshold of the inputs. +/// +/// The string is sorted according to the following conventions: +/// - Protocols names are alphabetized +/// - Protocols are in order low to high +/// - Individual and ranges are listed together. For example, +/// "3, 5-10,13" +/// - All entries are unique +/// +/// # Examples +/// ``` +/// use protover::compute_vote; +/// +/// let protos = vec![String::from("Link=3-4"), String::from("Link=3")]; +/// let vote = compute_vote(protos, 2); +/// assert_eq!("Link=3", vote) +/// ``` +pub fn compute_vote( + list_of_proto_strings: Vec, + threshold: i32, +) -> String { + let empty = String::from(""); + + if list_of_proto_strings.is_empty() { + return empty; + } + + // all_count is a structure to represent the count of the number of + // supported versions for a specific protocol. For example, in JSON format: + // { + // "FirstSupportedProtocol": { + // "1": "3", + // "2": "1" + // } + // } + // means that FirstSupportedProtocol has three votes which support version + // 1, and one vote that supports version 2 + let mut all_count: HashMap> = HashMap::new(); + + // parse and collect all of the protos and their versions and collect them + for vote in list_of_proto_strings { + let this_vote: HashMap> = + match parse_protocols_from_string_with_no_validation(&vote) { + Ok(result) => result, + Err(_) => continue, + }; + + for (protocol, versions) in this_vote { + let supported_vers: &mut HashMap = + all_count.entry(protocol).or_insert(HashMap::new()); + + for version in versions { + let counter: &mut usize = + supported_vers.entry(version).or_insert(0); + *counter += 1; + } + } + } + + let mut final_output: HashMap = + HashMap::with_capacity(SUPPORTED_PROTOCOLS.len()); + + // Go through and remove verstions that are less than the threshold + for (protocol, versions) in all_count { + let mut meets_threshold = HashSet::new(); + for (version, count) in versions { + if count >= threshold as usize { + meets_threshold.insert(version); + } + } + + // For each protocol, compress its version list into the expected + // protocol version string format + let contracted = contract_protocol_list(&meets_threshold); + if !contracted.is_empty() { + final_output.insert(protocol, contracted); + } + } + + write_vote_to_string(&final_output) +} + +/// Return a String comprised of protocol entries in alphabetical order +/// +/// # Inputs +/// +/// * `vote`, a `HashMap` comprised of keys and values, both which are strings. +/// The keys are the protocol names while values are a string representation of +/// the supported versions. +/// +/// # Returns +/// +/// A `String` whose value is series of pairs, comprising of the protocol name +/// and versions that it supports. The string takes the following format: +/// +/// "first_protocol_name=1,2-5, second_protocol_name=4,5" +/// +/// Sorts the keys in alphabetical order and creates the expected subprotocol +/// entry format. +/// +fn write_vote_to_string(vote: &HashMap) -> String { + let mut keys: Vec<&String> = vote.keys().collect(); + keys.sort(); + + let mut output = Vec::new(); + for key in keys { + // TODO error in indexing here? + output.push(format!("{}={}", key, vote[key])); + } + output.join(" ") +} + +/// Returns a boolean indicating whether the given protocol and version is +/// supported in any of the existing Tor protocols +/// +/// # Examples +/// ``` +/// use protover::*; +/// +/// let is_supported = is_supported_here(Proto::Link, 5); +/// assert_eq!(false, is_supported); +/// +/// let is_supported = is_supported_here(Proto::Link, 1); +/// assert_eq!(true, is_supported); +/// ``` +pub fn is_supported_here(proto: Proto, vers: u32) -> bool { + let currently_supported: HashMap>; + + match tor_supported() { + Ok(result) => currently_supported = result, + Err(_) => return false, + } + + let supported_versions = match currently_supported.get(&proto) { + Some(n) => n, + None => return false, + }; + + supported_versions.contains(&vers) +} + +/// Older versions of Tor cannot infer their own subprotocols +/// Used to determine which subprotocols are supported by older Tor versions. +/// +/// # Inputs +/// +/// * `version`, a string comprised of "[0-9,-]" +/// +/// # Returns +/// +/// A `String` whose value is series of pairs, comprising of the protocol name +/// and versions that it supports. The string takes the following format: +/// +/// "HSDir=1-1 LinkAuth=1" +/// +/// This function returns the protocols that are supported by the version input, +/// only for tor versions older than FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS. +/// +/// C_RUST_COUPLED: src/rust/protover.c `compute_for_old_tor` +pub fn compute_for_old_tor(version: &str) -> String { + if c_tor_version_as_new_as( + version, + FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS, + ) + { + return String::new(); + } + + if c_tor_version_as_new_as(version, "0.2.9.1-alpha") { + let ret = "Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 \ + Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2"; + return String::from(ret); + } + + if c_tor_version_as_new_as(version, "0.2.7.5") { + let ret = "Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 \ + Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2"; + return String::from(ret); + } + + if c_tor_version_as_new_as(version, "0.2.4.19") { + let ret = "Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 \ + Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2"; + return String::from(ret); + } + String::new() +} + +#[cfg(test)] +mod test { + #[test] + fn test_get_versions() { + use std::collections::HashSet; + + use super::get_versions; + + assert_eq!(Err("version string is empty"), get_versions("")); + assert_eq!(Err("invalid protocol entry"), get_versions("a,b")); + assert_eq!(Err("invalid protocol entry"), get_versions("1,!")); + + { + let mut versions: HashSet = HashSet::new(); + versions.insert(1); + assert_eq!(Ok(versions), get_versions("1")); + } + { + let mut versions: HashSet = HashSet::new(); + versions.insert(1); + versions.insert(2); + assert_eq!(Ok(versions), get_versions("1,2")); + } + { + let mut versions: HashSet = HashSet::new(); + versions.insert(1); + versions.insert(2); + versions.insert(3); + assert_eq!(Ok(versions), get_versions("1-3")); + } + { + let mut versions: HashSet = HashSet::new(); + versions.insert(1); + versions.insert(2); + versions.insert(5); + assert_eq!(Ok(versions), get_versions("1-2,5")); + } + { + let mut versions: HashSet = HashSet::new(); + versions.insert(1); + versions.insert(3); + versions.insert(4); + versions.insert(5); + assert_eq!(Ok(versions), get_versions("1,3-5")); + } + } + + #[test] + fn test_contains_only_supported_protocols() { + use super::contains_only_supported_protocols; + + assert_eq!(false, contains_only_supported_protocols("")); + assert_eq!(false, contains_only_supported_protocols("Cons=")); + assert_eq!(true, contains_only_supported_protocols("Cons=1")); + assert_eq!(false, contains_only_supported_protocols("Cons=0")); + assert_eq!(false, contains_only_supported_protocols("Cons=0-1")); + assert_eq!(false, contains_only_supported_protocols("Cons=5")); + assert_eq!(false, contains_only_supported_protocols("Cons=1-5")); + assert_eq!(false, contains_only_supported_protocols("Cons=1,5")); + assert_eq!(false, contains_only_supported_protocols("Cons=5,6")); + assert_eq!(false, contains_only_supported_protocols("Cons=1,5,6")); + assert_eq!(true, contains_only_supported_protocols("Cons=1,2")); + assert_eq!(true, contains_only_supported_protocols("Cons=1-2")); + } + + #[test] + fn test_find_range() { + use super::find_range; + + assert_eq!((false, 0), find_range(&vec![])); + assert_eq!((false, 1), find_range(&vec![1])); + assert_eq!((true, 2), find_range(&vec![1, 2])); + assert_eq!((true, 3), find_range(&vec![1, 2, 3])); + assert_eq!((true, 3), find_range(&vec![1, 2, 3, 5])); + } + + #[test] + fn test_expand_version_range() { + use super::expand_version_range; + + assert_eq!(Err("version string empty"), expand_version_range("")); + assert_eq!(Ok(vec![1, 2]), expand_version_range("1-2")); + assert_eq!(Ok(vec![1, 2, 3, 4]), expand_version_range("1-4")); + assert_eq!( + Err("cannot parse protocol range lower bound"), + expand_version_range("a") + ); + assert_eq!( + Err("cannot parse protocol range upper bound"), + expand_version_range("1-a") + ); + } + + #[test] + fn test_contract_protocol_list() { + use std::collections::HashSet; + use super::contract_protocol_list; + + { + let mut versions = HashSet::::new(); + assert_eq!(String::from(""), contract_protocol_list(&versions)); + + versions.insert(1); + assert_eq!(String::from("1"), contract_protocol_list(&versions)); + + versions.insert(2); + assert_eq!(String::from("1-2"), contract_protocol_list(&versions)); + } + + { + let mut versions = HashSet::::new(); + versions.insert(1); + versions.insert(3); + assert_eq!(String::from("1,3"), contract_protocol_list(&versions)); + } + + { + let mut versions = HashSet::::new(); + versions.insert(1); + versions.insert(2); + versions.insert(3); + versions.insert(4); + assert_eq!(String::from("1-4"), contract_protocol_list(&versions)); + } + + { + let mut versions = HashSet::::new(); + versions.insert(1); + versions.insert(3); + versions.insert(5); + versions.insert(6); + versions.insert(7); + assert_eq!( + String::from("1,3,5-7"), + contract_protocol_list(&versions) + ); + } + + { + let mut versions = HashSet::::new(); + versions.insert(1); + versions.insert(2); + versions.insert(3); + versions.insert(500); + assert_eq!( + String::from("1-3,500"), + contract_protocol_list(&versions) + ); + } + } +} diff --git a/src/wraith/src/rust/protover/tests/protover.rs b/src/wraith/src/rust/protover/tests/protover.rs new file mode 100644 index 000000000..f4e394b3e --- /dev/null +++ b/src/wraith/src/rust/protover/tests/protover.rs @@ -0,0 +1,291 @@ +// Copyright (c) 2016-2017, The Tor Project, Inc. */ +// See LICENSE for licensing information */ + +extern crate protover; + +#[test] +fn parse_protocol_list_with_single_proto_and_single_version() { + let protocol = "Cons=1"; + let (is_supported, unsupported) = protover::all_supported(protocol); + assert_eq!(true, is_supported); + assert_eq!("", &unsupported); +} + +#[test] +fn parse_protocol_list_with_single_protocol_and_multiple_versions() { + let protocol = "Cons=1-2"; + let (is_supported, unsupported) = protover::all_supported(protocol); + assert_eq!(true, is_supported); + assert_eq!("", &unsupported); +} + +#[test] +fn parse_protocol_list_with_different_single_protocol_and_single_version() { + let protocol = "HSDir=1"; + let (is_supported, unsupported) = protover::all_supported(protocol); + assert_eq!(true, is_supported); + assert_eq!("", &unsupported); +} + +#[test] +fn parse_protocol_list_with_single_protocol_and_supported_version() { + let protocol = "Desc=2"; + let (is_supported, unsupported) = protover::all_supported(protocol); + assert_eq!(true, is_supported); + assert_eq!("", &unsupported); +} + +#[test] +fn parse_protocol_list_with_two_protocols_and_single_version() { + let protocols = "Cons=1 HSDir=1"; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!(true, is_supported); + assert_eq!("", &unsupported); +} + + +#[test] +fn parse_protocol_list_with_single_protocol_and_two_nonsequential_versions() { + let protocol = "Desc=1,2"; + let (is_supported, unsupported) = protover::all_supported(protocol); + assert_eq!(true, is_supported); + assert_eq!("", &unsupported); +} + + +#[test] +fn parse_protocol_list_with_single_protocol_and_two_sequential_versions() { + let protocol = "Desc=1-2"; + let (is_supported, unsupported) = protover::all_supported(protocol); + assert_eq!(true, is_supported); + assert_eq!("", &unsupported); +} + +#[test] +fn parse_protocol_list_with_single_protocol_and_protocol_range_returns_set() { + let protocol = "Link=1-4"; + let (is_supported, unsupported) = protover::all_supported(protocol); + assert_eq!(true, is_supported); + assert_eq!("", &unsupported); +} + +#[test] +fn parse_protocol_list_with_single_protocol_and_protocol_set() { + let protocols = "Link=3-4 Desc=2"; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!(true, is_supported); + assert_eq!("", &unsupported); +} + +#[test] +fn protover_all_supported_with_two_values() { + let protocols = "Microdesc=1-2 Relay=2"; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!("", &unsupported); + assert_eq!(true, is_supported); +} + +#[test] +fn protover_all_supported_with_one_value() { + let protocols = "Microdesc=1-2"; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!("", &unsupported); + assert_eq!(true, is_supported); +} + +#[test] +fn protover_all_supported_with_empty() { + let protocols = ""; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!(true, is_supported); + assert_eq!("", &unsupported); +} + +#[test] +fn protover_all_supported_with_three_values() { + let protocols = "LinkAuth=1 Microdesc=1-2 Relay=2"; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!("", &unsupported); + assert_eq!(true, is_supported); +} + +#[test] +fn protover_all_supported_with_unsupported_protocol() { + let protocols = "Wombat=9"; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!(false, is_supported); + assert_eq!("Wombat=9", &unsupported); +} + +#[test] +fn protover_all_supported_with_unsupported_versions() { + let protocols = "Link=3-999"; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!(false, is_supported); + assert_eq!("Link=3-999", &unsupported); +} + +#[test] +fn protover_all_supported_with_unsupported_low_version() { + let protocols = "Cons=0-1"; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!(false, is_supported); + assert_eq!("Cons=0-1", &unsupported); +} + +#[test] +fn protover_all_supported_with_unsupported_high_version() { + let protocols = "Cons=1-3"; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!(false, is_supported); + assert_eq!("Cons=1-3", &unsupported); +} + +#[test] +fn protover_all_supported_with_mix_of_supported_and_unsupproted() { + let protocols = "Link=3-4 Wombat=9"; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!(false, is_supported); + assert_eq!("Wombat=9", &unsupported); +} + +#[test] +fn protover_string_supports_protocol_returns_true_for_single_supported() { + let protocols = "Link=3-4 Cons=1"; + let is_supported = protover::protover_string_supports_protocol( + protocols, + protover::Proto::Cons, + 1, + ); + assert_eq!(true, is_supported); +} + +#[test] +fn protover_string_supports_protocol_returns_false_for_single_unsupported() { + let protocols = "Link=3-4 Cons=1"; + let is_supported = protover::protover_string_supports_protocol( + protocols, + protover::Proto::Cons, + 2, + ); + assert_eq!(false, is_supported); +} + +#[test] +fn protover_string_supports_protocol_returns_false_for_unsupported() { + let protocols = "Link=3-4"; + let is_supported = protover::protover_string_supports_protocol( + protocols, + protover::Proto::Cons, + 2, + ); + assert_eq!(false, is_supported); +} + +#[test] +fn protover_all_supported_with_unexpected_characters() { + let protocols = "Cons=*-%"; + let (is_supported, unsupported) = protover::all_supported(protocols); + assert_eq!(false, is_supported); + assert_eq!("Cons=*-%", &unsupported); +} + +#[test] +fn protover_compute_vote_returns_empty_for_empty_string() { + let protocols = vec![String::from("")]; + let listed = protover::compute_vote(protocols, 1); + assert_eq!("", listed); +} + +#[test] +fn protover_compute_vote_returns_single_protocol_for_matching() { + let protocols = vec![String::from("Cons=1")]; + let listed = protover::compute_vote(protocols, 1); + assert_eq!("Cons=1", listed); +} + +#[test] +fn protover_compute_vote_returns_two_protocols_for_two_matching() { + let protocols = vec![String::from("Link=1 Cons=1")]; + let listed = protover::compute_vote(protocols, 1); + assert_eq!("Cons=1 Link=1", listed); +} + +#[test] +fn protover_compute_vote_returns_one_protocol_when_one_out_of_two_matches() { + let protocols = vec![String::from("Cons=1 Link=2"), String::from("Cons=1")]; + let listed = protover::compute_vote(protocols, 2); + assert_eq!("Cons=1", listed); +} + +#[test] +fn protover_compute_vote_returns_protocols_that_it_doesnt_currently_support() { + let protocols = vec![String::from("Foo=1 Cons=2"), String::from("Bar=1")]; + let listed = protover::compute_vote(protocols, 1); + assert_eq!("Bar=1 Cons=2 Foo=1", listed); +} + +#[test] +fn protover_compute_vote_returns_matching_for_mix() { + let protocols = vec![String::from("Link=1-10,500 Cons=1,3-7,8")]; + let listed = protover::compute_vote(protocols, 1); + assert_eq!("Cons=1,3-8 Link=1-10,500", listed); +} + +#[test] +fn protover_compute_vote_returns_matching_for_longer_mix() { + let protocols = vec![ + String::from("Desc=1-10,500 Cons=1,3-7,8"), + String::from("Link=123-456,78 Cons=2-6,8 Desc=9"), + ]; + + let listed = protover::compute_vote(protocols, 1); + assert_eq!("Cons=1-8 Desc=1-10,500 Link=78,123-456", listed); +} + +#[test] +fn protover_compute_vote_returns_matching_for_longer_mix_with_threshold_two() { + let protocols = vec![ + String::from("Desc=1-10,500 Cons=1,3-7,8"), + String::from("Link=123-456,78 Cons=2-6,8 Desc=9"), + ]; + + let listed = protover::compute_vote(protocols, 2); + assert_eq!("Cons=3-6,8 Desc=9", listed); +} + +#[test] +fn protover_compute_vote_handles_duplicated_versions() { + let protocols = vec![String::from("Cons=1"), String::from("Cons=1")]; + assert_eq!("Cons=1", protover::compute_vote(protocols, 2)); + + let protocols = vec![String::from("Cons=1-2"), String::from("Cons=1-2")]; + assert_eq!("Cons=1-2", protover::compute_vote(protocols, 2)); +} + +#[test] +fn protover_compute_vote_handles_invalid_proto_entries() { + let protocols = vec![ + String::from("Cons=1"), + String::from("Cons=1"), + String::from("Link=a"), + ]; + assert_eq!("Cons=1", protover::compute_vote(protocols, 2)); + + let protocols = vec![ + String::from("Cons=1"), + String::from("Cons=1"), + String::from("Link=1-%"), + ]; + assert_eq!("Cons=1", protover::compute_vote(protocols, 2)); +} + +#[test] +fn protover_is_supported_here_returns_true_for_supported_protocol() { + assert_eq!(true, protover::is_supported_here(protover::Proto::Cons, 1)); +} + +#[test] +fn protover_is_supported_here_returns_false_for_unsupported_protocol() { + assert_eq!(false, protover::is_supported_here(protover::Proto::Cons, 5)); +} diff --git a/src/wraith/src/rust/smartlist/Cargo.toml b/src/wraith/src/rust/smartlist/Cargo.toml new file mode 100644 index 000000000..51f486c4d --- /dev/null +++ b/src/wraith/src/rust/smartlist/Cargo.toml @@ -0,0 +1,13 @@ +[package] +authors = ["The Tor Project"] +version = "0.0.1" +name = "smartlist" + +[dependencies] +libc = "0.2.22" + +[lib] +name = "smartlist" +path = "lib.rs" +crate_type = ["rlib", "staticlib"] + diff --git a/src/wraith/src/rust/smartlist/lib.rs b/src/wraith/src/rust/smartlist/lib.rs new file mode 100644 index 000000000..14a814831 --- /dev/null +++ b/src/wraith/src/rust/smartlist/lib.rs @@ -0,0 +1,8 @@ +// Copyright (c) 2016-2017, The Tor Project, Inc. */ +// See LICENSE for licensing information */ + +extern crate libc; + +mod smartlist; + +pub use smartlist::*; diff --git a/src/wraith/src/rust/smartlist/smartlist.rs b/src/wraith/src/rust/smartlist/smartlist.rs new file mode 100644 index 000000000..ec5d7a57f --- /dev/null +++ b/src/wraith/src/rust/smartlist/smartlist.rs @@ -0,0 +1,115 @@ +// Copyright (c) 2016-2017, The Tor Project, Inc. */ +// See LICENSE for licensing information */ + +use std::slice; +use libc::{c_char, c_int}; +use std::ffi::CStr; + +/// Smartlists are a type used in C code in tor to define a collection of a +/// generic type, which has a capacity and a number used. Each Smartlist +/// defines how to extract the list of values from the underlying C structure +/// +/// Implementations are required to have a C representation, as this module +/// serves purely to translate smartlists as defined in tor to vectors in Rust. +pub trait Smartlist { + fn get_list(&self) -> Vec; +} + +#[repr(C)] +pub struct Stringlist { + pub list: *const *const c_char, + pub num_used: c_int, + pub capacity: c_int, +} + +impl Smartlist for Stringlist { + fn get_list(&self) -> Vec { + let empty: Vec = Vec::new(); + let mut rust_list: Vec = Vec::new(); + + if self.list.is_null() || self.num_used == 0 { + return empty; + } + + // unsafe, as we need to extract the smartlist list into a vector of + // pointers, and then transform each element into a Rust string. + let elems: &[*const i8] = + unsafe { slice::from_raw_parts(self.list, self.num_used as usize) }; + + for elem in elems.iter() { + if elem.is_null() { + continue; + } + + // unsafe, as we need to create a cstring from the referenced + // element + let c_string = unsafe { CStr::from_ptr(*elem) }; + + let r_string = match c_string.to_str() { + Ok(n) => n, + Err(_) => return empty, + }; + + rust_list.push(String::from(r_string)); + } + + rust_list + } +} + +// TODO: CHK: this module maybe should be tested from a test in C with a +// smartlist as defined in tor. +#[cfg(test)] +mod test { + #[test] + fn test_get_list_of_strings() { + extern crate libc; + + use std::ffi::CString; + use libc::c_char; + + use super::Smartlist; + use super::Stringlist; + + { + // test to verify that null pointers are gracefully handled + use std::ptr; + + let sl = Stringlist { + list: ptr::null(), + num_used: 0, + capacity: 0, + }; + + let data = sl.get_list(); + assert_eq!(0, data.len()); + } + + { + let args = vec![String::from("a"), String::from("b")]; + + // for each string, transform it into a CString + let c_strings: Vec<_> = args.iter() + .map(|arg| CString::new(arg.as_str()).unwrap()) + .collect(); + + // then, collect a pointer for each CString + let p_args: Vec<_> = + c_strings.iter().map(|arg| arg.as_ptr()).collect(); + + let p: *const *const c_char = p_args.as_ptr(); + + // This is the representation that we expect when receiving a + // smartlist at the Rust/C FFI layer. + let sl = Stringlist { + list: p, + num_used: 2, + capacity: 2, + }; + + let data = sl.get_list(); + assert_eq!("a", &data[0]); + assert_eq!("b", &data[1]); + } + } +} diff --git a/src/wraith/src/rust/tor_allocate/Cargo.toml b/src/wraith/src/rust/tor_allocate/Cargo.toml new file mode 100644 index 000000000..ceb08b78a --- /dev/null +++ b/src/wraith/src/rust/tor_allocate/Cargo.toml @@ -0,0 +1,13 @@ +[package] +authors = ["The Tor Project"] +version = "0.0.1" +name = "tor_allocate" + +[dependencies] +libc = "0.2.22" + +[lib] +name = "tor_allocate" +path = "lib.rs" +crate_type = ["rlib", "staticlib"] + diff --git a/src/wraith/src/rust/tor_allocate/lib.rs b/src/wraith/src/rust/tor_allocate/lib.rs new file mode 100644 index 000000000..937a5dcf6 --- /dev/null +++ b/src/wraith/src/rust/tor_allocate/lib.rs @@ -0,0 +1,15 @@ +// Copyright (c) 2016-2017, The Tor Project, Inc. */ +// See LICENSE for licensing information */ + +//! Allocation helper functions that allow data to be allocated in Rust +//! using tor's specified allocator. In doing so, this can be later freed +//! from C. +//! +//! This is currently a temporary solution, we will later use tor's allocator +//! by default for any allocation that occurs in Rust. However, as this will +//! stabalize in 2018, we can use this as a temporary measure. + +extern crate libc; + +mod tor_allocate; +pub use tor_allocate::*; diff --git a/src/wraith/src/rust/tor_allocate/tor_allocate.rs b/src/wraith/src/rust/tor_allocate/tor_allocate.rs new file mode 100644 index 000000000..359df1cd7 --- /dev/null +++ b/src/wraith/src/rust/tor_allocate/tor_allocate.rs @@ -0,0 +1,97 @@ +// Copyright (c) 2016-2017, The Tor Project, Inc. */ +// See LICENSE for licensing information */ + +use libc::{c_char, c_void}; +use std::{ptr, slice, mem}; + +#[cfg(not(test))] +extern "C" { + fn tor_malloc_(size: usize) -> *mut c_void; +} + +// Defined only for tests, used for testing purposes, so that we don't need +// to link to tor C files. Uses the system allocator +#[cfg(test)] +unsafe extern "C" fn tor_malloc_(size: usize) -> *mut c_void { + use libc::malloc; + malloc(size) +} + +/// Allocate memory using tor_malloc_ and copy an existing string into the +/// allocated buffer, returning a pointer that can later be called in C. +/// +/// # Inputs +/// +/// * `src`, a reference to a String. +/// +/// # Returns +/// +/// A `*mut c_char` that should be freed by tor_free in C +/// +pub fn allocate_and_copy_string(src: &String) -> *mut c_char { + let bytes: &[u8] = src.as_bytes(); + + let size = mem::size_of_val::<[u8]>(bytes); + let size_one_byte = mem::size_of::(); + + // handle integer overflow when adding one to the calculated length + let size_with_null_byte = match size.checked_add(size_one_byte) { + Some(n) => n, + None => return ptr::null_mut(), + }; + + let dest = unsafe { tor_malloc_(size_with_null_byte) as *mut u8 }; + + if dest.is_null() { + return ptr::null_mut(); + } + + unsafe { ptr::copy_nonoverlapping(bytes.as_ptr(), dest, size) }; + + // set the last byte as null, using the ability to index into a slice + // rather than doing pointer arithmatic + let slice = unsafe { slice::from_raw_parts_mut(dest, size_with_null_byte) }; + slice[size] = 0; // add a null terminator + + dest as *mut c_char +} + +#[cfg(test)] +mod test { + + #[test] + fn test_allocate_and_copy_string_with_empty() { + use std::ffi::CStr; + use libc::{free, c_void}; + + use tor_allocate::allocate_and_copy_string; + + let empty = String::new(); + let allocated_empty = allocate_and_copy_string(&empty); + + let allocated_empty_rust = + unsafe { CStr::from_ptr(allocated_empty).to_str().unwrap() }; + + assert_eq!("", allocated_empty_rust); + + unsafe { free(allocated_empty as *mut c_void) }; + } + + #[test] + fn test_allocate_and_copy_string_with_not_empty_string() { + use std::ffi::CStr; + use libc::{free, c_void}; + + use tor_allocate::allocate_and_copy_string; + + let empty = String::from("foo bar biz"); + let allocated_empty = allocate_and_copy_string(&empty); + + let allocated_empty_rust = + unsafe { CStr::from_ptr(allocated_empty).to_str().unwrap() }; + + assert_eq!("foo bar biz", allocated_empty_rust); + + unsafe { free(allocated_empty as *mut c_void) }; + } +} diff --git a/src/wraith/src/rust/tor_rust/Cargo.toml b/src/wraith/src/rust/tor_rust/Cargo.toml new file mode 100644 index 000000000..86fad3ee7 --- /dev/null +++ b/src/wraith/src/rust/tor_rust/Cargo.toml @@ -0,0 +1,16 @@ +[package] +authors = ["The Tor Project"] +name = "tor_rust" +version = "0.1.0" + +[lib] +name = "tor_rust" +path = "lib.rs" +crate_type = ["rlib", "staticlib"] + +[dependencies.tor_util] +path = "../tor_util" + +[dependencies.protover] +path = "../protover" + diff --git a/src/wraith/src/rust/tor_rust/include.am b/src/wraith/src/rust/tor_rust/include.am new file mode 100644 index 000000000..c02324cb7 --- /dev/null +++ b/src/wraith/src/rust/tor_rust/include.am @@ -0,0 +1,30 @@ +EXTRA_DIST +=\ + src/rust/tor_rust/Cargo.toml \ + src/rust/tor_rust/lib.rs + +EXTRA_CARGO_OPTIONS= + +src/rust/target/release/@TOR_RUST_STATIC_NAME@: FORCE + ( cd "$(abs_top_builddir)/src/rust" ; \ + CARGO_TARGET_DIR="$(abs_top_builddir)/src/rust/target" \ + CARGO_HOME="$(abs_top_builddir)/src/rust" \ + $(CARGO) build --release $(EXTRA_CARGO_OPTIONS) \ + $(CARGO_ONLINE) \ + --manifest-path "$(abs_top_srcdir)/src/rust/tor_rust/Cargo.toml" ) + +distclean-rust: + ( cd "$(abs_top_builddir)/src/rust" ; \ + CARGO_TARGET_DIR="$(abs_top_builddir)/src/rust/target" \ + CARGO_HOME="$(abs_top_builddir)/src/rust" \ + $(CARGO) clean $(EXTRA_CARGO_OPTIONS) \ + $(CARGO_ONLINE) \ + --manifest-path "$(abs_top_srcdir)/src/rust/tor_rust/Cargo.toml" ) + rm -rf "$(abs_top_builddir)/src/rust/registry" + +if USE_RUST +build-rust: src/rust/target/release/@TOR_RUST_STATIC_NAME@ +else +build-rust: +endif + +FORCE: diff --git a/src/wraith/src/rust/tor_rust/lib.rs b/src/wraith/src/rust/tor_rust/lib.rs new file mode 100644 index 000000000..c1585c048 --- /dev/null +++ b/src/wraith/src/rust/tor_rust/lib.rs @@ -0,0 +1,5 @@ +extern crate tor_util; +extern crate protover; + +pub use tor_util::*; +pub use protover::*; diff --git a/src/wraith/src/rust/tor_util/Cargo.toml b/src/wraith/src/rust/tor_util/Cargo.toml new file mode 100644 index 000000000..d7379a598 --- /dev/null +++ b/src/wraith/src/rust/tor_util/Cargo.toml @@ -0,0 +1,16 @@ +[package] +authors = ["The Tor Project"] +name = "tor_util" +version = "0.0.1" + +[lib] +name = "tor_util" +path = "lib.rs" +crate_type = ["rlib", "staticlib"] + +[dependencies.tor_allocate] +path = "../tor_allocate" + +[dependencies] +libc = "0.2.22" + diff --git a/src/wraith/src/rust/tor_util/ffi.rs b/src/wraith/src/rust/tor_util/ffi.rs new file mode 100644 index 000000000..5c3cdba4b --- /dev/null +++ b/src/wraith/src/rust/tor_util/ffi.rs @@ -0,0 +1,26 @@ +// Copyright (c) 2016-2017, The Tor Project, Inc. */ +// See LICENSE for licensing information */ + +//! FFI functions to announce Rust support during tor startup, only to be +//! called from C. +//! + +use libc::c_char; +use tor_allocate::allocate_and_copy_string; + +/// Returns a short string to announce Rust support during startup. +/// +/// # Examples +/// ```c +/// char *rust_str = rust_welcome_string(); +/// printf("%s", rust_str); +/// tor_free(rust_str); +/// ``` +#[no_mangle] +pub extern "C" fn rust_welcome_string() -> *mut c_char { + let rust_welcome = String::from( + "Tor is running with Rust integration. Please report \ + any bugs you encounter.", + ); + allocate_and_copy_string(&rust_welcome) +} diff --git a/src/wraith/src/rust/tor_util/lib.rs b/src/wraith/src/rust/tor_util/lib.rs new file mode 100644 index 000000000..42fa9d5ad --- /dev/null +++ b/src/wraith/src/rust/tor_util/lib.rs @@ -0,0 +1,11 @@ +// Copyright (c) 2016-2017, The Tor Project, Inc. */ +// See LICENSE for licensing information */ + +//! Small module to announce Rust support during startup for demonstration +//! purposes. +//! + +extern crate libc; +extern crate tor_allocate; + +pub mod ffi; diff --git a/src/wraith/src/test/Makefile.nmake b/src/wraith/src/test/Makefile.nmake new file mode 100644 index 000000000..cfbe281b9 --- /dev/null +++ b/src/wraith/src/test/Makefile.nmake @@ -0,0 +1,37 @@ +all: test.exe test-child.exe bench.exe + +CFLAGS = /I ..\win32 /I ..\..\..\build-alpha\include /I ..\common /I ..\or \ + /I ..\ext + +LIBS = ..\..\..\build-alpha\lib\libevent.lib \ + ..\..\..\build-alpha\lib\libcrypto.lib \ + ..\..\..\build-alpha\lib\libssl.lib \ + ..\..\..\build-alpha\lib\libz.lib \ + ..\or\libtor.lib \ + ws2_32.lib advapi32.lib shell32.lib \ + crypt32.lib gdi32.lib user32.lib + +TEST_OBJECTS = test.obj test_addr.obj test_channel.obj test_channeltls.obj \ + test_consdiff.obj test_containers.obj \ + test_controller_events.obj test_crypto.obj test_data.obj test_dir.obj \ + test_checkdir.obj test_microdesc.obj test_pt.obj test_util.obj \ + test_config.obj test_connection.obj \ + test_cell_formats.obj test_relay.obj test_replay.obj \ + test_channelpadding.obj \ + test_circuitstats.obj \ + test_scheduler.obj test_introduce.obj test_hs.obj tinytest.obj + +tinytest.obj: ..\ext\tinytest.c + $(CC) $(CFLAGS) /D snprintf=_snprintf /c ..\ext\tinytest.c + +test.exe: $(TEST_OBJECTS) + $(CC) $(CFLAGS) $(LIBS) ..\common\*.lib $(TEST_OBJECTS) /Fe$@ + +bench.exe: bench.obj + $(CC) $(CFLAGS) bench.obj $(LIBS) ..\common\*.lib /Fe$@ + +test-child.exe: test-child.obj + $(CC) $(CFLAGS) test-child.obj /Fe$@ + +clean: + del *.obj *.lib test.exe bench.exe test-child.exe diff --git a/src/wraith/src/test/bench.c b/src/wraith/src/test/bench.c new file mode 100644 index 000000000..f30b60990 --- /dev/null +++ b/src/wraith/src/test/bench.c @@ -0,0 +1,738 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file bench.c + * \brief Benchmarks for lower level Tor modules. + **/ + +#include "orconfig.h" + +#include "or.h" +#include "onion_tap.h" +#include "relay.h" +#include +#include +#include +#include +#include + +#include "config.h" +#include "crypto_curve25519.h" +#include "onion_ntor.h" +#include "crypto_ed25519.h" +#include "consdiff.h" + +#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) +static uint64_t nanostart; +static inline uint64_t +timespec_to_nsec(const struct timespec *ts) +{ + return ((uint64_t)ts->tv_sec)*1000000000 + ts->tv_nsec; +} + +static void +reset_perftime(void) +{ + struct timespec ts; + int r; + r = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts); + tor_assert(r == 0); + nanostart = timespec_to_nsec(&ts); +} + +static uint64_t +perftime(void) +{ + struct timespec ts; + int r; + r = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts); + tor_assert(r == 0); + return timespec_to_nsec(&ts) - nanostart; +} + +#else /* !(defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID)) */ +static struct timeval tv_start = { 0, 0 }; +static void +reset_perftime(void) +{ + tor_gettimeofday(&tv_start); +} +static uint64_t +perftime(void) +{ + struct timeval now, out; + tor_gettimeofday(&now); + timersub(&now, &tv_start, &out); + return ((uint64_t)out.tv_sec)*1000000000 + out.tv_usec*1000; +} +#endif /* defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) */ + +#define NANOCOUNT(start,end,iters) \ + ( ((double)((end)-(start))) / (iters) ) + +#define MICROCOUNT(start,end,iters) \ + ( NANOCOUNT((start), (end), (iters)) / 1000.0 ) + +/** Run AES performance benchmarks. */ +static void +bench_aes(void) +{ + int len, i; + char *b1, *b2; + crypto_cipher_t *c; + uint64_t start, end; + const int bytes_per_iter = (1<<24); + reset_perftime(); + char key[CIPHER_KEY_LEN]; + crypto_rand(key, sizeof(key)); + c = crypto_cipher_new(key); + + for (len = 1; len <= 8192; len *= 2) { + int iters = bytes_per_iter / len; + b1 = tor_malloc_zero(len); + b2 = tor_malloc_zero(len); + start = perftime(); + for (i = 0; i < iters; ++i) { + crypto_cipher_encrypt(c, b1, b2, len); + } + end = perftime(); + tor_free(b1); + tor_free(b2); + printf("%d bytes: %.2f nsec per byte\n", len, + NANOCOUNT(start, end, iters*len)); + } + crypto_cipher_free(c); +} + +static void +bench_onion_TAP(void) +{ + const int iters = 1<<9; + int i; + crypto_pk_t *key, *key2; + uint64_t start, end; + char os[TAP_ONIONSKIN_CHALLENGE_LEN]; + char or[TAP_ONIONSKIN_REPLY_LEN]; + crypto_dh_t *dh_out = NULL; + + key = crypto_pk_new(); + key2 = crypto_pk_new(); + if (crypto_pk_generate_key_with_bits(key, 1024) < 0) + goto done; + if (crypto_pk_generate_key_with_bits(key2, 1024) < 0) + goto done; + + reset_perftime(); + start = perftime(); + for (i = 0; i < iters; ++i) { + onion_skin_TAP_create(key, &dh_out, os); + crypto_dh_free(dh_out); + } + end = perftime(); + printf("Client-side, part 1: %f usec.\n", NANOCOUNT(start, end, iters)/1e3); + + onion_skin_TAP_create(key, &dh_out, os); + start = perftime(); + for (i = 0; i < iters; ++i) { + char key_out[CPATH_KEY_MATERIAL_LEN]; + onion_skin_TAP_server_handshake(os, key, NULL, or, + key_out, sizeof(key_out)); + } + end = perftime(); + printf("Server-side, key guessed right: %f usec\n", + NANOCOUNT(start, end, iters)/1e3); + + start = perftime(); + for (i = 0; i < iters; ++i) { + char key_out[CPATH_KEY_MATERIAL_LEN]; + onion_skin_TAP_server_handshake(os, key2, key, or, + key_out, sizeof(key_out)); + } + end = perftime(); + printf("Server-side, key guessed wrong: %f usec.\n", + NANOCOUNT(start, end, iters)/1e3); + + start = perftime(); + for (i = 0; i < iters; ++i) { + crypto_dh_t *dh; + char key_out[CPATH_KEY_MATERIAL_LEN]; + int s; + dh = crypto_dh_dup(dh_out); + s = onion_skin_TAP_client_handshake(dh, or, key_out, sizeof(key_out), + NULL); + crypto_dh_free(dh); + tor_assert(s == 0); + } + end = perftime(); + printf("Client-side, part 2: %f usec.\n", + NANOCOUNT(start, end, iters)/1e3); + + done: + crypto_dh_free(dh_out); + crypto_pk_free(key); + crypto_pk_free(key2); +} + +static void +bench_onion_ntor_impl(void) +{ + const int iters = 1<<10; + int i; + curve25519_keypair_t keypair1, keypair2; + uint64_t start, end; + uint8_t os[NTOR_ONIONSKIN_LEN]; + uint8_t or[NTOR_REPLY_LEN]; + ntor_handshake_state_t *state = NULL; + uint8_t nodeid[DIGEST_LEN]; + di_digest256_map_t *keymap = NULL; + + curve25519_secret_key_generate(&keypair1.seckey, 0); + curve25519_public_key_generate(&keypair1.pubkey, &keypair1.seckey); + curve25519_secret_key_generate(&keypair2.seckey, 0); + curve25519_public_key_generate(&keypair2.pubkey, &keypair2.seckey); + dimap_add_entry(&keymap, keypair1.pubkey.public_key, &keypair1); + dimap_add_entry(&keymap, keypair2.pubkey.public_key, &keypair2); + crypto_rand((char *)nodeid, sizeof(nodeid)); + + reset_perftime(); + start = perftime(); + for (i = 0; i < iters; ++i) { + onion_skin_ntor_create(nodeid, &keypair1.pubkey, &state, os); + ntor_handshake_state_free(state); + state = NULL; + } + end = perftime(); + printf("Client-side, part 1: %f usec.\n", NANOCOUNT(start, end, iters)/1e3); + + state = NULL; + onion_skin_ntor_create(nodeid, &keypair1.pubkey, &state, os); + start = perftime(); + for (i = 0; i < iters; ++i) { + uint8_t key_out[CPATH_KEY_MATERIAL_LEN]; + onion_skin_ntor_server_handshake(os, keymap, NULL, nodeid, or, + key_out, sizeof(key_out)); + } + end = perftime(); + printf("Server-side: %f usec\n", + NANOCOUNT(start, end, iters)/1e3); + + start = perftime(); + for (i = 0; i < iters; ++i) { + uint8_t key_out[CPATH_KEY_MATERIAL_LEN]; + int s; + s = onion_skin_ntor_client_handshake(state, or, key_out, sizeof(key_out), + NULL); + tor_assert(s == 0); + } + end = perftime(); + printf("Client-side, part 2: %f usec.\n", + NANOCOUNT(start, end, iters)/1e3); + + ntor_handshake_state_free(state); + dimap_free(keymap, NULL); +} + +static void +bench_onion_ntor(void) +{ + int ed; + + for (ed = 0; ed <= 1; ++ed) { + printf("Ed25519-based basepoint multiply = %s.\n", + (ed == 0) ? "disabled" : "enabled"); + curve25519_set_impl_params(ed); + bench_onion_ntor_impl(); + } +} + +static void +bench_ed25519_impl(void) +{ + uint64_t start, end; + const int iters = 1<<12; + int i; + const uint8_t msg[] = "but leaving, could not tell what they had heard"; + ed25519_signature_t sig; + ed25519_keypair_t kp; + curve25519_keypair_t curve_kp; + ed25519_public_key_t pubkey_tmp; + + ed25519_secret_key_generate(&kp.seckey, 0); + start = perftime(); + for (i = 0; i < iters; ++i) { + ed25519_public_key_generate(&kp.pubkey, &kp.seckey); + } + end = perftime(); + printf("Generate public key: %.2f usec\n", + MICROCOUNT(start, end, iters)); + + start = perftime(); + for (i = 0; i < iters; ++i) { + ed25519_sign(&sig, msg, sizeof(msg), &kp); + } + end = perftime(); + printf("Sign a short message: %.2f usec\n", + MICROCOUNT(start, end, iters)); + + start = perftime(); + for (i = 0; i < iters; ++i) { + ed25519_checksig(&sig, msg, sizeof(msg), &kp.pubkey); + } + end = perftime(); + printf("Verify signature: %.2f usec\n", + MICROCOUNT(start, end, iters)); + + curve25519_keypair_generate(&curve_kp, 0); + start = perftime(); + for (i = 0; i < iters; ++i) { + ed25519_public_key_from_curve25519_public_key(&pubkey_tmp, + &curve_kp.pubkey, 1); + } + end = perftime(); + printf("Convert public point from curve25519: %.2f usec\n", + MICROCOUNT(start, end, iters)); + + curve25519_keypair_generate(&curve_kp, 0); + start = perftime(); + for (i = 0; i < iters; ++i) { + ed25519_public_blind(&pubkey_tmp, &kp.pubkey, msg); + } + end = perftime(); + printf("Blind a public key: %.2f usec\n", + MICROCOUNT(start, end, iters)); +} + +static void +bench_ed25519(void) +{ + int donna; + + for (donna = 0; donna <= 1; ++donna) { + printf("Ed25519-donna = %s.\n", + (donna == 0) ? "disabled" : "enabled"); + ed25519_set_impl_params(donna); + bench_ed25519_impl(); + } +} + +static void +bench_cell_aes(void) +{ + uint64_t start, end; + const int len = 509; + const int iters = (1<<16); + const int max_misalign = 15; + char *b = tor_malloc(len+max_misalign); + crypto_cipher_t *c; + int i, misalign; + char key[CIPHER_KEY_LEN]; + crypto_rand(key, sizeof(key)); + c = crypto_cipher_new(key); + + reset_perftime(); + for (misalign = 0; misalign <= max_misalign; ++misalign) { + start = perftime(); + for (i = 0; i < iters; ++i) { + crypto_cipher_crypt_inplace(c, b+misalign, len); + } + end = perftime(); + printf("%d bytes, misaligned by %d: %.2f nsec per byte\n", len, misalign, + NANOCOUNT(start, end, iters*len)); + } + + crypto_cipher_free(c); + tor_free(b); +} + +/** Run digestmap_t performance benchmarks. */ +static void +bench_dmap(void) +{ + smartlist_t *sl = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + uint64_t start, end, pt2, pt3, pt4; + int iters = 8192; + const int elts = 4000; + const int fpostests = 100000; + char d[20]; + int i,n=0, fp = 0; + digestmap_t *dm = digestmap_new(); + digestset_t *ds = digestset_new(elts); + + for (i = 0; i < elts; ++i) { + crypto_rand(d, 20); + smartlist_add(sl, tor_memdup(d, 20)); + } + for (i = 0; i < elts; ++i) { + crypto_rand(d, 20); + smartlist_add(sl2, tor_memdup(d, 20)); + } + printf("nbits=%d\n", ds->mask+1); + + reset_perftime(); + + start = perftime(); + for (i = 0; i < iters; ++i) { + SMARTLIST_FOREACH(sl, const char *, cp, digestmap_set(dm, cp, (void*)1)); + } + pt2 = perftime(); + printf("digestmap_set: %.2f ns per element\n", + NANOCOUNT(start, pt2, iters*elts)); + + for (i = 0; i < iters; ++i) { + SMARTLIST_FOREACH(sl, const char *, cp, digestmap_get(dm, cp)); + SMARTLIST_FOREACH(sl2, const char *, cp, digestmap_get(dm, cp)); + } + pt3 = perftime(); + printf("digestmap_get: %.2f ns per element\n", + NANOCOUNT(pt2, pt3, iters*elts*2)); + + for (i = 0; i < iters; ++i) { + SMARTLIST_FOREACH(sl, const char *, cp, digestset_add(ds, cp)); + } + pt4 = perftime(); + printf("digestset_add: %.2f ns per element\n", + NANOCOUNT(pt3, pt4, iters*elts)); + + for (i = 0; i < iters; ++i) { + SMARTLIST_FOREACH(sl, const char *, cp, n += digestset_contains(ds, cp)); + SMARTLIST_FOREACH(sl2, const char *, cp, n += digestset_contains(ds, cp)); + } + end = perftime(); + printf("digestset_contains: %.2f ns per element.\n", + NANOCOUNT(pt4, end, iters*elts*2)); + /* We need to use this, or else the whole loop gets optimized out. */ + printf("Hits == %d\n", n); + + for (i = 0; i < fpostests; ++i) { + crypto_rand(d, 20); + if (digestset_contains(ds, d)) ++fp; + } + printf("False positive rate on digestset: %.2f%%\n", + (fp/(double)fpostests)*100); + + digestmap_free(dm, NULL); + digestset_free(ds); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(sl2, char *, cp, tor_free(cp)); + smartlist_free(sl); + smartlist_free(sl2); +} + +static void +bench_siphash(void) +{ + char buf[128]; + int lens[] = { 7, 8, 15, 16, 20, 32, 111, 128, -1 }; + int i, j; + uint64_t start, end; + const int N = 300000; + crypto_rand(buf, sizeof(buf)); + + for (i = 0; lens[i] > 0; ++i) { + reset_perftime(); + start = perftime(); + for (j = 0; j < N; ++j) { + siphash24g(buf, lens[i]); + } + end = perftime(); + printf("siphash24g(%d): %.2f ns per call\n", + lens[i], NANOCOUNT(start,end,N)); + } +} + +static void +bench_digest(void) +{ + char buf[8192]; + char out[DIGEST512_LEN]; + const int lens[] = { 1, 16, 32, 64, 128, 512, 1024, 2048, -1 }; + const int N = 300000; + uint64_t start, end; + crypto_rand(buf, sizeof(buf)); + + for (int alg = 0; alg < N_DIGEST_ALGORITHMS; alg++) { + for (int i = 0; lens[i] > 0; ++i) { + reset_perftime(); + start = perftime(); + for (int j = 0; j < N; ++j) { + switch (alg) { + case DIGEST_SHA1: + crypto_digest(out, buf, lens[i]); + break; + case DIGEST_SHA256: + case DIGEST_SHA3_256: + crypto_digest256(out, buf, lens[i], alg); + break; + case DIGEST_SHA512: + case DIGEST_SHA3_512: + crypto_digest512(out, buf, lens[i], alg); + break; + default: + tor_assert(0); + } + } + end = perftime(); + printf("%s(%d): %.2f ns per call\n", + crypto_digest_algorithm_get_name(alg), + lens[i], NANOCOUNT(start,end,N)); + } + } +} + +static void +bench_cell_ops(void) +{ + const int iters = 1<<16; + int i; + + /* benchmarks for cell ops at relay. */ + or_circuit_t *or_circ = tor_malloc_zero(sizeof(or_circuit_t)); + cell_t *cell = tor_malloc(sizeof(cell_t)); + int outbound; + uint64_t start, end; + + crypto_rand((char*)cell->payload, sizeof(cell->payload)); + + /* Mock-up or_circuit_t */ + or_circ->base_.magic = OR_CIRCUIT_MAGIC; + or_circ->base_.purpose = CIRCUIT_PURPOSE_OR; + + /* Initialize crypto */ + char key1[CIPHER_KEY_LEN], key2[CIPHER_KEY_LEN]; + crypto_rand(key1, sizeof(key1)); + crypto_rand(key2, sizeof(key2)); + or_circ->p_crypto = crypto_cipher_new(key1); + or_circ->n_crypto = crypto_cipher_new(key2); + or_circ->p_digest = crypto_digest_new(); + or_circ->n_digest = crypto_digest_new(); + + reset_perftime(); + + for (outbound = 0; outbound <= 1; ++outbound) { + cell_direction_t d = outbound ? CELL_DIRECTION_OUT : CELL_DIRECTION_IN; + start = perftime(); + for (i = 0; i < iters; ++i) { + char recognized = 0; + crypt_path_t *layer_hint = NULL; + relay_crypt(TO_CIRCUIT(or_circ), cell, d, &layer_hint, &recognized); + } + end = perftime(); + printf("%sbound cells: %.2f ns per cell. (%.2f ns per byte of payload)\n", + outbound?"Out":" In", + NANOCOUNT(start,end,iters), + NANOCOUNT(start,end,iters*CELL_PAYLOAD_SIZE)); + } + + crypto_digest_free(or_circ->p_digest); + crypto_digest_free(or_circ->n_digest); + crypto_cipher_free(or_circ->p_crypto); + crypto_cipher_free(or_circ->n_crypto); + tor_free(or_circ); + tor_free(cell); +} + +static void +bench_dh(void) +{ + const int iters = 1<<10; + int i; + uint64_t start, end; + + reset_perftime(); + start = perftime(); + for (i = 0; i < iters; ++i) { + char dh_pubkey_a[DH_BYTES], dh_pubkey_b[DH_BYTES]; + char secret_a[DH_BYTES], secret_b[DH_BYTES]; + ssize_t slen_a, slen_b; + crypto_dh_t *dh_a = crypto_dh_new(DH_TYPE_TLS); + crypto_dh_t *dh_b = crypto_dh_new(DH_TYPE_TLS); + crypto_dh_generate_public(dh_a); + crypto_dh_generate_public(dh_b); + crypto_dh_get_public(dh_a, dh_pubkey_a, sizeof(dh_pubkey_a)); + crypto_dh_get_public(dh_b, dh_pubkey_b, sizeof(dh_pubkey_b)); + slen_a = crypto_dh_compute_secret(LOG_NOTICE, + dh_a, dh_pubkey_b, sizeof(dh_pubkey_b), + secret_a, sizeof(secret_a)); + slen_b = crypto_dh_compute_secret(LOG_NOTICE, + dh_b, dh_pubkey_a, sizeof(dh_pubkey_a), + secret_b, sizeof(secret_b)); + tor_assert(slen_a == slen_b); + tor_assert(fast_memeq(secret_a, secret_b, slen_a)); + crypto_dh_free(dh_a); + crypto_dh_free(dh_b); + } + end = perftime(); + printf("Complete DH handshakes (1024 bit, public and private ops):\n" + " %f millisec each.\n", NANOCOUNT(start, end, iters)/1e6); +} + +static void +bench_ecdh_impl(int nid, const char *name) +{ + const int iters = 1<<10; + int i; + uint64_t start, end; + + reset_perftime(); + start = perftime(); + for (i = 0; i < iters; ++i) { + char secret_a[DH_BYTES], secret_b[DH_BYTES]; + ssize_t slen_a, slen_b; + EC_KEY *dh_a = EC_KEY_new_by_curve_name(nid); + EC_KEY *dh_b = EC_KEY_new_by_curve_name(nid); + if (!dh_a || !dh_b) { + puts("Skipping. (No implementation?)"); + return; + } + + EC_KEY_generate_key(dh_a); + EC_KEY_generate_key(dh_b); + slen_a = ECDH_compute_key(secret_a, DH_BYTES, + EC_KEY_get0_public_key(dh_b), dh_a, + NULL); + slen_b = ECDH_compute_key(secret_b, DH_BYTES, + EC_KEY_get0_public_key(dh_a), dh_b, + NULL); + + tor_assert(slen_a == slen_b); + tor_assert(fast_memeq(secret_a, secret_b, slen_a)); + EC_KEY_free(dh_a); + EC_KEY_free(dh_b); + } + end = perftime(); + printf("Complete ECDH %s handshakes (2 public and 2 private ops):\n" + " %f millisec each.\n", name, NANOCOUNT(start, end, iters)/1e6); +} + +static void +bench_ecdh_p256(void) +{ + bench_ecdh_impl(NID_X9_62_prime256v1, "P-256"); +} + +static void +bench_ecdh_p224(void) +{ + bench_ecdh_impl(NID_secp224r1, "P-224"); +} + +typedef void (*bench_fn)(void); + +typedef struct benchmark_t { + const char *name; + bench_fn fn; + int enabled; +} benchmark_t; + +#define ENT(s) { #s , bench_##s, 0 } + +static struct benchmark_t benchmarks[] = { + ENT(dmap), + ENT(siphash), + ENT(digest), + ENT(aes), + ENT(onion_TAP), + ENT(onion_ntor), + ENT(ed25519), + + ENT(cell_aes), + ENT(cell_ops), + ENT(dh), + ENT(ecdh_p256), + ENT(ecdh_p224), + {NULL,NULL,0} +}; + +static benchmark_t * +find_benchmark(const char *name) +{ + benchmark_t *b; + for (b = benchmarks; b->name; ++b) { + if (!strcmp(name, b->name)) { + return b; + } + } + return NULL; +} + +/** Main entry point for benchmark code: parse the command line, and run + * some benchmarks. */ +int +main(int argc, const char **argv) +{ + int i; + int list=0, n_enabled=0; + char *errmsg; + or_options_t *options; + + tor_threads_init(); + tor_compress_init(); + + if (argc == 4 && !strcmp(argv[1], "diff")) { + init_logging(1); + const int N = 200; + char *f1 = read_file_to_str(argv[2], RFTS_BIN, NULL); + char *f2 = read_file_to_str(argv[3], RFTS_BIN, NULL); + if (! f1 || ! f2) { + perror("X"); + return 1; + } + for (i = 0; i < N; ++i) { + char *diff = consensus_diff_generate(f1, f2); + tor_free(diff); + } + char *diff = consensus_diff_generate(f1, f2); + printf("%s", diff); + tor_free(f1); + tor_free(f2); + tor_free(diff); + return 0; + } + + for (i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "--list")) { + list = 1; + } else { + benchmark_t *benchmark = find_benchmark(argv[i]); + ++n_enabled; + if (benchmark) { + benchmark->enabled = 1; + } else { + printf("No such benchmark as %s\n", argv[i]); + } + } + } + + reset_perftime(); + + if (crypto_seed_rng() < 0) { + printf("Couldn't seed RNG; exiting.\n"); + return 1; + } + crypto_init_siphash_key(); + options = options_new(); + init_logging(1); + options->command = CMD_RUN_UNITTESTS; + options->DataDirectory = tor_strdup(""); + options_init(options); + if (set_options(options, &errmsg) < 0) { + printf("Failed to set initial options: %s\n", errmsg); + tor_free(errmsg); + return 1; + } + + for (benchmark_t *b = benchmarks; b->name; ++b) { + if (b->enabled || n_enabled == 0) { + printf("===== %s =====\n", b->name); + if (!list) + b->fn(); + } + } + + return 0; +} + diff --git a/src/wraith/src/test/bt_test.py b/src/wraith/src/test/bt_test.py new file mode 100644 index 000000000..4cb332604 --- /dev/null +++ b/src/wraith/src/test/bt_test.py @@ -0,0 +1,53 @@ +# Copyright 2013-2017, The Tor Project, Inc +# See LICENSE for licensing information + +""" +bt_test.py + +This file tests the output from test-bt-cl to make sure it's as expected. + +Example usage: + +$ ./src/test/test-bt-cl crash | ./src/test/bt_test.py +OK +$ ./src/test/test-bt-cl assert | ./src/test/bt_test.py +OK + +""" + +from __future__ import print_function +import sys + + +def matches(lines, funcs): + if len(lines) < len(funcs): + return False + try: + for l, f in zip(lines, funcs): + l.index(f) + except ValueError: + return False + else: + return True + +FUNCNAMES = "crash oh_what a_tangled_web we_weave main".split() + +LINES = sys.stdin.readlines() + +for I in range(len(LINES)): + if matches(LINES[I:], FUNCNAMES): + print("OK") + sys.exit(0) + +print("BAD") + +for l in LINES: + print("{}".format(l), end="") + +if sys.platform.startswith('freebsd'): + # See bug #17808 if you know how to fix this. + print("Test failed; but FreeBSD is known to have backtrace problems.\n" + "Treating as 'SKIP'.") + sys.exit(77) + +sys.exit(1) diff --git a/src/wraith/src/test/ed25519_exts_ref.py b/src/wraith/src/test/ed25519_exts_ref.py new file mode 100644 index 000000000..f84d3002d --- /dev/null +++ b/src/wraith/src/test/ed25519_exts_ref.py @@ -0,0 +1,262 @@ +#!/usr/bin/python +# Copyright 2014-2017, The Tor Project, Inc +# See LICENSE for licensing information + +""" + Reference implementations for the ed25519 tweaks that Tor uses. + + Includes self-tester and test vector generator. +""" + +import slow_ed25519 +from slow_ed25519 import * + +import os +import random +import slownacl_curve25519 +import unittest +import binascii +import textwrap + +#define a synonym that doesn't look like 1 +ell = l + +# This replaces expmod above and makes it go a lot faster. +slow_ed25519.expmod = pow + +def curve25519ToEd25519(c, sign): + u = decodeint(c) + y = ((u - 1) * inv(u + 1)) % q + x = xrecover(y) + if x & 1 != sign: x = q-x + return encodepoint([x,y]) + +def blindESK(esk, param): + mult = 2**(b-2) + sum(2**i * bit(param,i) for i in range(3,b-2)) + s = decodeint(esk[:32]) + s_prime = (s * mult) % ell + k = esk[32:] + assert(len(k) == 32) + k_prime = H("Derive temporary signing key hash input" + k)[:32] + return encodeint(s_prime) + k_prime + +def blindPK(pk, param): + mult = 2**(b-2) + sum(2**i * bit(param,i) for i in range(3,b-2)) + P = decodepoint(pk) + return encodepoint(scalarmult(P, mult)) + +def expandSK(sk): + h = H(sk) + a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) + k = ''.join([h[i] for i in range(b/8,b/4)]) + assert len(k) == 32 + return encodeint(a)+k + +def publickeyFromESK(h): + a = decodeint(h[:32]) + A = scalarmult(B,a) + return encodepoint(A) + +def signatureWithESK(m,h,pk): + a = decodeint(h[:32]) + r = Hint(''.join([h[i] for i in range(b/8,b/4)]) + m) + R = scalarmult(B,r) + S = (r + Hint(encodepoint(R) + pk + m) * a) % l + return encodepoint(R) + encodeint(S) + +def newSK(): + return os.urandom(32) + +def random_scalar(entropy_f): # 0..L-1 inclusive + # reduce the bias to a safe level by generating 256 extra bits + oversized = int(binascii.hexlify(entropy_f(32+32)), 16) + return oversized % ell + +# ------------------------------------------------------------ + +MSG = "This is extremely silly. But it is also incredibly serious business!" + +class SelfTest(unittest.TestCase): + + def _testSignatures(self, esk, pk): + sig = signatureWithESK(MSG, esk, pk) + checkvalid(sig, MSG, pk) + bad = False + try: + checkvalid(sig, MSG*2, pk) + bad = True + except Exception: + pass + + self.failIf(bad) + + def testExpand(self): + sk = newSK() + pk = publickey(sk) + esk = expandSK(sk) + sig1 = signature(MSG, sk, pk) + sig2 = signatureWithESK(MSG, esk, pk) + self.assertEquals(sig1, sig2) + + def testSignatures(self): + sk = newSK() + esk = expandSK(sk) + pk = publickeyFromESK(esk) + pk2 = publickey(sk) + self.assertEquals(pk, pk2) + + self._testSignatures(esk, pk) + + def testDerivation(self): + priv = slownacl_curve25519.Private() + pub = priv.get_public() + + ed_pub0 = publickeyFromESK(priv.private) + sign = (ord(ed_pub0[31]) & 255) >> 7 + ed_pub1 = curve25519ToEd25519(pub.public, sign) + + self.assertEquals(ed_pub0, ed_pub1) + + def testBlinding(self): + sk = newSK() + esk = expandSK(sk) + pk = publickeyFromESK(esk) + param = os.urandom(32) + besk = blindESK(esk, param) + bpk = blindPK(pk, param) + bpk2 = publickeyFromESK(besk) + self.assertEquals(bpk, bpk2) + + self._testSignatures(besk, bpk) + + def testIdentity(self): + # Base point: + # B is the unique point (x, 4/5) \in E for which x is positive + By = 4 * inv(5) + Bx = xrecover(By) + B = [Bx % q,By % q] + + # Get identity E by doing: E = l*B, where l is the group order + identity = scalarmult(B, ell) + + # Get identity E by doing: E = l*A, where A is a random point + sk = newSK() + pk = decodepoint(publickey(sk)) + identity2 = scalarmult(pk, ell) + + # Check that identities match + assert(identity == identity2) + # Check that identity is the point (0,1) + assert(identity == [0L,1L]) + + # Check identity element: a*E = E, where a is a random scalar + scalar = random_scalar(os.urandom) + result = scalarmult(identity, scalar) + assert(result == identity == identity2) + +# ------------------------------------------------------------ + +# From pprint.pprint([ binascii.b2a_hex(os.urandom(32)) for _ in xrange(8) ]) +RAND_INPUTS = [ + '26c76712d89d906e6672dafa614c42e5cb1caac8c6568e4d2493087db51f0d36', + 'fba7a5366b5cb98c2667a18783f5cf8f4f8d1a2ce939ad22a6e685edde85128d', + '67e3aa7a14fac8445d15e45e38a523481a69ae35513c9e4143eb1c2196729a0e', + 'd51385942033a76dc17f089a59e6a5a7fe80d9c526ae8ddd8c3a506b99d3d0a6', + '5c8eac469bb3f1b85bc7cd893f52dc42a9ab66f1b02b5ce6a68e9b175d3bb433', + 'eda433d483059b6d1ff8b7cfbd0fe406bfb23722c8f3c8252629284573b61b86', + '4377c40431c30883c5fbd9bc92ae48d1ed8a47b81d13806beac5351739b5533d', + 'c6bbcce615839756aed2cc78b1de13884dd3618f48367a17597a16c1cd7a290b'] + +# From pprint.pprint([ binascii.b2a_hex(os.urandom(32)) for _ in xrange(8) ]) +BLINDING_PARAMS = [ + '54a513898b471d1d448a2f3c55c1de2c0ef718c447b04497eeb999ed32027823', + '831e9b5325b5d31b7ae6197e9c7a7baf2ec361e08248bce055908971047a2347', + 'ac78a1d46faf3bfbbdc5af5f053dc6dc9023ed78236bec1760dadfd0b2603760', + 'f9c84dc0ac31571507993df94da1b3d28684a12ad14e67d0a068aba5c53019fc', + 'b1fe79d1dec9bc108df69f6612c72812755751f21ecc5af99663b30be8b9081f', + '81f1512b63ab5fb5c1711a4ec83d379c420574aedffa8c3368e1c3989a3a0084', + '97f45142597c473a4b0e9a12d64561133ad9e1155fe5a9807fe6af8a93557818', + '3f44f6a5a92cde816635dfc12ade70539871078d2ff097278be2a555c9859cd0'] + +PREFIX = "ED25519_" + +def writeArray(name, array): + print "static const char *{prefix}{name}[] = {{".format( + prefix=PREFIX,name=name) + for a in array: + h = binascii.b2a_hex(a) + if len(h) > 70: + h1 = h[:70] + h2 = h[70:] + print ' "{0}"\n "{1}",'.format(h1,h2) + else: + print ' "{0}",'.format(h) + print "};\n" + +def comment(text, initial="/**"): + print initial + print textwrap.fill(text,initial_indent=" * ",subsequent_indent=" * ") + print " */" + +def makeTestVectors(): + comment("""Test vectors for our ed25519 implementation and related + functions. These were automatically generated by the + ed25519_exts_ref.py script.""", initial="/*") + + + comment("""Secret key seeds used as inputs for the ed25519 test vectors. + Randomly generated. """) + secretKeys = [ binascii.a2b_hex(r) for r in RAND_INPUTS ] + writeArray("SECRET_KEYS", secretKeys) + + comment("""Secret ed25519 keys after expansion from seeds. This is how Tor + represents them internally.""") + expandedSecretKeys = [ expandSK(sk) for sk in secretKeys ] + writeArray("EXPANDED_SECRET_KEYS", expandedSecretKeys) + + comment("""Public keys derived from the above secret keys""") + publicKeys = [ publickey(sk) for sk in secretKeys ] + writeArray("PUBLIC_KEYS", publicKeys) + + comment("""The curve25519 public keys from which the ed25519 keys can be + derived. Used to test our 'derive ed25519 from curve25519' + code.""") + writeArray("CURVE25519_PUBLIC_KEYS", + (slownacl_curve25519.smult_curve25519_base(sk[:32]) + for sk in expandedSecretKeys)) + + comment("""Parameters used for key blinding tests. Randomly generated.""") + blindingParams = [ binascii.a2b_hex(r) for r in BLINDING_PARAMS ] + writeArray("BLINDING_PARAMS", blindingParams) + + comment("""Blinded secret keys for testing key blinding. The nth blinded + key corresponds to the nth secret key blidned with the nth + blinding parameter.""") + writeArray("BLINDED_SECRET_KEYS", + (blindESK(expandSK(sk), bp) + for sk,bp in zip(secretKeys,blindingParams))) + + comment("""Blinded public keys for testing key blinding. The nth blinded + key corresponds to the nth public key blidned with the nth + blinding parameter.""") + writeArray("BLINDED_PUBLIC_KEYS", + (blindPK(pk, bp) for pk,bp in zip(publicKeys,blindingParams))) + + comment("""Signatures of the public keys, made with their corresponding + secret keys.""") + writeArray("SELF_SIGNATURES", + (signature(pk, sk, pk) for pk,sk in zip(publicKeys,secretKeys))) + + + +if __name__ == '__main__': + import sys + if len(sys.argv) == 1 or sys.argv[1] not in ("SelfTest", "MakeVectors"): + print "You should specify one of 'SelfTest' or 'MakeVectors'" + sys.exit(1) + if sys.argv[1] == 'SelfTest': + unittest.main() + else: + makeTestVectors() + + diff --git a/src/wraith/src/test/ed25519_vectors.inc b/src/wraith/src/test/ed25519_vectors.inc new file mode 100644 index 000000000..60c863beb --- /dev/null +++ b/src/wraith/src/test/ed25519_vectors.inc @@ -0,0 +1,150 @@ +/* + * Test vectors for our ed25519 implementation and related + * functions. These were automatically generated by the + * ed25519_exts_ref.py script. + */ +/** + * Secret key seeds used as inputs for the ed25519 test vectors. + * Randomly generated. + */ +static const char *ED25519_SECRET_KEYS[] = { + "26c76712d89d906e6672dafa614c42e5cb1caac8c6568e4d2493087db51f0d36", + "fba7a5366b5cb98c2667a18783f5cf8f4f8d1a2ce939ad22a6e685edde85128d", + "67e3aa7a14fac8445d15e45e38a523481a69ae35513c9e4143eb1c2196729a0e", + "d51385942033a76dc17f089a59e6a5a7fe80d9c526ae8ddd8c3a506b99d3d0a6", + "5c8eac469bb3f1b85bc7cd893f52dc42a9ab66f1b02b5ce6a68e9b175d3bb433", + "eda433d483059b6d1ff8b7cfbd0fe406bfb23722c8f3c8252629284573b61b86", + "4377c40431c30883c5fbd9bc92ae48d1ed8a47b81d13806beac5351739b5533d", + "c6bbcce615839756aed2cc78b1de13884dd3618f48367a17597a16c1cd7a290b", +}; + +/** + * Secret ed25519 keys after expansion from seeds. This is how Tor + * represents them internally. + */ +static const char *ED25519_EXPANDED_SECRET_KEYS[] = { + "c0a4de23cc64392d85aa1da82b3defddbea946d13bb053bf8489fa9296281f495022f1" + "f7ec0dcf52f07d4c7965c4eaed121d5d88d0a8ff546b06116a20e97755", + "18a8a69a06790dac778e882f7e868baacfa12521a5c058f5194f3a729184514a2a656f" + "e7799c3e41f43d756da8d9cd47a061316cfe6147e23ea2f90d1ca45f30", + "58d84f8862d2ecfa30eb491a81c36d05b574310ea69dae18ecb57e992a896656b98218" + "7ee96c15bf4caeeab2d0b0ae4cd0b8d17470fc7efa98bb26428f4ef36d", + "50702d20b3550c6e16033db5ad4fba16436f1ecc7485be6af62b0732ceb5d173c47ccd" + "9d044b6ea99dd99256adcc9c62191be194e7cb1a5b58ddcec85d876a2b", + "7077464c864c2ed5ed21c9916dc3b3ba6256f8b742fec67658d8d233dadc8d5a7a82c3" + "71083cc86892c2c8782dda2a09b6baf016aec51b689183ae59ce932ff2", + "8883c1387a6c86fc0bd7b9f157b4e4cd83f6885bf55e2706d2235d4527a2f05311a359" + "5953282e436df0349e1bb313a19b3ddbf7a7b91ecce8a2c34abadb38b3", + "186791ac8d03a3ac8efed6ac360467edd5a3bed2d02b3be713ddd5be53b3287ee37436" + "e5fd7ac43794394507ad440ecfdf59c4c255f19b768a273109e06d7d8e", + "b003077c1e52a62308eef7950b2d532e1d4a7eea50ad22d8ac11b892851f1c40ffb9c9" + "ff8dcd0c6c233f665a2e176324d92416bfcfcd1f787424c0c667452d86", +}; + +/** + * Public keys derived from the above secret keys + */ +static const char *ED25519_PUBLIC_KEYS[] = { + "c2247870536a192d142d056abefca68d6193158e7c1a59c1654c954eccaff894", + "1519a3b15816a1aafab0b213892026ebf5c0dc232c58b21088d88cb90e9b940d", + "081faa81992e360ea22c06af1aba096e7a73f1c665bc8b3e4e531c46455fd1dd", + "73cfa1189a723aad7966137cbffa35140bb40d7e16eae4c40b79b5f0360dd65a", + "66c1a77104d86461b6f98f73acf3cd229c80624495d2d74d6fda1e940080a96b", + "d21c294db0e64cb2d8976625786ede1d9754186ae8197a64d72f68c792eecc19", + "c4d58b4cf85a348ff3d410dd936fa460c4f18da962c01b1963792b9dcc8a6ea6", + "95126f14d86494020665face03f2d42ee2b312a85bc729903eb17522954a1c4a", +}; + +/** + * The curve25519 public keys from which the ed25519 keys can be + * derived. Used to test our 'derive ed25519 from curve25519' + * code. + */ +static const char *ED25519_CURVE25519_PUBLIC_KEYS[] = { + "17ba77846e04c7ee5ca17cade774ac1884408f9701f439d4df32cbd8736c6a1f", + "022be2124bc1899a78ba2b4167d191af3b59cadf94f0382bc31ce183a117f161", + "bf4fd38ef22f718f03c0a12ba5127bd1e3afd494793753f519728b29cc577571", + "56c493e490261cef31633efd2461d2b896908e90459e4eecde950a895aef681d", + "089675a3e8ff2a7d8b2844a79269c95b7f97a4b8b5ea0cbeec669c6f2dea9b39", + "59e20dcb691c4a345fe86c8a79ac817e5b514d84bbf0512a842a08e43f7f087e", + "9e43b820b320eda35f66f122c155b2bf8e2192c468617b7115bf067d19e08369", + "861f33296cb57f8f01e4a5e8a7e5d5d7043a6247586ab36dea8a1a3c4403ee30", +}; + +/** + * Parameters used for key blinding tests. Randomly generated. + */ +static const char *ED25519_BLINDING_PARAMS[] = { + "54a513898b471d1d448a2f3c55c1de2c0ef718c447b04497eeb999ed32027823", + "831e9b5325b5d31b7ae6197e9c7a7baf2ec361e08248bce055908971047a2347", + "ac78a1d46faf3bfbbdc5af5f053dc6dc9023ed78236bec1760dadfd0b2603760", + "f9c84dc0ac31571507993df94da1b3d28684a12ad14e67d0a068aba5c53019fc", + "b1fe79d1dec9bc108df69f6612c72812755751f21ecc5af99663b30be8b9081f", + "81f1512b63ab5fb5c1711a4ec83d379c420574aedffa8c3368e1c3989a3a0084", + "97f45142597c473a4b0e9a12d64561133ad9e1155fe5a9807fe6af8a93557818", + "3f44f6a5a92cde816635dfc12ade70539871078d2ff097278be2a555c9859cd0", +}; + +/** + * Blinded secret keys for testing key blinding. The nth blinded + * key corresponds to the nth secret key blidned with the nth + * blinding parameter. + */ +static const char *ED25519_BLINDED_SECRET_KEYS[] = { + "293c3acff4e902f6f63ddc5d5caa2a57e771db4f24de65d4c28df3232f47fa01171d43" + "f24e3f53e70ec7ac280044ac77d4942dee5d6807118a59bdf3ee647e89", + "38b88f9f9440358da544504ee152fb475528f7c51c285bd1c68b14ade8e29a07b8ceff" + "20dfcf53eb52b891fc078c934efbf0353af7242e7dc51bb32a093afa29", + "4d03ce16a3f3249846aac9de0a0075061495c3b027248eeee47da4ddbaf9e0049217f5" + "2e92797462bd890fc274672e05c98f2c82970d640084781334aae0f940", + "51d7db01aaa0d937a9fd7c8c7381445a14d8fa61f43347af5460d7cd8fda9904509ece" + "e77082ce088f7c19d5a00e955eeef8df6fa41686abc1030c2d76807733", + "1f76cab834e222bd2546efa7e073425680ab88df186ff41327d3e40770129b00b57b95" + "a440570659a440a3e4771465022a8e67af86bdf2d0990c54e7bb87ff9a", + "c23588c23ee76093419d07b27c6df5922a03ac58f96c53671456a7d1bdbf560ec492fc" + "87d5ec2a1b185ca5a40541fdef0b1e128fd5c2380c888bfa924711bcab", + "3ed249c6932d076e1a2f6916975914b14e8c739da00992358b8f37d3e790650691b476" + "8f8e556d78f4bdcb9a13b6f6066fe81d3134ae965dc48cd0785b3af2b8", + "288cbfd923cb286d48c084555b5bdd06c05e92fb81acdb45271367f57515380e053d9c" + "00c81e1331c06ab50087be8cfc7dc11691b132614474f1aa9c2503cccd", +}; + +/** + * Blinded public keys for testing key blinding. The nth blinded + * key corresponds to the nth public key blidned with the nth + * blinding parameter. + */ +static const char *ED25519_BLINDED_PUBLIC_KEYS[] = { + "1fc1fa4465bd9d4956fdbdc9d3acb3c7019bb8d5606b951c2e1dfe0b42eaeb41", + "1cbbd4a88ce8f165447f159d9f628ada18674158c4f7c5ead44ce8eb0fa6eb7e", + "c5419ad133ffde7e0ac882055d942f582054132b092de377d587435722deb028", + "3e08d0dc291066272e313014bfac4d39ad84aa93c038478a58011f431648105f", + "59381f06acb6bf1389ba305f70874eed3e0f2ab57cdb7bc69ed59a9b8899ff4d", + "2b946a484344eb1c17c89dd8b04196a84f3b7222c876a07a4cece85f676f87d9", + "c6b585129b135f8769df2eba987e76e089e80ba3a2a6729134d3b28008ac098e", + "0eefdc795b59cabbc194c6174e34ba9451e8355108520554ec285acabebb34ac", +}; + +/** + * Signatures of the public keys, made with their corresponding + * secret keys. + */ +static const char *ED25519_SELF_SIGNATURES[] = { + "d23188eac3773a316d46006fa59c095060be8b1a23582a0dd99002a82a0662bd246d84" + "49e172e04c5f46ac0d1404cebe4aabd8a75a1457aa06cae41f3334f104", + "3a785ac1201c97ee5f6f0d99323960d5f264c7825e61aa7cc81262f15bef75eb4fa572" + "3add9b9d45b12311b6d403eb3ac79ff8e4e631fc3cd51e4ad2185b200b", + "cf431fd0416bfbd20c9d95ef9b723e2acddffb33900edc72195dea95965d52d888d30b" + "7b8a677c0bd8ae1417b1e1a0ec6700deadd5d8b54b6689275e04a04509", + "2375380cd72d1a6c642aeddff862be8a5804b916acb72c02d9ed052c1561881aa658a5" + "af856fcd6d43113e42f698cd6687c99efeef7f2ce045824440d26c5d00", + "2385a472f599ca965bbe4d610e391cdeabeba9c336694b0d6249e551458280be122c24" + "41dd9746a81bbfb9cd619364bab0df37ff4ceb7aefd24469c39d3bc508", + "e500cd0b8cfff35442f88008d894f3a2fa26ef7d3a0ca5714ae0d3e2d40caae58ba7cd" + "f69dd126994dad6be536fcda846d89dd8138d1683cc144c8853dce7607", + "d187b9e334b0050154de10bf69b3e4208a584e1a65015ec28b14bcc252cf84b8baa9c9" + "4867daa60f2a82d09ba9652d41e8dde292b624afc8d2c26441b95e3c0e", + "815213640a643d198bd056e02bba74e1c8d2d931643e84497adf3347eb485079c9afe0" + "afce9284cdc084946b561abbb214f1304ca11228ff82702185cf28f60d", +}; + diff --git a/src/wraith/src/test/example_extrainfo.inc b/src/wraith/src/test/example_extrainfo.inc new file mode 100644 index 000000000..0bf2341ef --- /dev/null +++ b/src/wraith/src/test/example_extrainfo.inc @@ -0,0 +1,435 @@ +static const char EX_EI_MINIMAL[] = + "extra-info bob 3E1B2DC141F2B7C6A0F3C4ED9A14A9C35762E24B\n" + "published 2014-10-05 20:07:00\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "K5GAkVjpUlofL78NIOE1VDxFn8yYbHK50rVuZG2HxqG/727bon+uMprv4MHjfDcP\n" + "V3l9u1uUdGiUPOl8j+hRNw4z/ODeCj/24r2+L32MTjyfUhK49Ld2IlK9iZKlgKYi\n" + "zyoatxdAjU8Xc5WPX692HO4/R9CGLsUfYcEEFU2R3EA=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_EI_MINIMAL_FP[] = "3E1B2DC141F2B7C6A0F3C4ED9A14A9C35762E24B"; +static const char EX_EI_MINIMAL_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALSppIF3t3wOAm4fzxRvK+q/wh1gGAWwS0JEn8d+c/x+rt1oQabGkqsB\n" + "GU6rz1z1AN02W0P2+EcyJQVBjGR3gHQNoDGx0KIdnr3caGAw3XmQXrJLPaViEk28\n" + "RJMxx6umpP27YKSyEMHgVTDXblKImT0mE7fVOx8tD0EWRYazmp4NAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static const char EX_EI_MAXIMAL[] = + "extra-info bob FF8248FE780A7236D3FA5D62DEA642055135F942\n" + "published 2014-10-05 20:07:00\n" + "opt foobarbaz\n" + "read-history 900 1,2,3\n" + "write-history 900 1,2,3\n" + "dirreq-v2-ips 1\n" + "dirreq-v3-ips 100\n" + "dirreq-v3-reqs blahblah\n" + "dirreq-v2-share blahblah\n" + "dirreq-v3-share blahblah\n" + "dirreq-v2-resp djfkdj\n" + "dirreq-v3-resp djfkdj\n" + "dirreq-v2-direct-dl djfkdj\n" + "dirreq-v3-direct-dl djfkdj\n" + "dirreq-v2-tunneled-dl djfkdj\n" + "dirreq-v3-tunneled-dl djfkdj\n" + "dirreq-stats-end foobar\n" + "entry-ips jfsdfds\n" + "entry-stats-end ksdflkjfdkf\n" + "cell-stats-end FOO\n" + "cell-processed-cells FOO\n" + "cell-queued-cells FOO\n" + "cell-time-in-queue FOO\n" + "cell-circuits-per-decile FOO\n" + "exit-stats-end FOO\n" + "exit-kibibytes-written FOO\n" + "exit-kibibytes-read FOO\n" + "exit-streams-opened FOO\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "ZO79bLlWVNIruCnWW9duDcOKydPWbL5DfrpUv5IRLF4MMFoacMUdJPDUs9e+wY2C\n" + "zndHe6i2JK7yKJj+uCOSC8cx61OLG+kVxMLJ/qhA4H5thrYb+GpzMKwbHzQc3PTH\n" + "zHRzj041iWXTL7/DMaQlpJOBoac/wTSIKzoV2B00jBw=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_EI_MAXIMAL_FP[] = "FF8248FE780A7236D3FA5D62DEA642055135F942"; +static const char EX_EI_MAXIMAL_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANSpkYhHUW1EqodY4d3JRbvEM1vjjR/vEE8gjONiJ5t2Sten53jzt8bh\n" + "8/VJn7pQGs8zR5CIxCw4P68xMtZJJedS3hhjqubheOE/yW1DtpkiCf+zVEaLpeA8\n" + "fYQChkRICnR/BZd4W9bbohLVII5ym2PaJt2ihB3FeVZIsGXm4wxhAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static const char EX_EI_BAD_SIG1[] = + "extra-info bob 3E1B2DC141F2B7C6A0F3C4ED9A14A9C35762E24B\n" + "published 2014-10-05 20:07:00\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "K5GAkVjpUlofL78NIOE1VDxFn8yYbHK50rVuZG2HxqG/727bon+uMprv4MHjfDcP\n" + "V3l9u1uUdGiUPOl8j+hXXw4z/ODeCj/24r2+L32MTjyfUhK49Ld2IlK9iZKlgKYi\n" + "zyoatxdAjU8Xc5WPX692HO4/R9CGLsUfYcEEFU2R3EA=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_EI_BAD_SIG2[] = + "extra-info bob 3E1B2DC141F2B7C6A0F3C4ED9A14A9C35762E24B\n" + "published 2014-10-06 20:07:00\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "K5GAkVjpUlofL78NIOE1VDxFn8yYbHK50rVuZG2HxqG/727bon+uMprv4MHjfDcP\n" + "V3l9u1uUdGiUPOl8j+hRNw4z/ODeCj/24r2+L32MTjyfUhK49Ld2IlK9iZKlgKYi\n" + "zyoatxdAjU8Xc5WPX692HO4/R9CGLsUfYcEEFU2R3EA=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_EI_BAD_SIG3[] = + "extra-info bob 3E1B2DC141F2B7C6A0F3C4ED9A14A9C35762E24B\n" + "published 2014-10-05 20:07:00\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "K5GAkVjpUlofL78NIOE1VDxFn8yYbHK50rVuZG2HxqG/727bon+uMprv4MHjfDcP\n" + "V3l9u1uUdGiUPOl8j+hRNw4z/ODeCj/24r2+L32MTjyfUhK49Ld2IlK9iZKlgKYi\n" + "zyoatxdAjU8Xc5WPX692HO4/R9CGLsUfYcEEFU2=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_EI_BAD_FP[] = + "extra-info bob C34293303F0F1E42CB14E593717B834E8E53797D8888\n" + "published 2014-10-05 20:07:00\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "IDA8ryUYeMx7+Au/xQmX7Y8fXksoHUOXmePND2JYM4rPfishQJ1LpQ15KrolOZDH\n" + "FVIk3RmCefNlJeS1/UgWPcU8u2nGw1YQuRBHF4ViTmZ0OevI1pTsSApl4+oIx2dy\n" + "DGgCQmKfMbaOixIK8Ioh1Z2NUfMkjbUUE2WWgFTAsac=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_EI_BAD_FP_FP[] = "C34293303F0F1E42CB14E593717B834E8E53797D"; +static const char EX_EI_BAD_FP_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKXMSbif4fG+BW/5lIq5V1tMRondIUfKiNizp0E6EcBw5LvYfQV6zrj8\n" + "HmMFbB/WGf9XGVMxIBzxzeQBRvCQJh+0QH7+ju5/isIHJZsACMILepr6ywmCcjVU\n" + "iYRtC8zGQLqfkf2cNoo7AhcI5i/YzyW2u1zmbPX5J+8sUErfxydbAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static const char EX_EI_BAD_NICKNAME[] = + "extra-info bobhasaverylongnameandidontthinkweshouldlethim A4EA2389A52459B3F7C7121A46012F098BDFC2A4\n" + "published 2014-10-05 20:07:00\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "e2wLJFThRMGawxKrQPuH2XCLek/LJsg4XOB8waAjE0xdHOrzjur9x1jIxy7DVU6t\n" + "z1edbIoL24qucMJvFy2xjSQhFRX4OsyNc0nWr3LfJnTW9aEmxuwXM+mltUD2uFN1\n" + "2vYOIQjUmJwS2yfeSKnhXEl2PWVUmgzYL3r4S5kHco4=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_EI_BAD_NICKNAME_FP[] = "A4EA2389A52459B3F7C7121A46012F098BDFC2A4"; +static const char EX_EI_BAD_NICKNAME_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKfq7oxD1kMu1+zeG2UVXN4vOu6FDp0V/olA3ttmXpUCgCiBxWTgtwNl\n" + "nPf0HcKMaCp/0D9XrbhvIoOsg0OTf1TcJfGsA/zPG7jrWYa4xhD50KYvty9EINK9\n" + "/UBWNSyXCFDMqnddb/LZ8+VgttmxfYkpeRzSSmDijN3RbOvYJhhBAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static const char EX_EI_BAD_TOKENS[] = + "extra-info bob 6F314FB01A31162BD5E473D4977AC570DC5B86BB\n" + "published 2014-10-05 20:07:00\n" + "published 2014-10-05 20:07:00\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "lhRIafrkKoQmnUoBLiq4XC8XKXrleGJZ5vefkLcgjOJ5IffsvVdIA7Vqq/ISbPrG\n" + "b/Zs0sJNL6naHPxJBglgHJqksSyiYHaeOetXg2Rb+vZ1v2S5BrVgk1nPMDhyIzqc\n" + "zU7eCxFf/1sXKtWlEKxGdX4LmVfnIln5aI31Bc4xRrE=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_EI_BAD_TOKENS_FP[] = + "6F314FB01A31162BD5E473D4977AC570DC5B86BB"; +static const char EX_EI_BAD_TOKENS_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAL7Z8tz45Tb4tnEFS2sAyjubBV/giSfZdmXRkDV8Jo4xqWqhWFJn7+zN\n" + "AXBWBThGeVH2WXrpz5seNJXgZJPxMTMsrnSCGcRXZw0Npti2MkLuQ6+prZa+OPwE\n" + "OyC6jivtAaY/o9iYQjDC2avLXD3N4LvoygyF418KnNcjbzuFygffAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static const char EX_EI_BAD_START[] = + "published 2014-10-05 20:07:00\n" + "extra-info bob 5CCCACE71A9BDB5E8E0C942AB3407452350434C0\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "BOiWgexqCAMZ8uyJ7jwBwRkz7Ox8cT4BImkmkV3bQiZgcWvPiYA3EnCm2ye48Ldg\n" + "zBST2p6zJM5o4MEDYGMxfViS86Abj/z7DOY1gtLhjmAaVjIIpXc3koxEZtzCecqy\n" + "JQz6xEg9/KoEuoT0DRrfYQ+KtQfzBDWrotfOvEa1rvc=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_EI_BAD_START_FP[] = "5CCCACE71A9BDB5E8E0C942AB3407452350434C0"; +static const char EX_EI_BAD_START_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAK2OCIfM6Cin/lq99Z3w9tl6HeyGlkBZu9MQEPHxqGIHTq78lIC1UkrC\n" + "6NTqlrHBV9dmfzdwJn4GgMWsCZafL0FPIH3HNyNKUxLgyjixyKljHx2rfErSfOxI\n" + "bMoOGBKv7m1EZZ0O5uG9ly9MBiNGdJyLdlnVvH7wSCnYciizpO4lAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static const char EX_EI_BAD_PUBLISHED[] = + "extra-info bob E67C477E3536BDE348BD407426D9679E5AE0BC16\n" + "published 2014-99-05 20:07:00\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "l45IziBaXRKIjPAIUogMFNjQgH6k6Vm0+6r5+oByr4sP+B3ufNdUA6+WqBs43F0Z\n" + "IqcJiT9nFn0DuNd/liOyOCixppDLx5h5NrhoGqcT3ySADEEXhzjlmc35TI3YBNVO\n" + "v98fotmwIEg9YRWVGPg6XuIn2PRyiboFyjUpaYGCV0Q=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_EI_BAD_PUBLISHED_FP[] = "E67C477E3536BDE348BD407426D9679E5AE0BC16"; +static const char EX_EI_BAD_PUBLISHED_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAL7q8GEI18iv8Fo0QbNHmFatQ2FNacalPldpmKUdMJYEVZtdOR0nhcrY\n" + "BvG6303md3INygg+KP49RvWEJR/cU4RZ9QfHpORxH2OocMyRedw2rLex2E7jNNSi\n" + "52yd1sHFYI8ZQ4aff+ZHUjJUGKRyqpbc8okVbq/Rl7vug0dd12eHAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static const char EX_EI_GOOD_ED_EI[] = + "extra-info emma A692FE045C32B5E3A54B52882EF678A9DAC46A73\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AYgHn/OKR8GHBlscN5VkO73wA9jSci8QgTM30615ZT44AQAgBAC08woT\n" + "MBZpKzRcaoEJhEG7+RmuYtnB2+nODk9IRIs8ZoyYPTZ6dLzI+MLMmtzUuo/Wmvw0\n" + "PflTyCb2RlWitOEhAErWH3Z9UmYGnzM/COId0Fe3ScSriyvRoFnJY1+GVAQ=\n" + "-----END ED25519 CERT-----\n" + "published 2014-10-05 20:07:00\n" + "router-sig-ed25519 a7K8nwfg+HrdlSGQwr9rnLBq0qozkyZZs6d6aiLEiXGdhV1r9KJncmlQ5SNoY/zMQlyQm8EV5rCyBiVliKQ1Bw\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "GvmCmIGgbC1DeawRyRuChy62VmBOG0EviryG/a2qSZiFy0iPPwqSp5ZyZDQEIEId\n" + "kkk1zPzK1+S3fmgOAXyXGH0r4YFkoLGnhMk07BoEwi6HEXzjJsabmcNkOHfaOWgs\n" + "/5nvnLfcmxL4c6FstZ7t9VQpE06y3GU0zwBeIy1qjp0=\n" + "-----END SIGNATURE-----\n" + "\n" + "\n" + ; +static const char EX_EI_GOOD_ED_EI_FP[] = + "A692FE045C32B5E3A54B52882EF678A9DAC46A73"; +static const char EX_EI_GOOD_ED_EI_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAM3jdYwjwGxDWYj/vyFkQT7RgeCNIn89Ei6D2+L/fdtFnqrMXOreFFHL\n" + "C7CK2v2uN3v+uXxfb5lADz3NcalxJrCfGTGtaBk7PwMZraTSh2luFKOvSRBQCmB1\n" + "yD5N0QqnIhBJoGr6NITpbWyiTKWvYLjl9PZd9af8e8jQCAa5P1j1AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + ; + +static const char EX_EI_ED_MISSING_SIG[] = + "extra-info rachel 2A7521497B91A8437021515308A47491164EDBA1\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AT2/T71LFYHiI1ppwNiuaewIu2Hq+GWWQ85O8gpWcUxeAQAgBAC2dgYu\n" + "moxhtuip7GVlthT9iomZKba1IllVa7uE1u2uO9BUYZQWXciFt7OnNzMH5mlffwxB\n" + "1dWCl+G5nbOsV5jYLbfhrF5afZotf+EQTfob4cCH79AV223LPcySbTHTtQ4=\n" + "-----END ED25519 CERT-----\n" + "published 2014-10-05 20:07:00\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "oypRD2IZQ5EttOE8dvofrW80nnBfijSkvYzBrM6H4KVeayRYvWfmi96dYO6ybMqm\n" + "Yp7Gs3ngqeeNdfHtkRPuQVUXUGYZgBTvYItuagnFlFgRqaHy0knwUIVOL35eqWYx\n" + "xSbQKA7fglxEDMFs/RK7FRP4dWc731ZMt5wzzfJHZ8E=\n" + "-----END SIGNATURE-----\n" + "\n" + "\n" + ; +static const char EX_EI_ED_MISSING_SIG_FP[] = + "2A7521497B91A8437021515308A47491164EDBA1"; +static const char EX_EI_ED_MISSING_SIG_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAOOB8ccxbtk2dB5FuKFhGndDcO6STNjB6KiG0b9X2QwKrOZMfmXSigto\n" + "mtC1JfPTxECayRjLSiP/9UD8iTVvlcnc8mMWBGM12Pa/KoCZRn7McHI3JJ7n9lfn\n" + "qw9+iZ9b/rBimzOb3W6k3uxzg9r8secdq4jJwTnwSjTObgxZtC8/AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + ; + +static const char EX_EI_ED_MISSING_CERT[] = + "extra-info lynne E88E43E86015345A323D93D825C33E4AD1028F65\n" + "published 2014-10-05 20:07:00\n" + "router-sig-ed25519 H4gKIKm5K9Pfkriy7SlMUD6BdYVp6B5mXKzR/rTyYlpH0tEZ4Fx2hlHNfNNdWXJieXzKZQZo8e7SOVzvrAC3CQ\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "dIrbQjK5T9t5KM8CpsMF85hh2i060oPIxzYQMgE1q4j99dtb/n7SE8nhj1Sjij4D\n" + "7JvTjGdLHi3bFSxXaSmla0wxD9PUYFN7VsBQmwSaDrqrzJFb1SGwZuzW1IEZ7BBi\n" + "H0czsxEteg5hcNRwISj5WVthuWmau9v13MijtZGSK40=\n" + "-----END SIGNATURE-----\n" + "\n" + "\n" + "\n" + ; +static const char EX_EI_ED_MISSING_CERT_FP[] = + "E88E43E86015345A323D93D825C33E4AD1028F65"; +static const char EX_EI_ED_MISSING_CERT_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALjA/geb0TR9rp/UPvLhABQpB0XUDYuZAnLkrv+i7AAV7FemTDveEGnc\n" + "XdXNSusO1mHOquvr0YYKPhwauInxD56S8QOzLYiWWajGq8XHARQ33b4/9K2TUrAx\n" + "W9HTHV1U1zrPlCJtrkbjxsYoHpUg5ljzM7FGYGY5xuvyHu18SQvzAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + ; +static const char EX_EI_ED_BAD_CERT1[] = + "extra-info marcie F78D8A655607D32281D02144817A4F1D26AE520F\n" + "identity-ed25519\n" + "-----BEGIN PLAGICAL SPELL-----\n" + "aaaa\n" + "-----END PLAGICAL SPELL\n" + "published 2014-10-05 20:07:00\n" + "router-sig-ed25519 KQJ+2AH7EkkjrD0RtDtUAIr+Vc7wndwILYnoUxFLSJiTP+5fMi54eFF/f1OgkG8gYyTh8phMij9WOxK/dsOpBg\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "XWD+P25AH6moi79j20Si3hqKGcJDws+FORL1MTu+GeJLV1mp5CR9N83UH4ffulcL\n" + "CpSSBDL/j74HqapzW7QvBx3FilaNT55GvcobZDFK4TKkCEyEmcuWKpEceBS7JTTV\n" + "SvwZeOObTjWPafELbsc/gI9Rh5Idwu7mZt3ZVntCGaQ=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_EI_ED_BAD_CERT1_FP[] = + "F78D8A655607D32281D02144817A4F1D26AE520F"; +static const char EX_EI_ED_BAD_CERT1_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMlR46JhxsCmWYtmIB/JjTV2TUYIhJLmHy+X7FfkK3ZVQvvl9/3GSXFL\n" + "3USfyf3j34XLh8An7pJBi9LAHkIXgnRbglCud7dXoexabmC+c2mSbw5RnuxDGEwz\n" + "krXUph/r2b+2UY1CgEt28nFigaHrIQbCmF4szFX/2GPYCLi5SrRNAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + ; +static const char EX_EI_ED_BAD_CERT2[] = + "extra-info jaeger 7C2B42E783C4E0EB0CC3BDB37385D16737BACFBD\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55Acpw27GZBdwGCgawCj2F/DPadt8F/9DnEWywEew1Yi3qAOtLpCB8KXL7\n" + "4w5deFW2RBg8qTondNSUvAmwYLbLjNXMmgA3+nkoJOP3fcmQMHz1jm5xzgs2lCVP\n" + "t5txApaBIA4=\n" + "-----END ED25519 CERT-----\n" + "published 2014-10-05 20:07:00\n" + "router-sig-ed25519 DRQ4MLOGosBbW8M+17klNu8uWVkPxErmmEYoSo6OuH2Tzrcs6sUY+8Xi2qLoV1SbOugJ214Htl0I+6ceag+vBA\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "DfdA+DbuN9nVJNujuSY5wNCDLk7Hfzkrde/sK0hVmZRvivtpF/Fy/dVQHHGNFY5i\n" + "L1cESAgq9HLdbHU+hcc08XXxTIaGwvoklcJClcG3ENVBWkTXbJNT+ifr7chEagIi\n" + "cVrtU6RVmzldSbyir8V/Z4S/Cm67gYAgjM5gfoFUqDs=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_EI_ED_BAD_CERT2_FP[] = + "7C2B42E783C4E0EB0CC3BDB37385D16737BACFBD"; +static const char EX_EI_ED_BAD_CERT2_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALAM1F/0XJEsbxIQqb3+ObX/yGVnq9of8Q9sLsmxffD6hwVpCqnV3lTg\n" + "iC6+xZ/bSlTGLPi0k8QLCaTmYxgKwmlMPpbQZ4kpZUrsb9flKdChMN7w8hd48pY9\n" + "lu8QiAEgErsl5rCCJIHHjrxxM/Cnd0TnedRnj/Z2YqpNx/ggsmsRAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + ; +static const char EX_EI_ED_BAD_SIG1[] = + "extra-info vary 5AC3A538FEEFC6F9FCC5FA0CE64704396C30D62A\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AbPp++GrRb6WphSu+PkMaYsqY/beiLBmtiV3YP5i2JkKAQAgBABKXjg1\n" + "aiz2JfQpNOG308i2EojnUAZEk0C0x9g2BAAXGL63sv3eO/qrlytsG1x2hkcamxFn\n" + "LmfZBb/prqe1Vy4wABuhqWHAUtM29vXR6lpiCJeddt9Pa8XVy/tgWLX6TAw=\n" + "-----END ED25519 CERT-----\n" + "published 2014-10-05 20:07:00\n" + "router-sig-ed25519 a7K8nwfg+HrdlSGQwr9rnLBq0qozkyZZs6d6aiLEiXGdhV1r9KJncmlQ5SNoY/zMQlyQm8EV5rCyBiVliKQ1Bw\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "xhZX8Qmgft51NJ7eMd4vrESzf/VdxDrBz7hgn8K+5bLtZUksG0s6s7IyGRYWQtp4\n" + "/7oc9sYe3lcQiUN2K7DkeBDlL8Pcsl8aIlKuujWomCE3j0TIu+8XK6oJeo7eYic+\n" + "IA7EwVbdZsKsW5/eJVzbX2eO0a5zyJ5RIYotFNYNCSE=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_EI_ED_BAD_SIG1_FP[] = + "5AC3A538FEEFC6F9FCC5FA0CE64704396C30D62A"; +static const char EX_EI_ED_BAD_SIG1_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMvb6SuoIkPfBkJgQuo5aQDepAs1kEETZ9VXotMlhB0JJikrqBrAAz+7\n" + "rjIJ4JsBaeQuN0Z5ksXk2ebxtef7oMIUs37NfekLQHbNR0VsXkFXPEGmOAqpZjW0\n" + "P524eHqybWYZTckvZtUvKI3xYGD6kEEkz4qmV6dcExU1OiAYO9jrAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + ; +static const char EX_EI_ED_BAD_SIG2[] = + "extra-info coward 7F1D4DD477E340C6D6B389FAC26EDC746113082F\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf56AZkSDiFZ1QaiLJhcKdFDE5Kei/sPaPEIEoPMGP4BvOVXAQAgBAAlRLzx\n" + "U029tgIL9BRe47MVgcPJGy48db6ntzhjil7iOnWKT70z2LorUD5CZoLJs72TjB6r\n" + "8+HYNyFLEM6dvytWZf9NA5gLdhogbFcUk/R3gbNepmCF7XoZjbhPIp8zOwg=\n" + "-----END ED25519 CERT-----\n" + "published 2014-10-05 20:07:00\n" + "router-sig-ed25519 yfV+GySMIP1fw1oVa1C1de4XOWBqT4pUtEmSHq1h+WrLBNCh3/HZWvNC/denf2YVntuQrMLCJEv5ZaFKU+AIDQ\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "g+BWq69i9CP19va2cYMAXCQ6jK3IG0VmNYspjjUFgmFpJKGG6bHeOkuy1GXp47fG\n" + "LzZ3OPfJLptxU5AOQDUUYf25hu9uSl6gyknCzsszFs5n6ticuNejvcpzw6UfO1LP\n" + "5u+mGJlgpcMtmSraImDZrRipmZ3oRWvEULltlvzGQcQ=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_EI_ED_BAD_SIG2_FP[] = + "7F1D4DD477E340C6D6B389FAC26EDC746113082F"; +static const char EX_EI_ED_BAD_SIG2_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALzOyfCEUZnvCyhlyMctPkdXg/XRE3Cr6QgyzdKf5kQbUiu2n0FgSHOX\n" + "iP5gfq8sO9eVeTPZtjE7/+KiR8aQJECy+eoye+lpsfm3tXpLxnpOIgL4DlURxlo/\n" + "rfCyv30SYBN9j62qgU9m6U2ydI0tH7/9Ep8yIY/QL8me8VAjLbf/AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + ; + +static const char EX_EI_ED_MISPLACED_CERT[] = + "extra-info msselene 3B788BD0CE348BC5CED48313307C78175EB6D0F3\n" + "published 2014-10-05 20:07:00\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AWBcqjzLESDuLNGsqQ/tHn32XueXwj2fDlgEy/kQNVf/AQAgBAAFOegg\n" + "XY1LR82xE9ohAYJxYpwJJw0YfXsBhGHqfakEoBtSgFJ3cQAUXZQX4lX6G8IxAlQB\n" + "7Rj7dPQuQRUmqD1yyKb/ScBgCa8esxlhNlATz47kRNR38A3TcoJ4c1Zv6AE=\n" + "-----END ED25519 CERT-----\n" + "router-sig-ed25519 Q52JKH9/iMsr1jIPlWHHxakSBvyqjT1gzL944vad4OhzCZuNuAYGWyWSGzTb1DVmBqqbAUq73TiZKAz77YLNCQ\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "YplvAIwExGf5/L8AoroVQXtGm+26EffrxKBArMKn0zS1NOOie1p0oF/+qJg+rNWU\n" + "6cv3Anf188EXGlkUOddavgVH8CQbvve2nHSfIAPxjgEX9QNXbM5CiaMwgpCewXnF\n" + "UoNBVo5tydeLHVns15MBg/JNIxUQMd6svMoPp2WqmaE=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_EI_ED_MISPLACED_CERT_FP[] = + "3B788BD0CE348BC5CED48313307C78175EB6D0F3"; +static const char EX_EI_ED_MISPLACED_CERT_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALTwNqhTprg1oC6bEbDqwIYBoER6prqUXQFbwbFDn+ekXhZj8vltgGwp\n" + "aDGl9ceZWDKfi+reR6rZXjAJGctmv0VHkfe7maUX4FC/d2T8N8DvS+3IvJzFMpbT\n" + "O0fFrDTrCSnPikqFfQWnlP8yoF5vO7wo0jRRY432fLRXg9WqVzdrAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + ; +static const char EX_EI_ED_MISPLACED_SIG[] = + "extra-info grazie 384E40A5DEED4AB1D8A74F1FCBDB18B7C24A8284\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AcGuIBoa6TBqD8Gg5atcwp/+r9ThxIBkULmPv9OSGhv+AQAgBACXH13y\n" + "mUvdpcN6oRN1nX6mnH40LyfYR5um8xogJZk3oINse5cRNrfMgVWiBpDlJZAwlDDa\n" + "lx99hzuZBong+CiOcnEvLMsBaVJmNTm5mpdetYclZpl0g8QEXznXXeRBMgM=\n" + "-----END ED25519 CERT-----\n" + "router-sig-ed25519 TxuO86dQ3pUaIY2raQ3hoDBmh4TTPC0OVgY98T5cf6Y+sHyiELCkkKQ3lqqXCjqnbTLr1/4riH980JoWPpR+Dw\n" + "published 2014-10-05 20:07:00\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "kV2CtArl1VF1nUSyHL00mO3nEdNxlQU5N7/hZNTd+45lej5Veb+6vb4ujelsFERJ\n" + "YoxwIs6SuKAR4orQytCL0e+GgZsrg8zGTveEtMX/+u//OcCwQBYEevR5duBZjVw/\n" + "yzpEHwdIdB2PPyDBLkf1VKnP7uDj059tXiQRWl7LXgE=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_EI_ED_MISPLACED_SIG_FP[] = + "384E40A5DEED4AB1D8A74F1FCBDB18B7C24A8284"; +static const char EX_EI_ED_MISPLACED_SIG_KEY[] = + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAK0HgOCG/6433VCrwz/vhk3cKmyOfenCp0GZ4DIUwPWt4DeyP4nTbN6T\n" + "1HJ1H8+hXC9bMuI4m43IWrzgLycQ9UaskUn372ZjHP9InPqHMJU6GQ7vZUe9Tgza\n" + "qnBdRPoxnrZzUOzlvatGrePt0hDiOZaMtDAkeEojFp9Wp2ZN7+tZAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + ; + diff --git a/src/wraith/src/test/failing_routerdescs.inc b/src/wraith/src/test/failing_routerdescs.inc new file mode 100644 index 000000000..e2b72c58a --- /dev/null +++ b/src/wraith/src/test/failing_routerdescs.inc @@ -0,0 +1,1569 @@ +/* This one actually succeeds */ +static const char EX_RI_MINIMAL[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAObzT4opT9uaThByupbb96tYxVpGxzL9CRPKUcU0beGpHyognD9USHWc\n" + "SpSpKfBL5P3xr2i/XTs34M4UTbT9PE7bVyxv7RD/BZmI4gc8R3PMU77xxbpEU5bK\n" + "LF3QUPpuB88m/2fXUGgMNVDc5MIq6pod2NRoDpeU7WA8T3ewXzK5AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAM1QKsQiup9DNMCgNeE2FkAhCWzpMZKCn1nNlZbDGfE3Z22ex6bdWWY6\n" + "ocEZ3JZDsZsnaZrdYxrL3Mquq7MbHdfx90EdlOvDRP1SAIbZ55mLR77fZTu4BKd/\n" + "h9BC6I26uZE0QavFq3+BhoVVhVn5Mqv05nR9CeUMSSZLxw/RJm4DAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Ft/y3JXowjItgfTHwYcZzuUgXrskluoINW5sr+GQoNYE2F4sT8o0tBBJwqJ6FwKd\n" + "fkIprv9UXqkv5iY+pXSYSI12mY1K5GMNkXiObk46NjuoNNP9l8oidhO6eNfcE+k3\n" + "CRIYS4FbBaD0fWUSwgMuo0Bp83/Wzp3B9ytEBh0/624=\n" + "-----END SIGNATURE-----\n"; + +/* So does this, and it's bigger. */ +static const char EX_RI_MAXIMAL[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANNI56H+b7SW5LMzvXyY5NJzXszsHZZ4O1CPm4CePhBsAz1r0s1JYJ1F\n" + "Anrc0mEcLtmj0c5+HnhPBNrfpjO6G94Wp3NZMVykHDhfNVDBRyFZMroG8/GlysYB\n" + "MQPGQYR0xBgiuclNHoyk/vygQhZekumamu2O86EIPcfg9LhGIgEbAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALvuNVSmg6R9USFbQcNbRjMCJAV0Rwdv0DlS6Rl02ibJgb01G7v391xE\n" + "d9Njzgf93n8gOrE195bkUbvS6k/DM3HFGgArq6q9AZ2LTbu3KbAYy1YPsSIh07kB\n" + "/8kkvRRGx37X9WGZU3j5VUEuzqI//xDE9lbanlnnFXpnb6ymehDJAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject 127.0.0.1:*\n" + "accept *:80\n" + "reject *:*\n" + "ipv6-policy accept 80,100,101\n" + "ntor-onion-key s7rSohmz9SXn8WWh1EefTHIsWePthsEntQi0WL+ScVw\n" + "uptime 1000\n" + "hibernating 0\n" + "unrecognized-keywords are just dandy in this format\n" + "platform Tor 0.2.4.23 on a Banana PC Jr 6000 Series\n" + "contact O.W.Jones\n" + "fingerprint CC43 DC8E 8C9E 3E6D 59CD 0399 2491 0C8C E1E4 50D2\n" + "read-history 900 1,2,3,4\n" + "write-history 900 1,2,3,4\n" + "extra-info-digest AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" + "hidden-service-dir\n" + "allow-single-hop-exits\n" + "family $AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA $BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" + "caches-extra-info\n" + "or-address [::1:2:3:4]:9999\n" + "or-address 127.0.0.99:10000\n" + "opt fred is a fine router\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "x5cxL2h2UsEKk2OVnCTxOF8a89HAe/HwQnSlrBy8+l0YdVCcePDJhm1WyWU7ToHZ\n" + "K8auwreuw+u/n14sQHPYrM9NQE689hP4LC9AYOnrCnMHysfVqKuou+DSKYYRgs0D\n" + "ySCmJ9p+xekfmms+JBmS5o5DVo48VGlG0VksegoB264=\n" + "-----END SIGNATURE-----\n" + ; + +/* I've messed with 12 bits of the signature on this one */ +static const char EX_RI_BAD_SIG1[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAObzT4opT9uaThByupbb96tYxVpGxzL9CRPKUcU0beGpHyognD9USHWc\n" + "SpSpKfBL5P3xr2i/XTs34M4UTbT9PE7bVyxv7RD/BZmI4gc8R3PMU77xxbpEU5bK\n" + "LF3QUPpuB88m/2fXUGgMNVDc5MIq6pod2NRoDpeU7WA8T3ewXzK5AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAM1QKsQiup9DNMCgNeE2FkAhCWzpMZKCn1nNlZbDGfE3Z22ex6bdWWY6\n" + "ocEZ3JZDsZsnaZrdYxrL3Mquq7MbHdfx90EdlOvDRP1SAIbZ55mLR77fZTu4BKd/\n" + "h9BC6I26uZE0QavFq3+BhoVVhVn5Mqv05nR9CeUMSSZLxw/RJm4DAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Ft/y3JXowjItgfTHwYcZzuUgXrskluoINW5sr+GQoNYE2F4sT8o0tBBJwqJ6FwKd\n" + "fkIprv9UXqkv5iY+pXSYXX12mY1K5GMNkXiObk46NjuoNNP9l8oidhO6eNfcE+k3\n" + "CRIYS4FbBaD0fWUSwgMuo0Bp83/Wzp3B9ytEBh0/624=\n" + "-----END SIGNATURE-----\n"; + +/* This is a good signature of the wrong data: I changed 'published' */ +static const char EX_RI_BAD_SIG2[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAObzT4opT9uaThByupbb96tYxVpGxzL9CRPKUcU0beGpHyognD9USHWc\n" + "SpSpKfBL5P3xr2i/XTs34M4UTbT9PE7bVyxv7RD/BZmI4gc8R3PMU77xxbpEU5bK\n" + "LF3QUPpuB88m/2fXUGgMNVDc5MIq6pod2NRoDpeU7WA8T3ewXzK5AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAM1QKsQiup9DNMCgNeE2FkAhCWzpMZKCn1nNlZbDGfE3Z22ex6bdWWY6\n" + "ocEZ3JZDsZsnaZrdYxrL3Mquq7MbHdfx90EdlOvDRP1SAIbZ55mLR77fZTu4BKd/\n" + "h9BC6I26uZE0QavFq3+BhoVVhVn5Mqv05nR9CeUMSSZLxw/RJm4DAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:01\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Ft/y3JXowjItgfTHwYcZzuUgXrskluoINW5sr+GQoNYE2F4sT8o0tBBJwqJ6FwKd\n" + "fkIprv9UXqkv5iY+pXSYSI12mY1K5GMNkXiObk46NjuoNNP9l8oidhO6eNfcE+k3\n" + "CRIYS4FbBaD0fWUSwgMuo0Bp83/Wzp3B9ytEBh0/624=\n" + "-----END SIGNATURE-----\n"; + +/* This one will fail while tokenizing the first line. */ +static const char EX_RI_BAD_TOKENS[] = + "router bob\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANGCgvZc+JRtAzuzk3gBD2rH9SHrXzjJ1wqdU3tLKr7FamKCMI2pLwSA\n" + "FZUpTuSqB9wJ/iVcYws+/kA3FjLqgPtzJFI0SVLvQcz5oIC1rEWpuP6t88duMlO9\n" + "flOUzmYu29sBffrXkQr8pesYvakyXArOJVeRR7fSvouneV5aDYWrAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAML+pYZoYc+whKLijupd63xn0gzlEQqe7k07x/lWMqWFT37FfG6YeNr5\n" + "fpFoo77FDfuFaL+VfPfI8i88g157hcPKBVX6OyRH54+l5By0tN91S0H+abXjXQpv\n" + "U/Bvmul+5QpUeVJa1nPg71HRIauoDnBNexUQ7Xf/Bwb2xCt+IJ6DAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "tbxtYYzyVqi6w6jz1k8NPjFvZaSNR0WzixVTTvKKGoMPx/6+Z8QAFK1ILzRUVucB\n" + "nRhmZMFaPr3vREMErLRE47ODAzwoBCE9C+vYFvROhgfzuQ3cYXla+4sMaRXYZzjH\n" + "PQ82bTwvSbHsR8fTTgePD/Ac082WxXTGpx6HOLBfNsQ=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_RI_BAD_PUBLISHED[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMoipSwZgTG6SpSOm6ENbyALS1Ljqqa1LSGmtHSRfGYgUQGWZXERXKQj\n" + "P5ql6o7EbGr1wnispGW/KB8Age09jGDvd/oGhQ9TDFluhLZon3obkZSFw7f9iA7Q\n" + "s29rNxoeXXLZVyS7+sux70b8x2Dt4CeG8GA8nQLljy1euwU+qYYJAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAPzfzQ+2WFMUvnB3z0xD+zwczWcFyYYNW8Lj7/aRGSNN2DICp5uzSjKq\n" + "qkYQ+C8jG21+MR2PE+ZBmq6CL5mvlFKlWKouXUlN7BejwWf2gw0UYag0SYctae1b\n" + "bu8NuUEvdeGWg5Odgs+abH7U9S0hEtjKrmE5vvJS5L841IcaPLCFAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 99:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "G92pnwCIXGJ9Q0fI9y4m/fHpWCsD0Hnk81/6T4TmRH3jt77fc0uRdomUOC5id4kz\n" + "J2M4vqXwRs5OK+eaPbtxf8Yv6FPmB3OBNCIhwNHIIqzKQStHUhPxD3P6j8uJFwot\n" + "/CNGciDN+owZ2DzwrXpszDfzcyp/nmwhApbi3W601vY=\n" + "-----END SIGNATURE-----\n" + ; + +/* Bandwidth field isn't an integer. */ +static const char EX_RI_BAD_BANDWIDTH[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAN32LAvXQaq0p554FcL4LVwnxyiZvscfuFnfpXwWTDRJJHd2+JCttWIx\n" + "v+eW7dNq+rq/tzSzaZwnp8b4V2skLRojSt6UUHD234eZcsPwUNhSr0y1eMuoZbnV\n" + "UBBPevpuXea85aSFEXXRlIpQfvFc43y3/UFoRzo5iMPqReo2uQ4BAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMBuF1GvOyVcRDNjzlEmGHJkTA7qkaWgTp33NSY/DPEJoahg0Qswuh2w\n" + "1YCBqem6Txp+/Vl9hoUoUGwb7Vwq0+YDMSyr0z3Ih2NcNjOMZPVtjJuv+3wXrQC8\n" + "LPpCpfU9m9QvhQ7f9zprEqUHOQTT0v5j2a5bpfd++6LFxrMUNwbfAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth hello world today\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "svABTGDNJOgaiPLqDlkRU6ldYJcoEe2qHlr4O30lVM2hS3Gg6o4QARL7QRt7VepT\n" + "SruR6pE83xOr7/5Ijq5PlamS4WtODMJSH3DXT2hM5dYYrEX5jsJNZTQ+cYwPQI3y\n" + "ykuvQIutH6ipz5MYc9n0GWAzDjLq1G8wlcEfFXQLD10=\n" + "-----END SIGNATURE-----\n" + ; + +/* Onion key is actually a signature. */ +static const char EX_RI_BAD_ONIONKEY1[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANByIdFOKA3r2nnWyLjdZE8oGHqJE62T1zjW/nsCzCJQ8/kBMRYeGDu4\n" + "SeUJJ2rsh2t3PNzkqJM14f4DKmc2q76STsOW0Zcj70Bjhxb9r/OfyELVsi+x3CsE\n" + "Zo/W4JtdlVFjqevhODJdyFNLKOvqwG7sZo/K++Hx01Iu0zXLeg8nAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "svABTGDNJOgaiPLqDlkRU6ldYJcoEe2qHlr4O30lVM2hS3Gg6o4QARL7QRt7VepT\n" + "SruR6pE83xOr7/5Ijq5PlamS4WtODMJSH3DXT2hM5dYYrEX5jsJNZTQ+cYwPQI3y\n" + "ykuvQIutH6ipz5MYc9n0GWAzDjLq1G8wlcEfFXQLD10=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Cc/Y22KFvxXPXZtjvGIyQdjm4EMhXVXJEBwt8PvK7qlO1AgiVjEBPkUrTQQ/paLQ\n" + "lmeCN6jEVcZ8lNiVZgzRQ/2mTO3xLBPj26UNSDuouUwZ01tZ4wPENylNYnLKv5hg\n" + "gYARg/nXEJiTVe9LHl99Hr9EWWruRG2wFQjjTILaWzI=\n" + "-----END SIGNATURE-----\n" + ; + +/* Onion key has exponent 3 */ +static const char EX_RI_BAD_ONIONKEY2[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKP1kWHsH/BZhNSZmn0FyzIrAHtMl1IVPzc7ABbx+kK+IIEMD9k1fy2h\n" + "AP2JTm2UmJDUwutVxPsxmndI+9QsRDpu33E5Ai4U1Rb6Qu+2BRj43YAyg414caIu\n" + "J5LLn6bOzt7gtz0+q69WHbnwgI4zUgUbwYpwoB7k0dRY97xip9fHAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGHAoGBANBKlyoqApWzG7UzmXcxhXM4T370FbN1edPbw4WAczBDXJslXCU9Xk1r\n" + "fKfoi/+WiTGvH7RcZWPm7wnThq2u2EAO/IPPcLE9cshLBkK28EvDg5K/WsYedbY9\n" + "1Gou+7ZSwMEPv2b13c7eWnSW1YvFa64pVDKu2sKnIjX6Bm0HZGbXAgED\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "cYcBOlapA+R4xq3nn5CjpnzNXdDArMlHuXv4MairjleF1n755ecH8A/R8YIc2ioV\n" + "n/C1TACzFVQ12Q9P3iikVOjIXNxYzaz4Lm/L/Lq4sEOPRJC38QEXeIHEaeM51lE6\n" + "p6kCqXcGu/51p5vAFCSiXI1ciucmx93N+TH1yGKRLV0=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_RI_BAD_PORTS[] = + "router fred 127.0.0.1 900001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANVi/MVWhzT5uo3Jxw4ElS7UGmA24dnckdkCLetMhZOcE9e9mg4WcImL\n" + "NuBe2L/9YaL4PFVchCGlq73phKG6yFdqJdjDV8Qh9MJdAYWW2ORrjRvCrspPaYPN\n" + "BGJrkD2Gd4u3sq7f26TIkzmBx0Acd/FD4PQf8+XOt9YYd36ooS4vAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALtP4cIpAYp9nqo1ak4SxALcndFw4o51U36R4oa+uJS/lYQPHkMMOj6K\n" + "+AVnj9sxkDJ1POaU5lsCQ5JPG1t+Tkh7vDlJb6RCUy25vJOuaQCb9GVVY7KQTJqA\n" + "E0fU73JdKACNjMlbF36aliQhrG4Fq2Uv+y7yp8qsRxQ8jvzEMES/AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "xzu2T+pMZtdsS5q1cwXM2hMIH2c8mpAV31G2hKIuiQRwtPD1ne4iJsnoVCXhFakd\n" + "QTq7eTXM174fGWyIT93wvQx/Uqnp29dGZp/VaNOsxHFdYVB4VIVqkBh757h+PSJ+\n" + "VNV5JUm4XQ1QbmniJGdTQp4PLBM++fOXMR3ZNd6rt4o=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_NEG_BANDWIDTH[] = + "router fred 100.127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMCG/ZCXNCF02uXRSCP7qWBN75jDMQZ363ubnQWhF9KDDNWWiwj3UiZR\n" + "zqsM4zKRgjtarWZvp2qxKABFAODd+j9iq5DvUGRbbXv+aR8TT/ifMtwwxHZQBk1F\n" + "1hbsLdwWzGIiyz5k2MVhXnt6JTlklH2hgT++gt9YTHYKxkssaq5TAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAM3vk/4kOTB1VXrve29JeHOzNUsPwKruBcjxJf+aatxjf6KO2/RW41bM\n" + "gRYq9V7VAYeZTsbS727fy03F5rk3QIBhMJxm9FHatQ6rT/iEDD4Q1UZQsNtm+OLf\n" + "/TkZZhgfB3MiDQ4ld/+GKd7qww8HXTE+m/g1rXNyZPKozn8K7YUHAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 -1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "bUBBZYZWqCbsH4/7fNXtC/HgIZNGOfDF9v4d9YfKaDs5xDYf2o67hRcwx5imhrgC\n" + "IU7n9AI4AGxkFoN6g3Y/t4pqebxdkF678rRDCtrlwwreAiUktgrwnetp9Tpo16xj\n" + "V7Uf6LcqQdvu78lRh1dsrY78sf7sb90vusFMPLXGUKM=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_BAD_IP[] = + "router fred 100.127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMtMrM24AJpJCevxnseIpRlSuAIMksfkfky2+noe7Rok8xn6AMQzMrwx\n" + "AiCJ8Jy4DBzIKUiJK4/y1FimyM08qZGR0xeqblCxZ1lbSiXv6OYxoaD2xmWw8zEP\n" + "Zgu4jKReHh+gan1D+XpAbFNY0KrANhjRo96ZZ3AQsZQcWBiPKCynAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAOPclmBO/amw1RWTSI1y80qY/EPjc0I+sk9HKr0BQOovxqJ0lmy9Gaue\n" + "y+MOejQ9H2hNev0nd7z1fPxEogt7SCe22qJHHX3xDf+D9RpKsvVzDYZsk7hVL7T1\n" + "mwHzuiV/dtRa7yAMp7+q0vTUGesU2PYFYMOyPvz5skNLSWrXOm05AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "g6besL/zxOp0N6Q5/7QZgai2kmCU5EAWJlvZrf5jyrjKhsv2a4LDkap07m9QRFqW\n" + "GGe7g5iiABIqnl0kzv7NLX7ah+d/xxv+IILXyZfVTxSw0e+zFb3uPlQ7f9JsGJ8i\n" + "a+w8wyyDBpOAmi8Ny866Cnp9ojVzCyIErUYHFaPvKao=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_RI_BAD_DIRPORT[] = + "router fred 127.0.0.1 9001 0 bob\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANKcD6DJ16X3yvdq05jatdwgjO+hyoIpckW9sV/OkdfIZwf+S6Q4pZGC\n" + "doMw5XeOM52gjpx42kUp6M2WlTGDFEpaNU0VyeZYG/M1CM1xvfj3+1PoebioAGdf\n" + "GuhNBCHZdaYNiOGnh9t2GgUomgpE6njdS/lovSrDeTL469hfcUghAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANWeGHig5wE9UijaNnEW5au3B3hZKSlzCi+T6MYDPbbYhm8qJaVoXUXF\n" + "EP1EUgzDcX3dPEo9upUA1+91GkjGQCo9eOYlqGib8kHIwKnHZK+hernBc/DnOeUp\n" + "Wyk9SW5s+fi12OQhr3NGjbSn76FMY9XU3Qt7m3EviTwWpI3Jr5eRAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "t77wEoLjyfMf9LKgBfjveosgwvJ8Go0nb27Ae3Ng9tGtR4qaJQfmwZ5fOOuVU9QC\n" + "3s8ww3aY91KD3NTcN3v3FKngxWtRM8AIfwh4pqT3zW6OSP4+nO3xml7ql0Zf6wfj\n" + "TPFV2941O3yplAsmBJ41sRSWizF04wTtZAIgzY7dMLA=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_BAD_NAME2[] = + "router verylongnamethatnevereverendsandgoesontoolong 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAL0mcUxg7GJ6oxgciLiBCbo+NuZ/OVKRrERCSM6j6iHERcB9+ciSRgQ5\n" + "H6o6FUX2LoRmHYzBk1x7kIjHa9kx9g6CAbBamdZrQbdVnc1y2NrdHB/jvwLj3C48\n" + "PgzFIrLg9OlkuoWck/E+YpPllONfF65e0+ualgVjPgpQpXwmz+ktAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAOgHvvTAxyjJtHx9W2X7aOI05H9sYDDY+sxhovT/8EpAHrioex54tsMT\n" + "ifgtoXTjGIBEOTDi/1ry39nEW5WPbowqvyzRfR2M43pc96WV7e1nhmD/JrnTYgtR\n" + "5/15KxcMJxoDhod7WZ/wlXBnHc2VevX8JTaeOe9KYORCj5iNbtVZAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "j/nFT5gyj20cLHWv94O1jmnqy3n6qkO8Av0OdvvfNeXsMK2UHxk84vzFvEwpUF/Y\n" + "i+VR3LXY4CjTpuliMtjt7BQGtmJSvB8W0CeIUenIGzfwDxW9dG2o7spDldKDB/OU\n" + "C1wyHvKaA6Yss/02RIDa4AxyjsfbgdJ91qK+aAnYAtA=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_BAD_BANDWIDTH2[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALQDCm9VEopiYILmt4X9kP6DQazfgKnLXv+6rHbc4qtmvQQD3TVYbxMP\n" + "F4sEUaz+YHAPnomfDVW3a0YFRYXwDzUm1n47YYCyhUzEaD2f69Mcl/gLpKdg+QOy\n" + "boGB1oD4CStWL3y05KhxxTNiTrg+veMzXTqNwryCYm+GoihIAM9fAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALYHwdx6bmYy09AW5ElN/DWh0fHh3mBK97ryiIMi8FImYfzbw2BR6xuT\n" + "aQT5omqS3PNJJcNWZt5gOyDtA9kLh03cch7t1PenXSYJshbME2bDrZDJKVJMN6vV\n" + "B1v/9HjXsVF50jBzZsJo3j26XCPT5s6u9wqUFWW09QR3E/1HInHVAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 -1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "p09ijyuvcW+WKRj4mJA/nkLCvZkRcMzykAWheJi1IHCoqhXFdkFLiIRqjaeDVHRr\n" + "zBtD+YCQiGvFcaQJ9IUhh7IleHcyyljmDYlvuBAxWiKvVZstJac0kclCU4W+g8yK\n" + "0Qug3PmGKk115x2TllHaCZqMo5OkK4I/WAsKp+DnJ1A=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_BAD_UPTIME[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMM0Nubr1VXQ/FcgIQTFxZpZDlAEh2XN8FoJ8d+X5S46VDGijmMoYmyN\n" + "oLXqMTGmOaR0RGZOeGLgDzeY8tLrfF821IjfkXeAANZibUjdsHwqHO3wlWD2v+GN\n" + "0GBocWXEdAp/os229mQQKgYAATJ0Ib3jKhBdtgm5R444u8VX5XnbAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMpyOr4kEtSTZw4H9eSkH2+WmwIlO4VBpY2HkPS00l6L5fM2REjt50Xi\n" + "lsNOz8Q6mAn5cMYmsGlv61kg01mCvYc7Z715jGh+1hhVAxMaNS3ED/nSPnslyjhq\n" + "BUm51LhYNHD4ktISIqPMurx6aC8B68UYgKzLgCYNzkathFXSBpjRAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "uptime forever-and-a-day\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "NHYeiQOu0nZdrhSy31Xz4F0T6OTU23hPQDzoLax1/zq6iTVrz9xi3HGm7HhOMW1j\n" + "YgFGK3+Xm4iJL+DwriunsAIuL5axr3z2hlmFDQHYItP//KyPpOqSrfEOhwcuj/PE\n" + "VbWsiVYwz9VJLO8SfHoBeHI6PsjQRQFt2REBKZhYdxA=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_RI_BAD_BANDWIDTH3[] = + "router lucy 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAO6HrITQTEjV/v/rInQ2REmCFZa4dZg8zIh6+B51U/I6hDiZaKGwpNey\n" + "9OfjoRqT2DwyLEe3ORm9A2RAz2twLBixrpt5IvC0sbGustmW964BHW7k9VvRupwl\n" + "ovujHpLIj5dkLxD15jGXHoTp1yHUVk9NkMGN+ahg6y+QhTbIrWbRAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAOEpciJFXauEqs31GMTUTzu6edBj9WtV+sIflhGKvU1KKRfwCgOcuKMx\n" + "QiLHHD9AjhMAFGT/qtNbPFkzfYxHKLHw+NLJsxmNtdkYM26FX3ButPiX+69sq9fI\n" + "PCHqQy6z/A7hHwtEk6niWgK2PLhAZCg9duAv+mqFVXe2QEBjax/lAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 electric\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Jk0Xk1RMJSjEflNRcp4qznaHKcfe2r0kOc7TdLAnM8zyNDVj6+Bn8HWmyp/oFmf6\n" + "xtWKKgkKxriAVIJgqZMchPbr9RuZS+i+cad++FCwpTVkyBP920XWC47jA3ZXSBee\n" + "HK6FaoK5LfmUm8XEU9BVhiwISXaUfTdkR8HfzugFbWk=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_BAD_NTOR_KEY[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKYDCSr0Jh9d/mJKjnGYAHKNBcxR3EJk6GGLwKUrRpN8z/aHRxdWlZF2\n" + "lBml6yQNK/VPftcvOekxrKq3/dISrIFBzFYj6XHNtg31d09UgitVkk0VfRarZiGu\n" + "O6Yv55GSJ9a3AZDE4YmIp5eBjVuChyVkeDFYKVn0ed4sj9gg35rjAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALXdUQuq1pYHyYP0qU6Ik+oOmwl0eOsuwiLWf9Vd+dsgEszICX4DRWPx\n" + "syDxfxyA/g9FEPvlI7Nglx6cKe2MT0AutSRLbbML4smfuRZNIF35Cnfu5qTGVVzL\n" + "GWVSA2Ip7p+9S9xLhLBdc6qmrxEXCPL6anEhCR4f8AeybXAsz2JLAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "ntor-onion-key s7rSohmz9SXn8WWh1EefTHIsWePthsEntQi0WL+ScVfjdklsdfjkf\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Yf9axWyzPudnRvQstNdbtBYo7pGpUEIdECMGcJtFb6v/00pxk4Tt3RiOKa84cOBV\n" + "7V9NjOLdqlx88pGz0DNCJKqToIrwjZDeQ8Q1yi9XClLDkC32fQRX4y6vNBZ3LXLe\n" + "ayVrdRrb41/DP+E7FP4RNPA5czujTfs8xLBMbGew8AA=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_BAD_FINGERPRINT[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAM0wDWF2dBLzsmoIDHRugzosCSR9TSvEE0TkvKu6+agfogGtkQJwQ5zO\n" + "sGzZbRR+okO7d+QCED2i3rUs1iikoMUT+pwgvOm8Bxg9R64GK7fl9K5WuAiG11Uj\n" + "DQAfSx5Fo30+rhOhe16c9CT7xJhj//ZKDbXUW7BrJI8zpuOnvgD5AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKACg1nWM/WjpUiGwlLQsY3Tq1h0RTz/HmOMx/6rTRxS5HLz0KnLg5zV\n" + "dvmfhxqQVKBkt1N2+y+qO7x71oFzIsFMfHYWSxOCEo8Nkff1BqAPqxxUHvM0HwJo\n" + "d7lswJ/UT1j4+WZNZ4sFIujsIW2/zZqKlxG9xaw0GXJ082Cj9XkPAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "fingerprint 5555\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "mlqyJ/ZGBINKwSNEi7GpNBCMqIVbL0pGAOBYHJF1GbRlU28uRyNyeELIxIK5ZIet\n" + "ZzKr7KPvlBxlyolScPhTJfP98TFSubrwYz7NnQv0vLI0bD0OyoBf/9/1GYlzgTso\n" + "3mKfnV7THUalpxe9EjQ/x61Yqf26Co0+jYpt8/Ck6tg=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_MISMATCHED_FINGERPRINT[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANUAvwbpGbsAyA+mBwjFkvurtRzdw9btDqNKtPImufIE+q+AFTaCnwPr\n" + "kA7vm/O6h6OhgfdYEC2GfYJfwPGM7MDuz+NnuKxUb3qb2DQN2laqow6qWs9La/if\n" + "oHKUjC5mNeAgHcbWapx9CygwaFeVW6FBPl6Db6GIRAlywPSX+XMJAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANlSGd+Vm9nLiUk6zgu8dPnSFfw4F0R2GYfmzncIGJWtRFTF9ThW/0av\n" + "/9vZAWyVBjjtnpAP5R1BzdJYV2RwimC/6tqoHtkSbCBhdq5Cb/EHG7Xgb8KwNWVJ\n" + "NV1EESDwvWnRfSPGTreRw9+2LkdXri17FhDo2GjRxAq/N7YkLK5hAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "fingerprint CC43 DC8E 8C9E 3E6D 59CD 0399 2491 0C8C E1E4 50D2\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Y8MwYBeEfMhoAABK/FgpVRYolZ7jQ2BJL+8Lb6i4yAuk+HeVmPKTX7MqQoekUuin\n" + "/HdPKP+g/9HPMS5pCiW4FMwnXAF0ZocPXF0ndmsTuh0/7VWVOUGgvBpPbIW6guvt\n" + "sLLQ3Cq9a4Kwmd+koatfLB6xSZjhXmOn7nRy7gOdwJ8=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_BAD_HAS_ACCEPT6[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAJfPJNA3zZ77v2nlX2j5dXImcB/NhRtkG8XQgF7z+3H17sqoXgBgZ1dq\n" + "IbyJmAy2Lrvk/8VkXNFrT5/ErThn1B98V/PsJOOW1x7jGcix6X4zDYn/MvwC+AxA\n" + "zNP0ozNcVZ6BzVYq8w4I1V4O3Cd6VJesxRVX6mUeSeNawOb7fBY7AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKBzfB4mDEJjFTnmtqZxDG8G1yAiccVgAtq9ECEREL/BOQyukixUBeBe\n" + "j/FgXzbMJ7DZAuopuJZU2ma6h14G63fZs7eNFceDtmdLpuCOsFuvJ5Mlkf3hDZ1u\n" + "1KK5q+tiG7MKxgnGrqjPBUO2uubs2Cpx0HmsqBNUalXd/KAkFJbXAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "accept6 *:80\n" + "reject6 *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Dp9dLgs9s5beMPxfD0m96as9gNBvlmKhH1RQ/kcOKscia4R8Q42CnUtIqLkCdjOu\n" + "zErc2Vj9QzjKOvlqUqHxP+J+l+ZJez6F+E1tcmK/Ydz3exL8cg9f4sAOCSXcpBey\n" + "llTFDibz6GkQ2j3/Uc4bN/uLzoyZKunpJbSKZP5nt8Q=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_BAD_NO_EXIT_POLICY[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAK4fbjTKYqv2fygfjzY53sVTdtbNMjq293/uffKKxFYnOVvPzrHlP6Go\n" + "2S19ZcyDxOuH1unbBChPnV0GpxXX6+bgfDkaFh7+jef0RQ3fpJl84hSvdM8J8SCt\n" + "Q/F4Oqk3NeKKs+zAHDjhAU1G4LkF9/SZ9WZVXlH4a4pf7xgQtaShAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKahvyDkmh33ob/bLVO1icgz2ntOZN6ZQUfgpMU4Cd6DQtOEwFUGhbVt\n" + "gvtMHv2+VbxM31ZfUsyBqJ1rJBLpOqlPvSoYwSac2+twa+w/qjfGqcJYhBjP9TV9\n" + "n9y8DzBX85p6vRcCzcuZ4qUJ2nRzdLHwjdgzeLmmCHuPO2dQxQhXAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "ntgCtMC0VrsY42dKts8igGQ2Nu1BpuzUltisIsJz75dDx2LCqTn7p4VpWbTrj1sH\n" + "MRNOvEPFxVMs0Lu50ZUGRzeV6GrHmzIRnOIWanb3I/jyrJLM0jTIjCOLwdMRA298\n" + "tw8Y9Hnwj4K7K6VvgU8LP4l7MAJNfR6UT46AJ6vkgL0=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_BAD_IPV6_EXIT_POLICY[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKHJKLHqjYoW9M+1q0CGHJRT5u2CnZWb8Qr1DpLkkusQ6ru+cDAG12so\n" + "IpDQh7IyB2JosVJi9ogekYxJ3O1p5WlFUi0X19DMoer9FJ9J7/3s4enGJ/yMBeuu\n" + "jLVRkjMJhsfhj3Cykon+8Rrf520wSmBg1dpJQCXTwtb7DARgYRpZAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAPJH61Ir6XSu9/Q9tXGaINbXO1GWQQUXtwh6TX9lxnaCNDLGnxiY+ZZw\n" + "+Vqj3LAQoMrz1PpPsF5e0VIxok10Vc8y4cWC+kIitcecut4vWC5FYTtVVP9wtlyg\n" + "YCcVOVhtFQxtLiGqprl84+EVxrR7RQVCMLNDUXIgxAfdnS24eBPDAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "ipv6-policy kfdslfdfj sdjfk sdfjsdf\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "XWorzVT5Owg+QcsBtksiUNtpQQ5+IdvbsN+0O9FbFtGZeaeBAbPJ3Poz+KFCUjZY\n" + "DeDAiu1cVgODx2St+99LpwEuIBx78HaD8RYU8tHx8LoA+mGC43ogQQS9lmfxzvP5\n" + "eT5WXhkOS5AZ8LZOCOmT+tj/LkSXev2x/NC9+Vc1HPo=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_BAD_FAMILY[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAM62QoRxSPnm+ZM4fv9p03Qqbz5SzhXYSNjKWqylBruaofTw6oIM8DtX\n" + "7QnrEe/ou/WtfB+swV/2rt/r0EzmeWBWuDmuSUrN5TC2AdOi9brSJMgXVW6VW77X\n" + "fuIlLd5DVSId2zs3cKLDqp36CUsooA9sS6I5HrvW9QDf3VS3pGBtAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANg1trpnRzkCi4t4Z4qnBKF612H5A3Zrjg7Jo2b3ajUnON/KEuLPTc3t\n" + "PPN0W4qqeCMmVQEuxf3DRbTPS20ycy4B/JDWYfxCNwuj5YAx04REf7T0Hlx7Aee/\n" + "sHEQBhIBfasA2idhTh3cAm4DMYn+00BqjxF6jmyRA0hyntEABabrAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "family aaaa,bbbb\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "xOgP3liKF/WEvwbbGzUUVRZ5WPrOI7jex8pZU/02UEnHjit7vCf9fsUcvkeo0xjz\n" + "n3FQHIO1iAJS7dEaEM4nz6wtPUb2iXSU9QajkGBkJ9/V7NHMFIU3FGfP47PIJJkd\n" + "nz5INoS+AsE7PmnDjUMm1H45TCCl8N8y4FO6TtN7p8I=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_BAD_EI_DIGEST[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAJ8Sn8AxBRbeIAHUvaKjqmcYOvXz7YFlpYFiVHp/cn+l+KUkIYTOFQXf\n" + "K8AtwjmJ4R2qJIbNlY/6oZGFbizt/B+WPuWsTj+8ACEEDlxx0ibg3EJRB8AZYiWv\n" + "0zC/loiUvHm6fXF5ghvDr9BQzEUo9kBk5haoHwROtGawr1+vOEiNAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMzok3ZJtLjXOC8RKltXI8xulwn/ctCvQFHImR0+ccA1uBxaZNYgiIcc\n" + "q8XngROfV8xEgDbYPiWiLXJOMSwOd7hfs3YzRWF+LKftYs8PuRyMJcCoBjOPZ4QX\n" + "HRfTetEvu2SijZMby+lkqpZg2nuF/ipsXUjrabRZdNiIGhC451vdAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "extra-info-digest not-a-digest\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "c/6zAxO04izQvqdM4bZVGE+ak0nna5pz9XZizFkieZEDWGzWQuVMhXyL5sbsFbsx\n" + "6Hn7DvNRYR/2nA0teDeRyIHMoMHi76te5X9OFDgaeUVCbyJ8h/KZYfPnN86IDbsR\n" + "dCSmj9kX55keu64ccCAH1CqwcN/UsbplXiJJVG5pTfI=\n" + "-----END SIGNATURE-----\n" + ; +static const char EX_RI_ZERO_ORPORT[] = + "router fred 127.0.0.1 0 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMc4MOhLG3PKPgc+xYVf4eScWzeOf8wq7Cb/JxZm50G0LuvVbhHtHEZX\n" + "VOSHI7mLE1ifakJvCFJRLobMU7lU0yhn18/nKl2Cu5NfFHHeF/NieUBSxBGb2wD6\n" + "aM1azheXrRqvDVVfbI0DLc/XfQC/YNiohOsQ/c9C6wuffA4+Sg85AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALBWdl9/Vft+NQKQlg5kgvZo+krnhNTRVQojWtUEzom4TFIT+NNKJyMG\n" + "reQXcNdzNptTB0aOBGGwqAesqzsZ2Hje699NsDe7hdl7Sb5yhKDqtdQY6yDXJUFt\n" + "zqpAUkmYMLe2p3kPiWefNso56KYXrZrlNAiIS/FhQ5cmuMC2jPydAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "gFg08P9A6QNQjURlebfdhU3DSV0BeM0j2SFza1jF9JcBOWDRmT8FvYFK1B3js6jK\n" + "8LNV8JOUssv14z5CnUY9CO1BD0xSl+vGlSS4VOXD7rxui8IoWgnqnZsitq+Qzs95\n" + "wgFKhHI/49NHyWHX5IMQpeicg0T7Qa6qwnUvspH62p8=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_RI_MINIMAL_ED[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf5iAa+2yD5ryD5kXaWbpmzaTyuTjRfjMTFleDuFGkHe26wrAQAgBABFTAHm\n" + "hdZriC+6BRCCMYu48cYc9tUN1adfEROqSHZN3HHP4k/fYgncoxrS3OYDX1x8Ysm/\n" + "sqxAXBY4NhCMswWvuDYgtQpro9YaFohiorJkHjyLQXjUeZikCfDrlxyR8AM=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAOsjlHgM/lPQgjJyfrq0y+cR+iipcAeS2HAU8CK9SATETOTZYrxoL5vH\n" + "1BNteT+JxAxpjva+j7r7XZV41xPDx7alVr8G3zQsjqkAt5NnleTfUREUbg0+OSMV\n" + "10gU+DgcZJTMehfGYJnuJsF4eQHio/ZTdJLaZML7qwq0iWg3sZfBAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAK9NjRY7GtAZnlxrAZlImChXmGzml0uk2KlCugvju+eIsjSA/zW3LuqW\n" + "wqp7Kh488Ak5nUFSlCaV9GjAexT134pynst8P0m/ofrejwlzl5DHd6sFbR33Fkzl\n" + "H48zic0QDY+8tKXI732dA4GveEwZDlxxy8sPcvUDaVyTsuZLHR4zAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key 71DgscFrk4i58O5GuTerI9g3JL0kz+6QaCstAllz9xw=\n" + "ntor-onion-key-crosscert 1\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf5iAUVMAeaF1muIL7oFEIIxi7jxxhz21Q3Vp18RE6pIdk3cAH5ijeKqa+LM\n" + "T5Nb0I42Io4Z7BVjXG7sYVSxrospCOI4dqkl2ln3BKNuEFFT42xJwt+XGz3aMyK2\n" + "Cpp8w8I8nwU=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "lAZwD6YVic61NvJ0Iy62cSPuzJl5hJOFYNh9iSG/vn4/lVfnnCik+Gqi2v9pwItC\n" + "acwmutCSrMprmmFAW1dgzoU7GzUtdbxaGaOJdg8WwtO4JjFSzScTDB8R6sp0SCAI\n" + "PdbzAzJyiMqYcynyyCTiL77iwhUOBPzs2fXlivMtW2E=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 Oyo/eES+/wsgse1f+YSiJDGatBDaiB4fASf7vJ7GxFeD4OfLbB7OYa4hYNEo5NBssNt/PA55AQVSL8hvzBE3Cg\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "wdk26ZtS1H81IxcUThyirANLoszrnYYhOMP57YRAUDEzUr88X6yNDZ5S0tLl+FoT\n" + "9XlEVrpN7Z3k4N9WloWb0o/zVVidPMRVwt8YQakSgR8axzMQg6QhQ6zXTiYhiXa4\n" + "mawlwYFXsaVDSIIqYA2CudIyF3UBRZuTbw0CFZElMWc=\n" + "-----END SIGNATURE-----\n" + "\n" + ; + +static const char EX_RI_ED_MISSING_CROSSCERT[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf54AfsyyHhGluzfESzL4LP8AhFEm83+GkFoHbe1KnssVngHAQAgBABNzJRw\n" + "BLXT3QMlic0QZ4eG612wkfSRS4yzONIbATKLHIgyzgGiGl4gaSX0JTeHeGfIlu7P\n" + "5SKocZVNxm1mp55PG+tgBqHObDRJRSgbOyUbUgfOtcbQGUeVgUlFKWZ9FAY=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMqT7K8cEzWIaPNXbNgvoZ5ejavoszI2OjW9XXetPD/S2f+N7TfQXHBW\n" + "bnjpgj87gmk59w0OXTMCv+XofZ0xOy2YR/jG5l1VJIvqgJhhFJ8oSEGVzy+97Ekn\n" + "Lb1FEYuVfVxSxnU2jhHW6KPtee/gvuyRI/TvZuwmYWxLRpikVn4pAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAM4nITNe8UykgsIuo5czSSSl3Okr1K+UVWTzDGLznDg77MkLy7mydmk9\n" + "vf51OB+ogQhozYKIh9uHvecOzY4EhSIuKhui4hNyQklD9juGoW7RVTSpGdYT1ymp\n" + "dDYS30JBPwCZ7KjdMtXiU8ch2WgbzYBuI+JfjwOhfcsuNC9QPfbfAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key lx8o212IYw5Ly2KbH2ua1+fr4YvDq5nKd7LHMdPzTGo=\n" + "ntor-onion-key-crosscert 1\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf54AU3MlHAEtdPdAyWJzRBnh4brXbCR9JFLjLM40hsBMoscAJ8cHMIc71+p\n" + "Qa+lg5JiYb551mLgtPWLy12xdhog7SXiJl3NvnMgbMZXHDqkU2YZCidnVz+xqMdh\n" + "mjQFK4AtRwg=\n" + "-----END ED25519 CERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dg\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "cv1yL8HhQzQfjzkSosziu2kMecNUQGle4d103h6tVMoZS1ua1xiDpVKeuWPl9Z0+\n" + "wpFwRkOmK0HpNeOXCNHJwfJaWBGQXunB3WQ6Oi1BLilwLtWQixGTYG0hZ6xYLTnX\n" + "PdSQIbsohSgCzo9HLTAgTnkyBgklIO1PHJBJsaNOwfI=\n" + "-----END SIGNATURE-----\n" + "\n" + ; + +static const char EX_RI_ED_MISSING_CROSSCERT2[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf54AXXgm0CUWQr+rxvgdIslqaFdBiwosT+9PaC8zOxYGIsZAQAgBAA6yeH7\n" + "3AfGIGuDpVihVUUo0QwguWDPwk2dBJan7B0qgPWF5Y4YL5XDh2nMatskUrtUGCr1\n" + "abLYlJPozmYd6QBSv6eyBfITS/oNOMyZpjDiIjcLQD08tVQ2Jho+WmN64wc=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMdyTK/VPZloLUaLsvj1+NOFs33/E9HmA0VgvZ1nNUrR+PxSR71QF7Tw\n" + "DKz+/p2rJE+MPfQ/Na3dH0vH4CDZ+FH2m4A8SB9emF8aKxdc/7KCjQNDQCNlEQYn\n" + "O9WvZJhbNPHUmX0z4OotI+Sk3qBzVHu0BGDsPYC9gwszIumDUILxAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAL8o6CJiLfW4vdRFvJ2nFt/H/ei0ov83rilOuwSmNORmL9lvnHY++HrD\n" + "dmEEvBv74xqWJxGbJ6OQ3VOwRpf2X/cb4gAvsQDqDmNwpJsrPYRQVXp/KY/8z7bJ\n" + "dM4CjcsuJHHmj3yc3iCzgqt/Xr6vR24X4bee12/bP7R8IETvWoiHAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key qpNEGrLMVn28Odonk/nDtZq1ljy0fBshwgoAm4X1yzQ=\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "i4RKGIeaUrO6nzfdtb6j+ijYJh1Vgc9bsHMpW9cVCOjoJKFW9xljgl9xp6LytviN\n" + "ppKYCt9/JflbZUZjny34ESltPGrdquvHe8TtdQazjiZBWQok/kKnx2i+PioRF/xI\n" + "P8D0512kbJjXSuuq9tGl94RKPM/ySGjkTJPevN4TaJE=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 pMAOpepn5Q9MxcV9+Yiftu50oBzBsItQcBV9qdZCIt3lvSFqFY9+wJjaShvW3N9ICHkunrC0h/w5VEfx4SQdDA\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Du5fJYDzvEeGqKTJwgaQsJJgz39K/J4qEM2TZ3Mh0XuDM1ZWDtjyzP03PaPQqbJ1\n" + "FsN5IStjOqN3O1IWuLzGaZGpGVuqcyYOxjs7REkGQn2LfqCjpzjaAdcsL0fI4ain\n" + "o/in8GQ6S/qhsx8enKlN0tffTmWmH9bmmVz0+yYmBSo=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_RI_ED_MISSING_CROSSCERT_SIGN[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf54AfoVFYuJnDNBWbjbTqfXACUtXWPipmqEYC++Ok/+4VoFAQAgBADH7JzI\n" + "fjSMV158AMiftgNY+KyHYIECuL9SnV3CSO+8+I7+r9n+A3DQQmGLULo/uZnkbteJ\n" + "+uy6uRG4kW0fnuBlKhseJQm9hjNGWzC8hmebp1M+bxwG41EGI7BZvnTrRgM=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALEqlijoFIDX1y1i5zfei8DuDIsFtSw56PGgnMRGcybwD1PRQCheCUZM\n" + "erQgFCWjgLgvGJERBK/oILW1dFXp4MAR5RgnrPGTfWTinCj32obMLN1gIczpq6a9\n" + "P9uv6Cz0ApSxpA/AuvjyAZwQKbUXuMvIY4aTprAKSqqVohk6E+E1AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMZbbBjGV7xPri4XNmejq4add93p+XsWlsfbM930bcC2JZiwg4g4cq6W\n" + "idl8VDmCXeaWg5y3kb82Ch/Q9vPG0QYQbXxUA3JxQKKbcEK3QsEvqQh8Nb7krILK\n" + "YnSGAnLG2Nc3PnKb7Wpb8M3rAysC5O99Gq1mSfm8ntj3zlIM7NSHAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key CYcpfIF4T9PJcfROfVJTUYl0zNd4Ia5u0L9eng/EBSo=\n" + "ntor-onion-key-crosscert\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf54AcfsnMh+NIxXXnwAyJ+2A1j4rIdggQK4v1KdXcJI77z4AMRc2LxiKbyr\n" + "fqRVynHuB031C4TN/HAlNPBjVoRvQRgzpiyyoyCqMDxLZdM8KtzdLLeqZJOXtWod\n" + "UXbYG3L70go=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "BRwRAK2lWxWGS49k8gXFHLEQ/h4k8gOQxM0WgCaN4LjAOilLHFjsjXkmKgttVpHl\n" + "f0V9ebSf+HgkpQnDSD8ittnr/0QaohUbD4lzslW4e/tQYEiM46soSoFft85J6U3G\n" + "D3D63+GmaOfIaa4nv7CD0Rw/Jz0zTuyEuARsdJIr1IY=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 7XfV5r7FXbXPEvrxlecWmAJxat/6VT+/4tE5cHrQnvLM4zslysstWH6/AfIfcmUuDlQ0watmfg1MvVnjavcfDA\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "eigLL3S/oMGL2tJULt9bl3S0iY+YIxdKeGFCcKZci59zD786m+n+BpGM3yPpvrXr\n" + "bGvl4IBqCa1I+TqPP1rM9lIEcUWaBT7Zo5uMcL1o+zZl1ZWPWVVKP5hC5ehDueu8\n" + "/blzNhTEFAp23ftDK9PnFf+bXxqbgKkEoZsxnd3e9Ns=\n" + "-----END SIGNATURE-----\n" + "\n" + ; + +static const char EX_RI_ED_BAD_SIG1[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf54AR8QC+SNBpPOTVY198IQBANNwZjy+SBqQNxfzjEmo204AQAgBABjz4FP\n" + "zW/G+fu7YirvANvvqJeb7S1YYJnf6IrPaPsPRzDqJcO3/sTzFC5OSb9iJmzQAWnn\n" + "ADPOl+nOJC58XJnJ7CUJdPtyoVdMvUiUT/Jtg4RuCN1iDaDYaTh2VavImAY=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKuLC0kzCBTV6+WPZcAOQPKjqbjvMIyaehIQS1o90dYM+Tosrhtk3bw8\n" + "QBLMaiWL3kfIWPZuWi2ai40dmqAXMrXH3yBgKRNZ6zZSbUUuJ1IknqmrQ2PKjC/p\n" + "sIW2awC6Tq+zrZ7vntDb02zY857vP59j8eolTDg1Vvn6l2ieL+WhAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMnBQPOJBQLZ3NAa70n6lGZGvS3DYZFNOZ2QnHVeVvOSFIFsuvHtnUdX\n" + "svDafznYAuRFRVqJS2xtKKGu0cmy6ulEbBF+4uAEMwQY7dGRPMgVF1Z33U0CSd08\n" + "ChCJGPTE7tGGuoeSIGN3mfC4z2v9SP3McBdAiLHisPzaUjfRTcwRAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key W8fUvBpKBoePmqb70rdJUcRT0NhELDWH7/BSXJtkXS0=\n" + "ntor-onion-key-crosscert 1\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf54AWPPgU/Nb8b5+7tiKu8A2++ol5vtLVhgmd/ois9o+w9HAAPwWqmL0HXa\n" + "bYKrKPWQYnpQHQ3Ty0MmCgj3ABF940JURnV161RlN8CRAOJaeQ0Z8wBRLFC1NqLT\n" + "+GVdtewGeQA=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "x0vT5Wv7Guc0/Vu2BqomWwenh8oda9+8K/7ILi5GQL/WC29Tj51i0EE7PVSnSMJ7\n" + "33I/V+N5neauqWnbg7TxYaLsPfr6SpPTpBL1Xt0OiwT1//PvPYZ1gCcF3ig3KcfI\n" + "mreQd5C5Vri6ukWkMtz/zNDaDpDanzaNXTdaUXmFHF4=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dg\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Hci/Br1+NNymDZBmQy1QWMlCeLe8Z1vtZ2ZTj42jDhWg1OC/v72ptI072x4x5cmi\n" + "X3EONy8wQUvTNowkfG6/V/B768C7FYJYBId1GAFZZymXnON9zUYnE3z1J20eu6l6\n" + "QepmmdvRmteIHMQ7HLSrBuDuXZUDJD0yXm6g8bMT+Ek=\n" + "-----END SIGNATURE-----\n" + "\n" + "\n" + "\n" + ; +static const char EX_RI_ED_BAD_SIG2[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf54AW8fyx54c7vQQA/AmShAitFP7XI1CLdifEVPSrFKwYq6AQAgBAChqjVA\n" + "/wKKJZ30BIQoXe5+QMiPR6meNxF1lBttQ2t5AhauZbH5XzRhZkdGo114wuyPNEM9\n" + "PrBwp5akTtari9doVy6gs3McqdoIbRdWevpaGj5g5oOEOtA9b5UNWQSwUAs=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALp0Croi9zhpGxi9sUj54jr/flZdzxVVS+8VNldJG2c1soSx8kwlwotu\n" + "7mGGudJDAzDHGo5F5CCPEfQov2OmDehpefYUz/AaMLly6PrLRJlcUcpLogGf1+KU\n" + "1lLwE8kanXUkgvDhVQiFvNjy2Dxxuv3AHH4WdZZfbMbm8FJRGoHzAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMoI9vQT4g2sV2dViGOWOzxckk367T9sMjVwcYfJCmnixGxjWeKScQFB\n" + "K9v1uK73cfZR8AxiUGK4/iOX/9en14mJOGF7fftAqypFLAt1TBvb07IgXljOBoHc\n" + "Paw4oZoJQzEoazt0Oa181LyNnNIoaZpHVZd1+a1Gs1gKoM4xDBv1AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key KjyvXYkMcpke5ZsUYf2gZAUNeEoz8NAwYoQvvbcDGiw=\n" + "ntor-onion-key-crosscert 0\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf54AaGqNUD/AoolnfQEhChd7n5AyI9HqZ43EXWUG21Da3kCAI6MRHm7GpCF\n" + "/3zDGR/6jKe625uFZX9HpLt6FgAdGSJeMQ9W4Np9VkrFXAB3gvh7xxRzSgZ1rXgR\n" + "lUomgi7N1gc=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "xJXvCCpP4ExBuT3OTsdn2HJB0HidupmQq5zBh8fx/ox6+047ZBOM7+hVxxWapcMg\n" + "PMXbcLD4L/FCBpA/rjnFUE/9kztdq7FH/rOdi0nB6FZWhwDcsZuyfvbnDTxz5iHJ\n" + "87gd5nXA5PE649SRCxW5LX0OtSiPFPazu4KyyBgnTIM=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dgxx\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "tk4kBNYqB8utOmX30HrV8YfnwBXYODIiL3M/juRS6nPn0uvbW7pjoZ3ck/ahgW+6\n" + "FNQsgTJnEADCWS1r6v7PcvzQjtrOUUpNxGJxYw1r8yZkvmIxSQD6GMzuTxq7o1VA\n" + "/wZYDLonLhCWRdPjxnrl12+z92NdyISJCHMLRVqs2QY=\n" + "-----END SIGNATURE-----\n" + "\n" + "\n" + ; +static const char EX_RI_ED_BAD_SIG3[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf54AYYiKZrFWZ/Cj5mZbfK11MZHYbwchllsUl4qPqY9gfi6AQAgBAB4irxT\n" + "86FYA0NbZssSTmfyG6Edcf0ge61OwB4QD35kHCrvuZk2HnmL+63Tj4QoFqIVnwVC\n" + "3wRGJGcmS7y+vS64GUXbuyTgqgpl/KuoHo5Aqe6IxJlVWYtU6W0M6FV9tAM=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMUEvXTVTl5xkQ2MTEsB4sXQ3MQkz8sQrU63rlqglpi1yUv24fotjzvE\n" + "oJpeKJBwwg5WBW/fW0bUDJF2cOHRHkj/R4Is3m+2PR1Kn3UbYfxNkFkTE11l099V\n" + "H6xlsi0TJOJKlgrcbSuB7se2QctZVhwsdsJvFRptC9Qd+klAPb7tAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMooTeSUX7GPoyklSd1/6cF1u8e2LbjOLIpZrMon0Xt7c/aNwlrG9rVo\n" + "TSokHs3AQ2H2XIceySVRRWR4AdX9KApO4CX0gGTuVUmq6hFJWMnHdAs2mKL0kt1w\n" + "I+YWzjUqn4jIVa2nMbyHVQWzIysWwWiO4yduIjAYpBbWd9Biew4BAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key BN0I+pLmFkDQD5iRsdkcped4eZwGIuXnLiX2K0Zoi2I=\n" + "ntor-onion-key-crosscert 1\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf54AXiKvFPzoVgDQ1tmyxJOZ/IboR1x/SB7rU7AHhAPfmQcAOrIvaG/xJqe\n" + "adM6mai+FlV8Dbt6QrXTcNHJU1m+CUDthA9TPTAYz9D8W0mTEQ6KEAKGfQrNLy2r\n" + "G1B+9wWSpA4=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "BpLBsl6Yo64QzczJn0TjdcXC1Jv9IhUG2m/Re3v0voCELOP+t5vkZXXLoVL23oKv\n" + "JheSkWiuAIEPsatb4afXZ8wZxPcQjwy3zTOBM7p9CG5fA+KYpqKTxAi+dhVYlcDo\n" + "M7S5nMV63FclkZIT70FFTHwWed1sAKwEO3/Ny24eppc=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 abcdvEzGFYMcJ/Ea7sbessW1qRJmnNNo2Khkkl0rEEgtLX0b4L4MMhK/ktS52Y6jX3PRQWK5PZc6gjV7Jaldh+g0Aw\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Vyj7g3eQ3K4+tm49fJkAtsAYnYHcEiMnlucYCEPeKojzYStNfZwQO2SG5gsoBIif\n" + "urgQZ/heaF4uiGFg64UFw08doXqQkd5SHO3B4astslITvmq0jyaqzSXhdB5uUzvp\n" + "QCR0fqGLVS1acUiqGbRr4PiZ9G7OJkm230N3rGdet+0=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_RI_ED_BAD_SIG4[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AaEnncX/t0cbLm1xrtlUpkXghaA8fVuV7g1VF3YNfCaIAQAgBAC7Ki3S\n" + "zzH9Aezz5X4fbwHeF+BQEDfVasfyTxTI4fhRi7t3RxHzBJd60uEMXy2FchD8VO5d\n" + "j4Dl7R4btrohPVSVBQZuemBQSW6g3ufNl0txpFWu0R7vBPTFH6oyXYfY9gQ=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALGKwzhOui2/jJPjU1ngW5IZRPcoDk7RAfGDO4xaef4VfAFHCV9CQO1c\n" + "/wQ09CcRdggTvUcv9hJTGJhSObUUooCkxw4/35f/A6/NoW1Gi0JqF9EsQWHpuAfr\n" + "n/ATlJQ9oGdTCNDq/BXSPWXhoI6UhUe0wiD4P4x4QwaYHcZh+lE5AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAOKrizVm2h5/jE/HqqLCBLWJZVVoGspasCtDDqHhSqsPzyjpqa52iMKi\n" + "q/deJ92le3J2NJRGKxPmPQqWxwhIjnMS5kUMoW182iLpO/G9qyPZ0dh6jXB0NBLF\n" + "ySfW6V2s3h4G4D2P+fqnsnzQnAX7YufkvgDau/qTWi2CqD0CjavDAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key A9h8jY9dPbhHTDbIc/NYWXmRP65wwSMrkY1MN8dV3BM=\n" + "ntor-onion-key-crosscert 1\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55AbsqLdLPMf0B7PPlfh9vAd4X4FAQN9Vqx/JPFMjh+FGLAN8xr/w3KFVi\n" + "yXoP/az6hIbJh0HYCwH8D1rPoQLcdpe8XVwFSrHGarZesdslIwc9dZa/D1dx3OGO\n" + "UhJOrdv51QY=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "bLmdO7ME5vq+c9y/Hd8EyBviMBTeo85sHZF/z6Pehc3Wg3i1BJ8DHSd1cK24Pg48\n" + "4WUrGTfonewuzJBDd3MLkKe6epXmvUgvuQN5wQszq1+u9ap/mRf6b3nEG0MHxMlO\n" + "FLx5MBsScuo+Q+pwXZa8vPuKTtEjqbVZivdKExJuIX0=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + " router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dgxx\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "LqNGEa10zwSPeomBXTfgvBnnWAdWyiR7KYZq9T++jK4ctR6hUaWngH8qSteUrkMx\n" + "gyWb6UMmlxdfOG0sdcU463HsqV7zObaKya8/WwQ9elj3FfsToswUCeOaLR/Rg7wC\n" + "zcUjI5VsneQoXT2WVZbZBLsLB3+7QfezVHRMB377GAY=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_RI_ED_BAD_CROSSCERT1[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AV1AfOvQWKlWsbzoBdJc5m72ShIJuA8eNV15basjhXYdAQAgBABy+KQK\n" + "3oLDGtqL5kwRmjAsls/+C6SAoAALll7U7wNSH7en5RVBal4RUzCf57ea/KG0c9V8\n" + "2DmZ3PdOt2aY/M2bWGmmH/tyyapOoV98dhDwFU7zcx/pMfRnJTDRSDwl8QE=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMP6xbqbj+x1mq5XImjeT0rUzqKZTgBd5zvK4Xcy9IifJuFC9+mMzrY4\n" + "WhYbdClxKUkDMkit9MVhek+P/w5TSHKl6AuqGaO09ID+hZpoUSdoBUYktynxfGsx\n" + "kIDu0XvgtAeSyJaVvoV1SKVChY0IBbzUqbHt4O2Q1BhzFCKEJTEzAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANwWlBh7e/eSLlhto5YUdj1iGYOq+yAmlosDItVfYrSPJuUfM2ocMBAn\n" + "udbRbWiADoqsbKn/gwwHCC/f1HX2FkRXxxnOlJKLo+NEi8tGmOlcQXSQol1pCpvK\n" + "sA9TxtYr+Ft4LRpxNrexF+pIBxqzwetqQrZbKYr0CFJi8q1qlMynAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key cs1AP+xF5cXTLuKeOeItdoDAzfALTJkwk9lB4mtC4QI=\n" + "ntor-onion-key-crosscert 3\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55AXL4pAregsMa2ovmTBGaMCyWz/4LpICgAAuWXtTvA1IfAKo6ANUq+hi+\n" + "xb3J4aYafnszlj87oi/DR+SDf29wzwNw8gmaqGzJ5GbfISfABuTUCzlilZyVnLxi\n" + "BHcCH6PWiAQ=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "qC9Kph/kGtONR2DxZDoIFFgnDFC+/7H07EgCiYQdIFIROc+gGK9qBOgeFEptrkXF\n" + "XdE35xxox5xSASQvp7hjFwxUtJRGOtf2O98regqeeaz6O9VPXHkLf51uqX3bVgq8\n" + "KvFAsFFS66GxhtbrVjpyRgIwHAYvse1WVESfLuZZTn0=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 3uW8Q1aetIQLOsqSco128ZUaHlhqdYiBvrxV7x75BGNS5RzIMTEwYDNtEX1LNPFJ5N0YOV0HEEOLhrJUV9QCBA\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "WuD7S/saTYBxKvItITbHRi8n+e6g/oVbosicfbRbafYPzPp4Prb+RK03UTafzXrV\n" + "QEQIzDNhfePcIMH8qX+qrogLMXFqiXx6TVQ0GqNvqirokk8ar3AgtRtewhChAuAj\n" + "8pmQTj2JpZn/iB3PCE2l/93O9LHZfp44hc8QOWKs6BE=\n" + "-----END SIGNATURE-----\n" + "\n" + "\n" + "\n" + ; +static const char EX_RI_ED_BAD_CROSSCERT4[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AW5TTGF9jCMl7aALZzqypD9Bj8WYnAPIrKCoIJdgMbY0AQAgBAB7eCn8\n" + "rukx7t/egZUdqU7+FYqsnO4wdmOkLZkp0+gpF3jjk6N1Q0037NNVNZBjONB0Nm2F\n" + "CpB3nWSJliSSKr5tOYsuBPFy5VVGYeKPakpOoxanQ1UcqevMBAQy0zf9hwA=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALeS5YbeDuKQ5iiuUvh3REoyJ47/YU9lslWmTrVBf9b66pMnYJv/awPu\n" + "m2HredUAJ3VzwQ38VJA39w3fQXUhQDnQ0OPpKzeAmIiuG+6WdW/mBSK7uKcezC23\n" + "LA1d6Afyl79LjZz/n+ENXqNMlJk4QPcPHuRnAvwBl3t8YVRPJmxhAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAPprokY7utWuO/0252dBB5MCxmVD/dROaIBDyFtpdH+YVv04rkOlDzYD\n" + "W4mgHVBMxEm/cspTgQmJ4exRHJPpcSe1RYHt1ONZdLYr6D7OOWf0y1IUrVSzF6K4\n" + "lqlmNuH1H4+TKGbkvixYc5GU/2ZmAy6gFEuphYnBbsN2Ywc38mnfAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key Cgo6xniGfEiuYoLSPUdE4Vb2D4zj2NQzC1lRjysRRXs=\n" + "ntor-onion-key-crosscert 1\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf54AU3MlHAEtdPdAyWJzRBnh4brXbCR9JFLjLM40hsBMoscAJ8cHMIc71+p\n" + "Qa+lg5JiYb551mLgtPWLy12xdhog7SXiJl3NvnMgbMZXHDqkU2YZCidnVz+xqMdh\n" + "mjQFK4AtRwg=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "bi4M/AJLZF7/vSNmOj4uhrgKBQA/KfcZy5e58mhGL4owxd9vaWfl3aelvb9jf9zN\n" + "Q7FMv8f9aXzeVIoXIpRJxSKIJgBtG2wnMumIc80pqBvTyGInharszb6njfm0bg1u\n" + "PfJkbQYyf/dA5l5UwCrjFs06ImDmjFTAdsSWf6DfZ/k=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dgxx\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "io16v+e0pK3sbFzPGnkQrAjrRgIOJHrVZ1RXcxZ1+UNXagWM/MOLhQpkU/cw49Wd\n" + "4rQeZD3JQh16330eXbxc97AyDgp0b30He846SI0MfW/DnmGI8ZNeYfLbMv2bmbs9\n" + "QULzyIH8C+5mnMI1arcuiAua+Dpa34F79vgqPuvw5fU=\n" + "-----END SIGNATURE-----\n" + "\n" + "\n" + ; +static const char EX_RI_ED_BAD_CROSSCERT3[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AVB+j+B2yPgGywvp7nvejyhMh9ejKmw7LCwufV83Zl9eAQAgBAConA3B\n" + "jJ3X2tES40jd94rRUFS2/s/Yv7E4LEQ9z0+jz8horNivzK3O/t7IGxJggi+b41/9\n" + "Uaqt+wqtVuKj0xJ9jwBlCXFt28G2P9s4ZyXYgGZqo7MlJlboybnOMvmoTQA=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAPWuEWckT4aYAVNrZzLA8xVwfXp0wzfXeTWBztLS8VzssN6w/+cwXdeY\n" + "N1YNc2DiD3u8f+7kmuZIqL1EFQUwTvRwEzQXm2dqGM7qkm5ZGNMb5FKu+QwO2ImI\n" + "FLNiO5zO/LqP3cf/2L8/DuvruLenUrhRtecGFaHmhDYl+2brHIiPAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMtHTfk0gDvp9+PtIG8Ks7rgCiJZ2aihSvr6WaKHYuIprgspFuga98cg\n" + "D//J80CrgH5Dw68YnkG+gU40IxP7YzhQ4glFlJGu3s2y7Qazcv5ww1XtHur+GDoA\n" + "cY0zCLhltNQFxIsoVUepY97XA6Y2ejYJjyqNXQcAmoPNoVhnTdkhAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key ibZf57LptdOK3WpVFXkYMatEEqPhuVWxsnkwF6638V4=\n" + "ntor-onion-key-crosscert 0\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55AaicDcGMndfa0RLjSN33itFQVLb+z9i/sTgsRD3PT6PPAEbkxCdI/bH/\n" + "B06DAjRuoDiv1HKsGuW+UN1iGEiWu2ieFzf3m0Z7BL9p2u2zIbHYkP50b3T3sebD\n" + "1AksemmMdA0=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "BpLBsl6Yo64QzczJn0TjdcXC1Jv9IhUG2m/Re3v0voCELOP+t5vkZXXLoVL23oKv\n" + "JheSkWiuAIEPsatb4afXZ8wZxPcQjwy3zTOBM7p9CG5fA+KYpqKTxAi+dhVYlcDo\n" + "M7S5nMV63FclkZIT70FFTHwWed1sAKwEO3/Ny24eppc=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 XS4zVi46Xl3xKhuozPCDlW0QRFD4qUhJmkefonQNsRlMVsrPkALnP2tfnfdfTc69hbNa22pOjJNf6Gm505EnAw\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "Q+R3OpO8VhfvFbXuE5qolhVbgosBHy2A5QS91TMzCbsxa8pBA6Li4QdPR37wvdLq\n" + "KayfmmNCMKU5qiZMyXqJZm4fdpxiSi50Z0tYlXM3b2OVfza3+pSOEBl89fN6G4Qc\n" + "pAmM14eEo1UzXrqZw76tMS2CwOYF5vR2xFGCYC0b5hM=\n" + "-----END SIGNATURE-----\n" + "\n" + "\n" + "\n" + ; +static const char EX_RI_ED_BAD_CROSSCERT5[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AaCfOaispi7dJhK0c8HXJHIwoBkMgRpmmHu+3Zce/soMAQAgBAB5bAIo\n" + "5i4TSY/bV2KQAyziRwvgJm+nEiECClflPbP9Um+zOzOgxtDmNnR5UFQj+VWNG4uf\n" + "5lnaryN+PfUXZMTcs8AARof3fFz9tVPINHDrsGvKt8gpzgZEHkVioAXOFwg=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAL3Fr/ovZ9SMGYrAM24taKBm/NpemZaXdD/JeBXFYm5Zs3szLwJC4Etm\n" + "zjNL6tVy+I21O1g3cs16TkflcidsjPXNx//PHAn7bqWMekjrt3SQdkHW2gDPgT2c\n" + "zYJ/hBR96JYG796jP3pkfJz6Iz5uT/ci3A/cdaVbzM1uZbMUgYGzAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMHB+1dWa8BBrKE94vTqfbkSEuysG5LyyZF/WrqHq/3W+ocDLz795k8O\n" + "2Zvgr9im/Ib4hD7IyrtRexcuBdwujdG7cBALdCcWiUTGAMkl96HNETSX+lUVIpJ9\n" + "pMsc9O7+yz+/0Cl2RpILZCdE/7I96qHpZl3tzlRKSu15WeIm5U77AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key GXi0a2VLcRHQMMYys85zu3IPqOn5ZTsOixYyQvTGnQs=\n" + "ntor-onion-key-crosscert 1\n" + "-----BEGIN BUTTERED CRUMPET-----\n" + "AQoABf54AU3MlHAEtdPdAyWJzRBnh4brXbCR9JFLjLM40hsBMoscAJ8cHMIc71+p\n" + "Qa+lg5JiYb551mLgtPWLy12xdhog7SXiJl3NvnMgbMZXHDqkU2YZCidnVz+xqMdh\n" + "mjQFK4AtRwg=\n" + "-----END BUTTERED CRUMPET-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "T9NHMBhuJo+TlfU3TztNgCc9fK1naNRwPOyoqr5R6lJvJ40jkHnIVOFuvuzvZ35O\n" + "QgPbyFcMjv6leV5xcW+/I9tWaBUFXiRGI27qjCFth4Gxq2B6B2dIcQliLXSvW9b+\n" + "CMTgDwVa4h2R2PMh18TRx1596ywE09YhCgBF3CwYsiM=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 sRpiP9kyW/DGOphp4V2VCtcKNA8i7zGuv2tnljNIPTB7r7KsTvdUk/Ha9ArRQEivO4nC2HHENtknDl3GtWIPCA\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "DtORw3+gO/yUUIp70xDaWSOgQZrJAAoZTNCB7q5WCoZOngeaCiC1Gtc+Fmdn7tER\n" + "uPqQC5H/Kh3Mi82PCj0JxvNivnNTNY1AZVaIX5YoioXVOkWF0B2pqMvFuDSdm2oJ\n" + "29PqSVcklquu19EjJRTopIHvYn3sFhQL4LarMsYY11c=\n" + "-----END SIGNATURE-----\n" + "\n" + "\n" + "\n" + ; +static const char EX_RI_ED_BAD_CROSSCERT6[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55ARMMCtQ8pObC5bq02AUE9Lx2bqsZBBkeOsDZVaEq6JavAQAgBABtV0xF\n" + "CsWXL/uFIBnoEsnXBeU1MvYRFrj1vR7QHdWXnxywXvBYUAC8lu/uyc8qqLp+aQSJ\n" + "5JzpDYlg3hp1fl5k97iv5F9WrR6s554YpmgYy9agFaxZ4LmRgz7n0UJ8mwM=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAO5qd1TndKD2pEs1ZLWsHlvfO/E7cA0H7NKGLSioGpBf4P0rtkueX4ci\n" + "kJNa/4Fn/QsLECqEF2lUjkIc8YL+HMS6qteKvN8+nn16DfvnIhPDNZWTJjLl1bOI\n" + "sWSSiduhanoWQnhRtl3Rxg3opdNd9ApO0DLUNy4Qy18Ai6SgksfHAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAJkMYNpK7eJJyGwD/xG/iNg6gzzbIwrOSvmtoP7Rot42qtBiQ9A9kdsy\n" + "sazwkWkM93U1+1OaAADPYxeHoyHnuia95Cnc5y2lFSH3I7gnGGSPKSTwXtdyvDWZ\n" + "P1LbmQ4Bnh5leTCNZ/eFC4/GjNVzqHxjbb8a11dQhA8dOk8PrUq9AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key HdSQOqvLr4YnJE1XzzVIddgKgnjaHKJqnq0GqF4wXDg=\n" + "ntor-onion-key-crosscert 0\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55AW1XTEUKxZcv+4UgGegSydcF5TUy9hEWuPW9HtAd1ZefACVwif1deQry\n" + "K5GeemRa32sGzujVDDe75WRiPKFT3l/EtjTq3oeVq2xwbVJklnG3ASejKTr3YcHt\n" + "ov0jOl0jywc=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN NAUGHTY MARMOSET-----\n" + "BpLBsl6Yo64QzczJn0TjdcXC1Jv9IhUG2m/Re3v0voCELOP+t5vkZXXLoVL23oKv\n" + "JheSkWiuAIEPsatb4afXZ8wZxPcQjwy3zTOBM7p9CG5fA+KYpqKTxAi+dhVYlcDo\n" + "M7S5nMV63FclkZIT70FFTHwWed1sAKwEO3/Ny24eppc=\n" + "-----END NAUGHTY MARMOSET-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 lNY8TRX/FZdH5eFbsBkFHuRi8bPDsE5P+v7zExyD/IXnKS/ffYlP8qw1XIPdEDOIzGQ14+kyPX0SotaAqHRtBA\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "BHamS+epF77iozo5cBt+tbs22m9GhwY55DRXpEWAtvn67jsMnmn7qCOLONigK1RT\n" + "adZNezIydcCxXltgHTdKaZw4lcqv3s0KL8kI8frbBmm7PjXtWnrdXBYY+YK54MN/\n" + "t4N3162o9hzzKSwye0gPjgzpQ1xtEIkzWhBcmE9Vw5s=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_RI_ED_BAD_CROSSCERT7[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AfVmH2ReTyatl4VnS5YREtCM2dwikWuAPffq6M5bysZxAQAgBAAXoqE7\n" + "taqwLDXLZrZukpF1eBkCwYQK9uzctHTuMdqOHChguvkfX7V4H3O76Ayqvz+Z1ut1\n" + "KYRdgiArn3viRaBv3ZKT4Z75suMI3bjqGOSGLAKfOa0uLkOmKblHHhSUkwQ=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAOLNugzUezzzw+N1SuQWzILJYkUJyQDoVXSZjT0dzBplHCjlrv0WZCUP\n" + "/pbonE7SlCChIovHcdiASaLj7MVaGgYDq3M1Vtgt5vhgGl10/+evBAD1QEt8AVfr\n" + "5+PH/sbZvOWucAhNUhOlqFKAn4vdRY39VEEXC5/Jz5fsk1E/DBu5AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKxzg1hsYMS+0zAIrgYxSGO0GbKRrL/VhdlMEGu7ACaoqlGnmGQS3B4B\n" + "gLk8xDdx9N//8+YTx0hUIxP38w08lubPl1WXMq8s7wAiFd06Nklf65mHs0sXVtS1\n" + "EG3f97PQqmBpEJOwYBATNcA9e6F62P8SXNkpSjOzNaE0h9wHNKk7AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key msdr3O4W4bm/xdmZLzj35363ZSFex8yQxLWsV3wRCAQ=\n" + "ntor-onion-key-crosscert 1\n" + "-----BEGIN ED25519 CERT-----\n" + "VQoABx54AU3MlHAEtgPdAyWJzRBnh4brXbCR9JFLjLM40hsBMoscAJ8cHMIc71+p\n" + "Qa+lg5JiYb551mLgtPWLy12xdhog7SXiJl3NvnMgbMZXHDqkU2YZCidnVz+xqMdh\n" + "mjQFK4AtRwg=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "RJJRiU0vjVtRi3bVZru3aTvV5l56X/WOOp/ii316yPAS3aAMpOm1+piFVR5MNqcB\n" + "ZGyrA2Kx0hawdL2buU47iZ12GOCi4f1Es4V4N0TQgJICsKX38DsRdct9c1qMcqpp\n" + "1aENSRuaw0szTIr9OgR7/8stqR5c3iF1H5fOhmTi6xM=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dgxx\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "F3ZqvsyL6RRhPEnNFFIZY4WJM7LK082rseWzRkGNXjwoEwOWUK8enQ4Wjit+wozW\n" + "4HVIY1F+vP7gm6IiOEAFgEpB4C8FGuyoFw2q0ONA2tqTcvBJDDnqbx08FO7v2Dij\n" + "d3ucfc5gf7YNaoFCMMuyAzC56eyNk4U+6cSKy6wnJds=\n" + "-----END SIGNATURE-----\n" + ; + +static const char EX_RI_ED_MISPLACED1[] = + "router fred 127.0.0.1 9001 0 9002\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKT6OIN6TsDB+xcp1uLeE0K3aiHGqa7hdxMBGpvcD0UFSyzpVv1A/fJa\n" + "tClDCwTpfTGbyK2L7AO75Ci0c7jf6Pq+V7L6R7o12g6WBTMrgsceC4YqXSKpXNhi\n" + "oudJyPfVzBfKcJUSynv89FUQOyul/WRRqWTfv0xUsJ3yjuOESfCNAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AbBV9NVz0Hdl0Uiv87LiXaTAoeSXE+bheNG4Dju1GzQHAQAgBAD16h+T\n" + "ygzSgPN4Qat5ITthvm+lvMwMVGbVNWMxNy9i33NGhgp8kqMp2iPAY+LhX8It2b+X\n" + "8H9cBmYLO5G7AlMPj7GsuWdCdP/M/ldMvFfznlqeE3pCpRas6W48CFJ+9Ao=\n" + "-----END ED25519 CERT-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANMO/MepK3uCkKTLRCwIWc/8URVza2gEmDx6mDTJIB/Mw8U8VRDuu4iJ\n" + "v+LL3D8/HGLvT9a8OXbl5525Zszt8XueF3uePBF0Qp0fjGBL8GFqmrmFe6plurPJ\n" + "TfrS/m3q+KhXAUowmghciVGDY0kMiDG9X/t/zKLMKWVDYRZk+fupAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key I8yDO62Flx5O/QsFvgb2ArIRqwJLWetHMeZdxngRl2A=\n" + "ntor-onion-key-crosscert 1\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55AfXqH5PKDNKA83hBq3khO2G+b6W8zAxUZtU1YzE3L2LfAGC1uXxN2KwW\n" + "w4PqRidM1UPZ5jVOHceZYNQcTzzzArfBpr9OraOO2up4TGte8GVqjJNxrZc1gfjn\n" + "CwPW5WxpFg0=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "jLg3D3VO4i0sN8p2qtB6+5C3tai/K4M89mP7z2abQnUTbynOacPoNXIk4o64DjBJ\n" + "kaR42yfA7yQZ8Rj8abwgz0Zz6zbd+JjE+s/EklrEEtOl+jZAl3i+92FaHROJojXq\n" + "hw+ZEPOb9zgb1UQ7S1Fo+GoqA5bdGm/Wg1kSQielkNE=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 TRKvIl/wIIRD4Xcmd6HYmy7tD0KhVGgoStpWPtX0zmXGZ7+jugItrY0frDu9n82syiruuA45ZOs1Rfi4CbOSCg\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "NYpRfurB1YhFmDAdRc2Sd77S7By2V/0kgEHpJhtySb7efiQsyOA4ZBr1zEFPAXdp\n" + "TviKzyS9kN2fnz3hORoqFul33BDZbiLMNLtt5tzp62TYtmIg9IZdjjczbJUgbVLt\n" + "KCJL0vM7fdbXkZX61GIBbMYwzwIiHvVxG7F/AS5RbtE=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_RI_ED_MISPLACED2[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55AfJo9FIePrxeDNnWT6SWkoz0/L27018XjUNWEHfaR06MAQAgBAAMgolK\n" + "nLg3ZnVv0skzHCfmX+ZR9Ttwj7FNXfhXCsyr860S79OW5LD0/m1GcS9JflWhP+FO\n" + "ng5cRb+aqNc8Ul+/4sQudZRx8w4U3d5rOuMGCqhQXnktH9AFzQHFq0jpAAU=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAPeK/znKLRvSUmCIUiZOgfhiRFt7XGN//C2GFuey4xkKiIr9LWMuVe9m\n" + "Wx39Ea2UGEtNGCEVvZdJMDVRl7heFTfJTN4L1YeyWx6iNRWlpAmgQOKII7slHwlq\n" + "seEULOLOXc9AsU/v9ba9G54DFbHfe2k44ZOwEmaQZW5VF/I0YMMdAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKFRzlrqPPxEW0nboAJ1qzKFb/vFtvRW0xNVb8RtbOY/NY5FV1hS8yfH\n" + "igtugkrOBmWah7cmJhiON2j+TKeBxEoXwJMZeyV+HLbr7nY/mFhad4BQ3Frkl8d6\n" + "1kQMhOJswMdwnnVHPNGUob4YAX0SpFA6MpBVj92zmMBeaihqUS9VAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key br8svioLcJCAQxoo3KvlT288p8rb4lQIZNLlplkIKkw=\n" + "ntor-onion-key-crosscert 0\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55AQyCiUqcuDdmdW/SyTMcJ+Zf5lH1O3CPsU1d+FcKzKvzAG9XqwmRm0uJ\n" + "E49NoHcWr9IzdIwSGo+PJSkVpk95a5p2s065BetCWxEEBJQniajQf2hZ36zmV9rq\n" + "a6puqkEAKAM=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "d6QGIVAJL5JjHUyV+aicLIdBYyxHwviKpPcp7uldRF8vfDGFpu0qFgJ5KT+3t36w\n" + "QY1r75bvUMG/ZzGKDg95dcK0X2AK6GFlcrYyCoQEVOsuPc1QEUeK9P2s7viNQE4V\n" + "tRwG/CvJhPfcnxErzVGfXIeYRL1r/hPNFDZSeSxPPM0=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "router-sig-ed25519 ts9pFk8PnDWtXgQad09XC/ZCbruSx1U1pNOMWF9fyoNG0CodxdDH9Vglg+BOS7Nd9fmsINfPWKCVdVuSSM7zCA\n" + "reject *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "YMl6mpQm7UCsPQhZKMm0aZ7fzGevWzRbQO+de20HTn7fVqMWQf2hBDJe9QTN/uDK\n" + "/VKYT8SnIBexbrSMy1N5q8kNFKxxUtwA9GRtz620Vvc4m+lz/tnT9qucIKCDL5iJ\n" + "eRpnls0JoAMIHKl99zdUioYubmOZuqUaRAdT8ulWy+Y=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_RI_ED_BAD_CERT1[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55AYf+rX8a5rzdTBGPvLdQIP8XcElDDQnJIruGqfDTj+tjAP+3XOL2UTmn\n" + "Hu39PbLZV+m9DIj/DvG38M0hP4MmHUjP/iZG5PaCX6/aMe+nQSNuTl0IDGpIo1l8\n" + "dZToQTFSzAQ=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAM4o2DrTwn3wrvUMm41S/hFL5ZtRHGRDh26o8htn14AKMC65vpygKFY7\n" + "fUQVClAiJthAs5fD/8sE5XDtQrLnFv5OegQx8kSPuwyS/+5pI1bdxRJvKMOUl2Tc\n" + "fAUhzeNBmPvW3lMi9Fksw5sCSAKQ5VH/+DlYvBGZIO49pTnOAty1AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMzIsJeEWWjN3Lp6qrzaJGn8uhJPJyjy2Wt3sp7z7iD/yBWW6Q7Jku3e\n" + "C5QfKmSmNi2pNjS0SqPjqZZNsbcxpq/bEOcZdysZG1lqi/QgxUevk57RWjh3EFsG\n" + "TwK3ougKWB5Q6/3m32dNsnnnDqzVapgZo7Zd3V/aCo0BVtL5VXZbAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key W28nwT/5FJ818M78y/5sNOkxhQ7ENBhjVhGG2j6KvFY=\n" + "ntor-onion-key-crosscert 0\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55AYf+rX8a5rzdTBGPvLdQIP8XcElDDQnJIruGqfDTj+tjAP+3XOL2UTmn\n" + "Hu39PbLZV+m9DIj/DvG38M0hP4MmHUjP/iZG5PaCX6/aMe+nQSNuTl0IDGpIo1l8\n" + "dZToQTFSzAQ=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "FWnEjvFob0ObgqohMT7miwGsAuioCT7Urz6tyWaGWph/TP9hbFWj4MPK5mt998mn\n" + "xA8zHSF5n/edu7wVX+rtnPrYPBmg+qN8+Pq6XMg64CwtWu+sqigsi6vtz/TfAIDL\n" + "mypENmSY32sWPvy/CA8dAZ2ASh57EH9a+WcFModpXkM=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 88YqJdGJS4O6XiUCNrc9xbOHxujvcN/TkCoRuQQeKfZGHM+4IhI6AcXFlPIfDYq0SAavMhVmzsDDw0ROl7vyCQ\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "cU4WDO3w9ZfVRbNUgxOQMbwS2xWXvaL+cZmIV6AAjAZVWkLEpif4g6uYu+jJUZOS\n" + "NUT7lNOMwTu4tE4b1YJpnD9T8iW0DlOXxlvRBMQYmKwhQuYk898BDGTSk+0AY0HJ\n" + "vv8wRVewDajNhW7tFY907IdHvPXG0u83GANxkYrRyUg=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_RI_ED_BAD_CERT2[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN WOBBLY RUTABAGA-----\n" + "helo\n" + "-----END WOBBLY RUTABAGA-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANZvqyqFeiekh8ApqIGK4ZtOqjaX87EzDestvAWwamVOXiPoUrzXgM3O\n" + "l8uuTnMA4TfnjLyyA2TnaMzJylOI1OMHuW/D9B/liWDstSxWNNIlKgLQ/Dh9xBS7\n" + "uQb2PYlI+iMkPKPyJQSTDdGHE7cdFPewUfhRtJU3F5ztm/3FLBFvAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANZl8U/Z8KCPS7EBDzt8i9kNETXS7vnp9gnw3BQNXfjiDtDg9eO7ChxY\n" + "NBwuOTXmRxfX3W9kvZ0op9Hno6hixIhHzDql+vZ+hN7yPanVVDglSUXcr31yBm5K\n" + "kA+ZnRvH3oVQ97E4rRzpi09dtI13Pzu7JS5jRMtH+JF1kQBoNC0dAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key lUrEL+TVXpjjHQ2BIKk34vblyDmoyMro1a6/9hJ4VRc=\n" + "ntor-onion-key-crosscert 0\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55Abm5E7FBdd3F8N1xuz/vdv03zh2lABrmGjzPQ3AFJtntALNeQTgjv0JL\n" + "jON4+SPNi0B2Bva3yKaSsdxiHQ1rIwQqIUVkzXmmX4jmsvJK/9gERAdD7GafTKZQ\n" + "BaZbNXBvmQw=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "OxkqFsw1vHUQ9iPYcKC/MHUBtbLPK6JY2i81ccAai2eW118UXcTbeCRccrXyqSkl\n" + "RLcooZyli1D6wg9x7O8+2+HXIbUa6WcTOD1Qi7Z9wKZfk4sDUy7QHKENMRfAXwX3\n" + "U/gqd4BflMPp4+XrYfPzz+6yQPWp0t9wXbFv5hZ9F3k=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 fW6Bt4R3xVk5KMDyOcYg8n5ANP0OrQq2PQFK2cW0lTAdi+eX+oT/BeWnkrn0uSWOC/t4omCmH4Rdl8M9xtpfBA\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "DHxiQXuLxZR0ylqwUGGePgN4KF4ItlOV/DuGmmszCO/Ut0p+5s4FP2v6Mm9M92Wj\n" + "75rS9xF/Ts0Kf49dvgc+c5VTvhX5I5SwGQkRk0RNJtNoP0t+qXBHaFV8BlAeaWF6\n" + "Lg3O+GUK325fQv9uDPCe37mFQV9jafAzsZUrO/ggb1U=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_RI_ED_BAD_CERT3[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "BVVVnf55AW5TTGF9jCMl7aALZzqypD9Bj8WYnAPIrKCoIJdgMbY0AQAgBAB7eCn8\n" + "rukx7t/egZUdqU7+FYqsnO4wdmOkLZkp0+gpF3jjk6N1Q0037NNVNZBjONB0Nm2F\n" + "CpB3nWSJliSSKr5tOYsuBPFy5VVGYeKPakpOoxanQ1UcqevMBAQy0zf9hwA=\n" + "-----END ED25519 CERT-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAPgeQNbKwpnTU+qW/2djh66hptS9rcy1B4vdyWkDTdREao2ECuCv691Y\n" + "oIw3MpTWvpC1qHIKorunusR0FKgwXw3xQTikXbDq/1ptsekzoIA1R/hltQV3UuGH\n" + "zdzHuQXAMX7Fdll2gyya03c3Yq5s+xSDvGdkEeaIoctKjwxp4SdNAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAOzWuH4cPW9rIrfi8MrruMUg4IUVHz4BxfY4/szMIUvzeEAdHn4FYkWy\n" + "Vt7MDtUELZsmZeFNmkn72kLxnrdZ5XhxZBriq1Fzq11cSWRBF+SyE1MdcouY4GyG\n" + "drw6T8xb8ty19q0eO6C/gw27iqXPAp1clvkroLg6Nv9lGZvsedVDAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key /vYZ+9yLqG7yUnutoI57s96JBl36GTz0IDWE244rbzE=\n" + "ntor-onion-key-crosscert 0\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55AZ4zVBWP/fIYEgWmyj0WpO6CkXRJjtrWXtiT02k3IddiAMpYgMemGIpN\n" + "xj7TQRULsHHYvo4fLcKrSgndQbUUhfLTUuVhIzbnE2TBLMVOEkpxKU6mTuvTT/3h\n" + "MJugrwTWVg4=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "c/Vqu3wtsTsYMdnhTS9Tn1Pq6jDmH4uRD5WmbaCKKrkin2DjuYSMVpypndkdlZDE\n" + "He7uF7SUO3QG/UcRIXYOsg9MSLUmvn2kIwef8ykyqlRh95Csjo5DyattUhL2w4QF\n" + "tJkJBQAnXWaAVW1O8XimGCAvJ84cxbmZEcpN6WKjrXI=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 Ue7bkPpOoc8ca7cyQj/Vq3BP5X4vwLA5QmpLGw/WfRNVRPojJRxU3RVqWMi3JbsJFRTe6pH6ZHyXER33G5aAAA\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "ifKUtbxmqHVs8A0oT5n7Te0c6D/XqWQTc0RxX9OKGspzh6wNX26h0Xa2vpK1Q9Zu\n" + "sj61I7vbHuZN6rxiWs9IzJgb//XaNJasX1pd9tbGSXW+yYzc9G9kaa7vp3HcnhIP\n" + "XVWzzS8WmOiVNGcF65j6f7yGloTgN7cHMptgJG7pWes=\n" + "-----END SIGNATURE-----\n" + "\n" + ; +static const char EX_RI_BAD_EI_DIGEST2[] = + "router fred 127.0.0.1 9001 0 9002\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf55ATrK8IVBWLO2yXKCqXLXJOTu89W2b+hREPO+tCrxjVqWAQAgBACG/vVx\n" + "NK8wKVZvf34d75ZObSR0ge1N2RrAIKNslNXBq/tcllIrNE4S0ZNcMpA+hxXoVFeo\n" + "jbxifYX7nTs5N3GrGPmkiuo82v2X6ZwoIXJGFnvWMxCjsYsUVDDxoT6h/w8=\n" + "-----END ED25519 CERT-----\n" + "extra-info-digest E5FAC29E766D63F96AD175069640E803F2723765 99oo\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAK9wHSdRalxkuAybrSCA3dlEC1ZGc7oHOzXRGLg+z6batuiCdQtus1Rk\n" + "LP821eZJtEMAE56aewCIHDcTiCxVa6DMqmxRjm5pfW4G5H5QCPYT6Fu0RoYck3Ef\n" + "vkgits5/fNYGPPVC7k8AdGax5dKj5oFVGq+JWolYFRv6tyR9AThvAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKxjxTQ/T/MHpFbk7/zwA7l5b3IW3yVcyVe6eIGFoYun8FI0fbYRmR4M\n" + "G5Asu07gP9Bbgt3AFPuEqrjg4u+lIkgqTcCgKWJbAgm7fslwaDTXQ36A7I1M95PD\n" + "GJ10Dk5v4dVbrqwoF7MSrQPFtMO91RP11nGPSvDqXZJ4XpwqwdxpAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key LuVmHxpj4F5mPXGNi4MtxbIbLMav6frJRBsRgAvpdzo=\n" + "ntor-onion-key-crosscert 0\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf55AYb+9XE0rzApVm9/fh3vlk5tJHSB7U3ZGsAgo2yU1cGrAKBcSzwi4lY/\n" + "salCELOLdeZzOjDNnBd6cKp2WJg7Yz5zFlbVbyNk0iwfGmucHk8vQZe5BS0Oq/Pz\n" + "B1u/BcJv8gk=\n" + "-----END ED25519 CERT-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "QsAQVdDVHtasDbhrZG4ZxImdTTMY7fz3vouAiGyZx6/jCCB5v0gHwTn4xo6pgLEW\n" + "LQfMhQZIr76Ky67c0hAN2hihuDlfvhfVe9c2c5UOH1BOhq3llE3Hc3xGyEy3rw7r\n" + "5y38YGi759CvsP2/L8JfXMuBg89OcgJYFa27Q6e6MdQ=\n" + "-----END CROSSCERT-----\n" + "published 2014-10-05 12:00:00\n" + "bandwidth 1000 1000 1000\n" + "reject *:*\n" + "router-sig-ed25519 5zoQ0dufeeOJ/tE/BgcWgM8JpfW1ELSXLz4dI+K8YRH/gUtaPmYJgU2QfeUHD0oy1iwv4Qvl8Ferga7aBk1+DA\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "D6KRMwkb6JmVEnpZ825SD3LMB84UmVy0i94xk44OwhoWNKLXhaSTWJgf6AqnPG5o\n" + "QrCypSb44bYLn+VaDN5LVUl36jeZqCT4xd+4ZwIRdPOUj7vcVmyUDg3lXcAIk97Q\n" + "E5PrQY1mQuLSIjjKInAR2NRBumNJtRw31Y/DTB7tODU=\n" + "-----END SIGNATURE-----\n" + "\n" + ; diff --git a/src/wraith/src/test/fakechans.h b/src/wraith/src/test/fakechans.h new file mode 100644 index 000000000..ab5d8461b --- /dev/null +++ b/src/wraith/src/test/fakechans.h @@ -0,0 +1,25 @@ + /* Copyright (c) 2014-2017, The Tor Project, Inc. */ + /* See LICENSE for licensing information */ + +#ifndef TOR_FAKECHANS_H +#define TOR_FAKECHANS_H + +/** + * \file fakechans.h + * \brief Declarations for fake channels for test suite use + */ + +void make_fake_cell(cell_t *c); +void make_fake_var_cell(var_cell_t *c); +channel_t * new_fake_channel(void); +void free_fake_channel(channel_t *c); + +/* Also exposes some a mock used by both test_channel.c and test_relay.c */ +void scheduler_channel_has_waiting_cells_mock(channel_t *ch); +void scheduler_release_channel_mock(channel_t *ch); + +/* Query some counters used by the exposed mocks */ +int get_mock_scheduler_has_waiting_cells_count(void); + +#endif /* !defined(TOR_FAKECHANS_H) */ + diff --git a/src/wraith/src/test/fuzz/dict/consensus b/src/wraith/src/test/fuzz/dict/consensus new file mode 100644 index 000000000..3fcd9ee7f --- /dev/null +++ b/src/wraith/src/test/fuzz/dict/consensus @@ -0,0 +1,52 @@ +"a" +"additional-digest" +"additional-signature" +"bandwidth-weights" +"client-versions" +"consensus-digest" +"consensus-method" +"consensus-methods" +"contact" +"dir-address" +"directory-footer" +"directory-signature" +"dir-identity-key" +"dir-key-certificate-version" +"dir-key-certification" +"dir-key-crosscert" +"dir-key-expires" +"dir-key-published" +"dir-signing-key" +"dir-source" +"fingerprint" +"fresh-until" +"id" +"known-flags" +"legacy-dir-key" +"m" +"network-status-version" +"opt" +"p" +"package" +"params" +"pr" +"published" +"r" +"recommended-client-protocols" +"recommended-relay-protocols" +"required-client-protocols" +"required-relay-protocols" +"s" +"server-versions" +"shared-rand-commit" +"shared-rand-current-value" +"shared-rand-participate" +"shared-rand-previous-value" +"signing-ed25519" +"v" +"valid-after" +"valid-until" +"vote-digest" +"vote-status" +"voting-delay" +"w" diff --git a/src/wraith/src/test/fuzz/dict/descriptor b/src/wraith/src/test/fuzz/dict/descriptor new file mode 100644 index 000000000..110ee3e82 --- /dev/null +++ b/src/wraith/src/test/fuzz/dict/descriptor @@ -0,0 +1,41 @@ +"reject" +"accept" +"reject6" +"accept6" +"router" +"ipv6-policy" +"signing-key" +"onion-key" +"ntor-onion-key" +"router-signature" +"published" +"uptime" +"fingerprint" +"hibernating" +"platform" +"proto" +"contact" +"read-history" +"write-history" +"extra-info-digest" +"hidden-service-dir" +"identity-ed25519" +"master-key-ed25519" +"router-sig-ed25519" +"onion-key-crosscert" +"ntor-onion-key-crosscert" +"allow-single-hop-exits" +"family" +"caches-extra-info" +"or-address" +"opt" + "bandwidth" +"@purpose" +"tunnelled-dir-server" +"-----BEGIN" +"-----END" +"-----" +"ED25519 CERT" +"RSA PUBLIC KEY" +"CROSSCERT" +"SIGNATURE" diff --git a/src/wraith/src/test/fuzz/dict/extrainfo b/src/wraith/src/test/fuzz/dict/extrainfo new file mode 100644 index 000000000..eba7a1e4c --- /dev/null +++ b/src/wraith/src/test/fuzz/dict/extrainfo @@ -0,0 +1,32 @@ +"cell-circuits-per-decile" +"cell-processed-cells" +"cell-queued-cells" +"cell-stats-end" +"cell-time-in-queue" +"dirreq-stats-end" +"dirreq-v2-direct-dl" +"dirreq-v2-ips" +"dirreq-v2-reqs" +"dirreq-v2-resp" +"dirreq-v2-share" +"dirreq-v2-tunneled-dl" +"dirreq-v3-direct-dl" +"dirreq-v3-ips" +"dirreq-v3-reqs" +"dirreq-v3-resp" +"dirreq-v3-share" +"dirreq-v3-tunneled-dl" +"entry-ips" +"entry-stats-end" +"exit-kibibytes-read" +"exit-kibibytes-written" +"exit-stats-end" +"exit-streams-opened" +"extra-info" +"identity-ed25519" +"opt" +"published" +"read-history" +"router-sig-ed25519" +"router-signature" +"write-history" diff --git a/src/wraith/src/test/fuzz/dict/hsdescv2 b/src/wraith/src/test/fuzz/dict/hsdescv2 new file mode 100644 index 000000000..48788301d --- /dev/null +++ b/src/wraith/src/test/fuzz/dict/hsdescv2 @@ -0,0 +1,8 @@ +"introduction-points" +"permanent-key" +"protocol-versions" +"publication-time" +"rendezvous-service-descriptor" +"secret-id-part" +"signature" +"version" diff --git a/src/wraith/src/test/fuzz/dict/hsdescv3 b/src/wraith/src/test/fuzz/dict/hsdescv3 new file mode 100644 index 000000000..84e8db578 --- /dev/null +++ b/src/wraith/src/test/fuzz/dict/hsdescv3 @@ -0,0 +1,6 @@ +"hs-descriptor" +"descriptor-lifetime" +"descriptor-signing-key-cert" +"revision-counter" +"superencrypted" +"signature" diff --git a/src/wraith/src/test/fuzz/dict/http b/src/wraith/src/test/fuzz/dict/http new file mode 100644 index 000000000..3b0531579 --- /dev/null +++ b/src/wraith/src/test/fuzz/dict/http @@ -0,0 +1,24 @@ +# +# AFL dictionary for the Tor Directory protocol's HTTP headers +# ------------------------------------------------------------ +# +# Extracted from directory_handle_command() in the tor source code +# +# Copyright (c) 2016-2017, The Tor Project, Inc. +# See LICENSE for licensing information +# +# Usage: +# Select the dictionaries relevant to the part of the directory protocol you +# are fuzzing, and feed them to your fuzzer (if it supports dictionaries). + +http_header_body_delimiter = "\x0d\x0a\x0d\x0a" +http_header_header_delimiter = "\x0d\x0a" +# multi-character tokens only +#http_header_value_delimiter = " " + +content_length_header = "Content-Length:" +forwarded_for_header = "Forwarded-For:" +x_forwarded_for_header = "X-Forwarded-For:" + +get_command = "GET" +post_command = "POST" diff --git a/src/wraith/src/test/fuzz/dict/iptsv2 b/src/wraith/src/test/fuzz/dict/iptsv2 new file mode 100644 index 000000000..57791c5e3 --- /dev/null +++ b/src/wraith/src/test/fuzz/dict/iptsv2 @@ -0,0 +1,6 @@ +"introduction-point" +"ip-address" +"onion-port" +"onion-key" +"service-key" + diff --git a/src/wraith/src/test/fuzz/dict/microdesc b/src/wraith/src/test/fuzz/dict/microdesc new file mode 100644 index 000000000..fdd0567b6 --- /dev/null +++ b/src/wraith/src/test/fuzz/dict/microdesc @@ -0,0 +1,7 @@ +"onion-key" +"ntor-onion-key" +"id" +"a" +"family" +"p" +"p6" diff --git a/src/wraith/src/test/fuzz/fixup_filenames.sh b/src/wraith/src/test/fuzz/fixup_filenames.sh new file mode 100644 index 000000000..68efc1abc --- /dev/null +++ b/src/wraith/src/test/fuzz/fixup_filenames.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +set -e + +if [ ! -d "$1" ] ; then + echo "I need a directory" + exit 1 +fi + +for fn in "$1"/* ; do + prev=`basename "$fn"` + post=`sha256sum "$fn" | sed -e 's/ .*//;'` + if [ "$prev" == "$post" ] ; then + echo "OK $prev" + else + echo "mv $prev $post" + mv "$fn" "$1/$post" + fi +done diff --git a/src/wraith/src/test/fuzz/fuzz_consensus.c b/src/wraith/src/test/fuzz/fuzz_consensus.c new file mode 100644 index 000000000..6610ade7a --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_consensus.c @@ -0,0 +1,78 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +#define ROUTERPARSE_PRIVATE +#include "or.h" +#include "routerparse.h" +#include "networkstatus.h" +#include "fuzzing.h" + +static void +mock_dump_desc__nodump(const char *desc, const char *type) +{ + (void)desc; + (void)type; +} + +static int +mock_router_produce_hash_final__nohash(char *digest, + const char *start, size_t len, + digest_algorithm_t alg) +{ + (void)start; + (void)len; + /* we could look at start[..] */ + if (alg == DIGEST_SHA1) + memset(digest, 0x01, 20); + else + memset(digest, 0x02, 32); + return 0; +} + +static int +mock_signed_digest_equals__yes(const uint8_t *d1, const uint8_t *d2, + size_t len) +{ + (void) tor_memeq(d1, d2, len); + return 1; +} + +int +fuzz_init(void) +{ + disable_signature_checking(); + MOCK(dump_desc, mock_dump_desc__nodump); + MOCK(router_compute_hash_final, mock_router_produce_hash_final__nohash); + MOCK(signed_digest_equals, mock_signed_digest_equals__yes); + ed25519_init(); + return 0; +} + +int +fuzz_cleanup(void) +{ + return 0; +} + +int +fuzz_main(const uint8_t *data, size_t sz) +{ + networkstatus_t *ns; + char *str = tor_memdup_nulterm(data, sz); + const char *eos = NULL; + networkstatus_type_t tp = NS_TYPE_CONSENSUS; + if (tor_memstr(data, MIN(sz, 1024), "tus vote")) + tp = NS_TYPE_VOTE; + const char *what = (tp == NS_TYPE_CONSENSUS) ? "consensus" : "vote"; + ns = networkstatus_parse_vote_from_string(str, + &eos, + tp); + if (ns) { + log_debug(LD_GENERAL, "Parsing as %s okay", what); + networkstatus_vote_free(ns); + } else { + log_debug(LD_GENERAL, "Parsing as %s failed", what); + } + tor_free(str); + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzz_descriptor.c b/src/wraith/src/test/fuzz/fuzz_descriptor.c new file mode 100644 index 000000000..1a50beae1 --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_descriptor.c @@ -0,0 +1,79 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +#define ROUTERPARSE_PRIVATE +#include "or.h" +#include "routerparse.h" +#include "routerlist.h" +#include "routerkeys.h" +#include "fuzzing.h" + +static int +mock_check_tap_onion_key_crosscert__nocheck(const uint8_t *crosscert, + int crosscert_len, + const crypto_pk_t *onion_pkey, + const ed25519_public_key_t *master_id_pkey, + const uint8_t *rsa_id_digest) +{ + tor_assert(crosscert && onion_pkey && master_id_pkey && rsa_id_digest); + /* we could look at crosscert[..] */ + (void) crosscert_len; + return 0; +} + +static void +mock_dump_desc__nodump(const char *desc, const char *type) +{ + (void)desc; + (void)type; +} + +static int +mock_router_produce_hash_final__nohash(char *digest, + const char *start, size_t len, + digest_algorithm_t alg) +{ + (void)start; + (void)len; + /* we could look at start[..] */ + if (alg == DIGEST_SHA1) + memset(digest, 0x01, 20); + else + memset(digest, 0x02, 32); + return 0; +} + +int +fuzz_init(void) +{ + disable_signature_checking(); + MOCK(check_tap_onion_key_crosscert, + mock_check_tap_onion_key_crosscert__nocheck); + MOCK(dump_desc, mock_dump_desc__nodump); + MOCK(router_compute_hash_final, mock_router_produce_hash_final__nohash); + ed25519_init(); + return 0; +} + +int +fuzz_cleanup(void) +{ + return 0; +} + +int +fuzz_main(const uint8_t *data, size_t sz) +{ + routerinfo_t *ri; + const char *str = (const char*) data; + ri = router_parse_entry_from_string((const char *)str, + str+sz, + 0, 0, 0, NULL); + if (ri) { + log_debug(LD_GENERAL, "Parsing okay"); + routerinfo_free(ri); + } else { + log_debug(LD_GENERAL, "Parsing failed"); + } + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzz_diff.c b/src/wraith/src/test/fuzz/fuzz_diff.c new file mode 100644 index 000000000..642380b51 --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_diff.c @@ -0,0 +1,69 @@ +/* Copyright (c) 2016, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFF_PRIVATE + +#include "orconfig.h" +#include "or.h" +#include "consdiff.h" + +#include "fuzzing.h" + +static int +mock_consensus_compute_digest_(const char *c, consensus_digest_t *d) +{ + (void)c; + memset(d->sha3_256, 3, sizeof(d->sha3_256)); + return 0; +} + +int +fuzz_init(void) +{ + MOCK(consensus_compute_digest, mock_consensus_compute_digest_); + MOCK(consensus_compute_digest_as_signed, mock_consensus_compute_digest_); + return 0; +} + +int +fuzz_cleanup(void) +{ + UNMOCK(consensus_compute_digest); + UNMOCK(consensus_compute_digest_as_signed); + return 0; +} + +int +fuzz_main(const uint8_t *stdin_buf, size_t data_size) +{ +#define SEP "=====\n" +#define SEPLEN strlen(SEP) + const uint8_t *separator = tor_memmem(stdin_buf, data_size, SEP, SEPLEN); + if (! separator) + return 0; + size_t c1_len = separator - stdin_buf; + char *c1 = tor_memdup_nulterm(stdin_buf, c1_len); + size_t c2_len = data_size - c1_len - SEPLEN; + char *c2 = tor_memdup_nulterm(separator + SEPLEN, c2_len); + + char *c3 = consensus_diff_generate(c1, c2); + + if (c3) { + char *c4 = consensus_diff_apply(c1, c3); + tor_assert(c4); + if (strcmp(c2, c4)) { + printf("%s\n", escaped(c1)); + printf("%s\n", escaped(c2)); + printf("%s\n", escaped(c3)); + printf("%s\n", escaped(c4)); + } + tor_assert(! strcmp(c2, c4)); + tor_free(c3); + tor_free(c4); + } + tor_free(c1); + tor_free(c2); + + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzz_diff_apply.c b/src/wraith/src/test/fuzz/fuzz_diff_apply.c new file mode 100644 index 000000000..8d7bf751b --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_diff_apply.c @@ -0,0 +1,65 @@ +/* Copyright (c) 2016, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFF_PRIVATE + +#include "orconfig.h" +#include "or.h" +#include "consdiff.h" + +#include "fuzzing.h" + +static int +mock_consensus_compute_digest_(const char *c, consensus_digest_t *d) +{ + (void)c; + memset(d->sha3_256, 3, sizeof(d->sha3_256)); + return 0; +} + +static int +mock_consensus_digest_eq_(const uint8_t *a, const uint8_t *b) +{ + (void)a; + (void)b; + return 1; +} + +int +fuzz_init(void) +{ + MOCK(consensus_compute_digest, mock_consensus_compute_digest_); + MOCK(consensus_digest_eq, mock_consensus_digest_eq_); + return 0; +} + +int +fuzz_cleanup(void) +{ + UNMOCK(consensus_compute_digest); + UNMOCK(consensus_digest_eq); + return 0; +} + +int +fuzz_main(const uint8_t *stdin_buf, size_t data_size) +{ +#define SEP "=====\n" +#define SEPLEN strlen(SEP) + const uint8_t *separator = tor_memmem(stdin_buf, data_size, SEP, SEPLEN); + if (! separator) + return 0; + size_t c1_len = separator - stdin_buf; + char *c1 = tor_memdup_nulterm(stdin_buf, c1_len); + size_t c2_len = data_size - c1_len - SEPLEN; + char *c2 = tor_memdup_nulterm(separator + SEPLEN, c2_len); + + char *c3 = consensus_diff_apply(c1, c2); + + tor_free(c1); + tor_free(c2); + tor_free(c3); + + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzz_extrainfo.c b/src/wraith/src/test/fuzz/fuzz_extrainfo.c new file mode 100644 index 000000000..2a3de7ecf --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_extrainfo.c @@ -0,0 +1,65 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +#define ROUTERPARSE_PRIVATE +#include "or.h" +#include "routerparse.h" +#include "routerlist.h" +#include "routerkeys.h" +#include "fuzzing.h" + +static void +mock_dump_desc__nodump(const char *desc, const char *type) +{ + (void)desc; + (void)type; +} + +static int +mock_router_produce_hash_final__nohash(char *digest, + const char *start, size_t len, + digest_algorithm_t alg) +{ + (void)start; + (void)len; + /* we could look at start[..] */ + if (alg == DIGEST_SHA1) + memset(digest, 0x01, 20); + else + memset(digest, 0x02, 32); + return 0; +} + +int +fuzz_init(void) +{ + disable_signature_checking(); + MOCK(dump_desc, mock_dump_desc__nodump); + MOCK(router_compute_hash_final, mock_router_produce_hash_final__nohash); + ed25519_init(); + return 0; +} + +int +fuzz_cleanup(void) +{ + return 0; +} + +int +fuzz_main(const uint8_t *data, size_t sz) +{ + extrainfo_t *ei; + const char *str = (const char*) data; + int again = 0; + ei = extrainfo_parse_entry_from_string((const char *)str, + str+sz, + 0, NULL, &again); + if (ei) { + log_debug(LD_GENERAL, "Parsing okay"); + extrainfo_free(ei); + } else { + log_debug(LD_GENERAL, "Parsing failed"); + } + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzz_hsdescv2.c b/src/wraith/src/test/fuzz/fuzz_hsdescv2.c new file mode 100644 index 000000000..19db26571 --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_hsdescv2.c @@ -0,0 +1,52 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +#define ROUTERPARSE_PRIVATE +#include "or.h" +#include "routerparse.h" +#include "rendcommon.h" +#include "fuzzing.h" + +static void +mock_dump_desc__nodump(const char *desc, const char *type) +{ + (void)desc; + (void)type; +} + +int +fuzz_init(void) +{ + disable_signature_checking(); + MOCK(dump_desc, mock_dump_desc__nodump); + ed25519_init(); + return 0; +} + +int +fuzz_cleanup(void) +{ + return 0; +} + +int +fuzz_main(const uint8_t *data, size_t sz) +{ + rend_service_descriptor_t *desc = NULL; + char desc_id[64]; + char *ipts = NULL; + size_t ipts_size, esize; + const char *next; + char *str = tor_memdup_nulterm(data, sz); + (void) rend_parse_v2_service_descriptor(&desc, desc_id, &ipts, &ipts_size, + &esize, &next, str, 1); + if (desc) { + log_debug(LD_GENERAL, "Parsing okay"); + rend_service_descriptor_free(desc); + } else { + log_debug(LD_GENERAL, "Parsing failed"); + } + tor_free(ipts); + tor_free(str); + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzz_hsdescv3.c b/src/wraith/src/test/fuzz/fuzz_hsdescv3.c new file mode 100644 index 000000000..428774e33 --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_hsdescv3.c @@ -0,0 +1,99 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define ROUTERPARSE_PRIVATE +#define HS_DESCRIPTOR_PRIVATE + +#include "or.h" +#include "ed25519_cert.h" /* Trunnel interface. */ +#include "crypto_ed25519.h" +#include "hs_descriptor.h" +#include "routerparse.h" +#include "util.h" + +#include "fuzzing.h" + +static void +mock_dump_desc__nodump(const char *desc, const char *type) +{ + (void)desc; + (void)type; +} + +static int +mock_rsa_ed25519_crosscert_check(const uint8_t *crosscert, + const size_t crosscert_len, + const crypto_pk_t *rsa_id_key, + const ed25519_public_key_t *master_key, + const time_t reject_if_expired_before) +{ + (void) crosscert; + (void) crosscert_len; + (void) rsa_id_key; + (void) master_key; + (void) reject_if_expired_before; + return 0; +} + +static size_t +mock_decrypt_desc_layer(const hs_descriptor_t *desc, + const uint8_t *encrypted_blob, + size_t encrypted_blob_size, + int is_superencrypted_layer, + char **decrypted_out) +{ + (void)is_superencrypted_layer; + (void)desc; + const size_t overhead = HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN; + if (encrypted_blob_size < overhead) + return 0; + *decrypted_out = tor_memdup_nulterm( + encrypted_blob + HS_DESC_ENCRYPTED_SALT_LEN, + encrypted_blob_size - overhead); + size_t result = strlen(*decrypted_out); + if (result) { + return result; + } else { + tor_free(*decrypted_out); + return 0; + } +} + +int +fuzz_init(void) +{ + disable_signature_checking(); + MOCK(dump_desc, mock_dump_desc__nodump); + MOCK(rsa_ed25519_crosscert_check, mock_rsa_ed25519_crosscert_check); + MOCK(decrypt_desc_layer, mock_decrypt_desc_layer); + ed25519_init(); + return 0; +} + +int +fuzz_cleanup(void) +{ + return 0; +} + +int +fuzz_main(const uint8_t *data, size_t sz) +{ + hs_descriptor_t *desc = NULL; + uint8_t subcredential[DIGEST256_LEN]; + + char *fuzzing_data = tor_memdup_nulterm(data, sz); + memset(subcredential, 'A', sizeof(subcredential)); + + hs_desc_decode_descriptor(fuzzing_data, subcredential, &desc); + if (desc) { + log_debug(LD_GENERAL, "Decoding okay"); + hs_descriptor_free(desc); + } else { + log_debug(LD_GENERAL, "Decoding failed"); + } + + tor_free(fuzzing_data); + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzz_http.c b/src/wraith/src/test/fuzz/fuzz_http.c new file mode 100644 index 000000000..2ffeb6024 --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_http.c @@ -0,0 +1,133 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define BUFFERS_PRIVATE +#define DIRECTORY_PRIVATE + +#include "or.h" +#include "backtrace.h" +#include "buffers.h" +#include "config.h" +#include "connection.h" +#include "directory.h" +#include "torlog.h" + +#include "fuzzing.h" + +static void +mock_connection_write_to_buf_impl_(const char *string, size_t len, + connection_t *conn, int compressed) +{ + log_debug(LD_GENERAL, "%sResponse:\n%u\nConnection: %p\n%s\n", + compressed ? "Compressed " : "", (unsigned)len, conn, string); +} + +static int +mock_directory_handle_command_get(dir_connection_t *conn, + const char *headers, + const char *body, + size_t body_len) +{ + (void)conn; + + log_debug(LD_GENERAL, "Method:\nGET\n"); + + if (headers) { + log_debug(LD_GENERAL, "Header-Length:\n%u\n", (unsigned)strlen(headers)); + log_debug(LD_GENERAL, "Headers:\n%s\n", headers); + } + + log_debug(LD_GENERAL, "Body-Length:\n%u\n", (unsigned)body_len); + if (body) { + log_debug(LD_GENERAL, "Body:\n%s\n", body); + } + + /* Always tell the caller we succeeded */ + return 0; +} + +static int +mock_directory_handle_command_post(dir_connection_t *conn, + const char *headers, + const char *body, + size_t body_len) +{ + (void)conn; + + log_debug(LD_GENERAL, "Method:\nPOST\n"); + + if (headers) { + log_debug(LD_GENERAL, "Header-Length:\n%u\n", (unsigned)strlen(headers)); + log_debug(LD_GENERAL, "Headers:\n%s\n", headers); + } + + log_debug(LD_GENERAL, "Body-Length:\n%u\n", (unsigned)body_len); + if (body) { + log_debug(LD_GENERAL, "Body:\n%s\n", body); + } + + /* Always tell the caller we succeeded */ + return 0; +} + +int +fuzz_init(void) +{ + /* Set up fake response handler */ + MOCK(connection_write_to_buf_impl_, mock_connection_write_to_buf_impl_); + /* Set up the fake handler functions */ + MOCK(directory_handle_command_get, mock_directory_handle_command_get); + MOCK(directory_handle_command_post, mock_directory_handle_command_post); + + return 0; +} + +int +fuzz_cleanup(void) +{ + UNMOCK(connection_write_to_buf_impl_); + UNMOCK(directory_handle_command_get); + UNMOCK(directory_handle_command_post); + return 0; +} + +int +fuzz_main(const uint8_t *stdin_buf, size_t data_size) +{ + dir_connection_t dir_conn; + + /* Set up the fake connection */ + memset(&dir_conn, 0, sizeof(dir_connection_t)); + dir_conn.base_.type = CONN_TYPE_DIR; + /* Apparently tor sets this before directory_handle_command() is called. */ + dir_conn.base_.address = tor_strdup("replace-this-address.example.com"); + + dir_conn.base_.inbuf = buf_new_with_data((char*)stdin_buf, data_size); + if (!dir_conn.base_.inbuf) { + log_debug(LD_GENERAL, "Zero-Length-Input\n"); + goto done; + } + + /* Parse the headers */ + int rv = directory_handle_command(&dir_conn); + + /* TODO: check the output is correctly parsed based on the input */ + + /* Report the parsed origin address */ + if (dir_conn.base_.address) { + log_debug(LD_GENERAL, "Address:\n%s\n", dir_conn.base_.address); + } + + log_debug(LD_GENERAL, "Result:\n%d\n", rv); + + done: + /* Reset. */ + tor_free(dir_conn.base_.address); + buf_free(dir_conn.base_.inbuf); + dir_conn.base_.inbuf = NULL; + + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzz_http_connect.c b/src/wraith/src/test/fuzz/fuzz_http_connect.c new file mode 100644 index 000000000..dc674070b --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_http_connect.c @@ -0,0 +1,106 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define BUFFERS_PRIVATE +#define CONNECTION_EDGE_PRIVATE + +#include "or.h" +#include "backtrace.h" +#include "buffers.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "proto_socks.h" +#include "torlog.h" + +#include "fuzzing.h" + +static void +mock_connection_write_to_buf_impl_(const char *string, size_t len, + connection_t *conn, int compressed) +{ + log_debug(LD_GENERAL, "%sResponse:\n%u\nConnection: %p\n%s\n", + compressed ? "Compressed " : "", (unsigned)len, conn, string); +} + +static void +mock_connection_mark_unattached_ap_(entry_connection_t *conn, int endreason, + int line, const char *file) +{ + (void)conn; + (void)endreason; + (void)line; + (void)file; +} + +static int +mock_connection_ap_rewrite_and_attach_if_allowed(entry_connection_t *conn, + origin_circuit_t *circ, + crypt_path_t *cpath) +{ + (void)conn; + (void)circ; + (void)cpath; + return 0; +} + +int +fuzz_init(void) +{ + /* Set up fake response handler */ + MOCK(connection_write_to_buf_impl_, mock_connection_write_to_buf_impl_); + /* Set up the fake handler functions */ + MOCK(connection_mark_unattached_ap_, mock_connection_mark_unattached_ap_); + MOCK(connection_ap_rewrite_and_attach_if_allowed, + mock_connection_ap_rewrite_and_attach_if_allowed); + + return 0; +} + +int +fuzz_cleanup(void) +{ + UNMOCK(connection_write_to_buf_impl_); + UNMOCK(connection_mark_unattached_ap_); + UNMOCK(connection_ap_rewrite_and_attach_if_allowed); + return 0; +} + +int +fuzz_main(const uint8_t *stdin_buf, size_t data_size) +{ + entry_connection_t conn; + + /* Set up the fake connection */ + memset(&conn, 0, sizeof(conn)); + conn.edge_.base_.type = CONN_TYPE_AP; + conn.edge_.base_.state = AP_CONN_STATE_HTTP_CONNECT_WAIT; + conn.socks_request = tor_malloc_zero(sizeof(socks_request_t)); + conn.socks_request->listener_type = CONN_TYPE_AP_HTTP_CONNECT_LISTENER; + + conn.edge_.base_.inbuf = buf_new_with_data((char*)stdin_buf, data_size); + if (!conn.edge_.base_.inbuf) { + log_debug(LD_GENERAL, "Zero-Length-Input\n"); + goto done; + } + + /* Parse the headers */ + int rv = connection_ap_process_http_connect(&conn); + + /* TODO: check the output is correctly parsed based on the input */ + + log_debug(LD_GENERAL, "Result:\n%d\n", rv); + + goto done; + + done: + /* Reset. */ + socks_request_free(conn.socks_request); + buf_free(conn.edge_.base_.inbuf); + conn.edge_.base_.inbuf = NULL; + + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzz_iptsv2.c b/src/wraith/src/test/fuzz/fuzz_iptsv2.c new file mode 100644 index 000000000..4abde0c16 --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_iptsv2.c @@ -0,0 +1,46 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +#define ROUTERPARSE_PRIVATE +#include "or.h" +#include "routerparse.h" +#include "rendcommon.h" +#include "fuzzing.h" + +static void +mock_dump_desc__nodump(const char *desc, const char *type) +{ + (void)desc; + (void)type; +} + +int +fuzz_init(void) +{ + disable_signature_checking(); + MOCK(dump_desc, mock_dump_desc__nodump); + ed25519_init(); + return 0; +} + +int +fuzz_cleanup(void) +{ + return 0; +} + +int +fuzz_main(const uint8_t *data, size_t sz) +{ + rend_service_descriptor_t *desc = + tor_malloc_zero(sizeof(rend_service_descriptor_t)); + const char *str = (const char*) data; + int r = rend_parse_introduction_points(desc, str, sz); + if (r >= 0) { + log_debug(LD_GENERAL, "Parsing okay: %d", r); + } else { + log_debug(LD_GENERAL, "Parsing failed"); + } + rend_service_descriptor_free(desc); + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzz_microdesc.c b/src/wraith/src/test/fuzz/fuzz_microdesc.c new file mode 100644 index 000000000..396115026 --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_microdesc.c @@ -0,0 +1,47 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +#define ROUTERPARSE_PRIVATE +#include "or.h" +#include "routerparse.h" +#include "microdesc.h" +#include "fuzzing.h" + +static void +mock_dump_desc__nodump(const char *desc, const char *type) +{ + (void)desc; + (void)type; +} + +int +fuzz_init(void) +{ + disable_signature_checking(); + MOCK(dump_desc, mock_dump_desc__nodump); + ed25519_init(); + return 0; +} + +int +fuzz_cleanup(void) +{ + return 0; +} + +int +fuzz_main(const uint8_t *data, size_t sz) +{ + const char *str = (const char*) data; + smartlist_t *result = microdescs_parse_from_string((const char *)str, + str+sz, + 0, SAVED_NOWHERE, NULL); + if (result) { + log_debug(LD_GENERAL, "Parsing okay: %d", smartlist_len(result)); + SMARTLIST_FOREACH(result, microdesc_t *, md, microdesc_free(md)); + smartlist_free(result); + } else { + log_debug(LD_GENERAL, "Parsing failed"); + } + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzz_multi.sh b/src/wraith/src/test/fuzz/fuzz_multi.sh new file mode 100644 index 000000000..b4a17ed8c --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_multi.sh @@ -0,0 +1,34 @@ +MEMLIMIT_BYTES=21990500990976 + +N_CPUS=1 +if [ $# -ge 1 ]; then + N_CPUS="$1" + shift +fi + +FILTER=echo + +for i in `seq -w "$N_CPUS"`; do + if [ "$i" -eq 1 ]; then + if [ "$N_CPUS" -eq 1 ]; then + INSTANCE="" + NUMBER="" + else + INSTANCE="-M" + NUMBER="$i" + fi + else + INSTANCE="-S" + NUMBER="$i" + fi + # use whatever remains on the command-line to prefix the fuzzer command + # you have to copy and paste and run these commands yourself + "$FILTER" "$@" \ + ../afl/afl-fuzz \ + -i src/test/fuzz/fuzz_dir_testcase \ + -o src/test/fuzz/fuzz_dir_findings \ + -x src/test/fuzz/fuzz_dir_dictionary/fuzz_dir_http_header.dct \ + -m "$MEMLIMIT_BYTES" \ + "$INSTANCE" "$NUMBER" \ + -- src/test/fuzz_dir +done diff --git a/src/wraith/src/test/fuzz/fuzz_vrs.c b/src/wraith/src/test/fuzz/fuzz_vrs.c new file mode 100644 index 000000000..baf0610a0 --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzz_vrs.c @@ -0,0 +1,82 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +#define ROUTERPARSE_PRIVATE +#define NETWORKSTATUS_PRIVATE +#include "or.h" +#include "routerparse.h" +#include "memarea.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "fuzzing.h" + +static void +mock_dump_desc__nodump(const char *desc, const char *type) +{ + (void)desc; + (void)type; +} + +static networkstatus_t *dummy_vote = NULL; +static memarea_t *area = NULL; + +int +fuzz_init(void) +{ + disable_signature_checking(); + MOCK(dump_desc, mock_dump_desc__nodump); + ed25519_init(); + area = memarea_new(); + dummy_vote = tor_malloc_zero(sizeof(*dummy_vote)); + dummy_vote->known_flags = smartlist_new(); + smartlist_split_string(dummy_vote->known_flags, + "Authority BadExit Exit Fast Guard HSDir " + "NoEdConsensus Running Stable V2Dir Valid", + " ", 0, 0); + return 0; +} + +int +fuzz_cleanup(void) +{ + SMARTLIST_FOREACH(dummy_vote->known_flags, char *, cp, tor_free(cp)); + smartlist_free(dummy_vote->known_flags); + tor_free(dummy_vote); + return 0; +} + +int +fuzz_main(const uint8_t *data, size_t sz) +{ + char *str = tor_memdup_nulterm(data, sz); + const char *s; + routerstatus_t *rs_ns = NULL, *rs_md = NULL, *rs_vote = NULL; + vote_routerstatus_t *vrs = tor_malloc_zero(sizeof(*vrs)); + smartlist_t *tokens = smartlist_new(); + + s = str; + rs_ns = routerstatus_parse_entry_from_string(area, &s, tokens, + NULL, NULL, 26, FLAV_NS); + tor_assert(smartlist_len(tokens) == 0); + + s = str; + rs_md = routerstatus_parse_entry_from_string(area, &s, tokens, + NULL, NULL, 26, FLAV_MICRODESC); + tor_assert(smartlist_len(tokens) == 0); + + s = str; + rs_vote = routerstatus_parse_entry_from_string(area, &s, tokens, + dummy_vote, vrs, 26, FLAV_NS); + tor_assert(smartlist_len(tokens) == 0); + + log_debug(LD_GENERAL, + "ns=%p, md=%p, vote=%p", rs_ns, rs_md, rs_vote); + + routerstatus_free(rs_md); + routerstatus_free(rs_ns); + vote_routerstatus_free(vrs); + memarea_clear(area); + smartlist_free(tokens); + tor_free(str); + return 0; +} + diff --git a/src/wraith/src/test/fuzz/fuzzing.h b/src/wraith/src/test/fuzz/fuzzing.h new file mode 100644 index 000000000..aecdbb4e5 --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzzing.h @@ -0,0 +1,13 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +#ifndef FUZZING_H +#define FUZZING_H + +int fuzz_init(void); +int fuzz_cleanup(void); +int fuzz_main(const uint8_t *data, size_t sz); + +void disable_signature_checking(void); + +#endif /* FUZZING_H */ + diff --git a/src/wraith/src/test/fuzz/fuzzing_common.c b/src/wraith/src/test/fuzz/fuzzing_common.c new file mode 100644 index 000000000..1d54e41db --- /dev/null +++ b/src/wraith/src/test/fuzz/fuzzing_common.c @@ -0,0 +1,189 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +#define CRYPTO_ED25519_PRIVATE +#include "orconfig.h" +#include "or.h" +#include "backtrace.h" +#include "config.h" +#include "fuzzing.h" +#include "crypto.h" +#include "crypto_ed25519.h" + +static or_options_t *mock_options = NULL; +static const or_options_t * +mock_get_options(void) +{ + return mock_options; +} + +static int +mock_crypto_pk_public_checksig__nocheck(const crypto_pk_t *env, char *to, + size_t tolen, + const char *from, size_t fromlen) +{ + tor_assert(env && to && from); + (void)fromlen; + /* We could look at from[0..fromlen-1] ... */ + tor_assert(tolen >= crypto_pk_keysize(env)); + size_t siglen = MIN(20, crypto_pk_keysize(env)); + memset(to, 0x01, siglen); + return (int)siglen; +} + +static int +mock_crypto_pk_public_checksig_digest__nocheck(crypto_pk_t *env, + const char *data, + size_t datalen, + const char *sig, + size_t siglen) +{ + tor_assert(env && data && sig); + (void)datalen; + (void)siglen; + /* We could look at data[..] and sig[..] */ + return 0; +} + +static int +mock_ed25519_checksig__nocheck(const ed25519_signature_t *signature, + const uint8_t *msg, size_t len, + const ed25519_public_key_t *pubkey) +{ + tor_assert(signature && msg && pubkey); + /* We could look at msg[0..len-1] ... */ + (void)len; + return 0; +} + +static int +mock_ed25519_checksig_batch__nocheck(int *okay_out, + const ed25519_checkable_t *checkable, + int n_checkable) +{ + tor_assert(checkable); + int i; + for (i = 0; i < n_checkable; ++i) { + /* We could look at messages and signatures XXX */ + tor_assert(checkable[i].pubkey); + tor_assert(checkable[i].msg); + if (okay_out) + okay_out[i] = 1; + } + return 0; +} + +static int +mock_ed25519_impl_spot_check__nocheck(void) +{ + return 0; +} + +void +disable_signature_checking(void) +{ + MOCK(crypto_pk_public_checksig, + mock_crypto_pk_public_checksig__nocheck); + MOCK(crypto_pk_public_checksig_digest, + mock_crypto_pk_public_checksig_digest__nocheck); + MOCK(ed25519_checksig, mock_ed25519_checksig__nocheck); + MOCK(ed25519_checksig_batch, mock_ed25519_checksig_batch__nocheck); + MOCK(ed25519_impl_spot_check, mock_ed25519_impl_spot_check__nocheck); +} + +static void +global_init(void) +{ + tor_threads_init(); + tor_compress_init(); + { + struct sipkey sipkey = { 1337, 7331 }; + siphash_set_global_key(&sipkey); + } + + /* Initialise logging first */ + init_logging(1); + configure_backtrace_handler(get_version()); + + /* set up the options. */ + mock_options = tor_malloc_zero(sizeof(or_options_t)); + MOCK(get_options, mock_get_options); + + /* Make BUG() and nonfatal asserts crash */ + tor_set_failed_assertion_callback(abort); +} + +#ifdef LLVM_FUZZ +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); +int +LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) +{ + static int initialized = 0; + if (!initialized) { + global_init(); + if (fuzz_init() < 0) + abort(); + initialized = 1; + } + + return fuzz_main(Data, Size); +} + +#else /* Not LLVM_FUZZ, so AFL. */ + +int +main(int argc, char **argv) +{ + size_t size; + + global_init(); + + /* Disable logging by default to speed up fuzzing. */ + int loglevel = LOG_ERR; + + for (int i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "--warn")) { + loglevel = LOG_WARN; + } else if (!strcmp(argv[i], "--notice")) { + loglevel = LOG_NOTICE; + } else if (!strcmp(argv[i], "--info")) { + loglevel = LOG_INFO; + } else if (!strcmp(argv[i], "--debug")) { + loglevel = LOG_DEBUG; + } + } + + { + log_severity_list_t s; + memset(&s, 0, sizeof(s)); + set_log_severity_config(loglevel, LOG_ERR, &s); + /* ALWAYS log bug warnings. */ + s.masks[LOG_WARN-LOG_ERR] |= LD_BUG; + add_stream_log(&s, "", fileno(stdout)); + } + + if (fuzz_init() < 0) + abort(); + +#ifdef __AFL_HAVE_MANUAL_CONTROL + /* Tell AFL to pause and fork here - ignored if not using AFL */ + __AFL_INIT(); +#endif + +#define MAX_FUZZ_SIZE (128*1024) + char *input = read_file_to_str_until_eof(0, MAX_FUZZ_SIZE, &size); + tor_assert(input); + char *raw = tor_memdup(input, size); /* Because input is nul-terminated */ + tor_free(input); + fuzz_main((const uint8_t*)raw, size); + tor_free(raw); + + if (fuzz_cleanup() < 0) + abort(); + + tor_free(mock_options); + UNMOCK(get_options); + return 0; +} + +#endif + diff --git a/src/wraith/src/test/fuzz/include.am b/src/wraith/src/test/fuzz/include.am new file mode 100644 index 000000000..cd16dc05b --- /dev/null +++ b/src/wraith/src/test/fuzz/include.am @@ -0,0 +1,351 @@ +# This file was generated by fuzzing_include_am.py; do not hand-edit unless +# you enjoy having your changes erased. +FUZZING_CPPFLAGS = \ + $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) +FUZZING_CFLAGS = \ + $(AM_CFLAGS) $(TEST_CFLAGS) +FUZZING_LDFLAG = \ + @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@ +FUZZING_LIBS = \ + src/or/libtor-testing.a \ + src/common/libor-crypto-testing.a \ + $(LIBKECCAK_TINY) \ + $(LIBDONNA) \ + src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + src/common/libor-event-testing.a \ + src/trunnel/libor-trunnel-testing.a \ + $(rust_ldadd) \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ + @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \ + @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ @CURVE25519_LIBS@ \ + @TOR_SYSTEMD_LIBS@ \ + @TOR_LZMA_LIBS@ \ + @TOR_ZSTD_LIBS@ + +oss-fuzz-prereqs: \ + src/or/libtor-testing.a \ + src/common/libor-crypto-testing.a \ + $(LIBKECCAK_TINY) \ + $(LIBDONNA) \ + src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + src/common/libor-event-testing.a \ + src/trunnel/libor-trunnel-testing.a + +noinst_HEADERS += \ + src/test/fuzz/fuzzing.h + +LIBFUZZER = -lFuzzer +LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ +LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS) +LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG) +LIBFUZZER_LIBS = $(FUZZING_LIBS) $(LIBFUZZER) -lstdc++ + +LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ +LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS) + +# ===== AFL fuzzers +src_test_fuzz_fuzz_consensus_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_consensus.c +src_test_fuzz_fuzz_consensus_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_consensus_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_consensus_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_consensus_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_descriptor_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_descriptor.c +src_test_fuzz_fuzz_descriptor_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_descriptor_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_descriptor_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_descriptor_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_diff_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_diff.c +src_test_fuzz_fuzz_diff_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_diff_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_diff_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_diff_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_diff_apply_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_diff_apply.c +src_test_fuzz_fuzz_diff_apply_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_diff_apply_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_diff_apply_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_diff_apply_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_extrainfo_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_extrainfo.c +src_test_fuzz_fuzz_extrainfo_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_extrainfo_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_extrainfo_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_extrainfo_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_hsdescv2_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_hsdescv2.c +src_test_fuzz_fuzz_hsdescv2_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_hsdescv2_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_hsdescv2_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_hsdescv2_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_hsdescv3_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_hsdescv3.c +src_test_fuzz_fuzz_hsdescv3_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_hsdescv3_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_hsdescv3_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_hsdescv3_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_http_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_http.c +src_test_fuzz_fuzz_http_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_http_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_http_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_http_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_http_connect_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_http_connect.c +src_test_fuzz_fuzz_http_connect_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_http_connect_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_http_connect_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_http_connect_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_iptsv2_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_iptsv2.c +src_test_fuzz_fuzz_iptsv2_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_iptsv2_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_iptsv2_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_iptsv2_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_microdesc_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_microdesc.c +src_test_fuzz_fuzz_microdesc_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_microdesc_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_microdesc_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_microdesc_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_vrs_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_vrs.c +src_test_fuzz_fuzz_vrs_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_vrs_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_vrs_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_vrs_LDADD = $(FUZZING_LIBS) + +FUZZERS = \ + src/test/fuzz/fuzz-consensus \ + src/test/fuzz/fuzz-descriptor \ + src/test/fuzz/fuzz-diff \ + src/test/fuzz/fuzz-diff-apply \ + src/test/fuzz/fuzz-extrainfo \ + src/test/fuzz/fuzz-hsdescv2 \ + src/test/fuzz/fuzz-hsdescv3 \ + src/test/fuzz/fuzz-http \ + src/test/fuzz/fuzz-http-connect \ + src/test/fuzz/fuzz-iptsv2 \ + src/test/fuzz/fuzz-microdesc \ + src/test/fuzz/fuzz-vrs + +# ===== libfuzzer + +if LIBFUZZER_ENABLED +src_test_fuzz_lf_fuzz_consensus_SOURCES = \ + $(src_test_fuzz_fuzz_consensus_SOURCES) +src_test_fuzz_lf_fuzz_consensus_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_consensus_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_consensus_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_consensus_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_descriptor_SOURCES = \ + $(src_test_fuzz_fuzz_descriptor_SOURCES) +src_test_fuzz_lf_fuzz_descriptor_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_descriptor_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_descriptor_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_descriptor_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_diff_SOURCES = \ + $(src_test_fuzz_fuzz_diff_SOURCES) +src_test_fuzz_lf_fuzz_diff_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_diff_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_diff_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_diff_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_diff_apply_SOURCES = \ + $(src_test_fuzz_fuzz_diff_apply_SOURCES) +src_test_fuzz_lf_fuzz_diff_apply_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_diff_apply_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_diff_apply_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_diff_apply_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_extrainfo_SOURCES = \ + $(src_test_fuzz_fuzz_extrainfo_SOURCES) +src_test_fuzz_lf_fuzz_extrainfo_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_extrainfo_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_extrainfo_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_extrainfo_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_hsdescv2_SOURCES = \ + $(src_test_fuzz_fuzz_hsdescv2_SOURCES) +src_test_fuzz_lf_fuzz_hsdescv2_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_hsdescv2_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_hsdescv2_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_hsdescv2_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_hsdescv3_SOURCES = \ + $(src_test_fuzz_fuzz_hsdescv3_SOURCES) +src_test_fuzz_lf_fuzz_hsdescv3_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_hsdescv3_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_hsdescv3_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_hsdescv3_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_http_SOURCES = \ + $(src_test_fuzz_fuzz_http_SOURCES) +src_test_fuzz_lf_fuzz_http_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_http_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_http_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_http_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_http_connect_SOURCES = \ + $(src_test_fuzz_fuzz_http_connect_SOURCES) +src_test_fuzz_lf_fuzz_http_connect_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_http_connect_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_http_connect_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_http_connect_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_iptsv2_SOURCES = \ + $(src_test_fuzz_fuzz_iptsv2_SOURCES) +src_test_fuzz_lf_fuzz_iptsv2_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_iptsv2_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_iptsv2_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_iptsv2_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_microdesc_SOURCES = \ + $(src_test_fuzz_fuzz_microdesc_SOURCES) +src_test_fuzz_lf_fuzz_microdesc_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_microdesc_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_microdesc_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_microdesc_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_vrs_SOURCES = \ + $(src_test_fuzz_fuzz_vrs_SOURCES) +src_test_fuzz_lf_fuzz_vrs_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_vrs_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_vrs_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_vrs_LDADD = $(LIBFUZZER_LIBS) + +LIBFUZZER_FUZZERS = \ + src/test/fuzz/lf-fuzz-consensus \ + src/test/fuzz/lf-fuzz-descriptor \ + src/test/fuzz/lf-fuzz-diff \ + src/test/fuzz/lf-fuzz-diff-apply \ + src/test/fuzz/lf-fuzz-extrainfo \ + src/test/fuzz/lf-fuzz-hsdescv2 \ + src/test/fuzz/lf-fuzz-hsdescv3 \ + src/test/fuzz/lf-fuzz-http \ + src/test/fuzz/lf-fuzz-http-connect \ + src/test/fuzz/lf-fuzz-iptsv2 \ + src/test/fuzz/lf-fuzz-microdesc \ + src/test/fuzz/lf-fuzz-vrs + +else +LIBFUZZER_FUZZERS = +endif + +# ===== oss-fuzz + +if OSS_FUZZ_ENABLED +src_test_fuzz_liboss_fuzz_consensus_a_SOURCES = \ + $(src_test_fuzz_fuzz_consensus_SOURCES) +src_test_fuzz_liboss_fuzz_consensus_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_consensus_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_descriptor_a_SOURCES = \ + $(src_test_fuzz_fuzz_descriptor_SOURCES) +src_test_fuzz_liboss_fuzz_descriptor_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_descriptor_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_diff_a_SOURCES = \ + $(src_test_fuzz_fuzz_diff_SOURCES) +src_test_fuzz_liboss_fuzz_diff_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_diff_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_diff_apply_a_SOURCES = \ + $(src_test_fuzz_fuzz_diff_apply_SOURCES) +src_test_fuzz_liboss_fuzz_diff_apply_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_diff_apply_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_extrainfo_a_SOURCES = \ + $(src_test_fuzz_fuzz_extrainfo_SOURCES) +src_test_fuzz_liboss_fuzz_extrainfo_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_extrainfo_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_hsdescv2_a_SOURCES = \ + $(src_test_fuzz_fuzz_hsdescv2_SOURCES) +src_test_fuzz_liboss_fuzz_hsdescv2_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_hsdescv2_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_hsdescv3_a_SOURCES = \ + $(src_test_fuzz_fuzz_hsdescv3_SOURCES) +src_test_fuzz_liboss_fuzz_hsdescv3_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_hsdescv3_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_http_a_SOURCES = \ + $(src_test_fuzz_fuzz_http_SOURCES) +src_test_fuzz_liboss_fuzz_http_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_http_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_http_connect_a_SOURCES = \ + $(src_test_fuzz_fuzz_http_connect_SOURCES) +src_test_fuzz_liboss_fuzz_http_connect_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_http_connect_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_iptsv2_a_SOURCES = \ + $(src_test_fuzz_fuzz_iptsv2_SOURCES) +src_test_fuzz_liboss_fuzz_iptsv2_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_iptsv2_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_microdesc_a_SOURCES = \ + $(src_test_fuzz_fuzz_microdesc_SOURCES) +src_test_fuzz_liboss_fuzz_microdesc_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_microdesc_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_vrs_a_SOURCES = \ + $(src_test_fuzz_fuzz_vrs_SOURCES) +src_test_fuzz_liboss_fuzz_vrs_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_vrs_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +OSS_FUZZ_FUZZERS = \ + src/test/fuzz/liboss-fuzz-consensus.a \ + src/test/fuzz/liboss-fuzz-descriptor.a \ + src/test/fuzz/liboss-fuzz-diff.a \ + src/test/fuzz/liboss-fuzz-diff-apply.a \ + src/test/fuzz/liboss-fuzz-extrainfo.a \ + src/test/fuzz/liboss-fuzz-hsdescv2.a \ + src/test/fuzz/liboss-fuzz-hsdescv3.a \ + src/test/fuzz/liboss-fuzz-http.a \ + src/test/fuzz/liboss-fuzz-http-connect.a \ + src/test/fuzz/liboss-fuzz-iptsv2.a \ + src/test/fuzz/liboss-fuzz-microdesc.a \ + src/test/fuzz/liboss-fuzz-vrs.a + +else +OSS_FUZZ_FUZZERS = +endif + +noinst_PROGRAMS += $(FUZZERS) $(LIBFUZZER_FUZZERS) +noinst_LIBRARIES += $(OSS_FUZZ_FUZZERS) +oss-fuzz-fuzzers: oss-fuzz-prereqs $(OSS_FUZZ_FUZZERS) +fuzzers: $(FUZZERS) $(LIBFUZZER_FUZZERS) + +test-fuzz-corpora: $(FUZZERS) + $(top_srcdir)/src/test/fuzz_static_testcases.sh diff --git a/src/wraith/src/test/fuzz/minimize.sh b/src/wraith/src/test/fuzz/minimize.sh new file mode 100644 index 000000000..87d3dda13 --- /dev/null +++ b/src/wraith/src/test/fuzz/minimize.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +if [ ! -d "$1" ] ; then + echo "I need a directory" + exit 1 +fi + +which=`basename "$1"` + +mkdir "$1.out" +afl-cmin -i "$1" -o "$1.out" -m none "./src/test/fuzz/fuzz-${which}" + diff --git a/src/wraith/src/test/fuzz_static_testcases.sh b/src/wraith/src/test/fuzz_static_testcases.sh new file mode 100644 index 000000000..3cb45ad5e --- /dev/null +++ b/src/wraith/src/test/fuzz_static_testcases.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +# Copyright (c) 2016-2017, The Tor Project, Inc. +# See LICENSE for licensing information + +set -e + +if [ -z "${TOR_FUZZ_CORPORA}" ] || [ ! -d "${TOR_FUZZ_CORPORA}" ] ; then + echo "You need to set TOR_FUZZ_CORPORA to point to a checkout of " + echo "the 'fuzzing-corpora' repository." + exit 77 +fi + + + +for fuzzer in "${builddir:-.}"/src/test/fuzz/fuzz-* ; do + f=`basename $fuzzer` + case="${f#fuzz-}" + if [ -d "${TOR_FUZZ_CORPORA}/${case}" ]; then + echo "Running tests for ${case}" + for entry in "${TOR_FUZZ_CORPORA}/${case}/"*; do + "${fuzzer}" "--err" < "$entry" + done + else + echo "No tests found for ${case}" + fi +done diff --git a/src/wraith/src/test/hs_build_address.py b/src/wraith/src/test/hs_build_address.py new file mode 100644 index 000000000..7ff22c3a9 --- /dev/null +++ b/src/wraith/src/test/hs_build_address.py @@ -0,0 +1,38 @@ +import sys +import hashlib +import struct +import base64 + +# Python 3.6+, the SHA3 is available in hashlib natively. Else this requires +# the pysha3 package (pip install pysha3). +if sys.version_info < (3, 6): + import sha3 + +# Test vector to make sure the right sha3 version will be used. pysha3 < 1.0 +# used the old Keccak implementation. During the finalization of SHA3, NIST +# changed the delimiter suffix from 0x01 to 0x06. The Keccak sponge function +# stayed the same. pysha3 1.0 provides the previous Keccak hash, too. +TEST_VALUE = "e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51" +if TEST_VALUE != sha3.sha3_256(b"Hello World").hexdigest(): + print("pysha3 version is < 1.0. Please install from:") + print("https://github.com/tiran/pysha3https://github.com/tiran/pysha3") + sys.exit(1) + +# Checksum is built like so: +# CHECKSUM = SHA3(".onion checksum" || PUBKEY || VERSION) +PREFIX = ".onion checksum".encode() +# 32 bytes ed25519 pubkey from first test vector of +# https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-02#section-6 +PUBKEY = "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a".decode('hex') +# Version 3 is proposal224 +VERSION = 3 + +data = struct.pack('15s32sb', PREFIX, PUBKEY, VERSION) +checksum = hashlib.sha3_256(data).digest() + +# Onion address is built like so: +# onion_address = base32(PUBKEY || CHECKSUM || VERSION) + ".onion" +address = struct.pack('!32s2sb', PUBKEY, checksum, VERSION) +onion_addr = base64.b32encode(address).decode().lower() + +print("%s" % (onion_addr)) diff --git a/src/wraith/src/test/hs_indexes.py b/src/wraith/src/test/hs_indexes.py new file mode 100644 index 000000000..af0b81f8d --- /dev/null +++ b/src/wraith/src/test/hs_indexes.py @@ -0,0 +1,70 @@ +# +# The hidden service subsystem has two type of index. The first type is a +# value that each node in the network gets assigned to using their identity +# key which is their position in the hashring. (hs_build_hsdir_index()). +# +# The second type is a value that both the client and service computes to +# store/fetch the descriptor on the hashring. (hs_build_hs_index()). +# + +import sys +import hashlib +import struct +import base64 + +# Python 3.6+, the SHA3 is available in hashlib natively. Else this requires +# the pysha3 package (pip install pysha3). +if sys.version_info < (3, 6): + import sha3 + # Test vector to make sure the right sha3 version will be used. pysha3 < 1.0 + # used the old Keccak implementation. During the finalization of SHA3, NIST + # changed the delimiter suffix from 0x01 to 0x06. The Keccak sponge function + # stayed the same. pysha3 1.0 provides the previous Keccak hash, too. + TEST_VALUE = "e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51" + if TEST_VALUE != sha3.sha3_256(b"Hello World").hexdigest(): + print("pysha3 version is < 1.0. Please install from:") + print("https://github.com/tiran/pysha3https://github.com/tiran/pysha3") + sys.exit(1) + +# The first index we'll build is the position index in the hashring that is +# constructed by the hs_build_hsdir_index() function. Construction is: +# SHA3-256("node-idx" | node_identity | +# shared_random_value | INT_8(period_length) | INT_8(period_num) ) + +PREFIX = "node-idx".encode() +# 32 bytes ed25519 pubkey. +IDENTITY = ("\x42" * 32).encode() +# SRV is 32 bytes. +SRV = ("\x43" * 32).encode() +# Time period length is a 8 bytes value. +PERIOD_LEN = 1440 +# Period number is a 8 bytes value. +PERIOD_NUM = 42 + +data = struct.pack('!8s32s32sQQ', PREFIX, IDENTITY, SRV, PERIOD_NUM, + PERIOD_LEN) +hsdir_index = hashlib.sha3_256(data).hexdigest() + +print("[hs_build_hsdir_index] %s" % (hsdir_index)) + +# The second index we'll build is where the HS stores and the client fetches +# the descriptor on the hashring. It is constructed by the hs_build_hs_index() +# function and the construction is: +# SHA3-256("store-at-idx" | blinded_public_key | +# INT_8(replicanum) | INT_8(period_num) | INT_8(period_length) ) + +PREFIX = "store-at-idx".encode() +# 32 bytes ed25519 pubkey. +PUBKEY = ("\x42" * 32).encode() +# Replica number is a 8 bytes value. +REPLICA_NUM = 1 +# Time period length is a 8 bytes value. +PERIOD_LEN = 1440 +# Period number is a 8 bytes value. +PERIOD_NUM = 42 + +data = struct.pack('!12s32sQQQ', PREFIX, PUBKEY, REPLICA_NUM, PERIOD_LEN, + PERIOD_NUM) +hs_index = hashlib.sha3_256(data).hexdigest() + +print("[hs_build_hs_index] %s" % (hs_index)) diff --git a/src/wraith/src/test/hs_ntor_ref.py b/src/wraith/src/test/hs_ntor_ref.py new file mode 100644 index 000000000..2ed9324e1 --- /dev/null +++ b/src/wraith/src/test/hs_ntor_ref.py @@ -0,0 +1,425 @@ +#!/usr/bin/python +# Copyright 2017, The Tor Project, Inc +# See LICENSE for licensing information + +""" +hs_ntor_ref.py + +This module is a reference implementation of the modified ntor protocol +proposed for Tor hidden services in proposal 224 (Next Generation Hidden +Services) in section [NTOR-WITH-EXTRA-DATA]. + +The modified ntor protocol is a single-round protocol, with three steps in total: + + 1: Client generates keys and sends them to service via INTRODUCE cell + + 2: Service computes key material based on client's keys, and sends its own + keys to client via RENDEZVOUS cell + + 3: Client computes key material as well. + +It's meant to be used to validate Tor's HS ntor implementation by conducting +various integration tests. Specifically it conducts the following three tests: + +- Tests our Python implementation by running the whole protocol in Python and + making sure that results are consistent. + +- Tests little-t-tor ntor implementation. We use this Python code to instrument + little-t-tor and carry out the handshake by using little-t-tor code. The + small C wrapper at src/test/test-hs-ntor-cl is used for this Python module to + interface with little-t-tor. + +- Cross-tests Python and little-t-tor implementation by running half of the + protocol in Python code and the other in little-t-tor. This is actually two + tests so that all parts of the protocol are run both by little-t-tor and + Python. + +It requires the curve25519 python module from the curve25519-donna package. + +The whole logic and concept for this test suite was taken from ntor_ref.py. + + *** DO NOT USE THIS IN PRODUCTION. *** +""" + +import struct +import os, sys +import binascii +import subprocess + +try: + import curve25519 + curve25519mod = curve25519.keys +except ImportError: + curve25519 = None + import slownacl_curve25519 + curve25519mod = slownacl_curve25519 + +import hashlib +try: + import sha3 +except ImportError: + # In python 3.6, the sha3 functions are in hashlib whether we + # import sha3 or not. + sha3 = None + +try: + # Pull the sha3 functions in. + from hashlib import sha3_256, shake_256 + shake_squeeze = shake_256.digest +except ImportError: + if hasattr(sha3, "SHA3256"): + # If this happens, then we have the old "sha3" module which + # hashlib and pysha3 superseded. + sha3_256 = sha3.SHA3256 + shake_256 = sha3.SHAKE256 + shake_squeeze = shake_256.squeeze + else: + # error code 77 tells automake to skip this test + sys.exit(77) + +# Import Nick's ntor reference implementation in Python +# We are gonna use a few of its utilities. +from ntor_ref import hash_nil +from ntor_ref import PrivateKey + +# String constants used in this protocol +PROTOID = b"tor-hs-ntor-curve25519-sha3-256-1" +T_HSENC = PROTOID + b":hs_key_extract" +T_HSVERIFY = PROTOID + b":hs_verify" +T_HSMAC = PROTOID + b":hs_mac" +M_HSEXPAND = PROTOID + b":hs_key_expand" + +INTRO_SECRET_LEN = 161 +REND_SECRET_LEN = 225 +AUTH_INPUT_LEN = 199 + +# Implements MAC(k,m) = H(htonll(len(k)) | k | m) +def mac(k,m): + def htonll(num): + return struct.pack('!q', num) + + s = sha3_256() + s.update(htonll(len(k))) + s.update(k) + s.update(m) + return s.digest() + +###################################################################### + +# Functions that implement the modified HS ntor protocol + +"""As client compute key material for INTRODUCE cell as follows: + + intro_secret_hs_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID + info = m_hsexpand | subcredential + hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + ENC_KEY = hs_keys[0:S_KEY_LEN] + MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] +""" +def intro2_ntor_client(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential): + + dh_result = client_ephemeral_enc_privkey.get_shared_key(intro_enc_pubkey, hash_nil) + secret = dh_result + intro_auth_pubkey_str + client_ephemeral_enc_pubkey.serialize() + intro_enc_pubkey.serialize() + PROTOID + assert(len(secret) == INTRO_SECRET_LEN) + info = M_HSEXPAND + subcredential + + kdf = shake_256() + kdf.update(secret + T_HSENC + info) + key_material = shake_squeeze(kdf, 64*8) + + enc_key = key_material[0:32] + mac_key = key_material[32:64] + + return enc_key, mac_key + +"""Wrapper over intro2_ntor_client()""" +def client_part1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential): + enc_key, mac_key = intro2_ntor_client(intro_auth_pubkey_str, intro_enc_pubkey, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential) + assert(enc_key) + assert(mac_key) + + return enc_key, mac_key + +"""As service compute key material for INTRODUCE cell as follows: + + intro_secret_hs_input = EXP(X,b) | AUTH_KEY | X | B | PROTOID + info = m_hsexpand | subcredential + hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + HS_DEC_KEY = hs_keys[0:S_KEY_LEN] + HS_MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] +""" +def intro2_ntor_service(intro_auth_pubkey_str, client_enc_pubkey, service_enc_privkey, service_enc_pubkey, subcredential): + dh_result = service_enc_privkey.get_shared_key(client_enc_pubkey, hash_nil) + secret = dh_result + intro_auth_pubkey_str + client_enc_pubkey.serialize() + service_enc_pubkey.serialize() + PROTOID + assert(len(secret) == INTRO_SECRET_LEN) + info = M_HSEXPAND + subcredential + + kdf = shake_256() + kdf.update(secret + T_HSENC + info) + key_material = shake_squeeze(kdf, 64*8) + + enc_key = key_material[0:32] + mac_key = key_material[32:64] + + return enc_key, mac_key + +"""As service compute key material for INTRODUCE and REDNEZVOUS cells. + + Use intro2_ntor_service() to calculate the INTRODUCE key material, and use + the following computations to do the RENDEZVOUS ones: + + rend_secret_hs_input = EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID + NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) + verify = MAC(rend_secret_hs_input, t_hsverify) + auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + AUTH_INPUT_MAC = MAC(auth_input, t_hsmac) +""" +def service_part1(intro_auth_pubkey_str, client_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential): + intro_enc_key, intro_mac_key = intro2_ntor_service(intro_auth_pubkey_str, client_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) + assert(intro_enc_key) + assert(intro_mac_key) + + service_ephemeral_privkey = PrivateKey() + service_ephemeral_pubkey = service_ephemeral_privkey.get_public() + + dh_result1 = service_ephemeral_privkey.get_shared_key(client_enc_pubkey, hash_nil) + dh_result2 = intro_enc_privkey.get_shared_key(client_enc_pubkey, hash_nil) + rend_secret_hs_input = dh_result1 + dh_result2 + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + client_enc_pubkey.serialize() + service_ephemeral_pubkey.serialize() + PROTOID + assert(len(rend_secret_hs_input) == REND_SECRET_LEN) + + ntor_key_seed = mac(rend_secret_hs_input, T_HSENC) + verify = mac(rend_secret_hs_input, T_HSVERIFY) + auth_input = verify + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + service_ephemeral_pubkey.serialize() + client_enc_pubkey.serialize() + PROTOID + b"Server" + assert(len(auth_input) == AUTH_INPUT_LEN) + auth_input_mac = mac(auth_input, T_HSMAC) + + assert(ntor_key_seed) + assert(auth_input_mac) + assert(service_ephemeral_pubkey) + + return intro_enc_key, intro_mac_key, ntor_key_seed, auth_input_mac, service_ephemeral_pubkey + +"""As client compute key material for rendezvous cells as follows: + + rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | AUTH_KEY | B | X | Y | PROTOID + NTOR_KEY_SEED = MAC(ntor_secret_input, t_hsenc) + verify = MAC(ntor_secret_input, t_hsverify) + auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + AUTH_INPUT_MAC = MAC(auth_input, t_hsmac) +""" +def client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_rend_pubkey): + dh_result1 = client_ephemeral_enc_privkey.get_shared_key(service_ephemeral_rend_pubkey, hash_nil) + dh_result2 = client_ephemeral_enc_privkey.get_shared_key(intro_enc_pubkey, hash_nil) + rend_secret_hs_input = dh_result1 + dh_result2 + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + client_ephemeral_enc_pubkey.serialize() + service_ephemeral_rend_pubkey.serialize() + PROTOID + assert(len(rend_secret_hs_input) == REND_SECRET_LEN) + + ntor_key_seed = mac(rend_secret_hs_input, T_HSENC) + verify = mac(rend_secret_hs_input, T_HSVERIFY) + auth_input = verify + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + service_ephemeral_rend_pubkey.serialize() + client_ephemeral_enc_pubkey.serialize() + PROTOID + b"Server" + assert(len(auth_input) == AUTH_INPUT_LEN) + auth_input_mac = mac(auth_input, T_HSMAC) + + assert(ntor_key_seed) + assert(auth_input_mac) + + return ntor_key_seed, auth_input_mac + +################################################################################# + +""" +Utilities for communicating with the little-t-tor ntor wrapper to conduct the +integration tests +""" + +PROG = b"./src/test/test-hs-ntor-cl" +enhex=lambda s: binascii.b2a_hex(s) +dehex=lambda s: binascii.a2b_hex(s.strip()) + +def tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_privkey, subcredential): + p = subprocess.Popen([PROG, "client1", + enhex(intro_auth_pubkey_str), + enhex(intro_enc_pubkey.serialize()), + enhex(client_ephemeral_enc_privkey.serialize()), + enhex(subcredential)], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + +def tor_server1(intro_auth_pubkey_str, intro_enc_privkey, + client_ephemeral_enc_pubkey, subcredential): + p = subprocess.Popen([PROG, "server1", + enhex(intro_auth_pubkey_str), + enhex(intro_enc_privkey.serialize()), + enhex(client_ephemeral_enc_pubkey.serialize()), + enhex(subcredential)], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + +def tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_rend_pubkey, subcredential): + p = subprocess.Popen([PROG, "client2", + enhex(intro_auth_pubkey_str), + enhex(client_ephemeral_enc_privkey.serialize()), + enhex(intro_enc_pubkey.serialize()), + enhex(service_ephemeral_rend_pubkey.serialize()), + enhex(subcredential)], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + +################################################################################## + +# Perform a pure python ntor test +def do_pure_python_ntor_test(): + # Initialize all needed key material + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() + intro_auth_pubkey_str = os.urandom(32) + subcredential = os.urandom(32) + + client_enc_key, client_mac_key = client_part1(intro_auth_pubkey_str, intro_enc_pubkey, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential) + + service_enc_key, service_mac_key, service_ntor_key_seed, service_auth_input_mac, service_ephemeral_pubkey = service_part1(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) + + assert(client_enc_key == service_enc_key) + assert(client_mac_key == service_mac_key) + + client_ntor_key_seed, client_auth_input_mac = client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_pubkey) + + assert(client_ntor_key_seed == service_ntor_key_seed) + assert(client_auth_input_mac == service_auth_input_mac) + + print("DONE: python dance [%s]" % repr(client_auth_input_mac)) + +# Perform a pure little-t-tor integration test. +def do_little_t_tor_ntor_test(): + # Initialize all needed key material + subcredential = os.urandom(32) + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key + intro_auth_pubkey_str = os.urandom(32) + + client_enc_key, client_mac_key = tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_privkey, subcredential) + assert(client_enc_key) + assert(client_mac_key) + + service_enc_key, service_mac_key, service_ntor_auth_mac, service_ntor_key_seed, service_eph_pubkey = tor_server1(intro_auth_pubkey_str, + intro_enc_privkey, + client_ephemeral_enc_pubkey, + subcredential) + assert(service_enc_key) + assert(service_mac_key) + assert(service_ntor_auth_mac) + assert(service_ntor_key_seed) + + assert(client_enc_key == service_enc_key) + assert(client_mac_key == service_mac_key) + + # Turn from bytes to key + service_eph_pubkey = curve25519mod.Public(service_eph_pubkey) + + client_ntor_auth_mac, client_ntor_key_seed = tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_eph_pubkey, subcredential) + assert(client_ntor_auth_mac) + assert(client_ntor_key_seed) + + assert(client_ntor_key_seed == service_ntor_key_seed) + assert(client_ntor_auth_mac == service_ntor_auth_mac) + + print("DONE: tor dance [%s]" % repr(client_ntor_auth_mac)) + +""" +Do mixed test as follows: + 1. C -> S (python mode) + 2. C <- S (tor mode) + 3. Client computes keys (python mode) +""" +def do_first_mixed_test(): + subcredential = os.urandom(32) + + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key + + intro_auth_pubkey_str = os.urandom(32) + + # Let's do mixed + client_enc_key, client_mac_key = client_part1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + subcredential) + + service_enc_key, service_mac_key, service_ntor_auth_mac, service_ntor_key_seed, service_eph_pubkey = tor_server1(intro_auth_pubkey_str, + intro_enc_privkey, + client_ephemeral_enc_pubkey, + subcredential) + assert(service_enc_key) + assert(service_mac_key) + assert(service_ntor_auth_mac) + assert(service_ntor_key_seed) + assert(service_eph_pubkey) + + assert(client_enc_key == service_enc_key) + assert(client_mac_key == service_mac_key) + + # Turn from bytes to key + service_eph_pubkey = curve25519mod.Public(service_eph_pubkey) + + client_ntor_key_seed, client_auth_input_mac = client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_eph_pubkey) + + assert(client_auth_input_mac == service_ntor_auth_mac) + assert(client_ntor_key_seed == service_ntor_key_seed) + + print("DONE: 1st mixed dance [%s]" % repr(client_auth_input_mac)) + +""" +Do mixed test as follows: + 1. C -> S (tor mode) + 2. C <- S (python mode) + 3. Client computes keys (tor mode) +""" +def do_second_mixed_test(): + subcredential = os.urandom(32) + + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key + + intro_auth_pubkey_str = os.urandom(32) + + # Let's do mixed + client_enc_key, client_mac_key = tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_privkey, subcredential) + assert(client_enc_key) + assert(client_mac_key) + + service_enc_key, service_mac_key, service_ntor_key_seed, service_ntor_auth_mac, service_ephemeral_pubkey = service_part1(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) + + client_ntor_auth_mac, client_ntor_key_seed = tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_pubkey, subcredential) + assert(client_ntor_auth_mac) + assert(client_ntor_key_seed) + + assert(client_ntor_key_seed == service_ntor_key_seed) + assert(client_ntor_auth_mac == service_ntor_auth_mac) + + print("DONE: 2nd mixed dance [%s]" % repr(client_ntor_auth_mac)) + +def do_mixed_tests(): + do_first_mixed_test() + do_second_mixed_test() + +if __name__ == '__main__': + do_pure_python_ntor_test() + do_little_t_tor_ntor_test() + do_mixed_tests() diff --git a/src/wraith/src/test/hs_test_helpers.c b/src/wraith/src/test/hs_test_helpers.c new file mode 100644 index 000000000..935597126 --- /dev/null +++ b/src/wraith/src/test/hs_test_helpers.c @@ -0,0 +1,276 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "crypto_ed25519.h" +#include "test.h" +#include "torcert.h" + +#include "hs_common.h" +#include "hs_test_helpers.h" + +hs_desc_intro_point_t * +hs_helper_build_intro_point(const ed25519_keypair_t *signing_kp, time_t now, + const char *addr, int legacy) +{ + int ret; + ed25519_keypair_t auth_kp; + hs_desc_intro_point_t *intro_point = NULL; + hs_desc_intro_point_t *ip = hs_desc_intro_point_new(); + + /* For a usable intro point we need at least two link specifiers: One legacy + * keyid and one ipv4 */ + { + hs_desc_link_specifier_t *ls_legacy = tor_malloc_zero(sizeof(*ls_legacy)); + hs_desc_link_specifier_t *ls_v4 = tor_malloc_zero(sizeof(*ls_v4)); + ls_legacy->type = LS_LEGACY_ID; + memcpy(ls_legacy->u.legacy_id, "0299F268FCA9D55CD157976D39AE92B4B455B3A8", + DIGEST_LEN); + ls_v4->u.ap.port = 9001; + int family = tor_addr_parse(&ls_v4->u.ap.addr, addr); + switch (family) { + case AF_INET: + ls_v4->type = LS_IPV4; + break; + case AF_INET6: + ls_v4->type = LS_IPV6; + break; + default: + /* Stop the test, not suppose to have an error. */ + tt_int_op(family, OP_EQ, AF_INET); + } + smartlist_add(ip->link_specifiers, ls_legacy); + smartlist_add(ip->link_specifiers, ls_v4); + } + + ret = ed25519_keypair_generate(&auth_kp, 0); + tt_int_op(ret, ==, 0); + ip->auth_key_cert = tor_cert_create(signing_kp, CERT_TYPE_AUTH_HS_IP_KEY, + &auth_kp.pubkey, now, + HS_DESC_CERT_LIFETIME, + CERT_FLAG_INCLUDE_SIGNING_KEY); + tt_assert(ip->auth_key_cert); + + if (legacy) { + ip->legacy.key = crypto_pk_new(); + tt_assert(ip->legacy.key); + ret = crypto_pk_generate_key(ip->legacy.key); + tt_int_op(ret, ==, 0); + ssize_t cert_len = tor_make_rsa_ed25519_crosscert( + &signing_kp->pubkey, ip->legacy.key, + now + HS_DESC_CERT_LIFETIME, + &ip->legacy.cert.encoded); + tt_assert(ip->legacy.cert.encoded); + tt_u64_op(cert_len, OP_GT, 0); + ip->legacy.cert.len = cert_len; + } + + /* Encryption key. */ + { + int signbit; + curve25519_keypair_t curve25519_kp; + ed25519_keypair_t ed25519_kp; + tor_cert_t *cross_cert; + + ret = curve25519_keypair_generate(&curve25519_kp, 0); + tt_int_op(ret, ==, 0); + ed25519_keypair_from_curve25519_keypair(&ed25519_kp, &signbit, + &curve25519_kp); + cross_cert = tor_cert_create(signing_kp, CERT_TYPE_CROSS_HS_IP_KEYS, + &ed25519_kp.pubkey, time(NULL), + HS_DESC_CERT_LIFETIME, + CERT_FLAG_INCLUDE_SIGNING_KEY); + tt_assert(cross_cert); + ip->enc_key_cert = cross_cert; + } + + intro_point = ip; + done: + return intro_point; +} + +/* Return a valid hs_descriptor_t object. If no_ip is set, no introduction + * points are added. */ +static hs_descriptor_t * +hs_helper_build_hs_desc_impl(unsigned int no_ip, + const ed25519_keypair_t *signing_kp) +{ + time_t now = approx_time(); + ed25519_keypair_t blinded_kp; + hs_descriptor_t *descp = NULL, *desc = tor_malloc_zero(sizeof(*desc)); + + desc->plaintext_data.version = HS_DESC_SUPPORTED_FORMAT_VERSION_MAX; + + /* Copy only the public key into the descriptor. */ + memcpy(&desc->plaintext_data.signing_pubkey, &signing_kp->pubkey, + sizeof(ed25519_public_key_t)); + + uint64_t current_time_period = hs_get_time_period_num(0); + hs_build_blinded_keypair(signing_kp, NULL, 0, + current_time_period, &blinded_kp); + /* Copy only the public key into the descriptor. */ + memcpy(&desc->plaintext_data.blinded_pubkey, &blinded_kp.pubkey, + sizeof(ed25519_public_key_t)); + + desc->plaintext_data.signing_key_cert = + tor_cert_create(&blinded_kp, CERT_TYPE_SIGNING_HS_DESC, + &signing_kp->pubkey, now, 3600, + CERT_FLAG_INCLUDE_SIGNING_KEY); + tt_assert(desc->plaintext_data.signing_key_cert); + desc->plaintext_data.revision_counter = 42; + desc->plaintext_data.lifetime_sec = 3 * 60 * 60; + + hs_get_subcredential(&signing_kp->pubkey, &blinded_kp.pubkey, + desc->subcredential); + + /* Setup encrypted data section. */ + desc->encrypted_data.create2_ntor = 1; + desc->encrypted_data.intro_auth_types = smartlist_new(); + desc->encrypted_data.single_onion_service = 1; + smartlist_add(desc->encrypted_data.intro_auth_types, tor_strdup("ed25519")); + desc->encrypted_data.intro_points = smartlist_new(); + if (!no_ip) { + /* Add four intro points. */ + smartlist_add(desc->encrypted_data.intro_points, + hs_helper_build_intro_point(signing_kp, now, "1.2.3.4", 0)); + smartlist_add(desc->encrypted_data.intro_points, + hs_helper_build_intro_point(signing_kp, now, "[2600::1]", 0)); + smartlist_add(desc->encrypted_data.intro_points, + hs_helper_build_intro_point(signing_kp, now, "3.2.1.4", 1)); + smartlist_add(desc->encrypted_data.intro_points, + hs_helper_build_intro_point(signing_kp, now, "5.6.7.8", 1)); + } + + descp = desc; + done: + return descp; +} + +/** Helper function to get the HS subcredential using the identity keypair of + * an HS. Used to decrypt descriptors in unittests. */ +void +hs_helper_get_subcred_from_identity_keypair(ed25519_keypair_t *signing_kp, + uint8_t *subcred_out) +{ + ed25519_keypair_t blinded_kp; + uint64_t current_time_period = hs_get_time_period_num(approx_time()); + hs_build_blinded_keypair(signing_kp, NULL, 0, + current_time_period, &blinded_kp); + + hs_get_subcredential(&signing_kp->pubkey, &blinded_kp.pubkey, + subcred_out); +} + +/* Build a descriptor with introduction points. */ +hs_descriptor_t * +hs_helper_build_hs_desc_with_ip(const ed25519_keypair_t *signing_kp) +{ + return hs_helper_build_hs_desc_impl(0, signing_kp); +} + +/* Build a descriptor without any introduction points. */ +hs_descriptor_t * +hs_helper_build_hs_desc_no_ip(const ed25519_keypair_t *signing_kp) +{ + return hs_helper_build_hs_desc_impl(1, signing_kp); +} + +void +hs_helper_desc_equal(const hs_descriptor_t *desc1, + const hs_descriptor_t *desc2) +{ + char *addr1 = NULL, *addr2 = NULL; + /* Plaintext data section. */ + tt_int_op(desc1->plaintext_data.version, OP_EQ, + desc2->plaintext_data.version); + tt_uint_op(desc1->plaintext_data.lifetime_sec, OP_EQ, + desc2->plaintext_data.lifetime_sec); + tt_assert(tor_cert_eq(desc1->plaintext_data.signing_key_cert, + desc2->plaintext_data.signing_key_cert)); + tt_mem_op(desc1->plaintext_data.signing_pubkey.pubkey, OP_EQ, + desc2->plaintext_data.signing_pubkey.pubkey, + ED25519_PUBKEY_LEN); + tt_mem_op(desc1->plaintext_data.blinded_pubkey.pubkey, OP_EQ, + desc2->plaintext_data.blinded_pubkey.pubkey, + ED25519_PUBKEY_LEN); + tt_u64_op(desc1->plaintext_data.revision_counter, ==, + desc2->plaintext_data.revision_counter); + + /* NOTE: We can't compare the encrypted blob because when encoding the + * descriptor, the object is immutable thus we don't update it with the + * encrypted blob. As contrast to the decoding process where we populate a + * descriptor object. */ + + /* Encrypted data section. */ + tt_uint_op(desc1->encrypted_data.create2_ntor, ==, + desc2->encrypted_data.create2_ntor); + + /* Authentication type. */ + tt_int_op(!!desc1->encrypted_data.intro_auth_types, ==, + !!desc2->encrypted_data.intro_auth_types); + if (desc1->encrypted_data.intro_auth_types && + desc2->encrypted_data.intro_auth_types) { + tt_int_op(smartlist_len(desc1->encrypted_data.intro_auth_types), ==, + smartlist_len(desc2->encrypted_data.intro_auth_types)); + for (int i = 0; + i < smartlist_len(desc1->encrypted_data.intro_auth_types); + i++) { + tt_str_op(smartlist_get(desc1->encrypted_data.intro_auth_types, i),OP_EQ, + smartlist_get(desc2->encrypted_data.intro_auth_types, i)); + } + } + + /* Introduction points. */ + { + tt_assert(desc1->encrypted_data.intro_points); + tt_assert(desc2->encrypted_data.intro_points); + tt_int_op(smartlist_len(desc1->encrypted_data.intro_points), ==, + smartlist_len(desc2->encrypted_data.intro_points)); + for (int i=0; i < smartlist_len(desc1->encrypted_data.intro_points); i++) { + hs_desc_intro_point_t *ip1 = smartlist_get(desc1->encrypted_data + .intro_points, i), + *ip2 = smartlist_get(desc2->encrypted_data + .intro_points, i); + tt_assert(tor_cert_eq(ip1->auth_key_cert, ip2->auth_key_cert)); + if (ip1->legacy.key) { + tt_int_op(crypto_pk_cmp_keys(ip1->legacy.key, ip2->legacy.key), + OP_EQ, 0); + } else { + tt_mem_op(&ip1->enc_key, OP_EQ, &ip2->enc_key, CURVE25519_PUBKEY_LEN); + } + + tt_int_op(smartlist_len(ip1->link_specifiers), ==, + smartlist_len(ip2->link_specifiers)); + for (int j = 0; j < smartlist_len(ip1->link_specifiers); j++) { + hs_desc_link_specifier_t *ls1 = smartlist_get(ip1->link_specifiers, j), + *ls2 = smartlist_get(ip2->link_specifiers, j); + tt_int_op(ls1->type, ==, ls2->type); + switch (ls1->type) { + case LS_IPV4: + case LS_IPV6: + { + addr1 = tor_addr_to_str_dup(&ls1->u.ap.addr); + addr2 = tor_addr_to_str_dup(&ls2->u.ap.addr); + tt_str_op(addr1, OP_EQ, addr2); + tor_free(addr1); + tor_free(addr2); + tt_int_op(ls1->u.ap.port, ==, ls2->u.ap.port); + } + break; + case LS_LEGACY_ID: + tt_mem_op(ls1->u.legacy_id, OP_EQ, ls2->u.legacy_id, + sizeof(ls1->u.legacy_id)); + break; + default: + /* Unknown type, caught it and print its value. */ + tt_int_op(ls1->type, OP_EQ, -1); + } + } + } + } + + done: + tor_free(addr1); + tor_free(addr2); +} + diff --git a/src/wraith/src/test/hs_test_helpers.h b/src/wraith/src/test/hs_test_helpers.h new file mode 100644 index 000000000..b1b0490f0 --- /dev/null +++ b/src/wraith/src/test/hs_test_helpers.h @@ -0,0 +1,25 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_HS_TEST_HELPERS_H +#define TOR_HS_TEST_HELPERS_H + +#include "ed25519_cert.h" +#include "hs_descriptor.h" + +/* Set of functions to help build and test descriptors. */ +hs_desc_intro_point_t *hs_helper_build_intro_point( + const ed25519_keypair_t *signing_kp, time_t now, + const char *addr, int legacy); +hs_descriptor_t *hs_helper_build_hs_desc_no_ip( + const ed25519_keypair_t *signing_kp); +hs_descriptor_t *hs_helper_build_hs_desc_with_ip( + const ed25519_keypair_t *signing_kp); +void hs_helper_desc_equal(const hs_descriptor_t *desc1, + const hs_descriptor_t *desc2); +void +hs_helper_get_subcred_from_identity_keypair(ed25519_keypair_t *signing_kp, + uint8_t *subcred_out); + +#endif /* !defined(TOR_HS_TEST_HELPERS_H) */ + diff --git a/src/wraith/src/test/include.am b/src/wraith/src/test/include.am new file mode 100644 index 000000000..a4b9705fd --- /dev/null +++ b/src/wraith/src/test/include.am @@ -0,0 +1,359 @@ +# When the day comes that Tor requires Automake >= 1.12 change +# TESTS_ENVIRONMENT to AM_TESTS_ENVIRONMENT because the former is reserved for +# users while the later is reserved for developers. +TESTS_ENVIRONMENT = \ + export PYTHON="$(PYTHON)"; \ + export SHELL="$(SHELL)"; \ + export abs_top_srcdir="$(abs_top_srcdir)"; \ + export abs_top_builddir="$(abs_top_builddir)"; \ + export builddir="$(builddir)"; \ + export TESTING_TOR_BINARY="$(TESTING_TOR_BINARY)"; \ + export CARGO="$(CARGO)"; \ + export CARGO_ONLINE="$(CARGO_ONLINE)"; + +TESTSCRIPTS = \ + src/test/fuzz_static_testcases.sh \ + src/test/test_zero_length_keys.sh \ + src/test/test_workqueue_cancel.sh \ + src/test/test_workqueue_efd.sh \ + src/test/test_workqueue_efd2.sh \ + src/test/test_workqueue_pipe.sh \ + src/test/test_workqueue_pipe2.sh \ + src/test/test_workqueue_socketpair.sh \ + src/test/test_switch_id.sh + +if USE_RUST +TESTSCRIPTS += \ + src/test/test_rust.sh +endif + +if USEPYTHON +TESTSCRIPTS += src/test/test_ntor.sh src/test/test_hs_ntor.sh src/test/test_bt.sh +endif + +TESTS += src/test/test src/test/test-slow src/test/test-memwipe \ + src/test/test_workqueue \ + src/test/test_keygen.sh \ + src/test/test_key_expiration.sh \ + src/test/test-timers \ + $(TESTSCRIPTS) + +# These flavors are run using automake's test-driver and test-network.sh +TEST_CHUTNEY_FLAVORS = basic-min bridges-min hs-v2-min hs-v3-min \ + single-onion-v23 +# only run if we can ping6 ::1 (localhost) +# IPv6-only v3 single onion services don't work yet, so we don't test the +# single-onion-v23-ipv6-md flavor +TEST_CHUTNEY_FLAVORS_IPV6 = bridges+ipv6-min ipv6-exit-min hs-v23-ipv6-md \ + single-onion-ipv6-md +# only run if we can find a stable (or simply another) version of tor +TEST_CHUTNEY_FLAVORS_MIXED = mixed+hs-v23 + +### This is a lovely feature, but it requires automake >= 1.12, and Tor +### doesn't require that yet. +### +# TEST_EXTENSIONS = .sh +# SH_LOG_COMPILER = $(SHELL) + +noinst_PROGRAMS+= src/test/bench +if UNITTESTS_ENABLED +noinst_PROGRAMS+= \ + src/test/test \ + src/test/test-slow \ + src/test/test-memwipe \ + src/test/test-child \ + src/test/test_workqueue \ + src/test/test-switch-id \ + src/test/test-timers +endif + +src_test_AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \ + -DLOCALSTATEDIR="\"$(localstatedir)\"" \ + -DBINDIR="\"$(bindir)\"" \ + -I"$(top_srcdir)/src/or" -I"$(top_srcdir)/src/ext" \ + -I"$(top_srcdir)/src/trunnel" \ + -I"$(top_srcdir)/src/ext/trunnel" \ + -DTOR_UNIT_TESTS + +# -L flags need to go in LDFLAGS. -l flags need to go in LDADD. +# This seems to matter nowhere but on Windows, but I assure you that it +# matters a lot there, and is quite hard to debug if you forget to do it. + +src_test_test_SOURCES = \ + src/test/log_test_helpers.c \ + src/test/hs_test_helpers.c \ + src/test/rend_test_helpers.c \ + src/test/test.c \ + src/test/test_accounting.c \ + src/test/test_addr.c \ + src/test/test_address.c \ + src/test/test_buffers.c \ + src/test/test_cell_formats.c \ + src/test/test_cell_queue.c \ + src/test/test_channel.c \ + src/test/test_channelpadding.c \ + src/test/test_channeltls.c \ + src/test/test_checkdir.c \ + src/test/test_circuitlist.c \ + src/test/test_circuitmux.c \ + src/test/test_circuitbuild.c \ + src/test/test_circuituse.c \ + src/test/test_circuitstats.c \ + src/test/test_compat_libevent.c \ + src/test/test_config.c \ + src/test/test_connection.c \ + src/test/test_conscache.c \ + src/test/test_consdiff.c \ + src/test/test_consdiffmgr.c \ + src/test/test_containers.c \ + src/test/test_controller.c \ + src/test/test_controller_events.c \ + src/test/test_crypto.c \ + src/test/test_crypto_openssl.c \ + src/test/test_data.c \ + src/test/test_dir.c \ + src/test/test_dir_common.c \ + src/test/test_dir_handle_get.c \ + src/test/test_entryconn.c \ + src/test/test_entrynodes.c \ + src/test/test_guardfraction.c \ + src/test/test_extorport.c \ + src/test/test_hs.c \ + src/test/test_hs_common.c \ + src/test/test_hs_config.c \ + src/test/test_hs_cell.c \ + src/test/test_hs_ntor.c \ + src/test/test_hs_service.c \ + src/test/test_hs_client.c \ + src/test/test_hs_intropoint.c \ + src/test/test_hs_control.c \ + src/test/test_handles.c \ + src/test/test_hs_cache.c \ + src/test/test_hs_descriptor.c \ + src/test/test_introduce.c \ + src/test/test_keypin.c \ + src/test/test_link_handshake.c \ + src/test/test_logging.c \ + src/test/test_microdesc.c \ + src/test/test_nodelist.c \ + src/test/test_oom.c \ + src/test/test_oos.c \ + src/test/test_options.c \ + src/test/test_policy.c \ + src/test/test_procmon.c \ + src/test/test_proto_http.c \ + src/test/test_proto_misc.c \ + src/test/test_protover.c \ + src/test/test_pt.c \ + src/test/test_pubsub.c \ + src/test/test_relay.c \ + src/test/test_relaycell.c \ + src/test/test_rendcache.c \ + src/test/test_replay.c \ + src/test/test_router.c \ + src/test/test_routerkeys.c \ + src/test/test_routerlist.c \ + src/test/test_routerset.c \ + src/test/test_scheduler.c \ + src/test/test_shared_random.c \ + src/test/test_socks.c \ + src/test/test_status.c \ + src/test/test_storagedir.c \ + src/test/test_threads.c \ + src/test/test_tortls.c \ + src/test/test_util.c \ + src/test/test_util_format.c \ + src/test/test_util_process.c \ + src/test/test_helpers.c \ + src/test/test_dns.c \ + src/test/testing_common.c \ + src/test/testing_rsakeys.c \ + src/ext/tinytest.c + +src_test_test_slow_SOURCES = \ + src/test/test_slow.c \ + src/test/test_crypto_slow.c \ + src/test/test_util_slow.c \ + src/test/testing_common.c \ + src/test/testing_rsakeys.c \ + src/ext/tinytest.c + +src_test_test_memwipe_SOURCES = \ + src/test/test-memwipe.c + +src_test_test_timers_SOURCES = \ + src/test/test-timers.c + +src_test_test_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) + +src_test_test_CPPFLAGS= $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) + +src_test_bench_SOURCES = \ + src/test/bench.c + +src_test_test_workqueue_SOURCES = \ + src/test/test_workqueue.c +src_test_test_workqueue_CPPFLAGS= $(src_test_AM_CPPFLAGS) +src_test_test_workqueue_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) + +src_test_test_switch_id_SOURCES = \ + src/test/test_switch_id.c +src_test_test_switch_id_CPPFLAGS= $(src_test_AM_CPPFLAGS) +src_test_test_switch_id_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) +src_test_test_switch_id_LDFLAGS = @TOR_LDFLAGS_zlib@ +src_test_test_switch_id_LDADD = \ + src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + $(rust_ldadd) \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ + @TOR_LIB_WS32@ @TOR_LIB_USERENV@ \ + @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ + +src_test_test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ + @TOR_LDFLAGS_libevent@ +src_test_test_LDADD = src/or/libtor-testing.a \ + src/common/libor-crypto-testing.a \ + $(LIBKECCAK_TINY) \ + $(LIBDONNA) \ + src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + src/common/libor-event-testing.a \ + src/trunnel/libor-trunnel-testing.a \ + src/trace/libor-trace.a \ + $(rust_ldadd) \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ + @CURVE25519_LIBS@ \ + @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ + +src_test_test_slow_CPPFLAGS = $(src_test_test_CPPFLAGS) +src_test_test_slow_CFLAGS = $(src_test_test_CFLAGS) +src_test_test_slow_LDADD = $(src_test_test_LDADD) +src_test_test_slow_LDFLAGS = $(src_test_test_LDFLAGS) + +src_test_test_memwipe_CPPFLAGS = $(src_test_test_CPPFLAGS) +# Don't use bugtrap cflags here: memwipe tests require memory violations. +src_test_test_memwipe_CFLAGS = $(TEST_CFLAGS) +src_test_test_memwipe_LDADD = $(src_test_test_LDADD) +# The LDFLAGS need to include the bugtrap cflags, or else we won't link +# successfully with the libraries built with them. +src_test_test_memwipe_LDFLAGS = $(src_test_test_LDFLAGS) @CFLAGS_BUGTRAP@ + +src_test_bench_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ + @TOR_LDFLAGS_libevent@ +src_test_bench_LDADD = src/or/libtor.a src/common/libor.a \ + src/common/libor-ctime.a \ + src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ + src/common/libor-event.a src/trunnel/libor-trunnel.a \ + src/trace/libor-trace.a \ + $(rust_ldadd) \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ + @CURVE25519_LIBS@ \ + @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ + +src_test_test_workqueue_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ + @TOR_LDFLAGS_libevent@ +src_test_test_workqueue_LDADD = src/or/libtor-testing.a \ + src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \ + src/common/libor-event-testing.a \ + src/trace/libor-trace.a \ + $(rust_ldadd) \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ + @CURVE25519_LIBS@ \ + @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ + +src_test_test_timers_CPPFLAGS = $(src_test_test_CPPFLAGS) +src_test_test_timers_CFLAGS = $(src_test_test_CFLAGS) +src_test_test_timers_LDADD = \ + src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + src/common/libor-event-testing.a \ + src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \ + $(rust_ldadd) \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ + @CURVE25519_LIBS@ \ + @TOR_LZMA_LIBS@ +src_test_test_timers_LDFLAGS = $(src_test_test_LDFLAGS) + +noinst_HEADERS+= \ + src/test/fakechans.h \ + src/test/hs_test_helpers.h \ + src/test/log_test_helpers.h \ + src/test/rend_test_helpers.h \ + src/test/test.h \ + src/test/test_helpers.h \ + src/test/test_dir_common.h \ + src/test/test_connection.h \ + src/test/test_descriptors.inc \ + src/test/example_extrainfo.inc \ + src/test/failing_routerdescs.inc \ + src/test/ed25519_vectors.inc \ + src/test/test_descriptors.inc \ + src/test/test_hs_descriptor.inc \ + src/test/vote_descriptors.inc + +noinst_PROGRAMS+= src/test/test-ntor-cl +noinst_PROGRAMS+= src/test/test-hs-ntor-cl +src_test_test_ntor_cl_SOURCES = src/test/test_ntor_cl.c +src_test_test_ntor_cl_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ +src_test_test_ntor_cl_LDADD = src/or/libtor.a src/common/libor.a \ + src/common/libor-ctime.a \ + src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ + src/trace/libor-trace.a \ + $(rust_ldadd) \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ + @CURVE25519_LIBS@ @TOR_LZMA_LIBS@ +src_test_test_ntor_cl_AM_CPPFLAGS = \ + -I"$(top_srcdir)/src/or" + +src_test_test_hs_ntor_cl_SOURCES = src/test/test_hs_ntor_cl.c +src_test_test_hs_ntor_cl_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ +src_test_test_hs_ntor_cl_LDADD = src/or/libtor.a src/common/libor.a \ + src/common/libor-ctime.a \ + src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ +src_test_test_hs_ntor_cl_AM_CPPFLAGS = \ + -I"$(top_srcdir)/src/or" + + +noinst_PROGRAMS += src/test/test-bt-cl +src_test_test_bt_cl_SOURCES = src/test/test_bt_cl.c +src_test_test_bt_cl_LDADD = src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + src/trace/libor-trace.a \ + $(rust_ldadd) \ + @TOR_LIB_MATH@ \ + @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ +src_test_test_bt_cl_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) +src_test_test_bt_cl_CPPFLAGS= $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) + +EXTRA_DIST += \ + src/test/bt_test.py \ + src/test/ntor_ref.py \ + src/test/hs_ntor_ref.py \ + src/test/hs_build_address.py \ + src/test/hs_indexes.py \ + src/test/fuzz_static_testcases.sh \ + src/test/slownacl_curve25519.py \ + src/test/zero_length_keys.sh \ + src/test/test_keygen.sh \ + src/test/test_key_expiration.sh \ + src/test/test_zero_length_keys.sh \ + src/test/test_ntor.sh src/test/test_hs_ntor.sh src/test/test_bt.sh \ + src/test/test-network.sh \ + src/test/test_rust.sh \ + src/test/test_switch_id.sh \ + src/test/test_workqueue_cancel.sh \ + src/test/test_workqueue_efd.sh \ + src/test/test_workqueue_efd2.sh \ + src/test/test_workqueue_pipe.sh \ + src/test/test_workqueue_pipe2.sh \ + src/test/test_workqueue_socketpair.sh + diff --git a/src/wraith/src/test/log_test_helpers.c b/src/wraith/src/test/log_test_helpers.c new file mode 100644 index 000000000..d5a39cfee --- /dev/null +++ b/src/wraith/src/test/log_test_helpers.c @@ -0,0 +1,241 @@ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +#define LOG_PRIVATE +#include "torlog.h" +#include "log_test_helpers.h" + +/** + * \file log_test_helpers.c + * \brief Code to check for expected log messages during testing. + */ + +static void mock_saving_logv(int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, + const char *format, va_list ap) + CHECK_PRINTF(5, 0); + +/** + * Smartlist of all the logs we've received since we last set up + * log capture. + */ +static smartlist_t *saved_logs = NULL; + +/** Boolean: should we also send messages to the test-runner? */ +static int echo_to_real_logs = 1; + +/** Record logs at this level or more severe */ +static int record_logs_at_level = LOG_ERR; + +static int saved_log_level = 0; + +/** + * As setup_capture_of_logs, but do not relay log messages into the main + * logging system. + * + * Avoid using this function; use setup_capture_of_logs() instead if you + * can. If you must use this function, then make sure you detect any + * unexpected log messages, and treat them as test failures. */ +void +setup_full_capture_of_logs(int new_level) +{ + setup_capture_of_logs(new_level); + echo_to_real_logs = 0; +} + +/** + * Temporarily capture all the messages logged at severity new_level or + * higher. + * + * This function does not prevent messages from being sent to the main + * logging system. + */ +void +setup_capture_of_logs(int new_level) +{ + if (saved_log_level == 0) { + saved_log_level = log_global_min_severity_; + } else { + tor_assert(0); + } + + /* Only change the log_global_min_severity_ if we're making things _more_ + * verbose. Otherwise we could prevent real log messages that the test- + * runner wanted. + */ + if (log_global_min_severity_ < new_level) + log_global_min_severity_ = new_level; + + record_logs_at_level = new_level; + mock_clean_saved_logs(); + saved_logs = smartlist_new(); + MOCK(logv, mock_saving_logv); + echo_to_real_logs = 1; +} + +/** + * Undo setup_capture_of_logs(). + * + * This function is safe to call more than once. + */ +void +teardown_capture_of_logs(void) +{ + UNMOCK(logv); + if (saved_log_level) + log_global_min_severity_ = saved_log_level; + saved_log_level = 0; + mock_clean_saved_logs(); +} + +/** + * Clear all messages in mock_saved_logs() + */ +void +mock_clean_saved_logs(void) +{ + if (!saved_logs) + return; + SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m, + { tor_free(m->generated_msg); tor_free(m); }); + smartlist_free(saved_logs); + saved_logs = NULL; +} + +/** + * Return a list of all the messages captured since the last + * setup_[full_]capture_of_logs() call. Each log call is recorded as a + * mock_saved_log_entry_t. + */ +const smartlist_t * +mock_saved_logs(void) +{ + return saved_logs; +} + +int +mock_saved_log_n_entries(void) +{ + return saved_logs ? smartlist_len(saved_logs) : 0; +} + +/** + * Return true iff there is a message recorded by log capture + * that is exactly equal to msg + */ +int +mock_saved_log_has_message(const char *msg) +{ + if (saved_logs) { + SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m, + { + if (msg && m->generated_msg && + !strcmp(msg, m->generated_msg)) { + return 1; + } + }); + } + + return 0; +} + +/** + * Return true iff there is a message recorded by log capture + * that contains msg as a substring. + */ +int +mock_saved_log_has_message_containing(const char *msg) +{ + if (saved_logs) { + SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m, + { + if (msg && m->generated_msg && + strstr(m->generated_msg, msg)) { + return 1; + } + }); + } + + return 0; +} + +/** Return true iff the saved logs have any messages with severity */ +int +mock_saved_log_has_severity(int severity) +{ + int has_sev = 0; + if (saved_logs) { + SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m, + { + if (m->severity == severity) { + has_sev = 1; + } + }); + } + + return has_sev; +} + +/** Return true iff the the saved logs have at lease one message */ +int +mock_saved_log_has_entry(void) +{ + if (saved_logs) { + return smartlist_len(saved_logs) > 0; + } + return 0; +} + +/* Replacement for logv: record the log message, and (maybe) send it + * into the logging system again. + */ +static void +mock_saving_logv(int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, + const char *format, va_list ap) +{ + char *buf = tor_malloc_zero(10240); + int n; + n = tor_vsnprintf(buf,10240,format,ap); + tor_assert(n < 10240-1); + buf[n]='\n'; + buf[n+1]='\0'; + + if (echo_to_real_logs) { + tor_log(severity, domain|LD_NO_MOCK, "%s", buf); + } + + if (severity > record_logs_at_level) { + tor_free(buf); + return; + } + + if (!saved_logs) + saved_logs = smartlist_new(); + + mock_saved_log_entry_t *e = tor_malloc_zero(sizeof(mock_saved_log_entry_t)); + e->severity = severity; + e->funcname = funcname; + e->suffix = suffix; + e->format = format; + e->generated_msg = tor_strdup(buf); + tor_free(buf); + + smartlist_add(saved_logs, e); +} + +void +mock_dump_saved_logs(void) +{ + if (saved_logs == NULL) { + puts(" Captured logs: NULL"); + return; + } + + puts(" Captured logs:"); + SMARTLIST_FOREACH_BEGIN(saved_logs, const mock_saved_log_entry_t *, m) { + printf("% 5d. %s: %s\n", m_sl_idx + 1, + log_level_to_string(m->severity), + escaped(m->generated_msg)); + } SMARTLIST_FOREACH_END(m); +} + diff --git a/src/wraith/src/test/log_test_helpers.h b/src/wraith/src/test/log_test_helpers.h new file mode 100644 index 000000000..70c584eb3 --- /dev/null +++ b/src/wraith/src/test/log_test_helpers.h @@ -0,0 +1,105 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" + +#ifndef TOR_LOG_TEST_HELPERS_H +#define TOR_LOG_TEST_HELPERS_H + +/** An element of mock_saved_logs(); records the log element that we + * received. */ +typedef struct mock_saved_log_entry_t { + int severity; + const char *funcname; + const char *suffix; + const char *format; + char *generated_msg; +} mock_saved_log_entry_t; + +void mock_clean_saved_logs(void); +const smartlist_t *mock_saved_logs(void); +void setup_capture_of_logs(int new_level); +void setup_full_capture_of_logs(int new_level); +void teardown_capture_of_logs(void); + +int mock_saved_log_has_message(const char *msg); +int mock_saved_log_has_message_containing(const char *msg); +int mock_saved_log_has_severity(int severity); +int mock_saved_log_has_entry(void); +int mock_saved_log_n_entries(void); +void mock_dump_saved_logs(void); + +#define assert_log_predicate(predicate, failure_msg) \ + do { \ + if (!(predicate)) { \ + tt_fail_msg((failure_msg)); \ + mock_dump_saved_logs(); \ + TT_EXIT_TEST_FUNCTION; \ + } \ + } while (0) + +#define expect_log_msg(str) \ + assert_log_predicate(mock_saved_log_has_message(str), \ + "expected log to contain " # str); + +#define expect_log_msg_containing(str) \ + assert_log_predicate(mock_saved_log_has_message_containing(str), \ + "expected log to contain " # str); + +#define expect_log_msg_containing_either(str1, str2) \ + assert_log_predicate(mock_saved_log_has_message_containing(str1) || \ + mock_saved_log_has_message_containing(str2), \ + "expected log to contain " # str1 " or " # str2); + +#define expect_log_msg_containing_either3(str1, str2, str3) \ + assert_log_predicate(mock_saved_log_has_message_containing(str1) || \ + mock_saved_log_has_message_containing(str2) || \ + mock_saved_log_has_message_containing(str3), \ + "expected log to contain " # str1 " or " # str2 \ + " or " # str3); + +#define expect_log_msg_containing_either4(str1, str2, str3, str4) \ + assert_log_predicate(mock_saved_log_has_message_containing(str1) || \ + mock_saved_log_has_message_containing(str2) || \ + mock_saved_log_has_message_containing(str3) || \ + mock_saved_log_has_message_containing(str4), \ + "expected log to contain " # str1 " or " # str2 \ + " or " # str3 " or " # str4); + +#define expect_single_log_msg(str) \ + do { \ + \ + assert_log_predicate(mock_saved_log_has_message_containing(str) && \ + mock_saved_log_n_entries() == 1, \ + "expected log to contain exactly 1 message " # str); \ + } while (0); + +#define expect_single_log_msg_containing(str) \ + do { \ + assert_log_predicate(mock_saved_log_has_message_containing(str)&& \ + mock_saved_log_n_entries() == 1 , \ + "expected log to contain 1 message, containing " # str); \ + } while (0); + +#define expect_no_log_msg(str) \ + assert_log_predicate(!mock_saved_log_has_message(str), \ + "expected log to not contain " # str); + +#define expect_log_severity(severity) \ + assert_log_predicate(mock_saved_log_has_severity(severity), \ + "expected log to contain severity " # severity); + +#define expect_no_log_severity(severity) \ + assert_log_predicate(!mock_saved_log_has_severity(severity), \ + "expected log to not contain severity " # severity); + +#define expect_log_entry() \ + assert_log_predicate(mock_saved_log_has_entry(), \ + "expected log to contain entries"); + +#define expect_no_log_entry() \ + assert_log_predicate(!mock_saved_log_has_entry(), \ + "expected log to not contain entries"); + +#endif /* !defined(TOR_LOG_TEST_HELPERS_H) */ + diff --git a/src/wraith/src/test/ntor_ref.py b/src/wraith/src/test/ntor_ref.py new file mode 100644 index 000000000..c753588f9 --- /dev/null +++ b/src/wraith/src/test/ntor_ref.py @@ -0,0 +1,405 @@ +#!/usr/bin/python +# Copyright 2012-2017, The Tor Project, Inc +# See LICENSE for licensing information + +""" +ntor_ref.py + + +This module is a reference implementation for the "ntor" protocol +s proposed by Goldberg, Stebila, and Ustaoglu and as instantiated in +Tor Proposal 216. + +It's meant to be used to validate Tor's ntor implementation. It +requirs the curve25519 python module from the curve25519-donna +package. + + *** DO NOT USE THIS IN PRODUCTION. *** + +commands: + + gen_kdf_vectors: Print out some test vectors for the RFC5869 KDF. + timing: Print a little timing information about this implementation's + handshake. + self-test: Try handshaking with ourself; make sure we can. + test-tor: Handshake with tor's ntor implementation via the program + src/test/test-ntor-cl; make sure we can. + +""" + +import binascii +try: + import curve25519 + curve25519mod = curve25519.keys +except ImportError: + curve25519 = None + import slownacl_curve25519 + curve25519mod = slownacl_curve25519 + +import hashlib +import hmac +import subprocess +import sys + +# ********************************************************************** +# Helpers and constants + +def HMAC(key,msg): + "Return the HMAC-SHA256 of 'msg' using the key 'key'." + H = hmac.new(key, b"", hashlib.sha256) + H.update(msg) + return H.digest() + +def H(msg,tweak): + """Return the hash of 'msg' using tweak 'tweak'. (In this version of ntor, + the tweaked hash is just HMAC with the tweak as the key.)""" + return HMAC(key=tweak, + msg=msg) + +def keyid(k): + """Return the 32-byte key ID of a public key 'k'. (Since we're + using curve25519, we let k be its own keyid.) + """ + return k.serialize() + +NODE_ID_LENGTH = 20 +KEYID_LENGTH = 32 +G_LENGTH = 32 +H_LENGTH = 32 + +PROTOID = b"ntor-curve25519-sha256-1" +M_EXPAND = PROTOID + b":key_expand" +T_MAC = PROTOID + b":mac" +T_KEY = PROTOID + b":key_extract" +T_VERIFY = PROTOID + b":verify" + +def H_mac(msg): return H(msg, tweak=T_MAC) +def H_verify(msg): return H(msg, tweak=T_VERIFY) + +class PrivateKey(curve25519mod.Private): + """As curve25519mod.Private, but doesn't regenerate its public key + every time you ask for it. + """ + def __init__(self): + curve25519mod.Private.__init__(self) + self._memo_public = None + + def get_public(self): + if self._memo_public is None: + self._memo_public = curve25519mod.Private.get_public(self) + + return self._memo_public + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +if sys.version < '3': + def int2byte(i): + return chr(i) +else: + def int2byte(i): + return bytes([i]) + +def kdf_rfc5869(key, salt, info, n): + + prk = HMAC(key=salt, msg=key) + + out = b"" + last = b"" + i = 1 + while len(out) < n: + m = last + info + int2byte(i) + last = h = HMAC(key=prk, msg=m) + out += h + i = i + 1 + return out[:n] + +def kdf_ntor(key, n): + return kdf_rfc5869(key, T_KEY, M_EXPAND, n) + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +def client_part1(node_id, pubkey_B): + """Initial handshake, client side. + + From the specification: + + <> + + Takes node_id -- a digest of the server's identity key, + pubkey_B -- a public key for the server. + Returns a tuple of (client secret key x, client->server message)""" + + assert len(node_id) == NODE_ID_LENGTH + + key_id = keyid(pubkey_B) + seckey_x = PrivateKey() + pubkey_X = seckey_x.get_public().serialize() + + message = node_id + key_id + pubkey_X + + assert len(message) == NODE_ID_LENGTH + H_LENGTH + H_LENGTH + return seckey_x , message + +def hash_nil(x): + """Identity function: if we don't pass a hash function that does nothing, + the curve25519 python lib will try to sha256 it for us.""" + return x + +def bad_result(r): + """Helper: given a result of multiplying a public key by a private key, + return True iff one of the inputs was broken""" + assert len(r) == 32 + return r == '\x00'*32 + +def server(seckey_b, my_node_id, message, keyBytes=72): + """Handshake step 2, server side. + + From the spec: + + << + The server generates a keypair of y,Y = KEYGEN(), and computes + + secret_input = EXP(X,y) | EXP(X,b) | ID | B | X | Y | PROTOID + KEY_SEED = H(secret_input, t_key) + verify = H(secret_input, t_verify) + auth_input = verify | ID | B | Y | X | PROTOID | "Server" + + The server sends a CREATED cell containing: + + SERVER_PK: Y -- G_LENGTH bytes + AUTH: H(auth_input, t_mac) -- H_LENGTH byets + >> + + Takes seckey_b -- the server's secret key + my_node_id -- the servers's public key digest, + message -- a message from a client + keybytes -- amount of key material to generate + + Returns a tuple of (key material, sever->client reply), or None on + error. + """ + + assert len(message) == NODE_ID_LENGTH + H_LENGTH + H_LENGTH + + if my_node_id != message[:NODE_ID_LENGTH]: + return None + + badness = (keyid(seckey_b.get_public()) != + message[NODE_ID_LENGTH:NODE_ID_LENGTH+H_LENGTH]) + + pubkey_X = curve25519mod.Public(message[NODE_ID_LENGTH+H_LENGTH:]) + seckey_y = PrivateKey() + pubkey_Y = seckey_y.get_public() + pubkey_B = seckey_b.get_public() + xy = seckey_y.get_shared_key(pubkey_X, hash_nil) + xb = seckey_b.get_shared_key(pubkey_X, hash_nil) + + # secret_input = EXP(X,y) | EXP(X,b) | ID | B | X | Y | PROTOID + secret_input = (xy + xb + my_node_id + + pubkey_B.serialize() + + pubkey_X.serialize() + + pubkey_Y.serialize() + + PROTOID) + + verify = H_verify(secret_input) + + # auth_input = verify | ID | B | Y | X | PROTOID | "Server" + auth_input = (verify + + my_node_id + + pubkey_B.serialize() + + pubkey_Y.serialize() + + pubkey_X.serialize() + + PROTOID + + b"Server") + + msg = pubkey_Y.serialize() + H_mac(auth_input) + + badness += bad_result(xb) + badness += bad_result(xy) + + if badness: + return None + + keys = kdf_ntor(secret_input, keyBytes) + + return keys, msg + +def client_part2(seckey_x, msg, node_id, pubkey_B, keyBytes=72): + """Handshake step 3: client side again. + + From the spec: + + << + The client then checks Y is in G^* [see NOTE below], and computes + + secret_input = EXP(Y,x) | EXP(B,x) | ID | B | X | Y | PROTOID + KEY_SEED = H(secret_input, t_key) + verify = H(secret_input, t_verify) + auth_input = verify | ID | B | Y | X | PROTOID | "Server" + + The client verifies that AUTH == H(auth_input, t_mac). + >> + + Takes seckey_x -- the secret key we generated in step 1. + msg -- the message from the server. + node_id -- the node_id we used in step 1. + server_key -- the same public key we used in step 1. + keyBytes -- the number of bytes we want to generate + Returns key material, or None on error + + """ + assert len(msg) == G_LENGTH + H_LENGTH + + pubkey_Y = curve25519mod.Public(msg[:G_LENGTH]) + their_auth = msg[G_LENGTH:] + + pubkey_X = seckey_x.get_public() + + yx = seckey_x.get_shared_key(pubkey_Y, hash_nil) + bx = seckey_x.get_shared_key(pubkey_B, hash_nil) + + + # secret_input = EXP(Y,x) | EXP(B,x) | ID | B | X | Y | PROTOID + secret_input = (yx + bx + node_id + + pubkey_B.serialize() + + pubkey_X.serialize() + + pubkey_Y.serialize() + PROTOID) + + verify = H_verify(secret_input) + + # auth_input = verify | ID | B | Y | X | PROTOID | "Server" + auth_input = (verify + node_id + + pubkey_B.serialize() + + pubkey_Y.serialize() + + pubkey_X.serialize() + PROTOID + + b"Server") + + my_auth = H_mac(auth_input) + + badness = my_auth != their_auth + badness |= bad_result(yx) + bad_result(bx) + + if badness: + return None + + return kdf_ntor(secret_input, keyBytes) + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +def demo(node_id=b"iToldYouAboutStairs.", server_key=PrivateKey()): + """ + Try to handshake with ourself. + """ + x, create = client_part1(node_id, server_key.get_public()) + skeys, created = server(server_key, node_id, create) + ckeys = client_part2(x, created, node_id, server_key.get_public()) + assert len(skeys) == 72 + assert len(ckeys) == 72 + assert skeys == ckeys + print("OK") + +# ====================================================================== +def timing(): + """ + Use Python's timeit module to see how fast this nonsense is + """ + import timeit + t = timeit.Timer(stmt="ntor_ref.demo(N,SK)", + setup="import ntor_ref,curve25519;N='ABCD'*5;SK=ntor_ref.PrivateKey()") + print(t.timeit(number=1000)) + +# ====================================================================== + +def kdf_vectors(): + """ + Generate some vectors to check our KDF. + """ + import binascii + def kdf_vec(inp): + k = kdf_rfc5869(inp, T_KEY, M_EXPAND, 100) + print(repr(inp), "\n\""+ binascii.b2a_hex(k)+ "\"") + kdf_vec("") + kdf_vec("Tor") + kdf_vec("AN ALARMING ITEM TO FIND ON YOUR CREDIT-RATING STATEMENT") + +# ====================================================================== + + +def test_tor(): + """ + Call the test-ntor-cl command-line program to make sure we can + interoperate with Tor's ntor program + """ + enhex=lambda s: binascii.b2a_hex(s) + dehex=lambda s: binascii.a2b_hex(s.strip()) + + PROG = b"./src/test/test-ntor-cl" + def tor_client1(node_id, pubkey_B): + " returns (msg, state) " + p = subprocess.Popen([PROG, b"client1", enhex(node_id), + enhex(pubkey_B.serialize())], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + def tor_server1(seckey_b, node_id, msg, n): + " returns (msg, keys) " + p = subprocess.Popen([PROG, "server1", enhex(seckey_b.serialize()), + enhex(node_id), enhex(msg), str(n)], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + def tor_client2(state, msg, n): + " returns (keys,) " + p = subprocess.Popen([PROG, "client2", enhex(state), + enhex(msg), str(n)], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + + + node_id = b"thisisatornodeid$#%^" + seckey_b = PrivateKey() + pubkey_B = seckey_b.get_public() + + # Do a pure-Tor handshake + c2s_msg, c_state = tor_client1(node_id, pubkey_B) + s2c_msg, s_keys = tor_server1(seckey_b, node_id, c2s_msg, 90) + c_keys, = tor_client2(c_state, s2c_msg, 90) + assert c_keys == s_keys + assert len(c_keys) == 90 + + # Try a mixed handshake with Tor as the client + c2s_msg, c_state = tor_client1(node_id, pubkey_B) + s_keys, s2c_msg = server(seckey_b, node_id, c2s_msg, 90) + c_keys, = tor_client2(c_state, s2c_msg, 90) + assert c_keys == s_keys + assert len(c_keys) == 90 + + # Now do a mixed handshake with Tor as the server + c_x, c2s_msg = client_part1(node_id, pubkey_B) + s2c_msg, s_keys = tor_server1(seckey_b, node_id, c2s_msg, 90) + c_keys = client_part2(c_x, s2c_msg, node_id, pubkey_B, 90) + assert c_keys == s_keys + assert len(c_keys) == 90 + + print("OK") + +# ====================================================================== + +if __name__ == '__main__': + if len(sys.argv) < 2: + print(__doc__) + elif sys.argv[1] == 'gen_kdf_vectors': + kdf_vectors() + elif sys.argv[1] == 'timing': + timing() + elif sys.argv[1] == 'self-test': + demo() + elif sys.argv[1] == 'test-tor': + test_tor() + + else: + print(__doc__) diff --git a/src/wraith/src/test/rend_test_helpers.c b/src/wraith/src/test/rend_test_helpers.c new file mode 100644 index 000000000..095bfecf2 --- /dev/null +++ b/src/wraith/src/test/rend_test_helpers.c @@ -0,0 +1,89 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "test.h" +#include "rendcommon.h" +#include "rend_test_helpers.h" + +void +generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc, + char **service_id, int intro_points) +{ + rend_service_descriptor_t *generated = NULL; + smartlist_t *descs = smartlist_new(); + time_t now; + + now = time(NULL) + time_diff; + create_descriptor(&generated, service_id, intro_points); + generated->timestamp = now; + + rend_encode_v2_descriptors(descs, generated, now, 0, REND_NO_AUTH, NULL, + NULL); + tor_assert(smartlist_len(descs) > 1); + *desc = smartlist_get(descs, 0); + smartlist_set(descs, 0, NULL); + + SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, + rend_encoded_v2_service_descriptor_free(d)); + smartlist_free(descs); + rend_service_descriptor_free(generated); +} + +void +create_descriptor(rend_service_descriptor_t **generated, char **service_id, + int intro_points) +{ + crypto_pk_t *pk1 = NULL; + crypto_pk_t *pk2 = NULL; + int i; + + *service_id = tor_malloc(REND_SERVICE_ID_LEN_BASE32+1); + pk1 = pk_generate(0); + pk2 = pk_generate(1); + + *generated = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + (*generated)->pk = crypto_pk_dup_key(pk1); + rend_get_service_id((*generated)->pk, *service_id); + + (*generated)->version = 2; + (*generated)->protocols = 42; + (*generated)->intro_nodes = smartlist_new(); + + for (i = 0; i < intro_points; i++) { + rend_intro_point_t *intro = tor_malloc_zero(sizeof(rend_intro_point_t)); + crypto_pk_t *okey = pk_generate(2 + i); + intro->extend_info = tor_malloc_zero(sizeof(extend_info_t)); + intro->extend_info->onion_key = okey; + crypto_pk_get_digest(intro->extend_info->onion_key, + intro->extend_info->identity_digest); + intro->extend_info->nickname[0] = '$'; + base16_encode(intro->extend_info->nickname + 1, + sizeof(intro->extend_info->nickname) - 1, + intro->extend_info->identity_digest, DIGEST_LEN); + tor_addr_from_ipv4h(&intro->extend_info->addr, crypto_rand_int(65536)); + intro->extend_info->port = 1 + crypto_rand_int(65535); + intro->intro_key = crypto_pk_dup_key(pk2); + smartlist_add((*generated)->intro_nodes, intro); + } + + crypto_pk_free(pk1); + crypto_pk_free(pk2); +} + +rend_data_t * +mock_rend_data(const char *onion_address) +{ + rend_data_v2_t *v2_data = tor_malloc_zero(sizeof(*v2_data)); + rend_data_t *rend_query = &v2_data->base_; + rend_query->version = 2; + + strlcpy(v2_data->onion_address, onion_address, + sizeof(v2_data->onion_address)); + v2_data->auth_type = REND_NO_AUTH; + rend_query->hsdirs_fp = smartlist_new(); + smartlist_add(rend_query->hsdirs_fp, tor_memdup("aaaaaaaaaaaaaaaaaaaaaaaa", + DIGEST_LEN)); + return rend_query; +} + diff --git a/src/wraith/src/test/rend_test_helpers.h b/src/wraith/src/test/rend_test_helpers.h new file mode 100644 index 000000000..abf432498 --- /dev/null +++ b/src/wraith/src/test/rend_test_helpers.h @@ -0,0 +1,16 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" + +#ifndef TOR_REND_TEST_HELPERS_H +#define TOR_REND_TEST_HELPERS_H + +void generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc, + char **service_id, int intro_points); +void create_descriptor(rend_service_descriptor_t **generated, + char **service_id, int intro_points); +rend_data_t *mock_rend_data(const char *onion_address); + +#endif /* !defined(TOR_REND_TEST_HELPERS_H) */ + diff --git a/src/wraith/src/test/slow_ed25519.py b/src/wraith/src/test/slow_ed25519.py new file mode 100644 index 000000000..f44708b20 --- /dev/null +++ b/src/wraith/src/test/slow_ed25519.py @@ -0,0 +1,115 @@ +# This is the ed25519 implementation from +# http://ed25519.cr.yp.to/python/ed25519.py . +# It is in the public domain. +# +# It isn't constant-time. Don't use it except for testing. Also, see +# warnings about how very slow it is. Only use this for generating +# test vectors, I'd suggest. +# +# Don't edit this file. Mess with ed25519_ref.py + +import hashlib + +b = 256 +q = 2**255 - 19 +l = 2**252 + 27742317777372353535851937790883648493 + +def H(m): + return hashlib.sha512(m).digest() + +def expmod(b,e,m): + if e == 0: return 1 + t = expmod(b,e/2,m)**2 % m + if e & 1: t = (t*b) % m + return t + +def inv(x): + return expmod(x,q-2,q) + +d = -121665 * inv(121666) +I = expmod(2,(q-1)/4,q) + +def xrecover(y): + xx = (y*y-1) * inv(d*y*y+1) + x = expmod(xx,(q+3)/8,q) + if (x*x - xx) % q != 0: x = (x*I) % q + if x % 2 != 0: x = q-x + return x + +By = 4 * inv(5) +Bx = xrecover(By) +B = [Bx % q,By % q] + +def edwards(P,Q): + x1 = P[0] + y1 = P[1] + x2 = Q[0] + y2 = Q[1] + x3 = (x1*y2+x2*y1) * inv(1+d*x1*x2*y1*y2) + y3 = (y1*y2+x1*x2) * inv(1-d*x1*x2*y1*y2) + return [x3 % q,y3 % q] + +def scalarmult(P,e): + if e == 0: return [0,1] + Q = scalarmult(P,e/2) + Q = edwards(Q,Q) + if e & 1: Q = edwards(Q,P) + return Q + +def encodeint(y): + bits = [(y >> i) & 1 for i in range(b)] + return ''.join([chr(sum([bits[i * 8 + j] << j for j in range(8)])) for i in range(b/8)]) + +def encodepoint(P): + x = P[0] + y = P[1] + bits = [(y >> i) & 1 for i in range(b - 1)] + [x & 1] + return ''.join([chr(sum([bits[i * 8 + j] << j for j in range(8)])) for i in range(b/8)]) + +def bit(h,i): + return (ord(h[i/8]) >> (i%8)) & 1 + +def publickey(sk): + h = H(sk) + a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) + A = scalarmult(B,a) + return encodepoint(A) + +def Hint(m): + h = H(m) + return sum(2**i * bit(h,i) for i in range(2*b)) + +def signature(m,sk,pk): + h = H(sk) + a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) + r = Hint(''.join([h[i] for i in range(b/8,b/4)]) + m) + R = scalarmult(B,r) + S = (r + Hint(encodepoint(R) + pk + m) * a) % l + return encodepoint(R) + encodeint(S) + +def isoncurve(P): + x = P[0] + y = P[1] + return (-x*x + y*y - 1 - d*x*x*y*y) % q == 0 + +def decodeint(s): + return sum(2**i * bit(s,i) for i in range(0,b)) + +def decodepoint(s): + y = sum(2**i * bit(s,i) for i in range(0,b-1)) + x = xrecover(y) + if x & 1 != bit(s,b-1): x = q-x + P = [x,y] + if not isoncurve(P): raise Exception("decoding point that is not on curve") + return P + +def checkvalid(s,m,pk): + if len(s) != b/4: raise Exception("signature length is wrong") + if len(pk) != b/8: raise Exception("public-key length is wrong") + R = decodepoint(s[0:b/8]) + A = decodepoint(pk) + S = decodeint(s[b/8:b/4]) + h = Hint(encodepoint(R) + pk + m) + if scalarmult(B,S) != edwards(R,scalarmult(A,h)): + raise Exception("signature does not pass verification") + diff --git a/src/wraith/src/test/slownacl_curve25519.py b/src/wraith/src/test/slownacl_curve25519.py new file mode 100644 index 000000000..4dabab61b --- /dev/null +++ b/src/wraith/src/test/slownacl_curve25519.py @@ -0,0 +1,117 @@ +# This is the curve25519 implementation from Matthew Dempsky's "Slownacl" +# library. It is in the public domain. +# +# It isn't constant-time. Don't use it except for testing. +# +# Nick got the slownacl source from: +# https://github.com/mdempsky/dnscurve/tree/master/slownacl + +__all__ = ['smult_curve25519_base', 'smult_curve25519'] + +import sys + +P = 2 ** 255 - 19 +A = 486662 + +def expmod(b, e, m): + if e == 0: return 1 + t = expmod(b, e // 2, m) ** 2 % m + if e & 1: t = (t * b) % m + return t + +def inv(x): + return expmod(x, P - 2, P) + +# Addition and doubling formulas taken from Appendix D of "Curve25519: +# new Diffie-Hellman speed records". + +def add(n,m,d): + (xn,zn), (xm,zm), (xd,zd) = n, m, d + x = 4 * (xm * xn - zm * zn) ** 2 * zd + z = 4 * (xm * zn - zm * xn) ** 2 * xd + return (x % P, z % P) + +def double(n): + (xn,zn) = n + x = (xn ** 2 - zn ** 2) ** 2 + z = 4 * xn * zn * (xn ** 2 + A * xn * zn + zn ** 2) + return (x % P, z % P) + +def curve25519(n, base): + one = (base,1) + two = double(one) + # f(m) evaluates to a tuple containing the mth multiple and the + # (m+1)th multiple of base. + def f(m): + if m == 1: return (one, two) + (pm, pm1) = f(m // 2) + if (m & 1): + return (add(pm, pm1, one), double(pm1)) + return (double(pm), add(pm, pm1, one)) + ((x,z), _) = f(n) + return (x * inv(z)) % P + +if sys.version < '3': + def b2i(c): + return ord(c) + def i2b(i): + return chr(i) + def ba2bs(ba): + return "".join(ba) +else: + def b2i(c): + return c + def i2b(i): + return i + def ba2bs(ba): + return bytes(ba) + +def unpack(s): + if len(s) != 32: raise ValueError('Invalid Curve25519 argument') + return sum(b2i(s[i]) << (8 * i) for i in range(32)) + +def pack(n): + return ba2bs([i2b((n >> (8 * i)) & 255) for i in range(32)]) + +def clamp(n): + n &= ~7 + n &= ~(128 << 8 * 31) + n |= 64 << 8 * 31 + return n + +def smult_curve25519(n, p): + n = clamp(unpack(n)) + p = unpack(p) + return pack(curve25519(n, p)) + +def smult_curve25519_base(n): + n = clamp(unpack(n)) + return pack(curve25519(n, 9)) + + +# +# This part I'm adding in for compatibility with the curve25519 python +# module. -Nick +# +import os + +class Private: + def __init__(self, secret=None, seed=None): + self.private = pack(clamp(unpack(os.urandom(32)))) + + def get_public(self): + return Public(smult_curve25519_base(self.private)) + + def get_shared_key(self, public, hashfn): + return hashfn(smult_curve25519(self.private, public.public)) + + def serialize(self): + return self.private + +class Public: + def __init__(self, public): + self.public = public + + def serialize(self): + return self.public + diff --git a/src/wraith/src/test/sr_commit_calc_ref.py b/src/wraith/src/test/sr_commit_calc_ref.py new file mode 100644 index 000000000..45e629cfb --- /dev/null +++ b/src/wraith/src/test/sr_commit_calc_ref.py @@ -0,0 +1,51 @@ +# This is a reference implementation of the COMMIT/REVEAL calculation for +# prop250. We use it to generate a test vector for the test_encoding() +# unittest. +# +# Here is the computation formula: +# +# H = SHA3-256 +# TIMESTAMP = 8 bytes network-endian value +# RAND = H(32 bytes of random) +# +# REVEAL = base64-encode( TIMESTAMP || RAND ) +# COMMIT = base64-encode( TIMESTAMP || H(REVEAL) ) +# + +import sys +import hashlib +import struct +import base64 + +# Python 3.6+, the SHA3 is available in hashlib natively. Else this requires +# the pysha3 package (pip install pysha3). +if sys.version_info < (3, 6): + import sha3 + +# Test vector to make sure the right sha3 version will be used. pysha3 < 1.0 +# used the old Keccak implementation. During the finalization of SHA3, NIST +# changed the delimiter suffix from 0x01 to 0x06. The Keccak sponge function +# stayed the same. pysha3 1.0 provides the previous Keccak hash, too. +TEST_VALUE = "e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51" +if TEST_VALUE != sha3.sha3_256(b"Hello World").hexdigest(): + print("pysha3 version is < 1.0. Please install from:") + print("https://github.com/tiran/pysha3https://github.com/tiran/pysha3") + sys.exit(1) + +# TIMESTAMP +ts = 1454333590 +# RAND +data = 'A' * 32 # Yes very very random, NIST grade :). +rand = hashlib.sha3_256(data) + +reveal = struct.pack('!Q', ts) + rand.digest() +b64_reveal = base64.b64encode(reveal) +print("REVEAL: %s" % (b64_reveal)) + +# Yes we do hash the _encoded_ reveal here that is H(REVEAL) +hashed_reveal = hashlib.sha3_256(b64_reveal) +commit = struct.pack('!Q', ts) + hashed_reveal.digest() +print("COMMIT: %s" % (base64.b64encode(commit))) + +# REVEAL: AAAAAFavXpZJxbwTupvaJCTeIUCQmOPxAMblc7ChL5H2nZKuGchdaA== +# COMMIT: AAAAAFavXpbkBMzMQG7aNoaGLFNpm2Wkk1ozXhuWWqL//GynltxVAg== diff --git a/src/wraith/src/test/sr_srv_calc_ref.py b/src/wraith/src/test/sr_srv_calc_ref.py new file mode 100644 index 000000000..492ca62b1 --- /dev/null +++ b/src/wraith/src/test/sr_srv_calc_ref.py @@ -0,0 +1,71 @@ +# This is a reference implementation of the SRV calculation for prop250. We +# use it to generate a test vector for the test_sr_compute_srv() unittest. +# (./test shared-random/sr_compute_srv) +# +# Here is the SRV computation formula: +# +# HASHED_REVEALS = H(ID_a | R_a | ID_b | R_b | ..) +# +# SRV = SHA3-256("shared-random" | INT_8(reveal_num) | INT_4(version) | +# HASHED_REVEALS | previous_SRV) +# + +import sys +import hashlib +import struct + +# Python 3.6+, the SHA3 is available in hashlib natively. Else this requires +# the pysha3 package (pip install pysha3). +if sys.version_info < (3, 6): + import sha3 + +# Test vector to make sure the right sha3 version will be used. pysha3 < 1.0 +# used the old Keccak implementation. During the finalization of SHA3, NIST +# changed the delimiter suffix from 0x01 to 0x06. The Keccak sponge function +# stayed the same. pysha3 1.0 provides the previous Keccak hash, too. +TEST_VALUE = "e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51" +if TEST_VALUE != sha3.sha3_256(b"Hello World").hexdigest(): + print("pysha3 version is < 1.0. Please install from:") + print("https://github.com/tiran/pysha3https://github.com/tiran/pysha3") + sys.exit(1) + +# In this example, we use three reveal values. +reveal_num = 3 +version = 1 + +# We set directly the ascii value because memset(buf, 'A', 20) makes it to 20 +# times "41" in the final string. + +# Identity and reveal value of dirauth a +ID_a = 20 * "41" # RSA identity of 40 base16 bytes. +R_a = 56 * 'A' # 56 base64 characters + +# Identity and reveal value of dirauth b +ID_b = 20 * "42" # RSA identity of 40 base16 bytes. +R_b = 56 * 'B' # 56 base64 characters + +# Identity and reveal value of dirauth c +ID_c = 20 * "43" # RSA identity of 40 base16 bytes. +R_c = 56 * 'C' # 56 base64 characters + +# Concatenate them all together and hash them to form HASHED_REVEALS. +REVEALS = (ID_a + R_a + ID_b + R_b + ID_c + R_c).encode() +hashed_reveals_object = hashlib.sha3_256(REVEALS) +hashed_reveals = hashed_reveals_object.digest() + +previous_SRV = (32 * 'Z').encode() + +# Now form the message. +#srv_msg = struct.pack('13sQL256ss', "shared-random", reveal_num, version, +# hashed_reveals, previous_SRV) +invariant_token = b"shared-random" +srv_msg = invariant_token + \ + struct.pack('!QL', reveal_num, version) + \ + hashed_reveals + \ + previous_SRV + +# Now calculate the HMAC +srv = hashlib.sha3_256(srv_msg) +print("%s" % srv.hexdigest().upper()) + +# 2A9B1D6237DAB312A40F575DA85C147663E7ED3F80E9555395F15B515C74253D diff --git a/src/wraith/src/test/test-child.c b/src/wraith/src/test/test-child.c new file mode 100644 index 000000000..f78a82910 --- /dev/null +++ b/src/wraith/src/test/test-child.c @@ -0,0 +1,61 @@ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include +#ifdef _WIN32 +#define WINDOWS_LEAN_AND_MEAN +#include +#else +#include +#endif /* defined(_WIN32) */ +#include + +#ifdef _WIN32 +#define SLEEP(sec) Sleep((sec)*1000) +#else +#define SLEEP(sec) sleep(sec) +#endif + +/** Trivial test program which prints out its command line arguments so we can + * check if tor_spawn_background() works */ +int +main(int argc, char **argv) +{ + int i; + int delay = 1; + int fast = 0; + + if (argc > 1) { + if (!strcmp(argv[1], "--hang")) { + delay = 60; + } else if (!strcmp(argv[1], "--fast")) { + fast = 1; + delay = 0; + } + } + + fprintf(stdout, "OUT\n"); + fprintf(stderr, "ERR\n"); + for (i = 1; i < argc; i++) + fprintf(stdout, "%s\n", argv[i]); + if (!fast) + fprintf(stdout, "SLEEPING\n"); + /* We need to flush stdout so that test_util_spawn_background_partial_read() + succeed. Otherwise ReadFile() will get the entire output in one */ + // XXX: Can we make stdio flush on newline? + fflush(stdout); + if (!fast) + SLEEP(1); + fprintf(stdout, "DONE\n"); + fflush(stdout); + if (fast) + return 0; + + while (--delay) { + SLEEP(1); + } + + return 0; +} + diff --git a/src/wraith/src/test/test-memwipe.c b/src/wraith/src/test/test-memwipe.c new file mode 100644 index 000000000..89d946d50 --- /dev/null +++ b/src/wraith/src/test/test-memwipe.c @@ -0,0 +1,218 @@ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include +#include +#include +#include + +#include "crypto.h" +#include "compat.h" +#include "util.h" + +static unsigned fill_a_buffer_memset(void) __attribute__((noinline)); +static unsigned fill_a_buffer_memwipe(void) __attribute__((noinline)); +static unsigned fill_a_buffer_nothing(void) __attribute__((noinline)); +static unsigned fill_heap_buffer_memset(void) __attribute__((noinline)); +static unsigned fill_heap_buffer_memwipe(void) __attribute__((noinline)); +static unsigned fill_heap_buffer_nothing(void) __attribute__((noinline)); +static unsigned check_a_buffer(void) __attribute__((noinline)); + +extern const char *s; /* Make the linkage global */ +const char *s = NULL; + +#define BUF_LEN 2048 + +#define FILL_BUFFER_IMPL() \ + unsigned int i; \ + unsigned sum = 0; \ + \ + /* Fill up a 1k buffer with a recognizable pattern. */ \ + for (i = 0; i < BUF_LEN; i += strlen(s)) { \ + memcpy(buf+i, s, MIN(strlen(s), BUF_LEN-i)); \ + } \ + \ + /* Use the buffer as input to a computation so the above can't get */ \ + /* optimized away. */ \ + for (i = 0; i < BUF_LEN; ++i) { \ + sum += (unsigned char)buf[i]; \ + } + +#ifdef OpenBSD +/* Disable some of OpenBSD's malloc protections for this test. This helps + * us do bad things, such as access freed buffers, without crashing. */ +const char *malloc_options="sufjj"; +#endif + +static unsigned +fill_a_buffer_memset(void) +{ + char buf[BUF_LEN]; + FILL_BUFFER_IMPL() + memset(buf, 0, sizeof(buf)); + return sum; +} + +static unsigned +fill_a_buffer_memwipe(void) +{ + char buf[BUF_LEN]; + FILL_BUFFER_IMPL() + memwipe(buf, 0, sizeof(buf)); + return sum; +} + +static unsigned +fill_a_buffer_nothing(void) +{ + char buf[BUF_LEN]; + FILL_BUFFER_IMPL() + return sum; +} + +static inline int +vmemeq(volatile char *a, const char *b, size_t n) +{ + while (n--) { + if (*a++ != *b++) + return 0; + } + return 1; +} + +static unsigned +check_a_buffer(void) +{ + unsigned int i; + volatile char buf[BUF_LEN]; + unsigned sum = 0; + + /* See if this buffer has the string in it. + + YES, THIS DOES INVOKE UNDEFINED BEHAVIOR BY READING FROM AN UNINITIALIZED + BUFFER. + + If you know a better way to figure out whether the compiler eliminated + the memset/memwipe calls or not, please let me know. + */ + for (i = 0; i < BUF_LEN - strlen(s); ++i) { + if (vmemeq(buf+i, s, strlen(s))) + ++sum; + } + + return sum; +} + +static char *heap_buf = NULL; + +static unsigned +fill_heap_buffer_memset(void) +{ + char *buf = heap_buf = raw_malloc(BUF_LEN); + FILL_BUFFER_IMPL() + memset(buf, 0, BUF_LEN); + raw_free(buf); + return sum; +} + +static unsigned +fill_heap_buffer_memwipe(void) +{ + char *buf = heap_buf = raw_malloc(BUF_LEN); + FILL_BUFFER_IMPL() + memwipe(buf, 0, BUF_LEN); + raw_free(buf); + return sum; +} + +static unsigned +fill_heap_buffer_nothing(void) +{ + char *buf = heap_buf = raw_malloc(BUF_LEN); + FILL_BUFFER_IMPL() + raw_free(buf); + return sum; +} + +static unsigned +check_heap_buffer(void) +{ + unsigned int i; + unsigned sum = 0; + volatile char *buf = heap_buf; + + /* See if this buffer has the string in it. + + YES, THIS DOES INVOKE UNDEFINED BEHAVIOR BY READING FROM A FREED BUFFER. + + If you know a better way to figure out whether the compiler eliminated + the memset/memwipe calls or not, please let me know. + */ + for (i = 0; i < BUF_LEN - strlen(s); ++i) { + if (vmemeq(buf+i, s, strlen(s))) + ++sum; + } + + return sum; +} + +static struct testcase { + const char *name; + /* this spacing satisfies make check-spaces */ + unsigned + (*fill_fn)(void); + unsigned + (*check_fn)(void); +} testcases[] = { + { "nil", fill_a_buffer_nothing, check_a_buffer }, + { "nil-heap", fill_heap_buffer_nothing, check_heap_buffer }, + { "memset", fill_a_buffer_memset, check_a_buffer }, + { "memset-heap", fill_heap_buffer_memset, check_heap_buffer }, + { "memwipe", fill_a_buffer_memwipe, check_a_buffer }, + { "memwipe-heap", fill_heap_buffer_memwipe, check_heap_buffer }, + { NULL, NULL, NULL } +}; + +int +main(int argc, char **argv) +{ + unsigned x, x2; + int i; + int working = 1; + unsigned found[6]; + (void) argc; (void) argv; + + s = "squamous haberdasher gallimaufry"; + + memset(found, 0, sizeof(found)); + + for (i = 0; testcases[i].name; ++i) { + x = testcases[i].fill_fn(); + found[i] = testcases[i].check_fn(); + + x2 = fill_a_buffer_nothing(); + + if (x != x2) { + working = 0; + } + } + + if (!working || !found[0] || !found[1]) { + printf("It appears that this test case may not give you reliable " + "information. Sorry.\n"); + } + + if (!found[2] && !found[3]) { + printf("It appears that memset is good enough on this platform. Good.\n"); + } + + if (found[4] || found[5]) { + printf("ERROR: memwipe does not wipe data!\n"); + return 1; + } else { + printf("OKAY: memwipe seems to work.\n"); + return 0; + } +} + diff --git a/src/wraith/src/test/test-network.sh b/src/wraith/src/test/test-network.sh new file mode 100644 index 000000000..6e0f28657 --- /dev/null +++ b/src/wraith/src/test/test-network.sh @@ -0,0 +1,108 @@ +#!/bin/sh + +# This script calls the equivalent script in chutney/tools + +# If we already know CHUTNEY_PATH, don't bother with argument parsing +TEST_NETWORK="$CHUTNEY_PATH/tools/test-network.sh" +# Call the chutney version of this script, if it exists, and we can find it +if [ -d "$CHUTNEY_PATH" -a -x "$TEST_NETWORK" ]; then + # we can't produce any output, because we might be --quiet + # this preserves arguments with spaces correctly + exec "$TEST_NETWORK" "$@" +fi + +# We need to go looking for CHUTNEY_PATH + +# Do we output anything at all? +ECHO="${ECHO:-echo}" +# Output is prefixed with the name of the script +myname=$(basename $0) + +# Save the arguments before we destroy them +# This might not preserve arguments with spaces in them +ORIGINAL_ARGS="$@" + +# We need to find CHUTNEY_PATH, so that we can call the version of this script +# in chutney/tools with the same arguments. We also need to respect --quiet. +until [ -z "$1" ] +do + case "$1" in + --chutney-path) + CHUTNEY_PATH="$2" + shift + ;; + --tor-path) + TOR_DIR="$2" + shift + ;; + --quiet) + ECHO=true + ;; + *) + # maybe chutney's test-network.sh can handle it + ;; + esac + shift +done + +# optional: $TOR_DIR is the tor build directory +# it's used to find the location of tor binaries +# if it's not set: +# - set it to $BUILDDIR, or +# - if $PWD looks like a tor build directory, set it to $PWD, or +# - unset $TOR_DIR, and let chutney fall back to finding tor binaries in $PATH +if [ ! -d "$TOR_DIR" ]; then + if [ -d "$BUILDDIR/src/or" -a -d "$BUILDDIR/src/tools" ]; then + # Choose the build directory + # But only if it looks like one + $ECHO "$myname: \$TOR_DIR not set, trying \$BUILDDIR" + TOR_DIR="$BUILDDIR" + elif [ -d "$PWD/src/or" -a -d "$PWD/src/tools" ]; then + # Guess the tor directory is the current directory + # But only if it looks like one + $ECHO "$myname: \$TOR_DIR not set, trying \$PWD" + TOR_DIR="$PWD" + else + $ECHO "$myname: no \$TOR_DIR, chutney will use \$PATH for tor binaries" + unset TOR_DIR + fi +fi + +# mandatory: $CHUTNEY_PATH is the path to the chutney launch script +# if it's not set: +# - if $PWD looks like a chutney directory, set it to $PWD, or +# - set it based on $TOR_DIR, expecting chutney to be next to tor, or +# - fail and tell the user how to clone the chutney repository +if [ ! -d "$CHUTNEY_PATH" -o ! -x "$CHUTNEY_PATH/chutney" ]; then + if [ -x "$PWD/chutney" ]; then + $ECHO "$myname: \$CHUTNEY_PATH not valid, trying \$PWD" + CHUTNEY_PATH="$PWD" + elif [ -d "$TOR_DIR" -a -d "$TOR_DIR/../chutney" -a \ + -x "$TOR_DIR/../chutney/chutney" ]; then + $ECHO "$myname: \$CHUTNEY_PATH not valid, trying \$TOR_DIR/../chutney" + CHUTNEY_PATH="$TOR_DIR/../chutney" + else + $ECHO "$myname: missing 'chutney' in \$CHUTNEY_PATH ($CHUTNEY_PATH)" + $ECHO "$myname: Get chutney: git clone https://git.torproject.org/\ +chutney.git" + $ECHO "$myname: Set \$CHUTNEY_PATH to a non-standard location: export \ +CHUTNEY_PATH=\`pwd\`/chutney" + unset CHUTNEY_PATH + exit 1 + fi +fi + +TEST_NETWORK="$CHUTNEY_PATH/tools/test-network.sh" +# Call the chutney version of this script, if it exists, and we can find it +if [ -d "$CHUTNEY_PATH" -a -x "$TEST_NETWORK" ]; then + $ECHO "$myname: Calling newer chutney script $TEST_NETWORK" + # this may fail if some arguments have spaces in them + # if so, set CHUTNEY_PATH before calling test-network.sh, and spaces + # will be handled correctly + exec "$TEST_NETWORK" $ORIGINAL_ARGS +else + $ECHO "$myname: Could not find tools/test-network.sh in CHUTNEY_PATH." + $ECHO "$myname: Please update your chutney using 'git pull'." + # We have failed to do what the user asked + exit 1 +fi diff --git a/src/wraith/src/test/test-timers.c b/src/wraith/src/test/test-timers.c new file mode 100644 index 000000000..a0b5b535c --- /dev/null +++ b/src/wraith/src/test/test-timers.c @@ -0,0 +1,144 @@ +/* Copyright 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#include +#include +#include + +#include + +#include "compat.h" +#include "compat_libevent.h" +#include "crypto.h" +#include "timers.h" +#include "util.h" + +#define N_TIMERS 1000 +#define MAX_DURATION 30 +#define N_DISABLE 5 + +static struct timeval fire_at[N_TIMERS] = { {0,0} }; +static int is_disabled[N_TIMERS] = {0}; +static int fired[N_TIMERS] = {0}; +static struct timeval difference[N_TIMERS] = { {0,0} }; +static tor_timer_t *timers[N_TIMERS] = {NULL}; + +static int n_active_timers = 0; +static int n_fired = 0; + +static monotime_t started_at; +static int64_t delay_usec[N_TIMERS]; +static int64_t diffs_mono_usec[N_TIMERS]; + +static void +timer_cb(tor_timer_t *t, void *arg, const monotime_t *now_mono) +{ + struct timeval now; + + tor_gettimeofday(&now); + tor_timer_t **t_ptr = arg; + tor_assert(*t_ptr == t); + int idx = (int) (t_ptr - timers); + ++fired[idx]; + timersub(&now, &fire_at[idx], &difference[idx]); + diffs_mono_usec[idx] = + monotime_diff_usec(&started_at, now_mono) - + delay_usec[idx]; + ++n_fired; + + // printf("%d / %d\n",n_fired, N_TIMERS); + if (n_fired == n_active_timers) { + event_base_loopbreak(tor_libevent_get_base()); + } +} + +int +main(int argc, char **argv) +{ + (void)argc; + (void)argv; + tor_libevent_cfg cfg; + memset(&cfg, 0, sizeof(cfg)); + tor_libevent_initialize(&cfg); + timers_initialize(); + + int i; + int ret; + struct timeval now; + tor_gettimeofday(&now); + monotime_get(&started_at); + for (i = 0; i < N_TIMERS; ++i) { + struct timeval delay; + delay.tv_sec = crypto_rand_int_range(0,MAX_DURATION); + delay.tv_usec = crypto_rand_int_range(0,1000000); + delay_usec[i] = delay.tv_sec * 1000000 + delay.tv_usec; + timeradd(&now, &delay, &fire_at[i]); + timers[i] = timer_new(timer_cb, &timers[i]); + timer_schedule(timers[i], &delay); + ++n_active_timers; + } + + /* Disable some; we'll make sure they don't trigger. */ + for (i = 0; i < N_DISABLE; ++i) { + int idx = crypto_rand_int_range(0, N_TIMERS); + if (is_disabled[idx]) + continue; + is_disabled[idx] = 1; + timer_disable(timers[idx]); + --n_active_timers; + } + + event_base_loop(tor_libevent_get_base(), 0); + + int64_t total_difference = 0; + uint64_t total_square_difference = 0; + tor_assert(n_fired == n_active_timers); + for (i = 0; i < N_TIMERS; ++i) { + if (is_disabled[i]) { + tor_assert(fired[i] == 0); + continue; + } + tor_assert(fired[i] == 1); + //int64_t diff = difference[i].tv_usec + difference[i].tv_sec * 1000000; + int64_t diff = diffs_mono_usec[i]; + total_difference += diff; + total_square_difference += diff*diff; + } + const int64_t mean_diff = total_difference / n_active_timers; + printf("mean difference: "I64_FORMAT" usec\n", + I64_PRINTF_ARG(mean_diff)); + + const double mean_sq = ((double)total_square_difference)/ n_active_timers; + const double sq_mean = mean_diff * mean_diff; + const double stddev = sqrt(mean_sq - sq_mean); + printf("standard deviation: %lf usec\n", stddev); + +#define MAX_DIFF_USEC (500*1000) +#define MAX_STDDEV_USEC (500*1000) +#define ODD_DIFF_USEC (2000) +#define ODD_STDDEV_USEC (2000) + + if (mean_diff < 0 || mean_diff > MAX_DIFF_USEC || stddev > MAX_STDDEV_USEC) { + printf("Either your system is under ridiculous load, or the " + "timer backend is broken.\n"); + ret = 1; + } else if (mean_diff > ODD_DIFF_USEC || stddev > ODD_STDDEV_USEC) { + printf("Either your system is a bit slow or the " + "timer backend is odd.\n"); + ret = 0; + } else { + printf("Looks good enough.\n"); + ret = 0; + } + + timer_free_(NULL); + + for (i = 0; i < N_TIMERS; ++i) { + timer_free(timers[i]); + } + timers_shutdown(); + return ret; +} + diff --git a/src/wraith/src/test/test.c b/src/wraith/src/test/test.c new file mode 100644 index 000000000..f225fd277 --- /dev/null +++ b/src/wraith/src/test/test.c @@ -0,0 +1,1248 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test.c + * \brief Unit tests for many pieces of the lower level Tor modules. + **/ + +#include "orconfig.h" + +#include +#ifdef HAVE_FCNTL_H +#include +#endif + +#ifdef _WIN32 +/* For mkdir() */ +#include +#else +#include +#endif /* defined(_WIN32) */ + +/* These macros pull in declarations for some functions and structures that + * are typically file-private. */ +#define GEOIP_PRIVATE +#define ROUTER_PRIVATE +#define CIRCUITSTATS_PRIVATE +#define CIRCUITLIST_PRIVATE +#define MAIN_PRIVATE +#define STATEFILE_PRIVATE + +/* + * Linux doesn't provide lround in math.h by default, but mac os does... + * It's best just to leave math.h out of the picture entirely. + */ +//#include +long int lround(double x); +double fabs(double x); + +#include "or.h" +#include "backtrace.h" +#include "buffers.h" +#include "circuitlist.h" +#include "circuitstats.h" +#include "compress.h" +#include "config.h" +#include "connection_edge.h" +#include "geoip.h" +#include "rendcommon.h" +#include "rendcache.h" +#include "test.h" +#include "main.h" +#include "memarea.h" +#include "onion.h" +#include "onion_ntor.h" +#include "onion_fast.h" +#include "onion_tap.h" +#include "policies.h" +#include "rephist.h" +#include "routerparse.h" +#include "statefile.h" +#include "crypto_curve25519.h" +#include "onion_ntor.h" + +/** Run unit tests for the onion handshake code. */ +static void +test_onion_handshake(void *arg) +{ + /* client-side */ + crypto_dh_t *c_dh = NULL; + char c_buf[TAP_ONIONSKIN_CHALLENGE_LEN]; + char c_keys[40]; + /* server-side */ + char s_buf[TAP_ONIONSKIN_REPLY_LEN]; + char s_keys[40]; + int i; + /* shared */ + crypto_pk_t *pk = NULL, *pk2 = NULL; + + (void)arg; + pk = pk_generate(0); + pk2 = pk_generate(1); + + /* client handshake 1. */ + memset(c_buf, 0, TAP_ONIONSKIN_CHALLENGE_LEN); + tt_assert(! onion_skin_TAP_create(pk, &c_dh, c_buf)); + + for (i = 1; i <= 3; ++i) { + crypto_pk_t *k1, *k2; + if (i==1) { + /* server handshake: only one key known. */ + k1 = pk; k2 = NULL; + } else if (i==2) { + /* server handshake: try the right key first. */ + k1 = pk; k2 = pk2; + } else { + /* server handshake: try the right key second. */ + k1 = pk2; k2 = pk; + } + + memset(s_buf, 0, TAP_ONIONSKIN_REPLY_LEN); + memset(s_keys, 0, 40); + tt_assert(! onion_skin_TAP_server_handshake(c_buf, k1, k2, + s_buf, s_keys, 40)); + + /* client handshake 2 */ + memset(c_keys, 0, 40); + tt_assert(! onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, + 40, NULL)); + + tt_mem_op(c_keys,OP_EQ, s_keys, 40); + memset(s_buf, 0, 40); + tt_mem_op(c_keys,OP_NE, s_buf, 40); + } + done: + crypto_dh_free(c_dh); + crypto_pk_free(pk); + crypto_pk_free(pk2); +} + +static void +test_bad_onion_handshake(void *arg) +{ + char junk_buf[TAP_ONIONSKIN_CHALLENGE_LEN]; + char junk_buf2[TAP_ONIONSKIN_CHALLENGE_LEN]; + /* client-side */ + crypto_dh_t *c_dh = NULL; + char c_buf[TAP_ONIONSKIN_CHALLENGE_LEN]; + char c_keys[40]; + /* server-side */ + char s_buf[TAP_ONIONSKIN_REPLY_LEN]; + char s_keys[40]; + /* shared */ + crypto_pk_t *pk = NULL, *pk2 = NULL; + + (void)arg; + + pk = pk_generate(0); + pk2 = pk_generate(1); + + /* Server: Case 1: the encrypted data is degenerate. */ + memset(junk_buf, 0, sizeof(junk_buf)); + crypto_pk_obsolete_public_hybrid_encrypt(pk, + junk_buf2, TAP_ONIONSKIN_CHALLENGE_LEN, + junk_buf, DH_KEY_LEN, PK_PKCS1_OAEP_PADDING, 1); + tt_int_op(-1, OP_EQ, + onion_skin_TAP_server_handshake(junk_buf2, pk, NULL, + s_buf, s_keys, 40)); + + /* Server: Case 2: the encrypted data is not long enough. */ + memset(junk_buf, 0, sizeof(junk_buf)); + memset(junk_buf2, 0, sizeof(junk_buf2)); + crypto_pk_public_encrypt(pk, junk_buf2, sizeof(junk_buf2), + junk_buf, 48, PK_PKCS1_OAEP_PADDING); + tt_int_op(-1, OP_EQ, + onion_skin_TAP_server_handshake(junk_buf2, pk, NULL, + s_buf, s_keys, 40)); + + /* client handshake 1: do it straight. */ + memset(c_buf, 0, TAP_ONIONSKIN_CHALLENGE_LEN); + tt_assert(! onion_skin_TAP_create(pk, &c_dh, c_buf)); + + /* Server: Case 3: we just don't have the right key. */ + tt_int_op(-1, OP_EQ, + onion_skin_TAP_server_handshake(c_buf, pk2, NULL, + s_buf, s_keys, 40)); + + /* Server: Case 4: The RSA-encrypted portion is corrupt. */ + c_buf[64] ^= 33; + tt_int_op(-1, OP_EQ, + onion_skin_TAP_server_handshake(c_buf, pk, NULL, + s_buf, s_keys, 40)); + c_buf[64] ^= 33; + + /* (Let the server procede) */ + tt_int_op(0, OP_EQ, + onion_skin_TAP_server_handshake(c_buf, pk, NULL, + s_buf, s_keys, 40)); + + /* Client: Case 1: The server sent back junk. */ + const char *msg = NULL; + s_buf[64] ^= 33; + tt_int_op(-1, OP_EQ, + onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40, &msg)); + s_buf[64] ^= 33; + tt_str_op(msg, OP_EQ, "Digest DOES NOT MATCH on onion handshake. " + "Bug or attack."); + + /* Let the client finish; make sure it can. */ + msg = NULL; + tt_int_op(0, OP_EQ, + onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40, &msg)); + tt_mem_op(s_keys,OP_EQ, c_keys, 40); + tt_ptr_op(msg, OP_EQ, NULL); + + /* Client: Case 2: The server sent back a degenerate DH. */ + memset(s_buf, 0, sizeof(s_buf)); + tt_int_op(-1, OP_EQ, + onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40, &msg)); + tt_str_op(msg, OP_EQ, "DH computation failed."); + + done: + crypto_dh_free(c_dh); + crypto_pk_free(pk); + crypto_pk_free(pk2); +} + +static void +test_ntor_handshake(void *arg) +{ + /* client-side */ + ntor_handshake_state_t *c_state = NULL; + uint8_t c_buf[NTOR_ONIONSKIN_LEN]; + uint8_t c_keys[400]; + + /* server-side */ + di_digest256_map_t *s_keymap=NULL; + curve25519_keypair_t s_keypair; + uint8_t s_buf[NTOR_REPLY_LEN]; + uint8_t s_keys[400]; + + /* shared */ + const curve25519_public_key_t *server_pubkey; + uint8_t node_id[20] = "abcdefghijklmnopqrst"; + + (void) arg; + + /* Make the server some keys */ + curve25519_secret_key_generate(&s_keypair.seckey, 0); + curve25519_public_key_generate(&s_keypair.pubkey, &s_keypair.seckey); + dimap_add_entry(&s_keymap, s_keypair.pubkey.public_key, &s_keypair); + server_pubkey = &s_keypair.pubkey; + + /* client handshake 1. */ + memset(c_buf, 0, NTOR_ONIONSKIN_LEN); + tt_int_op(0, OP_EQ, onion_skin_ntor_create(node_id, server_pubkey, + &c_state, c_buf)); + + /* server handshake */ + memset(s_buf, 0, NTOR_REPLY_LEN); + memset(s_keys, 0, 40); + tt_int_op(0, OP_EQ, onion_skin_ntor_server_handshake(c_buf, s_keymap, NULL, + node_id, + s_buf, s_keys, 400)); + + /* client handshake 2 */ + memset(c_keys, 0, 40); + tt_int_op(0, OP_EQ, onion_skin_ntor_client_handshake(c_state, s_buf, + c_keys, 400, NULL)); + + tt_mem_op(c_keys,OP_EQ, s_keys, 400); + memset(s_buf, 0, 40); + tt_mem_op(c_keys,OP_NE, s_buf, 40); + + /* Now try with a bogus server response. Zero input should trigger + * All The Problems. */ + memset(c_keys, 0, 400); + memset(s_buf, 0, NTOR_REPLY_LEN); + const char *msg = NULL; + tt_int_op(-1, OP_EQ, onion_skin_ntor_client_handshake(c_state, s_buf, + c_keys, 400, &msg)); + tt_str_op(msg, OP_EQ, "Zero output from curve25519 handshake"); + + done: + ntor_handshake_state_free(c_state); + dimap_free(s_keymap, NULL); +} + +static void +test_fast_handshake(void *arg) +{ + /* tests for the obsolete "CREATE_FAST" handshake. */ + (void) arg; + fast_handshake_state_t *state = NULL; + uint8_t client_handshake[CREATE_FAST_LEN]; + uint8_t server_handshake[CREATED_FAST_LEN]; + uint8_t s_keys[100], c_keys[100]; + + /* First, test an entire handshake. */ + memset(client_handshake, 0, sizeof(client_handshake)); + tt_int_op(0, OP_EQ, fast_onionskin_create(&state, client_handshake)); + tt_assert(! tor_mem_is_zero((char*)client_handshake, + sizeof(client_handshake))); + + tt_int_op(0, OP_EQ, + fast_server_handshake(client_handshake, server_handshake, + s_keys, 100)); + const char *msg = NULL; + tt_int_op(0, OP_EQ, + fast_client_handshake(state, server_handshake, c_keys, 100, &msg)); + tt_ptr_op(msg, OP_EQ, NULL); + tt_mem_op(s_keys, OP_EQ, c_keys, 100); + + /* Now test a failing handshake. */ + server_handshake[0] ^= 3; + tt_int_op(-1, OP_EQ, + fast_client_handshake(state, server_handshake, c_keys, 100, &msg)); + tt_str_op(msg, OP_EQ, "Digest DOES NOT MATCH on fast handshake. " + "Bug or attack."); + + done: + fast_handshake_state_free(state); +} + +/** Run unit tests for the onion queues. */ +static void +test_onion_queues(void *arg) +{ + uint8_t buf1[TAP_ONIONSKIN_CHALLENGE_LEN] = {0}; + uint8_t buf2[NTOR_ONIONSKIN_LEN] = {0}; + + or_circuit_t *circ1 = or_circuit_new(0, NULL); + or_circuit_t *circ2 = or_circuit_new(0, NULL); + + create_cell_t *onionskin = NULL, *create2_ptr; + create_cell_t *create1 = tor_malloc_zero(sizeof(create_cell_t)); + create_cell_t *create2 = tor_malloc_zero(sizeof(create_cell_t)); + (void)arg; + create2_ptr = create2; /* remember, but do not free */ + + create_cell_init(create1, CELL_CREATE, ONION_HANDSHAKE_TYPE_TAP, + TAP_ONIONSKIN_CHALLENGE_LEN, buf1); + create_cell_init(create2, CELL_CREATE, ONION_HANDSHAKE_TYPE_NTOR, + NTOR_ONIONSKIN_LEN, buf2); + + tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); + tt_int_op(0,OP_EQ, onion_pending_add(circ1, create1)); + create1 = NULL; + tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); + + tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); + tt_int_op(0,OP_EQ, onion_pending_add(circ2, create2)); + create2 = NULL; + tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); + + tt_ptr_op(circ2,OP_EQ, onion_next_task(&onionskin)); + tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); + tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); + tt_ptr_op(onionskin, OP_EQ, create2_ptr); + + clear_pending_onions(); + tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); + tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); + + done: + circuit_free_(TO_CIRCUIT(circ1)); + circuit_free_(TO_CIRCUIT(circ2)); + tor_free(create1); + tor_free(create2); + tor_free(onionskin); +} + +static void +test_circuit_timeout(void *arg) +{ + /* Plan: + * 1. Generate 1000 samples + * 2. Estimate parameters + * 3. If difference, repeat + * 4. Save state + * 5. load state + * 6. Estimate parameters + * 7. compare differences + */ + circuit_build_times_t initial; + circuit_build_times_t estimate; + circuit_build_times_t final; + double timeout1, timeout2; + or_state_t *state=NULL; + int i, runs; + double close_ms; + (void)arg; + + initialize_periodic_events(); + + circuit_build_times_init(&initial); + circuit_build_times_init(&estimate); + circuit_build_times_init(&final); + + state = or_state_new(); + + circuitbuild_running_unit_tests(); +#define timeout0 (build_time_t)(30*1000.0) + initial.Xm = 3000; + circuit_build_times_initial_alpha(&initial, + CBT_DEFAULT_QUANTILE_CUTOFF/100.0, + timeout0); + close_ms = MAX(circuit_build_times_calculate_timeout(&initial, + CBT_DEFAULT_CLOSE_QUANTILE/100.0), + CBT_DEFAULT_TIMEOUT_INITIAL_VALUE); + do { + for (i=0; i < CBT_DEFAULT_MIN_CIRCUITS_TO_OBSERVE; i++) { + build_time_t sample = circuit_build_times_generate_sample(&initial,0,1); + + if (sample > close_ms) { + circuit_build_times_add_time(&estimate, CBT_BUILD_ABANDONED); + } else { + circuit_build_times_add_time(&estimate, sample); + } + } + circuit_build_times_update_alpha(&estimate); + timeout1 = circuit_build_times_calculate_timeout(&estimate, + CBT_DEFAULT_QUANTILE_CUTOFF/100.0); + circuit_build_times_set_timeout(&estimate); + log_notice(LD_CIRC, "Timeout1 is %f, Xm is %d", timeout1, estimate.Xm); + /* 2% error */ + } while (fabs(circuit_build_times_cdf(&initial, timeout0) - + circuit_build_times_cdf(&initial, timeout1)) > 0.02); + + tt_int_op(estimate.total_build_times, OP_LE, CBT_NCIRCUITS_TO_OBSERVE); + + circuit_build_times_update_state(&estimate, state); + circuit_build_times_free_timeouts(&final); + tt_int_op(circuit_build_times_parse_state(&final, state), OP_EQ, 0); + + circuit_build_times_update_alpha(&final); + timeout2 = circuit_build_times_calculate_timeout(&final, + CBT_DEFAULT_QUANTILE_CUTOFF/100.0); + + circuit_build_times_set_timeout(&final); + log_notice(LD_CIRC, "Timeout2 is %f, Xm is %d", timeout2, final.Xm); + + /* 5% here because some accuracy is lost due to histogram conversion */ + tt_assert(fabs(circuit_build_times_cdf(&initial, timeout0) - + circuit_build_times_cdf(&initial, timeout2)) < 0.05); + + for (runs = 0; runs < 50; runs++) { + int build_times_idx = 0; + int total_build_times = 0; + + final.close_ms = final.timeout_ms = CBT_DEFAULT_TIMEOUT_INITIAL_VALUE; + estimate.close_ms = estimate.timeout_ms + = CBT_DEFAULT_TIMEOUT_INITIAL_VALUE; + + for (i = 0; i < CBT_DEFAULT_RECENT_CIRCUITS*2; i++) { + circuit_build_times_network_circ_success(&estimate); + circuit_build_times_add_time(&estimate, + circuit_build_times_generate_sample(&estimate, 0, + CBT_DEFAULT_QUANTILE_CUTOFF/100.0)); + + circuit_build_times_network_circ_success(&estimate); + circuit_build_times_add_time(&final, + circuit_build_times_generate_sample(&final, 0, + CBT_DEFAULT_QUANTILE_CUTOFF/100.0)); + } + + tt_assert(!circuit_build_times_network_check_changed(&estimate)); + tt_assert(!circuit_build_times_network_check_changed(&final)); + + /* Reset liveness to be non-live */ + final.liveness.network_last_live = 0; + estimate.liveness.network_last_live = 0; + + build_times_idx = estimate.build_times_idx; + total_build_times = estimate.total_build_times; + + tt_assert(circuit_build_times_network_check_live(&estimate)); + tt_assert(circuit_build_times_network_check_live(&final)); + + circuit_build_times_count_close(&estimate, 0, + (time_t)(approx_time()-estimate.close_ms/1000.0-1)); + circuit_build_times_count_close(&final, 0, + (time_t)(approx_time()-final.close_ms/1000.0-1)); + + tt_assert(!circuit_build_times_network_check_live(&estimate)); + tt_assert(!circuit_build_times_network_check_live(&final)); + + log_info(LD_CIRC, "idx: %d %d, tot: %d %d", + build_times_idx, estimate.build_times_idx, + total_build_times, estimate.total_build_times); + + /* Check rollback index. Should match top of loop. */ + tt_assert(build_times_idx == estimate.build_times_idx); + // This can fail if estimate.total_build_times == 1000, because + // in that case, rewind actually causes us to lose timeouts + if (total_build_times != CBT_NCIRCUITS_TO_OBSERVE) + tt_assert(total_build_times == estimate.total_build_times); + + /* Now simulate that the network has become live and we need + * a change */ + circuit_build_times_network_is_live(&estimate); + circuit_build_times_network_is_live(&final); + + for (i = 0; i < CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT; i++) { + circuit_build_times_count_timeout(&estimate, 1); + + if (i < CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT-1) { + circuit_build_times_count_timeout(&final, 1); + } + } + + tt_int_op(estimate.liveness.after_firsthop_idx, OP_EQ, 0); + tt_assert(final.liveness.after_firsthop_idx == + CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT-1); + + tt_assert(circuit_build_times_network_check_live(&estimate)); + tt_assert(circuit_build_times_network_check_live(&final)); + + circuit_build_times_count_timeout(&final, 1); + + /* Ensure return value for degenerate cases are clamped correctly */ + initial.alpha = INT32_MAX; + tt_assert(circuit_build_times_calculate_timeout(&initial, .99999999) <= + INT32_MAX); + initial.alpha = 0; + tt_assert(circuit_build_times_calculate_timeout(&initial, .5) <= + INT32_MAX); + } + + done: + circuit_build_times_free_timeouts(&initial); + circuit_build_times_free_timeouts(&estimate); + circuit_build_times_free_timeouts(&final); + or_state_free(state); + teardown_periodic_events(); +} + +/** Test encoding and parsing of rendezvous service descriptors. */ +static void +test_rend_fns(void *arg) +{ + rend_service_descriptor_t *generated = NULL, *parsed = NULL; + char service_id[DIGEST_LEN]; + char service_id_base32[REND_SERVICE_ID_LEN_BASE32+1]; + const char *next_desc; + smartlist_t *descs = smartlist_new(); + char computed_desc_id[DIGEST_LEN]; + char parsed_desc_id[DIGEST_LEN]; + crypto_pk_t *pk1 = NULL, *pk2 = NULL; + time_t now; + char *intro_points_encrypted = NULL; + size_t intro_points_size; + size_t encoded_size; + int i; + + (void)arg; + + /* Initialize the service cache. */ + rend_cache_init(); + + pk1 = pk_generate(0); + pk2 = pk_generate(1); + generated = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + generated->pk = crypto_pk_dup_key(pk1); + crypto_pk_get_digest(generated->pk, service_id); + base32_encode(service_id_base32, REND_SERVICE_ID_LEN_BASE32+1, + service_id, REND_SERVICE_ID_LEN); + now = time(NULL); + generated->timestamp = now; + generated->version = 2; + generated->protocols = 42; + generated->intro_nodes = smartlist_new(); + + for (i = 0; i < 3; i++) { + rend_intro_point_t *intro = tor_malloc_zero(sizeof(rend_intro_point_t)); + crypto_pk_t *okey = pk_generate(2 + i); + intro->extend_info = tor_malloc_zero(sizeof(extend_info_t)); + intro->extend_info->onion_key = okey; + crypto_pk_get_digest(intro->extend_info->onion_key, + intro->extend_info->identity_digest); + //crypto_rand(info->identity_digest, DIGEST_LEN); /* Would this work? */ + intro->extend_info->nickname[0] = '$'; + base16_encode(intro->extend_info->nickname + 1, + sizeof(intro->extend_info->nickname) - 1, + intro->extend_info->identity_digest, DIGEST_LEN); + /* Does not cover all IP addresses. */ + tor_addr_from_ipv4h(&intro->extend_info->addr, crypto_rand_int(65536)); + intro->extend_info->port = 1 + crypto_rand_int(65535); + intro->intro_key = crypto_pk_dup_key(pk2); + smartlist_add(generated->intro_nodes, intro); + } + int rv = rend_encode_v2_descriptors(descs, generated, now, 0, + REND_NO_AUTH, NULL, NULL); + tt_int_op(rv, OP_GT, 0); + rv = rend_compute_v2_desc_id(computed_desc_id, service_id_base32, NULL, + now, 0); + tt_int_op(rv, OP_EQ, 0); + tt_mem_op(((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0))->desc_id, OP_EQ, + computed_desc_id, DIGEST_LEN); + rv = rend_parse_v2_service_descriptor(&parsed, parsed_desc_id, + &intro_points_encrypted, &intro_points_size, &encoded_size, + &next_desc, + ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0)) + ->desc_str, 1); + tt_int_op(rv, OP_EQ, 0); + tt_assert(parsed); + tt_mem_op(((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0))->desc_id,OP_EQ, parsed_desc_id, DIGEST_LEN); + tt_int_op(rend_parse_introduction_points(parsed, intro_points_encrypted, + intro_points_size),OP_EQ, 3); + tt_assert(!crypto_pk_cmp_keys(generated->pk, parsed->pk)); + tt_int_op(parsed->timestamp,OP_EQ, now); + tt_int_op(parsed->version,OP_EQ, 2); + tt_int_op(parsed->protocols,OP_EQ, 42); + tt_int_op(smartlist_len(parsed->intro_nodes),OP_EQ, 3); + for (i = 0; i < smartlist_len(parsed->intro_nodes); i++) { + rend_intro_point_t *par_intro = smartlist_get(parsed->intro_nodes, i), + *gen_intro = smartlist_get(generated->intro_nodes, i); + extend_info_t *par_info = par_intro->extend_info; + extend_info_t *gen_info = gen_intro->extend_info; + tt_assert(!crypto_pk_cmp_keys(gen_info->onion_key, par_info->onion_key)); + tt_mem_op(gen_info->identity_digest,OP_EQ, par_info->identity_digest, + DIGEST_LEN); + tt_str_op(gen_info->nickname,OP_EQ, par_info->nickname); + tt_assert(tor_addr_eq(&gen_info->addr, &par_info->addr)); + tt_int_op(gen_info->port,OP_EQ, par_info->port); + } + + rend_service_descriptor_free(parsed); + rend_service_descriptor_free(generated); + parsed = generated = NULL; + + done: + if (descs) { + for (i = 0; i < smartlist_len(descs); i++) + rend_encoded_v2_service_descriptor_free_(smartlist_get(descs, i)); + smartlist_free(descs); + } + if (parsed) + rend_service_descriptor_free(parsed); + if (generated) + rend_service_descriptor_free(generated); + if (pk1) + crypto_pk_free(pk1); + if (pk2) + crypto_pk_free(pk2); + tor_free(intro_points_encrypted); +} + + /* Record odd numbered fake-IPs using ipv6, even numbered fake-IPs + * using ipv4. Since our fake geoip database is the same between + * ipv4 and ipv6, we should get the same result no matter which + * address family we pick for each IP. */ +#define SET_TEST_ADDRESS(i) do { \ + if ((i) & 1) { \ + SET_TEST_IPV6(i); \ + tor_addr_from_in6(&addr, &in6); \ + } else { \ + tor_addr_from_ipv4h(&addr, (uint32_t) i); \ + } \ + } while (0) + + /* Make sure that country ID actually works. */ +#define SET_TEST_IPV6(i) \ + do { \ + set_uint32(in6.s6_addr + 12, htonl((uint32_t) (i))); \ + } while (0) +#define CHECK_COUNTRY(country, val) do { \ + /* test ipv4 country lookup */ \ + tt_str_op(country, OP_EQ, \ + geoip_get_country_name(geoip_get_country_by_ipv4(val))); \ + /* test ipv6 country lookup */ \ + SET_TEST_IPV6(val); \ + tt_str_op(country, OP_EQ, \ + geoip_get_country_name(geoip_get_country_by_ipv6(&in6))); \ + } while (0) + +/** Run unit tests for GeoIP code. */ +static void +test_geoip(void *arg) +{ + int i, j; + time_t now = 1281533250; /* 2010-08-11 13:27:30 UTC */ + char *s = NULL, *v = NULL; + const char *bridge_stats_1 = + "bridge-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "bridge-ips zz=24,xy=8\n" + "bridge-ip-versions v4=16,v6=16\n" + "bridge-ip-transports =24\n", + *dirreq_stats_1 = + "dirreq-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "dirreq-v3-ips ab=8\n" + "dirreq-v3-reqs ab=8\n" + "dirreq-v3-resp ok=0,not-enough-sigs=0,unavailable=0,not-found=0," + "not-modified=0,busy=0\n" + "dirreq-v3-direct-dl complete=0,timeout=0,running=0\n" + "dirreq-v3-tunneled-dl complete=0,timeout=0,running=0\n", + *dirreq_stats_2 = + "dirreq-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "dirreq-v3-ips \n" + "dirreq-v3-reqs \n" + "dirreq-v3-resp ok=0,not-enough-sigs=0,unavailable=0,not-found=0," + "not-modified=0,busy=0\n" + "dirreq-v3-direct-dl complete=0,timeout=0,running=0\n" + "dirreq-v3-tunneled-dl complete=0,timeout=0,running=0\n", + *dirreq_stats_3 = + "dirreq-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "dirreq-v3-ips \n" + "dirreq-v3-reqs \n" + "dirreq-v3-resp ok=8,not-enough-sigs=0,unavailable=0,not-found=0," + "not-modified=0,busy=0\n" + "dirreq-v3-direct-dl complete=0,timeout=0,running=0\n" + "dirreq-v3-tunneled-dl complete=0,timeout=0,running=0\n", + *dirreq_stats_4 = + "dirreq-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "dirreq-v3-ips \n" + "dirreq-v3-reqs \n" + "dirreq-v3-resp ok=8,not-enough-sigs=0,unavailable=0,not-found=0," + "not-modified=0,busy=0\n" + "dirreq-v3-direct-dl complete=0,timeout=0,running=0\n" + "dirreq-v3-tunneled-dl complete=0,timeout=0,running=4\n", + *entry_stats_1 = + "entry-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "entry-ips ab=8\n", + *entry_stats_2 = + "entry-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "entry-ips \n"; + tor_addr_t addr; + struct in6_addr in6; + + /* Populate the DB a bit. Add these in order, since we can't do the final + * 'sort' step. These aren't very good IP addresses, but they're perfectly + * fine uint32_t values. */ + (void)arg; + tt_int_op(0,OP_EQ, geoip_parse_entry("10,50,AB", AF_INET)); + tt_int_op(0,OP_EQ, geoip_parse_entry("52,90,XY", AF_INET)); + tt_int_op(0,OP_EQ, geoip_parse_entry("95,100,AB", AF_INET)); + tt_int_op(0,OP_EQ, geoip_parse_entry("\"105\",\"140\",\"ZZ\"", AF_INET)); + tt_int_op(0,OP_EQ, geoip_parse_entry("\"150\",\"190\",\"XY\"", AF_INET)); + tt_int_op(0,OP_EQ, geoip_parse_entry("\"200\",\"250\",\"AB\"", AF_INET)); + + /* Populate the IPv6 DB equivalently with fake IPs in the same range */ + tt_int_op(0,OP_EQ, geoip_parse_entry("::a,::32,AB", AF_INET6)); + tt_int_op(0,OP_EQ, geoip_parse_entry("::34,::5a,XY", AF_INET6)); + tt_int_op(0,OP_EQ, geoip_parse_entry("::5f,::64,AB", AF_INET6)); + tt_int_op(0,OP_EQ, geoip_parse_entry("::69,::8c,ZZ", AF_INET6)); + tt_int_op(0,OP_EQ, geoip_parse_entry("::96,::be,XY", AF_INET6)); + tt_int_op(0,OP_EQ, geoip_parse_entry("::c8,::fa,AB", AF_INET6)); + + /* We should have 4 countries: ??, ab, xy, zz. */ + tt_int_op(4,OP_EQ, geoip_get_n_countries()); + memset(&in6, 0, sizeof(in6)); + + CHECK_COUNTRY("??", 3); + CHECK_COUNTRY("ab", 32); + CHECK_COUNTRY("??", 5); + CHECK_COUNTRY("??", 51); + CHECK_COUNTRY("xy", 150); + CHECK_COUNTRY("xy", 190); + CHECK_COUNTRY("??", 2000); + + tt_int_op(0,OP_EQ, geoip_get_country_by_ipv4(3)); + SET_TEST_IPV6(3); + tt_int_op(0,OP_EQ, geoip_get_country_by_ipv6(&in6)); + + get_options_mutable()->BridgeRelay = 1; + get_options_mutable()->BridgeRecordUsageByCountry = 1; + /* Put 9 observations in AB... */ + for (i=32; i < 40; ++i) { + SET_TEST_ADDRESS(i); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200); + } + SET_TEST_ADDRESS(225); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200); + /* and 3 observations in XY, several times. */ + for (j=0; j < 10; ++j) + for (i=52; i < 55; ++i) { + SET_TEST_ADDRESS(i); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-3600); + } + /* and 17 observations in ZZ... */ + for (i=110; i < 127; ++i) { + SET_TEST_ADDRESS(i); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); + } + geoip_get_client_history(GEOIP_CLIENT_CONNECT, &s, &v); + tt_assert(s); + tt_assert(v); + tt_str_op("zz=24,ab=16,xy=8",OP_EQ, s); + tt_str_op("v4=16,v6=16",OP_EQ, v); + tor_free(s); + tor_free(v); + + /* Now clear out all the AB observations. */ + geoip_remove_old_clients(now-6000); + geoip_get_client_history(GEOIP_CLIENT_CONNECT, &s, &v); + tt_assert(s); + tt_assert(v); + tt_str_op("zz=24,xy=8",OP_EQ, s); + tt_str_op("v4=16,v6=16",OP_EQ, v); + tor_free(s); + tor_free(v); + + /* Start testing bridge statistics by making sure that we don't output + * bridge stats without initializing them. */ + s = geoip_format_bridge_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Initialize stats and generate the bridge-stats history string out of + * the connecting clients added above. */ + geoip_bridge_stats_init(now); + s = geoip_format_bridge_stats(now + 86400); + tt_assert(s); + tt_str_op(bridge_stats_1,OP_EQ, s); + tor_free(s); + + /* Stop collecting bridge stats and make sure we don't write a history + * string anymore. */ + geoip_bridge_stats_term(); + s = geoip_format_bridge_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Stop being a bridge and start being a directory mirror that gathers + * directory request statistics. */ + geoip_bridge_stats_term(); + get_options_mutable()->BridgeRelay = 0; + get_options_mutable()->BridgeRecordUsageByCountry = 0; + get_options_mutable()->DirReqStatistics = 1; + + /* Start testing dirreq statistics by making sure that we don't collect + * dirreq stats without initializing them. */ + SET_TEST_ADDRESS(100); + geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now); + s = geoip_format_dirreq_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Initialize stats, note one connecting client, and generate the + * dirreq-stats history string. */ + geoip_dirreq_stats_init(now); + SET_TEST_ADDRESS(100); + geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now); + s = geoip_format_dirreq_stats(now + 86400); + tt_str_op(dirreq_stats_1,OP_EQ, s); + tor_free(s); + + /* Stop collecting stats, add another connecting client, and ensure we + * don't generate a history string. */ + geoip_dirreq_stats_term(); + SET_TEST_ADDRESS(101); + geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now); + s = geoip_format_dirreq_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Re-start stats, add a connecting client, reset stats, and make sure + * that we get an all empty history string. */ + geoip_dirreq_stats_init(now); + SET_TEST_ADDRESS(100); + geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now); + geoip_reset_dirreq_stats(now); + s = geoip_format_dirreq_stats(now + 86400); + tt_str_op(dirreq_stats_2,OP_EQ, s); + tor_free(s); + + /* Note a successful network status response and make sure that it + * appears in the history string. */ + geoip_note_ns_response(GEOIP_SUCCESS); + s = geoip_format_dirreq_stats(now + 86400); + tt_str_op(dirreq_stats_3,OP_EQ, s); + tor_free(s); + + /* Start a tunneled directory request. */ + geoip_start_dirreq((uint64_t) 1, 1024, DIRREQ_TUNNELED); + s = geoip_format_dirreq_stats(now + 86400); + tt_str_op(dirreq_stats_4,OP_EQ, s); + tor_free(s); + + /* Stop collecting directory request statistics and start gathering + * entry stats. */ + geoip_dirreq_stats_term(); + get_options_mutable()->DirReqStatistics = 0; + get_options_mutable()->EntryStatistics = 1; + + /* Start testing entry statistics by making sure that we don't collect + * anything without initializing entry stats. */ + SET_TEST_ADDRESS(100); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); + s = geoip_format_entry_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Initialize stats, note one connecting client, and generate the + * entry-stats history string. */ + geoip_entry_stats_init(now); + SET_TEST_ADDRESS(100); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); + s = geoip_format_entry_stats(now + 86400); + tt_str_op(entry_stats_1,OP_EQ, s); + tor_free(s); + + /* Stop collecting stats, add another connecting client, and ensure we + * don't generate a history string. */ + geoip_entry_stats_term(); + SET_TEST_ADDRESS(101); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); + s = geoip_format_entry_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Re-start stats, add a connecting client, reset stats, and make sure + * that we get an all empty history string. */ + geoip_entry_stats_init(now); + SET_TEST_ADDRESS(100); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); + geoip_reset_entry_stats(now); + s = geoip_format_entry_stats(now + 86400); + tt_str_op(entry_stats_2,OP_EQ, s); + tor_free(s); + + /* Stop collecting entry statistics. */ + geoip_entry_stats_term(); + get_options_mutable()->EntryStatistics = 0; + + done: + tor_free(s); + tor_free(v); +} + +static void +test_geoip_with_pt(void *arg) +{ + time_t now = 1281533250; /* 2010-08-11 13:27:30 UTC */ + char *s = NULL; + int i; + tor_addr_t addr; + struct in6_addr in6; + + (void)arg; + get_options_mutable()->BridgeRelay = 1; + get_options_mutable()->BridgeRecordUsageByCountry = 1; + + memset(&in6, 0, sizeof(in6)); + + /* No clients seen yet. */ + s = geoip_get_transport_history(); + tor_assert(!s); + + /* 4 connections without a pluggable transport */ + for (i=0; i < 4; ++i) { + SET_TEST_ADDRESS(i); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200); + } + + /* 9 connections with "alpha" */ + for (i=4; i < 13; ++i) { + SET_TEST_ADDRESS(i); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "alpha", now-7200); + } + + /* one connection with "beta" */ + SET_TEST_ADDRESS(13); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "beta", now-7200); + + /* 14 connections with "charlie" */ + for (i=14; i < 28; ++i) { + SET_TEST_ADDRESS(i); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "charlie", now-7200); + } + + /* 131 connections with "ddr" */ + for (i=28; i < 159; ++i) { + SET_TEST_ADDRESS(i); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "ddr", now-7200); + } + + /* 8 connections with "entropy" */ + for (i=159; i < 167; ++i) { + SET_TEST_ADDRESS(i); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "entropy", now-7200); + } + + /* 2 connections from the same IP with two different transports. */ + SET_TEST_ADDRESS(++i); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "fire", now-7200); + geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "google", now-7200); + + /* Test the transport history string. */ + s = geoip_get_transport_history(); + tor_assert(s); + tt_str_op(s,OP_EQ, "=8,alpha=16,beta=8,charlie=16,ddr=136," + "entropy=8,fire=8,google=8"); + + /* Stop collecting entry statistics. */ + geoip_entry_stats_term(); + get_options_mutable()->EntryStatistics = 0; + + done: + tor_free(s); +} + +#undef SET_TEST_ADDRESS +#undef SET_TEST_IPV6 +#undef CHECK_COUNTRY + +/** Run unit tests for stats code. */ +static void +test_stats(void *arg) +{ + time_t now = 1281533250; /* 2010-08-11 13:27:30 UTC */ + char *s = NULL; + int i; + + /* Start with testing exit port statistics; we shouldn't collect exit + * stats without initializing them. */ + (void)arg; + rep_hist_note_exit_stream_opened(80); + rep_hist_note_exit_bytes(80, 100, 10000); + s = rep_hist_format_exit_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Initialize stats, note some streams and bytes, and generate history + * string. */ + rep_hist_exit_stats_init(now); + rep_hist_note_exit_stream_opened(80); + rep_hist_note_exit_bytes(80, 100, 10000); + rep_hist_note_exit_stream_opened(443); + rep_hist_note_exit_bytes(443, 100, 10000); + rep_hist_note_exit_bytes(443, 100, 10000); + s = rep_hist_format_exit_stats(now + 86400); + tt_str_op("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "exit-kibibytes-written 80=1,443=1,other=0\n" + "exit-kibibytes-read 80=10,443=20,other=0\n" + "exit-streams-opened 80=4,443=4,other=0\n",OP_EQ, s); + tor_free(s); + + /* Add a few bytes on 10 more ports and ensure that only the top 10 + * ports are contained in the history string. */ + for (i = 50; i < 60; i++) { + rep_hist_note_exit_bytes(i, i, i); + rep_hist_note_exit_stream_opened(i); + } + s = rep_hist_format_exit_stats(now + 86400); + tt_str_op("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "exit-kibibytes-written 52=1,53=1,54=1,55=1,56=1,57=1,58=1," + "59=1,80=1,443=1,other=1\n" + "exit-kibibytes-read 52=1,53=1,54=1,55=1,56=1,57=1,58=1," + "59=1,80=10,443=20,other=1\n" + "exit-streams-opened 52=4,53=4,54=4,55=4,56=4,57=4,58=4," + "59=4,80=4,443=4,other=4\n",OP_EQ, s); + tor_free(s); + + /* Stop collecting stats, add some bytes, and ensure we don't generate + * a history string. */ + rep_hist_exit_stats_term(); + rep_hist_note_exit_bytes(80, 100, 10000); + s = rep_hist_format_exit_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Re-start stats, add some bytes, reset stats, and see what history we + * get when observing no streams or bytes at all. */ + rep_hist_exit_stats_init(now); + rep_hist_note_exit_stream_opened(80); + rep_hist_note_exit_bytes(80, 100, 10000); + rep_hist_reset_exit_stats(now); + s = rep_hist_format_exit_stats(now + 86400); + tt_str_op("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "exit-kibibytes-written other=0\n" + "exit-kibibytes-read other=0\n" + "exit-streams-opened other=0\n",OP_EQ, s); + tor_free(s); + + /* Continue with testing connection statistics; we shouldn't collect + * conn stats without initializing them. */ + rep_hist_note_or_conn_bytes(1, 20, 400, now); + s = rep_hist_format_conn_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Initialize stats, note bytes, and generate history string. */ + rep_hist_conn_stats_init(now); + rep_hist_note_or_conn_bytes(1, 30000, 400000, now); + rep_hist_note_or_conn_bytes(1, 30000, 400000, now + 5); + rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 10); + rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 15); + s = rep_hist_format_conn_stats(now + 86400); + tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,1,0\n",OP_EQ, s); + tor_free(s); + + /* Stop collecting stats, add some bytes, and ensure we don't generate + * a history string. */ + rep_hist_conn_stats_term(); + rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 15); + s = rep_hist_format_conn_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Re-start stats, add some bytes, reset stats, and see what history we + * get when observing no bytes at all. */ + rep_hist_conn_stats_init(now); + rep_hist_note_or_conn_bytes(1, 30000, 400000, now); + rep_hist_note_or_conn_bytes(1, 30000, 400000, now + 5); + rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 10); + rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 15); + rep_hist_reset_conn_stats(now); + s = rep_hist_format_conn_stats(now + 86400); + tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,0,0\n",OP_EQ, s); + tor_free(s); + + /* Continue with testing buffer statistics; we shouldn't collect buffer + * stats without initializing them. */ + rep_hist_add_buffer_stats(2.0, 2.0, 20); + s = rep_hist_format_buffer_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Initialize stats, add statistics for a single circuit, and generate + * the history string. */ + rep_hist_buffer_stats_init(now); + rep_hist_add_buffer_stats(2.0, 2.0, 20); + s = rep_hist_format_buffer_stats(now + 86400); + tt_str_op("cell-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "cell-processed-cells 20,0,0,0,0,0,0,0,0,0\n" + "cell-queued-cells 2.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00," + "0.00,0.00\n" + "cell-time-in-queue 2,0,0,0,0,0,0,0,0,0\n" + "cell-circuits-per-decile 1\n",OP_EQ, s); + tor_free(s); + + /* Add nineteen more circuit statistics to the one that's already in the + * history to see that the math works correctly. */ + for (i = 21; i < 30; i++) + rep_hist_add_buffer_stats(2.0, 2.0, i); + for (i = 20; i < 30; i++) + rep_hist_add_buffer_stats(3.5, 3.5, i); + s = rep_hist_format_buffer_stats(now + 86400); + tt_str_op("cell-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "cell-processed-cells 29,28,27,26,25,24,23,22,21,20\n" + "cell-queued-cells 2.75,2.75,2.75,2.75,2.75,2.75,2.75,2.75," + "2.75,2.75\n" + "cell-time-in-queue 3,3,3,3,3,3,3,3,3,3\n" + "cell-circuits-per-decile 2\n",OP_EQ, s); + tor_free(s); + + /* Stop collecting stats, add statistics for one circuit, and ensure we + * don't generate a history string. */ + rep_hist_buffer_stats_term(); + rep_hist_add_buffer_stats(2.0, 2.0, 20); + s = rep_hist_format_buffer_stats(now + 86400); + tt_ptr_op(s, OP_EQ, NULL); + + /* Re-start stats, add statistics for one circuit, reset stats, and make + * sure that the history has all zeros. */ + rep_hist_buffer_stats_init(now); + rep_hist_add_buffer_stats(2.0, 2.0, 20); + rep_hist_reset_buffer_stats(now); + s = rep_hist_format_buffer_stats(now + 86400); + tt_str_op("cell-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "cell-processed-cells 0,0,0,0,0,0,0,0,0,0\n" + "cell-queued-cells 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00," + "0.00,0.00\n" + "cell-time-in-queue 0,0,0,0,0,0,0,0,0,0\n" + "cell-circuits-per-decile 0\n",OP_EQ, s); + + done: + tor_free(s); +} + +#define ENT(name) \ + { #name, test_ ## name , 0, NULL, NULL } +#define FORK(name) \ + { #name, test_ ## name , TT_FORK, NULL, NULL } + +static struct testcase_t test_array[] = { + ENT(onion_handshake), + { "bad_onion_handshake", test_bad_onion_handshake, 0, NULL, NULL }, + ENT(onion_queues), + { "ntor_handshake", test_ntor_handshake, 0, NULL, NULL }, + { "fast_handshake", test_fast_handshake, 0, NULL, NULL }, + FORK(circuit_timeout), + FORK(rend_fns), + ENT(geoip), + FORK(geoip_with_pt), + FORK(stats), + + END_OF_TESTCASES +}; + +struct testgroup_t testgroups[] = { + { "", test_array }, + { "accounting/", accounting_tests }, + { "addr/", addr_tests }, + { "address/", address_tests }, + { "buffer/", buffer_tests }, + { "cellfmt/", cell_format_tests }, + { "cellqueue/", cell_queue_tests }, + { "channel/", channel_tests }, + { "channelpadding/", channelpadding_tests }, + { "channeltls/", channeltls_tests }, + { "checkdir/", checkdir_tests }, + { "circuitbuild/", circuitbuild_tests }, + { "circuitlist/", circuitlist_tests }, + { "circuitmux/", circuitmux_tests }, + { "circuituse/", circuituse_tests }, + { "circuitstats/", circuitstats_tests }, + { "compat/libevent/", compat_libevent_tests }, + { "config/", config_tests }, + { "connection/", connection_tests }, + { "conscache/", conscache_tests }, + { "consdiff/", consdiff_tests }, + { "consdiffmgr/", consdiffmgr_tests }, + { "container/", container_tests }, + { "control/", controller_tests }, + { "control/event/", controller_event_tests }, + { "crypto/", crypto_tests }, + { "crypto/openssl/", crypto_openssl_tests }, + { "dir/", dir_tests }, + { "dir_handle_get/", dir_handle_get_tests }, + { "dir/md/", microdesc_tests }, + { "entryconn/", entryconn_tests }, + { "entrynodes/", entrynodes_tests }, + { "guardfraction/", guardfraction_tests }, + { "extorport/", extorport_tests }, + { "legacy_hs/", hs_tests }, + { "hs_cache/", hs_cache }, + { "hs_cell/", hs_cell_tests }, + { "hs_common/", hs_common_tests }, + { "hs_config/", hs_config_tests }, + { "hs_control/", hs_control_tests }, + { "hs_descriptor/", hs_descriptor }, + { "hs_ntor/", hs_ntor_tests }, + { "hs_service/", hs_service_tests }, + { "hs_client/", hs_client_tests }, + { "hs_intropoint/", hs_intropoint_tests }, + { "introduce/", introduce_tests }, + { "keypin/", keypin_tests }, + { "link-handshake/", link_handshake_tests }, + { "nodelist/", nodelist_tests }, + { "oom/", oom_tests }, + { "oos/", oos_tests }, + { "options/", options_tests }, + { "policy/" , policy_tests }, + { "procmon/", procmon_tests }, + { "proto/http/", proto_http_tests }, + { "proto/misc/", proto_misc_tests }, + { "protover/", protover_tests }, + { "pt/", pt_tests }, + { "relay/" , relay_tests }, + { "relaycell/", relaycell_tests }, + { "rend_cache/", rend_cache_tests }, + { "replaycache/", replaycache_tests }, + { "router/", router_tests }, + { "routerkeys/", routerkeys_tests }, + { "routerlist/", routerlist_tests }, + { "routerset/" , routerset_tests }, + { "scheduler/", scheduler_tests }, + { "socks/", socks_tests }, + { "shared-random/", sr_tests }, + { "status/" , status_tests }, + { "storagedir/", storagedir_tests }, + { "tortls/", tortls_tests }, + { "util/", util_tests }, + { "util/format/", util_format_tests }, + { "util/logging/", logging_tests }, + { "util/process/", util_process_tests }, + { "util/pubsub/", pubsub_tests }, + { "util/thread/", thread_tests }, + { "util/handle/", handle_tests }, + { "dns/", dns_tests }, + END_OF_GROUPS +}; + diff --git a/src/wraith/src/test/test.h b/src/wraith/src/test/test.h new file mode 100644 index 000000000..93d527ba1 --- /dev/null +++ b/src/wraith/src/test/test.h @@ -0,0 +1,276 @@ +/* Copyright (c) 2001-2003, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_TEST_H +#define TOR_TEST_H + +/** + * \file test.h + * \brief Macros and functions used by unit tests. + */ + +#include "compat.h" +#include "tinytest.h" +#define TT_EXIT_TEST_FUNCTION STMT_BEGIN goto done; STMT_END +#include "tinytest_macros.h" + +#ifdef __GNUC__ +#define PRETTY_FUNCTION __PRETTY_FUNCTION__ +#else +#define PRETTY_FUNCTION "" +#endif + +/* As test_mem_op, but decodes 'hex' before comparing. There must be a + * local char* variable called mem_op_hex_tmp for this to work. */ +#define test_mem_op_hex(expr1, op, hex) \ + STMT_BEGIN \ + size_t length = strlen(hex); \ + tor_free(mem_op_hex_tmp); \ + mem_op_hex_tmp = tor_malloc(length/2); \ + tor_assert((length&1)==0); \ + base16_decode(mem_op_hex_tmp, length/2, hex, length); \ + tt_mem_op(expr1, op, mem_op_hex_tmp, length/2); \ + STMT_END + +#define test_memeq_hex(expr1, hex) test_mem_op_hex(expr1, OP_EQ, hex) + +#define tt_double_op(a,op,b) \ + tt_assert_test_type(a,b,#a" "#op" "#b,double,(val1_ op val2_),"%g", \ + TT_EXIT_TEST_FUNCTION) + +/* Declare "double equal" in a sneaky way, so compiler won't complain about + * comparing floats with == or !=. Of course, only do this if you know what + * you're doing. */ +#define tt_double_eq(a,b) \ + STMT_BEGIN \ + tt_double_op((a), OP_GE, (b)); \ + tt_double_op((a), OP_LE, (b)); \ + STMT_END + +#ifdef _MSC_VER +#define U64_PRINTF_TYPE uint64_t +#define I64_PRINTF_TYPE int64_t +#else +#define U64_PRINTF_TYPE unsigned long long +#define I64_PRINTF_TYPE long long +#endif /* defined(_MSC_VER) */ + +#define tt_size_op(a,op,b) \ + tt_assert_test_fmt_type(a,b,#a" "#op" "#b,size_t,(val1_ op val2_), \ + U64_PRINTF_TYPE, U64_FORMAT, \ + {print_ = (U64_PRINTF_TYPE) value_;}, {}, TT_EXIT_TEST_FUNCTION) + +#define tt_u64_op(a,op,b) \ + tt_assert_test_fmt_type(a,b,#a" "#op" "#b,uint64_t,(val1_ op val2_), \ + U64_PRINTF_TYPE, U64_FORMAT, \ + {print_ = (U64_PRINTF_TYPE) value_;}, {}, TT_EXIT_TEST_FUNCTION) + +#define tt_i64_op(a,op,b) \ + tt_assert_test_fmt_type(a,b,#a" "#op" "#b,int64_t,(val1_ op val2_), \ + I64_PRINTF_TYPE, I64_FORMAT, \ + {print_ = (I64_PRINTF_TYPE) value_;}, {}, TT_EXIT_TEST_FUNCTION) + +const char *get_fname(const char *name); +const char *get_fname_rnd(const char *name); +struct crypto_pk_t *pk_generate(int idx); +void init_pregenerated_keys(void); +void free_pregenerated_keys(void); + +#define US2_CONCAT_2__(a, b) a ## __ ## b +#define US_CONCAT_2__(a, b) a ## _ ## b +#define US_CONCAT_3__(a, b, c) a ## _ ## b ## _ ## c +#define US_CONCAT_2_(a, b) US_CONCAT_2__(a, b) +#define US_CONCAT_3_(a, b, c) US_CONCAT_3__(a, b, c) + +/* + * These macros are helpful for streamlining the authorship of several test + * cases that use mocks. + * + * The pattern is as follows. + * * Declare a top level namespace: + * #define NS_MODULE foo + * + * * For each test case you want to write, create a new submodule in the + * namespace. All mocks and other information should belong to a single + * submodule to avoid interference with other test cases. + * You can simply name the submodule after the function in the module you + * are testing: + * #define NS_SUBMODULE some_function + * or, if you're wanting to write several tests against the same function, + * ie., you are testing an aspect of that function, you can use: + * #define NS_SUBMODULE ASPECT(some_function, behavior) + * + * * Declare all the mocks you will use. The NS_DECL macro serves to declare + * the mock in the current namespace (defined by NS_MODULE and NS_SUBMODULE). + * It behaves like MOCK_DECL: + * NS_DECL(int, dependent_function, (void *)); + * Here, dependent_function must be declared and implemented with the + * MOCK_DECL and MOCK_IMPL macros. The NS_DECL macro also defines an integer + * global for use for tracking how many times a mock was called, and can be + * accessed by CALLED(mock_name). For example, you might put + * CALLED(dependent_function)++; + * in your mock body. + * + * * Define a function called NS(main) that will contain the body of the + * test case. The NS macro can be used to reference a name in the current + * namespace. + * + * * In NS(main), indicate that a mock function in the current namespace, + * declared with NS_DECL is to override that in the global namespace, + * with the NS_MOCK macro: + * NS_MOCK(dependent_function) + * Unmock with: + * NS_UNMOCK(dependent_function) + * + * * Define the mocks with the NS macro, eg., + * int + * NS(dependent_function)(void *) + * { + * CALLED(dependent_function)++; + * } + * + * * In the struct testcase_t array, you can use the TEST_CASE and + * TEST_CASE_ASPECT macros to define the cases without having to do so + * explicitly nor without having to reset NS_SUBMODULE, eg., + * struct testcase_t foo_tests[] = { + * TEST_CASE_ASPECT(some_function, behavior), + * ... + * END_OF_TESTCASES + * which will define a test case named "some_function__behavior". + */ + +#define NAME_TEST_(name) #name +#define NAME_TEST(name) NAME_TEST_(name) +#define ASPECT(test_module, test_name) US2_CONCAT_2__(test_module, test_name) +#define TEST_CASE(function) \ + { \ + NAME_TEST(function), \ + NS_FULL(NS_MODULE, function, test_main), \ + TT_FORK, \ + NULL, \ + NULL, \ + } +#define TEST_CASE_ASPECT(function, aspect) \ + { \ + NAME_TEST(ASPECT(function, aspect)), \ + NS_FULL(NS_MODULE, ASPECT(function, aspect), test_main), \ + TT_FORK, \ + NULL, \ + NULL, \ + } + +#define NS(name) US_CONCAT_3_(NS_MODULE, NS_SUBMODULE, name) +#define NS_FULL(module, submodule, name) US_CONCAT_3_(module, submodule, name) + +#define CALLED(mock_name) US_CONCAT_2_(NS(mock_name), called) +#define NS_DECL(retval, mock_fn, args) \ + extern int CALLED(mock_fn); \ + static retval NS(mock_fn) args; int CALLED(mock_fn) = 0 +#define NS_MOCK(name) MOCK(name, NS(name)) +#define NS_UNMOCK(name) UNMOCK(name) + +extern const struct testcase_setup_t passthrough_setup; +extern const struct testcase_setup_t ed25519_test_setup; + +extern struct testcase_t accounting_tests[]; +extern struct testcase_t addr_tests[]; +extern struct testcase_t address_tests[]; +extern struct testcase_t buffer_tests[]; +extern struct testcase_t cell_format_tests[]; +extern struct testcase_t cell_queue_tests[]; +extern struct testcase_t channel_tests[]; +extern struct testcase_t channelpadding_tests[]; +extern struct testcase_t channeltls_tests[]; +extern struct testcase_t checkdir_tests[]; +extern struct testcase_t circuitbuild_tests[]; +extern struct testcase_t circuitlist_tests[]; +extern struct testcase_t circuitmux_tests[]; +extern struct testcase_t circuituse_tests[]; +extern struct testcase_t circuitstats_tests[]; +extern struct testcase_t compat_libevent_tests[]; +extern struct testcase_t config_tests[]; +extern struct testcase_t connection_tests[]; +extern struct testcase_t conscache_tests[]; +extern struct testcase_t consdiff_tests[]; +extern struct testcase_t consdiffmgr_tests[]; +extern struct testcase_t container_tests[]; +extern struct testcase_t controller_tests[]; +extern struct testcase_t controller_event_tests[]; +extern struct testcase_t crypto_tests[]; +extern struct testcase_t crypto_openssl_tests[]; +extern struct testcase_t dir_tests[]; +extern struct testcase_t dir_handle_get_tests[]; +extern struct testcase_t entryconn_tests[]; +extern struct testcase_t entrynodes_tests[]; +extern struct testcase_t guardfraction_tests[]; +extern struct testcase_t extorport_tests[]; +extern struct testcase_t hs_tests[]; +extern struct testcase_t hs_cache[]; +extern struct testcase_t hs_cell_tests[]; +extern struct testcase_t hs_common_tests[]; +extern struct testcase_t hs_config_tests[]; +extern struct testcase_t hs_control_tests[]; +extern struct testcase_t hs_descriptor[]; +extern struct testcase_t hs_ntor_tests[]; +extern struct testcase_t hs_service_tests[]; +extern struct testcase_t hs_client_tests[]; +extern struct testcase_t hs_intropoint_tests[]; +extern struct testcase_t introduce_tests[]; +extern struct testcase_t keypin_tests[]; +extern struct testcase_t link_handshake_tests[]; +extern struct testcase_t logging_tests[]; +extern struct testcase_t microdesc_tests[]; +extern struct testcase_t nodelist_tests[]; +extern struct testcase_t oom_tests[]; +extern struct testcase_t oos_tests[]; +extern struct testcase_t options_tests[]; +extern struct testcase_t policy_tests[]; +extern struct testcase_t procmon_tests[]; +extern struct testcase_t proto_http_tests[]; +extern struct testcase_t proto_misc_tests[]; +extern struct testcase_t protover_tests[]; +extern struct testcase_t pubsub_tests[]; +extern struct testcase_t pt_tests[]; +extern struct testcase_t relay_tests[]; +extern struct testcase_t relaycell_tests[]; +extern struct testcase_t rend_cache_tests[]; +extern struct testcase_t replaycache_tests[]; +extern struct testcase_t router_tests[]; +extern struct testcase_t routerkeys_tests[]; +extern struct testcase_t routerlist_tests[]; +extern struct testcase_t routerset_tests[]; +extern struct testcase_t scheduler_tests[]; +extern struct testcase_t storagedir_tests[]; +extern struct testcase_t socks_tests[]; +extern struct testcase_t status_tests[]; +extern struct testcase_t thread_tests[]; +extern struct testcase_t tortls_tests[]; +extern struct testcase_t util_tests[]; +extern struct testcase_t util_format_tests[]; +extern struct testcase_t util_process_tests[]; +extern struct testcase_t dns_tests[]; +extern struct testcase_t handle_tests[]; +extern struct testcase_t sr_tests[]; + +extern struct testcase_t slow_crypto_tests[]; +extern struct testcase_t slow_util_tests[]; + +extern struct testgroup_t testgroups[]; + +extern const char AUTHORITY_CERT_1[]; +extern const char AUTHORITY_SIGNKEY_1[]; +extern const char AUTHORITY_SIGNKEY_A_DIGEST[]; +extern const char AUTHORITY_SIGNKEY_A_DIGEST256[]; +extern const char AUTHORITY_CERT_2[]; +extern const char AUTHORITY_SIGNKEY_2[]; +extern const char AUTHORITY_SIGNKEY_B_DIGEST[]; +extern const char AUTHORITY_SIGNKEY_B_DIGEST256[]; +extern const char AUTHORITY_CERT_3[]; +extern const char AUTHORITY_SIGNKEY_3[]; +extern const char AUTHORITY_SIGNKEY_C_DIGEST[]; +extern const char AUTHORITY_SIGNKEY_C_DIGEST256[]; + +#endif /* !defined(TOR_TEST_H) */ + diff --git a/src/wraith/src/test/test_accounting.c b/src/wraith/src/test/test_accounting.c new file mode 100644 index 000000000..b0d37b298 --- /dev/null +++ b/src/wraith/src/test/test_accounting.c @@ -0,0 +1,105 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "test.h" +#define HIBERNATE_PRIVATE +#include "hibernate.h" +#include "config.h" +#define STATEFILE_PRIVATE +#include "statefile.h" + +#define NS_MODULE accounting + +#define NS_SUBMODULE limits + +/* + * Test to make sure accounting triggers hibernation + * correctly with both sum or max rules set + */ + +static or_state_t *or_state; +NS_DECL(or_state_t *, get_or_state, (void)); +static or_state_t * +NS(get_or_state)(void) +{ + return or_state; +} + +static void +test_accounting_limits(void *arg) +{ + or_options_t *options = get_options_mutable(); + time_t fake_time = time(NULL); + (void) arg; + + NS_MOCK(get_or_state); + or_state = or_state_new(); + + options->AccountingMax = 100; + options->AccountingRule = ACCT_MAX; + + tor_assert(accounting_is_enabled(options)); + configure_accounting(fake_time); + + accounting_add_bytes(10, 0, 1); + fake_time += 1; + consider_hibernation(fake_time); + tor_assert(we_are_hibernating() == 0); + + accounting_add_bytes(90, 0, 1); + fake_time += 1; + consider_hibernation(fake_time); + tor_assert(we_are_hibernating() == 1); + + options->AccountingMax = 200; + options->AccountingRule = ACCT_SUM; + + accounting_add_bytes(0, 10, 1); + fake_time += 1; + consider_hibernation(fake_time); + tor_assert(we_are_hibernating() == 0); + + accounting_add_bytes(0, 90, 1); + fake_time += 1; + consider_hibernation(fake_time); + tor_assert(we_are_hibernating() == 1); + + options->AccountingRule = ACCT_OUT; + + accounting_add_bytes(100, 10, 1); + fake_time += 1; + consider_hibernation(fake_time); + tor_assert(we_are_hibernating() == 0); + + accounting_add_bytes(0, 90, 1); + fake_time += 1; + consider_hibernation(fake_time); + tor_assert(we_are_hibernating() == 1); + + options->AccountingMax = 300; + options->AccountingRule = ACCT_IN; + + accounting_add_bytes(10, 100, 1); + fake_time += 1; + consider_hibernation(fake_time); + tor_assert(we_are_hibernating() == 0); + + accounting_add_bytes(90, 0, 1); + fake_time += 1; + consider_hibernation(fake_time); + tor_assert(we_are_hibernating() == 1); + + goto done; + done: + NS_UNMOCK(get_or_state); + or_state_free(or_state); +} + +#undef NS_SUBMODULE + +struct testcase_t accounting_tests[] = { + { "bwlimits", test_accounting_limits, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_addr.c b/src/wraith/src/test/test_addr.c new file mode 100644 index 000000000..e1a40b7e6 --- /dev/null +++ b/src/wraith/src/test/test_addr.c @@ -0,0 +1,1105 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define ADDRESSMAP_PRIVATE +#include "orconfig.h" +#include "or.h" +#include "test.h" +#include "addressmap.h" + +/** Mocking replacement: only handles localhost. */ +static int +mock_tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr_out) +{ + if (!strcmp(name, "localhost")) { + if (family == AF_INET || family == AF_UNSPEC) { + tor_addr_from_ipv4h(addr_out, 0x7f000001); + return 0; + } else if (family == AF_INET6) { + char bytes[16] = { 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1 }; + tor_addr_from_ipv6_bytes(addr_out, bytes); + return 0; + } + } + return -1; +} + +static void +test_addr_basic(void *arg) +{ + uint32_t u32; + uint16_t u16; + char *cp; + + /* Test addr_port_lookup */ + (void)arg; + cp = NULL; u32 = 3; u16 = 3; + tt_assert(!addr_port_lookup(LOG_WARN, "1.2.3.4", &cp, &u32, &u16)); + tt_str_op(cp,OP_EQ, "1.2.3.4"); + tt_int_op(u32,OP_EQ, 0x01020304u); + tt_int_op(u16,OP_EQ, 0); + tor_free(cp); + tt_assert(!addr_port_lookup(LOG_WARN, "4.3.2.1:99", &cp, &u32, &u16)); + tt_str_op(cp,OP_EQ, "4.3.2.1"); + tt_int_op(u32,OP_EQ, 0x04030201u); + tt_int_op(u16,OP_EQ, 99); + tor_free(cp); + + MOCK(tor_addr_lookup, mock_tor_addr_lookup); + + tt_assert(!addr_port_lookup(LOG_WARN, "nonexistent.address:4040", + &cp, NULL, &u16)); + tt_str_op(cp,OP_EQ, "nonexistent.address"); + tt_int_op(u16,OP_EQ, 4040); + tor_free(cp); + tt_assert(!addr_port_lookup(LOG_WARN, "localhost:9999", &cp, &u32, &u16)); + tt_str_op(cp,OP_EQ, "localhost"); + tt_int_op(u16,OP_EQ, 9999); + tt_int_op(u32,OP_EQ, 0x7f000001u); + tor_free(cp); + u32 = 3; + tt_assert(!addr_port_lookup(LOG_WARN, "localhost", NULL, &u32, &u16)); + tt_ptr_op(cp,OP_EQ, NULL); + tt_int_op(u32,OP_EQ, 0x7f000001u); + tt_int_op(u16,OP_EQ, 0); + tor_free(cp); + + tt_assert(addr_port_lookup(LOG_WARN, "localhost:3", &cp, &u32, NULL)); + tor_free(cp); + + tt_int_op(0,OP_EQ, addr_mask_get_bits(0x0u)); + tt_int_op(32,OP_EQ, addr_mask_get_bits(0xFFFFFFFFu)); + tt_int_op(16,OP_EQ, addr_mask_get_bits(0xFFFF0000u)); + tt_int_op(31,OP_EQ, addr_mask_get_bits(0xFFFFFFFEu)); + tt_int_op(1,OP_EQ, addr_mask_get_bits(0x80000000u)); + + /* Test inet_ntop */ + { + char tmpbuf[TOR_ADDR_BUF_LEN]; + const char *ip = "176.192.208.224"; + struct in_addr in; + + /* good round trip */ + tt_int_op(tor_inet_pton(AF_INET, ip, &in), OP_EQ, 1); + tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, sizeof(tmpbuf)), + OP_EQ, &tmpbuf); + tt_str_op(tmpbuf,OP_EQ, ip); + + /* just enough buffer length */ + tt_str_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip) + 1), OP_EQ, ip); + + /* too short buffer */ + tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip)),OP_EQ, NULL); + } + + done: + UNMOCK(tor_addr_lookup); + tor_free(cp); +} + +#define test_op_ip6_(a,op,b,e1,e2) \ + STMT_BEGIN \ + tt_assert_test_fmt_type(a,b,e1" "#op" "e2,struct in6_addr*, \ + (fast_memcmp(val1_->s6_addr, val2_->s6_addr, 16) op 0), \ + char *, "%s", \ + { char *cp; \ + cp = print_ = tor_malloc(64); \ + for (int ii_=0;ii_<16;++ii_) { \ + tor_snprintf(cp, 3,"%02x", (unsigned)value_->s6_addr[ii_]); \ + cp += 2; \ + if (ii_ != 15) *cp++ = ':'; \ + } \ + }, \ + { tor_free(print_); }, \ + TT_EXIT_TEST_FUNCTION \ + ); \ + STMT_END + +/** Helper: Assert that two strings both decode as IPv6 addresses with + * tor_inet_pton(), and both decode to the same address. */ +#define test_pton6_same(a,b) STMT_BEGIN \ + tt_int_op(tor_inet_pton(AF_INET6, a, &a1), OP_EQ, 1); \ + tt_int_op(tor_inet_pton(AF_INET6, b, &a2), OP_EQ, 1); \ + test_op_ip6_(&a1,OP_EQ,&a2,#a,#b); \ + STMT_END + +/** Helper: Assert that a is recognized as a bad IPv6 address by + * tor_inet_pton(). */ +#define test_pton6_bad(a) \ + tt_int_op(0, OP_EQ, tor_inet_pton(AF_INET6, a, &a1)) + +/** Helper: assert that a, when parsed by tor_inet_pton() and displayed + * with tor_inet_ntop(), yields b. Also assert that b parses to + * the same value as a. */ +#define test_ntop6_reduces(a,b) STMT_BEGIN \ + tt_int_op(tor_inet_pton(AF_INET6, a, &a1), OP_EQ, 1); \ + tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)), OP_EQ, b); \ + tt_int_op(tor_inet_pton(AF_INET6, b, &a2), OP_EQ, 1); \ + test_op_ip6_(&a1, OP_EQ, &a2, a, b); \ + STMT_END + +/** Helper: assert that a parses by tor_inet_pton() into a address that + * passes tor_addr_is_internal() with for_listening. */ +#define test_internal_ip(a,for_listening) STMT_BEGIN \ + tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ + t1.family = AF_INET6; \ + if (!tor_addr_is_internal(&t1, for_listening)) \ + TT_DIE(("%s was not internal", a)); \ + STMT_END + +/** Helper: assert that a parses by tor_inet_pton() into a address that + * does not pass tor_addr_is_internal() with for_listening. */ +#define test_external_ip(a,for_listening) STMT_BEGIN \ + tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ + t1.family = AF_INET6; \ + if (tor_addr_is_internal(&t1, for_listening)) \ + TT_DIE(("%s was not internal", a)); \ + STMT_END + +/** Helper: Assert that a and b, when parsed by + * tor_inet_pton(), give addresses that compare in the order defined by + * op with tor_addr_compare(). */ +#define test_addr_compare(a, op, b) STMT_BEGIN \ + tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ + tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), OP_EQ, 1); \ + t1.family = t2.family = AF_INET6; \ + r = tor_addr_compare(&t1,&t2,CMP_SEMANTIC); \ + if (!(r op 0)) \ + TT_DIE(("Failed: tor_addr_compare(%s,%s) %s 0", a, b, #op));\ + STMT_END + +/** Helper: Assert that a and b, when parsed by + * tor_inet_pton(), give addresses that compare in the order defined by + * op with tor_addr_compare_masked() with m masked. */ +#define test_addr_compare_masked(a, op, b, m) STMT_BEGIN \ + tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ + tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), OP_EQ, 1); \ + t1.family = t2.family = AF_INET6; \ + r = tor_addr_compare_masked(&t1,&t2,m,CMP_SEMANTIC); \ + if (!(r op 0)) \ + TT_DIE(("Failed: tor_addr_compare_masked(%s,%s,%d) %s 0", \ + a, b, m, #op)); \ + STMT_END + +/** Helper: assert that xx is parseable as a masked IPv6 address with + * ports by tor_parse_mask_addr_ports(), with family f, IP address + * as 4 32-bit words ip1...ip4, mask bits as mm, and port range + * as pt1..pt2. */ +#define test_addr_mask_ports_parse(xx, f, ip1, ip2, ip3, ip4, mm, pt1, pt2) \ + STMT_BEGIN \ + tt_int_op(tor_addr_parse_mask_ports(xx, 0, &t1, &mask, &port1, &port2), \ + OP_EQ, f); \ + p1=tor_inet_ntop(AF_INET6, &t1.addr.in6_addr, bug, sizeof(bug)); \ + tt_int_op(htonl(ip1), OP_EQ, tor_addr_to_in6_addr32(&t1)[0]); \ + tt_int_op(htonl(ip2), OP_EQ, tor_addr_to_in6_addr32(&t1)[1]); \ + tt_int_op(htonl(ip3), OP_EQ, tor_addr_to_in6_addr32(&t1)[2]); \ + tt_int_op(htonl(ip4), OP_EQ, tor_addr_to_in6_addr32(&t1)[3]); \ + tt_int_op(mask, OP_EQ, mm); \ + tt_uint_op(port1, OP_EQ, pt1); \ + tt_uint_op(port2, OP_EQ, pt2); \ + STMT_END + +/** Run unit tests for IPv6 encoding/decoding/manipulation functions. */ +static void +test_addr_ip6_helpers(void *arg) +{ + char buf[TOR_ADDR_BUF_LEN], bug[TOR_ADDR_BUF_LEN]; + char rbuf[REVERSE_LOOKUP_NAME_BUF_LEN]; + struct in6_addr a1, a2; + tor_addr_t t1, t2; + int r, i; + uint16_t port1, port2; + maskbits_t mask; + const char *p1; + struct sockaddr_storage sa_storage; + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; + + /* Test tor_inet_ntop and tor_inet_pton: IPv6 */ + (void)arg; + { + const char *ip = "2001::1234"; + const char *ip_ffff = "::ffff:192.168.1.2"; + + /* good round trip */ + tt_int_op(tor_inet_pton(AF_INET6, ip, &a1),OP_EQ, 1); + tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)),OP_EQ, &buf); + tt_str_op(buf,OP_EQ, ip); + + /* good round trip - ::ffff:0:0 style */ + tt_int_op(tor_inet_pton(AF_INET6, ip_ffff, &a2),OP_EQ, 1); + tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, sizeof(buf)),OP_EQ, &buf); + tt_str_op(buf,OP_EQ, ip_ffff); + + /* just long enough buffer (remember \0) */ + tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)+1),OP_EQ, ip); + tt_str_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)+1),OP_EQ, + ip_ffff); + + /* too short buffer (remember \0) */ + tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)),OP_EQ, NULL); + tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)),OP_EQ, NULL); + } + + /* ==== Converting to and from sockaddr_t. */ + sin = (struct sockaddr_in *)&sa_storage; + sin->sin_family = AF_INET; + sin->sin_port = htons(9090); + sin->sin_addr.s_addr = htonl(0x7f7f0102); /*127.127.1.2*/ + tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin, &port1); + tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ, 0x7f7f0102); + tt_int_op(port1, OP_EQ, 9090); + + memset(&sa_storage, 0, sizeof(sa_storage)); + tt_int_op(sizeof(struct sockaddr_in),OP_EQ, + tor_addr_to_sockaddr(&t1, 1234, (struct sockaddr *)&sa_storage, + sizeof(sa_storage))); + tt_int_op(1234,OP_EQ, ntohs(sin->sin_port)); + tt_int_op(0x7f7f0102,OP_EQ, ntohl(sin->sin_addr.s_addr)); + + memset(&sa_storage, 0, sizeof(sa_storage)); + sin6 = (struct sockaddr_in6 *)&sa_storage; + sin6->sin6_family = AF_INET6; + sin6->sin6_port = htons(7070); + sin6->sin6_addr.s6_addr[0] = 128; + tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin6, &port1); + tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET6); + tt_int_op(port1, OP_EQ, 7070); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0); + tt_str_op(p1,OP_EQ, "8000::"); + + memset(&sa_storage, 0, sizeof(sa_storage)); + tt_int_op(sizeof(struct sockaddr_in6),OP_EQ, + tor_addr_to_sockaddr(&t1, 9999, (struct sockaddr *)&sa_storage, + sizeof(sa_storage))); + tt_int_op(AF_INET6,OP_EQ, sin6->sin6_family); + tt_int_op(9999,OP_EQ, ntohs(sin6->sin6_port)); + tt_int_op(0x80000000,OP_EQ, ntohl(S6_ADDR32(sin6->sin6_addr)[0])); + + /* ==== tor_addr_lookup: static cases. (Can't test dns without knowing we + * have a good resolver. */ + tt_int_op(0,OP_EQ, tor_addr_lookup("127.128.129.130", AF_UNSPEC, &t1)); + tt_int_op(AF_INET,OP_EQ, tor_addr_family(&t1)); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ, 0x7f808182); + + tt_int_op(0,OP_EQ, tor_addr_lookup("9000::5", AF_UNSPEC, &t1)); + tt_int_op(AF_INET6,OP_EQ, tor_addr_family(&t1)); + tt_int_op(0x90,OP_EQ, tor_addr_to_in6_addr8(&t1)[0]); + tt_assert(tor_mem_is_zero((char*)tor_addr_to_in6_addr8(&t1)+1, 14)); + tt_int_op(0x05,OP_EQ, tor_addr_to_in6_addr8(&t1)[15]); + + /* === Test pton: valid af_inet6 */ + /* Simple, valid parsing. */ + r = tor_inet_pton(AF_INET6, + "0102:0304:0506:0708:090A:0B0C:0D0E:0F10", &a1); + tt_int_op(r, OP_EQ, 1); + for (i=0;i<16;++i) { tt_int_op(i+1,OP_EQ, (int)a1.s6_addr[i]); } + /* ipv4 ending. */ + test_pton6_same("0102:0304:0506:0708:090A:0B0C:0D0E:0F10", + "0102:0304:0506:0708:090A:0B0C:13.14.15.16"); + /* shortened words. */ + test_pton6_same("0001:0099:BEEF:0000:0123:FFFF:0001:0001", + "1:99:BEEF:0:0123:FFFF:1:1"); + /* zeros at the beginning */ + test_pton6_same("0000:0000:0000:0000:0009:C0A8:0001:0001", + "::9:c0a8:1:1"); + test_pton6_same("0000:0000:0000:0000:0009:C0A8:0001:0001", + "::9:c0a8:0.1.0.1"); + /* zeros in the middle. */ + test_pton6_same("fe80:0000:0000:0000:0202:1111:0001:0001", + "fe80::202:1111:1:1"); + /* zeros at the end. */ + test_pton6_same("1000:0001:0000:0007:0000:0000:0000:0000", + "1000:1:0:7::"); + + /* === Test ntop: af_inet6 */ + test_ntop6_reduces("0:0:0:0:0:0:0:0", "::"); + + test_ntop6_reduces("0001:0099:BEEF:0006:0123:FFFF:0001:0001", + "1:99:beef:6:123:ffff:1:1"); + + //test_ntop6_reduces("0:0:0:0:0:0:c0a8:0101", "::192.168.1.1"); + test_ntop6_reduces("0:0:0:0:0:ffff:c0a8:0101", "::ffff:192.168.1.1"); + test_ntop6_reduces("0:0:0:0:0:0:c0a8:0101", "::192.168.1.1"); + test_ntop6_reduces("002:0:0000:0:3::4", "2::3:0:0:4"); + test_ntop6_reduces("0:0::1:0:3", "::1:0:3"); + test_ntop6_reduces("008:0::0", "8::"); + test_ntop6_reduces("0:0:0:0:0:ffff::1", "::ffff:0.0.0.1"); + test_ntop6_reduces("abcd:0:0:0:0:0:7f00::", "abcd::7f00:0"); + test_ntop6_reduces("0000:0000:0000:0000:0009:C0A8:0001:0001", + "::9:c0a8:1:1"); + test_ntop6_reduces("fe80:0000:0000:0000:0202:1111:0001:0001", + "fe80::202:1111:1:1"); + test_ntop6_reduces("1000:0001:0000:0007:0000:0000:0000:0000", + "1000:1:0:7::"); + + /* Bad af param */ + tt_int_op(tor_inet_pton(AF_UNSPEC, 0, 0),OP_EQ, -1); + + /* === Test pton: invalid in6. */ + test_pton6_bad("foobar."); + test_pton6_bad("-1::"); + test_pton6_bad("00001::"); + test_pton6_bad("10000::"); + test_pton6_bad("::10000"); + test_pton6_bad("55555::"); + test_pton6_bad("9:-60::"); + test_pton6_bad("9:+60::"); + test_pton6_bad("9|60::"); + test_pton6_bad("0x60::"); + test_pton6_bad("::0x60"); + test_pton6_bad("9:0x60::"); + test_pton6_bad("1:2:33333:4:0002:3::"); + test_pton6_bad("1:2:3333:4:fish:3::"); + test_pton6_bad("1:2:3:4:5:6:7:8:9"); + test_pton6_bad("1:2:3:4:5:6:7"); + test_pton6_bad("1:2:3:4:5:6:1.2.3.4.5"); + test_pton6_bad("1:2:3:4:5:6:1.2.3"); + test_pton6_bad("::1.2.3"); + test_pton6_bad("::1.2.3.4.5"); + test_pton6_bad("::ffff:0xff.0.0.0"); + test_pton6_bad("::ffff:ff.0.0.0"); + test_pton6_bad("::ffff:256.0.0.0"); + test_pton6_bad("::ffff:-1.0.0.0"); + test_pton6_bad("99"); + test_pton6_bad(""); + test_pton6_bad("."); + test_pton6_bad(":"); + test_pton6_bad("1::2::3:4"); + test_pton6_bad("a:::b:c"); + test_pton6_bad(":::a:b:c"); + test_pton6_bad("a:b:c:::"); + test_pton6_bad("1.2.3.4"); + test_pton6_bad(":1.2.3.4"); + test_pton6_bad(".2.3.4"); + /* Regression tests for 22789. */ + test_pton6_bad("0xfoo"); + test_pton6_bad("0x88"); + test_pton6_bad("0xyxxy"); + test_pton6_bad("0XFOO"); + test_pton6_bad("0X88"); + test_pton6_bad("0XYXXY"); + test_pton6_bad("0x"); + test_pton6_bad("0X"); + + /* test internal checking */ + test_external_ip("fbff:ffff::2:7", 0); + test_internal_ip("fc01::2:7", 0); + test_internal_ip("fc01::02:7", 0); + test_internal_ip("fc01::002:7", 0); + test_internal_ip("fc01::0002:7", 0); + test_internal_ip("fdff:ffff::f:f", 0); + test_external_ip("fe00::3:f", 0); + + test_external_ip("fe7f:ffff::2:7", 0); + test_internal_ip("fe80::2:7", 0); + test_internal_ip("febf:ffff::f:f", 0); + + test_internal_ip("fec0::2:7:7", 0); + test_internal_ip("feff:ffff::e:7:7", 0); + test_external_ip("ff00::e:7:7", 0); + + test_internal_ip("::", 0); + test_internal_ip("::1", 0); + test_internal_ip("::1", 1); + test_internal_ip("::", 0); + test_external_ip("::", 1); + test_external_ip("::2", 0); + test_external_ip("2001::", 0); + test_external_ip("ffff::", 0); + + test_external_ip("::ffff:0.0.0.0", 1); + test_internal_ip("::ffff:0.0.0.0", 0); + test_internal_ip("::ffff:0.255.255.255", 0); + test_external_ip("::ffff:1.0.0.0", 0); + + test_external_ip("::ffff:9.255.255.255", 0); + test_internal_ip("::ffff:10.0.0.0", 0); + test_internal_ip("::ffff:10.255.255.255", 0); + test_external_ip("::ffff:11.0.0.0", 0); + + test_external_ip("::ffff:126.255.255.255", 0); + test_internal_ip("::ffff:127.0.0.0", 0); + test_internal_ip("::ffff:127.255.255.255", 0); + test_external_ip("::ffff:128.0.0.0", 0); + + test_external_ip("::ffff:172.15.255.255", 0); + test_internal_ip("::ffff:172.16.0.0", 0); + test_internal_ip("::ffff:172.31.255.255", 0); + test_external_ip("::ffff:172.32.0.0", 0); + + test_external_ip("::ffff:192.167.255.255", 0); + test_internal_ip("::ffff:192.168.0.0", 0); + test_internal_ip("::ffff:192.168.255.255", 0); + test_external_ip("::ffff:192.169.0.0", 0); + + test_external_ip("::ffff:169.253.255.255", 0); + test_internal_ip("::ffff:169.254.0.0", 0); + test_internal_ip("::ffff:169.254.255.255", 0); + test_external_ip("::ffff:169.255.0.0", 0); + + /* tor_addr_compare(tor_addr_t x2) */ + test_addr_compare("ffff::", OP_EQ, "ffff::0"); + test_addr_compare("0::3:2:1", OP_LT, "0::ffff:0.3.2.1"); + test_addr_compare("0::2:2:1", OP_LT, "0::ffff:0.3.2.1"); + test_addr_compare("0::ffff:0.3.2.1", OP_GT, "0::0:0:0"); + test_addr_compare("0::ffff:5.2.2.1", OP_LT, + "::ffff:6.0.0.0"); /* XXXX wrong. */ + tor_addr_parse_mask_ports("[::ffff:2.3.4.5]", 0, &t1, NULL, NULL, NULL); + tor_addr_parse_mask_ports("2.3.4.5", 0, &t2, NULL, NULL, NULL); + tt_int_op(tor_addr_compare(&t1, &t2, CMP_SEMANTIC), OP_EQ, 0); + tor_addr_parse_mask_ports("[::ffff:2.3.4.4]", 0, &t1, NULL, NULL, NULL); + tor_addr_parse_mask_ports("2.3.4.5", 0, &t2, NULL, NULL, NULL); + tt_int_op(tor_addr_compare(&t1, &t2, CMP_SEMANTIC), OP_LT, 0); + + /* test compare_masked */ + test_addr_compare_masked("ffff::", OP_EQ, "ffff::0", 128); + test_addr_compare_masked("ffff::", OP_EQ, "ffff::0", 64); + test_addr_compare_masked("0::2:2:1", OP_LT, "0::8000:2:1", 81); + test_addr_compare_masked("0::2:2:1", OP_EQ, "0::8000:2:1", 80); + + /* Test undecorated tor_addr_to_str */ + tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "[123:45:6789::5005:11]")); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0); + tt_str_op(p1,OP_EQ, "123:45:6789::5005:11"); + tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "18.0.0.1")); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0); + tt_str_op(p1,OP_EQ, "18.0.0.1"); + + /* Test decorated tor_addr_to_str */ + tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "[123:45:6789::5005:11]")); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); + tt_str_op(p1,OP_EQ, "[123:45:6789::5005:11]"); + tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "18.0.0.1")); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); + tt_str_op(p1,OP_EQ, "18.0.0.1"); + + /* Test buffer bounds checking of tor_addr_to_str */ + tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "::")); /* 2 + \0 */ + tt_ptr_op(tor_addr_to_str(buf, &t1, 2, 0),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 3, 0),OP_EQ, "::"); + tt_ptr_op(tor_addr_to_str(buf, &t1, 4, 1),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 5, 1),OP_EQ, "[::]"); + + tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "2000::1337")); /* 10 + \0 */ + tt_ptr_op(tor_addr_to_str(buf, &t1, 10, 0),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 11, 0),OP_EQ, "2000::1337"); + tt_ptr_op(tor_addr_to_str(buf, &t1, 12, 1),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 13, 1),OP_EQ, "[2000::1337]"); + + tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "1.2.3.4")); /* 7 + \0 */ + tt_ptr_op(tor_addr_to_str(buf, &t1, 7, 0),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 8, 0),OP_EQ, "1.2.3.4"); + + tt_int_op(AF_INET, OP_EQ, + tor_addr_parse(&t1, "255.255.255.255")); /* 15 + \0 */ + tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 0),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 16, 0),OP_EQ, "255.255.255.255"); + tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 1),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 16, 1),OP_EQ, "255.255.255.255"); + + t1.family = AF_UNSPEC; + tt_ptr_op(tor_addr_to_str(buf, &t1, sizeof(buf), 0),OP_EQ, NULL); + + /* Test tor_addr_parse_PTR_name */ + i = tor_addr_parse_PTR_name(&t1, "Foobar.baz", AF_UNSPEC, 0); + tt_int_op(0,OP_EQ, i); + i = tor_addr_parse_PTR_name(&t1, "Foobar.baz", AF_UNSPEC, 1); + tt_int_op(0,OP_EQ, i); + i = tor_addr_parse_PTR_name(&t1, "9999999999999999999999999999.in-addr.arpa", + AF_UNSPEC, 1); + tt_int_op(-1,OP_EQ, i); + i = tor_addr_parse_PTR_name(&t1, "1.0.168.192.in-addr.arpa", + AF_UNSPEC, 1); + tt_int_op(1,OP_EQ, i); + tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); + tt_str_op(p1,OP_EQ, "192.168.0.1"); + i = tor_addr_parse_PTR_name(&t1, "192.168.0.99", AF_UNSPEC, 0); + tt_int_op(0,OP_EQ, i); + i = tor_addr_parse_PTR_name(&t1, "192.168.0.99", AF_UNSPEC, 1); + tt_int_op(1,OP_EQ, i); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); + tt_str_op(p1,OP_EQ, "192.168.0.99"); + memset(&t1, 0, sizeof(t1)); + i = tor_addr_parse_PTR_name(&t1, + "0.1.2.3.4.5.6.7.8.9.a.b.c.d.e.f." + "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." + "ip6.ARPA", + AF_UNSPEC, 0); + tt_int_op(1,OP_EQ, i); + p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); + tt_str_op(p1,OP_EQ, "[9dee:effe:ebe1:beef:fedc:ba98:7654:3210]"); + /* Failing cases. */ + i = tor_addr_parse_PTR_name(&t1, + "6.7.8.9.a.b.c.d.e.f." + "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." + "ip6.ARPA", + AF_UNSPEC, 0); + tt_int_op(i,OP_EQ, -1); + i = tor_addr_parse_PTR_name(&t1, + "6.7.8.9.a.b.c.d.e.f.a.b.c.d.e.f.0." + "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." + "ip6.ARPA", + AF_UNSPEC, 0); + tt_int_op(i,OP_EQ, -1); + i = tor_addr_parse_PTR_name(&t1, + "6.7.8.9.a.b.c.d.e.f.X.0.0.0.0.9." + "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." + "ip6.ARPA", + AF_UNSPEC, 0); + tt_int_op(i,OP_EQ, -1); + i = tor_addr_parse_PTR_name(&t1, "32.1.1.in-addr.arpa", + AF_UNSPEC, 0); + tt_int_op(i,OP_EQ, -1); + i = tor_addr_parse_PTR_name(&t1, ".in-addr.arpa", + AF_UNSPEC, 0); + tt_int_op(i,OP_EQ, -1); + i = tor_addr_parse_PTR_name(&t1, "1.2.3.4.5.in-addr.arpa", + AF_UNSPEC, 0); + tt_int_op(i,OP_EQ, -1); + i = tor_addr_parse_PTR_name(&t1, "1.2.3.4.5.in-addr.arpa", + AF_INET6, 0); + tt_int_op(i,OP_EQ, -1); + i = tor_addr_parse_PTR_name(&t1, + "6.7.8.9.a.b.c.d.e.f.a.b.c.d.e.0." + "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." + "ip6.ARPA", + AF_INET, 0); + tt_int_op(i,OP_EQ, -1); + + /* === Test tor_addr_to_PTR_name */ + + /* Stage IPv4 addr */ + memset(&sa_storage, 0, sizeof(sa_storage)); + sin = (struct sockaddr_in *)&sa_storage; + sin->sin_family = AF_INET; + sin->sin_addr.s_addr = htonl(0x7f010203); /* 127.1.2.3 */ + tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin, NULL); + + /* Check IPv4 PTR - too short buffer */ + tt_int_op(tor_addr_to_PTR_name(rbuf, 1, &t1),OP_EQ, -1); + tt_int_op(tor_addr_to_PTR_name(rbuf, + strlen("3.2.1.127.in-addr.arpa") - 1, + &t1),OP_EQ, -1); + + /* Check IPv4 PTR - valid addr */ + tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ, + strlen("3.2.1.127.in-addr.arpa")); + tt_str_op(rbuf,OP_EQ, "3.2.1.127.in-addr.arpa"); + + /* Invalid addr family */ + t1.family = AF_UNSPEC; + tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ, -1); + + /* Stage IPv6 addr */ + memset(&sa_storage, 0, sizeof(sa_storage)); + sin6 = (struct sockaddr_in6 *)&sa_storage; + sin6->sin6_family = AF_INET6; + sin6->sin6_addr.s6_addr[0] = 0x80; /* 8000::abcd */ + sin6->sin6_addr.s6_addr[14] = 0xab; + sin6->sin6_addr.s6_addr[15] = 0xcd; + + tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin6, NULL); + + { + const char* addr_PTR = "d.c.b.a.0.0.0.0.0.0.0.0.0.0.0.0." + "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.ip6.arpa"; + + /* Check IPv6 PTR - too short buffer */ + tt_int_op(tor_addr_to_PTR_name(rbuf, 0, &t1),OP_EQ, -1); + tt_int_op(tor_addr_to_PTR_name(rbuf, strlen(addr_PTR) - 1, &t1),OP_EQ, -1); + + /* Check IPv6 PTR - valid addr */ + tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ, + strlen(addr_PTR)); + tt_str_op(rbuf,OP_EQ, addr_PTR); + } + + /* XXXX turn this into a separate function; it's not all IPv6. */ + /* test tor_addr_parse_mask_ports */ + test_addr_mask_ports_parse("[::f]/17:47-95", AF_INET6, + 0, 0, 0, 0x0000000f, 17, 47, 95); + tt_str_op(p1,OP_EQ, "::f"); + //test_addr_parse("[::fefe:4.1.1.7/120]:999-1000"); + //test_addr_parse_check("::fefe:401:107", 120, 999, 1000); + test_addr_mask_ports_parse("[::ffff:4.1.1.7]/120:443", AF_INET6, + 0, 0, 0x0000ffff, 0x04010107, 120, 443, 443); + tt_str_op(p1,OP_EQ, "::ffff:4.1.1.7"); + test_addr_mask_ports_parse("[abcd:2::44a:0]:2-65000", AF_INET6, + 0xabcd0002, 0, 0, 0x044a0000, 128, 2, 65000); + + tt_str_op(p1,OP_EQ, "abcd:2::44a:0"); + /* Try some long addresses. */ + r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:1111]", + 0, &t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, AF_INET6); + r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:11111]", + 0, &t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:1111:1]", + 0, &t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports( + "[ffff:1111:1111:1111:1111:1111:1111:ffff:" + "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:" + "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:" + "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]", + 0, &t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + /* Try some failing cases. */ + r=tor_addr_parse_mask_ports("[fefef::]/112", 0, &t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("[fefe::/112", 0, &t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("[fefe::", 0, &t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("[fefe::X]", 0, &t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("efef::/112", 0, &t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f::]",0,&t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("[::f:f:f:f:f:f:f:f]",0,&t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f:f]",0,&t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("[f:f:f:f:f::]/fred",0,&t1,&mask, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("[f:f:f:f:f::]/255.255.0.0", + 0,&t1, NULL, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + /* This one will get rejected because it isn't a pure prefix. */ + r=tor_addr_parse_mask_ports("1.1.2.3/255.255.64.0",0,&t1, &mask,NULL,NULL); + tt_int_op(r, OP_EQ, -1); + /* Test for V4-mapped address with mask < 96. (arguably not valid) */ + r=tor_addr_parse_mask_ports("[::ffff:1.1.2.2/33]",0,&t1, &mask, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("1.1.2.2/33",0,&t1, &mask, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + /* Try extended wildcard addresses with out TAPMP_EXTENDED_STAR*/ + r=tor_addr_parse_mask_ports("*4",0,&t1, &mask, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("*6",0,&t1, &mask, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + tt_int_op(r, OP_EQ, -1); + /* Try a mask with a wildcard. */ + r=tor_addr_parse_mask_ports("*/16",0,&t1, &mask, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("*4/16",TAPMP_EXTENDED_STAR, + &t1, &mask, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + r=tor_addr_parse_mask_ports("*6/30",TAPMP_EXTENDED_STAR, + &t1, &mask, NULL, NULL); + tt_int_op(r, OP_EQ, -1); + /* Basic mask tests*/ + r=tor_addr_parse_mask_ports("1.1.2.2/31",0,&t1, &mask, NULL, NULL); + tt_int_op(r, OP_EQ, AF_INET); + tt_int_op(mask,OP_EQ,31); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x01010202); + r=tor_addr_parse_mask_ports("3.4.16.032:1-2",0,&t1, &mask, &port1, &port2); + tt_int_op(r, OP_EQ, AF_INET); + tt_int_op(mask,OP_EQ,32); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x03041020); + tt_uint_op(port1, OP_EQ, 1); + tt_uint_op(port2, OP_EQ, 2); + r=tor_addr_parse_mask_ports("1.1.2.3/255.255.128.0",0,&t1, &mask,NULL,NULL); + tt_int_op(r, OP_EQ, AF_INET); + tt_int_op(mask,OP_EQ,17); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x01010203); + r=tor_addr_parse_mask_ports("[efef::]/112",0,&t1, &mask, &port1, &port2); + tt_int_op(r, OP_EQ, AF_INET6); + tt_uint_op(port1, OP_EQ, 1); + tt_uint_op(port2, OP_EQ, 65535); + /* Try regular wildcard behavior without TAPMP_EXTENDED_STAR */ + r=tor_addr_parse_mask_ports("*:80-443",0,&t1,&mask,&port1,&port2); + tt_int_op(r,OP_EQ,AF_INET); /* Old users of this always get inet */ + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0); + tt_int_op(mask,OP_EQ,0); + tt_int_op(port1,OP_EQ,80); + tt_int_op(port2,OP_EQ,443); + /* Now try wildcards *with* TAPMP_EXTENDED_STAR */ + r=tor_addr_parse_mask_ports("*:8000-9000",TAPMP_EXTENDED_STAR, + &t1,&mask,&port1,&port2); + tt_int_op(r,OP_EQ,AF_UNSPEC); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_UNSPEC); + tt_int_op(mask,OP_EQ,0); + tt_int_op(port1,OP_EQ,8000); + tt_int_op(port2,OP_EQ,9000); + r=tor_addr_parse_mask_ports("*4:6667",TAPMP_EXTENDED_STAR, + &t1,&mask,&port1,&port2); + tt_int_op(r,OP_EQ,AF_INET); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0); + tt_int_op(mask,OP_EQ,0); + tt_int_op(port1,OP_EQ,6667); + tt_int_op(port2,OP_EQ,6667); + r=tor_addr_parse_mask_ports("*6",TAPMP_EXTENDED_STAR, + &t1,&mask,&port1,&port2); + tt_int_op(r,OP_EQ,AF_INET6); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET6); + tt_assert(tor_mem_is_zero((const char*)tor_addr_to_in6_addr32(&t1), 16)); + tt_int_op(mask,OP_EQ,0); + tt_int_op(port1,OP_EQ,1); + tt_int_op(port2,OP_EQ,65535); + + /* make sure inet address lengths >= max */ + tt_int_op(INET_NTOA_BUF_LEN, OP_GE, sizeof("255.255.255.255")); + tt_int_op(TOR_ADDR_BUF_LEN, OP_GE, + sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")); + + tt_assert(sizeof(tor_addr_t) >= sizeof(struct in6_addr)); + + /* get interface addresses */ + r = get_interface_address6(LOG_DEBUG, AF_INET, &t1); + tt_int_op(r, OP_LE, 0); // "it worked or it didn't" + i = get_interface_address6(LOG_DEBUG, AF_INET6, &t2); + tt_int_op(i, OP_LE, 0); // "it worked or it didn't" + + TT_BLATHER(("v4 address: %s (family=%d)", fmt_addr(&t1), + tor_addr_family(&t1))); + TT_BLATHER(("v6 address: %s (family=%d)", fmt_addr(&t2), + tor_addr_family(&t2))); + + done: + ; +} + +/** Test tor_addr_port_parse(). */ +static void +test_addr_parse(void *arg) +{ + int r; + tor_addr_t addr; + char buf[TOR_ADDR_BUF_LEN]; + uint16_t port = 0; + + /* Correct call. */ + (void)arg; + r= tor_addr_port_parse(LOG_DEBUG, + "192.0.2.1:1234", + &addr, &port, -1); + tt_int_op(r, OP_EQ, 0); + tor_addr_to_str(buf, &addr, sizeof(buf), 0); + tt_str_op(buf,OP_EQ, "192.0.2.1"); + tt_int_op(port,OP_EQ, 1234); + + r= tor_addr_port_parse(LOG_DEBUG, + "[::1]:1234", + &addr, &port, -1); + tt_int_op(r, OP_EQ, 0); + tor_addr_to_str(buf, &addr, sizeof(buf), 0); + tt_str_op(buf,OP_EQ, "::1"); + tt_int_op(port,OP_EQ, 1234); + + /* Domain name. */ + r= tor_addr_port_parse(LOG_DEBUG, + "torproject.org:1234", + &addr, &port, -1); + tt_int_op(r, OP_EQ, -1); + + /* Only IP. */ + r= tor_addr_port_parse(LOG_DEBUG, + "192.0.2.2", + &addr, &port, -1); + tt_int_op(r, OP_EQ, -1); + + r= tor_addr_port_parse(LOG_DEBUG, + "192.0.2.2", + &addr, &port, 200); + tt_int_op(r, OP_EQ, 0); + tt_int_op(port,OP_EQ,200); + + r= tor_addr_port_parse(LOG_DEBUG, + "[::1]", + &addr, &port, -1); + tt_int_op(r, OP_EQ, -1); + + r= tor_addr_port_parse(LOG_DEBUG, + "[::1]", + &addr, &port, 400); + tt_int_op(r, OP_EQ, 0); + tt_int_op(port,OP_EQ,400); + + /* Bad port. */ + r= tor_addr_port_parse(LOG_DEBUG, + "192.0.2.2:66666", + &addr, &port, -1); + tt_int_op(r, OP_EQ, -1); + r= tor_addr_port_parse(LOG_DEBUG, + "192.0.2.2:66666", + &addr, &port, 200); + tt_int_op(r, OP_EQ, -1); + + /* Only domain name */ + r= tor_addr_port_parse(LOG_DEBUG, + "torproject.org", + &addr, &port, -1); + tt_int_op(r, OP_EQ, -1); + r= tor_addr_port_parse(LOG_DEBUG, + "torproject.org", + &addr, &port, 200); + tt_int_op(r, OP_EQ, -1); + + /* Bad IP address */ + r= tor_addr_port_parse(LOG_DEBUG, + "192.0.2:1234", + &addr, &port, -1); + tt_int_op(r, OP_EQ, -1); + + /* Make sure that the default port has lower priority than the real + one */ + r= tor_addr_port_parse(LOG_DEBUG, + "192.0.2.2:1337", + &addr, &port, 200); + tt_int_op(r, OP_EQ, 0); + tt_int_op(port,OP_EQ,1337); + + r= tor_addr_port_parse(LOG_DEBUG, + "[::1]:1369", + &addr, &port, 200); + tt_int_op(r, OP_EQ, 0); + tt_int_op(port,OP_EQ,1369); + + done: + ; +} + +static void +update_difference(int ipv6, uint8_t *d, + const tor_addr_t *a, const tor_addr_t *b) +{ + const int n_bytes = ipv6 ? 16 : 4; + uint8_t a_tmp[4], b_tmp[4]; + const uint8_t *ba, *bb; + int i; + + if (ipv6) { + ba = tor_addr_to_in6_addr8(a); + bb = tor_addr_to_in6_addr8(b); + } else { + set_uint32(a_tmp, tor_addr_to_ipv4n(a)); + set_uint32(b_tmp, tor_addr_to_ipv4n(b)); + ba = a_tmp; bb = b_tmp; + } + + for (i = 0; i < n_bytes; ++i) { + d[i] |= ba[i] ^ bb[i]; + } +} + +static void +test_virtaddrmap(void *data) +{ + /* Let's start with a bunch of random addresses. */ + int ipv6, bits, iter, b; + virtual_addr_conf_t cfg[2]; + uint8_t bytes[16]; + + (void)data; + + tor_addr_parse(&cfg[0].addr, "64.65.0.0"); + tor_addr_parse(&cfg[1].addr, "3491:c0c0::"); + + for (ipv6 = 0; ipv6 <= 1; ++ipv6) { + for (bits = 0; bits < 18; ++bits) { + tor_addr_t last_a; + cfg[ipv6].bits = bits; + memset(bytes, 0, sizeof(bytes)); + tor_addr_copy(&last_a, &cfg[ipv6].addr); + /* Generate 128 addresses with each addr/bits combination. */ + for (iter = 0; iter < 128; ++iter) { + tor_addr_t a; + + get_random_virtual_addr(&cfg[ipv6], &a); + //printf("%s\n", fmt_addr(&a)); + /* Make sure that the first b bits match the configured network */ + tt_int_op(0, OP_EQ, tor_addr_compare_masked(&a, &cfg[ipv6].addr, + bits, CMP_EXACT)); + + /* And track which bits have been different between pairs of + * addresses */ + update_difference(ipv6, bytes, &last_a, &a); + } + + /* Now make sure all but the first 'bits' bits of bytes are true */ + for (b = bits+1; b < (ipv6?128:32); ++b) { + tt_assert(1 & (bytes[b/8] >> (7-(b&7)))); + } + } + } + + done: + ; +} + +static void +test_addr_localname(void *arg) +{ + (void)arg; + tt_assert(tor_addr_hostname_is_local("localhost")); + tt_assert(tor_addr_hostname_is_local("LOCALHOST")); + tt_assert(tor_addr_hostname_is_local("LocalHost")); + tt_assert(tor_addr_hostname_is_local("local")); + tt_assert(tor_addr_hostname_is_local("LOCAL")); + tt_assert(tor_addr_hostname_is_local("here.now.local")); + tt_assert(tor_addr_hostname_is_local("here.now.LOCAL")); + + tt_assert(!tor_addr_hostname_is_local(" localhost")); + tt_assert(!tor_addr_hostname_is_local("www.torproject.org")); + done: + ; +} + +static void +test_addr_dup_ip(void *arg) +{ + char *v = NULL; + (void)arg; +#define CHECK(ip, s) do { \ + v = tor_dup_ip(ip); \ + tt_str_op(v,OP_EQ,(s)); \ + tor_free(v); \ + } while (0) + + CHECK(0xffffffff, "255.255.255.255"); + CHECK(0x00000000, "0.0.0.0"); + CHECK(0x7f000001, "127.0.0.1"); + CHECK(0x01020304, "1.2.3.4"); + +#undef CHECK + done: + tor_free(v); +} + +static void +test_addr_sockaddr_to_str(void *arg) +{ + char *v = NULL; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + struct sockaddr_storage ss; +#ifdef HAVE_SYS_UN_H + struct sockaddr_un s_un; +#endif +#define CHECK(sa, s) do { \ + v = tor_sockaddr_to_str((const struct sockaddr*) &(sa)); \ + tt_str_op(v,OP_EQ,(s)); \ + tor_free(v); \ + } while (0) + (void)arg; + + memset(&ss,0,sizeof(ss)); + ss.ss_family = AF_UNSPEC; + CHECK(ss, "unspec"); + + memset(&sin,0,sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(0x7f808001); + sin.sin_port = htons(1234); + CHECK(sin, "127.128.128.1:1234"); + +#ifdef HAVE_SYS_UN_H + memset(&s_un,0,sizeof(s_un)); + s_un.sun_family = AF_UNIX; + strlcpy(s_un.sun_path, "/here/is/a/path", sizeof(s_un.sun_path)); + CHECK(s_un, "unix:/here/is/a/path"); +#endif /* defined(HAVE_SYS_UN_H) */ + + memset(&sin6,0,sizeof(sin6)); + sin6.sin6_family = AF_INET6; + memcpy(sin6.sin6_addr.s6_addr, "\x20\x00\x00\x00\x00\x00\x00\x00" + "\x00\x1a\x2b\x3c\x4d\x5e\x00\x01", 16); + sin6.sin6_port = htons(1234); + CHECK(sin6, "[2000::1a:2b3c:4d5e:1]:1234"); + + done: + tor_free(v); +} + +static void +test_addr_is_loopback(void *data) +{ + static const struct loopback_item { + const char *name; + int is_loopback; + } loopback_items[] = { + { "::1", 1 }, + { "127.0.0.1", 1 }, + { "127.99.100.101", 1 }, + { "128.99.100.101", 0 }, + { "8.8.8.8", 0 }, + { "0.0.0.0", 0 }, + { "::2", 0 }, + { "::", 0 }, + { "::1.0.0.0", 0 }, + { NULL, 0 } + }; + + int i; + tor_addr_t addr; + (void)data; + + for (i=0; loopback_items[i].name; ++i) { + tt_int_op(tor_addr_parse(&addr, loopback_items[i].name), OP_GE, 0); + tt_int_op(tor_addr_is_loopback(&addr), OP_EQ, + loopback_items[i].is_loopback); + } + + tor_addr_make_unspec(&addr); + tt_int_op(tor_addr_is_loopback(&addr), OP_EQ, 0); + + done: + ; +} + +static void +test_addr_make_null(void *data) +{ + tor_addr_t *addr = tor_malloc(sizeof(*addr)); + tor_addr_t *zeros = tor_malloc_zero(sizeof(*addr)); + char buf[TOR_ADDR_BUF_LEN]; + (void) data; + /* Ensure that before tor_addr_make_null, addr != 0's */ + memset(addr, 1, sizeof(*addr)); + tt_int_op(fast_memcmp(addr, zeros, sizeof(*addr)), OP_NE, 0); + /* Test with AF == AF_INET */ + zeros->family = AF_INET; + tor_addr_make_null(addr, AF_INET); + tt_int_op(fast_memcmp(addr, zeros, sizeof(*addr)), OP_EQ, 0); + tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), OP_EQ, "0.0.0.0"); + /* Test with AF == AF_INET6 */ + memset(addr, 1, sizeof(*addr)); + zeros->family = AF_INET6; + tor_addr_make_null(addr, AF_INET6); + tt_int_op(fast_memcmp(addr, zeros, sizeof(*addr)), OP_EQ, 0); + tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), OP_EQ, "::"); + done: + tor_free(addr); + tor_free(zeros); +} + +#define ADDR_LEGACY(name) \ + { #name, test_addr_ ## name , 0, NULL, NULL } + +struct testcase_t addr_tests[] = { + ADDR_LEGACY(basic), + ADDR_LEGACY(ip6_helpers), + ADDR_LEGACY(parse), + { "virtaddr", test_virtaddrmap, 0, NULL, NULL }, + { "localname", test_addr_localname, 0, NULL, NULL }, + { "dup_ip", test_addr_dup_ip, 0, NULL, NULL }, + { "sockaddr_to_str", test_addr_sockaddr_to_str, 0, NULL, NULL }, + { "is_loopback", test_addr_is_loopback, 0, NULL, NULL }, + { "make_null", test_addr_make_null, 0, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_address.c b/src/wraith/src/test/test_address.c new file mode 100644 index 000000000..9c88d37a4 --- /dev/null +++ b/src/wraith/src/test/test_address.c @@ -0,0 +1,1175 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define ADDRESS_PRIVATE + +#include "orconfig.h" + +#ifdef _WIN32 +#include +/* For access to structs needed by GetAdaptersAddresses */ +#include +#endif + +#ifdef HAVE_IFADDRS_TO_SMARTLIST +#include +#include +#endif + +#ifdef HAVE_IFCONF_TO_SMARTLIST +#ifdef HAVE_SYS_IOCTL_H +#include +#endif +#include +#endif /* defined(HAVE_IFCONF_TO_SMARTLIST) */ + +#include "or.h" +#include "address.h" +#include "test.h" +#include "log_test_helpers.h" + +/** Return 1 iff sockaddr1 and sockaddr2 represent + * the same IP address and port combination. Otherwise, return 0. + */ +static uint8_t +sockaddr_in_are_equal(struct sockaddr_in *sockaddr1, + struct sockaddr_in *sockaddr2) +{ + return ((sockaddr1->sin_family == sockaddr2->sin_family) && + (sockaddr1->sin_port == sockaddr2->sin_port) && + (sockaddr1->sin_addr.s_addr == sockaddr2->sin_addr.s_addr)); +} + +/** Return 1 iff sockaddr1 and sockaddr2 represent + * the same IP address and port combination. Otherwise, return 0. + */ +static uint8_t +sockaddr_in6_are_equal(struct sockaddr_in6 *sockaddr1, + struct sockaddr_in6 *sockaddr2) +{ + return ((sockaddr1->sin6_family == sockaddr2->sin6_family) && + (sockaddr1->sin6_port == sockaddr2->sin6_port) && + (tor_memeq(sockaddr1->sin6_addr.s6_addr, + sockaddr2->sin6_addr.s6_addr,16))); +} + +/** Create a sockaddr_in structure from IP address string ip_str. + * + * If out is not NULL, write the result + * to the memory address in out. Otherwise, allocate the memory + * for result. On success, return pointer to result. Otherwise, return + * NULL. + */ +static struct sockaddr_in * +sockaddr_in_from_string(const char *ip_str, struct sockaddr_in *out) +{ + // [FIXME: add some error checking?] + if (!out) + out = tor_malloc_zero(sizeof(struct sockaddr_in)); + + out->sin_family = AF_INET; + out->sin_port = 0; + tor_inet_pton(AF_INET,ip_str,&(out->sin_addr)); + + return out; +} + +/** Return 1 iff smartlist contains a tor_addr_t structure + * that is an IPv4 or IPv6 localhost address. Otherwise, return 0. + */ +static int +smartlist_contains_localhost_tor_addr(smartlist_t *smartlist) +{ + SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { + if (tor_addr_is_loopback(tor_addr)) { + return 1; + } + } SMARTLIST_FOREACH_END(tor_addr); + + return 0; +} + +/** Return 1 iff smartlist contains a tor_addr_t structure + * that is an IPv4 or IPv6 multicast address. Otherwise, return 0. + */ +static int +smartlist_contains_multicast_tor_addr(smartlist_t *smartlist) +{ + SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { + if (tor_addr_is_multicast(tor_addr)) { + return 1; + } + } SMARTLIST_FOREACH_END(tor_addr); + + return 0; +} + +/** Return 1 iff smartlist contains a tor_addr_t structure + * that is an IPv4 or IPv6 internal address. Otherwise, return 0. + */ +static int +smartlist_contains_internal_tor_addr(smartlist_t *smartlist) +{ + SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { + if (tor_addr_is_internal(tor_addr, 0)) { + return 1; + } + } SMARTLIST_FOREACH_END(tor_addr); + + return 0; +} + +/** Return 1 iff smartlist contains a tor_addr_t structure + * that is NULL or the null tor_addr_t. Otherwise, return 0. + */ +static int +smartlist_contains_null_tor_addr(smartlist_t *smartlist) +{ + SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { + if (tor_addr == NULL || tor_addr_is_null(tor_addr)) { + return 1; + } + } SMARTLIST_FOREACH_END(tor_addr); + + return 0; +} + +/** Return 1 iff smartlist contains a tor_addr_t structure + * that is an IPv4 address. Otherwise, return 0. + */ +static int +smartlist_contains_ipv4_tor_addr(smartlist_t *smartlist) +{ + SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { + if (tor_addr_is_v4(tor_addr)) { + return 1; + } + } SMARTLIST_FOREACH_END(tor_addr); + + return 0; +} + +/** Return 1 iff smartlist contains a tor_addr_t structure + * that is an IPv6 address. Otherwise, return 0. + */ +static int +smartlist_contains_ipv6_tor_addr(smartlist_t *smartlist) +{ + SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { + /* Since there's no tor_addr_is_v6, assume all non-v4s are v6 */ + if (!tor_addr_is_v4(tor_addr)) { + return 1; + } + } SMARTLIST_FOREACH_END(tor_addr); + + return 0; +} + +#ifdef HAVE_IFADDRS_TO_SMARTLIST +static void +test_address_ifaddrs_to_smartlist(void *arg) +{ + struct ifaddrs *ifa = NULL; + struct ifaddrs *ifa_ipv4 = NULL; + struct ifaddrs *ifa_ipv6 = NULL; + struct sockaddr_in *ipv4_sockaddr_local = NULL; + struct sockaddr_in *netmask_slash8 = NULL; + struct sockaddr_in *ipv4_sockaddr_remote = NULL; + struct sockaddr_in6 *ipv6_sockaddr = NULL; + smartlist_t *smartlist = NULL; + tor_addr_t *tor_addr = NULL; + struct sockaddr *sockaddr_to_check = NULL; + socklen_t addr_len; + + (void)arg; + + netmask_slash8 = sockaddr_in_from_string("255.0.0.0",NULL); + ipv4_sockaddr_local = sockaddr_in_from_string("127.0.0.1",NULL); + ipv4_sockaddr_remote = sockaddr_in_from_string("128.52.160.20",NULL); + + ipv6_sockaddr = tor_malloc(sizeof(struct sockaddr_in6)); + ipv6_sockaddr->sin6_family = AF_INET6; + ipv6_sockaddr->sin6_port = 0; + tor_inet_pton(AF_INET6, "2001:db8:8714:3a90::12", + &(ipv6_sockaddr->sin6_addr)); + + ifa = tor_malloc(sizeof(struct ifaddrs)); + ifa_ipv4 = tor_malloc(sizeof(struct ifaddrs)); + ifa_ipv6 = tor_malloc(sizeof(struct ifaddrs)); + + ifa->ifa_next = ifa_ipv4; + ifa->ifa_name = tor_strdup("eth0"); + ifa->ifa_flags = IFF_UP | IFF_RUNNING; + ifa->ifa_addr = (struct sockaddr *)ipv4_sockaddr_local; + ifa->ifa_netmask = (struct sockaddr *)netmask_slash8; + ifa->ifa_dstaddr = NULL; + ifa->ifa_data = NULL; + + ifa_ipv4->ifa_next = ifa_ipv6; + ifa_ipv4->ifa_name = tor_strdup("eth1"); + ifa_ipv4->ifa_flags = IFF_UP | IFF_RUNNING; + ifa_ipv4->ifa_addr = (struct sockaddr *)ipv4_sockaddr_remote; + ifa_ipv4->ifa_netmask = (struct sockaddr *)netmask_slash8; + ifa_ipv4->ifa_dstaddr = NULL; + ifa_ipv4->ifa_data = NULL; + + ifa_ipv6->ifa_next = NULL; + ifa_ipv6->ifa_name = tor_strdup("eth2"); + ifa_ipv6->ifa_flags = IFF_UP | IFF_RUNNING; + ifa_ipv6->ifa_addr = (struct sockaddr *)ipv6_sockaddr; + ifa_ipv6->ifa_netmask = NULL; + ifa_ipv6->ifa_dstaddr = NULL; + ifa_ipv6->ifa_data = NULL; + + smartlist = ifaddrs_to_smartlist(ifa, AF_UNSPEC); + + tt_assert(smartlist); + tt_int_op(smartlist_len(smartlist), OP_EQ, 3); + + sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in6)); + + tor_addr = smartlist_get(smartlist,0); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in)); + tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check, + ipv4_sockaddr_local)); + + tor_addr = smartlist_get(smartlist,1); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in)); + tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check, + ipv4_sockaddr_remote)); + + tor_addr = smartlist_get(smartlist,2); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check, + sizeof(struct sockaddr_in6)); + + tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in6)); + tt_assert(sockaddr_in6_are_equal((struct sockaddr_in6*)sockaddr_to_check, + ipv6_sockaddr)); + + done: + tor_free(netmask_slash8); + tor_free(ipv4_sockaddr_local); + tor_free(ipv4_sockaddr_remote); + tor_free(ipv6_sockaddr); + tor_free(ifa->ifa_name); + tor_free(ifa_ipv4->ifa_name); + tor_free(ifa_ipv6->ifa_name); + tor_free(ifa); + tor_free(ifa_ipv4); + tor_free(ifa_ipv6); + tor_free(sockaddr_to_check); + if (smartlist) { + SMARTLIST_FOREACH(smartlist, tor_addr_t *, t, tor_free(t)); + smartlist_free(smartlist); + } + return; +} + +static void +test_address_get_if_addrs_ifaddrs(void *arg) +{ + + smartlist_t *results = NULL; + + (void)arg; + + results = get_interface_addresses_ifaddrs(LOG_ERR, AF_UNSPEC); + + tt_assert(results); + /* Some FreeBSD jails don't have localhost IP address. Instead, they only + * have the address assigned to the jail (whatever that may be). + * And a jail without a network connection might not have any addresses at + * all. */ + tt_assert(!smartlist_contains_null_tor_addr(results)); + + /* If there are addresses, they must be IPv4 or IPv6 */ + if (smartlist_len(results) > 0) { + tt_assert(smartlist_contains_ipv4_tor_addr(results) + || smartlist_contains_ipv6_tor_addr(results)); + } + + done: + if (results) { + SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); + } + smartlist_free(results); + return; +} + +#endif /* defined(HAVE_IFADDRS_TO_SMARTLIST) */ + +#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST + +static void +test_address_get_if_addrs_win32(void *arg) +{ + + smartlist_t *results = NULL; + + (void)arg; + + results = get_interface_addresses_win32(LOG_ERR, AF_UNSPEC); + + tt_int_op(smartlist_len(results),OP_GE,1); + tt_assert(smartlist_contains_localhost_tor_addr(results)); + tt_assert(!smartlist_contains_null_tor_addr(results)); + + /* If there are addresses, they must be IPv4 or IPv6 */ + if (smartlist_len(results) > 0) { + tt_assert(smartlist_contains_ipv4_tor_addr(results) + || smartlist_contains_ipv6_tor_addr(results)); + } + + done: + SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); + tor_free(results); + return; +} + +static void +test_address_ip_adapter_addresses_to_smartlist(void *arg) +{ + + IP_ADAPTER_ADDRESSES *addrs1; + IP_ADAPTER_ADDRESSES *addrs2; + + IP_ADAPTER_UNICAST_ADDRESS *unicast11; + IP_ADAPTER_UNICAST_ADDRESS *unicast12; + IP_ADAPTER_UNICAST_ADDRESS *unicast21; + + smartlist_t *result = NULL; + + struct sockaddr_in *sockaddr_test1; + struct sockaddr_in *sockaddr_test2; + struct sockaddr_in *sockaddr_localhost; + struct sockaddr_in *sockaddr_to_check; + + tor_addr_t *tor_addr; + + (void)arg; + (void)sockaddr_in6_are_equal; + + sockaddr_to_check = tor_malloc_zero(sizeof(struct sockaddr_in)); + + addrs1 = + tor_malloc_zero(sizeof(IP_ADAPTER_ADDRESSES)); + + addrs1->FirstUnicastAddress = + unicast11 = tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS)); + sockaddr_test1 = sockaddr_in_from_string("86.59.30.40",NULL); + unicast11->Address.lpSockaddr = (LPSOCKADDR)sockaddr_test1; + + unicast11->Next = unicast12 = + tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS)); + sockaddr_test2 = sockaddr_in_from_string("93.95.227.222", NULL); + unicast12->Address.lpSockaddr = (LPSOCKADDR)sockaddr_test2; + + addrs1->Next = addrs2 = + tor_malloc_zero(sizeof(IP_ADAPTER_ADDRESSES)); + + addrs2->FirstUnicastAddress = + unicast21 = tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS)); + sockaddr_localhost = sockaddr_in_from_string("127.0.0.1", NULL); + unicast21->Address.lpSockaddr = (LPSOCKADDR)sockaddr_localhost; + + result = ip_adapter_addresses_to_smartlist(addrs1); + + tt_assert(result); + tt_int_op(smartlist_len(result), OP_EQ, 3); + + tor_addr = smartlist_get(result,0); + + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_assert(sockaddr_in_are_equal(sockaddr_test1,sockaddr_to_check)); + + tor_addr = smartlist_get(result,1); + + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_assert(sockaddr_in_are_equal(sockaddr_test2,sockaddr_to_check)); + + tor_addr = smartlist_get(result,2); + + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_assert(sockaddr_in_are_equal(sockaddr_localhost,sockaddr_to_check)); + + done: + SMARTLIST_FOREACH(result, tor_addr_t *, t, tor_free(t)); + smartlist_free(result); + tor_free(addrs1); + tor_free(addrs2); + tor_free(unicast11->Address.lpSockaddr); + tor_free(unicast11); + tor_free(unicast12->Address.lpSockaddr); + tor_free(unicast12); + tor_free(unicast21->Address.lpSockaddr); + tor_free(unicast21); + tor_free(sockaddr_to_check); + return; +} +#endif /* defined(HAVE_IP_ADAPTER_TO_SMARTLIST) */ + +#ifdef HAVE_IFCONF_TO_SMARTLIST + +static void +test_address_ifreq_to_smartlist(void *arg) +{ + smartlist_t *results = NULL; + const tor_addr_t *tor_addr = NULL; + struct sockaddr_in *sockaddr = NULL; + struct sockaddr_in *sockaddr_eth1 = NULL; + struct sockaddr_in *sockaddr_to_check = NULL; + + struct ifconf *ifc; + struct ifreq *ifr; + struct ifreq *ifr_next; + + socklen_t addr_len; + + (void)arg; + + sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in)); + + ifr = tor_malloc(sizeof(struct ifreq)); + memset(ifr,0,sizeof(struct ifreq)); + strlcpy(ifr->ifr_name,"lo",3); + sockaddr = (struct sockaddr_in *) &(ifr->ifr_ifru.ifru_addr); + sockaddr_in_from_string("127.0.0.1",sockaddr); + + ifc = tor_malloc(sizeof(struct ifconf)); + memset(ifc,0,sizeof(struct ifconf)); + ifc->ifc_len = sizeof(struct ifreq); + ifc->ifc_ifcu.ifcu_req = ifr; + + results = ifreq_to_smartlist(ifc->ifc_buf,ifc->ifc_len); + tt_int_op(smartlist_len(results),OP_EQ,1); + + tor_addr = smartlist_get(results, 0); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in)); + tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check)); + + ifr = tor_realloc(ifr,2*sizeof(struct ifreq)); + ifr_next = ifr+1; + strlcpy(ifr_next->ifr_name,"eth1",5); + ifc->ifc_len = 2*sizeof(struct ifreq); + ifc->ifc_ifcu.ifcu_req = ifr; + sockaddr = (struct sockaddr_in *) &(ifr->ifr_ifru.ifru_addr); + + sockaddr_eth1 = (struct sockaddr_in *) &(ifr_next->ifr_ifru.ifru_addr); + sockaddr_in_from_string("192.168.10.55",sockaddr_eth1); + SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); + smartlist_free(results); + + results = ifreq_to_smartlist(ifc->ifc_buf,ifc->ifc_len); + tt_int_op(smartlist_len(results),OP_EQ,2); + + tor_addr = smartlist_get(results, 0); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in)); + tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check)); + + tor_addr = smartlist_get(results, 1); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in)); + tt_assert(sockaddr_in_are_equal(sockaddr_eth1,sockaddr_to_check)); + + done: + tor_free(sockaddr_to_check); + SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); + smartlist_free(results); + tor_free(ifc); + tor_free(ifr); + return; +} + +static void +test_address_get_if_addrs_ioctl(void *arg) +{ + + smartlist_t *result = NULL; + + (void)arg; + + result = get_interface_addresses_ioctl(LOG_ERR, AF_INET); + + /* On an IPv6-only system, this will fail and return NULL + tt_assert(result); + */ + + /* Some FreeBSD jails don't have localhost IP address. Instead, they only + * have the address assigned to the jail (whatever that may be). + * And a jail without a network connection might not have any addresses at + * all. */ + if (result) { + tt_assert(!smartlist_contains_null_tor_addr(result)); + + /* If there are addresses, they must be IPv4 or IPv6. + * (AIX supports IPv6 from SIOCGIFCONF.) */ + if (smartlist_len(result) > 0) { + tt_assert(smartlist_contains_ipv4_tor_addr(result) + || smartlist_contains_ipv6_tor_addr(result)); + } + } + + done: + if (result) { + SMARTLIST_FOREACH(result, tor_addr_t *, t, tor_free(t)); + smartlist_free(result); + } + return; +} + +#endif /* defined(HAVE_IFCONF_TO_SMARTLIST) */ + +#define FAKE_SOCKET_FD (42) + +static tor_socket_t +fake_open_socket(int domain, int type, int protocol) +{ + (void)domain; + (void)type; + (void)protocol; + + return FAKE_SOCKET_FD; +} + +static int +fake_close_socket(tor_socket_t s) +{ + (void)s; + return 0; +} + +static int last_connected_socket_fd = 0; + +static int connect_retval = 0; + +static tor_socket_t +pretend_to_connect(tor_socket_t sock, const struct sockaddr *address, + socklen_t address_len) +{ + (void)address; + (void)address_len; + + last_connected_socket_fd = sock; + + return connect_retval; +} + +static struct sockaddr *mock_addr = NULL; + +static int +fake_getsockname(tor_socket_t sock, struct sockaddr *address, + socklen_t *address_len) +{ + socklen_t bytes_to_copy = 0; + (void) sock; + + if (!mock_addr) + return -1; + + if (mock_addr->sa_family == AF_INET) { + bytes_to_copy = sizeof(struct sockaddr_in); + } else if (mock_addr->sa_family == AF_INET6) { + bytes_to_copy = sizeof(struct sockaddr_in6); + } else { + return -1; + } + + if (*address_len < bytes_to_copy) { + return -1; + } + + memcpy(address,mock_addr,bytes_to_copy); + *address_len = bytes_to_copy; + + return 0; +} + +static void +test_address_udp_socket_trick_whitebox(void *arg) +{ + int hack_retval; + tor_addr_t *addr_from_hack = tor_malloc_zero(sizeof(tor_addr_t)); + struct sockaddr_in6 *mock_addr6; + struct sockaddr_in6 *ipv6_to_check = + tor_malloc_zero(sizeof(struct sockaddr_in6)); + + (void)arg; + + MOCK(tor_open_socket,fake_open_socket); + MOCK(tor_connect_socket,pretend_to_connect); + MOCK(tor_getsockname,fake_getsockname); + MOCK(tor_close_socket,fake_close_socket); + + mock_addr = tor_malloc_zero(sizeof(struct sockaddr_storage)); + sockaddr_in_from_string("23.32.246.118",(struct sockaddr_in *)mock_addr); + + hack_retval = + get_interface_address6_via_udp_socket_hack(LOG_DEBUG, + AF_INET, addr_from_hack); + + tt_int_op(hack_retval,OP_EQ,0); + tt_assert(tor_addr_eq_ipv4h(addr_from_hack, 0x1720f676)); + + /* Now, lets do an IPv6 case. */ + memset(mock_addr,0,sizeof(struct sockaddr_storage)); + + mock_addr6 = (struct sockaddr_in6 *)mock_addr; + mock_addr6->sin6_family = AF_INET6; + mock_addr6->sin6_port = 0; + tor_inet_pton(AF_INET6,"2001:cdba::3257:9652",&(mock_addr6->sin6_addr)); + + hack_retval = + get_interface_address6_via_udp_socket_hack(LOG_DEBUG, + AF_INET6, addr_from_hack); + + tt_int_op(hack_retval,OP_EQ,0); + + tor_addr_to_sockaddr(addr_from_hack,0,(struct sockaddr *)ipv6_to_check, + sizeof(struct sockaddr_in6)); + + tt_assert(sockaddr_in6_are_equal(mock_addr6,ipv6_to_check)); + + done: + UNMOCK(tor_open_socket); + UNMOCK(tor_connect_socket); + UNMOCK(tor_getsockname); + UNMOCK(tor_close_socket); + + tor_free(ipv6_to_check); + tor_free(mock_addr); + tor_free(addr_from_hack); + return; +} + +static void +test_address_udp_socket_trick_blackbox(void *arg) +{ + /* We want get_interface_address6_via_udp_socket_hack() to yield + * the same valid address that get_interface_address6() returns. + * If the latter is unable to find a valid address, we want + * _hack() to fail and return-1. + * + * Furthermore, we want _hack() never to crash, even if + * get_interface_addresses_raw() is returning NULL. + */ + + tor_addr_t addr4; + tor_addr_t addr4_to_check; + tor_addr_t addr6; + tor_addr_t addr6_to_check; + int retval, retval_reference; + + (void)arg; + +#if 0 + retval_reference = get_interface_address6(LOG_DEBUG,AF_INET,&addr4); + retval = get_interface_address6_via_udp_socket_hack(LOG_DEBUG, + AF_INET, + &addr4_to_check); + + tt_int_op(retval,OP_EQ,retval_reference); + tt_assert( (retval == -1 && retval_reference == -1) || + (tor_addr_compare(&addr4,&addr4_to_check,CMP_EXACT) == 0) ); + + retval_reference = get_interface_address6(LOG_DEBUG,AF_INET6,&addr6); + retval = get_interface_address6_via_udp_socket_hack(LOG_DEBUG, + AF_INET6, + &addr6_to_check); + + tt_int_op(retval,OP_EQ,retval_reference); + tt_assert( (retval == -1 && retval_reference == -1) || + (tor_addr_compare(&addr6,&addr6_to_check,CMP_EXACT) == 0) ); + +#else /* !(0) */ + /* Both of the blackbox test cases fail horribly if: + * * The host has no external addreses. + * * There are multiple interfaces with either AF_INET or AF_INET6. + * * The last address isn't the one associated with the default route. + * + * The tests SHOULD be re-enabled when #12377 is fixed correctly, but till + * then this fails a lot, in situations we expect failures due to knowing + * about the code being broken. + */ + + (void)addr4_to_check; + (void)addr6_to_check; + (void)addr6; + (void) retval_reference; +#endif /* 0 */ + + /* When family is neither AF_INET nor AF_INET6, we want _hack to + * fail and return -1. + */ + + retval = get_interface_address6_via_udp_socket_hack(LOG_DEBUG, + AF_INET+AF_INET6,&addr4); + + tt_int_op(retval, OP_EQ, -1); + + done: + return; +} + +static void +test_address_get_if_addrs_list_internal(void *arg) +{ + smartlist_t *results = NULL; + + (void)arg; + + results = get_interface_address_list(LOG_ERR, 1); + + tt_ptr_op(results, OP_NE, NULL); + /* When the network is down, a system might not have any non-local + * non-multicast addresseses, not even internal ones. + * Unit tests shouldn't fail because of this. */ + tt_int_op(smartlist_len(results),OP_GE,0); + + tt_assert(!smartlist_contains_localhost_tor_addr(results)); + tt_assert(!smartlist_contains_multicast_tor_addr(results)); + /* The list may or may not contain internal addresses */ + tt_assert(!smartlist_contains_null_tor_addr(results)); + + /* if there are any addresses, they must be IPv4 */ + if (smartlist_len(results) > 0) { + tt_assert(smartlist_contains_ipv4_tor_addr(results)); + } + tt_assert(!smartlist_contains_ipv6_tor_addr(results)); + + done: + interface_address_list_free(results); + return; +} + +static void +test_address_get_if_addrs_list_no_internal(void *arg) +{ + smartlist_t *results = NULL; + + (void)arg; + + results = get_interface_address_list(LOG_ERR, 0); + + tt_ptr_op(results, OP_NE, NULL); + /* Work even on systems with only internal IPv4 addresses */ + tt_int_op(smartlist_len(results),OP_GE,0); + + tt_assert(!smartlist_contains_localhost_tor_addr(results)); + tt_assert(!smartlist_contains_multicast_tor_addr(results)); + tt_assert(!smartlist_contains_internal_tor_addr(results)); + tt_assert(!smartlist_contains_null_tor_addr(results)); + + /* if there are any addresses, they must be IPv4 */ + if (smartlist_len(results) > 0) { + tt_assert(smartlist_contains_ipv4_tor_addr(results)); + } + tt_assert(!smartlist_contains_ipv6_tor_addr(results)); + + done: + interface_address_list_free(results); + return; +} + +static void +test_address_get_if_addrs6_list_internal(void *arg) +{ + smartlist_t *results = NULL; + + (void)arg; + + /* We might drop a log_err */ + setup_full_capture_of_logs(LOG_ERR); + results = get_interface_address6_list(LOG_ERR, AF_INET6, 1); + tt_int_op(smartlist_len(mock_saved_logs()), OP_LE, 1); + if (smartlist_len(mock_saved_logs()) == 1) { + expect_log_msg_containing_either4("connect() failed", + "unable to create socket", + "Address that we determined via UDP " + "socket magic is unsuitable for public " + "comms.", + "getsockname() to determine interface " + "failed"); + } + teardown_capture_of_logs(); + + tt_ptr_op(results, OP_NE, NULL); + /* Work even on systems without IPv6 interfaces */ + tt_int_op(smartlist_len(results),OP_GE,0); + + tt_assert(!smartlist_contains_localhost_tor_addr(results)); + tt_assert(!smartlist_contains_multicast_tor_addr(results)); + /* The list may or may not contain internal addresses */ + tt_assert(!smartlist_contains_null_tor_addr(results)); + + /* if there are any addresses, they must be IPv6 */ + tt_assert(!smartlist_contains_ipv4_tor_addr(results)); + if (smartlist_len(results) > 0) { + tt_assert(smartlist_contains_ipv6_tor_addr(results)); + } + + done: + interface_address6_list_free(results); + teardown_capture_of_logs(); + return; +} + +static void +test_address_get_if_addrs6_list_no_internal(void *arg) +{ + smartlist_t *results = NULL; + + (void)arg; + + /* We might drop a log_err */ + setup_full_capture_of_logs(LOG_ERR); + results = get_interface_address6_list(LOG_ERR, AF_INET6, 0); + tt_int_op(smartlist_len(mock_saved_logs()), OP_LE, 1); + if (smartlist_len(mock_saved_logs()) == 1) { + expect_log_msg_containing_either4("connect() failed", + "unable to create socket", + "Address that we determined via UDP " + "socket magic is unsuitable for public " + "comms.", + "getsockname() to determine interface " + "failed"); + } + teardown_capture_of_logs(); + + tt_ptr_op(results, OP_NE, NULL); + /* Work even on systems without IPv6 interfaces */ + tt_int_op(smartlist_len(results),OP_GE,0); + + tt_assert(!smartlist_contains_localhost_tor_addr(results)); + tt_assert(!smartlist_contains_multicast_tor_addr(results)); + tt_assert(!smartlist_contains_internal_tor_addr(results)); + tt_assert(!smartlist_contains_null_tor_addr(results)); + + /* if there are any addresses, they must be IPv6 */ + tt_assert(!smartlist_contains_ipv4_tor_addr(results)); + if (smartlist_len(results) > 0) { + tt_assert(smartlist_contains_ipv6_tor_addr(results)); + } + + done: + teardown_capture_of_logs(); + interface_address6_list_free(results); + return; +} + +static int called_get_interface_addresses_raw = 0; + +static smartlist_t * +mock_get_interface_addresses_raw_fail(int severity, sa_family_t family) +{ + (void)severity; + (void)family; + + called_get_interface_addresses_raw++; + return smartlist_new(); +} + +static int called_get_interface_address6_via_udp_socket_hack = 0; + +static int +mock_get_interface_address6_via_udp_socket_hack_fail(int severity, + sa_family_t family, + tor_addr_t *addr) +{ + (void)severity; + (void)family; + (void)addr; + + called_get_interface_address6_via_udp_socket_hack++; + return -1; +} + +static void +test_address_get_if_addrs_internal_fail(void *arg) +{ + smartlist_t *results1 = NULL, *results2 = NULL; + int rv = 0; + uint32_t ipv4h_addr = 0; + tor_addr_t ipv6_addr; + + memset(&ipv6_addr, 0, sizeof(tor_addr_t)); + + (void)arg; + + MOCK(get_interface_addresses_raw, + mock_get_interface_addresses_raw_fail); + MOCK(get_interface_address6_via_udp_socket_hack, + mock_get_interface_address6_via_udp_socket_hack_fail); + + results1 = get_interface_address6_list(LOG_ERR, AF_INET6, 1); + tt_ptr_op(results1, OP_NE, NULL); + tt_int_op(smartlist_len(results1),OP_EQ,0); + + results2 = get_interface_address_list(LOG_ERR, 1); + tt_ptr_op(results2, OP_NE, NULL); + tt_int_op(smartlist_len(results2),OP_EQ,0); + + rv = get_interface_address6(LOG_ERR, AF_INET6, &ipv6_addr); + tt_int_op(rv, OP_EQ, -1); + + rv = get_interface_address(LOG_ERR, &ipv4h_addr); + tt_int_op(rv, OP_EQ, -1); + + done: + UNMOCK(get_interface_addresses_raw); + UNMOCK(get_interface_address6_via_udp_socket_hack); + interface_address6_list_free(results1); + interface_address6_list_free(results2); + return; +} + +static void +test_address_get_if_addrs_no_internal_fail(void *arg) +{ + smartlist_t *results1 = NULL, *results2 = NULL; + + (void)arg; + + MOCK(get_interface_addresses_raw, + mock_get_interface_addresses_raw_fail); + MOCK(get_interface_address6_via_udp_socket_hack, + mock_get_interface_address6_via_udp_socket_hack_fail); + + results1 = get_interface_address6_list(LOG_ERR, AF_INET6, 0); + tt_ptr_op(results1, OP_NE, NULL); + tt_int_op(smartlist_len(results1),OP_EQ,0); + + results2 = get_interface_address_list(LOG_ERR, 0); + tt_ptr_op(results2, OP_NE, NULL); + tt_int_op(smartlist_len(results2),OP_EQ,0); + + done: + UNMOCK(get_interface_addresses_raw); + UNMOCK(get_interface_address6_via_udp_socket_hack); + interface_address6_list_free(results1); + interface_address6_list_free(results2); + return; +} + +static void +test_address_get_if_addrs(void *arg) +{ + int rv; + uint32_t addr_h = 0; + tor_addr_t tor_addr; + + (void)arg; + + rv = get_interface_address(LOG_ERR, &addr_h); + + /* When the network is down, a system might not have any non-local + * non-multicast IPv4 addresses, not even internal ones. + * Unit tests shouldn't fail because of this. */ + if (rv == 0) { + tor_addr_from_ipv4h(&tor_addr, addr_h); + + tt_assert(!tor_addr_is_loopback(&tor_addr)); + tt_assert(!tor_addr_is_multicast(&tor_addr)); + /* The address may or may not be an internal address */ + + tt_assert(tor_addr_is_v4(&tor_addr)); + } + + done: + return; +} + +static void +test_address_get_if_addrs6(void *arg) +{ + int rv; + tor_addr_t tor_addr; + + (void)arg; + + rv = get_interface_address6(LOG_ERR, AF_INET6, &tor_addr); + + /* Work even on systems without IPv6 interfaces */ + if (rv == 0) { + tt_assert(!tor_addr_is_loopback(&tor_addr)); + tt_assert(!tor_addr_is_multicast(&tor_addr)); + /* The address may or may not be an internal address */ + + tt_assert(!tor_addr_is_v4(&tor_addr)); + } + + done: + return; +} + +static void +test_address_tor_addr_to_in6(void *ignored) +{ + (void)ignored; + tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t)); + const struct in6_addr *res; + uint8_t expected[16] = {42, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15}; + + a->family = AF_INET; + res = tor_addr_to_in6(a); + tt_assert(!res); + + a->family = AF_INET6; + memcpy(a->addr.in6_addr.s6_addr, expected, 16); + res = tor_addr_to_in6(a); + tt_assert(res); + tt_mem_op(res->s6_addr, OP_EQ, expected, 16); + + done: + tor_free(a); +} + +static void +test_address_tor_addr_to_in(void *ignored) +{ + (void)ignored; + tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t)); + const struct in_addr *res; + + a->family = AF_INET6; + res = tor_addr_to_in(a); + tt_assert(!res); + + a->family = AF_INET; + a->addr.in_addr.s_addr = 44; + res = tor_addr_to_in(a); + tt_assert(res); + tt_int_op(res->s_addr, OP_EQ, 44); + + done: + tor_free(a); +} + +static void +test_address_tor_addr_to_ipv4n(void *ignored) +{ + (void)ignored; + tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t)); + uint32_t res; + + a->family = AF_INET6; + res = tor_addr_to_ipv4n(a); + tt_assert(!res); + + a->family = AF_INET; + a->addr.in_addr.s_addr = 43; + res = tor_addr_to_ipv4n(a); + tt_assert(res); + tt_int_op(res, OP_EQ, 43); + + done: + tor_free(a); +} + +static void +test_address_tor_addr_to_mapped_ipv4h(void *ignored) +{ + (void)ignored; + tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t)); + uint32_t res; + uint8_t toset[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 42}; + + a->family = AF_INET; + res = tor_addr_to_mapped_ipv4h(a); + tt_assert(!res); + + a->family = AF_INET6; + + memcpy(a->addr.in6_addr.s6_addr, toset, 16); + res = tor_addr_to_mapped_ipv4h(a); + tt_assert(res); + tt_int_op(res, OP_EQ, 42); + + done: + tor_free(a); +} + +static void +test_address_tor_addr_eq_ipv4h(void *ignored) +{ + (void)ignored; + tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t)); + int res; + + a->family = AF_INET6; + res = tor_addr_eq_ipv4h(a, 42); + tt_assert(!res); + + a->family = AF_INET; + a->addr.in_addr.s_addr = 52; + res = tor_addr_eq_ipv4h(a, 42); + tt_assert(!res); + + a->addr.in_addr.s_addr = 52; + res = tor_addr_eq_ipv4h(a, ntohl(52)); + tt_assert(res); + + done: + tor_free(a); +} + +#define ADDRESS_TEST(name, flags) \ + { #name, test_address_ ## name, flags, NULL, NULL } + +struct testcase_t address_tests[] = { + ADDRESS_TEST(udp_socket_trick_whitebox, TT_FORK), + ADDRESS_TEST(udp_socket_trick_blackbox, TT_FORK), + ADDRESS_TEST(get_if_addrs_list_internal, 0), + ADDRESS_TEST(get_if_addrs_list_no_internal, 0), + ADDRESS_TEST(get_if_addrs6_list_internal, 0), + ADDRESS_TEST(get_if_addrs6_list_no_internal, TT_FORK), + ADDRESS_TEST(get_if_addrs_internal_fail, 0), + ADDRESS_TEST(get_if_addrs_no_internal_fail, 0), + ADDRESS_TEST(get_if_addrs, 0), + ADDRESS_TEST(get_if_addrs6, 0), +#ifdef HAVE_IFADDRS_TO_SMARTLIST + ADDRESS_TEST(get_if_addrs_ifaddrs, TT_FORK), + ADDRESS_TEST(ifaddrs_to_smartlist, 0), +#endif +#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST + ADDRESS_TEST(get_if_addrs_win32, TT_FORK), + ADDRESS_TEST(ip_adapter_addresses_to_smartlist, 0), +#endif +#ifdef HAVE_IFCONF_TO_SMARTLIST + ADDRESS_TEST(get_if_addrs_ioctl, TT_FORK), + ADDRESS_TEST(ifreq_to_smartlist, 0), +#endif + ADDRESS_TEST(tor_addr_to_in6, 0), + ADDRESS_TEST(tor_addr_to_in, 0), + ADDRESS_TEST(tor_addr_to_ipv4n, 0), + ADDRESS_TEST(tor_addr_to_mapped_ipv4h, 0), + ADDRESS_TEST(tor_addr_eq_ipv4h, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_bt.sh b/src/wraith/src/test/test_bt.sh new file mode 100644 index 000000000..312905a4e --- /dev/null +++ b/src/wraith/src/test/test_bt.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# Test backtrace functionality. + +exitcode=0 + +export ASAN_OPTIONS="handle_segv=0:allow_user_segv_handler=1" +"${builddir:-.}/src/test/test-bt-cl" backtraces || exit $? +"${builddir:-.}/src/test/test-bt-cl" assert 2>&1 | "${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/bt_test.py" || exitcode="$?" +"${builddir:-.}/src/test/test-bt-cl" crash 2>&1 | "${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/bt_test.py" || exitcode="$?" + +"${builddir:-.}/src/test/test-bt-cl" none || exitcode="$?" + +exit ${exitcode} diff --git a/src/wraith/src/test/test_bt_cl.c b/src/wraith/src/test/test_bt_cl.c new file mode 100644 index 000000000..b5c8d7cf9 --- /dev/null +++ b/src/wraith/src/test/test_bt_cl.c @@ -0,0 +1,121 @@ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include +#include + +/* To prevent 'assert' from going away. */ +#undef TOR_COVERAGE +#include "or.h" +#include "util.h" +#include "backtrace.h" +#include "torlog.h" + +/* -1: no crash. + * 0: crash with a segmentation fault. + * 1x: crash with an assertion failure. */ +static int crashtype = 0; + +#ifdef __GNUC__ +#define NOINLINE __attribute__((noinline)) +#endif + +int crash(int x) NOINLINE; +int oh_what(int x) NOINLINE; +int a_tangled_web(int x) NOINLINE; +int we_weave(int x) NOINLINE; + +#ifdef HAVE_CFLAG_WNULL_DEREFERENCE +DISABLE_GCC_WARNING(null-dereference) +#endif +int +crash(int x) +{ + if (crashtype == 0) { +#if defined(__clang_analyzer__) || defined(__COVERITY__) + tor_assert(1 == 0); /* Avert your eyes, clangalyzer and coverity! You + * don't need to see us dereference NULL. */ +#else + *(volatile int *)0 = 0; +#endif /* defined(__clang_analyzer__) || defined(__COVERITY__) */ + } else if (crashtype == 1) { + tor_assert(1 == 0); + } else if (crashtype == -1) { + ; + } + + crashtype *= x; + return crashtype; +} +#ifdef HAVE_CFLAG_WNULL_DEREFERENCE +ENABLE_GCC_WARNING(null-dereference) +#endif + +int +oh_what(int x) +{ + /* We call crash() twice here, so that the compiler won't try to do a + * tail-call optimization. Only the first call will actually happen, but + * telling the compiler to maybe do the second call will prevent it from + * replacing the first call with a jump. */ + return crash(x) + crash(x*2); +} + +int +a_tangled_web(int x) +{ + return oh_what(x) * 99 + oh_what(x); +} + +int +we_weave(int x) +{ + return a_tangled_web(x) + a_tangled_web(x+1); +} + +int +main(int argc, char **argv) +{ + log_severity_list_t severity; + + if (argc < 2) { + puts("I take an argument. It should be \"assert\" or \"crash\" or " + "\"backtraces\" or \"none\""); + return 1; + } + +#if !(defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \ + defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION)) + puts("Backtrace reporting is not supported on this platform"); + return 77; +#endif + + if (!strcmp(argv[1], "assert")) { + crashtype = 1; + } else if (!strcmp(argv[1], "crash")) { + crashtype = 0; + } else if (!strcmp(argv[1], "none")) { + crashtype = -1; + } else if (!strcmp(argv[1], "backtraces")) { + return 0; + } else { + puts("Argument should be \"assert\" or \"crash\" or \"none\""); + return 1; + } + + init_logging(1); + set_log_severity_config(LOG_WARN, LOG_ERR, &severity); + add_stream_log(&severity, "stdout", STDOUT_FILENO); + tor_log_update_sigsafe_err_fds(); + + configure_backtrace_handler(NULL); + + printf("%d\n", we_weave(2)); + + clean_up_backtrace_handler(); + logs_free_all(); + + return 0; +} + diff --git a/src/wraith/src/test/test_buffers.c b/src/wraith/src/test/test_buffers.c new file mode 100644 index 000000000..057d9fa2d --- /dev/null +++ b/src/wraith/src/test/test_buffers.c @@ -0,0 +1,821 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define BUFFERS_PRIVATE +#define PROTO_HTTP_PRIVATE +#include "or.h" +#include "buffers.h" +#include "buffers_tls.h" +#include "proto_http.h" +#include "proto_socks.h" +#include "test.h" + +/** Run unit tests for buffers.c */ +static void +test_buffers_basic(void *arg) +{ + char str[256]; + char str2[256]; + + buf_t *buf = NULL, *buf2 = NULL; + const char *cp; + + int j; + size_t r; + (void) arg; + + /**** + * buf_new + ****/ + if (!(buf = buf_new())) + TT_DIE(("Assertion failed.")); + + //test_eq(buf_capacity(buf), 4096); + tt_int_op(buf_datalen(buf),OP_EQ, 0); + + /**** + * General pointer frobbing + */ + for (j=0;j<256;++j) { + str[j] = (char)j; + } + buf_add(buf, str, 256); + buf_add(buf, str, 256); + tt_int_op(buf_datalen(buf),OP_EQ, 512); + buf_get_bytes(buf, str2, 200); + tt_mem_op(str,OP_EQ, str2, 200); + tt_int_op(buf_datalen(buf),OP_EQ, 312); + memset(str2, 0, sizeof(str2)); + + buf_get_bytes(buf, str2, 256); + tt_mem_op(str+200,OP_EQ, str2, 56); + tt_mem_op(str,OP_EQ, str2+56, 200); + tt_int_op(buf_datalen(buf),OP_EQ, 56); + memset(str2, 0, sizeof(str2)); + /* Okay, now we should be 512 bytes into the 4096-byte buffer. If we add + * another 3584 bytes, we hit the end. */ + for (j=0;j<15;++j) { + buf_add(buf, str, 256); + } + buf_assert_ok(buf); + tt_int_op(buf_datalen(buf),OP_EQ, 3896); + buf_get_bytes(buf, str2, 56); + tt_int_op(buf_datalen(buf),OP_EQ, 3840); + tt_mem_op(str+200,OP_EQ, str2, 56); + for (j=0;j<15;++j) { + memset(str2, 0, sizeof(str2)); + buf_get_bytes(buf, str2, 256); + tt_mem_op(str,OP_EQ, str2, 256); + } + tt_int_op(buf_datalen(buf),OP_EQ, 0); + buf_free(buf); + buf = NULL; + + /* Okay, now make sure growing can work. */ + buf = buf_new_with_capacity(16); + //test_eq(buf_capacity(buf), 16); + buf_add(buf, str+1, 255); + //test_eq(buf_capacity(buf), 256); + buf_get_bytes(buf, str2, 254); + tt_mem_op(str+1,OP_EQ, str2, 254); + //test_eq(buf_capacity(buf), 256); + buf_assert_ok(buf); + buf_add(buf, str, 32); + //test_eq(buf_capacity(buf), 256); + buf_assert_ok(buf); + buf_add(buf, str, 256); + buf_assert_ok(buf); + //test_eq(buf_capacity(buf), 512); + tt_int_op(buf_datalen(buf),OP_EQ, 33+256); + buf_get_bytes(buf, str2, 33); + tt_int_op(*str2,OP_EQ, str[255]); + + tt_mem_op(str2+1,OP_EQ, str, 32); + //test_eq(buf_capacity(buf), 512); + tt_int_op(buf_datalen(buf),OP_EQ, 256); + buf_get_bytes(buf, str2, 256); + tt_mem_op(str,OP_EQ, str2, 256); + + /* now try shrinking: case 1. */ + buf_free(buf); + buf = buf_new_with_capacity(33668); + for (j=0;j<67;++j) { + buf_add(buf, str,255); + } + //test_eq(buf_capacity(buf), 33668); + tt_int_op(buf_datalen(buf),OP_EQ, 17085); + for (j=0; j < 40; ++j) { + buf_get_bytes(buf, str2, 255); + tt_mem_op(str2,OP_EQ, str, 255); + } + + /* now try shrinking: case 2. */ + buf_free(buf); + buf = buf_new_with_capacity(33668); + for (j=0;j<67;++j) { + buf_add(buf, str, 255); + } + for (j=0; j < 20; ++j) { + buf_get_bytes(buf, str2, 255); + tt_mem_op(str2,OP_EQ, str, 255); + } + for (j=0;j<80;++j) { + buf_add(buf, str, 255); + } + //test_eq(buf_capacity(buf),33668); + for (j=0; j < 120; ++j) { + buf_get_bytes(buf, str2, 255); + tt_mem_op(str2,OP_EQ, str, 255); + } + + /* Move from buf to buf. */ + buf_free(buf); + buf = buf_new_with_capacity(4096); + buf2 = buf_new_with_capacity(4096); + for (j=0;j<100;++j) + buf_add(buf, str, 255); + tt_int_op(buf_datalen(buf),OP_EQ, 25500); + for (j=0;j<100;++j) { + r = 10; + buf_move_to_buf(buf2, buf, &r); + tt_int_op(r,OP_EQ, 0); + } + tt_int_op(buf_datalen(buf),OP_EQ, 24500); + tt_int_op(buf_datalen(buf2),OP_EQ, 1000); + for (j=0;j<3;++j) { + buf_get_bytes(buf2, str2, 255); + tt_mem_op(str2,OP_EQ, str, 255); + } + r = 8192; /*big move*/ + buf_move_to_buf(buf2, buf, &r); + tt_int_op(r,OP_EQ, 0); + r = 30000; /* incomplete move */ + buf_move_to_buf(buf2, buf, &r); + tt_int_op(r,OP_EQ, 13692); + for (j=0;j<97;++j) { + buf_get_bytes(buf2, str2, 255); + tt_mem_op(str2,OP_EQ, str, 255); + } + buf_free(buf); + buf_free(buf2); + buf = buf2 = NULL; + + buf = buf_new_with_capacity(5); + cp = "Testing. This is a moderately long Testing string."; + for (j = 0; cp[j]; j++) + buf_add(buf, cp+j, 1); + tt_int_op(0,OP_EQ, buf_find_string_offset(buf, "Testing", 7)); + tt_int_op(1,OP_EQ, buf_find_string_offset(buf, "esting", 6)); + tt_int_op(1,OP_EQ, buf_find_string_offset(buf, "est", 3)); + tt_int_op(39,OP_EQ, buf_find_string_offset(buf, "ing str", 7)); + tt_int_op(35,OP_EQ, buf_find_string_offset(buf, "Testing str", 11)); + tt_int_op(32,OP_EQ, buf_find_string_offset(buf, "ng ", 3)); + tt_int_op(43,OP_EQ, buf_find_string_offset(buf, "string.", 7)); + tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "shrdlu", 6)); + tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "Testing thing", 13)); + tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "ngx", 3)); + buf_free(buf); + buf = NULL; + + /* Try adding a string too long for any freelist. */ + { + char *mem = tor_malloc_zero(65536); + buf = buf_new(); + buf_add(buf, mem, 65536); + tor_free(mem); + + tt_int_op(buf_datalen(buf), OP_EQ, 65536); + buf_free(buf); + buf = NULL; + } + + done: + if (buf) + buf_free(buf); + if (buf2) + buf_free(buf2); +} + +static void +test_buffer_pullup(void *arg) +{ + buf_t *buf; + char *stuff, *tmp; + const char *cp; + size_t sz; + (void)arg; + stuff = tor_malloc(16384); + tmp = tor_malloc(16384); + + buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */ + + tt_assert(buf); + tt_int_op(buf_get_default_chunk_size(buf), OP_EQ, 4096); + + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); + + /* There are a bunch of cases for pullup. One is the trivial case. Let's + mess around with an empty buffer. */ + buf_pullup(buf, 16, &cp, &sz); + tt_ptr_op(cp, OP_EQ, NULL); + tt_uint_op(sz, OP_EQ, 0); + + /* Let's make sure nothing got allocated */ + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); + + /* Case 1: everything puts into the first chunk with some moving. */ + + /* Let's add some data. */ + crypto_rand(stuff, 16384); + buf_add(buf, stuff, 3000); + buf_add(buf, stuff+3000, 3000); + buf_pullup(buf, 0, &cp, &sz); + tt_ptr_op(cp, OP_NE, NULL); + tt_int_op(sz, OP_LE, 4096); + + /* Make room for 3000 bytes in the first chunk, so that the pullup-move code + * can get tested. */ + tt_int_op(buf_get_bytes(buf, tmp, 3000), OP_EQ, 3000); + tt_mem_op(tmp,OP_EQ, stuff, 3000); + buf_pullup(buf, 2048, &cp, &sz); + buf_assert_ok(buf); + tt_ptr_op(cp, OP_NE, NULL); + tt_int_op(sz, OP_GE, 2048); + tt_mem_op(cp,OP_EQ, stuff+3000, 2048); + tt_int_op(3000, OP_EQ, buf_datalen(buf)); + tt_int_op(buf_get_bytes(buf, tmp, 3000), OP_EQ, 0); + tt_mem_op(tmp,OP_EQ, stuff+3000, 2048); + + buf_free(buf); + + /* Now try the large-chunk case. */ + buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */ + buf_add(buf, stuff, 4000); + buf_add(buf, stuff+4000, 4000); + buf_add(buf, stuff+8000, 4000); + buf_add(buf, stuff+12000, 4000); + tt_int_op(buf_datalen(buf), OP_EQ, 16000); + buf_pullup(buf, 0, &cp, &sz); + tt_ptr_op(cp, OP_NE, NULL); + tt_int_op(sz, OP_LE, 4096); + + buf_pullup(buf, 12500, &cp, &sz); + buf_assert_ok(buf); + tt_ptr_op(cp, OP_NE, NULL); + tt_int_op(sz, OP_GE, 12500); + tt_mem_op(cp,OP_EQ, stuff, 12500); + tt_int_op(buf_datalen(buf), OP_EQ, 16000); + + buf_get_bytes(buf, tmp, 12400); + tt_mem_op(tmp,OP_EQ, stuff, 12400); + tt_int_op(buf_datalen(buf), OP_EQ, 3600); + buf_get_bytes(buf, tmp, 3500); + tt_mem_op(tmp,OP_EQ, stuff+12400, 3500); + buf_get_bytes(buf, tmp, 100); + tt_mem_op(tmp,OP_EQ, stuff+15900, 10); + + buf_free(buf); + + /* Make sure that the pull-up-whole-buffer case works */ + buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */ + buf_add(buf, stuff, 4000); + buf_add(buf, stuff+4000, 4000); + buf_get_bytes(buf, tmp, 100); /* dump 100 bytes from first chunk */ + buf_pullup(buf, 16000, &cp, &sz); + buf_assert_ok(buf); + tt_ptr_op(cp, OP_NE, NULL); + tt_int_op(sz, OP_EQ, 7900); + tt_mem_op(cp,OP_EQ, stuff+100, 7900); + + buf_free(buf); + buf = NULL; + + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); + done: + buf_free(buf); + tor_free(stuff); + tor_free(tmp); +} + +static void +test_buffer_copy(void *arg) +{ + buf_t *buf=NULL, *buf2=NULL; + const char *s; + size_t len; + char b[256]; + int i; + (void)arg; + + buf = buf_new(); + tt_assert(buf); + + /* Copy an empty buffer. */ + tt_int_op(0, OP_EQ, buf_set_to_copy(&buf2, buf)); + tt_assert(buf2); + tt_int_op(0, OP_EQ, buf_datalen(buf2)); + + /* Now try with a short buffer. */ + s = "And now comes an act of enormous enormance!"; + len = strlen(s); + buf_add(buf, s, len); + tt_int_op(len, OP_EQ, buf_datalen(buf)); + /* Add junk to buf2 so we can test replacing.*/ + buf_add(buf2, "BLARG", 5); + tt_int_op(0, OP_EQ, buf_set_to_copy(&buf2, buf)); + tt_int_op(len, OP_EQ, buf_datalen(buf2)); + buf_get_bytes(buf2, b, len); + tt_mem_op(b, OP_EQ, s, len); + /* Now free buf2 and retry so we can test allocating */ + buf_free(buf2); + buf2 = NULL; + tt_int_op(0, OP_EQ, buf_set_to_copy(&buf2, buf)); + tt_int_op(len, OP_EQ, buf_datalen(buf2)); + buf_get_bytes(buf2, b, len); + tt_mem_op(b, OP_EQ, s, len); + /* Clear buf for next test */ + buf_get_bytes(buf, b, len); + tt_int_op(buf_datalen(buf),OP_EQ,0); + + /* Okay, now let's try a bigger buffer. */ + s = "Quis autem vel eum iure reprehenderit qui in ea voluptate velit " + "esse quam nihil molestiae consequatur, vel illum qui dolorem eum " + "fugiat quo voluptas nulla pariatur?"; + len = strlen(s); + for (i = 0; i < 256; ++i) { + b[0]=i; + buf_add(buf, b, 1); + buf_add(buf, s, len); + } + tt_int_op(0, OP_EQ, buf_set_to_copy(&buf2, buf)); + tt_int_op(buf_datalen(buf2), OP_EQ, buf_datalen(buf)); + for (i = 0; i < 256; ++i) { + buf_get_bytes(buf2, b, len+1); + tt_int_op((unsigned char)b[0],OP_EQ,i); + tt_mem_op(b+1, OP_EQ, s, len); + } + + done: + if (buf) + buf_free(buf); + if (buf2) + buf_free(buf2); +} + +static void +test_buffer_allocation_tracking(void *arg) +{ + char *junk = tor_malloc(16384); + buf_t *buf1 = NULL, *buf2 = NULL; + int i; + + (void)arg; + + crypto_rand(junk, 16384); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); + + buf1 = buf_new(); + tt_assert(buf1); + buf2 = buf_new(); + tt_assert(buf2); + + tt_int_op(buf_allocation(buf1), OP_EQ, 0); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); + + buf_add(buf1, junk, 4000); + buf_add(buf1, junk, 4000); + buf_add(buf1, junk, 4000); + buf_add(buf1, junk, 4000); + tt_int_op(buf_allocation(buf1), OP_EQ, 16384); + buf_get_bytes(buf1, junk, 100); + tt_int_op(buf_allocation(buf1), OP_EQ, 16384); /* still 4 4k chunks */ + + tt_int_op(buf_get_total_allocation(), OP_EQ, 16384); + + buf_get_bytes(buf1, junk, 4096); /* drop a 1k chunk... */ + tt_int_op(buf_allocation(buf1), OP_EQ, 3*4096); /* now 3 4k chunks */ + + tt_int_op(buf_get_total_allocation(), OP_EQ, 12288); /* that chunk was really + freed. */ + + buf_add(buf2, junk, 4000); + tt_int_op(buf_allocation(buf2), OP_EQ, 4096); /* another 4k chunk. */ + /* + * We bounce back up to 16384 by allocating a new chunk. + */ + tt_int_op(buf_get_total_allocation(), OP_EQ, 16384); + buf_add(buf2, junk, 4000); + tt_int_op(buf_allocation(buf2), OP_EQ, 8192); /* another 4k chunk. */ + tt_int_op(buf_get_total_allocation(), + OP_EQ, 5*4096); /* that chunk was new. */ + + /* Make a really huge buffer */ + for (i = 0; i < 1000; ++i) { + buf_add(buf2, junk, 4000); + } + tt_int_op(buf_allocation(buf2), OP_GE, 4008000); + tt_int_op(buf_get_total_allocation(), OP_GE, 4008000); + buf_free(buf2); + buf2 = NULL; + + tt_int_op(buf_get_total_allocation(), OP_LT, 4008000); + tt_int_op(buf_get_total_allocation(), OP_EQ, buf_allocation(buf1)); + buf_free(buf1); + buf1 = NULL; + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); + + done: + buf_free(buf1); + buf_free(buf2); + tor_free(junk); +} + +static void +test_buffer_time_tracking(void *arg) +{ + buf_t *buf=NULL, *buf2=NULL; + const time_t START = 1389288246; + const uint64_t START_NSEC = ((uint64_t)START) * 1000000000; + int i; + char tmp[4096]; + (void)arg; + + crypto_rand(tmp, sizeof(tmp)); + + monotime_enable_test_mocking(); + + buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */ + tt_assert(buf); + + monotime_coarse_set_mock_time_nsec(START_NSEC); + const uint32_t START_TS = monotime_coarse_get_stamp(); + + /* Empty buffer means the timestamp is 0. */ + tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_TS)); + tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_TS+1000)); + + buf_add(buf, "ABCDEFG", 7); + tt_int_op(1000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_TS+1000)); + + buf2 = buf_copy(buf); + tt_assert(buf2); + tt_int_op(1234, OP_EQ, + buf_get_oldest_chunk_timestamp(buf2, START_TS+1234)); + + /* Now add more bytes; enough to overflow the first chunk. */ + monotime_coarse_set_mock_time_nsec(START_NSEC + 123 * (uint64_t)1000000); + const uint32_t TS2 = monotime_coarse_get_stamp(); + for (i = 0; i < 600; ++i) + buf_add(buf, "ABCDEFG", 7); + tt_int_op(4207, OP_EQ, buf_datalen(buf)); + + /* The oldest bytes are still in the front. */ + tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_TS+2000)); + + /* Once those bytes are dropped, the chunk is still on the first + * timestamp. */ + buf_get_bytes(buf, tmp, 100); + tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_TS+2000)); + + /* But once we discard the whole first chunk, we get the data in the second + * chunk. */ + buf_get_bytes(buf, tmp, 4000); + tt_int_op(107, OP_EQ, buf_datalen(buf)); + tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, TS2+2000)); + + /* This time we'll be grabbing a chunk from the freelist, and making sure + its time gets updated */ + monotime_coarse_set_mock_time_nsec(START_NSEC + 5617 * (uint64_t)1000000); + const uint32_t TS3 = monotime_coarse_get_stamp(); + for (i = 0; i < 600; ++i) + buf_add(buf, "ABCDEFG", 7); + tt_int_op(4307, OP_EQ, buf_datalen(buf)); + + tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, TS2+2000)); + buf_get_bytes(buf, tmp, 4000); + buf_get_bytes(buf, tmp, 306); + tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, TS3)); + tt_int_op(383, OP_EQ, buf_get_oldest_chunk_timestamp(buf, TS3+383)); + + done: + buf_free(buf); + buf_free(buf2); + monotime_disable_test_mocking(); +} + +static void +test_buffers_compress_fin_at_chunk_end_impl(compress_method_t method, + compression_level_t level) +{ + char *msg = NULL; + char *contents = NULL; + char *expanded = NULL; + buf_t *buf = NULL; + tor_compress_state_t *compress_state = NULL; + size_t out_len, in_len; + size_t sz, headerjunk; + + buf = buf_new_with_capacity(128); /* will round up */ + sz = buf_get_default_chunk_size(buf); + msg = tor_malloc_zero(sz); + + buf_add(buf, msg, 1); + tt_assert(buf->head); + + /* Fill up the chunk so the compression stuff won't fit in one chunk. */ + tt_uint_op(buf->head->memlen, OP_LT, sz); + headerjunk = buf->head->memlen - 7; + buf_add(buf, msg, headerjunk-1); + tt_uint_op(buf->head->datalen, OP_EQ, headerjunk); + tt_uint_op(buf_datalen(buf), OP_EQ, headerjunk); + /* Write an empty string, with finalization on. */ + compress_state = tor_compress_new(1, method, level); + tt_int_op(buf_add_compress(buf, compress_state, "", 0, 1), OP_EQ, 0); + + in_len = buf_datalen(buf); + contents = tor_malloc(in_len); + + tt_int_op(buf_get_bytes(buf, contents, in_len), OP_EQ, 0); + + if (method == NO_METHOD) { + tt_uint_op(in_len, OP_EQ, headerjunk); + } else { + tt_uint_op(in_len, OP_GT, headerjunk); + } + + tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len, + contents + headerjunk, + in_len - headerjunk, + method, 1, + LOG_WARN)); + + tt_int_op(out_len, OP_EQ, 0); + tt_assert(expanded); + + done: + buf_free(buf); + tor_compress_free(compress_state); + tor_free(contents); + tor_free(expanded); + tor_free(msg); +} + +static void +test_buffers_compress_impl(compress_method_t method, + compression_level_t level, + int finalize_with_nil) +{ + char *msg = NULL; + char *contents = NULL; + char *expanded = NULL; + buf_t *buf = NULL; + tor_compress_state_t *compress_state = NULL; + size_t out_len, in_len; + int done; + + buf = buf_new_with_capacity(128); /* will round up */ + compress_state = tor_compress_new(1, method, level); + + msg = tor_malloc(512); + crypto_rand(msg, 512); + tt_int_op(buf_add_compress(buf, compress_state, + msg, 128, 0), OP_EQ, 0); + tt_int_op(buf_add_compress(buf, compress_state, + msg+128, 128, 0), OP_EQ, 0); + tt_int_op(buf_add_compress(buf, compress_state, + msg+256, 256, 0), OP_EQ, 0); + done = !finalize_with_nil; + tt_int_op(buf_add_compress(buf, compress_state, + "all done", 9, done), OP_EQ, 0); + if (finalize_with_nil) { + tt_int_op(buf_add_compress(buf, compress_state, "", 0, 1), OP_EQ, 0); + } + + in_len = buf_datalen(buf); + contents = tor_malloc(in_len); + + tt_int_op(buf_get_bytes(buf, contents, in_len), OP_EQ, 0); + + tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len, + contents, in_len, + method, 1, + LOG_WARN)); + + tt_int_op(out_len, OP_GE, 128); + tt_mem_op(msg, OP_EQ, expanded, 128); + tt_int_op(out_len, OP_GE, 512); + tt_mem_op(msg, OP_EQ, expanded, 512); + tt_int_op(out_len, OP_EQ, 512+9); + tt_mem_op("all done", OP_EQ, expanded+512, 9); + + done: + buf_free(buf); + tor_compress_free(compress_state); + tor_free(contents); + tor_free(expanded); + tor_free(msg); +} + +static void +test_buffers_compress(void *arg) +{ + const char *methodname = arg; + tt_assert(methodname); + + compress_method_t method = compression_method_get_by_name(methodname); + tt_int_op(method, OP_NE, UNKNOWN_METHOD); + + if (! tor_compress_supports_method(method)) { + tt_skip(); + } + + compression_level_t levels[] = { + BEST_COMPRESSION, + HIGH_COMPRESSION, + MEDIUM_COMPRESSION, + LOW_COMPRESSION + }; + + for (unsigned l = 0; l < ARRAY_LENGTH(levels); ++l) { + compression_level_t level = levels[l]; + + test_buffers_compress_impl(method, level, 0); + test_buffers_compress_impl(method, level, 1); + test_buffers_compress_fin_at_chunk_end_impl(method, level); + } + + done: + ; +} + +static const uint8_t *tls_read_ptr; +static int n_remaining; +static int next_reply_val[16]; + +static int +mock_tls_read(tor_tls_t *tls, char *cp, size_t len) +{ + (void)tls; + int rv = next_reply_val[0]; + if (rv > 0) { + int max = rv > (int)len ? (int)len : rv; + if (max > n_remaining) + max = n_remaining; + memcpy(cp, tls_read_ptr, max); + rv = max; + n_remaining -= max; + tls_read_ptr += max; + } + + memmove(next_reply_val, next_reply_val + 1, 15*sizeof(int)); + return rv; +} + +static void +test_buffers_tls_read_mocked(void *arg) +{ + uint8_t *mem; + buf_t *buf; + (void)arg; + + mem = tor_malloc(64*1024); + crypto_rand((char*)mem, 64*1024); + tls_read_ptr = mem; + n_remaining = 64*1024; + + MOCK(tor_tls_read, mock_tls_read); + + buf = buf_new(); + + next_reply_val[0] = 1024; + tt_int_op(128, OP_EQ, buf_read_from_tls(buf, NULL, 128)); + + next_reply_val[0] = 5000; + next_reply_val[1] = 5000; + tt_int_op(6000, OP_EQ, buf_read_from_tls(buf, NULL, 6000)); + + done: + UNMOCK(tor_tls_read); + tor_free(mem); + buf_free(buf); +} + +static void +test_buffers_chunk_size(void *arg) +{ + (void)arg; + const int min = 256; + const int max = 65536; + tt_uint_op(buf_preferred_chunk_size(3), OP_EQ, min); + tt_uint_op(buf_preferred_chunk_size(25), OP_EQ, min); + tt_uint_op(buf_preferred_chunk_size(0), OP_EQ, min); + tt_uint_op(buf_preferred_chunk_size(256), OP_EQ, 512); + tt_uint_op(buf_preferred_chunk_size(65400), OP_EQ, max); + /* Here, we're implicitly saying that the chunk header overhead is + * between 1 and 100 bytes. 24..48 would probably be more accurate. */ + tt_uint_op(buf_preferred_chunk_size(65536), OP_GT, 65536); + tt_uint_op(buf_preferred_chunk_size(65536), OP_LT, 65536+100); + tt_uint_op(buf_preferred_chunk_size(165536), OP_GT, 165536); + tt_uint_op(buf_preferred_chunk_size(165536), OP_LT, 165536+100); + done: + ; +} + +static void +test_buffers_find_contentlen(void *arg) +{ + static const struct { + const char *headers; + int r; + int contentlen; + } results[] = { + { "Blah blah\r\nContent-Length: 1\r\n\r\n", 1, 1 }, + { "Blah blah\r\n\r\n", 0, 0 }, /* no content-len */ + { "Blah blah Content-Length: 1\r\n", 0, 0 }, /* no content-len. */ + { "Blah blah\r\nContent-Length: 100000\r\n", 1, 100000}, + { "Blah blah\r\nContent-Length: 1000000000000000000000000\r\n", -1, 0}, + { "Blah blah\r\nContent-Length: 0\r\n", 1, 0}, + { "Blah blah\r\nContent-Length: -1\r\n", -1, 0}, + { "Blah blah\r\nContent-Length: 1x\r\n", -1, 0}, + { "Blah blah\r\nContent-Length: 1 x\r\n", -1, 0}, + { "Blah blah\r\nContent-Length: 1 \r\n", 1, 1}, + { "Blah blah\r\nContent-Length: \r\n", -1, 0}, + { "Blah blah\r\nContent-Length: ", -1, 0}, + { "Blah blah\r\nContent-Length: 5050", -1, 0}, + { NULL, 0, 0 } + }; + int i; + + (void)arg; + + for (i = 0; results[i].headers; ++i) { + int r; + size_t sz; + size_t headerlen = strlen(results[i].headers); + char * tmp = tor_memdup(results[i].headers, headerlen);/* ensure no eos */ + sz = 999; /* to ensure it gets set */ + r = buf_http_find_content_length(tmp, headerlen, &sz); + tor_free(tmp); + log_debug(LD_DIR, "%d: %s", i, escaped(results[i].headers)); + tt_int_op(r, OP_EQ, results[i].r); + tt_int_op(sz, OP_EQ, results[i].contentlen); + } + done: + ; +} + +static void +test_buffer_peek_startswith(void *arg) +{ + (void)arg; + buf_t *buf; + buf = buf_new(); + tt_ptr_op(buf, OP_NE, NULL); + + tt_assert(buf_peek_startswith(buf, "")); + tt_assert(! buf_peek_startswith(buf, "X")); + + buf_add(buf, "Tor", 3); + + tt_assert(buf_peek_startswith(buf, "")); + tt_assert(buf_peek_startswith(buf, "T")); + tt_assert(buf_peek_startswith(buf, "To")); + tt_assert(buf_peek_startswith(buf, "Tor")); + tt_assert(! buf_peek_startswith(buf, "Top")); + tt_assert(! buf_peek_startswith(buf, "For")); + tt_assert(! buf_peek_startswith(buf, "Tork")); + tt_assert(! buf_peek_startswith(buf, "Torpor")); + + done: + buf_free(buf); +} + +struct testcase_t buffer_tests[] = { + { "basic", test_buffers_basic, TT_FORK, NULL, NULL }, + { "copy", test_buffer_copy, TT_FORK, NULL, NULL }, + { "pullup", test_buffer_pullup, TT_FORK, NULL, NULL }, + { "startswith", test_buffer_peek_startswith, 0, NULL, NULL }, + { "allocation_tracking", test_buffer_allocation_tracking, TT_FORK, + NULL, NULL }, + { "time_tracking", test_buffer_time_tracking, TT_FORK, NULL, NULL }, + { "tls_read_mocked", test_buffers_tls_read_mocked, 0, + NULL, NULL }, + { "chunk_size", test_buffers_chunk_size, 0, NULL, NULL }, + { "find_contentlen", test_buffers_find_contentlen, 0, NULL, NULL }, + + { "compress/zlib", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"deflate" }, + { "compress/gzip", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"gzip" }, + { "compress/zstd", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"x-zstd" }, + { "compress/lzma", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"x-tor-lzma" }, + { "compress/none", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"identity" }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_cell_formats.c b/src/wraith/src/test/test_cell_formats.c new file mode 100644 index 000000000..007f7e3d3 --- /dev/null +++ b/src/wraith/src/test/test_cell_formats.c @@ -0,0 +1,1299 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define CONNECTION_EDGE_PRIVATE +#define RELAY_PRIVATE +#include "or.h" +#include "channel.h" +#include "connection_edge.h" +#include "connection_or.h" +#include "config.h" +#include "onion.h" +#include "onion_tap.h" +#include "onion_fast.h" +#include "onion_ntor.h" +#include "relay.h" +#include "test.h" + +#include +#include + +static void +test_cfmt_relay_header(void *arg) +{ + relay_header_t rh; + const uint8_t hdr_1[RELAY_HEADER_SIZE] = + "\x03" "\x00\x00" "\x21\x22" "ABCD" "\x01\x03"; + uint8_t hdr_out[RELAY_HEADER_SIZE]; + (void)arg; + + tt_int_op(sizeof(hdr_1), OP_EQ, RELAY_HEADER_SIZE); + relay_header_unpack(&rh, hdr_1); + tt_int_op(rh.command, OP_EQ, 3); + tt_int_op(rh.recognized, OP_EQ, 0); + tt_int_op(rh.stream_id, OP_EQ, 0x2122); + tt_mem_op(rh.integrity, OP_EQ, "ABCD", 4); + tt_int_op(rh.length, OP_EQ, 0x103); + + relay_header_pack(hdr_out, &rh); + tt_mem_op(hdr_out, OP_EQ, hdr_1, RELAY_HEADER_SIZE); + + done: + ; +} + +static void +make_relay_cell(cell_t *out, uint8_t command, + const void *body, size_t bodylen) +{ + relay_header_t rh; + + memset(&rh, 0, sizeof(rh)); + rh.stream_id = 5; + rh.command = command; + rh.length = bodylen; + + out->command = CELL_RELAY; + out->circ_id = 10; + relay_header_pack(out->payload, &rh); + + memcpy(out->payload + RELAY_HEADER_SIZE, body, bodylen); +} + +static void +test_cfmt_begin_cells(void *arg) +{ + cell_t cell; + begin_cell_t bcell; + uint8_t end_reason; + (void)arg; + + /* Try begindir. */ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN_DIR, "", 0); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_ptr_op(NULL, OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(0, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(1, OP_EQ, bcell.is_begindir); + + /* A Begindir with extra stuff. */ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN_DIR, "12345", 5); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_ptr_op(NULL, OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(0, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(1, OP_EQ, bcell.is_begindir); + + /* A short but valid begin cell */ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:9", 6); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("a.b", OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(9, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); + tor_free(bcell.address); + + /* A significantly loner begin cell */ + memset(&bcell, 0x7f, sizeof(bcell)); + { + const char c[] = "here-is-a-nice-long.hostname.com:65535"; + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, strlen(c)+1); + } + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("here-is-a-nice-long.hostname.com", OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(65535, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); + tor_free(bcell.address); + + /* An IPv4 begin cell. */ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "18.9.22.169:80", 15); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("18.9.22.169", OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(80, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); + tor_free(bcell.address); + + /* An IPv6 begin cell. Let's make sure we handle colons*/ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, + "[2620::6b0:b:1a1a:0:26e5:480e]:80", 34); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("[2620::6b0:b:1a1a:0:26e5:480e]", OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(80, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); + tor_free(bcell.address); + + /* a begin cell with extra junk but not enough for flags. */ + memset(&bcell, 0x7f, sizeof(bcell)); + { + const char c[] = "another.example.com:80\x00\x01\x02"; + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1); + } + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("another.example.com", OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(80, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); + tor_free(bcell.address); + + /* a begin cell with flags. */ + memset(&bcell, 0x7f, sizeof(bcell)); + { + const char c[] = "another.example.com:443\x00\x01\x02\x03\x04"; + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1); + } + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("another.example.com", OP_EQ, bcell.address); + tt_int_op(0x1020304, OP_EQ, bcell.flags); + tt_int_op(443, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); + tor_free(bcell.address); + + /* a begin cell with flags and even more cruft after that. */ + memset(&bcell, 0x7f, sizeof(bcell)); + { + const char c[] = "a-further.example.com:22\x00\xee\xaa\x00\xffHi mom"; + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1); + } + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("a-further.example.com", OP_EQ, bcell.address); + tt_int_op(0xeeaa00ff, OP_EQ, bcell.flags); + tt_int_op(22, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); + tor_free(bcell.address); + + /* bad begin cell: impossible length. */ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:80", 7); + cell.payload[9] = 0x01; /* Set length to 510 */ + cell.payload[10] = 0xfe; + { + relay_header_t rh; + relay_header_unpack(&rh, cell.payload); + tt_int_op(rh.length, OP_EQ, 510); + } + tt_int_op(-2, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + + /* Bad begin cell: no body. */ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "", 0); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + + /* bad begin cell: no body. */ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "", 0); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + + /* bad begin cell: no colon */ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b", 4); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + + /* bad begin cell: no ports */ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:", 5); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + + /* bad begin cell: bad port */ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:xyz", 8); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:100000", 11); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + + /* bad begin cell: no nul */ + memset(&bcell, 0x7f, sizeof(bcell)); + make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:80", 6); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + + done: + tor_free(bcell.address); +} + +static void +test_cfmt_connected_cells(void *arg) +{ + relay_header_t rh; + cell_t cell; + tor_addr_t addr; + int ttl, r; + char *mem_op_hex_tmp = NULL; + (void)arg; + + /* Let's try an oldschool one with nothing in it. */ + make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "", 0); + relay_header_unpack(&rh, cell.payload); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_UNSPEC); + tt_int_op(ttl, OP_EQ, -1); + + /* A slightly less oldschool one: only an IPv4 address */ + make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "\x20\x30\x40\x50", 4); + relay_header_unpack(&rh, cell.payload); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); + tt_str_op(fmt_addr(&addr), OP_EQ, "32.48.64.80"); + tt_int_op(ttl, OP_EQ, -1); + + /* Bogus but understandable: truncated TTL */ + make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "\x11\x12\x13\x14\x15", 5); + relay_header_unpack(&rh, cell.payload); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); + tt_str_op(fmt_addr(&addr), OP_EQ, "17.18.19.20"); + tt_int_op(ttl, OP_EQ, -1); + + /* Regular IPv4 one: address and TTL */ + make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, + "\x02\x03\x04\x05\x00\x00\x0e\x10", 8); + relay_header_unpack(&rh, cell.payload); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); + tt_str_op(fmt_addr(&addr), OP_EQ, "2.3.4.5"); + tt_int_op(ttl, OP_EQ, 3600); + + /* IPv4 with too-big TTL */ + make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, + "\x02\x03\x04\x05\xf0\x00\x00\x00", 8); + relay_header_unpack(&rh, cell.payload); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); + tt_str_op(fmt_addr(&addr), OP_EQ, "2.3.4.5"); + tt_int_op(ttl, OP_EQ, -1); + + /* IPv6 (ttl is mandatory) */ + make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, + "\x00\x00\x00\x00\x06" + "\x26\x07\xf8\xb0\x40\x0c\x0c\x02" + "\x00\x00\x00\x00\x00\x00\x00\x68" + "\x00\x00\x02\x58", 25); + relay_header_unpack(&rh, cell.payload); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6); + tt_str_op(fmt_addr(&addr), OP_EQ, "2607:f8b0:400c:c02::68"); + tt_int_op(ttl, OP_EQ, 600); + + /* IPv6 (ttl too big) */ + make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, + "\x00\x00\x00\x00\x06" + "\x26\x07\xf8\xb0\x40\x0c\x0c\x02" + "\x00\x00\x00\x00\x00\x00\x00\x68" + "\x90\x00\x02\x58", 25); + relay_header_unpack(&rh, cell.payload); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6); + tt_str_op(fmt_addr(&addr), OP_EQ, "2607:f8b0:400c:c02::68"); + tt_int_op(ttl, OP_EQ, -1); + + /* Bogus size: 3. */ + make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, + "\x00\x01\x02", 3); + relay_header_unpack(&rh, cell.payload); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, -1); + + /* Bogus family: 7. */ + make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, + "\x00\x00\x00\x00\x07" + "\x26\x07\xf8\xb0\x40\x0c\x0c\x02" + "\x00\x00\x00\x00\x00\x00\x00\x68" + "\x90\x00\x02\x58", 25); + relay_header_unpack(&rh, cell.payload); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, -1); + + /* Truncated IPv6. */ + make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, + "\x00\x00\x00\x00\x06" + "\x26\x07\xf8\xb0\x40\x0c\x0c\x02" + "\x00\x00\x00\x00\x00\x00\x00\x68" + "\x00\x00\x02", 24); + relay_header_unpack(&rh, cell.payload); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, -1); + + /* Now make sure we can generate connected cells correctly. */ + /* Try an IPv4 address */ + memset(&rh, 0, sizeof(rh)); + memset(&cell, 0, sizeof(cell)); + tor_addr_parse(&addr, "30.40.50.60"); + rh.length = connected_cell_format_payload(cell.payload+RELAY_HEADER_SIZE, + &addr, 1024); + tt_int_op(rh.length, OP_EQ, 8); + test_memeq_hex(cell.payload+RELAY_HEADER_SIZE, "1e28323c" "00000e10"); + + /* Try parsing it. */ + tor_addr_make_unspec(&addr); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); + tt_str_op(fmt_addr(&addr), OP_EQ, "30.40.50.60"); + tt_int_op(ttl, OP_EQ, 3600); /* not 1024, since we clipped to 3600 */ + + /* Try an IPv6 address */ + memset(&rh, 0, sizeof(rh)); + memset(&cell, 0, sizeof(cell)); + tor_addr_parse(&addr, "2620::6b0:b:1a1a:0:26e5:480e"); + rh.length = connected_cell_format_payload(cell.payload+RELAY_HEADER_SIZE, + &addr, 3600); + tt_int_op(rh.length, OP_EQ, 25); + test_memeq_hex(cell.payload + RELAY_HEADER_SIZE, + "00000000" "06" + "2620000006b0000b1a1a000026e5480e" "00000e10"); + + /* Try parsing it. */ + tor_addr_make_unspec(&addr); + r = connected_cell_parse(&rh, &cell, &addr, &ttl); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6); + tt_str_op(fmt_addr(&addr), OP_EQ, "2620:0:6b0:b:1a1a:0:26e5:480e"); + tt_int_op(ttl, OP_EQ, 3600); + + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_cfmt_create_cells(void *arg) +{ + uint8_t b[MAX_ONIONSKIN_CHALLENGE_LEN]; + create_cell_t cc; + cell_t cell; + cell_t cell2; + + (void)arg; + + /* === Let's try parsing some good cells! */ + + /* A valid create cell. */ + memset(&cell, 0, sizeof(cell)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, TAP_ONIONSKIN_CHALLENGE_LEN); + cell.command = CELL_CREATE; + memcpy(cell.payload, b, TAP_ONIONSKIN_CHALLENGE_LEN); + tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATE, OP_EQ, cc.cell_type); + tt_int_op(ONION_HANDSHAKE_TYPE_TAP, OP_EQ, cc.handshake_type); + tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10); + tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); + + /* A valid create_fast cell. */ + memset(&cell, 0, sizeof(cell)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, CREATE_FAST_LEN); + cell.command = CELL_CREATE_FAST; + memcpy(cell.payload, b, CREATE_FAST_LEN); + tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATE_FAST, OP_EQ, cc.cell_type); + tt_int_op(ONION_HANDSHAKE_TYPE_FAST, OP_EQ, cc.handshake_type); + tt_int_op(CREATE_FAST_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.onionskin,OP_EQ, b, CREATE_FAST_LEN + 10); + tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); + + /* A valid create2 cell with a TAP payload */ + memset(&cell, 0, sizeof(cell)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, TAP_ONIONSKIN_CHALLENGE_LEN); + cell.command = CELL_CREATE2; + memcpy(cell.payload, "\x00\x00\x00\xBA", 4); /* TAP, 186 bytes long */ + memcpy(cell.payload+4, b, TAP_ONIONSKIN_CHALLENGE_LEN); + tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATE2, OP_EQ, cc.cell_type); + tt_int_op(ONION_HANDSHAKE_TYPE_TAP, OP_EQ, cc.handshake_type); + tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10); + tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); + + /* A valid create2 cell with an ntor payload */ + memset(&cell, 0, sizeof(cell)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, NTOR_ONIONSKIN_LEN); + cell.command = CELL_CREATE2; + memcpy(cell.payload, "\x00\x02\x00\x54", 4); /* ntor, 84 bytes long */ + memcpy(cell.payload+4, b, NTOR_ONIONSKIN_LEN); + tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATE2, OP_EQ, cc.cell_type); + tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, OP_EQ, cc.handshake_type); + tt_int_op(NTOR_ONIONSKIN_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN + 10); + tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); + + /* A valid create cell with an ntor payload, in legacy format. */ + memset(&cell, 0, sizeof(cell)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, NTOR_ONIONSKIN_LEN); + cell.command = CELL_CREATE; + memcpy(cell.payload, "ntorNTORntorNTOR", 16); + memcpy(cell.payload+16, b, NTOR_ONIONSKIN_LEN); + tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATE, OP_EQ, cc.cell_type); + tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, OP_EQ, cc.handshake_type); + tt_int_op(NTOR_ONIONSKIN_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN + 10); + tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); + + /* == Okay, now let's try to parse some impossible stuff. */ + + /* It has to be some kind of a create cell! */ + cell.command = CELL_CREATED; + tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); + + /* You can't acutally make an unparseable CREATE or CREATE_FAST cell. */ + + /* Try some CREATE2 cells. First with a bad type. */ + cell.command = CELL_CREATE2; + memcpy(cell.payload, "\x00\x50\x00\x99", 4); /* Type 0x50???? */ + tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); + /* Now a good type with an incorrect length. */ + memcpy(cell.payload, "\x00\x00\x00\xBC", 4); /* TAP, 187 bytes.*/ + tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); + /* Now a good type with a ridiculous length. */ + memcpy(cell.payload, "\x00\x00\x02\x00", 4); /* TAP, 512 bytes.*/ + tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); + + /* == Time to try formatting bad cells. The important thing is that + we reject big lengths, so just check that for now. */ + cc.handshake_len = 512; + tt_int_op(-1, OP_EQ, create_cell_format(&cell2, &cc)); + + /* == Try formatting a create2 cell we don't understand. XXXX */ + + done: + ; +} + +static void +test_cfmt_created_cells(void *arg) +{ + uint8_t b[512]; + created_cell_t cc; + cell_t cell; + cell_t cell2; + + (void)arg; + + /* A good CREATED cell */ + memset(&cell, 0, sizeof(cell)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, TAP_ONIONSKIN_REPLY_LEN); + cell.command = CELL_CREATED; + memcpy(cell.payload, b, TAP_ONIONSKIN_REPLY_LEN); + tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATED, OP_EQ, cc.cell_type); + tt_int_op(TAP_ONIONSKIN_REPLY_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.reply,OP_EQ, b, TAP_ONIONSKIN_REPLY_LEN + 10); + tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); + + /* A good CREATED_FAST cell */ + memset(&cell, 0, sizeof(cell)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, CREATED_FAST_LEN); + cell.command = CELL_CREATED_FAST; + memcpy(cell.payload, b, CREATED_FAST_LEN); + tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATED_FAST, OP_EQ, cc.cell_type); + tt_int_op(CREATED_FAST_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.reply,OP_EQ, b, CREATED_FAST_LEN + 10); + tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); + + /* A good CREATED2 cell with short reply */ + memset(&cell, 0, sizeof(cell)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, 64); + cell.command = CELL_CREATED2; + memcpy(cell.payload, "\x00\x40", 2); + memcpy(cell.payload+2, b, 64); + tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATED2, OP_EQ, cc.cell_type); + tt_int_op(64, OP_EQ, cc.handshake_len); + tt_mem_op(cc.reply,OP_EQ, b, 80); + tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); + + /* A good CREATED2 cell with maximal reply */ + memset(&cell, 0, sizeof(cell)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, 496); + cell.command = CELL_CREATED2; + memcpy(cell.payload, "\x01\xF0", 2); + memcpy(cell.payload+2, b, 496); + tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATED2, OP_EQ, cc.cell_type); + tt_int_op(496, OP_EQ, cc.handshake_len); + tt_mem_op(cc.reply,OP_EQ, b, 496); + tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); + + /* Bogus CREATED2 cell: too long! */ + memset(&cell, 0, sizeof(cell)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, 496); + cell.command = CELL_CREATED2; + memcpy(cell.payload, "\x01\xF1", 2); + tt_int_op(-1, OP_EQ, created_cell_parse(&cc, &cell)); + + /* Unformattable CREATED2 cell: too long! */ + cc.handshake_len = 497; + tt_int_op(-1, OP_EQ, created_cell_format(&cell2, &cc)); + + done: + ; +} + +static void +test_cfmt_extend_cells(void *arg) +{ + cell_t cell; + uint8_t b[512]; + extend_cell_t ec; + create_cell_t *cc = &ec.create_cell; + uint8_t p[RELAY_PAYLOAD_SIZE]; + uint8_t p2[RELAY_PAYLOAD_SIZE]; + uint8_t p2_cmd; + uint16_t p2_len; + char *mem_op_hex_tmp = NULL; + + (void) arg; + + /* Let's start with a simple EXTEND cell. */ + memset(p, 0, sizeof(p)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, TAP_ONIONSKIN_CHALLENGE_LEN); + memcpy(p, "\x12\xf4\x00\x01\x01\x02", 6); /* 18 244 0 1 : 258 */ + memcpy(p+6,b,TAP_ONIONSKIN_CHALLENGE_LEN); + memcpy(p+6+TAP_ONIONSKIN_CHALLENGE_LEN, "electroencephalogram", 20); + tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND, + p, 26+TAP_ONIONSKIN_CHALLENGE_LEN)); + tt_int_op(RELAY_COMMAND_EXTEND, OP_EQ, ec.cell_type); + tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); + tt_int_op(258, OP_EQ, ec.orport_ipv4.port); + tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr)); + tt_mem_op(ec.node_id,OP_EQ, "electroencephalogram", 20); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE); + tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_TAP); + tt_int_op(cc->handshake_len, OP_EQ, TAP_ONIONSKIN_CHALLENGE_LEN); + tt_mem_op(cc->onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN+20); + tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND); + tt_int_op(p2_len, OP_EQ, 26+TAP_ONIONSKIN_CHALLENGE_LEN); + tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE); + + /* Let's do an ntor stuffed in a legacy EXTEND cell */ + memset(p, 0, sizeof(p)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, NTOR_ONIONSKIN_LEN); + memcpy(p, "\x12\xf4\x00\x01\x01\x02", 6); /* 18 244 0 1 : 258 */ + memcpy(p+6,"ntorNTORntorNTOR", 16); + memcpy(p+22, b, NTOR_ONIONSKIN_LEN); + memcpy(p+6+TAP_ONIONSKIN_CHALLENGE_LEN, "electroencephalogram", 20); + tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND, + p, 26+TAP_ONIONSKIN_CHALLENGE_LEN)); + tt_int_op(RELAY_COMMAND_EXTEND, OP_EQ, ec.cell_type); + tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); + tt_int_op(258, OP_EQ, ec.orport_ipv4.port); + tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr)); + tt_mem_op(ec.node_id,OP_EQ, "electroencephalogram", 20); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2); + tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_NTOR); + tt_int_op(cc->handshake_len, OP_EQ, NTOR_ONIONSKIN_LEN); + tt_mem_op(cc->onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN+20); + tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND); + tt_int_op(p2_len, OP_EQ, 26+TAP_ONIONSKIN_CHALLENGE_LEN); + tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE); + tt_int_op(0, OP_EQ, create_cell_format_relayed(&cell, cc)); + + /* Now let's do a minimal ntor EXTEND2 cell. */ + memset(&ec, 0xff, sizeof(ec)); + memset(p, 0, sizeof(p)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, NTOR_ONIONSKIN_LEN); + /* 2 items; one 18.244.0.1:61681 */ + memcpy(p, "\x02\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); + /* The other is a digest. */ + memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); + /* Prep for the handshake: type and length */ + memcpy(p+31, "\x00\x02\x00\x54", 4); + memcpy(p+35, b, NTOR_ONIONSKIN_LEN); + tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + p, 35+NTOR_ONIONSKIN_LEN)); + tt_int_op(RELAY_COMMAND_EXTEND2, OP_EQ, ec.cell_type); + tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); + tt_int_op(61681, OP_EQ, ec.orport_ipv4.port); + tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr)); + tt_mem_op(ec.node_id,OP_EQ, "anarchoindividualist", 20); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2); + tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_NTOR); + tt_int_op(cc->handshake_len, OP_EQ, NTOR_ONIONSKIN_LEN); + tt_mem_op(cc->onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN+20); + tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND2); + tt_int_op(p2_len, OP_EQ, 35+NTOR_ONIONSKIN_LEN); + tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE); + + /* Now let's do a fanciful EXTEND2 cell. */ + memset(&ec, 0xff, sizeof(ec)); + memset(p, 0, sizeof(p)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, 99); + /* 4 items; one 18 244 0 1 61681 */ + memcpy(p, "\x04\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); + /* One is a digest. */ + memcpy(p+9, "\x02\x14" "anthropomorphization", 22); + /* One is an ipv6 address */ + memcpy(p+31, "\x01\x12\x20\x02\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xf0\xc5\x1e\x11\x12", 20); + /* One is the Konami code. */ + memcpy(p+51, "\xf0\x20upupdowndownleftrightleftrightba", 34); + /* Prep for the handshake: weird type and length */ + memcpy(p+85, "\x01\x05\x00\x63", 4); + memcpy(p+89, b, 99); + tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, 89+99)); + tt_int_op(RELAY_COMMAND_EXTEND2, OP_EQ, ec.cell_type); + tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); + tt_int_op(61681, OP_EQ, ec.orport_ipv4.port); + tt_str_op("2002::f0:c51e", OP_EQ, fmt_addr(&ec.orport_ipv6.addr)); + tt_int_op(4370, OP_EQ, ec.orport_ipv6.port); + tt_assert(ed25519_public_key_is_zero(&ec.ed_pubkey)); + tt_mem_op(ec.node_id,OP_EQ, "anthropomorphization", 20); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2); + tt_int_op(cc->handshake_type, OP_EQ, 0x105); + tt_int_op(cc->handshake_len, OP_EQ, 99); + tt_mem_op(cc->onionskin,OP_EQ, b, 99+20); + tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND2); + /* We'll generate it minus the IPv6 address and minus the konami code */ + tt_int_op(p2_len, OP_EQ, 89+99-34-20); + test_memeq_hex(p2, + /* Two items: one that same darn IP address. */ + "02000612F40001F0F1" + /* The next is a digest : anthropomorphization */ + "0214616e7468726f706f6d6f727068697a6174696f6e" + /* Now the handshake prologue */ + "01050063"); + tt_mem_op(p2+1+8+22+4,OP_EQ, b, 99+20); + tt_int_op(0, OP_EQ, create_cell_format_relayed(&cell, cc)); + + /* Now let's add an ed25519 key to that extend2 cell. */ + memcpy(ec.ed_pubkey.pubkey, + "brownshoesdontmakeit/brownshoesd", 32); + + /* As before, since we aren't extending by ed25519. */ + get_options_mutable()->ExtendByEd25519ID = 0; + tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(p2_len, OP_EQ, 89+99-34-20); + test_memeq_hex(p2, + "02000612F40001F0F1" + "0214616e7468726f706f6d6f727068697a6174696f6e" + "01050063"); + + /* Now try with the ed25519 ID. */ + get_options_mutable()->ExtendByEd25519ID = 1; + tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(p2_len, OP_EQ, 89+99-34-20 + 34); + test_memeq_hex(p2, + "03000612F40001F0F1" + "0214616e7468726f706f6d6f727068697a6174696f6e" + // ed digest follows: + "0320" "62726f776e73686f6573646f6e746d616b656" + "9742f62726f776e73686f657364" + "01050063"); + /* Can we parse that? Did the key come through right? */ + memset(&ec, 0, sizeof(ec)); + tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + p2, p2_len)); + tt_mem_op("brownshoesdontmakeit/brownshoesd", OP_EQ, + ec.ed_pubkey.pubkey, 32); + + /* == Now try parsing some junk */ + + /* Try a too-long handshake */ + memset(p, 0, sizeof(p)); + memcpy(p, "\x02\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); + memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); + memcpy(p+31, "\xff\xff\x01\xd0", 4); + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + p, sizeof(p))); + + /* Try two identities. */ + memset(p, 0, sizeof(p)); + memcpy(p, "\x03\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); + memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); + memcpy(p+31, "\x02\x14" "autodepolymerization", 22); + memcpy(p+53, "\xff\xff\x00\x10", 4); + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + p, sizeof(p))); + + /* No identities. */ + memset(p, 0, sizeof(p)); + memcpy(p, "\x01\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); + memcpy(p+53, "\xff\xff\x00\x10", 4); + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + p, sizeof(p))); + + /* Try a bad IPv4 address (too long, too short)*/ + memset(p, 0, sizeof(p)); + memcpy(p, "\x02\x00\x07\x12\xf4\x00\x01\xf0\xf1\xff", 10); + memcpy(p+10, "\x02\x14" "anarchoindividualist", 22); + memcpy(p+32, "\xff\xff\x00\x10", 4); + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + p, sizeof(p))); + memset(p, 0, sizeof(p)); + memcpy(p, "\x02\x00\x05\x12\xf4\x00\x01\xf0", 8); + memcpy(p+8, "\x02\x14" "anarchoindividualist", 22); + memcpy(p+30, "\xff\xff\x00\x10", 4); + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + p, sizeof(p))); + + /* IPv6 address (too long, too short, no IPv4)*/ + memset(p, 0, sizeof(p)); + memcpy(p, "\x03\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); + memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); + memcpy(p+31, "\x01\x13" "xxxxxxxxxxxxxxxxYYZ", 19); + memcpy(p+50, "\xff\xff\x00\x20", 4); + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + p, sizeof(p))); + memset(p, 0, sizeof(p)); + memcpy(p, "\x03\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); + memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); + memcpy(p+31, "\x01\x11" "xxxxxxxxxxxxxxxxY", 17); + memcpy(p+48, "\xff\xff\x00\x20", 4); + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + p, sizeof(p))); + memset(p, 0, sizeof(p)); + memcpy(p, "\x02", 1); + memcpy(p+1, "\x02\x14" "anarchoindividualist", 22); + memcpy(p+23, "\x01\x12" "xxxxxxxxxxxxxxxxYY", 18); + memcpy(p+41, "\xff\xff\x00\x20", 4); + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + p, sizeof(p))); + + /* Running out of space in specifiers */ + memset(p,0,sizeof(p)); + memcpy(p, "\x05\x0a\xff", 3); + memcpy(p+3+255, "\x0a\xff", 2); + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + p, sizeof(p))); + + /* Fuzz, because why not. */ + memset(&ec, 0xff, sizeof(ec)); + { + int i; + memset(p, 0, sizeof(p)); + for (i = 0; i < 10000; ++i) { + int n = crypto_rand_int(sizeof(p)); + crypto_rand((char *)p, n); + extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, n); + } + } + + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_cfmt_extended_cells(void *arg) +{ + uint8_t b[512]; + extended_cell_t ec; + created_cell_t *cc = &ec.created_cell; + uint8_t p[RELAY_PAYLOAD_SIZE]; + uint8_t p2[RELAY_PAYLOAD_SIZE]; + uint8_t p2_cmd; + uint16_t p2_len; + char *mem_op_hex_tmp = NULL; + + (void) arg; + + /* Try a regular EXTENDED cell. */ + memset(&ec, 0xff, sizeof(ec)); + memset(p, 0, sizeof(p)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, TAP_ONIONSKIN_REPLY_LEN); + memcpy(p,b,TAP_ONIONSKIN_REPLY_LEN); + tt_int_op(0, OP_EQ, extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED, p, + TAP_ONIONSKIN_REPLY_LEN)); + tt_int_op(RELAY_COMMAND_EXTENDED, OP_EQ, ec.cell_type); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATED); + tt_int_op(cc->handshake_len, OP_EQ, TAP_ONIONSKIN_REPLY_LEN); + tt_mem_op(cc->reply,OP_EQ, b, TAP_ONIONSKIN_REPLY_LEN); + tt_int_op(0, OP_EQ, extended_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(RELAY_COMMAND_EXTENDED, OP_EQ, p2_cmd); + tt_int_op(TAP_ONIONSKIN_REPLY_LEN, OP_EQ, p2_len); + tt_mem_op(p2,OP_EQ, p, sizeof(p2)); + + /* Try an EXTENDED2 cell */ + memset(&ec, 0xff, sizeof(ec)); + memset(p, 0, sizeof(p)); + memset(b, 0, sizeof(b)); + crypto_rand((char*)b, 42); + memcpy(p,"\x00\x2a",2); + memcpy(p+2,b,42); + tt_int_op(0, OP_EQ, + extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, 2+42)); + tt_int_op(RELAY_COMMAND_EXTENDED2, OP_EQ, ec.cell_type); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATED2); + tt_int_op(cc->handshake_len, OP_EQ, 42); + tt_mem_op(cc->reply,OP_EQ, b, 42+10); + tt_int_op(0, OP_EQ, extended_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(RELAY_COMMAND_EXTENDED2, OP_EQ, p2_cmd); + tt_int_op(2+42, OP_EQ, p2_len); + tt_mem_op(p2,OP_EQ, p, sizeof(p2)); + + /* Try an almost-too-long EXTENDED2 cell */ + memcpy(p, "\x01\xf0", 2); + tt_int_op(0, OP_EQ, + extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, sizeof(p))); + + /* Now try a too-long extended2 cell. That's the only misparse I can think + * of. */ + memcpy(p, "\x01\xf1", 2); + tt_int_op(-1, OP_EQ, + extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, sizeof(p))); + + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_cfmt_resolved_cells(void *arg) +{ + smartlist_t *addrs = smartlist_new(); + relay_header_t rh; + cell_t cell; + int r, errcode; + address_ttl_t *a; + + (void)arg; +#define CLEAR_CELL() do { \ + memset(&cell, 0, sizeof(cell)); \ + memset(&rh, 0, sizeof(rh)); \ + } while (0) +#define CLEAR_ADDRS() do { \ + SMARTLIST_FOREACH(addrs, address_ttl_t *, aa_, \ + address_ttl_free(aa_); ); \ + smartlist_clear(addrs); \ + } while (0) +#define SET_CELL(s) do { \ + CLEAR_CELL(); \ + memcpy(cell.payload + RELAY_HEADER_SIZE, (s), sizeof((s))-1); \ + rh.length = sizeof((s))-1; \ + rh.command = RELAY_COMMAND_RESOLVED; \ + errcode = -1; \ + } while (0) + + /* The cell format is one or more answers; each of the form + * type [1 byte---0:hostname, 4:ipv4, 6:ipv6, f0:err-transient, f1:err] + * length [1 byte] + * body [length bytes] + * ttl [4 bytes] + */ + + /* Let's try an empty cell */ + SET_CELL(""); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + CLEAR_ADDRS(); /* redundant but let's be consistent */ + + /* Cell with one ipv4 addr */ + SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"); + tt_int_op(rh.length, OP_EQ, 10); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 1); + a = smartlist_get(addrs, 0); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 256); + CLEAR_ADDRS(); + + /* Cell with one ipv6 addr */ + SET_CELL("\x06\x10" + "\x20\x02\x90\x90\x00\x00\x00\x00" + "\x00\x00\x00\x00\xf0\xf0\xab\xcd" + "\x02\00\x00\x01"); + tt_int_op(rh.length, OP_EQ, 22); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 1); + a = smartlist_get(addrs, 0); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9090::f0f0:abcd"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 0x2000001); + CLEAR_ADDRS(); + + /* Cell with one hostname */ + SET_CELL("\x00\x11" + "motherbrain.zebes" + "\x00\00\x00\x00"); + tt_int_op(rh.length, OP_EQ, 23); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 1); + a = smartlist_get(addrs, 0); + tt_assert(tor_addr_is_null(&a->addr)); + tt_str_op(a->hostname, OP_EQ, "motherbrain.zebes"); + tt_int_op(a->ttl, OP_EQ, 0); + CLEAR_ADDRS(); + +#define LONG_NAME \ + "this-hostname-has-255-characters.in-order-to-test-whether-very-long.ho" \ + "stnames-are-accepted.i-am-putting-it-in-a-macro-because-although.this-" \ + "function-is-already-very-full.of-copy-and-pasted-stuff.having-this-app" \ + "ear-more-than-once-would-bother-me-somehow.is" + + tt_int_op(strlen(LONG_NAME), OP_EQ, 255); + SET_CELL("\x00\xff" + LONG_NAME + "\x00\01\x00\x00"); + tt_int_op(rh.length, OP_EQ, 261); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 1); + a = smartlist_get(addrs, 0); + tt_assert(tor_addr_is_null(&a->addr)); + tt_str_op(a->hostname, OP_EQ, LONG_NAME); + tt_int_op(a->ttl, OP_EQ, 65536); + CLEAR_ADDRS(); + + /* Cells with an error */ + SET_CELL("\xf0\x2b" + "I'm sorry, Dave. I'm afraid I can't do that" + "\x00\x11\x22\x33"); + tt_int_op(rh.length, OP_EQ, 49); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, RESOLVED_TYPE_ERROR_TRANSIENT); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + CLEAR_ADDRS(); + + SET_CELL("\xf1\x40" + "This hostname is too important for me to allow you to resolve it" + "\x00\x00\x00\x00"); + tt_int_op(rh.length, OP_EQ, 70); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, RESOLVED_TYPE_ERROR); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + CLEAR_ADDRS(); + + /* Cell with an unrecognized type */ + SET_CELL("\xee\x16" + "fault in the AE35 unit" + "\x09\x09\x01\x01"); + tt_int_op(rh.length, OP_EQ, 28); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + CLEAR_ADDRS(); + + /* Cell with one of each */ + SET_CELL(/* unrecognized: */ + "\xee\x16" + "fault in the AE35 unit" + "\x09\x09\x01\x01" + /* error: */ + "\xf0\x2b" + "I'm sorry, Dave. I'm afraid I can't do that" + "\x00\x11\x22\x33" + /* IPv6: */ + "\x06\x10" + "\x20\x02\x90\x90\x00\x00\x00\x00" + "\x00\x00\x00\x00\xf0\xf0\xab\xcd" + "\x02\00\x00\x01" + /* IPv4: */ + "\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" + /* Hostname: */ + "\x00\x11" + "motherbrain.zebes" + "\x00\00\x00\x00" + ); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); /* no error reported; we got answers */ + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 3); + a = smartlist_get(addrs, 0); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9090::f0f0:abcd"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 0x2000001); + a = smartlist_get(addrs, 1); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 256); + a = smartlist_get(addrs, 2); + tt_assert(tor_addr_is_null(&a->addr)); + tt_str_op(a->hostname, OP_EQ, "motherbrain.zebes"); + tt_int_op(a->ttl, OP_EQ, 0); + CLEAR_ADDRS(); + + /* Cell with several of similar type */ + SET_CELL(/* IPv4 */ + "\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" + "\x04\x04" "\x08\x08\x08\x08" "\x00\00\x01\x05" + "\x04\x04" "\x7f\xb0\x02\xb0" "\x00\01\xff\xff" + /* IPv6 */ + "\x06\x10" + "\x20\x02\x90\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\xca\xfe\xf0\x0d" + "\x00\00\x00\x01" + "\x06\x10" + "\x20\x02\x90\x01\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xfa\xca\xde" + "\x00\00\x00\x03"); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 5); + a = smartlist_get(addrs, 0); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 256); + a = smartlist_get(addrs, 1); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "8.8.8.8"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 261); + a = smartlist_get(addrs, 2); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.176.2.176"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 131071); + a = smartlist_get(addrs, 3); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9000::cafe:f00d"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 1); + a = smartlist_get(addrs, 4); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9001::fa:cade"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 3); + CLEAR_ADDRS(); + + /* Full cell */ +#define LONG_NAME2 \ + "this-name-has-231-characters.so-that-it-plus-LONG_NAME-can-completely-" \ + "fill-up-the-payload-of-a-cell.its-important-to-check-for-the-full-thin" \ + "g-case.to-avoid-off-by-one-errors.where-full-things-are-misreported-as" \ + ".overflowing-by-one.z" + + tt_int_op(strlen(LONG_NAME2), OP_EQ, 231); + SET_CELL("\x00\xff" + LONG_NAME + "\x00\01\x00\x00" + "\x00\xe7" + LONG_NAME2 + "\x00\01\x00\x00"); + tt_int_op(rh.length, OP_EQ, RELAY_PAYLOAD_SIZE); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 2); + a = smartlist_get(addrs, 0); + tt_str_op(a->hostname, OP_EQ, LONG_NAME); + a = smartlist_get(addrs, 1); + tt_str_op(a->hostname, OP_EQ, LONG_NAME2); + CLEAR_ADDRS(); + + /* BAD CELLS */ + + /* Invalid length on an IPv4 */ + SET_CELL("\x04\x03zzz1234"); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" + "\x04\x05zzzzz1234"); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + + /* Invalid length on an IPv6 */ + SET_CELL("\x06\x03zzz1234"); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" + "\x06\x17wwwwwwwwwwwwwwwww1234"); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" + "\x06\x10xxxx"); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + + /* Empty hostname */ + SET_CELL("\x00\x00xxxx"); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + + /* rh.length out of range */ + CLEAR_CELL(); + rh.length = 499; + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + + /* Item length extends beyond rh.length */ + CLEAR_CELL(); + SET_CELL("\x00\xff" + LONG_NAME + "\x00\01\x00\x00"); + rh.length -= 1; + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + rh.length -= 5; + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + + SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"); + rh.length -= 1; + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + + SET_CELL("\xee\x10" + "\x20\x02\x90\x01\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xfa\xca\xde" + "\x00\00\x00\x03"); + rh.length -= 1; + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + + /* Truncated item after first character */ + SET_CELL("\x04"); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + + SET_CELL("\xee"); + r = resolved_cell_parse(&cell, &rh, addrs, &errcode); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); + + done: + CLEAR_ADDRS(); + CLEAR_CELL(); + smartlist_free(addrs); +#undef CLEAR_ADDRS +#undef CLEAR_CELL +} + +static void +test_cfmt_is_destroy(void *arg) +{ + cell_t cell; + packed_cell_t packed; + circid_t circid = 0; + channel_t *chan; + (void)arg; + + chan = tor_malloc_zero(sizeof(channel_t)); + + memset(&cell, 0xff, sizeof(cell)); + cell.circ_id = 3003; + cell.command = CELL_RELAY; + + cell_pack(&packed, &cell, 0); + chan->wide_circ_ids = 0; + tt_assert(! packed_cell_is_destroy(chan, &packed, &circid)); + tt_int_op(circid, OP_EQ, 0); + + cell_pack(&packed, &cell, 1); + chan->wide_circ_ids = 1; + tt_assert(! packed_cell_is_destroy(chan, &packed, &circid)); + tt_int_op(circid, OP_EQ, 0); + + cell.command = CELL_DESTROY; + + cell_pack(&packed, &cell, 0); + chan->wide_circ_ids = 0; + tt_assert(packed_cell_is_destroy(chan, &packed, &circid)); + tt_int_op(circid, OP_EQ, 3003); + + circid = 0; + cell_pack(&packed, &cell, 1); + chan->wide_circ_ids = 1; + tt_assert(packed_cell_is_destroy(chan, &packed, &circid)); + + done: + tor_free(chan); +} + +#define TEST(name, flags) \ + { #name, test_cfmt_ ## name, flags, 0, NULL } + +struct testcase_t cell_format_tests[] = { + TEST(relay_header, 0), + TEST(begin_cells, 0), + TEST(connected_cells, 0), + TEST(create_cells, 0), + TEST(created_cells, 0), + TEST(extend_cells, TT_FORK), + TEST(extended_cells, 0), + TEST(resolved_cells, 0), + TEST(is_destroy, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_cell_queue.c b/src/wraith/src/test/test_cell_queue.c new file mode 100644 index 000000000..df987f82c --- /dev/null +++ b/src/wraith/src/test/test_cell_queue.c @@ -0,0 +1,142 @@ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CIRCUITLIST_PRIVATE +#define RELAY_PRIVATE +#include "or.h" +#include "circuitlist.h" +#include "relay.h" +#include "test.h" + +static void +test_cq_manip(void *arg) +{ + packed_cell_t *pc1=NULL, *pc2=NULL, *pc3=NULL, *pc4=NULL, *pc_tmp=NULL; + cell_queue_t cq; + cell_t cell; + (void) arg; + + cell_queue_init(&cq); + tt_int_op(cq.n, OP_EQ, 0); + + pc1 = packed_cell_new(); + pc2 = packed_cell_new(); + pc3 = packed_cell_new(); + pc4 = packed_cell_new(); + tt_assert(pc1 && pc2 && pc3 && pc4); + + tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq)); + + /* Add and remove a singleton. */ + cell_queue_append(&cq, pc1); + tt_int_op(cq.n, OP_EQ, 1); + tt_ptr_op(pc1, OP_EQ, cell_queue_pop(&cq)); + tt_int_op(cq.n, OP_EQ, 0); + + /* Add and remove four items */ + cell_queue_append(&cq, pc4); + cell_queue_append(&cq, pc3); + cell_queue_append(&cq, pc2); + cell_queue_append(&cq, pc1); + tt_int_op(cq.n, OP_EQ, 4); + tt_ptr_op(pc4, OP_EQ, cell_queue_pop(&cq)); + tt_ptr_op(pc3, OP_EQ, cell_queue_pop(&cq)); + tt_ptr_op(pc2, OP_EQ, cell_queue_pop(&cq)); + tt_ptr_op(pc1, OP_EQ, cell_queue_pop(&cq)); + tt_int_op(cq.n, OP_EQ, 0); + tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq)); + + /* Try a packed copy (wide, then narrow, which is a bit of a cheat, since a + * real cell queue has only one type.) */ + memset(&cell, 0, sizeof(cell)); + cell.circ_id = 0x12345678; + cell.command = 10; + strlcpy((char*)cell.payload, "Lorax ipsum gruvvulus thneed amet, snergelly " + "once-ler lerkim, sed do barbaloot tempor gluppitus ut labore et " + "truffula magna aliqua.", + sizeof(cell.payload)); + cell_queue_append_packed_copy(NULL /*circ*/, &cq, 0 /*exitward*/, &cell, + 1 /*wide*/, 0 /*stats*/); + cell.circ_id = 0x2013; + cell_queue_append_packed_copy(NULL /*circ*/, &cq, 0 /*exitward*/, &cell, + 0 /*wide*/, 0 /*stats*/); + tt_int_op(cq.n, OP_EQ, 2); + + pc_tmp = cell_queue_pop(&cq); + tt_int_op(cq.n, OP_EQ, 1); + tt_ptr_op(pc_tmp, OP_NE, NULL); + tt_mem_op(pc_tmp->body, OP_EQ, "\x12\x34\x56\x78\x0a", 5); + tt_mem_op(pc_tmp->body+5, OP_EQ, cell.payload, sizeof(cell.payload)); + packed_cell_free(pc_tmp); + + pc_tmp = cell_queue_pop(&cq); + tt_int_op(cq.n, OP_EQ, 0); + tt_ptr_op(pc_tmp, OP_NE, NULL); + tt_mem_op(pc_tmp->body, OP_EQ, "\x20\x13\x0a", 3); + tt_mem_op(pc_tmp->body+3, OP_EQ, cell.payload, sizeof(cell.payload)); + packed_cell_free(pc_tmp); + pc_tmp = NULL; + + tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq)); + + /* Now make sure cell_queue_clear works. */ + cell_queue_append(&cq, pc2); + cell_queue_append(&cq, pc1); + tt_int_op(cq.n, OP_EQ, 2); + cell_queue_clear(&cq); + pc2 = pc1 = NULL; /* prevent double-free */ + tt_int_op(cq.n, OP_EQ, 0); + + done: + packed_cell_free(pc1); + packed_cell_free(pc2); + packed_cell_free(pc3); + packed_cell_free(pc4); + packed_cell_free(pc_tmp); + + cell_queue_clear(&cq); +} + +static void +test_circuit_n_cells(void *arg) +{ + packed_cell_t *pc1=NULL, *pc2=NULL, *pc3=NULL, *pc4=NULL, *pc5=NULL; + origin_circuit_t *origin_c=NULL; + or_circuit_t *or_c=NULL; + + (void)arg; + + pc1 = packed_cell_new(); + pc2 = packed_cell_new(); + pc3 = packed_cell_new(); + pc4 = packed_cell_new(); + pc5 = packed_cell_new(); + tt_assert(pc1 && pc2 && pc3 && pc4 && pc5); + + or_c = or_circuit_new(0, NULL); + origin_c = origin_circuit_new(); + origin_c->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL; + + tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 0); + cell_queue_append(&or_c->p_chan_cells, pc1); + tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 1); + cell_queue_append(&or_c->base_.n_chan_cells, pc2); + cell_queue_append(&or_c->base_.n_chan_cells, pc3); + tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 3); + + tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), OP_EQ, 0); + cell_queue_append(&origin_c->base_.n_chan_cells, pc4); + cell_queue_append(&origin_c->base_.n_chan_cells, pc5); + tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), OP_EQ, 2); + + done: + circuit_free_(TO_CIRCUIT(or_c)); + circuit_free_(TO_CIRCUIT(origin_c)); +} + +struct testcase_t cell_queue_tests[] = { + { "basic", test_cq_manip, TT_FORK, NULL, NULL, }, + { "circ_n_cells", test_circuit_n_cells, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_channel.c b/src/wraith/src/test/test_channel.c new file mode 100644 index 000000000..bdc9d32f7 --- /dev/null +++ b/src/wraith/src/test/test_channel.c @@ -0,0 +1,1556 @@ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define TOR_CHANNEL_INTERNAL_ +#define CHANNEL_PRIVATE_ +#include "or.h" +#include "channel.h" +/* For channel_note_destroy_not_pending */ +#define CIRCUITLIST_PRIVATE +#include "circuitlist.h" +#include "circuitmux.h" +#include "circuitmux_ewma.h" +/* For var_cell_free */ +#include "connection_or.h" +/* For packed_cell stuff */ +#define RELAY_PRIVATE +#include "relay.h" +/* For init/free stuff */ +#include "scheduler.h" +#include "networkstatus.h" + +/* Test suite stuff */ +#include "log_test_helpers.h" +#include "test.h" +#include "fakechans.h" + +static int test_chan_accept_cells = 0; +static int test_chan_fixed_cells_recved = 0; +static cell_t * test_chan_last_seen_fixed_cell_ptr = NULL; +static int test_chan_var_cells_recved = 0; +static var_cell_t * test_chan_last_seen_var_cell_ptr = NULL; +static int test_cells_written = 0; +static int test_doesnt_want_writes_count = 0; +static int test_dumpstats_calls = 0; +static int test_has_waiting_cells_count = 0; +static int test_releases_count = 0; +static channel_t *dump_statistics_mock_target = NULL; +static int dump_statistics_mock_matches = 0; +static int test_close_called = 0; +static int test_chan_should_be_canonical = 0; +static int test_chan_should_match_target = 0; +static int test_chan_canonical_should_be_reliable = 0; +static int test_chan_listener_close_fn_called = 0; +static int test_chan_listener_fn_called = 0; + +static const char * +chan_test_describe_transport(channel_t *ch) +{ + tt_ptr_op(ch, OP_NE, NULL); + + done: + return "Fake channel for unit tests"; +} + +/** + * Mock for channel_dump_statistics(); if the channel matches the + * target, bump a counter - otherwise ignore. + */ + +static void +chan_test_channel_dump_statistics_mock(channel_t *chan, int severity) +{ + tt_ptr_op(chan, OP_NE, NULL); + + (void)severity; + + if (chan != NULL && chan == dump_statistics_mock_target) { + ++dump_statistics_mock_matches; + } + + done: + return; +} + +/* + * Handle an incoming fixed-size cell for unit tests + */ + +static void +chan_test_cell_handler(channel_t *chan, cell_t *cell) +{ + tt_assert(chan); + tt_assert(cell); + + test_chan_last_seen_fixed_cell_ptr = cell; + ++test_chan_fixed_cells_recved; + + done: + return; +} + +/* + * Fake transport-specific stats call + */ + +static void +chan_test_dumpstats(channel_t *ch, int severity) +{ + tt_ptr_op(ch, OP_NE, NULL); + + (void)severity; + + ++test_dumpstats_calls; + + done: + return; +} + +/* + * Handle an incoming variable-size cell for unit tests + */ + +static void +chan_test_var_cell_handler(channel_t *ch, + var_cell_t *var_cell) +{ + tt_assert(ch); + tt_assert(var_cell); + + test_chan_last_seen_var_cell_ptr = var_cell; + ++test_chan_var_cells_recved; + + done: + return; +} + +static void +chan_test_close(channel_t *ch) +{ + tt_assert(ch); + + ++test_close_called; + + done: + return; +} + +/* + * Close a channel through the error path + */ + +static void +chan_test_error(channel_t *ch) +{ + tt_assert(ch); + tt_assert(!(ch->state == CHANNEL_STATE_CLOSING || + ch->state == CHANNEL_STATE_ERROR || + ch->state == CHANNEL_STATE_CLOSED)); + + channel_close_for_error(ch); + + done: + return; +} + +/* + * Finish closing a channel from CHANNEL_STATE_CLOSING + */ + +static void +chan_test_finish_close(channel_t *ch) +{ + tt_assert(ch); + tt_assert(ch->state == CHANNEL_STATE_CLOSING); + + channel_closed(ch); + + done: + return; +} + +static const char * +chan_test_get_remote_descr(channel_t *ch, int flags) +{ + tt_assert(ch); + tt_int_op(flags & ~(GRD_FLAG_ORIGINAL | GRD_FLAG_ADDR_ONLY), OP_EQ, 0); + + done: + return "Fake channel for unit tests; no real endpoint"; +} + +static int +chan_test_num_cells_writeable(channel_t *ch) +{ + tt_assert(ch); + + done: + return 32; +} + +static int +chan_test_write_packed_cell(channel_t *ch, + packed_cell_t *packed_cell) +{ + int rv = 0; + + tt_assert(ch); + tt_assert(packed_cell); + + if (test_chan_accept_cells) { + /* Free the cell and bump the counter */ + ++test_cells_written; + rv = 1; + } + /* else return 0, we didn't accept it */ + + done: + return rv; +} + +static int +chan_test_write_var_cell(channel_t *ch, var_cell_t *var_cell) +{ + int rv = 0; + + tt_assert(ch); + tt_assert(var_cell); + + if (test_chan_accept_cells) { + /* Free the cell and bump the counter */ + var_cell_free(var_cell); + ++test_cells_written; + rv = 1; + } + /* else return 0, we didn't accept it */ + + done: + return rv; +} + +/** + * Fill out c with a new fake cell for test suite use + */ + +void +make_fake_cell(cell_t *c) +{ + tt_ptr_op(c, OP_NE, NULL); + + c->circ_id = 1; + c->command = CELL_RELAY; + memset(c->payload, 0, CELL_PAYLOAD_SIZE); + + done: + return; +} + +/** + * Fill out c with a new fake var_cell for test suite use + */ + +void +make_fake_var_cell(var_cell_t *c) +{ + tt_ptr_op(c, OP_NE, NULL); + + c->circ_id = 1; + c->command = CELL_VERSIONS; + c->payload_len = CELL_PAYLOAD_SIZE / 2; + memset(c->payload, 0, c->payload_len); + + done: + return; +} + +/** + * Set up a new fake channel for the test suite + */ + +channel_t * +new_fake_channel(void) +{ + channel_t *chan = tor_malloc_zero(sizeof(channel_t)); + channel_init(chan); + + chan->close = chan_test_close; + chan->num_cells_writeable = chan_test_num_cells_writeable; + chan->get_remote_descr = chan_test_get_remote_descr; + chan->write_packed_cell = chan_test_write_packed_cell; + chan->write_var_cell = chan_test_write_var_cell; + chan->state = CHANNEL_STATE_OPEN; + + chan->cmux = circuitmux_alloc(); + + return chan; +} + +void +free_fake_channel(channel_t *chan) +{ + if (! chan) + return; + + if (chan->cmux) + circuitmux_free(chan->cmux); + + tor_free(chan); +} + +/** + * Counter query for scheduler_channel_has_waiting_cells_mock() + */ + +int +get_mock_scheduler_has_waiting_cells_count(void) +{ + return test_has_waiting_cells_count; +} + +/** + * Mock for scheduler_channel_has_waiting_cells() + */ + +void +scheduler_channel_has_waiting_cells_mock(channel_t *ch) +{ + (void)ch; + + /* Increment counter */ + ++test_has_waiting_cells_count; + + return; +} + +static void +scheduler_channel_doesnt_want_writes_mock(channel_t *ch) +{ + (void)ch; + + /* Increment counter */ + ++test_doesnt_want_writes_count; + + return; +} + +/** + * Mock for scheduler_release_channel() + */ + +void +scheduler_release_channel_mock(channel_t *ch) +{ + (void)ch; + + /* Increment counter */ + ++test_releases_count; + + return; +} + +static int +test_chan_is_canonical(channel_t *chan, int req) +{ + tor_assert(chan); + + if (req && test_chan_canonical_should_be_reliable) { + return 1; + } + + if (test_chan_should_be_canonical) { + return 1; + } + return 0; +} + +static int +test_chan_matches_target(channel_t *chan, const tor_addr_t *target) +{ + (void) chan; + (void) target; + + if (test_chan_should_match_target) { + return 1; + } + return 0; +} + +static void +test_chan_listener_close(channel_listener_t *chan) +{ + (void) chan; + ++test_chan_listener_close_fn_called; + return; +} + +static void +test_chan_listener_fn(channel_listener_t *listener, channel_t *chan) +{ + (void) listener; + (void) chan; + + ++test_chan_listener_fn_called; + return; +} + +static const char * +test_chan_listener_describe_transport(channel_listener_t *chan) +{ + (void) chan; + return "Fake listener channel."; +} + +/** + * Test for channel_dumpstats() and limited test for + * channel_dump_statistics() + */ + +static void +test_channel_dumpstats(void *arg) +{ + channel_t *ch = NULL; + cell_t *cell = NULL; + packed_cell_t *p_cell = NULL; + int old_count; + + (void)arg; + + /* Mock these for duration of the test */ + MOCK(scheduler_channel_doesnt_want_writes, + scheduler_channel_doesnt_want_writes_mock); + MOCK(scheduler_release_channel, + scheduler_release_channel_mock); + + /* Set up a new fake channel */ + ch = new_fake_channel(); + tt_assert(ch); + + /* Try to register it */ + channel_register(ch); + tt_assert(ch->registered); + + /* Set up mock */ + dump_statistics_mock_target = ch; + dump_statistics_mock_matches = 0; + MOCK(channel_dump_statistics, + chan_test_channel_dump_statistics_mock); + + /* Call channel_dumpstats() */ + channel_dumpstats(LOG_DEBUG); + + /* Assert that we hit the mock */ + tt_int_op(dump_statistics_mock_matches, OP_EQ, 1); + + /* Close the channel */ + channel_mark_for_close(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); + chan_test_finish_close(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED); + + /* Try again and hit the finished channel */ + channel_dumpstats(LOG_DEBUG); + tt_int_op(dump_statistics_mock_matches, OP_EQ, 2); + + channel_run_cleanup(); + ch = NULL; + + /* Now we should hit nothing */ + channel_dumpstats(LOG_DEBUG); + tt_int_op(dump_statistics_mock_matches, OP_EQ, 2); + + /* Unmock */ + UNMOCK(channel_dump_statistics); + dump_statistics_mock_target = NULL; + dump_statistics_mock_matches = 0; + + /* Now make another channel */ + ch = new_fake_channel(); + tt_assert(ch); + channel_register(ch); + tt_int_op(ch->registered, OP_EQ, 1); + /* Lie about its age so dumpstats gets coverage for rate calculations */ + ch->timestamp_created = time(NULL) - 30; + tt_int_op(ch->timestamp_created, OP_GT, 0); + tt_int_op(time(NULL), OP_GT, ch->timestamp_created); + + /* Put cells through it both ways to make the counters non-zero */ + p_cell = packed_cell_new(); + test_chan_accept_cells = 1; + old_count = test_cells_written; + channel_write_packed_cell(ch, p_cell); + tt_int_op(test_cells_written, OP_EQ, old_count + 1); + tt_u64_op(ch->n_bytes_xmitted, OP_GT, 0); + tt_u64_op(ch->n_cells_xmitted, OP_GT, 0); + + /* Receive path */ + channel_set_cell_handlers(ch, + chan_test_cell_handler, + chan_test_var_cell_handler); + tt_ptr_op(channel_get_cell_handler(ch), OP_EQ, chan_test_cell_handler); + tt_ptr_op(channel_get_var_cell_handler(ch), OP_EQ, + chan_test_var_cell_handler); + cell = tor_malloc_zero(sizeof(*cell)); + old_count = test_chan_fixed_cells_recved; + channel_process_cell(ch, cell); + tt_int_op(test_chan_fixed_cells_recved, OP_EQ, old_count + 1); + tt_u64_op(ch->n_bytes_recved, OP_GT, 0); + tt_u64_op(ch->n_cells_recved, OP_GT, 0); + + /* Test channel_dump_statistics */ + ch->describe_transport = chan_test_describe_transport; + ch->dumpstats = chan_test_dumpstats; + test_chan_should_be_canonical = 1; + ch->is_canonical = test_chan_is_canonical; + old_count = test_dumpstats_calls; + channel_dump_statistics(ch, LOG_DEBUG); + tt_int_op(test_dumpstats_calls, OP_EQ, old_count + 1); + + /* Close the channel */ + channel_mark_for_close(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); + chan_test_finish_close(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED); + channel_run_cleanup(); + ch = NULL; + + done: + free_fake_channel(ch); + tor_free(cell); + + UNMOCK(scheduler_channel_doesnt_want_writes); + UNMOCK(scheduler_release_channel); + + return; +} + +/* Test outbound cell. The callstack is: + * channel_flush_some_cells() + * -> channel_flush_from_first_active_circuit() + * -> channel_write_packed_cell() + * -> write_packed_cell() + * -> chan->write_packed_cell() fct ptr. + * + * This test goes from a cell in a circuit up to the channel write handler + * that should put them on the connection outbuf. */ +static void +test_channel_outbound_cell(void *arg) +{ + int old_count; + channel_t *chan = NULL; + packed_cell_t *p_cell = NULL, *p_cell2 = NULL; + origin_circuit_t *circ = NULL; + cell_queue_t *queue; + + (void) arg; + + /* The channel will be freed so we need to hijack this so the scheduler + * doesn't get confused. */ + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + + /* Accept cells to lower layer */ + test_chan_accept_cells = 1; + + /* Setup a valid circuit to queue a cell. */ + circ = origin_circuit_new(); + tt_assert(circ); + /* Circuit needs an origin purpose to be considered origin. */ + TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_C_GENERAL; + TO_CIRCUIT(circ)->n_circ_id = 42; + /* This is the outbound test so use the next channel queue. */ + queue = &TO_CIRCUIT(circ)->n_chan_cells; + /* Setup packed cell to queue on the circuit. */ + p_cell = packed_cell_new(); + tt_assert(p_cell); + p_cell2 = packed_cell_new(); + tt_assert(p_cell2); + /* Setup a channel to put the circuit on. */ + chan = new_fake_channel(); + tt_assert(chan); + chan->state = CHANNEL_STATE_OPENING; + channel_change_state_open(chan); + /* Outbound channel. */ + channel_mark_outgoing(chan); + /* Try to register it so we can clean it through the channel cleanup + * process. */ + channel_register(chan); + tt_int_op(chan->registered, OP_EQ, 1); + /* Set EWMA policy so we can pick it when flushing. */ + channel_set_cmux_policy_everywhere(&ewma_policy); + tt_ptr_op(circuitmux_get_policy(chan->cmux), OP_EQ, &ewma_policy); + + /* Register circuit to the channel circid map which will attach the circuit + * to the channel's cmux as well. */ + circuit_set_n_circid_chan(TO_CIRCUIT(circ), 42, chan); + tt_int_op(channel_num_circuits(chan), OP_EQ, 1); + tt_assert(!TO_CIRCUIT(circ)->next_active_on_n_chan); + tt_assert(!TO_CIRCUIT(circ)->prev_active_on_n_chan); + /* Test the cmux state. */ + tt_ptr_op(TO_CIRCUIT(circ)->n_mux, OP_EQ, chan->cmux); + tt_int_op(circuitmux_is_circuit_attached(chan->cmux, TO_CIRCUIT(circ)), + OP_EQ, 1); + + /* Flush the channel without any cell on it. */ + old_count = test_cells_written; + ssize_t flushed = channel_flush_some_cells(chan, 1); + tt_i64_op(flushed, OP_EQ, 0); + tt_int_op(test_cells_written, OP_EQ, old_count); + tt_int_op(channel_more_to_flush(chan), OP_EQ, 0); + tt_int_op(circuitmux_num_active_circuits(chan->cmux), OP_EQ, 0); + tt_int_op(circuitmux_num_cells(chan->cmux), OP_EQ, 0); + tt_int_op(circuitmux_is_circuit_active(chan->cmux, TO_CIRCUIT(circ)), + OP_EQ, 0); + tt_u64_op(chan->n_cells_xmitted, OP_EQ, 0); + tt_u64_op(chan->n_bytes_xmitted, OP_EQ, 0); + + /* Queue cell onto the next queue that is the outbound direction. Than + * update its cmux so the circuit can be picked when flushing cells. */ + cell_queue_append(queue, p_cell); + p_cell = NULL; + tt_int_op(queue->n, OP_EQ, 1); + cell_queue_append(queue, p_cell2); + p_cell2 = NULL; + tt_int_op(queue->n, OP_EQ, 2); + + update_circuit_on_cmux(TO_CIRCUIT(circ), CELL_DIRECTION_OUT); + tt_int_op(circuitmux_num_active_circuits(chan->cmux), OP_EQ, 1); + tt_int_op(circuitmux_num_cells(chan->cmux), OP_EQ, 2); + tt_int_op(circuitmux_is_circuit_active(chan->cmux, TO_CIRCUIT(circ)), + OP_EQ, 1); + + /* From this point on, we have a queued cell on an active circuit attached + * to the channel's cmux. */ + + /* Flush the first cell. This is going to go down the call stack. */ + old_count = test_cells_written; + flushed = channel_flush_some_cells(chan, 1); + tt_i64_op(flushed, OP_EQ, 1); + tt_int_op(test_cells_written, OP_EQ, old_count + 1); + tt_int_op(circuitmux_num_cells(chan->cmux), OP_EQ, 1); + tt_int_op(channel_more_to_flush(chan), OP_EQ, 1); + /* Circuit should remain active because there is a second cell queued. */ + tt_int_op(circuitmux_is_circuit_active(chan->cmux, TO_CIRCUIT(circ)), + OP_EQ, 1); + /* Should still be attached. */ + tt_int_op(circuitmux_is_circuit_attached(chan->cmux, TO_CIRCUIT(circ)), + OP_EQ, 1); + tt_u64_op(chan->n_cells_xmitted, OP_EQ, 1); + tt_u64_op(chan->n_bytes_xmitted, OP_EQ, get_cell_network_size(0)); + + /* Flush second cell. This is going to go down the call stack. */ + old_count = test_cells_written; + flushed = channel_flush_some_cells(chan, 1); + tt_i64_op(flushed, OP_EQ, 1); + tt_int_op(test_cells_written, OP_EQ, old_count + 1); + tt_int_op(circuitmux_num_cells(chan->cmux), OP_EQ, 0); + tt_int_op(channel_more_to_flush(chan), OP_EQ, 0); + /* No more cells should make the circuit inactive. */ + tt_int_op(circuitmux_is_circuit_active(chan->cmux, TO_CIRCUIT(circ)), + OP_EQ, 0); + /* Should still be attached. */ + tt_int_op(circuitmux_is_circuit_attached(chan->cmux, TO_CIRCUIT(circ)), + OP_EQ, 1); + tt_u64_op(chan->n_cells_xmitted, OP_EQ, 2); + tt_u64_op(chan->n_bytes_xmitted, OP_EQ, get_cell_network_size(0) * 2); + + done: + if (circ) { + circuit_free_(TO_CIRCUIT(circ)); + } + tor_free(p_cell); + channel_free_all(); + UNMOCK(scheduler_release_channel); +} + +/* Test inbound cell. The callstack is: + * channel_process_cell() + * -> chan->cell_handler() + * + * This test is about checking if we can process an inbound cell down to the + * channel handler. */ +static void +test_channel_inbound_cell(void *arg) +{ + channel_t *chan = NULL; + cell_t *cell = NULL; + int old_count; + + (void) arg; + + /* The channel will be freed so we need to hijack this so the scheduler + * doesn't get confused. */ + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + + /* Accept cells to lower layer */ + test_chan_accept_cells = 1; + + chan = new_fake_channel(); + tt_assert(chan); + /* Start it off in OPENING */ + chan->state = CHANNEL_STATE_OPENING; + + /* Try to register it */ + channel_register(chan); + tt_int_op(chan->registered, OP_EQ, 1); + + /* Open it */ + channel_change_state_open(chan); + tt_int_op(chan->state, OP_EQ, CHANNEL_STATE_OPEN); + tt_int_op(chan->has_been_open, OP_EQ, 1); + + /* Receive a cell now. */ + cell = tor_malloc_zero(sizeof(*cell)); + make_fake_cell(cell); + old_count = test_chan_fixed_cells_recved; + channel_process_cell(chan, cell); + tt_int_op(test_chan_fixed_cells_recved, OP_EQ, old_count); + tt_assert(monotime_coarse_is_zero(&chan->timestamp_xfer)); + tt_u64_op(chan->timestamp_active, OP_EQ, 0); + tt_u64_op(chan->timestamp_recv, OP_EQ, 0); + + /* Setup incoming cell handlers. We don't care about var cell, the channel + * layers is not handling those. */ + channel_set_cell_handlers(chan, chan_test_cell_handler, NULL); + tt_ptr_op(chan->cell_handler, OP_EQ, chan_test_cell_handler); + /* Now process the cell, we should see it. */ + old_count = test_chan_fixed_cells_recved; + channel_process_cell(chan, cell); + tt_int_op(test_chan_fixed_cells_recved, OP_EQ, old_count + 1); + /* We should have a series of timestamp set. */ + tt_assert(!monotime_coarse_is_zero(&chan->timestamp_xfer)); + tt_u64_op(chan->timestamp_active, OP_NE, 0); + tt_u64_op(chan->timestamp_recv, OP_NE, 0); + tt_assert(monotime_coarse_is_zero(&chan->next_padding_time)); + tt_u64_op(chan->n_cells_recved, OP_EQ, 1); + tt_u64_op(chan->n_bytes_recved, OP_EQ, get_cell_network_size(0)); + + /* Close it */ + old_count = test_close_called; + channel_mark_for_close(chan); + tt_int_op(chan->state, OP_EQ, CHANNEL_STATE_CLOSING); + tt_int_op(chan->reason_for_closing, OP_EQ, CHANNEL_CLOSE_REQUESTED); + tt_int_op(test_close_called, OP_EQ, old_count + 1); + + /* This closes the channe so it calls in the scheduler, make sure of it. */ + old_count = test_releases_count; + chan_test_finish_close(chan); + tt_int_op(test_releases_count, OP_EQ, old_count + 1); + tt_int_op(chan->state, OP_EQ, CHANNEL_STATE_CLOSED); + + /* The channel will be free, lets make sure it is not accessible. */ + uint64_t chan_id = chan->global_identifier; + tt_ptr_op(channel_find_by_global_id(chan_id), OP_EQ, chan); + channel_run_cleanup(); + chan = channel_find_by_global_id(chan_id); + tt_assert(chan == NULL); + + done: + tor_free(cell); + UNMOCK(scheduler_release_channel); +} + +/** + * Normal channel lifecycle test: + * + * OPENING->OPEN->MAINT->OPEN->CLOSING->CLOSED + */ + +static void +test_channel_lifecycle(void *arg) +{ + channel_t *ch1 = NULL, *ch2 = NULL; + packed_cell_t *p_cell = NULL; + int old_count, init_doesnt_want_writes_count; + int init_releases_count; + + (void)arg; + + /* Mock these for the whole lifecycle test */ + MOCK(scheduler_channel_doesnt_want_writes, + scheduler_channel_doesnt_want_writes_mock); + MOCK(scheduler_release_channel, + scheduler_release_channel_mock); + + /* Cache some initial counter values */ + init_doesnt_want_writes_count = test_doesnt_want_writes_count; + init_releases_count = test_releases_count; + + /* Accept cells to lower layer */ + test_chan_accept_cells = 1; + + ch1 = new_fake_channel(); + tt_assert(ch1); + /* Start it off in OPENING */ + ch1->state = CHANNEL_STATE_OPENING; + + /* Try to register it */ + channel_register(ch1); + tt_assert(ch1->registered); + + /* Try to write a cell through (should queue) */ + p_cell = packed_cell_new(); + old_count = test_cells_written; + channel_write_packed_cell(ch1, p_cell); + tt_int_op(old_count, OP_EQ, test_cells_written); + + /* Move it to OPEN and flush */ + channel_change_state_open(ch1); + +/* Get another one */ + ch2 = new_fake_channel(); + tt_assert(ch2); + ch2->state = CHANNEL_STATE_OPENING; + + /* Register */ + channel_register(ch2); + tt_assert(ch2->registered); + + /* Check counters */ + tt_int_op(test_doesnt_want_writes_count, OP_EQ, + init_doesnt_want_writes_count); + tt_int_op(test_releases_count, OP_EQ, init_releases_count); + + /* Move ch1 to MAINT */ + channel_change_state(ch1, CHANNEL_STATE_MAINT); + tt_int_op(test_doesnt_want_writes_count, OP_EQ, + init_doesnt_want_writes_count + 1); + tt_int_op(test_releases_count, OP_EQ, init_releases_count); + + /* Move ch2 to OPEN */ + channel_change_state_open(ch2); + tt_int_op(test_doesnt_want_writes_count, OP_EQ, + init_doesnt_want_writes_count + 1); + tt_int_op(test_releases_count, OP_EQ, init_releases_count); + + /* Move ch1 back to OPEN */ + channel_change_state_open(ch1); + tt_int_op(test_doesnt_want_writes_count, OP_EQ, + init_doesnt_want_writes_count + 1); + tt_int_op(test_releases_count, OP_EQ, init_releases_count); + + /* Mark ch2 for close */ + channel_mark_for_close(ch2); + tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSING); + tt_int_op(test_doesnt_want_writes_count, OP_EQ, + init_doesnt_want_writes_count + 1); + tt_int_op(test_releases_count, OP_EQ, init_releases_count + 1); + + /* Shut down channels */ + channel_free_all(); + ch1 = ch2 = NULL; + tt_int_op(test_doesnt_want_writes_count, OP_EQ, + init_doesnt_want_writes_count + 1); + /* channel_free() calls scheduler_release_channel() */ + tt_int_op(test_releases_count, OP_EQ, init_releases_count + 4); + + done: + free_fake_channel(ch1); + free_fake_channel(ch2); + + UNMOCK(scheduler_channel_doesnt_want_writes); + UNMOCK(scheduler_release_channel); +} + +/** + * Weird channel lifecycle test: + * + * OPENING->CLOSING->CLOSED + * OPENING->OPEN->CLOSING->ERROR + * OPENING->OPEN->MAINT->CLOSING->CLOSED + * OPENING->OPEN->MAINT->CLOSING->ERROR + */ + +static void +test_channel_lifecycle_2(void *arg) +{ + channel_t *ch = NULL; + + (void)arg; + + /* Mock these for the whole lifecycle test */ + MOCK(scheduler_channel_doesnt_want_writes, + scheduler_channel_doesnt_want_writes_mock); + MOCK(scheduler_release_channel, + scheduler_release_channel_mock); + + /* Accept cells to lower layer */ + test_chan_accept_cells = 1; + + ch = new_fake_channel(); + tt_assert(ch); + /* Start it off in OPENING */ + ch->state = CHANNEL_STATE_OPENING; + + /* Try to register it */ + channel_register(ch); + tt_assert(ch->registered); + + /* Try to close it */ + channel_mark_for_close(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); + + /* Finish closing it */ + chan_test_finish_close(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED); + channel_run_cleanup(); + ch = NULL; + + /* Now try OPENING->OPEN->CLOSING->ERROR */ + ch = new_fake_channel(); + tt_assert(ch); + ch->state = CHANNEL_STATE_OPENING; + channel_register(ch); + tt_assert(ch->registered); + + /* Finish opening it */ + channel_change_state_open(ch); + + /* Error exit from lower layer */ + chan_test_error(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); + chan_test_finish_close(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_ERROR); + channel_run_cleanup(); + ch = NULL; + + /* OPENING->OPEN->MAINT->CLOSING->CLOSED close from maintenance state */ + ch = new_fake_channel(); + tt_assert(ch); + ch->state = CHANNEL_STATE_OPENING; + channel_register(ch); + tt_assert(ch->registered); + + /* Finish opening it */ + channel_change_state_open(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_OPEN); + + /* Go to maintenance state */ + channel_change_state(ch, CHANNEL_STATE_MAINT); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_MAINT); + + /* Lower layer close */ + channel_mark_for_close(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); + + /* Finish */ + chan_test_finish_close(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED); + channel_run_cleanup(); + ch = NULL; + + /* + * OPENING->OPEN->MAINT->CLOSING->CLOSED lower-layer close during + * maintenance state + */ + ch = new_fake_channel(); + tt_assert(ch); + ch->state = CHANNEL_STATE_OPENING; + channel_register(ch); + tt_assert(ch->registered); + + /* Finish opening it */ + channel_change_state_open(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_OPEN); + + /* Go to maintenance state */ + channel_change_state(ch, CHANNEL_STATE_MAINT); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_MAINT); + + /* Lower layer close */ + channel_close_from_lower_layer(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); + + /* Finish */ + chan_test_finish_close(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED); + channel_run_cleanup(); + ch = NULL; + + /* OPENING->OPEN->MAINT->CLOSING->ERROR */ + ch = new_fake_channel(); + tt_assert(ch); + ch->state = CHANNEL_STATE_OPENING; + channel_register(ch); + tt_assert(ch->registered); + + /* Finish opening it */ + channel_change_state_open(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_OPEN); + + /* Go to maintenance state */ + channel_change_state(ch, CHANNEL_STATE_MAINT); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_MAINT); + + /* Lower layer close */ + chan_test_error(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); + + /* Finish */ + chan_test_finish_close(ch); + tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_ERROR); + channel_run_cleanup(); + ch = NULL; + + /* Shut down channels */ + channel_free_all(); + + done: + tor_free(ch); + + UNMOCK(scheduler_channel_doesnt_want_writes); + UNMOCK(scheduler_release_channel); + + return; +} + +static void +test_channel_id_map(void *arg) +{ + (void)arg; +#define N_CHAN 6 + char rsa_id[N_CHAN][DIGEST_LEN]; + ed25519_public_key_t *ed_id[N_CHAN]; + channel_t *chan[N_CHAN]; + int i; + ed25519_public_key_t ed_zero; + memset(&ed_zero, 0, sizeof(ed_zero)); + + tt_int_op(DIGEST_LEN, OP_EQ, sizeof(rsa_id[0])); // Do I remember C? + + for (i = 0; i < N_CHAN; ++i) { + crypto_rand(rsa_id[i], DIGEST_LEN); + ed_id[i] = tor_malloc_zero(sizeof(*ed_id[i])); + crypto_rand((char*)ed_id[i]->pubkey, sizeof(ed_id[i]->pubkey)); + } + + /* For channel 3, have no Ed identity. */ + tor_free(ed_id[3]); + + /* Channel 2 and 4 have same ROSA identity */ + memcpy(rsa_id[4], rsa_id[2], DIGEST_LEN); + + /* Channel 2 and 4 and 5 have same RSA identity */ + memcpy(rsa_id[4], rsa_id[2], DIGEST_LEN); + memcpy(rsa_id[5], rsa_id[2], DIGEST_LEN); + + /* Channels 2 and 5 have same Ed25519 identity */ + memcpy(ed_id[5], ed_id[2], sizeof(*ed_id[2])); + + for (i = 0; i < N_CHAN; ++i) { + chan[i] = new_fake_channel(); + channel_register(chan[i]); + channel_set_identity_digest(chan[i], rsa_id[i], ed_id[i]); + } + + /* Lookup by RSA id only */ + tt_ptr_op(chan[0], OP_EQ, + channel_find_by_remote_identity(rsa_id[0], NULL)); + tt_ptr_op(chan[1], OP_EQ, + channel_find_by_remote_identity(rsa_id[1], NULL)); + tt_ptr_op(chan[3], OP_EQ, + channel_find_by_remote_identity(rsa_id[3], NULL)); + channel_t *ch; + ch = channel_find_by_remote_identity(rsa_id[2], NULL); + tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); + ch = channel_next_with_rsa_identity(ch); + tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); + ch = channel_next_with_rsa_identity(ch); + tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); + ch = channel_next_with_rsa_identity(ch); + tt_ptr_op(ch, OP_EQ, NULL); + + /* As above, but with zero Ed25519 ID (meaning "any ID") */ + tt_ptr_op(chan[0], OP_EQ, + channel_find_by_remote_identity(rsa_id[0], &ed_zero)); + tt_ptr_op(chan[1], OP_EQ, + channel_find_by_remote_identity(rsa_id[1], &ed_zero)); + tt_ptr_op(chan[3], OP_EQ, + channel_find_by_remote_identity(rsa_id[3], &ed_zero)); + ch = channel_find_by_remote_identity(rsa_id[2], &ed_zero); + tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); + ch = channel_next_with_rsa_identity(ch); + tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); + ch = channel_next_with_rsa_identity(ch); + tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); + ch = channel_next_with_rsa_identity(ch); + tt_ptr_op(ch, OP_EQ, NULL); + + /* Lookup nonexistent RSA identity */ + tt_ptr_op(NULL, OP_EQ, + channel_find_by_remote_identity("!!!!!!!!!!!!!!!!!!!!", NULL)); + + /* Look up by full identity pair */ + tt_ptr_op(chan[0], OP_EQ, + channel_find_by_remote_identity(rsa_id[0], ed_id[0])); + tt_ptr_op(chan[1], OP_EQ, + channel_find_by_remote_identity(rsa_id[1], ed_id[1])); + tt_ptr_op(chan[3], OP_EQ, + channel_find_by_remote_identity(rsa_id[3], ed_id[3] /*NULL*/)); + tt_ptr_op(chan[4], OP_EQ, + channel_find_by_remote_identity(rsa_id[4], ed_id[4])); + ch = channel_find_by_remote_identity(rsa_id[2], ed_id[2]); + tt_assert(ch == chan[2] || ch == chan[5]); + + /* Look up RSA identity with wrong ed25519 identity */ + tt_ptr_op(NULL, OP_EQ, + channel_find_by_remote_identity(rsa_id[4], ed_id[0])); + tt_ptr_op(NULL, OP_EQ, + channel_find_by_remote_identity(rsa_id[2], ed_id[1])); + tt_ptr_op(NULL, OP_EQ, + channel_find_by_remote_identity(rsa_id[3], ed_id[1])); + + done: + for (i = 0; i < N_CHAN; ++i) { + channel_clear_identity_digest(chan[i]); + channel_unregister(chan[i]); + free_fake_channel(chan[i]); + tor_free(ed_id[i]); + } +#undef N_CHAN +} + +static void +test_channel_state(void *arg) +{ + (void) arg; + + /* Test state validity. */ + tt_int_op(channel_state_is_valid(CHANNEL_STATE_CLOSED), OP_EQ, 1); + tt_int_op(channel_state_is_valid(CHANNEL_STATE_CLOSING), OP_EQ, 1); + tt_int_op(channel_state_is_valid(CHANNEL_STATE_ERROR), OP_EQ, 1); + tt_int_op(channel_state_is_valid(CHANNEL_STATE_OPEN), OP_EQ, 1); + tt_int_op(channel_state_is_valid(CHANNEL_STATE_OPENING), OP_EQ, 1); + tt_int_op(channel_state_is_valid(CHANNEL_STATE_MAINT), OP_EQ, 1); + tt_int_op(channel_state_is_valid(CHANNEL_STATE_LAST), OP_EQ, 0); + tt_int_op(channel_state_is_valid(INT_MAX), OP_EQ, 0); + + /* Test listener state validity. */ + tt_int_op(channel_listener_state_is_valid(CHANNEL_LISTENER_STATE_CLOSED), + OP_EQ, 1); + tt_int_op(channel_listener_state_is_valid(CHANNEL_LISTENER_STATE_LISTENING), + OP_EQ, 1); + tt_int_op(channel_listener_state_is_valid(CHANNEL_LISTENER_STATE_CLOSING), + OP_EQ, 1); + tt_int_op(channel_listener_state_is_valid(CHANNEL_LISTENER_STATE_ERROR), + OP_EQ, 1); + tt_int_op(channel_listener_state_is_valid(CHANNEL_LISTENER_STATE_LAST), + OP_EQ, 0); + tt_int_op(channel_listener_state_is_valid(INT_MAX), OP_EQ, 0); + + /* Test state transition. */ + tt_int_op(channel_state_can_transition(CHANNEL_STATE_CLOSED, + CHANNEL_STATE_OPENING), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_CLOSED, + CHANNEL_STATE_ERROR), OP_EQ, 0); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_CLOSING, + CHANNEL_STATE_ERROR), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_CLOSING, + CHANNEL_STATE_CLOSED), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_CLOSING, + CHANNEL_STATE_OPEN), OP_EQ, 0); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_MAINT, + CHANNEL_STATE_CLOSING), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_MAINT, + CHANNEL_STATE_ERROR), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_MAINT, + CHANNEL_STATE_OPEN), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_MAINT, + CHANNEL_STATE_OPENING), OP_EQ, 0); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPENING, + CHANNEL_STATE_OPEN), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPENING, + CHANNEL_STATE_CLOSING), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPENING, + CHANNEL_STATE_ERROR), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPEN, + CHANNEL_STATE_ERROR), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPEN, + CHANNEL_STATE_CLOSING), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPEN, + CHANNEL_STATE_ERROR), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPEN, + CHANNEL_STATE_MAINT), OP_EQ, 1); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_LAST, + CHANNEL_STATE_MAINT), OP_EQ, 0); + tt_int_op(channel_state_can_transition(CHANNEL_STATE_LAST, INT_MAX), + OP_EQ, 0); + + /* Test listener state transition. */ + tt_int_op(channel_listener_state_can_transition( + CHANNEL_LISTENER_STATE_CLOSED, + CHANNEL_LISTENER_STATE_LISTENING), + OP_EQ, 1); + tt_int_op(channel_listener_state_can_transition( + CHANNEL_LISTENER_STATE_CLOSED, + CHANNEL_LISTENER_STATE_ERROR), + OP_EQ, 0); + + tt_int_op(channel_listener_state_can_transition( + CHANNEL_LISTENER_STATE_CLOSING, + CHANNEL_LISTENER_STATE_CLOSED), + OP_EQ, 1); + + tt_int_op(channel_listener_state_can_transition( + CHANNEL_LISTENER_STATE_CLOSING, + CHANNEL_LISTENER_STATE_ERROR), + OP_EQ, 1); + tt_int_op(channel_listener_state_can_transition( + CHANNEL_LISTENER_STATE_ERROR, + CHANNEL_LISTENER_STATE_CLOSING), + OP_EQ, 0); + + tt_int_op(channel_listener_state_can_transition( + CHANNEL_LISTENER_STATE_LISTENING, + CHANNEL_LISTENER_STATE_CLOSING), + OP_EQ, 1); + tt_int_op(channel_listener_state_can_transition( + CHANNEL_LISTENER_STATE_LISTENING, + CHANNEL_LISTENER_STATE_ERROR), + OP_EQ, 1); + tt_int_op(channel_listener_state_can_transition( + CHANNEL_LISTENER_STATE_LAST, + INT_MAX), + OP_EQ, 0); + + /* Test state string. */ + tt_str_op(channel_state_to_string(CHANNEL_STATE_CLOSING), OP_EQ, + "closing"); + tt_str_op(channel_state_to_string(CHANNEL_STATE_ERROR), OP_EQ, + "channel error"); + tt_str_op(channel_state_to_string(CHANNEL_STATE_CLOSED), OP_EQ, + "closed"); + tt_str_op(channel_state_to_string(CHANNEL_STATE_OPEN), OP_EQ, + "open"); + tt_str_op(channel_state_to_string(CHANNEL_STATE_OPENING), OP_EQ, + "opening"); + tt_str_op(channel_state_to_string(CHANNEL_STATE_MAINT), OP_EQ, + "temporarily suspended for maintenance"); + tt_str_op(channel_state_to_string(CHANNEL_STATE_LAST), OP_EQ, + "unknown or invalid channel state"); + tt_str_op(channel_state_to_string(INT_MAX), OP_EQ, + "unknown or invalid channel state"); + + /* Test listener state string. */ + tt_str_op(channel_listener_state_to_string(CHANNEL_LISTENER_STATE_CLOSING), + OP_EQ, "closing"); + tt_str_op(channel_listener_state_to_string(CHANNEL_LISTENER_STATE_ERROR), + OP_EQ, "channel listener error"); + tt_str_op(channel_listener_state_to_string(CHANNEL_LISTENER_STATE_LISTENING), + OP_EQ, "listening"); + tt_str_op(channel_listener_state_to_string(CHANNEL_LISTENER_STATE_LAST), + OP_EQ, "unknown or invalid channel listener state"); + tt_str_op(channel_listener_state_to_string(INT_MAX), + OP_EQ, "unknown or invalid channel listener state"); + + done: + ; +} + +static networkstatus_t *mock_ns = NULL; + +static networkstatus_t * +mock_networkstatus_get_latest_consensus(void) +{ + return mock_ns; +} + +static void +test_channel_duplicates(void *arg) +{ + channel_t *chan = NULL; + routerstatus_t rs; + + (void) arg; + + setup_full_capture_of_logs(LOG_INFO); + /* Try a flat call with channel nor connections. */ + channel_check_for_duplicates(); + expect_log_msg_containing( + "Found 0 connections to 0 relays. Found 0 current canonical " + "connections, in 0 of which we were a non-canonical peer. " + "0 relays had more than 1 connection, 0 had more than 2, and " + "0 had more than 4 connections."); + + mock_ns = tor_malloc_zero(sizeof(*mock_ns)); + mock_ns->routerstatus_list = smartlist_new(); + MOCK(networkstatus_get_latest_consensus, + mock_networkstatus_get_latest_consensus); + + chan = new_fake_channel(); + tt_assert(chan); + chan->is_canonical = test_chan_is_canonical; + memset(chan->identity_digest, 'A', sizeof(chan->identity_digest)); + channel_add_to_digest_map(chan); + tt_ptr_op(channel_find_by_remote_identity(chan->identity_digest, NULL), + OP_EQ, chan); + + /* No relay has been associated with this channel. */ + channel_check_for_duplicates(); + expect_log_msg_containing( + "Found 0 connections to 0 relays. Found 0 current canonical " + "connections, in 0 of which we were a non-canonical peer. " + "0 relays had more than 1 connection, 0 had more than 2, and " + "0 had more than 4 connections."); + + /* Associate relay to this connection in the consensus. */ + memset(&rs, 0, sizeof(rs)); + memset(rs.identity_digest, 'A', sizeof(rs.identity_digest)); + smartlist_add(mock_ns->routerstatus_list, &rs); + + /* Non opened channel. */ + chan->state = CHANNEL_STATE_CLOSING; + channel_check_for_duplicates(); + expect_log_msg_containing( + "Found 0 connections to 0 relays. Found 0 current canonical " + "connections, in 0 of which we were a non-canonical peer. " + "0 relays had more than 1 connection, 0 had more than 2, and " + "0 had more than 4 connections."); + chan->state = CHANNEL_STATE_OPEN; + + channel_check_for_duplicates(); + expect_log_msg_containing( + "Found 1 connections to 1 relays. Found 0 current canonical " + "connections, in 0 of which we were a non-canonical peer. " + "0 relays had more than 1 connection, 0 had more than 2, and " + "0 had more than 4 connections."); + + test_chan_should_be_canonical = 1; + channel_check_for_duplicates(); + expect_log_msg_containing( + "Found 1 connections to 1 relays. Found 1 current canonical " + "connections, in 1 of which we were a non-canonical peer. " + "0 relays had more than 1 connection, 0 had more than 2, and " + "0 had more than 4 connections."); + teardown_capture_of_logs(); + + done: + free_fake_channel(chan); + smartlist_clear(mock_ns->routerstatus_list); + networkstatus_vote_free(mock_ns); + UNMOCK(networkstatus_get_latest_consensus); +} + +static void +test_channel_for_extend(void *arg) +{ + channel_t *chan1 = NULL, *chan2 = NULL; + channel_t *ret_chan = NULL; + char digest[DIGEST_LEN]; + ed25519_public_key_t ed_id; + tor_addr_t addr; + const char *msg; + int launch; + time_t now = time(NULL); + + (void) arg; + + memset(digest, 'A', sizeof(digest)); + memset(&ed_id, 'B', sizeof(ed_id)); + + chan1 = new_fake_channel(); + tt_assert(chan1); + /* Need to be registered to get added to the id map. */ + channel_register(chan1); + tt_int_op(chan1->registered, OP_EQ, 1); + /* We need those for the test. */ + chan1->is_canonical = test_chan_is_canonical; + chan1->matches_target = test_chan_matches_target; + chan1->timestamp_created = now - 9; + + chan2 = new_fake_channel(); + tt_assert(chan2); + /* Need to be registered to get added to the id map. */ + channel_register(chan2); + tt_int_op(chan2->registered, OP_EQ, 1); + /* We need those for the test. */ + chan2->is_canonical = test_chan_is_canonical; + chan2->matches_target = test_chan_matches_target; + /* Make it older than chan1. */ + chan2->timestamp_created = chan1->timestamp_created - 1; + + /* Set channel identities and add it to the channel map. The last one to be + * added is made the first one in the list so the lookup will always return + * that one first. */ + channel_set_identity_digest(chan2, digest, &ed_id); + channel_set_identity_digest(chan1, digest, &ed_id); + tt_ptr_op(channel_find_by_remote_identity(digest, NULL), OP_EQ, chan1); + tt_ptr_op(channel_find_by_remote_identity(digest, &ed_id), OP_EQ, chan1); + + /* The expected result is chan2 because it is older than chan1. */ + ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); + tt_assert(ret_chan); + tt_ptr_op(ret_chan, OP_EQ, chan2); + tt_int_op(launch, OP_EQ, 0); + tt_str_op(msg, OP_EQ, "Connection is fine; using it."); + + /* Switch that around from previous test. */ + chan2->timestamp_created = chan1->timestamp_created + 1; + ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); + tt_assert(ret_chan); + tt_ptr_op(ret_chan, OP_EQ, chan1); + tt_int_op(launch, OP_EQ, 0); + tt_str_op(msg, OP_EQ, "Connection is fine; using it."); + + /* Same creation time, num circuits will be used and they both have 0 so the + * channel 2 should be picked due to how channel_is_better() work. */ + chan2->timestamp_created = chan1->timestamp_created; + ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); + tt_assert(ret_chan); + tt_ptr_op(ret_chan, OP_EQ, chan1); + tt_int_op(launch, OP_EQ, 0); + tt_str_op(msg, OP_EQ, "Connection is fine; using it."); + + /* For the rest of the tests, we need channel 1 to be the older. */ + chan2->timestamp_created = chan1->timestamp_created + 1; + + /* Condemned the older channel. */ + chan1->state = CHANNEL_STATE_CLOSING; + ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); + tt_assert(ret_chan); + tt_ptr_op(ret_chan, OP_EQ, chan2); + tt_int_op(launch, OP_EQ, 0); + tt_str_op(msg, OP_EQ, "Connection is fine; using it."); + chan1->state = CHANNEL_STATE_OPEN; + + /* Make the older channel a client one. */ + channel_mark_client(chan1); + ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); + tt_assert(ret_chan); + tt_ptr_op(ret_chan, OP_EQ, chan2); + tt_int_op(launch, OP_EQ, 0); + tt_str_op(msg, OP_EQ, "Connection is fine; using it."); + channel_clear_client(chan1); + + /* Non matching ed identity with valid digest. */ + ed25519_public_key_t dumb_ed_id; + memset(&dumb_ed_id, 0, sizeof(dumb_ed_id)); + ret_chan = channel_get_for_extend(digest, &dumb_ed_id, &addr, &msg, + &launch); + tt_assert(!ret_chan); + tt_str_op(msg, OP_EQ, "Not connected. Connecting."); + tt_int_op(launch, OP_EQ, 1); + + /* Opening channel, we'll check if the target address matches. */ + test_chan_should_match_target = 1; + chan1->state = CHANNEL_STATE_OPENING; + chan2->state = CHANNEL_STATE_OPENING; + ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); + tt_assert(!ret_chan); + tt_str_op(msg, OP_EQ, "Connection in progress; waiting."); + tt_int_op(launch, OP_EQ, 0); + chan1->state = CHANNEL_STATE_OPEN; + chan2->state = CHANNEL_STATE_OPEN; + + /* Mark channel 1 as bad for circuits. */ + channel_mark_bad_for_new_circs(chan1); + ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); + tt_assert(ret_chan); + tt_ptr_op(ret_chan, OP_EQ, chan2); + tt_int_op(launch, OP_EQ, 0); + tt_str_op(msg, OP_EQ, "Connection is fine; using it."); + chan1->is_bad_for_new_circs = 0; + + /* Mark both channels as unusable. */ + channel_mark_bad_for_new_circs(chan1); + channel_mark_bad_for_new_circs(chan2); + ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); + tt_assert(!ret_chan); + tt_str_op(msg, OP_EQ, "Connections all too old, or too non-canonical. " + " Launching a new one."); + tt_int_op(launch, OP_EQ, 1); + chan1->is_bad_for_new_circs = 0; + chan2->is_bad_for_new_circs = 0; + + /* Non canonical channels. */ + test_chan_should_match_target = 0; + test_chan_canonical_should_be_reliable = 1; + ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); + tt_assert(!ret_chan); + tt_str_op(msg, OP_EQ, "Connections all too old, or too non-canonical. " + " Launching a new one."); + tt_int_op(launch, OP_EQ, 1); + + done: + free_fake_channel(chan1); + free_fake_channel(chan2); +} + +static void +test_channel_listener(void *arg) +{ + int old_count; + time_t now = time(NULL); + channel_listener_t *chan = NULL; + + (void) arg; + + chan = tor_malloc_zero(sizeof(*chan)); + tt_assert(chan); + channel_init_listener(chan); + tt_u64_op(chan->global_identifier, OP_EQ, 1); + tt_int_op(chan->timestamp_created, OP_GE, now); + chan->close = test_chan_listener_close; + + /* Register it. At this point, it is not open so it will be put in the + * finished list. */ + channel_listener_register(chan); + tt_int_op(chan->registered, OP_EQ, 1); + channel_listener_unregister(chan); + + /* Register it as listening now thus active. */ + chan->state = CHANNEL_LISTENER_STATE_LISTENING; + channel_listener_register(chan); + tt_int_op(chan->registered, OP_EQ, 1); + + /* Set the listener function. */ + channel_listener_set_listener_fn(chan, test_chan_listener_fn); + tt_ptr_op(chan->listener, OP_EQ, test_chan_listener_fn); + + /* Put a channel in the listener incoming list and queue it. + * function. By doing this, the listener() handler will be called. */ + channel_t *in_chan = new_fake_channel(); + old_count = test_chan_listener_fn_called; + channel_listener_queue_incoming(chan, in_chan); + free_fake_channel(in_chan); + tt_int_op(test_chan_listener_fn_called, OP_EQ, old_count + 1); + + /* Put listener channel in CLOSING state. */ + old_count = test_chan_listener_close_fn_called; + channel_listener_mark_for_close(chan); + tt_int_op(test_chan_listener_close_fn_called, OP_EQ, old_count + 1); + channel_listener_change_state(chan, CHANNEL_LISTENER_STATE_CLOSED); + + /* Dump stats so we at least hit the code path. */ + chan->describe_transport = test_chan_listener_describe_transport; + /* There is a check for "now > timestamp_created" when dumping the stats so + * make sure we go in. */ + chan->timestamp_created = now - 10; + channel_listener_dump_statistics(chan, LOG_INFO); + + done: + channel_free_all(); +} + +struct testcase_t channel_tests[] = { + { "inbound_cell", test_channel_inbound_cell, TT_FORK, + NULL, NULL }, + { "outbound_cell", test_channel_outbound_cell, TT_FORK, + NULL, NULL }, + { "id_map", test_channel_id_map, TT_FORK, + NULL, NULL }, + { "lifecycle", test_channel_lifecycle, TT_FORK, + NULL, NULL }, + { "lifecycle_2", test_channel_lifecycle_2, TT_FORK, + NULL, NULL }, + { "dumpstats", test_channel_dumpstats, TT_FORK, + NULL, NULL }, + { "state", test_channel_state, TT_FORK, + NULL, NULL }, + { "duplicates", test_channel_duplicates, TT_FORK, + NULL, NULL }, + { "get_channel_for_extend", test_channel_for_extend, TT_FORK, + NULL, NULL }, + { "listener", test_channel_listener, TT_FORK, + NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_channelpadding.c b/src/wraith/src/test/test_channelpadding.c new file mode 100644 index 000000000..4cc33cbe7 --- /dev/null +++ b/src/wraith/src/test/test_channelpadding.c @@ -0,0 +1,1163 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define TOR_CHANNEL_INTERNAL_ +#define MAIN_PRIVATE +#define NETWORKSTATUS_PRIVATE +#define TOR_TIMERS_PRIVATE +#include "or.h" +#include "test.h" +#include "testsupport.h" +#include "connection.h" +#include "connection_or.h" +#include "channel.h" +#include "channeltls.h" +#include "channelpadding.h" +#include "compat_libevent.h" +#include "config.h" +#include +#include "compat_time.h" +#include "main.h" +#include "networkstatus.h" +#include "log_test_helpers.h" + +int channelpadding_get_netflow_inactive_timeout_ms(channel_t *chan); +int64_t channelpadding_compute_time_until_pad_for_netflow(channel_t *chan); +int channelpadding_send_disable_command(channel_t*); +int channelpadding_find_timerslot(channel_t *chan); + +void test_channelpadding_timers(void *arg); +void test_channelpadding_consensus(void *arg); +void test_channelpadding_negotiation(void *arg); +void test_channelpadding_decide_to_pad_channel(void *arg); +void test_channelpadding_killonehop(void *arg); + +void dummy_nop_timer(void); + +#define NSEC_PER_MSEC (1000*1000) + +/* Thing to cast to fake tor_tls_t * to appease assert_connection_ok() */ +static int fake_tortls = 0; /* Bleh... */ + +static int dont_stop_libevent = 0; + +// From test_channel.c +channel_t * new_fake_channel(void); +void free_fake_channel(channel_t*); + +static int +mock_channel_has_queued_writes(channel_t *chan) +{ + (void)chan; + return 0; +} + +static int tried_to_write_cell = 0; + +static channel_t *relay1_relay2; +static channel_t *relay2_relay1; +static channel_t *relay3_client; +static channel_t *client_relay3; + +static int +mock_channel_write_cell_relay2(channel_t *chan, cell_t *cell) +{ + (void)chan; + tried_to_write_cell++; + channel_tls_handle_cell(cell, ((channel_tls_t*)relay1_relay2)->conn); + event_base_loopbreak(tor_libevent_get_base()); + return 0; +} + +static int +mock_channel_write_cell_relay1(channel_t *chan, cell_t *cell) +{ + (void)chan; + tried_to_write_cell++; + channel_tls_handle_cell(cell, ((channel_tls_t*)relay2_relay1)->conn); + event_base_loopbreak(tor_libevent_get_base()); + return 0; +} + +static int +mock_channel_write_cell_relay3(channel_t *chan, cell_t *cell) +{ + (void)chan; + tried_to_write_cell++; + channel_tls_handle_cell(cell, ((channel_tls_t*)client_relay3)->conn); + event_base_loopbreak(tor_libevent_get_base()); + return 0; +} + +static int +mock_channel_write_cell_client(channel_t *chan, cell_t *cell) +{ + (void)chan; + tried_to_write_cell++; + channel_tls_handle_cell(cell, ((channel_tls_t*)relay3_client)->conn); + event_base_loopbreak(tor_libevent_get_base()); + return 0; +} + +static int +mock_channel_write_cell(channel_t *chan, cell_t *cell) +{ + tried_to_write_cell++; + channel_tls_handle_cell(cell, ((channel_tls_t*)chan)->conn); + if (!dont_stop_libevent) + event_base_loopbreak(tor_libevent_get_base()); + return 0; +} + +static void +setup_fake_connection_for_channel(channel_tls_t *chan) +{ + or_connection_t *conn = (or_connection_t*)connection_new(CONN_TYPE_OR, + AF_INET); + + conn->base_.conn_array_index = smartlist_len(connection_array); + smartlist_add(connection_array, conn); + + conn->chan = chan; + chan->conn = conn; + + conn->base_.magic = OR_CONNECTION_MAGIC; + conn->base_.state = OR_CONN_STATE_OPEN; + conn->base_.type = CONN_TYPE_OR; + conn->base_.socket_family = AF_INET; + conn->base_.address = tor_strdup(""); + + conn->base_.port = 4242; + + conn->tls = (tor_tls_t *)((void *)(&fake_tortls)); + + conn->link_proto = MIN_LINK_PROTO_FOR_CHANNEL_PADDING; + + connection_or_set_canonical(conn, 1); +} + +static channel_tls_t * +new_fake_channeltls(uint8_t id) +{ + channel_tls_t *chan = tor_realloc(new_fake_channel(), sizeof(channel_tls_t)); + chan->base_.magic = TLS_CHAN_MAGIC; + setup_fake_connection_for_channel(chan); + chan->base_.channel_usage = CHANNEL_USED_FOR_FULL_CIRCS; + chan->base_.has_queued_writes = mock_channel_has_queued_writes; + chan->base_.write_cell = mock_channel_write_cell; + chan->base_.padding_enabled = 1; + + chan->base_.identity_digest[0] = id; + channel_register(&chan->base_); + + return chan; +} + +static void +free_fake_channeltls(channel_tls_t *chan) +{ + channel_unregister(&chan->base_); + + tor_free(((channel_tls_t*)chan)->conn->base_.address); + buf_free(((channel_tls_t*)chan)->conn->base_.inbuf); + buf_free(((channel_tls_t*)chan)->conn->base_.outbuf); + tor_free(((channel_tls_t*)chan)->conn); + + timer_free(chan->base_.padding_timer); + channel_handle_free(chan->base_.timer_handle); + channel_handles_clear(&chan->base_); + + free_fake_channel(&chan->base_); + + return; +} + +static void +setup_mock_consensus(void) +{ + current_md_consensus = current_ns_consensus + = tor_malloc_zero(sizeof(networkstatus_t)); + current_md_consensus->net_params = smartlist_new(); + current_md_consensus->routerstatus_list = smartlist_new(); + channelpadding_new_consensus_params(current_md_consensus); +} + +static void +free_mock_consensus(void) +{ + SMARTLIST_FOREACH(current_md_consensus->routerstatus_list, void *, r, + tor_free(r)); + smartlist_free(current_md_consensus->routerstatus_list); + smartlist_free(current_ns_consensus->net_params); + tor_free(current_ns_consensus); +} + +static void +setup_mock_network(void) +{ + routerstatus_t *relay; + if (!connection_array) + connection_array = smartlist_new(); + + relay1_relay2 = (channel_t*)new_fake_channeltls(2); + relay1_relay2->write_cell = mock_channel_write_cell_relay1; + channel_timestamp_active(relay1_relay2); + relay = tor_malloc_zero(sizeof(routerstatus_t)); + relay->identity_digest[0] = 1; + smartlist_add(current_md_consensus->routerstatus_list, relay); + + relay2_relay1 = (channel_t*)new_fake_channeltls(1); + relay2_relay1->write_cell = mock_channel_write_cell_relay2; + channel_timestamp_active(relay2_relay1); + relay = tor_malloc_zero(sizeof(routerstatus_t)); + relay->identity_digest[0] = 2; + smartlist_add(current_md_consensus->routerstatus_list, relay); + + relay3_client = (channel_t*)new_fake_channeltls(0); + relay3_client->write_cell = mock_channel_write_cell_relay3; + relay3_client->is_client = 1; + channel_timestamp_active(relay3_client); + relay = tor_malloc_zero(sizeof(routerstatus_t)); + relay->identity_digest[0] = 3; + smartlist_add(current_md_consensus->routerstatus_list, relay); + + client_relay3 = (channel_t*)new_fake_channeltls(3); + client_relay3->write_cell = mock_channel_write_cell_client; + channel_timestamp_active(client_relay3); + + channel_do_open_actions(relay1_relay2); + channel_do_open_actions(relay2_relay1); + channel_do_open_actions(relay3_client); + channel_do_open_actions(client_relay3); +} + +static void +free_mock_network(void) +{ + free_fake_channeltls((channel_tls_t*)relay1_relay2); + free_fake_channeltls((channel_tls_t*)relay2_relay1); + free_fake_channeltls((channel_tls_t*)relay3_client); + free_fake_channeltls((channel_tls_t*)client_relay3); + + smartlist_free(connection_array); +} + +static void +dummy_timer_cb(tor_timer_t *t, void *arg, const monotime_t *now_mono) +{ + (void)t; (void)arg; (void)now_mono; + event_base_loopbreak(tor_libevent_get_base()); + return; +} + +// This hack adds a dummy timer so that the libevent base loop +// actually returns when we don't expect any timers to fire. Otherwise, +// the global_timer_event gets scheduled an hour from now, and the +// base loop never returns. +void +dummy_nop_timer(void) +{ + tor_timer_t *dummy_timer = timer_new(dummy_timer_cb, NULL); + struct timeval timeout; + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + timer_schedule(dummy_timer, &timeout); + + event_base_loop(tor_libevent_get_base(), 0); + timer_free(dummy_timer); +} + +#define CHANNELPADDING_MAX_TIMERS 25 +#define CHANNELS_TO_TEST (CHANNELPADDING_MAX_TIMERS*4) +/** + * Tests to ensure that we handle more than the max number of pending + * timers properly. + */ +void +test_channelpadding_timers(void *arg) +{ + channelpadding_decision_t decision; + channel_t *chans[CHANNELS_TO_TEST]; + (void)arg; + + tor_libevent_postfork(); + + if (!connection_array) + connection_array = smartlist_new(); + + monotime_init(); + monotime_enable_test_mocking(); + uint64_t nsec_mock = 1; + monotime_set_mock_time_nsec(nsec_mock); + monotime_coarse_set_mock_time_nsec(nsec_mock); + + timers_initialize(); + channelpadding_new_consensus_params(NULL); + + for (int i = 0; i < CHANNELS_TO_TEST; i++) { + chans[i] = (channel_t*)new_fake_channeltls(0); + channel_timestamp_active(chans[i]); + } + + for (int j = 0; j < 2; j++) { + tried_to_write_cell = 0; + int i = 0; + + monotime_coarse_t now; + monotime_coarse_get(&now); + + /* This loop fills our timerslot array with timers of increasing time + * until they fire */ + for (; i < CHANNELPADDING_MAX_TIMERS; i++) { + monotime_coarse_add_msec(&chans[i]->next_padding_time, + &now, 10 + i*4); + decision = channelpadding_decide_to_pad_channel(chans[i]); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(chans[i]->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + } + + /* This loop should add timers to the first position in the timerslot + * array, since its timeout is before all other timers. */ + for (; i < CHANNELS_TO_TEST/3; i++) { + monotime_coarse_add_msec(&chans[i]->next_padding_time, + &now, 1); + decision = channelpadding_decide_to_pad_channel(chans[i]); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(chans[i]->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + } + + /* This loop should add timers to our existing lists in a weak + * pseudorandom pattern. It ensures that the lists can grow with multiple + * timers in them. */ + for (; i < CHANNELS_TO_TEST/2; i++) { + monotime_coarse_add_msec(&chans[i]->next_padding_time, + &now, 10 + i*3 % CHANNELPADDING_MAX_TIMERS); + decision = channelpadding_decide_to_pad_channel(chans[i]); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(chans[i]->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + } + + /* This loop should add timers to the last position in the timerslot + * array, since its timeout is after all other timers. */ + for (; i < CHANNELS_TO_TEST; i++) { + monotime_coarse_add_msec(&chans[i]->next_padding_time, + &now, 500 + i % CHANNELPADDING_MAX_TIMERS); + decision = channelpadding_decide_to_pad_channel(chans[i]); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(chans[i]->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + } + + // Wait for the timers and then kill the event loop. + nsec_mock += 1001 * NSEC_PER_MSEC; + monotime_coarse_set_mock_time_nsec(nsec_mock); + monotime_set_mock_time_nsec(nsec_mock); + timers_run_pending(); + + tt_int_op(tried_to_write_cell, OP_EQ, CHANNELS_TO_TEST); + + // Test that we have no pending callbacks and all empty slots now + for (i = 0; i < CHANNELS_TO_TEST; i++) { + tt_assert(!chans[i]->pending_padding_callback); + } + } + + done: + for (int i = 0; i < CHANNELS_TO_TEST; i++) { + free_fake_channeltls((channel_tls_t*)chans[i]); + } + smartlist_free(connection_array); + + timers_shutdown(); + monotime_disable_test_mocking(); + channel_free_all(); + + return; +} + +void +test_channelpadding_killonehop(void *arg) +{ + channelpadding_decision_t decision; + int64_t new_time; + (void)arg; + tor_libevent_postfork(); + + routerstatus_t *relay = tor_malloc_zero(sizeof(routerstatus_t)); + monotime_init(); + monotime_enable_test_mocking(); + monotime_set_mock_time_nsec(1); + monotime_coarse_set_mock_time_nsec(1); + new_time = 1; + + timers_initialize(); + setup_mock_consensus(); + setup_mock_network(); + + /* Do we disable padding if tor2webmode or rsos are enabled, and + * the consensus says don't pad? */ + + /* Ensure we can kill tor2web and rsos padding if we want. */ + // First, test that padding works if either is enabled + smartlist_clear(current_md_consensus->net_params); + channelpadding_new_consensus_params(current_md_consensus); + + monotime_coarse_t now; + monotime_coarse_get(&now); + + tried_to_write_cell = 0; + get_options_mutable()->Tor2webMode = 1; + monotime_coarse_add_msec(&client_relay3->next_padding_time, &now, 100); + decision = channelpadding_decide_to_pad_channel(client_relay3); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(client_relay3->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + + decision = channelpadding_decide_to_pad_channel(client_relay3); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_ALREADY_SCHEDULED); + + // Wait for the timer + new_time += 101*NSEC_PER_MSEC; + monotime_coarse_set_mock_time_nsec(new_time); + monotime_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!client_relay3->pending_padding_callback); + + // Then test disabling each via consensus param + smartlist_add(current_md_consensus->net_params, + (void*)"nf_pad_tor2web=0"); + channelpadding_new_consensus_params(current_md_consensus); + + // Before the client tries to pad, the relay will still pad: + tried_to_write_cell = 0; + monotime_coarse_add_msec(&relay3_client->next_padding_time, &now, 100); + get_options_mutable()->ORPort_set = 1; + get_options_mutable()->Tor2webMode = 0; + decision = channelpadding_decide_to_pad_channel(relay3_client); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(relay3_client->pending_padding_callback); + + // Wait for the timer + new_time += 101*NSEC_PER_MSEC; + monotime_coarse_set_mock_time_nsec(new_time); + monotime_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!client_relay3->pending_padding_callback); + + // Test client side (it should stop immediately, but send a negotiate) + tried_to_write_cell = 0; + tt_assert(relay3_client->padding_enabled); + tt_assert(client_relay3->padding_enabled); + get_options_mutable()->Tor2webMode = 1; + /* For the relay to recieve the negotiate: */ + get_options_mutable()->ORPort_set = 1; + decision = channelpadding_decide_to_pad_channel(client_relay3); + tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!client_relay3->pending_padding_callback); + tt_assert(!relay3_client->padding_enabled); + + // Test relay side (it should have gotten the negotiation to disable) + get_options_mutable()->ORPort_set = 1; + get_options_mutable()->Tor2webMode = 0; + tt_int_op(channelpadding_decide_to_pad_channel(relay3_client), OP_EQ, + CHANNELPADDING_WONTPAD); + tt_assert(!relay3_client->padding_enabled); + + /* Repeat for SOS */ + // First, test that padding works if either is enabled + smartlist_clear(current_md_consensus->net_params); + channelpadding_new_consensus_params(current_md_consensus); + + relay3_client->padding_enabled = 1; + client_relay3->padding_enabled = 1; + + tried_to_write_cell = 0; + get_options_mutable()->ORPort_set = 0; + get_options_mutable()->HiddenServiceSingleHopMode = 1; + get_options_mutable()->HiddenServiceNonAnonymousMode = 1; + + monotime_coarse_add_msec(&client_relay3->next_padding_time, &now, 100); + decision = channelpadding_decide_to_pad_channel(client_relay3); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(client_relay3->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + + decision = channelpadding_decide_to_pad_channel(client_relay3); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_ALREADY_SCHEDULED); + + // Wait for the timer + new_time += 101 * NSEC_PER_MSEC; + monotime_coarse_set_mock_time_nsec(new_time); + monotime_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!client_relay3->pending_padding_callback); + + // Then test disabling each via consensus param + smartlist_add(current_md_consensus->net_params, + (void*)"nf_pad_single_onion=0"); + channelpadding_new_consensus_params(current_md_consensus); + + // Before the client tries to pad, the relay will still pad: + tried_to_write_cell = 0; + monotime_coarse_add_msec(&relay3_client->next_padding_time, &now, 100); + get_options_mutable()->ORPort_set = 1; + get_options_mutable()->HiddenServiceSingleHopMode = 0; + get_options_mutable()->HiddenServiceNonAnonymousMode = 0; + decision = channelpadding_decide_to_pad_channel(relay3_client); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(relay3_client->pending_padding_callback); + + // Wait for the timer + new_time += 101 * NSEC_PER_MSEC; + monotime_coarse_set_mock_time_nsec(new_time); + monotime_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!client_relay3->pending_padding_callback); + + // Test client side (it should stop immediately) + get_options_mutable()->HiddenServiceSingleHopMode = 1; + get_options_mutable()->HiddenServiceNonAnonymousMode = 1; + /* For the relay to recieve the negotiate: */ + get_options_mutable()->ORPort_set = 1; + decision = channelpadding_decide_to_pad_channel(client_relay3); + tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); + tt_assert(!client_relay3->pending_padding_callback); + + // Test relay side (it should have gotten the negotiation to disable) + get_options_mutable()->ORPort_set = 1; + get_options_mutable()->HiddenServiceSingleHopMode = 0; + get_options_mutable()->HiddenServiceNonAnonymousMode = 0; + tt_int_op(channelpadding_decide_to_pad_channel(relay3_client), OP_EQ, + CHANNELPADDING_WONTPAD); + tt_assert(!relay3_client->padding_enabled); + + done: + free_mock_consensus(); + free_mock_network(); + tor_free(relay); + + timers_shutdown(); + monotime_disable_test_mocking(); + channel_free_all(); +} + +void +test_channelpadding_consensus(void *arg) +{ + channelpadding_decision_t decision; + or_options_t *options = get_options_mutable(); + int64_t val; + int64_t new_time; + (void)arg; + + tor_libevent_postfork(); + + /* + * Params tested: + * nf_pad_before_usage + * nf_pad_relays + * nf_ito_low + * nf_ito_high + * + * Plan: + * 1. Padding can be completely disabled via consensus + * 2. Negotiation can't re-enable consensus-disabled padding + * 3. Negotiation can't increase padding from relays beyond + * consensus defaults + * 4. Relay-to-relay padding can be enabled/disabled in consensus + * 5. Can enable/disable padding before actually using a connection + * 6. Can we control circ and TLS conn lifetime from the consensus? + */ + channel_t *chan; + routerstatus_t *relay = tor_malloc_zero(sizeof(routerstatus_t)); + monotime_enable_test_mocking(); + monotime_set_mock_time_nsec(1); + monotime_coarse_set_mock_time_nsec(1); + new_time = 1; + monotime_coarse_t now; + monotime_coarse_get(&now); + timers_initialize(); + + if (!connection_array) + connection_array = smartlist_new(); + chan = (channel_t*)new_fake_channeltls(0); + channel_timestamp_active(chan); + + setup_mock_consensus(); + + get_options_mutable()->ORPort_set = 1; + + /* Test 1: Padding can be completely disabled via consensus */ + tried_to_write_cell = 0; + monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(chan->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_ALREADY_SCHEDULED); + + // Wait for the timer + new_time += 101*NSEC_PER_MSEC; + monotime_coarse_set_mock_time_nsec(new_time); + monotime_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!chan->pending_padding_callback); + + smartlist_add(current_md_consensus->net_params, + (void*)"nf_ito_low=0"); + smartlist_add(current_md_consensus->net_params, + (void*)"nf_ito_high=0"); + get_options_mutable()->ConnectionPadding = 1; + channelpadding_new_consensus_params(current_md_consensus); + + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); + tt_assert(!chan->pending_padding_callback); + val = channelpadding_get_netflow_inactive_timeout_ms(chan); + tt_i64_op(val, OP_EQ, 0); + val = channelpadding_compute_time_until_pad_for_netflow(chan); + tt_i64_op(val, OP_EQ, -2); + + /* Test 2: Negotiation can't re-enable consensus-disabled padding */ + channelpadding_send_enable_command(chan, 100, 200); + tried_to_write_cell = 0; + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); + tt_assert(!chan->pending_padding_callback); + val = channelpadding_get_netflow_inactive_timeout_ms(chan); + tt_i64_op(val, OP_EQ, 0); + val = channelpadding_compute_time_until_pad_for_netflow(chan); + tt_i64_op(val, OP_EQ, -2); + tt_assert(monotime_coarse_is_zero(&chan->next_padding_time)); + + smartlist_clear(current_md_consensus->net_params); + + /* Test 3: Negotiation can't increase padding from relays beyond consensus + * values */ + smartlist_add(current_md_consensus->net_params, + (void*)"nf_ito_low=100"); + smartlist_add(current_md_consensus->net_params, + (void*)"nf_ito_high=200"); + channelpadding_new_consensus_params(current_md_consensus); + + tried_to_write_cell = 0; + monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(chan->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + val = channelpadding_get_netflow_inactive_timeout_ms(chan); + tt_i64_op(val, OP_GE, 100); + tt_i64_op(val, OP_LE, 200); + val = channelpadding_compute_time_until_pad_for_netflow(chan); + tt_i64_op(val, OP_LE, 200); + + // Wait for the timer + new_time += 201*NSEC_PER_MSEC; + monotime_set_mock_time_nsec(new_time); + monotime_coarse_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!chan->pending_padding_callback); + + smartlist_clear(current_md_consensus->net_params); + smartlist_add(current_md_consensus->net_params, + (void*)"nf_ito_low=1500"); + smartlist_add(current_md_consensus->net_params, + (void*)"nf_ito_high=4500"); + channelpadding_new_consensus_params(current_md_consensus); + + channelpadding_send_enable_command(chan, 100, 200); + tried_to_write_cell = 0; + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); + tt_assert(!chan->pending_padding_callback); + val = channelpadding_get_netflow_inactive_timeout_ms(chan); + tt_i64_op(val, OP_GE, 1500); + tt_i64_op(val, OP_LE, 4500); + val = channelpadding_compute_time_until_pad_for_netflow(chan); + tt_i64_op(val, OP_LE, 4500); + + /* Test 4: Relay-to-relay padding can be enabled/disabled in consensus */ + /* Make this channel a relay's channel */ + memcpy(relay->identity_digest, + ((channel_tls_t *)chan)->conn->identity_digest, DIGEST_LEN); + smartlist_add(current_md_consensus->routerstatus_list, relay); + + tried_to_write_cell = 0; + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); + tt_assert(!chan->pending_padding_callback); + + smartlist_add(current_md_consensus->net_params, + (void*)"nf_pad_relays=1"); + channelpadding_new_consensus_params(current_md_consensus); + + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); + tt_assert(!chan->pending_padding_callback); + val = channelpadding_get_netflow_inactive_timeout_ms(chan); + tt_i64_op(val, OP_GE, 1500); + tt_i64_op(val, OP_LE, 4500); + val = channelpadding_compute_time_until_pad_for_netflow(chan); + tt_i64_op(val, OP_LE, 4500); + + /* Test 5: If we disable padding before channel usage, does that work? */ + smartlist_add(current_md_consensus->net_params, + (void*)"nf_pad_before_usage=0"); + channelpadding_new_consensus_params(current_md_consensus); + tried_to_write_cell = 0; + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); + tt_assert(!chan->pending_padding_callback); + + /* Test 6: Can we control circ and TLS conn lifetime from the consensus? */ + val = channelpadding_get_channel_idle_timeout(NULL, 0); + tt_i64_op(val, OP_GE, 180); + tt_i64_op(val, OP_LE, 180+90); + val = channelpadding_get_channel_idle_timeout(chan, 0); + tt_i64_op(val, OP_GE, 180); + tt_i64_op(val, OP_LE, 180+90); + options->ReducedConnectionPadding = 1; + val = channelpadding_get_channel_idle_timeout(chan, 0); + tt_i64_op(val, OP_GE, 180/2); + tt_i64_op(val, OP_LE, (180+90)/2); + + options->ReducedConnectionPadding = 0; + options->ORPort_set = 1; + smartlist_add(current_md_consensus->net_params, + (void*)"nf_conntimeout_relays=600"); + channelpadding_new_consensus_params(current_md_consensus); + val = channelpadding_get_channel_idle_timeout(chan, 1); + tt_i64_op(val, OP_GE, 450); + tt_i64_op(val, OP_LE, 750); + + val = channelpadding_get_circuits_available_timeout(); + tt_i64_op(val, OP_GE, 30*60); + tt_i64_op(val, OP_LE, 30*60*2); + + options->ReducedConnectionPadding = 1; + smartlist_add(current_md_consensus->net_params, + (void*)"nf_conntimeout_clients=600"); + channelpadding_new_consensus_params(current_md_consensus); + val = channelpadding_get_circuits_available_timeout(); + tt_i64_op(val, OP_GE, 600/2); + tt_i64_op(val, OP_LE, 600*2/2); + + options->ReducedConnectionPadding = 0; + options->CircuitsAvailableTimeout = 24*60*60; + val = channelpadding_get_circuits_available_timeout(); + tt_i64_op(val, OP_GE, 24*60*60); + tt_i64_op(val, OP_LE, 24*60*60*2); + + done: + free_mock_consensus(); + free_fake_channeltls((channel_tls_t*)chan); + smartlist_free(connection_array); + + timers_shutdown(); + monotime_disable_test_mocking(); + channel_free_all(); + + return; +} + +void +test_channelpadding_negotiation(void *arg) +{ + channelpadding_negotiate_t disable; + cell_t cell; + channelpadding_decision_t decision; + int val; + (void)arg; + + /* Plan: + * 1. Clients reject negotiation, relays accept it. + * * Bridges accept negotiation from their clients, + * but not from relays. + * 2. Torrc options can override client-side negotiation + * 3. Test a version issue in channelpadidng cell + * 4. Test channelpadding_reduced_padding + */ + monotime_init(); + monotime_enable_test_mocking(); + monotime_set_mock_time_nsec(1); + monotime_coarse_set_mock_time_nsec(1); + timers_initialize(); + setup_mock_consensus(); + setup_mock_network(); + + /* Test case #1: Do the right things ignore negotiation? */ + /* relay-to-client case: */ + channelpadding_send_disable_command(relay3_client); + tt_assert(client_relay3->padding_enabled); + + /* client-to-relay case: */ + get_options_mutable()->ORPort_set = 1; + channelpadding_disable_padding_on_channel(client_relay3); + tt_int_op(channelpadding_decide_to_pad_channel(relay3_client), OP_EQ, + CHANNELPADDING_WONTPAD); + tt_assert(!relay3_client->padding_enabled); + relay3_client->padding_enabled = 1; + client_relay3->padding_enabled = 1; + + /* Bridge case from relay */ + get_options_mutable()->BridgeRelay = 1; + channelpadding_disable_padding_on_channel(relay2_relay1); + tt_assert(relay1_relay2->padding_enabled); + + /* Bridge case from client */ + channelpadding_disable_padding_on_channel(client_relay3); + tt_assert(!relay3_client->padding_enabled); + tt_int_op(channelpadding_decide_to_pad_channel(relay3_client), OP_EQ, + CHANNELPADDING_WONTPAD); + relay3_client->padding_enabled = 1; + client_relay3->padding_enabled = 1; + get_options_mutable()->BridgeRelay = 0; + get_options_mutable()->ORPort_set = 0; + + /* Test case #2: Torrc options */ + /* ConnectionPadding auto; Relay doesn't suport us */ + ((channel_tls_t*)relay3_client)->conn->link_proto = 4; + relay3_client->padding_enabled = 0; + tried_to_write_cell = 0; + decision = channelpadding_decide_to_pad_channel(relay3_client); + tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); + tt_assert(!relay3_client->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + ((channel_tls_t*)relay3_client)->conn->link_proto = 5; + relay3_client->padding_enabled = 1; + + /* ConnectionPadding 1; Relay doesn't suport us */ + get_options_mutable()->ConnectionPadding = 1; + tried_to_write_cell = 0; + decision = channelpadding_decide_to_pad_channel(client_relay3); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); + tt_assert(!client_relay3->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + get_options_mutable()->ConnectionPadding = 0; + + /* Test case #3: Test a version issue in channelpadding cell */ + get_options_mutable()->ORPort_set = 1; + client_relay3->padding_enabled = 1; + relay3_client->padding_enabled = 1; + memset(&cell, 0, sizeof(cell_t)); + memset(&disable, 0, sizeof(channelpadding_negotiate_t)); + cell.command = CELL_PADDING_NEGOTIATE; + + channelpadding_negotiate_set_command(&disable, CHANNELPADDING_COMMAND_STOP); + disable.version = 1; + channelpadding_negotiate_encode(cell.payload, CELL_PAYLOAD_SIZE, &disable); + client_relay3->write_cell(client_relay3, &cell); + tt_assert(relay3_client->padding_enabled); + tt_int_op(channelpadding_update_padding_for_channel(client_relay3, &disable), + OP_EQ, -1); + tt_assert(client_relay3->padding_enabled); + + disable.version = 0; + channelpadding_negotiate_encode(cell.payload, CELL_PAYLOAD_SIZE, &disable); + client_relay3->write_cell(client_relay3, &cell); + tt_assert(!relay3_client->padding_enabled); + + /* Test case 4: Reducing padding actually reduces it */ + relay3_client->padding_enabled = 1; + client_relay3->padding_enabled = 1; + + decision = channelpadding_decide_to_pad_channel(relay3_client); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); + + channelpadding_reduce_padding_on_channel(client_relay3); + + tried_to_write_cell = 0; + decision = channelpadding_decide_to_pad_channel(relay3_client); + tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); + + get_options_mutable()->ORPort_set = 0; + decision = channelpadding_decide_to_pad_channel(client_relay3); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); + + tt_assert(!client_relay3->pending_padding_callback); + val = channelpadding_get_netflow_inactive_timeout_ms(client_relay3); + tt_int_op(val, OP_GE, 9000); + tt_int_op(val, OP_LE, 14000); + int64_t val64 = + channelpadding_compute_time_until_pad_for_netflow(client_relay3); + tt_i64_op(val64, OP_LE, 14000); + + done: + free_mock_network(); + free_mock_consensus(); + + timers_shutdown(); + monotime_disable_test_mocking(); + channel_free_all(); + + return; +} + +void +test_channelpadding_decide_to_pad_channel(void *arg) +{ + channelpadding_decision_t decision; + /** + * Test case plan: + * + * 1. Channel that has "sent a packet" before the timeout. + * + We should decide to pad later + * 2. Channel that has not "sent a packet" before the timeout: + * 2a. Not within 1.1s of the timeout. + * + We should decide to pad later + * 2b. Within 1.1s of the timemout. + * + We should schedule padding + * + We should get feedback that we wrote a cell + * 2c. Within 0.1s of the timeout. + * + We should schedule padding + * + We should get feedback that we wrote a cell + * 2d. Channel that asks to pad while timeout is scheduled + * + We should schedule padding + * + We should get feedback that we wrote a cell + * 2e. 0s of the timeout + * + We should send padding immediately + * + We should get feedback that we wrote a cell + * 2f. <0s of the timeout + * + We should send padding immediately + * + We should get feedback that we wrote a cell + * 3. Channel that sends a packet while timeout is scheduled + * + We should not get feedback that we wrote a cell + * 4. Channel that closes while timeout is scheduled + * + We should not get feedback that we wrote a cell + * 5. Make sure the channel still would work if repaired + * + We should be able to schedule padding and resend + * 6. Channel is not used for full circuits + * 7. Channel that disappears while timeout is scheduled + * + We should not send padding + */ + channel_t *chan; + int64_t new_time; + if (!connection_array) + connection_array = smartlist_new(); + (void)arg; + + tor_libevent_postfork(); + + monotime_init(); + monotime_enable_test_mocking(); + monotime_set_mock_time_nsec(1); + monotime_coarse_set_mock_time_nsec(1); + new_time = 1; + monotime_coarse_t now; + monotime_coarse_get(&now); + timers_initialize(); + setup_full_capture_of_logs(LOG_WARN); + channelpadding_new_consensus_params(NULL); + + chan = (channel_t*)new_fake_channeltls(0); + channel_timestamp_active(chan); + + /* Test case #1: Channel that has "sent a packet" before the timeout. */ + tried_to_write_cell = 0; + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); + tt_assert(!chan->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + + /* Test case #2a: > 1.1s until timeout */ + tried_to_write_cell = 0; + monotime_coarse_add_msec(&chan->next_padding_time, &now, 1200); + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); + tt_assert(!chan->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + + /* Test case #2b: >= 1.0s until timeout */ + tried_to_write_cell = 0; + monotime_coarse_add_msec(&chan->next_padding_time, &now, 1000); + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(chan->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + + // Set up a timer for the <0 case below. + monotime_coarse_t now_minus_100s; + monotime_coarse_add_msec(&now_minus_100s, &now, 900); + // Wait for the timer from case #2b + new_time += 1000*NSEC_PER_MSEC; + monotime_set_mock_time_nsec(new_time); + monotime_coarse_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!chan->pending_padding_callback); + + /* Test case #2c: > 0.1s until timeout */ + tried_to_write_cell = 0; + monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(chan->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + + /* Test case #2d: Channel that asks to pad while timeout is scheduled */ + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_ALREADY_SCHEDULED); + + // Wait for the timer + new_time += 101*NSEC_PER_MSEC; + monotime_coarse_set_mock_time_nsec(new_time); + monotime_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!chan->pending_padding_callback); + + /* Test case #2e: 0s until timeout */ + tried_to_write_cell = 0; + monotime_coarse_add_msec(&chan->next_padding_time, &now, 0); + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SENT); + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!chan->pending_padding_callback); + + /* Test case #2f: <0s until timeout */ + tried_to_write_cell = 0; + monotime_coarse_add_msec(&chan->next_padding_time, &now_minus_100s, 0); + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SENT); + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!chan->pending_padding_callback); + + /* Test case #3: Channel that sends a packet while timeout is scheduled */ + tried_to_write_cell = 0; + monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + tt_assert(chan->pending_padding_callback); + + // Pretend the channel sent a packet + channel_timestamp_active(chan); + + // We don't expect any timer callbacks here. Make a dummy one to be sure. + // Wait for the timer + new_time += 101*NSEC_PER_MSEC; + monotime_coarse_set_mock_time_nsec(new_time); + monotime_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + + tt_int_op(tried_to_write_cell, OP_EQ, 0); + tt_assert(!chan->pending_padding_callback); + + /* Test case #4: Channel that closes while a timeout is scheduled */ + tried_to_write_cell = 0; + monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + tt_assert(chan->pending_padding_callback); + + // Pretend the channel is temporarily down + chan->state = CHANNEL_STATE_MAINT; + + // We don't expect any timer callbacks here. Make a dummy one to be sure. + new_time += 101*NSEC_PER_MSEC; + monotime_coarse_set_mock_time_nsec(new_time); + monotime_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + + tt_int_op(tried_to_write_cell, OP_EQ, 0); + tt_assert(!chan->pending_padding_callback); + chan->state = CHANNEL_STATE_OPEN; + + /* Test case #5: Make sure previous test case didn't break everything */ + tried_to_write_cell = 0; + monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_assert(chan->pending_padding_callback); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + + // Wait for the timer + new_time += 101*NSEC_PER_MSEC; + monotime_coarse_set_mock_time_nsec(new_time); + monotime_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + + tt_int_op(tried_to_write_cell, OP_EQ, 1); + tt_assert(!chan->pending_padding_callback); + + /* Test case #6. Channel is not used for full circuits */ + chan->channel_usage = CHANNEL_USED_NOT_USED_FOR_FULL_CIRCS; + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); + tt_assert(!chan->pending_padding_callback); + chan->channel_usage = CHANNEL_USED_FOR_FULL_CIRCS; + + /* Test case #7. Channel is closed while timeout is scheduled. + * + * NOTE: This test deliberately breaks the channel callback mechanism. + * It must be last. + */ + tried_to_write_cell = 0; + monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); + decision = channelpadding_decide_to_pad_channel(chan); + tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); + tt_int_op(tried_to_write_cell, OP_EQ, 0); + tt_assert(chan->pending_padding_callback); + + // Close the connection while the timer is scheduled + free_fake_channeltls((channel_tls_t*)chan); + + // We don't expect any timer callbacks here. Make a dummy one to be sure. + new_time = 101*NSEC_PER_MSEC; + monotime_coarse_set_mock_time_nsec(new_time); + monotime_set_mock_time_nsec(new_time); + monotime_coarse_get(&now); + timers_run_pending(); + + tt_int_op(tried_to_write_cell, OP_EQ, 0); + + done: + smartlist_free(connection_array); + + teardown_capture_of_logs(); + monotime_disable_test_mocking(); + timers_shutdown(); + channel_free_all(); + + return; +} + +#define TEST_CHANNELPADDING(name, flags) \ + { #name, test_##name, (flags), NULL, NULL } + +struct testcase_t channelpadding_tests[] = { + //TEST_CHANNELPADDING(channelpadding_decide_to_pad_channel, 0), + TEST_CHANNELPADDING(channelpadding_decide_to_pad_channel, TT_FORK), + TEST_CHANNELPADDING(channelpadding_negotiation, TT_FORK), + TEST_CHANNELPADDING(channelpadding_consensus, TT_FORK), + TEST_CHANNELPADDING(channelpadding_killonehop, TT_FORK), + TEST_CHANNELPADDING(channelpadding_timers, TT_FORK), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_channeltls.c b/src/wraith/src/test/test_channeltls.c new file mode 100644 index 000000000..94f1893ca --- /dev/null +++ b/src/wraith/src/test/test_channeltls.c @@ -0,0 +1,337 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#include + +#define TOR_CHANNEL_INTERNAL_ +#include "or.h" +#include "address.h" +#include "buffers.h" +#include "channel.h" +#include "channeltls.h" +#include "connection_or.h" +#include "config.h" +/* For init/free stuff */ +#include "scheduler.h" +#include "tortls.h" + +/* Test suite stuff */ +#include "test.h" +#include "fakechans.h" + +/* The channeltls unit tests */ +static void test_channeltls_create(void *arg); +static void test_channeltls_num_bytes_queued(void *arg); +static void test_channeltls_overhead_estimate(void *arg); + +/* Mocks used by channeltls unit tests */ +static size_t tlschan_buf_datalen_mock(const buf_t *buf); +static or_connection_t * tlschan_connection_or_connect_mock( + const tor_addr_t *addr, + uint16_t port, + const char *digest, + const ed25519_public_key_t *ed_id, + channel_tls_t *tlschan); +static int tlschan_is_local_addr_mock(const tor_addr_t *addr); + +/* Fake close method */ +static void tlschan_fake_close_method(channel_t *chan); + +/* Flags controlling behavior of channeltls unit test mocks */ +static int tlschan_local = 0; +static const buf_t * tlschan_buf_datalen_mock_target = NULL; +static size_t tlschan_buf_datalen_mock_size = 0; + +/* Thing to cast to fake tor_tls_t * to appease assert_connection_ok() */ +static int fake_tortls = 0; /* Bleh... */ + +static void +test_channeltls_create(void *arg) +{ + tor_addr_t test_addr; + channel_t *ch = NULL; + const char test_digest[DIGEST_LEN] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 }; + + (void)arg; + + /* Set up a fake address to fake-connect to */ + test_addr.family = AF_INET; + test_addr.addr.in_addr.s_addr = htonl(0x01020304); + + /* For this test we always want the address to be treated as non-local */ + tlschan_local = 0; + /* Install is_local_addr() mock */ + MOCK(is_local_addr, tlschan_is_local_addr_mock); + + /* Install mock for connection_or_connect() */ + MOCK(connection_or_connect, tlschan_connection_or_connect_mock); + + /* Try connecting */ + ch = channel_tls_connect(&test_addr, 567, test_digest, NULL); + tt_ptr_op(ch, OP_NE, NULL); + + done: + if (ch) { + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + /* + * Use fake close method that doesn't try to do too much to fake + * orconn + */ + ch->close = tlschan_fake_close_method; + channel_mark_for_close(ch); + free_fake_channel(ch); + UNMOCK(scheduler_release_channel); + } + + UNMOCK(connection_or_connect); + UNMOCK(is_local_addr); + + return; +} + +static void +test_channeltls_num_bytes_queued(void *arg) +{ + tor_addr_t test_addr; + channel_t *ch = NULL; + const char test_digest[DIGEST_LEN] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 }; + channel_tls_t *tlschan = NULL; + size_t len; + int fake_outbuf = 0, n; + + (void)arg; + + /* Set up a fake address to fake-connect to */ + test_addr.family = AF_INET; + test_addr.addr.in_addr.s_addr = htonl(0x01020304); + + /* For this test we always want the address to be treated as non-local */ + tlschan_local = 0; + /* Install is_local_addr() mock */ + MOCK(is_local_addr, tlschan_is_local_addr_mock); + + /* Install mock for connection_or_connect() */ + MOCK(connection_or_connect, tlschan_connection_or_connect_mock); + + /* Try connecting */ + ch = channel_tls_connect(&test_addr, 567, test_digest, NULL); + tt_ptr_op(ch, OP_NE, NULL); + + /* + * Next, we have to test ch->num_bytes_queued, which is + * channel_tls_num_bytes_queued_method. We can't mock + * connection_get_outbuf_len() directly because it's static inline + * in connection.h, but we can mock buf_datalen(). + */ + + tt_assert(ch->num_bytes_queued != NULL); + tlschan = BASE_CHAN_TO_TLS(ch); + tt_ptr_op(tlschan, OP_NE, NULL); + if (TO_CONN(tlschan->conn)->outbuf == NULL) { + /* We need an outbuf to make sure buf_datalen() gets called */ + fake_outbuf = 1; + TO_CONN(tlschan->conn)->outbuf = buf_new(); + } + tlschan_buf_datalen_mock_target = TO_CONN(tlschan->conn)->outbuf; + tlschan_buf_datalen_mock_size = 1024; + MOCK(buf_datalen, tlschan_buf_datalen_mock); + len = ch->num_bytes_queued(ch); + tt_int_op(len, OP_EQ, tlschan_buf_datalen_mock_size); + /* + * We also cover num_cells_writeable here; since wide_circ_ids = 0 on + * the fake tlschans, cell_network_size returns 512, and so with + * tlschan_buf_datalen_mock_size == 1024, we should be able to write + * ceil((OR_CONN_HIGHWATER - 1024) / 512) = ceil(OR_CONN_HIGHWATER / 512) + * - 2 cells. + */ + n = ch->num_cells_writeable(ch); + tt_int_op(n, OP_EQ, CEIL_DIV(OR_CONN_HIGHWATER, 512) - 2); + UNMOCK(buf_datalen); + tlschan_buf_datalen_mock_target = NULL; + tlschan_buf_datalen_mock_size = 0; + if (fake_outbuf) { + buf_free(TO_CONN(tlschan->conn)->outbuf); + TO_CONN(tlschan->conn)->outbuf = NULL; + } + + done: + if (ch) { + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + /* + * Use fake close method that doesn't try to do too much to fake + * orconn + */ + ch->close = tlschan_fake_close_method; + channel_mark_for_close(ch); + free_fake_channel(ch); + UNMOCK(scheduler_release_channel); + } + + UNMOCK(connection_or_connect); + UNMOCK(is_local_addr); + + return; +} + +static void +test_channeltls_overhead_estimate(void *arg) +{ + tor_addr_t test_addr; + channel_t *ch = NULL; + const char test_digest[DIGEST_LEN] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 }; + double r; + channel_tls_t *tlschan = NULL; + + (void)arg; + + /* Set up a fake address to fake-connect to */ + test_addr.family = AF_INET; + test_addr.addr.in_addr.s_addr = htonl(0x01020304); + + /* For this test we always want the address to be treated as non-local */ + tlschan_local = 0; + /* Install is_local_addr() mock */ + MOCK(is_local_addr, tlschan_is_local_addr_mock); + + /* Install mock for connection_or_connect() */ + MOCK(connection_or_connect, tlschan_connection_or_connect_mock); + + /* Try connecting */ + ch = channel_tls_connect(&test_addr, 567, test_digest, NULL); + tt_ptr_op(ch, OP_NE, NULL); + + /* First case: silly low ratios should get clamped to 1.0 */ + tlschan = BASE_CHAN_TO_TLS(ch); + tt_ptr_op(tlschan, OP_NE, NULL); + tlschan->conn->bytes_xmitted = 128; + tlschan->conn->bytes_xmitted_by_tls = 64; + r = ch->get_overhead_estimate(ch); + tt_assert(fabs(r - 1.0) < 1E-12); + + tlschan->conn->bytes_xmitted_by_tls = 127; + r = ch->get_overhead_estimate(ch); + tt_assert(fabs(r - 1.0) < 1E-12); + + /* Now middle of the range */ + tlschan->conn->bytes_xmitted_by_tls = 192; + r = ch->get_overhead_estimate(ch); + tt_assert(fabs(r - 1.5) < 1E-12); + + /* Now above the 2.0 clamp */ + tlschan->conn->bytes_xmitted_by_tls = 257; + r = ch->get_overhead_estimate(ch); + tt_assert(fabs(r - 2.0) < 1E-12); + + tlschan->conn->bytes_xmitted_by_tls = 512; + r = ch->get_overhead_estimate(ch); + tt_assert(fabs(r - 2.0) < 1E-12); + + done: + if (ch) { + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + /* + * Use fake close method that doesn't try to do too much to fake + * orconn + */ + ch->close = tlschan_fake_close_method; + channel_mark_for_close(ch); + free_fake_channel(ch); + UNMOCK(scheduler_release_channel); + } + + UNMOCK(connection_or_connect); + UNMOCK(is_local_addr); + + return; +} + +static size_t +tlschan_buf_datalen_mock(const buf_t *buf) +{ + if (buf != NULL && buf == tlschan_buf_datalen_mock_target) { + return tlschan_buf_datalen_mock_size; + } else { + return buf_datalen__real(buf); + } +} + +static or_connection_t * +tlschan_connection_or_connect_mock(const tor_addr_t *addr, + uint16_t port, + const char *digest, + const ed25519_public_key_t *ed_id, + channel_tls_t *tlschan) +{ + or_connection_t *result = NULL; + (void) ed_id; // XXXX Not yet used. + + tt_ptr_op(addr, OP_NE, NULL); + tt_uint_op(port, OP_NE, 0); + tt_ptr_op(digest, OP_NE, NULL); + tt_ptr_op(tlschan, OP_NE, NULL); + + /* Make a fake orconn */ + result = tor_malloc_zero(sizeof(*result)); + result->base_.magic = OR_CONNECTION_MAGIC; + result->base_.state = OR_CONN_STATE_OPEN; + result->base_.type = CONN_TYPE_OR; + result->base_.socket_family = addr->family; + result->base_.address = tor_strdup(""); + memcpy(&(result->base_.addr), addr, sizeof(tor_addr_t)); + result->base_.port = port; + memcpy(result->identity_digest, digest, DIGEST_LEN); + result->chan = tlschan; + memcpy(&(result->real_addr), addr, sizeof(tor_addr_t)); + result->tls = (tor_tls_t *)((void *)(&fake_tortls)); + + done: + return result; +} + +static void +tlschan_fake_close_method(channel_t *chan) +{ + channel_tls_t *tlschan = NULL; + + tt_ptr_op(chan, OP_NE, NULL); + tt_int_op(chan->magic, OP_EQ, TLS_CHAN_MAGIC); + + tlschan = BASE_CHAN_TO_TLS(chan); + tt_ptr_op(tlschan, OP_NE, NULL); + + /* Just free the fake orconn */ + tor_free(tlschan->conn->base_.address); + tor_free(tlschan->conn); + + channel_closed(chan); + + done: + return; +} + +static int +tlschan_is_local_addr_mock(const tor_addr_t *addr) +{ + tt_ptr_op(addr, OP_NE, NULL); + + done: + return tlschan_local; +} + +struct testcase_t channeltls_tests[] = { + { "create", test_channeltls_create, TT_FORK, NULL, NULL }, + { "num_bytes_queued", test_channeltls_num_bytes_queued, + TT_FORK, NULL, NULL }, + { "overhead_estimate", test_channeltls_overhead_estimate, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_checkdir.c b/src/wraith/src/test/test_checkdir.c new file mode 100644 index 000000000..bf6a8376b --- /dev/null +++ b/src/wraith/src/test/test_checkdir.c @@ -0,0 +1,149 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include "config.h" +#include "test.h" +#include "util.h" + +#ifdef _WIN32 +#define mkdir(a,b) mkdir(a) +#define tt_int_op_nowin(a,op,b) do { (void)(a); (void)(b); } while (0) +#define umask(mask) ((void)0) +#else +#define tt_int_op_nowin(a,op,b) tt_int_op((a),op,(b)) +#endif /* defined(_WIN32) */ + +/** Run unit tests for private dir permission enforcement logic. */ +static void +test_checkdir_perms(void *testdata) +{ + (void)testdata; + or_options_t *options = get_options_mutable(); + const char *subdir = "test_checkdir"; + char *testdir = NULL; + cpd_check_t cpd_chkopts; + cpd_check_t unix_create_opts; + cpd_check_t unix_verify_optsmask; + struct stat st; + + umask(022); + + /* setup data directory before tests. */ + tor_free(options->DataDirectory); + options->DataDirectory = tor_strdup(get_fname(subdir)); + tt_int_op(mkdir(options->DataDirectory, 0750), OP_EQ, 0); + + /* test: create new dir, no flags. */ + testdir = get_datadir_fname("checkdir_new_none"); + cpd_chkopts = CPD_CREATE; + unix_verify_optsmask = 0077; + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); + tor_free(testdir); + + /* test: create new dir, CPD_GROUP_OK option set. */ + testdir = get_datadir_fname("checkdir_new_groupok"); + cpd_chkopts = CPD_CREATE|CPD_GROUP_OK; + unix_verify_optsmask = 0077; + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); + tor_free(testdir); + + /* test: should get an error on existing dir with + wrong perms */ + testdir = get_datadir_fname("checkdir_new_groupok_err"); + tt_int_op(0, OP_EQ, mkdir(testdir, 027)); + cpd_chkopts = CPD_CHECK_MODE_ONLY|CPD_CREATE|CPD_GROUP_OK; + tt_int_op_nowin(-1, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tor_free(testdir); + + /* test: create new dir, CPD_GROUP_READ option set. */ + testdir = get_datadir_fname("checkdir_new_groupread"); + cpd_chkopts = CPD_CREATE|CPD_GROUP_READ; + unix_verify_optsmask = 0027; + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); + tor_free(testdir); + + /* test: check existing dir created with defaults, + and verify with CPD_CREATE only. */ + testdir = get_datadir_fname("checkdir_exists_none"); + cpd_chkopts = CPD_CREATE; + unix_create_opts = 0700; + (void)unix_create_opts; + unix_verify_optsmask = 0077; + tt_int_op(0, OP_EQ, mkdir(testdir, unix_create_opts)); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); + tor_free(testdir); + + /* test: check existing dir created with defaults, + and verify with CPD_GROUP_OK option set. */ + testdir = get_datadir_fname("checkdir_exists_groupok"); + cpd_chkopts = CPD_CREATE; + unix_verify_optsmask = 0077; + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + cpd_chkopts = CPD_GROUP_OK; + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); + tor_free(testdir); + + /* test: check existing dir created with defaults, + and verify with CPD_GROUP_READ option set. */ + testdir = get_datadir_fname("checkdir_exists_groupread"); + cpd_chkopts = CPD_CREATE; + unix_verify_optsmask = 0027; + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + cpd_chkopts = CPD_GROUP_READ; + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); + tor_free(testdir); + + /* test: check existing dir created with CPD_GROUP_READ, + and verify with CPD_GROUP_OK option set. */ + testdir = get_datadir_fname("checkdir_existsread_groupok"); + cpd_chkopts = CPD_CREATE|CPD_GROUP_READ; + unix_verify_optsmask = 0027; + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + cpd_chkopts = CPD_GROUP_OK; + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); + tor_free(testdir); + + /* test: check existing dir created with CPD_GROUP_READ, + and verify with CPD_GROUP_READ option set. */ + testdir = get_datadir_fname("checkdir_existsread_groupread"); + cpd_chkopts = CPD_CREATE|CPD_GROUP_READ; + unix_verify_optsmask = 0027; + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); + + done: + tor_free(testdir); +} + +#define CHECKDIR(name,flags) \ + { #name, test_checkdir_##name, (flags), NULL, NULL } + +struct testcase_t checkdir_tests[] = { + CHECKDIR(perms, TT_FORK), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_circuitbuild.c b/src/wraith/src/test/test_circuitbuild.c new file mode 100644 index 000000000..a5282df69 --- /dev/null +++ b/src/wraith/src/test/test_circuitbuild.c @@ -0,0 +1,133 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2016, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CIRCUITBUILD_PRIVATE + +#include "or.h" +#include "test.h" +#include "test_helpers.h" +#include "log_test_helpers.h" +#include "config.h" +#include "circuitbuild.h" + +/* Dummy nodes smartlist for testing */ +static smartlist_t dummy_nodes; +/* Dummy exit extend_info for testing */ +static extend_info_t dummy_ei; + +static int +mock_count_acceptable_nodes(smartlist_t *nodes) +{ + (void)nodes; + + return DEFAULT_ROUTE_LEN + 1; +} + +/* Test route lengths when the caller of new_route_len() doesn't + * specify exit_ei. */ +static void +test_new_route_len_noexit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + r = new_route_len(CIRCUIT_PURPOSE_C_GENERAL, NULL, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + r = new_route_len(CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT, NULL, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + r = new_route_len(CIRCUIT_PURPOSE_S_CONNECT_REND, NULL, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + done: + UNMOCK(count_acceptable_nodes); +} + +/* Test route lengths where someone else chose the "exit" node, which + * require an extra hop for safety. */ +static void +test_new_route_len_unsafe_exit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + /* connecting to hidden service directory */ + r = new_route_len(CIRCUIT_PURPOSE_C_GENERAL, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + + /* client connecting to introduction point */ + r = new_route_len(CIRCUIT_PURPOSE_C_INTRODUCING, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + + /* hidden service connecting to rendezvous point */ + r = new_route_len(CIRCUIT_PURPOSE_S_CONNECT_REND, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + + done: + UNMOCK(count_acceptable_nodes); +} + +/* Test route lengths where we chose the "exit" node, which don't + * require an extra hop for safety. */ +static void +test_new_route_len_safe_exit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + /* hidden service connecting to introduction point */ + r = new_route_len(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, &dummy_ei, + &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + /* router testing its own reachability */ + r = new_route_len(CIRCUIT_PURPOSE_TESTING, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + done: + UNMOCK(count_acceptable_nodes); +} + +/* Make sure a non-fatal assertion fails when new_route_len() gets an + * unexpected circuit purpose. */ +static void +test_new_route_len_unhandled_exit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + tor_capture_bugs_(1); + setup_full_capture_of_logs(LOG_WARN); + r = new_route_len(CIRCUIT_PURPOSE_CONTROLLER, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); + tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, + "!(exit_ei && !known_purpose)"); + expect_single_log_msg_containing("Unhandled purpose"); + expect_single_log_msg_containing("with a chosen exit; assuming routelen"); + teardown_capture_of_logs(); + tor_end_capture_bugs_(); + + done: + UNMOCK(count_acceptable_nodes); +} + +struct testcase_t circuitbuild_tests[] = { + { "noexit", test_new_route_len_noexit, 0, NULL, NULL }, + { "safe_exit", test_new_route_len_safe_exit, 0, NULL, NULL }, + { "unsafe_exit", test_new_route_len_unsafe_exit, 0, NULL, NULL }, + { "unhandled_exit", test_new_route_len_unhandled_exit, 0, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_circuitlist.c b/src/wraith/src/test/test_circuitlist.c new file mode 100644 index 000000000..d170009a9 --- /dev/null +++ b/src/wraith/src/test/test_circuitlist.c @@ -0,0 +1,469 @@ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define TOR_CHANNEL_INTERNAL_ +#define CIRCUITBUILD_PRIVATE +#define CIRCUITLIST_PRIVATE +#define HS_CIRCUITMAP_PRIVATE +#include "or.h" +#include "channel.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "hs_circuitmap.h" +#include "test.h" +#include "log_test_helpers.h" + +static channel_t * +new_fake_channel(void) +{ + channel_t *chan = tor_malloc_zero(sizeof(channel_t)); + channel_init(chan); + return chan; +} + +static struct { + int ncalls; + void *cmux; + void *circ; + cell_direction_t dir; +} cam; + +static void +circuitmux_attach_mock(circuitmux_t *cmux, circuit_t *circ, + cell_direction_t dir) +{ + ++cam.ncalls; + cam.cmux = cmux; + cam.circ = circ; + cam.dir = dir; +} + +static struct { + int ncalls; + void *cmux; + void *circ; +} cdm; + +static void +circuitmux_detach_mock(circuitmux_t *cmux, circuit_t *circ) +{ + ++cdm.ncalls; + cdm.cmux = cmux; + cdm.circ = circ; +} + +#define GOT_CMUX_ATTACH(mux_, circ_, dir_) do { \ + tt_int_op(cam.ncalls, OP_EQ, 1); \ + tt_ptr_op(cam.cmux, OP_EQ, (mux_)); \ + tt_ptr_op(cam.circ, OP_EQ, (circ_)); \ + tt_int_op(cam.dir, OP_EQ, (dir_)); \ + memset(&cam, 0, sizeof(cam)); \ + } while (0) + +#define GOT_CMUX_DETACH(mux_, circ_) do { \ + tt_int_op(cdm.ncalls, OP_EQ, 1); \ + tt_ptr_op(cdm.cmux, OP_EQ, (mux_)); \ + tt_ptr_op(cdm.circ, OP_EQ, (circ_)); \ + memset(&cdm, 0, sizeof(cdm)); \ + } while (0) + +static void +test_clist_maps(void *arg) +{ + channel_t *ch1 = new_fake_channel(); + channel_t *ch2 = new_fake_channel(); + channel_t *ch3 = new_fake_channel(); + or_circuit_t *or_c1=NULL, *or_c2=NULL; + + (void) arg; + + MOCK(circuitmux_attach_circuit, circuitmux_attach_mock); + MOCK(circuitmux_detach_circuit, circuitmux_detach_mock); + memset(&cam, 0, sizeof(cam)); + memset(&cdm, 0, sizeof(cdm)); + + tt_assert(ch1); + tt_assert(ch2); + tt_assert(ch3); + + ch1->cmux = tor_malloc(1); + ch2->cmux = tor_malloc(1); + ch3->cmux = tor_malloc(1); + + or_c1 = or_circuit_new(100, ch2); + tt_assert(or_c1); + GOT_CMUX_ATTACH(ch2->cmux, or_c1, CELL_DIRECTION_IN); + tt_int_op(or_c1->p_circ_id, OP_EQ, 100); + tt_ptr_op(or_c1->p_chan, OP_EQ, ch2); + + or_c2 = or_circuit_new(100, ch1); + tt_assert(or_c2); + GOT_CMUX_ATTACH(ch1->cmux, or_c2, CELL_DIRECTION_IN); + tt_int_op(or_c2->p_circ_id, OP_EQ, 100); + tt_ptr_op(or_c2->p_chan, OP_EQ, ch1); + + circuit_set_n_circid_chan(TO_CIRCUIT(or_c1), 200, ch1); + GOT_CMUX_ATTACH(ch1->cmux, or_c1, CELL_DIRECTION_OUT); + + circuit_set_n_circid_chan(TO_CIRCUIT(or_c2), 200, ch2); + GOT_CMUX_ATTACH(ch2->cmux, or_c2, CELL_DIRECTION_OUT); + + tt_ptr_op(circuit_get_by_circid_channel(200, ch1), OP_EQ, TO_CIRCUIT(or_c1)); + tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, TO_CIRCUIT(or_c2)); + tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, TO_CIRCUIT(or_c1)); + /* Try the same thing again, to test the "fast" path. */ + tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, TO_CIRCUIT(or_c1)); + tt_assert(circuit_id_in_use_on_channel(100, ch2)); + tt_assert(! circuit_id_in_use_on_channel(101, ch2)); + + /* Try changing the circuitid and channel of that circuit. */ + circuit_set_p_circid_chan(or_c1, 500, ch3); + GOT_CMUX_DETACH(ch2->cmux, TO_CIRCUIT(or_c1)); + GOT_CMUX_ATTACH(ch3->cmux, TO_CIRCUIT(or_c1), CELL_DIRECTION_IN); + tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, NULL); + tt_assert(! circuit_id_in_use_on_channel(100, ch2)); + tt_ptr_op(circuit_get_by_circid_channel(500, ch3), OP_EQ, TO_CIRCUIT(or_c1)); + + /* Now let's see about destroy handling. */ + tt_assert(! circuit_id_in_use_on_channel(205, ch2)); + tt_assert(circuit_id_in_use_on_channel(200, ch2)); + channel_note_destroy_pending(ch2, 200); + channel_note_destroy_pending(ch2, 205); + channel_note_destroy_pending(ch1, 100); + tt_assert(circuit_id_in_use_on_channel(205, ch2)) + tt_assert(circuit_id_in_use_on_channel(200, ch2)); + tt_assert(circuit_id_in_use_on_channel(100, ch1)); + + tt_assert(TO_CIRCUIT(or_c2)->n_delete_pending != 0); + tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, TO_CIRCUIT(or_c2)); + tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, TO_CIRCUIT(or_c2)); + + /* Okay, now free ch2 and make sure that the circuit ID is STILL not + * usable, because we haven't declared the destroy to be nonpending */ + tt_int_op(cdm.ncalls, OP_EQ, 0); + circuit_free_(TO_CIRCUIT(or_c2)); + or_c2 = NULL; /* prevent free */ + tt_int_op(cdm.ncalls, OP_EQ, 2); + memset(&cdm, 0, sizeof(cdm)); + tt_assert(circuit_id_in_use_on_channel(200, ch2)); + tt_assert(circuit_id_in_use_on_channel(100, ch1)); + tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, NULL); + tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, NULL); + + /* Now say that the destroy is nonpending */ + channel_note_destroy_not_pending(ch2, 200); + tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, NULL); + channel_note_destroy_not_pending(ch1, 100); + tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, NULL); + tt_assert(! circuit_id_in_use_on_channel(200, ch2)); + tt_assert(! circuit_id_in_use_on_channel(100, ch1)); + + done: + if (or_c1) + circuit_free_(TO_CIRCUIT(or_c1)); + if (or_c2) + circuit_free_(TO_CIRCUIT(or_c2)); + if (ch1) + tor_free(ch1->cmux); + if (ch2) + tor_free(ch2->cmux); + if (ch3) + tor_free(ch3->cmux); + tor_free(ch1); + tor_free(ch2); + tor_free(ch3); + UNMOCK(circuitmux_attach_circuit); + UNMOCK(circuitmux_detach_circuit); +} + +static void +test_rend_token_maps(void *arg) +{ + or_circuit_t *c1, *c2, *c3, *c4; + origin_circuit_t *c5; + const uint8_t tok1[REND_TOKEN_LEN] = "The cat can't tell y"; + const uint8_t tok2[REND_TOKEN_LEN] = "ou its name, and it "; + const uint8_t tok3[REND_TOKEN_LEN] = "doesn't really care."; + /* -- Adapted from a quote by Fredrik Lundh. */ + + (void)arg; + (void)tok1; //xxxx + + hs_circuitmap_init(); + + c1 = or_circuit_new(0, NULL); + c2 = or_circuit_new(0, NULL); + c3 = or_circuit_new(0, NULL); + c4 = or_circuit_new(0, NULL); + c5 = origin_circuit_new(); + + /* Make sure we really filled up the tok* variables */ + tt_int_op(tok1[REND_TOKEN_LEN-1], OP_EQ, 'y'); + tt_int_op(tok2[REND_TOKEN_LEN-1], OP_EQ, ' '); + tt_int_op(tok3[REND_TOKEN_LEN-1], OP_EQ, '.'); + + /* No maps; nothing there. */ + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok1)); + + hs_circuitmap_register_rend_circ_relay_side(c1, tok1); + hs_circuitmap_register_intro_circ_v2_relay_side(c2, tok2); + + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok3)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok1)); + + /* Without purpose set, we don't get the circuits */ + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); + + c1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; + c2->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; + + /* Okay, make sure they show up now. */ + tt_ptr_op(c1, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); + + /* Two items at the same place with the same token. */ + c3->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; + hs_circuitmap_register_rend_circ_relay_side(c3, tok2); + tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); + tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); + + /* Marking a circuit makes it not get returned any more */ + circuit_mark_for_close(TO_CIRCUIT(c1), END_CIRC_REASON_FINISHED); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + circuit_free_(TO_CIRCUIT(c1)); + c1 = NULL; + + /* Freeing a circuit makes it not get returned any more. */ + circuit_free_(TO_CIRCUIT(c2)); + c2 = NULL; + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); + + /* c3 -- are you still there? */ + tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); + /* Change its cookie. This never happens in Tor per se, but hey. */ + c3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; + hs_circuitmap_register_intro_circ_v2_relay_side(c3, tok3); + + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); + tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); + + /* Now replace c3 with c4. */ + c4->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; + hs_circuitmap_register_intro_circ_v2_relay_side(c4, tok3); + + tt_ptr_op(c4, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); + + tt_ptr_op(TO_CIRCUIT(c3)->hs_token, OP_EQ, NULL); + tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_NE, NULL); + tt_mem_op(TO_CIRCUIT(c4)->hs_token->token, OP_EQ, tok3, REND_TOKEN_LEN); + + /* Now clear c4's cookie. */ + hs_circuitmap_remove_circuit(TO_CIRCUIT(c4)); + tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_EQ, NULL); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); + + /* Now let's do a check for the client-side rend circuitmap */ + c5->base_.purpose = CIRCUIT_PURPOSE_C_ESTABLISH_REND; + hs_circuitmap_register_rend_circ_client_side(c5, tok1); + + tt_ptr_op(c5, OP_EQ, hs_circuitmap_get_rend_circ_client_side(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_client_side(tok2)); + + done: + if (c1) + circuit_free_(TO_CIRCUIT(c1)); + if (c2) + circuit_free_(TO_CIRCUIT(c2)); + if (c3) + circuit_free_(TO_CIRCUIT(c3)); + if (c4) + circuit_free_(TO_CIRCUIT(c4)); + if (c5) + circuit_free_(TO_CIRCUIT(c5)); +} + +static void +mock_channel_dump_statistics(channel_t *chan, int severity) +{ + (void)chan; + (void)severity; +} + +static void +test_pick_circid(void *arg) +{ + bitarray_t *ba = NULL; + channel_t *chan1, *chan2; + circid_t circid; + int i; + (void) arg; + + MOCK(channel_dump_statistics, mock_channel_dump_statistics); + + chan1 = tor_malloc_zero(sizeof(channel_t)); + chan2 = tor_malloc_zero(sizeof(channel_t)); + chan2->wide_circ_ids = 1; + + chan1->cmux = circuitmux_alloc(); + chan2->cmux = circuitmux_alloc(); + + /* CIRC_ID_TYPE_NEITHER is supposed to create a warning. */ + chan1->circ_id_type = CIRC_ID_TYPE_NEITHER; + setup_full_capture_of_logs(LOG_WARN); + tt_int_op(0, OP_EQ, get_unique_circ_id_by_chan(chan1)); + expect_single_log_msg_containing("Trying to pick a circuit ID for a " + "connection from a client with no identity."); + teardown_capture_of_logs(); + + /* Basic tests, with no collisions */ + chan1->circ_id_type = CIRC_ID_TYPE_LOWER; + for (i = 0; i < 50; ++i) { + circid = get_unique_circ_id_by_chan(chan1); + tt_uint_op(0, OP_LT, circid); + tt_uint_op(circid, OP_LT, (1<<15)); + } + chan1->circ_id_type = CIRC_ID_TYPE_HIGHER; + for (i = 0; i < 50; ++i) { + circid = get_unique_circ_id_by_chan(chan1); + tt_uint_op((1<<15), OP_LT, circid); + tt_uint_op(circid, OP_LT, (1<<16)); + } + + chan2->circ_id_type = CIRC_ID_TYPE_LOWER; + for (i = 0; i < 50; ++i) { + circid = get_unique_circ_id_by_chan(chan2); + tt_uint_op(0, OP_LT, circid); + tt_uint_op(circid, OP_LT, (1u<<31)); + } + chan2->circ_id_type = CIRC_ID_TYPE_HIGHER; + for (i = 0; i < 50; ++i) { + circid = get_unique_circ_id_by_chan(chan2); + tt_uint_op((1u<<31), OP_LT, circid); + } + + /* Now make sure that we can behave well when we are full up on circuits */ + chan1->circ_id_type = CIRC_ID_TYPE_LOWER; + chan2->circ_id_type = CIRC_ID_TYPE_LOWER; + chan1->wide_circ_ids = chan2->wide_circ_ids = 0; + ba = bitarray_init_zero((1<<15)); + for (i = 0; i < (1<<15); ++i) { + circid = get_unique_circ_id_by_chan(chan1); + if (circid == 0) { + tt_int_op(i, OP_GT, (1<<14)); + break; + } + tt_uint_op(circid, OP_LT, (1<<15)); + tt_assert(! bitarray_is_set(ba, circid)); + bitarray_set(ba, circid); + channel_mark_circid_unusable(chan1, circid); + } + tt_int_op(i, OP_LT, (1<<15)); + /* Make sure that being full on chan1 does not interfere with chan2 */ + for (i = 0; i < 100; ++i) { + circid = get_unique_circ_id_by_chan(chan2); + tt_uint_op(circid, OP_GT, 0); + tt_uint_op(circid, OP_LT, (1<<15)); + channel_mark_circid_unusable(chan2, circid); + } + + done: + circuitmux_free(chan1->cmux); + circuitmux_free(chan2->cmux); + tor_free(chan1); + tor_free(chan2); + bitarray_free(ba); + circuit_free_all(); + teardown_capture_of_logs(); + UNMOCK(channel_dump_statistics); +} + +/** Test that the circuit pools of our HS circuitmap are isolated based on + * their token type. */ +static void +test_hs_circuitmap_isolation(void *arg) +{ + or_circuit_t *circ1 = NULL; + origin_circuit_t *circ2 = NULL; + or_circuit_t *circ3 = NULL; + origin_circuit_t *circ4 = NULL; + + (void)arg; + + hs_circuitmap_init(); + + { + const uint8_t tok1[REND_TOKEN_LEN] = "bet i got some of th"; + + circ1 = or_circuit_new(0, NULL); + tt_assert(circ1); + circ1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; + + /* check that circuitmap is empty right? */ + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + + /* Register circ1 with tok1 as relay-side rend circ */ + hs_circuitmap_register_rend_circ_relay_side(circ1, tok1); + + /* check that service-side getters don't work */ + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_service_side(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_service_side(tok1)); + + /* Check that the right getter works. */ + tt_ptr_op(circ1, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + } + + { + const uint8_t tok2[REND_TOKEN_LEN] = "you dont know anythi"; + + circ2 = origin_circuit_new(); + tt_assert(circ2); + circ2->base_.purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; + circ3 = or_circuit_new(0, NULL); + tt_assert(circ3); + circ3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; + circ4 = origin_circuit_new(); + tt_assert(circ4); + circ4->base_.purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; + + /* Register circ2 with tok2 as service-side intro v2 circ */ + hs_circuitmap_register_intro_circ_v2_service_side(circ2, tok2); + /* Register circ3 with tok2 again but for different purpose */ + hs_circuitmap_register_intro_circ_v2_relay_side(circ3, tok2); + + /* Check that the getters work */ + tt_ptr_op(circ2, OP_EQ, + hs_circuitmap_get_intro_circ_v2_service_side(tok2)); + tt_ptr_op(circ3, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); + + /* Register circ4 with tok2: it should override circ2 */ + hs_circuitmap_register_intro_circ_v2_service_side(circ4, tok2); + + /* check that relay-side getters don't work */ + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); + + /* Check that the getter returns circ4; the last circuit registered with + * that token. */ + tt_ptr_op(circ4, OP_EQ, + hs_circuitmap_get_intro_circ_v2_service_side(tok2)); + } + + done: + circuit_free_(TO_CIRCUIT(circ1)); + circuit_free_(TO_CIRCUIT(circ2)); + circuit_free_(TO_CIRCUIT(circ3)); + circuit_free_(TO_CIRCUIT(circ4)); +} + +struct testcase_t circuitlist_tests[] = { + { "maps", test_clist_maps, TT_FORK, NULL, NULL }, + { "rend_token_maps", test_rend_token_maps, TT_FORK, NULL, NULL }, + { "pick_circid", test_pick_circid, TT_FORK, NULL, NULL }, + { "hs_circuitmap_isolation", test_hs_circuitmap_isolation, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_circuitmux.c b/src/wraith/src/test/test_circuitmux.c new file mode 100644 index 000000000..854f72505 --- /dev/null +++ b/src/wraith/src/test/test_circuitmux.c @@ -0,0 +1,84 @@ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define TOR_CHANNEL_INTERNAL_ +#define CIRCUITMUX_PRIVATE +#define RELAY_PRIVATE +#include "or.h" +#include "channel.h" +#include "circuitmux.h" +#include "relay.h" +#include "scheduler.h" +#include "test.h" + +/* XXXX duplicated function from test_circuitlist.c */ +static channel_t * +new_fake_channel(void) +{ + channel_t *chan = tor_malloc_zero(sizeof(channel_t)); + channel_init(chan); + return chan; +} + +static int +has_queued_writes(channel_t *c) +{ + (void) c; + return 1; +} + +/** Test destroy cell queue with no interference from other queues. */ +static void +test_cmux_destroy_cell_queue(void *arg) +{ + circuitmux_t *cmux = NULL; + channel_t *ch = NULL; + circuit_t *circ = NULL; + destroy_cell_queue_t *cq = NULL; + packed_cell_t *pc = NULL; + destroy_cell_t *dc = NULL; + + scheduler_init(); + + (void) arg; + + cmux = circuitmux_alloc(); + tt_assert(cmux); + ch = new_fake_channel(); + ch->has_queued_writes = has_queued_writes; + ch->wide_circ_ids = 1; + + circ = circuitmux_get_first_active_circuit(cmux, &cq); + tt_ptr_op(circ, OP_EQ, NULL); + tt_ptr_op(cq, OP_EQ, NULL); + + circuitmux_append_destroy_cell(ch, cmux, 100, 10); + circuitmux_append_destroy_cell(ch, cmux, 190, 6); + circuitmux_append_destroy_cell(ch, cmux, 30, 1); + + tt_int_op(circuitmux_num_cells(cmux), OP_EQ, 3); + + circ = circuitmux_get_first_active_circuit(cmux, &cq); + tt_ptr_op(circ, OP_EQ, NULL); + tt_assert(cq); + + tt_int_op(cq->n, OP_EQ, 3); + + dc = destroy_cell_queue_pop(cq); + tt_assert(dc); + tt_uint_op(dc->circid, OP_EQ, 100); + + tt_int_op(circuitmux_num_cells(cmux), OP_EQ, 2); + + done: + circuitmux_free(cmux); + channel_free(ch); + packed_cell_free(pc); + tor_free(dc); +} + +struct testcase_t circuitmux_tests[] = { + { "destroy_cell_queue", test_cmux_destroy_cell_queue, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_circuitstats.c b/src/wraith/src/test/test_circuitstats.c new file mode 100644 index 000000000..9d87c325b --- /dev/null +++ b/src/wraith/src/test/test_circuitstats.c @@ -0,0 +1,199 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CIRCUITBUILD_PRIVATE +#define CIRCUITSTATS_PRIVATE +#define CIRCUITLIST_PRIVATE +#define CHANNEL_PRIVATE_ + +#include "or.h" +#include "test.h" +#include "test_helpers.h" +#include "log_test_helpers.h" +#include "config.h" +#include "circuitlist.h" +#include "circuitbuild.h" +#include "circuitstats.h" +#include "circuituse.h" +#include "channel.h" + +void test_circuitstats_timeout(void *arg); +void test_circuitstats_hoplen(void *arg); +origin_circuit_t *subtest_fourhop_circuit(struct timeval, int); +origin_circuit_t *add_opened_threehop(void); +origin_circuit_t *build_unopened_fourhop(struct timeval); + +int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice); + +static int marked_for_close; +/* Mock function because we are not trying to test the close circuit that does + * an awful lot of checks on the circuit object. */ +static void +mock_circuit_mark_for_close(circuit_t *circ, int reason, int line, + const char *file) +{ + (void) circ; + (void) reason; + (void) line; + (void) file; + marked_for_close = 1; + return; +} + +origin_circuit_t * +add_opened_threehop(void) +{ + origin_circuit_t *or_circ = origin_circuit_new(); + extend_info_t fakehop; + memset(&fakehop, 0, sizeof(fakehop)); + + TO_CIRCUIT(or_circ)->purpose = CIRCUIT_PURPOSE_C_GENERAL; + + or_circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); + or_circ->build_state->desired_path_len = DEFAULT_ROUTE_LEN; + + onion_append_hop(&or_circ->cpath, &fakehop); + onion_append_hop(&or_circ->cpath, &fakehop); + onion_append_hop(&or_circ->cpath, &fakehop); + + or_circ->has_opened = 1; + TO_CIRCUIT(or_circ)->state = CIRCUIT_STATE_OPEN; + TO_CIRCUIT(or_circ)->purpose = CIRCUIT_PURPOSE_C_GENERAL; + + return or_circ; +} + +origin_circuit_t * +build_unopened_fourhop(struct timeval circ_start_time) +{ + origin_circuit_t *or_circ = origin_circuit_new(); + extend_info_t *fakehop = tor_malloc_zero(sizeof(extend_info_t)); + memset(fakehop, 0, sizeof(extend_info_t)); + + TO_CIRCUIT(or_circ)->purpose = CIRCUIT_PURPOSE_C_GENERAL; + TO_CIRCUIT(or_circ)->timestamp_began = circ_start_time; + TO_CIRCUIT(or_circ)->timestamp_created = circ_start_time; + + or_circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); + or_circ->build_state->desired_path_len = 4; + + onion_append_hop(&or_circ->cpath, fakehop); + onion_append_hop(&or_circ->cpath, fakehop); + onion_append_hop(&or_circ->cpath, fakehop); + onion_append_hop(&or_circ->cpath, fakehop); + + return or_circ; +} + +origin_circuit_t * +subtest_fourhop_circuit(struct timeval circ_start_time, int should_timeout) +{ + origin_circuit_t *or_circ = build_unopened_fourhop(circ_start_time); + + // Now make them open one at a time and call + // circuit_build_times_handle_completed_hop(); + or_circ->cpath->state = CPATH_STATE_OPEN; + circuit_build_times_handle_completed_hop(or_circ); + tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 0); + + or_circ->cpath->next->state = CPATH_STATE_OPEN; + circuit_build_times_handle_completed_hop(or_circ); + tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 0); + + // Third hop: We should count it now. + or_circ->cpath->next->next->state = CPATH_STATE_OPEN; + circuit_build_times_handle_completed_hop(or_circ); + tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, + !should_timeout); // 1 if counted, 0 otherwise + + // Fourth hop: Don't double count + or_circ->cpath->next->next->next->state = CPATH_STATE_OPEN; + circuit_build_times_handle_completed_hop(or_circ); + tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, + !should_timeout); + + done: + return or_circ; +} + +void +test_circuitstats_hoplen(void *arg) +{ + /* Plan: + * 0. Test no other opened circs (relaxed timeout) + * 1. Check >3 hop circ building w/o timeout + * 2. Check >3 hop circs w/ timeouts.. + */ + struct timeval circ_start_time; + origin_circuit_t *threehop = NULL; + origin_circuit_t *fourhop = NULL; + (void)arg; + MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); + + circuit_build_times_init(get_circuit_build_times_mutable()); + + // Let's set a close_ms to 2X the initial timeout, so we can + // test relaxed functionality (which uses the close_ms timeout) + get_circuit_build_times_mutable()->close_ms *= 2; + + tor_gettimeofday(&circ_start_time); + circ_start_time.tv_sec -= 119; // make us hit "relaxed" cutoff + + // Test 1: Build a fourhop circuit that should get marked + // as relaxed and eventually counted by circuit_expire_building + // (but not before) + fourhop = subtest_fourhop_circuit(circ_start_time, 0); + tt_int_op(fourhop->relaxed_timeout, OP_EQ, 0); + tt_int_op(marked_for_close, OP_EQ, 0); + circuit_expire_building(); + tt_int_op(marked_for_close, OP_EQ, 0); + tt_int_op(fourhop->relaxed_timeout, OP_EQ, 1); + TO_CIRCUIT(fourhop)->timestamp_began.tv_sec -= 119; + circuit_expire_building(); + tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 1); + tt_int_op(marked_for_close, OP_EQ, 1); + + circuit_free_(TO_CIRCUIT(fourhop)); + circuit_build_times_reset(get_circuit_build_times_mutable()); + + // Test 2: Add a threehop circuit for non-relaxed timeouts + threehop = add_opened_threehop(); + + /* This circuit should not timeout */ + tor_gettimeofday(&circ_start_time); + circ_start_time.tv_sec -= 59; + fourhop = subtest_fourhop_circuit(circ_start_time, 0); + circuit_expire_building(); + tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 1); + tt_int_op(TO_CIRCUIT(fourhop)->purpose, OP_NE, + CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT); + + circuit_free_((circuit_t *)fourhop); + circuit_build_times_reset(get_circuit_build_times_mutable()); + + /* Test 3: This circuit should now time out and get marked as a + * measurement circuit, but still get counted (and counted only once) + */ + circ_start_time.tv_sec -= 2; + fourhop = subtest_fourhop_circuit(circ_start_time, 0); + tt_int_op(TO_CIRCUIT(fourhop)->purpose, OP_EQ, + CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT); + tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 1); + circuit_expire_building(); + tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 1); + + done: + UNMOCK(circuit_mark_for_close_); + circuit_free_(TO_CIRCUIT(threehop)); + circuit_free_(TO_CIRCUIT(fourhop)); + circuit_build_times_free_timeouts(get_circuit_build_times_mutable()); +} + +#define TEST_CIRCUITSTATS(name, flags) \ + { #name, test_##name, (flags), NULL, NULL } + +struct testcase_t circuitstats_tests[] = { + TEST_CIRCUITSTATS(circuitstats_hoplen, TT_FORK), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_circuituse.c b/src/wraith/src/test/test_circuituse.c new file mode 100644 index 000000000..df1b43807 --- /dev/null +++ b/src/wraith/src/test/test_circuituse.c @@ -0,0 +1,307 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CIRCUITLIST_PRIVATE + +#include "or.h" +#include "test.h" +#include "test_helpers.h" +#include "config.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "circuitbuild.h" +#include "nodelist.h" + +static void +test_circuit_is_available_for_use_ret_false_when_marked_for_close(void *arg) +{ + (void)arg; + + circuit_t *circ = tor_malloc(sizeof(circuit_t)); + circ->marked_for_close = 1; + + tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); + + done: + tor_free(circ); +} + +static void +test_circuit_is_available_for_use_ret_false_when_timestamp_dirty(void *arg) +{ + (void)arg; + + circuit_t *circ = tor_malloc(sizeof(circuit_t)); + circ->timestamp_dirty = 1; + + tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); + + done: + tor_free(circ); +} + +static void +test_circuit_is_available_for_use_ret_false_for_non_general_purpose(void *arg) +{ + (void)arg; + + circuit_t *circ = tor_malloc(sizeof(circuit_t)); + circ->purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; + + tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); + + done: + tor_free(circ); +} + +static void +test_circuit_is_available_for_use_ret_false_for_non_general_origin(void *arg) +{ + (void)arg; + + circuit_t *circ = tor_malloc(sizeof(circuit_t)); + circ->purpose = CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT; + + tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); + + done: + tor_free(circ); +} + +static void +test_circuit_is_available_for_use_ret_false_for_non_origin_purpose(void *arg) +{ + (void)arg; + + circuit_t *circ = tor_malloc(sizeof(circuit_t)); + circ->purpose = CIRCUIT_PURPOSE_OR; + + tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); + + done: + tor_free(circ); +} + +static void +test_circuit_is_available_for_use_ret_false_unusable_for_new_conns(void *arg) +{ + (void)arg; + + circuit_t *circ = dummy_origin_circuit_new(30); + mark_circuit_unusable_for_new_conns(TO_ORIGIN_CIRCUIT(circ)); + + tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); + + done: + circuit_free(circ); +} + +static void +test_circuit_is_available_for_use_returns_false_for_onehop_tunnel(void *arg) +{ + (void)arg; + + circuit_t *circ = dummy_origin_circuit_new(30); + origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); + oc->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); + oc->build_state->onehop_tunnel = 1; + + tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); + + done: + circuit_free(circ); +} + +static void +test_circuit_is_available_for_use_returns_true_for_clean_circuit(void *arg) +{ + (void)arg; + + circuit_t *circ = dummy_origin_circuit_new(30); + origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); + oc->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); + oc->build_state->onehop_tunnel = 0; + + tt_int_op(1, OP_EQ, circuit_is_available_for_use(circ)); + + done: + circuit_free(circ); +} + +static int +mock_circuit_all_predicted_ports_handled(time_t now, + int *need_uptime, + int *need_capacity) +{ + (void)now; + + if (need_uptime && need_capacity) + return 0; + return 1; +} + +static consensus_path_type_t +mock_router_have_unknown_consensus_path(void) +{ + return CONSENSUS_PATH_UNKNOWN; +} + +static consensus_path_type_t +mock_router_have_exit_consensus_path(void) +{ + return CONSENSUS_PATH_EXIT; +} + +static void +test_needs_exit_circuits_ret_false_for_predicted_ports_and_path(void *arg) +{ + (void)arg; + + MOCK(circuit_all_predicted_ports_handled, + mock_circuit_all_predicted_ports_handled); + int needs_uptime = 1; + int needs_capacity = 0; + + time_t now = time(NULL); + tt_int_op(0, OP_EQ, + needs_exit_circuits(now, &needs_uptime, &needs_capacity)); + + done: + UNMOCK(circuit_all_predicted_ports_handled); +} + +static void +test_needs_exit_circuits_ret_false_for_non_exit_consensus_path(void *arg) +{ + (void)arg; + + MOCK(circuit_all_predicted_ports_handled, + mock_circuit_all_predicted_ports_handled); + int needs_uptime = 1; + int needs_capacity = 1; + MOCK(router_have_consensus_path, mock_router_have_unknown_consensus_path); + + time_t now = time(NULL); + tt_int_op(0, OP_EQ, + needs_exit_circuits(now, &needs_uptime, &needs_capacity)); + + done: + UNMOCK(circuit_all_predicted_ports_handled); + UNMOCK(router_have_consensus_path); +} + +static void +test_needs_exit_circuits_ret_true_for_predicted_ports_and_path(void *arg) +{ + (void)arg; + + MOCK(circuit_all_predicted_ports_handled, + mock_circuit_all_predicted_ports_handled); + int needs_uptime = 1; + int needs_capacity = 1; + MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path); + + time_t now = time(NULL); + tt_int_op(1, OP_EQ, + needs_exit_circuits(now, &needs_uptime, &needs_capacity)); + + done: + UNMOCK(circuit_all_predicted_ports_handled); + UNMOCK(router_have_consensus_path); +} + +static void +test_needs_circuits_for_build_ret_false_consensus_path_unknown(void *arg) +{ + (void)arg; + MOCK(router_have_consensus_path, mock_router_have_unknown_consensus_path); + tt_int_op(0, OP_EQ, needs_circuits_for_build(0)); + done: ; +} + +static void +test_needs_circuits_for_build_ret_false_if_num_less_than_max(void *arg) +{ + (void)arg; + MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path); + tt_int_op(0, OP_EQ, needs_circuits_for_build(13)); + done: + UNMOCK(router_have_consensus_path); +} + +static void +test_needs_circuits_for_build_returns_true_when_more_are_needed(void *arg) +{ + (void)arg; + MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path); + tt_int_op(1, OP_EQ, needs_circuits_for_build(0)); + done: + UNMOCK(router_have_consensus_path); +} + +struct testcase_t circuituse_tests[] = { + { "marked", + test_circuit_is_available_for_use_ret_false_when_marked_for_close, + TT_FORK, NULL, NULL + }, + { "timestamp", + test_circuit_is_available_for_use_ret_false_when_timestamp_dirty, + TT_FORK, NULL, NULL + }, + { "non_general", + test_circuit_is_available_for_use_ret_false_for_non_general_purpose, + TT_FORK, NULL, NULL + }, + { "non_general", + test_circuit_is_available_for_use_ret_false_for_non_general_origin, + TT_FORK, NULL, NULL + }, + { "origin", + test_circuit_is_available_for_use_ret_false_for_non_origin_purpose, + TT_FORK, NULL, NULL + }, + { "clean", + test_circuit_is_available_for_use_ret_false_unusable_for_new_conns, + TT_FORK, NULL, NULL + }, + { "onehop", + test_circuit_is_available_for_use_returns_false_for_onehop_tunnel, + TT_FORK, NULL, NULL + }, + { "clean_circ", + test_circuit_is_available_for_use_returns_true_for_clean_circuit, + TT_FORK, NULL, NULL + }, + { "exit_f", + test_needs_exit_circuits_ret_false_for_predicted_ports_and_path, + TT_FORK, NULL, NULL + }, + { "exit_t", + test_needs_exit_circuits_ret_true_for_predicted_ports_and_path, + TT_FORK, NULL, NULL + }, + { "non_exit", + test_needs_exit_circuits_ret_false_for_non_exit_consensus_path, + TT_FORK, NULL, NULL + }, + { "true", + test_needs_exit_circuits_ret_true_for_predicted_ports_and_path, + TT_FORK, NULL, NULL + }, + { "consensus_path_unknown", + test_needs_circuits_for_build_ret_false_consensus_path_unknown, + TT_FORK, NULL, NULL + }, + { "less_than_max", + test_needs_circuits_for_build_ret_false_if_num_less_than_max, + TT_FORK, NULL, NULL + }, + { "more_needed", + test_needs_circuits_for_build_returns_true_when_more_are_needed, + TT_FORK, NULL, NULL + }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_compat_libevent.c b/src/wraith/src/test/test_compat_libevent.c new file mode 100644 index 000000000..7dd8e6519 --- /dev/null +++ b/src/wraith/src/test/test_compat_libevent.c @@ -0,0 +1,131 @@ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define COMPAT_LIBEVENT_PRIVATE +#include "orconfig.h" +#include "or.h" + +#include "test.h" + +#include "compat_libevent.h" + +#include +#include + +#include "log_test_helpers.h" + +#define NS_MODULE compat_libevent + +static void +test_compat_libevent_logging_callback(void *ignored) +{ + (void)ignored; + setup_full_capture_of_logs(LOG_DEBUG); + + libevent_logging_callback(_EVENT_LOG_DEBUG, "hello world"); + expect_log_msg("Message from libevent: hello world\n"); + expect_log_severity(LOG_DEBUG); + tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); + + mock_clean_saved_logs(); + libevent_logging_callback(_EVENT_LOG_MSG, "hello world another time"); + expect_log_msg("Message from libevent: hello world another time\n"); + expect_log_severity(LOG_INFO); + tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); + + mock_clean_saved_logs(); + libevent_logging_callback(_EVENT_LOG_WARN, "hello world a third time"); + expect_log_msg("Warning from libevent: hello world a third time\n"); + expect_log_severity(LOG_WARN); + tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); + + mock_clean_saved_logs(); + libevent_logging_callback(_EVENT_LOG_ERR, "hello world a fourth time"); + expect_log_msg("Error from libevent: hello world a fourth time\n"); + expect_log_severity(LOG_ERR); + tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); + + mock_clean_saved_logs(); + libevent_logging_callback(42, "hello world a fifth time"); + expect_log_msg("Message [42] from libevent: hello world a fifth time\n"); + expect_log_severity(LOG_WARN); + tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); + + mock_clean_saved_logs(); + libevent_logging_callback(_EVENT_LOG_DEBUG, + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + ); + expect_log_msg("Message from libevent: " + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789" + "012345678901234567890123456789\n"); + expect_log_severity(LOG_DEBUG); + tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); + + mock_clean_saved_logs(); + libevent_logging_callback(42, "xxx\n"); + expect_log_msg("Message [42] from libevent: xxx\n"); + expect_log_severity(LOG_WARN); + tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); + + suppress_libevent_log_msg("something"); + mock_clean_saved_logs(); + libevent_logging_callback(_EVENT_LOG_MSG, "hello there"); + expect_log_msg("Message from libevent: hello there\n"); + expect_log_severity(LOG_INFO); + tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); + + mock_clean_saved_logs(); + libevent_logging_callback(_EVENT_LOG_MSG, "hello there something else"); + expect_no_log_msg("hello there something else"); + if (mock_saved_logs()) + tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 0); + + // No way of verifying the result of this, it seems =/ + configure_libevent_logging(); + + done: + suppress_libevent_log_msg(NULL); + teardown_capture_of_logs(); +} + +static void +test_compat_libevent_header_version(void *ignored) +{ + (void)ignored; + const char *res; + + res = tor_libevent_get_header_version_str(); + tt_str_op(res, OP_EQ, LIBEVENT_VERSION); + + done: + (void)0; +} + +struct testcase_t compat_libevent_tests[] = { + { "logging_callback", test_compat_libevent_logging_callback, + TT_FORK, NULL, NULL }, + { "header_version", test_compat_libevent_header_version, 0, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_config.c b/src/wraith/src/test/test_config.c new file mode 100644 index 000000000..4290d0dc6 --- /dev/null +++ b/src/wraith/src/test/test_config.c @@ -0,0 +1,5649 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define CONFIG_PRIVATE +#define PT_PRIVATE +#define ROUTERSET_PRIVATE +#include "or.h" +#include "address.h" +#include "addressmap.h" +#include "bridges.h" +#include "circuitmux_ewma.h" +#include "circuitbuild.h" +#include "config.h" +#include "confparse.h" +#include "connection.h" +#include "connection_edge.h" +#include "test.h" +#include "util.h" +#include "address.h" +#include "connection_or.h" +#include "control.h" +#include "cpuworker.h" +#include "dirserv.h" +#include "dirvote.h" +#include "dns.h" +#include "entrynodes.h" +#include "transports.h" +#include "ext_orport.h" +#include "geoip.h" +#include "hibernate.h" +#include "main.h" +#include "networkstatus.h" +#include "nodelist.h" +#include "policies.h" +#include "rendclient.h" +#include "rendservice.h" +#include "router.h" +#include "routerlist.h" +#include "routerset.h" +#include "statefile.h" +#include "test.h" +#include "transports.h" +#include "util.h" + +#include "test_helpers.h" + +static void +test_config_addressmap(void *arg) +{ + char buf[1024]; + char address[256]; + time_t expires = TIME_MAX; + (void)arg; + + strlcpy(buf, "MapAddress .invalidwildcard.com *.torserver.exit\n" // invalid + "MapAddress *invalidasterisk.com *.torserver.exit\n" // invalid + "MapAddress *.google.com *.torserver.exit\n" + "MapAddress *.yahoo.com *.google.com.torserver.exit\n" + "MapAddress *.cn.com www.cnn.com\n" + "MapAddress *.cnn.com www.cnn.com\n" + "MapAddress ex.com www.cnn.com\n" + "MapAddress ey.com *.cnn.com\n" + "MapAddress www.torproject.org 1.1.1.1\n" + "MapAddress other.torproject.org " + "this.torproject.org.otherserver.exit\n" + "MapAddress test.torproject.org 2.2.2.2\n" + "MapAddress www.google.com 3.3.3.3\n" + "MapAddress www.example.org 4.4.4.4\n" + "MapAddress 4.4.4.4 7.7.7.7\n" + "MapAddress 4.4.4.4 5.5.5.5\n" + "MapAddress www.infiniteloop.org 6.6.6.6\n" + "MapAddress 6.6.6.6 www.infiniteloop.org\n" + , sizeof(buf)); + + config_get_lines(buf, &(get_options_mutable()->AddressMap), 0); + config_register_addressmaps(get_options()); + +/* Use old interface for now, so we don't need to rewrite the unit tests */ +#define addressmap_rewrite(a,s,eo,ao) \ + addressmap_rewrite((a),(s), ~0, (eo),(ao)) + + /* MapAddress .invalidwildcard.com .torserver.exit - no match */ + strlcpy(address, "www.invalidwildcard.com", sizeof(address)); + tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); + + /* MapAddress *invalidasterisk.com .torserver.exit - no match */ + strlcpy(address, "www.invalidasterisk.com", sizeof(address)); + tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); + + /* Where no mapping for FQDN match on top-level domain */ + /* MapAddress .google.com .torserver.exit */ + strlcpy(address, "reader.google.com", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "reader.torserver.exit"); + + /* MapAddress *.yahoo.com *.google.com.torserver.exit */ + strlcpy(address, "reader.yahoo.com", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "reader.google.com.torserver.exit"); + + /*MapAddress *.cnn.com www.cnn.com */ + strlcpy(address, "cnn.com", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "www.cnn.com"); + + /* MapAddress .cn.com www.cnn.com */ + strlcpy(address, "www.cn.com", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "www.cnn.com"); + + /* MapAddress ex.com www.cnn.com - no match */ + strlcpy(address, "www.ex.com", sizeof(address)); + tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); + + /* MapAddress ey.com *.cnn.com - invalid expression */ + strlcpy(address, "ey.com", sizeof(address)); + tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); + + /* Where mapping for FQDN match on FQDN */ + strlcpy(address, "www.google.com", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "3.3.3.3"); + + strlcpy(address, "www.torproject.org", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "1.1.1.1"); + + strlcpy(address, "other.torproject.org", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "this.torproject.org.otherserver.exit"); + + strlcpy(address, "test.torproject.org", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "2.2.2.2"); + + /* Test a chain of address mappings and the order in which they were added: + "MapAddress www.example.org 4.4.4.4" + "MapAddress 4.4.4.4 7.7.7.7" + "MapAddress 4.4.4.4 5.5.5.5" + */ + strlcpy(address, "www.example.org", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "5.5.5.5"); + + /* Test infinite address mapping results in no change */ + strlcpy(address, "www.infiniteloop.org", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "www.infiniteloop.org"); + + /* Test we don't find false positives */ + strlcpy(address, "www.example.com", sizeof(address)); + tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); + + /* Test top-level-domain matching a bit harder */ + config_free_lines(get_options_mutable()->AddressMap); + addressmap_clear_configured(); + strlcpy(buf, "MapAddress *.com *.torserver.exit\n" + "MapAddress *.torproject.org 1.1.1.1\n" + "MapAddress *.net 2.2.2.2\n" + , sizeof(buf)); + config_get_lines(buf, &(get_options_mutable()->AddressMap), 0); + config_register_addressmaps(get_options()); + + strlcpy(address, "www.abc.com", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "www.abc.torserver.exit"); + + strlcpy(address, "www.def.com", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "www.def.torserver.exit"); + + strlcpy(address, "www.torproject.org", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "1.1.1.1"); + + strlcpy(address, "test.torproject.org", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "1.1.1.1"); + + strlcpy(address, "torproject.net", sizeof(address)); + tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); + tt_str_op(address,OP_EQ, "2.2.2.2"); + + /* We don't support '*' as a mapping directive */ + config_free_lines(get_options_mutable()->AddressMap); + addressmap_clear_configured(); + strlcpy(buf, "MapAddress * *.torserver.exit\n", sizeof(buf)); + config_get_lines(buf, &(get_options_mutable()->AddressMap), 0); + config_register_addressmaps(get_options()); + + strlcpy(address, "www.abc.com", sizeof(address)); + tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); + + strlcpy(address, "www.def.net", sizeof(address)); + tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); + + strlcpy(address, "www.torproject.org", sizeof(address)); + tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); + +#undef addressmap_rewrite + + done: + config_free_lines(get_options_mutable()->AddressMap); + get_options_mutable()->AddressMap = NULL; + addressmap_free_all(); +} + +static int +is_private_dir(const char* path) +{ + struct stat st; + int r = stat(path, &st); + if (r) { + return 0; + } +#if !defined (_WIN32) + if ((st.st_mode & (S_IFDIR | 0777)) != (S_IFDIR | 0700)) { + return 0; + } +#endif + return 1; +} + +static void +test_config_check_or_create_data_subdir(void *arg) +{ + or_options_t *options = get_options_mutable(); + char *datadir; + const char *subdir = "test_stats"; + char *subpath; + struct stat st; + int r; +#if !defined (_WIN32) + unsigned group_permission; +#endif + (void)arg; + + tor_free(options->DataDirectory); + datadir = options->DataDirectory = tor_strdup(get_fname("datadir-0")); + subpath = get_datadir_fname(subdir); + +#if defined (_WIN32) + tt_int_op(mkdir(options->DataDirectory), OP_EQ, 0); +#else + tt_int_op(mkdir(options->DataDirectory, 0700), OP_EQ, 0); +#endif + + r = stat(subpath, &st); + + // The subdirectory shouldn't exist yet, + // but should be created by the call to check_or_create_data_subdir. + tt_assert(r && (errno == ENOENT)); + tt_assert(!check_or_create_data_subdir(subdir)); + tt_assert(is_private_dir(subpath)); + + // The check should return 0, if the directory already exists + // and is private to the user. + tt_assert(!check_or_create_data_subdir(subdir)); + + r = stat(subpath, &st); + if (r) { + tt_abort_perror("stat"); + } + +#if !defined (_WIN32) + group_permission = st.st_mode | 0070; + r = chmod(subpath, group_permission); + + if (r) { + tt_abort_perror("chmod"); + } + + // If the directory exists, but its mode is too permissive + // a call to check_or_create_data_subdir should reset the mode. + tt_assert(!is_private_dir(subpath)); + tt_assert(!check_or_create_data_subdir(subdir)); + tt_assert(is_private_dir(subpath)); +#endif /* !defined (_WIN32) */ + + done: + rmdir(subpath); + tor_free(datadir); + tor_free(subpath); +} + +static void +test_config_write_to_data_subdir(void *arg) +{ + or_options_t* options = get_options_mutable(); + char *datadir; + char *cp = NULL; + const char* subdir = "test_stats"; + const char* fname = "test_file"; + const char* str = + "Lorem ipsum dolor sit amet, consetetur sadipscing\n" + "elitr, sed diam nonumy eirmod\n" + "tempor invidunt ut labore et dolore magna aliquyam\n" + "erat, sed diam voluptua.\n" + "At vero eos et accusam et justo duo dolores et ea\n" + "rebum. Stet clita kasd gubergren,\n" + "no sea takimata sanctus est Lorem ipsum dolor sit amet.\n" + "Lorem ipsum dolor sit amet,\n" + "consetetur sadipscing elitr, sed diam nonumy eirmod\n" + "tempor invidunt ut labore et dolore\n" + "magna aliquyam erat, sed diam voluptua. At vero eos et\n" + "accusam et justo duo dolores et\n" + "ea rebum. Stet clita kasd gubergren, no sea takimata\n" + "sanctus est Lorem ipsum dolor sit amet."; + char* filepath = NULL; + (void)arg; + + tor_free(options->DataDirectory); + datadir = options->DataDirectory = tor_strdup(get_fname("datadir-1")); + filepath = get_datadir_fname2(subdir, fname); + +#if defined (_WIN32) + tt_int_op(mkdir(options->DataDirectory), OP_EQ, 0); +#else + tt_int_op(mkdir(options->DataDirectory, 0700), OP_EQ, 0); +#endif + + // Write attempt shoudl fail, if subdirectory doesn't exist. + tt_assert(write_to_data_subdir(subdir, fname, str, NULL)); + tt_assert(! check_or_create_data_subdir(subdir)); + + // Content of file after write attempt should be + // equal to the original string. + tt_assert(!write_to_data_subdir(subdir, fname, str, NULL)); + cp = read_file_to_str(filepath, 0, NULL); + tt_str_op(cp,OP_EQ, str); + tor_free(cp); + + // A second write operation should overwrite the old content. + tt_assert(!write_to_data_subdir(subdir, fname, str, NULL)); + cp = read_file_to_str(filepath, 0, NULL); + tt_str_op(cp,OP_EQ, str); + tor_free(cp); + + done: + (void) unlink(filepath); + rmdir(options->DataDirectory); + tor_free(datadir); + tor_free(filepath); + tor_free(cp); +} + +/* Test helper function: Make sure that a bridge line gets parsed + * properly. Also make sure that the resulting bridge_line_t structure + * has its fields set correctly. */ +static void +good_bridge_line_test(const char *string, const char *test_addrport, + const char *test_digest, const char *test_transport, + const smartlist_t *test_socks_args) +{ + char *tmp = NULL; + bridge_line_t *bridge_line = parse_bridge_line(string); + tt_assert(bridge_line); + + /* test addrport */ + tmp = tor_strdup(fmt_addrport(&bridge_line->addr, bridge_line->port)); + tt_str_op(test_addrport,OP_EQ, tmp); + tor_free(tmp); + + /* If we were asked to validate a digest, but we did not get a + digest after parsing, we failed. */ + if (test_digest && tor_digest_is_zero(bridge_line->digest)) + tt_abort(); + + /* If we were not asked to validate a digest, and we got a digest + after parsing, we failed again. */ + if (!test_digest && !tor_digest_is_zero(bridge_line->digest)) + tt_abort(); + + /* If we were asked to validate a digest, and we got a digest after + parsing, make sure it's correct. */ + if (test_digest) { + tmp = tor_strdup(hex_str(bridge_line->digest, DIGEST_LEN)); + tor_strlower(tmp); + tt_str_op(test_digest,OP_EQ, tmp); + tor_free(tmp); + } + + /* If we were asked to validate a transport name, make sure tha it + matches with the transport name that was parsed. */ + if (test_transport && !bridge_line->transport_name) + tt_abort(); + if (!test_transport && bridge_line->transport_name) + tt_abort(); + if (test_transport) + tt_str_op(test_transport,OP_EQ, bridge_line->transport_name); + + /* Validate the SOCKS argument smartlist. */ + if (test_socks_args && !bridge_line->socks_args) + tt_abort(); + if (!test_socks_args && bridge_line->socks_args) + tt_abort(); + if (test_socks_args) + tt_assert(smartlist_strings_eq(test_socks_args, + bridge_line->socks_args)); + + done: + tor_free(tmp); + bridge_line_free(bridge_line); +} + +/* Test helper function: Make sure that a bridge line is + * unparseable. */ +static void +bad_bridge_line_test(const char *string) +{ + bridge_line_t *bridge_line = parse_bridge_line(string); + if (bridge_line) + TT_FAIL(("%s was supposed to fail, but it didn't.", string)); + tt_ptr_op(bridge_line, OP_EQ, NULL); + + done: + bridge_line_free(bridge_line); +} + +static void +test_config_parse_bridge_line(void *arg) +{ + (void) arg; + good_bridge_line_test("192.0.2.1:4123", + "192.0.2.1:4123", NULL, NULL, NULL); + + good_bridge_line_test("192.0.2.1", + "192.0.2.1:443", NULL, NULL, NULL); + + good_bridge_line_test("transport [::1]", + "[::1]:443", NULL, "transport", NULL); + + good_bridge_line_test("transport 192.0.2.1:12 " + "4352e58420e68f5e40bf7c74faddccd9d1349413", + "192.0.2.1:12", + "4352e58420e68f5e40bf7c74faddccd9d1349413", + "transport", NULL); + + { + smartlist_t *sl_tmp = smartlist_new(); + smartlist_add_asprintf(sl_tmp, "twoandtwo=five"); + + good_bridge_line_test("transport 192.0.2.1:12 " + "4352e58420e68f5e40bf7c74faddccd9d1349413 twoandtwo=five", + "192.0.2.1:12", "4352e58420e68f5e40bf7c74faddccd9d1349413", + "transport", sl_tmp); + + SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); + smartlist_free(sl_tmp); + } + + { + smartlist_t *sl_tmp = smartlist_new(); + smartlist_add_asprintf(sl_tmp, "twoandtwo=five"); + smartlist_add_asprintf(sl_tmp, "z=z"); + + good_bridge_line_test("transport 192.0.2.1:12 twoandtwo=five z=z", + "192.0.2.1:12", NULL, "transport", sl_tmp); + + SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); + smartlist_free(sl_tmp); + } + + { + smartlist_t *sl_tmp = smartlist_new(); + smartlist_add_asprintf(sl_tmp, "dub=come"); + smartlist_add_asprintf(sl_tmp, "save=me"); + + good_bridge_line_test("transport 192.0.2.1:12 " + "4352e58420e68f5e40bf7c74faddccd9d1349666 " + "dub=come save=me", + + "192.0.2.1:12", + "4352e58420e68f5e40bf7c74faddccd9d1349666", + "transport", sl_tmp); + + SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); + smartlist_free(sl_tmp); + } + + good_bridge_line_test("192.0.2.1:1231 " + "4352e58420e68f5e40bf7c74faddccd9d1349413", + "192.0.2.1:1231", + "4352e58420e68f5e40bf7c74faddccd9d1349413", + NULL, NULL); + + /* Empty line */ + bad_bridge_line_test(""); + /* bad transport name */ + bad_bridge_line_test("tr$n_sp0r7 190.20.2.2"); + /* weird ip address */ + bad_bridge_line_test("a.b.c.d"); + /* invalid fpr */ + bad_bridge_line_test("2.2.2.2:1231 4352e58420e68f5e40bf7c74faddccd9d1349"); + /* no k=v in the end */ + bad_bridge_line_test("obfs2 2.2.2.2:1231 " + "4352e58420e68f5e40bf7c74faddccd9d1349413 what"); + /* no addrport */ + bad_bridge_line_test("asdw"); + /* huge k=v value that can't fit in SOCKS fields */ + bad_bridge_line_test( + "obfs2 2.2.2.2:1231 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aa=b"); +} + +static void +test_config_parse_transport_options_line(void *arg) +{ + smartlist_t *options_sl = NULL, *sl_tmp = NULL; + + (void) arg; + + { /* too small line */ + options_sl = get_options_from_transport_options_line("valley", NULL); + tt_ptr_op(options_sl, OP_EQ, NULL); + } + + { /* no k=v values */ + options_sl = get_options_from_transport_options_line("hit it!", NULL); + tt_ptr_op(options_sl, OP_EQ, NULL); + } + + { /* correct line, but wrong transport specified */ + options_sl = + get_options_from_transport_options_line("trebuchet k=v", "rook"); + tt_ptr_op(options_sl, OP_EQ, NULL); + } + + { /* correct -- no transport specified */ + sl_tmp = smartlist_new(); + smartlist_add_asprintf(sl_tmp, "ladi=dadi"); + smartlist_add_asprintf(sl_tmp, "weliketo=party"); + + options_sl = + get_options_from_transport_options_line("rook ladi=dadi weliketo=party", + NULL); + tt_assert(options_sl); + tt_assert(smartlist_strings_eq(options_sl, sl_tmp)); + + SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); + smartlist_free(sl_tmp); + sl_tmp = NULL; + SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s)); + smartlist_free(options_sl); + options_sl = NULL; + } + + { /* correct -- correct transport specified */ + sl_tmp = smartlist_new(); + smartlist_add_asprintf(sl_tmp, "ladi=dadi"); + smartlist_add_asprintf(sl_tmp, "weliketo=party"); + + options_sl = + get_options_from_transport_options_line("rook ladi=dadi weliketo=party", + "rook"); + tt_assert(options_sl); + tt_assert(smartlist_strings_eq(options_sl, sl_tmp)); + SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); + smartlist_free(sl_tmp); + sl_tmp = NULL; + SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s)); + smartlist_free(options_sl); + options_sl = NULL; + } + + done: + if (options_sl) { + SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s)); + smartlist_free(options_sl); + } + if (sl_tmp) { + SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); + smartlist_free(sl_tmp); + } +} + +/* Mocks needed for the transport plugin line test */ + +static void pt_kickstart_proxy_mock(const smartlist_t *transport_list, + char **proxy_argv, int is_server); +static int transport_add_from_config_mock(const tor_addr_t *addr, + uint16_t port, const char *name, + int socks_ver); +static int transport_is_needed_mock(const char *transport_name); + +static int pt_kickstart_proxy_mock_call_count = 0; +static int transport_add_from_config_mock_call_count = 0; +static int transport_is_needed_mock_call_count = 0; +static int transport_is_needed_mock_return = 0; + +static void +pt_kickstart_proxy_mock(const smartlist_t *transport_list, + char **proxy_argv, int is_server) +{ + (void) transport_list; + (void) proxy_argv; + (void) is_server; + /* XXXX check that args are as expected. */ + + ++pt_kickstart_proxy_mock_call_count; + + free_execve_args(proxy_argv); +} + +static int +transport_add_from_config_mock(const tor_addr_t *addr, + uint16_t port, const char *name, + int socks_ver) +{ + (void) addr; + (void) port; + (void) name; + (void) socks_ver; + /* XXXX check that args are as expected. */ + + ++transport_add_from_config_mock_call_count; + + return 0; +} + +static int +transport_is_needed_mock(const char *transport_name) +{ + (void) transport_name; + /* XXXX check that arg is as expected. */ + + ++transport_is_needed_mock_call_count; + + return transport_is_needed_mock_return; +} + +/** + * Test parsing for the ClientTransportPlugin and ServerTransportPlugin config + * options. + */ + +static void +test_config_parse_transport_plugin_line(void *arg) +{ + (void)arg; + + or_options_t *options = get_options_mutable(); + int r, tmp; + int old_pt_kickstart_proxy_mock_call_count; + int old_transport_add_from_config_mock_call_count; + int old_transport_is_needed_mock_call_count; + + /* Bad transport lines - too short */ + r = parse_transport_line(options, "bad", 1, 0); + tt_int_op(r, OP_LT, 0); + r = parse_transport_line(options, "bad", 1, 1); + tt_int_op(r, OP_LT, 0); + r = parse_transport_line(options, "bad bad", 1, 0); + tt_int_op(r, OP_LT, 0); + r = parse_transport_line(options, "bad bad", 1, 1); + tt_int_op(r, OP_LT, 0); + + /* Test transport list parsing */ + r = parse_transport_line(options, + "transport_1 exec /usr/bin/fake-transport", 1, 0); + tt_int_op(r, OP_EQ, 0); + r = parse_transport_line(options, + "transport_1 exec /usr/bin/fake-transport", 1, 1); + tt_int_op(r, OP_EQ, 0); + r = parse_transport_line(options, + "transport_1,transport_2 exec /usr/bin/fake-transport", 1, 0); + tt_int_op(r, OP_EQ, 0); + r = parse_transport_line(options, + "transport_1,transport_2 exec /usr/bin/fake-transport", 1, 1); + tt_int_op(r, OP_EQ, 0); + /* Bad transport identifiers */ + r = parse_transport_line(options, + "transport_* exec /usr/bin/fake-transport", 1, 0); + tt_int_op(r, OP_LT, 0); + r = parse_transport_line(options, + "transport_* exec /usr/bin/fake-transport", 1, 1); + tt_int_op(r, OP_LT, 0); + + /* Check SOCKS cases for client transport */ + r = parse_transport_line(options, + "transport_1 socks4 1.2.3.4:567", 1, 0); + tt_int_op(r, OP_EQ, 0); + r = parse_transport_line(options, + "transport_1 socks5 1.2.3.4:567", 1, 0); + tt_int_op(r, OP_EQ, 0); + /* Proxy case for server transport */ + r = parse_transport_line(options, + "transport_1 proxy 1.2.3.4:567", 1, 1); + tt_int_op(r, OP_EQ, 0); + /* Multiple-transport error exit */ + r = parse_transport_line(options, + "transport_1,transport_2 socks5 1.2.3.4:567", 1, 0); + tt_int_op(r, OP_LT, 0); + r = parse_transport_line(options, + "transport_1,transport_2 proxy 1.2.3.4:567", 1, 1); + tt_int_op(r, OP_LT, 0); + /* No port error exit */ + r = parse_transport_line(options, + "transport_1 socks5 1.2.3.4", 1, 0); + tt_int_op(r, OP_LT, 0); + r = parse_transport_line(options, + "transport_1 proxy 1.2.3.4", 1, 1); + tt_int_op(r, OP_LT, 0); + /* Unparsable address error exit */ + r = parse_transport_line(options, + "transport_1 socks5 1.2.3:6x7", 1, 0); + tt_int_op(r, OP_LT, 0); + r = parse_transport_line(options, + "transport_1 proxy 1.2.3:6x7", 1, 1); + tt_int_op(r, OP_LT, 0); + + /* "Strange {Client|Server}TransportPlugin field" error exit */ + r = parse_transport_line(options, + "transport_1 foo bar", 1, 0); + tt_int_op(r, OP_LT, 0); + r = parse_transport_line(options, + "transport_1 foo bar", 1, 1); + tt_int_op(r, OP_LT, 0); + + /* No sandbox mode error exit */ + tmp = options->Sandbox; + options->Sandbox = 1; + r = parse_transport_line(options, + "transport_1 exec /usr/bin/fake-transport", 1, 0); + tt_int_op(r, OP_LT, 0); + r = parse_transport_line(options, + "transport_1 exec /usr/bin/fake-transport", 1, 1); + tt_int_op(r, OP_LT, 0); + options->Sandbox = tmp; + + /* + * These final test cases cover code paths that only activate without + * validate_only, so they need mocks in place. + */ + MOCK(pt_kickstart_proxy, pt_kickstart_proxy_mock); + old_pt_kickstart_proxy_mock_call_count = + pt_kickstart_proxy_mock_call_count; + r = parse_transport_line(options, + "transport_1 exec /usr/bin/fake-transport", 0, 1); + tt_int_op(r, OP_EQ, 0); + tt_assert(pt_kickstart_proxy_mock_call_count == + old_pt_kickstart_proxy_mock_call_count + 1); + UNMOCK(pt_kickstart_proxy); + + /* This one hits a log line in the !validate_only case only */ + r = parse_transport_line(options, + "transport_1 proxy 1.2.3.4:567", 0, 1); + tt_int_op(r, OP_EQ, 0); + + /* Check mocked client transport cases */ + MOCK(pt_kickstart_proxy, pt_kickstart_proxy_mock); + MOCK(transport_add_from_config, transport_add_from_config_mock); + MOCK(transport_is_needed, transport_is_needed_mock); + + /* Unnecessary transport case */ + transport_is_needed_mock_return = 0; + old_pt_kickstart_proxy_mock_call_count = + pt_kickstart_proxy_mock_call_count; + old_transport_add_from_config_mock_call_count = + transport_add_from_config_mock_call_count; + old_transport_is_needed_mock_call_count = + transport_is_needed_mock_call_count; + r = parse_transport_line(options, + "transport_1 exec /usr/bin/fake-transport", 0, 0); + /* Should have succeeded */ + tt_int_op(r, OP_EQ, 0); + /* transport_is_needed() should have been called */ + tt_assert(transport_is_needed_mock_call_count == + old_transport_is_needed_mock_call_count + 1); + /* + * pt_kickstart_proxy() and transport_add_from_config() should + * not have been called. + */ + tt_assert(pt_kickstart_proxy_mock_call_count == + old_pt_kickstart_proxy_mock_call_count); + tt_assert(transport_add_from_config_mock_call_count == + old_transport_add_from_config_mock_call_count); + + /* Necessary transport case */ + transport_is_needed_mock_return = 1; + old_pt_kickstart_proxy_mock_call_count = + pt_kickstart_proxy_mock_call_count; + old_transport_add_from_config_mock_call_count = + transport_add_from_config_mock_call_count; + old_transport_is_needed_mock_call_count = + transport_is_needed_mock_call_count; + r = parse_transport_line(options, + "transport_1 exec /usr/bin/fake-transport", 0, 0); + /* Should have succeeded */ + tt_int_op(r, OP_EQ, 0); + /* + * transport_is_needed() and pt_kickstart_proxy() should have been + * called. + */ + tt_assert(pt_kickstart_proxy_mock_call_count == + old_pt_kickstart_proxy_mock_call_count + 1); + tt_assert(transport_is_needed_mock_call_count == + old_transport_is_needed_mock_call_count + 1); + /* transport_add_from_config() should not have been called. */ + tt_assert(transport_add_from_config_mock_call_count == + old_transport_add_from_config_mock_call_count); + + /* proxy case */ + transport_is_needed_mock_return = 1; + old_pt_kickstart_proxy_mock_call_count = + pt_kickstart_proxy_mock_call_count; + old_transport_add_from_config_mock_call_count = + transport_add_from_config_mock_call_count; + old_transport_is_needed_mock_call_count = + transport_is_needed_mock_call_count; + r = parse_transport_line(options, + "transport_1 socks5 1.2.3.4:567", 0, 0); + /* Should have succeeded */ + tt_int_op(r, OP_EQ, 0); + /* + * transport_is_needed() and transport_add_from_config() should have + * been called. + */ + tt_assert(transport_add_from_config_mock_call_count == + old_transport_add_from_config_mock_call_count + 1); + tt_assert(transport_is_needed_mock_call_count == + old_transport_is_needed_mock_call_count + 1); + /* pt_kickstart_proxy() should not have been called. */ + tt_assert(pt_kickstart_proxy_mock_call_count == + old_pt_kickstart_proxy_mock_call_count); + + /* Done with mocked client transport cases */ + UNMOCK(transport_is_needed); + UNMOCK(transport_add_from_config); + UNMOCK(pt_kickstart_proxy); + + done: + /* Make sure we undo all mocks */ + UNMOCK(pt_kickstart_proxy); + UNMOCK(transport_add_from_config); + UNMOCK(transport_is_needed); + + return; +} + +// Tests if an options with MyFamily fingerprints missing '$' normalises +// them correctly and also ensure it also works with multiple fingerprints +static void +test_config_fix_my_family(void *arg) +{ + char *err = NULL; + config_line_t *family = tor_malloc_zero(sizeof(config_line_t)); + family->key = tor_strdup("MyFamily"); + family->value = tor_strdup("$1111111111111111111111111111111111111111, " + "1111111111111111111111111111111111111112, " + "$1111111111111111111111111111111111111113"); + + config_line_t *family2 = tor_malloc_zero(sizeof(config_line_t)); + family2->key = tor_strdup("MyFamily"); + family2->value = tor_strdup("1111111111111111111111111111111111111114"); + + config_line_t *family3 = tor_malloc_zero(sizeof(config_line_t)); + family3->key = tor_strdup("MyFamily"); + family3->value = tor_strdup("$1111111111111111111111111111111111111115"); + + family->next = family2; + family2->next = family3; + family3->next = NULL; + + or_options_t* options = options_new(); + or_options_t* defaults = options_new(); + (void) arg; + + options_init(options); + options_init(defaults); + options->MyFamily_lines = family; + + options_validate(NULL, options, defaults, 0, &err) ; + + if (err != NULL) { + TT_FAIL(("options_validate failed: %s", err)); + } + + const char *valid[] = { "$1111111111111111111111111111111111111111", + "$1111111111111111111111111111111111111112", + "$1111111111111111111111111111111111111113", + "$1111111111111111111111111111111111111114", + "$1111111111111111111111111111111111111115" }; + int ret_size = 0; + config_line_t *ret; + for (ret = options->MyFamily; ret && ret_size < 5; ret = ret->next) { + tt_str_op(ret->value, OP_EQ, valid[ret_size]); + ret_size++; + } + tt_int_op(ret_size, OP_EQ, 5); + + done: + tor_free(err); + or_options_free(options); + or_options_free(defaults); +} + +static int n_hostname_01010101 = 0; + +/** This mock function is meant to replace tor_lookup_hostname(). + * It answers with 1.1.1.1 as IP adddress that resulted from lookup. + * This function increments n_hostname_01010101 counter by one + * every time it is called. + */ +static int +tor_lookup_hostname_01010101(const char *name, uint32_t *addr) +{ + n_hostname_01010101++; + + if (name && addr) { + *addr = ntohl(0x01010101); + } + + return 0; +} + +static int n_hostname_localhost = 0; + +/** This mock function is meant to replace tor_lookup_hostname(). + * It answers with 127.0.0.1 as IP adddress that resulted from lookup. + * This function increments n_hostname_localhost counter by one + * every time it is called. + */ +static int +tor_lookup_hostname_localhost(const char *name, uint32_t *addr) +{ + n_hostname_localhost++; + + if (name && addr) { + *addr = 0x7f000001; + } + + return 0; +} + +static int n_hostname_failure = 0; + +/** This mock function is meant to replace tor_lookup_hostname(). + * It pretends to fail by returning -1 to caller. Also, this function + * increments n_hostname_failure every time it is called. + */ +static int +tor_lookup_hostname_failure(const char *name, uint32_t *addr) +{ + (void)name; + (void)addr; + + n_hostname_failure++; + + return -1; +} + +static int n_gethostname_replacement = 0; + +/** This mock function is meant to replace tor_gethostname(). It + * responds with string "onionrouter!" as hostname. This function + * increments n_gethostname_replacement by one every time + * it is called. + */ +static int +tor_gethostname_replacement(char *name, size_t namelen) +{ + n_gethostname_replacement++; + + if (name && namelen) { + strlcpy(name,"onionrouter!",namelen); + } + + return 0; +} + +static int n_gethostname_localhost = 0; + +/** This mock function is meant to replace tor_gethostname(). It + * responds with string "127.0.0.1" as hostname. This function + * increments n_gethostname_localhost by one every time + * it is called. + */ +static int +tor_gethostname_localhost(char *name, size_t namelen) +{ + n_gethostname_localhost++; + + if (name && namelen) { + strlcpy(name,"127.0.0.1",namelen); + } + + return 0; +} + +static int n_gethostname_failure = 0; + +/** This mock function is meant to replace tor_gethostname. + * It pretends to fail by returning -1. This function increments + * n_gethostname_failure by one every time it is called. + */ +static int +tor_gethostname_failure(char *name, size_t namelen) +{ + (void)name; + (void)namelen; + n_gethostname_failure++; + + return -1; +} + +static int n_get_interface_address = 0; + +/** This mock function is meant to replace get_interface_address(). + * It answers with address 8.8.8.8. This function increments + * n_get_interface_address by one every time it is called. + */ +static int +get_interface_address_08080808(int severity, uint32_t *addr) +{ + (void)severity; + + n_get_interface_address++; + + if (addr) { + *addr = ntohl(0x08080808); + } + + return 0; +} + +static int n_get_interface_address6 = 0; +static sa_family_t last_address6_family; + +/** This mock function is meant to replace get_interface_address6(). + * It answers with IP address 9.9.9.9 iff both of the following are true: + * - family is AF_INET + * - addr pointer is not NULL. + * This function increments n_get_interface_address6 by one every + * time it is called. + */ +static int +get_interface_address6_replacement(int severity, sa_family_t family, + tor_addr_t *addr) +{ + (void)severity; + + last_address6_family = family; + n_get_interface_address6++; + + if ((family != AF_INET) || !addr) { + return -1; + } + + tor_addr_from_ipv4h(addr,0x09090909); + + return 0; +} + +static int n_get_interface_address_failure = 0; + +/** + * This mock function is meant to replace get_interface_address(). + * It pretends to fail getting interface address by returning -1. + * n_get_interface_address_failure is incremented by one + * every time this function is called. + */ +static int +get_interface_address_failure(int severity, uint32_t *addr) +{ + (void)severity; + (void)addr; + + n_get_interface_address_failure++; + + return -1; +} + +static int n_get_interface_address6_failure = 0; + +/** + * This mock function is meant to replace get_interface_addres6(). + * It will pretend to fail by return -1. + * n_get_interface_address6_failure is incremented by one + * every time this function is called and last_address6_family + * is assigned the value of family argument. + */ +static int +get_interface_address6_failure(int severity, sa_family_t family, + tor_addr_t *addr) +{ + (void)severity; + (void)addr; + n_get_interface_address6_failure++; + last_address6_family = family; + + return -1; +} + +static void +test_config_resolve_my_address(void *arg) +{ + or_options_t *options; + uint32_t resolved_addr; + const char *method_used; + char *hostname_out = NULL; + int retval; + int prev_n_hostname_01010101; + int prev_n_hostname_localhost; + int prev_n_hostname_failure; + int prev_n_gethostname_replacement; + int prev_n_gethostname_failure; + int prev_n_gethostname_localhost; + int prev_n_get_interface_address; + int prev_n_get_interface_address_failure; + int prev_n_get_interface_address6; + int prev_n_get_interface_address6_failure; + + (void)arg; + + options = options_new(); + + options_init(options); + + /* + * CASE 1: + * If options->Address is a valid IPv4 address string, we want + * the corresponding address to be parsed and returned. + */ + + options->Address = tor_strdup("128.52.128.105"); + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(retval == 0); + tt_want_str_op(method_used,OP_EQ,"CONFIGURED"); + tt_want(hostname_out == NULL); + tt_assert(resolved_addr == 0x80348069); + + tor_free(options->Address); + +/* + * CASE 2: + * If options->Address is a valid DNS address, we want resolve_my_address() + * function to ask tor_lookup_hostname() for help with resolving it + * and return the address that was resolved (in host order). + */ + + MOCK(tor_lookup_hostname,tor_lookup_hostname_01010101); + + tor_free(options->Address); + options->Address = tor_strdup("www.torproject.org"); + + prev_n_hostname_01010101 = n_hostname_01010101; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(retval == 0); + tt_want(n_hostname_01010101 == prev_n_hostname_01010101 + 1); + tt_want_str_op(method_used,OP_EQ,"RESOLVED"); + tt_want_str_op(hostname_out,OP_EQ,"www.torproject.org"); + tt_assert(resolved_addr == 0x01010101); + + UNMOCK(tor_lookup_hostname); + + tor_free(options->Address); + tor_free(hostname_out); + +/* + * CASE 3: + * Given that options->Address is NULL, we want resolve_my_address() + * to try and use tor_gethostname() to get hostname AND use + * tor_lookup_hostname() to get IP address. + */ + + resolved_addr = 0; + tor_free(options->Address); + options->Address = NULL; + + MOCK(tor_gethostname,tor_gethostname_replacement); + MOCK(tor_lookup_hostname,tor_lookup_hostname_01010101); + + prev_n_gethostname_replacement = n_gethostname_replacement; + prev_n_hostname_01010101 = n_hostname_01010101; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(retval == 0); + tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); + tt_want(n_hostname_01010101 == prev_n_hostname_01010101 + 1); + tt_want_str_op(method_used,OP_EQ,"GETHOSTNAME"); + tt_want_str_op(hostname_out,OP_EQ,"onionrouter!"); + tt_assert(resolved_addr == 0x01010101); + + UNMOCK(tor_gethostname); + UNMOCK(tor_lookup_hostname); + + tor_free(hostname_out); + +/* + * CASE 4: + * Given that options->Address is a local host address, we want + * resolve_my_address() function to fail. + */ + + resolved_addr = 0; + tor_free(options->Address); + options->Address = tor_strdup("127.0.0.1"); + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(resolved_addr == 0); + tt_int_op(retval, OP_EQ, -1); + + tor_free(options->Address); + tor_free(hostname_out); + +/* + * CASE 5: + * We want resolve_my_address() to fail if DNS address in options->Address + * cannot be resolved. + */ + + MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); + + prev_n_hostname_failure = n_hostname_failure; + + tor_free(options->Address); + options->Address = tor_strdup("www.tor-project.org"); + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(n_hostname_failure == prev_n_hostname_failure + 1); + tt_int_op(retval, OP_EQ, -1); + + UNMOCK(tor_lookup_hostname); + + tor_free(options->Address); + tor_free(hostname_out); + +/* + * CASE 6: + * If options->Address is NULL AND gettting local hostname fails, we want + * resolve_my_address() to fail as well. + */ + + MOCK(tor_gethostname,tor_gethostname_failure); + + prev_n_gethostname_failure = n_gethostname_failure; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(n_gethostname_failure == prev_n_gethostname_failure + 1); + tt_int_op(retval, OP_EQ, -1); + + UNMOCK(tor_gethostname); + tor_free(hostname_out); + +/* + * CASE 7: + * We want resolve_my_address() to try and get network interface address via + * get_interface_address() if hostname returned by tor_gethostname() cannot be + * resolved into IP address. + */ + + MOCK(tor_gethostname,tor_gethostname_replacement); + MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); + MOCK(get_interface_address,get_interface_address_08080808); + + prev_n_gethostname_replacement = n_gethostname_replacement; + prev_n_get_interface_address = n_get_interface_address; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(retval == 0); + tt_want_int_op(n_gethostname_replacement, OP_EQ, + prev_n_gethostname_replacement + 1); + tt_want_int_op(n_get_interface_address, OP_EQ, + prev_n_get_interface_address + 1); + tt_want_str_op(method_used,OP_EQ,"INTERFACE"); + tt_want(hostname_out == NULL); + tt_assert(resolved_addr == 0x08080808); + + UNMOCK(get_interface_address); + tor_free(hostname_out); + +/* + * CASE 8: + * Suppose options->Address is NULL AND hostname returned by tor_gethostname() + * is unresolvable. We want resolve_my_address to fail if + * get_interface_address() fails. + */ + + MOCK(get_interface_address,get_interface_address_failure); + + prev_n_get_interface_address_failure = n_get_interface_address_failure; + prev_n_gethostname_replacement = n_gethostname_replacement; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(n_get_interface_address_failure == + prev_n_get_interface_address_failure + 1); + tt_want(n_gethostname_replacement == + prev_n_gethostname_replacement + 1); + tt_int_op(retval, OP_EQ, -1); + + UNMOCK(get_interface_address); + tor_free(hostname_out); + +/* + * CASE 9: + * Given that options->Address is NULL AND tor_lookup_hostname() + * fails AND hostname returned by gethostname() resolves + * to local IP address, we want resolve_my_address() function to + * call get_interface_address6(.,AF_INET,.) and return IP address + * the latter function has found. + */ + + MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); + MOCK(tor_gethostname,tor_gethostname_replacement); + MOCK(get_interface_address6,get_interface_address6_replacement); + + prev_n_gethostname_replacement = n_gethostname_replacement; + prev_n_hostname_failure = n_hostname_failure; + prev_n_get_interface_address6 = n_get_interface_address6; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(last_address6_family == AF_INET); + tt_want(n_get_interface_address6 == prev_n_get_interface_address6 + 1); + tt_want(n_hostname_failure == prev_n_hostname_failure + 1); + tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); + tt_want(retval == 0); + tt_want_str_op(method_used,OP_EQ,"INTERFACE"); + tt_assert(resolved_addr == 0x09090909); + + UNMOCK(tor_lookup_hostname); + UNMOCK(tor_gethostname); + UNMOCK(get_interface_address6); + + tor_free(hostname_out); + + /* + * CASE 10: We want resolve_my_address() to fail if all of the following + * are true: + * 1. options->Address is not NULL + * 2. ... but it cannot be converted to struct in_addr by + * tor_inet_aton() + * 3. ... and tor_lookup_hostname() fails to resolve the + * options->Address + */ + + MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); + + prev_n_hostname_failure = n_hostname_failure; + + tor_free(options->Address); + options->Address = tor_strdup("some_hostname"); + + retval = resolve_my_address(LOG_NOTICE, options, &resolved_addr, + &method_used,&hostname_out); + + tt_want(n_hostname_failure == prev_n_hostname_failure + 1); + tt_int_op(retval, OP_EQ, -1); + + UNMOCK(tor_gethostname); + UNMOCK(tor_lookup_hostname); + + tor_free(hostname_out); + + /* + * CASE 11: + * Suppose the following sequence of events: + * 1. options->Address is NULL + * 2. tor_gethostname() succeeds to get hostname of machine Tor + * if running on. + * 3. Hostname from previous step cannot be converted to + * address by using tor_inet_aton() function. + * 4. However, tor_lookup_hostname() succeds in resolving the + * hostname from step 2. + * 5. Unfortunately, tor_addr_is_internal() deems this address + * to be internal. + * 6. get_interface_address6(.,AF_INET,.) returns non-internal + * IPv4 + * + * We want resolve_my_addr() to succeed with method "INTERFACE" + * and address from step 6. + */ + + tor_free(options->Address); + options->Address = NULL; + + MOCK(tor_gethostname,tor_gethostname_replacement); + MOCK(tor_lookup_hostname,tor_lookup_hostname_localhost); + MOCK(get_interface_address6,get_interface_address6_replacement); + + prev_n_gethostname_replacement = n_gethostname_replacement; + prev_n_hostname_localhost = n_hostname_localhost; + prev_n_get_interface_address6 = n_get_interface_address6; + + retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr, + &method_used,&hostname_out); + + tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); + tt_want(n_hostname_localhost == prev_n_hostname_localhost + 1); + tt_want(n_get_interface_address6 == prev_n_get_interface_address6 + 1); + + tt_str_op(method_used,OP_EQ,"INTERFACE"); + tt_ptr_op(hostname_out, OP_EQ, NULL); + tt_int_op(retval, OP_EQ, 0); + + /* + * CASE 11b: + * 1-5 as above. + * 6. get_interface_address6() fails. + * + * In this subcase, we want resolve_my_address() to fail. + */ + + UNMOCK(get_interface_address6); + MOCK(get_interface_address6,get_interface_address6_failure); + + prev_n_gethostname_replacement = n_gethostname_replacement; + prev_n_hostname_localhost = n_hostname_localhost; + prev_n_get_interface_address6_failure = n_get_interface_address6_failure; + + retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr, + &method_used,&hostname_out); + + tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); + tt_want(n_hostname_localhost == prev_n_hostname_localhost + 1); + tt_want(n_get_interface_address6_failure == + prev_n_get_interface_address6_failure + 1); + + tt_int_op(retval, OP_EQ, -1); + + UNMOCK(tor_gethostname); + UNMOCK(tor_lookup_hostname); + UNMOCK(get_interface_address6); + + /* CASE 12: + * Suppose the following happens: + * 1. options->Address is NULL AND options->DirAuthorities is non-NULL + * 2. tor_gethostname() succeeds in getting hostname of a machine ... + * 3. ... which is successfully parsed by tor_inet_aton() ... + * 4. into IPv4 address that tor_addr_is_inernal() considers to be + * internal. + * + * In this case, we want resolve_my_address() to fail. + */ + + tor_free(options->Address); + options->Address = NULL; + options->DirAuthorities = tor_malloc_zero(sizeof(config_line_t)); + + MOCK(tor_gethostname,tor_gethostname_localhost); + + prev_n_gethostname_localhost = n_gethostname_localhost; + + retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr, + &method_used,&hostname_out); + + tt_want(n_gethostname_localhost == prev_n_gethostname_localhost + 1); + tt_int_op(retval, OP_EQ, -1); + + UNMOCK(tor_gethostname); + + done: + tor_free(options->Address); + tor_free(options->DirAuthorities); + or_options_free(options); + tor_free(hostname_out); + + UNMOCK(tor_gethostname); + UNMOCK(tor_lookup_hostname); + UNMOCK(get_interface_address); + UNMOCK(get_interface_address6); + UNMOCK(tor_gethostname); +} + +static void +test_config_adding_trusted_dir_server(void *arg) +{ + (void)arg; + + const char digest[DIGEST_LEN] = ""; + dir_server_t *ds = NULL; + tor_addr_port_t ipv6; + int rv = -1; + + clear_dir_servers(); + routerlist_free_all(); + + /* create a trusted ds without an IPv6 address and port */ + ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, + NULL, V3_DIRINFO, 1.0); + tt_assert(ds); + dir_server_add(ds); + tt_int_op(get_n_authorities(V3_DIRINFO), OP_EQ, 1); + tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 1); + + /* create a trusted ds with an IPv6 address and port */ + rv = tor_addr_port_parse(LOG_WARN, "[::1]:9061", &ipv6.addr, &ipv6.port, -1); + tt_int_op(rv, OP_EQ, 0); + ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, &ipv6, digest, + NULL, V3_DIRINFO, 1.0); + tt_assert(ds); + dir_server_add(ds); + tt_int_op(get_n_authorities(V3_DIRINFO), OP_EQ, 2); + tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 2); + + done: + clear_dir_servers(); + routerlist_free_all(); +} + +static void +test_config_adding_fallback_dir_server(void *arg) +{ + (void)arg; + + const char digest[DIGEST_LEN] = ""; + dir_server_t *ds = NULL; + tor_addr_t ipv4; + tor_addr_port_t ipv6; + int rv = -1; + + clear_dir_servers(); + routerlist_free_all(); + + rv = tor_addr_parse(&ipv4, "127.0.0.1"); + tt_int_op(rv, OP_EQ, AF_INET); + + /* create a trusted ds without an IPv6 address and port */ + ds = fallback_dir_server_new(&ipv4, 9059, 9060, NULL, digest, 1.0); + tt_assert(ds); + dir_server_add(ds); + tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 1); + + /* create a trusted ds with an IPv6 address and port */ + rv = tor_addr_port_parse(LOG_WARN, "[::1]:9061", &ipv6.addr, &ipv6.port, -1); + tt_int_op(rv, OP_EQ, 0); + ds = fallback_dir_server_new(&ipv4, 9059, 9060, &ipv6, digest, 1.0); + tt_assert(ds); + dir_server_add(ds); + tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 2); + + done: + clear_dir_servers(); + routerlist_free_all(); +} + +/* No secrets here: + * v3ident is `echo "onion" | shasum | cut -d" " -f1 | tr "a-f" "A-F"` + * fingerprint is `echo "unionem" | shasum | cut -d" " -f1 | tr "a-f" "A-F"` + * with added spaces + */ +#define TEST_DIR_AUTH_LINE_START \ + "foobar orport=12345 " \ + "v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 " +#define TEST_DIR_AUTH_LINE_END \ + "1.2.3.4:54321 " \ + "FDB2 FBD2 AAA5 25FA 2999 E617 5091 5A32 C777 3B17" +#define TEST_DIR_AUTH_IPV6_FLAG \ + "ipv6=[feed::beef]:9 " + +static void +test_config_parsing_trusted_dir_server(void *arg) +{ + (void)arg; + int rv = -1; + + /* parse a trusted dir server without an IPv6 address and port */ + rv = parse_dir_authority_line(TEST_DIR_AUTH_LINE_START + TEST_DIR_AUTH_LINE_END, + V3_DIRINFO, 1); + tt_int_op(rv, OP_EQ, 0); + + /* parse a trusted dir server with an IPv6 address and port */ + rv = parse_dir_authority_line(TEST_DIR_AUTH_LINE_START + TEST_DIR_AUTH_IPV6_FLAG + TEST_DIR_AUTH_LINE_END, + V3_DIRINFO, 1); + tt_int_op(rv, OP_EQ, 0); + + /* Since we are only validating, there is no cleanup. */ + done: + ; +} + +#undef TEST_DIR_AUTH_LINE_START +#undef TEST_DIR_AUTH_LINE_END +#undef TEST_DIR_AUTH_IPV6_FLAG + +/* No secrets here: + * id is `echo "syn-propanethial-S-oxide" | shasum | cut -d" " -f1` + */ +#define TEST_DIR_FALLBACK_LINE \ + "1.2.3.4:54321 orport=12345 " \ + "id=50e643986f31ea1235bcc1af17a1c5c5cfc0ee54 " +#define TEST_DIR_FALLBACK_IPV6_FLAG \ + "ipv6=[2015:c0de::deed]:9" + +static void +test_config_parsing_fallback_dir_server(void *arg) +{ + (void)arg; + int rv = -1; + + /* parse a trusted dir server without an IPv6 address and port */ + rv = parse_dir_fallback_line(TEST_DIR_FALLBACK_LINE, 1); + tt_int_op(rv, OP_EQ, 0); + + /* parse a trusted dir server with an IPv6 address and port */ + rv = parse_dir_fallback_line(TEST_DIR_FALLBACK_LINE + TEST_DIR_FALLBACK_IPV6_FLAG, + 1); + tt_int_op(rv, OP_EQ, 0); + + /* Since we are only validating, there is no cleanup. */ + done: + ; +} + +#undef TEST_DIR_FALLBACK_LINE +#undef TEST_DIR_FALLBACK_IPV6_FLAG + +static void +test_config_adding_default_trusted_dir_servers(void *arg) +{ + (void)arg; + + clear_dir_servers(); + routerlist_free_all(); + + /* Assume we only have one bridge authority */ + add_default_trusted_dir_authorities(BRIDGE_DIRINFO); + tt_int_op(get_n_authorities(BRIDGE_DIRINFO), OP_EQ, 1); + tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 1); + + /* Assume we have eight V3 authorities */ + add_default_trusted_dir_authorities(V3_DIRINFO); + tt_int_op(get_n_authorities(V3_DIRINFO), OP_EQ, 9); + tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 10); + + done: + clear_dir_servers(); + routerlist_free_all(); +} + +static int n_add_default_fallback_dir_servers_known_default = 0; + +/** + * This mock function is meant to replace add_default_fallback_dir_servers(). + * It will parse and add one known default fallback dir server, + * which has a dir_port of 99. + * n_add_default_fallback_dir_servers_known_default is incremented by + * one every time this function is called. + */ +static void +add_default_fallback_dir_servers_known_default(void) +{ + int i; + const char *fallback[] = { + "127.0.0.1:60099 orport=9009 " + "id=0923456789012345678901234567890123456789", + NULL + }; + for (i=0; fallback[i]; i++) { + if (parse_dir_fallback_line(fallback[i], 0)<0) { + log_err(LD_BUG, "Couldn't parse internal FallbackDir line %s", + fallback[i]); + } + } + n_add_default_fallback_dir_servers_known_default++; +} + +/* Test all the different combinations of adding dir servers */ +static void +test_config_adding_dir_servers(void *arg) +{ + (void)arg; + + /* allocate options */ + or_options_t *options = tor_malloc_zero(sizeof(or_options_t)); + + /* Allocate and populate configuration lines: + * + * Use the same format as the hard-coded directories in + * add_default_trusted_dir_authorities(). + * Zeroing the structure has the same effect as initialising to: + * { NULL, NULL, NULL, CONFIG_LINE_NORMAL, 0}; + */ + config_line_t *test_dir_authority = tor_malloc_zero(sizeof(config_line_t)); + test_dir_authority->key = tor_strdup("DirAuthority"); + test_dir_authority->value = tor_strdup( + "D0 orport=9000 " + "v3ident=0023456789012345678901234567890123456789 " + "127.0.0.1:60090 0123 4567 8901 2345 6789 0123 4567 8901 2345 6789" + ); + + config_line_t *test_alt_bridge_authority = tor_malloc_zero( + sizeof(config_line_t)); + test_alt_bridge_authority->key = tor_strdup("AlternateBridgeAuthority"); + test_alt_bridge_authority->value = tor_strdup( + "B1 orport=9001 bridge " + "127.0.0.1:60091 1123 4567 8901 2345 6789 0123 4567 8901 2345 6789" + ); + + config_line_t *test_alt_dir_authority = tor_malloc_zero( + sizeof(config_line_t)); + test_alt_dir_authority->key = tor_strdup("AlternateDirAuthority"); + test_alt_dir_authority->value = tor_strdup( + "A2 orport=9002 " + "v3ident=0223456789012345678901234567890123456789 " + "127.0.0.1:60092 2123 4567 8901 2345 6789 0123 4567 8901 2345 6789" + ); + + /* Use the format specified in the manual page */ + config_line_t *test_fallback_directory = tor_malloc_zero( + sizeof(config_line_t)); + test_fallback_directory->key = tor_strdup("FallbackDir"); + test_fallback_directory->value = tor_strdup( + "127.0.0.1:60093 orport=9003 id=0323456789012345678901234567890123456789" + ); + + /* We need to know if add_default_fallback_dir_servers is called, + * whatever the size of the list in fallback_dirs.inc, + * so we use a version of add_default_fallback_dir_servers that adds + * one known default fallback directory. */ + MOCK(add_default_fallback_dir_servers, + add_default_fallback_dir_servers_known_default); + + /* There are 16 different cases, covering each combination of set/NULL for: + * DirAuthorities, AlternateBridgeAuthority, AlternateDirAuthority & + * FallbackDir. (We always set UseDefaultFallbackDirs to 1.) + * But validate_dir_servers() ensures that: + * "You cannot set both DirAuthority and Alternate*Authority." + * This reduces the number of cases to 10. + * + * Let's count these cases using binary, with 1 meaning set & 0 meaning NULL + * So 1001 or case 9 is: + * DirAuthorities set, + * AlternateBridgeAuthority NULL, + * AlternateDirAuthority NULL + * FallbackDir set + * The valid cases are cases 0-9 counting using this method, as every case + * greater than or equal to 10 = 1010 is invalid. + * + * 1. Outcome: Use Set Directory Authorities + * - No Default Authorities + * - Use AlternateBridgeAuthority, AlternateDirAuthority, and FallbackDir + * if they are set + * Cases expected to yield this outcome: + * 8 & 9 (the 2 valid cases where DirAuthorities is set) + * 6 & 7 (the 2 cases where DirAuthorities is NULL, and + * AlternateBridgeAuthority and AlternateDirAuthority are both set) + * + * 2. Outcome: Use Set Bridge Authority + * - Use Default Non-Bridge Directory Authorities + * - Use FallbackDir if it is set, otherwise use default FallbackDir + * Cases expected to yield this outcome: + * 4 & 5 (the 2 cases where DirAuthorities is NULL, + * AlternateBridgeAuthority is set, and + * AlternateDirAuthority is NULL) + * + * 3. Outcome: Use Set Alternate Directory Authority + * - Use Default Bridge Authorities + * - Use FallbackDir if it is set, otherwise No Default Fallback Directories + * Cases expected to yield this outcome: + * 2 & 3 (the 2 cases where DirAuthorities and AlternateBridgeAuthority + * are both NULL, but AlternateDirAuthority is set) + * + * 4. Outcome: Use Set Custom Fallback Directory + * - Use Default Bridge & Directory Authorities + * Cases expected to yield this outcome: + * 1 (DirAuthorities, AlternateBridgeAuthority and AlternateDirAuthority + * are all NULL, but FallbackDir is set) + * + * 5. Outcome: Use All Defaults + * - Use Default Bridge & Directory Authorities, and + * Default Fallback Directories + * Cases expected to yield this outcome: + * 0 (DirAuthorities, AlternateBridgeAuthority, AlternateDirAuthority + * and FallbackDir are all NULL) + */ + + /* + * Find out how many default Bridge, Non-Bridge and Fallback Directories + * are hard-coded into this build. + * This code makes some assumptions about the implementation. + * If they are wrong, one or more of cases 0-5 could fail. + */ + int n_default_alt_bridge_authority = 0; + int n_default_alt_dir_authority = 0; + int n_default_fallback_dir = 0; +#define n_default_authorities ((n_default_alt_bridge_authority) \ + + (n_default_alt_dir_authority)) + + /* Pre-Count Number of Authorities of Each Type + * Use 0000: No Directory Authorities or Fallback Directories Set + */ + { + /* clear fallback dirs counter */ + n_add_default_fallback_dir_servers_known_default = 0; + + /* clear options*/ + memset(options, 0, sizeof(or_options_t)); + + /* clear any previous dir servers: + consider_adding_dir_servers() should do this anyway */ + clear_dir_servers(); + + /* assign options: 0000 */ + options->DirAuthorities = NULL; + options->AlternateBridgeAuthority = NULL; + options->AlternateDirAuthority = NULL; + options->FallbackDir = NULL; + options->UseDefaultFallbackDirs = 1; + + /* parse options - ensure we always update by passing NULL old_options */ + consider_adding_dir_servers(options, NULL); + + /* check outcome */ + + /* we must have added the default fallback dirs */ + tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 1); + + /* we have more fallbacks than just the authorities */ + tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); + + { + /* fallback_dir_servers */ + const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); + + /* Count Bridge Authorities */ + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if it's a bridge auth */ + n_default_alt_bridge_authority += + ((ds->is_authority && (ds->type & BRIDGE_DIRINFO)) ? + 1 : 0) + ); + /* If we have no default bridge authority, something has gone wrong */ + tt_int_op(n_default_alt_bridge_authority, OP_GE, 1); + + /* Count v3 Authorities */ + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment found counter if it's a v3 auth */ + n_default_alt_dir_authority += + ((ds->is_authority && (ds->type & V3_DIRINFO)) ? + 1 : 0) + ); + /* If we have no default authorities, something has gone really wrong */ + tt_int_op(n_default_alt_dir_authority, OP_GE, 1); + + /* Calculate Fallback Directory Count */ + n_default_fallback_dir = (smartlist_len(fallback_servers) - + n_default_alt_bridge_authority - + n_default_alt_dir_authority); + /* If we have a negative count, something has gone really wrong, + * or some authorities aren't being added as fallback directories. + * (networkstatus_consensus_can_use_extra_fallbacks depends on all + * authorities being fallback directories.) */ + tt_int_op(n_default_fallback_dir, OP_GE, 0); + } + } + + /* + * 1. Outcome: Use Set Directory Authorities + * - No Default Authorities + * - Use AlternateBridgeAuthority, AlternateDirAuthority, and FallbackDir + * if they are set + * Cases expected to yield this outcome: + * 8 & 9 (the 2 valid cases where DirAuthorities is set) + * 6 & 7 (the 2 cases where DirAuthorities is NULL, and + * AlternateBridgeAuthority and AlternateDirAuthority are both set) + */ + + /* Case 9: 1001 - DirAuthorities Set, AlternateBridgeAuthority Not Set, + AlternateDirAuthority Not Set, FallbackDir Set */ + { + /* clear fallback dirs counter */ + n_add_default_fallback_dir_servers_known_default = 0; + + /* clear options*/ + memset(options, 0, sizeof(or_options_t)); + + /* clear any previous dir servers: + consider_adding_dir_servers() should do this anyway */ + clear_dir_servers(); + + /* assign options: 1001 */ + options->DirAuthorities = test_dir_authority; + options->AlternateBridgeAuthority = NULL; + options->AlternateDirAuthority = NULL; + options->FallbackDir = test_fallback_directory; + options->UseDefaultFallbackDirs = 1; + + /* parse options - ensure we always update by passing NULL old_options */ + consider_adding_dir_servers(options, NULL); + + /* check outcome */ + + /* we must not have added the default fallback dirs */ + tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); + + /* we have more fallbacks than just the authorities */ + tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); + + { + /* trusted_dir_servers */ + const smartlist_t *dir_servers = router_get_trusted_dir_servers(); + /* D0, (No B1), (No A2) */ + tt_int_op(smartlist_len(dir_servers), OP_EQ, 1); + + /* DirAuthority - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 1); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + } + + { + /* fallback_dir_servers */ + const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); + /* D0, (No B1), (No A2), Custom Fallback */ + tt_int_op(smartlist_len(fallback_servers), OP_EQ, 2); + + /* DirAuthority - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 1); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + + /* Custom FallbackDir - No Nickname - dir_port: 60093 */ + int found_non_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_non_default_fallback += + (ds->dir_port == 60093 ? + 1 : 0) + ); + tt_int_op(found_non_default_fallback, OP_EQ, 1); + + /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ + int found_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_default_fallback += + (ds->dir_port == 60099 ? + 1 : 0) + ); + tt_int_op(found_default_fallback, OP_EQ, 0); + } + } + + /* Case 8: 1000 - DirAuthorities Set, Others Not Set */ + { + /* clear fallback dirs counter */ + n_add_default_fallback_dir_servers_known_default = 0; + + /* clear options*/ + memset(options, 0, sizeof(or_options_t)); + + /* clear any previous dir servers: + consider_adding_dir_servers() should do this anyway */ + clear_dir_servers(); + + /* assign options: 1000 */ + options->DirAuthorities = test_dir_authority; + options->AlternateBridgeAuthority = NULL; + options->AlternateDirAuthority = NULL; + options->FallbackDir = NULL; + options->UseDefaultFallbackDirs = 1; + + /* parse options - ensure we always update by passing NULL old_options */ + consider_adding_dir_servers(options, NULL); + + /* check outcome */ + + /* we must not have added the default fallback dirs */ + tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); + + /* we just have the authorities */ + tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 0); + + { + /* trusted_dir_servers */ + const smartlist_t *dir_servers = router_get_trusted_dir_servers(); + /* D0, (No B1), (No A2) */ + tt_int_op(smartlist_len(dir_servers), OP_EQ, 1); + + /* DirAuthority - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 1); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + } + + { + /* fallback_dir_servers */ + const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); + /* D0, (No B1), (No A2), (No Fallback) */ + tt_int_op(smartlist_len(fallback_servers), OP_EQ, 1); + + /* DirAuthority - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 1); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + + /* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */ + int found_non_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_non_default_fallback += + (ds->dir_port == 60093 ? + 1 : 0) + ); + tt_int_op(found_non_default_fallback, OP_EQ, 0); + + /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ + int found_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_default_fallback += + (ds->dir_port == 60099 ? + 1 : 0) + ); + tt_int_op(found_default_fallback, OP_EQ, 0); + } + } + + /* Case 7: 0111 - DirAuthorities Not Set, Others Set */ + { + /* clear fallback dirs counter */ + n_add_default_fallback_dir_servers_known_default = 0; + + /* clear options*/ + memset(options, 0, sizeof(or_options_t)); + + /* clear any previous dir servers: + consider_adding_dir_servers() should do this anyway */ + clear_dir_servers(); + + /* assign options: 0111 */ + options->DirAuthorities = NULL; + options->AlternateBridgeAuthority = test_alt_bridge_authority; + options->AlternateDirAuthority = test_alt_dir_authority; + options->FallbackDir = test_fallback_directory; + options->UseDefaultFallbackDirs = 1; + + /* parse options - ensure we always update by passing NULL old_options */ + consider_adding_dir_servers(options, NULL); + + /* check outcome */ + + /* we must not have added the default fallback dirs */ + tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); + + /* we have more fallbacks than just the authorities */ + tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); + + { + /* trusted_dir_servers */ + const smartlist_t *dir_servers = router_get_trusted_dir_servers(); + /* (No D0), B1, A2 */ + tt_int_op(smartlist_len(dir_servers), OP_EQ, 2); + + /* (No DirAuthority) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 1); + + /* AlternateDirAuthority - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 1); + } + + { + /* fallback_dir_servers */ + const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); + /* (No D0), B1, A2, Custom Fallback */ + tt_int_op(smartlist_len(fallback_servers), OP_EQ, 3); + + /* (No DirAuthority) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 1); + + /* AlternateDirAuthority - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 1); + + /* Custom FallbackDir - No Nickname - dir_port: 60093 */ + int found_non_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_non_default_fallback += + (ds->dir_port == 60093 ? + 1 : 0) + ); + tt_int_op(found_non_default_fallback, OP_EQ, 1); + + /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ + int found_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_default_fallback += + (ds->dir_port == 60099 ? + 1 : 0) + ); + tt_int_op(found_default_fallback, OP_EQ, 0); + } + } + + /* Case 6: 0110 - DirAuthorities Not Set, AlternateBridgeAuthority & + AlternateDirAuthority Set, FallbackDir Not Set */ + { + /* clear fallback dirs counter */ + n_add_default_fallback_dir_servers_known_default = 0; + + /* clear options*/ + memset(options, 0, sizeof(or_options_t)); + + /* clear any previous dir servers: + consider_adding_dir_servers() should do this anyway */ + clear_dir_servers(); + + /* assign options: 0110 */ + options->DirAuthorities = NULL; + options->AlternateBridgeAuthority = test_alt_bridge_authority; + options->AlternateDirAuthority = test_alt_dir_authority; + options->FallbackDir = NULL; + options->UseDefaultFallbackDirs = 1; + + /* parse options - ensure we always update by passing NULL old_options */ + consider_adding_dir_servers(options, NULL); + + /* check outcome */ + + /* we must not have added the default fallback dirs */ + tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); + + /* we have more fallbacks than just the authorities */ + tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 0); + + { + /* trusted_dir_servers */ + const smartlist_t *dir_servers = router_get_trusted_dir_servers(); + /* (No D0), B1, A2 */ + tt_int_op(smartlist_len(dir_servers), OP_EQ, 2); + + /* (No DirAuthority) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 1); + + /* AlternateDirAuthority - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 1); + } + + { + /* fallback_dir_servers */ + const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); + /* (No D0), B1, A2, (No Fallback) */ + tt_int_op(smartlist_len(fallback_servers), OP_EQ, 2); + + /* (No DirAuthority) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 1); + + /* AlternateDirAuthority - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 1); + + /* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */ + int found_non_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_non_default_fallback += + (ds->dir_port == 60093 ? + 1 : 0) + ); + tt_int_op(found_non_default_fallback, OP_EQ, 0); + + /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ + int found_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_default_fallback += + (ds->dir_port == 60099 ? + 1 : 0) + ); + tt_int_op(found_default_fallback, OP_EQ, 0); + } + } + + /* + 2. Outcome: Use Set Bridge Authority + - Use Default Non-Bridge Directory Authorities + - Use FallbackDir if it is set, otherwise use default FallbackDir + Cases expected to yield this outcome: + 4 & 5 (the 2 cases where DirAuthorities is NULL, + AlternateBridgeAuthority is set, and + AlternateDirAuthority is NULL) + */ + + /* Case 5: 0101 - DirAuthorities Not Set, AlternateBridgeAuthority Set, + AlternateDirAuthority Not Set, FallbackDir Set */ + { + /* clear fallback dirs counter */ + n_add_default_fallback_dir_servers_known_default = 0; + + /* clear options*/ + memset(options, 0, sizeof(or_options_t)); + + /* clear any previous dir servers: + consider_adding_dir_servers() should do this anyway */ + clear_dir_servers(); + + /* assign options: 0101 */ + options->DirAuthorities = NULL; + options->AlternateBridgeAuthority = test_alt_bridge_authority; + options->AlternateDirAuthority = NULL; + options->FallbackDir = test_fallback_directory; + options->UseDefaultFallbackDirs = 1; + + /* parse options - ensure we always update by passing NULL old_options */ + consider_adding_dir_servers(options, NULL); + + /* check outcome */ + + /* we must not have added the default fallback dirs */ + tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); + + /* we have more fallbacks than just the authorities */ + tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); + + { + /* trusted_dir_servers */ + const smartlist_t *dir_servers = router_get_trusted_dir_servers(); + /* (No D0), B1, (No A2), Default v3 Non-Bridge Authorities */ + tt_assert(smartlist_len(dir_servers) == 1 + n_default_alt_dir_authority); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 1); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + + /* There's no easy way of checking that we have included all the + * default v3 non-Bridge directory authorities, so let's assume that + * if the total count above is correct, we have the right ones. + */ + } + + { + /* fallback_dir_servers */ + const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); + /* (No D0), B1, (No A2), Default v3 Non-Bridge Authorities, + * Custom Fallback */ + tt_assert(smartlist_len(fallback_servers) == + 2 + n_default_alt_dir_authority); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 1); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + + /* Custom FallbackDir - No Nickname - dir_port: 60093 */ + int found_non_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_non_default_fallback += + (ds->dir_port == 60093 ? + 1 : 0) + ); + tt_int_op(found_non_default_fallback, OP_EQ, 1); + + /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ + int found_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_default_fallback += + (ds->dir_port == 60099 ? + 1 : 0) + ); + tt_int_op(found_default_fallback, OP_EQ, 0); + + /* There's no easy way of checking that we have included all the + * default v3 non-Bridge directory authorities, so let's assume that + * if the total count above is correct, we have the right ones. + */ + } + } + + /* Case 4: 0100 - DirAuthorities Not Set, AlternateBridgeAuthority Set, + AlternateDirAuthority & FallbackDir Not Set */ + { + /* clear fallback dirs counter */ + n_add_default_fallback_dir_servers_known_default = 0; + + /* clear options*/ + memset(options, 0, sizeof(or_options_t)); + + /* clear any previous dir servers: + consider_adding_dir_servers() should do this anyway */ + clear_dir_servers(); + + /* assign options: 0100 */ + options->DirAuthorities = NULL; + options->AlternateBridgeAuthority = test_alt_bridge_authority; + options->AlternateDirAuthority = NULL; + options->FallbackDir = NULL; + options->UseDefaultFallbackDirs = 1; + + /* parse options - ensure we always update by passing NULL old_options */ + consider_adding_dir_servers(options, NULL); + + /* check outcome */ + + /* we must have added the default fallback dirs */ + tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 1); + + /* we have more fallbacks than just the authorities */ + tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); + + { + /* trusted_dir_servers */ + const smartlist_t *dir_servers = router_get_trusted_dir_servers(); + /* (No D0), B1, (No A2), Default v3 Non-Bridge Authorities */ + tt_assert(smartlist_len(dir_servers) == 1 + n_default_alt_dir_authority); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 1); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + + /* There's no easy way of checking that we have included all the + * default v3 non-Bridge directory authorities, so let's assume that + * if the total count above is correct, we have the right ones. + */ + } + + { + /* fallback_dir_servers */ + const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); + /* (No D0), B1, (No A2), Default v3 Non-Bridge Authorities, + * Default Fallback */ + tt_assert(smartlist_len(fallback_servers) == + 2 + n_default_alt_dir_authority); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 1); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + + /* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */ + int found_non_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_non_default_fallback += + (ds->dir_port == 60093 ? + 1 : 0) + ); + tt_int_op(found_non_default_fallback, OP_EQ, 0); + + /* Default FallbackDir - No Nickname - dir_port: 60099 */ + int found_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_default_fallback += + (ds->dir_port == 60099 ? + 1 : 0) + ); + tt_int_op(found_default_fallback, OP_EQ, 1); + + /* There's no easy way of checking that we have included all the + * default v3 non-Bridge directory authorities, so let's assume that + * if the total count above is correct, we have the right ones. + */ + } + } + + /* + 3. Outcome: Use Set Alternate Directory Authority + - Use Default Bridge Authorities + - Use FallbackDir if it is set, otherwise No Default Fallback Directories + Cases expected to yield this outcome: + 2 & 3 (the 2 cases where DirAuthorities and AlternateBridgeAuthority + are both NULL, but AlternateDirAuthority is set) + */ + + /* Case 3: 0011 - DirAuthorities & AlternateBridgeAuthority Not Set, + AlternateDirAuthority & FallbackDir Set */ + { + /* clear fallback dirs counter */ + n_add_default_fallback_dir_servers_known_default = 0; + + /* clear options*/ + memset(options, 0, sizeof(or_options_t)); + + /* clear any previous dir servers: + consider_adding_dir_servers() should do this anyway */ + clear_dir_servers(); + + /* assign options: 0011 */ + options->DirAuthorities = NULL; + options->AlternateBridgeAuthority = NULL; + options->AlternateDirAuthority = test_alt_dir_authority; + options->FallbackDir = test_fallback_directory; + options->UseDefaultFallbackDirs = 1; + + /* parse options - ensure we always update by passing NULL old_options */ + consider_adding_dir_servers(options, NULL); + + /* check outcome */ + + /* we must not have added the default fallback dirs */ + tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); + + /* we have more fallbacks than just the authorities */ + tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); + + { + /* trusted_dir_servers */ + const smartlist_t *dir_servers = router_get_trusted_dir_servers(); + /* (No D0), (No B1), Default Bridge Authorities, A2 */ + tt_assert(smartlist_len(dir_servers) == + 1 + n_default_alt_bridge_authority); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* AlternateDirAuthority - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 1); + + /* There's no easy way of checking that we have included all the + * default Bridge authorities (except for hard-coding tonga's details), + * so let's assume that if the total count above is correct, + * we have the right ones. + */ + } + + { + /* fallback_dir_servers */ + const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); + /* (No D0), (No B1), Default Bridge Authorities, A2, + * Custom Fallback Directory, (No Default Fallback Directories) */ + tt_assert(smartlist_len(fallback_servers) == + 2 + n_default_alt_bridge_authority); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* AlternateDirAuthority - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 1); + + /* Custom FallbackDir - No Nickname - dir_port: 60093 */ + int found_non_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_non_default_fallback += + (ds->dir_port == 60093 ? + 1 : 0) + ); + tt_int_op(found_non_default_fallback, OP_EQ, 1); + + /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ + int found_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_default_fallback += + (ds->dir_port == 60099 ? + 1 : 0) + ); + tt_int_op(found_default_fallback, OP_EQ, 0); + + /* There's no easy way of checking that we have included all the + * default Bridge authorities (except for hard-coding tonga's details), + * so let's assume that if the total count above is correct, + * we have the right ones. + */ + } + } + + /* Case 2: 0010 - DirAuthorities & AlternateBridgeAuthority Not Set, + AlternateDirAuthority Set, FallbackDir Not Set */ + { + /* clear fallback dirs counter */ + n_add_default_fallback_dir_servers_known_default = 0; + + /* clear options*/ + memset(options, 0, sizeof(or_options_t)); + + /* clear any previous dir servers: + consider_adding_dir_servers() should do this anyway */ + clear_dir_servers(); + + /* assign options: 0010 */ + options->DirAuthorities = NULL; + options->AlternateBridgeAuthority = NULL; + options->AlternateDirAuthority = test_alt_dir_authority; + options->FallbackDir = NULL; + options->UseDefaultFallbackDirs = 1; + + /* parse options - ensure we always update by passing NULL old_options */ + consider_adding_dir_servers(options, NULL); + + /* check outcome */ + + /* we must not have added the default fallback dirs */ + tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); + + /* we just have the authorities */ + tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 0); + + { + /* trusted_dir_servers */ + const smartlist_t *dir_servers = router_get_trusted_dir_servers(); + /* (No D0), (No B1), Default Bridge Authorities, A2, + * No Default or Custom Fallback Directories */ + tt_assert(smartlist_len(dir_servers) == + 1 + n_default_alt_bridge_authority); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* AlternateDirAuthority - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 1); + + /* There's no easy way of checking that we have included all the + * default Bridge authorities (except for hard-coding tonga's details), + * so let's assume that if the total count above is correct, + * we have the right ones. + */ + } + + { + /* fallback_dir_servers */ + const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); + /* (No D0), (No B1), Default Bridge Authorities, A2, + * No Custom or Default Fallback Directories */ + tt_assert(smartlist_len(fallback_servers) == + 1 + n_default_alt_bridge_authority); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* AlternateDirAuthority - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 1); + + /* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */ + int found_non_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_non_default_fallback += + (ds->dir_port == 60093 ? + 1 : 0) + ); + tt_int_op(found_non_default_fallback, OP_EQ, 0); + + /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ + int found_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_default_fallback += + (ds->dir_port == 60099 ? + 1 : 0) + ); + tt_int_op(found_default_fallback, OP_EQ, 0); + + /* There's no easy way of checking that we have included all the + * default Bridge authorities (except for hard-coding tonga's details), + * so let's assume that if the total count above is correct, + * we have the right ones. + */ + } + } + + /* + 4. Outcome: Use Set Custom Fallback Directory + - Use Default Bridge & Directory Authorities + Cases expected to yield this outcome: + 1 (DirAuthorities, AlternateBridgeAuthority and AlternateDirAuthority + are all NULL, but FallbackDir is set) + */ + + /* Case 1: 0001 - DirAuthorities, AlternateBridgeAuthority + & AlternateDirAuthority Not Set, FallbackDir Set */ + { + /* clear fallback dirs counter */ + n_add_default_fallback_dir_servers_known_default = 0; + + /* clear options*/ + memset(options, 0, sizeof(or_options_t)); + + /* clear any previous dir servers: + consider_adding_dir_servers() should do this anyway */ + clear_dir_servers(); + + /* assign options: 0001 */ + options->DirAuthorities = NULL; + options->AlternateBridgeAuthority = NULL; + options->AlternateDirAuthority = NULL; + options->FallbackDir = test_fallback_directory; + options->UseDefaultFallbackDirs = 1; + + /* parse options - ensure we always update by passing NULL old_options */ + consider_adding_dir_servers(options, NULL); + + /* check outcome */ + + /* we must not have added the default fallback dirs */ + tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); + + /* we have more fallbacks than just the authorities */ + tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); + + { + /* trusted_dir_servers */ + const smartlist_t *dir_servers = router_get_trusted_dir_servers(); + /* (No D0), (No B1), Default Bridge Authorities, + * (No A2), Default v3 Directory Authorities */ + tt_assert(smartlist_len(dir_servers) == n_default_authorities); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + + /* There's no easy way of checking that we have included all the + * default Bridge & V3 Directory authorities, so let's assume that + * if the total count above is correct, we have the right ones. + */ + } + + { + /* fallback_dir_servers */ + const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); + /* (No D0), (No B1), Default Bridge Authorities, + * (No A2), Default v3 Directory Authorities, + * Custom Fallback Directory, (No Default Fallback Directories) */ + tt_assert(smartlist_len(fallback_servers) == + 1 + n_default_authorities); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + + /* Custom FallbackDir - No Nickname - dir_port: 60093 */ + int found_non_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_non_default_fallback += + (ds->dir_port == 60093 ? + 1 : 0) + ); + tt_int_op(found_non_default_fallback, OP_EQ, 1); + + /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ + int found_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_default_fallback += + (ds->dir_port == 60099 ? + 1 : 0) + ); + tt_int_op(found_default_fallback, OP_EQ, 0); + + /* There's no easy way of checking that we have included all the + * default Bridge & V3 Directory authorities, so let's assume that + * if the total count above is correct, we have the right ones. + */ + } + } + + /* + 5. Outcome: Use All Defaults + - Use Default Bridge & Directory Authorities, Default Fallback Directories + Cases expected to yield this outcome: + 0 (DirAuthorities, AlternateBridgeAuthority, AlternateDirAuthority + and FallbackDir are all NULL) + */ + + /* Case 0: 0000 - All Not Set */ + { + /* clear fallback dirs counter */ + n_add_default_fallback_dir_servers_known_default = 0; + + /* clear options*/ + memset(options, 0, sizeof(or_options_t)); + + /* clear any previous dir servers: + consider_adding_dir_servers() should do this anyway */ + clear_dir_servers(); + + /* assign options: 0001 */ + options->DirAuthorities = NULL; + options->AlternateBridgeAuthority = NULL; + options->AlternateDirAuthority = NULL; + options->FallbackDir = NULL; + options->UseDefaultFallbackDirs = 1; + + /* parse options - ensure we always update by passing NULL old_options */ + consider_adding_dir_servers(options, NULL); + + /* check outcome */ + + /* we must have added the default fallback dirs */ + tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 1); + + /* we have more fallbacks than just the authorities */ + tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); + + { + /* trusted_dir_servers */ + const smartlist_t *dir_servers = router_get_trusted_dir_servers(); + /* (No D0), (No B1), Default Bridge Authorities, + * (No A2), Default v3 Directory Authorities */ + tt_assert(smartlist_len(dir_servers) == n_default_authorities); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(dir_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + + /* There's no easy way of checking that we have included all the + * default Bridge & V3 Directory authorities, so let's assume that + * if the total count above is correct, we have the right ones. + */ + } + + { + /* fallback_dir_servers */ + const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); + /* (No D0), (No B1), Default Bridge Authorities, + * (No A2), Default v3 Directory Authorities, + * (No Custom Fallback Directory), Default Fallback Directories */ + tt_assert(smartlist_len(fallback_servers) == + n_default_authorities + n_default_fallback_dir); + + /* (No DirAuthorities) - D0 - dir_port: 60090 */ + int found_D0 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_D0 += + (ds->dir_port == 60090 ? + 1 : 0) + ); + tt_int_op(found_D0, OP_EQ, 0); + + /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ + int found_B1 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_B1 += + (ds->dir_port == 60091 ? + 1 : 0) + ); + tt_int_op(found_B1, OP_EQ, 0); + + /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ + int found_A2 = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_A2 += + (ds->dir_port == 60092 ? + 1 : 0) + ); + tt_int_op(found_A2, OP_EQ, 0); + + /* Custom FallbackDir - No Nickname - dir_port: 60093 */ + int found_non_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_non_default_fallback += + (ds->dir_port == 60093 ? + 1 : 0) + ); + tt_int_op(found_non_default_fallback, OP_EQ, 0); + + /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ + int found_default_fallback = 0; + SMARTLIST_FOREACH(fallback_servers, + dir_server_t *, + ds, + /* increment the found counter if dir_port matches */ + found_default_fallback += + (ds->dir_port == 60099 ? + 1 : 0) + ); + tt_int_op(found_default_fallback, OP_EQ, 1); + + /* There's no easy way of checking that we have included all the + * default Bridge & V3 Directory authorities, and the default + * Fallback Directories, so let's assume that if the total count + * above is correct, we have the right ones. + */ + } + } + + done: + clear_dir_servers(); + + tor_free(test_dir_authority->key); + tor_free(test_dir_authority->value); + tor_free(test_dir_authority); + + tor_free(test_alt_dir_authority->key); + tor_free(test_alt_dir_authority->value); + tor_free(test_alt_dir_authority); + + tor_free(test_alt_bridge_authority->key); + tor_free(test_alt_bridge_authority->value); + tor_free(test_alt_bridge_authority); + + tor_free(test_fallback_directory->key); + tor_free(test_fallback_directory->value); + tor_free(test_fallback_directory); + + options->DirAuthorities = NULL; + options->AlternateBridgeAuthority = NULL; + options->AlternateDirAuthority = NULL; + options->FallbackDir = NULL; + or_options_free(options); + + UNMOCK(add_default_fallback_dir_servers); +} + +static void +test_config_default_dir_servers(void *arg) +{ + or_options_t *opts = NULL; + (void)arg; + int trusted_count = 0; + int fallback_count = 0; + + /* new set of options should stop fallback parsing */ + opts = tor_malloc_zero(sizeof(or_options_t)); + opts->UseDefaultFallbackDirs = 0; + /* set old_options to NULL to force dir update */ + consider_adding_dir_servers(opts, NULL); + trusted_count = smartlist_len(router_get_trusted_dir_servers()); + fallback_count = smartlist_len(router_get_fallback_dir_servers()); + or_options_free(opts); + opts = NULL; + + /* assume a release will never go out with less than 7 authorities */ + tt_int_op(trusted_count, OP_GE, 7); + /* if we disable the default fallbacks, there must not be any extra */ + tt_assert(fallback_count == trusted_count); + + opts = tor_malloc_zero(sizeof(or_options_t)); + opts->UseDefaultFallbackDirs = 1; + consider_adding_dir_servers(opts, opts); + trusted_count = smartlist_len(router_get_trusted_dir_servers()); + fallback_count = smartlist_len(router_get_fallback_dir_servers()); + or_options_free(opts); + opts = NULL; + + /* assume a release will never go out with less than 7 authorities */ + tt_int_op(trusted_count, OP_GE, 7); + /* XX/teor - allow for default fallbacks to be added without breaking + * the unit tests. Set a minimum fallback count once the list is stable. */ + tt_assert(fallback_count >= trusted_count); + + done: + or_options_free(opts); +} + +static int mock_router_pick_published_address_result = 0; + +static int +mock_router_pick_published_address(const or_options_t *options, + uint32_t *addr, int cache_only) +{ + (void)options; + (void)addr; + (void)cache_only; + return mock_router_pick_published_address_result; +} + +static int mock_router_my_exit_policy_is_reject_star_result = 0; + +static int +mock_router_my_exit_policy_is_reject_star(void) +{ + return mock_router_my_exit_policy_is_reject_star_result; +} + +static int mock_advertised_server_mode_result = 0; + +static int +mock_advertised_server_mode(void) +{ + return mock_advertised_server_mode_result; +} + +static routerinfo_t *mock_router_get_my_routerinfo_result = NULL; + +static const routerinfo_t * +mock_router_get_my_routerinfo(void) +{ + return mock_router_get_my_routerinfo_result; +} + +static void +test_config_directory_fetch(void *arg) +{ + (void)arg; + + /* Test Setup */ + or_options_t *options = tor_malloc_zero(sizeof(or_options_t)); + routerinfo_t routerinfo; + memset(&routerinfo, 0, sizeof(routerinfo)); + mock_router_pick_published_address_result = -1; + mock_router_my_exit_policy_is_reject_star_result = 1; + mock_advertised_server_mode_result = 0; + mock_router_get_my_routerinfo_result = NULL; + MOCK(router_pick_published_address, mock_router_pick_published_address); + MOCK(router_my_exit_policy_is_reject_star, + mock_router_my_exit_policy_is_reject_star); + MOCK(advertised_server_mode, mock_advertised_server_mode); + MOCK(router_get_my_routerinfo, mock_router_get_my_routerinfo); + + /* Clients can use multiple directory mirrors for bootstrap */ + memset(options, 0, sizeof(or_options_t)); + options->ClientOnly = 1; + tt_assert(server_mode(options) == 0); + tt_assert(public_server_mode(options) == 0); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 1); + + /* Bridge Clients can use multiple directory mirrors for bootstrap */ + memset(options, 0, sizeof(or_options_t)); + options->UseBridges = 1; + tt_assert(server_mode(options) == 0); + tt_assert(public_server_mode(options) == 0); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 1); + + /* Bridge Relays (Bridges) must act like clients, and use multiple + * directory mirrors for bootstrap */ + memset(options, 0, sizeof(or_options_t)); + options->BridgeRelay = 1; + options->ORPort_set = 1; + tt_assert(server_mode(options) == 1); + tt_assert(public_server_mode(options) == 0); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 1); + + /* Clients set to FetchDirInfoEarly must fetch it from the authorities, + * but can use multiple authorities for bootstrap */ + memset(options, 0, sizeof(or_options_t)); + options->FetchDirInfoEarly = 1; + tt_assert(server_mode(options) == 0); + tt_assert(public_server_mode(options) == 0); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 1); + + /* OR servers only fetch the consensus from the authorities when they don't + * know their own address, but never use multiple directories for bootstrap + */ + memset(options, 0, sizeof(or_options_t)); + options->ORPort_set = 1; + + mock_router_pick_published_address_result = -1; + tt_assert(server_mode(options) == 1); + tt_assert(public_server_mode(options) == 1); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 0); + + mock_router_pick_published_address_result = 0; + tt_assert(server_mode(options) == 1); + tt_assert(public_server_mode(options) == 1); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 0); + + /* Exit OR servers only fetch the consensus from the authorities when they + * refuse unknown exits, but never use multiple directories for bootstrap + */ + memset(options, 0, sizeof(or_options_t)); + options->ORPort_set = 1; + options->ExitRelay = 1; + mock_router_pick_published_address_result = 0; + mock_router_my_exit_policy_is_reject_star_result = 0; + mock_advertised_server_mode_result = 1; + mock_router_get_my_routerinfo_result = &routerinfo; + + routerinfo.supports_tunnelled_dir_requests = 1; + + options->RefuseUnknownExits = 1; + tt_assert(server_mode(options) == 1); + tt_assert(public_server_mode(options) == 1); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 0); + + options->RefuseUnknownExits = 0; + mock_router_pick_published_address_result = 0; + tt_assert(server_mode(options) == 1); + tt_assert(public_server_mode(options) == 1); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 0); + + /* Dir servers fetch the consensus from the authorities, unless they are not + * advertising themselves (hibernating) or have no routerinfo or are not + * advertising their dirport, and never use multiple directories for + * bootstrap. This only applies if they are also OR servers. + * (We don't care much about the behaviour of non-OR directory servers.) */ + memset(options, 0, sizeof(or_options_t)); + options->DirPort_set = 1; + options->ORPort_set = 1; + options->DirCache = 1; + mock_router_pick_published_address_result = 0; + mock_router_my_exit_policy_is_reject_star_result = 1; + + mock_advertised_server_mode_result = 1; + routerinfo.dir_port = 1; + mock_router_get_my_routerinfo_result = &routerinfo; + tt_assert(server_mode(options) == 1); + tt_assert(public_server_mode(options) == 1); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 0); + + mock_advertised_server_mode_result = 0; + routerinfo.dir_port = 1; + mock_router_get_my_routerinfo_result = &routerinfo; + tt_assert(server_mode(options) == 1); + tt_assert(public_server_mode(options) == 1); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 0); + + mock_advertised_server_mode_result = 1; + mock_router_get_my_routerinfo_result = NULL; + tt_assert(server_mode(options) == 1); + tt_assert(public_server_mode(options) == 1); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 0); + + mock_advertised_server_mode_result = 1; + routerinfo.dir_port = 0; + routerinfo.supports_tunnelled_dir_requests = 0; + mock_router_get_my_routerinfo_result = &routerinfo; + tt_assert(server_mode(options) == 1); + tt_assert(public_server_mode(options) == 1); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 0); + + mock_advertised_server_mode_result = 1; + routerinfo.dir_port = 1; + routerinfo.supports_tunnelled_dir_requests = 1; + mock_router_get_my_routerinfo_result = &routerinfo; + tt_assert(server_mode(options) == 1); + tt_assert(public_server_mode(options) == 1); + tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1); + tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), + OP_EQ, 0); + + done: + tor_free(options); + UNMOCK(router_pick_published_address); + UNMOCK(router_get_my_routerinfo); + UNMOCK(advertised_server_mode); + UNMOCK(router_my_exit_policy_is_reject_star); +} + +static void +test_config_default_fallback_dirs(void *arg) +{ + const char *fallback[] = { +#include "../or/fallback_dirs.inc" + NULL + }; + + int n_included_fallback_dirs = 0; + int n_added_fallback_dirs = 0; + + (void)arg; + clear_dir_servers(); + + while (fallback[n_included_fallback_dirs]) + n_included_fallback_dirs++; + + add_default_fallback_dir_servers(); + + n_added_fallback_dirs = smartlist_len(router_get_fallback_dir_servers()); + + tt_assert(n_included_fallback_dirs == n_added_fallback_dirs); + + done: + clear_dir_servers(); +} + +static void +test_config_port_cfg_line_extract_addrport(void *arg) +{ + (void)arg; + int unixy = 0; + const char *rest = NULL; + char *a = NULL; + + tt_int_op(port_cfg_line_extract_addrport("", &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 0); + tt_str_op(a, OP_EQ, ""); + tt_str_op(rest, OP_EQ, ""); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("hello", &a, &unixy, &rest), + OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 0); + tt_str_op(a, OP_EQ, "hello"); + tt_str_op(rest, OP_EQ, ""); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport(" flipperwalt gersplut", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 0); + tt_str_op(a, OP_EQ, "flipperwalt"); + tt_str_op(rest, OP_EQ, "gersplut"); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport(" flipperwalt \t gersplut", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 0); + tt_str_op(a, OP_EQ, "flipperwalt"); + tt_str_op(rest, OP_EQ, "gersplut"); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("flipperwalt \t gersplut", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 0); + tt_str_op(a, OP_EQ, "flipperwalt"); + tt_str_op(rest, OP_EQ, "gersplut"); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("unix:flipperwalt \t gersplut", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 1); + tt_str_op(a, OP_EQ, "flipperwalt"); + tt_str_op(rest, OP_EQ, "gersplut"); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("lolol", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 0); + tt_str_op(a, OP_EQ, "lolol"); + tt_str_op(rest, OP_EQ, ""); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("unix:lolol", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 1); + tt_str_op(a, OP_EQ, "lolol"); + tt_str_op(rest, OP_EQ, ""); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("unix:lolol ", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 1); + tt_str_op(a, OP_EQ, "lolol"); + tt_str_op(rest, OP_EQ, ""); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport(" unix:lolol", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 1); + tt_str_op(a, OP_EQ, "lolol"); + tt_str_op(rest, OP_EQ, ""); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("foobar:lolol", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 0); + tt_str_op(a, OP_EQ, "foobar:lolol"); + tt_str_op(rest, OP_EQ, ""); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport(":lolol", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 0); + tt_str_op(a, OP_EQ, ":lolol"); + tt_str_op(rest, OP_EQ, ""); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("unix:\"lolol\"", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 1); + tt_str_op(a, OP_EQ, "lolol"); + tt_str_op(rest, OP_EQ, ""); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("unix:\"lolol\" ", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 1); + tt_str_op(a, OP_EQ, "lolol"); + tt_str_op(rest, OP_EQ, ""); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("unix:\"lolol\" foo ", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 1); + tt_str_op(a, OP_EQ, "lolol"); + tt_str_op(rest, OP_EQ, "foo "); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("unix:\"lol ol\" foo ", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 1); + tt_str_op(a, OP_EQ, "lol ol"); + tt_str_op(rest, OP_EQ, "foo "); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("unix:\"lol\\\" ol\" foo ", + &a, &unixy, &rest), OP_EQ, 0); + tt_int_op(unixy, OP_EQ, 1); + tt_str_op(a, OP_EQ, "lol\" ol"); + tt_str_op(rest, OP_EQ, "foo "); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("unix:\"lol\\\" ol foo ", + &a, &unixy, &rest), OP_EQ, -1); + tor_free(a); + + tt_int_op(port_cfg_line_extract_addrport("unix:\"lol\\0\" ol foo ", + &a, &unixy, &rest), OP_EQ, -1); + tor_free(a); + + done: + tor_free(a); +} + +static config_line_t * +mock_config_line(const char *key, const char *val) +{ + config_line_t *config_line = tor_malloc(sizeof(config_line_t)); + memset(config_line, 0, sizeof(config_line_t)); + config_line->key = tor_strdup(key); + config_line->value = tor_strdup(val); + return config_line; +} + +static void +test_config_parse_port_config__ports__no_ports_given(void *data) +{ + (void)data; + int ret; + smartlist_t *slout = NULL; + port_cfg_t *port_cfg = NULL; + + slout = smartlist_new(); + + // Test no defaultport, no defaultaddress and no out + ret = parse_port_config(NULL, NULL, "DNS", 0, NULL, 0, 0); + tt_int_op(ret, OP_EQ, 0); + + // Test with defaultport, no defaultaddress and no out + ret = parse_port_config(NULL, NULL, "DNS", 0, NULL, 42, 0); + tt_int_op(ret, OP_EQ, 0); + + // Test no defaultport, with defaultaddress and no out + ret = parse_port_config(NULL, NULL, "DNS", 0, "127.0.0.2", 0, 0); + tt_int_op(ret, OP_EQ, 0); + + // Test with defaultport, with defaultaddress and no out + ret = parse_port_config(NULL, NULL, "DNS", 0, "127.0.0.2", 42, 0); + tt_int_op(ret, OP_EQ, 0); + + // Test no defaultport, no defaultaddress and with out + ret = parse_port_config(slout, NULL, "DNS", 0, NULL, 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 0); + + // Test with defaultport, no defaultaddress and with out + ret = parse_port_config(slout, NULL, "DNS", 0, NULL, 42, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 0); + + // Test no defaultport, with defaultaddress and with out + ret = parse_port_config(slout, NULL, "DNS", 0, "127.0.0.2", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 0); + + // Test with defaultport, with defaultaddress and out, adds a new port cfg + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + ret = parse_port_config(slout, NULL, "DNS", 0, "127.0.0.2", 42, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->port, OP_EQ, 42); + tt_int_op(port_cfg->is_unix_addr, OP_EQ, 0); + + // Test with defaultport, with defaultaddress and out, adds a new port cfg + // for a unix address + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + ret = parse_port_config(slout, NULL, "DNS", 0, "/foo/bar/unixdomain", + 42, CL_PORT_IS_UNIXSOCKET); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->port, OP_EQ, 0); + tt_int_op(port_cfg->is_unix_addr, OP_EQ, 1); + tt_str_op(port_cfg->unix_addr, OP_EQ, "/foo/bar/unixdomain"); + + done: + if (slout) + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_free(slout); +} + +static void +test_config_parse_port_config__ports__ports_given(void *data) +{ + (void)data; + int ret; + smartlist_t *slout = NULL; + port_cfg_t *port_cfg = NULL; + config_line_t *config_port_invalid = NULL, *config_port_valid = NULL; + tor_addr_t addr; + + slout = smartlist_new(); + + // Test error when encounters an invalid Port specification + config_port_invalid = mock_config_line("DNSPort", ""); + ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, NULL, + 0, 0); + tt_int_op(ret, OP_EQ, -1); + + // Test error when encounters an empty unix domain specification + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_port_invalid = mock_config_line("DNSPort", "unix:"); + ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, NULL, + 0, 0); + tt_int_op(ret, OP_EQ, -1); + + // Test error when encounters a unix domain specification but the listener + // doesn't support domain sockets + config_port_valid = mock_config_line("DNSPort", "unix:/tmp/foo/bar"); + ret = parse_port_config(NULL, config_port_valid, "DNS", + CONN_TYPE_AP_DNS_LISTENER, NULL, 0, 0); + tt_int_op(ret, OP_EQ, -1); + + // Test valid unix domain + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + ret = parse_port_config(slout, config_port_valid, "SOCKS", + CONN_TYPE_AP_LISTENER, NULL, 0, 0); +#ifdef _WIN32 + tt_int_op(ret, OP_EQ, -1); +#else + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->port, OP_EQ, 0); + tt_int_op(port_cfg->is_unix_addr, OP_EQ, 1); + tt_str_op(port_cfg->unix_addr, OP_EQ, "/tmp/foo/bar"); + /* Test entry port defaults as initialised in parse_port_config */ + tt_int_op(port_cfg->entry_cfg.dns_request, OP_EQ, 1); + tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 1); + tt_int_op(port_cfg->entry_cfg.onion_traffic, OP_EQ, 1); + tt_int_op(port_cfg->entry_cfg.cache_ipv4_answers, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.prefer_ipv6_virtaddr, OP_EQ, 1); +#endif /* defined(_WIN32) */ + + // Test failure if we have no ipv4 and no ipv6 and no onion (DNS only) + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_port_invalid = mock_config_line("SOCKSPort", + "unix:/tmp/foo/bar NoIPv4Traffic " + "NoIPv6Traffic " + "NoOnionTraffic"); + ret = parse_port_config(NULL, config_port_invalid, "SOCKS", + CONN_TYPE_AP_LISTENER, NULL, 0, + CL_PORT_TAKES_HOSTNAMES); + tt_int_op(ret, OP_EQ, -1); + + // Test failure if we have no DNS and we're a DNSPort + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_port_invalid = mock_config_line("DNSPort", + "127.0.0.1:80 NoDNSRequest"); + ret = parse_port_config(NULL, config_port_invalid, "DNS", + CONN_TYPE_AP_DNS_LISTENER, NULL, 0, + CL_PORT_TAKES_HOSTNAMES); + tt_int_op(ret, OP_EQ, -1); + + // If we're a DNSPort, DNS only is ok + // Use a port because DNSPort doesn't support sockets + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "127.0.0.1:80 " + "NoIPv6Traffic " + "NoIPv4Traffic NoOnionTraffic"); + ret = parse_port_config(slout, config_port_valid, "DNS", + CONN_TYPE_AP_DNS_LISTENER, NULL, 0, + CL_PORT_TAKES_HOSTNAMES); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.dns_request, OP_EQ, 1); + tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.onion_traffic, OP_EQ, 0); + + // Test failure if we have DNS but no ipv4 and no ipv6 + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_port_invalid = mock_config_line("SOCKSPort", + "NoIPv6Traffic " + "unix:/tmp/foo/bar NoIPv4Traffic"); + ret = parse_port_config(NULL, config_port_invalid, "SOCKS", + CONN_TYPE_AP_LISTENER, NULL, 0, + CL_PORT_TAKES_HOSTNAMES); + tt_int_op(ret, OP_EQ, -1); + + // Test success with no DNS, no ipv4, no ipv6 (only onion, using separate + // options) + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("SOCKSPort", "unix:/tmp/foo/bar " + "NoIPv6Traffic " + "NoDNSRequest NoIPv4Traffic"); + ret = parse_port_config(slout, config_port_valid, "SOCKS", + CONN_TYPE_AP_LISTENER, NULL, 0, + CL_PORT_TAKES_HOSTNAMES); +#ifdef _WIN32 + tt_int_op(ret, OP_EQ, -1); +#else + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.dns_request, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.onion_traffic, OP_EQ, 1); +#endif /* defined(_WIN32) */ + + // Test success with quoted unix: address. + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("SOCKSPort", "unix:\"/tmp/foo/ bar\" " + "NoIPv6Traffic " + "NoDNSRequest NoIPv4Traffic"); + ret = parse_port_config(slout, config_port_valid, "SOCKS", + CONN_TYPE_AP_LISTENER, NULL, 0, + CL_PORT_TAKES_HOSTNAMES); +#ifdef _WIN32 + tt_int_op(ret, OP_EQ, -1); +#else + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.dns_request, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.onion_traffic, OP_EQ, 1); +#endif /* defined(_WIN32) */ + + // Test failure with broken quoted unix: address. + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("SOCKSPort", "unix:\"/tmp/foo/ bar " + "NoIPv6Traffic " + "NoDNSRequest NoIPv4Traffic"); + ret = parse_port_config(slout, config_port_valid, "SOCKS", + CONN_TYPE_AP_LISTENER, NULL, 0, + CL_PORT_TAKES_HOSTNAMES); + tt_int_op(ret, OP_EQ, -1); + + // Test failure with empty quoted unix: address. + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("SOCKSPort", "unix:\"\" " + "NoIPv6Traffic " + "NoDNSRequest NoIPv4Traffic"); + ret = parse_port_config(slout, config_port_valid, "SOCKS", + CONN_TYPE_AP_LISTENER, NULL, 0, + CL_PORT_TAKES_HOSTNAMES); + tt_int_op(ret, OP_EQ, -1); + + // Test success with OnionTrafficOnly (no DNS, no ipv4, no ipv6) + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("SOCKSPort", "unix:/tmp/foo/bar " + "OnionTrafficOnly"); + ret = parse_port_config(slout, config_port_valid, "SOCKS", + CONN_TYPE_AP_LISTENER, NULL, 0, + CL_PORT_TAKES_HOSTNAMES); +#ifdef _WIN32 + tt_int_op(ret, OP_EQ, -1); +#else + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.dns_request, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.onion_traffic, OP_EQ, 1); +#endif /* defined(_WIN32) */ + + // Test success with no ipv4 but take ipv6 + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("SOCKSPort", "unix:/tmp/foo/bar " + "NoIPv4Traffic IPv6Traffic"); + ret = parse_port_config(slout, config_port_valid, "SOCKS", + CONN_TYPE_AP_LISTENER, NULL, 0, + CL_PORT_TAKES_HOSTNAMES); +#ifdef _WIN32 + tt_int_op(ret, OP_EQ, -1); +#else + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 1); +#endif /* defined(_WIN32) */ + + // Test success with both ipv4 and ipv6 + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("SOCKSPort", "unix:/tmp/foo/bar " + "IPv4Traffic IPv6Traffic"); + ret = parse_port_config(slout, config_port_valid, "SOCKS", + CONN_TYPE_AP_LISTENER, NULL, 0, + CL_PORT_TAKES_HOSTNAMES); +#ifdef _WIN32 + tt_int_op(ret, OP_EQ, -1); +#else + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 1); + tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 1); +#endif /* defined(_WIN32) */ + + // Test failure if we specify world writable for an IP Port + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_port_invalid = mock_config_line("DNSPort", "42 WorldWritable"); + ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, -1); + + // Test failure if we specify group writable for an IP Port + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_port_invalid = mock_config_line("DNSPort", "42 GroupWritable"); + ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, -1); + + // Test failure if we specify group writable for an IP Port + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_port_invalid = mock_config_line("DNSPort", "42 RelaxDirModeCheck"); + ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, -1); + + // Test success with only a port (this will fail without a default address) + config_free_lines(config_port_valid); config_port_valid = NULL; + config_port_valid = mock_config_line("DNSPort", "42"); + ret = parse_port_config(NULL, config_port_valid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, 0); + + // Test success with only a port and isolate destination port + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 IsolateDestPort"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, + ISO_DEFAULT | ISO_DESTPORT); + + // Test success with a negative isolate destination port, and plural + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 NoIsolateDestPorts"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, + ISO_DEFAULT & ~ISO_DESTPORT); + + // Test success with isolate destination address + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 IsolateDestAddr"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, + ISO_DEFAULT | ISO_DESTADDR); + + // Test success with isolate socks AUTH + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 IsolateSOCKSAuth"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, + ISO_DEFAULT | ISO_SOCKSAUTH); + + // Test success with isolate client protocol + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 IsolateClientProtocol"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, + ISO_DEFAULT | ISO_CLIENTPROTO); + + // Test success with isolate client address + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 IsolateClientAddr"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, + ISO_DEFAULT | ISO_CLIENTADDR); + + // Test success with ignored unknown options + config_free_lines(config_port_valid); config_port_valid = NULL; + config_port_valid = mock_config_line("DNSPort", "42 ThisOptionDoesntExist"); + ret = parse_port_config(NULL, config_port_valid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, 0); + + // Test success with no isolate socks AUTH + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 NoIsolateSOCKSAuth"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.3", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.socks_prefer_no_auth, OP_EQ, 1); + + // Test success with prefer ipv6 + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("SOCKSPort", + "42 IPv6Traffic PreferIPv6"); + ret = parse_port_config(slout, config_port_valid, "SOCKS", + CONN_TYPE_AP_LISTENER, "127.0.0.42", 0, + CL_PORT_TAKES_HOSTNAMES); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.prefer_ipv6, OP_EQ, 1); + + // Test success with cache ipv4 DNS + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 CacheIPv4DNS"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.42", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.cache_ipv4_answers, OP_EQ, 1); + tt_int_op(port_cfg->entry_cfg.cache_ipv6_answers, OP_EQ, 0); + + // Test success with cache ipv6 DNS + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 CacheIPv6DNS"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.42", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.cache_ipv4_answers, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.cache_ipv6_answers, OP_EQ, 1); + + // Test success with no cache ipv4 DNS + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 NoCacheIPv4DNS"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.42", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.cache_ipv4_answers, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.cache_ipv6_answers, OP_EQ, 0); + + // Test success with cache DNS + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 CacheDNS"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.42", 0, CL_PORT_TAKES_HOSTNAMES); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.cache_ipv4_answers, OP_EQ, 1); + tt_int_op(port_cfg->entry_cfg.cache_ipv6_answers, OP_EQ, 1); + + // Test success with use cached ipv4 DNS + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 UseIPv4Cache"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.42", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.use_cached_ipv4_answers, OP_EQ, 1); + tt_int_op(port_cfg->entry_cfg.use_cached_ipv6_answers, OP_EQ, 0); + + // Test success with use cached ipv6 DNS + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 UseIPv6Cache"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.42", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.use_cached_ipv4_answers, OP_EQ, 0); + tt_int_op(port_cfg->entry_cfg.use_cached_ipv6_answers, OP_EQ, 1); + + // Test success with use cached DNS + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 UseDNSCache"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.42", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.use_cached_ipv4_answers, OP_EQ, 1); + tt_int_op(port_cfg->entry_cfg.use_cached_ipv6_answers, OP_EQ, 1); + + // Test success with not preferring ipv6 automap + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 NoPreferIPv6Automap"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.42", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.prefer_ipv6_virtaddr, OP_EQ, 0); + + // Test success with prefer SOCKS no auth + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 PreferSOCKSNoAuth"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.42", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.socks_prefer_no_auth, OP_EQ, 1); + + // Test failure with both a zero port and a non-zero port + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_invalid = mock_config_line("DNSPort", "0"); + config_port_valid = mock_config_line("DNSPort", "42"); + config_port_invalid->next = config_port_valid; + ret = parse_port_config(slout, config_port_invalid, "DNS", 0, + "127.0.0.42", 0, 0); + tt_int_op(ret, OP_EQ, -1); + + // Test success with warn non-local control + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + ret = parse_port_config(slout, config_port_valid, "Control", + CONN_TYPE_CONTROL_LISTENER, "127.0.0.42", 0, + CL_PORT_WARN_NONLOCAL); + tt_int_op(ret, OP_EQ, 0); + + // Test success with warn non-local listener + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + ret = parse_port_config(slout, config_port_valid, "ExtOR", + CONN_TYPE_EXT_OR_LISTENER, "127.0.0.42", 0, + CL_PORT_WARN_NONLOCAL); + tt_int_op(ret, OP_EQ, 0); + + // Test success with warn non-local other + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.42", 0, CL_PORT_WARN_NONLOCAL); + tt_int_op(ret, OP_EQ, 0); + + // Test success with warn non-local other without out + ret = parse_port_config(NULL, config_port_valid, "DNS", 0, + "127.0.0.42", 0, CL_PORT_WARN_NONLOCAL); + tt_int_op(ret, OP_EQ, 0); + + // Test success with both ipv4 and ipv6 but without stream options + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 IPv4Traffic " + "IPv6Traffic"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.44", 0, + CL_PORT_TAKES_HOSTNAMES | + CL_PORT_NO_STREAM_OPTIONS); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 1); + tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 1); + + // Test failure for a SessionGroup argument with invalid value + config_free_lines(config_port_invalid); config_port_invalid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_invalid = mock_config_line("DNSPort", "42 SessionGroup=invalid"); + ret = parse_port_config(slout, config_port_invalid, "DNS", 0, + "127.0.0.44", 0, CL_PORT_NO_STREAM_OPTIONS); + tt_int_op(ret, OP_EQ, -1); + + // TODO: this seems wrong. Shouldn't it be the other way around? + // Potential bug. + // Test failure for a SessionGroup argument with valid value but with stream + // options allowed + config_free_lines(config_port_invalid); config_port_invalid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_invalid = mock_config_line("DNSPort", "42 SessionGroup=123"); + ret = parse_port_config(slout, config_port_invalid, "DNS", 0, + "127.0.0.44", 0, 0); + tt_int_op(ret, OP_EQ, -1); + + // Test failure for more than one SessionGroup argument + config_free_lines(config_port_invalid); config_port_invalid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_invalid = mock_config_line("DNSPort", "42 SessionGroup=123 " + "SessionGroup=321"); + ret = parse_port_config(slout, config_port_invalid, "DNS", 0, + "127.0.0.44", 0, CL_PORT_NO_STREAM_OPTIONS); + tt_int_op(ret, OP_EQ, -1); + + // Test success with a sessiongroup options + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "42 SessionGroup=1111122"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.44", 0, CL_PORT_NO_STREAM_OPTIONS); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->entry_cfg.session_group, OP_EQ, 1111122); + + // Test success with a zero unix domain socket, and doesnt add it to out + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "0"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.45", 0, CL_PORT_IS_UNIXSOCKET); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 0); + + // Test success with a one unix domain socket, and doesnt add it to out + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "something"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.45", 0, CL_PORT_IS_UNIXSOCKET); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->is_unix_addr, OP_EQ, 1); + tt_str_op(port_cfg->unix_addr, OP_EQ, "something"); + + // Test success with a port of auto - it uses the default address + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "auto"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.46", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->port, OP_EQ, CFG_AUTO_PORT); + tor_addr_parse(&addr, "127.0.0.46"); + tt_assert(tor_addr_eq(&port_cfg->addr, &addr)) + + // Test success with parsing both an address and an auto port + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "127.0.0.122:auto"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.46", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->port, OP_EQ, CFG_AUTO_PORT); + tor_addr_parse(&addr, "127.0.0.122"); + tt_assert(tor_addr_eq(&port_cfg->addr, &addr)) + + // Test failure when asked to parse an invalid address followed by auto + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_port_invalid = mock_config_line("DNSPort", "invalidstuff!!:auto"); + MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); + ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, + "127.0.0.46", 0, 0); + UNMOCK(tor_addr_lookup); + tt_int_op(ret, OP_EQ, -1); + + // Test success with parsing both an address and a real port + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "127.0.0.123:656"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, + "127.0.0.46", 0, 0); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->port, OP_EQ, 656); + tor_addr_parse(&addr, "127.0.0.123"); + tt_assert(tor_addr_eq(&port_cfg->addr, &addr)) + + // Test failure if we can't parse anything at all + config_free_lines(config_port_invalid); config_port_invalid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_invalid = mock_config_line("DNSPort", "something wrong"); + ret = parse_port_config(slout, config_port_invalid, "DNS", 0, + "127.0.0.46", 0, 0); + tt_int_op(ret, OP_EQ, -1); + + // Test failure if we find both an address, a port and an auto + config_free_lines(config_port_invalid); config_port_invalid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_invalid = mock_config_line("DNSPort", "127.0.1.0:123:auto"); + ret = parse_port_config(slout, config_port_invalid, "DNS", 0, + "127.0.0.46", 0, 0); + tt_int_op(ret, OP_EQ, -1); + + // Test that default to group writeable default sets group writeable for + // domain socket + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("SOCKSPort", "unix:/tmp/somewhere"); + ret = parse_port_config(slout, config_port_valid, "SOCKS", + CONN_TYPE_AP_LISTENER, "127.0.0.46", 0, + CL_PORT_DFLT_GROUP_WRITABLE); +#ifdef _WIN32 + tt_int_op(ret, OP_EQ, -1); +#else + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->is_group_writable, OP_EQ, 1); +#endif /* defined(_WIN32) */ + + done: + if (slout) + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_free(slout); + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_free_lines(config_port_valid); config_port_valid = NULL; +} + +static void +test_config_parse_port_config__ports__server_options(void *data) +{ + (void)data; + int ret; + smartlist_t *slout = NULL; + port_cfg_t *port_cfg = NULL; + config_line_t *config_port_invalid = NULL, *config_port_valid = NULL; + + slout = smartlist_new(); + + // Test success with NoAdvertise option + config_free_lines(config_port_valid); config_port_valid = NULL; + config_port_valid = mock_config_line("DNSPort", + "127.0.0.124:656 NoAdvertise"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, NULL, 0, + CL_PORT_SERVER_OPTIONS); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->server_cfg.no_advertise, OP_EQ, 1); + tt_int_op(port_cfg->server_cfg.no_listen, OP_EQ, 0); + + // Test success with NoListen option + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "127.0.0.124:656 NoListen"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, NULL, 0, + CL_PORT_SERVER_OPTIONS); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->server_cfg.no_advertise, OP_EQ, 0); + tt_int_op(port_cfg->server_cfg.no_listen, OP_EQ, 1); + + // Test failure with both NoAdvertise and NoListen option + config_free_lines(config_port_invalid); config_port_invalid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_invalid = mock_config_line("DNSPort", "127.0.0.124:656 NoListen " + "NoAdvertise"); + ret = parse_port_config(slout, config_port_invalid, "DNS", 0, NULL, + 0, CL_PORT_SERVER_OPTIONS); + tt_int_op(ret, OP_EQ, -1); + + // Test success with IPv4Only + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "127.0.0.124:656 IPv4Only"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, NULL, 0, + CL_PORT_SERVER_OPTIONS); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->server_cfg.bind_ipv4_only, OP_EQ, 1); + tt_int_op(port_cfg->server_cfg.bind_ipv6_only, OP_EQ, 0); + + // Test success with IPv6Only + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "[::1]:656 IPv6Only"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, NULL, 0, + CL_PORT_SERVER_OPTIONS); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + port_cfg = (port_cfg_t *)smartlist_get(slout, 0); + tt_int_op(port_cfg->server_cfg.bind_ipv4_only, OP_EQ, 0); + tt_int_op(port_cfg->server_cfg.bind_ipv6_only, OP_EQ, 1); + + // Test failure with both IPv4Only and IPv6Only + config_free_lines(config_port_invalid); config_port_invalid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_invalid = mock_config_line("DNSPort", "127.0.0.124:656 IPv6Only " + "IPv4Only"); + ret = parse_port_config(slout, config_port_invalid, "DNS", 0, NULL, + 0, CL_PORT_SERVER_OPTIONS); + tt_int_op(ret, OP_EQ, -1); + + // Test success with invalid parameter + config_free_lines(config_port_valid); config_port_valid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_valid = mock_config_line("DNSPort", "127.0.0.124:656 unknown"); + ret = parse_port_config(slout, config_port_valid, "DNS", 0, NULL, 0, + CL_PORT_SERVER_OPTIONS); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(slout), OP_EQ, 1); + + // Test failure when asked to bind only to ipv6 but gets an ipv4 address + config_free_lines(config_port_invalid); config_port_invalid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_invalid = mock_config_line("DNSPort", + "127.0.0.124:656 IPv6Only"); + ret = parse_port_config(slout, config_port_invalid, "DNS", 0, NULL, + 0, CL_PORT_SERVER_OPTIONS); + tt_int_op(ret, OP_EQ, -1); + + // Test failure when asked to bind only to ipv4 but gets an ipv6 address + config_free_lines(config_port_invalid); config_port_invalid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_invalid = mock_config_line("DNSPort", "[::1]:656 IPv4Only"); + ret = parse_port_config(slout, config_port_invalid, "DNS", 0, NULL, + 0, CL_PORT_SERVER_OPTIONS); + tt_int_op(ret, OP_EQ, -1); + + // Check for failure with empty unix: address. + config_free_lines(config_port_invalid); config_port_invalid = NULL; + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_clear(slout); + config_port_invalid = mock_config_line("ORPort", "unix:\"\""); + ret = parse_port_config(slout, config_port_invalid, "ORPort", 0, NULL, + 0, CL_PORT_SERVER_OPTIONS); + tt_int_op(ret, OP_EQ, -1); + + done: + if (slout) + SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); + smartlist_free(slout); + config_free_lines(config_port_invalid); config_port_invalid = NULL; + config_free_lines(config_port_valid); config_port_valid = NULL; +} + +static void +test_config_parse_log_severity(void *data) +{ + int ret; + const char *severity_log_lines[] = { + "debug file /tmp/debug.log", + "debug\tfile /tmp/debug.log", + "[handshake]debug [~net,~mm]info notice stdout", + "[handshake]debug\t[~net,~mm]info\tnotice\tstdout", + NULL + }; + int i; + log_severity_list_t *severity; + + (void) data; + + severity = tor_malloc(sizeof(log_severity_list_t)); + for (i = 0; severity_log_lines[i]; i++) { + memset(severity, 0, sizeof(log_severity_list_t)); + ret = parse_log_severity_config(&severity_log_lines[i], severity); + tt_int_op(ret, OP_EQ, 0); + } + + done: + tor_free(severity); +} + +static void +test_config_include_limit(void *data) +{ + (void)data; + + config_line_t *result = NULL; + char *torrc_path = NULL; + char *dir = tor_strdup(get_fname("test_include_limit")); + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + tor_asprintf(&torrc_path, "%s"PATH_SEPARATOR"torrc", dir); + char torrc_contents[1000]; + tor_snprintf(torrc_contents, sizeof(torrc_contents), "%%include %s", + torrc_path); + tt_int_op(write_str_to_file(torrc_path, torrc_contents, 0), OP_EQ, 0); + + tt_int_op(config_get_lines_include(torrc_contents, &result, 0, NULL, NULL), + OP_EQ, -1); + + done: + config_free_lines(result); + tor_free(torrc_path); + tor_free(dir); +} + +static void +test_config_include_does_not_exist(void *data) +{ + (void)data; + + config_line_t *result = NULL; + char *dir = tor_strdup(get_fname("test_include_does_not_exist")); + char *missing_path = NULL; + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + tor_asprintf(&missing_path, "%s"PATH_SEPARATOR"missing", dir); + char torrc_contents[1000]; + tor_snprintf(torrc_contents, sizeof(torrc_contents), "%%include %s", + missing_path); + + tt_int_op(config_get_lines_include(torrc_contents, &result, 0, NULL, NULL), + OP_EQ, -1); + + done: + config_free_lines(result); + tor_free(dir); + tor_free(missing_path); +} + +static void +test_config_include_error_in_included_file(void *data) +{ + (void)data; + config_line_t *result = NULL; + + char *dir = tor_strdup(get_fname("test_error_in_included_file")); + char *invalid_path = NULL; + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + tor_asprintf(&invalid_path, "%s"PATH_SEPARATOR"invalid", dir); + tt_int_op(write_str_to_file(invalid_path, "unclosed \"", 0), OP_EQ, 0); + + char torrc_contents[1000]; + tor_snprintf(torrc_contents, sizeof(torrc_contents), "%%include %s", + invalid_path); + + tt_int_op(config_get_lines_include(torrc_contents, &result, 0, NULL, NULL), + OP_EQ, -1); + + done: + config_free_lines(result); + tor_free(dir); + tor_free(invalid_path); +} + +static void +test_config_include_empty_file_folder(void *data) +{ + (void)data; + config_line_t *result = NULL; + + char *folder_path = NULL; + char *file_path = NULL; + char *dir = tor_strdup(get_fname("test_include_empty_file_folder")); + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + tor_asprintf(&folder_path, "%s"PATH_SEPARATOR"empty_dir", dir); +#ifdef _WIN32 + tt_int_op(mkdir(folder_path), OP_EQ, 0); +#else + tt_int_op(mkdir(folder_path, 0700), OP_EQ, 0); +#endif + tor_asprintf(&file_path, "%s"PATH_SEPARATOR"empty_file", dir); + tt_int_op(write_str_to_file(file_path, "", 0), OP_EQ, 0); + + char torrc_contents[1000]; + tor_snprintf(torrc_contents, sizeof(torrc_contents), + "%%include %s\n" + "%%include %s\n", + folder_path, file_path); + + int include_used; + tt_int_op(config_get_lines_include(torrc_contents, &result, 0,&include_used, + NULL), OP_EQ, 0); + tt_ptr_op(result, OP_EQ, NULL); + tt_int_op(include_used, OP_EQ, 1); + + done: + config_free_lines(result); + tor_free(folder_path); + tor_free(file_path); + tor_free(dir); +} + +#ifndef _WIN32 +static void +test_config_include_no_permission(void *data) +{ + (void)data; + config_line_t *result = NULL; + + char *folder_path = NULL; + char *dir = NULL; + if (geteuid() == 0) + tt_skip(); + + dir = tor_strdup(get_fname("test_include_forbidden_folder")); + tt_ptr_op(dir, OP_NE, NULL); + + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); + + tor_asprintf(&folder_path, "%s"PATH_SEPARATOR"forbidden_dir", dir); + tt_int_op(mkdir(folder_path, 0100), OP_EQ, 0); + + char torrc_contents[1000]; + tor_snprintf(torrc_contents, sizeof(torrc_contents), + "%%include %s\n", + folder_path); + + int include_used; + tt_int_op(config_get_lines_include(torrc_contents, &result, 0, + &include_used, NULL), + OP_EQ, -1); + tt_ptr_op(result, OP_EQ, NULL); + + done: + config_free_lines(result); + tor_free(folder_path); + if (dir) + chmod(dir, 0700); + tor_free(dir); +} +#endif + +static void +test_config_include_recursion_before_after(void *data) +{ + (void)data; + + config_line_t *result = NULL; + char *torrc_path = NULL; + char *dir = tor_strdup(get_fname("test_include_recursion_before_after")); + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + tor_asprintf(&torrc_path, "%s"PATH_SEPARATOR"torrc", dir); + + char file_contents[1000]; + const int limit = MAX_INCLUDE_RECURSION_LEVEL; + int i; + // Loop backwards so file_contents has the contents of the first file by the + // end of the loop + for (i = limit; i > 0; i--) { + if (i < limit) { + tor_snprintf(file_contents, sizeof(file_contents), + "Test %d\n" + "%%include %s%d\n" + "Test %d\n", + i, torrc_path, i + 1, 2 * limit - i); + } else { + tor_snprintf(file_contents, sizeof(file_contents), "Test %d\n", i); + } + + if (i > 1) { + char *file_path = NULL; + tor_asprintf(&file_path, "%s%d", torrc_path, i); + tt_int_op(write_str_to_file(file_path, file_contents, 0), OP_EQ, 0); + tor_free(file_path); + } + } + + int include_used; + tt_int_op(config_get_lines_include(file_contents, &result, 0, &include_used, + NULL), OP_EQ, 0); + tt_ptr_op(result, OP_NE, NULL); + tt_int_op(include_used, OP_EQ, 1); + + int len = 0; + config_line_t *next; + for (next = result; next != NULL; next = next->next) { + char expected[10]; + tor_snprintf(expected, sizeof(expected), "%d", len + 1); + tt_str_op(next->key, OP_EQ, "Test"); + tt_str_op(next->value, OP_EQ, expected); + len++; + } + tt_int_op(len, OP_EQ, 2 * limit - 1); + + done: + config_free_lines(result); + tor_free(dir); + tor_free(torrc_path); +} + +static void +test_config_include_recursion_after_only(void *data) +{ + (void)data; + + config_line_t *result = NULL; + char *torrc_path = NULL; + char *dir = tor_strdup(get_fname("test_include_recursion_after_only")); + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + tor_asprintf(&torrc_path, "%s"PATH_SEPARATOR"torrc", dir); + + char file_contents[1000]; + const int limit = MAX_INCLUDE_RECURSION_LEVEL; + int i; + // Loop backwards so file_contents has the contents of the first file by the + // end of the loop + for (i = limit; i > 0; i--) { + int n = (i - limit - 1) * -1; + if (i < limit) { + tor_snprintf(file_contents, sizeof(file_contents), + "%%include %s%d\n" + "Test %d\n", + torrc_path, i + 1, n); + } else { + tor_snprintf(file_contents, sizeof(file_contents), "Test %d\n", n); + } + + if (i > 1) { + char *file_path = NULL; + tor_asprintf(&file_path, "%s%d", torrc_path, i); + tt_int_op(write_str_to_file(file_path, file_contents, 0), OP_EQ, 0); + tor_free(file_path); + } + } + + int include_used; + tt_int_op(config_get_lines_include(file_contents, &result, 0, &include_used, + NULL), OP_EQ, 0); + tt_ptr_op(result, OP_NE, NULL); + tt_int_op(include_used, OP_EQ, 1); + + int len = 0; + config_line_t *next; + for (next = result; next != NULL; next = next->next) { + char expected[10]; + tor_snprintf(expected, sizeof(expected), "%d", len + 1); + tt_str_op(next->key, OP_EQ, "Test"); + tt_str_op(next->value, OP_EQ, expected); + len++; + } + tt_int_op(len, OP_EQ, limit); + + done: + config_free_lines(result); + tor_free(dir); + tor_free(torrc_path); +} + +static void +test_config_include_folder_order(void *data) +{ + (void)data; + + config_line_t *result = NULL; + char *torrcd = NULL; + char *path = NULL; + char *path2 = NULL; + char *dir = tor_strdup(get_fname("test_include_folder_order")); + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + tor_asprintf(&torrcd, "%s"PATH_SEPARATOR"%s", dir, "torrc.d"); + +#ifdef _WIN32 + tt_int_op(mkdir(torrcd), OP_EQ, 0); +#else + tt_int_op(mkdir(torrcd, 0700), OP_EQ, 0); +#endif + + // test that files in subfolders are ignored + tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "subfolder"); + +#ifdef _WIN32 + tt_int_op(mkdir(path), OP_EQ, 0); +#else + tt_int_op(mkdir(path, 0700), OP_EQ, 0); +#endif + + tor_asprintf(&path2, "%s"PATH_SEPARATOR"%s", path, "01_ignore"); + tt_int_op(write_str_to_file(path2, "ShouldNotSee 1\n", 0), OP_EQ, 0); + tor_free(path); + + // test that files starting with . are ignored + tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, ".dot"); + tt_int_op(write_str_to_file(path, "ShouldNotSee 2\n", 0), OP_EQ, 0); + tor_free(path); + + // test file order + tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "01_1st"); + tt_int_op(write_str_to_file(path, "Test 1\n", 0), OP_EQ, 0); + tor_free(path); + + tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "02_2nd"); + tt_int_op(write_str_to_file(path, "Test 2\n", 0), OP_EQ, 0); + tor_free(path); + + tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "aa_3rd"); + tt_int_op(write_str_to_file(path, "Test 3\n", 0), OP_EQ, 0); + tor_free(path); + + tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "ab_4th"); + tt_int_op(write_str_to_file(path, "Test 4\n", 0), OP_EQ, 0); + tor_free(path); + + char torrc_contents[1000]; + tor_snprintf(torrc_contents, sizeof(torrc_contents), + "%%include %s\n", + torrcd); + + int include_used; + tt_int_op(config_get_lines_include(torrc_contents, &result, 0, &include_used, + NULL), OP_EQ, 0); + tt_ptr_op(result, OP_NE, NULL); + tt_int_op(include_used, OP_EQ, 1); + + int len = 0; + config_line_t *next; + for (next = result; next != NULL; next = next->next) { + char expected[10]; + tor_snprintf(expected, sizeof(expected), "%d", len + 1); + tt_str_op(next->key, OP_EQ, "Test"); + tt_str_op(next->value, OP_EQ, expected); + len++; + } + tt_int_op(len, OP_EQ, 4); + + done: + config_free_lines(result); + tor_free(torrcd); + tor_free(path); + tor_free(path2); + tor_free(dir); +} + +static void +test_config_include_path_syntax(void *data) +{ + (void)data; + + config_line_t *result = NULL; + char *dir = tor_strdup(get_fname("test_include_path_syntax")); + char *esc_dir = NULL, *dir_with_pathsep = NULL, + *esc_dir_with_pathsep = NULL, *torrc_contents = NULL; + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + esc_dir = esc_for_log(dir); + tor_asprintf(&dir_with_pathsep, "%s%s", dir, PATH_SEPARATOR); + esc_dir_with_pathsep = esc_for_log(dir_with_pathsep); + + tor_asprintf(&torrc_contents, + "%%include %s\n" + "%%include %s%s \n" // space to avoid suppressing newline + "%%include %s\n", + esc_dir, + dir, PATH_SEPARATOR, + esc_dir_with_pathsep); + + int include_used; + tt_int_op(config_get_lines_include(torrc_contents, &result, 0,&include_used, + NULL), OP_EQ, 0); + tt_ptr_op(result, OP_EQ, NULL); + tt_int_op(include_used, OP_EQ, 1); + + done: + config_free_lines(result); + tor_free(dir); + tor_free(torrc_contents); + tor_free(esc_dir); + tor_free(dir_with_pathsep); + tor_free(esc_dir_with_pathsep); +} + +static void +test_config_include_not_processed(void *data) +{ + (void)data; + + char torrc_contents[1000] = "%include does_not_exist\n"; + config_line_t *result = NULL; + tt_int_op(config_get_lines(torrc_contents, &result, 0),OP_EQ, 0); + tt_ptr_op(result, OP_NE, NULL); + + int len = 0; + config_line_t *next; + for (next = result; next != NULL; next = next->next) { + tt_str_op(next->key, OP_EQ, "%include"); + tt_str_op(next->value, OP_EQ, "does_not_exist"); + len++; + } + tt_int_op(len, OP_EQ, 1); + + done: + config_free_lines(result); +} + +static void +test_config_include_has_include(void *data) +{ + (void)data; + + config_line_t *result = NULL; + char *dir = tor_strdup(get_fname("test_include_has_include")); + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + char torrc_contents[1000] = "Test 1\n"; + int include_used; + + tt_int_op(config_get_lines_include(torrc_contents, &result, 0,&include_used, + NULL), OP_EQ, 0); + tt_int_op(include_used, OP_EQ, 0); + config_free_lines(result); + + tor_snprintf(torrc_contents, sizeof(torrc_contents), "%%include %s\n", dir); + tt_int_op(config_get_lines_include(torrc_contents, &result, 0,&include_used, + NULL), OP_EQ, 0); + tt_int_op(include_used, OP_EQ, 1); + + done: + config_free_lines(result); + tor_free(dir); +} + +static void +test_config_include_flag_both_without(void *data) +{ + (void)data; + + char *errmsg = NULL; + char conf_empty[1000]; + tor_snprintf(conf_empty, sizeof(conf_empty), + "DataDirectory %s\n", + get_fname(NULL)); + // test with defaults-torrc and torrc without include + int ret = options_init_from_string(conf_empty, conf_empty, CMD_RUN_UNITTESTS, + NULL, &errmsg); + tt_int_op(ret, OP_EQ, 0); + + const or_options_t *options = get_options(); + tt_int_op(options->IncludeUsed, OP_EQ, 0); + + done: + tor_free(errmsg); +} + +static void +test_config_include_flag_torrc_only(void *data) +{ + (void)data; + + char *errmsg = NULL; + char *path = NULL; + char *dir = tor_strdup(get_fname("test_include_flag_torrc_only")); + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", dir, "dummy"); + tt_int_op(write_str_to_file(path, "\n", 0), OP_EQ, 0); + + char conf_empty[1000]; + tor_snprintf(conf_empty, sizeof(conf_empty), + "DataDirectory %s\n", + get_fname(NULL)); + char conf_include[1000]; + tor_snprintf(conf_include, sizeof(conf_include), "%%include %s", path); + + // test with defaults-torrc without include and torrc with include + int ret = options_init_from_string(conf_empty, conf_include, + CMD_RUN_UNITTESTS, NULL, &errmsg); + tt_int_op(ret, OP_EQ, 0); + + const or_options_t *options = get_options(); + tt_int_op(options->IncludeUsed, OP_EQ, 1); + + done: + tor_free(errmsg); + tor_free(path); + tor_free(dir); +} + +static void +test_config_include_flag_defaults_only(void *data) +{ + (void)data; + + char *errmsg = NULL; + char *path = NULL; + char *dir = tor_strdup(get_fname("test_include_flag_defaults_only")); + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", dir, "dummy"); + tt_int_op(write_str_to_file(path, "\n", 0), OP_EQ, 0); + + char conf_empty[1000]; + tor_snprintf(conf_empty, sizeof(conf_empty), + "DataDirectory %s\n", + get_fname(NULL)); + char conf_include[1000]; + tor_snprintf(conf_include, sizeof(conf_include), "%%include %s", path); + + // test with defaults-torrc with include and torrc without include + int ret = options_init_from_string(conf_include, conf_empty, + CMD_RUN_UNITTESTS, NULL, &errmsg); + tt_int_op(ret, OP_EQ, 0); + + const or_options_t *options = get_options(); + tt_int_op(options->IncludeUsed, OP_EQ, 0); + + done: + tor_free(errmsg); + tor_free(path); + tor_free(dir); +} + +static void +test_config_dup_and_filter(void *arg) +{ + (void)arg; + /* Test normal input. */ + config_line_t *line = NULL; + config_line_append(&line, "abc", "def"); + config_line_append(&line, "ghi", "jkl"); + config_line_append(&line, "ABCD", "mno"); + + config_line_t *line_dup = config_lines_dup_and_filter(line, "aBc"); + tt_ptr_op(line_dup, OP_NE, NULL); + tt_ptr_op(line_dup->next, OP_NE, NULL); + tt_ptr_op(line_dup->next->next, OP_EQ, NULL); + + tt_str_op(line_dup->key, OP_EQ, "abc"); + tt_str_op(line_dup->value, OP_EQ, "def"); + tt_str_op(line_dup->next->key, OP_EQ, "ABCD"); + tt_str_op(line_dup->next->value, OP_EQ, "mno"); + + /* empty output */ + config_free_lines(line_dup); + line_dup = config_lines_dup_and_filter(line, "skdjfsdkljf"); + tt_ptr_op(line_dup, OP_EQ, NULL); + + /* empty input */ + config_free_lines(line_dup); + line_dup = config_lines_dup_and_filter(NULL, "abc"); + tt_ptr_op(line_dup, OP_EQ, NULL); + + done: + config_free_lines(line); + config_free_lines(line_dup); +} + +/* If we're not configured to be a bridge, but we set + * BridgeDistribution, then options_validate () should return -1. */ +static void +test_config_check_bridge_distribution_setting_not_a_bridge(void *arg) +{ + or_options_t* options = get_options_mutable(); + or_options_t* old_options = options; + or_options_t* default_options = options; + char* message = NULL; + int ret; + + (void)arg; + + options->BridgeRelay = 0; + options->BridgeDistribution = (char*)("https"); + + ret = options_validate(old_options, options, default_options, 0, &message); + + tt_int_op(ret, OP_EQ, -1); + tt_str_op(message, OP_EQ, "You set BridgeDistribution, but you " + "didn't set BridgeRelay!"); + done: + tor_free(message); + options->BridgeDistribution = NULL; +} + +/* If the BridgeDistribution setting was valid, 0 should be returned. */ +static void +test_config_check_bridge_distribution_setting_valid(void *arg) +{ + int ret = check_bridge_distribution_setting("https"); + + (void)arg; + + tt_int_op(ret, OP_EQ, 0); + done: + return; +} + +/* If the BridgeDistribution setting was invalid, -1 should be returned. */ +static void +test_config_check_bridge_distribution_setting_invalid(void *arg) +{ + int ret = check_bridge_distribution_setting("hyphens-are-allowed"); + + (void)arg; + + tt_int_op(ret, OP_EQ, 0); + + ret = check_bridge_distribution_setting("asterisks*are*forbidden"); + + tt_int_op(ret, OP_EQ, -1); + done: + return; +} + +/* If the BridgeDistribution setting was unrecognised, a warning should be + * logged and 0 should be returned. */ +static void +test_config_check_bridge_distribution_setting_unrecognised(void *arg) +{ + int ret = check_bridge_distribution_setting("unicorn"); + + (void)arg; + + tt_int_op(ret, OP_EQ, 0); + done: + return; +} + +static void +test_config_include_opened_file_list(void *data) +{ + (void)data; + + config_line_t *result = NULL; + smartlist_t *opened_files = smartlist_new(); + char *dir = tor_strdup(get_fname("test_include_opened_file_list")); + tt_ptr_op(dir, OP_NE, NULL); + +#ifdef _WIN32 + tt_int_op(mkdir(dir), OP_EQ, 0); +#else + tt_int_op(mkdir(dir, 0700), OP_EQ, 0); +#endif + + char torrcd[PATH_MAX+1]; + tor_snprintf(torrcd, sizeof(torrcd), "%s"PATH_SEPARATOR"%s", dir, "torrc.d"); + +#ifdef _WIN32 + tt_int_op(mkdir(torrcd), OP_EQ, 0); +#else + tt_int_op(mkdir(torrcd, 0700), OP_EQ, 0); +#endif + + char subfolder[PATH_MAX+1]; + tor_snprintf(subfolder, sizeof(subfolder), "%s"PATH_SEPARATOR"%s", torrcd, + "subfolder"); + +#ifdef _WIN32 + tt_int_op(mkdir(subfolder), OP_EQ, 0); +#else + tt_int_op(mkdir(subfolder, 0700), OP_EQ, 0); +#endif + + char path[PATH_MAX+1]; + tor_snprintf(path, sizeof(path), "%s"PATH_SEPARATOR"%s", subfolder, + "01_file_in_subfolder"); + tt_int_op(write_str_to_file(path, "Test 1\n", 0), OP_EQ, 0); + + char empty[PATH_MAX+1]; + tor_snprintf(empty, sizeof(empty), "%s"PATH_SEPARATOR"%s", torrcd, "empty"); + tt_int_op(write_str_to_file(empty, "", 0), OP_EQ, 0); + + char file[PATH_MAX+1]; + tor_snprintf(file, sizeof(file), "%s"PATH_SEPARATOR"%s", torrcd, "file"); + tt_int_op(write_str_to_file(file, "Test 2\n", 0), OP_EQ, 0); + + char dot[PATH_MAX+1]; + tor_snprintf(dot, sizeof(dot), "%s"PATH_SEPARATOR"%s", torrcd, ".dot"); + tt_int_op(write_str_to_file(dot, "Test 3\n", 0), OP_EQ, 0); + + char torrc_contents[1000]; + tor_snprintf(torrc_contents, sizeof(torrc_contents), + "%%include %s\n", + torrcd); + + int include_used; + tt_int_op(config_get_lines_include(torrc_contents, &result, 0, &include_used, + opened_files), OP_EQ, 0); + tt_ptr_op(result, OP_NE, NULL); + tt_int_op(include_used, OP_EQ, 1); + + tt_int_op(smartlist_len(opened_files), OP_EQ, 4); + tt_int_op(smartlist_contains_string(opened_files, torrcd), OP_EQ, 1); + tt_int_op(smartlist_contains_string(opened_files, subfolder), OP_EQ, 1); + // files inside subfolders are not opended, only the subfolder is opened + tt_int_op(smartlist_contains_string(opened_files, empty), OP_EQ, 1); + tt_int_op(smartlist_contains_string(opened_files, file), OP_EQ, 1); + // dot files are not opened as we ignore them when we get their name from + // their parent folder + + done: + SMARTLIST_FOREACH(opened_files, char *, f, tor_free(f)); + smartlist_free(opened_files); + config_free_lines(result); + tor_free(dir); +} + +#define CONFIG_TEST(name, flags) \ + { #name, test_config_ ## name, flags, NULL, NULL } + +struct testcase_t config_tests[] = { + CONFIG_TEST(adding_trusted_dir_server, TT_FORK), + CONFIG_TEST(adding_fallback_dir_server, TT_FORK), + CONFIG_TEST(parsing_trusted_dir_server, 0), + CONFIG_TEST(parsing_fallback_dir_server, 0), + CONFIG_TEST(adding_default_trusted_dir_servers, TT_FORK), + CONFIG_TEST(adding_dir_servers, TT_FORK), + CONFIG_TEST(default_dir_servers, TT_FORK), + CONFIG_TEST(default_fallback_dirs, 0), + CONFIG_TEST(resolve_my_address, TT_FORK), + CONFIG_TEST(addressmap, 0), + CONFIG_TEST(parse_bridge_line, 0), + CONFIG_TEST(parse_transport_options_line, 0), + CONFIG_TEST(parse_transport_plugin_line, TT_FORK), + CONFIG_TEST(check_or_create_data_subdir, TT_FORK), + CONFIG_TEST(write_to_data_subdir, TT_FORK), + CONFIG_TEST(fix_my_family, 0), + CONFIG_TEST(directory_fetch, 0), + CONFIG_TEST(port_cfg_line_extract_addrport, 0), + CONFIG_TEST(parse_port_config__ports__no_ports_given, 0), + CONFIG_TEST(parse_port_config__ports__server_options, 0), + CONFIG_TEST(parse_port_config__ports__ports_given, 0), + CONFIG_TEST(parse_log_severity, 0), + CONFIG_TEST(include_limit, 0), + CONFIG_TEST(include_does_not_exist, 0), + CONFIG_TEST(include_error_in_included_file, 0), + CONFIG_TEST(include_empty_file_folder, 0), +#ifndef _WIN32 + CONFIG_TEST(include_no_permission, 0), +#endif + CONFIG_TEST(include_recursion_before_after, 0), + CONFIG_TEST(include_recursion_after_only, 0), + CONFIG_TEST(include_folder_order, 0), + CONFIG_TEST(include_path_syntax, 0), + CONFIG_TEST(include_not_processed, 0), + CONFIG_TEST(include_has_include, 0), + CONFIG_TEST(include_flag_both_without, TT_FORK), + CONFIG_TEST(include_flag_torrc_only, TT_FORK), + CONFIG_TEST(include_flag_defaults_only, TT_FORK), + CONFIG_TEST(dup_and_filter, 0), + CONFIG_TEST(check_bridge_distribution_setting_not_a_bridge, TT_FORK), + CONFIG_TEST(check_bridge_distribution_setting_valid, 0), + CONFIG_TEST(check_bridge_distribution_setting_invalid, 0), + CONFIG_TEST(check_bridge_distribution_setting_unrecognised, 0), + CONFIG_TEST(include_opened_file_list, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_connection.c b/src/wraith/src/test/test_connection.c new file mode 100644 index 000000000..314b90cfd --- /dev/null +++ b/src/wraith/src/test/test_connection.c @@ -0,0 +1,797 @@ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define CONNECTION_PRIVATE +#define MAIN_PRIVATE + +#include "or.h" +#include "test.h" + +#include "connection.h" +#include "hs_common.h" +#include "main.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "rendcache.h" +#include "directory.h" + +#include "test_connection.h" +#include "test_helpers.h" + +static void * test_conn_get_basic_setup(const struct testcase_t *tc); +static int test_conn_get_basic_teardown(const struct testcase_t *tc, + void *arg); + +static void * test_conn_get_rend_setup(const struct testcase_t *tc); +static int test_conn_get_rend_teardown(const struct testcase_t *tc, + void *arg); + +static void * test_conn_get_rsrc_setup(const struct testcase_t *tc); +static int test_conn_get_rsrc_teardown(const struct testcase_t *tc, + void *arg); + +/* Arbitrary choice - IPv4 Directory Connection to localhost */ +#define TEST_CONN_TYPE (CONN_TYPE_DIR) +/* We assume every machine has IPv4 localhost, is that ok? */ +#define TEST_CONN_ADDRESS "127.0.0.1" +#define TEST_CONN_PORT (12345) +#define TEST_CONN_ADDRESS_PORT "127.0.0.1:12345" +#define TEST_CONN_FAMILY (AF_INET) +#define TEST_CONN_STATE (DIR_CONN_STATE_MIN_) +#define TEST_CONN_ADDRESS_2 "127.0.0.2" + +#define TEST_CONN_BASIC_PURPOSE (DIR_PURPOSE_MIN_) + +#define TEST_CONN_REND_ADDR "cfs3rltphxxvabci" +#define TEST_CONN_REND_PURPOSE (DIR_PURPOSE_FETCH_RENDDESC_V2) +#define TEST_CONN_REND_PURPOSE_SUCCESSFUL (DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2) +#define TEST_CONN_REND_TYPE_2 (CONN_TYPE_AP) +#define TEST_CONN_REND_ADDR_2 "icbavxxhptlr3sfc" + +#define TEST_CONN_RSRC (networkstatus_get_flavor_name(FLAV_MICRODESC)) +#define TEST_CONN_RSRC_PURPOSE (DIR_PURPOSE_FETCH_CONSENSUS) +#define TEST_CONN_RSRC_STATE_SUCCESSFUL (DIR_CONN_STATE_CLIENT_FINISHED) +#define TEST_CONN_RSRC_2 (networkstatus_get_flavor_name(FLAV_NS)) + +#define TEST_CONN_DL_STATE (DIR_CONN_STATE_CLIENT_READING) + +/* see AP_CONN_STATE_IS_UNATTACHED() */ +#define TEST_CONN_UNATTACHED_STATE (AP_CONN_STATE_CIRCUIT_WAIT) +#define TEST_CONN_ATTACHED_STATE (AP_CONN_STATE_CONNECT_WAIT) + +void +test_conn_lookup_addr_helper(const char *address, int family, tor_addr_t *addr) +{ + int rv = 0; + + tt_assert(addr); + + rv = tor_addr_lookup(address, family, addr); + /* XXXX - should we retry on transient failure? */ + tt_int_op(rv, OP_EQ, 0); + tt_assert(tor_addr_is_loopback(addr)); + tt_assert(tor_addr_is_v4(addr)); + + return; + + done: + tor_addr_make_null(addr, TEST_CONN_FAMILY); +} + +static void * +test_conn_get_basic_setup(const struct testcase_t *tc) +{ + (void)tc; + return test_conn_get_connection(TEST_CONN_STATE, TEST_CONN_TYPE, + TEST_CONN_BASIC_PURPOSE); +} + +static int +test_conn_get_basic_teardown(const struct testcase_t *tc, void *arg) +{ + (void)tc; + connection_t *conn = arg; + + tt_assert(conn); + assert_connection_ok(conn, time(NULL)); + + /* teardown the connection as fast as possible */ + if (conn->linked_conn) { + assert_connection_ok(conn->linked_conn, time(NULL)); + + /* We didn't call tor_libevent_initialize(), so event_base was NULL, + * so we can't rely on connection_unregister_events() use of event_del(). + */ + if (conn->linked_conn->read_event) { + tor_free(conn->linked_conn->read_event); + conn->linked_conn->read_event = NULL; + } + if (conn->linked_conn->write_event) { + tor_free(conn->linked_conn->write_event); + conn->linked_conn->write_event = NULL; + } + + if (!conn->linked_conn->marked_for_close) { + connection_close_immediate(conn->linked_conn); + if (CONN_IS_EDGE(conn->linked_conn)) { + /* Suppress warnings about all the stuff we didn't do */ + TO_EDGE_CONN(conn->linked_conn)->edge_has_sent_end = 1; + TO_EDGE_CONN(conn->linked_conn)->end_reason = + END_STREAM_REASON_INTERNAL; + if (conn->linked_conn->type == CONN_TYPE_AP) { + TO_ENTRY_CONN(conn->linked_conn)->socks_request->has_finished = 1; + } + } + connection_mark_for_close(conn->linked_conn); + } + + close_closeable_connections(); + } + + /* We didn't set the events up properly, so we can't use event_del() in + * close_closeable_connections() > connection_free() + * > connection_unregister_events() */ + if (conn->read_event) { + tor_free(conn->read_event); + conn->read_event = NULL; + } + if (conn->write_event) { + tor_free(conn->write_event); + conn->write_event = NULL; + } + + if (!conn->marked_for_close) { + connection_close_immediate(conn); + if (CONN_IS_EDGE(conn)) { + /* Suppress warnings about all the stuff we didn't do */ + TO_EDGE_CONN(conn)->edge_has_sent_end = 1; + TO_EDGE_CONN(conn)->end_reason = END_STREAM_REASON_INTERNAL; + if (conn->type == CONN_TYPE_AP) { + TO_ENTRY_CONN(conn)->socks_request->has_finished = 1; + } + } + connection_mark_for_close(conn); + } + + close_closeable_connections(); + + /* The unit test will fail if we return 0 */ + return 1; + + /* When conn == NULL, we can't cleanup anything */ + done: + return 0; +} + +static void * +test_conn_get_rend_setup(const struct testcase_t *tc) +{ + dir_connection_t *conn = DOWNCAST(dir_connection_t, + test_conn_get_connection( + TEST_CONN_STATE, + TEST_CONN_TYPE, + TEST_CONN_REND_PURPOSE)); + tt_assert(conn); + assert_connection_ok(&conn->base_, time(NULL)); + + rend_cache_init(); + + /* TODO: use directory_initiate_request() to do this - maybe? */ + tor_assert(strlen(TEST_CONN_REND_ADDR) == REND_SERVICE_ID_LEN_BASE32); + conn->rend_data = rend_data_client_create(TEST_CONN_REND_ADDR, NULL, NULL, + REND_NO_AUTH); + assert_connection_ok(&conn->base_, time(NULL)); + return conn; + + /* On failure */ + done: + test_conn_get_rend_teardown(tc, conn); + /* Returning NULL causes the unit test to fail */ + return NULL; +} + +static int +test_conn_get_rend_teardown(const struct testcase_t *tc, void *arg) +{ + dir_connection_t *conn = DOWNCAST(dir_connection_t, arg); + int rv = 0; + + tt_assert(conn); + assert_connection_ok(&conn->base_, time(NULL)); + + /* avoid a last-ditch attempt to refetch the descriptor */ + conn->base_.purpose = TEST_CONN_REND_PURPOSE_SUCCESSFUL; + + /* connection_free_() cleans up rend_data */ + rv = test_conn_get_basic_teardown(tc, arg); + done: + rend_cache_free_all(); + return rv; +} + +static dir_connection_t * +test_conn_download_status_add_a_connection(const char *resource) +{ + dir_connection_t *conn = DOWNCAST(dir_connection_t, + test_conn_get_connection( + TEST_CONN_STATE, + TEST_CONN_TYPE, + TEST_CONN_RSRC_PURPOSE)); + + tt_assert(conn); + assert_connection_ok(&conn->base_, time(NULL)); + + /* Replace the existing resource with the one we want */ + if (resource) { + if (conn->requested_resource) { + tor_free(conn->requested_resource); + } + conn->requested_resource = tor_strdup(resource); + assert_connection_ok(&conn->base_, time(NULL)); + } + + return conn; + + done: + test_conn_get_rsrc_teardown(NULL, conn); + return NULL; +} + +static void * +test_conn_get_rsrc_setup(const struct testcase_t *tc) +{ + (void)tc; + return test_conn_download_status_add_a_connection(TEST_CONN_RSRC); +} + +static int +test_conn_get_rsrc_teardown(const struct testcase_t *tc, void *arg) +{ + int rv = 0; + + connection_t *conn = (connection_t *)arg; + tt_assert(conn); + assert_connection_ok(conn, time(NULL)); + + if (conn->type == CONN_TYPE_DIR) { + dir_connection_t *dir_conn = DOWNCAST(dir_connection_t, arg); + + tt_assert(dir_conn); + assert_connection_ok(&dir_conn->base_, time(NULL)); + + /* avoid a last-ditch attempt to refetch the consensus */ + dir_conn->base_.state = TEST_CONN_RSRC_STATE_SUCCESSFUL; + assert_connection_ok(&dir_conn->base_, time(NULL)); + } + + /* connection_free_() cleans up requested_resource */ + rv = test_conn_get_basic_teardown(tc, conn); + + done: + return rv; +} + +static void * +test_conn_download_status_setup(const struct testcase_t *tc) +{ + return (void*)tc; +} + +static int +test_conn_download_status_teardown(const struct testcase_t *tc, void *arg) +{ + (void)arg; + int rv = 0; + + /* Ignore arg, and just loop through the connection array */ + SMARTLIST_FOREACH_BEGIN(get_connection_array(), connection_t *, conn) { + if (conn) { + assert_connection_ok(conn, time(NULL)); + + /* connection_free_() cleans up requested_resource */ + rv = test_conn_get_rsrc_teardown(tc, conn); + tt_int_op(rv, OP_EQ, 1); + } + } SMARTLIST_FOREACH_END(conn); + + done: + return rv; +} + +/* Like connection_ap_make_link(), but does much less */ +static connection_t * +test_conn_get_linked_connection(connection_t *l_conn, uint8_t state) +{ + tt_assert(l_conn); + assert_connection_ok(l_conn, time(NULL)); + + /* AP connections don't seem to have purposes */ + connection_t *conn = test_conn_get_connection(state, CONN_TYPE_AP, + 0); + + tt_assert(conn); + assert_connection_ok(conn, time(NULL)); + + conn->linked = 1; + l_conn->linked = 1; + conn->linked_conn = l_conn; + l_conn->linked_conn = conn; + /* we never opened a real socket, so we can just overwrite it */ + conn->s = TOR_INVALID_SOCKET; + l_conn->s = TOR_INVALID_SOCKET; + + assert_connection_ok(conn, time(NULL)); + assert_connection_ok(l_conn, time(NULL)); + + return conn; + + done: + test_conn_download_status_teardown(NULL, NULL); + return NULL; +} + +static struct testcase_setup_t test_conn_get_basic_st = { + test_conn_get_basic_setup, test_conn_get_basic_teardown +}; + +static struct testcase_setup_t test_conn_get_rend_st = { + test_conn_get_rend_setup, test_conn_get_rend_teardown +}; + +static struct testcase_setup_t test_conn_get_rsrc_st = { + test_conn_get_rsrc_setup, test_conn_get_rsrc_teardown +}; + +static struct testcase_setup_t test_conn_download_status_st = { + test_conn_download_status_setup, test_conn_download_status_teardown +}; + +static void +test_conn_get_basic(void *arg) +{ + connection_t *conn = (connection_t*)arg; + tor_addr_t addr, addr2; + + tt_assert(conn); + assert_connection_ok(conn, time(NULL)); + + test_conn_lookup_addr_helper(TEST_CONN_ADDRESS, TEST_CONN_FAMILY, &addr); + tt_assert(!tor_addr_is_null(&addr)); + test_conn_lookup_addr_helper(TEST_CONN_ADDRESS_2, TEST_CONN_FAMILY, &addr2); + tt_assert(!tor_addr_is_null(&addr2)); + + /* Check that we get this connection back when we search for it by + * its attributes, but get NULL when we supply a different value. */ + + tt_assert(connection_get_by_global_id(conn->global_identifier) == conn); + tt_ptr_op(connection_get_by_global_id(!conn->global_identifier), OP_EQ, + NULL); + + tt_assert(connection_get_by_type(conn->type) == conn); + tt_assert(connection_get_by_type(TEST_CONN_TYPE) == conn); + tt_ptr_op(connection_get_by_type(!conn->type), OP_EQ, NULL); + tt_ptr_op(connection_get_by_type(!TEST_CONN_TYPE), OP_EQ, NULL); + + tt_assert(connection_get_by_type_state(conn->type, conn->state) + == conn); + tt_assert(connection_get_by_type_state(TEST_CONN_TYPE, TEST_CONN_STATE) + == conn); + tt_assert(connection_get_by_type_state(!conn->type, !conn->state) + == NULL); + tt_assert(connection_get_by_type_state(!TEST_CONN_TYPE, !TEST_CONN_STATE) + == NULL); + + /* Match on the connection fields themselves */ + tt_assert(connection_get_by_type_addr_port_purpose(conn->type, + &conn->addr, + conn->port, + conn->purpose) + == conn); + /* Match on the original inputs to the connection */ + tt_assert(connection_get_by_type_addr_port_purpose(TEST_CONN_TYPE, + &conn->addr, + conn->port, + conn->purpose) + == conn); + tt_assert(connection_get_by_type_addr_port_purpose(conn->type, + &addr, + conn->port, + conn->purpose) + == conn); + tt_assert(connection_get_by_type_addr_port_purpose(conn->type, + &conn->addr, + TEST_CONN_PORT, + conn->purpose) + == conn); + tt_assert(connection_get_by_type_addr_port_purpose(conn->type, + &conn->addr, + conn->port, + TEST_CONN_BASIC_PURPOSE) + == conn); + tt_assert(connection_get_by_type_addr_port_purpose(TEST_CONN_TYPE, + &addr, + TEST_CONN_PORT, + TEST_CONN_BASIC_PURPOSE) + == conn); + /* Then try each of the not-matching combinations */ + tt_assert(connection_get_by_type_addr_port_purpose(!conn->type, + &conn->addr, + conn->port, + conn->purpose) + == NULL); + tt_assert(connection_get_by_type_addr_port_purpose(conn->type, + &addr2, + conn->port, + conn->purpose) + == NULL); + tt_assert(connection_get_by_type_addr_port_purpose(conn->type, + &conn->addr, + !conn->port, + conn->purpose) + == NULL); + tt_assert(connection_get_by_type_addr_port_purpose(conn->type, + &conn->addr, + conn->port, + !conn->purpose) + == NULL); + /* Then try everything not-matching */ + tt_assert(connection_get_by_type_addr_port_purpose(!conn->type, + &addr2, + !conn->port, + !conn->purpose) + == NULL); + tt_assert(connection_get_by_type_addr_port_purpose(!TEST_CONN_TYPE, + &addr2, + !TEST_CONN_PORT, + !TEST_CONN_BASIC_PURPOSE) + == NULL); + + done: + ; +} + +static void +test_conn_get_rend(void *arg) +{ + dir_connection_t *conn = DOWNCAST(dir_connection_t, arg); + tt_assert(conn); + assert_connection_ok(&conn->base_, time(NULL)); + + tt_assert(connection_get_by_type_state_rendquery( + conn->base_.type, + conn->base_.state, + rend_data_get_address( + conn->rend_data)) + == TO_CONN(conn)); + tt_assert(connection_get_by_type_state_rendquery( + TEST_CONN_TYPE, + TEST_CONN_STATE, + TEST_CONN_REND_ADDR) + == TO_CONN(conn)); + tt_assert(connection_get_by_type_state_rendquery(TEST_CONN_REND_TYPE_2, + !conn->base_.state, + "") + == NULL); + tt_assert(connection_get_by_type_state_rendquery(TEST_CONN_REND_TYPE_2, + !TEST_CONN_STATE, + TEST_CONN_REND_ADDR_2) + == NULL); + + done: + ; +} + +#define sl_is_conn_assert(sl_input, conn) \ + do { \ + the_sl = (sl_input); \ + tt_int_op(smartlist_len((the_sl)), OP_EQ, 1); \ + tt_assert(smartlist_get((the_sl), 0) == (conn)); \ + smartlist_free(the_sl); the_sl = NULL; \ + } while (0) + +#define sl_no_conn_assert(sl_input) \ + do { \ + the_sl = (sl_input); \ + tt_int_op(smartlist_len((the_sl)), OP_EQ, 0); \ + smartlist_free(the_sl); the_sl = NULL; \ + } while (0) + +static void +test_conn_get_rsrc(void *arg) +{ + dir_connection_t *conn = DOWNCAST(dir_connection_t, arg); + smartlist_t *the_sl = NULL; + tt_assert(conn); + assert_connection_ok(&conn->base_, time(NULL)); + + sl_is_conn_assert(connection_dir_list_by_purpose_and_resource( + conn->base_.purpose, + conn->requested_resource), + conn); + sl_is_conn_assert(connection_dir_list_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, + TEST_CONN_RSRC), + conn); + sl_no_conn_assert(connection_dir_list_by_purpose_and_resource( + !conn->base_.purpose, + "")); + sl_no_conn_assert(connection_dir_list_by_purpose_and_resource( + !TEST_CONN_RSRC_PURPOSE, + TEST_CONN_RSRC_2)); + + sl_is_conn_assert(connection_dir_list_by_purpose_resource_and_state( + conn->base_.purpose, + conn->requested_resource, + conn->base_.state), + conn); + sl_is_conn_assert(connection_dir_list_by_purpose_resource_and_state( + TEST_CONN_RSRC_PURPOSE, + TEST_CONN_RSRC, + TEST_CONN_STATE), + conn); + sl_no_conn_assert(connection_dir_list_by_purpose_resource_and_state( + !conn->base_.purpose, + "", + !conn->base_.state)); + sl_no_conn_assert(connection_dir_list_by_purpose_resource_and_state( + !TEST_CONN_RSRC_PURPOSE, + TEST_CONN_RSRC_2, + !TEST_CONN_STATE)); + + tt_int_op(connection_dir_count_by_purpose_and_resource( + conn->base_.purpose, conn->requested_resource), + OP_EQ, 1); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC), + OP_EQ, 1); + tt_int_op(connection_dir_count_by_purpose_and_resource( + !conn->base_.purpose, ""), + OP_EQ, 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + !TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC_2), + OP_EQ, 0); + + tt_int_op(connection_dir_count_by_purpose_resource_and_state( + conn->base_.purpose, conn->requested_resource, + conn->base_.state), + OP_EQ, 1); + tt_int_op(connection_dir_count_by_purpose_resource_and_state( + TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC, TEST_CONN_STATE), + OP_EQ, 1); + tt_int_op(connection_dir_count_by_purpose_resource_and_state( + !conn->base_.purpose, "", !conn->base_.state), + OP_EQ, 0); + tt_int_op(connection_dir_count_by_purpose_resource_and_state( + !TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC_2, !TEST_CONN_STATE), + OP_EQ, 0); + + done: + smartlist_free(the_sl); +} + +static void +test_conn_download_status(void *arg) +{ + dir_connection_t *conn = NULL; + dir_connection_t *conn2 = NULL; + dir_connection_t *conn4 = NULL; + connection_t *ap_conn = NULL; + + const struct testcase_t *tc = arg; + consensus_flavor_t usable_flavor = (consensus_flavor_t)tc->setup_data; + + /* The "other flavor" trick only works if there are two flavors */ + tor_assert(N_CONSENSUS_FLAVORS == 2); + consensus_flavor_t other_flavor = ((usable_flavor == FLAV_NS) + ? FLAV_MICRODESC + : FLAV_NS); + const char *res = networkstatus_get_flavor_name(usable_flavor); + const char *other_res = networkstatus_get_flavor_name(other_flavor); + + /* no connections */ + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + + /* one connection, not downloading */ + conn = test_conn_download_status_add_a_connection(res); + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 1); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + + /* one connection, downloading but not linked (not possible on a client, + * but possible on a relay) */ + conn->base_.state = TEST_CONN_DL_STATE; + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 1); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + + /* one connection, downloading and linked, but not yet attached */ + ap_conn = test_conn_get_linked_connection(TO_CONN(conn), + TEST_CONN_UNATTACHED_STATE); + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 1); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + + /* one connection, downloading and linked and attached */ + ap_conn->state = TEST_CONN_ATTACHED_STATE; + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 1); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + + /* one connection, linked and attached but not downloading */ + conn->base_.state = TEST_CONN_STATE; + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 1); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + + /* two connections, both not downloading */ + conn2 = test_conn_download_status_add_a_connection(res); + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 2); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + + /* two connections, one downloading */ + conn->base_.state = TEST_CONN_DL_STATE; + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 2); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + conn->base_.state = TEST_CONN_STATE; + + /* more connections, all not downloading */ + /* ignore the return value, it's free'd using the connection list */ + (void)test_conn_download_status_add_a_connection(res); + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 3); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + + /* more connections, one downloading */ + conn->base_.state = TEST_CONN_DL_STATE; + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 3); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + + /* more connections, two downloading (should never happen, but needs + * to be tested for completeness) */ + conn2->base_.state = TEST_CONN_DL_STATE; + /* ignore the return value, it's free'd using the connection list */ + (void)test_conn_get_linked_connection(TO_CONN(conn2), + TEST_CONN_ATTACHED_STATE); + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 3); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + conn->base_.state = TEST_CONN_STATE; + + /* more connections, a different one downloading */ + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 3); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 0); + + /* a connection for the other flavor (could happen if a client is set to + * cache directory documents), one preferred flavor downloading + */ + conn4 = test_conn_download_status_add_a_connection(other_res); + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 0); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 3); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 1); + + /* a connection for the other flavor (could happen if a client is set to + * cache directory documents), both flavors downloading + */ + conn4->base_.state = TEST_CONN_DL_STATE; + /* ignore the return value, it's free'd using the connection list */ + (void)test_conn_get_linked_connection(TO_CONN(conn4), + TEST_CONN_ATTACHED_STATE); + tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); + tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, + 1); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, res), + OP_EQ, 3); + tt_int_op(connection_dir_count_by_purpose_and_resource( + TEST_CONN_RSRC_PURPOSE, other_res), + OP_EQ, 1); + + done: + /* the teardown function removes all the connections in the global list*/; +} + +#define CONNECTION_TESTCASE(name, fork, setup) \ + { #name, test_conn_##name, fork, &setup, NULL } + +/* where arg is an expression (constant, varaible, compound expression) */ +#define CONNECTION_TESTCASE_ARG(name, fork, setup, arg) \ + { #name "_" #arg, test_conn_##name, fork, &setup, (void *)arg } + +struct testcase_t connection_tests[] = { + CONNECTION_TESTCASE(get_basic, TT_FORK, test_conn_get_basic_st), + CONNECTION_TESTCASE(get_rend, TT_FORK, test_conn_get_rend_st), + CONNECTION_TESTCASE(get_rsrc, TT_FORK, test_conn_get_rsrc_st), + CONNECTION_TESTCASE_ARG(download_status, TT_FORK, + test_conn_download_status_st, FLAV_MICRODESC), + CONNECTION_TESTCASE_ARG(download_status, TT_FORK, + test_conn_download_status_st, FLAV_NS), +//CONNECTION_TESTCASE(func_suffix, TT_FORK, setup_func_pair), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_connection.h b/src/wraith/src/test/test_connection.h new file mode 100644 index 000000000..392783b53 --- /dev/null +++ b/src/wraith/src/test/test_connection.h @@ -0,0 +1,13 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** Some constants used by test_connection and helpers */ +#define TEST_CONN_FAMILY (AF_INET) +#define TEST_CONN_ADDRESS "127.0.0.1" +#define TEST_CONN_PORT (12345) +#define TEST_CONN_ADDRESS_PORT "127.0.0.1:12345" +#define TEST_CONN_FD_INIT 50 + +void test_conn_lookup_addr_helper(const char *address, + int family, tor_addr_t *addr); + diff --git a/src/wraith/src/test/test_conscache.c b/src/wraith/src/test/test_conscache.c new file mode 100644 index 000000000..ffec3149b --- /dev/null +++ b/src/wraith/src/test/test_conscache.c @@ -0,0 +1,340 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "config.h" +#include "conscache.h" +#include "test.h" + +#ifdef HAVE_UTIME_H +#include +#endif + +static void +test_conscache_open_failure(void *arg) +{ + (void) arg; + /* Try opening a directory that doesn't exist and which we shouldn't be + * able to create. */ + consensus_cache_t *cache = consensus_cache_open("a/b/c/d/e/f/g", 128); + tt_ptr_op(cache, OP_EQ, NULL); + + done: + ; +} + +static void +test_conscache_simple_usage(void *arg) +{ + (void)arg; + consensus_cache_entry_t *ent = NULL, *ent2 = NULL; + + /* Make a temporary datadir for these tests */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); + tor_free(get_options_mutable()->CacheDirectory); + get_options_mutable()->CacheDirectory = tor_strdup(ddir_fname); + check_private_dir(ddir_fname, CPD_CREATE, NULL); + consensus_cache_t *cache = consensus_cache_open("cons", 128); + + tt_assert(cache); + + /* Create object; make sure it exists. */ + config_line_t *labels = NULL; + config_line_append(&labels, "Hello", "world"); + config_line_append(&labels, "Adios", "planetas"); + ent = consensus_cache_add(cache, + labels, (const uint8_t *)"A\0B\0C", 5); + config_free_lines(labels); + labels = NULL; + tt_assert(ent); + + /* Make a second object */ + config_line_append(&labels, "Hello", "mundo"); + config_line_append(&labels, "Adios", "planets"); + ent2 = consensus_cache_add(cache, + labels, (const uint8_t *)"xyzzy", 5); + config_free_lines(labels); + labels = NULL; + tt_assert(ent2); + tt_assert(! consensus_cache_entry_is_mapped(ent2)); + consensus_cache_entry_decref(ent2); + ent2 = NULL; + + /* Check get_value */ + tt_ptr_op(NULL, OP_EQ, consensus_cache_entry_get_value(ent, "hebbo")); + tt_str_op("world", OP_EQ, consensus_cache_entry_get_value(ent, "Hello")); + + /* Check find_first */ + ent2 = consensus_cache_find_first(cache, "Hello", "world!"); + tt_ptr_op(ent2, OP_EQ, NULL); + ent2 = consensus_cache_find_first(cache, "Hello", "world"); + tt_ptr_op(ent2, OP_EQ, ent); + ent2 = consensus_cache_find_first(cache, "Hello", "mundo"); + tt_ptr_op(ent2, OP_NE, ent); + + tt_assert(! consensus_cache_entry_is_mapped(ent)); + + /* Check get_body */ + const uint8_t *bp = NULL; + size_t sz = 0; + int r = consensus_cache_entry_get_body(ent, &bp, &sz); + tt_int_op(r, OP_EQ, 0); + tt_u64_op(sz, OP_EQ, 5); + tt_mem_op(bp, OP_EQ, "A\0B\0C", 5); + tt_assert(consensus_cache_entry_is_mapped(ent)); + + /* Free and re-create the cache, to rescan the directory. */ + consensus_cache_free(cache); + consensus_cache_entry_decref(ent); + cache = consensus_cache_open("cons", 128); + + /* Make sure the entry is still there */ + ent = consensus_cache_find_first(cache, "Hello", "mundo"); + tt_assert(ent); + ent2 = consensus_cache_find_first(cache, "Adios", "planets"); + tt_ptr_op(ent, OP_EQ, ent2); + consensus_cache_entry_incref(ent); + tt_assert(! consensus_cache_entry_is_mapped(ent)); + r = consensus_cache_entry_get_body(ent, &bp, &sz); + tt_int_op(r, OP_EQ, 0); + tt_u64_op(sz, OP_EQ, 5); + tt_mem_op(bp, OP_EQ, "xyzzy", 5); + tt_assert(consensus_cache_entry_is_mapped(ent)); + + /* There should be two entries total. */ + smartlist_t *entries = smartlist_new(); + consensus_cache_find_all(entries, cache, NULL, NULL); + int n = smartlist_len(entries); + smartlist_free(entries); + tt_int_op(n, OP_EQ, 2); + + done: + consensus_cache_entry_decref(ent); + tor_free(ddir_fname); + consensus_cache_free(cache); +} + +static void +test_conscache_cleanup(void *arg) +{ + (void)arg; + const int N = 20; + consensus_cache_entry_t **ents = + tor_calloc(N, sizeof(consensus_cache_entry_t*)); + + /* Make a temporary datadir for these tests */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); + tor_free(get_options_mutable()->CacheDirectory); + get_options_mutable()->CacheDirectory = tor_strdup(ddir_fname); + check_private_dir(ddir_fname, CPD_CREATE, NULL); + consensus_cache_t *cache = consensus_cache_open("cons", 128); + + tt_assert(cache); + + /* Create a bunch of entries. */ + int i; + for (i = 0; i < N; ++i) { + config_line_t *labels = NULL; + char num[8]; + tor_snprintf(num, sizeof(num), "%d", i); + config_line_append(&labels, "test-id", "cleanup"); + config_line_append(&labels, "index", num); + size_t bodylen = i * 3; + uint8_t *body = tor_malloc(bodylen); + memset(body, i, bodylen); + ents[i] = consensus_cache_add(cache, labels, body, bodylen); + tor_free(body); + config_free_lines(labels); + tt_assert(ents[i]); + /* We're still holding a reference to each entry at this point. */ + } + + /* Page all of the entries into RAM */ + for (i = 0; i < N; ++i) { + const uint8_t *bp; + size_t sz; + tt_assert(! consensus_cache_entry_is_mapped(ents[i])); + consensus_cache_entry_get_body(ents[i], &bp, &sz); + tt_assert(consensus_cache_entry_is_mapped(ents[i])); + } + + /* Mark some of the entries as deletable. */ + for (i = 7; i < N; i += 7) { + consensus_cache_entry_mark_for_removal(ents[i]); + tt_assert(consensus_cache_entry_is_mapped(ents[i])); + } + + /* Mark some of the entries as aggressively unpaged. */ + for (i = 3; i < N; i += 3) { + consensus_cache_entry_mark_for_aggressive_release(ents[i]); + tt_assert(consensus_cache_entry_is_mapped(ents[i])); + } + + /* Incref some of the entries again */ + for (i = 0; i < N; i += 2) { + consensus_cache_entry_incref(ents[i]); + } + + /* Now we're going to decref everything. We do so at a specific time. I'm + * picking the moment when I was writing this test, at 2017-04-05 12:16:48 + * UTC. */ + const time_t example_time = 1491394608; + update_approx_time(example_time); + for (i = 0; i < N; ++i) { + consensus_cache_entry_decref(ents[i]); + if (i % 2) { + ents[i] = NULL; /* We're no longer holding any reference here. */ + } + } + + /* At this point, the aggressively-released items with refcount 1 should + * be unmapped. Nothing should be deleted. */ + consensus_cache_entry_t *e_tmp; + e_tmp = consensus_cache_find_first(cache, "index", "3"); + tt_assert(e_tmp); + tt_assert(! consensus_cache_entry_is_mapped(e_tmp)); + e_tmp = consensus_cache_find_first(cache, "index", "5"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + e_tmp = consensus_cache_find_first(cache, "index", "6"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + e_tmp = consensus_cache_find_first(cache, "index", "7"); + tt_ptr_op(e_tmp, OP_EQ, NULL); // not found because pending deletion. + + /* Delete the pending-deletion items. */ + consensus_cache_delete_pending(cache, 0); + { + smartlist_t *entries = smartlist_new(); + consensus_cache_find_all(entries, cache, NULL, NULL); + int n = smartlist_len(entries); + smartlist_free(entries); + tt_int_op(n, OP_EQ, 20 - 2); /* 1 entry was deleted; 1 is not-found. */ + } + e_tmp = consensus_cache_find_first(cache, "index", "7"); // refcnt == 1... + tt_ptr_op(e_tmp, OP_EQ, NULL); // so deleted. + e_tmp = consensus_cache_find_first(cache, "index", "14"); // refcnt == 2 + tt_ptr_op(e_tmp, OP_EQ, NULL); // not deleted; but not found. + + /* Now do lazy unmapping. */ + // should do nothing. + consensus_cache_unmap_lazy(cache, example_time - 10); + e_tmp = consensus_cache_find_first(cache, "index", "11"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + // should actually unmap + consensus_cache_unmap_lazy(cache, example_time + 10); + e_tmp = consensus_cache_find_first(cache, "index", "11"); + tt_assert(e_tmp); + tt_assert(! consensus_cache_entry_is_mapped(e_tmp)); + // This one will still be mapped, since it has a reference. + e_tmp = consensus_cache_find_first(cache, "index", "16"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + + for (i = 0; i < N; ++i) { + consensus_cache_entry_decref(ents[i]); + ents[i] = NULL; + } + + /* Free and re-create the cache, to rescan the directory. Make sure the + * deleted thing is still deleted, along with the other deleted thing. */ + consensus_cache_free(cache); + cache = consensus_cache_open("cons", 128); + { + smartlist_t *entries = smartlist_new(); + consensus_cache_find_all(entries, cache, NULL, NULL); + int n = smartlist_len(entries); + smartlist_free(entries); + tt_int_op(n, OP_EQ, 18); + } + + done: + for (i = 0; i < N; ++i) { + consensus_cache_entry_decref(ents[i]); + } + tor_free(ents); + tor_free(ddir_fname); + consensus_cache_free(cache); +} + +static void +test_conscache_filter(void *arg) +{ + (void)arg; + const int N = 30; + smartlist_t *lst = NULL; + + /* Make a temporary datadir for these tests */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); + tor_free(get_options_mutable()->CacheDirectory); + get_options_mutable()->CacheDirectory = tor_strdup(ddir_fname); + check_private_dir(ddir_fname, CPD_CREATE, NULL); + consensus_cache_t *cache = consensus_cache_open("cons", 128); + + tt_assert(cache); + + /* Create a bunch of entries with different labels */ + int i; + for (i = 0; i < N; ++i) { + config_line_t *labels = NULL; + char num[8]; + tor_snprintf(num, sizeof(num), "%d", i); + config_line_append(&labels, "test-id", "filter"); + config_line_append(&labels, "index", num); + tor_snprintf(num, sizeof(num), "%d", i % 3); + config_line_append(&labels, "mod3", num); + tor_snprintf(num, sizeof(num), "%d", i % 5); + config_line_append(&labels, "mod5", num); + + size_t bodylen = i * 3; + uint8_t *body = tor_malloc(bodylen); + memset(body, i, bodylen); + consensus_cache_entry_t *ent = + consensus_cache_add(cache, labels, body, bodylen); + tor_free(body); + config_free_lines(labels); + tt_assert(ent); + consensus_cache_entry_decref(ent); + } + + lst = smartlist_new(); + /* Find nothing. */ + consensus_cache_find_all(lst, cache, "mod5", "5"); + tt_int_op(smartlist_len(lst), OP_EQ, 0); + /* Find everything. */ + consensus_cache_find_all(lst, cache, "test-id", "filter"); + tt_int_op(smartlist_len(lst), OP_EQ, N); + + /* Now filter to find the entries that have i%3 == 1 */ + consensus_cache_filter_list(lst, "mod3", "1"); + tt_int_op(smartlist_len(lst), OP_EQ, 10); + /* Now filter to find the entries that also have i%5 == 3 */ + consensus_cache_filter_list(lst, "mod5", "3"); + tt_int_op(smartlist_len(lst), OP_EQ, 2); + /* So now we have those entries for which i%15 == 13. */ + + consensus_cache_entry_t *ent1 = smartlist_get(lst, 0); + consensus_cache_entry_t *ent2 = smartlist_get(lst, 1); + const char *idx1 = consensus_cache_entry_get_value(ent1, "index"); + const char *idx2 = consensus_cache_entry_get_value(ent2, "index"); + tt_assert( (!strcmp(idx1, "28") && !strcmp(idx2, "13")) || + (!strcmp(idx1, "13") && !strcmp(idx2, "28")) ); + + done: + tor_free(ddir_fname); + consensus_cache_free(cache); + smartlist_free(lst); +} + +#define ENT(name) \ + { #name, test_conscache_ ## name, TT_FORK, NULL, NULL } + +struct testcase_t conscache_tests[] = { + ENT(open_failure), + ENT(simple_usage), + ENT(cleanup), + ENT(filter), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_consdiff.c b/src/wraith/src/test/test_consdiff.c new file mode 100644 index 000000000..fda3a7f18 --- /dev/null +++ b/src/wraith/src/test/test_consdiff.c @@ -0,0 +1,1185 @@ +/* Copyright (c) 2014, Daniel Martí + * Copyright (c) 2014, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFF_PRIVATE + +#include "or.h" +#include "test.h" + +#include "consdiff.h" +#include "memarea.h" +#include "log_test_helpers.h" + +#define tt_str_eq_line(a,b) \ + tt_assert(line_str_eq((b),(a))) + +static void +test_consdiff_smartlist_slice(void *arg) +{ + smartlist_t *sl = smartlist_new(); + smartlist_slice_t *sls; + int items[6] = {0,0,0,0,0,0}; + + /* Create a regular smartlist. */ + (void)arg; + smartlist_add(sl, &items[1]); + smartlist_add(sl, &items[2]); + smartlist_add(sl, &items[3]); + smartlist_add(sl, &items[4]); + smartlist_add(sl, &items[5]); + + /* See if the slice was done correctly. */ + sls = smartlist_slice(sl, 2, 5); + tt_ptr_op(sl, OP_EQ, sls->list); + tt_ptr_op(&items[3], OP_EQ, smartlist_get(sls->list, sls->offset)); + tt_ptr_op(&items[5], OP_EQ, + smartlist_get(sls->list, sls->offset + (sls->len-1))); + tor_free(sls); + + /* See that using -1 as the end does get to the last element. */ + sls = smartlist_slice(sl, 2, -1); + tt_ptr_op(sl, OP_EQ, sls->list); + tt_ptr_op(&items[3], OP_EQ, smartlist_get(sls->list, sls->offset)); + tt_ptr_op(&items[5], OP_EQ, + smartlist_get(sls->list, sls->offset + (sls->len-1))); + + done: + tor_free(sls); + smartlist_free(sl); +} + +static void +test_consdiff_smartlist_slice_string_pos(void *arg) +{ + smartlist_t *sl = smartlist_new(); + smartlist_slice_t *sls; + memarea_t *area = memarea_new(); + + /* Create a regular smartlist. */ + (void)arg; + consensus_split_lines(sl, "a\nd\nc\na\nb\n", area); + + /* See that smartlist_slice_string_pos respects the bounds of the slice. */ + sls = smartlist_slice(sl, 2, 5); + cdline_t a_line = { "a", 1 }; + tt_int_op(3, OP_EQ, smartlist_slice_string_pos(sls, &a_line)); + cdline_t d_line = { "d", 1 }; + tt_int_op(-1, OP_EQ, smartlist_slice_string_pos(sls, &d_line)); + + done: + tor_free(sls); + smartlist_free(sl); + memarea_drop_all(area); +} + +static void +test_consdiff_lcs_lengths(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + smartlist_slice_t *sls1, *sls2; + int *lengths1, *lengths2; + memarea_t *area = memarea_new(); + + /* Expected lcs lengths in regular and reverse order. */ + int e_lengths1[] = { 0, 1, 2, 3, 3, 4 }; + int e_lengths2[] = { 0, 1, 1, 2, 3, 4 }; + + (void)arg; + consensus_split_lines(sl1, "a\nb\nc\nd\ne\n", area); + consensus_split_lines(sl2, "a\nc\nd\ni\ne\n", area); + + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + + lengths1 = lcs_lengths(sls1, sls2, 1); + lengths2 = lcs_lengths(sls1, sls2, -1); + tt_mem_op(e_lengths1, OP_EQ, lengths1, sizeof(int) * 6); + tt_mem_op(e_lengths2, OP_EQ, lengths2, sizeof(int) * 6); + + done: + tor_free(lengths1); + tor_free(lengths2); + tor_free(sls1); + tor_free(sls2); + smartlist_free(sl1); + smartlist_free(sl2); + memarea_drop_all(area); +} + +static void +test_consdiff_trim_slices(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + smartlist_t *sl3 = smartlist_new(); + smartlist_t *sl4 = smartlist_new(); + smartlist_slice_t *sls1, *sls2, *sls3, *sls4; + memarea_t *area = memarea_new(); + + (void)arg; + consensus_split_lines(sl1, "a\nb\nb\nb\nd\n", area); + consensus_split_lines(sl2, "a\nc\nc\nc\nd\n", area); + consensus_split_lines(sl3, "a\nb\nb\nb\na\n", area); + consensus_split_lines(sl4, "c\nb\nb\nb\nc\n", area); + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + sls3 = smartlist_slice(sl3, 0, -1); + sls4 = smartlist_slice(sl4, 0, -1); + + /* They should be trimmed by one line at each end. */ + tt_int_op(5, OP_EQ, sls1->len); + tt_int_op(5, OP_EQ, sls2->len); + trim_slices(sls1, sls2); + tt_int_op(3, OP_EQ, sls1->len); + tt_int_op(3, OP_EQ, sls2->len); + + /* They should not be trimmed at all. */ + tt_int_op(5, OP_EQ, sls3->len); + tt_int_op(5, OP_EQ, sls4->len); + trim_slices(sls3, sls4); + tt_int_op(5, OP_EQ, sls3->len); + tt_int_op(5, OP_EQ, sls4->len); + + done: + tor_free(sls1); + tor_free(sls2); + tor_free(sls3); + tor_free(sls4); + smartlist_free(sl1); + smartlist_free(sl2); + smartlist_free(sl3); + smartlist_free(sl4); + memarea_drop_all(area); +} + +static void +test_consdiff_set_changed(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + bitarray_t *changed1 = bitarray_init_zero(4); + bitarray_t *changed2 = bitarray_init_zero(4); + smartlist_slice_t *sls1, *sls2; + memarea_t *area = memarea_new(); + + (void)arg; + consensus_split_lines(sl1, "a\nb\na\na\n", area); + consensus_split_lines(sl2, "a\na\na\na\n", area); + + /* Length of sls1 is 0. */ + sls1 = smartlist_slice(sl1, 0, 0); + sls2 = smartlist_slice(sl2, 1, 3); + set_changed(changed1, changed2, sls1, sls2); + + /* The former is not changed, the latter changes all of its elements. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(!bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + bitarray_clear(changed2, 1); + bitarray_clear(changed2, 2); + + /* Length of sls1 is 1 and its element is in sls2. */ + tor_free(sls1); + sls1 = smartlist_slice(sl1, 0, 1); + set_changed(changed1, changed2, sls1, sls2); + + /* The latter changes all elements but the (first) common one. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(!bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(!bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + bitarray_clear(changed2, 2); + + /* Length of sls1 is 1 and its element is not in sls2. */ + tor_free(sls1); + sls1 = smartlist_slice(sl1, 1, 2); + set_changed(changed1, changed2, sls1, sls2); + + /* The former changes its element, the latter changes all elements. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + + done: + bitarray_free(changed1); + bitarray_free(changed2); + smartlist_free(sl1); + smartlist_free(sl2); + tor_free(sls1); + tor_free(sls2); + memarea_drop_all(area); +} + +static void +test_consdiff_calc_changes(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + smartlist_slice_t *sls1, *sls2; + bitarray_t *changed1 = bitarray_init_zero(4); + bitarray_t *changed2 = bitarray_init_zero(4); + memarea_t *area = memarea_new(); + + (void)arg; + consensus_split_lines(sl1, "a\na\na\na\n", area); + consensus_split_lines(sl2, "a\na\na\na\n", area); + + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + calc_changes(sls1, sls2, changed1, changed2); + + /* Nothing should be set to changed. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(!bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(!bitarray_is_set(changed2, 1)); + tt_assert(!bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + + smartlist_clear(sl2); + consensus_split_lines(sl2, "a\nb\na\nb\n", area); + tor_free(sls1); + tor_free(sls2); + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + calc_changes(sls1, sls2, changed1, changed2); + + /* Two elements are changed. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(bitarray_is_set(changed1, 1)); + tt_assert(bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + bitarray_clear(changed1, 1); + bitarray_clear(changed1, 2); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(!bitarray_is_set(changed2, 2)); + tt_assert(bitarray_is_set(changed2, 3)); + bitarray_clear(changed1, 1); + bitarray_clear(changed1, 3); + + smartlist_clear(sl2); + consensus_split_lines(sl2, "b\nb\nb\nb\n", area); + tor_free(sls1); + tor_free(sls2); + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + calc_changes(sls1, sls2, changed1, changed2); + + /* All elements are changed. */ + tt_assert(bitarray_is_set(changed1, 0)); + tt_assert(bitarray_is_set(changed1, 1)); + tt_assert(bitarray_is_set(changed1, 2)); + tt_assert(bitarray_is_set(changed1, 3)); + + tt_assert(bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(bitarray_is_set(changed2, 3)); + + done: + bitarray_free(changed1); + bitarray_free(changed2); + smartlist_free(sl1); + smartlist_free(sl2); + tor_free(sls1); + tor_free(sls2); + memarea_drop_all(area); +} + +static void +test_consdiff_get_id_hash(void *arg) +{ + (void)arg; + + cdline_t line1 = { "r name", 6 }; + cdline_t line2 = { "r name _hash_isnt_base64 etc", 28 }; + cdline_t line3 = { "r name hash+valid+base64 etc", 28 }; + cdline_t tmp; + + /* No hash. */ + tt_int_op(-1, OP_EQ, get_id_hash(&line1, &tmp)); + /* The hash contains characters that are not base64. */ + tt_int_op(-1, OP_EQ, get_id_hash(&line2, &tmp)); + + /* valid hash. */ + tt_int_op(0, OP_EQ, get_id_hash(&line3, &tmp)); + tt_ptr_op(tmp.s, OP_EQ, line3.s + 7); + tt_uint_op(tmp.len, OP_EQ, line3.len - 11); + + done: + ; +} + +static void +test_consdiff_is_valid_router_entry(void *arg) +{ + /* Doesn't start with "r ". */ + (void)arg; + cdline_t line0 = { "foo", 3 }; + tt_int_op(0, OP_EQ, is_valid_router_entry(&line0)); + + /* These are already tested with get_id_hash, but make sure it's run + * properly. */ + + cdline_t line1 = { "r name", 6 }; + cdline_t line2 = { "r name _hash_isnt_base64 etc", 28 }; + cdline_t line3 = { "r name hash+valid+base64 etc", 28 }; + tt_int_op(0, OP_EQ, is_valid_router_entry(&line1)); + tt_int_op(0, OP_EQ, is_valid_router_entry(&line2)); + tt_int_op(1, OP_EQ, is_valid_router_entry(&line3)); + + done: + ; +} + +static void +test_consdiff_next_router(void *arg) +{ + smartlist_t *sl = smartlist_new(); + memarea_t *area = memarea_new(); + (void)arg; + smartlist_add_linecpy(sl, area, "foo"); + smartlist_add_linecpy(sl, area, + "r name hash+longer+than+27+chars+and+valid+base64 etc"); + smartlist_add_linecpy(sl, area, "foo"); + smartlist_add_linecpy(sl, area, "foo"); + smartlist_add_linecpy(sl, area, + "r name hash+longer+than+27+chars+and+valid+base64 etc"); + smartlist_add_linecpy(sl, area, "foo"); + + /* Not currently on a router entry line, finding the next one. */ + tt_int_op(1, OP_EQ, next_router(sl, 0)); + tt_int_op(4, OP_EQ, next_router(sl, 2)); + + /* Already at the beginning of a router entry line, ignore it. */ + tt_int_op(4, OP_EQ, next_router(sl, 1)); + + /* There are no more router entries, so return the line after the last. */ + tt_int_op(6, OP_EQ, next_router(sl, 4)); + tt_int_op(6, OP_EQ, next_router(sl, 5)); + + done: + smartlist_free(sl); + memarea_drop_all(area); +} + +static int +base64cmp_wrapper(const char *a, const char *b) +{ + cdline_t aa = { a, a ? (uint32_t) strlen(a) : 0 }; + cdline_t bb = { b, b ? (uint32_t) strlen(b) : 0 }; + return base64cmp(&aa, &bb); +} + +static void +test_consdiff_base64cmp(void *arg) +{ + /* NULL arguments. */ + (void)arg; + tt_int_op(0, OP_EQ, base64cmp_wrapper(NULL, NULL)); + tt_int_op(-1, OP_EQ, base64cmp_wrapper(NULL, "foo")); + tt_int_op(1, OP_EQ, base64cmp_wrapper("bar", NULL)); + + /* Nil base64 values. */ + tt_int_op(0, OP_EQ, base64cmp_wrapper("", "")); + tt_int_op(0, OP_EQ, base64cmp_wrapper("_", "&")); + + /* Exact same valid strings. */ + tt_int_op(0, OP_EQ, base64cmp_wrapper("abcABC/+", "abcABC/+")); + /* Both end with an invalid base64 char other than '\0'. */ + tt_int_op(0, OP_EQ, base64cmp_wrapper("abcABC/+ ", "abcABC/+ ")); + /* Only one ends with an invalid base64 char other than '\0'. */ + tt_int_op(-1, OP_EQ, base64cmp_wrapper("abcABC/+ ", "abcABC/+a")); + + /* Comparisons that would return differently with strcmp(). */ + tt_int_op(strcmp("/foo", "Afoo"), OP_LT, 0); + tt_int_op(base64cmp_wrapper("/foo", "Afoo"), OP_GT, 0); + tt_int_op(strcmp("Afoo", "0foo"), OP_GT, 0); + tt_int_op(base64cmp_wrapper("Afoo", "0foo"), OP_LT, 0); + + /* Comparisons that would return the same as with strcmp(). */ + tt_int_op(strcmp("afoo", "Afoo"), OP_GT, 0); + tt_int_op(base64cmp_wrapper("afoo", "Afoo"), OP_GT, 0); + + /* Different lengths */ + tt_int_op(base64cmp_wrapper("afoo", "afooo"), OP_LT, 0); + tt_int_op(base64cmp_wrapper("afooo", "afoo"), OP_GT, 0); + + done: + ; +} + +static void +test_consdiff_gen_ed_diff(void *arg) +{ + smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; + int i; + memarea_t *area = memarea_new(); + setup_capture_of_logs(LOG_WARN); + + (void)arg; + cons1 = smartlist_new(); + cons2 = smartlist_new(); + + /* Identity hashes are not sorted properly, return NULL. */ + smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); + smartlist_add_linecpy(cons1, area, "foo"); + smartlist_add_linecpy(cons1, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); + smartlist_add_linecpy(cons1, area, "bar"); + + smartlist_add_linecpy(cons2, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); + smartlist_add_linecpy(cons2, area, "foo"); + smartlist_add_linecpy(cons2, area, "r name ccccccccccccccccccccccccccc etc"); + smartlist_add_linecpy(cons2, area, "bar"); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the base consensus doesn't have its router entries sorted " + "properly."); + + /* Same, but now with the second consensus. */ + mock_clean_saved_logs(); + diff = gen_ed_diff(cons2, cons1, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the target consensus doesn't have its router entries sorted " + "properly."); + + /* Same as the two above, but with the reversed thing immediately after a + match. (The code handles this differently) */ + smartlist_del(cons1, 0); + smartlist_add_linecpy(cons1, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the base consensus doesn't have its router entries sorted " + "properly."); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons2, cons1, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the target consensus doesn't have its router entries sorted " + "properly."); + + /* Identity hashes are repeated, return NULL. */ + smartlist_clear(cons1); + + smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); + smartlist_add_linecpy(cons1, area, "foo"); + smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); + smartlist_add_linecpy(cons1, area, "bar"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the base consensus doesn't have its router entries sorted " + "properly."); + + /* We have to add a line that is just a dot, return NULL. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + smartlist_add_linecpy(cons1, area, "foo1"); + smartlist_add_linecpy(cons1, area, "foo2"); + + smartlist_add_linecpy(cons2, area, "foo1"); + smartlist_add_linecpy(cons2, area, "."); + smartlist_add_linecpy(cons2, area, "foo2"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Cannot generate consensus diff " + "because one of the lines to be added is \".\"."); + +#define MAX_LINE_COUNT (10000) + /* Too many lines to be fed to the quadratic-time function. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + for (i=0; i < MAX_LINE_COUNT; ++i) smartlist_add_linecpy(cons1, area, "a"); + for (i=0; i < MAX_LINE_COUNT; ++i) smartlist_add_linecpy(cons1, area, "b"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because we found too few common router ids."); + + /* We have dot lines, but they don't interfere with the script format. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + smartlist_add_linecpy(cons1, area, "foo1"); + smartlist_add_linecpy(cons1, area, "."); + smartlist_add_linecpy(cons1, area, "."); + smartlist_add_linecpy(cons1, area, "foo2"); + + smartlist_add_linecpy(cons2, area, "foo1"); + smartlist_add_linecpy(cons2, area, "."); + smartlist_add_linecpy(cons2, area, "foo2"); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + smartlist_free(diff); + + /* Empty diff tests. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(0, OP_EQ, smartlist_len(diff)); + smartlist_free(diff); + + smartlist_add_linecpy(cons1, area, "foo"); + smartlist_add_linecpy(cons1, area, "bar"); + + smartlist_add_linecpy(cons2, area, "foo"); + smartlist_add_linecpy(cons2, area, "bar"); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(0, OP_EQ, smartlist_len(diff)); + smartlist_free(diff); + + /* Everything is deleted. */ + smartlist_clear(cons2); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(1, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("1,2d", smartlist_get(diff, 0)); + + smartlist_free(diff); + + /* Everything is added. */ + diff = gen_ed_diff(cons2, cons1, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(4, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("0a", smartlist_get(diff, 0)); + tt_str_eq_line("foo", smartlist_get(diff, 1)); + tt_str_eq_line("bar", smartlist_get(diff, 2)); + tt_str_eq_line(".", smartlist_get(diff, 3)); + + smartlist_free(diff); + + /* Everything is changed. */ + smartlist_add_linecpy(cons2, area, "foo2"); + smartlist_add_linecpy(cons2, area, "bar2"); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(4, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("1,2c", smartlist_get(diff, 0)); + tt_str_eq_line("foo2", smartlist_get(diff, 1)); + tt_str_eq_line("bar2", smartlist_get(diff, 2)); + tt_str_eq_line(".", smartlist_get(diff, 3)); + + smartlist_free(diff); + + /* Test 'a', 'c' and 'd' together. See that it is done in reverse order. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + consensus_split_lines(cons1, "A\nB\nC\nD\nE\n", area); + consensus_split_lines(cons2, "A\nC\nO\nE\nU\n", area); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(7, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("5a", smartlist_get(diff, 0)); + tt_str_eq_line("U", smartlist_get(diff, 1)); + tt_str_eq_line(".", smartlist_get(diff, 2)); + tt_str_eq_line("4c", smartlist_get(diff, 3)); + tt_str_eq_line("O", smartlist_get(diff, 4)); + tt_str_eq_line(".", smartlist_get(diff, 5)); + tt_str_eq_line("2d", smartlist_get(diff, 6)); + + smartlist_free(diff); + + smartlist_clear(cons1); + smartlist_clear(cons2); + consensus_split_lines(cons1, "B\n", area); + consensus_split_lines(cons2, "A\nB\n", area); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(3, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("0a", smartlist_get(diff, 0)); + tt_str_eq_line("A", smartlist_get(diff, 1)); + tt_str_eq_line(".", smartlist_get(diff, 2)); + + /* TODO: small real use-cases, i.e. consensuses. */ + + done: + teardown_capture_of_logs(); + smartlist_free(cons1); + smartlist_free(cons2); + smartlist_free(diff); + memarea_drop_all(area); +} + +static void +test_consdiff_apply_ed_diff(void *arg) +{ + smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; + memarea_t *area = memarea_new(); + (void)arg; + cons1 = smartlist_new(); + diff = smartlist_new(); + setup_capture_of_logs(LOG_WARN); + + consensus_split_lines(cons1, "A\nB\nC\nD\nE\n", area); + + /* Command without range. */ + smartlist_add_linecpy(diff, area, "a"); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + smartlist_clear(diff); + expect_single_log_msg_containing("an ed command was missing a line number"); + + /* Range without command. */ + smartlist_add_linecpy(diff, area, "1"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("a line with no ed command was found"); + + smartlist_clear(diff); + + /* Range without end. */ + smartlist_add_linecpy(diff, area, "1,"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command was missing a range " + "end line number."); + + smartlist_clear(diff); + + /* Incoherent ranges. */ + smartlist_add_linecpy(diff, area, "1,1"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an invalid range was found"); + + smartlist_clear(diff); + + smartlist_add_linecpy(diff, area, "3,2"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an invalid range was found"); + + smartlist_clear(diff); + + /* Unexpected range for add command. */ + smartlist_add_linecpy(diff, area, "1,2a"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("add lines after a range"); + + smartlist_clear(diff); + + /* $ for a non-delete command. */ + smartlist_add_linecpy(diff, area, "1,$c"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("it wanted to use $ with a command " + "other than delete"); + + smartlist_clear(diff); + + /* Script is not in reverse order. */ + smartlist_add_linecpy(diff, area, "1d"); + smartlist_add_linecpy(diff, area, "3d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("its commands are not properly sorted"); + + smartlist_clear(diff); + + /* Script contains unrecognised commands longer than one char. */ + smartlist_add_linecpy(diff, area, "1foo"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* Script contains unrecognised commands. */ + smartlist_add_linecpy(diff, area, "1e"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an unrecognised ed command was found"); + + smartlist_clear(diff); + + /* Command that should be followed by at least one line and a ".", but + * isn't. */ + smartlist_add_linecpy(diff, area, "0a"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("it has an ed command that tries to " + "insert zero lines."); + + /* Now it is followed by a ".", but it inserts zero lines. */ + smartlist_add_linecpy(diff, area, "."); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("it has an ed command that tries to " + "insert zero lines."); + + smartlist_clear(diff); + + /* Now it it inserts something, but has no terminator. */ + smartlist_add_linecpy(diff, area, "0a"); + smartlist_add_linecpy(diff, area, "hello"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("lines to be inserted that don't end with " + "a \".\"."); + + smartlist_clear(diff); + + /* Ranges must be numeric only and cannot contain spaces. */ + smartlist_add_linecpy(diff, area, "0, 4d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command was missing a range " + "end line number."); + + smartlist_clear(diff); + + /* '+' is not a number. */ + smartlist_add_linecpy(diff, area, "+0,4d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command was missing a line number"); + + smartlist_clear(diff); + + /* range duplication */ + smartlist_add_linecpy(diff, area, "0,4d,5d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* space before command */ + smartlist_add_linecpy(diff, area, "0,4 d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* space inside number */ + smartlist_add_linecpy(diff, area, "0,4 5d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* Test appending text, 'a'. */ + consensus_split_lines(diff, "3a\nU\nO\n.\n0a\nV\n.\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(8, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("V", smartlist_get(cons2, 0)); + tt_str_eq_line("A", smartlist_get(cons2, 1)); + tt_str_eq_line("B", smartlist_get(cons2, 2)); + tt_str_eq_line("C", smartlist_get(cons2, 3)); + tt_str_eq_line("U", smartlist_get(cons2, 4)); + tt_str_eq_line("O", smartlist_get(cons2, 5)); + tt_str_eq_line("D", smartlist_get(cons2, 6)); + tt_str_eq_line("E", smartlist_get(cons2, 7)); + + smartlist_clear(diff); + smartlist_free(cons2); + + /* Test deleting text, 'd'. */ + consensus_split_lines(diff, "4d\n1,2d\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(2, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("C", smartlist_get(cons2, 0)); + tt_str_eq_line("E", smartlist_get(cons2, 1)); + + smartlist_clear(diff); + smartlist_free(cons2); + + /* Test changing text, 'c'. */ + consensus_split_lines(diff, "4c\nT\nX\n.\n1,2c\nM\n.\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(5, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("M", smartlist_get(cons2, 0)); + tt_str_eq_line("C", smartlist_get(cons2, 1)); + tt_str_eq_line("T", smartlist_get(cons2, 2)); + tt_str_eq_line("X", smartlist_get(cons2, 3)); + tt_str_eq_line("E", smartlist_get(cons2, 4)); + + smartlist_clear(diff); + smartlist_free(cons2); + + /* Test 'a', 'd' and 'c' together. */ + consensus_split_lines(diff, "4c\nT\nX\n.\n2d\n0a\nM\n.\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(6, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("M", smartlist_get(cons2, 0)); + tt_str_eq_line("A", smartlist_get(cons2, 1)); + tt_str_eq_line("C", smartlist_get(cons2, 2)); + tt_str_eq_line("T", smartlist_get(cons2, 3)); + tt_str_eq_line("X", smartlist_get(cons2, 4)); + tt_str_eq_line("E", smartlist_get(cons2, 5)); + + done: + teardown_capture_of_logs(); + smartlist_free(cons1); + smartlist_free(cons2); + smartlist_free(diff); + memarea_drop_all(area); +} + +static void +test_consdiff_gen_diff(void *arg) +{ + char *cons1_str=NULL, *cons2_str=NULL; + smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; + consensus_digest_t digests1, digests2; + memarea_t *area = memarea_new(); + (void)arg; + cons1 = smartlist_new(); + cons2 = smartlist_new(); + + /* Identity hashes are not sorted properly, return NULL. + * Already tested in gen_ed_diff, but see that a NULL ed diff also makes + * gen_diff return NULL. */ + cons1_str = tor_strdup( + "network-status-version foo\n" + "r name bbbbbbbbbbbbbbbbb etc\nfoo\n" + "r name aaaaaaaaaaaaaaaaa etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + cons2_str = tor_strdup( + "network-status-version foo\n" + "r name aaaaaaaaaaaaaaaaa etc\nfoo\n" + "r name ccccccccccccccccc etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + + tt_int_op(0, OP_EQ, + consensus_compute_digest_as_signed(cons1_str, &digests1)); + tt_int_op(0, OP_EQ, + consensus_compute_digest(cons2_str, &digests2)); + + consensus_split_lines(cons1, cons1_str, area); + consensus_split_lines(cons2, cons2_str, area); + + diff = consdiff_gen_diff(cons1, cons2, &digests1, &digests2, area); + tt_ptr_op(NULL, OP_EQ, diff); + + /* Check that the headers are done properly. */ + tor_free(cons1_str); + cons1_str = tor_strdup( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nfoo\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + tt_int_op(0, OP_EQ, + consensus_compute_digest_as_signed(cons1_str, &digests1)); + smartlist_clear(cons1); + consensus_split_lines(cons1, cons1_str, area); + diff = consdiff_gen_diff(cons1, cons2, &digests1, &digests2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(11, OP_EQ, smartlist_len(diff)); + tt_assert(line_str_eq(smartlist_get(diff, 0), + "network-status-diff-version 1")); + tt_assert(line_str_eq(smartlist_get(diff, 1), "hash " + "95D70F5A3CC65F920AA8B44C4563D7781A082674329661884E19E94B79D539C2 " + "7AFECEFA4599BA33D603653E3D2368F648DF4AC4723929B0F7CF39281596B0C1")); + tt_assert(line_str_eq(smartlist_get(diff, 2), "6,$d")); + tt_assert(line_str_eq(smartlist_get(diff, 3), "3,4c")); + tt_assert(line_str_eq(smartlist_get(diff, 4), "bar")); + tt_assert(line_str_eq(smartlist_get(diff, 5), + "directory-signature foo bar")); + tt_assert(line_str_eq(smartlist_get(diff, 6), + ".")); + tt_assert(line_str_eq(smartlist_get(diff, 7), "1a")); + tt_assert(line_str_eq(smartlist_get(diff, 8), + "r name aaaaaaaaaaaaaaaaa etc")); + tt_assert(line_str_eq(smartlist_get(diff, 9), "foo")); + tt_assert(line_str_eq(smartlist_get(diff, 10), ".")); + + /* TODO: small real use-cases, i.e. consensuses. */ + + done: + tor_free(cons1_str); + tor_free(cons2_str); + smartlist_free(cons1); + smartlist_free(cons2); + smartlist_free(diff); + memarea_drop_all(area); +} + +static void +test_consdiff_apply_diff(void *arg) +{ + smartlist_t *cons1=NULL, *diff=NULL; + char *cons1_str=NULL, *cons2 = NULL; + consensus_digest_t digests1; + (void)arg; + memarea_t *area = memarea_new(); + cons1 = smartlist_new(); + diff = smartlist_new(); + setup_capture_of_logs(LOG_INFO); + + cons1_str = tor_strdup( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nfoo\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + tt_int_op(0, OP_EQ, + consensus_compute_digest(cons1_str, &digests1)); + consensus_split_lines(cons1, cons1_str, area); + + /* diff doesn't have enough lines. */ + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("too short") + + /* first line doesn't match format-version string. */ + smartlist_add_linecpy(diff, area, "foo-bar"); + smartlist_add_linecpy(diff, area, "header-line"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("format is not known") + + /* The first word of the second header line is not "hash". */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "word a b"); + smartlist_add_linecpy(diff, area, "x"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("does not include the necessary digests") + + /* Wrong number of words after "hash". */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash a b c"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("does not include the necessary digests") + + /* base16 digests do not have the expected length. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash aaa bbb"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("includes base16-encoded digests of " + "incorrect size") + + /* base16 digests contain non-base16 characters. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + " ????????????????????????????????????????????????????????????????" + " ----------------------------------------------------------------"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("includes malformed digests") + + /* Invalid ed diff. + * As tested in apply_ed_diff, but check that apply_diff does return NULL if + * the ed diff can't be applied. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* sha256 of cons2. */ + " 635D34593020C08E5ECD865F9986E29D50028EFA62843766A8197AD228A7F6AA"); + smartlist_add_linecpy(diff, area, "foobar"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("because an ed command was missing a line " + "number") + + /* Base consensus doesn't match its digest as found in the diff. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* bogus sha256. */ + " 3333333333333333333333333333333333333333333333333333333333333333" + /* sha256 of cons2. */ + " 635D34593020C08E5ECD865F9986E29D50028EFA62843766A8197AD228A7F6AA"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_log_msg_containing("base consensus doesn't match the digest " + "as found"); + + /* Resulting consensus doesn't match its digest as found in the diff. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* bogus sha3. */ + " 3333333333333333333333333333333333333333333333333333333333333333"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_log_msg_containing("resulting consensus doesn't match the " + "digest as found"); + +#if 0 + /* XXXX No longer possible, since we aren't using the other algorithm. */ + /* Resulting consensus digest cannot be computed */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* bogus sha3. */ + " 3333333333333333333333333333333333333333333333333333333333333333"); + smartlist_add_linecpy(diff, area, "1,2d"); // remove starting line + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_log_msg_containing("Could not compute digests of the consensus " + "resulting from applying a consensus diff."); +#endif /* 0 */ + + /* Very simple test, only to see that nothing errors. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* sha3 of cons2. */ + " 90A418881B2FCAB3D9E60EE02E4D666D56CFA38F8A3B7AA3E0ADBA530DDA9353"); + smartlist_add_linecpy(diff, area, "3c"); + smartlist_add_linecpy(diff, area, "sample"); + smartlist_add_linecpy(diff, area, "."); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_NE, cons2); + tt_str_op( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nsample\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n", OP_EQ, + cons2); + tor_free(cons2); + + /* Check that lowercase letters in base16-encoded digests work too. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646d6cf563a41869d3b02e73254372ae3140046c5e7d83c9f71e54976af9b4" + /* sha3 of cons2. */ + " 90a418881b2fcab3d9e60ee02e4d666d56cfa38f8a3b7aa3e0adba530dda9353"); + smartlist_add_linecpy(diff, area, "3c"); + smartlist_add_linecpy(diff, area, "sample"); + smartlist_add_linecpy(diff, area, "."); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_NE, cons2); + tt_str_op( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nsample\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n", OP_EQ, + cons2); + tor_free(cons2); + + smartlist_clear(diff); + + done: + teardown_capture_of_logs(); + tor_free(cons1_str); + smartlist_free(cons1); + smartlist_free(diff); + memarea_drop_all(area); +} + +#define CONSDIFF_LEGACY(name) \ + { #name, test_consdiff_ ## name , 0, NULL, NULL } + +struct testcase_t consdiff_tests[] = { + CONSDIFF_LEGACY(smartlist_slice), + CONSDIFF_LEGACY(smartlist_slice_string_pos), + CONSDIFF_LEGACY(lcs_lengths), + CONSDIFF_LEGACY(trim_slices), + CONSDIFF_LEGACY(set_changed), + CONSDIFF_LEGACY(calc_changes), + CONSDIFF_LEGACY(get_id_hash), + CONSDIFF_LEGACY(is_valid_router_entry), + CONSDIFF_LEGACY(next_router), + CONSDIFF_LEGACY(base64cmp), + CONSDIFF_LEGACY(gen_ed_diff), + CONSDIFF_LEGACY(apply_ed_diff), + CONSDIFF_LEGACY(gen_diff), + CONSDIFF_LEGACY(apply_diff), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_consdiffmgr.c b/src/wraith/src/test/test_consdiffmgr.c new file mode 100644 index 000000000..a9a4b6a98 --- /dev/null +++ b/src/wraith/src/test/test_consdiffmgr.c @@ -0,0 +1,896 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFFMGR_PRIVATE + +#include "or.h" +#include "config.h" +#include "conscache.h" +#include "consdiff.h" +#include "consdiffmgr.h" +#include "cpuworker.h" +#include "networkstatus.h" +#include "routerparse.h" +#include "workqueue.h" + +#include "test.h" +#include "log_test_helpers.h" + +// ============================== Setup/teardown the consdiffmgr +// These functions get run before/after each test in this module + +static void * +consdiffmgr_test_setup(const struct testcase_t *arg) +{ + (void)arg; + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cdm")); + tor_free(get_options_mutable()->CacheDirectory); + get_options_mutable()->CacheDirectory = ddir_fname; // now owns the pointer. + check_private_dir(ddir_fname, CPD_CREATE, NULL); + + consdiff_cfg_t consdiff_cfg = { 300 }; + consdiffmgr_configure(&consdiff_cfg); + return (void *)1; // must return something non-null. +} +static int +consdiffmgr_test_teardown(const struct testcase_t *arg, void *ignore) +{ + (void)arg; + (void)ignore; + consdiffmgr_free_all(); + return 1; +} +static struct testcase_setup_t setup_diffmgr = { + consdiffmgr_test_setup, + consdiffmgr_test_teardown +}; + +// ============================== NS faking functions +// These functions are for making quick fake consensus objects and +// strings that are just good enough for consdiff and consdiffmgr. + +static networkstatus_t * +fake_ns_new(consensus_flavor_t flav, time_t valid_after) +{ + networkstatus_t *ns = tor_malloc_zero(sizeof(networkstatus_t)); + ns->type = NS_TYPE_CONSENSUS; + ns->flavor = flav; + ns->valid_after = valid_after; + return ns; +} + +static char * +fake_ns_body_new(consensus_flavor_t flav, time_t valid_after) +{ + const char *flavor_string = flav == FLAV_NS ? "" : " microdesc"; + char valid_after_string[ISO_TIME_LEN+1]; + + format_iso_time(valid_after_string, valid_after); + char *random_stuff = crypto_random_hostname(3, 25, "junk ", ""); + char *random_stuff2 = crypto_random_hostname(3, 10, "", ""); + + char *consensus; + tor_asprintf(&consensus, + "network-status-version 3%s\n" + "vote-status consensus\n" + "valid-after %s\n" + "r name ccccccccccccccccc etc\nsample\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "%s\n" + "directory-signature hello-there\n" + "directory-signature %s\n", + flavor_string, + valid_after_string, + random_stuff, + random_stuff2); + tor_free(random_stuff); + tor_free(random_stuff2); + return consensus; +} + +// ============================== Cpuworker mocking code +// These mocking functions and types capture the cpuworker calls +// so we can inspect them and run them in the main thread. +static smartlist_t *fake_cpuworker_queue = NULL; +typedef struct fake_work_queue_ent_t { + enum workqueue_reply_t (*fn)(void *, void *); + void (*reply_fn)(void *); + void *arg; +} fake_work_queue_ent_t; +static struct workqueue_entry_s * +mock_cpuworker_queue_work(workqueue_priority_t prio, + enum workqueue_reply_t (*fn)(void *, void *), + void (*reply_fn)(void *), + void *arg) +{ + (void) prio; + + if (! fake_cpuworker_queue) + fake_cpuworker_queue = smartlist_new(); + + fake_work_queue_ent_t *ent = tor_malloc_zero(sizeof(*ent)); + ent->fn = fn; + ent->reply_fn = reply_fn; + ent->arg = arg; + smartlist_add(fake_cpuworker_queue, ent); + return (struct workqueue_entry_s *)ent; +} +static int +mock_cpuworker_run_work(void) +{ + if (! fake_cpuworker_queue) + return 0; + SMARTLIST_FOREACH(fake_cpuworker_queue, fake_work_queue_ent_t *, ent, { + enum workqueue_reply_t r = ent->fn(NULL, ent->arg); + if (r != WQ_RPL_REPLY) + return -1; + }); + return 0; +} +static void +mock_cpuworker_handle_replies(void) +{ + if (! fake_cpuworker_queue) + return; + SMARTLIST_FOREACH(fake_cpuworker_queue, fake_work_queue_ent_t *, ent, { + ent->reply_fn(ent->arg); + tor_free(ent); + }); + smartlist_free(fake_cpuworker_queue); + fake_cpuworker_queue = NULL; +} + +// ============================== Other helpers + +static consdiff_status_t +lookup_diff_from(consensus_cache_entry_t **out, + consensus_flavor_t flav, + const char *str1) +{ + uint8_t digest[DIGEST256_LEN]; + if (router_get_networkstatus_v3_sha3_as_signed(digest, str1)<0) { + TT_FAIL(("Unable to compute sha3-as-signed")); + return CONSDIFF_NOT_FOUND; + } + return consdiffmgr_find_diff_from(out, flav, + DIGEST_SHA3_256, digest, sizeof(digest), + NO_METHOD); +} + +static int +lookup_apply_and_verify_diff(consensus_flavor_t flav, + const char *str1, + const char *str2) +{ + consensus_cache_entry_t *ent = NULL; + consdiff_status_t status = lookup_diff_from(&ent, flav, str1); + if (ent == NULL || status != CONSDIFF_AVAILABLE) { + return -1; + } + + consensus_cache_entry_incref(ent); + size_t size; + char *diff_string = NULL; + int r = uncompress_or_copy(&diff_string, &size, ent); + consensus_cache_entry_decref(ent); + if (diff_string == NULL || r < 0) + return -1; + + char *applied = consensus_diff_apply(str1, diff_string); + tor_free(diff_string); + if (applied == NULL) + return -1; + + int match = !strcmp(applied, str2); + tor_free(applied); + return match ? 0 : -1; +} + +static void +cdm_reload(void) +{ + consdiffmgr_free_all(); + cdm_cache_get(); + consdiffmgr_rescan(); +} + +// ============================== Beginning of tests + +#if 0 +static int got_failure = 0; +static void +got_assertion_failure(void) +{ + ++got_failure; +} + +/* XXXX This test won't work, because there is currently no way to actually + * XXXX capture a real assertion failure. */ +static void +test_consdiffmgr_init_failure(void *arg) +{ + (void)arg; + // Capture assertions and bugs. + + /* As in ...test_setup, but do not create the datadir. The missing directory + * will cause a failure. */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cdm")); + tor_free(get_options_mutable()->CacheDirectory); + get_options_mutable()->CacheDirectory = ddir_fname; // now owns the pointer. + + consdiff_cfg_t consdiff_cfg = { 7200, 300 }; + + tor_set_failed_assertion_callback(got_assertion_failure); + tor_capture_bugs_(1); + consdiffmgr_configure(&consdiff_cfg); // This should fail. + tt_int_op(got_failure, OP_EQ, 1); + const smartlist_t *bugs = tor_get_captured_bug_log_(); + tt_int_op(smartlist_len(bugs), OP_EQ, 1); + + done: + tor_end_capture_bugs_(); +} +#endif /* 0 */ + +static void +test_consdiffmgr_sha3_helper(void *arg) +{ + (void) arg; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + config_line_t *lines = NULL; + char *mem_op_hex_tmp = NULL; + config_line_prepend(&lines, "good-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00D"); + config_line_prepend(&lines, "short-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF0"); + config_line_prepend(&lines, "long-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00DF00D"); + config_line_prepend(&lines, "not-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DXXXX"); + consensus_cache_entry_t *ent = + consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + + uint8_t buf[DIGEST256_LEN]; + tt_int_op(-1, OP_EQ, cdm_entry_get_sha3_value(buf, NULL, "good-sha")); + tt_int_op(0, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "good-sha")); + test_memeq_hex(buf, "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00D"); + + tt_int_op(-1, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "missing-sha")); + tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "short-sha")); + tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "long-sha")); + tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "not-sha")); + + done: + consensus_cache_entry_decref(ent); + config_free_lines(lines); + tor_free(mem_op_hex_tmp); +} + +static void +test_consdiffmgr_add(void *arg) +{ + (void) arg; + time_t now = approx_time(); + + char *body = NULL; + + consensus_cache_entry_t *ent = NULL; + networkstatus_t *ns_tmp = fake_ns_new(FLAV_NS, now); + const char *dummy = "foo"; + int r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, 0); + + /* If we add it again, it won't work */ + setup_capture_of_logs(LOG_INFO); + dummy = "bar"; + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, -1); + expect_single_log_msg_containing("We already have a copy of that " + "consensus"); + mock_clean_saved_logs(); + + /* But it will work fine if the flavor is different */ + dummy = "baz"; + ns_tmp->flavor = FLAV_MICRODESC; + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, 0); + + /* And it will work fine if the time is different */ + dummy = "quux"; + ns_tmp->flavor = FLAV_NS; + ns_tmp->valid_after = now - 60; + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, 0); + + /* If we add one a long long time ago, it will fail. */ + dummy = "xyzzy"; + ns_tmp->valid_after = 86400 * 100; /* A few months into 1970 */ + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, -1); + expect_log_msg_containing("it's too old."); + + /* Try looking up a consensuses. */ + ent = cdm_cache_lookup_consensus(FLAV_NS, now-60); + tt_assert(ent); + consensus_cache_entry_incref(ent); + size_t s; + r = uncompress_or_copy(&body, &s, ent); + tt_int_op(r, OP_EQ, 0); + tt_int_op(s, OP_EQ, 4); + tt_mem_op(body, OP_EQ, "quux", 4); + + /* Try looking up another entry, but fail */ + tt_ptr_op(cdm_cache_lookup_consensus(FLAV_MICRODESC, now - 60), OP_EQ, NULL); + tt_ptr_op(cdm_cache_lookup_consensus(FLAV_NS, now - 61), OP_EQ, NULL); + + done: + networkstatus_vote_free(ns_tmp); + teardown_capture_of_logs(); + consensus_cache_entry_decref(ent); + tor_free(body); +} + +static void +test_consdiffmgr_make_diffs(void *arg) +{ + (void)arg; + networkstatus_t *ns = NULL; + char *ns_body = NULL, *md_ns_body = NULL, *md_ns_body_2 = NULL; + char *applied = NULL, *diff_text = NULL; + time_t now = approx_time(); + int r; + consensus_cache_entry_t *diff = NULL; + uint8_t md_ns_sha3[DIGEST256_LEN]; + consdiff_status_t diff_status; + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + // Try rescan with no consensuses: shouldn't crash or queue work. + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + // Make two consensuses, 1 hour sec ago. + ns = fake_ns_new(FLAV_NS, now-3600); + ns_body = fake_ns_body_new(FLAV_NS, now-3600); + r = consdiffmgr_add_consensus(ns_body, ns); + networkstatus_vote_free(ns); + tor_free(ns_body); + tt_int_op(r, OP_EQ, 0); + + ns = fake_ns_new(FLAV_MICRODESC, now-3600); + md_ns_body = fake_ns_body_new(FLAV_MICRODESC, now-3600); + r = consdiffmgr_add_consensus(md_ns_body, ns); + router_get_networkstatus_v3_sha3_as_signed(md_ns_sha3, md_ns_body); + networkstatus_vote_free(ns); + tt_int_op(r, OP_EQ, 0); + + // No diffs will be generated. + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + // Add a MD consensus from 45 minutes ago. This should cause one diff + // worth of work to get queued. + ns = fake_ns_new(FLAV_MICRODESC, now-45*60); + md_ns_body_2 = fake_ns_body_new(FLAV_MICRODESC, now-45*60); + r = consdiffmgr_add_consensus(md_ns_body_2, ns); + networkstatus_vote_free(ns); + tt_int_op(r, OP_EQ, 0); + + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + diff_status = consdiffmgr_find_diff_from(&diff, FLAV_MICRODESC, + DIGEST_SHA3_256, + md_ns_sha3, DIGEST256_LEN, + NO_METHOD); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, diff_status); + + // Now run that process and get the diff. + r = mock_cpuworker_run_work(); + tt_int_op(r, OP_EQ, 0); + mock_cpuworker_handle_replies(); + + // At this point we should be able to get that diff. + diff_status = consdiffmgr_find_diff_from(&diff, FLAV_MICRODESC, + DIGEST_SHA3_256, + md_ns_sha3, DIGEST256_LEN, + NO_METHOD); + tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, diff_status); + tt_assert(diff); + + /* Make sure applying the diff actually works */ + const uint8_t *diff_body; + size_t diff_size; + r = consensus_cache_entry_get_body(diff, &diff_body, &diff_size); + tt_int_op(r, OP_EQ, 0); + diff_text = tor_memdup_nulterm(diff_body, diff_size); + applied = consensus_diff_apply(md_ns_body, diff_text); + tt_assert(applied); + tt_str_op(applied, OP_EQ, md_ns_body_2); + + /* Rescan again: no more work to do. */ + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + done: + tor_free(md_ns_body); + tor_free(md_ns_body_2); + tor_free(diff_text); + tor_free(applied); +} + +static void +test_consdiffmgr_diff_rules(void *arg) +{ + (void)arg; +#define N 6 + char *md_body[N], *ns_body[N]; + networkstatus_t *md_ns[N], *ns_ns[N]; + int i; + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + /* Create a bunch of consensus things at 15-second intervals. */ + time_t start = approx_time() - 120; + for (i = 0; i < N; ++i) { + time_t when = start + i * 15; + md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); + ns_body[i] = fake_ns_body_new(FLAV_NS, when); + md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); + ns_ns[i] = fake_ns_new(FLAV_NS, when); + } + + /* For the MD consensuses: add 4 of them, and make sure that + * diffs are created to one consensus (the most recent) only. */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[3], md_ns[3])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[4], md_ns[4])); + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(3, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + /* For the NS consensuses: add 3, generate, and add one older one and + * make sure that older one is the only one whose diff is generated */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[0], ns_ns[0])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[1], ns_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[5], ns_ns[5])); + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + + /* At this point, we should actually have working diffs! */ + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[0], ns_body[5])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[1], ns_body[5])); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[2], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[3], md_body[4])); + + /* Self-to-self diff won't be present */ + consensus_cache_entry_t *ent; + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_NS, ns_body[5])); + /* No diff from 2 has been added yet */ + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_NS, ns_body[2])); + /* No diff arriving at old things. */ + tt_int_op(-1, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); + /* No backwards diff */ + tt_int_op(-1, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[4], md_body[3])); + + /* Now, an update: add number 2 and make sure it's the only one whose diff + * is regenerated. */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[2], ns_ns[2])); + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[2], ns_body[5])); + + /* Finally: reload, and make sure that the information is still indexed */ + cdm_reload(); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[0], ns_body[5])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[2], ns_body[5])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[1], ns_body[5])); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[2], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[3], md_body[4])); + + done: + for (i = 0; i < N; ++i) { + tor_free(md_body[i]); + tor_free(ns_body[i]); + networkstatus_vote_free(md_ns[i]); + networkstatus_vote_free(ns_ns[i]); + } + UNMOCK(cpuworker_queue_work); +#undef N +} + +static void +test_consdiffmgr_diff_failure(void *arg) +{ + (void)arg; + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + /* We're going to make sure that if we have a bogus request where + * we can't actually compute a diff, the world must not end. */ + networkstatus_t *ns1 = NULL; + networkstatus_t *ns2 = NULL; + int r; + + ns1 = fake_ns_new(FLAV_NS, approx_time()-100); + ns2 = fake_ns_new(FLAV_NS, approx_time()-50); + r = consdiffmgr_add_consensus("foo bar baz\n", ns1); + tt_int_op(r, OP_EQ, 0); + // We refuse to compute a diff to or from a line holding only a single dot. + // We can add it here, though. + r = consdiffmgr_add_consensus("foo bar baz\n.\n.\n", ns2); + tt_int_op(r, OP_EQ, 0); + + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + setup_capture_of_logs(LOG_WARN); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + expect_single_log_msg_containing("one of the lines to be added is \".\"."); + mock_clean_saved_logs(); + mock_cpuworker_handle_replies(); + expect_single_log_msg_containing("Worker was unable to compute consensus " + "diff from "); + + /* Make sure the diff is not present */ + consensus_cache_entry_t *ent; + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_NS, "foo bar baz\n")); + + done: + teardown_capture_of_logs(); + UNMOCK(cpuworker_queue_work); + networkstatus_vote_free(ns1); + networkstatus_vote_free(ns2); +} + +static void +test_consdiffmgr_diff_pending(void *arg) +{ +#define N 3 + (void)arg; + char *md_body[N]; + networkstatus_t *md_ns[N]; + time_t start = approx_time() - 120; + int i; + for (i = 0; i < N; ++i) { + time_t when = start + i * 30; + md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); + md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); + } + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); + /* Make a diff */ + consdiffmgr_rescan(); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + + /* Look it up. Is it pending? */ + consensus_cache_entry_t *ent = NULL; + consdiff_status_t diff_status; + diff_status = lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1]); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, diff_status); + tt_ptr_op(ent, OP_EQ, NULL); + + /* Add another old consensus. only one new diff should launch! */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[0], md_ns[0])); + consdiffmgr_rescan(); + tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); + + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[0], md_body[2])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); + + done: + UNMOCK(cpuworker_queue_work); + for (i = 0; i < N; ++i) { + tor_free(md_body[i]); + networkstatus_vote_free(md_ns[i]); + } +#undef N +} + +static void +test_consdiffmgr_cleanup_old(void *arg) +{ + (void)arg; + config_line_t *labels = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + + /* This item will be will be cleanable because it has a valid-after + * time far in the past. */ + config_line_prepend(&labels, "document-type", "confribble-blarg"); + config_line_prepend(&labels, "consensus-valid-after", + "1980-10-10T10:10:10"); + ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); + tt_assert(ent); + consensus_cache_entry_decref(ent); + + setup_capture_of_logs(LOG_DEBUG); + tt_int_op(1, OP_EQ, consdiffmgr_cleanup()); + expect_log_msg_containing("Deleting entry because its consensus-valid-" + "after value (1980-10-10T10:10:10) was too old"); + + done: + teardown_capture_of_logs(); + config_free_lines(labels); +} + +static void +test_consdiffmgr_cleanup_bad_valid_after(void *arg) +{ + /* This will seem cleanable, but isn't, because its valid-after time is + * misformed. */ + + (void)arg; + config_line_t *labels = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + + config_line_prepend(&labels, "document-type", "consensus"); + config_line_prepend(&labels, "consensus-valid-after", + "whan that aprille with his shoures soote"); // (~1385?) + ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); + tt_assert(ent); + consensus_cache_entry_decref(ent); + + setup_capture_of_logs(LOG_DEBUG); + tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); + expect_log_msg_containing("Ignoring entry because its consensus-valid-" + "after value (\"whan that aprille with his " + "shoures soote\") was unparseable"); + + done: + teardown_capture_of_logs(); + config_free_lines(labels); +} + +static void +test_consdiffmgr_cleanup_no_valid_after(void *arg) +{ + (void)arg; + config_line_t *labels = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + + /* This item will be will be uncleanable because it has no recognized + * valid-after. */ + config_line_prepend(&labels, "document-type", "consensus"); + config_line_prepend(&labels, "confrooble-voolid-oofter", + "2010-10-10T09:08:07"); + ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); + tt_assert(ent); + consensus_cache_entry_decref(ent); + + setup_capture_of_logs(LOG_DEBUG); + tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); + expect_log_msg_containing("Ignoring entry because it had no consensus-" + "valid-after label"); + + done: + teardown_capture_of_logs(); + config_free_lines(labels); +} + +static void +test_consdiffmgr_cleanup_old_diffs(void *arg) +{ + (void)arg; +#define N 4 + char *md_body[N]; + networkstatus_t *md_ns[N]; + int i; + consensus_cache_entry_t *hold_ent = NULL, *ent; + + /* Make sure that the cleanup function removes diffs to the not-most-recent + * consensus. */ + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + /* Create a bunch of consensus things at 15-second intervals. */ + time_t start = approx_time() - 120; + for (i = 0; i < N; ++i) { + time_t when = start + i * 15; + md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); + md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); + } + + /* add the first 3. */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[0], md_ns[0])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); + /* Make diffs. */ + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + /* Nothing is deletable now */ + tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[0], md_body[2])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); + + tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, + lookup_diff_from(&hold_ent, FLAV_MICRODESC, md_body[1])); + consensus_cache_entry_incref(hold_ent); // incref, so it is preserved. + + /* Now add an even-more-recent consensus; this should make all previous + * diffs deletable, and make delete */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[3], md_ns[3])); + tt_int_op(2 * n_diff_compression_methods() + + (n_consensus_compression_methods() - 1) , OP_EQ, + consdiffmgr_cleanup()); + + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[0])); + /* This one is marked deletable but still in the hashtable */ + tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1])); + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[2])); + + /* Everything should be valid at this point */ + tt_int_op(0, OP_EQ, consdiffmgr_validate()); + + /* And if we recan NOW, we'll purge the hashtable of the entries, + * and launch attempts to generate new ones */ + consdiffmgr_rescan(); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[0])); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1])); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[2])); + + /* We're still holding on to this, though, so we can still map it! */ + const uint8_t *t1 = NULL; + size_t s; + int r = consensus_cache_entry_get_body(hold_ent, &t1, &s); + tt_int_op(r, OP_EQ, 0); + tt_assert(t1); + + done: + for (i = 0; i < N; ++i) { + tor_free(md_body[i]); + networkstatus_vote_free(md_ns[i]); + } + consensus_cache_entry_decref(hold_ent); + UNMOCK(cpuworker_queue_work); +#undef N +} + +static void +test_consdiffmgr_validate(void *arg) +{ + (void)arg; + config_line_t *lines = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + smartlist_t *vals = smartlist_new(); + + /* Put these: objects in the cache: one with a good sha3, one with bad sha3, + * one with a wrong sha3, and one with no sha3. */ + config_line_prepend(&lines, "id", "wrong sha3"); + config_line_prepend(&lines, "sha3-digest", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00D"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + config_line_prepend(&lines, "id", "bad sha3"); + config_line_prepend(&lines, "sha3-digest", + "now is the winter of our dicotheque"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + config_line_prepend(&lines, "id", "no sha3"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + config_line_prepend(&lines, "id", "good sha3"); + config_line_prepend(&lines, "sha3-digest", + "8d8b1998616cd6b4c4055da8d38728dc" + "93c758d4131a53c7d81aa6337dee1c05"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + cdm_reload(); + cache = cdm_cache_get(); + tt_int_op(1, OP_EQ, consdiffmgr_validate()); + + consensus_cache_find_all(vals, cache, "id", "good sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 1); + smartlist_clear(vals); + + consensus_cache_find_all(vals, cache, "id", "no sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 1); + smartlist_clear(vals); + + consensus_cache_find_all(vals, cache, "id", "wrong sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 0); + consensus_cache_find_all(vals, cache, "id", "bad sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 0); + + done: + smartlist_free(vals); +} + +#define TEST(name) \ + { #name, test_consdiffmgr_ ## name , TT_FORK, &setup_diffmgr, NULL } + +struct testcase_t consdiffmgr_tests[] = { +#if 0 + { "init_failure", test_consdiffmgr_init_failure, TT_FORK, NULL, NULL }, +#endif + TEST(sha3_helper), + TEST(add), + TEST(make_diffs), + TEST(diff_rules), + TEST(diff_failure), + TEST(diff_pending), + TEST(cleanup_old), + TEST(cleanup_bad_valid_after), + TEST(cleanup_no_valid_after), + TEST(cleanup_old_diffs), + TEST(validate), + + // XXXX Test: non-cacheing cases of replyfn(). + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_containers.c b/src/wraith/src/test/test_containers.c new file mode 100644 index 000000000..c4dba7375 --- /dev/null +++ b/src/wraith/src/test/test_containers.c @@ -0,0 +1,1297 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" +#include "fp_pair.h" +#include "test.h" + +/** Helper: return a tristate based on comparing the strings in *a and + * *b. */ +static int +compare_strs_(const void **a, const void **b) +{ + const char *s1 = *a, *s2 = *b; + return strcmp(s1, s2); +} + +/** Helper: return a tristate based on comparing the strings in a and + * *b. */ +static int +compare_strs_for_bsearch_(const void *a, const void **b) +{ + const char *s1 = a, *s2 = *b; + return strcmp(s1, s2); +} + +/** Helper: return a tristate based on comparing the strings in *a and + * *b, excluding a's first character, and ignoring case. */ +static int +cmp_without_first_(const void *a, const void **b) +{ + const char *s1 = a, *s2 = *b; + return strcasecmp(s1+1, s2); +} + +/** Run unit tests for basic dynamic-sized array functionality. */ +static void +test_container_smartlist_basic(void *arg) +{ + smartlist_t *sl; + char *v0 = tor_strdup("v0"); + char *v1 = tor_strdup("v1"); + char *v2 = tor_strdup("v2"); + char *v3 = tor_strdup("v3"); + char *v4 = tor_strdup("v4"); + char *v22 = tor_strdup("v22"); + char *v99 = tor_strdup("v99"); + char *v555 = tor_strdup("v555"); + + /* XXXX test sort_digests, uniq_strings, uniq_digests */ + + /* Test smartlist add, del_keeporder, insert, get. */ + (void)arg; + sl = smartlist_new(); + smartlist_add(sl, v1); + smartlist_add(sl, v2); + smartlist_add(sl, v3); + smartlist_add(sl, v4); + smartlist_del_keeporder(sl, 1); + smartlist_insert(sl, 1, v22); + smartlist_insert(sl, 0, v0); + smartlist_insert(sl, 5, v555); + tt_ptr_op(v0,OP_EQ, smartlist_get(sl,0)); + tt_ptr_op(v1,OP_EQ, smartlist_get(sl,1)); + tt_ptr_op(v22,OP_EQ, smartlist_get(sl,2)); + tt_ptr_op(v3,OP_EQ, smartlist_get(sl,3)); + tt_ptr_op(v4,OP_EQ, smartlist_get(sl,4)); + tt_ptr_op(v555,OP_EQ, smartlist_get(sl,5)); + /* Try deleting in the middle. */ + smartlist_del(sl, 1); + tt_ptr_op(v555,OP_EQ, smartlist_get(sl, 1)); + /* Try deleting at the end. */ + smartlist_del(sl, 4); + tt_int_op(4,OP_EQ, smartlist_len(sl)); + + /* test isin. */ + tt_assert(smartlist_contains(sl, v3)); + tt_assert(!smartlist_contains(sl, v99)); + + done: + smartlist_free(sl); + tor_free(v0); + tor_free(v1); + tor_free(v2); + tor_free(v3); + tor_free(v4); + tor_free(v22); + tor_free(v99); + tor_free(v555); +} + +/** Run unit tests for smartlist-of-strings functionality. */ +static void +test_container_smartlist_strings(void *arg) +{ + smartlist_t *sl = smartlist_new(); + char *cp=NULL, *cp_alloc=NULL; + size_t sz; + + /* Test split and join */ + (void)arg; + tt_int_op(0,OP_EQ, smartlist_len(sl)); + smartlist_split_string(sl, "abc", ":", 0, 0); + tt_int_op(1,OP_EQ, smartlist_len(sl)); + tt_str_op("abc",OP_EQ, smartlist_get(sl, 0)); + smartlist_split_string(sl, "a::bc::", "::", 0, 0); + tt_int_op(4,OP_EQ, smartlist_len(sl)); + tt_str_op("a",OP_EQ, smartlist_get(sl, 1)); + tt_str_op("bc",OP_EQ, smartlist_get(sl, 2)); + tt_str_op("",OP_EQ, smartlist_get(sl, 3)); + cp_alloc = smartlist_join_strings(sl, "", 0, NULL); + tt_str_op(cp_alloc,OP_EQ, "abcabc"); + tor_free(cp_alloc); + cp_alloc = smartlist_join_strings(sl, "!", 0, NULL); + tt_str_op(cp_alloc,OP_EQ, "abc!a!bc!"); + tor_free(cp_alloc); + cp_alloc = smartlist_join_strings(sl, "XY", 0, NULL); + tt_str_op(cp_alloc,OP_EQ, "abcXYaXYbcXY"); + tor_free(cp_alloc); + cp_alloc = smartlist_join_strings(sl, "XY", 1, NULL); + tt_str_op(cp_alloc,OP_EQ, "abcXYaXYbcXYXY"); + tor_free(cp_alloc); + cp_alloc = smartlist_join_strings(sl, "", 1, NULL); + tt_str_op(cp_alloc,OP_EQ, "abcabc"); + tor_free(cp_alloc); + + smartlist_split_string(sl, "/def/ /ghijk", "/", 0, 0); + tt_int_op(8,OP_EQ, smartlist_len(sl)); + tt_str_op("",OP_EQ, smartlist_get(sl, 4)); + tt_str_op("def",OP_EQ, smartlist_get(sl, 5)); + tt_str_op(" ",OP_EQ, smartlist_get(sl, 6)); + tt_str_op("ghijk",OP_EQ, smartlist_get(sl, 7)); + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_clear(sl); + + smartlist_split_string(sl, "a,bbd,cdef", ",", SPLIT_SKIP_SPACE, 0); + tt_int_op(3,OP_EQ, smartlist_len(sl)); + tt_str_op("a",OP_EQ, smartlist_get(sl,0)); + tt_str_op("bbd",OP_EQ, smartlist_get(sl,1)); + tt_str_op("cdef",OP_EQ, smartlist_get(sl,2)); + smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", + SPLIT_SKIP_SPACE, 0); + tt_int_op(8,OP_EQ, smartlist_len(sl)); + tt_str_op("z",OP_EQ, smartlist_get(sl,3)); + tt_str_op("zhasd",OP_EQ, smartlist_get(sl,4)); + tt_str_op("",OP_EQ, smartlist_get(sl,5)); + tt_str_op("bnud",OP_EQ, smartlist_get(sl,6)); + tt_str_op("",OP_EQ, smartlist_get(sl,7)); + + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_clear(sl); + + smartlist_split_string(sl, " ab\tc \td ef ", NULL, + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + tt_int_op(4,OP_EQ, smartlist_len(sl)); + tt_str_op("ab",OP_EQ, smartlist_get(sl,0)); + tt_str_op("c",OP_EQ, smartlist_get(sl,1)); + tt_str_op("d",OP_EQ, smartlist_get(sl,2)); + tt_str_op("ef",OP_EQ, smartlist_get(sl,3)); + smartlist_split_string(sl, "ghi\tj", NULL, + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + tt_int_op(6,OP_EQ, smartlist_len(sl)); + tt_str_op("ghi",OP_EQ, smartlist_get(sl,4)); + tt_str_op("j",OP_EQ, smartlist_get(sl,5)); + + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_clear(sl); + + cp_alloc = smartlist_join_strings(sl, "XY", 0, NULL); + tt_str_op(cp_alloc,OP_EQ, ""); + tor_free(cp_alloc); + cp_alloc = smartlist_join_strings(sl, "XY", 1, NULL); + tt_str_op(cp_alloc,OP_EQ, "XY"); + tor_free(cp_alloc); + + smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + tt_int_op(3,OP_EQ, smartlist_len(sl)); + tt_str_op("z",OP_EQ, smartlist_get(sl, 0)); + tt_str_op("zhasd",OP_EQ, smartlist_get(sl, 1)); + tt_str_op("bnud",OP_EQ, smartlist_get(sl, 2)); + smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); + tt_int_op(5,OP_EQ, smartlist_len(sl)); + tt_str_op("z",OP_EQ, smartlist_get(sl, 3)); + tt_str_op("zhasd <> <> bnud<>",OP_EQ, smartlist_get(sl, 4)); + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_clear(sl); + + smartlist_split_string(sl, "abcd\n", "\n", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + tt_int_op(1,OP_EQ, smartlist_len(sl)); + tt_str_op("abcd",OP_EQ, smartlist_get(sl, 0)); + smartlist_split_string(sl, "efgh", "\n", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + tt_int_op(2,OP_EQ, smartlist_len(sl)); + tt_str_op("efgh",OP_EQ, smartlist_get(sl, 1)); + + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_clear(sl); + + /* Test swapping, shuffling, and sorting. */ + smartlist_split_string(sl, "the,onion,router,by,arma,and,nickm", ",", 0, 0); + tt_int_op(7,OP_EQ, smartlist_len(sl)); + smartlist_sort(sl, compare_strs_); + cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); + tt_str_op(cp_alloc,OP_EQ, "and,arma,by,nickm,onion,router,the"); + tor_free(cp_alloc); + smartlist_swap(sl, 1, 5); + cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); + tt_str_op(cp_alloc,OP_EQ, "and,router,by,nickm,onion,arma,the"); + tor_free(cp_alloc); + smartlist_shuffle(sl); + tt_int_op(7,OP_EQ, smartlist_len(sl)); + tt_assert(smartlist_contains_string(sl, "and")); + tt_assert(smartlist_contains_string(sl, "router")); + tt_assert(smartlist_contains_string(sl, "by")); + tt_assert(smartlist_contains_string(sl, "nickm")); + tt_assert(smartlist_contains_string(sl, "onion")); + tt_assert(smartlist_contains_string(sl, "arma")); + tt_assert(smartlist_contains_string(sl, "the")); + + /* Test bsearch. */ + smartlist_sort(sl, compare_strs_); + tt_str_op("nickm",OP_EQ, smartlist_bsearch(sl, "zNicKM", + cmp_without_first_)); + tt_str_op("and",OP_EQ, + smartlist_bsearch(sl, " AND", cmp_without_first_)); + tt_ptr_op(NULL,OP_EQ, smartlist_bsearch(sl, " ANz", cmp_without_first_)); + + /* Test bsearch_idx */ + { + int f; + smartlist_t *tmp = NULL; + + tt_int_op(0,OP_EQ,smartlist_bsearch_idx(sl," aaa",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 0); + tt_int_op(0,OP_EQ, smartlist_bsearch_idx(sl," and",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 1); + tt_int_op(1,OP_EQ, smartlist_bsearch_idx(sl," arm",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 0); + tt_int_op(1,OP_EQ, + smartlist_bsearch_idx(sl," arma",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 1); + tt_int_op(2,OP_EQ, + smartlist_bsearch_idx(sl," armb",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 0); + tt_int_op(7,OP_EQ, + smartlist_bsearch_idx(sl," zzzz",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 0); + + /* Test trivial cases for list of length 0 or 1 */ + tmp = smartlist_new(); + tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "foo", + compare_strs_for_bsearch_, &f)); + tt_int_op(f,OP_EQ, 0); + smartlist_insert(tmp, 0, (void *)("bar")); + tt_int_op(1,OP_EQ, smartlist_bsearch_idx(tmp, "foo", + compare_strs_for_bsearch_, &f)); + tt_int_op(f,OP_EQ, 0); + tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "aaa", + compare_strs_for_bsearch_, &f)); + tt_int_op(f,OP_EQ, 0); + tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "bar", + compare_strs_for_bsearch_, &f)); + tt_int_op(f,OP_EQ, 1); + /* ... and one for length 2 */ + smartlist_insert(tmp, 1, (void *)("foo")); + tt_int_op(1,OP_EQ, smartlist_bsearch_idx(tmp, "foo", + compare_strs_for_bsearch_, &f)); + tt_int_op(f,OP_EQ, 1); + tt_int_op(2,OP_EQ, smartlist_bsearch_idx(tmp, "goo", + compare_strs_for_bsearch_, &f)); + tt_int_op(f,OP_EQ, 0); + smartlist_free(tmp); + } + + /* Test reverse() and pop_last() */ + smartlist_reverse(sl); + cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); + tt_str_op(cp_alloc,OP_EQ, "the,router,onion,nickm,by,arma,and"); + tor_free(cp_alloc); + cp_alloc = smartlist_pop_last(sl); + tt_str_op(cp_alloc,OP_EQ, "and"); + tor_free(cp_alloc); + tt_int_op(smartlist_len(sl),OP_EQ, 6); + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_clear(sl); + cp_alloc = smartlist_pop_last(sl); + tt_ptr_op(cp_alloc,OP_EQ, NULL); + + /* Test uniq() */ + smartlist_split_string(sl, + "50,noon,radar,a,man,a,plan,a,canal,panama,radar,noon,50", + ",", 0, 0); + smartlist_sort(sl, compare_strs_); + smartlist_uniq(sl, compare_strs_, tor_free_); + cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); + tt_str_op(cp_alloc,OP_EQ, "50,a,canal,man,noon,panama,plan,radar"); + tor_free(cp_alloc); + + /* Test contains_string, contains_string_case and contains_int_as_string */ + tt_assert(smartlist_contains_string(sl, "noon")); + tt_assert(!smartlist_contains_string(sl, "noonoon")); + tt_assert(smartlist_contains_string_case(sl, "nOOn")); + tt_assert(!smartlist_contains_string_case(sl, "nooNooN")); + tt_assert(smartlist_contains_int_as_string(sl, 50)); + tt_assert(!smartlist_contains_int_as_string(sl, 60)); + + /* Test smartlist_choose */ + { + int i; + int allsame = 1; + int allin = 1; + void *first = smartlist_choose(sl); + tt_assert(smartlist_contains(sl, first)); + for (i = 0; i < 100; ++i) { + void *second = smartlist_choose(sl); + if (second != first) + allsame = 0; + if (!smartlist_contains(sl, second)) + allin = 0; + } + tt_assert(!allsame); + tt_assert(allin); + } + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_clear(sl); + + /* Test string_remove and remove and join_strings2 */ + smartlist_split_string(sl, + "Some say the Earth will end in ice and some in fire", + " ", 0, 0); + cp = smartlist_get(sl, 4); + tt_str_op(cp,OP_EQ, "will"); + smartlist_add(sl, cp); + smartlist_remove(sl, cp); + tor_free(cp); + cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); + tt_str_op(cp_alloc,OP_EQ, "Some,say,the,Earth,fire,end,in,ice,and,some,in"); + tor_free(cp_alloc); + smartlist_string_remove(sl, "in"); + cp_alloc = smartlist_join_strings2(sl, "+XX", 1, 0, &sz); + tt_str_op(cp_alloc,OP_EQ, "Some+say+the+Earth+fire+end+some+ice+and"); + tt_int_op((int)sz,OP_EQ, 40); + + done: + + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_free(sl); + tor_free(cp_alloc); +} + +/** Run unit tests for smartlist set manipulation functions. */ +static void +test_container_smartlist_overlap(void *arg) +{ + smartlist_t *sl = smartlist_new(); + smartlist_t *ints = smartlist_new(); + smartlist_t *odds = smartlist_new(); + smartlist_t *evens = smartlist_new(); + smartlist_t *primes = smartlist_new(); + int i; + (void)arg; + for (i=1; i < 10; i += 2) + smartlist_add(odds, (void*)(uintptr_t)i); + for (i=0; i < 10; i += 2) + smartlist_add(evens, (void*)(uintptr_t)i); + + /* add_all */ + smartlist_add_all(ints, odds); + smartlist_add_all(ints, evens); + tt_int_op(smartlist_len(ints),OP_EQ, 10); + + smartlist_add(primes, (void*)2); + smartlist_add(primes, (void*)3); + smartlist_add(primes, (void*)5); + smartlist_add(primes, (void*)7); + + /* overlap */ + tt_assert(smartlist_overlap(ints, odds)); + tt_assert(smartlist_overlap(odds, primes)); + tt_assert(smartlist_overlap(evens, primes)); + tt_assert(!smartlist_overlap(odds, evens)); + + /* intersect */ + smartlist_add_all(sl, odds); + smartlist_intersect(sl, primes); + tt_int_op(smartlist_len(sl),OP_EQ, 3); + tt_assert(smartlist_contains(sl, (void*)3)); + tt_assert(smartlist_contains(sl, (void*)5)); + tt_assert(smartlist_contains(sl, (void*)7)); + + /* subtract */ + smartlist_add_all(sl, primes); + smartlist_subtract(sl, odds); + tt_int_op(smartlist_len(sl),OP_EQ, 1); + tt_assert(smartlist_contains(sl, (void*)2)); + + done: + smartlist_free(odds); + smartlist_free(evens); + smartlist_free(ints); + smartlist_free(primes); + smartlist_free(sl); +} + +/** Run unit tests for smartlist-of-digests functions. */ +static void +test_container_smartlist_digests(void *arg) +{ + smartlist_t *sl = smartlist_new(); + + /* contains_digest */ + (void)arg; + smartlist_add(sl, tor_memdup("AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN)); + smartlist_add(sl, tor_memdup("\00090AAB2AAAAaasdAAAAA", DIGEST_LEN)); + smartlist_add(sl, tor_memdup("\00090AAB2AAAAaasdAAAAA", DIGEST_LEN)); + tt_int_op(0,OP_EQ, smartlist_contains_digest(NULL, "AAAAAAAAAAAAAAAAAAAA")); + tt_assert(smartlist_contains_digest(sl, "AAAAAAAAAAAAAAAAAAAA")); + tt_assert(smartlist_contains_digest(sl, "\00090AAB2AAAAaasdAAAAA")); + tt_int_op(0,OP_EQ, smartlist_contains_digest(sl, "\00090AAB2AAABaasdAAAAA")); + + /* sort digests */ + smartlist_sort_digests(sl); + tt_mem_op(smartlist_get(sl, 0),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); + tt_mem_op(smartlist_get(sl, 1),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); + tt_mem_op(smartlist_get(sl, 2),OP_EQ, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN); + tt_int_op(3,OP_EQ, smartlist_len(sl)); + + /* uniq_digests */ + smartlist_uniq_digests(sl); + tt_int_op(2,OP_EQ, smartlist_len(sl)); + tt_mem_op(smartlist_get(sl, 0),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); + tt_mem_op(smartlist_get(sl, 1),OP_EQ, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN); + + done: + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_free(sl); +} + +/** Run unit tests for concatenate-a-smartlist-of-strings functions. */ +static void +test_container_smartlist_join(void *arg) +{ + smartlist_t *sl = smartlist_new(); + smartlist_t *sl2 = smartlist_new(), *sl3 = smartlist_new(), + *sl4 = smartlist_new(); + char *joined=NULL; + /* unique, sorted. */ + (void)arg; + smartlist_split_string(sl, + "Abashments Ambush Anchorman Bacon Banks Borscht " + "Bunks Inhumane Insurance Knish Know Manners " + "Maraschinos Stamina Sunbonnets Unicorns Wombats", + " ", 0, 0); + /* non-unique, sorted. */ + smartlist_split_string(sl2, + "Ambush Anchorman Anchorman Anemias Anemias Bacon " + "Crossbowmen Inhumane Insurance Knish Know Manners " + "Manners Maraschinos Wombats Wombats Work", + " ", 0, 0); + SMARTLIST_FOREACH_JOIN(sl, char *, cp1, + sl2, char *, cp2, + strcmp(cp1,cp2), + smartlist_add(sl3, cp2)) { + tt_str_op(cp1,OP_EQ, cp2); + smartlist_add(sl4, cp1); + } SMARTLIST_FOREACH_JOIN_END(cp1, cp2); + + SMARTLIST_FOREACH(sl3, const char *, cp, + tt_assert(smartlist_contains(sl2, cp) && + !smartlist_contains_string(sl, cp))); + SMARTLIST_FOREACH(sl4, const char *, cp, + tt_assert(smartlist_contains(sl, cp) && + smartlist_contains_string(sl2, cp))); + joined = smartlist_join_strings(sl3, ",", 0, NULL); + tt_str_op(joined,OP_EQ, "Anemias,Anemias,Crossbowmen,Work"); + tor_free(joined); + joined = smartlist_join_strings(sl4, ",", 0, NULL); + tt_str_op(joined,OP_EQ, + "Ambush,Anchorman,Anchorman,Bacon,Inhumane,Insurance," + "Knish,Know,Manners,Manners,Maraschinos,Wombats,Wombats"); + tor_free(joined); + + done: + smartlist_free(sl4); + smartlist_free(sl3); + SMARTLIST_FOREACH(sl2, char *, cp, tor_free(cp)); + smartlist_free(sl2); + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_free(sl); + tor_free(joined); +} + +static void +test_container_smartlist_pos(void *arg) +{ + (void) arg; + smartlist_t *sl = smartlist_new(); + + smartlist_add_strdup(sl, "This"); + smartlist_add_strdup(sl, "is"); + smartlist_add_strdup(sl, "a"); + smartlist_add_strdup(sl, "test"); + smartlist_add_strdup(sl, "for"); + smartlist_add_strdup(sl, "a"); + smartlist_add_strdup(sl, "function"); + + /* Test string_pos */ + tt_int_op(smartlist_string_pos(NULL, "Fred"), OP_EQ, -1); + tt_int_op(smartlist_string_pos(sl, "Fred"), OP_EQ, -1); + tt_int_op(smartlist_string_pos(sl, "This"), OP_EQ, 0); + tt_int_op(smartlist_string_pos(sl, "a"), OP_EQ, 2); + tt_int_op(smartlist_string_pos(sl, "function"), OP_EQ, 6); + + /* Test pos */ + tt_int_op(smartlist_pos(NULL, "Fred"), OP_EQ, -1); + tt_int_op(smartlist_pos(sl, "Fred"), OP_EQ, -1); + tt_int_op(smartlist_pos(sl, "This"), OP_EQ, -1); + tt_int_op(smartlist_pos(sl, "a"), OP_EQ, -1); + tt_int_op(smartlist_pos(sl, "function"), OP_EQ, -1); + tt_int_op(smartlist_pos(sl, smartlist_get(sl,0)), OP_EQ, 0); + tt_int_op(smartlist_pos(sl, smartlist_get(sl,2)), OP_EQ, 2); + tt_int_op(smartlist_pos(sl, smartlist_get(sl,5)), OP_EQ, 5); + tt_int_op(smartlist_pos(sl, smartlist_get(sl,6)), OP_EQ, 6); + + done: + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_free(sl); +} + +static void +test_container_smartlist_ints_eq(void *arg) +{ + smartlist_t *sl1 = NULL, *sl2 = NULL; + int x; + (void)arg; + + tt_assert(smartlist_ints_eq(NULL, NULL)); + + sl1 = smartlist_new(); + tt_assert(!smartlist_ints_eq(sl1, NULL)); + tt_assert(!smartlist_ints_eq(NULL, sl1)); + + sl2 = smartlist_new(); + tt_assert(smartlist_ints_eq(sl1, sl2)); + + x = 5; + smartlist_add(sl1, tor_memdup(&x, sizeof(int))); + smartlist_add(sl2, tor_memdup(&x, sizeof(int))); + x = 90; + smartlist_add(sl1, tor_memdup(&x, sizeof(int))); + smartlist_add(sl2, tor_memdup(&x, sizeof(int))); + tt_assert(smartlist_ints_eq(sl1, sl2)); + + x = -50; + smartlist_add(sl1, tor_memdup(&x, sizeof(int))); + tt_assert(! smartlist_ints_eq(sl1, sl2)); + tt_assert(! smartlist_ints_eq(sl2, sl1)); + smartlist_add(sl2, tor_memdup(&x, sizeof(int))); + tt_assert(smartlist_ints_eq(sl1, sl2)); + + *(int*)smartlist_get(sl1, 1) = 101010; + tt_assert(! smartlist_ints_eq(sl2, sl1)); + *(int*)smartlist_get(sl2, 1) = 101010; + tt_assert(smartlist_ints_eq(sl1, sl2)); + + done: + if (sl1) + SMARTLIST_FOREACH(sl1, int *, ip, tor_free(ip)); + if (sl2) + SMARTLIST_FOREACH(sl2, int *, ip, tor_free(ip)); + smartlist_free(sl1); + smartlist_free(sl2); +} + +/** Run unit tests for bitarray code */ +static void +test_container_bitarray(void *arg) +{ + bitarray_t *ba = NULL; + int i, j, ok=1; + + (void)arg; + ba = bitarray_init_zero(1); + tt_assert(ba); + tt_assert(! bitarray_is_set(ba, 0)); + bitarray_set(ba, 0); + tt_assert(bitarray_is_set(ba, 0)); + bitarray_clear(ba, 0); + tt_assert(! bitarray_is_set(ba, 0)); + bitarray_free(ba); + + ba = bitarray_init_zero(1023); + for (i = 1; i < 64; ) { + for (j = 0; j < 1023; ++j) { + if (j % i) + bitarray_set(ba, j); + else + bitarray_clear(ba, j); + } + for (j = 0; j < 1023; ++j) { + if (!bool_eq(bitarray_is_set(ba, j), j%i)) + ok = 0; + } + tt_assert(ok); + if (i < 7) + ++i; + else if (i == 28) + i = 32; + else + i += 7; + } + + done: + if (ba) + bitarray_free(ba); +} + +/** Run unit tests for digest set code (implemented as a hashtable or as a + * bloom filter) */ +static void +test_container_digestset(void *arg) +{ + smartlist_t *included = smartlist_new(); + char d[DIGEST_LEN]; + int i; + int ok = 1; + int false_positives = 0; + digestset_t *set = NULL; + + (void)arg; + for (i = 0; i < 1000; ++i) { + crypto_rand(d, DIGEST_LEN); + smartlist_add(included, tor_memdup(d, DIGEST_LEN)); + } + set = digestset_new(1000); + SMARTLIST_FOREACH(included, const char *, cp, + if (digestset_contains(set, cp)) + ok = 0); + tt_assert(ok); + SMARTLIST_FOREACH(included, const char *, cp, + digestset_add(set, cp)); + SMARTLIST_FOREACH(included, const char *, cp, + if (!digestset_contains(set, cp)) + ok = 0); + tt_assert(ok); + for (i = 0; i < 1000; ++i) { + crypto_rand(d, DIGEST_LEN); + if (digestset_contains(set, d)) + ++false_positives; + } + tt_int_op(50, OP_GT, false_positives); /* Should be far lower. */ + + done: + if (set) + digestset_free(set); + SMARTLIST_FOREACH(included, char *, cp, tor_free(cp)); + smartlist_free(included); +} + +typedef struct pq_entry_t { + const char *val; + int idx; +} pq_entry_t; + +/** Helper: return a tristate based on comparing two pq_entry_t values. */ +static int +compare_strings_for_pqueue_(const void *p1, const void *p2) +{ + const pq_entry_t *e1=p1, *e2=p2; + return strcmp(e1->val, e2->val); +} + +/** Run unit tests for heap-based priority queue functions. */ +static void +test_container_pqueue(void *arg) +{ + smartlist_t *sl = smartlist_new(); + int (*cmp)(const void *, const void*); + const int offset = offsetof(pq_entry_t, idx); +#define ENTRY(s) pq_entry_t s = { #s, -1 } + ENTRY(cows); + ENTRY(zebras); + ENTRY(fish); + ENTRY(frogs); + ENTRY(apples); + ENTRY(squid); + ENTRY(daschunds); + ENTRY(eggplants); + ENTRY(weissbier); + ENTRY(lobsters); + ENTRY(roquefort); + ENTRY(chinchillas); + ENTRY(fireflies); + +#define OK() smartlist_pqueue_assert_ok(sl, cmp, offset) + + (void)arg; + + cmp = compare_strings_for_pqueue_; + smartlist_pqueue_add(sl, cmp, offset, &cows); + smartlist_pqueue_add(sl, cmp, offset, &zebras); + smartlist_pqueue_add(sl, cmp, offset, &fish); + smartlist_pqueue_add(sl, cmp, offset, &frogs); + smartlist_pqueue_add(sl, cmp, offset, &apples); + smartlist_pqueue_add(sl, cmp, offset, &squid); + smartlist_pqueue_add(sl, cmp, offset, &daschunds); + smartlist_pqueue_add(sl, cmp, offset, &eggplants); + smartlist_pqueue_add(sl, cmp, offset, &weissbier); + smartlist_pqueue_add(sl, cmp, offset, &lobsters); + smartlist_pqueue_add(sl, cmp, offset, &roquefort); + + OK(); + + tt_int_op(smartlist_len(sl),OP_EQ, 11); + tt_ptr_op(smartlist_get(sl, 0),OP_EQ, &apples); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &apples); + tt_int_op(smartlist_len(sl),OP_EQ, 10); + OK(); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &cows); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &daschunds); + smartlist_pqueue_add(sl, cmp, offset, &chinchillas); + OK(); + smartlist_pqueue_add(sl, cmp, offset, &fireflies); + OK(); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &chinchillas); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &eggplants); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fireflies); + OK(); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fish); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &frogs); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &lobsters); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &roquefort); + OK(); + tt_int_op(smartlist_len(sl),OP_EQ, 3); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &squid); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &weissbier); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &zebras); + tt_int_op(smartlist_len(sl),OP_EQ, 0); + OK(); + + /* Now test remove. */ + smartlist_pqueue_add(sl, cmp, offset, &cows); + smartlist_pqueue_add(sl, cmp, offset, &fish); + smartlist_pqueue_add(sl, cmp, offset, &frogs); + smartlist_pqueue_add(sl, cmp, offset, &apples); + smartlist_pqueue_add(sl, cmp, offset, &squid); + smartlist_pqueue_add(sl, cmp, offset, &zebras); + tt_int_op(smartlist_len(sl),OP_EQ, 6); + OK(); + smartlist_pqueue_remove(sl, cmp, offset, &zebras); + tt_int_op(smartlist_len(sl),OP_EQ, 5); + OK(); + smartlist_pqueue_remove(sl, cmp, offset, &cows); + tt_int_op(smartlist_len(sl),OP_EQ, 4); + OK(); + smartlist_pqueue_remove(sl, cmp, offset, &apples); + tt_int_op(smartlist_len(sl),OP_EQ, 3); + OK(); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fish); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &frogs); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &squid); + tt_int_op(smartlist_len(sl),OP_EQ, 0); + OK(); + +#undef OK + + done: + + smartlist_free(sl); +} + +/** Run unit tests for string-to-void* map functions */ +static void +test_container_strmap(void *arg) +{ + strmap_t *map; + strmap_iter_t *iter; + const char *k; + void *v; + char *visited = NULL; + smartlist_t *found_keys = NULL; + char *v1 = tor_strdup("v1"); + char *v99 = tor_strdup("v99"); + char *v100 = tor_strdup("v100"); + char *v101 = tor_strdup("v101"); + char *v102 = tor_strdup("v102"); + char *v103 = tor_strdup("v103"); + char *v104 = tor_strdup("v104"); + char *v105 = tor_strdup("v105"); + + (void)arg; + map = strmap_new(); + tt_assert(map); + tt_int_op(strmap_size(map),OP_EQ, 0); + tt_assert(strmap_isempty(map)); + v = strmap_set(map, "K1", v99); + tt_ptr_op(v,OP_EQ, NULL); + tt_assert(!strmap_isempty(map)); + v = strmap_set(map, "K2", v101); + tt_ptr_op(v,OP_EQ, NULL); + v = strmap_set(map, "K1", v100); + tt_ptr_op(v,OP_EQ, v99); + tt_ptr_op(strmap_get(map,"K1"),OP_EQ, v100); + tt_ptr_op(strmap_get(map,"K2"),OP_EQ, v101); + tt_ptr_op(strmap_get(map,"K-not-there"),OP_EQ, NULL); + strmap_assert_ok(map); + + v = strmap_remove(map,"K2"); + strmap_assert_ok(map); + tt_ptr_op(v,OP_EQ, v101); + tt_ptr_op(strmap_get(map,"K2"),OP_EQ, NULL); + tt_ptr_op(strmap_remove(map,"K2"),OP_EQ, NULL); + + strmap_set(map, "K2", v101); + strmap_set(map, "K3", v102); + strmap_set(map, "K4", v103); + tt_int_op(strmap_size(map),OP_EQ, 4); + strmap_assert_ok(map); + strmap_set(map, "K5", v104); + strmap_set(map, "K6", v105); + strmap_assert_ok(map); + + /* Test iterator. */ + iter = strmap_iter_init(map); + found_keys = smartlist_new(); + while (!strmap_iter_done(iter)) { + strmap_iter_get(iter,&k,&v); + smartlist_add_strdup(found_keys, k); + tt_ptr_op(v,OP_EQ, strmap_get(map, k)); + + if (!strcmp(k, "K2")) { + iter = strmap_iter_next_rmv(map,iter); + } else { + iter = strmap_iter_next(map,iter); + } + } + + /* Make sure we removed K2, but not the others. */ + tt_ptr_op(strmap_get(map, "K2"),OP_EQ, NULL); + tt_ptr_op(strmap_get(map, "K5"),OP_EQ, v104); + /* Make sure we visited everyone once */ + smartlist_sort_strings(found_keys); + visited = smartlist_join_strings(found_keys, ":", 0, NULL); + tt_str_op(visited,OP_EQ, "K1:K2:K3:K4:K5:K6"); + + strmap_assert_ok(map); + /* Clean up after ourselves. */ + strmap_free(map, NULL); + map = NULL; + + /* Now try some lc functions. */ + map = strmap_new(); + strmap_set_lc(map,"Ab.C", v1); + tt_ptr_op(strmap_get(map,"ab.c"),OP_EQ, v1); + strmap_assert_ok(map); + tt_ptr_op(strmap_get_lc(map,"AB.C"),OP_EQ, v1); + tt_ptr_op(strmap_get(map,"AB.C"),OP_EQ, NULL); + tt_ptr_op(strmap_remove_lc(map,"aB.C"),OP_EQ, v1); + strmap_assert_ok(map); + tt_ptr_op(strmap_get_lc(map,"AB.C"),OP_EQ, NULL); + + done: + if (map) + strmap_free(map,NULL); + if (found_keys) { + SMARTLIST_FOREACH(found_keys, char *, cp, tor_free(cp)); + smartlist_free(found_keys); + } + tor_free(visited); + tor_free(v1); + tor_free(v99); + tor_free(v100); + tor_free(v101); + tor_free(v102); + tor_free(v103); + tor_free(v104); + tor_free(v105); +} + +static void +test_container_smartlist_remove(void *arg) +{ + (void) arg; + int array[5]; + smartlist_t *sl = smartlist_new(); + int i,j; + + for (j=0; j < 2; ++j) + for (i=0; i < 5; ++i) + smartlist_add(sl, &array[i]); + + smartlist_remove(sl, &array[0]); + smartlist_remove(sl, &array[3]); + smartlist_remove(sl, &array[4]); + tt_assert(! smartlist_contains(sl, &array[0])); + tt_assert(smartlist_contains(sl, &array[1])); + tt_assert(smartlist_contains(sl, &array[2])); + tt_assert(! smartlist_contains(sl, &array[3])); + tt_assert(! smartlist_contains(sl, &array[4])); + tt_int_op(smartlist_len(sl), OP_EQ, 4); + + smartlist_clear(sl); + for (j=0; j < 2; ++j) + for (i=0; i < 5; ++i) + smartlist_add(sl, &array[i]); + + smartlist_remove_keeporder(sl, &array[0]); + smartlist_remove_keeporder(sl, &array[3]); + smartlist_remove_keeporder(sl, &array[4]); + tt_int_op(smartlist_len(sl), OP_EQ, 4); + tt_ptr_op(smartlist_get(sl, 0), OP_EQ, &array[1]); + tt_ptr_op(smartlist_get(sl, 1), OP_EQ, &array[2]); + tt_ptr_op(smartlist_get(sl, 2), OP_EQ, &array[1]); + tt_ptr_op(smartlist_get(sl, 3), OP_EQ, &array[2]); + + done: + smartlist_free(sl); +} + +/** Run unit tests for getting the median of a list. */ +static void +test_container_order_functions(void *arg) +{ + int lst[25], n = 0; + uint32_t lst_2[25]; + // int a=12,b=24,c=25,d=60,e=77; + +#define median() median_int(lst, n) + + (void)arg; + lst[n++] = 12; + tt_int_op(12,OP_EQ, median()); /* 12 */ + lst[n++] = 77; + //smartlist_shuffle(sl); + tt_int_op(12,OP_EQ, median()); /* 12, 77 */ + lst[n++] = 77; + //smartlist_shuffle(sl); + tt_int_op(77,OP_EQ, median()); /* 12, 77, 77 */ + lst[n++] = 24; + tt_int_op(24,OP_EQ, median()); /* 12,24,77,77 */ + lst[n++] = 60; + lst[n++] = 12; + lst[n++] = 25; + //smartlist_shuffle(sl); + tt_int_op(25,OP_EQ, median()); /* 12,12,24,25,60,77,77 */ +#undef median + +#define third_quartile() third_quartile_uint32(lst_2, n) + + n = 0; + lst_2[n++] = 1; + tt_int_op(1,OP_EQ, third_quartile()); /* ~1~ */ + lst_2[n++] = 2; + tt_int_op(2,OP_EQ, third_quartile()); /* 1, ~2~ */ + lst_2[n++] = 3; + lst_2[n++] = 4; + lst_2[n++] = 5; + tt_int_op(4,OP_EQ, third_quartile()); /* 1, 2, 3, ~4~, 5 */ + lst_2[n++] = 6; + lst_2[n++] = 7; + lst_2[n++] = 8; + lst_2[n++] = 9; + tt_int_op(7,OP_EQ, third_quartile()); /* 1, 2, 3, 4, 5, 6, ~7~, 8, 9 */ + lst_2[n++] = 10; + lst_2[n++] = 11; + /* 1, 2, 3, 4, 5, 6, 7, 8, ~9~, 10, 11 */ + tt_int_op(9,OP_EQ, third_quartile()); + +#undef third_quartile + + double dbls[] = { 1.0, 10.0, 100.0, 1e4, 1e5, 1e6 }; + tt_double_eq(1.0, median_double(dbls, 1)); + tt_double_eq(1.0, median_double(dbls, 2)); + tt_double_eq(10.0, median_double(dbls, 3)); + tt_double_eq(10.0, median_double(dbls, 4)); + tt_double_eq(100.0, median_double(dbls, 5)); + tt_double_eq(100.0, median_double(dbls, 6)); + + time_t times[] = { 5, 10, 20, 25, 15 }; + + tt_assert(5 == median_time(times, 1)); + tt_assert(5 == median_time(times, 2)); + tt_assert(10 == median_time(times, 3)); + tt_assert(10 == median_time(times, 4)); + tt_assert(15 == median_time(times, 5)); + + int32_t int32s[] = { -5, -10, -50, 100 }; + tt_int_op(-5, OP_EQ, median_int32(int32s, 1)); + tt_int_op(-10, OP_EQ, median_int32(int32s, 2)); + tt_int_op(-10, OP_EQ, median_int32(int32s, 3)); + tt_int_op(-10, OP_EQ, median_int32(int32s, 4)); + + long longs[] = { -30, 30, 100, -100, 7 }; + tt_int_op(7, OP_EQ, find_nth_long(longs, 5, 2)); + + done: + ; +} + +static void +test_container_di_map(void *arg) +{ + di_digest256_map_t *map = NULL; + const uint8_t key1[] = "In view of the fact that it was "; + const uint8_t key2[] = "superficially convincing, being "; + const uint8_t key3[] = "properly enciphered in a one-tim"; + const uint8_t key4[] = "e cipher scheduled for use today"; + char *v1 = tor_strdup(", it came close to causing a disaster..."); + char *v2 = tor_strdup("I regret to have to advise you that the mission"); + char *v3 = tor_strdup("was actually initiated..."); + /* -- John Brunner, _The Shockwave Rider_ */ + + (void)arg; + + /* Try searching on an empty map. */ + tt_ptr_op(NULL, OP_EQ, dimap_search(map, key1, NULL)); + tt_ptr_op(NULL, OP_EQ, dimap_search(map, key2, NULL)); + tt_ptr_op(v3, OP_EQ, dimap_search(map, key2, v3)); + dimap_free(map, NULL); + map = NULL; + + /* Add a single entry. */ + dimap_add_entry(&map, key1, v1); + tt_ptr_op(NULL, OP_EQ, dimap_search(map, key2, NULL)); + tt_ptr_op(v3, OP_EQ, dimap_search(map, key2, v3)); + tt_ptr_op(v1, OP_EQ, dimap_search(map, key1, NULL)); + + /* Now try it with three entries in the map. */ + dimap_add_entry(&map, key2, v2); + dimap_add_entry(&map, key3, v3); + tt_ptr_op(v1, OP_EQ, dimap_search(map, key1, NULL)); + tt_ptr_op(v2, OP_EQ, dimap_search(map, key2, NULL)); + tt_ptr_op(v3, OP_EQ, dimap_search(map, key3, NULL)); + tt_ptr_op(NULL, OP_EQ, dimap_search(map, key4, NULL)); + tt_ptr_op(v1, OP_EQ, dimap_search(map, key4, v1)); + + done: + tor_free(v1); + tor_free(v2); + tor_free(v3); + dimap_free(map, NULL); +} + +/** Run unit tests for fp_pair-to-void* map functions */ +static void +test_container_fp_pair_map(void *arg) +{ + fp_pair_map_t *map; + fp_pair_t fp1, fp2, fp3, fp4, fp5, fp6; + void *v; + fp_pair_map_iter_t *iter; + fp_pair_t k; + char *v99 = tor_strdup("99"); + char *v100 = tor_strdup("v100"); + char *v101 = tor_strdup("v101"); + char *v102 = tor_strdup("v102"); + char *v103 = tor_strdup("v103"); + char *v104 = tor_strdup("v104"); + char *v105 = tor_strdup("v105"); + + (void)arg; + map = fp_pair_map_new(); + tt_assert(map); + tt_int_op(fp_pair_map_size(map),OP_EQ, 0); + tt_assert(fp_pair_map_isempty(map)); + + memset(fp1.first, 0x11, DIGEST_LEN); + memset(fp1.second, 0x12, DIGEST_LEN); + memset(fp2.first, 0x21, DIGEST_LEN); + memset(fp2.second, 0x22, DIGEST_LEN); + memset(fp3.first, 0x31, DIGEST_LEN); + memset(fp3.second, 0x32, DIGEST_LEN); + memset(fp4.first, 0x41, DIGEST_LEN); + memset(fp4.second, 0x42, DIGEST_LEN); + memset(fp5.first, 0x51, DIGEST_LEN); + memset(fp5.second, 0x52, DIGEST_LEN); + memset(fp6.first, 0x61, DIGEST_LEN); + memset(fp6.second, 0x62, DIGEST_LEN); + + v = fp_pair_map_set(map, &fp1, v99); + tt_ptr_op(v, OP_EQ, NULL); + tt_assert(!fp_pair_map_isempty(map)); + v = fp_pair_map_set(map, &fp2, v101); + tt_ptr_op(v, OP_EQ, NULL); + v = fp_pair_map_set(map, &fp1, v100); + tt_ptr_op(v, OP_EQ, v99); + tt_ptr_op(fp_pair_map_get(map, &fp1),OP_EQ, v100); + tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, v101); + tt_ptr_op(fp_pair_map_get(map, &fp3),OP_EQ, NULL); + fp_pair_map_assert_ok(map); + + v = fp_pair_map_remove(map, &fp2); + fp_pair_map_assert_ok(map); + tt_ptr_op(v,OP_EQ, v101); + tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, NULL); + tt_ptr_op(fp_pair_map_remove(map, &fp2),OP_EQ, NULL); + + fp_pair_map_set(map, &fp2, v101); + fp_pair_map_set(map, &fp3, v102); + fp_pair_map_set(map, &fp4, v103); + tt_int_op(fp_pair_map_size(map),OP_EQ, 4); + fp_pair_map_assert_ok(map); + fp_pair_map_set(map, &fp5, v104); + fp_pair_map_set_by_digests(map, fp6.first, fp6.second, v105); + fp_pair_map_assert_ok(map); + + /* Test iterator. */ + iter = fp_pair_map_iter_init(map); + while (!fp_pair_map_iter_done(iter)) { + fp_pair_map_iter_get(iter, &k, &v); + tt_ptr_op(v,OP_EQ, fp_pair_map_get(map, &k)); + + if (tor_memeq(&fp2, &k, sizeof(fp2))) { + iter = fp_pair_map_iter_next_rmv(map, iter); + } else { + iter = fp_pair_map_iter_next(map, iter); + } + } + + /* Make sure we removed fp2, but not the others. */ + tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, NULL); + tt_ptr_op(fp_pair_map_get_by_digests(map, fp5.first, fp5.second), + OP_EQ, v104); + + fp_pair_map_assert_ok(map); + /* Clean up after ourselves. */ + fp_pair_map_free(map, NULL); + map = NULL; + + done: + if (map) + fp_pair_map_free(map, NULL); + tor_free(v99); + tor_free(v100); + tor_free(v101); + tor_free(v102); + tor_free(v103); + tor_free(v104); + tor_free(v105); +} + +static void +test_container_smartlist_most_frequent(void *arg) +{ + (void) arg; + smartlist_t *sl = smartlist_new(); + + int count = -1; + const char *cp; + + cp = smartlist_get_most_frequent_string_(sl, &count); + tt_int_op(count, OP_EQ, 0); + tt_ptr_op(cp, OP_EQ, NULL); + + /* String must be sorted before we call get_most_frequent */ + smartlist_split_string(sl, "abc:def:ghi", ":", 0, 0); + + cp = smartlist_get_most_frequent_string_(sl, &count); + tt_int_op(count, OP_EQ, 1); + tt_str_op(cp, OP_EQ, "ghi"); /* Ties broken in favor of later element */ + + smartlist_split_string(sl, "def:ghi", ":", 0, 0); + smartlist_sort_strings(sl); + + cp = smartlist_get_most_frequent_string_(sl, &count); + tt_int_op(count, OP_EQ, 2); + tt_ptr_op(cp, OP_NE, NULL); + tt_str_op(cp, OP_EQ, "ghi"); /* Ties broken in favor of later element */ + + smartlist_split_string(sl, "def:abc:qwop", ":", 0, 0); + smartlist_sort_strings(sl); + + cp = smartlist_get_most_frequent_string_(sl, &count); + tt_int_op(count, OP_EQ, 3); + tt_ptr_op(cp, OP_NE, NULL); + tt_str_op(cp, OP_EQ, "def"); /* No tie */ + + done: + SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + smartlist_free(sl); +} + +static void +test_container_smartlist_sort_ptrs(void *arg) +{ + (void)arg; + int array[10]; + int *arrayptrs[11]; + smartlist_t *sl = smartlist_new(); + unsigned i=0, j; + + for (j = 0; j < ARRAY_LENGTH(array); ++j) { + smartlist_add(sl, &array[j]); + arrayptrs[i++] = &array[j]; + if (j == 5) { + smartlist_add(sl, &array[j]); + arrayptrs[i++] = &array[j]; + } + } + + for (i = 0; i < 10; ++i) { + smartlist_shuffle(sl); + smartlist_sort_pointers(sl); + for (j = 0; j < ARRAY_LENGTH(arrayptrs); ++j) { + tt_ptr_op(smartlist_get(sl, j), OP_EQ, arrayptrs[j]); + } + } + + done: + smartlist_free(sl); +} + +static void +test_container_smartlist_strings_eq(void *arg) +{ + (void)arg; + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); +#define EQ_SHOULD_SAY(s1,s2,val) \ + do { \ + SMARTLIST_FOREACH(sl1, char *, cp, tor_free(cp)); \ + SMARTLIST_FOREACH(sl2, char *, cp, tor_free(cp)); \ + smartlist_clear(sl1); \ + smartlist_clear(sl2); \ + smartlist_split_string(sl1, (s1), ":", 0, 0); \ + smartlist_split_string(sl2, (s2), ":", 0, 0); \ + tt_int_op((val), OP_EQ, smartlist_strings_eq(sl1, sl2)); \ + } while (0) + + /* Both NULL, so equal */ + tt_int_op(1, OP_EQ, smartlist_strings_eq(NULL, NULL)); + + /* One NULL, not equal. */ + tt_int_op(0, OP_EQ, smartlist_strings_eq(NULL, sl1)); + tt_int_op(0, OP_EQ, smartlist_strings_eq(sl1, NULL)); + + /* Both empty, both equal. */ + EQ_SHOULD_SAY("", "", 1); + + /* One empty, not equal */ + EQ_SHOULD_SAY("", "ab", 0); + EQ_SHOULD_SAY("", "xy:z", 0); + EQ_SHOULD_SAY("abc", "", 0); + EQ_SHOULD_SAY("abc:cd", "", 0); + + /* Different lengths, not equal. */ + EQ_SHOULD_SAY("hello:world", "hello", 0); + EQ_SHOULD_SAY("hello", "hello:friends", 0); + + /* Same lengths, not equal */ + EQ_SHOULD_SAY("Hello:world", "goodbye:world", 0); + EQ_SHOULD_SAY("Hello:world", "Hello:stars", 0); + + /* Actually equal */ + EQ_SHOULD_SAY("ABC", "ABC", 1); + EQ_SHOULD_SAY(" ab : cd : e", " ab : cd : e", 1); + + done: + SMARTLIST_FOREACH(sl1, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(sl2, char *, cp, tor_free(cp)); + smartlist_free(sl1); + smartlist_free(sl2); +} + +#define CONTAINER_LEGACY(name) \ + { #name, test_container_ ## name , 0, NULL, NULL } + +#define CONTAINER(name, flags) \ + { #name, test_container_ ## name, (flags), NULL, NULL } + +struct testcase_t container_tests[] = { + CONTAINER_LEGACY(smartlist_basic), + CONTAINER_LEGACY(smartlist_strings), + CONTAINER_LEGACY(smartlist_overlap), + CONTAINER_LEGACY(smartlist_digests), + CONTAINER_LEGACY(smartlist_join), + CONTAINER_LEGACY(smartlist_pos), + CONTAINER(smartlist_remove, 0), + CONTAINER(smartlist_ints_eq, 0), + CONTAINER_LEGACY(bitarray), + CONTAINER_LEGACY(digestset), + CONTAINER_LEGACY(strmap), + CONTAINER_LEGACY(pqueue), + CONTAINER_LEGACY(order_functions), + CONTAINER(di_map, 0), + CONTAINER_LEGACY(fp_pair_map), + CONTAINER(smartlist_most_frequent, 0), + CONTAINER(smartlist_sort_ptrs, 0), + CONTAINER(smartlist_strings_eq, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_controller.c b/src/wraith/src/test/test_controller.c new file mode 100644 index 000000000..af19f63f6 --- /dev/null +++ b/src/wraith/src/test/test_controller.c @@ -0,0 +1,1485 @@ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONTROL_PRIVATE +#include "or.h" +#include "bridges.h" +#include "control.h" +#include "entrynodes.h" +#include "hs_common.h" +#include "networkstatus.h" +#include "rendservice.h" +#include "routerlist.h" +#include "test.h" +#include "test_helpers.h" + +static void +test_add_onion_helper_keyarg_v3(void *arg) +{ + int ret, hs_version; + add_onion_secret_key_t pk; + char *key_new_blob = NULL; + char *err_msg = NULL; + const char *key_new_alg = NULL; + + (void) arg; + + memset(&pk, 0, sizeof(pk)); + + /* Test explicit ED25519-V3 key generation. */ + ret = add_onion_helper_keyarg("NEW:ED25519-V3", 0, &key_new_alg, + &key_new_blob, &pk, &hs_version, + &err_msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE); + tt_assert(pk.v3); + tt_str_op(key_new_alg, OP_EQ, "ED25519-V3"); + tt_assert(key_new_blob); + tt_ptr_op(err_msg, OP_EQ, NULL); + tor_free(pk.v3); pk.v3 = NULL; + tor_free(key_new_blob); + + /* Test discarding the private key. */ + ret = add_onion_helper_keyarg("NEW:ED25519-V3", 1, &key_new_alg, + &key_new_blob, &pk, &hs_version, + &err_msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE); + tt_assert(pk.v3); + tt_ptr_op(key_new_alg, OP_EQ, NULL); + tt_ptr_op(key_new_blob, OP_EQ, NULL); + tt_ptr_op(err_msg, OP_EQ, NULL); + tor_free(pk.v3); pk.v3 = NULL; + tor_free(key_new_blob); + + /* Test passing a key blob. */ + { + /* The base64 key and hex key are the same. Hex key is 64 bytes long. The + * sk has been generated randomly using python3. */ + const char *base64_sk = + "a9bT19PqGC9Y+BmOo1IQvCGjjwxMiaaxEXZ+FKMxpEQW" + "6AmSV5roThUGMRCaqQSCnR2jI1vL2QxHORzI4RxMmw=="; + const char *hex_sk = + "\x6b\xd6\xd3\xd7\xd3\xea\x18\x2f\x58\xf8\x19\x8e\xa3\x52\x10\xbc" + "\x21\xa3\x8f\x0c\x4c\x89\xa6\xb1\x11\x76\x7e\x14\xa3\x31\xa4\x44" + "\x16\xe8\x09\x92\x57\x9a\xe8\x4e\x15\x06\x31\x10\x9a\xa9\x04\x82" + "\x9d\x1d\xa3\x23\x5b\xcb\xd9\x0c\x47\x39\x1c\xc8\xe1\x1c\x4c\x9b"; + char *key_blob = NULL; + + tor_asprintf(&key_blob, "ED25519-V3:%s", base64_sk); + tt_assert(key_blob); + ret = add_onion_helper_keyarg(key_blob, 1, &key_new_alg, + &key_new_blob, &pk, &hs_version, + &err_msg); + tor_free(key_blob); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE); + tt_assert(pk.v3); + tt_mem_op(pk.v3, OP_EQ, hex_sk, 64); + tt_ptr_op(key_new_alg, OP_EQ, NULL); + tt_ptr_op(key_new_blob, OP_EQ, NULL); + tt_ptr_op(err_msg, OP_EQ, NULL); + tor_free(pk.v3); pk.v3 = NULL; + tor_free(key_new_blob); + } + + done: + tor_free(pk.v3); + tor_free(key_new_blob); + tor_free(err_msg); +} + +static void +test_add_onion_helper_keyarg_v2(void *arg) +{ + int ret, hs_version; + add_onion_secret_key_t pk; + crypto_pk_t *pk1 = NULL; + const char *key_new_alg = NULL; + char *key_new_blob = NULL; + char *err_msg = NULL; + char *encoded = NULL; + char *arg_str = NULL; + + (void) arg; + + memset(&pk, 0, sizeof(pk)); + + /* Test explicit RSA1024 key generation. */ + ret = add_onion_helper_keyarg("NEW:RSA1024", 0, &key_new_alg, &key_new_blob, + &pk, &hs_version, &err_msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); + tt_assert(pk.v2); + tt_str_op(key_new_alg, OP_EQ, "RSA1024"); + tt_assert(key_new_blob); + tt_ptr_op(err_msg, OP_EQ, NULL); + + /* Test "BEST" key generation (Assumes BEST = RSA1024). */ + crypto_pk_free(pk.v2); pk.v2 = NULL; + tor_free(key_new_blob); + ret = add_onion_helper_keyarg("NEW:BEST", 0, &key_new_alg, &key_new_blob, + &pk, &hs_version, &err_msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); + tt_assert(pk.v2); + tt_str_op(key_new_alg, OP_EQ, "RSA1024"); + tt_assert(key_new_blob); + tt_ptr_op(err_msg, OP_EQ, NULL); + + /* Test discarding the private key. */ + crypto_pk_free(pk.v2); pk.v2 = NULL; + tor_free(key_new_blob); + ret = add_onion_helper_keyarg("NEW:BEST", 1, &key_new_alg, &key_new_blob, + &pk, &hs_version, &err_msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); + tt_assert(pk.v2); + tt_ptr_op(key_new_alg, OP_EQ, NULL); + tt_ptr_op(key_new_blob, OP_EQ, NULL); + tt_ptr_op(err_msg, OP_EQ, NULL); + + /* Test generating a invalid key type. */ + crypto_pk_free(pk.v2); pk.v2 = NULL; + ret = add_onion_helper_keyarg("NEW:RSA512", 0, &key_new_alg, &key_new_blob, + &pk, &hs_version, &err_msg); + tt_int_op(ret, OP_EQ, -1); + tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); + tt_assert(!pk.v2); + tt_ptr_op(key_new_alg, OP_EQ, NULL); + tt_ptr_op(key_new_blob, OP_EQ, NULL); + tt_assert(err_msg); + + /* Test loading a RSA1024 key. */ + tor_free(err_msg); + pk1 = pk_generate(0); + tt_int_op(0, OP_EQ, crypto_pk_base64_encode(pk1, &encoded)); + tor_asprintf(&arg_str, "RSA1024:%s", encoded); + ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob, + &pk, &hs_version, &err_msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); + tt_assert(pk.v2); + tt_ptr_op(key_new_alg, OP_EQ, NULL); + tt_ptr_op(key_new_blob, OP_EQ, NULL); + tt_ptr_op(err_msg, OP_EQ, NULL); + tt_int_op(crypto_pk_cmp_keys(pk1, pk.v2), OP_EQ, 0); + + /* Test loading a invalid key type. */ + tor_free(arg_str); + crypto_pk_free(pk1); pk1 = NULL; + crypto_pk_free(pk.v2); pk.v2 = NULL; + tor_asprintf(&arg_str, "RSA512:%s", encoded); + ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob, + &pk, &hs_version, &err_msg); + tt_int_op(ret, OP_EQ, -1); + tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); + tt_assert(!pk.v2); + tt_ptr_op(key_new_alg, OP_EQ, NULL); + tt_ptr_op(key_new_blob, OP_EQ, NULL); + tt_assert(err_msg); + + /* Test loading a invalid key. */ + tor_free(arg_str); + crypto_pk_free(pk.v2); pk.v2 = NULL; + tor_free(err_msg); + encoded[strlen(encoded)/2] = '\0'; + tor_asprintf(&arg_str, "RSA1024:%s", encoded); + ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob, + &pk, &hs_version, &err_msg); + tt_int_op(ret, OP_EQ, -1); + tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); + tt_assert(!pk.v2); + tt_ptr_op(key_new_alg, OP_EQ, NULL); + tt_ptr_op(key_new_blob, OP_EQ, NULL); + tt_assert(err_msg); + + done: + crypto_pk_free(pk1); + crypto_pk_free(pk.v2); + tor_free(key_new_blob); + tor_free(err_msg); + tor_free(encoded); + tor_free(arg_str); +} + +static void +test_getinfo_helper_onion(void *arg) +{ + (void)arg; + control_connection_t dummy; + /* Get results out */ + char *answer = NULL; + const char *errmsg = NULL; + char *service_id = NULL; + int rt = 0; + + dummy.ephemeral_onion_services = NULL; + + /* successfully get an empty answer */ + rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg); + tt_int_op(rt, OP_EQ, 0); + tt_str_op(answer, OP_EQ, ""); + tor_free(answer); + + /* successfully get an empty answer */ + rt = getinfo_helper_onions(&dummy, "onions/detached", &answer, &errmsg); + tt_int_op(rt, OP_EQ, 0); + tt_str_op(answer, OP_EQ, ""); + tor_free(answer); + + /* get an answer for one onion service */ + service_id = tor_strdup("dummy_onion_id"); + dummy.ephemeral_onion_services = smartlist_new(); + smartlist_add(dummy.ephemeral_onion_services, service_id); + rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg); + tt_int_op(rt, OP_EQ, 0); + tt_str_op(answer, OP_EQ, "dummy_onion_id"); + + done: + tor_free(answer); + tor_free(service_id); + smartlist_free(dummy.ephemeral_onion_services); +} + +static void +test_rend_service_parse_port_config(void *arg) +{ + const char *sep = ","; + rend_service_port_config_t *cfg = NULL; + char *err_msg = NULL; + + (void)arg; + + /* Test "VIRTPORT" only. */ + cfg = rend_service_parse_port_config("80", sep, &err_msg); + tt_assert(cfg); + tt_ptr_op(err_msg, OP_EQ, NULL); + + /* Test "VIRTPORT,TARGET" (Target is port). */ + rend_service_port_config_free(cfg); + cfg = rend_service_parse_port_config("80,8080", sep, &err_msg); + tt_assert(cfg); + tt_ptr_op(err_msg, OP_EQ, NULL); + + /* Test "VIRTPORT,TARGET" (Target is IPv4:port). */ + rend_service_port_config_free(cfg); + cfg = rend_service_parse_port_config("80,192.0.2.1:8080", sep, &err_msg); + tt_assert(cfg); + tt_ptr_op(err_msg, OP_EQ, NULL); + + /* Test "VIRTPORT,TARGET" (Target is IPv6:port). */ + rend_service_port_config_free(cfg); + cfg = rend_service_parse_port_config("80,[2001:db8::1]:8080", sep, &err_msg); + tt_assert(cfg); + tt_ptr_op(err_msg, OP_EQ, NULL); + rend_service_port_config_free(cfg); + cfg = NULL; + + /* XXX: Someone should add tests for AF_UNIX targets if supported. */ + + /* Test empty config. */ + rend_service_port_config_free(cfg); + cfg = rend_service_parse_port_config("", sep, &err_msg); + tt_ptr_op(cfg, OP_EQ, NULL); + tt_assert(err_msg); + + /* Test invalid port. */ + tor_free(err_msg); + cfg = rend_service_parse_port_config("90001", sep, &err_msg); + tt_ptr_op(cfg, OP_EQ, NULL); + tt_assert(err_msg); + tor_free(err_msg); + + /* unix port */ + cfg = NULL; + + /* quoted unix port */ + tor_free(err_msg); + cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"", + " ", &err_msg); + tt_assert(cfg); + tt_ptr_op(err_msg, OP_EQ, NULL); + rend_service_port_config_free(cfg); + cfg = NULL; + + /* quoted unix port */ + tor_free(err_msg); + cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"", + " ", &err_msg); + tt_assert(cfg); + tt_ptr_op(err_msg, OP_EQ, NULL); + rend_service_port_config_free(cfg); + cfg = NULL; + + /* quoted unix port, missing end quote */ + cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar", + " ", &err_msg); + tt_ptr_op(cfg, OP_EQ, NULL); + tt_str_op(err_msg, OP_EQ, "Couldn't process address " + "from hidden service configuration"); + tor_free(err_msg); + + /* bogus IP address */ + MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); + cfg = rend_service_parse_port_config("100 foo!!.example.com:9000", + " ", &err_msg); + UNMOCK(tor_addr_lookup); + tt_ptr_op(cfg, OP_EQ, NULL); + tt_str_op(err_msg, OP_EQ, "Unparseable address in hidden service port " + "configuration."); + tor_free(err_msg); + + /* bogus port port */ + cfg = rend_service_parse_port_config("100 99999", + " ", &err_msg); + tt_ptr_op(cfg, OP_EQ, NULL); + tt_str_op(err_msg, OP_EQ, "Unparseable or out-of-range port \"99999\" " + "in hidden service port configuration."); + tor_free(err_msg); + + done: + rend_service_port_config_free(cfg); + tor_free(err_msg); +} + +static void +test_add_onion_helper_clientauth(void *arg) +{ + rend_authorized_client_t *client = NULL; + char *err_msg = NULL; + int created = 0; + + (void)arg; + + /* Test "ClientName" only. */ + client = add_onion_helper_clientauth("alice", &created, &err_msg); + tt_assert(client); + tt_assert(created); + tt_ptr_op(err_msg, OP_EQ, NULL); + rend_authorized_client_free(client); + + /* Test "ClientName:Blob" */ + client = add_onion_helper_clientauth("alice:475hGBHPlq7Mc0cRZitK/B", + &created, &err_msg); + tt_assert(client); + tt_assert(!created); + tt_ptr_op(err_msg, OP_EQ, NULL); + rend_authorized_client_free(client); + + /* Test invalid client names */ + client = add_onion_helper_clientauth("no*asterisks*allowed", &created, + &err_msg); + tt_ptr_op(client, OP_EQ, NULL); + tt_assert(err_msg); + tor_free(err_msg); + + /* Test invalid auth cookie */ + client = add_onion_helper_clientauth("alice:12345", &created, &err_msg); + tt_ptr_op(client, OP_EQ, NULL); + tt_assert(err_msg); + tor_free(err_msg); + + /* Test invalid syntax */ + client = add_onion_helper_clientauth(":475hGBHPlq7Mc0cRZitK/B", &created, + &err_msg); + tt_ptr_op(client, OP_EQ, NULL); + tt_assert(err_msg); + tor_free(err_msg); + + done: + rend_authorized_client_free(client); + tor_free(err_msg); +} + +/* Mocks and data/variables used for GETINFO download status tests */ + +static const download_status_t dl_status_default = + { 0, 0, 0, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER, + DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }; +static download_status_t ns_dl_status[N_CONSENSUS_FLAVORS]; +static download_status_t ns_dl_status_bootstrap[N_CONSENSUS_FLAVORS]; +static download_status_t ns_dl_status_running[N_CONSENSUS_FLAVORS]; + +/* + * These should explore all the possible cases of download_status_to_string() + * in control.c + */ +static const download_status_t dls_sample_1 = + { 1467163900, 0, 0, DL_SCHED_GENERIC, DL_WANT_ANY_DIRSERVER, + DL_SCHED_INCREMENT_FAILURE, DL_SCHED_DETERMINISTIC, 0, 0 }; +static const char * dls_sample_1_str = + "next-attempt-at 2016-06-29 01:31:40\n" + "n-download-failures 0\n" + "n-download-attempts 0\n" + "schedule DL_SCHED_GENERIC\n" + "want-authority DL_WANT_ANY_DIRSERVER\n" + "increment-on DL_SCHED_INCREMENT_FAILURE\n" + "backoff DL_SCHED_DETERMINISTIC\n"; +static const download_status_t dls_sample_2 = + { 1467164400, 1, 2, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY, + DL_SCHED_INCREMENT_FAILURE, DL_SCHED_DETERMINISTIC, 0, 0 }; +static const char * dls_sample_2_str = + "next-attempt-at 2016-06-29 01:40:00\n" + "n-download-failures 1\n" + "n-download-attempts 2\n" + "schedule DL_SCHED_CONSENSUS\n" + "want-authority DL_WANT_AUTHORITY\n" + "increment-on DL_SCHED_INCREMENT_FAILURE\n" + "backoff DL_SCHED_DETERMINISTIC\n"; +static const download_status_t dls_sample_3 = + { 1467154400, 12, 25, DL_SCHED_BRIDGE, DL_WANT_ANY_DIRSERVER, + DL_SCHED_INCREMENT_ATTEMPT, DL_SCHED_DETERMINISTIC, 0, 0 }; +static const char * dls_sample_3_str = + "next-attempt-at 2016-06-28 22:53:20\n" + "n-download-failures 12\n" + "n-download-attempts 25\n" + "schedule DL_SCHED_BRIDGE\n" + "want-authority DL_WANT_ANY_DIRSERVER\n" + "increment-on DL_SCHED_INCREMENT_ATTEMPT\n" + "backoff DL_SCHED_DETERMINISTIC\n"; +static const download_status_t dls_sample_4 = + { 1467166600, 3, 0, DL_SCHED_GENERIC, DL_WANT_ANY_DIRSERVER, + DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }; +static const char * dls_sample_4_str = + "next-attempt-at 2016-06-29 02:16:40\n" + "n-download-failures 3\n" + "n-download-attempts 0\n" + "schedule DL_SCHED_GENERIC\n" + "want-authority DL_WANT_ANY_DIRSERVER\n" + "increment-on DL_SCHED_INCREMENT_FAILURE\n" + "backoff DL_SCHED_RANDOM_EXPONENTIAL\n" + "last-backoff-position 0\n" + "last-delay-used 0\n"; +static const download_status_t dls_sample_5 = + { 1467164600, 3, 7, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER, + DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 1, 2112, }; +static const char * dls_sample_5_str = + "next-attempt-at 2016-06-29 01:43:20\n" + "n-download-failures 3\n" + "n-download-attempts 7\n" + "schedule DL_SCHED_CONSENSUS\n" + "want-authority DL_WANT_ANY_DIRSERVER\n" + "increment-on DL_SCHED_INCREMENT_FAILURE\n" + "backoff DL_SCHED_RANDOM_EXPONENTIAL\n" + "last-backoff-position 1\n" + "last-delay-used 2112\n"; +static const download_status_t dls_sample_6 = + { 1467164200, 4, 9, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY, + DL_SCHED_INCREMENT_ATTEMPT, DL_SCHED_RANDOM_EXPONENTIAL, 3, 432 }; +static const char * dls_sample_6_str = + "next-attempt-at 2016-06-29 01:36:40\n" + "n-download-failures 4\n" + "n-download-attempts 9\n" + "schedule DL_SCHED_CONSENSUS\n" + "want-authority DL_WANT_AUTHORITY\n" + "increment-on DL_SCHED_INCREMENT_ATTEMPT\n" + "backoff DL_SCHED_RANDOM_EXPONENTIAL\n" + "last-backoff-position 3\n" + "last-delay-used 432\n"; + +/* Simulated auth certs */ +static const char *auth_id_digest_1_str = + "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061"; +static download_status_t auth_def_cert_download_status_1; +static const char *auth_id_digest_2_str = + "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99"; +static download_status_t auth_def_cert_download_status_2; +/* Expected form of digest list returned for GETINFO downloads/cert/fps */ +static const char *auth_id_digest_expected_list = + "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061\n" + "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99\n"; + +/* Signing keys for simulated auth 1 */ +static const char *auth_1_sk_1_str = + "AA69566029B1F023BA09451B8F1B10952384EB58"; +static download_status_t auth_1_sk_1_dls; +static const char *auth_1_sk_2_str = + "710865C7F06B73C5292695A8C34F1C94F769FF72"; +static download_status_t auth_1_sk_2_dls; +/* + * Expected form of sk digest list for + * GETINFO downloads/cert//sks + */ +static const char *auth_1_sk_digest_expected_list = + "AA69566029B1F023BA09451B8F1B10952384EB58\n" + "710865C7F06B73C5292695A8C34F1C94F769FF72\n"; + +/* Signing keys for simulated auth 2 */ +static const char *auth_2_sk_1_str = + "4299047E00D070AD6703FE00BE7AA756DB061E62"; +static download_status_t auth_2_sk_1_dls; +static const char *auth_2_sk_2_str = + "9451B8F1B10952384EB58B5F230C0BB701626C9B"; +static download_status_t auth_2_sk_2_dls; +/* + * Expected form of sk digest list for + * GETINFO downloads/cert//sks + */ +static const char *auth_2_sk_digest_expected_list = + "4299047E00D070AD6703FE00BE7AA756DB061E62\n" + "9451B8F1B10952384EB58B5F230C0BB701626C9B\n"; + +/* Simulated router descriptor digests or bridge identity digests */ +static const char *descbr_digest_1_str = + "616408544C7345822696074A1A3DFA16AB381CBD"; +static download_status_t descbr_digest_1_dl; +static const char *descbr_digest_2_str = + "06E8067246967265DBCB6641631B530EFEC12DC3"; +static download_status_t descbr_digest_2_dl; +/* Expected form of digest list returned for GETINFO downloads/desc/descs */ +static const char *descbr_expected_list = + "616408544C7345822696074A1A3DFA16AB381CBD\n" + "06E8067246967265DBCB6641631B530EFEC12DC3\n"; +/* + * Flag to make all descbr queries fail, to simulate not being + * configured such that such queries make sense. + */ +static int disable_descbr = 0; + +static void +reset_mocked_dl_statuses(void) +{ + int i; + + for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { + memcpy(&(ns_dl_status[i]), &dl_status_default, + sizeof(download_status_t)); + memcpy(&(ns_dl_status_bootstrap[i]), &dl_status_default, + sizeof(download_status_t)); + memcpy(&(ns_dl_status_running[i]), &dl_status_default, + sizeof(download_status_t)); + } + + memcpy(&auth_def_cert_download_status_1, &dl_status_default, + sizeof(download_status_t)); + memcpy(&auth_def_cert_download_status_2, &dl_status_default, + sizeof(download_status_t)); + memcpy(&auth_1_sk_1_dls, &dl_status_default, + sizeof(download_status_t)); + memcpy(&auth_1_sk_2_dls, &dl_status_default, + sizeof(download_status_t)); + memcpy(&auth_2_sk_1_dls, &dl_status_default, + sizeof(download_status_t)); + memcpy(&auth_2_sk_2_dls, &dl_status_default, + sizeof(download_status_t)); + + memcpy(&descbr_digest_1_dl, &dl_status_default, + sizeof(download_status_t)); + memcpy(&descbr_digest_2_dl, &dl_status_default, + sizeof(download_status_t)); +} + +static download_status_t * +ns_dl_status_mock(consensus_flavor_t flavor) +{ + return &(ns_dl_status[flavor]); +} + +static download_status_t * +ns_dl_status_bootstrap_mock(consensus_flavor_t flavor) +{ + return &(ns_dl_status_bootstrap[flavor]); +} + +static download_status_t * +ns_dl_status_running_mock(consensus_flavor_t flavor) +{ + return &(ns_dl_status_running[flavor]); +} + +static void +setup_ns_mocks(void) +{ + MOCK(networkstatus_get_dl_status_by_flavor, ns_dl_status_mock); + MOCK(networkstatus_get_dl_status_by_flavor_bootstrap, + ns_dl_status_bootstrap_mock); + MOCK(networkstatus_get_dl_status_by_flavor_running, + ns_dl_status_running_mock); + reset_mocked_dl_statuses(); +} + +static void +clear_ns_mocks(void) +{ + UNMOCK(networkstatus_get_dl_status_by_flavor); + UNMOCK(networkstatus_get_dl_status_by_flavor_bootstrap); + UNMOCK(networkstatus_get_dl_status_by_flavor_running); +} + +static smartlist_t * +cert_dl_status_auth_ids_mock(void) +{ + char digest[DIGEST_LEN], *tmp; + int len; + smartlist_t *list = NULL; + + /* Just pretend we have only the two hard-coded digests listed above */ + list = smartlist_new(); + len = base16_decode(digest, DIGEST_LEN, + auth_id_digest_1_str, strlen(auth_id_digest_1_str)); + tt_int_op(len, OP_EQ, DIGEST_LEN); + tmp = tor_malloc(DIGEST_LEN); + memcpy(tmp, digest, DIGEST_LEN); + smartlist_add(list, tmp); + len = base16_decode(digest, DIGEST_LEN, + auth_id_digest_2_str, strlen(auth_id_digest_2_str)); + tt_int_op(len, OP_EQ, DIGEST_LEN); + tmp = tor_malloc(DIGEST_LEN); + memcpy(tmp, digest, DIGEST_LEN); + smartlist_add(list, tmp); + + done: + return list; +} + +static download_status_t * +cert_dl_status_def_for_auth_mock(const char *digest) +{ + download_status_t *dl = NULL; + char digest_str[HEX_DIGEST_LEN+1]; + + tt_ptr_op(digest, OP_NE, NULL); + base16_encode(digest_str, HEX_DIGEST_LEN + 1, + digest, DIGEST_LEN); + digest_str[HEX_DIGEST_LEN] = '\0'; + + if (strcmp(digest_str, auth_id_digest_1_str) == 0) { + dl = &auth_def_cert_download_status_1; + } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) { + dl = &auth_def_cert_download_status_2; + } + + done: + return dl; +} + +static smartlist_t * +cert_dl_status_sks_for_auth_id_mock(const char *digest) +{ + smartlist_t *list = NULL; + char sk[DIGEST_LEN]; + char digest_str[HEX_DIGEST_LEN+1]; + char *tmp; + int len; + + tt_ptr_op(digest, OP_NE, NULL); + base16_encode(digest_str, HEX_DIGEST_LEN + 1, + digest, DIGEST_LEN); + digest_str[HEX_DIGEST_LEN] = '\0'; + + /* + * Build a list of two hard-coded digests, depending on what we + * were just passed. + */ + if (strcmp(digest_str, auth_id_digest_1_str) == 0) { + list = smartlist_new(); + len = base16_decode(sk, DIGEST_LEN, + auth_1_sk_1_str, strlen(auth_1_sk_1_str)); + tt_int_op(len, OP_EQ, DIGEST_LEN); + tmp = tor_malloc(DIGEST_LEN); + memcpy(tmp, sk, DIGEST_LEN); + smartlist_add(list, tmp); + len = base16_decode(sk, DIGEST_LEN, + auth_1_sk_2_str, strlen(auth_1_sk_2_str)); + tt_int_op(len, OP_EQ, DIGEST_LEN); + tmp = tor_malloc(DIGEST_LEN); + memcpy(tmp, sk, DIGEST_LEN); + smartlist_add(list, tmp); + } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) { + list = smartlist_new(); + len = base16_decode(sk, DIGEST_LEN, + auth_2_sk_1_str, strlen(auth_2_sk_1_str)); + tt_int_op(len, OP_EQ, DIGEST_LEN); + tmp = tor_malloc(DIGEST_LEN); + memcpy(tmp, sk, DIGEST_LEN); + smartlist_add(list, tmp); + len = base16_decode(sk, DIGEST_LEN, + auth_2_sk_2_str, strlen(auth_2_sk_2_str)); + tt_int_op(len, OP_EQ, DIGEST_LEN); + tmp = tor_malloc(DIGEST_LEN); + memcpy(tmp, sk, DIGEST_LEN); + smartlist_add(list, tmp); + } + + done: + return list; +} + +static download_status_t * +cert_dl_status_fp_sk_mock(const char *fp_digest, const char *sk_digest) +{ + download_status_t *dl = NULL; + char fp_digest_str[HEX_DIGEST_LEN+1], sk_digest_str[HEX_DIGEST_LEN+1]; + + /* + * Unpack the digests so we can compare them and figure out which + * dl status we want. + */ + + tt_ptr_op(fp_digest, OP_NE, NULL); + base16_encode(fp_digest_str, HEX_DIGEST_LEN + 1, + fp_digest, DIGEST_LEN); + fp_digest_str[HEX_DIGEST_LEN] = '\0'; + tt_ptr_op(sk_digest, OP_NE, NULL); + base16_encode(sk_digest_str, HEX_DIGEST_LEN + 1, + sk_digest, DIGEST_LEN); + sk_digest_str[HEX_DIGEST_LEN] = '\0'; + + if (strcmp(fp_digest_str, auth_id_digest_1_str) == 0) { + if (strcmp(sk_digest_str, auth_1_sk_1_str) == 0) { + dl = &auth_1_sk_1_dls; + } else if (strcmp(sk_digest_str, auth_1_sk_2_str) == 0) { + dl = &auth_1_sk_2_dls; + } + } else if (strcmp(fp_digest_str, auth_id_digest_2_str) == 0) { + if (strcmp(sk_digest_str, auth_2_sk_1_str) == 0) { + dl = &auth_2_sk_1_dls; + } else if (strcmp(sk_digest_str, auth_2_sk_2_str) == 0) { + dl = &auth_2_sk_2_dls; + } + } + + done: + return dl; +} + +static void +setup_cert_mocks(void) +{ + MOCK(list_authority_ids_with_downloads, cert_dl_status_auth_ids_mock); + MOCK(id_only_download_status_for_authority_id, + cert_dl_status_def_for_auth_mock); + MOCK(list_sk_digests_for_authority_id, + cert_dl_status_sks_for_auth_id_mock); + MOCK(download_status_for_authority_id_and_sk, + cert_dl_status_fp_sk_mock); + reset_mocked_dl_statuses(); +} + +static void +clear_cert_mocks(void) +{ + UNMOCK(list_authority_ids_with_downloads); + UNMOCK(id_only_download_status_for_authority_id); + UNMOCK(list_sk_digests_for_authority_id); + UNMOCK(download_status_for_authority_id_and_sk); +} + +static smartlist_t * +descbr_get_digests_mock(void) +{ + char digest[DIGEST_LEN], *tmp; + int len; + smartlist_t *list = NULL; + + if (!disable_descbr) { + /* Just pretend we have only the two hard-coded digests listed above */ + list = smartlist_new(); + len = base16_decode(digest, DIGEST_LEN, + descbr_digest_1_str, strlen(descbr_digest_1_str)); + tt_int_op(len, OP_EQ, DIGEST_LEN); + tmp = tor_malloc(DIGEST_LEN); + memcpy(tmp, digest, DIGEST_LEN); + smartlist_add(list, tmp); + len = base16_decode(digest, DIGEST_LEN, + descbr_digest_2_str, strlen(descbr_digest_2_str)); + tt_int_op(len, OP_EQ, DIGEST_LEN); + tmp = tor_malloc(DIGEST_LEN); + memcpy(tmp, digest, DIGEST_LEN); + smartlist_add(list, tmp); + } + + done: + return list; +} + +static download_status_t * +descbr_get_dl_by_digest_mock(const char *digest) +{ + download_status_t *dl = NULL; + char digest_str[HEX_DIGEST_LEN+1]; + + if (!disable_descbr) { + tt_ptr_op(digest, OP_NE, NULL); + base16_encode(digest_str, HEX_DIGEST_LEN + 1, + digest, DIGEST_LEN); + digest_str[HEX_DIGEST_LEN] = '\0'; + + if (strcmp(digest_str, descbr_digest_1_str) == 0) { + dl = &descbr_digest_1_dl; + } else if (strcmp(digest_str, descbr_digest_2_str) == 0) { + dl = &descbr_digest_2_dl; + } + } + + done: + return dl; +} + +static void +setup_desc_mocks(void) +{ + MOCK(router_get_descriptor_digests, + descbr_get_digests_mock); + MOCK(router_get_dl_status_by_descriptor_digest, + descbr_get_dl_by_digest_mock); + reset_mocked_dl_statuses(); +} + +static void +clear_desc_mocks(void) +{ + UNMOCK(router_get_descriptor_digests); + UNMOCK(router_get_dl_status_by_descriptor_digest); +} + +static void +setup_bridge_mocks(void) +{ + disable_descbr = 0; + + MOCK(list_bridge_identities, + descbr_get_digests_mock); + MOCK(get_bridge_dl_status_by_id, + descbr_get_dl_by_digest_mock); + reset_mocked_dl_statuses(); +} + +static void +clear_bridge_mocks(void) +{ + UNMOCK(list_bridge_identities); + UNMOCK(get_bridge_dl_status_by_id); + + disable_descbr = 0; +} + +static void +test_download_status_consensus(void *arg) +{ + /* We just need one of these to pass, it doesn't matter what's in it */ + control_connection_t dummy; + /* Get results out */ + char *answer = NULL; + const char *errmsg = NULL; + + (void)arg; + + /* Check that the unknown prefix case works; no mocks needed yet */ + getinfo_helper_downloads(&dummy, "downloads/foo", &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_str_op(errmsg, OP_EQ, "Unknown download status query"); + + setup_ns_mocks(); + + /* + * Check returning serialized dlstatuses, and implicitly also test + * download_status_to_string(). + */ + + /* Case 1 default/FLAV_NS*/ + memcpy(&(ns_dl_status[FLAV_NS]), &dls_sample_1, + sizeof(download_status_t)); + getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns", + &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_1_str); + tor_free(answer); + errmsg = NULL; + + /* Case 2 default/FLAV_MICRODESC */ + memcpy(&(ns_dl_status[FLAV_MICRODESC]), &dls_sample_2, + sizeof(download_status_t)); + getinfo_helper_downloads(&dummy, "downloads/networkstatus/microdesc", + &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_2_str); + tor_free(answer); + errmsg = NULL; + + /* Case 3 bootstrap/FLAV_NS */ + memcpy(&(ns_dl_status_bootstrap[FLAV_NS]), &dls_sample_3, + sizeof(download_status_t)); + getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns/bootstrap", + &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_3_str); + tor_free(answer); + errmsg = NULL; + + /* Case 4 bootstrap/FLAV_MICRODESC */ + memcpy(&(ns_dl_status_bootstrap[FLAV_MICRODESC]), &dls_sample_4, + sizeof(download_status_t)); + getinfo_helper_downloads(&dummy, + "downloads/networkstatus/microdesc/bootstrap", + &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_4_str); + tor_free(answer); + errmsg = NULL; + + /* Case 5 running/FLAV_NS */ + memcpy(&(ns_dl_status_running[FLAV_NS]), &dls_sample_5, + sizeof(download_status_t)); + getinfo_helper_downloads(&dummy, + "downloads/networkstatus/ns/running", + &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_5_str); + tor_free(answer); + errmsg = NULL; + + /* Case 6 running/FLAV_MICRODESC */ + memcpy(&(ns_dl_status_running[FLAV_MICRODESC]), &dls_sample_6, + sizeof(download_status_t)); + getinfo_helper_downloads(&dummy, + "downloads/networkstatus/microdesc/running", + &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_6_str); + tor_free(answer); + errmsg = NULL; + + /* Now check the error case */ + getinfo_helper_downloads(&dummy, "downloads/networkstatus/foo", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "Unknown flavor"); + errmsg = NULL; + + done: + clear_ns_mocks(); + tor_free(answer); + + return; +} + +static void +test_download_status_cert(void *arg) +{ + /* We just need one of these to pass, it doesn't matter what's in it */ + control_connection_t dummy; + /* Get results out */ + char *question = NULL; + char *answer = NULL; + const char *errmsg = NULL; + + (void)arg; + + setup_cert_mocks(); + + /* + * Check returning serialized dlstatuses and digest lists, and implicitly + * also test download_status_to_string() and digest_list_to_string(). + */ + + /* Case 1 - list of authority identity fingerprints */ + getinfo_helper_downloads(&dummy, + "downloads/cert/fps", + &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, auth_id_digest_expected_list); + tor_free(answer); + errmsg = NULL; + + /* Case 2 - download status for default cert for 1st auth id */ + memcpy(&auth_def_cert_download_status_1, &dls_sample_1, + sizeof(download_status_t)); + tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_1_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_1_str); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Case 3 - download status for default cert for 2nd auth id */ + memcpy(&auth_def_cert_download_status_2, &dls_sample_2, + sizeof(download_status_t)); + tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_2_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_2_str); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Case 4 - list of signing key digests for 1st auth id */ + tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_1_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, auth_1_sk_digest_expected_list); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Case 5 - list of signing key digests for 2nd auth id */ + tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_2_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, auth_2_sk_digest_expected_list); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Case 6 - download status for 1st auth id, 1st sk */ + memcpy(&auth_1_sk_1_dls, &dls_sample_3, + sizeof(download_status_t)); + tor_asprintf(&question, "downloads/cert/fp/%s/%s", + auth_id_digest_1_str, auth_1_sk_1_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_3_str); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Case 7 - download status for 1st auth id, 2nd sk */ + memcpy(&auth_1_sk_2_dls, &dls_sample_4, + sizeof(download_status_t)); + tor_asprintf(&question, "downloads/cert/fp/%s/%s", + auth_id_digest_1_str, auth_1_sk_2_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_4_str); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Case 8 - download status for 2nd auth id, 1st sk */ + memcpy(&auth_2_sk_1_dls, &dls_sample_5, + sizeof(download_status_t)); + tor_asprintf(&question, "downloads/cert/fp/%s/%s", + auth_id_digest_2_str, auth_2_sk_1_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_5_str); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Case 9 - download status for 2nd auth id, 2nd sk */ + memcpy(&auth_2_sk_2_dls, &dls_sample_6, + sizeof(download_status_t)); + tor_asprintf(&question, "downloads/cert/fp/%s/%s", + auth_id_digest_2_str, auth_2_sk_2_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_6_str); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Now check the error cases */ + + /* Case 1 - query is garbage after downloads/cert/ part */ + getinfo_helper_downloads(&dummy, "downloads/cert/blahdeblah", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "Unknown certificate download status query"); + errmsg = NULL; + + /* + * Case 2 - looks like downloads/cert/fp/, but isn't even + * the right length for a digest. + */ + getinfo_helper_downloads(&dummy, "downloads/cert/fp/2B1D36D32B2942406", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "That didn't look like a digest"); + errmsg = NULL; + + /* + * Case 3 - looks like downloads/cert/fp/, and is digest-sized, + * but not parseable as one. + */ + getinfo_helper_downloads(&dummy, + "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "That didn't look like a digest"); + errmsg = NULL; + + /* + * Case 4 - downloads/cert/fp/, and is not a known authority + * identity digest + */ + getinfo_helper_downloads(&dummy, + "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, + "Failed to get download status for this authority identity digest"); + errmsg = NULL; + + /* + * Case 5 - looks like downloads/cert/fp//, but doesn't + * parse as a sensible digest. + */ + getinfo_helper_downloads(&dummy, + "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1/blah", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest"); + errmsg = NULL; + + /* + * Case 6 - looks like downloads/cert/fp//, but doesn't + * parse as a sensible digest. + */ + getinfo_helper_downloads(&dummy, + "downloads/cert/fp/82F52AF55D25/blah", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest"); + errmsg = NULL; + + /* + * Case 7 - downloads/cert/fp//sks, and is not a known authority + * digest. + */ + getinfo_helper_downloads(&dummy, + "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/sks", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, + "Failed to get list of signing key digests for this authority " + "identity digest"); + errmsg = NULL; + + /* + * Case 8 - looks like downloads/cert/fp//, but doesn't + * parse as a signing key digest. + */ + getinfo_helper_downloads(&dummy, + "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/" + "82F52AF55D250115FE44D3GC81D49643241D56A1", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest"); + errmsg = NULL; + + /* + * Case 9 - looks like downloads/cert/fp//, but doesn't + * parse as a signing key digest. + */ + getinfo_helper_downloads(&dummy, + "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/" + "82F52AF55D250115FE44D", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest"); + errmsg = NULL; + + /* + * Case 10 - downloads/cert/fp//, but isn't a known + * authority identity digest. + */ + getinfo_helper_downloads(&dummy, + "downloads/cert/fp/C6B05DF332F74DB9A13498EE3BBC7AA2F69FCB45/" + "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, + "Failed to get download status for this identity/" + "signing key digest pair"); + errmsg = NULL; + + /* + * Case 11 - downloads/cert/fp//, but isn't a known + * signing key digest. + */ + getinfo_helper_downloads(&dummy, + "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/" + "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, + "Failed to get download status for this identity/" + "signing key digest pair"); + errmsg = NULL; + + /* + * Case 12 - downloads/cert/fp//, but is on the list for + * a different authority identity digest. + */ + getinfo_helper_downloads(&dummy, + "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/" + "9451B8F1B10952384EB58B5F230C0BB701626C9B", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, + "Failed to get download status for this identity/" + "signing key digest pair"); + errmsg = NULL; + + done: + clear_cert_mocks(); + tor_free(answer); + + return; +} + +static void +test_download_status_desc(void *arg) +{ + /* We just need one of these to pass, it doesn't matter what's in it */ + control_connection_t dummy; + /* Get results out */ + char *question = NULL; + char *answer = NULL; + const char *errmsg = NULL; + + (void)arg; + + setup_desc_mocks(); + + /* + * Check returning serialized dlstatuses and digest lists, and implicitly + * also test download_status_to_string() and digest_list_to_string(). + */ + + /* Case 1 - list of router descriptor digests */ + getinfo_helper_downloads(&dummy, + "downloads/desc/descs", + &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, descbr_expected_list); + tor_free(answer); + errmsg = NULL; + + /* Case 2 - get download status for router descriptor 1 */ + memcpy(&descbr_digest_1_dl, &dls_sample_1, + sizeof(download_status_t)); + tor_asprintf(&question, "downloads/desc/%s", descbr_digest_1_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_1_str); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Case 3 - get download status for router descriptor 1 */ + memcpy(&descbr_digest_2_dl, &dls_sample_2, + sizeof(download_status_t)); + tor_asprintf(&question, "downloads/desc/%s", descbr_digest_2_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_2_str); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Now check the error cases */ + + /* Case 1 - non-digest-length garbage after downloads/desc */ + getinfo_helper_downloads(&dummy, "downloads/desc/blahdeblah", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "Unknown router descriptor download status query"); + errmsg = NULL; + + /* Case 2 - nonparseable digest-shaped thing */ + getinfo_helper_downloads( + &dummy, + "downloads/desc/774EC52FD9A5B80A6FACZE536616E8022E3470AG", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "That didn't look like a digest"); + errmsg = NULL; + + /* Case 3 - digest we have no descriptor for */ + getinfo_helper_downloads( + &dummy, + "downloads/desc/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "No such descriptor digest found"); + errmsg = NULL; + + /* Case 4 - microdescs only */ + disable_descbr = 1; + getinfo_helper_downloads(&dummy, + "downloads/desc/descs", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, + "We don't seem to have a networkstatus-flavored consensus"); + errmsg = NULL; + disable_descbr = 0; + + done: + clear_desc_mocks(); + tor_free(answer); + + return; +} + +static void +test_download_status_bridge(void *arg) +{ + /* We just need one of these to pass, it doesn't matter what's in it */ + control_connection_t dummy; + /* Get results out */ + char *question = NULL; + char *answer = NULL; + const char *errmsg = NULL; + + (void)arg; + + setup_bridge_mocks(); + + /* + * Check returning serialized dlstatuses and digest lists, and implicitly + * also test download_status_to_string() and digest_list_to_string(). + */ + + /* Case 1 - list of bridge identity digests */ + getinfo_helper_downloads(&dummy, + "downloads/bridge/bridges", + &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, descbr_expected_list); + tor_free(answer); + errmsg = NULL; + + /* Case 2 - get download status for bridge descriptor 1 */ + memcpy(&descbr_digest_1_dl, &dls_sample_3, + sizeof(download_status_t)); + tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_1_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_3_str); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Case 3 - get download status for router descriptor 1 */ + memcpy(&descbr_digest_2_dl, &dls_sample_4, + sizeof(download_status_t)); + tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_2_str); + tt_ptr_op(question, OP_NE, NULL); + getinfo_helper_downloads(&dummy, question, &answer, &errmsg); + tt_ptr_op(answer, OP_NE, NULL); + tt_ptr_op(errmsg, OP_EQ, NULL); + tt_str_op(answer, OP_EQ, dls_sample_4_str); + tor_free(question); + tor_free(answer); + errmsg = NULL; + + /* Now check the error cases */ + + /* Case 1 - non-digest-length garbage after downloads/bridge */ + getinfo_helper_downloads(&dummy, "downloads/bridge/blahdeblah", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "Unknown bridge descriptor download status query"); + errmsg = NULL; + + /* Case 2 - nonparseable digest-shaped thing */ + getinfo_helper_downloads( + &dummy, + "downloads/bridge/774EC52FD9A5B80A6FACZE536616E8022E3470AG", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "That didn't look like a digest"); + errmsg = NULL; + + /* Case 3 - digest we have no descriptor for */ + getinfo_helper_downloads( + &dummy, + "downloads/bridge/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "No such bridge identity digest found"); + errmsg = NULL; + + /* Case 4 - bridges disabled */ + disable_descbr = 1; + getinfo_helper_downloads(&dummy, + "downloads/bridge/bridges", + &answer, &errmsg); + tt_ptr_op(answer, OP_EQ, NULL); + tt_ptr_op(errmsg, OP_NE, NULL); + tt_str_op(errmsg, OP_EQ, "We don't seem to be using bridges"); + errmsg = NULL; + disable_descbr = 0; + + done: + clear_bridge_mocks(); + tor_free(answer); + + return; +} + +struct testcase_t controller_tests[] = { + { "add_onion_helper_keyarg_v2", test_add_onion_helper_keyarg_v2, 0, + NULL, NULL }, + { "add_onion_helper_keyarg_v3", test_add_onion_helper_keyarg_v3, 0, + NULL, NULL }, + { "getinfo_helper_onion", test_getinfo_helper_onion, 0, NULL, NULL }, + { "rend_service_parse_port_config", test_rend_service_parse_port_config, 0, + NULL, NULL }, + { "add_onion_helper_clientauth", test_add_onion_helper_clientauth, 0, NULL, + NULL }, + { "download_status_consensus", test_download_status_consensus, 0, NULL, + NULL }, + { "download_status_cert", test_download_status_cert, 0, NULL, + NULL }, + { "download_status_desc", test_download_status_desc, 0, NULL, NULL }, + { "download_status_bridge", test_download_status_bridge, 0, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_controller_events.c b/src/wraith/src/test/test_controller_events.c new file mode 100644 index 000000000..901ad7ab3 --- /dev/null +++ b/src/wraith/src/test/test_controller_events.c @@ -0,0 +1,406 @@ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONNECTION_PRIVATE +#define TOR_CHANNEL_INTERNAL_ +#define CONTROL_PRIVATE +#include "or.h" +#include "channel.h" +#include "channeltls.h" +#include "connection.h" +#include "control.h" +#include "test.h" + +static void +help_test_bucket_note_empty(uint32_t expected_msec_since_midnight, + int tokens_before, size_t tokens_removed, + uint32_t msec_since_epoch) +{ + uint32_t timestamp_var = 0; + struct timeval tvnow; + tvnow.tv_sec = msec_since_epoch / 1000; + tvnow.tv_usec = (msec_since_epoch % 1000) * 1000; + connection_buckets_note_empty_ts(×tamp_var, tokens_before, + tokens_removed, &tvnow); + tt_int_op(expected_msec_since_midnight, OP_EQ, timestamp_var); + + done: + ; +} + +static void +test_cntev_bucket_note_empty(void *arg) +{ + (void)arg; + + /* Two cases with nothing to note, because bucket was empty before; + * 86442200 == 1970-01-02 00:00:42.200000 */ + help_test_bucket_note_empty(0, 0, 0, 86442200); + help_test_bucket_note_empty(0, -100, 100, 86442200); + + /* Nothing to note, because bucket has not been emptied. */ + help_test_bucket_note_empty(0, 101, 100, 86442200); + + /* Bucket was emptied, note 42200 msec since midnight. */ + help_test_bucket_note_empty(42200, 101, 101, 86442200); + help_test_bucket_note_empty(42200, 101, 102, 86442200); +} + +static void +test_cntev_bucket_millis_empty(void *arg) +{ + struct timeval tvnow; + (void)arg; + + /* 1970-01-02 00:00:42.200000 */ + tvnow.tv_sec = 86400 + 42; + tvnow.tv_usec = 200000; + + /* Bucket has not been refilled. */ + tt_int_op(0, OP_EQ, bucket_millis_empty(0, 42120, 0, 100, &tvnow)); + tt_int_op(0, OP_EQ, bucket_millis_empty(-10, 42120, -10, 100, &tvnow)); + + /* Bucket was not empty. */ + tt_int_op(0, OP_EQ, bucket_millis_empty(10, 42120, 20, 100, &tvnow)); + + /* Bucket has been emptied 80 msec ago and has just been refilled. */ + tt_int_op(80, OP_EQ, bucket_millis_empty(-20, 42120, -10, 100, &tvnow)); + tt_int_op(80, OP_EQ, bucket_millis_empty(-10, 42120, 0, 100, &tvnow)); + tt_int_op(80, OP_EQ, bucket_millis_empty(0, 42120, 10, 100, &tvnow)); + + /* Bucket has been emptied 180 msec ago, last refill was 100 msec ago + * which was insufficient to make it positive, so cap msec at 100. */ + tt_int_op(100, OP_EQ, bucket_millis_empty(0, 42020, 1, 100, &tvnow)); + + /* 1970-01-02 00:00:00:050000 */ + tvnow.tv_sec = 86400; + tvnow.tv_usec = 50000; + + /* Last emptied 30 msec before midnight, tvnow is 50 msec after + * midnight, that's 80 msec in total. */ + tt_int_op(80, OP_EQ, bucket_millis_empty(0, 86400000 - 30, 1, 100, &tvnow)); + + done: + ; +} + +static void +add_testing_cell_stats_entry(circuit_t *circ, uint8_t command, + unsigned int waiting_time, + unsigned int removed, unsigned int exitward) +{ + testing_cell_stats_entry_t *ent = tor_malloc_zero( + sizeof(testing_cell_stats_entry_t)); + ent->command = command; + ent->waiting_time = waiting_time; + ent->removed = removed; + ent->exitward = exitward; + if (!circ->testing_cell_stats) + circ->testing_cell_stats = smartlist_new(); + smartlist_add(circ->testing_cell_stats, ent); +} + +static void +test_cntev_sum_up_cell_stats(void *arg) +{ + or_circuit_t *or_circ; + circuit_t *circ; + cell_stats_t *cell_stats = NULL; + (void)arg; + + /* This circuit is fake. */ + or_circ = tor_malloc_zero(sizeof(or_circuit_t)); + or_circ->base_.magic = OR_CIRCUIT_MAGIC; + or_circ->base_.purpose = CIRCUIT_PURPOSE_OR; + circ = TO_CIRCUIT(or_circ); + + /* A single RELAY cell was added to the appward queue. */ + cell_stats = tor_malloc_zero(sizeof(cell_stats_t)); + add_testing_cell_stats_entry(circ, CELL_RELAY, 0, 0, 0); + sum_up_cell_stats_by_command(circ, cell_stats); + tt_u64_op(1, OP_EQ, cell_stats->added_cells_appward[CELL_RELAY]); + + /* A single RELAY cell was added to the exitward queue. */ + add_testing_cell_stats_entry(circ, CELL_RELAY, 0, 0, 1); + sum_up_cell_stats_by_command(circ, cell_stats); + tt_u64_op(1, OP_EQ, cell_stats->added_cells_exitward[CELL_RELAY]); + + /* A single RELAY cell was removed from the appward queue where it spent + * 20 msec. */ + add_testing_cell_stats_entry(circ, CELL_RELAY, 2, 1, 0); + sum_up_cell_stats_by_command(circ, cell_stats); + tt_u64_op(20, OP_EQ, cell_stats->total_time_appward[CELL_RELAY]); + tt_u64_op(1, OP_EQ, cell_stats->removed_cells_appward[CELL_RELAY]); + + /* A single RELAY cell was removed from the exitward queue where it + * spent 30 msec. */ + add_testing_cell_stats_entry(circ, CELL_RELAY, 3, 1, 1); + sum_up_cell_stats_by_command(circ, cell_stats); + tt_u64_op(30, OP_EQ, cell_stats->total_time_exitward[CELL_RELAY]); + tt_u64_op(1, OP_EQ, cell_stats->removed_cells_exitward[CELL_RELAY]); + + done: + tor_free(cell_stats); + tor_free(or_circ); +} + +static void +test_cntev_append_cell_stats(void *arg) +{ + smartlist_t *event_parts; + char *cp = NULL; + const char *key = "Z"; + uint64_t include_if_non_zero[CELL_COMMAND_MAX_ + 1], + number_to_include[CELL_COMMAND_MAX_ + 1]; + (void)arg; + + event_parts = smartlist_new(); + memset(include_if_non_zero, 0, + (CELL_COMMAND_MAX_ + 1) * sizeof(uint64_t)); + memset(number_to_include, 0, + (CELL_COMMAND_MAX_ + 1) * sizeof(uint64_t)); + + /* All array entries empty. */ + append_cell_stats_by_command(event_parts, key, + include_if_non_zero, + number_to_include); + tt_int_op(0, OP_EQ, smartlist_len(event_parts)); + + /* There's a RELAY cell to include, but the corresponding field in + * include_if_non_zero is still zero. */ + number_to_include[CELL_RELAY] = 1; + append_cell_stats_by_command(event_parts, key, + include_if_non_zero, + number_to_include); + tt_int_op(0, OP_EQ, smartlist_len(event_parts)); + + /* Now include single RELAY cell. */ + include_if_non_zero[CELL_RELAY] = 2; + append_cell_stats_by_command(event_parts, key, + include_if_non_zero, + number_to_include); + cp = smartlist_pop_last(event_parts); + tt_str_op("Z=relay:1", OP_EQ, cp); + tor_free(cp); + + /* Add four CREATE cells. */ + include_if_non_zero[CELL_CREATE] = 3; + number_to_include[CELL_CREATE] = 4; + append_cell_stats_by_command(event_parts, key, + include_if_non_zero, + number_to_include); + cp = smartlist_pop_last(event_parts); + tt_str_op("Z=create:4,relay:1", OP_EQ, cp); + + done: + tor_free(cp); + smartlist_free(event_parts); +} + +static void +test_cntev_format_cell_stats(void *arg) +{ + char *event_string = NULL; + origin_circuit_t *ocirc = NULL; + or_circuit_t *or_circ = NULL; + cell_stats_t *cell_stats = NULL; + channel_tls_t *n_chan=NULL, *p_chan=NULL; + (void)arg; + + n_chan = tor_malloc_zero(sizeof(channel_tls_t)); + n_chan->base_.global_identifier = 1; + + ocirc = tor_malloc_zero(sizeof(origin_circuit_t)); + ocirc->base_.magic = ORIGIN_CIRCUIT_MAGIC; + ocirc->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL; + ocirc->global_identifier = 2; + ocirc->base_.n_circ_id = 3; + ocirc->base_.n_chan = &(n_chan->base_); + + /* Origin circuit was completely idle. */ + cell_stats = tor_malloc_zero(sizeof(cell_stats_t)); + format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); + tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1", OP_EQ, event_string); + tor_free(event_string); + + /* Origin circuit had 4 RELAY cells added to its exitward queue. */ + cell_stats->added_cells_exitward[CELL_RELAY] = 4; + format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); + tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4", + OP_EQ, event_string); + tor_free(event_string); + + /* Origin circuit also had 5 CREATE2 cells added to its exitward + * queue. */ + cell_stats->added_cells_exitward[CELL_CREATE2] = 5; + format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); + tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4," + "create2:5", OP_EQ, event_string); + tor_free(event_string); + + /* Origin circuit also had 7 RELAY cells removed from its exitward queue + * which together spent 6 msec in the queue. */ + cell_stats->total_time_exitward[CELL_RELAY] = 6; + cell_stats->removed_cells_exitward[CELL_RELAY] = 7; + format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); + tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4," + "create2:5 OutboundRemoved=relay:7 OutboundTime=relay:6", + OP_EQ, event_string); + tor_free(event_string); + + p_chan = tor_malloc_zero(sizeof(channel_tls_t)); + p_chan->base_.global_identifier = 2; + + or_circ = tor_malloc_zero(sizeof(or_circuit_t)); + or_circ->base_.magic = OR_CIRCUIT_MAGIC; + or_circ->base_.purpose = CIRCUIT_PURPOSE_OR; + or_circ->p_circ_id = 8; + or_circ->p_chan = &(p_chan->base_); + or_circ->base_.n_circ_id = 9; + or_circ->base_.n_chan = &(n_chan->base_); + + tor_free(cell_stats); + + /* OR circuit was idle. */ + cell_stats = tor_malloc_zero(sizeof(cell_stats_t)); + format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats); + tt_str_op("InboundQueue=8 InboundConn=2 OutboundQueue=9 OutboundConn=1", + OP_EQ, event_string); + tor_free(event_string); + + /* OR circuit had 3 RELAY cells added to its appward queue. */ + cell_stats->added_cells_appward[CELL_RELAY] = 3; + format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats); + tt_str_op("InboundQueue=8 InboundConn=2 InboundAdded=relay:3 " + "OutboundQueue=9 OutboundConn=1", OP_EQ, event_string); + tor_free(event_string); + + /* OR circuit had 7 RELAY cells removed from its appward queue which + * together spent 6 msec in the queue. */ + cell_stats->total_time_appward[CELL_RELAY] = 6; + cell_stats->removed_cells_appward[CELL_RELAY] = 7; + format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats); + tt_str_op("InboundQueue=8 InboundConn=2 InboundAdded=relay:3 " + "InboundRemoved=relay:7 InboundTime=relay:6 " + "OutboundQueue=9 OutboundConn=1", OP_EQ, event_string); + + done: + tor_free(cell_stats); + tor_free(event_string); + tor_free(or_circ); + tor_free(ocirc); + tor_free(p_chan); + tor_free(n_chan); +} + +static void +test_cntev_event_mask(void *arg) +{ + unsigned int test_event, selected_event; + (void)arg; + + /* Check that nothing is interesting when no events are set */ + control_testing_set_global_event_mask(EVENT_MASK_NONE_); + + /* Check that nothing is interesting between EVENT_MIN_ and EVENT_MAX_ */ + for (test_event = EVENT_MIN_; test_event <= EVENT_MAX_; test_event++) + tt_assert(!control_event_is_interesting(test_event)); + + /* Check that nothing is interesting outside EVENT_MIN_ to EVENT_MAX_ + * This will break if control_event_is_interesting() checks its arguments */ + for (test_event = 0; test_event < EVENT_MIN_; test_event++) + tt_assert(!control_event_is_interesting(test_event)); + for (test_event = EVENT_MAX_ + 1; + test_event < EVENT_CAPACITY_; + test_event++) + tt_assert(!control_event_is_interesting(test_event)); + + /* Check that all valid events are interesting when all events are set */ + control_testing_set_global_event_mask(EVENT_MASK_ALL_); + + /* Check that everything is interesting between EVENT_MIN_ and EVENT_MAX_ */ + for (test_event = EVENT_MIN_; test_event <= EVENT_MAX_; test_event++) + tt_assert(control_event_is_interesting(test_event)); + + /* Check that nothing is interesting outside EVENT_MIN_ to EVENT_MAX_ + * This will break if control_event_is_interesting() checks its arguments */ + for (test_event = 0; test_event < EVENT_MIN_; test_event++) + tt_assert(!control_event_is_interesting(test_event)); + for (test_event = EVENT_MAX_ + 1; + test_event < EVENT_CAPACITY_; + test_event++) + tt_assert(!control_event_is_interesting(test_event)); + + /* Check that only that event is interesting when a single event is set */ + for (selected_event = EVENT_MIN_; + selected_event <= EVENT_MAX_; + selected_event++) { + control_testing_set_global_event_mask(EVENT_MASK_(selected_event)); + + /* Check that only this event is interesting + * between EVENT_MIN_ and EVENT_MAX_ */ + for (test_event = EVENT_MIN_; test_event <= EVENT_MAX_; test_event++) { + if (test_event == selected_event) { + tt_assert(control_event_is_interesting(test_event)); + } else { + tt_assert(!control_event_is_interesting(test_event)); + } + } + + /* Check that nothing is interesting outside EVENT_MIN_ to EVENT_MAX_ + * This will break if control_event_is_interesting checks its arguments */ + for (test_event = 0; test_event < EVENT_MIN_; test_event++) + tt_assert(!control_event_is_interesting(test_event)); + for (test_event = EVENT_MAX_ + 1; + test_event < EVENT_CAPACITY_; + test_event++) + tt_assert(!control_event_is_interesting(test_event)); + } + + /* Check that only that event is not-interesting + * when a single event is un-set */ + for (selected_event = EVENT_MIN_; + selected_event <= EVENT_MAX_; + selected_event++) { + control_testing_set_global_event_mask( + EVENT_MASK_ALL_ + & ~(EVENT_MASK_(selected_event)) + ); + + /* Check that only this event is not-interesting + * between EVENT_MIN_ and EVENT_MAX_ */ + for (test_event = EVENT_MIN_; test_event <= EVENT_MAX_; test_event++) { + if (test_event == selected_event) { + tt_assert(!control_event_is_interesting(test_event)); + } else { + tt_assert(control_event_is_interesting(test_event)); + } + } + + /* Check that nothing is interesting outside EVENT_MIN_ to EVENT_MAX_ + * This will break if control_event_is_interesting checks its arguments */ + for (test_event = 0; test_event < EVENT_MIN_; test_event++) + tt_assert(!control_event_is_interesting(test_event)); + for (test_event = EVENT_MAX_ + 1; + test_event < EVENT_CAPACITY_; + test_event++) + tt_assert(!control_event_is_interesting(test_event)); + } + + done: + ; +} + +#define TEST(name, flags) \ + { #name, test_cntev_ ## name, flags, 0, NULL } + +struct testcase_t controller_event_tests[] = { + TEST(bucket_note_empty, TT_FORK), + TEST(bucket_millis_empty, TT_FORK), + TEST(sum_up_cell_stats, TT_FORK), + TEST(append_cell_stats, TT_FORK), + TEST(format_cell_stats, TT_FORK), + TEST(event_mask, TT_FORK), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_crypto.c b/src/wraith/src/test/test_crypto.c new file mode 100644 index 000000000..c8443fd3b --- /dev/null +++ b/src/wraith/src/test/test_crypto.c @@ -0,0 +1,3028 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define CRYPTO_CURVE25519_PRIVATE +#define CRYPTO_PRIVATE +#include "or.h" +#include "test.h" +#include "aes.h" +#include "util.h" +#include "siphash.h" +#include "crypto_curve25519.h" +#include "crypto_ed25519.h" +#include "ed25519_vectors.inc" + +/** Run unit tests for Diffie-Hellman functionality. */ +static void +test_crypto_dh(void *arg) +{ + crypto_dh_t *dh1 = crypto_dh_new(DH_TYPE_CIRCUIT); + crypto_dh_t *dh1_dup = NULL; + crypto_dh_t *dh2 = crypto_dh_new(DH_TYPE_CIRCUIT); + char p1[DH_BYTES]; + char p2[DH_BYTES]; + char s1[DH_BYTES]; + char s2[DH_BYTES]; + ssize_t s1len, s2len; + + (void)arg; + tt_int_op(crypto_dh_get_bytes(dh1),OP_EQ, DH_BYTES); + tt_int_op(crypto_dh_get_bytes(dh2),OP_EQ, DH_BYTES); + + memset(p1, 0, DH_BYTES); + memset(p2, 0, DH_BYTES); + tt_mem_op(p1,OP_EQ, p2, DH_BYTES); + + tt_int_op(-1, OP_EQ, crypto_dh_get_public(dh1, p1, 6)); /* too short */ + + tt_assert(! crypto_dh_get_public(dh1, p1, DH_BYTES)); + tt_mem_op(p1,OP_NE, p2, DH_BYTES); + tt_assert(! crypto_dh_get_public(dh2, p2, DH_BYTES)); + tt_mem_op(p1,OP_NE, p2, DH_BYTES); + + memset(s1, 0, DH_BYTES); + memset(s2, 0xFF, DH_BYTES); + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p2, DH_BYTES, s1, 50); + s2len = crypto_dh_compute_secret(LOG_WARN, dh2, p1, DH_BYTES, s2, 50); + tt_assert(s1len > 0); + tt_int_op(s1len,OP_EQ, s2len); + tt_mem_op(s1,OP_EQ, s2, s1len); + + /* test dh_dup; make sure it works the same. */ + dh1_dup = crypto_dh_dup(dh1); + s1len = crypto_dh_compute_secret(LOG_WARN, dh1_dup, p2, DH_BYTES, s1, 50); + tt_mem_op(s1,OP_EQ, s2, s1len); + + { + /* Now fabricate some bad values and make sure they get caught. */ + + /* 1 and 0 should both fail. */ + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, "\x01", 1, s1, 50); + tt_int_op(-1, OP_EQ, s1len); + + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, "\x00", 1, s1, 50); + tt_int_op(-1, OP_EQ, s1len); + + memset(p1, 0, DH_BYTES); /* 0 with padding. */ + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); + tt_int_op(-1, OP_EQ, s1len); + + p1[DH_BYTES-1] = 1; /* 1 with padding*/ + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); + tt_int_op(-1, OP_EQ, s1len); + + /* 2 is okay, though weird. */ + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, "\x02", 1, s1, 50); + tt_int_op(50, OP_EQ, s1len); + + const char P[] = + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" + "49286651ECE65381FFFFFFFFFFFFFFFF"; + + /* p-1, p, and so on are not okay. */ + base16_decode(p1, sizeof(p1), P, strlen(P)); + + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); + tt_int_op(-1, OP_EQ, s1len); + + p1[DH_BYTES-1] = 0xFE; /* p-1 */ + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); + tt_int_op(-1, OP_EQ, s1len); + + p1[DH_BYTES-1] = 0xFD; /* p-2 works fine */ + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); + tt_int_op(50, OP_EQ, s1len); + + const char P_plus_one[] = + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" + "49286651ECE653820000000000000000"; + + base16_decode(p1, sizeof(p1), P_plus_one, strlen(P_plus_one)); + + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); + tt_int_op(-1, OP_EQ, s1len); + + p1[DH_BYTES-1] = 0x01; /* p+2 */ + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); + tt_int_op(-1, OP_EQ, s1len); + + p1[DH_BYTES-1] = 0xff; /* p+256 */ + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); + tt_int_op(-1, OP_EQ, s1len); + + memset(p1, 0xff, DH_BYTES), /* 2^1024-1 */ + s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); + tt_int_op(-1, OP_EQ, s1len); + } + + { + /* provoke an error in the openssl DH_compute_key function; make sure we + * survive. */ + tt_assert(! crypto_dh_get_public(dh1, p1, DH_BYTES)); + + crypto_dh_free(dh2); + dh2= crypto_dh_new(DH_TYPE_CIRCUIT); /* no private key set */ + s1len = crypto_dh_compute_secret(LOG_WARN, dh2, + p1, DH_BYTES, + s1, 50); + tt_int_op(s1len, OP_EQ, -1); + } + + done: + crypto_dh_free(dh1); + crypto_dh_free(dh2); + crypto_dh_free(dh1_dup); +} + +static void +test_crypto_openssl_version(void *arg) +{ + (void)arg; + const char *version = crypto_openssl_get_version_str(); + const char *h_version = crypto_openssl_get_header_version_str(); + tt_assert(version); + tt_assert(h_version); + tt_assert(!strcmpstart(version, h_version)); /* "-fips" suffix, etc */ + tt_assert(!strstr(version, "OpenSSL")); + int a=-1,b=-1,c=-1; + if (!strcmpstart(version, "LibreSSL") || !strcmpstart(version, "BoringSSL")) + return; + int r = tor_sscanf(version, "%d.%d.%d", &a,&b,&c); + tt_int_op(r, OP_EQ, 3); + tt_int_op(a, OP_GE, 0); + tt_int_op(b, OP_GE, 0); + tt_int_op(c, OP_GE, 0); + + done: + ; +} + +/** Run unit tests for our random number generation function and its wrappers. + */ +static void +test_crypto_rng(void *arg) +{ + int i, j, allok; + char data1[100], data2[100]; + double d; + char *h=NULL; + + /* Try out RNG. */ + (void)arg; + tt_assert(! crypto_seed_rng()); + crypto_rand(data1, 100); + crypto_rand(data2, 100); + tt_mem_op(data1,OP_NE, data2,100); + allok = 1; + for (i = 0; i < 100; ++i) { + uint64_t big; + char *host; + j = crypto_rand_int(100); + if (j < 0 || j >= 100) + allok = 0; + big = crypto_rand_uint64(U64_LITERAL(1)<<40); + if (big >= (U64_LITERAL(1)<<40)) + allok = 0; + big = crypto_rand_uint64(U64_LITERAL(5)); + if (big >= 5) + allok = 0; + d = crypto_rand_double(); + tt_assert(d >= 0); + tt_assert(d < 1.0); + host = crypto_random_hostname(3,8,"www.",".onion"); + if (strcmpstart(host,"www.") || + strcmpend(host,".onion") || + strlen(host) < 13 || + strlen(host) > 18) + allok = 0; + tor_free(host); + } + + /* Make sure crypto_random_hostname clips its inputs properly. */ + h = crypto_random_hostname(20000, 9000, "www.", ".onion"); + tt_assert(! strcmpstart(h,"www.")); + tt_assert(! strcmpend(h,".onion")); + tt_int_op(63+4+6, OP_EQ, strlen(h)); + + tt_assert(allok); + done: + tor_free(h); +} + +static void +test_crypto_rng_range(void *arg) +{ + int got_smallest = 0, got_largest = 0; + int i; + + (void)arg; + for (i = 0; i < 1000; ++i) { + int x = crypto_rand_int_range(5,9); + tt_int_op(x, OP_GE, 5); + tt_int_op(x, OP_LT, 9); + if (x == 5) + got_smallest = 1; + if (x == 8) + got_largest = 1; + } + /* These fail with probability 1/10^603. */ + tt_assert(got_smallest); + tt_assert(got_largest); + + got_smallest = got_largest = 0; + const uint64_t ten_billion = 10 * ((uint64_t)1000000000000); + for (i = 0; i < 1000; ++i) { + uint64_t x = crypto_rand_uint64_range(ten_billion, ten_billion+10); + tt_u64_op(x, OP_GE, ten_billion); + tt_u64_op(x, OP_LT, ten_billion+10); + if (x == ten_billion) + got_smallest = 1; + if (x == ten_billion+9) + got_largest = 1; + } + + tt_assert(got_smallest); + tt_assert(got_largest); + + const time_t now = time(NULL); + for (i = 0; i < 2000; ++i) { + time_t x = crypto_rand_time_range(now, now+60); + tt_i64_op(x, OP_GE, now); + tt_i64_op(x, OP_LT, now+60); + if (x == now) + got_smallest = 1; + if (x == now+59) + got_largest = 1; + } + + tt_assert(got_smallest); + tt_assert(got_largest); + done: + ; +} + +static void +test_crypto_rng_strongest(void *arg) +{ + const char *how = arg; + int broken = 0; + + if (how == NULL) { + ; + } else if (!strcmp(how, "nosyscall")) { + break_strongest_rng_syscall = 1; + } else if (!strcmp(how, "nofallback")) { + break_strongest_rng_fallback = 1; + } else if (!strcmp(how, "broken")) { + broken = break_strongest_rng_syscall = break_strongest_rng_fallback = 1; + } + +#define N 128 + uint8_t combine_and[N]; + uint8_t combine_or[N]; + int i, j; + + memset(combine_and, 0xff, N); + memset(combine_or, 0, N); + + for (i = 0; i < 100; ++i) { /* 2^-100 chances just don't happen. */ + uint8_t output[N]; + memset(output, 0, N); + if (how == NULL) { + /* this one can't fail. */ + crypto_strongest_rand(output, sizeof(output)); + } else { + int r = crypto_strongest_rand_raw(output, sizeof(output)); + if (r == -1) { + if (broken) { + goto done; /* we're fine. */ + } + /* This function is allowed to break, but only if it always breaks. */ + tt_int_op(i, OP_EQ, 0); + tt_skip(); + } else { + tt_assert(! broken); + } + } + for (j = 0; j < N; ++j) { + combine_and[j] &= output[j]; + combine_or[j] |= output[j]; + } + } + + for (j = 0; j < N; ++j) { + tt_int_op(combine_and[j], OP_EQ, 0); + tt_int_op(combine_or[j], OP_EQ, 0xff); + } + done: + ; +#undef N +} + +/** Run unit tests for our AES128 functionality */ +static void +test_crypto_aes128(void *arg) +{ + char *data1 = NULL, *data2 = NULL, *data3 = NULL; + crypto_cipher_t *env1 = NULL, *env2 = NULL; + int i, j; + char *mem_op_hex_tmp=NULL; + char key[CIPHER_KEY_LEN]; + int use_evp = !strcmp(arg,"evp"); + evaluate_evp_for_aes(use_evp); + evaluate_ctr_for_aes(); + + data1 = tor_malloc(1024); + data2 = tor_malloc(1024); + data3 = tor_malloc(1024); + + /* Now, test encryption and decryption with stream cipher. */ + data1[0]='\0'; + for (i = 1023; i>0; i -= 35) + strncat(data1, "Now is the time for all good onions", i); + + memset(data2, 0, 1024); + memset(data3, 0, 1024); + crypto_rand(key, sizeof(key)); + env1 = crypto_cipher_new(key); + tt_ptr_op(env1, OP_NE, NULL); + env2 = crypto_cipher_new(key); + tt_ptr_op(env2, OP_NE, NULL); + + /* Try encrypting 512 chars. */ + crypto_cipher_encrypt(env1, data2, data1, 512); + crypto_cipher_decrypt(env2, data3, data2, 512); + tt_mem_op(data1,OP_EQ, data3, 512); + tt_mem_op(data1,OP_NE, data2, 512); + + /* Now encrypt 1 at a time, and get 1 at a time. */ + for (j = 512; j < 560; ++j) { + crypto_cipher_encrypt(env1, data2+j, data1+j, 1); + } + for (j = 512; j < 560; ++j) { + crypto_cipher_decrypt(env2, data3+j, data2+j, 1); + } + tt_mem_op(data1,OP_EQ, data3, 560); + /* Now encrypt 3 at a time, and get 5 at a time. */ + for (j = 560; j < 1024-5; j += 3) { + crypto_cipher_encrypt(env1, data2+j, data1+j, 3); + } + for (j = 560; j < 1024-5; j += 5) { + crypto_cipher_decrypt(env2, data3+j, data2+j, 5); + } + tt_mem_op(data1,OP_EQ, data3, 1024-5); + /* Now make sure that when we encrypt with different chunk sizes, we get + the same results. */ + crypto_cipher_free(env2); + env2 = NULL; + + memset(data3, 0, 1024); + env2 = crypto_cipher_new(key); + tt_ptr_op(env2, OP_NE, NULL); + for (j = 0; j < 1024-16; j += 17) { + crypto_cipher_encrypt(env2, data3+j, data1+j, 17); + } + for (j= 0; j < 1024-16; ++j) { + if (data2[j] != data3[j]) { + printf("%d: %d\t%d\n", j, (int) data2[j], (int) data3[j]); + } + } + tt_mem_op(data2,OP_EQ, data3, 1024-16); + crypto_cipher_free(env1); + env1 = NULL; + crypto_cipher_free(env2); + env2 = NULL; + + /* NIST test vector for aes. */ + /* IV starts at 0 */ + env1 = crypto_cipher_new("\x80\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00"); + crypto_cipher_encrypt(env1, data1, + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00", 16); + test_memeq_hex(data1, "0EDD33D3C621E546455BD8BA1418BEC8"); + + /* Now test rollover. All these values are originally from a python + * script. */ + crypto_cipher_free(env1); + env1 = crypto_cipher_new_with_iv( + "\x80\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\xff\xff\xff\xff\xff\xff\xff\xff"); + memset(data2, 0, 1024); + crypto_cipher_encrypt(env1, data1, data2, 32); + test_memeq_hex(data1, "335fe6da56f843199066c14a00a40231" + "cdd0b917dbc7186908a6bfb5ffd574d3"); + crypto_cipher_free(env1); + env1 = crypto_cipher_new_with_iv( + "\x80\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x00\x00\x00\x00\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\xff\xff\xff"); + memset(data2, 0, 1024); + crypto_cipher_encrypt(env1, data1, data2, 32); + test_memeq_hex(data1, "e627c6423fa2d77832a02b2794094b73" + "3e63c721df790d2c6469cc1953a3ffac"); + crypto_cipher_free(env1); + env1 = crypto_cipher_new_with_iv( + "\x80\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\xff\xff\xff\xff\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\xff\xff\xff"); + memset(data2, 0, 1024); + crypto_cipher_encrypt(env1, data1, data2, 32); + test_memeq_hex(data1, "2aed2bff0de54f9328efd070bf48f70a" + "0EDD33D3C621E546455BD8BA1418BEC8"); + + /* Now check rollover on inplace cipher. */ + crypto_cipher_free(env1); + env1 = crypto_cipher_new_with_iv( + "\x80\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\xff\xff\xff\xff\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\xff\xff\xff"); + crypto_cipher_crypt_inplace(env1, data2, 64); + test_memeq_hex(data2, "2aed2bff0de54f9328efd070bf48f70a" + "0EDD33D3C621E546455BD8BA1418BEC8" + "93e2c5243d6839eac58503919192f7ae" + "1908e67cafa08d508816659c2e693191"); + crypto_cipher_free(env1); + env1 = crypto_cipher_new_with_iv( + "\x80\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\xff\xff\xff\xff\xff\xff\xff\xff" + "\xff\xff\xff\xff\xff\xff\xff\xff"); + crypto_cipher_crypt_inplace(env1, data2, 64); + tt_assert(tor_mem_is_zero(data2, 64)); + + done: + tor_free(mem_op_hex_tmp); + if (env1) + crypto_cipher_free(env1); + if (env2) + crypto_cipher_free(env2); + tor_free(data1); + tor_free(data2); + tor_free(data3); +} + +static void +test_crypto_aes_ctr_testvec(void *arg) +{ + const char *bitstr = arg; + char *mem_op_hex_tmp=NULL; + crypto_cipher_t *c=NULL; + + /* from NIST SP800-38a, section F.5 */ + const char ctr16[] = "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; + const char plaintext16[] = + "6bc1bee22e409f96e93d7e117393172a" + "ae2d8a571e03ac9c9eb76fac45af8e51" + "30c81c46a35ce411e5fbc1191a0a52ef" + "f69f2445df4f9b17ad2b417be66c3710"; + const char *ciphertext16; + const char *key16; + int bits; + + if (!strcmp(bitstr, "128")) { + ciphertext16 = /* section F.5.1 */ + "874d6191b620e3261bef6864990db6ce" + "9806f66b7970fdff8617187bb9fffdff" + "5ae4df3edbd5d35e5b4f09020db03eab" + "1e031dda2fbe03d1792170a0f3009cee"; + key16 = "2b7e151628aed2a6abf7158809cf4f3c"; + bits = 128; + } else if (!strcmp(bitstr, "192")) { + ciphertext16 = /* section F.5.3 */ + "1abc932417521ca24f2b0459fe7e6e0b" + "090339ec0aa6faefd5ccc2c6f4ce8e94" + "1e36b26bd1ebc670d1bd1d665620abf7" + "4f78a7f6d29809585a97daec58c6b050"; + key16 = "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b"; + bits = 192; + } else if (!strcmp(bitstr, "256")) { + ciphertext16 = /* section F.5.5 */ + "601ec313775789a5b7a7f504bbf3d228" + "f443e3ca4d62b59aca84e990cacaf5c5" + "2b0930daa23de94ce87017ba2d84988d" + "dfc9c58db67aada613c2dd08457941a6"; + key16 = + "603deb1015ca71be2b73aef0857d7781" + "1f352c073b6108d72d9810a30914dff4"; + bits = 256; + } else { + tt_abort_msg("AES doesn't support this number of bits."); + } + + char key[32]; + char iv[16]; + char plaintext[16*4]; + memset(key, 0xf9, sizeof(key)); /* poison extra bytes */ + base16_decode(key, sizeof(key), key16, strlen(key16)); + base16_decode(iv, sizeof(iv), ctr16, strlen(ctr16)); + base16_decode(plaintext, sizeof(plaintext), + plaintext16, strlen(plaintext16)); + + c = crypto_cipher_new_with_iv_and_bits((uint8_t*)key, (uint8_t*)iv, bits); + crypto_cipher_crypt_inplace(c, plaintext, sizeof(plaintext)); + test_memeq_hex(plaintext, ciphertext16); + + done: + tor_free(mem_op_hex_tmp); + crypto_cipher_free(c); +} + +/** Run unit tests for our SHA-1 functionality */ +static void +test_crypto_sha(void *arg) +{ + crypto_digest_t *d1 = NULL, *d2 = NULL; + int i; +#define RFC_4231_MAX_KEY_SIZE 131 + char key[RFC_4231_MAX_KEY_SIZE]; + char digest[DIGEST256_LEN]; + char data[DIGEST512_LEN]; + char d_out1[DIGEST512_LEN], d_out2[DIGEST512_LEN]; + char *mem_op_hex_tmp=NULL; + + /* Test SHA-1 with a test vector from the specification. */ + (void)arg; + i = crypto_digest(data, "abc", 3); + test_memeq_hex(data, "A9993E364706816ABA3E25717850C26C9CD0D89D"); + tt_int_op(i, OP_EQ, 0); + + /* Test SHA-256 with a test vector from the specification. */ + i = crypto_digest256(data, "abc", 3, DIGEST_SHA256); + test_memeq_hex(data, "BA7816BF8F01CFEA414140DE5DAE2223B00361A3" + "96177A9CB410FF61F20015AD"); + tt_int_op(i, OP_EQ, 0); + + /* Test SHA-512 with a test vector from the specification. */ + i = crypto_digest512(data, "abc", 3, DIGEST_SHA512); + test_memeq_hex(data, "ddaf35a193617abacc417349ae20413112e6fa4e89a97" + "ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3" + "feebbd454d4423643ce80e2a9ac94fa54ca49f"); + tt_int_op(i, OP_EQ, 0); + + /* Test HMAC-SHA256 with test cases from wikipedia and RFC 4231 */ + + /* Case empty (wikipedia) */ + crypto_hmac_sha256(digest, "", 0, "", 0); + tt_str_op(hex_str(digest, 32),OP_EQ, + "B613679A0814D9EC772F95D778C35FC5FF1697C493715653C6C712144292C5AD"); + + /* Case quick-brown (wikipedia) */ + crypto_hmac_sha256(digest, "key", 3, + "The quick brown fox jumps over the lazy dog", 43); + tt_str_op(hex_str(digest, 32),OP_EQ, + "F7BC83F430538424B13298E6AA6FB143EF4D59A14946175997479DBC2D1A3CD8"); + + /* "Test Case 1" from RFC 4231 */ + memset(key, 0x0b, 20); + crypto_hmac_sha256(digest, key, 20, "Hi There", 8); + test_memeq_hex(digest, + "b0344c61d8db38535ca8afceaf0bf12b" + "881dc200c9833da726e9376c2e32cff7"); + + /* "Test Case 2" from RFC 4231 */ + memset(key, 0x0b, 20); + crypto_hmac_sha256(digest, "Jefe", 4, "what do ya want for nothing?", 28); + test_memeq_hex(digest, + "5bdcc146bf60754e6a042426089575c7" + "5a003f089d2739839dec58b964ec3843"); + + /* "Test case 3" from RFC 4231 */ + memset(key, 0xaa, 20); + memset(data, 0xdd, 50); + crypto_hmac_sha256(digest, key, 20, data, 50); + test_memeq_hex(digest, + "773ea91e36800e46854db8ebd09181a7" + "2959098b3ef8c122d9635514ced565fe"); + + /* "Test case 4" from RFC 4231 */ + base16_decode(key, 25, + "0102030405060708090a0b0c0d0e0f10111213141516171819", 50); + memset(data, 0xcd, 50); + crypto_hmac_sha256(digest, key, 25, data, 50); + test_memeq_hex(digest, + "82558a389a443c0ea4cc819899f2083a" + "85f0faa3e578f8077a2e3ff46729665b"); + + /* "Test case 5" from RFC 4231 */ + memset(key, 0x0c, 20); + crypto_hmac_sha256(digest, key, 20, "Test With Truncation", 20); + test_memeq_hex(digest, + "a3b6167473100ee06e0c796c2955552b"); + + /* "Test case 6" from RFC 4231 */ + memset(key, 0xaa, 131); + crypto_hmac_sha256(digest, key, 131, + "Test Using Larger Than Block-Size Key - Hash Key First", + 54); + test_memeq_hex(digest, + "60e431591ee0b67f0d8a26aacbf5b77f" + "8e0bc6213728c5140546040f0ee37f54"); + + /* "Test case 7" from RFC 4231 */ + memset(key, 0xaa, 131); + crypto_hmac_sha256(digest, key, 131, + "This is a test using a larger than block-size key and a " + "larger than block-size data. The key needs to be hashed " + "before being used by the HMAC algorithm.", 152); + test_memeq_hex(digest, + "9b09ffa71b942fcb27635fbcd5b0e944" + "bfdc63644f0713938a7f51535c3a35e2"); + + /* Incremental digest code. */ + d1 = crypto_digest_new(); + tt_assert(d1); + crypto_digest_add_bytes(d1, "abcdef", 6); + d2 = crypto_digest_dup(d1); + tt_assert(d2); + crypto_digest_add_bytes(d2, "ghijkl", 6); + crypto_digest_get_digest(d2, d_out1, DIGEST_LEN); + crypto_digest(d_out2, "abcdefghijkl", 12); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); + crypto_digest_assign(d2, d1); + crypto_digest_add_bytes(d2, "mno", 3); + crypto_digest_get_digest(d2, d_out1, DIGEST_LEN); + crypto_digest(d_out2, "abcdefmno", 9); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); + crypto_digest_get_digest(d1, d_out1, DIGEST_LEN); + crypto_digest(d_out2, "abcdef", 6); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); + crypto_digest_free(d1); + crypto_digest_free(d2); + + /* Incremental digest code with sha256 */ + d1 = crypto_digest256_new(DIGEST_SHA256); + tt_assert(d1); + crypto_digest_add_bytes(d1, "abcdef", 6); + d2 = crypto_digest_dup(d1); + tt_assert(d2); + crypto_digest_add_bytes(d2, "ghijkl", 6); + crypto_digest_get_digest(d2, d_out1, DIGEST256_LEN); + crypto_digest256(d_out2, "abcdefghijkl", 12, DIGEST_SHA256); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); + crypto_digest_assign(d2, d1); + crypto_digest_add_bytes(d2, "mno", 3); + crypto_digest_get_digest(d2, d_out1, DIGEST256_LEN); + crypto_digest256(d_out2, "abcdefmno", 9, DIGEST_SHA256); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); + crypto_digest_get_digest(d1, d_out1, DIGEST256_LEN); + crypto_digest256(d_out2, "abcdef", 6, DIGEST_SHA256); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); + crypto_digest_free(d1); + crypto_digest_free(d2); + + /* Incremental digest code with sha512 */ + d1 = crypto_digest512_new(DIGEST_SHA512); + tt_assert(d1); + crypto_digest_add_bytes(d1, "abcdef", 6); + d2 = crypto_digest_dup(d1); + tt_assert(d2); + crypto_digest_add_bytes(d2, "ghijkl", 6); + crypto_digest_get_digest(d2, d_out1, DIGEST512_LEN); + crypto_digest512(d_out2, "abcdefghijkl", 12, DIGEST_SHA512); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); + crypto_digest_assign(d2, d1); + crypto_digest_add_bytes(d2, "mno", 3); + crypto_digest_get_digest(d2, d_out1, DIGEST512_LEN); + crypto_digest512(d_out2, "abcdefmno", 9, DIGEST_SHA512); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); + crypto_digest_get_digest(d1, d_out1, DIGEST512_LEN); + crypto_digest512(d_out2, "abcdef", 6, DIGEST_SHA512); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); + + done: + if (d1) + crypto_digest_free(d1); + if (d2) + crypto_digest_free(d2); + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_sha3(void *arg) +{ + crypto_digest_t *d1 = NULL, *d2 = NULL; + int i; + char data[DIGEST512_LEN]; + char d_out1[DIGEST512_LEN], d_out2[DIGEST512_LEN]; + char *mem_op_hex_tmp=NULL; + char *large = NULL; + + (void)arg; + + /* Test SHA3-[256,512] with a test vectors from the Keccak Code Package. + * + * NB: The code package's test vectors have length expressed in bits. + */ + + /* Len = 8, Msg = CC */ + const uint8_t keccak_kat_msg8[] = { 0xcc }; + i = crypto_digest256(data, (const char*)keccak_kat_msg8, 1, DIGEST_SHA3_256); + test_memeq_hex(data, "677035391CD3701293D385F037BA3279" + "6252BB7CE180B00B582DD9B20AAAD7F0"); + tt_int_op(i, OP_EQ, 0); + i = crypto_digest512(data, (const char*)keccak_kat_msg8, 1, DIGEST_SHA3_512); + test_memeq_hex(data, "3939FCC8B57B63612542DA31A834E5DC" + "C36E2EE0F652AC72E02624FA2E5ADEEC" + "C7DD6BB3580224B4D6138706FC6E8059" + "7B528051230B00621CC2B22999EAA205"); + tt_int_op(i, OP_EQ, 0); + + /* Len = 24, Msg = 1F877C */ + const uint8_t keccak_kat_msg24[] = { 0x1f, 0x87, 0x7c }; + i = crypto_digest256(data, (const char*)keccak_kat_msg24, 3, + DIGEST_SHA3_256); + test_memeq_hex(data, "BC22345E4BD3F792A341CF18AC0789F1" + "C9C966712A501B19D1B6632CCD408EC5"); + tt_int_op(i, OP_EQ, 0); + i = crypto_digest512(data, (const char*)keccak_kat_msg24, 3, + DIGEST_SHA3_512); + test_memeq_hex(data, "CB20DCF54955F8091111688BECCEF48C" + "1A2F0D0608C3A575163751F002DB30F4" + "0F2F671834B22D208591CFAF1F5ECFE4" + "3C49863A53B3225BDFD7C6591BA7658B"); + tt_int_op(i, OP_EQ, 0); + + /* Len = 1080, Msg = B771D5CEF... ...C35AC81B5 (SHA3-256 rate - 1) */ + const uint8_t keccak_kat_msg1080[] = { + 0xB7, 0x71, 0xD5, 0xCE, 0xF5, 0xD1, 0xA4, 0x1A, 0x93, 0xD1, + 0x56, 0x43, 0xD7, 0x18, 0x1D, 0x2A, 0x2E, 0xF0, 0xA8, 0xE8, + 0x4D, 0x91, 0x81, 0x2F, 0x20, 0xED, 0x21, 0xF1, 0x47, 0xBE, + 0xF7, 0x32, 0xBF, 0x3A, 0x60, 0xEF, 0x40, 0x67, 0xC3, 0x73, + 0x4B, 0x85, 0xBC, 0x8C, 0xD4, 0x71, 0x78, 0x0F, 0x10, 0xDC, + 0x9E, 0x82, 0x91, 0xB5, 0x83, 0x39, 0xA6, 0x77, 0xB9, 0x60, + 0x21, 0x8F, 0x71, 0xE7, 0x93, 0xF2, 0x79, 0x7A, 0xEA, 0x34, + 0x94, 0x06, 0x51, 0x28, 0x29, 0x06, 0x5D, 0x37, 0xBB, 0x55, + 0xEA, 0x79, 0x6F, 0xA4, 0xF5, 0x6F, 0xD8, 0x89, 0x6B, 0x49, + 0xB2, 0xCD, 0x19, 0xB4, 0x32, 0x15, 0xAD, 0x96, 0x7C, 0x71, + 0x2B, 0x24, 0xE5, 0x03, 0x2D, 0x06, 0x52, 0x32, 0xE0, 0x2C, + 0x12, 0x74, 0x09, 0xD2, 0xED, 0x41, 0x46, 0xB9, 0xD7, 0x5D, + 0x76, 0x3D, 0x52, 0xDB, 0x98, 0xD9, 0x49, 0xD3, 0xB0, 0xFE, + 0xD6, 0xA8, 0x05, 0x2F, 0xBB, + }; + i = crypto_digest256(data, (const char*)keccak_kat_msg1080, 135, + DIGEST_SHA3_256); + test_memeq_hex(data, "A19EEE92BB2097B64E823D597798AA18" + "BE9B7C736B8059ABFD6779AC35AC81B5"); + tt_int_op(i, OP_EQ, 0); + i = crypto_digest512(data, (const char*)keccak_kat_msg1080, 135, + DIGEST_SHA3_512); + test_memeq_hex(data, "7575A1FB4FC9A8F9C0466BD5FCA496D1" + "CB78696773A212A5F62D02D14E3259D1" + "92A87EBA4407DD83893527331407B6DA" + "DAAD920DBC46489B677493CE5F20B595"); + tt_int_op(i, OP_EQ, 0); + + /* Len = 1088, Msg = B32D95B0... ...8E380C04 (SHA3-256 rate) */ + const uint8_t keccak_kat_msg1088[] = { + 0xB3, 0x2D, 0x95, 0xB0, 0xB9, 0xAA, 0xD2, 0xA8, 0x81, 0x6D, + 0xE6, 0xD0, 0x6D, 0x1F, 0x86, 0x00, 0x85, 0x05, 0xBD, 0x8C, + 0x14, 0x12, 0x4F, 0x6E, 0x9A, 0x16, 0x3B, 0x5A, 0x2A, 0xDE, + 0x55, 0xF8, 0x35, 0xD0, 0xEC, 0x38, 0x80, 0xEF, 0x50, 0x70, + 0x0D, 0x3B, 0x25, 0xE4, 0x2C, 0xC0, 0xAF, 0x05, 0x0C, 0xCD, + 0x1B, 0xE5, 0xE5, 0x55, 0xB2, 0x30, 0x87, 0xE0, 0x4D, 0x7B, + 0xF9, 0x81, 0x36, 0x22, 0x78, 0x0C, 0x73, 0x13, 0xA1, 0x95, + 0x4F, 0x87, 0x40, 0xB6, 0xEE, 0x2D, 0x3F, 0x71, 0xF7, 0x68, + 0xDD, 0x41, 0x7F, 0x52, 0x04, 0x82, 0xBD, 0x3A, 0x08, 0xD4, + 0xF2, 0x22, 0xB4, 0xEE, 0x9D, 0xBD, 0x01, 0x54, 0x47, 0xB3, + 0x35, 0x07, 0xDD, 0x50, 0xF3, 0xAB, 0x42, 0x47, 0xC5, 0xDE, + 0x9A, 0x8A, 0xBD, 0x62, 0xA8, 0xDE, 0xCE, 0xA0, 0x1E, 0x3B, + 0x87, 0xC8, 0xB9, 0x27, 0xF5, 0xB0, 0x8B, 0xEB, 0x37, 0x67, + 0x4C, 0x6F, 0x8E, 0x38, 0x0C, 0x04, + }; + i = crypto_digest256(data, (const char*)keccak_kat_msg1088, 136, + DIGEST_SHA3_256); + test_memeq_hex(data, "DF673F4105379FF6B755EEAB20CEB0DC" + "77B5286364FE16C59CC8A907AFF07732"); + tt_int_op(i, OP_EQ, 0); + i = crypto_digest512(data, (const char*)keccak_kat_msg1088, 136, + DIGEST_SHA3_512); + test_memeq_hex(data, "2E293765022D48996CE8EFF0BE54E87E" + "FB94A14C72DE5ACD10D0EB5ECE029CAD" + "FA3BA17A40B2FFA2163991B17786E51C" + "ABA79E5E0FFD34CF085E2A098BE8BACB"); + tt_int_op(i, OP_EQ, 0); + + /* Len = 1096, Msg = 04410E310... ...601016A0D (SHA3-256 rate + 1) */ + const uint8_t keccak_kat_msg1096[] = { + 0x04, 0x41, 0x0E, 0x31, 0x08, 0x2A, 0x47, 0x58, 0x4B, 0x40, + 0x6F, 0x05, 0x13, 0x98, 0xA6, 0xAB, 0xE7, 0x4E, 0x4D, 0xA5, + 0x9B, 0xB6, 0xF8, 0x5E, 0x6B, 0x49, 0xE8, 0xA1, 0xF7, 0xF2, + 0xCA, 0x00, 0xDF, 0xBA, 0x54, 0x62, 0xC2, 0xCD, 0x2B, 0xFD, + 0xE8, 0xB6, 0x4F, 0xB2, 0x1D, 0x70, 0xC0, 0x83, 0xF1, 0x13, + 0x18, 0xB5, 0x6A, 0x52, 0xD0, 0x3B, 0x81, 0xCA, 0xC5, 0xEE, + 0xC2, 0x9E, 0xB3, 0x1B, 0xD0, 0x07, 0x8B, 0x61, 0x56, 0x78, + 0x6D, 0xA3, 0xD6, 0xD8, 0xC3, 0x30, 0x98, 0xC5, 0xC4, 0x7B, + 0xB6, 0x7A, 0xC6, 0x4D, 0xB1, 0x41, 0x65, 0xAF, 0x65, 0xB4, + 0x45, 0x44, 0xD8, 0x06, 0xDD, 0xE5, 0xF4, 0x87, 0xD5, 0x37, + 0x3C, 0x7F, 0x97, 0x92, 0xC2, 0x99, 0xE9, 0x68, 0x6B, 0x7E, + 0x58, 0x21, 0xE7, 0xC8, 0xE2, 0x45, 0x83, 0x15, 0xB9, 0x96, + 0xB5, 0x67, 0x7D, 0x92, 0x6D, 0xAC, 0x57, 0xB3, 0xF2, 0x2D, + 0xA8, 0x73, 0xC6, 0x01, 0x01, 0x6A, 0x0D, + }; + i = crypto_digest256(data, (const char*)keccak_kat_msg1096, 137, + DIGEST_SHA3_256); + test_memeq_hex(data, "D52432CF3B6B4B949AA848E058DCD62D" + "735E0177279222E7AC0AF8504762FAA0"); + tt_int_op(i, OP_EQ, 0); + i = crypto_digest512(data, (const char*)keccak_kat_msg1096, 137, + DIGEST_SHA3_512); + test_memeq_hex(data, "BE8E14B6757FFE53C9B75F6DDE9A7B6C" + "40474041DE83D4A60645A826D7AF1ABE" + "1EEFCB7B74B62CA6A514E5F2697D585B" + "FECECE12931BBE1D4ED7EBF7B0BE660E"); + tt_int_op(i, OP_EQ, 0); + + /* Len = 1144, Msg = EA40E83C... ...66DFAFEC (SHA3-512 rate *2 - 1) */ + const uint8_t keccak_kat_msg1144[] = { + 0xEA, 0x40, 0xE8, 0x3C, 0xB1, 0x8B, 0x3A, 0x24, 0x2C, 0x1E, + 0xCC, 0x6C, 0xCD, 0x0B, 0x78, 0x53, 0xA4, 0x39, 0xDA, 0xB2, + 0xC5, 0x69, 0xCF, 0xC6, 0xDC, 0x38, 0xA1, 0x9F, 0x5C, 0x90, + 0xAC, 0xBF, 0x76, 0xAE, 0xF9, 0xEA, 0x37, 0x42, 0xFF, 0x3B, + 0x54, 0xEF, 0x7D, 0x36, 0xEB, 0x7C, 0xE4, 0xFF, 0x1C, 0x9A, + 0xB3, 0xBC, 0x11, 0x9C, 0xFF, 0x6B, 0xE9, 0x3C, 0x03, 0xE2, + 0x08, 0x78, 0x33, 0x35, 0xC0, 0xAB, 0x81, 0x37, 0xBE, 0x5B, + 0x10, 0xCD, 0xC6, 0x6F, 0xF3, 0xF8, 0x9A, 0x1B, 0xDD, 0xC6, + 0xA1, 0xEE, 0xD7, 0x4F, 0x50, 0x4C, 0xBE, 0x72, 0x90, 0x69, + 0x0B, 0xB2, 0x95, 0xA8, 0x72, 0xB9, 0xE3, 0xFE, 0x2C, 0xEE, + 0x9E, 0x6C, 0x67, 0xC4, 0x1D, 0xB8, 0xEF, 0xD7, 0xD8, 0x63, + 0xCF, 0x10, 0xF8, 0x40, 0xFE, 0x61, 0x8E, 0x79, 0x36, 0xDA, + 0x3D, 0xCA, 0x5C, 0xA6, 0xDF, 0x93, 0x3F, 0x24, 0xF6, 0x95, + 0x4B, 0xA0, 0x80, 0x1A, 0x12, 0x94, 0xCD, 0x8D, 0x7E, 0x66, + 0xDF, 0xAF, 0xEC, + }; + i = crypto_digest512(data, (const char*)keccak_kat_msg1144, 143, + DIGEST_SHA3_512); + test_memeq_hex(data, "3A8E938C45F3F177991296B24565D9A6" + "605516615D96A062C8BE53A0D6C5A648" + "7BE35D2A8F3CF6620D0C2DBA2C560D68" + "295F284BE7F82F3B92919033C9CE5D80"); + tt_int_op(i, OP_EQ, 0); + i = crypto_digest256(data, (const char*)keccak_kat_msg1144, 143, + DIGEST_SHA3_256); + test_memeq_hex(data, "E58A947E98D6DD7E932D2FE02D9992E6" + "118C0C2C606BDCDA06E7943D2C95E0E5"); + tt_int_op(i, OP_EQ, 0); + + /* Len = 1152, Msg = 157D5B7E... ...79EE00C63 (SHA3-512 rate * 2) */ + const uint8_t keccak_kat_msg1152[] = { + 0x15, 0x7D, 0x5B, 0x7E, 0x45, 0x07, 0xF6, 0x6D, 0x9A, 0x26, + 0x74, 0x76, 0xD3, 0x38, 0x31, 0xE7, 0xBB, 0x76, 0x8D, 0x4D, + 0x04, 0xCC, 0x34, 0x38, 0xDA, 0x12, 0xF9, 0x01, 0x02, 0x63, + 0xEA, 0x5F, 0xCA, 0xFB, 0xDE, 0x25, 0x79, 0xDB, 0x2F, 0x6B, + 0x58, 0xF9, 0x11, 0xD5, 0x93, 0xD5, 0xF7, 0x9F, 0xB0, 0x5F, + 0xE3, 0x59, 0x6E, 0x3F, 0xA8, 0x0F, 0xF2, 0xF7, 0x61, 0xD1, + 0xB0, 0xE5, 0x70, 0x80, 0x05, 0x5C, 0x11, 0x8C, 0x53, 0xE5, + 0x3C, 0xDB, 0x63, 0x05, 0x52, 0x61, 0xD7, 0xC9, 0xB2, 0xB3, + 0x9B, 0xD9, 0x0A, 0xCC, 0x32, 0x52, 0x0C, 0xBB, 0xDB, 0xDA, + 0x2C, 0x4F, 0xD8, 0x85, 0x6D, 0xBC, 0xEE, 0x17, 0x31, 0x32, + 0xA2, 0x67, 0x91, 0x98, 0xDA, 0xF8, 0x30, 0x07, 0xA9, 0xB5, + 0xC5, 0x15, 0x11, 0xAE, 0x49, 0x76, 0x6C, 0x79, 0x2A, 0x29, + 0x52, 0x03, 0x88, 0x44, 0x4E, 0xBE, 0xFE, 0x28, 0x25, 0x6F, + 0xB3, 0x3D, 0x42, 0x60, 0x43, 0x9C, 0xBA, 0x73, 0xA9, 0x47, + 0x9E, 0xE0, 0x0C, 0x63, + }; + i = crypto_digest512(data, (const char*)keccak_kat_msg1152, 144, + DIGEST_SHA3_512); + test_memeq_hex(data, "FE45289874879720CE2A844AE34BB735" + "22775DCB6019DCD22B8885994672A088" + "9C69E8115C641DC8B83E39F7311815A1" + "64DC46E0BA2FCA344D86D4BC2EF2532C"); + tt_int_op(i, OP_EQ, 0); + i = crypto_digest256(data, (const char*)keccak_kat_msg1152, 144, + DIGEST_SHA3_256); + test_memeq_hex(data, "A936FB9AF87FB67857B3EAD5C76226AD" + "84DA47678F3C2FFE5A39FDB5F7E63FFB"); + tt_int_op(i, OP_EQ, 0); + + /* Len = 1160, Msg = 836B34B5... ...11044C53 (SHA3-512 rate * 2 + 1) */ + const uint8_t keccak_kat_msg1160[] = { + 0x83, 0x6B, 0x34, 0xB5, 0x15, 0x47, 0x6F, 0x61, 0x3F, 0xE4, + 0x47, 0xA4, 0xE0, 0xC3, 0xF3, 0xB8, 0xF2, 0x09, 0x10, 0xAC, + 0x89, 0xA3, 0x97, 0x70, 0x55, 0xC9, 0x60, 0xD2, 0xD5, 0xD2, + 0xB7, 0x2B, 0xD8, 0xAC, 0xC7, 0x15, 0xA9, 0x03, 0x53, 0x21, + 0xB8, 0x67, 0x03, 0xA4, 0x11, 0xDD, 0xE0, 0x46, 0x6D, 0x58, + 0xA5, 0x97, 0x69, 0x67, 0x2A, 0xA6, 0x0A, 0xD5, 0x87, 0xB8, + 0x48, 0x1D, 0xE4, 0xBB, 0xA5, 0x52, 0xA1, 0x64, 0x57, 0x79, + 0x78, 0x95, 0x01, 0xEC, 0x53, 0xD5, 0x40, 0xB9, 0x04, 0x82, + 0x1F, 0x32, 0xB0, 0xBD, 0x18, 0x55, 0xB0, 0x4E, 0x48, 0x48, + 0xF9, 0xF8, 0xCF, 0xE9, 0xEB, 0xD8, 0x91, 0x1B, 0xE9, 0x57, + 0x81, 0xA7, 0x59, 0xD7, 0xAD, 0x97, 0x24, 0xA7, 0x10, 0x2D, + 0xBE, 0x57, 0x67, 0x76, 0xB7, 0xC6, 0x32, 0xBC, 0x39, 0xB9, + 0xB5, 0xE1, 0x90, 0x57, 0xE2, 0x26, 0x55, 0x2A, 0x59, 0x94, + 0xC1, 0xDB, 0xB3, 0xB5, 0xC7, 0x87, 0x1A, 0x11, 0xF5, 0x53, + 0x70, 0x11, 0x04, 0x4C, 0x53, + }; + i = crypto_digest512(data, (const char*)keccak_kat_msg1160, 145, + DIGEST_SHA3_512); + test_memeq_hex(data, "AFF61C6E11B98E55AC213B1A0BC7DE04" + "05221AC5EFB1229842E4614F4A029C9B" + "D14A0ED7FD99AF3681429F3F309FDB53" + "166AA9A3CD9F1F1223D04B4A9015E94A"); + tt_int_op(i, OP_EQ, 0); + i = crypto_digest256(data, (const char*)keccak_kat_msg1160, 145, + DIGEST_SHA3_256); + test_memeq_hex(data, "3A654B88F88086C2751EDAE6D3924814" + "3CF6235C6B0B7969342C45A35194B67E"); + tt_int_op(i, OP_EQ, 0); + + /* SHA3-[256,512] Empty case (wikipedia) */ + i = crypto_digest256(data, "", 0, DIGEST_SHA3_256); + test_memeq_hex(data, "a7ffc6f8bf1ed76651c14756a061d662" + "f580ff4de43b49fa82d80a4b80f8434a"); + tt_int_op(i, OP_EQ, 0); + i = crypto_digest512(data, "", 0, DIGEST_SHA3_512); + test_memeq_hex(data, "a69f73cca23a9ac5c8b567dc185a756e" + "97c982164fe25859e0d1dcc1475c80a6" + "15b2123af1f5f94c11e3e9402c3ac558" + "f500199d95b6d3e301758586281dcd26"); + tt_int_op(i, OP_EQ, 0); + + /* Incremental digest code with SHA3-256 */ + d1 = crypto_digest256_new(DIGEST_SHA3_256); + tt_assert(d1); + crypto_digest_add_bytes(d1, "abcdef", 6); + d2 = crypto_digest_dup(d1); + tt_assert(d2); + crypto_digest_add_bytes(d2, "ghijkl", 6); + crypto_digest_get_digest(d2, d_out1, DIGEST256_LEN); + crypto_digest256(d_out2, "abcdefghijkl", 12, DIGEST_SHA3_256); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); + crypto_digest_assign(d2, d1); + crypto_digest_add_bytes(d2, "mno", 3); + crypto_digest_get_digest(d2, d_out1, DIGEST256_LEN); + crypto_digest256(d_out2, "abcdefmno", 9, DIGEST_SHA3_256); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); + crypto_digest_get_digest(d1, d_out1, DIGEST256_LEN); + crypto_digest256(d_out2, "abcdef", 6, DIGEST_SHA3_256); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); + crypto_digest_free(d1); + crypto_digest_free(d2); + + /* Incremental digest code with SHA3-512 */ + d1 = crypto_digest512_new(DIGEST_SHA3_512); + tt_assert(d1); + crypto_digest_add_bytes(d1, "abcdef", 6); + d2 = crypto_digest_dup(d1); + tt_assert(d2); + crypto_digest_add_bytes(d2, "ghijkl", 6); + crypto_digest_get_digest(d2, d_out1, DIGEST512_LEN); + crypto_digest512(d_out2, "abcdefghijkl", 12, DIGEST_SHA3_512); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); + crypto_digest_assign(d2, d1); + crypto_digest_add_bytes(d2, "mno", 3); + crypto_digest_get_digest(d2, d_out1, DIGEST512_LEN); + crypto_digest512(d_out2, "abcdefmno", 9, DIGEST_SHA3_512); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); + crypto_digest_get_digest(d1, d_out1, DIGEST512_LEN); + crypto_digest512(d_out2, "abcdef", 6, DIGEST_SHA3_512); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); + crypto_digest_free(d1); + + /* Attempt to exercise the incremental hashing code by creating a randomized + * 30 KiB buffer, and hashing rand[1, 5 * Rate] bytes at a time. SHA3-512 + * is used because it has a lowest rate of the family (the code is common, + * but the slower rate exercises more of it). + */ + const size_t bufsz = 30 * 1024; + size_t j = 0; + large = tor_malloc(bufsz); + crypto_rand(large, bufsz); + d1 = crypto_digest512_new(DIGEST_SHA3_512); /* Running digest. */ + while (j < bufsz) { + /* Pick how much data to add to the running digest. */ + size_t incr = (size_t)crypto_rand_int_range(1, 72 * 5); + incr = MIN(bufsz - j, incr); + + /* Add the data, and calculate the hash. */ + crypto_digest_add_bytes(d1, large + j, incr); + crypto_digest_get_digest(d1, d_out1, DIGEST512_LEN); + + /* One-shot hash the buffer up to the data that was just added, + * and ensure that the values match up. + * + * XXX/yawning: If this actually fails, it'll be rather difficult to + * reproduce. Improvements welcome. + */ + i = crypto_digest512(d_out2, large, j + incr, DIGEST_SHA3_512); + tt_int_op(i, OP_EQ, 0); + tt_mem_op(d_out1, OP_EQ, d_out2, DIGEST512_LEN); + + j += incr; + } + + done: + if (d1) + crypto_digest_free(d1); + if (d2) + crypto_digest_free(d2); + tor_free(large); + tor_free(mem_op_hex_tmp); +} + +/** Run unit tests for our XOF. */ +static void +test_crypto_sha3_xof(void *arg) +{ + uint8_t msg[255]; + uint8_t out[512]; + crypto_xof_t *xof; + char *mem_op_hex_tmp=NULL; + + (void)arg; + + /* SHAKE256 test vector (Len = 2040) from the Keccak Code Package. */ + base16_decode((char *)msg, 255, + "3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431" + "E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1" + "A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F" + "0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD457" + "4EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F114186" + "90A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED3" + "06FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565" + "CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D7" + "9DC266F6A5BE6BB0E4A92ECEEBAEB1", 510); + const char *squeezed_hex = + "8A5199B4A7E133E264A86202720655894D48CFF344A928CF8347F48379CE" + "F347DFC5BCFFAB99B27B1F89AA2735E23D30088FFA03B9EDB02B9635470A" + "B9F1038985D55F9CA774572DD006470EA65145469609F9FA0831BF1FFD84" + "2DC24ACADE27BD9816E3B5BF2876CB112232A0EB4475F1DFF9F5C713D9FF" + "D4CCB89AE5607FE35731DF06317949EEF646E9591CF3BE53ADD6B7DD2B60" + "96E2B3FB06E662EC8B2D77422DAAD9463CD155204ACDBD38E319613F39F9" + "9B6DFB35CA9365160066DB19835888C2241FF9A731A4ACBB5663727AAC34" + "A401247FBAA7499E7D5EE5B69D31025E63D04C35C798BCA1262D5673A9CF" + "0930B5AD89BD485599DC184528DA4790F088EBD170B635D9581632D2FF90" + "DB79665CED430089AF13C9F21F6D443A818064F17AEC9E9C5457001FA8DC" + "6AFBADBE3138F388D89D0E6F22F66671255B210754ED63D81DCE75CE8F18" + "9B534E6D6B3539AA51E837C42DF9DF59C71E6171CD4902FE1BDC73FB1775" + "B5C754A1ED4EA7F3105FC543EE0418DAD256F3F6118EA77114A16C15355B" + "42877A1DB2A7DF0E155AE1D8670ABCEC3450F4E2EEC9838F895423EF63D2" + "61138BAAF5D9F104CB5A957AEA06C0B9B8C78B0D441796DC0350DDEABB78" + "A33B6F1F9E68EDE3D1805C7B7E2CFD54E0FAD62F0D8CA67A775DC4546AF9" + "096F2EDB221DB42843D65327861282DC946A0BA01A11863AB2D1DFD16E39" + "73D4"; + + /* Test oneshot absorb/squeeze. */ + xof = crypto_xof_new(); + tt_assert(xof); + crypto_xof_add_bytes(xof, msg, sizeof(msg)); + crypto_xof_squeeze_bytes(xof, out, sizeof(out)); + test_memeq_hex(out, squeezed_hex); + crypto_xof_free(xof); + memset(out, 0, sizeof(out)); + + /* Test incremental absorb/squeeze. */ + xof = crypto_xof_new(); + tt_assert(xof); + for (size_t i = 0; i < sizeof(msg); i++) + crypto_xof_add_bytes(xof, msg + i, 1); + for (size_t i = 0; i < sizeof(out); i++) + crypto_xof_squeeze_bytes(xof, out + i, 1); + test_memeq_hex(out, squeezed_hex); + + done: + if (xof) + crypto_xof_free(xof); + tor_free(mem_op_hex_tmp); +} + +/* Test our MAC-SHA3 function. There are not actually any MAC-SHA3 test + * vectors out there for our H(len(k) || k || m) construction. Hence what we + * are gonna do is test our crypto_mac_sha3_256() function against manually + * doing H(len(k) || k||m). If in the future the Keccak group decides to + * standarize an MAC construction and make test vectors, we should + * incorporate them here. */ +static void +test_crypto_mac_sha3(void *arg) +{ + const char msg[] = "i am in a library somewhere using my computer"; + const char key[] = "i'm from the past talking to the future."; + + uint8_t hmac_test[DIGEST256_LEN]; + char hmac_manual[DIGEST256_LEN]; + + (void) arg; + + /* First let's use our nice HMAC-SHA3 function */ + crypto_mac_sha3_256(hmac_test, sizeof(hmac_test), + (uint8_t *) key, strlen(key), + (uint8_t *) msg, strlen(msg)); + + /* Now let's try a manual H(len(k) || k || m) construction */ + { + char *key_msg_concat = NULL, *all = NULL; + int result; + const uint64_t key_len_netorder = tor_htonll(strlen(key)); + size_t all_len; + + tor_asprintf(&key_msg_concat, "%s%s", key, msg); + all_len = sizeof(key_len_netorder) + strlen(key_msg_concat); + all = tor_malloc_zero(all_len); + memcpy(all, &key_len_netorder, sizeof(key_len_netorder)); + memcpy(all + sizeof(key_len_netorder), key_msg_concat, + strlen(key_msg_concat)); + + result = crypto_digest256(hmac_manual, all, all_len, DIGEST_SHA3_256); + tor_free(key_msg_concat); + tor_free(all); + tt_int_op(result, OP_EQ, 0); + } + + /* Now compare the two results */ + tt_mem_op(hmac_test, OP_EQ, hmac_manual, DIGEST256_LEN); + + done: ; +} + +/** Run unit tests for our public key crypto functions */ +static void +test_crypto_pk(void *arg) +{ + crypto_pk_t *pk1 = NULL, *pk2 = NULL; + char *encoded = NULL; + char data1[1024], data2[1024], data3[1024]; + size_t size; + int i, len; + + /* Public-key ciphers */ + (void)arg; + pk1 = pk_generate(0); + pk2 = crypto_pk_new(); + tt_assert(pk1 && pk2); + tt_assert(! crypto_pk_write_public_key_to_string(pk1, &encoded, &size)); + tt_assert(! crypto_pk_read_public_key_from_string(pk2, encoded, size)); + tt_int_op(0,OP_EQ, crypto_pk_cmp_keys(pk1, pk2)); + + /* comparison between keys and NULL */ + tt_int_op(crypto_pk_cmp_keys(NULL, pk1), OP_LT, 0); + tt_int_op(crypto_pk_cmp_keys(NULL, NULL), OP_EQ, 0); + tt_int_op(crypto_pk_cmp_keys(pk1, NULL), OP_GT, 0); + + tt_int_op(128,OP_EQ, crypto_pk_keysize(pk1)); + tt_int_op(1024,OP_EQ, crypto_pk_num_bits(pk1)); + tt_int_op(128,OP_EQ, crypto_pk_keysize(pk2)); + tt_int_op(1024,OP_EQ, crypto_pk_num_bits(pk2)); + + tt_int_op(128,OP_EQ, crypto_pk_public_encrypt(pk2, data1, sizeof(data1), + "Hello whirled.", 15, + PK_PKCS1_OAEP_PADDING)); + tt_int_op(128,OP_EQ, crypto_pk_public_encrypt(pk1, data2, sizeof(data1), + "Hello whirled.", 15, + PK_PKCS1_OAEP_PADDING)); + /* oaep padding should make encryption not match */ + tt_mem_op(data1,OP_NE, data2, 128); + tt_int_op(15,OP_EQ, + crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data1, 128, + PK_PKCS1_OAEP_PADDING,1)); + tt_str_op(data3,OP_EQ, "Hello whirled."); + memset(data3, 0, 1024); + tt_int_op(15,OP_EQ, + crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data2, 128, + PK_PKCS1_OAEP_PADDING,1)); + tt_str_op(data3,OP_EQ, "Hello whirled."); + /* Can't decrypt with public key. */ + tt_int_op(-1,OP_EQ, + crypto_pk_private_decrypt(pk2, data3, sizeof(data3), data2, 128, + PK_PKCS1_OAEP_PADDING,1)); + /* Try again with bad padding */ + memcpy(data2+1, "XYZZY", 5); /* This has fails ~ once-in-2^40 */ + tt_int_op(-1,OP_EQ, + crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data2, 128, + PK_PKCS1_OAEP_PADDING,1)); + + /* File operations: save and load private key */ + tt_assert(! crypto_pk_write_private_key_to_filename(pk1, + get_fname("pkey1"))); + /* failing case for read: can't read. */ + tt_int_op(crypto_pk_read_private_key_from_filename(pk2, get_fname("xyzzy")), + OP_LT, 0); + write_str_to_file(get_fname("xyzzy"), "foobar", 6); + /* Failing case for read: no key. */ + tt_int_op(crypto_pk_read_private_key_from_filename(pk2, get_fname("xyzzy")), + OP_LT, 0); + tt_assert(! crypto_pk_read_private_key_from_filename(pk2, + get_fname("pkey1"))); + tt_int_op(15,OP_EQ, + crypto_pk_private_decrypt(pk2, data3, sizeof(data3), data1, 128, + PK_PKCS1_OAEP_PADDING,1)); + + /* Now try signing. */ + strlcpy(data1, "Ossifrage", 1024); + tt_int_op(128,OP_EQ, + crypto_pk_private_sign(pk1, data2, sizeof(data2), data1, 10)); + tt_int_op(10,OP_EQ, + crypto_pk_public_checksig(pk1, data3, sizeof(data3), data2, 128)); + tt_str_op(data3,OP_EQ, "Ossifrage"); + /* Try signing digests. */ + tt_int_op(128,OP_EQ, crypto_pk_private_sign_digest(pk1, data2, sizeof(data2), + data1, 10)); + tt_int_op(20,OP_EQ, + crypto_pk_public_checksig(pk1, data3, sizeof(data3), data2, 128)); + tt_int_op(0,OP_EQ, + crypto_pk_public_checksig_digest(pk1, data1, 10, data2, 128)); + tt_int_op(-1,OP_EQ, + crypto_pk_public_checksig_digest(pk1, data1, 11, data2, 128)); + + /*XXXX test failed signing*/ + + /* Try encoding */ + crypto_pk_free(pk2); + pk2 = NULL; + i = crypto_pk_asn1_encode(pk1, data1, 1024); + tt_int_op(i, OP_GT, 0); + pk2 = crypto_pk_asn1_decode(data1, i); + tt_int_op(crypto_pk_cmp_keys(pk1, pk2), OP_EQ, 0); + + /* Try with hybrid encryption wrappers. */ + crypto_rand(data1, 1024); + for (i = 85; i < 140; ++i) { + memset(data2,0,1024); + memset(data3,0,1024); + len = crypto_pk_obsolete_public_hybrid_encrypt(pk1,data2,sizeof(data2), + data1,i,PK_PKCS1_OAEP_PADDING,0); + tt_int_op(len, OP_GE, 0); + len = crypto_pk_obsolete_private_hybrid_decrypt(pk1,data3,sizeof(data3), + data2,len,PK_PKCS1_OAEP_PADDING,1); + tt_int_op(len,OP_EQ, i); + tt_mem_op(data1,OP_EQ, data3,i); + } + + /* Try copy_full */ + crypto_pk_free(pk2); + pk2 = crypto_pk_copy_full(pk1); + tt_ptr_op(pk2, OP_NE, NULL); + tt_ptr_op(pk1, OP_NE, pk2); + tt_int_op(crypto_pk_cmp_keys(pk1, pk2), OP_EQ, 0); + + done: + if (pk1) + crypto_pk_free(pk1); + if (pk2) + crypto_pk_free(pk2); + tor_free(encoded); +} + +static void +test_crypto_pk_fingerprints(void *arg) +{ + crypto_pk_t *pk = NULL; + char encoded[512]; + char d[DIGEST_LEN], d2[DIGEST_LEN]; + char fingerprint[FINGERPRINT_LEN+1]; + int n; + unsigned i; + char *mem_op_hex_tmp=NULL; + + (void)arg; + + pk = pk_generate(1); + tt_assert(pk); + n = crypto_pk_asn1_encode(pk, encoded, sizeof(encoded)); + tt_int_op(n, OP_GT, 0); + tt_int_op(n, OP_GT, 128); + tt_int_op(n, OP_LT, 256); + + /* Is digest as expected? */ + crypto_digest(d, encoded, n); + tt_int_op(0, OP_EQ, crypto_pk_get_digest(pk, d2)); + tt_mem_op(d,OP_EQ, d2, DIGEST_LEN); + + /* Is fingerprint right? */ + tt_int_op(0, OP_EQ, crypto_pk_get_fingerprint(pk, fingerprint, 0)); + tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2); + test_memeq_hex(d, fingerprint); + + /* Are spaces right? */ + tt_int_op(0, OP_EQ, crypto_pk_get_fingerprint(pk, fingerprint, 1)); + for (i = 4; i < strlen(fingerprint); i += 5) { + tt_int_op(fingerprint[i], OP_EQ, ' '); + } + tor_strstrip(fingerprint, " "); + tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2); + test_memeq_hex(d, fingerprint); + + /* Now hash again and check crypto_pk_get_hashed_fingerprint. */ + crypto_digest(d2, d, sizeof(d)); + tt_int_op(0, OP_EQ, crypto_pk_get_hashed_fingerprint(pk, fingerprint)); + tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2); + test_memeq_hex(d2, fingerprint); + + done: + crypto_pk_free(pk); + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_pk_base64(void *arg) +{ + crypto_pk_t *pk1 = NULL; + crypto_pk_t *pk2 = NULL; + char *encoded = NULL; + + (void)arg; + + /* Test Base64 encoding a key. */ + pk1 = pk_generate(0); + tt_assert(pk1); + tt_int_op(0, OP_EQ, crypto_pk_base64_encode(pk1, &encoded)); + tt_assert(encoded); + + /* Test decoding a valid key. */ + pk2 = crypto_pk_base64_decode(encoded, strlen(encoded)); + tt_assert(pk2); + tt_int_op(crypto_pk_cmp_keys(pk1, pk2), OP_EQ, 0); + crypto_pk_free(pk2); + + /* Test decoding a invalid key (not Base64). */ + static const char *invalid_b64 = "The key is in another castle!"; + pk2 = crypto_pk_base64_decode(invalid_b64, strlen(invalid_b64)); + tt_ptr_op(pk2, OP_EQ, NULL); + + /* Test decoding a truncated Base64 blob. */ + pk2 = crypto_pk_base64_decode(encoded, strlen(encoded)/2); + tt_ptr_op(pk2, OP_EQ, NULL); + + done: + crypto_pk_free(pk1); + crypto_pk_free(pk2); + tor_free(encoded); +} + +#ifdef HAVE_TRUNCATE +#define do_truncate truncate +#else +static int +do_truncate(const char *fname, size_t len) +{ + struct stat st; + char *bytes; + + bytes = read_file_to_str(fname, RFTS_BIN, &st); + if (!bytes) + return -1; + /* This cast isn't so great, but it should be safe given the actual files + * and lengths we're using. */ + if (st.st_size < (off_t)len) + len = MIN(len, (size_t)st.st_size); + + int r = write_bytes_to_file(fname, bytes, len, 1); + tor_free(bytes); + return r; +} +#endif /* defined(HAVE_TRUNCATE) */ + +/** Sanity check for crypto pk digests */ +static void +test_crypto_digests(void *arg) +{ + crypto_pk_t *k = NULL; + ssize_t r; + common_digests_t pkey_digests; + char digest[DIGEST_LEN]; + + (void)arg; + k = crypto_pk_new(); + tt_assert(k); + r = crypto_pk_read_private_key_from_string(k, AUTHORITY_SIGNKEY_3, -1); + tt_assert(!r); + + r = crypto_pk_get_digest(k, digest); + tt_assert(r == 0); + tt_mem_op(hex_str(digest, DIGEST_LEN),OP_EQ, + AUTHORITY_SIGNKEY_A_DIGEST, HEX_DIGEST_LEN); + + r = crypto_pk_get_common_digests(k, &pkey_digests); + tt_int_op(r, OP_EQ, 0); + + tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA1], DIGEST_LEN),OP_EQ, + AUTHORITY_SIGNKEY_A_DIGEST, HEX_DIGEST_LEN); + tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA256], DIGEST256_LEN),OP_EQ, + AUTHORITY_SIGNKEY_A_DIGEST256, HEX_DIGEST256_LEN); + done: + crypto_pk_free(k); +} + +static void +test_crypto_digest_names(void *arg) +{ + static const struct { + int a; const char *n; + } names[] = { + { DIGEST_SHA1, "sha1" }, + { DIGEST_SHA256, "sha256" }, + { DIGEST_SHA512, "sha512" }, + { DIGEST_SHA3_256, "sha3-256" }, + { DIGEST_SHA3_512, "sha3-512" }, + { -1, NULL } + }; + (void)arg; + + int i; + for (i = 0; names[i].n; ++i) { + tt_str_op(names[i].n, OP_EQ,crypto_digest_algorithm_get_name(names[i].a)); + tt_int_op(names[i].a, + OP_EQ,crypto_digest_algorithm_parse_name(names[i].n)); + } + tt_int_op(-1, OP_EQ, + crypto_digest_algorithm_parse_name("TimeCubeHash-4444")); + done: + ; +} + +/** Run unit tests for misc crypto formatting functionality (base64, base32, + * fingerprints, etc) */ +static void +test_crypto_formats(void *arg) +{ + char *data1 = NULL, *data2 = NULL, *data3 = NULL; + int i, j, idx; + + (void)arg; + data1 = tor_malloc(1024); + data2 = tor_malloc(1024); + data3 = tor_malloc(1024); + tt_assert(data1 && data2 && data3); + + /* Base64 tests */ + memset(data1, 6, 1024); + for (idx = 0; idx < 10; ++idx) { + i = base64_encode(data2, 1024, data1, idx, 0); + tt_int_op(i, OP_GE, 0); + tt_int_op(i, OP_EQ, strlen(data2)); + j = base64_decode(data3, 1024, data2, i); + tt_int_op(j,OP_EQ, idx); + tt_mem_op(data3,OP_EQ, data1, idx); + + i = base64_encode_nopad(data2, 1024, (uint8_t*)data1, idx); + tt_int_op(i, OP_GE, 0); + tt_int_op(i, OP_EQ, strlen(data2)); + tt_assert(! strchr(data2, '=')); + j = base64_decode(data3, 1024, data2, i); + tt_int_op(j, OP_EQ, idx); + tt_mem_op(data3,OP_EQ, data1, idx); + } + + strlcpy(data1, "Test string that contains 35 chars.", 1024); + strlcat(data1, " 2nd string that contains 35 chars.", 1024); + + i = base64_encode(data2, 1024, data1, 71, 0); + tt_int_op(i, OP_GE, 0); + j = base64_decode(data3, 1024, data2, i); + tt_int_op(j,OP_EQ, 71); + tt_str_op(data3,OP_EQ, data1); + tt_int_op(data2[i], OP_EQ, '\0'); + + crypto_rand(data1, DIGEST_LEN); + memset(data2, 100, 1024); + digest_to_base64(data2, data1); + tt_int_op(BASE64_DIGEST_LEN,OP_EQ, strlen(data2)); + tt_int_op(100,OP_EQ, data2[BASE64_DIGEST_LEN+2]); + memset(data3, 99, 1024); + tt_int_op(digest_from_base64(data3, data2),OP_EQ, 0); + tt_mem_op(data1,OP_EQ, data3, DIGEST_LEN); + tt_int_op(99,OP_EQ, data3[DIGEST_LEN+1]); + + tt_int_op(digest_from_base64(data3, "###"), OP_LT, 0); + + /* Encoding SHA256 */ + crypto_rand(data2, DIGEST256_LEN); + memset(data2, 100, 1024); + digest256_to_base64(data2, data1); + tt_int_op(BASE64_DIGEST256_LEN,OP_EQ, strlen(data2)); + tt_int_op(100,OP_EQ, data2[BASE64_DIGEST256_LEN+2]); + memset(data3, 99, 1024); + tt_int_op(digest256_from_base64(data3, data2),OP_EQ, 0); + tt_mem_op(data1,OP_EQ, data3, DIGEST256_LEN); + tt_int_op(99,OP_EQ, data3[DIGEST256_LEN+1]); + + /* Base32 tests */ + strlcpy(data1, "5chrs", 1024); + /* bit pattern is: [35 63 68 72 73] -> + * [00110101 01100011 01101000 01110010 01110011] + * By 5s: [00110 10101 10001 10110 10000 11100 10011 10011] + */ + base32_encode(data2, 9, data1, 5); + tt_str_op(data2,OP_EQ, "gvrwq4tt"); + + strlcpy(data1, "\xFF\xF5\x6D\x44\xAE\x0D\x5C\xC9\x62\xC4", 1024); + base32_encode(data2, 30, data1, 10); + tt_str_op(data2,OP_EQ, "772w2rfobvomsywe"); + + /* Base16 tests */ + strlcpy(data1, "6chrs\xff", 1024); + base16_encode(data2, 13, data1, 6); + tt_str_op(data2,OP_EQ, "3663687273FF"); + + strlcpy(data1, "f0d678affc000100", 1024); + i = base16_decode(data2, 8, data1, 16); + tt_int_op(i,OP_EQ, 8); + tt_mem_op(data2,OP_EQ, "\xf0\xd6\x78\xaf\xfc\x00\x01\x00",8); + + /* now try some failing base16 decodes */ + tt_int_op(-1,OP_EQ, base16_decode(data2, 8, data1, 15)); /* odd input len */ + tt_int_op(-1,OP_EQ, base16_decode(data2, 7, data1, 16)); /* dest too short */ + strlcpy(data1, "f0dz!8affc000100", 1024); + tt_int_op(-1,OP_EQ, base16_decode(data2, 8, data1, 16)); + + tor_free(data1); + tor_free(data2); + tor_free(data3); + + /* Add spaces to fingerprint */ + { + data1 = tor_strdup("ABCD1234ABCD56780000ABCD1234ABCD56780000"); + tt_int_op(strlen(data1),OP_EQ, 40); + data2 = tor_malloc(FINGERPRINT_LEN+1); + crypto_add_spaces_to_fp(data2, FINGERPRINT_LEN+1, data1); + tt_str_op(data2, OP_EQ, + "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000"); + tor_free(data1); + tor_free(data2); + } + + done: + tor_free(data1); + tor_free(data2); + tor_free(data3); +} + +/** Test AES-CTR encryption and decryption with IV. */ +static void +test_crypto_aes_iv(void *arg) +{ + char *plain, *encrypted1, *encrypted2, *decrypted1, *decrypted2; + char plain_1[1], plain_15[15], plain_16[16], plain_17[17]; + char key1[16], key2[16]; + ssize_t encrypted_size, decrypted_size; + + int use_evp = !strcmp(arg,"evp"); + evaluate_evp_for_aes(use_evp); + + plain = tor_malloc(4095); + encrypted1 = tor_malloc(4095 + 1 + 16); + encrypted2 = tor_malloc(4095 + 1 + 16); + decrypted1 = tor_malloc(4095 + 1); + decrypted2 = tor_malloc(4095 + 1); + + crypto_rand(plain, 4095); + crypto_rand(key1, 16); + crypto_rand(key2, 16); + crypto_rand(plain_1, 1); + crypto_rand(plain_15, 15); + crypto_rand(plain_16, 16); + crypto_rand(plain_17, 17); + key1[0] = key2[0] + 128; /* Make sure that contents are different. */ + /* Encrypt and decrypt with the same key. */ + encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 4095, + plain, 4095); + + tt_int_op(encrypted_size,OP_EQ, 16 + 4095); + tt_assert(encrypted_size > 0); /* This is obviously true, since 4111 is + * greater than 0, but its truth is not + * obvious to all analysis tools. */ + decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 4095, + encrypted1, encrypted_size); + + tt_int_op(decrypted_size,OP_EQ, 4095); + tt_assert(decrypted_size > 0); + tt_mem_op(plain,OP_EQ, decrypted1, 4095); + /* Encrypt a second time (with a new random initialization vector). */ + encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted2, 16 + 4095, + plain, 4095); + + tt_int_op(encrypted_size,OP_EQ, 16 + 4095); + tt_assert(encrypted_size > 0); + decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted2, 4095, + encrypted2, encrypted_size); + tt_int_op(decrypted_size,OP_EQ, 4095); + tt_assert(decrypted_size > 0); + tt_mem_op(plain,OP_EQ, decrypted2, 4095); + tt_mem_op(encrypted1,OP_NE, encrypted2, encrypted_size); + /* Decrypt with the wrong key. */ + decrypted_size = crypto_cipher_decrypt_with_iv(key2, decrypted2, 4095, + encrypted1, encrypted_size); + tt_int_op(decrypted_size,OP_EQ, 4095); + tt_mem_op(plain,OP_NE, decrypted2, decrypted_size); + /* Alter the initialization vector. */ + encrypted1[0] += 42; + decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 4095, + encrypted1, encrypted_size); + tt_int_op(decrypted_size,OP_EQ, 4095); + tt_mem_op(plain,OP_NE, decrypted2, 4095); + /* Special length case: 1. */ + encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 1, + plain_1, 1); + tt_int_op(encrypted_size,OP_EQ, 16 + 1); + tt_assert(encrypted_size > 0); + decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 1, + encrypted1, encrypted_size); + tt_int_op(decrypted_size,OP_EQ, 1); + tt_assert(decrypted_size > 0); + tt_mem_op(plain_1,OP_EQ, decrypted1, 1); + /* Special length case: 15. */ + encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 15, + plain_15, 15); + tt_int_op(encrypted_size,OP_EQ, 16 + 15); + tt_assert(encrypted_size > 0); + decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 15, + encrypted1, encrypted_size); + tt_int_op(decrypted_size,OP_EQ, 15); + tt_assert(decrypted_size > 0); + tt_mem_op(plain_15,OP_EQ, decrypted1, 15); + /* Special length case: 16. */ + encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 16, + plain_16, 16); + tt_int_op(encrypted_size,OP_EQ, 16 + 16); + tt_assert(encrypted_size > 0); + decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 16, + encrypted1, encrypted_size); + tt_int_op(decrypted_size,OP_EQ, 16); + tt_assert(decrypted_size > 0); + tt_mem_op(plain_16,OP_EQ, decrypted1, 16); + /* Special length case: 17. */ + encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 17, + plain_17, 17); + tt_int_op(encrypted_size,OP_EQ, 16 + 17); + tt_assert(encrypted_size > 0); + decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 17, + encrypted1, encrypted_size); + tt_int_op(decrypted_size,OP_EQ, 17); + tt_assert(decrypted_size > 0); + tt_mem_op(plain_17,OP_EQ, decrypted1, 17); + + done: + /* Free memory. */ + tor_free(plain); + tor_free(encrypted1); + tor_free(encrypted2); + tor_free(decrypted1); + tor_free(decrypted2); +} + +/** Test base32 decoding. */ +static void +test_crypto_base32_decode(void *arg) +{ + char plain[60], encoded[96 + 1], decoded[60]; + int res; + (void)arg; + crypto_rand(plain, 60); + /* Encode and decode a random string. */ + base32_encode(encoded, 96 + 1, plain, 60); + res = base32_decode(decoded, 60, encoded, 96); + tt_int_op(res,OP_EQ, 0); + tt_mem_op(plain,OP_EQ, decoded, 60); + /* Encode, uppercase, and decode a random string. */ + base32_encode(encoded, 96 + 1, plain, 60); + tor_strupper(encoded); + res = base32_decode(decoded, 60, encoded, 96); + tt_int_op(res,OP_EQ, 0); + tt_mem_op(plain,OP_EQ, decoded, 60); + /* Change encoded string and decode. */ + if (encoded[0] == 'A' || encoded[0] == 'a') + encoded[0] = 'B'; + else + encoded[0] = 'A'; + res = base32_decode(decoded, 60, encoded, 96); + tt_int_op(res,OP_EQ, 0); + tt_mem_op(plain,OP_NE, decoded, 60); + /* Bad encodings. */ + encoded[0] = '!'; + res = base32_decode(decoded, 60, encoded, 96); + tt_int_op(0, OP_GT, res); + + done: + ; +} + +static void +test_crypto_kdf_TAP(void *arg) +{ + uint8_t key_material[100]; + int r; + char *mem_op_hex_tmp = NULL; + + (void)arg; +#define EXPAND(s) \ + r = crypto_expand_key_material_TAP( \ + (const uint8_t*)(s), strlen(s), \ + key_material, 100) + + /* Test vectors generated with a little python script; feel free to write + * your own. */ + memset(key_material, 0, sizeof(key_material)); + EXPAND(""); + tt_int_op(r, OP_EQ, 0); + test_memeq_hex(key_material, + "5ba93c9db0cff93f52b521d7420e43f6eda2784fbf8b4530d8" + "d246dd74ac53a13471bba17941dff7c4ea21bb365bbeeaf5f2" + "c654883e56d11e43c44e9842926af7ca0a8cca12604f945414" + "f07b01e13da42c6cf1de3abfdea9b95f34687cbbe92b9a7383"); + + EXPAND("Tor"); + tt_int_op(r, OP_EQ, 0); + test_memeq_hex(key_material, + "776c6214fc647aaa5f683c737ee66ec44f03d0372e1cce6922" + "7950f236ddf1e329a7ce7c227903303f525a8c6662426e8034" + "870642a6dabbd41b5d97ec9bf2312ea729992f48f8ea2d0ba8" + "3f45dfda1a80bdc8b80de01b23e3e0ffae099b3e4ccf28dc28"); + + EXPAND("AN ALARMING ITEM TO FIND ON A MONTHLY AUTO-DEBIT NOTICE"); + tt_int_op(r, OP_EQ, 0); + test_memeq_hex(key_material, + "a340b5d126086c3ab29c2af4179196dbf95e1c72431419d331" + "4844bf8f6afb6098db952b95581fb6c33625709d6f4400b8e7" + "ace18a70579fad83c0982ef73f89395bcc39493ad53a685854" + "daf2ba9b78733b805d9a6824c907ee1dba5ac27a1e466d4d10"); + + done: + tor_free(mem_op_hex_tmp); + +#undef EXPAND +} + +static void +test_crypto_hkdf_sha256(void *arg) +{ + uint8_t key_material[100]; + const uint8_t salt[] = "ntor-curve25519-sha256-1:key_extract"; + const size_t salt_len = strlen((char*)salt); + const uint8_t m_expand[] = "ntor-curve25519-sha256-1:key_expand"; + const size_t m_expand_len = strlen((char*)m_expand); + int r; + char *mem_op_hex_tmp = NULL; + + (void)arg; + +#define EXPAND(s) \ + r = crypto_expand_key_material_rfc5869_sha256( \ + (const uint8_t*)(s), strlen(s), \ + salt, salt_len, \ + m_expand, m_expand_len, \ + key_material, 100) + + /* Test vectors generated with ntor_ref.py */ + memset(key_material, 0, sizeof(key_material)); + EXPAND(""); + tt_int_op(r, OP_EQ, 0); + test_memeq_hex(key_material, + "d3490ed48b12a48f9547861583573fe3f19aafe3f81dc7fc75" + "eeed96d741b3290f941576c1f9f0b2d463d1ec7ab2c6bf71cd" + "d7f826c6298c00dbfe6711635d7005f0269493edf6046cc7e7" + "dcf6abe0d20c77cf363e8ffe358927817a3d3e73712cee28d8"); + + EXPAND("Tor"); + tt_int_op(r, OP_EQ, 0); + test_memeq_hex(key_material, + "5521492a85139a8d9107a2d5c0d9c91610d0f95989975ebee6" + "c02a4f8d622a6cfdf9b7c7edd3832e2760ded1eac309b76f8d" + "66c4a3c4d6225429b3a016e3c3d45911152fc87bc2de9630c3" + "961be9fdb9f93197ea8e5977180801926d3321fa21513e59ac"); + + EXPAND("AN ALARMING ITEM TO FIND ON YOUR CREDIT-RATING STATEMENT"); + tt_int_op(r, OP_EQ, 0); + test_memeq_hex(key_material, + "a2aa9b50da7e481d30463adb8f233ff06e9571a0ca6ab6df0f" + "b206fa34e5bc78d063fc291501beec53b36e5a0e434561200c" + "5f8bd13e0f88b3459600b4dc21d69363e2895321c06184879d" + "94b18f078411be70b767c7fc40679a9440a0c95ea83a23efbf"); + done: + tor_free(mem_op_hex_tmp); +#undef EXPAND +} + +static void +test_crypto_hkdf_sha256_testvecs(void *arg) +{ + (void) arg; + /* Test vectors from RFC5869, sections A.1 through A.3 */ + const struct { + const char *ikm16, *salt16, *info16; + int L; + const char *okm16; + } vecs[] = { + { /* from A.1 */ + "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + "000102030405060708090a0b0c", + "f0f1f2f3f4f5f6f7f8f9", + 42, + "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf" + "34007208d5b887185865" + }, + { /* from A.2 */ + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + "404142434445464748494a4b4c4d4e4f", + "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f" + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf", + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef" + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", + 82, + "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c" + "59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71" + "cc30c58179ec3e87c14c01d5c1f3434f1d87" + }, + { /* from A.3 */ + "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + "", + "", + 42, + "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d" + "9d201395faa4b61a96c8", + }, + { NULL, NULL, NULL, -1, NULL } + }; + + int i; + char *ikm = NULL; + char *salt = NULL; + char *info = NULL; + char *okm = NULL; + char *mem_op_hex_tmp = NULL; + + for (i = 0; vecs[i].ikm16; ++i) { + size_t ikm_len = strlen(vecs[i].ikm16)/2; + size_t salt_len = strlen(vecs[i].salt16)/2; + size_t info_len = strlen(vecs[i].info16)/2; + size_t okm_len = vecs[i].L; + + ikm = tor_malloc(ikm_len); + salt = tor_malloc(salt_len); + info = tor_malloc(info_len); + okm = tor_malloc(okm_len); + + base16_decode(ikm, ikm_len, vecs[i].ikm16, strlen(vecs[i].ikm16)); + base16_decode(salt, salt_len, vecs[i].salt16, strlen(vecs[i].salt16)); + base16_decode(info, info_len, vecs[i].info16, strlen(vecs[i].info16)); + + int r = crypto_expand_key_material_rfc5869_sha256( + (const uint8_t*)ikm, ikm_len, + (const uint8_t*)salt, salt_len, + (const uint8_t*)info, info_len, + (uint8_t*)okm, okm_len); + tt_int_op(r, OP_EQ, 0); + test_memeq_hex(okm, vecs[i].okm16); + tor_free(ikm); + tor_free(salt); + tor_free(info); + tor_free(okm); + } + done: + tor_free(ikm); + tor_free(salt); + tor_free(info); + tor_free(okm); + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_curve25519_impl(void *arg) +{ + /* adapted from curve25519_donna, which adapted it from test-curve25519 + version 20050915, by D. J. Bernstein, Public domain. */ + + const int randomize_high_bit = (arg != NULL); + +#ifdef SLOW_CURVE25519_TEST + const int loop_max=10000; + const char e1_expected[] = "4faf81190869fd742a33691b0e0824d5" + "7e0329f4dd2819f5f32d130f1296b500"; + const char e2k_expected[] = "05aec13f92286f3a781ccae98995a3b9" + "e0544770bc7de853b38f9100489e3e79"; + const char e1e2k_expected[] = "cd6e8269104eb5aaee886bd2071fba88" + "bd13861475516bc2cd2b6e005e805064"; +#else /* !(defined(SLOW_CURVE25519_TEST)) */ + const int loop_max=200; + const char e1_expected[] = "bc7112cde03f97ef7008cad1bdc56be3" + "c6a1037d74cceb3712e9206871dcf654"; + const char e2k_expected[] = "dd8fa254fb60bdb5142fe05b1f5de44d" + "8e3ee1a63c7d14274ea5d4c67f065467"; + const char e1e2k_expected[] = "7ddb98bd89025d2347776b33901b3e7e" + "c0ee98cb2257a4545c0cfb2ca3e1812b"; +#endif /* defined(SLOW_CURVE25519_TEST) */ + + unsigned char e1k[32]; + unsigned char e2k[32]; + unsigned char e1e2k[32]; + unsigned char e2e1k[32]; + unsigned char e1[32] = {3}; + unsigned char e2[32] = {5}; + unsigned char k[32] = {9}; + int loop, i; + + char *mem_op_hex_tmp = NULL; + + for (loop = 0; loop < loop_max; ++loop) { + curve25519_impl(e1k,e1,k); + curve25519_impl(e2e1k,e2,e1k); + curve25519_impl(e2k,e2,k); + if (randomize_high_bit) { + /* We require that the high bit of the public key be ignored. So if + * we're doing this variant test, we randomize the high bit of e2k, and + * make sure that the handshake still works out the same as it would + * otherwise. */ + uint8_t byte; + crypto_rand((char*)&byte, 1); + e2k[31] |= (byte & 0x80); + } + curve25519_impl(e1e2k,e1,e2k); + tt_mem_op(e1e2k,OP_EQ, e2e1k, 32); + if (loop == loop_max-1) { + break; + } + for (i = 0;i < 32;++i) e1[i] ^= e2k[i]; + for (i = 0;i < 32;++i) e2[i] ^= e1k[i]; + for (i = 0;i < 32;++i) k[i] ^= e1e2k[i]; + } + + test_memeq_hex(e1, e1_expected); + test_memeq_hex(e2k, e2k_expected); + test_memeq_hex(e1e2k, e1e2k_expected); + + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_curve25519_basepoint(void *arg) +{ + uint8_t secret[32]; + uint8_t public1[32]; + uint8_t public2[32]; + const int iters = 2048; + int i; + (void) arg; + + for (i = 0; i < iters; ++i) { + crypto_rand((char*)secret, 32); + curve25519_set_impl_params(1); /* Use optimization */ + curve25519_basepoint_impl(public1, secret); + curve25519_set_impl_params(0); /* Disable optimization */ + curve25519_basepoint_impl(public2, secret); + tt_mem_op(public1, OP_EQ, public2, 32); + } + + done: + ; +} + +static void +test_crypto_curve25519_testvec(void *arg) +{ + (void)arg; + char *mem_op_hex_tmp = NULL; + + /* From RFC 7748, section 6.1 */ + /* Alice's private key, a: */ + const char a16[] = + "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a"; + /* Alice's public key, X25519(a, 9): */ + const char a_pub16[] = + "8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a"; + /* Bob's private key, b: */ + const char b16[] = + "5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb"; + /* Bob's public key, X25519(b, 9): */ + const char b_pub16[] = + "de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f"; + /* Their shared secret, K: */ + const char k16[] = + "4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742"; + + uint8_t a[32], b[32], a_pub[32], b_pub[32], k1[32], k2[32]; + base16_decode((char*)a, sizeof(a), a16, strlen(a16)); + base16_decode((char*)b, sizeof(b), b16, strlen(b16)); + curve25519_basepoint_impl(a_pub, a); + curve25519_basepoint_impl(b_pub, b); + curve25519_impl(k1, a, b_pub); + curve25519_impl(k2, b, a_pub); + + test_memeq_hex(a, a16); + test_memeq_hex(b, b16); + test_memeq_hex(a_pub, a_pub16); + test_memeq_hex(b_pub, b_pub16); + test_memeq_hex(k1, k16); + test_memeq_hex(k2, k16); + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_curve25519_wrappers(void *arg) +{ + curve25519_public_key_t pubkey1, pubkey2; + curve25519_secret_key_t seckey1, seckey2; + + uint8_t output1[CURVE25519_OUTPUT_LEN]; + uint8_t output2[CURVE25519_OUTPUT_LEN]; + (void)arg; + + /* Test a simple handshake, serializing and deserializing some stuff. */ + curve25519_secret_key_generate(&seckey1, 0); + curve25519_secret_key_generate(&seckey2, 1); + curve25519_public_key_generate(&pubkey1, &seckey1); + curve25519_public_key_generate(&pubkey2, &seckey2); + tt_assert(curve25519_public_key_is_ok(&pubkey1)); + tt_assert(curve25519_public_key_is_ok(&pubkey2)); + curve25519_handshake(output1, &seckey1, &pubkey2); + curve25519_handshake(output2, &seckey2, &pubkey1); + tt_mem_op(output1,OP_EQ, output2, sizeof(output1)); + + done: + ; +} + +static void +test_crypto_curve25519_encode(void *arg) +{ + curve25519_secret_key_t seckey; + curve25519_public_key_t key1, key2, key3; + char buf[64]; + + (void)arg; + + curve25519_secret_key_generate(&seckey, 0); + curve25519_public_key_generate(&key1, &seckey); + tt_int_op(0, OP_EQ, curve25519_public_to_base64(buf, &key1)); + tt_int_op(CURVE25519_BASE64_PADDED_LEN, OP_EQ, strlen(buf)); + + tt_int_op(0, OP_EQ, curve25519_public_from_base64(&key2, buf)); + tt_mem_op(key1.public_key,OP_EQ, key2.public_key, CURVE25519_PUBKEY_LEN); + + buf[CURVE25519_BASE64_PADDED_LEN - 1] = '\0'; + tt_int_op(CURVE25519_BASE64_PADDED_LEN-1, OP_EQ, strlen(buf)); + tt_int_op(0, OP_EQ, curve25519_public_from_base64(&key3, buf)); + tt_mem_op(key1.public_key,OP_EQ, key3.public_key, CURVE25519_PUBKEY_LEN); + + /* Now try bogus parses. */ + strlcpy(buf, "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=", sizeof(buf)); + tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf)); + + strlcpy(buf, "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", sizeof(buf)); + tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf)); + + strlcpy(buf, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", sizeof(buf)); + tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf)); + + done: + ; +} + +static void +test_crypto_curve25519_persist(void *arg) +{ + curve25519_keypair_t keypair, keypair2; + char *fname = tor_strdup(get_fname("curve25519_keypair")); + char *tag = NULL; + char *content = NULL; + const char *cp; + struct stat st; + size_t taglen; + + (void)arg; + + tt_int_op(0,OP_EQ,curve25519_keypair_generate(&keypair, 0)); + + tt_int_op(0,OP_EQ, + curve25519_keypair_write_to_file(&keypair, fname, "testing")); + tt_int_op(0,OP_EQ,curve25519_keypair_read_from_file(&keypair2, &tag, fname)); + tt_str_op(tag,OP_EQ,"testing"); + tor_free(tag); + + tt_mem_op(keypair.pubkey.public_key,OP_EQ, + keypair2.pubkey.public_key, + CURVE25519_PUBKEY_LEN); + tt_mem_op(keypair.seckey.secret_key,OP_EQ, + keypair2.seckey.secret_key, + CURVE25519_SECKEY_LEN); + + content = read_file_to_str(fname, RFTS_BIN, &st); + tt_assert(content); + taglen = strlen("== c25519v1: testing =="); + tt_u64_op((uint64_t)st.st_size, OP_EQ, + 32+CURVE25519_PUBKEY_LEN+CURVE25519_SECKEY_LEN); + tt_assert(fast_memeq(content, "== c25519v1: testing ==", taglen)); + tt_assert(tor_mem_is_zero(content+taglen, 32-taglen)); + cp = content + 32; + tt_mem_op(keypair.seckey.secret_key,OP_EQ, + cp, + CURVE25519_SECKEY_LEN); + cp += CURVE25519_SECKEY_LEN; + tt_mem_op(keypair.pubkey.public_key,OP_EQ, + cp, + CURVE25519_SECKEY_LEN); + + tor_free(fname); + fname = tor_strdup(get_fname("bogus_keypair")); + + tt_int_op(-1, OP_EQ, + curve25519_keypair_read_from_file(&keypair2, &tag, fname)); + tor_free(tag); + + content[69] ^= 0xff; + tt_int_op(0, OP_EQ, + write_bytes_to_file(fname, content, (size_t)st.st_size, 1)); + tt_int_op(-1, OP_EQ, + curve25519_keypair_read_from_file(&keypair2, &tag, fname)); + + done: + tor_free(fname); + tor_free(content); + tor_free(tag); +} + +static void +test_crypto_ed25519_simple(void *arg) +{ + ed25519_keypair_t kp1, kp2; + ed25519_public_key_t pub1, pub2; + ed25519_secret_key_t sec1, sec2; + ed25519_signature_t sig1, sig2; + const uint8_t msg[] = + "GNU will be able to run Unix programs, " + "but will not be identical to Unix."; + const uint8_t msg2[] = + "Microsoft Windows extends the features of the DOS operating system, " + "yet is compatible with most existing applications that run under DOS."; + size_t msg_len = strlen((const char*)msg); + size_t msg2_len = strlen((const char*)msg2); + + (void)arg; + + tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sec1, 0)); + tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sec2, 1)); + + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub1, &sec1)); + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub2, &sec1)); + + tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, 0); + tt_int_op(ed25519_validate_pubkey(&pub2), OP_EQ, 0); + + tt_mem_op(pub1.pubkey, OP_EQ, pub2.pubkey, sizeof(pub1.pubkey)); + tt_assert(ed25519_pubkey_eq(&pub1, &pub2)); + tt_assert(ed25519_pubkey_eq(&pub1, &pub1)); + + memcpy(&kp1.pubkey, &pub1, sizeof(pub1)); + memcpy(&kp1.seckey, &sec1, sizeof(sec1)); + tt_int_op(0, OP_EQ, ed25519_sign(&sig1, msg, msg_len, &kp1)); + tt_int_op(0, OP_EQ, ed25519_sign(&sig2, msg, msg_len, &kp1)); + + /* Ed25519 signatures are deterministic */ + tt_mem_op(sig1.sig, OP_EQ, sig2.sig, sizeof(sig1.sig)); + + /* Basic signature is valid. */ + tt_int_op(0, OP_EQ, ed25519_checksig(&sig1, msg, msg_len, &pub1)); + + /* Altered signature doesn't work. */ + sig1.sig[0] ^= 3; + tt_int_op(-1, OP_EQ, ed25519_checksig(&sig1, msg, msg_len, &pub1)); + + /* Wrong public key doesn't work. */ + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub2, &sec2)); + tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg, msg_len, &pub2)); + tt_assert(! ed25519_pubkey_eq(&pub1, &pub2)); + + /* Wrong message doesn't work. */ + tt_int_op(0, OP_EQ, ed25519_checksig(&sig2, msg, msg_len, &pub1)); + tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg, msg_len-1, &pub1)); + tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg2, msg2_len, &pub1)); + + /* Batch signature checking works with some bad. */ + tt_int_op(0, OP_EQ, ed25519_keypair_generate(&kp2, 0)); + tt_int_op(0, OP_EQ, ed25519_sign(&sig1, msg, msg_len, &kp2)); + { + ed25519_checkable_t ch[] = { + { &pub1, sig2, msg, msg_len }, /*ok*/ + { &pub1, sig2, msg, msg_len-1 }, /*bad*/ + { &kp2.pubkey, sig2, msg2, msg2_len }, /*bad*/ + { &kp2.pubkey, sig1, msg, msg_len }, /*ok*/ + }; + int okay[4]; + tt_int_op(-2, OP_EQ, ed25519_checksig_batch(okay, ch, 4)); + tt_int_op(okay[0], OP_EQ, 1); + tt_int_op(okay[1], OP_EQ, 0); + tt_int_op(okay[2], OP_EQ, 0); + tt_int_op(okay[3], OP_EQ, 1); + tt_int_op(-2, OP_EQ, ed25519_checksig_batch(NULL, ch, 4)); + } + + /* Batch signature checking works with all good. */ + { + ed25519_checkable_t ch[] = { + { &pub1, sig2, msg, msg_len }, /*ok*/ + { &kp2.pubkey, sig1, msg, msg_len }, /*ok*/ + }; + int okay[2]; + tt_int_op(0, OP_EQ, ed25519_checksig_batch(okay, ch, 2)); + tt_int_op(okay[0], OP_EQ, 1); + tt_int_op(okay[1], OP_EQ, 1); + tt_int_op(0, OP_EQ, ed25519_checksig_batch(NULL, ch, 2)); + } + + /* Test the string-prefixed sign/checksig functions */ + { + ed25519_signature_t manual_sig; + char *prefixed_msg; + + /* Generate a signature with a prefixed msg. */ + tt_int_op(0, OP_EQ, ed25519_sign_prefixed(&sig1, msg, msg_len, + "always in the mood", + &kp1)); + + /* First, check that ed25519_sign_prefixed() returns the exact same sig as + if we had manually prefixed the msg ourselves. */ + tor_asprintf(&prefixed_msg, "%s%s", "always in the mood", msg); + tt_int_op(0, OP_EQ, ed25519_sign(&manual_sig, (uint8_t *)prefixed_msg, + strlen(prefixed_msg), &kp1)); + tor_free(prefixed_msg); + tt_assert(fast_memeq(sig1.sig, manual_sig.sig, sizeof(sig1.sig))); + + /* Test that prefixed checksig verifies it properly. */ + tt_int_op(0, OP_EQ, ed25519_checksig_prefixed(&sig1, msg, msg_len, + "always in the mood", + &pub1)); + + /* Test that checksig with wrong prefix fails. */ + tt_int_op(-1, OP_EQ, ed25519_checksig_prefixed(&sig1, msg, msg_len, + "always in the moo", + &pub1)); + tt_int_op(-1, OP_EQ, ed25519_checksig_prefixed(&sig1, msg, msg_len, + "always in the moon", + &pub1)); + tt_int_op(-1, OP_EQ, ed25519_checksig_prefixed(&sig1, msg, msg_len, + "always in the mood!", + &pub1)); + } + + done: + ; +} + +static void +test_crypto_ed25519_test_vectors(void *arg) +{ + char *mem_op_hex_tmp=NULL; + int i; + struct { + const char *sk; + const char *pk; + const char *sig; + const char *msg; + } items[] = { + /* These test vectors were generated with the "ref" implementation of + * ed25519 from SUPERCOP-20130419 */ + { "4c6574277320686f706520746865726520617265206e6f206275677320696e20", + "f3e0e493b30f56e501aeb868fc912fe0c8b76621efca47a78f6d75875193dd87", + "b5d7fd6fd3adf643647ce1fe87a2931dedd1a4e38e6c662bedd35cdd80bfac51" + "1b2c7d1ee6bd929ac213014e1a8dc5373854c7b25dbe15ec96bf6c94196fae06", + "506c6561736520657863757365206d7920667269656e642e2048652069736e2774" + "204e554c2d7465726d696e617465642e" + }, + + { "74686520696d706c656d656e746174696f6e20776869636820617265206e6f74", + "407f0025a1e1351a4cb68e92f5c0ebaf66e7aaf93a4006a4d1a66e3ede1cfeac", + "02884fde1c3c5944d0ecf2d133726fc820c303aae695adceabf3a1e01e95bf28" + "da88c0966f5265e9c6f8edc77b3b96b5c91baec3ca993ccd21a3f64203600601", + "506c6561736520657863757365206d7920667269656e642e2048652069736e2774" + "204e554c2d7465726d696e617465642e" + }, + { "6578706f73656420627920456e676c697368207465787420617320696e707574", + "61681cb5fbd69f9bc5a462a21a7ab319011237b940bc781cdc47fcbe327e7706", + "6a127d0414de7510125d4bc214994ffb9b8857a46330832d05d1355e882344ad" + "f4137e3ca1f13eb9cc75c887ef2309b98c57528b4acd9f6376c6898889603209", + "506c6561736520657863757365206d7920667269656e642e2048652069736e2774" + "204e554c2d7465726d696e617465642e" + }, + + /* These come from "sign.input" in ed25519's page */ + { "5b5a619f8ce1c66d7ce26e5a2ae7b0c04febcd346d286c929e19d0d5973bfef9", + "6fe83693d011d111131c4f3fbaaa40a9d3d76b30012ff73bb0e39ec27ab18257", + "0f9ad9793033a2fa06614b277d37381e6d94f65ac2a5a94558d09ed6ce922258" + "c1a567952e863ac94297aec3c0d0c8ddf71084e504860bb6ba27449b55adc40e", + "5a8d9d0a22357e6655f9c785" + }, + { "940c89fe40a81dafbdb2416d14ae469119869744410c3303bfaa0241dac57800", + "a2eb8c0501e30bae0cf842d2bde8dec7386f6b7fc3981b8c57c9792bb94cf2dd", + "d8bb64aad8c9955a115a793addd24f7f2b077648714f49c4694ec995b330d09d" + "640df310f447fd7b6cb5c14f9fe9f490bcf8cfadbfd2169c8ac20d3b8af49a0c", + "b87d3813e03f58cf19fd0b6395" + }, + { "9acad959d216212d789a119252ebfe0c96512a23c73bd9f3b202292d6916a738", + "cf3af898467a5b7a52d33d53bc037e2642a8da996903fc252217e9c033e2f291", + "6ee3fe81e23c60eb2312b2006b3b25e6838e02106623f844c44edb8dafd66ab0" + "671087fd195df5b8f58a1d6e52af42908053d55c7321010092748795ef94cf06", + "55c7fa434f5ed8cdec2b7aeac173", + }, + { "d5aeee41eeb0e9d1bf8337f939587ebe296161e6bf5209f591ec939e1440c300", + "fd2a565723163e29f53c9de3d5e8fbe36a7ab66e1439ec4eae9c0a604af291a5", + "f68d04847e5b249737899c014d31c805c5007a62c0a10d50bb1538c5f3550395" + "1fbc1e08682f2cc0c92efe8f4985dec61dcbd54d4b94a22547d24451271c8b00", + "0a688e79be24f866286d4646b5d81c" + }, + /* These come from draft-irtf-cfrg-eddsa-05 section 7.1 */ + { + "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", + "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e06522490155" + "5fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", + "" + }, + { + "4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb", + "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c", + "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da" + "085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00", + "72" + }, + { + "f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5", + "278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e", + "0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350" + "aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03", + "08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98" + "fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d8" + "79de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d" + "658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc" + "1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4fe" + "ba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e" + "06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbef" + "efd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7" + "aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed1" + "85ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2" + "d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24" + "554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f270" + "88d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc" + "2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b07" + "07e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128ba" + "b27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51a" + "ddd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429e" + "c96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb7" + "51fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c" + "42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8" + "ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34df" + "f7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08" + "d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649" + "de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e4" + "88acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a3" + "2ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e" + "6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5f" + "b93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b5" + "0d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1" + "369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380d" + "b2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c" + "0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0" + }, + { + "833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42", + "ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf", + "dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b589" + "09351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704", + "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" + "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f" + }, + { NULL, NULL, NULL, NULL} + }; + + (void)arg; + + for (i = 0; items[i].pk; ++i) { + ed25519_keypair_t kp; + ed25519_signature_t sig; + uint8_t sk_seed[32]; + uint8_t *msg; + size_t msg_len; + base16_decode((char*)sk_seed, sizeof(sk_seed), + items[i].sk, 64); + ed25519_secret_key_from_seed(&kp.seckey, sk_seed); + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&kp.pubkey, &kp.seckey)); + test_memeq_hex(kp.pubkey.pubkey, items[i].pk); + + msg_len = strlen(items[i].msg) / 2; + msg = tor_malloc(msg_len); + base16_decode((char*)msg, msg_len, items[i].msg, strlen(items[i].msg)); + + tt_int_op(0, OP_EQ, ed25519_sign(&sig, msg, msg_len, &kp)); + test_memeq_hex(sig.sig, items[i].sig); + + tor_free(msg); + } + + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_ed25519_encode(void *arg) +{ + char buf[ED25519_SIG_BASE64_LEN+1]; + ed25519_keypair_t kp; + ed25519_public_key_t pk; + ed25519_signature_t sig1, sig2; + char *mem_op_hex_tmp = NULL; + (void) arg; + + /* Test roundtrip. */ + tt_int_op(0, OP_EQ, ed25519_keypair_generate(&kp, 0)); + tt_int_op(0, OP_EQ, ed25519_public_to_base64(buf, &kp.pubkey)); + tt_int_op(ED25519_BASE64_LEN, OP_EQ, strlen(buf)); + tt_int_op(0, OP_EQ, ed25519_public_from_base64(&pk, buf)); + tt_mem_op(kp.pubkey.pubkey, OP_EQ, pk.pubkey, ED25519_PUBKEY_LEN); + + tt_int_op(0, OP_EQ, ed25519_sign(&sig1, (const uint8_t*)"ABC", 3, &kp)); + tt_int_op(0, OP_EQ, ed25519_signature_to_base64(buf, &sig1)); + tt_int_op(0, OP_EQ, ed25519_signature_from_base64(&sig2, buf)); + tt_mem_op(sig1.sig, OP_EQ, sig2.sig, ED25519_SIG_LEN); + + /* Test known value. */ + tt_int_op(0, OP_EQ, ed25519_public_from_base64(&pk, + "lVIuIctLjbGZGU5wKMNXxXlSE3cW4kaqkqm04u6pxvM")); + test_memeq_hex(pk.pubkey, + "95522e21cb4b8db199194e7028c357c57952137716e246aa92a9b4e2eea9c6f3"); + + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_ed25519_convert(void *arg) +{ + const uint8_t msg[] = + "The eyes are not here / There are no eyes here."; + const int N = 30; + int i; + (void)arg; + + for (i = 0; i < N; ++i) { + curve25519_keypair_t curve25519_keypair; + ed25519_keypair_t ed25519_keypair; + ed25519_public_key_t ed25519_pubkey; + + int bit=0; + ed25519_signature_t sig; + + tt_int_op(0,OP_EQ,curve25519_keypair_generate(&curve25519_keypair, i&1)); + tt_int_op(0,OP_EQ,ed25519_keypair_from_curve25519_keypair( + &ed25519_keypair, &bit, &curve25519_keypair)); + tt_int_op(0,OP_EQ,ed25519_public_key_from_curve25519_public_key( + &ed25519_pubkey, &curve25519_keypair.pubkey, bit)); + tt_mem_op(ed25519_pubkey.pubkey, OP_EQ, ed25519_keypair.pubkey.pubkey, 32); + + tt_int_op(0,OP_EQ,ed25519_sign(&sig, msg, sizeof(msg), &ed25519_keypair)); + tt_int_op(0,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), + &ed25519_pubkey)); + + tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg)-1, + &ed25519_pubkey)); + sig.sig[0] ^= 15; + tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), + &ed25519_pubkey)); + } + + done: + ; +} + +static void +test_crypto_ed25519_blinding(void *arg) +{ + const uint8_t msg[] = + "Eyes I dare not meet in dreams / In death's dream kingdom"; + + const int N = 30; + int i; + (void)arg; + + for (i = 0; i < N; ++i) { + uint8_t blinding[32]; + ed25519_keypair_t ed25519_keypair; + ed25519_keypair_t ed25519_keypair_blinded; + ed25519_public_key_t ed25519_pubkey_blinded; + + ed25519_signature_t sig; + + crypto_rand((char*) blinding, sizeof(blinding)); + + tt_int_op(0,OP_EQ,ed25519_keypair_generate(&ed25519_keypair, 0)); + tt_int_op(0,OP_EQ,ed25519_keypair_blind(&ed25519_keypair_blinded, + &ed25519_keypair, blinding)); + + tt_int_op(0,OP_EQ,ed25519_public_blind(&ed25519_pubkey_blinded, + &ed25519_keypair.pubkey, blinding)); + + tt_mem_op(ed25519_pubkey_blinded.pubkey, OP_EQ, + ed25519_keypair_blinded.pubkey.pubkey, 32); + + tt_int_op(0,OP_EQ,ed25519_sign(&sig, msg, sizeof(msg), + &ed25519_keypair_blinded)); + + tt_int_op(0,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), + &ed25519_pubkey_blinded)); + + tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg)-1, + &ed25519_pubkey_blinded)); + sig.sig[0] ^= 15; + tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), + &ed25519_pubkey_blinded)); + } + + done: + ; +} + +/** Test that our blinding functions will fail if we pass them bad pubkeys */ +static void +test_crypto_ed25519_blinding_fail(void *arg) +{ + int retval; + uint8_t param[32] = {2}; + ed25519_public_key_t pub; + ed25519_public_key_t pub_blinded; + + (void)arg; + + /* This point is not on the curve: the blind routines should fail */ + const char badkey[] = + "e19c65de75c68cf3b7643ea732ba9eb1a3d20d6d57ba223c2ece1df66feb5af0"; + retval = base16_decode((char*)pub.pubkey, sizeof(pub.pubkey), + badkey, strlen(badkey)); + tt_int_op(retval, OP_EQ, sizeof(pub.pubkey)); + retval = ed25519_public_blind(&pub_blinded, &pub, param); + tt_int_op(retval, OP_EQ, -1); + + /* This point is legit: blind routines should be happy */ + const char goodkey[] = + "4ba2e44760dff4c559ef3c38768c1c14a8a54740c782c8d70803e9d6e3ad8794"; + retval = base16_decode((char*)pub.pubkey, sizeof(pub.pubkey), + goodkey, strlen(goodkey)); + tt_int_op(retval, OP_EQ, sizeof(pub.pubkey)); + retval = ed25519_public_blind(&pub_blinded, &pub, param); + tt_int_op(retval, OP_EQ, 0); + + done: + ; +} + +static void +test_crypto_ed25519_testvectors(void *arg) +{ + unsigned i; + char *mem_op_hex_tmp = NULL; + (void)arg; + + for (i = 0; i < ARRAY_LENGTH(ED25519_SECRET_KEYS); ++i) { + uint8_t sk[32]; + ed25519_secret_key_t esk; + ed25519_public_key_t pk, blind_pk, pkfromcurve; + ed25519_keypair_t keypair, blind_keypair; + curve25519_keypair_t curvekp; + uint8_t blinding_param[32]; + ed25519_signature_t sig; + int sign; + + memset(&curvekp, 0xd0, sizeof(curvekp)); + +#define DECODE(p,s) base16_decode((char*)(p),sizeof(p),(s),strlen(s)) +#define EQ(a,h) test_memeq_hex((const char*)(a), (h)) + + tt_int_op(sizeof(sk), OP_EQ, DECODE(sk, ED25519_SECRET_KEYS[i])); + tt_int_op(sizeof(blinding_param), OP_EQ, DECODE(blinding_param, + ED25519_BLINDING_PARAMS[i])); + + tt_int_op(0, OP_EQ, ed25519_secret_key_from_seed(&esk, sk)); + EQ(esk.seckey, ED25519_EXPANDED_SECRET_KEYS[i]); + + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pk, &esk)); + EQ(pk.pubkey, ED25519_PUBLIC_KEYS[i]); + + memcpy(&curvekp.seckey.secret_key, esk.seckey, 32); + curve25519_public_key_generate(&curvekp.pubkey, &curvekp.seckey); + + tt_int_op(0, OP_EQ, + ed25519_keypair_from_curve25519_keypair(&keypair, &sign, &curvekp)); + tt_int_op(0, OP_EQ, ed25519_public_key_from_curve25519_public_key( + &pkfromcurve, &curvekp.pubkey, sign)); + tt_mem_op(keypair.pubkey.pubkey, OP_EQ, pkfromcurve.pubkey, 32); + EQ(curvekp.pubkey.public_key, ED25519_CURVE25519_PUBLIC_KEYS[i]); + + /* Self-signing */ + memcpy(&keypair.seckey, &esk, sizeof(esk)); + memcpy(&keypair.pubkey, &pk, sizeof(pk)); + + tt_int_op(0, OP_EQ, ed25519_sign(&sig, pk.pubkey, 32, &keypair)); + + EQ(sig.sig, ED25519_SELF_SIGNATURES[i]); + + /* Blinding */ + tt_int_op(0, OP_EQ, + ed25519_keypair_blind(&blind_keypair, &keypair, blinding_param)); + tt_int_op(0, OP_EQ, + ed25519_public_blind(&blind_pk, &pk, blinding_param)); + + EQ(blind_keypair.seckey.seckey, ED25519_BLINDED_SECRET_KEYS[i]); + EQ(blind_pk.pubkey, ED25519_BLINDED_PUBLIC_KEYS[i]); + + tt_mem_op(blind_pk.pubkey, OP_EQ, blind_keypair.pubkey.pubkey, 32); + +#undef DECODE +#undef EQ + } + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_ed25519_storage(void *arg) +{ + (void)arg; + ed25519_keypair_t *keypair = NULL; + ed25519_public_key_t pub; + ed25519_secret_key_t sec; + char *fname_1 = tor_strdup(get_fname("ed_seckey_1")); + char *fname_2 = tor_strdup(get_fname("ed_pubkey_2")); + char *contents = NULL; + char *tag = NULL; + + keypair = tor_malloc_zero(sizeof(ed25519_keypair_t)); + tt_int_op(0,OP_EQ,ed25519_keypair_generate(keypair, 0)); + tt_int_op(0,OP_EQ, + ed25519_seckey_write_to_file(&keypair->seckey, fname_1, "foo")); + tt_int_op(0,OP_EQ, + ed25519_pubkey_write_to_file(&keypair->pubkey, fname_2, "bar")); + + tt_int_op(-1, OP_EQ, ed25519_pubkey_read_from_file(&pub, &tag, fname_1)); + tt_ptr_op(tag, OP_EQ, NULL); + tt_int_op(-1, OP_EQ, ed25519_seckey_read_from_file(&sec, &tag, fname_2)); + tt_ptr_op(tag, OP_EQ, NULL); + + tt_int_op(0, OP_EQ, ed25519_pubkey_read_from_file(&pub, &tag, fname_2)); + tt_str_op(tag, OP_EQ, "bar"); + tor_free(tag); + tt_int_op(0, OP_EQ, ed25519_seckey_read_from_file(&sec, &tag, fname_1)); + tt_str_op(tag, OP_EQ, "foo"); + tor_free(tag); + + /* whitebox test: truncated keys. */ + tt_int_op(0, OP_EQ, do_truncate(fname_1, 40)); + tt_int_op(0, OP_EQ, do_truncate(fname_2, 40)); + tt_int_op(-1, OP_EQ, ed25519_pubkey_read_from_file(&pub, &tag, fname_2)); + tt_ptr_op(tag, OP_EQ, NULL); + tor_free(tag); + tt_int_op(-1, OP_EQ, ed25519_seckey_read_from_file(&sec, &tag, fname_1)); + tt_ptr_op(tag, OP_EQ, NULL); + + done: + tor_free(fname_1); + tor_free(fname_2); + tor_free(contents); + tor_free(tag); + ed25519_keypair_free(keypair); +} + +static void +test_crypto_siphash(void *arg) +{ + /* From the reference implementation, taking + k = 00 01 02 ... 0f + and in = 00; 00 01; 00 01 02; ... + */ + const uint8_t VECTORS[64][8] = + { + { 0x31, 0x0e, 0x0e, 0xdd, 0x47, 0xdb, 0x6f, 0x72, }, + { 0xfd, 0x67, 0xdc, 0x93, 0xc5, 0x39, 0xf8, 0x74, }, + { 0x5a, 0x4f, 0xa9, 0xd9, 0x09, 0x80, 0x6c, 0x0d, }, + { 0x2d, 0x7e, 0xfb, 0xd7, 0x96, 0x66, 0x67, 0x85, }, + { 0xb7, 0x87, 0x71, 0x27, 0xe0, 0x94, 0x27, 0xcf, }, + { 0x8d, 0xa6, 0x99, 0xcd, 0x64, 0x55, 0x76, 0x18, }, + { 0xce, 0xe3, 0xfe, 0x58, 0x6e, 0x46, 0xc9, 0xcb, }, + { 0x37, 0xd1, 0x01, 0x8b, 0xf5, 0x00, 0x02, 0xab, }, + { 0x62, 0x24, 0x93, 0x9a, 0x79, 0xf5, 0xf5, 0x93, }, + { 0xb0, 0xe4, 0xa9, 0x0b, 0xdf, 0x82, 0x00, 0x9e, }, + { 0xf3, 0xb9, 0xdd, 0x94, 0xc5, 0xbb, 0x5d, 0x7a, }, + { 0xa7, 0xad, 0x6b, 0x22, 0x46, 0x2f, 0xb3, 0xf4, }, + { 0xfb, 0xe5, 0x0e, 0x86, 0xbc, 0x8f, 0x1e, 0x75, }, + { 0x90, 0x3d, 0x84, 0xc0, 0x27, 0x56, 0xea, 0x14, }, + { 0xee, 0xf2, 0x7a, 0x8e, 0x90, 0xca, 0x23, 0xf7, }, + { 0xe5, 0x45, 0xbe, 0x49, 0x61, 0xca, 0x29, 0xa1, }, + { 0xdb, 0x9b, 0xc2, 0x57, 0x7f, 0xcc, 0x2a, 0x3f, }, + { 0x94, 0x47, 0xbe, 0x2c, 0xf5, 0xe9, 0x9a, 0x69, }, + { 0x9c, 0xd3, 0x8d, 0x96, 0xf0, 0xb3, 0xc1, 0x4b, }, + { 0xbd, 0x61, 0x79, 0xa7, 0x1d, 0xc9, 0x6d, 0xbb, }, + { 0x98, 0xee, 0xa2, 0x1a, 0xf2, 0x5c, 0xd6, 0xbe, }, + { 0xc7, 0x67, 0x3b, 0x2e, 0xb0, 0xcb, 0xf2, 0xd0, }, + { 0x88, 0x3e, 0xa3, 0xe3, 0x95, 0x67, 0x53, 0x93, }, + { 0xc8, 0xce, 0x5c, 0xcd, 0x8c, 0x03, 0x0c, 0xa8, }, + { 0x94, 0xaf, 0x49, 0xf6, 0xc6, 0x50, 0xad, 0xb8, }, + { 0xea, 0xb8, 0x85, 0x8a, 0xde, 0x92, 0xe1, 0xbc, }, + { 0xf3, 0x15, 0xbb, 0x5b, 0xb8, 0x35, 0xd8, 0x17, }, + { 0xad, 0xcf, 0x6b, 0x07, 0x63, 0x61, 0x2e, 0x2f, }, + { 0xa5, 0xc9, 0x1d, 0xa7, 0xac, 0xaa, 0x4d, 0xde, }, + { 0x71, 0x65, 0x95, 0x87, 0x66, 0x50, 0xa2, 0xa6, }, + { 0x28, 0xef, 0x49, 0x5c, 0x53, 0xa3, 0x87, 0xad, }, + { 0x42, 0xc3, 0x41, 0xd8, 0xfa, 0x92, 0xd8, 0x32, }, + { 0xce, 0x7c, 0xf2, 0x72, 0x2f, 0x51, 0x27, 0x71, }, + { 0xe3, 0x78, 0x59, 0xf9, 0x46, 0x23, 0xf3, 0xa7, }, + { 0x38, 0x12, 0x05, 0xbb, 0x1a, 0xb0, 0xe0, 0x12, }, + { 0xae, 0x97, 0xa1, 0x0f, 0xd4, 0x34, 0xe0, 0x15, }, + { 0xb4, 0xa3, 0x15, 0x08, 0xbe, 0xff, 0x4d, 0x31, }, + { 0x81, 0x39, 0x62, 0x29, 0xf0, 0x90, 0x79, 0x02, }, + { 0x4d, 0x0c, 0xf4, 0x9e, 0xe5, 0xd4, 0xdc, 0xca, }, + { 0x5c, 0x73, 0x33, 0x6a, 0x76, 0xd8, 0xbf, 0x9a, }, + { 0xd0, 0xa7, 0x04, 0x53, 0x6b, 0xa9, 0x3e, 0x0e, }, + { 0x92, 0x59, 0x58, 0xfc, 0xd6, 0x42, 0x0c, 0xad, }, + { 0xa9, 0x15, 0xc2, 0x9b, 0xc8, 0x06, 0x73, 0x18, }, + { 0x95, 0x2b, 0x79, 0xf3, 0xbc, 0x0a, 0xa6, 0xd4, }, + { 0xf2, 0x1d, 0xf2, 0xe4, 0x1d, 0x45, 0x35, 0xf9, }, + { 0x87, 0x57, 0x75, 0x19, 0x04, 0x8f, 0x53, 0xa9, }, + { 0x10, 0xa5, 0x6c, 0xf5, 0xdf, 0xcd, 0x9a, 0xdb, }, + { 0xeb, 0x75, 0x09, 0x5c, 0xcd, 0x98, 0x6c, 0xd0, }, + { 0x51, 0xa9, 0xcb, 0x9e, 0xcb, 0xa3, 0x12, 0xe6, }, + { 0x96, 0xaf, 0xad, 0xfc, 0x2c, 0xe6, 0x66, 0xc7, }, + { 0x72, 0xfe, 0x52, 0x97, 0x5a, 0x43, 0x64, 0xee, }, + { 0x5a, 0x16, 0x45, 0xb2, 0x76, 0xd5, 0x92, 0xa1, }, + { 0xb2, 0x74, 0xcb, 0x8e, 0xbf, 0x87, 0x87, 0x0a, }, + { 0x6f, 0x9b, 0xb4, 0x20, 0x3d, 0xe7, 0xb3, 0x81, }, + { 0xea, 0xec, 0xb2, 0xa3, 0x0b, 0x22, 0xa8, 0x7f, }, + { 0x99, 0x24, 0xa4, 0x3c, 0xc1, 0x31, 0x57, 0x24, }, + { 0xbd, 0x83, 0x8d, 0x3a, 0xaf, 0xbf, 0x8d, 0xb7, }, + { 0x0b, 0x1a, 0x2a, 0x32, 0x65, 0xd5, 0x1a, 0xea, }, + { 0x13, 0x50, 0x79, 0xa3, 0x23, 0x1c, 0xe6, 0x60, }, + { 0x93, 0x2b, 0x28, 0x46, 0xe4, 0xd7, 0x06, 0x66, }, + { 0xe1, 0x91, 0x5f, 0x5c, 0xb1, 0xec, 0xa4, 0x6c, }, + { 0xf3, 0x25, 0x96, 0x5c, 0xa1, 0x6d, 0x62, 0x9f, }, + { 0x57, 0x5f, 0xf2, 0x8e, 0x60, 0x38, 0x1b, 0xe5, }, + { 0x72, 0x45, 0x06, 0xeb, 0x4c, 0x32, 0x8a, 0x95, } + }; + + const struct sipkey K = { U64_LITERAL(0x0706050403020100), + U64_LITERAL(0x0f0e0d0c0b0a0908) }; + uint8_t input[64]; + int i, j; + + (void)arg; + + for (i = 0; i < 64; ++i) + input[i] = i; + + for (i = 0; i < 64; ++i) { + uint64_t r = siphash24(input, i, &K); + for (j = 0; j < 8; ++j) { + tt_int_op( (r >> (j*8)) & 0xff, OP_EQ, VECTORS[i][j]); + } + } + + done: + ; +} + +/* We want the likelihood that the random buffer exhibits any regular pattern + * to be far less than the memory bit error rate in the int return value. + * Using 2048 bits provides a failure rate of 1/(3 * 10^616), and we call + * 3 functions, leading to an overall error rate of 1/10^616. + * This is comparable with the 1/10^603 failure rate of test_crypto_rng_range. + */ +#define FAILURE_MODE_BUFFER_SIZE (2048/8) + +/** Check crypto_rand for a failure mode where it does nothing to the buffer, + * or it sets the buffer to all zeroes. Return 0 when the check passes, + * or -1 when it fails. */ +static int +crypto_rand_check_failure_mode_zero(void) +{ + char buf[FAILURE_MODE_BUFFER_SIZE]; + + memset(buf, 0, FAILURE_MODE_BUFFER_SIZE); + crypto_rand(buf, FAILURE_MODE_BUFFER_SIZE); + + for (size_t i = 0; i < FAILURE_MODE_BUFFER_SIZE; i++) { + if (buf[i] != 0) { + return 0; + } + } + + return -1; +} + +/** Check crypto_rand for a failure mode where every int64_t in the buffer is + * the same. Return 0 when the check passes, or -1 when it fails. */ +static int +crypto_rand_check_failure_mode_identical(void) +{ + /* just in case the buffer size isn't a multiple of sizeof(int64_t) */ +#define FAILURE_MODE_BUFFER_SIZE_I64 \ + (FAILURE_MODE_BUFFER_SIZE/SIZEOF_INT64_T) +#define FAILURE_MODE_BUFFER_SIZE_I64_BYTES \ + (FAILURE_MODE_BUFFER_SIZE_I64*SIZEOF_INT64_T) + +#if FAILURE_MODE_BUFFER_SIZE_I64 < 2 +#error FAILURE_MODE_BUFFER_SIZE needs to be at least 2*SIZEOF_INT64_T +#endif + + int64_t buf[FAILURE_MODE_BUFFER_SIZE_I64]; + + memset(buf, 0, FAILURE_MODE_BUFFER_SIZE_I64_BYTES); + crypto_rand((char *)buf, FAILURE_MODE_BUFFER_SIZE_I64_BYTES); + + for (size_t i = 1; i < FAILURE_MODE_BUFFER_SIZE_I64; i++) { + if (buf[i] != buf[i-1]) { + return 0; + } + } + + return -1; +} + +/** Check crypto_rand for a failure mode where it increments the "random" + * value by 1 for every byte in the buffer. (This is OpenSSL's PREDICT mode.) + * Return 0 when the check passes, or -1 when it fails. */ +static int +crypto_rand_check_failure_mode_predict(void) +{ + unsigned char buf[FAILURE_MODE_BUFFER_SIZE]; + + memset(buf, 0, FAILURE_MODE_BUFFER_SIZE); + crypto_rand((char *)buf, FAILURE_MODE_BUFFER_SIZE); + + for (size_t i = 1; i < FAILURE_MODE_BUFFER_SIZE; i++) { + /* check if the last byte was incremented by 1, including integer + * wrapping */ + if (buf[i] - buf[i-1] != 1 && buf[i-1] - buf[i] != 255) { + return 0; + } + } + + return -1; +} + +#undef FAILURE_MODE_BUFFER_SIZE + +/** Test that our ed25519 validation function rejects evil public keys and + * accepts good ones. */ +static void +test_crypto_ed25519_validation(void *arg) +{ + (void) arg; + + int retval; + ed25519_public_key_t pub1; + + /* See https://lists.torproject.org/pipermail/tor-dev/2017-April/012230.html + for a list of points with torsion components in ed25519. */ + + { /* Point with torsion component (order 8l) */ + const char badkey[] = + "300ef2e64e588e1df55b48e4da0416ffb64cc85d5b00af6463d5cc6c2b1c185e"; + retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey), + badkey, strlen(badkey)); + tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey)); + tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1); + } + + { /* Point with torsion component (order 4l) */ + const char badkey[] = + "f43e3a046db8749164c6e69b193f1e942c7452e7d888736f40b98093d814d5e7"; + retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey), + badkey, strlen(badkey)); + tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey)); + tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1); + } + + { /* Point with torsion component (order 2l) */ + const char badkey[] = + "c9fff3af0471c28e33e98c2043e44f779d0427b1e37c521a6bddc011ed1869af"; + retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey), + badkey, strlen(badkey)); + tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey)); + tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1); + } + + { /* This point is not even on the curve */ + const char badkey[] = + "e19c65de75c68cf3b7643ea732ba9eb1a3d20d6d57ba223c2ece1df66feb5af0"; + retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey), + badkey, strlen(badkey)); + tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey)); + tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1); + } + + { /* This one is a good key */ + const char goodkey[] = + "4ba2e44760dff4c559ef3c38768c1c14a8a54740c782c8d70803e9d6e3ad8794"; + retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey), + goodkey, strlen(goodkey)); + tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey)); + tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, 0); + } + + done: ; +} + +static void +test_crypto_failure_modes(void *arg) +{ + int rv = 0; + (void)arg; + + rv = crypto_early_init(); + tt_int_op(rv, OP_EQ, 0); + + /* Check random works */ + rv = crypto_rand_check_failure_mode_zero(); + tt_int_op(rv, OP_EQ, 0); + + rv = crypto_rand_check_failure_mode_identical(); + tt_int_op(rv, OP_EQ, 0); + + rv = crypto_rand_check_failure_mode_predict(); + tt_int_op(rv, OP_EQ, 0); + + done: + ; +} + +#define CRYPTO_LEGACY(name) \ + { #name, test_crypto_ ## name , 0, NULL, NULL } + +#define ED25519_TEST_ONE(name, fl, which) \ + { #name "/ed25519_" which, test_crypto_ed25519_ ## name, (fl), \ + &ed25519_test_setup, (void*)which } + +#define ED25519_TEST(name, fl) \ + ED25519_TEST_ONE(name, (fl), "donna"), \ + ED25519_TEST_ONE(name, (fl), "ref10") + +struct testcase_t crypto_tests[] = { + CRYPTO_LEGACY(formats), + CRYPTO_LEGACY(rng), + { "rng_range", test_crypto_rng_range, 0, NULL, NULL }, + { "rng_strongest", test_crypto_rng_strongest, TT_FORK, NULL, NULL }, + { "rng_strongest_nosyscall", test_crypto_rng_strongest, TT_FORK, + &passthrough_setup, (void*)"nosyscall" }, + { "rng_strongest_nofallback", test_crypto_rng_strongest, TT_FORK, + &passthrough_setup, (void*)"nofallback" }, + { "rng_strongest_broken", test_crypto_rng_strongest, TT_FORK, + &passthrough_setup, (void*)"broken" }, + { "openssl_version", test_crypto_openssl_version, TT_FORK, NULL, NULL }, + { "aes_AES", test_crypto_aes128, TT_FORK, &passthrough_setup, (void*)"aes" }, + { "aes_EVP", test_crypto_aes128, TT_FORK, &passthrough_setup, (void*)"evp" }, + { "aes128_ctr_testvec", test_crypto_aes_ctr_testvec, 0, + &passthrough_setup, (void*)"128" }, + { "aes192_ctr_testvec", test_crypto_aes_ctr_testvec, 0, + &passthrough_setup, (void*)"192" }, + { "aes256_ctr_testvec", test_crypto_aes_ctr_testvec, 0, + &passthrough_setup, (void*)"256" }, + CRYPTO_LEGACY(sha), + CRYPTO_LEGACY(pk), + { "pk_fingerprints", test_crypto_pk_fingerprints, TT_FORK, NULL, NULL }, + { "pk_base64", test_crypto_pk_base64, TT_FORK, NULL, NULL }, + CRYPTO_LEGACY(digests), + { "digest_names", test_crypto_digest_names, 0, NULL, NULL }, + { "sha3", test_crypto_sha3, TT_FORK, NULL, NULL}, + { "sha3_xof", test_crypto_sha3_xof, TT_FORK, NULL, NULL}, + { "mac_sha3", test_crypto_mac_sha3, TT_FORK, NULL, NULL}, + CRYPTO_LEGACY(dh), + { "aes_iv_AES", test_crypto_aes_iv, TT_FORK, &passthrough_setup, + (void*)"aes" }, + { "aes_iv_EVP", test_crypto_aes_iv, TT_FORK, &passthrough_setup, + (void*)"evp" }, + CRYPTO_LEGACY(base32_decode), + { "kdf_TAP", test_crypto_kdf_TAP, 0, NULL, NULL }, + { "hkdf_sha256", test_crypto_hkdf_sha256, 0, NULL, NULL }, + { "hkdf_sha256_testvecs", test_crypto_hkdf_sha256_testvecs, 0, NULL, NULL }, + { "curve25519_impl", test_crypto_curve25519_impl, 0, NULL, NULL }, + { "curve25519_impl_hibit", test_crypto_curve25519_impl, 0, NULL, (void*)"y"}, + { "curve25516_testvec", test_crypto_curve25519_testvec, 0, NULL, NULL }, + { "curve25519_basepoint", + test_crypto_curve25519_basepoint, TT_FORK, NULL, NULL }, + { "curve25519_wrappers", test_crypto_curve25519_wrappers, 0, NULL, NULL }, + { "curve25519_encode", test_crypto_curve25519_encode, 0, NULL, NULL }, + { "curve25519_persist", test_crypto_curve25519_persist, 0, NULL, NULL }, + ED25519_TEST(simple, 0), + ED25519_TEST(test_vectors, 0), + ED25519_TEST(encode, 0), + ED25519_TEST(convert, 0), + ED25519_TEST(blinding, 0), + ED25519_TEST(blinding_fail, 0), + ED25519_TEST(testvectors, 0), + ED25519_TEST(validation, 0), + { "ed25519_storage", test_crypto_ed25519_storage, 0, NULL, NULL }, + { "siphash", test_crypto_siphash, 0, NULL, NULL }, + { "failure_modes", test_crypto_failure_modes, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_crypto_openssl.c b/src/wraith/src/test/test_crypto_openssl.c new file mode 100644 index 000000000..090cb4242 --- /dev/null +++ b/src/wraith/src/test/test_crypto_openssl.c @@ -0,0 +1,107 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define CRYPTO_PRIVATE + +#include "crypto.h" +#include "util.h" +#include "util_format.h" +#include "compat.h" +#include "test.h" + +#include +#include +#include "compat_openssl.h" + +/* Test for rectifying openssl RAND engine. */ +static void +test_crypto_rng_engine(void *arg) +{ + (void)arg; + RAND_METHOD dummy_method; + memset(&dummy_method, 0, sizeof(dummy_method)); + + /* We should be a no-op if we're already on RAND_OpenSSL */ + tt_int_op(0, OP_EQ, crypto_force_rand_ssleay()); + tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); + + /* We should correct the method if it's a dummy. */ + RAND_set_rand_method(&dummy_method); +#ifdef LIBRESSL_VERSION_NUMBER + /* On libressl, you can't override the RNG. */ + tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); + tt_int_op(0, OP_EQ, crypto_force_rand_ssleay()); +#else + tt_assert(RAND_get_rand_method() == &dummy_method); + tt_int_op(1, OP_EQ, crypto_force_rand_ssleay()); +#endif /* defined(LIBRESSL_VERSION_NUMBER) */ + tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); + + /* Make sure we aren't calling dummy_method */ + crypto_rand((void *) &dummy_method, sizeof(dummy_method)); + crypto_rand((void *) &dummy_method, sizeof(dummy_method)); + + done: + ; +} + +#ifndef OPENSSL_1_1_API +#define EVP_ENCODE_CTX_new() tor_malloc_zero(sizeof(EVP_ENCODE_CTX)) +#define EVP_ENCODE_CTX_free(ctx) tor_free(ctx) +#endif + +/** Encode src into dest with OpenSSL's EVP Encode interface, returning the + * length of the encoded data in bytes. + */ +static int +base64_encode_evp(char *dest, char *src, size_t srclen) +{ + const unsigned char *s = (unsigned char*)src; + EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new(); + int len, ret; + + EVP_EncodeInit(ctx); + EVP_EncodeUpdate(ctx, (unsigned char *)dest, &len, s, (int)srclen); + EVP_EncodeFinal(ctx, (unsigned char *)(dest + len), &ret); + EVP_ENCODE_CTX_free(ctx); + return ret+ len; +} + +static void +test_crypto_base64_encode_matches(void *arg) +{ + (void)arg; + int i, j; + char data1[1024]; + char data2[1024]; + char data3[1024]; + + for (i = 0; i < 256; i++) { + /* Test the multiline format Base64 encoder with 0 .. 256 bytes of + * output against OpenSSL. + */ + const size_t enclen = base64_encode_size(i, BASE64_ENCODE_MULTILINE); + data1[i] = i; + j = base64_encode(data2, 1024, data1, i, BASE64_ENCODE_MULTILINE); + tt_int_op(j, OP_EQ, enclen); + j = base64_encode_evp(data3, data1, i); + tt_int_op(j, OP_EQ, enclen); + tt_mem_op(data2, OP_EQ, data3, enclen); + tt_int_op(j, OP_EQ, strlen(data2)); + } + + done: + ; +} + +struct testcase_t crypto_openssl_tests[] = { + { "rng_engine", test_crypto_rng_engine, TT_FORK, NULL, NULL }, + { "base64_encode_match", test_crypto_base64_encode_matches, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_crypto_slow.c b/src/wraith/src/test/test_crypto_slow.c new file mode 100644 index 000000000..2afb71ff5 --- /dev/null +++ b/src/wraith/src/test/test_crypto_slow.c @@ -0,0 +1,617 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define CRYPTO_S2K_PRIVATE +#include "or.h" +#include "test.h" +#include "crypto_s2k.h" +#include "crypto_pwbox.h" + +#if defined(HAVE_LIBSCRYPT_H) && defined(HAVE_LIBSCRYPT_SCRYPT) +#define HAVE_LIBSCRYPT +#include +#endif + +#include + +/** Run unit tests for our secret-to-key passphrase hashing functionality. */ +static void +test_crypto_s2k_rfc2440(void *arg) +{ + char buf[29]; + char buf2[29]; + char *buf3 = NULL; + int i; + + (void)arg; + memset(buf, 0, sizeof(buf)); + memset(buf2, 0, sizeof(buf2)); + buf3 = tor_malloc(65536); + memset(buf3, 0, 65536); + + secret_to_key_rfc2440(buf+9, 20, "", 0, buf); + crypto_digest(buf2+9, buf3, 1024); + tt_mem_op(buf,OP_EQ, buf2, 29); + + memcpy(buf,"vrbacrda",8); + memcpy(buf2,"vrbacrda",8); + buf[8] = 96; + buf2[8] = 96; + secret_to_key_rfc2440(buf+9, 20, "12345678", 8, buf); + for (i = 0; i < 65536; i += 16) { + memcpy(buf3+i, "vrbacrda12345678", 16); + } + crypto_digest(buf2+9, buf3, 65536); + tt_mem_op(buf,OP_EQ, buf2, 29); + + done: + tor_free(buf3); +} + +static void +run_s2k_tests(const unsigned flags, const unsigned type, + int speclen, const int keylen, int legacy) +{ + uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN], buf3[S2K_MAXLEN]; + int r; + size_t sz; + const char pw1[] = "You can't come in here unless you say swordfish!"; + const char pw2[] = "Now, I give you one more guess."; + + r = secret_to_key_new(buf, sizeof(buf), &sz, + pw1, strlen(pw1), flags); + tt_int_op(r, OP_EQ, S2K_OKAY); + tt_int_op(buf[0], OP_EQ, type); + + tt_int_op(sz, OP_EQ, keylen + speclen); + + if (legacy) { + memmove(buf, buf+1, sz-1); + --sz; + --speclen; + } + + tt_int_op(S2K_OKAY, OP_EQ, + secret_to_key_check(buf, sz, pw1, strlen(pw1))); + + tt_int_op(S2K_BAD_SECRET, OP_EQ, + secret_to_key_check(buf, sz, pw2, strlen(pw2))); + + /* Move key to buf2, and clear it. */ + memset(buf3, 0, sizeof(buf3)); + memcpy(buf2, buf+speclen, keylen); + memset(buf+speclen, 0, sz - speclen); + + /* Derivekey should produce the same results. */ + tt_int_op(S2K_OKAY, OP_EQ, + secret_to_key_derivekey(buf3, keylen, buf, speclen, pw1, strlen(pw1))); + + tt_mem_op(buf2, OP_EQ, buf3, keylen); + + /* Derivekey with a longer output should fill the output. */ + memset(buf2, 0, sizeof(buf2)); + tt_int_op(S2K_OKAY, OP_EQ, + secret_to_key_derivekey(buf2, sizeof(buf2), buf, speclen, + pw1, strlen(pw1))); + + tt_mem_op(buf2, OP_NE, buf3, sizeof(buf2)); + + memset(buf3, 0, sizeof(buf3)); + tt_int_op(S2K_OKAY, OP_EQ, + secret_to_key_derivekey(buf3, sizeof(buf3), buf, speclen, + pw1, strlen(pw1))); + tt_mem_op(buf2, OP_EQ, buf3, sizeof(buf3)); + tt_assert(!tor_mem_is_zero((char*)buf2+keylen, sizeof(buf2)-keylen)); + + done: + ; +} + +static void +test_crypto_s2k_general(void *arg) +{ + const char *which = arg; + + if (!strcmp(which, "scrypt")) { + run_s2k_tests(0, 2, 19, 32, 0); + } else if (!strcmp(which, "scrypt-low")) { + run_s2k_tests(S2K_FLAG_LOW_MEM, 2, 19, 32, 0); + } else if (!strcmp(which, "pbkdf2")) { + run_s2k_tests(S2K_FLAG_USE_PBKDF2, 1, 18, 20, 0); + } else if (!strcmp(which, "rfc2440")) { + run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 0); + } else if (!strcmp(which, "rfc2440-legacy")) { + run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 1); + } else { + tt_fail(); + } +} + +#if defined(HAVE_LIBSCRYPT) && defined(HAVE_EVP_PBE_SCRYPT) +static void +test_libscrypt_eq_openssl(void *arg) +{ + uint8_t buf1[64]; + uint8_t buf2[64]; + + uint64_t N; + uint32_t r, p; + uint64_t maxmem = 0; // --> SCRYPT_MAX_MEM in OpenSSL. + + int libscrypt_retval, openssl_retval; + + size_t dk_len = 64; + + (void)arg; + + memset(buf1,0,64); + memset(buf2,0,64); + + /* NOTE: we're using N,r the way OpenSSL and libscrypt define them, + * not the way draft-josefsson-scrypt-kdf-00.txt define them. + */ + N = 16; + r = 1; + p = 1; + + libscrypt_retval = + libscrypt_scrypt((const uint8_t *)"", 0, (const uint8_t *)"", 0, + N, r, p, buf1, dk_len); + openssl_retval = + EVP_PBE_scrypt((const char *)"", 0, (const unsigned char *)"", 0, + N, r, p, maxmem, buf2, dk_len); + + tt_int_op(libscrypt_retval, OP_EQ, 0); + tt_int_op(openssl_retval, OP_EQ, 1); + + tt_mem_op(buf1, OP_EQ, buf2, 64); + + memset(buf1,0,64); + memset(buf2,0,64); + + N = 1024; + r = 8; + p = 16; + + libscrypt_retval = + libscrypt_scrypt((const uint8_t *)"password", strlen("password"), + (const uint8_t *)"NaCl", strlen("NaCl"), + N, r, p, buf1, dk_len); + openssl_retval = + EVP_PBE_scrypt((const char *)"password", strlen("password"), + (const unsigned char *)"NaCl", strlen("NaCl"), + N, r, p, maxmem, buf2, dk_len); + + tt_int_op(libscrypt_retval, OP_EQ, 0); + tt_int_op(openssl_retval, OP_EQ, 1); + + tt_mem_op(buf1, OP_EQ, buf2, 64); + + memset(buf1,0,64); + memset(buf2,0,64); + + N = 16384; + r = 8; + p = 1; + + libscrypt_retval = + libscrypt_scrypt((const uint8_t *)"pleaseletmein", + strlen("pleaseletmein"), + (const uint8_t *)"SodiumChloride", + strlen("SodiumChloride"), + N, r, p, buf1, dk_len); + openssl_retval = + EVP_PBE_scrypt((const char *)"pleaseletmein", + strlen("pleaseletmein"), + (const unsigned char *)"SodiumChloride", + strlen("SodiumChloride"), + N, r, p, maxmem, buf2, dk_len); + + tt_int_op(libscrypt_retval, OP_EQ, 0); + tt_int_op(openssl_retval, OP_EQ, 1); + + tt_mem_op(buf1, OP_EQ, buf2, 64); + + memset(buf1,0,64); + memset(buf2,0,64); + + N = 1048576; + maxmem = 2 * 1024 * 1024 * (uint64_t)1024; // 2 GB + + libscrypt_retval = + libscrypt_scrypt((const uint8_t *)"pleaseletmein", + strlen("pleaseletmein"), + (const uint8_t *)"SodiumChloride", + strlen("SodiumChloride"), + N, r, p, buf1, dk_len); + openssl_retval = + EVP_PBE_scrypt((const char *)"pleaseletmein", + strlen("pleaseletmein"), + (const unsigned char *)"SodiumChloride", + strlen("SodiumChloride"), + N, r, p, maxmem, buf2, dk_len); + + tt_int_op(libscrypt_retval, OP_EQ, 0); + tt_int_op(openssl_retval, OP_EQ, 1); + + tt_mem_op(buf1, OP_EQ, buf2, 64); + + done: + return; +} +#endif /* defined(HAVE_LIBSCRYPT) && defined(HAVE_EVP_PBE_SCRYPT) */ + +static void +test_crypto_s2k_errors(void *arg) +{ + uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN]; + size_t sz; + + (void)arg; + + /* Bogus specifiers: simple */ + tt_int_op(S2K_BAD_LEN, OP_EQ, + secret_to_key_derivekey(buf, sizeof(buf), + (const uint8_t*)"", 0, "ABC", 3)); + tt_int_op(S2K_BAD_ALGORITHM, OP_EQ, + secret_to_key_derivekey(buf, sizeof(buf), + (const uint8_t*)"\x10", 1, "ABC", 3)); + tt_int_op(S2K_BAD_LEN, OP_EQ, + secret_to_key_derivekey(buf, sizeof(buf), + (const uint8_t*)"\x01\x02", 2, "ABC", 3)); + + tt_int_op(S2K_BAD_LEN, OP_EQ, + secret_to_key_check((const uint8_t*)"", 0, "ABC", 3)); + tt_int_op(S2K_BAD_ALGORITHM, OP_EQ, + secret_to_key_check((const uint8_t*)"\x10", 1, "ABC", 3)); + tt_int_op(S2K_BAD_LEN, OP_EQ, + secret_to_key_check((const uint8_t*)"\x01\x02", 2, "ABC", 3)); + + /* too long gets "BAD_LEN" too */ + memset(buf, 0, sizeof(buf)); + buf[0] = 2; + tt_int_op(S2K_BAD_LEN, OP_EQ, + secret_to_key_derivekey(buf2, sizeof(buf2), + buf, sizeof(buf), "ABC", 3)); + + /* Truncated output */ +#ifdef HAVE_LIBSCRYPT + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 50, &sz, + "ABC", 3, 0)); + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 50, &sz, + "ABC", 3, S2K_FLAG_LOW_MEM)); +#endif /* defined(HAVE_LIBSCRYPT) */ + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 37, &sz, + "ABC", 3, S2K_FLAG_USE_PBKDF2)); + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 29, &sz, + "ABC", 3, S2K_FLAG_NO_SCRYPT)); + +#ifdef HAVE_LIBSCRYPT + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 18, 0)); + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 18, + S2K_FLAG_LOW_MEM)); +#endif + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 17, + S2K_FLAG_USE_PBKDF2)); + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 9, + S2K_FLAG_NO_SCRYPT)); + + /* Now try using type-specific bogus specifiers. */ + + /* It's a bad pbkdf2 buffer if it has an iteration count that would overflow + * int32_t. */ + memset(buf, 0, sizeof(buf)); + buf[0] = 1; /* pbkdf2 */ + buf[17] = 100; /* 1<<100 is much bigger than INT32_MAX */ + tt_int_op(S2K_BAD_PARAMS, OP_EQ, + secret_to_key_derivekey(buf2, sizeof(buf2), + buf, 18, "ABC", 3)); + +#ifdef HAVE_LIBSCRYPT + /* It's a bad scrypt buffer if N would overflow uint64 */ + memset(buf, 0, sizeof(buf)); + buf[0] = 2; /* scrypt */ + buf[17] = 100; /* 1<<100 is much bigger than UINT64_MAX */ + tt_int_op(S2K_BAD_PARAMS, OP_EQ, + secret_to_key_derivekey(buf2, sizeof(buf2), + buf, 19, "ABC", 3)); +#endif /* defined(HAVE_LIBSCRYPT) */ + + done: + ; +} + +static void +test_crypto_scrypt_vectors(void *arg) +{ + char *mem_op_hex_tmp = NULL; + uint8_t spec[64], out[64]; + + (void)arg; +#ifndef HAVE_LIBSCRYPT + if (1) + tt_skip(); +#endif + + /* Test vectors from + http://tools.ietf.org/html/draft-josefsson-scrypt-kdf-00 section 11. + + Note that the names of 'r' and 'N' are switched in that section. Or + possibly in libscrypt. + */ + + base16_decode((char*)spec, sizeof(spec), + "0400", 4); + memset(out, 0x00, sizeof(out)); + tt_int_op(64, OP_EQ, + secret_to_key_compute_key(out, 64, spec, 2, "", 0, 2)); + test_memeq_hex(out, + "77d6576238657b203b19ca42c18a0497" + "f16b4844e3074ae8dfdffa3fede21442" + "fcd0069ded0948f8326a753a0fc81f17" + "e8d3e0fb2e0d3628cf35e20c38d18906"); + + base16_decode((char*)spec, sizeof(spec), + "4e61436c" "0A34", 12); + memset(out, 0x00, sizeof(out)); + tt_int_op(64, OP_EQ, + secret_to_key_compute_key(out, 64, spec, 6, "password", 8, 2)); + test_memeq_hex(out, + "fdbabe1c9d3472007856e7190d01e9fe" + "7c6ad7cbc8237830e77376634b373162" + "2eaf30d92e22a3886ff109279d9830da" + "c727afb94a83ee6d8360cbdfa2cc0640"); + + base16_decode((char*)spec, sizeof(spec), + "536f6469756d43686c6f72696465" "0e30", 32); + memset(out, 0x00, sizeof(out)); + tt_int_op(64, OP_EQ, + secret_to_key_compute_key(out, 64, spec, 16, + "pleaseletmein", 13, 2)); + test_memeq_hex(out, + "7023bdcb3afd7348461c06cd81fd38eb" + "fda8fbba904f8e3ea9b543f6545da1f2" + "d5432955613f0fcf62d49705242a9af9" + "e61e85dc0d651e40dfcf017b45575887"); + + base16_decode((char*)spec, sizeof(spec), + "536f6469756d43686c6f72696465" "1430", 32); + memset(out, 0x00, sizeof(out)); + tt_int_op(64, OP_EQ, + secret_to_key_compute_key(out, 64, spec, 16, + "pleaseletmein", 13, 2)); + test_memeq_hex(out, + "2101cb9b6a511aaeaddbbe09cf70f881" + "ec568d574a2ffd4dabe5ee9820adaa47" + "8e56fd8f4ba5d09ffa1c6d927c40f4c3" + "37304049e8a952fbcbf45c6fa77a41a4"); + + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_pbkdf2_vectors(void *arg) +{ + char *mem_op_hex_tmp = NULL; + uint8_t spec[64], out[64]; + (void)arg; + + /* Test vectors from RFC6070, section 2 */ + base16_decode((char*)spec, sizeof(spec), + "73616c74" "00" , 10); + memset(out, 0x00, sizeof(out)); + tt_int_op(20, OP_EQ, + secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); + test_memeq_hex(out, "0c60c80f961f0e71f3a9b524af6012062fe037a6"); + + base16_decode((char*)spec, sizeof(spec), + "73616c74" "01" , 10); + memset(out, 0x00, sizeof(out)); + tt_int_op(20, OP_EQ, + secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); + test_memeq_hex(out, "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957"); + + base16_decode((char*)spec, sizeof(spec), + "73616c74" "0C" , 10); + memset(out, 0x00, sizeof(out)); + tt_int_op(20, OP_EQ, + secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); + test_memeq_hex(out, "4b007901b765489abead49d926f721d065a429c1"); + + /* This is the very slow one here. When enabled, it accounts for roughly + * half the time spent in test-slow. */ + /* + base16_decode((char*)spec, sizeof(spec), + "73616c74" "18" , 10); + memset(out, 0x00, sizeof(out)); + tt_int_op(20, OP_EQ, + secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); + test_memeq_hex(out, "eefe3d61cd4da4e4e9945b3d6ba2158c2634e984"); + */ + + base16_decode((char*)spec, sizeof(spec), + "73616c7453414c5473616c7453414c5473616c745" + "3414c5473616c7453414c5473616c74" "0C" , 74); + memset(out, 0x00, sizeof(out)); + tt_int_op(25, OP_EQ, + secret_to_key_compute_key(out, 25, spec, 37, + "passwordPASSWORDpassword", 24, 1)); + test_memeq_hex(out, "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038"); + + base16_decode((char*)spec, sizeof(spec), + "7361006c74" "0c" , 12); + memset(out, 0x00, sizeof(out)); + tt_int_op(16, OP_EQ, + secret_to_key_compute_key(out, 16, spec, 6, "pass\0word", 9, 1)); + test_memeq_hex(out, "56fa6aa75548099dcc37d7f03425e0c3"); + + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_pwbox(void *arg) +{ + uint8_t *boxed=NULL, *decoded=NULL; + size_t len, dlen; + unsigned i; + const char msg[] = "This bunny reminds you that you still have a " + "salamander in your sylladex. She is holding the bunny Dave got you. " + "It’s sort of uncanny how similar they are, aside from the knitted " + "enhancements. Seriously, what are the odds?? So weird."; + const char pw[] = "I'm a night owl and a wise bird too"; + + const unsigned flags[] = { 0, + S2K_FLAG_NO_SCRYPT, + S2K_FLAG_LOW_MEM, + S2K_FLAG_NO_SCRYPT|S2K_FLAG_LOW_MEM, + S2K_FLAG_USE_PBKDF2 }; + (void)arg; + + for (i = 0; i < ARRAY_LENGTH(flags); ++i) { + tt_int_op(0, OP_EQ, crypto_pwbox(&boxed, &len, + (const uint8_t*)msg, strlen(msg), + pw, strlen(pw), flags[i])); + tt_assert(boxed); + tt_assert(len > 128+32); + + tt_int_op(0, OP_EQ, crypto_unpwbox(&decoded, &dlen, boxed, len, + pw, strlen(pw))); + + tt_assert(decoded); + tt_uint_op(dlen, OP_EQ, strlen(msg)); + tt_mem_op(decoded, OP_EQ, msg, dlen); + + tor_free(decoded); + + tt_int_op(UNPWBOX_BAD_SECRET, OP_EQ, crypto_unpwbox(&decoded, &dlen, + boxed, len, + pw, strlen(pw)-1)); + boxed[len-1] ^= 1; + tt_int_op(UNPWBOX_BAD_SECRET, OP_EQ, crypto_unpwbox(&decoded, &dlen, + boxed, len, + pw, strlen(pw))); + boxed[0] = 255; + tt_int_op(UNPWBOX_CORRUPTED, OP_EQ, crypto_unpwbox(&decoded, &dlen, + boxed, len, + pw, strlen(pw))); + + tor_free(boxed); + } + + done: + tor_free(boxed); + tor_free(decoded); +} + +static void +test_crypto_ed25519_fuzz_donna(void *arg) +{ + const unsigned iters = 1024; + uint8_t msg[1024]; + unsigned i; + (void)arg; + + tt_uint_op(iters, OP_EQ, sizeof(msg)); + crypto_rand((char*) msg, sizeof(msg)); + + /* Fuzz Ed25519-donna vs ref10, alternating the implementation used to + * generate keys/sign per iteration. + */ + for (i = 0; i < iters; ++i) { + const int use_donna = i & 1; + uint8_t blinding[32]; + curve25519_keypair_t ckp; + ed25519_keypair_t kp, kp_blind, kp_curve25519; + ed25519_public_key_t pk, pk_blind, pk_curve25519; + ed25519_signature_t sig, sig_blind; + int bit = 0; + + crypto_rand((char*) blinding, sizeof(blinding)); + + /* Impl. A: + * 1. Generate a keypair. + * 2. Blinded the keypair. + * 3. Sign a message (unblinded). + * 4. Sign a message (blinded). + * 5. Generate a curve25519 keypair, and convert it to Ed25519. + */ + ed25519_set_impl_params(use_donna); + tt_int_op(0, OP_EQ, ed25519_keypair_generate(&kp, i&1)); + tt_int_op(0, OP_EQ, ed25519_keypair_blind(&kp_blind, &kp, blinding)); + tt_int_op(0, OP_EQ, ed25519_sign(&sig, msg, i, &kp)); + tt_int_op(0, OP_EQ, ed25519_sign(&sig_blind, msg, i, &kp_blind)); + + tt_int_op(0, OP_EQ, curve25519_keypair_generate(&ckp, i&1)); + tt_int_op(0, OP_EQ, ed25519_keypair_from_curve25519_keypair( + &kp_curve25519, &bit, &ckp)); + + /* Impl. B: + * 1. Validate the public key by rederiving it. + * 2. Validate the blinded public key by rederiving it. + * 3. Validate the unblinded signature (and test a invalid signature). + * 4. Validate the blinded signature. + * 5. Validate the public key (from Curve25519) by rederiving it. + */ + ed25519_set_impl_params(!use_donna); + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pk, &kp.seckey)); + tt_mem_op(pk.pubkey, OP_EQ, kp.pubkey.pubkey, 32); + + tt_int_op(0, OP_EQ, ed25519_public_blind(&pk_blind, &kp.pubkey, blinding)); + tt_mem_op(pk_blind.pubkey, OP_EQ, kp_blind.pubkey.pubkey, 32); + + tt_int_op(0, OP_EQ, ed25519_checksig(&sig, msg, i, &pk)); + sig.sig[0] ^= 15; + tt_int_op(-1, OP_EQ, ed25519_checksig(&sig, msg, sizeof(msg), &pk)); + + tt_int_op(0, OP_EQ, ed25519_checksig(&sig_blind, msg, i, &pk_blind)); + + tt_int_op(0, OP_EQ, ed25519_public_key_from_curve25519_public_key( + &pk_curve25519, &ckp.pubkey, bit)); + tt_mem_op(pk_curve25519.pubkey, OP_EQ, kp_curve25519.pubkey.pubkey, 32); + } + + done: + ; +} + +#define CRYPTO_LEGACY(name) \ + { #name, test_crypto_ ## name , 0, NULL, NULL } + +#define ED25519_TEST_ONE(name, fl, which) \ + { #name "/ed25519_" which, test_crypto_ed25519_ ## name, (fl), \ + &ed25519_test_setup, (void*)which } + +#define ED25519_TEST(name, fl) \ + ED25519_TEST_ONE(name, (fl), "donna"), \ + ED25519_TEST_ONE(name, (fl), "ref10") + +struct testcase_t slow_crypto_tests[] = { + CRYPTO_LEGACY(s2k_rfc2440), +#ifdef HAVE_LIBSCRYPT + { "s2k_scrypt", test_crypto_s2k_general, 0, &passthrough_setup, + (void*)"scrypt" }, + { "s2k_scrypt_low", test_crypto_s2k_general, 0, &passthrough_setup, + (void*)"scrypt-low" }, +#ifdef HAVE_EVP_PBE_SCRYPT + { "libscrypt_eq_openssl", test_libscrypt_eq_openssl, 0, NULL, NULL }, +#endif +#endif /* defined(HAVE_LIBSCRYPT) */ + { "s2k_pbkdf2", test_crypto_s2k_general, 0, &passthrough_setup, + (void*)"pbkdf2" }, + { "s2k_rfc2440_general", test_crypto_s2k_general, 0, &passthrough_setup, + (void*)"rfc2440" }, + { "s2k_rfc2440_legacy", test_crypto_s2k_general, 0, &passthrough_setup, + (void*)"rfc2440-legacy" }, + { "s2k_errors", test_crypto_s2k_errors, 0, NULL, NULL }, + { "scrypt_vectors", test_crypto_scrypt_vectors, 0, NULL, NULL }, + { "pbkdf2_vectors", test_crypto_pbkdf2_vectors, 0, NULL, NULL }, + { "pwbox", test_crypto_pwbox, 0, NULL, NULL }, + ED25519_TEST(fuzz_donna, TT_FORK), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_data.c b/src/wraith/src/test/test_data.c new file mode 100644 index 000000000..ce6c3394f --- /dev/null +++ b/src/wraith/src/test/test_data.c @@ -0,0 +1,202 @@ +/* Copyright 2001-2004 Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "test.h" + +/* Our unit test expect that the AUTHORITY_CERT_* public keys will sort + * in this order. */ +#define AUTHORITY_CERT_A AUTHORITY_CERT_3 +#define AUTHORITY_CERT_B AUTHORITY_CERT_1 +#define AUTHORITY_CERT_C AUTHORITY_CERT_2 + +#define AUTHORITY_SIGNKEY_A AUTHORITY_SIGNKEY_3 +#define AUTHORITY_SIGNKEY_B AUTHORITY_SIGNKEY_1 +#define AUTHORITY_SIGNKEY_C AUTHORITY_SIGNKEY_2 + +/** First of 3 example authority certificates for unit testing. */ +const char AUTHORITY_CERT_A[] = +"dir-key-certificate-version 3\n" +"fingerprint D867ACF56A9D229B35C25F0090BC9867E906BE69\n" +"dir-key-published 2008-12-12 18:07:24\n" +"dir-key-expires 2009-12-12 18:07:24\n" +"dir-identity-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIIBigKCAYEAveMpKlw8oD1YqFqpJchuwSR82BDhutbqgHiez3QO9FmzOctJpV+Y\n" +"mpTYIJLS/qC+4GBKFF1VK0C4SoBrS3zri0qdXdE+vBGcyrxrjMklpxoqSKRY2011\n" +"4eqYPghKlo5RzuqteBclGCHyNxWjUJeRKDWgvh+U/gr2uYM6fRm5q0fCzg4aECE7\n" +"VP6fDGZrMbQI8jHpiMSoC9gkUASNEa6chLInlnP8/H5qUEW4TB9CN/q095pefuwL\n" +"P+F+1Nz5hnM7fa5XmeMB8iM4RriUmOQlLBZgpQBMpEfWMIPcR9F1Gh3MxERqqUcH\n" +"tmij+IZdeXg9OkCXykcabaYIhZD3meErn9Tax4oA/THduLfgli9zM0ExwzH1OooN\n" +"L8rIcJ+2eBo3bQiQUbdYW71sl9w7nSPtircbJUa1mUvWYLPWQxFliPiQSetgJLMj\n" +"VQqtPmV2hvN2Xk3lLfJO50qMTK7w7Gsaw8UtV4YDM1Hcjp/hQaIB1xfwhXgl+eUU\n" +"btUa4c+cUTjHAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBALPSUInyuEu6NV3NjozplaniIEBzQXEjv1x9/+mqnwZABpYVmuy9A8nx\n" +"eoyY3sZFsnYwNW/IZjAgG23pEmevu3F+L4myMjjaa6ORl3MgRYQ4gmuFqpefrGdm\n" +"ywRCleh2JerkQ4VxOuq10dn/abITzLyaZzMw30KXWp5pxKXOLtxFAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-key-crosscert\n" +"-----BEGIN ID SIGNATURE-----\n" +"FTBJNR/Hlt4T53yUMp1r/QCSMCpkHJCbYBT0R0pvYqhqFfYN5qHRSICRXaFFImIF\n" +"0DGWmwRza6DxPKNzkm5/b7I0de9zJW1jNNdQAQK5xppAtQcAafRdu8cBonnmh9KX\n" +"k1NrAK/X00FYywju3yl/SxCn1GddVNkHYexEudmJMPM=\n" +"-----END ID SIGNATURE-----\n" +"dir-key-certification\n" +"-----BEGIN SIGNATURE-----\n" +"pjWguLFBfELZDc6DywL6Do21SCl7LcutfpM92MEn4WYeSNcTXNR6lRX7reOEJk4e\n" +"NwEaMt+Hl7slgeR5wjnW3OmMmRPZK9bquNWbfD+sAOV9bRFZTpXIdleAQFPlwvMF\n" +"z/Gzwspzn4i2Yh6hySShrctMmW8YL3OM8LsBXzBhp/rG2uHlsxmIsc13DA6HWt61\n" +"ffY72uNE6KckDGsQ4wPGP9q69y6g+X+TNio1KPbsILbePv6EjbO+rS8FiS4njPlg\n" +"SPYry1RaUvxzxTkswIzdE1tjJrUiqpbWlTGxrH9N4OszoLm45Pc784KLULrjKIoi\n" +"Q+vRsGrcMBAa+kDowWU6H1ryKR7KOhzRTcf2uqLE/W3ezaRwmOG+ETmoVFwbhk2X\n" +"OlbXEM9fWP+INvFkr6Z93VYL2jGkCjV7e3xXmre/Lb92fUcYi6t5dwzfV8gJnIoG\n" +"eCHd0K8NrQK0ipVk/7zcPDKOPeo9Y5aj/f6X/pDHtb+Dd5sT+l82G/Tqy4DIYUYR\n" +"-----END SIGNATURE-----\n"; + +/** The private signing key for AUTHORITY_CERT_1 */ +const char AUTHORITY_SIGNKEY_A[] = +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICWwIBAAKBgQCz0lCJ8rhLujVdzY6M6ZWp4iBAc0FxI79cff/pqp8GQAaWFZrs\n" +"vQPJ8XqMmN7GRbJ2MDVvyGYwIBtt6RJnr7txfi+JsjI42mujkZdzIEWEOIJrhaqX\n" +"n6xnZssEQpXodiXq5EOFcTrqtdHZ/2myE8y8mmczMN9Cl1qeacSlzi7cRQIDAQAB\n" +"AoGASpzUkDinIbzU0eQt5ugxEnliOnvYRpK3nzAk1JbYPyan1PSIAPz4qn1JBTeV\n" +"EB3xS7r7ITO8uvFHkFZqLZ2sH1uE6e4sAytJGO+kyqnlkiDTPEXpcGe99j8PH1yj\n" +"xUOrHRlAYWjG8NEkQi+APA+HZkswE3L/viFwR2AARoE2ac0CQQDsOLdNJa+mqn6N\n" +"1L76nEl/YgXHtKUks+beOR3IgknKEjcsJJEUHyiu0wjbXZV6gTtyQvcAePglUUD1\n" +"R2OkOOADAkEAwuCxvHEAPeQbVt8fSvxw74vqew6LITP2Utb1dQK0E26IRPF36BsJ\n" +"buO/gqMZv6ALq+/KxpA/pUsApbgog9uUFwJAYvHCvbrKX1pM1iXFtP1fv86UMzlU\n" +"bxI34t8zvXftZonIuGG8rxv6E3hr3k7NvNmCx/KKuZTyA9eMCPFVKEV2dwJACn8j\n" +"06yagLrqphE6lEVop953cM1lvRIZcHjXm8fbfzhy6pO/C6d5KJnn1NeIKYQrXMV7\n" +"vJpEc1jI3iQ/Omr3XQJAEBIt5MlP2wlrX9om7B+32XBygUssY3cw/bXybZrtSU0/\n" +"Yx4lqK0ca5IkTp3HevwnlWaJgbaOTUspCVshzJBhDA==\n" +"-----END RSA PRIVATE KEY-----\n"; + +const char AUTHORITY_SIGNKEY_A_DIGEST[] = + "CBF56A83368A5150F1A9AAADAFB4D77F8C4170E2"; +const char AUTHORITY_SIGNKEY_A_DIGEST256[] = + "AF7C5468DBE3BA54A052726038D7F15F3C4CA511B1952645B3D96D83A8DFB51C"; + +/** Second of 3 example authority certificates for unit testing. */ +const char AUTHORITY_CERT_B[] = +"dir-key-certificate-version 3\n" +"fingerprint AD011E25302925A9D39A80E0E32576442E956467\n" +"dir-key-published 2013-11-14 14:12:05\n" +"dir-key-expires 2014-11-14 14:12:05\n" +"dir-identity-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIIBigKCAYEAyXYEMlGNRAixXdg65xf2WPkskYj2Wo8ysKMTls1JCXdIOAPvC2k2\n" +"+AC6i3x9JHzUgCjWr4Jd5PSi7ODGyFC543igYl4wzkxNTU2L+SQ+hMe9qbEuUNhH\n" +"sRR0xofdoH//3UuKj+HXEiMhhHbRWQGtWFuJqtGBruJqjZqIGOrp5nFjdlP0R98n\n" +"Rx5wWlPgdJzifkXjKouu4mV+KzLl7f0gAtngA9DkSjt1wzga5IlL/lxDciD0SyJU\n" +"tKMmls056omrZNbTnBxnY2pOlq9nx/zFrt/KQm1fTAQMjMBCf9KnDIV7NhaaHx7F\n" +"7Nk8L7Hha353SvR+bsOFpiu05/EMZFTTIhO3MhUxZiCVZ0hKXvW1xe0HoGC5wbB+\n" +"NyXu8oa4fIKLJ+WJ8Z60BNc0DcxJiQOf1eolGM/qrBul1lFZznds5/7182d+nF2W\n" +"+bEjSm0fgXIxPfSD/7hB0FvgtmB3TXybHGBfPZgX0sTzFB6LNtP0BHicRoMXKdLF\n" +"hM3tgIjEAsoZAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAJ567PZIGG/mYWEY4szYi/C5XXvf0BkquzKTHKrqVjysZEys9giz56Gv\n" +"B08kIRxsxYKEWkq60rv0xtTc1WyEMcDpV1WLU0KSTQSVXzLu7BT8jbTsWzGsxdTV\n" +"TdeyOirwHh8Cyyon5lppuMH5twUHrL5O7pWWbxjjrQjAHCn3gd+NAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-key-crosscert\n" +"-----BEGIN ID SIGNATURE-----\n" +"OC+gaukd4K7xJOsgTPbRhacf5mDUGxsu3ho/J1oJdtni4CK9WscVs6/Goj1o5Lot\n" +"H1nCAMaR96Jnqq5c63Aaj1sEXdeYHlu5cI7YHgtGI5MmtjiUNXUCWMjCwSQYwGKe\n" +"2YDYGAKAGt97n7XMKhJWGjAmv1TgmK3DvL1jt/aazL8=\n" +"-----END ID SIGNATURE-----\n" +"dir-key-certification\n" +"-----BEGIN SIGNATURE-----\n" +"BddmCKsvS6VoFXIf9Aj9OZnfyVCx527517QtsQHN+NaVm20LzUkJ5MWGXYx4wgh3\n" +"ExsHvVQguiVfnonkQpEHHKg+TbldlkuDhIdlb9f7dL7V3HLCsEdmS1c3A+TEyrPH\n" +"i44p6QB5IMFAdgUMV/9ueKMh7pMoam6VNakMOd+Axx9BSJTrCRzcepjtM4Z0cPsj\n" +"nmDgZi0df1+ca1t+HnuWyt3trxlqoUxRcPZKz28kEFDJsgnRNvoHrIvNTuy9qY4x\n" +"rONnPuLr5kTO7VQVVZxgxt6WX3p6d8tj+WYHubydr2pG0dwu2vGDTy4qXvDIm/I4\n" +"Gyo6OAoPbYV8fl0584EgiEbAWcX/Pze8mXr9lmXbf73xbSBHqveAs0UfB+4sBI98\n" +"v4ax4NZkGs8cCIfugtAOLgZE0WCh/TQYnQ3PFcrUtj0RW+tM1z7S8P3UfEVBHVkJ\n" +"8SqSB+pbsY6PwMuy6TC3WujW7gmjVanbwkbW19El9l9jRzteFerz7grG/WQkshqF\n" + "-----END SIGNATURE-----\n"; + +/** The private signing key for AUTHORITY_CERT_2 */ +const char AUTHORITY_SIGNKEY_B[] = +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICWwIBAAKBgQCeeuz2SBhv5mFhGOLM2IvwuV1739AZKrsykxyq6lY8rGRMrPYI\n" +"s+ehrwdPJCEcbMWChFpKutK79MbU3NVshDHA6VdVi1NCkk0ElV8y7uwU/I207Fsx\n" +"rMXU1U3Xsjoq8B4fAssqJ+ZaabjB+bcFB6y+Tu6Vlm8Y460IwBwp94HfjQIDAQAB\n" +"AoGAfHQ4ZmfTmPyoeGHcqdVcgBxxh3gJqdnezCavGqGQO3F+CqDBTbBKNLSI3uOW\n" +"hQX+TTK23Xy9RRFCm6MYj3F4x7OOrSHSFyhMmzRnAZi3zGbtQZn30XoqTwCmVevY\n" +"p5JbVvhP2BJcvdsyQhiIG23FRQ7MMHWtksAxmovTto1h/hkCQQDNCfMqSztgJZDn\n" +"JSf5ASHBOw8QzfZBeYi3hqfiDtAN1RxT1uQnEiFQFJqwCz5lCbcwVrfQbrrk5M+h\n" +"ooYrX7tTAkEAxd6Tl0N0WM3zCKz+3/Hoiyty6olnnpzNoPCg7LLBJcetABQi0KUv\n" +"swYWlKP3eOFZkiBzTqa9nBK7eYLKV3d9nwJAKNM3WI98Nguky3FJgTnpd6kDuevY\n" +"gXbqcuhb2xXp9Sceqc7axLDGc0R2/GBwvvttPzG1DcpOai7o7J0Iq/A2wwJAYuKI\n" +"/99GFdtWyc8q0OAkRui/1VY14p6aZQPcaG4s+KSBYLivbXYgEGfKgR4wXsi/6rcs\n" +"6PGLcKQr7N3gITYmIQJAaQn6djUWygCn1noKyWU+Sa7G5qqU2GWkLq9dMaRLm1/I\n" +"nqi+2K1mN15rra0QtFVqSH4JXr8h3KAGyU45voGM7A==\n" +"-----END RSA PRIVATE KEY-----\n"; + +/** Third of 3 example authority certificates for unit testing. */ +const char AUTHORITY_CERT_C[] = +"dir-key-certificate-version 3\n" +"fingerprint 628C2086EC29C9D26E638C5A8B2065BFBD35829B\n" +"dir-key-published 2013-11-14 14:12:18\n" +"dir-key-expires 2014-11-14 14:12:18\n" +"dir-identity-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIIBigKCAYEAuzPA82lRVUAc1uZgfDehhK0rBU5xt+qhJXUSH0DxsuocYCLW//q+\n" +"7+L7q9SochqZK3R5+SxJaZRlVK4rAeIHsxXFxsnGvuqasGM3he80EV1RpVRkvLaO\n" +"2dDmHcfEjYBadft2DEq811yvqSRqbFXmK0hLucA6LI6NnEw9VNWlguaV6ACVLyKQ\n" +"iYVFz2JOJIAi0Zz57WZg7eHypUAGoyXjtYTJPsh6pUe/0NLFJVd3JHcJX+bNqU2a\n" +"QU37r+CQ9f3T+8fZGJQ/CXNnYUNHa0j+toOFuPEiZBBh8C4PE7FJWjidvhe9uI7T\n" +"Py41RZhy8e05MAQmUBNRKBHWPKHoy2zWZZxTkcfWFdJJz/dzsNrIjrqf2fYId9To\n" +"fDpHzYd/UjzZaaVYRVS/Oyf3pN8DKw8LMhEArS0X9pblPVkWWjmYMU6f0VR7pelc\n" +"gGYuML3gOiKdNbeMWgAv3HNRsVsuW0HZLrhXUGYzTRPJ/GxVCwA/NmYgMTNVWRwF\n" +"7M78YHpayyEPAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBANESf/hRRWCK3TLQyNb9Y42tYedCORUc8Rl+Q4wrvdz3R0TNr6rztE9N\n" +"u8v3Wbvjtiqm1xL1I5PaOObFQQj61QZxKiCm1yU4eFH15dNmcvBEy5BjEXVYiDgy\n" +"zKRyePzjHYQIZF3ZaQTABUplkXVpY0YvAurluhEy+dKEvZMwWFZTAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-key-crosscert\n" +"-----BEGIN ID SIGNATURE-----\n" +"NHNBya6Dt7Ww3qSGA0DBEl6pZFBzmYXM+QdqF+ESpdyYCQ54EYimaxl4VcXoGaxy\n" +"xk8/VOXPC6h7hVnTWDTsC86G6eXug1yzpd/uhQbcDJMH5q8/Yg5WXGOnGhMWNCBh\n" +"u2UmbtAjdjLrObQaB50FfOpuOV9kdG4SEzaPUBR2ayU=\n" +"-----END ID SIGNATURE-----\n" +"dir-key-certification\n" +"-----BEGIN SIGNATURE-----\n" +"NocTkLl9iKglVo+yrpY0slsqgPviuScMyEfOJ3i65KeJb4Dr1huIs0Fip40zFD8D\n" +"cz/SYu09FbANuRwBJIRdVWZLLwVFLBj5F8U65iJRAPBw/O/xgSVBvWoOhBUZqmJA\n" +"Jp1IUutQHYFfnAOO9za4r8Ox6yPaOWF9Ks5gL0kU/fI8Bdi5E9p3e9fMtoM7hROg\n" +"oX1AoV/za3LcM0oMsGsdXQ7B8vRqY0eUX523kpRpF1fUDyvBUvvMsXdZDN6anCV6\n" +"NtSq2UaM/msTX1oQ8gzyD1gMXH0Ek26YMhd+6WZE6KUeb1x5HJgXtKtYzMLB6nQM\n" +"4Q/OA4NND/Veflofy6xx8uzXe8H+MoUHK9WiORtwqvBl0E9qk6SVCuo4ipR4Ybgk\n" +"PAFOXA58j80dlNYYEVgV8MXF1Y/g/thuXlf2dWiLAExdHTtE0AzC4quWshegaImC\n" +"4aziHeA43TRDszAXcJorREAM0AhSxp3aWDde4Jt46ODOJR8t+gHreks29eDttEIn\n" +"-----END SIGNATURE-----\n"; + +/** The private signing key for AUTHORITY_CERT_3 */ +const char AUTHORITY_SIGNKEY_C[] = +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXAIBAAKBgQDREn/4UUVgit0y0MjW/WONrWHnQjkVHPEZfkOMK73c90dEza+q\n" +"87RPTbvL91m747YqptcS9SOT2jjmxUEI+tUGcSogptclOHhR9eXTZnLwRMuQYxF1\n" +"WIg4Msykcnj84x2ECGRd2WkEwAVKZZF1aWNGLwLq5boRMvnShL2TMFhWUwIDAQAB\n" +"AoGAU68L+eDN3C65CzX2rdcOmg7kOSSQpJrJBmM7tkdr3546sJeD0PFrIrMCkEmZ\n" +"aVNj/v545+WnL+8RB4280lNUIF4AMNaMZUL+4FAtwekqWua3QvvqgRMjCdG3/h/d\n" +"bOAUiiKKEimflTaIVHNVSCvOIntftOu3PhebctuabnZzg0ECQQD9i+FX7M9UXT1A\n" +"bVm+bRIJuQtG+u9jD3VxrvHsmh0QnOAL3oa/ofTCwoTJLZs8Qy0GeAoJNf28rY1q\n" +"AgNMEeEXAkEA0xhxNX2fDQ2yvKwPkPMrRycJVWry+KHvSZG2+XYh+V5sVGQ5H7Gu\n" +"krc6IzRZlIKQhEGktkw8ih0DEHQbAihiJQJBAKi/SnFcePjrPXL91Hb63MB/2dOZ\n" +"+21wwnexOe6A+8ssvajop8IvJlnhYMMMiX7oLrVZe0R6HLBQyge94zfjxm0CQGye\n" +"dRIrE34qAEBo4JGbLjesdHcJUwBwgqn+WoI+MPkZhvBdqa8PRF6l/TpEI5vxGt+S\n" +"z2gmDjia+QqsU4FmuikCQDDOs85uwNSKJFax9XMzd1qd1QwX20F8lvnOsWErXiDw\n" +"Fy2+rmIRHoSxn4D+rE5ivqkO99E9jAlz+uuQz/6WqwE=\n" +"-----END RSA PRIVATE KEY-----\n"; + diff --git a/src/wraith/src/test/test_descriptors.inc b/src/wraith/src/test/test_descriptors.inc new file mode 100644 index 000000000..ecbccbd43 --- /dev/null +++ b/src/wraith/src/test/test_descriptors.inc @@ -0,0 +1,305 @@ +const char TEST_DESCRIPTORS[] = +"@uploaded-at 2014-06-08 19:20:11\n" +"@source \"127.0.0.1\"\n" +"router test000a 127.0.0.1 5000 0 7000\n" +"platform Tor 0.2.5.3-alpha-dev on Linux\n" +"protocols Link 1 2 Circuit 1\n" +"published 2014-06-08 19:20:11\n" +"fingerprint C7E7 CCB8 179F 8CC3 7F5C 8A04 2B3A 180B 934B 14BA\n" +"uptime 0\n" +"bandwidth 1073741824 1073741824 0\n" +"extra-info-digest 67A152A4C7686FB07664F872620635F194D76D95\n" +"caches-extra-info\n" +"onion-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAOuBUIEBARMkkka/TGyaQNgUEDLP0KG7sy6KNQTNOlZHUresPr/vlVjo\n" +"HPpLMfu9M2z18c51YX/muWwY9x4MyQooD56wI4+AqXQcJRwQfQlPn3Ay82uZViA9\n" +"DpBajRieLlKKkl145KjArpD7F5BVsqccvjErgFYXvhhjSrx7BVLnAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAN6NLnSxWQnFXxqZi5D3b0BMgV6y9NJLGjYQVP+eWtPZWgqyv4zeYsqv\n" +"O9y6c5lvxyUxmNHfoAbe/s8f2Vf3/YaC17asAVSln4ktrr3e9iY74a9RMWHv1Gzk\n" +"3042nMcqj3PEhRN0PoLkcOZNjjmNbaqki6qy9bWWZDNTdo+uI44dAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"hidden-service-dir\n" +"contact auth0@test.test\n" +"ntor-onion-key pK4bs08ERYN591jj7ca17Rn9Q02TIEfhnjR6hSq+fhU=\n" +"reject *:*\n" +"router-signature\n" +"-----BEGIN SIGNATURE-----\n" +"rx88DuM3Y7tODlHNDDEVzKpwh3csaG1or+T4l2Xs1oq3iHHyPEtB6QTLYrC60trG\n" +"aAPsj3DEowGfjga1b248g2dtic8Ab+0exfjMm1RHXfDam5TXXZU3A0wMyoHjqHuf\n" +"eChGPgFNUvEc+5YtD27qEDcUjcinYztTs7/dzxBT4PE=\n" +"-----END SIGNATURE-----\n" +"@uploaded-at 2014-06-08 19:20:11\n" +"@source \"127.0.0.1\"\n" +"router test001a 127.0.0.1 5001 0 7001\n" +"platform Tor 0.2.5.3-alpha-dev on Linux\n" +"protocols Link 1 2 Circuit 1\n" +"published 2014-06-08 19:20:11\n" +"fingerprint 35DA 711C FC62 F88B C243 DE32 DC0B C28A 3F62 2610\n" +"uptime 0\n" +"bandwidth 1073741824 1073741824 0\n" +"extra-info-digest 9E12278D6CF7608071FE98CE9DCEE48FA264518A\n" +"caches-extra-info\n" +"onion-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAPbyUrorqoXMW4oezqd307ZGxgobqvQs2nb3TdQyWrwsHtJmS3utdrJS\n" +"xJUZPNHOQ2hrDWW1VvevYqRTGeXGZr9TDZ3+t/gVUttqYRhuzzgEKVAZSsTo5ctO\n" +"QNHnzJ6Xx/w/trhWqPTeJ7R0TCyAbWW7aE3KaKdwvZilRZp/oRUnAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBALwOJ7XZHBnjJEuwF3Os6eashNbTH9YnH8TBZBdKgu3iFJYqDslcMIPX\n" +"gWCJ9apPHyh1+/8OLRWeEYlwoZzgGi0rjm/+BNeOOmJbjfyjk97DuB9/2O5zr1BM\n" +"CvOHqQSzMD+vz1ebvfM039a2mO8lXruUFPZQaFVxk8371XP2khqhAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"hidden-service-dir\n" +"contact auth1@test.test\n" +"ntor-onion-key t5bI1ksTdigOksMKRHUDwx/34ajEvDN1IpArOxIEWgk=\n" +"reject *:*\n" +"router-signature\n" +"-----BEGIN SIGNATURE-----\n" +"KtMW7A/pzu+np6aKJSy6d7drIb4yjz8SPCo+oQNxj2IqNHJir2O2nWu69xy+K0c1\n" +"RL05KkcDaYzr5hC80FD1H+sTpGYD28SPkQkzPw+0pReSDl93pVXh0rU6Cdcm75FC\n" +"t0UZzDt4TsMuFB0ZYpM3phKcQPpiDG6aR0LskL/YUvY=\n" +"-----END SIGNATURE-----\n" +"@uploaded-at 2014-06-08 19:20:11\n" +"@source \"127.0.0.1\"\n" +"router test004r 127.0.0.1 5004 0 7004\n" +"platform Tor 0.2.5.3-alpha-dev on Linux\n" +"protocols Link 1 2 Circuit 1\n" +"published 2014-06-08 19:20:10\n" +"fingerprint CC6A 48BD 52BD 9A2C 6670 5863 AC31 AE17 6E63 8B02\n" +"uptime 0\n" +"bandwidth 1073741824 1073741824 0\n" +"extra-info-digest B5CC249CEF394B5AFCA0C77FA7D5605615FA487C\n" +"onion-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAMze36Hupy7HACcF3TMv5mJuZbx3d3cS0WYLl6vTeChBgpS5CEXq6zIu\n" +"d31YmtUcxH6fOjDOudhbnXuoh1nH4CP+LocVHAdlGG1giAm7u8yZudVvVJiIqFgQ\n" +"wVDcWx8LbGCi5P9J/ZPKAIVsSyS7xkOqHjz3VMo/uYLbQCFAwfkdAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAM/qGP365x6bH+ug7rKVy7V5lC9Ff2Jfk0wlTFIzzwn+DMSG6xDvulKe\n" +"wcIzgGNdQu7qlKlQUif3GPMr0KSS32cRsmoRQJcsm9+lGUK871NyZ8AyrHT+LhyF\n" +"cs718P0iN5yKF2FikNr727kEANCzvC1l9eP4qF5GGzsNtglbJ7bTAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"hidden-service-dir\n" +"ntor-onion-key a9Pavqnx7DFhMWUO0d17qF9Py8+iie4FnxTHaTgfIXY=\n" +"reject *:25\n" +"reject *:119\n" +"reject *:135-139\n" +"reject *:445\n" +"reject *:563\n" +"reject *:1214\n" +"reject *:4661-4666\n" +"reject *:6346-6429\n" +"reject *:6699\n" +"reject *:6881-6999\n" +"accept *:*\n" +"router-signature\n" +"-----BEGIN SIGNATURE-----\n" +"HVW7kjBgEt+Qdvcrq+NQE1F9B8uV9D38KA2Bp6cYHLWCxL6N4GS8JQqbOEtnqaj7\n" +"Vxrv7uy1Fzb15Zr+1sUVMxNv+LLRfr+JzfETMNYVkYDrNgr1cAAVEQzFWbIziond\n" +"xMFp64yjEW9/I+82lb5GBZEiKdEd4QqWMmQosoYMTM8=\n" +"-----END SIGNATURE-----\n" +"@uploaded-at 2014-06-08 19:20:12\n" +"@source \"127.0.0.1\"\n" +"router test002a 127.0.0.1 5002 0 7002\n" +"platform Tor 0.2.5.3-alpha-dev on Linux\n" +"protocols Link 1 2 Circuit 1\n" +"published 2014-06-08 19:20:11\n" +"fingerprint 29C7 BBB6 C437 32D5 BDF1 5671 F5C5 F1FB 6E36 4B47\n" +"uptime 0\n" +"bandwidth 1073741824 1073741824 0\n" +"extra-info-digest 9BB181EA86E0130680C3CC04AD7DE4C341ADC2C7\n" +"caches-extra-info\n" +"onion-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBALNH19oF8Ajf+djlH/g7L+enFBf5Wwjmf3bPwNKWZ9G+B+Lg8SpfhZiw\n" +"rUqi7h21f45BV/dN05dK6leWD8rj1T9kuM9TKBOEZxIWeq7zbXihyu4XPxP4FNTS\n" +"+0G7BhdP4biALENmeyLhUCZaw5Ic/jFkHT4gV9S0iVZiEDwC9twXAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBALeyQGMQBHgTxpO/i30uHjflTm9MNi3ZBNcOKpvBXWYgY42qTqOZ7Uam\n" +"c5pmZhTLrQ1W8XlGDw8Cl8ktZ0ylodLZyUNajBtJvSFWTb8iwdZsshW6Ahb8TyfI\n" +"Y7MwTlQ/7xw4mj1NEaui6bwGgEZUs18RTqhDrUc2Mcj1Yf61Rq+7AgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"hidden-service-dir\n" +"contact auth2@test.test\n" +"ntor-onion-key ukR41RjtiZ69KO0SrFTvL0LoZK/ZTT01FQWmCXTCUlE=\n" +"reject *:*\n" +"router-signature\n" +"-----BEGIN SIGNATURE-----\n" +"IY2s/RY4tdahrgfGG+vW7lOvpfofoxxSo7guGpSKGxVApiroCQtumoYifnnJ88G2\n" +"K4IbxwEO8pgO8fnz1mibblUWw2vdDNjCifc1wtXJUE+ONA0UcLRlfQ94GbL8h2PG\n" +"72z6i1+NN0QahXMk7MUbzI7bOXTJOiO8e2Zjk9vRnxI=\n" +"-----END SIGNATURE-----\n" +"@uploaded-at 2014-06-08 19:20:12\n" +"@source \"127.0.0.1\"\n" +"router test006r 127.0.0.1 5006 0 7006\n" +"platform Tor 0.2.5.3-alpha-dev on Linux\n" +"protocols Link 1 2 Circuit 1\n" +"published 2014-06-08 19:20:11\n" +"fingerprint 829B 3FAA A42B 605A EB0B F380 8F32 8ED1 73E7 0D25\n" +"uptime 0\n" +"bandwidth 1073741824 1073741824 0\n" +"extra-info-digest 7ECB757002EB9B5838B13AE6F2357A5E585131B8\n" +"onion-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBALsNBChcLVndlS4HNXL3hxBJVgXctATz6yXcJt3bkDB5cjv7Q9fqN3Ue\n" +"j3SI1OUBx4YrLcSLD/hELHVilLrrfbaraAFfAsydlRLjTVcMRx5FFlDd0E7TAadc\n" +"71CkTipNnjwqz1mTRKkEFeepnh/JaFDidY9ER1rMBA5JRyBvqrD9AgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAPgipA8yLj1kqrMlAH7cK7IQEdmqmfNHGXdkYQ+TKtfLh0zeEIvvh9yh\n" +"k+vKHS+HVoHo3tecB9QjJyDyyJTiETXCupSOY+ebG648JADAvv8v1WiE+KBXtjpl\n" +"qgDTrDj5CwGuY6cvQdej5yg1UAVlMMZSg3thL3tCYtQbOq66lAlnAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"hidden-service-dir\n" +"ntor-onion-key q02F3AQsCX7+zXNpfTqBF8O8lusPhRJpQVxOnBvbOwc=\n" +"reject *:25\n" +"reject *:119\n" +"reject *:135-139\n" +"reject *:445\n" +"reject *:563\n" +"reject *:1214\n" +"reject *:4661-4666\n" +"reject *:6346-6429\n" +"reject *:6699\n" +"reject *:6881-6999\n" +"accept *:*\n" +"router-signature\n" +"-----BEGIN SIGNATURE-----\n" +"L1fdgoN/eXgdzIIXO63W4yGoC9lRozMU+T0Fimhd/XFV8qxeUT83Vgf63vxLUHIb\n" +"D4a80Wj7Pm4y5a766qLGXxlz2FYjCdkp070UpgZneB+VifUlFd/bNAjsiYTstBKM\n" +"EI2L0mhl9d/7KK8vgtadHdX1z1u7QjyF6ccnzhfqeiY=\n" +"-----END SIGNATURE-----\n" +"@uploaded-at 2014-06-08 19:20:12\n" +"@source \"127.0.0.1\"\n" +"router test003r 127.0.0.1 5003 0 7003\n" +"platform Tor 0.2.5.3-alpha-dev on Linux\n" +"protocols Link 1 2 Circuit 1\n" +"published 2014-06-08 19:20:11\n" +"fingerprint 71FD 3A35 F705 8020 D595 B711 D52A 9A0A 99BB B467\n" +"uptime 0\n" +"bandwidth 1073741824 1073741824 0\n" +"extra-info-digest 3796BE0A95B699595445DFD3453CA2074E75BCE8\n" +"onion-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAL44ctIioIfCYFzMTYNfK5qFAPGGUpsAFmS8pThQEY/tJU14+frJDBrC\n" +"BkLvBs05Bw7xOUb0f2geiYGowBA6028smiq5HzTO7Kaga8vfV7AnANPX+n9cfHCr\n" +"/2cMnKkT/GZzpdk0WbUw5Kc/G1ATIPFQHA8gZAi1fsSIDDn3GRV5AgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBALlPo5AI1mVTi+194yOSf40caoFlxSTfXt8KjGVa1dO/bpX7L3noOjYg\n" +"goU4Aqim7BHmBWQDE/tZNTrchFoLQFHi9N4pv/0ND3sY904pzqGpe3FeTuU8P9Jg\n" +"q2w3MeO3GwG8CJf4FOdSkgi8UKkJhOld4g4kViQbrFLXfdFvnT/zAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"hidden-service-dir\n" +"ntor-onion-key qluYCRrsesOTkavCLnNK6H1ToywyDquCyYeP0h/qol4=\n" +"reject *:25\n" +"reject *:119\n" +"reject *:135-139\n" +"reject *:445\n" +"reject *:563\n" +"reject *:1214\n" +"reject *:4661-4666\n" +"reject *:6346-6429\n" +"reject *:6699\n" +"reject *:6881-6999\n" +"accept *:*\n" +"router-signature\n" +"-----BEGIN SIGNATURE-----\n" +"d09K7rW/OpVzoUpfZXJuJW7a+P4pROCOZTgvDUIy/Nv+EAjcYqv95PlJ8cAMqnn3\n" +"1oQibRmmQwn0OmG5cB8NaZiueaVIRheGzHEM8rndpHn5oFXdFvV7KKjScvfuBbTk\n" +"RYME8XyawRaqsEZnwirDDlZuiZOjdQs8bbGsko3grJE=\n" +"-----END SIGNATURE-----\n" +"@uploaded-at 2014-06-08 19:20:12\n" +"@source \"127.0.0.1\"\n" +"router test005r 127.0.0.1 5005 0 7005\n" +"platform Tor 0.2.5.3-alpha-dev on Linux\n" +"protocols Link 1 2 Circuit 1\n" +"published 2014-06-08 19:20:11\n" +"fingerprint EB6E 42ED E6BF 5EE0 19F5 EFC1 53AD 094C 1327 7B76\n" +"uptime 0\n" +"bandwidth 1073741824 1073741824 0\n" +"extra-info-digest C031EE4E1AE826C1E3C4E21D81C961869E63F5D2\n" +"onion-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAMd9Fm4KTSjFDzEABPZ1fwBCC2DNgee6nAmlde8FRbCVfcIHRiJyv9YG\n" +"h530yUJal3hBfiWwy/SBA4LDz1flNCEwJm81s3waj4T9c676dAOLPcnOcJM5SbaQ\n" +"hYPDrIZLEZHAk+IoM+avKYYocwCJXwx6WTtsedF0wJBZ9mQAJERJAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAKT7ldhV43S1CgoER/pU0Rigf0NzcSy25DQJrMRQnNmXnL03Dwuv/Iu7\n" +"dCjgg64odnvSkXHFhkbjGcg8aXikvfbMyZTbsD8NrrP6FS6pfgPgZD9W2TK7QdHI\n" +"QXwx1IYaaJK4nDUNfJhjrclydEdxmHbO1nLG1aS0ypn/G0EBpOSnAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"hidden-service-dir\n" +"ntor-onion-key umFmyRPA0dIsi0CFYCbGIPe2+OUkyslTkKKDEohjQQg=\n" +"reject *:25\n" +"reject *:119\n" +"reject *:135-139\n" +"reject *:445\n" +"reject *:563\n" +"reject *:1214\n" +"reject *:4661-4666\n" +"reject *:6346-6429\n" +"reject *:6699\n" +"reject *:6881-6999\n" +"accept *:*\n" +"router-signature\n" +"-----BEGIN SIGNATURE-----\n" +"JiXEbqPgDPWEb9DzCYINRXfmvMIc/IRtvshS8Vmmn7DW67TrTLKCEAnisGo92gMA\n" +"bhxGb9G5Mxq/8YqGoqdI2Vp6tfKlz/9AmjHzFAo01y42gafXIdr1oUS2RimA8jfF\n" +"hwfQkbG0FYEsJrH3EUa8sMhcjsEaohK/kgklMR7OgQY=\n" +"-----END SIGNATURE-----\n" +"@uploaded-at 2014-06-08 19:20:12\n" +"@source \"127.0.0.1\"\n" +"router test007r 127.0.0.1 5007 0 7007\n" +"platform Tor 0.2.5.3-alpha-dev on Linux\n" +"protocols Link 1 2 Circuit 1\n" +"published 2014-06-08 19:20:11\n" +"fingerprint DABD 2AAF 8C9F 3B71 7839 9C08 DCD8 CD9D 341D 0002\n" +"uptime 0\n" +"bandwidth 1073741824 1073741824 0\n" +"extra-info-digest F80104A0DFFB4EB429325D41D1F71E5BF8C6C726\n" +"onion-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAL42fYAriR/JeB/9NpVq5Y5EEHca+ugIpaSdRfbopWDtFjXLEk2jmO5A\n" +"KoAGIkTKDr7e9101x63H+0Nh/7w3uYs/WqTXEH8/1sHwe+0PY2HL0S6qhlOo6X54\n" +"EfK0nDDBAWFOpyiAMHRk8JVikKb56+FVIhCJgi1RIbLIiUQK2/kxAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAKQj2U5hmB68V6NQBqD8DfIkJjovvM8t6nGfYpkT8ORsROnmgI5mjM38\n" +"cmh5GIjY9RgoOWolLmsWQ4SXtS0FvrPft1M61UMTSHzlrEeuod5KenV7vGlX2TxT\n" +"0DoA5TL9yY7CmxCk8CNRCtN/g7WocgIiP4KCIiEZ4VE6LIb6sxUnAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"hidden-service-dir\n" +"ntor-onion-key 1UBS8rTlL39u9YxRJWhz+GTG1dS15VRi4au1i5qZOyI=\n" +"reject *:25\n" +"reject *:119\n" +"reject *:135-139\n" +"reject *:445\n" +"reject *:563\n" +"reject *:1214\n" +"reject *:4661-4666\n" +"reject *:6346-6429\n" +"reject *:6699\n" +"reject *:6881-6999\n" +"accept *:*\n" +"router-signature\n" +"-----BEGIN SIGNATURE-----\n" +"m7xHh+XPdLN+qcMLz1dBAEAmcdCFrtdseMHCc0FyAP2kXdayxqe3o2IOOHN++bTH\n" +"Y5iHsZembsIJJ+D/d0YEKWKh42TUWCXBu0Gbfc4OcNuR6PFlTWO2wk7rDT3HOiFr\n" +"pe3wJqZYkLxlBDamROAlMMRe71iag89H/4EulC18opw=\n" +"-----END SIGNATURE-----\n"; diff --git a/src/wraith/src/test/test_dir.c b/src/wraith/src/test/test_dir.c new file mode 100644 index 000000000..6092a5a4d --- /dev/null +++ b/src/wraith/src/test/test_dir.c @@ -0,0 +1,6349 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include + +#define CONFIG_PRIVATE +#define CONTROL_PRIVATE +#define DIRSERV_PRIVATE +#define DIRVOTE_PRIVATE +#define ROUTER_PRIVATE +#define ROUTERLIST_PRIVATE +#define ROUTERPARSE_PRIVATE +#define HIBERNATE_PRIVATE +#define NETWORKSTATUS_PRIVATE +#define RELAY_PRIVATE + +#include "or.h" +#include "bridges.h" +#include "confparse.h" +#include "config.h" +#include "control.h" +#include "crypto_ed25519.h" +#include "directory.h" +#include "dirserv.h" +#include "dirvote.h" +#include "entrynodes.h" +#include "hibernate.h" +#include "memarea.h" +#include "networkstatus.h" +#include "router.h" +#include "routerkeys.h" +#include "routerlist.h" +#include "routerparse.h" +#include "routerset.h" +#include "shared_random_state.h" +#include "test.h" +#include "test_dir_common.h" +#include "torcert.h" +#include "relay.h" +#include "log_test_helpers.h" + +#define NS_MODULE dir + +static void +test_dir_nicknames(void *arg) +{ + (void)arg; + tt_assert( is_legal_nickname("a")); + tt_assert(!is_legal_nickname("")); + tt_assert(!is_legal_nickname("abcdefghijklmnopqrst")); /* 20 chars */ + tt_assert(!is_legal_nickname("hyphen-")); /* bad char */ + tt_assert( is_legal_nickname("abcdefghijklmnopqrs")); /* 19 chars */ + tt_assert(!is_legal_nickname("$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA")); + /* valid */ + tt_assert( is_legal_nickname_or_hexdigest( + "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA")); + tt_assert( is_legal_nickname_or_hexdigest( + "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA=fred")); + tt_assert( is_legal_nickname_or_hexdigest( + "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA~fred")); + /* too short */ + tt_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); + /* illegal char */ + tt_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); + /* hex part too long */ + tt_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); + tt_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=fred")); + /* Bad nickname */ + tt_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")); + tt_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~")); + tt_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~hyphen-")); + tt_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~" + "abcdefghijklmnoppqrst")); + /* Bad extra char. */ + tt_assert(!is_legal_nickname_or_hexdigest( + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!")); + tt_assert(is_legal_nickname_or_hexdigest("xyzzy")); + tt_assert(is_legal_nickname_or_hexdigest("abcdefghijklmnopqrs")); + tt_assert(!is_legal_nickname_or_hexdigest("abcdefghijklmnopqrst")); + done: + ; +} + +static smartlist_t *mocked_configured_ports = NULL; + +/** Returns mocked_configured_ports */ +static const smartlist_t * +mock_get_configured_ports(void) +{ + return mocked_configured_ports; +} + +/** Run unit tests for router descriptor generation logic. */ +static void +test_dir_formats(void *arg) +{ + char *buf = NULL; + char buf2[8192]; + char platform[256]; + char fingerprint[FINGERPRINT_LEN+1]; + char *pk1_str = NULL, *pk2_str = NULL, *cp; + size_t pk1_str_len, pk2_str_len; + routerinfo_t *r1=NULL, *r2=NULL; + crypto_pk_t *pk1 = NULL, *pk2 = NULL; + routerinfo_t *rp1 = NULL, *rp2 = NULL; + addr_policy_t *ex1, *ex2; + routerlist_t *dir1 = NULL, *dir2 = NULL; + uint8_t *rsa_cc = NULL; + or_options_t *options = get_options_mutable(); + const addr_policy_t *p; + time_t now = time(NULL); + port_cfg_t orport, dirport; + char cert_buf[256]; + + (void)arg; + pk1 = pk_generate(0); + pk2 = pk_generate(1); + + tt_assert(pk1 && pk2); + + hibernate_set_state_for_testing_(HIBERNATE_STATE_LIVE); + + get_platform_str(platform, sizeof(platform)); + r1 = tor_malloc_zero(sizeof(routerinfo_t)); + r1->addr = 0xc0a80001u; /* 192.168.0.1 */ + r1->cache_info.published_on = 0; + r1->or_port = 9000; + r1->dir_port = 9003; + r1->supports_tunnelled_dir_requests = 1; + tor_addr_parse(&r1->ipv6_addr, "1:2:3:4::"); + r1->ipv6_orport = 9999; + r1->onion_pkey = crypto_pk_dup_key(pk1); + /* Fake just enough of an ntor key to get by */ + curve25519_keypair_t r1_onion_keypair; + curve25519_keypair_generate(&r1_onion_keypair, 0); + r1->onion_curve25519_pkey = tor_memdup(&r1_onion_keypair.pubkey, + sizeof(curve25519_public_key_t)); + r1->identity_pkey = crypto_pk_dup_key(pk2); + r1->bandwidthrate = 1000; + r1->bandwidthburst = 5000; + r1->bandwidthcapacity = 10000; + r1->exit_policy = NULL; + r1->nickname = tor_strdup("Magri"); + r1->platform = tor_strdup(platform); + + ex1 = tor_malloc_zero(sizeof(addr_policy_t)); + ex2 = tor_malloc_zero(sizeof(addr_policy_t)); + ex1->policy_type = ADDR_POLICY_ACCEPT; + tor_addr_from_ipv4h(&ex1->addr, 0); + ex1->maskbits = 0; + ex1->prt_min = ex1->prt_max = 80; + ex2->policy_type = ADDR_POLICY_REJECT; + tor_addr_from_ipv4h(&ex2->addr, 18<<24); + ex2->maskbits = 8; + ex2->prt_min = ex2->prt_max = 24; + r2 = tor_malloc_zero(sizeof(routerinfo_t)); + r2->addr = 0x0a030201u; /* 10.3.2.1 */ + ed25519_keypair_t kp1, kp2; + ed25519_secret_key_from_seed(&kp1.seckey, + (const uint8_t*)"YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"); + ed25519_public_key_generate(&kp1.pubkey, &kp1.seckey); + ed25519_secret_key_from_seed(&kp2.seckey, + (const uint8_t*)"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); + ed25519_public_key_generate(&kp2.pubkey, &kp2.seckey); + r2->cache_info.signing_key_cert = tor_cert_create(&kp1, + CERT_TYPE_ID_SIGNING, + &kp2.pubkey, + now, 86400, + CERT_FLAG_INCLUDE_SIGNING_KEY); + r2->platform = tor_strdup(platform); + r2->cache_info.published_on = 5; + r2->or_port = 9005; + r2->dir_port = 0; + r2->supports_tunnelled_dir_requests = 1; + r2->onion_pkey = crypto_pk_dup_key(pk2); + curve25519_keypair_t r2_onion_keypair; + curve25519_keypair_generate(&r2_onion_keypair, 0); + r2->onion_curve25519_pkey = tor_memdup(&r2_onion_keypair.pubkey, + sizeof(curve25519_public_key_t)); + r2->identity_pkey = crypto_pk_dup_key(pk1); + r2->bandwidthrate = r2->bandwidthburst = r2->bandwidthcapacity = 3000; + r2->exit_policy = smartlist_new(); + smartlist_add(r2->exit_policy, ex1); + smartlist_add(r2->exit_policy, ex2); + r2->nickname = tor_strdup("Fred"); + + tt_assert(!crypto_pk_write_public_key_to_string(pk1, &pk1_str, + &pk1_str_len)); + tt_assert(!crypto_pk_write_public_key_to_string(pk2 , &pk2_str, + &pk2_str_len)); + + /* XXXX+++ router_dump_to_string should really take this from ri.*/ + options->ContactInfo = tor_strdup("Magri White " + ""); + /* Skip reachability checks for DirPort and tunnelled-dir-server */ + options->AssumeReachable = 1; + + /* Fake just enough of an ORPort and DirPort to get by */ + MOCK(get_configured_ports, mock_get_configured_ports); + mocked_configured_ports = smartlist_new(); + + memset(&orport, 0, sizeof(orport)); + orport.type = CONN_TYPE_OR_LISTENER; + orport.addr.family = AF_INET; + orport.port = 9000; + smartlist_add(mocked_configured_ports, &orport); + + memset(&dirport, 0, sizeof(dirport)); + dirport.type = CONN_TYPE_DIR_LISTENER; + dirport.addr.family = AF_INET; + dirport.port = 9003; + smartlist_add(mocked_configured_ports, &dirport); + + buf = router_dump_router_to_string(r1, pk2, NULL, NULL, NULL); + + UNMOCK(get_configured_ports); + smartlist_free(mocked_configured_ports); + mocked_configured_ports = NULL; + + tor_free(options->ContactInfo); + tt_assert(buf); + + strlcpy(buf2, "router Magri 192.168.0.1 9000 0 9003\n" + "or-address [1:2:3:4::]:9999\n" + "platform Tor "VERSION" on ", sizeof(buf2)); + strlcat(buf2, get_uname(), sizeof(buf2)); + strlcat(buf2, "\n" + "published 1970-01-01 00:00:00\n" + "fingerprint ", sizeof(buf2)); + tt_assert(!crypto_pk_get_fingerprint(pk2, fingerprint, 1)); + strlcat(buf2, fingerprint, sizeof(buf2)); + strlcat(buf2, "\nuptime 0\n" + /* XXX the "0" above is hard-coded, but even if we made it reflect + * uptime, that still wouldn't make it right, because the two + * descriptors might be made on different seconds... hm. */ + "bandwidth 1000 5000 10000\n" + "onion-key\n", sizeof(buf2)); + strlcat(buf2, pk1_str, sizeof(buf2)); + strlcat(buf2, "signing-key\n", sizeof(buf2)); + strlcat(buf2, pk2_str, sizeof(buf2)); + strlcat(buf2, "hidden-service-dir\n", sizeof(buf2)); + strlcat(buf2, "contact Magri White \n", + sizeof(buf2)); + strlcat(buf2, "ntor-onion-key ", sizeof(buf2)); + base64_encode(cert_buf, sizeof(cert_buf), + (const char*)r1_onion_keypair.pubkey.public_key, 32, + BASE64_ENCODE_MULTILINE); + strlcat(buf2, cert_buf, sizeof(buf2)); + strlcat(buf2, "reject *:*\n", sizeof(buf2)); + strlcat(buf2, "tunnelled-dir-server\nrouter-signature\n", sizeof(buf2)); + buf[strlen(buf2)] = '\0'; /* Don't compare the sig; it's never the same + * twice */ + + tt_str_op(buf,OP_EQ, buf2); + tor_free(buf); + + buf = router_dump_router_to_string(r1, pk2, NULL, NULL, NULL); + tt_assert(buf); + cp = buf; + rp1 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL,NULL); + tt_assert(rp1); + tt_int_op(rp1->addr,OP_EQ, r1->addr); + tt_int_op(rp1->or_port,OP_EQ, r1->or_port); + tt_int_op(rp1->dir_port,OP_EQ, r1->dir_port); + tt_int_op(rp1->bandwidthrate,OP_EQ, r1->bandwidthrate); + tt_int_op(rp1->bandwidthburst,OP_EQ, r1->bandwidthburst); + tt_int_op(rp1->bandwidthcapacity,OP_EQ, r1->bandwidthcapacity); + tt_int_op(crypto_pk_cmp_keys(rp1->onion_pkey, pk1), OP_EQ, 0); + tt_int_op(crypto_pk_cmp_keys(rp1->identity_pkey, pk2), OP_EQ, 0); + tt_assert(rp1->supports_tunnelled_dir_requests); + //tt_assert(rp1->exit_policy == NULL); + tor_free(buf); + + strlcpy(buf2, + "router Fred 10.3.2.1 9005 0 0\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n", sizeof(buf2)); + base64_encode(cert_buf, sizeof(cert_buf), + (const char*)r2->cache_info.signing_key_cert->encoded, + r2->cache_info.signing_key_cert->encoded_len, + BASE64_ENCODE_MULTILINE); + strlcat(buf2, cert_buf, sizeof(buf2)); + strlcat(buf2, "-----END ED25519 CERT-----\n", sizeof(buf2)); + strlcat(buf2, "master-key-ed25519 ", sizeof(buf2)); + { + char k[ED25519_BASE64_LEN+1]; + tt_int_op(ed25519_public_to_base64(k, + &r2->cache_info.signing_key_cert->signing_key), + OP_GE, 0); + strlcat(buf2, k, sizeof(buf2)); + strlcat(buf2, "\n", sizeof(buf2)); + } + strlcat(buf2, "platform Tor "VERSION" on ", sizeof(buf2)); + strlcat(buf2, get_uname(), sizeof(buf2)); + strlcat(buf2, "\n" + "published 1970-01-01 00:00:05\n" + "fingerprint ", sizeof(buf2)); + tt_assert(!crypto_pk_get_fingerprint(pk1, fingerprint, 1)); + strlcat(buf2, fingerprint, sizeof(buf2)); + strlcat(buf2, "\nuptime 0\n" + "bandwidth 3000 3000 3000\n", sizeof(buf2)); + strlcat(buf2, "onion-key\n", sizeof(buf2)); + strlcat(buf2, pk2_str, sizeof(buf2)); + strlcat(buf2, "signing-key\n", sizeof(buf2)); + strlcat(buf2, pk1_str, sizeof(buf2)); + int rsa_cc_len; + rsa_cc = make_tap_onion_key_crosscert(pk2, + &kp1.pubkey, + pk1, + &rsa_cc_len); + tt_assert(rsa_cc); + base64_encode(cert_buf, sizeof(cert_buf), (char*)rsa_cc, rsa_cc_len, + BASE64_ENCODE_MULTILINE); + strlcat(buf2, "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n", sizeof(buf2)); + strlcat(buf2, cert_buf, sizeof(buf2)); + strlcat(buf2, "-----END CROSSCERT-----\n", sizeof(buf2)); + int ntor_cc_sign; + { + tor_cert_t *ntor_cc = NULL; + ntor_cc = make_ntor_onion_key_crosscert(&r2_onion_keypair, + &kp1.pubkey, + r2->cache_info.published_on, + get_onion_key_lifetime(), + &ntor_cc_sign); + tt_assert(ntor_cc); + base64_encode(cert_buf, sizeof(cert_buf), + (char*)ntor_cc->encoded, ntor_cc->encoded_len, + BASE64_ENCODE_MULTILINE); + tor_cert_free(ntor_cc); + } + tor_snprintf(buf2+strlen(buf2), sizeof(buf2)-strlen(buf2), + "ntor-onion-key-crosscert %d\n" + "-----BEGIN ED25519 CERT-----\n" + "%s" + "-----END ED25519 CERT-----\n", ntor_cc_sign, cert_buf); + + strlcat(buf2, "hidden-service-dir\n", sizeof(buf2)); + strlcat(buf2, "ntor-onion-key ", sizeof(buf2)); + base64_encode(cert_buf, sizeof(cert_buf), + (const char*)r2_onion_keypair.pubkey.public_key, 32, + BASE64_ENCODE_MULTILINE); + strlcat(buf2, cert_buf, sizeof(buf2)); + strlcat(buf2, "accept *:80\nreject 18.0.0.0/8:24\n", sizeof(buf2)); + strlcat(buf2, "tunnelled-dir-server\n", sizeof(buf2)); + strlcat(buf2, "router-sig-ed25519 ", sizeof(buf2)); + + /* Fake just enough of an ORPort to get by */ + MOCK(get_configured_ports, mock_get_configured_ports); + mocked_configured_ports = smartlist_new(); + + memset(&orport, 0, sizeof(orport)); + orport.type = CONN_TYPE_OR_LISTENER; + orport.addr.family = AF_INET; + orport.port = 9005; + smartlist_add(mocked_configured_ports, &orport); + + buf = router_dump_router_to_string(r2, pk1, pk2, &r2_onion_keypair, &kp2); + tt_assert(buf); + buf[strlen(buf2)] = '\0'; /* Don't compare the sig; it's never the same + * twice */ + + tt_str_op(buf, OP_EQ, buf2); + tor_free(buf); + + buf = router_dump_router_to_string(r2, pk1, NULL, NULL, NULL); + + UNMOCK(get_configured_ports); + smartlist_free(mocked_configured_ports); + mocked_configured_ports = NULL; + + /* Reset for later */ + cp = buf; + rp2 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL,NULL); + tt_assert(rp2); + tt_int_op(rp2->addr,OP_EQ, r2->addr); + tt_int_op(rp2->or_port,OP_EQ, r2->or_port); + tt_int_op(rp2->dir_port,OP_EQ, r2->dir_port); + tt_int_op(rp2->bandwidthrate,OP_EQ, r2->bandwidthrate); + tt_int_op(rp2->bandwidthburst,OP_EQ, r2->bandwidthburst); + tt_int_op(rp2->bandwidthcapacity,OP_EQ, r2->bandwidthcapacity); + tt_mem_op(rp2->onion_curve25519_pkey->public_key,OP_EQ, + r2->onion_curve25519_pkey->public_key, + CURVE25519_PUBKEY_LEN); + tt_int_op(crypto_pk_cmp_keys(rp2->onion_pkey, pk2), OP_EQ, 0); + tt_int_op(crypto_pk_cmp_keys(rp2->identity_pkey, pk1), OP_EQ, 0); + tt_assert(rp2->supports_tunnelled_dir_requests); + + tt_int_op(smartlist_len(rp2->exit_policy),OP_EQ, 2); + + p = smartlist_get(rp2->exit_policy, 0); + tt_int_op(p->policy_type,OP_EQ, ADDR_POLICY_ACCEPT); + tt_assert(tor_addr_is_null(&p->addr)); + tt_int_op(p->maskbits,OP_EQ, 0); + tt_int_op(p->prt_min,OP_EQ, 80); + tt_int_op(p->prt_max,OP_EQ, 80); + + p = smartlist_get(rp2->exit_policy, 1); + tt_int_op(p->policy_type,OP_EQ, ADDR_POLICY_REJECT); + tt_assert(tor_addr_eq(&p->addr, &ex2->addr)); + tt_int_op(p->maskbits,OP_EQ, 8); + tt_int_op(p->prt_min,OP_EQ, 24); + tt_int_op(p->prt_max,OP_EQ, 24); + +#if 0 + /* Okay, now for the directories. */ + { + fingerprint_list = smartlist_new(); + crypto_pk_get_fingerprint(pk2, buf, 1); + add_fingerprint_to_dir(buf, fingerprint_list, 0); + crypto_pk_get_fingerprint(pk1, buf, 1); + add_fingerprint_to_dir(buf, fingerprint_list, 0); + } + +#endif /* 0 */ + dirserv_free_fingerprint_list(); + + done: + if (r1) + routerinfo_free(r1); + if (r2) + routerinfo_free(r2); + if (rp2) + routerinfo_free(rp2); + + tor_free(rsa_cc); + tor_free(buf); + tor_free(pk1_str); + tor_free(pk2_str); + if (pk1) crypto_pk_free(pk1); + if (pk2) crypto_pk_free(pk2); + if (rp1) routerinfo_free(rp1); + tor_free(dir1); /* XXXX And more !*/ + tor_free(dir2); /* And more !*/ +} + +#include "failing_routerdescs.inc" + +static void +test_dir_routerinfo_parsing(void *arg) +{ + (void) arg; + + int again; + routerinfo_t *ri = NULL; + +#define CHECK_OK(s) \ + do { \ + routerinfo_free(ri); \ + ri = router_parse_entry_from_string((s), NULL, 0, 0, NULL, NULL); \ + tt_assert(ri); \ + } while (0) +#define CHECK_FAIL(s, againval) \ + do { \ + routerinfo_free(ri); \ + again = 999; \ + ri = router_parse_entry_from_string((s), NULL, 0, 0, NULL, &again); \ + tt_assert(ri == NULL); \ + tt_int_op(again, OP_EQ, (againval)); \ + } while (0) + + CHECK_OK(EX_RI_MINIMAL); + CHECK_OK(EX_RI_MAXIMAL); + + CHECK_OK(EX_RI_MINIMAL_ED); + + /* good annotations prepended */ + routerinfo_free(ri); + ri = router_parse_entry_from_string(EX_RI_MINIMAL, NULL, 0, 0, + "@purpose bridge\n", NULL); + tt_ptr_op(ri, OP_NE, NULL); + tt_assert(ri->purpose == ROUTER_PURPOSE_BRIDGE); + routerinfo_free(ri); + + /* bad annotations prepended. */ + ri = router_parse_entry_from_string(EX_RI_MINIMAL, + NULL, 0, 0, "@purpose\n", NULL); + tt_ptr_op(ri, OP_EQ, NULL); + + /* bad annotations on router. */ + ri = router_parse_entry_from_string("@purpose\nrouter x\n", NULL, 0, 1, + NULL, NULL); + tt_ptr_op(ri, OP_EQ, NULL); + + /* unwanted annotations on router. */ + ri = router_parse_entry_from_string("@purpose foo\nrouter x\n", NULL, 0, 0, + NULL, NULL); + tt_ptr_op(ri, OP_EQ, NULL); + + /* No signature. */ + ri = router_parse_entry_from_string("router x\n", NULL, 0, 0, + NULL, NULL); + tt_ptr_op(ri, OP_EQ, NULL); + + /* Not a router */ + routerinfo_free(ri); + ri = router_parse_entry_from_string("hello\n", NULL, 0, 0, NULL, NULL); + tt_ptr_op(ri, OP_EQ, NULL); + + CHECK_FAIL(EX_RI_BAD_SIG1, 1); + CHECK_FAIL(EX_RI_BAD_SIG2, 1); + CHECK_FAIL(EX_RI_BAD_TOKENS, 0); + CHECK_FAIL(EX_RI_BAD_PUBLISHED, 0); + CHECK_FAIL(EX_RI_NEG_BANDWIDTH, 0); + CHECK_FAIL(EX_RI_BAD_BANDWIDTH, 0); + CHECK_FAIL(EX_RI_BAD_BANDWIDTH2, 0); + CHECK_FAIL(EX_RI_BAD_ONIONKEY1, 0); + CHECK_FAIL(EX_RI_BAD_ONIONKEY2, 0); + CHECK_FAIL(EX_RI_BAD_PORTS, 0); + CHECK_FAIL(EX_RI_BAD_IP, 0); + CHECK_FAIL(EX_RI_BAD_DIRPORT, 0); + CHECK_FAIL(EX_RI_BAD_NAME2, 0); + CHECK_FAIL(EX_RI_BAD_UPTIME, 0); + + CHECK_FAIL(EX_RI_BAD_BANDWIDTH3, 0); + CHECK_FAIL(EX_RI_BAD_NTOR_KEY, 0); + CHECK_FAIL(EX_RI_BAD_FINGERPRINT, 0); + CHECK_FAIL(EX_RI_MISMATCHED_FINGERPRINT, 0); + CHECK_FAIL(EX_RI_BAD_HAS_ACCEPT6, 0); + CHECK_FAIL(EX_RI_BAD_NO_EXIT_POLICY, 0); + CHECK_FAIL(EX_RI_BAD_IPV6_EXIT_POLICY, 0); + CHECK_FAIL(EX_RI_BAD_FAMILY, 0); + CHECK_FAIL(EX_RI_ZERO_ORPORT, 0); + + CHECK_FAIL(EX_RI_ED_MISSING_CROSSCERT, 0); + CHECK_FAIL(EX_RI_ED_MISSING_CROSSCERT2, 0); + CHECK_FAIL(EX_RI_ED_MISSING_CROSSCERT_SIGN, 0); + CHECK_FAIL(EX_RI_ED_BAD_SIG1, 0); + CHECK_FAIL(EX_RI_ED_BAD_SIG2, 0); + CHECK_FAIL(EX_RI_ED_BAD_SIG3, 0); + CHECK_FAIL(EX_RI_ED_BAD_SIG4, 0); + CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT1, 0); + CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT3, 0); + CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT4, 0); + CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT5, 0); + CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT6, 0); + CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT7, 0); + CHECK_FAIL(EX_RI_ED_MISPLACED1, 0); + CHECK_FAIL(EX_RI_ED_MISPLACED2, 0); + CHECK_FAIL(EX_RI_ED_BAD_CERT1, 0); + CHECK_FAIL(EX_RI_ED_BAD_CERT2, 0); + CHECK_FAIL(EX_RI_ED_BAD_CERT3, 0); + + /* This is allowed; we just ignore it. */ + CHECK_OK(EX_RI_BAD_EI_DIGEST); + CHECK_OK(EX_RI_BAD_EI_DIGEST2); + +#undef CHECK_FAIL +#undef CHECK_OK + done: + routerinfo_free(ri); +} + +#include "example_extrainfo.inc" + +static void +routerinfo_free_wrapper_(void *arg) +{ + routerinfo_free_(arg); +} + +static void +test_dir_extrainfo_parsing(void *arg) +{ + (void) arg; + +#define CHECK_OK(s) \ + do { \ + extrainfo_free(ei); \ + ei = extrainfo_parse_entry_from_string((s), NULL, 0, map, NULL); \ + tt_assert(ei); \ + } while (0) +#define CHECK_FAIL(s, againval) \ + do { \ + extrainfo_free(ei); \ + again = 999; \ + ei = extrainfo_parse_entry_from_string((s), NULL, 0, map, &again); \ + tt_assert(ei == NULL); \ + tt_int_op(again, OP_EQ, (againval)); \ + } while (0) +#define ADD(name) \ + do { \ + ri = tor_malloc_zero(sizeof(routerinfo_t)); \ + crypto_pk_t *pk = ri->identity_pkey = crypto_pk_new(); \ + tt_assert(! crypto_pk_read_public_key_from_string(pk, \ + name##_KEY, strlen(name##_KEY))); \ + tt_int_op(20,OP_EQ,base16_decode(d, 20, name##_FP, strlen(name##_FP))); \ + digestmap_set((digestmap_t*)map, d, ri); \ + ri = NULL; \ + } while (0) + + routerinfo_t *ri = NULL; + char d[20]; + struct digest_ri_map_t *map = NULL; + extrainfo_t *ei = NULL; + int again; + + CHECK_OK(EX_EI_MINIMAL); + tt_assert(ei->pending_sig); + CHECK_OK(EX_EI_MAXIMAL); + tt_assert(ei->pending_sig); + CHECK_OK(EX_EI_GOOD_ED_EI); + tt_assert(ei->pending_sig); + + map = (struct digest_ri_map_t *)digestmap_new(); + ADD(EX_EI_MINIMAL); + ADD(EX_EI_MAXIMAL); + ADD(EX_EI_GOOD_ED_EI); + ADD(EX_EI_BAD_FP); + ADD(EX_EI_BAD_NICKNAME); + ADD(EX_EI_BAD_TOKENS); + ADD(EX_EI_BAD_START); + ADD(EX_EI_BAD_PUBLISHED); + + ADD(EX_EI_ED_MISSING_SIG); + ADD(EX_EI_ED_MISSING_CERT); + ADD(EX_EI_ED_BAD_CERT1); + ADD(EX_EI_ED_BAD_CERT2); + ADD(EX_EI_ED_BAD_SIG1); + ADD(EX_EI_ED_BAD_SIG2); + ADD(EX_EI_ED_MISPLACED_CERT); + ADD(EX_EI_ED_MISPLACED_SIG); + + CHECK_OK(EX_EI_MINIMAL); + tt_ptr_op(ei->pending_sig, OP_EQ, NULL); + CHECK_OK(EX_EI_MAXIMAL); + tt_ptr_op(ei->pending_sig, OP_EQ, NULL); + CHECK_OK(EX_EI_GOOD_ED_EI); + tt_ptr_op(ei->pending_sig, OP_EQ, NULL); + + CHECK_FAIL(EX_EI_BAD_SIG1,1); + CHECK_FAIL(EX_EI_BAD_SIG2,1); + CHECK_FAIL(EX_EI_BAD_SIG3,1); + CHECK_FAIL(EX_EI_BAD_FP,0); + CHECK_FAIL(EX_EI_BAD_NICKNAME,0); + CHECK_FAIL(EX_EI_BAD_TOKENS,0); + CHECK_FAIL(EX_EI_BAD_START,0); + CHECK_FAIL(EX_EI_BAD_PUBLISHED,0); + + CHECK_FAIL(EX_EI_ED_MISSING_SIG,0); + CHECK_FAIL(EX_EI_ED_MISSING_CERT,0); + CHECK_FAIL(EX_EI_ED_BAD_CERT1,0); + CHECK_FAIL(EX_EI_ED_BAD_CERT2,0); + CHECK_FAIL(EX_EI_ED_BAD_SIG1,0); + CHECK_FAIL(EX_EI_ED_BAD_SIG2,0); + CHECK_FAIL(EX_EI_ED_MISPLACED_CERT,0); + CHECK_FAIL(EX_EI_ED_MISPLACED_SIG,0); + +#undef CHECK_OK +#undef CHECK_FAIL + + done: + escaped(NULL); + extrainfo_free(ei); + routerinfo_free(ri); + digestmap_free_((digestmap_t*)map, routerinfo_free_wrapper_); +} + +static void +test_dir_parse_router_list(void *arg) +{ + (void) arg; + smartlist_t *invalid = smartlist_new(); + smartlist_t *dest = smartlist_new(); + smartlist_t *chunks = smartlist_new(); + int dest_has_ri = 1; + char *list = NULL; + const char *cp; + digestmap_t *map = NULL; + char *mem_op_hex_tmp = NULL; + routerinfo_t *ri = NULL; + char d[DIGEST_LEN]; + + smartlist_add_strdup(chunks, EX_RI_MINIMAL); // ri 0 + smartlist_add_strdup(chunks, EX_RI_BAD_PORTS); // bad ri 0 + smartlist_add_strdup(chunks, EX_EI_MAXIMAL); // ei 0 + smartlist_add_strdup(chunks, EX_EI_BAD_SIG2); // bad ei -- + smartlist_add_strdup(chunks, EX_EI_BAD_NICKNAME);// bad ei 0 + smartlist_add_strdup(chunks, EX_RI_BAD_SIG1); // bad ri -- + smartlist_add_strdup(chunks, EX_EI_BAD_PUBLISHED); // bad ei 1 + smartlist_add_strdup(chunks, EX_RI_MAXIMAL); // ri 1 + smartlist_add_strdup(chunks, EX_RI_BAD_FAMILY); // bad ri 1 + smartlist_add_strdup(chunks, EX_EI_MINIMAL); // ei 1 + + list = smartlist_join_strings(chunks, "", 0, NULL); + + /* First, parse the routers. */ + cp = list; + tt_int_op(0,OP_EQ, + router_parse_list_from_string(&cp, NULL, dest, SAVED_NOWHERE, + 0, 0, NULL, invalid)); + tt_int_op(2, OP_EQ, smartlist_len(dest)); + tt_ptr_op(cp, OP_EQ, list + strlen(list)); + + routerinfo_t *r = smartlist_get(dest, 0); + tt_mem_op(r->cache_info.signed_descriptor_body, OP_EQ, + EX_RI_MINIMAL, strlen(EX_RI_MINIMAL)); + r = smartlist_get(dest, 1); + tt_mem_op(r->cache_info.signed_descriptor_body, OP_EQ, + EX_RI_MAXIMAL, strlen(EX_RI_MAXIMAL)); + + tt_int_op(2, OP_EQ, smartlist_len(invalid)); + test_memeq_hex(smartlist_get(invalid, 0), + "ab9eeaa95e7d45740185b4e519c76ead756277a9"); + test_memeq_hex(smartlist_get(invalid, 1), + "9a651ee03b64325959e8f1b46f2b689b30750b4c"); + + /* Now tidy up */ + SMARTLIST_FOREACH(dest, routerinfo_t *, rinfo, routerinfo_free(rinfo)); + SMARTLIST_FOREACH(invalid, uint8_t *, dig, tor_free(dig)); + smartlist_clear(dest); + smartlist_clear(invalid); + + /* And check extrainfos. */ + dest_has_ri = 0; + map = (digestmap_t*)router_get_routerlist()->identity_map; + ADD(EX_EI_MINIMAL); + ADD(EX_EI_MAXIMAL); + ADD(EX_EI_BAD_NICKNAME); + ADD(EX_EI_BAD_PUBLISHED); + cp = list; + tt_int_op(0,OP_EQ, + router_parse_list_from_string(&cp, NULL, dest, SAVED_NOWHERE, + 1, 0, NULL, invalid)); + tt_int_op(2, OP_EQ, smartlist_len(dest)); + extrainfo_t *e = smartlist_get(dest, 0); + tt_mem_op(e->cache_info.signed_descriptor_body, OP_EQ, + EX_EI_MAXIMAL, strlen(EX_EI_MAXIMAL)); + e = smartlist_get(dest, 1); + tt_mem_op(e->cache_info.signed_descriptor_body, OP_EQ, + EX_EI_MINIMAL, strlen(EX_EI_MINIMAL)); + + tt_int_op(2, OP_EQ, smartlist_len(invalid)); + test_memeq_hex(smartlist_get(invalid, 0), + "d5df4aa62ee9ffc9543d41150c9864908e0390af"); + test_memeq_hex(smartlist_get(invalid, 1), + "f61efd2a7f4531f3687a9043e0de90a862ec64ba"); + + done: + tor_free(list); + if (dest_has_ri) + SMARTLIST_FOREACH(dest, routerinfo_t *, rt, routerinfo_free(rt)); + else + SMARTLIST_FOREACH(dest, extrainfo_t *, ei, extrainfo_free(ei)); + smartlist_free(dest); + SMARTLIST_FOREACH(invalid, uint8_t *, dig, tor_free(dig)); + smartlist_free(invalid); + SMARTLIST_FOREACH(chunks, char *, chunk, tor_free(chunk)); + smartlist_free(chunks); + routerinfo_free(ri); + if (map) { + digestmap_free_((digestmap_t*)map, routerinfo_free_wrapper_); + router_get_routerlist()->identity_map = + (struct digest_ri_map_t*)digestmap_new(); + } + tor_free(mem_op_hex_tmp); + +#undef ADD +} + +static download_status_t dls_minimal; +static download_status_t dls_maximal; +static download_status_t dls_bad_fingerprint; +static download_status_t dls_bad_sig2; +static download_status_t dls_bad_ports; +static download_status_t dls_bad_tokens; + +static int mock_router_get_dl_status_unrecognized = 0; +static int mock_router_get_dl_status_calls = 0; + +static download_status_t * +mock_router_get_dl_status(const char *d) +{ + ++mock_router_get_dl_status_calls; + char hex[HEX_DIGEST_LEN+1]; + base16_encode(hex, sizeof(hex), d, DIGEST_LEN); + if (!strcmp(hex, "3E31D19A69EB719C00B02EC60D13356E3F7A3452")) { + return &dls_minimal; + } else if (!strcmp(hex, "581D8A368A0FA854ECDBFAB841D88B3F1B004038")) { + return &dls_maximal; + } else if (!strcmp(hex, "2578AE227C6116CDE29B3F0E95709B9872DEE5F1")) { + return &dls_bad_fingerprint; + } else if (!strcmp(hex, "16D387D3A58F7DB3CF46638F8D0B90C45C7D769C")) { + return &dls_bad_sig2; + } else if (!strcmp(hex, "AB9EEAA95E7D45740185B4E519C76EAD756277A9")) { + return &dls_bad_ports; + } else if (!strcmp(hex, "A0CC2CEFAD59DBF19F468BFEE60E0868C804B422")) { + return &dls_bad_tokens; + } else { + ++mock_router_get_dl_status_unrecognized; + return NULL; + } +} + +static void +test_dir_load_routers(void *arg) +{ + (void) arg; + smartlist_t *chunks = smartlist_new(); + smartlist_t *wanted = smartlist_new(); + char buf[DIGEST_LEN]; + char *mem_op_hex_tmp = NULL; + char *list = NULL; + +#define ADD(str) \ + do { \ + tt_int_op(0,OP_EQ,router_get_router_hash(str, strlen(str), buf)); \ + smartlist_add_strdup(wanted, hex_str(buf, DIGEST_LEN)); \ + } while (0) + + MOCK(router_get_dl_status_by_descriptor_digest, mock_router_get_dl_status); + + update_approx_time(1412510400); + + smartlist_add_strdup(chunks, EX_RI_MINIMAL); + smartlist_add_strdup(chunks, EX_RI_BAD_FINGERPRINT); + smartlist_add_strdup(chunks, EX_RI_BAD_SIG2); + smartlist_add_strdup(chunks, EX_RI_MAXIMAL); + smartlist_add_strdup(chunks, EX_RI_BAD_PORTS); + smartlist_add_strdup(chunks, EX_RI_BAD_TOKENS); + + /* not ADDing MINIMIAL */ + ADD(EX_RI_MAXIMAL); + ADD(EX_RI_BAD_FINGERPRINT); + ADD(EX_RI_BAD_SIG2); + /* Not ADDing BAD_PORTS */ + ADD(EX_RI_BAD_TOKENS); + + list = smartlist_join_strings(chunks, "", 0, NULL); + tt_int_op(1, OP_EQ, + router_load_routers_from_string(list, NULL, SAVED_IN_JOURNAL, + wanted, 1, NULL)); + + /* The "maximal" router was added. */ + /* "minimal" was not. */ + tt_int_op(smartlist_len(router_get_routerlist()->routers),OP_EQ,1); + routerinfo_t *r = smartlist_get(router_get_routerlist()->routers, 0); + test_memeq_hex(r->cache_info.signed_descriptor_digest, + "581D8A368A0FA854ECDBFAB841D88B3F1B004038"); + tt_int_op(dls_minimal.n_download_failures, OP_EQ, 0); + tt_int_op(dls_maximal.n_download_failures, OP_EQ, 0); + + /* "Bad fingerprint" and "Bad tokens" should have gotten marked + * non-retriable. */ + tt_want_int_op(mock_router_get_dl_status_calls, OP_EQ, 2); + tt_want_int_op(mock_router_get_dl_status_unrecognized, OP_EQ, 0); + tt_int_op(dls_bad_fingerprint.n_download_failures, OP_EQ, 255); + tt_int_op(dls_bad_tokens.n_download_failures, OP_EQ, 255); + + /* bad_sig2 and bad ports" are retriable -- one since only the signature + * was bad, and one because we didn't ask for it. */ + tt_int_op(dls_bad_sig2.n_download_failures, OP_EQ, 0); + tt_int_op(dls_bad_ports.n_download_failures, OP_EQ, 0); + + /* Wanted still contains "BAD_SIG2" */ + tt_int_op(smartlist_len(wanted), OP_EQ, 1); + tt_str_op(smartlist_get(wanted, 0), OP_EQ, + "E0A3753CEFD54128EAB239F294954121DB23D2EF"); + +#undef ADD + + done: + tor_free(mem_op_hex_tmp); + UNMOCK(router_get_dl_status_by_descriptor_digest); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_free(chunks); + SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); + smartlist_free(wanted); + tor_free(list); +} + +static int mock_get_by_ei_dd_calls = 0; +static int mock_get_by_ei_dd_unrecognized = 0; + +static signed_descriptor_t sd_ei_minimal; +static signed_descriptor_t sd_ei_bad_nickname; +static signed_descriptor_t sd_ei_maximal; +static signed_descriptor_t sd_ei_bad_tokens; +static signed_descriptor_t sd_ei_bad_sig2; + +static signed_descriptor_t * +mock_get_by_ei_desc_digest(const char *d) +{ + + ++mock_get_by_ei_dd_calls; + char hex[HEX_DIGEST_LEN+1]; + base16_encode(hex, sizeof(hex), d, DIGEST_LEN); + + if (!strcmp(hex, "11E0EDF526950739F7769810FCACAB8C882FAEEE")) { + return &sd_ei_minimal; + } else if (!strcmp(hex, "47803B02A0E70E9E8BDA226CB1D74DE354D67DFF")) { + return &sd_ei_maximal; + } else if (!strcmp(hex, "D5DF4AA62EE9FFC9543D41150C9864908E0390AF")) { + return &sd_ei_bad_nickname; + } else if (!strcmp(hex, "16D387D3A58F7DB3CF46638F8D0B90C45C7D769C")) { + return &sd_ei_bad_sig2; + } else if (!strcmp(hex, "9D90F8C42955BBC57D54FB05E54A3F083AF42E8B")) { + return &sd_ei_bad_tokens; + } else { + ++mock_get_by_ei_dd_unrecognized; + return NULL; + } +} + +static signed_descriptor_t * +mock_ei_get_by_ei_digest(const char *d) +{ + char hex[HEX_DIGEST_LEN+1]; + base16_encode(hex, sizeof(hex), d, DIGEST_LEN); + signed_descriptor_t *sd = &sd_ei_minimal; + + if (!strcmp(hex, "11E0EDF526950739F7769810FCACAB8C882FAEEE")) { + sd->signed_descriptor_body = (char *)EX_EI_MINIMAL; + sd->signed_descriptor_len = sizeof(EX_EI_MINIMAL); + sd->annotations_len = 0; + sd->saved_location = SAVED_NOWHERE; + return sd; + } + return NULL; +} + +static smartlist_t *mock_ei_insert_list = NULL; +static was_router_added_t +mock_ei_insert(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible) +{ + (void) rl; + (void) warn_if_incompatible; + smartlist_add(mock_ei_insert_list, ei); + return ROUTER_ADDED_SUCCESSFULLY; +} + +static void +test_dir_load_extrainfo(void *arg) +{ + (void) arg; + smartlist_t *chunks = smartlist_new(); + smartlist_t *wanted = smartlist_new(); + char buf[DIGEST_LEN]; + char *mem_op_hex_tmp = NULL; + char *list = NULL; + +#define ADD(str) \ + do { \ + tt_int_op(0,OP_EQ,router_get_extrainfo_hash(str, strlen(str), buf)); \ + smartlist_add_strdup(wanted, hex_str(buf, DIGEST_LEN)); \ + } while (0) + + mock_ei_insert_list = smartlist_new(); + MOCK(router_get_by_extrainfo_digest, mock_get_by_ei_desc_digest); + MOCK(extrainfo_insert, mock_ei_insert); + + smartlist_add_strdup(chunks, EX_EI_MINIMAL); + smartlist_add_strdup(chunks, EX_EI_BAD_NICKNAME); + smartlist_add_strdup(chunks, EX_EI_MAXIMAL); + smartlist_add_strdup(chunks, EX_EI_BAD_PUBLISHED); + smartlist_add_strdup(chunks, EX_EI_BAD_TOKENS); + + /* not ADDing MINIMIAL */ + ADD(EX_EI_MAXIMAL); + ADD(EX_EI_BAD_NICKNAME); + /* Not ADDing BAD_PUBLISHED */ + ADD(EX_EI_BAD_TOKENS); + ADD(EX_EI_BAD_SIG2); + + list = smartlist_join_strings(chunks, "", 0, NULL); + router_load_extrainfo_from_string(list, NULL, SAVED_IN_JOURNAL, wanted, 1); + + /* The "maximal" router was added. */ + /* "minimal" was also added, even though we didn't ask for it, since + * that's what we do with extrainfos. */ + tt_int_op(smartlist_len(mock_ei_insert_list),OP_EQ,2); + + extrainfo_t *e = smartlist_get(mock_ei_insert_list, 0); + test_memeq_hex(e->cache_info.signed_descriptor_digest, + "11E0EDF526950739F7769810FCACAB8C882FAEEE"); + + e = smartlist_get(mock_ei_insert_list, 1); + test_memeq_hex(e->cache_info.signed_descriptor_digest, + "47803B02A0E70E9E8BDA226CB1D74DE354D67DFF"); + tt_int_op(dls_minimal.n_download_failures, OP_EQ, 0); + tt_int_op(dls_maximal.n_download_failures, OP_EQ, 0); + + /* "Bad nickname" and "Bad tokens" should have gotten marked + * non-retriable. */ + tt_want_int_op(mock_get_by_ei_dd_calls, OP_EQ, 2); + tt_want_int_op(mock_get_by_ei_dd_unrecognized, OP_EQ, 0); + tt_int_op(sd_ei_bad_nickname.ei_dl_status.n_download_failures, OP_EQ, 255); + tt_int_op(sd_ei_bad_tokens.ei_dl_status.n_download_failures, OP_EQ, 255); + + /* bad_ports is retriable -- because we didn't ask for it. */ + tt_int_op(dls_bad_ports.n_download_failures, OP_EQ, 0); + + /* Wanted still contains "BAD_SIG2" */ + tt_int_op(smartlist_len(wanted), OP_EQ, 1); + tt_str_op(smartlist_get(wanted, 0), OP_EQ, + "16D387D3A58F7DB3CF46638F8D0B90C45C7D769C"); + +#undef ADD + + done: + tor_free(mem_op_hex_tmp); + UNMOCK(router_get_by_extrainfo_digest); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_free(chunks); + SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); + smartlist_free(wanted); + tor_free(list); +} + +static void +test_dir_getinfo_extra(void *arg) +{ + int r; + char *answer = NULL; + const char *errmsg = NULL; + + (void)arg; + MOCK(extrainfo_get_by_descriptor_digest, mock_ei_get_by_ei_digest); + r = getinfo_helper_dir(NULL, "extra-info/digest/" + "11E0EDF526950739F7769810FCACAB8C882FAEEE", &answer, + &errmsg); + tt_int_op(0, OP_EQ, r); + tt_ptr_op(NULL, OP_EQ, errmsg); + tt_str_op(answer, OP_EQ, EX_EI_MINIMAL); + tor_free(answer); + + answer = NULL; + r = getinfo_helper_dir(NULL, "extra-info/digest/" + "NOTAVALIDHEXSTRINGNOTAVALIDHEXSTRINGNOTA", &answer, + &errmsg); + tt_int_op(0, OP_EQ, r); + /* getinfo_helper_dir() should maybe return an error here but doesn't */ + tt_ptr_op(NULL, OP_EQ, errmsg); + /* In any case, there should be no answer for an invalid hex string. */ + tt_ptr_op(NULL, OP_EQ, answer); + + done: + UNMOCK(extrainfo_get_by_descriptor_digest); +} + +static void +test_dir_versions(void *arg) +{ + tor_version_t ver1; + + /* Try out version parsing functionality */ + (void)arg; + tt_int_op(0,OP_EQ, tor_version_parse("0.3.4pre2-cvs", &ver1)); + tt_int_op(0,OP_EQ, ver1.major); + tt_int_op(3,OP_EQ, ver1.minor); + tt_int_op(4,OP_EQ, ver1.micro); + tt_int_op(VER_PRE,OP_EQ, ver1.status); + tt_int_op(2,OP_EQ, ver1.patchlevel); + tt_int_op(0,OP_EQ, tor_version_parse("0.3.4rc1", &ver1)); + tt_int_op(0,OP_EQ, ver1.major); + tt_int_op(3,OP_EQ, ver1.minor); + tt_int_op(4,OP_EQ, ver1.micro); + tt_int_op(VER_RC,OP_EQ, ver1.status); + tt_int_op(1,OP_EQ, ver1.patchlevel); + tt_int_op(0,OP_EQ, tor_version_parse("1.3.4", &ver1)); + tt_int_op(1,OP_EQ, ver1.major); + tt_int_op(3,OP_EQ, ver1.minor); + tt_int_op(4,OP_EQ, ver1.micro); + tt_int_op(VER_RELEASE,OP_EQ, ver1.status); + tt_int_op(0,OP_EQ, ver1.patchlevel); + tt_int_op(0,OP_EQ, tor_version_parse("1.3.4.999", &ver1)); + tt_int_op(1,OP_EQ, ver1.major); + tt_int_op(3,OP_EQ, ver1.minor); + tt_int_op(4,OP_EQ, ver1.micro); + tt_int_op(VER_RELEASE,OP_EQ, ver1.status); + tt_int_op(999,OP_EQ, ver1.patchlevel); + tt_int_op(0,OP_EQ, tor_version_parse("0.1.2.4-alpha", &ver1)); + tt_int_op(0,OP_EQ, ver1.major); + tt_int_op(1,OP_EQ, ver1.minor); + tt_int_op(2,OP_EQ, ver1.micro); + tt_int_op(4,OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE,OP_EQ, ver1.status); + tt_str_op("alpha",OP_EQ, ver1.status_tag); + tt_int_op(0,OP_EQ, tor_version_parse("0.1.2.4", &ver1)); + tt_int_op(0,OP_EQ, ver1.major); + tt_int_op(1,OP_EQ, ver1.minor); + tt_int_op(2,OP_EQ, ver1.micro); + tt_int_op(4,OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE,OP_EQ, ver1.status); + tt_str_op("",OP_EQ, ver1.status_tag); + + tt_int_op(0, OP_EQ, tor_version_parse("10.1", &ver1)); + tt_int_op(10, OP_EQ, ver1.major); + tt_int_op(1, OP_EQ, ver1.minor); + tt_int_op(0, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("5.99.999", &ver1)); + tt_int_op(5, OP_EQ, ver1.major); + tt_int_op(99, OP_EQ, ver1.minor); + tt_int_op(999, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("10.1-alpha", &ver1)); + tt_int_op(10, OP_EQ, ver1.major); + tt_int_op(1, OP_EQ, ver1.minor); + tt_int_op(0, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("alpha", OP_EQ, ver1.status_tag); + /* Go through the full set of status tags */ + tt_int_op(0, OP_EQ, tor_version_parse("2.1.700-alpha", &ver1)); + tt_int_op(2, OP_EQ, ver1.major); + tt_int_op(1, OP_EQ, ver1.minor); + tt_int_op(700, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("alpha", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("1.6.8-alpha-dev", &ver1)); + tt_int_op(1, OP_EQ, ver1.major); + tt_int_op(6, OP_EQ, ver1.minor); + tt_int_op(8, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("alpha-dev", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.5-rc", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(5, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("rc", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.6-rc-dev", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(6, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("rc-dev", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.8", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(8, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.9-dev", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(9, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("dev", OP_EQ, ver1.status_tag); + /* In #21450, we fixed an inconsistency in parsing versions > INT32_MAX + * between i386 and x86_64, as we used tor_parse_long, and then cast to int + */ + tt_int_op(0, OP_EQ, tor_version_parse("0.2147483647.0", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2147483647, OP_EQ, ver1.minor); + tt_int_op(0, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("", OP_EQ, ver1.status_tag); + tt_int_op(-1, OP_EQ, tor_version_parse("0.2147483648.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.4294967295.0", &ver1)); + /* In #21278, we reject negative version components */ + tt_int_op(-1, OP_EQ, tor_version_parse("0.-1.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.-2147483648.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.-4294967295.0", &ver1)); + /* In #21507, we reject version components with non-numeric prefixes */ + tt_int_op(-1, OP_EQ, tor_version_parse("0.-0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("+1.0.0", &ver1)); + /* use the list in isspace() */ + tt_int_op(-1, OP_EQ, tor_version_parse("0.\t0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\n0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\v0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\f0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\r0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0. 0.0", &ver1)); + +#define tt_versionstatus_op(vs1, op, vs2) \ + tt_assert_test_type(vs1,vs2,#vs1" "#op" "#vs2,version_status_t, \ + (val1_ op val2_),"%d",TT_EXIT_TEST_FUNCTION) +#define test_v_i_o(val, ver, lst) \ + tt_versionstatus_op(val, OP_EQ, tor_version_is_obsolete(ver, lst)) + + /* make sure tor_version_is_obsolete() works */ + test_v_i_o(VS_OLD, "0.0.1", "Tor 0.0.2"); + test_v_i_o(VS_OLD, "0.0.1", "0.0.2, Tor 0.0.3"); + test_v_i_o(VS_OLD, "0.0.1", "0.0.2,Tor 0.0.3"); + test_v_i_o(VS_OLD, "0.0.1","0.0.3,BetterTor 0.0.1"); + test_v_i_o(VS_RECOMMENDED, "0.0.2", "Tor 0.0.2,Tor 0.0.3"); + test_v_i_o(VS_NEW_IN_SERIES, "0.0.2", "Tor 0.0.2pre1,Tor 0.0.3"); + test_v_i_o(VS_OLD, "0.0.2", "Tor 0.0.2.1,Tor 0.0.3"); + test_v_i_o(VS_NEW, "0.1.0", "Tor 0.0.2,Tor 0.0.3"); + test_v_i_o(VS_RECOMMENDED, "0.0.7rc2", "0.0.7,Tor 0.0.7rc2,Tor 0.0.8"); + test_v_i_o(VS_OLD, "0.0.5.0", "0.0.5.1-cvs"); + test_v_i_o(VS_NEW_IN_SERIES, "0.0.5.1-cvs", "0.0.5, 0.0.6"); + test_v_i_o(VS_NEW, "0.2.9.9-dev", "0.2.9.9"); + /* Not on list, but newer than any in same series. */ + test_v_i_o(VS_NEW_IN_SERIES, "0.1.0.3", + "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); + /* Series newer than any on list. */ + test_v_i_o(VS_NEW, "0.1.2.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); + /* Series older than any on list. */ + test_v_i_o(VS_OLD, "0.0.1.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); + /* Not on list, not newer than any on same series. */ + test_v_i_o(VS_UNRECOMMENDED, "0.1.0.1", + "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); + /* On list, not newer than any on same series. */ + test_v_i_o(VS_UNRECOMMENDED, + "0.1.0.1", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); + tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.0.8 on Darwin 64-121-192-100.c3-0." + "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", + "0.0.8rc2")); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.0.8 on Darwin 64-121-192-100.c3-0." + "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", "0.0.8.2")); + + /* Now try svn revisions. */ + tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", + "Tor 0.2.1.0-dev (r99)")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.1.0-dev (r100) on Banana Jr", + "Tor 0.2.1.0-dev (r99) on Hal 9000")); + tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", + "Tor 0.2.1.0-dev on Colossus")); + tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r99)", + "Tor 0.2.1.0-dev (r100)")); + tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r99) on MCP", + "Tor 0.2.1.0-dev (r100) on AM")); + tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev", + "Tor 0.2.1.0-dev (r99)")); + tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.1", + "Tor 0.2.1.0-dev (r99)")); + /* And git revisions */ + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-56788a2489127072)", + "Tor 0.2.9.9 (git-56788a2489127072)")); + /* a git revision is newer than no git revision */ + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-56788a2489127072)", + "Tor 0.2.9.9")); + /* a longer git revision is newer than a shorter git revision + * this should be true if they prefix-match, but if they don't, they are + * incomparable, because hashes aren't ordered (but we compare their bytes + * anyway) */ + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-56788a2489127072d513cf4baf35a8ff475f3c7b)", + "Tor 0.2.9.9 (git-56788a2489127072)")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-0102)", + "Tor 0.2.9.9 (git-03)")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-0102)", + "Tor 0.2.9.9 (git-00)")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-01)", + "Tor 0.2.9.9 (git-00)")); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-00)", + "Tor 0.2.9.9 (git-01)")); + /* In #21278, we comapre without integer overflows. + * But since #21450 limits version components to [0, INT32_MAX], it is no + * longer possible to cause an integer overflow in tor_version_compare() */ + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.0.0.0", + "Tor 2147483647.0.0.0")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 2147483647.0.0.0", + "Tor 0.0.0.0")); + /* These versions used to cause an overflow, now they don't parse + * (and authorities reject their descriptors), and log a BUG message */ + setup_full_capture_of_logs(LOG_WARN); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.0.0.0", + "Tor 0.-2147483648.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.2147483647.0.0", + "Tor 0.-1.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.2147483647.0.0", + "Tor 0.-2147483648.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 4294967295.0.0.0", + "Tor 0.0.0.0")); + expect_no_log_entry(); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.4294967295.0.0", + "Tor 0.-4294967295.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + teardown_capture_of_logs(); + + /* Now try git revisions */ + tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00ff)", &ver1)); + tt_int_op(0,OP_EQ, ver1.major); + tt_int_op(5,OP_EQ, ver1.minor); + tt_int_op(6,OP_EQ, ver1.micro); + tt_int_op(7,OP_EQ, ver1.patchlevel); + tt_int_op(3,OP_EQ, ver1.git_tag_len); + tt_mem_op(ver1.git_tag,OP_EQ, "\xff\x00\xff", 3); + /* reject bad hex digits */ + tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00xx)", &ver1)); + /* reject odd hex digit count */ + tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00fff)", &ver1)); + /* ignore "git " */ + tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git ff00fff)", &ver1)); + /* standard length is 16 hex digits */ + tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git-0010203040506070)", + &ver1)); + /* length limit is 40 hex digits */ + tt_int_op(0,OP_EQ, tor_version_parse( + "0.5.6.7 (git-000102030405060708090a0b0c0d0e0f10111213)", + &ver1)); + tt_int_op(-1,OP_EQ, tor_version_parse( + "0.5.6.7 (git-000102030405060708090a0b0c0d0e0f1011121314)", + &ver1)); + done: + teardown_capture_of_logs(); +} + +/** Run unit tests for directory fp_pair functions. */ +static void +test_dir_fp_pairs(void *arg) +{ + smartlist_t *sl = smartlist_new(); + fp_pair_t *pair; + + (void)arg; + dir_split_resource_into_fingerprint_pairs( + /* Two pairs, out of order, with one duplicate. */ + "73656372657420646174612E0000000000FFFFFF-" + "557365204145532d32353620696e73746561642e+" + "73656372657420646174612E0000000000FFFFFF-" + "557365204145532d32353620696e73746561642e+" + "48657861646563696d616c2069736e277420736f-" + "676f6f6420666f7220686964696e6720796f7572.z", sl); + + tt_int_op(smartlist_len(sl),OP_EQ, 2); + pair = smartlist_get(sl, 0); + tt_mem_op(pair->first,OP_EQ, "Hexadecimal isn't so", DIGEST_LEN); + tt_mem_op(pair->second,OP_EQ, "good for hiding your", DIGEST_LEN); + pair = smartlist_get(sl, 1); + tt_mem_op(pair->first,OP_EQ, "secret data.\0\0\0\0\0\xff\xff\xff", + DIGEST_LEN); + tt_mem_op(pair->second,OP_EQ, "Use AES-256 instead.", DIGEST_LEN); + + done: + SMARTLIST_FOREACH(sl, fp_pair_t *, pair_to_free, tor_free(pair_to_free)); + smartlist_free(sl); +} + +static void +test_dir_split_fps(void *testdata) +{ + smartlist_t *sl = smartlist_new(); + char *mem_op_hex_tmp = NULL; + (void)testdata; + + /* Some example hex fingerprints and their base64 equivalents */ +#define HEX1 "Fe0daff89127389bc67558691231234551193EEE" +#define HEX2 "Deadbeef99999991111119999911111111f00ba4" +#define HEX3 "b33ff00db33ff00db33ff00db33ff00db33ff00d" +#define HEX256_1 \ + "f3f3f3f3fbbbbf3f3f3f3fbbbf3f3f3f3fbbbbf3f3f3f3fbbbf3f3f3f3fbbbbf" +#define HEX256_2 \ + "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccCCc" +#define HEX256_3 \ + "0123456789ABCdef0123456789ABCdef0123456789ABCdef0123456789ABCdef" +#define B64_1 "/g2v+JEnOJvGdVhpEjEjRVEZPu4" +#define B64_2 "3q2+75mZmZERERmZmRERERHwC6Q" +#define B64_256_1 "8/Pz8/u7vz8/Pz+7vz8/Pz+7u/Pz8/P7u/Pz8/P7u78" +#define B64_256_2 "zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMw" + + /* no flags set */ + dir_split_resource_into_fingerprints("A+C+B", sl, NULL, 0); + tt_int_op(smartlist_len(sl), OP_EQ, 3); + tt_str_op(smartlist_get(sl, 0), OP_EQ, "A"); + tt_str_op(smartlist_get(sl, 1), OP_EQ, "C"); + tt_str_op(smartlist_get(sl, 2), OP_EQ, "B"); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* uniq strings. */ + dir_split_resource_into_fingerprints("A+C+B+A+B+B", sl, NULL, DSR_SORT_UNIQ); + tt_int_op(smartlist_len(sl), OP_EQ, 3); + tt_str_op(smartlist_get(sl, 0), OP_EQ, "A"); + tt_str_op(smartlist_get(sl, 1), OP_EQ, "B"); + tt_str_op(smartlist_get(sl, 2), OP_EQ, "C"); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode hex. */ + dir_split_resource_into_fingerprints(HEX1"+"HEX2, sl, NULL, DSR_HEX); + tt_int_op(smartlist_len(sl), OP_EQ, 2); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* decode hex and drop weirdness. */ + dir_split_resource_into_fingerprints(HEX1"+bogus+"HEX2"+"HEX256_1, + sl, NULL, DSR_HEX); + tt_int_op(smartlist_len(sl), OP_EQ, 2); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode long hex */ + dir_split_resource_into_fingerprints(HEX256_1"+"HEX256_2"+"HEX2"+"HEX256_3, + sl, NULL, DSR_HEX|DSR_DIGEST256); + tt_int_op(smartlist_len(sl), OP_EQ, 3); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2); + test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX256_3); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode hex and sort. */ + dir_split_resource_into_fingerprints(HEX1"+"HEX2"+"HEX3"+"HEX2, + sl, NULL, DSR_HEX|DSR_SORT_UNIQ); + tt_int_op(smartlist_len(sl), OP_EQ, 3); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX3); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); + test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX1); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode long hex and sort */ + dir_split_resource_into_fingerprints(HEX256_1"+"HEX256_2"+"HEX256_3 + "+"HEX256_1, + sl, NULL, + DSR_HEX|DSR_DIGEST256|DSR_SORT_UNIQ); + tt_int_op(smartlist_len(sl), OP_EQ, 3); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_3); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2); + test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX256_1); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode base64 */ + dir_split_resource_into_fingerprints(B64_1"-"B64_2, sl, NULL, DSR_BASE64); + tt_int_op(smartlist_len(sl), OP_EQ, 2); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + /* Decode long base64 */ + dir_split_resource_into_fingerprints(B64_256_1"-"B64_256_2, + sl, NULL, DSR_BASE64|DSR_DIGEST256); + tt_int_op(smartlist_len(sl), OP_EQ, 2); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + dir_split_resource_into_fingerprints(B64_256_1, + sl, NULL, DSR_BASE64|DSR_DIGEST256); + tt_int_op(smartlist_len(sl), OP_EQ, 1); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_clear(sl); + + done: + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); + smartlist_free(sl); + tor_free(mem_op_hex_tmp); +} + +static void +test_dir_measured_bw_kb(void *arg) +{ + measured_bw_line_t mbwl; + int i; + const char *lines_pass[] = { + "node_id=$557365204145532d32353620696e73746561642e bw=1024\n", + "node_id=$557365204145532d32353620696e73746561642e\t bw=1024 \n", + " node_id=$557365204145532d32353620696e73746561642e bw=1024\n", + "\tnoise\tnode_id=$557365204145532d32353620696e73746561642e " + "bw=1024 junk=007\n", + "misc=junk node_id=$557365204145532d32353620696e73746561642e " + "bw=1024 junk=007\n", + "end" + }; + const char *lines_fail[] = { + /* Test possible python stupidity on input */ + "node_id=None bw=1024\n", + "node_id=$None bw=1024\n", + "node_id=$557365204145532d32353620696e73746561642e bw=None\n", + "node_id=$557365204145532d32353620696e73746561642e bw=1024.0\n", + "node_id=$557365204145532d32353620696e73746561642e bw=.1024\n", + "node_id=$557365204145532d32353620696e73746561642e bw=1.024\n", + "node_id=$557365204145532d32353620696e73746561642e bw=1024 bw=0\n", + "node_id=$557365204145532d32353620696e73746561642e bw=1024 bw=None\n", + "node_id=$557365204145532d32353620696e73746561642e bw=-1024\n", + /* Test incomplete writes due to race conditions, partial copies, etc */ + "node_i", + "node_i\n", + "node_id=", + "node_id=\n", + "node_id=$557365204145532d32353620696e73746561642e bw=", + "node_id=$557365204145532d32353620696e73746561642e bw=1024", + "node_id=$557365204145532d32353620696e73746561642e bw=\n", + "node_id=$557365204145532d32353620696e7374", + "node_id=$557365204145532d32353620696e7374\n", + "", + "\n", + " \n ", + " \n\n", + /* Test assorted noise */ + " node_id= ", + "node_id==$557365204145532d32353620696e73746561642e bw==1024\n", + "node_id=$55736520414552d32353620696e73746561642e bw=1024\n", + "node_id=557365204145532d32353620696e73746561642e bw=1024\n", + "node_id= $557365204145532d32353620696e73746561642e bw=0.23\n", + "end" + }; + + (void)arg; + for (i = 0; strcmp(lines_fail[i], "end"); i++) { + //fprintf(stderr, "Testing: %s\n", lines_fail[i]); + tt_int_op(measured_bw_line_parse(&mbwl, lines_fail[i]), OP_EQ, -1); + } + + for (i = 0; strcmp(lines_pass[i], "end"); i++) { + //fprintf(stderr, "Testing: %s %d\n", lines_pass[i], TOR_ISSPACE('\n')); + tt_int_op(measured_bw_line_parse(&mbwl, lines_pass[i]), OP_EQ, 0); + tt_assert(mbwl.bw_kb == 1024); + tt_assert(strcmp(mbwl.node_hex, + "557365204145532d32353620696e73746561642e") == 0); + } + + done: + return; +} + +#define MBWC_INIT_TIME 1000 + +/** Do the measured bandwidth cache unit test */ +static void +test_dir_measured_bw_kb_cache(void *arg) +{ + /* Initial fake time_t for testing */ + time_t curr = MBWC_INIT_TIME; + /* Some measured_bw_line_ts */ + measured_bw_line_t mbwl[3]; + /* For receiving output on cache queries */ + long bw; + time_t as_of; + + /* First, clear the cache and assert that it's empty */ + (void)arg; + dirserv_clear_measured_bw_cache(); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0); + /* + * Set up test mbwls; none of the dirserv_cache_*() functions care about + * the node_hex field. + */ + memset(mbwl[0].node_id, 0x01, DIGEST_LEN); + mbwl[0].bw_kb = 20; + memset(mbwl[1].node_id, 0x02, DIGEST_LEN); + mbwl[1].bw_kb = 40; + memset(mbwl[2].node_id, 0x03, DIGEST_LEN); + mbwl[2].bw_kb = 80; + /* Try caching something */ + dirserv_cache_measured_bw(&(mbwl[0]), curr); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1); + /* Okay, let's see if we can retrieve it */ + tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,&bw, &as_of)); + tt_int_op(bw,OP_EQ, 20); + tt_int_op(as_of,OP_EQ, MBWC_INIT_TIME); + /* Try retrieving it without some outputs */ + tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,NULL, NULL)); + tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,&bw, NULL)); + tt_int_op(bw,OP_EQ, 20); + tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,NULL,&as_of)); + tt_int_op(as_of,OP_EQ, MBWC_INIT_TIME); + /* Now expire it */ + curr += MAX_MEASUREMENT_AGE + 1; + dirserv_expire_measured_bw_cache(curr); + /* Check that the cache is empty */ + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0); + /* Check that we can't retrieve it */ + tt_assert(!dirserv_query_measured_bw_cache_kb(mbwl[0].node_id, NULL,NULL)); + /* Try caching a few things now */ + dirserv_cache_measured_bw(&(mbwl[0]), curr); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1); + curr += MAX_MEASUREMENT_AGE / 4; + dirserv_cache_measured_bw(&(mbwl[1]), curr); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 2); + curr += MAX_MEASUREMENT_AGE / 4; + dirserv_cache_measured_bw(&(mbwl[2]), curr); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 3); + curr += MAX_MEASUREMENT_AGE / 4 + 1; + /* Do an expire that's too soon to get any of them */ + dirserv_expire_measured_bw_cache(curr); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 3); + /* Push the oldest one off the cliff */ + curr += MAX_MEASUREMENT_AGE / 4; + dirserv_expire_measured_bw_cache(curr); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 2); + /* And another... */ + curr += MAX_MEASUREMENT_AGE / 4; + dirserv_expire_measured_bw_cache(curr); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1); + /* This should empty it out again */ + curr += MAX_MEASUREMENT_AGE / 4; + dirserv_expire_measured_bw_cache(curr); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0); + + done: + return; +} + +static char * +my_dirvote_compute_params(smartlist_t *votes, int method, + int total_authorities) +{ + smartlist_t *s = dirvote_compute_params(votes, method, total_authorities); + tor_assert(s); + char *res = smartlist_join_strings(s, " ", 0, NULL); + SMARTLIST_FOREACH(s, char *, cp, tor_free(cp)); + smartlist_free(s); + return res; +} + +#define dirvote_compute_params my_dirvote_compute_params + +static void +test_dir_param_voting(void *arg) +{ + networkstatus_t vote1, vote2, vote3, vote4; + smartlist_t *votes = smartlist_new(); + char *res = NULL; + + /* dirvote_compute_params only looks at the net_params field of the votes, + so that's all we need to set. + */ + (void)arg; + memset(&vote1, 0, sizeof(vote1)); + memset(&vote2, 0, sizeof(vote2)); + memset(&vote3, 0, sizeof(vote3)); + memset(&vote4, 0, sizeof(vote4)); + vote1.net_params = smartlist_new(); + vote2.net_params = smartlist_new(); + vote3.net_params = smartlist_new(); + vote4.net_params = smartlist_new(); + smartlist_split_string(vote1.net_params, + "ab=90 abcd=20 cw=50 x-yz=-99", NULL, 0, 0); + smartlist_split_string(vote2.net_params, + "ab=27 cw=5 x-yz=88", NULL, 0, 0); + smartlist_split_string(vote3.net_params, + "abcd=20 c=60 cw=500 x-yz=-9 zzzzz=101", NULL, 0, 0); + smartlist_split_string(vote4.net_params, + "ab=900 abcd=200 c=1 cw=51 x-yz=100", NULL, 0, 0); + tt_int_op(100,OP_EQ, networkstatus_get_param(&vote4, "x-yz", 50, 0, 300)); + tt_int_op(222,OP_EQ, networkstatus_get_param(&vote4, "foobar", 222, 0, 300)); + tt_int_op(80,OP_EQ, networkstatus_get_param(&vote4, "ab", 12, 0, 80)); + tt_int_op(-8,OP_EQ, networkstatus_get_param(&vote4, "ab", -12, -100, -8)); + tt_int_op(0,OP_EQ, networkstatus_get_param(&vote4, "foobar", 0, -100, 8)); + + tt_int_op(100,OP_EQ, networkstatus_get_overridable_param( + &vote4, -1, "x-yz", 50, 0, 300)); + tt_int_op(30,OP_EQ, networkstatus_get_overridable_param( + &vote4, 30, "x-yz", 50, 0, 300)); + tt_int_op(0,OP_EQ, networkstatus_get_overridable_param( + &vote4, -101, "foobar", 0, -100, 8)); + tt_int_op(-99,OP_EQ, networkstatus_get_overridable_param( + &vote4, -99, "foobar", 0, -100, 8)); + + smartlist_add(votes, &vote1); + + /* Do the first tests without adding all the other votes, for + * networks without many dirauths. */ + + res = dirvote_compute_params(votes, 12, 2); + tt_str_op(res,OP_EQ, ""); + tor_free(res); + + res = dirvote_compute_params(votes, 12, 1); + tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-99"); + tor_free(res); + + smartlist_add(votes, &vote2); + + res = dirvote_compute_params(votes, 12, 2); + tt_str_op(res,OP_EQ, "ab=27 cw=5 x-yz=-99"); + tor_free(res); + + res = dirvote_compute_params(votes, 12, 3); + tt_str_op(res,OP_EQ, "ab=27 cw=5 x-yz=-99"); + tor_free(res); + + res = dirvote_compute_params(votes, 12, 6); + tt_str_op(res,OP_EQ, ""); + tor_free(res); + + smartlist_add(votes, &vote3); + + res = dirvote_compute_params(votes, 12, 3); + tt_str_op(res,OP_EQ, "ab=27 abcd=20 cw=50 x-yz=-9"); + tor_free(res); + + res = dirvote_compute_params(votes, 12, 5); + tt_str_op(res,OP_EQ, "cw=50 x-yz=-9"); + tor_free(res); + + res = dirvote_compute_params(votes, 12, 9); + tt_str_op(res,OP_EQ, "cw=50 x-yz=-9"); + tor_free(res); + + smartlist_add(votes, &vote4); + + res = dirvote_compute_params(votes, 12, 4); + tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); + tor_free(res); + + res = dirvote_compute_params(votes, 12, 5); + tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); + tor_free(res); + + /* Test that the special-cased "at least three dirauths voted for + * this param" logic works as expected. */ + res = dirvote_compute_params(votes, 12, 6); + tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); + tor_free(res); + + res = dirvote_compute_params(votes, 12, 10); + tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); + tor_free(res); + + done: + tor_free(res); + SMARTLIST_FOREACH(vote1.net_params, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(vote2.net_params, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(vote3.net_params, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(vote4.net_params, char *, cp, tor_free(cp)); + smartlist_free(vote1.net_params); + smartlist_free(vote2.net_params); + smartlist_free(vote3.net_params); + smartlist_free(vote4.net_params); + smartlist_free(votes); + + return; +} + +static void +test_dir_param_voting_lookup(void *arg) +{ + (void)arg; + smartlist_t *lst = smartlist_new(); + + smartlist_split_string(lst, + "moomin=9 moomin=10 moomintroll=5 fred " + "jack= electricity=sdk opa=6z abc=9 abcd=99", + NULL, 0, 0); + + tt_int_op(1000, + OP_EQ, dirvote_get_intermediate_param_value(lst, "ab", 1000)); + tt_int_op(9, OP_EQ, dirvote_get_intermediate_param_value(lst, "abc", 1000)); + tt_int_op(99, OP_EQ, + dirvote_get_intermediate_param_value(lst, "abcd", 1000)); + + /* moomin appears twice. That's a bug. */ + tor_capture_bugs_(1); + tt_int_op(-100, OP_EQ, + dirvote_get_intermediate_param_value(lst, "moomin", -100)); + tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); + tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, + "n_found == 0"); + tor_end_capture_bugs_(); + /* There is no 'fred=', so that is treated as not existing. */ + tt_int_op(-100, OP_EQ, + dirvote_get_intermediate_param_value(lst, "fred", -100)); + /* jack is truncated */ + tor_capture_bugs_(1); + tt_int_op(-100, OP_EQ, + dirvote_get_intermediate_param_value(lst, "jack", -100)); + tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); + tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, + "!(! ok)"); + tor_end_capture_bugs_(); + /* electricity and opa aren't integers. */ + tor_capture_bugs_(1); + tt_int_op(-100, OP_EQ, + dirvote_get_intermediate_param_value(lst, "electricity", -100)); + tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); + tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, + "!(! ok)"); + tor_end_capture_bugs_(); + + tor_capture_bugs_(1); + tt_int_op(-100, OP_EQ, + dirvote_get_intermediate_param_value(lst, "opa", -100)); + tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); + tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, + "!(! ok)"); + tor_end_capture_bugs_(); + + done: + SMARTLIST_FOREACH(lst, char *, cp, tor_free(cp)); + smartlist_free(lst); + tor_end_capture_bugs_(); +} + +#undef dirvote_compute_params + +/** Helper: Test that two networkstatus_voter_info_t do in fact represent the + * same voting authority, and that they do in fact have all the same + * information. */ +static void +test_same_voter(networkstatus_voter_info_t *v1, + networkstatus_voter_info_t *v2) +{ + tt_str_op(v1->nickname,OP_EQ, v2->nickname); + tt_mem_op(v1->identity_digest,OP_EQ, v2->identity_digest, DIGEST_LEN); + tt_str_op(v1->address,OP_EQ, v2->address); + tt_int_op(v1->addr,OP_EQ, v2->addr); + tt_int_op(v1->dir_port,OP_EQ, v2->dir_port); + tt_int_op(v1->or_port,OP_EQ, v2->or_port); + tt_str_op(v1->contact,OP_EQ, v2->contact); + tt_mem_op(v1->vote_digest,OP_EQ, v2->vote_digest, DIGEST_LEN); + done: + ; +} + +/** Helper: get a detached signatures document for one or two + * consensuses. */ +static char * +get_detached_sigs(networkstatus_t *ns, networkstatus_t *ns2) +{ + char *r; + smartlist_t *sl; + tor_assert(ns && ns->flavor == FLAV_NS); + sl = smartlist_new(); + smartlist_add(sl,ns); + if (ns2) + smartlist_add(sl,ns2); + r = networkstatus_get_detached_signatures(sl); + smartlist_free(sl); + return r; +} + +/** Apply tweaks to the vote list for each voter */ +static int +vote_tweaks_for_v3ns(networkstatus_t *v, int voter, time_t now) +{ + vote_routerstatus_t *vrs; + const char *msg = NULL; + + tt_assert(v); + (void)now; + + if (voter == 1) { + measured_bw_line_t mbw; + memset(mbw.node_id, 33, sizeof(mbw.node_id)); + mbw.bw_kb = 1024; + tt_int_op(measured_bw_line_apply(&mbw, v->routerstatus_list), OP_EQ, 1); + } else if (voter == 2 || voter == 3) { + /* Monkey around with the list a bit */ + vrs = smartlist_get(v->routerstatus_list, 2); + smartlist_del_keeporder(v->routerstatus_list, 2); + vote_routerstatus_free(vrs); + vrs = smartlist_get(v->routerstatus_list, 0); + vrs->status.is_fast = 1; + + if (voter == 3) { + vrs = smartlist_get(v->routerstatus_list, 0); + smartlist_del_keeporder(v->routerstatus_list, 0); + vote_routerstatus_free(vrs); + vrs = smartlist_get(v->routerstatus_list, 0); + memset(vrs->status.descriptor_digest, (int)'Z', DIGEST_LEN); + tt_assert(router_add_to_routerlist( + dir_common_generate_ri_from_rs(vrs), &msg,0,0) >= 0); + } + } + + done: + return 0; +} + +/** + * Test a parsed vote_routerstatus_t for v3_networkstatus test + */ +static void +test_vrs_for_v3ns(vote_routerstatus_t *vrs, int voter, time_t now) +{ + routerstatus_t *rs; + tor_addr_t addr_ipv6; + + tt_assert(vrs); + rs = &(vrs->status); + tt_assert(rs); + + /* Split out by digests to test */ + if (tor_memeq(rs->identity_digest, + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" + "\x3\x3\x3\x3", + DIGEST_LEN) && + (voter == 1)) { + /* Check the first routerstatus. */ + tt_str_op(vrs->version,OP_EQ, "0.1.2.14"); + tt_int_op(rs->published_on,OP_EQ, now-1500); + tt_str_op(rs->nickname,OP_EQ, "router2"); + tt_mem_op(rs->identity_digest,OP_EQ, + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" + "\x3\x3\x3\x3", + DIGEST_LEN); + tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); + tt_int_op(rs->addr,OP_EQ, 0x99008801); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 8000); + /* no flags except "running" (16) and "v2dir" (64) and "valid" (128) */ + tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(0xd0)); + } else if (tor_memeq(rs->identity_digest, + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" + "\x5\x5\x5\x5", + DIGEST_LEN) && + (voter == 1 || voter == 2)) { + tt_mem_op(rs->identity_digest,OP_EQ, + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" + "\x5\x5\x5\x5", + DIGEST_LEN); + + if (voter == 1) { + /* Check the second routerstatus. */ + tt_str_op(vrs->version,OP_EQ, "0.2.0.5"); + tt_int_op(rs->published_on,OP_EQ, now-1000); + tt_str_op(rs->nickname,OP_EQ, "router1"); + } + tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); + tt_int_op(rs->addr,OP_EQ, 0x99009901); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 0); + tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); + tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); + tt_int_op(rs->ipv6_orport,OP_EQ, 4711); + if (voter == 1) { + /* all except "authority" (1) */ + tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(254)); + } else { + /* 1023 - authority(1) - madeofcheese(16) - madeoftin(32) */ + tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(974)); + } + } else if (tor_memeq(rs->identity_digest, + "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33" + "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33", + DIGEST_LEN) && + (voter == 1 || voter == 2)) { + /* Check the measured bandwidth bits */ + tt_assert(vrs->has_measured_bw && + vrs->measured_bw_kb == 1024); + } else { + /* + * Didn't expect this, but the old unit test only checked some of them, + * so don't assert. + */ + /* tt_assert(0); */ + } + + done: + return; +} + +/** + * Test a consensus for v3_networkstatus_test + */ +static void +test_consensus_for_v3ns(networkstatus_t *con, time_t now) +{ + (void)now; + + tt_assert(con); + tt_ptr_op(con->cert, OP_EQ, NULL); + tt_int_op(2,OP_EQ, smartlist_len(con->routerstatus_list)); + /* There should be two listed routers: one with identity 3, one with + * identity 5. */ + + done: + return; +} + +/** + * Test a router list entry for v3_networkstatus test + */ +static void +test_routerstatus_for_v3ns(routerstatus_t *rs, time_t now) +{ + tor_addr_t addr_ipv6; + + tt_assert(rs); + + /* There should be two listed routers: one with identity 3, one with + * identity 5. */ + /* This one showed up in 2 digests. */ + if (tor_memeq(rs->identity_digest, + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" + "\x3\x3", + DIGEST_LEN)) { + tt_mem_op(rs->identity_digest,OP_EQ, + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", + DIGEST_LEN); + tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); + tt_assert(!rs->is_authority); + tt_assert(!rs->is_exit); + tt_assert(!rs->is_fast); + tt_assert(!rs->is_possible_guard); + tt_assert(!rs->is_stable); + /* (If it wasn't running it wouldn't be here) */ + tt_assert(rs->is_flagged_running); + tt_assert(rs->is_valid); + tt_assert(!rs->is_named); + tt_assert(rs->is_v2_dir); + /* XXXX check version */ + } else if (tor_memeq(rs->identity_digest, + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" + "\x5\x5\x5\x5", + DIGEST_LEN)) { + /* This one showed up in 3 digests. Twice with ID 'M', once with 'Z'. */ + tt_mem_op(rs->identity_digest,OP_EQ, + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", + DIGEST_LEN); + tt_str_op(rs->nickname,OP_EQ, "router1"); + tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); + tt_int_op(rs->published_on,OP_EQ, now-1000); + tt_int_op(rs->addr,OP_EQ, 0x99009901); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 0); + tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); + tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); + tt_int_op(rs->ipv6_orport,OP_EQ, 4711); + tt_assert(!rs->is_authority); + tt_assert(rs->is_exit); + tt_assert(rs->is_fast); + tt_assert(rs->is_possible_guard); + tt_assert(rs->is_stable); + tt_assert(rs->is_flagged_running); + tt_assert(rs->is_valid); + tt_assert(rs->is_v2_dir); + tt_assert(!rs->is_named); + /* XXXX check version */ + } else { + /* Weren't expecting this... */ + tt_abort(); + } + + done: + return; +} + +static void +test_dir_networkstatus_compute_bw_weights_v10(void *arg) +{ + (void) arg; + smartlist_t *chunks = smartlist_new(); + int64_t G, M, E, D, T, weight_scale; + int ret; + weight_scale = 10000; + + /* no case. one or more of the values is 0 */ + G = M = E = D = 0; + T = G + M + E + D; + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(smartlist_len(chunks), OP_EQ, 0); + + /* case 1 */ + /* XXX dir-spec not followed? See #20272. If it isn't closed, then this is + * testing current behavior, not spec. */ + G = E = 10; + M = D = 1; + T = G + M + E + D; + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_int_op(ret, OP_EQ, 1); + tt_int_op(smartlist_len(chunks), OP_EQ, 1); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=3333 " + "Wbe=3000 Wbg=3000 Wbm=10000 Wdb=10000 Web=10000 Wed=3333 Wee=7000 " + "Weg=3333 Wem=7000 Wgb=10000 Wgd=3333 Wgg=7000 Wgm=7000 Wmb=10000 " + "Wmd=3333 Wme=3000 Wmg=3000 Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case 2a E scarce */ + M = 100; + G = 20; + E = D = 5; + T = G + M + E + D; + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_int_op(ret, OP_EQ, 1); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 Wbe=0 " + "Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 " + "Wem=10000 Wgb=10000 Wgd=0 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=0 Wme=0 " + "Wmg=0 Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case 2a G scarce */ + M = 100; + E = 20; + G = D = 5; + T = G + M + E + D; + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_int_op(ret, OP_EQ, 1); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 Wbe=0 " + "Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=0 Wee=10000 Weg=0 Wem=10000 " + "Wgb=10000 Wgd=10000 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=0 Wme=0 Wmg=0 " + "Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case 2b1 (Wgg=1, Wmd=Wgd) */ + M = 10; + E = 30; + G = 10; + D = 100; + T = G + M + E + D; + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_int_op(ret, OP_EQ, 1); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=4000 " + "Wbe=0 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=2000 Wee=10000 Weg=2000 " + "Wem=10000 Wgb=10000 Wgd=4000 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=4000 " + "Wme=0 Wmg=0 Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case 2b2 */ + M = 60; + E = 30; + G = 10; + D = 100; + T = G + M + E + D; + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_int_op(ret, OP_EQ, 1); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=666 Wbe=0 " + "Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=3666 Wee=10000 Weg=3666 " + "Wem=10000 Wgb=10000 Wgd=5668 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=666 " + "Wme=0 Wmg=0 Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case 2b3 */ + /* XXX I can't get a combination of values that hits this case without error, + * so this just tests that it fails. See #20285. Also see #20284 as 2b3 does + * not follow dir-spec. */ + /* (E < T/3 && G < T/3) && (E+D>=G || G+D>=E) && (M > T/3) */ + M = 80; + E = 30; + G = 30; + D = 30; + T = G + M + E + D; + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_int_op(ret, OP_EQ, 0); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case 3a G scarce */ + M = 10; + E = 30; + G = 10; + D = 5; + T = G + M + E + D; + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_int_op(ret, OP_EQ, 1); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 " + "Wbe=3333 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=0 Wee=6667 Weg=0 " + "Wem=6667 Wgb=10000 Wgd=10000 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=0 " + "Wme=3333 Wmg=0 Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case 3a E scarce */ + M = 10; + E = 10; + G = 30; + D = 5; + T = G + M + E + D; + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_int_op(ret, OP_EQ, 1); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 Wbe=0 " + "Wbg=3333 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 " + "Wem=10000 Wgb=10000 Wgd=0 Wgg=6667 Wgm=6667 Wmb=10000 Wmd=0 Wme=0 " + "Wmg=3333 Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case 3bg */ + M = 10; + E = 30; + G = 10; + D = 10; + T = G + M + E + D; + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_int_op(ret, OP_EQ, 1); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 " + "Wbe=3334 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=0 Wee=6666 Weg=0 " + "Wem=6666 Wgb=10000 Wgd=10000 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=0 " + "Wme=3334 Wmg=0 Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case 3be */ + M = 10; + E = 10; + G = 30; + D = 10; + T = G + M + E + D; + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_int_op(ret, OP_EQ, 1); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 Wbe=0 " + "Wbg=3334 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 " + "Wem=10000 Wgb=10000 Wgd=0 Wgg=6666 Wgm=6666 Wmb=10000 Wmd=0 Wme=0 " + "Wmg=3334 Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case from 21 Jul 2013 (3be) */ + G = 5483409; + M = 1455379; + E = 980834; + D = 3385803; + T = 11305425; + tt_i64_op(G+M+E+D, OP_EQ, T); + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_assert(ret); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=883 Wbe=0 " + "Wbg=3673 Wbm=10000 Wdb=10000 Web=10000 Wed=8233 Wee=10000 Weg=8233 " + "Wem=10000 Wgb=10000 Wgd=883 Wgg=6327 Wgm=6327 Wmb=10000 Wmd=883 Wme=0 " + "Wmg=3673 Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case from 04 Oct 2016 (3a E scarce) */ + G=29322240; + M=4721546; + E=1522058; + D=9273571; + T=44839415; + tt_i64_op(G+M+E+D, OP_EQ, T); + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_assert(ret); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 Wbe=0 " + "Wbg=4194 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 " + "Wem=10000 Wgb=10000 Wgd=0 Wgg=5806 Wgm=5806 Wmb=10000 Wmd=0 Wme=0 " + "Wmg=4194 Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* case from 04 Sep 2013 (2b1) */ + G=3091352; + M=1838837; + E=2109300; + D=2469369; + T=9508858; + tt_i64_op(G+M+E+D, OP_EQ, T); + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_assert(ret); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=317 " + "Wbe=5938 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=9366 Wee=4061 " + "Weg=9366 Wem=4061 Wgb=10000 Wgd=317 Wgg=10000 Wgm=10000 Wmb=10000 " + "Wmd=317 Wme=5938 Wmg=0 Wmm=10000\n"); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_clear(chunks); + + /* explicitly test initializing weights to 1*/ + G=1; + M=1; + E=1; + D=1; + T=4; + tt_i64_op(G+M+E+D, OP_EQ, T); + ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, + weight_scale); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=3333 " + "Wbe=0 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=3333 Wee=10000 Weg=3333 " + "Wem=10000 Wgb=10000 Wgd=3333 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=3333 " + "Wme=0 Wmg=0 Wmm=10000\n"); + tt_assert(ret); + + done: + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_free(chunks); +} + +static authority_cert_t *mock_cert; + +static authority_cert_t * +get_my_v3_authority_cert_m(void) +{ + tor_assert(mock_cert); + return mock_cert; +} + +/** Run a unit tests for generating and parsing networkstatuses, with + * the supply test fns. */ +static void +test_a_networkstatus( + vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), + int (*vote_tweaks)(networkstatus_t *v, int voter, time_t now), + void (*vrs_test)(vote_routerstatus_t *vrs, int voter, time_t now), + void (*consensus_test)(networkstatus_t *con, time_t now), + void (*rs_test)(routerstatus_t *rs, time_t now)) +{ + authority_cert_t *cert1=NULL, *cert2=NULL, *cert3=NULL; + crypto_pk_t *sign_skey_1=NULL, *sign_skey_2=NULL, *sign_skey_3=NULL; + crypto_pk_t *sign_skey_leg1=NULL; + /* + * Sum the non-zero returns from vote_tweaks() we've seen; if vote_tweaks() + * returns non-zero, it changed net_params and we should skip the tests for + * that later as they will fail. + */ + int params_tweaked = 0; + + time_t now = time(NULL); + networkstatus_voter_info_t *voter; + document_signature_t *sig; + networkstatus_t *vote=NULL, *v1=NULL, *v2=NULL, *v3=NULL, *con=NULL, + *con_md=NULL; + vote_routerstatus_t *vrs; + routerstatus_t *rs; + int idx, n_rs, n_vrs; + char *consensus_text=NULL, *cp=NULL; + smartlist_t *votes = smartlist_new(); + + /* For generating the two other consensuses. */ + char *detached_text1=NULL, *detached_text2=NULL; + char *consensus_text2=NULL, *consensus_text3=NULL; + char *consensus_text_md2=NULL, *consensus_text_md3=NULL; + char *consensus_text_md=NULL; + networkstatus_t *con2=NULL, *con_md2=NULL, *con3=NULL, *con_md3=NULL; + ns_detached_signatures_t *dsig1=NULL, *dsig2=NULL; + + tt_assert(vrs_gen); + tt_assert(rs_test); + tt_assert(vrs_test); + + MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); + + /* Parse certificates and keys. */ + cert1 = mock_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); + tt_assert(cert1); + cert2 = authority_cert_parse_from_string(AUTHORITY_CERT_2, NULL); + tt_assert(cert2); + cert3 = authority_cert_parse_from_string(AUTHORITY_CERT_3, NULL); + tt_assert(cert3); + sign_skey_1 = crypto_pk_new(); + sign_skey_2 = crypto_pk_new(); + sign_skey_3 = crypto_pk_new(); + sign_skey_leg1 = pk_generate(4); + dirvote_recalculate_timing(get_options(), now); + sr_state_init(0, 0); + + tt_assert(!crypto_pk_read_private_key_from_string(sign_skey_1, + AUTHORITY_SIGNKEY_1, -1)); + tt_assert(!crypto_pk_read_private_key_from_string(sign_skey_2, + AUTHORITY_SIGNKEY_2, -1)); + tt_assert(!crypto_pk_read_private_key_from_string(sign_skey_3, + AUTHORITY_SIGNKEY_3, -1)); + + tt_assert(!crypto_pk_cmp_keys(sign_skey_1, cert1->signing_key)); + tt_assert(!crypto_pk_cmp_keys(sign_skey_2, cert2->signing_key)); + + tt_assert(!dir_common_construct_vote_1(&vote, cert1, sign_skey_1, vrs_gen, + &v1, &n_vrs, now, 1)); + tt_assert(v1); + + /* Make sure the parsed thing was right. */ + tt_int_op(v1->type,OP_EQ, NS_TYPE_VOTE); + tt_int_op(v1->published,OP_EQ, vote->published); + tt_int_op(v1->valid_after,OP_EQ, vote->valid_after); + tt_int_op(v1->fresh_until,OP_EQ, vote->fresh_until); + tt_int_op(v1->valid_until,OP_EQ, vote->valid_until); + tt_int_op(v1->vote_seconds,OP_EQ, vote->vote_seconds); + tt_int_op(v1->dist_seconds,OP_EQ, vote->dist_seconds); + tt_str_op(v1->client_versions,OP_EQ, vote->client_versions); + tt_str_op(v1->server_versions,OP_EQ, vote->server_versions); + tt_assert(v1->voters && smartlist_len(v1->voters)); + voter = smartlist_get(v1->voters, 0); + tt_str_op(voter->nickname,OP_EQ, "Voter1"); + tt_str_op(voter->address,OP_EQ, "1.2.3.4"); + tt_int_op(voter->addr,OP_EQ, 0x01020304); + tt_int_op(voter->dir_port,OP_EQ, 80); + tt_int_op(voter->or_port,OP_EQ, 9000); + tt_str_op(voter->contact,OP_EQ, "voter@example.com"); + tt_assert(v1->cert); + tt_assert(!crypto_pk_cmp_keys(sign_skey_1, v1->cert->signing_key)); + cp = smartlist_join_strings(v1->known_flags, ":", 0, NULL); + tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:Running:Stable:V2Dir:Valid"); + tor_free(cp); + tt_int_op(smartlist_len(v1->routerstatus_list),OP_EQ, n_vrs); + networkstatus_vote_free(vote); + vote = NULL; + + if (vote_tweaks) params_tweaked += vote_tweaks(v1, 1, now); + + /* Check the routerstatuses. */ + for (idx = 0; idx < n_vrs; ++idx) { + vrs = smartlist_get(v1->routerstatus_list, idx); + tt_assert(vrs); + vrs_test(vrs, 1, now); + } + + /* Generate second vote. It disagrees on some of the times, + * and doesn't list versions, and knows some crazy flags. + * Generate and parse v2. */ + tt_assert(!dir_common_construct_vote_2(&vote, cert2, sign_skey_2, vrs_gen, + &v2, &n_vrs, now, 1)); + tt_assert(v2); + + if (vote_tweaks) params_tweaked += vote_tweaks(v2, 2, now); + + /* Check that flags come out right.*/ + cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL); + tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" + "Running:Stable:V2Dir:Valid"); + tor_free(cp); + + /* Check the routerstatuses. */ + n_vrs = smartlist_len(v2->routerstatus_list); + for (idx = 0; idx < n_vrs; ++idx) { + vrs = smartlist_get(v2->routerstatus_list, idx); + tt_assert(vrs); + vrs_test(vrs, 2, now); + } + networkstatus_vote_free(vote); + vote = NULL; + + /* Generate the third vote with a legacy id. */ + tt_assert(!dir_common_construct_vote_3(&vote, cert3, sign_skey_3, vrs_gen, + &v3, &n_vrs, now, 1)); + tt_assert(v3); + + if (vote_tweaks) params_tweaked += vote_tweaks(v3, 3, now); + + /* Compute a consensus as voter 3. */ + smartlist_add(votes, v3); + smartlist_add(votes, v1); + smartlist_add(votes, v2); + consensus_text = networkstatus_compute_consensus(votes, 3, + cert3->identity_key, + sign_skey_3, + "AAAAAAAAAAAAAAAAAAAA", + sign_skey_leg1, + FLAV_NS); + tt_assert(consensus_text); + con = networkstatus_parse_vote_from_string(consensus_text, NULL, + NS_TYPE_CONSENSUS); + tt_assert(con); + //log_notice(LD_GENERAL, "<<%s>>\n<<%s>>\n<<%s>>\n", + // v1_text, v2_text, v3_text); + consensus_text_md = networkstatus_compute_consensus(votes, 3, + cert3->identity_key, + sign_skey_3, + "AAAAAAAAAAAAAAAAAAAA", + sign_skey_leg1, + FLAV_MICRODESC); + tt_assert(consensus_text_md); + con_md = networkstatus_parse_vote_from_string(consensus_text_md, NULL, + NS_TYPE_CONSENSUS); + tt_assert(con_md); + tt_int_op(con_md->flavor,OP_EQ, FLAV_MICRODESC); + + /* Check consensus contents. */ + tt_assert(con->type == NS_TYPE_CONSENSUS); + tt_int_op(con->published,OP_EQ, 0); /* this field only appears in votes. */ + tt_int_op(con->valid_after,OP_EQ, now+1000); + tt_int_op(con->fresh_until,OP_EQ, now+2003); /* median */ + tt_int_op(con->valid_until,OP_EQ, now+3000); + tt_int_op(con->vote_seconds,OP_EQ, 100); + tt_int_op(con->dist_seconds,OP_EQ, 250); /* median */ + tt_str_op(con->client_versions,OP_EQ, "0.1.2.14"); + tt_str_op(con->server_versions,OP_EQ, "0.1.2.15,0.1.2.16"); + cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL); + tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" + "Running:Stable:V2Dir:Valid"); + tor_free(cp); + if (!params_tweaked) { + /* Skip this one if vote_tweaks() messed with the param lists */ + cp = smartlist_join_strings(con->net_params, ":", 0, NULL); + tt_str_op(cp,OP_EQ, "circuitwindow=80:foo=660"); + tor_free(cp); + } + + tt_int_op(4,OP_EQ, smartlist_len(con->voters)); /*3 voters, 1 legacy key.*/ + /* The voter id digests should be in this order. */ + tt_assert(fast_memcmp(cert2->cache_info.identity_digest, + cert1->cache_info.identity_digest,DIGEST_LEN)<0); + tt_assert(fast_memcmp(cert1->cache_info.identity_digest, + cert3->cache_info.identity_digest,DIGEST_LEN)<0); + test_same_voter(smartlist_get(con->voters, 1), + smartlist_get(v2->voters, 0)); + test_same_voter(smartlist_get(con->voters, 2), + smartlist_get(v1->voters, 0)); + test_same_voter(smartlist_get(con->voters, 3), + smartlist_get(v3->voters, 0)); + + consensus_test(con, now); + + /* Check the routerstatuses. */ + n_rs = smartlist_len(con->routerstatus_list); + tt_assert(n_rs); + for (idx = 0; idx < n_rs; ++idx) { + rs = smartlist_get(con->routerstatus_list, idx); + tt_assert(rs); + rs_test(rs, now); + } + + n_rs = smartlist_len(con_md->routerstatus_list); + tt_assert(n_rs); + for (idx = 0; idx < n_rs; ++idx) { + rs = smartlist_get(con_md->routerstatus_list, idx); + tt_assert(rs); + } + + /* Check signatures. the first voter is a pseudo-entry with a legacy key. + * The second one hasn't signed. The fourth one has signed: validate it. */ + voter = smartlist_get(con->voters, 1); + tt_int_op(smartlist_len(voter->sigs),OP_EQ, 0); + + voter = smartlist_get(con->voters, 3); + tt_int_op(smartlist_len(voter->sigs),OP_EQ, 1); + sig = smartlist_get(voter->sigs, 0); + tt_assert(sig->signature); + tt_assert(!sig->good_signature); + tt_assert(!sig->bad_signature); + + tt_assert(!networkstatus_check_document_signature(con, sig, cert3)); + tt_assert(sig->signature); + tt_assert(sig->good_signature); + tt_assert(!sig->bad_signature); + + { + const char *msg=NULL; + /* Compute the other two signed consensuses. */ + smartlist_shuffle(votes); + consensus_text2 = networkstatus_compute_consensus(votes, 3, + cert2->identity_key, + sign_skey_2, NULL,NULL, + FLAV_NS); + consensus_text_md2 = networkstatus_compute_consensus(votes, 3, + cert2->identity_key, + sign_skey_2, NULL,NULL, + FLAV_MICRODESC); + smartlist_shuffle(votes); + consensus_text3 = networkstatus_compute_consensus(votes, 3, + cert1->identity_key, + sign_skey_1, NULL,NULL, + FLAV_NS); + consensus_text_md3 = networkstatus_compute_consensus(votes, 3, + cert1->identity_key, + sign_skey_1, NULL,NULL, + FLAV_MICRODESC); + tt_assert(consensus_text2); + tt_assert(consensus_text3); + tt_assert(consensus_text_md2); + tt_assert(consensus_text_md3); + con2 = networkstatus_parse_vote_from_string(consensus_text2, NULL, + NS_TYPE_CONSENSUS); + con3 = networkstatus_parse_vote_from_string(consensus_text3, NULL, + NS_TYPE_CONSENSUS); + con_md2 = networkstatus_parse_vote_from_string(consensus_text_md2, NULL, + NS_TYPE_CONSENSUS); + con_md3 = networkstatus_parse_vote_from_string(consensus_text_md3, NULL, + NS_TYPE_CONSENSUS); + tt_assert(con2); + tt_assert(con3); + tt_assert(con_md2); + tt_assert(con_md3); + + /* All three should have the same digest. */ + tt_mem_op(&con->digests,OP_EQ, &con2->digests, sizeof(common_digests_t)); + tt_mem_op(&con->digests,OP_EQ, &con3->digests, sizeof(common_digests_t)); + + tt_mem_op(&con_md->digests,OP_EQ, &con_md2->digests, + sizeof(common_digests_t)); + tt_mem_op(&con_md->digests,OP_EQ, &con_md3->digests, + sizeof(common_digests_t)); + + /* Extract a detached signature from con3. */ + detached_text1 = get_detached_sigs(con3, con_md3); + tt_assert(detached_text1); + /* Try to parse it. */ + dsig1 = networkstatus_parse_detached_signatures(detached_text1, NULL); + tt_assert(dsig1); + + /* Are parsed values as expected? */ + tt_int_op(dsig1->valid_after,OP_EQ, con3->valid_after); + tt_int_op(dsig1->fresh_until,OP_EQ, con3->fresh_until); + tt_int_op(dsig1->valid_until,OP_EQ, con3->valid_until); + { + common_digests_t *dsig_digests = strmap_get(dsig1->digests, "ns"); + tt_assert(dsig_digests); + tt_mem_op(dsig_digests->d[DIGEST_SHA1], OP_EQ, + con3->digests.d[DIGEST_SHA1], DIGEST_LEN); + dsig_digests = strmap_get(dsig1->digests, "microdesc"); + tt_assert(dsig_digests); + tt_mem_op(dsig_digests->d[DIGEST_SHA256],OP_EQ, + con_md3->digests.d[DIGEST_SHA256], + DIGEST256_LEN); + } + { + smartlist_t *dsig_signatures = strmap_get(dsig1->signatures, "ns"); + tt_assert(dsig_signatures); + tt_int_op(1,OP_EQ, smartlist_len(dsig_signatures)); + sig = smartlist_get(dsig_signatures, 0); + tt_mem_op(sig->identity_digest,OP_EQ, cert1->cache_info.identity_digest, + DIGEST_LEN); + tt_int_op(sig->alg,OP_EQ, DIGEST_SHA1); + + dsig_signatures = strmap_get(dsig1->signatures, "microdesc"); + tt_assert(dsig_signatures); + tt_int_op(1,OP_EQ, smartlist_len(dsig_signatures)); + sig = smartlist_get(dsig_signatures, 0); + tt_mem_op(sig->identity_digest,OP_EQ, cert1->cache_info.identity_digest, + DIGEST_LEN); + tt_int_op(sig->alg,OP_EQ, DIGEST_SHA256); + } + + /* Try adding it to con2. */ + detached_text2 = get_detached_sigs(con2,con_md2); + tt_int_op(1,OP_EQ, networkstatus_add_detached_signatures(con2, dsig1, + "test", LOG_INFO, &msg)); + tor_free(detached_text2); + tt_int_op(1,OP_EQ, + networkstatus_add_detached_signatures(con_md2, dsig1, "test", + LOG_INFO, &msg)); + tor_free(detached_text2); + detached_text2 = get_detached_sigs(con2,con_md2); + //printf("\n<%s>\n", detached_text2); + dsig2 = networkstatus_parse_detached_signatures(detached_text2, NULL); + tt_assert(dsig2); + /* + printf("\n"); + SMARTLIST_FOREACH(dsig2->signatures, networkstatus_voter_info_t *, vi, { + char hd[64]; + base16_encode(hd, sizeof(hd), vi->identity_digest, DIGEST_LEN); + printf("%s\n", hd); + }); + */ + tt_int_op(2,OP_EQ, + smartlist_len((smartlist_t*)strmap_get(dsig2->signatures, "ns"))); + tt_int_op(2,OP_EQ, + smartlist_len((smartlist_t*)strmap_get(dsig2->signatures, + "microdesc"))); + + /* Try adding to con2 twice; verify that nothing changes. */ + tt_int_op(0,OP_EQ, networkstatus_add_detached_signatures(con2, dsig1, + "test", LOG_INFO, &msg)); + + /* Add to con. */ + tt_int_op(2,OP_EQ, networkstatus_add_detached_signatures(con, dsig2, + "test", LOG_INFO, &msg)); + /* Check signatures */ + voter = smartlist_get(con->voters, 1); + sig = smartlist_get(voter->sigs, 0); + tt_assert(sig); + tt_assert(!networkstatus_check_document_signature(con, sig, cert2)); + voter = smartlist_get(con->voters, 2); + sig = smartlist_get(voter->sigs, 0); + tt_assert(sig); + tt_assert(!networkstatus_check_document_signature(con, sig, cert1)); + } + + done: + tor_free(cp); + smartlist_free(votes); + tor_free(consensus_text); + tor_free(consensus_text_md); + + networkstatus_vote_free(vote); + networkstatus_vote_free(v1); + networkstatus_vote_free(v2); + networkstatus_vote_free(v3); + networkstatus_vote_free(con); + networkstatus_vote_free(con_md); + crypto_pk_free(sign_skey_1); + crypto_pk_free(sign_skey_2); + crypto_pk_free(sign_skey_3); + crypto_pk_free(sign_skey_leg1); + authority_cert_free(cert1); + authority_cert_free(cert2); + authority_cert_free(cert3); + + tor_free(consensus_text2); + tor_free(consensus_text3); + tor_free(consensus_text_md2); + tor_free(consensus_text_md3); + tor_free(detached_text1); + tor_free(detached_text2); + + networkstatus_vote_free(con2); + networkstatus_vote_free(con3); + networkstatus_vote_free(con_md2); + networkstatus_vote_free(con_md3); + ns_detached_signatures_free(dsig1); + ns_detached_signatures_free(dsig2); +} + +/** Run unit tests for generating and parsing V3 consensus networkstatus + * documents. */ +static void +test_dir_v3_networkstatus(void *arg) +{ + (void)arg; + test_a_networkstatus(dir_common_gen_routerstatus_for_v3ns, + vote_tweaks_for_v3ns, + test_vrs_for_v3ns, + test_consensus_for_v3ns, + test_routerstatus_for_v3ns); +} + +static void +test_dir_scale_bw(void *testdata) +{ + double v[8] = { 2.0/3, + 7.0, + 1.0, + 3.0, + 1.0/5, + 1.0/7, + 12.0, + 24.0 }; + double vals_dbl[8]; + uint64_t vals_u64[8]; + uint64_t total; + int i; + + (void) testdata; + + for (i=0; i<8; ++i) + vals_dbl[i] = v[i]; + + scale_array_elements_to_u64(vals_u64, vals_dbl, 8, &total); + + tt_int_op((int)total, OP_EQ, 48); + total = 0; + for (i=0; i<8; ++i) { + total += vals_u64[i]; + } + tt_assert(total >= (U64_LITERAL(1)<<60)); + tt_assert(total <= (U64_LITERAL(1)<<62)); + + for (i=0; i<8; ++i) { + /* vals[2].u64 is the scaled value of 1.0 */ + double ratio = ((double)vals_u64[i]) / vals_u64[2]; + tt_double_op(fabs(ratio - v[i]), OP_LT, .00001); + } + + /* test handling of no entries */ + total = 1; + scale_array_elements_to_u64(vals_u64, vals_dbl, 0, &total); + tt_assert(total == 0); + + /* make sure we don't read the array when we have no entries + * may require compiler flags to catch NULL dereferences */ + total = 1; + scale_array_elements_to_u64(NULL, NULL, 0, &total); + tt_assert(total == 0); + + scale_array_elements_to_u64(NULL, NULL, 0, NULL); + + /* test handling of zero totals */ + total = 1; + vals_dbl[0] = 0.0; + scale_array_elements_to_u64(vals_u64, vals_dbl, 1, &total); + tt_assert(total == 0); + tt_assert(vals_u64[0] == 0); + + vals_dbl[0] = 0.0; + vals_dbl[1] = 0.0; + scale_array_elements_to_u64(vals_u64, vals_dbl, 2, NULL); + tt_assert(vals_u64[0] == 0); + tt_assert(vals_u64[1] == 0); + + done: + ; +} + +static void +test_dir_random_weighted(void *testdata) +{ + int histogram[10]; + uint64_t vals[10] = {3,1,2,4,6,0,7,5,8,9}, total=0; + uint64_t inp_u64[10]; + int i, choice; + const int n = 50000; + double max_sq_error; + (void) testdata; + + /* Try a ten-element array with values from 0 through 10. The values are + * in a scrambled order to make sure we don't depend on order. */ + memset(histogram,0,sizeof(histogram)); + for (i=0; i<10; ++i) { + inp_u64[i] = vals[i]; + total += vals[i]; + } + tt_u64_op(total, OP_EQ, 45); + for (i=0; i max_sq_error) + max_sq_error = sq; + } + /* It should almost always be much much less than this. If you want to + * figure out the odds, please feel free. */ + tt_double_op(max_sq_error, OP_LT, .05); + + /* Now try a singleton; do we choose it? */ + for (i = 0; i < 100; ++i) { + choice = choose_array_element_by_weight(inp_u64, 1); + tt_int_op(choice, OP_EQ, 0); + } + + /* Now try an array of zeros. We should choose randomly. */ + memset(histogram,0,sizeof(histogram)); + for (i = 0; i < 5; ++i) + inp_u64[i] = 0; + for (i = 0; i < n; ++i) { + choice = choose_array_element_by_weight(inp_u64, 5); + tt_int_op(choice, OP_GE, 0); + tt_int_op(choice, OP_LT, 5); + histogram[choice]++; + } + /* Now see if we chose things about frequently enough. */ + max_sq_error = 0; + for (i=0; i<5; ++i) { + int expected = n/5; + double frac_diff = 0, sq; + TT_BLATHER((" %d : %5d vs %5d\n", (int)vals[i], histogram[i], expected)); + frac_diff = (histogram[i] - expected) / ((double)expected); + sq = frac_diff * frac_diff; + if (sq > max_sq_error) + max_sq_error = sq; + } + /* It should almost always be much much less than this. If you want to + * figure out the odds, please feel free. */ + tt_double_op(max_sq_error, OP_LT, .05); + done: + ; +} + +/* Function pointers for test_dir_clip_unmeasured_bw_kb() */ + +static uint32_t alternate_clip_bw = 0; + +/** + * Generate a routerstatus for clip_unmeasured_bw_kb test; based on the + * v3_networkstatus ones. + */ +static vote_routerstatus_t * +gen_routerstatus_for_umbw(int idx, time_t now) +{ + vote_routerstatus_t *vrs = NULL; + routerstatus_t *rs; + tor_addr_t addr_ipv6; + uint32_t max_unmeasured_bw_kb = (alternate_clip_bw > 0) ? + alternate_clip_bw : DEFAULT_MAX_UNMEASURED_BW_KB; + + switch (idx) { + case 0: + /* Generate the first routerstatus. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.1.2.14"); + rs->published_on = now-1500; + strlcpy(rs->nickname, "router2", sizeof(rs->nickname)); + memset(rs->identity_digest, 3, DIGEST_LEN); + memset(rs->descriptor_digest, 78, DIGEST_LEN); + rs->addr = 0x99008801; + rs->or_port = 443; + rs->dir_port = 8000; + /* all flags but running cleared */ + rs->is_flagged_running = 1; + /* + * This one has measured bandwidth below the clip cutoff, and + * so shouldn't be clipped; we'll have to test that it isn't + * later. + */ + vrs->has_measured_bw = 1; + rs->has_bandwidth = 1; + vrs->measured_bw_kb = rs->bandwidth_kb = max_unmeasured_bw_kb / 2; + break; + case 1: + /* Generate the second routerstatus. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.2.0.5"); + rs->published_on = now-1000; + strlcpy(rs->nickname, "router1", sizeof(rs->nickname)); + memset(rs->identity_digest, 5, DIGEST_LEN); + memset(rs->descriptor_digest, 77, DIGEST_LEN); + rs->addr = 0x99009901; + rs->or_port = 443; + rs->dir_port = 0; + tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); + tor_addr_copy(&rs->ipv6_addr, &addr_ipv6); + rs->ipv6_orport = 4711; + rs->is_exit = rs->is_stable = rs->is_fast = rs->is_flagged_running = + rs->is_valid = rs->is_possible_guard = 1; + /* + * This one has measured bandwidth above the clip cutoff, and + * so shouldn't be clipped; we'll have to test that it isn't + * later. + */ + vrs->has_measured_bw = 1; + rs->has_bandwidth = 1; + vrs->measured_bw_kb = rs->bandwidth_kb = 2 * max_unmeasured_bw_kb; + break; + case 2: + /* Generate the third routerstatus. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.1.0.3"); + rs->published_on = now-1000; + strlcpy(rs->nickname, "router3", sizeof(rs->nickname)); + memset(rs->identity_digest, 0x33, DIGEST_LEN); + memset(rs->descriptor_digest, 79, DIGEST_LEN); + rs->addr = 0xAA009901; + rs->or_port = 400; + rs->dir_port = 9999; + rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast = + rs->is_flagged_running = rs->is_valid = + rs->is_possible_guard = 1; + /* + * This one has unmeasured bandwidth above the clip cutoff, and + * so should be clipped; we'll have to test that it isn't + * later. + */ + vrs->has_measured_bw = 0; + rs->has_bandwidth = 1; + vrs->measured_bw_kb = 0; + rs->bandwidth_kb = 2 * max_unmeasured_bw_kb; + break; + case 3: + /* Generate a fourth routerstatus that is not running. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.1.6.3"); + rs->published_on = now-1000; + strlcpy(rs->nickname, "router4", sizeof(rs->nickname)); + memset(rs->identity_digest, 0x34, DIGEST_LEN); + memset(rs->descriptor_digest, 47, DIGEST_LEN); + rs->addr = 0xC0000203; + rs->or_port = 500; + rs->dir_port = 1999; + /* all flags but running cleared */ + rs->is_flagged_running = 1; + /* + * This one has unmeasured bandwidth below the clip cutoff, and + * so shouldn't be clipped; we'll have to test that it isn't + * later. + */ + vrs->has_measured_bw = 0; + rs->has_bandwidth = 1; + vrs->measured_bw_kb = 0; + rs->bandwidth_kb = max_unmeasured_bw_kb / 2; + break; + case 4: + /* No more for this test; return NULL */ + vrs = NULL; + break; + default: + /* Shouldn't happen */ + tt_abort(); + } + if (vrs) { + vrs->microdesc = tor_malloc_zero(sizeof(vote_microdesc_hash_t)); + tor_asprintf(&vrs->microdesc->microdesc_hash_line, + "m 9,10,11,12,13,14,15,16,17 " + "sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa%d\n", + idx); + } + + done: + return vrs; +} + +/** Apply tweaks to the vote list for each voter; for the umbw test this is + * just adding the right consensus methods to let clipping happen */ +static int +vote_tweaks_for_umbw(networkstatus_t *v, int voter, time_t now) +{ + char *maxbw_param = NULL; + int rv = 0; + + tt_assert(v); + (void)voter; + (void)now; + + tt_assert(v->supported_methods); + SMARTLIST_FOREACH(v->supported_methods, char *, c, tor_free(c)); + smartlist_clear(v->supported_methods); + /* Method 17 is MIN_METHOD_TO_CLIP_UNMEASURED_BW_KB */ + smartlist_split_string(v->supported_methods, + "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17", + NULL, 0, -1); + /* If we're using a non-default clip bandwidth, add it to net_params */ + if (alternate_clip_bw > 0) { + tor_asprintf(&maxbw_param, "maxunmeasuredbw=%u", alternate_clip_bw); + tt_assert(maxbw_param); + if (maxbw_param) { + smartlist_add(v->net_params, maxbw_param); + rv = 1; + } + } + + done: + return rv; +} + +/** + * Test a parsed vote_routerstatus_t for umbw test. + */ +static void +test_vrs_for_umbw(vote_routerstatus_t *vrs, int voter, time_t now) +{ + routerstatus_t *rs; + tor_addr_t addr_ipv6; + uint32_t max_unmeasured_bw_kb = (alternate_clip_bw > 0) ? + alternate_clip_bw : DEFAULT_MAX_UNMEASURED_BW_KB; + + (void)voter; + tt_assert(vrs); + rs = &(vrs->status); + tt_assert(rs); + + /* Split out by digests to test */ + if (tor_memeq(rs->identity_digest, + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", + DIGEST_LEN)) { + /* + * Check the first routerstatus - measured bandwidth below the clip + * cutoff. + */ + tt_str_op(vrs->version,OP_EQ, "0.1.2.14"); + tt_int_op(rs->published_on,OP_EQ, now-1500); + tt_str_op(rs->nickname,OP_EQ, "router2"); + tt_mem_op(rs->identity_digest,OP_EQ, + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", + DIGEST_LEN); + tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); + tt_int_op(rs->addr,OP_EQ, 0x99008801); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 8000); + tt_assert(rs->has_bandwidth); + tt_assert(vrs->has_measured_bw); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); + tt_int_op(vrs->measured_bw_kb,OP_EQ, max_unmeasured_bw_kb / 2); + } else if (tor_memeq(rs->identity_digest, + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", + DIGEST_LEN)) { + + /* + * Check the second routerstatus - measured bandwidth above the clip + * cutoff. + */ + tt_str_op(vrs->version,OP_EQ, "0.2.0.5"); + tt_int_op(rs->published_on,OP_EQ, now-1000); + tt_str_op(rs->nickname,OP_EQ, "router1"); + tt_mem_op(rs->identity_digest,OP_EQ, + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", + DIGEST_LEN); + tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); + tt_int_op(rs->addr,OP_EQ, 0x99009901); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 0); + tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); + tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); + tt_int_op(rs->ipv6_orport,OP_EQ, 4711); + tt_assert(rs->has_bandwidth); + tt_assert(vrs->has_measured_bw); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2); + tt_int_op(vrs->measured_bw_kb,OP_EQ, max_unmeasured_bw_kb * 2); + } else if (tor_memeq(rs->identity_digest, + "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33" + "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33", + DIGEST_LEN)) { + /* + * Check the third routerstatus - unmeasured bandwidth above the clip + * cutoff; this one should be clipped later on in the consensus, but + * appears unclipped in the vote. + */ + tt_assert(rs->has_bandwidth); + tt_assert(!(vrs->has_measured_bw)); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2); + tt_int_op(vrs->measured_bw_kb,OP_EQ, 0); + } else if (tor_memeq(rs->identity_digest, + "\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34" + "\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34", + DIGEST_LEN)) { + /* + * Check the fourth routerstatus - unmeasured bandwidth below the clip + * cutoff; this one should not be clipped. + */ + tt_assert(rs->has_bandwidth); + tt_assert(!(vrs->has_measured_bw)); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); + tt_int_op(vrs->measured_bw_kb,OP_EQ, 0); + } else { + tt_abort(); + } + + done: + return; +} + +/** + * Test a consensus for v3_networkstatus_test + */ +static void +test_consensus_for_umbw(networkstatus_t *con, time_t now) +{ + (void)now; + + tt_assert(con); + tt_ptr_op(con->cert, OP_EQ, NULL); + // tt_assert(con->consensus_method >= MIN_METHOD_TO_CLIP_UNMEASURED_BW_KB); + tt_int_op(con->consensus_method, OP_GE, 16); + tt_int_op(4,OP_EQ, smartlist_len(con->routerstatus_list)); + /* There should be four listed routers; all voters saw the same in this */ + + done: + return; +} + +/** + * Test a router list entry for umbw test + */ +static void +test_routerstatus_for_umbw(routerstatus_t *rs, time_t now) +{ + tor_addr_t addr_ipv6; + uint32_t max_unmeasured_bw_kb = (alternate_clip_bw > 0) ? + alternate_clip_bw : DEFAULT_MAX_UNMEASURED_BW_KB; + + tt_assert(rs); + + /* There should be four listed routers, as constructed above */ + if (tor_memeq(rs->identity_digest, + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", + DIGEST_LEN)) { + tt_mem_op(rs->identity_digest,OP_EQ, + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" + "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", + DIGEST_LEN); + tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); + tt_assert(!rs->is_authority); + tt_assert(!rs->is_exit); + tt_assert(!rs->is_fast); + tt_assert(!rs->is_possible_guard); + tt_assert(!rs->is_stable); + /* (If it wasn't running it wouldn't be here) */ + tt_assert(rs->is_flagged_running); + tt_assert(!rs->is_valid); + tt_assert(!rs->is_named); + /* This one should have measured bandwidth below the clip cutoff */ + tt_assert(rs->has_bandwidth); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); + tt_assert(!(rs->bw_is_unmeasured)); + } else if (tor_memeq(rs->identity_digest, + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", + DIGEST_LEN)) { + /* This one showed up in 3 digests. Twice with ID 'M', once with 'Z'. */ + tt_mem_op(rs->identity_digest,OP_EQ, + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" + "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", + DIGEST_LEN); + tt_str_op(rs->nickname,OP_EQ, "router1"); + tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); + tt_int_op(rs->published_on,OP_EQ, now-1000); + tt_int_op(rs->addr,OP_EQ, 0x99009901); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 0); + tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); + tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); + tt_int_op(rs->ipv6_orport,OP_EQ, 4711); + tt_assert(!rs->is_authority); + tt_assert(rs->is_exit); + tt_assert(rs->is_fast); + tt_assert(rs->is_possible_guard); + tt_assert(rs->is_stable); + tt_assert(rs->is_flagged_running); + tt_assert(rs->is_valid); + tt_assert(!rs->is_named); + /* This one should have measured bandwidth above the clip cutoff */ + tt_assert(rs->has_bandwidth); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2); + tt_assert(!(rs->bw_is_unmeasured)); + } else if (tor_memeq(rs->identity_digest, + "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33" + "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33", + DIGEST_LEN)) { + /* + * This one should have unmeasured bandwidth above the clip cutoff, + * and so should be clipped + */ + tt_assert(rs->has_bandwidth); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb); + tt_assert(rs->bw_is_unmeasured); + } else if (tor_memeq(rs->identity_digest, + "\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34" + "\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34", + DIGEST_LEN)) { + /* + * This one should have unmeasured bandwidth below the clip cutoff, + * and so should not be clipped + */ + tt_assert(rs->has_bandwidth); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); + tt_assert(rs->bw_is_unmeasured); + } else { + /* Weren't expecting this... */ + tt_abort(); + } + + done: + return; +} + +/** + * Compute a consensus involving clipping unmeasured bandwidth with consensus + * method 17; this uses the same test_a_networkstatus() function that the + * v3_networkstatus test uses. + */ + +static void +test_dir_clip_unmeasured_bw_kb(void *arg) +{ + /* Run the test with the default clip bandwidth */ + (void)arg; + alternate_clip_bw = 0; + test_a_networkstatus(gen_routerstatus_for_umbw, + vote_tweaks_for_umbw, + test_vrs_for_umbw, + test_consensus_for_umbw, + test_routerstatus_for_umbw); +} + +/** + * This version of test_dir_clip_unmeasured_bw_kb() uses a non-default choice + * of clip bandwidth. + */ + +static void +test_dir_clip_unmeasured_bw_kb_alt(void *arg) +{ + /* + * Try a different one; this value is chosen so that the below-the-cutoff + * unmeasured nodes the test uses, at alternate_clip_bw / 2, will be above + * DEFAULT_MAX_UNMEASURED_BW_KB and if the consensus incorrectly uses that + * cutoff it will fail the test. + */ + (void)arg; + alternate_clip_bw = 3 * DEFAULT_MAX_UNMEASURED_BW_KB; + test_a_networkstatus(gen_routerstatus_for_umbw, + vote_tweaks_for_umbw, + test_vrs_for_umbw, + test_consensus_for_umbw, + test_routerstatus_for_umbw); +} + +static void +test_dir_fmt_control_ns(void *arg) +{ + char *s = NULL; + routerstatus_t rs; + (void)arg; + + memset(&rs, 0, sizeof(rs)); + rs.published_on = 1364925198; + strlcpy(rs.nickname, "TetsuoMilk", sizeof(rs.nickname)); + memcpy(rs.identity_digest, "Stately, plump Buck ", DIGEST_LEN); + memcpy(rs.descriptor_digest, "Mulligan came up fro", DIGEST_LEN); + rs.addr = 0x20304050; + rs.or_port = 9001; + rs.dir_port = 9002; + rs.is_exit = 1; + rs.is_fast = 1; + rs.is_flagged_running = 1; + rs.has_bandwidth = 1; + rs.is_v2_dir = 1; + rs.bandwidth_kb = 1000; + + s = networkstatus_getinfo_helper_single(&rs); + tt_assert(s); + tt_str_op(s, OP_EQ, + "r TetsuoMilk U3RhdGVseSwgcGx1bXAgQnVjayA " + "TXVsbGlnYW4gY2FtZSB1cCBmcm8 2013-04-02 17:53:18 " + "32.48.64.80 9001 9002\n" + "s Exit Fast Running V2Dir\n" + "w Bandwidth=1000\n"); + + done: + tor_free(s); +} + +static int mock_get_options_calls = 0; +static or_options_t *mock_options = NULL; + +static void +reset_options(or_options_t *options, int *get_options_calls) +{ + memset(options, 0, sizeof(or_options_t)); + options->TestingTorNetwork = 1; + + *get_options_calls = 0; +} + +static const or_options_t * +mock_get_options(void) +{ + ++mock_get_options_calls; + tor_assert(mock_options); + return mock_options; +} + +static void +reset_routerstatus(routerstatus_t *rs, + const char *hex_identity_digest, + uint32_t ipv4_addr) +{ + memset(rs, 0, sizeof(routerstatus_t)); + base16_decode(rs->identity_digest, sizeof(rs->identity_digest), + hex_identity_digest, HEX_DIGEST_LEN); + /* A zero address matches everything, so the address needs to be set. + * But the specific value is irrelevant. */ + rs->addr = ipv4_addr; +} + +#define ROUTER_A_ID_STR "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +#define ROUTER_A_IPV4 0xAA008801 +#define ROUTER_B_ID_STR "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" +#define ROUTER_B_IPV4 0xBB008801 + +#define ROUTERSET_ALL_STR "*" +#define ROUTERSET_A_STR ROUTER_A_ID_STR +#define ROUTERSET_NONE_STR "" + +/* + * Test that dirserv_set_routerstatus_testing sets router flags correctly + * Using "*" sets flags on A and B + * Using "A" sets flags on A + * Using "" sets flags on Neither + * If the router is not included: + * - if *Strict is set, the flag is set to 0, + * - otherwise, the flag is not modified. */ +static void +test_dir_dirserv_set_routerstatus_testing(void *arg) +{ + (void)arg; + + /* Init options */ + mock_options = tor_malloc(sizeof(or_options_t)); + reset_options(mock_options, &mock_get_options_calls); + + MOCK(get_options, mock_get_options); + + /* Init routersets */ + routerset_t *routerset_all = routerset_new(); + routerset_parse(routerset_all, ROUTERSET_ALL_STR, "All routers"); + + routerset_t *routerset_a = routerset_new(); + routerset_parse(routerset_a, ROUTERSET_A_STR, "Router A only"); + + routerset_t *routerset_none = routerset_new(); + /* Routersets are empty when provided by routerset_new(), + * so this is not strictly necessary */ + routerset_parse(routerset_none, ROUTERSET_NONE_STR, "No routers"); + + /* Init routerstatuses */ + routerstatus_t *rs_a = tor_malloc(sizeof(routerstatus_t)); + reset_routerstatus(rs_a, ROUTER_A_ID_STR, ROUTER_A_IPV4); + + routerstatus_t *rs_b = tor_malloc(sizeof(routerstatus_t)); + reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); + + /* Sanity check that routersets correspond to routerstatuses. + * Return values are {2, 3, 4} */ + + /* We want 3 ("*" means match all addresses) */ + tt_int_op(routerset_contains_routerstatus(routerset_all, rs_a, 0), OP_EQ, 3); + tt_int_op(routerset_contains_routerstatus(routerset_all, rs_b, 0), OP_EQ, 3); + + /* We want 4 (match id_digest [or nickname]) */ + tt_int_op(routerset_contains_routerstatus(routerset_a, rs_a, 0), OP_EQ, 4); + tt_int_op(routerset_contains_routerstatus(routerset_a, rs_b, 0), OP_EQ, 0); + + tt_int_op(routerset_contains_routerstatus(routerset_none, rs_a, 0), OP_EQ, + 0); + tt_int_op(routerset_contains_routerstatus(routerset_none, rs_b, 0), OP_EQ, + 0); + + /* Check that "*" sets flags on all routers: Exit + * Check the flags aren't being confused with each other */ + reset_options(mock_options, &mock_get_options_calls); + reset_routerstatus(rs_a, ROUTER_A_ID_STR, ROUTER_A_IPV4); + reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); + + mock_options->TestingDirAuthVoteExit = routerset_all; + mock_options->TestingDirAuthVoteExitIsStrict = 0; + + dirserv_set_routerstatus_testing(rs_a); + tt_int_op(mock_get_options_calls, OP_EQ, 1); + dirserv_set_routerstatus_testing(rs_b); + tt_int_op(mock_get_options_calls, OP_EQ, 2); + + tt_uint_op(rs_a->is_exit, OP_EQ, 1); + tt_uint_op(rs_b->is_exit, OP_EQ, 1); + /* Be paranoid - check no other flags are set */ + tt_uint_op(rs_a->is_possible_guard, OP_EQ, 0); + tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0); + tt_uint_op(rs_a->is_hs_dir, OP_EQ, 0); + tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0); + + /* Check that "*" sets flags on all routers: Guard & HSDir + * Cover the remaining flags in one test */ + reset_options(mock_options, &mock_get_options_calls); + reset_routerstatus(rs_a, ROUTER_A_ID_STR, ROUTER_A_IPV4); + reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); + + mock_options->TestingDirAuthVoteGuard = routerset_all; + mock_options->TestingDirAuthVoteGuardIsStrict = 0; + mock_options->TestingDirAuthVoteHSDir = routerset_all; + mock_options->TestingDirAuthVoteHSDirIsStrict = 0; + + dirserv_set_routerstatus_testing(rs_a); + tt_int_op(mock_get_options_calls, OP_EQ, 1); + dirserv_set_routerstatus_testing(rs_b); + tt_int_op(mock_get_options_calls, OP_EQ, 2); + + tt_uint_op(rs_a->is_possible_guard, OP_EQ, 1); + tt_uint_op(rs_b->is_possible_guard, OP_EQ, 1); + tt_uint_op(rs_a->is_hs_dir, OP_EQ, 1); + tt_uint_op(rs_b->is_hs_dir, OP_EQ, 1); + /* Be paranoid - check exit isn't set */ + tt_uint_op(rs_a->is_exit, OP_EQ, 0); + tt_uint_op(rs_b->is_exit, OP_EQ, 0); + + /* Check routerset A sets all flags on router A, + * but leaves router B unmodified */ + reset_options(mock_options, &mock_get_options_calls); + reset_routerstatus(rs_a, ROUTER_A_ID_STR, ROUTER_A_IPV4); + reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); + + mock_options->TestingDirAuthVoteExit = routerset_a; + mock_options->TestingDirAuthVoteExitIsStrict = 0; + mock_options->TestingDirAuthVoteGuard = routerset_a; + mock_options->TestingDirAuthVoteGuardIsStrict = 0; + mock_options->TestingDirAuthVoteHSDir = routerset_a; + mock_options->TestingDirAuthVoteHSDirIsStrict = 0; + + dirserv_set_routerstatus_testing(rs_a); + tt_int_op(mock_get_options_calls, OP_EQ, 1); + dirserv_set_routerstatus_testing(rs_b); + tt_int_op(mock_get_options_calls, OP_EQ, 2); + + tt_uint_op(rs_a->is_exit, OP_EQ, 1); + tt_uint_op(rs_b->is_exit, OP_EQ, 0); + tt_uint_op(rs_a->is_possible_guard, OP_EQ, 1); + tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0); + tt_uint_op(rs_a->is_hs_dir, OP_EQ, 1); + tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0); + + /* Check routerset A unsets all flags on router B when Strict is set */ + reset_options(mock_options, &mock_get_options_calls); + reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); + + mock_options->TestingDirAuthVoteExit = routerset_a; + mock_options->TestingDirAuthVoteExitIsStrict = 1; + mock_options->TestingDirAuthVoteGuard = routerset_a; + mock_options->TestingDirAuthVoteGuardIsStrict = 1; + mock_options->TestingDirAuthVoteHSDir = routerset_a; + mock_options->TestingDirAuthVoteHSDirIsStrict = 1; + + rs_b->is_exit = 1; + rs_b->is_possible_guard = 1; + rs_b->is_hs_dir = 1; + + dirserv_set_routerstatus_testing(rs_b); + tt_int_op(mock_get_options_calls, OP_EQ, 1); + + tt_uint_op(rs_b->is_exit, OP_EQ, 0); + tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0); + tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0); + + /* Check routerset A doesn't modify flags on router B without Strict set */ + reset_options(mock_options, &mock_get_options_calls); + reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); + + mock_options->TestingDirAuthVoteExit = routerset_a; + mock_options->TestingDirAuthVoteExitIsStrict = 0; + mock_options->TestingDirAuthVoteGuard = routerset_a; + mock_options->TestingDirAuthVoteGuardIsStrict = 0; + mock_options->TestingDirAuthVoteHSDir = routerset_a; + mock_options->TestingDirAuthVoteHSDirIsStrict = 0; + + rs_b->is_exit = 1; + rs_b->is_possible_guard = 1; + rs_b->is_hs_dir = 1; + + dirserv_set_routerstatus_testing(rs_b); + tt_int_op(mock_get_options_calls, OP_EQ, 1); + + tt_uint_op(rs_b->is_exit, OP_EQ, 1); + tt_uint_op(rs_b->is_possible_guard, OP_EQ, 1); + tt_uint_op(rs_b->is_hs_dir, OP_EQ, 1); + + /* Check the empty routerset zeroes all flags + * on routers A & B with Strict set */ + reset_options(mock_options, &mock_get_options_calls); + reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); + + mock_options->TestingDirAuthVoteExit = routerset_none; + mock_options->TestingDirAuthVoteExitIsStrict = 1; + mock_options->TestingDirAuthVoteGuard = routerset_none; + mock_options->TestingDirAuthVoteGuardIsStrict = 1; + mock_options->TestingDirAuthVoteHSDir = routerset_none; + mock_options->TestingDirAuthVoteHSDirIsStrict = 1; + + rs_b->is_exit = 1; + rs_b->is_possible_guard = 1; + rs_b->is_hs_dir = 1; + + dirserv_set_routerstatus_testing(rs_b); + tt_int_op(mock_get_options_calls, OP_EQ, 1); + + tt_uint_op(rs_b->is_exit, OP_EQ, 0); + tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0); + tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0); + + /* Check the empty routerset doesn't modify any flags + * on A or B without Strict set */ + reset_options(mock_options, &mock_get_options_calls); + reset_routerstatus(rs_a, ROUTER_A_ID_STR, ROUTER_A_IPV4); + reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); + + mock_options->TestingDirAuthVoteExit = routerset_none; + mock_options->TestingDirAuthVoteExitIsStrict = 0; + mock_options->TestingDirAuthVoteGuard = routerset_none; + mock_options->TestingDirAuthVoteGuardIsStrict = 0; + mock_options->TestingDirAuthVoteHSDir = routerset_none; + mock_options->TestingDirAuthVoteHSDirIsStrict = 0; + + rs_b->is_exit = 1; + rs_b->is_possible_guard = 1; + rs_b->is_hs_dir = 1; + + dirserv_set_routerstatus_testing(rs_a); + tt_int_op(mock_get_options_calls, OP_EQ, 1); + dirserv_set_routerstatus_testing(rs_b); + tt_int_op(mock_get_options_calls, OP_EQ, 2); + + tt_uint_op(rs_a->is_exit, OP_EQ, 0); + tt_uint_op(rs_a->is_possible_guard, OP_EQ, 0); + tt_uint_op(rs_a->is_hs_dir, OP_EQ, 0); + tt_uint_op(rs_b->is_exit, OP_EQ, 1); + tt_uint_op(rs_b->is_possible_guard, OP_EQ, 1); + tt_uint_op(rs_b->is_hs_dir, OP_EQ, 1); + + done: + tor_free(mock_options); + mock_options = NULL; + + UNMOCK(get_options); + + routerset_free(routerset_all); + routerset_free(routerset_a); + routerset_free(routerset_none); + + tor_free(rs_a); + tor_free(rs_b); +} + +static void +test_dir_http_handling(void *args) +{ + char *url = NULL; + (void)args; + + /* Parse http url tests: */ + /* Good headers */ + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1\r\n" + "Host: example.com\r\n" + "User-Agent: Mozilla/5.0 (Windows;" + " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", + &url),OP_EQ, 0); + tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); + tor_free(url); + + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.0\r\n", &url),OP_EQ, 0); + tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); + tor_free(url); + + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.600\r\n", &url), + OP_EQ, 0); + tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); + tor_free(url); + + /* Should prepend '/tor/' to url if required */ + tt_int_op(parse_http_url("GET /a/b/c.txt HTTP/1.1\r\n" + "Host: example.com\r\n" + "User-Agent: Mozilla/5.0 (Windows;" + " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", + &url),OP_EQ, 0); + tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); + tor_free(url); + + /* Bad headers -- no HTTP/1.x*/ + tt_int_op(parse_http_url("GET /a/b/c.txt\r\n" + "Host: example.com\r\n" + "User-Agent: Mozilla/5.0 (Windows;" + " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", + &url),OP_EQ, -1); + tt_ptr_op(url, OP_EQ, NULL); + + /* Bad headers */ + tt_int_op(parse_http_url("GET /a/b/c.txt\r\n" + "Host: example.com\r\n" + "User-Agent: Mozilla/5.0 (Windows;" + " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", + &url),OP_EQ, -1); + tt_ptr_op(url, OP_EQ, NULL); + + tt_int_op(parse_http_url("GET /tor/a/b/c.txt", &url),OP_EQ, -1); + tt_ptr_op(url, OP_EQ, NULL); + + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1", &url),OP_EQ, -1); + tt_ptr_op(url, OP_EQ, NULL); + + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1x\r\n", &url), + OP_EQ, -1); + tt_ptr_op(url, OP_EQ, NULL); + + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.", &url),OP_EQ, -1); + tt_ptr_op(url, OP_EQ, NULL); + + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.\r", &url),OP_EQ, -1); + tt_ptr_op(url, OP_EQ, NULL); + + done: + tor_free(url); +} + +static void +test_dir_purpose_needs_anonymity_returns_true_by_default(void *arg) +{ + (void)arg; + + tor_capture_bugs_(1); + setup_full_capture_of_logs(LOG_WARN); + tt_int_op(1, OP_EQ, purpose_needs_anonymity(0, 0, NULL)); + tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); + expect_single_log_msg_containing("Called with dir_purpose=0"); + + tor_end_capture_bugs_(); + done: + tor_end_capture_bugs_(); + teardown_capture_of_logs(); +} + +static void +test_dir_purpose_needs_anonymity_returns_true_for_bridges(void *arg) +{ + (void)arg; + + tt_int_op(1, OP_EQ, purpose_needs_anonymity(0, ROUTER_PURPOSE_BRIDGE, NULL)); + tt_int_op(1, OP_EQ, purpose_needs_anonymity(0, ROUTER_PURPOSE_BRIDGE, + "foobar")); + tt_int_op(1, OP_EQ, + purpose_needs_anonymity(DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2, + ROUTER_PURPOSE_BRIDGE, NULL)); + done: ; +} + +static void +test_dir_purpose_needs_anonymity_returns_false_for_own_bridge_desc(void *arg) +{ + (void)arg; + tt_int_op(0, OP_EQ, purpose_needs_anonymity(DIR_PURPOSE_FETCH_SERVERDESC, + ROUTER_PURPOSE_BRIDGE, + "authority.z")); + done: ; +} + +static void +test_dir_purpose_needs_anonymity_returns_true_for_sensitive_purpose(void *arg) +{ + (void)arg; + + tt_int_op(1, OP_EQ, purpose_needs_anonymity( + DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2, + ROUTER_PURPOSE_GENERAL, NULL)); + tt_int_op(1, OP_EQ, purpose_needs_anonymity( + DIR_PURPOSE_UPLOAD_RENDDESC_V2, 0, NULL)); + tt_int_op(1, OP_EQ, purpose_needs_anonymity( + DIR_PURPOSE_FETCH_RENDDESC_V2, 0, NULL)); + done: ; +} + +static void +test_dir_purpose_needs_anonymity_ret_false_for_non_sensitive_conn(void *arg) +{ + (void)arg; + + tt_int_op(0, OP_EQ, purpose_needs_anonymity(DIR_PURPOSE_UPLOAD_DIR, + ROUTER_PURPOSE_GENERAL, NULL)); + tt_int_op(0, OP_EQ, + purpose_needs_anonymity(DIR_PURPOSE_UPLOAD_VOTE, 0, NULL)); + tt_int_op(0, OP_EQ, + purpose_needs_anonymity(DIR_PURPOSE_UPLOAD_SIGNATURES, 0, NULL)); + tt_int_op(0, OP_EQ, + purpose_needs_anonymity(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL)); + tt_int_op(0, OP_EQ, purpose_needs_anonymity( + DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, NULL)); + tt_int_op(0, OP_EQ, + purpose_needs_anonymity(DIR_PURPOSE_FETCH_CONSENSUS, 0, NULL)); + tt_int_op(0, OP_EQ, + purpose_needs_anonymity(DIR_PURPOSE_FETCH_CERTIFICATE, 0, NULL)); + tt_int_op(0, OP_EQ, + purpose_needs_anonymity(DIR_PURPOSE_FETCH_SERVERDESC, 0, NULL)); + tt_int_op(0, OP_EQ, + purpose_needs_anonymity(DIR_PURPOSE_FETCH_EXTRAINFO, 0, NULL)); + tt_int_op(0, OP_EQ, + purpose_needs_anonymity(DIR_PURPOSE_FETCH_MICRODESC, 0, NULL)); + done: ; +} + +static void +test_dir_fetch_type(void *arg) +{ + (void)arg; + + tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_EXTRAINFO, ROUTER_PURPOSE_BRIDGE, + NULL), OP_EQ, EXTRAINFO_DIRINFO | BRIDGE_DIRINFO); + tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_EXTRAINFO, ROUTER_PURPOSE_GENERAL, + NULL), OP_EQ, EXTRAINFO_DIRINFO | V3_DIRINFO); + + tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_SERVERDESC, ROUTER_PURPOSE_BRIDGE, + NULL), OP_EQ, BRIDGE_DIRINFO); + tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_SERVERDESC, + ROUTER_PURPOSE_GENERAL, NULL), OP_EQ, V3_DIRINFO); + + tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_STATUS_VOTE, + ROUTER_PURPOSE_GENERAL, NULL), OP_EQ, V3_DIRINFO); + tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, + ROUTER_PURPOSE_GENERAL, NULL), OP_EQ, V3_DIRINFO); + tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_CERTIFICATE, + ROUTER_PURPOSE_GENERAL, NULL), OP_EQ, V3_DIRINFO); + + tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_CONSENSUS, ROUTER_PURPOSE_GENERAL, + "microdesc"), OP_EQ, V3_DIRINFO|MICRODESC_DIRINFO); + tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_CONSENSUS, ROUTER_PURPOSE_GENERAL, + NULL), OP_EQ, V3_DIRINFO); + + tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_MICRODESC, ROUTER_PURPOSE_GENERAL, + NULL), OP_EQ, MICRODESC_DIRINFO); + + /* This will give a warning, because this function isn't supposed to be + * used for HS descriptors. */ + setup_full_capture_of_logs(LOG_WARN); + tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_RENDDESC_V2, + ROUTER_PURPOSE_GENERAL, NULL), OP_EQ, NO_DIRINFO); + expect_single_log_msg_containing("Unexpected purpose"); + done: + teardown_capture_of_logs(); +} + +static void +test_dir_packages(void *arg) +{ + smartlist_t *votes = smartlist_new(); + char *res = NULL; + (void)arg; + +#define BAD(s) \ + tt_int_op(0, OP_EQ, validate_recommended_package_line(s)); +#define GOOD(s) \ + tt_int_op(1, OP_EQ, validate_recommended_package_line(s)); + GOOD("tor 0.2.6.3-alpha " + "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz " + "sha256=sssdlkfjdsklfjdskfljasdklfj"); + GOOD("tor 0.2.6.3-alpha " + "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz " + "sha256=sssdlkfjdsklfjdskfljasdklfj blake2b=fred"); + BAD("tor 0.2.6.3-alpha " + "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz " + "sha256=sssdlkfjdsklfjdskfljasdklfj="); + BAD("tor 0.2.6.3-alpha " + "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz " + "sha256=sssdlkfjdsklfjdskfljasdklfj blake2b"); + BAD("tor 0.2.6.3-alpha " + "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz "); + BAD("tor 0.2.6.3-alpha " + "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz"); + BAD("tor 0.2.6.3-alpha "); + BAD("tor 0.2.6.3-alpha"); + BAD("tor "); + BAD("tor"); + BAD(""); + BAD("=foobar sha256=" + "3c179f46ca77069a6a0bac70212a9b3b838b2f66129cb52d568837fc79d8fcc7"); + BAD("= = sha256=" + "3c179f46ca77069a6a0bac70212a9b3b838b2f66129cb52d568837fc79d8fcc7"); + + BAD("sha512= sha256=" + "3c179f46ca77069a6a0bac70212a9b3b838b2f66129cb52d568837fc79d8fcc7"); + + smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); + smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); + smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); + smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); + smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); + smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); + SMARTLIST_FOREACH(votes, networkstatus_t *, ns, + ns->package_lines = smartlist_new()); + +#define ADD(i, s) \ + smartlist_add(((networkstatus_t*)smartlist_get(votes, (i)))->package_lines, \ + (void*)(s)); + + /* Only one vote for this one. */ + ADD(4, "cisco 99z http://foobar.example.com/ sha256=blahblah"); + + /* Only two matching entries for this one, but 3 voters */ + ADD(1, "mystic 99y http://barfoo.example.com/ sha256=blahblah"); + ADD(3, "mystic 99y http://foobar.example.com/ sha256=blahblah"); + ADD(4, "mystic 99y http://foobar.example.com/ sha256=blahblah"); + + /* Only two matching entries for this one, but at least 4 voters */ + ADD(1, "mystic 99p http://barfoo.example.com/ sha256=ggggggg"); + ADD(3, "mystic 99p http://foobar.example.com/ sha256=blahblah"); + ADD(4, "mystic 99p http://foobar.example.com/ sha256=blahblah"); + ADD(5, "mystic 99p http://foobar.example.com/ sha256=ggggggg"); + + /* This one has only invalid votes. */ + ADD(0, "haffenreffer 1.2 http://foobar.example.com/ sha256"); + ADD(1, "haffenreffer 1.2 http://foobar.example.com/ "); + ADD(2, "haffenreffer 1.2 "); + ADD(3, "haffenreffer "); + ADD(4, "haffenreffer"); + + /* Three matching votes for this; it should actually go in! */ + ADD(2, "element 0.66.1 http://quux.example.com/ sha256=abcdef"); + ADD(3, "element 0.66.1 http://quux.example.com/ sha256=abcdef"); + ADD(4, "element 0.66.1 http://quux.example.com/ sha256=abcdef"); + ADD(1, "element 0.66.1 http://quum.example.com/ sha256=abcdef"); + ADD(0, "element 0.66.1 http://quux.example.com/ sha256=abcde"); + + /* Three votes for A, three votes for B */ + ADD(0, "clownshoes 22alpha1 http://quumble.example.com/ blake2=foob"); + ADD(1, "clownshoes 22alpha1 http://quumble.example.com/ blake2=foob"); + ADD(2, "clownshoes 22alpha1 http://quumble.example.com/ blake2=foob"); + ADD(3, "clownshoes 22alpha1 http://quumble.example.com/ blake2=fooz"); + ADD(4, "clownshoes 22alpha1 http://quumble.example.com/ blake2=fooz"); + ADD(5, "clownshoes 22alpha1 http://quumble.example.com/ blake2=fooz"); + + /* Three votes for A, two votes for B */ + ADD(1, "clownshoes 22alpha3 http://quumble.example.com/ blake2=foob"); + ADD(2, "clownshoes 22alpha3 http://quumble.example.com/ blake2=foob"); + ADD(3, "clownshoes 22alpha3 http://quumble.example.com/ blake2=fooz"); + ADD(4, "clownshoes 22alpha3 http://quumble.example.com/ blake2=fooz"); + ADD(5, "clownshoes 22alpha3 http://quumble.example.com/ blake2=fooz"); + + /* Four votes for A, two for B. */ + ADD(0, "clownshoes 22alpha4 http://quumble.example.com/ blake2=foob"); + ADD(1, "clownshoes 22alpha4 http://quumble.example.com/ blake2=foob"); + ADD(2, "clownshoes 22alpha4 http://quumble.example.cam/ blake2=fooa"); + ADD(3, "clownshoes 22alpha4 http://quumble.example.cam/ blake2=fooa"); + ADD(4, "clownshoes 22alpha4 http://quumble.example.cam/ blake2=fooa"); + ADD(5, "clownshoes 22alpha4 http://quumble.example.cam/ blake2=fooa"); + + /* Five votes for A ... all from the same authority. Three for B. */ + ADD(0, "cbc 99.1.11.1.1 http://example.com/cbc/ cubehash=ahooy sha512=m"); + ADD(1, "cbc 99.1.11.1.1 http://example.com/cbc/ cubehash=ahooy sha512=m"); + ADD(3, "cbc 99.1.11.1.1 http://example.com/cbc/ cubehash=ahooy sha512=m"); + ADD(2, "cbc 99.1.11.1.1 http://example.com/ cubehash=ahooy"); + ADD(2, "cbc 99.1.11.1.1 http://example.com/ cubehash=ahooy"); + ADD(2, "cbc 99.1.11.1.1 http://example.com/ cubehash=ahooy"); + ADD(2, "cbc 99.1.11.1.1 http://example.com/ cubehash=ahooy"); + ADD(2, "cbc 99.1.11.1.1 http://example.com/ cubehash=ahooy"); + + /* As above but new replaces old: no two match. */ + ADD(0, "cbc 99.1.11.1.2 http://example.com/cbc/ cubehash=ahooy sha512=m"); + ADD(1, "cbc 99.1.11.1.2 http://example.com/cbc/ cubehash=ahooy sha512=m"); + ADD(1, "cbc 99.1.11.1.2 http://example.com/cbc/x cubehash=ahooy sha512=m"); + ADD(2, "cbc 99.1.11.1.2 http://example.com/cbc/ cubehash=ahooy sha512=m"); + ADD(2, "cbc 99.1.11.1.2 http://example.com/ cubehash=ahooy"); + ADD(2, "cbc 99.1.11.1.2 http://example.com/ cubehash=ahooy"); + ADD(2, "cbc 99.1.11.1.2 http://example.com/ cubehash=ahooy"); + ADD(2, "cbc 99.1.11.1.2 http://example.com/ cubehash=ahooy"); + ADD(2, "cbc 99.1.11.1.2 http://example.com/ cubehash=ahooy"); + + res = compute_consensus_package_lines(votes); + tt_assert(res); + tt_str_op(res, OP_EQ, + "package cbc 99.1.11.1.1 http://example.com/cbc/ cubehash=ahooy sha512=m\n" + "package clownshoes 22alpha3 http://quumble.example.com/ blake2=fooz\n" + "package clownshoes 22alpha4 http://quumble.example.cam/ blake2=fooa\n" + "package element 0.66.1 http://quux.example.com/ sha256=abcdef\n" + "package mystic 99y http://foobar.example.com/ sha256=blahblah\n" + ); + +#undef ADD +#undef BAD +#undef GOOD + done: + SMARTLIST_FOREACH(votes, networkstatus_t *, ns, + { smartlist_free(ns->package_lines); tor_free(ns); }); + smartlist_free(votes); + tor_free(res); +} + +static void +test_dir_download_status_schedule(void *arg) +{ + (void)arg; + download_status_t dls_failure = { 0, 0, 0, DL_SCHED_GENERIC, + DL_WANT_AUTHORITY, + DL_SCHED_INCREMENT_FAILURE, + DL_SCHED_DETERMINISTIC, 0, 0 }; + download_status_t dls_attempt = { 0, 0, 0, DL_SCHED_CONSENSUS, + DL_WANT_ANY_DIRSERVER, + DL_SCHED_INCREMENT_ATTEMPT, + DL_SCHED_DETERMINISTIC, 0, 0 }; + download_status_t dls_bridge = { 0, 0, 0, DL_SCHED_BRIDGE, + DL_WANT_AUTHORITY, + DL_SCHED_INCREMENT_FAILURE, + DL_SCHED_DETERMINISTIC, 0, 0 }; + int increment = -1; + int expected_increment = -1; + time_t current_time = time(NULL); + int delay1 = -1; + int delay2 = -1; + smartlist_t *schedule = smartlist_new(); + + /* Make a dummy schedule */ + smartlist_add(schedule, (void *)&delay1); + smartlist_add(schedule, (void *)&delay2); + + /* check a range of values */ + delay1 = 1000; + increment = download_status_schedule_get_delay(&dls_failure, + schedule, + 0, INT_MAX, + TIME_MIN); + expected_increment = delay1; + tt_assert(increment == expected_increment); + tt_assert(dls_failure.next_attempt_at == TIME_MIN + expected_increment); + + delay1 = INT_MAX; + increment = download_status_schedule_get_delay(&dls_failure, + schedule, + 0, INT_MAX, + -1); + expected_increment = delay1; + tt_assert(increment == expected_increment); + tt_assert(dls_failure.next_attempt_at == TIME_MAX); + + delay1 = 0; + increment = download_status_schedule_get_delay(&dls_attempt, + schedule, + 0, INT_MAX, + 0); + expected_increment = delay1; + tt_assert(increment == expected_increment); + tt_assert(dls_attempt.next_attempt_at == 0 + expected_increment); + + delay1 = 1000; + increment = download_status_schedule_get_delay(&dls_attempt, + schedule, + 0, INT_MAX, + 1); + expected_increment = delay1; + tt_assert(increment == expected_increment); + tt_assert(dls_attempt.next_attempt_at == 1 + expected_increment); + + delay1 = INT_MAX; + increment = download_status_schedule_get_delay(&dls_bridge, + schedule, + 0, INT_MAX, + current_time); + expected_increment = delay1; + tt_assert(increment == expected_increment); + tt_assert(dls_bridge.next_attempt_at == TIME_MAX); + + delay1 = 1; + increment = download_status_schedule_get_delay(&dls_bridge, + schedule, + 0, INT_MAX, + TIME_MAX); + expected_increment = delay1; + tt_assert(increment == expected_increment); + tt_assert(dls_bridge.next_attempt_at == TIME_MAX); + + /* see what happens when we reach the end */ + dls_attempt.n_download_attempts++; + dls_bridge.n_download_failures++; + + delay2 = 100; + increment = download_status_schedule_get_delay(&dls_attempt, + schedule, + 0, INT_MAX, + current_time); + expected_increment = delay2; + tt_assert(increment == expected_increment); + tt_assert(dls_attempt.next_attempt_at == current_time + delay2); + + delay2 = 1; + increment = download_status_schedule_get_delay(&dls_bridge, + schedule, + 0, INT_MAX, + current_time); + expected_increment = delay2; + tt_assert(increment == expected_increment); + tt_assert(dls_bridge.next_attempt_at == current_time + delay2); + + /* see what happens when we try to go off the end */ + dls_attempt.n_download_attempts++; + dls_bridge.n_download_failures++; + + delay2 = 5; + increment = download_status_schedule_get_delay(&dls_attempt, + schedule, + 0, INT_MAX, + current_time); + expected_increment = delay2; + tt_assert(increment == expected_increment); + tt_assert(dls_attempt.next_attempt_at == current_time + delay2); + + delay2 = 17; + increment = download_status_schedule_get_delay(&dls_bridge, + schedule, + 0, INT_MAX, + current_time); + expected_increment = delay2; + tt_assert(increment == expected_increment); + tt_assert(dls_bridge.next_attempt_at == current_time + delay2); + + /* see what happens when we reach IMPOSSIBLE_TO_DOWNLOAD */ + dls_attempt.n_download_attempts = IMPOSSIBLE_TO_DOWNLOAD; + dls_bridge.n_download_failures = IMPOSSIBLE_TO_DOWNLOAD; + + delay2 = 35; + increment = download_status_schedule_get_delay(&dls_attempt, + schedule, + 0, INT_MAX, + current_time); + expected_increment = INT_MAX; + tt_assert(increment == expected_increment); + tt_assert(dls_attempt.next_attempt_at == TIME_MAX); + + delay2 = 99; + increment = download_status_schedule_get_delay(&dls_bridge, + schedule, + 0, INT_MAX, + current_time); + expected_increment = INT_MAX; + tt_assert(increment == expected_increment); + tt_assert(dls_bridge.next_attempt_at == TIME_MAX); + + done: + /* the pointers in schedule are allocated on the stack */ + smartlist_free(schedule); +} + +static void +download_status_random_backoff_helper(int min_delay, int max_delay) +{ + download_status_t dls_random = + { 0, 0, 0, DL_SCHED_GENERIC, DL_WANT_AUTHORITY, + DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }; + int increment = -1; + int old_increment = -1; + time_t current_time = time(NULL); + + /* Check the random backoff cases */ + int n_attempts = 0; + do { + increment = download_status_schedule_get_delay(&dls_random, + NULL, + min_delay, max_delay, + current_time); + + log_debug(LD_DIR, "Min: %d, Max: %d, Inc: %d, Old Inc: %d", + min_delay, max_delay, increment, old_increment); + + /* Regression test for 20534 and friends + * increment must always increase after the first */ + if (dls_random.last_backoff_position > 0 && max_delay > 0) { + /* Always increment the exponential backoff */ + tt_int_op(increment, OP_GE, 1); + } + + /* Test */ + tt_int_op(increment, OP_GE, min_delay); + tt_int_op(increment, OP_LE, max_delay); + + /* Advance */ + if (dls_random.n_download_attempts < IMPOSSIBLE_TO_DOWNLOAD - 1) { + ++(dls_random.n_download_attempts); + ++(dls_random.n_download_failures); + } + + /* Try another maybe */ + old_increment = increment; + } while (increment < max_delay && ++n_attempts < 1000); + + done: + return; +} + +static void +test_dir_download_status_random_backoff(void *arg) +{ + (void)arg; + + /* Do a standard test */ + download_status_random_backoff_helper(0, 1000000); + /* Regression test for 20534 and friends: + * try tighter bounds */ + download_status_random_backoff_helper(0, 100); + /* regression tests for 17750: initial delay */ + download_status_random_backoff_helper(10, 1000); + download_status_random_backoff_helper(20, 30); + + /* Pathological cases */ + download_status_random_backoff_helper(0, 0); + download_status_random_backoff_helper(1, 1); + download_status_random_backoff_helper(0, INT_MAX); + download_status_random_backoff_helper(INT_MAX/2, INT_MAX); +} + +static void +test_dir_download_status_random_backoff_ranges(void *arg) +{ + (void)arg; + int lo, hi; + next_random_exponential_delay_range(&lo, &hi, 0, 10); + tt_int_op(lo, OP_EQ, 10); + tt_int_op(hi, OP_EQ, 11); + + next_random_exponential_delay_range(&lo, &hi, 6, 10); + tt_int_op(lo, OP_EQ, 10); + tt_int_op(hi, OP_EQ, 6*3); + + next_random_exponential_delay_range(&lo, &hi, 13, 10); + tt_int_op(lo, OP_EQ, 10); + tt_int_op(hi, OP_EQ, 13 * 3); + + next_random_exponential_delay_range(&lo, &hi, 37, 10); + tt_int_op(lo, OP_EQ, 10); + tt_int_op(hi, OP_EQ, 111); + + next_random_exponential_delay_range(&lo, &hi, 123, 10); + tt_int_op(lo, OP_EQ, 10); + tt_int_op(hi, OP_EQ, 369); + + next_random_exponential_delay_range(&lo, &hi, INT_MAX-5, 10); + tt_int_op(lo, OP_EQ, 10); + tt_int_op(hi, OP_EQ, INT_MAX); + done: + ; +} + +static void +test_dir_download_status_increment(void *arg) +{ + (void)arg; + download_status_t dls_failure = { 0, 0, 0, DL_SCHED_GENERIC, + DL_WANT_AUTHORITY, + DL_SCHED_INCREMENT_FAILURE, + DL_SCHED_DETERMINISTIC, 0, 0 }; + download_status_t dls_attempt = { 0, 0, 0, DL_SCHED_BRIDGE, + DL_WANT_ANY_DIRSERVER, + DL_SCHED_INCREMENT_ATTEMPT, + DL_SCHED_DETERMINISTIC, 0, 0 }; + download_status_t dls_exp = { 0, 0, 0, DL_SCHED_GENERIC, + DL_WANT_ANY_DIRSERVER, + DL_SCHED_INCREMENT_ATTEMPT, + DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }; + int no_delay = 0; + int delay0 = -1; + int delay1 = -1; + int delay2 = -1; + smartlist_t *schedule = smartlist_new(); + smartlist_t *schedule_no_initial_delay = smartlist_new(); + or_options_t test_options; + time_t next_at = TIME_MAX; + time_t current_time = time(NULL); + + /* Provide some values for the schedules */ + delay0 = 10; + delay1 = 99; + delay2 = 20; + + /* Make the schedules */ + smartlist_add(schedule, (void *)&delay0); + smartlist_add(schedule, (void *)&delay1); + smartlist_add(schedule, (void *)&delay2); + + smartlist_add(schedule_no_initial_delay, (void *)&no_delay); + smartlist_add(schedule_no_initial_delay, (void *)&delay1); + smartlist_add(schedule_no_initial_delay, (void *)&delay2); + + /* Put it in the options */ + mock_options = &test_options; + reset_options(mock_options, &mock_get_options_calls); + mock_options->TestingBridgeBootstrapDownloadSchedule = schedule; + mock_options->TestingClientDownloadSchedule = schedule; + + MOCK(get_options, mock_get_options); + + /* Check that the initial value of the schedule is the first value used, + * whether or not it was reset before being used */ + + /* regression test for 17750: no initial delay */ + mock_options->TestingClientDownloadSchedule = schedule_no_initial_delay; + mock_get_options_calls = 0; + /* we really want to test that it's equal to time(NULL) + delay0, but that's + * an unrealiable test, because time(NULL) might change. */ + tt_assert(download_status_get_next_attempt_at(&dls_failure) + >= current_time + no_delay); + tt_assert(download_status_get_next_attempt_at(&dls_failure) + != TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* regression test for 17750: initial delay */ + mock_options->TestingClientDownloadSchedule = schedule; + mock_get_options_calls = 0; + /* we really want to test that it's equal to time(NULL) + delay0, but that's + * an unrealiable test, because time(NULL) might change. */ + tt_assert(download_status_get_next_attempt_at(&dls_failure) + >= current_time + delay0); + tt_assert(download_status_get_next_attempt_at(&dls_failure) + != TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* regression test for 17750: exponential, no initial delay */ + mock_options->TestingClientDownloadSchedule = schedule_no_initial_delay; + mock_get_options_calls = 0; + /* we really want to test that it's equal to time(NULL) + delay0, but that's + * an unrealiable test, because time(NULL) might change. */ + tt_assert(download_status_get_next_attempt_at(&dls_exp) + >= current_time + no_delay); + tt_assert(download_status_get_next_attempt_at(&dls_exp) + != TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_exp), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_exp), OP_EQ, 0); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* regression test for 17750: exponential, initial delay */ + mock_options->TestingClientDownloadSchedule = schedule; + mock_get_options_calls = 0; + /* we really want to test that it's equal to time(NULL) + delay0, but that's + * an unrealiable test, because time(NULL) might change. */ + tt_assert(download_status_get_next_attempt_at(&dls_exp) + >= current_time + delay0); + tt_assert(download_status_get_next_attempt_at(&dls_exp) + != TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_exp), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_exp), OP_EQ, 0); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* Check that a failure reset works */ + mock_get_options_calls = 0; + download_status_reset(&dls_failure); + /* we really want to test that it's equal to time(NULL) + delay0, but that's + * an unrealiable test, because time(NULL) might change. */ + tt_assert(download_status_get_next_attempt_at(&dls_failure) + >= current_time + delay0); + tt_assert(download_status_get_next_attempt_at(&dls_failure) + != TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* avoid timing inconsistencies */ + dls_failure.next_attempt_at = current_time + delay0; + + /* check that a reset schedule becomes ready at the right time */ + tt_int_op(download_status_is_ready(&dls_failure, + current_time + delay0 - 1, 1), + OP_EQ, 0); + tt_int_op(download_status_is_ready(&dls_failure, + current_time + delay0, 1), + OP_EQ, 1); + tt_int_op(download_status_is_ready(&dls_failure, + current_time + delay0 + 1, 1), + OP_EQ, 1); + + /* Check that a failure increment works */ + mock_get_options_calls = 0; + next_at = download_status_increment_failure(&dls_failure, 404, "test", 0, + current_time); + tt_assert(next_at == current_time + delay1); + tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 1); + tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 1); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* check that an incremented schedule becomes ready at the right time */ + tt_int_op(download_status_is_ready(&dls_failure, + current_time + delay1 - 1, 1), + OP_EQ, 0); + tt_int_op(download_status_is_ready(&dls_failure, + current_time + delay1, 1), + OP_EQ, 1); + tt_int_op(download_status_is_ready(&dls_failure, + current_time + delay1 + 1, 1), + OP_EQ, 1); + + /* check that a schedule isn't ready if it's had too many failures */ + tt_int_op(download_status_is_ready(&dls_failure, + current_time + delay1 + 10, 0), + OP_EQ, 0); + + /* Check that failure increments do happen on 503 for clients, and + * attempt increments do too. */ + mock_get_options_calls = 0; + next_at = download_status_increment_failure(&dls_failure, 503, "test", 0, + current_time); + tt_i64_op(next_at, OP_EQ, current_time + delay2); + tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 2); + tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 2); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* Check that failure increments do happen on 503 for servers */ + mock_get_options_calls = 0; + next_at = download_status_increment_failure(&dls_failure, 503, "test", 1, + current_time); + tt_assert(next_at == current_time + delay2); + tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 3); + tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 3); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* Check what happens when we run off the end of the schedule */ + mock_get_options_calls = 0; + next_at = download_status_increment_failure(&dls_failure, 404, "test", 0, + current_time); + tt_assert(next_at == current_time + delay2); + tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 4); + tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 4); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* Check what happens when we hit the failure limit */ + mock_get_options_calls = 0; + download_status_mark_impossible(&dls_failure); + next_at = download_status_increment_failure(&dls_failure, 404, "test", 0, + current_time); + tt_assert(next_at == TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, + IMPOSSIBLE_TO_DOWNLOAD); + tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, + IMPOSSIBLE_TO_DOWNLOAD); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* Check that a failure reset doesn't reset at the limit */ + mock_get_options_calls = 0; + download_status_reset(&dls_failure); + tt_assert(download_status_get_next_attempt_at(&dls_failure) + == TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, + IMPOSSIBLE_TO_DOWNLOAD); + tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, + IMPOSSIBLE_TO_DOWNLOAD); + tt_int_op(mock_get_options_calls, OP_EQ, 0); + + /* Check that a failure reset resets just before the limit */ + mock_get_options_calls = 0; + dls_failure.n_download_failures = IMPOSSIBLE_TO_DOWNLOAD - 1; + dls_failure.n_download_attempts = IMPOSSIBLE_TO_DOWNLOAD - 1; + download_status_reset(&dls_failure); + /* we really want to test that it's equal to time(NULL) + delay0, but that's + * an unrealiable test, because time(NULL) might change. */ + tt_assert(download_status_get_next_attempt_at(&dls_failure) + >= current_time + delay0); + tt_assert(download_status_get_next_attempt_at(&dls_failure) + != TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* Check that failure increments do happen on attempt-based schedules, + * but that the retry is set at the end of time */ + mock_options->UseBridges = 1; + mock_get_options_calls = 0; + next_at = download_status_increment_failure(&dls_attempt, 404, "test", 0, + current_time); + tt_assert(next_at == TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 1); + tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 0); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* Check that an attempt reset works */ + mock_get_options_calls = 0; + download_status_reset(&dls_attempt); + /* we really want to test that it's equal to time(NULL) + delay0, but that's + * an unrealiable test, because time(NULL) might change. */ + tt_assert(download_status_get_next_attempt_at(&dls_attempt) + >= current_time + delay0); + tt_assert(download_status_get_next_attempt_at(&dls_attempt) + != TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 0); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* avoid timing inconsistencies */ + dls_attempt.next_attempt_at = current_time + delay0; + + /* check that a reset schedule becomes ready at the right time */ + tt_int_op(download_status_is_ready(&dls_attempt, + current_time + delay0 - 1, 1), + OP_EQ, 0); + tt_int_op(download_status_is_ready(&dls_attempt, + current_time + delay0, 1), + OP_EQ, 1); + tt_int_op(download_status_is_ready(&dls_attempt, + current_time + delay0 + 1, 1), + OP_EQ, 1); + + /* Check that an attempt increment works */ + mock_get_options_calls = 0; + next_at = download_status_increment_attempt(&dls_attempt, "test", + current_time); + tt_assert(next_at == current_time + delay1); + tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 1); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* check that an incremented schedule becomes ready at the right time */ + tt_int_op(download_status_is_ready(&dls_attempt, + current_time + delay1 - 1, 1), + OP_EQ, 0); + tt_int_op(download_status_is_ready(&dls_attempt, + current_time + delay1, 1), + OP_EQ, 1); + tt_int_op(download_status_is_ready(&dls_attempt, + current_time + delay1 + 1, 1), + OP_EQ, 1); + + /* check that a schedule isn't ready if it's had too many attempts */ + tt_int_op(download_status_is_ready(&dls_attempt, + current_time + delay1 + 10, 0), + OP_EQ, 0); + + /* Check what happens when we reach then run off the end of the schedule */ + mock_get_options_calls = 0; + next_at = download_status_increment_attempt(&dls_attempt, "test", + current_time); + tt_assert(next_at == current_time + delay2); + tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 2); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + mock_get_options_calls = 0; + next_at = download_status_increment_attempt(&dls_attempt, "test", + current_time); + tt_assert(next_at == current_time + delay2); + tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 3); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* Check what happens when we hit the attempt limit */ + mock_get_options_calls = 0; + download_status_mark_impossible(&dls_attempt); + next_at = download_status_increment_attempt(&dls_attempt, "test", + current_time); + tt_assert(next_at == TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, + IMPOSSIBLE_TO_DOWNLOAD); + tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, + IMPOSSIBLE_TO_DOWNLOAD); + tt_int_op(mock_get_options_calls, OP_GE, 1); + + /* Check that an attempt reset doesn't reset at the limit */ + mock_get_options_calls = 0; + download_status_reset(&dls_attempt); + tt_assert(download_status_get_next_attempt_at(&dls_attempt) + == TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, + IMPOSSIBLE_TO_DOWNLOAD); + tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, + IMPOSSIBLE_TO_DOWNLOAD); + tt_int_op(mock_get_options_calls, OP_EQ, 0); + + /* Check that an attempt reset resets just before the limit */ + mock_get_options_calls = 0; + dls_attempt.n_download_failures = IMPOSSIBLE_TO_DOWNLOAD - 1; + dls_attempt.n_download_attempts = IMPOSSIBLE_TO_DOWNLOAD - 1; + download_status_reset(&dls_attempt); + /* we really want to test that it's equal to time(NULL) + delay0, but that's + * an unrealiable test, because time(NULL) might change. */ + tt_assert(download_status_get_next_attempt_at(&dls_attempt) + >= current_time + delay0); + tt_assert(download_status_get_next_attempt_at(&dls_attempt) + != TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 0); + tt_int_op(mock_get_options_calls, OP_GE, 1); + mock_options->UseBridges = 0; + + /* Check that attempt increments don't happen on failure-based schedules, + * and that the attempt is set at the end of time */ + mock_get_options_calls = 0; + setup_full_capture_of_logs(LOG_WARN); + next_at = download_status_increment_attempt(&dls_failure, "test", + current_time); + expect_single_log_msg_containing( + "Tried to launch an attempt-based connection on a failure-based " + "schedule."); + teardown_capture_of_logs(); + tt_assert(next_at == TIME_MAX); + tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0); + tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0); + tt_int_op(mock_get_options_calls, OP_EQ, 0); + + done: + /* the pointers in schedule are allocated on the stack */ + smartlist_free(schedule); + smartlist_free(schedule_no_initial_delay); + UNMOCK(get_options); + mock_options = NULL; + mock_get_options_calls = 0; + teardown_capture_of_logs(); +} + +static void +test_dir_authdir_type_to_string(void *data) +{ + (void)data; + char *res; + + tt_str_op(res = authdir_type_to_string(NO_DIRINFO), OP_EQ, + "[Not an authority]"); + tor_free(res); + + tt_str_op(res = authdir_type_to_string(EXTRAINFO_DIRINFO), OP_EQ, + "[Not an authority]"); + tor_free(res); + + tt_str_op(res = authdir_type_to_string(MICRODESC_DIRINFO), OP_EQ, + "[Not an authority]"); + tor_free(res); + + tt_str_op(res = authdir_type_to_string(V3_DIRINFO), OP_EQ, "V3"); + tor_free(res); + + tt_str_op(res = authdir_type_to_string(BRIDGE_DIRINFO), OP_EQ, "Bridge"); + tor_free(res); + + tt_str_op(res = authdir_type_to_string( + V3_DIRINFO | BRIDGE_DIRINFO | EXTRAINFO_DIRINFO), OP_EQ, + "V3, Bridge"); + done: + tor_free(res); +} + +static void +test_dir_conn_purpose_to_string(void *data) +{ + (void)data; + +#define EXPECT_CONN_PURPOSE(purpose, expected) \ + tt_str_op(dir_conn_purpose_to_string(purpose), OP_EQ, expected); + + EXPECT_CONN_PURPOSE(DIR_PURPOSE_UPLOAD_DIR, "server descriptor upload"); + EXPECT_CONN_PURPOSE(DIR_PURPOSE_UPLOAD_VOTE, "server vote upload"); + EXPECT_CONN_PURPOSE(DIR_PURPOSE_UPLOAD_SIGNATURES, + "consensus signature upload"); + EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_SERVERDESC, "server descriptor fetch"); + EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_EXTRAINFO, "extra-info fetch"); + EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_CONSENSUS, + "consensus network-status fetch"); + EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_CERTIFICATE, "authority cert fetch"); + EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_STATUS_VOTE, "status vote fetch"); + EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, + "consensus signature fetch"); + EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_RENDDESC_V2, + "hidden-service v2 descriptor fetch"); + EXPECT_CONN_PURPOSE(DIR_PURPOSE_UPLOAD_RENDDESC_V2, + "hidden-service v2 descriptor upload"); + EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_MICRODESC, "microdescriptor fetch"); + + /* This will give a warning, because there is no purpose 1024. */ + setup_full_capture_of_logs(LOG_WARN); + EXPECT_CONN_PURPOSE(1024, "(unknown)"); + expect_single_log_msg_containing("Called with unknown purpose 1024"); + + done: + teardown_capture_of_logs(); +} + +NS_DECL(int, +public_server_mode, (const or_options_t *options)); + +static int +NS(public_server_mode)(const or_options_t *options) +{ + (void)options; + + if (CALLED(public_server_mode)++ == 0) { + return 1; + } + + return 0; +} + +static void +test_dir_should_use_directory_guards(void *data) +{ + or_options_t *options; + char *errmsg = NULL; + (void)data; + + NS_MOCK(public_server_mode); + + options = options_new(); + options_init(options); + + tt_int_op(should_use_directory_guards(options), OP_EQ, 0); + tt_int_op(CALLED(public_server_mode), OP_EQ, 1); + + options->UseEntryGuards = 1; + options->DownloadExtraInfo = 0; + options->FetchDirInfoEarly = 0; + options->FetchDirInfoExtraEarly = 0; + options->FetchUselessDescriptors = 0; + tt_int_op(should_use_directory_guards(options), OP_EQ, 1); + tt_int_op(CALLED(public_server_mode), OP_EQ, 2); + + options->UseEntryGuards = 0; + tt_int_op(should_use_directory_guards(options), OP_EQ, 0); + tt_int_op(CALLED(public_server_mode), OP_EQ, 3); + options->UseEntryGuards = 1; + + options->DownloadExtraInfo = 1; + tt_int_op(should_use_directory_guards(options), OP_EQ, 0); + tt_int_op(CALLED(public_server_mode), OP_EQ, 4); + options->DownloadExtraInfo = 0; + + options->FetchDirInfoEarly = 1; + tt_int_op(should_use_directory_guards(options), OP_EQ, 0); + tt_int_op(CALLED(public_server_mode), OP_EQ, 5); + options->FetchDirInfoEarly = 0; + + options->FetchDirInfoExtraEarly = 1; + tt_int_op(should_use_directory_guards(options), OP_EQ, 0); + tt_int_op(CALLED(public_server_mode), OP_EQ, 6); + options->FetchDirInfoExtraEarly = 0; + + options->FetchUselessDescriptors = 1; + tt_int_op(should_use_directory_guards(options), OP_EQ, 0); + tt_int_op(CALLED(public_server_mode), OP_EQ, 7); + options->FetchUselessDescriptors = 0; + + done: + NS_UNMOCK(public_server_mode); + or_options_free(options); + tor_free(errmsg); +} + +NS_DECL(void, +directory_initiate_request, (directory_request_t *req)); + +static void +test_dir_should_not_init_request_to_ourselves(void *data) +{ + char digest[DIGEST_LEN]; + dir_server_t *ourself = NULL; + crypto_pk_t *key = pk_generate(2); + (void) data; + + NS_MOCK(directory_initiate_request); + + clear_dir_servers(); + routerlist_free_all(); + + set_server_identity_key(key); + crypto_pk_get_digest(key, (char*) &digest); + ourself = trusted_dir_server_new("ourself", "127.0.0.1", 9059, 9060, + NULL, digest, + NULL, V3_DIRINFO, 1.0); + + tt_assert(ourself); + dir_server_add(ourself); + + directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); + + directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, + NULL); + + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); + + done: + NS_UNMOCK(directory_initiate_request); + clear_dir_servers(); + routerlist_free_all(); + crypto_pk_free(key); +} + +static void +test_dir_should_not_init_request_to_dir_auths_without_v3_info(void *data) +{ + dir_server_t *ds = NULL; + dirinfo_type_t dirinfo_type = BRIDGE_DIRINFO | EXTRAINFO_DIRINFO \ + | MICRODESC_DIRINFO; + (void) data; + + NS_MOCK(directory_initiate_request); + + clear_dir_servers(); + routerlist_free_all(); + + ds = trusted_dir_server_new("ds", "10.0.0.1", 9059, 9060, NULL, + "12345678901234567890", NULL, dirinfo_type, 1.0); + tt_assert(ds); + dir_server_add(ds); + + directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); + + directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, + NULL); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); + + done: + NS_UNMOCK(directory_initiate_request); + clear_dir_servers(); + routerlist_free_all(); +} + +static void +test_dir_should_init_request_to_dir_auths(void *data) +{ + dir_server_t *ds = NULL; + (void) data; + + NS_MOCK(directory_initiate_request); + + clear_dir_servers(); + routerlist_free_all(); + + ds = trusted_dir_server_new("ds", "10.0.0.1", 9059, 9060, NULL, + "12345678901234567890", NULL, V3_DIRINFO, 1.0); + tt_assert(ds); + dir_server_add(ds); + + directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 1); + + directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, + NULL); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 2); + + done: + NS_UNMOCK(directory_initiate_request); + clear_dir_servers(); + routerlist_free_all(); +} + +void +NS(directory_initiate_request)(directory_request_t *req) +{ + (void)req; + CALLED(directory_initiate_request)++; +} + +static void +test_dir_choose_compression_level(void* data) +{ + (void)data; + + /* It starts under_memory_pressure */ + tt_int_op(have_been_under_memory_pressure(), OP_EQ, 1); + + tt_assert(HIGH_COMPRESSION == choose_compression_level(-1)); + tt_assert(LOW_COMPRESSION == choose_compression_level(1024-1)); + tt_assert(MEDIUM_COMPRESSION == choose_compression_level(2048-1)); + tt_assert(HIGH_COMPRESSION == choose_compression_level(2048)); + + /* Reset under_memory_pressure timer */ + cell_queues_check_size(); + tt_int_op(have_been_under_memory_pressure(), OP_EQ, 0); + + tt_assert(HIGH_COMPRESSION == choose_compression_level(-1)); + tt_assert(HIGH_COMPRESSION == choose_compression_level(1024-1)); + tt_assert(HIGH_COMPRESSION == choose_compression_level(2048-1)); + tt_assert(HIGH_COMPRESSION == choose_compression_level(2048)); + + done: ; +} + +/* + * Mock check_private_dir(), and always succeed - no need to actually + * look at or create anything on the filesystem. + */ + +static int +mock_check_private_dir(const char *dirname, cpd_check_t check, + const char *effective_user) +{ + (void)dirname; + (void)check; + (void)effective_user; + + return 0; +} + +/* + * This really mocks options_get_datadir_fname2_suffix(), but for testing + * dump_desc(), we only care about get_datadir_fname(sub1), which is defined + * in config.h as: + * + * options_get_datadir_fname2_suffix(get_options(), sub1, NULL, NULL) + */ + +static char * +mock_get_datadir_fname(const or_options_t *options, + directory_root_t roottype, + const char *sub1, const char *sub2, + const char *suffix) +{ + (void) roottype; + char *rv = NULL; + + /* + * Assert we were called like get_datadir_fname2() or get_datadir_fname(), + * since that's all we implement here. + */ + tt_ptr_op(options, OP_NE, NULL); + tt_ptr_op(sub1, OP_NE, NULL); + /* + * No particular assertions about sub2, since we could be in the + * get_datadir_fname() or get_datadir_fname2() case. + */ + tt_ptr_op(suffix, OP_EQ, NULL); + + /* Just duplicate the basename and return it for this mock */ + if (sub2) { + /* If we have sub2, it's the basename, otherwise sub1 */ + rv = tor_strdup(sub2); + } else { + rv = tor_strdup(sub1); + } + + done: + return rv; +} + +static char *last_unlinked_path = NULL; +static int unlinked_count = 0; + +static void +mock_unlink_reset(void) +{ + tor_free(last_unlinked_path); + unlinked_count = 0; +} + +static int +mock_unlink(const char *path) +{ + tt_ptr_op(path, OP_NE, NULL); + + tor_free(last_unlinked_path); + last_unlinked_path = tor_strdup(path); + ++unlinked_count; + + done: + return 0; +} + +static char *last_write_str_path = NULL; +static uint8_t last_write_str_hash[DIGEST256_LEN]; +static int write_str_count = 0; + +static void +mock_write_str_to_file_reset(void) +{ + tor_free(last_write_str_path); + write_str_count = 0; +} + +static int +mock_write_str_to_file(const char *path, const char *str, int bin) +{ + size_t len; + uint8_t hash[DIGEST256_LEN]; + + (void)bin; + + tt_ptr_op(path, OP_NE, NULL); + tt_ptr_op(str, OP_NE, NULL); + + len = strlen(str); + crypto_digest256((char *)hash, str, len, DIGEST_SHA256); + + tor_free(last_write_str_path); + last_write_str_path = tor_strdup(path); + memcpy(last_write_str_hash, hash, sizeof(last_write_str_hash)); + ++write_str_count; + + done: + return 0; +} + +static void +test_dir_dump_unparseable_descriptors(void *data) +{ + /* + * These bogus descriptors look nothing at all like real bogus descriptors + * we might see, but we're only testing dump_desc() here, not the parser. + */ + const char *test_desc_type = "squamous"; + /* strlen(test_desc_1) = 583 bytes */ + const char *test_desc_1 = + "The most merciful thing in the world, I think, is the inability of the " + "human mind to correlate all its contents. We live on a placid island of" + " ignorance in the midst of black seas of infinity, and it was not meant" + " that we should voyage far. The sciences, each straining in its own dir" + "ection, have hitherto harmed us little; but some day the piecing togeth" + "er of dissociated knowledge will open up such terrifying vistas of real" + "ity, and of our frightful position therein, that we shall either go mad" + "from the revelation or flee from the light into the peace and safety of" + "a new dark age."; + uint8_t test_desc_1_hash[DIGEST256_LEN]; + char test_desc_1_hash_str[HEX_DIGEST256_LEN+1]; + /* strlen(test_desc_2) = 650 bytes */ + const char *test_desc_2 = + "I think their predominant colour was a greyish-green, though they had w" + "hite bellies. They were mostly shiny and slippery, but the ridges of th" + "eir backs were scaly. Their forms vaguely suggested the anthropoid, whi" + "le their heads were the heads of fish, with prodigious bulging eyes tha" + "t never closed. At the sides of their necks were palpitating gills, and" + "their long paws were webbed. They hopped irregularly, sometimes on two " + "legs and sometimes on four. I was somehow glad that they had no more th" + "an four limbs. Their croaking, baying voices, clearly wed tar articulat" + "e speech, held all the dark shades of expression which their staring fa" + "ces lacked."; + uint8_t test_desc_2_hash[DIGEST256_LEN]; + char test_desc_2_hash_str[HEX_DIGEST256_LEN+1]; + /* strlen(test_desc_3) = 700 bytes */ + const char *test_desc_3 = + "Without knowing what futurism is like, Johansen achieved something very" + "close to it when he spoke of the city; for instead of describing any de" + "finite structure or building, he dwells only on broad impressions of va" + "st angles and stone surfaces - surfaces too great to belong to anything" + "right or proper for this earth, and impious with horrible images and hi" + "eroglyphs. I mention his talk about angles because it suggests somethin" + "g Wilcox had told me of his awful dreams. He said that the geometry of " + "the dream-place he saw was abnormal, non-Euclidean, and loathsomely red" + "olent of spheres and dimensions apart from ours. Now an unlettered seam" + "an felt the same thing whilst gazing at the terrible reality."; + uint8_t test_desc_3_hash[DIGEST256_LEN]; + char test_desc_3_hash_str[HEX_DIGEST256_LEN+1]; + /* strlen(test_desc_3) = 604 bytes */ + const char *test_desc_4 = + "So we glanced back simultaneously, it would appear; though no doubt the" + "incipient motion of one prompted the imitation of the other. As we did " + "so we flashed both torches full strength at the momentarily thinned mis" + "t; either from sheer primitive anxiety to see all we could, or in a les" + "s primitive but equally unconscious effort to dazzle the entity before " + "we dimmed our light and dodged among the penguins of the labyrinth cent" + "er ahead. Unhappy act! Not Orpheus himself, or Lot's wife, paid much mo" + "re dearly for a backward glance. And again came that shocking, wide-ran" + "ged piping - \"Tekeli-li! Tekeli-li!\""; + uint8_t test_desc_4_hash[DIGEST256_LEN]; + char test_desc_4_hash_str[HEX_DIGEST256_LEN+1]; + (void)data; + + /* + * Set up options mock so we can force a tiny FIFO size and generate + * cleanups. + */ + mock_options = tor_malloc(sizeof(or_options_t)); + reset_options(mock_options, &mock_get_options_calls); + mock_options->MaxUnparseableDescSizeToLog = 1536; + MOCK(get_options, mock_get_options); + MOCK(check_private_dir, mock_check_private_dir); + MOCK(options_get_dir_fname2_suffix, + mock_get_datadir_fname); + + /* + * Set up unlink and write mocks + */ + MOCK(tor_unlink, mock_unlink); + mock_unlink_reset(); + MOCK(write_str_to_file, mock_write_str_to_file); + mock_write_str_to_file_reset(); + + /* + * Compute hashes we'll need to recognize which descriptor is which + */ + crypto_digest256((char *)test_desc_1_hash, test_desc_1, + strlen(test_desc_1), DIGEST_SHA256); + base16_encode(test_desc_1_hash_str, sizeof(test_desc_1_hash_str), + (const char *)test_desc_1_hash, + sizeof(test_desc_1_hash)); + crypto_digest256((char *)test_desc_2_hash, test_desc_2, + strlen(test_desc_2), DIGEST_SHA256); + base16_encode(test_desc_2_hash_str, sizeof(test_desc_2_hash_str), + (const char *)test_desc_2_hash, + sizeof(test_desc_2_hash)); + crypto_digest256((char *)test_desc_3_hash, test_desc_3, + strlen(test_desc_3), DIGEST_SHA256); + base16_encode(test_desc_3_hash_str, sizeof(test_desc_3_hash_str), + (const char *)test_desc_3_hash, + sizeof(test_desc_3_hash)); + crypto_digest256((char *)test_desc_4_hash, test_desc_4, + strlen(test_desc_4), DIGEST_SHA256); + base16_encode(test_desc_4_hash_str, sizeof(test_desc_4_hash_str), + (const char *)test_desc_4_hash, + sizeof(test_desc_4_hash)); + + /* + * Reset the FIFO and check its state + */ + dump_desc_fifo_cleanup(); + tt_u64_op(len_descs_dumped, OP_EQ, 0); + tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); + + /* + * (1) Fire off dump_desc() once; these descriptors should all be safely + * smaller than configured FIFO size. + */ + + dump_desc(test_desc_1, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_1)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 1); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256); + + /* + * Reset the FIFO and check its state + */ + dump_desc_fifo_cleanup(); + tt_u64_op(len_descs_dumped, OP_EQ, 0); + tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); + + /* + * Reset the mocks and check their state + */ + mock_unlink_reset(); + mock_write_str_to_file_reset(); + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 0); + + /* + * (2) Fire off dump_desc() twice; this still should trigger no cleanup. + */ + + /* First time */ + dump_desc(test_desc_2, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_2)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 1); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256); + + /* Second time */ + dump_desc(test_desc_3, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_2) + strlen(test_desc_3)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 2); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256); + + /* + * Reset the FIFO and check its state + */ + dump_desc_fifo_cleanup(); + tt_u64_op(len_descs_dumped, OP_EQ, 0); + tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); + + /* + * Reset the mocks and check their state + */ + mock_unlink_reset(); + mock_write_str_to_file_reset(); + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 0); + + /* + * (3) Three calls to dump_desc cause a FIFO cleanup + */ + + /* First time */ + dump_desc(test_desc_4, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_4)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 1); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); + + /* Second time */ + dump_desc(test_desc_1, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_4) + strlen(test_desc_1)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 2); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256); + + /* Third time - we should unlink the dump of test_desc_4 here */ + dump_desc(test_desc_2, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_1) + strlen(test_desc_2)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 1); + tt_int_op(write_str_count, OP_EQ, 3); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256); + + /* + * Reset the FIFO and check its state + */ + dump_desc_fifo_cleanup(); + tt_u64_op(len_descs_dumped, OP_EQ, 0); + tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); + + /* + * Reset the mocks and check their state + */ + mock_unlink_reset(); + mock_write_str_to_file_reset(); + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 0); + + /* + * (4) But repeating one (A B B) doesn't overflow and cleanup + */ + + /* First time */ + dump_desc(test_desc_3, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_3)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 1); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256); + + /* Second time */ + dump_desc(test_desc_4, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_3) + strlen(test_desc_4)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 2); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); + + /* Third time */ + dump_desc(test_desc_4, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_3) + strlen(test_desc_4)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 2); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); + + /* + * Reset the FIFO and check its state + */ + dump_desc_fifo_cleanup(); + tt_u64_op(len_descs_dumped, OP_EQ, 0); + tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); + + /* + * Reset the mocks and check their state + */ + mock_unlink_reset(); + mock_write_str_to_file_reset(); + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 0); + + /* + * (5) Same for the (A B A) repetition + */ + + /* First time */ + dump_desc(test_desc_1, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_1)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 1); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256); + + /* Second time */ + dump_desc(test_desc_2, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_1) + strlen(test_desc_2)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 2); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256); + + /* Third time */ + dump_desc(test_desc_1, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_1) + strlen(test_desc_2)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 2); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256); + + /* + * Reset the FIFO and check its state + */ + dump_desc_fifo_cleanup(); + tt_u64_op(len_descs_dumped, OP_EQ, 0); + tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); + + /* + * Reset the mocks and check their state + */ + mock_unlink_reset(); + mock_write_str_to_file_reset(); + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 0); + + /* + * (6) (A B B C) triggering overflow on C causes A, not B to be unlinked + */ + + /* First time */ + dump_desc(test_desc_3, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_3)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 1); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256); + + /* Second time */ + dump_desc(test_desc_4, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_3) + strlen(test_desc_4)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 2); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); + + /* Third time */ + dump_desc(test_desc_4, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_3) + strlen(test_desc_4)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 2); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); + + /* Fourth time - we should unlink the dump of test_desc_3 here */ + dump_desc(test_desc_1, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_4) + strlen(test_desc_1)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 1); + tt_int_op(write_str_count, OP_EQ, 3); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256); + + /* + * Reset the FIFO and check its state + */ + dump_desc_fifo_cleanup(); + tt_u64_op(len_descs_dumped, OP_EQ, 0); + tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); + + /* + * Reset the mocks and check their state + */ + mock_unlink_reset(); + mock_write_str_to_file_reset(); + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 0); + + /* + * (7) (A B A C) triggering overflow on C causes B, not A to be unlinked + */ + + /* First time */ + dump_desc(test_desc_2, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_2)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 1); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256); + + /* Second time */ + dump_desc(test_desc_3, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_2) + strlen(test_desc_3)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 2); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256); + + /* Third time */ + dump_desc(test_desc_2, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_2) + strlen(test_desc_3)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 2); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256); + + /* Fourth time - we should unlink the dump of test_desc_3 here */ + dump_desc(test_desc_4, test_desc_type); + + /* + * Assert things about the FIFO state + */ + tt_u64_op(len_descs_dumped, OP_EQ, + strlen(test_desc_2) + strlen(test_desc_4)); + tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); + + /* + * Assert things about the mocks + */ + tt_int_op(unlinked_count, OP_EQ, 1); + tt_int_op(write_str_count, OP_EQ, 3); + tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); + + /* + * Reset the FIFO and check its state + */ + dump_desc_fifo_cleanup(); + tt_u64_op(len_descs_dumped, OP_EQ, 0); + tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); + + /* + * Reset the mocks and check their state + */ + mock_unlink_reset(); + mock_write_str_to_file_reset(); + tt_int_op(unlinked_count, OP_EQ, 0); + tt_int_op(write_str_count, OP_EQ, 0); + + done: + + /* Clean up the fifo */ + dump_desc_fifo_cleanup(); + + /* Remove mocks */ + UNMOCK(tor_unlink); + mock_unlink_reset(); + UNMOCK(write_str_to_file); + mock_write_str_to_file_reset(); + UNMOCK(options_get_dir_fname2_suffix); + UNMOCK(check_private_dir); + UNMOCK(get_options); + tor_free(mock_options); + mock_options = NULL; + + return; +} + +/* Variables for reset_read_file_to_str_mock() */ + +static int enforce_expected_filename = 0; +static char *expected_filename = NULL; +static char *file_content = NULL; +static size_t file_content_len = 0; +static struct stat file_stat; +static int read_count = 0, read_call_count = 0; + +static void +reset_read_file_to_str_mock(void) +{ + tor_free(expected_filename); + tor_free(file_content); + file_content_len = 0; + memset(&file_stat, 0, sizeof(file_stat)); + read_count = 0; + read_call_count = 0; +} + +static char * +read_file_to_str_mock(const char *filename, int flags, + struct stat *stat_out) { + char *result = NULL; + + /* Insist we got a filename */ + tt_ptr_op(filename, OP_NE, NULL); + + /* We ignore flags */ + (void)flags; + + /* Bump the call count */ + ++read_call_count; + + if (enforce_expected_filename) { + tt_assert(expected_filename); + tt_str_op(filename, OP_EQ, expected_filename); + } + + if (expected_filename != NULL && + file_content != NULL && + strcmp(filename, expected_filename) == 0) { + /* You asked for it, you got it */ + + /* + * This is the same behavior as the real read_file_to_str(); + * if there's a NUL, the real size ends up in stat_out. + */ + result = tor_malloc(file_content_len + 1); + if (file_content_len > 0) { + memcpy(result, file_content, file_content_len); + } + result[file_content_len] = '\0'; + + /* Do we need to set up stat_out? */ + if (stat_out != NULL) { + memcpy(stat_out, &file_stat, sizeof(file_stat)); + /* We always return the correct length here */ + stat_out->st_size = file_content_len; + } + + /* Wooo, we have a return value - bump the counter */ + ++read_count; + } + /* else no match, return NULL */ + + done: + return result; +} + +/* This one tests dump_desc_populate_one_file() */ +static void +test_dir_populate_dump_desc_fifo(void *data) +{ + const char *dirname = "foo"; + const char *fname = NULL; + dumped_desc_t *ent; + + (void)data; + + /* + * Set up unlink and read_file_to_str mocks + */ + MOCK(tor_unlink, mock_unlink); + mock_unlink_reset(); + MOCK(read_file_to_str, read_file_to_str_mock); + reset_read_file_to_str_mock(); + + /* Check state of unlink mock */ + tt_int_op(unlinked_count, OP_EQ, 0); + + /* Some cases that should fail before trying to read the file */ + ent = dump_desc_populate_one_file(dirname, "bar"); + tt_ptr_op(ent, OP_EQ, NULL); + tt_int_op(unlinked_count, OP_EQ, 1); + tt_int_op(read_count, OP_EQ, 0); + tt_int_op(read_call_count, OP_EQ, 0); + + ent = dump_desc_populate_one_file(dirname, "unparseable-desc"); + tt_ptr_op(ent, OP_EQ, NULL); + tt_int_op(unlinked_count, OP_EQ, 2); + tt_int_op(read_count, OP_EQ, 0); + tt_int_op(read_call_count, OP_EQ, 0); + + ent = dump_desc_populate_one_file(dirname, "unparseable-desc.baz"); + tt_ptr_op(ent, OP_EQ, NULL); + tt_int_op(unlinked_count, OP_EQ, 3); + tt_int_op(read_count, OP_EQ, 0); + tt_int_op(read_call_count, OP_EQ, 0); + + ent = dump_desc_populate_one_file( + dirname, + "unparseable-desc.08AE85E90461F59E"); + tt_ptr_op(ent, OP_EQ, NULL); + tt_int_op(unlinked_count, OP_EQ, 4); + tt_int_op(read_count, OP_EQ, 0); + tt_int_op(read_call_count, OP_EQ, 0); + + ent = dump_desc_populate_one_file( + dirname, + "unparseable-desc.08AE85E90461F59EDF0981323F3A70D02B55AB54B44B04F" + "287D72F7B72F242E85C8CB0EDA8854A99"); + tt_ptr_op(ent, OP_EQ, NULL); + tt_int_op(unlinked_count, OP_EQ, 5); + tt_int_op(read_count, OP_EQ, 0); + tt_int_op(read_call_count, OP_EQ, 0); + + /* This is a correct-length digest but base16_decode() will fail */ + ent = dump_desc_populate_one_file( + dirname, + "unparseable-desc.68219B8BGE64B705A6FFC728C069DC596216D60A7D7520C" + "D5ECE250D912E686B"); + tt_ptr_op(ent, OP_EQ, NULL); + tt_int_op(unlinked_count, OP_EQ, 6); + tt_int_op(read_count, OP_EQ, 0); + tt_int_op(read_call_count, OP_EQ, 0); + + /* This one has a correctly formed filename and should try reading */ + + /* Read fails */ + ent = dump_desc_populate_one_file( + dirname, + "unparseable-desc.DF0981323F3A70D02B55AB54B44B04F287D72F7B72F242E" + "85C8CB0EDA8854A99"); + tt_ptr_op(ent, OP_EQ, NULL); + tt_int_op(unlinked_count, OP_EQ, 7); + tt_int_op(read_count, OP_EQ, 0); + tt_int_op(read_call_count, OP_EQ, 1); + + /* This read will succeed but the digest won't match the file content */ + fname = + "unparseable-desc." + "DF0981323F3A70D02B55AB54B44B04F287D72F7B72F242E85C8CB0EDA8854A99"; + enforce_expected_filename = 1; + tor_asprintf(&expected_filename, "%s%s%s", dirname, PATH_SEPARATOR, fname); + file_content = tor_strdup("hanc culpam maiorem an illam dicam?"); + file_content_len = strlen(file_content); + file_stat.st_mtime = 123456; + ent = dump_desc_populate_one_file(dirname, fname); + enforce_expected_filename = 0; + tt_ptr_op(ent, OP_EQ, NULL); + tt_int_op(unlinked_count, OP_EQ, 8); + tt_int_op(read_count, OP_EQ, 1); + tt_int_op(read_call_count, OP_EQ, 2); + tor_free(expected_filename); + tor_free(file_content); + + /* This one will match */ + fname = + "unparseable-desc." + "0786C7173447B7FB033FFCA2FC47C3CF71C30DD47CA8236D3FC7FF35853271C6"; + tor_asprintf(&expected_filename, "%s%s%s", dirname, PATH_SEPARATOR, fname); + file_content = tor_strdup("hanc culpam maiorem an illam dicam?"); + file_content_len = strlen(file_content); + file_stat.st_mtime = 789012; + ent = dump_desc_populate_one_file(dirname, fname); + tt_ptr_op(ent, OP_NE, NULL); + tt_int_op(unlinked_count, OP_EQ, 8); + tt_int_op(read_count, OP_EQ, 2); + tt_int_op(read_call_count, OP_EQ, 3); + tt_str_op(ent->filename, OP_EQ, expected_filename); + tt_int_op(ent->len, OP_EQ, file_content_len); + tt_int_op(ent->when, OP_EQ, file_stat.st_mtime); + tor_free(ent->filename); + tor_free(ent); + tor_free(expected_filename); + + /* + * Reset the mocks and check their state + */ + mock_unlink_reset(); + tt_int_op(unlinked_count, OP_EQ, 0); + reset_read_file_to_str_mock(); + tt_int_op(read_count, OP_EQ, 0); + + done: + + UNMOCK(tor_unlink); + mock_unlink_reset(); + UNMOCK(read_file_to_str); + reset_read_file_to_str_mock(); + + tor_free(file_content); + + return; +} + +static smartlist_t * +listdir_mock(const char *dname) +{ + smartlist_t *l; + + /* Ignore the name, always return this list */ + (void)dname; + + l = smartlist_new(); + smartlist_add_strdup(l, "foo"); + smartlist_add_strdup(l, "bar"); + smartlist_add_strdup(l, "baz"); + + return l; +} + +static dumped_desc_t * +pop_one_mock(const char *dirname, const char *f) +{ + dumped_desc_t *ent = NULL; + + if (dirname != NULL && strcmp(dirname, "d") == 0) { + if (f != NULL && strcmp(f, "foo") == 0) { + ent = tor_malloc_zero(sizeof(*ent)); + ent->filename = tor_strdup("d/foo"); + ent->len = 123; + ent->digest_sha256[0] = 1; + ent->when = 1024; + } else if (f != NULL && strcmp(f, "bar") == 0) { + ent = tor_malloc_zero(sizeof(*ent)); + ent->filename = tor_strdup("d/bar"); + ent->len = 456; + ent->digest_sha256[0] = 2; + /* + * Note that the timestamps are in a different order than + * listdir_mock() returns; we're testing the sort order. + */ + ent->when = 512; + } else if (f != NULL && strcmp(f, "baz") == 0) { + ent = tor_malloc_zero(sizeof(*ent)); + ent->filename = tor_strdup("d/baz"); + ent->len = 789; + ent->digest_sha256[0] = 3; + ent->when = 768; + } + } + + return ent; +} + +/* This one tests dump_desc_populate_fifo_from_directory() */ +static void +test_dir_populate_dump_desc_fifo_2(void *data) +{ + dumped_desc_t *ent = NULL; + + (void)data; + + /* Set up the mocks */ + MOCK(tor_listdir, listdir_mock); + MOCK(dump_desc_populate_one_file, pop_one_mock); + + /* Run dump_desc_populate_fifo_from_directory() */ + descs_dumped = NULL; + len_descs_dumped = 0; + dump_desc_populate_fifo_from_directory("d"); + tt_assert(descs_dumped != NULL); + tt_int_op(smartlist_len(descs_dumped), OP_EQ, 3); + tt_u64_op(len_descs_dumped, OP_EQ, 1368); + ent = smartlist_get(descs_dumped, 0); + tt_str_op(ent->filename, OP_EQ, "d/bar"); + tt_int_op(ent->len, OP_EQ, 456); + tt_int_op(ent->when, OP_EQ, 512); + ent = smartlist_get(descs_dumped, 1); + tt_str_op(ent->filename, OP_EQ, "d/baz"); + tt_int_op(ent->len, OP_EQ, 789); + tt_int_op(ent->when, OP_EQ, 768); + ent = smartlist_get(descs_dumped, 2); + tt_str_op(ent->filename, OP_EQ, "d/foo"); + tt_int_op(ent->len, OP_EQ, 123); + tt_int_op(ent->when, OP_EQ, 1024); + + done: + dump_desc_fifo_cleanup(); + + UNMOCK(dump_desc_populate_one_file); + UNMOCK(tor_listdir); + + return; +} + +static int mock_networkstatus_consensus_is_bootstrapping_value = 0; +static int +mock_networkstatus_consensus_is_bootstrapping(time_t now) +{ + (void)now; + return mock_networkstatus_consensus_is_bootstrapping_value; +} + +static int mock_networkstatus_consensus_can_use_extra_fallbacks_value = 0; +static int +mock_networkstatus_consensus_can_use_extra_fallbacks( + const or_options_t *options) +{ + (void)options; + return mock_networkstatus_consensus_can_use_extra_fallbacks_value; +} + +static int mock_num_bridges_usable_value = 0; +static int +mock_num_bridges_usable(int use_maybe_reachable) +{ + (void)use_maybe_reachable; + return mock_num_bridges_usable_value; +} + +/* data is a 3 character nul-terminated string. + * If data[0] is 'b', set bootstrapping, anything else means not bootstrapping + * If data[1] is 'f', set extra fallbacks, anything else means no extra + * If data[2] is 'f', set running bridges, anything else means no extra + * fallbacks. + */ +static void +test_dir_find_dl_schedule(void* data) +{ + const char *str = (const char *)data; + + tt_assert(strlen(data) == 3); + + if (str[0] == 'b') { + mock_networkstatus_consensus_is_bootstrapping_value = 1; + } else { + mock_networkstatus_consensus_is_bootstrapping_value = 0; + } + + if (str[1] == 'f') { + mock_networkstatus_consensus_can_use_extra_fallbacks_value = 1; + } else { + mock_networkstatus_consensus_can_use_extra_fallbacks_value = 0; + } + + if (str[2] == 'r') { + /* Any positive, non-zero value should work */ + mock_num_bridges_usable_value = 2; + } else { + mock_num_bridges_usable_value = 0; + } + + MOCK(networkstatus_consensus_is_bootstrapping, + mock_networkstatus_consensus_is_bootstrapping); + MOCK(networkstatus_consensus_can_use_extra_fallbacks, + mock_networkstatus_consensus_can_use_extra_fallbacks); + MOCK(num_bridges_usable, + mock_num_bridges_usable); + + download_status_t dls; + smartlist_t server, client, server_cons, client_cons; + smartlist_t client_boot_auth_only_cons, client_boot_auth_cons; + smartlist_t client_boot_fallback_cons, bridge, bridge_bootstrap; + + mock_options = tor_malloc(sizeof(or_options_t)); + reset_options(mock_options, &mock_get_options_calls); + MOCK(get_options, mock_get_options); + + mock_options->TestingServerDownloadSchedule = &server; + mock_options->TestingClientDownloadSchedule = &client; + mock_options->TestingServerConsensusDownloadSchedule = &server_cons; + mock_options->TestingClientConsensusDownloadSchedule = &client_cons; + mock_options->ClientBootstrapConsensusAuthorityOnlyDownloadSchedule = + &client_boot_auth_only_cons; + mock_options->ClientBootstrapConsensusAuthorityDownloadSchedule = + &client_boot_auth_cons; + mock_options->ClientBootstrapConsensusFallbackDownloadSchedule = + &client_boot_fallback_cons; + mock_options->TestingBridgeDownloadSchedule = &bridge; + mock_options->TestingBridgeBootstrapDownloadSchedule = &bridge_bootstrap; + + dls.schedule = DL_SCHED_GENERIC; + /* client */ + mock_options->ClientOnly = 1; + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, &client); + mock_options->ClientOnly = 0; + + /* dir mode */ + mock_options->DirPort_set = 1; + mock_options->DirCache = 1; + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, &server); + mock_options->DirPort_set = 0; + mock_options->DirCache = 0; + + dls.schedule = DL_SCHED_CONSENSUS; + /* public server mode */ + mock_options->ORPort_set = 1; + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, &server_cons); + mock_options->ORPort_set = 0; + + /* client and bridge modes */ + if (networkstatus_consensus_is_bootstrapping(time(NULL))) { + if (networkstatus_consensus_can_use_extra_fallbacks(mock_options)) { + dls.want_authority = 1; + /* client */ + mock_options->ClientOnly = 1; + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, + &client_boot_auth_cons); + mock_options->ClientOnly = 0; + + /* bridge relay */ + mock_options->ORPort_set = 1; + mock_options->BridgeRelay = 1; + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, + &client_boot_auth_cons); + mock_options->ORPort_set = 0; + mock_options->BridgeRelay = 0; + + dls.want_authority = 0; + /* client */ + mock_options->ClientOnly = 1; + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, + &client_boot_fallback_cons); + mock_options->ClientOnly = 0; + + /* bridge relay */ + mock_options->ORPort_set = 1; + mock_options->BridgeRelay = 1; + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, + &client_boot_fallback_cons); + mock_options->ORPort_set = 0; + mock_options->BridgeRelay = 0; + + } else { + /* dls.want_authority is ignored */ + /* client */ + mock_options->ClientOnly = 1; + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, + &client_boot_auth_only_cons); + mock_options->ClientOnly = 0; + + /* bridge relay */ + mock_options->ORPort_set = 1; + mock_options->BridgeRelay = 1; + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, + &client_boot_auth_only_cons); + mock_options->ORPort_set = 0; + mock_options->BridgeRelay = 0; + } + } else { + /* client */ + mock_options->ClientOnly = 1; + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, + &client_cons); + mock_options->ClientOnly = 0; + + /* bridge relay */ + mock_options->ORPort_set = 1; + mock_options->BridgeRelay = 1; + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, + &client_cons); + mock_options->ORPort_set = 0; + mock_options->BridgeRelay = 0; + } + + dls.schedule = DL_SCHED_BRIDGE; + /* client */ + mock_options->ClientOnly = 1; + mock_options->UseBridges = 1; + if (num_bridges_usable(0) > 0) { + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, &bridge); + } else { + tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, &bridge_bootstrap); + } + + done: + UNMOCK(networkstatus_consensus_is_bootstrapping); + UNMOCK(networkstatus_consensus_can_use_extra_fallbacks); + UNMOCK(num_bridges_usable); + UNMOCK(get_options); + tor_free(mock_options); + mock_options = NULL; +} + +static void +test_dir_assumed_flags(void *arg) +{ + (void)arg; + smartlist_t *tokens = smartlist_new(); + memarea_t *area = memarea_new(); + routerstatus_t *rs = NULL; + + /* First, we should always assume that the Running flag is set, even + * when it isn't listed, since the consensus method is always + * higher than 4. */ + const char *str1 = + "r example hereiswhereyouridentitygoes 2015-08-30 12:00:00 " + "192.168.0.1 9001 0\n" + "m thisoneislongerbecauseitisa256bitmddigest33\n" + "s Fast Guard Stable\n"; + + const char *cp = str1; + rs = routerstatus_parse_entry_from_string(area, &cp, tokens, NULL, NULL, + 23, FLAV_MICRODESC); + tt_assert(rs); + tt_assert(rs->is_flagged_running); + tt_assert(! rs->is_valid); + tt_assert(! rs->is_exit); + tt_assert(rs->is_fast); + routerstatus_free(rs); + + /* With method 24 or later, we can assume "valid" is set. */ + cp = str1; + rs = routerstatus_parse_entry_from_string(area, &cp, tokens, NULL, NULL, + 24, FLAV_MICRODESC); + tt_assert(rs); + tt_assert(rs->is_flagged_running); + tt_assert(rs->is_valid); + tt_assert(! rs->is_exit); + tt_assert(rs->is_fast); + + done: + smartlist_free(tokens); + memarea_drop_all(area); + routerstatus_free(rs); +} + +static void +test_dir_post_parsing(void *arg) +{ + (void) arg; + + /* Test the version parsing from an HS descriptor publish request. */ + { + const char *end; + const char *prefix = "/tor/hs/"; + int version = parse_hs_version_from_post("/tor/hs//publish", prefix, &end); + tt_int_op(version, OP_EQ, -1); + tt_ptr_op(end, OP_EQ, NULL); + version = parse_hs_version_from_post("/tor/hs/a/publish", prefix, &end); + tt_int_op(version, OP_EQ, -1); + tt_ptr_op(end, OP_EQ, NULL); + version = parse_hs_version_from_post("/tor/hs/3/publish", prefix, &end); + tt_int_op(version, OP_EQ, 3); + tt_str_op(end, OP_EQ, "/publish"); + version = parse_hs_version_from_post("/tor/hs/42/publish", prefix, &end); + tt_int_op(version, OP_EQ, 42); + tt_str_op(end, OP_EQ, "/publish"); + version = parse_hs_version_from_post("/tor/hs/18163/publish",prefix, &end); + tt_int_op(version, OP_EQ, 18163); + tt_str_op(end, OP_EQ, "/publish"); + version = parse_hs_version_from_post("JUNKJUNKJUNK", prefix, &end); + tt_int_op(version, OP_EQ, -1); + tt_ptr_op(end, OP_EQ, NULL); + version = parse_hs_version_from_post("/tor/hs/3/publish", "blah", &end); + tt_int_op(version, OP_EQ, -1); + tt_ptr_op(end, OP_EQ, NULL); + /* Missing the '/' at the end of the prefix. */ + version = parse_hs_version_from_post("/tor/hs/3/publish", "/tor/hs", &end); + tt_int_op(version, OP_EQ, -1); + tt_ptr_op(end, OP_EQ, NULL); + version = parse_hs_version_from_post("/random/blah/tor/hs/3/publish", + prefix, &end); + tt_int_op(version, OP_EQ, -1); + tt_ptr_op(end, OP_EQ, NULL); + version = parse_hs_version_from_post("/tor/hs/3/publish/random/junk", + prefix, &end); + tt_int_op(version, OP_EQ, 3); + tt_str_op(end, OP_EQ, "/publish/random/junk"); + version = parse_hs_version_from_post("/tor/hs/-1/publish", prefix, &end); + tt_int_op(version, OP_EQ, -1); + tt_ptr_op(end, OP_EQ, NULL); + /* INT_MAX */ + version = parse_hs_version_from_post("/tor/hs/2147483647/publish", + prefix, &end); + tt_int_op(version, OP_EQ, INT_MAX); + tt_str_op(end, OP_EQ, "/publish"); + /* INT_MAX + 1*/ + version = parse_hs_version_from_post("/tor/hs/2147483648/publish", + prefix, &end); + tt_int_op(version, OP_EQ, -1); + tt_ptr_op(end, OP_EQ, NULL); + } + + done: + ; +} + +static void +test_dir_platform_str(void *arg) +{ + char platform[256]; + (void)arg; + platform[0] = 0; + get_platform_str(platform, sizeof(platform)); + tt_int_op((int)strlen(platform), OP_GT, 0); + tt_assert(!strcmpstart(platform, "Tor ")); + + tor_version_t ver; + // make sure this is a tor version, a real actual tor version. + tt_int_op(tor_version_parse_platform(platform, &ver, 1), OP_EQ, 1); + + TT_BLATHER(("%d.%d.%d.%d", ver.major, ver.minor, ver.micro, ver.patchlevel)); + + // Handle an example version. + tt_int_op(tor_version_parse_platform( + "Tor 0.3.3.3 (foo) (git-xyzzy) on a potato", &ver, 1), OP_EQ, 1); + done: + ; +} + +static networkstatus_t *mock_networkstatus; + +static networkstatus_t * +mock_networkstatus_get_latest_consensus_by_flavor(consensus_flavor_t f) +{ + (void)f; + return mock_networkstatus; +} + +static void +test_dir_networkstatus_consensus_has_ipv6(void *arg) +{ + (void)arg; + + int has_ipv6 = 0; + + /* Init options and networkstatus */ + or_options_t our_options; + mock_options = &our_options; + reset_options(mock_options, &mock_get_options_calls); + MOCK(get_options, mock_get_options); + + networkstatus_t our_networkstatus; + mock_networkstatus = &our_networkstatus; + memset(mock_networkstatus, 0, sizeof(*mock_networkstatus)); + MOCK(networkstatus_get_latest_consensus_by_flavor, + mock_networkstatus_get_latest_consensus_by_flavor); + + /* A live consensus */ + mock_networkstatus->valid_after = time(NULL) - 3600; + mock_networkstatus->valid_until = time(NULL) + 3600; + + /* Test the bounds for A lines in the NS consensus */ + mock_options->UseMicrodescriptors = 0; + + mock_networkstatus->consensus_method = MIN_METHOD_FOR_A_LINES; + has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); + tt_assert(has_ipv6); + + mock_networkstatus->consensus_method = MIN_METHOD_FOR_A_LINES + 1; + has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); + tt_assert(has_ipv6); + + mock_networkstatus->consensus_method = MIN_METHOD_FOR_A_LINES + 20; + has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); + tt_assert(has_ipv6); + + mock_networkstatus->consensus_method = MIN_METHOD_FOR_A_LINES - 1; + has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); + tt_assert(!has_ipv6); + + /* Test the bounds for A lines in the microdesc consensus */ + mock_options->UseMicrodescriptors = 1; + + mock_networkstatus->consensus_method = + MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS; + has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); + tt_assert(has_ipv6); + + mock_networkstatus->consensus_method = + MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS + 1; + has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); + tt_assert(has_ipv6); + + mock_networkstatus->consensus_method = + MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS + 20; + has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); + tt_assert(has_ipv6); + + mock_networkstatus->consensus_method = + MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS - 1; + has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); + tt_assert(!has_ipv6); + + /* Test the edge cases */ + mock_options->UseMicrodescriptors = 1; + mock_networkstatus->consensus_method = + MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS; + + /* Reasonably live */ + mock_networkstatus->valid_until = time(NULL) - 60; + has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); + tt_assert(has_ipv6); + + /* Not reasonably live */ + mock_networkstatus->valid_after = time(NULL) - 24*60*60 - 3600; + mock_networkstatus->valid_until = time(NULL) - 24*60*60 - 60; + has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); + tt_assert(!has_ipv6); + + /* NULL consensus */ + mock_networkstatus = NULL; + has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); + tt_assert(!has_ipv6); + + done: + UNMOCK(get_options); + UNMOCK(networkstatus_get_latest_consensus_by_flavor); +} + +#define DIR_LEGACY(name) \ + { #name, test_dir_ ## name , TT_FORK, NULL, NULL } + +#define DIR(name,flags) \ + { #name, test_dir_##name, (flags), NULL, NULL } + +/* where arg is a string constant */ +#define DIR_ARG(name,flags,arg) \ + { #name "_" arg, test_dir_##name, (flags), &passthrough_setup, (void*) arg } + +struct testcase_t dir_tests[] = { + DIR_LEGACY(nicknames), + DIR_LEGACY(formats), + DIR(routerinfo_parsing, 0), + DIR(extrainfo_parsing, 0), + DIR(parse_router_list, TT_FORK), + DIR(load_routers, TT_FORK), + DIR(load_extrainfo, TT_FORK), + DIR(getinfo_extra, 0), + DIR_LEGACY(versions), + DIR_LEGACY(fp_pairs), + DIR(split_fps, 0), + DIR_LEGACY(measured_bw_kb), + DIR_LEGACY(measured_bw_kb_cache), + DIR_LEGACY(param_voting), + DIR(param_voting_lookup, 0), + DIR_LEGACY(v3_networkstatus), + DIR(random_weighted, 0), + DIR(scale_bw, 0), + DIR_LEGACY(clip_unmeasured_bw_kb), + DIR_LEGACY(clip_unmeasured_bw_kb_alt), + DIR(fmt_control_ns, 0), + DIR(dirserv_set_routerstatus_testing, 0), + DIR(http_handling, 0), + DIR(purpose_needs_anonymity_returns_true_for_bridges, 0), + DIR(purpose_needs_anonymity_returns_false_for_own_bridge_desc, 0), + DIR(purpose_needs_anonymity_returns_true_by_default, 0), + DIR(purpose_needs_anonymity_returns_true_for_sensitive_purpose, 0), + DIR(purpose_needs_anonymity_ret_false_for_non_sensitive_conn, 0), + DIR(post_parsing, 0), + DIR(fetch_type, 0), + DIR(packages, 0), + DIR(download_status_schedule, 0), + DIR(download_status_random_backoff, 0), + DIR(download_status_random_backoff_ranges, 0), + DIR(download_status_increment, TT_FORK), + DIR(authdir_type_to_string, 0), + DIR(conn_purpose_to_string, 0), + DIR(should_use_directory_guards, 0), + DIR(should_not_init_request_to_ourselves, TT_FORK), + DIR(should_not_init_request_to_dir_auths_without_v3_info, 0), + DIR(should_init_request_to_dir_auths, 0), + DIR(choose_compression_level, 0), + DIR(dump_unparseable_descriptors, 0), + DIR(populate_dump_desc_fifo, 0), + DIR(populate_dump_desc_fifo_2, 0), + DIR_ARG(find_dl_schedule, TT_FORK, "bfd"), + DIR_ARG(find_dl_schedule, TT_FORK, "bad"), + DIR_ARG(find_dl_schedule, TT_FORK, "cfd"), + DIR_ARG(find_dl_schedule, TT_FORK, "cad"), + DIR_ARG(find_dl_schedule, TT_FORK, "bfr"), + DIR_ARG(find_dl_schedule, TT_FORK, "bar"), + DIR_ARG(find_dl_schedule, TT_FORK, "cfr"), + DIR_ARG(find_dl_schedule, TT_FORK, "car"), + DIR(assumed_flags, 0), + DIR(networkstatus_compute_bw_weights_v10, 0), + DIR(platform_str, 0), + DIR(networkstatus_consensus_has_ipv6, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_dir_common.c b/src/wraith/src/test/test_dir_common.c new file mode 100644 index 000000000..fdf43533a --- /dev/null +++ b/src/wraith/src/test/test_dir_common.c @@ -0,0 +1,419 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define DIRVOTE_PRIVATE +#include "crypto.h" +#include "test.h" +#include "container.h" +#include "or.h" +#include "dirvote.h" +#include "nodelist.h" +#include "routerlist.h" +#include "test_dir_common.h" + +void dir_common_setup_vote(networkstatus_t **vote, time_t now); +networkstatus_t * dir_common_add_rs_and_parse(networkstatus_t *vote, + networkstatus_t **vote_out, + vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), + crypto_pk_t *sign_skey, int *n_vrs, + time_t now, int clear_rl); + +/** Initialize and set auth certs and keys + * Returns 0 on success, -1 on failure. Clean up handled by caller. + */ +int +dir_common_authority_pk_init(authority_cert_t **cert1, + authority_cert_t **cert2, + authority_cert_t **cert3, + crypto_pk_t **sign_skey_1, + crypto_pk_t **sign_skey_2, + crypto_pk_t **sign_skey_3) +{ + /* Parse certificates and keys. */ + authority_cert_t *cert; + cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); + tt_assert(cert); + tt_assert(cert->identity_key); + *cert1 = cert; + tt_assert(*cert1); + *cert2 = authority_cert_parse_from_string(AUTHORITY_CERT_2, NULL); + tt_assert(*cert2); + *cert3 = authority_cert_parse_from_string(AUTHORITY_CERT_3, NULL); + tt_assert(*cert3); + *sign_skey_1 = crypto_pk_new(); + *sign_skey_2 = crypto_pk_new(); + *sign_skey_3 = crypto_pk_new(); + + tt_assert(!crypto_pk_read_private_key_from_string(*sign_skey_1, + AUTHORITY_SIGNKEY_1, -1)); + tt_assert(!crypto_pk_read_private_key_from_string(*sign_skey_2, + AUTHORITY_SIGNKEY_2, -1)); + tt_assert(!crypto_pk_read_private_key_from_string(*sign_skey_3, + AUTHORITY_SIGNKEY_3, -1)); + + tt_assert(!crypto_pk_cmp_keys(*sign_skey_1, (*cert1)->signing_key)); + tt_assert(!crypto_pk_cmp_keys(*sign_skey_2, (*cert2)->signing_key)); + + return 0; + done: + return -1; +} + +/** + * Generate a routerstatus for v3_networkstatus test. + */ +vote_routerstatus_t * +dir_common_gen_routerstatus_for_v3ns(int idx, time_t now) +{ + vote_routerstatus_t *vrs=NULL; + routerstatus_t *rs = NULL; + tor_addr_t addr_ipv6; + char *method_list = NULL; + + switch (idx) { + case 0: + /* Generate the first routerstatus. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.1.2.14"); + rs->published_on = now-1500; + strlcpy(rs->nickname, "router2", sizeof(rs->nickname)); + memset(rs->identity_digest, TEST_DIR_ROUTER_ID_1, DIGEST_LEN); + memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_1, DIGEST_LEN); + rs->addr = 0x99008801; + rs->or_port = 443; + rs->dir_port = 8000; + /* all flags but running and v2dir cleared */ + rs->is_flagged_running = 1; + rs->is_v2_dir = 1; + rs->is_valid = 1; /* xxxxx */ + break; + case 1: + /* Generate the second routerstatus. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.2.0.5"); + rs->published_on = now-1000; + strlcpy(rs->nickname, "router1", sizeof(rs->nickname)); + memset(rs->identity_digest, TEST_DIR_ROUTER_ID_2, DIGEST_LEN); + memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_2, DIGEST_LEN); + rs->addr = 0x99009901; + rs->or_port = 443; + rs->dir_port = 0; + tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); + tor_addr_copy(&rs->ipv6_addr, &addr_ipv6); + rs->ipv6_orport = 4711; + rs->is_exit = rs->is_stable = rs->is_fast = rs->is_flagged_running = + rs->is_valid = rs->is_possible_guard = rs->is_v2_dir = 1; + break; + case 2: + /* Generate the third routerstatus. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.1.0.3"); + rs->published_on = now-1000; + strlcpy(rs->nickname, "router3", sizeof(rs->nickname)); + memset(rs->identity_digest, TEST_DIR_ROUTER_ID_3, DIGEST_LEN); + memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_3, DIGEST_LEN); + rs->addr = 0xAA009901; + rs->or_port = 400; + rs->dir_port = 9999; + rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast = + rs->is_flagged_running = rs->is_valid = rs->is_v2_dir = + rs->is_possible_guard = 1; + break; + case 3: + /* Generate a fourth routerstatus that is not running. */ + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + vrs->version = tor_strdup("0.1.6.3"); + rs->published_on = now-1000; + strlcpy(rs->nickname, "router4", sizeof(rs->nickname)); + memset(rs->identity_digest, TEST_DIR_ROUTER_ID_4, DIGEST_LEN); + memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_4, DIGEST_LEN); + rs->addr = 0xC0000203; + rs->or_port = 500; + rs->dir_port = 1999; + rs->is_v2_dir = 1; + /* Running flag (and others) cleared */ + break; + case 4: + /* No more for this test; return NULL */ + vrs = NULL; + break; + default: + /* Shouldn't happen */ + tt_abort(); + } + if (vrs) { + vrs->microdesc = tor_malloc_zero(sizeof(vote_microdesc_hash_t)); + method_list = make_consensus_method_list(MIN_SUPPORTED_CONSENSUS_METHOD, + MAX_SUPPORTED_CONSENSUS_METHOD, + ","); + tor_asprintf(&vrs->microdesc->microdesc_hash_line, + "m %s " + "sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa%d\n", + method_list, idx); + } + + done: + tor_free(method_list); + return vrs; +} + +/** Initialize networkstatus vote object attributes. */ +void +dir_common_setup_vote(networkstatus_t **vote, time_t now) +{ + *vote = tor_malloc_zero(sizeof(networkstatus_t)); + (*vote)->type = NS_TYPE_VOTE; + (*vote)->published = now; + (*vote)->supported_methods = smartlist_new(); + (*vote)->known_flags = smartlist_new(); + (*vote)->net_params = smartlist_new(); + (*vote)->routerstatus_list = smartlist_new(); + (*vote)->voters = smartlist_new(); +} + +/** Helper: Make a new routerinfo containing the right information for a + * given vote_routerstatus_t. */ +routerinfo_t * +dir_common_generate_ri_from_rs(const vote_routerstatus_t *vrs) +{ + routerinfo_t *r; + const routerstatus_t *rs = &vrs->status; + static time_t published = 0; + + r = tor_malloc_zero(sizeof(routerinfo_t)); + r->cert_expiration_time = TIME_MAX; + memcpy(r->cache_info.identity_digest, rs->identity_digest, DIGEST_LEN); + memcpy(r->cache_info.signed_descriptor_digest, rs->descriptor_digest, + DIGEST_LEN); + r->cache_info.do_not_cache = 1; + r->cache_info.routerlist_index = -1; + r->cache_info.signed_descriptor_body = + tor_strdup("123456789012345678901234567890123"); + r->cache_info.signed_descriptor_len = + strlen(r->cache_info.signed_descriptor_body); + r->exit_policy = smartlist_new(); + r->cache_info.published_on = ++published + time(NULL); + if (rs->has_bandwidth) { + /* + * Multiply by 1000 because the routerinfo_t and the routerstatus_t + * seem to use different units (*sigh*) and because we seem stuck on + * icky and perverse decimal kilobytes (*double sigh*) - see + * router_get_advertised_bandwidth_capped() of routerlist.c and + * routerstatus_format_entry() of dirserv.c. + */ + r->bandwidthrate = rs->bandwidth_kb * 1000; + r->bandwidthcapacity = rs->bandwidth_kb * 1000; + } + return r; +} + +/** Create routerstatuses and signed vote. + * Create routerstatuses using *vrs_gen* and add them to global routerlist. + * Next, create signed vote using *sign_skey* and *vote*, which should have + * predefined header fields. + * Setting *clear_rl* clears the global routerlist before adding the new + * routers. + * Return the signed vote, same as *vote_out*. Save the number of routers added + * in *n_vrs*. + */ +networkstatus_t * +dir_common_add_rs_and_parse(networkstatus_t *vote, networkstatus_t **vote_out, + vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), + crypto_pk_t *sign_skey, int *n_vrs, time_t now, + int clear_rl) +{ + vote_routerstatus_t *vrs; + char *v_text=NULL; + const char *msg=NULL; + int idx; + was_router_added_t router_added = -1; + *vote_out = NULL; + + if (clear_rl) { + nodelist_free_all(); + routerlist_free_all(); + } + + idx = 0; + do { + vrs = vrs_gen(idx, now); + if (vrs) { + smartlist_add(vote->routerstatus_list, vrs); + router_added = + router_add_to_routerlist(dir_common_generate_ri_from_rs(vrs), + &msg,0,0); + tt_assert(router_added >= 0); + ++idx; + } + } while (vrs); + *n_vrs = idx; + + /* dump the vote and try to parse it. */ + v_text = format_networkstatus_vote(sign_skey, vote); + tt_assert(v_text); + *vote_out = networkstatus_parse_vote_from_string(v_text, NULL, NS_TYPE_VOTE); + + done: + if (v_text) + tor_free(v_text); + + return *vote_out; +} + +/** Create a fake *vote* where *cert* describes the signer, *sign_skey* + * is the signing key, and *vrs_gen* is the function we'll use to create the + * routers on which we're voting. + * We pass *vote_out*, *n_vrs*, and *clear_rl* directly to vrs_gen(). + * Return 0 on success, return -1 on failure. + */ +int +dir_common_construct_vote_1(networkstatus_t **vote, authority_cert_t *cert, + crypto_pk_t *sign_skey, + vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), + networkstatus_t **vote_out, int *n_vrs, + time_t now, int clear_rl) +{ + networkstatus_voter_info_t *voter; + + dir_common_setup_vote(vote, now); + (*vote)->valid_after = now+1000; + (*vote)->fresh_until = now+2000; + (*vote)->valid_until = now+3000; + (*vote)->vote_seconds = 100; + (*vote)->dist_seconds = 200; + smartlist_split_string((*vote)->supported_methods, "1 2 3", NULL, 0, -1); + (*vote)->client_versions = tor_strdup("0.1.2.14,0.1.2.15"); + (*vote)->server_versions = tor_strdup("0.1.2.14,0.1.2.15,0.1.2.16"); + smartlist_split_string((*vote)->known_flags, + "Authority Exit Fast Guard Running Stable V2Dir Valid", + 0, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); + voter->nickname = tor_strdup("Voter1"); + voter->address = tor_strdup("1.2.3.4"); + voter->addr = 0x01020304; + voter->dir_port = 80; + voter->or_port = 9000; + voter->contact = tor_strdup("voter@example.com"); + crypto_pk_get_digest(cert->identity_key, voter->identity_digest); + /* + * Set up a vote; generate it; try to parse it. + */ + smartlist_add((*vote)->voters, voter); + (*vote)->cert = authority_cert_dup(cert); + smartlist_split_string((*vote)->net_params, "circuitwindow=101 foo=990", + NULL, 0, 0); + *n_vrs = 0; + /* add routerstatuses */ + if (!dir_common_add_rs_and_parse(*vote, vote_out, vrs_gen, sign_skey, + n_vrs, now, clear_rl)) + return -1; + + return 0; +} + +/** See dir_common_construct_vote_1. + * Produces a vote with slightly different values. + */ +int +dir_common_construct_vote_2(networkstatus_t **vote, authority_cert_t *cert, + crypto_pk_t *sign_skey, + vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), + networkstatus_t **vote_out, int *n_vrs, + time_t now, int clear_rl) +{ + networkstatus_voter_info_t *voter; + + dir_common_setup_vote(vote, now); + (*vote)->type = NS_TYPE_VOTE; + (*vote)->published += 1; + (*vote)->valid_after = now+1000; + (*vote)->fresh_until = now+3005; + (*vote)->valid_until = now+3000; + (*vote)->vote_seconds = 100; + (*vote)->dist_seconds = 300; + smartlist_split_string((*vote)->supported_methods, "1 2 3", NULL, 0, -1); + smartlist_split_string((*vote)->known_flags, + "Authority Exit Fast Guard MadeOfCheese MadeOfTin " + "Running Stable V2Dir Valid", 0, + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); + voter->nickname = tor_strdup("Voter2"); + voter->address = tor_strdup("2.3.4.5"); + voter->addr = 0x02030405; + voter->dir_port = 80; + voter->or_port = 9000; + voter->contact = tor_strdup("voter@example.com"); + crypto_pk_get_digest(cert->identity_key, voter->identity_digest); + /* + * Set up a vote; generate it; try to parse it. + */ + smartlist_add((*vote)->voters, voter); + (*vote)->cert = authority_cert_dup(cert); + if (! (*vote)->net_params) + (*vote)->net_params = smartlist_new(); + smartlist_split_string((*vote)->net_params, + "bar=2000000000 circuitwindow=20", + NULL, 0, 0); + /* add routerstatuses */ + /* dump the vote and try to parse it. */ + dir_common_add_rs_and_parse(*vote, vote_out, vrs_gen, sign_skey, + n_vrs, now, clear_rl); + + return 0; +} + +/** See dir_common_construct_vote_1. + * Produces a vote with slightly different values. Adds a legacy key. + */ +int +dir_common_construct_vote_3(networkstatus_t **vote, authority_cert_t *cert, + crypto_pk_t *sign_skey, + vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), + networkstatus_t **vote_out, int *n_vrs, + time_t now, int clear_rl) +{ + networkstatus_voter_info_t *voter; + + dir_common_setup_vote(vote, now); + (*vote)->valid_after = now+1000; + (*vote)->fresh_until = now+2003; + (*vote)->valid_until = now+3000; + (*vote)->vote_seconds = 100; + (*vote)->dist_seconds = 250; + smartlist_split_string((*vote)->supported_methods, "1 2 3 4", NULL, 0, -1); + (*vote)->client_versions = tor_strdup("0.1.2.14,0.1.2.17"); + (*vote)->server_versions = tor_strdup("0.1.2.10,0.1.2.15,0.1.2.16"); + smartlist_split_string((*vote)->known_flags, + "Authority Exit Fast Guard Running Stable V2Dir Valid", + 0, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); + voter->nickname = tor_strdup("Voter2"); + voter->address = tor_strdup("3.4.5.6"); + voter->addr = 0x03040506; + voter->dir_port = 80; + voter->or_port = 9000; + voter->contact = tor_strdup("voter@example.com"); + crypto_pk_get_digest(cert->identity_key, voter->identity_digest); + memset(voter->legacy_id_digest, (int)'A', DIGEST_LEN); + /* + * Set up a vote; generate it; try to parse it. + */ + smartlist_add((*vote)->voters, voter); + (*vote)->cert = authority_cert_dup(cert); + smartlist_split_string((*vote)->net_params, "circuitwindow=80 foo=660", + NULL, 0, 0); + /* add routerstatuses */ + /* dump the vote and try to parse it. */ + dir_common_add_rs_and_parse(*vote, vote_out, vrs_gen, sign_skey, + n_vrs, now, clear_rl); + + return 0; +} + diff --git a/src/wraith/src/test/test_dir_common.h b/src/wraith/src/test/test_dir_common.h new file mode 100644 index 000000000..65b9cf643 --- /dev/null +++ b/src/wraith/src/test/test_dir_common.h @@ -0,0 +1,52 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "networkstatus.h" +#include "routerparse.h" + +#define TEST_DIR_ROUTER_ID_1 3 +#define TEST_DIR_ROUTER_ID_2 5 +#define TEST_DIR_ROUTER_ID_3 33 +#define TEST_DIR_ROUTER_ID_4 34 + +#define TEST_DIR_ROUTER_DD_1 78 +#define TEST_DIR_ROUTER_DD_2 77 +#define TEST_DIR_ROUTER_DD_3 79 +#define TEST_DIR_ROUTER_DD_4 44 + +int dir_common_authority_pk_init(authority_cert_t **cert1, + authority_cert_t **cert2, + authority_cert_t **cert3, + crypto_pk_t **sign_skey_1, + crypto_pk_t **sign_skey_2, + crypto_pk_t **sign_skey_3); + +routerinfo_t * dir_common_generate_ri_from_rs(const vote_routerstatus_t *vrs); + +vote_routerstatus_t * dir_common_gen_routerstatus_for_v3ns(int idx, + time_t now); + +int dir_common_construct_vote_1(networkstatus_t **vote, + authority_cert_t *cert1, + crypto_pk_t *sign_skey, + vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), + networkstatus_t **vote_out, int *n_vrs, time_t now, + int clear_rl); + +int dir_common_construct_vote_2(networkstatus_t **vote, + authority_cert_t *cert2, + crypto_pk_t *sign_skey, + vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), + networkstatus_t **vote_out, int *n_vrs, time_t now, + int clear_rl); + +int dir_common_construct_vote_3(networkstatus_t **vote, + authority_cert_t *cert3, + crypto_pk_t *sign_skey, + vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), + networkstatus_t **vote_out, int *n_vrs, time_t now, + int clear_rl); + diff --git a/src/wraith/src/test/test_dir_handle_get.c b/src/wraith/src/test/test_dir_handle_get.c new file mode 100644 index 000000000..ca64dce5f --- /dev/null +++ b/src/wraith/src/test/test_dir_handle_get.c @@ -0,0 +1,2634 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define RENDCOMMON_PRIVATE +#define GEOIP_PRIVATE +#define CONNECTION_PRIVATE +#define CONFIG_PRIVATE +#define RENDCACHE_PRIVATE + +#include "or.h" +#include "config.h" +#include "connection.h" +#include "consdiffmgr.h" +#include "directory.h" +#include "test.h" +#include "compress.h" +#include "connection.h" +#include "rendcommon.h" +#include "rendcache.h" +#include "router.h" +#include "routerlist.h" +#include "rend_test_helpers.h" +#include "microdesc.h" +#include "test_helpers.h" +#include "nodelist.h" +#include "entrynodes.h" +#include "routerparse.h" +#include "networkstatus.h" +#include "proto_http.h" +#include "geoip.h" +#include "dirserv.h" +#include "dirvote.h" +#include "log_test_helpers.h" + +#ifdef _WIN32 +/* For mkdir() */ +#include +#else +#include +#endif /* defined(_WIN32) */ + +#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS +DISABLE_GCC_WARNING(overlength-strings) +/* We allow huge string constants in the unit tests, but not in the code + * at large. */ +#endif +#include "vote_descriptors.inc" +#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS +ENABLE_GCC_WARNING(overlength-strings) +#endif + +#define NS_MODULE dir_handle_get + +#define NOT_FOUND "HTTP/1.0 404 Not found\r\n\r\n" +#define BAD_REQUEST "HTTP/1.0 400 Bad request\r\n\r\n" +#define SERVER_BUSY "HTTP/1.0 503 Directory busy, try again later\r\n\r\n" +#define TOO_OLD "HTTP/1.0 404 Consensus is too old\r\n\r\n" +#define NOT_ENOUGH_CONSENSUS_SIGNATURES "HTTP/1.0 404 " \ + "Consensus not signed by sufficient number of requested authorities\r\n\r\n" + +static dir_connection_t * +new_dir_conn(void) +{ + dir_connection_t *conn = dir_connection_new(AF_INET); + tor_addr_from_ipv4h(&conn->base_.addr, 0x7f000001); + TO_CONN(conn)->address = tor_strdup("127.0.0.1"); + return conn; +} + +static void +test_dir_handle_get_bad_request(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + tt_int_op(directory_handle_command_get(conn, "", NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(header, OP_EQ, BAD_REQUEST); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_v1_command_not_found(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + // no frontpage configured + tt_ptr_op(get_dirportfrontpage(), OP_EQ, NULL); + + /* V1 path */ + tt_int_op(directory_handle_command_get(conn, GET("/tor/"), NULL, 0), + OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static const char* +mock_get_dirportfrontpage(void) +{ + return "HELLO FROM FRONTPAGE"; +} + +static void +test_dir_handle_get_v1_command(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0, body_len = 0; + const char *exp_body = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + MOCK(get_dirportfrontpage, mock_get_dirportfrontpage); + + exp_body = get_dirportfrontpage(); + body_len = strlen(exp_body); + + conn = new_dir_conn(); + tt_int_op(directory_handle_command_get(conn, GET("/tor/"), NULL, 0), + OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, body_len+1, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/html\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 20\r\n")); + + tt_int_op(body_used, OP_EQ, strlen(body)); + tt_str_op(body, OP_EQ, exp_body); + + done: + UNMOCK(connection_write_to_buf_impl_); + UNMOCK(get_dirportfrontpage); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); +} + +static void +test_dir_handle_get_not_found(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + /* Unrecognized path */ + tt_int_op(directory_handle_command_get(conn, GET("/anything"), NULL, 0), + OP_EQ, 0); + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_robots_txt(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + tt_int_op(directory_handle_command_get(conn, GET("/tor/robots.txt"), + NULL, 0), OP_EQ, 0); + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, 29, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 28\r\n")); + + tt_int_op(body_used, OP_EQ, strlen(body)); + tt_str_op(body, OP_EQ, "User-agent: *\r\nDisallow: /\r\n"); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); +} + +#define RENDEZVOUS2_GET(descid) GET("/tor/rendezvous2/" descid) +static void +test_dir_handle_get_rendezvous2_not_found_if_not_encrypted(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + // connection is not encrypted + tt_assert(!connection_dir_is_encrypted(conn)) + + tt_int_op(directory_handle_command_get(conn, RENDEZVOUS2_GET(), NULL, 0), + OP_EQ, 0); + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_rendezvous2_on_encrypted_conn_with_invalid_desc_id( + void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + conn = new_dir_conn(); + + // connection is encrypted + TO_CONN(conn)->linked = 1; + tt_assert(connection_dir_is_encrypted(conn)); + + tt_int_op(directory_handle_command_get(conn, + RENDEZVOUS2_GET("invalid-desc-id"), NULL, 0), OP_EQ, 0); + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(header, OP_EQ, BAD_REQUEST); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_rendezvous2_on_encrypted_conn_not_well_formed(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + conn = new_dir_conn(); + + // connection is encrypted + TO_CONN(conn)->linked = 1; + tt_assert(connection_dir_is_encrypted(conn)); + + //TODO: this cant be reached because rend_valid_descriptor_id() prevents this + //case to happen. This test is the same as + //test_dir_handle_get_rendezvous2_on_encrypted_conn_with_invalid_desc_id + //We should refactor to remove the case from the switch. + + const char *req = RENDEZVOUS2_GET("1bababababababababababababababab"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(header, OP_EQ, BAD_REQUEST); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_rendezvous2_not_found(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + conn = new_dir_conn(); + + rend_cache_init(); + + // connection is encrypted + TO_CONN(conn)->linked = 1; + tt_assert(connection_dir_is_encrypted(conn)); + + const char *req = RENDEZVOUS2_GET("3xqunszqnaolrrfmtzgaki7mxelgvkje"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + rend_cache_free_all(); +} + +NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); + +static routerinfo_t *mock_routerinfo; + +static const routerinfo_t * +NS(router_get_my_routerinfo)(void) +{ + if (!mock_routerinfo) { + mock_routerinfo = tor_malloc_zero(sizeof(routerinfo_t)); + } + + return mock_routerinfo; +} + +static void +test_dir_handle_get_rendezvous2_on_encrypted_conn_success(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + char buff[30]; + char req[70]; + rend_encoded_v2_service_descriptor_t *desc_holder = NULL; + char *service_id = NULL; + char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + size_t body_len = 0; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + NS_MOCK(router_get_my_routerinfo); + + rend_cache_init(); + + /* create a valid rend service descriptor */ + #define RECENT_TIME -10 + generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); + + tt_int_op(rend_cache_store_v2_desc_as_dir(desc_holder->desc_str), + OP_EQ, 0); + + base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, + DIGEST_LEN); + + conn = new_dir_conn(); + + // connection is encrypted + TO_CONN(conn)->linked = 1; + tt_assert(connection_dir_is_encrypted(conn)); + + tor_snprintf(req, sizeof(req), RENDEZVOUS2_GET("%s"), desc_id_base32); + + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + body_len = strlen(desc_holder->desc_str); + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, body_len+1, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Pragma: no-cache\r\n")); + tor_snprintf(buff, sizeof(buff), "Content-Length: %ld\r\n", (long) body_len); + tt_assert(strstr(header, buff)); + + tt_int_op(body_used, OP_EQ, strlen(body)); + tt_str_op(body, OP_EQ, desc_holder->desc_str); + + done: + UNMOCK(connection_write_to_buf_impl_); + NS_UNMOCK(router_get_my_routerinfo); + + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + rend_cache_free_all(); +} + +#define MICRODESC_GET(digest) GET("/tor/micro/d/" digest) +static void +test_dir_handle_get_micro_d_not_found(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + #define B64_256_1 "8/Pz8/u7vz8/Pz+7vz8/Pz+7u/Pz8/P7u/Pz8/P7u78" + #define B64_256_2 "zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMw" + conn = new_dir_conn(); + + const char *req = MICRODESC_GET(B64_256_1 "-" B64_256_2); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static or_options_t *mock_options = NULL; +static void +init_mock_options(void) +{ + mock_options = tor_malloc(sizeof(or_options_t)); + memset(mock_options, 0, sizeof(or_options_t)); + mock_options->TestingTorNetwork = 1; + mock_options->DataDirectory = tor_strdup(get_fname_rnd("datadir_tmp")); + mock_options->CacheDirectory = tor_strdup(mock_options->DataDirectory); + check_private_dir(mock_options->DataDirectory, CPD_CREATE, NULL); +} + +static const or_options_t * +mock_get_options(void) +{ + tor_assert(mock_options); + return mock_options; +} + +static const char microdesc[] = + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMjlHH/daN43cSVRaHBwgUfnszzAhg98EvivJ9Qxfv51mvQUxPjQ07es\n" + "gV/3n8fyh3Kqr/ehi9jxkdgSRfSnmF7giaHL1SLZ29kA7KtST+pBvmTpDtHa3ykX\n" + "Xorc7hJvIyTZoc1HU+5XSynj3gsBE5IGK1ZRzrNS688LnuZMVp1tAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static void +test_dir_handle_get_micro_d(void *data) +{ + dir_connection_t *conn = NULL; + microdesc_cache_t *mc = NULL ; + smartlist_t *list = NULL; + char digest[DIGEST256_LEN]; + char digest_base64[128]; + char path[80]; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + (void) data; + + MOCK(get_options, mock_get_options); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + /* SETUP */ + init_mock_options(); + + /* Add microdesc to cache */ + crypto_digest256(digest, microdesc, strlen(microdesc), DIGEST_SHA256); + base64_encode_nopad(digest_base64, sizeof(digest_base64), + (uint8_t *) digest, DIGEST256_LEN); + + mc = get_microdesc_cache(); + list = microdescs_add_to_cache(mc, microdesc, NULL, SAVED_NOWHERE, 0, + time(NULL), NULL); + tt_int_op(1, OP_EQ, smartlist_len(list)); + + /* Make the request */ + conn = new_dir_conn(); + + tor_snprintf(path, sizeof(path), MICRODESC_GET("%s"), digest_base64); + tt_int_op(directory_handle_command_get(conn, path, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, strlen(microdesc)+1, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + + tt_int_op(body_used, OP_EQ, strlen(body)); + tt_str_op(body, OP_EQ, microdesc); + + done: + UNMOCK(get_options); + UNMOCK(connection_write_to_buf_impl_); + + or_options_free(mock_options); mock_options = NULL; + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + smartlist_free(list); + microdesc_free_all(); +} + +static void +test_dir_handle_get_micro_d_server_busy(void *data) +{ + dir_connection_t *conn = NULL; + microdesc_cache_t *mc = NULL ; + smartlist_t *list = NULL; + char digest[DIGEST256_LEN]; + char digest_base64[128]; + char path[80]; + char *header = NULL; + (void) data; + + MOCK(get_options, mock_get_options); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + /* SETUP */ + init_mock_options(); + + /* Add microdesc to cache */ + crypto_digest256(digest, microdesc, strlen(microdesc), DIGEST_SHA256); + base64_encode_nopad(digest_base64, sizeof(digest_base64), + (uint8_t *) digest, DIGEST256_LEN); + + mc = get_microdesc_cache(); + list = microdescs_add_to_cache(mc, microdesc, NULL, SAVED_NOWHERE, 0, + time(NULL), NULL); + tt_int_op(1, OP_EQ, smartlist_len(list)); + + //Make it busy + mock_options->CountPrivateBandwidth = 1; + + /* Make the request */ + conn = new_dir_conn(); + + tor_snprintf(path, sizeof(path), MICRODESC_GET("%s"), digest_base64); + tt_int_op(directory_handle_command_get(conn, path, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(SERVER_BUSY, OP_EQ, header); + + done: + UNMOCK(get_options); + UNMOCK(connection_write_to_buf_impl_); + + or_options_free(mock_options); mock_options = NULL; + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + smartlist_free(list); + microdesc_free_all(); +} + +#define BRIDGES_PATH "/tor/networkstatus-bridges" +static void +test_dir_handle_get_networkstatus_bridges_not_found_without_auth(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(get_options, mock_get_options); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + /* SETUP */ + init_mock_options(); + mock_options->BridgeAuthoritativeDir = 1; + mock_options->BridgePassword_AuthDigest_ = tor_strdup("digest"); + + conn = new_dir_conn(); + TO_CONN(conn)->linked = 1; + + const char *req = GET(BRIDGES_PATH); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(get_options); + UNMOCK(connection_write_to_buf_impl_); + or_options_free(mock_options); mock_options = NULL; + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_networkstatus_bridges(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(get_options, mock_get_options); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + /* SETUP */ + init_mock_options(); + mock_options->BridgeAuthoritativeDir = 1; + mock_options->BridgePassword_AuthDigest_ = tor_malloc(DIGEST256_LEN); + crypto_digest256(mock_options->BridgePassword_AuthDigest_, + "abcdefghijklm12345", 18, DIGEST_SHA256); + + conn = new_dir_conn(); + TO_CONN(conn)->linked = 1; + + const char *req = "GET " BRIDGES_PATH " HTTP/1.0\r\n" + "Authorization: Basic abcdefghijklm12345\r\n\r\n"; + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 0\r\n")); + + done: + UNMOCK(get_options); + UNMOCK(connection_write_to_buf_impl_); + or_options_free(mock_options); mock_options = NULL; + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_networkstatus_bridges_not_found_wrong_auth(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(get_options, mock_get_options); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + /* SETUP */ + init_mock_options(); + mock_options->BridgeAuthoritativeDir = 1; + mock_options->BridgePassword_AuthDigest_ = tor_malloc(DIGEST256_LEN); + crypto_digest256(mock_options->BridgePassword_AuthDigest_, + "abcdefghijklm12345", 18, DIGEST_SHA256); + + conn = new_dir_conn(); + TO_CONN(conn)->linked = 1; + + const char *req = "GET " BRIDGES_PATH " HTTP/1.0\r\n" + "Authorization: Basic NOTSAMEDIGEST\r\n\r\n"; + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(get_options); + UNMOCK(connection_write_to_buf_impl_); + or_options_free(mock_options); mock_options = NULL; + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +#define SERVER_DESC_GET(id) GET("/tor/server/" id) +static void +test_dir_handle_get_server_descriptors_not_found(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + const char *req = SERVER_DESC_GET("invalid"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_str_op(NOT_FOUND, OP_EQ, header); + tt_ptr_op(conn->spool, OP_EQ, NULL); + + done: + UNMOCK(connection_write_to_buf_impl_); + or_options_free(mock_options); mock_options = NULL; + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_server_descriptors_all(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + (void) data; + + /* Setup fake routerlist. */ + helper_setup_fake_routerlist(); + + //TODO: change to router_get_my_extrainfo when testing "extra" path + NS_MOCK(router_get_my_routerinfo); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + // We are one of the routers + routerlist_t *our_routerlist = router_get_routerlist(); + tt_int_op(smartlist_len(our_routerlist->routers), OP_GE, 1); + mock_routerinfo = smartlist_get(our_routerlist->routers, 0); + set_server_identity_key(mock_routerinfo->identity_pkey); + mock_routerinfo->cache_info.published_on = time(NULL); + + /* Treat "all" requests as if they were unencrypted */ + mock_routerinfo->cache_info.send_unencrypted = 1; + + conn = new_dir_conn(); + + const char *req = SERVER_DESC_GET("all"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + //TODO: Is this a BUG? + //It requires strlen(signed_descriptor_len)+1 as body_len but returns a body + //which is smaller than that by annotation_len bytes + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, + 1024*1024, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + + //TODO: Is this a BUG? + //This is what should be expected: tt_int_op(body_used, OP_EQ, strlen(body)); + tt_int_op(body_used, OP_EQ, + mock_routerinfo->cache_info.signed_descriptor_len); + + tt_str_op(body, OP_EQ, mock_routerinfo->cache_info.signed_descriptor_body + + mock_routerinfo->cache_info.annotations_len); + tt_ptr_op(conn->spool, OP_EQ, NULL); + + done: + NS_UNMOCK(router_get_my_routerinfo); + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + + routerlist_free_all(); + nodelist_free_all(); + entry_guards_free_all(); +} + +static char +TEST_DESCRIPTOR[] = +"@uploaded-at 2014-06-08 19:20:11\n" +"@source \"127.0.0.1\"\n" +"router test000a 127.0.0.1 5000 0 7000\n" +"platform Tor 0.2.5.3-alpha-dev on Linux\n" +"protocols Link 1 2 Circuit 1\n" +"published 2014-06-08 19:20:11\n" +"fingerprint C7E7 CCB8 179F 8CC3 7F5C 8A04 2B3A 180B 934B 14BA\n" +"uptime 0\n" +"bandwidth 1073741824 1073741824 0\n" +"extra-info-digest 67A152A4C7686FB07664F872620635F194D76D95\n" +"caches-extra-info\n" +"onion-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAOuBUIEBARMkkka/TGyaQNgUEDLP0KG7sy6KNQTNOlZHUresPr/vlVjo\n" +"HPpLMfu9M2z18c51YX/muWwY9x4MyQooD56wI4+AqXQcJRwQfQlPn3Ay82uZViA9\n" +"DpBajRieLlKKkl145KjArpD7F5BVsqccvjErgFYXvhhjSrx7BVLnAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBAN6NLnSxWQnFXxqZi5D3b0BMgV6y9NJLGjYQVP+eWtPZWgqyv4zeYsqv\n" +"O9y6c5lvxyUxmNHfoAbe/s8f2Vf3/YaC17asAVSln4ktrr3e9iY74a9RMWHv1Gzk\n" +"3042nMcqj3PEhRN0PoLkcOZNjjmNbaqki6qy9bWWZDNTdo+uI44dAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"hidden-service-dir\n" +"contact auth0@test.test\n" +"ntor-onion-key pK4bs08ERYN591jj7ca17Rn9Q02TIEfhnjR6hSq+fhU=\n" +"reject *:*\n" +"router-signature\n" +"-----BEGIN SIGNATURE-----\n" +"rx88DuM3Y7tODlHNDDEVzKpwh3csaG1or+T4l2Xs1oq3iHHyPEtB6QTLYrC60trG\n" +"aAPsj3DEowGfjga1b248g2dtic8Ab+0exfjMm1RHXfDam5TXXZU3A0wMyoHjqHuf\n" +"eChGPgFNUvEc+5YtD27qEDcUjcinYztTs7/dzxBT4PE=\n" +"-----END SIGNATURE-----\n"; + +static void +test_dir_handle_get_server_descriptors_authority(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + crypto_pk_t *identity_pkey = pk_generate(0); + (void) data; + + NS_MOCK(router_get_my_routerinfo); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + /* init mock */ + router_get_my_routerinfo(); + crypto_pk_get_digest(identity_pkey, + mock_routerinfo->cache_info.identity_digest); + + // the digest is mine (the channel is unnecrypted, so we must allow sending) + set_server_identity_key(identity_pkey); + mock_routerinfo->cache_info.send_unencrypted = 1; + + /* Setup descriptor */ + long annotation_len = strstr(TEST_DESCRIPTOR, "router ") - TEST_DESCRIPTOR; + mock_routerinfo->cache_info.signed_descriptor_body = + tor_strdup(TEST_DESCRIPTOR); + mock_routerinfo->cache_info.signed_descriptor_len = + strlen(TEST_DESCRIPTOR) - annotation_len; + mock_routerinfo->cache_info.annotations_len = annotation_len; + mock_routerinfo->cache_info.published_on = time(NULL); + + conn = new_dir_conn(); + + const char *req = SERVER_DESC_GET("authority"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + //TODO: Is this a BUG? + //It requires strlen(TEST_DESCRIPTOR)+1 as body_len but returns a body which + //is smaller than that by annotation_len bytes + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, strlen(TEST_DESCRIPTOR)+1, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + + tt_int_op(body_used, OP_EQ, strlen(body)); + + tt_str_op(body, OP_EQ, TEST_DESCRIPTOR + annotation_len); + tt_ptr_op(conn->spool, OP_EQ, NULL); + + done: + NS_UNMOCK(router_get_my_routerinfo); + UNMOCK(connection_write_to_buf_impl_); + tor_free(mock_routerinfo->cache_info.signed_descriptor_body); + tor_free(mock_routerinfo); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + crypto_pk_free(identity_pkey); +} + +static void +test_dir_handle_get_server_descriptors_fp(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + crypto_pk_t *identity_pkey = pk_generate(0); + (void) data; + + NS_MOCK(router_get_my_routerinfo); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + /* init mock */ + router_get_my_routerinfo(); + crypto_pk_get_digest(identity_pkey, + mock_routerinfo->cache_info.identity_digest); + + // the digest is mine (the channel is unnecrypted, so we must allow sending) + set_server_identity_key(identity_pkey); + mock_routerinfo->cache_info.send_unencrypted = 1; + + /* Setup descriptor */ + long annotation_len = strstr(TEST_DESCRIPTOR, "router ") - TEST_DESCRIPTOR; + mock_routerinfo->cache_info.signed_descriptor_body = + tor_strdup(TEST_DESCRIPTOR); + mock_routerinfo->cache_info.signed_descriptor_len = + strlen(TEST_DESCRIPTOR) - annotation_len; + mock_routerinfo->cache_info.annotations_len = annotation_len; + mock_routerinfo->cache_info.published_on = time(NULL); + + conn = new_dir_conn(); + + #define HEX1 "Fe0daff89127389bc67558691231234551193EEE" + #define HEX2 "Deadbeef99999991111119999911111111f00ba4" + const char *hex_digest = hex_str(mock_routerinfo->cache_info.identity_digest, + DIGEST_LEN); + + char req[155]; + tor_snprintf(req, sizeof(req), SERVER_DESC_GET("fp/%s+" HEX1 "+" HEX2), + hex_digest); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + //TODO: Is this a BUG? + //It requires strlen(TEST_DESCRIPTOR)+1 as body_len but returns a body which + //is smaller than that by annotation_len bytes + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, strlen(TEST_DESCRIPTOR)+1, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + + tt_int_op(body_used, OP_EQ, strlen(body)); + + tt_str_op(body, OP_EQ, TEST_DESCRIPTOR + annotation_len); + tt_ptr_op(conn->spool, OP_EQ, NULL); + + done: + NS_UNMOCK(router_get_my_routerinfo); + UNMOCK(connection_write_to_buf_impl_); + tor_free(mock_routerinfo->cache_info.signed_descriptor_body); + tor_free(mock_routerinfo); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + crypto_pk_free(identity_pkey); +} + +#define HEX1 "Fe0daff89127389bc67558691231234551193EEE" +#define HEX2 "Deadbeef99999991111119999911111111f00ba4" + +static void +test_dir_handle_get_server_descriptors_d(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + crypto_pk_t *identity_pkey = pk_generate(0); + (void) data; + + /* Setup fake routerlist. */ + helper_setup_fake_routerlist(); + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + /* Get one router's signed_descriptor_digest */ + routerlist_t *our_routerlist = router_get_routerlist(); + tt_int_op(smartlist_len(our_routerlist->routers), OP_GE, 1); + routerinfo_t *router = smartlist_get(our_routerlist->routers, 0); + const char *hex_digest = hex_str(router->cache_info.signed_descriptor_digest, + DIGEST_LEN); + + conn = new_dir_conn(); + + char req_header[155]; /* XXX Why 155? What kind of number is that?? */ + tor_snprintf(req_header, sizeof(req_header), + SERVER_DESC_GET("d/%s+" HEX1 "+" HEX2), hex_digest); + tt_int_op(directory_handle_command_get(conn, req_header, NULL, 0), OP_EQ, 0); + + //TODO: Is this a BUG? + //It requires strlen(signed_descriptor_len)+1 as body_len but returns a body + //which is smaller than that by annotation_len bytes + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, + router->cache_info.signed_descriptor_len+1, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + + //TODO: Is this a BUG? + //This is what should be expected: + //tt_int_op(body_used, OP_EQ, strlen(body)); + tt_int_op(body_used, OP_EQ, router->cache_info.signed_descriptor_len); + + tt_str_op(body, OP_EQ, router->cache_info.signed_descriptor_body + + router->cache_info.annotations_len); + tt_ptr_op(conn->spool, OP_EQ, NULL); + + done: + UNMOCK(connection_write_to_buf_impl_); + tor_free(mock_routerinfo); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + crypto_pk_free(identity_pkey); + + routerlist_free_all(); + nodelist_free_all(); + entry_guards_free_all(); +} + +static void +test_dir_handle_get_server_descriptors_busy(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + crypto_pk_t *identity_pkey = pk_generate(0); + (void) data; + + /* Setup fake routerlist. */ + helper_setup_fake_routerlist(); + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + //Make it busy + MOCK(get_options, mock_get_options); + init_mock_options(); + mock_options->CountPrivateBandwidth = 1; + + /* Get one router's signed_descriptor_digest */ + routerlist_t *our_routerlist = router_get_routerlist(); + tt_int_op(smartlist_len(our_routerlist->routers), OP_GE, 1); + routerinfo_t *router = smartlist_get(our_routerlist->routers, 0); + const char *hex_digest = hex_str(router->cache_info.signed_descriptor_digest, + DIGEST_LEN); + + conn = new_dir_conn(); + + #define HEX1 "Fe0daff89127389bc67558691231234551193EEE" + #define HEX2 "Deadbeef99999991111119999911111111f00ba4" + char req_header[155]; /* XXX 155? Why 155? */ + tor_snprintf(req_header, sizeof(req_header), + SERVER_DESC_GET("d/%s+" HEX1 "+" HEX2), hex_digest); + tt_int_op(directory_handle_command_get(conn, req_header, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_assert(header); + tt_str_op(SERVER_BUSY, OP_EQ, header); + + tt_ptr_op(conn->spool, OP_EQ, NULL); + + done: + UNMOCK(get_options); + UNMOCK(connection_write_to_buf_impl_); + tor_free(mock_routerinfo); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + crypto_pk_free(identity_pkey); + + routerlist_free_all(); + nodelist_free_all(); + entry_guards_free_all(); +} + +static void +test_dir_handle_get_server_keys_bad_req(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + const char *req = GET("/tor/keys/"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_assert(header); + tt_str_op(BAD_REQUEST, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_server_keys_all_not_found(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + const char *req = GET("/tor/keys/all"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +#define TEST_CERTIFICATE AUTHORITY_CERT_3 +#define TEST_SIGNING_KEY AUTHORITY_SIGNKEY_A_DIGEST + +static const char TEST_CERT_IDENT_KEY[] = + "D867ACF56A9D229B35C25F0090BC9867E906BE69"; + +static void +test_dir_handle_get_server_keys_all(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + const char digest[DIGEST_LEN] = ""; + + dir_server_t *ds = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + clear_dir_servers(); + routerlist_free_all(); + + /* create a trusted ds */ + ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, + NULL, V3_DIRINFO, 1.0); + tt_assert(ds); + dir_server_add(ds); + + /* ds v3_identity_digest is the certificate's identity_key */ + base16_decode(ds->v3_identity_digest, DIGEST_LEN, + TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); + tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, + TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); + + conn = new_dir_conn(); + + const char *req = GET("/tor/keys/all"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, strlen(TEST_CERTIFICATE)+1, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 1883\r\n")); + + tt_str_op(TEST_CERTIFICATE, OP_EQ, body); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + + clear_dir_servers(); + routerlist_free_all(); +} + +static void +test_dir_handle_get_server_keys_authority_not_found(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + const char *req = GET("/tor/keys/authority"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static authority_cert_t * mock_cert = NULL; + +static authority_cert_t * +get_my_v3_authority_cert_m(void) +{ + tor_assert(mock_cert); + return mock_cert; +} + +static void +test_dir_handle_get_server_keys_authority(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + (void) data; + + mock_cert = authority_cert_parse_from_string(TEST_CERTIFICATE, NULL); + + MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + const char *req = GET("/tor/keys/authority"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, strlen(TEST_CERTIFICATE)+1, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 1883\r\n")); + + tt_str_op(TEST_CERTIFICATE, OP_EQ, body); + + done: + UNMOCK(get_my_v3_authority_cert); + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + authority_cert_free(mock_cert); mock_cert = NULL; +} + +static void +test_dir_handle_get_server_keys_fp_not_found(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + const char *req = GET("/tor/keys/fp/somehex"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_server_keys_fp(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + dir_server_t *ds = NULL; + const char digest[DIGEST_LEN] = ""; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + clear_dir_servers(); + routerlist_free_all(); + + /* create a trusted ds */ + ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, + NULL, V3_DIRINFO, 1.0); + tt_assert(ds); + dir_server_add(ds); + + /* ds v3_identity_digest is the certificate's identity_key */ + base16_decode(ds->v3_identity_digest, DIGEST_LEN, + TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); + + tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, + TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); + + conn = new_dir_conn(); + char req[71]; + tor_snprintf(req, sizeof(req), + GET("/tor/keys/fp/%s"), TEST_CERT_IDENT_KEY); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, strlen(TEST_CERTIFICATE)+1, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 1883\r\n")); + + tt_str_op(TEST_CERTIFICATE, OP_EQ, body); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + clear_dir_servers(); + routerlist_free_all(); +} + +static void +test_dir_handle_get_server_keys_sk_not_found(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + const char *req = GET("/tor/keys/sk/somehex"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_server_keys_sk(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + (void) data; + + mock_cert = authority_cert_parse_from_string(TEST_CERTIFICATE, NULL); + MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + clear_dir_servers(); + routerlist_free_all(); + + tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, + TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); + + conn = new_dir_conn(); + char req[71]; + tor_snprintf(req, sizeof(req), + GET("/tor/keys/sk/%s"), TEST_SIGNING_KEY); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, strlen(TEST_CERTIFICATE)+1, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 1883\r\n")); + + tt_str_op(TEST_CERTIFICATE, OP_EQ, body); + + done: + UNMOCK(get_my_v3_authority_cert); + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + authority_cert_free(mock_cert); mock_cert = NULL; + tor_free(header); + tor_free(body); +} + +static void +test_dir_handle_get_server_keys_fpsk_not_found(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + + const char *req = GET("/tor/keys/fp-sk/somehex"); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_server_keys_fpsk(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + dir_server_t *ds = NULL; + const char digest[DIGEST_LEN] = ""; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + clear_dir_servers(); + routerlist_free_all(); + + /* create a trusted ds */ + ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, + NULL, V3_DIRINFO, 1.0); + tt_assert(ds); + + /* ds v3_identity_digest is the certificate's identity_key */ + base16_decode(ds->v3_identity_digest, DIGEST_LEN, + TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); + dir_server_add(ds); + + tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, + TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); + + conn = new_dir_conn(); + + char req[115]; + tor_snprintf(req, sizeof(req), + GET("/tor/keys/fp-sk/%s-%s"), + TEST_CERT_IDENT_KEY, TEST_SIGNING_KEY); + + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, strlen(TEST_CERTIFICATE)+1, 0); + + tt_assert(header); + tt_assert(body); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 1883\r\n")); + + tt_str_op(TEST_CERTIFICATE, OP_EQ, body); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + + clear_dir_servers(); + routerlist_free_all(); +} + +static void +test_dir_handle_get_server_keys_busy(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + dir_server_t *ds = NULL; + const char digest[DIGEST_LEN] = ""; + (void) data; + + clear_dir_servers(); + routerlist_free_all(); + + /* create a trusted ds */ + ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, + NULL, V3_DIRINFO, 1.0); + tt_assert(ds); + + /* ds v3_identity_digest is the certificate's identity_key */ + base16_decode(ds->v3_identity_digest, DIGEST_LEN, + TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); + dir_server_add(ds); + + tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, + TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); + + MOCK(get_options, mock_get_options); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + /* setup busy server */ + init_mock_options(); + mock_options->CountPrivateBandwidth = 1; + + conn = new_dir_conn(); + char req[71]; + tor_snprintf(req, sizeof(req), GET("/tor/keys/fp/%s"), TEST_CERT_IDENT_KEY); + tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_assert(header); + tt_str_op(SERVER_BUSY, OP_EQ, header); + + done: + UNMOCK(get_options); + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + or_options_free(mock_options); mock_options = NULL; + + clear_dir_servers(); + routerlist_free_all(); +} + +static networkstatus_t *mock_ns_val = NULL; +static networkstatus_t * +mock_ns_get_by_flavor(consensus_flavor_t f) +{ + (void)f; + return mock_ns_val; +} + +static void +test_dir_handle_get_status_vote_current_consensus_ns_not_enough_sigs(void* d) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *stats = NULL; + (void) d; + + /* init mock */ + mock_ns_val = tor_malloc_zero(sizeof(networkstatus_t)); + mock_ns_val->flavor = FLAV_NS; + mock_ns_val->type = NS_TYPE_CONSENSUS; + mock_ns_val->voters = smartlist_new(); + mock_ns_val->valid_after = time(NULL) - 1800; + mock_ns_val->valid_until = time(NULL) - 60; + + #define NETWORK_STATUS "some network status string" + consdiffmgr_add_consensus(NETWORK_STATUS, mock_ns_val); + + /* init mock */ + init_mock_options(); + + MOCK(get_options, mock_get_options); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + MOCK(networkstatus_get_latest_consensus_by_flavor, mock_ns_get_by_flavor); + + /* start gathering stats */ + mock_options->DirReqStatistics = 1; + geoip_dirreq_stats_init(time(NULL)); + + conn = new_dir_conn(); + + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/current/consensus-ns/" HEX1 "+" HEX2), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + + tt_assert(header); + tt_str_op(NOT_ENOUGH_CONSENSUS_SIGNATURES, OP_EQ, header); + + stats = geoip_format_dirreq_stats(time(NULL)); + tt_assert(stats); + tt_assert(strstr(stats, "not-enough-sigs=8")); + + done: + UNMOCK(networkstatus_get_latest_consensus_by_flavor); + UNMOCK(connection_write_to_buf_impl_); + UNMOCK(get_options); + + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(stats); + smartlist_free(mock_ns_val->voters); + tor_free(mock_ns_val); + or_options_free(mock_options); mock_options = NULL; +} + +static void +test_dir_handle_get_status_vote_current_consensus_ns_not_found(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + char *stats = NULL; + (void) data; + + init_mock_options(); + + MOCK(get_options, mock_get_options); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + /* start gathering stats */ + mock_options->DirReqStatistics = 1; + geoip_dirreq_stats_init(time(NULL)); + + conn = new_dir_conn(); + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/current/consensus-ns"), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + stats = geoip_format_dirreq_stats(time(NULL)); + tt_assert(stats); + tt_assert(strstr(stats, "not-found=8")); + + done: + UNMOCK(connection_write_to_buf_impl_); + UNMOCK(get_options); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(stats); + or_options_free(mock_options); mock_options = NULL; +} + +static void +test_dir_handle_get_status_vote_current_consensus_too_old(void *data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void)data; + + mock_ns_val = tor_malloc_zero(sizeof(networkstatus_t)); + mock_ns_val->type = NS_TYPE_CONSENSUS; + mock_ns_val->flavor = FLAV_MICRODESC; + mock_ns_val->valid_after = time(NULL) - (24 * 60 * 60 + 1800); + mock_ns_val->fresh_until = time(NULL) - (24 * 60 * 60 + 900); + mock_ns_val->valid_until = time(NULL) - (24 * 60 * 60 + 20); + + #define NETWORK_STATUS "some network status string" + consdiffmgr_add_consensus(NETWORK_STATUS, mock_ns_val); + + init_mock_options(); + + MOCK(get_options, mock_get_options); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + MOCK(networkstatus_get_latest_consensus_by_flavor, mock_ns_get_by_flavor); + + conn = new_dir_conn(); + + setup_capture_of_logs(LOG_WARN); + + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/current/consensus-microdesc"), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + tt_assert(header); + tt_str_op(TOO_OLD, OP_EQ, header); + + expect_log_msg_containing("too old"); + + tor_free(header); + teardown_capture_of_logs(); + tor_free(mock_ns_val); + + mock_ns_val = tor_malloc_zero(sizeof(networkstatus_t)); + mock_ns_val->type = NS_TYPE_CONSENSUS; + mock_ns_val->flavor = FLAV_NS; + mock_ns_val->valid_after = time(NULL) - (24 * 60 * 60 + 1800); + mock_ns_val->fresh_until = time(NULL) - (24 * 60 * 60 + 900); + mock_ns_val->valid_until = time(NULL) - (24 * 60 * 60 + 20); + + #define NETWORK_STATUS "some network status string" + consdiffmgr_add_consensus(NETWORK_STATUS, mock_ns_val); + + setup_capture_of_logs(LOG_WARN); + + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/current/consensus"), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + tt_assert(header); + tt_str_op(TOO_OLD, OP_EQ, header); + + expect_no_log_entry(); + + done: + teardown_capture_of_logs(); + UNMOCK(networkstatus_get_latest_consensus_by_flavor); + UNMOCK(connection_write_to_buf_impl_); + UNMOCK(get_options); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(mock_ns_val); + or_options_free(mock_options); mock_options = NULL; +} + +NS_DECL(int, geoip_get_country_by_addr, (const tor_addr_t *addr)); + +int +NS(geoip_get_country_by_addr)(const tor_addr_t *addr) +{ + (void)addr; + CALLED(geoip_get_country_by_addr)++; + return 1; +} + +static void +status_vote_current_consensus_ns_test(char **header, char **body, + size_t *body_len) +{ + dir_connection_t *conn = NULL; + + #define NETWORK_STATUS "some network status string" +#if 0 + common_digests_t digests; + uint8_t sha3[DIGEST256_LEN]; + memset(&digests, 0x60, sizeof(digests)); + memset(sha3, 0x06, sizeof(sha3)); + dirserv_set_cached_consensus_networkstatus(NETWORK_STATUS, "ns", &digests, + sha3, + time(NULL)); +#endif /* 0 */ + networkstatus_t *ns = tor_malloc_zero(sizeof(networkstatus_t)); + ns->type = NS_TYPE_CONSENSUS; + ns->flavor = FLAV_NS; + ns->valid_after = time(NULL) - 1800; + ns->fresh_until = time(NULL) - 900; + ns->valid_until = time(NULL) - 60; + consdiffmgr_add_consensus(NETWORK_STATUS, ns); + networkstatus_vote_free(ns); + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + tt_assert(mock_options); + mock_options->DirReqStatistics = 1; + geoip_dirreq_stats_init(time(NULL)); + + /* init geoip database */ + geoip_parse_entry("10,50,AB", AF_INET); + tt_str_op("ab", OP_EQ, geoip_get_country_name(1)); + + conn = new_dir_conn(); + + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/current/consensus-ns"), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, header, MAX_HEADERS_SIZE, + body, body_len, strlen(NETWORK_STATUS)+7, 0); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); +} + +static void +test_dir_handle_get_status_vote_current_consensus_ns(void* data) +{ + char *header = NULL; + char *body = NULL, *comp_body = NULL; + size_t body_used = 0, comp_body_used = 0; + char *stats = NULL, *hist = NULL; + (void) data; + + dirserv_free_all(); + clear_geoip_db(); + + NS_MOCK(geoip_get_country_by_addr); + MOCK(get_options, mock_get_options); + + init_mock_options(); + + status_vote_current_consensus_ns_test(&header, &comp_body, &comp_body_used); + tt_assert(header); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Pragma: no-cache\r\n")); + + compress_method_t compression = detect_compression_method(comp_body, + comp_body_used); + tt_int_op(ZLIB_METHOD, OP_EQ, compression); + + tor_uncompress(&body, &body_used, comp_body, comp_body_used, + compression, 0, LOG_PROTOCOL_WARN); + + tt_str_op(NETWORK_STATUS, OP_EQ, body); + tt_int_op(strlen(NETWORK_STATUS), OP_EQ, body_used); + + stats = geoip_format_dirreq_stats(time(NULL)); + tt_assert(stats); + + tt_assert(strstr(stats, "ok=8")); + tt_assert(strstr(stats, "dirreq-v3-ips ab=8")); + tt_assert(strstr(stats, "dirreq-v3-reqs ab=8")); + tt_assert(strstr(stats, "dirreq-v3-direct-dl" + " complete=0,timeout=0,running=4")); + + hist = geoip_get_request_history(); + tt_assert(hist); + tt_str_op("ab=8", OP_EQ, hist); + + done: + NS_UNMOCK(geoip_get_country_by_addr); + UNMOCK(get_options); + tor_free(header); + tor_free(comp_body); + tor_free(body); + tor_free(stats); + tor_free(hist); + or_options_free(mock_options); mock_options = NULL; + + dirserv_free_all(); + clear_geoip_db(); +} + +static void +test_dir_handle_get_status_vote_current_consensus_ns_busy(void* data) +{ + char *header = NULL; + char *body = NULL; + size_t body_used = 0; + char *stats = NULL; + (void) data; + + dirserv_free_all(); + clear_geoip_db(); + + MOCK(get_options, mock_get_options); + + // Make it busy + init_mock_options(); + mock_options->CountPrivateBandwidth = 1; + + status_vote_current_consensus_ns_test(&header, &body, &body_used); + tt_assert(header); + + tt_str_op(SERVER_BUSY, OP_EQ, header); + + stats = geoip_format_dirreq_stats(time(NULL)); + tt_assert(stats); + tt_assert(strstr(stats, "busy=8")); + + done: + UNMOCK(get_options); + tor_free(header); + tor_free(body); + or_options_free(mock_options); mock_options = NULL; + + tor_free(stats); + dirserv_free_all(); + clear_geoip_db(); +} + +static void +test_dir_handle_get_status_vote_current_not_found(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/current/" HEX1), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +#define VOTE_DIGEST "312A4890D4D832597ABBD3089C782DBBFB81E48D" + +static void +status_vote_current_d_test(char **header, char **body, size_t *body_l) +{ + dir_connection_t *conn = NULL; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/current/d/" VOTE_DIGEST), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, header, MAX_HEADERS_SIZE, + body, body_l, strlen(VOTE_BODY_V3)+1, 0); + tt_assert(header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); +} + +static void +status_vote_next_d_test(char **header, char **body, size_t *body_l) +{ + dir_connection_t *conn = NULL; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/next/d/" VOTE_DIGEST), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, header, MAX_HEADERS_SIZE, + body, body_l, strlen(VOTE_BODY_V3)+1, 0); + tt_assert(header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); +} + +static void +test_dir_handle_get_status_vote_current_d_not_found(void* data) +{ + char *header = NULL; + (void) data; + + status_vote_current_d_test(&header, NULL, NULL); + + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + tor_free(header); +} + +static void +test_dir_handle_get_status_vote_next_d_not_found(void* data) +{ + char *header = NULL; + (void) data; + + status_vote_next_d_test(&header, NULL, NULL); + + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + tor_free(header); +} + +static void +test_dir_handle_get_status_vote_d(void* data) +{ + char *header = NULL, *body = NULL; + size_t body_used = 0; + dir_server_t *ds = NULL; + const char digest[DIGEST_LEN] = ""; + (void) data; + + clear_dir_servers(); + dirvote_free_all(); + + /* create a trusted ds */ + ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, + NULL, V3_DIRINFO, 1.0); + tt_assert(ds); + dir_server_add(ds); + + /* ds v3_identity_digest is the certificate's identity_key */ + base16_decode(ds->v3_identity_digest, DIGEST_LEN, + TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); + + init_mock_options(); + mock_options->AuthoritativeDir = 1; + mock_options->V3AuthoritativeDir = 1; + mock_options->TestingV3AuthVotingStartOffset = 0; + mock_options->TestingV3AuthInitialVotingInterval = 1; + mock_options->TestingV3AuthInitialVoteDelay = 1; + mock_options->TestingV3AuthInitialDistDelay = 1; + + time_t now = 1441223455 -1; + dirvote_recalculate_timing(mock_options, now); + + const char *msg_out = NULL; + int status_out = 0; + struct pending_vote_t *pv = dirvote_add_vote(VOTE_BODY_V3, &msg_out, + &status_out); + tt_assert(pv); + + status_vote_current_d_test(&header, &body, &body_used); + + tt_assert(header); + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 4135\r\n")); + + tt_str_op(VOTE_BODY_V3, OP_EQ, body); + + tor_free(header); + tor_free(body); + + status_vote_next_d_test(&header, &body, &body_used); + + tt_assert(header); + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 4135\r\n")); + + tt_str_op(VOTE_BODY_V3, OP_EQ, body); + + done: + tor_free(header); + tor_free(body); + or_options_free(mock_options); mock_options = NULL; + + clear_dir_servers(); + dirvote_free_all(); +} + +static void +test_dir_handle_get_status_vote_next_not_found(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/next/" HEX1), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +status_vote_next_consensus_test(char **header, char **body, size_t *body_used) +{ + dir_connection_t *conn = NULL; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/next/consensus"), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, header, MAX_HEADERS_SIZE, + body, body_used, 18, 0); + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); +} + +static void +test_dir_handle_get_status_vote_next_consensus_not_found(void* data) +{ + char *header = NULL, *body = NULL; + size_t body_used; + (void) data; + + status_vote_next_consensus_test(&header, &body, &body_used); + + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + tor_free(header); + tor_free(body); +} + +static void +test_dir_handle_get_status_vote_current_authority_not_found(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/current/authority"), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +static void +test_dir_handle_get_status_vote_next_authority_not_found(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL; + (void) data; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/next/authority"), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + NULL, NULL, 1, 0); + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + UNMOCK(connection_write_to_buf_impl_); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); +} + +NS_DECL(const char*, +dirvote_get_pending_consensus, (consensus_flavor_t flav)); + +const char* +NS(dirvote_get_pending_consensus)(consensus_flavor_t flav) +{ + (void)flav; + return "pending consensus"; +} + +static void +test_dir_handle_get_status_vote_next_consensus(void* data) +{ + char *header = NULL, *body = NULL; + size_t body_used = 0; + (void) data; + + NS_MOCK(dirvote_get_pending_consensus); + + status_vote_next_consensus_test(&header, &body, &body_used); + tt_assert(header); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 17\r\n")); + + tt_str_op("pending consensus", OP_EQ, body); + + done: + NS_UNMOCK(dirvote_get_pending_consensus); + tor_free(header); + tor_free(body); +} + +static void +test_dir_handle_get_status_vote_next_consensus_busy(void* data) +{ + char *header = NULL, *body = NULL; + size_t body_used = 0; + (void) data; + + MOCK(get_options, mock_get_options); + NS_MOCK(dirvote_get_pending_consensus); + + //Make it busy + init_mock_options(); + mock_options->CountPrivateBandwidth = 1; + + status_vote_next_consensus_test(&header, &body, &body_used); + + tt_assert(header); + tt_str_op(SERVER_BUSY, OP_EQ, header); + + done: + NS_UNMOCK(dirvote_get_pending_consensus); + UNMOCK(get_options); + tor_free(header); + tor_free(body); + or_options_free(mock_options); mock_options = NULL; +} + +static void +status_vote_next_consensus_signatures_test(char **header, char **body, + size_t *body_used) +{ + dir_connection_t *conn = NULL; + + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/next/consensus-signatures"), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, header, MAX_HEADERS_SIZE, + body, body_used, 22, 0); + + done: + connection_free_minimal(TO_CONN(conn)); + UNMOCK(connection_write_to_buf_impl_); +} + +static void +test_dir_handle_get_status_vote_next_consensus_signatures_not_found(void* data) +{ + char *header = NULL, *body = NULL; + size_t body_used; + (void) data; + + status_vote_next_consensus_signatures_test(&header, &body, &body_used); + + tt_assert(header); + tt_str_op(NOT_FOUND, OP_EQ, header); + + done: + tor_free(header); + tor_free(body); +} + +NS_DECL(const char*, +dirvote_get_pending_detached_signatures, (void)); + +const char* +NS(dirvote_get_pending_detached_signatures)(void) +{ + return "pending detached sigs"; +} + +static void +test_dir_handle_get_status_vote_next_consensus_signatures(void* data) +{ + char *header = NULL, *body = NULL; + size_t body_used = 0; + (void) data; + + NS_MOCK(dirvote_get_pending_detached_signatures); + + status_vote_next_consensus_signatures_test(&header, &body, &body_used); + tt_assert(header); + + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 21\r\n")); + + tt_str_op("pending detached sigs", OP_EQ, body); + + done: + NS_UNMOCK(dirvote_get_pending_detached_signatures); + tor_free(header); + tor_free(body); +} + +static void +test_dir_handle_get_status_vote_next_consensus_signatures_busy(void* data) +{ + char *header = NULL, *body = NULL; + size_t body_used; + (void) data; + + NS_MOCK(dirvote_get_pending_detached_signatures); + MOCK(get_options, mock_get_options); + + //Make it busy + init_mock_options(); + mock_options->CountPrivateBandwidth = 1; + + status_vote_next_consensus_signatures_test(&header, &body, &body_used); + + tt_assert(header); + tt_str_op(SERVER_BUSY, OP_EQ, header); + + done: + UNMOCK(get_options); + NS_UNMOCK(dirvote_get_pending_detached_signatures); + tor_free(header); + tor_free(body); + or_options_free(mock_options); mock_options = NULL; +} + +static void +test_dir_handle_get_status_vote_next_authority(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL, *body = NULL; + const char *msg_out = NULL; + int status_out = 0; + size_t body_used = 0; + dir_server_t *ds = NULL; + const char digest[DIGEST_LEN] = ""; + (void) data; + + clear_dir_servers(); + routerlist_free_all(); + dirvote_free_all(); + + mock_cert = authority_cert_parse_from_string(TEST_CERTIFICATE, NULL); + + /* create a trusted ds */ + ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, + NULL, V3_DIRINFO, 1.0); + tt_assert(ds); + dir_server_add(ds); + + /* ds v3_identity_digest is the certificate's identity_key */ + base16_decode(ds->v3_identity_digest, DIGEST_LEN, + TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); + tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, + TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); + + init_mock_options(); + mock_options->AuthoritativeDir = 1; + mock_options->V3AuthoritativeDir = 1; + mock_options->TestingV3AuthVotingStartOffset = 0; + mock_options->TestingV3AuthInitialVotingInterval = 1; + mock_options->TestingV3AuthInitialVoteDelay = 1; + mock_options->TestingV3AuthInitialDistDelay = 1; + + time_t now = 1441223455 -1; + dirvote_recalculate_timing(mock_options, now); + + struct pending_vote_t *vote = dirvote_add_vote(VOTE_BODY_V3, &msg_out, + &status_out); + tt_assert(vote); + + MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/next/authority"), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, strlen(VOTE_BODY_V3)+1, 0); + + tt_assert(header); + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 4135\r\n")); + + tt_str_op(VOTE_BODY_V3, OP_EQ, body); + + done: + UNMOCK(connection_write_to_buf_impl_); + UNMOCK(get_my_v3_authority_cert); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + authority_cert_free(mock_cert); mock_cert = NULL; + or_options_free(mock_options); mock_options = NULL; + + clear_dir_servers(); + routerlist_free_all(); + dirvote_free_all(); +} + +static void +test_dir_handle_get_status_vote_current_authority(void* data) +{ + dir_connection_t *conn = NULL; + char *header = NULL, *body = NULL; + const char *msg_out = NULL; + int status_out = 0; + size_t body_used = 0; + const char digest[DIGEST_LEN] = ""; + + dir_server_t *ds = NULL; + (void) data; + + clear_dir_servers(); + routerlist_free_all(); + dirvote_free_all(); + + mock_cert = authority_cert_parse_from_string(TEST_CERTIFICATE, NULL); + + /* create a trusted ds */ + ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, + NULL, V3_DIRINFO, 1.0); + tt_assert(ds); + dir_server_add(ds); + + /* ds v3_identity_digest is the certificate's identity_key */ + base16_decode(ds->v3_identity_digest, DIGEST_LEN, + TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); + + tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, + TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); + + init_mock_options(); + mock_options->AuthoritativeDir = 1; + mock_options->V3AuthoritativeDir = 1; + mock_options->TestingV3AuthVotingStartOffset = 0; + mock_options->TestingV3AuthInitialVotingInterval = 1; + mock_options->TestingV3AuthInitialVoteDelay = 1; + mock_options->TestingV3AuthInitialDistDelay = 1; + + time_t now = 1441223455; + dirvote_recalculate_timing(mock_options, now-1); + + struct pending_vote_t *vote = dirvote_add_vote(VOTE_BODY_V3, &msg_out, + &status_out); + tt_assert(vote); + + // move the pending vote to previous vote + dirvote_act(mock_options, now+1); + + MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); + MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); + + conn = new_dir_conn(); + tt_int_op(0, OP_EQ, directory_handle_command_get(conn, + GET("/tor/status-vote/current/authority"), NULL, 0)); + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, + &body, &body_used, strlen(VOTE_BODY_V3)+1, 0); + + tt_assert(header); + tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); + tt_assert(strstr(header, "Content-Type: text/plain\r\n")); + tt_assert(strstr(header, "Content-Encoding: identity\r\n")); + tt_assert(strstr(header, "Content-Length: 4135\r\n")); + + tt_str_op(VOTE_BODY_V3, OP_EQ, body); + + done: + UNMOCK(connection_write_to_buf_impl_); + UNMOCK(get_my_v3_authority_cert); + connection_free_minimal(TO_CONN(conn)); + tor_free(header); + tor_free(body); + authority_cert_free(mock_cert); mock_cert = NULL; + or_options_free(mock_options); mock_options = NULL; + + clear_dir_servers(); + routerlist_free_all(); + dirvote_free_all(); +} + +static void +test_dir_handle_get_parse_accept_encoding(void *arg) +{ + (void)arg; + const unsigned B_NONE = 1u << NO_METHOD; + const unsigned B_ZLIB = 1u << ZLIB_METHOD; + const unsigned B_GZIP = 1u << GZIP_METHOD; + const unsigned B_LZMA = 1u << LZMA_METHOD; + const unsigned B_ZSTD = 1u << ZSTD_METHOD; + + unsigned encodings; + + encodings = parse_accept_encoding_header(""); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header(" "); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("dewey, cheatham, and howe "); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("dewey, cheatham, and gzip"); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("dewey, cheatham, and, gzip"); + tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header(" gzip"); + tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("gzip"); + tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("x-zstd, deflate, x-tor-lzma"); + tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA, OP_EQ, encodings); + + encodings = parse_accept_encoding_header( + "x-zstd, deflate, x-tor-lzma, gzip"); + tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("x-zstd,deflate,x-tor-lzma,gzip"); + tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA|B_GZIP, OP_EQ, encodings); + + done: + ; +} + +#define DIR_HANDLE_CMD(name,flags) \ + { #name, test_dir_handle_get_##name, (flags), NULL, NULL } + +struct testcase_t dir_handle_get_tests[] = { + DIR_HANDLE_CMD(not_found, 0), + DIR_HANDLE_CMD(bad_request, 0), + DIR_HANDLE_CMD(v1_command_not_found, 0), + DIR_HANDLE_CMD(v1_command, 0), + DIR_HANDLE_CMD(robots_txt, 0), + DIR_HANDLE_CMD(rendezvous2_not_found_if_not_encrypted, 0), + DIR_HANDLE_CMD(rendezvous2_not_found, 0), + DIR_HANDLE_CMD(rendezvous2_on_encrypted_conn_with_invalid_desc_id, 0), + DIR_HANDLE_CMD(rendezvous2_on_encrypted_conn_not_well_formed, 0), + DIR_HANDLE_CMD(rendezvous2_on_encrypted_conn_success, 0), + DIR_HANDLE_CMD(micro_d_not_found, 0), + DIR_HANDLE_CMD(micro_d_server_busy, 0), + DIR_HANDLE_CMD(micro_d, 0), + DIR_HANDLE_CMD(networkstatus_bridges_not_found_without_auth, 0), + DIR_HANDLE_CMD(networkstatus_bridges_not_found_wrong_auth, 0), + DIR_HANDLE_CMD(networkstatus_bridges, 0), + DIR_HANDLE_CMD(server_descriptors_not_found, 0), + DIR_HANDLE_CMD(server_descriptors_busy, TT_FORK), + DIR_HANDLE_CMD(server_descriptors_all, TT_FORK), + DIR_HANDLE_CMD(server_descriptors_authority, TT_FORK), + DIR_HANDLE_CMD(server_descriptors_fp, TT_FORK), + DIR_HANDLE_CMD(server_descriptors_d, TT_FORK), + DIR_HANDLE_CMD(server_keys_bad_req, 0), + DIR_HANDLE_CMD(server_keys_busy, 0), + DIR_HANDLE_CMD(server_keys_all_not_found, 0), + DIR_HANDLE_CMD(server_keys_all, 0), + DIR_HANDLE_CMD(server_keys_authority_not_found, 0), + DIR_HANDLE_CMD(server_keys_authority, 0), + DIR_HANDLE_CMD(server_keys_fp_not_found, 0), + DIR_HANDLE_CMD(server_keys_fp, 0), + DIR_HANDLE_CMD(server_keys_sk_not_found, 0), + DIR_HANDLE_CMD(server_keys_sk, 0), + DIR_HANDLE_CMD(server_keys_fpsk_not_found, 0), + DIR_HANDLE_CMD(server_keys_fpsk, 0), + DIR_HANDLE_CMD(status_vote_current_not_found, 0), + DIR_HANDLE_CMD(status_vote_next_not_found, 0), + DIR_HANDLE_CMD(status_vote_current_authority_not_found, 0), + DIR_HANDLE_CMD(status_vote_current_authority, 0), + DIR_HANDLE_CMD(status_vote_next_authority_not_found, 0), + DIR_HANDLE_CMD(status_vote_next_authority, 0), + DIR_HANDLE_CMD(status_vote_current_consensus_ns_not_enough_sigs, TT_FORK), + DIR_HANDLE_CMD(status_vote_current_consensus_ns_not_found, TT_FORK), + DIR_HANDLE_CMD(status_vote_current_consensus_too_old, TT_FORK), + DIR_HANDLE_CMD(status_vote_current_consensus_ns_busy, TT_FORK), + DIR_HANDLE_CMD(status_vote_current_consensus_ns, TT_FORK), + DIR_HANDLE_CMD(status_vote_current_d_not_found, 0), + DIR_HANDLE_CMD(status_vote_next_d_not_found, 0), + DIR_HANDLE_CMD(status_vote_d, 0), + DIR_HANDLE_CMD(status_vote_next_consensus_not_found, 0), + DIR_HANDLE_CMD(status_vote_next_consensus_busy, 0), + DIR_HANDLE_CMD(status_vote_next_consensus, 0), + DIR_HANDLE_CMD(status_vote_next_consensus_signatures_not_found, 0), + DIR_HANDLE_CMD(status_vote_next_consensus_signatures_busy, 0), + DIR_HANDLE_CMD(status_vote_next_consensus_signatures, 0), + DIR_HANDLE_CMD(parse_accept_encoding, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_dns.c b/src/wraith/src/test/test_dns.c new file mode 100644 index 000000000..1fee01d2c --- /dev/null +++ b/src/wraith/src/test/test_dns.c @@ -0,0 +1,748 @@ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "test.h" + +#define DNS_PRIVATE + +#include "dns.h" +#include "connection.h" +#include "router.h" + +#define NS_MODULE dns + +#define NS_SUBMODULE clip_ttl + +static void +NS(test_main)(void *arg) +{ + (void)arg; + + uint32_t ttl_mid = MIN_DNS_TTL_AT_EXIT / 2 + MAX_DNS_TTL_AT_EXIT / 2; + + tt_int_op(dns_clip_ttl(MIN_DNS_TTL_AT_EXIT - 1),OP_EQ,MIN_DNS_TTL_AT_EXIT); + tt_int_op(dns_clip_ttl(ttl_mid),OP_EQ,MAX_DNS_TTL_AT_EXIT); + tt_int_op(dns_clip_ttl(MAX_DNS_TTL_AT_EXIT + 1),OP_EQ,MAX_DNS_TTL_AT_EXIT); + + done: + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE resolve + +static int resolve_retval = 0; +static int resolve_made_conn_pending = 0; +static char *resolved_name = NULL; +static cached_resolve_t *cache_entry_mock = NULL; + +static int n_fake_impl = 0; + +NS_DECL(int, dns_resolve_impl, (edge_connection_t *exitconn, int is_resolve, + or_circuit_t *oncirc, char **hostname_out, + int *made_connection_pending_out, + cached_resolve_t **resolve_out)); + +/** This will be our configurable substitute for dns_resolve_impl in + * dns.c. It will return resolve_retval, + * and set resolve_made_conn_pending to + * made_connection_pending_out. It will set hostname_out + * to a duplicate of resolved_name and it will set resolve_out + * to cache_entry. Lastly, it will increment n_fake_implbase_.magic = OR_CIRCUIT_MAGIC; + + memset(fake_resolved,0,sizeof(cached_resolve_t)); + memset(exitconn,0,sizeof(edge_connection_t)); + memset(nextconn,0,sizeof(edge_connection_t)); + + NS_MOCK(dns_resolve_impl); + NS_MOCK(send_resolved_cell); + NS_MOCK(send_resolved_hostname_cell); + + /* + * CASE 1: dns_resolve_impl returns 1 and sets a hostname. purpose is + * EXIT_PURPOSE_RESOLVE. + * + * We want dns_resolve() to call send_resolved_hostname_cell() for a + * given exit connection (represented by edge_connection_t object) + * with a hostname it received from _impl. + */ + + prev_n_send_resolved_hostname_cell_replacement = + n_send_resolved_hostname_cell_replacement; + + exitconn->base_.purpose = EXIT_PURPOSE_RESOLVE; + exitconn->on_circuit = &(on_circuit->base_); + + resolve_retval = 1; + resolved_name = tor_strdup("www.torproject.org"); + + retval = dns_resolve(exitconn); + + tt_int_op(retval,OP_EQ,1); + tt_str_op(resolved_name,OP_EQ,last_resolved_hostname); + tt_assert(conn_for_resolved_cell == exitconn); + tt_int_op(n_send_resolved_hostname_cell_replacement,OP_EQ, + prev_n_send_resolved_hostname_cell_replacement + 1); + tt_assert(exitconn->on_circuit == NULL); + + tor_free(last_resolved_hostname); + // implies last_resolved_hostname = NULL; + + /* CASE 2: dns_resolve_impl returns 1, but does not set hostname. + * Instead, it yields cached_resolve_t object. + * + * We want dns_resolve to call send_resolved_cell on exitconn with + * RESOLVED_TYPE_AUTO and the cached_resolve_t object from _impl. + */ + + tor_free(resolved_name); + resolved_name = NULL; + + exitconn->on_circuit = &(on_circuit->base_); + + cache_entry_mock = fake_resolved; + + prev_n_send_resolved_cell_replacement = + n_send_resolved_cell_replacement; + + retval = dns_resolve(exitconn); + + tt_int_op(retval,OP_EQ,1); + tt_assert(conn_for_resolved_cell == exitconn); + tt_int_op(n_send_resolved_cell_replacement,OP_EQ, + prev_n_send_resolved_cell_replacement + 1); + tt_assert(last_resolved == fake_resolved); + tt_int_op(last_answer_type,OP_EQ,0xff); + tt_assert(exitconn->on_circuit == NULL); + + /* CASE 3: The purpose of exit connection is not EXIT_PURPOSE_RESOLVE + * and _impl returns 1. + * + * We want dns_resolve to prepend exitconn to n_streams linked list. + * We don't want it to send any cells about hostname being resolved. + */ + + exitconn->base_.purpose = EXIT_PURPOSE_CONNECT; + exitconn->on_circuit = &(on_circuit->base_); + + on_circuit->n_streams = nextconn; + + prev_n_send_resolved_cell_replacement = + n_send_resolved_cell_replacement; + + prev_n_send_resolved_hostname_cell_replacement = + n_send_resolved_hostname_cell_replacement; + + retval = dns_resolve(exitconn); + + tt_int_op(retval,OP_EQ,1); + tt_assert(on_circuit->n_streams == exitconn); + tt_assert(exitconn->next_stream == nextconn); + tt_int_op(prev_n_send_resolved_cell_replacement,OP_EQ, + n_send_resolved_cell_replacement); + tt_int_op(prev_n_send_resolved_hostname_cell_replacement,OP_EQ, + n_send_resolved_hostname_cell_replacement); + + /* CASE 4: _impl returns 0. + * + * We want dns_resolve() to set exitconn state to + * EXIT_CONN_STATE_RESOLVING and prepend exitconn to resolving_streams + * linked list. + */ + + exitconn->on_circuit = &(on_circuit->base_); + + resolve_retval = 0; + + exitconn->next_stream = NULL; + on_circuit->resolving_streams = nextconn; + + retval = dns_resolve(exitconn); + + tt_int_op(retval,OP_EQ,0); + tt_int_op(exitconn->base_.state,OP_EQ,EXIT_CONN_STATE_RESOLVING); + tt_assert(on_circuit->resolving_streams == exitconn); + tt_assert(exitconn->next_stream == nextconn); + + /* CASE 5: _impl returns -1 when purpose of exitconn is + * EXIT_PURPOSE_RESOLVE. We want dns_resolve to call send_resolved_cell + * on exitconn with type being RESOLVED_TYPE_ERROR. + */ + + NS_MOCK(dns_cancel_pending_resolve); + NS_MOCK(connection_free_); + + exitconn->on_circuit = &(on_circuit->base_); + exitconn->base_.purpose = EXIT_PURPOSE_RESOLVE; + + resolve_retval = -1; + + prev_n_send_resolved_cell_replacement = + n_send_resolved_cell_replacement; + + prev_n_connection_free = n_connection_free; + + retval = dns_resolve(exitconn); + + tt_int_op(retval,OP_EQ,-1); + tt_int_op(n_send_resolved_cell_replacement,OP_EQ, + prev_n_send_resolved_cell_replacement + 1); + tt_int_op(last_answer_type,OP_EQ,RESOLVED_TYPE_ERROR); + tt_int_op(n_dns_cancel_pending_resolve_replacement,OP_EQ,1); + tt_int_op(n_connection_free,OP_EQ,prev_n_connection_free + 1); + tt_assert(last_freed_conn == TO_CONN(exitconn)); + + done: + NS_UNMOCK(dns_resolve_impl); + NS_UNMOCK(send_resolved_cell); + NS_UNMOCK(send_resolved_hostname_cell); + NS_UNMOCK(dns_cancel_pending_resolve); + NS_UNMOCK(connection_free_); + tor_free(on_circuit); + tor_free(exitconn); + tor_free(nextconn); + tor_free(resolved_name); + tor_free(fake_resolved); + tor_free(last_resolved_hostname); + return; +} + +#undef NS_SUBMODULE + +/** Create an edge_connection_t instance that is considered a + * valid exit connection by asserts in dns_resolve_impl. + */ +static edge_connection_t * +create_valid_exitconn(void) +{ + edge_connection_t *exitconn = tor_malloc_zero(sizeof(edge_connection_t)); + TO_CONN(exitconn)->type = CONN_TYPE_EXIT; + TO_CONN(exitconn)->magic = EDGE_CONNECTION_MAGIC; + TO_CONN(exitconn)->purpose = EXIT_PURPOSE_RESOLVE; + TO_CONN(exitconn)->state = EXIT_CONN_STATE_RESOLVING; + exitconn->base_.s = TOR_INVALID_SOCKET; + + return exitconn; +} + +#define NS_SUBMODULE ASPECT(resolve_impl, addr_is_ip_no_need_to_resolve) + +/* + * Given that exitconn->base_.address is IP address string, we + * want dns_resolve_impl() to parse it and store in + * exitconn->base_.addr. We expect dns_resolve_impl to return 1. + * Lastly, we want it to set the TTL value to default one for DNS queries. + */ + +static void +NS(test_main)(void *arg) +{ + int retval; + int made_pending; + const tor_addr_t *resolved_addr; + tor_addr_t addr_to_compare; + + (void)arg; + + tor_addr_parse(&addr_to_compare, "8.8.8.8"); + + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + edge_connection_t *exitconn = create_valid_exitconn(); + + TO_CONN(exitconn)->address = tor_strdup("8.8.8.8"); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + resolved_addr = &(exitconn->base_.addr); + + tt_int_op(retval,OP_EQ,1); + tt_assert(tor_addr_eq(resolved_addr, (const tor_addr_t *)&addr_to_compare)); + tt_int_op(exitconn->address_ttl,OP_EQ,DEFAULT_DNS_TTL); + + done: + tor_free(on_circ); + tor_free(TO_CONN(exitconn)->address); + tor_free(exitconn); + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, non_exit) + +/** Given that Tor instance is not configured as an exit node, we want + * dns_resolve_impl() to fail with return value -1. + */ +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 1; +} + +static void +NS(test_main)(void *arg) +{ + int retval; + int made_pending; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + (void)arg; + + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); + + NS_MOCK(router_my_exit_policy_is_reject_star); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,OP_EQ,-1); + + done: + tor_free(TO_CONN(exitconn)->address); + tor_free(exitconn); + tor_free(on_circ); + NS_UNMOCK(router_my_exit_policy_is_reject_star); + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, addr_is_invalid_dest) + +/** Given that address is not a valid destination (as judged by + * address_is_invalid_destination() function), we want dns_resolve_impl() + * function to fail with return value -1. + */ + +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 0; +} + +static void +NS(test_main)(void *arg) +{ + int retval; + int made_pending; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + (void)arg; + + NS_MOCK(router_my_exit_policy_is_reject_star); + + TO_CONN(exitconn)->address = tor_strdup("invalid#@!.org"); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,OP_EQ,-1); + + done: + NS_UNMOCK(router_my_exit_policy_is_reject_star); + tor_free(TO_CONN(exitconn)->address); + tor_free(exitconn); + tor_free(on_circ); + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, malformed_ptr) + +/** Given that address is a malformed PTR name, we want dns_resolve_impl to + * fail. + */ + +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 0; +} + +static void +NS(test_main)(void *arg) +{ + int retval; + int made_pending; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + (void)arg; + + TO_CONN(exitconn)->address = tor_strdup("1.0.0.127.in-addr.arpa"); + + NS_MOCK(router_my_exit_policy_is_reject_star); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,OP_EQ,-1); + + tor_free(TO_CONN(exitconn)->address); + + TO_CONN(exitconn)->address = + tor_strdup("z01234567890123456789.in-addr.arpa"); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,OP_EQ,-1); + + done: + NS_UNMOCK(router_my_exit_policy_is_reject_star); + tor_free(TO_CONN(exitconn)->address); + tor_free(exitconn); + tor_free(on_circ); + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, cache_hit_pending) + +/* Given that there is already a pending resolve for the given address, + * we want dns_resolve_impl to append our exit connection to list + * of pending connections for the pending DNS request and return 0. + */ + +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 0; +} + +static void +NS(test_main)(void *arg) +{ + int retval; + int made_pending = 0; + + pending_connection_t *pending_conn = NULL; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + cached_resolve_t *cache_entry = tor_malloc_zero(sizeof(cached_resolve_t)); + cache_entry->magic = CACHED_RESOLVE_MAGIC; + cache_entry->state = CACHE_STATE_PENDING; + cache_entry->minheap_idx = -1; + cache_entry->expire = time(NULL) + 60 * 60; + + (void)arg; + + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); + + strlcpy(cache_entry->address, TO_CONN(exitconn)->address, + sizeof(cache_entry->address)); + + NS_MOCK(router_my_exit_policy_is_reject_star); + + dns_init(); + + dns_insert_cache_entry(cache_entry); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,OP_EQ,0); + tt_int_op(made_pending,OP_EQ,1); + + pending_conn = cache_entry->pending_connections; + + tt_assert(pending_conn != NULL); + tt_assert(pending_conn->conn == exitconn); + + done: + NS_UNMOCK(router_my_exit_policy_is_reject_star); + tor_free(on_circ); + tor_free(TO_CONN(exitconn)->address); + tor_free(cache_entry->pending_connections); + tor_free(cache_entry); + tor_free(exitconn); + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, cache_hit_cached) + +/* Given that a finished DNS resolve is available in our cache, we want + * dns_resolve_impl() return it to called via resolve_out and pass the + * handling to set_exitconn_info_from_resolve function. + */ +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 0; +} + +static edge_connection_t *last_exitconn = NULL; +static cached_resolve_t *last_resolve = NULL; + +static int +NS(set_exitconn_info_from_resolve)(edge_connection_t *exitconn, + const cached_resolve_t *resolve, + char **hostname_out) +{ + last_exitconn = exitconn; + last_resolve = (cached_resolve_t *)resolve; + + (void)hostname_out; + + return 0; +} + +static void +NS(test_main)(void *arg) +{ + int retval; + int made_pending = 0; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + cached_resolve_t *resolve_out = NULL; + + cached_resolve_t *cache_entry = tor_malloc_zero(sizeof(cached_resolve_t)); + cache_entry->magic = CACHED_RESOLVE_MAGIC; + cache_entry->state = CACHE_STATE_CACHED; + cache_entry->minheap_idx = -1; + cache_entry->expire = time(NULL) + 60 * 60; + + (void)arg; + + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); + + strlcpy(cache_entry->address, TO_CONN(exitconn)->address, + sizeof(cache_entry->address)); + + NS_MOCK(router_my_exit_policy_is_reject_star); + NS_MOCK(set_exitconn_info_from_resolve); + + dns_init(); + + dns_insert_cache_entry(cache_entry); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + &resolve_out); + + tt_int_op(retval,OP_EQ,0); + tt_int_op(made_pending,OP_EQ,0); + tt_assert(resolve_out == cache_entry); + + tt_assert(last_exitconn == exitconn); + tt_assert(last_resolve == cache_entry); + + done: + NS_UNMOCK(router_my_exit_policy_is_reject_star); + NS_UNMOCK(set_exitconn_info_from_resolve); + tor_free(on_circ); + tor_free(TO_CONN(exitconn)->address); + tor_free(cache_entry->pending_connections); + tor_free(cache_entry); + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, cache_miss) + +/* Given that there are neither pending nor pre-cached resolve for a given + * address, we want dns_resolve_impl() to create a new cached_resolve_t + * object, mark it as pending, insert it into the cache, attach the exit + * connection to list of pending connections and call launch_resolve() + * with the cached_resolve_t object it created. + */ +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 0; +} + +static cached_resolve_t *last_launched_resolve = NULL; + +static int +NS(launch_resolve)(cached_resolve_t *resolve) +{ + last_launched_resolve = resolve; + + return 0; +} + +static void +NS(test_main)(void *arg) +{ + int retval; + int made_pending = 0; + + pending_connection_t *pending_conn = NULL; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + cached_resolve_t *cache_entry = NULL; + cached_resolve_t query; + + (void)arg; + + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); + + strlcpy(query.address, TO_CONN(exitconn)->address, sizeof(query.address)); + + NS_MOCK(router_my_exit_policy_is_reject_star); + NS_MOCK(launch_resolve); + + dns_init(); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,OP_EQ,0); + tt_int_op(made_pending,OP_EQ,1); + + cache_entry = dns_get_cache_entry(&query); + + tt_assert(cache_entry); + + pending_conn = cache_entry->pending_connections; + + tt_assert(pending_conn != NULL); + tt_assert(pending_conn->conn == exitconn); + + tt_assert(last_launched_resolve == cache_entry); + tt_str_op(cache_entry->address,OP_EQ,TO_CONN(exitconn)->address); + + done: + NS_UNMOCK(router_my_exit_policy_is_reject_star); + NS_UNMOCK(launch_resolve); + tor_free(on_circ); + tor_free(TO_CONN(exitconn)->address); + if (cache_entry) + tor_free(cache_entry->pending_connections); + tor_free(cache_entry); + tor_free(exitconn); + return; +} + +#undef NS_SUBMODULE + +struct testcase_t dns_tests[] = { + TEST_CASE(clip_ttl), + TEST_CASE(resolve), + TEST_CASE_ASPECT(resolve_impl, addr_is_ip_no_need_to_resolve), + TEST_CASE_ASPECT(resolve_impl, non_exit), + TEST_CASE_ASPECT(resolve_impl, addr_is_invalid_dest), + TEST_CASE_ASPECT(resolve_impl, malformed_ptr), + TEST_CASE_ASPECT(resolve_impl, cache_hit_pending), + TEST_CASE_ASPECT(resolve_impl, cache_hit_cached), + TEST_CASE_ASPECT(resolve_impl, cache_miss), + END_OF_TESTCASES +}; + +#undef NS_MODULE + diff --git a/src/wraith/src/test/test_entryconn.c b/src/wraith/src/test/test_entryconn.c new file mode 100644 index 000000000..9d8a072c7 --- /dev/null +++ b/src/wraith/src/test/test_entryconn.c @@ -0,0 +1,833 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define CONNECTION_PRIVATE +#define CONNECTION_EDGE_PRIVATE + +#include "or.h" +#include "test.h" + +#include "addressmap.h" +#include "config.h" +#include "confparse.h" +#include "connection.h" +#include "connection_edge.h" +#include "nodelist.h" + +#include "hs_cache.h" +#include "rendcache.h" + +static void * +entryconn_rewrite_setup(const struct testcase_t *tc) +{ + (void)tc; + entry_connection_t *ec = entry_connection_new(CONN_TYPE_AP, AF_INET); + addressmap_init(); + return ec; +} + +static int +entryconn_rewrite_teardown(const struct testcase_t *tc, void *arg) +{ + (void)tc; + entry_connection_t *ec = arg; + if (ec) + connection_free_minimal(ENTRY_TO_CONN(ec)); + addressmap_free_all(); + return 1; +} + +static struct testcase_setup_t test_rewrite_setup = { + entryconn_rewrite_setup, entryconn_rewrite_teardown +}; + +/* Simple rewrite: no changes needed */ +static void +test_entryconn_rewrite_basic(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + + tt_assert(ec->socks_request); + strlcpy(ec->socks_request->address, "www.TORproject.org", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_int_op(rr.automap, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.torproject.org"); + tt_str_op(ec->socks_request->address, OP_EQ, "www.torproject.org"); + tt_str_op(ec->original_dest_address, OP_EQ, "www.torproject.org"); + + done: + ; +} + +/* Rewrite but reject because of disallowed .exit */ +static void +test_entryconn_rewrite_bad_dotexit(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + + tt_assert(ec->socks_request); + strlcpy(ec->socks_request->address, "www.TORproject.org.foo.exit", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.should_close, OP_EQ, 1); + tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_TORPROTOCOL); + + done: + ; +} + +/* Automap on resolve, connect to automapped address, resolve again and get + * same answer. (IPv4) */ +static void +test_entryconn_rewrite_automap_ipv4(void *arg) +{ + entry_connection_t *ec = arg; + entry_connection_t *ec2=NULL, *ec3=NULL; + rewrite_result_t rr; + char *msg = NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + get_options_mutable()->AutomapHostsOnResolve = 1; + smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, "."); + parse_virtual_addr_network("127.202.0.0/16", AF_INET, 0, &msg); + + /* Automap this on resolve. */ + strlcpy(ec->socks_request->address, "WWW.MIT.EDU", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); + tt_str_op(ec->original_dest_address, OP_EQ, "www.mit.edu"); + + tt_assert(!strcmpstart(ec->socks_request->address,"127.202.")); + + /* Connect to it and make sure we get the original address back. */ + strlcpy(ec2->socks_request->address, ec->socks_request->address, + sizeof(ec2->socks_request->address)); + + ec2->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, ec->socks_request->address); + tt_str_op(ec2->original_dest_address, OP_EQ, ec->socks_request->address); + tt_str_op(ec2->socks_request->address, OP_EQ, "www.mit.edu"); + + /* Resolve it again, make sure the answer is the same. */ + strlcpy(ec3->socks_request->address, "www.MIT.EDU", + sizeof(ec3->socks_request->address)); + ec3->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec3, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); + tt_str_op(ec3->original_dest_address, OP_EQ, "www.mit.edu"); + + tt_str_op(ec3->socks_request->address, OP_EQ, + ec->socks_request->address); + + done: + connection_free_minimal(ENTRY_TO_CONN(ec2)); + connection_free_minimal(ENTRY_TO_CONN(ec3)); +} + +/* Automap on resolve, connect to automapped address, resolve again and get + * same answer. (IPv6) */ +static void +test_entryconn_rewrite_automap_ipv6(void *arg) +{ + (void)arg; + entry_connection_t *ec =NULL; + entry_connection_t *ec2=NULL, *ec3=NULL; + rewrite_result_t rr; + char *msg = NULL; + + ec = entry_connection_new(CONN_TYPE_AP, AF_INET6); + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6); + ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET6); + + get_options_mutable()->AutomapHostsOnResolve = 1; + smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, "."); + parse_virtual_addr_network("FE80::/32", AF_INET6, 0, &msg); + + /* Automap this on resolve. */ + strlcpy(ec->socks_request->address, "WWW.MIT.EDU", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); + tt_str_op(ec->original_dest_address, OP_EQ, "www.mit.edu"); + + /* Yes, this [ should be here. */ + tt_assert(!strcmpstart(ec->socks_request->address,"[fe80:")); + + /* Connect to it and make sure we get the original address back. */ + strlcpy(ec2->socks_request->address, ec->socks_request->address, + sizeof(ec2->socks_request->address)); + + ec2->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, ec->socks_request->address); + tt_str_op(ec2->original_dest_address, OP_EQ, ec->socks_request->address); + tt_str_op(ec2->socks_request->address, OP_EQ, "www.mit.edu"); + + /* Resolve it again, make sure the answer is the same. */ + strlcpy(ec3->socks_request->address, "www.MIT.EDU", + sizeof(ec3->socks_request->address)); + ec3->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec3, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); + tt_str_op(ec3->original_dest_address, OP_EQ, "www.mit.edu"); + + tt_str_op(ec3->socks_request->address, OP_EQ, + ec->socks_request->address); + + done: + connection_free_minimal(ENTRY_TO_CONN(ec)); + connection_free_minimal(ENTRY_TO_CONN(ec2)); + connection_free_minimal(ENTRY_TO_CONN(ec3)); +} + +#if 0 +/* FFFF not actually supported. */ +/* automap on resolve, reverse lookup. */ +static void +test_entryconn_rewrite_automap_reverse(void *arg) +{ + entry_connection_t *ec = arg; + entry_connection_t *ec2=NULL; + rewrite_result_t rr; + char *msg = NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + get_options_mutable()->AutomapHostsOnResolve = 1; + get_options_mutable()->SafeLogging_ = SAFELOG_SCRUB_NONE; + smartlist_add(get_options_mutable()->AutomapHostsSuffixes, + tor_strdup(".bloom")); + parse_virtual_addr_network("127.80.0.0/16", AF_INET, 0, &msg); + + /* Automap this on resolve. */ + strlcpy(ec->socks_request->address, "www.poldy.BLOOM", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.poldy.bloom"); + tt_str_op(ec->original_dest_address, OP_EQ, "www.poldy.bloom"); + + tt_assert(!strcmpstart(ec->socks_request->address,"127.80.")); + + strlcpy(ec2->socks_request->address, ec->socks_request->address, + sizeof(ec2->socks_request->address)); + ec2->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 1); + tt_int_op(rr.end_reason, OP_EQ, + END_STREAM_REASON_DONE|END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + + done: + connection_free_minimal(ENTRY_TO_CONN(ec2)); +} +#endif /* 0 */ + +/* Rewrite because of cached DNS entry. */ +static void +test_entryconn_rewrite_cached_dns_ipv4(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + time_t expires = time(NULL) + 3600; + entry_connection_t *ec2=NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + addressmap_register("www.friendly.example.com", + tor_strdup("240.240.241.241"), + expires, + ADDRMAPSRC_DNS, + 0, 0); + + strlcpy(ec->socks_request->address, "www.friendly.example.com", + sizeof(ec->socks_request->address)); + strlcpy(ec2->socks_request->address, "www.friendly.example.com", + sizeof(ec2->socks_request->address)); + + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + ec2->socks_request->command = SOCKS_COMMAND_CONNECT; + + ec2->entry_cfg.use_cached_ipv4_answers = 1; /* only ec2 gets this flag */ + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); + tt_str_op(ec->socks_request->address, OP_EQ, "www.friendly.example.com"); + + connection_ap_handshake_rewrite(ec2, &rr); + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, expires); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); + tt_str_op(ec2->socks_request->address, OP_EQ, "240.240.241.241"); + + done: + connection_free_minimal(ENTRY_TO_CONN(ec2)); +} + +/* Rewrite because of cached DNS entry. */ +static void +test_entryconn_rewrite_cached_dns_ipv6(void *arg) +{ + entry_connection_t *ec = NULL; + rewrite_result_t rr; + time_t expires = time(NULL) + 3600; + entry_connection_t *ec2=NULL; + + (void)arg; + + ec = entry_connection_new(CONN_TYPE_AP, AF_INET6); + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6); + + addressmap_register("www.friendly.example.com", + tor_strdup("[::f00f]"), + expires, + ADDRMAPSRC_DNS, + 0, 0); + + strlcpy(ec->socks_request->address, "www.friendly.example.com", + sizeof(ec->socks_request->address)); + strlcpy(ec2->socks_request->address, "www.friendly.example.com", + sizeof(ec2->socks_request->address)); + + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + ec2->socks_request->command = SOCKS_COMMAND_CONNECT; + + ec2->entry_cfg.use_cached_ipv6_answers = 1; /* only ec2 gets this flag */ + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); + tt_str_op(ec->socks_request->address, OP_EQ, "www.friendly.example.com"); + + connection_ap_handshake_rewrite(ec2, &rr); + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, expires); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); + tt_str_op(ec2->socks_request->address, OP_EQ, "[::f00f]"); + + done: + connection_free_minimal(ENTRY_TO_CONN(ec)); + connection_free_minimal(ENTRY_TO_CONN(ec2)); +} + +/* Fail to connect to unmapped address in virtual range. */ +static void +test_entryconn_rewrite_unmapped_virtual(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + entry_connection_t *ec2 = NULL; + char *msg = NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6); + + parse_virtual_addr_network("18.202.0.0/16", AF_INET, 0, &msg); + parse_virtual_addr_network("[ABCD::]/16", AF_INET6, 0, &msg); + + strlcpy(ec->socks_request->address, "18.202.5.5", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.should_close, OP_EQ, 1); + tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_INTERNAL); + tt_int_op(rr.automap, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + + strlcpy(ec2->socks_request->address, "[ABCD:9::5314:9543]", + sizeof(ec2->socks_request->address)); + ec2->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.should_close, OP_EQ, 1); + tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_INTERNAL); + tt_int_op(rr.automap, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + + done: + connection_free_minimal(ENTRY_TO_CONN(ec2)); +} + +/* Rewrite because of mapaddress option */ +static void +test_entryconn_rewrite_mapaddress(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + + config_line_append(&get_options_mutable()->AddressMap, + "MapAddress", "meta metaobjects.example"); + config_register_addressmaps(get_options()); + + strlcpy(ec->socks_request->address, "meta", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_int_op(rr.automap, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(ec->socks_request->address, OP_EQ, "metaobjects.example"); + + done: + ; +} + +/* Reject reverse lookups of internal address. */ +static void +test_entryconn_rewrite_reject_internal_reverse(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + + strlcpy(ec->socks_request->address, "10.0.0.1", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.should_close, OP_EQ, 1); + tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_SOCKSPROTOCOL | + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + tt_int_op(rr.automap, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + + done: + ; +} + +/* Rewrite into .exit because of virtual address mapping. */ +static void +test_entryconn_rewrite_automap_exit(void *arg) +{ + entry_connection_t *ec = arg; + entry_connection_t *ec2=NULL; + rewrite_result_t rr; + char *msg = NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, + ".EXIT"); + parse_virtual_addr_network("127.1.0.0/16", AF_INET, 0, &msg); + + /* Try to automap this on resolve. */ + strlcpy(ec->socks_request->address, "website.example.exit", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec, &rr); + + /* Make sure it isn't allowed -- there is no longer an AllowDotExit + * option. */ + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 1); + tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_TORPROTOCOL); + + done: + connection_free_minimal(ENTRY_TO_CONN(ec2)); +} + +/* Rewrite into .exit because of mapaddress */ +static void +test_entryconn_rewrite_mapaddress_exit(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + + config_line_append(&get_options_mutable()->AddressMap, + "MapAddress", "*.example.com *.example.com.abc.exit"); + config_register_addressmaps(get_options()); + + /* Automap this on resolve. */ + strlcpy(ec->socks_request->address, "abc.example.com", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_TORRC); + tt_str_op(rr.orig_address, OP_EQ, "abc.example.com"); + tt_str_op(ec->socks_request->address, OP_EQ, "abc.example.com.abc.exit"); + done: + ; +} + +/* Map foo.onion to longthing.onion, and also automap. */ +static void +test_entryconn_rewrite_mapaddress_automap_onion(void *arg) +{ + entry_connection_t *ec = arg; + entry_connection_t *ec2 = NULL; + entry_connection_t *ec3 = NULL; + entry_connection_t *ec4 = NULL; + rewrite_result_t rr; + char *msg = NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET); + ec4 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + get_options_mutable()->AutomapHostsOnResolve = 1; + smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, + ".onion"); + parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg); + config_line_append(&get_options_mutable()->AddressMap, + "MapAddress", "foo.onion abcdefghijklmnop.onion"); + config_register_addressmaps(get_options()); + + /* Connect to foo.onion. */ + strlcpy(ec->socks_request->address, "foo.onion", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "foo.onion"); + tt_str_op(ec->socks_request->address, OP_EQ, "abcdefghijklmnop.onion"); + + /* Okay, resolve foo.onion */ + strlcpy(ec2->socks_request->address, "foo.onion", + sizeof(ec2->socks_request->address)); + ec2->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "foo.onion"); + tt_assert(!strcmpstart(ec2->socks_request->address, "192.168.")); + + /* Now connect */ + strlcpy(ec3->socks_request->address, ec2->socks_request->address, + sizeof(ec3->socks_request->address)); + ec3->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec3, &rr); + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_assert(!strcmpstart(ec3->socks_request->address, + "abcdefghijklmnop.onion")); + + /* Now resolve abcefghijklmnop.onion. */ + strlcpy(ec4->socks_request->address, "abcdefghijklmnop.onion", + sizeof(ec4->socks_request->address)); + ec4->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec4, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "abcdefghijklmnop.onion"); + tt_assert(!strcmpstart(ec4->socks_request->address, "192.168.")); + /* XXXX doesn't work + tt_str_op(ec4->socks_request->address, OP_EQ, ec2->socks_request->address); + */ + + done: + connection_free_minimal(ENTRY_TO_CONN(ec2)); + connection_free_minimal(ENTRY_TO_CONN(ec3)); + connection_free_minimal(ENTRY_TO_CONN(ec4)); +} + +static void +test_entryconn_rewrite_mapaddress_automap_onion_common(entry_connection_t *ec, + int map_to_onion, + int map_to_address) +{ + entry_connection_t *ec2 = NULL; + entry_connection_t *ec3 = NULL; + rewrite_result_t rr; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + /* Connect to irc.example.com */ + strlcpy(ec->socks_request->address, "irc.example.com", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "irc.example.com"); + tt_str_op(ec->socks_request->address, OP_EQ, + map_to_onion ? "abcdefghijklmnop.onion" : "irc.example.com"); + + /* Okay, resolve irc.example.com */ + strlcpy(ec2->socks_request->address, "irc.example.com", + sizeof(ec2->socks_request->address)); + ec2->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.automap, OP_EQ, map_to_onion && map_to_address); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "irc.example.com"); + if (map_to_onion && map_to_address) + tt_assert(!strcmpstart(ec2->socks_request->address, "192.168.")); + + /* Now connect */ + strlcpy(ec3->socks_request->address, ec2->socks_request->address, + sizeof(ec3->socks_request->address)); + ec3->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec3, &rr); + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + if (map_to_onion) + tt_assert(!strcmpstart(ec3->socks_request->address, + "abcdefghijklmnop.onion")); + + done: + connection_free_minimal(ENTRY_TO_CONN(ec2)); + connection_free_minimal(ENTRY_TO_CONN(ec3)); +} + +/* This time is the same, but we start with a mapping from a non-onion + * address. */ +static void +test_entryconn_rewrite_mapaddress_automap_onion2(void *arg) +{ + char *msg = NULL; + get_options_mutable()->AutomapHostsOnResolve = 1; + smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, + ".onion"); + parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg); + config_line_append(&get_options_mutable()->AddressMap, + "MapAddress", "irc.example.com abcdefghijklmnop.onion"); + config_register_addressmaps(get_options()); + + test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 1, 1); +} + +/* Same as above, with automapped turned off */ +static void +test_entryconn_rewrite_mapaddress_automap_onion3(void *arg) +{ + config_line_append(&get_options_mutable()->AddressMap, + "MapAddress", "irc.example.com abcdefghijklmnop.onion"); + config_register_addressmaps(get_options()); + + test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 1, 0); +} + +/* As above, with no mapping. */ +static void +test_entryconn_rewrite_mapaddress_automap_onion4(void *arg) +{ + char *msg = NULL; + get_options_mutable()->AutomapHostsOnResolve = 1; + smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, + ".onion"); + parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg); + + test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 0, 1); +} + +/** Test that rewrite functions can handle v2 addresses */ +static void +test_entryconn_rewrite_onion_v2(void *arg) +{ + int retval; + entry_connection_t *conn = arg; + + (void) arg; + + rend_cache_init(); + + /* Make a SOCKS request */ + conn->socks_request->command = SOCKS_COMMAND_CONNECT; + strlcpy(conn->socks_request->address, + "pqeed46efnwmfuid.onion", + sizeof(conn->socks_request->address)); + + /* Make an onion connection using the SOCKS request */ + conn->entry_cfg.onion_traffic = 1; + ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_SOCKS_WAIT; + tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data); + + /* Handle SOCKS and rewrite! */ + retval = connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL); + tt_int_op(retval, OP_EQ, 0); + + /* Check connection state after rewrite */ + tt_int_op(ENTRY_TO_CONN(conn)->state, OP_EQ, AP_CONN_STATE_RENDDESC_WAIT); + /* check that the address got rewritten */ + tt_str_op(conn->socks_request->address, OP_EQ, + "pqeed46efnwmfuid"); + /* check that HS information got attached to the connection */ + tt_assert(ENTRY_TO_EDGE_CONN(conn)->rend_data); + tt_assert(!ENTRY_TO_EDGE_CONN(conn)->hs_ident); + + done: + rend_cache_free_all(); + /* 'conn' is cleaned by handler */ +} + +/** Test that rewrite functions can handle v3 onion addresses */ +static void +test_entryconn_rewrite_onion_v3(void *arg) +{ + int retval; + entry_connection_t *conn = arg; + + (void) arg; + + hs_cache_init(); + + /* Make a SOCKS request */ + conn->socks_request->command = SOCKS_COMMAND_CONNECT; + strlcpy(conn->socks_request->address, + "git.25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid.onion", + sizeof(conn->socks_request->address)); + + /* Make an onion connection using the SOCKS request */ + conn->entry_cfg.onion_traffic = 1; + ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_SOCKS_WAIT; + tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data); + tt_assert(!ENTRY_TO_EDGE_CONN(conn)->hs_ident); + + /* Handle SOCKS and rewrite! */ + retval = connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL); + tt_int_op(retval, OP_EQ, 0); + + /* Check connection state after rewrite. It should be in waiting for + * descriptor state. */ + tt_int_op(ENTRY_TO_CONN(conn)->state, OP_EQ, AP_CONN_STATE_RENDDESC_WAIT); + /* check that the address got rewritten */ + tt_str_op(conn->socks_request->address, OP_EQ, + "25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid"); + /* check that HS information got attached to the connection */ + tt_assert(ENTRY_TO_EDGE_CONN(conn)->hs_ident); + tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data); + + done: + hs_free_all(); + /* 'conn' is cleaned by handler */ +} + +#define REWRITE(name) \ + { #name, test_entryconn_##name, TT_FORK, &test_rewrite_setup, NULL } + +struct testcase_t entryconn_tests[] = { + REWRITE(rewrite_basic), + REWRITE(rewrite_bad_dotexit), + REWRITE(rewrite_automap_ipv4), + REWRITE(rewrite_automap_ipv6), + // REWRITE(rewrite_automap_reverse), + REWRITE(rewrite_cached_dns_ipv4), + REWRITE(rewrite_cached_dns_ipv6), + REWRITE(rewrite_unmapped_virtual), + REWRITE(rewrite_mapaddress), + REWRITE(rewrite_reject_internal_reverse), + REWRITE(rewrite_automap_exit), + REWRITE(rewrite_mapaddress_exit), + REWRITE(rewrite_mapaddress_automap_onion), + REWRITE(rewrite_mapaddress_automap_onion2), + REWRITE(rewrite_mapaddress_automap_onion3), + REWRITE(rewrite_mapaddress_automap_onion4), + REWRITE(rewrite_onion_v2), + REWRITE(rewrite_onion_v3), + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_entrynodes.c b/src/wraith/src/test/test_entrynodes.c new file mode 100644 index 000000000..1cff3828c --- /dev/null +++ b/src/wraith/src/test/test_entrynodes.c @@ -0,0 +1,2868 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define CIRCUITLIST_PRIVATE +#define STATEFILE_PRIVATE +#define ENTRYNODES_PRIVATE +#define ROUTERLIST_PRIVATE +#define DIRECTORY_PRIVATE + +#include "or.h" +#include "test.h" + +#include "bridges.h" +#include "circuitlist.h" +#include "config.h" +#include "confparse.h" +#include "directory.h" +#include "entrynodes.h" +#include "nodelist.h" +#include "networkstatus.h" +#include "policies.h" +#include "routerlist.h" +#include "routerparse.h" +#include "routerset.h" +#include "statefile.h" +#include "util.h" + +#include "test_helpers.h" +#include "log_test_helpers.h" + +/* TODO: + * choose_random_entry() test with state set. + * + * parse_state() tests with more than one guards. + * + * More tests for set_from_config(): Multiple nodes, use fingerprints, + * use country codes. + */ + +/** Dummy Tor state used in unittests. */ +static or_state_t *dummy_state = NULL; +static or_state_t * +get_or_state_replacement(void) +{ + return dummy_state; +} + +static networkstatus_t *dummy_consensus = NULL; + +static smartlist_t *big_fake_net_nodes = NULL; + +static smartlist_t * +bfn_mock_nodelist_get_list(void) +{ + return big_fake_net_nodes; +} + +static networkstatus_t * +bfn_mock_networkstatus_get_live_consensus(time_t now) +{ + (void)now; + return dummy_consensus; +} + +static const node_t * +bfn_mock_node_get_by_id(const char *id) +{ + SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, n, + if (fast_memeq(n->identity, id, 20)) + return n); + + return NULL; +} + +/* Unittest cleanup function: Cleanup the fake network. */ +static int +big_fake_network_cleanup(const struct testcase_t *testcase, void *ptr) +{ + (void) testcase; + (void) ptr; + + if (big_fake_net_nodes) { + SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, n, { + tor_free(n->rs); + tor_free(n->md); + tor_free(n); + }); + smartlist_free(big_fake_net_nodes); + } + + UNMOCK(nodelist_get_list); + UNMOCK(node_get_by_id); + UNMOCK(get_or_state); + UNMOCK(networkstatus_get_live_consensus); + or_state_free(dummy_state); + dummy_state = NULL; + tor_free(dummy_consensus); + + return 1; /* NOP */ +} + +/* Unittest setup function: Setup a fake network. */ +static void * +big_fake_network_setup(const struct testcase_t *testcase) +{ + int i; + + /* These are minimal node_t objects that only contain the aspects of node_t + * that we need for entrynodes.c. */ + const int N_NODES = 271; + + big_fake_net_nodes = smartlist_new(); + for (i = 0; i < N_NODES; ++i) { + node_t *n = tor_malloc_zero(sizeof(node_t)); + n->md = tor_malloc_zero(sizeof(microdesc_t)); + + crypto_rand(n->identity, sizeof(n->identity)); + n->rs = tor_malloc_zero(sizeof(routerstatus_t)); + + memcpy(n->rs->identity_digest, n->identity, DIGEST_LEN); + + n->is_running = n->is_valid = n->is_fast = n->is_stable = 1; + + /* Note: all these guards have the same address, so you'll need to + * disable EnforceDistinctSubnets when a restriction is applied. */ + n->rs->addr = 0x04020202; + n->rs->or_port = 1234; + n->rs->is_v2_dir = 1; + n->rs->has_bandwidth = 1; + n->rs->bandwidth_kb = 30; + + /* Make a random nickname for each node */ + { + char nickname_binary[8]; + crypto_rand(nickname_binary, sizeof(nickname_binary)); + base64_encode(n->rs->nickname, sizeof(n->rs->nickname), + nickname_binary, sizeof(nickname_binary), 0); + } + + /* Call half of the nodes a possible guard. */ + if (i % 2 == 0) { + n->is_possible_guard = 1; + n->rs->guardfraction_percentage = 100; + n->rs->has_guardfraction = 1; + } + + smartlist_add(big_fake_net_nodes, n); + } + + dummy_state = tor_malloc_zero(sizeof(or_state_t)); + dummy_consensus = tor_malloc_zero(sizeof(networkstatus_t)); + dummy_consensus->valid_after = approx_time() - 3600; + dummy_consensus->valid_until = approx_time() + 3600; + + MOCK(nodelist_get_list, bfn_mock_nodelist_get_list); + MOCK(node_get_by_id, bfn_mock_node_get_by_id); + MOCK(get_or_state, + get_or_state_replacement); + MOCK(networkstatus_get_live_consensus, + bfn_mock_networkstatus_get_live_consensus); + /* Return anything but NULL (it's interpreted as test fail) */ + return (void*)testcase; +} + +static time_t +mock_randomize_time_no_randomization(time_t a, time_t b) +{ + (void) b; + return a; +} + +static or_options_t mocked_options; + +static const or_options_t * +mock_get_options(void) +{ + return &mocked_options; +} + +#define TEST_IPV4_ADDR "123.45.67.89" +#define TEST_IPV6_ADDR "[1234:5678:90ab:cdef::]" + +static void +test_node_preferred_orport(void *arg) +{ + (void)arg; + tor_addr_t ipv4_addr; + const uint16_t ipv4_port = 4444; + tor_addr_t ipv6_addr; + const uint16_t ipv6_port = 6666; + routerinfo_t node_ri; + node_t node; + tor_addr_port_t ap; + + /* Setup options */ + memset(&mocked_options, 0, sizeof(mocked_options)); + /* We don't test ClientPreferIPv6ORPort here, because it's used in + * nodelist_set_consensus to setup node.ipv6_preferred, which we set + * directly. */ + MOCK(get_options, mock_get_options); + + /* Setup IP addresses */ + tor_addr_parse(&ipv4_addr, TEST_IPV4_ADDR); + tor_addr_parse(&ipv6_addr, TEST_IPV6_ADDR); + + /* Setup node_ri */ + memset(&node_ri, 0, sizeof(node_ri)); + node_ri.addr = tor_addr_to_ipv4h(&ipv4_addr); + node_ri.or_port = ipv4_port; + tor_addr_copy(&node_ri.ipv6_addr, &ipv6_addr); + node_ri.ipv6_orport = ipv6_port; + + /* Setup node */ + memset(&node, 0, sizeof(node)); + node.ri = &node_ri; + + /* Check the preferred address is IPv4 if we're only using IPv4, regardless + * of whether we prefer it or not */ + mocked_options.ClientUseIPv4 = 1; + mocked_options.ClientUseIPv6 = 0; + node.ipv6_preferred = 0; + node_get_pref_orport(&node, &ap); + tt_assert(tor_addr_eq(&ap.addr, &ipv4_addr)); + tt_assert(ap.port == ipv4_port); + + node.ipv6_preferred = 1; + node_get_pref_orport(&node, &ap); + tt_assert(tor_addr_eq(&ap.addr, &ipv4_addr)); + tt_assert(ap.port == ipv4_port); + + /* Check the preferred address is IPv4 if we're using IPv4 and IPv6, but + * don't prefer the IPv6 address */ + mocked_options.ClientUseIPv4 = 1; + mocked_options.ClientUseIPv6 = 1; + node.ipv6_preferred = 0; + node_get_pref_orport(&node, &ap); + tt_assert(tor_addr_eq(&ap.addr, &ipv4_addr)); + tt_assert(ap.port == ipv4_port); + + /* Check the preferred address is IPv6 if we prefer it and + * ClientUseIPv6 is 1, regardless of ClientUseIPv4 */ + mocked_options.ClientUseIPv4 = 1; + mocked_options.ClientUseIPv6 = 1; + node.ipv6_preferred = 1; + node_get_pref_orport(&node, &ap); + tt_assert(tor_addr_eq(&ap.addr, &ipv6_addr)); + tt_assert(ap.port == ipv6_port); + + mocked_options.ClientUseIPv4 = 0; + node_get_pref_orport(&node, &ap); + tt_assert(tor_addr_eq(&ap.addr, &ipv6_addr)); + tt_assert(ap.port == ipv6_port); + + /* Check the preferred address is IPv6 if we don't prefer it, but + * ClientUseIPv4 is 0 */ + mocked_options.ClientUseIPv4 = 0; + mocked_options.ClientUseIPv6 = 1; + node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(&mocked_options); + node_get_pref_orport(&node, &ap); + tt_assert(tor_addr_eq(&ap.addr, &ipv6_addr)); + tt_assert(ap.port == ipv6_port); + + done: + UNMOCK(get_options); +} + +static void +test_entry_guard_describe(void *arg) +{ + (void)arg; + entry_guard_t g; + memset(&g, 0, sizeof(g)); + strlcpy(g.nickname, "okefenokee", sizeof(g.nickname)); + memcpy(g.identity, "theforestprimeval---", DIGEST_LEN); + + tt_str_op(entry_guard_describe(&g), OP_EQ, + "okefenokee ($746865666F726573747072696D6576616C2D2D2D)"); + + done: + ; +} + +static void +test_entry_guard_randomize_time(void *arg) +{ + const time_t now = 1479153573; + const int delay = 86400; + const int N = 1000; + (void)arg; + + time_t t; + int i; + for (i = 0; i < N; ++i) { + t = randomize_time(now, delay); + tt_int_op(t, OP_LE, now); + tt_int_op(t, OP_GE, now-delay); + } + + /* now try the corner cases */ + for (i = 0; i < N; ++i) { + t = randomize_time(100, delay); + tt_int_op(t, OP_GE, 1); + tt_int_op(t, OP_LE, 100); + + t = randomize_time(0, delay); + tt_int_op(t, OP_EQ, 1); + } + + done: + ; +} + +static void +test_entry_guard_encode_for_state_minimal(void *arg) +{ + (void) arg; + entry_guard_t *eg = tor_malloc_zero(sizeof(entry_guard_t)); + + eg->selection_name = tor_strdup("wubwub"); + memcpy(eg->identity, "plurpyflurpyslurpydo", DIGEST_LEN); + eg->sampled_on_date = 1479081600; + eg->confirmed_idx = -1; + + char *s = NULL; + s = entry_guard_encode_for_state(eg); + + tt_str_op(s, OP_EQ, + "in=wubwub " + "rsa_id=706C75727079666C75727079736C75727079646F " + "sampled_on=2016-11-14T00:00:00 " + "listed=0"); + + done: + entry_guard_free(eg); + tor_free(s); +} + +static void +test_entry_guard_encode_for_state_maximal(void *arg) +{ + (void) arg; + entry_guard_t *eg = tor_malloc_zero(sizeof(entry_guard_t)); + + strlcpy(eg->nickname, "Fred", sizeof(eg->nickname)); + eg->selection_name = tor_strdup("default"); + memcpy(eg->identity, "plurpyflurpyslurpydo", DIGEST_LEN); + eg->bridge_addr = tor_malloc_zero(sizeof(tor_addr_port_t)); + tor_addr_from_ipv4h(&eg->bridge_addr->addr, 0x08080404); + eg->bridge_addr->port = 9999; + eg->sampled_on_date = 1479081600; + eg->sampled_by_version = tor_strdup("1.2.3"); + eg->unlisted_since_date = 1479081645; + eg->currently_listed = 1; + eg->confirmed_on_date = 1479081690; + eg->confirmed_idx = 333; + eg->extra_state_fields = tor_strdup("and the green grass grew all around"); + + char *s = NULL; + s = entry_guard_encode_for_state(eg); + + tt_str_op(s, OP_EQ, + "in=default " + "rsa_id=706C75727079666C75727079736C75727079646F " + "bridge_addr=8.8.4.4:9999 " + "nickname=Fred " + "sampled_on=2016-11-14T00:00:00 " + "sampled_by=1.2.3 " + "unlisted_since=2016-11-14T00:00:45 " + "listed=1 " + "confirmed_on=2016-11-14T00:01:30 " + "confirmed_idx=333 " + "and the green grass grew all around"); + + done: + entry_guard_free(eg); + tor_free(s); +} + +static void +test_entry_guard_parse_from_state_minimal(void *arg) +{ + (void)arg; + char *mem_op_hex_tmp = NULL; + entry_guard_t *eg = NULL; + time_t t = approx_time(); + + eg = entry_guard_parse_from_state( + "in=default_plus " + "rsa_id=596f75206d6179206e656564206120686f626279"); + tt_assert(eg); + + tt_str_op(eg->selection_name, OP_EQ, "default_plus"); + test_mem_op_hex(eg->identity, OP_EQ, + "596f75206d6179206e656564206120686f626279"); + tt_str_op(eg->nickname, OP_EQ, "$596F75206D6179206E656564206120686F626279"); + tt_ptr_op(eg->bridge_addr, OP_EQ, NULL); + tt_i64_op(eg->sampled_on_date, OP_GE, t); + tt_i64_op(eg->sampled_on_date, OP_LE, t+86400); + tt_i64_op(eg->unlisted_since_date, OP_EQ, 0); + tt_ptr_op(eg->sampled_by_version, OP_EQ, NULL); + tt_int_op(eg->currently_listed, OP_EQ, 0); + tt_i64_op(eg->confirmed_on_date, OP_EQ, 0); + tt_int_op(eg->confirmed_idx, OP_EQ, -1); + + tt_int_op(eg->last_tried_to_connect, OP_EQ, 0); + tt_int_op(eg->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + + done: + entry_guard_free(eg); + tor_free(mem_op_hex_tmp); +} + +static void +test_entry_guard_parse_from_state_maximal(void *arg) +{ + (void)arg; + char *mem_op_hex_tmp = NULL; + entry_guard_t *eg = NULL; + + eg = entry_guard_parse_from_state( + "in=fred " + "rsa_id=706C75727079666C75727079736C75727079646F " + "bridge_addr=[1::3]:9999 " + "nickname=Fred " + "sampled_on=2016-11-14T00:00:00 " + "sampled_by=1.2.3 " + "unlisted_since=2016-11-14T00:00:45 " + "listed=1 " + "confirmed_on=2016-11-14T00:01:30 " + "confirmed_idx=333 " + "and the green grass grew all around " + "rsa_id=all,around"); + tt_assert(eg); + + test_mem_op_hex(eg->identity, OP_EQ, + "706C75727079666C75727079736C75727079646F"); + tt_str_op(fmt_addr(&eg->bridge_addr->addr), OP_EQ, "1::3"); + tt_int_op(eg->bridge_addr->port, OP_EQ, 9999); + tt_str_op(eg->nickname, OP_EQ, "Fred"); + tt_i64_op(eg->sampled_on_date, OP_EQ, 1479081600); + tt_i64_op(eg->unlisted_since_date, OP_EQ, 1479081645); + tt_str_op(eg->sampled_by_version, OP_EQ, "1.2.3"); + tt_int_op(eg->currently_listed, OP_EQ, 1); + tt_i64_op(eg->confirmed_on_date, OP_EQ, 1479081690); + tt_int_op(eg->confirmed_idx, OP_EQ, 333); + tt_str_op(eg->extra_state_fields, OP_EQ, + "and the green grass grew all around rsa_id=all,around"); + + tt_int_op(eg->last_tried_to_connect, OP_EQ, 0); + tt_int_op(eg->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + + done: + entry_guard_free(eg); + tor_free(mem_op_hex_tmp); +} + +static void +test_entry_guard_parse_from_state_failure(void *arg) +{ + (void)arg; + entry_guard_t *eg = NULL; + + /* no selection */ + eg = entry_guard_parse_from_state( + "rsa_id=596f75206d6179206e656564206120686f626270"); + tt_ptr_op(eg, OP_EQ, NULL); + + /* no RSA ID. */ + eg = entry_guard_parse_from_state("in=default nickname=Fred"); + tt_ptr_op(eg, OP_EQ, NULL); + + /* Bad RSA ID: bad character. */ + eg = entry_guard_parse_from_state( + "in=default " + "rsa_id=596f75206d6179206e656564206120686f62627q"); + tt_ptr_op(eg, OP_EQ, NULL); + + /* Bad RSA ID: too long.*/ + eg = entry_guard_parse_from_state( + "in=default " + "rsa_id=596f75206d6179206e656564206120686f6262703"); + tt_ptr_op(eg, OP_EQ, NULL); + + /* Bad RSA ID: too short.*/ + eg = entry_guard_parse_from_state( + "in=default " + "rsa_id=596f75206d6179206e65656420612"); + tt_ptr_op(eg, OP_EQ, NULL); + + done: + entry_guard_free(eg); +} + +static void +test_entry_guard_parse_from_state_partial_failure(void *arg) +{ + (void)arg; + char *mem_op_hex_tmp = NULL; + entry_guard_t *eg = NULL; + time_t t = approx_time(); + + eg = entry_guard_parse_from_state( + "in=default " + "rsa_id=706C75727079666C75727079736C75727079646F " + "bridge_addr=1.2.3.3.4:5 " + "nickname=FredIsANodeWithAStrangeNicknameThatIsTooLong " + "sampled_on=2016-11-14T00:00:99 " + "sampled_by=1.2.3 stuff in the middle " + "unlisted_since=2016-xx-14T00:00:45 " + "listed=0 " + "confirmed_on=2016-11-14T00:01:30zz " + "confirmed_idx=idx " + "and the green grass grew all around " + "rsa_id=all,around"); + tt_assert(eg); + + test_mem_op_hex(eg->identity, OP_EQ, + "706C75727079666C75727079736C75727079646F"); + tt_str_op(eg->nickname, OP_EQ, "FredIsANodeWithAStrangeNicknameThatIsTooL"); + tt_ptr_op(eg->bridge_addr, OP_EQ, NULL); + tt_i64_op(eg->sampled_on_date, OP_EQ, t); + tt_i64_op(eg->unlisted_since_date, OP_EQ, 0); + tt_str_op(eg->sampled_by_version, OP_EQ, "1.2.3"); + tt_int_op(eg->currently_listed, OP_EQ, 0); + tt_i64_op(eg->confirmed_on_date, OP_EQ, 0); + tt_int_op(eg->confirmed_idx, OP_EQ, -1); + tt_str_op(eg->extra_state_fields, OP_EQ, + "stuff in the middle and the green grass grew all around " + "rsa_id=all,around"); + + tt_int_op(eg->last_tried_to_connect, OP_EQ, 0); + tt_int_op(eg->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + + done: + entry_guard_free(eg); + tor_free(mem_op_hex_tmp); +} + +static int +mock_entry_guard_is_listed(guard_selection_t *gs, const entry_guard_t *guard) +{ + (void)gs; + (void)guard; + return 1; +} + +static void +test_entry_guard_parse_from_state_full(void *arg) +{ + (void)arg; + /* Here's a state I made while testing. The identities and locations for + * the bridges are redacted. */ + const char STATE[] = + "Guard in=default rsa_id=214F44BD5B638E8C817D47FF7C97397790BF0345 " + "nickname=TotallyNinja sampled_on=2016-11-12T19:32:49 " + "sampled_by=0.3.0.0-alpha-dev " + "listed=1\n" + "Guard in=default rsa_id=052900AB0EA3ED54BAB84AE8A99E74E8693CE2B2 " + "nickname=5OfNovember sampled_on=2016-11-20T04:32:05 " + "sampled_by=0.3.0.0-alpha-dev " + "listed=1 confirmed_on=2016-11-22T08:13:28 confirmed_idx=0 " + "pb_circ_attempts=4.000000 pb_circ_successes=2.000000 " + "pb_successful_circuits_closed=2.000000\n" + "Guard in=default rsa_id=7B700C0C207EBD0002E00F499BE265519AC3C25A " + "nickname=dc6jgk11 sampled_on=2016-11-28T11:50:13 " + "sampled_by=0.3.0.0-alpha-dev " + "listed=1 confirmed_on=2016-11-24T08:45:30 confirmed_idx=4 " + "pb_circ_attempts=5.000000 pb_circ_successes=5.000000 " + "pb_successful_circuits_closed=5.000000\n" + "Guard in=wobblesome rsa_id=7B700C0C207EBD0002E00F499BE265519AC3C25A " + "nickname=dc6jgk11 sampled_on=2016-11-28T11:50:13 " + "sampled_by=0.3.0.0-alpha-dev " + "listed=1\n" + "Guard in=default rsa_id=E9025AD60D86875D5F11548D536CC6AF60F0EF5E " + "nickname=maibrunn sampled_on=2016-11-25T22:36:38 " + "sampled_by=0.3.0.0-alpha-dev listed=1\n" + "Guard in=default rsa_id=DCD30B90BA3A792DA75DC54A327EF353FB84C38E " + "nickname=Unnamed sampled_on=2016-11-25T14:34:00 " + "sampled_by=0.3.0.0-alpha-dev listed=1\n" + "Guard in=bridges rsa_id=8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E " + "bridge_addr=24.1.1.1:443 sampled_on=2016-11-25T06:44:14 " + "sampled_by=0.3.0.0-alpha-dev listed=1 " + "confirmed_on=2016-11-29T10:36:06 confirmed_idx=0 " + "pb_circ_attempts=8.000000 pb_circ_successes=8.000000 " + "pb_successful_circuits_closed=13.000000\n" + "Guard in=bridges rsa_id=5800000000000000000000000000000000000000 " + "bridge_addr=37.218.246.143:28366 " + "sampled_on=2016-11-18T15:07:34 sampled_by=0.3.0.0-alpha-dev listed=1\n"; + + config_line_t *lines = NULL; + or_state_t *state = tor_malloc_zero(sizeof(or_state_t)); + int r = config_get_lines(STATE, &lines, 0); + char *msg = NULL; + smartlist_t *text = smartlist_new(); + char *joined = NULL; + + // So nodes aren't expired. This is Tue, 13 Dec 2016 09:37:14 GMT + update_approx_time(1481621834); + + MOCK(entry_guard_is_listed, mock_entry_guard_is_listed); + + dummy_state = state; + MOCK(get_or_state, + get_or_state_replacement); + + tt_int_op(r, OP_EQ, 0); + tt_assert(lines); + + state->Guard = lines; + + /* Try it first without setting the result. */ + r = entry_guards_parse_state(state, 0, &msg); + tt_int_op(r, OP_EQ, 0); + guard_selection_t *gs_br = + get_guard_selection_by_name("bridges", GS_TYPE_BRIDGE, 0); + tt_ptr_op(gs_br, OP_EQ, NULL); + + r = entry_guards_parse_state(state, 1, &msg); + tt_int_op(r, OP_EQ, 0); + gs_br = get_guard_selection_by_name("bridges", GS_TYPE_BRIDGE, 0); + guard_selection_t *gs_df = + get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0); + guard_selection_t *gs_wb = + get_guard_selection_by_name("wobblesome", GS_TYPE_NORMAL, 0); + + tt_assert(gs_br); + tt_assert(gs_df); + tt_assert(gs_wb); + + tt_int_op(smartlist_len(gs_df->sampled_entry_guards), OP_EQ, 5); + tt_int_op(smartlist_len(gs_br->sampled_entry_guards), OP_EQ, 2); + tt_int_op(smartlist_len(gs_wb->sampled_entry_guards), OP_EQ, 1); + + /* Try again; make sure it doesn't double-add the guards. */ + r = entry_guards_parse_state(state, 1, &msg); + tt_int_op(r, OP_EQ, 0); + gs_br = get_guard_selection_by_name("bridges", GS_TYPE_BRIDGE, 0); + gs_df = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0); + tt_assert(gs_br); + tt_assert(gs_df); + tt_int_op(smartlist_len(gs_df->sampled_entry_guards), OP_EQ, 5); + tt_int_op(smartlist_len(gs_br->sampled_entry_guards), OP_EQ, 2); + + /* Re-encode; it should be the same... almost. */ + { + /* (Make a guard nonpersistent first) */ + entry_guard_t *g = smartlist_get(gs_df->sampled_entry_guards, 0); + g->is_persistent = 0; + } + config_free_lines(lines); + lines = state->Guard = NULL; // to prevent double-free. + entry_guards_update_state(state); + tt_assert(state->Guard); + lines = state->Guard; + + config_line_t *ln; + for (ln = lines; ln; ln = ln->next) { + smartlist_add_asprintf(text, "%s %s\n",ln->key, ln->value); + } + joined = smartlist_join_strings(text, "", 0, NULL); + tt_str_op(joined, OP_EQ, + "Guard in=default rsa_id=052900AB0EA3ED54BAB84AE8A99E74E8693CE2B2 " + "nickname=5OfNovember sampled_on=2016-11-20T04:32:05 " + "sampled_by=0.3.0.0-alpha-dev " + "listed=1 confirmed_on=2016-11-22T08:13:28 confirmed_idx=0 " + "pb_circ_attempts=4.000000 pb_circ_successes=2.000000 " + "pb_successful_circuits_closed=2.000000\n" + "Guard in=default rsa_id=7B700C0C207EBD0002E00F499BE265519AC3C25A " + "nickname=dc6jgk11 sampled_on=2016-11-28T11:50:13 " + "sampled_by=0.3.0.0-alpha-dev " + "listed=1 confirmed_on=2016-11-24T08:45:30 confirmed_idx=1 " + "pb_circ_attempts=5.000000 pb_circ_successes=5.000000 " + "pb_successful_circuits_closed=5.000000\n" + "Guard in=default rsa_id=E9025AD60D86875D5F11548D536CC6AF60F0EF5E " + "nickname=maibrunn sampled_on=2016-11-25T22:36:38 " + "sampled_by=0.3.0.0-alpha-dev listed=1\n" + "Guard in=default rsa_id=DCD30B90BA3A792DA75DC54A327EF353FB84C38E " + "nickname=Unnamed sampled_on=2016-11-25T14:34:00 " + "sampled_by=0.3.0.0-alpha-dev listed=1\n" + "Guard in=wobblesome rsa_id=7B700C0C207EBD0002E00F499BE265519AC3C25A " + "nickname=dc6jgk11 sampled_on=2016-11-28T11:50:13 " + "sampled_by=0.3.0.0-alpha-dev " + "listed=1\n" + "Guard in=bridges rsa_id=8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E " + "bridge_addr=24.1.1.1:443 sampled_on=2016-11-25T06:44:14 " + "sampled_by=0.3.0.0-alpha-dev listed=1 " + "confirmed_on=2016-11-29T10:36:06 confirmed_idx=0 " + "pb_circ_attempts=8.000000 pb_circ_successes=8.000000 " + "pb_successful_circuits_closed=13.000000\n" + "Guard in=bridges rsa_id=5800000000000000000000000000000000000000 " + "bridge_addr=37.218.246.143:28366 " + "sampled_on=2016-11-18T15:07:34 sampled_by=0.3.0.0-alpha-dev listed=1\n"); + + done: + config_free_lines(lines); + tor_free(state); + tor_free(msg); + UNMOCK(get_or_state); + UNMOCK(entry_guard_is_listed); + SMARTLIST_FOREACH(text, char *, cp, tor_free(cp)); + smartlist_free(text); + tor_free(joined); +} + +static void +test_entry_guard_parse_from_state_broken(void *arg) +{ + (void)arg; + /* Here's a variation on the previous state. Every line but the first is + * busted somehow. */ + const char STATE[] = + /* Okay. */ + "Guard in=default rsa_id=214F44BD5B638E8C817D47FF7C97397790BF0345 " + "nickname=TotallyNinja sampled_on=2016-11-12T19:32:49 " + "sampled_by=0.3.0.0-alpha-dev " + "listed=1\n" + /* No selection listed. */ + "Guard rsa_id=052900AB0EA3ED54BAB84AE8A99E74E8693CE2B2 " + "nickname=5OfNovember sampled_on=2016-11-20T04:32:05 " + "sampled_by=0.3.0.0-alpha-dev " + "listed=1 confirmed_on=2016-11-22T08:13:28 confirmed_idx=0 " + "pb_circ_attempts=4.000000 pb_circ_successes=2.000000 " + "pb_successful_circuits_closed=2.000000\n" + /* Selection is "legacy"!! */ + "Guard in=legacy rsa_id=7B700C0C207EBD0002E00F499BE265519AC3C25A " + "nickname=dc6jgk11 sampled_on=2016-11-28T11:50:13 " + "sampled_by=0.3.0.0-alpha-dev " + "listed=1 confirmed_on=2016-11-24T08:45:30 confirmed_idx=4 " + "pb_circ_attempts=5.000000 pb_circ_successes=5.000000 " + "pb_successful_circuits_closed=5.000000\n"; + + config_line_t *lines = NULL; + or_state_t *state = tor_malloc_zero(sizeof(or_state_t)); + int r = config_get_lines(STATE, &lines, 0); + char *msg = NULL; + + dummy_state = state; + MOCK(get_or_state, + get_or_state_replacement); + + tt_int_op(r, OP_EQ, 0); + tt_assert(lines); + + state->Guard = lines; + + /* First, no-set case. we should get an error. */ + r = entry_guards_parse_state(state, 0, &msg); + tt_int_op(r, OP_LT, 0); + tt_ptr_op(msg, OP_NE, NULL); + /* And we shouldn't have made anything. */ + guard_selection_t *gs_df = + get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0); + tt_ptr_op(gs_df, OP_EQ, NULL); + tor_free(msg); + + /* Now see about the set case (which shouldn't happen IRL) */ + r = entry_guards_parse_state(state, 1, &msg); + tt_int_op(r, OP_LT, 0); + tt_ptr_op(msg, OP_NE, NULL); + gs_df = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0); + tt_ptr_op(gs_df, OP_NE, NULL); + tt_int_op(smartlist_len(gs_df->sampled_entry_guards), OP_EQ, 1); + + done: + config_free_lines(lines); + tor_free(state); + tor_free(msg); + UNMOCK(get_or_state); +} + +static void +test_entry_guard_get_guard_selection_by_name(void *arg) +{ + (void)arg; + guard_selection_t *gs1, *gs2, *gs3; + + gs1 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 0); + tt_ptr_op(gs1, OP_EQ, NULL); + gs1 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 1); + tt_ptr_op(gs1, OP_NE, NULL); + gs2 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 1); + tt_assert(gs2 == gs1); + gs2 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 0); + tt_assert(gs2 == gs1); + + gs2 = get_guard_selection_by_name("implausible", GS_TYPE_NORMAL, 0); + tt_ptr_op(gs2, OP_EQ, NULL); + gs2 = get_guard_selection_by_name("implausible", GS_TYPE_NORMAL, 1); + tt_ptr_op(gs2, OP_NE, NULL); + tt_assert(gs2 != gs1); + gs3 = get_guard_selection_by_name("implausible", GS_TYPE_NORMAL, 0); + tt_assert(gs3 == gs2); + + gs3 = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0); + tt_ptr_op(gs3, OP_EQ, NULL); + gs3 = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 1); + tt_ptr_op(gs3, OP_NE, NULL); + tt_assert(gs3 != gs2); + tt_assert(gs3 != gs1); + tt_assert(gs3 == get_guard_selection_info()); + + done: + entry_guards_free_all(); +} + +static void +test_entry_guard_choose_selection_initial(void *arg) +{ + /* Tests for picking our initial guard selection (based on having had + * no previous selection */ + (void)arg; + guard_selection_type_t type = GS_TYPE_INFER; + const char *name = choose_guard_selection(get_options(), + dummy_consensus, NULL, &type); + tt_str_op(name, OP_EQ, "default"); + tt_int_op(type, OP_EQ, GS_TYPE_NORMAL); + + /* If we're using bridges, we get the bridge selection. */ + get_options_mutable()->UseBridges = 1; + name = choose_guard_selection(get_options(), + dummy_consensus, NULL, &type); + tt_str_op(name, OP_EQ, "bridges"); + tt_int_op(type, OP_EQ, GS_TYPE_BRIDGE); + get_options_mutable()->UseBridges = 0; + + /* If we discard >99% of our guards, though, we should be in the restricted + * set. */ + tt_assert(get_options_mutable()->EntryNodes == NULL); + get_options_mutable()->EntryNodes = routerset_new(); + routerset_parse(get_options_mutable()->EntryNodes, "1.0.0.0/8", "foo"); + name = choose_guard_selection(get_options(), + dummy_consensus, NULL, &type); + tt_str_op(name, OP_EQ, "restricted"); + tt_int_op(type, OP_EQ, GS_TYPE_RESTRICTED); + + done: + ; +} + +static void +test_entry_guard_add_single_guard(void *arg) +{ + (void)arg; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + + /* 1: Add a single guard to the sample. */ + node_t *n1 = smartlist_get(big_fake_net_nodes, 0); + time_t now = approx_time(); + tt_assert(n1->is_possible_guard == 1); + entry_guard_t *g1 = entry_guard_add_to_sample(gs, n1); + tt_assert(g1); + + /* Make sure its fields look right. */ + tt_mem_op(n1->identity, OP_EQ, g1->identity, DIGEST_LEN); + tt_i64_op(g1->sampled_on_date, OP_GE, now - 12*86400); + tt_i64_op(g1->sampled_on_date, OP_LE, now); + tt_str_op(g1->sampled_by_version, OP_EQ, VERSION); + tt_uint_op(g1->currently_listed, OP_EQ, 1); + tt_i64_op(g1->confirmed_on_date, OP_EQ, 0); + tt_int_op(g1->confirmed_idx, OP_EQ, -1); + tt_int_op(g1->last_tried_to_connect, OP_EQ, 0); + tt_uint_op(g1->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + tt_i64_op(g1->failing_since, OP_EQ, 0); + tt_uint_op(g1->is_filtered_guard, OP_EQ, 1); + tt_uint_op(g1->is_usable_filtered_guard, OP_EQ, 1); + tt_uint_op(g1->is_primary, OP_EQ, 0); + tt_ptr_op(g1->extra_state_fields, OP_EQ, NULL); + + /* Make sure it got added. */ + tt_int_op(1, OP_EQ, smartlist_len(gs->sampled_entry_guards)); + tt_ptr_op(g1, OP_EQ, smartlist_get(gs->sampled_entry_guards, 0)); + tt_ptr_op(g1, OP_EQ, get_sampled_guard_with_id(gs, (uint8_t*)n1->identity)); + const uint8_t bad_id[20] = {0}; + tt_ptr_op(NULL, OP_EQ, get_sampled_guard_with_id(gs, bad_id)); + + done: + guard_selection_free(gs); +} + +static void +test_entry_guard_node_filter(void *arg) +{ + (void)arg; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + bridge_line_t *bl = NULL; + + /* Initialize a bunch of node objects that are all guards. */ +#define NUM 7 + node_t *n[NUM]; + entry_guard_t *g[NUM]; + int i; + for (i=0; i < NUM; ++i) { + n[i] = smartlist_get(big_fake_net_nodes, i*2); // even ones are guards. + g[i] = entry_guard_add_to_sample(gs, n[i]); + + // everything starts out filtered-in + tt_uint_op(g[i]->is_filtered_guard, OP_EQ, 1); + tt_uint_op(g[i]->is_usable_filtered_guard, OP_EQ, 1); + } + tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, NUM); + + /* Make sure refiltering doesn't hurt */ + entry_guards_update_filtered_sets(gs); + for (i = 0; i < NUM; ++i) { + tt_uint_op(g[i]->is_filtered_guard, OP_EQ, 1); + tt_uint_op(g[i]->is_usable_filtered_guard, OP_EQ, 1); + } + tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, NUM); + + /* Now start doing things to make the guards get filtered out, 1 by 1. */ + + /* 0: Not listed. */ + g[0]->currently_listed = 0; + + /* 1: path bias says this guard is maybe eeeevil. */ + g[1]->pb.path_bias_disabled = 1; + + /* 2: Unreachable address. */ + n[2]->rs->addr = 0; + + /* 3: ExcludeNodes */ + n[3]->rs->addr = 0x90902020; + routerset_free(get_options_mutable()->ExcludeNodes); + get_options_mutable()->ExcludeNodes = routerset_new(); + routerset_parse(get_options_mutable()->ExcludeNodes, "144.144.0.0/16", ""); + + /* 4: Bridge. */ + get_options_mutable()->UseBridges = 1; + sweep_bridge_list(); + bl = tor_malloc_zero(sizeof(bridge_line_t)); + tor_addr_from_ipv4h(&bl->addr, n[4]->rs->addr); + bl->port = n[4]->rs->or_port; + memcpy(bl->digest, n[4]->identity, 20); + bridge_add_from_config(bl); + bl = NULL; // prevent free. + get_options_mutable()->UseBridges = 0; + + /* 5: Unreachable. This stays in the filter, but isn't in usable-filtered */ + g[5]->last_tried_to_connect = approx_time(); // prevent retry. + g[5]->is_reachable = GUARD_REACHABLE_NO; + + /* 6: no change. */ + + /* Now refilter and inspect. */ + entry_guards_update_filtered_sets(gs); + for (i = 0; i < NUM; ++i) { + tt_assert(g[i]->is_filtered_guard == (i == 5 || i == 6)); + tt_assert(g[i]->is_usable_filtered_guard == (i == 6)); + } + tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, 1); + + /* Now make sure we have no live consensus, and no nodes. Nothing should + * pass the filter any more. */ + tor_free(dummy_consensus); + dummy_consensus = NULL; + SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, node, { + memset(node->identity, 0xff, 20); + }); + entry_guards_update_filtered_sets(gs); + for (i = 0; i < NUM; ++i) { + tt_uint_op(g[i]->is_filtered_guard, OP_EQ, 0); + tt_uint_op(g[i]->is_usable_filtered_guard, OP_EQ, 0); + } + tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, 0); + + done: + guard_selection_free(gs); + tor_free(bl); +#undef NUM +} + +static void +test_entry_guard_expand_sample(void *arg) +{ + (void)arg; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + digestmap_t *node_by_id = digestmap_new(); + + entry_guard_t *guard = entry_guards_expand_sample(gs); + tt_assert(guard); // the last guard returned. + + // Every sampled guard here should be filtered and reachable for now. + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, + num_reachable_filtered_guards(gs, NULL)); + + /* Make sure we got the right number. */ + tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE, OP_EQ, + num_reachable_filtered_guards(gs, NULL)); + + // Make sure everything we got was from our fake node list, and everything + // was unique. + SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, g) { + const node_t *n = bfn_mock_node_get_by_id(g->identity); + tt_assert(n); + tt_ptr_op(NULL, OP_EQ, digestmap_get(node_by_id, g->identity)); + digestmap_set(node_by_id, g->identity, (void*) n); + int idx = smartlist_pos(big_fake_net_nodes, n); + // The even ones are the guards; make sure we got guards. + tt_int_op(idx & 1, OP_EQ, 0); + } SMARTLIST_FOREACH_END(g); + + // Nothing became unusable/unfiltered, so a subsequent expand should + // make no changes. + guard = entry_guards_expand_sample(gs); + tt_ptr_op(guard, OP_EQ, NULL); // no guard was added. + tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE, OP_EQ, + num_reachable_filtered_guards(gs, NULL)); + + // Make a few guards unreachable. + guard = smartlist_get(gs->sampled_entry_guards, 0); + guard->is_usable_filtered_guard = 0; + guard = smartlist_get(gs->sampled_entry_guards, 1); + guard->is_usable_filtered_guard = 0; + guard = smartlist_get(gs->sampled_entry_guards, 2); + guard->is_usable_filtered_guard = 0; + tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE - 3, OP_EQ, + num_reachable_filtered_guards(gs, NULL)); + + // This time, expanding the sample will add some more guards. + guard = entry_guards_expand_sample(gs); + tt_assert(guard); // no guard was added. + tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE, OP_EQ, + num_reachable_filtered_guards(gs, NULL)); + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, + num_reachable_filtered_guards(gs, NULL)+3); + + // Still idempotent. + guard = entry_guards_expand_sample(gs); + tt_ptr_op(guard, OP_EQ, NULL); // no guard was added. + tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE, OP_EQ, + num_reachable_filtered_guards(gs, NULL)); + + // Now, do a nasty trick: tell the filter to exclude 31/32 of the guards. + // This will cause the sample size to get reeeeally huge, while the + // filtered sample size grows only slowly. + routerset_free(get_options_mutable()->ExcludeNodes); + get_options_mutable()->ExcludeNodes = routerset_new(); + routerset_parse(get_options_mutable()->ExcludeNodes, "144.144.0.0/16", ""); + SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, n, { + if (n_sl_idx % 64 != 0) { + n->rs->addr = 0x90903030; + } + }); + entry_guards_update_filtered_sets(gs); + + // Surely (p ~ 1-2**-60), one of our guards has been excluded. + tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_LT, + DFLT_MIN_FILTERED_SAMPLE_SIZE); + + // Try to regenerate the guards. + guard = entry_guards_expand_sample(gs); + tt_assert(guard); // no guard was added. + + /* this time, it's possible that we didn't add enough sampled guards. */ + tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_LE, + DFLT_MIN_FILTERED_SAMPLE_SIZE); + /* but we definitely didn't exceed the sample maximum. */ + const int n_guards = 271 / 2; + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_LE, + (int)(n_guards * .3)); + + done: + guard_selection_free(gs); + digestmap_free(node_by_id, NULL); +} + +static void +test_entry_guard_expand_sample_small_net(void *arg) +{ + (void)arg; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + + /* Fun corner case: not enough guards to make up our whole sample size. */ + SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, n, { + if (n_sl_idx >= 15) { + tor_free(n->rs); + tor_free(n->md); + tor_free(n); + SMARTLIST_DEL_CURRENT(big_fake_net_nodes, n); + } else { + n->rs->addr = 0; // make the filter reject this. + } + }); + + entry_guard_t *guard = entry_guards_expand_sample(gs); + tt_assert(guard); // the last guard returned -- some guard was added. + // half the nodes are guards, so we have 8 guards left. The set + // is small, so we sampled everything. + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, 8); + tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, 0); + done: + guard_selection_free(gs); +} + +static void +test_entry_guard_update_from_consensus_status(void *arg) +{ + /* Here we're going to have some nodes become un-guardy, and say we got a + * new consensus. This should cause those nodes to get detected as + * unreachable. */ + + (void)arg; + int i; + time_t start = approx_time(); + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + networkstatus_t *ns_tmp = NULL; + + /* Don't randomly backdate stuff; it will make correctness harder to check.*/ + MOCK(randomize_time, mock_randomize_time_no_randomization); + + /* First, sample some guards. */ + entry_guards_expand_sample(gs); + int n_sampled_pre = smartlist_len(gs->sampled_entry_guards); + int n_filtered_pre = num_reachable_filtered_guards(gs, NULL); + tt_i64_op(n_sampled_pre, OP_EQ, n_filtered_pre); + tt_i64_op(n_sampled_pre, OP_GT, 10); + + /* At this point, it should be a no-op to do this: */ + sampled_guards_update_from_consensus(gs); + + /* Now let's make some of our guards become unlisted. The easiest way to + * do that would be to take away their guard flag. */ + for (i = 0; i < 5; ++i) { + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); + node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); + n->is_possible_guard = 0; + } + + update_approx_time(start + 30); + { + /* try this with no live networkstatus. Nothing should happen! */ + ns_tmp = dummy_consensus; + dummy_consensus = NULL; + sampled_guards_update_from_consensus(gs); + tt_i64_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_sampled_pre); + tt_i64_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, n_filtered_pre); + /* put the networkstatus back. */ + dummy_consensus = ns_tmp; + ns_tmp = NULL; + } + + /* Now those guards should become unlisted, and drop off the filter, but + * stay in the sample. */ + update_approx_time(start + 60); + sampled_guards_update_from_consensus(gs); + + tt_i64_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_sampled_pre); + tt_i64_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, n_filtered_pre-5); + for (i = 0; i < 5; ++i) { + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); + tt_assert(! g->currently_listed); + tt_i64_op(g->unlisted_since_date, OP_EQ, start+60); + } + for (i = 5; i < n_sampled_pre; ++i) { + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); + tt_assert(g->currently_listed); + tt_i64_op(g->unlisted_since_date, OP_EQ, 0); + } + + /* Now re-list one, and remove one completely. */ + { + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 0); + node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); + n->is_possible_guard = 1; + } + { + /* try removing the node, to make sure we don't crash on an absent node + */ + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 5); + node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); + smartlist_remove(big_fake_net_nodes, n); + tor_free(n->rs); + tor_free(n->md); + tor_free(n); + } + update_approx_time(start + 300); + sampled_guards_update_from_consensus(gs); + + /* guards 1..5 are now unlisted; 0,6,7.. are listed. */ + tt_i64_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_sampled_pre); + for (i = 1; i < 6; ++i) { + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); + tt_assert(! g->currently_listed); + if (i == 5) + tt_i64_op(g->unlisted_since_date, OP_EQ, start+300); + else + tt_i64_op(g->unlisted_since_date, OP_EQ, start+60); + } + for (i = 0; i < n_sampled_pre; i = (!i) ? 6 : i+1) { /* 0,6,7,8, ... */ + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); + tt_assert(g->currently_listed); + tt_i64_op(g->unlisted_since_date, OP_EQ, 0); + } + + done: + tor_free(ns_tmp); /* in case we couldn't put it back */ + guard_selection_free(gs); + UNMOCK(randomize_time); +} + +static void +test_entry_guard_update_from_consensus_repair(void *arg) +{ + /* Here we'll make sure that our code to repair the unlisted-since + * times is correct. */ + + (void)arg; + int i; + time_t start = approx_time(); + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + + /* Don't randomly backdate stuff; it will make correctness harder to check.*/ + MOCK(randomize_time, mock_randomize_time_no_randomization); + + /* First, sample some guards. */ + entry_guards_expand_sample(gs); + int n_sampled_pre = smartlist_len(gs->sampled_entry_guards); + int n_filtered_pre = num_reachable_filtered_guards(gs, NULL); + tt_i64_op(n_sampled_pre, OP_EQ, n_filtered_pre); + tt_i64_op(n_sampled_pre, OP_GT, 10); + + /* Now corrupt the list a bit. Call some unlisted-since-never, and some + * listed-and-unlisted-since-a-time. */ + update_approx_time(start + 300); + for (i = 0; i < 3; ++i) { + /* these will get a date. */ + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); + node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); + n->is_possible_guard = 0; + g->currently_listed = 0; + } + for (i = 3; i < 6; ++i) { + /* these will become listed. */ + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); + g->unlisted_since_date = start+100; + } + setup_full_capture_of_logs(LOG_WARN); + sampled_guards_update_from_consensus(gs); + expect_log_msg_containing( + "was listed, but with unlisted_since_date set"); + expect_log_msg_containing( + "was unlisted, but with unlisted_since_date unset"); + teardown_capture_of_logs(); + + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_sampled_pre); + tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, n_filtered_pre-3); + for (i = 3; i < n_sampled_pre; ++i) { + /* these will become listed. */ + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); + if (i < 3) { + tt_assert(! g->currently_listed); + tt_i64_op(g->unlisted_since_date, OP_EQ, start+300); + } else { + tt_assert(g->currently_listed); + tt_i64_op(g->unlisted_since_date, OP_EQ, 0); + } + } + + done: + teardown_capture_of_logs(); + guard_selection_free(gs); + UNMOCK(randomize_time); +} + +static void +test_entry_guard_update_from_consensus_remove(void *arg) +{ + /* Now let's check the logic responsible for removing guards from the + * sample entirely. */ + + (void)arg; + //int i; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + smartlist_t *keep_ids = smartlist_new(); + smartlist_t *remove_ids = smartlist_new(); + + /* Don't randomly backdate stuff; it will make correctness harder to check.*/ + MOCK(randomize_time, mock_randomize_time_no_randomization); + + /* First, sample some guards. */ + entry_guards_expand_sample(gs); + int n_sampled_pre = smartlist_len(gs->sampled_entry_guards); + int n_filtered_pre = num_reachable_filtered_guards(gs, NULL); + tt_i64_op(n_sampled_pre, OP_EQ, n_filtered_pre); + tt_i64_op(n_sampled_pre, OP_GT, 10); + + const time_t one_day_ago = approx_time() - 1*24*60*60; + const time_t one_year_ago = approx_time() - 365*24*60*60; + const time_t two_years_ago = approx_time() - 2*365*24*60*60; + /* 0: unlisted for a day. (keep this) */ + { + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 0); + node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); + n->is_possible_guard = 0; + g->currently_listed = 0; + g->unlisted_since_date = one_day_ago; + smartlist_add(keep_ids, tor_memdup(g->identity, 20)); + } + /* 1: unlisted for a year. (remove this) */ + { + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 1); + node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); + n->is_possible_guard = 0; + g->currently_listed = 0; + g->unlisted_since_date = one_year_ago; + smartlist_add(remove_ids, tor_memdup(g->identity, 20)); + } + /* 2: added a day ago, never confirmed. (keep this) */ + { + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 2); + g->sampled_on_date = one_day_ago; + smartlist_add(keep_ids, tor_memdup(g->identity, 20)); + } + /* 3: added a year ago, never confirmed. (remove this) */ + { + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 3); + g->sampled_on_date = one_year_ago; + smartlist_add(remove_ids, tor_memdup(g->identity, 20)); + } + /* 4: added two year ago, confirmed yesterday, primary. (keep this.) */ + { + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 4); + g->sampled_on_date = one_year_ago; + g->confirmed_on_date = one_day_ago; + g->confirmed_idx = 0; + g->is_primary = 1; + smartlist_add(gs->confirmed_entry_guards, g); + smartlist_add(gs->primary_entry_guards, g); + smartlist_add(keep_ids, tor_memdup(g->identity, 20)); + } + /* 5: added two years ago, confirmed a year ago, primary. (remove this) */ + { + entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 5); + g->sampled_on_date = two_years_ago; + g->confirmed_on_date = one_year_ago; + g->confirmed_idx = 1; + g->is_primary = 1; + smartlist_add(gs->confirmed_entry_guards, g); + smartlist_add(gs->primary_entry_guards, g); + smartlist_add(remove_ids, tor_memdup(g->identity, 20)); + } + + sampled_guards_update_from_consensus(gs); + + /* Did we remove the right ones? */ + SMARTLIST_FOREACH(keep_ids, uint8_t *, id, { + tt_assert(get_sampled_guard_with_id(gs, id) != NULL); + }); + SMARTLIST_FOREACH(remove_ids, uint8_t *, id, { + tt_want(get_sampled_guard_with_id(gs, id) == NULL); + }); + + /* Did we remove the right number? */ + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_sampled_pre - 3); + + done: + guard_selection_free(gs); + UNMOCK(randomize_time); + SMARTLIST_FOREACH(keep_ids, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(remove_ids, char *, cp, tor_free(cp)); + smartlist_free(keep_ids); + smartlist_free(remove_ids); +} + +static void +test_entry_guard_confirming_guards(void *arg) +{ + (void)arg; + /* Now let's check the logic responsible for manipulating the list + * of confirmed guards */ + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + MOCK(randomize_time, mock_randomize_time_no_randomization); + + /* Create the sample. */ + entry_guards_expand_sample(gs); + + /* Confirm a few guards. */ + time_t start = approx_time(); + entry_guard_t *g1 = smartlist_get(gs->sampled_entry_guards, 0); + entry_guard_t *g2 = smartlist_get(gs->sampled_entry_guards, 1); + entry_guard_t *g3 = smartlist_get(gs->sampled_entry_guards, 8); + make_guard_confirmed(gs, g2); + update_approx_time(start + 10); + make_guard_confirmed(gs, g1); + make_guard_confirmed(gs, g3); + + /* Were the correct dates and indices fed in? */ + tt_int_op(g1->confirmed_idx, OP_EQ, 1); + tt_int_op(g2->confirmed_idx, OP_EQ, 0); + tt_int_op(g3->confirmed_idx, OP_EQ, 2); + tt_i64_op(g1->confirmed_on_date, OP_EQ, start+10); + tt_i64_op(g2->confirmed_on_date, OP_EQ, start); + tt_i64_op(g3->confirmed_on_date, OP_EQ, start+10); + tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 0), OP_EQ, g2); + tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 1), OP_EQ, g1); + tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 2), OP_EQ, g3); + + /* Now make sure we can regenerate the confirmed_entry_guards list. */ + smartlist_clear(gs->confirmed_entry_guards); + g2->confirmed_idx = 0; + g1->confirmed_idx = 10; + g3->confirmed_idx = 100; + entry_guards_update_confirmed(gs); + tt_int_op(g1->confirmed_idx, OP_EQ, 1); + tt_int_op(g2->confirmed_idx, OP_EQ, 0); + tt_int_op(g3->confirmed_idx, OP_EQ, 2); + tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 0), OP_EQ, g2); + tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 1), OP_EQ, g1); + tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 2), OP_EQ, g3); + + /* Now make sure we can regenerate the confirmed_entry_guards list if + * the indices are messed up. */ + g1->confirmed_idx = g2->confirmed_idx = g3->confirmed_idx = 999; + smartlist_clear(gs->confirmed_entry_guards); + entry_guards_update_confirmed(gs); + tt_int_op(g1->confirmed_idx, OP_GE, 0); + tt_int_op(g2->confirmed_idx, OP_GE, 0); + tt_int_op(g3->confirmed_idx, OP_GE, 0); + tt_int_op(g1->confirmed_idx, OP_LE, 2); + tt_int_op(g2->confirmed_idx, OP_LE, 2); + tt_int_op(g3->confirmed_idx, OP_LE, 2); + g1 = smartlist_get(gs->confirmed_entry_guards, 0); + g2 = smartlist_get(gs->confirmed_entry_guards, 1); + g3 = smartlist_get(gs->confirmed_entry_guards, 2); + tt_int_op(g1->confirmed_idx, OP_EQ, 0); + tt_int_op(g2->confirmed_idx, OP_EQ, 1); + tt_int_op(g3->confirmed_idx, OP_EQ, 2); + tt_assert(g1 != g2); + tt_assert(g1 != g3); + tt_assert(g2 != g3); + + done: + UNMOCK(randomize_time); + guard_selection_free(gs); +} + +static void +test_entry_guard_sample_reachable_filtered(void *arg) +{ + (void)arg; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + entry_guards_expand_sample(gs); + const int N = 10000; + bitarray_t *selected = NULL; + int i, j; + + /* We've got a sampled list now; let's make one non-usable-filtered; some + * confirmed, some primary, some pending. + */ + int n_guards = smartlist_len(gs->sampled_entry_guards); + tt_int_op(n_guards, OP_GT, 10); + entry_guard_t *g; + g = smartlist_get(gs->sampled_entry_guards, 0); + g->is_pending = 1; + g = smartlist_get(gs->sampled_entry_guards, 1); + make_guard_confirmed(gs, g); + g = smartlist_get(gs->sampled_entry_guards, 2); + g->is_primary = 1; + g = smartlist_get(gs->sampled_entry_guards, 3); + g->pb.path_bias_disabled = 1; + + entry_guards_update_filtered_sets(gs); + gs->primary_guards_up_to_date = 1; + tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, n_guards - 1); + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_guards); + + // +1 since the one we made disabled will make another one get added. + ++n_guards; + + /* Try a bunch of selections. */ + const struct { + int flag; int idx; + } tests[] = { + { 0, -1 }, + { SAMPLE_EXCLUDE_CONFIRMED, 1 }, + { SAMPLE_EXCLUDE_PRIMARY|SAMPLE_NO_UPDATE_PRIMARY, 2 }, + { SAMPLE_EXCLUDE_PENDING, 0 }, + { -1, -1}, + }; + + for (j = 0; tests[j].flag >= 0; ++j) { + selected = bitarray_init_zero(n_guards); + const int excluded_flags = tests[j].flag; + const int excluded_idx = tests[j].idx; + for (i = 0; i < N; ++i) { + g = sample_reachable_filtered_entry_guards(gs, NULL, excluded_flags); + tor_assert(g); + int pos = smartlist_pos(gs->sampled_entry_guards, g); + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_guards); + tt_int_op(pos, OP_GE, 0); + tt_int_op(pos, OP_LT, n_guards); + bitarray_set(selected, pos); + } + for (i = 0; i < n_guards; ++i) { + const int should_be_set = (i != excluded_idx && + i != 3); // filtered out. + tt_int_op(!!bitarray_is_set(selected, i), OP_EQ, should_be_set); + } + bitarray_free(selected); + selected = NULL; + } + + done: + guard_selection_free(gs); + bitarray_free(selected); +} + +static void +test_entry_guard_sample_reachable_filtered_empty(void *arg) +{ + (void)arg; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + /* What if we try to sample from a set of 0? */ + SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, n, + n->is_possible_guard = 0); + + entry_guard_t *g = sample_reachable_filtered_entry_guards(gs, NULL, 0); + tt_ptr_op(g, OP_EQ, NULL); + + done: + guard_selection_free(gs); +} + +static void +test_entry_guard_retry_unreachable(void *arg) +{ + (void)arg; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + + entry_guards_expand_sample(gs); + /* Let's say that we have two guards, and they're down. + */ + time_t start = approx_time(); + entry_guard_t *g1 = smartlist_get(gs->sampled_entry_guards, 0); + entry_guard_t *g2 = smartlist_get(gs->sampled_entry_guards, 1); + entry_guard_t *g3 = smartlist_get(gs->sampled_entry_guards, 2); + g1->is_reachable = GUARD_REACHABLE_NO; + g2->is_reachable = GUARD_REACHABLE_NO; + g1->is_primary = 1; + g1->failing_since = g2->failing_since = start; + g1->last_tried_to_connect = g2->last_tried_to_connect = start; + + /* Wait 5 minutes. Nothing will get retried. */ + update_approx_time(start + 5 * 60); + entry_guard_consider_retry(g1); + entry_guard_consider_retry(g2); + entry_guard_consider_retry(g3); // just to make sure this doesn't crash. + tt_int_op(g1->is_reachable, OP_EQ, GUARD_REACHABLE_NO); + tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_NO); + tt_int_op(g3->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + + /* After 30 min, the primary one gets retried */ + update_approx_time(start + 35 * 60); + entry_guard_consider_retry(g1); + entry_guard_consider_retry(g2); + tt_int_op(g1->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_NO); + + g1->is_reachable = GUARD_REACHABLE_NO; + g1->last_tried_to_connect = start + 55*60; + + /* After 1 hour, we'll retry the nonprimary one. */ + update_approx_time(start + 61 * 60); + entry_guard_consider_retry(g1); + entry_guard_consider_retry(g2); + tt_int_op(g1->is_reachable, OP_EQ, GUARD_REACHABLE_NO); + tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + + g2->is_reachable = GUARD_REACHABLE_NO; + g2->last_tried_to_connect = start + 61*60; + + /* And then the primary one again. */ + update_approx_time(start + 66 * 60); + entry_guard_consider_retry(g1); + entry_guard_consider_retry(g2); + tt_int_op(g1->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_NO); + + done: + guard_selection_free(gs); +} + +static void +test_entry_guard_manage_primary(void *arg) +{ + (void)arg; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + smartlist_t *prev_guards = smartlist_new(); + + /* If no guards are confirmed, we should pick a few reachable guards and + * call them all primary. But not confirmed.*/ + entry_guards_update_primary(gs); + int n_primary = smartlist_len(gs->primary_entry_guards); + tt_int_op(n_primary, OP_GE, 1); + SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, g, { + tt_assert(g->is_primary); + tt_assert(g->confirmed_idx == -1); + }); + + /* Calling it a second time should leave the guards unchanged. */ + smartlist_add_all(prev_guards, gs->primary_entry_guards); + entry_guards_update_primary(gs); + tt_int_op(smartlist_len(gs->primary_entry_guards), OP_EQ, n_primary); + SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, g, { + tt_ptr_op(g, OP_EQ, smartlist_get(prev_guards, g_sl_idx)); + }); + + /* If we have one confirmed guard, that guards becomes the first primary + * guard, and the other primary guards get kept. */ + + /* find a non-primary guard... */ + entry_guard_t *confirmed = NULL; + SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, g, { + if (! g->is_primary) { + confirmed = g; + break; + } + }); + tt_assert(confirmed); + /* make it confirmed. */ + make_guard_confirmed(gs, confirmed); + /* update the list... */ + smartlist_clear(prev_guards); + smartlist_add_all(prev_guards, gs->primary_entry_guards); + entry_guards_update_primary(gs); + + /* and see what's primary now! */ + tt_int_op(smartlist_len(gs->primary_entry_guards), OP_EQ, n_primary); + tt_ptr_op(smartlist_get(gs->primary_entry_guards, 0), OP_EQ, confirmed); + SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, g, { + tt_assert(g->is_primary); + if (g_sl_idx == 0) + continue; + tt_ptr_op(g, OP_EQ, smartlist_get(prev_guards, g_sl_idx - 1)); + }); + { + entry_guard_t *prev_last_guard = smartlist_get(prev_guards, n_primary-1); + tt_assert(! prev_last_guard->is_primary); + } + + /* Calling it a fourth time should leave the guards unchanged. */ + smartlist_clear(prev_guards); + smartlist_add_all(prev_guards, gs->primary_entry_guards); + entry_guards_update_primary(gs); + tt_int_op(smartlist_len(gs->primary_entry_guards), OP_EQ, n_primary); + SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, g, { + tt_ptr_op(g, OP_EQ, smartlist_get(prev_guards, g_sl_idx)); + }); + + /* Do some dirinfo checks */ + { + /* Check that we have all required dirinfo for the primaries (that's done + * in big_fake_network_setup()) */ + char *dir_info_str = + guard_selection_get_err_str_if_dir_info_missing(gs, 0, 0, 0); + tt_assert(!dir_info_str); + + /* Now artificially remove the first primary's descriptor and re-check */ + entry_guard_t *first_primary; + first_primary = smartlist_get(gs->primary_entry_guards, 0); + /* Change the first primary's identity digest so that the mocked functions + * can't find its descriptor */ + memset(first_primary->identity, 9, sizeof(first_primary->identity)); + dir_info_str =guard_selection_get_err_str_if_dir_info_missing(gs, 1, 2, 3); + tt_str_op(dir_info_str, OP_EQ, + "We're missing descriptors for 1/2 of our primary entry guards " + "(total microdescriptors: 2/3)."); + tor_free(dir_info_str); + } + + done: + guard_selection_free(gs); + smartlist_free(prev_guards); +} + +static void +test_entry_guard_guard_preferred(void *arg) +{ + (void) arg; + entry_guard_t *g1 = tor_malloc_zero(sizeof(entry_guard_t)); + entry_guard_t *g2 = tor_malloc_zero(sizeof(entry_guard_t)); + + g1->confirmed_idx = g2->confirmed_idx = -1; + g1->last_tried_to_connect = approx_time(); + g2->last_tried_to_connect = approx_time(); + + tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g1, g1)); + + /* Neither is pending; priorities equal. */ + tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g2, g1)); + tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g1, g2)); + + /* If one is pending, the pending one has higher priority */ + g1->is_pending = 1; + tt_int_op(1, OP_EQ, entry_guard_has_higher_priority(g1, g2)); + tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g2, g1)); + + /* If both are pending, and last_tried_to_connect is equal: + priorities equal */ + g2->is_pending = 1; + tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g2, g1)); + tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g1, g2)); + + /* One had a connection that startied earlier: it has higher priority. */ + g2->last_tried_to_connect -= 10; + tt_int_op(1, OP_EQ, entry_guard_has_higher_priority(g2, g1)); + tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g1, g2)); + + /* Now, say that g1 is confirmed. It will get higher priority. */ + g1->confirmed_idx = 5; + tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g2, g1)); + tt_int_op(1, OP_EQ, entry_guard_has_higher_priority(g1, g2)); + + /* But if g2 was confirmed first, it will get priority */ + g2->confirmed_idx = 2; + tt_int_op(1, OP_EQ, entry_guard_has_higher_priority(g2, g1)); + tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g1, g2)); + + done: + tor_free(g1); + tor_free(g2); +} + +static void +test_entry_guard_select_for_circuit_no_confirmed(void *arg) +{ + /* Simpler cases: no gaurds are confirmed yet. */ + (void)arg; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + entry_guard_restriction_t *rst = NULL; + + /* simple starting configuration */ + entry_guards_update_primary(gs); + unsigned state = 9999; + + entry_guard_t *g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, + NULL, &state); + + tt_assert(g); + tt_assert(g->is_primary); + tt_int_op(g->confirmed_idx, OP_EQ, -1); + tt_uint_op(g->is_pending, OP_EQ, 0); // primary implies non-pending. + tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); + tt_i64_op(g->last_tried_to_connect, OP_EQ, approx_time()); + + // If we do that again, we should get the same guard. + entry_guard_t *g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, + NULL, &state); + tt_ptr_op(g2, OP_EQ, g); + + // if we mark that guard down, we should get a different primary guard. + // auto-retry it. + g->is_reachable = GUARD_REACHABLE_NO; + g->failing_since = approx_time() - 10; + g->last_tried_to_connect = approx_time() - 10; + state = 9999; + g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); + tt_ptr_op(g2, OP_NE, g); + tt_assert(g2); + tt_assert(g2->is_primary); + tt_int_op(g2->confirmed_idx, OP_EQ, -1); + tt_uint_op(g2->is_pending, OP_EQ, 0); // primary implies non-pending. + tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); + tt_i64_op(g2->last_tried_to_connect, OP_EQ, approx_time()); + + // If we say that the first primary guard was last tried a long time ago, we + // should get an automatic retry on it. + g->failing_since = approx_time() - 72*60*60; + g->last_tried_to_connect = approx_time() - 72*60*60; + state = 9999; + g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); + tt_ptr_op(g2, OP_EQ, g); + tt_assert(g2); + tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); + tt_i64_op(g2->last_tried_to_connect, OP_EQ, approx_time()); + tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + + // And if we mark ALL the primary guards down, we should get another guard + // at random. + SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, guard, { + guard->is_reachable = GUARD_REACHABLE_NO; + guard->last_tried_to_connect = approx_time() - 5; + guard->failing_since = approx_time() - 30; + }); + state = 9999; + g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); + tt_assert(g2); + tt_assert(!g2->is_primary); + tt_int_op(g2->confirmed_idx, OP_EQ, -1); + tt_uint_op(g2->is_pending, OP_EQ, 1); + tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); + tt_i64_op(g2->last_tried_to_connect, OP_EQ, approx_time()); + tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + + // As a bonus, maybe we should be retrying the primary guards. Let's say so. + mark_primary_guards_maybe_reachable(gs); + SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, guard, { + tt_int_op(guard->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + tt_assert(guard->is_usable_filtered_guard == 1); + // no change to these fields. + tt_i64_op(guard->last_tried_to_connect, OP_EQ, approx_time() - 5); + tt_i64_op(guard->failing_since, OP_EQ, approx_time() - 30); + }); + + /* Let's try again and we should get the first primary guard again */ + g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); + tt_ptr_op(g, OP_EQ, smartlist_get(gs->primary_entry_guards, 0)); + g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); + tt_ptr_op(g2, OP_EQ, g); + + /* But if we impose a restriction, we don't get the same guard */ + rst = guard_create_exit_restriction((uint8_t*)g->identity); + g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, rst, &state); + tt_ptr_op(g2, OP_NE, g); + + done: + guard_selection_free(gs); + entry_guard_restriction_free(rst); +} + +static void +test_entry_guard_select_for_circuit_confirmed(void *arg) +{ + /* Case 2: if all the primary guards are down, and there are more confirmed + guards, we use a confirmed guard. */ + (void)arg; + int i; + entry_guard_restriction_t *rst = NULL; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + const int N_CONFIRMED = 10; + + /* slightly more complicated simple starting configuration */ + entry_guards_update_primary(gs); + for (i = 0; i < N_CONFIRMED; ++i) { + entry_guard_t *guard = smartlist_get(gs->sampled_entry_guards, i); + make_guard_confirmed(gs, guard); + } + entry_guards_update_primary(gs); // rebuild the primary list. + + unsigned state = 9999; + + // As above, this gives us a primary guard. + entry_guard_t *g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, + NULL, &state); + tt_assert(g); + tt_assert(g->is_primary); + tt_int_op(g->confirmed_idx, OP_EQ, 0); + tt_uint_op(g->is_pending, OP_EQ, 0); // primary implies non-pending. + tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); + tt_i64_op(g->last_tried_to_connect, OP_EQ, approx_time()); + tt_ptr_op(g, OP_EQ, smartlist_get(gs->primary_entry_guards, 0)); + + // But if we mark all the primary guards down... + SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, guard, { + guard->last_tried_to_connect = approx_time(); + entry_guards_note_guard_failure(gs, guard); + }); + + // ... we should get a confirmed guard. + state = 9999; + g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); + tt_assert(g); + tt_assert(! g->is_primary); + tt_int_op(g->confirmed_idx, OP_EQ, smartlist_len(gs->primary_entry_guards)); + tt_assert(g->is_pending); + tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); + tt_i64_op(g->last_tried_to_connect, OP_EQ, approx_time()); + + // And if we try again, we should get a different confirmed guard, since + // that one is pending. + state = 9999; + entry_guard_t *g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, + NULL, &state); + tt_assert(g2); + tt_assert(! g2->is_primary); + tt_ptr_op(g2, OP_NE, g); + tt_int_op(g2->confirmed_idx, OP_EQ, + smartlist_len(gs->primary_entry_guards)+1); + tt_assert(g2->is_pending); + tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); + tt_i64_op(g2->last_tried_to_connect, OP_EQ, approx_time()); + + // If we say that the next confirmed guard in order is excluded, and + // we disable EnforceDistinctSubnets, we get the guard AFTER the + // one we excluded. + get_options_mutable()->EnforceDistinctSubnets = 0; + g = smartlist_get(gs->confirmed_entry_guards, + smartlist_len(gs->primary_entry_guards)+2); + rst = guard_create_exit_restriction((uint8_t*)g->identity); + g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, rst, &state); + tt_ptr_op(g2, OP_NE, NULL); + tt_ptr_op(g2, OP_NE, g); + tt_int_op(g2->confirmed_idx, OP_EQ, + smartlist_len(gs->primary_entry_guards)+3); + + // If we make every confirmed guard become pending then we start poking + // other guards. + const int n_remaining_confirmed = + N_CONFIRMED - 3 - smartlist_len(gs->primary_entry_guards); + for (i = 0; i < n_remaining_confirmed; ++i) { + g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); + tt_int_op(g->confirmed_idx, OP_GE, 0); + tt_assert(g); + } + state = 9999; + g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); + tt_assert(g); + tt_assert(g->is_pending); + tt_int_op(g->confirmed_idx, OP_EQ, -1); + + // If we EnforceDistinctSubnets and apply a restriction, we get + // nothing, since we put all of the nodes in the same /16. + // Regression test for bug 22753/TROVE-2017-006. + get_options_mutable()->EnforceDistinctSubnets = 1; + g = smartlist_get(gs->confirmed_entry_guards, 0); + memcpy(rst->exclude_id, g->identity, DIGEST_LEN); + g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, rst, &state); + tt_ptr_op(g2, OP_EQ, NULL); + + done: + guard_selection_free(gs); + entry_guard_restriction_free(rst); +} + +static void +test_entry_guard_select_for_circuit_highlevel_primary(void *arg) +{ + /* Play around with selecting primary guards for circuits and markign + * them up and down */ + (void)arg; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + + time_t start = approx_time(); + + const node_t *node = NULL; + circuit_guard_state_t *guard = NULL; + entry_guard_t *g; + guard_usable_t u; + /* + * Make sure that the pick-for-circuit API basically works. We'll get + * a primary guard, so it'll be usable on completion. + */ + int r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard); + + tt_int_op(r, OP_EQ, 0); + tt_assert(node); + tt_assert(guard); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); + g = entry_guard_handle_get(guard->guard); + tt_assert(g); + tt_mem_op(g->identity, OP_EQ, node->identity, DIGEST_LEN); + tt_int_op(g->is_primary, OP_EQ, 1); + tt_i64_op(g->last_tried_to_connect, OP_EQ, start); + tt_int_op(g->confirmed_idx, OP_EQ, -1); + + /* Call that circuit successful. */ + update_approx_time(start+15); + u = entry_guard_succeeded(&guard); + tt_int_op(u, OP_EQ, GUARD_USABLE_NOW); /* We can use it now. */ + tt_assert(guard); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); + g = entry_guard_handle_get(guard->guard); + tt_assert(g); + tt_int_op(g->is_reachable, OP_EQ, GUARD_REACHABLE_YES); + tt_int_op(g->confirmed_idx, OP_EQ, 0); + + circuit_guard_state_free(guard); + guard = NULL; + node = NULL; + g = NULL; + + /* Try again. We'll also get a primary guard this time. (The same one, + in fact.) But this time, we'll say the connection has failed. */ + update_approx_time(start+35); + r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard); + tt_int_op(r, OP_EQ, 0); + tt_assert(node); + tt_assert(guard); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); + tt_i64_op(guard->state_set_at, OP_EQ, start+35); + g = entry_guard_handle_get(guard->guard); + tt_assert(g); + tt_mem_op(g->identity, OP_EQ, node->identity, DIGEST_LEN); + tt_int_op(g->is_primary, OP_EQ, 1); + tt_i64_op(g->last_tried_to_connect, OP_EQ, start+35); + tt_int_op(g->confirmed_idx, OP_EQ, 0); // same one. + + /* It's failed! What will happen to our poor guard? */ + update_approx_time(start+45); + entry_guard_failed(&guard); + tt_assert(guard); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_DEAD); + tt_i64_op(guard->state_set_at, OP_EQ, start+45); + g = entry_guard_handle_get(guard->guard); + tt_assert(g); + tt_int_op(g->is_reachable, OP_EQ, GUARD_REACHABLE_NO); + tt_i64_op(g->failing_since, OP_EQ, start+45); + tt_int_op(g->confirmed_idx, OP_EQ, 0); // still confirmed. + + circuit_guard_state_free(guard); + guard = NULL; + node = NULL; + entry_guard_t *g_prev = g; + g = NULL; + + /* Now try a third time. Since the other one is down, we'll get a different + * (still primary) guard. + */ + update_approx_time(start+60); + r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard); + tt_int_op(r, OP_EQ, 0); + tt_assert(node); + tt_assert(guard); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); + g = entry_guard_handle_get(guard->guard); + tt_assert(g); + tt_ptr_op(g, OP_NE, g_prev); + tt_mem_op(g->identity, OP_EQ, node->identity, DIGEST_LEN); + tt_mem_op(g->identity, OP_NE, g_prev->identity, DIGEST_LEN); + tt_int_op(g->is_primary, OP_EQ, 1); + tt_i64_op(g->last_tried_to_connect, OP_EQ, start+60); + tt_int_op(g->confirmed_idx, OP_EQ, -1); // not confirmd now. + + /* Call this one up; watch it get confirmed. */ + update_approx_time(start+90); + u = entry_guard_succeeded(&guard); + tt_int_op(u, OP_EQ, GUARD_USABLE_NOW); + tt_assert(guard); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); + g = entry_guard_handle_get(guard->guard); + tt_assert(g); + tt_int_op(g->is_reachable, OP_EQ, GUARD_REACHABLE_YES); + tt_int_op(g->confirmed_idx, OP_EQ, 1); + + done: + guard_selection_free(gs); + circuit_guard_state_free(guard); +} + +static void +test_entry_guard_select_for_circuit_highlevel_confirm_other(void *arg) +{ + (void) arg; + const int N_PRIMARY = DFLT_N_PRIMARY_GUARDS; + + /* At the start, we have no confirmed guards. We'll mark the primary guards + * down, then confirm something else. As soon as we do, it should become + * primary, and we should get it next time. */ + + time_t start = approx_time(); + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + circuit_guard_state_t *guard = NULL; + int i, r; + const node_t *node = NULL; + guard_usable_t u; + + /* Declare that we're on the internet. */ + entry_guards_note_internet_connectivity(gs); + + /* Primary guards are down! */ + for (i = 0; i < N_PRIMARY; ++i) { + r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard); + tt_assert(node); + tt_assert(guard); + tt_int_op(r, OP_EQ, 0); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); + entry_guard_failed(&guard); + circuit_guard_state_free(guard); + guard = NULL; + node = NULL; + } + + /* Next guard should be non-primary. */ + node = NULL; + r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard); + tt_assert(node); + tt_assert(guard); + tt_int_op(r, OP_EQ, 0); + entry_guard_t *g = entry_guard_handle_get(guard->guard); + tt_assert(g); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); + tt_int_op(g->confirmed_idx, OP_EQ, -1); + tt_int_op(g->is_primary, OP_EQ, 0); + tt_int_op(g->is_pending, OP_EQ, 1); + (void)start; + + u = entry_guard_succeeded(&guard); + /* We're on the internet (by fiat), so this guard will get called "confirmed" + * and should immediately become primary. + */ + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); + tt_assert(u == GUARD_USABLE_NOW); + tt_int_op(g->confirmed_idx, OP_EQ, 0); + tt_int_op(g->is_primary, OP_EQ, 1); + tt_int_op(g->is_pending, OP_EQ, 0); + + done: + guard_selection_free(gs); + circuit_guard_state_free(guard); +} + +static void +test_entry_guard_select_for_circuit_highlevel_primary_retry(void *arg) +{ + (void) arg; + const int N_PRIMARY = DFLT_N_PRIMARY_GUARDS; + + /* At the start, we have no confirmed guards. We'll mark the primary guards + * down, then confirm something else. As soon as we do, it should become + * primary, and we should get it next time. */ + + time_t start = approx_time(); + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + circuit_guard_state_t *guard = NULL, *guard2 = NULL; + int i, r; + const node_t *node = NULL; + entry_guard_t *g; + guard_usable_t u; + + /* Declare that we're on the internet. */ + entry_guards_note_internet_connectivity(gs); + + /* Make primary guards confirmed (so they won't be superseded by a later + * guard), then mark them down. */ + for (i = 0; i < N_PRIMARY; ++i) { + r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard); + tt_assert(node); + tt_assert(guard); + tt_int_op(r, OP_EQ, 0); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); + g = entry_guard_handle_get(guard->guard); + make_guard_confirmed(gs, g); + tt_int_op(g->is_primary, OP_EQ, 1); + entry_guard_failed(&guard); + circuit_guard_state_free(guard); + tt_int_op(g->is_reachable, OP_EQ, GUARD_REACHABLE_NO); + guard = NULL; + node = NULL; + } + + /* Get another guard that we might try. */ + r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard); + tt_assert(node); + tt_assert(guard); + tt_int_op(r, OP_EQ, 0); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); + g = entry_guard_handle_get(guard->guard); + tt_int_op(g->is_primary, OP_EQ, 0); + + tt_assert(entry_guards_all_primary_guards_are_down(gs)); + + /* And an hour has passed ... */ + update_approx_time(start + 3600); + + /* Say that guard has succeeded! */ + u = entry_guard_succeeded(&guard); + tt_int_op(u, OP_EQ, GUARD_MAYBE_USABLE_LATER); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD); + g = entry_guard_handle_get(guard->guard); + + /* The primary guards should have been marked up! */ + SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, pg, { + tt_int_op(pg->is_primary, OP_EQ, 1); + tt_ptr_op(g, OP_NE, pg); + tt_int_op(pg->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); + }); + + /* Have a circuit to a primary guard succeed. */ + r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard2); + tt_int_op(r, OP_EQ, 0); + tt_int_op(guard2->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); + u = entry_guard_succeeded(&guard2); + tt_assert(u == GUARD_USABLE_NOW); + tt_int_op(guard2->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); + + tt_assert(! entry_guards_all_primary_guards_are_down(gs)); + + done: + guard_selection_free(gs); + circuit_guard_state_free(guard); + circuit_guard_state_free(guard2); +} + +static void +test_entry_guard_select_and_cancel(void *arg) +{ + (void) arg; + const int N_PRIMARY = DFLT_N_PRIMARY_GUARDS; + int i,r; + const node_t *node = NULL; + circuit_guard_state_t *guard; + guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); + entry_guard_t *g; + + /* Once more, we mark all the primary guards down. */ + entry_guards_note_internet_connectivity(gs); + for (i = 0; i < N_PRIMARY; ++i) { + r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard); + tt_int_op(r, OP_EQ, 0); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); + g = entry_guard_handle_get(guard->guard); + tt_int_op(g->is_primary, OP_EQ, 1); + tt_int_op(g->is_pending, OP_EQ, 0); + make_guard_confirmed(gs, g); + entry_guard_failed(&guard); + circuit_guard_state_free(guard); + guard = NULL; + node = NULL; + } + + tt_assert(entry_guards_all_primary_guards_are_down(gs)); + + /* Now get another guard we could try... */ + r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard); + tt_assert(node); + tt_assert(guard); + tt_int_op(r, OP_EQ, 0); + tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); + g = entry_guard_handle_get(guard->guard); + tt_int_op(g->is_primary, OP_EQ, 0); + tt_int_op(g->is_pending, OP_EQ, 1); + + /* Whoops! We should never have asked for this guard. Cancel the request! */ + entry_guard_cancel(&guard); + tt_ptr_op(guard, OP_EQ, NULL); + tt_int_op(g->is_primary, OP_EQ, 0); + tt_int_op(g->is_pending, OP_EQ, 0); + + done: + guard_selection_free(gs); + circuit_guard_state_free(guard); +} + +static void +test_entry_guard_drop_guards(void *arg) +{ + (void) arg; + int r; + const node_t *node = NULL; + circuit_guard_state_t *guard; + guard_selection_t *gs = get_guard_selection_info(); + + // Pick a guard, to get things set up. + r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &guard); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_GE, + DFLT_MIN_FILTERED_SAMPLE_SIZE); + tt_ptr_op(gs, OP_EQ, get_guard_selection_info()); + + // Drop all the guards! (This is a bad idea....) + remove_all_entry_guards_for_guard_selection(gs); + gs = get_guard_selection_info(); + tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, 0); + tt_int_op(smartlist_len(gs->primary_entry_guards), OP_EQ, 0); + tt_int_op(smartlist_len(gs->confirmed_entry_guards), OP_EQ, 0); + + done: + circuit_guard_state_free(guard); + guard_selection_free(gs); +} + +/* Unit test setup function: Create a fake network, and set everything up + * for testing the upgrade-a-waiting-circuit code. */ +typedef struct { + guard_selection_t *gs; + time_t start; + circuit_guard_state_t *guard1_state; + circuit_guard_state_t *guard2_state; + entry_guard_t *guard1; + entry_guard_t *guard2; + origin_circuit_t *circ1; + origin_circuit_t *circ2; + smartlist_t *all_origin_circuits; +} upgrade_circuits_data_t; +static void * +upgrade_circuits_setup(const struct testcase_t *testcase) +{ + upgrade_circuits_data_t *data = tor_malloc_zero(sizeof(*data)); + guard_selection_t *gs = data->gs = + guard_selection_new("default", GS_TYPE_NORMAL); + circuit_guard_state_t *guard; + const node_t *node; + entry_guard_t *g; + int i; + const int N_PRIMARY = DFLT_N_PRIMARY_GUARDS; + const char *argument = testcase->setup_data; + const int make_circ1_succeed = strstr(argument, "c1-done") != NULL; + const int make_circ2_succeed = strstr(argument, "c2-done") != NULL; + + big_fake_network_setup(testcase); + + /* We're going to set things up in a state where a circuit will be ready to + * be upgraded. Each test can make a single change (or not) that should + * block the upgrade. + */ + + /* First, make all the primary guards confirmed, and down. */ + data->start = approx_time(); + entry_guards_note_internet_connectivity(gs); + for (i = 0; i < N_PRIMARY; ++i) { + entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &node, &guard); + g = entry_guard_handle_get(guard->guard); + make_guard_confirmed(gs, g); + entry_guard_failed(&guard); + circuit_guard_state_free(guard); + } + + /* Grab another couple of guards */ + data->all_origin_circuits = smartlist_new(); + + update_approx_time(data->start + 27); + entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &data->guard1_state); + origin_circuit_t *circ; + data->circ1 = circ = origin_circuit_new(); + circ->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL; + circ->guard_state = data->guard1_state; + smartlist_add(data->all_origin_circuits, circ); + + update_approx_time(data->start + 30); + entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, + &node, &data->guard2_state); + data->circ2 = circ = origin_circuit_new(); + circ->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL; + circ->guard_state = data->guard2_state; + smartlist_add(data->all_origin_circuits, circ); + + data->guard1 = entry_guard_handle_get(data->guard1_state->guard); + data->guard2 = entry_guard_handle_get(data->guard2_state->guard); + tor_assert(data->guard1 != data->guard2); + tor_assert(data->guard1_state->state == + GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); + tor_assert(data->guard2_state->state == + GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); + + guard_usable_t r; + update_approx_time(data->start + 32); + if (make_circ1_succeed) { + r = entry_guard_succeeded(&data->guard1_state); + tor_assert(r == GUARD_MAYBE_USABLE_LATER); + tor_assert(data->guard1_state->state == + GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD); + } + update_approx_time(data->start + 33); + if (make_circ2_succeed) { + r = entry_guard_succeeded(&data->guard2_state); + tor_assert(r == GUARD_MAYBE_USABLE_LATER); + tor_assert(data->guard2_state->state == + GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD); + } + + return data; +} +static int +upgrade_circuits_cleanup(const struct testcase_t *testcase, void *ptr) +{ + upgrade_circuits_data_t *data = ptr; + // circuit_guard_state_free(data->guard1_state); // held in circ1 + // circuit_guard_state_free(data->guard2_state); // held in circ2 + guard_selection_free(data->gs); + smartlist_free(data->all_origin_circuits); + circuit_free_(TO_CIRCUIT(data->circ1)); + circuit_free_(TO_CIRCUIT(data->circ2)); + tor_free(data); + return big_fake_network_cleanup(testcase, NULL); +} + +static void +test_entry_guard_upgrade_a_circuit(void *arg) +{ + upgrade_circuits_data_t *data = arg; + + /* This is the easy case: we have no COMPLETED circuits, all the + * primary guards are down, we have two WAITING circuits: one will + * get upgraded to COMPLETED! (The one that started first.) + */ + + smartlist_t *result = smartlist_new(); + int r; + r = entry_guards_upgrade_waiting_circuits(data->gs, + data->all_origin_circuits, + result); + tt_int_op(r, OP_EQ, 1); + tt_int_op(smartlist_len(result), OP_EQ, 1); + origin_circuit_t *oc = smartlist_get(result, 0); + + /* circ1 was started first, so we'll get told to ugrade it... */ + tt_ptr_op(oc, OP_EQ, data->circ1); + + /* And the guard state should be complete */ + tt_ptr_op(data->guard1_state, OP_NE, NULL); + tt_int_op(data->guard1_state->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); + + done: + smartlist_free(result); +} + +static void +test_entry_guard_upgrade_blocked_by_live_primary_guards(void *arg) +{ + upgrade_circuits_data_t *data = arg; + + /* If any primary guards might be up, we can't upgrade any waiting + * circuits. + */ + mark_primary_guards_maybe_reachable(data->gs); + + smartlist_t *result = smartlist_new(); + int r; + setup_capture_of_logs(LOG_DEBUG); + r = entry_guards_upgrade_waiting_circuits(data->gs, + data->all_origin_circuits, + result); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(result), OP_EQ, 0); + expect_log_msg_containing("not all primary guards were definitely down."); + + done: + teardown_capture_of_logs(); + smartlist_free(result); +} + +static void +test_entry_guard_upgrade_blocked_by_lack_of_waiting_circuits(void *arg) +{ + upgrade_circuits_data_t *data = arg; + + /* If no circuits are waiting, we can't upgrade anything. (The test + * setup in this case was told not to make any of the circuits "waiting".) + */ + smartlist_t *result = smartlist_new(); + int r; + setup_capture_of_logs(LOG_DEBUG); + r = entry_guards_upgrade_waiting_circuits(data->gs, + data->all_origin_circuits, + result); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(result), OP_EQ, 0); + expect_log_msg_containing("Considered upgrading guard-stalled circuits, " + "but didn't find any."); + + done: + teardown_capture_of_logs(); + smartlist_free(result); +} + +static void +test_entry_guard_upgrade_blocked_by_better_circ_complete(void *arg) +{ + upgrade_circuits_data_t *data = arg; + + /* We'll run through the logic of upgrade_a_circuit below... + * and then try again to make sure that circ2 isn't also upgraded. + */ + + smartlist_t *result = smartlist_new(); + int r; + r = entry_guards_upgrade_waiting_circuits(data->gs, + data->all_origin_circuits, + result); + tt_int_op(r, OP_EQ, 1); + tt_int_op(smartlist_len(result), OP_EQ, 1); + origin_circuit_t *oc = smartlist_get(result, 0); + tt_ptr_op(oc, OP_EQ, data->circ1); + tt_ptr_op(data->guard1_state, OP_NE, NULL); + tt_int_op(data->guard1_state->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); + + /* Now, try again. Make sure that circ2 isn't upgraded. */ + smartlist_clear(result); + setup_capture_of_logs(LOG_DEBUG); + r = entry_guards_upgrade_waiting_circuits(data->gs, + data->all_origin_circuits, + result); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(result), OP_EQ, 0); + expect_log_msg_containing("At least one complete circuit had higher " + "priority, so not upgrading."); + + done: + teardown_capture_of_logs(); + smartlist_free(result); +} + +static void +test_entry_guard_upgrade_not_blocked_by_restricted_circ_complete(void *arg) +{ + upgrade_circuits_data_t *data = arg; + + /* Once more, let circ1 become complete. But this time, we'll claim + * that circ2 was restricted to not use the same guard as circ1. */ + data->guard2_state->restrictions = + guard_create_exit_restriction((uint8_t*)data->guard1->identity); + + smartlist_t *result = smartlist_new(); + int r; + r = entry_guards_upgrade_waiting_circuits(data->gs, + data->all_origin_circuits, + result); + tt_int_op(r, OP_EQ, 1); + tt_int_op(smartlist_len(result), OP_EQ, 1); + origin_circuit_t *oc = smartlist_get(result, 0); + tt_ptr_op(oc, OP_EQ, data->circ1); + tt_ptr_op(data->guard1_state, OP_NE, NULL); + tt_int_op(data->guard1_state->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); + + /* Now, we try again. Since circ2 has a restriction that circ1 doesn't obey, + * circ2 _is_ eligible for upgrade. */ + smartlist_clear(result); + r = entry_guards_upgrade_waiting_circuits(data->gs, + data->all_origin_circuits, + result); + tt_int_op(r, OP_EQ, 1); + tt_int_op(smartlist_len(result), OP_EQ, 1); + origin_circuit_t *oc2 = smartlist_get(result, 0); + tt_ptr_op(oc2, OP_EQ, data->circ2); + + done: + smartlist_free(result); +} + +static void +test_entry_guard_upgrade_not_blocked_by_worse_circ_complete(void *arg) +{ + upgrade_circuits_data_t *data = arg; + smartlist_t *result = smartlist_new(); + /* here we manually make circ2 COMPLETE, and make sure that circ1 + * gets made complete anyway, since guard1 has higher priority + */ + update_approx_time(data->start + 300); + data->guard2_state->state = GUARD_CIRC_STATE_COMPLETE; + data->guard2_state->state_set_at = approx_time(); + update_approx_time(data->start + 301); + + /* Now, try again. Make sure that circ1 is approved. */ + int r; + r = entry_guards_upgrade_waiting_circuits(data->gs, + data->all_origin_circuits, + result); + tt_int_op(r, OP_EQ, 1); + tt_int_op(smartlist_len(result), OP_EQ, 1); + origin_circuit_t *oc = smartlist_get(result, 0); + tt_ptr_op(oc, OP_EQ, data->circ1); + + done: + smartlist_free(result); +} + +static void +test_entry_guard_upgrade_blocked_by_better_circ_pending(void *arg) +{ + upgrade_circuits_data_t *data = arg; + + /* circ2 is done, but circ1 is still pending. Since circ1 is better, + * we won't upgrade circ2. */ + + /* XXXX Prop271 -- this is a kludge. I'm making sure circ1 _is_ better, + * by messing with the guards' confirmed_idx */ + make_guard_confirmed(data->gs, data->guard1); + { + int tmp; + tmp = data->guard1->confirmed_idx; + data->guard1->confirmed_idx = data->guard2->confirmed_idx; + data->guard2->confirmed_idx = tmp; + } + + smartlist_t *result = smartlist_new(); + setup_capture_of_logs(LOG_DEBUG); + int r; + r = entry_guards_upgrade_waiting_circuits(data->gs, + data->all_origin_circuits, + result); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(result), OP_EQ, 0); + expect_log_msg_containing("but 1 pending circuit(s) had higher guard " + "priority, so not upgrading."); + + done: + teardown_capture_of_logs(); + smartlist_free(result); +} + +static void +test_entry_guard_upgrade_not_blocked_by_restricted_circ_pending(void *arg) +{ + upgrade_circuits_data_t *data = arg; + /* circ2 is done, but circ1 is still pending. But when there is a + restriction on circ2 that circ1 can't satisfy, circ1 can't block + circ2. */ + + /* XXXX Prop271 -- this is a kludge. I'm making sure circ1 _is_ better, + * by messing with the guards' confirmed_idx */ + make_guard_confirmed(data->gs, data->guard1); + { + int tmp; + tmp = data->guard1->confirmed_idx; + data->guard1->confirmed_idx = data->guard2->confirmed_idx; + data->guard2->confirmed_idx = tmp; + } + + data->guard2_state->restrictions = + guard_create_exit_restriction((uint8_t*)data->guard1->identity); + + smartlist_t *result = smartlist_new(); + int r; + r = entry_guards_upgrade_waiting_circuits(data->gs, + data->all_origin_circuits, + result); + tt_int_op(r, OP_EQ, 1); + tt_int_op(smartlist_len(result), OP_EQ, 1); + origin_circuit_t *oc = smartlist_get(result, 0); + tt_ptr_op(oc, OP_EQ, data->circ2); + + done: + smartlist_free(result); +} + +static void +test_entry_guard_upgrade_not_blocked_by_worse_circ_pending(void *arg) +{ + upgrade_circuits_data_t *data = arg; + + /* circ1 is done, but circ2 is still pending. Since circ1 is better, + * we will upgrade it. */ + smartlist_t *result = smartlist_new(); + int r; + r = entry_guards_upgrade_waiting_circuits(data->gs, + data->all_origin_circuits, + result); + tt_int_op(r, OP_EQ, 1); + tt_int_op(smartlist_len(result), OP_EQ, 1); + origin_circuit_t *oc = smartlist_get(result, 0); + tt_ptr_op(oc, OP_EQ, data->circ1); + + done: + smartlist_free(result); +} + +static void +test_enty_guard_should_expire_waiting(void *arg) +{ + (void)arg; + circuit_guard_state_t *fake_state = tor_malloc_zero(sizeof(*fake_state)); + /* We'll leave "guard" unset -- it won't matter here. */ + + /* No state? Can't expire. */ + tt_assert(! entry_guard_state_should_expire(NULL)); + + /* Let's try one that expires. */ + fake_state->state = GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD; + fake_state->state_set_at = + approx_time() - DFLT_NONPRIMARY_GUARD_IDLE_TIMEOUT - 1; + + tt_assert(entry_guard_state_should_expire(fake_state)); + + /* But it wouldn't expire if we changed the state. */ + fake_state->state = GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD; + tt_assert(! entry_guard_state_should_expire(fake_state)); + + /* And it wouldn't have expired a few seconds ago. */ + fake_state->state = GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD; + fake_state->state_set_at = + approx_time() - DFLT_NONPRIMARY_GUARD_IDLE_TIMEOUT + 5; + tt_assert(! entry_guard_state_should_expire(fake_state)); + + done: + tor_free(fake_state); +} + +static void +mock_directory_initiate_request(directory_request_t *req) +{ + if (req->guard_state) { + circuit_guard_state_free(req->guard_state); + } +} + +static networkstatus_t *mock_ns_val = NULL; +static networkstatus_t * +mock_ns_get_by_flavor(consensus_flavor_t f) +{ + (void)f; + return mock_ns_val; +} + +/** Test that when we fetch microdescriptors we skip guards that have + * previously failed to serve us needed microdescriptors. */ +static void +test_entry_guard_outdated_dirserver_exclusion(void *arg) +{ + int retval; + response_handler_args_t *args = NULL; + dir_connection_t *conn = NULL; + (void) arg; + + /* Test prep: Make a new guard selection */ + guard_selection_t *gs = get_guard_selection_by_name("default", + GS_TYPE_NORMAL, 1); + + /* ... we want to use entry guards */ + or_options_t *options = get_options_mutable(); + options->UseEntryGuards = 1; + options->UseBridges = 0; + + /* ... prepare some md digests we want to download in the future */ + smartlist_t *digests = smartlist_new(); + const char *prose = "unhurried and wise, we perceive."; + for (int i = 0; i < 20; i++) { + smartlist_add(digests, (char*)prose); + } + + tt_int_op(smartlist_len(digests), OP_EQ, 20); + + /* ... now mock some functions */ + mock_ns_val = tor_malloc_zero(sizeof(networkstatus_t)); + MOCK(networkstatus_get_latest_consensus_by_flavor, mock_ns_get_by_flavor); + MOCK(directory_initiate_request, mock_directory_initiate_request); + + /* Test logic: + * 0. Create a proper guard set and primary guard list. + * 1. Pretend to fail microdescriptor fetches from all the primary guards. + * 2. Order another microdescriptor fetch and make sure that primary guards + * get skipped since they failed previous fetches. + */ + + { /* Setup primary guard list */ + int i; + entry_guards_update_primary(gs); + for (i = 0; i < DFLT_N_PRIMARY_GUARDS; ++i) { + entry_guard_t *guard = smartlist_get(gs->sampled_entry_guards, i); + make_guard_confirmed(gs, guard); + } + entry_guards_update_primary(gs); + } + + { + /* Fail microdesc fetches with all the primary guards */ + args = tor_malloc_zero(sizeof(response_handler_args_t)); + args->status_code = 404; + args->reason = NULL; + args->body = NULL; + args->body_len = 0; + + conn = tor_malloc_zero(sizeof(dir_connection_t)); + conn->requested_resource = tor_strdup("d/jlinblackorigami"); + conn->base_.purpose = DIR_PURPOSE_FETCH_MICRODESC; + + /* Pretend to fail fetches with all primary guards */ + SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards,const entry_guard_t *,g) { + memcpy(conn->identity_digest, g->identity, DIGEST_LEN); + + retval = handle_response_fetch_microdesc(conn, args); + tt_int_op(retval, OP_EQ, 0); + } SMARTLIST_FOREACH_END(g); + } + + { + /* Now order the final md download */ + setup_full_capture_of_logs(LOG_INFO); + initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_MICRODESC, + digests, 3, 7, 0); + + /* ... and check that because we failed to fetch microdescs from all our + * primaries, we didnt end up selecting a primary for fetching dir info */ + expect_log_msg_containing("No primary or confirmed guards available."); + teardown_capture_of_logs(); + } + + done: + smartlist_free(digests); + tor_free(args); + if (conn) { + tor_free(conn->requested_resource); + tor_free(conn); + } +} + +static const struct testcase_setup_t big_fake_network = { + big_fake_network_setup, big_fake_network_cleanup +}; + +static const struct testcase_setup_t upgrade_circuits = { + upgrade_circuits_setup, upgrade_circuits_cleanup +}; + +#define BFN_TEST(name) \ + { #name, test_entry_guard_ ## name, TT_FORK, &big_fake_network, NULL } + +#define UPGRADE_TEST(name, arg) \ + { #name, test_entry_guard_ ## name, TT_FORK, &upgrade_circuits, \ + (void*)(arg) } + +struct testcase_t entrynodes_tests[] = { + { "node_preferred_orport", + test_node_preferred_orport, + 0, NULL, NULL }, + { "entry_guard_describe", test_entry_guard_describe, 0, NULL, NULL }, + { "randomize_time", test_entry_guard_randomize_time, 0, NULL, NULL }, + { "encode_for_state_minimal", + test_entry_guard_encode_for_state_minimal, 0, NULL, NULL }, + { "encode_for_state_maximal", + test_entry_guard_encode_for_state_maximal, 0, NULL, NULL }, + { "parse_from_state_minimal", + test_entry_guard_parse_from_state_minimal, 0, NULL, NULL }, + { "parse_from_state_maximal", + test_entry_guard_parse_from_state_maximal, 0, NULL, NULL }, + { "parse_from_state_failure", + test_entry_guard_parse_from_state_failure, 0, NULL, NULL }, + { "parse_from_state_partial_failure", + test_entry_guard_parse_from_state_partial_failure, 0, NULL, NULL }, + { "parse_from_state_full", + test_entry_guard_parse_from_state_full, TT_FORK, NULL, NULL }, + { "parse_from_state_broken", + test_entry_guard_parse_from_state_broken, TT_FORK, NULL, NULL }, + { "get_guard_selection_by_name", + test_entry_guard_get_guard_selection_by_name, TT_FORK, NULL, NULL }, + BFN_TEST(choose_selection_initial), + BFN_TEST(add_single_guard), + BFN_TEST(node_filter), + BFN_TEST(expand_sample), + BFN_TEST(expand_sample_small_net), + BFN_TEST(update_from_consensus_status), + BFN_TEST(update_from_consensus_repair), + BFN_TEST(update_from_consensus_remove), + BFN_TEST(confirming_guards), + BFN_TEST(sample_reachable_filtered), + BFN_TEST(sample_reachable_filtered_empty), + BFN_TEST(retry_unreachable), + BFN_TEST(manage_primary), + { "guard_preferred", test_entry_guard_guard_preferred, TT_FORK, NULL, NULL }, + BFN_TEST(select_for_circuit_no_confirmed), + BFN_TEST(select_for_circuit_confirmed), + BFN_TEST(select_for_circuit_highlevel_primary), + BFN_TEST(select_for_circuit_highlevel_confirm_other), + BFN_TEST(select_for_circuit_highlevel_primary_retry), + BFN_TEST(select_and_cancel), + BFN_TEST(drop_guards), + BFN_TEST(outdated_dirserver_exclusion), + + UPGRADE_TEST(upgrade_a_circuit, "c1-done c2-done"), + UPGRADE_TEST(upgrade_blocked_by_live_primary_guards, "c1-done c2-done"), + UPGRADE_TEST(upgrade_blocked_by_lack_of_waiting_circuits, ""), + UPGRADE_TEST(upgrade_blocked_by_better_circ_complete, "c1-done c2-done"), + UPGRADE_TEST(upgrade_not_blocked_by_restricted_circ_complete, + "c1-done c2-done"), + UPGRADE_TEST(upgrade_not_blocked_by_worse_circ_complete, "c1-done c2-done"), + UPGRADE_TEST(upgrade_blocked_by_better_circ_pending, "c2-done"), + UPGRADE_TEST(upgrade_not_blocked_by_restricted_circ_pending, + "c2-done"), + UPGRADE_TEST(upgrade_not_blocked_by_worse_circ_pending, "c1-done"), + { "should_expire_waiting", test_enty_guard_should_expire_waiting, TT_FORK, + NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_extorport.c b/src/wraith/src/test/test_extorport.c new file mode 100644 index 000000000..cadef257f --- /dev/null +++ b/src/wraith/src/test/test_extorport.c @@ -0,0 +1,609 @@ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONNECTION_PRIVATE +#define EXT_ORPORT_PRIVATE +#define MAIN_PRIVATE +#include "or.h" +#include "buffers.h" +#include "connection.h" +#include "connection_or.h" +#include "config.h" +#include "control.h" +#include "ext_orport.h" +#include "main.h" +#include "test.h" + +/* Test connection_or_remove_from_ext_or_id_map and + * connection_or_set_ext_or_identifier */ +static void +test_ext_or_id_map(void *arg) +{ + or_connection_t *c1 = NULL, *c2 = NULL, *c3 = NULL; + char *idp = NULL, *idp2 = NULL; + (void)arg; + + /* pre-initialization */ + tt_ptr_op(NULL, OP_EQ, + connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx")); + + c1 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); + c2 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); + c3 = or_connection_new(CONN_TYPE_OR, AF_INET); + + tt_ptr_op(c1->ext_or_conn_id, OP_NE, NULL); + tt_ptr_op(c2->ext_or_conn_id, OP_NE, NULL); + tt_ptr_op(c3->ext_or_conn_id, OP_EQ, NULL); + + tt_ptr_op(c1, OP_EQ, connection_or_get_by_ext_or_id(c1->ext_or_conn_id)); + tt_ptr_op(c2, OP_EQ, connection_or_get_by_ext_or_id(c2->ext_or_conn_id)); + tt_ptr_op(NULL, OP_EQ, + connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx")); + + idp = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN); + + /* Give c2 a new ID. */ + connection_or_set_ext_or_identifier(c2); + tt_mem_op(idp, OP_NE, c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN); + idp2 = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN); + tt_assert(!tor_digest_is_zero(idp2)); + + tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp)); + tt_ptr_op(c2, OP_EQ, connection_or_get_by_ext_or_id(idp2)); + + /* Now remove it. */ + connection_or_remove_from_ext_or_id_map(c2); + tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp)); + tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp2)); + + done: + if (c1) + connection_free_minimal(TO_CONN(c1)); + if (c2) + connection_free_minimal(TO_CONN(c2)); + if (c3) + connection_free_minimal(TO_CONN(c3)); + tor_free(idp); + tor_free(idp2); + connection_or_clear_ext_or_id_map(); +} + +/* Simple connection_write_to_buf_impl_ replacement that unconditionally + * writes to outbuf. */ +static void +connection_write_to_buf_impl_replacement(const char *string, size_t len, + connection_t *conn, int compressed) +{ + (void) compressed; + + tor_assert(string); + tor_assert(conn); + buf_add(conn->outbuf, string, len); +} + +static char * +buf_get_contents(buf_t *buf, size_t *sz_out) +{ + char *out; + *sz_out = buf_datalen(buf); + if (*sz_out >= ULONG_MAX) + return NULL; /* C'mon, really? */ + out = tor_malloc(*sz_out + 1); + if (buf_get_bytes(buf, out, (unsigned long)*sz_out) != 0) { + tor_free(out); + return NULL; + } + out[*sz_out] = '\0'; /* Hopefully gratuitous. */ + return out; +} + +static void +test_ext_or_write_command(void *arg) +{ + or_connection_t *c1; + char *cp = NULL; + char *buf = NULL; + size_t sz; + + (void) arg; + MOCK(connection_write_to_buf_impl_, + connection_write_to_buf_impl_replacement); + + c1 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); + tt_assert(c1); + + /* Length too long */ + tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 100, "X", 100000), + OP_LT, 0); + + /* Empty command */ + tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99, NULL, 0), + OP_EQ, 0); + cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz); + tt_int_op(sz, OP_EQ, 4); + tt_mem_op(cp, OP_EQ, "\x00\x99\x00\x00", 4); + tor_free(cp); + + /* Medium command. */ + tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99, + "Wai\0Hello", 9), OP_EQ, 0); + cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz); + tt_int_op(sz, OP_EQ, 13); + tt_mem_op(cp, OP_EQ, "\x00\x99\x00\x09Wai\x00Hello", 13); + tor_free(cp); + + /* Long command */ + buf = tor_malloc(65535); + memset(buf, 'x', 65535); + tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0xf00d, + buf, 65535), OP_EQ, 0); + cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz); + tt_int_op(sz, OP_EQ, 65539); + tt_mem_op(cp, OP_EQ, "\xf0\x0d\xff\xff", 4); + tt_mem_op(cp+4, OP_EQ, buf, 65535); + tor_free(cp); + + done: + if (c1) + connection_free_minimal(TO_CONN(c1)); + tor_free(cp); + tor_free(buf); + UNMOCK(connection_write_to_buf_impl_); +} + +static int +write_bytes_to_file_fail(const char *fname, const char *str, size_t len, + int bin) +{ + (void) fname; + (void) str; + (void) len; + (void) bin; + + return -1; +} + +static void +test_ext_or_init_auth(void *arg) +{ + or_options_t *options = get_options_mutable(); + const char *fn; + char *cp = NULL; + struct stat st; + char cookie0[32]; + (void)arg; + + /* Check default filename location */ + tor_free(options->DataDirectory); + options->DataDirectory = tor_strdup("foo"); + cp = get_ext_or_auth_cookie_file_name(); + tt_str_op(cp, OP_EQ, "foo"PATH_SEPARATOR"extended_orport_auth_cookie"); + tor_free(cp); + + /* Shouldn't be initialized already, or our tests will be a bit + * meaningless */ + ext_or_auth_cookie = tor_malloc_zero(32); + tt_assert(tor_mem_is_zero((char*)ext_or_auth_cookie, 32)); + + /* Now make sure we use a temporary file */ + fn = get_fname("ext_cookie_file"); + options->ExtORPortCookieAuthFile = tor_strdup(fn); + cp = get_ext_or_auth_cookie_file_name(); + tt_str_op(cp, OP_EQ, fn); + tor_free(cp); + + /* Test the initialization function with a broken + write_bytes_to_file(). See if the problem is handled properly. */ + MOCK(write_bytes_to_file, write_bytes_to_file_fail); + tt_int_op(-1, OP_EQ, init_ext_or_cookie_authentication(1)); + tt_int_op(ext_or_auth_cookie_is_set, OP_EQ, 0); + UNMOCK(write_bytes_to_file); + + /* Now do the actual initialization. */ + tt_int_op(0, OP_EQ, init_ext_or_cookie_authentication(1)); + tt_int_op(ext_or_auth_cookie_is_set, OP_EQ, 1); + cp = read_file_to_str(fn, RFTS_BIN, &st); + tt_ptr_op(cp, OP_NE, NULL); + tt_u64_op((uint64_t)st.st_size, OP_EQ, 64); + tt_mem_op(cp,OP_EQ, "! Extended ORPort Auth Cookie !\x0a", 32); + tt_mem_op(cp+32,OP_EQ, ext_or_auth_cookie, 32); + memcpy(cookie0, ext_or_auth_cookie, 32); + tt_assert(!tor_mem_is_zero((char*)ext_or_auth_cookie, 32)); + + /* Operation should be idempotent. */ + tt_int_op(0, OP_EQ, init_ext_or_cookie_authentication(1)); + tt_mem_op(cookie0,OP_EQ, ext_or_auth_cookie, 32); + + done: + tor_free(cp); + ext_orport_free_all(); +} + +static void +test_ext_or_cookie_auth(void *arg) +{ + char *reply=NULL, *reply2=NULL, *client_hash=NULL, *client_hash2=NULL; + size_t reply_len=0; + char hmac1[32], hmac2[32]; + + const char client_nonce[32] = + "Who is the third who walks alway"; + char server_hash_input[] = + "ExtORPort authentication server-to-client hash" + "Who is the third who walks alway" + "................................"; + char client_hash_input[] = + "ExtORPort authentication client-to-server hash" + "Who is the third who walks alway" + "................................"; + + (void)arg; + + tt_int_op(strlen(client_hash_input), OP_EQ, 46+32+32); + tt_int_op(strlen(server_hash_input), OP_EQ, 46+32+32); + + ext_or_auth_cookie = tor_malloc_zero(32); + memcpy(ext_or_auth_cookie, "s beside you? When I count, ther", 32); + ext_or_auth_cookie_is_set = 1; + + /* For this authentication, the client sends 32 random bytes (ClientNonce) + * The server replies with 32 byte ServerHash and 32 byte ServerNonce, + * where ServerHash is: + * HMAC-SHA256(CookieString, + * "ExtORPort authentication server-to-client hash" | ClientNonce | + * ServerNonce)" + * The client must reply with 32-byte ClientHash, which we compute as: + * ClientHash is computed as: + * HMAC-SHA256(CookieString, + * "ExtORPort authentication client-to-server hash" | ClientNonce | + * ServerNonce) + */ + + /* Wrong length */ + tt_int_op(-1, OP_EQ, + handle_client_auth_nonce(client_nonce, 33, &client_hash, &reply, + &reply_len)); + tt_int_op(-1, OP_EQ, + handle_client_auth_nonce(client_nonce, 31, &client_hash, &reply, + &reply_len)); + + /* Now let's try this for real! */ + tt_int_op(0, OP_EQ, + handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply, + &reply_len)); + tt_int_op(reply_len, OP_EQ, 64); + tt_ptr_op(reply, OP_NE, NULL); + tt_ptr_op(client_hash, OP_NE, NULL); + /* Fill in the server nonce into the hash inputs... */ + memcpy(server_hash_input+46+32, reply+32, 32); + memcpy(client_hash_input+46+32, reply+32, 32); + /* Check the HMACs are correct... */ + crypto_hmac_sha256(hmac1, (char*)ext_or_auth_cookie, 32, server_hash_input, + 46+32+32); + crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input, + 46+32+32); + tt_mem_op(hmac1,OP_EQ, reply, 32); + tt_mem_op(hmac2,OP_EQ, client_hash, 32); + + /* Now do it again and make sure that the results are *different* */ + tt_int_op(0, OP_EQ, + handle_client_auth_nonce(client_nonce, 32, &client_hash2, &reply2, + &reply_len)); + tt_mem_op(reply2,OP_NE, reply, reply_len); + tt_mem_op(client_hash2,OP_NE, client_hash, 32); + /* But that this one checks out too. */ + memcpy(server_hash_input+46+32, reply2+32, 32); + memcpy(client_hash_input+46+32, reply2+32, 32); + /* Check the HMACs are correct... */ + crypto_hmac_sha256(hmac1, (char*)ext_or_auth_cookie, 32, server_hash_input, + 46+32+32); + crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input, + 46+32+32); + tt_mem_op(hmac1,OP_EQ, reply2, 32); + tt_mem_op(hmac2,OP_EQ, client_hash2, 32); + + done: + tor_free(reply); + tor_free(client_hash); + tor_free(reply2); + tor_free(client_hash2); +} + +static void +crypto_rand_return_tse_str(char *to, size_t n) +{ + if (n != 32) { + TT_FAIL(("Asked for %d bytes, not 32", (int)n)); + return; + } + memcpy(to, "te road There is always another ", 32); +} + +static void +test_ext_or_cookie_auth_testvec(void *arg) +{ + char *reply=NULL, *client_hash=NULL; + size_t reply_len; + char *mem_op_hex_tmp=NULL; + + const char client_nonce[] = "But when I look ahead up the whi"; + (void)arg; + + ext_or_auth_cookie = tor_malloc_zero(32); + memcpy(ext_or_auth_cookie, "Gliding wrapt in a brown mantle," , 32); + ext_or_auth_cookie_is_set = 1; + + MOCK(crypto_rand, crypto_rand_return_tse_str); + + tt_int_op(0, OP_EQ, + handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply, + &reply_len)); + tt_ptr_op(reply, OP_NE, NULL ); + tt_uint_op(reply_len, OP_EQ, 64); + tt_mem_op(reply+32,OP_EQ, "te road There is always another ", 32); + /* HMACSHA256("Gliding wrapt in a brown mantle," + * "ExtORPort authentication server-to-client hash" + * "But when I look ahead up the write road There is always another "); + */ + test_memeq_hex(reply, + "ec80ed6e546d3b36fdfc22fe1315416b" + "029f1ade7610d910878b62eeb7403821"); + /* HMACSHA256("Gliding wrapt in a brown mantle," + * "ExtORPort authentication client-to-server hash" + * "But when I look ahead up the write road There is always another "); + * (Both values computed using Python CLI.) + */ + test_memeq_hex(client_hash, + "ab391732dd2ed968cd40c087d1b1f25b" + "33b3cd77ff79bd80c2074bbf438119a2"); + + done: + UNMOCK(crypto_rand); + tor_free(reply); + tor_free(client_hash); + tor_free(mem_op_hex_tmp); +} + +static void +ignore_bootstrap_problem(const char *warn, int reason, + or_connection_t *conn) +{ + (void)warn; + (void)reason; + (void)conn; +} + +static int is_reading = 1; +static int handshake_start_called = 0; + +static void +note_read_stopped(connection_t *conn) +{ + (void)conn; + is_reading=0; +} +static void +note_read_started(connection_t *conn) +{ + (void)conn; + is_reading=1; +} +static int +handshake_start(or_connection_t *conn, int receiving) +{ + if (!conn || !receiving) + TT_FAIL(("Bad arguments to handshake_start")); + handshake_start_called = 1; + return 0; +} + +#define WRITE(s,n) \ + do { \ + buf_add(TO_CONN(conn)->inbuf, (s), (n)); \ + } while (0) +#define CONTAINS(s,n) \ + do { \ + tt_int_op((n), OP_LE, sizeof(b)); \ + tt_int_op(buf_datalen(TO_CONN(conn)->outbuf), OP_EQ, (n)); \ + if ((n)) { \ + buf_get_bytes(TO_CONN(conn)->outbuf, b, (n)); \ + tt_mem_op(b, OP_EQ, (s), (n)); \ + } \ + } while (0) + +/* Helper: Do a successful Extended ORPort authentication handshake. */ +static void +do_ext_or_handshake(or_connection_t *conn) +{ + char b[256]; + + tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn)); + CONTAINS("\x01\x00", 2); + WRITE("\x01", 1); + WRITE("But when I look ahead up the whi", 32); + MOCK(crypto_rand, crypto_rand_return_tse_str); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + UNMOCK(crypto_rand); + tt_int_op(TO_CONN(conn)->state, OP_EQ, + EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH); + CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b" + "\x02\x9f\x1a\xde\x76\x10\xd9\x10\x87\x8b\x62\xee\xb7\x40\x38\x21" + "te road There is always another ", 64); + /* Send the right response this time. */ + WRITE("\xab\x39\x17\x32\xdd\x2e\xd9\x68\xcd\x40\xc0\x87\xd1\xb1\xf2\x5b" + "\x33\xb3\xcd\x77\xff\x79\xbd\x80\xc2\x07\x4b\xbf\x43\x81\x19\xa2", + 32); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + CONTAINS("\x01", 1); + tt_assert(! TO_CONN(conn)->marked_for_close); + tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_OPEN); + + done: ; +} + +static void +test_ext_or_handshake(void *arg) +{ + or_connection_t *conn=NULL; + char b[256]; + + (void) arg; + MOCK(connection_write_to_buf_impl_, + connection_write_to_buf_impl_replacement); + /* Use same authenticators as for test_ext_or_cookie_auth_testvec */ + ext_or_auth_cookie = tor_malloc_zero(32); + memcpy(ext_or_auth_cookie, "Gliding wrapt in a brown mantle," , 32); + ext_or_auth_cookie_is_set = 1; + + init_connection_lists(); + + conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); + tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn)); + /* The server starts by telling us about the one supported authtype. */ + CONTAINS("\x01\x00", 2); + /* Say the client hasn't responded yet. */ + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + /* Let's say the client replies badly. */ + WRITE("\x99", 1); + tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); + CONTAINS("", 0); + tt_assert(TO_CONN(conn)->marked_for_close); + close_closeable_connections(); + conn = NULL; + + /* Okay, try again. */ + conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); + tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn)); + CONTAINS("\x01\x00", 2); + /* Let's say the client replies sensibly this time. "Yes, AUTHTYPE_COOKIE + * sounds delicious. Let's have some of that!" */ + WRITE("\x01", 1); + /* Let's say that the client also sends part of a nonce. */ + WRITE("But when I look ", 16); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + CONTAINS("", 0); + tt_int_op(TO_CONN(conn)->state, OP_EQ, + EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE); + /* Pump it again. Nothing should happen. */ + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + /* send the rest of the nonce. */ + WRITE("ahead up the whi", 16); + MOCK(crypto_rand, crypto_rand_return_tse_str); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + UNMOCK(crypto_rand); + /* We should get the right reply from the server. */ + CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b" + "\x02\x9f\x1a\xde\x76\x10\xd9\x10\x87\x8b\x62\xee\xb7\x40\x38\x21" + "te road There is always another ", 64); + /* Send the wrong response. */ + WRITE("not with a bang but a whimper...", 32); + MOCK(control_event_bootstrap_prob_or, ignore_bootstrap_problem); + tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); + CONTAINS("\x00", 1); + tt_assert(TO_CONN(conn)->marked_for_close); + /* XXXX Hold-open-until-flushed. */ + close_closeable_connections(); + conn = NULL; + UNMOCK(control_event_bootstrap_prob_or); + + MOCK(connection_start_reading, note_read_started); + MOCK(connection_stop_reading, note_read_stopped); + MOCK(connection_tls_start_handshake, handshake_start); + + /* Okay, this time let's succeed. */ + conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); + do_ext_or_handshake(conn); + + /* Now let's run through some messages. */ + /* First let's send some junk and make sure it's ignored. */ + WRITE("\xff\xf0\x00\x03""ABC", 7); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + CONTAINS("", 0); + /* Now let's send a USERADDR command. */ + WRITE("\x00\x01\x00\x0c""1.2.3.4:5678", 16); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + tt_int_op(TO_CONN(conn)->port, OP_EQ, 5678); + tt_int_op(tor_addr_to_ipv4h(&TO_CONN(conn)->addr), OP_EQ, 0x01020304); + /* Now let's send a TRANSPORT command. */ + WRITE("\x00\x02\x00\x07""rfc1149", 11); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + tt_ptr_op(NULL, OP_NE, conn->ext_or_transport); + tt_str_op("rfc1149", OP_EQ, conn->ext_or_transport); + tt_int_op(is_reading,OP_EQ,1); + tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_OPEN); + /* DONE */ + WRITE("\x00\x00\x00\x00", 4); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_FLUSHING); + tt_int_op(is_reading,OP_EQ,0); + CONTAINS("\x10\x00\x00\x00", 4); + tt_int_op(handshake_start_called,OP_EQ,0); + tt_int_op(0, OP_EQ, connection_ext_or_finished_flushing(conn)); + tt_int_op(is_reading,OP_EQ,1); + tt_int_op(handshake_start_called,OP_EQ,1); + tt_int_op(TO_CONN(conn)->type, OP_EQ, CONN_TYPE_OR); + tt_int_op(TO_CONN(conn)->state, OP_EQ, 0); + close_closeable_connections(); + conn = NULL; + + /* Okay, this time let's succeed the handshake but fail the USERADDR + command. */ + conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); + do_ext_or_handshake(conn); + /* USERADDR command with an extra NUL byte */ + WRITE("\x00\x01\x00\x0d""1.2.3.4:5678\x00", 17); + MOCK(control_event_bootstrap_prob_or, ignore_bootstrap_problem); + tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); + CONTAINS("", 0); + tt_assert(TO_CONN(conn)->marked_for_close); + close_closeable_connections(); + conn = NULL; + UNMOCK(control_event_bootstrap_prob_or); + + /* Now fail the TRANSPORT command. */ + conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); + do_ext_or_handshake(conn); + /* TRANSPORT command with an extra NUL byte */ + WRITE("\x00\x02\x00\x08""rfc1149\x00", 12); + MOCK(control_event_bootstrap_prob_or, ignore_bootstrap_problem); + tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); + CONTAINS("", 0); + tt_assert(TO_CONN(conn)->marked_for_close); + close_closeable_connections(); + conn = NULL; + UNMOCK(control_event_bootstrap_prob_or); + + /* Now fail the TRANSPORT command. */ + conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); + do_ext_or_handshake(conn); + /* TRANSPORT command with transport name with symbols (not a + C-identifier) */ + WRITE("\x00\x02\x00\x07""rf*1149", 11); + MOCK(control_event_bootstrap_prob_or, ignore_bootstrap_problem); + tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); + CONTAINS("", 0); + tt_assert(TO_CONN(conn)->marked_for_close); + close_closeable_connections(); + conn = NULL; + UNMOCK(control_event_bootstrap_prob_or); + + done: + UNMOCK(connection_write_to_buf_impl_); + UNMOCK(crypto_rand); + if (conn) + connection_free_minimal(TO_CONN(conn)); +#undef CONTAINS +#undef WRITE +} + +struct testcase_t extorport_tests[] = { + { "id_map", test_ext_or_id_map, TT_FORK, NULL, NULL }, + { "write_command", test_ext_or_write_command, TT_FORK, NULL, NULL }, + { "init_auth", test_ext_or_init_auth, TT_FORK, NULL, NULL }, + { "cookie_auth", test_ext_or_cookie_auth, TT_FORK, NULL, NULL }, + { "cookie_auth_testvec", test_ext_or_cookie_auth_testvec, TT_FORK, + NULL, NULL }, + { "handshake", test_ext_or_handshake, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_guardfraction.c b/src/wraith/src/test/test_guardfraction.c new file mode 100644 index 000000000..51ca8f08e --- /dev/null +++ b/src/wraith/src/test/test_guardfraction.c @@ -0,0 +1,423 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define DIRSERV_PRIVATE +#define ROUTERPARSE_PRIVATE +#define NETWORKSTATUS_PRIVATE + +#include "orconfig.h" +#include "or.h" +#include "config.h" +#include "dirserv.h" +#include "container.h" +#include "entrynodes.h" +#include "util.h" +#include "routerparse.h" +#include "networkstatus.h" + +#include "test.h" +#include "test_helpers.h" +#include "log_test_helpers.h" + +/** Generate a vote_routerstatus_t for a router with identity digest + * digest_in_hex. */ +static vote_routerstatus_t * +gen_vote_routerstatus_for_tests(const char *digest_in_hex, int is_guard) +{ + int retval; + vote_routerstatus_t *vrs = NULL; + routerstatus_t *rs; + + vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); + rs = &vrs->status; + + { /* Useful information for tests */ + char digest_tmp[DIGEST_LEN]; + + /* Guard or not? */ + rs->is_possible_guard = is_guard; + + /* Fill in the fpr */ + tt_int_op(strlen(digest_in_hex), OP_EQ, HEX_DIGEST_LEN); + retval = base16_decode(digest_tmp, sizeof(digest_tmp), + digest_in_hex, HEX_DIGEST_LEN); + tt_int_op(retval, OP_EQ, sizeof(digest_tmp)); + memcpy(rs->identity_digest, digest_tmp, DIGEST_LEN); + } + + { /* Misc info (maybe not used in tests) */ + vrs->version = tor_strdup("0.1.2.14"); + strlcpy(rs->nickname, "router2", sizeof(rs->nickname)); + memset(rs->descriptor_digest, 78, DIGEST_LEN); + rs->addr = 0x99008801; + rs->or_port = 443; + rs->dir_port = 8000; + /* all flags but running cleared */ + rs->is_flagged_running = 1; + vrs->has_measured_bw = 1; + rs->has_bandwidth = 1; + } + + return vrs; + + done: + vote_routerstatus_free(vrs); + + return NULL; +} + +/** Make sure our parsers reject corrupted guardfraction files. */ +static void +test_parse_guardfraction_file_bad(void *arg) +{ + int retval; + char *guardfraction_bad = NULL; + const char *yesterday_date_str = get_yesterday_date_str(); + + (void) arg; + + /* Start parsing all those corrupted guardfraction files! */ + + /* Guardfraction file version is not a number! */ + tor_asprintf(&guardfraction_bad, + "guardfraction-file-version nan\n" + "written-at %s\n" + "n-inputs 420 3\n" + "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 100 420\n" + "guard-seen 07B5547026DF3E229806E135CFA8552D56AFBABC 5 420\n", + yesterday_date_str); + + retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); + tt_int_op(retval, OP_EQ, -1); + tor_free(guardfraction_bad); + + /* This one does not have a date! Parsing should fail. */ + tor_asprintf(&guardfraction_bad, + "guardfraction-file-version 1\n" + "written-at not_date\n" + "n-inputs 420 3\n" + "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 100 420\n" + "guard-seen 07B5547026DF3E229806E135CFA8552D56AFBABC 5 420\n"); + + retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); + tt_int_op(retval, OP_EQ, -1); + tor_free(guardfraction_bad); + + /* This one has an incomplete n-inputs line, but parsing should + still continue. */ + tor_asprintf(&guardfraction_bad, + "guardfraction-file-version 1\n" + "written-at %s\n" + "n-inputs biggie\n" + "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 100 420\n" + "guard-seen 07B5547026DF3E229806E135CFA8552D56AFBABC 5 420\n", + yesterday_date_str); + + retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); + tt_int_op(retval, OP_EQ, 2); + tor_free(guardfraction_bad); + + /* This one does not have a fingerprint in the guard line! */ + tor_asprintf(&guardfraction_bad, + "guardfraction-file-version 1\n" + "written-at %s\n" + "n-inputs 420 3\n" + "guard-seen not_a_fingerprint 100 420\n", + yesterday_date_str); + + retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); + tt_int_op(retval, OP_EQ, 0); + tor_free(guardfraction_bad); + + /* This one does not even have an integer guardfraction value. */ + tor_asprintf(&guardfraction_bad, + "guardfraction-file-version 1\n" + "written-at %s\n" + "n-inputs 420 3\n" + "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 NaN 420\n" + "guard-seen 07B5547026DF3E229806E135CFA8552D56AFBABC 5 420\n", + yesterday_date_str); + + retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); + tt_int_op(retval, OP_EQ, 1); + tor_free(guardfraction_bad); + + /* This one is not a percentage (not in [0, 100]) */ + tor_asprintf(&guardfraction_bad, + "guardfraction-file-version 1\n" + "written-at %s\n" + "n-inputs 420 3\n" + "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 666 420\n" + "guard-seen 07B5547026DF3E229806E135CFA8552D56AFBABC 5 420\n", + yesterday_date_str); + + retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); + tt_int_op(retval, OP_EQ, 1); + tor_free(guardfraction_bad); + + /* This one is not a percentage either (not in [0, 100]) */ + tor_asprintf(&guardfraction_bad, + "guardfraction-file-version 1\n" + "written-at %s\n" + "n-inputs 420 3\n" + "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 -3 420\n", + yesterday_date_str); + + retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); + tt_int_op(retval, OP_EQ, 0); + + done: + tor_free(guardfraction_bad); +} + +/** Make sure that our test guardfraction file gets parsed properly, and + * its information are applied properly to our routerstatuses. */ +static void +test_parse_guardfraction_file_good(void *arg) +{ + int retval; + vote_routerstatus_t *vrs_guard = NULL; + vote_routerstatus_t *vrs_dummy = NULL; + char *guardfraction_good = NULL; + const char *yesterday_date_str = get_yesterday_date_str(); + smartlist_t *routerstatuses = smartlist_new(); + + /* Some test values that we need to validate later */ + const char fpr_guard[] = "D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777"; + const char fpr_unlisted[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; + const int guardfraction_value = 42; + + (void) arg; + + { + /* Populate the smartlist with some fake routerstatuses, so that + after parsing the guardfraction file we can check that their + elements got filled properly. */ + + /* This one is a guard */ + vrs_guard = gen_vote_routerstatus_for_tests(fpr_guard, 1); + tt_assert(vrs_guard); + smartlist_add(routerstatuses, vrs_guard); + + /* This one is a guard but it's not in the guardfraction file */ + vrs_dummy = gen_vote_routerstatus_for_tests(fpr_unlisted, 1); + tt_assert(vrs_dummy); + smartlist_add(routerstatuses, vrs_dummy); + } + + tor_asprintf(&guardfraction_good, + "guardfraction-file-version 1\n" + "written-at %s\n" + "n-inputs 420 3\n" + "guard-seen %s %d 420\n", + yesterday_date_str, + fpr_guard, guardfraction_value); + + /* Read the guardfraction file */ + retval = dirserv_read_guardfraction_file_from_str(guardfraction_good, + routerstatuses); + tt_int_op(retval, OP_EQ, 1); + + { /* Test that routerstatus fields got filled properly */ + + /* The guardfraction fields of the guard should be filled. */ + tt_assert(vrs_guard->status.has_guardfraction); + tt_int_op(vrs_guard->status.guardfraction_percentage, + OP_EQ, + guardfraction_value); + + /* The guard that was not in the guardfraction file should not have + been touched either. */ + tt_assert(!vrs_dummy->status.has_guardfraction); + } + + done: + vote_routerstatus_free(vrs_guard); + vote_routerstatus_free(vrs_dummy); + smartlist_free(routerstatuses); + tor_free(guardfraction_good); +} + +/** Make sure that the guardfraction bandwidths get calculated properly. */ +static void +test_get_guardfraction_bandwidth(void *arg) +{ + guardfraction_bandwidth_t gf_bw; + const int orig_bw = 1000; + + (void) arg; + + /* A guard with bandwidth 1000 and GuardFraction 0.25, should have + bandwidth 250 as a guard and bandwidth 750 as a non-guard. */ + guard_get_guardfraction_bandwidth(&gf_bw, + orig_bw, 25); + + tt_int_op(gf_bw.guard_bw, OP_EQ, 250); + tt_int_op(gf_bw.non_guard_bw, OP_EQ, 750); + + /* Also check the 'guard_bw + non_guard_bw == original_bw' + * invariant. */ + tt_int_op(gf_bw.non_guard_bw + gf_bw.guard_bw, OP_EQ, orig_bw); + + done: + ; +} + +/** Parse the GuardFraction element of the consensus, and make sure it + * gets parsed correctly. */ +static void +test_parse_guardfraction_consensus(void *arg) +{ + int retval; + or_options_t *options = get_options_mutable(); + + const char *guardfraction_str_good = "GuardFraction=66"; + routerstatus_t rs_good; + routerstatus_t rs_no_guard; + + const char *guardfraction_str_bad1 = "GuardFraction="; /* no value */ + routerstatus_t rs_bad1; + + const char *guardfraction_str_bad2 = "GuardFraction=166"; /* no percentage */ + routerstatus_t rs_bad2; + + (void) arg; + + /* GuardFraction use is currently disabled by default. So we need to + manually enable it. */ + options->UseGuardFraction = 1; + + { /* Properly formatted GuardFraction. Check that it gets applied + correctly. */ + memset(&rs_good, 0, sizeof(routerstatus_t)); + rs_good.is_possible_guard = 1; + + retval = routerstatus_parse_guardfraction(guardfraction_str_good, + NULL, NULL, + &rs_good); + tt_int_op(retval, OP_EQ, 0); + tt_assert(rs_good.has_guardfraction); + tt_int_op(rs_good.guardfraction_percentage, OP_EQ, 66); + } + + { /* Properly formatted GuardFraction but router is not a + guard. GuardFraction should not get applied. */ + memset(&rs_no_guard, 0, sizeof(routerstatus_t)); + tt_assert(!rs_no_guard.is_possible_guard); + + setup_full_capture_of_logs(LOG_WARN); + retval = routerstatus_parse_guardfraction(guardfraction_str_good, + NULL, NULL, + &rs_no_guard); + tt_int_op(retval, OP_EQ, 0); + tt_assert(!rs_no_guard.has_guardfraction); + expect_single_log_msg_containing("Got GuardFraction for non-guard . " + "This is not supposed to happen."); + teardown_capture_of_logs(); + } + + { /* Bad GuardFraction. Function should fail and not apply. */ + memset(&rs_bad1, 0, sizeof(routerstatus_t)); + rs_bad1.is_possible_guard = 1; + + retval = routerstatus_parse_guardfraction(guardfraction_str_bad1, + NULL, NULL, + &rs_bad1); + tt_int_op(retval, OP_EQ, -1); + tt_assert(!rs_bad1.has_guardfraction); + } + + { /* Bad GuardFraction. Function should fail and not apply. */ + memset(&rs_bad2, 0, sizeof(routerstatus_t)); + rs_bad2.is_possible_guard = 1; + + retval = routerstatus_parse_guardfraction(guardfraction_str_bad2, + NULL, NULL, + &rs_bad2); + tt_int_op(retval, OP_EQ, -1); + tt_assert(!rs_bad2.has_guardfraction); + } + + done: + teardown_capture_of_logs(); +} + +/** Make sure that we use GuardFraction information when we should, + * according to the torrc option and consensus parameter. */ +static void +test_should_apply_guardfraction(void *arg) +{ + networkstatus_t vote_enabled, vote_disabled, vote_missing; + or_options_t *options = get_options_mutable(); + + (void) arg; + + { /* Fill the votes for later */ + /* This one suggests enabled GuardFraction. */ + memset(&vote_enabled, 0, sizeof(vote_enabled)); + vote_enabled.net_params = smartlist_new(); + smartlist_split_string(vote_enabled.net_params, + "UseGuardFraction=1", NULL, 0, 0); + + /* This one suggests disabled GuardFraction. */ + memset(&vote_disabled, 0, sizeof(vote_disabled)); + vote_disabled.net_params = smartlist_new(); + smartlist_split_string(vote_disabled.net_params, + "UseGuardFraction=0", NULL, 0, 0); + + /* This one doesn't have GuardFraction at all. */ + memset(&vote_missing, 0, sizeof(vote_missing)); + vote_missing.net_params = smartlist_new(); + smartlist_split_string(vote_missing.net_params, + "leon=trout", NULL, 0, 0); + } + + /* If torrc option is set to yes, we should always use + * guardfraction.*/ + options->UseGuardFraction = 1; + tt_int_op(should_apply_guardfraction(&vote_disabled), OP_EQ, 1); + + /* If torrc option is set to no, we should never use + * guardfraction.*/ + options->UseGuardFraction = 0; + tt_int_op(should_apply_guardfraction(&vote_enabled), OP_EQ, 0); + + /* Now let's test torrc option set to auto. */ + options->UseGuardFraction = -1; + + /* If torrc option is set to auto, and consensus parameter is set to + * yes, we should use guardfraction. */ + tt_int_op(should_apply_guardfraction(&vote_enabled), OP_EQ, 1); + + /* If torrc option is set to auto, and consensus parameter is set to + * no, we should use guardfraction. */ + tt_int_op(should_apply_guardfraction(&vote_disabled), OP_EQ, 0); + + /* If torrc option is set to auto, and consensus parameter is not + * set, we should fallback to "no". */ + tt_int_op(should_apply_guardfraction(&vote_missing), OP_EQ, 0); + + done: + SMARTLIST_FOREACH(vote_enabled.net_params, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(vote_disabled.net_params, char *, cp, tor_free(cp)); + SMARTLIST_FOREACH(vote_missing.net_params, char *, cp, tor_free(cp)); + smartlist_free(vote_enabled.net_params); + smartlist_free(vote_disabled.net_params); + smartlist_free(vote_missing.net_params); +} + +struct testcase_t guardfraction_tests[] = { + { "parse_guardfraction_file_bad", test_parse_guardfraction_file_bad, + TT_FORK, NULL, NULL }, + { "parse_guardfraction_file_good", test_parse_guardfraction_file_good, + TT_FORK, NULL, NULL }, + { "parse_guardfraction_consensus", test_parse_guardfraction_consensus, + TT_FORK, NULL, NULL }, + { "get_guardfraction_bandwidth", test_get_guardfraction_bandwidth, + TT_FORK, NULL, NULL }, + { "should_apply_guardfraction", test_should_apply_guardfraction, + TT_FORK, NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_handles.c b/src/wraith/src/test/test_handles.c new file mode 100644 index 000000000..eb1e1f1bb --- /dev/null +++ b/src/wraith/src/test/test_handles.c @@ -0,0 +1,97 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "test.h" + +#include "util.h" +#include "handles.h" + +typedef struct demo_t { + HANDLE_ENTRY(demo, demo_t); + int val; +} demo_t; + +HANDLE_DECL(demo, demo_t, static) +#define demo_handle_free(h) \ + FREE_AND_NULL(demo_handle_t, demo_handle_free_, (h)) +HANDLE_IMPL(demo, demo_t, static) + +static demo_t * +demo_new(int val) +{ + demo_t *d = tor_malloc_zero(sizeof(demo_t)); + d->val = val; + return d; +} + +static void +demo_free(demo_t *d) +{ + if (d == NULL) + return; + demo_handles_clear(d); + tor_free(d); +} + +static void +test_handle_basic(void *arg) +{ + (void) arg; + demo_t *d1 = NULL, *d2 = NULL; + demo_handle_t *wr1 = NULL, *wr2 = NULL, *wr3 = NULL, *wr4 = NULL; + + d1 = demo_new(9000); + d2 = demo_new(9009); + + wr1 = demo_handle_new(d1); + wr2 = demo_handle_new(d1); + wr3 = demo_handle_new(d1); + wr4 = demo_handle_new(d2); + + tt_assert(wr1); + tt_assert(wr2); + tt_assert(wr3); + tt_assert(wr4); + + tt_ptr_op(demo_handle_get(wr1), OP_EQ, d1); + tt_ptr_op(demo_handle_get(wr2), OP_EQ, d1); + tt_ptr_op(demo_handle_get(wr3), OP_EQ, d1); + tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2); + + demo_handle_free(wr1); + wr1 = NULL; + tt_ptr_op(demo_handle_get(wr2), OP_EQ, d1); + tt_ptr_op(demo_handle_get(wr3), OP_EQ, d1); + tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2); + + demo_free(d1); + d1 = NULL; + tt_ptr_op(demo_handle_get(wr2), OP_EQ, NULL); + tt_ptr_op(demo_handle_get(wr3), OP_EQ, NULL); + tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2); + + demo_handle_free(wr2); + wr2 = NULL; + tt_ptr_op(demo_handle_get(wr3), OP_EQ, NULL); + tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2); + + demo_handle_free(wr3); + wr3 = NULL; + done: + demo_handle_free(wr1); + demo_handle_free(wr2); + demo_handle_free(wr3); + demo_handle_free(wr4); + demo_free(d1); + demo_free(d2); +} + +#define HANDLE_TEST(name, flags) \ + { #name, test_handle_ ##name, (flags), NULL, NULL } + +struct testcase_t handle_tests[] = { + HANDLE_TEST(basic, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_helpers.c b/src/wraith/src/test/test_helpers.c new file mode 100644 index 000000000..0da9cf64d --- /dev/null +++ b/src/wraith/src/test/test_helpers.c @@ -0,0 +1,279 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_helpers.c + * \brief Some helper functions to avoid code duplication in unit tests. + */ + +#define ROUTERLIST_PRIVATE +#define CONFIG_PRIVATE +#define CONNECTION_PRIVATE +#define MAIN_PRIVATE + +#include "orconfig.h" +#include "or.h" + +#include "buffers.h" +#include "config.h" +#include "confparse.h" +#include "connection.h" +#include "main.h" +#include "nodelist.h" +#include "relay.h" +#include "routerlist.h" + +#include "test.h" +#include "test_helpers.h" +#include "test_connection.h" + +#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS +DISABLE_GCC_WARNING(overlength-strings) +/* We allow huge string constants in the unit tests, but not in the code + * at large. */ +#endif +#include "test_descriptors.inc" +#include "or.h" +#include "circuitlist.h" +#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS +ENABLE_GCC_WARNING(overlength-strings) +#endif + +/* Return a statically allocated string representing yesterday's date + * in ISO format. We use it so that state file items are not found to + * be outdated. */ +const char * +get_yesterday_date_str(void) +{ + static char buf[ISO_TIME_LEN+1]; + + time_t yesterday = time(NULL) - 24*60*60; + format_iso_time(buf, yesterday); + return buf; +} + +/* NOP replacement for router_descriptor_is_older_than() */ +static int +router_descriptor_is_older_than_replacement(const routerinfo_t *router, + int seconds) +{ + (void) router; + (void) seconds; + return 0; +} + +/** Parse a file containing router descriptors and load them to our + routerlist. This function is used to setup an artificial network + so that we can conduct tests on it. */ +void +helper_setup_fake_routerlist(void) +{ + int retval; + routerlist_t *our_routerlist = NULL; + smartlist_t *our_nodelist = NULL; + + /* Read the file that contains our test descriptors. */ + + /* We need to mock this function otherwise the descriptors will not + accepted as they are too old. */ + MOCK(router_descriptor_is_older_than, + router_descriptor_is_older_than_replacement); + + /* Load all the test descriptors to the routerlist. */ + retval = router_load_routers_from_string(TEST_DESCRIPTORS, + NULL, SAVED_IN_JOURNAL, + NULL, 0, NULL); + tt_int_op(retval, OP_EQ, HELPER_NUMBER_OF_DESCRIPTORS); + + /* Sanity checking of routerlist and nodelist. */ + our_routerlist = router_get_routerlist(); + tt_int_op(smartlist_len(our_routerlist->routers), OP_EQ, + HELPER_NUMBER_OF_DESCRIPTORS); + routerlist_assert_ok(our_routerlist); + + our_nodelist = nodelist_get_list(); + tt_int_op(smartlist_len(our_nodelist), OP_EQ, HELPER_NUMBER_OF_DESCRIPTORS); + + /* Mark all routers as non-guards but up and running! */ + SMARTLIST_FOREACH_BEGIN(our_nodelist, node_t *, node) { + node->is_running = 1; + node->is_valid = 1; + node->is_possible_guard = 0; + } SMARTLIST_FOREACH_END(node); + + done: + UNMOCK(router_descriptor_is_older_than); +} + +void +connection_write_to_buf_mock(const char *string, size_t len, + connection_t *conn, int compressed) +{ + (void) compressed; + + tor_assert(string); + tor_assert(conn); + + buf_add(conn->outbuf, string, len); +} + +/* Set up a fake origin circuit with the specified number of cells, + * Return a pointer to the newly-created dummy circuit */ +circuit_t * +dummy_origin_circuit_new(int n_cells) +{ + origin_circuit_t *circ = origin_circuit_new(); + int i; + cell_t cell; + + for (i=0; i < n_cells; ++i) { + crypto_rand((void*)&cell, sizeof(cell)); + cell_queue_append_packed_copy(TO_CIRCUIT(circ), + &TO_CIRCUIT(circ)->n_chan_cells, + 1, &cell, 1, 0); + } + + TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_C_GENERAL; + return TO_CIRCUIT(circ); +} + +/** Mock-replacement. As tor_addr_lookup, but always fails on any + * address containing a !. This is necessary for running the unit tests + * on networks where DNS hijackers think it's helpful to give answers + * for things like 1.2.3.4.5 or "invalidstuff!!" + */ +int +mock_tor_addr_lookup__fail_on_bad_addrs(const char *name, + uint16_t family, tor_addr_t *out) +{ + if (name && strchr(name, '!')) { + return -1; + } + return tor_addr_lookup__real(name, family, out); +} + +/*********** Helper funcs for making new connections/streams *****************/ + +/* Helper for test_conn_get_connection() */ +static int +fake_close_socket(evutil_socket_t sock) +{ + (void)sock; + return 0; +} + +static int mock_connection_connect_sockaddr_called = 0; +static int fake_socket_number = TEST_CONN_FD_INIT; + +/* Helper for test_conn_get_connection() */ +static int +mock_connection_connect_sockaddr(connection_t *conn, + const struct sockaddr *sa, + socklen_t sa_len, + const struct sockaddr *bindaddr, + socklen_t bindaddr_len, + int *socket_error) +{ + (void)sa_len; + (void)bindaddr; + (void)bindaddr_len; + + tor_assert(conn); + tor_assert(sa); + tor_assert(socket_error); + + mock_connection_connect_sockaddr_called++; + + conn->s = fake_socket_number++; + tt_assert(SOCKET_OK(conn->s)); + /* We really should call tor_libevent_initialize() here. Because we don't, + * we are relying on other parts of the code not checking if the_event_base + * (and therefore event->ev_base) is NULL. */ + tt_int_op(connection_add_connecting(conn), OP_EQ, 0); + + done: + /* Fake "connected" status */ + return 1; +} + +/** Create and return a new connection/stream */ +connection_t * +test_conn_get_connection(uint8_t state, uint8_t type, uint8_t purpose) +{ + connection_t *conn = NULL; + tor_addr_t addr; + int socket_err = 0; + int in_progress = 0; + + MOCK(connection_connect_sockaddr, + mock_connection_connect_sockaddr); + MOCK(tor_close_socket, fake_close_socket); + + init_connection_lists(); + + conn = connection_new(type, TEST_CONN_FAMILY); + tt_assert(conn); + + test_conn_lookup_addr_helper(TEST_CONN_ADDRESS, TEST_CONN_FAMILY, &addr); + tt_assert(!tor_addr_is_null(&addr)); + + tor_addr_copy_tight(&conn->addr, &addr); + conn->port = TEST_CONN_PORT; + mock_connection_connect_sockaddr_called = 0; + in_progress = connection_connect(conn, TEST_CONN_ADDRESS_PORT, &addr, + TEST_CONN_PORT, &socket_err); + tt_int_op(mock_connection_connect_sockaddr_called, OP_EQ, 1); + tt_assert(!socket_err); + tt_assert(in_progress == 0 || in_progress == 1); + + /* fake some of the attributes so the connection looks OK */ + conn->state = state; + conn->purpose = purpose; + assert_connection_ok(conn, time(NULL)); + + UNMOCK(connection_connect_sockaddr); + UNMOCK(tor_close_socket); + return conn; + + /* On failure */ + done: + UNMOCK(connection_connect_sockaddr); + UNMOCK(tor_close_socket); + return NULL; +} + +/* Helper function to parse a set of torrc options in a text format and return + * a newly allocated or_options_t object containing the configuration. On + * error, NULL is returned indicating that the conf couldn't be parsed + * properly. */ +or_options_t * +helper_parse_options(const char *conf) +{ + int ret = 0; + char *msg = NULL; + or_options_t *opt = NULL; + config_line_t *line = NULL; + + /* Kind of pointless to call this with a NULL value. */ + tt_assert(conf); + + opt = options_new(); + tt_assert(opt); + ret = config_get_lines(conf, &line, 1); + if (ret != 0) { + goto done; + } + ret = config_assign(&options_format, opt, line, 0, &msg); + if (ret != 0) { + goto done; + } + + done: + config_free_lines(line); + if (ret != 0) { + or_options_free(opt); + opt = NULL; + } + return opt; +} + diff --git a/src/wraith/src/test/test_helpers.h b/src/wraith/src/test/test_helpers.h new file mode 100644 index 000000000..9bc855325 --- /dev/null +++ b/src/wraith/src/test/test_helpers.h @@ -0,0 +1,32 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_TEST_HELPERS_H +#define TOR_TEST_HELPERS_H + +#include "or.h" + +const char *get_yesterday_date_str(void); + +circuit_t * dummy_origin_circuit_new(int num_cells); + +/* Number of descriptors contained in test_descriptors.txt. */ +#define HELPER_NUMBER_OF_DESCRIPTORS 8 + +void helper_setup_fake_routerlist(void); + +#define GET(path) "GET " path " HTTP/1.0\r\n\r\n" +void connection_write_to_buf_mock(const char *string, size_t len, + connection_t *conn, int compressed); + +int mock_tor_addr_lookup__fail_on_bad_addrs(const char *name, + uint16_t family, tor_addr_t *out); + +connection_t *test_conn_get_connection(uint8_t state, + uint8_t type, uint8_t purpose); +or_options_t *helper_parse_options(const char *conf); + +extern const char TEST_DESCRIPTORS[]; + +#endif /* !defined(TOR_TEST_HELPERS_H) */ + diff --git a/src/wraith/src/test/test_hs.c b/src/wraith/src/test/test_hs.c new file mode 100644 index 000000000..55c6218dd --- /dev/null +++ b/src/wraith/src/test/test_hs.c @@ -0,0 +1,1054 @@ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs.c + * \brief Unit tests for hidden service. + **/ + +#define CONTROL_PRIVATE +#define CIRCUITBUILD_PRIVATE +#define RENDCOMMON_PRIVATE +#define RENDSERVICE_PRIVATE +#define HS_SERVICE_PRIVATE + +#include "or.h" +#include "test.h" +#include "control.h" +#include "config.h" +#include "hs_common.h" +#include "rendcommon.h" +#include "rendservice.h" +#include "routerset.h" +#include "circuitbuild.h" +#include "test_helpers.h" + +/* mock ID digest and longname for node that's in nodelist */ +#define HSDIR_EXIST_ID "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \ + "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" +#define STR_HSDIR_EXIST_LONGNAME \ + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=TestDir" +/* mock ID digest and longname for node that's not in nodelist */ +#define HSDIR_NONE_EXIST_ID "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB" \ + "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB" +#define STR_HSDIR_NONE_EXIST_LONGNAME \ + "$BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" + +/* DuckDuckGo descriptor as an example. This one has extra "\r" at the end so + * the control port is happy. */ +static const char *hs_desc_content_control = "\ +rendezvous-service-descriptor g5ojobzupf275beh5ra72uyhb3dkpxwg\r\n\ +version 2\r\n\ +permanent-key\r\n\ +-----BEGIN RSA PUBLIC KEY-----\r\n\ +MIGJAoGBAJ/SzzgrXPxTlFrKVhXh3buCWv2QfcNgncUpDpKouLn3AtPH5Ocys0jE\r\n\ +aZSKdvaiQ62md2gOwj4x61cFNdi05tdQjS+2thHKEm/KsB9BGLSLBNJYY356bupg\r\n\ +I5gQozM65ENelfxYlysBjJ52xSDBd8C4f/p9umdzaaaCmzXG/nhzAgMBAAE=\r\n\ +-----END RSA PUBLIC KEY-----\r\n\ +secret-id-part anmjoxxwiupreyajjt5yasimfmwcnxlf\r\n\ +publication-time 2015-03-11 19:00:00\r\n\ +protocol-versions 2,3\r\n\ +introduction-points\r\n\ +-----BEGIN MESSAGE-----\r\n\ +aW50cm9kdWN0aW9uLXBvaW50IDd1bnd4cmg2dG5kNGh6eWt1Z3EzaGZzdHduc2ll\r\n\ +cmhyCmlwLWFkZHJlc3MgMTg4LjEzOC4xMjEuMTE4Cm9uaW9uLXBvcnQgOTAwMQpv\r\n\ +bmlvbi1rZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dC\r\n\ +QUxGRVVyeVpDbk9ROEhURmV5cDVjMTRObWVqL1BhekFLTTBxRENTNElKUWh0Y3g1\r\n\ +NXpRSFdOVWIKQ2hHZ0JqR1RjV3ZGRnA0N3FkdGF6WUZhVXE2c0lQKzVqeWZ5b0Q4\r\n\ +UmJ1bzBwQmFWclJjMmNhYUptWWM0RDh6Vgpuby9sZnhzOVVaQnZ1cWY4eHIrMDB2\r\n\ +S0JJNmFSMlA2OE1WeDhrMExqcUpUU2RKOE9idm9yQWdNQkFBRT0KLS0tLS1FTkQg\r\n\ +UlNBIFBVQkxJQyBLRVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQ\r\n\ +VUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTnJHb0ozeTlHNXQzN2F2ekI1cTlwN1hG\r\n\ +VUplRUVYMUNOaExnWmJXWGJhVk5OcXpoZFhyL0xTUQppM1Z6dW5OaUs3cndUVnE2\r\n\ +K2QyZ1lRckhMMmIvMXBBY3ZKWjJiNSs0bTRRc0NibFpjRENXTktRbHJnRWN5WXRJ\r\n\ +CkdscXJTbFFEaXA0ZnNrUFMvNDVkWTI0QmJsQ3NGU1k3RzVLVkxJck4zZFpGbmJr\r\n\ +NEZIS1hBZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJv\r\n\ +ZHVjdGlvbi1wb2ludCBiNGM3enlxNXNheGZzN2prNXFibG1wN3I1b3pwdHRvagpp\r\n\ +cC1hZGRyZXNzIDEwOS4xNjkuNDUuMjI2Cm9uaW9uLXBvcnQgOTAwMQpvbmlvbi1r\r\n\ +ZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dCQU8xSXpw\r\n\ +WFFUTUY3RXZUb1NEUXpzVnZiRVFRQUQrcGZ6NzczMVRXZzVaUEJZY1EyUkRaeVp4\r\n\ +OEQKNUVQSU1FeUE1RE83cGd0ak5LaXJvYXJGMC8yempjMkRXTUlSaXZyU29YUWVZ\r\n\ +ZXlMM1pzKzFIajJhMDlCdkYxZAp6MEswblRFdVhoNVR5V3lyMHdsbGI1SFBnTlI0\r\n\ +MS9oYkprZzkwZitPVCtIeGhKL1duUml2QWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBV\r\n\ +QkxJQyBLRVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQVUJMSUMg\r\n\ +S0VZLS0tLS0KTUlHSkFvR0JBSzNWZEJ2ajFtQllLL3JrcHNwcm9Ub0llNUtHVmth\r\n\ +QkxvMW1tK1I2YUVJek1VZFE1SjkwNGtyRwpCd3k5NC8rV0lGNFpGYXh5Z2phejl1\r\n\ +N2pKY1k3ZGJhd1pFeG1hYXFCRlRwL2h2ZG9rcHQ4a1ByRVk4OTJPRHJ1CmJORUox\r\n\ +N1FPSmVMTVZZZk5Kcjl4TWZCQ3JQai8zOGh2RUdrbWVRNmRVWElvbVFNaUJGOVRB\r\n\ +Z01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJvZHVjdGlv\r\n\ +bi1wb2ludCBhdjVtcWl0Y2Q3cjJkandsYmN0c2Jlc2R3eGt0ZWtvegppcC1hZGRy\r\n\ +ZXNzIDE0NC43Ni44LjczCm9uaW9uLXBvcnQgNDQzCm9uaW9uLWtleQotLS0tLUJF\r\n\ +R0lOIFJTQSBQVUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTzVweVZzQmpZQmNmMXBE\r\n\ +dklHUlpmWXUzQ05nNldka0ZLMGlvdTBXTGZtejZRVDN0NWhzd3cyVwpjejlHMXhx\r\n\ +MmN0Nkd6VWkrNnVkTDlITTRVOUdHTi9BbW8wRG9GV1hKWHpBQkFXd2YyMVdsd1lW\r\n\ +eFJQMHRydi9WCkN6UDkzcHc5OG5vSmdGUGRUZ05iMjdKYmVUZENLVFBrTEtscXFt\r\n\ +b3NveUN2RitRa25vUS9BZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0t\r\n\ +LS0tCnNlcnZpY2Uta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpN\r\n\ +SUdKQW9HQkFMVjNKSmtWN3lTNU9jc1lHMHNFYzFQOTVRclFRR3ZzbGJ6Wi9zRGxl\r\n\ +RlpKYXFSOUYvYjRUVERNClNGcFMxcU1GbldkZDgxVmRGMEdYRmN2WVpLamRJdHU2\r\n\ +SndBaTRJeEhxeXZtdTRKdUxrcXNaTEFLaXRLVkx4eGsKeERlMjlDNzRWMmJrOTRJ\r\n\ +MEgybTNKS2tzTHVwc3VxWWRVUmhOVXN0SElKZmgyZmNIalF0bEFnTUJBQUU9Ci0t\r\n\ +LS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0KCg==\r\n\ +-----END MESSAGE-----\r\n\ +signature\r\n\ +-----BEGIN SIGNATURE-----\r\n\ +d4OuCE5OLAOnRB6cQN6WyMEmg/BHem144Vec+eYgeWoKwx3MxXFplUjFxgnMlmwN\r\n\ +PcftsZf2ztN0sbNCtPgDL3d0PqvxY3iHTQAI8EbaGq/IAJUZ8U4y963dD5+Bn6JQ\r\n\ +myE3ctmh0vy5+QxSiRjmQBkuEpCyks7LvWvHYrhnmcg=\r\n\ +-----END SIGNATURE-----"; + +/* DuckDuckGo descriptor as an example. */ +static const char *hs_desc_content = "\ +rendezvous-service-descriptor g5ojobzupf275beh5ra72uyhb3dkpxwg\n\ +version 2\n\ +permanent-key\n\ +-----BEGIN RSA PUBLIC KEY-----\n\ +MIGJAoGBAJ/SzzgrXPxTlFrKVhXh3buCWv2QfcNgncUpDpKouLn3AtPH5Ocys0jE\n\ +aZSKdvaiQ62md2gOwj4x61cFNdi05tdQjS+2thHKEm/KsB9BGLSLBNJYY356bupg\n\ +I5gQozM65ENelfxYlysBjJ52xSDBd8C4f/p9umdzaaaCmzXG/nhzAgMBAAE=\n\ +-----END RSA PUBLIC KEY-----\n\ +secret-id-part anmjoxxwiupreyajjt5yasimfmwcnxlf\n\ +publication-time 2015-03-11 19:00:00\n\ +protocol-versions 2,3\n\ +introduction-points\n\ +-----BEGIN MESSAGE-----\n\ +aW50cm9kdWN0aW9uLXBvaW50IDd1bnd4cmg2dG5kNGh6eWt1Z3EzaGZzdHduc2ll\n\ +cmhyCmlwLWFkZHJlc3MgMTg4LjEzOC4xMjEuMTE4Cm9uaW9uLXBvcnQgOTAwMQpv\n\ +bmlvbi1rZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dC\n\ +QUxGRVVyeVpDbk9ROEhURmV5cDVjMTRObWVqL1BhekFLTTBxRENTNElKUWh0Y3g1\n\ +NXpRSFdOVWIKQ2hHZ0JqR1RjV3ZGRnA0N3FkdGF6WUZhVXE2c0lQKzVqeWZ5b0Q4\n\ +UmJ1bzBwQmFWclJjMmNhYUptWWM0RDh6Vgpuby9sZnhzOVVaQnZ1cWY4eHIrMDB2\n\ +S0JJNmFSMlA2OE1WeDhrMExqcUpUU2RKOE9idm9yQWdNQkFBRT0KLS0tLS1FTkQg\n\ +UlNBIFBVQkxJQyBLRVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQ\n\ +VUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTnJHb0ozeTlHNXQzN2F2ekI1cTlwN1hG\n\ +VUplRUVYMUNOaExnWmJXWGJhVk5OcXpoZFhyL0xTUQppM1Z6dW5OaUs3cndUVnE2\n\ +K2QyZ1lRckhMMmIvMXBBY3ZKWjJiNSs0bTRRc0NibFpjRENXTktRbHJnRWN5WXRJ\n\ +CkdscXJTbFFEaXA0ZnNrUFMvNDVkWTI0QmJsQ3NGU1k3RzVLVkxJck4zZFpGbmJr\n\ +NEZIS1hBZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJv\n\ +ZHVjdGlvbi1wb2ludCBiNGM3enlxNXNheGZzN2prNXFibG1wN3I1b3pwdHRvagpp\n\ +cC1hZGRyZXNzIDEwOS4xNjkuNDUuMjI2Cm9uaW9uLXBvcnQgOTAwMQpvbmlvbi1r\n\ +ZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dCQU8xSXpw\n\ +WFFUTUY3RXZUb1NEUXpzVnZiRVFRQUQrcGZ6NzczMVRXZzVaUEJZY1EyUkRaeVp4\n\ +OEQKNUVQSU1FeUE1RE83cGd0ak5LaXJvYXJGMC8yempjMkRXTUlSaXZyU29YUWVZ\n\ +ZXlMM1pzKzFIajJhMDlCdkYxZAp6MEswblRFdVhoNVR5V3lyMHdsbGI1SFBnTlI0\n\ +MS9oYkprZzkwZitPVCtIeGhKL1duUml2QWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBV\n\ +QkxJQyBLRVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQVUJMSUMg\n\ +S0VZLS0tLS0KTUlHSkFvR0JBSzNWZEJ2ajFtQllLL3JrcHNwcm9Ub0llNUtHVmth\n\ +QkxvMW1tK1I2YUVJek1VZFE1SjkwNGtyRwpCd3k5NC8rV0lGNFpGYXh5Z2phejl1\n\ +N2pKY1k3ZGJhd1pFeG1hYXFCRlRwL2h2ZG9rcHQ4a1ByRVk4OTJPRHJ1CmJORUox\n\ +N1FPSmVMTVZZZk5Kcjl4TWZCQ3JQai8zOGh2RUdrbWVRNmRVWElvbVFNaUJGOVRB\n\ +Z01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJvZHVjdGlv\n\ +bi1wb2ludCBhdjVtcWl0Y2Q3cjJkandsYmN0c2Jlc2R3eGt0ZWtvegppcC1hZGRy\n\ +ZXNzIDE0NC43Ni44LjczCm9uaW9uLXBvcnQgNDQzCm9uaW9uLWtleQotLS0tLUJF\n\ +R0lOIFJTQSBQVUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTzVweVZzQmpZQmNmMXBE\n\ +dklHUlpmWXUzQ05nNldka0ZLMGlvdTBXTGZtejZRVDN0NWhzd3cyVwpjejlHMXhx\n\ +MmN0Nkd6VWkrNnVkTDlITTRVOUdHTi9BbW8wRG9GV1hKWHpBQkFXd2YyMVdsd1lW\n\ +eFJQMHRydi9WCkN6UDkzcHc5OG5vSmdGUGRUZ05iMjdKYmVUZENLVFBrTEtscXFt\n\ +b3NveUN2RitRa25vUS9BZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0t\n\ +LS0tCnNlcnZpY2Uta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpN\n\ +SUdKQW9HQkFMVjNKSmtWN3lTNU9jc1lHMHNFYzFQOTVRclFRR3ZzbGJ6Wi9zRGxl\n\ +RlpKYXFSOUYvYjRUVERNClNGcFMxcU1GbldkZDgxVmRGMEdYRmN2WVpLamRJdHU2\n\ +SndBaTRJeEhxeXZtdTRKdUxrcXNaTEFLaXRLVkx4eGsKeERlMjlDNzRWMmJrOTRJ\n\ +MEgybTNKS2tzTHVwc3VxWWRVUmhOVXN0SElKZmgyZmNIalF0bEFnTUJBQUU9Ci0t\n\ +LS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0KCg==\n\ +-----END MESSAGE-----\n\ +signature\n\ +-----BEGIN SIGNATURE-----\n\ +d4OuCE5OLAOnRB6cQN6WyMEmg/BHem144Vec+eYgeWoKwx3MxXFplUjFxgnMlmwN\n\ +PcftsZf2ztN0sbNCtPgDL3d0PqvxY3iHTQAI8EbaGq/IAJUZ8U4y963dD5+Bn6JQ\n\ +myE3ctmh0vy5+QxSiRjmQBkuEpCyks7LvWvHYrhnmcg=\n\ +-----END SIGNATURE-----"; + +/* Helper global variable for hidden service descriptor event test. + * It's used as a pointer to dynamically created message buffer in + * send_control_event_string_replacement function, which mocks + * send_control_event_string function. + * + * Always free it after use! */ +static char *received_msg = NULL; + +/** Mock function for send_control_event_string + */ +static void +queue_control_event_string_replacement(uint16_t event, char *msg) +{ + (void) event; + tor_free(received_msg); + received_msg = msg; +} + +/** Mock function for node_describe_longname_by_id, it returns either + * STR_HSDIR_EXIST_LONGNAME or STR_HSDIR_NONE_EXIST_LONGNAME + */ +static const char * +node_describe_longname_by_id_replacement(const char *id_digest) +{ + if (!strcmp(id_digest, HSDIR_EXIST_ID)) { + return STR_HSDIR_EXIST_LONGNAME; + } else { + return STR_HSDIR_NONE_EXIST_LONGNAME; + } +} + +/** Test that we can parse a hardcoded v2 HS desc. */ +static void +test_hs_parse_static_v2_desc(void *arg) +{ + int ret; + rend_encoded_v2_service_descriptor_t desc; + + (void) arg; + + /* Test an obviously not parseable string */ + desc.desc_str = tor_strdup("ceci n'est pas un HS descriptor"); + ret = rend_desc_v2_is_parsable(&desc); + tor_free(desc.desc_str); + tt_int_op(ret, OP_EQ, 0); + + /* Test an actual descriptor */ + desc.desc_str = tor_strdup(hs_desc_content); + ret = rend_desc_v2_is_parsable(&desc); + tor_free(desc.desc_str); + tt_int_op(ret, OP_EQ, 1); + + done: ; +} + +/** Make sure each hidden service descriptor async event generation + * + * function generates the message in expected format. + */ +static void +test_hs_desc_event(void *arg) +{ + #define STR_HS_ADDR "ajhb7kljbiru65qo" + #define STR_HS_CONTENT_DESC_ID "g5ojobzupf275beh5ra72uyhb3dkpxwg" + #define STR_DESC_ID_BASE32 "hba3gmcgpfivzfhx5rtfqkfdhv65yrj3" + + int ret; + rend_data_v2_t rend_query; + const char *expected_msg; + char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + + (void) arg; + MOCK(queue_control_event_string, + queue_control_event_string_replacement); + MOCK(node_describe_longname_by_id, + node_describe_longname_by_id_replacement); + + /* setup rend_query struct */ + memset(&rend_query, 0, sizeof(rend_query)); + rend_query.base_.version = 2; + strncpy(rend_query.onion_address, STR_HS_ADDR, + REND_SERVICE_ID_LEN_BASE32+1); + rend_query.auth_type = REND_NO_AUTH; + rend_query.base_.hsdirs_fp = smartlist_new(); + smartlist_add(rend_query.base_.hsdirs_fp, tor_memdup(HSDIR_EXIST_ID, + DIGEST_LEN)); + + /* Compute descriptor ID for replica 0, should be STR_DESC_ID_BASE32. */ + ret = rend_compute_v2_desc_id(rend_query.descriptor_id[0], + rend_query.onion_address, + NULL, 0, 0); + tt_int_op(ret, OP_EQ, 0); + base32_encode(desc_id_base32, sizeof(desc_id_base32), + rend_query.descriptor_id[0], DIGEST_LEN); + /* Make sure rend_compute_v2_desc_id works properly. */ + tt_mem_op(desc_id_base32, OP_EQ, STR_DESC_ID_BASE32, + sizeof(desc_id_base32)); + + /* test request event */ + control_event_hs_descriptor_requested(rend_query.onion_address, + rend_query.auth_type, HSDIR_EXIST_ID, + STR_DESC_ID_BASE32, NULL); + expected_msg = "650 HS_DESC REQUESTED "STR_HS_ADDR" NO_AUTH "\ + STR_HSDIR_EXIST_LONGNAME " " STR_DESC_ID_BASE32 "\r\n"; + tt_assert(received_msg); + tt_str_op(received_msg,OP_EQ, expected_msg); + tor_free(received_msg); + + /* test received event */ + rend_query.auth_type = REND_BASIC_AUTH; + control_event_hsv2_descriptor_received(rend_query.onion_address, + &rend_query.base_, HSDIR_EXIST_ID); + expected_msg = "650 HS_DESC RECEIVED "STR_HS_ADDR" BASIC_AUTH "\ + STR_HSDIR_EXIST_LONGNAME " " STR_DESC_ID_BASE32"\r\n"; + tt_assert(received_msg); + tt_str_op(received_msg,OP_EQ, expected_msg); + tor_free(received_msg); + + /* test failed event */ + rend_query.auth_type = REND_STEALTH_AUTH; + control_event_hsv2_descriptor_failed(&rend_query.base_, + HSDIR_NONE_EXIST_ID, + "QUERY_REJECTED"); + expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" STEALTH_AUTH "\ + STR_HSDIR_NONE_EXIST_LONGNAME" REASON=QUERY_REJECTED\r\n"; + tt_assert(received_msg); + tt_str_op(received_msg,OP_EQ, expected_msg); + tor_free(received_msg); + + /* test invalid auth type */ + rend_query.auth_type = 999; + control_event_hsv2_descriptor_failed(&rend_query.base_, + HSDIR_EXIST_ID, + "QUERY_REJECTED"); + expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" UNKNOWN "\ + STR_HSDIR_EXIST_LONGNAME " " STR_DESC_ID_BASE32\ + " REASON=QUERY_REJECTED\r\n"; + tt_assert(received_msg); + tt_str_op(received_msg,OP_EQ, expected_msg); + tor_free(received_msg); + + /* test no HSDir fingerprint type */ + rend_query.auth_type = REND_NO_AUTH; + control_event_hsv2_descriptor_failed(&rend_query.base_, NULL, + "QUERY_NO_HSDIR"); + expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" NO_AUTH " \ + "UNKNOWN REASON=QUERY_NO_HSDIR\r\n"; + tt_assert(received_msg); + tt_str_op(received_msg,OP_EQ, expected_msg); + tor_free(received_msg); + + /* Test invalid content with no HSDir fingerprint. */ + char *exp_msg; + control_event_hs_descriptor_content(rend_query.onion_address, + STR_HS_CONTENT_DESC_ID, NULL, NULL); + tor_asprintf(&exp_msg, "650+HS_DESC_CONTENT " STR_HS_ADDR " "\ + STR_HS_CONTENT_DESC_ID " UNKNOWN" \ + "\r\n\r\n.\r\n650 OK\r\n"); + tt_assert(received_msg); + tt_str_op(received_msg, OP_EQ, exp_msg); + tor_free(received_msg); + tor_free(exp_msg); + + /* test valid content. */ + control_event_hs_descriptor_content(rend_query.onion_address, + STR_HS_CONTENT_DESC_ID, HSDIR_EXIST_ID, + hs_desc_content_control); + tor_asprintf(&exp_msg, "650+HS_DESC_CONTENT " STR_HS_ADDR " "\ + STR_HS_CONTENT_DESC_ID " " STR_HSDIR_EXIST_LONGNAME\ + "\r\n%s\r\n.\r\n650 OK\r\n", hs_desc_content_control); + + tt_assert(received_msg); + tt_str_op(received_msg, OP_EQ, exp_msg); + tor_free(received_msg); + tor_free(exp_msg); + SMARTLIST_FOREACH(rend_query.base_.hsdirs_fp, char *, d, tor_free(d)); + smartlist_free(rend_query.base_.hsdirs_fp); + + done: + UNMOCK(queue_control_event_string); + UNMOCK(node_describe_longname_by_id); + tor_free(received_msg); +} + +/* Make sure we always pick the right RP, given a well formatted + * Tor2webRendezvousPoints value. */ +static void +test_pick_tor2web_rendezvous_node(void *arg) +{ + or_options_t *options = get_options_mutable(); + const node_t *chosen_rp = NULL; + router_crn_flags_t flags = CRN_NEED_DESC; + int retval, i; + const char *tor2web_rendezvous_str = "test003r"; + + (void) arg; + + /* Setup fake routerlist. */ + helper_setup_fake_routerlist(); + + /* Parse Tor2webRendezvousPoints as a routerset. */ + options->Tor2webRendezvousPoints = routerset_new(); + retval = routerset_parse(options->Tor2webRendezvousPoints, + tor2web_rendezvous_str, + "test_tor2web_rp"); + tt_int_op(retval, OP_GE, 0); + + /* Pick rendezvous point. Make sure the correct one is + picked. Repeat many times to make sure it works properly. */ + for (i = 0; i < 50 ; i++) { + chosen_rp = pick_tor2web_rendezvous_node(flags, options); + tt_assert(chosen_rp); + tt_str_op(chosen_rp->ri->nickname, OP_EQ, tor2web_rendezvous_str); + } + + done: + routerset_free(options->Tor2webRendezvousPoints); +} + +/* Make sure we never pick an RP if Tor2webRendezvousPoints doesn't + * correspond to an actual node. */ +static void +test_pick_bad_tor2web_rendezvous_node(void *arg) +{ + or_options_t *options = get_options_mutable(); + const node_t *chosen_rp = NULL; + router_crn_flags_t flags = CRN_NEED_DESC; + int retval, i; + const char *tor2web_rendezvous_str = "dummy"; + + (void) arg; + + /* Setup fake routerlist. */ + helper_setup_fake_routerlist(); + + /* Parse Tor2webRendezvousPoints as a routerset. */ + options->Tor2webRendezvousPoints = routerset_new(); + retval = routerset_parse(options->Tor2webRendezvousPoints, + tor2web_rendezvous_str, + "test_tor2web_rp"); + tt_int_op(retval, OP_GE, 0); + + /* Pick rendezvous point. Since Tor2webRendezvousPoints was set to a + dummy value, we shouldn't find any eligible RPs. */ + for (i = 0; i < 50 ; i++) { + chosen_rp = pick_tor2web_rendezvous_node(flags, options); + tt_ptr_op(chosen_rp, OP_EQ, NULL); + } + + done: + routerset_free(options->Tor2webRendezvousPoints); +} + +/* Make sure rend_data_t is valid at creation, destruction and when + * duplicated. */ +static void +test_hs_rend_data(void *arg) +{ + int rep; + rend_data_t *client = NULL, *client_dup = NULL; + /* Binary format of a descriptor ID. */ + char desc_id[DIGEST_LEN]; + char client_cookie[REND_DESC_COOKIE_LEN]; + time_t now = time(NULL); + rend_data_t *service_dup = NULL; + rend_data_t *service = NULL; + + (void)arg; + + base32_decode(desc_id, sizeof(desc_id), STR_DESC_ID_BASE32, + REND_DESC_ID_V2_LEN_BASE32); + memset(client_cookie, 'e', sizeof(client_cookie)); + + client = rend_data_client_create(STR_HS_ADDR, desc_id, client_cookie, + REND_NO_AUTH); + tt_assert(client); + rend_data_v2_t *client_v2 = TO_REND_DATA_V2(client); + tt_int_op(client_v2->auth_type, OP_EQ, REND_NO_AUTH); + tt_str_op(client_v2->onion_address, OP_EQ, STR_HS_ADDR); + tt_mem_op(client_v2->desc_id_fetch, OP_EQ, desc_id, sizeof(desc_id)); + tt_mem_op(client_v2->descriptor_cookie, OP_EQ, client_cookie, + sizeof(client_cookie)); + tt_assert(client->hsdirs_fp); + tt_int_op(smartlist_len(client->hsdirs_fp), OP_EQ, 0); + for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) { + int ret = rend_compute_v2_desc_id(desc_id, client_v2->onion_address, + client_v2->descriptor_cookie, now, rep); + /* That shouldn't never fail. */ + tt_int_op(ret, OP_EQ, 0); + tt_mem_op(client_v2->descriptor_id[rep], OP_EQ, desc_id, + sizeof(desc_id)); + } + /* The rest should be zeroed because this is a client request. */ + tt_int_op(tor_digest_is_zero(client_v2->rend_pk_digest), OP_EQ, 1); + tt_int_op(tor_digest_is_zero(client->rend_cookie), OP_EQ, 1); + + /* Test dup(). */ + client_dup = rend_data_dup(client); + tt_assert(client_dup); + rend_data_v2_t *client_dup_v2 = TO_REND_DATA_V2(client_dup); + tt_int_op(client_dup_v2->auth_type, OP_EQ, client_v2->auth_type); + tt_str_op(client_dup_v2->onion_address, OP_EQ, client_v2->onion_address); + tt_mem_op(client_dup_v2->desc_id_fetch, OP_EQ, client_v2->desc_id_fetch, + sizeof(client_dup_v2->desc_id_fetch)); + tt_mem_op(client_dup_v2->descriptor_cookie, OP_EQ, + client_v2->descriptor_cookie, + sizeof(client_dup_v2->descriptor_cookie)); + + tt_assert(client_dup->hsdirs_fp); + tt_int_op(smartlist_len(client_dup->hsdirs_fp), OP_EQ, 0); + for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) { + tt_mem_op(client_dup_v2->descriptor_id[rep], OP_EQ, + client_v2->descriptor_id[rep], DIGEST_LEN); + } + /* The rest should be zeroed because this is a client request. */ + tt_int_op(tor_digest_is_zero(client_dup_v2->rend_pk_digest), OP_EQ, 1); + tt_int_op(tor_digest_is_zero(client_dup->rend_cookie), OP_EQ, 1); + rend_data_free(client); + client = NULL; + rend_data_free(client_dup); + client_dup = NULL; + + /* Reset state. */ + base32_decode(desc_id, sizeof(desc_id), STR_DESC_ID_BASE32, + REND_DESC_ID_V2_LEN_BASE32); + memset(client_cookie, 'e', sizeof(client_cookie)); + + /* Try with different parameters here for which some content should be + * zeroed out. */ + client = rend_data_client_create(NULL, desc_id, NULL, REND_BASIC_AUTH); + tt_assert(client); + client_v2 = TO_REND_DATA_V2(client); + tt_int_op(client_v2->auth_type, OP_EQ, REND_BASIC_AUTH); + tt_int_op(strlen(client_v2->onion_address), OP_EQ, 0); + tt_mem_op(client_v2->desc_id_fetch, OP_EQ, desc_id, sizeof(desc_id)); + tt_int_op(tor_mem_is_zero(client_v2->descriptor_cookie, + sizeof(client_v2->descriptor_cookie)), OP_EQ, 1); + tt_assert(client->hsdirs_fp); + tt_int_op(smartlist_len(client->hsdirs_fp), OP_EQ, 0); + for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) { + tt_int_op(tor_digest_is_zero(client_v2->descriptor_id[rep]), OP_EQ, 1); + } + /* The rest should be zeroed because this is a client request. */ + tt_int_op(tor_digest_is_zero(client_v2->rend_pk_digest), OP_EQ, 1); + tt_int_op(tor_digest_is_zero(client->rend_cookie), OP_EQ, 1); + rend_data_free(client); + client = NULL; + + /* Let's test the service object now. */ + char rend_pk_digest[DIGEST_LEN]; + uint8_t rend_cookie[DIGEST_LEN]; + memset(rend_pk_digest, 'f', sizeof(rend_pk_digest)); + memset(rend_cookie, 'g', sizeof(rend_cookie)); + + service = rend_data_service_create(STR_HS_ADDR, rend_pk_digest, + rend_cookie, REND_NO_AUTH); + tt_assert(service); + rend_data_v2_t *service_v2 = TO_REND_DATA_V2(service); + tt_int_op(service_v2->auth_type, OP_EQ, REND_NO_AUTH); + tt_str_op(service_v2->onion_address, OP_EQ, STR_HS_ADDR); + tt_mem_op(service_v2->rend_pk_digest, OP_EQ, rend_pk_digest, + sizeof(rend_pk_digest)); + tt_mem_op(service->rend_cookie, OP_EQ, rend_cookie, sizeof(rend_cookie)); + tt_assert(service->hsdirs_fp); + tt_int_op(smartlist_len(service->hsdirs_fp), OP_EQ, 0); + for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) { + tt_int_op(tor_digest_is_zero(service_v2->descriptor_id[rep]), OP_EQ, 1); + } + /* The rest should be zeroed because this is a service request. */ + tt_int_op(tor_digest_is_zero(service_v2->descriptor_cookie), OP_EQ, 1); + tt_int_op(tor_digest_is_zero(service_v2->desc_id_fetch), OP_EQ, 1); + + /* Test dup(). */ + service_dup = rend_data_dup(service); + rend_data_v2_t *service_dup_v2 = TO_REND_DATA_V2(service_dup); + tt_assert(service_dup); + tt_int_op(service_dup_v2->auth_type, OP_EQ, service_v2->auth_type); + tt_str_op(service_dup_v2->onion_address, OP_EQ, service_v2->onion_address); + tt_mem_op(service_dup_v2->rend_pk_digest, OP_EQ, service_v2->rend_pk_digest, + sizeof(service_dup_v2->rend_pk_digest)); + tt_mem_op(service_dup->rend_cookie, OP_EQ, service->rend_cookie, + sizeof(service_dup->rend_cookie)); + tt_assert(service_dup->hsdirs_fp); + tt_int_op(smartlist_len(service_dup->hsdirs_fp), OP_EQ, 0); + for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) { + tt_assert(tor_digest_is_zero(service_dup_v2->descriptor_id[rep])); + } + /* The rest should be zeroed because this is a service request. */ + tt_int_op(tor_digest_is_zero(service_dup_v2->descriptor_cookie), OP_EQ, 1); + tt_int_op(tor_digest_is_zero(service_dup_v2->desc_id_fetch), OP_EQ, 1); + + done: + rend_data_free(service); + rend_data_free(service_dup); + rend_data_free(client); + rend_data_free(client_dup); +} + +/* Test encoding and decoding service authorization cookies */ +static void +test_hs_auth_cookies(void *arg) +{ +#define TEST_COOKIE_RAW ((const uint8_t *) "abcdefghijklmnop") +#define TEST_COOKIE_ENCODED "YWJjZGVmZ2hpamtsbW5vcA" +#define TEST_COOKIE_ENCODED_STEALTH "YWJjZGVmZ2hpamtsbW5vcB" +#define TEST_COOKIE_ENCODED_INVALID "YWJjZGVmZ2hpamtsbW5vcD" + + char *encoded_cookie; + uint8_t raw_cookie[REND_DESC_COOKIE_LEN]; + rend_auth_type_t auth_type; + char *err_msg; + int re; + + (void)arg; + + /* Test that encoding gives the expected result */ + encoded_cookie = rend_auth_encode_cookie(TEST_COOKIE_RAW, REND_BASIC_AUTH); + tt_str_op(encoded_cookie, OP_EQ, TEST_COOKIE_ENCODED); + tor_free(encoded_cookie); + + encoded_cookie = rend_auth_encode_cookie(TEST_COOKIE_RAW, REND_STEALTH_AUTH); + tt_str_op(encoded_cookie, OP_EQ, TEST_COOKIE_ENCODED_STEALTH); + tor_free(encoded_cookie); + + /* Decoding should give the original value */ + re = rend_auth_decode_cookie(TEST_COOKIE_ENCODED, raw_cookie, &auth_type, + &err_msg); + tt_assert(!re); + tt_ptr_op(err_msg, OP_EQ, NULL); + tt_mem_op(raw_cookie, OP_EQ, TEST_COOKIE_RAW, REND_DESC_COOKIE_LEN); + tt_int_op(auth_type, OP_EQ, REND_BASIC_AUTH); + memset(raw_cookie, 0, sizeof(raw_cookie)); + + re = rend_auth_decode_cookie(TEST_COOKIE_ENCODED_STEALTH, raw_cookie, + &auth_type, &err_msg); + tt_assert(!re); + tt_ptr_op(err_msg, OP_EQ, NULL); + tt_mem_op(raw_cookie, OP_EQ, TEST_COOKIE_RAW, REND_DESC_COOKIE_LEN); + tt_int_op(auth_type, OP_EQ, REND_STEALTH_AUTH); + memset(raw_cookie, 0, sizeof(raw_cookie)); + + /* Decoding with padding characters should also work */ + re = rend_auth_decode_cookie(TEST_COOKIE_ENCODED "==", raw_cookie, NULL, + &err_msg); + tt_assert(!re); + tt_ptr_op(err_msg, OP_EQ, NULL); + tt_mem_op(raw_cookie, OP_EQ, TEST_COOKIE_RAW, REND_DESC_COOKIE_LEN); + + /* Decoding with an unknown type should fail */ + re = rend_auth_decode_cookie(TEST_COOKIE_ENCODED_INVALID, raw_cookie, + &auth_type, &err_msg); + tt_int_op(re, OP_LT, 0); + tt_assert(err_msg); + tor_free(err_msg); + + done: + return; +} + +static int mock_get_options_calls = 0; +static or_options_t *mock_options = NULL; + +static void +reset_options(or_options_t *options, int *get_options_calls) +{ + memset(options, 0, sizeof(or_options_t)); + options->TestingTorNetwork = 1; + + *get_options_calls = 0; +} + +static const or_options_t * +mock_get_options(void) +{ + ++mock_get_options_calls; + tor_assert(mock_options); + return mock_options; +} + +/* arg can't be 0 (the test fails) or 2 (the test is skipped) */ +#define CREATE_HS_DIR_NONE ((intptr_t)0x04) +#define CREATE_HS_DIR1 ((intptr_t)0x08) +#define CREATE_HS_DIR2 ((intptr_t)0x10) + +/* Test that single onion poisoning works. */ +static void +test_single_onion_poisoning(void *arg) +{ + or_options_t opt; + mock_options = &opt; + reset_options(mock_options, &mock_get_options_calls); + MOCK(get_options, mock_get_options); + + int ret = -1; + intptr_t create_dir_mask = (intptr_t)arg; + /* Get directories with a random suffix so we can repeat the tests */ + mock_options->DataDirectory = tor_strdup(get_fname_rnd("test_data_dir")); + rend_service_t *service_1 = tor_malloc_zero(sizeof(rend_service_t)); + char *dir1 = tor_strdup(get_fname_rnd("test_hs_dir1")); + rend_service_t *service_2 = tor_malloc_zero(sizeof(rend_service_t)); + char *dir2 = tor_strdup(get_fname_rnd("test_hs_dir2")); + smartlist_t *services = smartlist_new(); + char *poison_path = NULL; + char *err_msg = NULL; + + mock_options->HiddenServiceSingleHopMode = 1; + mock_options->HiddenServiceNonAnonymousMode = 1; + + /* Create the data directory, and, if the correct bit in arg is set, + * create a directory for that service. + * The data directory is required for the lockfile, which is used when + * loading keys. */ + ret = check_private_dir(mock_options->DataDirectory, CPD_CREATE, NULL); + tt_int_op(ret, OP_EQ, 0); + if (create_dir_mask & CREATE_HS_DIR1) { + ret = check_private_dir(dir1, CPD_CREATE, NULL); + tt_int_op(ret, OP_EQ, 0); + } + if (create_dir_mask & CREATE_HS_DIR2) { + ret = check_private_dir(dir2, CPD_CREATE, NULL); + tt_int_op(ret, OP_EQ, 0); + } + + service_1->directory = dir1; + service_2->directory = dir2; + /* The services own the directory pointers now */ + dir1 = dir2 = NULL; + /* Add port to service 1 */ + service_1->ports = smartlist_new(); + service_2->ports = smartlist_new(); + rend_service_port_config_t *port1 = rend_service_parse_port_config("80", " ", + &err_msg); + tt_assert(port1); + tt_ptr_op(err_msg, OP_EQ, NULL); + smartlist_add(service_1->ports, port1); + + rend_service_port_config_t *port2 = rend_service_parse_port_config("90", " ", + &err_msg); + /* Add port to service 2 */ + tt_assert(port2); + tt_ptr_op(err_msg, OP_EQ, NULL); + smartlist_add(service_2->ports, port2); + + /* No services, a service to verify, no problem! */ + mock_options->HiddenServiceSingleHopMode = 0; + mock_options->HiddenServiceNonAnonymousMode = 0; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Either way, no problem. */ + mock_options->HiddenServiceSingleHopMode = 1; + mock_options->HiddenServiceNonAnonymousMode = 1; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Add the first service */ + ret = hs_check_service_private_dir(mock_options->User, service_1->directory, + service_1->dir_group_readable, 1); + tt_int_op(ret, OP_EQ, 0); + smartlist_add(services, service_1); + /* But don't add the second service yet. */ + + /* Service directories, but no previous keys, no problem! */ + mock_options->HiddenServiceSingleHopMode = 0; + mock_options->HiddenServiceNonAnonymousMode = 0; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Either way, no problem. */ + mock_options->HiddenServiceSingleHopMode = 1; + mock_options->HiddenServiceNonAnonymousMode = 1; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Poison! Poison! Poison! + * This can only be done in HiddenServiceSingleHopMode. */ + mock_options->HiddenServiceSingleHopMode = 1; + mock_options->HiddenServiceNonAnonymousMode = 1; + ret = rend_service_poison_new_single_onion_dir(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + /* Poisoning twice is a no-op. */ + ret = rend_service_poison_new_single_onion_dir(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Poisoned service directories, but no previous keys, no problem! */ + mock_options->HiddenServiceSingleHopMode = 0; + mock_options->HiddenServiceNonAnonymousMode = 0; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Either way, no problem. */ + mock_options->HiddenServiceSingleHopMode = 1; + mock_options->HiddenServiceNonAnonymousMode = 1; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Now add some keys, and we'll have a problem. */ + ret = rend_service_load_all_keys(services); + tt_int_op(ret, OP_EQ, 0); + + /* Poisoned service directories with previous keys are not allowed. */ + mock_options->HiddenServiceSingleHopMode = 0; + mock_options->HiddenServiceNonAnonymousMode = 0; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_LT, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* But they are allowed if we're in non-anonymous mode. */ + mock_options->HiddenServiceSingleHopMode = 1; + mock_options->HiddenServiceNonAnonymousMode = 1; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Re-poisoning directories with existing keys is a no-op, because + * directories with existing keys are ignored. */ + mock_options->HiddenServiceSingleHopMode = 1; + mock_options->HiddenServiceNonAnonymousMode = 1; + ret = rend_service_poison_new_single_onion_dir(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + /* And it keeps the poison. */ + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Now add the second service: it has no key and no poison file */ + ret = hs_check_service_private_dir(mock_options->User, service_2->directory, + service_2->dir_group_readable, 1); + tt_int_op(ret, OP_EQ, 0); + smartlist_add(services, service_2); + + /* A new service, and an existing poisoned service. Not ok. */ + mock_options->HiddenServiceSingleHopMode = 0; + mock_options->HiddenServiceNonAnonymousMode = 0; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_LT, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* But ok to add in non-anonymous mode. */ + mock_options->HiddenServiceSingleHopMode = 1; + mock_options->HiddenServiceNonAnonymousMode = 1; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Now remove the poisoning from the first service, and we have the opposite + * problem. */ + poison_path = rend_service_sos_poison_path(service_1); + tt_assert(poison_path); + ret = unlink(poison_path); + tt_int_op(ret, OP_EQ, 0); + + /* Unpoisoned service directories with previous keys are ok, as are empty + * directories. */ + mock_options->HiddenServiceSingleHopMode = 0; + mock_options->HiddenServiceNonAnonymousMode = 0; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* But the existing unpoisoned key is not ok in non-anonymous mode, even if + * there is an empty service. */ + mock_options->HiddenServiceSingleHopMode = 1; + mock_options->HiddenServiceNonAnonymousMode = 1; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_LT, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Poisoning directories with existing keys is a no-op, because directories + * with existing keys are ignored. But the new directory should poison. */ + mock_options->HiddenServiceSingleHopMode = 1; + mock_options->HiddenServiceNonAnonymousMode = 1; + ret = rend_service_poison_new_single_onion_dir(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_poison_new_single_onion_dir(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + /* And the old directory remains unpoisoned. */ + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_LT, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* And the new directory should be ignored, because it has no key. */ + mock_options->HiddenServiceSingleHopMode = 0; + mock_options->HiddenServiceNonAnonymousMode = 0; + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + /* Re-poisoning directories without existing keys is a no-op. */ + mock_options->HiddenServiceSingleHopMode = 1; + mock_options->HiddenServiceNonAnonymousMode = 1; + ret = rend_service_poison_new_single_onion_dir(service_1, mock_options); + tt_int_op(ret, OP_EQ, 0); + ret = rend_service_poison_new_single_onion_dir(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + /* And the old directory remains unpoisoned. */ + ret = rend_service_verify_single_onion_poison(service_1, mock_options); + tt_int_op(ret, OP_LT, 0); + ret = rend_service_verify_single_onion_poison(service_2, mock_options); + tt_int_op(ret, OP_EQ, 0); + + done: + /* The test harness deletes the directories at exit */ + tor_free(poison_path); + tor_free(dir1); + tor_free(dir2); + smartlist_free(services); + rend_service_free(service_1); + rend_service_free(service_2); + UNMOCK(get_options); + tor_free(mock_options->DataDirectory); + tor_free(err_msg); +} + +static rend_service_t * +helper_create_rend_service(const char *path) +{ + rend_service_t *s = tor_malloc_zero(sizeof(rend_service_t)); + s->ports = smartlist_new(); + s->intro_nodes = smartlist_new(); + s->expiring_nodes = smartlist_new(); + if (path) { + s->directory = tor_strdup(path); + } + return s; +} + +static void +test_prune_services_on_reload(void *arg) +{ + smartlist_t *new = smartlist_new(), *old = smartlist_new(); + /* Non ephemeral service. */ + rend_service_t *s1 = helper_create_rend_service("SomePath"); + /* Create a non ephemeral service with the _same_ path as so we can test the + * transfer of introduction point between the same services on reload. */ + rend_service_t *s2 = helper_create_rend_service(s1->directory); + /* Ephemeral service (directory is NULL). */ + rend_service_t *e1 = helper_create_rend_service(NULL); + rend_service_t *e2 = helper_create_rend_service(NULL); + + (void) arg; + + { + /* Add both services to the old list. */ + smartlist_add(old, s1); + smartlist_add(old, e1); + /* Only put the non ephemeral in the new list. */ + smartlist_add(new, s1); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); + /* We expect that the ephemeral one is in the new list but removed from + * the old one. */ + tt_int_op(smartlist_len(old), OP_EQ, 1); + tt_assert(smartlist_get(old, 0) == s1); + tt_int_op(smartlist_len(new), OP_EQ, 2); + tt_assert(smartlist_get(new, 0) == s1); + tt_assert(smartlist_get(new, 1) == e1); + /* Cleanup for next test. */ + smartlist_clear(new); + smartlist_clear(old); + } + + { + /* This test will make sure that only the ephemeral service is kept if the + * new list is empty. The old list should contain only the non ephemeral + * one. */ + smartlist_add(old, s1); + smartlist_add(old, e1); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); + tt_int_op(smartlist_len(old), OP_EQ, 1); + tt_assert(smartlist_get(old, 0) == s1); + tt_int_op(smartlist_len(new), OP_EQ, 1); + tt_assert(smartlist_get(new, 0) == e1); + /* Cleanup for next test. */ + smartlist_clear(new); + smartlist_clear(old); + } + + { + /* This test makes sure that the new list stays the same even from the old + * list being completely different. */ + smartlist_add(new, s1); + smartlist_add(new, e1); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); + tt_int_op(smartlist_len(old), OP_EQ, 0); + tt_int_op(smartlist_len(new), OP_EQ, 2); + tt_assert(smartlist_get(new, 0) == s1); + tt_assert(smartlist_get(new, 1) == e1); + /* Cleanup for next test. */ + smartlist_clear(new); + } + + { + rend_intro_point_t ip1; + /* This IP should be found in the s2 service after pruning. */ + smartlist_add(s1->intro_nodes, &ip1); + /* Setup our list. */ + smartlist_add(old, s1); + smartlist_add(new, s2); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); + tt_int_op(smartlist_len(old), OP_EQ, 1); + /* Intro nodes have been moved to the s2 in theory so it must be empty. */ + tt_int_op(smartlist_len(s1->intro_nodes), OP_EQ, 0); + tt_int_op(smartlist_len(new), OP_EQ, 1); + rend_service_t *elem = smartlist_get(new, 0); + tt_assert(elem); + tt_assert(elem == s2); + tt_int_op(smartlist_len(elem->intro_nodes), OP_EQ, 1); + tt_assert(smartlist_get(elem->intro_nodes, 0) == &ip1); + smartlist_clear(s1->intro_nodes); + smartlist_clear(s2->intro_nodes); + /* Cleanup for next test. */ + smartlist_clear(new); + smartlist_clear(old); + } + + { + /* Test two ephemeral services. */ + smartlist_add(old, e1); + smartlist_add(old, e2); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); + /* Check if they've all been transfered. */ + tt_int_op(smartlist_len(old), OP_EQ, 0); + tt_int_op(smartlist_len(new), OP_EQ, 2); + } + + done: + rend_service_free(s1); + rend_service_free(s2); + rend_service_free(e1); + rend_service_free(e2); + smartlist_free(new); + smartlist_free(old); +} + +struct testcase_t hs_tests[] = { + { "hs_rend_data", test_hs_rend_data, TT_FORK, + NULL, NULL }, + { "hs_parse_static_v2_desc", test_hs_parse_static_v2_desc, TT_FORK, + NULL, NULL }, + { "hs_desc_event", test_hs_desc_event, TT_FORK, + NULL, NULL }, + { "pick_tor2web_rendezvous_node", test_pick_tor2web_rendezvous_node, TT_FORK, + NULL, NULL }, + { "pick_bad_tor2web_rendezvous_node", + test_pick_bad_tor2web_rendezvous_node, TT_FORK, + NULL, NULL }, + { "hs_auth_cookies", test_hs_auth_cookies, TT_FORK, + NULL, NULL }, + { "single_onion_poisoning_create_dir_none", test_single_onion_poisoning, + TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR_NONE) }, + { "single_onion_poisoning_create_dir1", test_single_onion_poisoning, + TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR1) }, + { "single_onion_poisoning_create_dir2", test_single_onion_poisoning, + TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR2) }, + { "single_onion_poisoning_create_dir_both", test_single_onion_poisoning, + TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR1 | CREATE_HS_DIR2) }, + { "prune_services_on_reload", test_prune_services_on_reload, TT_FORK, + NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_hs_cache.c b/src/wraith/src/test/test_hs_cache.c new file mode 100644 index 000000000..458ce1a92 --- /dev/null +++ b/src/wraith/src/test/test_hs_cache.c @@ -0,0 +1,561 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs_cache.c + * \brief Test hidden service caches. + */ + +#define CONNECTION_PRIVATE +#define DIRECTORY_PRIVATE +#define HS_CACHE_PRIVATE + +#include "ed25519_cert.h" +#include "hs_cache.h" +#include "rendcache.h" +#include "directory.h" +#include "networkstatus.h" +#include "connection.h" +#include "proto_http.h" + +#include "hs_test_helpers.h" +#include "test_helpers.h" +#include "test.h" + +/* Static variable used to encoded the HSDir query. */ +static char query_b64[256]; + +/* Build an HSDir query using a ed25519 public key. */ +static const char * +helper_get_hsdir_query(const hs_descriptor_t *desc) +{ + ed25519_public_to_base64(query_b64, &desc->plaintext_data.blinded_pubkey); + return query_b64; +} + +static void +init_test(void) +{ + /* Always needed. Initialize the subsystem. */ + hs_cache_init(); + /* We need the v2 cache since our OOM and cache cleanup does poke at it. */ + rend_cache_init(); +} + +static void +test_directory(void *arg) +{ + int ret; + size_t oom_size; + char *desc1_str = NULL; + const char *desc_out; + ed25519_keypair_t signing_kp1; + hs_descriptor_t *desc1 = NULL; + + (void) arg; + + init_test(); + /* Generate a valid descriptor with normal values. */ + ret = ed25519_keypair_generate(&signing_kp1, 0); + tt_int_op(ret, OP_EQ, 0); + desc1 = hs_helper_build_hs_desc_with_ip(&signing_kp1); + tt_assert(desc1); + ret = hs_desc_encode_descriptor(desc1, &signing_kp1, &desc1_str); + tt_int_op(ret, OP_EQ, 0); + + /* Very first basic test, should be able to be stored, survive a + * clean, found with a lookup and then cleaned by our OOM. */ + { + ret = hs_cache_store_as_dir(desc1_str); + tt_int_op(ret, OP_EQ, 0); + /* Re-add, it should fail since we already have it. */ + ret = hs_cache_store_as_dir(desc1_str); + tt_int_op(ret, OP_EQ, -1); + /* Try to clean now which should be fine, there is at worst few seconds + * between the store and this call. */ + hs_cache_clean_as_dir(time(NULL)); + /* We should find it in our cache. */ + ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), &desc_out); + tt_int_op(ret, OP_EQ, 1); + tt_str_op(desc_out, OP_EQ, desc1_str); + /* Tell our OOM to run and to at least remove a byte which will result in + * removing the descriptor from our cache. */ + oom_size = hs_cache_handle_oom(time(NULL), 1); + tt_int_op(oom_size, OP_GE, 1); + ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL); + tt_int_op(ret, OP_EQ, 0); + } + + /* Store two descriptors and remove the expiring one only. */ + { + ed25519_keypair_t signing_kp_zero; + ret = ed25519_keypair_generate(&signing_kp_zero, 0); + tt_int_op(ret, OP_EQ, 0); + hs_descriptor_t *desc_zero_lifetime; + desc_zero_lifetime = hs_helper_build_hs_desc_with_ip(&signing_kp_zero); + tt_assert(desc_zero_lifetime); + desc_zero_lifetime->plaintext_data.revision_counter = 1; + desc_zero_lifetime->plaintext_data.lifetime_sec = 0; + char *desc_zero_lifetime_str; + ret = hs_desc_encode_descriptor(desc_zero_lifetime, &signing_kp_zero, + &desc_zero_lifetime_str); + tt_int_op(ret, OP_EQ, 0); + + ret = hs_cache_store_as_dir(desc1_str); + tt_int_op(ret, OP_EQ, 0); + ret = hs_cache_store_as_dir(desc_zero_lifetime_str); + tt_int_op(ret, OP_EQ, 0); + /* This one should clear out our zero lifetime desc. */ + hs_cache_clean_as_dir(time(NULL)); + /* We should find desc1 in our cache. */ + ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), &desc_out); + tt_int_op(ret, OP_EQ, 1); + tt_str_op(desc_out, OP_EQ, desc1_str); + /* We should NOT find our zero lifetime desc in our cache. */ + ret = hs_cache_lookup_as_dir(3, + helper_get_hsdir_query(desc_zero_lifetime), + NULL); + tt_int_op(ret, OP_EQ, 0); + /* Cleanup our entire cache. */ + oom_size = hs_cache_handle_oom(time(NULL), 1); + tt_int_op(oom_size, OP_GE, 1); + hs_descriptor_free(desc_zero_lifetime); + tor_free(desc_zero_lifetime_str); + } + + /* Throw junk at it. */ + { + ret = hs_cache_store_as_dir("blah"); + tt_int_op(ret, OP_EQ, -1); + /* Poor attempt at tricking the decoding. */ + ret = hs_cache_store_as_dir("hs-descriptor 3\nJUNK"); + tt_int_op(ret, OP_EQ, -1); + /* Undecodable base64 query. */ + ret = hs_cache_lookup_as_dir(3, "blah", NULL); + tt_int_op(ret, OP_EQ, -1); + /* Decodable base64 query but wrong ed25519 size. */ + ret = hs_cache_lookup_as_dir(3, "dW5pY29ybg==", NULL); + tt_int_op(ret, OP_EQ, -1); + } + + /* Test descriptor replacement with revision counter. */ + { + char *new_desc_str; + + /* Add a descriptor. */ + ret = hs_cache_store_as_dir(desc1_str); + tt_int_op(ret, OP_EQ, 0); + ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), &desc_out); + tt_int_op(ret, OP_EQ, 1); + /* Bump revision counter. */ + desc1->plaintext_data.revision_counter++; + ret = hs_desc_encode_descriptor(desc1, &signing_kp1, &new_desc_str); + tt_int_op(ret, OP_EQ, 0); + ret = hs_cache_store_as_dir(new_desc_str); + tt_int_op(ret, OP_EQ, 0); + /* Look it up, it should have been replaced. */ + ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), &desc_out); + tt_int_op(ret, OP_EQ, 1); + tt_str_op(desc_out, OP_EQ, new_desc_str); + tor_free(new_desc_str); + } + + done: + hs_descriptor_free(desc1); + tor_free(desc1_str); +} + +static void +test_clean_as_dir(void *arg) +{ + size_t ret; + char *desc1_str = NULL; + time_t now = time(NULL); + hs_descriptor_t *desc1 = NULL; + ed25519_keypair_t signing_kp1; + + (void) arg; + + init_test(); + + /* Generate a valid descriptor with values. */ + ret = ed25519_keypair_generate(&signing_kp1, 0); + tt_int_op(ret, OP_EQ, 0); + desc1 = hs_helper_build_hs_desc_with_ip(&signing_kp1); + tt_assert(desc1); + ret = hs_desc_encode_descriptor(desc1, &signing_kp1, &desc1_str); + tt_int_op(ret, OP_EQ, 0); + ret = hs_cache_store_as_dir(desc1_str); + tt_int_op(ret, OP_EQ, 0); + + /* With the lifetime being 3 hours, a cleanup shouldn't remove it. */ + ret = cache_clean_v3_as_dir(now, 0); + tt_int_op(ret, OP_EQ, 0); + /* Should be present after clean up. */ + ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL); + tt_int_op(ret, OP_EQ, 1); + /* Set a cutoff 100 seconds in the past. It should not remove the entry + * since the entry is still recent enough. */ + ret = cache_clean_v3_as_dir(now, now - 100); + tt_int_op(ret, OP_EQ, 0); + /* Should be present after clean up. */ + ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL); + tt_int_op(ret, OP_EQ, 1); + /* Set a cutoff of 100 seconds in the future. It should remove the entry + * that we've just added since it's not too old for the cutoff. */ + ret = cache_clean_v3_as_dir(now, now + 100); + tt_int_op(ret, OP_GT, 0); + /* Shouldn't be present after clean up. */ + ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL); + tt_int_op(ret, OP_EQ, 0); + + done: + hs_descriptor_free(desc1); + tor_free(desc1_str); +} + +/* Test helper: Fetch an HS descriptor from an HSDir (for the hidden service + with blinded_key. Return the received descriptor string. */ +static char * +helper_fetch_desc_from_hsdir(const ed25519_public_key_t *blinded_key) +{ + int retval; + + char *received_desc = NULL; + char *hsdir_query_str = NULL; + + /* The dir conn we are going to simulate */ + dir_connection_t *conn = NULL; + + /* First extract the blinded public key that we are going to use in our + query, and then build the actual query string. */ + { + char hsdir_cache_key[ED25519_BASE64_LEN+1]; + + retval = ed25519_public_to_base64(hsdir_cache_key, + blinded_key); + tt_int_op(retval, OP_EQ, 0); + tor_asprintf(&hsdir_query_str, GET("/tor/hs/3/%s"), hsdir_cache_key); + } + + /* Simulate an HTTP GET request to the HSDir */ + conn = dir_connection_new(AF_INET); + tor_addr_from_ipv4h(&conn->base_.addr, 0x7f000001); + TO_CONN(conn)->linked = 1;/* Pretend the conn is encrypted :) */ + retval = directory_handle_command_get(conn, hsdir_query_str, + NULL, 0); + tt_int_op(retval, OP_EQ, 0); + + /* Read the descriptor that the HSDir just served us */ + { + char *headers = NULL; + size_t body_used = 0; + + fetch_from_buf_http(TO_CONN(conn)->outbuf, &headers, MAX_HEADERS_SIZE, + &received_desc, &body_used, HS_DESC_MAX_LEN, 0); + tor_free(headers); + } + + done: + tor_free(hsdir_query_str); + if (conn) + connection_free_minimal(TO_CONN(conn)); + + return received_desc; +} + +/* Publish a descriptor to the HSDir, then fetch it. Check that the received + descriptor matches the published one. */ +static void +test_upload_and_download_hs_desc(void *arg) +{ + int retval; + hs_descriptor_t *published_desc = NULL; + + char *published_desc_str = NULL; + char *received_desc_str = NULL; + + (void) arg; + + /* Initialize HSDir cache subsystem */ + init_test(); + + /* Test a descriptor not found in the directory cache. */ + { + ed25519_public_key_t blinded_key; + memset(&blinded_key.pubkey, 'A', sizeof(blinded_key.pubkey)); + received_desc_str = helper_fetch_desc_from_hsdir(&blinded_key); + tt_int_op(strlen(received_desc_str), OP_EQ, 0); + tor_free(received_desc_str); + } + + /* Generate a valid descriptor with normal values. */ + { + ed25519_keypair_t signing_kp; + retval = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(retval, OP_EQ, 0); + published_desc = hs_helper_build_hs_desc_with_ip(&signing_kp); + tt_assert(published_desc); + retval = hs_desc_encode_descriptor(published_desc, &signing_kp, + &published_desc_str); + tt_int_op(retval, OP_EQ, 0); + } + + /* Publish descriptor to the HSDir */ + { + retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str); + tt_int_op(retval, OP_EQ, 200); + } + + /* Simulate a fetch of the previously published descriptor */ + { + const ed25519_public_key_t *blinded_key; + blinded_key = &published_desc->plaintext_data.blinded_pubkey; + received_desc_str = helper_fetch_desc_from_hsdir(blinded_key); + } + + /* Verify we received the exact same descriptor we published earlier */ + tt_str_op(received_desc_str, OP_EQ, published_desc_str); + tor_free(received_desc_str); + + /* With a valid descriptor in the directory cache, try again an invalid. */ + { + ed25519_public_key_t blinded_key; + memset(&blinded_key.pubkey, 'A', sizeof(blinded_key.pubkey)); + received_desc_str = helper_fetch_desc_from_hsdir(&blinded_key); + tt_int_op(strlen(received_desc_str), OP_EQ, 0); + } + + done: + tor_free(received_desc_str); + tor_free(published_desc_str); + hs_descriptor_free(published_desc); +} + +/* Test that HSDirs reject outdated descriptors based on their revision + * counter. Also test that HSDirs correctly replace old descriptors with newer + * descriptors. */ +static void +test_hsdir_revision_counter_check(void *arg) +{ + int retval; + + ed25519_keypair_t signing_kp; + + hs_descriptor_t *published_desc = NULL; + char *published_desc_str = NULL; + + uint8_t subcredential[DIGEST256_LEN]; + char *received_desc_str = NULL; + hs_descriptor_t *received_desc = NULL; + + (void) arg; + + /* Initialize HSDir cache subsystem */ + init_test(); + + /* Generate a valid descriptor with normal values. */ + { + retval = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(retval, OP_EQ, 0); + published_desc = hs_helper_build_hs_desc_with_ip(&signing_kp); + tt_assert(published_desc); + retval = hs_desc_encode_descriptor(published_desc, &signing_kp, + &published_desc_str); + tt_int_op(retval, OP_EQ, 0); + } + + /* Publish descriptor to the HSDir */ + { + retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str); + tt_int_op(retval, OP_EQ, 200); + } + + /* Try publishing again with the same revision counter: Should fail. */ + { + retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str); + tt_int_op(retval, OP_EQ, 400); + } + + /* Fetch the published descriptor and validate the revision counter. */ + { + const ed25519_public_key_t *blinded_key; + + blinded_key = &published_desc->plaintext_data.blinded_pubkey; + hs_get_subcredential(&signing_kp.pubkey, blinded_key, subcredential); + received_desc_str = helper_fetch_desc_from_hsdir(blinded_key); + + retval = hs_desc_decode_descriptor(received_desc_str, + subcredential, &received_desc); + tt_int_op(retval, OP_EQ, 0); + tt_assert(received_desc); + + /* Check that the revision counter is correct */ + tt_u64_op(received_desc->plaintext_data.revision_counter, OP_EQ, 42); + + hs_descriptor_free(received_desc); + received_desc = NULL; + tor_free(received_desc_str); + } + + /* Increment the revision counter and try again. Should work. */ + { + published_desc->plaintext_data.revision_counter = 1313; + tor_free(published_desc_str); + retval = hs_desc_encode_descriptor(published_desc, &signing_kp, + &published_desc_str); + tt_int_op(retval, OP_EQ, 0); + + retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str); + tt_int_op(retval, OP_EQ, 200); + } + + /* Again, fetch the published descriptor and perform the revision counter + validation. The revision counter must have changed. */ + { + const ed25519_public_key_t *blinded_key; + + blinded_key = &published_desc->plaintext_data.blinded_pubkey; + received_desc_str = helper_fetch_desc_from_hsdir(blinded_key); + + retval = hs_desc_decode_descriptor(received_desc_str, + subcredential, &received_desc); + tt_int_op(retval, OP_EQ, 0); + tt_assert(received_desc); + + /* Check that the revision counter is the latest */ + tt_u64_op(received_desc->plaintext_data.revision_counter, OP_EQ, 1313); + } + + done: + hs_descriptor_free(published_desc); + hs_descriptor_free(received_desc); + tor_free(received_desc_str); + tor_free(published_desc_str); +} + +static networkstatus_t mock_ns; + +static networkstatus_t * +mock_networkstatus_get_live_consensus(time_t now) +{ + (void) now; + return &mock_ns; +} + +/** Test that we can store HS descriptors in the client HS cache. */ +static void +test_client_cache(void *arg) +{ + int retval; + ed25519_keypair_t signing_kp; + hs_descriptor_t *published_desc = NULL; + char *published_desc_str = NULL; + uint8_t wanted_subcredential[DIGEST256_LEN]; + response_handler_args_t *args = NULL; + dir_connection_t *conn = NULL; + + (void) arg; + + /* Initialize HSDir cache subsystem */ + init_test(); + + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + /* Set consensus time */ + parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", + &mock_ns.valid_after); + parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", + &mock_ns.fresh_until); + parse_rfc1123_time("Sat, 26 Oct 1985 16:00:00 UTC", + &mock_ns.valid_until); + + /* Generate a valid descriptor with normal values. */ + { + retval = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(retval, OP_EQ, 0); + published_desc = hs_helper_build_hs_desc_with_ip(&signing_kp); + tt_assert(published_desc); + retval = hs_desc_encode_descriptor(published_desc, &signing_kp, + &published_desc_str); + tt_int_op(retval, OP_EQ, 0); + memcpy(wanted_subcredential, published_desc->subcredential, DIGEST256_LEN); + tt_assert(!tor_mem_is_zero((char*)wanted_subcredential, DIGEST256_LEN)); + } + + /* Test handle_response_fetch_hsdesc_v3() */ + { + args = tor_malloc_zero(sizeof(response_handler_args_t)); + args->status_code = 200; + args->reason = NULL; + args->body = published_desc_str; + args->body_len = strlen(published_desc_str); + + conn = tor_malloc_zero(sizeof(dir_connection_t)); + conn->hs_ident = tor_malloc_zero(sizeof(hs_ident_dir_conn_t)); + ed25519_pubkey_copy(&conn->hs_ident->identity_pk, &signing_kp.pubkey); + } + + /* store the descriptor! */ + retval = handle_response_fetch_hsdesc_v3(conn, args); + tt_int_op(retval, == , 0); + + /* Progress time a bit and attempt to clean cache: our desc should not be + * cleaned since we still in the same TP. */ + { + parse_rfc1123_time("Sat, 27 Oct 1985 02:00:00 UTC", + &mock_ns.valid_after); + parse_rfc1123_time("Sat, 27 Oct 1985 03:00:00 UTC", + &mock_ns.fresh_until); + parse_rfc1123_time("Sat, 27 Oct 1985 05:00:00 UTC", + &mock_ns.valid_until); + + /* fetch the descriptor and make sure it's there */ + const hs_descriptor_t *cached_desc = NULL; + cached_desc = hs_cache_lookup_as_client(&signing_kp.pubkey); + tt_assert(cached_desc); + tt_mem_op(cached_desc->subcredential, OP_EQ, wanted_subcredential, + DIGEST256_LEN); + } + + /* Progress time to next TP and check that desc was cleaned */ + { + parse_rfc1123_time("Sat, 27 Oct 1985 12:00:00 UTC", + &mock_ns.valid_after); + parse_rfc1123_time("Sat, 27 Oct 1985 13:00:00 UTC", + &mock_ns.fresh_until); + parse_rfc1123_time("Sat, 27 Oct 1985 15:00:00 UTC", + &mock_ns.valid_until); + + const hs_descriptor_t *cached_desc = NULL; + cached_desc = hs_cache_lookup_as_client(&signing_kp.pubkey); + tt_assert(!cached_desc); + } + + done: + tor_free(args); + hs_descriptor_free(published_desc); + tor_free(published_desc_str); + if (conn) { + tor_free(conn->hs_ident); + tor_free(conn); + } +} + +struct testcase_t hs_cache[] = { + /* Encoding tests. */ + { "directory", test_directory, TT_FORK, + NULL, NULL }, + { "clean_as_dir", test_clean_as_dir, TT_FORK, + NULL, NULL }, + { "hsdir_revision_counter_check", test_hsdir_revision_counter_check, TT_FORK, + NULL, NULL }, + { "upload_and_download_hs_desc", test_upload_and_download_hs_desc, TT_FORK, + NULL, NULL }, + { "client_cache", test_client_cache, TT_FORK, + NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_hs_cell.c b/src/wraith/src/test/test_hs_cell.c new file mode 100644 index 000000000..1b3c788a6 --- /dev/null +++ b/src/wraith/src/test/test_hs_cell.c @@ -0,0 +1,130 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs_cell.c + * \brief Test hidden service cell functionality. + */ + +#define HS_INTROPOINT_PRIVATE +#define HS_SERVICE_PRIVATE + +#include "test.h" +#include "test_helpers.h" +#include "log_test_helpers.h" + +#include "crypto_ed25519.h" +#include "hs_cell.h" +#include "hs_intropoint.h" +#include "hs_service.h" + +/* Trunnel. */ +#include "hs/cell_establish_intro.h" + +/** We simulate the creation of an outgoing ESTABLISH_INTRO cell, and then we + * parse it from the receiver side. */ +static void +test_gen_establish_intro_cell(void *arg) +{ + (void) arg; + ssize_t ret; + char circ_nonce[DIGEST_LEN] = {0}; + uint8_t buf[RELAY_PAYLOAD_SIZE]; + trn_cell_establish_intro_t *cell_in = NULL; + + crypto_rand(circ_nonce, sizeof(circ_nonce)); + + /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we + attempt to parse it. */ + { + /* We only need the auth key pair here. */ + hs_service_intro_point_t *ip = service_intro_point_new(NULL, 0); + /* Auth key pair is generated in the constructor so we are all set for + * using this IP object. */ + ret = hs_cell_build_establish_intro(circ_nonce, ip, buf); + service_intro_point_free(ip); + tt_u64_op(ret, OP_GT, 0); + } + + /* Check the contents of the cell */ + { + /* First byte is the auth key type: make sure its correct */ + tt_int_op(buf[0], OP_EQ, HS_INTRO_AUTH_KEY_TYPE_ED25519); + /* Next two bytes is auth key len */ + tt_int_op(ntohs(get_uint16(buf+1)), OP_EQ, ED25519_PUBKEY_LEN); + /* Skip to the number of extensions: no extensions */ + tt_int_op(buf[35], OP_EQ, 0); + /* Skip to the sig len. Make sure it's the size of an ed25519 sig */ + tt_int_op(ntohs(get_uint16(buf+35+1+32)), OP_EQ, ED25519_SIG_LEN); + } + + /* Parse it as the receiver */ + { + ret = trn_cell_establish_intro_parse(&cell_in, buf, sizeof(buf)); + tt_u64_op(ret, OP_GT, 0); + + ret = verify_establish_intro_cell(cell_in, + (const uint8_t *) circ_nonce, + sizeof(circ_nonce)); + tt_u64_op(ret, OP_EQ, 0); + } + + done: + trn_cell_establish_intro_free(cell_in); +} + +/* Mocked ed25519_sign_prefixed() function that always fails :) */ +static int +mock_ed25519_sign_prefixed(ed25519_signature_t *signature_out, + const uint8_t *msg, size_t msg_len, + const char *prefix_str, + const ed25519_keypair_t *keypair) { + (void) signature_out; + (void) msg; + (void) msg_len; + (void) prefix_str; + (void) keypair; + return -1; +} + +/** We simulate a failure to create an ESTABLISH_INTRO cell */ +static void +test_gen_establish_intro_cell_bad(void *arg) +{ + (void) arg; + ssize_t cell_len = 0; + trn_cell_establish_intro_t *cell = NULL; + char circ_nonce[DIGEST_LEN] = {0}; + hs_service_intro_point_t *ip = NULL; + + MOCK(ed25519_sign_prefixed, mock_ed25519_sign_prefixed); + + crypto_rand(circ_nonce, sizeof(circ_nonce)); + + setup_full_capture_of_logs(LOG_WARN); + /* Easiest way to make that function fail is to mock the + ed25519_sign_prefixed() function and make it fail. */ + cell = trn_cell_establish_intro_new(); + tt_assert(cell); + ip = service_intro_point_new(NULL, 0); + cell_len = hs_cell_build_establish_intro(circ_nonce, ip, NULL); + service_intro_point_free(ip); + expect_log_msg_containing("Unable to make signature for " + "ESTABLISH_INTRO cell."); + teardown_capture_of_logs(); + tt_i64_op(cell_len, OP_EQ, -1); + + done: + trn_cell_establish_intro_free(cell); + UNMOCK(ed25519_sign_prefixed); +} + +struct testcase_t hs_cell_tests[] = { + { "gen_establish_intro_cell", test_gen_establish_intro_cell, TT_FORK, + NULL, NULL }, + { "gen_establish_intro_cell_bad", test_gen_establish_intro_cell_bad, TT_FORK, + NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_hs_client.c b/src/wraith/src/test/test_hs_client.c new file mode 100644 index 000000000..7ee7210bc --- /dev/null +++ b/src/wraith/src/test/test_hs_client.c @@ -0,0 +1,599 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs_client.c + * \brief Test prop224 HS client functionality. + */ + +#define CRYPTO_PRIVATE +#define MAIN_PRIVATE +#define HS_CLIENT_PRIVATE +#define TOR_CHANNEL_INTERNAL_ +#define CIRCUITBUILD_PRIVATE +#define CIRCUITLIST_PRIVATE +#define CONNECTION_PRIVATE + +#include "test.h" +#include "test_helpers.h" +#include "log_test_helpers.h" +#include "rend_test_helpers.h" +#include "hs_test_helpers.h" + +#include "config.h" +#include "crypto.h" +#include "channeltls.h" +#include "main.h" +#include "nodelist.h" +#include "routerset.h" + +#include "hs_circuit.h" +#include "hs_client.h" +#include "hs_ident.h" +#include "hs_cache.h" +#include "circuitlist.h" +#include "circuitbuild.h" +#include "connection.h" +#include "connection_edge.h" +#include "networkstatus.h" + +static int +mock_connection_ap_handshake_send_begin(entry_connection_t *ap_conn) +{ + (void) ap_conn; + return 0; +} + +static networkstatus_t mock_ns; + +/* Always return NULL. */ +static networkstatus_t * +mock_networkstatus_get_live_consensus_false(time_t now) +{ + (void) now; + return NULL; +} + +static networkstatus_t * +mock_networkstatus_get_live_consensus(time_t now) +{ + (void) now; + return &mock_ns; +} + +/* Test helper function: Setup a circuit and a stream with the same hidden + * service destination, and put them in circ_out and + * conn_out. Make the stream wait for circuits to be established to the + * hidden service. */ +static int +helper_get_circ_and_stream_for_test(origin_circuit_t **circ_out, + connection_t **conn_out, + int is_legacy) +{ + int retval; + channel_tls_t *n_chan=NULL; + rend_data_t *conn_rend_data = NULL; + origin_circuit_t *or_circ = NULL; + connection_t *conn = NULL; + ed25519_public_key_t service_pk; + + /* Make a dummy connection stream and make it wait for our circuit */ + conn = test_conn_get_connection(AP_CONN_STATE_CIRCUIT_WAIT, + CONN_TYPE_AP /* ??? */, + 0); + if (is_legacy) { + /* Legacy: Setup rend_data of stream */ + char service_id[REND_SERVICE_ID_LEN_BASE32+1] = {0}; + TO_EDGE_CONN(conn)->rend_data = mock_rend_data(service_id); + conn_rend_data = TO_EDGE_CONN(conn)->rend_data; + } else { + /* prop224: Setup hs conn identifier on the stream */ + ed25519_secret_key_t sk; + tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sk, 0)); + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&service_pk, &sk)); + + /* Setup hs_conn_identifier of stream */ + TO_EDGE_CONN(conn)->hs_ident = hs_ident_edge_conn_new(&service_pk); + } + + /* Make it wait for circuit */ + connection_ap_mark_as_pending_circuit(TO_ENTRY_CONN(conn)); + + /* This is needed to silence a BUG warning from + connection_edge_update_circuit_isolation() */ + TO_ENTRY_CONN(conn)->original_dest_address = + tor_strdup(TO_ENTRY_CONN(conn)->socks_request->address); + + /****************************************************/ + + /* Now make dummy circuit */ + or_circ = origin_circuit_new(); + + or_circ->base_.purpose = CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED; + + or_circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); + or_circ->build_state->is_internal = 1; + + if (is_legacy) { + /* Legacy: Setup rend data and final cpath */ + or_circ->build_state->pending_final_cpath = + tor_malloc_zero(sizeof(crypt_path_t)); + or_circ->build_state->pending_final_cpath->magic = CRYPT_PATH_MAGIC; + or_circ->build_state->pending_final_cpath->rend_dh_handshake_state = + crypto_dh_new(DH_TYPE_REND); + tt_assert( + or_circ->build_state->pending_final_cpath->rend_dh_handshake_state); + retval = crypto_dh_generate_public( + or_circ->build_state->pending_final_cpath->rend_dh_handshake_state); + tt_int_op(retval, OP_EQ, 0); + or_circ->rend_data = rend_data_dup(conn_rend_data); + } else { + /* prop224: Setup hs ident on the circuit */ + or_circ->hs_ident = hs_ident_circuit_new(&service_pk, + HS_IDENT_CIRCUIT_RENDEZVOUS); + } + + TO_CIRCUIT(or_circ)->state = CIRCUIT_STATE_OPEN; + + /* fake n_chan */ + n_chan = tor_malloc_zero(sizeof(channel_tls_t)); + n_chan->base_.global_identifier = 1; + or_circ->base_.n_chan = &(n_chan->base_); + + *circ_out = or_circ; + *conn_out = conn; + + return 0; + + done: + /* something failed */ + return -1; +} + +/* Test: Ensure that setting up legacy e2e rendezvous circuits works + * correctly. */ +static void +test_e2e_rend_circuit_setup_legacy(void *arg) +{ + ssize_t retval; + origin_circuit_t *or_circ = NULL; + connection_t *conn = NULL; + + (void) arg; + + /** In this test we create a v2 legacy HS stream and a circuit with the same + * hidden service destination. We make the stream wait for circuits to be + * established to the hidden service, and then we complete the circuit using + * the hs_circuit_setup_e2e_rend_circ_legacy_client() function. We then + * check that the end-to-end cpath was setup correctly and that the stream + * was attached to the circuit as expected. */ + + MOCK(connection_ap_handshake_send_begin, + mock_connection_ap_handshake_send_begin); + + /* Setup */ + retval = helper_get_circ_and_stream_for_test( &or_circ, &conn, 1); + tt_int_op(retval, OP_EQ, 0); + tt_assert(or_circ); + tt_assert(conn); + + /* Check number of hops */ + retval = cpath_get_n_hops(&or_circ->cpath); + tt_int_op(retval, OP_EQ, 0); + + /* Check that our stream is not attached on any circuits */ + tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, NULL); + + /********************************************** */ + + /* Make a good RENDEZVOUS1 cell body because it needs to pass key exchange + * digest verification... */ + uint8_t rend_cell_body[DH_KEY_LEN+DIGEST_LEN] = {2}; + { + char keys[DIGEST_LEN+CPATH_KEY_MATERIAL_LEN]; + crypto_dh_t *dh_state = + or_circ->build_state->pending_final_cpath->rend_dh_handshake_state; + /* compute and overwrite digest of cell body with the right value */ + retval = crypto_dh_compute_secret(LOG_PROTOCOL_WARN, dh_state, + (char*)rend_cell_body, DH_KEY_LEN, + keys, DIGEST_LEN+CPATH_KEY_MATERIAL_LEN); + tt_int_op(retval, OP_GT, 0); + memcpy(rend_cell_body+DH_KEY_LEN, keys, DIGEST_LEN); + } + + /* Setup the circuit */ + retval = hs_circuit_setup_e2e_rend_circ_legacy_client(or_circ, + rend_cell_body); + tt_int_op(retval, OP_EQ, 0); + + /**********************************************/ + + /* See that a hop was added to the circuit's cpath */ + retval = cpath_get_n_hops(&or_circ->cpath); + tt_int_op(retval, OP_EQ, 1); + + /* Check the digest algo */ + tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->f_digest), + OP_EQ, DIGEST_SHA1); + tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->b_digest), + OP_EQ, DIGEST_SHA1); + tt_assert(or_circ->cpath->f_crypto); + tt_assert(or_circ->cpath->b_crypto); + + /* Ensure that circ purpose was changed */ + tt_int_op(or_circ->base_.purpose, OP_EQ, CIRCUIT_PURPOSE_C_REND_JOINED); + + /* Test that stream got attached */ + tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, TO_CIRCUIT(or_circ)); + + done: + connection_free_minimal(conn); + if (or_circ) + tor_free(TO_CIRCUIT(or_circ)->n_chan); + circuit_free_(TO_CIRCUIT(or_circ)); +} + +/* Test: Ensure that setting up v3 rendezvous circuits works correctly. */ +static void +test_e2e_rend_circuit_setup(void *arg) +{ + uint8_t ntor_key_seed[DIGEST256_LEN] = {0}; + origin_circuit_t *or_circ = NULL; + int retval; + connection_t *conn = NULL; + + (void) arg; + + /** In this test we create a prop224 v3 HS stream and a circuit with the same + * hidden service destination. We make the stream wait for circuits to be + * established to the hidden service, and then we complete the circuit using + * the hs_circuit_setup_e2e_rend_circ() function. We then check that the + * end-to-end cpath was setup correctly and that the stream was attached to + * the circuit as expected. */ + + MOCK(connection_ap_handshake_send_begin, + mock_connection_ap_handshake_send_begin); + + /* Setup */ + retval = helper_get_circ_and_stream_for_test( &or_circ, &conn, 0); + tt_int_op(retval, OP_EQ, 0); + tt_assert(or_circ); + tt_assert(conn); + + /* Check number of hops: There should be no hops yet to this circ */ + retval = cpath_get_n_hops(&or_circ->cpath); + tt_int_op(retval, OP_EQ, 0); + tt_ptr_op(or_circ->cpath, OP_EQ, NULL); + + /* Check that our stream is not attached on any circuits */ + tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, NULL); + + /**********************************************/ + + /* Setup the circuit */ + retval = hs_circuit_setup_e2e_rend_circ(or_circ, + ntor_key_seed, sizeof(ntor_key_seed), + 0); + tt_int_op(retval, OP_EQ, 0); + + /**********************************************/ + + /* See that a hop was added to the circuit's cpath */ + retval = cpath_get_n_hops(&or_circ->cpath); + tt_int_op(retval, OP_EQ, 1); + + /* Check that the crypt path has prop224 algorithm parameters */ + tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->f_digest), + OP_EQ, DIGEST_SHA3_256); + tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->b_digest), + OP_EQ, DIGEST_SHA3_256); + tt_assert(or_circ->cpath->f_crypto); + tt_assert(or_circ->cpath->b_crypto); + + /* Ensure that circ purpose was changed */ + tt_int_op(or_circ->base_.purpose, OP_EQ, CIRCUIT_PURPOSE_C_REND_JOINED); + + /* Test that stream got attached */ + tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, TO_CIRCUIT(or_circ)); + + done: + connection_free_minimal(conn); + if (or_circ) + tor_free(TO_CIRCUIT(or_circ)->n_chan); + circuit_free_(TO_CIRCUIT(or_circ)); +} + +/** Test client logic for picking intro points from a descriptor. Also test how + * ExcludeNodes and intro point failures affect picking intro points. */ +static void +test_client_pick_intro(void *arg) +{ + int ret; + ed25519_keypair_t service_kp; + hs_descriptor_t *desc = NULL; + + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + (void) arg; + + hs_init(); + + /* Generate service keypair */ + tt_int_op(0, OP_EQ, ed25519_keypair_generate(&service_kp, 0)); + + /* Set time */ + ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", + &mock_ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", + &mock_ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + + update_approx_time(mock_ns.fresh_until-10); + time_t now = approx_time(); + + /* Test logic: + * + * 1) Add our desc with intro points to the HS cache. + * + * 2) Mark all descriptor intro points except _the chosen one_ as + * failed. Then query the desc to get a random intro: check that we got + * _the chosen one_. Then fail the chosen one as well, and see that no + * intros are returned. + * + * 3) Then clean the intro state cache and get an intro point. + * + * 4) Try fetching an intro with the wrong service key: shouldn't work + * + * 5) Set StrictNodes and put all our intro points in ExcludeNodes: see that + * nothing is returned. + */ + + /* 1) Add desc to HS cache */ + { + char *encoded = NULL; + desc = hs_helper_build_hs_desc_with_ip(&service_kp); + ret = hs_desc_encode_descriptor(desc, &service_kp, &encoded); + tt_int_op(ret, OP_EQ, 0); + tt_assert(encoded); + + /* store it */ + hs_cache_store_as_client(encoded, &service_kp.pubkey); + + /* fetch it to make sure it works */ + const hs_descriptor_t *fetched_desc = + hs_cache_lookup_as_client(&service_kp.pubkey); + tt_assert(fetched_desc); + tt_mem_op(fetched_desc->subcredential, OP_EQ, desc->subcredential, + DIGEST256_LEN); + tt_assert(!tor_mem_is_zero((char*)fetched_desc->subcredential, + DIGEST256_LEN)); + tor_free(encoded); + } + + /* 2) Mark all intro points except _the chosen one_ as failed. Then query the + * desc and get a random intro: check that we got _the chosen one_. */ + { + /* Pick the chosen intro point and get its ei */ + hs_desc_intro_point_t *chosen_intro_point = + smartlist_get(desc->encrypted_data.intro_points, 0); + extend_info_t *chosen_intro_ei = + desc_intro_point_to_extend_info(chosen_intro_point); + tt_assert(chosen_intro_point); + tt_assert(chosen_intro_ei); + + /* Now mark all other intro points as failed */ + SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points, + hs_desc_intro_point_t *, ip) { + /* Skip the chosen intro point */ + if (ip == chosen_intro_point) { + continue; + } + ed25519_public_key_t *intro_auth_key = &ip->auth_key_cert->signed_key; + hs_cache_client_intro_state_note(&service_kp.pubkey, + intro_auth_key, + INTRO_POINT_FAILURE_GENERIC); + } SMARTLIST_FOREACH_END(ip); + + /* Try to get a random intro: Should return the chosen one! */ + extend_info_t *ip = client_get_random_intro(&service_kp.pubkey); + tor_assert(ip); + tt_assert(!tor_mem_is_zero((char*)ip->identity_digest, DIGEST_LEN)); + tt_mem_op(ip->identity_digest, OP_EQ, chosen_intro_ei->identity_digest, + DIGEST_LEN); + + extend_info_free(chosen_intro_ei); + extend_info_free(ip); + + /* Now also mark the chosen one as failed: See that we can't get any intro + points anymore. */ + hs_cache_client_intro_state_note(&service_kp.pubkey, + &chosen_intro_point->auth_key_cert->signed_key, + INTRO_POINT_FAILURE_TIMEOUT); + ip = client_get_random_intro(&service_kp.pubkey); + tor_assert(!ip); + } + + /* 3) Clean the intro state cache and get an intro point */ + { + /* Pretend we are 5 mins in the future and order a cleanup of the intro + * state. This should clean up the intro point failures and allow us to get + * an intro. */ + hs_cache_client_intro_state_clean(now + 5*60); + + /* Get an intro. It should work! */ + extend_info_t *ip = client_get_random_intro(&service_kp.pubkey); + tor_assert(ip); + extend_info_free(ip); + } + + /* 4) Try fetching an intro with the wrong service key: shouldn't work */ + { + ed25519_keypair_t dummy_kp; + tt_int_op(0, OP_EQ, ed25519_keypair_generate(&dummy_kp, 0)); + extend_info_t *ip = client_get_random_intro(&dummy_kp.pubkey); + tor_assert(!ip); + } + + /* 5) Set StrictNodes and put all our intro points in ExcludeNodes: see that + * nothing is returned. */ + { + get_options_mutable()->ExcludeNodes = routerset_new(); + get_options_mutable()->StrictNodes = 1; + SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points, + hs_desc_intro_point_t *, ip) { + extend_info_t *intro_ei = desc_intro_point_to_extend_info(ip); + if (intro_ei) { + const char *ptr; + char ip_addr[TOR_ADDR_BUF_LEN]; + /* We need to decorate in case it is an IPv6 else routerset_parse() + * doesn't like it. */ + ptr = tor_addr_to_str(ip_addr, &intro_ei->addr, sizeof(ip_addr), 1); + tt_assert(ptr == ip_addr); + ret = routerset_parse(get_options_mutable()->ExcludeNodes, + ip_addr, ""); + tt_int_op(ret, OP_EQ, 0); + extend_info_free(intro_ei); + } + } SMARTLIST_FOREACH_END(ip); + + extend_info_t *ip = client_get_random_intro(&service_kp.pubkey); + tt_assert(!ip); + } + + done: + hs_descriptor_free(desc); +} + +static int +mock_router_have_minimum_dir_info_false(void) +{ + return 0; +} +static int +mock_router_have_minimum_dir_info_true(void) +{ + return 1; +} + +static hs_client_fetch_status_t +mock_fetch_v3_desc_error(const ed25519_public_key_t *key) +{ + (void) key; + return HS_CLIENT_FETCH_ERROR; +} + +static void +mock_connection_mark_unattached_ap_(entry_connection_t *conn, int endreason, + int line, const char *file) +{ + (void) line; + (void) file; + conn->edge_.end_reason = endreason; +} + +static void +test_descriptor_fetch(void *arg) +{ + int ret; + entry_connection_t *ec = NULL; + ed25519_public_key_t service_pk; + ed25519_secret_key_t service_sk; + + (void) arg; + + hs_init(); + memset(&service_sk, 'A', sizeof(service_sk)); + ret = ed25519_public_key_generate(&service_pk, &service_sk); + tt_int_op(ret, OP_EQ, 0); + + /* Initialize this so get_voting_interval() doesn't freak out. */ + ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", + &mock_ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", + &mock_ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + + ec = entry_connection_new(CONN_TYPE_AP, AF_INET); + tt_assert(ec); + ENTRY_TO_EDGE_CONN(ec)->hs_ident = hs_ident_edge_conn_new(&service_pk); + tt_assert(ENTRY_TO_EDGE_CONN(ec)->hs_ident); + TO_CONN(ENTRY_TO_EDGE_CONN(ec))->state = AP_CONN_STATE_RENDDESC_WAIT; + smartlist_add(get_connection_array(), &ec->edge_.base_); + + /* 1. FetchHidServDescriptors is false so we shouldn't be able to fetch. */ + get_options_mutable()->FetchHidServDescriptors = 0; + ret = hs_client_refetch_hsdesc(&service_pk); + tt_int_op(ret, OP_EQ, HS_CLIENT_FETCH_NOT_ALLOWED); + get_options_mutable()->FetchHidServDescriptors = 1; + + /* 2. We don't have a live consensus. */ + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus_false); + ret = hs_client_refetch_hsdesc(&service_pk); + UNMOCK(networkstatus_get_live_consensus); + tt_int_op(ret, OP_EQ, HS_CLIENT_FETCH_MISSING_INFO); + + /* From now on, return a live consensus. */ + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + /* 3. Not enough dir information. */ + MOCK(router_have_minimum_dir_info, + mock_router_have_minimum_dir_info_false); + ret = hs_client_refetch_hsdesc(&service_pk); + UNMOCK(router_have_minimum_dir_info); + tt_int_op(ret, OP_EQ, HS_CLIENT_FETCH_MISSING_INFO); + + /* From now on, we do have enough directory information. */ + MOCK(router_have_minimum_dir_info, + mock_router_have_minimum_dir_info_true); + + /* 4. We do have a pending directory request. */ + { + dir_connection_t *dir_conn = dir_connection_new(AF_INET); + dir_conn->hs_ident = tor_malloc_zero(sizeof(hs_ident_dir_conn_t)); + TO_CONN(dir_conn)->purpose = DIR_PURPOSE_FETCH_HSDESC; + ed25519_pubkey_copy(&dir_conn->hs_ident->identity_pk, &service_pk); + smartlist_add(get_connection_array(), TO_CONN(dir_conn)); + ret = hs_client_refetch_hsdesc(&service_pk); + smartlist_remove(get_connection_array(), TO_CONN(dir_conn)); + connection_free_minimal(TO_CONN(dir_conn)); + tt_int_op(ret, OP_EQ, HS_CLIENT_FETCH_PENDING); + } + + /* 5. We'll trigger an error on the fetch_desc_v3 and force to close all + * pending SOCKS request. */ + MOCK(router_have_minimum_dir_info, + mock_router_have_minimum_dir_info_true); + MOCK(fetch_v3_desc, mock_fetch_v3_desc_error); + MOCK(connection_mark_unattached_ap_, + mock_connection_mark_unattached_ap_); + ret = hs_client_refetch_hsdesc(&service_pk); + UNMOCK(fetch_v3_desc); + UNMOCK(connection_mark_unattached_ap_); + tt_int_op(ret, OP_EQ, HS_CLIENT_FETCH_ERROR); + /* The close waiting for descriptor function has been called. */ + tt_int_op(ec->edge_.end_reason, OP_EQ, END_STREAM_REASON_RESOLVEFAILED); + + done: + connection_free_minimal(ENTRY_TO_CONN(ec)); + UNMOCK(networkstatus_get_live_consensus); + UNMOCK(router_have_minimum_dir_info); + hs_free_all(); +} + +struct testcase_t hs_client_tests[] = { + { "e2e_rend_circuit_setup_legacy", test_e2e_rend_circuit_setup_legacy, + TT_FORK, NULL, NULL }, + { "e2e_rend_circuit_setup", test_e2e_rend_circuit_setup, + TT_FORK, NULL, NULL }, + { "client_pick_intro", test_client_pick_intro, + TT_FORK, NULL, NULL }, + { "descriptor_fetch", test_descriptor_fetch, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_hs_common.c b/src/wraith/src/test/test_hs_common.c new file mode 100644 index 000000000..b9b76d15b --- /dev/null +++ b/src/wraith/src/test/test_hs_common.c @@ -0,0 +1,1822 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs_common.c + * \brief Test hidden service common functionalities. + */ + +#define HS_COMMON_PRIVATE +#define HS_CLIENT_PRIVATE +#define HS_SERVICE_PRIVATE +#define NODELIST_PRIVATE + +#include "test.h" +#include "test_helpers.h" +#include "log_test_helpers.h" +#include "hs_test_helpers.h" + +#include "connection_edge.h" +#include "hs_common.h" +#include "hs_client.h" +#include "hs_service.h" +#include "config.h" +#include "networkstatus.h" +#include "directory.h" +#include "dirvote.h" +#include "nodelist.h" +#include "routerlist.h" +#include "statefile.h" +#include "circuitlist.h" +#include "shared_random.h" +#include "util.h" + +/** Test the validation of HS v3 addresses */ +static void +test_validate_address(void *arg) +{ + int ret; + + (void) arg; + + /* Address too short and too long. */ + setup_full_capture_of_logs(LOG_WARN); + ret = hs_address_is_valid("blah"); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg_containing("has an invalid length"); + teardown_capture_of_logs(); + + setup_full_capture_of_logs(LOG_WARN); + ret = hs_address_is_valid( + "p3xnclpu4mu22dwaurjtsybyqk4xfjmcfz6z62yl24uwmhjatiwnlnadb"); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg_containing("has an invalid length"); + teardown_capture_of_logs(); + + /* Invalid checksum (taken from prop224) */ + setup_full_capture_of_logs(LOG_WARN); + ret = hs_address_is_valid( + "l5satjgud6gucryazcyvyvhuxhr74u6ygigiuyixe3a6ysis67ororad"); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg_containing("invalid checksum"); + teardown_capture_of_logs(); + + setup_full_capture_of_logs(LOG_WARN); + ret = hs_address_is_valid( + "btojiu7nu5y5iwut64eufevogqdw4wmqzugnoluw232r4t3ecsfv37ad"); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg_containing("invalid checksum"); + teardown_capture_of_logs(); + + /* Non base32 decodable string. */ + setup_full_capture_of_logs(LOG_WARN); + ret = hs_address_is_valid( + "????????????????????????????????????????????????????????"); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg_containing("can't be decoded"); + teardown_capture_of_logs(); + + /* Valid address. */ + ret = hs_address_is_valid( + "25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid"); + tt_int_op(ret, OP_EQ, 1); + + done: + ; +} + +static int +mock_write_str_to_file(const char *path, const char *str, int bin) +{ + (void)bin; + tt_str_op(path, OP_EQ, "/double/five"PATH_SEPARATOR"squared"); + tt_str_op(str, OP_EQ, + "25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid.onion\n"); + + done: + return 0; +} + +/** Test building HS v3 onion addresses. Uses test vectors from the + * ./hs_build_address.py script. */ +static void +test_build_address(void *arg) +{ + int ret; + char onion_addr[HS_SERVICE_ADDR_LEN_BASE32 + 1]; + ed25519_public_key_t pubkey; + /* hex-encoded ed25519 pubkey used in hs_build_address.py */ + char pubkey_hex[] = + "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"; + hs_service_t *service = NULL; + + (void) arg; + + MOCK(write_str_to_file, mock_write_str_to_file); + + /* The following has been created with hs_build_address.py script that + * follows proposal 224 specification to build an onion address. */ + static const char *test_addr = + "25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid"; + + /* Let's try to build the same onion address as the script */ + base16_decode((char*)pubkey.pubkey, sizeof(pubkey.pubkey), + pubkey_hex, strlen(pubkey_hex)); + hs_build_address(&pubkey, HS_VERSION_THREE, onion_addr); + tt_str_op(test_addr, OP_EQ, onion_addr); + /* Validate that address. */ + ret = hs_address_is_valid(onion_addr); + tt_int_op(ret, OP_EQ, 1); + + service = tor_malloc_zero(sizeof(hs_service_t)); + memcpy(service->onion_address, onion_addr, sizeof(service->onion_address)); + tor_asprintf(&service->config.directory_path, "/double/five"); + ret = write_address_to_file(service, "squared"); + tt_int_op(ret, OP_EQ, 0); + + done: + hs_service_free(service); +} + +/** Test that our HS time period calculation functions work properly */ +static void +test_time_period(void *arg) +{ + (void) arg; + uint64_t tn; + int retval; + time_t fake_time, correct_time, start_time; + + /* Let's do the example in prop224 section [TIME-PERIODS] */ + retval = parse_rfc1123_time("Wed, 13 Apr 2016 11:00:00 UTC", + &fake_time); + tt_int_op(retval, OP_EQ, 0); + + /* Check that the time period number is right */ + tn = hs_get_time_period_num(fake_time); + tt_u64_op(tn, OP_EQ, 16903); + + /* Increase current time to 11:59:59 UTC and check that the time period + number is still the same */ + fake_time += 3599; + tn = hs_get_time_period_num(fake_time); + tt_u64_op(tn, OP_EQ, 16903); + + { /* Check start time of next time period */ + retval = parse_rfc1123_time("Wed, 13 Apr 2016 12:00:00 UTC", + &correct_time); + tt_int_op(retval, OP_EQ, 0); + + start_time = hs_get_start_time_of_next_time_period(fake_time); + tt_int_op(start_time, OP_EQ, correct_time); + } + + /* Now take time to 12:00:00 UTC and check that the time period rotated */ + fake_time += 1; + tn = hs_get_time_period_num(fake_time); + tt_u64_op(tn, OP_EQ, 16904); + + /* Now also check our hs_get_next_time_period_num() function */ + tn = hs_get_next_time_period_num(fake_time); + tt_u64_op(tn, OP_EQ, 16905); + + { /* Check start time of next time period again */ + retval = parse_rfc1123_time("Wed, 14 Apr 2016 12:00:00 UTC", + &correct_time); + tt_int_op(retval, OP_EQ, 0); + + start_time = hs_get_start_time_of_next_time_period(fake_time); + tt_int_op(start_time, OP_EQ, correct_time); + } + + /* Now do another sanity check: The time period number at the start of the + * next time period, must be the same time period number as the one returned + * from hs_get_next_time_period_num() */ + { + time_t next_tp_start = hs_get_start_time_of_next_time_period(fake_time); + tt_u64_op(hs_get_time_period_num(next_tp_start), OP_EQ, + hs_get_next_time_period_num(fake_time)); + } + + done: + ; +} + +/** Test that we can correctly find the start time of the next time period */ +static void +test_start_time_of_next_time_period(void *arg) +{ + (void) arg; + int retval; + time_t fake_time; + char tbuf[ISO_TIME_LEN + 1]; + time_t next_tp_start_time; + + /* Do some basic tests */ + retval = parse_rfc1123_time("Wed, 13 Apr 2016 11:00:00 UTC", + &fake_time); + tt_int_op(retval, OP_EQ, 0); + next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time); + /* Compare it with the correct result */ + format_iso_time(tbuf, next_tp_start_time); + tt_str_op("2016-04-13 12:00:00", OP_EQ, tbuf); + + /* Another test with an edge-case time (start of TP) */ + retval = parse_rfc1123_time("Wed, 13 Apr 2016 12:00:00 UTC", + &fake_time); + tt_int_op(retval, OP_EQ, 0); + next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time); + format_iso_time(tbuf, next_tp_start_time); + tt_str_op("2016-04-14 12:00:00", OP_EQ, tbuf); + + { + /* Now pretend we are on a testing network and alter the voting schedule to + be every 10 seconds. This means that a time period has length 10*24 + seconds (4 minutes). It also means that we apply a rotational offset of + 120 seconds to the time period, so that it starts at 00:02:00 instead of + 00:00:00. */ + or_options_t *options = get_options_mutable(); + options->TestingTorNetwork = 1; + options->V3AuthVotingInterval = 10; + options->TestingV3AuthInitialVotingInterval = 10; + + retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:00:00 UTC", + &fake_time); + tt_int_op(retval, OP_EQ, 0); + next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time); + /* Compare it with the correct result */ + format_iso_time(tbuf, next_tp_start_time); + tt_str_op("2016-04-13 00:02:00", OP_EQ, tbuf); + + retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:02:00 UTC", + &fake_time); + tt_int_op(retval, OP_EQ, 0); + next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time); + /* Compare it with the correct result */ + format_iso_time(tbuf, next_tp_start_time); + tt_str_op("2016-04-13 00:06:00", OP_EQ, tbuf); + } + + done: + ; +} + +/* Cleanup the global nodelist. It also frees the "md" in the node_t because + * we allocate the memory in helper_add_hsdir_to_networkstatus(). */ +static void +cleanup_nodelist(void) +{ + smartlist_t *nodelist = nodelist_get_list(); + SMARTLIST_FOREACH_BEGIN(nodelist, node_t *, node) { + tor_free(node->md); + node->md = NULL; + } SMARTLIST_FOREACH_END(node); + nodelist_free_all(); +} + +static void +helper_add_hsdir_to_networkstatus(networkstatus_t *ns, + int identity_idx, + const char *nickname, + int is_hsdir) +{ + routerstatus_t *rs = tor_malloc_zero(sizeof(routerstatus_t)); + routerinfo_t *ri = tor_malloc_zero(sizeof(routerinfo_t)); + uint8_t identity[DIGEST_LEN]; + tor_addr_t ipv4_addr; + + memset(identity, identity_idx, sizeof(identity)); + + memcpy(rs->identity_digest, identity, DIGEST_LEN); + rs->is_hs_dir = is_hsdir; + rs->supports_v3_hsdir = 1; + strlcpy(rs->nickname, nickname, sizeof(rs->nickname)); + tor_addr_parse(&ipv4_addr, "1.2.3.4"); + ri->addr = tor_addr_to_ipv4h(&ipv4_addr); + rs->addr = tor_addr_to_ipv4h(&ipv4_addr); + ri->nickname = tor_strdup(nickname); + ri->protocol_list = tor_strdup("HSDir=1-2 LinkAuth=3"); + memcpy(ri->cache_info.identity_digest, identity, DIGEST_LEN); + ri->cache_info.signing_key_cert = tor_malloc_zero(sizeof(tor_cert_t)); + /* Needed for the HSDir index computation. */ + memset(&ri->cache_info.signing_key_cert->signing_key, + identity_idx, ED25519_PUBKEY_LEN); + tt_assert(nodelist_set_routerinfo(ri, NULL)); + node_t *node = node_get_mutable_by_id(ri->cache_info.identity_digest); + tt_assert(node); + node->rs = rs; + /* We need this to exist for node_has_descriptor() to return true. */ + node->md = tor_malloc_zero(sizeof(microdesc_t)); + /* Do this now the nodelist_set_routerinfo() function needs a "rs" to set + * the indexes which it doesn't have when it is called. */ + node_set_hsdir_index(node, ns); + node->ri = NULL; + smartlist_add(ns->routerstatus_list, rs); + + done: + routerinfo_free(ri); +} + +static networkstatus_t *mock_ns = NULL; + +static networkstatus_t * +mock_networkstatus_get_latest_consensus(void) +{ + time_t now = approx_time(); + + /* If initialized, return it */ + if (mock_ns) { + return mock_ns; + } + + /* Initialize fake consensus */ + mock_ns = tor_malloc_zero(sizeof(networkstatus_t)); + + /* This consensus is live */ + mock_ns->valid_after = now-1; + mock_ns->fresh_until = now+1; + mock_ns->valid_until = now+2; + /* Create routerstatus list */ + mock_ns->routerstatus_list = smartlist_new(); + mock_ns->type = NS_TYPE_CONSENSUS; + + return mock_ns; +} + +static networkstatus_t * +mock_networkstatus_get_live_consensus(time_t now) +{ + (void) now; + + tt_assert(mock_ns); + + done: + return mock_ns; +} + +/** Test the responsible HSDirs calculation function */ +static void +test_responsible_hsdirs(void *arg) +{ + time_t now = approx_time(); + smartlist_t *responsible_dirs = smartlist_new(); + networkstatus_t *ns = NULL; + int retval; + + (void) arg; + + hs_init(); + + MOCK(networkstatus_get_latest_consensus, + mock_networkstatus_get_latest_consensus); + + ns = networkstatus_get_latest_consensus(); + + { /* First router: HSdir */ + helper_add_hsdir_to_networkstatus(ns, 1, "igor", 1); + } + + { /* Second HSDir */ + helper_add_hsdir_to_networkstatus(ns, 2, "victor", 1); + } + + { /* Third relay but not HSDir */ + helper_add_hsdir_to_networkstatus(ns, 3, "spyro", 0); + } + + ed25519_keypair_t kp; + retval = ed25519_keypair_generate(&kp, 0); + tt_int_op(retval, OP_EQ , 0); + + uint64_t time_period_num = hs_get_time_period_num(now); + hs_get_responsible_hsdirs(&kp.pubkey, time_period_num, + 0, 0, responsible_dirs); + + /* Make sure that we only found 2 responsible HSDirs. + * The third relay was not an hsdir! */ + tt_int_op(smartlist_len(responsible_dirs), OP_EQ, 2); + + /** TODO: Build a bigger network and do more tests here */ + + done: + SMARTLIST_FOREACH(ns->routerstatus_list, + routerstatus_t *, rs, routerstatus_free(rs)); + smartlist_free(responsible_dirs); + smartlist_clear(ns->routerstatus_list); + networkstatus_vote_free(mock_ns); + cleanup_nodelist(); +} + +static void +mock_directory_initiate_request(directory_request_t *req) +{ + (void)req; + return; +} + +static int +mock_hs_desc_encode_descriptor(const hs_descriptor_t *desc, + const ed25519_keypair_t *signing_kp, + char **encoded_out) +{ + (void)desc; + (void)signing_kp; + + tor_asprintf(encoded_out, "lulu"); + return 0; +} + +static or_state_t dummy_state; + +/* Mock function to get fake or state (used for rev counters) */ +static or_state_t * +get_or_state_replacement(void) +{ + return &dummy_state; +} + +static int +mock_router_have_minimum_dir_info(void) +{ + return 1; +} + +/** Test that we correctly detect when the HSDir hash ring changes so that we + * reupload our descriptor. */ +static void +test_desc_reupload_logic(void *arg) +{ + networkstatus_t *ns = NULL; + + (void) arg; + + hs_init(); + + MOCK(router_have_minimum_dir_info, + mock_router_have_minimum_dir_info); + MOCK(get_or_state, + get_or_state_replacement); + MOCK(networkstatus_get_latest_consensus, + mock_networkstatus_get_latest_consensus); + MOCK(directory_initiate_request, + mock_directory_initiate_request); + MOCK(hs_desc_encode_descriptor, + mock_hs_desc_encode_descriptor); + + ns = networkstatus_get_latest_consensus(); + + /** Test logic: + * 1) Upload descriptor to HSDirs + * CHECK that previous_hsdirs list was populated. + * 2) Then call router_dir_info_changed() without an HSDir set change. + * CHECK that no reuplod occurs. + * 3) Now change the HSDir set, and call dir_info_changed() again. + * CHECK that reupload occurs. + * 4) Finally call service_desc_schedule_upload(). + * CHECK that previous_hsdirs list was cleared. + **/ + + /* Let's start by building our descriptor and service */ + hs_service_descriptor_t *desc = service_descriptor_new(); + hs_service_t *service = NULL; + /* hex-encoded ed25519 pubkey used in hs_build_address.py */ + char pubkey_hex[] = + "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"; + char onion_addr[HS_SERVICE_ADDR_LEN_BASE32 + 1]; + ed25519_public_key_t pubkey; + base16_decode((char*)pubkey.pubkey, sizeof(pubkey.pubkey), + pubkey_hex, strlen(pubkey_hex)); + hs_build_address(&pubkey, HS_VERSION_THREE, onion_addr); + service = tor_malloc_zero(sizeof(hs_service_t)); + memcpy(service->onion_address, onion_addr, sizeof(service->onion_address)); + ed25519_secret_key_generate(&service->keys.identity_sk, 0); + ed25519_public_key_generate(&service->keys.identity_pk, + &service->keys.identity_sk); + service->desc_current = desc; + /* Also add service to service map */ + hs_service_ht *service_map = get_hs_service_map(); + tt_assert(service_map); + tt_int_op(hs_service_get_num_services(), OP_EQ, 0); + register_service(service_map, service); + tt_int_op(hs_service_get_num_services(), OP_EQ, 1); + + /* Now let's create our hash ring: */ + { + helper_add_hsdir_to_networkstatus(ns, 1, "dingus", 1); + helper_add_hsdir_to_networkstatus(ns, 2, "clive", 1); + helper_add_hsdir_to_networkstatus(ns, 3, "aaron", 1); + helper_add_hsdir_to_networkstatus(ns, 4, "lizzie", 1); + helper_add_hsdir_to_networkstatus(ns, 5, "daewon", 1); + helper_add_hsdir_to_networkstatus(ns, 6, "clarke", 1); + } + + /* Now let's upload our desc to all hsdirs */ + upload_descriptor_to_all(service, desc); + /* Check that previous hsdirs were populated */ + tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 6); + + /* Poison next upload time so that we can see if it was changed by + * router_dir_info_changed(). No changes in hash ring so far, so the upload + * time should stay as is. */ + desc->next_upload_time = 42; + router_dir_info_changed(); + tt_int_op(desc->next_upload_time, OP_EQ, 42); + + /* Now change the HSDir hash ring by swapping nora for aaron. + * Start by clearing the hash ring */ + { + SMARTLIST_FOREACH(ns->routerstatus_list, + routerstatus_t *, rs, routerstatus_free(rs)); + smartlist_clear(ns->routerstatus_list); + cleanup_nodelist(); + routerlist_free_all(); + } + + { /* Now add back all the nodes */ + helper_add_hsdir_to_networkstatus(ns, 1, "dingus", 1); + helper_add_hsdir_to_networkstatus(ns, 2, "clive", 1); + helper_add_hsdir_to_networkstatus(ns, 4, "lizzie", 1); + helper_add_hsdir_to_networkstatus(ns, 5, "daewon", 1); + helper_add_hsdir_to_networkstatus(ns, 6, "clarke", 1); + helper_add_hsdir_to_networkstatus(ns, 7, "nora", 1); + } + + /* Now call service_desc_hsdirs_changed() and see that it detected the hash + ring change */ + time_t now = approx_time(); + tt_assert(now); + tt_int_op(service_desc_hsdirs_changed(service, desc), OP_EQ, 1); + tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 6); + + /* Now order another upload and see that we keep having 6 prev hsdirs */ + upload_descriptor_to_all(service, desc); + /* Check that previous hsdirs were populated */ + tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 6); + + /* Now restore the HSDir hash ring to its original state by swapping back + aaron for nora */ + /* First clear up the hash ring */ + { + SMARTLIST_FOREACH(ns->routerstatus_list, + routerstatus_t *, rs, routerstatus_free(rs)); + smartlist_clear(ns->routerstatus_list); + cleanup_nodelist(); + routerlist_free_all(); + } + + { /* Now populate the hash ring again */ + helper_add_hsdir_to_networkstatus(ns, 1, "dingus", 1); + helper_add_hsdir_to_networkstatus(ns, 2, "clive", 1); + helper_add_hsdir_to_networkstatus(ns, 3, "aaron", 1); + helper_add_hsdir_to_networkstatus(ns, 4, "lizzie", 1); + helper_add_hsdir_to_networkstatus(ns, 5, "daewon", 1); + helper_add_hsdir_to_networkstatus(ns, 6, "clarke", 1); + } + + /* Check that our algorithm catches this change of hsdirs */ + tt_int_op(service_desc_hsdirs_changed(service, desc), OP_EQ, 1); + + /* Now pretend that the descriptor changed, and order a reupload to all + HSDirs. Make sure that the set of previous HSDirs was cleared. */ + service_desc_schedule_upload(desc, now, 1); + tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 0); + + /* Now reupload again: see that the prev hsdir set got populated again. */ + upload_descriptor_to_all(service, desc); + tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 6); + + done: + SMARTLIST_FOREACH(ns->routerstatus_list, + routerstatus_t *, rs, routerstatus_free(rs)); + smartlist_clear(ns->routerstatus_list); + networkstatus_vote_free(ns); + cleanup_nodelist(); + hs_free_all(); +} + +/** Test disaster SRV computation and caching */ +static void +test_disaster_srv(void *arg) +{ + uint8_t *cached_disaster_srv_one = NULL; + uint8_t *cached_disaster_srv_two = NULL; + uint8_t srv_one[DIGEST256_LEN] = {0}; + uint8_t srv_two[DIGEST256_LEN] = {0}; + uint8_t srv_three[DIGEST256_LEN] = {0}; + uint8_t srv_four[DIGEST256_LEN] = {0}; + uint8_t srv_five[DIGEST256_LEN] = {0}; + + (void) arg; + + /* Get the cached SRVs: we gonna use them later for verification */ + cached_disaster_srv_one = get_first_cached_disaster_srv(); + cached_disaster_srv_two = get_second_cached_disaster_srv(); + + /* Compute some srvs */ + get_disaster_srv(1, srv_one); + get_disaster_srv(2, srv_two); + + /* Check that the cached ones where updated */ + tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_one, DIGEST256_LEN); + tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_two, DIGEST256_LEN); + + /* Ask for an SRV that has already been computed */ + get_disaster_srv(2, srv_two); + /* and check that the cache entries have not changed */ + tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_one, DIGEST256_LEN); + tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_two, DIGEST256_LEN); + + /* Ask for a new SRV */ + get_disaster_srv(3, srv_three); + tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_three, DIGEST256_LEN); + tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_two, DIGEST256_LEN); + + /* Ask for another SRV: none of the original SRVs should now be cached */ + get_disaster_srv(4, srv_four); + tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_three, DIGEST256_LEN); + tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_four, DIGEST256_LEN); + + /* Ask for yet another SRV */ + get_disaster_srv(5, srv_five); + tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_five, DIGEST256_LEN); + tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_four, DIGEST256_LEN); + + done: + ; +} + +/** Test our HS descriptor request tracker by making various requests and + * checking whether they get tracked properly. */ +static void +test_hid_serv_request_tracker(void *arg) +{ + (void) arg; + time_t retval; + routerstatus_t *hsdir = NULL, *hsdir2 = NULL, *hsdir3 = NULL; + time_t now = approx_time(); + + const char *req_key_str_first = + "vd4zb6zesaubtrjvdqcr2w7x7lhw2up4Xnw4526ThUNbL5o1go+EdUuEqlKxHkNbnK41pRzizzs"; + const char *req_key_str_second = + "g53o7iavcd62oihswhr24u6czmqws5kpXnw4526ThUNbL5o1go+EdUuEqlKxHkNbnK41pRzizzs"; + const char *req_key_str_small = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"; + + /*************************** basic test *******************************/ + + /* Get request tracker and make sure it's empty */ + strmap_t *request_tracker = get_last_hid_serv_requests(); + tt_int_op(strmap_size(request_tracker),OP_EQ, 0); + + /* Let's register a hid serv request */ + hsdir = tor_malloc_zero(sizeof(routerstatus_t)); + memset(hsdir->identity_digest, 'Z', DIGEST_LEN); + retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_first, + now, 1); + tt_int_op(retval, OP_EQ, now); + tt_int_op(strmap_size(request_tracker),OP_EQ, 1); + + /* Let's lookup a non-existent hidserv request */ + retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_second, + now+1, 0); + tt_int_op(retval, OP_EQ, 0); + tt_int_op(strmap_size(request_tracker),OP_EQ, 1); + + /* Let's lookup a real hidserv request */ + retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_first, + now+2, 0); + tt_int_op(retval, OP_EQ, now); /* we got it */ + tt_int_op(strmap_size(request_tracker),OP_EQ, 1); + + /**********************************************************************/ + + /* Let's add another request for the same HS but on a different HSDir. */ + hsdir2 = tor_malloc_zero(sizeof(routerstatus_t)); + memset(hsdir2->identity_digest, 2, DIGEST_LEN); + retval = hs_lookup_last_hid_serv_request(hsdir2, req_key_str_first, + now+3, 1); + tt_int_op(retval, OP_EQ, now+3); + tt_int_op(strmap_size(request_tracker),OP_EQ, 2); + + /* Check that we can clean the first request based on time */ + hs_clean_last_hid_serv_requests(now+3+REND_HID_SERV_DIR_REQUERY_PERIOD); + tt_int_op(strmap_size(request_tracker),OP_EQ, 1); + /* Check that it doesn't exist anymore */ + retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_first, + now+2, 0); + tt_int_op(retval, OP_EQ, 0); + + /* Now let's add a smaller req key str */ + hsdir3 = tor_malloc_zero(sizeof(routerstatus_t)); + memset(hsdir3->identity_digest, 3, DIGEST_LEN); + retval = hs_lookup_last_hid_serv_request(hsdir3, req_key_str_small, + now+4, 1); + tt_int_op(retval, OP_EQ, now+4); + tt_int_op(strmap_size(request_tracker),OP_EQ, 2); + + /*************************** deleting entries **************************/ + + /* Add another request with very short key */ + retval = hs_lookup_last_hid_serv_request(hsdir, "l", now, 1); + tt_int_op(retval, OP_EQ, now); + tt_int_op(strmap_size(request_tracker),OP_EQ, 3); + + /* Try deleting entries with a dummy key. Check that our previous requests + * are still there */ + tor_capture_bugs_(1); + hs_purge_hid_serv_from_last_hid_serv_requests("a"); + tt_int_op(strmap_size(request_tracker),OP_EQ, 3); + tor_end_capture_bugs_(); + + /* Try another dummy key. Check that requests are still there */ + { + char dummy[2000]; + memset(dummy, 'Z', 2000); + dummy[1999] = '\x00'; + hs_purge_hid_serv_from_last_hid_serv_requests(dummy); + tt_int_op(strmap_size(request_tracker),OP_EQ, 3); + } + + /* Another dummy key! */ + hs_purge_hid_serv_from_last_hid_serv_requests(req_key_str_second); + tt_int_op(strmap_size(request_tracker),OP_EQ, 3); + + /* Now actually delete a request! */ + hs_purge_hid_serv_from_last_hid_serv_requests(req_key_str_first); + tt_int_op(strmap_size(request_tracker),OP_EQ, 2); + + /* Purge it all! */ + hs_purge_last_hid_serv_requests(); + request_tracker = get_last_hid_serv_requests(); + tt_int_op(strmap_size(request_tracker),OP_EQ, 0); + + done: + tor_free(hsdir); + tor_free(hsdir2); + tor_free(hsdir3); +} + +static void +test_parse_extended_hostname(void *arg) +{ + (void) arg; + + char address1[] = "fooaddress.onion"; + char address2[] = "aaaaaaaaaaaaaaaa.onion"; + char address3[] = "fooaddress.exit"; + char address4[] = "www.torproject.org"; + char address5[] = "foo.abcdefghijklmnop.onion"; + char address6[] = "foo.bar.abcdefghijklmnop.onion"; + char address7[] = ".abcdefghijklmnop.onion"; + char address8[] = + "www.25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid.onion"; + + tt_assert(BAD_HOSTNAME == parse_extended_hostname(address1)); + tt_assert(ONION_V2_HOSTNAME == parse_extended_hostname(address2)); + tt_str_op(address2,OP_EQ, "aaaaaaaaaaaaaaaa"); + tt_assert(EXIT_HOSTNAME == parse_extended_hostname(address3)); + tt_assert(NORMAL_HOSTNAME == parse_extended_hostname(address4)); + tt_assert(ONION_V2_HOSTNAME == parse_extended_hostname(address5)); + tt_str_op(address5,OP_EQ, "abcdefghijklmnop"); + tt_assert(ONION_V2_HOSTNAME == parse_extended_hostname(address6)); + tt_str_op(address6,OP_EQ, "abcdefghijklmnop"); + tt_assert(BAD_HOSTNAME == parse_extended_hostname(address7)); + tt_assert(ONION_V3_HOSTNAME == parse_extended_hostname(address8)); + tt_str_op(address8, OP_EQ, + "25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid"); + + done: ; +} + +static void +test_time_between_tp_and_srv(void *arg) +{ + int ret; + networkstatus_t ns; + (void) arg; + + /* This function should be returning true where "^" are: + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|-----------$===========| | + * | ^^^^^^^^^^^^ ^^^^^^^^^^^^ | + * | | + * +------------------------------------------------------------------+ + */ + + ret = parse_rfc1123_time("Sat, 26 Oct 1985 00:00:00 UTC", &ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 01:00:00 UTC", &ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), ns.valid_after); + ret = hs_in_period_between_tp_and_srv(&ns, 0); + tt_int_op(ret, OP_EQ, 0); + + ret = parse_rfc1123_time("Sat, 26 Oct 1985 11:00:00 UTC", &ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 12:00:00 UTC", &ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), ns.valid_after); + ret = hs_in_period_between_tp_and_srv(&ns, 0); + tt_int_op(ret, OP_EQ, 0); + + ret = parse_rfc1123_time("Sat, 26 Oct 1985 12:00:00 UTC", &ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", &ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), ns.valid_after); + ret = hs_in_period_between_tp_and_srv(&ns, 0); + tt_int_op(ret, OP_EQ, 1); + + ret = parse_rfc1123_time("Sat, 26 Oct 1985 23:00:00 UTC", &ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 27 Oct 1985 00:00:00 UTC", &ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), ns.valid_after); + ret = hs_in_period_between_tp_and_srv(&ns, 0); + tt_int_op(ret, OP_EQ, 1); + + ret = parse_rfc1123_time("Sat, 27 Oct 1985 00:00:00 UTC", &ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 27 Oct 1985 01:00:00 UTC", &ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), ns.valid_after); + ret = hs_in_period_between_tp_and_srv(&ns, 0); + tt_int_op(ret, OP_EQ, 0); + + done: + ; +} + +/************ Reachability Test (it is huge) ****************/ + +/* Simulate different consensus for client and service. Used by the + * reachability test. The SRV and responsible HSDir list are used by all + * reachability tests so make them common to simplify setup and teardown. */ +static networkstatus_t *mock_service_ns = NULL; +static networkstatus_t *mock_client_ns = NULL; +static sr_srv_t current_srv, previous_srv; +static smartlist_t *service_responsible_hsdirs = NULL; +static smartlist_t *client_responsible_hsdirs = NULL; + +static networkstatus_t * +mock_networkstatus_get_live_consensus_service(time_t now) +{ + (void) now; + + if (mock_service_ns) { + return mock_service_ns; + } + + mock_service_ns = tor_malloc_zero(sizeof(networkstatus_t)); + mock_service_ns->routerstatus_list = smartlist_new(); + mock_service_ns->type = NS_TYPE_CONSENSUS; + + return mock_service_ns; +} + +static networkstatus_t * +mock_networkstatus_get_latest_consensus_service(void) +{ + return mock_networkstatus_get_live_consensus_service(0); +} + +static networkstatus_t * +mock_networkstatus_get_live_consensus_client(time_t now) +{ + (void) now; + + if (mock_client_ns) { + return mock_client_ns; + } + + mock_client_ns = tor_malloc_zero(sizeof(networkstatus_t)); + mock_client_ns->routerstatus_list = smartlist_new(); + mock_client_ns->type = NS_TYPE_CONSENSUS; + + return mock_client_ns; +} + +static networkstatus_t * +mock_networkstatus_get_latest_consensus_client(void) +{ + return mock_networkstatus_get_live_consensus_client(0); +} + +/* Mock function because we are not trying to test the close circuit that does + * an awful lot of checks on the circuit object. */ +static void +mock_circuit_mark_for_close(circuit_t *circ, int reason, int line, + const char *file) +{ + (void) circ; + (void) reason; + (void) line; + (void) file; + return; +} + +/* Initialize a big HSDir V3 hash ring. */ +static void +helper_initialize_big_hash_ring(networkstatus_t *ns) +{ + int ret; + + /* Generate 250 hsdirs! :) */ + for (int counter = 1 ; counter < 251 ; counter++) { + /* Let's generate random nickname for each hsdir... */ + char nickname_binary[8]; + char nickname_str[13] = {0}; + crypto_rand(nickname_binary, sizeof(nickname_binary)); + ret = base64_encode(nickname_str, sizeof(nickname_str), + nickname_binary, sizeof(nickname_binary), 0); + tt_int_op(ret, OP_EQ, 12); + helper_add_hsdir_to_networkstatus(ns, counter, nickname_str, 1); + } + + /* Make sure we have 200 hsdirs in our list */ + tt_int_op(smartlist_len(ns->routerstatus_list), OP_EQ, 250); + + done: + ; +} + +/** Initialize service and publish its descriptor as needed. Return the newly + * allocated service object to the caller. */ +static hs_service_t * +helper_init_service(time_t now) +{ + int retval; + hs_service_t *service = hs_service_new(get_options()); + tt_assert(service); + service->config.version = HS_VERSION_THREE; + ed25519_secret_key_generate(&service->keys.identity_sk, 0); + ed25519_public_key_generate(&service->keys.identity_pk, + &service->keys.identity_sk); + /* Register service to global map. */ + retval = register_service(get_hs_service_map(), service); + tt_int_op(retval, OP_EQ, 0); + + /* Initialize service descriptor */ + build_all_descriptors(now); + tt_assert(service->desc_current); + tt_assert(service->desc_next); + + done: + return service; +} + +/* Helper function to set the RFC 1123 time string into t. */ +static void +set_consensus_times(const char *time, time_t *t) +{ + tt_assert(time); + tt_assert(t); + + int ret = parse_rfc1123_time(time, t); + tt_int_op(ret, OP_EQ, 0); + + done: + return; +} + +/* Helper function to cleanup the mock consensus (client and service) */ +static void +cleanup_mock_ns(void) +{ + if (mock_service_ns) { + SMARTLIST_FOREACH(mock_service_ns->routerstatus_list, + routerstatus_t *, rs, routerstatus_free(rs)); + smartlist_clear(mock_service_ns->routerstatus_list); + mock_service_ns->sr_info.current_srv = NULL; + mock_service_ns->sr_info.previous_srv = NULL; + networkstatus_vote_free(mock_service_ns); + mock_service_ns = NULL; + } + + if (mock_client_ns) { + SMARTLIST_FOREACH(mock_client_ns->routerstatus_list, + routerstatus_t *, rs, routerstatus_free(rs)); + smartlist_clear(mock_client_ns->routerstatus_list); + mock_client_ns->sr_info.current_srv = NULL; + mock_client_ns->sr_info.previous_srv = NULL; + networkstatus_vote_free(mock_client_ns); + mock_client_ns = NULL; + } +} + +/* Helper function to setup a reachability test. Once called, the + * cleanup_reachability_test MUST be called at the end. */ +static void +setup_reachability_test(void) +{ + MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); + MOCK(get_or_state, get_or_state_replacement); + + hs_init(); + + /* Baseline to start with. */ + memset(¤t_srv, 0, sizeof(current_srv)); + memset(&previous_srv, 1, sizeof(previous_srv)); + + /* Initialize the consensuses. */ + mock_networkstatus_get_latest_consensus_service(); + mock_networkstatus_get_latest_consensus_client(); + + service_responsible_hsdirs = smartlist_new(); + client_responsible_hsdirs = smartlist_new(); +} + +/* Helper function to cleanup a reachability test initial setup. */ +static void +cleanup_reachability_test(void) +{ + smartlist_free(service_responsible_hsdirs); + service_responsible_hsdirs = NULL; + smartlist_free(client_responsible_hsdirs); + client_responsible_hsdirs = NULL; + hs_free_all(); + cleanup_mock_ns(); + UNMOCK(get_or_state); + UNMOCK(circuit_mark_for_close_); +} + +/* A reachability test always check if the resulting service and client + * responsible HSDir for the given parameters are equal. + * + * Return true iff the same exact nodes are in both list. */ +static int +are_responsible_hsdirs_equal(void) +{ + int count = 0; + tt_int_op(smartlist_len(client_responsible_hsdirs), OP_EQ, 6); + tt_int_op(smartlist_len(service_responsible_hsdirs), OP_EQ, 8); + + SMARTLIST_FOREACH_BEGIN(client_responsible_hsdirs, + const routerstatus_t *, c_rs) { + SMARTLIST_FOREACH_BEGIN(service_responsible_hsdirs, + const routerstatus_t *, s_rs) { + if (tor_memeq(c_rs->identity_digest, s_rs->identity_digest, + DIGEST_LEN)) { + count++; + break; + } + } SMARTLIST_FOREACH_END(s_rs); + } SMARTLIST_FOREACH_END(c_rs); + + done: + return (count == 6); +} + +/* Tor doesn't use such a function to get the previous HSDir, it is only used + * in node_set_hsdir_index(). We need it here so we can test the reachability + * scenario 6 that requires the previous time period to compute the list of + * responsible HSDir because of the client state timing. */ +static uint64_t +get_previous_time_period(time_t now) +{ + return hs_get_time_period_num(now) - 1; +} + +/* Configuration of a reachability test scenario. */ +typedef struct reachability_cfg_t { + /* Consensus timings to be set. They have to be compliant with + * RFC 1123 time format. */ + const char *service_valid_after; + const char *service_valid_until; + const char *client_valid_after; + const char *client_valid_until; + + /* SRVs that the service and client should use. */ + sr_srv_t *service_current_srv; + sr_srv_t *service_previous_srv; + sr_srv_t *client_current_srv; + sr_srv_t *client_previous_srv; + + /* A time period function for the service to use for this scenario. For a + * successful reachability test, the client always use the current time + * period thus why no client function. */ + uint64_t (*service_time_period_fn)(time_t); + + /* Is the client and service expected to be in a new time period. After + * setting the consensus time, the reachability test checks + * hs_in_period_between_tp_and_srv() and test the returned value against + * this. */ + unsigned int service_in_new_tp; + unsigned int client_in_new_tp; + + /* Some scenario requires a hint that the client, because of its consensus + * time, will request the "next" service descriptor so this indicates if it + * is the case or not. */ + unsigned int client_fetch_next_desc; +} reachability_cfg_t; + +/* Some defines to help with semantic while reading a configuration below. */ +#define NOT_IN_NEW_TP 0 +#define IN_NEW_TP 1 +#define DONT_NEED_NEXT_DESC 0 +#define NEED_NEXT_DESC 1 + +static reachability_cfg_t reachability_scenarios[] = { + /* Scenario 1 + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|-----------$===========| | + * | ^ ^ | + * | S C | + * +------------------------------------------------------------------+ + * + * S: Service, C: Client + * + * Service consensus valid_after time is set to 13:00 and client to 15:00, + * both are after TP#1 thus have access to SRV#1. Service and client should + * be using TP#1. + */ + + { "Sat, 26 Oct 1985 13:00:00 UTC", /* Service valid_after */ + "Sat, 26 Oct 1985 14:00:00 UTC", /* Service valid_until */ + "Sat, 26 Oct 1985 15:00:00 UTC", /* Client valid_after */ + "Sat, 26 Oct 1985 16:00:00 UTC", /* Client valid_until. */ + ¤t_srv, NULL, /* Service current and previous SRV */ + ¤t_srv, NULL, /* Client current and previous SRV */ + hs_get_time_period_num, /* Service time period function. */ + IN_NEW_TP, /* Is service in new TP? */ + IN_NEW_TP, /* Is client in new TP? */ + NEED_NEXT_DESC }, + + /* Scenario 2 + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|-----------$===========| | + * | ^ ^ | + * | S C | + * +------------------------------------------------------------------+ + * + * S: Service, C: Client + * + * Service consensus valid_after time is set to 23:00 and client to 01:00, + * which makes the client after the SRV#2 and the service just before. The + * service should only be using TP#1. The client should be using TP#1. + */ + + { "Sat, 26 Oct 1985 23:00:00 UTC", /* Service valid_after */ + "Sat, 27 Oct 1985 00:00:00 UTC", /* Service valid_until */ + "Sat, 27 Oct 1985 01:00:00 UTC", /* Client valid_after */ + "Sat, 27 Oct 1985 02:00:00 UTC", /* Client valid_until. */ + &previous_srv, NULL, /* Service current and previous SRV */ + ¤t_srv, &previous_srv, /* Client current and previous SRV */ + hs_get_time_period_num, /* Service time period function. */ + IN_NEW_TP, /* Is service in new TP? */ + NOT_IN_NEW_TP, /* Is client in new TP? */ + NEED_NEXT_DESC }, + + /* Scenario 3 + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|----------$===========| | + * | ^ ^ | + * | S C | + * +------------------------------------------------------------------+ + * + * S: Service, C: Client + * + * Service consensus valid_after time is set to 03:00 and client to 05:00, + * which makes both after SRV#2. The service should be using TP#1 as its + * current time period. The client should be using TP#1. + */ + + { "Sat, 27 Oct 1985 03:00:00 UTC", /* Service valid_after */ + "Sat, 27 Oct 1985 04:00:00 UTC", /* Service valid_until */ + "Sat, 27 Oct 1985 05:00:00 UTC", /* Client valid_after */ + "Sat, 27 Oct 1985 06:00:00 UTC", /* Client valid_until. */ + ¤t_srv, &previous_srv, /* Service current and previous SRV */ + ¤t_srv, &previous_srv, /* Client current and previous SRV */ + hs_get_time_period_num, /* Service time period function. */ + NOT_IN_NEW_TP, /* Is service in new TP? */ + NOT_IN_NEW_TP, /* Is client in new TP? */ + DONT_NEED_NEXT_DESC }, + + /* Scenario 4 + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|-----------$===========| | + * | ^ ^ | + * | S C | + * +------------------------------------------------------------------+ + * + * S: Service, C: Client + * + * Service consensus valid_after time is set to 11:00 and client to 13:00, + * which makes the service before TP#2 and the client just after. The + * service should be using TP#1 as its current time period and TP#2 as the + * next. The client should be using TP#2 time period. + */ + + { "Sat, 27 Oct 1985 11:00:00 UTC", /* Service valid_after */ + "Sat, 27 Oct 1985 12:00:00 UTC", /* Service valid_until */ + "Sat, 27 Oct 1985 13:00:00 UTC", /* Client valid_after */ + "Sat, 27 Oct 1985 14:00:00 UTC", /* Client valid_until. */ + ¤t_srv, &previous_srv, /* Service current and previous SRV */ + ¤t_srv, &previous_srv, /* Client current and previous SRV */ + hs_get_next_time_period_num, /* Service time period function. */ + NOT_IN_NEW_TP, /* Is service in new TP? */ + IN_NEW_TP, /* Is client in new TP? */ + NEED_NEXT_DESC }, + + /* Scenario 5 + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|-----------$===========| | + * | ^ ^ | + * | C S | + * +------------------------------------------------------------------+ + * + * S: Service, C: Client + * + * Service consensus valid_after time is set to 01:00 and client to 23:00, + * which makes the service after SRV#2 and the client just before. The + * service should be using TP#1 as its current time period and TP#2 as the + * next. The client should be using TP#1 time period. + */ + + { "Sat, 27 Oct 1985 01:00:00 UTC", /* Service valid_after */ + "Sat, 27 Oct 1985 02:00:00 UTC", /* Service valid_until */ + "Sat, 26 Oct 1985 23:00:00 UTC", /* Client valid_after */ + "Sat, 27 Oct 1985 00:00:00 UTC", /* Client valid_until. */ + ¤t_srv, &previous_srv, /* Service current and previous SRV */ + &previous_srv, NULL, /* Client current and previous SRV */ + hs_get_time_period_num, /* Service time period function. */ + NOT_IN_NEW_TP, /* Is service in new TP? */ + IN_NEW_TP, /* Is client in new TP? */ + DONT_NEED_NEXT_DESC }, + + /* Scenario 6 + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|-----------$===========| | + * | ^ ^ | + * | C S | + * +------------------------------------------------------------------+ + * + * S: Service, C: Client + * + * Service consensus valid_after time is set to 13:00 and client to 11:00, + * which makes the service outside after TP#2 and the client just before. + * The service should be using TP#1 as its current time period and TP#2 as + * its next. The client should be using TP#1 time period. + */ + + { "Sat, 27 Oct 1985 13:00:00 UTC", /* Service valid_after */ + "Sat, 27 Oct 1985 14:00:00 UTC", /* Service valid_until */ + "Sat, 27 Oct 1985 11:00:00 UTC", /* Client valid_after */ + "Sat, 27 Oct 1985 12:00:00 UTC", /* Client valid_until. */ + ¤t_srv, &previous_srv, /* Service current and previous SRV */ + ¤t_srv, &previous_srv, /* Client current and previous SRV */ + get_previous_time_period, /* Service time period function. */ + IN_NEW_TP, /* Is service in new TP? */ + NOT_IN_NEW_TP, /* Is client in new TP? */ + DONT_NEED_NEXT_DESC }, + + /* End marker. */ + { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0} +}; + +/* Run a single reachability scenario. num_scenario is the corresponding + * scenario number from the documentation. It is used to log it in case of + * failure so we know which scenario fails. */ +static int +run_reachability_scenario(const reachability_cfg_t *cfg, int num_scenario) +{ + int ret = -1; + hs_service_t *service; + uint64_t service_tp, client_tp; + ed25519_public_key_t service_blinded_pk, client_blinded_pk; + + setup_reachability_test(); + + tt_assert(cfg); + + /* Set service consensus time. */ + set_consensus_times(cfg->service_valid_after, + &mock_service_ns->valid_after); + set_consensus_times(cfg->service_valid_until, + &mock_service_ns->valid_until); + set_consensus_times(cfg->service_valid_until, + &mock_service_ns->fresh_until); + dirvote_recalculate_timing(get_options(), mock_service_ns->valid_after); + /* Set client consensus time. */ + set_consensus_times(cfg->client_valid_after, + &mock_client_ns->valid_after); + set_consensus_times(cfg->client_valid_until, + &mock_client_ns->valid_until); + set_consensus_times(cfg->client_valid_until, + &mock_client_ns->fresh_until); + dirvote_recalculate_timing(get_options(), mock_client_ns->valid_after); + + /* New time period checks for this scenario. */ + tt_int_op(hs_in_period_between_tp_and_srv(mock_service_ns, 0), OP_EQ, + cfg->service_in_new_tp); + tt_int_op(hs_in_period_between_tp_and_srv(mock_client_ns, 0), OP_EQ, + cfg->client_in_new_tp); + + /* Set the SRVs for this scenario. */ + mock_client_ns->sr_info.current_srv = cfg->client_current_srv; + mock_client_ns->sr_info.previous_srv = cfg->client_previous_srv; + mock_service_ns->sr_info.current_srv = cfg->service_current_srv; + mock_service_ns->sr_info.previous_srv = cfg->service_previous_srv; + + /* Initialize a service to get keys. */ + service = helper_init_service(time(NULL)); + + /* + * === Client setup === + */ + + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus_client); + MOCK(networkstatus_get_latest_consensus, + mock_networkstatus_get_latest_consensus_client); + + /* Make networkstatus_is_live() happy. */ + update_approx_time(mock_client_ns->valid_after); + /* Initialize a big hashring for this consensus with the hsdir index set. */ + helper_initialize_big_hash_ring(mock_client_ns); + + /* Client ONLY use the current time period. This is the whole point of these + * reachability test that is to make sure the client can always reach the + * service using only its current time period. */ + client_tp = hs_get_time_period_num(0); + + hs_build_blinded_pubkey(&service->keys.identity_pk, NULL, 0, + client_tp, &client_blinded_pk); + hs_get_responsible_hsdirs(&client_blinded_pk, client_tp, 0, 1, + client_responsible_hsdirs); + /* Cleanup the nodelist so we can let the service computes its own set of + * node with its own hashring. */ + cleanup_nodelist(); + tt_int_op(smartlist_len(client_responsible_hsdirs), OP_EQ, 6); + + UNMOCK(networkstatus_get_latest_consensus); + UNMOCK(networkstatus_get_live_consensus); + + /* + * === Service setup === + */ + + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus_service); + MOCK(networkstatus_get_latest_consensus, + mock_networkstatus_get_latest_consensus_service); + + /* Make networkstatus_is_live() happy. */ + update_approx_time(mock_service_ns->valid_after); + /* Initialize a big hashring for this consensus with the hsdir index set. */ + helper_initialize_big_hash_ring(mock_service_ns); + + service_tp = cfg->service_time_period_fn(0); + + hs_build_blinded_pubkey(&service->keys.identity_pk, NULL, 0, + service_tp, &service_blinded_pk); + + /* A service builds two lists of responsible HSDir, for the current and the + * next descriptor. Depending on the scenario, the client timing indicate if + * it is fetching the current or the next descriptor so we use the + * "client_fetch_next_desc" to know which one the client is trying to get to + * confirm that the service computes the same hashring for the same blinded + * key and service time period function. */ + hs_get_responsible_hsdirs(&service_blinded_pk, service_tp, + cfg->client_fetch_next_desc, 0, + service_responsible_hsdirs); + cleanup_nodelist(); + tt_int_op(smartlist_len(service_responsible_hsdirs), OP_EQ, 8); + + UNMOCK(networkstatus_get_latest_consensus); + UNMOCK(networkstatus_get_live_consensus); + + /* Some testing of the values we just got from the client and service. */ + tt_mem_op(&client_blinded_pk, OP_EQ, &service_blinded_pk, + ED25519_PUBKEY_LEN); + tt_int_op(are_responsible_hsdirs_equal(), OP_EQ, 1); + + /* Everything went well. */ + ret = 0; + + done: + cleanup_reachability_test(); + if (ret == -1) { + /* Do this so we can know which scenario failed. */ + char msg[32]; + tor_snprintf(msg, sizeof(msg), "Scenario %d failed", num_scenario); + tt_fail_msg(msg); + } + return ret; +} + +static void +test_reachability(void *arg) +{ + (void) arg; + + /* NOTE: An important axiom to understand here is that SRV#N must only be + * used with TP#N value. For example, SRV#2 with TP#1 should NEVER be used + * together. The HSDir index computation is based on this axiom.*/ + + for (int i = 0; reachability_scenarios[i].service_valid_after; ++i) { + int ret = run_reachability_scenario(&reachability_scenarios[i], i + 1); + if (ret < 0) { + return; + } + } +} + +/** Pick an HSDir for service with onion_identity_pk as a client. Put + * its identity digest in hsdir_digest_out. */ +static void +helper_client_pick_hsdir(const ed25519_public_key_t *onion_identity_pk, + char *hsdir_digest_out) +{ + tt_assert(onion_identity_pk); + + routerstatus_t *client_hsdir = pick_hsdir_v3(onion_identity_pk); + tt_assert(client_hsdir); + digest_to_base64(hsdir_digest_out, client_hsdir->identity_digest); + + done: + ; +} + +static void +test_hs_indexes(void *arg) +{ + int ret; + uint64_t period_num = 42; + ed25519_public_key_t pubkey; + + (void) arg; + + /* Build the hs_index */ + { + uint8_t hs_index[DIGEST256_LEN]; + const char *b32_test_vector = + "37e5cbbd56a22823714f18f1623ece5983a0d64c78495a8cfab854245e5f9a8a"; + char test_vector[DIGEST256_LEN]; + ret = base16_decode(test_vector, sizeof(test_vector), b32_test_vector, + strlen(b32_test_vector)); + tt_int_op(ret, OP_EQ, sizeof(test_vector)); + /* Our test vector uses a public key set to 32 bytes of \x42. */ + memset(&pubkey, '\x42', sizeof(pubkey)); + hs_build_hs_index(1, &pubkey, period_num, hs_index); + tt_mem_op(hs_index, OP_EQ, test_vector, sizeof(hs_index)); + } + + /* Build the hsdir_index */ + { + uint8_t srv[DIGEST256_LEN]; + uint8_t hsdir_index[DIGEST256_LEN]; + const char *b32_test_vector = + "db475361014a09965e7e5e4d4a25b8f8d4b8f16cb1d8a7e95eed50249cc1a2d5"; + char test_vector[DIGEST256_LEN]; + ret = base16_decode(test_vector, sizeof(test_vector), b32_test_vector, + strlen(b32_test_vector)); + tt_int_op(ret, OP_EQ, sizeof(test_vector)); + /* Our test vector uses a public key set to 32 bytes of \x42. */ + memset(&pubkey, '\x42', sizeof(pubkey)); + memset(srv, '\x43', sizeof(srv)); + hs_build_hsdir_index(&pubkey, srv, period_num, hsdir_index); + tt_mem_op(hsdir_index, OP_EQ, test_vector, sizeof(hsdir_index)); + } + + done: + ; +} + +#define EARLY_IN_SRV_TO_TP 0 +#define LATE_IN_SRV_TO_TP 1 +#define EARLY_IN_TP_TO_SRV 2 +#define LATE_IN_TP_TO_SRV 3 + +/** Set the consensus and system time based on position. See the + * following diagram for details: + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|----------$===========| | + * | | + * | | + * +------------------------------------------------------------------+ + */ +static time_t +helper_set_consensus_and_system_time(networkstatus_t *ns, int position) +{ + time_t real_time = 0; + + /* The period between SRV#N and TP#N is from 00:00 to 12:00 UTC. Consensus + * valid_after is what matters here, the rest is just to specify the voting + * period correctly. */ + if (position == LATE_IN_SRV_TO_TP) { + parse_rfc1123_time("Wed, 13 Apr 2016 11:00:00 UTC", &ns->valid_after); + parse_rfc1123_time("Wed, 13 Apr 2016 12:00:00 UTC", &ns->fresh_until); + parse_rfc1123_time("Wed, 13 Apr 2016 14:00:00 UTC", &ns->valid_until); + } else if (position == EARLY_IN_TP_TO_SRV) { + parse_rfc1123_time("Wed, 13 Apr 2016 13:00:00 UTC", &ns->valid_after); + parse_rfc1123_time("Wed, 13 Apr 2016 14:00:00 UTC", &ns->fresh_until); + parse_rfc1123_time("Wed, 13 Apr 2016 16:00:00 UTC", &ns->valid_until); + } else if (position == LATE_IN_TP_TO_SRV) { + parse_rfc1123_time("Wed, 13 Apr 2016 23:00:00 UTC", &ns->valid_after); + parse_rfc1123_time("Wed, 14 Apr 2016 00:00:00 UTC", &ns->fresh_until); + parse_rfc1123_time("Wed, 14 Apr 2016 02:00:00 UTC", &ns->valid_until); + } else if (position == EARLY_IN_SRV_TO_TP) { + parse_rfc1123_time("Wed, 14 Apr 2016 01:00:00 UTC", &ns->valid_after); + parse_rfc1123_time("Wed, 14 Apr 2016 02:00:00 UTC", &ns->fresh_until); + parse_rfc1123_time("Wed, 14 Apr 2016 04:00:00 UTC", &ns->valid_until); + } else { + tt_assert(0); + } + dirvote_recalculate_timing(get_options(), ns->valid_after); + + /* Set system time: pretend to be just 2 minutes before consensus expiry */ + real_time = ns->valid_until - 120; + update_approx_time(real_time); + + done: + return real_time; +} + +/** Helper function that carries out the actual test for + * test_client_service_sync() */ +static void +helper_test_hsdir_sync(networkstatus_t *ns, + int service_position, int client_position, + int client_fetches_next_desc) +{ + hs_service_descriptor_t *desc; + int retval; + + /** Test logic: + * 1) Initialize service time: consensus and system time. + * 1.1) Initialize service hash ring + * 2) Initialize service and publish descriptors. + * 3) Initialize client time: consensus and system time. + * 3.1) Initialize client hash ring + * 4) Try to fetch descriptor as client, and CHECK that the HSDir picked by + * the client was also picked by service. + */ + + /* 1) Initialize service time: consensus and real time */ + time_t now = helper_set_consensus_and_system_time(ns, service_position); + helper_initialize_big_hash_ring(ns); + + /* 2) Initialize service */ + hs_service_t *service = helper_init_service(now); + desc = client_fetches_next_desc ? service->desc_next : service->desc_current; + + /* Now let's upload our desc to all hsdirs */ + upload_descriptor_to_all(service, desc); + /* Cleanup right now so we don't memleak on error. */ + cleanup_nodelist(); + /* Check that previous hsdirs were populated */ + tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 8); + + /* 3) Initialize client time */ + helper_set_consensus_and_system_time(ns, client_position); + + cleanup_nodelist(); + SMARTLIST_FOREACH(ns->routerstatus_list, + routerstatus_t *, rs, routerstatus_free(rs)); + smartlist_clear(ns->routerstatus_list); + helper_initialize_big_hash_ring(ns); + + /* 4) Pick 6 HSDirs as a client and check that they were also chosen by the + service. */ + for (int y = 0 ; y < 6 ; y++) { + char client_hsdir_b64_digest[BASE64_DIGEST_LEN+1] = {0}; + helper_client_pick_hsdir(&service->keys.identity_pk, + client_hsdir_b64_digest); + + /* CHECK: Go through the hsdirs chosen by the service and make sure that it + * contains the one picked by the client! */ + retval = smartlist_contains_string(desc->previous_hsdirs, + client_hsdir_b64_digest); + tt_int_op(retval, OP_EQ, 1); + } + + /* Finally, try to pick a 7th hsdir and see that NULL is returned since we + * exhausted all of them: */ + tt_assert(!pick_hsdir_v3(&service->keys.identity_pk)); + + done: + /* At the end: free all services and initialize the subsystem again, we will + * need it for next scenario. */ + cleanup_nodelist(); + hs_service_free_all(); + hs_service_init(); + SMARTLIST_FOREACH(ns->routerstatus_list, + routerstatus_t *, rs, routerstatus_free(rs)); + smartlist_clear(ns->routerstatus_list); +} + +/** This test ensures that client and service will pick the same HSDirs, under + * various timing scenarios: + * a) Scenario where both client and service are in the time segment between + * SRV#N and TP#N: + * b) Scenario where both client and service are in the time segment between + * TP#N and SRV#N+1. + * c) Scenario where service is between SRV#N and TP#N, but client is between + * TP#N and SRV#N+1. + * d) Scenario where service is between TP#N and SRV#N+1, but client is + * between SRV#N and TP#N. + * + * This test is important because it tests that upload_descriptor_to_all() is + * in synch with pick_hsdir_v3(). That's not the case for the + * test_reachability() test which only compares the responsible hsdir sets. + */ +static void +test_client_service_hsdir_set_sync(void *arg) +{ + networkstatus_t *ns = NULL; + + (void) arg; + + MOCK(networkstatus_get_latest_consensus, + mock_networkstatus_get_latest_consensus); + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + MOCK(get_or_state, + get_or_state_replacement); + MOCK(hs_desc_encode_descriptor, + mock_hs_desc_encode_descriptor); + MOCK(directory_initiate_request, + mock_directory_initiate_request); + + hs_init(); + + /* Initialize a big hash ring: we want it to be big so that client and + * service cannot accidentally select the same HSDirs */ + ns = networkstatus_get_latest_consensus(); + tt_assert(ns); + + /** Now test the various synch scenarios. See the helper function for more + details: */ + + /* a) Scenario where both client and service are in the time segment between + * SRV#N and TP#N. At this time the client fetches the first HS desc: + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|----------$===========| | + * | ^ ^ | + * | S C | + * +------------------------------------------------------------------+ + */ + helper_test_hsdir_sync(ns, LATE_IN_SRV_TO_TP, LATE_IN_SRV_TO_TP, 0); + + /* b) Scenario where both client and service are in the time segment between + * TP#N and SRV#N+1. At this time the client fetches the second HS + * desc: + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|-----------$===========| | + * | ^ ^ | + * | S C | + * +------------------------------------------------------------------+ + */ + helper_test_hsdir_sync(ns, LATE_IN_TP_TO_SRV, LATE_IN_TP_TO_SRV, 1); + + /* c) Scenario where service is between SRV#N and TP#N, but client is + * between TP#N and SRV#N+1. Client is forward in time so it fetches the + * second HS desc. + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|-----------$===========| | + * | ^ ^ | + * | S C | + * +------------------------------------------------------------------+ + */ + helper_test_hsdir_sync(ns, LATE_IN_SRV_TO_TP, EARLY_IN_TP_TO_SRV, 1); + + /* d) Scenario where service is between TP#N and SRV#N+1, but client is + * between SRV#N and TP#N. Client is backwards in time so it fetches the + * first HS desc. + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|-----------$===========| | + * | ^ ^ | + * | C S | + * +------------------------------------------------------------------+ + */ + helper_test_hsdir_sync(ns, EARLY_IN_TP_TO_SRV, LATE_IN_SRV_TO_TP, 0); + + /* e) Scenario where service is between SRV#N and TP#N, but client is + * between TP#N-1 and SRV#3. Client is backwards in time so it fetches + * the first HS desc. + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|-----------$===========| | + * | ^ ^ | + * | C S | + * +------------------------------------------------------------------+ + */ + helper_test_hsdir_sync(ns, EARLY_IN_SRV_TO_TP, LATE_IN_TP_TO_SRV, 0); + + /* f) Scenario where service is between TP#N and SRV#N+1, but client is + * between SRV#N+1 and TP#N+1. Client is forward in time so it fetches + * the second HS desc. + * + * +------------------------------------------------------------------+ + * | | + * | 00:00 12:00 00:00 12:00 00:00 12:00 | + * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | + * | | + * | $==========|-----------$===========|-----------$===========| | + * | ^ ^ | + * | S C | + * +------------------------------------------------------------------+ + */ + helper_test_hsdir_sync(ns, LATE_IN_TP_TO_SRV, EARLY_IN_SRV_TO_TP, 1); + + done: + networkstatus_vote_free(ns); + nodelist_free_all(); + hs_free_all(); +} + +struct testcase_t hs_common_tests[] = { + { "build_address", test_build_address, TT_FORK, + NULL, NULL }, + { "validate_address", test_validate_address, TT_FORK, + NULL, NULL }, + { "time_period", test_time_period, TT_FORK, + NULL, NULL }, + { "start_time_of_next_time_period", test_start_time_of_next_time_period, + TT_FORK, NULL, NULL }, + { "responsible_hsdirs", test_responsible_hsdirs, TT_FORK, + NULL, NULL }, + { "desc_reupload_logic", test_desc_reupload_logic, TT_FORK, + NULL, NULL }, + { "disaster_srv", test_disaster_srv, TT_FORK, + NULL, NULL }, + { "hid_serv_request_tracker", test_hid_serv_request_tracker, TT_FORK, + NULL, NULL }, + { "parse_extended_hostname", test_parse_extended_hostname, TT_FORK, + NULL, NULL }, + { "time_between_tp_and_srv", test_time_between_tp_and_srv, TT_FORK, + NULL, NULL }, + { "reachability", test_reachability, TT_FORK, + NULL, NULL }, + { "client_service_hsdir_set_sync", test_client_service_hsdir_set_sync, + TT_FORK, NULL, NULL }, + { "hs_indexes", test_hs_indexes, TT_FORK, + NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_hs_config.c b/src/wraith/src/test/test_hs_config.c new file mode 100644 index 000000000..a76be301d --- /dev/null +++ b/src/wraith/src/test/test_hs_config.c @@ -0,0 +1,487 @@ +/* Copyright (c) 2016, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs_config.c + * \brief Test hidden service configuration functionality. + */ + +#define CONFIG_PRIVATE +#define HS_SERVICE_PRIVATE + +#include "test.h" +#include "test_helpers.h" +#include "log_test_helpers.h" + +#include "config.h" +#include "hs_common.h" +#include "hs_config.h" +#include "hs_service.h" +#include "rendservice.h" + +static int +helper_config_service(const char *conf, int validate_only) +{ + int ret = 0; + or_options_t *options = NULL; + tt_assert(conf); + options = helper_parse_options(conf); + tt_assert(options); + ret = hs_config_service_all(options, validate_only); + done: + or_options_free(options); + return ret; +} + +static void +test_invalid_service(void *arg) +{ + int ret; + + (void) arg; + + /* Try with a missing port configuration. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 1\n"; /* Wrong not supported version. */ + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("HiddenServiceVersion must be between 2 and 3"); + teardown_capture_of_logs(); + } + + /* Bad value of HiddenServiceAllowUnknownPorts. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServiceAllowUnknownPorts 2\n"; /* Should be 0 or 1. */ + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("HiddenServiceAllowUnknownPorts must be " + "between 0 and 1, not 2"); + teardown_capture_of_logs(); + } + + /* Bad value of HiddenServiceDirGroupReadable */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServiceDirGroupReadable 2\n"; /* Should be 0 or 1. */ + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("HiddenServiceDirGroupReadable must be " + "between 0 and 1, not 2"); + teardown_capture_of_logs(); + } + + /* Bad value of HiddenServiceMaxStreamsCloseCircuit */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServiceMaxStreamsCloseCircuit 2\n"; /* Should be 0 or 1. */ + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("HiddenServiceMaxStreamsCloseCircuit must " + "be between 0 and 1, not 2"); + teardown_capture_of_logs(); + } + + /* Too much max streams. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 80\n" + "HiddenServiceMaxStreams 65536\n"; /* One too many. */ + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("HiddenServiceMaxStreams must be between " + "0 and 65535, not 65536"); + teardown_capture_of_logs(); + } + + /* Duplicate directory directive. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 80\n" + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 81\n"; + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("Another hidden service is already " + "configured for directory"); + teardown_capture_of_logs(); + } + + /* Bad port. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 65536\n"; + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("Missing or invalid port"); + teardown_capture_of_logs(); + } + + /* Out of order directives. */ + { + const char *conf = + "HiddenServiceVersion 2\n" + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServicePort 80\n"; + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("HiddenServiceVersion with no preceding " + "HiddenServiceDir directive"); + teardown_capture_of_logs(); + } + + done: + ; +} + +static void +test_valid_service(void *arg) +{ + int ret; + + (void) arg; + + /* Mix of v2 and v3. Still valid. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 80\n" + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n" + "HiddenServiceVersion 3\n" + "HiddenServicePort 81\n" + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs3\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 82\n"; + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, 0); + } + + done: + ; +} + +static void +test_invalid_service_v2(void *arg) +{ + int validate_only = 1, ret; + + (void) arg; + + /* Try with a missing port configuration. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n"; + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, validate_only); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("with no ports configured."); + teardown_capture_of_logs(); + } + + /* Too many introduction points. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 80\n" + "HiddenServiceNumIntroductionPoints 11\n"; /* One too many. */ + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, validate_only); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("HiddenServiceNumIntroductionPoints should " + "be between 0 and 10, not 11"); + teardown_capture_of_logs(); + } + + /* Too little introduction points. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 80\n" + "HiddenServiceNumIntroductionPoints -1\n"; + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, validate_only); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("HiddenServiceNumIntroductionPoints should " + "be between 0 and 10, not -1"); + teardown_capture_of_logs(); + } + + /* Bad authorized client type. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 80\n" + "HiddenServiceAuthorizeClient blah alice,bob\n"; /* blah is no good. */ + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, validate_only); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("HiddenServiceAuthorizeClient contains " + "unrecognized auth-type"); + teardown_capture_of_logs(); + } + + done: + ; +} + +static void +test_valid_service_v2(void *arg) +{ + int ret; + + (void) arg; + + /* Valid complex configuration. Basic client authorization. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 80\n" + "HiddenServicePort 22 localhost:22\n" +#ifdef HAVE_SYS_UN_H + "HiddenServicePort 42 unix:/path/to/socket\n" +#endif + "HiddenServiceAuthorizeClient basic alice,bob,eve\n" + "HiddenServiceAllowUnknownPorts 1\n" + "HiddenServiceMaxStreams 42\n" + "HiddenServiceMaxStreamsCloseCircuit 0\n" + "HiddenServiceDirGroupReadable 1\n" + "HiddenServiceNumIntroductionPoints 7\n"; + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, 0); + } + + /* Valid complex configuration. Stealth client authorization. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 65535\n" + "HiddenServicePort 22 1.1.1.1:22\n" +#ifdef HAVE_SYS_UN_H + "HiddenServicePort 9000 unix:/path/to/socket\n" +#endif + "HiddenServiceAuthorizeClient stealth charlie,romeo\n" + "HiddenServiceAllowUnknownPorts 0\n" + "HiddenServiceMaxStreams 42\n" + "HiddenServiceMaxStreamsCloseCircuit 0\n" + "HiddenServiceDirGroupReadable 1\n" + "HiddenServiceNumIntroductionPoints 8\n"; + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, 0); + } + + done: + ; +} + +static void +test_invalid_service_v3(void *arg) +{ + int validate_only = 1, ret; + + (void) arg; + + /* Try with a missing port configuration. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 3\n"; + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, validate_only); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("with no ports configured."); + teardown_capture_of_logs(); + } + + /* Too many introduction points. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 3\n" + "HiddenServicePort 80\n" + "HiddenServiceNumIntroductionPoints 21\n"; /* One too many. */ + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, validate_only); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("HiddenServiceNumIntroductionPoints must " + "be between 3 and 20, not 21."); + teardown_capture_of_logs(); + } + + /* Too little introduction points. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 3\n" + "HiddenServicePort 80\n" + "HiddenServiceNumIntroductionPoints 1\n"; + setup_full_capture_of_logs(LOG_WARN); + ret = helper_config_service(conf, validate_only); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("HiddenServiceNumIntroductionPoints must " + "be between 3 and 20, not 1."); + teardown_capture_of_logs(); + } + + done: + ; +} + +static void +test_valid_service_v3(void *arg) +{ + int ret; + + (void) arg; + + /* Valid complex configuration. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 3\n" + "HiddenServicePort 80\n" + "HiddenServicePort 22 localhost:22\n" +#ifdef HAVE_SYS_UN_H + "HiddenServicePort 42 unix:/path/to/socket\n" +#endif + "HiddenServiceAllowUnknownPorts 1\n" + "HiddenServiceMaxStreams 42\n" + "HiddenServiceMaxStreamsCloseCircuit 0\n" + "HiddenServiceDirGroupReadable 1\n" + "HiddenServiceNumIntroductionPoints 7\n"; + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, 0); + } + + /* Valid complex configuration. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n" + "HiddenServiceVersion 3\n" + "HiddenServicePort 65535\n" + "HiddenServicePort 22 1.1.1.1:22\n" +#ifdef HAVE_SYS_UN_H + "HiddenServicePort 9000 unix:/path/to/socket\n" +#endif + "HiddenServiceAllowUnknownPorts 0\n" + "HiddenServiceMaxStreams 42\n" + "HiddenServiceMaxStreamsCloseCircuit 0\n" + "HiddenServiceDirGroupReadable 1\n" + "HiddenServiceNumIntroductionPoints 20\n"; + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, 0); + } + + /* Mix of v2 and v3. Still valid. */ + { + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 80\n" + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n" + "HiddenServiceVersion 3\n" + "HiddenServicePort 81\n" + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs3\n" + "HiddenServiceVersion 2\n" + "HiddenServicePort 82\n"; + ret = helper_config_service(conf, 1); + tt_int_op(ret, OP_EQ, 0); + } + + done: + ; +} + +static void +test_staging_service_v3(void *arg) +{ + int ret; + + (void) arg; + + /* We don't validate a service object, this is the service test that are in + * charge of doing so. We just check for the stable state after + * registration. */ + + hs_init(); + + /* Time for a valid v3 service that should get staged. */ + const char *conf = + "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n" + "HiddenServiceVersion 3\n" + "HiddenServicePort 65535\n" + "HiddenServicePort 22 1.1.1.1:22\n" +#ifdef HAVE_SYS_UN_H + "HiddenServicePort 9000 unix:/path/to/socket\n" +#endif + "HiddenServiceAllowUnknownPorts 0\n" + "HiddenServiceMaxStreams 42\n" + "HiddenServiceMaxStreamsCloseCircuit 0\n" + "HiddenServiceDirGroupReadable 1\n" + "HiddenServiceNumIntroductionPoints 20\n"; + ret = helper_config_service(conf, 0); + tt_int_op(ret, OP_EQ, 0); + /* Ok, we have a service in our map! Registration went well. */ + tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 1); + /* Make sure we don't have a magic v2 service out of this. */ + tt_int_op(rend_num_services(), OP_EQ, 0); + + done: + hs_free_all(); +} + +struct testcase_t hs_config_tests[] = { + /* Invalid service not specific to any version. */ + { "invalid_service", test_invalid_service, TT_FORK, + NULL, NULL }, + { "valid_service", test_valid_service, TT_FORK, + NULL, NULL }, + + /* Test case only for version 2. */ + { "invalid_service_v2", test_invalid_service_v2, TT_FORK, + NULL, NULL }, + { "valid_service_v2", test_valid_service_v2, TT_FORK, + NULL, NULL }, + + /* Test case only for version 3. */ + { "invalid_service_v3", test_invalid_service_v3, TT_FORK, + NULL, NULL }, + { "valid_service_v3", test_valid_service_v3, TT_FORK, + NULL, NULL }, + + /* Test service staging. */ + { "staging_service_v3", test_staging_service_v3, TT_FORK, + NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_hs_control.c b/src/wraith/src/test/test_hs_control.c new file mode 100644 index 000000000..207a55de6 --- /dev/null +++ b/src/wraith/src/test/test_hs_control.c @@ -0,0 +1,199 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs_control.c + * \brief Unit tests for hidden service control port event and command. + **/ + +#define CONTROL_PRIVATE +#define CIRCUITBUILD_PRIVATE +#define RENDCOMMON_PRIVATE +#define RENDSERVICE_PRIVATE +#define HS_SERVICE_PRIVATE + +#include "or.h" +#include "test.h" +#include "control.h" +#include "config.h" +#include "hs_common.h" +#include "hs_control.h" +#include "nodelist.h" +//#include "rendcommon.h" +//#include "rendservice.h" +//#include "routerset.h" +//#include "circuitbuild.h" +#include "test_helpers.h" + +/* mock ID digest and longname for node that's in nodelist */ +#define HSDIR_EXIST_ID \ + "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \ + "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" +#define STR_HSDIR_EXIST_LONGNAME \ + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=TestDir" +#define STR_HSDIR_NONE_EXIST_LONGNAME \ + "$BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" + +/* Helper global variable for hidden service descriptor event test. + * It's used as a pointer to dynamically created message buffer in + * send_control_event_string_replacement function, which mocks + * send_control_event_string function. + * + * Always free it after use! */ +static char *received_msg = NULL; + +/** Mock function for send_control_event_string + */ +static void +queue_control_event_string_replacement(uint16_t event, char *msg) +{ + (void) event; + tor_free(received_msg); + received_msg = msg; +} + +/** Mock function for node_describe_longname_by_id, it returns either + * STR_HSDIR_EXIST_LONGNAME or STR_HSDIR_NONE_EXIST_LONGNAME + */ +static const char * +node_describe_longname_by_id_replacement(const char *id_digest) +{ + if (!strcmp(id_digest, HSDIR_EXIST_ID)) { + return STR_HSDIR_EXIST_LONGNAME; + } else { + return STR_HSDIR_NONE_EXIST_LONGNAME; + } +} + +/* HSDir fetch index is a series of 'D' */ +#define HSDIR_INDEX_FETCH_HEX \ + "4343434343434343434343434343434343434343434343434343434343434343" +#define HSDIR_INDEX_STORE_HEX \ + "4444444444444444444444444444444444444444444444444444444444444444" + +static const node_t * +mock_node_get_by_id(const char *digest) +{ + static node_t node; + memcpy(node.identity, digest, DIGEST_LEN); + node.hsdir_index = tor_malloc_zero(sizeof(hsdir_index_t)); + memset(node.hsdir_index->fetch, 'C', DIGEST256_LEN); + memset(node.hsdir_index->store_first, 'D', DIGEST256_LEN); + return &node; +} + +static void +test_hs_desc_event(void *arg) +{ + int ret; + char *expected_msg = NULL; + char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1]; + ed25519_keypair_t identity_kp; + ed25519_public_key_t blinded_pk; + char base64_blinded_pk[ED25519_BASE64_LEN + 1]; + routerstatus_t hsdir_rs; + hs_ident_dir_conn_t ident; + + (void) arg; + MOCK(queue_control_event_string, + queue_control_event_string_replacement); + MOCK(node_describe_longname_by_id, + node_describe_longname_by_id_replacement); + MOCK(node_get_by_id, mock_node_get_by_id); + + /* Setup what we need for this test. */ + ed25519_keypair_generate(&identity_kp, 0); + hs_build_address(&identity_kp.pubkey, HS_VERSION_THREE, onion_address); + ret = hs_address_is_valid(onion_address); + tt_int_op(ret, OP_EQ, 1); + memset(&blinded_pk, 'B', sizeof(blinded_pk)); + memset(&hsdir_rs, 0, sizeof(hsdir_rs)); + memcpy(hsdir_rs.identity_digest, HSDIR_EXIST_ID, DIGEST_LEN); + ret = ed25519_public_to_base64(base64_blinded_pk, &blinded_pk); + tt_int_op(ret, OP_EQ, 0); + memcpy(&ident.identity_pk, &identity_kp.pubkey, + sizeof(ed25519_public_key_t)); + memcpy(&ident.blinded_pk, &blinded_pk, sizeof(blinded_pk)); + + /* HS_DESC REQUESTED ... */ + hs_control_desc_event_requested(&identity_kp.pubkey, base64_blinded_pk, + &hsdir_rs); + tor_asprintf(&expected_msg, "650 HS_DESC REQUESTED %s NO_AUTH " + STR_HSDIR_EXIST_LONGNAME " %s HSDIR_INDEX=" + HSDIR_INDEX_FETCH_HEX "\r\n", + onion_address, base64_blinded_pk); + tt_assert(received_msg); + tt_str_op(received_msg, OP_EQ, expected_msg); + tor_free(received_msg); + tor_free(expected_msg); + + /* HS_DESC CREATED... */ + hs_control_desc_event_created(onion_address, &blinded_pk); + tor_asprintf(&expected_msg, "650 HS_DESC CREATED %s UNKNOWN " + "UNKNOWN %s\r\n", + onion_address, base64_blinded_pk); + tt_assert(received_msg); + tt_str_op(received_msg, OP_EQ, expected_msg); + tor_free(received_msg); + tor_free(expected_msg); + + /* HS_DESC UPLOAD... */ + uint8_t hsdir_index_store[DIGEST256_LEN]; + memset(hsdir_index_store, 'D', sizeof(hsdir_index_store)); + hs_control_desc_event_upload(onion_address, HSDIR_EXIST_ID, + &blinded_pk, hsdir_index_store); + tor_asprintf(&expected_msg, "650 HS_DESC UPLOAD %s UNKNOWN " + STR_HSDIR_EXIST_LONGNAME " %s " + "HSDIR_INDEX=" HSDIR_INDEX_STORE_HEX "\r\n", + onion_address, base64_blinded_pk); + tt_assert(received_msg); + tt_str_op(received_msg, OP_EQ, expected_msg); + tor_free(received_msg); + tor_free(expected_msg); + + /* HS_DESC FAILED... */ + hs_control_desc_event_failed(&ident, HSDIR_EXIST_ID, "BAD_DESC"); + tor_asprintf(&expected_msg, "650 HS_DESC FAILED %s NO_AUTH " + STR_HSDIR_EXIST_LONGNAME " %s " + "REASON=BAD_DESC\r\n", + onion_address, base64_blinded_pk); + tt_assert(received_msg); + tt_str_op(received_msg, OP_EQ, expected_msg); + tor_free(received_msg); + tor_free(expected_msg); + + /* HS_DESC RECEIVED... */ + hs_control_desc_event_received(&ident, HSDIR_EXIST_ID); + tor_asprintf(&expected_msg, "650 HS_DESC RECEIVED %s NO_AUTH " + STR_HSDIR_EXIST_LONGNAME " %s\r\n", + onion_address, base64_blinded_pk); + tt_assert(received_msg); + tt_str_op(received_msg, OP_EQ, expected_msg); + tor_free(received_msg); + tor_free(expected_msg); + + /* HS_DESC UPLOADED... */ + hs_control_desc_event_uploaded(&ident, HSDIR_EXIST_ID); + tor_asprintf(&expected_msg, "650 HS_DESC UPLOADED %s UNKNOWN " + STR_HSDIR_EXIST_LONGNAME "\r\n", + onion_address); + tt_assert(received_msg); + tt_str_op(received_msg, OP_EQ, expected_msg); + tor_free(received_msg); + tor_free(expected_msg); + + done: + UNMOCK(queue_control_event_string); + UNMOCK(node_describe_longname_by_id); + UNMOCK(node_get_by_id); + tor_free(received_msg); + tor_free(expected_msg); +} + +struct testcase_t hs_control_tests[] = { + { "hs_desc_event", test_hs_desc_event, TT_FORK, + NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_hs_descriptor.c b/src/wraith/src/test/test_hs_descriptor.c new file mode 100644 index 000000000..9ec183db0 --- /dev/null +++ b/src/wraith/src/test/test_hs_descriptor.c @@ -0,0 +1,895 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs_descriptor.c + * \brief Test hidden service descriptor encoding and decoding. + */ + +#define HS_DESCRIPTOR_PRIVATE + +#include "crypto_ed25519.h" +#include "ed25519_cert.h" +#include "or.h" +#include "hs_descriptor.h" +#include "test.h" +#include "torcert.h" + +#include "hs_test_helpers.h" +#include "test_helpers.h" +#include "log_test_helpers.h" + +#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS +DISABLE_GCC_WARNING(overlength-strings) +/* We allow huge string constants in the unit tests, but not in the code + * at large. */ +#endif +#include "test_hs_descriptor.inc" +ENABLE_GCC_WARNING(overlength-strings) + +/* Test certificate encoding put in a descriptor. */ +static void +test_cert_encoding(void *arg) +{ + int ret; + char *encoded = NULL; + time_t now = time(NULL); + ed25519_keypair_t kp; + ed25519_public_key_t signed_key; + ed25519_secret_key_t secret_key; + tor_cert_t *cert = NULL; + + (void) arg; + + ret = ed25519_keypair_generate(&kp, 0); + tt_int_op(ret, == , 0); + ret = ed25519_secret_key_generate(&secret_key, 0); + tt_int_op(ret, == , 0); + ret = ed25519_public_key_generate(&signed_key, &secret_key); + tt_int_op(ret, == , 0); + + cert = tor_cert_create(&kp, CERT_TYPE_SIGNING_AUTH, &signed_key, + now, 3600 * 2, CERT_FLAG_INCLUDE_SIGNING_KEY); + tt_assert(cert); + + /* Test the certificate encoding function. */ + ret = tor_cert_encode_ed22519(cert, &encoded); + tt_int_op(ret, OP_EQ, 0); + + /* Validated the certificate string. */ + { + char *end, *pos = encoded; + char *b64_cert, buf[256]; + size_t b64_cert_len; + tor_cert_t *parsed_cert; + + tt_int_op(strcmpstart(pos, "-----BEGIN ED25519 CERT-----\n"), OP_EQ, 0); + pos += strlen("-----BEGIN ED25519 CERT-----\n"); + + /* Isolate the base64 encoded certificate and try to decode it. */ + end = strstr(pos, "-----END ED25519 CERT-----"); + tt_assert(end); + b64_cert = pos; + b64_cert_len = end - pos; + ret = base64_decode(buf, sizeof(buf), b64_cert, b64_cert_len); + tt_int_op(ret, OP_GT, 0); + /* Parseable? */ + parsed_cert = tor_cert_parse((uint8_t *) buf, ret); + tt_assert(parsed_cert); + /* Signature is valid? */ + ret = tor_cert_checksig(parsed_cert, &kp.pubkey, now + 10); + tt_int_op(ret, OP_EQ, 0); + ret = tor_cert_eq(cert, parsed_cert); + tt_int_op(ret, OP_EQ, 1); + /* The cert did have the signing key? */ + ret= ed25519_pubkey_eq(&parsed_cert->signing_key, &kp.pubkey); + tt_int_op(ret, OP_EQ, 1); + tor_cert_free(parsed_cert); + + /* Get to the end part of the certificate. */ + pos += b64_cert_len; + tt_int_op(strcmpstart(pos, "-----END ED25519 CERT-----"), OP_EQ, 0); + pos += strlen("-----END ED25519 CERT-----"); + tt_str_op(pos, OP_EQ, ""); + } + + done: + tor_cert_free(cert); + tor_free(encoded); +} + +/* Test the descriptor padding. */ +static void +test_descriptor_padding(void *arg) +{ + char *plaintext; + size_t plaintext_len, padded_len; + uint8_t *padded_plaintext = NULL; + +/* Example: if l = 129, the ceiled division gives 2 and then multiplied by 128 + * to give 256. With l = 127, ceiled division gives 1 then times 128. */ +#define PADDING_EXPECTED_LEN(l) \ + CEIL_DIV(l, HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE) * \ + HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE + + (void) arg; + + { /* test #1: no padding */ + plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE; + plaintext = tor_malloc(plaintext_len); + padded_len = build_plaintext_padding(plaintext, plaintext_len, + &padded_plaintext); + tt_assert(padded_plaintext); + tor_free(plaintext); + /* Make sure our padding has been zeroed. */ + tt_int_op(tor_mem_is_zero((char *) padded_plaintext + plaintext_len, + padded_len - plaintext_len), OP_EQ, 1); + tor_free(padded_plaintext); + /* Never never have a padded length smaller than the plaintext. */ + tt_int_op(padded_len, OP_GE, plaintext_len); + tt_int_op(padded_len, OP_EQ, PADDING_EXPECTED_LEN(plaintext_len)); + } + + { /* test #2: one byte padding? */ + plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE - 1; + plaintext = tor_malloc(plaintext_len); + padded_plaintext = NULL; + padded_len = build_plaintext_padding(plaintext, plaintext_len, + &padded_plaintext); + tt_assert(padded_plaintext); + tor_free(plaintext); + /* Make sure our padding has been zeroed. */ + tt_int_op(tor_mem_is_zero((char *) padded_plaintext + plaintext_len, + padded_len - plaintext_len), OP_EQ, 1); + tor_free(padded_plaintext); + /* Never never have a padded length smaller than the plaintext. */ + tt_int_op(padded_len, OP_GE, plaintext_len); + tt_int_op(padded_len, OP_EQ, PADDING_EXPECTED_LEN(plaintext_len)); + } + + { /* test #3: Lots more bytes of padding? */ + plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE + 1; + plaintext = tor_malloc(plaintext_len); + padded_plaintext = NULL; + padded_len = build_plaintext_padding(plaintext, plaintext_len, + &padded_plaintext); + tt_assert(padded_plaintext); + tor_free(plaintext); + /* Make sure our padding has been zeroed. */ + tt_int_op(tor_mem_is_zero((char *) padded_plaintext + plaintext_len, + padded_len - plaintext_len), OP_EQ, 1); + tor_free(padded_plaintext); + /* Never never have a padded length smaller than the plaintext. */ + tt_int_op(padded_len, OP_GE, plaintext_len); + tt_int_op(padded_len, OP_EQ, PADDING_EXPECTED_LEN(plaintext_len)); + } + + done: + return; +} + +static void +test_link_specifier(void *arg) +{ + ssize_t ret; + hs_desc_link_specifier_t spec; + smartlist_t *link_specifiers = smartlist_new(); + + (void) arg; + + /* Always this port. */ + spec.u.ap.port = 42; + smartlist_add(link_specifiers, &spec); + + /* Test IPv4 for starter. */ + { + char *b64, buf[256]; + uint32_t ipv4; + link_specifier_t *ls; + + spec.type = LS_IPV4; + ret = tor_addr_parse(&spec.u.ap.addr, "1.2.3.4"); + tt_int_op(ret, OP_EQ, AF_INET); + b64 = encode_link_specifiers(link_specifiers); + tt_assert(b64); + + /* Decode it and validate the format. */ + ret = base64_decode(buf, sizeof(buf), b64, strlen(b64)); + tt_int_op(ret, OP_GT, 0); + /* First byte is the number of link specifier. */ + tt_int_op(get_uint8(buf), OP_EQ, 1); + ret = link_specifier_parse(&ls, (uint8_t *) buf + 1, ret - 1); + tt_int_op(ret, OP_EQ, 8); + /* Should be 2 bytes for port and 4 bytes for IPv4. */ + tt_int_op(link_specifier_get_ls_len(ls), OP_EQ, 6); + ipv4 = link_specifier_get_un_ipv4_addr(ls); + tt_int_op(tor_addr_to_ipv4h(&spec.u.ap.addr), OP_EQ, ipv4); + tt_int_op(link_specifier_get_un_ipv4_port(ls), OP_EQ, spec.u.ap.port); + + link_specifier_free(ls); + tor_free(b64); + } + + /* Test IPv6. */ + { + char *b64, buf[256]; + uint8_t ipv6[16]; + link_specifier_t *ls; + + spec.type = LS_IPV6; + ret = tor_addr_parse(&spec.u.ap.addr, "[1:2:3:4::]"); + tt_int_op(ret, OP_EQ, AF_INET6); + b64 = encode_link_specifiers(link_specifiers); + tt_assert(b64); + + /* Decode it and validate the format. */ + ret = base64_decode(buf, sizeof(buf), b64, strlen(b64)); + tt_int_op(ret, OP_GT, 0); + /* First byte is the number of link specifier. */ + tt_int_op(get_uint8(buf), OP_EQ, 1); + ret = link_specifier_parse(&ls, (uint8_t *) buf + 1, ret - 1); + tt_int_op(ret, OP_EQ, 20); + /* Should be 2 bytes for port and 16 bytes for IPv6. */ + tt_int_op(link_specifier_get_ls_len(ls), OP_EQ, 18); + for (unsigned int i = 0; i < sizeof(ipv6); i++) { + ipv6[i] = link_specifier_get_un_ipv6_addr(ls, i); + } + tt_mem_op(tor_addr_to_in6_addr8(&spec.u.ap.addr), OP_EQ, ipv6, + sizeof(ipv6)); + tt_int_op(link_specifier_get_un_ipv6_port(ls), OP_EQ, spec.u.ap.port); + + link_specifier_free(ls); + tor_free(b64); + } + + /* Test legacy. */ + { + char *b64, buf[256]; + uint8_t *id; + link_specifier_t *ls; + + spec.type = LS_LEGACY_ID; + memset(spec.u.legacy_id, 'Y', sizeof(spec.u.legacy_id)); + b64 = encode_link_specifiers(link_specifiers); + tt_assert(b64); + + /* Decode it and validate the format. */ + ret = base64_decode(buf, sizeof(buf), b64, strlen(b64)); + tt_int_op(ret, OP_GT, 0); + /* First byte is the number of link specifier. */ + tt_int_op(get_uint8(buf), OP_EQ, 1); + ret = link_specifier_parse(&ls, (uint8_t *) buf + 1, ret - 1); + /* 20 bytes digest + 1 byte type + 1 byte len. */ + tt_int_op(ret, OP_EQ, 22); + tt_int_op(link_specifier_getlen_un_legacy_id(ls), OP_EQ, DIGEST_LEN); + /* Digest length is 20 bytes. */ + tt_int_op(link_specifier_get_ls_len(ls), OP_EQ, DIGEST_LEN); + id = link_specifier_getarray_un_legacy_id(ls); + tt_mem_op(spec.u.legacy_id, OP_EQ, id, DIGEST_LEN); + + link_specifier_free(ls); + tor_free(b64); + } + + done: + smartlist_free(link_specifiers); +} + +static void +test_encode_descriptor(void *arg) +{ + int ret; + char *encoded = NULL; + ed25519_keypair_t signing_kp; + hs_descriptor_t *desc = NULL; + + (void) arg; + + ret = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(ret, OP_EQ, 0); + desc = hs_helper_build_hs_desc_with_ip(&signing_kp); + ret = hs_desc_encode_descriptor(desc, &signing_kp, &encoded); + tt_int_op(ret, OP_EQ, 0); + tt_assert(encoded); + + done: + hs_descriptor_free(desc); + tor_free(encoded); +} + +static void +test_decode_descriptor(void *arg) +{ + int ret; + char *encoded = NULL; + ed25519_keypair_t signing_kp; + hs_descriptor_t *desc = NULL; + hs_descriptor_t *decoded = NULL; + hs_descriptor_t *desc_no_ip = NULL; + uint8_t subcredential[DIGEST256_LEN]; + + (void) arg; + + ret = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(ret, OP_EQ, 0); + desc = hs_helper_build_hs_desc_with_ip(&signing_kp); + + hs_helper_get_subcred_from_identity_keypair(&signing_kp, + subcredential); + + /* Give some bad stuff to the decoding function. */ + ret = hs_desc_decode_descriptor("hladfjlkjadf", subcredential, &decoded); + tt_int_op(ret, OP_EQ, -1); + + ret = hs_desc_encode_descriptor(desc, &signing_kp, &encoded); + tt_int_op(ret, OP_EQ, 0); + tt_assert(encoded); + + ret = hs_desc_decode_descriptor(encoded, subcredential, &decoded); + tt_int_op(ret, OP_EQ, 0); + tt_assert(decoded); + + hs_helper_desc_equal(desc, decoded); + + /* Decode a descriptor with _no_ introduction points. */ + { + ed25519_keypair_t signing_kp_no_ip; + ret = ed25519_keypair_generate(&signing_kp_no_ip, 0); + tt_int_op(ret, OP_EQ, 0); + hs_helper_get_subcred_from_identity_keypair(&signing_kp_no_ip, + subcredential); + desc_no_ip = hs_helper_build_hs_desc_no_ip(&signing_kp_no_ip); + tt_assert(desc_no_ip); + tor_free(encoded); + ret = hs_desc_encode_descriptor(desc_no_ip, &signing_kp_no_ip, &encoded); + tt_int_op(ret, OP_EQ, 0); + tt_assert(encoded); + hs_descriptor_free(decoded); + ret = hs_desc_decode_descriptor(encoded, subcredential, &decoded); + tt_int_op(ret, OP_EQ, 0); + tt_assert(decoded); + } + + done: + hs_descriptor_free(desc); + hs_descriptor_free(desc_no_ip); + hs_descriptor_free(decoded); + tor_free(encoded); +} + +static void +test_supported_version(void *arg) +{ + int ret; + + (void) arg; + + /* Unsupported. */ + ret = hs_desc_is_supported_version(42); + tt_int_op(ret, OP_EQ, 0); + /* To early. */ + ret = hs_desc_is_supported_version(HS_DESC_SUPPORTED_FORMAT_VERSION_MIN - 1); + tt_int_op(ret, OP_EQ, 0); + /* One too new. */ + ret = hs_desc_is_supported_version(HS_DESC_SUPPORTED_FORMAT_VERSION_MAX + 1); + tt_int_op(ret, OP_EQ, 0); + /* Valid version. */ + ret = hs_desc_is_supported_version(3); + tt_int_op(ret, OP_EQ, 1); + + done: + ; +} + +static void +test_encrypted_data_len(void *arg) +{ + int ret; + size_t value; + + (void) arg; + + /* No length, error. */ + ret = encrypted_data_length_is_valid(0); + tt_int_op(ret, OP_EQ, 0); + /* Valid value. */ + value = HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN + 1; + ret = encrypted_data_length_is_valid(value); + tt_int_op(ret, OP_EQ, 1); + + done: + ; +} + +static void +test_decode_invalid_intro_point(void *arg) +{ + int ret; + char *encoded_ip = NULL; + size_t len_out; + hs_desc_intro_point_t *ip = NULL; + ed25519_keypair_t signing_kp; + hs_descriptor_t *desc = NULL; + + (void) arg; + + /* Seperate pieces of a valid encoded introduction point. */ + const char *intro_point = + "introduction-point AQIUMDI5OUYyNjhGQ0E5RDU1Q0QxNTc="; + const char *auth_key = + "auth-key\n" + "-----BEGIN ED25519 CERT-----\n" + "AQkACOhAAQW8ltYZMIWpyrfyE/b4Iyi8CNybCwYs6ADk7XfBaxsFAQAgBAD3/BE4\n" + "XojGE/N2bW/wgnS9r2qlrkydGyuCKIGayYx3haZ39LD4ZTmSMRxwmplMAqzG/XNP\n" + "0Kkpg4p2/VnLFJRdU1SMFo1lgQ4P0bqw7Tgx200fulZ4KUM5z5V7m+a/mgY=\n" + "-----END ED25519 CERT-----"; + const char *enc_key = + "enc-key ntor bpZKLsuhxP6woDQ3yVyjm5gUKSk7RjfAijT2qrzbQk0="; + const char *enc_key_cert = + "enc-key-cert\n" + "-----BEGIN ED25519 CERT-----\n" + "AQsACOhZAUpNvCZ1aJaaR49lS6MCdsVkhVGVrRqoj0Y2T4SzroAtAQAgBABFOcGg\n" + "lbTt1DF5nKTE/gU3Fr8ZtlCIOhu1A+F5LM7fqCUupfesg0KTHwyIZOYQbJuM5/he\n" + "/jDNyLy9woPJdjkxywaY2RPUxGjLYtMQV0E8PUxWyICV+7y52fTCYaKpYQw=\n" + "-----END ED25519 CERT-----"; + + /* Try to decode a junk string. */ + { + hs_descriptor_free(desc); + desc = NULL; + ret = ed25519_keypair_generate(&signing_kp, 0); + tt_int_op(ret, OP_EQ, 0); + desc = hs_helper_build_hs_desc_with_ip(&signing_kp); + const char *junk = "this is not a descriptor"; + ip = decode_introduction_point(desc, junk); + tt_ptr_op(ip, OP_EQ, NULL); + hs_desc_intro_point_free(ip); + ip = NULL; + } + + /* Invalid link specifiers. */ + { + smartlist_t *lines = smartlist_new(); + const char *bad_line = "introduction-point blah"; + smartlist_add(lines, (char *) bad_line); + smartlist_add(lines, (char *) auth_key); + smartlist_add(lines, (char *) enc_key); + smartlist_add(lines, (char *) enc_key_cert); + encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); + tt_assert(encoded_ip); + ip = decode_introduction_point(desc, encoded_ip); + tt_ptr_op(ip, OP_EQ, NULL); + tor_free(encoded_ip); + smartlist_free(lines); + hs_desc_intro_point_free(ip); + ip = NULL; + } + + /* Invalid auth key type. */ + { + smartlist_t *lines = smartlist_new(); + /* Try to put a valid object that our tokenize function will be able to + * parse but that has nothing to do with the auth_key. */ + const char *bad_line = + "auth-key\n" + "-----BEGIN UNICORN CERT-----\n" + "MIGJAoGBAO4bATcW8kW4h6RQQAKEgg+aXCpF4JwbcO6vGZtzXTDB+HdPVQzwqkbh\n" + "XzFM6VGArhYw4m31wcP1Z7IwULir7UMnAFd7Zi62aYfU6l+Y1yAoZ1wzu1XBaAMK\n" + "ejpwQinW9nzJn7c2f69fVke3pkhxpNdUZ+vplSA/l9iY+y+v+415AgMBAAE=\n" + "-----END UNICORN CERT-----"; + /* Build intro point text. */ + smartlist_add(lines, (char *) intro_point); + smartlist_add(lines, (char *) bad_line); + smartlist_add(lines, (char *) enc_key); + smartlist_add(lines, (char *) enc_key_cert); + encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); + tt_assert(encoded_ip); + ip = decode_introduction_point(desc, encoded_ip); + tt_ptr_op(ip, OP_EQ, NULL); + tor_free(encoded_ip); + smartlist_free(lines); + } + + /* Invalid enc-key. */ + { + smartlist_t *lines = smartlist_new(); + const char *bad_line = + "enc-key unicorn bpZKLsuhxP6woDQ3yVyjm5gUKSk7RjfAijT2qrzbQk0="; + /* Build intro point text. */ + smartlist_add(lines, (char *) intro_point); + smartlist_add(lines, (char *) auth_key); + smartlist_add(lines, (char *) bad_line); + smartlist_add(lines, (char *) enc_key_cert); + encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); + tt_assert(encoded_ip); + ip = decode_introduction_point(desc, encoded_ip); + tt_ptr_op(ip, OP_EQ, NULL); + tor_free(encoded_ip); + smartlist_free(lines); + } + + /* Invalid enc-key object. */ + { + smartlist_t *lines = smartlist_new(); + const char *bad_line = "enc-key ntor"; + /* Build intro point text. */ + smartlist_add(lines, (char *) intro_point); + smartlist_add(lines, (char *) auth_key); + smartlist_add(lines, (char *) bad_line); + smartlist_add(lines, (char *) enc_key_cert); + encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); + tt_assert(encoded_ip); + ip = decode_introduction_point(desc, encoded_ip); + tt_ptr_op(ip, OP_EQ, NULL); + tor_free(encoded_ip); + smartlist_free(lines); + } + + /* Invalid enc-key base64 curv25519 key. */ + { + smartlist_t *lines = smartlist_new(); + const char *bad_line = "enc-key ntor blah==="; + /* Build intro point text. */ + smartlist_add(lines, (char *) intro_point); + smartlist_add(lines, (char *) auth_key); + smartlist_add(lines, (char *) bad_line); + smartlist_add(lines, (char *) enc_key_cert); + encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); + tt_assert(encoded_ip); + ip = decode_introduction_point(desc, encoded_ip); + tt_ptr_op(ip, OP_EQ, NULL); + tor_free(encoded_ip); + smartlist_free(lines); + } + + /* Invalid enc-key invalid legacy. */ + { + smartlist_t *lines = smartlist_new(); + const char *bad_line = "legacy-key blah==="; + /* Build intro point text. */ + smartlist_add(lines, (char *) intro_point); + smartlist_add(lines, (char *) auth_key); + smartlist_add(lines, (char *) bad_line); + smartlist_add(lines, (char *) enc_key_cert); + encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); + tt_assert(encoded_ip); + ip = decode_introduction_point(desc, encoded_ip); + tt_ptr_op(ip, OP_EQ, NULL); + tor_free(encoded_ip); + smartlist_free(lines); + } + + done: + hs_descriptor_free(desc); + hs_desc_intro_point_free(ip); +} + +/** Make sure we fail gracefully when decoding the bad desc from #23233. */ +static void +test_decode_bad_signature(void *arg) +{ + hs_desc_plaintext_data_t desc_plaintext; + int ret; + + (void) arg; + + /* Update approx time to dodge cert expiration */ + update_approx_time(1502661599); + + setup_full_capture_of_logs(LOG_WARN); + ret = hs_desc_decode_plaintext(HS_DESC_BAD_SIG, &desc_plaintext); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("Malformed signature line. Rejecting."); + teardown_capture_of_logs(); + + done: + desc_plaintext_data_free_contents(&desc_plaintext); +} + +static void +test_decode_plaintext(void *arg) +{ + int ret; + hs_desc_plaintext_data_t desc_plaintext; + const char *bad_value = "unicorn"; + + (void) arg; + +#define template \ + "hs-descriptor %s\n" \ + "descriptor-lifetime %s\n" \ + "descriptor-signing-key-cert\n" \ + "-----BEGIN ED25519 CERT-----\n" \ + "AQgABjvPAQaG3g+dc6oV/oJV4ODAtkvx56uBnPtBT9mYVuHVOhn7AQAgBABUg3mQ\n" \ + "myBr4bu5LCr53wUEbW2EXui01CbUgU7pfo9LvJG3AcXRojj6HlfsUs9BkzYzYdjF\n" \ + "A69Apikgu0ewHYkFFASt7Il+gB3w6J8YstQJZT7dtbtl+doM7ug8B68Qdg8=\n" \ + "-----END ED25519 CERT-----\n" \ + "revision-counter %s\n" \ + "encrypted\n" \ + "-----BEGIN %s-----\n" \ + "UNICORN\n" \ + "-----END MESSAGE-----\n" \ + "signature m20WJH5agqvwhq7QeuEZ1mYyPWQDO+eJOZUjLhAiKu8DbL17DsDfJE6kXbWy" \ + "HimbNj2we0enV3cCOOAsmPOaAw\n" + + /* Invalid version. */ + { + char *plaintext; + tor_asprintf(&plaintext, template, bad_value, "180", "42", "MESSAGE"); + ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); + tor_free(plaintext); + tt_int_op(ret, OP_EQ, -1); + } + + /* Missing fields. */ + { + const char *plaintext = "hs-descriptor 3\n"; + ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); + tt_int_op(ret, OP_EQ, -1); + } + + /* Max length. */ + { + size_t big = 64000; + /* Must always be bigger than HS_DESC_MAX_LEN. */ + tt_int_op(HS_DESC_MAX_LEN, OP_LT, big); + char *plaintext = tor_malloc_zero(big); + memset(plaintext, 'a', big); + plaintext[big - 1] = '\0'; + ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); + tor_free(plaintext); + tt_int_op(ret, OP_EQ, -1); + } + + /* Bad lifetime value. */ + { + char *plaintext; + tor_asprintf(&plaintext, template, "3", bad_value, "42", "MESSAGE"); + ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); + tor_free(plaintext); + tt_int_op(ret, OP_EQ, -1); + } + + /* Huge lifetime value. */ + { + char *plaintext; + tor_asprintf(&plaintext, template, "3", "7181615", "42", "MESSAGE"); + ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); + tor_free(plaintext); + tt_int_op(ret, OP_EQ, -1); + } + + /* Invalid encrypted section. */ + { + char *plaintext; + tor_asprintf(&plaintext, template, "3", "180", "42", bad_value); + ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); + tor_free(plaintext); + tt_int_op(ret, OP_EQ, -1); + } + + /* Invalid revision counter. */ + { + char *plaintext; + tor_asprintf(&plaintext, template, "3", "180", bad_value, "MESSAGE"); + ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); + tor_free(plaintext); + tt_int_op(ret, OP_EQ, -1); + } + + done: + ; +} + +static void +test_validate_cert(void *arg) +{ + int ret; + time_t now = time(NULL); + ed25519_keypair_t kp; + tor_cert_t *cert = NULL; + + (void) arg; + + ret = ed25519_keypair_generate(&kp, 0); + tt_int_op(ret, OP_EQ, 0); + + /* Cert of type CERT_TYPE_AUTH_HS_IP_KEY. */ + cert = tor_cert_create(&kp, CERT_TYPE_AUTH_HS_IP_KEY, + &kp.pubkey, now, 3600, + CERT_FLAG_INCLUDE_SIGNING_KEY); + tt_assert(cert); + /* Test with empty certificate. */ + ret = cert_is_valid(NULL, CERT_TYPE_AUTH_HS_IP_KEY, "unicorn"); + tt_int_op(ret, OP_EQ, 0); + /* Test with a bad type. */ + ret = cert_is_valid(cert, CERT_TYPE_SIGNING_HS_DESC, "unicorn"); + tt_int_op(ret, OP_EQ, 0); + /* Normal validation. */ + ret = cert_is_valid(cert, CERT_TYPE_AUTH_HS_IP_KEY, "unicorn"); + tt_int_op(ret, OP_EQ, 1); + /* Break signing key so signature verification will fails. */ + memset(&cert->signing_key, 0, sizeof(cert->signing_key)); + ret = cert_is_valid(cert, CERT_TYPE_AUTH_HS_IP_KEY, "unicorn"); + tt_int_op(ret, OP_EQ, 0); + tor_cert_free(cert); + + /* Try a cert without including the signing key. */ + cert = tor_cert_create(&kp, CERT_TYPE_AUTH_HS_IP_KEY, &kp.pubkey, now, + 3600, 0); + tt_assert(cert); + /* Test with a bad type. */ + ret = cert_is_valid(cert, CERT_TYPE_AUTH_HS_IP_KEY, "unicorn"); + tt_int_op(ret, OP_EQ, 0); + + done: + tor_cert_free(cert); +} + +static void +test_desc_signature(void *arg) +{ + int ret; + char *data = NULL, *desc = NULL; + char sig_b64[ED25519_SIG_BASE64_LEN + 1]; + ed25519_keypair_t kp; + ed25519_signature_t sig; + + (void) arg; + + ed25519_keypair_generate(&kp, 0); + /* Setup a phoony descriptor but with a valid signature token that is the + * signature is verifiable. */ + tor_asprintf(&data, "This is a signed descriptor\n"); + ret = ed25519_sign_prefixed(&sig, (const uint8_t *) data, strlen(data), + "Tor onion service descriptor sig v3", &kp); + tt_int_op(ret, OP_EQ, 0); + ret = ed25519_signature_to_base64(sig_b64, &sig); + tt_int_op(ret, OP_EQ, 0); + /* Build the descriptor that should be valid. */ + tor_asprintf(&desc, "%ssignature %s\n", data, sig_b64); + ret = desc_sig_is_valid(sig_b64, &kp.pubkey, desc, strlen(desc)); + tt_int_op(ret, OP_EQ, 1); + /* Junk signature. */ + ret = desc_sig_is_valid("JUNK", &kp.pubkey, desc, strlen(desc)); + tt_int_op(ret, OP_EQ, 0); + + done: + tor_free(desc); + tor_free(data); +} + +/* bad desc auth type */ +static const char bad_superencrypted_text1[] = "desc-auth-type scoobysnack\n" + "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" + "BiYWQgYXQgYWxs\n" + "-----END MESSAGE-----\n"; + +/* bad ephemeral key */ +static const char bad_superencrypted_text2[] = "desc-auth-type x25519\n" + "desc-auth-ephemeral-key differentalphabet\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" + "BiYWQgYXQgYWxs\n" + "-----END MESSAGE-----\n"; + +/* bad encrypted msg */ +static const char bad_superencrypted_text3[] = "desc-auth-type x25519\n" + "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "SO SMALL NOT GOOD\n" + "-----END MESSAGE-----\n"; + +static const char correct_superencrypted_text[] = "desc-auth-type x25519\n" + "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "auth-client Od09Qu636Qo /PKLzqewAdS/+0+vZC+MvQ dpw4NFo13zDnuPz45rxrOg\n" + "auth-client JRr840iGYN0 8s8cxYqF7Lx23+NducC4Qg zAafl4wPLURkuEjJreZq1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" + "BiYWQgYXQgYWxs\n" + "-----END MESSAGE-----\n"; + +static const char correct_encrypted_plaintext[] = "being on mountains, " + "thinking about computers, is not bad at all"; + +static void +test_parse_hs_desc_superencrypted(void *arg) +{ + (void) arg; + size_t retval; + uint8_t *encrypted_out = NULL; + + { + setup_full_capture_of_logs(LOG_WARN); + retval = decode_superencrypted(bad_superencrypted_text1, + strlen(bad_superencrypted_text1), + &encrypted_out); + tt_u64_op(retval, OP_EQ, 0); + tt_ptr_op(encrypted_out, OP_EQ, NULL); + expect_log_msg_containing("Unrecognized desc auth type"); + teardown_capture_of_logs(); + } + + { + setup_full_capture_of_logs(LOG_WARN); + retval = decode_superencrypted(bad_superencrypted_text2, + strlen(bad_superencrypted_text2), + &encrypted_out); + tt_u64_op(retval, OP_EQ, 0); + tt_ptr_op(encrypted_out, OP_EQ, NULL); + expect_log_msg_containing("Bogus desc auth key in HS desc"); + teardown_capture_of_logs(); + } + + { + setup_full_capture_of_logs(LOG_WARN); + retval = decode_superencrypted(bad_superencrypted_text3, + strlen(bad_superencrypted_text3), + &encrypted_out); + tt_u64_op(retval, OP_EQ, 0); + tt_ptr_op(encrypted_out, OP_EQ, NULL); + expect_log_msg_containing("Length of descriptor\'s encrypted data " + "is too small."); + teardown_capture_of_logs(); + } + + /* Now finally the good one */ + retval = decode_superencrypted(correct_superencrypted_text, + strlen(correct_superencrypted_text), + &encrypted_out); + + tt_u64_op(retval, OP_EQ, strlen(correct_encrypted_plaintext)); + tt_mem_op(encrypted_out, OP_EQ, correct_encrypted_plaintext, + strlen(correct_encrypted_plaintext)); + + done: + tor_free(encrypted_out); +} + +struct testcase_t hs_descriptor[] = { + /* Encoding tests. */ + { "cert_encoding", test_cert_encoding, TT_FORK, + NULL, NULL }, + { "link_specifier", test_link_specifier, TT_FORK, + NULL, NULL }, + { "encode_descriptor", test_encode_descriptor, TT_FORK, + NULL, NULL }, + { "descriptor_padding", test_descriptor_padding, TT_FORK, + NULL, NULL }, + + /* Decoding tests. */ + { "decode_descriptor", test_decode_descriptor, TT_FORK, + NULL, NULL }, + { "encrypted_data_len", test_encrypted_data_len, TT_FORK, + NULL, NULL }, + { "decode_invalid_intro_point", test_decode_invalid_intro_point, TT_FORK, + NULL, NULL }, + { "decode_plaintext", test_decode_plaintext, TT_FORK, + NULL, NULL }, + { "decode_bad_signature", test_decode_bad_signature, TT_FORK, + NULL, NULL }, + + /* Misc. */ + { "version", test_supported_version, TT_FORK, + NULL, NULL }, + { "validate_cert", test_validate_cert, TT_FORK, + NULL, NULL }, + { "desc_signature", test_desc_signature, TT_FORK, + NULL, NULL }, + + { "parse_hs_desc_superencrypted", test_parse_hs_desc_superencrypted, + TT_FORK, NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_hs_descriptor.inc b/src/wraith/src/test/test_hs_descriptor.inc new file mode 100644 index 000000000..70a2c7c2f --- /dev/null +++ b/src/wraith/src/test/test_hs_descriptor.inc @@ -0,0 +1,224 @@ +static const char* HS_DESC_BAD_SIG = +"hs-descriptor 3\n" +"descriptor-lifetime 180\n" +"descriptor-signing-key-cert\n" +"-----BEGIN ED25519 CERT-----\n" +"AQgABl5+AQoPXRnCGEOxIup3AcjQXb8npNiUFm2Qv7A6JKk/K+EuAQAgBAD18iUD\n" +"nbkUblnUvTHzipq4bcr6aPyFVB42Ptobg4xr8s3VjHiJtjs9MDEdr6nXS7UlyhEl\n" +"78vsuFEvLp7cvAgGxYY1xGXdn5RdHMCdi8W9yZLKMQX9OuJckmp1C6q+cA4=\n" +"-----END ED25519 CERT-----\n" +"revision-counter 42\n" +"superencrypted\n" +"-----BEGIN MESSAGE-----\n" +"BxzghAOjM4De6Z6eGTvBrTP2SJDdQOYV/u9qtvlFsa2FRQWk20Adv3zJ/AI10CQO\n" +"mUP4DNXM8FWQYGTvmD7wGz2/cXGjKwBXg1qO7zF5eP/D/My1sXsIfCcb41mkheNt\n" +"xn1I5eKXcnghtd4lw7OkPVjSb/Z+VARUMmf+0qSNgmHLgEVnAoGJsn8W8B4qtIay\n" +"4h4PuV0jPPlqJx6jMFOOEW72uqnfmqeNvClENXXW60xhnaxsf0up62fuW8ktu6Wf\n" +"lnX/lvTstBFZZQ8/XI1+G+BPf8TZf7mxu0WYVg1s/KWYasYMSw46as59nkqdq2Ii\n" +"qJnqHX/R20mWBhgpLse6wO0aNpky/rozEnikaPqyO1DShf6a6jXY8ADBg7spnK2/\n" +"h7sf1+F1xfi2dy2WGxc1EUMP1kTVUmbft7kOo2nA7+3YZwQuSJHaN/66HrzU2x5z\n" +"ayRUJ8+qDtfpEf17xthc/Uh253blFK96IoJJiqBfI6xt3IqOdHJq0OOC9zBbF6Rj\n" +"vKMsaxmc/nc6uOB2WePYSgkZ0qs/dRKBJs6+Ahn1KdGkadyd8mDKL86Oe8lncHdB\n" +"m/6sQjhKqFgngkCDOIlEJyWizqfN84AGqD5Zyxq0rbsN+9KLsHFfEbCRjgqjO5nS\n" +"FYSFtuKgCZl2gaYEslL1pIEYE6BD2Whjn/HWTRyWiULJr6SuavgcbxeNEQDuVCC+\n" +"fm0X7Z+qERaMAMR0vTMJK/NzT4GifrDpgmgbxc+34CtNBF5TriM8aXTNZZlsW00k\n" +"d0XRxFbbbtiT5VOaEHbny7R3MdTVutEc9E/BhLBvjSSrGX7vrryh6Oj++nthIIzm\n" +"F4M7I11S0TyA+UE06qF1C8rKmhcqU9MWy1SiccJ9KOWhJ5xwlsXBIID7wVygUhVl\n" +"ovzfKkDDPfRoBch6NdVkxNJx3gb63CUmC2TzfwOMh973nntMVzqqw9A7jYkro9ln\n" +"217kHUwMk3e83UgFL4nn7NCf3Kj0zhJ4jSfAsuQpV6e7dhzrlNya0lqrUsY2zFXP\n" +"xv8wUtg6Vo1KewgVQas4oElkgFjDN8RJ7uBAwfuE/b9NnYJoQd76G8DHei/1PHbu\n" +"tbtwN9I5RHaTvEOfetsJFnIAkCG6O4CQpzwHu1DdvEP4s6/el10b/4awBJ4VwOVZ\n" +"YHSe4X0DStTV4Cu6aLh5OvrOmGbieRj6HdGQ6syYCaEBTuxbBUUpjIAfVlReAIph\n" +"6aOrY6HNcCmeVmL5qm4dKr2XXOREsnUFuMqmfQuQd9pN3zlmS+RqCgSJuFrguFpd\n" +"mjo6UxZvbjE7yJjtCih38HRe5BaigP5RDRkXmiXjqJ4koLJpyjQh19k3BYGcdxUC\n" +"RCcYXydbGF7qHlnoaX9HnX7y6ZRsyKQpt91PMTGOUsB4fS8NhsqPpl2gdp4poLNs\n" +"+hqjWZJ3uuLotXBcgM39Dtq9tqqu9vM12T80UAfWnVEHrBphmukh49EhEr2sx/la\n" +"kAzRoTbLyTdlGVei8hI7/RtZIaIcOkzlhcFI5zmBlydyrv6/79vzt6WI/w9GVGpM\n" +"OuSM0NS2CDJ7Iw412nz3CV1pEXB551ZBmbme6NHUe4EtEsDbgkP1Z201H4j51yVz\n" +"wNoIksE5Bh5XRKuu4We5f9KZb+AEG9kxKJ5DbJk2YGJEQFTyfv0H68pl9urstPXD\n" +"aMQF806COe2uhGm5gV/skvPVTeEvStE3K8DxZgcWNcTMVk8ZjrUHNfguVVToP8hT\n" +"Fl4Iqo3r+JZEAGXnAbTpxUVC2Xxspf3jsT5xhUfB/NOexZxrXWnQZ+pscsbow0ba\n" +"GATtakD3TF2WBqq5WscmOex+lrJcBCWVIzVWdwi5ngAtm1S7efkJlFUvmi4OuYnN\n" +"RyZfxVIpoer8f2/xPXvxkOWFminDy5sFEvlh2/pnymfKOUV+CKih9ZApt+izlRJn\n" +"+sMIOW6Jhf/WYyjeN6KQpwi6CDpclQJXA1SVoOVVL5A3lotLjs0x7ThIcBoxCZBq\n" +"rFBhBu1gJgJ8guMySAHssIvhHHwXJsYEwzWCVAg/zIUXy4PLwIkgHApl+vGcldGv\n" +"Br5HNCuqQ2pD9z2RvzNneB/LrYB214i+BP2piO5HbmeJBhby93blGXVfQewQT6aF\n" +"dBlK8/jQM0rvb+LkmvQm2ypOttRpX2kyQXooJHYTTusaUr4jVmgngCvGtgqAQVqD\n" +"HULXfHWvugZbAh6dXF7gKnnsyDOWwAgy4OJRi8i0jCaZ8aWSFRUjeGKT26dg/ayB\n" +"U4QfMb8vL8tMdXVBfQLGcBgvrzQYrY69//pV6bX3SbLfUfWXV9eqUVWVPqVyPEwa\n" +"Tz/aGVnGv/dY8h2cVnrgSXJGlOO+mCwSl+k9nk7VcEaKYuNlaOP3ZlKJvVj1LefM\n" +"FODh4qTDBo5NkyfKu5fcZcOqDMBeGWXZzltE7CmvY7fOpDNMsuAoXYWI7q9gK82F\n" +"w+nS0tVFCIWYa9DgGMv9GKTOk4Ia9elkbWypdRE/4oz4QxmHsArEsK4gDI+wmcp7\n" +"/NsAZeuy96r2YDIUam4uASKOiAqrEfCv6B6cYctdYwZbAEXdo4fkGrCIjNRZmZGv\n" +"kcZzHzIymnAmKRTkPt/LQ7Rx27Qd/Vt++B3zt2ORFuopqowOP0ocGZtkm0daK3Fc\n" +"YDXMwIpf6Z8PwvvsG1bQHcSR+cUZi7vK7+hj/LGhMPafHM7HmFUbAxpJYr5CvR6y\n" +"V1pZQYltT8xWayCeMHlLAAg10RgDkqCnY4dHnrY4GdwI2O7Wpxomni7qVHMjn+cN\n" +"UTrd7EeVw+dxAIYosuqG7ua7ee3VGoOs+XMLrscAqHahfGbyYC+j+6Tow4qwWBdU\n" +"/W3NJXnRWaHTXFHllpClnxggPRQx4yPtgTOmBBVl/O0T6i4Bv0ygsJeZAqC3VmAJ\n" +"QodQTzGf2jwqsZf4uHKQa0EKGQvTGjFVgAFNpHmAuzyqh0b1pq5JeXiFERGsKC3j\n" +"xcJilq1XeIx4SL38YNuCxi4pnyJyLnGGHpNjdjeFO5lvgCaKPegsPo4hpNpTvBJ1\n" +"D7+o3E5CqxzjRt9kQmtwBbuH/SQX2T0x8aQ6vhwjj8ftDfw+FbjpMR9zfU0Lf8V7\n" +"UjVGIl2yiVBGScBZu1nSD83PxjFy3XdFtBYoU5OrlXwBEYQs91jwK7UCiGtjI2Ao\n" +"ZGkJaBd4AqP6voyJiGnC3LWFcmeMyzfExgiclQwfhFqqf762TX5JwG6xGqtdcNKS\n" +"k54LlcI/RfvJw3ncSs9YsodZr6Jz5irpRTHX5WwCrX9mLukP96SXo29bIXEZAqEr\n" +"ZxEcF0zlYE+km5bRfRCRcVVrScugCshSNLOdQp6fOAtHCl7rdQ/8Rz7oHuqieLVi\n" +"UldRsAmpk9fIfRLphXj4j24jRP0VtL/LoJwakWTa0xO8K7eBAMVITI+HgFfN4wSO\n" +"Yh1B+bGD5WKxFsWSgBMmW+YLF5ZtxVmmbg7wK2dIpJs4pjg2YO/MTO7SifJ9kjcb\n" +"bCc74Tjs5mLLGGjGCIoXfda6WXbt2it40XhFk2zUAcPPsgjbctftkaWph7JSZpmZ\n" +"fVcPqKdhmA1U0LA2XEOMTxGyCAeseH6pJXZm9LdBozc1CwyWP8XEDHHJf35vfPKY\n" +"JDe2PanFepIOHaoRTgE7ZkGWKzOIKlS0Ucr1ezVfcxiFgQUNM+MYXXbUz51BVVq1\n" +"Dulg4VvX104nt/ULijcfa/TsE+uklEnkyk1mhavH337NQg38XF4cAngNlUF4nSW/\n" +"j0jizbAtaSx1f7q6xqPm3zPRlHrGQizHXLyl+SLzDUVPOXbPwcoeev97YeeyB6h5\n" +"NBbIK9hmekNDmYIwI0bmlrg6IXhC5pyvRe8sQlV+9wBY2liF0M1mq5onW3a55afp\n" +"+ynxXfQucb1HxZLXvRIGMBgWSQ7HfIPASqSE90Vu6qQCfkOW5PDqONr4BM65V4+g\n" +"AYsVEgaosgHw9CF7yKgkvmZpToOtGpCHVcdUeeY2/rrQnAQeSy19gj/baJ+OKl6Q\n" +"i1EGU8Yqo2r0d4XDFp/eKgC4sv57qp1PwkYQ/HKqoelJ09IAZL2sQWc05BGwt1A0\n" +"11qDIEdkZBjzK3qUnY3QlOuoZtALZrnPg56SlF1RGDOPqbcF+3opqsvzBoiikh4V\n" +"WV5OUYjRDMUDLQqf/OkuktdYf5N3RcbYP0XsAvY0ZWG3Gp068b3p8peCpkDzrF9p\n" +"bQ2ZvS304tN7+p0hif3+JyZy5/sxl17RxTeg5I3mo2+J0ptQDYwF/WadONO8r7uU\n" +"YlRltFtQfyMzyVzHON4NHGjZh7dDGtWp0MGeHRBHQsC8bEChhvWme19VXhgZoWpl\n" +"dUIZkSuvRwiURXjhKbZrEdJbVmr9FX6zoyOahv3VnmcEARoR+umxzvo3hGQPbHyH\n" +"jTsQtSBjs75/9fCxcYmBWkh3JHVDVsCbV+z+5KZpk3m50J4Y1hC8hvepC9CaBqOM\n" +"DjfyXh58x1yKiueEbcjSWsRuF7CjcrYnFUBHOs9U1j9WytCI3fhOWPMgR4UZpGuU\n" +"WlcR1BXg1wYxX273xOS/jYn9MLAVlbRpPTUMIH9VRP+sc8+XaxKpJSCl4C+vcwNY\n" +"1YdKD2QiuoBJ3fXGtqMVRtn9eZvatSJuY9CnRKRbf0hWmFD4D5RkiwE0WkdtwoHR\n" +"uEXJ47RlF0/JDU1fY1mXBkq3usvB4Absy78qL06vh45xkk9bHbdf+7Ao1RQKmqiB\n" +"NL5XnjBu+YX535WG7t7Su3mTCJXYHvn72ATxry8yhSLgWqt81STkRwc14HmrOGG8\n" +"Gw7bz7y5vikj/rnPyr7ry+QRgNNDDayAqenAu2vEAzWir0RQC/iZ9rc/r7YQWGgL\n" +"Xrd4TQ6rTZePARhwB3VomnLDDvLvi2oq/jPzLKSYM2a7qj/vBSbJ/NnNaDW5Ccew\n" +"RjMI1lIHeedqYTVAW/CKoSEPcFSAzi/Ija0gcWLgX5xsFDGIYBepAX0KS9426kMu\n" +"0r/V66zmPMusMilqRTx7KW+jZMVxXVc2zClcdmohMmtjsbqLkczprfSbdGswMv9Q\n" +"I1ktHJHIRD0vPeZXnvKZsRKZw3sKb0ltZi33ZxCJFQPeGGtM5aAFthj6awcXy6Tt\n" +"DPUQdCU/vh1zmGRAX17/Xb0irfvN+GhQLEl42pzhigJXc/rCG3a4Na8wT+xAIZVf\n" +"WUI7hMslx5wA+iB4lrAjCq0YIrjINI/lHYpotXUZGmz5wz0jOciTmXMSx9du4cpk\n" +"fIQJfR+fr5tG3fjHMgSP+p+RewHkd/7RUAmHC2k3cuk5pCJvUVJrhUIqsi1fa0LG\n" +"GA0UU6Nr9tpYdNr1WkbKQjxTg0D//AXe61jmUS5XUU4AQf6zQVfN0TMtmuYeacbK\n" +"4r6Z1CSIRbsgcnL1BN8GSd4KddkCqSk941aJUCoX+77ou4t0btVSB9FnLKipigtE\n" +"E/Rpmv+81lA4fLiIag62/pcJ3uppsZ9aaHdR10SMmuCjAVLYHqhJfrHHn32dyqLK\n" +"UI8kEZJ6GQzHLUXcGbbdnk1Qm6JwO8TeF/oQvh9y9py+oAyFy0qzP2UeUMUI2yRQ\n" +"mlWSy+wX1DbVDQ3UHwJjWp65CgyYXuW8eCB0AbyF0kF4KGf7/7Ae7tEGbmYSm5MA\n" +"71z+Azxtv5gRyRb787V2dyo0wcmbRlL7iUBVXNM/czQo31tAZIwLc+lKNp0SPH6g\n" +"gJ2yX/GeDSFNAeEVUZ/f4KZIa7QQsnGWrUr+agSnQFkySmIjWYjwC/abJwah0v0d\n" +"ulwr3tECaaXtoWVdYXa3utEclBz9umBwMJ9MQCm4Kx7dTYUWFT3bMM/ESTkGPcfm\n" +"m+C4FsqFBs80WY0ududu50vTDSdJt1RqZ7Sg6DNH6acBvWyXOpT5mPJKUjnSFwyG\n" +"oVLgv0aDDx7lLZdCkhyz/Ff5LNmBgQsjGllPszJ2gTZxZ5LD68S4kUirQG/qtzlS\n" +"PGfDOC79SMZGgsoAnr4wV3RUTxsTVFlxVHsBMB+EXOFHAr3wHTVxUGBbGzxBlQ9w\n" +"I/jlu8LIIexXAU75HS5KCGGfg0Z7BLqEzqpMKqcBQC7BD7GnCXrDSQ2DCXnl7bLN\n" +"lIrQ/z2Y8AgSdED46R40MqyyN6CPPNiOCjONHZ30fLEXuEgCp4R/+x0WWsWpjGk2\n" +"Ydkc03cx/X6moUYxB5HTqTodBmAQuWMX0rxFDrnR0SWghWjdWth9gjd+dvZ82tt1\n" +"UMUywDPhcYchtUi2lnqnYJm5p00GN9Mk14MC5ZC5qP57IJVqxu0ktOMpks+CLPnz\n" +"qp9OBpI4sIzd0y0aUJC2Gd+E9aAhlREIiicyBDmxLdk1i37QeeCralI3eubLNmE+\n" +"CjDjD8t8FUGPpKglSD3lfLTqbp2TUvyWfvJC6ulFPNsAbeLHTnPnpyPQmWxhMNGt\n" +"h67B9tbYww2TvNwqIgmB4+YIR4/pSs15TpAqvuUvjpmRwGklqgiSmrQrlIxCxux/\n" +"mfsaL3KE97wm8BsaMpMkjUL7ByTIFhFZ/gHPTxaFpbqTZ4G+lABLgp3bIsB9Dl/P\n" +"ovoqX+qL2Mq9T0GrVJGfRBuA5hISw63hx5zdsj2Cj3A3khHPqR+GRN/rVYUuOpLm\n" +"z3v5pU/74vZRmNMAIhyhmweSEPNtyVkgSdgbFErqvhxN0om2Cd/7cWh2g5BXHyUL\n" +"PBr7ZkgfsE9TnuDH7Z0JoBqXJki+MO6nqz73oH2Mm86yxcXp6O/ieKTollrUJ3yQ\n" +"P6hLcEbYPzUV99del7Va5Wi0nn0wbRXCGVQdwY+iWc7pT+VVlncyg0TvLXi0OtOt\n" +"O8xbT2DAzVXxMwOsKV9ZgS/0dtwzwICpnTzBI/47V8GYhHbOUNTBPZ52GaXMeWlX\n" +"cuRGb0+7OkKWuriyOQ5z5xaASCVfqgnOwSZYiAk0gcDoK+JHdr64/sMoJhH87R4i\n" +"2TO90whkScgiGR7A06Ba42bT1nJtI6pxvzdB2b4BDAs2Lr2OdcB3BY1dtzKjFkw/\n" +"qfIw3F55UQwcs84ZEFQDAB/tmfNHajblDFpXR4N5QvU/PdWVWJUub7oNyhIX6ruu\n" +"ln4H7lpTUHJZ7jkr1qpnvkztZtHGlpJ0QdUHgyMYER1xU58Hg77yzIW3EdAa2PyK\n" +"1t4udKbQKChShlShIMzwzj57ss/69QobrpYAHYi6IRMaMUGBfipGBACK3yeXsXz0\n" +"c3Q2J5vI6QbxNsiJ5t7Ry1IqotbJcU7HND/yVUAUbEg5CpEDOSeSOW/ulyLuFxEV\n" +"lRTwIO/68BoIoR7umlP23/1N5OYzaBHhH2nThILBovHeJRXnGXSgeFfwSj7LIYEV\n" +"c1MdDSg/HzoADPXyEPLzqFzHRHeNiqEolmOPnFh0hRzbMZ0W5TQPDGWJdF21g816\n" +"vA0WW4UQjLM+vnX9kKKLA1ut+9JWk1dGKsmWtdWUDfJjUP/L6dS4OYEl6O6+SjM9\n" +"GcyGvHTiC5OpJllYpvELP/NjtTf9or8Bmruuga/axeOuS5ocYLK/sGRlmO6Z96da\n" +"QSlyGWEQAnM2D1cDmdd4CetPslOVIcQ41+coWCi2xg3UjO/bFK1CA4R1rb4ekXfs\n" +"s5U2XChyHhUPgl57y1r0ILXRXWJTJ0/F9hhu4aYQVFeIV/IuzJbmTKKkAcCOH6ys\n" +"qnu2BXz8Pm2tU10JFfRcuZ8rHuUyUErA40ESsLijON98GMwL4Rat9ZSCNS5hlK7y\n" +"yRJdr0ITp8oTbduAoulgWOvtcw1L87QBVojWz3cbhXra+WITirYuGNbzfmZn1WQM\n" +"kukEZUEHSypGOrHr1XiuY4Rw/DBaJSLyZ+VybEOfXqXkDBh5s1ayypBvzrzFZCIn\n" +"PJxIVsvrkhrpEbTJ9d7zLWjhOa9ZWw8lAubllbGm+7qCfdHmGsfBtvJdzx6zhB1Y\n" +"otL/PCis2XVTBEDJeB8pGqKFOZjNz8PC5qP+ymtAfy2ktl/u4HsFlxV7CsEKGYPm\n" +"p3LqnhPUy5M5gin4E4uPPyzzD2kcM3way49FKWUKlblQU0SyWtHRmMB3vcVmyT85\n" +"BRULXF7jgog7XR/EMltwQyJI6GcUCrnWZu+G0BEwXG+CsgCzE7assDavc1NSGLZM\n" +"rmzXiFFyfk7CE6lW2Lm+oWaFwKdvpmNZJFGGX8ZHRE9ZvkFMnfw9MYf2W7xa0jf7\n" +"k3c6X5wMuk9mznVtq5itNFVXh1mT1ujeWOiiqyH5UhQQjj6O+ZXt4gqt/jT6dd1i\n" +"jRuhhxaUGOlhpVBW/ySXhZ+HgOy9aCJ/bgjRGaqGixogk4f4rcgigHruwTpOQuDn\n" +"xDZ3Xns70S40WtHSYN+Gbl9nIh4yl78aNnA4FVtTAuLlVKEKlMJi9OBFuP5TEczG\n" +"+0HTwL/VPSCI+8FUZBhlz3YwecYq6dY5mS46+luPW+5Wl+5jtzb8V9oxVnRx2hQq\n" +"B5HJsM5FOOhHDHMXoCsevj7N/ufK7cU7Wbr0DkgYRwvb0ZJB5WYgcaQ0W7aduhGb\n" +"MQsandhP8Ajb2cmLobi3mHHPbcEkvjT8JP9Sim5xtfF+oCMMB5ByA5bI2aIFybZm\n" +"jX9e/V8wNgtpDKDVKPjB3+9dj5gU1N5JsrjQwQDB0kVRMWdpJCtD4hZ2+T/QE3SI\n" +"f8Rdk8pj8qBzRPbnhW6qsoWZdjMRC8qixZqHw4jol09UF7Ab9hjEF5ZDTfNGXwy8\n" +"/hz8su+mr8hhrlCrOF2vBYUayAA96zhbDWfg3Pdxo9bTn3/DmyAngL4J5Gu679xK\n" +"rWN4j7uQG4bzTa8WJb09/lW49UzWvmrz0c6/yexk3T//xDD067FafdnP5pYs4Cvp\n" +"rCoHpXbKjxx99DJmb5iXW0JRLSpFSCbf1HPHbmzST3minSXap5FCWDJcSgExKIJp\n" +"DXZ9rk0LMnQA74MWC5gjjM+5t0AHKuNRhJbQSwYWTKqeApXho53T/COlfDlSs2tb\n" +"Vz1Ia5z7IOfu1QheE93huNAHT3Ob+mSmUq782SqFPr6uwud/l5uP3HpcuwugdlFm\n" +"Jw8uBBOQ53W4lLbYfQYTVgieClVhmYMu7Ye0xYZ5B2jf714sjZRMa0LCbsyj58xH\n" +"uzs8ddNN1fLMzb0JRBE8JWj5PbxhA/sTwMkD7SnEMBUTtP0obmuQ982aTfyvQCH/\n" +"ve8OUPtYf5XWNv18mpR+h+riMt1Y8Eb6BJzTMFNWagMJAe3JV6A6upHroNFo2FxY\n" +"1XPRM1Rt0zKo7GD+oXnixfpl1aG8yqZhYo1ZC9buaHwH6zvM+xoiGD0iujeDtpVy\n" +"Vp6cAqqaGmrNwcPVBLc7hNKrJnbFKyhjL5/xp9j6jQov1aWQ8HsaNvh0p2ljmlwb\n" +"daTYZcwLgSgPna7HhiqnOSAmXZ7St/qe/b9TqBtIVzwzmtevgMyG98QV0syFP5X6\n" +"2Jc1g9733sTZp7njq4Cu07JhpICpinhLWR3nkODJbjk/mpLcQZgtV6W749AUo8oT\n" +"jRVEJ8MpCo1h0bVDxsRnA3DrMneD88L8/b10aHs+bPm1HKbCmT+kJAFaUQNa8JvJ\n" +"pReN37qTWvZCte7vaPAIP5cboATMu/J4t3izpm+YJoJlWcIegGx3kQ+17P4MbgDl\n" +"S93U4sOLvTk9+MoyPo9yGWU/zHgzcQ6wCFdzWMDRswuh+/4TJ2+yg6maq3iBtj39\n" +"gNLMR+sRgGGvYisqE9bfvNQy5IWrABBKcSBTXeTM1DmW6jv3TI8DoCzCbpjqcIwT\n" +"u2J+7k8wJEHPcAwnBjlyWphVvwNwM0cXqOnlJZ/4z7OGgjiNEem7TMuvxk+YkiXK\n" +"OzftdTjeIpzBwsGRP8/teMBpjS95M7GloKtxO+muBVxXbmsq8GBRC9vtNJ2Ma/xP\n" +"bXvd+7caytD3ob6ZfOzCpi4ZS8uByEfIMxlgZ5Sn3jhgEkcIU+YW9b3teMZOuWdA\n" +"QpDCoMpXaHVyRqwVV59JjmftiBnNBEo1/QzRj2UxRi7fHMfmNxL5LRM4CHSLUSCq\n" +"Y3A3pkxvBHUzemhynSFvtCPa8GHiUpe9so0V/2hlgaENAVELPjMlWytaYufRllgy\n" +"tUnCd32C5PrrmYzMKnxKRPXLcxLgziruJGSks9vIspoPk0pWgkZm+M9fRpJKlWHF\n" +"yT9OOGBW2yynw/yvXssxJmdUDxVcWL4uS2bZc4s0Zc6RSL9uQPjZVX0JLj+cXfx4\n" +"93Gn5bDhMgm+CGM6j3RiAAD7tT5V0sytNFjXd1A4U1u8yj3wzhKqOtZpDmuGUlMn\n" +"EODu7I5KtWxOTPThy7TecI5r+F/6KL+2MOtRhj2PmlT/Xed6PaAmDkQeiXGps08x\n" +"u0JIpuB61axvT4PAsKZNUd4ExbzNxRDAARUMgY8krpmyKZyHVFIQ19uHM2lGl9/i\n" +"h3PKlLHYI8RsHutHElzq+F5tWd5AA99LVRZX4axAVIQNiqRg8IMSoCwUaCCbjUMz\n" +"sJCo2t36GYk5S2BRnfrCqYoZRHw+ENYN0tDEMhXq1OqjvNHW3TzL3DsUhM6EZU5n\n" +"cRR4ynUvPqqWFphLefRW10vCtaW9roJQZyFYf9kd8xgW/BhcDNbTTaQ1U6xCHgX+\n" +"78DKee/NvY1WIEBR8X0iVk5XlSJb14eRtxNawXFyebVdmC/DiMNgnTBncMbePnZi\n" +"KCl1r5xqo7tSIoJ6Z0l6qINd89T9fcg9mujTVwsfQ+5/kdEy0Iw7CQcTOGvMaoPX\n" +"IAJlWSVeZ8eu8kmsD1Z8ewoPufMKiY4cPRAK5bCDgsrK6bAExOlCwPnNNM8Ym1Hz\n" +"aYFeGs5sW468Qww+Nbl5xcNFKtwUKZ6EebRHjwttiyTgCdAhv9wL1u2WFydWWgkG\n" +"rwUbNpSLKls+pijCeJAscvxzbZz96iOaYrY8IyzGBFwfgFAESfnzBc8SQjZzMzoO\n" +"vmYIRon2m/5w5AZA2IjQ4VxXJDK6XExD/ZLsxNXzMnROD++hE+s8DvPlRPmN4egF\n" +"gAzJs/9t7IyE/dDf7gSSBqzEBbwduD8ozzYHwELUc4ERdRzjEdBM0azT61g7Yilr\n" +"iT5Hy+2iw/pNwiqVOYiAbj2lwcoMlFZmdxviD4IMXdsNVWsCAVJL0PqIh1UDDb3z\n" +"Urv3idBJeSBuuFr6AFS6kAgvrwV/pEGoBoHuyii/rZxVugGKeuMynKEvSHuFNuQU\n" +"qIHcNgqQR34v2Ut5pQ1R8s7K3Rae/AhE5GncJa6FJmB9TF8MYMu9PlSZV/eGv8UL\n" +"IDWQ7sY3NdhZini//xtwPqIw29yOeZ0X6Aqsek9tfh21UwKSpHb7T+PwXYmoB+23\n" +"p3FXkP/rv4AGRq1xJqFYzKJvwsXqTFuNFWP74yhTg6rC90w2p5TeH1rJMAnv4u0L\n" +"hGtG/NL+D1Tzdf00TYAjno5Ia5dQJDd/eO+Ygqnhl6hAqGtS6r9JhIEXw1nQD7SC\n" +"lj96ZuKdUWO8rpIiAtvHAsn++xvMVPm/S1SwA8oE049iVwS8/eNNiMKoSlTlYc7o\n" +"pusBZQrVF4We4HHYFjysBbcXlvoXDd8LkZ8Nh63VQPnoIGNKH2U6aXCnQcJ8dZqO\n" +"DNxL4uyM4A578FUUR6vxqt2asnLHQ0Z7pPE4uqtz/WgbiHI/i2oHS8oe1clsifCw\n" +"3ZY33kflqLftkTNka1oiftDb0OqFLjkS7/AUorqHazw53gM3gqJY5EXA3Px9+nhu\n" +"NzxSK/t41JoCfgQJHMkIWb3yUcO4OFZeGCeAxIJY95hv/brt6/WNielXjNaohYvc\n" +"lsSUHEJRHwVxQmWK0LS+g13HAgOI7cNt3MA8sSkzTneHGFgEvmrSyb0wCEmushC9\n" +"mjQThvaxfQk9douA/cR2bHr7axXqv9vjztmxUr0a30a7lvLMBQbJmFtJJylW+tJe\n" +"v/vKNOB+9mK793cttr2JFnMhwUKFKWiFDQJtxw/eLQWY4BJ19Rs2x4BJgmV+u1jB\n" +"zR8uvxuArG/cqVEJsoC6uuSzhAWSwdvumijO6yuyWF6nHY6aAcy8dyFQlDFHAd+/\n" +"J05Lrbzj4N9lcI7hPalh0uMdERGvtUdT8QRm5ebP1zogYEkZk/1GOU29dMawkAt/\n" +"SWhp2yWdjLt8f5HQKu72vUF/yyTfzfdqQqJwfthP7+vp+sHDO85AMF45uU9g3pxW\n" +"IbXSbZ4fFGC1/41db/2GOHFgaheMXj0SIWHqQE1jtihr3BBBO4b3Ccz5QCnrn48J\n" +"8L+QRdh4a/cAx4ty/oHEiXwpSBBSFRl5+y2NijC8GITA5dRjCRWP+Y0zuTrJ7j1a\n" +"h+3kGs1kxqskhaEuhXnXyknGLjXrU+ewRGhHzP23o5betVhX+c1XjVqmJNZ5OPn/\n" +"wrqx/XwoIl/3F5lMmGDG9mPtyg0E227nKl9Sy0Vbwx2tu1unjOlzSCa7lpoD4TIX\n" +"PBJ5+Zb0CE6HEt3V0ec1m4uUe/xObAnzyr4UbzdqLaMy8vTcF/qsncXyPBjwqdjR\n" +"ReDAtt99bAPY4roPKGt8dgKUPE0t/XoY+SlmUp75TkZDXrOIJXpEW0GpLPf53T+W\n" +"Ex3KtfLAnZzrw8+dIageY7IgoQ85h3sYE7uEI8QlcO/o4udqUzTp4Sn4sWvdTLrx\n" +"W7ImvK2rsU5ubVdsEaFKM7+7nxGn2JyMpIWFz0SbP34CkXHhrXxyRD+GhMIDHFxV\n" +"uBnZnjJsw+ooIm1rL4I7/VMWEwmVegreT6w9Gsmb5igw+zu9v2YBgTOhysA9XZd4\n" +"7O3VjqKkhTXcBqdpRWuz8gPQ+4rfwij28Gg2alG04Eh3G3868NOCFJhhaHVmwYR2\n" +"ygRm6N9eDW1bHhYSN75HSEb6aIebk+1AT4S1QtJaPSH0EduIXO++JYAs+jIFKy2c\n" +"jCVFlO/LbXl7iCdXurJHpSbMNmZFNUri6zEolENODLwke836jBOKiVrWzLnEMxHI\n" +"WDDTpLTYhR3C7sEprpEQm9SX2Eik3WxVb4ZTb7SZFU1y1d4tWnjGu3U1D+vO9wVq\n" +"Sss9lDipbkhQ9k4j1/Pqozaxvi8lYLbh3WEjK3Iwpr66Bk6Ai2oRg4b+7vzV4o+6\n" +"L47JPJhajdHac0CIlmupyA4eejECS6OpoLDf5Wr/616k3dxM//3kAWGUnXVw9GSo\n" +"UF5W8AaKlaGZ6EZk09NyGSFRjEs18z+g5ckviGF0EhZI7ZPWQQmlqWUsL9O0S4GO\n" +"ZZ9f0UhNmHEspcugbs7e1yfjwGVyxIBkrmxpkmfHE4Gb47UGlJevg2OvZOPT3wMH\n" +"vOds2BtqdT3tuss9k+7hsISGse7isEOb7TN5MHb6yyzqnCUZhp5m3Iag7TUkiyfU\n" +"jKH5R13tHqKUoJ2rofWoLO2H5xSfp/lqF9sLd4rJ+Pbjhiuvfwz5copYsuTNL4kB\n" +"SPUikHlTxSOgTBYNV77qxpsqOI3+iziCrSqHsxNdlaA1T3fiq6SeZBNdD822AYm9\n" +"L5hbcgpDPEEwT/n5kWNbRNueerJkJwboaOnT1ZX1601Pwj5QDi+YM1NYy5PsdWxb\n" +"bPGpQyZ+uf917q9gV7Ykr5cic10YD11khAghr0n6fYfb8Ijc22uP6m47KItDqQc1\n" +"eFym149F56B0yg5FR85Arg==\n" +"-----END MESSAGE-----\n" +" signature Of+jvQKzH9ot2NV5twlDO2CFbzLSB4absWTwG58TCHb+TWgQi3z6SZIoTnGGY/uicJgEkCN++bZZR49GiyHyCQ\n"; diff --git a/src/wraith/src/test/test_hs_intropoint.c b/src/wraith/src/test/test_hs_intropoint.c new file mode 100644 index 000000000..6a7962b21 --- /dev/null +++ b/src/wraith/src/test/test_hs_intropoint.c @@ -0,0 +1,921 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs_service.c + * \brief Test hidden service functionality. + */ + +#define HS_SERVICE_PRIVATE +#define HS_INTROPOINT_PRIVATE +#define RENDSERVICE_PRIVATE +#define CIRCUITLIST_PRIVATE + +#include "test.h" +#include "log_test_helpers.h" +#include "crypto.h" +#include "log_test_helpers.h" + +#include "or.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "ht.h" +#include "relay.h" +#include "rendservice.h" + +#include "hs_cell.h" +#include "hs_circuitmap.h" +#include "hs_common.h" +#include "hs_intropoint.h" +#include "hs_service.h" + +/* Trunnel. */ +#include "hs/cell_establish_intro.h" +#include "hs/cell_introduce1.h" +#include "hs/cell_common.h" + +static size_t +new_establish_intro_cell(const char *circ_nonce, + trn_cell_establish_intro_t **cell_out) +{ + ssize_t cell_len = 0; + uint8_t buf[RELAY_PAYLOAD_SIZE] = {0}; + trn_cell_establish_intro_t *cell = NULL; + hs_service_intro_point_t *ip = NULL; + + /* Auth key pair is generated in the constructor so we are all set for + * using this IP object. */ + ip = service_intro_point_new(NULL, 0); + tt_assert(ip); + cell_len = hs_cell_build_establish_intro(circ_nonce, ip, buf); + tt_i64_op(cell_len, OP_GT, 0); + + cell_len = trn_cell_establish_intro_parse(&cell, buf, sizeof(buf)); + tt_i64_op(cell_len, OP_GT, 0); + tt_assert(cell); + *cell_out = cell; + + done: + service_intro_point_free(ip); + return cell_len; +} + +static ssize_t +new_establish_intro_encoded_cell(const char *circ_nonce, uint8_t *cell_out) +{ + ssize_t cell_len = 0; + hs_service_intro_point_t *ip = NULL; + + /* Auth key pair is generated in the constructor so we are all set for + * using this IP object. */ + ip = service_intro_point_new(NULL, 0); + tt_assert(ip); + cell_len = hs_cell_build_establish_intro(circ_nonce, ip, cell_out); + tt_i64_op(cell_len, OP_GT, 0); + + done: + service_intro_point_free(ip); + return cell_len; +} + +/* Mock function to avoid networking in unittests */ +static int +mock_send_intro_established_cell(or_circuit_t *circ) +{ + (void) circ; + return 0; +} + +static int +mock_relay_send_command_from_edge(streamid_t stream_id, circuit_t *circ, + uint8_t relay_command, const char *payload, + size_t payload_len, + crypt_path_t *cpath_layer, + const char *filename, int lineno) +{ + (void) stream_id; + (void) circ; + (void) relay_command; + (void) payload; + (void) payload_len; + (void) cpath_layer; + (void) filename; + (void) lineno; + return 0; +} + +static or_circuit_t * +helper_create_intro_circuit(void) +{ + or_circuit_t *circ = or_circuit_new(0, NULL); + tt_assert(circ); + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); + done: + return circ; +} + +static trn_cell_introduce1_t * +helper_create_introduce1_cell(void) +{ + trn_cell_introduce1_t *cell = NULL; + ed25519_keypair_t auth_key_kp; + + /* Generate the auth_key of the cell. */ + if (ed25519_keypair_generate(&auth_key_kp, 0) < 0) { + goto err; + } + + cell = trn_cell_introduce1_new(); + tt_assert(cell); + + /* Set the auth key. */ + { + size_t auth_key_len = sizeof(auth_key_kp.pubkey); + trn_cell_introduce1_set_auth_key_type(cell, + HS_INTRO_AUTH_KEY_TYPE_ED25519); + trn_cell_introduce1_set_auth_key_len(cell, auth_key_len); + trn_cell_introduce1_setlen_auth_key(cell, auth_key_len); + uint8_t *auth_key_ptr = trn_cell_introduce1_getarray_auth_key(cell); + memcpy(auth_key_ptr, auth_key_kp.pubkey.pubkey, auth_key_len); + } + + /* Set the cell extentions to none. */ + { + trn_cell_extension_t *ext = trn_cell_extension_new(); + trn_cell_extension_set_num(ext, 0); + trn_cell_introduce1_set_extensions(cell, ext); + } + + /* Set the encrypted section to some data. */ + { + size_t enc_len = 128; + trn_cell_introduce1_setlen_encrypted(cell, enc_len); + uint8_t *enc_ptr = trn_cell_introduce1_getarray_encrypted(cell); + memset(enc_ptr, 'a', enc_len); + } + + return cell; + err: + done: + trn_cell_introduce1_free(cell); + return NULL; +} + +/* Try sending an ESTABLISH_INTRO cell on a circuit that is already an intro + * point. Should fail. */ +static void +test_establish_intro_wrong_purpose(void *arg) +{ + int retval; + ssize_t cell_len = 0; + char circ_nonce[DIGEST_LEN] = {0}; + uint8_t cell_body[RELAY_PAYLOAD_SIZE]; + or_circuit_t *intro_circ = or_circuit_new(0,NULL); + + (void)arg; + + /* Get the auth key of the intro point */ + crypto_rand(circ_nonce, sizeof(circ_nonce)); + memcpy(intro_circ->rend_circ_nonce, circ_nonce, DIGEST_LEN); + + /* Set a bad circuit purpose!! :) */ + circuit_change_purpose(TO_CIRCUIT(intro_circ), CIRCUIT_PURPOSE_INTRO_POINT); + + /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we + attempt to parse it. */ + cell_len = new_establish_intro_encoded_cell(circ_nonce, cell_body); + tt_i64_op(cell_len, OP_GT, 0); + + /* Receive the cell. Should fail. */ + setup_full_capture_of_logs(LOG_INFO); + retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); + expect_log_msg_containing("Rejecting ESTABLISH_INTRO on non-OR circuit."); + teardown_capture_of_logs(); + tt_int_op(retval, OP_EQ, -1); + + done: + circuit_free_(TO_CIRCUIT(intro_circ)); +} + +/* Prepare a circuit for accepting an ESTABLISH_INTRO cell */ +static void +helper_prepare_circ_for_intro(or_circuit_t *circ, const char *circ_nonce) +{ + /* Prepare the circuit for the incoming ESTABLISH_INTRO */ + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); + memcpy(circ->rend_circ_nonce, circ_nonce, DIGEST_LEN); +} + +/* Send an empty ESTABLISH_INTRO cell. Should fail. */ +static void +test_establish_intro_wrong_keytype(void *arg) +{ + int retval; + or_circuit_t *intro_circ = or_circuit_new(0,NULL); + char circ_nonce[DIGEST_LEN] = {0}; + + (void) arg; + + /* Get the auth key of the intro point */ + crypto_rand(circ_nonce, sizeof(circ_nonce)); + helper_prepare_circ_for_intro(intro_circ, circ_nonce); + + /* Receive the cell. Should fail. */ + setup_full_capture_of_logs(LOG_INFO); + retval = hs_intro_received_establish_intro(intro_circ, (uint8_t *) "", 0); + expect_log_msg_containing("Empty ESTABLISH_INTRO cell."); + teardown_capture_of_logs(); + tt_int_op(retval, OP_EQ, -1); + + done: + circuit_free_(TO_CIRCUIT(intro_circ)); +} + +/* Send an ESTABLISH_INTRO cell with an unknown auth key type. Should fail. */ +static void +test_establish_intro_wrong_keytype2(void *arg) +{ + int retval; + char circ_nonce[DIGEST_LEN] = {0}; + uint8_t cell_body[RELAY_PAYLOAD_SIZE]; + ssize_t cell_len = 0; + or_circuit_t *intro_circ = or_circuit_new(0,NULL); + + (void) arg; + + /* Get the auth key of the intro point */ + crypto_rand(circ_nonce, sizeof(circ_nonce)); + helper_prepare_circ_for_intro(intro_circ, circ_nonce); + + /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we + * attempt to parse it. */ + cell_len = new_establish_intro_encoded_cell(circ_nonce, cell_body); + tt_i64_op(cell_len, OP_GT, 0); + + /* Mutate the auth key type! :) */ + cell_body[0] = 42; + + /* Receive the cell. Should fail. */ + setup_full_capture_of_logs(LOG_INFO); + retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); + expect_log_msg_containing("Unrecognized AUTH_KEY_TYPE 42."); + teardown_capture_of_logs(); + tt_int_op(retval, OP_EQ, -1); + + done: + circuit_free_(TO_CIRCUIT(intro_circ)); +} + +/* Send a legit ESTABLISH_INTRO cell but with a wrong MAC. Should fail. */ +static void +test_establish_intro_wrong_mac(void *arg) +{ + int retval; + char circ_nonce[DIGEST_LEN] = {0}; + ssize_t cell_len = 0; + uint8_t cell_body[RELAY_PAYLOAD_SIZE]; + trn_cell_establish_intro_t *cell = NULL; + or_circuit_t *intro_circ = or_circuit_new(0,NULL); + + (void) arg; + + /* Get the auth key of the intro point */ + crypto_rand(circ_nonce, sizeof(circ_nonce)); + helper_prepare_circ_for_intro(intro_circ, circ_nonce); + + /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we + * attempt to parse it. */ + cell_len = new_establish_intro_cell(circ_nonce, &cell); + tt_i64_op(cell_len, OP_GT, 0); + tt_assert(cell); + + /* Mangle one byte of the MAC. */ + uint8_t *handshake_ptr = + trn_cell_establish_intro_getarray_handshake_mac(cell); + handshake_ptr[TRUNNEL_SHA3_256_LEN - 1]++; + /* We need to resign the payload with that change. */ + { + ed25519_signature_t sig; + ed25519_keypair_t key_struct; + /* New keypair for the signature since we don't have access to the private + * key material generated earlier when creating the cell. */ + retval = ed25519_keypair_generate(&key_struct, 0); + tt_int_op(retval, OP_EQ, 0); + uint8_t *auth_key_ptr = + trn_cell_establish_intro_getarray_auth_key(cell); + memcpy(auth_key_ptr, key_struct.pubkey.pubkey, ED25519_PUBKEY_LEN); + /* Encode payload so we can sign it. */ + cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body), + cell); + tt_i64_op(cell_len, OP_GT, 0); + + retval = ed25519_sign_prefixed(&sig, cell_body, + cell_len - + (ED25519_SIG_LEN + sizeof(cell->sig_len)), + ESTABLISH_INTRO_SIG_PREFIX, &key_struct); + tt_int_op(retval, OP_EQ, 0); + /* And write the signature to the cell */ + uint8_t *sig_ptr = + trn_cell_establish_intro_getarray_sig(cell); + memcpy(sig_ptr, sig.sig, cell->sig_len); + /* Re-encode with the new signature. */ + cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body), + cell); + tt_i64_op(cell_len, OP_GT, 0); + } + + /* Receive the cell. Should fail because our MAC is wrong. */ + setup_full_capture_of_logs(LOG_INFO); + retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); + expect_log_msg_containing("ESTABLISH_INTRO handshake_auth not as expected"); + teardown_capture_of_logs(); + tt_int_op(retval, OP_EQ, -1); + + done: + trn_cell_establish_intro_free(cell); + circuit_free_(TO_CIRCUIT(intro_circ)); +} + +/* Send a legit ESTABLISH_INTRO cell but with a wrong auth key length. Should + * fail. */ +static void +test_establish_intro_wrong_auth_key_len(void *arg) +{ + int retval; + char circ_nonce[DIGEST_LEN] = {0}; + uint8_t cell_body[RELAY_PAYLOAD_SIZE]; + ssize_t cell_len = 0; + size_t bad_auth_key_len = ED25519_PUBKEY_LEN - 1; + trn_cell_establish_intro_t *cell = NULL; + or_circuit_t *intro_circ = or_circuit_new(0,NULL); + + (void) arg; + + /* Get the auth key of the intro point */ + crypto_rand(circ_nonce, sizeof(circ_nonce)); + helper_prepare_circ_for_intro(intro_circ, circ_nonce); + + /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we + * attempt to parse it. */ + cell_len = new_establish_intro_cell(circ_nonce, &cell); + tt_i64_op(cell_len, OP_GT, 0); + tt_assert(cell); + + /* Mangle the auth key length. */ + trn_cell_establish_intro_set_auth_key_len(cell, bad_auth_key_len); + trn_cell_establish_intro_setlen_auth_key(cell, bad_auth_key_len); + /* Encode cell. */ + cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body), + cell); + tt_int_op(cell_len, OP_GT, 0); + + /* Receive the cell. Should fail. */ + setup_full_capture_of_logs(LOG_INFO); + retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); + expect_log_msg_containing("ESTABLISH_INTRO auth key length is invalid"); + teardown_capture_of_logs(); + tt_int_op(retval, OP_EQ, -1); + + done: + trn_cell_establish_intro_free(cell); + circuit_free_(TO_CIRCUIT(intro_circ)); +} + +/* Send a legit ESTABLISH_INTRO cell but with a wrong sig length. Should + * fail. */ +static void +test_establish_intro_wrong_sig_len(void *arg) +{ + int retval; + char circ_nonce[DIGEST_LEN] = {0}; + uint8_t cell_body[RELAY_PAYLOAD_SIZE]; + ssize_t cell_len = 0; + size_t bad_sig_len = ED25519_SIG_LEN - 1; + trn_cell_establish_intro_t *cell = NULL; + or_circuit_t *intro_circ = or_circuit_new(0,NULL); + + (void) arg; + + /* Get the auth key of the intro point */ + crypto_rand(circ_nonce, sizeof(circ_nonce)); + helper_prepare_circ_for_intro(intro_circ, circ_nonce); + + /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we + * attempt to parse it. */ + cell_len = new_establish_intro_cell(circ_nonce, &cell); + tt_i64_op(cell_len, OP_GT, 0); + tt_assert(cell); + + /* Mangle the signature length. */ + trn_cell_establish_intro_set_sig_len(cell, bad_sig_len); + trn_cell_establish_intro_setlen_sig(cell, bad_sig_len); + /* Encode cell. */ + cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body), + cell); + tt_int_op(cell_len, OP_GT, 0); + + /* Receive the cell. Should fail. */ + setup_full_capture_of_logs(LOG_INFO); + retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); + expect_log_msg_containing("ESTABLISH_INTRO sig len is invalid"); + teardown_capture_of_logs(); + tt_int_op(retval, OP_EQ, -1); + + done: + trn_cell_establish_intro_free(cell); + circuit_free_(TO_CIRCUIT(intro_circ)); +} + +/* Send a legit ESTABLISH_INTRO cell but slightly change the signature. Should + * fail. */ +static void +test_establish_intro_wrong_sig(void *arg) +{ + int retval; + char circ_nonce[DIGEST_LEN] = {0}; + uint8_t cell_body[RELAY_PAYLOAD_SIZE]; + ssize_t cell_len = 0; + or_circuit_t *intro_circ = or_circuit_new(0,NULL); + + (void) arg; + + /* Get the auth key of the intro point */ + crypto_rand(circ_nonce, sizeof(circ_nonce)); + helper_prepare_circ_for_intro(intro_circ, circ_nonce); + + /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we + attempt to parse it. */ + cell_len = new_establish_intro_encoded_cell(circ_nonce, cell_body); + tt_i64_op(cell_len, OP_GT, 0); + + /* Mutate the last byte (signature)! :) */ + cell_body[cell_len - 1]++; + + /* Receive the cell. Should fail. */ + setup_full_capture_of_logs(LOG_INFO); + retval = hs_intro_received_establish_intro(intro_circ, cell_body, + (size_t)cell_len); + expect_log_msg_containing("Failed to verify ESTABLISH_INTRO cell."); + teardown_capture_of_logs(); + tt_int_op(retval, OP_EQ, -1); + + done: + circuit_free_(TO_CIRCUIT(intro_circ)); +} + +/* Helper function: Send a well-formed v3 ESTABLISH_INTRO cell to + * intro_circ. Return the cell. */ +static trn_cell_establish_intro_t * +helper_establish_intro_v3(or_circuit_t *intro_circ) +{ + int retval; + char circ_nonce[DIGEST_LEN] = {0}; + uint8_t cell_body[RELAY_PAYLOAD_SIZE]; + ssize_t cell_len = 0; + trn_cell_establish_intro_t *cell = NULL; + + tt_assert(intro_circ); + + /* Prepare the circuit for the incoming ESTABLISH_INTRO */ + crypto_rand(circ_nonce, sizeof(circ_nonce)); + helper_prepare_circ_for_intro(intro_circ, circ_nonce); + + /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we + * attempt to parse it. */ + cell_len = new_establish_intro_cell(circ_nonce, &cell); + tt_i64_op(cell_len, OP_GT, 0); + tt_assert(cell); + cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body), + cell); + tt_int_op(cell_len, OP_GT, 0); + + /* Receive the cell */ + retval = hs_intro_received_establish_intro(intro_circ, cell_body, + (size_t) cell_len); + tt_int_op(retval, OP_EQ, 0); + + done: + return cell; +} + +/* Helper function: Send a well-formed v2 ESTABLISH_INTRO cell to + * intro_circ. Return the public key advertised in the cell. */ +static crypto_pk_t * +helper_establish_intro_v2(or_circuit_t *intro_circ) +{ + crypto_pk_t *key1 = NULL; + int retval; + uint8_t cell_body[RELAY_PAYLOAD_SIZE]; + ssize_t cell_len = 0; + char circ_nonce[DIGEST_LEN] = {0}; + + tt_assert(intro_circ); + + /* Prepare the circuit for the incoming ESTABLISH_INTRO */ + crypto_rand(circ_nonce, sizeof(circ_nonce)); + helper_prepare_circ_for_intro(intro_circ, circ_nonce); + + /* Send legacy establish_intro */ + key1 = pk_generate(0); + + /* Use old circ_nonce why not */ + cell_len = rend_service_encode_establish_intro_cell( + (char*)cell_body, + sizeof(cell_body), key1, + circ_nonce); + tt_int_op(cell_len, OP_GT, 0); + + /* Receive legacy establish_intro */ + retval = hs_intro_received_establish_intro(intro_circ, + cell_body, (size_t) cell_len); + tt_int_op(retval, OP_EQ, 0); + + done: + return key1; +} + +/* Helper function: test circuitmap free_all function outside of + * test_intro_point_registration to prevent Coverity from seeing a + * double free if the assertion hypothetically fails. + */ +static void +test_circuitmap_free_all(void) +{ + hs_circuitmap_ht *the_hs_circuitmap = NULL; + + the_hs_circuitmap = get_hs_circuitmap(); + tt_assert(the_hs_circuitmap); + hs_circuitmap_free_all(); + the_hs_circuitmap = get_hs_circuitmap(); + tt_ptr_op(the_hs_circuitmap, OP_EQ, NULL); + done: + ; +} + +/** Successfuly register a v2 intro point and a v3 intro point. Ensure that HS + * circuitmap is maintained properly. */ +static void +test_intro_point_registration(void *arg) +{ + int retval; + hs_circuitmap_ht *the_hs_circuitmap = NULL; + + or_circuit_t *intro_circ = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; + ed25519_public_key_t auth_key; + + crypto_pk_t *legacy_auth_key = NULL; + or_circuit_t *legacy_intro_circ = NULL; + + or_circuit_t *returned_intro_circ = NULL; + + (void) arg; + + MOCK(hs_intro_send_intro_established_cell, mock_send_intro_established_cell); + + hs_circuitmap_init(); + + /* Check that the circuitmap is currently empty */ + { + the_hs_circuitmap = get_hs_circuitmap(); + tt_assert(the_hs_circuitmap); + tt_int_op(0, OP_EQ, HT_SIZE(the_hs_circuitmap)); + /* Do a circuitmap query in any case */ + returned_intro_circ =hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key); + tt_ptr_op(returned_intro_circ, OP_EQ, NULL); + } + + /* Create a v3 intro point */ + { + intro_circ = or_circuit_new(0, NULL); + tt_assert(intro_circ); + establish_intro_cell = helper_establish_intro_v3(intro_circ); + + /* Check that the intro point was registered on the HS circuitmap */ + the_hs_circuitmap = get_hs_circuitmap(); + tt_assert(the_hs_circuitmap); + tt_int_op(1, OP_EQ, HT_SIZE(the_hs_circuitmap)); + get_auth_key_from_cell(&auth_key, RELAY_COMMAND_ESTABLISH_INTRO, + establish_intro_cell); + returned_intro_circ = + hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key); + tt_ptr_op(intro_circ, OP_EQ, returned_intro_circ); + } + + /* Create a v2 intro point */ + { + char key_digest[DIGEST_LEN]; + + legacy_intro_circ = or_circuit_new(1, NULL); + tt_assert(legacy_intro_circ); + legacy_auth_key = helper_establish_intro_v2(legacy_intro_circ); + tt_assert(legacy_auth_key); + + /* Check that the circuitmap now has two elements */ + the_hs_circuitmap = get_hs_circuitmap(); + tt_assert(the_hs_circuitmap); + tt_int_op(2, OP_EQ, HT_SIZE(the_hs_circuitmap)); + + /* Check that the new element is our legacy intro circuit. */ + retval = crypto_pk_get_digest(legacy_auth_key, key_digest); + tt_int_op(retval, OP_EQ, 0); + returned_intro_circ = + hs_circuitmap_get_intro_circ_v2_relay_side((uint8_t*)key_digest); + tt_ptr_op(legacy_intro_circ, OP_EQ, returned_intro_circ); + } + + /* XXX Continue test and try to register a second v3 intro point with the + * same auth key. Make sure that old intro circuit gets closed. */ + + done: + crypto_pk_free(legacy_auth_key); + circuit_free_(TO_CIRCUIT(intro_circ)); + circuit_free_(TO_CIRCUIT(legacy_intro_circ)); + trn_cell_establish_intro_free(establish_intro_cell); + test_circuitmap_free_all(); + + UNMOCK(hs_intro_send_intro_established_cell); +} + +static void +test_introduce1_suitable_circuit(void *arg) +{ + int ret; + or_circuit_t *circ = NULL; + + (void) arg; + + /* Valid suitable circuit. */ + { + circ = or_circuit_new(0, NULL); + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); + ret = circuit_is_suitable_for_introduce1(circ); + circuit_free_(TO_CIRCUIT(circ)); + tt_int_op(ret, OP_EQ, 1); + } + + /* Test if the circuit purpose safeguard works correctly. */ + { + circ = or_circuit_new(0, NULL); + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT); + ret = circuit_is_suitable_for_introduce1(circ); + circuit_free_(TO_CIRCUIT(circ)); + tt_int_op(ret, OP_EQ, 0); + } + + /* Test the non-edge circuit safeguard works correctly. */ + { + circ = or_circuit_new(0, NULL); + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); + /* Bogus pointer, the check is against NULL on n_chan. */ + circ->base_.n_chan = (channel_t *) circ; + ret = circuit_is_suitable_for_introduce1(circ); + circuit_free_(TO_CIRCUIT(circ)); + tt_int_op(ret, OP_EQ, 0); + } + + /* Mangle the circuit a bit more so see if our only one INTRODUCE1 cell + * limit works correctly. */ + { + circ = or_circuit_new(0, NULL); + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); + circ->already_received_introduce1 = 1; + ret = circuit_is_suitable_for_introduce1(circ); + circuit_free_(TO_CIRCUIT(circ)); + tt_int_op(ret, OP_EQ, 0); + } + + done: + ; +} + +static void +test_introduce1_is_legacy(void *arg) +{ + int ret; + uint8_t request[256]; + + (void) arg; + + /* For a cell to be considered legacy, according to the specification, the + * first 20 bytes MUST BE non-zero else it's a v3 cell. */ + memset(request, 'a', DIGEST_LEN); + memset(request + DIGEST_LEN, 0, sizeof(request) - DIGEST_LEN); + ret = introduce1_cell_is_legacy(request); + tt_int_op(ret, OP_EQ, 1); + + /* This is a NON legacy cell. */ + memset(request, 0, DIGEST_LEN); + memset(request + DIGEST_LEN, 'a', sizeof(request) - DIGEST_LEN); + ret = introduce1_cell_is_legacy(request); + tt_int_op(ret, OP_EQ, 0); + + done: + ; +} + +static void +test_introduce1_validation(void *arg) +{ + int ret; + trn_cell_introduce1_t *cell = NULL; + + (void) arg; + + /* Create our decoy cell that we'll modify as we go to test the validation + * function of that parsed cell. */ + cell = helper_create_introduce1_cell(); + + /* It should NOT be a legacy cell which will trigger a BUG(). */ + memset(cell->legacy_key_id, 'a', sizeof(cell->legacy_key_id)); + tor_capture_bugs_(1); + ret = validate_introduce1_parsed_cell(cell); + tor_end_capture_bugs_(); + tt_int_op(ret, OP_EQ, -1); + /* Reset legacy ID and make sure it's correct. */ + memset(cell->legacy_key_id, 0, sizeof(cell->legacy_key_id)); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, 0); + + /* Non existing auth key type. */ + cell->auth_key_type = 42; + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, -1); + /* Reset is to correct value and make sure it's correct. */ + cell->auth_key_type = HS_INTRO_AUTH_KEY_TYPE_ED25519; + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, 0); + + /* Really bad key length. */ + cell->auth_key_len = 0; + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, -1); + cell->auth_key_len = UINT16_MAX; + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, -1); + /* Correct size, let's try that. */ + cell->auth_key_len = sizeof(ed25519_public_key_t); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, 0); + /* Set an invalid size of the auth key buffer. */ + trn_cell_introduce1_setlen_auth_key(cell, 3); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, -1); + /* Reset auth key buffer and make sure it works. */ + trn_cell_introduce1_setlen_auth_key(cell, sizeof(ed25519_public_key_t)); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, 0); + + /* Empty encrypted section. */ + trn_cell_introduce1_setlen_encrypted(cell, 0); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, -1); + /* Reset it to some non zero bytes and validate. */ + trn_cell_introduce1_setlen_encrypted(cell, 1); + ret = validate_introduce1_parsed_cell(cell); + tt_int_op(ret, OP_EQ, 0); + + done: + trn_cell_introduce1_free(cell); +} + +static void +test_received_introduce1_handling(void *arg) +{ + int ret; + uint8_t *request = NULL, buf[128]; + trn_cell_introduce1_t *cell = NULL; + or_circuit_t *circ = NULL; + + (void) arg; + + MOCK(relay_send_command_from_edge_, mock_relay_send_command_from_edge); + + hs_circuitmap_init(); + + /* Too small request length. An INTRODUCE1 expect at the very least a + * DIGEST_LEN size. */ + { + memset(buf, 0, sizeof(buf)); + circ = helper_create_intro_circuit(); + ret = hs_intro_received_introduce1(circ, buf, DIGEST_LEN - 1); + tt_int_op(ret, OP_EQ, -1); + circuit_free_(TO_CIRCUIT(circ)); + } + + /* We have a unit test only for the suitability of a circuit to receive an + * INTRODUCE1 cell so from now on we'll only test the handling of a cell. */ + + /* Bad request. */ + { + circ = helper_create_intro_circuit(); + uint8_t test[2]; /* Too small request. */ + memset(test, 0, sizeof(test)); + ret = handle_introduce1(circ, test, sizeof(test)); + tor_free(circ->p_chan); + circuit_free_(TO_CIRCUIT(circ)); + tt_int_op(ret, OP_EQ, -1); + } + + /* Valid case. */ + { + cell = helper_create_introduce1_cell(); + ssize_t request_len = trn_cell_introduce1_encoded_len(cell); + tt_int_op((int)request_len, OP_GT, 0); + request = tor_malloc_zero(request_len); + ssize_t encoded_len = + trn_cell_introduce1_encode(request, request_len, cell); + tt_int_op((int)encoded_len, OP_GT, 0); + + circ = helper_create_intro_circuit(); + or_circuit_t *service_circ = helper_create_intro_circuit(); + circuit_change_purpose(TO_CIRCUIT(service_circ), + CIRCUIT_PURPOSE_INTRO_POINT); + /* Register the circuit in the map for the auth key of the cell. */ + ed25519_public_key_t auth_key; + const uint8_t *cell_auth_key = + trn_cell_introduce1_getconstarray_auth_key(cell); + memcpy(auth_key.pubkey, cell_auth_key, ED25519_PUBKEY_LEN); + hs_circuitmap_register_intro_circ_v3_relay_side(service_circ, &auth_key); + ret = hs_intro_received_introduce1(circ, request, request_len); + circuit_free_(TO_CIRCUIT(circ)); + circuit_free_(TO_CIRCUIT(service_circ)); + tt_int_op(ret, OP_EQ, 0); + } + + /* Valid legacy cell. */ + { + tor_free(request); + trn_cell_introduce1_free(cell); + cell = helper_create_introduce1_cell(); + uint8_t *legacy_key_id = trn_cell_introduce1_getarray_legacy_key_id(cell); + memset(legacy_key_id, 'a', DIGEST_LEN); + /* Add an arbitrary amount of data for the payload of a v2 cell. */ + size_t request_len = trn_cell_introduce1_encoded_len(cell) + 256; + tt_size_op(request_len, OP_GT, 0); + request = tor_malloc_zero(request_len + 256); + ssize_t encoded_len = + trn_cell_introduce1_encode(request, request_len, cell); + tt_int_op((int)encoded_len, OP_GT, 0); + + circ = helper_create_intro_circuit(); + or_circuit_t *service_circ = helper_create_intro_circuit(); + circuit_change_purpose(TO_CIRCUIT(service_circ), + CIRCUIT_PURPOSE_INTRO_POINT); + /* Register the circuit in the map for the auth key of the cell. */ + uint8_t token[REND_TOKEN_LEN]; + memcpy(token, legacy_key_id, sizeof(token)); + hs_circuitmap_register_intro_circ_v2_relay_side(service_circ, token); + ret = hs_intro_received_introduce1(circ, request, request_len); + circuit_free_(TO_CIRCUIT(circ)); + circuit_free_(TO_CIRCUIT(service_circ)); + tt_int_op(ret, OP_EQ, 0); + } + + done: + trn_cell_introduce1_free(cell); + tor_free(request); + hs_circuitmap_free_all(); + UNMOCK(relay_send_command_from_edge_); +} + +struct testcase_t hs_intropoint_tests[] = { + { "intro_point_registration", + test_intro_point_registration, TT_FORK, NULL, NULL }, + + { "receive_establish_intro_wrong_keytype", + test_establish_intro_wrong_keytype, TT_FORK, NULL, NULL }, + + { "receive_establish_intro_wrong_keytype2", + test_establish_intro_wrong_keytype2, TT_FORK, NULL, NULL }, + + { "receive_establish_intro_wrong_purpose", + test_establish_intro_wrong_purpose, TT_FORK, NULL, NULL }, + + { "receive_establish_intro_wrong_sig", + test_establish_intro_wrong_sig, TT_FORK, NULL, NULL }, + + { "receive_establish_intro_wrong_sig_len", + test_establish_intro_wrong_sig_len, TT_FORK, NULL, NULL }, + + { "receive_establish_intro_wrong_auth_key_len", + test_establish_intro_wrong_auth_key_len, TT_FORK, NULL, NULL }, + + { "receive_establish_intro_wrong_mac", + test_establish_intro_wrong_mac, TT_FORK, NULL, NULL }, + + { "introduce1_suitable_circuit", + test_introduce1_suitable_circuit, TT_FORK, NULL, NULL }, + + { "introduce1_is_legacy", + test_introduce1_is_legacy, TT_FORK, NULL, NULL }, + + { "introduce1_validation", + test_introduce1_validation, TT_FORK, NULL, NULL }, + + { "received_introduce1_handling", + test_received_introduce1_handling, TT_FORK, NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_hs_ntor.c b/src/wraith/src/test/test_hs_ntor.c new file mode 100644 index 000000000..8eee54d4b --- /dev/null +++ b/src/wraith/src/test/test_hs_ntor.c @@ -0,0 +1,114 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs_ntor.c + * \brief Test hidden service ntor functionality. + */ + +#include "test.h" +#include "test_helpers.h" +#include "log_test_helpers.h" + +#include "hs_ntor.h" + +/* Test the HS ntor handshake. Simulate the sending of an encrypted INTRODUCE1 + * cell, and verify the proper derivation of decryption keys on the other end. + * Then simulate the sending of an authenticated RENDEZVOUS1 cell and verify + * the proper verification on the other end. */ +static void +test_hs_ntor(void *arg) +{ + int retval; + + uint8_t subcredential[DIGEST256_LEN]; + + ed25519_keypair_t service_intro_auth_keypair; + curve25519_keypair_t service_intro_enc_keypair; + curve25519_keypair_t service_ephemeral_rend_keypair; + + curve25519_keypair_t client_ephemeral_enc_keypair; + + hs_ntor_intro_cell_keys_t client_hs_ntor_intro_cell_keys; + hs_ntor_intro_cell_keys_t service_hs_ntor_intro_cell_keys; + + hs_ntor_rend_cell_keys_t service_hs_ntor_rend_cell_keys; + hs_ntor_rend_cell_keys_t client_hs_ntor_rend_cell_keys; + + (void) arg; + + /* Generate fake data for this unittest */ + { + /* Generate fake subcredential */ + memset(subcredential, 'Z', DIGEST256_LEN); + + /* service */ + curve25519_keypair_generate(&service_intro_enc_keypair, 0); + ed25519_keypair_generate(&service_intro_auth_keypair, 0); + curve25519_keypair_generate(&service_ephemeral_rend_keypair, 0); + /* client */ + curve25519_keypair_generate(&client_ephemeral_enc_keypair, 0); + } + + /* Client: Simulate the sending of an encrypted INTRODUCE1 cell */ + retval = + hs_ntor_client_get_introduce1_keys(&service_intro_auth_keypair.pubkey, + &service_intro_enc_keypair.pubkey, + &client_ephemeral_enc_keypair, + subcredential, + &client_hs_ntor_intro_cell_keys); + tt_int_op(retval, OP_EQ, 0); + + /* Service: Simulate the decryption of the received INTRODUCE1 */ + retval = + hs_ntor_service_get_introduce1_keys(&service_intro_auth_keypair.pubkey, + &service_intro_enc_keypair, + &client_ephemeral_enc_keypair.pubkey, + subcredential, + &service_hs_ntor_intro_cell_keys); + tt_int_op(retval, OP_EQ, 0); + + /* Test that the INTRODUCE1 encryption/mac keys match! */ + tt_mem_op(client_hs_ntor_intro_cell_keys.enc_key, OP_EQ, + service_hs_ntor_intro_cell_keys.enc_key, + CIPHER256_KEY_LEN); + tt_mem_op(client_hs_ntor_intro_cell_keys.mac_key, OP_EQ, + service_hs_ntor_intro_cell_keys.mac_key, + DIGEST256_LEN); + + /* Service: Simulate creation of RENDEZVOUS1 key material. */ + retval = + hs_ntor_service_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, + &service_intro_enc_keypair, + &service_ephemeral_rend_keypair, + &client_ephemeral_enc_keypair.pubkey, + &service_hs_ntor_rend_cell_keys); + tt_int_op(retval, OP_EQ, 0); + + /* Client: Simulate the verification of a received RENDEZVOUS1 cell */ + retval = + hs_ntor_client_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, + &client_ephemeral_enc_keypair, + &service_intro_enc_keypair.pubkey, + &service_ephemeral_rend_keypair.pubkey, + &client_hs_ntor_rend_cell_keys); + tt_int_op(retval, OP_EQ, 0); + + /* Test that the RENDEZVOUS1 key material match! */ + tt_mem_op(client_hs_ntor_rend_cell_keys.rend_cell_auth_mac, OP_EQ, + service_hs_ntor_rend_cell_keys.rend_cell_auth_mac, + DIGEST256_LEN); + tt_mem_op(client_hs_ntor_rend_cell_keys.ntor_key_seed, OP_EQ, + service_hs_ntor_rend_cell_keys.ntor_key_seed, + DIGEST256_LEN); + done: + ; +} + +struct testcase_t hs_ntor_tests[] = { + { "hs_ntor", test_hs_ntor, TT_FORK, + NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_hs_ntor.sh b/src/wraith/src/test/test_hs_ntor.sh new file mode 100644 index 000000000..8a0003d44 --- /dev/null +++ b/src/wraith/src/test/test_hs_ntor.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# Validate Tor's ntor implementation. + +exitcode=0 + +# Run the python integration test sand return the exitcode of the python +# script. The python script might ask the testsuite to skip it if not all +# python dependencies are covered. +"${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/hs_ntor_ref.py" || exitcode=$? + +exit ${exitcode} diff --git a/src/wraith/src/test/test_hs_ntor_cl.c b/src/wraith/src/test/test_hs_ntor_cl.c new file mode 100644 index 000000000..ed1eda58e --- /dev/null +++ b/src/wraith/src/test/test_hs_ntor_cl.c @@ -0,0 +1,255 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** This is a wrapper over the little-t-tor HS ntor functions. The wrapper is + * used by src/test/hs_ntor_ref.py to conduct the HS ntor integration + * tests. + * + * The logic of this wrapper is basically copied from src/test/test_ntor_cl.c + */ + +#include "orconfig.h" +#include +#include + +#define ONION_NTOR_PRIVATE +#include "or.h" +#include "util.h" +#include "compat.h" +#include "crypto.h" +#include "crypto_curve25519.h" +#include "hs_ntor.h" +#include "onion_ntor.h" + +#define N_ARGS(n) STMT_BEGIN { \ + if (argc < (n)) { \ + fprintf(stderr, "%s needs %d arguments.\n",argv[1],n); \ + return 1; \ + } \ + } STMT_END +#define BASE16(idx, var, n) STMT_BEGIN { \ + const char *s = argv[(idx)]; \ + if (base16_decode((char*)var, n, s, strlen(s)) < (int)n ) { \ + fprintf(stderr, "couldn't decode argument %d (%s)\n",idx,s); \ + return 1; \ + } \ + } STMT_END +#define INT(idx, var) STMT_BEGIN { \ + var = atoi(argv[(idx)]); \ + if (var <= 0) { \ + fprintf(stderr, "bad integer argument %d (%s)\n",idx,argv[(idx)]); \ + } \ + } STMT_END + +/** The first part of the HS ntor protocol. The client-side computes all + necessary key material and sends the appropriate message to the service. */ +static int +client1(int argc, char **argv) +{ + int retval; + + /* Inputs */ + curve25519_public_key_t intro_enc_pubkey; + ed25519_public_key_t intro_auth_pubkey; + curve25519_keypair_t client_ephemeral_enc_keypair; + uint8_t subcredential[DIGEST256_LEN]; + + /* Output */ + hs_ntor_intro_cell_keys_t hs_ntor_intro_cell_keys; + + char buf[256]; + + N_ARGS(6); + BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); + BASE16(3, intro_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(4, client_ephemeral_enc_keypair.seckey.secret_key, + CURVE25519_SECKEY_LEN); + BASE16(5, subcredential, DIGEST256_LEN); + + /* Generate keypair */ + curve25519_public_key_generate(&client_ephemeral_enc_keypair.pubkey, + &client_ephemeral_enc_keypair.seckey); + + retval = hs_ntor_client_get_introduce1_keys(&intro_auth_pubkey, + &intro_enc_pubkey, + &client_ephemeral_enc_keypair, + subcredential, + &hs_ntor_intro_cell_keys); + if (retval < 0) { + goto done; + } + + /* Send ENC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.enc_key, + sizeof(hs_ntor_intro_cell_keys.enc_key)); + printf("%s\n", buf); + /* Send MAC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.mac_key, + sizeof(hs_ntor_intro_cell_keys.mac_key)); + printf("%s\n", buf); + + done: + return retval; +} + +/** The second part of the HS ntor protocol. The service-side computes all + necessary key material and sends the appropriate message to the client */ +static int +server1(int argc, char **argv) +{ + int retval; + + /* Inputs */ + curve25519_keypair_t intro_enc_keypair; + ed25519_public_key_t intro_auth_pubkey; + curve25519_public_key_t client_ephemeral_enc_pubkey; + uint8_t subcredential[DIGEST256_LEN]; + + /* Output */ + hs_ntor_intro_cell_keys_t hs_ntor_intro_cell_keys; + hs_ntor_rend_cell_keys_t hs_ntor_rend_cell_keys; + curve25519_keypair_t service_ephemeral_rend_keypair; + + char buf[256]; + + N_ARGS(6); + BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); + BASE16(3, intro_enc_keypair.seckey.secret_key, CURVE25519_SECKEY_LEN); + BASE16(4, client_ephemeral_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(5, subcredential, DIGEST256_LEN); + + /* Generate keypair */ + curve25519_public_key_generate(&intro_enc_keypair.pubkey, + &intro_enc_keypair.seckey); + curve25519_keypair_generate(&service_ephemeral_rend_keypair, 0); + + /* Get INTRODUCE1 keys */ + retval = hs_ntor_service_get_introduce1_keys(&intro_auth_pubkey, + &intro_enc_keypair, + &client_ephemeral_enc_pubkey, + subcredential, + &hs_ntor_intro_cell_keys); + if (retval < 0) { + goto done; + } + + /* Get RENDEZVOUS1 keys */ + retval = hs_ntor_service_get_rendezvous1_keys(&intro_auth_pubkey, + &intro_enc_keypair, + &service_ephemeral_rend_keypair, + &client_ephemeral_enc_pubkey, + &hs_ntor_rend_cell_keys); + if (retval < 0) { + goto done; + } + + /* Send ENC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.enc_key, + sizeof(hs_ntor_intro_cell_keys.enc_key)); + printf("%s\n", buf); + /* Send MAC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.mac_key, + sizeof(hs_ntor_intro_cell_keys.mac_key)); + printf("%s\n", buf); + /* Send AUTH_MAC */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.rend_cell_auth_mac, + sizeof(hs_ntor_rend_cell_keys.rend_cell_auth_mac)); + printf("%s\n", buf); + /* Send NTOR_KEY_SEED */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.ntor_key_seed, + sizeof(hs_ntor_rend_cell_keys.ntor_key_seed)); + printf("%s\n", buf); + /* Send service ephemeral pubkey (Y) */ + base16_encode(buf, sizeof(buf), + (const char*)service_ephemeral_rend_keypair.pubkey.public_key, + sizeof(service_ephemeral_rend_keypair.pubkey.public_key)); + printf("%s\n", buf); + + done: + return retval; +} + +/** The final step of the ntor protocol, the client computes and returns the + * rendezvous key material. */ +static int +client2(int argc, char **argv) +{ + int retval; + + /* Inputs */ + curve25519_public_key_t intro_enc_pubkey; + ed25519_public_key_t intro_auth_pubkey; + curve25519_keypair_t client_ephemeral_enc_keypair; + curve25519_public_key_t service_ephemeral_rend_pubkey; + uint8_t subcredential[DIGEST256_LEN]; + + /* Output */ + hs_ntor_rend_cell_keys_t hs_ntor_rend_cell_keys; + + char buf[256]; + + N_ARGS(7); + BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); + BASE16(3, client_ephemeral_enc_keypair.seckey.secret_key, + CURVE25519_SECKEY_LEN); + BASE16(4, intro_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(5, service_ephemeral_rend_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(6, subcredential, DIGEST256_LEN); + + /* Generate keypair */ + curve25519_public_key_generate(&client_ephemeral_enc_keypair.pubkey, + &client_ephemeral_enc_keypair.seckey); + + /* Get RENDEZVOUS1 keys */ + retval = hs_ntor_client_get_rendezvous1_keys(&intro_auth_pubkey, + &client_ephemeral_enc_keypair, + &intro_enc_pubkey, + &service_ephemeral_rend_pubkey, + &hs_ntor_rend_cell_keys); + if (retval < 0) { + goto done; + } + + /* Send AUTH_MAC */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.rend_cell_auth_mac, + sizeof(hs_ntor_rend_cell_keys.rend_cell_auth_mac)); + printf("%s\n", buf); + /* Send NTOR_KEY_SEED */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.ntor_key_seed, + sizeof(hs_ntor_rend_cell_keys.ntor_key_seed)); + printf("%s\n", buf); + + done: + return 1; +} + +/** Perform a different part of the protocol depdning on the argv used. */ +int +main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "I need arguments. Read source for more info.\n"); + return 1; + } + + curve25519_init(); + if (!strcmp(argv[1], "client1")) { + return client1(argc, argv); + } else if (!strcmp(argv[1], "server1")) { + return server1(argc, argv); + } else if (!strcmp(argv[1], "client2")) { + return client2(argc, argv); + } else { + fprintf(stderr, "What's a %s?\n", argv[1]); + return 1; + } +} + diff --git a/src/wraith/src/test/test_hs_service.c b/src/wraith/src/test/test_hs_service.c new file mode 100644 index 000000000..3e3a7d8e0 --- /dev/null +++ b/src/wraith/src/test/test_hs_service.c @@ -0,0 +1,1620 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs_service.c + * \brief Test hidden service functionality. + */ + +#define CIRCUITBUILD_PRIVATE +#define CIRCUITLIST_PRIVATE +#define CONFIG_PRIVATE +#define CONNECTION_PRIVATE +#define CRYPTO_PRIVATE +#define HS_COMMON_PRIVATE +#define HS_SERVICE_PRIVATE +#define HS_INTROPOINT_PRIVATE +#define HS_CIRCUIT_PRIVATE +#define MAIN_PRIVATE +#define NETWORKSTATUS_PRIVATE +#define STATEFILE_PRIVATE +#define TOR_CHANNEL_INTERNAL_ +#define HS_CLIENT_PRIVATE + +#include "test.h" +#include "test_helpers.h" +#include "log_test_helpers.h" +#include "rend_test_helpers.h" +#include "hs_test_helpers.h" + +#include "or.h" +#include "config.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "crypto.h" +#include "dirvote.h" +#include "networkstatus.h" +#include "nodelist.h" +#include "relay.h" + +#include "hs_common.h" +#include "hs_config.h" +#include "hs_ident.h" +#include "hs_intropoint.h" +#include "hs_ntor.h" +#include "hs_circuit.h" +#include "hs_service.h" +#include "hs_client.h" +#include "main.h" +#include "rendservice.h" +#include "statefile.h" +#include "shared_random_state.h" + +/* Trunnel */ +#include "hs/cell_establish_intro.h" + +static networkstatus_t mock_ns; + +static networkstatus_t * +mock_networkstatus_get_live_consensus(time_t now) +{ + (void) now; + return &mock_ns; +} + +static or_state_t *dummy_state = NULL; + +/* Mock function to get fake or state (used for rev counters) */ +static or_state_t * +get_or_state_replacement(void) +{ + return dummy_state; +} + +/* Mock function because we are not trying to test the close circuit that does + * an awful lot of checks on the circuit object. */ +static void +mock_circuit_mark_for_close(circuit_t *circ, int reason, int line, + const char *file) +{ + (void) circ; + (void) reason; + (void) line; + (void) file; + return; +} + +static int +mock_relay_send_command_from_edge(streamid_t stream_id, circuit_t *circ, + uint8_t relay_command, const char *payload, + size_t payload_len, + crypt_path_t *cpath_layer, + const char *filename, int lineno) +{ + (void) stream_id; + (void) circ; + (void) relay_command; + (void) payload; + (void) payload_len; + (void) cpath_layer; + (void) filename; + (void) lineno; + return 0; +} + +/* Helper: from a set of options in conf, configure a service which will add + * it to the staging list of the HS subsytem. */ +static int +helper_config_service(const char *conf) +{ + int ret = 0; + or_options_t *options = NULL; + tt_assert(conf); + options = helper_parse_options(conf); + tt_assert(options); + ret = hs_config_service_all(options, 0); + done: + or_options_free(options); + return ret; +} + +/* Test: Ensure that setting up rendezvous circuits works correctly. */ +static void +test_e2e_rend_circuit_setup(void *arg) +{ + ed25519_public_key_t service_pk; + origin_circuit_t *or_circ; + int retval; + + /** In this test we create a v3 prop224 service-side rendezvous circuit. + * We simulate an HS ntor key exchange with a client, and check that + * the circuit was setup correctly and is ready to accept rendezvous data */ + + (void) arg; + + /* Now make dummy circuit */ + { + or_circ = origin_circuit_new(); + + or_circ->base_.purpose = CIRCUIT_PURPOSE_S_CONNECT_REND; + + or_circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); + or_circ->build_state->is_internal = 1; + + /* prop224: Setup hs conn identifier on the stream */ + ed25519_secret_key_t sk; + tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sk, 0)); + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&service_pk, &sk)); + + or_circ->hs_ident = hs_ident_circuit_new(&service_pk, + HS_IDENT_CIRCUIT_RENDEZVOUS); + + TO_CIRCUIT(or_circ)->state = CIRCUIT_STATE_OPEN; + } + + /* Check number of hops */ + retval = cpath_get_n_hops(&or_circ->cpath); + tt_int_op(retval, OP_EQ, 0); + + /* Setup the circuit: do the ntor key exchange */ + { + uint8_t ntor_key_seed[DIGEST256_LEN] = {2}; + retval = hs_circuit_setup_e2e_rend_circ(or_circ, + ntor_key_seed, sizeof(ntor_key_seed), + 1); + tt_int_op(retval, OP_EQ, 0); + } + + /* See that a hop was added to the circuit's cpath */ + retval = cpath_get_n_hops(&or_circ->cpath); + tt_int_op(retval, OP_EQ, 1); + + /* Check the digest algo */ + tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->f_digest), + OP_EQ, DIGEST_SHA3_256); + tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->b_digest), + OP_EQ, DIGEST_SHA3_256); + tt_assert(or_circ->cpath->f_crypto); + tt_assert(or_circ->cpath->b_crypto); + + /* Ensure that circ purpose was changed */ + tt_int_op(or_circ->base_.purpose, OP_EQ, CIRCUIT_PURPOSE_S_REND_JOINED); + + done: + circuit_free_(TO_CIRCUIT(or_circ)); +} + +/* Helper: Return a newly allocated and initialized origin circuit with + * purpose and flags. A default HS identifier is set to an ed25519 + * authentication key for introduction point. */ +static origin_circuit_t * +helper_create_origin_circuit(int purpose, int flags) +{ + origin_circuit_t *circ = NULL; + + circ = origin_circuit_init(purpose, flags); + tor_assert(circ); + circ->cpath = tor_malloc_zero(sizeof(crypt_path_t)); + circ->cpath->magic = CRYPT_PATH_MAGIC; + circ->cpath->state = CPATH_STATE_OPEN; + circ->cpath->package_window = circuit_initial_package_window(); + circ->cpath->deliver_window = CIRCWINDOW_START; + circ->cpath->prev = circ->cpath; + /* Random nonce. */ + crypto_rand(circ->cpath->prev->rend_circ_nonce, DIGEST_LEN); + /* Create a default HS identifier. */ + circ->hs_ident = tor_malloc_zero(sizeof(hs_ident_circuit_t)); + + return circ; +} + +/* Helper: Return a newly allocated service object with the identity keypair + * sets and the current descriptor. Then register it to the global map. + * Caller should us hs_free_all() to free this service or remove it from the + * global map before freeing. */ +static hs_service_t * +helper_create_service(void) +{ + /* Set a service for this circuit. */ + hs_service_t *service = hs_service_new(get_options()); + tor_assert(service); + service->config.version = HS_VERSION_THREE; + ed25519_secret_key_generate(&service->keys.identity_sk, 0); + ed25519_public_key_generate(&service->keys.identity_pk, + &service->keys.identity_sk); + service->desc_current = service_descriptor_new(); + tt_assert(service->desc_current); + /* Register service to global map. */ + int ret = register_service(get_hs_service_map(), service); + tt_int_op(ret, OP_EQ, 0); + + done: + return service; +} + +/* Helper: Return a newly allocated service intro point with two link + * specifiers, one IPv4 and one legacy ID set to As. */ +static hs_service_intro_point_t * +helper_create_service_ip(void) +{ + hs_desc_link_specifier_t *ls; + hs_service_intro_point_t *ip = service_intro_point_new(NULL, 0); + tor_assert(ip); + /* Add a first unused link specifier. */ + ls = tor_malloc_zero(sizeof(*ls)); + ls->type = LS_IPV4; + smartlist_add(ip->base.link_specifiers, ls); + /* Add a second link specifier used by a test. */ + ls = tor_malloc_zero(sizeof(*ls)); + ls->type = LS_LEGACY_ID; + memset(ls->u.legacy_id, 'A', sizeof(ls->u.legacy_id)); + smartlist_add(ip->base.link_specifiers, ls); + + return ip; +} + +static void +test_load_keys(void *arg) +{ + int ret; + char *conf = NULL; + char *hsdir_v2 = tor_strdup(get_fname("hs2")); + char *hsdir_v3 = tor_strdup(get_fname("hs3")); + char addr[HS_SERVICE_ADDR_LEN_BASE32 + 1]; + + (void) arg; + + /* We'll register two services, a v2 and a v3, then we'll load keys and + * validate that both are in a correct state. */ + + hs_init(); + +#define conf_fmt \ + "HiddenServiceDir %s\n" \ + "HiddenServiceVersion %d\n" \ + "HiddenServicePort 65535\n" + + /* v2 service. */ + tor_asprintf(&conf, conf_fmt, hsdir_v2, HS_VERSION_TWO); + ret = helper_config_service(conf); + tor_free(conf); + tt_int_op(ret, OP_EQ, 0); + /* This one should now be registered into the v2 list. */ + tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 0); + tt_int_op(rend_num_services(), OP_EQ, 1); + + /* v3 service. */ + tor_asprintf(&conf, conf_fmt, hsdir_v3, HS_VERSION_THREE); + ret = helper_config_service(conf); + tor_free(conf); + tt_int_op(ret, OP_EQ, 0); + /* It's in staging? */ + tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 1); + + /* Load the keys for these. After that, the v3 service should be registered + * in the global map. */ + hs_service_load_all_keys(); + tt_int_op(get_hs_service_map_size(), OP_EQ, 1); + hs_service_t *s = get_first_service(); + tt_assert(s); + + /* Ok we have the service object. Validate few things. */ + tt_assert(!tor_mem_is_zero(s->onion_address, sizeof(s->onion_address))); + tt_int_op(hs_address_is_valid(s->onion_address), OP_EQ, 1); + tt_assert(!tor_mem_is_zero((char *) s->keys.identity_sk.seckey, + ED25519_SECKEY_LEN)); + tt_assert(!tor_mem_is_zero((char *) s->keys.identity_pk.pubkey, + ED25519_PUBKEY_LEN)); + /* Check onion address from identity key. */ + hs_build_address(&s->keys.identity_pk, s->config.version, addr); + tt_int_op(hs_address_is_valid(addr), OP_EQ, 1); + tt_str_op(addr, OP_EQ, s->onion_address); + + done: + tor_free(hsdir_v2); + tor_free(hsdir_v3); + hs_free_all(); +} + +static void +test_access_service(void *arg) +{ + int ret; + char *conf = NULL; + char *hsdir_v3 = tor_strdup(get_fname("hs3")); + hs_service_ht *global_map; + hs_service_t *s = NULL; + + (void) arg; + + /* We'll register two services, a v2 and a v3, then we'll load keys and + * validate that both are in a correct state. */ + + hs_init(); + +#define conf_fmt \ + "HiddenServiceDir %s\n" \ + "HiddenServiceVersion %d\n" \ + "HiddenServicePort 65535\n" + + /* v3 service. */ + tor_asprintf(&conf, conf_fmt, hsdir_v3, HS_VERSION_THREE); + ret = helper_config_service(conf); + tor_free(conf); + tt_int_op(ret, OP_EQ, 0); + /* It's in staging? */ + tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 1); + + /* Load the keys for these. After that, the v3 service should be registered + * in the global map. */ + hs_service_load_all_keys(); + tt_int_op(get_hs_service_map_size(), OP_EQ, 1); + s = get_first_service(); + tt_assert(s); + global_map = get_hs_service_map(); + tt_assert(global_map); + + /* From here, we'll try the service accessors. */ + hs_service_t *query = find_service(global_map, &s->keys.identity_pk); + tt_assert(query); + tt_mem_op(query, OP_EQ, s, sizeof(hs_service_t)); + /* Remove service, check if it actually works and then put it back. */ + remove_service(global_map, s); + tt_int_op(get_hs_service_map_size(), OP_EQ, 0); + query = find_service(global_map, &s->keys.identity_pk); + tt_ptr_op(query, OP_EQ, NULL); + + /* Register back the service in the map. */ + ret = register_service(global_map, s); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(get_hs_service_map_size(), OP_EQ, 1); + /* Twice should fail. */ + ret = register_service(global_map, s); + tt_int_op(ret, OP_EQ, -1); + /* Remove service from map so we don't double free on cleanup. */ + remove_service(global_map, s); + tt_int_op(get_hs_service_map_size(), OP_EQ, 0); + query = find_service(global_map, &s->keys.identity_pk); + tt_ptr_op(query, OP_EQ, NULL); + /* Let's try to remove twice for fun. */ + setup_full_capture_of_logs(LOG_WARN); + remove_service(global_map, s); + expect_log_msg_containing("Could not find service in the global map"); + teardown_capture_of_logs(); + + done: + hs_service_free(s); + tor_free(hsdir_v3); + hs_free_all(); +} + +/** Test that we can create intro point objects, index them and find them */ +static void +test_service_intro_point(void *arg) +{ + hs_service_t *service = NULL; + hs_service_intro_point_t *ip = NULL; + + (void) arg; + + /* Test simple creation of an object. */ + { + time_t now = time(NULL); + ip = helper_create_service_ip(); + tt_assert(ip); + /* Make sure the authentication keypair is not zeroes. */ + tt_int_op(tor_mem_is_zero((const char *) &ip->auth_key_kp, + sizeof(ed25519_keypair_t)), OP_EQ, 0); + /* The introduce2_max MUST be in that range. */ + tt_u64_op(ip->introduce2_max, OP_GE, + INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS); + tt_u64_op(ip->introduce2_max, OP_LE, + INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS); + /* Time to expire MUST also be in that range. We add 5 seconds because + * there could be a gap between setting now and the time taken in + * service_intro_point_new. On ARM, it can be surprisingly slow... */ + tt_u64_op(ip->time_to_expire, OP_GE, + now + INTRO_POINT_LIFETIME_MIN_SECONDS + 5); + tt_u64_op(ip->time_to_expire, OP_LE, + now + INTRO_POINT_LIFETIME_MAX_SECONDS + 5); + tt_assert(ip->replay_cache); + tt_assert(ip->base.link_specifiers); + /* By default, this is NOT a legacy object. */ + tt_int_op(ip->base.is_only_legacy, OP_EQ, 0); + } + + /* Test functions that uses a service intropoints map with that previously + * created object (non legacy). */ + { + ed25519_public_key_t garbage = { {0} }; + hs_service_intro_point_t *query; + + service = hs_service_new(get_options()); + tt_assert(service); + service->desc_current = service_descriptor_new(); + tt_assert(service->desc_current); + /* Add intropoint to descriptor map. */ + service_intro_point_add(service->desc_current->intro_points.map, ip); + query = service_intro_point_find(service, &ip->auth_key_kp.pubkey); + tt_mem_op(query, OP_EQ, ip, sizeof(hs_service_intro_point_t)); + query = service_intro_point_find(service, &garbage); + tt_ptr_op(query, OP_EQ, NULL); + + /* While at it, can I find the descriptor with the intro point? */ + hs_service_descriptor_t *desc_lookup = + service_desc_find_by_intro(service, ip); + tt_mem_op(service->desc_current, OP_EQ, desc_lookup, + sizeof(hs_service_descriptor_t)); + + /* Remove object from service descriptor and make sure it is out. */ + service_intro_point_remove(service, ip); + query = service_intro_point_find(service, &ip->auth_key_kp.pubkey); + tt_ptr_op(query, OP_EQ, NULL); + } + + done: + /* If the test succeed, this object is no longer referenced in the service + * so we can free it without use after free. Else, it might explode because + * it's still in the service descriptor map. */ + service_intro_point_free(ip); + hs_service_free(service); +} + +static node_t mock_node; +static const node_t * +mock_node_get_by_id(const char *digest) +{ + (void) digest; + memset(mock_node.identity, 'A', DIGEST_LEN); + /* Only return the matchin identity of As */ + if (!tor_memcmp(mock_node.identity, digest, DIGEST_LEN)) { + return &mock_node; + } + return NULL; +} + +static void +test_helper_functions(void *arg) +{ + int ret; + hs_service_t *service = NULL; + hs_service_intro_point_t *ip = NULL; + hs_ident_circuit_t ident; + + (void) arg; + + MOCK(node_get_by_id, mock_node_get_by_id); + + hs_service_init(); + + service = helper_create_service(); + + ip = helper_create_service_ip(); + /* Immediately add the intro point to the service so the free service at the + * end cleans it as well. */ + service_intro_point_add(service->desc_current->intro_points.map, ip); + + /* Setup the circuit identifier. */ + ed25519_pubkey_copy(&ident.intro_auth_pk, &ip->auth_key_kp.pubkey); + ed25519_pubkey_copy(&ident.identity_pk, &service->keys.identity_pk); + + /* Testing get_objects_from_ident(). */ + { + hs_service_t *s_lookup = NULL; + hs_service_intro_point_t *ip_lookup = NULL; + hs_service_descriptor_t *desc_lookup = NULL; + + get_objects_from_ident(&ident, &s_lookup, &ip_lookup, &desc_lookup); + tt_mem_op(s_lookup, OP_EQ, service, sizeof(hs_service_t)); + tt_mem_op(ip_lookup, OP_EQ, ip, sizeof(hs_service_intro_point_t)); + tt_mem_op(desc_lookup, OP_EQ, service->desc_current, + sizeof(hs_service_descriptor_t)); + /* Reset */ + s_lookup = NULL; ip_lookup = NULL; desc_lookup = NULL; + + /* NULL parameter should work. */ + get_objects_from_ident(&ident, NULL, &ip_lookup, &desc_lookup); + tt_mem_op(ip_lookup, OP_EQ, ip, sizeof(hs_service_intro_point_t)); + tt_mem_op(desc_lookup, OP_EQ, service->desc_current, + sizeof(hs_service_descriptor_t)); + /* Reset. */ + s_lookup = NULL; ip_lookup = NULL; desc_lookup = NULL; + + /* Break the ident and we should find nothing. */ + memset(&ident, 0, sizeof(ident)); + get_objects_from_ident(&ident, &s_lookup, &ip_lookup, &desc_lookup); + tt_ptr_op(s_lookup, OP_EQ, NULL); + tt_ptr_op(ip_lookup, OP_EQ, NULL); + tt_ptr_op(desc_lookup, OP_EQ, NULL); + } + + /* Testing get_node_from_intro_point() */ + { + const node_t *node = get_node_from_intro_point(ip); + tt_ptr_op(node, OP_EQ, &mock_node); + SMARTLIST_FOREACH_BEGIN(ip->base.link_specifiers, + hs_desc_link_specifier_t *, ls) { + if (ls->type == LS_LEGACY_ID) { + /* Change legacy id in link specifier which is not the mock node. */ + memset(ls->u.legacy_id, 'B', sizeof(ls->u.legacy_id)); + } + } SMARTLIST_FOREACH_END(ls); + node = get_node_from_intro_point(ip); + tt_ptr_op(node, OP_EQ, NULL); + } + + /* Testing can_service_launch_intro_circuit() */ + { + time_t now = time(NULL); + /* Put the start of the retry period back in time, we should be allowed. + * to launch intro circuit. */ + service->state.num_intro_circ_launched = 2; + service->state.intro_circ_retry_started_time = + (now - INTRO_CIRC_RETRY_PERIOD - 1); + ret = can_service_launch_intro_circuit(service, now); + tt_int_op(ret, OP_EQ, 1); + tt_u64_op(service->state.intro_circ_retry_started_time, OP_EQ, now); + tt_u64_op(service->state.num_intro_circ_launched, OP_EQ, 0); + /* Call it again, we should still be allowed because we are under + * MAX_INTRO_CIRCS_PER_PERIOD which been set to 0 previously. */ + ret = can_service_launch_intro_circuit(service, now); + tt_int_op(ret, OP_EQ, 1); + tt_u64_op(service->state.intro_circ_retry_started_time, OP_EQ, now); + tt_u64_op(service->state.num_intro_circ_launched, OP_EQ, 0); + /* Too many intro circuit launched means we are not allowed. */ + service->state.num_intro_circ_launched = 20; + ret = can_service_launch_intro_circuit(service, now); + tt_int_op(ret, OP_EQ, 0); + } + + /* Testing intro_point_should_expire(). */ + { + time_t now = time(NULL); + /* Just some basic test of the current state. */ + tt_u64_op(ip->introduce2_max, OP_GE, + INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS); + tt_u64_op(ip->introduce2_max, OP_LE, + INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS); + tt_u64_op(ip->time_to_expire, OP_GE, + now + INTRO_POINT_LIFETIME_MIN_SECONDS); + tt_u64_op(ip->time_to_expire, OP_LE, + now + INTRO_POINT_LIFETIME_MAX_SECONDS); + + /* This newly created IP from above shouldn't expire now. */ + ret = intro_point_should_expire(ip, now); + tt_int_op(ret, OP_EQ, 0); + /* Maximum number of INTRODUCE2 cell reached, it should expire. */ + ip->introduce2_count = INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS + 1; + ret = intro_point_should_expire(ip, now); + tt_int_op(ret, OP_EQ, 1); + ip->introduce2_count = 0; + /* It should expire if time to expire has been reached. */ + ip->time_to_expire = now - 1000; + ret = intro_point_should_expire(ip, now); + tt_int_op(ret, OP_EQ, 1); + } + + done: + /* This will free the service and all objects associated to it. */ + hs_service_free_all(); + UNMOCK(node_get_by_id); +} + +/** Test that we do the right operations when an intro circuit opens */ +static void +test_intro_circuit_opened(void *arg) +{ + int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; + hs_service_t *service; + origin_circuit_t *circ = NULL; + + (void) arg; + + hs_init(); + MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); + MOCK(relay_send_command_from_edge_, mock_relay_send_command_from_edge); + + circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, + flags); + + /* No service associated with this circuit. */ + setup_full_capture_of_logs(LOG_WARN); + hs_service_circuit_has_opened(circ); + expect_log_msg_containing("Unknown service identity key"); + teardown_capture_of_logs(); + + /* Set a service for this circuit. */ + { + service = helper_create_service(); + ed25519_pubkey_copy(&circ->hs_ident->identity_pk, + &service->keys.identity_pk); + + /* No intro point associated with this circuit. */ + setup_full_capture_of_logs(LOG_WARN); + hs_service_circuit_has_opened(circ); + expect_log_msg_containing("Unknown introduction point auth key"); + teardown_capture_of_logs(); + } + + /* Set an IP object now for this circuit. */ + { + hs_service_intro_point_t *ip = helper_create_service_ip(); + service_intro_point_add(service->desc_current->intro_points.map, ip); + /* Update ident to contain the intro point auth key. */ + ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk, + &ip->auth_key_kp.pubkey); + } + + /* This one should go all the way. */ + setup_full_capture_of_logs(LOG_INFO); + hs_service_circuit_has_opened(circ); + expect_log_msg_containing("Introduction circuit 0 established for service"); + teardown_capture_of_logs(); + + done: + circuit_free_(TO_CIRCUIT(circ)); + hs_free_all(); + UNMOCK(circuit_mark_for_close_); + UNMOCK(relay_send_command_from_edge_); +} + +/** Test the operations we do on a circuit after we learn that we successfuly + * established an intro point on it */ +static void +test_intro_established(void *arg) +{ + int ret; + int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; + uint8_t payload[RELAY_PAYLOAD_SIZE] = {0}; + origin_circuit_t *circ = NULL; + hs_service_t *service; + hs_service_intro_point_t *ip = NULL; + + (void) arg; + + hs_init(); + MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); + + circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, + flags); + tt_assert(circ); + + /* Test a wrong purpose. */ + TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_INTRO; + setup_full_capture_of_logs(LOG_WARN); + ret = hs_service_receive_intro_established(circ, payload, sizeof(payload)); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("Received an INTRO_ESTABLISHED cell on a " + "non introduction circuit of purpose"); + teardown_capture_of_logs(); + + /* Back to normal. */ + TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; + + /* No service associated to it. */ + setup_full_capture_of_logs(LOG_WARN); + ret = hs_service_receive_intro_established(circ, payload, sizeof(payload)); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("Unknown service identity key"); + teardown_capture_of_logs(); + + /* Set a service for this circuit. */ + service = helper_create_service(); + ed25519_pubkey_copy(&circ->hs_ident->identity_pk, + &service->keys.identity_pk); + /* No introduction point associated to it. */ + setup_full_capture_of_logs(LOG_WARN); + ret = hs_service_receive_intro_established(circ, payload, sizeof(payload)); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("Introduction circuit established without an " + "intro point object on circuit"); + teardown_capture_of_logs(); + + /* Set an IP object now for this circuit. */ + { + ip = helper_create_service_ip(); + service_intro_point_add(service->desc_current->intro_points.map, ip); + /* Update ident to contain the intro point auth key. */ + ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk, + &ip->auth_key_kp.pubkey); + } + + /* Send an empty payload. INTRO_ESTABLISHED cells are basically zeroes. */ + ret = hs_service_receive_intro_established(circ, payload, sizeof(payload)); + tt_int_op(ret, OP_EQ, 0); + tt_u64_op(ip->circuit_established, OP_EQ, 1); + tt_int_op(TO_CIRCUIT(circ)->purpose, OP_EQ, CIRCUIT_PURPOSE_S_INTRO); + + done: + if (circ) + circuit_free_(TO_CIRCUIT(circ)); + hs_free_all(); + UNMOCK(circuit_mark_for_close_); +} + +/** Check the operations we do on a rendezvous circuit after we learn it's + * open */ +static void +test_rdv_circuit_opened(void *arg) +{ + int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; + origin_circuit_t *circ = NULL; + hs_service_t *service; + + (void) arg; + + hs_init(); + MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); + MOCK(relay_send_command_from_edge_, mock_relay_send_command_from_edge); + + circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_CONNECT_REND, flags); + crypto_rand((char *) circ->hs_ident->rendezvous_cookie, REND_COOKIE_LEN); + crypto_rand((char *) circ->hs_ident->rendezvous_handshake_info, + sizeof(circ->hs_ident->rendezvous_handshake_info)); + + /* No service associated with this circuit. */ + setup_full_capture_of_logs(LOG_WARN); + hs_service_circuit_has_opened(circ); + expect_log_msg_containing("Unknown service identity key"); + teardown_capture_of_logs(); + /* This should be set to a non zero timestamp. */ + tt_u64_op(TO_CIRCUIT(circ)->timestamp_dirty, OP_NE, 0); + + /* Set a service for this circuit. */ + service = helper_create_service(); + ed25519_pubkey_copy(&circ->hs_ident->identity_pk, + &service->keys.identity_pk); + /* Should be all good. */ + hs_service_circuit_has_opened(circ); + tt_int_op(TO_CIRCUIT(circ)->purpose, OP_EQ, CIRCUIT_PURPOSE_S_REND_JOINED); + + done: + circuit_free_(TO_CIRCUIT(circ)); + hs_free_all(); + UNMOCK(circuit_mark_for_close_); + UNMOCK(relay_send_command_from_edge_); +} + +static void +mock_assert_circuit_ok(const circuit_t *c) +{ + (void) c; + return; +} + +/** Test for the general mechanism for closing intro circs. + * Also a way to identify that #23603 has been fixed. */ +static void +test_closing_intro_circs(void *arg) +{ + hs_service_t *service = NULL; + hs_service_intro_point_t *ip = NULL, *entry = NULL; + origin_circuit_t *intro_circ = NULL, *tmp_circ; + int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; + + (void) arg; + + MOCK(assert_circuit_ok, mock_assert_circuit_ok); + + hs_init(); + + /* Initialize service */ + service = helper_create_service(); + /* Initialize intro point */ + ip = helper_create_service_ip(); + tt_assert(ip); + service_intro_point_add(service->desc_current->intro_points.map, ip); + + /* Initialize intro circuit */ + intro_circ = origin_circuit_init(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, flags); + intro_circ->hs_ident = hs_ident_circuit_new(&service->keys.identity_pk, + HS_IDENT_CIRCUIT_INTRO); + /* Register circuit in the circuitmap . */ + hs_circuitmap_register_intro_circ_v3_service_side(intro_circ, + &ip->auth_key_kp.pubkey); + tmp_circ = + hs_circuitmap_get_intro_circ_v3_service_side(&ip->auth_key_kp.pubkey); + tt_ptr_op(tmp_circ, OP_EQ, intro_circ); + + /* Pretend that intro point has failed too much */ + ip->circuit_retries = MAX_INTRO_POINT_CIRCUIT_RETRIES+1; + + /* Now pretend we are freeing this intro circuit. We want to see that our + * destructor is not gonna kill our intro point structure since that's the + * job of the cleanup routine. */ + circuit_free_(TO_CIRCUIT(intro_circ)); + intro_circ = NULL; + entry = service_intro_point_find(service, &ip->auth_key_kp.pubkey); + tt_assert(entry); + /* The free should also remove the circuit from the circuitmap. */ + tmp_circ = + hs_circuitmap_get_intro_circ_v3_service_side(&ip->auth_key_kp.pubkey); + tt_assert(!tmp_circ); + + /* Now pretend that a new intro point circ was launched and opened. Check + * that the intro point will be established correctly. */ + intro_circ = origin_circuit_init(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, flags); + intro_circ->hs_ident = hs_ident_circuit_new(&service->keys.identity_pk, + HS_IDENT_CIRCUIT_INTRO); + ed25519_pubkey_copy(&intro_circ->hs_ident->intro_auth_pk, + &ip->auth_key_kp.pubkey); + /* Register circuit in the circuitmap . */ + hs_circuitmap_register_intro_circ_v3_service_side(intro_circ, + &ip->auth_key_kp.pubkey); + tmp_circ = + hs_circuitmap_get_intro_circ_v3_service_side(&ip->auth_key_kp.pubkey); + tt_ptr_op(tmp_circ, OP_EQ, intro_circ); + tt_int_op(TO_CIRCUIT(intro_circ)->marked_for_close, OP_EQ, 0); + circuit_mark_for_close(TO_CIRCUIT(intro_circ), END_CIRC_REASON_INTERNAL); + tt_int_op(TO_CIRCUIT(intro_circ)->marked_for_close, OP_NE, 0); + /* At this point, we should not be able to find it in the circuitmap. */ + tmp_circ = + hs_circuitmap_get_intro_circ_v3_service_side(&ip->auth_key_kp.pubkey); + tt_assert(!tmp_circ); + + done: + if (intro_circ) { + circuit_free_(TO_CIRCUIT(intro_circ)); + } + /* Frees the service object. */ + hs_free_all(); + UNMOCK(assert_circuit_ok); +} + +/** Test sending and receiving introduce2 cells */ +static void +test_introduce2(void *arg) +{ + int ret; + int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; + uint8_t payload[RELAY_PAYLOAD_SIZE] = {0}; + origin_circuit_t *circ = NULL; + hs_service_t *service; + hs_service_intro_point_t *ip = NULL; + + (void) arg; + + hs_init(); + MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); + MOCK(get_or_state, + get_or_state_replacement); + + dummy_state = tor_malloc_zero(sizeof(or_state_t)); + + circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_INTRO, flags); + tt_assert(circ); + + /* Test a wrong purpose. */ + TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; + setup_full_capture_of_logs(LOG_WARN); + ret = hs_service_receive_introduce2(circ, payload, sizeof(payload)); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("Received an INTRODUCE2 cell on a " + "non introduction circuit of purpose"); + teardown_capture_of_logs(); + + /* Back to normal. */ + TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_INTRO; + + /* No service associated to it. */ + setup_full_capture_of_logs(LOG_WARN); + ret = hs_service_receive_introduce2(circ, payload, sizeof(payload)); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("Unknown service identity key"); + teardown_capture_of_logs(); + + /* Set a service for this circuit. */ + service = helper_create_service(); + ed25519_pubkey_copy(&circ->hs_ident->identity_pk, + &service->keys.identity_pk); + /* No introduction point associated to it. */ + setup_full_capture_of_logs(LOG_WARN); + ret = hs_service_receive_introduce2(circ, payload, sizeof(payload)); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg_containing("Unknown introduction auth key when handling " + "an INTRODUCE2 cell on circuit"); + teardown_capture_of_logs(); + + /* Set an IP object now for this circuit. */ + { + ip = helper_create_service_ip(); + service_intro_point_add(service->desc_current->intro_points.map, ip); + /* Update ident to contain the intro point auth key. */ + ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk, + &ip->auth_key_kp.pubkey); + } + + /* This will fail because receiving an INTRODUCE2 cell implies a valid cell + * and then launching circuits so let's not do that and instead test that + * behaviour differently. */ + ret = hs_service_receive_introduce2(circ, payload, sizeof(payload)); + tt_int_op(ret, OP_EQ, -1); + tt_u64_op(ip->introduce2_count, OP_EQ, 0); + + done: + or_state_free(dummy_state); + dummy_state = NULL; + if (circ) + circuit_free_(TO_CIRCUIT(circ)); + hs_free_all(); + UNMOCK(circuit_mark_for_close_); +} + +/** Test basic hidden service housekeeping operations (maintaining intro + * points, etc) */ +static void +test_service_event(void *arg) +{ + int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; + time_t now = time(NULL); + hs_service_t *service; + origin_circuit_t *circ = NULL; + + (void) arg; + + hs_init(); + MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); + + circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_INTRO, flags); + + /* Set a service for this circuit. */ + service = helper_create_service(); + ed25519_pubkey_copy(&circ->hs_ident->identity_pk, + &service->keys.identity_pk); + + /* Currently this consists of cleaning invalid intro points. So adding IPs + * here that should get cleaned up. */ + { + hs_service_intro_point_t *ip = helper_create_service_ip(); + service_intro_point_add(service->desc_current->intro_points.map, ip); + /* This run will remove the IP because we have no circuits nor node_t + * associated with it. */ + run_housekeeping_event(now); + tt_int_op(digest256map_size(service->desc_current->intro_points.map), + OP_EQ, 0); + /* We'll trigger a removal because we've reached our maximum amount of + * times we should retry a circuit. For this, we need to have a node_t + * that matches the identity of this IP. */ + routerinfo_t ri; + memset(&ri, 0, sizeof(ri)); + ip = helper_create_service_ip(); + service_intro_point_add(service->desc_current->intro_points.map, ip); + memset(ri.cache_info.identity_digest, 'A', DIGEST_LEN); + /* This triggers a node_t creation. */ + tt_assert(nodelist_set_routerinfo(&ri, NULL)); + ip->circuit_retries = MAX_INTRO_POINT_CIRCUIT_RETRIES + 1; + run_housekeeping_event(now); + tt_int_op(digest256map_size(service->desc_current->intro_points.map), + OP_EQ, 0); + /* No removal but no circuit so this means the IP object will stay in the + * descriptor map so we can retry it. */ + ip = helper_create_service_ip(); + service_intro_point_add(service->desc_current->intro_points.map, ip); + ip->circuit_established = 1; /* We'll test that, it MUST be 0 after. */ + run_housekeeping_event(now); + tt_int_op(digest256map_size(service->desc_current->intro_points.map), + OP_EQ, 1); + /* Remove the IP object at once for the next test. */ + ip->circuit_retries = MAX_INTRO_POINT_CIRCUIT_RETRIES + 1; + run_housekeeping_event(now); + tt_int_op(digest256map_size(service->desc_current->intro_points.map), + OP_EQ, 0); + /* Now, we'll create an IP with a registered circuit. The IP object + * shouldn't go away. */ + ip = helper_create_service_ip(); + service_intro_point_add(service->desc_current->intro_points.map, ip); + ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk, + &ip->auth_key_kp.pubkey); + hs_circuitmap_register_intro_circ_v3_service_side( + circ, &ip->auth_key_kp.pubkey); + run_housekeeping_event(now); + tt_int_op(digest256map_size(service->desc_current->intro_points.map), + OP_EQ, 1); + /* We'll mangle the IP object to expire. */ + ip->time_to_expire = now; + run_housekeeping_event(now); + tt_int_op(digest256map_size(service->desc_current->intro_points.map), + OP_EQ, 0); + } + + done: + hs_circuitmap_remove_circuit(TO_CIRCUIT(circ)); + circuit_free_(TO_CIRCUIT(circ)); + hs_free_all(); + UNMOCK(circuit_mark_for_close_); +} + +/** Test that we rotate descriptors correctly. */ +static void +test_rotate_descriptors(void *arg) +{ + int ret; + time_t next_rotation_time, now = time(NULL); + hs_service_t *service; + hs_service_descriptor_t *desc_next; + + (void) arg; + + dummy_state = tor_malloc_zero(sizeof(or_state_t)); + + hs_init(); + MOCK(get_or_state, get_or_state_replacement); + MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + /* Descriptor rotation happens with a consensus with a new SRV. */ + + ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", + &mock_ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", + &mock_ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), mock_ns.valid_after); + + /* Create a service with a default descriptor and state. It's added to the + * global map. */ + service = helper_create_service(); + service_descriptor_free(service->desc_current); + service->desc_current = NULL; + /* This triggers a build for both descriptors. The time now is only used in + * the descriptor certificate which is important to be now else the decoding + * will complain that the cert has expired if we use valid_after. */ + build_all_descriptors(now); + tt_assert(service->desc_current); + tt_assert(service->desc_next); + + /* Tweak our service next rotation time so we can use a custom time. */ + service->state.next_rotation_time = next_rotation_time = + mock_ns.valid_after + (11 * 60 * 60); + + /* Nothing should happen, we are not at a new SRV. Our next rotation time + * should be untouched. */ + rotate_all_descriptors(mock_ns.valid_after); + tt_u64_op(service->state.next_rotation_time, OP_EQ, next_rotation_time); + tt_assert(service->desc_current); + tt_assert(service->desc_next); + tt_u64_op(service->desc_current->time_period_num, OP_EQ, + hs_get_previous_time_period_num(0)); + tt_u64_op(service->desc_next->time_period_num, OP_EQ, + hs_get_time_period_num(0)); + /* Keep a reference so we can compare it after rotation to the current. */ + desc_next = service->desc_next; + + /* Going right after a new SRV. */ + ret = parse_rfc1123_time("Sat, 27 Oct 1985 01:00:00 UTC", + &mock_ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 27 Oct 1985 02:00:00 UTC", + &mock_ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), mock_ns.valid_after); + + /* Note down what to expect for the next rotation time which is 01:00 + 23h + * meaning 00:00:00. */ + next_rotation_time = mock_ns.valid_after + (23 * 60 * 60); + /* We should have our next rotation time modified, our current descriptor + * cleaned up and the next descriptor becoming the current. */ + rotate_all_descriptors(mock_ns.valid_after); + tt_u64_op(service->state.next_rotation_time, OP_EQ, next_rotation_time); + tt_mem_op(service->desc_current, OP_EQ, desc_next, sizeof(*desc_next)); + tt_assert(service->desc_next == NULL); + + /* A second time should do nothing. */ + rotate_all_descriptors(mock_ns.valid_after); + tt_u64_op(service->state.next_rotation_time, OP_EQ, next_rotation_time); + tt_mem_op(service->desc_current, OP_EQ, desc_next, sizeof(*desc_next)); + tt_assert(service->desc_next == NULL); + + build_all_descriptors(now); + tt_mem_op(service->desc_current, OP_EQ, desc_next, sizeof(*desc_next)); + tt_u64_op(service->desc_current->time_period_num, OP_EQ, + hs_get_time_period_num(0)); + tt_u64_op(service->desc_next->time_period_num, OP_EQ, + hs_get_next_time_period_num(0)); + tt_assert(service->desc_next); + + done: + hs_free_all(); + UNMOCK(get_or_state); + UNMOCK(circuit_mark_for_close_); + UNMOCK(networkstatus_get_live_consensus); +} + +/** Test building descriptors: picking intro points, setting up their link + * specifiers, etc. */ +static void +test_build_update_descriptors(void *arg) +{ + int ret; + time_t now = time(NULL); + node_t *node; + hs_service_t *service; + hs_service_intro_point_t *ip_cur, *ip_next; + routerinfo_t ri; + + (void) arg; + + hs_init(); + + MOCK(get_or_state, + get_or_state_replacement); + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + dummy_state = tor_malloc_zero(sizeof(or_state_t)); + + ret = parse_rfc1123_time("Sat, 26 Oct 1985 03:00:00 UTC", + &mock_ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 04:00:00 UTC", + &mock_ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), mock_ns.valid_after); + + /* Create a service without a current descriptor to trigger a build. */ + service = helper_create_service(); + tt_assert(service); + /* Unfortunately, the helper creates a dummy descriptor so get rid of it. */ + service_descriptor_free(service->desc_current); + service->desc_current = NULL; + + /* We have a fresh service so this should trigger a build for both + * descriptors for specific time period that we'll test. */ + build_all_descriptors(now); + /* Check *current* descriptor. */ + tt_assert(service->desc_current); + tt_assert(service->desc_current->desc); + tt_assert(service->desc_current->intro_points.map); + /* The current time period is the one expected when starting at 03:00. */ + tt_u64_op(service->desc_current->time_period_num, OP_EQ, + hs_get_time_period_num(0)); + /* This should be untouched, the update descriptor process changes it. */ + tt_u64_op(service->desc_current->next_upload_time, OP_EQ, 0); + + /* Check *next* descriptor. */ + tt_assert(service->desc_next); + tt_assert(service->desc_next->desc); + tt_assert(service->desc_next->intro_points.map); + tt_assert(service->desc_current != service->desc_next); + tt_u64_op(service->desc_next->time_period_num, OP_EQ, + hs_get_next_time_period_num(0)); + /* This should be untouched, the update descriptor process changes it. */ + tt_u64_op(service->desc_next->next_upload_time, OP_EQ, 0); + + /* Time to test the update of those descriptors. At first, we have no node + * in the routerlist so this will find NO suitable node for the IPs. */ + setup_full_capture_of_logs(LOG_INFO); + update_all_descriptors(now); + expect_log_msg_containing("Unable to find a suitable node to be an " + "introduction point for service"); + teardown_capture_of_logs(); + tt_int_op(digest256map_size(service->desc_current->intro_points.map), + OP_EQ, 0); + tt_int_op(digest256map_size(service->desc_next->intro_points.map), + OP_EQ, 0); + + /* Now, we'll setup a node_t. */ + { + tor_addr_t ipv4_addr; + curve25519_secret_key_t curve25519_secret_key; + + memset(&ri, 0, sizeof(routerinfo_t)); + + tor_addr_parse(&ipv4_addr, "127.0.0.1"); + ri.addr = tor_addr_to_ipv4h(&ipv4_addr); + ri.or_port = 1337; + ri.purpose = ROUTER_PURPOSE_GENERAL; + /* Ugly yes but we never free the "ri" object so this just makes things + * easier. */ + ri.protocol_list = (char *) "HSDir=1-2 LinkAuth=3"; + ret = curve25519_secret_key_generate(&curve25519_secret_key, 0); + tt_int_op(ret, OP_EQ, 0); + ri.onion_curve25519_pkey = + tor_malloc_zero(sizeof(curve25519_public_key_t)); + ri.onion_pkey = crypto_pk_new(); + curve25519_public_key_generate(ri.onion_curve25519_pkey, + &curve25519_secret_key); + memset(ri.cache_info.identity_digest, 'A', DIGEST_LEN); + /* Setup ed25519 identity */ + ed25519_keypair_t kp1; + ed25519_keypair_generate(&kp1, 0); + ri.cache_info.signing_key_cert = tor_malloc_zero(sizeof(tor_cert_t)); + tt_assert(ri.cache_info.signing_key_cert); + ed25519_pubkey_copy(&ri.cache_info.signing_key_cert->signing_key, + &kp1.pubkey); + nodelist_set_routerinfo(&ri, NULL); + node = node_get_mutable_by_id(ri.cache_info.identity_digest); + tt_assert(node); + node->is_running = node->is_valid = node->is_fast = node->is_stable = 1; + } + + /* We expect to pick only one intro point from the node above. */ + setup_full_capture_of_logs(LOG_INFO); + update_all_descriptors(now); + tor_free(node->ri->onion_curve25519_pkey); /* Avoid memleak. */ + tor_free(node->ri->cache_info.signing_key_cert); + crypto_pk_free(node->ri->onion_pkey); + expect_log_msg_containing("just picked 1 intro points and wanted 3 for next " + "descriptor. It currently has 0 intro points. " + "Launching ESTABLISH_INTRO circuit shortly."); + teardown_capture_of_logs(); + tt_int_op(digest256map_size(service->desc_current->intro_points.map), + OP_EQ, 1); + tt_int_op(digest256map_size(service->desc_next->intro_points.map), + OP_EQ, 1); + /* Get the IP object. Because we don't have the auth key of the IP, we can't + * query it so get the first element in the map. */ + { + void *obj = NULL; + const uint8_t *key; + digest256map_iter_t *iter = + digest256map_iter_init(service->desc_current->intro_points.map); + digest256map_iter_get(iter, &key, &obj); + tt_assert(obj); + ip_cur = obj; + /* Get also the IP from the next descriptor. We'll make sure it's not the + * same object as in the current descriptor. */ + iter = digest256map_iter_init(service->desc_next->intro_points.map); + digest256map_iter_get(iter, &key, &obj); + tt_assert(obj); + ip_next = obj; + } + tt_mem_op(ip_cur, OP_NE, ip_next, sizeof(hs_desc_intro_point_t)); + + /* We won't test the service IP object because there is a specific test + * already for this but we'll make sure that the state is coherent.*/ + + /* Three link specifiers are mandatoy so make sure we do have them. */ + tt_int_op(smartlist_len(ip_cur->base.link_specifiers), OP_EQ, 3); + /* Make sure we have a valid encryption keypair generated when we pick an + * intro point in the update process. */ + tt_assert(!tor_mem_is_zero((char *) ip_cur->enc_key_kp.seckey.secret_key, + CURVE25519_SECKEY_LEN)); + tt_assert(!tor_mem_is_zero((char *) ip_cur->enc_key_kp.pubkey.public_key, + CURVE25519_PUBKEY_LEN)); + tt_u64_op(ip_cur->time_to_expire, OP_GE, now + + INTRO_POINT_LIFETIME_MIN_SECONDS); + tt_u64_op(ip_cur->time_to_expire, OP_LE, now + + INTRO_POINT_LIFETIME_MAX_SECONDS); + + /* Now, we will try to set up a service after a new time period has started + * and see if it behaves as expected. */ + + ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", + &mock_ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", + &mock_ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + + /* Create a service without a current descriptor to trigger a build. */ + service = helper_create_service(); + tt_assert(service); + /* Unfortunately, the helper creates a dummy descriptor so get rid of it. */ + service_descriptor_free(service->desc_current); + service->desc_current = NULL; + + /* We have a fresh service so this should trigger a build for both + * descriptors for specific time period that we'll test. */ + build_all_descriptors(now); + /* Check *current* descriptor. */ + tt_assert(service->desc_current); + tt_assert(service->desc_current->desc); + tt_assert(service->desc_current->intro_points.map); + /* This should be for the previous time period. */ + tt_u64_op(service->desc_current->time_period_num, OP_EQ, + hs_get_previous_time_period_num(0)); + /* This should be untouched, the update descriptor process changes it. */ + tt_u64_op(service->desc_current->next_upload_time, OP_EQ, 0); + + /* Check *next* descriptor. */ + tt_assert(service->desc_next); + tt_assert(service->desc_next->desc); + tt_assert(service->desc_next->intro_points.map); + tt_assert(service->desc_current != service->desc_next); + tt_u64_op(service->desc_next->time_period_num, OP_EQ, + hs_get_time_period_num(0)); + /* This should be untouched, the update descriptor process changes it. */ + tt_u64_op(service->desc_next->next_upload_time, OP_EQ, 0); + + /* Let's remove the next descriptor to simulate a rotation. */ + service_descriptor_free(service->desc_next); + service->desc_next = NULL; + + build_all_descriptors(now); + /* Check *next* descriptor. */ + tt_assert(service->desc_next); + tt_assert(service->desc_next->desc); + tt_assert(service->desc_next->intro_points.map); + tt_assert(service->desc_current != service->desc_next); + tt_u64_op(service->desc_next->time_period_num, OP_EQ, + hs_get_next_time_period_num(0)); + /* This should be untouched, the update descriptor process changes it. */ + tt_u64_op(service->desc_next->next_upload_time, OP_EQ, 0); + + done: + hs_free_all(); + nodelist_free_all(); +} + +static void +test_upload_descriptors(void *arg) +{ + int ret; + time_t now = time(NULL); + hs_service_t *service; + + (void) arg; + + hs_init(); + MOCK(get_or_state, + get_or_state_replacement); + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + dummy_state = tor_malloc_zero(sizeof(or_state_t)); + + ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", + &mock_ns.valid_after); + tt_int_op(ret, OP_EQ, 0); + ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", + &mock_ns.fresh_until); + tt_int_op(ret, OP_EQ, 0); + + /* Create a service with no descriptor. It's added to the global map. */ + service = hs_service_new(get_options()); + tt_assert(service); + service->config.version = HS_VERSION_THREE; + ed25519_secret_key_generate(&service->keys.identity_sk, 0); + ed25519_public_key_generate(&service->keys.identity_pk, + &service->keys.identity_sk); + /* Register service to global map. */ + ret = register_service(get_hs_service_map(), service); + tt_int_op(ret, OP_EQ, 0); + /* But first, build our descriptor. */ + build_all_descriptors(now); + + /* Nothing should happen because we have 0 introduction circuit established + * and we want (by default) 3 intro points. */ + run_upload_descriptor_event(now); + /* If no upload happened, this should be untouched. */ + tt_u64_op(service->desc_current->next_upload_time, OP_EQ, 0); + /* We'll simulate that we've opened our intro point circuit and that we only + * want one intro point. */ + service->config.num_intro_points = 1; + + /* Set our next upload time after now which will skip the upload. */ + service->desc_current->next_upload_time = now + 1000; + run_upload_descriptor_event(now); + /* If no upload happened, this should be untouched. */ + tt_u64_op(service->desc_current->next_upload_time, OP_EQ, now + 1000); + + done: + hs_free_all(); + UNMOCK(get_or_state); +} + +/** Test the functions that save and load HS revision counters to state. */ +static void +test_revision_counter_state(void *arg) +{ + char *state_line_one = NULL; + char *state_line_two = NULL; + + hs_service_descriptor_t *desc_one = service_descriptor_new(); + hs_service_descriptor_t *desc_two = service_descriptor_new(); + + (void) arg; + + /* Prepare both descriptors */ + desc_one->desc->plaintext_data.revision_counter = 42; + desc_two->desc->plaintext_data.revision_counter = 240; + memset(&desc_one->blinded_kp.pubkey.pubkey, 66, + sizeof(desc_one->blinded_kp.pubkey.pubkey)); + memset(&desc_two->blinded_kp.pubkey.pubkey, 240, + sizeof(desc_one->blinded_kp.pubkey.pubkey)); + + /* Turn the descriptor rev counters into state lines */ + state_line_one = encode_desc_rev_counter_for_state(desc_one); + tt_str_op(state_line_one, OP_EQ, + "QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkI 42"); + + state_line_two = encode_desc_rev_counter_for_state(desc_two); + tt_str_op(state_line_two, OP_EQ, + "8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PA 240"); + + /* Now let's test our state parsing function: */ + int service_found; + uint64_t cached_rev_counter; + + /* First's try with wrong pubkey and check that no service was found */ + cached_rev_counter =check_state_line_for_service_rev_counter(state_line_one, + &desc_two->blinded_kp.pubkey, + &service_found); + tt_int_op(service_found, OP_EQ, 0); + tt_u64_op(cached_rev_counter, OP_EQ, 0); + + /* Now let's try with the right pubkeys */ + cached_rev_counter =check_state_line_for_service_rev_counter(state_line_one, + &desc_one->blinded_kp.pubkey, + &service_found); + tt_int_op(service_found, OP_EQ, 1); + tt_u64_op(cached_rev_counter, OP_EQ, 42); + + cached_rev_counter =check_state_line_for_service_rev_counter(state_line_two, + &desc_two->blinded_kp.pubkey, + &service_found); + tt_int_op(service_found, OP_EQ, 1); + tt_u64_op(cached_rev_counter, OP_EQ, 240); + + done: + tor_free(state_line_one); + tor_free(state_line_two); + service_descriptor_free(desc_one); + service_descriptor_free(desc_two); +} + +/** Global vars used by test_rendezvous1_parsing() */ +static char rend1_payload[RELAY_PAYLOAD_SIZE]; +static size_t rend1_payload_len = 0; + +/** Mock for relay_send_command_from_edge() to send a RENDEZVOUS1 cell. Instead + * of sending it to the network, instead save it to the global `rend1_payload` + * variable so that we can inspect it in the test_rendezvous1_parsing() + * test. */ +static int +mock_relay_send_rendezvous1(streamid_t stream_id, circuit_t *circ, + uint8_t relay_command, const char *payload, + size_t payload_len, + crypt_path_t *cpath_layer, + const char *filename, int lineno) +{ + (void) stream_id; + (void) circ; + (void) relay_command; + (void) cpath_layer; + (void) filename; + (void) lineno; + + memcpy(rend1_payload, payload, payload_len); + rend1_payload_len = payload_len; + + return 0; +} + +/** Send a RENDEZVOUS1 as a service, and parse it as a client. */ +static void +test_rendezvous1_parsing(void *arg) +{ + int retval; + static const char *test_addr = + "4acth47i6kxnvkewtm6q7ib2s3ufpo5sqbsnzjpbi7utijcltosqemad.onion"; + hs_service_t *service = NULL; + origin_circuit_t *service_circ = NULL; + origin_circuit_t *client_circ = NULL; + ed25519_keypair_t ip_auth_kp; + curve25519_keypair_t ephemeral_kp; + curve25519_keypair_t client_kp; + curve25519_keypair_t ip_enc_kp; + int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; + + (void) arg; + + MOCK(relay_send_command_from_edge_, mock_relay_send_rendezvous1); + + { + /* Let's start by setting up the service that will start the rend */ + service = tor_malloc_zero(sizeof(hs_service_t)); + ed25519_secret_key_generate(&service->keys.identity_sk, 0); + ed25519_public_key_generate(&service->keys.identity_pk, + &service->keys.identity_sk); + memcpy(service->onion_address, test_addr, sizeof(service->onion_address)); + tt_assert(service); + } + + { + /* Now let's set up the service rendezvous circuit and its keys. */ + service_circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_CONNECT_REND, + flags); + tor_free(service_circ->hs_ident); + hs_ntor_rend_cell_keys_t hs_ntor_rend_cell_keys; + uint8_t rendezvous_cookie[HS_REND_COOKIE_LEN]; + curve25519_keypair_generate(&ip_enc_kp, 0); + curve25519_keypair_generate(&ephemeral_kp, 0); + curve25519_keypair_generate(&client_kp, 0); + ed25519_keypair_generate(&ip_auth_kp, 0); + retval = hs_ntor_service_get_rendezvous1_keys(&ip_auth_kp.pubkey, + &ip_enc_kp, + &ephemeral_kp, + &client_kp.pubkey, + &hs_ntor_rend_cell_keys); + tt_int_op(retval, OP_EQ, 0); + + memset(rendezvous_cookie, 2, sizeof(rendezvous_cookie)); + service_circ->hs_ident = + create_rp_circuit_identifier(service, rendezvous_cookie, + &ephemeral_kp.pubkey, + &hs_ntor_rend_cell_keys); + } + + /* Send out the RENDEZVOUS1 and make sure that our mock func worked */ + tt_assert(tor_mem_is_zero(rend1_payload, 32)); + hs_circ_service_rp_has_opened(service, service_circ); + tt_assert(!tor_mem_is_zero(rend1_payload, 32)); + tt_int_op(rend1_payload_len, OP_EQ, HS_LEGACY_RENDEZVOUS_CELL_SIZE); + + /******************************/ + + /** Now let's create the client rendezvous circuit */ + client_circ = + helper_create_origin_circuit(CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED, + flags); + /* fix up its circ ident */ + ed25519_pubkey_copy(&client_circ->hs_ident->intro_auth_pk, + &ip_auth_kp.pubkey); + memcpy(&client_circ->hs_ident->rendezvous_client_kp, + &client_kp, sizeof(client_circ->hs_ident->rendezvous_client_kp)); + memcpy(&client_circ->hs_ident->intro_enc_pk.public_key, + &ip_enc_kp.pubkey.public_key, + sizeof(client_circ->hs_ident->intro_enc_pk.public_key)); + + /* Now parse the rendezvous2 circuit and make sure it was fine. We are + * skipping 20 bytes off its payload, since that's the rendezvous cookie + * which is only present in REND1. */ + retval = handle_rendezvous2(client_circ, + (uint8_t*)rend1_payload+20, + rend1_payload_len-20); + tt_int_op(retval, OP_EQ, 0); + + /* TODO: We are only simulating client/service here. We could also simulate + * the rendezvous point by plugging in rend_mid_establish_rendezvous(). We + * would need an extra circuit and some more stuff but it's doable. */ + + done: + circuit_free_(TO_CIRCUIT(service_circ)); + circuit_free_(TO_CIRCUIT(client_circ)); + hs_service_free(service); + hs_free_all(); + UNMOCK(relay_send_command_from_edge_); +} + +struct testcase_t hs_service_tests[] = { + { "e2e_rend_circuit_setup", test_e2e_rend_circuit_setup, TT_FORK, + NULL, NULL }, + { "load_keys", test_load_keys, TT_FORK, + NULL, NULL }, + { "access_service", test_access_service, TT_FORK, + NULL, NULL }, + { "service_intro_point", test_service_intro_point, TT_FORK, + NULL, NULL }, + { "helper_functions", test_helper_functions, TT_FORK, + NULL, NULL }, + { "intro_circuit_opened", test_intro_circuit_opened, TT_FORK, + NULL, NULL }, + { "intro_established", test_intro_established, TT_FORK, + NULL, NULL }, + { "closing_intro_circs", test_closing_intro_circs, TT_FORK, + NULL, NULL }, + { "rdv_circuit_opened", test_rdv_circuit_opened, TT_FORK, + NULL, NULL }, + { "introduce2", test_introduce2, TT_FORK, + NULL, NULL }, + { "service_event", test_service_event, TT_FORK, + NULL, NULL }, + { "rotate_descriptors", test_rotate_descriptors, TT_FORK, + NULL, NULL }, + { "build_update_descriptors", test_build_update_descriptors, TT_FORK, + NULL, NULL }, + { "upload_descriptors", test_upload_descriptors, TT_FORK, + NULL, NULL }, + { "revision_counter_state", test_revision_counter_state, TT_FORK, + NULL, NULL }, + { "rendezvous1_parsing", test_rendezvous1_parsing, TT_FORK, + NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_introduce.c b/src/wraith/src/test/test_introduce.c new file mode 100644 index 000000000..d502bdddb --- /dev/null +++ b/src/wraith/src/test/test_introduce.c @@ -0,0 +1,538 @@ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "crypto.h" +#include "or.h" +#include "test.h" + +#define RENDSERVICE_PRIVATE +#include "rendservice.h" + +static uint8_t v0_test_plaintext[] = + /* 20 bytes of rendezvous point nickname */ + { 0x4e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + /* 20 bytes dummy rendezvous cookie */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, + /* 128 bytes dummy DH handshake data */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; + +static uint8_t v1_test_plaintext[] = + /* Version byte */ + { 0x01, + /* 42 bytes of dummy rendezvous point hex digest */ + 0x24, 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, + 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, + 0x37, 0x30, 0x38, 0x30, 0x39, 0x30, 0x41, 0x30, + 0x42, 0x30, 0x43, 0x30, 0x44, 0x30, 0x45, 0x30, + 0x46, 0x31, 0x30, 0x31, 0x31, 0x31, 0x32, 0x31, + 0x33, 0x00, + /* 20 bytes dummy rendezvous cookie */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, + /* 128 bytes dummy DH handshake data */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; + +static uint8_t v2_test_plaintext[] = + /* Version byte */ + { 0x02, + /* 4 bytes rendezvous point's IP address */ + 0xc0, 0xa8, 0x00, 0x01, + /* 2 bytes rendezvous point's OR port */ + 0x23, 0x5a, + /* 20 bytes dummy rendezvous point's identity digest */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, + /* 2 bytes length of onion key */ + 0x00, 0x8c, + /* Onion key (140 bytes taken from live test) */ + 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xb1, + 0xcd, 0x46, 0xa9, 0x18, 0xd2, 0x0f, 0x01, 0xf8, + 0xb2, 0xad, 0xa4, 0x79, 0xb4, 0xbb, 0x4b, 0xf4, + 0x54, 0x1e, 0x3f, 0x03, 0x54, 0xcf, 0x7c, 0xb6, + 0xb5, 0xf0, 0xfe, 0xed, 0x4b, 0x7d, 0xd7, 0x61, + 0xdb, 0x6d, 0xd9, 0x19, 0xe2, 0x72, 0x04, 0xaa, + 0x3e, 0x89, 0x26, 0x14, 0x62, 0x9a, 0x6c, 0x11, + 0x0b, 0x35, 0x99, 0x2c, 0x9f, 0x2c, 0x64, 0xa1, + 0xd9, 0xe2, 0x88, 0xce, 0xf6, 0x54, 0xfe, 0x1d, + 0x37, 0x5e, 0x6d, 0x73, 0x95, 0x54, 0x90, 0xf0, + 0x7b, 0xfa, 0xd4, 0x44, 0xac, 0xb2, 0x23, 0x9f, + 0x75, 0x36, 0xe2, 0x78, 0x62, 0x82, 0x80, 0xa4, + 0x23, 0x22, 0xc9, 0xbf, 0xc4, 0x36, 0xd1, 0x31, + 0x33, 0x8e, 0x64, 0xb4, 0xa9, 0x74, 0xa1, 0xcb, + 0x42, 0x8d, 0x60, 0xc7, 0xbb, 0x8e, 0x6e, 0x0f, + 0x36, 0x74, 0x8e, 0xf4, 0x08, 0x99, 0x06, 0x92, + 0xb1, 0x3f, 0xb3, 0xdd, 0xed, 0xf7, 0xc9, 0x02, + 0x03, 0x01, 0x00, 0x01, + /* 20 bytes dummy rendezvous cookie */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, + /* 128 bytes dummy DH handshake data */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; + +static uint8_t v3_no_auth_test_plaintext[] = + /* Version byte */ + { 0x03, + /* Auth type (0 for no auth len/auth data) */ + 0x00, + /* Timestamp */ + 0x50, 0x0b, 0xb5, 0xaa, + /* 4 bytes rendezvous point's IP address */ + 0xc0, 0xa8, 0x00, 0x01, + /* 2 bytes rendezvous point's OR port */ + 0x23, 0x5a, + /* 20 bytes dummy rendezvous point's identity digest */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, + /* 2 bytes length of onion key */ + 0x00, 0x8c, + /* Onion key (140 bytes taken from live test) */ + 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xb1, + 0xcd, 0x46, 0xa9, 0x18, 0xd2, 0x0f, 0x01, 0xf8, + 0xb2, 0xad, 0xa4, 0x79, 0xb4, 0xbb, 0x4b, 0xf4, + 0x54, 0x1e, 0x3f, 0x03, 0x54, 0xcf, 0x7c, 0xb6, + 0xb5, 0xf0, 0xfe, 0xed, 0x4b, 0x7d, 0xd7, 0x61, + 0xdb, 0x6d, 0xd9, 0x19, 0xe2, 0x72, 0x04, 0xaa, + 0x3e, 0x89, 0x26, 0x14, 0x62, 0x9a, 0x6c, 0x11, + 0x0b, 0x35, 0x99, 0x2c, 0x9f, 0x2c, 0x64, 0xa1, + 0xd9, 0xe2, 0x88, 0xce, 0xf6, 0x54, 0xfe, 0x1d, + 0x37, 0x5e, 0x6d, 0x73, 0x95, 0x54, 0x90, 0xf0, + 0x7b, 0xfa, 0xd4, 0x44, 0xac, 0xb2, 0x23, 0x9f, + 0x75, 0x36, 0xe2, 0x78, 0x62, 0x82, 0x80, 0xa4, + 0x23, 0x22, 0xc9, 0xbf, 0xc4, 0x36, 0xd1, 0x31, + 0x33, 0x8e, 0x64, 0xb4, 0xa9, 0x74, 0xa1, 0xcb, + 0x42, 0x8d, 0x60, 0xc7, 0xbb, 0x8e, 0x6e, 0x0f, + 0x36, 0x74, 0x8e, 0xf4, 0x08, 0x99, 0x06, 0x92, + 0xb1, 0x3f, 0xb3, 0xdd, 0xed, 0xf7, 0xc9, 0x02, + 0x03, 0x01, 0x00, 0x01, + /* 20 bytes dummy rendezvous cookie */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, + /* 128 bytes dummy DH handshake data */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; + +static uint8_t v3_basic_auth_test_plaintext[] = + /* Version byte */ + { 0x03, + /* Auth type (1 for REND_BASIC_AUTH) */ + 0x01, + /* Auth len (must be 16 bytes for REND_BASIC_AUTH) */ + 0x00, 0x10, + /* Auth data (a 16-byte dummy descriptor cookie) */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + /* Timestamp */ + 0x50, 0x0b, 0xb5, 0xaa, + /* 4 bytes rendezvous point's IP address */ + 0xc0, 0xa8, 0x00, 0x01, + /* 2 bytes rendezvous point's OR port */ + 0x23, 0x5a, + /* 20 bytes dummy rendezvous point's identity digest */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, + /* 2 bytes length of onion key */ + 0x00, 0x8c, + /* Onion key (140 bytes taken from live test) */ + 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xb1, + 0xcd, 0x46, 0xa9, 0x18, 0xd2, 0x0f, 0x01, 0xf8, + 0xb2, 0xad, 0xa4, 0x79, 0xb4, 0xbb, 0x4b, 0xf4, + 0x54, 0x1e, 0x3f, 0x03, 0x54, 0xcf, 0x7c, 0xb6, + 0xb5, 0xf0, 0xfe, 0xed, 0x4b, 0x7d, 0xd7, 0x61, + 0xdb, 0x6d, 0xd9, 0x19, 0xe2, 0x72, 0x04, 0xaa, + 0x3e, 0x89, 0x26, 0x14, 0x62, 0x9a, 0x6c, 0x11, + 0x0b, 0x35, 0x99, 0x2c, 0x9f, 0x2c, 0x64, 0xa1, + 0xd9, 0xe2, 0x88, 0xce, 0xf6, 0x54, 0xfe, 0x1d, + 0x37, 0x5e, 0x6d, 0x73, 0x95, 0x54, 0x90, 0xf0, + 0x7b, 0xfa, 0xd4, 0x44, 0xac, 0xb2, 0x23, 0x9f, + 0x75, 0x36, 0xe2, 0x78, 0x62, 0x82, 0x80, 0xa4, + 0x23, 0x22, 0xc9, 0xbf, 0xc4, 0x36, 0xd1, 0x31, + 0x33, 0x8e, 0x64, 0xb4, 0xa9, 0x74, 0xa1, 0xcb, + 0x42, 0x8d, 0x60, 0xc7, 0xbb, 0x8e, 0x6e, 0x0f, + 0x36, 0x74, 0x8e, 0xf4, 0x08, 0x99, 0x06, 0x92, + 0xb1, 0x3f, 0xb3, 0xdd, 0xed, 0xf7, 0xc9, 0x02, + 0x03, 0x01, 0x00, 0x01, + /* 20 bytes dummy rendezvous cookie */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, + /* 128 bytes dummy DH handshake data */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; + +static void do_decrypt_test(uint8_t *plaintext, size_t plaintext_len); +static void do_early_parse_test(uint8_t *plaintext, size_t plaintext_len); +static void do_late_parse_test(uint8_t *plaintext, size_t plaintext_len); +static void do_parse_test(uint8_t *plaintext, size_t plaintext_len, int phase); +static ssize_t make_intro_from_plaintext( + void *buf, size_t len, crypto_pk_t *key, void **cell_out); + +#define EARLY_PARSE_ONLY 1 +#define DECRYPT_ONLY 2 +#define ALL_PARSING 3 + +static void +do_early_parse_test(uint8_t *plaintext, size_t plaintext_len) +{ + do_parse_test(plaintext, plaintext_len, EARLY_PARSE_ONLY); +} + +static void +do_decrypt_test(uint8_t *plaintext, size_t plaintext_len) +{ + do_parse_test(plaintext, plaintext_len, DECRYPT_ONLY); +} + +static void +do_late_parse_test(uint8_t *plaintext, size_t plaintext_len) +{ + do_parse_test(plaintext, plaintext_len, ALL_PARSING); +} + +/** Test utility function: checks that the plaintext_len-byte string at + * plaintext is at least superficially parseable. + */ +static void +do_parse_test(uint8_t *plaintext, size_t plaintext_len, int phase) +{ + crypto_pk_t *k = NULL; + ssize_t r; + uint8_t *cell = NULL; + size_t cell_len; + rend_intro_cell_t *parsed_req = NULL; + char *err_msg = NULL; + char digest[DIGEST_LEN]; + + /* Get a key */ + k = crypto_pk_new(); + tt_assert(k); + r = crypto_pk_read_private_key_from_string(k, AUTHORITY_SIGNKEY_1, -1); + tt_assert(!r); + + /* Get digest for future comparison */ + r = crypto_pk_get_digest(k, digest); + tt_assert(r >= 0); + + /* Make a cell out of it */ + r = make_intro_from_plaintext( + plaintext, plaintext_len, + k, (void **)(&cell)); + tt_assert(r > 0); + tt_assert(cell); + cell_len = r; + + /* Do early parsing */ + parsed_req = rend_service_begin_parse_intro(cell, cell_len, 2, &err_msg); + tt_assert(parsed_req); + tt_ptr_op(err_msg, OP_EQ, NULL); + tt_mem_op(parsed_req->pk,OP_EQ, digest, DIGEST_LEN); + tt_assert(parsed_req->ciphertext); + tt_assert(parsed_req->ciphertext_len > 0); + + if (phase == EARLY_PARSE_ONLY) + goto done; + + /* Do decryption */ + r = rend_service_decrypt_intro(parsed_req, k, &err_msg); + tt_assert(!r); + tt_ptr_op(err_msg, OP_EQ, NULL); + tt_assert(parsed_req->plaintext); + tt_assert(parsed_req->plaintext_len > 0); + + if (phase == DECRYPT_ONLY) + goto done; + + /* Do late parsing */ + r = rend_service_parse_intro_plaintext(parsed_req, &err_msg); + tt_assert(!r); + tt_ptr_op(err_msg, OP_EQ, NULL); + tt_assert(parsed_req->parsed); + + done: + tor_free(cell); + crypto_pk_free(k); + rend_service_free_intro(parsed_req); + tor_free(err_msg); +} + +/** Given the plaintext of the encrypted part of an INTRODUCE1/2 and a key, + * construct the encrypted cell for testing. + */ + +static ssize_t +make_intro_from_plaintext( + void *buf, size_t len, crypto_pk_t *key, void **cell_out) +{ + char *cell = NULL; + ssize_t cell_len = -1, r; + /* Assemble key digest and ciphertext, then construct the cell */ + ssize_t ciphertext_size; + + if (!(buf && key && len > 0 && cell_out)) goto done; + + /* + * Figure out an upper bound on how big the ciphertext will be + * (see crypto_pk_obsolete_public_hybrid_encrypt()) + */ + ciphertext_size = PKCS1_OAEP_PADDING_OVERHEAD; + ciphertext_size += crypto_pk_keysize(key); + ciphertext_size += CIPHER_KEY_LEN; + ciphertext_size += len; + + /* + * Allocate space for the cell + */ + cell = tor_malloc(DIGEST_LEN + ciphertext_size); + + /* Compute key digest (will be first DIGEST_LEN octets of cell) */ + r = crypto_pk_get_digest(key, cell); + tt_assert(r >= 0); + + /* Do encryption */ + r = crypto_pk_obsolete_public_hybrid_encrypt( + key, cell + DIGEST_LEN, ciphertext_size, + buf, len, + PK_PKCS1_OAEP_PADDING, 0); + tt_assert(r >= 0); + + /* Figure out cell length */ + cell_len = DIGEST_LEN + r; + + /* Output the cell */ + *cell_out = cell; + + done: + return cell_len; +} + +/** Test v0 INTRODUCE2 parsing through decryption only + */ + +static void +test_introduce_decrypt_v0(void *arg) +{ + (void)arg; + do_decrypt_test(v0_test_plaintext, sizeof(v0_test_plaintext)); +} + +/** Test v1 INTRODUCE2 parsing through decryption only + */ + +static void +test_introduce_decrypt_v1(void *arg) +{ + (void)arg; + do_decrypt_test(v1_test_plaintext, sizeof(v1_test_plaintext)); +} + +/** Test v2 INTRODUCE2 parsing through decryption only + */ + +static void +test_introduce_decrypt_v2(void *arg) +{ + (void)arg; + do_decrypt_test(v2_test_plaintext, sizeof(v2_test_plaintext)); +} + +/** Test v3 INTRODUCE2 parsing through decryption only + */ + +static void +test_introduce_decrypt_v3(void *arg) +{ + (void)arg; + do_decrypt_test( + v3_no_auth_test_plaintext, sizeof(v3_no_auth_test_plaintext)); + do_decrypt_test( + v3_basic_auth_test_plaintext, sizeof(v3_basic_auth_test_plaintext)); +} + +/** Test v0 INTRODUCE2 parsing through early parsing only + */ + +static void +test_introduce_early_parse_v0(void *arg) +{ + (void)arg; + do_early_parse_test(v0_test_plaintext, sizeof(v0_test_plaintext)); +} + +/** Test v1 INTRODUCE2 parsing through early parsing only + */ + +static void +test_introduce_early_parse_v1(void *arg) +{ + (void)arg; + do_early_parse_test(v1_test_plaintext, sizeof(v1_test_plaintext)); +} + +/** Test v2 INTRODUCE2 parsing through early parsing only + */ + +static void +test_introduce_early_parse_v2(void *arg) +{ + (void)arg; + do_early_parse_test(v2_test_plaintext, sizeof(v2_test_plaintext)); +} + +/** Test v3 INTRODUCE2 parsing through early parsing only + */ + +static void +test_introduce_early_parse_v3(void *arg) +{ + (void)arg; + do_early_parse_test( + v3_no_auth_test_plaintext, sizeof(v3_no_auth_test_plaintext)); + do_early_parse_test( + v3_basic_auth_test_plaintext, sizeof(v3_basic_auth_test_plaintext)); +} + +/** Test v0 INTRODUCE2 parsing + */ + +static void +test_introduce_late_parse_v0(void *arg) +{ + (void)arg; + do_late_parse_test(v0_test_plaintext, sizeof(v0_test_plaintext)); +} + +/** Test v1 INTRODUCE2 parsing + */ + +static void +test_introduce_late_parse_v1(void *arg) +{ + (void)arg; + do_late_parse_test(v1_test_plaintext, sizeof(v1_test_plaintext)); +} + +/** Test v2 INTRODUCE2 parsing + */ + +static void +test_introduce_late_parse_v2(void *arg) +{ + (void)arg; + do_late_parse_test(v2_test_plaintext, sizeof(v2_test_plaintext)); +} + +/** Test v3 INTRODUCE2 parsing + */ + +static void +test_introduce_late_parse_v3(void *arg) +{ + (void)arg; + do_late_parse_test( + v3_no_auth_test_plaintext, sizeof(v3_no_auth_test_plaintext)); + do_late_parse_test( + v3_basic_auth_test_plaintext, sizeof(v3_basic_auth_test_plaintext)); +} + +#define INTRODUCE_LEGACY(name) \ + { #name, test_introduce_ ## name , 0, NULL, NULL } + +struct testcase_t introduce_tests[] = { + INTRODUCE_LEGACY(early_parse_v0), + INTRODUCE_LEGACY(early_parse_v1), + INTRODUCE_LEGACY(early_parse_v2), + INTRODUCE_LEGACY(early_parse_v3), + INTRODUCE_LEGACY(decrypt_v0), + INTRODUCE_LEGACY(decrypt_v1), + INTRODUCE_LEGACY(decrypt_v2), + INTRODUCE_LEGACY(decrypt_v3), + INTRODUCE_LEGACY(late_parse_v0), + INTRODUCE_LEGACY(late_parse_v1), + INTRODUCE_LEGACY(late_parse_v2), + INTRODUCE_LEGACY(late_parse_v3), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_key_expiration.sh b/src/wraith/src/test/test_key_expiration.sh new file mode 100644 index 000000000..5511dbf18 --- /dev/null +++ b/src/wraith/src/test/test_key_expiration.sh @@ -0,0 +1,129 @@ +#!/bin/sh + +# Note: some of this code is lifted from zero_length_keys.sh and +# test_keygen.sh, and could be unified. + +umask 077 +set -e + +if [ $# -eq 0 ] || [ ! -f ${1} ] || [ ! -x ${1} ]; then + if [ "$TESTING_TOR_BINARY" = "" ] ; then + echo "Usage: ${0} PATH_TO_TOR [case-number]" + exit 1 + fi +fi + +if [ $# -ge 1 ]; then + TOR_BINARY="${1}" + shift +else + TOR_BINARY="${TESTING_TOR_BINARY}" +fi + +if [ $# -ge 1 ]; then + dflt=0 +else + dflt=1 +fi + +CASE1=$dflt +CASE2=$dflt +CASE3=$dflt + +if [ $# -ge 1 ]; then + eval "CASE${1}"=1 +fi + + +dump() { xxd -p "$1" | tr -d '\n '; } +die() { echo "$1" >&2 ; exit 5; } +check_dir() { [ -d "$1" ] || die "$1 did not exist"; } +check_file() { [ -e "$1" ] || die "$1 did not exist"; } +check_no_file() { [ -e "$1" ] && die "$1 was not supposed to exist" || true; } +check_files_eq() { cmp "$1" "$2" || die "$1 and $2 did not match: `dump $1` vs `dump $2`"; } +check_keys_eq() { check_files_eq "${SRC}/keys/${1}" "${ME}/keys/${1}"; } + +DATA_DIR=`mktemp -d -t tor_key_expiration_tests.XXXXXX` +if [ -z "$DATA_DIR" ]; then + echo "Failure: mktemp invocation returned empty string" >&2 + exit 3 +fi +if [ ! -d "$DATA_DIR" ]; then + echo "Failure: mktemp invocation result doesn't point to directory" >&2 + exit 3 +fi +trap "rm -rf '$DATA_DIR'" 0 + +# Use an absolute path for this or Tor will complain +DATA_DIR=`cd "${DATA_DIR}" && pwd` + +touch "${DATA_DIR}/empty_torrc" + +QUIETLY="--hush" +SILENTLY="--quiet" +TOR="${TOR_BINARY} --DisableNetwork 1 --ShutdownWaitLength 0 --ORPort 12345 --ExitRelay 0 -f ${DATA_DIR}/empty_torrc --DataDirectory ${DATA_DIR}" + +##### SETUP +# +# Here we create a set of keys. + +# Step 1: Start Tor with --list-fingerprint --quiet. Make sure everything is there. +echo "Setup step #1" +${TOR} --list-fingerprint ${SILENTLY} > /dev/null + +check_dir "${DATA_DIR}/keys" +check_file "${DATA_DIR}/keys/ed25519_master_id_public_key" +check_file "${DATA_DIR}/keys/ed25519_master_id_secret_key" +check_file "${DATA_DIR}/keys/ed25519_signing_cert" +check_file "${DATA_DIR}/keys/ed25519_signing_secret_key" +check_file "${DATA_DIR}/keys/secret_id_key" +check_file "${DATA_DIR}/keys/secret_onion_key" +check_file "${DATA_DIR}/keys/secret_onion_key_ntor" + +##### TEST CASES + +echo "=== Starting key expiration tests." + +FN="${DATA_DIR}/stderr" + +if [ "$CASE1" = 1 ]; then + echo "==== Case 1: Test --key-expiration without argument and ensure usage" + echo " instructions are printed." + + ${TOR} ${QUIETLY} --key-expiration 2>"$FN" || true + grep "No valid argument to --key-expiration found!" "$FN" >/dev/null || \ + die "Tor didn't mention supported --key-expiration argmuents" + + echo "==== Case 1: ok" +fi + +if [ "$CASE2" = 1 ]; then + echo "==== Case 2: Start Tor with --key-expiration 'sign' and make sure it prints an expiration." + + ${TOR} ${QUIETLY} --key-expiration sign 2>"$FN" + grep "signing-cert-expiry:" "$FN" >/dev/null || \ + die "Tor didn't print an expiration" + + echo "==== Case 2: ok" +fi + +if [ "$CASE3" = 1 ]; then + echo "==== Case 3: Start Tor with --key-expiration 'sign', when there is no" + echo " signing key, and make sure that Tor generates a new key" + echo " and prints its certificate's expiration." + + mv "${DATA_DIR}/keys/ed25519_signing_cert" \ + "${DATA_DIR}/keys/ed25519_signing_cert.bak" + + ${TOR} --key-expiration sign > "$FN" 2>&1 + grep "It looks like I need to generate and sign a new medium-term signing key" "$FN" >/dev/null || \ + die "Tor didn't create a new signing key" + check_file "${DATA_DIR}/keys/ed25519_signing_cert" + grep "signing-cert-expiry:" "$FN" >/dev/null || \ + die "Tor didn't print an expiration" + + mv "${DATA_DIR}/keys/ed25519_signing_cert.bak" \ + "${DATA_DIR}/keys/ed25519_signing_cert" + + echo "==== Case 3: ok" +fi diff --git a/src/wraith/src/test/test_keygen.sh b/src/wraith/src/test/test_keygen.sh new file mode 100644 index 000000000..b3d4d8e39 --- /dev/null +++ b/src/wraith/src/test/test_keygen.sh @@ -0,0 +1,477 @@ +#!/bin/sh + +# Note: some of this code is lifted from zero_length_keys.sh, and could be +# unified. + +umask 077 +set -e + +if [ $# -eq 0 ] || [ ! -f ${1} ] || [ ! -x ${1} ]; then + if [ "$TESTING_TOR_BINARY" = "" ] ; then + echo "Usage: ${0} PATH_TO_TOR [case-number]" + exit 1 + fi +fi + +if [ $# -ge 1 ]; then + TOR_BINARY="${1}" + shift +else + TOR_BINARY="${TESTING_TOR_BINARY}" +fi + + + + if [ $# -ge 1 ]; then + dflt=0 + else + dflt=1 + fi + + CASE2A=$dflt + CASE2B=$dflt + CASE3A=$dflt + CASE3B=$dflt + CASE3C=$dflt + CASE4=$dflt + CASE5=$dflt + CASE6=$dflt + CASE7=$dflt + CASE8=$dflt + CASE9=$dflt + CASE10=$dflt + CASE11A=$dflt + CASE11B=$dflt + CASE11C=$dflt + CASE11D=$dflt + CASE11E=$dflt + CASE11F=$dflt + + if [ $# -ge 1 ]; then + eval "CASE${1}"=1 + fi + + +dump() { xxd -p "$1" | tr -d '\n '; } +die() { echo "$1" >&2 ; exit 5; } +check_dir() { [ -d "$1" ] || die "$1 did not exist"; } +check_file() { [ -e "$1" ] || die "$1 did not exist"; } +check_no_file() { [ -e "$1" ] && die "$1 was not supposed to exist" || true; } +check_files_eq() { cmp "$1" "$2" || die "$1 and $2 did not match: `dump $1` vs `dump $2`"; } +check_keys_eq() { check_files_eq "${SRC}/keys/${1}" "${ME}/keys/${1}"; } + +DATA_DIR=`mktemp -d -t tor_keygen_tests.XXXXXX` +if [ -z "$DATA_DIR" ]; then + echo "Failure: mktemp invocation returned empty string" >&2 + exit 3 +fi +if [ ! -d "$DATA_DIR" ]; then + echo "Failure: mktemp invocation result doesn't point to directory" >&2 + exit 3 +fi +trap "rm -rf '$DATA_DIR'" 0 + +# Use an absolute path for this or Tor will complain +DATA_DIR=`cd "${DATA_DIR}" && pwd` + +touch "${DATA_DIR}/empty_torrc" + +QUIETLY="--hush" +SILENTLY="--quiet" +TOR="${TOR_BINARY} ${QUIETLY} --DisableNetwork 1 --ShutdownWaitLength 0 --ORPort 12345 --ExitRelay 0 -f ${DATA_DIR}/empty_torrc" + +##### SETUP +# +# Here we create three sets of keys: one using "tor", one using "tor +# --keygen", and one using "tor --keygen" and encryption. We'll be +# copying them into different keys directories in order to simulate +# different kinds of configuration problems/issues. + +# Step 1: Start Tor with --list-fingerprint --quiet. Make sure everything is there. +mkdir "${DATA_DIR}/orig" +${TOR} --DataDirectory "${DATA_DIR}/orig" --list-fingerprint ${SILENTLY} > /dev/null + +check_dir "${DATA_DIR}/orig/keys" +check_file "${DATA_DIR}/orig/keys/ed25519_master_id_public_key" +check_file "${DATA_DIR}/orig/keys/ed25519_master_id_secret_key" +check_file "${DATA_DIR}/orig/keys/ed25519_signing_cert" +check_file "${DATA_DIR}/orig/keys/ed25519_signing_secret_key" + +# Step 2: Start Tor with --keygen. Make sure everything is there. +mkdir "${DATA_DIR}/keygen" +${TOR} --DataDirectory "${DATA_DIR}/keygen" --keygen --no-passphrase 2>"${DATA_DIR}/keygen/stderr" +grep "Not encrypting the secret key" "${DATA_DIR}/keygen/stderr" >/dev/null || die "Tor didn't declare that there would be no encryption" + +check_dir "${DATA_DIR}/keygen/keys" +check_file "${DATA_DIR}/keygen/keys/ed25519_master_id_public_key" +check_file "${DATA_DIR}/keygen/keys/ed25519_master_id_secret_key" +check_file "${DATA_DIR}/keygen/keys/ed25519_signing_cert" +check_file "${DATA_DIR}/keygen/keys/ed25519_signing_secret_key" + +# Step 3: Start Tor with --keygen and a passphrase. +# Make sure everything is there. +mkdir "${DATA_DIR}/encrypted" +echo "passphrase" | ${TOR} --DataDirectory "${DATA_DIR}/encrypted" --keygen --passphrase-fd 0 + +check_dir "${DATA_DIR}/encrypted/keys" +check_file "${DATA_DIR}/encrypted/keys/ed25519_master_id_public_key" +check_file "${DATA_DIR}/encrypted/keys/ed25519_master_id_secret_key_encrypted" +check_file "${DATA_DIR}/encrypted/keys/ed25519_signing_cert" +check_file "${DATA_DIR}/encrypted/keys/ed25519_signing_secret_key" + + +echo "=== Starting keygen tests." + +# +# The "case X" numbers below come from s7r's email on +# https://lists.torproject.org/pipermail/tor-dev/2015-August/009204.html + + +# Case 2a: Missing secret key, public key exists, start tor. + +if [ "$CASE2A" = 1 ]; then + +ME="${DATA_DIR}/case2a" +SRC="${DATA_DIR}/orig" +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/" +${TOR} --DataDirectory "${ME}" --list-fingerprint > "${ME}/stdout" && die "Somehow succeeded when missing secret key, certs: `cat ${ME}/stdout`" || true +check_files_eq "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/ed25519_master_id_public_key" + +grep "We needed to load a secret key.*but couldn't find it" "${ME}/stdout" >/dev/null || die "Tor didn't declare that it was missing a secret key" + +echo "==== Case 2A ok" +fi + +# Case 2b: Encrypted secret key, public key exists, start tor. + +if [ "$CASE2B" = 1 ]; then + +ME="${DATA_DIR}/case2b" +SRC="${DATA_DIR}/encrypted" + +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/" +cp "${SRC}/keys/ed25519_master_id_secret_key_encrypted" "${ME}/keys/" +${TOR} --DataDirectory "${ME}" --list-fingerprint > "${ME}/stdout" && dir "Somehow succeeded with encrypted secret key, missing certs" + +check_files_eq "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/ed25519_master_id_public_key" +check_files_eq "${SRC}/keys/ed25519_master_id_secret_key_encrypted" "${ME}/keys/ed25519_master_id_secret_key_encrypted" + +grep "We needed to load a secret key.*but it was encrypted.*--keygen" "${ME}/stdout" >/dev/null || die "Tor didn't declare that it was missing a secret key and suggest --keygen." + +echo "==== Case 2B ok" + +fi + +# Case 3a: Start Tor with only master key. + +if [ "$CASE3A" = 1 ]; then + +ME="${DATA_DIR}/case3a" +SRC="${DATA_DIR}/orig" + +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_master_id_"* "${ME}/keys/" +${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} >/dev/null || die "Tor failed when starting with only master key" +check_files_eq "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/ed25519_master_id_public_key" +check_files_eq "${SRC}/keys/ed25519_master_id_secret_key" "${ME}/keys/ed25519_master_id_secret_key" +check_file "${ME}/keys/ed25519_signing_cert" +check_file "${ME}/keys/ed25519_signing_secret_key" + +echo "==== Case 3A ok" + +fi + +# Case 3b: Call keygen with only unencrypted master key. + +if [ "$CASE3B" = 1 ]; then + +ME="${DATA_DIR}/case3b" +SRC="${DATA_DIR}/orig" + +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_master_id_"* "${ME}/keys/" +${TOR} --DataDirectory "${ME}" --keygen || die "Keygen failed with only master key" +check_files_eq "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/ed25519_master_id_public_key" +check_files_eq "${SRC}/keys/ed25519_master_id_secret_key" "${ME}/keys/ed25519_master_id_secret_key" +check_file "${ME}/keys/ed25519_signing_cert" +check_file "${ME}/keys/ed25519_signing_secret_key" + +echo "==== Case 3B ok" + +fi + +# Case 3c: Call keygen with only encrypted master key. + +if [ "$CASE3C" = 1 ]; then + +ME="${DATA_DIR}/case3c" +SRC="${DATA_DIR}/encrypted" + +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_master_id_"* "${ME}/keys/" +echo "passphrase" | ${TOR} --DataDirectory "${ME}" --keygen --passphrase-fd 0 || die "Keygen failed with only encrypted master key" +check_files_eq "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/ed25519_master_id_public_key" +check_files_eq "${SRC}/keys/ed25519_master_id_secret_key_encrypted" "${ME}/keys/ed25519_master_id_secret_key_encrypted" +check_file "${ME}/keys/ed25519_signing_cert" +check_file "${ME}/keys/ed25519_signing_secret_key" + +echo "==== Case 3C ok" + +fi + +# Case 4: Make a new data directory with only an unencrypted secret key. +# Then start tor. The rest should become correct. + +if [ "$CASE4" = 1 ]; then + +ME="${DATA_DIR}/case4" +SRC="${DATA_DIR}/orig" + +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_master_id_secret_key" "${ME}/keys/" +${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} > "${ME}/fp1" || die "Tor wouldn't start with only unencrypted secret key" +check_file "${ME}/keys/ed25519_master_id_public_key" +check_file "${ME}/keys/ed25519_signing_cert" +check_file "${ME}/keys/ed25519_signing_secret_key" +${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} > "${ME}/fp2" || die "Tor wouldn't start again after starting once with only unencrypted secret key." + +check_files_eq "${ME}/fp1" "${ME}/fp2" + +echo "==== Case 4 ok" + +fi + +# Case 5: Make a new data directory with only an encrypted secret key. + +if [ "$CASE5" = 1 ]; then + +ME="${DATA_DIR}/case5" +SRC="${DATA_DIR}/encrypted" + +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_master_id_secret_key_encrypted" "${ME}/keys/" +${TOR} --DataDirectory "${ME}" --list-fingerprint >"${ME}/stdout" && die "Tor started with only encrypted secret key!" +check_no_file "${ME}/keys/ed25519_master_id_public_key" +check_no_file "${ME}/keys/ed25519_master_id_public_key" + +grep "but not public key file" "${ME}/stdout" >/dev/null || die "Tor didn't declare it couldn't find a public key." + +echo "==== Case 5 ok" + +fi + +# Case 6: Make a new data directory with encrypted secret key and public key + +if [ "$CASE6" = 1 ]; then + +ME="${DATA_DIR}/case6" +SRC="${DATA_DIR}/encrypted" + +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_master_id_secret_key_encrypted" "${ME}/keys/" +cp "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/" +${TOR} --DataDirectory "${ME}" --list-fingerprint > "${ME}/stdout" && die "Tor started with encrypted secret key and no certs" || true +check_no_file "${ME}/keys/ed25519_signing_cert" +check_no_file "${ME}/keys/ed25519_signing_secret_key" + +grep "but it was encrypted" "${ME}/stdout" >/dev/null || die "Tor didn't declare that the secret key was encrypted." + +echo "==== Case 6 ok" + +fi + +# Case 7: Make a new data directory with unencrypted secret key and +# certificates; missing master public. + +if [ "$CASE7" = 1 ]; then + +ME="${DATA_DIR}/case7" +SRC="${DATA_DIR}/keygen" + +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_master_id_secret_key" "${ME}/keys/" +cp "${SRC}/keys/ed25519_signing_cert" "${ME}/keys/" +cp "${SRC}/keys/ed25519_signing_secret_key" "${ME}/keys/" + +${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} >/dev/null || die "Failed when starting with missing public key" +check_keys_eq ed25519_master_id_secret_key +check_keys_eq ed25519_master_id_public_key +check_keys_eq ed25519_signing_secret_key +check_keys_eq ed25519_signing_cert + +echo "==== Case 7 ok" + +fi + +# Case 8: offline master secret key. + +if [ "$CASE8" = 1 ]; then + +ME="${DATA_DIR}/case8" +SRC="${DATA_DIR}/keygen" + +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/" +cp "${SRC}/keys/ed25519_signing_cert" "${ME}/keys/" +cp "${SRC}/keys/ed25519_signing_secret_key" "${ME}/keys/" + +${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} >/dev/null || die "Failed when starting with offline secret key" +check_no_file "${ME}/keys/ed25519_master_id_secret_key" +check_keys_eq ed25519_master_id_public_key +check_keys_eq ed25519_signing_secret_key +check_keys_eq ed25519_signing_cert + +echo "==== Case 8 ok" + +fi + +# Case 9: signing cert and secret key provided; could infer master key. + +if [ "$CASE9" = 1 ]; then + +ME="${DATA_DIR}/case9" +SRC="${DATA_DIR}/keygen" + +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_signing_cert" "${ME}/keys/" +cp "${SRC}/keys/ed25519_signing_secret_key" "${ME}/keys/" + +${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} >/dev/null || die "Failed when starting with only signing material" +check_no_file "${ME}/keys/ed25519_master_id_secret_key" +check_file "${ME}/keys/ed25519_master_id_public_key" +check_keys_eq ed25519_signing_secret_key +check_keys_eq ed25519_signing_cert + +echo "==== Case 9 ok" + +fi + + +# Case 10: master key mismatch. + +if [ "$CASE10" = 1 ]; then + +ME="${DATA_DIR}/case10" +SRC="${DATA_DIR}/keygen" +OTHER="${DATA_DIR}/orig" + +mkdir -p "${ME}/keys" +cp "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/" +cp "${OTHER}/keys/ed25519_master_id_secret_key" "${ME}/keys/" + +${TOR} --DataDirectory "${ME}" --list-fingerprint >"${ME}/stdout" && die "Successfully started with mismatched keys!?" || true + +grep "public_key does not match.*secret_key" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a key mismatch" + +echo "==== Case 10 ok" + +fi + +# Case 11a: -passphrase-fd without --keygen + +if [ "$CASE11A" = 1 ]; then + +ME="${DATA_DIR}/case11a" + +mkdir -p "${ME}/keys" + +${TOR} --DataDirectory "${ME}" --passphrase-fd 1 > "${ME}/stdout" && die "Successfully started with passphrase-fd but no keygen?" || true + +grep "passphrase-fd specified without --keygen" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." + +echo "==== Case 11A ok" + +fi + +# Case 11b: --no-passphrase without --keygen + +if [ "$CASE11B" = 1 ]; then + +ME="${DATA_DIR}/case11b" + +mkdir -p "${ME}/keys" + +${TOR} --DataDirectory "${ME}" --no-passphrase > "${ME}/stdout" && die "Successfully started with no-passphrase but no keygen?" || true + +grep "no-passphrase specified without --keygen" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." + +echo "==== Case 11B ok" + +fi + +# Case 11c: --newpass without --keygen + +if [ "$CASE11C" = 1 ]; then + +ME="${DATA_DIR}/case11C" + +mkdir -p "${ME}/keys" + +${TOR} --DataDirectory "${ME}" --newpass > "${ME}/stdout" && die "Successfully started with newpass but no keygen?" || true + +grep "newpass specified without --keygen" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." + +echo "==== Case 11C ok" + +fi + +######## --master-key does not work yet, but this will test the error case +######## when it does. +# +# Case 11d: --master-key without --keygen +# +if [ "$CASE11D" = 1 ]; then +# +# ME="${DATA_DIR}/case11d" +# +# mkdir -p "${ME}/keys" +# +# ${TOR} --DataDirectory "${ME}" --master-key "${ME}/foobar" > "${ME}/stdout" && die "Successfully started with master-key but no keygen?" || true +# +# cat "${ME}/stdout" +# +# grep "master-key without --keygen" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." + + echo "==== Case 11D skipped" + +fi + + +# Case 11E: Silly passphrase-fd + +if [ "$CASE11E" = 1 ]; then + +ME="${DATA_DIR}/case11E" + +mkdir -p "${ME}/keys" + +${TOR} --DataDirectory "${ME}" --keygen --passphrase-fd ewigeblumenkraft > "${ME}/stdout" && die "Successfully started with bogus passphrase-fd?" || true + +grep "Invalid --passphrase-fd value" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." + +echo "==== Case 11E ok" + +fi + + +# Case 11F: --no-passphrase with --passphrase-fd + +if [ "$CASE11F" = 1 ]; then + +ME="${DATA_DIR}/case11F" + +mkdir -p "${ME}/keys" + +${TOR} --DataDirectory "${ME}" --keygen --passphrase-fd 1 --no-passphrase > "${ME}/stdout" && die "Successfully started with bogus passphrase-fd combination?" || true + +grep "no-passphrase specified with --passphrase-fd" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." + +echo "==== Case 11F ok" + +fi + + +# Check cert-only. + diff --git a/src/wraith/src/test/test_keypin.c b/src/wraith/src/test/test_keypin.c new file mode 100644 index 000000000..79d7bac90 --- /dev/null +++ b/src/wraith/src/test/test_keypin.c @@ -0,0 +1,257 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define KEYPIN_PRIVATE +#include "or.h" +#include "keypin.h" +#include "util.h" + +#include "test.h" + +static void +test_keypin_parse_line(void *arg) +{ + (void)arg; + keypin_ent_t *ent = NULL; + + /* Good line */ + ent = keypin_parse_journal_line( + "aGVyZSBpcyBhIGdvb2Qgc2hhMSE " + "VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4"); + tt_assert(ent); + tt_mem_op(ent->rsa_id, OP_EQ, "here is a good sha1!", 20); + tt_mem_op(ent->ed25519_key, OP_EQ, "This ed25519 scoffs at the sha1.", 32); + tor_free(ent); ent = NULL; + + /* Good line with extra stuff we will ignore. */ + ent = keypin_parse_journal_line( + "aGVyZSBpcyBhIGdvb2Qgc2hhMSE " + "VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4helloworld"); + tt_assert(ent); + tt_mem_op(ent->rsa_id, OP_EQ, "here is a good sha1!", 20); + tt_mem_op(ent->ed25519_key, OP_EQ, "This ed25519 scoffs at the sha1.", 32); + tor_free(ent); ent = NULL; + + /* Bad line: no space in the middle. */ + ent = keypin_parse_journal_line( + "aGVyZSBpcyBhIGdvb2Qgc2hhMSE?" + "VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4"); + tt_ptr_op(ent, OP_EQ, NULL); + + /* Bad line: bad base64 in RSA ID */ + ent = keypin_parse_journal_line( + "aGVyZSBpcyBhIGdv!2Qgc2hhMSE " + "VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4"); + tt_ptr_op(ent, OP_EQ, NULL); + + /* Bad line: bad base64 in Ed25519 */ + ent = keypin_parse_journal_line( + "aGVyZSBpcyBhIGdvb2Qgc2hhMSE " + "VGhpcyBlZDI1NTE5IHNjb2ZmcyB!dCB0aGUgc2hhMS4"); + tt_ptr_op(ent, OP_EQ, NULL); + + done: + tor_free(ent); +} + +static smartlist_t *mock_addent_got = NULL; +static void +mock_addent(keypin_ent_t *ent) +{ + smartlist_add(mock_addent_got, ent); + keypin_add_entry_to_map__real(ent); +} + +static void +test_keypin_parse_file(void *arg) +{ + (void)arg; + + mock_addent_got = smartlist_new(); + MOCK(keypin_add_entry_to_map, mock_addent); + + /* Simple, minimal, correct example. */ + const char data1[] = +"PT09PT09PT09PT09PT09PT09PT0 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0\n" +"TG9yYXggaXBzdW0gZ3J1dnZ1bHU cyB0aG5lZWQgYW1ldCwgc25lcmdlbGx5IG9uY2UtbGU\n" +"ciBsZXJraW0sIHNlZCBkbyBiYXI YmFsb290IHRlbXBvciBnbHVwcGl0dXMgdXQgbGFib3I\n" +"ZSBldCB0cnVmZnVsYSBtYWduYSA YWxpcXVhLiBVdCBlbmltIGFkIGdyaWNrbGUtZ3Jhc3M\n" +"dmVuaWFtLCBxdWlzIG1pZmYtbXU ZmZlcmVkIGdhLXp1bXBjbyBsYWJvcmlzIG5pc2kgdXQ\n" +"Y3J1ZmZ1bHVzIGV4IGVhIHNjaGw b3BwaXR5IGNvbnNlcXVhdC4gRHVpcyBhdXRlIHNuYXI\n" +"Z2dsZSBpbiBzd29tZWVzd2FucyA aW4gdm9sdXB0YXRlIGF4ZS1oYWNrZXIgZXNzZSByaXA\n" +"cHVsdXMgY3J1bW1paSBldSBtb28 ZiBudWxsYSBzbnV2di5QTFVHSFBMT1ZFUlhZWlpZLi4\n"; + + tt_int_op(0, OP_EQ, keypin_load_journal_impl(data1, strlen(data1))); + tt_int_op(8, OP_EQ, smartlist_len(mock_addent_got)); + keypin_ent_t *ent = smartlist_get(mock_addent_got, 2); + tt_mem_op(ent->rsa_id, OP_EQ, "r lerkim, sed do bar", 20); + tt_mem_op(ent->ed25519_key, OP_EQ, "baloot tempor gluppitus ut labor", 32); + + /* More complex example: weird lines, bogus lines, + duplicate/conflicting lines */ + const char data2[] = + "PT09PT09PT09PT09PT09PT09PT0 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0\n" + "# This is a comment.\n" + " \n" + "QXQgdGhlIGVuZCBvZiB0aGUgeWU YXIgS3VycmVta2FybWVycnVrIHNhaWQgdG8gaGltLCA\n" + "IllvdSBoYXZlIG1hZGUgYSBnb28 ZCBiZWdpbm5pbmcuIiBCdXQgbm8gbW9yZS4gV2l6YXI\n" + "\n" + "ZHMgc3BlYWsgdHJ1dGgsIGFuZCA aXQgd2FzIHRydWUgdGhhdCBhbGwgdGhlIG1hc3Rlcgo\n" + "@reserved for a future extension \n" + "eSBvZiBOYW1lcyB0aGF0IEdlZCA aGFkIHRvaWxlZCbyB3aW4gdGhhdCB5ZWFyIHdhcyA\n" + "eSBvZiBOYW1lcyB0aGF0IEdlZCA aGFkIHRvaWxlZCbyB3aW4gdGhhdCB5ZWFyIHdhcy" + "A line too long\n" + "dGhlIG1lcmUgc3RhcnQgb2Ygd2g YXQgaGUgbXVzdCBnbyBvb!BsZWFybmluZy4uLi4uLi4\n" + "ZHMgc3BlYWsgdaJ1dGgsIGFuZCA aXQgd2FzIHRydWUgdGhhdCBhbGwgdGhlIG1hc3Rlcgo\n" + "ZHMgc3BlYWsgdHJ1dGgsIGFuZCA aXQgd2FzIHRydaUgdGhhdCBhbGwgdGhlIG1hc3Rlcgo\n" + ; + + tt_int_op(0, OP_EQ, keypin_load_journal_impl(data2, strlen(data2))); + tt_int_op(13, OP_EQ, smartlist_len(mock_addent_got)); + ent = smartlist_get(mock_addent_got, 9); + tt_mem_op(ent->rsa_id, OP_EQ, "\"You have made a goo", 20); + tt_mem_op(ent->ed25519_key, OP_EQ, "d beginning.\" But no more. Wizar", 32); + + ent = smartlist_get(mock_addent_got, 12); + tt_mem_op(ent->rsa_id, OP_EQ, "ds speak truth, and ", 20); + tt_mem_op(ent->ed25519_key, OP_EQ, + "it was tru\xa5 that all the master\n", 32); + + /* File truncated before NL */ + const char data3[] = + "Tm8gZHJhZ29uIGNhbiByZXNpc3Q IHRoZSBmYXNjaW5hdGlvbiBvZiByaWRkbGluZyB0YWw"; + tt_int_op(0, OP_EQ, keypin_load_journal_impl(data3, strlen(data3))); + tt_int_op(14, OP_EQ, smartlist_len(mock_addent_got)); + ent = smartlist_get(mock_addent_got, 13); + tt_mem_op(ent->rsa_id, OP_EQ, "No dragon can resist", 20); + tt_mem_op(ent->ed25519_key, OP_EQ, " the fascination of riddling tal", 32); + + done: + keypin_clear(); + smartlist_free(mock_addent_got); +} + +#define ADD(a,b) keypin_check_and_add((const uint8_t*)(a),\ + (const uint8_t*)(b),0) +#define LONE_RSA(a) keypin_check_lone_rsa((const uint8_t*)(a)) + +static void +test_keypin_add_entry(void *arg) +{ + (void)arg; + keypin_clear(); + + tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("ambassadors-at-large", + "bread-and-butter thing-in-itself")); + tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("gentleman-adventurer", + "cloak-and-dagger what's-his-face")); + + tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("ambassadors-at-large", + "bread-and-butter thing-in-itself")); + tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("ambassadors-at-large", + "bread-and-butter thing-in-itself")); + tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("gentleman-adventurer", + "cloak-and-dagger what's-his-face")); + + tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("Johnnies-come-lately", + "run-of-the-mill root-mean-square")); + + tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("gentleman-adventurer", + "hypersentimental closefistedness")); + + tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("disestablismentarian", + "cloak-and-dagger what's-his-face")); + + tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("gentleman-adventurer", + "cloak-and-dagger what's-his-face")); + + tt_int_op(KEYPIN_NOT_FOUND, OP_EQ, LONE_RSA("Llanfairpwllgwyngyll")); + tt_int_op(KEYPIN_MISMATCH, OP_EQ, LONE_RSA("Johnnies-come-lately")); + + done: + keypin_clear(); +} + +static void +test_keypin_journal(void *arg) +{ + (void)arg; + char *contents = NULL; + const char *fname = get_fname("keypin-journal"); + + tt_int_op(0, OP_EQ, keypin_load_journal(fname)); /* ENOENT is okay */ + update_approx_time(1217709000); + tt_int_op(0, OP_EQ, keypin_open_journal(fname)); + + tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("king-of-the-herrings", + "good-for-nothing attorney-at-law")); + tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("yellowish-red-yellow", + "salt-and-pepper high-muck-a-muck")); + tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("yellowish-red-yellow", + "salt-and-pepper high-muck-a-muck")); + keypin_close_journal(); + keypin_clear(); + + tt_int_op(0, OP_EQ, keypin_load_journal(fname)); + update_approx_time(1231041600); + tt_int_op(0, OP_EQ, keypin_open_journal(fname)); + tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("yellowish-red-yellow", + "salt-and-pepper high-muck-a-muck")); + tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("theatre-in-the-round", + "holier-than-thou jack-in-the-box")); + tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("no-deposit-no-return", + "across-the-board will-o-the-wisp")); + tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("intellectualizations", + "salt-and-pepper high-muck-a-muck")); + keypin_close_journal(); + keypin_clear(); + + tt_int_op(0, OP_EQ, keypin_load_journal(fname)); + update_approx_time(1412278354); + tt_int_op(0, OP_EQ, keypin_open_journal(fname)); + tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("yellowish-red-yellow", + "salt-and-pepper high-muck-a-muck")); + tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("intellectualizations", + "salt-and-pepper high-muck-a-muck")); + tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("theatre-in-the-round", + "holier-than-thou jack-in-the-box")); + tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("counterrevolutionary", + "holier-than-thou jack-in-the-box")); + tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("no-deposit-no-return", + "floccinaucinihilipilificationism")); + keypin_close_journal(); + + contents = read_file_to_str(fname, RFTS_BIN, NULL); + tt_assert(contents); + tt_str_op(contents,OP_EQ, + "\n" + "@opened-at 2008-08-02 20:30:00\n" + "a2luZy1vZi10aGUtaGVycmluZ3M Z29vZC1mb3Itbm90aGluZyBhdHRvcm5leS1hdC1sYXc\n" + "eWVsbG93aXNoLXJlZC15ZWxsb3c c2FsdC1hbmQtcGVwcGVyIGhpZ2gtbXVjay1hLW11Y2s\n" + "\n" + "@opened-at 2009-01-04 04:00:00\n" + "dGhlYXRyZS1pbi10aGUtcm91bmQ aG9saWVyLXRoYW4tdGhvdSBqYWNrLWluLXRoZS1ib3g\n" + "bm8tZGVwb3NpdC1uby1yZXR1cm4 YWNyb3NzLXRoZS1ib2FyZCB3aWxsLW8tdGhlLXdpc3A\n" + "\n" + "@opened-at 2014-10-02 19:32:34\n"); + + done: + tor_free(contents); + keypin_clear(); +} + +#undef ADD +#undef LONE_RSA + +#define TEST(name, flags) \ + { #name , test_keypin_ ## name, (flags), NULL, NULL } + +struct testcase_t keypin_tests[] = { + TEST( parse_line, 0 ), + TEST( parse_file, TT_FORK ), + TEST( add_entry, TT_FORK ), + TEST( journal, TT_FORK ), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_link_handshake.c b/src/wraith/src/test/test_link_handshake.c new file mode 100644 index 000000000..6840072d7 --- /dev/null +++ b/src/wraith/src/test/test_link_handshake.c @@ -0,0 +1,1579 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define CHANNELTLS_PRIVATE +#define CONNECTION_PRIVATE +#define TOR_CHANNEL_INTERNAL_ +#define TORTLS_PRIVATE + +#include "compat.h" + +#include "or.h" +#include "config.h" +#include "connection.h" +#include "connection_or.h" +#include "channeltls.h" +#include "link_handshake.h" +#include "router.h" +#include "routerkeys.h" +#include "scheduler.h" +#include "torcert.h" + +#include "test.h" +#include "log_test_helpers.h" + +static var_cell_t *mock_got_var_cell = NULL; + +static void +mock_write_var_cell(const var_cell_t *vc, or_connection_t *conn) +{ + (void)conn; + + var_cell_t *newcell = var_cell_new(vc->payload_len); + memcpy(newcell, vc, sizeof(var_cell_t)); + memcpy(newcell->payload, vc->payload, vc->payload_len); + + mock_got_var_cell = newcell; +} +static int +mock_tls_cert_matches_key(const tor_tls_t *tls, const tor_x509_cert_t *cert) +{ + (void) tls; + (void) cert; // XXXX look at this. + return 1; +} +static tor_tls_t *mock_peer_cert_expect_tortls = NULL; +static tor_x509_cert_t *mock_peer_cert = NULL; +static tor_x509_cert_t * +mock_get_peer_cert(tor_tls_t *tls) +{ + if (mock_peer_cert_expect_tortls && + mock_peer_cert_expect_tortls != tls) + return NULL; + return tor_x509_cert_dup(mock_peer_cert); +} + +static int mock_send_netinfo_called = 0; +static int +mock_send_netinfo(or_connection_t *conn) +{ + (void) conn; + ++mock_send_netinfo_called;// XXX check_this + return 0; +} + +static int mock_close_called = 0; +static void +mock_close_for_err(or_connection_t *orconn, int flush) +{ + (void)orconn; + (void)flush; + ++mock_close_called; +} + +static int mock_send_authenticate_called = 0; +static int mock_send_authenticate_called_with_type = 0; +static int +mock_send_authenticate(or_connection_t *conn, int type) +{ + (void) conn; + mock_send_authenticate_called_with_type = type; + ++mock_send_authenticate_called;// XXX check_this + return 0; +} +static int +mock_export_key_material(tor_tls_t *tls, uint8_t *secrets_out, + const uint8_t *context, + size_t context_len, + const char *label) +{ + (void) tls; + (void)secrets_out; + (void)context; + (void)context_len; + (void)label; + memcpy(secrets_out, "int getRandomNumber(){return 4;}", 32); + return 0; +} + +static tor_x509_cert_t *mock_own_cert = NULL; +static tor_x509_cert_t * +mock_get_own_cert(tor_tls_t *tls) +{ + (void)tls; + return tor_x509_cert_dup(mock_own_cert); +} + +/* Test good certs cells */ +static void +test_link_handshake_certs_ok(void *arg) +{ + or_connection_t *c1 = or_connection_new(CONN_TYPE_OR, AF_INET); + or_connection_t *c2 = or_connection_new(CONN_TYPE_OR, AF_INET); + var_cell_t *cell1 = NULL, *cell2 = NULL; + certs_cell_t *cc1 = NULL, *cc2 = NULL; + channel_tls_t *chan1 = NULL, *chan2 = NULL; + crypto_pk_t *key1 = NULL, *key2 = NULL; + const int with_ed = !strcmp((const char *)arg, "Ed25519"); + + tor_addr_from_ipv4h(&c1->base_.addr, 0x7f000001); + tor_addr_from_ipv4h(&c2->base_.addr, 0x7f000001); + + scheduler_init(); + + MOCK(tor_tls_cert_matches_key, mock_tls_cert_matches_key); + MOCK(connection_or_write_var_cell_to_buf, mock_write_var_cell); + MOCK(connection_or_send_netinfo, mock_send_netinfo); + MOCK(tor_tls_get_peer_cert, mock_get_peer_cert); + MOCK(tor_tls_get_own_cert, mock_get_own_cert); + + key1 = pk_generate(2); + key2 = pk_generate(3); + + /* We need to make sure that our TLS certificates are set up before we can + * actually generate a CERTS cell. + */ + tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, + key1, key2, 86400), OP_EQ, 0); + + if (with_ed) { + /* If we're making a CERTS cell for an ed handshake, let's make sure we + * have some Ed25519 certificates and keys. */ + init_mock_ed_keys(key2); + } else { + certs_cell_ed25519_disabled_for_testing = 1; + } + + /* c1 has started_here == 1 */ + { + const tor_x509_cert_t *link_cert = NULL; + tt_assert(!tor_tls_get_my_certs(1, &link_cert, NULL)); + mock_own_cert = tor_x509_cert_dup(link_cert); + } + + c1->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; + c1->link_proto = 3; + tt_int_op(connection_init_or_handshake_state(c1, 1), OP_EQ, 0); + + /* c2 has started_here == 0 */ + c2->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; + c2->link_proto = 3; + tt_int_op(connection_init_or_handshake_state(c2, 0), OP_EQ, 0); + + tt_int_op(0, OP_EQ, connection_or_send_certs_cell(c1)); + tt_assert(mock_got_var_cell); + cell1 = mock_got_var_cell; + + tt_int_op(0, OP_EQ, connection_or_send_certs_cell(c2)); + tt_assert(mock_got_var_cell); + cell2 = mock_got_var_cell; + + tt_int_op(cell1->command, OP_EQ, CELL_CERTS); + tt_int_op(cell1->payload_len, OP_GT, 1); + + tt_int_op(cell2->command, OP_EQ, CELL_CERTS); + tt_int_op(cell2->payload_len, OP_GT, 1); + + tt_int_op(cell1->payload_len, OP_EQ, + certs_cell_parse(&cc1, cell1->payload, cell1->payload_len)); + tt_int_op(cell2->payload_len, OP_EQ, + certs_cell_parse(&cc2, cell2->payload, cell2->payload_len)); + + if (with_ed) { + tt_int_op(5, OP_EQ, cc1->n_certs); + tt_int_op(5, OP_EQ, cc2->n_certs); + } else { + tt_int_op(2, OP_EQ, cc1->n_certs); + tt_int_op(2, OP_EQ, cc2->n_certs); + } + + tt_int_op(certs_cell_get_certs(cc1, 0)->cert_type, OP_EQ, + CERTTYPE_RSA1024_ID_AUTH); + tt_int_op(certs_cell_get_certs(cc1, 1)->cert_type, OP_EQ, + CERTTYPE_RSA1024_ID_ID); + + tt_int_op(certs_cell_get_certs(cc2, 0)->cert_type, OP_EQ, + CERTTYPE_RSA1024_ID_LINK); + tt_int_op(certs_cell_get_certs(cc2, 1)->cert_type, OP_EQ, + CERTTYPE_RSA1024_ID_ID); + + if (with_ed) { + tt_int_op(certs_cell_get_certs(cc1, 2)->cert_type, OP_EQ, + CERTTYPE_ED_ID_SIGN); + tt_int_op(certs_cell_get_certs(cc1, 3)->cert_type, OP_EQ, + CERTTYPE_ED_SIGN_AUTH); + tt_int_op(certs_cell_get_certs(cc1, 4)->cert_type, OP_EQ, + CERTTYPE_RSA1024_ID_EDID); + + tt_int_op(certs_cell_get_certs(cc2, 2)->cert_type, OP_EQ, + CERTTYPE_ED_ID_SIGN); + tt_int_op(certs_cell_get_certs(cc2, 3)->cert_type, OP_EQ, + CERTTYPE_ED_SIGN_LINK); + tt_int_op(certs_cell_get_certs(cc2, 4)->cert_type, OP_EQ, + CERTTYPE_RSA1024_ID_EDID); + } + + chan1 = tor_malloc_zero(sizeof(*chan1)); + channel_tls_common_init(chan1); + c1->chan = chan1; + chan1->conn = c1; + c1->base_.address = tor_strdup("C1"); + c1->tls = tor_tls_new(-1, 0); + c1->link_proto = 4; + c1->base_.conn_array_index = -1; + crypto_pk_get_digest(key2, c1->identity_digest); + + if (with_ed) { + const tor_x509_cert_t *linkc, *idc; + tor_tls_get_my_certs(1, &linkc, &idc); + mock_peer_cert_expect_tortls = c1->tls; /* We should see this tls... */ + mock_peer_cert = tor_x509_cert_dup(linkc); /* and when we do, the peer's + * cert is this... */ + } + channel_tls_process_certs_cell(cell2, chan1); + mock_peer_cert_expect_tortls = NULL; + tor_x509_cert_free(mock_peer_cert); + mock_peer_cert = NULL; + + tor_assert(c1->handshake_state->authenticated); + + tt_assert(c1->handshake_state->received_certs_cell); + tt_ptr_op(c1->handshake_state->certs->auth_cert, OP_EQ, NULL); + tt_ptr_op(c1->handshake_state->certs->ed_sign_auth, OP_EQ, NULL); + tt_assert(c1->handshake_state->certs->id_cert); + if (with_ed) { + tt_assert(c1->handshake_state->certs->ed_sign_link); + tt_assert(c1->handshake_state->certs->ed_rsa_crosscert); + tt_assert(c1->handshake_state->certs->ed_id_sign); + tt_assert(c1->handshake_state->authenticated_rsa); + tt_assert(c1->handshake_state->authenticated_ed25519); + } else { + tt_ptr_op(c1->handshake_state->certs->ed_sign_link, OP_EQ, NULL); + tt_ptr_op(c1->handshake_state->certs->ed_rsa_crosscert, OP_EQ, NULL); + tt_ptr_op(c1->handshake_state->certs->ed_id_sign, OP_EQ, NULL); + tt_assert(c1->handshake_state->authenticated_rsa); + tt_assert(! c1->handshake_state->authenticated_ed25519); + } + tt_assert(! tor_mem_is_zero( + (char*)c1->handshake_state->authenticated_rsa_peer_id, 20)); + + chan2 = tor_malloc_zero(sizeof(*chan2)); + channel_tls_common_init(chan2); + c2->chan = chan2; + chan2->conn = c2; + c2->base_.address = tor_strdup("C2"); + c2->tls = tor_tls_new(-1, 1); + c2->link_proto = 4; + c2->base_.conn_array_index = -1; + crypto_pk_get_digest(key1, c2->identity_digest); + + channel_tls_process_certs_cell(cell1, chan2); + + tt_assert(c2->handshake_state->received_certs_cell); + if (with_ed) { + tt_assert(c2->handshake_state->certs->ed_sign_auth); + tt_assert(c2->handshake_state->certs->ed_rsa_crosscert); + tt_assert(c2->handshake_state->certs->ed_id_sign); + } else { + tt_assert(c2->handshake_state->certs->auth_cert); + tt_ptr_op(c2->handshake_state->certs->ed_sign_auth, OP_EQ, NULL); + tt_ptr_op(c2->handshake_state->certs->ed_rsa_crosscert, OP_EQ, NULL); + tt_ptr_op(c2->handshake_state->certs->ed_id_sign, OP_EQ, NULL); + } + tt_assert(c2->handshake_state->certs->id_cert); + tt_assert(tor_mem_is_zero( + (char*)c2->handshake_state->authenticated_rsa_peer_id, 20)); + /* no authentication has happened yet, since we haen't gotten an AUTH cell. + */ + tt_assert(! c2->handshake_state->authenticated); + tt_assert(! c2->handshake_state->authenticated_rsa); + tt_assert(! c2->handshake_state->authenticated_ed25519); + + done: + UNMOCK(tor_tls_cert_matches_key); + UNMOCK(connection_or_write_var_cell_to_buf); + UNMOCK(connection_or_send_netinfo); + UNMOCK(tor_tls_get_peer_cert); + UNMOCK(tor_tls_get_own_cert); + tor_x509_cert_free(mock_own_cert); + tor_x509_cert_free(mock_peer_cert); + mock_own_cert = mock_peer_cert = NULL; + memset(c1->identity_digest, 0, sizeof(c1->identity_digest)); + memset(c2->identity_digest, 0, sizeof(c2->identity_digest)); + connection_free_minimal(TO_CONN(c1)); + connection_free_minimal(TO_CONN(c2)); + tor_free(cell1); + tor_free(cell2); + certs_cell_free(cc1); + certs_cell_free(cc2); + if (chan1) + circuitmux_free(chan1->base_.cmux); + tor_free(chan1); + if (chan2) + circuitmux_free(chan2->base_.cmux); + tor_free(chan2); + crypto_pk_free(key1); + crypto_pk_free(key2); +} + +typedef struct certs_data_s { + int is_ed; + int is_link_cert; + or_connection_t *c; + channel_tls_t *chan; + certs_cell_t *ccell; + var_cell_t *cell; + crypto_pk_t *key1, *key2; +} certs_data_t; + +static int +recv_certs_cleanup(const struct testcase_t *test, void *obj) +{ + (void)test; + certs_data_t *d = obj; + UNMOCK(tor_tls_cert_matches_key); + UNMOCK(connection_or_send_netinfo); + UNMOCK(connection_or_close_for_error); + UNMOCK(tor_tls_get_peer_cert); + UNMOCK(tor_tls_get_own_cert); + + if (d) { + tor_free(d->cell); + certs_cell_free(d->ccell); + connection_or_clear_identity(d->c); + connection_free_minimal(TO_CONN(d->c)); + circuitmux_free(d->chan->base_.cmux); + tor_free(d->chan); + crypto_pk_free(d->key1); + crypto_pk_free(d->key2); + tor_free(d); + } + routerkeys_free_all(); + return 1; +} + +static void * +recv_certs_setup(const struct testcase_t *test) +{ + (void)test; + certs_data_t *d = tor_malloc_zero(sizeof(*d)); + certs_cell_cert_t *ccc1 = NULL; + certs_cell_cert_t *ccc2 = NULL; + ssize_t n; + int is_ed = d->is_ed = !strcmpstart(test->setup_data, "Ed25519"); + int is_rsa = !strcmpstart(test->setup_data, "RSA"); + int is_link = d->is_link_cert = !strcmpend(test->setup_data, "-Link"); + int is_auth = !strcmpend(test->setup_data, "-Auth"); + tor_assert(is_ed != is_rsa); + tor_assert(is_link != is_auth); + + d->c = or_connection_new(CONN_TYPE_OR, AF_INET); + d->chan = tor_malloc_zero(sizeof(*d->chan)); + d->c->chan = d->chan; + d->c->base_.address = tor_strdup("HaveAnAddress"); + tor_addr_from_ipv4h(&d->c->base_.addr, 0x801f0127); + d->c->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; + d->chan->conn = d->c; + tt_int_op(connection_init_or_handshake_state(d->c, 1), OP_EQ, 0); + d->c->link_proto = 4; + + d->key1 = pk_generate(2); + d->key2 = pk_generate(3); + + tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, + d->key1, d->key2, 86400), OP_EQ, 0); + if (is_ed) { + init_mock_ed_keys(d->key2); + } else { + routerkeys_free_all(); + } + + d->ccell = certs_cell_new(); + ccc1 = certs_cell_cert_new(); + certs_cell_add_certs(d->ccell, ccc1); + ccc2 = certs_cell_cert_new(); + certs_cell_add_certs(d->ccell, ccc2); + d->ccell->n_certs = 2; + ccc1->cert_type = is_link ? 1 : 3; + ccc2->cert_type = 2; + + const tor_x509_cert_t *a,*b; + const uint8_t *enca, *encb; + size_t lena, lenb; + tor_tls_get_my_certs(is_link ? 1 : 0, &a, &b); + tor_x509_cert_get_der(a, &enca, &lena); + tor_x509_cert_get_der(b, &encb, &lenb); + certs_cell_cert_setlen_body(ccc1, lena); + ccc1->cert_len = lena; + certs_cell_cert_setlen_body(ccc2, lenb); + ccc2->cert_len = lenb; + + memcpy(certs_cell_cert_getarray_body(ccc1), enca, lena); + memcpy(certs_cell_cert_getarray_body(ccc2), encb, lenb); + + if (is_ed) { + certs_cell_cert_t *ccc3 = NULL; /* Id->Sign */ + certs_cell_cert_t *ccc4 = NULL; /* Sign->Link or Sign->Auth. */ + certs_cell_cert_t *ccc5 = NULL; /* RSAId->Ed Id. */ + const tor_cert_t *id_sign = get_master_signing_key_cert(); + const tor_cert_t *secondary = + is_link ? get_current_link_cert_cert() : get_current_auth_key_cert(); + const uint8_t *cc = NULL; + size_t cc_sz; + get_master_rsa_crosscert(&cc, &cc_sz); + + ccc3 = certs_cell_cert_new(); + ccc4 = certs_cell_cert_new(); + ccc5 = certs_cell_cert_new(); + certs_cell_add_certs(d->ccell, ccc3); + certs_cell_add_certs(d->ccell, ccc4); + certs_cell_add_certs(d->ccell, ccc5); + ccc3->cert_len = id_sign->encoded_len; + ccc4->cert_len = secondary->encoded_len; + ccc5->cert_len = cc_sz; + certs_cell_cert_setlen_body(ccc3, ccc3->cert_len); + certs_cell_cert_setlen_body(ccc4, ccc4->cert_len); + certs_cell_cert_setlen_body(ccc5, ccc5->cert_len); + memcpy(certs_cell_cert_getarray_body(ccc3), id_sign->encoded, + ccc3->cert_len); + memcpy(certs_cell_cert_getarray_body(ccc4), secondary->encoded, + ccc4->cert_len); + memcpy(certs_cell_cert_getarray_body(ccc5), cc, ccc5->cert_len); + ccc3->cert_type = 4; + ccc4->cert_type = is_link ? 5 : 6; + ccc5->cert_type = 7; + + d->ccell->n_certs = 5; + } + + d->cell = var_cell_new(4096); + d->cell->command = CELL_CERTS; + + n = certs_cell_encode(d->cell->payload, 4096, d->ccell); + tt_int_op(n, OP_GT, 0); + d->cell->payload_len = n; + + MOCK(tor_tls_cert_matches_key, mock_tls_cert_matches_key); + MOCK(connection_or_send_netinfo, mock_send_netinfo); + MOCK(connection_or_close_for_error, mock_close_for_err); + MOCK(tor_tls_get_peer_cert, mock_get_peer_cert); + + if (is_link) { + /* Say that this is the peer's certificate */ + mock_peer_cert = tor_x509_cert_dup(a); + } + + tt_int_op(0, OP_EQ, d->c->handshake_state->received_certs_cell); + tt_int_op(0, OP_EQ, mock_send_authenticate_called); + tt_int_op(0, OP_EQ, mock_send_netinfo_called); + + return d; + done: + recv_certs_cleanup(test, d); + return NULL; +} + +static struct testcase_setup_t setup_recv_certs = { + .setup_fn = recv_certs_setup, + .cleanup_fn = recv_certs_cleanup +}; + +static void +test_link_handshake_recv_certs_ok(void *arg) +{ + certs_data_t *d = arg; + channel_tls_process_certs_cell(d->cell, d->chan); + tt_int_op(0, OP_EQ, mock_close_called); + tt_int_op(d->c->handshake_state->authenticated, OP_EQ, 1); + tt_int_op(d->c->handshake_state->authenticated_rsa, OP_EQ, 1); + tt_int_op(d->c->handshake_state->received_certs_cell, OP_EQ, 1); + tt_ptr_op(d->c->handshake_state->certs->id_cert, OP_NE, NULL); + tt_ptr_op(d->c->handshake_state->certs->auth_cert, OP_EQ, NULL); + + if (d->is_ed) { + tt_ptr_op(d->c->handshake_state->certs->ed_id_sign, OP_NE, NULL); + tt_ptr_op(d->c->handshake_state->certs->ed_sign_link, OP_NE, NULL); + tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_EQ, NULL); + tt_ptr_op(d->c->handshake_state->certs->ed_rsa_crosscert, OP_NE, NULL); + tt_int_op(d->c->handshake_state->authenticated_ed25519, OP_EQ, 1); + } else { + tt_ptr_op(d->c->handshake_state->certs->ed_id_sign, OP_EQ, NULL); + tt_ptr_op(d->c->handshake_state->certs->ed_sign_link, OP_EQ, NULL); + tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_EQ, NULL); + tt_ptr_op(d->c->handshake_state->certs->ed_rsa_crosscert, OP_EQ, NULL); + tt_int_op(d->c->handshake_state->authenticated_ed25519, OP_EQ, 0); + } + + done: + ; +} + +static void +test_link_handshake_recv_certs_ok_server(void *arg) +{ + certs_data_t *d = arg; + d->c->handshake_state->started_here = 0; + d->c->handshake_state->certs->started_here = 0; + channel_tls_process_certs_cell(d->cell, d->chan); + tt_int_op(0, OP_EQ, mock_close_called); + tt_int_op(d->c->handshake_state->authenticated, OP_EQ, 0); + tt_int_op(d->c->handshake_state->received_certs_cell, OP_EQ, 1); + tt_ptr_op(d->c->handshake_state->certs->id_cert, OP_NE, NULL); + tt_ptr_op(d->c->handshake_state->certs->link_cert, OP_EQ, NULL); + if (d->is_ed) { + tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_NE, NULL); + tt_ptr_op(d->c->handshake_state->certs->auth_cert, OP_EQ, NULL); + } else { + tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_EQ, NULL); + tt_ptr_op(d->c->handshake_state->certs->auth_cert, OP_NE, NULL); + } + + done: + ; +} + +#define CERTS_FAIL(name, code) \ + static void \ + test_link_handshake_recv_certs_ ## name(void *arg) \ + { \ + certs_data_t *d = arg; \ + const char *require_failure_message = NULL; \ + setup_capture_of_logs(LOG_INFO); \ + { code ; } \ + channel_tls_process_certs_cell(d->cell, d->chan); \ + tt_int_op(1, OP_EQ, mock_close_called); \ + tt_int_op(0, OP_EQ, mock_send_authenticate_called); \ + tt_int_op(0, OP_EQ, mock_send_netinfo_called); \ + tt_int_op(0, OP_EQ, d->c->handshake_state->authenticated_rsa); \ + tt_int_op(0, OP_EQ, d->c->handshake_state->authenticated_ed25519); \ + if (require_failure_message) { \ + expect_log_msg_containing(require_failure_message); \ + } \ + done: \ + teardown_capture_of_logs(); \ + } + +CERTS_FAIL(badstate, + require_failure_message = "We're not doing a v3 handshake!"; + d->c->base_.state = OR_CONN_STATE_CONNECTING;) +CERTS_FAIL(badproto, + require_failure_message = "not using link protocol >= 3"; + d->c->link_proto = 2) +CERTS_FAIL(duplicate, + require_failure_message = "We already got one"; + d->c->handshake_state->received_certs_cell = 1) +CERTS_FAIL(already_authenticated, + require_failure_message = "We're already authenticated!"; + d->c->handshake_state->authenticated = 1) +CERTS_FAIL(empty, + require_failure_message = "It had no body"; + d->cell->payload_len = 0) +CERTS_FAIL(bad_circid, + require_failure_message = "It had a nonzero circuit ID"; + d->cell->circ_id = 1) +CERTS_FAIL(truncated_1, + require_failure_message = "It couldn't be parsed"; + d->cell->payload[0] = 5) +CERTS_FAIL(truncated_2, + { + require_failure_message = "It couldn't be parsed"; + d->cell->payload_len = 4; + memcpy(d->cell->payload, "\x01\x01\x00\x05", 4); + }) +CERTS_FAIL(truncated_3, + { + require_failure_message = "It couldn't be parsed"; + d->cell->payload_len = 7; + memcpy(d->cell->payload, "\x01\x01\x00\x05""abc", 7); + }) +CERTS_FAIL(truncated_4, /* ed25519 */ + { + require_failure_message = "It couldn't be parsed"; + d->cell->payload_len -= 10; + }) +CERTS_FAIL(truncated_5, /* ed25519 */ + { + require_failure_message = "It couldn't be parsed"; + d->cell->payload_len -= 100; + }) + +#define REENCODE() do { \ + const char *msg = certs_cell_check(d->ccell); \ + if (msg) puts(msg); \ + ssize_t n = certs_cell_encode(d->cell->payload, 4096, d->ccell); \ + tt_int_op(n, OP_GT, 0); \ + d->cell->payload_len = n; \ + } while (0) + +CERTS_FAIL(truncated_6, /* ed25519 */ + { + /* truncate the link certificate */ + require_failure_message = "undecodable Ed certificate"; + certs_cell_cert_setlen_body(certs_cell_get_certs(d->ccell, 3), 7); + certs_cell_get_certs(d->ccell, 3)->cert_len = 7; + REENCODE(); + }) +CERTS_FAIL(truncated_7, /* ed25519 */ + { + /* truncate the crosscert */ + require_failure_message = "Unparseable or overlong crosscert"; + certs_cell_cert_setlen_body(certs_cell_get_certs(d->ccell, 4), 7); + certs_cell_get_certs(d->ccell, 4)->cert_len = 7; + REENCODE(); + }) +CERTS_FAIL(not_x509, + { + require_failure_message = "Received undecodable certificate"; + certs_cell_cert_setlen_body(certs_cell_get_certs(d->ccell, 0), 3); + certs_cell_get_certs(d->ccell, 0)->cert_len = 3; + REENCODE(); + }) +CERTS_FAIL(both_link, + { + require_failure_message = "Duplicate x509 certificate"; + certs_cell_get_certs(d->ccell, 0)->cert_type = 1; + certs_cell_get_certs(d->ccell, 1)->cert_type = 1; + REENCODE(); + }) +CERTS_FAIL(both_id_rsa, + { + require_failure_message = "Duplicate x509 certificate"; + certs_cell_get_certs(d->ccell, 0)->cert_type = 2; + certs_cell_get_certs(d->ccell, 1)->cert_type = 2; + REENCODE(); + }) +CERTS_FAIL(both_auth, + { + require_failure_message = "Duplicate x509 certificate"; + certs_cell_get_certs(d->ccell, 0)->cert_type = 3; + certs_cell_get_certs(d->ccell, 1)->cert_type = 3; + REENCODE(); + }) +CERTS_FAIL(duplicate_id, /* ed25519 */ + { + require_failure_message = "Duplicate Ed25519 certificate"; + certs_cell_get_certs(d->ccell, 2)->cert_type = 4; + certs_cell_get_certs(d->ccell, 3)->cert_type = 4; + REENCODE(); + }) +CERTS_FAIL(duplicate_link, /* ed25519 */ + { + require_failure_message = "Duplicate Ed25519 certificate"; + certs_cell_get_certs(d->ccell, 2)->cert_type = 5; + certs_cell_get_certs(d->ccell, 3)->cert_type = 5; + REENCODE(); + }) +CERTS_FAIL(duplicate_crosscert, /* ed25519 */ + { + require_failure_message = "Duplicate RSA->Ed25519 crosscert"; + certs_cell_get_certs(d->ccell, 2)->cert_type = 7; + certs_cell_get_certs(d->ccell, 3)->cert_type = 7; + REENCODE(); + }) +static void +test_link_handshake_recv_certs_missing_id(void *arg) /* ed25519 */ +{ + certs_data_t *d = arg; + tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); + certs_cell_set_certs(d->ccell, 2, certs_cell_get_certs(d->ccell, 4)); + certs_cell_set0_certs(d->ccell, 4, NULL); /* prevent free */ + certs_cell_setlen_certs(d->ccell, 4); + d->ccell->n_certs = 4; + REENCODE(); + + /* This handshake succeeds, but since we have no ID cert, we will + * just do the RSA handshake. */ + channel_tls_process_certs_cell(d->cell, d->chan); + tt_int_op(0, OP_EQ, mock_close_called); + tt_int_op(0, OP_EQ, d->c->handshake_state->authenticated_ed25519); + tt_int_op(1, OP_EQ, d->c->handshake_state->authenticated_rsa); + done: + ; +} +CERTS_FAIL(missing_signing_key, /* ed25519 */ + { + require_failure_message = "No Ed25519 signing key"; + tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); + certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 2); + tt_int_op(cert->cert_type, OP_EQ, CERTTYPE_ED_ID_SIGN); + /* replace this with a valid master->signing cert, but with no + * signing key. */ + const ed25519_keypair_t *mk = get_master_identity_keypair(); + const ed25519_keypair_t *sk = get_master_signing_keypair(); + tor_cert_t *bad_cert = tor_cert_create(mk, CERT_TYPE_ID_SIGNING, + &sk->pubkey, time(NULL), 86400, + 0 /* don't include signer */); + certs_cell_cert_setlen_body(cert, bad_cert->encoded_len); + memcpy(certs_cell_cert_getarray_body(cert), + bad_cert->encoded, bad_cert->encoded_len); + cert->cert_len = bad_cert->encoded_len; + tor_cert_free(bad_cert); + REENCODE(); + }) +CERTS_FAIL(missing_link, /* ed25519 */ + { + require_failure_message = "No Ed25519 link key"; + tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); + certs_cell_set_certs(d->ccell, 3, certs_cell_get_certs(d->ccell, 4)); + certs_cell_set0_certs(d->ccell, 4, NULL); /* prevent free */ + certs_cell_setlen_certs(d->ccell, 4); + d->ccell->n_certs = 4; + REENCODE(); + }) +CERTS_FAIL(missing_auth, /* ed25519 */ + { + d->c->handshake_state->started_here = 0; + d->c->handshake_state->certs->started_here = 0; + require_failure_message = "No Ed25519 link authentication key"; + tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); + certs_cell_set_certs(d->ccell, 3, certs_cell_get_certs(d->ccell, 4)); + certs_cell_set0_certs(d->ccell, 4, NULL); /* prevent free */ + certs_cell_setlen_certs(d->ccell, 4); + d->ccell->n_certs = 4; + REENCODE(); + }) +CERTS_FAIL(missing_crosscert, /* ed25519 */ + { + require_failure_message = "Missing RSA->Ed25519 crosscert"; + tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); + certs_cell_setlen_certs(d->ccell, 4); + d->ccell->n_certs = 4; + REENCODE(); + }) +CERTS_FAIL(missing_rsa_id, /* ed25519 */ + { + require_failure_message = "Missing legacy RSA ID cert"; + tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); + certs_cell_set_certs(d->ccell, 1, certs_cell_get_certs(d->ccell, 4)); + certs_cell_set0_certs(d->ccell, 4, NULL); /* prevent free */ + certs_cell_setlen_certs(d->ccell, 4); + d->ccell->n_certs = 4; + REENCODE(); + }) +CERTS_FAIL(link_mismatch, /* ed25519 */ + { + require_failure_message = "Link certificate does not match " + "TLS certificate"; + const tor_x509_cert_t *idc; + tor_tls_get_my_certs(1, NULL, &idc); + tor_x509_cert_free(mock_peer_cert); + /* Pretend that the peer cert was something else. */ + mock_peer_cert = tor_x509_cert_dup(idc); + /* No reencode needed. */ + }) +CERTS_FAIL(bad_ed_sig, /* ed25519 */ + { + require_failure_message = "At least one Ed25519 certificate was " + "badly signed"; + certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 3); + uint8_t *body = certs_cell_cert_getarray_body(cert); + ssize_t body_len = certs_cell_cert_getlen_body(cert); + /* Frob a byte in the signature */ + body[body_len - 13] ^= 7; + REENCODE(); + }) +CERTS_FAIL(bad_crosscert, /*ed25519*/ + { + require_failure_message = "Invalid RSA->Ed25519 crosscert"; + certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 4); + uint8_t *body = certs_cell_cert_getarray_body(cert); + ssize_t body_len = certs_cell_cert_getlen_body(cert); + /* Frob a byte in the signature */ + body[body_len - 13] ^= 7; + REENCODE(); + }) +CERTS_FAIL(bad_rsa_id_cert, /*ed25519*/ + { + require_failure_message = "legacy RSA ID certificate was not valid"; + certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 1); + uint8_t *body = certs_cell_cert_getarray_body(cert); + ssize_t body_len = certs_cell_cert_getlen_body(cert); + /* Frob a byte in the signature */ + body[body_len - 13] ^= 7; + REENCODE(); + }) +CERTS_FAIL(expired_rsa_id, /* both */ + { + require_failure_message = "Certificate already expired"; + /* we're going to replace the identity cert with an expired one. */ + certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 1); + const tor_x509_cert_t *idc; + tor_tls_get_my_certs(1, NULL, &idc); + tor_x509_cert_t *newc; + time_t new_end = time(NULL) - 86400 * 10; + newc = tor_x509_cert_replace_expiration(idc, new_end, d->key2); + certs_cell_cert_setlen_body(cert, newc->encoded_len); + memcpy(certs_cell_cert_getarray_body(cert), + newc->encoded, newc->encoded_len); + REENCODE(); + tor_x509_cert_free(newc); + }) +CERTS_FAIL(expired_ed_id, /* ed25519 */ + { + /* we're going to replace the Ed Id->sign cert with an expired one. */ + require_failure_message = "At least one certificate expired"; + /* We don't need to re-sign, since we check for expiration first. */ + certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 2); + uint8_t *body = certs_cell_cert_getarray_body(cert); + /* The expiration field is bytes [2..5]. It is in HOURS since the + * epoch. */ + set_uint32(body+2, htonl(24)); /* Back to jan 2, 1970. */ + REENCODE(); + }) +CERTS_FAIL(expired_ed_link, /* ed25519 */ + { + /* we're going to replace the Ed Sign->link cert with an expired one. */ + require_failure_message = "At least one certificate expired"; + /* We don't need to re-sign, since we check for expiration first. */ + certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 3); + uint8_t *body = certs_cell_cert_getarray_body(cert); + /* The expiration field is bytes [2..5]. It is in HOURS since the + * epoch. */ + set_uint32(body+2, htonl(24)); /* Back to jan 2, 1970. */ + REENCODE(); + }) +CERTS_FAIL(expired_crosscert, /* ed25519 */ + { + /* we're going to replace the Ed Sign->link cert with an expired one. */ + require_failure_message = "Crosscert is expired"; + /* We don't need to re-sign, since we check for expiration first. */ + certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 4); + uint8_t *body = certs_cell_cert_getarray_body(cert); + /* The expiration field is bytes [32..35]. once again, HOURS. */ + set_uint32(body+32, htonl(24)); /* Back to jan 2, 1970. */ + REENCODE(); + }) + +CERTS_FAIL(wrong_labels_1, + { + require_failure_message = "The link certificate was not valid"; + certs_cell_get_certs(d->ccell, 0)->cert_type = 2; + certs_cell_get_certs(d->ccell, 1)->cert_type = 1; + REENCODE(); + }) +CERTS_FAIL(wrong_labels_2, + { + const tor_x509_cert_t *a; + const tor_x509_cert_t *b; + const uint8_t *enca; + size_t lena; + require_failure_message = "The link certificate was not valid"; + tor_tls_get_my_certs(1, &a, &b); + tor_x509_cert_get_der(a, &enca, &lena); + certs_cell_cert_setlen_body(certs_cell_get_certs(d->ccell, 1), lena); + memcpy(certs_cell_cert_getarray_body(certs_cell_get_certs(d->ccell, 1)), + enca, lena); + certs_cell_get_certs(d->ccell, 1)->cert_len = lena; + REENCODE(); + }) +CERTS_FAIL(wrong_labels_3, + { + require_failure_message = + "The certs we wanted (ID, Link) were missing"; + certs_cell_get_certs(d->ccell, 0)->cert_type = 2; + certs_cell_get_certs(d->ccell, 1)->cert_type = 3; + REENCODE(); + }) +CERTS_FAIL(server_missing_certs, + { + require_failure_message = + "The certs we wanted (ID, Auth) were missing"; + d->c->handshake_state->started_here = 0; + d->c->handshake_state->certs->started_here = 0; + + }) +CERTS_FAIL(server_wrong_labels_1, + { + require_failure_message = + "The authentication certificate was not valid"; + d->c->handshake_state->started_here = 0; + d->c->handshake_state->certs->started_here = 0; + certs_cell_get_certs(d->ccell, 0)->cert_type = 2; + certs_cell_get_certs(d->ccell, 1)->cert_type = 3; + REENCODE(); + }) + +static void +test_link_handshake_send_authchallenge(void *arg) +{ + (void)arg; + + or_connection_t *c1 = or_connection_new(CONN_TYPE_OR, AF_INET); + var_cell_t *cell1=NULL, *cell2=NULL; + + crypto_pk_t *rsa0 = pk_generate(0), *rsa1 = pk_generate(1); + tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, + rsa0, rsa1, 86400), OP_EQ, 0); + init_mock_ed_keys(rsa0); + + MOCK(connection_or_write_var_cell_to_buf, mock_write_var_cell); + + tt_int_op(connection_init_or_handshake_state(c1, 0), OP_EQ, 0); + c1->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; + tt_ptr_op(mock_got_var_cell, OP_EQ, NULL); + tt_int_op(0, OP_EQ, connection_or_send_auth_challenge_cell(c1)); + cell1 = mock_got_var_cell; + tt_int_op(0, OP_EQ, connection_or_send_auth_challenge_cell(c1)); + cell2 = mock_got_var_cell; + tt_int_op(38, OP_EQ, cell1->payload_len); + tt_int_op(38, OP_EQ, cell2->payload_len); + tt_int_op(0, OP_EQ, cell1->circ_id); + tt_int_op(0, OP_EQ, cell2->circ_id); + tt_int_op(CELL_AUTH_CHALLENGE, OP_EQ, cell1->command); + tt_int_op(CELL_AUTH_CHALLENGE, OP_EQ, cell2->command); + + tt_mem_op("\x00\x02\x00\x01\x00\x03", OP_EQ, cell1->payload + 32, 6); + tt_mem_op("\x00\x02\x00\x01\x00\x03", OP_EQ, cell2->payload + 32, 6); + tt_mem_op(cell1->payload, OP_NE, cell2->payload, 32); + + done: + UNMOCK(connection_or_write_var_cell_to_buf); + connection_free_minimal(TO_CONN(c1)); + tor_free(cell1); + tor_free(cell2); + crypto_pk_free(rsa0); + crypto_pk_free(rsa1); +} + +typedef struct authchallenge_data_s { + or_connection_t *c; + channel_tls_t *chan; + var_cell_t *cell; +} authchallenge_data_t; + +static int +recv_authchallenge_cleanup(const struct testcase_t *test, void *obj) +{ + (void)test; + authchallenge_data_t *d = obj; + + UNMOCK(connection_or_send_netinfo); + UNMOCK(connection_or_close_for_error); + UNMOCK(connection_or_send_authenticate_cell); + + if (d) { + tor_free(d->cell); + connection_free_minimal(TO_CONN(d->c)); + circuitmux_free(d->chan->base_.cmux); + tor_free(d->chan); + tor_free(d); + } + return 1; +} + +static void * +recv_authchallenge_setup(const struct testcase_t *test) +{ + (void)test; + authchallenge_data_t *d = tor_malloc_zero(sizeof(*d)); + d->c = or_connection_new(CONN_TYPE_OR, AF_INET); + d->chan = tor_malloc_zero(sizeof(*d->chan)); + d->c->chan = d->chan; + d->c->base_.address = tor_strdup("HaveAnAddress"); + d->c->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; + d->chan->conn = d->c; + tt_int_op(connection_init_or_handshake_state(d->c, 1), OP_EQ, 0); + d->c->link_proto = 4; + d->c->handshake_state->received_certs_cell = 1; + d->cell = var_cell_new(128); + d->cell->payload_len = 38; + d->cell->payload[33] = 2; /* 2 methods */ + d->cell->payload[35] = 7; /* This one isn't real */ + d->cell->payload[37] = 1; /* This is the old RSA one. */ + d->cell->command = CELL_AUTH_CHALLENGE; + + get_options_mutable()->ORPort_set = 1; + + MOCK(connection_or_close_for_error, mock_close_for_err); + MOCK(connection_or_send_netinfo, mock_send_netinfo); + MOCK(connection_or_send_authenticate_cell, mock_send_authenticate); + tt_int_op(0, OP_EQ, d->c->handshake_state->received_auth_challenge); + tt_int_op(0, OP_EQ, mock_send_authenticate_called); + tt_int_op(0, OP_EQ, mock_send_netinfo_called); + + return d; + done: + recv_authchallenge_cleanup(test, d); + return NULL; +} + +static struct testcase_setup_t setup_recv_authchallenge = { + .setup_fn = recv_authchallenge_setup, + .cleanup_fn = recv_authchallenge_cleanup +}; + +static void +test_link_handshake_recv_authchallenge_ok(void *arg) +{ + authchallenge_data_t *d = arg; + + channel_tls_process_auth_challenge_cell(d->cell, d->chan); + tt_int_op(0, OP_EQ, mock_close_called); + tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge); + tt_int_op(1, OP_EQ, mock_send_authenticate_called); + tt_int_op(1, OP_EQ, mock_send_netinfo_called); + tt_int_op(1, OP_EQ, mock_send_authenticate_called_with_type); /* RSA */ + done: + ; +} + +static void +test_link_handshake_recv_authchallenge_ok_ed25519(void *arg) +{ + authchallenge_data_t *d = arg; + + /* Add the ed25519 authentication mechanism here. */ + d->cell->payload[33] = 3; /* 3 types are supported now. */ + d->cell->payload[39] = 3; + d->cell->payload_len += 2; + channel_tls_process_auth_challenge_cell(d->cell, d->chan); + tt_int_op(0, OP_EQ, mock_close_called); + tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge); + tt_int_op(1, OP_EQ, mock_send_authenticate_called); + tt_int_op(1, OP_EQ, mock_send_netinfo_called); + tt_int_op(3, OP_EQ, mock_send_authenticate_called_with_type); /* Ed25519 */ + done: + ; +} + +static void +test_link_handshake_recv_authchallenge_ok_noserver(void *arg) +{ + authchallenge_data_t *d = arg; + get_options_mutable()->ORPort_set = 0; + + channel_tls_process_auth_challenge_cell(d->cell, d->chan); + tt_int_op(0, OP_EQ, mock_close_called); + tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge); + tt_int_op(0, OP_EQ, mock_send_authenticate_called); + tt_int_op(0, OP_EQ, mock_send_netinfo_called); + done: + ; +} + +static void +test_link_handshake_recv_authchallenge_ok_unrecognized(void *arg) +{ + authchallenge_data_t *d = arg; + d->cell->payload[37] = 99; + + channel_tls_process_auth_challenge_cell(d->cell, d->chan); + tt_int_op(0, OP_EQ, mock_close_called); + tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge); + tt_int_op(0, OP_EQ, mock_send_authenticate_called); + tt_int_op(1, OP_EQ, mock_send_netinfo_called); + done: + ; +} + +#define AUTHCHALLENGE_FAIL(name, code) \ + static void \ + test_link_handshake_recv_authchallenge_ ## name(void *arg) \ + { \ + authchallenge_data_t *d = arg; \ + const char *require_failure_message = NULL; \ + setup_capture_of_logs(LOG_INFO); \ + { code ; } \ + channel_tls_process_auth_challenge_cell(d->cell, d->chan); \ + tt_int_op(1, OP_EQ, mock_close_called); \ + tt_int_op(0, OP_EQ, mock_send_authenticate_called); \ + tt_int_op(0, OP_EQ, mock_send_netinfo_called); \ + if (require_failure_message) { \ + expect_log_msg_containing(require_failure_message); \ + } \ + done: \ + teardown_capture_of_logs(); \ + } + +AUTHCHALLENGE_FAIL(badstate, + require_failure_message = "We're not currently doing a " + "v3 handshake"; + d->c->base_.state = OR_CONN_STATE_CONNECTING) +AUTHCHALLENGE_FAIL(badproto, + require_failure_message = "not using link protocol >= 3"; + d->c->link_proto = 2) +AUTHCHALLENGE_FAIL(as_server, + require_failure_message = "We didn't originate this " + "connection"; + d->c->handshake_state->started_here = 0; + d->c->handshake_state->certs->started_here = 0;) +AUTHCHALLENGE_FAIL(duplicate, + require_failure_message = "We already received one"; + d->c->handshake_state->received_auth_challenge = 1) +AUTHCHALLENGE_FAIL(nocerts, + require_failure_message = "We haven't gotten a CERTS " + "cell yet"; + d->c->handshake_state->received_certs_cell = 0) +AUTHCHALLENGE_FAIL(tooshort, + require_failure_message = "It was not well-formed"; + d->cell->payload_len = 33) +AUTHCHALLENGE_FAIL(truncated, + require_failure_message = "It was not well-formed"; + d->cell->payload_len = 34) +AUTHCHALLENGE_FAIL(nonzero_circid, + require_failure_message = "It had a nonzero circuit ID"; + d->cell->circ_id = 1337) + +static int +mock_get_tlssecrets(tor_tls_t *tls, uint8_t *secrets_out) +{ + (void)tls; + memcpy(secrets_out, "int getRandomNumber(){return 4;}", 32); + return 0; +} + +static void +mock_set_circid_type(channel_t *chan, + crypto_pk_t *identity_rcvd, + int consider_identity) +{ + (void) chan; + (void) identity_rcvd; + (void) consider_identity; +} + +typedef struct authenticate_data_s { + int is_ed; + or_connection_t *c1, *c2; + channel_tls_t *chan2; + var_cell_t *cell; + crypto_pk_t *key1, *key2; +} authenticate_data_t; + +static int +authenticate_data_cleanup(const struct testcase_t *test, void *arg) +{ + (void) test; + UNMOCK(connection_or_write_var_cell_to_buf); + UNMOCK(tor_tls_get_peer_cert); + UNMOCK(tor_tls_get_own_cert); + UNMOCK(tor_tls_get_tlssecrets); + UNMOCK(connection_or_close_for_error); + UNMOCK(channel_set_circid_type); + UNMOCK(tor_tls_export_key_material); + authenticate_data_t *d = arg; + if (d) { + tor_free(d->cell); + connection_or_clear_identity(d->c1); + connection_or_clear_identity(d->c2); + connection_free_minimal(TO_CONN(d->c1)); + connection_free_minimal(TO_CONN(d->c2)); + circuitmux_free(d->chan2->base_.cmux); + tor_free(d->chan2); + crypto_pk_free(d->key1); + crypto_pk_free(d->key2); + tor_free(d); + } + tor_x509_cert_free(mock_peer_cert); + tor_x509_cert_free(mock_own_cert); + mock_peer_cert = NULL; + mock_own_cert = NULL; + + return 1; +} + +static void * +authenticate_data_setup(const struct testcase_t *test) +{ + authenticate_data_t *d = tor_malloc_zero(sizeof(*d)); + int is_ed = d->is_ed = (test->setup_data == (void*)3); + + scheduler_init(); + + MOCK(connection_or_write_var_cell_to_buf, mock_write_var_cell); + MOCK(tor_tls_get_peer_cert, mock_get_peer_cert); + MOCK(tor_tls_get_own_cert, mock_get_own_cert); + MOCK(tor_tls_get_tlssecrets, mock_get_tlssecrets); + MOCK(connection_or_close_for_error, mock_close_for_err); + MOCK(channel_set_circid_type, mock_set_circid_type); + MOCK(tor_tls_export_key_material, mock_export_key_material); + d->c1 = or_connection_new(CONN_TYPE_OR, AF_INET); + d->c2 = or_connection_new(CONN_TYPE_OR, AF_INET); + tor_addr_from_ipv4h(&d->c1->base_.addr, 0x01020304); + tor_addr_from_ipv4h(&d->c2->base_.addr, 0x05060708); + + d->key1 = pk_generate(2); + d->key2 = pk_generate(3); + tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, + d->key1, d->key2, 86400), OP_EQ, 0); + + init_mock_ed_keys(d->key2); + + d->c1->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; + d->c1->link_proto = 3; + tt_int_op(connection_init_or_handshake_state(d->c1, 1), OP_EQ, 0); + + d->c2->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; + d->c2->link_proto = 3; + tt_int_op(connection_init_or_handshake_state(d->c2, 0), OP_EQ, 0); + var_cell_t *cell = var_cell_new(16); + cell->command = CELL_CERTS; + or_handshake_state_record_var_cell(d->c1, d->c1->handshake_state, cell, 1); + or_handshake_state_record_var_cell(d->c2, d->c2->handshake_state, cell, 0); + memset(cell->payload, 0xf0, 16); + or_handshake_state_record_var_cell(d->c1, d->c1->handshake_state, cell, 0); + or_handshake_state_record_var_cell(d->c2, d->c2->handshake_state, cell, 1); + tor_free(cell); + + d->chan2 = tor_malloc_zero(sizeof(*d->chan2)); + channel_tls_common_init(d->chan2); + d->c2->chan = d->chan2; + d->chan2->conn = d->c2; + d->c2->base_.address = tor_strdup("C2"); + d->c2->tls = tor_tls_new(-1, 1); + d->c2->handshake_state->received_certs_cell = 1; + + const tor_x509_cert_t *id_cert=NULL, *link_cert=NULL, *auth_cert=NULL; + tt_assert(! tor_tls_get_my_certs(1, &link_cert, &id_cert)); + + const uint8_t *der; + size_t sz; + tor_x509_cert_get_der(id_cert, &der, &sz); + d->c1->handshake_state->certs->id_cert = tor_x509_cert_decode(der, sz); + d->c2->handshake_state->certs->id_cert = tor_x509_cert_decode(der, sz); + + if (is_ed) { + d->c1->handshake_state->certs->ed_id_sign = + tor_cert_dup(get_master_signing_key_cert()); + d->c2->handshake_state->certs->ed_id_sign = + tor_cert_dup(get_master_signing_key_cert()); + d->c2->handshake_state->certs->ed_sign_auth = + tor_cert_dup(get_current_auth_key_cert()); + } else { + tt_assert(! tor_tls_get_my_certs(0, &auth_cert, &id_cert)); + tor_x509_cert_get_der(auth_cert, &der, &sz); + d->c2->handshake_state->certs->auth_cert = tor_x509_cert_decode(der, sz); + } + + tor_x509_cert_get_der(link_cert, &der, &sz); + mock_peer_cert = tor_x509_cert_decode(der, sz); + tt_assert(mock_peer_cert); + + mock_own_cert = tor_x509_cert_decode(der, sz); + tt_assert(mock_own_cert); + + /* Make an authenticate cell ... */ + int authtype; + if (is_ed) + authtype = AUTHTYPE_ED25519_SHA256_RFC5705; + else + authtype = AUTHTYPE_RSA_SHA256_TLSSECRET; + tt_int_op(0, OP_EQ, connection_or_send_authenticate_cell(d->c1, authtype)); + + tt_assert(mock_got_var_cell); + d->cell = mock_got_var_cell; + mock_got_var_cell = NULL; + + return d; + done: + authenticate_data_cleanup(test, d); + return NULL; +} + +static struct testcase_setup_t setup_authenticate = { + .setup_fn = authenticate_data_setup, + .cleanup_fn = authenticate_data_cleanup +}; + +static void +test_link_handshake_auth_cell(void *arg) +{ + authenticate_data_t *d = arg; + auth1_t *auth1 = NULL; + crypto_pk_t *auth_pubkey = NULL; + + /* Is the cell well-formed on the outer layer? */ + tt_int_op(d->cell->command, OP_EQ, CELL_AUTHENTICATE); + tt_int_op(d->cell->payload[0], OP_EQ, 0); + if (d->is_ed) + tt_int_op(d->cell->payload[1], OP_EQ, 3); + else + tt_int_op(d->cell->payload[1], OP_EQ, 1); + tt_int_op(ntohs(get_uint16(d->cell->payload + 2)), OP_EQ, + d->cell->payload_len - 4); + + /* Check it out for plausibility... */ + auth_ctx_t ctx; + ctx.is_ed = d->is_ed; + tt_int_op(d->cell->payload_len-4, OP_EQ, auth1_parse(&auth1, + d->cell->payload+4, + d->cell->payload_len - 4, &ctx)); + tt_assert(auth1); + + if (d->is_ed) { + tt_mem_op(auth1->type, OP_EQ, "AUTH0003", 8); + } else { + tt_mem_op(auth1->type, OP_EQ, "AUTH0001", 8); + } + tt_mem_op(auth1->tlssecrets, OP_EQ, "int getRandomNumber(){return 4;}", 32); + + /* Is the signature okay? */ + const uint8_t *start = d->cell->payload+4, *end = auth1->end_of_signed; + if (d->is_ed) { + ed25519_signature_t sig; + tt_int_op(auth1_getlen_sig(auth1), OP_EQ, ED25519_SIG_LEN); + memcpy(&sig.sig, auth1_getarray_sig(auth1), ED25519_SIG_LEN); + tt_assert(!ed25519_checksig(&sig, start, end-start, + &get_current_auth_keypair()->pubkey)); + } else { + uint8_t sig[128]; + uint8_t digest[32]; + tt_int_op(auth1_getlen_sig(auth1), OP_GT, 120); + auth_pubkey = tor_tls_cert_get_key( + d->c2->handshake_state->certs->auth_cert); + int n = crypto_pk_public_checksig( + auth_pubkey, + (char*)sig, sizeof(sig), (char*)auth1_getarray_sig(auth1), + auth1_getlen_sig(auth1)); + tt_int_op(n, OP_EQ, 32); + crypto_digest256((char*)digest, + (const char*)start, end-start, DIGEST_SHA256); + tt_mem_op(sig, OP_EQ, digest, 32); + } + + /* Then feed it to c2. */ + tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 0); + channel_tls_process_authenticate_cell(d->cell, d->chan2); + tt_int_op(mock_close_called, OP_EQ, 0); + tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 1); + if (d->is_ed) { + tt_int_op(d->c2->handshake_state->authenticated_ed25519, OP_EQ, 1); + tt_int_op(d->c2->handshake_state->authenticated_rsa, OP_EQ, 1); + } else { + tt_int_op(d->c2->handshake_state->authenticated_ed25519, OP_EQ, 0); + tt_int_op(d->c2->handshake_state->authenticated_rsa, OP_EQ, 1); + } + + done: + auth1_free(auth1); + crypto_pk_free(auth_pubkey); +} + +#define AUTHENTICATE_FAIL(name, code) \ + static void \ + test_link_handshake_auth_ ## name(void *arg) \ + { \ + authenticate_data_t *d = arg; \ + const char *require_failure_message = NULL; \ + setup_capture_of_logs(LOG_INFO); \ + { code ; } \ + tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 0); \ + channel_tls_process_authenticate_cell(d->cell, d->chan2); \ + tt_int_op(mock_close_called, OP_EQ, 1); \ + tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 0); \ + if (require_failure_message) { \ + expect_log_msg_containing(require_failure_message); \ + } \ + done: \ + teardown_capture_of_logs(); \ + } + +AUTHENTICATE_FAIL(badstate, + require_failure_message = "We're not doing a v3 handshake"; + d->c2->base_.state = OR_CONN_STATE_CONNECTING) +AUTHENTICATE_FAIL(badproto, + require_failure_message = "not using link protocol >= 3"; + d->c2->link_proto = 2) +AUTHENTICATE_FAIL(atclient, + require_failure_message = "We originated this connection"; + d->c2->handshake_state->started_here = 1; + d->c2->handshake_state->certs->started_here = 1;) +AUTHENTICATE_FAIL(duplicate, + require_failure_message = "We already got one"; + d->c2->handshake_state->received_authenticate = 1) +static void +test_link_handshake_auth_already_authenticated(void *arg) +{ + authenticate_data_t *d = arg; + setup_capture_of_logs(LOG_INFO); + d->c2->handshake_state->authenticated = 1; + channel_tls_process_authenticate_cell(d->cell, d->chan2); + tt_int_op(mock_close_called, OP_EQ, 1); + tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 1); + expect_log_msg_containing("The peer is already authenticated"); + done: + teardown_capture_of_logs(); +} + +AUTHENTICATE_FAIL(nocerts, + require_failure_message = "We never got a certs cell"; + d->c2->handshake_state->received_certs_cell = 0) +AUTHENTICATE_FAIL(noidcert, + require_failure_message = "We never got an identity " + "certificate"; + tor_x509_cert_free(d->c2->handshake_state->certs->id_cert); + d->c2->handshake_state->certs->id_cert = NULL) +AUTHENTICATE_FAIL(noauthcert, + require_failure_message = "We never got an RSA " + "authentication certificate"; + tor_x509_cert_free(d->c2->handshake_state->certs->auth_cert); + d->c2->handshake_state->certs->auth_cert = NULL) +AUTHENTICATE_FAIL(tooshort, + require_failure_message = "Cell was way too short"; + d->cell->payload_len = 3) +AUTHENTICATE_FAIL(badtype, + require_failure_message = "Authenticator type was not " + "recognized"; + d->cell->payload[0] = 0xff) +AUTHENTICATE_FAIL(truncated_1, + require_failure_message = "Authenticator was truncated"; + d->cell->payload[2]++) +AUTHENTICATE_FAIL(truncated_2, + require_failure_message = "Authenticator was truncated"; + d->cell->payload[3]++) +AUTHENTICATE_FAIL(tooshort_1, + require_failure_message = "Authenticator was too short"; + tt_int_op(d->cell->payload_len, OP_GE, 260); + d->cell->payload[2] -= 1; + d->cell->payload_len -= 256;) +AUTHENTICATE_FAIL(badcontent, + require_failure_message = "Some field in the AUTHENTICATE " + "cell body was not as expected"; + d->cell->payload[10] ^= 0xff) +AUTHENTICATE_FAIL(badsig_1, + if (d->is_ed) + require_failure_message = "Ed25519 signature wasn't valid"; + else + require_failure_message = "RSA signature wasn't valid"; + d->cell->payload[d->cell->payload_len - 5] ^= 0xff) +AUTHENTICATE_FAIL(missing_ed_id, + { + tor_cert_free(d->c2->handshake_state->certs->ed_id_sign); + d->c2->handshake_state->certs->ed_id_sign = NULL; + require_failure_message = "Ed authenticate without Ed ID " + "cert from peer"; + }) +AUTHENTICATE_FAIL(missing_ed_auth, + { + tor_cert_free(d->c2->handshake_state->certs->ed_sign_auth); + d->c2->handshake_state->certs->ed_sign_auth = NULL; + require_failure_message = "We never got an Ed25519 " + "authentication certificate"; + }) + +#define TEST_RSA(name, flags) \ + { #name , test_link_handshake_ ## name, (flags), \ + &passthrough_setup, (void*)"RSA" } + +#define TEST_ED(name, flags) \ + { #name "_ed25519" , test_link_handshake_ ## name, (flags), \ + &passthrough_setup, (void*)"Ed25519" } + +#define TEST_RCV_AUTHCHALLENGE(name) \ + { "recv_authchallenge/" #name , \ + test_link_handshake_recv_authchallenge_ ## name, TT_FORK, \ + &setup_recv_authchallenge, NULL } + +#define TEST_RCV_CERTS(name) \ + { "recv_certs/" #name , \ + test_link_handshake_recv_certs_ ## name, TT_FORK, \ + &setup_recv_certs, (void*)"RSA-Link" } + +#define TEST_RCV_CERTS_RSA(name,type) \ + { "recv_certs/" #name , \ + test_link_handshake_recv_certs_ ## name, TT_FORK, \ + &setup_recv_certs, (void*)type } + +#define TEST_RCV_CERTS_ED(name, type) \ + { "recv_certs/" #name "_ed25519", \ + test_link_handshake_recv_certs_ ## name, TT_FORK, \ + &setup_recv_certs, (void*)type } + +#define TEST_AUTHENTICATE(name) \ + { "authenticate/" #name , test_link_handshake_auth_ ## name, TT_FORK, \ + &setup_authenticate, NULL } + +#define TEST_AUTHENTICATE_ED(name) \ + { "authenticate/" #name "_ed25519" , test_link_handshake_auth_ ## name, \ + TT_FORK, &setup_authenticate, (void*)3 } + +struct testcase_t link_handshake_tests[] = { + TEST_RSA(certs_ok, TT_FORK), + TEST_ED(certs_ok, TT_FORK), + + TEST_RCV_CERTS(ok), + TEST_RCV_CERTS_ED(ok, "Ed25519-Link"), + TEST_RCV_CERTS_RSA(ok_server, "RSA-Auth"), + TEST_RCV_CERTS_ED(ok_server, "Ed25519-Auth"), + TEST_RCV_CERTS(badstate), + TEST_RCV_CERTS(badproto), + TEST_RCV_CERTS(duplicate), + TEST_RCV_CERTS(already_authenticated), + TEST_RCV_CERTS(empty), + TEST_RCV_CERTS(bad_circid), + TEST_RCV_CERTS(truncated_1), + TEST_RCV_CERTS(truncated_2), + TEST_RCV_CERTS(truncated_3), + TEST_RCV_CERTS_ED(truncated_4, "Ed25519-Link"), + TEST_RCV_CERTS_ED(truncated_5, "Ed25519-Link"), + TEST_RCV_CERTS_ED(truncated_6, "Ed25519-Link"), + TEST_RCV_CERTS_ED(truncated_7, "Ed25519-Link"), + TEST_RCV_CERTS(not_x509), + TEST_RCV_CERTS(both_link), + TEST_RCV_CERTS(both_id_rsa), + TEST_RCV_CERTS(both_auth), + TEST_RCV_CERTS_ED(duplicate_id, "Ed25519-Link"), + TEST_RCV_CERTS_ED(duplicate_link, "Ed25519-Link"), + TEST_RCV_CERTS_ED(duplicate_crosscert, "Ed25519-Link"), + TEST_RCV_CERTS_ED(missing_crosscert, "Ed25519-Link"), + TEST_RCV_CERTS_ED(missing_id, "Ed25519-Link"), + TEST_RCV_CERTS_ED(missing_signing_key, "Ed25519-Link"), + TEST_RCV_CERTS_ED(missing_link, "Ed25519-Link"), + TEST_RCV_CERTS_ED(missing_auth, "Ed25519-Auth"), + TEST_RCV_CERTS_ED(missing_rsa_id, "Ed25519-Link"), + TEST_RCV_CERTS_ED(link_mismatch, "Ed25519-Link"), + TEST_RCV_CERTS_ED(bad_ed_sig, "Ed25519-Link"), + TEST_RCV_CERTS_ED(bad_rsa_id_cert, "Ed25519-Link"), + TEST_RCV_CERTS_ED(bad_crosscert, "Ed25519-Link"), + TEST_RCV_CERTS_RSA(expired_rsa_id, "RSA-Link"), + TEST_RCV_CERTS_ED(expired_rsa_id, "Ed25519-Link"), + TEST_RCV_CERTS_ED(expired_ed_id, "Ed25519-Link"), + TEST_RCV_CERTS_ED(expired_ed_link, "Ed25519-Link"), + TEST_RCV_CERTS_ED(expired_crosscert, "Ed25519-Link"), + TEST_RCV_CERTS(wrong_labels_1), + TEST_RCV_CERTS(wrong_labels_2), + TEST_RCV_CERTS(wrong_labels_3), + TEST_RCV_CERTS(server_missing_certs), + TEST_RCV_CERTS(server_wrong_labels_1), + + TEST_RSA(send_authchallenge, TT_FORK), + TEST_RCV_AUTHCHALLENGE(ok), + TEST_RCV_AUTHCHALLENGE(ok_ed25519), + TEST_RCV_AUTHCHALLENGE(ok_noserver), + TEST_RCV_AUTHCHALLENGE(ok_unrecognized), + TEST_RCV_AUTHCHALLENGE(badstate), + TEST_RCV_AUTHCHALLENGE(badproto), + TEST_RCV_AUTHCHALLENGE(as_server), + TEST_RCV_AUTHCHALLENGE(duplicate), + TEST_RCV_AUTHCHALLENGE(nocerts), + TEST_RCV_AUTHCHALLENGE(tooshort), + TEST_RCV_AUTHCHALLENGE(truncated), + TEST_RCV_AUTHCHALLENGE(nonzero_circid), + + TEST_AUTHENTICATE(cell), + TEST_AUTHENTICATE_ED(cell), + TEST_AUTHENTICATE(badstate), + TEST_AUTHENTICATE(badproto), + TEST_AUTHENTICATE(atclient), + TEST_AUTHENTICATE(duplicate), + TEST_AUTHENTICATE(already_authenticated), + TEST_AUTHENTICATE(nocerts), + TEST_AUTHENTICATE(noidcert), + TEST_AUTHENTICATE(noauthcert), + TEST_AUTHENTICATE(tooshort), + TEST_AUTHENTICATE(badtype), + TEST_AUTHENTICATE(truncated_1), + TEST_AUTHENTICATE(truncated_2), + TEST_AUTHENTICATE(tooshort_1), + TEST_AUTHENTICATE(badcontent), + TEST_AUTHENTICATE(badsig_1), + TEST_AUTHENTICATE_ED(badsig_1), + TEST_AUTHENTICATE_ED(missing_ed_id), + TEST_AUTHENTICATE_ED(missing_ed_auth), + //TEST_AUTHENTICATE(), + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_logging.c b/src/wraith/src/test/test_logging.c new file mode 100644 index 000000000..e373158e3 --- /dev/null +++ b/src/wraith/src/test/test_logging.c @@ -0,0 +1,173 @@ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" +#include "torlog.h" +#include "test.h" + +static void +dummy_cb_fn(int severity, uint32_t domain, const char *msg) +{ + (void)severity; (void)domain; (void)msg; +} + +static void +test_get_sigsafe_err_fds(void *arg) +{ + const int *fds; + int n; + log_severity_list_t include_bug, no_bug, no_bug2; + (void) arg; + init_logging(1); + + n = tor_log_get_sigsafe_err_fds(&fds); + tt_int_op(n, OP_EQ, 1); + tt_int_op(fds[0], OP_EQ, STDERR_FILENO); + + set_log_severity_config(LOG_WARN, LOG_ERR, &include_bug); + set_log_severity_config(LOG_WARN, LOG_ERR, &no_bug); + no_bug.masks[0] &= ~(LD_BUG|LD_GENERAL); + set_log_severity_config(LOG_INFO, LOG_NOTICE, &no_bug2); + + /* Add some logs; make sure the output is as expected. */ + mark_logs_temp(); + add_stream_log(&include_bug, "dummy-1", 3); + add_stream_log(&no_bug, "dummy-2", 4); + add_stream_log(&no_bug2, "dummy-3", 5); + add_callback_log(&include_bug, dummy_cb_fn); + close_temp_logs(); + tor_log_update_sigsafe_err_fds(); + + n = tor_log_get_sigsafe_err_fds(&fds); + tt_int_op(n, OP_EQ, 2); + tt_int_op(fds[0], OP_EQ, STDERR_FILENO); + tt_int_op(fds[1], OP_EQ, 3); + + /* Allow STDOUT to replace STDERR. */ + add_stream_log(&include_bug, "dummy-4", STDOUT_FILENO); + tor_log_update_sigsafe_err_fds(); + n = tor_log_get_sigsafe_err_fds(&fds); + tt_int_op(n, OP_EQ, 2); + tt_int_op(fds[0], OP_EQ, 3); + tt_int_op(fds[1], OP_EQ, STDOUT_FILENO); + + /* But don't allow it to replace explicit STDERR. */ + add_stream_log(&include_bug, "dummy-5", STDERR_FILENO); + tor_log_update_sigsafe_err_fds(); + n = tor_log_get_sigsafe_err_fds(&fds); + tt_int_op(n, OP_EQ, 3); + tt_int_op(fds[0], OP_EQ, STDERR_FILENO); + tt_int_op(fds[1], OP_EQ, STDOUT_FILENO); + tt_int_op(fds[2], OP_EQ, 3); + + /* Don't overflow the array. */ + { + int i; + for (i=5; i<20; ++i) { + add_stream_log(&include_bug, "x-dummy", i); + } + } + tor_log_update_sigsafe_err_fds(); + n = tor_log_get_sigsafe_err_fds(&fds); + tt_int_op(n, OP_EQ, 8); + + done: + ; +} + +static void +test_sigsafe_err(void *arg) +{ + const char *fn=get_fname("sigsafe_err_log"); + char *content=NULL; + log_severity_list_t include_bug; + smartlist_t *lines = smartlist_new(); + (void)arg; + + set_log_severity_config(LOG_WARN, LOG_ERR, &include_bug); + + init_logging(1); + mark_logs_temp(); + add_file_log(&include_bug, fn, 0); + tor_log_update_sigsafe_err_fds(); + close_temp_logs(); + + close(STDERR_FILENO); + log_err(LD_BUG, "Say, this isn't too cool."); + tor_log_err_sigsafe("Minimal.\n", NULL); + + set_log_time_granularity(100*1000); + tor_log_err_sigsafe("Testing any ", + "attempt to manually log ", + "from a signal.\n", + NULL); + mark_logs_temp(); + close_temp_logs(); + close(STDERR_FILENO); + content = read_file_to_str(fn, 0, NULL); + + tt_ptr_op(content, OP_NE, NULL); + tor_split_lines(lines, content, (int)strlen(content)); + tt_int_op(smartlist_len(lines), OP_GE, 5); + + if (strstr(smartlist_get(lines, 0), "opening new log file")) + smartlist_del_keeporder(lines, 0); + tt_assert(strstr(smartlist_get(lines, 0), "Say, this isn't too cool")); + /* Next line is blank. */ + tt_assert(!strcmpstart(smartlist_get(lines, 1), "==============")); + tt_assert(!strcmpstart(smartlist_get(lines, 2), "Minimal.")); + /* Next line is blank. */ + tt_assert(!strcmpstart(smartlist_get(lines, 3), "==============")); + tt_str_op(smartlist_get(lines, 4), OP_EQ, + "Testing any attempt to manually log from a signal."); + + done: + tor_free(content); + smartlist_free(lines); +} + +static void +test_ratelim(void *arg) +{ + (void) arg; + ratelim_t ten_min = RATELIM_INIT(10*60); + + const time_t start = 1466091600; + time_t now = start; + /* Initially, we're ready. */ + + char *msg = NULL; + + msg = rate_limit_log(&ten_min, now); + tt_ptr_op(msg, OP_NE, NULL); + tt_str_op(msg, OP_EQ, ""); /* nothing was suppressed. */ + + tt_int_op(ten_min.last_allowed, OP_EQ, now); + tor_free(msg); + + int i; + for (i = 0; i < 9; ++i) { + now += 60; /* one minute has passed. */ + msg = rate_limit_log(&ten_min, now); + tt_ptr_op(msg, OP_EQ, NULL); + tt_int_op(ten_min.last_allowed, OP_EQ, start); + tt_int_op(ten_min.n_calls_since_last_time, OP_EQ, i + 1); + } + + now += 240; /* Okay, we can be done. */ + msg = rate_limit_log(&ten_min, now); + tt_ptr_op(msg, OP_NE, NULL); + tt_str_op(msg, OP_EQ, + " [9 similar message(s) suppressed in last 600 seconds]"); + done: + tor_free(msg); +} + +struct testcase_t logging_tests[] = { + { "sigsafe_err_fds", test_get_sigsafe_err_fds, TT_FORK, NULL, NULL }, + { "sigsafe_err", test_sigsafe_err, TT_FORK, NULL, NULL }, + { "ratelim", test_ratelim, 0, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_microdesc.c b/src/wraith/src/test/test_microdesc.c new file mode 100644 index 000000000..59b28f758 --- /dev/null +++ b/src/wraith/src/test/test_microdesc.c @@ -0,0 +1,857 @@ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" + +#include "config.h" +#include "dirvote.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "routerlist.h" +#include "routerparse.h" +#include "torcert.h" + +#include "test.h" + +#ifdef _WIN32 +/* For mkdir() */ +#include +#else +#include +#endif /* defined(_WIN32) */ + +static const char test_md1[] = + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMjlHH/daN43cSVRaHBwgUfnszzAhg98EvivJ9Qxfv51mvQUxPjQ07es\n" + "gV/3n8fyh3Kqr/ehi9jxkdgSRfSnmF7giaHL1SLZ29kA7KtST+pBvmTpDtHa3ykX\n" + "Xorc7hJvIyTZoc1HU+5XSynj3gsBE5IGK1ZRzrNS688LnuZMVp1tAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static const char test_md2[] = + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMIixIowh2DyPmDNMDwBX2DHcYcqdcH1zdIQJZkyV6c6rQHnvbcaDoSg\n" + "jgFSLJKpnGmh71FVRqep+yVB0zI1JY43kuEnXry2HbZCD9UDo3d3n7t015X5S7ON\n" + "bSSYtQGPwOr6Epf96IF6DoQxy4iDnPUAlejuhAG51s1y6/rZQ3zxAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n"; + +static const char test_md3[] = + "@last-listed 2009-06-22\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMH3340d4ENNGrqx7UxT+lB7x6DNUKOdPEOn4teceE11xlMyZ9TPv41c\n" + "qj2fRZzfxlc88G/tmiaHshmdtEpklZ740OFqaaJVj4LjPMKFNE+J7Xc1142BE9Ci\n" + "KgsbjGYe2RY261aADRWLetJ8T9QDMm+JngL4288hc8pq1uB/3TAbAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "p accept 1-700,800-1000\n" + "family nodeX nodeY nodeZ\n"; + +static void +test_md_cache(void *data) +{ + or_options_t *options = NULL; + microdesc_cache_t *mc = NULL ; + smartlist_t *added = NULL, *wanted = NULL; + microdesc_t *md1, *md2, *md3; + char d1[DIGEST256_LEN], d2[DIGEST256_LEN], d3[DIGEST256_LEN]; + const char *test_md3_noannotation = strchr(test_md3, '\n')+1; + time_t time1, time2, time3; + char *fn = NULL, *s = NULL; + (void)data; + + options = get_options_mutable(); + tt_assert(options); + + time1 = time(NULL); + time2 = time(NULL) - 2*24*60*60; + time3 = time(NULL) - 15*24*60*60; + + /* Possibly, turn this into a test setup/cleanup pair */ + tor_free(options->CacheDirectory); + options->CacheDirectory = tor_strdup(get_fname("md_datadir_test")); +#ifdef _WIN32 + tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory)); +#else + tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory, 0700)); +#endif + + tt_assert(!strcmpstart(test_md3_noannotation, "onion-key")); + + crypto_digest256(d1, test_md1, strlen(test_md1), DIGEST_SHA256); + crypto_digest256(d2, test_md2, strlen(test_md1), DIGEST_SHA256); + crypto_digest256(d3, test_md3_noannotation, strlen(test_md3_noannotation), + DIGEST_SHA256); + + mc = get_microdesc_cache(); + + added = microdescs_add_to_cache(mc, test_md1, NULL, SAVED_NOWHERE, 0, + time1, NULL); + tt_int_op(1, OP_EQ, smartlist_len(added)); + md1 = smartlist_get(added, 0); + smartlist_free(added); + added = NULL; + + wanted = smartlist_new(); + added = microdescs_add_to_cache(mc, test_md2, NULL, SAVED_NOWHERE, 0, + time2, wanted); + /* Should fail, since we didn't list test_md2's digest in wanted */ + tt_int_op(0, OP_EQ, smartlist_len(added)); + smartlist_free(added); + added = NULL; + + smartlist_add(wanted, tor_memdup(d2, DIGEST256_LEN)); + smartlist_add(wanted, tor_memdup(d3, DIGEST256_LEN)); + added = microdescs_add_to_cache(mc, test_md2, NULL, SAVED_NOWHERE, 0, + time2, wanted); + /* Now it can work. md2 should have been added */ + tt_int_op(1, OP_EQ, smartlist_len(added)); + md2 = smartlist_get(added, 0); + /* And it should have gotten removed from 'wanted' */ + tt_int_op(smartlist_len(wanted), OP_EQ, 1); + tt_mem_op(smartlist_get(wanted, 0), OP_EQ, d3, DIGEST256_LEN); + smartlist_free(added); + added = NULL; + + added = microdescs_add_to_cache(mc, test_md3, NULL, + SAVED_NOWHERE, 0, -1, NULL); + /* Must fail, since SAVED_NOWHERE precludes annotations */ + tt_int_op(0, OP_EQ, smartlist_len(added)); + smartlist_free(added); + added = NULL; + + added = microdescs_add_to_cache(mc, test_md3_noannotation, NULL, + SAVED_NOWHERE, 0, time3, NULL); + /* Now it can work */ + tt_int_op(1, OP_EQ, smartlist_len(added)); + md3 = smartlist_get(added, 0); + smartlist_free(added); + added = NULL; + + /* Okay. We added 1...3. Let's poke them to see how they look, and make + * sure they're really in the journal. */ + tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1)); + tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2)); + tt_ptr_op(md3, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3)); + + tt_int_op(md1->last_listed, OP_EQ, time1); + tt_int_op(md2->last_listed, OP_EQ, time2); + tt_int_op(md3->last_listed, OP_EQ, time3); + + tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_JOURNAL); + tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_JOURNAL); + tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_JOURNAL); + + tt_int_op(md1->bodylen, OP_EQ, strlen(test_md1)); + tt_int_op(md2->bodylen, OP_EQ, strlen(test_md2)); + tt_int_op(md3->bodylen, OP_EQ, strlen(test_md3_noannotation)); + tt_mem_op(md1->body, OP_EQ, test_md1, strlen(test_md1)); + tt_mem_op(md2->body, OP_EQ, test_md2, strlen(test_md2)); + tt_mem_op(md3->body, OP_EQ, test_md3_noannotation, + strlen(test_md3_noannotation)); + + tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs.new", + options->CacheDirectory); + s = read_file_to_str(fn, RFTS_BIN, NULL); + tt_assert(s); + tt_mem_op(md1->body, OP_EQ, s + md1->off, md1->bodylen); + tt_mem_op(md2->body, OP_EQ, s + md2->off, md2->bodylen); + tt_mem_op(md3->body, OP_EQ, s + md3->off, md3->bodylen); + + tt_ptr_op(md1->family, OP_EQ, NULL); + tt_ptr_op(md3->family, OP_NE, NULL); + tt_int_op(smartlist_len(md3->family), OP_EQ, 3); + tt_str_op(smartlist_get(md3->family, 0), OP_EQ, "nodeX"); + + /* Now rebuild the cache! */ + tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0); + + tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_CACHE); + tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_CACHE); + tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_CACHE); + + /* The journal should be empty now */ + tor_free(s); + s = read_file_to_str(fn, RFTS_BIN, NULL); + tt_str_op(s, OP_EQ, ""); + tor_free(s); + tor_free(fn); + + /* read the cache. */ + tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs", + options->CacheDirectory); + s = read_file_to_str(fn, RFTS_BIN, NULL); + tt_mem_op(md1->body, OP_EQ, s + md1->off, strlen(test_md1)); + tt_mem_op(md2->body, OP_EQ, s + md2->off, strlen(test_md2)); + tt_mem_op(md3->body, OP_EQ, s + md3->off, strlen(test_md3_noannotation)); + + /* Okay, now we are going to forget about the cache entirely, and reload it + * from the disk. */ + microdesc_free_all(); + mc = get_microdesc_cache(); + md1 = microdesc_cache_lookup_by_digest256(mc, d1); + md2 = microdesc_cache_lookup_by_digest256(mc, d2); + md3 = microdesc_cache_lookup_by_digest256(mc, d3); + tt_assert(md1); + tt_assert(md2); + tt_assert(md3); + tt_mem_op(md1->body, OP_EQ, s + md1->off, strlen(test_md1)); + tt_mem_op(md2->body, OP_EQ, s + md2->off, strlen(test_md2)); + tt_mem_op(md3->body, OP_EQ, s + md3->off, strlen(test_md3_noannotation)); + + tt_int_op(md1->last_listed, OP_EQ, time1); + tt_int_op(md2->last_listed, OP_EQ, time2); + tt_int_op(md3->last_listed, OP_EQ, time3); + + /* Okay, now we are going to clear out everything older than a week old. + * In practice, that means md3 */ + microdesc_cache_clean(mc, time(NULL)-7*24*60*60, 1/*force*/); + tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1)); + tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2)); + tt_ptr_op(NULL, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3)); + md3 = NULL; /* it's history now! */ + + /* rebuild again, make sure it stays gone. */ + tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0); + tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1)); + tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2)); + tt_ptr_op(NULL, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3)); + + /* Re-add md3, and make sure we can rebuild the cache. */ + added = microdescs_add_to_cache(mc, test_md3_noannotation, NULL, + SAVED_NOWHERE, 0, time3, NULL); + tt_int_op(1, OP_EQ, smartlist_len(added)); + md3 = smartlist_get(added, 0); + smartlist_free(added); + added = NULL; + tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_CACHE); + tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_CACHE); + tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_JOURNAL); + + tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0); + tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_CACHE); + + done: + if (options) + tor_free(options->CacheDirectory); + microdesc_free_all(); + + smartlist_free(added); + if (wanted) + SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); + smartlist_free(wanted); + tor_free(s); + tor_free(fn); +} + +static const char truncated_md[] = + "@last-listed 2013-08-08 19:02:59\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAM91vLFNaM+gGhnRIdz2Cm/Kl7Xz0cOobIdVzhS3cKUJfk867hCuTipS\n" + "NveLBzNopvgXKruAAzEj3cACxk6Q8lv5UWOGCD1UolkgsWSE62RBjap44g+oc9J1\n" + "RI9968xOTZw0VaBQg9giEILNXl0djoikQ+5tQRUvLDDa67gpa5Q1AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "family @\n"; + +static void +test_md_cache_broken(void *data) +{ + or_options_t *options; + char *fn=NULL; + microdesc_cache_t *mc = NULL; + + (void)data; + + options = get_options_mutable(); + tt_assert(options); + tor_free(options->CacheDirectory); + options->CacheDirectory = tor_strdup(get_fname("md_datadir_test2")); + +#ifdef _WIN32 + tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory)); +#else + tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory, 0700)); +#endif + + tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs", + options->CacheDirectory); + + write_str_to_file(fn, truncated_md, 1); + + mc = get_microdesc_cache(); + tt_assert(mc); + + done: + if (options) + tor_free(options->CacheDirectory); + tor_free(fn); + microdesc_free_all(); +} + +/* Generated by chutney. */ +static const char test_ri[] = + "router test005r 127.0.0.1 5005 0 7005\n" + "platform Tor 0.2.5.4-alpha-dev on Linux\n" + "protocols Link 1 2 Circuit 1\n" + "published 2014-05-06 22:57:55\n" + "fingerprint 09DE 3BA2 48C2 1C3F 3760 6CD3 8460 43A6 D5EC F59E\n" + "uptime 0\n" + "bandwidth 1073741824 1073741824 0\n" + "extra-info-digest 361F9428F9FA4DD854C03DDBCC159D0D9FA996C9\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n" + "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n" + "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANbGUC4802Ke6C3nOVxN0U0HhIRrs32cQFEL4v+UUMJPgjbistHBvOax\n" + "CWVR/sMXM2kKJeGThJ9ZUs2p9dDG4WHPUXgkMqzTTEeeFa7pQKU0brgbmLaJq0Pi\n" + "mxmqC5RkTHa5bQvq6QlSFprAEoovV27cWqBM9jVdV9hyc//6kwPzAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "hidden-service-dir\n" + "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n" + "reject *:25\n" + "reject *:119\n" + "reject *:135-139\n" + "reject *:445\n" + "reject *:563\n" + "reject *:1214\n" + "reject *:4661-4666\n" + "reject *:6346-6429\n" + "reject *:6699\n" + "reject *:6881-6999\n" + "accept *:*\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "ImzX5PF2vRCrG1YzGToyjoxYhgh1vtHEDjmP+tIS/iil1DSnHZNpHSuHp0L1jE9S\n" + "yZyrtKaqpBE/aecAM3j4CWCn/ipnAAQkHcyRLin1bYvqBtRzyopVCRlUhF+uWrLq\n" + "t0xkIE39ss/EwmQr7iIgkdVH4oRIMsjYnFFJBG26nYY=\n" + "-----END SIGNATURE-----\n"; + +static const char test_ri2[] = + "router test001a 127.0.0.1 5001 0 7001\n" + "identity-ed25519\n" + "-----BEGIN ED25519 CERT-----\n" + "AQQABf/FAf5iDuKCZP2VxnAaQWdklilAh6kaEeFX4z8261Yx2T1/AQAgBADCp8vO\n" + "B8K1F9g2DzwuwvVCnPFLSK1qknVqPpNucHLH9DY7fuIYogBAdz4zHv1qC7RKaMNG\n" + "Jux/tMO2tzPcm62Ky5PjClMQplKUOnZNQ+RIpA3wYCIfUDy/cQnY7XWgNQ0=\n" + "-----END ED25519 CERT-----\n" + "platform Tor 0.2.6.0-alpha-dev on Darwin\n" + "protocols Link 1 2 Circuit 1\n" + "published 2014-10-08 12:58:04\n" + "fingerprint B7E2 7F10 4213 C36F 13E7 E982 9182 845E 4959 97A0\n" + "uptime 0\n" + "bandwidth 1073741824 1073741824 0\n" + "extra-info-digest 568F27331B6D8C73E7024F1EF5D097B90DFC7CDB\n" + "caches-extra-info\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAL2R8EfubUcahxha4u02P4VAR0llQIMwFAmrHPjzcK7apcQgDOf2ovOA\n" + "+YQnJFxlpBmCoCZC6ssCi+9G0mqo650lFuTMP5I90BdtjotfzESfTykHLiChyvhd\n" + "l0dlqclb2SU/GKem/fLRXH16aNi72CdSUu/1slKs/70ILi34QixRAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "signing-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAN8+78KUVlgHXdMMkYJxcwh1Zv2y+Gb5eWUyltUaQRajhrT9ij2T5JZs\n" + "M0g85xTcuM3jNVVpV79+33hiTohdC6UZ+Bk4USQ7WBFzRbVFSXoVKLBJFkCOIexg\n" + "SMGNd5WEDtHWrXl58mizmPFu1eG6ZxHzt7RuLSol5cwBvawXPNkFAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "onion-key-crosscert\n" + "-----BEGIN CROSSCERT-----\n" + "ETFDzU49bvNfoZnKK1j6JeBP2gDirgj6bBCgWpUYs663OO9ypbZRO0JwWANssKl6\n" + "oaq9vKTsKGRsaNnqnz/JGMhehymakjjNtqg7crWwsahe8+7Pw9GKmW+YjFtcOkUf\n" + "KfOn2bmKBa1FoJb4yW3oXzHcdlLSRuCciKqPn+Hky5o=\n" + "-----END CROSSCERT-----\n" + "ntor-onion-key-crosscert 0\n" + "-----BEGIN ED25519 CERT-----\n" + "AQoABf2dAcKny84HwrUX2DYPPC7C9UKc8UtIrWqSdWo+k25wcsf0AFohutG+xI06\n" + "Ef21c5Zl1j8Hw6DzHDjYyJevXLFuOneaL3zcH2Ldn4sjrG3kc5UuVvRfTvV120UO\n" + "xk4f5s5LGwY=\n" + "-----END ED25519 CERT-----\n" + "hidden-service-dir\n" + "contact auth1@test.test\n" + "ntor-onion-key hbxdRnfVUJJY7+KcT4E3Rs7/zuClbN3hJrjSBiEGMgI=\n" + "reject *:*\n" + "router-sig-ed25519 5aQXyTif7PExIuL2di37UvktmJECKnils2OWz2vDi" + "hFxi+5TTAAPxYkS5clhc/Pjvw34itfjGmTKFic/8httAQ\n" + "router-signature\n" + "-----BEGIN SIGNATURE-----\n" + "BaUB+aFPQbb3BwtdzKsKqV3+6cRlSqJF5bI3UTmwRoJk+Z5Pz+W5NWokNI0xArHM\n" + "T4T5FZCCP9350jXsUCIvzyIyktU6aVRCGFt76rFlo1OETpN8GWkMnQU0w18cxvgS\n" + "cf34GXHv61XReJF3AlzNHFpbrPOYmowmhrTULKyMqow=\n" + "-----END SIGNATURE-----\n"; + +static const char test_md_8[] = + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n" + "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n" + "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n"; + +static const char test_md_16[] = + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n" + "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n" + "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n" + "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n"; + +static const char test_md_18[] = + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n" + "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n" + "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n" + "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n" + "id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4\n"; + +static const char test_md2_18[] = + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAL2R8EfubUcahxha4u02P4VAR0llQIMwFAmrHPjzcK7apcQgDOf2ovOA\n" + "+YQnJFxlpBmCoCZC6ssCi+9G0mqo650lFuTMP5I90BdtjotfzESfTykHLiChyvhd\n" + "l0dlqclb2SU/GKem/fLRXH16aNi72CdSUu/1slKs/70ILi34QixRAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key hbxdRnfVUJJY7+KcT4E3Rs7/zuClbN3hJrjSBiEGMgI=\n" + "id rsa1024 t+J/EEITw28T5+mCkYKEXklZl6A\n"; + +static const char test_md2_21[] = + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAL2R8EfubUcahxha4u02P4VAR0llQIMwFAmrHPjzcK7apcQgDOf2ovOA\n" + "+YQnJFxlpBmCoCZC6ssCi+9G0mqo650lFuTMP5I90BdtjotfzESfTykHLiChyvhd\n" + "l0dlqclb2SU/GKem/fLRXH16aNi72CdSUu/1slKs/70ILi34QixRAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key hbxdRnfVUJJY7+KcT4E3Rs7/zuClbN3hJrjSBiEGMgI=\n" + "id ed25519 wqfLzgfCtRfYNg88LsL1QpzxS0itapJ1aj6TbnByx/Q\n"; + +static void +test_md_generate(void *arg) +{ + routerinfo_t *ri; + microdesc_t *md = NULL; + (void)arg; + + ri = router_parse_entry_from_string(test_ri, NULL, 0, 0, NULL, NULL); + tt_assert(ri); + md = dirvote_create_microdescriptor(ri, 8); + tt_str_op(md->body, OP_EQ, test_md_8); + + /* XXXX test family lines. */ + /* XXXX test method 14 for A lines. */ + /* XXXX test method 15 for P6 lines. */ + + microdesc_free(md); + md = NULL; + md = dirvote_create_microdescriptor(ri, 16); + tt_str_op(md->body, OP_EQ, test_md_16); + + microdesc_free(md); + md = NULL; + md = dirvote_create_microdescriptor(ri, 18); + tt_str_op(md->body, OP_EQ, test_md_18); + + microdesc_free(md); + md = NULL; + md = dirvote_create_microdescriptor(ri, 21); + tt_str_op(md->body, OP_EQ, test_md_18); + + routerinfo_free(ri); + ri = router_parse_entry_from_string(test_ri2, NULL, 0, 0, NULL, NULL); + + microdesc_free(md); + md = NULL; + md = dirvote_create_microdescriptor(ri, 18); + tt_str_op(md->body, OP_EQ, test_md2_18); + + microdesc_free(md); + md = NULL; + md = dirvote_create_microdescriptor(ri, 21); + tt_str_op(md->body, OP_EQ, test_md2_21); + tt_assert(ed25519_pubkey_eq(md->ed25519_identity_pkey, + &ri->cache_info.signing_key_cert->signing_key)); + + done: + microdesc_free(md); + routerinfo_free(ri); +} + +#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS +DISABLE_GCC_WARNING(overlength-strings) +/* We allow huge string constants in the unit tests, but not in the code + * at large. */ +#endif +/* Taken at random from my ~/.tor/cached-microdescs file and then + * hand-munged */ +static const char MD_PARSE_TEST_DATA[] = + /* Good 0 */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANsKd1GRfOuSR1MkcwKqs6SVy4Gi/JXplt/bHDkIGm6Q96TeJ5uyVgUL\n" + "DBr/ij6+JqgVFeriuiMzHKREytzjdaTuKsKBFFpLwb+Ppcjr5nMIH/AR6/aHO8hW\n" + "T3B9lx5T6Kl7CqZ4yqXxYRHzn50EPTIZuz0y9se4J4gi9mLmL+pHAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "p accept 20-23,43,53,79-81,88,110,143,194,220,443,464,531,543-544\n" + "id rsa1024 GEo59/iR1GWSIWZDzXTd5QxtqnU\n" + /* Bad 0: I've messed with the onion-key in the second one. */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMr4o/pflVwscx11vC1AKEADlKEqnhpvCIjAEzNEenMhvGQHRlA0EXLC\n" + "7G7O5bhnCwEHqK8Pvg8cuX/fD8v08TF1EVPhwPa0UI6ab8KnPP2F!!!!!!b92DG7EQIk3q\n" + "d68Uxp7E9/t3v1WWZjzDqvEe0par6ul+DKW6HMlTGebFo5Q4e8R1AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key 761Dmm27via7lXygNHM3l+oJLrYU2Nye0Uz4pkpipyY=\n" + "p accept 53\n" + "id rsa1024 3Y4fwXhtgkdGDZ5ef5mtb6TJRQQ\n" + /* Good 1 */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANsMSjVi3EX8ZHfm/dvPF6KdVR66k1tVul7Jp+dDbDajBYNhgKRzVCxy\n" + "Yac1CBuQjOqK89tKap9PQBnhF087eDrfaZDqYTLwB2W2sBJncVej15WEPXPRBifo\n" + "iFZ8337kgczkaY+IOfSuhtbOUyDOoDpRJheIKBNq0ZiTqtLbbadVAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key ncfiHJjSgdDEW/gc6q6/7idac7j+x7ejQrRm6i75pGA=\n" + "p accept 443,6660-6669,6697,7000-7001\n" + "id rsa1024 XXuLzw3mfBELEq3veXoNhdehwD4\n" + /* Good 2 */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANQfBlrHrh9F/CAOytrNFgi0ikWMW/HZxuoszF9X+AQ+MudR8bcxxOGl\n" + "1RFwb74s8E3uuzrCkNFvSw9Ar1L02F2DOX0gLsxEGuYC4Ave9NUteGqSqDyEJQUJ\n" + "KlfxCPn2qC9nvNT7wR/Dg2WRvAEKnJmkpb57N3+WSAOPLjKOFEz3AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key AppBt6CSeb1kKid/36ototmFA24ddfW5JpjWPLuoJgs=\n" + "id rsa1024 6y60AEI9a1PUUlRPO0YQT9WzrjI\n" + /* Bad 1: Here I've messed with the ntor key */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAPjy2HacU3jDNO5nTOFGSwNa0qKCNn4yhtrDVcAJ5alIQeBWZZGJLZ0q\n" + "Cqylw1vYqxu8E09g+QXXFbAgBv1U9TICaATxrIJhIJzc8TJPhqJemp1kq0DvHLDx\n" + "mxwlkNnCD/P5NS+JYB3EjOlU9EnSKUWNU61+Co344m2JqhEau40vAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key 4i2Fp9JHTUr1uQs0pxD5j5spl4/RG56S2P0gQxU=\n" + "id rsa1024 nMRmNEGysA0NmlALVaUmI7D5jLU\n" + /* Good 3: I've added a weird token in this one. This shouldn't prevent + * it parsing */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKmosxudyNA/yJNz3S890VqV/ebylzoD11Sc0b/d5tyNNaNZjcYy5vRD\n" + "kwyxFRMbP2TLZQ1zRfNwY7IDnYjU2SbW0pxuM6M8WRtsmx/YOE3kHMVAFJNrTUqU\n" + "6D1zB3IiRDS5q5+NoRxwqo+hYUck60O3WTwEoqb+l3lvXeu7z9rFAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "flux-capacitor 1.21 GW\n" + "ntor-onion-key MWBoEkl+RlBiGX44XKIvTSqbznTNZStOmUYtcYRQQyY=\n" + "id rsa1024 R+A5O9qRvRac4FT3C4L2QnFyxsc\n" + /* Good 4: Here I've made the 'id rsa' token odd. It should still parse + * just fine. */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAOh+WMkdNe/Pkjb8UjQyfLOlFgpuVFrxAIGnJsmWWx0yBE97DQxGyh2n\n" + "h8G5OJZHRarJQyCIf7vpZQAi0oP0OkGGaCaDQsM+D8TnqhnU++RWGnMqY/cXxPrL\n" + "MEq+n6aGiLmzkO7ah8yorZpoREk4GqLUIN89/tHHGOhJL3c4CPGjAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n" + "id rsa1234 jlqAKFD2E7uMKv+8TmKSeo7NBho\n" + /* Good 5: Extra id type. */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAMdgPPc5uaw4y/q+SUTN/I8Y+Gvdx9kKgWV4dmDGJ0mxsVZmo1v6+v3F\n" + "12M2f9m99G3WB8F8now29C+9XyEv8MBHj1lHRdUFHSQes3YTFvDNlgj+FjLqO5TJ\n" + "adOOmfu4DCUUtUEDyQKbNVL4EkMTXY73omTVsjcH3xxFjTx5wixhAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key AAVnWZcnDbxasdZwKqb4fL6O9sZV+XsRNHTpNd1YMz8=\n" + "id rsa1024 72EfBL11QuwX2vU8y+p9ExGfGEg\n" + "id expolding hedgehog 0+A5O9qRvRac4FT3C4L2QnFyxsc\n" + /* Good 6: I've given this a bogus policy. It should parse. */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALNuufwhPMF8BooxYMNvhYJMPqUB8hQDt8wGmPKphJcD1sVD1i4gAZM2\n" + "HIo+zUBlljDrRWL5NzVzd1yxUJAiQxvXS5dRRFY3B70M7wTVpXw53xe0/BM5t1AX\n" + "n0MFk7Jl6XIKMlzRalZvmMvE/odtyWXkP4Nd1MyZ1QcIwrQ2iwyrAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "p condone 1-10\n" + "ntor-onion-key 2/nMJ+L4dd/2GpMyTYjz3zC59MvQy4MIzJZhdzKHekg=\n" + "id rsa1024 FHyh10glEMA6MCmBb5R9Y+X/MhQ\n" + /* Good 7: I've given this one another sort of odd policy. Should parse. */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAKcd3FmQ8iAADghyvX8eca0ePqtJ2w1IDdUdTlf5Y/8+OMdp//sD01yC\n" + "YmiX45LK5ge1O3AzcakYCO6fb3pyIqvXdvm24OjyYZELQ40cmKSLjdhcSf4Fr/N9\n" + "uR/CkknR9cEePu1wZ5WBIGmGdXI6s7t3LB+e7XFyBYAx6wMGlnX7AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "p accept frogs-mice\n" + "ntor-onion-key AMxvhaQ1Qg7jBJFoyHuPRgETvLbFmJ194hExV24FuAI=\n" + "family $D8CFEA0D996F5D1473D2063C041B7910DB23981E\n" + "id rsa1024 d0VVZC/cHh1P3y4MMbfKlQHFycc\n" + /* Good 8: This one has the ntor-onion-key without terminating =. That's + * allowed. */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAL438YfjrJE2SPqkkXeQwICygu8KNO54Juj6sjqk5hgsiazIWMOBgbaX\n" + "LIRqPNGaiSq01xSqwjwCBCfwZYT/nSdDBqj1h9aoR8rnjxZjyQ+m3rWpdDqeCDMx\n" + "I3NgZ5w4bNX4poRb42lrV6NmQiFdjzpqszVbv5Lpn2CSKu32CwKVAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key UKL6Dnj2KwYsFlkCvOkXVatxvOPB4MaxqwPQQgZMTwI\n" + "id rsa1024 FPIXc6k++JnKCtSKWUxaR6oXEKs\n" + /* Good 9: Another totally normal one.*/ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBANNGIKRd8PFNXkJ2JPV1ohDMFNbJwKbwybeieaQFjtU9KWedHCbr+QD4\n" + "B6zNY5ysguNjHNnlq2f6D09+uhnfDBON8tAz0mPQH/6JqnOXm+EiUn+8bN0E8Nke\n" + "/i3GEgDeaxJJMNQcpsJvmmSmKFOlYy9Fy7ejAjTGqtAnqOte7BnTAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key gUsq3e5iYgsQQvyxINtLzBpHxmIt5rtuFlEbKfI4gFk=\n" + "id rsa1024 jv+LdatDzsMfEW6pLBeL/5uzwCc\n" + /* Bad 2: RSA key has bad exponent of 3. */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGHAoGBAMMTWtvPxYnUNJ5Y7B+XENcpxzPoGstrdiUszCBS+/42xvluLJ+JDSdR\n" + "qJaMD6ax8vKAeLS5C6O17MNdG2VldlPRbtgl41MXsOoUqEJ+nY9e3WG9Snjp47xC\n" + "zmWIfeduXSavIsb3a43/MLIz/9qO0TkgAAiuQr79JlwKhLdzCqTLAgED\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key NkRB4wTUFogiVp5jYmjGORe2ffb/y5Kk8Itw8jdzMjA=\n" + "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n" + "id rsa1024 fKvYjP7TAjCC1FzYee5bYAwYkoDg\n" + /* Bad 3: Bogus annotation */ + "@last-listed with strange aeons\n" + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBALcRBFNCZtpd2TFJysU77/fJMFzKisRQEBOtDGtTZ2Bg4aEGosssa0Id\n" + "YtUagRLYle08QVGvGB+EHBI5qf6Ah2yPH7k5QiN2a3Sq+nyh85dXKPazBGBBbM+C\n" + "DOfDauV02CAnADNMLJEf1voY3oBVvYyIsmHxn5i1R19ZYIiR8NX5AgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "ntor-onion-key m4xcFXMWMjCvZDXq8FT3XmS0EHYseGOeu+fV+6FYDlk=\n" + "p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464,531,543-544\n" + "id rsa1024 SSbfNE9vmaiwRKH+eqNAkiKQhds\n" + /* Good 10: Normal, with added ipv6 address and added other address */ + "onion-key\n" + "-----BEGIN RSA PUBLIC KEY-----\n" + "MIGJAoGBAM7uUtq5F6h63QNYIvC+4NcWaD0DjtnrOORZMkdpJhinXUOwce3cD5Dj\n" + "sgdN1wJpWpTQMXJ2DssfSgmOVXETP7qJuZyRprxalQhaEATMDNJA/66Ml1jSO9mZ\n" + "+8Xb7m/4q778lNtkSbsvMaYD2Dq6k2QQ3kMhr9z8oUtX0XA23+pfAgMBAAE=\n" + "-----END RSA PUBLIC KEY-----\n" + "a [::1:2:3:4]:9090\n" + "a 18.0.0.1:9999\n" + "ntor-onion-key k2yFqTU2vzMCQDEiE/j9UcEHxKrXMLpB3IL0or09sik=\n" + "id rsa1024 2A8wYpHxnkKJ92orocvIQBzeHlE\n" + "p6 allow 80\n" + ; +#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS +ENABLE_GCC_WARNING(overlength-strings) +#endif + +/** More tests for parsing different kinds of microdescriptors, and getting + * invalid digests trackd from them. */ +static void +test_md_parse(void *arg) +{ + (void) arg; + char *mem_op_hex_tmp = NULL; + smartlist_t *invalid = smartlist_new(); + + smartlist_t *mds = microdescs_parse_from_string(MD_PARSE_TEST_DATA, + NULL, 1, SAVED_NOWHERE, + invalid); + tt_int_op(smartlist_len(mds), OP_EQ, 11); + tt_int_op(smartlist_len(invalid), OP_EQ, 4); + + test_memeq_hex(smartlist_get(invalid,0), + "5d76bf1c6614e885614a1e0ad074e1ab" + "4ea14655ebeefb1736a71b5ed8a15a51"); + test_memeq_hex(smartlist_get(invalid,1), + "2fde0ee3343669c2444cd9d53cbd39c6" + "a7d1fc0513513e840ca7f6e68864b36c"); + test_memeq_hex(smartlist_get(invalid,2), + "20d1576c5ab11bbcff0dedb1db4a3cfc" + "c8bc8dd839d8cbfef92d00a1a7d7b294"); + test_memeq_hex(smartlist_get(invalid,3), + "074770f394c73dbde7b44412e9692add" + "691a478d4727f9804b77646c95420a96"); + + /* Spot-check the valid ones. */ + const microdesc_t *md = smartlist_get(mds, 5); + test_memeq_hex(md->digest, + "54bb6d733ddeb375d2456c79ae103961" + "da0cae29620375ac4cf13d54da4d92b3"); + tt_int_op(md->last_listed, OP_EQ, 0); + tt_int_op(md->saved_location, OP_EQ, SAVED_NOWHERE); + tt_int_op(md->no_save, OP_EQ, 0); + tt_uint_op(md->held_in_map, OP_EQ, 0); + tt_uint_op(md->held_by_nodes, OP_EQ, 0); + tt_assert(md->onion_curve25519_pkey); + + md = smartlist_get(mds, 6); + test_memeq_hex(md->digest, + "53f740bd222ab37f19f604b1d3759aa6" + "5eff1fbce9ac254bd0fa50d4af9b1bae"); + tt_assert(! md->exit_policy); + + md = smartlist_get(mds, 8); + test_memeq_hex(md->digest, + "a0a155562d8093d8fd0feb7b93b7226e" + "17f056c2142aab7a4ea8c5867a0376d5"); + tt_assert(md->onion_curve25519_pkey); + + md = smartlist_get(mds, 10); + test_memeq_hex(md->digest, + "409ebd87d23925a2732bd467a92813c9" + "21ca378fcb9ca193d354c51550b6d5e9"); + tt_assert(tor_addr_family(&md->ipv6_addr) == AF_INET6); + tt_int_op(md->ipv6_orport, OP_EQ, 9090); + + done: + SMARTLIST_FOREACH(mds, microdesc_t *, mdsc, microdesc_free(mdsc)); + smartlist_free(mds); + SMARTLIST_FOREACH(invalid, char *, cp, tor_free(cp)); + smartlist_free(invalid); + tor_free(mem_op_hex_tmp); +} + +static int mock_rgsbd_called = 0; +static routerstatus_t *mock_rgsbd_val_a = NULL; +static routerstatus_t *mock_rgsbd_val_b = NULL; +static routerstatus_t * +mock_router_get_status_by_digest(networkstatus_t *c, const char *d) +{ + (void) c; + ++mock_rgsbd_called; + + if (fast_memeq(d, "\x5d\x76", 2)) { + memcpy(mock_rgsbd_val_a->descriptor_digest, d, 32); + return mock_rgsbd_val_a; + } else if (fast_memeq(d, "\x20\xd1", 2)) { + memcpy(mock_rgsbd_val_b->descriptor_digest, d, 32); + return mock_rgsbd_val_b; + } else { + return NULL; + } +} + +static networkstatus_t *mock_ns_val = NULL; +static networkstatus_t * +mock_ns_get_by_flavor(consensus_flavor_t f) +{ + (void)f; + return mock_ns_val; +} + +static void +test_md_reject_cache(void *arg) +{ + (void) arg; + microdesc_cache_t *mc = NULL ; + smartlist_t *added = NULL, *wanted = smartlist_new(); + or_options_t *options = get_options_mutable(); + char buf[DIGEST256_LEN]; + + tor_free(options->CacheDirectory); + options->CacheDirectory = tor_strdup(get_fname("md_datadir_test_rej")); + mock_rgsbd_val_a = tor_malloc_zero(sizeof(routerstatus_t)); + mock_rgsbd_val_b = tor_malloc_zero(sizeof(routerstatus_t)); + mock_ns_val = tor_malloc_zero(sizeof(networkstatus_t)); + + mock_ns_val->valid_after = time(NULL) - 86400; + mock_ns_val->valid_until = time(NULL) + 86400; + mock_ns_val->flavor = FLAV_MICRODESC; + +#ifdef _WIN32 + tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory)); +#else + tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory, 0700)); +#endif + + MOCK(router_get_mutable_consensus_status_by_descriptor_digest, + mock_router_get_status_by_digest); + MOCK(networkstatus_get_latest_consensus_by_flavor, mock_ns_get_by_flavor); + + mc = get_microdesc_cache(); +#define ADD(hex) \ + do { \ + tt_int_op(sizeof(buf),OP_EQ,base16_decode(buf,sizeof(buf), \ + hex,strlen(hex)));\ + smartlist_add(wanted, tor_memdup(buf, DIGEST256_LEN)); \ + } while (0) + + /* invalid,0 */ + ADD("5d76bf1c6614e885614a1e0ad074e1ab4ea14655ebeefb1736a71b5ed8a15a51"); + /* invalid,2 */ + ADD("20d1576c5ab11bbcff0dedb1db4a3cfcc8bc8dd839d8cbfef92d00a1a7d7b294"); + /* valid, 6 */ + ADD("53f740bd222ab37f19f604b1d3759aa65eff1fbce9ac254bd0fa50d4af9b1bae"); + /* valid, 8 */ + ADD("a0a155562d8093d8fd0feb7b93b7226e17f056c2142aab7a4ea8c5867a0376d5"); + + added = microdescs_add_to_cache(mc, MD_PARSE_TEST_DATA, NULL, + SAVED_NOWHERE, 0, time(NULL), wanted); + + tt_int_op(smartlist_len(added), OP_EQ, 2); + tt_int_op(mock_rgsbd_called, OP_EQ, 2); + tt_int_op(mock_rgsbd_val_a->dl_status.n_download_failures, OP_EQ, 255); + tt_int_op(mock_rgsbd_val_b->dl_status.n_download_failures, OP_EQ, 255); + + done: + UNMOCK(networkstatus_get_latest_consensus_by_flavor); + UNMOCK(router_get_mutable_consensus_status_by_descriptor_digest); + tor_free(options->CacheDirectory); + microdesc_free_all(); + smartlist_free(added); + SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); + smartlist_free(wanted); + tor_free(mock_rgsbd_val_a); + tor_free(mock_rgsbd_val_b); + tor_free(mock_ns_val); +} + +static void +test_md_corrupt_desc(void *arg) +{ + char *cp = NULL; + smartlist_t *sl = NULL; + (void) arg; + + sl = microdescs_add_to_cache(get_microdesc_cache(), + "@last-listed 2015-06-22 10:00:00\n" + "onion-k\n", + NULL, SAVED_IN_JOURNAL, 0, time(NULL), NULL); + tt_int_op(smartlist_len(sl), OP_EQ, 0); + smartlist_free(sl); + + sl = microdescs_add_to_cache(get_microdesc_cache(), + "@last-listed 2015-06-22 10:00:00\n" + "wiggly\n", + NULL, SAVED_IN_JOURNAL, 0, time(NULL), NULL); + tt_int_op(smartlist_len(sl), OP_EQ, 0); + smartlist_free(sl); + + tor_asprintf(&cp, "%s\n%s", test_md1, "@foobar\nonion-wobble\n"); + + sl = microdescs_add_to_cache(get_microdesc_cache(), + cp, cp+strlen(cp), + SAVED_IN_JOURNAL, 0, time(NULL), NULL); + tt_int_op(smartlist_len(sl), OP_EQ, 0); + + done: + tor_free(cp); + smartlist_free(sl); +} + +struct testcase_t microdesc_tests[] = { + { "cache", test_md_cache, TT_FORK, NULL, NULL }, + { "broken_cache", test_md_cache_broken, TT_FORK, NULL, NULL }, + { "generate", test_md_generate, 0, NULL, NULL }, + { "parse", test_md_parse, 0, NULL, NULL }, + { "reject_cache", test_md_reject_cache, TT_FORK, NULL, NULL }, + { "corrupt_desc", test_md_corrupt_desc, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_nodelist.c b/src/wraith/src/test/test_nodelist.c new file mode 100644 index 000000000..a873003d7 --- /dev/null +++ b/src/wraith/src/test/test_nodelist.c @@ -0,0 +1,216 @@ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_nodelist.c + * \brief Unit tests for nodelist related functions. + **/ + +#include "or.h" +#include "networkstatus.h" +#include "nodelist.h" +#include "torcert.h" +#include "test.h" + +/** Test the case when node_get_by_id() returns NULL, + * node_get_verbose_nickname_by_id should return the base 16 encoding + * of the id. + */ +static void +test_nodelist_node_get_verbose_nickname_by_id_null_node(void *arg) +{ + char vname[MAX_VERBOSE_NICKNAME_LEN+1]; + const char ID[] = "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" + "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"; + (void) arg; + + /* make sure node_get_by_id returns NULL */ + tt_assert(!node_get_by_id(ID)); + node_get_verbose_nickname_by_id(ID, vname); + tt_str_op(vname,OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); + done: + return; +} + +/** For routers without named flag, get_verbose_nickname should return + * "Fingerprint~Nickname" + */ +static void +test_nodelist_node_get_verbose_nickname_not_named(void *arg) +{ + node_t mock_node; + routerstatus_t mock_rs; + + char vname[MAX_VERBOSE_NICKNAME_LEN+1]; + + (void) arg; + + memset(&mock_node, 0, sizeof(node_t)); + memset(&mock_rs, 0, sizeof(routerstatus_t)); + + /* verbose nickname should use ~ instead of = for unnamed routers */ + strlcpy(mock_rs.nickname, "TestOR", sizeof(mock_rs.nickname)); + mock_node.rs = &mock_rs; + memcpy(mock_node.identity, + "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" + "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA", + DIGEST_LEN); + node_get_verbose_nickname(&mock_node, vname); + tt_str_op(vname,OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR"); + + done: + return; +} + +/** A node should be considered a directory server if it has an open dirport + * of it accepts tunnelled directory requests. + */ +static void +test_nodelist_node_is_dir(void *arg) +{ + (void)arg; + + routerstatus_t rs; + routerinfo_t ri; + node_t node; + memset(&node, 0, sizeof(node_t)); + memset(&rs, 0, sizeof(routerstatus_t)); + memset(&ri, 0, sizeof(routerinfo_t)); + + tt_assert(!node_is_dir(&node)); + + node.rs = &rs; + tt_assert(!node_is_dir(&node)); + + rs.is_v2_dir = 1; + tt_assert(node_is_dir(&node)); + + rs.is_v2_dir = 0; + rs.dir_port = 1; + tt_assert(! node_is_dir(&node)); + + node.rs = NULL; + tt_assert(!node_is_dir(&node)); + node.ri = &ri; + ri.supports_tunnelled_dir_requests = 1; + tt_assert(node_is_dir(&node)); + ri.supports_tunnelled_dir_requests = 0; + ri.dir_port = 1; + tt_assert(! node_is_dir(&node)); + + done: + return; +} + +static networkstatus_t *dummy_ns = NULL; +static networkstatus_t * +mock_networkstatus_get_latest_consensus(void) +{ + return dummy_ns; +} +static networkstatus_t * +mock_networkstatus_get_latest_consensus_by_flavor(consensus_flavor_t f) +{ + tor_assert(f == FLAV_MICRODESC); + return dummy_ns; +} + +static void +test_nodelist_ed_id(void *arg) +{ + routerstatus_t *rs[4]; + microdesc_t *md[4]; + routerinfo_t *ri[4]; + networkstatus_t *ns; + int i; + (void)arg; + + ns = tor_malloc_zero(sizeof(networkstatus_t)); + ns->flavor = FLAV_MICRODESC; + ns->routerstatus_list = smartlist_new(); + dummy_ns = ns; + MOCK(networkstatus_get_latest_consensus, + mock_networkstatus_get_latest_consensus); + MOCK(networkstatus_get_latest_consensus_by_flavor, + mock_networkstatus_get_latest_consensus_by_flavor); + + /* Make a bunch of dummy objects that we can play around with. Only set the + necessary fields */ + + for (i = 0; i < 4; ++i) { + rs[i] = tor_malloc_zero(sizeof(*rs[i])); + md[i] = tor_malloc_zero(sizeof(*md[i])); + ri[i] = tor_malloc_zero(sizeof(*ri[i])); + + crypto_rand(md[i]->digest, sizeof(md[i]->digest)); + md[i]->ed25519_identity_pkey = tor_malloc(sizeof(ed25519_public_key_t)); + crypto_rand((char*)md[i]->ed25519_identity_pkey, + sizeof(ed25519_public_key_t)); + crypto_rand(rs[i]->identity_digest, sizeof(rs[i]->identity_digest)); + memcpy(ri[i]->cache_info.identity_digest, rs[i]->identity_digest, + DIGEST_LEN); + memcpy(rs[i]->descriptor_digest, md[i]->digest, DIGEST256_LEN); + ri[i]->cache_info.signing_key_cert = tor_malloc_zero(sizeof(tor_cert_t)); + memcpy(&ri[i]->cache_info.signing_key_cert->signing_key, + md[i]->ed25519_identity_pkey, sizeof(ed25519_public_key_t)); + + if (i != 3) + smartlist_add(ns->routerstatus_list, rs[i]); + } + + tt_int_op(0, OP_EQ, smartlist_len(nodelist_get_list())); + + nodelist_set_consensus(ns); + + tt_int_op(3, OP_EQ, smartlist_len(nodelist_get_list())); + + /* No Ed25519 info yet, so nothing has an ED id. */ + tt_ptr_op(NULL, OP_EQ, node_get_by_ed25519_id(md[0]->ed25519_identity_pkey)); + + /* Register the first one by md, then look it up. */ + node_t *n = nodelist_add_microdesc(md[0]); + tt_ptr_op(n, OP_EQ, node_get_by_ed25519_id(md[0]->ed25519_identity_pkey)); + + /* Register the second by ri, then look it up. */ + routerinfo_t *ri_old = NULL; + n = nodelist_set_routerinfo(ri[1], &ri_old); + tt_ptr_op(n, OP_EQ, node_get_by_ed25519_id(md[1]->ed25519_identity_pkey)); + tt_ptr_op(ri_old, OP_EQ, NULL); + + /* Register it by md too. */ + node_t *n2 = nodelist_add_microdesc(md[1]); + tt_ptr_op(n2, OP_EQ, n); + tt_ptr_op(n, OP_EQ, node_get_by_ed25519_id(md[1]->ed25519_identity_pkey)); + + /* Register the 4th by ri only -- we never put it into the networkstatus, + * so it has to be independent */ + n = nodelist_set_routerinfo(ri[3], &ri_old); + tt_ptr_op(n, OP_EQ, node_get_by_ed25519_id(md[3]->ed25519_identity_pkey)); + tt_ptr_op(ri_old, OP_EQ, NULL); + tt_int_op(4, OP_EQ, smartlist_len(nodelist_get_list())); + + done: + for (i = 0; i < 4; ++i) { + tor_free(rs[i]); + tor_free(md[i]->ed25519_identity_pkey); + tor_free(md[i]); + tor_free(ri[i]->cache_info.signing_key_cert); + tor_free(ri[i]); + } + smartlist_clear(ns->routerstatus_list); + networkstatus_vote_free(ns); + UNMOCK(networkstatus_get_latest_consensus); + UNMOCK(networkstatus_get_latest_consensus_by_flavor); +} + +#define NODE(name, flags) \ + { #name, test_nodelist_##name, (flags), NULL, NULL } + +struct testcase_t nodelist_tests[] = { + NODE(node_get_verbose_nickname_by_id_null_node, TT_FORK), + NODE(node_get_verbose_nickname_not_named, TT_FORK), + NODE(node_is_dir, TT_FORK), + NODE(ed_id, TT_FORK), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_ntor.sh b/src/wraith/src/test/test_ntor.sh new file mode 100644 index 000000000..5081dabc5 --- /dev/null +++ b/src/wraith/src/test/test_ntor.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# Validate Tor's ntor implementation. + +exitcode=0 + +"${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/ntor_ref.py" test-tor || exitcode=1 +"${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/ntor_ref.py" self-test || exitcode=1 + +exit ${exitcode} diff --git a/src/wraith/src/test/test_ntor_cl.c b/src/wraith/src/test/test_ntor_cl.c new file mode 100644 index 000000000..d0eea85d6 --- /dev/null +++ b/src/wraith/src/test/test_ntor_cl.c @@ -0,0 +1,170 @@ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include +#include + +#define ONION_NTOR_PRIVATE +#include "or.h" +#include "util.h" +#include "compat.h" +#include "crypto.h" +#include "crypto_curve25519.h" +#include "onion_ntor.h" + +#define N_ARGS(n) STMT_BEGIN { \ + if (argc < (n)) { \ + fprintf(stderr, "%s needs %d arguments.\n",argv[1],n); \ + return 1; \ + } \ + } STMT_END +#define BASE16(idx, var, n) STMT_BEGIN { \ + const char *s = argv[(idx)]; \ + if (base16_decode((char*)var, n, s, strlen(s)) < (int)n ) { \ + fprintf(stderr, "couldn't decode argument %d (%s)\n",idx,s); \ + return 1; \ + } \ + } STMT_END +#define INT(idx, var) STMT_BEGIN { \ + var = atoi(argv[(idx)]); \ + if (var <= 0) { \ + fprintf(stderr, "bad integer argument %d (%s)\n",idx,argv[(idx)]); \ + } \ + } STMT_END + +static int +client1(int argc, char **argv) +{ + /* client1 nodeID B -> msg state */ + curve25519_public_key_t B; + uint8_t node_id[DIGEST_LEN]; + ntor_handshake_state_t *state = NULL; + uint8_t msg[NTOR_ONIONSKIN_LEN]; + + char buf[1024]; + + N_ARGS(4); + BASE16(2, node_id, DIGEST_LEN); + BASE16(3, B.public_key, CURVE25519_PUBKEY_LEN); + + if (onion_skin_ntor_create(node_id, &B, &state, msg)<0) { + fprintf(stderr, "handshake failed"); + return 2; + } + + base16_encode(buf, sizeof(buf), (const char*)msg, sizeof(msg)); + printf("%s\n", buf); + base16_encode(buf, sizeof(buf), (void*)state, sizeof(*state)); + printf("%s\n", buf); + + ntor_handshake_state_free(state); + return 0; +} + +static int +server1(int argc, char **argv) +{ + uint8_t msg_in[NTOR_ONIONSKIN_LEN]; + curve25519_keypair_t kp; + di_digest256_map_t *keymap=NULL; + uint8_t node_id[DIGEST_LEN]; + int keybytes; + + uint8_t msg_out[NTOR_REPLY_LEN]; + uint8_t *keys = NULL; + char *hexkeys = NULL; + int result = 0; + + char buf[256]; + + /* server1: b nodeID msg N -> msg keys */ + N_ARGS(6); + BASE16(2, kp.seckey.secret_key, CURVE25519_SECKEY_LEN); + BASE16(3, node_id, DIGEST_LEN); + BASE16(4, msg_in, NTOR_ONIONSKIN_LEN); + INT(5, keybytes); + + curve25519_public_key_generate(&kp.pubkey, &kp.seckey); + dimap_add_entry(&keymap, kp.pubkey.public_key, &kp); + + keys = tor_malloc(keybytes); + hexkeys = tor_malloc(keybytes*2+1); + if (onion_skin_ntor_server_handshake( + msg_in, keymap, NULL, node_id, msg_out, keys, + (size_t)keybytes)<0) { + fprintf(stderr, "handshake failed"); + result = 2; + goto done; + } + + base16_encode(buf, sizeof(buf), (const char*)msg_out, sizeof(msg_out)); + printf("%s\n", buf); + base16_encode(hexkeys, keybytes*2+1, (const char*)keys, keybytes); + printf("%s\n", hexkeys); + + done: + tor_free(keys); + tor_free(hexkeys); + dimap_free(keymap, NULL); + return result; +} + +static int +client2(int argc, char **argv) +{ + struct ntor_handshake_state_t state; + uint8_t msg[NTOR_REPLY_LEN]; + int keybytes; + uint8_t *keys; + char *hexkeys; + int result = 0; + + N_ARGS(5); + BASE16(2, (&state), sizeof(state)); + BASE16(3, msg, sizeof(msg)); + INT(4, keybytes); + + keys = tor_malloc(keybytes); + hexkeys = tor_malloc(keybytes*2+1); + if (onion_skin_ntor_client_handshake(&state, msg, keys, keybytes, NULL)<0) { + fprintf(stderr, "handshake failed"); + result = 2; + goto done; + } + + base16_encode(hexkeys, keybytes*2+1, (const char*)keys, keybytes); + printf("%s\n", hexkeys); + + done: + tor_free(keys); + tor_free(hexkeys); + return result; +} + +int +main(int argc, char **argv) +{ + /* + client1: nodeID B -> msg state + server1: b nodeID msg N -> msg keys + client2: state msg N -> keys + */ + if (argc < 2) { + fprintf(stderr, "I need arguments. Read source for more info.\n"); + return 1; + } + + curve25519_init(); + if (!strcmp(argv[1], "client1")) { + return client1(argc, argv); + } else if (!strcmp(argv[1], "server1")) { + return server1(argc, argv); + } else if (!strcmp(argv[1], "client2")) { + return client2(argc, argv); + } else { + fprintf(stderr, "What's a %s?\n", argv[1]); + return 1; + } +} + diff --git a/src/wraith/src/test/test_oom.c b/src/wraith/src/test/test_oom.c new file mode 100644 index 000000000..c172fe60c --- /dev/null +++ b/src/wraith/src/test/test_oom.c @@ -0,0 +1,356 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/* Unit tests for OOM handling logic */ + +#define RELAY_PRIVATE +#define BUFFERS_PRIVATE +#define CIRCUITLIST_PRIVATE +#define CONNECTION_PRIVATE +#include "or.h" +#include "buffers.h" +#include "circuitlist.h" +#include "compat_libevent.h" +#include "connection.h" +#include "config.h" +#include "relay.h" +#include "test.h" +#include "test_helpers.h" + +/* small replacement mock for circuit_mark_for_close_ to avoid doing all + * the other bookkeeping that comes with marking circuits. */ +static void +circuit_mark_for_close_dummy_(circuit_t *circ, int reason, int line, + const char *file) +{ + (void) reason; + if (circ->marked_for_close) { + TT_FAIL(("Circuit already marked for close at %s:%d, but we are marking " + "it again at %s:%d", + circ->marked_for_close_file, (int)circ->marked_for_close, + file, line)); + } + + circ->marked_for_close = line; + circ->marked_for_close_file = file; +} + +static circuit_t * +dummy_or_circuit_new(int n_p_cells, int n_n_cells) +{ + or_circuit_t *circ = or_circuit_new(0, NULL); + int i; + cell_t cell; + + for (i=0; i < n_p_cells; ++i) { + crypto_rand((void*)&cell, sizeof(cell)); + cell_queue_append_packed_copy(TO_CIRCUIT(circ), &circ->p_chan_cells, + 0, &cell, 1, 0); + } + + for (i=0; i < n_n_cells; ++i) { + crypto_rand((void*)&cell, sizeof(cell)); + cell_queue_append_packed_copy(TO_CIRCUIT(circ), + &TO_CIRCUIT(circ)->n_chan_cells, + 1, &cell, 1, 0); + } + + TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_OR; + return TO_CIRCUIT(circ); +} + +static void +add_bytes_to_buf(buf_t *buf, size_t n_bytes) +{ + char b[3000]; + + while (n_bytes) { + size_t this_add = n_bytes > sizeof(b) ? sizeof(b) : n_bytes; + crypto_rand(b, this_add); + buf_add(buf, b, this_add); + n_bytes -= this_add; + } +} + +static edge_connection_t * +dummy_edge_conn_new(circuit_t *circ, + int type, size_t in_bytes, size_t out_bytes) +{ + edge_connection_t *conn; + buf_t *inbuf, *outbuf; + + if (type == CONN_TYPE_EXIT) + conn = edge_connection_new(type, AF_INET); + else + conn = ENTRY_TO_EDGE_CONN(entry_connection_new(type, AF_INET)); + + inbuf = TO_CONN(conn)->inbuf; + outbuf = TO_CONN(conn)->outbuf; + + /* We add these bytes directly to the buffers, to avoid all the + * edge connection read/write machinery. */ + add_bytes_to_buf(inbuf, in_bytes); + add_bytes_to_buf(outbuf, out_bytes); + + conn->on_circuit = circ; + if (type == CONN_TYPE_EXIT) { + or_circuit_t *oc = TO_OR_CIRCUIT(circ); + conn->next_stream = oc->n_streams; + oc->n_streams = conn; + } else { + origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); + conn->next_stream = oc->p_streams; + oc->p_streams = conn; + } + + return conn; +} + +/** Run unit tests for buffers.c */ +static void +test_oom_circbuf(void *arg) +{ + or_options_t *options = get_options_mutable(); + circuit_t *c1 = NULL, *c2 = NULL, *c3 = NULL, *c4 = NULL; + uint64_t now_ns = 1389631048 * (uint64_t)1000000000; + const uint64_t start_ns = now_ns; + + (void) arg; + + monotime_enable_test_mocking(); + MOCK(circuit_mark_for_close_, circuit_mark_for_close_dummy_); + + /* Far too low for real life. */ + options->MaxMemInQueues = 256*packed_cell_mem_cost(); + options->CellStatistics = 0; + + tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We don't start out OOM. */ + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, 0); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); + + /* Now we're going to fake up some circuits and get them added to the global + circuit list. */ + monotime_coarse_set_mock_time_nsec(now_ns); + c1 = dummy_origin_circuit_new(30); + + now_ns += 10 * 1000000; + monotime_coarse_set_mock_time_nsec(now_ns); + c2 = dummy_or_circuit_new(20, 20); + + tt_int_op(packed_cell_mem_cost(), OP_EQ, + sizeof(packed_cell_t)); + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, + packed_cell_mem_cost() * 70); + tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We are still not OOM */ + + now_ns += 10 * 1000000; + monotime_coarse_set_mock_time_nsec(now_ns); + c3 = dummy_or_circuit_new(100, 85); + tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We are still not OOM */ + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, + packed_cell_mem_cost() * 255); + + now_ns += 10 * 1000000; + monotime_coarse_set_mock_time_nsec(now_ns); + /* Adding this cell will trigger our OOM handler. */ + c4 = dummy_or_circuit_new(2, 0); + + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, + packed_cell_mem_cost() * 257); + + tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */ + + tt_assert(c1->marked_for_close); + tt_assert(! c2->marked_for_close); + tt_assert(! c3->marked_for_close); + tt_assert(! c4->marked_for_close); + + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, + packed_cell_mem_cost() * (257 - 30)); + + circuit_free(c1); + + monotime_coarse_set_mock_time_nsec(start_ns); /* go back in time */ + c1 = dummy_or_circuit_new(90, 0); + + now_ns += 10 * 1000000; + monotime_coarse_set_mock_time_nsec(now_ns); + + tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */ + + tt_assert(c1->marked_for_close); + tt_assert(! c2->marked_for_close); + tt_assert(! c3->marked_for_close); + tt_assert(! c4->marked_for_close); + + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, + packed_cell_mem_cost() * (257 - 30)); + + done: + circuit_free(c1); + circuit_free(c2); + circuit_free(c3); + circuit_free(c4); + + UNMOCK(circuit_mark_for_close_); + monotime_disable_test_mocking(); +} + +/** Run unit tests for buffers.c */ +static void +test_oom_streambuf(void *arg) +{ + or_options_t *options = get_options_mutable(); + circuit_t *c1 = NULL, *c2 = NULL, *c3 = NULL, *c4 = NULL, *c5 = NULL; + uint32_t tvts; + int i; + smartlist_t *edgeconns = smartlist_new(); + const uint64_t start_ns = 1389641159 * (uint64_t)1000000000; + uint64_t now_ns = start_ns; + + (void) arg; + monotime_enable_test_mocking(); + + MOCK(circuit_mark_for_close_, circuit_mark_for_close_dummy_); + + /* Far too low for real life. */ + options->MaxMemInQueues = 81*packed_cell_mem_cost() + 4096 * 34; + options->CellStatistics = 0; + + tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We don't start out OOM. */ + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, 0); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); + + monotime_coarse_set_mock_time_nsec(start_ns); + + /* Start all circuits with a bit of data queued in cells */ + + /* go halfway into the second. */ + monotime_coarse_set_mock_time_nsec(start_ns + 500 * 1000000); + c1 = dummy_or_circuit_new(10,10); + + monotime_coarse_set_mock_time_nsec(start_ns + 510 * 1000000); + c2 = dummy_origin_circuit_new(20); + monotime_coarse_set_mock_time_nsec(start_ns + 520 * 1000000); + c3 = dummy_or_circuit_new(20,20); + monotime_coarse_set_mock_time_nsec(start_ns + 530 * 1000000); + c4 = dummy_or_circuit_new(0,0); + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, + packed_cell_mem_cost() * 80); + + now_ns = start_ns + 600 * 1000000; + monotime_coarse_set_mock_time_nsec(now_ns); + + /* Add some connections to c1...c4. */ + for (i = 0; i < 4; ++i) { + edge_connection_t *ec; + /* link it to a circuit */ + now_ns += 10 * 1000000; + monotime_coarse_set_mock_time_nsec(now_ns); + ec = dummy_edge_conn_new(c1, CONN_TYPE_EXIT, 1000, 1000); + tt_assert(ec); + smartlist_add(edgeconns, ec); + now_ns += 10 * 1000000; + monotime_coarse_set_mock_time_nsec(now_ns); + ec = dummy_edge_conn_new(c2, CONN_TYPE_AP, 1000, 1000); + tt_assert(ec); + smartlist_add(edgeconns, ec); + now_ns += 10 * 1000000; + monotime_coarse_set_mock_time_nsec(now_ns); + ec = dummy_edge_conn_new(c4, CONN_TYPE_EXIT, 1000, 1000); /* Yes, 4 twice*/ + tt_assert(ec); + smartlist_add(edgeconns, ec); + now_ns += 10 * 1000000; + monotime_coarse_set_mock_time_nsec(now_ns); + ec = dummy_edge_conn_new(c4, CONN_TYPE_EXIT, 1000, 1000); + smartlist_add(edgeconns, ec); + tt_assert(ec); + } + + now_ns -= now_ns % 1000000000; + now_ns += 1000000000; + monotime_coarse_set_mock_time_nsec(now_ns); + tvts = monotime_coarse_get_stamp(); + +#define ts_is_approx(ts, val) do { \ + uint32_t x_ = (uint32_t) monotime_coarse_stamp_units_to_approx_msec(ts); \ + tt_int_op(x_, OP_GE, val - 5); \ + tt_int_op(x_, OP_LE, val + 5); \ + } while (0) + + ts_is_approx(circuit_max_queued_cell_age(c1, tvts), 500); + ts_is_approx(circuit_max_queued_cell_age(c2, tvts), 490); + ts_is_approx(circuit_max_queued_cell_age(c3, tvts), 480); + ts_is_approx(circuit_max_queued_cell_age(c4, tvts), 0); + + ts_is_approx(circuit_max_queued_data_age(c1, tvts), 390); + ts_is_approx(circuit_max_queued_data_age(c2, tvts), 380); + ts_is_approx(circuit_max_queued_data_age(c3, tvts), 0); + ts_is_approx(circuit_max_queued_data_age(c4, tvts), 370); + + ts_is_approx(circuit_max_queued_item_age(c1, tvts), 500); + ts_is_approx(circuit_max_queued_item_age(c2, tvts), 490); + ts_is_approx(circuit_max_queued_item_age(c3, tvts), 480); + ts_is_approx(circuit_max_queued_item_age(c4, tvts), 370); + + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, + packed_cell_mem_cost() * 80); + tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*16*2); + + /* Now give c4 a very old buffer of modest size */ + { + edge_connection_t *ec; + now_ns -= 1000000000; + monotime_coarse_set_mock_time_nsec(now_ns); + ec = dummy_edge_conn_new(c4, CONN_TYPE_EXIT, 1000, 1000); + tt_assert(ec); + smartlist_add(edgeconns, ec); + } + tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*17*2); + ts_is_approx(circuit_max_queued_item_age(c4, tvts), 1000); + + tt_int_op(cell_queues_check_size(), OP_EQ, 0); + + /* And run over the limit. */ + now_ns += 800*1000000; + monotime_coarse_set_mock_time_nsec(now_ns); + c5 = dummy_or_circuit_new(0,5); + + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, + packed_cell_mem_cost() * 85); + tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*17*2); + + tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */ + + /* C4 should have died. */ + tt_assert(! c1->marked_for_close); + tt_assert(! c2->marked_for_close); + tt_assert(! c3->marked_for_close); + tt_assert(c4->marked_for_close); + tt_assert(! c5->marked_for_close); + + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, + packed_cell_mem_cost() * 85); + tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*8*2); + + done: + circuit_free(c1); + circuit_free(c2); + circuit_free(c3); + circuit_free(c4); + circuit_free(c5); + + SMARTLIST_FOREACH(edgeconns, edge_connection_t *, ec, + connection_free_minimal(TO_CONN(ec))); + smartlist_free(edgeconns); + + UNMOCK(circuit_mark_for_close_); + monotime_disable_test_mocking(); +} + +struct testcase_t oom_tests[] = { + { "circbuf", test_oom_circbuf, TT_FORK, NULL, NULL }, + { "streambuf", test_oom_streambuf, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_oos.c b/src/wraith/src/test/test_oos.c new file mode 100644 index 000000000..e72fcf5de --- /dev/null +++ b/src/wraith/src/test/test_oos.c @@ -0,0 +1,456 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/* Unit tests for OOS handler */ + +#define CONNECTION_PRIVATE + +#include "or.h" +#include "config.h" +#include "connection.h" +#include "connection_or.h" +#include "main.h" +#include "test.h" + +static or_options_t mock_options; + +static void +reset_options_mock(void) +{ + memset(&mock_options, 0, sizeof(or_options_t)); +} + +static const or_options_t * +mock_get_options(void) +{ + return &mock_options; +} + +static int moribund_calls = 0; +static int moribund_conns = 0; + +static int +mock_connection_count_moribund(void) +{ + ++moribund_calls; + + return moribund_conns; +} + +/* + * For unit test purposes it's sufficient to tell that + * kill_conn_list_for_oos() was called with an approximately + * sane argument; it's just the thing we returned from the + * mock for pick_oos_victims(). + */ + +static int kill_conn_list_calls = 0; +static int kill_conn_list_killed = 0; + +static void +kill_conn_list_mock(smartlist_t *conns) +{ + ++kill_conn_list_calls; + + tt_ptr_op(conns, OP_NE, NULL); + + kill_conn_list_killed += smartlist_len(conns); + + done: + return; +} + +static int pick_oos_mock_calls = 0; +static int pick_oos_mock_fail = 0; +static int pick_oos_mock_last_n = 0; + +static smartlist_t * +pick_oos_victims_mock(int n) +{ + smartlist_t *l = NULL; + int i; + + ++pick_oos_mock_calls; + + tt_int_op(n, OP_GT, 0); + + if (!pick_oos_mock_fail) { + /* + * connection_check_oos() just passes the list onto + * kill_conn_list_for_oos(); we don't need to simulate + * its content for this mock, just its existence, but + * we do need to check the parameter. + */ + l = smartlist_new(); + for (i = 0; i < n; ++i) smartlist_add(l, NULL); + } else { + l = NULL; + } + + pick_oos_mock_last_n = n; + + done: + return l; +} + +/** Unit test for the logic in connection_check_oos(), which is concerned + * with comparing thresholds and connection counts to decide if an OOS has + * occurred and if so, how many connections to try to kill, and then using + * pick_oos_victims() and kill_conn_list_for_oos() to carry out its grim + * duty. + */ +static void +test_oos_connection_check_oos(void *arg) +{ + (void)arg; + + /* Set up mocks */ + reset_options_mock(); + /* OOS handling is only sensitive to these fields */ + mock_options.ConnLimit = 32; + mock_options.ConnLimit_ = 64; + mock_options.ConnLimit_high_thresh = 60; + mock_options.ConnLimit_low_thresh = 50; + MOCK(get_options, mock_get_options); + moribund_calls = 0; + moribund_conns = 0; + MOCK(connection_count_moribund, mock_connection_count_moribund); + kill_conn_list_calls = 0; + kill_conn_list_killed = 0; + MOCK(kill_conn_list_for_oos, kill_conn_list_mock); + pick_oos_mock_calls = 0; + pick_oos_mock_fail = 0; + MOCK(pick_oos_victims, pick_oos_victims_mock); + + /* No OOS case */ + connection_check_oos(50, 0); + tt_int_op(moribund_calls, OP_EQ, 0); + tt_int_op(pick_oos_mock_calls, OP_EQ, 0); + tt_int_op(kill_conn_list_calls, OP_EQ, 0); + + /* OOS from socket count, nothing moribund */ + connection_check_oos(62, 0); + tt_int_op(moribund_calls, OP_EQ, 1); + tt_int_op(pick_oos_mock_calls, OP_EQ, 1); + /* 12 == 62 - ConnLimit_low_thresh */ + tt_int_op(pick_oos_mock_last_n, OP_EQ, 12); + tt_int_op(kill_conn_list_calls, OP_EQ, 1); + tt_int_op(kill_conn_list_killed, OP_EQ, 12); + + /* OOS from socket count, some are moribund */ + kill_conn_list_killed = 0; + moribund_conns = 5; + connection_check_oos(62, 0); + tt_int_op(moribund_calls, OP_EQ, 2); + tt_int_op(pick_oos_mock_calls, OP_EQ, 2); + /* 7 == 62 - ConnLimit_low_thresh - moribund_conns */ + tt_int_op(pick_oos_mock_last_n, OP_EQ, 7); + tt_int_op(kill_conn_list_calls, OP_EQ, 2); + tt_int_op(kill_conn_list_killed, OP_EQ, 7); + + /* OOS from socket count, but pick fails */ + kill_conn_list_killed = 0; + moribund_conns = 0; + pick_oos_mock_fail = 1; + connection_check_oos(62, 0); + tt_int_op(moribund_calls, OP_EQ, 3); + tt_int_op(pick_oos_mock_calls, OP_EQ, 3); + tt_int_op(kill_conn_list_calls, OP_EQ, 2); + tt_int_op(kill_conn_list_killed, OP_EQ, 0); + pick_oos_mock_fail = 0; + + /* + * OOS from socket count with so many moribund conns + * we have none to kill. + */ + kill_conn_list_killed = 0; + moribund_conns = 15; + connection_check_oos(62, 0); + tt_int_op(moribund_calls, OP_EQ, 4); + tt_int_op(pick_oos_mock_calls, OP_EQ, 3); + tt_int_op(kill_conn_list_calls, OP_EQ, 2); + + /* + * OOS from socket exhaustion; OOS handler will try to + * kill 1/10 (5) of the connections. + */ + kill_conn_list_killed = 0; + moribund_conns = 0; + connection_check_oos(50, 1); + tt_int_op(moribund_calls, OP_EQ, 5); + tt_int_op(pick_oos_mock_calls, OP_EQ, 4); + tt_int_op(kill_conn_list_calls, OP_EQ, 3); + tt_int_op(kill_conn_list_killed, OP_EQ, 5); + + /* OOS from socket exhaustion with moribund conns */ + kill_conn_list_killed = 0; + moribund_conns = 2; + connection_check_oos(50, 1); + tt_int_op(moribund_calls, OP_EQ, 6); + tt_int_op(pick_oos_mock_calls, OP_EQ, 5); + tt_int_op(kill_conn_list_calls, OP_EQ, 4); + tt_int_op(kill_conn_list_killed, OP_EQ, 3); + + /* OOS from socket exhaustion with many moribund conns */ + kill_conn_list_killed = 0; + moribund_conns = 7; + connection_check_oos(50, 1); + tt_int_op(moribund_calls, OP_EQ, 7); + tt_int_op(pick_oos_mock_calls, OP_EQ, 5); + tt_int_op(kill_conn_list_calls, OP_EQ, 4); + + /* OOS with both socket exhaustion and above-threshold */ + kill_conn_list_killed = 0; + moribund_conns = 0; + connection_check_oos(62, 1); + tt_int_op(moribund_calls, OP_EQ, 8); + tt_int_op(pick_oos_mock_calls, OP_EQ, 6); + tt_int_op(kill_conn_list_calls, OP_EQ, 5); + tt_int_op(kill_conn_list_killed, OP_EQ, 12); + + /* + * OOS with both socket exhaustion and above-threshold with some + * moribund conns + */ + kill_conn_list_killed = 0; + moribund_conns = 5; + connection_check_oos(62, 1); + tt_int_op(moribund_calls, OP_EQ, 9); + tt_int_op(pick_oos_mock_calls, OP_EQ, 7); + tt_int_op(kill_conn_list_calls, OP_EQ, 6); + tt_int_op(kill_conn_list_killed, OP_EQ, 7); + + /* + * OOS with both socket exhaustion and above-threshold with many + * moribund conns + */ + kill_conn_list_killed = 0; + moribund_conns = 15; + connection_check_oos(62, 1); + tt_int_op(moribund_calls, OP_EQ, 10); + tt_int_op(pick_oos_mock_calls, OP_EQ, 7); + tt_int_op(kill_conn_list_calls, OP_EQ, 6); + + done: + + UNMOCK(pick_oos_victims); + UNMOCK(kill_conn_list_for_oos); + UNMOCK(connection_count_moribund); + UNMOCK(get_options); + + return; +} + +static int cfe_calls = 0; + +static void +close_for_error_mock(or_connection_t *orconn, int flush) +{ + (void)flush; + + tt_ptr_op(orconn, OP_NE, NULL); + ++cfe_calls; + + done: + return; +} + +static int mark_calls = 0; + +static void +mark_for_close_oos_mock(connection_t *conn, + int line, const char *file) +{ + (void)line; + (void)file; + + tt_ptr_op(conn, OP_NE, NULL); + ++mark_calls; + + done: + return; +} + +static void +test_oos_kill_conn_list(void *arg) +{ + connection_t *c1, *c2; + or_connection_t *or_c1 = NULL; + dir_connection_t *dir_c2 = NULL; + smartlist_t *l = NULL; + (void)arg; + + /* Set up mocks */ + mark_calls = 0; + MOCK(connection_mark_for_close_internal_, mark_for_close_oos_mock); + cfe_calls = 0; + MOCK(connection_or_close_for_error, close_for_error_mock); + + /* Make fake conns */ + or_c1 = tor_malloc_zero(sizeof(*or_c1)); + or_c1->base_.magic = OR_CONNECTION_MAGIC; + or_c1->base_.type = CONN_TYPE_OR; + c1 = TO_CONN(or_c1); + dir_c2 = tor_malloc_zero(sizeof(*dir_c2)); + dir_c2->base_.magic = DIR_CONNECTION_MAGIC; + dir_c2->base_.type = CONN_TYPE_DIR; + dir_c2->base_.state = DIR_CONN_STATE_MIN_; + dir_c2->base_.purpose = DIR_PURPOSE_MIN_; + c2 = TO_CONN(dir_c2); + + tt_ptr_op(c1, OP_NE, NULL); + tt_ptr_op(c2, OP_NE, NULL); + + /* Make list */ + l = smartlist_new(); + smartlist_add(l, c1); + smartlist_add(l, c2); + + /* Run kill_conn_list_for_oos() */ + kill_conn_list_for_oos(l); + + /* Check call counters */ + tt_int_op(mark_calls, OP_EQ, 1); + tt_int_op(cfe_calls, OP_EQ, 1); + + done: + + UNMOCK(connection_or_close_for_error); + UNMOCK(connection_mark_for_close_internal_); + + if (l) smartlist_free(l); + tor_free(or_c1); + tor_free(dir_c2); + + return; +} + +static smartlist_t *conns_for_mock = NULL; + +static smartlist_t * +get_conns_mock(void) +{ + return conns_for_mock; +} + +/* + * For this mock, we pretend all conns have either zero or one circuits, + * depending on if this appears on the list of things to say have a circuit. + */ + +static smartlist_t *conns_with_circs = NULL; + +static int +get_num_circuits_mock(or_connection_t *conn) +{ + int circs = 0; + + tt_ptr_op(conn, OP_NE, NULL); + + if (conns_with_circs && + smartlist_contains(conns_with_circs, TO_CONN(conn))) { + circs = 1; + } + + done: + return circs; +} + +static void +test_oos_pick_oos_victims(void *arg) +{ + (void)arg; + or_connection_t *ortmp; + dir_connection_t *dirtmp; + smartlist_t *picked; + + /* Set up mocks */ + conns_for_mock = smartlist_new(); + MOCK(get_connection_array, get_conns_mock); + conns_with_circs = smartlist_new(); + MOCK(connection_or_get_num_circuits, get_num_circuits_mock); + + /* Make some fake connections */ + ortmp = tor_malloc_zero(sizeof(*ortmp)); + ortmp->base_.magic = OR_CONNECTION_MAGIC; + ortmp->base_.type = CONN_TYPE_OR; + smartlist_add(conns_for_mock, TO_CONN(ortmp)); + /* We'll pretend this one has a circuit too */ + smartlist_add(conns_with_circs, TO_CONN(ortmp)); + /* Next one */ + ortmp = tor_malloc_zero(sizeof(*ortmp)); + ortmp->base_.magic = OR_CONNECTION_MAGIC; + ortmp->base_.type = CONN_TYPE_OR; + smartlist_add(conns_for_mock, TO_CONN(ortmp)); + /* Next one is moribund */ + ortmp = tor_malloc_zero(sizeof(*ortmp)); + ortmp->base_.magic = OR_CONNECTION_MAGIC; + ortmp->base_.type = CONN_TYPE_OR; + ortmp->base_.marked_for_close = 1; + smartlist_add(conns_for_mock, TO_CONN(ortmp)); + /* Last one isn't an orconn */ + dirtmp = tor_malloc_zero(sizeof(*dirtmp)); + dirtmp->base_.magic = DIR_CONNECTION_MAGIC; + dirtmp->base_.type = CONN_TYPE_DIR; + smartlist_add(conns_for_mock, TO_CONN(dirtmp)); + + /* Try picking one */ + picked = pick_oos_victims(1); + /* It should be the one with circuits */ + tt_ptr_op(picked, OP_NE, NULL); + tt_int_op(smartlist_len(picked), OP_EQ, 1); + tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 0))); + smartlist_free(picked); + + /* Try picking none */ + picked = pick_oos_victims(0); + /* We should get an empty list */ + tt_ptr_op(picked, OP_NE, NULL); + tt_int_op(smartlist_len(picked), OP_EQ, 0); + smartlist_free(picked); + + /* Try picking two */ + picked = pick_oos_victims(2); + /* We should get both active orconns */ + tt_ptr_op(picked, OP_NE, NULL); + tt_int_op(smartlist_len(picked), OP_EQ, 2); + tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 0))); + tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 1))); + smartlist_free(picked); + + /* Try picking three - only two are eligible */ + picked = pick_oos_victims(3); + tt_int_op(smartlist_len(picked), OP_EQ, 2); + tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 0))); + tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 1))); + smartlist_free(picked); + + done: + + /* Free leftover stuff */ + if (conns_with_circs) { + smartlist_free(conns_with_circs); + conns_with_circs = NULL; + } + + UNMOCK(connection_or_get_num_circuits); + + if (conns_for_mock) { + SMARTLIST_FOREACH(conns_for_mock, connection_t *, c, tor_free(c)); + smartlist_free(conns_for_mock); + conns_for_mock = NULL; + } + + UNMOCK(get_connection_array); + + return; +} + +struct testcase_t oos_tests[] = { + { "connection_check_oos", test_oos_connection_check_oos, + TT_FORK, NULL, NULL }, + { "kill_conn_list", test_oos_kill_conn_list, TT_FORK, NULL, NULL }, + { "pick_oos_victims", test_oos_pick_oos_victims, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_options.c b/src/wraith/src/test/test_options.c new file mode 100644 index 000000000..62732cabf --- /dev/null +++ b/src/wraith/src/test/test_options.c @@ -0,0 +1,4301 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONFIG_PRIVATE +#include "or.h" +#include "confparse.h" +#include "config.h" +#include "test.h" +#include "geoip.h" + +#define ROUTERSET_PRIVATE +#include "routerset.h" +#include "main.h" +#include "log_test_helpers.h" + +#include "sandbox.h" +#include "memarea.h" +#include "policies.h" +#include "test_helpers.h" + +#define NS_MODULE test_options + +typedef struct { + int severity; + uint32_t domain; + char *msg; +} logmsg_t; + +static smartlist_t *messages = NULL; + +static void +log_cback(int severity, uint32_t domain, const char *msg) +{ + logmsg_t *x = tor_malloc(sizeof(*x)); + x->severity = severity; + x->domain = domain; + x->msg = tor_strdup(msg); + if (!messages) + messages = smartlist_new(); + smartlist_add(messages, x); +} + +static void +setup_log_callback(void) +{ + log_severity_list_t lst; + memset(&lst, 0, sizeof(lst)); + lst.masks[LOG_ERR - LOG_ERR] = ~0; + lst.masks[LOG_WARN - LOG_ERR] = ~0; + lst.masks[LOG_NOTICE - LOG_ERR] = ~0; + add_callback_log(&lst, log_cback); + mark_logs_temp(); +} + +static char * +dump_logs(void) +{ + smartlist_t *msgs; + char *out; + if (! messages) + return tor_strdup(""); + msgs = smartlist_new(); + SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, x) { + smartlist_add_asprintf(msgs, "[%s] %s", + log_level_to_string(x->severity), x->msg); + } SMARTLIST_FOREACH_END(x); + out = smartlist_join_strings(msgs, "", 0, NULL); + SMARTLIST_FOREACH(msgs, char *, cp, tor_free(cp)); + smartlist_free(msgs); + return out; +} + +static void +clear_log_messages(void) +{ + if (!messages) + return; + SMARTLIST_FOREACH(messages, logmsg_t *, m, + { tor_free(m->msg); tor_free(m); }); + smartlist_free(messages); + messages = NULL; +} + +#define setup_options(opt,dflt) \ + do { \ + opt = options_new(); \ + opt->command = CMD_RUN_TOR; \ + options_init(opt); \ + \ + dflt = config_dup(&options_format, opt); \ + clear_log_messages(); \ + } while (0) + +#define VALID_DIR_AUTH "DirAuthority dizum orport=443 v3ident=E8A9C45" \ + "EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212:80 7EA6 EAD6 FD83" \ + " 083C 538F 4403 8BBF A077 587D D755\n" +#define VALID_ALT_BRIDGE_AUTH \ + "AlternateBridgeAuthority dizum orport=443 v3ident=E8A9C45" \ + "EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212:80 7EA6 EAD6 FD83" \ + " 083C 538F 4403 8BBF A077 587D D755\n" +#define VALID_ALT_DIR_AUTH \ + "AlternateDirAuthority dizum orport=443 v3ident=E8A9C45" \ + "EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212:80 7EA6 EAD6 FD83" \ + " 083C 538F 4403 8BBF A077 587D D755\n" + +static int +test_options_checklog(const char *configuration, int expect_log_severity, + const char *expect_log) +{ + int found = 0, ret = -1; + char *actual_log = NULL; + + if (messages) { + SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, m) { + if (m->severity == expect_log_severity && + strstr(m->msg, expect_log)) { + found = 1; + break; + } + } SMARTLIST_FOREACH_END(m); + } + if (!found) { + actual_log = dump_logs(); + TT_DIE(("Expected log message [%s] %s from <%s>, but got <%s>.", + log_level_to_string(expect_log_severity), expect_log, + configuration, actual_log)); + } + ret = 0; + + done: + tor_free(actual_log); + return ret; +} + +static int +test_options_checkmsgs(const char *configuration, + const char *expect_errmsg, + int expect_log_severity, + const char *expect_log, + char *msg) +{ + if (expect_errmsg && !msg) { + TT_DIE(("Expected error message <%s> from <%s>, but got none.", + expect_errmsg, configuration)); + } else if (expect_errmsg && !strstr(msg, expect_errmsg)) { + TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.", + expect_errmsg, configuration, msg)); + } else if (!expect_errmsg && msg) { + TT_DIE(("Expected no error message from <%s> but got <%s>.", + configuration, msg)); + } + if (expect_log) { + return test_options_checklog(configuration, expect_log_severity, + expect_log); + } + return 0; + + done: + return -1; +} + +/* Which phases of config parsing/validation to check for messages/logs */ +enum { PH_GETLINES, PH_ASSIGN, PH_VALIDATE }; + +static void +test_options_validate_impl(const char *configuration, + const char *expect_errmsg, + int expect_log_severity, + const char *expect_log, + int phase) +{ + or_options_t *opt=NULL; + or_options_t *dflt; + config_line_t *cl=NULL; + char *msg=NULL; + int r; + + setup_options(opt, dflt); + + r = config_get_lines(configuration, &cl, 1); + if (phase == PH_GETLINES) { + if (test_options_checkmsgs(configuration, expect_errmsg, + expect_log_severity, + expect_log, msg)) + goto done; + } + if (r) + goto done; + + r = config_assign(&options_format, opt, cl, 0, &msg); + if (phase == PH_ASSIGN) { + if (test_options_checkmsgs(configuration, expect_errmsg, + expect_log_severity, + expect_log, msg)) + goto done; + } + tt_int_op((r == 0), OP_EQ, (msg == NULL)); + if (r) + goto done; + + r = options_validate(NULL, opt, dflt, 0, &msg); + if (phase == PH_VALIDATE) { + if (test_options_checkmsgs(configuration, expect_errmsg, + expect_log_severity, + expect_log, msg)) + goto done; + } + tt_int_op((r == 0), OP_EQ, (msg == NULL)); + + done: + escaped(NULL); + policies_free_all(); + config_free_lines(cl); + or_options_free(opt); + or_options_free(dflt); + tor_free(msg); + clear_log_messages(); +} + +#define WANT_ERR(config, msg, ph) \ + test_options_validate_impl((config), (msg), 0, NULL, (ph)) +#define WANT_LOG(config, severity, msg, ph) \ + test_options_validate_impl((config), NULL, (severity), (msg), (ph)) +#define WANT_ERR_LOG(config, msg, severity, logmsg, ph) \ + test_options_validate_impl((config), (msg), (severity), (logmsg), (ph)) +#define OK(config, ph) \ + test_options_validate_impl((config), NULL, 0, NULL, (ph)) + +static void +test_options_validate(void *arg) +{ + (void)arg; + setup_log_callback(); + sandbox_disable_getaddrinfo_cache(); + + WANT_ERR("ExtORPort 500000", "Invalid ExtORPort", PH_VALIDATE); + + WANT_ERR_LOG("ServerTransportOptions trebuchet", + "ServerTransportOptions did not parse", + LOG_WARN, "Too few arguments", PH_VALIDATE); + OK("ServerTransportOptions trebuchet sling=snappy", PH_VALIDATE); + OK("ServerTransportOptions trebuchet sling=", PH_VALIDATE); + WANT_ERR_LOG("ServerTransportOptions trebuchet slingsnappy", + "ServerTransportOptions did not parse", + LOG_WARN, "\"slingsnappy\" is not a k=v", PH_VALIDATE); + + WANT_ERR("DirPort 8080\nDirCache 0", + "DirPort configured but DirCache disabled.", PH_VALIDATE); + WANT_ERR("BridgeRelay 1\nDirCache 0", + "We're a bridge but DirCache is disabled.", PH_VALIDATE); + + WANT_ERR_LOG("HeartbeatPeriod 21 snarks", + "Interval 'HeartbeatPeriod 21 snarks' is malformed or" + " out of bounds.", LOG_WARN, "Unknown unit 'snarks'.", + PH_ASSIGN); + WANT_ERR_LOG("LogTimeGranularity 21 snarks", + "Msec interval 'LogTimeGranularity 21 snarks' is malformed or" + " out of bounds.", LOG_WARN, "Unknown unit 'snarks'.", + PH_ASSIGN); + OK("HeartbeatPeriod 1 hour", PH_VALIDATE); + OK("LogTimeGranularity 100 milliseconds", PH_VALIDATE); + + WANT_LOG("ControlSocket \"string with trailing garbage\" bogus", LOG_WARN, + "Error while parsing configuration: " + "Excess data after quoted string", PH_GETLINES); + WANT_LOG("ControlSocket \"bogus escape \\@\"", LOG_WARN, + "Error while parsing configuration: " + "Invalid escape sequence in quoted string", PH_GETLINES); + + close_temp_logs(); + clear_log_messages(); + return; +} + +#define MEGABYTEIFY(mb) (U64_LITERAL(mb) << 20) +static void +test_have_enough_mem_for_dircache(void *arg) +{ + (void)arg; + or_options_t *opt=NULL; + or_options_t *dflt=NULL; + config_line_t *cl=NULL; + char *msg=NULL; + int r; + const char *configuration = "ORPort 8080\nDirCache 1", *expect_errmsg; + + setup_options(opt, dflt); + setup_log_callback(); + (void)dflt; + + r = config_get_lines(configuration, &cl, 1); + tt_int_op(r, OP_EQ, 0); + + r = config_assign(&options_format, opt, cl, 0, &msg); + tt_int_op(r, OP_EQ, 0); + + /* 300 MB RAM available, DirCache enabled */ + r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(300), &msg); + tt_int_op(r, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + + /* 200 MB RAM available, DirCache enabled */ + r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(200), &msg); + tt_int_op(r, OP_EQ, -1); + expect_errmsg = "Being a directory cache (default) with less than "; + if (!strstr(msg, expect_errmsg)) { + TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.", + expect_errmsg, configuration, msg)); + } + tor_free(msg); + + config_free_lines(cl); cl = NULL; + configuration = "ORPort 8080\nDirCache 1\nBridgeRelay 1"; + r = config_get_lines(configuration, &cl, 1); + tt_int_op(r, OP_EQ, 0); + + r = config_assign(&options_format, opt, cl, 0, &msg); + tt_int_op(r, OP_EQ, 0); + + /* 300 MB RAM available, DirCache enabled, Bridge */ + r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(300), &msg); + tt_int_op(r, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + + /* 200 MB RAM available, DirCache enabled, Bridge */ + r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(200), &msg); + tt_int_op(r, OP_EQ, -1); + expect_errmsg = "Running a Bridge with less than "; + if (!strstr(msg, expect_errmsg)) { + TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.", + expect_errmsg, configuration, msg)); + } + tor_free(msg); + + config_free_lines(cl); cl = NULL; + configuration = "ORPort 8080\nDirCache 0"; + r = config_get_lines(configuration, &cl, 1); + tt_int_op(r, OP_EQ, 0); + + r = config_assign(&options_format, opt, cl, 0, &msg); + tt_int_op(r, OP_EQ, 0); + + /* 200 MB RAM available, DirCache disabled */ + r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(200), &msg); + tt_int_op(r, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + + /* 300 MB RAM available, DirCache disabled */ + r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(300), &msg); + tt_int_op(r, OP_EQ, -1); + expect_errmsg = "DirCache is disabled and we are configured as a "; + if (!strstr(msg, expect_errmsg)) { + TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.", + expect_errmsg, configuration, msg)); + } + tor_free(msg); + + clear_log_messages(); + + done: + if (msg) + tor_free(msg); + or_options_free(dflt); + or_options_free(opt); + config_free_lines(cl); + return; +} + +static const char *fixed_get_uname_result = NULL; + +static const char * +fixed_get_uname(void) +{ + return fixed_get_uname_result; +} + +#define TEST_OPTIONS_OLD_VALUES "TestingV3AuthInitialVotingInterval 1800\n" \ + "ClientBootstrapConsensusMaxDownloadTries 7\n" \ + "ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries 4\n" \ + "ClientBootstrapConsensusMaxInProgressTries 3\n" \ + "TestingV3AuthInitialVoteDelay 300\n" \ + "TestingV3AuthInitialDistDelay 300\n" \ + "TestingClientMaxIntervalWithoutRequest 600\n" \ + "TestingDirConnectionMaxStall 600\n" \ + "TestingConsensusMaxDownloadTries 8\n" \ + "TestingDescriptorMaxDownloadTries 8\n" \ + "TestingMicrodescMaxDownloadTries 8\n" \ + "TestingCertMaxDownloadTries 8\n" + +#define TEST_OPTIONS_DEFAULT_VALUES TEST_OPTIONS_OLD_VALUES \ + "MaxClientCircuitsPending 1\n" \ + "RendPostPeriod 1000\n" \ + "KeepAlivePeriod 1\n" \ + "ConnLimit 1\n" \ + "V3AuthVotingInterval 300\n" \ + "V3AuthVoteDelay 20\n" \ + "V3AuthDistDelay 20\n" \ + "V3AuthNIntervalsValid 3\n" \ + "ClientUseIPv4 1\n" \ + "VirtualAddrNetworkIPv4 127.192.0.0/10\n" \ + "VirtualAddrNetworkIPv6 [FE80::]/10\n" \ + "UseEntryGuards 1\n" \ + "Schedulers Vanilla\n" \ + "ClientDNSRejectInternalAddresses 1\n" + +typedef struct { + or_options_t *old_opt; + or_options_t *opt; + or_options_t *def_opt; +} options_test_data_t; + +static void free_options_test_data(options_test_data_t *td); + +static options_test_data_t * +get_options_test_data(const char *conf) +{ + int rv = -1; + char *msg = NULL; + config_line_t *cl=NULL; + options_test_data_t *result = tor_malloc(sizeof(options_test_data_t)); + result->opt = options_new(); + result->old_opt = options_new(); + result->def_opt = options_new(); + + // XXX: Really, all of these options should be set to defaults + // with options_init(), but about a dozen tests break when I do that. + // Being kinda lame and just fixing the immedate breakage for now.. + result->opt->ConnectionPadding = -1; // default must be "auto" + + rv = config_get_lines(conf, &cl, 1); + tt_int_op(rv, OP_EQ, 0); + rv = config_assign(&options_format, result->opt, cl, 0, &msg); + if (msg) { + /* Display the parse error message by comparing it with an empty string */ + tt_str_op(msg, OP_EQ, ""); + } + tt_int_op(rv, OP_EQ, 0); + config_free_lines(cl); + result->opt->LogTimeGranularity = 1; + result->opt->TokenBucketRefillInterval = 1; + rv = config_get_lines(TEST_OPTIONS_OLD_VALUES, &cl, 1); + tt_int_op(rv, OP_EQ, 0); + rv = config_assign(&options_format, result->def_opt, cl, 0, &msg); + if (msg) { + /* Display the parse error message by comparing it with an empty string */ + tt_str_op(msg, OP_EQ, ""); + } + tt_int_op(rv, OP_EQ, 0); + + done: + config_free_lines(cl); + if (rv != 0) { + free_options_test_data(result); + result = NULL; + /* Callers expect a non-NULL result, so just die if we can't provide one. + */ + tor_assert(0); + } + return result; +} + +static void +free_options_test_data(options_test_data_t *td) +{ + if (!td) return; + or_options_free(td->old_opt); + or_options_free(td->opt); + or_options_free(td->def_opt); + tor_free(td); +} + +static void +test_options_validate__uname_for_server(void *ignored) +{ + (void)ignored; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "ORPort 127.0.0.1:5555"); + setup_capture_of_logs(LOG_WARN); + + MOCK(get_uname, fixed_get_uname); + fixed_get_uname_result = "Windows 95"; + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_log_msg("Tor is running as a server, but you" + " are running Windows 95; this probably won't work. See https://www" + ".torproject.org/docs/faq.html#BestOSForRelay for details.\n"); + tor_free(msg); + + fixed_get_uname_result = "Windows 98"; + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_log_msg("Tor is running as a server, but you" + " are running Windows 98; this probably won't work. See https://www" + ".torproject.org/docs/faq.html#BestOSForRelay for details.\n"); + tor_free(msg); + + fixed_get_uname_result = "Windows Me"; + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_log_msg("Tor is running as a server, but you" + " are running Windows Me; this probably won't work. See https://www" + ".torproject.org/docs/faq.html#BestOSForRelay for details.\n"); + tor_free(msg); + + fixed_get_uname_result = "Windows 2000"; + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_no_log_entry(); + tor_free(msg); + + done: + UNMOCK(get_uname); + free_options_test_data(tdata); + tor_free(msg); + teardown_capture_of_logs(); +} + +static void +test_options_validate__outbound_addresses(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "OutboundBindAddress xxyy!!!sdfaf"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Multiple outbound bind addresses configured: " + "xxyy!!!sdfaf"); + + done: + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__data_directory(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "DataDirectory longreallyl" + "ongLONGLONGlongreallylong" + "LONGLONGlongreallylongLON" + "GLONGlongreallylongLONGLO" + "NGlongreallylongLONGLONGl" + "ongreallylongLONGLONGlong" + "reallylongLONGLONGlongrea" + "llylongLONGLONGlongreally" + "longLONGLONGlongreallylon" + "gLONGLONGlongreallylongLO" + "NGLONGlongreallylongLONGL" + "ONGlongreallylongLONGLONG" + "longreallylongLONGLONGlon" + "greallylongLONGLONGlongre" + "allylongLONGLONGlongreall" + "ylongLONGLONGlongreallylo" + "ngLONGLONGlongreallylongL" + "ONGLONGlongreallylongLONG" + "LONG"); // 440 characters + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Invalid DataDirectory"); + + done: + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__nickname(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "Nickname ThisNickNameIsABitTooLong"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Nickname 'ThisNickNameIsABitTooLong', nicknames must be between " + "1 and 19 characters inclusive, and must contain only the " + "characters [a-zA-Z0-9]."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("Nickname AMoreValidNick"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("DataDirectory /tmp/somewhere"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); + + done: + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__contactinfo(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "ORPort 127.0.0.1:5555"); + setup_capture_of_logs(LOG_DEBUG); + tdata->opt->ContactInfo = NULL; + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg( + "Your ContactInfo config option is not" + " set. Please consider setting it, so we can contact you if your" + " server is misconfigured or something else goes wrong.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("ORPort 127.0.0.1:5555\n" + "ContactInfo hella@example.org"); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + expect_no_log_msg( + "Your ContactInfo config option is not" + " set. Please consider setting it, so we can contact you if your" + " server is misconfigured or something else goes wrong.\n"); + tor_free(msg); + + done: + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__logs(void *ignored) +{ + (void)ignored; + int ret; + (void)ret; + char *msg; + int orig_quiet_level = quiet_level; + options_test_data_t *tdata = get_options_test_data(""); + tdata->opt->Logs = NULL; + tdata->opt->RunAsDaemon = 0; + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(tdata->opt->Logs->key, OP_EQ, "Log"); + tt_str_op(tdata->opt->Logs->value, OP_EQ, "notice stdout"); + tor_free(msg); + tt_int_op(ret, OP_EQ, -1); + + free_options_test_data(tdata); + tdata = get_options_test_data(""); + tdata->opt->Logs = NULL; + tdata->opt->RunAsDaemon = 0; + quiet_level = 1; + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(tdata->opt->Logs->key, OP_EQ, "Log"); + tt_str_op(tdata->opt->Logs->value, OP_EQ, "warn stdout"); + tor_free(msg); + tt_int_op(ret, OP_EQ, -1); + + free_options_test_data(tdata); + tdata = get_options_test_data(""); + tdata->opt->Logs = NULL; + tdata->opt->RunAsDaemon = 0; + quiet_level = 2; + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_assert(!tdata->opt->Logs); + tor_free(msg); + tt_int_op(ret, OP_EQ, -1); + + free_options_test_data(tdata); + tdata = get_options_test_data(""); + tdata->opt->Logs = NULL; + tdata->opt->RunAsDaemon = 0; + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 1, &msg); + tt_assert(!tdata->opt->Logs); + tor_free(msg); + tt_int_op(ret, OP_EQ, -1); + + free_options_test_data(tdata); + tdata = get_options_test_data(""); + tdata->opt->Logs = NULL; + tdata->opt->RunAsDaemon = 1; + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_assert(!tdata->opt->Logs); + tor_free(msg); + tt_int_op(ret, OP_EQ, -1); + + free_options_test_data(tdata); + tdata = get_options_test_data(""); + tdata->opt->RunAsDaemon = 0; + config_line_t *cl=NULL; + config_get_lines("Log foo", &cl, 1); + tdata->opt->Logs = cl; + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op((intptr_t)tdata->opt->Logs, OP_EQ, (intptr_t)cl); + tt_int_op(ret, OP_EQ, -1); + + done: + quiet_level = orig_quiet_level; + free_options_test_data(tdata); + tor_free(msg); +} + +/* static config_line_t * */ +/* mock_config_line(const char *key, const char *val) */ +/* { */ +/* config_line_t *config_line = tor_malloc(sizeof(config_line_t)); */ +/* memset(config_line, 0, sizeof(config_line_t)); */ +/* config_line->key = tor_strdup(key); */ +/* config_line->value = tor_strdup(val); */ +/* return config_line; */ +/* } */ + +static void +test_options_validate__authdir(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + setup_capture_of_logs(LOG_INFO); + options_test_data_t *tdata = get_options_test_data( + "AuthoritativeDirectory 1\n" + "Address this.should.not!exist!.example.org"); + + sandbox_disable_getaddrinfo_cache(); + + MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + UNMOCK(tor_addr_lookup); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Failed to resolve/guess local address. See logs for" + " details."); + expect_log_msg("Could not resolve local Address " + "'this.should.not!exist!.example.org'. Failing.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1"); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Authoritative directory servers must set " + "ContactInfo"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n"); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Authoritative directory servers must set ContactInfo"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "TestingTorNetwork 1\n"); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "AuthoritativeDir is set, but none of (Bridge/V3)" + "AuthoritativeDir is set."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "AuthoritativeDir is set, but none of (Bridge/V3)" + "AuthoritativeDir is set."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "RecommendedVersions 1.2, 3.14\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(tdata->opt->RecommendedClientVersions->value, OP_EQ, "1.2, 3.14"); + tt_str_op(tdata->opt->RecommendedServerVersions->value, OP_EQ, "1.2, 3.14"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "RecommendedVersions 1.2, 3.14\n" + "RecommendedClientVersions 25\n" + "RecommendedServerVersions 4.18\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(tdata->opt->RecommendedClientVersions->value, OP_EQ, "25"); + tt_str_op(tdata->opt->RecommendedServerVersions->value, OP_EQ, "4.18"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "VersioningAuthoritativeDirectory 1\n" + "RecommendedVersions 1.2, 3.14\n" + "RecommendedClientVersions 25\n" + "RecommendedServerVersions 4.18\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(msg, OP_EQ, "AuthoritativeDir is set, but none of (Bridge/V3)" + "AuthoritativeDir is set."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "VersioningAuthoritativeDirectory 1\n" + "RecommendedServerVersions 4.18\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(msg, OP_EQ, "Versioning authoritative dir servers must set " + "Recommended*Versions."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "VersioningAuthoritativeDirectory 1\n" + "RecommendedClientVersions 4.18\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(msg, OP_EQ, "Versioning authoritative dir servers must set " + "Recommended*Versions."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "UseEntryGuards 1\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_log_msg("Authoritative directory servers " + "can't set UseEntryGuards. Disabling.\n"); + tt_int_op(tdata->opt->UseEntryGuards, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "V3AuthoritativeDir 1\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_log_msg("Authoritative directories always try" + " to download extra-info documents. Setting DownloadExtraInfo.\n"); + tt_int_op(tdata->opt->DownloadExtraInfo, OP_EQ, 1); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "DownloadExtraInfo 1\n" + "V3AuthoritativeDir 1\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_no_log_msg("Authoritative directories always try" + " to download extra-info documents. Setting DownloadExtraInfo.\n"); + tt_int_op(tdata->opt->DownloadExtraInfo, OP_EQ, 1); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(msg, OP_EQ, "AuthoritativeDir is set, but none of (Bridge/V3)" + "AuthoritativeDir is set."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "BridgeAuthoritativeDir 1\n" + "ContactInfo hello@hello.com\n" + "V3BandwidthsFile non-existant-file\n"); + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(msg, OP_EQ, + "Running as authoritative directory, but no DirPort set."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "BridgeAuthoritativeDir 1\n" + "ContactInfo hello@hello.com\n" + "V3BandwidthsFile non-existant-file\n"); + mock_clean_saved_logs(); + options_validate(NULL, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(msg, OP_EQ, + "Running as authoritative directory, but no DirPort set."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "BridgeAuthoritativeDir 1\n" + "ContactInfo hello@hello.com\n" + "GuardfractionFile non-existant-file\n"); + mock_clean_saved_logs(); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(msg, OP_EQ, + "Running as authoritative directory, but no DirPort set."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "BridgeAuthoritativeDir 1\n" + "ContactInfo hello@hello.com\n" + "GuardfractionFile non-existant-file\n"); + mock_clean_saved_logs(); + options_validate(NULL, tdata->opt, tdata->def_opt, 0, &msg); + tt_str_op(msg, OP_EQ, + "Running as authoritative directory, but no DirPort set."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "BridgeAuthoritativeDir 1\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Running as authoritative directory, but no DirPort set."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("AuthoritativeDirectory 1\n" + "Address 100.200.10.1\n" + "DirPort 999\n" + "BridgeAuthoritativeDir 1\n" + "ContactInfo hello@hello.com\n"); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Running as authoritative directory, but no ORPort set."); + tor_free(msg); + + // TODO: This case can't be reached, since clientonly is used to + // check when parsing port lines as well. + /* free_options_test_data(tdata); */ + /* tdata = get_options_test_data("AuthoritativeDirectory 1\n" */ + /* "Address 100.200.10.1\n" */ + /* "DirPort 999\n" */ + /* "ORPort 888\n" */ + /* "ClientOnly 1\n" */ + /* "BridgeAuthoritativeDir 1\n" */ + /* "ContactInfo hello@hello.com\n" ); */ + /* mock_clean_saved_logs(); */ + /* ret = options_validate(tdata->old_opt, tdata->opt, */ + /* tdata->def_opt, 0, &msg); */ + /* tt_int_op(ret, OP_EQ, -1); */ + /* tt_str_op(msg, OP_EQ, "Running as authoritative directory, " */ + /* "but ClientOnly also set."); */ + + done: + teardown_capture_of_logs(); + // sandbox_free_getaddrinfo_cache(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__relay_with_hidden_services(void *ignored) +{ + (void)ignored; + char *msg; + setup_capture_of_logs(LOG_DEBUG); + options_test_data_t *tdata = get_options_test_data( + "ORPort 127.0.0.1:5555\n" + "HiddenServiceDir " + "/Library/Tor/var/lib/tor/hidden_service/\n" + "HiddenServicePort 80 127.0.0.1:8080\n" + ); + + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_log_msg( + "Tor is currently configured as a relay and a hidden service. " + "That's not very secure: you should probably run your hidden servi" + "ce in a separate Tor process, at least -- see " + "https://trac.torproject.org/8742\n"); + + done: + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +// TODO: it doesn't seem possible to hit the case of having no port lines at +// all, since there will be a default created for SocksPort +/* static void */ +/* test_options_validate__ports(void *ignored) */ +/* { */ +/* (void)ignored; */ +/* int ret; */ +/* char *msg; */ +/* setup_capture_of_logs(LOG_WARN); */ +/* options_test_data_t *tdata = get_options_test_data(""); */ +/* ret = options_validate(tdata->old_opt, tdata->opt, */ +/* tdata->def_opt, 0, &msg); */ +/* expect_log_msg("SocksPort, TransPort, NATDPort, DNSPort, and ORPort " */ +/* "are all undefined, and there aren't any hidden services " */ +/* "configured. " */ +/* " Tor will still run, but probably won't do anything.\n"); */ +/* done: */ +/* teardown_capture_of_logs(); */ +/* free_options_test_data(tdata); */ +/* tor_free(msg); */ +/* } */ + +static void +test_options_validate__transproxy(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata; + +#ifdef USE_TRANSPARENT + // Test default trans proxy + tdata = get_options_test_data("TransProxyType default\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_int_op(tdata->opt->TransProxyType_parsed, OP_EQ, TPT_DEFAULT); + tor_free(msg); + + // Test pf-divert trans proxy + free_options_test_data(tdata); + tdata = get_options_test_data("TransProxyType pf-divert\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + +#if !defined(OpenBSD) && !defined( DARWIN ) + tt_str_op(msg, OP_EQ, + "pf-divert is a OpenBSD-specific and OS X/Darwin-specific feature."); +#else + tt_int_op(tdata->opt->TransProxyType_parsed, OP_EQ, TPT_PF_DIVERT); + tt_str_op(msg, OP_EQ, "Cannot use TransProxyType without " + "any valid TransPort."); +#endif /* !defined(OpenBSD) && !defined( DARWIN ) */ + tor_free(msg); + + // Test tproxy trans proxy + free_options_test_data(tdata); + tdata = get_options_test_data("TransProxyType tproxy\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + +#if !defined(__linux__) + tt_str_op(msg, OP_EQ, "TPROXY is a Linux-specific feature."); +#else + tt_int_op(tdata->opt->TransProxyType_parsed, OP_EQ, TPT_TPROXY); + tt_str_op(msg, OP_EQ, "Cannot use TransProxyType without any valid " + "TransPort."); +#endif /* !defined(__linux__) */ + tor_free(msg); + + // Test ipfw trans proxy + free_options_test_data(tdata); + tdata = get_options_test_data("TransProxyType ipfw\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + +#ifndef KERNEL_MAY_SUPPORT_IPFW + tt_str_op(msg, OP_EQ, "ipfw is a FreeBSD-specific and OS X/Darwin-specific " + "feature."); +#else + tt_int_op(tdata->opt->TransProxyType_parsed, OP_EQ, TPT_IPFW); + tt_str_op(msg, OP_EQ, "Cannot use TransProxyType without any valid " + "TransPort."); +#endif /* !defined(KERNEL_MAY_SUPPORT_IPFW) */ + tor_free(msg); + + // Test unknown trans proxy + free_options_test_data(tdata); + tdata = get_options_test_data("TransProxyType non-existant\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Unrecognized value for TransProxyType"); + tor_free(msg); + + // Test trans proxy success + free_options_test_data(tdata); + tdata = NULL; + +#if defined(__linux__) + tdata = get_options_test_data("TransProxyType tproxy\n" + "TransPort 127.0.0.1:123\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); +#elif defined(KERNEL_MAY_SUPPORT_IPFW) + tdata = get_options_test_data("TransProxyType ipfw\n" + "TransPort 127.0.0.1:123\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); + tor_free(msg); +#elif defined(OpenBSD) + tdata = get_options_test_data("TransProxyType pf-divert\n" + "TransPort 127.0.0.1:123\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); + tor_free(msg); +#elif defined(__NetBSD__) + tdata = get_options_test_data("TransProxyType default\n" + "TransPort 127.0.0.1:123\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); + tor_free(msg); +#endif /* defined(__linux__) || ... */ + + // Assert that a test has run for some TransProxyType + tt_assert(tdata); + +#else /* !(defined(USE_TRANSPARENT)) */ + tdata = get_options_test_data("TransPort 127.0.0.1:555\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "TransPort is disabled in this build."); + tor_free(msg); +#endif /* defined(USE_TRANSPARENT) */ + + done: + free_options_test_data(tdata); + tor_free(msg); +} + +NS_DECL(country_t, geoip_get_country, (const char *country)); + +static country_t +NS(geoip_get_country)(const char *countrycode) +{ + (void)countrycode; + CALLED(geoip_get_country)++; + + return 1; +} + +static void +test_options_validate__exclude_nodes(void *ignored) +{ + (void)ignored; + + NS_MOCK(geoip_get_country); + + int ret; + char *msg; + setup_capture_of_logs(LOG_WARN); + options_test_data_t *tdata = get_options_test_data( + "ExcludeExitNodes {us}\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_int_op(smartlist_len(tdata->opt->ExcludeExitNodesUnion_->list), OP_EQ, 1); + tt_str_op((char *) + (smartlist_get(tdata->opt->ExcludeExitNodesUnion_->list, 0)), + OP_EQ, "{us}"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("ExcludeNodes {cn}\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_int_op(smartlist_len(tdata->opt->ExcludeExitNodesUnion_->list), OP_EQ, 1); + tt_str_op((char *) + (smartlist_get(tdata->opt->ExcludeExitNodesUnion_->list, 0)), + OP_EQ, "{cn}"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("ExcludeNodes {cn}\n" + "ExcludeExitNodes {us} {cn}\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_int_op(smartlist_len(tdata->opt->ExcludeExitNodesUnion_->list), OP_EQ, 2); + tt_str_op((char *) + (smartlist_get(tdata->opt->ExcludeExitNodesUnion_->list, 0)), + OP_EQ, "{us} {cn}"); + tt_str_op((char *) + (smartlist_get(tdata->opt->ExcludeExitNodesUnion_->list, 1)), + OP_EQ, "{cn}"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("ExcludeNodes {cn}\n" + "StrictNodes 1\n"); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg( + "You have asked to exclude certain relays from all positions " + "in your circuits. Expect hidden services and other Tor " + "features to be broken in unpredictable ways.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("ExcludeNodes {cn}\n"); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + expect_no_log_msg( + "You have asked to exclude certain relays from all positions " + "in your circuits. Expect hidden services and other Tor " + "features to be broken in unpredictable ways.\n"); + tor_free(msg); + + done: + NS_UNMOCK(geoip_get_country); + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__node_families(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "NodeFamily flux, flax\n" + "NodeFamily somewhere\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_assert(tdata->opt->NodeFamilySets); + tt_int_op(smartlist_len(tdata->opt->NodeFamilySets), OP_EQ, 2); + tt_str_op((char *)(smartlist_get( + ((routerset_t *)smartlist_get(tdata->opt->NodeFamilySets, 0))->list, 0)), + OP_EQ, "flux"); + tt_str_op((char *)(smartlist_get( + ((routerset_t *)smartlist_get(tdata->opt->NodeFamilySets, 0))->list, 1)), + OP_EQ, "flax"); + tt_str_op((char *)(smartlist_get( + ((routerset_t *)smartlist_get(tdata->opt->NodeFamilySets, 1))->list, 0)), + OP_EQ, "somewhere"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(""); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_assert(!tdata->opt->NodeFamilySets); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("NodeFamily !flux\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_assert(tdata->opt->NodeFamilySets); + tt_int_op(smartlist_len(tdata->opt->NodeFamilySets), OP_EQ, 0); + tor_free(msg); + + done: + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__token_bucket(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data(""); + + tdata->opt->TokenBucketRefillInterval = 0; + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "TokenBucketRefillInterval must be between 1 and 1000 inclusive."); + tor_free(msg); + + tdata->opt->TokenBucketRefillInterval = 1001; + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "TokenBucketRefillInterval must be between 1 and 1000 inclusive."); + tor_free(msg); + + done: + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__recommended_packages(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + setup_capture_of_logs(LOG_WARN); + options_test_data_t *tdata = get_options_test_data( + "RecommendedPackages foo 1.2 http://foo.com sha1=123123123123\n" + "RecommendedPackages invalid-package-line\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + expect_no_log_msg("Invalid RecommendedPackage line " + "invalid-package-line will be ignored\n"); + + done: + escaped(NULL); // This will free the leaking memory from the previous escaped + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__fetch_dir(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "FetchDirInfoExtraEarly 1\n" + "FetchDirInfoEarly 0\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "FetchDirInfoExtraEarly requires that you" + " also set FetchDirInfoEarly"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("FetchDirInfoExtraEarly 1\n" + "FetchDirInfoEarly 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_NE, "FetchDirInfoExtraEarly requires that you" + " also set FetchDirInfoEarly"); + tor_free(msg); + + done: + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__conn_limit(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "ConnLimit 0\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "MaxClientCircuitsPending must be between 1 and 1024, " + "but was set to 0"); + tor_free(msg); + + done: + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__paths_needed(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + setup_capture_of_logs(LOG_WARN); + options_test_data_t *tdata = get_options_test_data( + "PathsNeededToBuildCircuits 0.1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_assert(tdata->opt->PathsNeededToBuildCircuits > 0.24 && + tdata->opt->PathsNeededToBuildCircuits < 0.26); + expect_log_msg("PathsNeededToBuildCircuits is too low. " + "Increasing to 0.25\n"); + tor_free(msg); + + free_options_test_data(tdata); + mock_clean_saved_logs(); + tdata = get_options_test_data("PathsNeededToBuildCircuits 0.99\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_assert(tdata->opt->PathsNeededToBuildCircuits > 0.94 && + tdata->opt->PathsNeededToBuildCircuits < 0.96); + expect_log_msg("PathsNeededToBuildCircuits is " + "too high. Decreasing to 0.95\n"); + tor_free(msg); + + free_options_test_data(tdata); + mock_clean_saved_logs(); + tdata = get_options_test_data("PathsNeededToBuildCircuits 0.91\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_assert(tdata->opt->PathsNeededToBuildCircuits > 0.90 && + tdata->opt->PathsNeededToBuildCircuits < 0.92); + expect_no_log_entry(); + tor_free(msg); + + done: + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__max_client_circuits(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "MaxClientCircuitsPending 0\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "MaxClientCircuitsPending must be between 1 and 1024," + " but was set to 0"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("MaxClientCircuitsPending 1025\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "MaxClientCircuitsPending must be between 1 and 1024," + " but was set to 1025"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "KeepalivePeriod option must be positive."); + tor_free(msg); + + done: + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__ports(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "FirewallPorts 65537\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Port '65537' out of range in FirewallPorts"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("FirewallPorts 1\n" + "LongLivedPorts 124444\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Port '124444' out of range in LongLivedPorts"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("FirewallPorts 1\n" + "LongLivedPorts 2\n" + "RejectPlaintextPorts 112233\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Port '112233' out of range in RejectPlaintextPorts"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("FirewallPorts 1\n" + "LongLivedPorts 2\n" + "RejectPlaintextPorts 3\n" + "WarnPlaintextPorts 65536\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Port '65536' out of range in WarnPlaintextPorts"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("FirewallPorts 1\n" + "LongLivedPorts 2\n" + "RejectPlaintextPorts 3\n" + "WarnPlaintextPorts 4\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "KeepalivePeriod option must be positive."); + tor_free(msg); + + done: + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__reachable_addresses(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + setup_capture_of_logs(LOG_NOTICE); + options_test_data_t *tdata = get_options_test_data( + "FascistFirewall 1\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg("Converting FascistFirewall config " + "option to new format: \"ReachableDirAddresses *:80\"\n"); + tt_str_op(tdata->opt->ReachableDirAddresses->value, OP_EQ, "*:80"); + expect_log_msg("Converting FascistFirewall config " + "option to new format: \"ReachableORAddresses *:443\"\n"); + tt_str_op(tdata->opt->ReachableORAddresses->value, OP_EQ, "*:443"); + tor_free(msg); + + free_options_test_data(tdata); + mock_clean_saved_logs(); + tdata = get_options_test_data("FascistFirewall 1\n" + "ReachableDirAddresses *:81\n" + "ReachableORAddresses *:444\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + tdata->opt->FirewallPorts = smartlist_new(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + expect_log_entry(); + tt_str_op(tdata->opt->ReachableDirAddresses->value, OP_EQ, "*:81"); + tt_str_op(tdata->opt->ReachableORAddresses->value, OP_EQ, "*:444"); + tor_free(msg); + + free_options_test_data(tdata); + mock_clean_saved_logs(); + tdata = get_options_test_data("FascistFirewall 1\n" + "FirewallPort 123\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg("Converting FascistFirewall and " + "FirewallPorts config options to new format: " + "\"ReachableAddresses *:123\"\n"); + tt_str_op(tdata->opt->ReachableAddresses->value, OP_EQ, "*:123"); + tor_free(msg); + + free_options_test_data(tdata); + mock_clean_saved_logs(); + tdata = get_options_test_data("FascistFirewall 1\n" + "ReachableAddresses *:82\n" + "ReachableAddresses *:83\n" + "ReachableAddresses reject *:*\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + expect_log_entry(); + tt_str_op(tdata->opt->ReachableAddresses->value, OP_EQ, "*:82"); + tor_free(msg); + +#define SERVERS_REACHABLE_MSG "Servers must be able to freely connect to" \ + " the rest of the Internet, so they must not set Reachable*Addresses or" \ + " FascistFirewall or FirewallPorts or ClientUseIPv4 0." + + free_options_test_data(tdata); + tdata = get_options_test_data("ReachableAddresses *:82\n" + "ORPort 127.0.0.1:5555\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, SERVERS_REACHABLE_MSG); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("ReachableORAddresses *:82\n" + "ORPort 127.0.0.1:5555\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, SERVERS_REACHABLE_MSG); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("ReachableDirAddresses *:82\n" + "ORPort 127.0.0.1:5555\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, SERVERS_REACHABLE_MSG); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("ClientUseIPv4 0\n" + "ORPort 127.0.0.1:5555\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, SERVERS_REACHABLE_MSG); + tor_free(msg); + + /* Test IPv4-only clients setting IPv6 preferences */ + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ClientUseIPv4 1\n" + "ClientUseIPv6 0\n" + "UseBridges 0\n" + "ClientPreferIPv6ORPort 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ClientUseIPv4 1\n" + "ClientUseIPv6 0\n" + "UseBridges 0\n" + "ClientPreferIPv6DirPort 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + /* Now test an IPv4/IPv6 client setting IPv6 preferences */ + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ClientUseIPv4 1\n" + "ClientUseIPv6 1\n" + "ClientPreferIPv6ORPort 1\n" + "ClientPreferIPv6DirPort 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + + /* Now test an IPv6 client setting IPv6 preferences */ + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ClientUseIPv6 1\n" + "ClientPreferIPv6ORPort 1\n" + "ClientPreferIPv6DirPort 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + + /* And an implicit (IPv4 disabled) IPv6 client setting IPv6 preferences */ + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ClientUseIPv4 0\n" + "ClientPreferIPv6ORPort 1\n" + "ClientPreferIPv6DirPort 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + + /* And an implicit (bridge) client setting IPv6 preferences */ + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "UseBridges 1\n" + "Bridge 127.0.0.1:12345\n" + "ClientPreferIPv6ORPort 1\n" + "ClientPreferIPv6DirPort 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + + done: + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__use_bridges(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "UseBridges 1\n" + "ClientUseIPv4 1\n" + "ORPort 127.0.0.1:5555\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Servers must be able to freely connect to the rest of" + " the Internet, so they must not set UseBridges."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("UseBridges 1\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_NE, "Servers must be able to freely connect to the rest of" + " the Internet, so they must not set UseBridges."); + tor_free(msg); + + NS_MOCK(geoip_get_country); + free_options_test_data(tdata); + tdata = get_options_test_data("UseBridges 1\n" + "EntryNodes {cn}\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "You cannot set both UseBridges and EntryNodes."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "UseBridges 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "If you set UseBridges, you must specify at least one bridge."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "UseBridges 1\n" + "Bridge 10.0.0.1\n" + "UseEntryGuards 0\n" + ); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Setting UseBridges requires also setting UseEntryGuards."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "UseBridges 1\n" + "Bridge 10.0.0.1\n" + "Bridge !!!\n" + ); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Bridge line did not parse. See logs for details."); + tor_free(msg); + + done: + NS_UNMOCK(geoip_get_country); + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__entry_nodes(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + NS_MOCK(geoip_get_country); + options_test_data_t *tdata = get_options_test_data( + "EntryNodes {cn}\n" + "UseEntryGuards 0\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "If EntryNodes is set, UseEntryGuards must be enabled."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("EntryNodes {cn}\n" + "UseEntryGuards 1\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "KeepalivePeriod option must be positive."); + tor_free(msg); + + done: + NS_UNMOCK(geoip_get_country); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__safe_logging(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = get_options_test_data( + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_int_op(tdata->opt->SafeLogging_, OP_EQ, SAFELOG_SCRUB_NONE); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("SafeLogging 0\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_int_op(tdata->opt->SafeLogging_, OP_EQ, SAFELOG_SCRUB_NONE); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("SafeLogging Relay\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_int_op(tdata->opt->SafeLogging_, OP_EQ, SAFELOG_SCRUB_RELAY); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("SafeLogging 1\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_int_op(tdata->opt->SafeLogging_, OP_EQ, SAFELOG_SCRUB_ALL); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("SafeLogging stuffy\n" + "MaxClientCircuitsPending 1\n" + "ConnLimit 1\n"); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Unrecognized value '\"stuffy\"' in SafeLogging"); + tor_free(msg); + + done: + escaped(NULL); // This will free the leaking memory from the previous escaped + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__publish_server_descriptor(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + setup_capture_of_logs(LOG_WARN); + options_test_data_t *tdata = get_options_test_data( + "PublishServerDescriptor bridge\n" TEST_OPTIONS_DEFAULT_VALUES + ); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_assert(!msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("PublishServerDescriptor humma\n" + TEST_OPTIONS_DEFAULT_VALUES); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Unrecognized value in PublishServerDescriptor"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("PublishServerDescriptor bridge, v3\n" + TEST_OPTIONS_DEFAULT_VALUES); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Bridges are not supposed to publish router " + "descriptors to the directory authorities. Please correct your " + "PublishServerDescriptor line."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("BridgeRelay 1\n" + "PublishServerDescriptor v3\n" + TEST_OPTIONS_DEFAULT_VALUES); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Bridges are not supposed to publish router " + "descriptors to the directory authorities. Please correct your " + "PublishServerDescriptor line."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("BridgeRelay 1\n" TEST_OPTIONS_DEFAULT_VALUES); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_NE, "Bridges are not supposed to publish router " + "descriptors to the directory authorities. Please correct your " + "PublishServerDescriptor line."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data("BridgeRelay 1\n" + "DirPort 999\n" TEST_OPTIONS_DEFAULT_VALUES); + + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + expect_log_msg("Can't set a DirPort on a bridge " + "relay; disabling DirPort\n"); + tt_assert(!tdata->opt->DirPort_lines); + tt_assert(!tdata->opt->DirPort_set); + + done: + teardown_capture_of_logs(); + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__testing(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + +#define ENSURE_DEFAULT(varname, varval) \ + STMT_BEGIN \ + free_options_test_data(tdata); \ + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES \ + #varname " " #varval "\n"); \ + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ + tt_str_op(msg, OP_EQ, \ + #varname " may only be changed in testing Tor networks!"); \ + tt_int_op(ret, OP_EQ, -1); \ + tor_free(msg); \ + \ + free_options_test_data(tdata); \ + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES \ + #varname " " #varval "\n" \ + VALID_DIR_AUTH \ + "TestingTorNetwork 1\n"); \ + \ + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ + if (msg) { \ + tt_str_op(msg, OP_NE, \ + #varname " may only be changed in testing Tor networks!"); \ + tor_free(msg); \ + } \ + \ + free_options_test_data(tdata); \ + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES \ + #varname " " #varval "\n" \ + "___UsingTestNetworkDefaults 1\n"); \ + \ + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ + if (msg) { \ + tt_str_op(msg, OP_NE, \ + #varname " may only be changed in testing Tor networks!"); \ + tor_free(msg); \ + } \ + STMT_END + + ENSURE_DEFAULT(TestingV3AuthInitialVotingInterval, 3600); + ENSURE_DEFAULT(TestingV3AuthInitialVoteDelay, 3000); + ENSURE_DEFAULT(TestingV3AuthInitialDistDelay, 3000); + ENSURE_DEFAULT(TestingV3AuthVotingStartOffset, 3000); + ENSURE_DEFAULT(TestingAuthDirTimeToLearnReachability, 3000); + ENSURE_DEFAULT(TestingEstimatedDescriptorPropagationTime, 3000); + ENSURE_DEFAULT(TestingServerDownloadSchedule, 3000); + ENSURE_DEFAULT(TestingClientDownloadSchedule, 3000); + ENSURE_DEFAULT(TestingServerConsensusDownloadSchedule, 3000); + ENSURE_DEFAULT(TestingClientConsensusDownloadSchedule, 3000); + ENSURE_DEFAULT(TestingBridgeDownloadSchedule, 3000); + ENSURE_DEFAULT(TestingBridgeBootstrapDownloadSchedule, 3000); + ENSURE_DEFAULT(TestingClientMaxIntervalWithoutRequest, 3000); + ENSURE_DEFAULT(TestingDirConnectionMaxStall, 3000); + ENSURE_DEFAULT(TestingConsensusMaxDownloadTries, 3000); + ENSURE_DEFAULT(TestingDescriptorMaxDownloadTries, 3000); + ENSURE_DEFAULT(TestingMicrodescMaxDownloadTries, 3000); + ENSURE_DEFAULT(TestingCertMaxDownloadTries, 3000); + ENSURE_DEFAULT(TestingAuthKeyLifetime, 3000); + ENSURE_DEFAULT(TestingLinkCertLifetime, 3000); + ENSURE_DEFAULT(TestingSigningKeySlop, 3000); + ENSURE_DEFAULT(TestingAuthKeySlop, 3000); + ENSURE_DEFAULT(TestingLinkKeySlop, 3000); + + done: + escaped(NULL); // This will free the leaking memory from the previous escaped + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__hidserv(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + setup_capture_of_logs(LOG_WARN); + + options_test_data_t *tdata = get_options_test_data( + TEST_OPTIONS_DEFAULT_VALUES); + tdata->opt->MinUptimeHidServDirectoryV2 = -1; + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg("MinUptimeHidServDirectoryV2 " + "option must be at least 0 seconds. Changing to 0.\n"); + tt_int_op(tdata->opt->MinUptimeHidServDirectoryV2, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "RendPostPeriod 1\n" ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg("RendPostPeriod option is too short;" + " raising to 600 seconds.\n"); + tt_int_op(tdata->opt->RendPostPeriod, OP_EQ, 600); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "RendPostPeriod 302401\n" ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg("RendPostPeriod is too large; " + "clipping to 302400s.\n"); + tt_int_op(tdata->opt->RendPostPeriod, OP_EQ, 302400); + tor_free(msg); + + done: + teardown_capture_of_logs(); + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__path_bias(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + + options_test_data_t *tdata = get_options_test_data( + TEST_OPTIONS_DEFAULT_VALUES + "PathBiasNoticeRate 1.1\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "PathBiasNoticeRate is too high. It must be between 0 and 1.0"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "PathBiasWarnRate 1.1\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "PathBiasWarnRate is too high. It must be between 0 and 1.0"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "PathBiasExtremeRate 1.1\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "PathBiasExtremeRate is too high. It must be between 0 and 1.0"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "PathBiasNoticeUseRate 1.1\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "PathBiasNoticeUseRate is too high. It must be between 0 and 1.0"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "PathBiasExtremeUseRate 1.1\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "PathBiasExtremeUseRate is too high. It must be between 0 and 1.0"); + tor_free(msg); + + done: + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__bandwidth(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + +#define ENSURE_BANDWIDTH_PARAM(p) \ + STMT_BEGIN \ + free_options_test_data(tdata); \ + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES #p " 3Gb\n"); \ + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ + tt_int_op(ret, OP_EQ, -1); \ + tt_mem_op(msg, OP_EQ, #p " (3221225471) must be at most 2147483647", 40); \ + tor_free(msg); \ + STMT_END + + ENSURE_BANDWIDTH_PARAM(BandwidthRate); + ENSURE_BANDWIDTH_PARAM(BandwidthBurst); + ENSURE_BANDWIDTH_PARAM(MaxAdvertisedBandwidth); + ENSURE_BANDWIDTH_PARAM(RelayBandwidthRate); + ENSURE_BANDWIDTH_PARAM(RelayBandwidthBurst); + ENSURE_BANDWIDTH_PARAM(PerConnBWRate); + ENSURE_BANDWIDTH_PARAM(PerConnBWBurst); + ENSURE_BANDWIDTH_PARAM(AuthDirFastGuarantee); + ENSURE_BANDWIDTH_PARAM(AuthDirGuardBWGuarantee); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "RelayBandwidthRate 1000\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_u64_op(tdata->opt->RelayBandwidthBurst, OP_EQ, 1000); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "RelayBandwidthBurst 1001\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_u64_op(tdata->opt->RelayBandwidthRate, OP_EQ, 1001); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "RelayBandwidthRate 1001\n" + "RelayBandwidthBurst 1000\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "RelayBandwidthBurst must be at least equal to " + "RelayBandwidthRate."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "BandwidthRate 1001\n" + "BandwidthBurst 1000\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "BandwidthBurst must be at least equal to BandwidthRate."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "RelayBandwidthRate 1001\n" + "BandwidthRate 1000\n" + "BandwidthBurst 1000\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_u64_op(tdata->opt->BandwidthRate, OP_EQ, 1001); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "RelayBandwidthRate 1001\n" + "BandwidthRate 1000\n" + "RelayBandwidthBurst 1001\n" + "BandwidthBurst 1000\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_u64_op(tdata->opt->BandwidthBurst, OP_EQ, 1001); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ORPort 127.0.0.1:5555\n" + "BandwidthRate 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "BandwidthRate is set to 1 bytes/second. For servers," + " it must be at least 76800."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ORPort 127.0.0.1:5555\n" + "BandwidthRate 76800\n" + "MaxAdvertisedBandwidth 30000\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "MaxAdvertisedBandwidth is set to 30000 bytes/second." + " For servers, it must be at least 38400."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ORPort 127.0.0.1:5555\n" + "BandwidthRate 76800\n" + "RelayBandwidthRate 1\n" + "MaxAdvertisedBandwidth 38400\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "RelayBandwidthRate is set to 1 bytes/second. For " + "servers, it must be at least 76800."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ORPort 127.0.0.1:5555\n" + "BandwidthRate 76800\n" + "BandwidthBurst 76800\n" + "RelayBandwidthRate 76800\n" + "MaxAdvertisedBandwidth 38400\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + done: + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__circuits(void *ignored) +{ + (void)ignored; + char *msg; + options_test_data_t *tdata = NULL; + setup_capture_of_logs(LOG_WARN); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "MaxCircuitDirtiness 2592001\n"); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_log_msg("MaxCircuitDirtiness option is too " + "high; setting to 30 days.\n"); + tt_int_op(tdata->opt->MaxCircuitDirtiness, OP_EQ, 2592000); + tor_free(msg); + + free_options_test_data(tdata); + mock_clean_saved_logs(); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "CircuitStreamTimeout 1\n"); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_log_msg("CircuitStreamTimeout option is too" + " short; raising to 10 seconds.\n"); + tt_int_op(tdata->opt->CircuitStreamTimeout, OP_EQ, 10); + tor_free(msg); + + free_options_test_data(tdata); + mock_clean_saved_logs(); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "CircuitStreamTimeout 111\n"); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_no_log_msg("CircuitStreamTimeout option is too" + " short; raising to 10 seconds.\n"); + tt_int_op(tdata->opt->CircuitStreamTimeout, OP_EQ, 111); + tor_free(msg); + + free_options_test_data(tdata); + mock_clean_saved_logs(); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HeartbeatPeriod 1\n"); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_log_msg("HeartbeatPeriod option is too short;" + " raising to 1800 seconds.\n"); + tt_int_op(tdata->opt->HeartbeatPeriod, OP_EQ, 1800); + tor_free(msg); + + free_options_test_data(tdata); + mock_clean_saved_logs(); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HeartbeatPeriod 1982\n"); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_no_log_msg("HeartbeatPeriod option is too short;" + " raising to 1800 seconds.\n"); + tt_int_op(tdata->opt->HeartbeatPeriod, OP_EQ, 1982); + tor_free(msg); + + free_options_test_data(tdata); + mock_clean_saved_logs(); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "CircuitBuildTimeout 1\n" + ); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_log_msg("CircuitBuildTimeout is shorter (1" + " seconds) than the recommended minimum (10 seconds), and " + "LearnCircuitBuildTimeout is disabled. If tor isn't working, " + "raise this value or enable LearnCircuitBuildTimeout.\n"); + tor_free(msg); + + free_options_test_data(tdata); + mock_clean_saved_logs(); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "CircuitBuildTimeout 11\n" + ); + options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + expect_no_log_msg("CircuitBuildTimeout is shorter (1 " + "seconds) than the recommended minimum (10 seconds), and " + "LearnCircuitBuildTimeout is disabled. If tor isn't working, " + "raise this value or enable LearnCircuitBuildTimeout.\n"); + tor_free(msg); + + done: + policies_free_all(); + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__port_forwarding(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "PortForwarding 1\nSandbox 1\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "PortForwarding is not compatible with Sandbox;" + " at most one can be set"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "PortForwarding 1\nSandbox 0\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_assert(!msg); + tor_free(msg); + + done: + free_options_test_data(tdata); + policies_free_all(); + tor_free(msg); +} + +static void +test_options_validate__tor2web(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Tor2webRendezvousPoints 1\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Tor2webRendezvousPoints cannot be set without Tor2webMode."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Tor2webRendezvousPoints 1\nTor2webMode 1\n"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + done: + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__rend(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + setup_capture_of_logs(LOG_WARN); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "UseEntryGuards 0\n" + "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" + "HiddenServicePort 80 127.0.0.1:8080\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg("UseEntryGuards is disabled, but you" + " have configured one or more hidden services on this Tor " + "instance. Your hidden services will be very easy to locate using" + " a well-known attack -- see http://freehaven.net/anonbib/#hs-" + "attack06 for details.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data( + TEST_OPTIONS_DEFAULT_VALUES + "UseEntryGuards 1\n" + "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" + "HiddenServicePort 80 127.0.0.1:8080\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg("UseEntryGuards is disabled, but you" + " have configured one or more hidden services on this Tor " + "instance. Your hidden services will be very easy to locate using" + " a well-known attack -- see http://freehaven.net/anonbib/#hs-" + "attack06 for details.\n"); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HiddenServicePort 80 127.0.0.1:8080\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Failed to configure rendezvous options. See logs for details."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HidServAuth failed\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Failed to configure client authorization for hidden " + "services. See logs for details."); + tor_free(msg); + + done: + policies_free_all(); + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__single_onion(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + setup_capture_of_logs(LOG_WARN); + + /* Test that HiddenServiceSingleHopMode must come with + * HiddenServiceNonAnonymousMode */ + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "SOCKSPort 0\n" + "HiddenServiceSingleHopMode 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "HiddenServiceSingleHopMode does not provide any " + "server anonymity. It must be used with " + "HiddenServiceNonAnonymousMode set to 1."); + tor_free(msg); + free_options_test_data(tdata); + + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "SOCKSPort 0\n" + "HiddenServiceSingleHopMode 1\n" + "HiddenServiceNonAnonymousMode 0\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "HiddenServiceSingleHopMode does not provide any " + "server anonymity. It must be used with " + "HiddenServiceNonAnonymousMode set to 1."); + tor_free(msg); + free_options_test_data(tdata); + + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "SOCKSPort 0\n" + "HiddenServiceSingleHopMode 1\n" + "HiddenServiceNonAnonymousMode 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + free_options_test_data(tdata); + + /* Test that SOCKSPort must come with Tor2webMode if + * HiddenServiceSingleHopMode is 1 */ + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "SOCKSPort 5000\n" + "HiddenServiceSingleHopMode 1\n" + "HiddenServiceNonAnonymousMode 1\n" + "Tor2webMode 0\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "HiddenServiceNonAnonymousMode is incompatible with " + "using Tor as an anonymous client. Please set " + "Socks/Trans/NATD/DNSPort to 0, or revert " + "HiddenServiceNonAnonymousMode to 0."); + tor_free(msg); + free_options_test_data(tdata); + + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "SOCKSPort 0\n" + "HiddenServiceSingleHopMode 1\n" + "HiddenServiceNonAnonymousMode 1\n" + "Tor2webMode 0\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + free_options_test_data(tdata); + + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "SOCKSPort 5000\n" + "HiddenServiceSingleHopMode 0\n" + "Tor2webMode 0\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + free_options_test_data(tdata); + + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "SOCKSPort 5000\n" + "HiddenServiceSingleHopMode 1\n" + "HiddenServiceNonAnonymousMode 1\n" + "Tor2webMode 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + free_options_test_data(tdata); + + /* Test that a hidden service can't be run with Tor2web + * Use HiddenServiceNonAnonymousMode instead of Tor2webMode, because + * Tor2webMode requires a compilation #define */ + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HiddenServiceNonAnonymousMode 1\n" + "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" + "HiddenServicePort 80 127.0.0.1:8080\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "HiddenServiceNonAnonymousMode does not provide any " + "server anonymity. It must be used with " + "HiddenServiceSingleHopMode set to 1."); + tor_free(msg); + free_options_test_data(tdata); + + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HiddenServiceNonAnonymousMode 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "HiddenServiceNonAnonymousMode does not provide any " + "server anonymity. It must be used with " + "HiddenServiceSingleHopMode set to 1."); + tor_free(msg); + free_options_test_data(tdata); + + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" + "HiddenServicePort 80 127.0.0.1:8080\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + free_options_test_data(tdata); + + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HiddenServiceNonAnonymousMode 1\n" + "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" + "HiddenServicePort 80 127.0.0.1:8080\n" + "HiddenServiceSingleHopMode 1\n" + "SOCKSPort 0\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_ptr_op(msg, OP_EQ, NULL); + + done: + policies_free_all(); + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__accounting(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + setup_capture_of_logs(LOG_WARN); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "AccountingRule something_bad\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "AccountingRule must be 'sum', 'max', 'in', or 'out'"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "AccountingRule sum\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->AccountingRule, OP_EQ, ACCT_SUM); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "AccountingRule max\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->AccountingRule, OP_EQ, ACCT_MAX); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "AccountingStart fail\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Failed to parse accounting options. See logs for details."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "AccountingMax 10\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data( + TEST_OPTIONS_DEFAULT_VALUES + "ORPort 127.0.0.1:5555\n" + "BandwidthRate 76800\n" + "BandwidthBurst 76800\n" + "MaxAdvertisedBandwidth 38400\n" + "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" + "HiddenServicePort 80 127.0.0.1:8080\n" + "AccountingMax 10\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg("Using accounting with a hidden " + "service and an ORPort is risky: your hidden service(s) and " + "your public address will all turn off at the same time, " + "which may alert observers that they are being run by the " + "same party.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data( + TEST_OPTIONS_DEFAULT_VALUES + "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" + "HiddenServicePort 80 127.0.0.1:8080\n" + "AccountingMax 10\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg("Using accounting with a hidden " + "service and an ORPort is risky: your hidden service(s) and " + "your public address will all turn off at the same time, " + "which may alert observers that they are being run by the " + "same party.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data( + TEST_OPTIONS_DEFAULT_VALUES + "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" + "HiddenServicePort 80 127.0.0.1:8080\n" + "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service2/\n" + "HiddenServicePort 81 127.0.0.1:8081\n" + "AccountingMax 10\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg("Using accounting with multiple " + "hidden services is risky: they will all turn off at the same" + " time, which may alert observers that they are being run by " + "the same party.\n"); + tor_free(msg); + + done: + teardown_capture_of_logs(); + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__proxy(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + sandbox_disable_getaddrinfo_cache(); + setup_capture_of_logs(LOG_WARN); + MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpProxy 127.0.42.1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->HTTPProxyPort, OP_EQ, 80); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpProxy 127.0.42.1:444\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->HTTPProxyPort, OP_EQ, 444); + tor_free(msg); + + free_options_test_data(tdata); + + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpProxy not_so_valid!\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "HTTPProxy failed to parse or resolve. Please fix."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpProxyAuthenticator " + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreonetwothreonetwothreonetwothre" + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreonetwothreonetwothreonetwothre" + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreonetwothreonetwothreonetwothre" + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreonetwothreonetwothreonetwothre" + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreonetwothreonetwothreonetwothre" + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreeonetwothreeonetwothree" + + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "HTTPProxyAuthenticator is too long (>= 512 chars)."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpProxyAuthenticator validauth\n" + + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpsProxy 127.0.42.1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->HTTPSProxyPort, OP_EQ, 443); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpsProxy 127.0.42.1:444\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->HTTPSProxyPort, OP_EQ, 444); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpsProxy not_so_valid!\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "HTTPSProxy failed to parse or resolve. Please fix."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpsProxyAuthenticator " + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreonetwothreonetwothreonetwothre" + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreonetwothreonetwothreonetwothre" + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreonetwothreonetwothreonetwothre" + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreonetwothreonetwothreonetwothre" + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreonetwothreonetwothreonetwothre" + "onetwothreonetwothreonetwothreonetwothreonetw" + "othreonetwothreeonetwothreeonetwothree" + + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "HTTPSProxyAuthenticator is too long (>= 512 chars)."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpsProxyAuthenticator validauth\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks4Proxy 127.0.42.1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->Socks4ProxyPort, OP_EQ, 1080); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks4Proxy 127.0.42.1:444\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->Socks4ProxyPort, OP_EQ, 444); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks4Proxy not_so_valid!\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Socks4Proxy failed to parse or resolve. Please fix."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks5Proxy 127.0.42.1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->Socks5ProxyPort, OP_EQ, 1080); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks5Proxy 127.0.42.1:444\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->Socks5ProxyPort, OP_EQ, 444); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks5Proxy not_so_valid!\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Socks5Proxy failed to parse or resolve. Please fix."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks4Proxy 215.1.1.1\n" + "Socks5Proxy 215.1.1.2\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "You have configured more than one proxy type. " + "(Socks4Proxy|Socks5Proxy|HTTPSProxy)"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpProxy 215.1.1.1\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg("HTTPProxy configured, but no SOCKS " + "proxy or HTTPS proxy configured. Watch out: this configuration " + "will proxy unencrypted directory connections only.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpProxy 215.1.1.1\n" + "Socks4Proxy 215.1.1.1\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg("HTTPProxy configured, but no SOCKS " + "proxy or HTTPS proxy configured. Watch out: this configuration " + "will proxy unencrypted directory connections only.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpProxy 215.1.1.1\n" + "Socks5Proxy 215.1.1.1\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg("HTTPProxy configured, but no SOCKS " + "proxy or HTTPS proxy configured. Watch out: this configuration " + "will proxy unencrypted directory connections only.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HttpProxy 215.1.1.1\n" + "HttpsProxy 215.1.1.1\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "HTTPProxy configured, but no SOCKS proxy or HTTPS proxy " + "configured. Watch out: this configuration will proxy " + "unencrypted directory connections only.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + ); + tdata->opt->Socks5ProxyUsername = tor_strdup(""); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Socks5ProxyUsername must be between 1 and 255 characters."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + ); + tdata->opt->Socks5ProxyUsername = + tor_strdup("ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789AB" + "CDEABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCD" + "EABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEA" + "BCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEABC" + "DE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Socks5ProxyUsername must be between 1 and 255 characters."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks5ProxyUsername hello_world\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Socks5ProxyPassword must be included with " + "Socks5ProxyUsername."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks5ProxyUsername hello_world\n" + ); + tdata->opt->Socks5ProxyPassword = tor_strdup(""); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Socks5ProxyPassword must be between 1 and 255 characters."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks5ProxyUsername hello_world\n" + ); + tdata->opt->Socks5ProxyPassword = + tor_strdup("ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789AB" + "CDEABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCD" + "EABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEA" + "BCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEABC" + "DE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789"); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Socks5ProxyPassword must be between 1 and 255 characters."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks5ProxyUsername hello_world\n" + "Socks5ProxyPassword world_hello\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "Socks5ProxyPassword hello_world\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Socks5ProxyPassword must be included with " + "Socks5ProxyUsername."); + tor_free(msg); + + done: + teardown_capture_of_logs(); + free_options_test_data(tdata); + policies_free_all(); + // sandbox_free_getaddrinfo_cache(); + tor_free(msg); + UNMOCK(tor_addr_lookup); +} + +static void +test_options_validate__control(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + setup_capture_of_logs(LOG_WARN); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HashedControlPassword something_incorrect\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Bad HashedControlPassword: wrong length or bad encoding"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "HashedControlPassword 16:872860B76453A77D60CA" + "2BB8C1A7042072093276A3D701AD684053EC4C\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data( + TEST_OPTIONS_DEFAULT_VALUES + "__HashedControlSessionPassword something_incorrect\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Bad HashedControlSessionPassword: wrong length or " + "bad encoding"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "__HashedControlSessionPassword 16:872860B7645" + "3A77D60CA2BB8C1A7042072093276A3D701AD684053EC" + "4C\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data( + TEST_OPTIONS_DEFAULT_VALUES + "__OwningControllerProcess something_incorrect\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Bad OwningControllerProcess: invalid PID"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "__OwningControllerProcess 123\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ControlPort 127.0.0.1:1234\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg( + "ControlPort is open, but no authentication method has been " + "configured. This means that any program on your computer can " + "reconfigure your Tor. That's bad! You should upgrade your Tor" + " controller as soon as possible.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ControlPort 127.0.0.1:1234\n" + "HashedControlPassword 16:872860B76453A77D60CA" + "2BB8C1A7042072093276A3D701AD684053EC4C\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "ControlPort is open, but no authentication method has been " + "configured. This means that any program on your computer can " + "reconfigure your Tor. That's bad! You should upgrade your Tor " + "controller as soon as possible.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ControlPort 127.0.0.1:1234\n" + "__HashedControlSessionPassword 16:872860B7645" + "3A77D60CA2BB8C1A7042072093276A3D701AD684053EC" + "4C\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "ControlPort is open, but no authentication method has been " + "configured. This means that any program on your computer can " + "reconfigure your Tor. That's bad! You should upgrade your Tor " + "controller as soon as possible.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ControlPort 127.0.0.1:1234\n" + "CookieAuthentication 1\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "ControlPort is open, but no authentication method has been " + "configured. This means that any program on your computer can " + "reconfigure your Tor. That's bad! You should upgrade your Tor " + "controller as soon as possible.\n"); + tor_free(msg); + +#ifdef HAVE_SYS_UN_H + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ControlSocket unix:/tmp WorldWritable\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg( + "ControlSocket is world writable, but no authentication method has" + " been configured. This means that any program on your computer " + "can reconfigure your Tor. That's bad! You should upgrade your " + "Tor controller as soon as possible.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ControlSocket unix:/tmp WorldWritable\n" + "HashedControlPassword 16:872860B76453A77D60CA" + "2BB8C1A7042072093276A3D701AD684053EC4C\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "ControlSocket is world writable, but no authentication method has" + " been configured. This means that any program on your computer " + "can reconfigure your Tor. That's bad! You should upgrade your " + "Tor controller as soon as possible.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ControlSocket unix:/tmp WorldWritable\n" + "__HashedControlSessionPassword 16:872860B7645" + "3A77D60CA2BB8C1A7042072093276A3D701AD684053EC" + "4C\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "ControlSocket is world writable, but no authentication method has" + " been configured. This means that any program on your computer " + "can reconfigure your Tor. That's bad! You should upgrade your " + "Tor controller as soon as possible.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ControlSocket unix:/tmp WorldWritable\n" + "CookieAuthentication 1\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "ControlSocket is world writable, but no authentication method has" + " been configured. This means that any program on your computer " + "can reconfigure your Tor. That's bad! You should upgrade your " + "Tor controller as soon as possible.\n"); + tor_free(msg); +#endif /* defined(HAVE_SYS_UN_H) */ + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "CookieAuthFileGroupReadable 1\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg( + "CookieAuthFileGroupReadable is set, but will have no effect: you " + "must specify an explicit CookieAuthFile to have it " + "group-readable.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "CookieAuthFileGroupReadable 1\n" + "CookieAuthFile /tmp/somewhere\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "CookieAuthFileGroupReadable is set, but will have no effect: you " + "must specify an explicit CookieAuthFile to have it " + "group-readable.\n"); + tor_free(msg); + + done: + teardown_capture_of_logs(); + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__families(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + setup_capture_of_logs(LOG_WARN); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "MyFamily home\n" + "BridgeRelay 1\n" + "ORPort 127.0.0.1:5555\n" + "BandwidthRate 51300\n" + "BandwidthBurst 51300\n" + "MaxAdvertisedBandwidth 25700\n" + "DirCache 1\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg( + "Listing a family for a bridge relay is not supported: it can " + "reveal bridge fingerprints to censors. You should also make sure " + "you aren't listing this bridge's fingerprint in any other " + "MyFamily.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "MyFamily home\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "Listing a family for a bridge relay is not supported: it can " + "reveal bridge fingerprints to censors. You should also make sure " + "you aren't listing this bridge's fingerprint in any other " + "MyFamily.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "MyFamily !\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Invalid nickname '!' in MyFamily line"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "NodeFamily foo\n" + "NodeFamily !\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_assert(!msg); + tor_free(msg); + + done: + teardown_capture_of_logs(); + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__addr_policies(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ExitPolicy !!!\n" + "ExitRelay 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Error in ExitPolicy entry."); + tor_free(msg); + + done: + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__dir_auth(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + setup_capture_of_logs(LOG_WARN); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + VALID_DIR_AUTH + VALID_ALT_DIR_AUTH + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Directory authority/fallback line did not parse. See logs for " + "details."); + expect_log_msg( + "You cannot set both DirAuthority and Alternate*Authority.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingTorNetwork 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "TestingTorNetwork may only be configured in combination with a " + "non-default set of DirAuthority or both of AlternateDirAuthority " + "and AlternateBridgeAuthority configured."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + VALID_DIR_AUTH + "TestingTorNetwork 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingTorNetwork 1\n" + VALID_ALT_DIR_AUTH + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "TestingTorNetwork may only be configured in combination with a " + "non-default set of DirAuthority or both of AlternateDirAuthority " + "and AlternateBridgeAuthority configured."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingTorNetwork 1\n" + VALID_ALT_BRIDGE_AUTH + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "TestingTorNetwork may only be configured in " + "combination with a non-default set of DirAuthority or both of " + "AlternateDirAuthority and AlternateBridgeAuthority configured."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + VALID_ALT_DIR_AUTH + VALID_ALT_BRIDGE_AUTH + "TestingTorNetwork 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + done: + policies_free_all(); + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__transport(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + setup_capture_of_logs(LOG_NOTICE); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ClientTransportPlugin !!\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Invalid client transport line. See logs for details."); + expect_log_msg( + "Too few arguments on ClientTransportPlugin line.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ClientTransportPlugin foo exec bar\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ServerTransportPlugin !!\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Invalid server transport line. See logs for details."); + expect_log_msg( + "Too few arguments on ServerTransportPlugin line.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ServerTransportPlugin foo exec bar\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg( + "Tor is not configured as a relay but you specified a " + "ServerTransportPlugin line (\"foo exec bar\"). The " + "ServerTransportPlugin line will be ignored.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ServerTransportPlugin foo exec bar\n" + "ORPort 127.0.0.1:5555\n" + "BandwidthRate 76900\n" + "BandwidthBurst 76900\n" + "MaxAdvertisedBandwidth 38500\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "Tor is not configured as a relay but you specified a " + "ServerTransportPlugin line (\"foo exec bar\"). The " + "ServerTransportPlugin line will be ignored.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ServerTransportListenAddr foo 127.0.0.42:55\n" + "ServerTransportListenAddr !\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "ServerTransportListenAddr did not parse. See logs for details."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ServerTransportListenAddr foo 127.0.0.42:55\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg( + "You need at least a single managed-proxy to specify a transport " + "listen address. The ServerTransportListenAddr line will be " + "ignored.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ServerTransportListenAddr foo 127.0.0.42:55\n" + "ServerTransportPlugin foo exec bar\n" + "ORPort 127.0.0.1:5555\n" + "BandwidthRate 76900\n" + "BandwidthBurst 76900\n" + "MaxAdvertisedBandwidth 38500\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "You need at least a single managed-proxy to specify a transport " + "listen address. The ServerTransportListenAddr line will be " + "ignored.\n"); + + done: + escaped(NULL); // This will free the leaking memory from the previous escaped + policies_free_all(); + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__constrained_sockets(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + setup_capture_of_logs(LOG_WARN); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ConstrainedSockets 1\n" + "ConstrainedSockSize 0\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "ConstrainedSockSize is invalid. Must be a value " + "between 2048 and 262144 in 1024 byte increments."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ConstrainedSockets 1\n" + "ConstrainedSockSize 263168\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "ConstrainedSockSize is invalid. Must be a value " + "between 2048 and 262144 in 1024 byte increments."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ConstrainedSockets 1\n" + "ConstrainedSockSize 2047\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "ConstrainedSockSize is invalid. Must be a value " + "between 2048 and 262144 in 1024 byte increments."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ConstrainedSockets 1\n" + "ConstrainedSockSize 2048\n" + "DirPort 999\n" + "DirCache 1\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg("You have requested constrained " + "socket buffers while also serving directory entries via DirPort." + " It is strongly suggested that you disable serving directory" + " requests when system TCP buffer resources are scarce.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "ConstrainedSockets 1\n" + "ConstrainedSockSize 2048\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg( + "You have requested constrained socket buffers while also serving" + " directory entries via DirPort. It is strongly suggested that " + "you disable serving directory requests when system TCP buffer " + "resources are scarce.\n"); + tor_free(msg); + + done: + policies_free_all(); + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__v3_auth(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + setup_capture_of_logs(LOG_WARN); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "V3AuthVoteDelay 1000\n" + "V3AuthDistDelay 1000\n" + "V3AuthVotingInterval 1000\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "V3AuthVoteDelay plus V3AuthDistDelay must be less than half " + "V3AuthVotingInterval"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "V3AuthVoteDelay 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "V3AuthVoteDelay is way too low."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "V3AuthVoteDelay 1\n" + "TestingTorNetwork 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "V3AuthVoteDelay is way too low."); + tor_free(msg); + + // TODO: we can't reach the case of v3authvotedelay lower + // than MIN_VOTE_SECONDS but not lower than MIN_VOTE_SECONDS_TESTING, + // since they are the same + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "V3AuthDistDelay 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "V3AuthDistDelay is way too low."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "V3AuthDistDelay 1\n" + "TestingTorNetwork 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "V3AuthDistDelay is way too low."); + tor_free(msg); + + // TODO: we can't reach the case of v3authdistdelay lower than + // MIN_DIST_SECONDS but not lower than MIN_DIST_SECONDS_TESTING, + // since they are the same + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "V3AuthNIntervalsValid 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "V3AuthNIntervalsValid must be at least 2."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "V3AuthVoteDelay 49\n" + "V3AuthDistDelay 49\n" + "V3AuthVotingInterval 200\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "V3AuthVotingInterval is insanely low."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "V3AuthVoteDelay 49\n" + "V3AuthDistDelay 49\n" + "V3AuthVotingInterval 200000\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "V3AuthVotingInterval is insanely high."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "V3AuthVoteDelay 49\n" + "V3AuthDistDelay 49\n" + "V3AuthVotingInterval 1441\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg("V3AuthVotingInterval does not divide" + " evenly into 24 hours.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "V3AuthVoteDelay 49\n" + "V3AuthDistDelay 49\n" + "V3AuthVotingInterval 1440\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_msg("V3AuthVotingInterval does not divide" + " evenly into 24 hours.\n"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "V3AuthVoteDelay 49\n" + "V3AuthDistDelay 49\n" + "V3AuthVotingInterval 299\n" + VALID_DIR_AUTH + "TestingTorNetwork 1\n" + ); + mock_clean_saved_logs(); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + expect_log_msg("V3AuthVotingInterval is very low. " + "This may lead to failure to synchronise for a consensus.\n"); + tor_free(msg); + + // TODO: It is impossible to reach the case of testingtor network, with + // v3authvotinginterval too low + /* free_options_test_data(tdata); */ + /* tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES */ + /* "V3AuthVoteDelay 1\n" */ + /* "V3AuthDistDelay 1\n" */ + /* "V3AuthVotingInterval 9\n" */ + /* VALID_DIR_AUTH */ + /* "TestingTorNetwork 1\n" */ + /* ); */ + /* ret = options_validate(tdata->old_opt, tdata->opt, */ + /* tdata->def_opt, 0, &msg); */ + /* tt_int_op(ret, OP_EQ, -1); */ + /* tt_str_op(msg, OP_EQ, "V3AuthVotingInterval is insanely low."); */ + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingV3AuthInitialVoteDelay 1\n" + VALID_DIR_AUTH + "TestingTorNetwork 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "TestingV3AuthInitialVoteDelay is way too low."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingV3AuthInitialDistDelay 1\n" + VALID_DIR_AUTH + "TestingTorNetwork 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "TestingV3AuthInitialDistDelay is way too low."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + VALID_DIR_AUTH + "TestingTorNetwork 1\n" + ); + tdata->opt->TestingV3AuthVotingStartOffset = 100000; + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "TestingV3AuthVotingStartOffset is higher than the " + "voting interval."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + VALID_DIR_AUTH + "TestingTorNetwork 1\n" + ); + tdata->opt->TestingV3AuthVotingStartOffset = -1; + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "TestingV3AuthVotingStartOffset must be non-negative."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + VALID_DIR_AUTH + "TestingTorNetwork 1\n" + "TestingV3AuthInitialVotingInterval 4\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "TestingV3AuthInitialVotingInterval is insanely low."); + tor_free(msg); + + done: + policies_free_all(); + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__virtual_addr(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "VirtualAddrNetworkIPv4 !!" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Error parsing VirtualAddressNetwork !!"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "VirtualAddrNetworkIPv6 !!" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "Error parsing VirtualAddressNetworkIPv6 !!"); + tor_free(msg); + + done: + escaped(NULL); // This will free the leaking memory from the previous escaped + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__testing_options(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + setup_capture_of_logs(LOG_WARN); + +#define TEST_TESTING_OPTION(name, low_val, high_val, err_low) \ + STMT_BEGIN \ + free_options_test_data(tdata); \ + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES \ + VALID_DIR_AUTH \ + "TestingTorNetwork 1\n" \ + ); \ + tdata->opt-> name = low_val; \ + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ + tt_int_op(ret, OP_EQ, -1); \ + tt_str_op(msg, OP_EQ, #name " " err_low); \ + tor_free(msg); \ + \ + free_options_test_data(tdata); \ + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES \ + VALID_DIR_AUTH \ + "TestingTorNetwork 1\n" \ + ); \ + tdata->opt-> name = high_val; \ + mock_clean_saved_logs(); \ + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ + tt_int_op(ret, OP_EQ, 0); \ + expect_log_msg( #name " is insanely high.\n"); \ + tor_free(msg); \ + STMT_END + + TEST_TESTING_OPTION(TestingAuthDirTimeToLearnReachability, -1, 8000, + "must be non-negative."); + TEST_TESTING_OPTION(TestingEstimatedDescriptorPropagationTime, -1, 3601, + "must be non-negative."); + TEST_TESTING_OPTION(TestingClientMaxIntervalWithoutRequest, -1, 3601, + "is way too low."); + TEST_TESTING_OPTION(TestingDirConnectionMaxStall, 1, 3601, + "is way too low."); + // TODO: I think this points to a bug/regression in options_validate + TEST_TESTING_OPTION(TestingConsensusMaxDownloadTries, 1, 801, + "must be greater than 2."); + TEST_TESTING_OPTION(TestingDescriptorMaxDownloadTries, 1, 801, + "must be greater than 1."); + TEST_TESTING_OPTION(TestingMicrodescMaxDownloadTries, 1, 801, + "must be greater than 1."); + TEST_TESTING_OPTION(TestingCertMaxDownloadTries, 1, 801, + "must be greater than 1."); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingEnableConnBwEvent 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "TestingEnableConnBwEvent may only be changed in " + "testing Tor networks!"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingEnableConnBwEvent 1\n" + VALID_DIR_AUTH + "TestingTorNetwork 1\n" + "___UsingTestNetworkDefaults 0\n" + ); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_assert(!msg); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingEnableConnBwEvent 1\n" + VALID_DIR_AUTH + "TestingTorNetwork 0\n" + "___UsingTestNetworkDefaults 1\n" + ); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_assert(!msg); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingEnableCellStatsEvent 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "TestingEnableCellStatsEvent may only be changed in " + "testing Tor networks!"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingEnableCellStatsEvent 1\n" + VALID_DIR_AUTH + "TestingTorNetwork 1\n" + "___UsingTestNetworkDefaults 0\n" + ); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_assert(!msg); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingEnableCellStatsEvent 1\n" + VALID_DIR_AUTH + "TestingTorNetwork 0\n" + "___UsingTestNetworkDefaults 1\n" + ); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_assert(!msg); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingEnableTbEmptyEvent 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, "TestingEnableTbEmptyEvent may only be changed " + "in testing Tor networks!"); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingEnableTbEmptyEvent 1\n" + VALID_DIR_AUTH + "TestingTorNetwork 1\n" + "___UsingTestNetworkDefaults 0\n" + ); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_assert(!msg); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "TestingEnableTbEmptyEvent 1\n" + VALID_DIR_AUTH + "TestingTorNetwork 0\n" + "___UsingTestNetworkDefaults 1\n" + ); + + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_assert(!msg); + tor_free(msg); + + done: + policies_free_all(); + teardown_capture_of_logs(); + free_options_test_data(tdata); + tor_free(msg); +} + +static void +test_options_validate__accel(void *ignored) +{ + (void)ignored; + int ret; + char *msg; + options_test_data_t *tdata = NULL; + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "AccelName foo\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->HardwareAccel, OP_EQ, 1); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "AccelName foo\n" + ); + tdata->opt->HardwareAccel = 2; + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tdata->opt->HardwareAccel, OP_EQ, 2); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "AccelDir 1\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, -1); + tt_str_op(msg, OP_EQ, + "Can't use hardware crypto accelerator dir without engine name."); + tor_free(msg); + + free_options_test_data(tdata); + tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES + "AccelDir 1\n" + "AccelName something\n" + ); + ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); + tt_int_op(ret, OP_EQ, 0); + tor_free(msg); + + done: + policies_free_all(); + free_options_test_data(tdata); + tor_free(msg); +} + +#define LOCAL_VALIDATE_TEST(name) \ + { "validate__" #name, test_options_validate__ ## name, TT_FORK, NULL, NULL } + +struct testcase_t options_tests[] = { + { "validate", test_options_validate, TT_FORK, NULL, NULL }, + { "mem_dircache", test_have_enough_mem_for_dircache, TT_FORK, NULL, NULL }, + LOCAL_VALIDATE_TEST(uname_for_server), + LOCAL_VALIDATE_TEST(outbound_addresses), + LOCAL_VALIDATE_TEST(data_directory), + LOCAL_VALIDATE_TEST(nickname), + LOCAL_VALIDATE_TEST(contactinfo), + LOCAL_VALIDATE_TEST(logs), + LOCAL_VALIDATE_TEST(authdir), + LOCAL_VALIDATE_TEST(relay_with_hidden_services), + LOCAL_VALIDATE_TEST(transproxy), + LOCAL_VALIDATE_TEST(exclude_nodes), + LOCAL_VALIDATE_TEST(node_families), + LOCAL_VALIDATE_TEST(token_bucket), + LOCAL_VALIDATE_TEST(recommended_packages), + LOCAL_VALIDATE_TEST(fetch_dir), + LOCAL_VALIDATE_TEST(conn_limit), + LOCAL_VALIDATE_TEST(paths_needed), + LOCAL_VALIDATE_TEST(max_client_circuits), + LOCAL_VALIDATE_TEST(ports), + LOCAL_VALIDATE_TEST(reachable_addresses), + LOCAL_VALIDATE_TEST(use_bridges), + LOCAL_VALIDATE_TEST(entry_nodes), + LOCAL_VALIDATE_TEST(safe_logging), + LOCAL_VALIDATE_TEST(publish_server_descriptor), + LOCAL_VALIDATE_TEST(testing), + LOCAL_VALIDATE_TEST(hidserv), + LOCAL_VALIDATE_TEST(path_bias), + LOCAL_VALIDATE_TEST(bandwidth), + LOCAL_VALIDATE_TEST(circuits), + LOCAL_VALIDATE_TEST(port_forwarding), + LOCAL_VALIDATE_TEST(tor2web), + LOCAL_VALIDATE_TEST(rend), + LOCAL_VALIDATE_TEST(single_onion), + LOCAL_VALIDATE_TEST(accounting), + LOCAL_VALIDATE_TEST(proxy), + LOCAL_VALIDATE_TEST(control), + LOCAL_VALIDATE_TEST(families), + LOCAL_VALIDATE_TEST(addr_policies), + LOCAL_VALIDATE_TEST(dir_auth), + LOCAL_VALIDATE_TEST(transport), + LOCAL_VALIDATE_TEST(constrained_sockets), + LOCAL_VALIDATE_TEST(v3_auth), + LOCAL_VALIDATE_TEST(virtual_addr), + LOCAL_VALIDATE_TEST(testing_options), + LOCAL_VALIDATE_TEST(accel), + END_OF_TESTCASES /* */ +}; + diff --git a/src/wraith/src/test/test_policy.c b/src/wraith/src/test/test_policy.c new file mode 100644 index 000000000..f8aa8ac40 --- /dev/null +++ b/src/wraith/src/test/test_policy.c @@ -0,0 +1,2392 @@ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#define CONFIG_PRIVATE +#include "config.h" +#include "router.h" +#include "routerparse.h" +#define POLICIES_PRIVATE +#include "policies.h" +#include "test.h" + +/* Helper: assert that short_policy parses and writes back out as itself, + or as expected if that's provided. */ +static void +test_short_policy_parse(const char *input, + const char *expected) +{ + short_policy_t *short_policy = NULL; + char *out = NULL; + + if (expected == NULL) + expected = input; + + short_policy = parse_short_policy(input); + tt_assert(short_policy); + out = write_short_policy(short_policy); + tt_str_op(out, OP_EQ, expected); + + done: + tor_free(out); + short_policy_free(short_policy); +} + +/** Helper: Parse the exit policy string in policy_str with + * options, and make sure that policies_summarize() produces the string + * expected_summary from it when called with family. */ +static void +test_policy_summary_helper_family_flags(const char *policy_str, + const char *expected_summary, + sa_family_t family, + exit_policy_parser_cfg_t options) +{ + config_line_t line; + smartlist_t *policy = smartlist_new(); + char *summary = NULL; + char *summary_after = NULL; + int r; + short_policy_t *short_policy = NULL; + int success = 0; + + line.key = (char*)"foo"; + line.value = (char *)policy_str; + line.next = NULL; + + r = policies_parse_exit_policy(&line, &policy, + options, NULL); + tt_int_op(r,OP_EQ, 0); + + summary = policy_summarize(policy, family); + + tt_ptr_op(summary, OP_NE, NULL); + tt_str_op(summary,OP_EQ, expected_summary); + + short_policy = parse_short_policy(summary); + tt_assert(short_policy); + summary_after = write_short_policy(short_policy); + tt_str_op(summary,OP_EQ, summary_after); + + success = 1; + done: + /* If we don't print the flags on failure, it's very hard to diagnose bugs */ + if (!success) + TT_DECLARE("CTXT", ("\n IPv%d\n Options: %x\n Policy: %s", + family == AF_INET ? 4 : 6, options, policy_str)); + tor_free(summary_after); + tor_free(summary); + if (policy) + addr_policy_list_free(policy); + short_policy_free(short_policy); +} + +/** Like test_policy_summary_helper_family_flags, but tries all the different + * flag combinations */ +static void +test_policy_summary_helper_family(const char *policy_str, + const char *expected_summary, + sa_family_t family) +{ + for (exit_policy_parser_cfg_t opt = 0; + opt <= EXIT_POLICY_OPTION_ALL; + opt++) { + if (family == AF_INET6 && !(opt & EXIT_POLICY_IPV6_ENABLED)) + /* Skip the test: IPv6 addresses need IPv6 enabled */ + continue; + + if (opt & EXIT_POLICY_REJECT_LOCAL_INTERFACES) + /* Skip the test: local interfaces are machine-specific */ + continue; + + test_policy_summary_helper_family_flags(policy_str, expected_summary, + family, opt); + } +} + +/** Like test_policy_summary_helper_family, but uses expected_summary for + * both IPv4 and IPv6. */ +static void +test_policy_summary_helper(const char *policy_str, + const char *expected_summary) +{ + test_policy_summary_helper_family(policy_str, expected_summary, AF_INET); + test_policy_summary_helper_family(policy_str, expected_summary, AF_INET6); +} + +/** Like test_policy_summary_helper_family, but uses expected_summary4 for + * IPv4 and expected_summary6 for IPv6. */ +static void +test_policy_summary_helper6(const char *policy_str, + const char *expected_summary4, + const char *expected_summary6) +{ + test_policy_summary_helper_family(policy_str, expected_summary4, AF_INET); + test_policy_summary_helper_family(policy_str, expected_summary6, AF_INET6); +} + +/** Run unit tests for generating summary lines of exit policies */ +static void +test_policies_general(void *arg) +{ + int i; + smartlist_t *policy = NULL, *policy2 = NULL, *policy3 = NULL, + *policy4 = NULL, *policy5 = NULL, *policy6 = NULL, + *policy7 = NULL, *policy8 = NULL, *policy9 = NULL, + *policy10 = NULL, *policy11 = NULL, *policy12 = NULL; + addr_policy_t *p; + tor_addr_t tar, tar2; + smartlist_t *addr_list = NULL; + config_line_t line; + smartlist_t *sm = NULL; + char *policy_str = NULL; + short_policy_t *short_parsed = NULL; + int malformed_list = -1; + (void)arg; + + policy = smartlist_new(); + + p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + tt_int_op(ADDR_POLICY_REJECT,OP_EQ, p->policy_type); + tor_addr_from_ipv4h(&tar, 0xc0a80000u); + tt_int_op(0,OP_EQ, tor_addr_compare(&p->addr, &tar, CMP_EXACT)); + tt_int_op(16,OP_EQ, p->maskbits); + tt_int_op(1,OP_EQ, p->prt_min); + tt_int_op(65535,OP_EQ, p->prt_max); + + smartlist_add(policy, p); + + tor_addr_from_ipv4h(&tar, 0x01020304u); + tt_assert(ADDR_POLICY_ACCEPTED == + compare_tor_addr_to_addr_policy(&tar, 2, policy)); + tor_addr_make_unspec(&tar); + tt_assert(ADDR_POLICY_PROBABLY_ACCEPTED == + compare_tor_addr_to_addr_policy(&tar, 2, policy)); + tor_addr_from_ipv4h(&tar, 0xc0a80102); + tt_assert(ADDR_POLICY_REJECTED == + compare_tor_addr_to_addr_policy(&tar, 2, policy)); + + tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy2, + EXIT_POLICY_IPV6_ENABLED | + EXIT_POLICY_REJECT_PRIVATE | + EXIT_POLICY_ADD_DEFAULT, NULL)); + + tt_assert(policy2); + + tor_addr_from_ipv4h(&tar, 0x0306090cu); + tor_addr_parse(&tar2, "[2000::1234]"); + addr_list = smartlist_new(); + smartlist_add(addr_list, &tar); + smartlist_add(addr_list, &tar2); + tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy12, + EXIT_POLICY_IPV6_ENABLED | + EXIT_POLICY_REJECT_PRIVATE | + EXIT_POLICY_ADD_DEFAULT, + addr_list)); + smartlist_free(addr_list); + addr_list = NULL; + + tt_assert(policy12); + + policy3 = smartlist_new(); + p = router_parse_addr_policy_item_from_string("reject *:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy3, p); + p = router_parse_addr_policy_item_from_string("accept *:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy3, p); + + policy4 = smartlist_new(); + p = router_parse_addr_policy_item_from_string("accept *:443", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy4, p); + p = router_parse_addr_policy_item_from_string("accept *:443", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy4, p); + + policy5 = smartlist_new(); + p = router_parse_addr_policy_item_from_string("reject 0.0.0.0/8:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 169.254.0.0/16:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 127.0.0.0/8:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*", + -1, &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 10.0.0.0/8:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 172.16.0.0/12:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject 80.190.250.90:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject *:1-65534", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("reject *:65535", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy5, p); + p = router_parse_addr_policy_item_from_string("accept *:1-65535", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy5, p); + + policy6 = smartlist_new(); + p = router_parse_addr_policy_item_from_string("accept 43.3.0.0/9:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy6, p); + + policy7 = smartlist_new(); + p = router_parse_addr_policy_item_from_string("accept 0.0.0.0/8:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy7, p); + + tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy8, + EXIT_POLICY_IPV6_ENABLED | + EXIT_POLICY_REJECT_PRIVATE | + EXIT_POLICY_ADD_DEFAULT, + NULL)); + + tt_assert(policy8); + + tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy9, + EXIT_POLICY_REJECT_PRIVATE | + EXIT_POLICY_ADD_DEFAULT, + NULL)); + + tt_assert(policy9); + + /* accept6 * and reject6 * produce IPv6 wildcards only */ + policy10 = smartlist_new(); + p = router_parse_addr_policy_item_from_string("accept6 *:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy10, p); + + policy11 = smartlist_new(); + p = router_parse_addr_policy_item_from_string("reject6 *:*", -1, + &malformed_list); + tt_ptr_op(p, OP_NE, NULL); + smartlist_add(policy11, p); + + tt_assert(!exit_policy_is_general_exit(policy)); + tt_assert(exit_policy_is_general_exit(policy2)); + tt_assert(!exit_policy_is_general_exit(NULL)); + tt_assert(!exit_policy_is_general_exit(policy3)); + tt_assert(!exit_policy_is_general_exit(policy4)); + tt_assert(!exit_policy_is_general_exit(policy5)); + tt_assert(!exit_policy_is_general_exit(policy6)); + tt_assert(!exit_policy_is_general_exit(policy7)); + tt_assert(exit_policy_is_general_exit(policy8)); + tt_assert(exit_policy_is_general_exit(policy9)); + tt_assert(!exit_policy_is_general_exit(policy10)); + tt_assert(!exit_policy_is_general_exit(policy11)); + + tt_assert(!addr_policies_eq(policy, policy2)); + tt_assert(!addr_policies_eq(policy, NULL)); + tt_assert(addr_policies_eq(policy2, policy2)); + tt_assert(addr_policies_eq(NULL, NULL)); + + tt_assert(!policy_is_reject_star(policy2, AF_INET, 1)); + tt_assert(policy_is_reject_star(policy, AF_INET, 1)); + tt_assert(policy_is_reject_star(policy10, AF_INET, 1)); + tt_assert(!policy_is_reject_star(policy10, AF_INET6, 1)); + tt_assert(policy_is_reject_star(policy11, AF_INET, 1)); + tt_assert(policy_is_reject_star(policy11, AF_INET6, 1)); + tt_assert(policy_is_reject_star(NULL, AF_INET, 1)); + tt_assert(policy_is_reject_star(NULL, AF_INET6, 1)); + tt_assert(!policy_is_reject_star(NULL, AF_INET, 0)); + tt_assert(!policy_is_reject_star(NULL, AF_INET6, 0)); + + addr_policy_list_free(policy); + policy = NULL; + + /* make sure assume_action works */ + malformed_list = 0; + p = router_parse_addr_policy_item_from_string("127.0.0.1", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(p); + addr_policy_free(p); + tt_assert(!malformed_list); + + p = router_parse_addr_policy_item_from_string("127.0.0.1:*", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(p); + addr_policy_free(p); + tt_assert(!malformed_list); + + p = router_parse_addr_policy_item_from_string("[::]", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(p); + addr_policy_free(p); + tt_assert(!malformed_list); + + p = router_parse_addr_policy_item_from_string("[::]:*", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(p); + addr_policy_free(p); + tt_assert(!malformed_list); + + p = router_parse_addr_policy_item_from_string("[face::b]", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(p); + addr_policy_free(p); + tt_assert(!malformed_list); + + p = router_parse_addr_policy_item_from_string("[b::aaaa]", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(p); + addr_policy_free(p); + tt_assert(!malformed_list); + + p = router_parse_addr_policy_item_from_string("*", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(p); + addr_policy_free(p); + tt_assert(!malformed_list); + + p = router_parse_addr_policy_item_from_string("*4", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(p); + addr_policy_free(p); + tt_assert(!malformed_list); + + p = router_parse_addr_policy_item_from_string("*6", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(p); + addr_policy_free(p); + tt_assert(!malformed_list); + + /* These are all ambiguous IPv6 addresses, it's good that we reject them */ + p = router_parse_addr_policy_item_from_string("acce::abcd", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + malformed_list = 0; + + p = router_parse_addr_policy_item_from_string("7:1234", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + malformed_list = 0; + + p = router_parse_addr_policy_item_from_string("::", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + malformed_list = 0; + + /* make sure compacting logic works. */ + policy = NULL; + line.key = (char*)"foo"; + line.value = (char*)"accept *:80,reject private:*,reject *:*"; + line.next = NULL; + tt_int_op(0, OP_EQ, policies_parse_exit_policy(&line,&policy, + EXIT_POLICY_IPV6_ENABLED | + EXIT_POLICY_ADD_DEFAULT, NULL)); + tt_assert(policy); + + //test_streq(policy->string, "accept *:80"); + //test_streq(policy->next->string, "reject *:*"); + tt_int_op(smartlist_len(policy),OP_EQ, 4); + + /* test policy summaries */ + /* check if we properly ignore private IP addresses */ + test_policy_summary_helper("reject 192.168.0.0/16:*," + "reject 0.0.0.0/8:*," + "reject 10.0.0.0/8:*," + "accept *:10-30," + "accept *:90," + "reject *:*", + "accept 10-30,90"); + /* check all accept policies, and proper counting of rejects */ + test_policy_summary_helper("reject 11.0.0.0/9:80," + "reject 12.0.0.0/9:80," + "reject 13.0.0.0/9:80," + "reject 14.0.0.0/9:80," + "accept *:*", "accept 1-65535"); + test_policy_summary_helper("reject 11.0.0.0/9:80," + "reject 12.0.0.0/9:80," + "reject 13.0.0.0/9:80," + "reject 14.0.0.0/9:80," + "reject 15.0.0.0:81," + "accept *:*", "accept 1-65535"); + test_policy_summary_helper6("reject 11.0.0.0/9:80," + "reject 12.0.0.0/9:80," + "reject 13.0.0.0/9:80," + "reject 14.0.0.0/9:80," + "reject 15.0.0.0:80," + "accept *:*", + "reject 80", + "accept 1-65535"); + /* no exits */ + test_policy_summary_helper("accept 11.0.0.0/9:80," + "reject *:*", + "reject 1-65535"); + /* port merging */ + test_policy_summary_helper("accept *:80," + "accept *:81," + "accept *:100-110," + "accept *:111," + "reject *:*", + "accept 80-81,100-111"); + /* border ports */ + test_policy_summary_helper("accept *:1," + "accept *:3," + "accept *:65535," + "reject *:*", + "accept 1,3,65535"); + /* holes */ + test_policy_summary_helper("accept *:1," + "accept *:3," + "accept *:5," + "accept *:7," + "reject *:*", + "accept 1,3,5,7"); + test_policy_summary_helper("reject *:1," + "reject *:3," + "reject *:5," + "reject *:7," + "accept *:*", + "reject 1,3,5,7"); + /* long policies */ + /* standard long policy on many exits */ + test_policy_summary_helper("accept *:20-23," + "accept *:43," + "accept *:53," + "accept *:79-81," + "accept *:88," + "accept *:110," + "accept *:143," + "accept *:194," + "accept *:220," + "accept *:389," + "accept *:443," + "accept *:464," + "accept *:531," + "accept *:543-544," + "accept *:554," + "accept *:563," + "accept *:636," + "accept *:706," + "accept *:749," + "accept *:873," + "accept *:902-904," + "accept *:981," + "accept *:989-995," + "accept *:1194," + "accept *:1220," + "accept *:1293," + "accept *:1500," + "accept *:1533," + "accept *:1677," + "accept *:1723," + "accept *:1755," + "accept *:1863," + "accept *:2082," + "accept *:2083," + "accept *:2086-2087," + "accept *:2095-2096," + "accept *:2102-2104," + "accept *:3128," + "accept *:3389," + "accept *:3690," + "accept *:4321," + "accept *:4643," + "accept *:5050," + "accept *:5190," + "accept *:5222-5223," + "accept *:5228," + "accept *:5900," + "accept *:6660-6669," + "accept *:6679," + "accept *:6697," + "accept *:8000," + "accept *:8008," + "accept *:8074," + "accept *:8080," + "accept *:8087-8088," + "accept *:8332-8333," + "accept *:8443," + "accept *:8888," + "accept *:9418," + "accept *:9999," + "accept *:10000," + "accept *:11371," + "accept *:12350," + "accept *:19294," + "accept *:19638," + "accept *:23456," + "accept *:33033," + "accept *:64738," + "reject *:*", + "accept 20-23,43,53,79-81,88,110,143,194,220,389," + "443,464,531,543-544,554,563,636,706,749,873," + "902-904,981,989-995,1194,1220,1293,1500,1533," + "1677,1723,1755,1863,2082-2083,2086-2087," + "2095-2096,2102-2104,3128,3389,3690,4321,4643," + "5050,5190,5222-5223,5228,5900,6660-6669,6679," + "6697,8000,8008,8074,8080,8087-8088,8332-8333," + "8443,8888,9418,9999-10000,11371,12350,19294," + "19638,23456,33033,64738"); + /* short policy with configured addresses */ + test_policy_summary_helper("reject 149.56.1.1:*," + "reject [2607:5300:1:1::1:0]:*," + "accept *:80," + "accept *:443," + "reject *:*", + "accept 80,443"); + /* short policy with configured and local interface addresses */ + test_policy_summary_helper("reject 149.56.1.0:*," + "reject 149.56.1.1:*," + "reject 149.56.1.2:*," + "reject 149.56.1.3:*," + "reject 149.56.1.4:*," + "reject 149.56.1.5:*," + "reject 149.56.1.6:*," + "reject 149.56.1.7:*," + "reject [2607:5300:1:1::1:0]:*," + "reject [2607:5300:1:1::1:1]:*," + "reject [2607:5300:1:1::1:2]:*," + "reject [2607:5300:1:1::1:3]:*," + "reject [2607:5300:1:1::2:0]:*," + "reject [2607:5300:1:1::2:1]:*," + "reject [2607:5300:1:1::2:2]:*," + "reject [2607:5300:1:1::2:3]:*," + "accept *:80," + "accept *:443," + "reject *:*", + "accept 80,443"); + /* short policy with configured netblocks */ + test_policy_summary_helper("reject 149.56.0.0/16," + "reject6 2607:5300::/32," + "reject6 2608:5300::/64," + "reject6 2609:5300::/96," + "accept *:80," + "accept *:443," + "reject *:*", + "accept 80,443"); + /* short policy with large netblocks that do not count as a rejection */ + test_policy_summary_helper("reject 148.0.0.0/7," + "reject6 2600::/16," + "accept *:80," + "accept *:443," + "reject *:*", + "accept 80,443"); + /* short policy with large netblocks that count as a rejection */ + test_policy_summary_helper("reject 148.0.0.0/6," + "reject6 2600::/15," + "accept *:80," + "accept *:443," + "reject *:*", + "reject 1-65535"); + /* short policy with huge netblocks that count as a rejection */ + test_policy_summary_helper("reject 128.0.0.0/1," + "reject6 8000::/1," + "accept *:80," + "accept *:443," + "reject *:*", + "reject 1-65535"); + /* short policy which blocks everything using netblocks */ + test_policy_summary_helper("reject 0.0.0.0/0," + "reject6 ::/0," + "accept *:80," + "accept *:443," + "reject *:*", + "reject 1-65535"); + /* short policy which has repeated redundant netblocks */ + test_policy_summary_helper("reject 0.0.0.0/0," + "reject 0.0.0.0/0," + "reject 0.0.0.0/0," + "reject 0.0.0.0/0," + "reject 0.0.0.0/0," + "reject6 ::/0," + "reject6 ::/0," + "reject6 ::/0," + "reject6 ::/0," + "reject6 ::/0," + "accept *:80," + "accept *:443," + "reject *:*", + "reject 1-65535"); + + /* longest possible policy + * (1-2,4-5,... is longer, but gets reduced to 3,6,... ) + * Going all the way to 65535 is incredibly slow, so we just go slightly + * more than the expected length */ + test_policy_summary_helper("accept *:1," + "accept *:3," + "accept *:5," + "accept *:7," + "accept *:9," + "accept *:11," + "accept *:13," + "accept *:15," + "accept *:17," + "accept *:19," + "accept *:21," + "accept *:23," + "accept *:25," + "accept *:27," + "accept *:29," + "accept *:31," + "accept *:33," + "accept *:35," + "accept *:37," + "accept *:39," + "accept *:41," + "accept *:43," + "accept *:45," + "accept *:47," + "accept *:49," + "accept *:51," + "accept *:53," + "accept *:55," + "accept *:57," + "accept *:59," + "accept *:61," + "accept *:63," + "accept *:65," + "accept *:67," + "accept *:69," + "accept *:71," + "accept *:73," + "accept *:75," + "accept *:77," + "accept *:79," + "accept *:81," + "accept *:83," + "accept *:85," + "accept *:87," + "accept *:89," + "accept *:91," + "accept *:93," + "accept *:95," + "accept *:97," + "accept *:99," + "accept *:101," + "accept *:103," + "accept *:105," + "accept *:107," + "accept *:109," + "accept *:111," + "accept *:113," + "accept *:115," + "accept *:117," + "accept *:119," + "accept *:121," + "accept *:123," + "accept *:125," + "accept *:127," + "accept *:129," + "accept *:131," + "accept *:133," + "accept *:135," + "accept *:137," + "accept *:139," + "accept *:141," + "accept *:143," + "accept *:145," + "accept *:147," + "accept *:149," + "accept *:151," + "accept *:153," + "accept *:155," + "accept *:157," + "accept *:159," + "accept *:161," + "accept *:163," + "accept *:165," + "accept *:167," + "accept *:169," + "accept *:171," + "accept *:173," + "accept *:175," + "accept *:177," + "accept *:179," + "accept *:181," + "accept *:183," + "accept *:185," + "accept *:187," + "accept *:189," + "accept *:191," + "accept *:193," + "accept *:195," + "accept *:197," + "accept *:199," + "accept *:201," + "accept *:203," + "accept *:205," + "accept *:207," + "accept *:209," + "accept *:211," + "accept *:213," + "accept *:215," + "accept *:217," + "accept *:219," + "accept *:221," + "accept *:223," + "accept *:225," + "accept *:227," + "accept *:229," + "accept *:231," + "accept *:233," + "accept *:235," + "accept *:237," + "accept *:239," + "accept *:241," + "accept *:243," + "accept *:245," + "accept *:247," + "accept *:249," + "accept *:251," + "accept *:253," + "accept *:255," + "accept *:257," + "accept *:259," + "accept *:261," + "accept *:263," + "accept *:265," + "accept *:267," + "accept *:269," + "accept *:271," + "accept *:273," + "accept *:275," + "accept *:277," + "accept *:279," + "accept *:281," + "accept *:283," + "accept *:285," + "accept *:287," + "accept *:289," + "accept *:291," + "accept *:293," + "accept *:295," + "accept *:297," + "accept *:299," + "accept *:301," + "accept *:303," + "accept *:305," + "accept *:307," + "accept *:309," + "accept *:311," + "accept *:313," + "accept *:315," + "accept *:317," + "accept *:319," + "accept *:321," + "accept *:323," + "accept *:325," + "accept *:327," + "accept *:329," + "accept *:331," + "accept *:333," + "accept *:335," + "accept *:337," + "accept *:339," + "accept *:341," + "accept *:343," + "accept *:345," + "accept *:347," + "accept *:349," + "accept *:351," + "accept *:353," + "accept *:355," + "accept *:357," + "accept *:359," + "accept *:361," + "accept *:363," + "accept *:365," + "accept *:367," + "accept *:369," + "accept *:371," + "accept *:373," + "accept *:375," + "accept *:377," + "accept *:379," + "accept *:381," + "accept *:383," + "accept *:385," + "accept *:387," + "accept *:389," + "accept *:391," + "accept *:393," + "accept *:395," + "accept *:397," + "accept *:399," + "accept *:401," + "accept *:403," + "accept *:405," + "accept *:407," + "accept *:409," + "accept *:411," + "accept *:413," + "accept *:415," + "accept *:417," + "accept *:419," + "accept *:421," + "accept *:423," + "accept *:425," + "accept *:427," + "accept *:429," + "accept *:431," + "accept *:433," + "accept *:435," + "accept *:437," + "accept *:439," + "accept *:441," + "accept *:443," + "accept *:445," + "accept *:447," + "accept *:449," + "accept *:451," + "accept *:453," + "accept *:455," + "accept *:457," + "accept *:459," + "accept *:461," + "accept *:463," + "accept *:465," + "accept *:467," + "accept *:469," + "accept *:471," + "accept *:473," + "accept *:475," + "accept *:477," + "accept *:479," + "accept *:481," + "accept *:483," + "accept *:485," + "accept *:487," + "accept *:489," + "accept *:491," + "accept *:493," + "accept *:495," + "accept *:497," + "accept *:499," + "accept *:501," + "accept *:503," + "accept *:505," + "accept *:507," + "accept *:509," + "accept *:511," + "accept *:513," + "accept *:515," + "accept *:517," + "accept *:519," + "accept *:521," + "accept *:523," + "accept *:525," + "accept *:527," + "accept *:529," + "reject *:*", + "accept 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29," + "31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61," + "63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93," + "95,97,99,101,103,105,107,109,111,113,115,117," + "119,121,123,125,127,129,131,133,135,137,139,141," + "143,145,147,149,151,153,155,157,159,161,163,165," + "167,169,171,173,175,177,179,181,183,185,187,189," + "191,193,195,197,199,201,203,205,207,209,211,213," + "215,217,219,221,223,225,227,229,231,233,235,237," + "239,241,243,245,247,249,251,253,255,257,259,261," + "263,265,267,269,271,273,275,277,279,281,283,285," + "287,289,291,293,295,297,299,301,303,305,307,309," + "311,313,315,317,319,321,323,325,327,329,331,333," + "335,337,339,341,343,345,347,349,351,353,355,357," + "359,361,363,365,367,369,371,373,375,377,379,381," + "383,385,387,389,391,393,395,397,399,401,403,405," + "407,409,411,413,415,417,419,421,423,425,427,429," + "431,433,435,437,439,441,443,445,447,449,451,453," + "455,457,459,461,463,465,467,469,471,473,475,477," + "479,481,483,485,487,489,491,493,495,497,499,501," + "503,505,507,509,511,513,515,517,519,521,523"); + + /* Short policies with unrecognized formats should get accepted. */ + test_short_policy_parse("accept fred,2,3-5", "accept 2,3-5"); + test_short_policy_parse("accept 2,fred,3", "accept 2,3"); + test_short_policy_parse("accept 2,fred,3,bob", "accept 2,3"); + test_short_policy_parse("accept 2,-3,500-600", "accept 2,500-600"); + /* Short policies with nil entries are accepted too. */ + test_short_policy_parse("accept 1,,3", "accept 1,3"); + test_short_policy_parse("accept 100-200,,", "accept 100-200"); + test_short_policy_parse("reject ,1-10,,,,30-40", "reject 1-10,30-40"); + + /* Try parsing various broken short policies */ +#define TT_BAD_SHORT_POLICY(s) \ + do { \ + tt_ptr_op(NULL, OP_EQ, (short_parsed = parse_short_policy((s)))); \ + } while (0) + TT_BAD_SHORT_POLICY("accept 200-199"); + TT_BAD_SHORT_POLICY(""); + TT_BAD_SHORT_POLICY("rejekt 1,2,3"); + TT_BAD_SHORT_POLICY("reject "); + TT_BAD_SHORT_POLICY("reject"); + TT_BAD_SHORT_POLICY("rej"); + TT_BAD_SHORT_POLICY("accept 2,3,100000"); + TT_BAD_SHORT_POLICY("accept 2,3x,4"); + TT_BAD_SHORT_POLICY("accept 2,3x,4"); + TT_BAD_SHORT_POLICY("accept 2-"); + TT_BAD_SHORT_POLICY("accept 2-x"); + TT_BAD_SHORT_POLICY("accept 1-,3"); + TT_BAD_SHORT_POLICY("accept 1-,3"); + + /* Make sure that IPv4 addresses are ignored in accept6/reject6 lines. */ + p = router_parse_addr_policy_item_from_string("accept6 1.2.3.4:*", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(!malformed_list); + + p = router_parse_addr_policy_item_from_string("reject6 2.4.6.0/24:*", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(!malformed_list); + + p = router_parse_addr_policy_item_from_string("accept6 *4:*", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(!malformed_list); + + /* Make sure malformed policies are detected as such. */ + p = router_parse_addr_policy_item_from_string("bad_token *4:*", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + + p = router_parse_addr_policy_item_from_string("accept6 **:*", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + + p = router_parse_addr_policy_item_from_string("accept */15:*", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + + p = router_parse_addr_policy_item_from_string("reject6 */:*", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + + p = router_parse_addr_policy_item_from_string("accept 127.0.0.1/33:*", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + + p = router_parse_addr_policy_item_from_string("accept6 [::1]/129:*", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + + p = router_parse_addr_policy_item_from_string("reject 8.8.8.8/-1:*", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + + p = router_parse_addr_policy_item_from_string("reject 8.8.4.4:10-5", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + + p = router_parse_addr_policy_item_from_string("reject 1.2.3.4:-1", -1, + &malformed_list); + tt_ptr_op(p, OP_EQ, NULL); + tt_assert(malformed_list); + + /* Test a too-long policy. */ + { + char *policy_strng = NULL; + smartlist_t *chunks = smartlist_new(); + smartlist_add_strdup(chunks, "accept "); + for (i=1; i<10000; ++i) + smartlist_add_asprintf(chunks, "%d,", i); + smartlist_add_strdup(chunks, "20000"); + policy_strng = smartlist_join_strings(chunks, "", 0, NULL); + SMARTLIST_FOREACH(chunks, char *, ch, tor_free(ch)); + smartlist_free(chunks); + short_parsed = parse_short_policy(policy_strng);/* shouldn't be accepted */ + tor_free(policy_strng); + tt_ptr_op(NULL, OP_EQ, short_parsed); + } + + /* truncation ports */ + sm = smartlist_new(); + for (i=1; i<2000; i+=2) { + char buf[POLICY_BUF_LEN]; + tor_snprintf(buf, sizeof(buf), "reject *:%d", i); + smartlist_add_strdup(sm, buf); + } + smartlist_add_strdup(sm, "accept *:*"); + policy_str = smartlist_join_strings(sm, ",", 0, NULL); + test_policy_summary_helper( policy_str, + "accept 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44," + "46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90," + "92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128," + "130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164," + "166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200," + "202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236," + "238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272," + "274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308," + "310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344," + "346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380," + "382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412,414,416," + "418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452," + "454,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488," + "490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522"); + + done: + addr_policy_list_free(policy); + addr_policy_list_free(policy2); + addr_policy_list_free(policy3); + addr_policy_list_free(policy4); + addr_policy_list_free(policy5); + addr_policy_list_free(policy6); + addr_policy_list_free(policy7); + addr_policy_list_free(policy8); + addr_policy_list_free(policy9); + addr_policy_list_free(policy10); + addr_policy_list_free(policy11); + addr_policy_list_free(policy12); + tor_free(policy_str); + if (sm) { + SMARTLIST_FOREACH(sm, char *, s, tor_free(s)); + smartlist_free(sm); + } + short_policy_free(short_parsed); +} + +/** Helper: Check that policy_list contains address */ +static int +test_policy_has_address_helper(const smartlist_t *policy_list, + const tor_addr_t *addr) +{ + int found = 0; + + tt_assert(policy_list); + tt_assert(addr); + + SMARTLIST_FOREACH_BEGIN(policy_list, addr_policy_t*, p) { + if (tor_addr_eq(&p->addr, addr)) { + found = 1; + } + } SMARTLIST_FOREACH_END(p); + + return found; + + done: + return 0; +} + +#define TEST_IPV4_ADDR (0x01020304) +#define TEST_IPV6_ADDR ("2002::abcd") + +/** Run unit tests for rejecting the configured addresses on this exit relay + * using policies_parse_exit_policy_reject_private */ +static void +test_policies_reject_exit_address(void *arg) +{ + smartlist_t *policy = NULL; + tor_addr_t ipv4_addr, ipv6_addr; + smartlist_t *ipv4_list, *ipv6_list, *both_list, *dupl_list; + (void)arg; + + tor_addr_from_ipv4h(&ipv4_addr, TEST_IPV4_ADDR); + tor_addr_parse(&ipv6_addr, TEST_IPV6_ADDR); + + ipv4_list = smartlist_new(); + ipv6_list = smartlist_new(); + both_list = smartlist_new(); + dupl_list = smartlist_new(); + + smartlist_add(ipv4_list, &ipv4_addr); + smartlist_add(both_list, &ipv4_addr); + smartlist_add(dupl_list, &ipv4_addr); + smartlist_add(dupl_list, &ipv4_addr); + smartlist_add(dupl_list, &ipv4_addr); + + smartlist_add(ipv6_list, &ipv6_addr); + smartlist_add(both_list, &ipv6_addr); + smartlist_add(dupl_list, &ipv6_addr); + smartlist_add(dupl_list, &ipv6_addr); + + /* IPv4-Only Exits */ + + /* test that IPv4 addresses are rejected on an IPv4-only exit */ + policies_parse_exit_policy_reject_private(&policy, 0, ipv4_list, 0, 0); + tt_assert(policy); + tt_int_op(smartlist_len(policy), OP_EQ, 1); + tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); + addr_policy_list_free(policy); + policy = NULL; + + /* test that IPv6 addresses are NOT rejected on an IPv4-only exit + * (all IPv6 addresses are rejected by policies_parse_exit_policy_internal + * on IPv4-only exits, so policies_parse_exit_policy_reject_private doesn't + * need to do anything) */ + policies_parse_exit_policy_reject_private(&policy, 0, ipv6_list, 0, 0); + tt_ptr_op(policy, OP_EQ, NULL); + + /* test that only IPv4 addresses are rejected on an IPv4-only exit */ + policies_parse_exit_policy_reject_private(&policy, 0, both_list, 0, 0); + tt_assert(policy); + tt_int_op(smartlist_len(policy), OP_EQ, 1); + tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); + addr_policy_list_free(policy); + policy = NULL; + + /* Test that lists with duplicate entries produce the same results */ + policies_parse_exit_policy_reject_private(&policy, 0, dupl_list, 0, 0); + tt_assert(policy); + tt_int_op(smartlist_len(policy), OP_EQ, 1); + tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); + addr_policy_list_free(policy); + policy = NULL; + + /* IPv4/IPv6 Exits */ + + /* test that IPv4 addresses are rejected on an IPv4/IPv6 exit */ + policies_parse_exit_policy_reject_private(&policy, 1, ipv4_list, 0, 0); + tt_assert(policy); + tt_int_op(smartlist_len(policy), OP_EQ, 1); + tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); + addr_policy_list_free(policy); + policy = NULL; + + /* test that IPv6 addresses are rejected on an IPv4/IPv6 exit */ + policies_parse_exit_policy_reject_private(&policy, 1, ipv6_list, 0, 0); + tt_assert(policy); + tt_int_op(smartlist_len(policy), OP_EQ, 1); + tt_assert(test_policy_has_address_helper(policy, &ipv6_addr)); + addr_policy_list_free(policy); + policy = NULL; + + /* test that IPv4 and IPv6 addresses are rejected on an IPv4/IPv6 exit */ + policies_parse_exit_policy_reject_private(&policy, 1, both_list, 0, 0); + tt_assert(policy); + tt_int_op(smartlist_len(policy), OP_EQ, 2); + tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); + tt_assert(test_policy_has_address_helper(policy, &ipv6_addr)); + addr_policy_list_free(policy); + policy = NULL; + + /* Test that lists with duplicate entries produce the same results */ + policies_parse_exit_policy_reject_private(&policy, 1, dupl_list, 0, 0); + tt_assert(policy); + tt_int_op(smartlist_len(policy), OP_EQ, 2); + tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); + tt_assert(test_policy_has_address_helper(policy, &ipv6_addr)); + addr_policy_list_free(policy); + policy = NULL; + + done: + addr_policy_list_free(policy); + smartlist_free(ipv4_list); + smartlist_free(ipv6_list); + smartlist_free(both_list); + smartlist_free(dupl_list); +} + +static smartlist_t *test_configured_ports = NULL; + +/** Returns test_configured_ports */ +static const smartlist_t * +mock_get_configured_ports(void) +{ + return test_configured_ports; +} + +/** Run unit tests for rejecting publicly routable configured port addresses + * on this exit relay using policies_parse_exit_policy_reject_private */ +static void +test_policies_reject_port_address(void *arg) +{ + smartlist_t *policy = NULL; + port_cfg_t *ipv4_port = NULL; + port_cfg_t *ipv6_port = NULL; + (void)arg; + + test_configured_ports = smartlist_new(); + + ipv4_port = port_cfg_new(0); + tor_addr_from_ipv4h(&ipv4_port->addr, TEST_IPV4_ADDR); + smartlist_add(test_configured_ports, ipv4_port); + + ipv6_port = port_cfg_new(0); + tor_addr_parse(&ipv6_port->addr, TEST_IPV6_ADDR); + smartlist_add(test_configured_ports, ipv6_port); + + MOCK(get_configured_ports, mock_get_configured_ports); + + /* test that an IPv4 port is rejected on an IPv4-only exit, but an IPv6 port + * is NOT rejected (all IPv6 addresses are rejected by + * policies_parse_exit_policy_internal on IPv4-only exits, so + * policies_parse_exit_policy_reject_private doesn't need to do anything + * with IPv6 addresses on IPv4-only exits) */ + policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 1); + tt_assert(policy); + tt_int_op(smartlist_len(policy), OP_EQ, 1); + tt_assert(test_policy_has_address_helper(policy, &ipv4_port->addr)); + addr_policy_list_free(policy); + policy = NULL; + + /* test that IPv4 and IPv6 ports are rejected on an IPv4/IPv6 exit */ + policies_parse_exit_policy_reject_private(&policy, 1, NULL, 0, 1); + tt_assert(policy); + tt_int_op(smartlist_len(policy), OP_EQ, 2); + tt_assert(test_policy_has_address_helper(policy, &ipv4_port->addr)); + tt_assert(test_policy_has_address_helper(policy, &ipv6_port->addr)); + addr_policy_list_free(policy); + policy = NULL; + + done: + addr_policy_list_free(policy); + if (test_configured_ports) { + SMARTLIST_FOREACH(test_configured_ports, + port_cfg_t *, p, port_cfg_free(p)); + smartlist_free(test_configured_ports); + test_configured_ports = NULL; + } + UNMOCK(get_configured_ports); +} + +static smartlist_t *mock_ipv4_addrs = NULL; +static smartlist_t *mock_ipv6_addrs = NULL; + +/* mock get_interface_address6_list, returning a deep copy of the template + * address list ipv4_interface_address_list or ipv6_interface_address_list */ +static smartlist_t * +mock_get_interface_address6_list(int severity, + sa_family_t family, + int include_internal) +{ + (void)severity; + (void)include_internal; + smartlist_t *clone_list = smartlist_new(); + smartlist_t *template_list = NULL; + + if (family == AF_INET) { + template_list = mock_ipv4_addrs; + } else if (family == AF_INET6) { + template_list = mock_ipv6_addrs; + } else { + return NULL; + } + + tt_assert(template_list); + + SMARTLIST_FOREACH_BEGIN(template_list, tor_addr_t *, src_addr) { + tor_addr_t *dest_addr = tor_malloc(sizeof(tor_addr_t)); + memset(dest_addr, 0, sizeof(*dest_addr)); + tor_addr_copy_tight(dest_addr, src_addr); + smartlist_add(clone_list, dest_addr); + } SMARTLIST_FOREACH_END(src_addr); + + return clone_list; + + done: + interface_address6_list_free(clone_list); + return NULL; +} + +/** Run unit tests for rejecting publicly routable interface addresses on this + * exit relay using policies_parse_exit_policy_reject_private */ +static void +test_policies_reject_interface_address(void *arg) +{ + smartlist_t *policy = NULL; + smartlist_t *public_ipv4_addrs = + get_interface_address6_list(LOG_INFO, AF_INET, 0); + smartlist_t *public_ipv6_addrs = + get_interface_address6_list(LOG_INFO, AF_INET6, 0); + tor_addr_t ipv4_addr, ipv6_addr; + (void)arg; + + /* test that no addresses are rejected when none are supplied/requested */ + policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 0); + tt_ptr_op(policy, OP_EQ, NULL); + + /* test that only IPv4 interface addresses are rejected on an IPv4-only exit + * (and allow for duplicates) + */ + policies_parse_exit_policy_reject_private(&policy, 0, NULL, 1, 0); + if (policy) { + tt_assert(smartlist_len(policy) <= smartlist_len(public_ipv4_addrs)); + addr_policy_list_free(policy); + policy = NULL; + } + + /* test that IPv4 and IPv6 interface addresses are rejected on an IPv4/IPv6 + * exit (and allow for duplicates) */ + policies_parse_exit_policy_reject_private(&policy, 1, NULL, 1, 0); + if (policy) { + tt_assert(smartlist_len(policy) <= (smartlist_len(public_ipv4_addrs) + + smartlist_len(public_ipv6_addrs))); + addr_policy_list_free(policy); + policy = NULL; + } + + /* Now do it all again, but mocked */ + tor_addr_from_ipv4h(&ipv4_addr, TEST_IPV4_ADDR); + mock_ipv4_addrs = smartlist_new(); + smartlist_add(mock_ipv4_addrs, (void *)&ipv4_addr); + + tor_addr_parse(&ipv6_addr, TEST_IPV6_ADDR); + mock_ipv6_addrs = smartlist_new(); + smartlist_add(mock_ipv6_addrs, (void *)&ipv6_addr); + + MOCK(get_interface_address6_list, mock_get_interface_address6_list); + + /* test that no addresses are rejected when none are supplied/requested */ + policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 0); + tt_ptr_op(policy, OP_EQ, NULL); + + /* test that only IPv4 interface addresses are rejected on an IPv4-only exit + */ + policies_parse_exit_policy_reject_private(&policy, 0, NULL, 1, 0); + tt_assert(policy); + tt_assert(smartlist_len(policy) == smartlist_len(mock_ipv4_addrs)); + addr_policy_list_free(policy); + policy = NULL; + + /* test that IPv4 and IPv6 interface addresses are rejected on an IPv4/IPv6 + * exit */ + policies_parse_exit_policy_reject_private(&policy, 1, NULL, 1, 0); + tt_assert(policy); + tt_assert(smartlist_len(policy) == (smartlist_len(mock_ipv4_addrs) + + smartlist_len(mock_ipv6_addrs))); + addr_policy_list_free(policy); + policy = NULL; + + done: + addr_policy_list_free(policy); + interface_address6_list_free(public_ipv4_addrs); + interface_address6_list_free(public_ipv6_addrs); + + UNMOCK(get_interface_address6_list); + /* we don't use interface_address6_list_free on these lists because their + * address pointers are stack-based */ + smartlist_free(mock_ipv4_addrs); + smartlist_free(mock_ipv6_addrs); +} + +#undef TEST_IPV4_ADDR +#undef TEST_IPV6_ADDR + +static void +test_dump_exit_policy_to_string(void *arg) +{ + char *ep; + addr_policy_t *policy_entry; + int malformed_list = -1; + + routerinfo_t *ri = tor_malloc_zero(sizeof(routerinfo_t)); + + (void)arg; + + ri->policy_is_reject_star = 1; + ri->exit_policy = NULL; // expecting "reject *:*" + ep = router_dump_exit_policy_to_string(ri,1,1); + + tt_str_op("reject *:*",OP_EQ, ep); + + tor_free(ep); + + ri->exit_policy = smartlist_new(); + ri->policy_is_reject_star = 0; + + policy_entry = router_parse_addr_policy_item_from_string("accept *:*", -1, + &malformed_list); + + smartlist_add(ri->exit_policy,policy_entry); + + ep = router_dump_exit_policy_to_string(ri,1,1); + + tt_str_op("accept *:*",OP_EQ, ep); + + tor_free(ep); + + policy_entry = router_parse_addr_policy_item_from_string("reject *:25", -1, + &malformed_list); + + smartlist_add(ri->exit_policy,policy_entry); + + ep = router_dump_exit_policy_to_string(ri,1,1); + + tt_str_op("accept *:*\nreject *:25",OP_EQ, ep); + + tor_free(ep); + + policy_entry = + router_parse_addr_policy_item_from_string("reject 8.8.8.8:*", -1, + &malformed_list); + + smartlist_add(ri->exit_policy,policy_entry); + + ep = router_dump_exit_policy_to_string(ri,1,1); + + tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*",OP_EQ, ep); + tor_free(ep); + + policy_entry = + router_parse_addr_policy_item_from_string("reject6 [FC00::]/7:*", -1, + &malformed_list); + + smartlist_add(ri->exit_policy,policy_entry); + + ep = router_dump_exit_policy_to_string(ri,1,1); + + tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*\n" + "reject6 [fc00::]/7:*",OP_EQ, ep); + tor_free(ep); + + policy_entry = + router_parse_addr_policy_item_from_string("accept6 [c000::]/3:*", -1, + &malformed_list); + + smartlist_add(ri->exit_policy,policy_entry); + + ep = router_dump_exit_policy_to_string(ri,1,1); + + tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*\n" + "reject6 [fc00::]/7:*\naccept6 [c000::]/3:*",OP_EQ, ep); + + done: + + if (ri->exit_policy) { + SMARTLIST_FOREACH(ri->exit_policy, addr_policy_t *, + entry, addr_policy_free(entry)); + smartlist_free(ri->exit_policy); + } + tor_free(ri); + tor_free(ep); +} + +static routerinfo_t *mock_desc_routerinfo = NULL; +static const routerinfo_t * +mock_router_get_my_routerinfo(void) +{ + return mock_desc_routerinfo; +} + +#define DEFAULT_POLICY_STRING "reject *:*" +#define TEST_IPV4_ADDR (0x02040608) +#define TEST_IPV6_ADDR ("2003::ef01") + +static or_options_t mock_options; + +static const or_options_t * +mock_get_options(void) +{ + return &mock_options; +} + +/** Run unit tests for generating summary lines of exit policies */ +static void +test_policies_getinfo_helper_policies(void *arg) +{ + (void)arg; + int rv = 0; + size_t ipv4_len = 0, ipv6_len = 0; + char *answer = NULL; + const char *errmsg = NULL; + routerinfo_t mock_my_routerinfo; + + memset(&mock_my_routerinfo, 0, sizeof(mock_my_routerinfo)); + + rv = getinfo_helper_policies(NULL, "exit-policy/default", &answer, &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + tt_assert(strlen(answer) > 0); + tor_free(answer); + + rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/default", + &answer, &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + tt_assert(strlen(answer) > 0); + tor_free(answer); + + memset(&mock_my_routerinfo, 0, sizeof(routerinfo_t)); + MOCK(router_get_my_routerinfo, mock_router_get_my_routerinfo); + mock_my_routerinfo.exit_policy = smartlist_new(); + mock_desc_routerinfo = &mock_my_routerinfo; + + memset(&mock_options, 0, sizeof(or_options_t)); + MOCK(get_options, mock_get_options); + + rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay", + &answer, &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + tt_assert(strlen(answer) == 0); + tor_free(answer); + + rv = getinfo_helper_policies(NULL, "exit-policy/ipv4", &answer, + &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + ipv4_len = strlen(answer); + tt_assert(ipv4_len == 0 || ipv4_len == strlen(DEFAULT_POLICY_STRING)); + tt_assert(ipv4_len == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING)); + tor_free(answer); + + rv = getinfo_helper_policies(NULL, "exit-policy/ipv6", &answer, + &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + ipv6_len = strlen(answer); + tt_assert(ipv6_len == 0 || ipv6_len == strlen(DEFAULT_POLICY_STRING)); + tt_assert(ipv6_len == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING)); + tor_free(answer); + + rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer, + &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + /* It's either empty or it's the default */ + tt_assert(strlen(answer) == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING)); + tor_free(answer); + + mock_my_routerinfo.addr = TEST_IPV4_ADDR; + tor_addr_parse(&mock_my_routerinfo.ipv6_addr, TEST_IPV6_ADDR); + append_exit_policy_string(&mock_my_routerinfo.exit_policy, "accept *4:*"); + append_exit_policy_string(&mock_my_routerinfo.exit_policy, "reject *6:*"); + + mock_options.IPv6Exit = 1; + tor_addr_from_ipv4h( + &mock_options.OutboundBindAddresses[OUTBOUND_ADDR_EXIT][0], + TEST_IPV4_ADDR); + tor_addr_parse( + &mock_options.OutboundBindAddresses[OUTBOUND_ADDR_EXIT][1], + TEST_IPV6_ADDR); + + mock_options.ExitPolicyRejectPrivate = 1; + mock_options.ExitPolicyRejectLocalInterfaces = 1; + + rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay", + &answer, &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + tt_assert(strlen(answer) > 0); + tor_free(answer); + + mock_options.ExitPolicyRejectPrivate = 1; + mock_options.ExitPolicyRejectLocalInterfaces = 0; + + rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay", + &answer, &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + tt_assert(strlen(answer) > 0); + tor_free(answer); + + mock_options.ExitPolicyRejectPrivate = 0; + mock_options.ExitPolicyRejectLocalInterfaces = 1; + + rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay", + &answer, &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + tt_assert(strlen(answer) > 0); + tor_free(answer); + + mock_options.ExitPolicyRejectPrivate = 0; + mock_options.ExitPolicyRejectLocalInterfaces = 0; + + rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay", + &answer, &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + tt_assert(strlen(answer) == 0); + tor_free(answer); + + rv = getinfo_helper_policies(NULL, "exit-policy/ipv4", &answer, + &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + ipv4_len = strlen(answer); + tt_assert(ipv4_len > 0); + tor_free(answer); + + rv = getinfo_helper_policies(NULL, "exit-policy/ipv6", &answer, + &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + ipv6_len = strlen(answer); + tt_assert(ipv6_len > 0); + tor_free(answer); + + rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer, + &errmsg); + tt_int_op(rv, OP_EQ, 0); + tt_ptr_op(answer, OP_NE, NULL); + tt_assert(strlen(answer) > 0); + tt_assert(strlen(answer) == ipv4_len + ipv6_len + 1); + tor_free(answer); + + done: + tor_free(answer); + UNMOCK(get_options); + UNMOCK(router_get_my_routerinfo); + addr_policy_list_free(mock_my_routerinfo.exit_policy); +} + +#undef DEFAULT_POLICY_STRING +#undef TEST_IPV4_ADDR +#undef TEST_IPV6_ADDR + +#define TEST_IPV4_ADDR_STR "1.2.3.4" +#define TEST_IPV6_ADDR_STR "[1002::4567]" +#define REJECT_IPv4_FINAL_STR "reject 0.0.0.0/0:*" +#define REJECT_IPv6_FINAL_STR "reject [::]/0:*" + +#define OTHER_IPV4_ADDR_STR "6.7.8.9" +#define OTHER_IPV6_ADDR_STR "[afff::]" + +/** Run unit tests for fascist_firewall_allows_address */ +static void +test_policies_fascist_firewall_allows_address(void *arg) +{ + (void)arg; + tor_addr_t ipv4_addr, ipv6_addr, r_ipv4_addr, r_ipv6_addr; + tor_addr_t n_ipv4_addr, n_ipv6_addr; + const uint16_t port = 1234; + smartlist_t *policy = NULL; + smartlist_t *e_policy = NULL; + addr_policy_t *item = NULL; + int malformed_list = 0; + + /* Setup the options and the items in the policies */ + memset(&mock_options, 0, sizeof(or_options_t)); + MOCK(get_options, mock_get_options); + + policy = smartlist_new(); + item = router_parse_addr_policy_item_from_string("accept " + TEST_IPV4_ADDR_STR ":*", + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(item); + tt_assert(!malformed_list); + smartlist_add(policy, item); + item = router_parse_addr_policy_item_from_string("accept " + TEST_IPV6_ADDR_STR, + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(item); + tt_assert(!malformed_list); + smartlist_add(policy, item); + /* Normally, policy_expand_unspec would do this for us */ + item = router_parse_addr_policy_item_from_string(REJECT_IPv4_FINAL_STR, + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(item); + tt_assert(!malformed_list); + smartlist_add(policy, item); + item = router_parse_addr_policy_item_from_string(REJECT_IPv6_FINAL_STR, + ADDR_POLICY_ACCEPT, + &malformed_list); + tt_assert(item); + tt_assert(!malformed_list); + smartlist_add(policy, item); + item = NULL; + + e_policy = smartlist_new(); + + /* + char *polstr = policy_dump_to_string(policy, 1, 1); + printf("%s\n", polstr); + tor_free(polstr); + */ + + /* Parse the addresses */ + tor_addr_parse(&ipv4_addr, TEST_IPV4_ADDR_STR); + tor_addr_parse(&ipv6_addr, TEST_IPV6_ADDR_STR); + tor_addr_parse(&r_ipv4_addr, OTHER_IPV4_ADDR_STR); + tor_addr_parse(&r_ipv6_addr, OTHER_IPV6_ADDR_STR); + tor_addr_make_null(&n_ipv4_addr, AF_INET); + tor_addr_make_null(&n_ipv6_addr, AF_INET6); + + /* Test the function's address matching with IPv4 and IPv6 on */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ClientUseIPv4 = 1; + mock_options.ClientUseIPv6 = 1; + mock_options.UseBridges = 0; + + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), + OP_EQ, 0); + + /* Preferring IPv4 */ + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0), + OP_EQ, 0); + + /* Preferring IPv6 */ + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1), + OP_EQ, 0); + + /* Test the function's address matching with UseBridges on */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ClientUseIPv4 = 1; + mock_options.ClientUseIPv6 = 1; + mock_options.UseBridges = 1; + + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), + OP_EQ, 0); + + /* Preferring IPv4 */ + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0), + OP_EQ, 0); + + /* Preferring IPv6 */ + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1), + OP_EQ, 0); + + /* bridge clients always use IPv6, regardless of ClientUseIPv6 */ + mock_options.ClientUseIPv4 = 1; + mock_options.ClientUseIPv6 = 0; + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), + OP_EQ, 0); + + /* Test the function's address matching with IPv4 on */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ClientUseIPv4 = 1; + mock_options.ClientUseIPv6 = 0; + mock_options.UseBridges = 0; + + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), + OP_EQ, 0); + + /* Test the function's address matching with IPv6 on */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ClientUseIPv4 = 0; + mock_options.ClientUseIPv6 = 1; + mock_options.UseBridges = 0; + + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), + OP_EQ, 0); + + /* Test the function's address matching with ClientUseIPv4 0. + * This means "use IPv6" regardless of the other settings. */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ClientUseIPv4 = 0; + mock_options.ClientUseIPv6 = 0; + mock_options.UseBridges = 0; + + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), + OP_EQ, 0); + + /* Test the function's address matching for unusual inputs */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ClientUseIPv4 = 1; + mock_options.ClientUseIPv6 = 1; + mock_options.UseBridges = 1; + + /* NULL and tor_addr_is_null addresses are rejected */ + tt_int_op(fascist_firewall_allows_address(NULL, port, policy, 0, 0), OP_EQ, + 0); + tt_int_op(fascist_firewall_allows_address(&n_ipv4_addr, port, policy, 0, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&n_ipv6_addr, port, policy, 0, 0), + OP_EQ, 0); + + /* zero ports are rejected */ + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, 0, policy, 0, 0), + OP_EQ, 0); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, 0, policy, 0, 0), + OP_EQ, 0); + + /* NULL and empty policies accept everything */ + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, NULL, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, NULL, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, e_policy, 0, 0), + OP_EQ, 1); + tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, e_policy, 0, 0), + OP_EQ, 1); + + done: + addr_policy_free(item); + addr_policy_list_free(policy); + addr_policy_list_free(e_policy); + UNMOCK(get_options); +} + +#undef REJECT_IPv4_FINAL_STR +#undef REJECT_IPv6_FINAL_STR +#undef OTHER_IPV4_ADDR_STR +#undef OTHER_IPV6_ADDR_STR + +#define TEST_IPV4_OR_PORT 1234 +#define TEST_IPV4_DIR_PORT 2345 +#define TEST_IPV6_OR_PORT 61234 +#define TEST_IPV6_DIR_PORT 62345 + +/* Check that fascist_firewall_choose_address_rs() returns the expected + * results. */ +#define CHECK_CHOSEN_ADDR_RS(fake_rs, fw_connection, pref_only, expect_rv, \ + expect_ap) \ + STMT_BEGIN \ + tor_addr_port_t chosen_rs_ap; \ + tor_addr_make_null(&chosen_rs_ap.addr, AF_INET); \ + chosen_rs_ap.port = 0; \ + tt_int_op(fascist_firewall_choose_address_rs(&(fake_rs), \ + (fw_connection), \ + (pref_only), \ + &chosen_rs_ap), \ + OP_EQ, (expect_rv)); \ + tt_assert(tor_addr_eq(&(expect_ap).addr, &chosen_rs_ap.addr)); \ + tt_int_op((expect_ap).port, OP_EQ, chosen_rs_ap.port); \ + STMT_END + +/* Check that fascist_firewall_choose_address_node() returns the expected + * results. */ +#define CHECK_CHOSEN_ADDR_NODE(fake_node, fw_connection, pref_only, \ + expect_rv, expect_ap) \ + STMT_BEGIN \ + tor_addr_port_t chosen_node_ap; \ + tor_addr_make_null(&chosen_node_ap.addr, AF_INET); \ + chosen_node_ap.port = 0; \ + tt_int_op(fascist_firewall_choose_address_node(&(fake_node), \ + (fw_connection), \ + (pref_only), \ + &chosen_node_ap), \ + OP_EQ, (expect_rv)); \ + tt_assert(tor_addr_eq(&(expect_ap).addr, &chosen_node_ap.addr)); \ + tt_int_op((expect_ap).port, OP_EQ, chosen_node_ap.port); \ + STMT_END + +/* Check that fascist_firewall_choose_address_rs and + * fascist_firewall_choose_address_node() both return the expected results. */ +#define CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, fw_connection, pref_only, \ + expect_rv, expect_ap) \ + STMT_BEGIN \ + CHECK_CHOSEN_ADDR_RS(fake_rs, fw_connection, pref_only, expect_rv, \ + expect_ap); \ + CHECK_CHOSEN_ADDR_NODE(fake_node, fw_connection, pref_only, expect_rv, \ + expect_ap); \ + STMT_END + +/** Run unit tests for fascist_firewall_choose_address */ +static void +test_policies_fascist_firewall_choose_address(void *arg) +{ + (void)arg; + tor_addr_port_t ipv4_or_ap, ipv4_dir_ap, ipv6_or_ap, ipv6_dir_ap; + tor_addr_port_t n_ipv4_ap, n_ipv6_ap; + + /* Setup the options */ + memset(&mock_options, 0, sizeof(or_options_t)); + MOCK(get_options, mock_get_options); + + /* Parse the addresses */ + tor_addr_parse(&ipv4_or_ap.addr, TEST_IPV4_ADDR_STR); + ipv4_or_ap.port = TEST_IPV4_OR_PORT; + tor_addr_parse(&ipv4_dir_ap.addr, TEST_IPV4_ADDR_STR); + ipv4_dir_ap.port = TEST_IPV4_DIR_PORT; + + tor_addr_parse(&ipv6_or_ap.addr, TEST_IPV6_ADDR_STR); + ipv6_or_ap.port = TEST_IPV6_OR_PORT; + tor_addr_parse(&ipv6_dir_ap.addr, TEST_IPV6_ADDR_STR); + ipv6_dir_ap.port = TEST_IPV6_DIR_PORT; + + tor_addr_make_null(&n_ipv4_ap.addr, AF_INET); + n_ipv4_ap.port = 0; + tor_addr_make_null(&n_ipv6_ap.addr, AF_INET6); + n_ipv6_ap.port = 0; + + /* Sanity check fascist_firewall_choose_address with IPv4 and IPv6 on */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ClientUseIPv4 = 1; + mock_options.ClientUseIPv6 = 1; + mock_options.UseBridges = 0; + + /* Prefer IPv4 */ + tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1, + FIREWALL_OR_CONNECTION, 0, 0) + == &ipv4_or_ap); + tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1, + FIREWALL_OR_CONNECTION, 1, 0) + == &ipv4_or_ap); + tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 1, + FIREWALL_DIR_CONNECTION, 0, 0) + == &ipv4_dir_ap); + tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 1, + FIREWALL_DIR_CONNECTION, 1, 0) + == &ipv4_dir_ap); + + /* Prefer IPv6 */ + tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0, + FIREWALL_OR_CONNECTION, 0, 1) + == &ipv6_or_ap); + tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0, + FIREWALL_OR_CONNECTION, 1, 1) + == &ipv6_or_ap); + tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 0, + FIREWALL_DIR_CONNECTION, 0, 1) + == &ipv6_dir_ap); + tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 0, + FIREWALL_DIR_CONNECTION, 1, 1) + == &ipv6_dir_ap); + + /* Unusual inputs */ + + /* null preferred OR addresses */ + tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &n_ipv6_ap, 0, + FIREWALL_OR_CONNECTION, 0, 1) + == &ipv4_or_ap); + tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &ipv6_or_ap, 1, + FIREWALL_OR_CONNECTION, 0, 0) + == &ipv6_or_ap); + + /* null both OR addresses */ + tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0, + FIREWALL_OR_CONNECTION, 0, 1), + OP_EQ, NULL); + tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1, + FIREWALL_OR_CONNECTION, 0, 0), + OP_EQ, NULL); + + /* null preferred Dir addresses */ + tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &n_ipv6_ap, 0, + FIREWALL_DIR_CONNECTION, 0, 1) + == &ipv4_dir_ap); + tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &ipv6_dir_ap, 1, + FIREWALL_DIR_CONNECTION, 0, 0) + == &ipv6_dir_ap); + + /* null both Dir addresses */ + tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0, + FIREWALL_DIR_CONNECTION, 0, 1), + OP_EQ, NULL); + tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1, + FIREWALL_DIR_CONNECTION, 0, 0), + OP_EQ, NULL); + + /* Prefer IPv4 but want IPv6 (contradictory) */ + tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0, + FIREWALL_OR_CONNECTION, 0, 0) + == &ipv4_or_ap); + tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0, + FIREWALL_OR_CONNECTION, 1, 0) + == &ipv4_or_ap); + + /* Prefer IPv6 but want IPv4 (contradictory) */ + tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1, + FIREWALL_OR_CONNECTION, 0, 1) + == &ipv6_or_ap); + tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1, + FIREWALL_OR_CONNECTION, 1, 1) + == &ipv6_or_ap); + + /* Make a fake rs. There will be no corresponding node. + * This is what happens when there's no consensus and we're bootstrapping + * from authorities / fallbacks. */ + routerstatus_t fake_rs; + memset(&fake_rs, 0, sizeof(routerstatus_t)); + /* In a routerstatus, the OR and Dir addresses are the same */ + fake_rs.addr = tor_addr_to_ipv4h(&ipv4_or_ap.addr); + fake_rs.or_port = ipv4_or_ap.port; + fake_rs.dir_port = ipv4_dir_ap.port; + + tor_addr_copy(&fake_rs.ipv6_addr, &ipv6_or_ap.addr); + fake_rs.ipv6_orport = ipv6_or_ap.port; + /* In a routerstatus, the IPv4 and IPv6 DirPorts are the same.*/ + ipv6_dir_ap.port = TEST_IPV4_DIR_PORT; + + /* Make a fake node. Even though it contains the fake_rs, a lookup won't + * find the node from the rs, because they're not in the hash table. */ + node_t fake_node; + memset(&fake_node, 0, sizeof(node_t)); + fake_node.rs = &fake_rs; + + /* Choose an address with IPv4 and IPv6 on */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ClientUseIPv4 = 1; + mock_options.ClientUseIPv6 = 1; + mock_options.UseBridges = 0; + + /* Preferring IPv4 */ + mock_options.ClientPreferIPv6ORPort = 0; + mock_options.ClientPreferIPv6DirPort = 0; + /* Simulate the initialisation of fake_node.ipv6_preferred */ + fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( + &mock_options); + + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv4_dir_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv4_dir_ap); + + /* Auto (Preferring IPv4) */ + mock_options.ClientPreferIPv6ORPort = -1; + mock_options.ClientPreferIPv6DirPort = -1; + /* Simulate the initialisation of fake_node.ipv6_preferred */ + fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( + &mock_options); + + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv4_dir_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv4_dir_ap); + + /* Preferring IPv6 */ + mock_options.ClientPreferIPv6ORPort = 1; + mock_options.ClientPreferIPv6DirPort = 1; + /* Simulate the initialisation of fake_node.ipv6_preferred */ + fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( + &mock_options); + + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, + ipv6_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, + ipv6_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv6_dir_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv6_dir_ap); + + /* Preferring IPv4 OR / IPv6 Dir */ + mock_options.ClientPreferIPv6ORPort = 0; + mock_options.ClientPreferIPv6DirPort = 1; + /* Simulate the initialisation of fake_node.ipv6_preferred */ + fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( + &mock_options); + + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv6_dir_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv6_dir_ap); + + /* Preferring IPv6 OR / IPv4 Dir */ + mock_options.ClientPreferIPv6ORPort = 1; + mock_options.ClientPreferIPv6DirPort = 0; + /* Simulate the initialisation of fake_node.ipv6_preferred */ + fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( + &mock_options); + + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, + ipv6_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, + ipv6_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv4_dir_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv4_dir_ap); + + /* Choose an address with UseBridges on */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.UseBridges = 1; + mock_options.ClientUseIPv4 = 1; + mock_options.ClientUseIPv6 = 1; + + /* Preferring IPv4 */ + mock_options.ClientPreferIPv6ORPort = 0; + mock_options.ClientPreferIPv6DirPort = 0; + /* Simulate the initialisation of fake_node.ipv6_preferred */ + fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( + &mock_options); + + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv4_dir_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv4_dir_ap); + + /* Auto: + * - bridge clients prefer the configured bridge OR address from the node, + * (the configured address family sets node.ipv6_preferred) + * - other clients prefer IPv4 OR by default (see above), + * - all clients, including bridge clients, prefer IPv4 Dir by default. + */ + mock_options.ClientPreferIPv6ORPort = -1; + mock_options.ClientPreferIPv6DirPort = -1; + + /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge + * configured with an IPv4 address */ + fake_node.ipv6_preferred = 0; + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv4_dir_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv4_dir_ap); + + /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge + * configured with an IPv6 address */ + fake_node.ipv6_preferred = 1; + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv6_or_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv6_or_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv4_dir_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv4_dir_ap); + + /* When a rs has no node, it defaults to IPv4 under auto. */ + CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap); + CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap); + CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 0, 1, ipv4_dir_ap); + CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 1, 1, ipv4_dir_ap); + + /* Preferring IPv6 */ + mock_options.ClientPreferIPv6ORPort = 1; + mock_options.ClientPreferIPv6DirPort = 1; + /* Simulate the initialisation of fake_node.ipv6_preferred */ + fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( + &mock_options); + + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, + ipv6_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, + ipv6_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv6_dir_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv6_dir_ap); + + /* In the default configuration (Auto / IPv6 off), bridge clients should + * use both IPv4 and IPv6, but only prefer IPv6 for bridges configured with + * an IPv6 address, regardless of ClientUseIPv6. (See above.) */ + mock_options.ClientUseIPv6 = 0; + mock_options.ClientPreferIPv6ORPort = -1; + mock_options.ClientPreferIPv6DirPort = -1; + /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge + * configured with an IPv4 address */ + fake_node.ipv6_preferred = 0; + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv4_dir_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv4_dir_ap); + + /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge + * configured with an IPv6 address */ + fake_node.ipv6_preferred = 1; + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv6_or_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv6_or_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv4_dir_ap); + CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv4_dir_ap); + + /* When a rs has no node, it defaults to IPv4 under auto. */ + CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap); + CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap); + CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 0, 1, ipv4_dir_ap); + CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 1, 1, ipv4_dir_ap); + + /* Choose an address with IPv4 on */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ClientUseIPv4 = 1; + mock_options.ClientUseIPv6 = 0; + /* Simulate the initialisation of fake_node.ipv6_preferred */ + fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( + &mock_options); + + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv4_dir_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv4_dir_ap); + + /* Choose an address with IPv6 on */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ClientUseIPv4 = 0; + mock_options.ClientUseIPv6 = 1; + /* Simulate the initialisation of fake_node.ipv6_preferred */ + fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( + &mock_options); + + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, + ipv6_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, + ipv6_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv6_dir_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv6_dir_ap); + + /* Choose an address with ClientUseIPv4 0. + * This means "use IPv6" regardless of the other settings. */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ClientUseIPv4 = 0; + mock_options.ClientUseIPv6 = 0; + /* Simulate the initialisation of fake_node.ipv6_preferred */ + fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( + &mock_options); + + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, + ipv6_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, + ipv6_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv6_dir_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv6_dir_ap); + + /* Choose an address with ORPort_set 1 (server mode). + * This means "use IPv4" regardless of the other settings. */ + memset(&mock_options, 0, sizeof(or_options_t)); + mock_options.ORPort_set = 1; + mock_options.ClientUseIPv4 = 0; + mock_options.ClientUseIPv6 = 1; + mock_options.ClientPreferIPv6ORPort = 1; + mock_options.ClientPreferIPv6DirPort = 1; + + /* Simulate the initialisation of fake_node.ipv6_preferred */ + fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( + &mock_options); + + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, + ipv4_or_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, + ipv4_dir_ap); + CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, + ipv4_dir_ap); + + done: + UNMOCK(get_options); +} + +#undef TEST_IPV4_ADDR_STR +#undef TEST_IPV6_ADDR_STR +#undef TEST_IPV4_OR_PORT +#undef TEST_IPV4_DIR_PORT +#undef TEST_IPV6_OR_PORT +#undef TEST_IPV6_DIR_PORT + +#undef CHECK_CHOSEN_ADDR_RS +#undef CHECK_CHOSEN_ADDR_NODE +#undef CHECK_CHOSEN_ADDR_RN + +struct testcase_t policy_tests[] = { + { "router_dump_exit_policy_to_string", test_dump_exit_policy_to_string, 0, + NULL, NULL }, + { "general", test_policies_general, 0, NULL, NULL }, + { "getinfo_helper_policies", test_policies_getinfo_helper_policies, 0, NULL, + NULL }, + { "reject_exit_address", test_policies_reject_exit_address, 0, NULL, NULL }, + { "reject_interface_address", test_policies_reject_interface_address, 0, + NULL, NULL }, + { "reject_port_address", test_policies_reject_port_address, 0, NULL, NULL }, + { "fascist_firewall_allows_address", + test_policies_fascist_firewall_allows_address, 0, NULL, NULL }, + { "fascist_firewall_choose_address", + test_policies_fascist_firewall_choose_address, 0, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_procmon.c b/src/wraith/src/test/test_procmon.c new file mode 100644 index 000000000..5c52af869 --- /dev/null +++ b/src/wraith/src/test/test_procmon.c @@ -0,0 +1,58 @@ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define PROCMON_PRIVATE +#include "orconfig.h" +#include "or.h" +#include "test.h" + +#include "procmon.h" + +#include "log_test_helpers.h" + +#define NS_MODULE procmon + +struct event_base; + +static void +test_procmon_tor_process_monitor_new(void *ignored) +{ + (void)ignored; + tor_process_monitor_t *res; + const char *msg; + + res = tor_process_monitor_new(NULL, "probably invalid", 0, NULL, NULL, &msg); + tt_assert(!res); + tt_str_op(msg, OP_EQ, "invalid PID"); + + res = tor_process_monitor_new(NULL, "243443535345454", 0, NULL, NULL, &msg); + tt_assert(!res); + tt_str_op(msg, OP_EQ, "invalid PID"); + + res = tor_process_monitor_new(tor_libevent_get_base(), "43", 0, + NULL, NULL, &msg); + tt_assert(res); + tt_assert(!msg); + tor_process_monitor_free(res); + + res = tor_process_monitor_new(tor_libevent_get_base(), "44 hello", 0, + NULL, NULL, &msg); + tt_assert(res); + tt_assert(!msg); + tor_process_monitor_free(res); + + res = tor_process_monitor_new(tor_libevent_get_base(), "45:hello", 0, + NULL, NULL, &msg); + tt_assert(res); + tt_assert(!msg); + + done: + tor_process_monitor_free(res); +} + +struct testcase_t procmon_tests[] = { + { "tor_process_monitor_new", test_procmon_tor_process_monitor_new, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_proto_http.c b/src/wraith/src/test/test_proto_http.c new file mode 100644 index 000000000..2f36fbccd --- /dev/null +++ b/src/wraith/src/test/test_proto_http.c @@ -0,0 +1,213 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_proto_http.c + * \brief Tests for our HTTP protocol parser code + */ + +#include "or.h" +#include "test.h" +#include "buffers.h" +#include "proto_http.h" +#include "log_test_helpers.h" + +#define S(str) str, sizeof(str)-1 + +static void +test_proto_http_peek(void *arg) +{ + (void) arg; + const struct { + int is_http; + const char *message; + size_t len; + } cases[] = { + { 1, S("GET /index HTTP/1.0\r\n") }, + { 1, S("GET /index HTTP/1.1\r\n") }, + { 1, S("GET ") }, + { 0, S("GIT ") }, + { 0, S("GET") }, + { 0, S("get ") }, + { 0, S("GETAWAY") }, + }; + unsigned i; + buf_t *buf = buf_new(); + for (i = 0; i < ARRAY_LENGTH(cases); ++i) { + TT_BLATHER(("Trying case %u", i)); + buf_add(buf, cases[i].message, cases[i].len); + tt_int_op(cases[i].is_http, OP_EQ, peek_buf_has_http_command(buf)); + buf_clear(buf); + } + done: + buf_free(buf); +} + +static void +test_proto_http_valid(void *arg) +{ + (void) arg; + const struct { + const char *message; + size_t len; + const char *headers; + const char *body; + size_t bodylen; + int should_detect_truncated; + int bytes_left_over; + } cases[] = { + { S("GET /index.html HTTP/1.0\r\n\r\n"), + "GET /index.html HTTP/1.0\r\n\r\n", + S(""), + 1, 0, + }, + { S("PUT /tor/foo HTTP/1.1\r\n" + "Content-Length: 51\r\n\r\n" + "this is a test of the http parsing system . test te"), + "PUT /tor/foo HTTP/1.1\r\n" "Content-Length: 51\r\n\r\n", + S("this is a test of the http parsing system . test te"), + 1, 0, + }, + { S("PUT /tor/foo HTTP/1.1\r\n" + "Content-Length: 5\r\n\r\n" + "there are more than 5 characters in this body."), + "PUT /tor/foo HTTP/1.1\r\n" "Content-Length: 5\r\n\r\n", + S("there"), + 0, 41, + }, + { S("PUT /tor/bar HTTP/1.1\r\n\r\n" + "this is another \x00test"), + "PUT /tor/bar HTTP/1.1\r\n\r\n", + S("this is another \x00test"), + 0, 0, + } + }; + unsigned i; + buf_t *buf = buf_new(); + char *h = NULL, *b = NULL; + + for (i = 0; i < ARRAY_LENGTH(cases); ++i) { + TT_BLATHER(("Trying case %u", i)); + size_t bl = 0; + // truncate by 2 chars + buf_add(buf, cases[i].message, cases[i].len - 2); + + if (cases[i].should_detect_truncated) { + tt_int_op(0, OP_EQ, fetch_from_buf_http(buf, &h, 1024*16, + &b, &bl, 1024*16, 0)); + tt_ptr_op(h, OP_EQ, NULL); + tt_ptr_op(b, OP_EQ, NULL); + tt_u64_op(bl, OP_EQ, 0); + tt_int_op(buf_datalen(buf), OP_EQ, cases[i].len - 2); + } + + // add the rest. + buf_add(buf, cases[i].message+cases[i].len-2, 2); + tt_int_op(1, OP_EQ, fetch_from_buf_http(buf, &h, 1024*16, + &b, &bl, 1024*16, 0)); + tt_str_op(h, OP_EQ, cases[i].headers); + tt_u64_op(bl, OP_EQ, cases[i].bodylen); + tt_mem_op(b, OP_EQ, cases[i].body, bl); + tt_int_op(buf_datalen(buf), OP_EQ, cases[i].bytes_left_over); + + buf_clear(buf); + tor_free(h); + tor_free(b); + } + done: + tor_free(h); + tor_free(b); + buf_free(buf); +} + +static void +test_proto_http_invalid(void *arg) +{ + (void) arg; + const struct { + const char *message; + size_t len; + const char *expect; + } cases[] = { + /* Overlong headers, headers not finished. */ + { S("GET /index.xhml HTTP/1.0\r\n" + "X-My-headers-are-too-long: yes indeed they are. They might be\r\n" + "X-My-headers-are-too-long: normal under other circumstances, but\r\n" + "X-My-headers-are-too-long: the 128-byte limit makes them bad\r\n"), + "headers too long." }, + /* Overlong finished headers. */ + { S("GET /index.xhml HTTP/1.0\r\n" + "X-My-headers-are-too-long: yes indeed they are. They might be\r\n" + "X-My-headers-are-too-long: normal under other circumstances, but\r\n" + "X-My-headers-are-too-long: the 128-byte limit makes them bad\r\n" + "\r\n"), + "headers too long." }, + /* Exactly too long finished headers. */ + { S("GET /index.xhml HTTP/1.0\r\n" + "X-My-headers-are-too-long: yes indeed they are. They might be\r\n" + "X-My-headers-are-too-long: normal un\r\n\r\n"), + "headerlen 129 larger than 127. Failing." }, + /* Body too long, with content-length */ + { S("GET /index.html HTTP/1.0\r\n" + "Content-Length: 129\r\n\r\n" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "xxxxxxxxxxxxxxxxxxx"), + "bodylen 129 larger than 127" }, + /* Body too long, with content-length lying */ + { S("GET /index.html HTTP/1.0\r\n" + "Content-Length: 99999\r\n\r\n" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"), + "bodylen 138 larger than 127" }, + /* Body too long, no content-length. */ + { S("GET /index.html HTTP/1.0\r\n\r\n" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxz"), + "bodylen 139 larger than 127" }, + /* Content-Length is junk. */ + { S("GET /index.html HTTP/1.0\r\n" + "Content-Length: Cheese\r\n\r\n" + "foo"), + "Content-Length is bogus; maybe someone is trying to crash us." }, + }; + unsigned i; + buf_t *buf = buf_new(); + char *h = NULL, *b = NULL; + setup_capture_of_logs(LOG_DEBUG); + + for (i = 0; i < ARRAY_LENGTH(cases); ++i) { + TT_BLATHER(("Trying case %u", i)); + size_t bl = 0; + buf_add(buf, cases[i].message, cases[i].len); + + /* Use low body limits here so we can force over-sized object warnings */ + tt_int_op(-1, OP_EQ, fetch_from_buf_http(buf, &h, 128, + &b, &bl, 128, 0)); + tt_ptr_op(h, OP_EQ, NULL); + tt_ptr_op(b, OP_EQ, NULL); + tt_u64_op(bl, OP_EQ, 0); + expect_log_msg_containing(cases[i].expect); + + buf_clear(buf); + tor_free(h); + tor_free(b); + mock_clean_saved_logs(); + } + done: + tor_free(h); + tor_free(b); + buf_free(buf); + teardown_capture_of_logs(); +} + +struct testcase_t proto_http_tests[] = { + { "peek", test_proto_http_peek, 0, NULL, NULL }, + { "valid", test_proto_http_valid, 0, NULL, NULL }, + { "invalid", test_proto_http_invalid, 0, NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_proto_misc.c b/src/wraith/src/test/test_proto_misc.c new file mode 100644 index 000000000..263ca4744 --- /dev/null +++ b/src/wraith/src/test/test_proto_misc.c @@ -0,0 +1,263 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_proto_misc.c + * \brief Test our smaller buffer-based protocol functions + */ + +#include "or.h" +#include "test.h" +#include "buffers.h" +#include "connection_or.h" +#include "ext_orport.h" +#include "proto_cell.h" +#include "proto_control0.h" +#include "proto_ext_or.h" + +static void +test_proto_var_cell(void *arg) +{ + (void)arg; + char *mem_op_hex_tmp = NULL; + char tmp[1024]; + buf_t *buf = NULL; + var_cell_t *cell = NULL; + + buf = buf_new(); + memset(tmp, 0xf0, sizeof(tmp)); + + /* Short little commands will make us say "no cell yet." */ + tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); + tt_ptr_op(cell, OP_EQ, NULL); + buf_add(buf, "\x01\x02\x02\0x2", 4); + tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); + /* An incomplete fixed-length cell makes us say "no cell yet". */ + buf_add(buf, "\x03", 1); + tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); + /* A complete fixed length-cell makes us say "not a variable-length cell" */ + buf_add(buf, tmp, 509); + tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); + buf_clear(buf); + + /* An incomplete versions cell is a variable-length cell that isn't ready + * yet. */ + buf_add(buf, + "\x01\x02\x03\x04" /* circid */ + "\x07" /* VERSIONS */ + "\x00\x04" /* 4 bytes long */ + "\x00" /* incomplete */, 8); + tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); + tt_ptr_op(cell, OP_EQ, NULL); + /* Complete it, and it's a variable-length cell. Leave a byte on the end for + * fun. */ + buf_add(buf, "\x09\x00\x25\ff", 4); + tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); + tt_ptr_op(cell, OP_NE, NULL); + tt_int_op(cell->command, OP_EQ, CELL_VERSIONS); + tt_uint_op(cell->circ_id, OP_EQ, 0x01020304); + tt_int_op(cell->payload_len, OP_EQ, 4); + test_mem_op_hex(cell->payload, OP_EQ, "00090025"); + var_cell_free(cell); + cell = NULL; + tt_int_op(buf_datalen(buf), OP_EQ, 1); + buf_clear(buf); + + /* In link protocol 3 and earlier, circid fields were two bytes long. Let's + * ensure that gets handled correctly. */ + buf_add(buf, + "\x23\x45\x81\x00\x06" /* command 81; 6 bytes long */ + "coraje", 11); + tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 3)); + tt_ptr_op(cell, OP_NE, NULL); + tt_int_op(cell->command, OP_EQ, 129); + tt_uint_op(cell->circ_id, OP_EQ, 0x2345); + tt_int_op(cell->payload_len, OP_EQ, 6); + tt_mem_op(cell->payload, OP_EQ, "coraje", 6); + var_cell_free(cell); + cell = NULL; + tt_int_op(buf_datalen(buf), OP_EQ, 0); + + /* In link protocol 2, only VERSIONS cells counted as variable-length */ + buf_add(buf, + "\x23\x45\x81\x00\x06" + "coraje", 11); /* As above */ + tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 2)); + buf_clear(buf); + buf_add(buf, + "\x23\x45\x07\x00\x06" + "futuro", 11); + tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 2)); + tt_ptr_op(cell, OP_NE, NULL); + tt_int_op(cell->command, OP_EQ, 7); + tt_uint_op(cell->circ_id, OP_EQ, 0x2345); + tt_int_op(cell->payload_len, OP_EQ, 6); + tt_mem_op(cell->payload, OP_EQ, "futuro", 6); + var_cell_free(cell); + cell = NULL; + + done: + buf_free(buf); + var_cell_free(cell); + tor_free(mem_op_hex_tmp); +} + +static void +test_proto_control0(void *arg) +{ + (void)arg; + buf_t *buf = buf_new(); + + /* The only remaining function for the v0 control protocol is the function + that detects whether the user has stumbled across an old controller + that's using it. The format was: + u16 length; + u16 command; + u8 body[length]; + */ + + /* Empty buffer -- nothing to do. */ + tt_int_op(0, OP_EQ, peek_buf_has_control0_command(buf)); + /* 3 chars in buf -- can't tell */ + buf_add(buf, "AUT", 3); + tt_int_op(0, OP_EQ, peek_buf_has_control0_command(buf)); + /* command in buf -- easy to tell */ + buf_add(buf, "HENTICATE ", 10); + tt_int_op(0, OP_EQ, peek_buf_has_control0_command(buf)); + + /* Control0 command header in buf: make sure we detect it. */ + buf_clear(buf); + buf_add(buf, "\x09\x05" "\x00\x05" "blah", 8); + tt_int_op(1, OP_EQ, peek_buf_has_control0_command(buf)); + + done: + buf_free(buf); +} + +static void +test_proto_ext_or_cmd(void *arg) +{ + ext_or_cmd_t *cmd = NULL; + buf_t *buf = buf_new(); + char *tmp = NULL; + (void) arg; + + /* Empty -- should give "not there. */ + tt_int_op(0, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); + tt_ptr_op(NULL, OP_EQ, cmd); + + /* Three bytes: shouldn't work. */ + buf_add(buf, "\x00\x20\x00", 3); + tt_int_op(0, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); + tt_ptr_op(NULL, OP_EQ, cmd); + tt_int_op(3, OP_EQ, buf_datalen(buf)); + + /* 0020 0000: That's a nil command. It should work. */ + buf_add(buf, "\x00", 1); + tt_int_op(1, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); + tt_ptr_op(NULL, OP_NE, cmd); + tt_int_op(0x20, OP_EQ, cmd->cmd); + tt_int_op(0, OP_EQ, cmd->len); + tt_int_op(0, OP_EQ, buf_datalen(buf)); + ext_or_cmd_free(cmd); + cmd = NULL; + + /* Now try a length-6 command with one byte missing. */ + buf_add(buf, "\x10\x21\x00\x06""abcde", 9); + tt_int_op(0, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); + tt_ptr_op(NULL, OP_EQ, cmd); + buf_add(buf, "f", 1); + tt_int_op(1, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); + tt_ptr_op(NULL, OP_NE, cmd); + tt_int_op(0x1021, OP_EQ, cmd->cmd); + tt_int_op(6, OP_EQ, cmd->len); + tt_mem_op("abcdef", OP_EQ, cmd->body, 6); + tt_int_op(0, OP_EQ, buf_datalen(buf)); + ext_or_cmd_free(cmd); + cmd = NULL; + + /* Now try a length-10 command with 4 extra bytes. */ + buf_add(buf, "\xff\xff\x00\x0aloremipsum\x10\x00\xff\xff", 18); + tt_int_op(1, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); + tt_ptr_op(NULL, OP_NE, cmd); + tt_int_op(0xffff, OP_EQ, cmd->cmd); + tt_int_op(10, OP_EQ, cmd->len); + tt_mem_op("loremipsum", OP_EQ, cmd->body, 10); + tt_int_op(4, OP_EQ, buf_datalen(buf)); + ext_or_cmd_free(cmd); + cmd = NULL; + + /* Finally, let's try a maximum-length command. We already have the header + * waiting. */ + tt_int_op(0, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); + tmp = tor_malloc_zero(65535); + buf_add(buf, tmp, 65535); + tt_int_op(1, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); + tt_ptr_op(NULL, OP_NE, cmd); + tt_int_op(0x1000, OP_EQ, cmd->cmd); + tt_int_op(0xffff, OP_EQ, cmd->len); + tt_mem_op(tmp, OP_EQ, cmd->body, 65535); + tt_int_op(0, OP_EQ, buf_datalen(buf)); + ext_or_cmd_free(cmd); + cmd = NULL; + + done: + ext_or_cmd_free(cmd); + buf_free(buf); + tor_free(tmp); +} + +static void +test_proto_line(void *arg) +{ + (void)arg; + char tmp[60]; + buf_t *buf = buf_new(); +#define S(str) str, sizeof(str)-1 + const struct { + const char *input; + size_t input_len; + size_t line_len; + const char *output; + int returnval; + } cases[] = { + { S("Hello world"), 0, NULL, 0 }, + { S("Hello world\n"), 12, "Hello world\n", 1 }, + { S("Hello world\nMore"), 12, "Hello world\n", 1 }, + { S("\n oh hello world\nMore"), 1, "\n", 1 }, + { S("Hello worpd\n\nMore"), 12, "Hello worpd\n", 1 }, + { S("------------------------------------------------------------\n"), 0, + NULL, -1 }, + }; + unsigned i; + for (i = 0; i < ARRAY_LENGTH(cases); ++i) { + buf_add(buf, cases[i].input, cases[i].input_len); + memset(tmp, 0xfe, sizeof(tmp)); + size_t sz = sizeof(tmp); + int rv = buf_get_line(buf, tmp, &sz); + tt_int_op(rv, OP_EQ, cases[i].returnval); + if (rv == 1) { + tt_int_op(sz, OP_LT, sizeof(tmp)); + tt_mem_op(cases[i].output, OP_EQ, tmp, sz+1); + tt_int_op(buf_datalen(buf), OP_EQ, cases[i].input_len - strlen(tmp)); + tt_int_op(sz, OP_EQ, cases[i].line_len); + } else { + tt_int_op(buf_datalen(buf), OP_EQ, cases[i].input_len); + // tt_int_op(sz, OP_EQ, sizeof(tmp)); + } + buf_clear(buf); + } + + done: + buf_free(buf); +} + +struct testcase_t proto_misc_tests[] = { + { "var_cell", test_proto_var_cell, 0, NULL, NULL }, + { "control0", test_proto_control0, 0, NULL, NULL }, + { "ext_or_cmd", test_proto_ext_or_cmd, TT_FORK, NULL, NULL }, + { "line", test_proto_line, 0, NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_protover.c b/src/wraith/src/test/test_protover.c new file mode 100644 index 000000000..686536211 --- /dev/null +++ b/src/wraith/src/test/test_protover.c @@ -0,0 +1,266 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define PROTOVER_PRIVATE + +#include "orconfig.h" +#include "test.h" + +#include "protover.h" + +static void +test_protover_parse(void *arg) +{ + (void) arg; +#ifdef HAVE_RUST + /** This test is disabled on rust builds, because it only exists to test + * internal C functions. */ + tt_skip(); + done: + ; +#else + char *re_encoded = NULL; + + const char *orig = "Foo=1,3 Bar=3 Baz= Quux=9-12,14,15-16,900"; + smartlist_t *elts = parse_protocol_list(orig); + + tt_assert(elts); + tt_int_op(smartlist_len(elts), OP_EQ, 4); + + const proto_entry_t *e; + const proto_range_t *r; + e = smartlist_get(elts, 0); + tt_str_op(e->name, OP_EQ, "Foo"); + tt_int_op(smartlist_len(e->ranges), OP_EQ, 2); + { + r = smartlist_get(e->ranges, 0); + tt_int_op(r->low, OP_EQ, 1); + tt_int_op(r->high, OP_EQ, 1); + + r = smartlist_get(e->ranges, 1); + tt_int_op(r->low, OP_EQ, 3); + tt_int_op(r->high, OP_EQ, 3); + } + + e = smartlist_get(elts, 1); + tt_str_op(e->name, OP_EQ, "Bar"); + tt_int_op(smartlist_len(e->ranges), OP_EQ, 1); + { + r = smartlist_get(e->ranges, 0); + tt_int_op(r->low, OP_EQ, 3); + tt_int_op(r->high, OP_EQ, 3); + } + + e = smartlist_get(elts, 2); + tt_str_op(e->name, OP_EQ, "Baz"); + tt_int_op(smartlist_len(e->ranges), OP_EQ, 0); + + e = smartlist_get(elts, 3); + tt_str_op(e->name, OP_EQ, "Quux"); + tt_int_op(smartlist_len(e->ranges), OP_EQ, 4); + { + r = smartlist_get(e->ranges, 0); + tt_int_op(r->low, OP_EQ, 9); + tt_int_op(r->high, OP_EQ, 12); + + r = smartlist_get(e->ranges, 1); + tt_int_op(r->low, OP_EQ, 14); + tt_int_op(r->high, OP_EQ, 14); + + r = smartlist_get(e->ranges, 2); + tt_int_op(r->low, OP_EQ, 15); + tt_int_op(r->high, OP_EQ, 16); + + r = smartlist_get(e->ranges, 3); + tt_int_op(r->low, OP_EQ, 900); + tt_int_op(r->high, OP_EQ, 900); + } + + re_encoded = encode_protocol_list(elts); + tt_assert(re_encoded); + tt_str_op(re_encoded, OP_EQ, orig); + + done: + if (elts) + SMARTLIST_FOREACH(elts, proto_entry_t *, ent, proto_entry_free(ent)); + smartlist_free(elts); + tor_free(re_encoded); +#endif +} + +static void +test_protover_parse_fail(void *arg) +{ + (void)arg; +#ifdef HAVE_RUST + /** This test is disabled on rust builds, because it only exists to test + * internal C functions. */ + tt_skip(); +#else + smartlist_t *elts; + + /* random junk */ + elts = parse_protocol_list("!!3@*"); + tt_ptr_op(elts, OP_EQ, NULL); + + /* Missing equals sign in an entry */ + elts = parse_protocol_list("Link=4 Haprauxymatyve Desc=9"); + tt_ptr_op(elts, OP_EQ, NULL); + + /* Missing word. */ + elts = parse_protocol_list("Link=4 =3 Desc=9"); + tt_ptr_op(elts, OP_EQ, NULL); + + /* Broken numbers */ + elts = parse_protocol_list("Link=fred"); + tt_ptr_op(elts, OP_EQ, NULL); + elts = parse_protocol_list("Link=1,fred"); + tt_ptr_op(elts, OP_EQ, NULL); + elts = parse_protocol_list("Link=1,fred,3"); + tt_ptr_op(elts, OP_EQ, NULL); + + /* Broken range */ + elts = parse_protocol_list("Link=1,9-8,3"); + tt_ptr_op(elts, OP_EQ, NULL); +#endif + done: + ; +} + +static void +test_protover_vote(void *arg) +{ + (void) arg; + + smartlist_t *lst = smartlist_new(); + char *result = protover_compute_vote(lst, 1); + + tt_str_op(result, OP_EQ, ""); + tor_free(result); + + smartlist_add(lst, (void*) "Foo=1-10,500 Bar=1,3-7,8"); + result = protover_compute_vote(lst, 1); + tt_str_op(result, OP_EQ, "Bar=1,3-8 Foo=1-10,500"); + tor_free(result); + + smartlist_add(lst, (void*) "Quux=123-456,78 Bar=2-6,8 Foo=9"); + result = protover_compute_vote(lst, 1); + tt_str_op(result, OP_EQ, "Bar=1-8 Foo=1-10,500 Quux=78,123-456"); + tor_free(result); + + result = protover_compute_vote(lst, 2); + tt_str_op(result, OP_EQ, "Bar=3-6,8 Foo=9"); + tor_free(result); + + done: + tor_free(result); + smartlist_free(lst); +} + +static void +test_protover_all_supported(void *arg) +{ + (void)arg; + char *msg = NULL; + + tt_assert(protover_all_supported(NULL, &msg)); + tt_ptr_op(msg, OP_EQ, NULL); + + tt_assert(protover_all_supported("", &msg)); + tt_ptr_op(msg, OP_EQ, NULL); + + // Some things that we do support + tt_assert(protover_all_supported("Link=3-4", &msg)); + tt_ptr_op(msg, OP_EQ, NULL); + tt_assert(protover_all_supported("Link=3-4 Desc=2", &msg)); + tt_ptr_op(msg, OP_EQ, NULL); + + // Some things we don't support + tt_assert(! protover_all_supported("Wombat=9", &msg)); + tt_str_op(msg, OP_EQ, "Wombat=9"); + tor_free(msg); + tt_assert(! protover_all_supported("Link=999", &msg)); + tt_str_op(msg, OP_EQ, "Link=999"); + tor_free(msg); + + // Mix of things we support and things we don't + tt_assert(! protover_all_supported("Link=3-4 Wombat=9", &msg)); + tt_str_op(msg, OP_EQ, "Wombat=9"); + tor_free(msg); + tt_assert(! protover_all_supported("Link=3-999", &msg)); + tt_str_op(msg, OP_EQ, "Link=3-999"); + tor_free(msg); + + done: + tor_free(msg); +} + +static void +test_protover_list_supports_protocol_returns_true(void *arg) +{ + (void)arg; + + const char *protocols = "Link=1"; + int is_supported = protocol_list_supports_protocol(protocols, PRT_LINK, 1); + tt_int_op(is_supported, OP_EQ, 1); + + done: + ; +} + +static void +test_protover_list_supports_protocol_for_unsupported_returns_false(void *arg) +{ + (void)arg; + + const char *protocols = "Link=1"; + int is_supported = protocol_list_supports_protocol(protocols, PRT_LINK, 10); + tt_int_op(is_supported, OP_EQ, 0); + + done: + ; +} + +static void +test_protover_supports_version(void *arg) +{ + (void)arg; + + tt_assert(protocol_list_supports_protocol("Link=3-6", PRT_LINK, 3)); + tt_assert(protocol_list_supports_protocol("Link=3-6", PRT_LINK, 6)); + tt_assert(!protocol_list_supports_protocol("Link=3-6", PRT_LINK, 7)); + tt_assert(!protocol_list_supports_protocol("Link=3-6", PRT_LINKAUTH, 3)); + + tt_assert(!protocol_list_supports_protocol("Link=4-6 LinkAuth=3", + PRT_LINKAUTH, 2)); + tt_assert(protocol_list_supports_protocol("Link=4-6 LinkAuth=3", + PRT_LINKAUTH, 3)); + tt_assert(!protocol_list_supports_protocol("Link=4-6 LinkAuth=3", + PRT_LINKAUTH, 4)); + tt_assert(!protocol_list_supports_protocol_or_later("Link=4-6 LinkAuth=3", + PRT_LINKAUTH, 4)); + tt_assert(protocol_list_supports_protocol_or_later("Link=4-6 LinkAuth=3", + PRT_LINKAUTH, 3)); + tt_assert(protocol_list_supports_protocol_or_later("Link=4-6 LinkAuth=3", + PRT_LINKAUTH, 2)); + + tt_assert(!protocol_list_supports_protocol_or_later("Link=4-6 LinkAuth=3", + PRT_DESC, 2)); + done: + ; +} + +#define PV_TEST(name, flags) \ + { #name, test_protover_ ##name, (flags), NULL, NULL } + +struct testcase_t protover_tests[] = { + PV_TEST(parse, 0), + PV_TEST(parse_fail, 0), + PV_TEST(vote, 0), + PV_TEST(all_supported, 0), + PV_TEST(list_supports_protocol_for_unsupported_returns_false, 0), + PV_TEST(list_supports_protocol_returns_true, 0), + PV_TEST(supports_version, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_pt.c b/src/wraith/src/test/test_pt.c new file mode 100644 index 000000000..07b6712ff --- /dev/null +++ b/src/wraith/src/test/test_pt.c @@ -0,0 +1,547 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define PT_PRIVATE +#define UTIL_PRIVATE +#define STATEFILE_PRIVATE +#define CONTROL_PRIVATE +#include "or.h" +#include "config.h" +#include "confparse.h" +#include "control.h" +#include "transports.h" +#include "circuitbuild.h" +#include "util.h" +#include "statefile.h" +#include "test.h" + +static void +reset_mp(managed_proxy_t *mp) +{ + mp->conf_state = PT_PROTO_LAUNCHED; + SMARTLIST_FOREACH(mp->transports, transport_t *, t, transport_free(t)); + smartlist_clear(mp->transports); +} + +static void +test_pt_parsing(void *arg) +{ + char line[200]; + transport_t *transport = NULL; + tor_addr_t test_addr; + + managed_proxy_t *mp = tor_malloc_zero(sizeof(managed_proxy_t)); + (void)arg; + mp->conf_state = PT_PROTO_INFANT; + mp->transports = smartlist_new(); + + /* incomplete cmethod */ + strlcpy(line,"CMETHOD trebuchet",sizeof(line)); + tt_int_op(parse_cmethod_line(line, mp), OP_LT, 0); + + reset_mp(mp); + + /* wrong proxy type */ + strlcpy(line,"CMETHOD trebuchet dog 127.0.0.1:1999",sizeof(line)); + tt_int_op(parse_cmethod_line(line, mp), OP_LT, 0); + + reset_mp(mp); + + /* wrong addrport */ + strlcpy(line,"CMETHOD trebuchet socks4 abcd",sizeof(line)); + tt_int_op(parse_cmethod_line(line, mp), OP_LT, 0); + + reset_mp(mp); + + /* correct line */ + strlcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999",sizeof(line)); + tt_int_op(parse_cmethod_line(line, mp), OP_EQ, 0); + tt_int_op(smartlist_len(mp->transports), OP_EQ, 1); + transport = smartlist_get(mp->transports, 0); + /* test registered address of transport */ + tor_addr_parse(&test_addr, "127.0.0.1"); + tt_assert(tor_addr_eq(&test_addr, &transport->addr)); + /* test registered port of transport */ + tt_uint_op(transport->port, OP_EQ, 1999); + /* test registered SOCKS version of transport */ + tt_int_op(transport->socks_version, OP_EQ, PROXY_SOCKS5); + /* test registered name of transport */ + tt_str_op(transport->name,OP_EQ, "trebuchet"); + + reset_mp(mp); + + /* incomplete smethod */ + strlcpy(line,"SMETHOD trebuchet",sizeof(line)); + tt_int_op(parse_smethod_line(line, mp), OP_LT, 0); + + reset_mp(mp); + + /* wrong addr type */ + strlcpy(line,"SMETHOD trebuchet abcd",sizeof(line)); + tt_int_op(parse_smethod_line(line, mp), OP_LT, 0); + + reset_mp(mp); + + /* cowwect */ + strlcpy(line,"SMETHOD trebuchy 127.0.0.2:2999",sizeof(line)); + tt_int_op(parse_smethod_line(line, mp), OP_EQ, 0); + tt_int_op(smartlist_len(mp->transports), OP_EQ, 1); + transport = smartlist_get(mp->transports, 0); + /* test registered address of transport */ + tor_addr_parse(&test_addr, "127.0.0.2"); + tt_assert(tor_addr_eq(&test_addr, &transport->addr)); + /* test registered port of transport */ + tt_uint_op(transport->port, OP_EQ, 2999); + /* test registered name of transport */ + tt_str_op(transport->name,OP_EQ, "trebuchy"); + + reset_mp(mp); + + /* Include some arguments. Good ones. */ + strlcpy(line,"SMETHOD trebuchet 127.0.0.1:9999 " + "ARGS:counterweight=3,sling=snappy", + sizeof(line)); + tt_int_op(parse_smethod_line(line, mp), OP_EQ, 0); + tt_int_op(1, OP_EQ, smartlist_len(mp->transports)); + { + const transport_t *transport_ = smartlist_get(mp->transports, 0); + tt_assert(transport_); + tt_str_op(transport_->name, OP_EQ, "trebuchet"); + tt_int_op(transport_->port, OP_EQ, 9999); + tt_str_op(fmt_addr(&transport_->addr), OP_EQ, "127.0.0.1"); + tt_str_op(transport_->extra_info_args, OP_EQ, + "counterweight=3,sling=snappy"); + } + reset_mp(mp); + + /* unsupported version */ + strlcpy(line,"VERSION 666",sizeof(line)); + tt_int_op(parse_version(line, mp), OP_LT, 0); + + /* incomplete VERSION */ + strlcpy(line,"VERSION ",sizeof(line)); + tt_int_op(parse_version(line, mp), OP_LT, 0); + + /* correct VERSION */ + strlcpy(line,"VERSION 1",sizeof(line)); + tt_int_op(parse_version(line, mp), OP_EQ, 0); + + done: + reset_mp(mp); + smartlist_free(mp->transports); + tor_free(mp); +} + +static void +test_pt_get_transport_options(void *arg) +{ + char **execve_args; + smartlist_t *transport_list = smartlist_new(); + managed_proxy_t *mp; + or_options_t *options = get_options_mutable(); + char *opt_str = NULL; + config_line_t *cl = NULL; + (void)arg; + + execve_args = tor_malloc(sizeof(char*)*2); + execve_args[0] = tor_strdup("cheeseshop"); + execve_args[1] = NULL; + + mp = managed_proxy_create(transport_list, execve_args, 1); + tt_ptr_op(mp, OP_NE, NULL); + opt_str = get_transport_options_for_server_proxy(mp); + tt_ptr_op(opt_str, OP_EQ, NULL); + + smartlist_add_strdup(mp->transports_to_launch, "gruyere"); + smartlist_add_strdup(mp->transports_to_launch, "roquefort"); + smartlist_add_strdup(mp->transports_to_launch, "stnectaire"); + + tt_assert(options); + + cl = tor_malloc_zero(sizeof(config_line_t)); + cl->value = tor_strdup("gruyere melty=10 hardness=se;ven"); + options->ServerTransportOptions = cl; + + cl = tor_malloc_zero(sizeof(config_line_t)); + cl->value = tor_strdup("stnectaire melty=4 hardness=three"); + cl->next = options->ServerTransportOptions; + options->ServerTransportOptions = cl; + + cl = tor_malloc_zero(sizeof(config_line_t)); + cl->value = tor_strdup("pepperjack melty=12 hardness=five"); + cl->next = options->ServerTransportOptions; + options->ServerTransportOptions = cl; + + opt_str = get_transport_options_for_server_proxy(mp); + tt_str_op(opt_str, OP_EQ, + "gruyere:melty=10;gruyere:hardness=se\\;ven;" + "stnectaire:melty=4;stnectaire:hardness=three"); + + done: + tor_free(opt_str); + config_free_lines(cl); + managed_proxy_destroy(mp, 0); + smartlist_free(transport_list); +} + +static void +test_pt_protocol(void *arg) +{ + char line[200]; + + managed_proxy_t *mp = tor_malloc_zero(sizeof(managed_proxy_t)); + (void)arg; + mp->conf_state = PT_PROTO_LAUNCHED; + mp->transports = smartlist_new(); + mp->argv = tor_calloc(2, sizeof(char *)); + mp->argv[0] = tor_strdup(""); + + /* various wrong protocol runs: */ + + strlcpy(line,"VERSION 1",sizeof(line)); + handle_proxy_line(line, mp); + tt_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS); + + strlcpy(line,"VERSION 1",sizeof(line)); + handle_proxy_line(line, mp); + tt_assert(mp->conf_state == PT_PROTO_BROKEN); + + reset_mp(mp); + + strlcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999",sizeof(line)); + handle_proxy_line(line, mp); + tt_assert(mp->conf_state == PT_PROTO_BROKEN); + + reset_mp(mp); + + /* correct protocol run: */ + strlcpy(line,"VERSION 1",sizeof(line)); + handle_proxy_line(line, mp); + tt_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS); + + strlcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999",sizeof(line)); + handle_proxy_line(line, mp); + tt_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS); + + strlcpy(line,"CMETHODS DONE",sizeof(line)); + handle_proxy_line(line, mp); + tt_assert(mp->conf_state == PT_PROTO_CONFIGURED); + + done: + reset_mp(mp); + smartlist_free(mp->transports); + tor_free(mp->argv[0]); + tor_free(mp->argv); + tor_free(mp); +} + +static void +test_pt_get_extrainfo_string(void *arg) +{ + managed_proxy_t *mp1 = NULL, *mp2 = NULL; + char **argv1, **argv2; + smartlist_t *t1 = smartlist_new(), *t2 = smartlist_new(); + int r; + char *s = NULL; + (void) arg; + + argv1 = tor_malloc_zero(sizeof(char*)*3); + argv1[0] = tor_strdup("ewige"); + argv1[1] = tor_strdup("Blumenkraft"); + argv1[2] = NULL; + argv2 = tor_malloc_zero(sizeof(char*)*4); + argv2[0] = tor_strdup("und"); + argv2[1] = tor_strdup("ewige"); + argv2[2] = tor_strdup("Schlangenkraft"); + argv2[3] = NULL; + + mp1 = managed_proxy_create(t1, argv1, 1); + mp2 = managed_proxy_create(t2, argv2, 1); + + r = parse_smethod_line("SMETHOD hagbard 127.0.0.1:5555", mp1); + tt_int_op(r, OP_EQ, 0); + r = parse_smethod_line("SMETHOD celine 127.0.0.1:1723 ARGS:card=no-enemy", + mp2); + tt_int_op(r, OP_EQ, 0); + + /* Force these proxies to look "completed" or they won't generate output. */ + mp1->conf_state = mp2->conf_state = PT_PROTO_COMPLETED; + + s = pt_get_extra_info_descriptor_string(); + tt_assert(s); + tt_str_op(s, OP_EQ, + "transport hagbard 127.0.0.1:5555\n" + "transport celine 127.0.0.1:1723 card=no-enemy\n"); + + done: + /* XXXX clean up better */ + smartlist_free(t1); + smartlist_free(t2); + tor_free(s); +} + +#ifdef _WIN32 +#define STDIN_HANDLE HANDLE* +#else +#define STDIN_HANDLE int +#endif + +static smartlist_t * +tor_get_lines_from_handle_replacement(STDIN_HANDLE handle, + enum stream_status *stream_status_out) +{ + static int times_called = 0; + smartlist_t *retval_sl = smartlist_new(); + + (void) handle; + (void) stream_status_out; + + /* Generate some dummy CMETHOD lines the first 5 times. The 6th + time, send 'CMETHODS DONE' to finish configuring the proxy. */ + if (times_called++ != 5) { + smartlist_add_asprintf(retval_sl, "SMETHOD mock%d 127.0.0.1:555%d", + times_called, times_called); + } else { + smartlist_add_strdup(retval_sl, "SMETHODS DONE"); + } + + return retval_sl; +} + +/* NOP mock */ +static void +tor_process_handle_destroy_replacement(process_handle_t *process_handle, + int also_terminate_process) +{ + (void) process_handle; + (void) also_terminate_process; +} + +static or_state_t *dummy_state = NULL; + +static or_state_t * +get_or_state_replacement(void) +{ + return dummy_state; +} + +static int controlevent_n = 0; +static uint16_t controlevent_event = 0; +static smartlist_t *controlevent_msgs = NULL; + +static void +queue_control_event_string_replacement(uint16_t event, char *msg) +{ + ++controlevent_n; + controlevent_event = event; + if (!controlevent_msgs) + controlevent_msgs = smartlist_new(); + smartlist_add(controlevent_msgs, msg); +} + +/* Test the configure_proxy() function. */ +static void +test_pt_configure_proxy(void *arg) +{ + int i, retval; + managed_proxy_t *mp = NULL; + (void) arg; + + dummy_state = tor_malloc_zero(sizeof(or_state_t)); + + MOCK(tor_get_lines_from_handle, + tor_get_lines_from_handle_replacement); + MOCK(tor_process_handle_destroy, + tor_process_handle_destroy_replacement); + MOCK(get_or_state, + get_or_state_replacement); + MOCK(queue_control_event_string, + queue_control_event_string_replacement); + + control_testing_set_global_event_mask(EVENT_TRANSPORT_LAUNCHED); + + mp = tor_malloc_zero(sizeof(managed_proxy_t)); + mp->conf_state = PT_PROTO_ACCEPTING_METHODS; + mp->transports = smartlist_new(); + mp->transports_to_launch = smartlist_new(); + mp->process_handle = tor_malloc_zero(sizeof(process_handle_t)); + mp->argv = tor_malloc_zero(sizeof(char*)*2); + mp->argv[0] = tor_strdup(""); + mp->is_server = 1; + + /* Test the return value of configure_proxy() by calling it some + times while it is uninitialized and then finally finalizing its + configuration. */ + for (i = 0 ; i < 5 ; i++) { + retval = configure_proxy(mp); + /* retval should be zero because proxy hasn't finished configuring yet */ + tt_int_op(retval, OP_EQ, 0); + /* check the number of registered transports */ + tt_assert(smartlist_len(mp->transports) == i+1); + /* check that the mp is still waiting for transports */ + tt_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS); + } + + /* this last configure_proxy() should finalize the proxy configuration. */ + retval = configure_proxy(mp); + /* retval should be 1 since the proxy finished configuring */ + tt_int_op(retval, OP_EQ, 1); + /* check the mp state */ + tt_assert(mp->conf_state == PT_PROTO_COMPLETED); + + tt_int_op(controlevent_n, OP_EQ, 5); + tt_int_op(controlevent_event, OP_EQ, EVENT_TRANSPORT_LAUNCHED); + tt_int_op(smartlist_len(controlevent_msgs), OP_EQ, 5); + smartlist_sort_strings(controlevent_msgs); + tt_str_op(smartlist_get(controlevent_msgs, 0), OP_EQ, + "650 TRANSPORT_LAUNCHED server mock1 127.0.0.1 5551\r\n"); + tt_str_op(smartlist_get(controlevent_msgs, 1), OP_EQ, + "650 TRANSPORT_LAUNCHED server mock2 127.0.0.1 5552\r\n"); + tt_str_op(smartlist_get(controlevent_msgs, 2), OP_EQ, + "650 TRANSPORT_LAUNCHED server mock3 127.0.0.1 5553\r\n"); + tt_str_op(smartlist_get(controlevent_msgs, 3), OP_EQ, + "650 TRANSPORT_LAUNCHED server mock4 127.0.0.1 5554\r\n"); + tt_str_op(smartlist_get(controlevent_msgs, 4), OP_EQ, + "650 TRANSPORT_LAUNCHED server mock5 127.0.0.1 5555\r\n"); + + { /* check that the transport info were saved properly in the tor state */ + config_line_t *transport_in_state = NULL; + smartlist_t *transport_info_sl = smartlist_new(); + char *name_of_transport = NULL; + char *bindaddr = NULL; + + /* Get the bindaddr for "mock1" and check it against the bindaddr + that the mocked tor_get_lines_from_handle() generated. */ + transport_in_state = get_transport_in_state_by_name("mock1"); + tt_assert(transport_in_state); + smartlist_split_string(transport_info_sl, transport_in_state->value, + NULL, 0, 0); + name_of_transport = smartlist_get(transport_info_sl, 0); + bindaddr = smartlist_get(transport_info_sl, 1); + tt_str_op(name_of_transport, OP_EQ, "mock1"); + tt_str_op(bindaddr, OP_EQ, "127.0.0.1:5551"); + + SMARTLIST_FOREACH(transport_info_sl, char *, cp, tor_free(cp)); + smartlist_free(transport_info_sl); + } + + done: + or_state_free(dummy_state); + UNMOCK(tor_get_lines_from_handle); + UNMOCK(tor_process_handle_destroy); + UNMOCK(get_or_state); + UNMOCK(queue_control_event_string); + if (controlevent_msgs) { + SMARTLIST_FOREACH(controlevent_msgs, char *, cp, tor_free(cp)); + smartlist_free(controlevent_msgs); + controlevent_msgs = NULL; + } + if (mp->transports) { + SMARTLIST_FOREACH(mp->transports, transport_t *, t, transport_free(t)); + smartlist_free(mp->transports); + } + smartlist_free(mp->transports_to_launch); + tor_free(mp->process_handle); + tor_free(mp->argv[0]); + tor_free(mp->argv); + tor_free(mp); +} + +/* Test the get_pt_proxy_uri() function. */ +static void +test_get_pt_proxy_uri(void *arg) +{ + or_options_t *options = get_options_mutable(); + char *uri = NULL; + int ret; + (void) arg; + + /* Test with no proxy. */ + uri = get_pt_proxy_uri(); + tt_ptr_op(uri, OP_EQ, NULL); + + /* Test with a SOCKS4 proxy. */ + options->Socks4Proxy = tor_strdup("192.0.2.1:1080"); + ret = tor_addr_port_lookup(options->Socks4Proxy, + &options->Socks4ProxyAddr, + &options->Socks4ProxyPort); + tt_int_op(ret, OP_EQ, 0); + uri = get_pt_proxy_uri(); + tt_str_op(uri, OP_EQ, "socks4a://192.0.2.1:1080"); + tor_free(uri); + tor_free(options->Socks4Proxy); + + /* Test with a SOCKS5 proxy, no username/password. */ + options->Socks5Proxy = tor_strdup("192.0.2.1:1080"); + ret = tor_addr_port_lookup(options->Socks5Proxy, + &options->Socks5ProxyAddr, + &options->Socks5ProxyPort); + tt_int_op(ret, OP_EQ, 0); + uri = get_pt_proxy_uri(); + tt_str_op(uri, OP_EQ, "socks5://192.0.2.1:1080"); + tor_free(uri); + + /* Test with a SOCKS5 proxy, with username/password. */ + options->Socks5ProxyUsername = tor_strdup("hwest"); + options->Socks5ProxyPassword = tor_strdup("r34n1m470r"); + uri = get_pt_proxy_uri(); + tt_str_op(uri, OP_EQ, "socks5://hwest:r34n1m470r@192.0.2.1:1080"); + tor_free(uri); + tor_free(options->Socks5Proxy); + tor_free(options->Socks5ProxyUsername); + tor_free(options->Socks5ProxyPassword); + + /* Test with a HTTPS proxy, no authenticator. */ + options->HTTPSProxy = tor_strdup("192.0.2.1:80"); + ret = tor_addr_port_lookup(options->HTTPSProxy, + &options->HTTPSProxyAddr, + &options->HTTPSProxyPort); + tt_int_op(ret, OP_EQ, 0); + uri = get_pt_proxy_uri(); + tt_str_op(uri, OP_EQ, "http://192.0.2.1:80"); + tor_free(uri); + + /* Test with a HTTPS proxy, with authenticator. */ + options->HTTPSProxyAuthenticator = tor_strdup("hwest:r34n1m470r"); + uri = get_pt_proxy_uri(); + tt_str_op(uri, OP_EQ, "http://hwest:r34n1m470r@192.0.2.1:80"); + tor_free(uri); + tor_free(options->HTTPSProxy); + tor_free(options->HTTPSProxyAuthenticator); + + /* Token nod to the fact that IPv6 exists. */ + options->Socks4Proxy = tor_strdup("[2001:db8::1]:1080"); + ret = tor_addr_port_lookup(options->Socks4Proxy, + &options->Socks4ProxyAddr, + &options->Socks4ProxyPort); + tt_int_op(ret, OP_EQ, 0); + uri = get_pt_proxy_uri(); + tt_str_op(uri, OP_EQ, "socks4a://[2001:db8::1]:1080"); + tor_free(uri); + tor_free(options->Socks4Proxy); + + done: + if (uri) + tor_free(uri); +} + +#define PT_LEGACY(name) \ + { #name, test_pt_ ## name , 0, NULL, NULL } + +struct testcase_t pt_tests[] = { + PT_LEGACY(parsing), + PT_LEGACY(protocol), + { "get_transport_options", test_pt_get_transport_options, TT_FORK, + NULL, NULL }, + { "get_extrainfo_string", test_pt_get_extrainfo_string, TT_FORK, + NULL, NULL }, + { "configure_proxy",test_pt_configure_proxy, TT_FORK, + NULL, NULL }, + { "get_pt_proxy_uri", test_get_pt_proxy_uri, TT_FORK, + NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_pubsub.c b/src/wraith/src/test/test_pubsub.c new file mode 100644 index 000000000..2f047d9f2 --- /dev/null +++ b/src/wraith/src/test/test_pubsub.c @@ -0,0 +1,85 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_pubsub.c + * \brief Unit tests for publish-subscribe abstraction. + **/ + +#include "or.h" +#include "test.h" +#include "pubsub.h" + +DECLARE_PUBSUB_STRUCT_TYPES(foobar) +DECLARE_PUBSUB_TOPIC(foobar) +DECLARE_NOTIFY_PUBSUB_TOPIC(static, foobar) +IMPLEMENT_PUBSUB_TOPIC(static, foobar) + +struct foobar_event_data_t { + unsigned u; + const char *s; +}; + +struct foobar_subscriber_data_t { + const char *name; + long l; +}; + +static int +foobar_sub1(foobar_event_data_t *ev, foobar_subscriber_data_t *mine) +{ + ev->u += 10; + mine->l += 100; + return 0; +} + +static int +foobar_sub2(foobar_event_data_t *ev, foobar_subscriber_data_t *mine) +{ + ev->u += 5; + mine->l += 50; + return 0; +} + +static void +test_pubsub_basic(void *arg) +{ + (void)arg; + foobar_subscriber_data_t subdata1 = { "hi", 0 }; + foobar_subscriber_data_t subdata2 = { "wow", 0 }; + const foobar_subscriber_t *sub1; + const foobar_subscriber_t *sub2; + foobar_event_data_t ed = { 0, "x" }; + foobar_event_data_t ed2 = { 0, "y" }; + sub1 = foobar_subscribe(foobar_sub1, &subdata1, SUBSCRIBE_ATSTART, 100); + tt_assert(sub1); + + foobar_notify(&ed, 0); + tt_int_op(subdata1.l, OP_EQ, 100); + tt_int_op(subdata2.l, OP_EQ, 0); + tt_int_op(ed.u, OP_EQ, 10); + + sub2 = foobar_subscribe(foobar_sub2, &subdata2, 0, 5); + tt_assert(sub2); + + foobar_notify(&ed2, 0); + tt_int_op(subdata1.l, OP_EQ, 200); + tt_int_op(subdata2.l, OP_EQ, 50); + tt_int_op(ed2.u, OP_EQ, 15); + + foobar_unsubscribe(sub1); + + foobar_notify(&ed, 0); + tt_int_op(subdata1.l, OP_EQ, 200); + tt_int_op(subdata2.l, OP_EQ, 100); + tt_int_op(ed.u, OP_EQ, 15); + + done: + foobar_clear(); +} + +struct testcase_t pubsub_tests[] = { + { "pubsub_basic", test_pubsub_basic, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_relay.c b/src/wraith/src/test/test_relay.c new file mode 100644 index 000000000..73c0ed558 --- /dev/null +++ b/src/wraith/src/test/test_relay.c @@ -0,0 +1,130 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#define CIRCUITBUILD_PRIVATE +#include "circuitbuild.h" +#define RELAY_PRIVATE +#include "relay.h" +/* For init/free stuff */ +#include "scheduler.h" + +/* Test suite stuff */ +#include "test.h" +#include "fakechans.h" + +static or_circuit_t * new_fake_orcirc(channel_t *nchan, channel_t *pchan); + +static void test_relay_append_cell_to_circuit_queue(void *arg); + +static or_circuit_t * +new_fake_orcirc(channel_t *nchan, channel_t *pchan) +{ + or_circuit_t *orcirc = NULL; + circuit_t *circ = NULL; + + orcirc = tor_malloc_zero(sizeof(*orcirc)); + circ = &(orcirc->base_); + circ->magic = OR_CIRCUIT_MAGIC; + + circ->n_chan = nchan; + circ->n_circ_id = get_unique_circ_id_by_chan(nchan); + circ->n_mux = NULL; /* ?? */ + cell_queue_init(&(circ->n_chan_cells)); + circ->n_hop = NULL; + circ->streams_blocked_on_n_chan = 0; + circ->streams_blocked_on_p_chan = 0; + circ->n_delete_pending = 0; + circ->p_delete_pending = 0; + circ->received_destroy = 0; + circ->state = CIRCUIT_STATE_OPEN; + circ->purpose = CIRCUIT_PURPOSE_OR; + circ->package_window = CIRCWINDOW_START_MAX; + circ->deliver_window = CIRCWINDOW_START_MAX; + circ->n_chan_create_cell = NULL; + + orcirc->p_chan = pchan; + orcirc->p_circ_id = get_unique_circ_id_by_chan(pchan); + cell_queue_init(&(orcirc->p_chan_cells)); + + return orcirc; +} + +static void +test_relay_append_cell_to_circuit_queue(void *arg) +{ + channel_t *nchan = NULL, *pchan = NULL; + or_circuit_t *orcirc = NULL; + cell_t *cell = NULL; + int old_count, new_count; + + (void)arg; + + /* Make fake channels to be nchan and pchan for the circuit */ + nchan = new_fake_channel(); + tt_assert(nchan); + + pchan = new_fake_channel(); + tt_assert(pchan); + + /* Make a fake orcirc */ + orcirc = new_fake_orcirc(nchan, pchan); + tt_assert(orcirc); + circuitmux_attach_circuit(nchan->cmux, TO_CIRCUIT(orcirc), + CELL_DIRECTION_OUT); + circuitmux_attach_circuit(pchan->cmux, TO_CIRCUIT(orcirc), + CELL_DIRECTION_IN); + + /* Make a cell */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + + MOCK(scheduler_channel_has_waiting_cells, + scheduler_channel_has_waiting_cells_mock); + + /* Append it */ + old_count = get_mock_scheduler_has_waiting_cells_count(); + append_cell_to_circuit_queue(TO_CIRCUIT(orcirc), nchan, cell, + CELL_DIRECTION_OUT, 0); + new_count = get_mock_scheduler_has_waiting_cells_count(); + tt_int_op(new_count, OP_EQ, old_count + 1); + + /* Now try the reverse direction */ + old_count = get_mock_scheduler_has_waiting_cells_count(); + append_cell_to_circuit_queue(TO_CIRCUIT(orcirc), pchan, cell, + CELL_DIRECTION_IN, 0); + new_count = get_mock_scheduler_has_waiting_cells_count(); + tt_int_op(new_count, OP_EQ, old_count + 1); + + UNMOCK(scheduler_channel_has_waiting_cells); + + /* Get rid of the fake channels */ + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + channel_mark_for_close(nchan); + channel_mark_for_close(pchan); + UNMOCK(scheduler_release_channel); + + /* Shut down channels */ + channel_free_all(); + + done: + tor_free(cell); + if (orcirc) { + circuitmux_detach_circuit(nchan->cmux, TO_CIRCUIT(orcirc)); + circuitmux_detach_circuit(pchan->cmux, TO_CIRCUIT(orcirc)); + cell_queue_clear(&orcirc->base_.n_chan_cells); + cell_queue_clear(&orcirc->p_chan_cells); + } + tor_free(orcirc); + free_fake_channel(nchan); + free_fake_channel(pchan); + + return; +} + +struct testcase_t relay_tests[] = { + { "append_cell_to_circuit_queue", test_relay_append_cell_to_circuit_queue, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_relaycell.c b/src/wraith/src/test/test_relaycell.c new file mode 100644 index 000000000..eea1f5dc8 --- /dev/null +++ b/src/wraith/src/test/test_relaycell.c @@ -0,0 +1,249 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/* Unit tests for handling different kinds of relay cell */ + +#define RELAY_PRIVATE +#include "or.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "relay.h" +#include "test.h" + +static int srm_ncalls; +static entry_connection_t *srm_conn; +static int srm_atype; +static size_t srm_alen; +static int srm_answer_is_set; +static uint8_t srm_answer[512]; +static int srm_ttl; +static time_t srm_expires; + +/* Mock replacement for connection_ap_hannshake_socks_resolved() */ +static void +socks_resolved_mock(entry_connection_t *conn, + int answer_type, + size_t answer_len, + const uint8_t *answer, + int ttl, + time_t expires) +{ + srm_ncalls++; + srm_conn = conn; + srm_atype = answer_type; + srm_alen = answer_len; + if (answer) { + memset(srm_answer, 0, sizeof(srm_answer)); + memcpy(srm_answer, answer, answer_len < 512 ? answer_len : 512); + srm_answer_is_set = 1; + } else { + srm_answer_is_set = 0; + } + srm_ttl = ttl; + srm_expires = expires; +} + +static int mum_ncalls; +static entry_connection_t *mum_conn; +static int mum_endreason; + +/* Mock replacement for connection_mark_unattached_ap_() */ +static void +mark_unattached_mock(entry_connection_t *conn, int endreason, + int line, const char *file) +{ + ++mum_ncalls; + mum_conn = conn; + mum_endreason = endreason; + (void) line; + (void) file; +} + +/* Tests for connection_edge_process_resolved_cell(). + + The point of ..process_resolved_cell() is to handle an incoming cell + on an entry connection, and call connection_mark_unattached_ap() and/or + connection_ap_handshake_socks_resolved(). + */ +static void +test_relaycell_resolved(void *arg) +{ + entry_connection_t *entryconn; + edge_connection_t *edgeconn; + cell_t cell; + relay_header_t rh; + int r; + or_options_t *options = get_options_mutable(); + +#define SET_CELL(s) do { \ + memset(&cell, 0, sizeof(cell)); \ + memset(&rh, 0, sizeof(rh)); \ + memcpy(cell.payload + RELAY_HEADER_SIZE, (s), sizeof((s))-1); \ + rh.length = sizeof((s))-1; \ + rh.command = RELAY_COMMAND_RESOLVED; \ + } while (0) +#define MOCK_RESET() do { \ + srm_ncalls = mum_ncalls = 0; \ + } while (0) +#define ASSERT_MARK_CALLED(reason) do { \ + tt_int_op(mum_ncalls, OP_EQ, 1); \ + tt_ptr_op(mum_conn, OP_EQ, entryconn); \ + tt_int_op(mum_endreason, OP_EQ, (reason)); \ + } while (0) +#define ASSERT_RESOLVED_CALLED(atype, answer, ttl, expires) do { \ + tt_int_op(srm_ncalls, OP_EQ, 1); \ + tt_ptr_op(srm_conn, OP_EQ, entryconn); \ + tt_int_op(srm_atype, OP_EQ, (atype)); \ + if ((answer) != NULL) { \ + tt_int_op(srm_alen, OP_EQ, sizeof(answer)-1); \ + tt_int_op(srm_alen, OP_LT, 512); \ + tt_int_op(srm_answer_is_set, OP_EQ, 1); \ + tt_mem_op(srm_answer, OP_EQ, answer, sizeof(answer)-1); \ + } else { \ + tt_int_op(srm_answer_is_set, OP_EQ, 0); \ + } \ + tt_int_op(srm_ttl, OP_EQ, ttl); \ + tt_i64_op(srm_expires, OP_EQ, expires); \ + } while (0) + + (void)arg; + + MOCK(connection_mark_unattached_ap_, mark_unattached_mock); + MOCK(connection_ap_handshake_socks_resolved, socks_resolved_mock); + + options->ClientDNSRejectInternalAddresses = 0; + + SET_CELL(/* IPv4: 127.0.1.2, ttl 256 */ + "\x04\x04\x7f\x00\x01\x02\x00\x00\x01\x00" + /* IPv4: 18.0.0.1, ttl 512 */ + "\x04\x04\x12\x00\x00\x01\x00\x00\x02\x00" + /* IPv6: 2003::3, ttl 1024 */ + "\x06\x10" + "\x20\x02\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x03" + "\x00\x00\x04\x00"); + + entryconn = entry_connection_new(CONN_TYPE_AP, AF_INET); + edgeconn = ENTRY_TO_EDGE_CONN(entryconn); + + /* Try with connection in non-RESOLVE_WAIT state: cell gets ignored */ + MOCK_RESET(); + r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); + tt_int_op(r, OP_EQ, 0); + tt_int_op(srm_ncalls, OP_EQ, 0); + tt_int_op(mum_ncalls, OP_EQ, 0); + + /* Now put it in the right state. */ + ENTRY_TO_CONN(entryconn)->state = AP_CONN_STATE_RESOLVE_WAIT; + entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE; + entryconn->entry_cfg.ipv4_traffic = 1; + entryconn->entry_cfg.ipv6_traffic = 1; + entryconn->entry_cfg.prefer_ipv6 = 0; + + /* We prefer ipv4, so we should get the first ipv4 answer */ + MOCK_RESET(); + r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); + tt_int_op(r, OP_EQ, 0); + ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x7f\x00\x01\x02", 256, -1); + + /* But we may be discarding private answers. */ + MOCK_RESET(); + options->ClientDNSRejectInternalAddresses = 1; + r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); + tt_int_op(r, OP_EQ, 0); + ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x12\x00\x00\x01", 512, -1); + + /* now prefer ipv6, and get the first ipv6 answer */ + entryconn->entry_cfg.prefer_ipv6 = 1; + MOCK_RESET(); + r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); + tt_int_op(r, OP_EQ, 0); + ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV6, + "\x20\x02\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x03", + 1024, -1); + + /* With a cell that only has IPv4, we report IPv4 even if we prefer IPv6 */ + MOCK_RESET(); + SET_CELL("\x04\x04\x12\x00\x00\x01\x00\x00\x02\x00"); + r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); + tt_int_op(r, OP_EQ, 0); + ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x12\x00\x00\x01", 512, -1); + + /* But if we don't allow IPv4, we report nothing if the cell contains only + * ipv4 */ + MOCK_RESET(); + entryconn->entry_cfg.ipv4_traffic = 0; + r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); + tt_int_op(r, OP_EQ, 0); + ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR, NULL, -1, -1); + + /* If we wanted hostnames, we report nothing, since we only had IPs. */ + MOCK_RESET(); + entryconn->entry_cfg.ipv4_traffic = 1; + entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; + r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); + tt_int_op(r, OP_EQ, 0); + ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR, NULL, -1, -1); + + /* A hostname cell is fine though. */ + MOCK_RESET(); + SET_CELL("\x00\x0fwww.example.com\x00\x01\x00\x00"); + r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); + tt_int_op(r, OP_EQ, 0); + ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_HOSTNAME, "www.example.com", 65536, -1); + + /* error on malformed cell */ + MOCK_RESET(); + entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE; + SET_CELL("\x04\x04\x01\x02\x03\x04"); /* no ttl */ + r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); + tt_int_op(r, OP_EQ, 0); + ASSERT_MARK_CALLED(END_STREAM_REASON_TORPROTOCOL); + tt_int_op(srm_ncalls, OP_EQ, 0); + + /* error on all addresses private */ + MOCK_RESET(); + SET_CELL(/* IPv4: 127.0.1.2, ttl 256 */ + "\x04\x04\x7f\x00\x01\x02\x00\x00\x01\x00" + /* IPv4: 192.168.1.1, ttl 256 */ + "\x04\x04\xc0\xa8\x01\x01\x00\x00\x01\x00"); + r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); + tt_int_op(r, OP_EQ, 0); + ASSERT_MARK_CALLED(END_STREAM_REASON_TORPROTOCOL); + ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR_TRANSIENT, NULL, 0, TIME_MAX); + + /* Legit error code */ + MOCK_RESET(); + SET_CELL("\xf0\x15" "quiet and meaningless" "\x00\x00\x0f\xff"); + r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); + tt_int_op(r, OP_EQ, 0); + ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR_TRANSIENT, NULL, -1, -1); + + done: + UNMOCK(connection_mark_unattached_ap_); + UNMOCK(connection_ap_handshake_socks_resolved); +} + +struct testcase_t relaycell_tests[] = { + { "resolved", test_relaycell_resolved, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_rendcache.c b/src/wraith/src/test/test_rendcache.c new file mode 100644 index 000000000..9f6cfc4a2 --- /dev/null +++ b/src/wraith/src/test/test_rendcache.c @@ -0,0 +1,1242 @@ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" + +#include "test.h" +#define RENDCACHE_PRIVATE +#include "rendcache.h" +#include "router.h" +#include "routerlist.h" +#include "config.h" +#include "hs_common.h" +#include "rend_test_helpers.h" +#include "log_test_helpers.h" + +#define NS_MODULE rend_cache + +static const int RECENT_TIME = -10; +static const int TIME_IN_THE_PAST = -(REND_CACHE_MAX_AGE + \ + REND_CACHE_MAX_SKEW + 60); +static const int TIME_IN_THE_FUTURE = REND_CACHE_MAX_SKEW + 60; + +static void +test_rend_cache_lookup_entry(void *data) +{ + int ret; + rend_data_t *mock_rend_query = NULL; + char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + rend_cache_entry_t *entry = NULL; + rend_encoded_v2_service_descriptor_t *desc_holder = NULL; + char *service_id = NULL; + (void)data; + + rend_cache_init(); + + generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); + + ret = rend_cache_lookup_entry("abababababababab", 0, NULL); + tt_int_op(ret, OP_EQ, -ENOENT); + + ret = rend_cache_lookup_entry("invalid query", 2, NULL); + tt_int_op(ret, OP_EQ, -EINVAL); + + ret = rend_cache_lookup_entry("abababababababab", 2, NULL); + tt_int_op(ret, OP_EQ, -ENOENT); + + ret = rend_cache_lookup_entry("abababababababab", 4224, NULL); + tt_int_op(ret, OP_EQ, -ENOENT); + + mock_rend_query = mock_rend_data(service_id); + base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, + DIGEST_LEN); + rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, + mock_rend_query, NULL); + + ret = rend_cache_lookup_entry(service_id, 2, NULL); + tt_int_op(ret, OP_EQ, 0); + + ret = rend_cache_lookup_entry(service_id, 2, &entry); + tt_int_op(ret, OP_EQ, 0); + tt_assert(entry); + tt_int_op(entry->len, OP_EQ, strlen(desc_holder->desc_str)); + tt_str_op(entry->desc, OP_EQ, desc_holder->desc_str); + + done: + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + rend_cache_free_all(); + rend_data_free(mock_rend_query); +} + +static void +test_rend_cache_store_v2_desc_as_client(void *data) +{ + int ret; + rend_data_t *mock_rend_query; + char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + rend_cache_entry_t *entry = NULL; + rend_encoded_v2_service_descriptor_t *desc_holder = NULL; + char *service_id = NULL; + char client_cookie[REND_DESC_COOKIE_LEN]; + (void)data; + + rend_cache_init(); + + generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); + + // Test success + mock_rend_query = mock_rend_data(service_id); + base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, + DIGEST_LEN); + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + desc_id_base32, mock_rend_query, + &entry); + + tt_int_op(ret, OP_EQ, 0); + tt_assert(entry); + tt_int_op(entry->len, OP_EQ, strlen(desc_holder->desc_str)); + tt_str_op(entry->desc, OP_EQ, desc_holder->desc_str); + + // Test various failure modes + + // TODO: a too long desc_id_base32 argument crashes the function + /* ret = rend_cache_store_v2_desc_as_client( */ + /* desc_holder->desc_str, */ + /* "3TOOLONG3TOOLONG3TOOLONG3TOOLONG3TOOLONG3TOOLONG", */ + /* &mock_rend_query, NULL); */ + /* tt_int_op(ret, OP_EQ, -1); */ + + // Test bad base32 failure + // This causes an assertion failure if we're running with assertions. + // But when building without asserts, we can test it. +#ifdef DISABLE_ASSERTS_IN_UNIT_TESTS + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + "!xqunszqnaolrrfmtzgaki7mxelgvkj", mock_rend_query, NULL); + tt_int_op(ret, OP_EQ, -1); +#endif + + // Test invalid descriptor + ret = rend_cache_store_v2_desc_as_client("invalid descriptor", + "3xqunszqnaolrrfmtzgaki7mxelgvkje", mock_rend_query, NULL); + tt_int_op(ret, OP_EQ, -1); + + // TODO: it doesn't seem to be possible to test invalid service ID condition. + // that means it is likely not possible to have that condition without + // earlier conditions failing first (such as signature checking of the desc) + + rend_cache_free_all(); + + // Test mismatch between service ID and onion address + rend_cache_init(); + strncpy(TO_REND_DATA_V2(mock_rend_query)->onion_address, "abc", + REND_SERVICE_ID_LEN_BASE32+1); + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + desc_id_base32, + mock_rend_query, NULL); + tt_int_op(ret, OP_EQ, -1); + rend_cache_free_all(); + rend_data_free(mock_rend_query); + + // Test incorrect descriptor ID + rend_cache_init(); + mock_rend_query = mock_rend_data(service_id); + char orig = desc_id_base32[0]; + if (desc_id_base32[0] == 'a') + desc_id_base32[0] = 'b'; + else + desc_id_base32[0] = 'a'; + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + desc_id_base32, mock_rend_query, + NULL); + tt_int_op(ret, OP_EQ, -1); + desc_id_base32[0] = orig; + rend_cache_free_all(); + + // Test too old descriptor + rend_cache_init(); + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + rend_data_free(mock_rend_query); + + generate_desc(TIME_IN_THE_PAST, &desc_holder, &service_id, 3); + mock_rend_query = mock_rend_data(service_id); + base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, + DIGEST_LEN); + + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + desc_id_base32, + mock_rend_query, NULL); + tt_int_op(ret, OP_EQ, -1); + rend_cache_free_all(); + + // Test too new descriptor (in the future) + rend_cache_init(); + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + rend_data_free(mock_rend_query); + + generate_desc(TIME_IN_THE_FUTURE, &desc_holder, &service_id, 3); + mock_rend_query = mock_rend_data(service_id); + base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, + DIGEST_LEN); + + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + desc_id_base32, mock_rend_query, + NULL); + tt_int_op(ret, OP_EQ, -1); + rend_cache_free_all(); + + // Test when a descriptor is already in the cache + rend_cache_init(); + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + rend_data_free(mock_rend_query); + + generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); + mock_rend_query = mock_rend_data(service_id); + base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, + DIGEST_LEN); + + rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, + mock_rend_query, NULL); + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + desc_id_base32, mock_rend_query, + NULL); + tt_int_op(ret, OP_EQ, 0); + + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + desc_id_base32, mock_rend_query, + &entry); + tt_int_op(ret, OP_EQ, 0); + tt_assert(entry); + rend_cache_free_all(); + + // Test unsuccessful decrypting of introduction points + rend_cache_init(); + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + rend_data_free(mock_rend_query); + + generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); + mock_rend_query = mock_rend_data(service_id); + TO_REND_DATA_V2(mock_rend_query)->auth_type = REND_BASIC_AUTH; + client_cookie[0] = 'A'; + memcpy(TO_REND_DATA_V2(mock_rend_query)->descriptor_cookie, client_cookie, + REND_DESC_COOKIE_LEN); + base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, + DIGEST_LEN); + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + desc_id_base32, mock_rend_query, + NULL); + tt_int_op(ret, OP_EQ, 0); + rend_cache_free_all(); + + // Test successful run when we have REND_BASIC_AUTH but not cookie + rend_cache_init(); + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + rend_data_free(mock_rend_query); + + generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); + mock_rend_query = mock_rend_data(service_id); + TO_REND_DATA_V2(mock_rend_query)->auth_type = REND_BASIC_AUTH; + base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, + DIGEST_LEN); + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + desc_id_base32, mock_rend_query, + NULL); + tt_int_op(ret, OP_EQ, 0); + + rend_cache_free_all(); + + // Test when we have no introduction points + rend_cache_init(); + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + rend_data_free(mock_rend_query); + + generate_desc(RECENT_TIME, &desc_holder, &service_id, 0); + mock_rend_query = mock_rend_data(service_id); + base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, + DIGEST_LEN); + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + desc_id_base32, mock_rend_query, + NULL); + tt_int_op(ret, OP_EQ, -1); + rend_cache_free_all(); + + // Test when we have too many intro points + rend_cache_init(); + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + rend_data_free(mock_rend_query); + + generate_desc(RECENT_TIME, &desc_holder, &service_id, MAX_INTRO_POINTS+1); + mock_rend_query = mock_rend_data(service_id); + base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, + DIGEST_LEN); + ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, + desc_id_base32, mock_rend_query, + NULL); + tt_int_op(ret, OP_EQ, -1); + + done: + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + rend_cache_free_all(); + rend_data_free(mock_rend_query); +} + +static void +test_rend_cache_store_v2_desc_as_client_with_different_time(void *data) +{ + int ret; + rend_data_t *mock_rend_query; + char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + rend_service_descriptor_t *generated = NULL; + smartlist_t *descs = smartlist_new(); + time_t t; + char *service_id = NULL; + rend_encoded_v2_service_descriptor_t *desc_holder_newer; + rend_encoded_v2_service_descriptor_t *desc_holder_older; + + t = time(NULL); + rend_cache_init(); + + create_descriptor(&generated, &service_id, 3); + + generated->timestamp = t + RECENT_TIME; + rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, + REND_NO_AUTH, NULL, NULL); + desc_holder_newer = ((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0)); + smartlist_set(descs, 0, NULL); + + SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, + rend_encoded_v2_service_descriptor_free(d)); + smartlist_free(descs); + descs = smartlist_new(); + + generated->timestamp = (t + RECENT_TIME) - 20; + rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, + REND_NO_AUTH, NULL, NULL); + desc_holder_older = ((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0)); + smartlist_set(descs, 0, NULL); + (void)data; + + // Test when a descriptor is already in the cache and it is newer than the + // one we submit + mock_rend_query = mock_rend_data(service_id); + base32_encode(desc_id_base32, sizeof(desc_id_base32), + desc_holder_newer->desc_id, DIGEST_LEN); + rend_cache_store_v2_desc_as_client(desc_holder_newer->desc_str, + desc_id_base32, mock_rend_query, NULL); + ret = rend_cache_store_v2_desc_as_client(desc_holder_older->desc_str, + desc_id_base32, mock_rend_query, + NULL); + tt_int_op(ret, OP_EQ, 0); + + rend_cache_free_all(); + + // Test when an old descriptor is in the cache and we submit a newer one + rend_cache_init(); + rend_cache_store_v2_desc_as_client(desc_holder_older->desc_str, + desc_id_base32, mock_rend_query, NULL); + ret = rend_cache_store_v2_desc_as_client(desc_holder_newer->desc_str, + desc_id_base32, mock_rend_query, + NULL); + tt_int_op(ret, OP_EQ, 0); + + done: + rend_encoded_v2_service_descriptor_free(desc_holder_newer); + rend_encoded_v2_service_descriptor_free(desc_holder_older); + SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, + rend_encoded_v2_service_descriptor_free(d)); + smartlist_free(descs); + rend_service_descriptor_free(generated); + tor_free(service_id); + rend_cache_free_all(); + rend_data_free(mock_rend_query); +} + +#define NS_SUBMODULE lookup_v2_desc_as_dir +NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); + +static routerinfo_t *mock_routerinfo; + +static const routerinfo_t * +NS(router_get_my_routerinfo)(void) +{ + if (!mock_routerinfo) { + mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); + } + + return mock_routerinfo; +} + +static void +test_rend_cache_lookup_v2_desc_as_dir(void *data) +{ + int ret; + char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + rend_encoded_v2_service_descriptor_t *desc_holder = NULL; + char *service_id = NULL; + const char *ret_desc = NULL; + + (void)data; + + NS_MOCK(router_get_my_routerinfo); + + rend_cache_init(); + + // Test invalid base32 + ret = rend_cache_lookup_v2_desc_as_dir("!bababababababab", NULL); + tt_int_op(ret, OP_EQ, -1); + + // Test non-existent descriptor but well formed + ret = rend_cache_lookup_v2_desc_as_dir("3xqunszqnaolrrfmtzgaki7mxelgvkje", + NULL); + tt_int_op(ret, OP_EQ, 0); + + // Test existing descriptor + generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); + rend_cache_store_v2_desc_as_dir(desc_holder->desc_str); + base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, + DIGEST_LEN); + ret = rend_cache_lookup_v2_desc_as_dir(desc_id_base32, &ret_desc); + tt_int_op(ret, OP_EQ, 1); + tt_assert(ret_desc); + + done: + NS_UNMOCK(router_get_my_routerinfo); + tor_free(mock_routerinfo); + rend_cache_free_all(); + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE store_v2_desc_as_dir +NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); + +static const routerinfo_t * +NS(router_get_my_routerinfo)(void) +{ + return mock_routerinfo; +} + +static void +test_rend_cache_store_v2_desc_as_dir(void *data) +{ + (void)data; + int ret; + rend_encoded_v2_service_descriptor_t *desc_holder = NULL; + char *service_id = NULL; + + NS_MOCK(router_get_my_routerinfo); + + rend_cache_init(); + + // Test when we can't parse the descriptor + mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); + ret = rend_cache_store_v2_desc_as_dir("unparseable"); + tt_int_op(ret, OP_EQ, -1); + + // Test when we have an old descriptor + generate_desc(TIME_IN_THE_PAST, &desc_holder, &service_id, 3); + ret = rend_cache_store_v2_desc_as_dir(desc_holder->desc_str); + tt_int_op(ret, OP_EQ, 0); + + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + + // Test when we have a descriptor in the future + generate_desc(TIME_IN_THE_FUTURE, &desc_holder, &service_id, 3); + ret = rend_cache_store_v2_desc_as_dir(desc_holder->desc_str); + tt_int_op(ret, OP_EQ, 0); + + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + + // Test when two descriptors + generate_desc(TIME_IN_THE_FUTURE, &desc_holder, &service_id, 3); + ret = rend_cache_store_v2_desc_as_dir(desc_holder->desc_str); + tt_int_op(ret, OP_EQ, 0); + + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + + // Test when asking for hidden service statistics HiddenServiceStatistics + rend_cache_purge(); + generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); + get_options_mutable()->HiddenServiceStatistics = 1; + ret = rend_cache_store_v2_desc_as_dir(desc_holder->desc_str); + tt_int_op(ret, OP_EQ, 0); + + done: + NS_UNMOCK(router_get_my_routerinfo); + rend_encoded_v2_service_descriptor_free(desc_holder); + tor_free(service_id); + rend_cache_free_all(); + tor_free(mock_routerinfo); +} + +static void +test_rend_cache_store_v2_desc_as_dir_with_different_time(void *data) +{ + (void)data; + + int ret; + rend_service_descriptor_t *generated = NULL; + smartlist_t *descs = smartlist_new(); + time_t t; + char *service_id = NULL; + rend_encoded_v2_service_descriptor_t *desc_holder_newer; + rend_encoded_v2_service_descriptor_t *desc_holder_older; + + NS_MOCK(router_get_my_routerinfo); + + rend_cache_init(); + + t = time(NULL); + + create_descriptor(&generated, &service_id, 3); + generated->timestamp = t + RECENT_TIME; + rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, + REND_NO_AUTH, NULL, NULL); + desc_holder_newer = ((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0)); + smartlist_set(descs, 0, NULL); + SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, + rend_encoded_v2_service_descriptor_free(d)); + smartlist_free(descs); + descs = smartlist_new(); + + generated->timestamp = (t + RECENT_TIME) - 20; + rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, + REND_NO_AUTH, NULL, NULL); + desc_holder_older = ((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0)); + smartlist_set(descs, 0, NULL); + + // Test when we have a newer descriptor stored + mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); + rend_cache_store_v2_desc_as_dir(desc_holder_newer->desc_str); + ret = rend_cache_store_v2_desc_as_dir(desc_holder_older->desc_str); + tt_int_op(ret, OP_EQ, 0); + + // Test when we have an old descriptor stored + rend_cache_purge(); + rend_cache_store_v2_desc_as_dir(desc_holder_older->desc_str); + ret = rend_cache_store_v2_desc_as_dir(desc_holder_newer->desc_str); + tt_int_op(ret, OP_EQ, 0); + + done: + NS_UNMOCK(router_get_my_routerinfo); + rend_cache_free_all(); + rend_service_descriptor_free(generated); + tor_free(service_id); + SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, + rend_encoded_v2_service_descriptor_free(d)); + smartlist_free(descs); + rend_encoded_v2_service_descriptor_free(desc_holder_newer); + rend_encoded_v2_service_descriptor_free(desc_holder_older); + tor_free(mock_routerinfo); +} + +static void +test_rend_cache_store_v2_desc_as_dir_with_different_content(void *data) +{ + (void)data; + + int ret; + rend_service_descriptor_t *generated = NULL; + smartlist_t *descs = smartlist_new(); + time_t t; + char *service_id = NULL; + rend_encoded_v2_service_descriptor_t *desc_holder_one = NULL; + rend_encoded_v2_service_descriptor_t *desc_holder_two = NULL; + + NS_MOCK(router_get_my_routerinfo); + + rend_cache_init(); + + t = time(NULL); + + create_descriptor(&generated, &service_id, 3); + generated->timestamp = t + RECENT_TIME; + rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, + REND_NO_AUTH, NULL, NULL); + desc_holder_one = ((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0)); + smartlist_set(descs, 0, NULL); + + SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, + rend_encoded_v2_service_descriptor_free(d)); + smartlist_free(descs); + descs = smartlist_new(); + + generated->timestamp = t + RECENT_TIME; + generated->protocols = 41; + rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, + REND_NO_AUTH, NULL, NULL); + desc_holder_two = ((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0)); + smartlist_set(descs, 0, NULL); + + // Test when we have another descriptor stored, with a different descriptor + mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); + rend_cache_store_v2_desc_as_dir(desc_holder_one->desc_str); + ret = rend_cache_store_v2_desc_as_dir(desc_holder_two->desc_str); + tt_int_op(ret, OP_EQ, 0); + + done: + NS_UNMOCK(router_get_my_routerinfo); + rend_cache_free_all(); + rend_service_descriptor_free(generated); + tor_free(service_id); + SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, + rend_encoded_v2_service_descriptor_free(d)); + smartlist_free(descs); + rend_encoded_v2_service_descriptor_free(desc_holder_one); + rend_encoded_v2_service_descriptor_free(desc_holder_two); +} + +#undef NS_SUBMODULE + +static void +test_rend_cache_init(void *data) +{ + (void)data; + + tt_assert_msg(!rend_cache, "rend_cache should be NULL when starting"); + tt_assert_msg(!rend_cache_v2_dir, "rend_cache_v2_dir should be NULL " + "when starting"); + tt_assert_msg(!rend_cache_failure, "rend_cache_failure should be NULL when " + "starting"); + + rend_cache_init(); + + tt_assert_msg(rend_cache, "rend_cache should not be NULL after initing"); + tt_assert_msg(rend_cache_v2_dir, "rend_cache_v2_dir should not be NULL " + "after initing"); + tt_assert_msg(rend_cache_failure, "rend_cache_failure should not be NULL " + "after initing"); + + tt_int_op(strmap_size(rend_cache), OP_EQ, 0); + tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 0); + tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0); + + done: + rend_cache_free_all(); +} + +static void +test_rend_cache_decrement_allocation(void *data) +{ + (void)data; + + // Test when the cache has enough allocations + rend_cache_total_allocation = 10; + rend_cache_decrement_allocation(3); + tt_int_op(rend_cache_total_allocation, OP_EQ, 7); + + // Test when there are not enough allocations + rend_cache_total_allocation = 1; + setup_full_capture_of_logs(LOG_WARN); + rend_cache_decrement_allocation(2); + tt_int_op(rend_cache_total_allocation, OP_EQ, 0); + expect_single_log_msg_containing( + "Underflow in rend_cache_decrement_allocation"); + teardown_capture_of_logs(); + + // And again + rend_cache_decrement_allocation(2); + tt_int_op(rend_cache_total_allocation, OP_EQ, 0); + + done: + teardown_capture_of_logs(); +} + +static void +test_rend_cache_increment_allocation(void *data) +{ + (void)data; + + // Test when the cache is not overflowing + rend_cache_total_allocation = 5; + rend_cache_increment_allocation(3); + tt_int_op(rend_cache_total_allocation, OP_EQ, 8); + + // Test when there are too many allocations + rend_cache_total_allocation = SIZE_MAX-1; + setup_full_capture_of_logs(LOG_WARN); + rend_cache_increment_allocation(2); + tt_u64_op(rend_cache_total_allocation, OP_EQ, SIZE_MAX); + expect_single_log_msg_containing( + "Overflow in rend_cache_increment_allocation"); + teardown_capture_of_logs(); + + // And again + rend_cache_increment_allocation(2); + tt_u64_op(rend_cache_total_allocation, OP_EQ, SIZE_MAX); + + done: + teardown_capture_of_logs(); +} + +static void +test_rend_cache_failure_intro_entry_new(void *data) +{ + time_t now; + rend_cache_failure_intro_t *entry; + rend_intro_point_failure_t failure; + + (void)data; + + failure = INTRO_POINT_FAILURE_TIMEOUT; + now = time(NULL); + entry = rend_cache_failure_intro_entry_new(failure); + + tt_int_op(entry->failure_type, OP_EQ, INTRO_POINT_FAILURE_TIMEOUT); + tt_int_op(entry->created_ts, OP_GE, now-5); + tt_int_op(entry->created_ts, OP_LE, now+5); + + done: + tor_free(entry); +} + +static void +test_rend_cache_failure_intro_lookup(void *data) +{ + (void)data; + int ret; + rend_cache_failure_t *failure; + rend_cache_failure_intro_t *ip; + rend_cache_failure_intro_t *entry; + const char key_ip_one[DIGEST_LEN] = "ip1"; + const char key_ip_two[DIGEST_LEN] = "ip2"; + const char key_foo[DIGEST_LEN] = "foo1"; + + rend_cache_init(); + + failure = rend_cache_failure_entry_new(); + ip = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); + digestmap_set(failure->intro_failures, key_ip_one, ip); + strmap_set_lc(rend_cache_failure, "foo1", failure); + + // Test not found + ret = cache_failure_intro_lookup((const uint8_t *) key_foo, "foo2", NULL); + tt_int_op(ret, OP_EQ, 0); + + // Test found with no intro failures in it + ret = cache_failure_intro_lookup((const uint8_t *) key_ip_two, "foo1", NULL); + tt_int_op(ret, OP_EQ, 0); + + // Test found + ret = cache_failure_intro_lookup((const uint8_t *) key_ip_one, "foo1", NULL); + tt_int_op(ret, OP_EQ, 1); + + // Test found and asking for entry + cache_failure_intro_lookup((const uint8_t *) key_ip_one, "foo1", &entry); + tt_assert(entry); + tt_assert(entry == ip); + + done: + rend_cache_free_all(); +} + +static void +test_rend_cache_clean(void *data) +{ + rend_cache_entry_t *one, *two; + rend_service_descriptor_t *desc_one, *desc_two; + strmap_iter_t *iter = NULL; + const char *key; + void *val; + + (void)data; + + rend_cache_init(); + + // Test with empty rendcache + rend_cache_clean(time(NULL), REND_CACHE_TYPE_CLIENT); + tt_int_op(strmap_size(rend_cache), OP_EQ, 0); + + // Test with two old entries + one = tor_malloc_zero(sizeof(rend_cache_entry_t)); + two = tor_malloc_zero(sizeof(rend_cache_entry_t)); + desc_one = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + desc_two = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + one->parsed = desc_one; + two->parsed = desc_two; + + desc_one->timestamp = time(NULL) + TIME_IN_THE_PAST; + desc_two->timestamp = (time(NULL) + TIME_IN_THE_PAST) - 10; + desc_one->pk = pk_generate(0); + desc_two->pk = pk_generate(1); + + strmap_set_lc(rend_cache, "foo1", one); + strmap_set_lc(rend_cache, "foo2", two); + + rend_cache_clean(time(NULL), REND_CACHE_TYPE_CLIENT); + tt_int_op(strmap_size(rend_cache), OP_EQ, 0); + + // Test with one old entry and one newer entry + one = tor_malloc_zero(sizeof(rend_cache_entry_t)); + two = tor_malloc_zero(sizeof(rend_cache_entry_t)); + desc_one = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + desc_two = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + one->parsed = desc_one; + two->parsed = desc_two; + + desc_one->timestamp = (time(NULL) + TIME_IN_THE_PAST) - 10; + desc_two->timestamp = time(NULL) - 100; + desc_one->pk = pk_generate(0); + desc_two->pk = pk_generate(1); + + strmap_set_lc(rend_cache, "foo1", one); + strmap_set_lc(rend_cache, "foo2", two); + + rend_cache_clean(time(NULL), REND_CACHE_TYPE_CLIENT); + tt_int_op(strmap_size(rend_cache), OP_EQ, 1); + + iter = strmap_iter_init(rend_cache); + strmap_iter_get(iter, &key, &val); + tt_str_op(key, OP_EQ, "foo2"); + + done: + rend_cache_free_all(); +} + +static void +test_rend_cache_failure_entry_new(void *data) +{ + rend_cache_failure_t *failure; + + (void)data; + + failure = rend_cache_failure_entry_new(); + tt_assert(failure); + tt_int_op(digestmap_size(failure->intro_failures), OP_EQ, 0); + + done: + rend_cache_failure_entry_free(failure); +} + +static void +test_rend_cache_failure_entry_free(void *data) +{ + (void)data; + + // Test that it can deal with a NULL argument + rend_cache_failure_entry_free_(NULL); + + /* done: */ + /* (void)0; */ +} + +static void +test_rend_cache_failure_clean(void *data) +{ + rend_cache_failure_t *failure; + rend_cache_failure_intro_t *ip_one, *ip_two; + + const char key_one[DIGEST_LEN] = "ip1"; + const char key_two[DIGEST_LEN] = "ip2"; + + (void)data; + + rend_cache_init(); + + // Test with empty failure cache + rend_cache_failure_clean(time(NULL)); + tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0); + + // Test with one empty failure entry + failure = rend_cache_failure_entry_new(); + strmap_set_lc(rend_cache_failure, "foo1", failure); + rend_cache_failure_clean(time(NULL)); + tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0); + + // Test with one new intro point + failure = rend_cache_failure_entry_new(); + ip_one = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); + digestmap_set(failure->intro_failures, key_one, ip_one); + strmap_set_lc(rend_cache_failure, "foo1", failure); + rend_cache_failure_clean(time(NULL)); + tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 1); + + // Test with one old intro point + rend_cache_failure_purge(); + failure = rend_cache_failure_entry_new(); + ip_one = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); + ip_one->created_ts = time(NULL) - 7*60; + digestmap_set(failure->intro_failures, key_one, ip_one); + strmap_set_lc(rend_cache_failure, "foo1", failure); + rend_cache_failure_clean(time(NULL)); + tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0); + + // Test with one old intro point and one new one + rend_cache_failure_purge(); + failure = rend_cache_failure_entry_new(); + ip_one = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); + ip_one->created_ts = time(NULL) - 7*60; + digestmap_set(failure->intro_failures, key_one, ip_one); + ip_two = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); + ip_two->created_ts = time(NULL) - 2*60; + digestmap_set(failure->intro_failures, key_two, ip_two); + strmap_set_lc(rend_cache_failure, "foo1", failure); + rend_cache_failure_clean(time(NULL)); + tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 1); + tt_int_op(digestmap_size(failure->intro_failures), OP_EQ, 1); + + done: + rend_cache_free_all(); +} + +static void +test_rend_cache_failure_remove(void *data) +{ + rend_service_descriptor_t *desc; + (void)data; + + rend_cache_init(); + + // Test that it deals well with a NULL desc + rend_cache_failure_remove(NULL); + + // Test a descriptor that isn't in the cache + desc = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + desc->pk = pk_generate(0); + rend_cache_failure_remove(desc); + + // There seems to not exist any way of getting rend_cache_failure_remove() + // to fail because of a problem with rend_get_service_id from here + rend_cache_free_all(); + + rend_service_descriptor_free(desc); + /* done: */ + /* (void)0; */ +} + +static void +test_rend_cache_free_all(void *data) +{ + rend_cache_failure_t *failure; + rend_cache_entry_t *one; + rend_service_descriptor_t *desc_one; + + (void)data; + + rend_cache_init(); + + failure = rend_cache_failure_entry_new(); + strmap_set_lc(rend_cache_failure, "foo1", failure); + + one = tor_malloc_zero(sizeof(rend_cache_entry_t)); + desc_one = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + one->parsed = desc_one; + desc_one->timestamp = time(NULL) + TIME_IN_THE_PAST; + desc_one->pk = pk_generate(0); + strmap_set_lc(rend_cache, "foo1", one); + + rend_cache_free_all(); + + tt_ptr_op(rend_cache, OP_EQ, NULL); + tt_ptr_op(rend_cache_v2_dir, OP_EQ, NULL); + tt_ptr_op(rend_cache_failure, OP_EQ, NULL); + tt_assert(!rend_cache_total_allocation); + + done: + rend_cache_free_all(); +} + +static void +test_rend_cache_entry_free(void *data) +{ + (void)data; + rend_cache_entry_t *e; + + // Handles NULL correctly + rend_cache_entry_free_(NULL); + + // Handles NULL descriptor correctly + e = tor_malloc_zero(sizeof(rend_cache_entry_t)); + rend_cache_entry_free(e); + + // Handles non-NULL descriptor correctly + e = tor_malloc_zero(sizeof(rend_cache_entry_t)); + e->desc = tor_malloc(10); + rend_cache_entry_free(e); + + /* done: */ + /* (void)0; */ +} + +static void +test_rend_cache_purge(void *data) +{ + (void)data; + + // Deals with a NULL rend_cache + rend_cache_purge(); + tt_assert(rend_cache); + tt_assert(strmap_size(rend_cache) == 0); + + // Deals with existing rend_cache + rend_cache_free_all(); + rend_cache_init(); + tt_assert(rend_cache); + tt_assert(strmap_size(rend_cache) == 0); + + rend_cache_purge(); + tt_assert(rend_cache); + tt_assert(strmap_size(rend_cache) == 0); + + done: + rend_cache_free_all(); +} + +static void +test_rend_cache_failure_intro_add(void *data) +{ + (void)data; + rend_cache_failure_t *fail_entry; + rend_cache_failure_intro_t *entry; + const char identity[DIGEST_LEN] = "foo1"; + + rend_cache_init(); + + // Adds non-existing entry + cache_failure_intro_add((const uint8_t *) identity, "foo2", + INTRO_POINT_FAILURE_TIMEOUT); + fail_entry = strmap_get_lc(rend_cache_failure, "foo2"); + tt_assert(fail_entry); + tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1); + entry = digestmap_get(fail_entry->intro_failures, identity); + tt_assert(entry); + + // Adds existing entry + cache_failure_intro_add((const uint8_t *) identity, "foo2", + INTRO_POINT_FAILURE_TIMEOUT); + fail_entry = strmap_get_lc(rend_cache_failure, "foo2"); + tt_assert(fail_entry); + tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1); + entry = digestmap_get(fail_entry->intro_failures, identity); + tt_assert(entry); + + done: + rend_cache_free_all(); +} + +static void +test_rend_cache_intro_failure_note(void *data) +{ + (void)data; + rend_cache_failure_t *fail_entry; + rend_cache_failure_intro_t *entry; + const char key[DIGEST_LEN] = "foo1"; + + rend_cache_init(); + + // Test not found + rend_cache_intro_failure_note(INTRO_POINT_FAILURE_TIMEOUT, + (const uint8_t *) key, "foo2"); + fail_entry = strmap_get_lc(rend_cache_failure, "foo2"); + tt_assert(fail_entry); + tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1); + entry = digestmap_get(fail_entry->intro_failures, key); + tt_assert(entry); + tt_int_op(entry->failure_type, OP_EQ, INTRO_POINT_FAILURE_TIMEOUT); + + // Test found + rend_cache_intro_failure_note(INTRO_POINT_FAILURE_UNREACHABLE, + (const uint8_t *) key, "foo2"); + tt_int_op(entry->failure_type, OP_EQ, INTRO_POINT_FAILURE_UNREACHABLE); + + done: + rend_cache_free_all(); +} + +#define NS_SUBMODULE clean_v2_descs_as_dir + +static void +test_rend_cache_clean_v2_descs_as_dir(void *data) +{ + rend_cache_entry_t *e; + time_t now, cutoff; + rend_service_descriptor_t *desc; + now = time(NULL); + cutoff = now - (REND_CACHE_MAX_AGE + REND_CACHE_MAX_SKEW); + const char key[DIGEST_LEN] = "abcde"; + + (void)data; + + rend_cache_init(); + + // Test running with an empty cache + rend_cache_clean_v2_descs_as_dir(cutoff); + tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 0); + + // Test with only one new entry + e = tor_malloc_zero(sizeof(rend_cache_entry_t)); + e->last_served = now; + desc = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + desc->timestamp = now; + desc->pk = pk_generate(0); + e->parsed = desc; + digestmap_set(rend_cache_v2_dir, key, e); + + /* Set the cutoff to minus 10 seconds. */ + rend_cache_clean_v2_descs_as_dir(cutoff - 10); + tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 1); + + // Test with one old entry + desc->timestamp = cutoff - 1000; + rend_cache_clean_v2_descs_as_dir(cutoff); + tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 0); + + done: + rend_cache_free_all(); +} + +#undef NS_SUBMODULE + +static void +test_rend_cache_entry_allocation(void *data) +{ + (void)data; + + size_t ret; + rend_cache_entry_t *e = NULL; + + // Handles a null argument + ret = rend_cache_entry_allocation(NULL); + tt_int_op(ret, OP_EQ, 0); + + // Handles a non-null argument + e = tor_malloc_zero(sizeof(rend_cache_entry_t)); + ret = rend_cache_entry_allocation(e); + tt_int_op(ret, OP_GT, sizeof(rend_cache_entry_t)); + + done: + tor_free(e); +} + +static void +test_rend_cache_failure_intro_entry_free(void *data) +{ + (void)data; + rend_cache_failure_intro_t *entry; + + // Handles a null argument + rend_cache_failure_intro_entry_free_(NULL); + + // Handles a non-null argument + entry = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); + rend_cache_failure_intro_entry_free(entry); +} + +static void +test_rend_cache_failure_purge(void *data) +{ + (void)data; + + // Handles a null failure cache + strmap_free(rend_cache_failure, rend_cache_failure_entry_free_void); + rend_cache_failure = NULL; + + rend_cache_failure_purge(); + + tt_ptr_op(rend_cache_failure, OP_NE, NULL); + tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0); + + done: + rend_cache_free_all(); +} + +static void +test_rend_cache_validate_intro_point_failure(void *data) +{ + (void)data; + rend_service_descriptor_t *desc = NULL; + char *service_id = NULL; + rend_intro_point_t *intro = NULL; + const char *identity = NULL; + rend_cache_failure_t *failure; + rend_cache_failure_intro_t *ip; + + rend_cache_init(); + + create_descriptor(&desc, &service_id, 3); + desc->timestamp = time(NULL) + RECENT_TIME; + + intro = (rend_intro_point_t *)smartlist_get(desc->intro_nodes, 0); + identity = intro->extend_info->identity_digest; + + failure = rend_cache_failure_entry_new(); + ip = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); + digestmap_set(failure->intro_failures, identity, ip); + strmap_set_lc(rend_cache_failure, service_id, failure); + + // Test when we have an intro point in our cache + validate_intro_point_failure(desc, service_id); + tt_int_op(smartlist_len(desc->intro_nodes), OP_EQ, 2); + + done: + rend_cache_free_all(); + rend_service_descriptor_free(desc); + tor_free(service_id); +} + +struct testcase_t rend_cache_tests[] = { + { "init", test_rend_cache_init, 0, NULL, NULL }, + { "decrement_allocation", test_rend_cache_decrement_allocation, 0, + NULL, NULL }, + { "increment_allocation", test_rend_cache_increment_allocation, 0, + NULL, NULL }, + { "clean", test_rend_cache_clean, TT_FORK, NULL, NULL }, + { "clean_v2_descs_as_dir", test_rend_cache_clean_v2_descs_as_dir, 0, + NULL, NULL }, + { "entry_allocation", test_rend_cache_entry_allocation, 0, NULL, NULL }, + { "entry_free", test_rend_cache_entry_free, 0, NULL, NULL }, + { "failure_intro_entry_free", test_rend_cache_failure_intro_entry_free, 0, + NULL, NULL }, + { "free_all", test_rend_cache_free_all, 0, NULL, NULL }, + { "purge", test_rend_cache_purge, 0, NULL, NULL }, + { "failure_clean", test_rend_cache_failure_clean, 0, NULL, NULL }, + { "failure_entry_new", test_rend_cache_failure_entry_new, 0, NULL, NULL }, + { "failure_entry_free", test_rend_cache_failure_entry_free, 0, NULL, NULL }, + { "failure_intro_add", test_rend_cache_failure_intro_add, 0, NULL, NULL }, + { "failure_intro_entry_new", test_rend_cache_failure_intro_entry_new, 0, + NULL, NULL }, + { "failure_intro_lookup", test_rend_cache_failure_intro_lookup, 0, + NULL, NULL }, + { "failure_purge", test_rend_cache_failure_purge, 0, NULL, NULL }, + { "failure_remove", test_rend_cache_failure_remove, 0, NULL, NULL }, + { "intro_failure_note", test_rend_cache_intro_failure_note, 0, NULL, NULL }, + { "lookup", test_rend_cache_lookup_entry, 0, NULL, NULL }, + { "lookup_v2_desc_as_dir", test_rend_cache_lookup_v2_desc_as_dir, 0, + NULL, NULL }, + { "store_v2_desc_as_client", test_rend_cache_store_v2_desc_as_client, 0, + NULL, NULL }, + { "store_v2_desc_as_client_with_different_time", + test_rend_cache_store_v2_desc_as_client_with_different_time, 0, + NULL, NULL }, + { "store_v2_desc_as_dir", test_rend_cache_store_v2_desc_as_dir, 0, + NULL, NULL }, + { "store_v2_desc_as_dir_with_different_time", + test_rend_cache_store_v2_desc_as_dir_with_different_time, 0, NULL, NULL }, + { "store_v2_desc_as_dir_with_different_content", + test_rend_cache_store_v2_desc_as_dir_with_different_content, 0, + NULL, NULL }, + { "validate_intro_point_failure", + test_rend_cache_validate_intro_point_failure, 0, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_replay.c b/src/wraith/src/test/test_replay.c new file mode 100644 index 000000000..d8dcc7370 --- /dev/null +++ b/src/wraith/src/test/test_replay.c @@ -0,0 +1,391 @@ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define REPLAYCACHE_PRIVATE + +#include "orconfig.h" +#include "or.h" +#include "replaycache.h" +#include "test.h" + +static const char *test_buffer = + "Lorem ipsum dolor sit amet, consectetur adipisici elit, sed do eiusmod" + " tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim" + " veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea" + " commodo consequat. Duis aute irure dolor in reprehenderit in voluptate" + " velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint" + " occaecat cupidatat non proident, sunt in culpa qui officia deserunt" + " mollit anim id est laborum."; + +static const char *test_buffer_2 = + "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis" + " praesentium voluptatum deleniti atque corrupti quos dolores et quas" + " molestias excepturi sint occaecati cupiditate non provident, similique" + " sunt in culpa qui officia deserunt mollitia animi, id est laborum et" + " dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio." + " Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil" + " impedit quo minus id quod maxime placeat facere possimus, omnis voluptas" + " assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut" + " officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates" + " repudiandae sint et molestiae non recusandae. Itaque earum rerum hic" + " tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias" + " consequatur aut perferendis doloribus asperiores repellat."; + +static void +test_replaycache_alloc(void *arg) +{ + replaycache_t *r = NULL; + + (void)arg; + r = replaycache_new(600, 300); + tt_ptr_op(r, OP_NE, NULL); + + done: + if (r) replaycache_free(r); + + return; +} + +static void +test_replaycache_badalloc(void *arg) +{ + replaycache_t *r = NULL; + + /* Negative horizon should fail */ + (void)arg; + r = replaycache_new(-600, 300); + tt_ptr_op(r, OP_EQ, NULL); + /* Negative interval should get adjusted to zero */ + r = replaycache_new(600, -300); + tt_ptr_op(r, OP_NE, NULL); + tt_int_op(r->scrub_interval,OP_EQ, 0); + replaycache_free(r); + /* Negative horizon and negative interval should still fail */ + r = replaycache_new(-600, -300); + tt_ptr_op(r, OP_EQ, NULL); + + done: + if (r) replaycache_free(r); + + return; +} + +static void +test_replaycache_free_null(void *arg) +{ + (void)arg; + replaycache_free_(NULL); + /* Assert that we're here without horrible death */ + tt_assert(1); + + done: + return; +} + +static void +test_replaycache_miss(void *arg) +{ + replaycache_t *r = NULL; + int result; + + (void)arg; + r = replaycache_new(600, 300); + tt_ptr_op(r, OP_NE, NULL); + + result = + replaycache_add_and_test_internal(1200, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 0); + + /* make sure a different buffer misses as well */ + result = + replaycache_add_and_test_internal(1200, NULL, test_buffer_2, + strlen(test_buffer_2), NULL); + tt_int_op(result,OP_EQ, 0); + + /* poke the bad-parameter error case too */ + result = + replaycache_add_and_test_internal(1200, NULL, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 0); + + done: + if (r) replaycache_free(r); + + return; +} + +static void +test_replaycache_hit(void *arg) +{ + replaycache_t *r = NULL; + int result; + + (void)arg; + r = replaycache_new(600, 300); + tt_ptr_op(r, OP_NE, NULL); + + result = + replaycache_add_and_test_internal(1200, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 0); + + result = + replaycache_add_and_test_internal(1300, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 1); + + /* make sure a different buffer misses then hits as well */ + + result = + replaycache_add_and_test_internal(1200, r, test_buffer_2, + strlen(test_buffer_2), NULL); + tt_int_op(result,OP_EQ, 0); + + result = + replaycache_add_and_test_internal(1300, r, test_buffer_2, + strlen(test_buffer_2), NULL); + tt_int_op(result,OP_EQ, 1); + + done: + if (r) replaycache_free(r); + + return; +} + +static void +test_replaycache_age(void *arg) +{ + replaycache_t *r = NULL; + int result; + + (void)arg; + r = replaycache_new(600, 300); + tt_ptr_op(r, OP_NE, NULL); + + result = + replaycache_add_and_test_internal(1200, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 0); + + result = + replaycache_add_and_test_internal(1300, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 1); + + result = + replaycache_add_and_test_internal(3000, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 0); + + done: + if (r) replaycache_free(r); + + return; +} + +static void +test_replaycache_elapsed(void *arg) +{ + replaycache_t *r = NULL; + int result; + time_t elapsed; + + (void)arg; + r = replaycache_new(600, 300); + tt_ptr_op(r, OP_NE, NULL); + + result = + replaycache_add_and_test_internal(1200, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 0); + + result = + replaycache_add_and_test_internal(1300, r, test_buffer, + strlen(test_buffer), &elapsed); + tt_int_op(result,OP_EQ, 1); + tt_int_op(elapsed,OP_EQ, 100); + + done: + if (r) replaycache_free(r); + + return; +} + +static void +test_replaycache_noexpire(void *arg) +{ + replaycache_t *r = NULL; + int result; + + (void)arg; + r = replaycache_new(0, 0); + tt_ptr_op(r, OP_NE, NULL); + + result = + replaycache_add_and_test_internal(1200, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 0); + + result = + replaycache_add_and_test_internal(1300, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 1); + + result = + replaycache_add_and_test_internal(3000, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 1); + + done: + if (r) replaycache_free(r); + + return; +} + +static void +test_replaycache_scrub(void *arg) +{ + replaycache_t *r = NULL; + int result; + + (void)arg; + r = replaycache_new(600, 300); + tt_ptr_op(r, OP_NE, NULL); + + /* Set up like in test_replaycache_hit() */ + result = + replaycache_add_and_test_internal(100, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 0); + + result = + replaycache_add_and_test_internal(200, r, test_buffer, + strlen(test_buffer), NULL); + tt_int_op(result,OP_EQ, 1); + + /* + * Poke a few replaycache_scrub_if_needed_internal() error cases that + * can't happen through replaycache_add_and_test_internal() + */ + + /* Null cache */ + replaycache_scrub_if_needed_internal(300, NULL); + /* Assert we're still here */ + tt_assert(1); + + /* Make sure we hit the aging-out case too */ + replaycache_scrub_if_needed_internal(1500, r); + /* Assert that we aged it */ + tt_int_op(digest256map_size(r->digests_seen),OP_EQ, 0); + + done: + if (r) replaycache_free(r); + + return; +} + +static void +test_replaycache_future(void *arg) +{ + replaycache_t *r = NULL; + int result; + time_t elapsed = 0; + + (void)arg; + r = replaycache_new(600, 300); + tt_ptr_op(r, OP_NE, NULL); + + /* Set up like in test_replaycache_hit() */ + result = + replaycache_add_and_test_internal(100, r, test_buffer, + strlen(test_buffer), &elapsed); + tt_int_op(result,OP_EQ, 0); + /* elapsed should still be 0, since it wasn't written */ + tt_int_op(elapsed,OP_EQ, 0); + + result = + replaycache_add_and_test_internal(200, r, test_buffer, + strlen(test_buffer), &elapsed); + tt_int_op(result,OP_EQ, 1); + /* elapsed should be the time since the last hit */ + tt_int_op(elapsed,OP_EQ, 100); + + /* + * Now let's turn the clock back to get coverage on the cache entry from the + * future not-supposed-to-happen case. + */ + result = + replaycache_add_and_test_internal(150, r, test_buffer, + strlen(test_buffer), &elapsed); + /* We should still get a hit */ + tt_int_op(result,OP_EQ, 1); + /* ...but it shouldn't let us see a negative elapsed time */ + tt_int_op(elapsed,OP_EQ, 0); + + done: + if (r) replaycache_free(r); + + return; +} + +static void +test_replaycache_realtime(void *arg) +{ + replaycache_t *r = NULL; + /* + * Negative so we fail if replaycache_add_test_and_elapsed() doesn't + * write to elapsed. + */ + time_t elapsed = -1; + int result; + + /* Test the realtime as well as *_internal() entry points */ + (void)arg; + r = replaycache_new(600, 300); + tt_ptr_op(r, OP_NE, NULL); + + /* This should miss */ + result = + replaycache_add_and_test(r, test_buffer, strlen(test_buffer)); + tt_int_op(result,OP_EQ, 0); + + /* This should hit */ + result = + replaycache_add_and_test(r, test_buffer, strlen(test_buffer)); + tt_int_op(result,OP_EQ, 1); + + /* This should hit and return a small elapsed time */ + result = + replaycache_add_test_and_elapsed(r, test_buffer, + strlen(test_buffer), &elapsed); + tt_int_op(result,OP_EQ, 1); + tt_assert(elapsed >= 0); + tt_assert(elapsed <= 5); + + /* Scrub it to exercise that entry point too */ + replaycache_scrub_if_needed(r); + + done: + if (r) replaycache_free(r); + return; +} + +#define REPLAYCACHE_LEGACY(name) \ + { #name, test_replaycache_ ## name , 0, NULL, NULL } + +struct testcase_t replaycache_tests[] = { + REPLAYCACHE_LEGACY(alloc), + REPLAYCACHE_LEGACY(badalloc), + REPLAYCACHE_LEGACY(free_null), + REPLAYCACHE_LEGACY(miss), + REPLAYCACHE_LEGACY(hit), + REPLAYCACHE_LEGACY(age), + REPLAYCACHE_LEGACY(elapsed), + REPLAYCACHE_LEGACY(noexpire), + REPLAYCACHE_LEGACY(scrub), + REPLAYCACHE_LEGACY(future), + REPLAYCACHE_LEGACY(realtime), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_router.c b/src/wraith/src/test/test_router.c new file mode 100644 index 000000000..4e96e2453 --- /dev/null +++ b/src/wraith/src/test/test_router.c @@ -0,0 +1,112 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* Copyright (c) 2017, isis agora lovecruft */ +/* See LICENSE for licensing information */ + +/** + * \file test_router.c + * \brief Unittests for code in src/or/router.c + **/ + +#include "or.h" +#include "config.h" +#include "crypto_curve25519.h" +#include "crypto_ed25519.h" +#include "router.h" +#include "routerlist.h" + +/* Test suite stuff */ +#include "test.h" + +NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); + +static routerinfo_t* mock_routerinfo; + +static const routerinfo_t* +NS(router_get_my_routerinfo)(void) +{ + crypto_pk_t* ident_key; + crypto_pk_t* tap_key; + time_t now; + + if (!mock_routerinfo) { + /* Mock the published timestamp, otherwise router_dump_router_to_string() + * will poop its pants. */ + time(&now); + + /* We'll need keys, or router_dump_router_to_string() would return NULL. */ + ident_key = pk_generate(0); + tap_key = pk_generate(0); + + tor_assert(ident_key != NULL); + tor_assert(tap_key != NULL); + + mock_routerinfo = tor_malloc_zero(sizeof(routerinfo_t)); + mock_routerinfo->nickname = tor_strdup("ConlonNancarrow"); + mock_routerinfo->addr = 123456789; + mock_routerinfo->or_port = 443; + mock_routerinfo->platform = tor_strdup("unittest"); + mock_routerinfo->cache_info.published_on = now; + mock_routerinfo->identity_pkey = crypto_pk_dup_key(ident_key); + mock_routerinfo->onion_pkey = crypto_pk_dup_key(tap_key); + mock_routerinfo->bandwidthrate = 9001; + mock_routerinfo->bandwidthburst = 9002; + } + + return mock_routerinfo; +} + +/* If no distribution option was set, then check_bridge_distribution_setting() + * should have set it to "any". */ +static void +test_router_dump_router_to_string_no_bridge_distribution_method(void *arg) +{ + const char* needle = "bridge-distribution-request any"; + or_options_t* options = get_options_mutable(); + routerinfo_t* router = NULL; + curve25519_keypair_t ntor_keypair; + ed25519_keypair_t signing_keypair; + char* desc = NULL; + char* found = NULL; + (void)arg; + + NS_MOCK(router_get_my_routerinfo); + + options->ORPort_set = 1; + options->BridgeRelay = 1; + + /* Generate keys which router_dump_router_to_string() expects to exist. */ + tt_int_op(0, ==, curve25519_keypair_generate(&ntor_keypair, 0)); + tt_int_op(0, ==, ed25519_keypair_generate(&signing_keypair, 0)); + + /* Set up part of our routerinfo_t so that we don't trigger any other + * assertions in router_dump_router_to_string(). */ + router = (routerinfo_t*)router_get_my_routerinfo(); + tt_ptr_op(router, !=, NULL); + + router->onion_curve25519_pkey = &ntor_keypair.pubkey; + + /* Generate our server descriptor and ensure that the substring + * "bridge-distribution-request any" occurs somewhere within it. */ + desc = router_dump_router_to_string(router, + router->identity_pkey, + router->onion_pkey, + &ntor_keypair, + &signing_keypair); + tt_ptr_op(desc, !=, NULL); + found = strstr(desc, needle); + tt_ptr_op(found, !=, NULL); + + done: + NS_UNMOCK(router_get_my_routerinfo); + + tor_free(desc); +} + +#define ROUTER_TEST(name, flags) \ + { #name, test_router_ ## name, flags, NULL, NULL } + +struct testcase_t router_tests[] = { + ROUTER_TEST(dump_router_to_string_no_bridge_distribution_method, TT_FORK), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_routerkeys.c b/src/wraith/src/test/test_routerkeys.c new file mode 100644 index 000000000..e4abcdb92 --- /dev/null +++ b/src/wraith/src/test/test_routerkeys.c @@ -0,0 +1,698 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define ROUTER_PRIVATE +#include "or.h" +#include "config.h" +#include "router.h" +#include "routerkeys.h" +#include "util.h" +#include "crypto.h" +#include "torcert.h" +#include "test.h" + +#ifdef _WIN32 +/* For mkdir() */ +#include +#endif + +static void +test_routerkeys_write_fingerprint(void *arg) +{ + crypto_pk_t *key = pk_generate(2); + or_options_t *options = get_options_mutable(); + const char *ddir = get_fname("write_fingerprint"); + char *cp = NULL, *cp2 = NULL; + char fp[FINGERPRINT_LEN+1]; + + (void)arg; + + tt_assert(key); + + options->ORPort_set = 1; /* So that we can get the server ID key */ + tor_free(options->DataDirectory); + options->DataDirectory = tor_strdup(ddir); + options->Nickname = tor_strdup("haflinger"); + set_server_identity_key(key); + set_client_identity_key(crypto_pk_dup_key(key)); + + tt_int_op(0, OP_EQ, check_private_dir(ddir, CPD_CREATE, NULL)); + tt_int_op(crypto_pk_cmp_keys(get_server_identity_key(),key),OP_EQ,0); + + /* Write fingerprint file */ + tt_int_op(0, OP_EQ, router_write_fingerprint(0)); + cp = read_file_to_str(get_fname("write_fingerprint/fingerprint"), + 0, NULL); + crypto_pk_get_fingerprint(key, fp, 0); + tor_asprintf(&cp2, "haflinger %s\n", fp); + tt_str_op(cp, OP_EQ, cp2); + tor_free(cp); + tor_free(cp2); + + /* Write hashed-fingerprint file */ + tt_int_op(0, OP_EQ, router_write_fingerprint(1)); + cp = read_file_to_str(get_fname("write_fingerprint/hashed-fingerprint"), + 0, NULL); + crypto_pk_get_hashed_fingerprint(key, fp); + tor_asprintf(&cp2, "haflinger %s\n", fp); + tt_str_op(cp, OP_EQ, cp2); + tor_free(cp); + tor_free(cp2); + + /* Replace outdated file */ + write_str_to_file(get_fname("write_fingerprint/hashed-fingerprint"), + "junk goes here", 0); + tt_int_op(0, OP_EQ, router_write_fingerprint(1)); + cp = read_file_to_str(get_fname("write_fingerprint/hashed-fingerprint"), + 0, NULL); + crypto_pk_get_hashed_fingerprint(key, fp); + tor_asprintf(&cp2, "haflinger %s\n", fp); + tt_str_op(cp, OP_EQ, cp2); + tor_free(cp); + tor_free(cp2); + + done: + crypto_pk_free(key); + set_client_identity_key(NULL); + tor_free(cp); + tor_free(cp2); +} + +static void +test_routerkeys_ed_certs(void *args) +{ + (void)args; + ed25519_keypair_t kp1, kp2; + tor_cert_t *cert[2] = {NULL, NULL}, *nocert = NULL; + tor_cert_t *parsed_cert[2] = {NULL, NULL}; + time_t now = 1412094534; + uint8_t *junk = NULL; + char *base64 = NULL; + + tt_int_op(0,OP_EQ,ed25519_keypair_generate(&kp1, 0)); + tt_int_op(0,OP_EQ,ed25519_keypair_generate(&kp2, 0)); + + for (int i = 0; i <= 1; ++i) { + uint32_t flags = i ? CERT_FLAG_INCLUDE_SIGNING_KEY : 0; + + cert[i] = tor_cert_create(&kp1, 5, &kp2.pubkey, now, 10000, flags); + tt_assert(cert[i]); + + tt_uint_op(cert[i]->sig_bad, OP_EQ, 0); + tt_uint_op(cert[i]->sig_ok, OP_EQ, 1); + tt_uint_op(cert[i]->cert_expired, OP_EQ, 0); + tt_uint_op(cert[i]->cert_valid, OP_EQ, 1); + tt_int_op(cert[i]->cert_type, OP_EQ, 5); + tt_mem_op(cert[i]->signed_key.pubkey, OP_EQ, &kp2.pubkey.pubkey, 32); + tt_mem_op(cert[i]->signing_key.pubkey, OP_EQ, &kp1.pubkey.pubkey, 32); + tt_int_op(cert[i]->signing_key_included, OP_EQ, i); + + tt_assert(cert[i]->encoded); + tt_int_op(cert[i]->encoded_len, OP_EQ, 104 + 36 * i); + tt_int_op(cert[i]->encoded[0], OP_EQ, 1); + tt_int_op(cert[i]->encoded[1], OP_EQ, 5); + + parsed_cert[i] = tor_cert_parse(cert[i]->encoded, cert[i]->encoded_len); + tt_assert(parsed_cert[i]); + tt_int_op(cert[i]->encoded_len, OP_EQ, parsed_cert[i]->encoded_len); + tt_mem_op(cert[i]->encoded, OP_EQ, parsed_cert[i]->encoded, + cert[i]->encoded_len); + tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 0); + tt_uint_op(parsed_cert[i]->sig_ok, OP_EQ, 0); + tt_uint_op(parsed_cert[i]->cert_expired, OP_EQ, 0); + tt_uint_op(parsed_cert[i]->cert_valid, OP_EQ, 0); + + /* Expired */ + tt_int_op(tor_cert_checksig(parsed_cert[i], &kp1.pubkey, now + 30000), + OP_LT, 0); + tt_uint_op(parsed_cert[i]->cert_expired, OP_EQ, 1); + parsed_cert[i]->cert_expired = 0; + + /* Wrong key */ + tt_int_op(tor_cert_checksig(parsed_cert[i], &kp2.pubkey, now), OP_LT, 0); + tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 1); + parsed_cert[i]->sig_bad = 0; + + /* Missing key */ + int ok = tor_cert_checksig(parsed_cert[i], NULL, now); + tt_int_op(ok < 0, OP_EQ, i == 0); + tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 0); + tt_assert(parsed_cert[i]->sig_ok == (i != 0)); + tt_assert(parsed_cert[i]->cert_valid == (i != 0)); + parsed_cert[i]->sig_bad = 0; + parsed_cert[i]->sig_ok = 0; + parsed_cert[i]->cert_valid = 0; + + /* Right key */ + tt_int_op(tor_cert_checksig(parsed_cert[i], &kp1.pubkey, now), OP_EQ, 0); + tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 0); + tt_uint_op(parsed_cert[i]->sig_ok, OP_EQ, 1); + tt_uint_op(parsed_cert[i]->cert_expired, OP_EQ, 0); + tt_uint_op(parsed_cert[i]->cert_valid, OP_EQ, 1); + } + + /* Now try some junky certs. */ + /* - Truncated */ + nocert = tor_cert_parse(cert[0]->encoded, cert[0]->encoded_len-1); + tt_ptr_op(NULL, OP_EQ, nocert); + + /* - First byte modified */ + cert[0]->encoded[0] = 99; + nocert = tor_cert_parse(cert[0]->encoded, cert[0]->encoded_len); + tt_ptr_op(NULL, OP_EQ, nocert); + cert[0]->encoded[0] = 1; + + /* - Extra byte at the end*/ + junk = tor_malloc_zero(cert[0]->encoded_len + 1); + memcpy(junk, cert[0]->encoded, cert[0]->encoded_len); + nocert = tor_cert_parse(junk, cert[0]->encoded_len+1); + tt_ptr_op(NULL, OP_EQ, nocert); + + /* - Multiple signing key instances */ + tor_free(junk); + junk = tor_malloc_zero(104 + 36 * 2); + junk[0] = 1; /* version */ + junk[1] = 5; /* cert type */ + junk[6] = 1; /* key type */ + junk[39] = 2; /* n_extensions */ + junk[41] = 32; /* extlen */ + junk[42] = 4; /* exttype */ + junk[77] = 32; /* extlen */ + junk[78] = 4; /* exttype */ + nocert = tor_cert_parse(junk, 104 + 36 * 2); + tt_ptr_op(NULL, OP_EQ, nocert); + + done: + tor_cert_free(cert[0]); + tor_cert_free(cert[1]); + tor_cert_free(parsed_cert[0]); + tor_cert_free(parsed_cert[1]); + tor_cert_free(nocert); + tor_free(junk); + tor_free(base64); +} + +static void +test_routerkeys_ed_key_create(void *arg) +{ + (void)arg; + tor_cert_t *cert = NULL; + ed25519_keypair_t *kp1 = NULL, *kp2 = NULL; + time_t now = time(NULL); + + /* This is a simple alias for 'make a new keypair' */ + kp1 = ed_key_new(NULL, 0, 0, 0, 0, &cert); + tt_assert(kp1); + + /* Create a new certificate signed by kp1. */ + kp2 = ed_key_new(kp1, INIT_ED_KEY_NEEDCERT, now, 3600, 4, &cert); + tt_assert(kp2); + tt_assert(cert); + tt_mem_op(&cert->signed_key, OP_EQ, &kp2->pubkey, + sizeof(ed25519_public_key_t)); + tt_assert(! cert->signing_key_included); + + tt_int_op(cert->valid_until, OP_GE, now); + tt_int_op(cert->valid_until, OP_LE, now+7200); + + /* Create a new key-including certificate signed by kp1 */ + ed25519_keypair_free(kp2); + tor_cert_free(cert); + cert = NULL; kp2 = NULL; + kp2 = ed_key_new(kp1, (INIT_ED_KEY_NEEDCERT| + INIT_ED_KEY_INCLUDE_SIGNING_KEY_IN_CERT), + now, 3600, 4, &cert); + tt_assert(kp2); + tt_assert(cert); + tt_assert(cert->signing_key_included); + tt_mem_op(&cert->signed_key, OP_EQ, &kp2->pubkey, + sizeof(ed25519_public_key_t)); + tt_mem_op(&cert->signing_key, OP_EQ, &kp1->pubkey, + sizeof(ed25519_public_key_t)); + + done: + ed25519_keypair_free(kp1); + ed25519_keypair_free(kp2); + tor_cert_free(cert); +} + +static void +test_routerkeys_ed_key_init_basic(void *arg) +{ + (void) arg; + + tor_cert_t *cert = NULL, *cert2 = NULL; + ed25519_keypair_t *kp1 = NULL, *kp2 = NULL, *kp3 = NULL; + time_t now = time(NULL); + char *fname1 = tor_strdup(get_fname("test_ed_key_1")); + char *fname2 = tor_strdup(get_fname("test_ed_key_2")); + struct stat st; + + unlink(fname1); + unlink(fname2); + + /* Fail to load a key that isn't there. */ + kp1 = ed_key_init_from_file(fname1, 0, LOG_INFO, NULL, now, 0, 7, &cert); + tt_assert(kp1 == NULL); + tt_assert(cert == NULL); + + /* Create the key if requested to do so. */ + kp1 = ed_key_init_from_file(fname1, INIT_ED_KEY_CREATE, LOG_INFO, + NULL, now, 0, 7, &cert); + tt_assert(kp1 != NULL); + tt_assert(cert == NULL); + tt_int_op(stat(get_fname("test_ed_key_1_cert"), &st), OP_LT, 0); + tt_int_op(stat(get_fname("test_ed_key_1_secret_key"), &st), OP_EQ, 0); + + /* Fail to load if we say we need a cert */ + kp2 = ed_key_init_from_file(fname1, INIT_ED_KEY_NEEDCERT, LOG_INFO, + NULL, now, 0, 7, &cert); + tt_assert(kp2 == NULL); + + /* Fail to load if we say the wrong key type */ + kp2 = ed_key_init_from_file(fname1, 0, LOG_INFO, + NULL, now, 0, 6, &cert); + tt_assert(kp2 == NULL); + + /* Load successfully if we're not picky, whether we say "create" or not. */ + kp2 = ed_key_init_from_file(fname1, INIT_ED_KEY_CREATE, LOG_INFO, + NULL, now, 0, 7, &cert); + tt_assert(kp2 != NULL); + tt_assert(cert == NULL); + tt_mem_op(kp1, OP_EQ, kp2, sizeof(*kp1)); + ed25519_keypair_free(kp2); kp2 = NULL; + + kp2 = ed_key_init_from_file(fname1, 0, LOG_INFO, + NULL, now, 0, 7, &cert); + tt_assert(kp2 != NULL); + tt_assert(cert == NULL); + tt_mem_op(kp1, OP_EQ, kp2, sizeof(*kp1)); + ed25519_keypair_free(kp2); kp2 = NULL; + + /* Now create a key with a cert. */ + kp2 = ed_key_init_from_file(fname2, (INIT_ED_KEY_CREATE| + INIT_ED_KEY_NEEDCERT), + LOG_INFO, kp1, now, 7200, 7, &cert); + tt_assert(kp2 != NULL); + tt_assert(cert != NULL); + tt_mem_op(kp1, OP_NE, kp2, sizeof(*kp1)); + tt_int_op(stat(get_fname("test_ed_key_2_cert"), &st), OP_EQ, 0); + tt_int_op(stat(get_fname("test_ed_key_2_secret_key"), &st), OP_EQ, 0); + + tt_assert(cert->cert_valid == 1); + tt_mem_op(&cert->signed_key, OP_EQ, &kp2->pubkey, 32); + + /* Now verify we can load the cert... */ + kp3 = ed_key_init_from_file(fname2, (INIT_ED_KEY_CREATE| + INIT_ED_KEY_NEEDCERT), + LOG_INFO, kp1, now, 7200, 7, &cert2); + tt_mem_op(kp2, OP_EQ, kp3, sizeof(*kp2)); + tt_mem_op(cert2->encoded, OP_EQ, cert->encoded, cert->encoded_len); + ed25519_keypair_free(kp3); kp3 = NULL; + tor_cert_free(cert2); cert2 = NULL; + + /* ... even without create... */ + kp3 = ed_key_init_from_file(fname2, INIT_ED_KEY_NEEDCERT, + LOG_INFO, kp1, now, 7200, 7, &cert2); + tt_mem_op(kp2, OP_EQ, kp3, sizeof(*kp2)); + tt_mem_op(cert2->encoded, OP_EQ, cert->encoded, cert->encoded_len); + ed25519_keypair_free(kp3); kp3 = NULL; + tor_cert_free(cert2); cert2 = NULL; + + /* ... but that we don't crash or anything if we say we don't want it. */ + kp3 = ed_key_init_from_file(fname2, INIT_ED_KEY_NEEDCERT, + LOG_INFO, kp1, now, 7200, 7, NULL); + tt_mem_op(kp2, OP_EQ, kp3, sizeof(*kp2)); + ed25519_keypair_free(kp3); kp3 = NULL; + + /* Fail if we're told the wrong signing key */ + kp3 = ed_key_init_from_file(fname2, INIT_ED_KEY_NEEDCERT, + LOG_INFO, kp2, now, 7200, 7, &cert2); + tt_assert(kp3 == NULL); + tt_assert(cert2 == NULL); + + done: + ed25519_keypair_free(kp1); + ed25519_keypair_free(kp2); + ed25519_keypair_free(kp3); + tor_cert_free(cert); + tor_cert_free(cert2); + tor_free(fname1); + tor_free(fname2); +} + +static void +test_routerkeys_ed_key_init_split(void *arg) +{ + (void) arg; + + tor_cert_t *cert = NULL; + ed25519_keypair_t *kp1 = NULL, *kp2 = NULL; + time_t now = time(NULL); + char *fname1 = tor_strdup(get_fname("test_ed_key_3")); + char *fname2 = tor_strdup(get_fname("test_ed_key_4")); + struct stat st; + const uint32_t flags = INIT_ED_KEY_SPLIT|INIT_ED_KEY_MISSING_SECRET_OK; + + unlink(fname1); + unlink(fname2); + + /* Can't load key that isn't there. */ + kp1 = ed_key_init_from_file(fname1, flags, LOG_INFO, NULL, now, 0, 7, &cert); + tt_assert(kp1 == NULL); + tt_assert(cert == NULL); + + /* Create a split key */ + kp1 = ed_key_init_from_file(fname1, flags|INIT_ED_KEY_CREATE, + LOG_INFO, NULL, now, 0, 7, &cert); + tt_assert(kp1 != NULL); + tt_assert(cert == NULL); + tt_int_op(stat(get_fname("test_ed_key_3_cert"), &st), OP_LT, 0); + tt_int_op(stat(get_fname("test_ed_key_3_secret_key"), &st), OP_EQ, 0); + tt_int_op(stat(get_fname("test_ed_key_3_public_key"), &st), OP_EQ, 0); + + /* Load it. */ + kp2 = ed_key_init_from_file(fname1, flags|INIT_ED_KEY_CREATE, + LOG_INFO, NULL, now, 0, 7, &cert); + tt_assert(kp2 != NULL); + tt_assert(cert == NULL); + tt_mem_op(kp1, OP_EQ, kp2, sizeof(*kp2)); + ed25519_keypair_free(kp2); kp2 = NULL; + + /* Okay, try killing the secret key and loading it. */ + unlink(get_fname("test_ed_key_3_secret_key")); + kp2 = ed_key_init_from_file(fname1, flags, + LOG_INFO, NULL, now, 0, 7, &cert); + tt_assert(kp2 != NULL); + tt_assert(cert == NULL); + tt_mem_op(&kp1->pubkey, OP_EQ, &kp2->pubkey, sizeof(kp2->pubkey)); + tt_assert(tor_mem_is_zero((char*)kp2->seckey.seckey, + sizeof(kp2->seckey.seckey))); + ed25519_keypair_free(kp2); kp2 = NULL; + + /* Even when we're told to "create", don't create if there's a public key */ + kp2 = ed_key_init_from_file(fname1, flags|INIT_ED_KEY_CREATE, + LOG_INFO, NULL, now, 0, 7, &cert); + tt_assert(kp2 != NULL); + tt_assert(cert == NULL); + tt_mem_op(&kp1->pubkey, OP_EQ, &kp2->pubkey, sizeof(kp2->pubkey)); + tt_assert(tor_mem_is_zero((char*)kp2->seckey.seckey, + sizeof(kp2->seckey.seckey))); + ed25519_keypair_free(kp2); kp2 = NULL; + + /* Make sure we fail on a tag mismatch, though */ + kp2 = ed_key_init_from_file(fname1, flags, + LOG_INFO, NULL, now, 0, 99, &cert); + tt_assert(kp2 == NULL); + + done: + ed25519_keypair_free(kp1); + ed25519_keypair_free(kp2); + tor_cert_free(cert); + tor_free(fname1); + tor_free(fname2); +} + +static void +test_routerkeys_ed_keys_init_all(void *arg) +{ + (void)arg; + char *dir = tor_strdup(get_fname("test_ed_keys_init_all")); + char *keydir = tor_strdup(get_fname("test_ed_keys_init_all/KEYS")); + or_options_t *options = tor_malloc_zero(sizeof(or_options_t)); + time_t now = time(NULL); + ed25519_public_key_t id; + ed25519_keypair_t sign, auth; + tor_cert_t *link_cert = NULL; + + get_options_mutable()->ORPort_set = 1; + + crypto_pk_t *rsa = pk_generate(0); + + set_server_identity_key(rsa); + set_client_identity_key(rsa); + + router_initialize_tls_context(); + + options->SigningKeyLifetime = 30*86400; + options->TestingAuthKeyLifetime = 2*86400; + options->TestingLinkCertLifetime = 2*86400; + options->TestingSigningKeySlop = 2*86400; + options->TestingAuthKeySlop = 2*3600; + options->TestingLinkKeySlop = 2*3600; + +#ifdef _WIN32 + mkdir(dir); + mkdir(keydir); +#else + mkdir(dir, 0700); + mkdir(keydir, 0700); +#endif /* defined(_WIN32) */ + + options->DataDirectory = dir; + options->KeyDirectory = keydir; + + tt_int_op(1, OP_EQ, load_ed_keys(options, now)); + tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0)); + tt_assert(get_master_identity_key()); + tt_assert(get_master_identity_key()); + tt_assert(get_master_signing_keypair()); + tt_assert(get_current_auth_keypair()); + tt_assert(get_master_signing_key_cert()); + tt_assert(get_current_link_cert_cert()); + tt_assert(get_current_auth_key_cert()); + memcpy(&id, get_master_identity_key(), sizeof(id)); + memcpy(&sign, get_master_signing_keypair(), sizeof(sign)); + memcpy(&auth, get_current_auth_keypair(), sizeof(auth)); + link_cert = tor_cert_dup(get_current_link_cert_cert()); + + /* Call load_ed_keys again, but nothing has changed. */ + tt_int_op(0, OP_EQ, load_ed_keys(options, now)); + tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0)); + tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id)); + tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign)); + tt_mem_op(&auth, OP_EQ, get_current_auth_keypair(), sizeof(auth)); + tt_assert(tor_cert_eq(link_cert, get_current_link_cert_cert())); + + /* Force a reload: we make new link/auth keys. */ + routerkeys_free_all(); + tt_int_op(1, OP_EQ, load_ed_keys(options, now)); + tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0)); + tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id)); + tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign)); + tt_assert(tor_cert_eq(link_cert, get_current_link_cert_cert())); + tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth)); + tt_assert(get_master_signing_key_cert()); + tt_assert(get_current_link_cert_cert()); + tt_assert(get_current_auth_key_cert()); + tor_cert_free(link_cert); + link_cert = tor_cert_dup(get_current_link_cert_cert()); + memcpy(&auth, get_current_auth_keypair(), sizeof(auth)); + + /* Force a link/auth-key regeneration by advancing time. */ + tt_int_op(0, OP_EQ, load_ed_keys(options, now+3*86400)); + tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now+3*86400, 0)); + tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id)); + tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign)); + tt_assert(! tor_cert_eq(link_cert, get_current_link_cert_cert())); + tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth)); + tt_assert(get_master_signing_key_cert()); + tt_assert(get_current_link_cert_cert()); + tt_assert(get_current_auth_key_cert()); + tor_cert_free(link_cert); + link_cert = tor_cert_dup(get_current_link_cert_cert()); + memcpy(&auth, get_current_auth_keypair(), sizeof(auth)); + + /* Force a signing-key regeneration by advancing time. */ + tt_int_op(1, OP_EQ, load_ed_keys(options, now+100*86400)); + tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now+100*86400, 0)); + tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id)); + tt_mem_op(&sign, OP_NE, get_master_signing_keypair(), sizeof(sign)); + tt_assert(! tor_cert_eq(link_cert, get_current_link_cert_cert())); + tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth)); + tt_assert(get_master_signing_key_cert()); + tt_assert(get_current_link_cert_cert()); + tt_assert(get_current_auth_key_cert()); + memcpy(&sign, get_master_signing_keypair(), sizeof(sign)); + tor_cert_free(link_cert); + link_cert = tor_cert_dup(get_current_link_cert_cert()); + memcpy(&auth, get_current_auth_keypair(), sizeof(auth)); + + /* Demonstrate that we can start up with no secret identity key */ + routerkeys_free_all(); + unlink(get_fname("test_ed_keys_init_all/KEYS/" + "ed25519_master_id_secret_key")); + tt_int_op(1, OP_EQ, load_ed_keys(options, now)); + tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0)); + tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id)); + tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign)); + tt_assert(! tor_cert_eq(link_cert, get_current_link_cert_cert())); + tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth)); + tt_assert(get_master_signing_key_cert()); + tt_assert(get_current_link_cert_cert()); + tt_assert(get_current_auth_key_cert()); + + /* But we're in trouble if we have no id key and our signing key has + expired. */ + log_global_min_severity_ = LOG_ERR; /* Suppress warnings. + * XXX (better way to do this)? */ + routerkeys_free_all(); + tt_int_op(-1, OP_EQ, load_ed_keys(options, now+200*86400)); + + done: + tor_free(dir); + tor_free(keydir); + tor_free(options); + tor_cert_free(link_cert); + routerkeys_free_all(); +} + +static void +test_routerkeys_cross_certify_ntor(void *args) +{ + (void) args; + + tor_cert_t *cert = NULL; + curve25519_keypair_t onion_keys; + ed25519_public_key_t master_key; + ed25519_public_key_t onion_check_key; + time_t now = time(NULL); + int sign; + + tt_int_op(0, OP_EQ, ed25519_public_from_base64(&master_key, + "IamwritingthesetestsOnARainyAfternoonin2014")); + tt_int_op(0, OP_EQ, curve25519_keypair_generate(&onion_keys, 0)); + cert = make_ntor_onion_key_crosscert(&onion_keys, + &master_key, + now, 10000, + &sign); + tt_assert(cert); + tt_assert(sign == 0 || sign == 1); + tt_int_op(cert->cert_type, OP_EQ, CERT_TYPE_ONION_ID); + tt_int_op(1, OP_EQ, ed25519_pubkey_eq(&cert->signed_key, &master_key)); + tt_int_op(0, OP_EQ, ed25519_public_key_from_curve25519_public_key( + &onion_check_key, &onion_keys.pubkey, sign)); + tt_int_op(0, OP_EQ, tor_cert_checksig(cert, &onion_check_key, now)); + + done: + tor_cert_free(cert); +} + +static void +test_routerkeys_cross_certify_tap(void *args) +{ + (void)args; + uint8_t *cc = NULL; + int cc_len; + ed25519_public_key_t master_key; + crypto_pk_t *onion_key = pk_generate(2), *id_key = pk_generate(1); + char digest[20]; + char buf[128]; + int n; + + tt_int_op(0, OP_EQ, ed25519_public_from_base64(&master_key, + "IAlreadyWroteTestsForRouterdescsUsingTheseX")); + + cc = make_tap_onion_key_crosscert(onion_key, + &master_key, + id_key, &cc_len); + tt_assert(cc); + tt_assert(cc_len); + + n = crypto_pk_public_checksig(onion_key, buf, sizeof(buf), + (char*)cc, cc_len); + tt_int_op(n,OP_GT,0); + tt_int_op(n,OP_EQ,52); + + crypto_pk_get_digest(id_key, digest); + tt_mem_op(buf,OP_EQ,digest,20); + tt_mem_op(buf+20,OP_EQ,master_key.pubkey,32); + + tt_int_op(0, OP_EQ, check_tap_onion_key_crosscert(cc, cc_len, + onion_key, &master_key, (uint8_t*)digest)); + + done: + tor_free(cc); + crypto_pk_free(id_key); + crypto_pk_free(onion_key); +} + +static void +test_routerkeys_rsa_ed_crosscert(void *arg) +{ + (void)arg; + ed25519_public_key_t ed; + crypto_pk_t *rsa = pk_generate(2); + + uint8_t *cc = NULL; + ssize_t cc_len; + time_t expires_in = 1470846177; + + tt_int_op(0, OP_EQ, ed25519_public_from_base64(&ed, + "ThisStringCanContainAnythingSoNoKeyHereNowX")); + cc_len = tor_make_rsa_ed25519_crosscert(&ed, rsa, expires_in, &cc); + + tt_int_op(cc_len, OP_GT, 0); + tt_int_op(cc_len, OP_GT, 37); /* key, expires, siglen */ + tt_mem_op(cc, OP_EQ, ed.pubkey, 32); + time_t expires_out = 3600 * ntohl(get_uint32(cc+32)); + tt_int_op(expires_out, OP_GE, expires_in); + tt_int_op(expires_out, OP_LE, expires_in + 3600); + + tt_int_op(cc_len, OP_EQ, 37 + get_uint8(cc+36)); + + tt_int_op(0, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len, rsa, &ed, + expires_in - 10)); + + /* Now try after it has expired */ + tt_int_op(-4, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len, rsa, &ed, + expires_out + 1)); + + /* Truncated object */ + tt_int_op(-2, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len - 2, rsa, &ed, + expires_in - 10)); + + /* Key not as expected */ + cc[0] ^= 3; + tt_int_op(-3, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len, rsa, &ed, + expires_in - 10)); + cc[0] ^= 3; + + /* Bad signature */ + cc[40] ^= 3; + tt_int_op(-5, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len, rsa, &ed, + expires_in - 10)); + cc[40] ^= 3; + + /* Signature of wrong data */ + cc[0] ^= 3; + ed.pubkey[0] ^= 3; + tt_int_op(-6, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len, rsa, &ed, + expires_in - 10)); + cc[0] ^= 3; + ed.pubkey[0] ^= 3; + + done: + crypto_pk_free(rsa); + tor_free(cc); +} + +#define TEST(name, flags) \ + { #name , test_routerkeys_ ## name, (flags), NULL, NULL } + +struct testcase_t routerkeys_tests[] = { + TEST(write_fingerprint, TT_FORK), + TEST(ed_certs, TT_FORK), + TEST(ed_key_create, TT_FORK), + TEST(ed_key_init_basic, TT_FORK), + TEST(ed_key_init_split, TT_FORK), + TEST(ed_keys_init_all, TT_FORK), + TEST(cross_certify_ntor, 0), + TEST(cross_certify_tap, 0), + TEST(rsa_ed_crosscert, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_routerlist.c b/src/wraith/src/test/test_routerlist.c new file mode 100644 index 000000000..c19d66ef9 --- /dev/null +++ b/src/wraith/src/test/test_routerlist.c @@ -0,0 +1,615 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include +#include + +#define CONNECTION_PRIVATE +#define DIRECTORY_PRIVATE +#define DIRVOTE_PRIVATE +#define ENTRYNODES_PRIVATE +#define HIBERNATE_PRIVATE +#define NETWORKSTATUS_PRIVATE +#define ROUTERLIST_PRIVATE +#define TOR_UNIT_TESTING +#include "or.h" +#include "config.h" +#include "connection.h" +#include "container.h" +#include "control.h" +#include "directory.h" +#include "dirvote.h" +#include "entrynodes.h" +#include "hibernate.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "nodelist.h" +#include "policies.h" +#include "router.h" +#include "routerlist.h" +#include "routerset.h" +#include "routerparse.h" +#include "shared_random.h" +#include "statefile.h" +#include "test.h" +#include "test_dir_common.h" +#include "log_test_helpers.h" + +void construct_consensus(char **consensus_text_md); + +static authority_cert_t *mock_cert; + +static authority_cert_t * +get_my_v3_authority_cert_m(void) +{ + tor_assert(mock_cert); + return mock_cert; +} + +/* 4 digests + 3 sep + pre + post + NULL */ +static char output[4*BASE64_DIGEST256_LEN+3+2+2+1]; + +static void +mock_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, + const char *resource, int pds_flags, + download_want_authority_t want_authority) +{ + (void)dir_purpose; + (void)router_purpose; + (void)pds_flags; + (void)want_authority; + tt_assert(resource); + strlcpy(output, resource, sizeof(output)); + done: + ; +} + +static void +test_routerlist_initiate_descriptor_downloads(void *arg) +{ + const char *prose = "unhurried and wise, we perceive."; + smartlist_t *digests = smartlist_new(); + (void)arg; + + for (int i = 0; i < 20; i++) { + smartlist_add(digests, (char*)prose); + } + + MOCK(directory_get_from_dirserver, mock_get_from_dirserver); + initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_MICRODESC, + digests, 3, 7, 0); + UNMOCK(directory_get_from_dirserver); + + tt_str_op(output, OP_EQ, "d/" + "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-" + "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-" + "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-" + "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4" + ".z"); + + done: + smartlist_free(digests); +} + +static int count = 0; + +static void +mock_initiate_descriptor_downloads(const routerstatus_t *source, + int purpose, smartlist_t *digests, + int lo, int hi, int pds_flags) +{ + (void)source; + (void)purpose; + (void)digests; + (void)pds_flags; + (void)hi; + (void)lo; + count += 1; +} + +static void +test_routerlist_launch_descriptor_downloads(void *arg) +{ + smartlist_t *downloadable = smartlist_new(); + time_t now = time(NULL); + char *cp; + (void)arg; + + for (int i = 0; i < 100; i++) { + cp = tor_malloc(DIGEST256_LEN); + tt_assert(cp); + crypto_rand(cp, DIGEST256_LEN); + smartlist_add(downloadable, cp); + } + + MOCK(initiate_descriptor_downloads, mock_initiate_descriptor_downloads); + launch_descriptor_downloads(DIR_PURPOSE_FETCH_MICRODESC, downloadable, + NULL, now); + tt_int_op(3, OP_EQ, count); + UNMOCK(initiate_descriptor_downloads); + + done: + SMARTLIST_FOREACH(downloadable, char *, cp1, tor_free(cp1)); + smartlist_free(downloadable); +} + +void +construct_consensus(char **consensus_text_md) +{ + networkstatus_t *vote = NULL; + networkstatus_t *v1 = NULL, *v2 = NULL, *v3 = NULL; + networkstatus_voter_info_t *voter = NULL; + authority_cert_t *cert1=NULL, *cert2=NULL, *cert3=NULL; + crypto_pk_t *sign_skey_1=NULL, *sign_skey_2=NULL, *sign_skey_3=NULL; + crypto_pk_t *sign_skey_leg=NULL; + time_t now = time(NULL); + smartlist_t *votes = NULL; + int n_vrs; + + tt_assert(!dir_common_authority_pk_init(&cert1, &cert2, &cert3, + &sign_skey_1, &sign_skey_2, + &sign_skey_3)); + sign_skey_leg = pk_generate(4); + + dir_common_construct_vote_1(&vote, cert1, sign_skey_1, + &dir_common_gen_routerstatus_for_v3ns, + &v1, &n_vrs, now, 1); + networkstatus_vote_free(vote); + tt_assert(v1); + tt_int_op(n_vrs, OP_EQ, 4); + tt_int_op(smartlist_len(v1->routerstatus_list), OP_EQ, 4); + + dir_common_construct_vote_2(&vote, cert2, sign_skey_2, + &dir_common_gen_routerstatus_for_v3ns, + &v2, &n_vrs, now, 1); + networkstatus_vote_free(vote); + tt_assert(v2); + tt_int_op(n_vrs, OP_EQ, 4); + tt_int_op(smartlist_len(v2->routerstatus_list), OP_EQ, 4); + + dir_common_construct_vote_3(&vote, cert3, sign_skey_3, + &dir_common_gen_routerstatus_for_v3ns, + &v3, &n_vrs, now, 1); + + tt_assert(v3); + tt_int_op(n_vrs, OP_EQ, 4); + tt_int_op(smartlist_len(v3->routerstatus_list), OP_EQ, 4); + networkstatus_vote_free(vote); + votes = smartlist_new(); + smartlist_add(votes, v1); + smartlist_add(votes, v2); + smartlist_add(votes, v3); + + *consensus_text_md = networkstatus_compute_consensus(votes, 3, + cert1->identity_key, + sign_skey_1, + "AAAAAAAAAAAAAAAAAAAA", + sign_skey_leg, + FLAV_MICRODESC); + + tt_assert(*consensus_text_md); + + done: + tor_free(voter); + networkstatus_vote_free(v1); + networkstatus_vote_free(v2); + networkstatus_vote_free(v3); + smartlist_free(votes); + authority_cert_free(cert1); + authority_cert_free(cert2); + authority_cert_free(cert3); + crypto_pk_free(sign_skey_1); + crypto_pk_free(sign_skey_2); + crypto_pk_free(sign_skey_3); + crypto_pk_free(sign_skey_leg); +} + +static int mock_usable_consensus_flavor_value = FLAV_NS; + +static int +mock_usable_consensus_flavor(void) +{ + return mock_usable_consensus_flavor_value; +} + +static void +test_router_pick_directory_server_impl(void *arg) +{ + (void)arg; + + networkstatus_t *con_md = NULL; + char *consensus_text_md = NULL; + int flags = PDS_IGNORE_FASCISTFIREWALL|PDS_RETRY_IF_NO_SERVERS; + or_options_t *options = get_options_mutable(); + const routerstatus_t *rs = NULL; + options->UseMicrodescriptors = 1; + char *router1_id = NULL, *router2_id = NULL, *router3_id = NULL; + node_t *node_router1 = NULL, *node_router2 = NULL, *node_router3 = NULL; + config_line_t *policy_line = NULL; + time_t now = time(NULL); + int tmp_dirport1, tmp_dirport3; + + (void)arg; + + MOCK(usable_consensus_flavor, mock_usable_consensus_flavor); + + /* With no consensus, we must be bootstrapping, regardless of time or flavor + */ + mock_usable_consensus_flavor_value = FLAV_NS; + tt_assert(networkstatus_consensus_is_bootstrapping(now)); + tt_assert(networkstatus_consensus_is_bootstrapping(now + 2000)); + tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); + tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); + + mock_usable_consensus_flavor_value = FLAV_MICRODESC; + tt_assert(networkstatus_consensus_is_bootstrapping(now)); + tt_assert(networkstatus_consensus_is_bootstrapping(now + 2000)); + tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); + tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); + + /* Init SR subsystem. */ + MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); + mock_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); + sr_init(0); + UNMOCK(get_my_v3_authority_cert); + + /* No consensus available, fail early */ + rs = router_pick_directory_server_impl(V3_DIRINFO, (const int) 0, NULL); + tt_ptr_op(rs, OP_EQ, NULL); + + construct_consensus(&consensus_text_md); + tt_assert(consensus_text_md); + con_md = networkstatus_parse_vote_from_string(consensus_text_md, NULL, + NS_TYPE_CONSENSUS); + tt_assert(con_md); + tt_int_op(con_md->flavor,OP_EQ, FLAV_MICRODESC); + tt_assert(con_md->routerstatus_list); + tt_int_op(smartlist_len(con_md->routerstatus_list), OP_EQ, 3); + tt_assert(!networkstatus_set_current_consensus_from_ns(con_md, + "microdesc")); + + /* If the consensus time or flavor doesn't match, we are still + * bootstrapping */ + mock_usable_consensus_flavor_value = FLAV_NS; + tt_assert(networkstatus_consensus_is_bootstrapping(now)); + tt_assert(networkstatus_consensus_is_bootstrapping(now + 2000)); + tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); + tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); + + /* With a valid consensus for the current time and flavor, we stop + * bootstrapping, even if we have no certificates */ + mock_usable_consensus_flavor_value = FLAV_MICRODESC; + tt_assert(!networkstatus_consensus_is_bootstrapping(now + 2000)); + tt_assert(!networkstatus_consensus_is_bootstrapping(con_md->valid_after)); + tt_assert(!networkstatus_consensus_is_bootstrapping(con_md->valid_until)); + tt_assert(!networkstatus_consensus_is_bootstrapping(con_md->valid_until + + 24*60*60)); + /* These times are outside the test validity period */ + tt_assert(networkstatus_consensus_is_bootstrapping(now)); + tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); + tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); + + nodelist_set_consensus(con_md); + nodelist_assert_ok(); + + rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); + /* We should not fail now we have a consensus and routerstatus_list + * and nodelist are populated. */ + tt_ptr_op(rs, OP_NE, NULL); + + /* Manipulate the nodes so we get the dir server we expect */ + router1_id = tor_malloc(DIGEST_LEN); + memset(router1_id, TEST_DIR_ROUTER_ID_1, DIGEST_LEN); + router2_id = tor_malloc(DIGEST_LEN); + memset(router2_id, TEST_DIR_ROUTER_ID_2, DIGEST_LEN); + router3_id = tor_malloc(DIGEST_LEN); + memset(router3_id, TEST_DIR_ROUTER_ID_3, DIGEST_LEN); + + node_router1 = node_get_mutable_by_id(router1_id); + node_router2 = node_get_mutable_by_id(router2_id); + node_router3 = node_get_mutable_by_id(router3_id); + + node_router1->is_possible_guard = 1; + + node_router1->is_running = 0; + node_router3->is_running = 0; + rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); + tt_ptr_op(rs, OP_NE, NULL); + tt_assert(tor_memeq(rs->identity_digest, router2_id, DIGEST_LEN)); + rs = NULL; + node_router1->is_running = 1; + node_router3->is_running = 1; + + node_router1->rs->is_v2_dir = 0; + node_router3->rs->is_v2_dir = 0; + tmp_dirport1 = node_router1->rs->dir_port; + tmp_dirport3 = node_router3->rs->dir_port; + node_router1->rs->dir_port = 0; + node_router3->rs->dir_port = 0; + rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); + tt_ptr_op(rs, OP_NE, NULL); + tt_assert(tor_memeq(rs->identity_digest, router2_id, DIGEST_LEN)); + rs = NULL; + node_router1->rs->is_v2_dir = 1; + node_router3->rs->is_v2_dir = 1; + node_router1->rs->dir_port = tmp_dirport1; + node_router3->rs->dir_port = tmp_dirport3; + + node_router1->is_valid = 0; + node_router3->is_valid = 0; + rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); + tt_ptr_op(rs, OP_NE, NULL); + tt_assert(tor_memeq(rs->identity_digest, router2_id, DIGEST_LEN)); + rs = NULL; + node_router1->is_valid = 1; + node_router3->is_valid = 1; + + /* Manipulate overloaded */ + + node_router2->rs->last_dir_503_at = now; + node_router3->rs->last_dir_503_at = now; + rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); + tt_ptr_op(rs, OP_NE, NULL); + tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN)); + node_router2->rs->last_dir_503_at = 0; + node_router3->rs->last_dir_503_at = 0; + + /* Set a Fascist firewall */ + flags &= ~ PDS_IGNORE_FASCISTFIREWALL; + policy_line = tor_malloc_zero(sizeof(config_line_t)); + policy_line->key = tor_strdup("ReachableORAddresses"); + policy_line->value = tor_strdup("accept *:442, reject *:*"); + options->ReachableORAddresses = policy_line; + policies_parse_from_options(options); + + node_router1->rs->or_port = 444; + node_router2->rs->or_port = 443; + node_router3->rs->or_port = 442; + rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); + tt_ptr_op(rs, OP_NE, NULL); + tt_assert(tor_memeq(rs->identity_digest, router3_id, DIGEST_LEN)); + node_router1->rs->or_port = 442; + node_router2->rs->or_port = 443; + node_router3->rs->or_port = 444; + rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); + tt_ptr_op(rs, OP_NE, NULL); + tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN)); + + /* Fascist firewall and overloaded */ + node_router1->rs->or_port = 442; + node_router2->rs->or_port = 443; + node_router3->rs->or_port = 442; + node_router3->rs->last_dir_503_at = now; + rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); + tt_ptr_op(rs, OP_NE, NULL); + tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN)); + node_router3->rs->last_dir_503_at = 0; + + /* Fascists against OR and Dir */ + policy_line = tor_malloc_zero(sizeof(config_line_t)); + policy_line->key = tor_strdup("ReachableAddresses"); + policy_line->value = tor_strdup("accept *:80, reject *:*"); + options->ReachableDirAddresses = policy_line; + policies_parse_from_options(options); + node_router1->rs->or_port = 442; + node_router2->rs->or_port = 441; + node_router3->rs->or_port = 443; + node_router1->rs->dir_port = 80; + node_router2->rs->dir_port = 80; + node_router3->rs->dir_port = 81; + node_router1->rs->last_dir_503_at = now; + rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); + tt_ptr_op(rs, OP_NE, NULL); + tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN)); + node_router1->rs->last_dir_503_at = 0; + + done: + UNMOCK(usable_consensus_flavor); + + if (router1_id) + tor_free(router1_id); + if (router2_id) + tor_free(router2_id); + if (router3_id) + tor_free(router3_id); + if (options->ReachableORAddresses || + options->ReachableDirAddresses) + policies_free_all(); + tor_free(consensus_text_md); + networkstatus_vote_free(con_md); +} + +static or_state_t *dummy_state = NULL; +static or_state_t * +get_or_state_replacement(void) +{ + return dummy_state; +} + +static void +mock_directory_initiate_request(directory_request_t *req) +{ + (void)req; + return; +} + +static circuit_guard_state_t * +mock_circuit_guard_state_new(entry_guard_t *guard, unsigned state, + entry_guard_restriction_t *rst) +{ + (void) guard; + (void) state; + (void) rst; + return NULL; +} + +/** Test that we will use our directory guards to fetch mds even if we don't + * have any dirinfo (tests bug #23862). */ +static void +test_directory_guard_fetch_with_no_dirinfo(void *arg) +{ + int retval; + char *consensus_text_md = NULL; + or_options_t *options = get_options_mutable(); + + (void) arg; + + hibernate_set_state_for_testing_(HIBERNATE_STATE_LIVE); + + /* Initialize the SRV subsystem */ + MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); + mock_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); + sr_init(0); + UNMOCK(get_my_v3_authority_cert); + + /* Initialize the entry node configuration from the ticket */ + options->UseEntryGuards = 1; + options->StrictNodes = 1; + get_options_mutable()->EntryNodes = routerset_new(); + routerset_parse(get_options_mutable()->EntryNodes, + "2121212121212121212121212121212121212121", "foo"); + + /* Mock some functions */ + dummy_state = tor_malloc_zero(sizeof(or_state_t)); + MOCK(get_or_state, get_or_state_replacement); + MOCK(directory_initiate_request, mock_directory_initiate_request); + /* we need to mock this one to avoid memleaks */ + MOCK(circuit_guard_state_new, mock_circuit_guard_state_new); + + /* Call guards_update_all() to simulate loading our state file (see + * entry_guards_load_guards_from_state() and ticket #23989). */ + guards_update_all(); + + /* Test logic: Simulate the arrival of a new consensus when we have no + * dirinfo at all. Tor will need to fetch the mds from the consensus. Make + * sure that Tor will use the specified entry guard instead of relying on the + * fallback directories. */ + + /* Fixup the dirconn that will deliver the consensus */ + dir_connection_t *conn = dir_connection_new(AF_INET); + tor_addr_from_ipv4h(&conn->base_.addr, 0x7f000001); + conn->base_.port = 8800; + TO_CONN(conn)->address = tor_strdup("127.0.0.1"); + conn->base_.purpose = DIR_PURPOSE_FETCH_CONSENSUS; + conn->requested_resource = tor_strdup("ns"); + + /* Construct a consensus */ + construct_consensus(&consensus_text_md); + tt_assert(consensus_text_md); + + /* Place the consensus in the dirconn */ + response_handler_args_t args; + memset(&args, 0, sizeof(response_handler_args_t)); + args.status_code = 200; + args.body = consensus_text_md; + args.body_len = strlen(consensus_text_md); + + /* Update approx time so that the consensus is considered live */ + update_approx_time(time(NULL)+1010); + + setup_capture_of_logs(LOG_DEBUG); + + /* Now handle the consensus */ + retval = handle_response_fetch_consensus(conn, &args); + tt_int_op(retval, OP_EQ, 0); + + /* Make sure that our primary guard was chosen */ + expect_log_msg_containing("Selected primary guard router3"); + + done: + tor_free(consensus_text_md); + tor_free(dummy_state); + connection_free_minimal(TO_CONN(conn)); + entry_guards_free_all(); + teardown_capture_of_logs(); +} + +static connection_t *mocked_connection = NULL; + +/* Mock connection_get_by_type_addr_port_purpose by returning + * mocked_connection. */ +static connection_t * +mock_connection_get_by_type_addr_port_purpose(int type, + const tor_addr_t *addr, + uint16_t port, int purpose) +{ + (void)type; + (void)addr; + (void)port; + (void)purpose; + + return mocked_connection; +} + +#define TEST_ADDR_STR "127.0.0.1" +#define TEST_DIR_PORT 12345 + +static void +test_routerlist_router_is_already_dir_fetching(void *arg) +{ + (void)arg; + tor_addr_port_t test_ap, null_addr_ap, zero_port_ap; + + /* Setup */ + tor_addr_parse(&test_ap.addr, TEST_ADDR_STR); + test_ap.port = TEST_DIR_PORT; + tor_addr_make_null(&null_addr_ap.addr, AF_INET6); + null_addr_ap.port = TEST_DIR_PORT; + tor_addr_parse(&zero_port_ap.addr, TEST_ADDR_STR); + zero_port_ap.port = 0; + MOCK(connection_get_by_type_addr_port_purpose, + mock_connection_get_by_type_addr_port_purpose); + + /* Test that we never get 1 from a NULL connection */ + mocked_connection = NULL; + tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 1), OP_EQ, 0); + tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 0), OP_EQ, 0); + tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 1), OP_EQ, 0); + /* We always expect 0 in these cases */ + tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 0), OP_EQ, 0); + tt_int_op(router_is_already_dir_fetching(NULL, 1, 1), OP_EQ, 0); + tt_int_op(router_is_already_dir_fetching(&null_addr_ap, 1, 1), OP_EQ, 0); + tt_int_op(router_is_already_dir_fetching(&zero_port_ap, 1, 1), OP_EQ, 0); + + /* Test that we get 1 with a connection in the appropriate circumstances */ + mocked_connection = connection_new(CONN_TYPE_DIR, AF_INET); + tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 1), OP_EQ, 1); + tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 0), OP_EQ, 1); + tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 1), OP_EQ, 1); + + /* Test that we get 0 even with a connection in the appropriate + * circumstances */ + tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 0), OP_EQ, 0); + tt_int_op(router_is_already_dir_fetching(NULL, 1, 1), OP_EQ, 0); + tt_int_op(router_is_already_dir_fetching(&null_addr_ap, 1, 1), OP_EQ, 0); + tt_int_op(router_is_already_dir_fetching(&zero_port_ap, 1, 1), OP_EQ, 0); + + done: + /* If a connection is never set up, connection_free chokes on it. */ + if (mocked_connection) { + buf_free(mocked_connection->inbuf); + buf_free(mocked_connection->outbuf); + } + tor_free(mocked_connection); + UNMOCK(connection_get_by_type_addr_port_purpose); +} + +#undef TEST_ADDR_STR +#undef TEST_DIR_PORT + +#define NODE(name, flags) \ + { #name, test_routerlist_##name, (flags), NULL, NULL } +#define ROUTER(name,flags) \ + { #name, test_router_##name, (flags), NULL, NULL } + +struct testcase_t routerlist_tests[] = { + NODE(initiate_descriptor_downloads, 0), + NODE(launch_descriptor_downloads, 0), + NODE(router_is_already_dir_fetching, TT_FORK), + ROUTER(pick_directory_server_impl, TT_FORK), + { "directory_guard_fetch_with_no_dirinfo", + test_directory_guard_fetch_with_no_dirinfo, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_routerset.c b/src/wraith/src/test/test_routerset.c new file mode 100644 index 000000000..c54132467 --- /dev/null +++ b/src/wraith/src/test/test_routerset.c @@ -0,0 +1,2224 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define ROUTERSET_PRIVATE + +#include "or.h" +#include "geoip.h" +#include "routerset.h" +#include "routerparse.h" +#include "policies.h" +#include "nodelist.h" +#include "test.h" + +#define NS_MODULE routerset + +#define NS_SUBMODULE routerset_new + +/* + * Functional (blackbox) test to determine that each member of the routerset + * is non-NULL + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *rs; + (void)arg; + + rs = routerset_new(); + + tt_ptr_op(rs, OP_NE, NULL); + tt_ptr_op(rs->list, OP_NE, NULL); + tt_ptr_op(rs->names, OP_NE, NULL); + tt_ptr_op(rs->digests, OP_NE, NULL); + tt_ptr_op(rs->policies, OP_NE, NULL); + tt_ptr_op(rs->country_names, OP_NE, NULL); + + done: + routerset_free(rs); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE routerset_get_countryname + +/* + * Functional test to strip the braces from a "{xx}" country code string. + */ + +static void +NS(test_main)(void *arg) +{ + const char *input; + char *name; + (void)arg; + + /* strlen(c) < 4 */ + input = "xxx"; + name = routerset_get_countryname(input); + tt_ptr_op(name, OP_EQ, NULL); + tor_free(name); + + /* c[0] != '{' */ + input = "xxx}"; + name = routerset_get_countryname(input); + tt_ptr_op(name, OP_EQ, NULL); + tor_free(name); + + /* c[3] != '}' */ + input = "{xxx"; + name = routerset_get_countryname(input); + tt_ptr_op(name, OP_EQ, NULL); + tor_free(name); + + /* tor_strlower */ + input = "{XX}"; + name = routerset_get_countryname(input); + tt_str_op(name, OP_EQ, "xx"); + tor_free(name); + + input = "{xx}"; + name = routerset_get_countryname(input); + tt_str_op(name, OP_EQ, "xx"); + done: + tor_free(name); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_refresh_counties, geoip_not_loaded) + +/* + * Structural (whitebox) test for routerset_refresh_counties, when the GeoIP DB + * is not loaded. + */ + +NS_DECL(int, geoip_is_loaded, (sa_family_t family)); +NS_DECL(int, geoip_get_n_countries, (void)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + (void)arg; + + NS_MOCK(geoip_is_loaded); + NS_MOCK(geoip_get_n_countries); + + routerset_refresh_countries(set); + + tt_ptr_op(set->countries, OP_EQ, NULL); + tt_int_op(set->n_countries, OP_EQ, 0); + tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 0); + + done: + NS_UNMOCK(geoip_is_loaded); + NS_UNMOCK(geoip_get_n_countries); + routerset_free(set); +} + +static int +NS(geoip_is_loaded)(sa_family_t family) +{ + (void)family; + CALLED(geoip_is_loaded)++; + + return 0; +} + +static int +NS(geoip_get_n_countries)(void) +{ + CALLED(geoip_get_n_countries)++; + + return 0; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_refresh_counties, no_countries) + +/* + * Structural test for routerset_refresh_counties, when there are no countries. + */ + +NS_DECL(int, geoip_is_loaded, (sa_family_t family)); +NS_DECL(int, geoip_get_n_countries, (void)); +NS_DECL(country_t, geoip_get_country, (const char *country)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + (void)arg; + + NS_MOCK(geoip_is_loaded); + NS_MOCK(geoip_get_n_countries); + NS_MOCK(geoip_get_country); + + routerset_refresh_countries(set); + + tt_ptr_op(set->countries, OP_NE, NULL); + tt_int_op(set->n_countries, OP_EQ, 1); + tt_int_op((unsigned int)(*set->countries), OP_EQ, 0); + tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_country), OP_EQ, 0); + + done: + NS_UNMOCK(geoip_is_loaded); + NS_UNMOCK(geoip_get_n_countries); + NS_UNMOCK(geoip_get_country); + routerset_free(set); +} + +static int +NS(geoip_is_loaded)(sa_family_t family) +{ + (void)family; + CALLED(geoip_is_loaded)++; + + return 1; +} + +static int +NS(geoip_get_n_countries)(void) +{ + CALLED(geoip_get_n_countries)++; + + return 1; +} + +static country_t +NS(geoip_get_country)(const char *countrycode) +{ + (void)countrycode; + CALLED(geoip_get_country)++; + + return 1; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_refresh_counties, one_valid_country) + +/* + * Structural test for routerset_refresh_counties, with one valid country. + */ + +NS_DECL(int, geoip_is_loaded, (sa_family_t family)); +NS_DECL(int, geoip_get_n_countries, (void)); +NS_DECL(country_t, geoip_get_country, (const char *country)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + (void)arg; + + NS_MOCK(geoip_is_loaded); + NS_MOCK(geoip_get_n_countries); + NS_MOCK(geoip_get_country); + smartlist_add(set->country_names, tor_strndup("foo", 3)); + + routerset_refresh_countries(set); + + tt_ptr_op(set->countries, OP_NE, NULL); + tt_int_op(set->n_countries, OP_EQ, 2); + tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_country), OP_EQ, 1); + tt_int_op((unsigned int)(*set->countries), OP_NE, 0); + + done: + NS_UNMOCK(geoip_is_loaded); + NS_UNMOCK(geoip_get_n_countries); + NS_UNMOCK(geoip_get_country); + routerset_free(set); +} + +static int +NS(geoip_is_loaded)(sa_family_t family) +{ + (void)family; + CALLED(geoip_is_loaded)++; + + return 1; +} + +static int +NS(geoip_get_n_countries)(void) +{ + CALLED(geoip_get_n_countries)++; + + return 2; +} + +static country_t +NS(geoip_get_country)(const char *countrycode) +{ + (void)countrycode; + CALLED(geoip_get_country)++; + + return 1; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_refresh_counties, one_invalid_country) + +/* + * Structural test for routerset_refresh_counties, with one invalid + * country code.. + */ + +NS_DECL(int, geoip_is_loaded, (sa_family_t family)); +NS_DECL(int, geoip_get_n_countries, (void)); +NS_DECL(country_t, geoip_get_country, (const char *country)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + (void)arg; + + NS_MOCK(geoip_is_loaded); + NS_MOCK(geoip_get_n_countries); + NS_MOCK(geoip_get_country); + smartlist_add(set->country_names, tor_strndup("foo", 3)); + + routerset_refresh_countries(set); + + tt_ptr_op(set->countries, OP_NE, NULL); + tt_int_op(set->n_countries, OP_EQ, 2); + tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_country), OP_EQ, 1); + tt_int_op((unsigned int)(*set->countries), OP_EQ, 0); + + done: + NS_UNMOCK(geoip_is_loaded); + NS_UNMOCK(geoip_get_n_countries); + NS_UNMOCK(geoip_get_country); + routerset_free(set); +} + +static int +NS(geoip_is_loaded)(sa_family_t family) +{ + (void)family; + CALLED(geoip_is_loaded)++; + + return 1; +} + +static int +NS(geoip_get_n_countries)(void) +{ + CALLED(geoip_get_n_countries)++; + + return 2; +} + +static country_t +NS(geoip_get_country)(const char *countrycode) +{ + (void)countrycode; + CALLED(geoip_get_country)++; + + return -1; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_parse, malformed) + +/* + * Functional test, with a malformed string to parse. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + const char *s = "_"; + int r; + (void)arg; + + r = routerset_parse(set, s, ""); + + tt_int_op(r, OP_EQ, -1); + + done: + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_parse, valid_hexdigest) + +/* + * Functional test for routerset_parse, that routerset_parse returns 0 + * on a valid hexdigest entry. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set; + const char *s; + int r; + (void)arg; + + set = routerset_new(); + s = "$0000000000000000000000000000000000000000"; + r = routerset_parse(set, s, ""); + tt_int_op(r, OP_EQ, 0); + tt_int_op(digestmap_isempty(set->digests), OP_NE, 1); + + done: + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_parse, valid_nickname) + +/* + * Functional test for routerset_parse, when given a valid nickname as input. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set; + const char *s; + int r; + (void)arg; + + set = routerset_new(); + s = "fred"; + r = routerset_parse(set, s, ""); + tt_int_op(r, OP_EQ, 0); + tt_int_op(strmap_isempty(set->names), OP_NE, 1); + + done: + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_parse, get_countryname) + +/* + * Functional test for routerset_parse, when given a valid countryname. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set; + const char *s; + int r; + (void)arg; + + set = routerset_new(); + s = "{cc}"; + r = routerset_parse(set, s, ""); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(set->country_names), OP_NE, 0); + + done: + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_parse, policy_wildcard) + +/* + * Structural test for routerset_parse, when given a valid wildcard policy. + */ + +NS_DECL(addr_policy_t *, router_parse_addr_policy_item_from_string, + (const char *s, int assume_action, int *malformed_list)); + +static addr_policy_t *NS(mock_addr_policy); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set; + const char *s; + int r; + (void)arg; + + NS_MOCK(router_parse_addr_policy_item_from_string); + NS(mock_addr_policy) = tor_malloc_zero(sizeof(addr_policy_t)); + + set = routerset_new(); + s = "*"; + r = routerset_parse(set, s, ""); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(set->policies), OP_NE, 0); + tt_int_op(CALLED(router_parse_addr_policy_item_from_string), OP_EQ, 1); + + done: + routerset_free(set); +} + +addr_policy_t * +NS(router_parse_addr_policy_item_from_string)(const char *s, + int assume_action, + int *malformed_list) +{ + (void)s; + (void)assume_action; + (void)malformed_list; + CALLED(router_parse_addr_policy_item_from_string)++; + + return NS(mock_addr_policy); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_parse, policy_ipv4) + +/* + * Structural test for routerset_parse, when given a valid IPv4 address + * literal policy. + */ + +NS_DECL(addr_policy_t *, router_parse_addr_policy_item_from_string, + (const char *s, int assume_action, int *bogus)); + +static addr_policy_t *NS(mock_addr_policy); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set; + const char *s; + int r; + (void)arg; + + NS_MOCK(router_parse_addr_policy_item_from_string); + NS(mock_addr_policy) = tor_malloc_zero(sizeof(addr_policy_t)); + + set = routerset_new(); + s = "127.0.0.1"; + r = routerset_parse(set, s, ""); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(set->policies), OP_NE, 0); + tt_int_op(CALLED(router_parse_addr_policy_item_from_string), OP_EQ, 1); + + done: + routerset_free(set); +} + +addr_policy_t * +NS(router_parse_addr_policy_item_from_string)(const char *s, int assume_action, + int *bogus) +{ + (void)s; + (void)assume_action; + CALLED(router_parse_addr_policy_item_from_string)++; + *bogus = 0; + + return NS(mock_addr_policy); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_parse, policy_ipv6) + +/* + * Structural test for routerset_parse, when given a valid IPv6 address + * literal policy. + */ + +NS_DECL(addr_policy_t *, router_parse_addr_policy_item_from_string, + (const char *s, int assume_action, int *bad)); + +static addr_policy_t *NS(mock_addr_policy); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set; + const char *s; + int r; + (void)arg; + + NS_MOCK(router_parse_addr_policy_item_from_string); + NS(mock_addr_policy) = tor_malloc_zero(sizeof(addr_policy_t)); + + set = routerset_new(); + s = "::1"; + r = routerset_parse(set, s, ""); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(set->policies), OP_NE, 0); + tt_int_op(CALLED(router_parse_addr_policy_item_from_string), OP_EQ, 1); + + done: + routerset_free(set); +} + +addr_policy_t * +NS(router_parse_addr_policy_item_from_string)(const char *s, + int assume_action, int *bad) +{ + (void)s; + (void)assume_action; + CALLED(router_parse_addr_policy_item_from_string)++; + *bad = 0; + + return NS(mock_addr_policy); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_union, source_bad) + +/* + * Structural test for routerset_union, when given a bad source argument. + */ + +NS_DECL(smartlist_t *, smartlist_new, (void)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set, *bad_set; + (void)arg; + + set = routerset_new(); + bad_set = routerset_new(); + smartlist_free(bad_set->list); + bad_set->list = NULL; + + NS_MOCK(smartlist_new); + + routerset_union(set, NULL); + tt_int_op(CALLED(smartlist_new), OP_EQ, 0); + + routerset_union(set, bad_set); + tt_int_op(CALLED(smartlist_new), OP_EQ, 0); + + done: + NS_UNMOCK(smartlist_new); + routerset_free(set); + + /* Just recreate list, so we can simply use routerset_free. */ + bad_set->list = smartlist_new(); + routerset_free(bad_set); +} + +static smartlist_t * +NS(smartlist_new)(void) +{ + CALLED(smartlist_new)++; + + return NULL; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_union, one) + +/* + * Functional test for routerset_union. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *src = routerset_new(); + routerset_t *tgt; + (void)arg; + + tgt = routerset_new(); + smartlist_add_strdup(src->list, "{xx}"); + routerset_union(tgt, src); + + tt_int_op(smartlist_len(tgt->list), OP_NE, 0); + + done: + routerset_free(src); + routerset_free(tgt); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE routerset_is_list + +/* + * Functional tests for routerset_is_list. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set; + addr_policy_t *policy; + int is_list; + (void)arg; + + /* len(set->country_names) == 0, len(set->policies) == 0 */ + set = routerset_new(); + is_list = routerset_is_list(set); + routerset_free(set); + set = NULL; + tt_int_op(is_list, OP_NE, 0); + + /* len(set->country_names) != 0, len(set->policies) == 0 */ + set = routerset_new(); + smartlist_add(set->country_names, tor_strndup("foo", 3)); + is_list = routerset_is_list(set); + routerset_free(set); + set = NULL; + tt_int_op(is_list, OP_EQ, 0); + + /* len(set->country_names) == 0, len(set->policies) != 0 */ + set = routerset_new(); + policy = tor_malloc_zero(sizeof(addr_policy_t)); + smartlist_add(set->policies, (void *)policy); + is_list = routerset_is_list(set); + routerset_free(set); + set = NULL; + tt_int_op(is_list, OP_EQ, 0); + + /* len(set->country_names) != 0, len(set->policies) != 0 */ + set = routerset_new(); + smartlist_add(set->country_names, tor_strndup("foo", 3)); + policy = tor_malloc_zero(sizeof(addr_policy_t)); + smartlist_add(set->policies, (void *)policy); + is_list = routerset_is_list(set); + routerset_free(set); + set = NULL; + tt_int_op(is_list, OP_EQ, 0); + + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE routerset_needs_geoip + +/* + * Functional tests for routerset_needs_geoip. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set; + int needs_geoip; + (void)arg; + + set = NULL; + needs_geoip = routerset_needs_geoip(set); + tt_int_op(needs_geoip, OP_EQ, 0); + + set = routerset_new(); + needs_geoip = routerset_needs_geoip(set); + routerset_free(set); + tt_int_op(needs_geoip, OP_EQ, 0); + set = NULL; + + set = routerset_new(); + smartlist_add(set->country_names, tor_strndup("xx", 2)); + needs_geoip = routerset_needs_geoip(set); + routerset_free(set); + set = NULL; + tt_int_op(needs_geoip, OP_NE, 0); + + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE routerset_is_empty + +/* + * Functional tests for routerset_is_empty. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = NULL; + int is_empty; + (void)arg; + + is_empty = routerset_is_empty(set); + tt_int_op(is_empty, OP_NE, 0); + + set = routerset_new(); + is_empty = routerset_is_empty(set); + routerset_free(set); + set = NULL; + tt_int_op(is_empty, OP_NE, 0); + + set = routerset_new(); + smartlist_add_strdup(set->list, "{xx}"); + is_empty = routerset_is_empty(set); + routerset_free(set); + set = NULL; + tt_int_op(is_empty, OP_EQ, 0); + + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, null_set_or_null_set_list) + +/* + * Functional test for routerset_contains, when given a NULL set or the + * set has a NULL list. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = NULL; + int contains; + (void)arg; + + contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); + + tt_int_op(contains, OP_EQ, 0); + + set = tor_malloc_zero(sizeof(routerset_t)); + set->list = NULL; + contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); + tor_free(set); + tt_int_op(contains, OP_EQ, 0); + + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, set_and_null_nickname) + +/* + * Functional test for routerset_contains, when given a valid routerset but a + * NULL nickname. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + char *nickname = NULL; + int contains; + (void)arg; + + contains = routerset_contains(set, NULL, 0, nickname, NULL, 0); + routerset_free(set); + + tt_int_op(contains, OP_EQ, 0); + + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, set_and_nickname) + +/* + * Functional test for routerset_contains, when given a valid routerset + * and the nickname is in the routerset. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + const char *nickname; + int contains; + (void)arg; + + nickname = "Foo"; /* This tests the lowercase comparison as well. */ + strmap_set_lc(set->names, nickname, (void *)1); + contains = routerset_contains(set, NULL, 0, nickname, NULL, 0); + routerset_free(set); + + tt_int_op(contains, OP_EQ, 4); + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, set_and_no_nickname) + +/* + * Functional test for routerset_contains, when given a valid routerset + * and the nickname is not in the routerset. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + int contains; + (void)arg; + + strmap_set_lc(set->names, "bar", (void *)1); + contains = routerset_contains(set, NULL, 0, "foo", NULL, 0); + routerset_free(set); + + tt_int_op(contains, OP_EQ, 0); + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, set_and_digest) + +/* + * Functional test for routerset_contains, when given a valid routerset + * and the digest is contained in the routerset. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + int contains; + uint8_t foo[20] = { 2, 3, 4 }; + (void)arg; + + digestmap_set(set->digests, (const char*)foo, (void *)1); + contains = routerset_contains(set, NULL, 0, NULL, (const char*)foo, 0); + routerset_free(set); + + tt_int_op(contains, OP_EQ, 4); + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, set_and_no_digest) + +/* + * Functional test for routerset_contains, when given a valid routerset + * and the digest is not contained in the routerset. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + int contains; + uint8_t bar[20] = { 9, 10, 11, 55 }; + uint8_t foo[20] = { 1, 2, 3, 4}; + (void)arg; + + digestmap_set(set->digests, (const char*)bar, (void *)1); + contains = routerset_contains(set, NULL, 0, NULL, (const char*)foo, 0); + routerset_free(set); + + tt_int_op(contains, OP_EQ, 0); + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, set_and_null_digest) + +/* + * Functional test for routerset_contains, when given a valid routerset + * and the digest is NULL. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + int contains; + uint8_t bar[20] = { 9, 10, 11, 55 }; + (void)arg; + + digestmap_set(set->digests, (const char*)bar, (void *)1); + contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); + routerset_free(set); + + tt_int_op(contains, OP_EQ, 0); + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, set_and_addr) + +/* + * Structural test for routerset_contains, when given a valid routerset + * and the address is rejected by policy. + */ + +NS_DECL(addr_policy_result_t, compare_tor_addr_to_addr_policy, + (const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)); + +static tor_addr_t MOCK_TOR_ADDR; +#define MOCK_TOR_ADDR_PTR (&MOCK_TOR_ADDR) + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + tor_addr_t *addr = MOCK_TOR_ADDR_PTR; + int contains; + (void)arg; + + NS_MOCK(compare_tor_addr_to_addr_policy); + + contains = routerset_contains(set, addr, 0, NULL, NULL, 0); + routerset_free(set); + + tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); + tt_int_op(contains, OP_EQ, 3); + + done: + ; +} + +addr_policy_result_t +NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, + const smartlist_t *policy) +{ + (void)port; + (void)policy; + CALLED(compare_tor_addr_to_addr_policy)++; + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); + return ADDR_POLICY_REJECTED; + + done: + return 0; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, set_and_no_addr) + +/* + * Structural test for routerset_contains, when given a valid routerset + * and the address is not rejected by policy. + */ + +NS_DECL(addr_policy_result_t, compare_tor_addr_to_addr_policy, + (const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + tor_addr_t *addr = MOCK_TOR_ADDR_PTR; + int contains; + (void)arg; + + NS_MOCK(compare_tor_addr_to_addr_policy); + + contains = routerset_contains(set, addr, 0, NULL, NULL, 0); + routerset_free(set); + + tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); + tt_int_op(contains, OP_EQ, 0); + + done: + ; +} + +addr_policy_result_t +NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, + const smartlist_t *policy) +{ + (void)port; + (void)policy; + CALLED(compare_tor_addr_to_addr_policy)++; + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); + + return ADDR_POLICY_ACCEPTED; + + done: + return 0; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, set_and_null_addr) + +/* + * Structural test for routerset_contains, when given a valid routerset + * and the address is NULL. + */ + +NS_DECL(addr_policy_result_t, compare_tor_addr_to_addr_policy, + (const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + int contains; + (void)arg; + + NS_MOCK(compare_tor_addr_to_addr_policy); + + contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); + routerset_free(set); + + tt_int_op(contains, OP_EQ, 0); + + done: + ; +} + +addr_policy_result_t +NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, + const smartlist_t *policy) +{ + (void)port; + (void)policy; + CALLED(compare_tor_addr_to_addr_policy)++; + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); + + return ADDR_POLICY_ACCEPTED; + + done: + return 0; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, countries_no_geoip) + +/* + * Structural test for routerset_contains, when there is no matching country + * for the address. + */ + +NS_DECL(addr_policy_result_t, compare_tor_addr_to_addr_policy, + (const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)); +NS_DECL(int, geoip_get_country_by_addr, (const tor_addr_t *addr)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + int contains = 1; + (void)arg; + + NS_MOCK(compare_tor_addr_to_addr_policy); + NS_MOCK(geoip_get_country_by_addr); + + set->countries = bitarray_init_zero(1); + bitarray_set(set->countries, 1); + contains = routerset_contains(set, MOCK_TOR_ADDR_PTR, 0, NULL, NULL, -1); + routerset_free(set); + + tt_int_op(contains, OP_EQ, 0); + tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_country_by_addr), OP_EQ, 1); + + done: + ; +} + +addr_policy_result_t +NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, + const smartlist_t *policy) +{ + (void)port; + (void)policy; + CALLED(compare_tor_addr_to_addr_policy)++; + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); + + done: + return ADDR_POLICY_ACCEPTED; +} + +int +NS(geoip_get_country_by_addr)(const tor_addr_t *addr) +{ + CALLED(geoip_get_country_by_addr)++; + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); + + done: + return -1; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains, countries_geoip) + +/* + * Structural test for routerset_contains, when there a matching country + * for the address. + */ + +NS_DECL(addr_policy_result_t, compare_tor_addr_to_addr_policy, + (const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)); +NS_DECL(int, geoip_get_country_by_addr, (const tor_addr_t *addr)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + int contains = 1; + (void)arg; + + NS_MOCK(compare_tor_addr_to_addr_policy); + NS_MOCK(geoip_get_country_by_addr); + + set->n_countries = 2; + set->countries = bitarray_init_zero(1); + bitarray_set(set->countries, 1); + contains = routerset_contains(set, MOCK_TOR_ADDR_PTR, 0, NULL, NULL, -1); + routerset_free(set); + + tt_int_op(contains, OP_EQ, 2); + tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_country_by_addr), OP_EQ, 1); + + done: + ; +} + +addr_policy_result_t +NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, + const smartlist_t *policy) +{ + (void)port; + (void)policy; + CALLED(compare_tor_addr_to_addr_policy)++; + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); + + done: + return ADDR_POLICY_ACCEPTED; +} + +int +NS(geoip_get_country_by_addr)(const tor_addr_t *addr) +{ + CALLED(geoip_get_country_by_addr)++; + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); + + done: + return 1; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_add_unknown_ccs, only_flag_and_no_ccs) + +/* + * Functional test for routerset_add_unknown_ccs, where only_if_some_cc_set + * is set and there are no country names. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + routerset_t **setp = &set; + int r; + (void)arg; + + r = routerset_add_unknown_ccs(setp, 1); + + tt_int_op(r, OP_EQ, 0); + + done: + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_add_unknown_ccs, creates_set) + +/* + * Functional test for routerset_add_unknown_ccs, where the set argument + * is created if passed in as NULL. + */ + +/* The mock is only used to stop the test from asserting erroneously. */ +NS_DECL(country_t, geoip_get_country, (const char *country)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = NULL; + routerset_t **setp = &set; + int r; + (void)arg; + + NS_MOCK(geoip_get_country); + + r = routerset_add_unknown_ccs(setp, 0); + + tt_ptr_op(*setp, OP_NE, NULL); + tt_int_op(r, OP_EQ, 0); + + done: + if (set != NULL) + routerset_free(set); +} + +country_t +NS(geoip_get_country)(const char *country) +{ + (void)country; + CALLED(geoip_get_country)++; + + return -1; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_add_unknown_ccs, add_unknown) + +/* + * Structural test for routerset_add_unknown_ccs, that the "{??}" + * country code is added to the list. + */ + +NS_DECL(country_t, geoip_get_country, (const char *country)); +NS_DECL(int, geoip_is_loaded, (sa_family_t family)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + routerset_t **setp = &set; + int r; + (void)arg; + + NS_MOCK(geoip_get_country); + NS_MOCK(geoip_is_loaded); + + r = routerset_add_unknown_ccs(setp, 0); + + tt_int_op(r, OP_EQ, 1); + tt_int_op(smartlist_contains_string(set->country_names, "??"), OP_EQ, 1); + tt_int_op(smartlist_contains_string(set->list, "{??}"), OP_EQ, 1); + + done: + if (set != NULL) + routerset_free(set); +} + +country_t +NS(geoip_get_country)(const char *country) +{ + int arg_is_qq, arg_is_a1; + + CALLED(geoip_get_country)++; + + arg_is_qq = !strcmp(country, "??"); + arg_is_a1 = !strcmp(country, "A1"); + + tt_int_op(arg_is_qq || arg_is_a1, OP_EQ, 1); + + if (arg_is_qq) + return 1; + + done: + return -1; +} + +int +NS(geoip_is_loaded)(sa_family_t family) +{ + CALLED(geoip_is_loaded)++; + + tt_int_op(family, OP_EQ, AF_INET); + + done: + return 0; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_add_unknown_ccs, add_a1) + +/* + * Structural test for routerset_add_unknown_ccs, that the "{a1}" + * country code is added to the list. + */ + +NS_DECL(country_t, geoip_get_country, (const char *country)); +NS_DECL(int, geoip_is_loaded, (sa_family_t family)); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + routerset_t **setp = &set; + int r; + (void)arg; + + NS_MOCK(geoip_get_country); + NS_MOCK(geoip_is_loaded); + + r = routerset_add_unknown_ccs(setp, 0); + + tt_int_op(r, OP_EQ, 1); + tt_int_op(smartlist_contains_string(set->country_names, "a1"), OP_EQ, 1); + tt_int_op(smartlist_contains_string(set->list, "{a1}"), OP_EQ, 1); + + done: + if (set != NULL) + routerset_free(set); +} + +country_t +NS(geoip_get_country)(const char *country) +{ + int arg_is_qq, arg_is_a1; + + CALLED(geoip_get_country)++; + + arg_is_qq = !strcmp(country, "??"); + arg_is_a1 = !strcmp(country, "A1"); + + tt_int_op(arg_is_qq || arg_is_a1, OP_EQ, 1); + + if (arg_is_a1) + return 1; + + done: + return -1; +} + +int +NS(geoip_is_loaded)(sa_family_t family) +{ + CALLED(geoip_is_loaded)++; + + tt_int_op(family, OP_EQ, AF_INET); + + done: + return 0; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE routerset_contains_extendinfo + +/* + * Functional test for routerset_contains_extendinfo. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + extend_info_t ei; + int r; + const char *nickname = "foo"; + (void)arg; + + memset(&ei, 0, sizeof(ei)); + strmap_set_lc(set->names, nickname, (void *)1); + strncpy(ei.nickname, nickname, sizeof(ei.nickname) - 1); + ei.nickname[sizeof(ei.nickname) - 1] = '\0'; + + r = routerset_contains_extendinfo(set, &ei); + + tt_int_op(r, OP_EQ, 4); + done: + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE routerset_contains_router + +/* + * Functional test for routerset_contains_router. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + routerinfo_t ri; + country_t country = 1; + int r; + const char *nickname = "foo"; + (void)arg; + + memset(&ri, 0, sizeof(ri)); + strmap_set_lc(set->names, nickname, (void *)1); + ri.nickname = (char *)nickname; + + r = routerset_contains_router(set, &ri, country); + + tt_int_op(r, OP_EQ, 4); + done: + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE routerset_contains_routerstatus + +/* + * Functional test for routerset_contains_routerstatus. + */ + +// XXX: This is a bit brief. It only populates and tests the nickname fields +// ie., enough to make the containment check succeed. Perhaps it should do +// a bit more or test a bit more. + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + routerstatus_t rs; + country_t country = 1; + int r; + const char *nickname = "foo"; + (void)arg; + + memset(&rs, 0, sizeof(rs)); + strmap_set_lc(set->names, nickname, (void *)1); + strncpy(rs.nickname, nickname, sizeof(rs.nickname) - 1); + rs.nickname[sizeof(rs.nickname) - 1] = '\0'; + + r = routerset_contains_routerstatus(set, &rs, country); + + tt_int_op(r, OP_EQ, 4); + done: + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains_node, none) + +/* + * Functional test for routerset_contains_node, when the node has no + * routerset or routerinfo. + */ + +static node_t NS(mock_node); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + int r; + (void)arg; + + NS(mock_node).ri = NULL; + NS(mock_node).rs = NULL; + + r = routerset_contains_node(set, &NS(mock_node)); + tt_int_op(r, OP_EQ, 0); + + done: + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains_node, routerstatus) + +/* + * Functional test for routerset_contains_node, when the node has a + * routerset and no routerinfo. + */ + +static node_t NS(mock_node); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + int r; + const char *nickname = "foo"; + routerstatus_t rs; + (void)arg; + + strmap_set_lc(set->names, nickname, (void *)1); + + strncpy(rs.nickname, nickname, sizeof(rs.nickname) - 1); + rs.nickname[sizeof(rs.nickname) - 1] = '\0'; + NS(mock_node).ri = NULL; + NS(mock_node).rs = &rs; + + r = routerset_contains_node(set, &NS(mock_node)); + + tt_int_op(r, OP_EQ, 4); + done: + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_contains_node, routerinfo) + +/* + * Functional test for routerset_contains_node, when the node has no + * routerset and a routerinfo. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + int r; + const char *nickname = "foo"; + routerinfo_t ri; + node_t mock_node; + (void)arg; + + strmap_set_lc(set->names, nickname, (void *)1); + + ri.nickname = (char *)nickname; + mock_node.ri = &ri; + mock_node.rs = NULL; + + r = routerset_contains_node(set, &mock_node); + + tt_int_op(r, OP_EQ, 4); + done: + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, no_routerset) + +/* + * Functional test for routerset_get_all_nodes, when routerset is NULL or + * the routerset list is NULL. + */ + +static void +NS(test_main)(void *arg) +{ + smartlist_t *out = smartlist_new(); + routerset_t *set = NULL; + (void)arg; + + tt_int_op(smartlist_len(out), OP_EQ, 0); + routerset_get_all_nodes(out, NULL, NULL, 0); + + tt_int_op(smartlist_len(out), OP_EQ, 0); + + set = routerset_new(); + smartlist_free(set->list); + routerset_get_all_nodes(out, NULL, NULL, 0); + tt_int_op(smartlist_len(out), OP_EQ, 0); + + /* Just recreate list, so we can simply use routerset_free. */ + set->list = smartlist_new(); + + done: + routerset_free(set); + smartlist_free(out); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, list_with_no_nodes) + +/* + * Structural test for routerset_get_all_nodes, when the routerset list + * is empty. + */ + +NS_DECL(const node_t *, node_get_by_nickname, + (const char *nickname, unsigned flags)); +static const char *NS(mock_nickname); + +static void +NS(test_main)(void *arg) +{ + smartlist_t *out = smartlist_new(); + routerset_t *set = routerset_new(); + int out_len; + (void)arg; + + NS_MOCK(node_get_by_nickname); + + NS(mock_nickname) = "foo"; + smartlist_add_strdup(set->list, NS(mock_nickname)); + + routerset_get_all_nodes(out, set, NULL, 0); + out_len = smartlist_len(out); + + smartlist_free(out); + routerset_free(set); + + tt_int_op(out_len, OP_EQ, 0); + tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1); + + done: + ; +} + +const node_t * +NS(node_get_by_nickname)(const char *nickname, unsigned flags) +{ + CALLED(node_get_by_nickname)++; + tt_str_op(nickname, OP_EQ, NS(mock_nickname)); + tt_uint_op(flags, OP_EQ, 0); + + done: + return NULL; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, list_flag_not_running) + +/* + * Structural test for routerset_get_all_nodes, with the running_only flag + * is set but the nodes are not running. + */ + +NS_DECL(const node_t *, node_get_by_nickname, + (const char *nickname, unsigned flags)); +static const char *NS(mock_nickname); +static node_t NS(mock_node); + +static void +NS(test_main)(void *arg) +{ + smartlist_t *out = smartlist_new(); + routerset_t *set = routerset_new(); + int out_len; + (void)arg; + + NS_MOCK(node_get_by_nickname); + + NS(mock_node).is_running = 0; + NS(mock_nickname) = "foo"; + smartlist_add_strdup(set->list, NS(mock_nickname)); + + routerset_get_all_nodes(out, set, NULL, 1); + out_len = smartlist_len(out); + + smartlist_free(out); + routerset_free(set); + + tt_int_op(out_len, OP_EQ, 0); + tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1); + + done: + ; +} + +const node_t * +NS(node_get_by_nickname)(const char *nickname, unsigned flags) +{ + CALLED(node_get_by_nickname)++; + tt_str_op(nickname, OP_EQ, NS(mock_nickname)); + tt_int_op(flags, OP_EQ, 0); + + done: + return &NS(mock_node); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, list) + +/* + * Structural test for routerset_get_all_nodes. + */ + +NS_DECL(const node_t *, node_get_by_nickname, + (const char *nickname, unsigned flags)); +static char *NS(mock_nickname); +static node_t NS(mock_node); + +static void +NS(test_main)(void *arg) +{ + smartlist_t *out = smartlist_new(); + routerset_t *set = routerset_new(); + int out_len; + node_t *ent; + (void)arg; + + NS_MOCK(node_get_by_nickname); + + NS(mock_nickname) = tor_strdup("foo"); + smartlist_add(set->list, NS(mock_nickname)); + + routerset_get_all_nodes(out, set, NULL, 0); + out_len = smartlist_len(out); + ent = (node_t *)smartlist_get(out, 0); + + smartlist_free(out); + routerset_free(set); + + tt_int_op(out_len, OP_EQ, 1); + tt_ptr_op(ent, OP_EQ, &NS(mock_node)); + tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1); + + done: + ; +} + +const node_t * +NS(node_get_by_nickname)(const char *nickname, unsigned flags) +{ + CALLED(node_get_by_nickname)++; + tt_str_op(nickname, OP_EQ, NS(mock_nickname)); + tt_int_op(flags, OP_EQ, 0); + + done: + return &NS(mock_node); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, nodelist_with_no_nodes) + +/* + * Structural test for routerset_get_all_nodes, when the nodelist has no nodes. + */ + +NS_DECL(smartlist_t *, nodelist_get_list, (void)); + +static smartlist_t *NS(mock_smartlist); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + smartlist_t *out = smartlist_new(); + int r; + (void)arg; + + NS_MOCK(nodelist_get_list); + + smartlist_add_strdup(set->country_names, "{xx}"); + NS(mock_smartlist) = smartlist_new(); + + routerset_get_all_nodes(out, set, NULL, 1); + r = smartlist_len(out); + routerset_free(set); + smartlist_free(out); + smartlist_free(NS(mock_smartlist)); + + tt_int_op(r, OP_EQ, 0); + tt_int_op(CALLED(nodelist_get_list), OP_EQ, 1); + + done: + ; +} + +smartlist_t * +NS(nodelist_get_list)(void) +{ + CALLED(nodelist_get_list)++; + + return NS(mock_smartlist); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, nodelist_flag_not_running) + +/* + * Structural test for routerset_get_all_nodes, with a non-list routerset + * the running_only flag is set, but the nodes are not running. + */ + +NS_DECL(smartlist_t *, nodelist_get_list, (void)); + +static smartlist_t *NS(mock_smartlist); +static node_t NS(mock_node); + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + smartlist_t *out = smartlist_new(); + int r; + (void)arg; + + NS_MOCK(nodelist_get_list); + + smartlist_add_strdup(set->country_names, "{xx}"); + NS(mock_smartlist) = smartlist_new(); + NS(mock_node).is_running = 0; + smartlist_add(NS(mock_smartlist), (void *)&NS(mock_node)); + + routerset_get_all_nodes(out, set, NULL, 1); + r = smartlist_len(out); + routerset_free(set); + smartlist_free(out); + smartlist_free(NS(mock_smartlist)); + + tt_int_op(r, OP_EQ, 0); + tt_int_op(CALLED(nodelist_get_list), OP_EQ, 1); + + done: + ; +} + +smartlist_t * +NS(nodelist_get_list)(void) +{ + CALLED(nodelist_get_list)++; + + return NS(mock_smartlist); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE routerset_subtract_nodes + +/* + * Functional test for routerset_subtract_nodes. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = routerset_new(); + smartlist_t *list = smartlist_new(); + const char *nickname = "foo"; + routerinfo_t ri; + node_t mock_node; + (void)arg; + + strmap_set_lc(set->names, nickname, (void *)1); + + ri.nickname = (char *)nickname; + mock_node.rs = NULL; + mock_node.ri = &ri; + smartlist_add(list, (void *)&mock_node); + + tt_int_op(smartlist_len(list), OP_NE, 0); + routerset_subtract_nodes(list, set); + + tt_int_op(smartlist_len(list), OP_EQ, 0); + done: + routerset_free(set); + smartlist_free(list); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_subtract_nodes, null_routerset) + +/* + * Functional test for routerset_subtract_nodes, with a NULL routerset. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = NULL; + smartlist_t *list = smartlist_new(); + const char *nickname = "foo"; + routerinfo_t ri; + node_t mock_node; + (void)arg; + + ri.nickname = (char *)nickname; + mock_node.ri = &ri; + smartlist_add(list, (void *)&mock_node); + + tt_int_op(smartlist_len(list), OP_NE, 0); + routerset_subtract_nodes(list, set); + + tt_int_op(smartlist_len(list), OP_NE, 0); + done: + routerset_free(set); + smartlist_free(list); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE routerset_to_string + +/* + * Functional test for routerset_to_string. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *set = NULL; + char *s = NULL; + (void)arg; + + set = NULL; + s = routerset_to_string(set); + tt_str_op(s, OP_EQ, ""); + tor_free(s); + + set = routerset_new(); + s = routerset_to_string(set); + tt_str_op(s, OP_EQ, ""); + tor_free(s); + routerset_free(set); set = NULL; + + set = routerset_new(); + smartlist_add(set->list, tor_strndup("a", 1)); + s = routerset_to_string(set); + tt_str_op(s, OP_EQ, "a"); + tor_free(s); + routerset_free(set); set = NULL; + + set = routerset_new(); + smartlist_add(set->list, tor_strndup("a", 1)); + smartlist_add(set->list, tor_strndup("b", 1)); + s = routerset_to_string(set); + tt_str_op(s, OP_EQ, "a,b"); + tor_free(s); + routerset_free(set); set = NULL; + + done: + tor_free(s); + routerset_free(set); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_equal, empty_empty) + +/* + * Functional test for routerset_equal, with both routersets empty. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *a = routerset_new(), *b = routerset_new(); + int r; + (void)arg; + + r = routerset_equal(a, b); + routerset_free(a); + routerset_free(b); + + tt_int_op(r, OP_EQ, 1); + + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_equal, empty_not_empty) + +/* + * Functional test for routerset_equal, with one routersets empty. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *a = routerset_new(), *b = routerset_new(); + int r; + (void)arg; + + smartlist_add_strdup(b->list, "{xx}"); + r = routerset_equal(a, b); + routerset_free(a); + routerset_free(b); + + tt_int_op(r, OP_EQ, 0); + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_equal, differing_lengths) + +/* + * Functional test for routerset_equal, with the routersets having + * differing lengths. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *a = routerset_new(), *b = routerset_new(); + int r; + (void)arg; + + smartlist_add_strdup(a->list, "{aa}"); + smartlist_add_strdup(b->list, "{b1}"); + smartlist_add_strdup(b->list, "{b2}"); + r = routerset_equal(a, b); + routerset_free(a); + routerset_free(b); + + tt_int_op(r, OP_EQ, 0); + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_equal, unequal) + +/* + * Functional test for routerset_equal, with the routersets being + * different. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *a = routerset_new(), *b = routerset_new(); + int r; + (void)arg; + + smartlist_add_strdup(a->list, "foo"); + smartlist_add_strdup(b->list, "bar"); + r = routerset_equal(a, b); + routerset_free(a); + routerset_free(b); + + tt_int_op(r, OP_EQ, 0); + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_equal, equal) + +/* + * Functional test for routerset_equal, with the routersets being + * equal. + */ + +static void +NS(test_main)(void *arg) +{ + routerset_t *a = routerset_new(), *b = routerset_new(); + int r; + (void)arg; + + smartlist_add_strdup(a->list, "foo"); + smartlist_add_strdup(b->list, "foo"); + r = routerset_equal(a, b); + routerset_free(a); + routerset_free(b); + + tt_int_op(r, OP_EQ, 1); + done: + ; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(routerset_free, null_routerset) + +/* + * Structural test for routerset_free, where the routerset is NULL. + */ + +NS_DECL(void, smartlist_free_, (smartlist_t *sl)); + +static void +NS(test_main)(void *arg) +{ + (void)arg; + + NS_MOCK(smartlist_free_); + + routerset_free_(NULL); + + tt_int_op(CALLED(smartlist_free_), OP_EQ, 0); + + done: + ; +} + +void +NS(smartlist_free_)(smartlist_t *s) +{ + (void)s; + CALLED(smartlist_free_)++; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE routerset_free + +/* + * Structural test for routerset_free. + */ + +NS_DECL(void, smartlist_free_, (smartlist_t *sl)); +NS_DECL(void, strmap_free_,(strmap_t *map, void (*free_val)(void*))); +NS_DECL(void, digestmap_free_, (digestmap_t *map, void (*free_val)(void*))); + +static void +NS(test_main)(void *arg) +{ + routerset_t *routerset = routerset_new(); + (void)arg; + + NS_MOCK(smartlist_free_); + NS_MOCK(strmap_free_); + NS_MOCK(digestmap_free_); + + routerset_free(routerset); + + tt_int_op(CALLED(smartlist_free_), OP_NE, 0); + tt_int_op(CALLED(strmap_free_), OP_NE, 0); + tt_int_op(CALLED(digestmap_free_), OP_NE, 0); + + done: + ; +} + +void +NS(smartlist_free_)(smartlist_t *s) +{ + CALLED(smartlist_free_)++; + smartlist_free___real(s); +} + +void +NS(strmap_free_)(strmap_t *map, void (*free_val)(void*)) +{ + CALLED(strmap_free_)++; + strmap_free___real(map, free_val); +} + +void +NS(digestmap_free_)(digestmap_t *map, void (*free_val)(void*)) +{ + CALLED(digestmap_free_)++; + digestmap_free___real(map, free_val); +} + +#undef NS_SUBMODULE + +struct testcase_t routerset_tests[] = { + TEST_CASE(routerset_new), + TEST_CASE(routerset_get_countryname), + TEST_CASE(routerset_is_list), + TEST_CASE(routerset_needs_geoip), + TEST_CASE(routerset_is_empty), + TEST_CASE_ASPECT(routerset_contains, null_set_or_null_set_list), + TEST_CASE_ASPECT(routerset_contains, set_and_nickname), + TEST_CASE_ASPECT(routerset_contains, set_and_null_nickname), + TEST_CASE_ASPECT(routerset_contains, set_and_no_nickname), + TEST_CASE_ASPECT(routerset_contains, set_and_digest), + TEST_CASE_ASPECT(routerset_contains, set_and_no_digest), + TEST_CASE_ASPECT(routerset_contains, set_and_null_digest), + TEST_CASE_ASPECT(routerset_contains, set_and_addr), + TEST_CASE_ASPECT(routerset_contains, set_and_no_addr), + TEST_CASE_ASPECT(routerset_contains, set_and_null_addr), + TEST_CASE_ASPECT(routerset_contains, countries_no_geoip), + TEST_CASE_ASPECT(routerset_contains, countries_geoip), + TEST_CASE_ASPECT(routerset_add_unknown_ccs, only_flag_and_no_ccs), + TEST_CASE_ASPECT(routerset_add_unknown_ccs, creates_set), + TEST_CASE_ASPECT(routerset_add_unknown_ccs, add_unknown), + TEST_CASE_ASPECT(routerset_add_unknown_ccs, add_a1), + TEST_CASE(routerset_contains_extendinfo), + TEST_CASE(routerset_contains_router), + TEST_CASE(routerset_contains_routerstatus), + TEST_CASE_ASPECT(routerset_contains_node, none), + TEST_CASE_ASPECT(routerset_contains_node, routerinfo), + TEST_CASE_ASPECT(routerset_contains_node, routerstatus), + TEST_CASE_ASPECT(routerset_get_all_nodes, no_routerset), + TEST_CASE_ASPECT(routerset_get_all_nodes, list_with_no_nodes), + TEST_CASE_ASPECT(routerset_get_all_nodes, list_flag_not_running), + TEST_CASE_ASPECT(routerset_get_all_nodes, list), + TEST_CASE_ASPECT(routerset_get_all_nodes, nodelist_with_no_nodes), + TEST_CASE_ASPECT(routerset_get_all_nodes, nodelist_flag_not_running), + TEST_CASE_ASPECT(routerset_refresh_counties, geoip_not_loaded), + TEST_CASE_ASPECT(routerset_refresh_counties, no_countries), + TEST_CASE_ASPECT(routerset_refresh_counties, one_valid_country), + TEST_CASE_ASPECT(routerset_refresh_counties, one_invalid_country), + TEST_CASE_ASPECT(routerset_union, source_bad), + TEST_CASE_ASPECT(routerset_union, one), + TEST_CASE_ASPECT(routerset_parse, malformed), + TEST_CASE_ASPECT(routerset_parse, valid_hexdigest), + TEST_CASE_ASPECT(routerset_parse, valid_nickname), + TEST_CASE_ASPECT(routerset_parse, get_countryname), + TEST_CASE_ASPECT(routerset_parse, policy_wildcard), + TEST_CASE_ASPECT(routerset_parse, policy_ipv4), + TEST_CASE_ASPECT(routerset_parse, policy_ipv6), + TEST_CASE(routerset_subtract_nodes), + TEST_CASE_ASPECT(routerset_subtract_nodes, null_routerset), + TEST_CASE(routerset_to_string), + TEST_CASE_ASPECT(routerset_equal, empty_empty), + TEST_CASE_ASPECT(routerset_equal, empty_not_empty), + TEST_CASE_ASPECT(routerset_equal, differing_lengths), + TEST_CASE_ASPECT(routerset_equal, unequal), + TEST_CASE_ASPECT(routerset_equal, equal), + TEST_CASE_ASPECT(routerset_free, null_routerset), + TEST_CASE(routerset_free), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_rust.sh b/src/wraith/src/test/test_rust.sh new file mode 100644 index 000000000..133f2bb94 --- /dev/null +++ b/src/wraith/src/test/test_rust.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# Test all Rust crates + +crates="protover tor_util smartlist tor_allocate" + +exitcode=0 + +set -e + +for crate in $crates; do + cd "${abs_top_builddir:-../../..}/src/rust" + CARGO_TARGET_DIR="${abs_top_builddir:-../../..}/src/rust/target" \ + CARGO_HOME="${abs_top_builddir:-../../..}/src/rust" \ + "${CARGO:-cargo}" test ${CARGO_ONLINE-"--frozen"} \ + --manifest-path "${abs_top_srcdir:-.}/src/rust/${crate}/Cargo.toml" \ + || exitcode=1 + cd - +done + +exit $exitcode diff --git a/src/wraith/src/test/test_scheduler.c b/src/wraith/src/test/test_scheduler.c new file mode 100644 index 000000000..0d8a9eaa1 --- /dev/null +++ b/src/wraith/src/test/test_scheduler.c @@ -0,0 +1,1072 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#include +#include + +#define SCHEDULER_KIST_PRIVATE +#define TOR_CHANNEL_INTERNAL_ +#define CHANNEL_PRIVATE_ +#include "or.h" +#include "config.h" +#include "compat_libevent.h" +#include "channel.h" +#include "channeltls.h" +#include "connection.h" +#include "networkstatus.h" +#define SCHEDULER_PRIVATE_ +#include "scheduler.h" + +/* Test suite stuff */ +#include "test.h" +#include "fakechans.h" + +/* Shamelessly stolen from compat_libevent.c */ +#define V(major, minor, patch) \ + (((major) << 24) | ((minor) << 16) | ((patch) << 8)) + +/****************************************************************************** + * Statistical info + *****************************************************************************/ +static int scheduler_compare_channels_mock_ctr = 0; +static int scheduler_run_mock_ctr = 0; + +/****************************************************************************** + * Utility functions and things we need to mock + *****************************************************************************/ +static or_options_t mocked_options; +static const or_options_t * +mock_get_options(void) +{ + return &mocked_options; +} + +static void +cleanup_scheduler_options(void) +{ + if (mocked_options.SchedulerTypes_) { + SMARTLIST_FOREACH(mocked_options.SchedulerTypes_, int *, i, tor_free(i)); + smartlist_free(mocked_options.SchedulerTypes_); + mocked_options.SchedulerTypes_ = NULL; + } +} + +static void +set_scheduler_options(int val) +{ + int *type; + + if (mocked_options.SchedulerTypes_ == NULL) { + mocked_options.SchedulerTypes_ = smartlist_new(); + } + type = tor_malloc_zero(sizeof(int)); + *type = val; + smartlist_add(mocked_options.SchedulerTypes_, type); +} + +static void +clear_options(void) +{ + cleanup_scheduler_options(); + memset(&mocked_options, 0, sizeof(mocked_options)); +} + +static int32_t +mock_vanilla_networkstatus_get_param( + const networkstatus_t *ns, const char *param_name, int32_t default_val, + int32_t min_val, int32_t max_val) +{ + (void)ns; + (void)default_val; + (void)min_val; + (void)max_val; + // only support KISTSchedRunInterval right now + tor_assert(strcmp(param_name, "KISTSchedRunInterval")==0); + return 0; +} + +static int32_t +mock_kist_networkstatus_get_param( + const networkstatus_t *ns, const char *param_name, int32_t default_val, + int32_t min_val, int32_t max_val) +{ + (void)ns; + (void)default_val; + (void)min_val; + (void)max_val; + // only support KISTSchedRunInterval right now + tor_assert(strcmp(param_name, "KISTSchedRunInterval")==0); + return 12; +} + +/* Event base for scheduelr tests */ +static struct event_base *mock_event_base = NULL; +/* Setup for mock event stuff */ +static void mock_event_free_all(void); +static void mock_event_init(void); +static void +mock_event_free_all(void) +{ + tt_ptr_op(mock_event_base, OP_NE, NULL); + + if (mock_event_base) { + event_base_free(mock_event_base); + mock_event_base = NULL; + } + + tt_ptr_op(mock_event_base, OP_EQ, NULL); + + done: + return; +} + +static void +mock_event_init(void) +{ + struct event_config *cfg = NULL; + + tt_ptr_op(mock_event_base, OP_EQ, NULL); + + /* + * Really cut down from tor_libevent_initialize of + * src/common/compat_libevent.c to kill config dependencies + */ + + if (!mock_event_base) { + cfg = event_config_new(); +#if LIBEVENT_VERSION_NUMBER >= V(2,0,9) + /* We can enable changelist support with epoll, since we don't give + * Libevent any dup'd fds. This lets us avoid some syscalls. */ + event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST); +#endif + mock_event_base = event_base_new_with_config(cfg); + event_config_free(cfg); + } + + tt_ptr_op(mock_event_base, OP_NE, NULL); + + done: + return; +} + +static struct event_base * +tor_libevent_get_base_mock(void) +{ + return mock_event_base; +} + +static int +scheduler_compare_channels_mock(const void *c1_v, + const void *c2_v) +{ + uintptr_t p1, p2; + + p1 = (uintptr_t)(c1_v); + p2 = (uintptr_t)(c2_v); + + ++scheduler_compare_channels_mock_ctr; + + if (p1 == p2) return 0; + else if (p1 < p2) return 1; + else return -1; +} + +static void +scheduler_run_noop_mock(void) +{ + ++scheduler_run_mock_ctr; +} + +static circuitmux_t *mock_ccm_tgt_1 = NULL; +static circuitmux_t *mock_ccm_tgt_2 = NULL; +static circuitmux_t *mock_cgp_tgt_1 = NULL; +static circuitmux_policy_t *mock_cgp_val_1 = NULL; +static circuitmux_t *mock_cgp_tgt_2 = NULL; +static circuitmux_policy_t *mock_cgp_val_2 = NULL; + +static const circuitmux_policy_t * +circuitmux_get_policy_mock(circuitmux_t *cmux) +{ + const circuitmux_policy_t *result = NULL; + + tt_assert(cmux != NULL); + if (cmux) { + if (cmux == mock_cgp_tgt_1) result = mock_cgp_val_1; + else if (cmux == mock_cgp_tgt_2) result = mock_cgp_val_2; + else result = circuitmux_get_policy__real(cmux); + } + + done: + return result; +} + +static int +circuitmux_compare_muxes_mock(circuitmux_t *cmux_1, + circuitmux_t *cmux_2) +{ + int result = 0; + + tt_assert(cmux_1 != NULL); + tt_assert(cmux_2 != NULL); + + if (cmux_1 != cmux_2) { + if (cmux_1 == mock_ccm_tgt_1 && cmux_2 == mock_ccm_tgt_2) result = -1; + else if (cmux_1 == mock_ccm_tgt_2 && cmux_2 == mock_ccm_tgt_1) { + result = 1; + } else { + if (cmux_1 == mock_ccm_tgt_1 || cmux_1 == mock_ccm_tgt_2) result = -1; + else if (cmux_2 == mock_ccm_tgt_1 || cmux_2 == mock_ccm_tgt_2) { + result = 1; + } else { + result = circuitmux_compare_muxes__real(cmux_1, cmux_2); + } + } + } + /* else result = 0 always */ + + done: + return result; +} + +typedef struct { + const channel_t *chan; + ssize_t cells; +} flush_mock_channel_t; + +static smartlist_t *chans_for_flush_mock = NULL; + +static void +channel_flush_some_cells_mock_free_all(void) +{ + if (chans_for_flush_mock) { + SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock, + flush_mock_channel_t *, + flush_mock_ch) { + SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch); + tor_free(flush_mock_ch); + } SMARTLIST_FOREACH_END(flush_mock_ch); + + smartlist_free(chans_for_flush_mock); + chans_for_flush_mock = NULL; + } +} + +static void +channel_flush_some_cells_mock_set(channel_t *chan, ssize_t num_cells) +{ + int found = 0; + + if (!chan) return; + if (num_cells <= 0) return; + + if (!chans_for_flush_mock) { + chans_for_flush_mock = smartlist_new(); + } + + SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock, + flush_mock_channel_t *, + flush_mock_ch) { + if (flush_mock_ch != NULL && flush_mock_ch->chan != NULL) { + if (flush_mock_ch->chan == chan) { + /* Found it */ + flush_mock_ch->cells = num_cells; + found = 1; + break; + } + } else { + /* That shouldn't be there... */ + SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch); + tor_free(flush_mock_ch); + } + } SMARTLIST_FOREACH_END(flush_mock_ch); + + if (! found) { + /* The loop didn't find it */ + flush_mock_channel_t *flush_mock_ch; + flush_mock_ch = tor_malloc_zero(sizeof(*flush_mock_ch)); + flush_mock_ch->chan = chan; + flush_mock_ch->cells = num_cells; + smartlist_add(chans_for_flush_mock, flush_mock_ch); + } +} + +static int +channel_more_to_flush_mock(channel_t *chan) +{ + tor_assert(chan); + + flush_mock_channel_t *found_mock_ch = NULL; + + SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock, + flush_mock_channel_t *, + flush_mock_ch) { + if (flush_mock_ch != NULL && flush_mock_ch->chan != NULL) { + if (flush_mock_ch->chan == chan) { + /* Found it */ + found_mock_ch = flush_mock_ch; + break; + } + } else { + /* That shouldn't be there... */ + SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch); + tor_free(flush_mock_ch); + } + } SMARTLIST_FOREACH_END(flush_mock_ch); + + tor_assert(found_mock_ch); + + /* Check if any circuits would like to queue some */ + /* special for the mock: return the number of cells (instead of 1), or zero + * if nothing to flush */ + return (found_mock_ch->cells > 0 ? (int)found_mock_ch->cells : 0 ); +} + +static void +channel_write_to_kernel_mock(channel_t *chan) +{ + (void)chan; + //log_debug(LD_SCHED, "chan=%d writing to kernel", + // (int)chan->global_identifier); +} + +static int +channel_should_write_to_kernel_mock(outbuf_table_t *ot, channel_t *chan) +{ + (void)ot; + (void)chan; + return 1; + /* We could make this more complicated if we wanted. But I don't think doing + * so tests much of anything */ + //static int called_counter = 0; + //if (++called_counter >= 3) { + // called_counter -= 3; + // log_debug(LD_SCHED, "chan=%d should write to kernel", + // (int)chan->global_identifier); + // return 1; + //} + //return 0; +} + +static ssize_t +channel_flush_some_cells_mock(channel_t *chan, ssize_t num_cells) +{ + ssize_t flushed = 0, max; + char unlimited = 0; + flush_mock_channel_t *found = NULL; + + tt_ptr_op(chan, OP_NE, NULL); + if (chan) { + if (num_cells < 0) { + num_cells = 0; + unlimited = 1; + } + + /* Check if we have it */ + if (chans_for_flush_mock != NULL) { + SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock, + flush_mock_channel_t *, + flush_mock_ch) { + if (flush_mock_ch != NULL && flush_mock_ch->chan != NULL) { + if (flush_mock_ch->chan == chan) { + /* Found it */ + found = flush_mock_ch; + break; + } + } else { + /* That shouldn't be there... */ + SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch); + tor_free(flush_mock_ch); + } + } SMARTLIST_FOREACH_END(flush_mock_ch); + + if (found) { + /* We found one */ + if (found->cells < 0) found->cells = 0; + + if (unlimited) max = found->cells; + else max = MIN(found->cells, num_cells); + + flushed += max; + found->cells -= max; + } + } + } + + done: + return flushed; +} + +static void +update_socket_info_impl_mock(socket_table_ent_t *ent) +{ + ent->cwnd = ent->unacked = ent->mss = ent->notsent = 0; + ent->limit = INT_MAX; +} + +static void +perform_channel_state_tests(int KISTSchedRunInterval, int sched_type) +{ + channel_t *ch1 = NULL, *ch2 = NULL; + int old_count; + + /* setup options so we're sure about what sched we are running */ + MOCK(get_options, mock_get_options); + clear_options(); + mocked_options.KISTSchedRunInterval = KISTSchedRunInterval; + set_scheduler_options(sched_type); + + /* Set up libevent and scheduler */ + mock_event_init(); + MOCK(tor_libevent_get_base, tor_libevent_get_base_mock); + scheduler_init(); + /* + * Install the compare channels mock so we can test + * scheduler_touch_channel(). + */ + MOCK(scheduler_compare_channels, scheduler_compare_channels_mock); + /* + * Disable scheduler_run so we can just check the state transitions + * without having to make everything it might call work too. + */ + ((scheduler_t *) the_scheduler)->run = scheduler_run_noop_mock; + + tt_int_op(smartlist_len(channels_pending), OP_EQ, 0); + + /* Set up a fake channel */ + ch1 = new_fake_channel(); + tt_assert(ch1); + + /* Start it off in OPENING */ + ch1->state = CHANNEL_STATE_OPENING; + /* Try to register it */ + channel_register(ch1); + tt_assert(ch1->registered); + + /* It should start off in SCHED_CHAN_IDLE */ + tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_IDLE); + + /* Now get another one */ + ch2 = new_fake_channel(); + tt_assert(ch2); + ch2->state = CHANNEL_STATE_OPENING; + channel_register(ch2); + tt_assert(ch2->registered); + + /* Send ch1 to SCHED_CHAN_WAITING_TO_WRITE */ + scheduler_channel_has_waiting_cells(ch1); + tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_TO_WRITE); + + /* This should send it to SCHED_CHAN_PENDING */ + scheduler_channel_wants_writes(ch1); + tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), OP_EQ, 1); + + /* Now send ch2 to SCHED_CHAN_WAITING_FOR_CELLS */ + scheduler_channel_wants_writes(ch2); + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); + + /* Drop ch2 back to idle */ + scheduler_channel_doesnt_want_writes(ch2); + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_IDLE); + + /* ...and back to SCHED_CHAN_WAITING_FOR_CELLS */ + scheduler_channel_wants_writes(ch2); + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); + + /* ...and this should kick ch2 into SCHED_CHAN_PENDING */ + scheduler_channel_has_waiting_cells(ch2); + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), OP_EQ, 2); + + /* This should send ch2 to SCHED_CHAN_WAITING_TO_WRITE */ + scheduler_channel_doesnt_want_writes(ch2); + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_TO_WRITE); + tt_int_op(smartlist_len(channels_pending), OP_EQ, 1); + + /* ...and back to SCHED_CHAN_PENDING */ + scheduler_channel_wants_writes(ch2); + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), OP_EQ, 2); + + /* Now we exercise scheduler_touch_channel */ + old_count = scheduler_compare_channels_mock_ctr; + scheduler_touch_channel(ch1); + tt_assert(scheduler_compare_channels_mock_ctr > old_count); + + /* Close */ + channel_mark_for_close(ch1); + tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSING); + channel_mark_for_close(ch2); + tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSING); + channel_closed(ch1); + tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSED); + ch1 = NULL; + channel_closed(ch2); + tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSED); + ch2 = NULL; + + /* Shut things down */ + + channel_free_all(); + scheduler_free_all(); + mock_event_free_all(); + + done: + tor_free(ch1); + tor_free(ch2); + + UNMOCK(scheduler_compare_channels); + UNMOCK(tor_libevent_get_base); + UNMOCK(get_options); + cleanup_scheduler_options(); + + return; +} + +static void +test_scheduler_compare_channels(void *arg) +{ + /* We don't actually need whole fake channels... */ + channel_t c1, c2; + /* ...and some dummy circuitmuxes too */ + circuitmux_t *cm1 = NULL, *cm2 = NULL; + int result; + + (void)arg; + + /* We can't actually see sizeof(circuitmux_t) from here */ + cm1 = tor_malloc_zero(sizeof(void *)); + cm2 = tor_malloc_zero(sizeof(void *)); + + c1.cmux = cm1; + c2.cmux = cm2; + + /* Configure circuitmux_get_policy() mock */ + mock_cgp_tgt_1 = cm1; + mock_cgp_tgt_2 = cm2; + + /* + * This is to test the different-policies case, which uses the policy + * cast to an uintptr_t as an arbitrary but definite thing to compare. + */ + mock_cgp_val_1 = tor_malloc_zero(16); + mock_cgp_val_2 = tor_malloc_zero(16); + if ( ((uintptr_t) mock_cgp_val_1) > ((uintptr_t) mock_cgp_val_2) ) { + void *tmp = mock_cgp_val_1; + mock_cgp_val_1 = mock_cgp_val_2; + mock_cgp_val_2 = tmp; + } + + MOCK(circuitmux_get_policy, circuitmux_get_policy_mock); + + /* Now set up circuitmux_compare_muxes() mock using cm1/cm2 */ + mock_ccm_tgt_1 = cm1; + mock_ccm_tgt_2 = cm2; + MOCK(circuitmux_compare_muxes, circuitmux_compare_muxes_mock); + + /* Equal-channel case */ + result = scheduler_compare_channels(&c1, &c1); + tt_int_op(result, OP_EQ, 0); + + /* Distinct channels, distinct policies */ + result = scheduler_compare_channels(&c1, &c2); + tt_int_op(result, OP_EQ, -1); + result = scheduler_compare_channels(&c2, &c1); + tt_int_op(result, OP_EQ, 1); + + /* Distinct channels, same policy */ + tor_free(mock_cgp_val_2); + mock_cgp_val_2 = mock_cgp_val_1; + result = scheduler_compare_channels(&c1, &c2); + tt_int_op(result, OP_EQ, -1); + result = scheduler_compare_channels(&c2, &c1); + tt_int_op(result, OP_EQ, 1); + + done: + + UNMOCK(circuitmux_compare_muxes); + mock_ccm_tgt_1 = NULL; + mock_ccm_tgt_2 = NULL; + + UNMOCK(circuitmux_get_policy); + mock_cgp_tgt_1 = NULL; + mock_cgp_tgt_2 = NULL; + + tor_free(cm1); + tor_free(cm2); + + if (mock_cgp_val_1 != mock_cgp_val_2) + tor_free(mock_cgp_val_1); + tor_free(mock_cgp_val_2); + mock_cgp_val_1 = NULL; + mock_cgp_val_2 = NULL; + + return; +} + +/****************************************************************************** + * The actual tests! + *****************************************************************************/ + +static void +test_scheduler_loop_vanilla(void *arg) +{ + (void)arg; + channel_t *ch1 = NULL, *ch2 = NULL; + void (*run_func_ptr)(void); + + /* setup options so we're sure about what sched we are running */ + MOCK(get_options, mock_get_options); + clear_options(); + set_scheduler_options(SCHEDULER_VANILLA); + mocked_options.KISTSchedRunInterval = 0; + + /* Set up libevent and scheduler */ + + mock_event_init(); + MOCK(tor_libevent_get_base, tor_libevent_get_base_mock); + scheduler_init(); + /* + * Install the compare channels mock so we can test + * scheduler_touch_channel(). + */ + MOCK(scheduler_compare_channels, scheduler_compare_channels_mock); + /* + * Disable scheduler_run so we can just check the state transitions + * without having to make everything it might call work too. + */ + run_func_ptr = the_scheduler->run; + ((scheduler_t *) the_scheduler)->run = scheduler_run_noop_mock; + + tt_int_op(smartlist_len(channels_pending), OP_EQ, 0); + + /* Set up a fake channel */ + ch1 = new_fake_channel(); + ch1->magic = TLS_CHAN_MAGIC; + tt_assert(ch1); + + /* Start it off in OPENING */ + ch1->state = CHANNEL_STATE_OPENING; + /* Try to register it */ + channel_register(ch1); + tt_assert(ch1->registered); + /* Finish opening it */ + channel_change_state_open(ch1); + + /* It should start off in SCHED_CHAN_IDLE */ + tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_IDLE); + + /* Now get another one */ + ch2 = new_fake_channel(); + ch2->magic = TLS_CHAN_MAGIC; + tt_assert(ch2); + ch2->state = CHANNEL_STATE_OPENING; + channel_register(ch2); + tt_assert(ch2->registered); + /* + * Don't open ch2; then channel_num_cells_writeable() will return + * zero and we'll get coverage of that exception case in scheduler_run() + */ + + tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_OPEN); + tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_OPENING); + + /* Send it to SCHED_CHAN_WAITING_TO_WRITE */ + scheduler_channel_has_waiting_cells(ch1); + tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_TO_WRITE); + + /* This should send it to SCHED_CHAN_PENDING */ + scheduler_channel_wants_writes(ch1); + tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), OP_EQ, 1); + + /* Now send ch2 to SCHED_CHAN_WAITING_FOR_CELLS */ + scheduler_channel_wants_writes(ch2); + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); + + /* Drop ch2 back to idle */ + scheduler_channel_doesnt_want_writes(ch2); + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_IDLE); + + /* ...and back to SCHED_CHAN_WAITING_FOR_CELLS */ + scheduler_channel_wants_writes(ch2); + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); + + /* ...and this should kick ch2 into SCHED_CHAN_PENDING */ + scheduler_channel_has_waiting_cells(ch2); + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), OP_EQ, 2); + + /* + * Now we've got two pending channels and need to fire off + * the scheduler run() that we kept. + */ + run_func_ptr(); + + /* + * Assert that they're still in the states we left and aren't still + * pending + */ + tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_OPEN); + tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_OPENING); + tt_assert(ch1->scheduler_state != SCHED_CHAN_PENDING); + tt_assert(ch2->scheduler_state != SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), OP_EQ, 0); + + /* Now, finish opening ch2, and get both back to pending */ + channel_change_state_open(ch2); + scheduler_channel_wants_writes(ch1); + scheduler_channel_wants_writes(ch2); + scheduler_channel_has_waiting_cells(ch1); + scheduler_channel_has_waiting_cells(ch2); + tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_OPEN); + tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_OPEN); + tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), OP_EQ, 2); + + /* Now, set up the channel_flush_some_cells() mock */ + MOCK(channel_flush_some_cells, channel_flush_some_cells_mock); + /* + * 16 cells on ch1 means it'll completely drain into the 32 cells + * fakechan's num_cells_writeable() returns. + */ + channel_flush_some_cells_mock_set(ch1, 16); + /* + * This one should get sent back to pending, since num_cells_writeable() + * will still return non-zero. + */ + channel_flush_some_cells_mock_set(ch2, 48); + + /* + * And re-run the scheduler run() loop with non-zero returns from + * channel_flush_some_cells() this time. + */ + run_func_ptr(); + + /* + * ch1 should have gone to SCHED_CHAN_WAITING_FOR_CELLS, with 16 flushed + * and 32 writeable. + */ + tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); + /* + * ...ch2 should also have gone to SCHED_CHAN_WAITING_FOR_CELLS, with + * channel_more_to_flush() returning false and channel_num_cells_writeable() + * > 0/ + */ + tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); + + /* Close */ + channel_mark_for_close(ch1); + tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSING); + channel_mark_for_close(ch2); + tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSING); + channel_closed(ch1); + tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSED); + ch1 = NULL; + channel_closed(ch2); + tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSED); + ch2 = NULL; + + /* Shut things down */ + channel_flush_some_cells_mock_free_all(); + channel_free_all(); + scheduler_free_all(); + mock_event_free_all(); + + done: + tor_free(ch1); + tor_free(ch2); + cleanup_scheduler_options(); + + UNMOCK(channel_flush_some_cells); + UNMOCK(scheduler_compare_channels); + UNMOCK(tor_libevent_get_base); + UNMOCK(get_options); +} + +static void +test_scheduler_loop_kist(void *arg) +{ + (void) arg; + +#ifndef HAVE_KIST_SUPPORT + return; +#endif + + channel_t *ch1 = new_fake_channel(), *ch2 = new_fake_channel(); + channel_t *ch3 = new_fake_channel(); + + /* setup options so we're sure about what sched we are running */ + MOCK(get_options, mock_get_options); + MOCK(channel_flush_some_cells, channel_flush_some_cells_mock); + MOCK(channel_more_to_flush, channel_more_to_flush_mock); + MOCK(channel_write_to_kernel, channel_write_to_kernel_mock); + MOCK(channel_should_write_to_kernel, channel_should_write_to_kernel_mock); + MOCK(update_socket_info_impl, update_socket_info_impl_mock); + clear_options(); + mocked_options.KISTSchedRunInterval = 11; + set_scheduler_options(SCHEDULER_KIST); + scheduler_init(); + + tt_assert(ch1); + ch1->magic = TLS_CHAN_MAGIC; + ch1->state = CHANNEL_STATE_OPENING; + channel_register(ch1); + tt_assert(ch1->registered); + channel_change_state_open(ch1); + scheduler_channel_has_waiting_cells(ch1); + scheduler_channel_wants_writes(ch1); + channel_flush_some_cells_mock_set(ch1, 5); + + tt_assert(ch2); + ch2->magic = TLS_CHAN_MAGIC; + ch2->state = CHANNEL_STATE_OPENING; + channel_register(ch2); + tt_assert(ch2->registered); + channel_change_state_open(ch2); + scheduler_channel_has_waiting_cells(ch2); + scheduler_channel_wants_writes(ch2); + channel_flush_some_cells_mock_set(ch2, 5); + + the_scheduler->run(); + + scheduler_channel_has_waiting_cells(ch1); + channel_flush_some_cells_mock_set(ch1, 5); + + the_scheduler->run(); + + scheduler_channel_has_waiting_cells(ch1); + channel_flush_some_cells_mock_set(ch1, 5); + scheduler_channel_has_waiting_cells(ch2); + channel_flush_some_cells_mock_set(ch2, 5); + + the_scheduler->run(); + + channel_flush_some_cells_mock_free_all(); + + /* We'll try to run this closed channel threw the scheduler loop and make + * sure it ends up in the right state. */ + tt_assert(ch3); + ch3->magic = TLS_CHAN_MAGIC; + ch3->state = CHANNEL_STATE_OPEN; + ch3->cmux = circuitmux_alloc(); + channel_register(ch3); + tt_assert(ch3->registered); + + ch3->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS; + scheduler_channel_has_waiting_cells(ch3); + /* Should be in the pending list now waiting to be handled. */ + tt_int_op(ch3->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(get_channels_pending()), OP_EQ, 1); + /* By running the scheduler on a closed channel, it should end up in the + * IDLE state and not in the pending channel list. */ + ch3->state = CHANNEL_STATE_CLOSED; + the_scheduler->run(); + tt_int_op(ch3->scheduler_state, OP_EQ, SCHED_CHAN_IDLE); + tt_int_op(smartlist_len(get_channels_pending()), OP_EQ, 0); + + done: + /* Prep the channel so the free() function doesn't explode. */ + ch1->state = ch2->state = ch3->state = CHANNEL_STATE_CLOSED; + ch1->registered = ch2->registered = ch3->registered = 0; + channel_free(ch1); + channel_free(ch2); + channel_free(ch3); + UNMOCK(update_socket_info_impl); + UNMOCK(channel_should_write_to_kernel); + UNMOCK(channel_write_to_kernel); + UNMOCK(channel_more_to_flush); + UNMOCK(channel_flush_some_cells); + UNMOCK(get_options); + scheduler_free_all(); + return; +} + +static void +test_scheduler_channel_states(void *arg) +{ + (void)arg; + perform_channel_state_tests(-1, SCHEDULER_VANILLA); + perform_channel_state_tests(11, SCHEDULER_KIST_LITE); +#ifdef HAVE_KIST_SUPPORT + perform_channel_state_tests(11, SCHEDULER_KIST); +#endif +} + +static void +test_scheduler_initfree(void *arg) +{ + (void)arg; + + tt_ptr_op(channels_pending, ==, NULL); + tt_ptr_op(run_sched_ev, ==, NULL); + + mock_event_init(); + MOCK(tor_libevent_get_base, tor_libevent_get_base_mock); + MOCK(get_options, mock_get_options); + set_scheduler_options(SCHEDULER_KIST); + set_scheduler_options(SCHEDULER_KIST_LITE); + set_scheduler_options(SCHEDULER_VANILLA); + + scheduler_init(); + + tt_ptr_op(channels_pending, !=, NULL); + tt_ptr_op(run_sched_ev, !=, NULL); + /* We have specified nothing in the torrc and there's no consensus so the + * KIST scheduler is what should be in use */ + tt_ptr_op(the_scheduler, ==, get_kist_scheduler()); + tt_int_op(sched_run_interval, ==, 10); + + scheduler_free_all(); + + UNMOCK(tor_libevent_get_base); + mock_event_free_all(); + + tt_ptr_op(channels_pending, ==, NULL); + tt_ptr_op(run_sched_ev, ==, NULL); + + done: + UNMOCK(get_options); + cleanup_scheduler_options(); + return; +} + +static void +test_scheduler_can_use_kist(void *arg) +{ + (void)arg; + + int res_should, res_freq; + MOCK(get_options, mock_get_options); + + /* Test force enabling of KIST */ + clear_options(); + mocked_options.KISTSchedRunInterval = 1234; + res_should = scheduler_can_use_kist(); + res_freq = kist_scheduler_run_interval(NULL); +#ifdef HAVE_KIST_SUPPORT + tt_int_op(res_should, ==, 1); +#else /* HAVE_KIST_SUPPORT */ + tt_int_op(res_should, ==, 0); +#endif /* HAVE_KIST_SUPPORT */ + tt_int_op(res_freq, ==, 1234); + + /* Test defer to consensus, but no consensus available */ + clear_options(); + mocked_options.KISTSchedRunInterval = 0; + res_should = scheduler_can_use_kist(); + res_freq = kist_scheduler_run_interval(NULL); +#ifdef HAVE_KIST_SUPPORT + tt_int_op(res_should, ==, 1); +#else /* HAVE_KIST_SUPPORT */ + tt_int_op(res_should, ==, 0); +#endif /* HAVE_KIST_SUPPORT */ + tt_int_op(res_freq, ==, 10); + + /* Test defer to consensus, and kist consensus available */ + MOCK(networkstatus_get_param, mock_kist_networkstatus_get_param); + clear_options(); + mocked_options.KISTSchedRunInterval = 0; + res_should = scheduler_can_use_kist(); + res_freq = kist_scheduler_run_interval(NULL); +#ifdef HAVE_KIST_SUPPORT + tt_int_op(res_should, ==, 1); +#else /* HAVE_KIST_SUPPORT */ + tt_int_op(res_should, ==, 0); +#endif /* HAVE_KIST_SUPPORT */ + tt_int_op(res_freq, ==, 12); + UNMOCK(networkstatus_get_param); + + /* Test defer to consensus, and vanilla consensus available */ + MOCK(networkstatus_get_param, mock_vanilla_networkstatus_get_param); + clear_options(); + mocked_options.KISTSchedRunInterval = 0; + res_should = scheduler_can_use_kist(); + res_freq = kist_scheduler_run_interval(NULL); + tt_int_op(res_should, ==, 0); + tt_int_op(res_freq, ==, 0); + UNMOCK(networkstatus_get_param); + + done: + UNMOCK(get_options); + return; +} + +static void +test_scheduler_ns_changed(void *arg) +{ + (void) arg; + + /* + * Currently no scheduler implementations use the old/new consensuses passed + * in scheduler_notify_networkstatus_changed, so it is okay to pass NULL. + * + * "But then what does test actually exercise???" It tests that + * scheduler_notify_networkstatus_changed fetches the correct value from the + * consensus, and then switches the scheduler if necessasry. + */ + + MOCK(get_options, mock_get_options); + clear_options(); + set_scheduler_options(SCHEDULER_KIST); + set_scheduler_options(SCHEDULER_VANILLA); + + tt_ptr_op(the_scheduler, ==, NULL); + + /* Change from vanilla to kist via consensus */ + the_scheduler = get_vanilla_scheduler(); + MOCK(networkstatus_get_param, mock_kist_networkstatus_get_param); + scheduler_notify_networkstatus_changed(NULL, NULL); + UNMOCK(networkstatus_get_param); +#ifdef HAVE_KIST_SUPPORT + tt_ptr_op(the_scheduler, ==, get_kist_scheduler()); +#else + tt_ptr_op(the_scheduler, ==, get_vanilla_scheduler()); +#endif + + /* Change from kist to vanilla via consensus */ + the_scheduler = get_kist_scheduler(); + MOCK(networkstatus_get_param, mock_vanilla_networkstatus_get_param); + scheduler_notify_networkstatus_changed(NULL, NULL); + UNMOCK(networkstatus_get_param); + tt_ptr_op(the_scheduler, ==, get_vanilla_scheduler()); + + /* Doesn't change when using KIST */ + the_scheduler = get_kist_scheduler(); + MOCK(networkstatus_get_param, mock_kist_networkstatus_get_param); + scheduler_notify_networkstatus_changed(NULL, NULL); + UNMOCK(networkstatus_get_param); +#ifdef HAVE_KIST_SUPPORT + tt_ptr_op(the_scheduler, ==, get_kist_scheduler()); +#else + tt_ptr_op(the_scheduler, ==, get_vanilla_scheduler()); +#endif + + /* Doesn't change when using vanilla */ + the_scheduler = get_vanilla_scheduler(); + MOCK(networkstatus_get_param, mock_vanilla_networkstatus_get_param); + scheduler_notify_networkstatus_changed(NULL, NULL); + UNMOCK(networkstatus_get_param); + tt_ptr_op(the_scheduler, ==, get_vanilla_scheduler()); + + done: + UNMOCK(get_options); + cleanup_scheduler_options(); + return; +} + +struct testcase_t scheduler_tests[] = { + { "compare_channels", test_scheduler_compare_channels, + TT_FORK, NULL, NULL }, + { "channel_states", test_scheduler_channel_states, TT_FORK, NULL, NULL }, + { "initfree", test_scheduler_initfree, TT_FORK, NULL, NULL }, + { "loop_vanilla", test_scheduler_loop_vanilla, TT_FORK, NULL, NULL }, + { "loop_kist", test_scheduler_loop_kist, TT_FORK, NULL, NULL }, + { "ns_changed", test_scheduler_ns_changed, TT_FORK, NULL, NULL}, + { "should_use_kist", test_scheduler_can_use_kist, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_shared_random.c b/src/wraith/src/test/test_shared_random.c new file mode 100644 index 000000000..96494904e --- /dev/null +++ b/src/wraith/src/test/test_shared_random.c @@ -0,0 +1,1388 @@ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define SHARED_RANDOM_PRIVATE +#define SHARED_RANDOM_STATE_PRIVATE +#define CONFIG_PRIVATE +#define DIRVOTE_PRIVATE + +#include "or.h" +#include "test.h" +#include "config.h" +#include "dirvote.h" +#include "shared_random.h" +#include "shared_random_state.h" +#include "routerkeys.h" +#include "routerlist.h" +#include "router.h" +#include "routerparse.h" +#include "networkstatus.h" +#include "log_test_helpers.h" + +static authority_cert_t *mock_cert; + +static authority_cert_t * +get_my_v3_authority_cert_m(void) +{ + tor_assert(mock_cert); + return mock_cert; +} + +static dir_server_t ds; + +static dir_server_t * +trusteddirserver_get_by_v3_auth_digest_m(const char *digest) +{ + (void) digest; + /* The shared random code only need to know if a valid pointer to a dir + * server object has been found so this is safe because it won't use the + * pointer at all never. */ + return &ds; +} + +/* Setup a minimal dirauth environment by initializing the SR state and + * making sure the options are set to be an authority directory. */ +static void +init_authority_state(void) +{ + MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); + + or_options_t *options = get_options_mutable(); + mock_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); + tt_assert(mock_cert); + options->AuthoritativeDir = 1; + tt_int_op(load_ed_keys(options, time(NULL)), OP_GE, 0); + sr_state_init(0, 0); + /* It's possible a commit has been generated in our state depending on + * the phase we are currently in which uses "now" as the starting + * timestamp. Delete it before we do any testing below. */ + sr_state_delete_commits(); + + done: + UNMOCK(get_my_v3_authority_cert); +} + +static void +test_get_sr_protocol_phase(void *arg) +{ + time_t the_time; + sr_phase_t phase; + int retval; + + (void) arg; + + /* Initialize SR state */ + init_authority_state(); + + { + retval = parse_rfc1123_time("Wed, 20 Apr 2015 23:59:00 UTC", &the_time); + tt_int_op(retval, OP_EQ, 0); + + phase = get_sr_protocol_phase(the_time); + tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL); + } + + { + retval = parse_rfc1123_time("Wed, 20 Apr 2015 00:00:00 UTC", &the_time); + tt_int_op(retval, OP_EQ, 0); + + phase = get_sr_protocol_phase(the_time); + tt_int_op(phase, OP_EQ, SR_PHASE_COMMIT); + } + + { + retval = parse_rfc1123_time("Wed, 20 Apr 2015 00:00:01 UTC", &the_time); + tt_int_op(retval, OP_EQ, 0); + + phase = get_sr_protocol_phase(the_time); + tt_int_op(phase, OP_EQ, SR_PHASE_COMMIT); + } + + { + retval = parse_rfc1123_time("Wed, 20 Apr 2015 11:59:00 UTC", &the_time); + tt_int_op(retval, OP_EQ, 0); + + phase = get_sr_protocol_phase(the_time); + tt_int_op(phase, OP_EQ, SR_PHASE_COMMIT); + } + + { + retval = parse_rfc1123_time("Wed, 20 Apr 2015 12:00:00 UTC", &the_time); + tt_int_op(retval, OP_EQ, 0); + + phase = get_sr_protocol_phase(the_time); + tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL); + } + + { + retval = parse_rfc1123_time("Wed, 20 Apr 2015 12:00:01 UTC", &the_time); + tt_int_op(retval, OP_EQ, 0); + + phase = get_sr_protocol_phase(the_time); + tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL); + } + + { + retval = parse_rfc1123_time("Wed, 20 Apr 2015 13:00:00 UTC", &the_time); + tt_int_op(retval, OP_EQ, 0); + + phase = get_sr_protocol_phase(the_time); + tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL); + } + + done: + ; +} + +static networkstatus_t mock_consensus; + +/* Mock function to immediately return our local 'mock_consensus'. */ +static networkstatus_t * +mock_networkstatus_get_live_consensus(time_t now) +{ + (void) now; + return &mock_consensus; +} + +static void +test_get_state_valid_until_time(void *arg) +{ + time_t current_time; + time_t valid_until_time; + char tbuf[ISO_TIME_LEN + 1]; + int retval; + + (void) arg; + + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 01:00:00 UTC", + &mock_consensus.fresh_until); + tt_int_op(retval, OP_EQ, 0); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", + &mock_consensus.valid_after); + tt_int_op(retval, OP_EQ, 0); + + { + /* Get the valid until time if called at 00:00:01 */ + retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC", + ¤t_time); + tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); + valid_until_time = get_state_valid_until_time(current_time); + + /* Compare it with the correct result */ + format_iso_time(tbuf, valid_until_time); + tt_str_op("2015-04-21 00:00:00", OP_EQ, tbuf); + } + + { + retval = parse_rfc1123_time("Mon, 20 Apr 2015 19:22:00 UTC", + ¤t_time); + tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); + valid_until_time = get_state_valid_until_time(current_time); + + format_iso_time(tbuf, valid_until_time); + tt_str_op("2015-04-21 00:00:00", OP_EQ, tbuf); + } + + { + retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:59:00 UTC", + ¤t_time); + tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); + valid_until_time = get_state_valid_until_time(current_time); + + format_iso_time(tbuf, valid_until_time); + tt_str_op("2015-04-21 00:00:00", OP_EQ, tbuf); + } + + { + retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", + ¤t_time); + tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); + valid_until_time = get_state_valid_until_time(current_time); + + format_iso_time(tbuf, valid_until_time); + tt_str_op("2015-04-21 00:00:00", OP_EQ, tbuf); + } + + done: + UNMOCK(networkstatus_get_live_consensus); +} + +/** Test the function that calculates the start time of the current SRV + * protocol run. */ +static void +test_get_start_time_of_current_run(void *arg) +{ + int retval; + char tbuf[ISO_TIME_LEN + 1]; + time_t current_time, run_start_time; + + (void) arg; + + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 01:00:00 UTC", + &mock_consensus.fresh_until); + tt_int_op(retval, OP_EQ, 0); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", + &mock_consensus.valid_after); + tt_int_op(retval, OP_EQ, 0); + + { + /* Get start time if called at 00:00:01 */ + retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC", + ¤t_time); + tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); + run_start_time = + sr_state_get_start_time_of_current_protocol_run(current_time); + + /* Compare it with the correct result */ + format_iso_time(tbuf, run_start_time); + tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf); + } + + { + retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:59:59 UTC", + ¤t_time); + tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); + run_start_time = + sr_state_get_start_time_of_current_protocol_run(current_time); + + /* Compare it with the correct result */ + format_iso_time(tbuf, run_start_time); + tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf); + } + + { + retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", + ¤t_time); + tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); + run_start_time = + sr_state_get_start_time_of_current_protocol_run(current_time); + + /* Compare it with the correct result */ + format_iso_time(tbuf, run_start_time); + tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf); + } + + /* Next test is testing it without a consensus to use the testing voting + * interval . */ + UNMOCK(networkstatus_get_live_consensus); + + /* Now let's alter the voting schedule and check the correctness of the + * function. Voting interval of 10 seconds, means that an SRV protocol run + * takes 10 seconds * 24 rounds = 4 mins */ + { + or_options_t *options = get_options_mutable(); + options->V3AuthVotingInterval = 10; + options->TestingV3AuthInitialVotingInterval = 10; + retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:15:32 UTC", + ¤t_time); + tt_int_op(retval, OP_EQ, 0); + dirvote_recalculate_timing(get_options(), current_time); + run_start_time = + sr_state_get_start_time_of_current_protocol_run(current_time); + + /* Compare it with the correct result */ + format_iso_time(tbuf, run_start_time); + tt_str_op("2015-04-20 00:12:00", OP_EQ, tbuf); + } + + done: + ; +} + +/** Do some rudimentary consistency checks between the functions that + * understand the shared random protocol schedule */ +static void +test_get_start_time_functions(void *arg) +{ + (void) arg; + int retval; + + MOCK(networkstatus_get_live_consensus, + mock_networkstatus_get_live_consensus); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 01:00:00 UTC", + &mock_consensus.fresh_until); + tt_int_op(retval, OP_EQ, 0); + + retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", + &mock_consensus.valid_after); + tt_int_op(retval, OP_EQ, 0); + time_t now = mock_consensus.valid_after; + + dirvote_recalculate_timing(get_options(), now); + time_t start_time_of_protocol_run = + sr_state_get_start_time_of_current_protocol_run(now); + tt_assert(start_time_of_protocol_run); + + /* Check that the round start time of the beginning of the run, is itself */ + tt_int_op(get_start_time_of_current_round(), OP_EQ, + start_time_of_protocol_run); + + done: + UNMOCK(networkstatus_get_live_consensus); +} + +static void +test_get_sr_protocol_duration(void *arg) +{ + (void) arg; + + /* Check that by default an SR phase is 12 hours */ + tt_int_op(sr_state_get_phase_duration(), OP_EQ, 12*60*60); + tt_int_op(sr_state_get_protocol_run_duration(), OP_EQ, 24*60*60); + + /* Now alter the voting interval and check that the SR phase is 2 mins long + * if voting happens every 10 seconds (10*12 seconds = 2 mins) */ + or_options_t *options = get_options_mutable(); + options->V3AuthVotingInterval = 10; + tt_int_op(sr_state_get_phase_duration(), OP_EQ, 2*60); + tt_int_op(sr_state_get_protocol_run_duration(), OP_EQ, 4*60); + + done: ; +} + +/* In this test we are going to generate a sr_commit_t object and validate + * it. We first generate our values, and then we parse them as if they were + * received from the network. After we parse both the commit and the reveal, + * we verify that they indeed match. */ +static void +test_sr_commit(void *arg) +{ + authority_cert_t *auth_cert = NULL; + time_t now = time(NULL); + sr_commit_t *our_commit = NULL; + smartlist_t *args = smartlist_new(); + sr_commit_t *parsed_commit = NULL; + + (void) arg; + + { /* Setup a minimal dirauth environment for this test */ + or_options_t *options = get_options_mutable(); + + auth_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); + tt_assert(auth_cert); + + options->AuthoritativeDir = 1; + tt_int_op(load_ed_keys(options, time(NULL)), OP_GE, 0); + } + + /* Generate our commit object and validate it has the appropriate field + * that we can then use to build a representation that we'll find in a + * vote coming from the network. */ + { + sr_commit_t test_commit; + our_commit = sr_generate_our_commit(now, auth_cert); + tt_assert(our_commit); + /* Default and only supported algorithm for now. */ + tt_assert(our_commit->alg == DIGEST_SHA3_256); + /* We should have a reveal value. */ + tt_assert(commit_has_reveal_value(our_commit)); + /* We should have a random value. */ + tt_assert(!tor_mem_is_zero((char *) our_commit->random_number, + sizeof(our_commit->random_number))); + /* Commit and reveal timestamp should be the same. */ + tt_u64_op(our_commit->commit_ts, OP_EQ, our_commit->reveal_ts); + /* We should have a hashed reveal. */ + tt_assert(!tor_mem_is_zero(our_commit->hashed_reveal, + sizeof(our_commit->hashed_reveal))); + /* Do we have a valid encoded commit and reveal. Note the following only + * tests if the generated values are correct. Their could be a bug in + * the decode function but we test them seperately. */ + tt_int_op(0, OP_EQ, reveal_decode(our_commit->encoded_reveal, + &test_commit)); + tt_int_op(0, OP_EQ, commit_decode(our_commit->encoded_commit, + &test_commit)); + tt_int_op(0, OP_EQ, verify_commit_and_reveal(our_commit)); + } + + /* Let's make sure our verify commit and reveal function works. We'll + * make it fail a bit with known failure case. */ + { + /* Copy our commit so we don't alter it for the rest of testing. */ + sr_commit_t test_commit; + memcpy(&test_commit, our_commit, sizeof(test_commit)); + + /* Timestamp MUST match. */ + test_commit.commit_ts = test_commit.reveal_ts - 42; + setup_full_capture_of_logs(LOG_WARN); + tt_int_op(-1, OP_EQ, verify_commit_and_reveal(&test_commit)); + expect_log_msg_containing("doesn't match reveal timestamp"); + teardown_capture_of_logs(); + memcpy(&test_commit, our_commit, sizeof(test_commit)); + tt_int_op(0, OP_EQ, verify_commit_and_reveal(&test_commit)); + + /* Hashed reveal must match the H(encoded_reveal). */ + memset(test_commit.hashed_reveal, 'X', + sizeof(test_commit.hashed_reveal)); + setup_full_capture_of_logs(LOG_WARN); + tt_int_op(-1, OP_EQ, verify_commit_and_reveal(&test_commit)); + expect_single_log_msg_containing("doesn't match the commit value"); + teardown_capture_of_logs(); + memcpy(&test_commit, our_commit, sizeof(test_commit)); + tt_int_op(0, OP_EQ, verify_commit_and_reveal(&test_commit)); + } + + /* We'll build a list of values from our commit that our parsing function + * takes from a vote line and see if we can parse it correctly. */ + { + smartlist_add_strdup(args, "1"); + smartlist_add_strdup(args, + crypto_digest_algorithm_get_name(our_commit->alg)); + smartlist_add_strdup(args, sr_commit_get_rsa_fpr(our_commit)); + smartlist_add_strdup(args, our_commit->encoded_commit); + smartlist_add_strdup(args, our_commit->encoded_reveal); + parsed_commit = sr_parse_commit(args); + tt_assert(parsed_commit); + /* That parsed commit should be _EXACTLY_ like our original commit (we + * have to explicitly set the valid flag though). */ + parsed_commit->valid = 1; + tt_mem_op(parsed_commit, OP_EQ, our_commit, sizeof(*parsed_commit)); + /* Cleanup */ + } + + done: + teardown_capture_of_logs(); + SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); + smartlist_free(args); + sr_commit_free(our_commit); + sr_commit_free(parsed_commit); + authority_cert_free(auth_cert); +} + +/* Test the encoding and decoding function for commit and reveal values. */ +static void +test_encoding(void *arg) +{ + (void) arg; + int ret; + /* Random number is 32 bytes. */ + char raw_rand[32]; + time_t ts = 1454333590; + char hashed_rand[DIGEST256_LEN], hashed_reveal[DIGEST256_LEN]; + sr_commit_t parsed_commit; + + /* Those values were generated by sr_commit_calc_ref.py where the random + * value is 32 'A' and timestamp is the one in ts. */ + static const char *encoded_reveal = + "AAAAAFavXpZJxbwTupvaJCTeIUCQmOPxAMblc7ChL5H2nZKuGchdaA=="; + static const char *encoded_commit = + "AAAAAFavXpbkBMzMQG7aNoaGLFNpm2Wkk1ozXhuWWqL//GynltxVAg=="; + + /* Set up our raw random bytes array. */ + memset(raw_rand, 'A', sizeof(raw_rand)); + /* Hash random number because we don't expose bytes of the RNG. */ + ret = crypto_digest256(hashed_rand, raw_rand, + sizeof(raw_rand), SR_DIGEST_ALG); + tt_int_op(0, OP_EQ, ret); + /* Hash reveal value. */ + tt_int_op(SR_REVEAL_BASE64_LEN, OP_EQ, strlen(encoded_reveal)); + ret = crypto_digest256(hashed_reveal, encoded_reveal, + strlen(encoded_reveal), SR_DIGEST_ALG); + tt_int_op(0, OP_EQ, ret); + tt_int_op(SR_COMMIT_BASE64_LEN, OP_EQ, strlen(encoded_commit)); + + /* Test our commit/reveal decode functions. */ + { + /* Test the reveal encoded value. */ + tt_int_op(0, OP_EQ, reveal_decode(encoded_reveal, &parsed_commit)); + tt_u64_op(ts, OP_EQ, parsed_commit.reveal_ts); + tt_mem_op(hashed_rand, OP_EQ, parsed_commit.random_number, + sizeof(hashed_rand)); + + /* Test the commit encoded value. */ + memset(&parsed_commit, 0, sizeof(parsed_commit)); + tt_int_op(0, OP_EQ, commit_decode(encoded_commit, &parsed_commit)); + tt_u64_op(ts, OP_EQ, parsed_commit.commit_ts); + tt_mem_op(encoded_commit, OP_EQ, parsed_commit.encoded_commit, + sizeof(parsed_commit.encoded_commit)); + tt_mem_op(hashed_reveal, OP_EQ, parsed_commit.hashed_reveal, + sizeof(hashed_reveal)); + } + + /* Test our commit/reveal encode functions. */ + { + /* Test the reveal encode. */ + char encoded[SR_REVEAL_BASE64_LEN + 1]; + parsed_commit.reveal_ts = ts; + memcpy(parsed_commit.random_number, hashed_rand, + sizeof(parsed_commit.random_number)); + ret = reveal_encode(&parsed_commit, encoded, sizeof(encoded)); + tt_int_op(SR_REVEAL_BASE64_LEN, OP_EQ, ret); + tt_mem_op(encoded_reveal, OP_EQ, encoded, strlen(encoded_reveal)); + } + + { + /* Test the commit encode. */ + char encoded[SR_COMMIT_BASE64_LEN + 1]; + parsed_commit.commit_ts = ts; + memcpy(parsed_commit.hashed_reveal, hashed_reveal, + sizeof(parsed_commit.hashed_reveal)); + ret = commit_encode(&parsed_commit, encoded, sizeof(encoded)); + tt_int_op(SR_COMMIT_BASE64_LEN, OP_EQ, ret); + tt_mem_op(encoded_commit, OP_EQ, encoded, strlen(encoded_commit)); + } + + done: + ; +} + +/** Setup some SRVs in our SR state. If also_current is set, then set + * both current and previous SRVs. + * Helper of test_vote() and test_sr_compute_srv(). */ +static void +test_sr_setup_srv(int also_current) +{ + sr_srv_t *srv = tor_malloc_zero(sizeof(sr_srv_t)); + srv->num_reveals = 42; + memcpy(srv->value, + "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ", + sizeof(srv->value)); + + sr_state_set_previous_srv(srv); + + if (also_current) { + srv = tor_malloc_zero(sizeof(sr_srv_t)); + srv->num_reveals = 128; + memcpy(srv->value, + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + sizeof(srv->value)); + + sr_state_set_current_srv(srv); + } +} + +/* Test anything that has to do with SR protocol and vote. */ +static void +test_vote(void *arg) +{ + int ret; + time_t now = time(NULL); + sr_commit_t *our_commit = NULL; + + (void) arg; + + MOCK(trusteddirserver_get_by_v3_auth_digest, + trusteddirserver_get_by_v3_auth_digest_m); + + { /* Setup a minimal dirauth environment for this test */ + init_authority_state(); + /* Set ourself in reveal phase so we can parse the reveal value in the + * vote as well. */ + set_sr_phase(SR_PHASE_REVEAL); + } + + /* Generate our commit object and validate it has the appropriate field + * that we can then use to build a representation that we'll find in a + * vote coming from the network. */ + { + sr_commit_t *saved_commit; + our_commit = sr_generate_our_commit(now, mock_cert); + tt_assert(our_commit); + sr_state_add_commit(our_commit); + /* Make sure it's there. */ + saved_commit = sr_state_get_commit(our_commit->rsa_identity); + tt_assert(saved_commit); + } + + /* Also setup the SRVs */ + test_sr_setup_srv(1); + + { /* Now test the vote generation */ + smartlist_t *chunks = smartlist_new(); + smartlist_t *tokens = smartlist_new(); + /* Get our vote line and validate it. */ + char *lines = sr_get_string_for_vote(); + tt_assert(lines); + /* Split the lines. We expect 2 here. */ + ret = smartlist_split_string(chunks, lines, "\n", SPLIT_IGNORE_BLANK, 0); + tt_int_op(ret, OP_EQ, 4); + tt_str_op(smartlist_get(chunks, 0), OP_EQ, "shared-rand-participate"); + /* Get our commitment line and will validate it agains our commit. The + * format is as follow: + * "shared-rand-commitment" SP version SP algname SP identity + * SP COMMIT [SP REVEAL] NL + */ + char *commit_line = smartlist_get(chunks, 1); + tt_assert(commit_line); + ret = smartlist_split_string(tokens, commit_line, " ", 0, 0); + tt_int_op(ret, OP_EQ, 6); + tt_str_op(smartlist_get(tokens, 0), OP_EQ, "shared-rand-commit"); + tt_str_op(smartlist_get(tokens, 1), OP_EQ, "1"); + tt_str_op(smartlist_get(tokens, 2), OP_EQ, + crypto_digest_algorithm_get_name(DIGEST_SHA3_256)); + char digest[DIGEST_LEN]; + base16_decode(digest, sizeof(digest), smartlist_get(tokens, 3), + HEX_DIGEST_LEN); + tt_mem_op(digest, OP_EQ, our_commit->rsa_identity, sizeof(digest)); + tt_str_op(smartlist_get(tokens, 4), OP_EQ, our_commit->encoded_commit); + tt_str_op(smartlist_get(tokens, 5), OP_EQ, our_commit->encoded_reveal) +; + /* Finally, does this vote line creates a valid commit object? */ + smartlist_t *args = smartlist_new(); + smartlist_add(args, smartlist_get(tokens, 1)); + smartlist_add(args, smartlist_get(tokens, 2)); + smartlist_add(args, smartlist_get(tokens, 3)); + smartlist_add(args, smartlist_get(tokens, 4)); + smartlist_add(args, smartlist_get(tokens, 5)); + sr_commit_t *parsed_commit = sr_parse_commit(args); + tt_assert(parsed_commit); + /* Set valid flag explicitly here to compare since it's not set by + * simply parsing the commit. */ + parsed_commit->valid = 1; + tt_mem_op(parsed_commit, OP_EQ, our_commit, sizeof(*our_commit)); + + /* minor cleanup */ + SMARTLIST_FOREACH(tokens, char *, s, tor_free(s)); + smartlist_clear(tokens); + + /* Now test the previous SRV */ + char *prev_srv_line = smartlist_get(chunks, 2); + tt_assert(prev_srv_line); + ret = smartlist_split_string(tokens, prev_srv_line, " ", 0, 0); + tt_int_op(ret, OP_EQ, 3); + tt_str_op(smartlist_get(tokens, 0), OP_EQ, "shared-rand-previous-value"); + tt_str_op(smartlist_get(tokens, 1), OP_EQ, "42"); + tt_str_op(smartlist_get(tokens, 2), OP_EQ, + "WlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlo="); + + /* minor cleanup */ + SMARTLIST_FOREACH(tokens, char *, s, tor_free(s)); + smartlist_clear(tokens); + + /* Now test the current SRV */ + char *current_srv_line = smartlist_get(chunks, 3); + tt_assert(current_srv_line); + ret = smartlist_split_string(tokens, current_srv_line, " ", 0, 0); + tt_int_op(ret, OP_EQ, 3); + tt_str_op(smartlist_get(tokens, 0), OP_EQ, "shared-rand-current-value"); + tt_str_op(smartlist_get(tokens, 1), OP_EQ, "128"); + tt_str_op(smartlist_get(tokens, 2), OP_EQ, + "Tk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4="); + + /* Clean up */ + sr_commit_free(parsed_commit); + SMARTLIST_FOREACH(chunks, char *, s, tor_free(s)); + smartlist_free(chunks); + SMARTLIST_FOREACH(tokens, char *, s, tor_free(s)); + smartlist_free(tokens); + smartlist_clear(args); + smartlist_free(args); + tor_free(lines); + } + + done: + sr_commit_free(our_commit); + UNMOCK(trusteddirserver_get_by_v3_auth_digest); +} + +static const char *sr_state_str = "Version 1\n" + "TorVersion 0.2.9.0-alpha-dev\n" + "ValidAfter 2037-04-19 07:16:00\n" + "ValidUntil 2037-04-20 07:16:00\n" + "Commit 1 sha3-256 FA3CEC2C99DC68D3166B9B6E4FA21A4026C2AB1C " + "7M8GdubCAAdh7WUG0DiwRyxTYRKji7HATa7LLJEZ/UAAAAAAVmfUSg== " + "AAAAAFZn1EojfIheIw42bjK3VqkpYyjsQFSbv/dxNna3Q8hUEPKpOw==\n" + "Commit 1 sha3-256 41E89EDFBFBA44983E21F18F2230A4ECB5BFB543 " + "17aUsYuMeRjd2N1r8yNyg7aHqRa6gf4z7QPoxxAZbp0AAAAAVmfUSg==\n" + "Commit 1 sha3-256 36637026573A04110CF3E6B1D201FB9A98B88734 " + "DDDYtripvdOU+XPEUm5xpU64d9IURSds1xSwQsgeB8oAAAAAVmfUSg==\n" + "SharedRandPreviousValue 4 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=\n" + "SharedRandCurrentValue 3 8dWeW12KEzTGEiLGgO1UVJ7Z91CekoRcxt6Q9KhnOFI=\n"; + +/** Create an SR disk state, parse it and validate that the parsing went + * well. Yes! */ +static void +test_state_load_from_disk(void *arg) +{ + int ret; + char *dir = tor_strdup(get_fname("test_sr_state")); + char *sr_state_path = tor_strdup(get_fname("test_sr_state/sr_state")); + sr_state_t *the_sr_state = NULL; + + (void) arg; + + MOCK(trusteddirserver_get_by_v3_auth_digest, + trusteddirserver_get_by_v3_auth_digest_m); + + /* First try with a nonexistent path. */ + ret = disk_state_load_from_disk_impl("NONEXISTENTNONEXISTENT"); + tt_int_op(ret, OP_EQ, -ENOENT); + + /* Now create a mock state directory and state file */ +#ifdef _WIN32 + ret = mkdir(dir); +#else + ret = mkdir(dir, 0700); +#endif + tt_int_op(ret, OP_EQ, 0); + ret = write_str_to_file(sr_state_path, sr_state_str, 0); + tt_int_op(ret, OP_EQ, 0); + + /* Try to load the directory itself. Should fail. */ + ret = disk_state_load_from_disk_impl(dir); + tt_int_op(ret, OP_LT, 0); + + /* State should be non-existent at this point. */ + the_sr_state = get_sr_state(); + tt_ptr_op(the_sr_state, OP_EQ, NULL); + + /* Now try to load the correct file! */ + ret = disk_state_load_from_disk_impl(sr_state_path); + tt_int_op(ret, OP_EQ, 0); + + /* Check the content of the state */ + /* XXX check more deeply!!! */ + the_sr_state = get_sr_state(); + tt_assert(the_sr_state); + tt_assert(the_sr_state->version == 1); + tt_assert(digestmap_size(the_sr_state->commits) == 3); + tt_assert(the_sr_state->current_srv); + tt_assert(the_sr_state->current_srv->num_reveals == 3); + tt_assert(the_sr_state->previous_srv); + + /* XXX Now also try loading corrupted state files and make sure parsing + fails */ + + done: + tor_free(dir); + tor_free(sr_state_path); + UNMOCK(trusteddirserver_get_by_v3_auth_digest); +} + +/** Generate three specially crafted commits (based on the test + * vector at sr_srv_calc_ref.py). Helper of test_sr_compute_srv(). */ +static void +test_sr_setup_commits(void) +{ + time_t now = time(NULL); + sr_commit_t *commit_a, *commit_b, *commit_c, *commit_d; + sr_commit_t *place_holder = tor_malloc_zero(sizeof(*place_holder)); + authority_cert_t *auth_cert = NULL; + + { /* Setup a minimal dirauth environment for this test */ + or_options_t *options = get_options_mutable(); + + auth_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); + tt_assert(auth_cert); + + options->AuthoritativeDir = 1; + tt_int_op(0, OP_EQ, load_ed_keys(options, now)); + } + + /* Generate three dummy commits according to sr_srv_calc_ref.py . Then + register them to the SR state. Also register a fourth commit 'd' with no + reveal info, to make sure that it will get ignored during SRV + calculation. */ + + { /* Commit from auth 'a' */ + commit_a = sr_generate_our_commit(now, auth_cert); + tt_assert(commit_a); + + /* Do some surgery on the commit */ + memset(commit_a->rsa_identity, 'A', sizeof(commit_a->rsa_identity)); + base16_encode(commit_a->rsa_identity_hex, + sizeof(commit_a->rsa_identity_hex), commit_a->rsa_identity, + sizeof(commit_a->rsa_identity)); + strlcpy(commit_a->encoded_reveal, + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + sizeof(commit_a->encoded_reveal)); + memcpy(commit_a->hashed_reveal, + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + sizeof(commit_a->hashed_reveal)); + } + + { /* Commit from auth 'b' */ + commit_b = sr_generate_our_commit(now, auth_cert); + tt_assert(commit_b); + + /* Do some surgery on the commit */ + memset(commit_b->rsa_identity, 'B', sizeof(commit_b->rsa_identity)); + base16_encode(commit_b->rsa_identity_hex, + sizeof(commit_b->rsa_identity_hex), commit_b->rsa_identity, + sizeof(commit_b->rsa_identity)); + strlcpy(commit_b->encoded_reveal, + "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + sizeof(commit_b->encoded_reveal)); + memcpy(commit_b->hashed_reveal, + "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + sizeof(commit_b->hashed_reveal)); + } + + { /* Commit from auth 'c' */ + commit_c = sr_generate_our_commit(now, auth_cert); + tt_assert(commit_c); + + /* Do some surgery on the commit */ + memset(commit_c->rsa_identity, 'C', sizeof(commit_c->rsa_identity)); + base16_encode(commit_c->rsa_identity_hex, + sizeof(commit_c->rsa_identity_hex), commit_c->rsa_identity, + sizeof(commit_c->rsa_identity)); + strlcpy(commit_c->encoded_reveal, + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", + sizeof(commit_c->encoded_reveal)); + memcpy(commit_c->hashed_reveal, + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", + sizeof(commit_c->hashed_reveal)); + } + + { /* Commit from auth 'd' */ + commit_d = sr_generate_our_commit(now, auth_cert); + tt_assert(commit_d); + + /* Do some surgery on the commit */ + memset(commit_d->rsa_identity, 'D', sizeof(commit_d->rsa_identity)); + base16_encode(commit_d->rsa_identity_hex, + sizeof(commit_d->rsa_identity_hex), commit_d->rsa_identity, + sizeof(commit_d->rsa_identity)); + strlcpy(commit_d->encoded_reveal, + "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + sizeof(commit_d->encoded_reveal)); + memcpy(commit_d->hashed_reveal, + "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + sizeof(commit_d->hashed_reveal)); + /* Clean up its reveal info */ + memcpy(place_holder, commit_d, sizeof(*place_holder)); + memset(commit_d->encoded_reveal, 0, sizeof(commit_d->encoded_reveal)); + tt_assert(!commit_has_reveal_value(commit_d)); + } + + /* Register commits to state (during commit phase) */ + set_sr_phase(SR_PHASE_COMMIT); + save_commit_to_state(commit_a); + save_commit_to_state(commit_b); + save_commit_to_state(commit_c); + save_commit_to_state(commit_d); + tt_int_op(digestmap_size(get_sr_state()->commits), OP_EQ, 4); + + /* Now during REVEAL phase save commit D by restoring its reveal. */ + set_sr_phase(SR_PHASE_REVEAL); + save_commit_to_state(place_holder); + tt_str_op(commit_d->encoded_reveal, OP_EQ, + "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"); + /* Go back to an empty encoded reveal value. */ + memset(commit_d->encoded_reveal, 0, sizeof(commit_d->encoded_reveal)); + memset(commit_d->random_number, 0, sizeof(commit_d->random_number)); + tt_assert(!commit_has_reveal_value(commit_d)); + + done: + authority_cert_free(auth_cert); +} + +/** Verify that the SRV generation procedure is proper by testing it against + * the test vector from ./sr_srv_calc_ref.py. */ +static void +test_sr_compute_srv(void *arg) +{ + (void) arg; + const sr_srv_t *current_srv = NULL; + +#define SRV_TEST_VECTOR \ + "2A9B1D6237DAB312A40F575DA85C147663E7ED3F80E9555395F15B515C74253D" + + MOCK(trusteddirserver_get_by_v3_auth_digest, + trusteddirserver_get_by_v3_auth_digest_m); + + init_authority_state(); + + /* Setup the commits for this unittest */ + test_sr_setup_commits(); + test_sr_setup_srv(0); + + /* Now switch to reveal phase */ + set_sr_phase(SR_PHASE_REVEAL); + + /* Compute the SRV */ + sr_compute_srv(); + + /* Check the result against the test vector */ + current_srv = sr_state_get_current_srv(); + tt_assert(current_srv); + tt_u64_op(current_srv->num_reveals, OP_EQ, 3); + tt_str_op(hex_str((char*)current_srv->value, 32), + OP_EQ, + SRV_TEST_VECTOR); + + done: + UNMOCK(trusteddirserver_get_by_v3_auth_digest); +} + +/** Return a minimal vote document with a current SRV value set to + * srv. */ +static networkstatus_t * +get_test_vote_with_curr_srv(const char *srv) +{ + networkstatus_t *vote = tor_malloc_zero(sizeof(networkstatus_t)); + + vote->type = NS_TYPE_VOTE; + vote->sr_info.participate = 1; + vote->sr_info.current_srv = tor_malloc_zero(sizeof(sr_srv_t)); + vote->sr_info.current_srv->num_reveals = 42; + memcpy(vote->sr_info.current_srv->value, + srv, + sizeof(vote->sr_info.current_srv->value)); + + return vote; +} + +/* Test the function that picks the right SRV given a bunch of votes. Make sure + * that the function returns an SRV iff the majority/agreement requirements are + * met. */ +static void +test_sr_get_majority_srv_from_votes(void *arg) +{ + sr_srv_t *chosen_srv; + smartlist_t *votes = smartlist_new(); + +#define SRV_1 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +#define SRV_2 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" + + (void) arg; + + init_authority_state(); + /* Make sure our SRV is fresh so we can consider the super majority with + * the consensus params of number of agreements needed. */ + sr_state_set_fresh_srv(); + + /* The test relies on the dirauth list being initialized. */ + clear_dir_servers(); + add_default_trusted_dir_authorities(V3_DIRINFO); + + { /* Prepare voting environment with just a single vote. */ + networkstatus_t *vote = get_test_vote_with_curr_srv(SRV_1); + smartlist_add(votes, vote); + } + + /* Since it's only one vote with an SRV, it should not achieve majority and + hence no SRV will be returned. */ + chosen_srv = get_majority_srv_from_votes(votes, 1); + tt_ptr_op(chosen_srv, OP_EQ, NULL); + + { /* Now put in 8 more votes. Let SRV_1 have majority. */ + int i; + /* Now 7 votes believe in SRV_1 */ + for (i = 0; i < 3; i++) { + networkstatus_t *vote = get_test_vote_with_curr_srv(SRV_1); + smartlist_add(votes, vote); + } + /* and 2 votes believe in SRV_2 */ + for (i = 0; i < 2; i++) { + networkstatus_t *vote = get_test_vote_with_curr_srv(SRV_2); + smartlist_add(votes, vote); + } + for (i = 0; i < 3; i++) { + networkstatus_t *vote = get_test_vote_with_curr_srv(SRV_1); + smartlist_add(votes, vote); + } + + tt_int_op(smartlist_len(votes), OP_EQ, 9); + } + + /* Now we achieve majority for SRV_1, but not the AuthDirNumSRVAgreements + requirement. So still not picking an SRV. */ + set_num_srv_agreements(8); + chosen_srv = get_majority_srv_from_votes(votes, 1); + tt_ptr_op(chosen_srv, OP_EQ, NULL); + + /* We will now lower the AuthDirNumSRVAgreements requirement by tweaking the + * consensus parameter and we will try again. This time it should work. */ + set_num_srv_agreements(7); + chosen_srv = get_majority_srv_from_votes(votes, 1); + tt_assert(chosen_srv); + tt_u64_op(chosen_srv->num_reveals, OP_EQ, 42); + tt_mem_op(chosen_srv->value, OP_EQ, SRV_1, sizeof(chosen_srv->value)); + + done: + SMARTLIST_FOREACH(votes, networkstatus_t *, vote, + networkstatus_vote_free(vote)); + smartlist_free(votes); +} + +static void +test_utils(void *arg) +{ + (void) arg; + + /* Testing srv_dup(). */ + { + sr_srv_t *srv = NULL, *dup_srv = NULL; + const char *srv_value = + "1BDB7C3E973936E4D13A49F37C859B3DC69C429334CF9412E3FEF6399C52D47A"; + srv = tor_malloc_zero(sizeof(*srv)); + srv->num_reveals = 42; + memcpy(srv->value, srv_value, sizeof(srv->value)); + dup_srv = srv_dup(srv); + tt_assert(dup_srv); + tt_u64_op(dup_srv->num_reveals, OP_EQ, srv->num_reveals); + tt_mem_op(dup_srv->value, OP_EQ, srv->value, sizeof(srv->value)); + tor_free(srv); + tor_free(dup_srv); + } + + /* Testing commitments_are_the_same(). Currently, the check is to test the + * value of the encoded commit so let's make sure that actually works. */ + { + /* Payload of 57 bytes that is the length of sr_commit_t->encoded_commit. + * 56 bytes of payload and a NUL terminated byte at the end ('\x00') + * which comes down to SR_COMMIT_BASE64_LEN + 1. */ + const char *payload = + "\x5d\xb9\x60\xb6\xcc\x51\x68\x52\x31\xd9\x88\x88\x71\x71\xe0\x30" + "\x59\x55\x7f\xcd\x61\xc0\x4b\x05\xb8\xcd\xc1\x48\xe9\xcd\x16\x1f" + "\x70\x15\x0c\xfc\xd3\x1a\x75\xd0\x93\x6c\xc4\xe0\x5c\xbe\xe2\x18" + "\xc7\xaf\x72\xb6\x7c\x9b\x52\x00"; + sr_commit_t commit1, commit2; + memcpy(commit1.encoded_commit, payload, sizeof(commit1.encoded_commit)); + memcpy(commit2.encoded_commit, payload, sizeof(commit2.encoded_commit)); + tt_int_op(commitments_are_the_same(&commit1, &commit2), OP_EQ, 1); + /* Let's corrupt one of them. */ + memset(commit1.encoded_commit, 'A', sizeof(commit1.encoded_commit)); + tt_int_op(commitments_are_the_same(&commit1, &commit2), OP_EQ, 0); + } + + /* Testing commit_is_authoritative(). */ + { + crypto_pk_t *k = crypto_pk_new(); + char digest[DIGEST_LEN]; + sr_commit_t commit; + + tt_assert(!crypto_pk_generate_key(k)); + + tt_int_op(0, OP_EQ, crypto_pk_get_digest(k, digest)); + memcpy(commit.rsa_identity, digest, sizeof(commit.rsa_identity)); + tt_int_op(commit_is_authoritative(&commit, digest), OP_EQ, 1); + /* Change the pubkey. */ + memset(commit.rsa_identity, 0, sizeof(commit.rsa_identity)); + tt_int_op(commit_is_authoritative(&commit, digest), OP_EQ, 0); + crypto_pk_free(k); + } + + /* Testing get_phase_str(). */ + { + tt_str_op(get_phase_str(SR_PHASE_REVEAL), OP_EQ, "reveal"); + tt_str_op(get_phase_str(SR_PHASE_COMMIT), OP_EQ, "commit"); + } + + /* Testing phase transition */ + { + init_authority_state(); + set_sr_phase(SR_PHASE_COMMIT); + tt_int_op(is_phase_transition(SR_PHASE_REVEAL), OP_EQ, 1); + tt_int_op(is_phase_transition(SR_PHASE_COMMIT), OP_EQ, 0); + set_sr_phase(SR_PHASE_REVEAL); + tt_int_op(is_phase_transition(SR_PHASE_REVEAL), OP_EQ, 0); + tt_int_op(is_phase_transition(SR_PHASE_COMMIT), OP_EQ, 1); + /* Junk. */ + tt_int_op(is_phase_transition(42), OP_EQ, 1); + } + + done: + return; +} + +static void +test_state_transition(void *arg) +{ + sr_state_t *state = NULL; + time_t now = time(NULL); + + (void) arg; + + { /* Setup a minimal dirauth environment for this test */ + init_authority_state(); + state = get_sr_state(); + tt_assert(state); + } + + /* Test our state reset for a new protocol run. */ + { + /* Add a commit to the state so we can test if the reset cleans the + * commits. Also, change all params that we expect to be updated. */ + sr_commit_t *commit = sr_generate_our_commit(now, mock_cert); + tt_assert(commit); + sr_state_add_commit(commit); + tt_int_op(digestmap_size(state->commits), OP_EQ, 1); + /* Let's test our delete feature. */ + sr_state_delete_commits(); + tt_int_op(digestmap_size(state->commits), OP_EQ, 0); + /* Add it back so we can continue the rest of the test because after + * deletiong our commit will be freed so generate a new one. */ + commit = sr_generate_our_commit(now, mock_cert); + tt_assert(commit); + sr_state_add_commit(commit); + tt_int_op(digestmap_size(state->commits), OP_EQ, 1); + state->n_reveal_rounds = 42; + state->n_commit_rounds = 43; + state->n_protocol_runs = 44; + reset_state_for_new_protocol_run(now); + tt_int_op(state->n_reveal_rounds, OP_EQ, 0); + tt_int_op(state->n_commit_rounds, OP_EQ, 0); + tt_u64_op(state->n_protocol_runs, OP_EQ, 45); + tt_int_op(digestmap_size(state->commits), OP_EQ, 0); + } + + /* Test SRV rotation in our state. */ + { + const sr_srv_t *cur, *prev; + test_sr_setup_srv(1); + cur = sr_state_get_current_srv(); + tt_assert(cur); + /* After, current srv should be the previous and then set to NULL. */ + state_rotate_srv(); + prev = sr_state_get_previous_srv(); + tt_assert(prev == cur); + tt_ptr_op(sr_state_get_current_srv(), OP_EQ, NULL); + sr_state_clean_srvs(); + } + + /* New protocol run. */ + { + const sr_srv_t *cur; + /* Setup some new SRVs so we can confirm that a new protocol run + * actually makes them rotate and compute new ones. */ + test_sr_setup_srv(1); + cur = sr_state_get_current_srv(); + tt_assert(cur); + set_sr_phase(SR_PHASE_REVEAL); + MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); + new_protocol_run(now); + UNMOCK(get_my_v3_authority_cert); + /* Rotation happened. */ + tt_assert(sr_state_get_previous_srv() == cur); + /* We are going into COMMIT phase so we had to rotate our SRVs. Usually + * our current SRV would be NULL but a new protocol run should make us + * compute a new SRV. */ + tt_assert(sr_state_get_current_srv()); + /* Also, make sure we did change the current. */ + tt_assert(sr_state_get_current_srv() != cur); + /* We should have our commitment alone. */ + tt_int_op(digestmap_size(state->commits), OP_EQ, 1); + tt_int_op(state->n_reveal_rounds, OP_EQ, 0); + tt_int_op(state->n_commit_rounds, OP_EQ, 0); + /* 46 here since we were at 45 just before. */ + tt_u64_op(state->n_protocol_runs, OP_EQ, 46); + } + + /* Cleanup of SRVs. */ + { + sr_state_clean_srvs(); + tt_ptr_op(sr_state_get_current_srv(), OP_EQ, NULL); + tt_ptr_op(sr_state_get_previous_srv(), OP_EQ, NULL); + } + + done: + return; +} + +static void +test_keep_commit(void *arg) +{ + char fp[FINGERPRINT_LEN + 1]; + sr_commit_t *commit = NULL, *dup_commit = NULL; + sr_state_t *state; + time_t now = time(NULL); + crypto_pk_t *k = NULL; + + (void) arg; + + MOCK(trusteddirserver_get_by_v3_auth_digest, + trusteddirserver_get_by_v3_auth_digest_m); + + { + k = pk_generate(1); + /* Setup a minimal dirauth environment for this test */ + /* Have a key that is not the one from our commit. */ + init_authority_state(); + state = get_sr_state(); + } + + crypto_rand((char*)fp, sizeof(fp)); + + /* Test this very important function that tells us if we should keep a + * commit or not in our state. Most of it depends on the phase and what's + * in the commit so we'll change the commit as we go. */ + commit = sr_generate_our_commit(now, mock_cert); + tt_assert(commit); + /* Set us in COMMIT phase for starter. */ + set_sr_phase(SR_PHASE_COMMIT); + /* We should never keep a commit from a non authoritative authority. */ + tt_int_op(should_keep_commit(commit, fp, SR_PHASE_COMMIT), OP_EQ, 0); + /* This should NOT be kept because it has a reveal value in it. */ + tt_assert(commit_has_reveal_value(commit)); + tt_int_op(should_keep_commit(commit, commit->rsa_identity, + SR_PHASE_COMMIT), OP_EQ, 0); + /* Add it to the state which should return to not keep it. */ + sr_state_add_commit(commit); + tt_int_op(should_keep_commit(commit, commit->rsa_identity, + SR_PHASE_COMMIT), OP_EQ, 0); + /* Remove it from state so we can continue our testing. */ + digestmap_remove(state->commits, commit->rsa_identity); + /* Let's remove our reveal value which should make it OK to keep it. */ + memset(commit->encoded_reveal, 0, sizeof(commit->encoded_reveal)); + tt_int_op(should_keep_commit(commit, commit->rsa_identity, + SR_PHASE_COMMIT), OP_EQ, 1); + + /* Let's reset our commit and go into REVEAL phase. */ + sr_commit_free(commit); + commit = sr_generate_our_commit(now, mock_cert); + tt_assert(commit); + /* Dup the commit so we have one with and one without a reveal value. */ + dup_commit = tor_malloc_zero(sizeof(*dup_commit)); + memcpy(dup_commit, commit, sizeof(*dup_commit)); + memset(dup_commit->encoded_reveal, 0, sizeof(dup_commit->encoded_reveal)); + set_sr_phase(SR_PHASE_REVEAL); + /* We should never keep a commit from a non authoritative authority. */ + tt_int_op(should_keep_commit(commit, fp, SR_PHASE_REVEAL), OP_EQ, 0); + /* We shouldn't accept a commit that is not in our state. */ + tt_int_op(should_keep_commit(commit, commit->rsa_identity, + SR_PHASE_REVEAL), OP_EQ, 0); + /* Important to add the commit _without_ the reveal here. */ + sr_state_add_commit(dup_commit); + tt_int_op(digestmap_size(state->commits), OP_EQ, 1); + /* Our commit should be valid that is authoritative, contains a reveal, be + * in the state and commitment and reveal values match. */ + tt_int_op(should_keep_commit(commit, commit->rsa_identity, + SR_PHASE_REVEAL), OP_EQ, 1); + /* The commit shouldn't be kept if it's not verified that is no matchin + * hashed reveal. */ + { + /* Let's save the hash reveal so we can restore it. */ + sr_commit_t place_holder; + memcpy(place_holder.hashed_reveal, commit->hashed_reveal, + sizeof(place_holder.hashed_reveal)); + memset(commit->hashed_reveal, 0, sizeof(commit->hashed_reveal)); + setup_full_capture_of_logs(LOG_WARN); + tt_int_op(should_keep_commit(commit, commit->rsa_identity, + SR_PHASE_REVEAL), OP_EQ, 0); + expect_log_msg_containing("doesn't match the commit value."); + expect_log_msg_containing("has an invalid reveal value."); + assert_log_predicate(mock_saved_log_n_entries() == 2, + "expected 2 log entries"); + teardown_capture_of_logs(); + memcpy(commit->hashed_reveal, place_holder.hashed_reveal, + sizeof(commit->hashed_reveal)); + } + /* We shouldn't keep a commit that has no reveal. */ + tt_int_op(should_keep_commit(dup_commit, dup_commit->rsa_identity, + SR_PHASE_REVEAL), OP_EQ, 0); + /* We must not keep a commit that is not the same from the commit phase. */ + memset(commit->encoded_commit, 0, sizeof(commit->encoded_commit)); + tt_int_op(should_keep_commit(commit, commit->rsa_identity, + SR_PHASE_REVEAL), OP_EQ, 0); + + done: + teardown_capture_of_logs(); + sr_commit_free(commit); + sr_commit_free(dup_commit); + crypto_pk_free(k); + UNMOCK(trusteddirserver_get_by_v3_auth_digest); +} + +static void +test_state_update(void *arg) +{ + time_t commit_phase_time = 1452076000; + time_t reveal_phase_time = 1452086800; + sr_state_t *state; + + (void) arg; + + { + init_authority_state(); + state = get_sr_state(); + set_sr_phase(SR_PHASE_COMMIT); + /* We'll cheat a bit here and reset the creation time of the state which + * will avoid us to compute a valid_after time that fits the commit + * phase. */ + state->valid_after = 0; + state->n_reveal_rounds = 0; + state->n_commit_rounds = 0; + state->n_protocol_runs = 0; + } + + /* We need to mock for the state update function call. */ + MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); + + /* We are in COMMIT phase here and we'll trigger a state update but no + * transition. */ + sr_state_update(commit_phase_time); + tt_int_op(state->valid_after, OP_EQ, commit_phase_time); + tt_int_op(state->n_commit_rounds, OP_EQ, 1); + tt_int_op(state->phase, OP_EQ, SR_PHASE_COMMIT); + tt_int_op(digestmap_size(state->commits), OP_EQ, 1); + + /* We are still in the COMMIT phase here but we'll trigger a state + * transition to the REVEAL phase. */ + sr_state_update(reveal_phase_time); + tt_int_op(state->phase, OP_EQ, SR_PHASE_REVEAL); + tt_int_op(state->valid_after, OP_EQ, reveal_phase_time); + /* Only our commit should be in there. */ + tt_int_op(digestmap_size(state->commits), OP_EQ, 1); + tt_int_op(state->n_reveal_rounds, OP_EQ, 1); + + /* We can't update a state with a valid after _lower_ than the creation + * time so here it is. */ + sr_state_update(commit_phase_time); + tt_int_op(state->valid_after, OP_EQ, reveal_phase_time); + + /* Finally, let's go back in COMMIT phase so we can test the state update + * of a new protocol run. */ + state->valid_after = 0; + sr_state_update(commit_phase_time); + tt_int_op(state->valid_after, OP_EQ, commit_phase_time); + tt_int_op(state->n_commit_rounds, OP_EQ, 1); + tt_int_op(state->n_reveal_rounds, OP_EQ, 0); + tt_u64_op(state->n_protocol_runs, OP_EQ, 1); + tt_int_op(state->phase, OP_EQ, SR_PHASE_COMMIT); + tt_int_op(digestmap_size(state->commits), OP_EQ, 1); + tt_assert(state->current_srv); + + done: + sr_state_free_all(); + UNMOCK(get_my_v3_authority_cert); +} + +struct testcase_t sr_tests[] = { + { "get_sr_protocol_phase", test_get_sr_protocol_phase, TT_FORK, + NULL, NULL }, + { "sr_commit", test_sr_commit, TT_FORK, + NULL, NULL }, + { "keep_commit", test_keep_commit, TT_FORK, + NULL, NULL }, + { "encoding", test_encoding, TT_FORK, + NULL, NULL }, + { "get_start_time_of_current_run", test_get_start_time_of_current_run, + TT_FORK, NULL, NULL }, + { "get_start_time_functions", test_get_start_time_functions, + TT_FORK, NULL, NULL }, + { "get_sr_protocol_duration", test_get_sr_protocol_duration, TT_FORK, + NULL, NULL }, + { "get_state_valid_until_time", test_get_state_valid_until_time, TT_FORK, + NULL, NULL }, + { "vote", test_vote, TT_FORK, + NULL, NULL }, + { "state_load_from_disk", test_state_load_from_disk, TT_FORK, + NULL, NULL }, + { "sr_compute_srv", test_sr_compute_srv, TT_FORK, NULL, NULL }, + { "sr_get_majority_srv_from_votes", test_sr_get_majority_srv_from_votes, + TT_FORK, NULL, NULL }, + { "utils", test_utils, TT_FORK, NULL, NULL }, + { "state_transition", test_state_transition, TT_FORK, NULL, NULL }, + { "state_update", test_state_update, TT_FORK, + NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_slow.c b/src/wraith/src/test/test_slow.c new file mode 100644 index 000000000..e64070249 --- /dev/null +++ b/src/wraith/src/test/test_slow.c @@ -0,0 +1,26 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_slow.c + * \brief Slower unit tests for many pieces of the lower level Tor modules. + **/ + +#include "orconfig.h" + +#include +#ifdef HAVE_FCNTL_H +#include +#endif + +#include "or.h" +#include "test.h" + +struct testgroup_t testgroups[] = { + { "slow/crypto/", slow_crypto_tests }, + { "slow/util/", slow_util_tests }, + END_OF_GROUPS +}; + diff --git a/src/wraith/src/test/test_socks.c b/src/wraith/src/test/test_socks.c new file mode 100644 index 000000000..9ae7530e2 --- /dev/null +++ b/src/wraith/src/test/test_socks.c @@ -0,0 +1,1031 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "buffers.h" +#include "config.h" +#include "proto_socks.h" +#include "test.h" +#include "log_test_helpers.h" + +typedef struct socks_test_data_t { + socks_request_t *req; + buf_t *buf; +} socks_test_data_t; + +static void * +socks_test_setup(const struct testcase_t *testcase) +{ + socks_test_data_t *data = tor_malloc(sizeof(socks_test_data_t)); + (void)testcase; + data->buf = buf_new_with_capacity(256); + data->req = socks_request_new(); + config_register_addressmaps(get_options()); + return data; +} +static int +socks_test_cleanup(const struct testcase_t *testcase, void *ptr) +{ + socks_test_data_t *data = ptr; + (void)testcase; + buf_free(data->buf); + socks_request_free(data->req); + tor_free(data); + return 1; +} + +static const struct testcase_setup_t socks_setup = { + socks_test_setup, socks_test_cleanup +}; + +#define SOCKS_TEST_INIT() \ + socks_test_data_t *testdata = ptr; \ + buf_t *buf = testdata->buf; \ + socks_request_t *socks = testdata->req; +#define ADD_DATA(buf, s) \ + buf_add(buf, s, sizeof(s)-1) + +static void +socks_request_clear(socks_request_t *socks) +{ + tor_free(socks->username); + tor_free(socks->password); + memset(socks, 0, sizeof(socks_request_t)); +} + +/** Perform unsupported SOCKS 4 commands */ +static void +test_socks_4_unsupported_commands(void *ptr) +{ + SOCKS_TEST_INIT(); + + /* SOCKS 4 Send BIND [02] to IP address 2.2.2.2:4369 */ + ADD_DATA(buf, "\x04\x02\x11\x11\x02\x02\x02\x02\x00"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks), + OP_EQ, -1); + tt_int_op(4,OP_EQ, socks->socks_version); + tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ + + done: + ; +} + +/** Perform supported SOCKS 4 commands */ +static void +test_socks_4_supported_commands(void *ptr) +{ + SOCKS_TEST_INIT(); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + + /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4370 */ + ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x03\x00"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks), + OP_EQ, 1); + tt_int_op(4,OP_EQ, socks->socks_version); + tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ + tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command); + tt_str_op("2.2.2.3",OP_EQ, socks->address); + tt_int_op(4370,OP_EQ, socks->port); + tt_assert(socks->got_auth == 0); + tt_assert(! socks->username); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + socks_request_clear(socks); + + /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4369 with userid*/ + ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x04me\x00"); + tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), + OP_EQ, 1); + tt_int_op(4,OP_EQ, socks->socks_version); + tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ + tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command); + tt_str_op("2.2.2.4",OP_EQ, socks->address); + tt_int_op(4370,OP_EQ, socks->port); + tt_assert(socks->got_auth == 1); + tt_assert(socks->username); + tt_int_op(2,OP_EQ, socks->usernamelen); + tt_mem_op("me",OP_EQ, socks->username, 2); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + socks_request_clear(socks); + + /* SOCKS 4a Send RESOLVE [F0] request for torproject.org */ + ADD_DATA(buf, "\x04\xF0\x01\x01\x00\x00\x00\x02me\x00torproject.org\x00"); + tt_int_op(fetch_from_buf_socks(buf, socks, 1, + get_options()->SafeSocks), + OP_EQ, 1); + tt_int_op(4,OP_EQ, socks->socks_version); + tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ + tt_str_op("torproject.org",OP_EQ, socks->address); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + + done: + ; +} + +static void +test_socks_4_bad_arguments(void *ptr) +{ + SOCKS_TEST_INIT(); + setup_capture_of_logs(LOG_DEBUG); + + /* Try with 0 IPv4 address */ + ADD_DATA(buf, "\x04\x01\x00\x50\x00\x00\x00\x00\x00"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks), + OP_EQ, -1); + buf_clear(buf); + expect_log_msg_containing("Port or DestIP is zero."); + mock_clean_saved_logs(); + + /* Try with 0 port */ + ADD_DATA(buf, "\x04\x01\x00\x00\x01\x02\x03\x04\x00"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks), + OP_EQ, -1); + buf_clear(buf); + expect_log_msg_containing("Port or DestIP is zero."); + mock_clean_saved_logs(); + + /* Try with 2000-byte username (!) */ + ADD_DATA(buf, "\x04\x01\x00\x50\x01\x02\x03\x04"); + int i; + for (i = 0; i < 200; ++i) { + ADD_DATA(buf, "1234567890"); + } + ADD_DATA(buf, "\x00"); + tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), + OP_EQ, -1); + buf_clear(buf); + expect_log_msg_containing("user name too long; rejecting."); + mock_clean_saved_logs(); + + /* Try with 2000-byte hostname */ + ADD_DATA(buf, "\x04\x01\x00\x50\x00\x00\x00\x01\x00"); + for (i = 0; i < 200; ++i) { + ADD_DATA(buf, "1234567890"); + } + ADD_DATA(buf, "\x00"); + { + const char *p; + size_t s; + buf_pullup(buf, 9999, &p, &s); + } + tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), + OP_EQ, -1); + buf_clear(buf); + expect_log_msg_containing("Destaddr too long. Rejecting."); + mock_clean_saved_logs(); + + /* Try with 2000-byte hostname, not terminated. */ + ADD_DATA(buf, "\x04\x01\x00\x50\x00\x00\x00\x01\x00"); + for (i = 0; i < 200; ++i) { + ADD_DATA(buf, "1234567890"); + } + tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), + OP_EQ, -1); + buf_clear(buf); + expect_log_msg_containing("Destaddr too long."); + mock_clean_saved_logs(); + + /* Socks4, bogus hostname */ + ADD_DATA(buf, "\x04\x01\x00\x50\x00\x00\x00\x01\x00" "---\x00" ); + tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), OP_EQ, -1); + buf_clear(buf); + expect_log_msg_containing("Your application (using socks4 to port 80) " + "gave Tor a malformed hostname: "); + mock_clean_saved_logs(); + + done: + teardown_capture_of_logs(); +} + +/** Perform unsupported SOCKS 5 commands */ +static void +test_socks_5_unsupported_commands(void *ptr) +{ + SOCKS_TEST_INIT(); + + /* SOCKS 5 Send unsupported BIND [02] command */ + ADD_DATA(buf, "\x05\x02\x00\x01"); + + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks),OP_EQ, 0); + tt_int_op(0,OP_EQ, buf_datalen(buf)); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + ADD_DATA(buf, "\x05\x02\x00\x01\x02\x02\x02\x01\x01\x01"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks),OP_EQ, -1); + + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); + + buf_clear(buf); + socks_request_clear(socks); + + /* SOCKS 5 Send unsupported UDP_ASSOCIATE [03] command */ + ADD_DATA(buf, "\x05\x02\x00\x01"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks),OP_EQ, 0); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + ADD_DATA(buf, "\x05\x03\x00\x01\x02\x02\x02\x01\x01\x01"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks),OP_EQ, -1); + + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); + + done: + ; +} + +/** Perform supported SOCKS 5 commands */ +static void +test_socks_5_supported_commands(void *ptr) +{ + SOCKS_TEST_INIT(); + + /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */ + ADD_DATA(buf, "\x05\x01\x00"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks),OP_EQ, 0); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + + ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks),OP_EQ, 1); + tt_str_op("2.2.2.2",OP_EQ, socks->address); + tt_int_op(4369,OP_EQ, socks->port); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + socks_request_clear(socks); + + /* SOCKS 5 Send CONNECT [01] to one of the ipv6 addresses for + torproject.org:80 */ + ADD_DATA(buf, "\x05\x01\x00"); + ADD_DATA(buf, "\x05\x01\x00\x04" + "\x20\x02\x41\xb8\x02\x02\x0d\xeb\x02\x13\x21\xff\xfe\x20\x14\x26" + "\x00\x50"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks),OP_EQ, 1); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + tt_str_op("[2002:41b8:202:deb:213:21ff:fe20:1426]",OP_EQ, socks->address); + tt_int_op(80,OP_EQ, socks->port); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + socks_request_clear(socks); + + /* SOCKS 5 Send CONNECT [01] to FQDN torproject.org:4369 */ + ADD_DATA(buf, "\x05\x01\x00"); + ADD_DATA(buf, "\x05\x01\x00\x03\x0Etorproject.org\x11\x11"); + tt_int_op(fetch_from_buf_socks(buf, socks, 1, + get_options()->SafeSocks),OP_EQ, 1); + + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + tt_str_op("torproject.org",OP_EQ, socks->address); + tt_int_op(4369,OP_EQ, socks->port); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + socks_request_clear(socks); + + /* SOCKS 5 Send RESOLVE [F0] request for torproject.org:4369 */ + ADD_DATA(buf, "\x05\x01\x00"); + ADD_DATA(buf, "\x05\xF0\x00\x03\x0Etorproject.org\x01\x02"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks), + OP_EQ, 1); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + tt_str_op("torproject.org",OP_EQ, socks->address); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + socks_request_clear(socks); + + /* SOCKS 5 Should NOT reject RESOLVE [F0] request for IPv4 address + * string if SafeSocks is enabled. */ + + ADD_DATA(buf, "\x05\x01\x00"); + ADD_DATA(buf, "\x05\xF0\x00\x03\x07"); + ADD_DATA(buf, "8.8.8.8"); + ADD_DATA(buf, "\x11\x11"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1), + OP_EQ, 1); + + tt_str_op("8.8.8.8", OP_EQ, socks->address); + tt_int_op(4369, OP_EQ, socks->port); + + tt_int_op(0, OP_EQ, buf_datalen(buf)); + + socks_request_clear(socks); + + /* SOCKS 5 should NOT reject RESOLVE [F0] reject for IPv6 address + * string if SafeSocks is enabled. */ + + ADD_DATA(buf, "\x05\x01\x00"); + ADD_DATA(buf, "\x05\xF0\x00\x03\x27"); + ADD_DATA(buf, "2001:0db8:85a3:0000:0000:8a2e:0370:7334"); + ADD_DATA(buf, "\x01\x02"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1), + OP_EQ, -1); + + tt_str_op("2001:0db8:85a3:0000:0000:8a2e:0370:7334", OP_EQ, socks->address); + tt_int_op(258, OP_EQ, socks->port); + + tt_int_op(0, OP_EQ, buf_datalen(buf)); + + socks_request_clear(socks); + + /* SOCKS 5 Send RESOLVE_PTR [F1] for IP address 2.2.2.5 */ + ADD_DATA(buf, "\x05\x01\x00"); + ADD_DATA(buf, "\x05\xF1\x00\x01\x02\x02\x02\x05\x01\x03"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks), + OP_EQ, 1); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + tt_str_op("2.2.2.5",OP_EQ, socks->address); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + + done: + ; +} + +/** Perform SOCKS 5 authentication */ +static void +test_socks_5_no_authenticate(void *ptr) +{ + SOCKS_TEST_INIT(); + + /*SOCKS 5 No Authentication */ + ADD_DATA(buf,"\x05\x01\x00"); + tt_assert(!fetch_from_buf_socks(buf, socks, + get_options()->TestSocks, + get_options()->SafeSocks)); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(SOCKS_NO_AUTH,OP_EQ, socks->reply[1]); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + + /*SOCKS 5 Send username/password anyway - pretend to be broken */ + ADD_DATA(buf,"\x01\x02\x01\x01\x02\x01\x01"); + tt_assert(!fetch_from_buf_socks(buf, socks, + get_options()->TestSocks, + get_options()->SafeSocks)); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(1,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + + tt_int_op(2,OP_EQ, socks->usernamelen); + tt_int_op(2,OP_EQ, socks->passwordlen); + + tt_mem_op("\x01\x01",OP_EQ, socks->username, 2); + tt_mem_op("\x01\x01",OP_EQ, socks->password, 2); + + done: + ; +} + +/** Perform SOCKS 5 authentication */ +static void +test_socks_5_authenticate(void *ptr) +{ + SOCKS_TEST_INIT(); + + /* SOCKS 5 Negotiate username/password authentication */ + ADD_DATA(buf, "\x05\x01\x02"); + + tt_assert(!fetch_from_buf_socks(buf, socks, + get_options()->TestSocks, + get_options()->SafeSocks)); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(SOCKS_USER_PASS,OP_EQ, socks->reply[1]); + tt_int_op(5,OP_EQ, socks->socks_version); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + + /* SOCKS 5 Send username/password */ + ADD_DATA(buf, "\x01\x02me\x08mypasswd"); + tt_assert(!fetch_from_buf_socks(buf, socks, + get_options()->TestSocks, + get_options()->SafeSocks)); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(1,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + + tt_int_op(2,OP_EQ, socks->usernamelen); + tt_int_op(8,OP_EQ, socks->passwordlen); + + tt_mem_op("me",OP_EQ, socks->username, 2); + tt_mem_op("mypasswd",OP_EQ, socks->password, 8); + + done: + ; +} + +/** Perform SOCKS 5 authentication and send data all in one go */ +static void +test_socks_5_authenticate_with_data(void *ptr) +{ + SOCKS_TEST_INIT(); + + /* SOCKS 5 Negotiate username/password authentication */ + ADD_DATA(buf, "\x05\x01\x02"); + + tt_assert(!fetch_from_buf_socks(buf, socks, + get_options()->TestSocks, + get_options()->SafeSocks)); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(SOCKS_USER_PASS,OP_EQ, socks->reply[1]); + tt_int_op(5,OP_EQ, socks->socks_version); + + tt_int_op(0,OP_EQ, buf_datalen(buf)); + + /* SOCKS 5 Send username/password */ + /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */ + ADD_DATA(buf, "\x01\x02me\x03you\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks), + OP_EQ, 1); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(1,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + + tt_str_op("2.2.2.2",OP_EQ, socks->address); + tt_int_op(4369,OP_EQ, socks->port); + + tt_int_op(2,OP_EQ, socks->usernamelen); + tt_int_op(3,OP_EQ, socks->passwordlen); + tt_mem_op("me",OP_EQ, socks->username, 2); + tt_mem_op("you",OP_EQ, socks->password, 3); + + done: + ; +} + +/** Try to negotiate an unsupported authentication type */ +static void +test_socks_5_auth_unsupported_type(void *ptr) +{ + SOCKS_TEST_INIT(); + + /* None of these authentication types are recognized. */ + ADD_DATA(buf, "\x05\x03\x99\x21\x10"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks), + OP_EQ, -1); + tt_int_op(0,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0xff,OP_EQ, socks->reply[1]); + + done: + ; +} + +/** Try to negotiate an unsupported version of username/password auth. */ +static void +test_socks_5_auth_unsupported_version(void *ptr) +{ + SOCKS_TEST_INIT(); + + /* Negotiate username/password */ + ADD_DATA(buf, "\x05\x01\x02"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks), + OP_EQ, 0); + tt_int_op(0,OP_EQ, buf_datalen(buf)); /* buf should be drained */ + /* Now, suggest an unrecognized username/password version */ + ADD_DATA(buf, "\x02\x05" "hello" "\x05" "world"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks), + OP_EQ, -1); + + done: + ; +} + +/** Perform SOCKS 5 authentication before method negotiated */ +static void +test_socks_5_auth_before_negotiation(void *ptr) +{ + SOCKS_TEST_INIT(); + + /* SOCKS 5 Send username/password */ + ADD_DATA(buf, "\x01\x02me\x02me"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks), + OP_EQ, -1); + tt_int_op(0,OP_EQ, socks->socks_version); + tt_int_op(0,OP_EQ, socks->replylen); + tt_int_op(0,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + + done: + ; +} + +/** Perform malformed SOCKS 5 commands */ +static void +test_socks_5_malformed_commands(void *ptr) +{ + SOCKS_TEST_INIT(); + + /* XXX: Stringified address length > MAX_SOCKS_ADDR_LEN will never happen */ + + /** SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369, with SafeSocks set + */ + ADD_DATA(buf, "\x05\x01\x00"); + ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1), + OP_EQ, -1); + + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_NOT_ALLOWED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); + + buf_clear(buf); + socks_request_clear(socks); + + /* SOCKS 5 Send RESOLVE_PTR [F1] for FQDN torproject.org */ + ADD_DATA(buf, "\x05\x01\x00"); + ADD_DATA(buf, "\x05\xF1\x00\x03\x0Etorproject.org\x11\x11"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks),OP_EQ, -1); + + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); + + buf_clear(buf); + socks_request_clear(socks); + + /* XXX: len + 1 > MAX_SOCKS_ADDR_LEN (FQDN request) will never happen */ + + /* SOCKS 5 Send CONNECT [01] to FQDN """"".com */ + ADD_DATA(buf, "\x05\x01\x00"); + ADD_DATA(buf, "\x05\x01\x00\x03\x09\"\"\"\"\".com\x11\x11"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks),OP_EQ, -1); + + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_GENERAL_ERROR,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); + + buf_clear(buf); + socks_request_clear(socks); + + /* SOCKS 5 Send CONNECT [01] to address type 0x23 */ + ADD_DATA(buf, "\x05\x01\x00"); + ADD_DATA(buf, "\x05\x01\x00\x23\x02\x02\x02\x02\x11\x11"); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, + get_options()->SafeSocks),OP_EQ, -1); + + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); + + done: + ; +} + +static void +test_socks_5_bad_arguments(void *ptr) +{ + SOCKS_TEST_INIT(); + setup_capture_of_logs(LOG_DEBUG); + + /* Socks5, bogus hostname */ + ADD_DATA(buf, "\x05\x01\x00" "\x05\x01\x00\x03\x03" "---" "\x00\x50" ); + tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), OP_EQ, -1); + buf_clear(buf); + expect_log_msg_containing("Your application (using socks5 to port 80) " + "gave Tor a malformed hostname: "); + mock_clean_saved_logs(); + socks_request_clear(socks); + + done: + teardown_capture_of_logs(); +} + +/** check for correct behavior when the socks command has not arrived. */ +static void +test_socks_truncated(void *ptr) +{ + const struct { + enum { NONE, AUTH, ALL } setup; + const char *body; + size_t len; + } commands[] = { + /* SOCKS4 */ + /* Connect, to an IP. */ + { NONE, "\x04\x01\x05\x05\x01\x02\x03\x04\x00", 9}, + /* Connect, to an IP, with authentication. */ + { NONE, "\x04\x01\x05\x05\x01\x02\x03\x04hello\x00", 14}, + /* SOCKS4A */ + /* Connect, to a hostname */ + { NONE, "\x04\x01\x09\x09\x00\x00\x00\x01\x00www.example.com\x00", 25}, + /* Connect, to a hostname, with authentication */ + { NONE, "\x04\x01\x09\x09\x00\x00\x00\x01hi\x00www.example.com\x00", 27}, + /* SOCKS5 */ + /* initial handshake */ + { NONE, "\x05\x00", 2 }, + /* no-auth handshake */ + { NONE, "\x05\x03\x99\x21\x10", 5 }, + /* SOCSK5, username-password, all empty. */ + { AUTH, "\x01\x00\x00", 3 }, + /* SOCSK5, username-password, 1 char each. */ + { AUTH, "\x01\x01x\x01y", 5 }, + /* SOCSK5, username-password, max length. */ + { AUTH, "\x01\xff" + "Ogni tempo ha il suo fascismo: se ne notano i segni premonitori " + "dovunque la concentrazione di potere nega al cittadino la " + "possibilit\xc3\xa0 e la capacit\xc3\xa0 di esprimere ed attuare la " + "sua volont\xc3\xa0. A questo si arriva in molti modi, non " + "necessariamente col terror" + "\xff" + "e dell'intimidazione poliziesca, ma anche negando o distorcendo " + "l'informazione, inquinando la giustizia, paralizzando la scuola, " + "diffondendo in molti modi sottili la nostalgia per un mondo in cui " + "regnava sovrano l'ordine, ed in cui la sicurezza dei pochi " + /* privilegiati riposava sul lavoro forzato e sul silenzio forzato dei + molti. -- Primo Levi */ , 513 }, + /* Socks5, IPv4 address */ + { ALL, "\x05\x01\x00\x01\x01\x02\x03\x04\x20\x20", 10 }, + /* Socks5, IPv6 address */ + { ALL, "\x05\x01\x00\x04" + "\x49\x20\x48\x41\x5a\x20\x45\x41\x53\x54\x45\x52\x20\x45\x47\x47" + "\x20\x20", 22 }, + /* Socks5, hostname, empty. */ + { ALL, "\x05\x01\x00\x03" "\x00" "\x00\x50", 7 }, + /* Socks5, hostname, moderate. */ + { ALL, "\x05\x01\x00\x03" "\x11" "onion.example.com" "\x00\x50", 24 }, + /* Socks5, hostname, maximum. */ + { ALL, "\x05\x01\x00\x03" "\xff" + "whatsoever.I.shall.see.or.hear.in.the.course.of.my.profession.as.well." + "as.outside.my.profession.in.my.intercourse.with.men.if.it.be.what." + "should.not.be.published.abroad.I.will.never.divulge.holding.such." + "things.to.be.holy.secrets.x.hippocratic.oath.wikipedia" + "\x00\x50", 262 }, + }; + unsigned i, j; + SOCKS_TEST_INIT(); + for (i = 0; i < ARRAY_LENGTH(commands); ++i) { + for (j = 0; j < commands[i].len; ++j) { + switch (commands[i].setup) { + default: /* Falls through */ + case NONE: + /* This test calls for no setup on the socks state. */ + break; + case AUTH: + /* This test calls for the socks state to be waiting for + * username/password authentication */ + ADD_DATA(buf, "\x05\x01\x02"); + tt_int_op(0, OP_EQ, fetch_from_buf_socks(buf, socks, 0, 0)); + tt_int_op(0, OP_EQ, buf_datalen(buf)); + break; + case ALL: + /* This test calls for the socks state to be waiting for + * the connection request */ + ADD_DATA(buf, "\x05\x01\x00"); + tt_int_op(0, OP_EQ, fetch_from_buf_socks(buf, socks, 0, 0)); + tt_int_op(0, OP_EQ, buf_datalen(buf)); + } + + TT_BLATHER(("Checking command %u, length %u, omitting char %u", i, j, + (unsigned)commands[i].body[j])); + buf_add(buf, commands[i].body, j); + /* This should return 0 meaning "not done yet" */ + tt_int_op(0, OP_EQ, fetch_from_buf_socks(buf, socks, 0, 0)); + tt_uint_op(j, OP_EQ, buf_datalen(buf)); /* Nothing was drained */ + buf_clear(buf); + socks_request_free(testdata->req); + socks = testdata->req = socks_request_new(); + } + } + done: + ; +} + +static void +test_socks_wrong_protocol(void *ptr) +{ + SOCKS_TEST_INIT(); + setup_capture_of_logs(LOG_DEBUG); + + /* HTTP request. */ + ADD_DATA(buf, "GET /index.html HTTP/1.0" ); + tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), OP_EQ, -1); + buf_clear(buf); + expect_log_msg_containing("Socks version 71 not recognized. " + "(This port is not an HTTP proxy;"); + mock_clean_saved_logs(); + socks_request_clear(socks); + + done: + teardown_capture_of_logs(); +} + +/* Check our client-side socks4 parsing (that is to say, our parsing of + * server responses). + */ +static void +test_socks_client_v4(void *arg) +{ + (void)arg; + buf_t *buf = buf_new(); + char *reason = NULL; + + /* Legit socks4 response, success */ + ADD_DATA(buf, "\x04\x5a\x20\x25\x01\x02\x03\x04"); + tt_int_op(1, OP_EQ, + fetch_from_buf_socks_client(buf, PROXY_SOCKS4_WANT_CONNECT_OK, + &reason)); + tt_ptr_op(reason, OP_EQ, NULL); + tt_int_op(buf_datalen(buf), OP_EQ, 0); + + /* Legit socks4 response, failure. */ + ADD_DATA(buf, "\x04\x5b\x20\x25\x01\x02\x03\x04"); + tt_int_op(-1, OP_EQ, + fetch_from_buf_socks_client(buf, PROXY_SOCKS4_WANT_CONNECT_OK, + &reason)); + tt_ptr_op(reason, OP_NE, NULL); + tt_str_op(reason, OP_EQ, "server rejected connection"); + + done: + buf_free(buf); + tor_free(reason); +} + +/* Check our client-side socks5 authentication-negotiation parsing (that is to + * say, our parsing of server responses). + */ +static void +test_socks_client_v5_auth(void *arg) +{ + (void)arg; + buf_t *buf = buf_new(); + char *reason = NULL; + + /* Legit socks5 responses, got a method we like. */ + ADD_DATA(buf, "\x05\x00"); + tt_int_op(1, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_AUTH_METHOD_NONE, + &reason)); + tt_ptr_op(reason, OP_EQ, NULL); + tt_int_op(buf_datalen(buf), OP_EQ, 0); + + /* Same, but we wanted something else. */ + ADD_DATA(buf, "\x05\x00"); + tt_int_op(1, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929, + &reason)); + tt_ptr_op(reason, OP_EQ, NULL); + tt_int_op(buf_datalen(buf), OP_EQ, 0); + + /* Same, and they offered a password. */ + ADD_DATA(buf, "\x05\x02"); + tt_int_op(2, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929, + &reason)); + tt_ptr_op(reason, OP_EQ, NULL); + tt_int_op(buf_datalen(buf), OP_EQ, 0); + + /* They rejected our method, or selected something we don't know. */ + ADD_DATA(buf, "\x05\xff"); + tt_int_op(-1, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_AUTH_METHOD_NONE, + &reason)); + tt_str_op(reason, OP_EQ, "server doesn't support any of our available " + "authentication methods"); + buf_clear(buf); + tor_free(reason); + ADD_DATA(buf, "\x05\xff"); + tt_int_op(-1, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929, + &reason)); + tt_str_op(reason, OP_EQ, "server doesn't support any of our available " + "authentication methods"); + tor_free(reason); + buf_clear(buf); + + /* Now check for authentication responses: check success and failure. */ + ADD_DATA(buf, "\x01\x00"); + tt_int_op(1, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_AUTH_RFC1929_OK, + &reason)); + tt_ptr_op(reason, OP_EQ, NULL); + tt_int_op(buf_datalen(buf), OP_EQ, 0); + + ADD_DATA(buf, "\x01\xf0"); + tt_int_op(-1, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_AUTH_RFC1929_OK, + &reason)); + tt_ptr_op(reason, OP_NE, NULL); + tt_str_op(reason, OP_EQ, "authentication failed"); + + done: + buf_free(buf); + tor_free(reason); +} + +/* Check our client-side socks5 connect parsing (that is to say, our parsing + * of server responses). + */ +static void +test_socks_client_v5_connect(void *arg) +{ + (void)arg; + buf_t *buf = buf_new(); + char *reason = NULL; + + /* Legit socks5 responses, success, ipv4. */ + ADD_DATA(buf, "\x05\x00\x00\x01\x01\x02\x03\x04\x00\x05"); + tt_int_op(1, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_CONNECT_OK, + &reason)); + tt_ptr_op(reason, OP_EQ, NULL); + tt_int_op(buf_datalen(buf), OP_EQ, 0); + + /* Legit socks5 responses, success, ipv6. */ + ADD_DATA(buf, "\x05\x00\x00\x04" + "abcdefghijklmnop" + "\x00\x05"); + tt_int_op(1, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_CONNECT_OK, + &reason)); + tt_ptr_op(reason, OP_EQ, NULL); + tt_int_op(buf_datalen(buf), OP_EQ, 0); + + /* Legit socks5 responses, success, hostname. */ + ADD_DATA(buf, "\x05\x00\x00\x03\x12" + "gopher.example.com" + "\x00\x05"); + tt_int_op(1, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_CONNECT_OK, + &reason)); + tt_ptr_op(reason, OP_EQ, NULL); + tt_int_op(buf_datalen(buf), OP_EQ, 0); + + /* Legit socks5 responses, failure, hostname. */ + ADD_DATA(buf, "\x05\x03\x00\x03\x12" + "gopher.example.com" + "\x00\x05"); + tt_int_op(-1, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_CONNECT_OK, + &reason)); + tt_ptr_op(reason, OP_NE, NULL); + tt_str_op(reason, OP_EQ, "Network unreachable"); + tor_free(reason); + buf_clear(buf); + + /* Bogus socks5 responses: what is address type 0x17? */ + ADD_DATA(buf, "\x05\x03\x00\x17\x12 blah blah"); + tt_int_op(-1, OP_EQ, + fetch_from_buf_socks_client(buf, + PROXY_SOCKS5_WANT_CONNECT_OK, + &reason)); + tt_ptr_op(reason, OP_NE, NULL); + tt_str_op(reason, OP_EQ, "invalid response to connect request"); + buf_clear(buf); + + done: + buf_free(buf); + tor_free(reason); +} + +static void +test_socks_client_truncated(void *arg) +{ + (void)arg; + buf_t *buf = buf_new(); + char *reason = NULL; + +#define S(str) str, (sizeof(str)-1) + const struct { + int state; + const char *body; + size_t len; + } replies[] = { + { PROXY_SOCKS4_WANT_CONNECT_OK, S("\x04\x5a\x20\x25\x01\x02\x03\x04") }, + { PROXY_SOCKS4_WANT_CONNECT_OK, S("\x04\x5b\x20\x25\x01\x02\x03\x04") }, + { PROXY_SOCKS5_WANT_AUTH_METHOD_NONE, S("\x05\x00") }, + { PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929, S("\x05\x00") }, + { PROXY_SOCKS5_WANT_AUTH_RFC1929_OK, S("\x01\x00") }, + { PROXY_SOCKS5_WANT_CONNECT_OK, + S("\x05\x00\x00\x01\x01\x02\x03\x04\x00\x05") }, + { PROXY_SOCKS5_WANT_CONNECT_OK, + S("\x05\x00\x00\x04" "abcdefghijklmnop" "\x00\x05") }, + { PROXY_SOCKS5_WANT_CONNECT_OK, + S("\x05\x00\x00\x03\x12" "gopher.example.com" "\x00\x05") }, + { PROXY_SOCKS5_WANT_CONNECT_OK, + S("\x05\x03\x00\x03\x12" "gopher.example.com""\x00\x05") }, + { PROXY_SOCKS5_WANT_CONNECT_OK, + S("\x05\x03\x00\x17") }, + }; + unsigned i, j; + for (i = 0; i < ARRAY_LENGTH(replies); ++i) { + for (j = 0; j < replies[i].len; ++j) { + TT_BLATHER(("Checking command %u, length %u", i, j)); + buf_add(buf, replies[i].body, j); + /* This should return 0 meaning "not done yet" */ + tt_int_op(0, OP_EQ, + fetch_from_buf_socks_client(buf, replies[i].state, &reason)); + tt_uint_op(j, OP_EQ, buf_datalen(buf)); /* Nothing was drained */ + buf_clear(buf); + tt_ptr_op(reason, OP_EQ, NULL); + } + } + + done: + tor_free(reason); + buf_free(buf); +} + +#define SOCKSENT(name) \ + { #name, test_socks_##name, TT_FORK, &socks_setup, NULL } + +struct testcase_t socks_tests[] = { + SOCKSENT(4_unsupported_commands), + SOCKSENT(4_supported_commands), + SOCKSENT(4_bad_arguments), + + SOCKSENT(5_unsupported_commands), + SOCKSENT(5_supported_commands), + SOCKSENT(5_no_authenticate), + SOCKSENT(5_auth_unsupported_type), + SOCKSENT(5_auth_unsupported_version), + SOCKSENT(5_auth_before_negotiation), + SOCKSENT(5_authenticate), + SOCKSENT(5_authenticate_with_data), + SOCKSENT(5_malformed_commands), + SOCKSENT(5_bad_arguments), + + SOCKSENT(truncated), + + SOCKSENT(wrong_protocol), + + { "client/v4", test_socks_client_v4, TT_FORK, NULL, NULL }, + { "client/v5_auth", test_socks_client_v5_auth, TT_FORK, NULL, NULL }, + { "client/v5_connect", test_socks_client_v5_connect, TT_FORK, NULL, NULL }, + { "client/truncated", test_socks_client_truncated, TT_FORK, NULL, NULL }, + + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_status.c b/src/wraith/src/test/test_status.c new file mode 100644 index 000000000..50ea203e4 --- /dev/null +++ b/src/wraith/src/test/test_status.c @@ -0,0 +1,1086 @@ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define STATUS_PRIVATE +#define HIBERNATE_PRIVATE +#define LOG_PRIVATE +#define REPHIST_PRIVATE + +#include "orconfig.h" + +#include +#include + +#include "or.h" +#include "torlog.h" +#include "tor_queue.h" +#include "status.h" +#include "circuitlist.h" +#include "config.h" +#include "hibernate.h" +#include "rephist.h" +#include "relay.h" +#include "router.h" +#include "main.h" +#include "nodelist.h" +#include "statefile.h" +#include "test.h" + +#define NS_MODULE status + +#define NS_SUBMODULE count_circuits + +/* + * Test that count_circuits() is correctly counting the number of + * global circuits. + */ + +static smartlist_t * mock_global_circuitlist = NULL; + +NS_DECL(smartlist_t *, circuit_get_global_list, (void)); + +static void +NS(test_main)(void *arg) +{ + /* Choose origin_circuit_t wlog. */ + origin_circuit_t *mock_circuit1, *mock_circuit2; + int expected_circuits = 2, actual_circuits; + + (void)arg; + + mock_circuit1 = tor_malloc_zero(sizeof(origin_circuit_t)); + mock_circuit2 = tor_malloc_zero(sizeof(origin_circuit_t)); + mock_global_circuitlist = smartlist_new(); + smartlist_add(mock_global_circuitlist, TO_CIRCUIT(mock_circuit1)); + smartlist_add(mock_global_circuitlist, TO_CIRCUIT(mock_circuit2)); + + NS_MOCK(circuit_get_global_list); + + actual_circuits = count_circuits(); + + tt_assert(expected_circuits == actual_circuits); + + done: + tor_free(mock_circuit1); + tor_free(mock_circuit2); + smartlist_free(mock_global_circuitlist); + mock_global_circuitlist = NULL; + NS_UNMOCK(circuit_get_global_list); +} + +static smartlist_t * +NS(circuit_get_global_list)(void) +{ + return mock_global_circuitlist; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE secs_to_uptime + +/* + * Test that secs_to_uptime() is converting the number of seconds that + * Tor is up for into the appropriate string form containing hours and minutes. + */ + +static void +NS(test_main)(void *arg) +{ + const char *expected; + char *actual; + (void)arg; + + expected = "0:00 hours"; + actual = secs_to_uptime(0); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "0:00 hours"; + actual = secs_to_uptime(1); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "0:01 hours"; + actual = secs_to_uptime(60); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "0:59 hours"; + actual = secs_to_uptime(60 * 59); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1:00 hours"; + actual = secs_to_uptime(60 * 60); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "23:59 hours"; + actual = secs_to_uptime(60 * 60 * 23 + 60 * 59); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1 day 0:00 hours"; + actual = secs_to_uptime(60 * 60 * 23 + 60 * 60); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1 day 0:00 hours"; + actual = secs_to_uptime(86400 + 1); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1 day 0:01 hours"; + actual = secs_to_uptime(86400 + 60); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "10 days 0:00 hours"; + actual = secs_to_uptime(86400 * 10); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "10 days 0:00 hours"; + actual = secs_to_uptime(864000 + 1); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "10 days 0:01 hours"; + actual = secs_to_uptime(864000 + 60); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + done: + if (actual != NULL) + tor_free(actual); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE bytes_to_usage + +/* + * Test that bytes_to_usage() is correctly converting the number of bytes that + * Tor has read/written into the appropriate string form containing kilobytes, + * megabytes, or gigabytes. + */ + +static void +NS(test_main)(void *arg) +{ + const char *expected; + char *actual; + (void)arg; + + expected = "0 kB"; + actual = bytes_to_usage(0); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "0 kB"; + actual = bytes_to_usage(1); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1 kB"; + actual = bytes_to_usage(1024); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1023 kB"; + actual = bytes_to_usage((1 << 20) - 1); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1.00 MB"; + actual = bytes_to_usage((1 << 20)); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1.00 MB"; + actual = bytes_to_usage((1 << 20) + 5242); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1.01 MB"; + actual = bytes_to_usage((1 << 20) + 5243); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1024.00 MB"; + actual = bytes_to_usage((1 << 30) - 1); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1.00 GB"; + actual = bytes_to_usage((1 << 30)); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1.00 GB"; + actual = bytes_to_usage((1 << 30) + 5368709); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "1.01 GB"; + actual = bytes_to_usage((1 << 30) + 5368710); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + expected = "10.00 GB"; + actual = bytes_to_usage((U64_LITERAL(1) << 30) * 10L); + tt_str_op(actual, OP_EQ, expected); + tor_free(actual); + + done: + if (actual != NULL) + tor_free(actual); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(log_heartbeat, fails) + +/* + * Tests that log_heartbeat() fails when in the public server mode, + * not hibernating, and we couldn't get the current routerinfo. + */ + +NS_DECL(double, tls_get_write_overhead_ratio, (void)); +NS_DECL(int, we_are_hibernating, (void)); +NS_DECL(int, public_server_mode, (const or_options_t *options)); +NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); + +static void +NS(test_main)(void *arg) +{ + int expected, actual; + (void)arg; + + NS_MOCK(tls_get_write_overhead_ratio); + NS_MOCK(we_are_hibernating); + NS_MOCK(public_server_mode); + NS_MOCK(router_get_my_routerinfo); + + expected = -1; + actual = log_heartbeat(0); + + tt_int_op(actual, OP_EQ, expected); + + done: + NS_UNMOCK(tls_get_write_overhead_ratio); + NS_UNMOCK(we_are_hibernating); + NS_UNMOCK(public_server_mode); + NS_UNMOCK(router_get_my_routerinfo); +} + +static double +NS(tls_get_write_overhead_ratio)(void) +{ + return 2.0; +} + +static int +NS(we_are_hibernating)(void) +{ + return 0; +} + +static int +NS(public_server_mode)(const or_options_t *options) +{ + (void)options; + + return 1; +} + +static const routerinfo_t * +NS(router_get_my_routerinfo)(void) +{ + return NULL; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(log_heartbeat, not_in_consensus) + +/* + * Tests that log_heartbeat() logs appropriately if we are not in the cached + * consensus. + */ + +NS_DECL(double, tls_get_write_overhead_ratio, (void)); +NS_DECL(int, we_are_hibernating, (void)); +NS_DECL(int, public_server_mode, (const or_options_t *options)); +NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); +NS_DECL(const node_t *, node_get_by_id, (const char *identity_digest)); +NS_DECL(void, logv, (int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, const char *format, va_list ap)); +NS_DECL(int, server_mode, (const or_options_t *options)); + +static routerinfo_t *mock_routerinfo; + +static void +NS(test_main)(void *arg) +{ + int expected, actual; + (void)arg; + + NS_MOCK(tls_get_write_overhead_ratio); + NS_MOCK(we_are_hibernating); + NS_MOCK(public_server_mode); + NS_MOCK(router_get_my_routerinfo); + NS_MOCK(node_get_by_id); + NS_MOCK(logv); + NS_MOCK(server_mode); + + log_global_min_severity_ = LOG_DEBUG; + onion_handshakes_requested[ONION_HANDSHAKE_TYPE_TAP] = 1; + onion_handshakes_assigned[ONION_HANDSHAKE_TYPE_TAP] = 1; + onion_handshakes_requested[ONION_HANDSHAKE_TYPE_NTOR] = 1; + onion_handshakes_assigned[ONION_HANDSHAKE_TYPE_NTOR] = 1; + + expected = 0; + actual = log_heartbeat(0); + + tt_int_op(actual, OP_EQ, expected); + tt_int_op(CALLED(logv), OP_EQ, 5); + + done: + NS_UNMOCK(tls_get_write_overhead_ratio); + NS_UNMOCK(we_are_hibernating); + NS_UNMOCK(public_server_mode); + NS_UNMOCK(router_get_my_routerinfo); + NS_UNMOCK(node_get_by_id); + NS_UNMOCK(logv); + NS_UNMOCK(server_mode); + tor_free(mock_routerinfo); +} + +static double +NS(tls_get_write_overhead_ratio)(void) +{ + return 1.0; +} + +static int +NS(we_are_hibernating)(void) +{ + return 0; +} + +static int +NS(public_server_mode)(const or_options_t *options) +{ + (void)options; + + return 1; +} + +static const routerinfo_t * +NS(router_get_my_routerinfo)(void) +{ + mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); + + return mock_routerinfo; +} + +static const node_t * +NS(node_get_by_id)(const char *identity_digest) +{ + (void)identity_digest; + + return NULL; +} + +static void +NS(logv)(int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, const char *format, va_list ap) +{ + switch (CALLED(logv)) + { + case 0: + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, + "Heartbeat: It seems like we are not in the cached consensus."); + break; + case 1: + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, + "Heartbeat: Tor's uptime is %s, with %d circuits open. " + "I've sent %s and received %s.%s"); + tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ + tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ + break; + case 2: + tt_int_op(severity, OP_EQ, LOG_INFO); + break; + case 3: + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "rep_hist_log_circuit_handshake_stats"), + OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, + "Circuit handshake stats since last time: %d/%d TAP, %d/%d NTor."); + tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes assigned (TAP) */ + tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes requested (TAP) */ + tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes assigned (NTOR) */ + tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes requested (NTOR) */ + break; + case 4: + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "rep_hist_log_link_protocol_counts"), + OP_NE, NULL); + break; + default: + tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args + break; + } + + done: + CALLED(logv)++; +} + +static int +NS(server_mode)(const or_options_t *options) +{ + (void)options; + + return 0; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(log_heartbeat, simple) + +/* + * Tests that log_heartbeat() correctly logs heartbeat information + * normally. + */ + +NS_DECL(double, tls_get_write_overhead_ratio, (void)); +NS_DECL(int, we_are_hibernating, (void)); +NS_DECL(int, public_server_mode, (const or_options_t *options)); +NS_DECL(long, get_uptime, (void)); +NS_DECL(uint64_t, get_bytes_read, (void)); +NS_DECL(uint64_t, get_bytes_written, (void)); +NS_DECL(void, logv, (int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, const char *format, va_list ap)); +NS_DECL(int, server_mode, (const or_options_t *options)); + +static int NS(n_msgs) = 0; + +static void +NS(test_main)(void *arg) +{ + int expected, actual; + (void)arg; + + NS_MOCK(tls_get_write_overhead_ratio); + NS_MOCK(we_are_hibernating); + NS_MOCK(public_server_mode); + NS_MOCK(get_uptime); + NS_MOCK(get_bytes_read); + NS_MOCK(get_bytes_written); + NS_MOCK(logv); + NS_MOCK(server_mode); + + log_global_min_severity_ = LOG_DEBUG; + + expected = 0; + actual = log_heartbeat(0); + + tt_int_op(actual, OP_EQ, expected); + tt_int_op(NS(n_msgs), OP_EQ, 1); + + done: + NS_UNMOCK(tls_get_write_overhead_ratio); + NS_UNMOCK(we_are_hibernating); + NS_UNMOCK(public_server_mode); + NS_UNMOCK(get_uptime); + NS_UNMOCK(get_bytes_read); + NS_UNMOCK(get_bytes_written); + NS_UNMOCK(logv); + NS_UNMOCK(server_mode); +} + +static double +NS(tls_get_write_overhead_ratio)(void) +{ + return 1.0; +} + +static int +NS(we_are_hibernating)(void) +{ + return 1; +} + +static int +NS(public_server_mode)(const or_options_t *options) +{ + (void)options; + + return 0; +} + +static long +NS(get_uptime)(void) +{ + return 0; +} + +static uint64_t +NS(get_bytes_read)(void) +{ + return 0; +} + +static uint64_t +NS(get_bytes_written)(void) +{ + return 0; +} + +static void +NS(logv)(int severity, log_domain_mask_t domain, const char *funcname, + const char *suffix, const char *format, va_list ap) +{ + if (severity == LOG_INFO) + return; + ++NS(n_msgs); + + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, + "Heartbeat: Tor's uptime is %s, with %d circuits open. " + "I've sent %s and received %s.%s"); + tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ + tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, " We are currently hibernating."); + + done: + ; +} + +static int +NS(server_mode)(const or_options_t *options) +{ + (void)options; + + return 0; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(log_heartbeat, calls_log_accounting) + +/* + * Tests that log_heartbeat() correctly logs heartbeat information + * and accounting information when configured. + */ + +NS_DECL(double, tls_get_write_overhead_ratio, (void)); +NS_DECL(int, we_are_hibernating, (void)); +NS_DECL(int, public_server_mode, (const or_options_t *options)); +NS_DECL(long, get_uptime, (void)); +NS_DECL(uint64_t, get_bytes_read, (void)); +NS_DECL(uint64_t, get_bytes_written, (void)); +NS_DECL(void, logv, (int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, const char *format, va_list ap)); +NS_DECL(int, server_mode, (const or_options_t *options)); +NS_DECL(or_state_t *, get_or_state, (void)); +NS_DECL(int, accounting_is_enabled, (const or_options_t *options)); +NS_DECL(time_t, accounting_get_end_time, (void)); + +static or_state_t * NS(mock_state) = NULL; +static or_options_t * NS(mock_options) = NULL; + +static void +NS(test_main)(void *arg) +{ + int expected, actual; + (void)arg; + + NS_MOCK(tls_get_write_overhead_ratio); + NS_MOCK(we_are_hibernating); + NS_MOCK(public_server_mode); + NS_MOCK(get_uptime); + NS_MOCK(get_bytes_read); + NS_MOCK(get_bytes_written); + NS_MOCK(logv); + NS_MOCK(server_mode); + NS_MOCK(get_or_state); + NS_MOCK(accounting_is_enabled); + NS_MOCK(accounting_get_end_time); + + log_global_min_severity_ = LOG_DEBUG; + + expected = 0; + actual = log_heartbeat(0); + + tt_int_op(actual, OP_EQ, expected); + tt_int_op(CALLED(logv), OP_EQ, 3); + + done: + NS_UNMOCK(tls_get_write_overhead_ratio); + NS_UNMOCK(we_are_hibernating); + NS_UNMOCK(public_server_mode); + NS_UNMOCK(get_uptime); + NS_UNMOCK(get_bytes_read); + NS_UNMOCK(get_bytes_written); + NS_UNMOCK(logv); + NS_UNMOCK(server_mode); + NS_UNMOCK(accounting_is_enabled); + NS_UNMOCK(accounting_get_end_time); + tor_free_(NS(mock_state)); + tor_free_(NS(mock_options)); +} + +static double +NS(tls_get_write_overhead_ratio)(void) +{ + return 1.0; +} + +static int +NS(we_are_hibernating)(void) +{ + return 0; +} + +static int +NS(public_server_mode)(const or_options_t *options) +{ + (void)options; + + return 0; +} + +static long +NS(get_uptime)(void) +{ + return 0; +} + +static uint64_t +NS(get_bytes_read)(void) +{ + return 0; +} + +static uint64_t +NS(get_bytes_written)(void) +{ + return 0; +} + +static void +NS(logv)(int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, const char *format, va_list ap) +{ + switch (CALLED(logv)) + { + case 0: + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, + "Heartbeat: Tor's uptime is %s, with %d circuits open. " + "I've sent %s and received %s.%s"); + tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ + tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ + break; + case 1: + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_accounting"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, + "Heartbeat: Accounting enabled. Sent: %s, Received: %s, Used: %s / " + "%s, Rule: %s. The current accounting interval ends on %s, in %s."); + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_used */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_max */ + tt_str_op(va_arg(ap, char *), OP_EQ, "max"); /* acc_rule */ + /* format_local_iso_time uses local tz, so we can't just compare + * the string against a constant */ + char datetime[ISO_TIME_LEN+1]; + format_local_iso_time(datetime, 60); + tt_str_op(va_arg(ap, char *), OP_EQ, datetime); /* end_buf */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0:01 hours"); /* remaining */ + break; + case 2: + tt_int_op(severity, OP_EQ, LOG_INFO); + break; + default: + tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args + break; + } + + done: + CALLED(logv)++; +} + +static int +NS(server_mode)(const or_options_t *options) +{ + (void)options; + + return 1; +} + +static int +NS(accounting_is_enabled)(const or_options_t *options) +{ + (void)options; + + return 1; +} + +static time_t +NS(accounting_get_end_time)(void) +{ + return 60; +} + +static or_state_t * +NS(get_or_state)(void) +{ + NS(mock_state) = tor_malloc_zero(sizeof(or_state_t)); + NS(mock_state)->AccountingBytesReadInInterval = 0; + NS(mock_state)->AccountingBytesWrittenInInterval = 0; + + return NS(mock_state); +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(log_heartbeat, packaged_cell_fullness) + +/* + * Tests that log_heartbeat() correctly logs packaged cell + * fullness information. + */ + +NS_DECL(double, tls_get_write_overhead_ratio, (void)); +NS_DECL(int, we_are_hibernating, (void)); +NS_DECL(int, public_server_mode, (const or_options_t *options)); +NS_DECL(long, get_uptime, (void)); +NS_DECL(uint64_t, get_bytes_read, (void)); +NS_DECL(uint64_t, get_bytes_written, (void)); +NS_DECL(void, logv, (int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, const char *format, va_list ap)); +NS_DECL(int, server_mode, (const or_options_t *options)); +NS_DECL(int, accounting_is_enabled, (const or_options_t *options)); + +static void +NS(test_main)(void *arg) +{ + int expected, actual; + (void)arg; + + NS_MOCK(tls_get_write_overhead_ratio); + NS_MOCK(we_are_hibernating); + NS_MOCK(public_server_mode); + NS_MOCK(get_uptime); + NS_MOCK(get_bytes_read); + NS_MOCK(get_bytes_written); + NS_MOCK(logv); + NS_MOCK(server_mode); + NS_MOCK(accounting_is_enabled); + log_global_min_severity_ = LOG_DEBUG; + + stats_n_data_bytes_packaged = RELAY_PAYLOAD_SIZE; + stats_n_data_cells_packaged = 2; + expected = 0; + actual = log_heartbeat(0); + + tt_int_op(actual, OP_EQ, expected); + tt_int_op(CALLED(logv), OP_EQ, 2); + + done: + stats_n_data_bytes_packaged = 0; + stats_n_data_cells_packaged = 0; + NS_UNMOCK(tls_get_write_overhead_ratio); + NS_UNMOCK(we_are_hibernating); + NS_UNMOCK(public_server_mode); + NS_UNMOCK(get_uptime); + NS_UNMOCK(get_bytes_read); + NS_UNMOCK(get_bytes_written); + NS_UNMOCK(logv); + NS_UNMOCK(server_mode); + NS_UNMOCK(accounting_is_enabled); +} + +static double +NS(tls_get_write_overhead_ratio)(void) +{ + return 1.0; +} + +static int +NS(we_are_hibernating)(void) +{ + return 0; +} + +static int +NS(public_server_mode)(const or_options_t *options) +{ + (void)options; + + return 0; +} + +static long +NS(get_uptime)(void) +{ + return 0; +} + +static uint64_t +NS(get_bytes_read)(void) +{ + return 0; +} + +static uint64_t +NS(get_bytes_written)(void) +{ + return 0; +} + +static void +NS(logv)(int severity, log_domain_mask_t domain, const char *funcname, + const char *suffix, const char *format, va_list ap) +{ + switch (CALLED(logv)) + { + case 0: + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, + "Heartbeat: Tor's uptime is %s, with %d circuits open. " + "I've sent %s and received %s.%s"); + tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ + tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ + break; + case 1: + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, + "Average packaged cell fullness: %2.3f%%. " + "TLS write overhead: %.f%%"); + tt_double_op(fabs(va_arg(ap, double) - 50.0), OP_LE, DBL_EPSILON); + tt_double_op(fabs(va_arg(ap, double) - 0.0), OP_LE, DBL_EPSILON); + break; + default: + tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args + break; + } + + done: + CALLED(logv)++; +} + +static int +NS(server_mode)(const or_options_t *options) +{ + (void)options; + + return 0; +} + +static int +NS(accounting_is_enabled)(const or_options_t *options) +{ + (void)options; + + return 0; +} + +#undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(log_heartbeat, tls_write_overhead) + +/* + * Tests that log_heartbeat() correctly logs the TLS write overhead information + * when the TLS write overhead ratio exceeds 1. + */ + +NS_DECL(double, tls_get_write_overhead_ratio, (void)); +NS_DECL(int, we_are_hibernating, (void)); +NS_DECL(int, public_server_mode, (const or_options_t *options)); +NS_DECL(long, get_uptime, (void)); +NS_DECL(uint64_t, get_bytes_read, (void)); +NS_DECL(uint64_t, get_bytes_written, (void)); +NS_DECL(void, logv, (int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, const char *format, va_list ap)); +NS_DECL(int, server_mode, (const or_options_t *options)); +NS_DECL(int, accounting_is_enabled, (const or_options_t *options)); + +static void +NS(test_main)(void *arg) +{ + int expected, actual; + (void)arg; + + NS_MOCK(tls_get_write_overhead_ratio); + NS_MOCK(we_are_hibernating); + NS_MOCK(public_server_mode); + NS_MOCK(get_uptime); + NS_MOCK(get_bytes_read); + NS_MOCK(get_bytes_written); + NS_MOCK(logv); + NS_MOCK(server_mode); + NS_MOCK(accounting_is_enabled); + stats_n_data_cells_packaged = 0; + log_global_min_severity_ = LOG_DEBUG; + + expected = 0; + actual = log_heartbeat(0); + + tt_int_op(actual, OP_EQ, expected); + tt_int_op(CALLED(logv), OP_EQ, 2); + + done: + NS_UNMOCK(tls_get_write_overhead_ratio); + NS_UNMOCK(we_are_hibernating); + NS_UNMOCK(public_server_mode); + NS_UNMOCK(get_uptime); + NS_UNMOCK(get_bytes_read); + NS_UNMOCK(get_bytes_written); + NS_UNMOCK(logv); + NS_UNMOCK(server_mode); + NS_UNMOCK(accounting_is_enabled); +} + +static double +NS(tls_get_write_overhead_ratio)(void) +{ + return 2.0; +} + +static int +NS(we_are_hibernating)(void) +{ + return 0; +} + +static int +NS(public_server_mode)(const or_options_t *options) +{ + (void)options; + + return 0; +} + +static long +NS(get_uptime)(void) +{ + return 0; +} + +static uint64_t +NS(get_bytes_read)(void) +{ + return 0; +} + +static uint64_t +NS(get_bytes_written)(void) +{ + return 0; +} + +static void +NS(logv)(int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, const char *format, va_list ap) +{ + switch (CALLED(logv)) + { + case 0: + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, + "Heartbeat: Tor's uptime is %s, with %d circuits open. " + "I've sent %s and received %s.%s"); + tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ + tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ + break; + case 1: + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, + "Average packaged cell fullness: %2.3f%%. " + "TLS write overhead: %.f%%"); + tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, OP_EQ, 1); + tt_double_op(fabs(va_arg(ap, double) - 100.0), OP_LE, DBL_EPSILON); + break; + default: + tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args + break; + } + + done: + CALLED(logv)++; +} + +static int +NS(server_mode)(const or_options_t *options) +{ + (void)options; + + return 0; +} + +static int +NS(accounting_is_enabled)(const or_options_t *options) +{ + (void)options; + + return 0; +} + +#undef NS_SUBMODULE + +struct testcase_t status_tests[] = { + TEST_CASE(count_circuits), + TEST_CASE(secs_to_uptime), + TEST_CASE(bytes_to_usage), + TEST_CASE_ASPECT(log_heartbeat, fails), + TEST_CASE_ASPECT(log_heartbeat, simple), + TEST_CASE_ASPECT(log_heartbeat, not_in_consensus), + TEST_CASE_ASPECT(log_heartbeat, calls_log_accounting), + TEST_CASE_ASPECT(log_heartbeat, packaged_cell_fullness), + TEST_CASE_ASPECT(log_heartbeat, tls_write_overhead), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_storagedir.c b/src/wraith/src/test/test_storagedir.c new file mode 100644 index 000000000..a27074c21 --- /dev/null +++ b/src/wraith/src/test/test_storagedir.c @@ -0,0 +1,375 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "storagedir.h" +#include "test.h" + +#ifdef HAVE_UTIME_H +#include +#endif + +static void +test_storagedir_empty(void *arg) +{ + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + (void)arg; + + tt_int_op(FN_NOENT, OP_EQ, file_status(dirname)); + + d = storage_dir_new(dirname, 10); + tt_assert(d); + + tt_int_op(FN_DIR, OP_EQ, file_status(dirname)); + + tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + storage_dir_free(d); + d = storage_dir_new(dirname, 10); + tt_assert(d); + + tt_int_op(FN_DIR, OP_EQ, file_status(dirname)); + + tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + done: + storage_dir_free(d); + tor_free(dirname); +} + +static void +test_storagedir_basic(void *arg) +{ + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + uint8_t *junk = NULL, *bytes = NULL; + const size_t junklen = 1024; + char *fname1 = NULL, *fname2 = NULL; + const char hello_str[] = "then what are we but cold, alone ... ?"; + tor_mmap_t *mapping = NULL; + (void)arg; + + junk = tor_malloc(junklen); + crypto_rand((void*)junk, junklen); + + d = storage_dir_new(dirname, 10); + tt_assert(d); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + int r; + r = storage_dir_save_string_to_file(d, hello_str, 1, &fname1); + tt_int_op(r, OP_EQ, 0); + tt_ptr_op(fname1, OP_NE, NULL); + tt_u64_op(strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); + + r = storage_dir_save_bytes_to_file(d, junk, junklen, 1, &fname2); + tt_int_op(r, OP_EQ, 0); + tt_ptr_op(fname2, OP_NE, NULL); + + tt_str_op(fname1, OP_NE, fname2); + + tt_int_op(2, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(junklen + strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname1)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname2)); + + storage_dir_free(d); + d = storage_dir_new(dirname, 10); + tt_assert(d); + tt_int_op(2, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(junklen + strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname1)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname2)); + + size_t n; + bytes = storage_dir_read(d, fname2, 1, &n); + tt_assert(bytes); + tt_u64_op(n, OP_EQ, junklen); + tt_mem_op(bytes, OP_EQ, junk, junklen); + + mapping = storage_dir_map(d, fname1); + tt_assert(mapping); + tt_u64_op(mapping->size, OP_EQ, strlen(hello_str)); + tt_mem_op(mapping->data, OP_EQ, hello_str, strlen(hello_str)); + + done: + tor_free(dirname); + tor_free(junk); + tor_free(bytes); + tor_munmap_file(mapping); + storage_dir_free(d); + tor_free(fname1); + tor_free(fname2); +} + +static void +test_storagedir_deletion(void *arg) +{ + (void)arg; + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + char *fn1 = NULL, *fn2 = NULL; + char *bytes = NULL; + int r; + const char str1[] = "There are nine and sixty ways to disguise communiques"; + const char str2[] = "And rather more than one of them is right"; + + // Make sure the directory is there. */ + d = storage_dir_new(dirname, 10); + storage_dir_free(d); + d = NULL; + + tor_asprintf(&fn1, "%s/1007", dirname); + r = write_str_to_file(fn1, str1, 0); + tt_int_op(r, OP_EQ, 0); + + tor_asprintf(&fn2, "%s/1003.tmp", dirname); + r = write_str_to_file(fn2, str2, 0); + tt_int_op(r, OP_EQ, 0); + + // The tempfile should be deleted the next time we list the directory. + d = storage_dir_new(dirname, 10); + tt_int_op(1, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(strlen(str1), OP_EQ, storage_dir_get_usage(d)); + tt_int_op(FN_FILE, OP_EQ, file_status(fn1)); + tt_int_op(FN_NOENT, OP_EQ, file_status(fn2)); + + bytes = (char*) storage_dir_read(d, "1007", 1, NULL); + tt_str_op(bytes, OP_EQ, str1); + + // Should have no effect; file already gone. + storage_dir_remove_file(d, "1003.tmp"); + tt_int_op(1, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(strlen(str1), OP_EQ, storage_dir_get_usage(d)); + + // Actually remove a file. + storage_dir_remove_file(d, "1007"); + tt_int_op(FN_NOENT, OP_EQ, file_status(fn1)); + tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + done: + tor_free(dirname); + tor_free(fn1); + tor_free(fn2); + storage_dir_free(d); + tor_free(bytes); +} + +static void +test_storagedir_full(void *arg) +{ + (void)arg; + + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + const char str[] = "enemies of the peephole"; + int r; + + d = storage_dir_new(dirname, 3); + tt_assert(d); + + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, 0); + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, 0); + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, 0); + + // These should fail! + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, -1); + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, -1); + + tt_u64_op(strlen(str) * 3, OP_EQ, storage_dir_get_usage(d)); + + done: + tor_free(dirname); + storage_dir_free(d); +} + +static void +test_storagedir_cleaning(void *arg) +{ + (void)arg; + + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + const char str[] = + "On a mountain halfway between Reno and Rome / " + "We have a machine in a plexiglass dome / " + "Which listens and looks into everyone's home." + " -- Dr. Seuss"; + char *fns[8]; + int r, i; + + memset(fns, 0, sizeof(fns)); + d = storage_dir_new(dirname, 10); + tt_assert(d); + + for (i = 0; i < 8; ++i) { + r = storage_dir_save_string_to_file(d, str+i*2, 1, &fns[i]); + tt_int_op(r, OP_EQ, 0); + } + + /* Now we're going to make sure all the files have distinct mtimes. */ + time_t now = time(NULL); + struct utimbuf ub; + ub.actime = now; + ub.modtime = now - 1000; + for (i = 0; i < 8; ++i) { + char *f = NULL; + tor_asprintf(&f, "%s/%s", dirname, fns[i]); + r = utime(f, &ub); + tor_free(f); + tt_int_op(r, OP_EQ, 0); + ub.modtime += 5; + } + + const uint64_t usage_orig = storage_dir_get_usage(d); + /* No changes needed if we are already under target. */ + storage_dir_shrink(d, 1024*1024, 0); + tt_u64_op(usage_orig, OP_EQ, storage_dir_get_usage(d)); + + /* Get rid of at least one byte. This will delete fns[0]. */ + storage_dir_shrink(d, usage_orig - 1, 0); + tt_u64_op(usage_orig, OP_GT, storage_dir_get_usage(d)); + tt_u64_op(usage_orig - strlen(str), OP_EQ, storage_dir_get_usage(d)); + + /* Get rid of at least two files. This will delete fns[1] and fns[2]. */ + storage_dir_shrink(d, 1024*1024, 2); + tt_u64_op(usage_orig - strlen(str)*3 + 6, OP_EQ, storage_dir_get_usage(d)); + + /* Get rid of everything. */ + storage_dir_remove_all(d); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + done: + tor_free(dirname); + storage_dir_free(d); + for (i = 0; i < 8; ++i) { + tor_free(fns[i]); + } +} + +static void +test_storagedir_save_labeled(void *arg) +{ + (void)arg; + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + uint8_t *inp = tor_malloc_zero(8192); + config_line_t *labels = NULL; + char *fname = NULL; + uint8_t *saved = NULL; + + d = storage_dir_new(dirname, 10); + tt_assert(d); + + crypto_rand((char *)inp, 8192); + + config_line_append(&labels, "Foo", "bar baz"); + config_line_append(&labels, "quux", "quuzXxz"); + const char expected[] = + "Foo bar baz\n" + "quux quuzXxz\n"; + + int r = storage_dir_save_labeled_to_file(d, labels, inp, 8192, &fname); + tt_int_op(r, OP_EQ, 0); + + size_t n; + saved = storage_dir_read(d, fname, 1, &n); + tt_assert(memchr(saved, '\0', n)); + tt_str_op((char*)saved, OP_EQ, expected); /* NUL guarantees strcmp works */ + tt_mem_op(saved+strlen(expected)+1, OP_EQ, inp, 8192); + + done: + storage_dir_free(d); + tor_free(dirname); + tor_free(inp); + tor_free(fname); + config_free_lines(labels); + tor_free(saved); +} + +static void +test_storagedir_read_labeled(void *arg) +{ + (void)arg; + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + uint8_t *inp = tor_malloc_zero(8192); + config_line_t *labels = NULL, *labels2 = NULL; + char *fname = NULL; + tor_mmap_t *map = NULL; + uint8_t *as_read = NULL; + + d = storage_dir_new(dirname, 10); + tt_assert(d); + + tor_snprintf((char*)inp, 8192, + "Hello world\n" + "This is a test\n" + "Yadda yadda.\n"); + size_t bodylen = 8192 - strlen((char*)inp) - 1; + crypto_rand((char *)inp+strlen((char*)inp)+1, bodylen); + + int r = storage_dir_save_bytes_to_file(d, inp, 8192, 1, &fname); + tt_int_op(r, OP_EQ, 0); + + /* Try mapping */ + const uint8_t *datap = NULL; + size_t sz = 0; + map = storage_dir_map_labeled(d, fname, &labels, &datap, &sz); + tt_assert(map); + tt_assert(datap); + tt_u64_op(sz, OP_EQ, bodylen); + tt_mem_op(datap, OP_EQ, inp+strlen((char*)inp)+1, bodylen); + tt_assert(labels); + tt_str_op(labels->key, OP_EQ, "Hello"); + tt_str_op(labels->value, OP_EQ, "world"); + tt_assert(labels->next); + tt_str_op(labels->next->key, OP_EQ, "This"); + tt_str_op(labels->next->value, OP_EQ, "is a test"); + tt_assert(labels->next->next); + tt_str_op(labels->next->next->key, OP_EQ, "Yadda"); + tt_str_op(labels->next->next->value, OP_EQ, "yadda."); + tt_ptr_op(labels->next->next->next, OP_EQ, NULL); + + /* Try reading this time. */ + sz = 0; + as_read = storage_dir_read_labeled(d, fname, &labels2, &sz); + tt_assert(as_read); + tt_u64_op(sz, OP_EQ, bodylen); + tt_mem_op(as_read, OP_EQ, inp+strlen((char*)inp)+1, bodylen); + tt_assert(config_lines_eq(labels, labels2)); + + done: + storage_dir_free(d); + tor_free(dirname); + tor_free(inp); + tor_free(fname); + config_free_lines(labels); + config_free_lines(labels2); + tor_munmap_file(map); + tor_free(as_read); +} + +#define ENT(name) \ + { #name, test_storagedir_ ## name, TT_FORK, NULL, NULL } + +struct testcase_t storagedir_tests[] = { + ENT(empty), + ENT(basic), + ENT(deletion), + ENT(full), + ENT(cleaning), + ENT(save_labeled), + ENT(read_labeled), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_switch_id.c b/src/wraith/src/test/test_switch_id.c new file mode 100644 index 000000000..fe36d8c6e --- /dev/null +++ b/src/wraith/src/test/test_switch_id.c @@ -0,0 +1,192 @@ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" + +#ifdef HAVE_SYS_CAPABILITY_H +#include +#endif + +#define TEST_BUILT_WITH_CAPS 0 +#define TEST_HAVE_CAPS 1 +#define TEST_ROOT_CAN_BIND_LOW 2 +#define TEST_SETUID 3 +#define TEST_SETUID_KEEPCAPS 4 +#define TEST_SETUID_STRICT 5 + +static const struct { + const char *name; + int test_id; +} which_test[] = { + { "built-with-caps", TEST_BUILT_WITH_CAPS }, + { "have-caps", TEST_HAVE_CAPS }, + { "root-bind-low", TEST_ROOT_CAN_BIND_LOW }, + { "setuid", TEST_SETUID }, + { "setuid-keepcaps", TEST_SETUID_KEEPCAPS }, + { "setuid-strict", TEST_SETUID_STRICT }, + { NULL, 0 } +}; + +#if !defined(_WIN32) +/* 0 on no, 1 on yes, -1 on failure. */ +static int +check_can_bind_low_ports(void) +{ + int port; + struct sockaddr_in sin; + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + + for (port = 600; port < 1024; ++port) { + sin.sin_port = htons(port); + tor_socket_t fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (! SOCKET_OK(fd)) { + perror("socket"); + return -1; + } + + int one = 1; + if (setsockopt(fd, SOL_SOCKET,SO_REUSEADDR, (void*)&one, + (socklen_t)sizeof(one))) { + perror("setsockopt"); + tor_close_socket_simple(fd); + return -1; + } + + int res = bind(fd, (struct sockaddr *)&sin, sizeof(sin)); + tor_close_socket_simple(fd); + + if (res == 0) { + /* bind was successful */ + return 1; + } else if (errno == EACCES || errno == EPERM) { + /* Got a permission-denied error. */ + return 0; + } else if (errno == EADDRINUSE) { + /* Huh; somebody is using that port. */ + } else { + perror("bind"); + } + } + + return -1; +} +#endif /* !defined(_WIN32) */ + +int +main(int argc, char **argv) +{ +#if defined(_WIN32) + (void) argc; + (void) argv; + (void) which_test; + + fprintf(stderr, "This test is not supported on your OS.\n"); + return 77; +#else /* !(defined(_WIN32)) */ + const char *username; + const char *testname; + if (argc != 3) { + fprintf(stderr, "I want 2 arguments: a username and a command.\n"); + return 1; + } + if (getuid() != 0) { + fprintf(stderr, "This test only works when it's run as root.\n"); + return 1; + } + username = argv[1]; + testname = argv[2]; + int test_id = -1; + int i; + for (i = 0; which_test[i].name; ++i) { + if (!strcmp(which_test[i].name, testname)) { + test_id = which_test[i].test_id; + break; + } + } + if (test_id == -1) { + fprintf(stderr, "Unrecognized test '%s'\n", testname); + return 1; + } + +#ifdef HAVE_LINUX_CAPABILITIES + const int have_cap_support = 1; +#else + const int have_cap_support = 0; +#endif + + int okay; + + init_logging(1); + log_severity_list_t sev; + memset(&sev, 0, sizeof(sev)); + set_log_severity_config(LOG_WARN, LOG_ERR, &sev); + add_stream_log(&sev, "", fileno(stderr)); + + switch (test_id) + { + case TEST_BUILT_WITH_CAPS: + /* Succeed if we were built with capability support. */ + okay = have_cap_support; + break; + case TEST_HAVE_CAPS: + /* Succeed if "capabilities work" == "we were built with capability + * support." */ + okay = have_cap_support == have_capability_support(); + break; + case TEST_ROOT_CAN_BIND_LOW: + /* Succeed if root can bind low ports. */ + okay = check_can_bind_low_ports() == 1; + break; + case TEST_SETUID: + /* Succeed if we can do a setuid with no capability retention, and doing + * so makes us lose the ability to bind low ports */ + case TEST_SETUID_KEEPCAPS: + /* Succeed if we can do a setuid with capability retention, and doing so + * does not make us lose the ability to bind low ports */ + { + int keepcaps = (test_id == TEST_SETUID_KEEPCAPS); + okay = switch_id(username, keepcaps ? SWITCH_ID_KEEP_BINDLOW : 0) == 0; + if (okay) { + okay = check_can_bind_low_ports() == keepcaps; + } + break; + } + case TEST_SETUID_STRICT: + /* Succeed if, after a setuid, we cannot setuid back, and we cannot + * re-grab any capabilities. */ + okay = switch_id(username, SWITCH_ID_KEEP_BINDLOW) == 0; + if (okay) { + /* We'd better not be able to setuid back! */ + if (setuid(0) == 0 || errno != EPERM) { + okay = 0; + } + } +#ifdef HAVE_LINUX_CAPABILITIES + if (okay) { + cap_t caps = cap_get_proc(); + const cap_value_t caplist[] = { + CAP_SETUID, + }; + cap_set_flag(caps, CAP_PERMITTED, 1, caplist, CAP_SET); + if (cap_set_proc(caps) == 0 || errno != EPERM) { + okay = 0; + } + cap_free(caps); + } +#endif /* defined(HAVE_LINUX_CAPABILITIES) */ + break; + default: + fprintf(stderr, "Unsupported test '%s'\n", testname); + okay = 0; + break; + } + + if (!okay) { + fprintf(stderr, "Test %s failed!\n", testname); + } + + return (okay ? 0 : 1); +#endif /* defined(_WIN32) */ +} + diff --git a/src/wraith/src/test/test_switch_id.sh b/src/wraith/src/test/test_switch_id.sh new file mode 100644 index 000000000..79c44f2eb --- /dev/null +++ b/src/wraith/src/test/test_switch_id.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +if test "`id -u`" != '0'; then + echo "This test only works when run as root. Skipping." >&2 + exit 77 +fi + +if test "`id -u nobody`" = ""; then + echo "This test requires that your system have a 'nobody' user. Sorry." >&2 + exit 1 +fi + +if test "$OVERRIDE_GCDA_PERMISSIONS_HACK" = "yes"; then + find src -type f -name '*gcda' -print0 | xargs -0 chmod 0666 +fi + +"${builddir:-.}/src/test/test-switch-id" nobody setuid || exit 1 +"${builddir:-.}/src/test/test-switch-id" nobody root-bind-low || exit 1 +"${builddir:-.}/src/test/test-switch-id" nobody setuid-strict || exit 1 +"${builddir:-.}/src/test/test-switch-id" nobody built-with-caps || exit 0 +# ... Go beyond this point only if we were built with capability support. + +"${builddir:-.}/src/test/test-switch-id" nobody have-caps || exit 1 +"${builddir:-.}/src/test/test-switch-id" nobody setuid-keepcaps || exit 1 + +if test "$OVERRIDE_GCDA_PERMISSIONS_HACK" = "yes"; then + find src -type f -name '*gcda' -print0 | xargs -0 chmod 0644 +fi + +echo "All okay" + +exit 0 diff --git a/src/wraith/src/test/test_threads.c b/src/wraith/src/test/test_threads.c new file mode 100644 index 000000000..ed6d8f04a --- /dev/null +++ b/src/wraith/src/test/test_threads.c @@ -0,0 +1,304 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" +#include "compat_threads.h" +#include "test.h" + +/** mutex for thread test to stop the threads hitting data at the same time. */ +static tor_mutex_t *thread_test_mutex_ = NULL; +/** mutexes for the thread test to make sure that the threads have to + * interleave somewhat. */ +static tor_mutex_t *thread_test_start1_ = NULL, + *thread_test_start2_ = NULL; +/** Shared strmap for the thread test. */ +static strmap_t *thread_test_strmap_ = NULL; +/** The name of thread1 for the thread test */ +static char *thread1_name_ = NULL; +/** The name of thread2 for the thread test */ +static char *thread2_name_ = NULL; + +static int thread_fns_failed = 0; + +static unsigned long thread_fn_tid1, thread_fn_tid2; + +static void thread_test_func_(void* _s) ATTR_NORETURN; + +/** How many iterations have the threads in the unit test run? */ +static tor_threadlocal_t count; + +/** Helper function for threading unit tests: This function runs in a + * subthread. It grabs its own mutex (start1 or start2) to make sure that it + * should start, then it repeatedly alters _test_thread_strmap protected by + * thread_test_mutex_. */ +static void +thread_test_func_(void* _s) +{ + char *s = _s; + int i; + tor_mutex_t *m; + char buf[64]; + char **cp; + int *mycount = tor_malloc_zero(sizeof(int)); + tor_threadlocal_set(&count, mycount); + if (!strcmp(s, "thread 1")) { + m = thread_test_start1_; + cp = &thread1_name_; + thread_fn_tid1 = tor_get_thread_id(); + } else { + m = thread_test_start2_; + cp = &thread2_name_; + thread_fn_tid2 = tor_get_thread_id(); + } + + tor_snprintf(buf, sizeof(buf), "%lu", tor_get_thread_id()); + *cp = tor_strdup(buf); + + tor_mutex_acquire(m); + + for (i=0; i<10000; ++i) { + tor_mutex_acquire(thread_test_mutex_); + strmap_set(thread_test_strmap_, "last to run", *cp); + tor_mutex_release(thread_test_mutex_); + int *tls_count = tor_threadlocal_get(&count); + tor_assert(tls_count == mycount); + ++*tls_count; + } + tor_mutex_acquire(thread_test_mutex_); + strmap_set(thread_test_strmap_, s, *cp); + if (in_main_thread()) + ++thread_fns_failed; + tor_mutex_release(thread_test_mutex_); + + tor_free(mycount); + + tor_mutex_release(m); + + spawn_exit(); +} + +/** Run unit tests for threading logic. */ +static void +test_threads_basic(void *arg) +{ + char *s1 = NULL, *s2 = NULL; + int done = 0, timedout = 0; + time_t started; + (void) arg; + tt_int_op(tor_threadlocal_init(&count), OP_EQ, 0); + + set_main_thread(); + + thread_test_mutex_ = tor_mutex_new(); + thread_test_start1_ = tor_mutex_new(); + thread_test_start2_ = tor_mutex_new(); + thread_test_strmap_ = strmap_new(); + s1 = tor_strdup("thread 1"); + s2 = tor_strdup("thread 2"); + tor_mutex_acquire(thread_test_start1_); + tor_mutex_acquire(thread_test_start2_); + spawn_func(thread_test_func_, s1); + spawn_func(thread_test_func_, s2); + tor_mutex_release(thread_test_start2_); + tor_mutex_release(thread_test_start1_); + started = time(NULL); + while (!done) { + tor_mutex_acquire(thread_test_mutex_); + strmap_assert_ok(thread_test_strmap_); + if (strmap_get(thread_test_strmap_, "thread 1") && + strmap_get(thread_test_strmap_, "thread 2")) { + done = 1; + } else if (time(NULL) > started + 150) { + timedout = done = 1; + } + tor_mutex_release(thread_test_mutex_); + /* Prevent the main thread from starving the worker threads. */ + tor_sleep_msec(10); + } + tor_mutex_acquire(thread_test_start1_); + tor_mutex_release(thread_test_start1_); + tor_mutex_acquire(thread_test_start2_); + tor_mutex_release(thread_test_start2_); + + tor_mutex_free(thread_test_mutex_); + + if (timedout) { + tt_assert(strmap_get(thread_test_strmap_, "thread 1")); + tt_assert(strmap_get(thread_test_strmap_, "thread 2")); + tt_assert(!timedout); + } + + /* different thread IDs. */ + tt_assert(strcmp(strmap_get(thread_test_strmap_, "thread 1"), + strmap_get(thread_test_strmap_, "thread 2"))); + tt_assert(!strcmp(strmap_get(thread_test_strmap_, "thread 1"), + strmap_get(thread_test_strmap_, "last to run")) || + !strcmp(strmap_get(thread_test_strmap_, "thread 2"), + strmap_get(thread_test_strmap_, "last to run"))); + + tt_int_op(thread_fns_failed, OP_EQ, 0); + tt_int_op(thread_fn_tid1, OP_NE, thread_fn_tid2); + + done: + tor_free(s1); + tor_free(s2); + tor_free(thread1_name_); + tor_free(thread2_name_); + if (thread_test_strmap_) + strmap_free(thread_test_strmap_, NULL); + if (thread_test_start1_) + tor_mutex_free(thread_test_start1_); + if (thread_test_start2_) + tor_mutex_free(thread_test_start2_); +} + +typedef struct cv_testinfo_s { + tor_cond_t *cond; + tor_mutex_t *mutex; + int value; + int addend; + int shutdown; + int n_shutdown; + int n_wakeups; + int n_timeouts; + int n_threads; + const struct timeval *tv; +} cv_testinfo_t; + +static cv_testinfo_t * +cv_testinfo_new(void) +{ + cv_testinfo_t *i = tor_malloc_zero(sizeof(*i)); + i->cond = tor_cond_new(); + i->mutex = tor_mutex_new_nonrecursive(); + return i; +} + +static void +cv_testinfo_free(cv_testinfo_t *i) +{ + if (!i) + return; + tor_cond_free(i->cond); + tor_mutex_free(i->mutex); + tor_free(i); +} + +static void cv_test_thr_fn_(void *arg) ATTR_NORETURN; + +static void +cv_test_thr_fn_(void *arg) +{ + cv_testinfo_t *i = arg; + int tid, r; + + tor_mutex_acquire(i->mutex); + tid = i->n_threads++; + tor_mutex_release(i->mutex); + (void) tid; + + tor_mutex_acquire(i->mutex); + while (1) { + if (i->addend) { + i->value += i->addend; + i->addend = 0; + } + + if (i->shutdown) { + ++i->n_shutdown; + i->shutdown = 0; + tor_mutex_release(i->mutex); + spawn_exit(); + } + r = tor_cond_wait(i->cond, i->mutex, i->tv); + ++i->n_wakeups; + if (r == 1) { + ++i->n_timeouts; + tor_mutex_release(i->mutex); + spawn_exit(); + } + } +} + +static void +test_threads_conditionvar(void *arg) +{ + cv_testinfo_t *ti=NULL; + const struct timeval msec100 = { 0, 100*1000 }; + const int timeout = !strcmp(arg, "tv"); + + ti = cv_testinfo_new(); + if (timeout) { + ti->tv = &msec100; + } + spawn_func(cv_test_thr_fn_, ti); + spawn_func(cv_test_thr_fn_, ti); + spawn_func(cv_test_thr_fn_, ti); + spawn_func(cv_test_thr_fn_, ti); + + tor_mutex_acquire(ti->mutex); + ti->addend = 7; + ti->shutdown = 1; + tor_cond_signal_one(ti->cond); + tor_mutex_release(ti->mutex); + +#define SPIN() \ + while (1) { \ + tor_mutex_acquire(ti->mutex); \ + if (ti->addend == 0) { \ + break; \ + } \ + tor_mutex_release(ti->mutex); \ + } + + SPIN(); + + ti->addend = 30; + ti->shutdown = 1; + tor_cond_signal_all(ti->cond); + tor_mutex_release(ti->mutex); + SPIN(); + + ti->addend = 1000; + if (! timeout) ti->shutdown = 1; + tor_cond_signal_one(ti->cond); + tor_mutex_release(ti->mutex); + SPIN(); + ti->addend = 300; + if (! timeout) ti->shutdown = 1; + tor_cond_signal_all(ti->cond); + tor_mutex_release(ti->mutex); + + SPIN(); + tor_mutex_release(ti->mutex); + + tt_int_op(ti->value, OP_EQ, 1337); + if (!timeout) { + tt_int_op(ti->n_shutdown, OP_EQ, 4); + } else { + tor_sleep_msec(200); + tor_mutex_acquire(ti->mutex); + tt_int_op(ti->n_shutdown, OP_EQ, 2); + tt_int_op(ti->n_timeouts, OP_EQ, 2); + tor_mutex_release(ti->mutex); + } + + done: + cv_testinfo_free(ti); +} + +#define THREAD_TEST(name) \ + { #name, test_threads_##name, TT_FORK, NULL, NULL } + +struct testcase_t thread_tests[] = { + THREAD_TEST(basic), + { "conditionvar", test_threads_conditionvar, TT_FORK, + &passthrough_setup, (void*)"no-tv" }, + { "conditionvar_timeout", test_threads_conditionvar, TT_FORK, + &passthrough_setup, (void*)"tv" }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_tortls.c b/src/wraith/src/test/test_tortls.c new file mode 100644 index 000000000..29f7cc9c3 --- /dev/null +++ b/src/wraith/src/test/test_tortls.c @@ -0,0 +1,2827 @@ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define TORTLS_PRIVATE +#define TORTLS_OPENSSL_PRIVATE +#define LOG_PRIVATE +#include "orconfig.h" + +#ifdef _WIN32 +#include +#endif +#include + +#include "compat.h" + +/* Some versions of OpenSSL declare SSL_get_selected_srtp_profile twice in + * srtp.h. Suppress the GCC warning so we can build with -Wredundant-decl. */ +DISABLE_GCC_WARNING(redundant-decls) + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +ENABLE_GCC_WARNING(redundant-decls) + +#include "or.h" +#include "torlog.h" +#include "config.h" +#include "tortls.h" + +#include "test.h" +#include "log_test_helpers.h" +#define NS_MODULE tortls + +#ifndef HAVE_SSL_STATE +#define OPENSSL_OPAQUE +#endif + +#if defined(OPENSSL_OPAQUE) && !defined(LIBRESSL_VERSION_NUMBER) +#define SSL_STATE_STR "before SSL initialization" +#else +#define SSL_STATE_STR "before/accept initialization" +#endif + +#ifndef OPENSSL_OPAQUE +static SSL_METHOD * +give_me_a_test_method(void) +{ + SSL_METHOD *method = tor_malloc_zero(sizeof(SSL_METHOD)); + memcpy(method, TLSv1_method(), sizeof(SSL_METHOD)); + return method; +} + +static int +fake_num_ciphers(void) +{ + return 0; +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +static void +test_tortls_errno_to_tls_error(void *data) +{ + (void) data; + tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ECONNRESET)),OP_EQ, + TOR_TLS_ERROR_CONNRESET); + tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ETIMEDOUT)),OP_EQ, + TOR_TLS_ERROR_TIMEOUT); + tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(EHOSTUNREACH)),OP_EQ, + TOR_TLS_ERROR_NO_ROUTE); + tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ENETUNREACH)),OP_EQ, + TOR_TLS_ERROR_NO_ROUTE); + tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ECONNREFUSED)),OP_EQ, + TOR_TLS_ERROR_CONNREFUSED); + tt_int_op(tor_errno_to_tls_error(0),OP_EQ,TOR_TLS_ERROR_MISC); + done: + (void)1; +} + +static void +test_tortls_err_to_string(void *data) +{ + (void) data; + tt_str_op(tor_tls_err_to_string(1),OP_EQ,"[Not an error.]"); + tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_MISC),OP_EQ,"misc error"); + tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_IO),OP_EQ,"unexpected close"); + tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_CONNREFUSED),OP_EQ, + "connection refused"); + tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_CONNRESET),OP_EQ, + "connection reset"); + tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_NO_ROUTE),OP_EQ, + "host unreachable"); + tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_TIMEOUT),OP_EQ, + "connection timed out"); + tt_str_op(tor_tls_err_to_string(TOR_TLS_CLOSE),OP_EQ,"closed"); + tt_str_op(tor_tls_err_to_string(TOR_TLS_WANTREAD),OP_EQ,"want to read"); + tt_str_op(tor_tls_err_to_string(TOR_TLS_WANTWRITE),OP_EQ,"want to write"); + tt_str_op(tor_tls_err_to_string(-100),OP_EQ,"(unknown error code)"); + done: + (void)1; +} + +static int +mock_tls_cert_matches_key(const tor_tls_t *tls, const tor_x509_cert_t *cert) +{ + (void) tls; + (void) cert; // XXXX look at this. + return 1; +} + +static void +test_tortls_tor_tls_new(void *data) +{ + (void) data; + MOCK(tor_tls_cert_matches_key, mock_tls_cert_matches_key); + crypto_pk_t *key1 = NULL, *key2 = NULL; + SSL_METHOD *method = NULL; + + key1 = pk_generate(2); + key2 = pk_generate(3); + + tor_tls_t *tls = NULL; + tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, + key1, key2, 86400), OP_EQ, 0); + tls = tor_tls_new(-1, 0); + tt_want(tls); + tor_tls_free(tls); tls = NULL; + + SSL_CTX_free(client_tls_context->ctx); + client_tls_context->ctx = NULL; + tls = tor_tls_new(-1, 0); + tt_ptr_op(tls, OP_EQ, NULL); + +#ifndef OPENSSL_OPAQUE + method = give_me_a_test_method(); + SSL_CTX *ctx = SSL_CTX_new(method); + method->num_ciphers = fake_num_ciphers; + client_tls_context->ctx = ctx; + tls = tor_tls_new(-1, 0); + tt_ptr_op(tls, OP_EQ, NULL); +#endif /* !defined(OPENSSL_OPAQUE) */ + + done: + UNMOCK(tor_tls_cert_matches_key); + crypto_pk_free(key1); + crypto_pk_free(key2); + tor_tls_free(tls); + tor_free(method); + tor_tls_free_all(); +} + +#define NS_MODULE tortls +NS_DECL(void, logv, (int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, + const char *format, va_list ap)); + +static void +NS(logv)(int severity, log_domain_mask_t domain, + const char *funcname, const char *suffix, const char *format, + va_list ap) +{ + (void) severity; + (void) domain; + (void) funcname; + (void) suffix; + (void) format; + (void) ap; // XXXX look at this. + CALLED(logv)++; +} + +static void +test_tortls_tor_tls_get_error(void *data) +{ + (void) data; + MOCK(tor_tls_cert_matches_key, mock_tls_cert_matches_key); + crypto_pk_t *key1 = NULL, *key2 = NULL; + key1 = pk_generate(2); + key2 = pk_generate(3); + + tor_tls_t *tls = NULL; + tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, + key1, key2, 86400), OP_EQ, 0); + tls = tor_tls_new(-1, 0); + NS_MOCK(logv); + tt_int_op(CALLED(logv), OP_EQ, 0); + tor_tls_get_error(tls, 0, 0, + (const char *)"test", 0, 0); + tt_int_op(CALLED(logv), OP_EQ, 1); + + done: + UNMOCK(tor_tls_cert_matches_key); + NS_UNMOCK(logv); + crypto_pk_free(key1); + crypto_pk_free(key2); + tor_tls_free(tls); +} + +static void +test_tortls_get_state_description(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + char *buf; + SSL_CTX *ctx; + + SSL_library_init(); + SSL_load_error_strings(); + + ctx = SSL_CTX_new(SSLv23_method()); + + buf = tor_malloc_zero(1000); + tls = tor_malloc_zero(sizeof(tor_tls_t)); + + tor_tls_get_state_description(NULL, buf, 20); + tt_str_op(buf, OP_EQ, "(No SSL object)"); + + SSL_free(tls->ssl); + tls->ssl = NULL; + tor_tls_get_state_description(tls, buf, 20); + tt_str_op(buf, OP_EQ, "(No SSL object)"); + + tls->ssl = SSL_new(ctx); + tor_tls_get_state_description(tls, buf, 200); + tt_str_op(buf, OP_EQ, SSL_STATE_STR " in HANDSHAKE"); + + tls->state = TOR_TLS_ST_OPEN; + tor_tls_get_state_description(tls, buf, 200); + tt_str_op(buf, OP_EQ, SSL_STATE_STR " in OPEN"); + + tls->state = TOR_TLS_ST_GOTCLOSE; + tor_tls_get_state_description(tls, buf, 200); + tt_str_op(buf, OP_EQ, SSL_STATE_STR " in GOTCLOSE"); + + tls->state = TOR_TLS_ST_SENTCLOSE; + tor_tls_get_state_description(tls, buf, 200); + tt_str_op(buf, OP_EQ, SSL_STATE_STR " in SENTCLOSE"); + + tls->state = TOR_TLS_ST_CLOSED; + tor_tls_get_state_description(tls, buf, 200); + tt_str_op(buf, OP_EQ, SSL_STATE_STR " in CLOSED"); + + tls->state = TOR_TLS_ST_RENEGOTIATE; + tor_tls_get_state_description(tls, buf, 200); + tt_str_op(buf, OP_EQ, SSL_STATE_STR " in RENEGOTIATE"); + + tls->state = TOR_TLS_ST_BUFFEREVENT; + tor_tls_get_state_description(tls, buf, 200); + tt_str_op(buf, OP_EQ, SSL_STATE_STR); + + tls->state = 7; + tor_tls_get_state_description(tls, buf, 200); + tt_str_op(buf, OP_EQ, SSL_STATE_STR " in unknown TLS state"); + + done: + SSL_CTX_free(ctx); + SSL_free(tls->ssl); + tor_free(buf); + tor_free(tls); +} + +static void +test_tortls_get_by_ssl(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + tor_tls_t *res; + SSL_CTX *ctx; + SSL *ssl; + + SSL_library_init(); + SSL_load_error_strings(); + tor_tls_allocate_tor_tls_object_ex_data_index(); + + ctx = SSL_CTX_new(SSLv23_method()); + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->magic = TOR_TLS_MAGIC; + + ssl = SSL_new(ctx); + + res = tor_tls_get_by_ssl(ssl); + tt_assert(!res); + + SSL_set_ex_data(ssl, tor_tls_object_ex_data_index, tls); + + res = tor_tls_get_by_ssl(ssl); + tt_assert(res == tls); + + done: + SSL_free(ssl); + SSL_CTX_free(ctx); + tor_free(tls); +} + +static void +test_tortls_allocate_tor_tls_object_ex_data_index(void *ignored) +{ + (void)ignored; + int first; + + tor_tls_allocate_tor_tls_object_ex_data_index(); + + first = tor_tls_object_ex_data_index; + tor_tls_allocate_tor_tls_object_ex_data_index(); + tt_int_op(first, OP_EQ, tor_tls_object_ex_data_index); + + done: + (void)0; +} + +static void +test_tortls_log_one_error(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + SSL_CTX *ctx; + SSL *ssl = NULL; + + SSL_library_init(); + SSL_load_error_strings(); + + ctx = SSL_CTX_new(SSLv23_method()); + tls = tor_malloc_zero(sizeof(tor_tls_t)); + setup_capture_of_logs(LOG_INFO); + + tor_tls_log_one_error(NULL, 0, LOG_WARN, 0, "something"); + expect_log_msg("TLS error while something: " + "(null) (in (null):(null):---)\n"); + + mock_clean_saved_logs(); + tor_tls_log_one_error(tls, 0, LOG_WARN, 0, NULL); + expect_log_msg("TLS error: (null) " + "(in (null):(null):---)\n"); + + mock_clean_saved_logs(); + tls->address = tor_strdup("127.hello"); + tor_tls_log_one_error(tls, 0, LOG_WARN, 0, NULL); + expect_log_msg("TLS error with 127.hello: " + "(null) (in (null):(null):---)\n"); + tor_free(tls->address); + + mock_clean_saved_logs(); + tls->address = tor_strdup("127.hello"); + tor_tls_log_one_error(tls, 0, LOG_WARN, 0, "blarg"); + expect_log_msg("TLS error while blarg with " + "127.hello: (null) (in (null):(null):---)\n"); + + mock_clean_saved_logs(); + tor_tls_log_one_error(tls, ERR_PACK(1, 2, 3), LOG_WARN, 0, NULL); + expect_log_msg("TLS error with 127.hello: " + "BN lib (in unknown library:(null):---)\n"); + + mock_clean_saved_logs(); + tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_HTTP_REQUEST), + LOG_WARN, 0, NULL); + expect_log_severity(LOG_INFO); + + mock_clean_saved_logs(); + tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_HTTPS_PROXY_REQUEST), + LOG_WARN, 0, NULL); + expect_log_severity(LOG_INFO); + + mock_clean_saved_logs(); + tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_RECORD_LENGTH_MISMATCH), + LOG_WARN, 0, NULL); + expect_log_severity(LOG_INFO); + +#ifndef OPENSSL_1_1_API + mock_clean_saved_logs(); + tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_RECORD_TOO_LARGE), + LOG_WARN, 0, NULL); + expect_log_severity(LOG_INFO); +#endif /* !defined(OPENSSL_1_1_API) */ + + mock_clean_saved_logs(); + tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_UNKNOWN_PROTOCOL), + LOG_WARN, 0, NULL); + expect_log_severity(LOG_INFO); + + mock_clean_saved_logs(); + tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_UNSUPPORTED_PROTOCOL), + LOG_WARN, 0, NULL); + expect_log_severity(LOG_INFO); + + tls->ssl = SSL_new(ctx); + + mock_clean_saved_logs(); + tor_tls_log_one_error(tls, 0, LOG_WARN, 0, NULL); + expect_log_msg("TLS error with 127.hello: (null)" + " (in (null):(null):" SSL_STATE_STR ")\n"); + + done: + teardown_capture_of_logs(); + SSL_free(ssl); + SSL_CTX_free(ctx); + if (tls && tls->ssl) + SSL_free(tls->ssl); + if (tls) + tor_free(tls->address); + tor_free(tls); +} + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_get_error(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + int ret; + SSL_CTX *ctx; + + SSL_library_init(); + SSL_load_error_strings(); + + ctx = SSL_CTX_new(SSLv23_method()); + setup_capture_of_logs(LOG_INFO); + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = SSL_new(ctx); + SSL_set_bio(tls->ssl, BIO_new(BIO_s_mem()), NULL); + + ret = tor_tls_get_error(tls, 0, 0, "something", LOG_WARN, 0); + tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_IO); + expect_log_msg("TLS error: unexpected close while" + " something (before/accept initialization)\n"); + + mock_clean_saved_logs(); + ret = tor_tls_get_error(tls, 2, 0, "something", LOG_WARN, 0); + tt_int_op(ret, OP_EQ, 0); + expect_no_log_entry(); + + mock_clean_saved_logs(); + ret = tor_tls_get_error(tls, 0, 1, "something", LOG_WARN, 0); + tt_int_op(ret, OP_EQ, -11); + expect_no_log_entry(); + + mock_clean_saved_logs(); + ERR_clear_error(); + ERR_put_error(ERR_LIB_BN, 2, -1, "somewhere.c", 99); + ret = tor_tls_get_error(tls, 0, 0, "something", LOG_WARN, 0); + tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); + expect_log_msg("TLS error while something: (null)" + " (in bignum routines:(null):before/accept initialization)\n"); + + mock_clean_saved_logs(); + ERR_clear_error(); + tls->ssl->rwstate = SSL_READING; + SSL_get_rbio(tls->ssl)->flags = BIO_FLAGS_READ; + ret = tor_tls_get_error(tls, -1, 0, "something", LOG_WARN, 0); + tt_int_op(ret, OP_EQ, TOR_TLS_WANTREAD); + expect_no_log_entry(); + + mock_clean_saved_logs(); + ERR_clear_error(); + tls->ssl->rwstate = SSL_READING; + SSL_get_rbio(tls->ssl)->flags = BIO_FLAGS_WRITE; + ret = tor_tls_get_error(tls, -1, 0, "something", LOG_WARN, 0); + tt_int_op(ret, OP_EQ, TOR_TLS_WANTWRITE); + expect_no_log_entry(); + + mock_clean_saved_logs(); + ERR_clear_error(); + tls->ssl->rwstate = 0; + tls->ssl->shutdown = SSL_RECEIVED_SHUTDOWN; + tls->ssl->s3->warn_alert =SSL_AD_CLOSE_NOTIFY; + ret = tor_tls_get_error(tls, 0, 0, "something", LOG_WARN, 0); + tt_int_op(ret, OP_EQ, TOR_TLS_CLOSE); + expect_log_entry(); + + mock_clean_saved_logs(); + ret = tor_tls_get_error(tls, 0, 2, "something", LOG_WARN, 0); + tt_int_op(ret, OP_EQ, -10); + expect_no_log_entry(); + + mock_clean_saved_logs(); + ERR_put_error(ERR_LIB_SYS, 2, -1, "somewhere.c", 99); + ret = tor_tls_get_error(tls, -1, 0, "something", LOG_WARN, 0); + tt_int_op(ret, OP_EQ, -9); + expect_log_msg("TLS error while something: (null) (in system library:" + "connect:before/accept initialization)\n"); + + done: + teardown_capture_of_logs(); + SSL_free(tls->ssl); + tor_free(tls); + SSL_CTX_free(ctx); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +static void +test_tortls_always_accept_verify_cb(void *ignored) +{ + (void)ignored; + int ret; + + ret = always_accept_verify_cb(0, NULL); + tt_int_op(ret, OP_EQ, 1); + + done: + (void)0; +} + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_x509_cert_free(void *ignored) +{ + (void)ignored; + tor_x509_cert_t *cert; + + cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); + tor_x509_cert_free(cert); + + cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); + cert->cert = tor_malloc_zero(sizeof(X509)); + cert->encoded = tor_malloc_zero(1); + tor_x509_cert_free(cert); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +static void +test_tortls_x509_cert_get_id_digests(void *ignored) +{ + (void)ignored; + tor_x509_cert_t *cert; + common_digests_t *d; + const common_digests_t *res; + cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); + d = tor_malloc_zero(sizeof(common_digests_t)); + d->d[0][0] = 42; + + res = tor_x509_cert_get_id_digests(cert); + tt_assert(!res); + + cert->pkey_digests_set = 1; + cert->pkey_digests = *d; + res = tor_x509_cert_get_id_digests(cert); + tt_int_op(res->d[0][0], OP_EQ, 42); + + done: + tor_free(cert); + tor_free(d); +} + +#ifndef OPENSSL_OPAQUE +static int +fixed_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) +{ + (void) a; (void) b; + return 1; +} + +static void +fake_x509_free(X509 *cert) +{ + if (cert) { + if (cert->cert_info) { + if (cert->cert_info->key) { + if (cert->cert_info->key->pkey) { + tor_free(cert->cert_info->key->pkey); + } + tor_free(cert->cert_info->key); + } + tor_free(cert->cert_info); + } + tor_free(cert); + } +} + +static void +test_tortls_cert_matches_key(void *ignored) +{ + (void)ignored; + int res; + tor_tls_t *tls; + tor_x509_cert_t *cert; + X509 *one = NULL, *two = NULL; + EVP_PKEY_ASN1_METHOD *meth = EVP_PKEY_asn1_new(999, 0, NULL, NULL); + EVP_PKEY_asn1_set_public(meth, NULL, NULL, fixed_pub_cmp, NULL, NULL, NULL); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); + one = tor_malloc_zero(sizeof(X509)); + one->references = 1; + two = tor_malloc_zero(sizeof(X509)); + two->references = 1; + + res = tor_tls_cert_matches_key(tls, cert); + tt_int_op(res, OP_EQ, 0); + + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); + tls->ssl->session->peer = one; + res = tor_tls_cert_matches_key(tls, cert); + tt_int_op(res, OP_EQ, 0); + + cert->cert = two; + res = tor_tls_cert_matches_key(tls, cert); + tt_int_op(res, OP_EQ, 0); + + one->cert_info = tor_malloc_zero(sizeof(X509_CINF)); + one->cert_info->key = tor_malloc_zero(sizeof(X509_PUBKEY)); + one->cert_info->key->pkey = tor_malloc_zero(sizeof(EVP_PKEY)); + one->cert_info->key->pkey->references = 1; + one->cert_info->key->pkey->ameth = meth; + one->cert_info->key->pkey->type = 1; + + two->cert_info = tor_malloc_zero(sizeof(X509_CINF)); + two->cert_info->key = tor_malloc_zero(sizeof(X509_PUBKEY)); + two->cert_info->key->pkey = tor_malloc_zero(sizeof(EVP_PKEY)); + two->cert_info->key->pkey->references = 1; + two->cert_info->key->pkey->ameth = meth; + two->cert_info->key->pkey->type = 2; + + res = tor_tls_cert_matches_key(tls, cert); + tt_int_op(res, OP_EQ, 0); + + one->cert_info->key->pkey->type = 1; + two->cert_info->key->pkey->type = 1; + res = tor_tls_cert_matches_key(tls, cert); + tt_int_op(res, OP_EQ, 1); + + done: + EVP_PKEY_asn1_free(meth); + tor_free(tls->ssl->session); + tor_free(tls->ssl); + tor_free(tls); + tor_free(cert); + fake_x509_free(one); + fake_x509_free(two); +} + +static void +test_tortls_cert_get_key(void *ignored) +{ + (void)ignored; + tor_x509_cert_t *cert = NULL; + crypto_pk_t *res = NULL; + cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); + X509 *key = NULL; + key = tor_malloc_zero(sizeof(X509)); + key->references = 1; + + res = tor_tls_cert_get_key(cert); + tt_assert(!res); + + cert->cert = key; + key->cert_info = tor_malloc_zero(sizeof(X509_CINF)); + key->cert_info->key = tor_malloc_zero(sizeof(X509_PUBKEY)); + key->cert_info->key->pkey = tor_malloc_zero(sizeof(EVP_PKEY)); + key->cert_info->key->pkey->references = 1; + key->cert_info->key->pkey->type = 2; + res = tor_tls_cert_get_key(cert); + tt_assert(!res); + + done: + fake_x509_free(key); + tor_free(cert); + crypto_pk_free(res); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +static void +test_tortls_get_my_client_auth_key(void *ignored) +{ + (void)ignored; + crypto_pk_t *ret; + crypto_pk_t *expected; + tor_tls_context_t *ctx; + RSA *k = RSA_new(); + + ctx = tor_malloc_zero(sizeof(tor_tls_context_t)); + expected = crypto_new_pk_from_rsa_(k); + ctx->auth_key = expected; + + client_tls_context = NULL; + ret = tor_tls_get_my_client_auth_key(); + tt_assert(!ret); + + client_tls_context = ctx; + ret = tor_tls_get_my_client_auth_key(); + tt_assert(ret == expected); + + done: + RSA_free(k); + tor_free(expected); + tor_free(ctx); +} + +static void +test_tortls_get_my_certs(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_context_t *ctx; + const tor_x509_cert_t *link_cert_out = NULL; + const tor_x509_cert_t *id_cert_out = NULL; + + ctx = tor_malloc_zero(sizeof(tor_tls_context_t)); + + client_tls_context = NULL; + ret = tor_tls_get_my_certs(0, NULL, NULL); + tt_int_op(ret, OP_EQ, -1); + + server_tls_context = NULL; + ret = tor_tls_get_my_certs(1, NULL, NULL); + tt_int_op(ret, OP_EQ, -1); + + client_tls_context = ctx; + ret = tor_tls_get_my_certs(0, NULL, NULL); + tt_int_op(ret, OP_EQ, 0); + + client_tls_context = ctx; + ret = tor_tls_get_my_certs(0, &link_cert_out, &id_cert_out); + tt_int_op(ret, OP_EQ, 0); + + server_tls_context = ctx; + ret = tor_tls_get_my_certs(1, &link_cert_out, &id_cert_out); + tt_int_op(ret, OP_EQ, 0); + + done: + (void)1; +} + +#ifndef HAVE_SSL_GET_CLIENT_CIPHERS +static SSL_CIPHER * +get_cipher_by_name(const char *name) +{ + int i; + const SSL_METHOD *method = SSLv23_method(); + int num = method->num_ciphers(); + + for (i = 0; i < num; ++i) { + const SSL_CIPHER *cipher = method->get_cipher(i); + const char *ciphername = SSL_CIPHER_get_name(cipher); + if (!strcmp(ciphername, name)) { + return (SSL_CIPHER *)cipher; + } + } + + return NULL; +} +#endif /* !defined(HAVE_SSL_GET_CLIENT_CIPHERS) */ + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_get_ciphersuite_name(void *ignored) +{ + (void)ignored; + const char *ret; + tor_tls_t *ctx; + ctx = tor_malloc_zero(sizeof(tor_tls_t)); + ctx->ssl = tor_malloc_zero(sizeof(SSL)); + + ret = tor_tls_get_ciphersuite_name(ctx); + tt_str_op(ret, OP_EQ, "(NONE)"); + + done: + tor_free(ctx->ssl); + tor_free(ctx); +} + +static SSL_CIPHER * +get_cipher_by_id(uint16_t id) +{ + int i; + const SSL_METHOD *method = SSLv23_method(); + int num = method->num_ciphers(); + for (i = 0; i < num; ++i) { + const SSL_CIPHER *cipher = method->get_cipher(i); + if (id == (SSL_CIPHER_get_id(cipher) & 0xffff)) { + return (SSL_CIPHER *)cipher; + } + } + + return NULL; +} + +static void +test_tortls_classify_client_ciphers(void *ignored) +{ + (void)ignored; + int i; + int ret; + SSL_CTX *ctx; + SSL *ssl; + tor_tls_t *tls; + STACK_OF(SSL_CIPHER) *ciphers; + SSL_CIPHER *tmp_cipher; + + SSL_library_init(); + SSL_load_error_strings(); + tor_tls_allocate_tor_tls_object_ex_data_index(); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->magic = TOR_TLS_MAGIC; + + ctx = SSL_CTX_new(TLSv1_method()); + ssl = SSL_new(ctx); + tls->ssl = ssl; + + ciphers = sk_SSL_CIPHER_new_null(); + + ret = tor_tls_classify_client_ciphers(ssl, NULL); + tt_int_op(ret, OP_EQ, -1); + + SSL_set_ex_data(ssl, tor_tls_object_ex_data_index, tls); + tls->client_cipher_list_type = 42; + + ret = tor_tls_classify_client_ciphers(ssl, NULL); + tt_int_op(ret, OP_EQ, 42); + + tls->client_cipher_list_type = 0; + ret = tor_tls_classify_client_ciphers(ssl, ciphers); + tt_int_op(ret, OP_EQ, 1); + tt_int_op(tls->client_cipher_list_type, OP_EQ, 1); + + tls->client_cipher_list_type = 0; + ret = tor_tls_classify_client_ciphers(ssl, SSL_get_ciphers(ssl)); + tt_int_op(ret, OP_EQ, 3); + tt_int_op(tls->client_cipher_list_type, OP_EQ, 3); + + SSL_CIPHER *one = get_cipher_by_name(TLS1_TXT_DHE_RSA_WITH_AES_128_SHA), + *two = get_cipher_by_name(TLS1_TXT_DHE_RSA_WITH_AES_256_SHA), + *three = get_cipher_by_name(SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA), + *four = NULL; + sk_SSL_CIPHER_push(ciphers, one); + sk_SSL_CIPHER_push(ciphers, two); + sk_SSL_CIPHER_push(ciphers, three); + sk_SSL_CIPHER_push(ciphers, four); + + tls->client_cipher_list_type = 0; + ret = tor_tls_classify_client_ciphers(ssl, ciphers); + tt_int_op(ret, OP_EQ, 1); + tt_int_op(tls->client_cipher_list_type, OP_EQ, 1); + + sk_SSL_CIPHER_zero(ciphers); + + one = get_cipher_by_name("ECDHE-RSA-AES256-GCM-SHA384"); + one->id = 0x00ff; + two = get_cipher_by_name("ECDHE-RSA-AES128-GCM-SHA256"); + two->id = 0x0000; + sk_SSL_CIPHER_push(ciphers, one); + tls->client_cipher_list_type = 0; + ret = tor_tls_classify_client_ciphers(ssl, ciphers); + tt_int_op(ret, OP_EQ, 3); + tt_int_op(tls->client_cipher_list_type, OP_EQ, 3); + + sk_SSL_CIPHER_push(ciphers, two); + tls->client_cipher_list_type = 0; + ret = tor_tls_classify_client_ciphers(ssl, ciphers); + tt_int_op(ret, OP_EQ, 3); + tt_int_op(tls->client_cipher_list_type, OP_EQ, 3); + + one->id = 0xC00A; + tls->client_cipher_list_type = 0; + ret = tor_tls_classify_client_ciphers(ssl, ciphers); + tt_int_op(ret, OP_EQ, 3); + tt_int_op(tls->client_cipher_list_type, OP_EQ, 3); + + sk_SSL_CIPHER_zero(ciphers); + for (i=0; v2_cipher_list[i]; i++) { + tmp_cipher = get_cipher_by_id(v2_cipher_list[i]); + tt_assert(tmp_cipher); + sk_SSL_CIPHER_push(ciphers, tmp_cipher); + } + tls->client_cipher_list_type = 0; + ret = tor_tls_classify_client_ciphers(ssl, ciphers); + tt_int_op(ret, OP_EQ, 2); + tt_int_op(tls->client_cipher_list_type, OP_EQ, 2); + + done: + sk_SSL_CIPHER_free(ciphers); + SSL_free(tls->ssl); + tor_free(tls); + SSL_CTX_free(ctx); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +static void +test_tortls_client_is_using_v2_ciphers(void *ignored) +{ + (void)ignored; + +#ifdef HAVE_SSL_GET_CLIENT_CIPHERS + tt_skip(); + done: + (void)1; +#else + int ret; + SSL_CTX *ctx; + SSL *ssl; + SSL_SESSION *sess; + STACK_OF(SSL_CIPHER) *ciphers; + + SSL_library_init(); + SSL_load_error_strings(); + + ctx = SSL_CTX_new(TLSv1_method()); + ssl = SSL_new(ctx); + sess = SSL_SESSION_new(); + + ret = tor_tls_client_is_using_v2_ciphers(ssl); + tt_int_op(ret, OP_EQ, -1); + + ssl->session = sess; + ret = tor_tls_client_is_using_v2_ciphers(ssl); + tt_int_op(ret, OP_EQ, 0); + + ciphers = sk_SSL_CIPHER_new_null(); + SSL_CIPHER *one = get_cipher_by_name("ECDHE-RSA-AES256-GCM-SHA384"); + one->id = 0x00ff; + sk_SSL_CIPHER_push(ciphers, one); + sess->ciphers = ciphers; + ret = tor_tls_client_is_using_v2_ciphers(ssl); + tt_int_op(ret, OP_EQ, 1); + done: + SSL_free(ssl); + SSL_CTX_free(ctx); +#endif /* defined(HAVE_SSL_GET_CLIENT_CIPHERS) */ +} + +#ifndef OPENSSL_OPAQUE +static X509 *fixed_try_to_extract_certs_from_tls_cert_out_result = NULL; +static X509 *fixed_try_to_extract_certs_from_tls_id_cert_out_result = NULL; + +static void +fixed_try_to_extract_certs_from_tls(int severity, tor_tls_t *tls, + X509 **cert_out, X509 **id_cert_out) +{ + (void) severity; + (void) tls; + *cert_out = fixed_try_to_extract_certs_from_tls_cert_out_result; + *id_cert_out = fixed_try_to_extract_certs_from_tls_id_cert_out_result; +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static const char* notCompletelyValidCertString = + "-----BEGIN CERTIFICATE-----\n" + "MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG\n" + "A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE\n" + "MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl\n" + "YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw\n" + "ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE\n" + "CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs\n" + "ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD\n" + "+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9\n" + "MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1\n" + "C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ\n" + "kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf\n" + "jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr\n" + "evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok=\n" + "-----END CERTIFICATE-----\n"; +#endif /* !defined(OPENSSL_OPAQUE) */ + +static const char* validCertString = "-----BEGIN CERTIFICATE-----\n" + "MIIDpTCCAY0CAg3+MA0GCSqGSIb3DQEBBQUAMF4xCzAJBgNVBAYTAlVTMREwDwYD\n" + "VQQIDAhJbGxpbm9pczEQMA4GA1UEBwwHQ2hpY2FnbzEUMBIGA1UECgwLVG9yIFRl\n" + "c3RpbmcxFDASBgNVBAMMC1RvciBUZXN0aW5nMB4XDTE1MDkwNjEzMzk1OVoXDTQz\n" + "MDEyMjEzMzk1OVowVjELMAkGA1UEBhMCVVMxEDAOBgNVBAcMB0NoaWNhZ28xFDAS\n" + "BgNVBAoMC1RvciBUZXN0aW5nMR8wHQYDVQQDDBZ0ZXN0aW5nLnRvcnByb2plY3Qu\n" + "b3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDoT6uyVVhWyOF3wkHjjYbd\n" + "nKaykyRv4JVtKQdZ4OpEErmX1zw4MmyzpQNV6iR4bQnWiyLfzyVJMZDIC/WILBfX\n" + "w2Pza/yuLgUvDc3twMuhOACzOQVO8PrEF/aVv2+hbCCy2udXvKhnYn+CCXl3ozc8\n" + "XcKYvujTXDyvGWY3xwAjlQIDAQABMA0GCSqGSIb3DQEBBQUAA4ICAQCUvnhzQWuQ\n" + "MrN+pERkE+zcTI/9dGS90rUMMLgu8VDNqTa0TUQh8uO0EQ6uDvI8Js6e8tgwS0BR\n" + "UBahqb7ZHv+rejGCBr5OudqD+x4STiiuPNJVs86JTLN8SpM9CHjIBH5WCCN2KOy3\n" + "mevNoRcRRyYJzSFULCunIK6FGulszigMYGscrO4oiTkZiHPh9KvWT40IMiHfL+Lw\n" + "EtEWiLex6064LcA2YQ1AMuSZyCexks63lcfaFmQbkYOKqXa1oLkIRuDsOaSVjTfe\n" + "vec+X6jvf12cFTKS5WIeqkKF2Irt+dJoiHEGTe5RscUMN/f+gqHPzfFz5dR23sxo\n" + "g+HC6MZHlFkLAOx3wW6epPS8A/m1mw3zMPoTnb2U2YYt8T0dJMMlUn/7Y1sEAa+a\n" + "dSTMaeUf6VnJ//11m454EZl1to9Z7oJOgqmFffSrdD4BGIWe8f7hhW6L1Enmqe/J\n" + "BKL3wbzZh80O1W0bndAwhnEEhlzneFY84cbBo9pmVxpODHkUcStpr5Z7pBDrcL21\n" + "Ss/aB/1YrsVXhdvJdOGxl3Mnl9dUY57CympLGlT8f0pPS6GAKOelECOhFMHmJd8L\n" + "dj3XQSmKtYHevZ6IvuMXSlB/fJvSjSlkCuLo5+kJoaqPuRu+i/S1qxeRy3CBwmnE\n" + "LdSNdcX4N79GQJ996PA8+mUCQG7YRtK+WA==\n" + "-----END CERTIFICATE-----\n"; + +static const char* caCertString = "-----BEGIN CERTIFICATE-----\n" + "MIIFjzCCA3egAwIBAgIJAKd5WgyfPMYRMA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV\n" + "BAYTAlVTMREwDwYDVQQIDAhJbGxpbm9pczEQMA4GA1UEBwwHQ2hpY2FnbzEUMBIG\n" + "A1UECgwLVG9yIFRlc3RpbmcxFDASBgNVBAMMC1RvciBUZXN0aW5nMB4XDTE1MDkw\n" + "NjEzMzc0MVoXDTQzMDEyMjEzMzc0MVowXjELMAkGA1UEBhMCVVMxETAPBgNVBAgM\n" + "CElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMRQwEgYDVQQKDAtUb3IgVGVzdGlu\n" + "ZzEUMBIGA1UEAwwLVG9yIFRlc3RpbmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\n" + "ggIKAoICAQCpLMUEiLW5leUgBZoEJms2V7lZRhIAjnJBhVMHD0e3UubNknmaQoxf\n" + "ARz3rvqOaRd0JlV+qM9qE0DjiYcCVP1cAfqAo9d83uS1vwY3YMVJzADlaIiHfyVW\n" + "uEgBy0vvkeUBqaua24dYlcwsemOiXYLu41yM1wkcGHW1AhBNHppY6cznb8TyLgNM\n" + "2x3SGUdzc5XMyAFx51faKGBA3wjs+Hg1PLY7d30nmCgEOBavpm5I1disM/0k+Mcy\n" + "YmAKEo/iHJX/rQzO4b9znP69juLlR8PDBUJEVIG/CYb6+uw8MjjUyiWXYoqfVmN2\n" + "hm/lH8b6rXw1a2Aa3VTeD0DxaWeacMYHY/i01fd5n7hCoDTRNdSw5KJ0L3Z0SKTu\n" + "0lzffKzDaIfyZGlpW5qdouACkWYzsaitQOePVE01PIdO30vUfzNTFDfy42ccx3Di\n" + "59UCu+IXB+eMtrBfsok0Qc63vtF1linJgjHW1z/8ujk8F7/qkOfODhk4l7wngc2A\n" + "EmwWFIFoGaiTEZHB9qteXr4unbXZ0AHpM02uGGwZEGohjFyebEb73M+J57WKKAFb\n" + "PqbLcGUksL1SHNBNAJcVLttX55sO4nbidOS/kA3m+F1R04MBTyQF9qA6YDDHqdI3\n" + "h/3pw0Z4fxVouTYT4/NfRnX4JTP4u+7Mpcoof28VME0qWqD1LnRhFQIDAQABo1Aw\n" + "TjAdBgNVHQ4EFgQUMoAgIXH7pZ3QMRwTjT+DM9Yo/v0wHwYDVR0jBBgwFoAUMoAg\n" + "IXH7pZ3QMRwTjT+DM9Yo/v0wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC\n" + "AgEAUJxacjXR9sT+Xs6ISFiUsyd0T6WVKMnV46xrYJHirGfx+krWHrjxMY+ZtxYD\n" + "DBDGlo11Qc4v6QrclNf5QUBfIiGQsP9Cm6hHcQ+Tpg9HHCgSqG1YNPwCPReCR4br\n" + "BLvLfrfkcBL2IWM0PdQdCze+59DBfipsULD2mEn9fjYRXQEwb2QWtQ9qRc20Yb/x\n" + "Q4b/+CvUodLkaq7B8MHz0BV8HHcBoph6DYaRmO/N+hPauIuSp6XyaGYcEefGKVKj\n" + "G2+fcsdyXsoijNdL8vNKwm4j2gVwCBnw16J00yfFoV46YcbfqEdJB2je0XSvwXqt\n" + "14AOTngxso2h9k9HLtrfpO1ZG/B5AcCMs1lzbZ2fp5DPHtjvvmvA2RJqgo3yjw4W\n" + "4DHAuTglYFlC3mDHNfNtcGP20JvepcQNzNP2UzwcpOc94hfKikOFw+gf9Vf1qd0y\n" + "h/Sk6OZHn2+JVUPiWHIQV98Vtoh4RmUZDJD+b55ia3fQGTGzt4z1XFzQYSva5sfs\n" + "wocS/papthqWldQU7x+3wofNd5CNU1x6WKXG/yw30IT/4F8ADJD6GeygNT8QJYvt\n" + "u/8lAkbOy6B9xGmSvr0Kk1oq9P2NshA6kalxp1Oz/DTNDdL4AeBXV3JmM6WWCjGn\n" + "Yy1RT69d0rwYc5u/vnqODz1IjvT90smsrkBumGt791FAFeg=\n" + "-----END CERTIFICATE-----\n"; + +static X509 * +read_cert_from(const char *str) +{ + BIO *bio = BIO_new(BIO_s_mem()); + BIO_write(bio, str, (int) strlen(str)); + X509 *res = PEM_read_bio_X509(bio, NULL, NULL, NULL); + BIO_free(bio); + return res; +} + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_verify(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + crypto_pk_t *k = NULL; + X509 *cert1 = NULL, *cert2 = NULL, *invalidCert = NULL, + *validCert = NULL, *caCert = NULL; + + cert1 = tor_malloc_zero(sizeof(X509)); + cert1->references = 10; + + cert2 = tor_malloc_zero(sizeof(X509)); + cert2->references = 10; + + validCert = read_cert_from(validCertString); + caCert = read_cert_from(caCertString); + invalidCert = read_cert_from(notCompletelyValidCertString); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + ret = tor_tls_verify(LOG_WARN, tls, &k); + tt_int_op(ret, OP_EQ, -1); + + MOCK(try_to_extract_certs_from_tls, fixed_try_to_extract_certs_from_tls); + + fixed_try_to_extract_certs_from_tls_cert_out_result = cert1; + ret = tor_tls_verify(LOG_WARN, tls, &k); + tt_int_op(ret, OP_EQ, -1); + + fixed_try_to_extract_certs_from_tls_id_cert_out_result = cert2; + ret = tor_tls_verify(LOG_WARN, tls, &k); + tt_int_op(ret, OP_EQ, -1); + + fixed_try_to_extract_certs_from_tls_cert_out_result = invalidCert; + fixed_try_to_extract_certs_from_tls_id_cert_out_result = invalidCert; + + ret = tor_tls_verify(LOG_WARN, tls, &k); + tt_int_op(ret, OP_EQ, -1); + + fixed_try_to_extract_certs_from_tls_cert_out_result = validCert; + fixed_try_to_extract_certs_from_tls_id_cert_out_result = caCert; + + ret = tor_tls_verify(LOG_WARN, tls, &k); + tt_int_op(ret, OP_EQ, 0); + tt_assert(k); + + done: + UNMOCK(try_to_extract_certs_from_tls); + tor_free(cert1); + tor_free(cert2); + tor_free(tls); + tor_free(k); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_check_lifetime(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + X509 *validCert = read_cert_from(validCertString); + time_t now = time(NULL); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + ret = tor_tls_check_lifetime(LOG_WARN, tls, time(NULL), 0, 0); + tt_int_op(ret, OP_EQ, -1); + + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); + tls->ssl->session->peer = validCert; + ret = tor_tls_check_lifetime(LOG_WARN, tls, time(NULL), 0, 0); + tt_int_op(ret, OP_EQ, 0); + + ASN1_STRING_free(validCert->cert_info->validity->notBefore); + validCert->cert_info->validity->notBefore = ASN1_TIME_set(NULL, now-10); + ASN1_STRING_free(validCert->cert_info->validity->notAfter); + validCert->cert_info->validity->notAfter = ASN1_TIME_set(NULL, now+60); + + ret = tor_tls_check_lifetime(LOG_WARN, tls, time(NULL), 0, -1000); + tt_int_op(ret, OP_EQ, -1); + + ret = tor_tls_check_lifetime(LOG_WARN, tls, time(NULL), -1000, 0); + tt_int_op(ret, OP_EQ, -1); + + done: + tor_free(tls->ssl->session); + tor_free(tls->ssl); + tor_free(tls); + X509_free(validCert); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static int fixed_ssl_pending_result = 0; + +static int +fixed_ssl_pending(const SSL *ignored) +{ + (void)ignored; + return fixed_ssl_pending_result; +} + +static void +test_tortls_get_pending_bytes(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + SSL_METHOD *method; + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + method = tor_malloc_zero(sizeof(SSL_METHOD)); + method->ssl_pending = fixed_ssl_pending; + tls->ssl->method = method; + + fixed_ssl_pending_result = 42; + ret = tor_tls_get_pending_bytes(tls); + tt_int_op(ret, OP_EQ, 42); + + done: + tor_free(method); + tor_free(tls->ssl); + tor_free(tls); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +static void +test_tortls_get_forced_write_size(void *ignored) +{ + (void)ignored; + long ret; + tor_tls_t *tls; + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + + tls->wantwrite_n = 43; + ret = tor_tls_get_forced_write_size(tls); + tt_int_op(ret, OP_EQ, 43); + + done: + tor_free(tls); +} + +static void +test_tortls_get_write_overhead_ratio(void *ignored) +{ + (void)ignored; + double ret; + + total_bytes_written_over_tls = 0; + ret = tls_get_write_overhead_ratio(); + tt_double_op(fabs(ret - 1.0), OP_LT, 1E-12); + + total_bytes_written_by_tls = 10; + total_bytes_written_over_tls = 1; + ret = tls_get_write_overhead_ratio(); + tt_double_op(fabs(ret - 10.0), OP_LT, 1E-12); + + total_bytes_written_by_tls = 10; + total_bytes_written_over_tls = 2; + ret = tls_get_write_overhead_ratio(); + tt_double_op(fabs(ret - 5.0), OP_LT, 1E-12); + + done: + (void)0; +} + +static void +test_tortls_used_v1_handshake(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + tls = tor_malloc_zero(sizeof(tor_tls_t)); + + // These tests assume both V2 handshake server and client are enabled + tls->wasV2Handshake = 0; + ret = tor_tls_used_v1_handshake(tls); + tt_int_op(ret, OP_EQ, 1); + + tls->wasV2Handshake = 1; + ret = tor_tls_used_v1_handshake(tls); + tt_int_op(ret, OP_EQ, 0); + + done: + tor_free(tls); +} + +static void +test_tortls_get_num_server_handshakes(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + + tls->server_handshake_count = 3; + ret = tor_tls_get_num_server_handshakes(tls); + tt_int_op(ret, OP_EQ, 3); + + done: + tor_free(tls); +} + +static void +test_tortls_server_got_renegotiate(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + + tls->got_renegotiate = 1; + ret = tor_tls_server_got_renegotiate(tls); + tt_int_op(ret, OP_EQ, 1); + + done: + tor_free(tls); +} + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_SSL_SESSION_get_master_key(void *ignored) +{ + (void)ignored; + size_t ret; + tor_tls_t *tls; + uint8_t *out; + out = tor_malloc_zero(1); + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); + tls->ssl->session->master_key_length = 1; + +#ifndef HAVE_SSL_SESSION_GET_MASTER_KEY + tls->ssl->session->master_key[0] = 43; + ret = SSL_SESSION_get_master_key(tls->ssl->session, out, 0); + tt_int_op(ret, OP_EQ, 1); + tt_int_op(out[0], OP_EQ, 0); + + ret = SSL_SESSION_get_master_key(tls->ssl->session, out, 1); + tt_int_op(ret, OP_EQ, 1); + tt_int_op(out[0], OP_EQ, 43); + + done: +#endif /* !defined(HAVE_SSL_SESSION_GET_MASTER_KEY) */ + tor_free(tls->ssl->session); + tor_free(tls->ssl); + tor_free(tls); + tor_free(out); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_get_tlssecrets(void *ignored) +{ + (void)ignored; + int ret; + uint8_t *secret_out = tor_malloc_zero(DIGEST256_LEN); + tor_tls_t *tls; + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); + tls->ssl->session->master_key_length = 1; + tls->ssl->s3 = tor_malloc_zero(sizeof(SSL3_STATE)); + + ret = tor_tls_get_tlssecrets(tls, secret_out); + tt_int_op(ret, OP_EQ, 0); + + done: + tor_free(secret_out); + tor_free(tls->ssl->s3); + tor_free(tls->ssl->session); + tor_free(tls->ssl); + tor_free(tls); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_get_buffer_sizes(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + size_t rbuf_c=-1, rbuf_b=-1, wbuf_c=-1, wbuf_b=-1; + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->ssl->s3 = tor_malloc_zero(sizeof(SSL3_STATE)); + + tls->ssl->s3->rbuf.buf = NULL; + tls->ssl->s3->rbuf.len = 1; + tls->ssl->s3->rbuf.offset = 0; + tls->ssl->s3->rbuf.left = 42; + + tls->ssl->s3->wbuf.buf = NULL; + tls->ssl->s3->wbuf.len = 2; + tls->ssl->s3->wbuf.offset = 0; + tls->ssl->s3->wbuf.left = 43; + + ret = tor_tls_get_buffer_sizes(tls, &rbuf_c, &rbuf_b, &wbuf_c, &wbuf_b); +#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,1,0) + tt_int_op(ret, OP_EQ, -1); +#else + tt_int_op(ret, OP_EQ, 0); + tt_int_op(rbuf_c, OP_EQ, 0); + tt_int_op(wbuf_c, OP_EQ, 0); + tt_int_op(rbuf_b, OP_EQ, 42); + tt_int_op(wbuf_b, OP_EQ, 43); + + tls->ssl->s3->rbuf.buf = tor_malloc_zero(1); + tls->ssl->s3->wbuf.buf = tor_malloc_zero(1); + ret = tor_tls_get_buffer_sizes(tls, &rbuf_c, &rbuf_b, &wbuf_c, &wbuf_b); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(rbuf_c, OP_EQ, 1); + tt_int_op(wbuf_c, OP_EQ, 2); + +#endif /* OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,1,0) */ + + done: + tor_free(tls->ssl->s3->rbuf.buf); + tor_free(tls->ssl->s3->wbuf.buf); + tor_free(tls->ssl->s3); + tor_free(tls->ssl); + tor_free(tls); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +static void +test_tortls_evaluate_ecgroup_for_tls(void *ignored) +{ + (void)ignored; + int ret; + + ret = evaluate_ecgroup_for_tls(NULL); + tt_int_op(ret, OP_EQ, 1); + + ret = evaluate_ecgroup_for_tls("foobar"); + tt_int_op(ret, OP_EQ, 0); + + ret = evaluate_ecgroup_for_tls("P256"); + tt_int_op(ret, OP_EQ, 1); + + ret = evaluate_ecgroup_for_tls("P224"); + // tt_int_op(ret, OP_EQ, 1); This varies between machines + tt_assert(ret == 0 || ret == 1); + + done: + (void)0; +} + +#ifndef OPENSSL_OPAQUE +typedef struct cert_pkey_st_local +{ + X509 *x509; + EVP_PKEY *privatekey; + const EVP_MD *digest; +} CERT_PKEY_local; + +typedef struct sess_cert_st_local +{ + STACK_OF(X509) *cert_chain; + int peer_cert_type; + CERT_PKEY_local *peer_key; + CERT_PKEY_local peer_pkeys[8]; + int references; +} SESS_CERT_local; + +static void +test_tortls_try_to_extract_certs_from_tls(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + X509 *cert = NULL, *id_cert = NULL, *c1 = NULL, *c2 = NULL; + SESS_CERT_local *sess = NULL; + + c1 = read_cert_from(validCertString); + c2 = read_cert_from(caCertString); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); + sess = tor_malloc_zero(sizeof(SESS_CERT_local)); + tls->ssl->session->sess_cert = (void *)sess; + + try_to_extract_certs_from_tls(LOG_WARN, tls, &cert, &id_cert); + tt_assert(!cert); + tt_assert(!id_cert); + + tls->ssl->session->peer = c1; + try_to_extract_certs_from_tls(LOG_WARN, tls, &cert, &id_cert); + tt_assert(cert == c1); + tt_assert(!id_cert); + X509_free(cert); /* decrease refcnt */ + + sess->cert_chain = sk_X509_new_null(); + try_to_extract_certs_from_tls(LOG_WARN, tls, &cert, &id_cert); + tt_assert(cert == c1); + tt_assert(!id_cert); + X509_free(cert); /* decrease refcnt */ + + sk_X509_push(sess->cert_chain, c1); + sk_X509_push(sess->cert_chain, c2); + + try_to_extract_certs_from_tls(LOG_WARN, tls, &cert, &id_cert); + tt_assert(cert == c1); + tt_assert(id_cert); + X509_free(cert); /* decrease refcnt */ + + done: + sk_X509_free(sess->cert_chain); + tor_free(sess); + tor_free(tls->ssl->session); + tor_free(tls->ssl); + tor_free(tls); + X509_free(c1); + X509_free(c2); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_get_peer_cert(void *ignored) +{ + (void)ignored; + tor_x509_cert_t *ret; + tor_tls_t *tls; + X509 *cert = NULL; + + cert = read_cert_from(validCertString); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); + + ret = tor_tls_get_peer_cert(tls); + tt_assert(!ret); + + tls->ssl->session->peer = cert; + ret = tor_tls_get_peer_cert(tls); + tt_assert(ret); + tt_assert(ret->cert == cert); + + done: + tor_x509_cert_free(ret); + tor_free(tls->ssl->session); + tor_free(tls->ssl); + tor_free(tls); + X509_free(cert); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_peer_has_cert(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + X509 *cert = NULL; + + cert = read_cert_from(validCertString); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); + + ret = tor_tls_peer_has_cert(tls); + tt_assert(!ret); + + tls->ssl->session->peer = cert; + ret = tor_tls_peer_has_cert(tls); + tt_assert(ret); + + done: + tor_free(tls->ssl->session); + tor_free(tls->ssl); + tor_free(tls); + X509_free(cert); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +static void +test_tortls_is_server(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + int ret; + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->isServer = 1; + ret = tor_tls_is_server(tls); + tt_int_op(ret, OP_EQ, 1); + + done: + tor_free(tls); +} + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_session_secret_cb(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + SSL_CTX *ctx; + STACK_OF(SSL_CIPHER) *ciphers = NULL; + SSL_CIPHER *one; + + SSL_library_init(); + SSL_load_error_strings(); + tor_tls_allocate_tor_tls_object_ex_data_index(); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + + tls->magic = TOR_TLS_MAGIC; + + ctx = SSL_CTX_new(TLSv1_method()); + tls->ssl = SSL_new(ctx); + SSL_set_ex_data(tls->ssl, tor_tls_object_ex_data_index, tls); + + SSL_set_session_secret_cb(tls->ssl, tor_tls_session_secret_cb, NULL); + + tor_tls_session_secret_cb(tls->ssl, NULL, NULL, NULL, NULL, NULL); + tt_assert(!tls->ssl->tls_session_secret_cb); + + one = get_cipher_by_name("ECDHE-RSA-AES256-GCM-SHA384"); + one->id = 0x00ff; + ciphers = sk_SSL_CIPHER_new_null(); + sk_SSL_CIPHER_push(ciphers, one); + + tls->client_cipher_list_type = 0; + tor_tls_session_secret_cb(tls->ssl, NULL, NULL, ciphers, NULL, NULL); + tt_assert(!tls->ssl->tls_session_secret_cb); + + done: + sk_SSL_CIPHER_free(ciphers); + SSL_free(tls->ssl); + SSL_CTX_free(ctx); + tor_free(tls); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +/* TODO: It seems block_renegotiation and unblock_renegotiation and + * using different blags. This might not be correct */ +static void +test_tortls_block_renegotiation(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->ssl->s3 = tor_malloc_zero(sizeof(SSL3_STATE)); +#ifndef SUPPORT_UNSAFE_RENEGOTIATION_FLAG +#define SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0 +#endif + + tls->ssl->s3->flags = SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION; + + tor_tls_block_renegotiation(tls); + +#ifndef OPENSSL_1_1_API + tt_assert(!(tls->ssl->s3->flags & + SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)); +#endif + + done: + tor_free(tls->ssl->s3); + tor_free(tls->ssl); + tor_free(tls); +} + +static void +test_tortls_unblock_renegotiation(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tor_tls_unblock_renegotiation(tls); + + tt_uint_op(SSL_get_options(tls->ssl) & + SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION, OP_EQ, + SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION); + + done: + tor_free(tls->ssl); + tor_free(tls); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_assert_renegotiation_unblocked(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tor_tls_unblock_renegotiation(tls); + tor_tls_assert_renegotiation_unblocked(tls); + /* No assertion here - this test will fail if tor_assert is turned on + * and things are bad. */ + + tor_free(tls->ssl); + tor_free(tls); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +static void +test_tortls_set_logged_address(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + + tor_tls_set_logged_address(tls, "foo bar"); + + tt_str_op(tls->address, OP_EQ, "foo bar"); + + tor_tls_set_logged_address(tls, "foo bar 2"); + tt_str_op(tls->address, OP_EQ, "foo bar 2"); + + done: + tor_free(tls->address); + tor_free(tls); +} + +#ifndef OPENSSL_OPAQUE +static void +example_cb(tor_tls_t *t, void *arg) +{ + (void)t; + (void)arg; +} + +static void +test_tortls_set_renegotiate_callback(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + const char *arg = "hello"; + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + + tor_tls_set_renegotiate_callback(tls, example_cb, (void*)arg); + tt_assert(tls->negotiated_callback == example_cb); + tt_assert(tls->callback_arg == arg); + tt_assert(!tls->got_renegotiate); + + /* Assumes V2_HANDSHAKE_SERVER */ + tt_assert(tls->ssl->info_callback == tor_tls_server_info_callback); + + tor_tls_set_renegotiate_callback(tls, NULL, (void*)arg); + tt_assert(tls->ssl->info_callback == tor_tls_debug_state_callback); + + done: + tor_free(tls->ssl); + tor_free(tls); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static SSL_CIPHER *fixed_cipher1 = NULL; +static SSL_CIPHER *fixed_cipher2 = NULL; +static const SSL_CIPHER * +fake_get_cipher(unsigned ncipher) +{ + + switch (ncipher) { + case 1: + return fixed_cipher1; + case 2: + return fixed_cipher2; + default: + return NULL; + } +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_find_cipher_by_id(void *ignored) +{ + (void)ignored; + int ret; + SSL *ssl; + SSL_CTX *ctx; + const SSL_METHOD *m = TLSv1_method(); + SSL_METHOD *empty_method = tor_malloc_zero(sizeof(SSL_METHOD)); + + fixed_cipher1 = tor_malloc_zero(sizeof(SSL_CIPHER)); + fixed_cipher2 = tor_malloc_zero(sizeof(SSL_CIPHER)); + fixed_cipher2->id = 0xC00A; + + SSL_library_init(); + SSL_load_error_strings(); + + ctx = SSL_CTX_new(m); + ssl = SSL_new(ctx); + + ret = find_cipher_by_id(ssl, NULL, 0xC00A); + tt_int_op(ret, OP_EQ, 1); + + ret = find_cipher_by_id(ssl, m, 0xC00A); + tt_int_op(ret, OP_EQ, 1); + + ret = find_cipher_by_id(ssl, m, 0xFFFF); + tt_int_op(ret, OP_EQ, 0); + + ret = find_cipher_by_id(ssl, empty_method, 0xC00A); + tt_int_op(ret, OP_EQ, 1); + + ret = find_cipher_by_id(ssl, empty_method, 0xFFFF); +#ifdef HAVE_SSL_CIPHER_FIND + tt_int_op(ret, OP_EQ, 0); +#else + tt_int_op(ret, OP_EQ, 1); +#endif + + empty_method->get_cipher = fake_get_cipher; + ret = find_cipher_by_id(ssl, empty_method, 0xC00A); + tt_int_op(ret, OP_EQ, 1); + + empty_method->get_cipher = m->get_cipher; + empty_method->num_ciphers = m->num_ciphers; + ret = find_cipher_by_id(ssl, empty_method, 0xC00A); + tt_int_op(ret, OP_EQ, 1); + + empty_method->get_cipher = fake_get_cipher; + empty_method->num_ciphers = m->num_ciphers; + ret = find_cipher_by_id(ssl, empty_method, 0xC00A); + tt_int_op(ret, OP_EQ, 1); + + empty_method->num_ciphers = fake_num_ciphers; + ret = find_cipher_by_id(ssl, empty_method, 0xC00A); +#ifdef HAVE_SSL_CIPHER_FIND + tt_int_op(ret, OP_EQ, 1); +#else + tt_int_op(ret, OP_EQ, 0); +#endif + + done: + tor_free(empty_method); + SSL_free(ssl); + SSL_CTX_free(ctx); + tor_free(fixed_cipher1); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_debug_state_callback(void *ignored) +{ + (void)ignored; + SSL *ssl; + char *buf = tor_malloc_zero(1000); + int n; + + setup_capture_of_logs(LOG_DEBUG); + + ssl = tor_malloc_zero(sizeof(SSL)); + + tor_tls_debug_state_callback(ssl, 32, 45); + + n = tor_snprintf(buf, 1000, "SSL %p is now in state unknown" + " state [type=32,val=45].\n", ssl); + /* tor's snprintf returns -1 on error */ + tt_int_op(n, OP_NE, -1); + expect_log_msg(buf); + + done: + teardown_capture_of_logs(); + tor_free(buf); + tor_free(ssl); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_server_info_callback(void *ignored) +{ + (void)ignored; + tor_tls_t *tls; + SSL_CTX *ctx; + SSL *ssl; + + SSL_library_init(); + SSL_load_error_strings(); + + ctx = SSL_CTX_new(TLSv1_method()); + ssl = SSL_new(ctx); + + tor_tls_allocate_tor_tls_object_ex_data_index(); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->magic = TOR_TLS_MAGIC; + tls->ssl = ssl; + + setup_full_capture_of_logs(LOG_WARN); + SSL_set_state(ssl, SSL3_ST_SW_SRVR_HELLO_A); + mock_clean_saved_logs(); + tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); + expect_single_log_msg("Couldn't look up the tls for an SSL*. How odd!\n"); + + SSL_set_state(ssl, SSL3_ST_SW_SRVR_HELLO_B); + mock_clean_saved_logs(); + tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); + expect_single_log_msg("Couldn't look up the tls for an SSL*. How odd!\n"); + + SSL_set_state(ssl, 99); + mock_clean_saved_logs(); + tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); + expect_no_log_entry(); + teardown_capture_of_logs(); + + SSL_set_ex_data(tls->ssl, tor_tls_object_ex_data_index, tls); + SSL_set_state(ssl, SSL3_ST_SW_SRVR_HELLO_B); + tls->negotiated_callback = 0; + tls->server_handshake_count = 120; + tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); + tt_int_op(tls->server_handshake_count, OP_EQ, 121); + + tls->server_handshake_count = 127; + tls->negotiated_callback = (void *)1; + tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); + tt_int_op(tls->server_handshake_count, OP_EQ, 127); + tt_int_op(tls->got_renegotiate, OP_EQ, 1); + + tls->ssl->session = SSL_SESSION_new(); + tls->wasV2Handshake = 0; + tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); + tt_int_op(tls->wasV2Handshake, OP_EQ, 0); + + done: + teardown_capture_of_logs(); + SSL_free(ssl); + SSL_CTX_free(ctx); + tor_free(tls); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static int fixed_ssl_read_result_index; +static int fixed_ssl_read_result[5]; +static int fixed_ssl_shutdown_result; + +static int +fixed_ssl_read(SSL *s, void *buf, int len) +{ + (void)s; + (void)buf; + (void)len; + return fixed_ssl_read_result[fixed_ssl_read_result_index++]; +} + +static int +fixed_ssl_shutdown(SSL *s) +{ + (void)s; + return fixed_ssl_shutdown_result; +} + +#ifndef LIBRESSL_VERSION_NUMBER +static int fixed_ssl_state_to_set; +static tor_tls_t *fixed_tls; + +static int +setting_version_ssl_shutdown(SSL *s) +{ + s->version = SSL2_VERSION; + return fixed_ssl_shutdown_result; +} + +static int +setting_version_and_state_ssl_shutdown(SSL *s) +{ + fixed_tls->state = fixed_ssl_state_to_set; + s->version = SSL2_VERSION; + return fixed_ssl_shutdown_result; +} +#endif /* !defined(LIBRESSL_VERSION_NUMBER) */ + +static int +dummy_handshake_func(SSL *s) +{ + (void)s; + return 1; +} + +static void +test_tortls_shutdown(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + SSL_METHOD *method = give_me_a_test_method(); + setup_capture_of_logs(LOG_WARN); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->ssl->method = method; + method->ssl_read = fixed_ssl_read; + method->ssl_shutdown = fixed_ssl_shutdown; + + ret = tor_tls_shutdown(tls); + tt_int_op(ret, OP_EQ, -9); + + tls->state = TOR_TLS_ST_SENTCLOSE; + fixed_ssl_read_result_index = 0; + fixed_ssl_read_result[0] = 10; + fixed_ssl_read_result[1] = -1; + ret = tor_tls_shutdown(tls); + tt_int_op(ret, OP_EQ, -9); + +#ifndef LIBRESSL_VERSION_NUMBER + tls->ssl->handshake_func = dummy_handshake_func; + + fixed_ssl_read_result_index = 0; + fixed_ssl_read_result[0] = 10; + fixed_ssl_read_result[1] = 42; + fixed_ssl_read_result[2] = 0; + fixed_ssl_shutdown_result = 1; + ERR_clear_error(); + tls->ssl->version = SSL2_VERSION; + ret = tor_tls_shutdown(tls); + tt_int_op(ret, OP_EQ, TOR_TLS_DONE); + tt_int_op(tls->state, OP_EQ, TOR_TLS_ST_CLOSED); + + fixed_ssl_read_result_index = 0; + fixed_ssl_read_result[0] = 10; + fixed_ssl_read_result[1] = 42; + fixed_ssl_read_result[2] = 0; + fixed_ssl_shutdown_result = 0; + ERR_clear_error(); + tls->ssl->version = 0; + ret = tor_tls_shutdown(tls); + tt_int_op(ret, OP_EQ, TOR_TLS_DONE); + tt_int_op(tls->state, OP_EQ, TOR_TLS_ST_CLOSED); + + fixed_ssl_read_result_index = 0; + fixed_ssl_read_result[0] = 10; + fixed_ssl_read_result[1] = 42; + fixed_ssl_read_result[2] = 0; + fixed_ssl_shutdown_result = 0; + ERR_clear_error(); + tls->ssl->version = 0; + method->ssl_shutdown = setting_version_ssl_shutdown; + ret = tor_tls_shutdown(tls); + tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); + + fixed_ssl_read_result_index = 0; + fixed_ssl_read_result[0] = 10; + fixed_ssl_read_result[1] = 42; + fixed_ssl_read_result[2] = 0; + fixed_ssl_shutdown_result = 0; + fixed_tls = tls; + fixed_ssl_state_to_set = TOR_TLS_ST_GOTCLOSE; + ERR_clear_error(); + tls->ssl->version = 0; + method->ssl_shutdown = setting_version_and_state_ssl_shutdown; + ret = tor_tls_shutdown(tls); + tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); + + fixed_ssl_read_result_index = 0; + fixed_ssl_read_result[0] = 10; + fixed_ssl_read_result[1] = 42; + fixed_ssl_read_result[2] = 0; + fixed_ssl_read_result[3] = -1; + fixed_ssl_shutdown_result = 0; + fixed_tls = tls; + fixed_ssl_state_to_set = 0; + ERR_clear_error(); + tls->ssl->version = 0; + method->ssl_shutdown = setting_version_and_state_ssl_shutdown; + ret = tor_tls_shutdown(tls); + tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); +#endif /* !defined(LIBRESSL_VERSION_NUMBER) */ + + done: + teardown_capture_of_logs(); + tor_free(method); + tor_free(tls->ssl); + tor_free(tls); +} + +static int negotiated_callback_called; + +static void +negotiated_callback_setter(tor_tls_t *t, void *arg) +{ + (void)t; + (void)arg; + negotiated_callback_called++; +} + +static void +test_tortls_read(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + char buf[100]; + SSL_METHOD *method = give_me_a_test_method(); + setup_capture_of_logs(LOG_WARN); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->state = TOR_TLS_ST_OPEN; + + ret = tor_tls_read(tls, buf, 10); + tt_int_op(ret, OP_EQ, -9); + + /* These tests assume that V2_HANDSHAKE_SERVER is set */ + tls->ssl->handshake_func = dummy_handshake_func; + tls->ssl->method = method; + method->ssl_read = fixed_ssl_read; + fixed_ssl_read_result_index = 0; + fixed_ssl_read_result[0] = 42; + tls->state = TOR_TLS_ST_OPEN; + ERR_clear_error(); + ret = tor_tls_read(tls, buf, 10); + tt_int_op(ret, OP_EQ, 42); + + tls->state = TOR_TLS_ST_OPEN; + tls->got_renegotiate = 1; + fixed_ssl_read_result_index = 0; + ERR_clear_error(); + ret = tor_tls_read(tls, buf, 10); + tt_int_op(tls->got_renegotiate, OP_EQ, 0); + + tls->state = TOR_TLS_ST_OPEN; + tls->got_renegotiate = 1; + negotiated_callback_called = 0; + tls->negotiated_callback = negotiated_callback_setter; + fixed_ssl_read_result_index = 0; + ERR_clear_error(); + ret = tor_tls_read(tls, buf, 10); + tt_int_op(negotiated_callback_called, OP_EQ, 1); + +#ifndef LIBRESSL_VERSION_NUMBER + fixed_ssl_read_result_index = 0; + fixed_ssl_read_result[0] = 0; + tls->ssl->version = SSL2_VERSION; + ERR_clear_error(); + ret = tor_tls_read(tls, buf, 10); + tt_int_op(ret, OP_EQ, TOR_TLS_CLOSE); + tt_int_op(tls->state, OP_EQ, TOR_TLS_ST_CLOSED); +#endif /* !defined(LIBRESSL_VERSION_NUMBER) */ + // TODO: fill up + + done: + teardown_capture_of_logs(); + tor_free(tls->ssl); + tor_free(tls); + tor_free(method); +} + +static int fixed_ssl_write_result; + +static int +fixed_ssl_write(SSL *s, const void *buf, int len) +{ + (void)s; + (void)buf; + (void)len; + return fixed_ssl_write_result; +} + +static void +test_tortls_write(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + SSL_METHOD *method = give_me_a_test_method(); + char buf[100]; + setup_capture_of_logs(LOG_WARN); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = tor_malloc_zero(sizeof(SSL)); + tls->state = TOR_TLS_ST_OPEN; + + ret = tor_tls_write(tls, buf, 0); + tt_int_op(ret, OP_EQ, 0); + + ret = tor_tls_write(tls, buf, 10); + tt_int_op(ret, OP_EQ, -9); + + tls->ssl->method = method; + tls->wantwrite_n = 1; + ret = tor_tls_write(tls, buf, 10); + tt_int_op(tls->wantwrite_n, OP_EQ, 0); + + method->ssl_write = fixed_ssl_write; + tls->ssl->handshake_func = dummy_handshake_func; + fixed_ssl_write_result = 1; + ERR_clear_error(); + ret = tor_tls_write(tls, buf, 10); + tt_int_op(ret, OP_EQ, 1); + + fixed_ssl_write_result = -1; + ERR_clear_error(); + tls->ssl->rwstate = SSL_READING; + SSL_set_bio(tls->ssl, BIO_new(BIO_s_mem()), NULL); + SSL_get_rbio(tls->ssl)->flags = BIO_FLAGS_READ; + ret = tor_tls_write(tls, buf, 10); + tt_int_op(ret, OP_EQ, TOR_TLS_WANTREAD); + + ERR_clear_error(); + tls->ssl->rwstate = SSL_READING; + SSL_set_bio(tls->ssl, BIO_new(BIO_s_mem()), NULL); + SSL_get_rbio(tls->ssl)->flags = BIO_FLAGS_WRITE; + ret = tor_tls_write(tls, buf, 10); + tt_int_op(ret, OP_EQ, TOR_TLS_WANTWRITE); + + done: + teardown_capture_of_logs(); + BIO_free(tls->ssl->rbio); + tor_free(tls->ssl); + tor_free(tls); + tor_free(method); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static int fixed_ssl_accept_result; +static int fixed_ssl_connect_result; + +static int +setting_error_ssl_accept(SSL *ssl) +{ + (void)ssl; + ERR_put_error(ERR_LIB_BN, 2, -1, "somewhere.c", 99); + ERR_put_error(ERR_LIB_SYS, 2, -1, "somewhere.c", 99); + return fixed_ssl_accept_result; +} + +static int +setting_error_ssl_connect(SSL *ssl) +{ + (void)ssl; + ERR_put_error(ERR_LIB_BN, 2, -1, "somewhere.c", 99); + ERR_put_error(ERR_LIB_SYS, 2, -1, "somewhere.c", 99); + return fixed_ssl_connect_result; +} + +static int +fixed_ssl_accept(SSL *ssl) +{ + (void) ssl; + return fixed_ssl_accept_result; +} + +static void +test_tortls_handshake(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + SSL_CTX *ctx; + SSL_METHOD *method = give_me_a_test_method(); + setup_capture_of_logs(LOG_INFO); + + SSL_library_init(); + SSL_load_error_strings(); + + ctx = SSL_CTX_new(TLSv1_method()); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = SSL_new(ctx); + tls->state = TOR_TLS_ST_HANDSHAKE; + + ret = tor_tls_handshake(tls); + tt_int_op(ret, OP_EQ, -9); + + tls->isServer = 1; + tls->state = TOR_TLS_ST_HANDSHAKE; + ret = tor_tls_handshake(tls); + tt_int_op(ret, OP_EQ, -9); + + tls->ssl->method = method; + method->ssl_accept = fixed_ssl_accept; + fixed_ssl_accept_result = 2; + ERR_clear_error(); + tls->state = TOR_TLS_ST_HANDSHAKE; + ret = tor_tls_handshake(tls); + tt_int_op(tls->state, OP_EQ, TOR_TLS_ST_OPEN); + + method->ssl_accept = setting_error_ssl_accept; + fixed_ssl_accept_result = 1; + ERR_clear_error(); + mock_clean_saved_logs(); + tls->state = TOR_TLS_ST_HANDSHAKE; + ret = tor_tls_handshake(tls); + tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); + expect_log_entry(); + /* This fails on jessie. Investigate why! */ +#if 0 + expect_log_msg("TLS error while handshaking: (null) (in bignum routines:" + "(null):SSLv3 write client hello B)\n"); + expect_log_msg("TLS error while handshaking: (null) (in system library:" + "connect:SSLv3 write client hello B)\n"); +#endif /* 0 */ + expect_log_severity(LOG_INFO); + + tls->isServer = 0; + method->ssl_connect = setting_error_ssl_connect; + fixed_ssl_connect_result = 1; + ERR_clear_error(); + mock_clean_saved_logs(); + tls->state = TOR_TLS_ST_HANDSHAKE; + ret = tor_tls_handshake(tls); + tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); + expect_log_entry(); +#if 0 + /* See above */ + expect_log_msg("TLS error while handshaking: " + "(null) (in bignum routines:(null):SSLv3 write client hello B)\n"); + expect_log_msg("TLS error while handshaking: " + "(null) (in system library:connect:SSLv3 write client hello B)\n"); +#endif /* 0 */ + expect_log_severity(LOG_WARN); + + done: + teardown_capture_of_logs(); + SSL_free(tls->ssl); + SSL_CTX_free(ctx); + tor_free(tls); + tor_free(method); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +#ifndef OPENSSL_OPAQUE +static void +test_tortls_finish_handshake(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_t *tls; + SSL_CTX *ctx; + SSL_METHOD *method = give_me_a_test_method(); + SSL_library_init(); + SSL_load_error_strings(); + + X509 *c1 = read_cert_from(validCertString); + SESS_CERT_local *sess = NULL; + + ctx = SSL_CTX_new(method); + + tls = tor_malloc_zero(sizeof(tor_tls_t)); + tls->ssl = SSL_new(ctx); + tls->state = TOR_TLS_ST_OPEN; + + ret = tor_tls_finish_handshake(tls); + tt_int_op(ret, OP_EQ, 0); + + tls->isServer = 1; + tls->wasV2Handshake = 0; + setup_full_capture_of_logs(LOG_WARN); + ret = tor_tls_finish_handshake(tls); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tls->wasV2Handshake, OP_EQ, 1); + expect_single_log_msg_containing("For some reason, wasV2Handshake didn't " + "get set."); + teardown_capture_of_logs(); + + tls->wasV2Handshake = 1; + ret = tor_tls_finish_handshake(tls); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tls->wasV2Handshake, OP_EQ, 1); + + tls->wasV2Handshake = 1; + tls->ssl->session = SSL_SESSION_new(); + ret = tor_tls_finish_handshake(tls); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tls->wasV2Handshake, OP_EQ, 0); + + tls->isServer = 0; + + sess = tor_malloc_zero(sizeof(SESS_CERT_local)); + tls->ssl->session->sess_cert = (void *)sess; + sess->cert_chain = sk_X509_new_null(); + sk_X509_push(sess->cert_chain, c1); + tls->ssl->session->peer = c1; + tls->wasV2Handshake = 0; + ret = tor_tls_finish_handshake(tls); + tt_int_op(ret, OP_EQ, 0); + tt_int_op(tls->wasV2Handshake, OP_EQ, 1); + + method->num_ciphers = fake_num_ciphers; + ret = tor_tls_finish_handshake(tls); + tt_int_op(ret, OP_EQ, -9); + + done: + if (sess) + sk_X509_free(sess->cert_chain); + if (tls->ssl && tls->ssl->session) { + tor_free(tls->ssl->session->sess_cert); + } + SSL_free(tls->ssl); + tor_free(tls); + SSL_CTX_free(ctx); + tor_free(method); + teardown_capture_of_logs(); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +static int fixed_crypto_pk_new_result_index; +static crypto_pk_t *fixed_crypto_pk_new_result[5]; + +static crypto_pk_t * +fixed_crypto_pk_new(void) +{ + return fixed_crypto_pk_new_result[fixed_crypto_pk_new_result_index++]; +} + +#ifndef OPENSSL_OPAQUE +static int fixed_crypto_pk_generate_key_with_bits_result_index; +static int fixed_crypto_pk_generate_key_with_bits_result[5]; +static int fixed_tor_tls_create_certificate_result_index; +static X509 *fixed_tor_tls_create_certificate_result[5]; +static int fixed_tor_x509_cert_new_result_index; +static tor_x509_cert_t *fixed_tor_x509_cert_new_result[5]; + +static int +fixed_crypto_pk_generate_key_with_bits(crypto_pk_t *env, int bits) +{ + (void)env; + (void)bits; + return fixed_crypto_pk_generate_key_with_bits_result[ + fixed_crypto_pk_generate_key_with_bits_result_index++]; +} + +static X509 * +fixed_tor_tls_create_certificate(crypto_pk_t *rsa, + crypto_pk_t *rsa_sign, + const char *cname, + const char *cname_sign, + unsigned int cert_lifetime) +{ + (void)rsa; + (void)rsa_sign; + (void)cname; + (void)cname_sign; + (void)cert_lifetime; + return fixed_tor_tls_create_certificate_result[ + fixed_tor_tls_create_certificate_result_index++]; +} + +static tor_x509_cert_t * +fixed_tor_x509_cert_new(X509 *x509_cert) +{ + (void) x509_cert; + return fixed_tor_x509_cert_new_result[ + fixed_tor_x509_cert_new_result_index++]; +} + +static void +test_tortls_context_new(void *ignored) +{ + (void)ignored; + tor_tls_context_t *ret; + crypto_pk_t *pk1, *pk2, *pk3, *pk4, *pk5, *pk6, *pk7, *pk8, *pk9, *pk10, + *pk11, *pk12, *pk13, *pk14, *pk15, *pk16, *pk17, *pk18; + + pk1 = crypto_pk_new(); + pk2 = crypto_pk_new(); + pk3 = crypto_pk_new(); + pk4 = crypto_pk_new(); + pk5 = crypto_pk_new(); + pk6 = crypto_pk_new(); + pk7 = crypto_pk_new(); + pk8 = crypto_pk_new(); + pk9 = crypto_pk_new(); + pk10 = crypto_pk_new(); + pk11 = crypto_pk_new(); + pk12 = crypto_pk_new(); + pk13 = crypto_pk_new(); + pk14 = crypto_pk_new(); + pk15 = crypto_pk_new(); + pk16 = crypto_pk_new(); + pk17 = crypto_pk_new(); + pk18 = crypto_pk_new(); + + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = NULL; + MOCK(crypto_pk_new, fixed_crypto_pk_new); + ret = tor_tls_context_new(NULL, 0, 0, 0); + tt_assert(!ret); + + /* note: we already override this in testing_common.c, so we + * run this unit test in a subprocess. */ + MOCK(crypto_pk_generate_key_with_bits, + fixed_crypto_pk_generate_key_with_bits); + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = pk1; + fixed_crypto_pk_new_result[1] = NULL; + fixed_crypto_pk_generate_key_with_bits_result[0] = -1; + fixed_crypto_pk_generate_key_with_bits_result_index = 0; + ret = tor_tls_context_new(NULL, 0, 0, 0); + tt_assert(!ret); + + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = pk2; + fixed_crypto_pk_new_result[1] = NULL; + fixed_crypto_pk_generate_key_with_bits_result[0] = 0; + fixed_crypto_pk_generate_key_with_bits_result_index = 0; + ret = tor_tls_context_new(NULL, 0, 0, 0); + tt_assert(!ret); + + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = pk3; + fixed_crypto_pk_new_result[1] = pk4; + fixed_crypto_pk_new_result[2] = NULL; + fixed_crypto_pk_generate_key_with_bits_result[0] = 0; + fixed_crypto_pk_generate_key_with_bits_result[1] = -1; + fixed_crypto_pk_generate_key_with_bits_result_index = 0; + ret = tor_tls_context_new(NULL, 0, 0, 0); + tt_assert(!ret); + + MOCK(tor_tls_create_certificate, fixed_tor_tls_create_certificate); + + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = pk5; + fixed_crypto_pk_new_result[1] = pk6; + fixed_crypto_pk_new_result[2] = NULL; + fixed_crypto_pk_generate_key_with_bits_result_index = 0; + fixed_crypto_pk_generate_key_with_bits_result[1] = 0; + fixed_tor_tls_create_certificate_result_index = 0; + fixed_tor_tls_create_certificate_result[0] = NULL; + fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); + ret = tor_tls_context_new(NULL, 0, 0, 0); + tt_assert(!ret); + + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = pk7; + fixed_crypto_pk_new_result[1] = pk8; + fixed_crypto_pk_new_result[2] = NULL; + fixed_crypto_pk_generate_key_with_bits_result_index = 0; + fixed_tor_tls_create_certificate_result_index = 0; + fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[1] = NULL; + fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); + ret = tor_tls_context_new(NULL, 0, 0, 0); + tt_assert(!ret); + + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = pk9; + fixed_crypto_pk_new_result[1] = pk10; + fixed_crypto_pk_new_result[2] = NULL; + fixed_crypto_pk_generate_key_with_bits_result_index = 0; + fixed_tor_tls_create_certificate_result_index = 0; + fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[2] = NULL; + ret = tor_tls_context_new(NULL, 0, 0, 0); + tt_assert(!ret); + + MOCK(tor_x509_cert_new, fixed_tor_x509_cert_new); + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = pk11; + fixed_crypto_pk_new_result[1] = pk12; + fixed_crypto_pk_new_result[2] = NULL; + fixed_crypto_pk_generate_key_with_bits_result_index = 0; + fixed_tor_tls_create_certificate_result_index = 0; + fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); + fixed_tor_x509_cert_new_result_index = 0; + fixed_tor_x509_cert_new_result[0] = NULL; + fixed_tor_x509_cert_new_result[1] = NULL; + fixed_tor_x509_cert_new_result[2] = NULL; + ret = tor_tls_context_new(NULL, 0, 0, 0); + tt_assert(!ret); + + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = pk13; + fixed_crypto_pk_new_result[1] = pk14; + fixed_crypto_pk_new_result[2] = NULL; + fixed_crypto_pk_generate_key_with_bits_result_index = 0; + fixed_tor_tls_create_certificate_result_index = 0; + fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); + fixed_tor_x509_cert_new_result_index = 0; + fixed_tor_x509_cert_new_result[0] = tor_malloc_zero(sizeof(tor_x509_cert_t)); + fixed_tor_x509_cert_new_result[1] = NULL; + fixed_tor_x509_cert_new_result[2] = NULL; + ret = tor_tls_context_new(NULL, 0, 0, 0); + tt_assert(!ret); + + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = pk15; + fixed_crypto_pk_new_result[1] = pk16; + fixed_crypto_pk_new_result[2] = NULL; + fixed_crypto_pk_generate_key_with_bits_result_index = 0; + fixed_tor_tls_create_certificate_result_index = 0; + fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); + fixed_tor_x509_cert_new_result_index = 0; + fixed_tor_x509_cert_new_result[0] = tor_malloc_zero(sizeof(tor_x509_cert_t)); + fixed_tor_x509_cert_new_result[1] = tor_malloc_zero(sizeof(tor_x509_cert_t)); + fixed_tor_x509_cert_new_result[2] = NULL; + ret = tor_tls_context_new(NULL, 0, 0, 0); + tt_assert(!ret); + + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = pk17; + fixed_crypto_pk_new_result[1] = pk18; + fixed_crypto_pk_new_result[2] = NULL; + fixed_crypto_pk_generate_key_with_bits_result_index = 0; + fixed_tor_tls_create_certificate_result_index = 0; + fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); + fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); + fixed_tor_x509_cert_new_result_index = 0; + fixed_tor_x509_cert_new_result[0] = tor_malloc_zero(sizeof(tor_x509_cert_t)); + fixed_tor_x509_cert_new_result[1] = tor_malloc_zero(sizeof(tor_x509_cert_t)); + fixed_tor_x509_cert_new_result[2] = tor_malloc_zero(sizeof(tor_x509_cert_t)); + ret = tor_tls_context_new(NULL, 0, 0, 0); + tt_assert(!ret); + + done: + UNMOCK(tor_x509_cert_new); + UNMOCK(tor_tls_create_certificate); + UNMOCK(crypto_pk_generate_key_with_bits); + UNMOCK(crypto_pk_new); +} +#endif /* !defined(OPENSSL_OPAQUE) */ + +static int fixed_crypto_pk_get_evp_pkey_result_index = 0; +static EVP_PKEY *fixed_crypto_pk_get_evp_pkey_result[5]; + +static EVP_PKEY * +fixed_crypto_pk_get_evp_pkey_(crypto_pk_t *env, int private) +{ + (void) env; + (void) private; + return fixed_crypto_pk_get_evp_pkey_result[ + fixed_crypto_pk_get_evp_pkey_result_index++]; +} + +static void +test_tortls_create_certificate(void *ignored) +{ + (void)ignored; + X509 *ret; + crypto_pk_t *pk1, *pk2; + + pk1 = crypto_pk_new(); + pk2 = crypto_pk_new(); + + MOCK(crypto_pk_get_evp_pkey_, fixed_crypto_pk_get_evp_pkey_); + fixed_crypto_pk_get_evp_pkey_result_index = 0; + fixed_crypto_pk_get_evp_pkey_result[0] = NULL; + ret = tor_tls_create_certificate(pk1, pk2, "hello", "hello2", 1); + tt_assert(!ret); + + fixed_crypto_pk_get_evp_pkey_result_index = 0; + fixed_crypto_pk_get_evp_pkey_result[0] = EVP_PKEY_new(); + fixed_crypto_pk_get_evp_pkey_result[1] = NULL; + ret = tor_tls_create_certificate(pk1, pk2, "hello", "hello2", 1); + tt_assert(!ret); + + fixed_crypto_pk_get_evp_pkey_result_index = 0; + fixed_crypto_pk_get_evp_pkey_result[0] = EVP_PKEY_new(); + fixed_crypto_pk_get_evp_pkey_result[1] = EVP_PKEY_new(); + ret = tor_tls_create_certificate(pk1, pk2, "hello", "hello2", 1); + tt_assert(!ret); + + done: + UNMOCK(crypto_pk_get_evp_pkey_); + crypto_pk_free(pk1); + crypto_pk_free(pk2); +} + +static void +test_tortls_cert_new(void *ignored) +{ + (void)ignored; + tor_x509_cert_t *ret; + X509 *cert = read_cert_from(validCertString); + + ret = tor_x509_cert_new(NULL); + tt_assert(!ret); + + ret = tor_x509_cert_new(cert); + tt_assert(ret); + tor_x509_cert_free(ret); + ret = NULL; + +#if 0 + cert = read_cert_from(validCertString); + /* XXX this doesn't do what you think: it alters a copy of the pubkey. */ + X509_get_pubkey(cert)->type = EVP_PKEY_DSA; + ret = tor_x509_cert_new(cert); + tt_assert(ret); +#endif /* 0 */ + +#ifndef OPENSSL_OPAQUE + cert = read_cert_from(validCertString); + X509_CINF_free(cert->cert_info); + cert->cert_info = NULL; + ret = tor_x509_cert_new(cert); + tt_assert(ret); +#endif /* !defined(OPENSSL_OPAQUE) */ + + done: + tor_x509_cert_free(ret); +} + +static void +test_tortls_cert_is_valid(void *ignored) +{ + (void)ignored; + int ret; + tor_x509_cert_t *cert = NULL, *scert = NULL; + + scert = tor_malloc_zero(sizeof(tor_x509_cert_t)); + ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); + tt_int_op(ret, OP_EQ, 0); + + cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); + ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); + tt_int_op(ret, OP_EQ, 0); + tor_free(scert); + tor_free(cert); + + cert = tor_x509_cert_new(read_cert_from(validCertString)); + scert = tor_x509_cert_new(read_cert_from(caCertString)); + ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); + tt_int_op(ret, OP_EQ, 1); + +#ifndef OPENSSL_OPAQUE + tor_x509_cert_free(cert); + tor_x509_cert_free(scert); + cert = tor_x509_cert_new(read_cert_from(validCertString)); + scert = tor_x509_cert_new(read_cert_from(caCertString)); + ASN1_TIME_free(cert->cert->cert_info->validity->notAfter); + cert->cert->cert_info->validity->notAfter = + ASN1_TIME_set(NULL, time(NULL)-1000000); + ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); + tt_int_op(ret, OP_EQ, 0); + + tor_x509_cert_free(cert); + tor_x509_cert_free(scert); + cert = tor_x509_cert_new(read_cert_from(validCertString)); + scert = tor_x509_cert_new(read_cert_from(caCertString)); + X509_PUBKEY_free(cert->cert->cert_info->key); + cert->cert->cert_info->key = NULL; + ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 1); + tt_int_op(ret, OP_EQ, 0); +#endif /* !defined(OPENSSL_OPAQUE) */ + +#if 0 + tor_x509_cert_free(cert); + tor_x509_cert_free(scert); + cert = tor_x509_cert_new(read_cert_from(validCertString)); + scert = tor_x509_cert_new(read_cert_from(caCertString)); + /* This doesn't actually change the key in the cert. XXXXXX */ + BN_one(EVP_PKEY_get1_RSA(X509_get_pubkey(cert->cert))->n); + ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 1); + tt_int_op(ret, OP_EQ, 0); + + tor_x509_cert_free(cert); + tor_x509_cert_free(scert); + cert = tor_x509_cert_new(read_cert_from(validCertString)); + scert = tor_x509_cert_new(read_cert_from(caCertString)); + /* This doesn't actually change the key in the cert. XXXXXX */ + X509_get_pubkey(cert->cert)->type = EVP_PKEY_EC; + ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 1); + tt_int_op(ret, OP_EQ, 0); + + tor_x509_cert_free(cert); + tor_x509_cert_free(scert); + cert = tor_x509_cert_new(read_cert_from(validCertString)); + scert = tor_x509_cert_new(read_cert_from(caCertString)); + /* This doesn't actually change the key in the cert. XXXXXX */ + X509_get_pubkey(cert->cert)->type = EVP_PKEY_EC; + ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); + tt_int_op(ret, OP_EQ, 1); + + tor_x509_cert_free(cert); + tor_x509_cert_free(scert); + cert = tor_x509_cert_new(read_cert_from(validCertString)); + scert = tor_x509_cert_new(read_cert_from(caCertString)); + /* This doesn't actually change the key in the cert. XXXXXX */ + X509_get_pubkey(cert->cert)->type = EVP_PKEY_EC; + X509_get_pubkey(cert->cert)->ameth = NULL; + ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); + tt_int_op(ret, OP_EQ, 0); +#endif /* 0 */ + + done: + tor_x509_cert_free(cert); + tor_x509_cert_free(scert); +} + +static void +test_tortls_context_init_one(void *ignored) +{ + (void)ignored; + int ret; + tor_tls_context_t *old = NULL; + + MOCK(crypto_pk_new, fixed_crypto_pk_new); + + fixed_crypto_pk_new_result_index = 0; + fixed_crypto_pk_new_result[0] = NULL; + ret = tor_tls_context_init_one(&old, NULL, 0, 0, 0); + tt_int_op(ret, OP_EQ, -1); + + done: + UNMOCK(crypto_pk_new); +} + +#define LOCAL_TEST_CASE(name, flags) \ + { #name, test_tortls_##name, (flags|TT_FORK), NULL, NULL } + +#ifdef OPENSSL_OPAQUE +#define INTRUSIVE_TEST_CASE(name, flags) \ + { #name, NULL, TT_SKIP, NULL, NULL } +#else +#define INTRUSIVE_TEST_CASE(name, flags) LOCAL_TEST_CASE(name, flags) +#endif /* defined(OPENSSL_OPAQUE) */ + +struct testcase_t tortls_tests[] = { + LOCAL_TEST_CASE(errno_to_tls_error, 0), + LOCAL_TEST_CASE(err_to_string, 0), + LOCAL_TEST_CASE(tor_tls_new, TT_FORK), + LOCAL_TEST_CASE(tor_tls_get_error, 0), + LOCAL_TEST_CASE(get_state_description, TT_FORK), + LOCAL_TEST_CASE(get_by_ssl, TT_FORK), + LOCAL_TEST_CASE(allocate_tor_tls_object_ex_data_index, TT_FORK), + LOCAL_TEST_CASE(log_one_error, TT_FORK), + INTRUSIVE_TEST_CASE(get_error, TT_FORK), + LOCAL_TEST_CASE(always_accept_verify_cb, 0), + INTRUSIVE_TEST_CASE(x509_cert_free, 0), + LOCAL_TEST_CASE(x509_cert_get_id_digests, 0), + INTRUSIVE_TEST_CASE(cert_matches_key, 0), + INTRUSIVE_TEST_CASE(cert_get_key, 0), + LOCAL_TEST_CASE(get_my_client_auth_key, TT_FORK), + LOCAL_TEST_CASE(get_my_certs, TT_FORK), + INTRUSIVE_TEST_CASE(get_ciphersuite_name, 0), + INTRUSIVE_TEST_CASE(classify_client_ciphers, 0), + LOCAL_TEST_CASE(client_is_using_v2_ciphers, 0), + INTRUSIVE_TEST_CASE(verify, 0), + INTRUSIVE_TEST_CASE(check_lifetime, 0), + INTRUSIVE_TEST_CASE(get_pending_bytes, 0), + LOCAL_TEST_CASE(get_forced_write_size, 0), + LOCAL_TEST_CASE(get_write_overhead_ratio, TT_FORK), + LOCAL_TEST_CASE(used_v1_handshake, TT_FORK), + LOCAL_TEST_CASE(get_num_server_handshakes, 0), + LOCAL_TEST_CASE(server_got_renegotiate, 0), + INTRUSIVE_TEST_CASE(SSL_SESSION_get_master_key, 0), + INTRUSIVE_TEST_CASE(get_tlssecrets, 0), + INTRUSIVE_TEST_CASE(get_buffer_sizes, 0), + LOCAL_TEST_CASE(evaluate_ecgroup_for_tls, 0), + INTRUSIVE_TEST_CASE(try_to_extract_certs_from_tls, 0), + INTRUSIVE_TEST_CASE(get_peer_cert, 0), + INTRUSIVE_TEST_CASE(peer_has_cert, 0), + INTRUSIVE_TEST_CASE(shutdown, 0), + INTRUSIVE_TEST_CASE(finish_handshake, 0), + INTRUSIVE_TEST_CASE(handshake, 0), + INTRUSIVE_TEST_CASE(write, 0), + INTRUSIVE_TEST_CASE(read, 0), + INTRUSIVE_TEST_CASE(server_info_callback, 0), + LOCAL_TEST_CASE(is_server, 0), + INTRUSIVE_TEST_CASE(assert_renegotiation_unblocked, 0), + INTRUSIVE_TEST_CASE(block_renegotiation, 0), + INTRUSIVE_TEST_CASE(unblock_renegotiation, 0), + INTRUSIVE_TEST_CASE(set_renegotiate_callback, 0), + LOCAL_TEST_CASE(set_logged_address, 0), + INTRUSIVE_TEST_CASE(find_cipher_by_id, 0), + INTRUSIVE_TEST_CASE(session_secret_cb, 0), + INTRUSIVE_TEST_CASE(debug_state_callback, 0), + INTRUSIVE_TEST_CASE(context_new, TT_FORK /* redundant */), + LOCAL_TEST_CASE(create_certificate, 0), + LOCAL_TEST_CASE(cert_new, 0), + LOCAL_TEST_CASE(cert_is_valid, 0), + LOCAL_TEST_CASE(context_init_one, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_util.c b/src/wraith/src/test/test_util.c new file mode 100644 index 000000000..1fd41a348 --- /dev/null +++ b/src/wraith/src/test/test_util.c @@ -0,0 +1,6225 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define COMPAT_PRIVATE +#define COMPAT_TIME_PRIVATE +#define CONTROL_PRIVATE +#define UTIL_PRIVATE +#include "or.h" +#include "buffers.h" +#include "config.h" +#include "control.h" +#include "test.h" +#include "memarea.h" +#include "util_process.h" +#include "log_test_helpers.h" + +#ifdef HAVE_PWD_H +#include +#endif +#ifdef HAVE_SYS_UTIME_H +#include +#endif +#ifdef HAVE_UTIME_H +#include +#endif +#ifdef _WIN32 +#include +#endif +#include +#include +#include + +#define INFINITY_DBL ((double)INFINITY) +#define NAN_DBL ((double)NAN) + +/* XXXX this is a minimal wrapper to make the unit tests compile with the + * changed tor_timegm interface. */ +static time_t +tor_timegm_wrapper(const struct tm *tm) +{ + time_t t; + if (tor_timegm(tm, &t) < 0) + return -1; + return t; +} + +#define tor_timegm tor_timegm_wrapper + +static void +test_util_read_until_eof_impl(const char *fname, size_t file_len, + size_t read_limit) +{ + char *fifo_name = NULL; + char *test_str = NULL; + char *str = NULL; + size_t sz = 9999999; + int fd = -1; + int r; + + fifo_name = tor_strdup(get_fname(fname)); + test_str = tor_malloc(file_len); + crypto_rand(test_str, file_len); + + r = write_bytes_to_file(fifo_name, test_str, file_len, 1); + tt_int_op(r, OP_EQ, 0); + + fd = open(fifo_name, O_RDONLY|O_BINARY); + tt_int_op(fd, OP_GE, 0); + str = read_file_to_str_until_eof(fd, read_limit, &sz); + tt_ptr_op(str, OP_NE, NULL); + + if (read_limit < file_len) + tt_int_op(sz, OP_EQ, read_limit); + else + tt_int_op(sz, OP_EQ, file_len); + + tt_mem_op(test_str, OP_EQ, str, sz); + tt_int_op(str[sz], OP_EQ, '\0'); + + done: + unlink(fifo_name); + tor_free(fifo_name); + tor_free(test_str); + tor_free(str); + if (fd >= 0) + close(fd); +} + +static void +test_util_read_file_eof_tiny_limit(void *arg) +{ + (void)arg; + // purposely set limit shorter than what we wrote to the FIFO to + // test the maximum, and that it puts the NUL in the right spot + + test_util_read_until_eof_impl("tor_test_fifo_tiny", 5, 4); +} + +static void +test_util_read_file_eof_one_loop_a(void *arg) +{ + (void)arg; + test_util_read_until_eof_impl("tor_test_fifo_1ka", 1024, 1023); +} + +static void +test_util_read_file_eof_one_loop_b(void *arg) +{ + (void)arg; + test_util_read_until_eof_impl("tor_test_fifo_1kb", 1024, 1024); +} + +static void +test_util_read_file_eof_two_loops(void *arg) +{ + (void)arg; + // write more than 1024 bytes to the FIFO to test two passes through + // the loop in the method; if the re-alloc size is changed this + // should be updated as well. + + test_util_read_until_eof_impl("tor_test_fifo_2k", 2048, 10000); +} + +static void +test_util_read_file_eof_two_loops_b(void *arg) +{ + (void)arg; + + test_util_read_until_eof_impl("tor_test_fifo_2kb", 2048, 2048); +} + +static void +test_util_read_file_eof_zero_bytes(void *arg) +{ + (void)arg; + // zero-byte fifo + test_util_read_until_eof_impl("tor_test_fifo_empty", 0, 10000); +} + +/* Test the basic expected behaviour for write_chunks_to_file. + * NOTE: This will need to be updated if we ever change the tempfile location + * or extension */ +static void +test_util_write_chunks_to_file(void *arg) +{ + char *fname = NULL; + char *tempname = NULL; + char *str = NULL; + int r; + struct stat st; + + /* These should be two different sizes to ensure the data is different + * between the data file and the temp file's 'known string' */ + int temp_str_len = 1024; + int data_str_len = 512; + char *data_str = tor_malloc(data_str_len); + char *temp_str = tor_malloc(temp_str_len); + + smartlist_t *chunks = smartlist_new(); + sized_chunk_t c = {data_str, data_str_len/2}; + sized_chunk_t c2 = {data_str + data_str_len/2, data_str_len/2}; + (void)arg; + + crypto_rand(temp_str, temp_str_len); + crypto_rand(data_str, data_str_len); + + // Ensure it can write multiple chunks + + smartlist_add(chunks, &c); + smartlist_add(chunks, &c2); + + /* + * Check if it writes using a tempfile + */ + fname = tor_strdup(get_fname("write_chunks_with_tempfile")); + tor_asprintf(&tempname, "%s.tmp", fname); + + // write a known string to a file where the tempfile will be + r = write_bytes_to_file(tempname, temp_str, temp_str_len, 1); + tt_int_op(r, OP_EQ, 0); + + // call write_chunks_to_file + r = write_chunks_to_file(fname, chunks, 1, 0); + tt_int_op(r, OP_EQ, 0); + + // assert the file has been written (expected size) + str = read_file_to_str(fname, RFTS_BIN, &st); + tt_assert(str != NULL); + tt_u64_op((uint64_t)st.st_size, OP_EQ, data_str_len); + tt_mem_op(data_str, OP_EQ, str, data_str_len); + tor_free(str); + + // assert that the tempfile is removed (should not leave artifacts) + str = read_file_to_str(tempname, RFTS_BIN|RFTS_IGNORE_MISSING, &st); + tt_assert(str == NULL); + + // Remove old testfile for second test + r = unlink(fname); + tt_int_op(r, OP_EQ, 0); + tor_free(fname); + tor_free(tempname); + + /* + * Check if it skips using a tempfile with flags + */ + fname = tor_strdup(get_fname("write_chunks_with_no_tempfile")); + tor_asprintf(&tempname, "%s.tmp", fname); + + // write a known string to a file where the tempfile will be + r = write_bytes_to_file(tempname, temp_str, temp_str_len, 1); + tt_int_op(r, OP_EQ, 0); + + // call write_chunks_to_file with no_tempfile = true + r = write_chunks_to_file(fname, chunks, 1, 1); + tt_int_op(r, OP_EQ, 0); + + // assert the file has been written (expected size) + str = read_file_to_str(fname, RFTS_BIN, &st); + tt_assert(str != NULL); + tt_u64_op((uint64_t)st.st_size, OP_EQ, data_str_len); + tt_mem_op(data_str, OP_EQ, str, data_str_len); + tor_free(str); + + // assert the tempfile still contains the known string + str = read_file_to_str(tempname, RFTS_BIN, &st); + tt_assert(str != NULL); + tt_u64_op((uint64_t)st.st_size, OP_EQ, temp_str_len); + tt_mem_op(temp_str, OP_EQ, str, temp_str_len); + + done: + unlink(fname); + unlink(tempname); + smartlist_free(chunks); + tor_free(fname); + tor_free(tempname); + tor_free(str); + tor_free(data_str); + tor_free(temp_str); +} + +#define _TFE(a, b, f) tt_int_op((a).f, OP_EQ, (b).f) +/** test the minimum set of struct tm fields needed for a unique epoch value + * this is also the set we use to test tor_timegm */ +#define TM_EQUAL(a, b) \ + TT_STMT_BEGIN \ + _TFE(a, b, tm_year); \ + _TFE(a, b, tm_mon ); \ + _TFE(a, b, tm_mday); \ + _TFE(a, b, tm_hour); \ + _TFE(a, b, tm_min ); \ + _TFE(a, b, tm_sec ); \ + TT_STMT_END + +static void +test_util_time(void *arg) +{ + struct timeval start, end; + struct tm a_time, b_time; + char timestr[128]; + time_t t_res; + int i; + struct timeval tv; + + /* Test tv_udiff and tv_mdiff */ + + (void)arg; + start.tv_sec = 5; + start.tv_usec = 5000; + + end.tv_sec = 5; + end.tv_usec = 5000; + + tt_int_op(0L,OP_EQ, tv_udiff(&start, &end)); + tt_int_op(0L,OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(0L,OP_EQ, tv_udiff(&end, &start)); + tt_int_op(0L,OP_EQ, tv_mdiff(&end, &start)); + + end.tv_usec = 7000; + + tt_int_op(2000L,OP_EQ, tv_udiff(&start, &end)); + tt_int_op(2L,OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(-2000L,OP_EQ, tv_udiff(&end, &start)); + tt_int_op(-2L,OP_EQ, tv_mdiff(&end, &start)); + + end.tv_sec = 6; + + tt_int_op(1002000L,OP_EQ, tv_udiff(&start, &end)); + tt_int_op(1002L,OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(-1002000L,OP_EQ, tv_udiff(&end, &start)); + tt_int_op(-1002L,OP_EQ, tv_mdiff(&end, &start)); + + end.tv_usec = 0; + + tt_int_op(995000L,OP_EQ, tv_udiff(&start, &end)); + tt_int_op(995L,OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(-995000L,OP_EQ, tv_udiff(&end, &start)); + tt_int_op(-995L,OP_EQ, tv_mdiff(&end, &start)); + + end.tv_sec = 4; + + tt_int_op(-1005000L,OP_EQ, tv_udiff(&start, &end)); + tt_int_op(-1005L,OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(1005000L,OP_EQ, tv_udiff(&end, &start)); + tt_int_op(1005L,OP_EQ, tv_mdiff(&end, &start)); + + /* Negative tv_sec values, these will break on platforms where tv_sec is + * unsigned */ + + end.tv_sec = -10; + + tt_int_op(-15005000L,OP_EQ, tv_udiff(&start, &end)); + tt_int_op(-15005L,OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(15005000L,OP_EQ, tv_udiff(&end, &start)); + tt_int_op(15005L,OP_EQ, tv_mdiff(&end, &start)); + + start.tv_sec = -100; + + tt_int_op(89995000L,OP_EQ, tv_udiff(&start, &end)); + tt_int_op(89995L,OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(-89995000L,OP_EQ, tv_udiff(&end, &start)); + tt_int_op(-89995L,OP_EQ, tv_mdiff(&end, &start)); + + /* Test that tv_usec values round away from zero when converted to msec */ + start.tv_sec = 0; + start.tv_usec = 0; + end.tv_sec = 10; + end.tv_usec = 499; + + tt_int_op(10000499L, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(10000L, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(-10000499L, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(-10000L, OP_EQ, tv_mdiff(&end, &start)); + + start.tv_sec = 0; + start.tv_usec = 0; + end.tv_sec = 10; + end.tv_usec = 500; + + tt_int_op(10000500L, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(10001L, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(-10000500L, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(-10000L, OP_EQ, tv_mdiff(&end, &start)); + + start.tv_sec = 0; + start.tv_usec = 0; + end.tv_sec = 10; + end.tv_usec = 501; + + tt_int_op(10000501L, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(10001L, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(-10000501L, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(-10001L, OP_EQ, tv_mdiff(&end, &start)); + + /* Overflow conditions */ + +#ifdef _WIN32 + /* Would you believe that tv_sec is a long on windows? Of course you would.*/ +#define TV_SEC_MAX LONG_MAX +#define TV_SEC_MIN LONG_MIN +#else + /* Some BSDs have struct timeval.tv_sec 64-bit, but time_t (and long) 32-bit + * Which means TIME_MAX is not actually the maximum value of tv_sec. + * But that's ok for the moment, because the code correctly performs 64-bit + * calculations internally, then catches the overflow. */ +#define TV_SEC_MAX TIME_MAX +#define TV_SEC_MIN TIME_MIN +#endif /* defined(_WIN32) */ + +/* Assume tv_usec is an unsigned integer until proven otherwise */ +#define TV_USEC_MAX UINT_MAX +#define TOR_USEC_PER_SEC 1000000 + + /* Overflows in the result type */ + + /* All comparisons work */ + start.tv_sec = 0; + start.tv_usec = 0; + end.tv_sec = LONG_MAX/1000 - 2; + end.tv_usec = 0; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(end.tv_sec*1000L, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(-end.tv_sec*1000L, OP_EQ, tv_mdiff(&end, &start)); + + start.tv_sec = 0; + start.tv_usec = 0; + end.tv_sec = LONG_MAX/1000000 - 1; + end.tv_usec = 0; + + tt_int_op(end.tv_sec*1000000L, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(end.tv_sec*1000L, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(-end.tv_sec*1000000L, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(-end.tv_sec*1000L, OP_EQ, tv_mdiff(&end, &start)); + + /* No comparisons work */ + start.tv_sec = 0; + start.tv_usec = 0; + end.tv_sec = LONG_MAX/1000 + 1; + end.tv_usec = 0; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + start.tv_sec = 0; + start.tv_usec = 0; + end.tv_sec = LONG_MAX/1000000 + 1; + end.tv_usec = 0; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(end.tv_sec*1000L, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(-end.tv_sec*1000L, OP_EQ, tv_mdiff(&end, &start)); + + start.tv_sec = 0; + start.tv_usec = 0; + end.tv_sec = LONG_MAX/1000; + end.tv_usec = TOR_USEC_PER_SEC; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + start.tv_sec = 0; + start.tv_usec = 0; + end.tv_sec = LONG_MAX/1000000; + end.tv_usec = TOR_USEC_PER_SEC; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op((end.tv_sec + 1)*1000L, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(-(end.tv_sec + 1)*1000L, OP_EQ, tv_mdiff(&end, &start)); + + /* Overflows on comparison to zero */ + + start.tv_sec = 0; + start.tv_usec = 0; + + end.tv_sec = TV_SEC_MAX; + end.tv_usec = 0; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + end.tv_sec = TV_SEC_MAX; + end.tv_usec = TOR_USEC_PER_SEC; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + end.tv_sec = 0; + end.tv_usec = TV_USEC_MAX; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + end.tv_sec = TV_SEC_MAX; + end.tv_usec = TV_USEC_MAX; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + end.tv_sec = 0; + end.tv_usec = 0; + + start.tv_sec = TV_SEC_MIN; + start.tv_usec = 0; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + start.tv_sec = TV_SEC_MIN; + start.tv_usec = TOR_USEC_PER_SEC; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + start.tv_sec = TV_SEC_MIN; + start.tv_usec = TV_USEC_MAX; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + /* overflows on comparison to maxima / minima */ + + start.tv_sec = TV_SEC_MIN; + start.tv_usec = 0; + + end.tv_sec = TV_SEC_MAX; + end.tv_usec = 0; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + end.tv_sec = TV_SEC_MAX; + end.tv_usec = TOR_USEC_PER_SEC; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + end.tv_sec = TV_SEC_MAX; + end.tv_usec = 0; + + start.tv_sec = TV_SEC_MIN; + start.tv_usec = 0; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + start.tv_sec = TV_SEC_MIN; + start.tv_usec = TOR_USEC_PER_SEC; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + /* overflows on comparison to maxima / minima with extra usec */ + + start.tv_sec = TV_SEC_MIN; + start.tv_usec = TOR_USEC_PER_SEC; + + end.tv_sec = TV_SEC_MAX; + end.tv_usec = 0; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + end.tv_sec = TV_SEC_MAX; + end.tv_usec = TOR_USEC_PER_SEC; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + end.tv_sec = TV_SEC_MAX; + end.tv_usec = TOR_USEC_PER_SEC; + + start.tv_sec = TV_SEC_MIN; + start.tv_usec = 0; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + start.tv_sec = TV_SEC_MIN; + start.tv_usec = TOR_USEC_PER_SEC; + + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); + tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); + tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); + + /* Test tor_timegm & tor_gmtime_r */ + + /* The test values here are confirmed to be correct on a platform + * with a working timegm & gmtime_r. */ + + /* Start with known-zero a_time and b_time. + * This avoids passing uninitialised values to TM_EQUAL in a_time. + * Zeroing may not be needed for b_time, as long as tor_gmtime_r + * never reads the existing values in the structure. + * But we really don't want intermittently failing tests. */ + memset(&a_time, 0, sizeof(struct tm)); + memset(&b_time, 0, sizeof(struct tm)); + + a_time.tm_year = 2003-1900; + a_time.tm_mon = 7; + a_time.tm_mday = 30; + a_time.tm_hour = 6; + a_time.tm_min = 14; + a_time.tm_sec = 55; + t_res = 1062224095UL; + tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); + tor_gmtime_r(&t_res, &b_time); + TM_EQUAL(a_time, b_time); + + a_time.tm_year = 2004-1900; /* Try a leap year, after feb. */ + t_res = 1093846495UL; + tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); + tor_gmtime_r(&t_res, &b_time); + TM_EQUAL(a_time, b_time); + + a_time.tm_mon = 1; /* Try a leap year, in feb. */ + a_time.tm_mday = 10; + t_res = 1076393695UL; + tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); + tor_gmtime_r(&t_res, &b_time); + TM_EQUAL(a_time, b_time); + + a_time.tm_mon = 0; + t_res = 1073715295UL; + tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); + tor_gmtime_r(&t_res, &b_time); + TM_EQUAL(a_time, b_time); + + /* This value is in range with 32 bit and 64 bit time_t */ + a_time.tm_year = 2037-1900; + t_res = 2115180895UL; + tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); + tor_gmtime_r(&t_res, &b_time); + TM_EQUAL(a_time, b_time); + + /* This value is out of range with 32 bit time_t, but in range for 64 bit + * time_t */ + a_time.tm_year = 2039-1900; +#if SIZEOF_TIME_T == 4 + setup_full_capture_of_logs(LOG_WARN); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + expect_single_log_msg_containing("Result does not fit in tor_timegm"); + teardown_capture_of_logs(); +#elif SIZEOF_TIME_T == 8 + t_res = 2178252895UL; + tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); + tor_gmtime_r(&t_res, &b_time); + TM_EQUAL(a_time, b_time); +#endif /* SIZEOF_TIME_T == 4 || ... */ + + /* Test tor_timegm out of range */ + + /* The below tests will all cause a BUG message, so we capture, suppress, + * and detect. */ +#define CAPTURE() do { \ + setup_full_capture_of_logs(LOG_WARN); \ + } while (0) +#define CHECK_TIMEGM_WARNING(msg) do { \ + expect_single_log_msg_containing(msg); \ + teardown_capture_of_logs(); \ + } while (0) + +#define CHECK_TIMEGM_ARG_OUT_OF_RANGE(msg) \ + CHECK_TIMEGM_WARNING("Out-of-range argument to tor_timegm") + + /* year */ + + /* Wrong year < 1970 */ + a_time.tm_year = 1969-1900; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_year = -1-1900; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + +#if SIZEOF_INT == 4 || SIZEOF_INT == 8 + a_time.tm_year = -1*(1 << 16); + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + /* one of the smallest tm_year values my 64 bit system supports: + * t_res = -9223372036854775LL without clamping */ + a_time.tm_year = -292275055-1900; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_year = INT32_MIN; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); +#endif /* SIZEOF_INT == 4 || SIZEOF_INT == 8 */ + +#if SIZEOF_INT == 8 + a_time.tm_year = -1*(1 << 48); + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + /* while unlikely, the system's gmtime(_r) could return + * a "correct" retrospective gregorian negative year value, + * which I'm pretty sure is: + * -1*(2^63)/60/60/24*2000/730485 + 1970 = -292277022657 + * 730485 is the number of days in two millenia, including leap days */ + a_time.tm_year = -292277022657-1900; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_year = INT64_MIN; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); +#endif /* SIZEOF_INT == 8 */ + + /* Wrong year >= INT32_MAX - 1900 */ +#if SIZEOF_INT == 4 || SIZEOF_INT == 8 + a_time.tm_year = INT32_MAX-1900; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_year = INT32_MAX; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); +#endif /* SIZEOF_INT == 4 || SIZEOF_INT == 8 */ + +#if SIZEOF_INT == 8 + /* one of the largest tm_year values my 64 bit system supports */ + a_time.tm_year = 292278994-1900; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + /* while unlikely, the system's gmtime(_r) could return + * a "correct" proleptic gregorian year value, + * which I'm pretty sure is: + * (2^63-1)/60/60/24*2000/730485 + 1970 = 292277026596 + * 730485 is the number of days in two millenia, including leap days */ + a_time.tm_year = 292277026596-1900; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_year = INT64_MAX-1900; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_year = INT64_MAX; + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); +#endif /* SIZEOF_INT == 8 */ + + /* month */ + a_time.tm_year = 2007-1900; /* restore valid year */ + + a_time.tm_mon = 12; /* Wrong month, it's 0-based */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_mon = -1; /* Wrong month */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + /* day */ + a_time.tm_mon = 6; /* Try July */ + a_time.tm_mday = 32; /* Wrong day */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_mon = 5; /* Try June */ + a_time.tm_mday = 31; /* Wrong day */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_year = 2008-1900; /* Try a leap year */ + a_time.tm_mon = 1; /* in feb. */ + a_time.tm_mday = 30; /* Wrong day */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_year = 2011-1900; /* Try a non-leap year */ + a_time.tm_mon = 1; /* in feb. */ + a_time.tm_mday = 29; /* Wrong day */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_mday = 0; /* Wrong day, it's 1-based (to be different) */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + /* hour */ + a_time.tm_mday = 3; /* restore valid month day */ + + a_time.tm_hour = 24; /* Wrong hour, it's 0-based */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_hour = -1; /* Wrong hour */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + /* minute */ + a_time.tm_hour = 22; /* restore valid hour */ + + a_time.tm_min = 60; /* Wrong minute, it's 0-based */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_min = -1; /* Wrong minute */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + /* second */ + a_time.tm_min = 37; /* restore valid minute */ + + a_time.tm_sec = 61; /* Wrong second: 0-based with leap seconds */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + a_time.tm_sec = -1; /* Wrong second */ + CAPTURE(); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); + CHECK_TIMEGM_ARG_OUT_OF_RANGE(); + + /* Test tor_gmtime_r out of range */ + + /* time_t < 0 yields a year clamped to 1 or 1970, + * depending on whether the implementation of the system gmtime(_r) + * sets struct tm (1) or not (1970) */ + t_res = -1; + tor_gmtime_r(&t_res, &b_time); + tt_assert(b_time.tm_year == (1970-1900) || + b_time.tm_year == (1969-1900)); + + if (sizeof(time_t) == 4 || sizeof(time_t) == 8) { + t_res = -1*(1 << 30); + tor_gmtime_r(&t_res, &b_time); + tt_assert(b_time.tm_year == (1970-1900) || + b_time.tm_year == (1935-1900)); + + t_res = INT32_MIN; + tor_gmtime_r(&t_res, &b_time); + tt_assert(b_time.tm_year == (1970-1900) || + b_time.tm_year == (1901-1900)); + } + +#if SIZEOF_TIME_T == 8 + { + /* one of the smallest tm_year values my 64 bit system supports: + * b_time.tm_year == (-292275055LL-1900LL) without clamping */ + t_res = -9223372036854775LL; + tor_gmtime_r(&t_res, &b_time); + tt_assert(b_time.tm_year == (1970-1900) || + b_time.tm_year == (1-1900)); + + /* while unlikely, the system's gmtime(_r) could return + * a "correct" retrospective gregorian negative year value, + * which I'm pretty sure is: + * -1*(2^63)/60/60/24*2000/730485 + 1970 = -292277022657 + * 730485 is the number of days in two millenia, including leap days + * (int64_t)b_time.tm_year == (-292277022657LL-1900LL) without clamping */ + t_res = INT64_MIN; + CAPTURE(); + tor_gmtime_r(&t_res, &b_time); + if (! (b_time.tm_year == (1970-1900) || + b_time.tm_year == (1-1900))) { + tt_int_op(b_time.tm_year, OP_EQ, 1970-1900); + } + if (b_time.tm_year != 1970-1900) { + CHECK_TIMEGM_WARNING("Rounding up to "); + } else { + teardown_capture_of_logs(); + } + } +#endif /* SIZEOF_TIME_T == 8 */ + + /* time_t >= INT_MAX yields a year clamped to 2037 or 9999, + * depending on whether the implementation of the system gmtime(_r) + * sets struct tm (9999) or not (2037) */ +#if SIZEOF_TIME_T == 4 || SIZEOF_TIME_T == 8 + { + t_res = 3*(1 << 29); + tor_gmtime_r(&t_res, &b_time); + tt_assert(b_time.tm_year == (2021-1900)); + + t_res = INT32_MAX; + tor_gmtime_r(&t_res, &b_time); + tt_assert(b_time.tm_year == (2037-1900) || + b_time.tm_year == (2038-1900)); + } +#endif /* SIZEOF_TIME_T == 4 || SIZEOF_TIME_T == 8 */ + +#if SIZEOF_TIME_T == 8 + { + /* one of the largest tm_year values my 64 bit system supports: + * b_time.tm_year == (292278994L-1900L) without clamping */ + t_res = 9223372036854775LL; + tor_gmtime_r(&t_res, &b_time); + tt_assert(b_time.tm_year == (2037-1900) || + b_time.tm_year == (9999-1900)); + + /* while unlikely, the system's gmtime(_r) could return + * a "correct" proleptic gregorian year value, + * which I'm pretty sure is: + * (2^63-1)/60/60/24*2000/730485 + 1970 = 292277026596 + * 730485 is the number of days in two millenia, including leap days + * (int64_t)b_time.tm_year == (292277026596L-1900L) without clamping */ + t_res = INT64_MAX; + CAPTURE(); + tor_gmtime_r(&t_res, &b_time); + CHECK_TIMEGM_WARNING("Rounding down to "); + + tt_assert(b_time.tm_year == (2037-1900) || + b_time.tm_year == (9999-1900)); + } +#endif /* SIZEOF_TIME_T == 8 */ + + /* Test {format,parse}_rfc1123_time */ + + format_rfc1123_time(timestr, 0); + tt_str_op("Thu, 01 Jan 1970 00:00:00 GMT",OP_EQ, timestr); + format_rfc1123_time(timestr, (time_t)1091580502UL); + tt_str_op("Wed, 04 Aug 2004 00:48:22 GMT",OP_EQ, timestr); + + t_res = 0; + i = parse_rfc1123_time(timestr, &t_res); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); + + /* This value is in range with 32 bit and 64 bit time_t */ + format_rfc1123_time(timestr, (time_t)2080000000UL); + tt_str_op("Fri, 30 Nov 2035 01:46:40 GMT",OP_EQ, timestr); + + t_res = 0; + i = parse_rfc1123_time(timestr, &t_res); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)2080000000UL); + + /* This value is out of range with 32 bit time_t, but in range for 64 bit + * time_t */ + format_rfc1123_time(timestr, (time_t)2150000000UL); +#if SIZEOF_TIME_T == 4 +#if 0 + /* Wrapping around will have made it this. */ + /* On windows, at least, this is clipped to 1 Jan 1970. ??? */ + tt_str_op("Sat, 11 Jan 1902 23:45:04 GMT",OP_EQ, timestr); +#endif + /* Make sure that the right date doesn't parse. */ + strlcpy(timestr, "Wed, 17 Feb 2038 06:13:20 GMT", sizeof(timestr)); + + t_res = 0; + CAPTURE(); + i = parse_rfc1123_time(timestr, &t_res); + CHECK_TIMEGM_WARNING("does not fit in tor_timegm"); + tt_int_op(-1,OP_EQ, i); +#elif SIZEOF_TIME_T == 8 + tt_str_op("Wed, 17 Feb 2038 06:13:20 GMT",OP_EQ, timestr); + + t_res = 0; + i = parse_rfc1123_time(timestr, &t_res); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)2150000000UL); +#endif /* SIZEOF_TIME_T == 4 || ... */ + + /* The timezone doesn't matter */ + t_res = 0; + tt_int_op(0,OP_EQ, + parse_rfc1123_time("Wed, 04 Aug 2004 00:48:22 ZUL", &t_res)); + tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); + tt_int_op(-1,OP_EQ, + parse_rfc1123_time("Wed, zz Aug 2004 99-99x99 GMT", &t_res)); + tt_int_op(-1,OP_EQ, + parse_rfc1123_time("Wed, 32 Mar 2011 00:00:00 GMT", &t_res)); + tt_int_op(-1,OP_EQ, + parse_rfc1123_time("Wed, 30 Mar 2011 24:00:00 GMT", &t_res)); + tt_int_op(-1,OP_EQ, + parse_rfc1123_time("Wed, 30 Mar 2011 23:60:00 GMT", &t_res)); + tt_int_op(-1,OP_EQ, + parse_rfc1123_time("Wed, 30 Mar 2011 23:59:62 GMT", &t_res)); + tt_int_op(-1,OP_EQ, + parse_rfc1123_time("Wed, 30 Mar 1969 23:59:59 GMT", &t_res)); + tt_int_op(-1,OP_EQ, + parse_rfc1123_time("Wed, 30 Ene 2011 23:59:59 GMT", &t_res)); + tt_int_op(-1,OP_EQ, + parse_rfc1123_time("Wed, 30 Mar 2011 23:59:59 GM", &t_res)); + tt_int_op(-1,OP_EQ, + parse_rfc1123_time("Wed, 30 Mar 1900 23:59:59 GMT", &t_res)); + + /* Leap year. */ + tt_int_op(-1,OP_EQ, + parse_rfc1123_time("Wed, 29 Feb 2011 16:00:00 GMT", &t_res)); + tt_int_op(0,OP_EQ, + parse_rfc1123_time("Wed, 29 Feb 2012 16:00:00 GMT", &t_res)); + + /* Leap second plus one */ + tt_int_op(-1,OP_EQ, + parse_rfc1123_time("Wed, 30 Mar 2011 23:59:61 GMT", &t_res)); + + /* Test parse_iso_time */ + + t_res = 0; + i = parse_iso_time("", &t_res); + tt_int_op(-1,OP_EQ, i); + t_res = 0; + i = parse_iso_time("2004-08-32 00:48:22", &t_res); + tt_int_op(-1,OP_EQ, i); + t_res = 0; + i = parse_iso_time("1969-08-03 00:48:22", &t_res); + tt_int_op(-1,OP_EQ, i); + + t_res = 0; + i = parse_iso_time("2004-08-04 00:48:22", &t_res); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); + t_res = 0; + i = parse_iso_time("2004-8-4 0:48:22", &t_res); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); + + /* This value is in range with 32 bit and 64 bit time_t */ + t_res = 0; + i = parse_iso_time("2035-11-30 01:46:40", &t_res); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)2080000000UL); + + /* This value is out of range with 32 bit time_t, but in range for 64 bit + * time_t */ + t_res = 0; +#if SIZEOF_TIME_T == 4 + CAPTURE(); + i = parse_iso_time("2038-02-17 06:13:20", &t_res); + tt_int_op(-1,OP_EQ, i); + CHECK_TIMEGM_WARNING("does not fit in tor_timegm"); +#elif SIZEOF_TIME_T == 8 + i = parse_iso_time("2038-02-17 06:13:20", &t_res); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)2150000000UL); +#endif /* SIZEOF_TIME_T == 4 || ... */ + + tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-zz 99-99x99", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-32 00:00:00", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 24:00:00", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:60:00", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:59:62", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("1969-03-30 23:59:59", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-00-30 23:59:59", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2147483647-08-29 14:00:00", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:59", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04 00:48:22.100", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04 00:48:22XYZ", &t_res)); + + /* but... that _is_ acceptable if we aren't being strict. */ + t_res = 0; + i = parse_iso_time_("2004-08-04 00:48:22XYZ", &t_res, 0, 0); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); + + /* try nospace variant. */ + t_res = 0; + i = parse_iso_time_nospace("2004-08-04T00:48:22", &t_res); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); + + tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04T00:48:22", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time_nospace("2004-08-04 00:48:22", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04x00:48:22", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time_nospace("2004-08-04x00:48:22", &t_res)); + + /* Test tor_gettimeofday */ + + end.tv_sec = 4; + end.tv_usec = 999990; + start.tv_sec = 1; + start.tv_usec = 500; + + tor_gettimeofday(&start); + /* now make sure time works. */ + tor_gettimeofday(&end); + /* We might've timewarped a little. */ + tt_int_op(tv_udiff(&start, &end), OP_GE, -5000); + + /* Test format_iso_time */ + + tv.tv_sec = (time_t)1326296338UL; + tv.tv_usec = 3060; + format_iso_time(timestr, (time_t)tv.tv_sec); + tt_str_op("2012-01-11 15:38:58",OP_EQ, timestr); + /* The output of format_local_iso_time will vary by timezone, and setting + our timezone for testing purposes would be a nontrivial flaky pain. + Skip this test for now. + format_local_iso_time(timestr, tv.tv_sec); + test_streq("2012-01-11 10:38:58", timestr); + */ + format_iso_time_nospace(timestr, (time_t)tv.tv_sec); + tt_str_op("2012-01-11T15:38:58",OP_EQ, timestr); + tt_int_op(strlen(timestr),OP_EQ, ISO_TIME_LEN); + format_iso_time_nospace_usec(timestr, &tv); + tt_str_op("2012-01-11T15:38:58.003060",OP_EQ, timestr); + tt_int_op(strlen(timestr),OP_EQ, ISO_TIME_USEC_LEN); + + tv.tv_usec = 0; + /* This value is in range with 32 bit and 64 bit time_t */ + tv.tv_sec = (time_t)2080000000UL; + format_iso_time(timestr, (time_t)tv.tv_sec); + tt_str_op("2035-11-30 01:46:40",OP_EQ, timestr); + + /* This value is out of range with 32 bit time_t, but in range for 64 bit + * time_t */ + tv.tv_sec = (time_t)2150000000UL; + format_iso_time(timestr, (time_t)tv.tv_sec); +#if SIZEOF_TIME_T == 4 + /* format_iso_time should indicate failure on overflow, but it doesn't yet. + * Hopefully #18480 will improve the failure semantics in this case. + tt_str_op("2038-02-17 06:13:20",OP_EQ, timestr); + */ +#elif SIZEOF_TIME_T == 8 +#ifndef _WIN32 + /* This SHOULD work on windows too; see bug #18665 */ + tt_str_op("2038-02-17 06:13:20",OP_EQ, timestr); +#endif +#endif /* SIZEOF_TIME_T == 4 || ... */ + +#undef CAPTURE +#undef CHECK_TIMEGM_ARG_OUT_OF_RANGE + + done: + teardown_capture_of_logs(); +} + +static void +test_util_parse_http_time(void *arg) +{ + struct tm a_time; + char b[ISO_TIME_LEN+1]; + (void)arg; + +#define T(s) do { \ + format_iso_time(b, tor_timegm(&a_time)); \ + tt_str_op(b, OP_EQ, (s)); \ + b[0]='\0'; \ + } while (0) + + /* Test parse_http_time */ + + tt_int_op(-1,OP_EQ, + parse_http_time("", &a_time)); + tt_int_op(-1,OP_EQ, + parse_http_time("Sunday, 32 Aug 2004 00:48:22 GMT", &a_time)); + tt_int_op(-1,OP_EQ, + parse_http_time("Sunday, 3 Aug 1869 00:48:22 GMT", &a_time)); + tt_int_op(-1,OP_EQ, + parse_http_time("Sunday, 32-Aug-94 00:48:22 GMT", &a_time)); + tt_int_op(-1,OP_EQ, + parse_http_time("Sunday, 3-Ago-04 00:48:22", &a_time)); + tt_int_op(-1,OP_EQ, + parse_http_time("Sunday, August the third", &a_time)); + tt_int_op(-1,OP_EQ, + parse_http_time("Wednesday,,04 Aug 1994 00:48:22 GMT", &a_time)); + + tt_int_op(0,OP_EQ, + parse_http_time("Wednesday, 04 Aug 1994 00:48:22 GMT", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); + T("1994-08-04 00:48:22"); + tt_int_op(0,OP_EQ, + parse_http_time("Wednesday, 4 Aug 1994 0:48:22 GMT", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); + T("1994-08-04 00:48:22"); + tt_int_op(0,OP_EQ, + parse_http_time("Miercoles, 4 Aug 1994 0:48:22 GMT", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); + T("1994-08-04 00:48:22"); + tt_int_op(0,OP_EQ, + parse_http_time("Wednesday, 04-Aug-94 00:48:22 GMT", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); + T("1994-08-04 00:48:22"); + tt_int_op(0,OP_EQ, + parse_http_time("Wednesday, 4-Aug-94 0:48:22 GMT", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); + T("1994-08-04 00:48:22"); + tt_int_op(0,OP_EQ, + parse_http_time("Miercoles, 4-Aug-94 0:48:22 GMT", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); + T("1994-08-04 00:48:22"); + tt_int_op(0,OP_EQ, parse_http_time("Wed Aug 04 00:48:22 1994", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); + T("1994-08-04 00:48:22"); + tt_int_op(0,OP_EQ, parse_http_time("Wed Aug 4 0:48:22 1994", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); + T("1994-08-04 00:48:22"); + tt_int_op(0,OP_EQ, parse_http_time("Mie Aug 4 0:48:22 1994", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); + T("1994-08-04 00:48:22"); + tt_int_op(0,OP_EQ,parse_http_time("Sun, 1 Jan 2012 00:00:00 GMT", &a_time)); + tt_int_op((time_t)1325376000UL,OP_EQ, tor_timegm(&a_time)); + T("2012-01-01 00:00:00"); + tt_int_op(0,OP_EQ,parse_http_time("Mon, 31 Dec 2012 00:00:00 GMT", &a_time)); + tt_int_op((time_t)1356912000UL,OP_EQ, tor_timegm(&a_time)); + T("2012-12-31 00:00:00"); + + /* This value is in range with 32 bit and 64 bit time_t */ + tt_int_op(0,OP_EQ,parse_http_time("Fri, 30 Nov 2035 01:46:40 GMT", &a_time)); + tt_int_op((time_t)2080000000UL,OP_EQ, tor_timegm(&a_time)); + T("2035-11-30 01:46:40"); + + /* This value is out of range with 32 bit time_t, but in range for 64 bit + * time_t */ +#if SIZEOF_TIME_T == 4 + /* parse_http_time should indicate failure on overflow, but it doesn't yet. + * Hopefully #18480 will improve the failure semantics in this case. */ + setup_full_capture_of_logs(LOG_WARN); + tt_int_op(0,OP_EQ,parse_http_time("Wed, 17 Feb 2038 06:13:20 GMT", &a_time)); + tt_int_op((time_t)-1,OP_EQ, tor_timegm(&a_time)); + expect_single_log_msg_containing("does not fit in tor_timegm"); + teardown_capture_of_logs(); +#elif SIZEOF_TIME_T == 8 + tt_int_op(0,OP_EQ,parse_http_time("Wed, 17 Feb 2038 06:13:20 GMT", &a_time)); + tt_int_op((time_t)2150000000UL,OP_EQ, tor_timegm(&a_time)); + T("2038-02-17 06:13:20"); +#endif /* SIZEOF_TIME_T == 4 || ... */ + + tt_int_op(-1,OP_EQ, parse_http_time("2004-08-zz 99-99x99 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-03-32 00:00:00 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 24:00:00 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:60:00 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:59:62 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("1969-03-30 23:59:59 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-00-30 23:59:59 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:59", &a_time)); + +#undef T + done: + teardown_capture_of_logs(); +} + +static void +test_util_config_line(void *arg) +{ + char buf[1024]; + char *k=NULL, *v=NULL; + const char *str; + + /* Test parse_config_line_from_str */ + (void)arg; + strlcpy(buf, "k v\n" " key value with spaces \n" "keykey val\n" + "k2\n" + "k3 \n" "\n" " \n" "#comment\n" + "k4#a\n" "k5#abc\n" "k6 val #with comment\n" + "kseven \"a quoted 'string\"\n" + "k8 \"a \\x71uoted\\n\\\"str\\\\ing\\t\\001\\01\\1\\\"\"\n" + "k9 a line that\\\n spans two lines.\n\n" + "k10 more than\\\n one contin\\\nuation\n" + "k11 \\\ncontinuation at the start\n" + "k12 line with a\\\n#comment\n embedded\n" + "k13\\\ncontinuation at the very start\n" + "k14 a line that has a comment and # ends with a slash \\\n" + "k15 this should be the next new line\n" + "k16 a line that has a comment and # ends without a slash \n" + "k17 this should be the next new line\n" + , sizeof(buf)); + str = buf; + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k"); + tt_str_op(v,OP_EQ, "v"); + tor_free(k); tor_free(v); + tt_assert(!strcmpstart(str, "key value with")); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "key"); + tt_str_op(v,OP_EQ, "value with spaces"); + tor_free(k); tor_free(v); + tt_assert(!strcmpstart(str, "keykey")); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "keykey"); + tt_str_op(v,OP_EQ, "val"); + tor_free(k); tor_free(v); + tt_assert(!strcmpstart(str, "k2\n")); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k2"); + tt_str_op(v,OP_EQ, ""); + tor_free(k); tor_free(v); + tt_assert(!strcmpstart(str, "k3 \n")); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k3"); + tt_str_op(v,OP_EQ, ""); + tor_free(k); tor_free(v); + tt_assert(!strcmpstart(str, "#comment")); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k4"); + tt_str_op(v,OP_EQ, ""); + tor_free(k); tor_free(v); + tt_assert(!strcmpstart(str, "k5#abc")); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k5"); + tt_str_op(v,OP_EQ, ""); + tor_free(k); tor_free(v); + tt_assert(!strcmpstart(str, "k6")); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k6"); + tt_str_op(v,OP_EQ, "val"); + tor_free(k); tor_free(v); + tt_assert(!strcmpstart(str, "kseven")); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "kseven"); + tt_str_op(v,OP_EQ, "a quoted \'string"); + tor_free(k); tor_free(v); + tt_assert(!strcmpstart(str, "k8 ")); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k8"); + tt_str_op(v,OP_EQ, "a quoted\n\"str\\ing\t\x01\x01\x01\""); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k9"); + tt_str_op(v,OP_EQ, "a line that spans two lines."); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k10"); + tt_str_op(v,OP_EQ, "more than one continuation"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k11"); + tt_str_op(v,OP_EQ, "continuation at the start"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k12"); + tt_str_op(v,OP_EQ, "line with a embedded"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k13"); + tt_str_op(v,OP_EQ, "continuation at the very start"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k14"); + tt_str_op(v,OP_EQ, "a line that has a comment and" ); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k15"); + tt_str_op(v,OP_EQ, "this should be the next new line"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k16"); + tt_str_op(v,OP_EQ, "a line that has a comment and" ); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k17"); + tt_str_op(v,OP_EQ, "this should be the next new line"); + tor_free(k); tor_free(v); + + tt_str_op(str,OP_EQ, ""); + + done: + tor_free(k); + tor_free(v); +} + +static void +test_util_config_line_quotes(void *arg) +{ + char buf1[1024]; + char buf2[128]; + char buf3[128]; + char buf4[128]; + char *k=NULL, *v=NULL; + const char *str; + + /* Test parse_config_line_from_str */ + (void)arg; + strlcpy(buf1, "kTrailingSpace \"quoted value\" \n" + "kTrailingGarbage \"quoted value\"trailing garbage\n" + , sizeof(buf1)); + strlcpy(buf2, "kTrailingSpaceAndGarbage \"quoted value\" trailing space+g\n" + , sizeof(buf2)); + strlcpy(buf3, "kMultilineTrailingSpace \"mline\\ \nvalue w/ trailing sp\"\n" + , sizeof(buf3)); + strlcpy(buf4, "kMultilineNoTrailingBackslash \"naked multiline\nvalue\"\n" + , sizeof(buf4)); + str = buf1; + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "kTrailingSpace"); + tt_str_op(v,OP_EQ, "quoted value"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + + str = buf2; + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + + str = buf3; + + const char *err = NULL; + str = parse_config_line_from_str_verbose(str, &k, &v, &err); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + tt_str_op(err, OP_EQ, "Invalid escape sequence in quoted string"); + + str = buf4; + + err = NULL; + str = parse_config_line_from_str_verbose(str, &k, &v, &err); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + tt_str_op(err, OP_EQ, "Invalid escape sequence in quoted string"); + + done: + tor_free(k); + tor_free(v); +} + +static void +test_util_config_line_comment_character(void *arg) +{ + char buf[1024]; + char *k=NULL, *v=NULL; + const char *str; + + /* Test parse_config_line_from_str */ + (void)arg; + strlcpy(buf, "k1 \"# in quotes\"\n" + "k2 some value # some comment\n" + "k3 /home/user/myTorNetwork#2\n" /* Testcase for #1323 */ + , sizeof(buf)); + str = buf; + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k1"); + tt_str_op(v,OP_EQ, "# in quotes"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "k2"); + tt_str_op(v,OP_EQ, "some value"); + tor_free(k); tor_free(v); + + tt_str_op(str,OP_EQ, "k3 /home/user/myTorNetwork#2\n"); + +#if 0 + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + test_streq(k, "k3"); + test_streq(v, "/home/user/myTorNetwork#2"); + tor_free(k); tor_free(v); + + test_streq(str, ""); +#endif /* 0 */ + + done: + tor_free(k); + tor_free(v); +} + +static void +test_util_config_line_escaped_content(void *arg) +{ + char buf1[1024]; + char buf2[128]; + char buf3[128]; + char buf4[128]; + char buf5[128]; + char buf6[128]; + char *k=NULL, *v=NULL; + const char *str; + + /* Test parse_config_line_from_str */ + (void)arg; + strlcpy(buf1, "HexadecimalLower \"\\x2a\"\n" + "HexadecimalUpper \"\\x2A\"\n" + "HexadecimalUpperX \"\\X2A\"\n" + "Octal \"\\52\"\n" + "Newline \"\\n\"\n" + "Tab \"\\t\"\n" + "CarriageReturn \"\\r\"\n" + "DoubleQuote \"\\\"\"\n" + "SimpleQuote \"\\'\"\n" + "Backslash \"\\\\\"\n" + "Mix \"This is a \\\"star\\\":\\t\\'\\x2a\\'\\nAnd second line\"\n" + , sizeof(buf1)); + + strlcpy(buf2, "BrokenEscapedContent \"\\a\"\n" + , sizeof(buf2)); + + strlcpy(buf3, "BrokenEscapedContent \"\\x\"\n" + , sizeof(buf3)); + + strlcpy(buf4, "BrokenOctal \"\\8\"\n" + , sizeof(buf4)); + + strlcpy(buf5, "BrokenHex \"\\xg4\"\n" + , sizeof(buf5)); + + strlcpy(buf6, "BrokenEscape \"\\" + , sizeof(buf6)); + + str = buf1; + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "HexadecimalLower"); + tt_str_op(v,OP_EQ, "*"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "HexadecimalUpper"); + tt_str_op(v,OP_EQ, "*"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "HexadecimalUpperX"); + tt_str_op(v,OP_EQ, "*"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "Octal"); + tt_str_op(v,OP_EQ, "*"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "Newline"); + tt_str_op(v,OP_EQ, "\n"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "Tab"); + tt_str_op(v,OP_EQ, "\t"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "CarriageReturn"); + tt_str_op(v,OP_EQ, "\r"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "DoubleQuote"); + tt_str_op(v,OP_EQ, "\""); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "SimpleQuote"); + tt_str_op(v,OP_EQ, "'"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "Backslash"); + tt_str_op(v,OP_EQ, "\\"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_str_op(k,OP_EQ, "Mix"); + tt_str_op(v,OP_EQ, "This is a \"star\":\t'*'\nAnd second line"); + tor_free(k); tor_free(v); + tt_str_op(str,OP_EQ, ""); + + str = buf2; + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + + str = buf3; + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + + str = buf4; + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + +#if 0 + str = buf5; + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str, OP_EQ, NULL); + tor_free(k); tor_free(v); +#endif /* 0 */ + + str = buf6; + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + + /* more things to try. */ + /* Bad hex: */ + strlcpy(buf1, "Foo \"\\x9g\"\n", sizeof(buf1)); + strlcpy(buf2, "Foo \"\\xg0\"\n", sizeof(buf2)); + strlcpy(buf3, "Foo \"\\xf\"\n", sizeof(buf3)); + /* bad escape */ + strlcpy(buf4, "Foo \"\\q\"\n", sizeof(buf4)); + /* missing endquote */ + strlcpy(buf5, "Foo \"hello\n", sizeof(buf5)); + /* extra stuff */ + strlcpy(buf6, "Foo \"hello\" world\n", sizeof(buf6)); + + str=buf1; + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + + str=buf2; + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + + str=buf3; + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + + str=buf4; + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + + str=buf5; + + str = parse_config_line_from_str_verbose(str, &k, &v, NULL); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + + str=buf6; + const char *err = NULL; + str = parse_config_line_from_str_verbose(str, &k, &v, &err); + tt_ptr_op(str,OP_EQ, NULL); + tor_free(k); tor_free(v); + tt_str_op(err,OP_EQ, "Excess data after quoted string"); + + done: + tor_free(k); + tor_free(v); +} + +static void +test_util_config_line_crlf(void *arg) +{ + char *k=NULL, *v=NULL; + const char *err = NULL; + (void)arg; + const char *str = + "Hello world\r\n" + "Hello \"nice big world\"\r\n"; + + str = parse_config_line_from_str_verbose(str, &k, &v, &err); + tt_assert(str); + tt_str_op(k,OP_EQ,"Hello"); + tt_str_op(v,OP_EQ,"world"); + tt_ptr_op(err, OP_EQ, NULL); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str_verbose(str, &k, &v, &err); + tt_assert(str); + tt_str_op(k,OP_EQ,"Hello"); + tt_str_op(v,OP_EQ,"nice big world"); + tt_ptr_op(err, OP_EQ, NULL); + tor_free(k); tor_free(v); + tt_str_op(str,OP_EQ, ""); + + done: + tor_free(k); tor_free(v); +} + +#ifndef _WIN32 +static void +test_util_expand_filename(void *arg) +{ + char *str; + + (void)arg; + setenv("HOME", "/home/itv", 1); /* For "internal test value" */ + + str = expand_filename(""); + tt_str_op("",OP_EQ, str); + tor_free(str); + + str = expand_filename("/normal/path"); + tt_str_op("/normal/path",OP_EQ, str); + tor_free(str); + + str = expand_filename("/normal/trailing/path/"); + tt_str_op("/normal/trailing/path/",OP_EQ, str); + tor_free(str); + + str = expand_filename("~"); + tt_str_op("/home/itv/",OP_EQ, str); + tor_free(str); + + str = expand_filename("$HOME/nodice"); + tt_str_op("$HOME/nodice",OP_EQ, str); + tor_free(str); + + str = expand_filename("~/"); + tt_str_op("/home/itv/",OP_EQ, str); + tor_free(str); + + str = expand_filename("~/foobarqux"); + tt_str_op("/home/itv/foobarqux",OP_EQ, str); + tor_free(str); + + str = expand_filename("~/../../etc/passwd"); + tt_str_op("/home/itv/../../etc/passwd",OP_EQ, str); + tor_free(str); + + str = expand_filename("~/trailing/"); + tt_str_op("/home/itv/trailing/",OP_EQ, str); + tor_free(str); + /* Ideally we'd test ~anotheruser, but that's shady to test (we'd + have to somehow inject/fake the get_user_homedir call) */ + + /* $HOME ending in a trailing slash */ + setenv("HOME", "/home/itv/", 1); + + str = expand_filename("~"); + tt_str_op("/home/itv/",OP_EQ, str); + tor_free(str); + + str = expand_filename("~/"); + tt_str_op("/home/itv/",OP_EQ, str); + tor_free(str); + + str = expand_filename("~/foo"); + tt_str_op("/home/itv/foo",OP_EQ, str); + tor_free(str); + + /* Try with empty $HOME */ + + setenv("HOME", "", 1); + + str = expand_filename("~"); + tt_str_op("/",OP_EQ, str); + tor_free(str); + + str = expand_filename("~/"); + tt_str_op("/",OP_EQ, str); + tor_free(str); + + str = expand_filename("~/foobar"); + tt_str_op("/foobar",OP_EQ, str); + tor_free(str); + + /* Try with $HOME unset */ + + unsetenv("HOME"); + + str = expand_filename("~"); + tt_str_op("/",OP_EQ, str); + tor_free(str); + + str = expand_filename("~/"); + tt_str_op("/",OP_EQ, str); + tor_free(str); + + str = expand_filename("~/foobar"); + tt_str_op("/foobar",OP_EQ, str); + tor_free(str); + + done: + tor_free(str); +} +#endif /* !defined(_WIN32) */ + +/** Test tor_escape_str_for_pt_args(). */ +static void +test_util_escape_string_socks(void *arg) +{ + char *escaped_string = NULL; + + /** Simple backslash escape. */ + (void)arg; + escaped_string = tor_escape_str_for_pt_args("This is a backslash: \\",";\\"); + tt_assert(escaped_string); + tt_str_op(escaped_string,OP_EQ, "This is a backslash: \\\\"); + tor_free(escaped_string); + + /** Simple semicolon escape. */ + escaped_string = tor_escape_str_for_pt_args("First rule:Do not use ;",";\\"); + tt_assert(escaped_string); + tt_str_op(escaped_string,OP_EQ, "First rule:Do not use \\;"); + tor_free(escaped_string); + + /** Empty string. */ + escaped_string = tor_escape_str_for_pt_args("", ";\\"); + tt_assert(escaped_string); + tt_str_op(escaped_string,OP_EQ, ""); + tor_free(escaped_string); + + /** Escape all characters. */ + escaped_string = tor_escape_str_for_pt_args(";\\;\\", ";\\"); + tt_assert(escaped_string); + tt_str_op(escaped_string,OP_EQ, "\\;\\\\\\;\\\\"); + tor_free(escaped_string); + + escaped_string = tor_escape_str_for_pt_args(";", ";\\"); + tt_assert(escaped_string); + tt_str_op(escaped_string,OP_EQ, "\\;"); + tor_free(escaped_string); + + done: + tor_free(escaped_string); +} + +static void +test_util_string_is_key_value(void *ptr) +{ + (void)ptr; + tt_assert(string_is_key_value(LOG_WARN, "key=value")); + tt_assert(string_is_key_value(LOG_WARN, "k=v")); + tt_assert(string_is_key_value(LOG_WARN, "key=")); + tt_assert(string_is_key_value(LOG_WARN, "x=")); + tt_assert(string_is_key_value(LOG_WARN, "xx=")); + tt_assert(!string_is_key_value(LOG_WARN, "=value")); + tt_assert(!string_is_key_value(LOG_WARN, "=x")); + tt_assert(!string_is_key_value(LOG_WARN, "=")); + + /* ??? */ + /* tt_assert(!string_is_key_value(LOG_WARN, "===")); */ + done: + ; +} + +/** Test basic string functionality. */ +static void +test_util_strmisc(void *arg) +{ + char buf[1024]; + char *cp_tmp = NULL; + + /* Test strl operations */ + (void)arg; + tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 0)); + tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 10)); + tt_str_op(buf,OP_EQ, "Hello"); + tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 6)); + tt_str_op(buf,OP_EQ, "Hello"); + tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 5)); + tt_str_op(buf,OP_EQ, "Hell"); + strlcpy(buf, "Hello", sizeof(buf)); + tt_int_op(10,OP_EQ, strlcat(buf, "Hello", 5)); + + /* Test strstrip() */ + strlcpy(buf, "Testing 1 2 3", sizeof(buf)); + tor_strstrip(buf, ",!"); + tt_str_op(buf,OP_EQ, "Testing 1 2 3"); + strlcpy(buf, "!Testing 1 2 3?", sizeof(buf)); + tor_strstrip(buf, "!? "); + tt_str_op(buf,OP_EQ, "Testing123"); + strlcpy(buf, "!!!Testing 1 2 3??", sizeof(buf)); + tor_strstrip(buf, "!? "); + tt_str_op(buf,OP_EQ, "Testing123"); + + /* Test snprintf */ + /* Returning -1 when there's not enough room in the output buffer */ + tt_int_op(-1,OP_EQ, tor_snprintf(buf, 0, "Foo")); + tt_int_op(-1,OP_EQ, tor_snprintf(buf, 2, "Foo")); + tt_int_op(-1,OP_EQ, tor_snprintf(buf, 3, "Foo")); + tt_int_op(-1,OP_NE, tor_snprintf(buf, 4, "Foo")); + /* Always NUL-terminate the output */ + tor_snprintf(buf, 5, "abcdef"); + tt_int_op(0,OP_EQ, buf[4]); + tor_snprintf(buf, 10, "abcdef"); + tt_int_op(0,OP_EQ, buf[6]); + /* uint64 */ + tor_snprintf(buf, sizeof(buf), "x!"U64_FORMAT"!x", + U64_PRINTF_ARG(U64_LITERAL(12345678901))); + tt_str_op("x!12345678901!x",OP_EQ, buf); + + /* Test str{,case}cmpstart */ + tt_assert(strcmpstart("abcdef", "abcdef")==0); + tt_assert(strcmpstart("abcdef", "abc")==0); + tt_assert(strcmpstart("abcdef", "abd")<0); + tt_assert(strcmpstart("abcdef", "abb")>0); + tt_assert(strcmpstart("ab", "abb")<0); + tt_assert(strcmpstart("ab", "")==0); + tt_assert(strcmpstart("ab", "ab ")<0); + tt_assert(strcasecmpstart("abcdef", "abCdEF")==0); + tt_assert(strcasecmpstart("abcDeF", "abc")==0); + tt_assert(strcasecmpstart("abcdef", "Abd")<0); + tt_assert(strcasecmpstart("Abcdef", "abb")>0); + tt_assert(strcasecmpstart("ab", "Abb")<0); + tt_assert(strcasecmpstart("ab", "")==0); + tt_assert(strcasecmpstart("ab", "ab ")<0); + + /* Test str{,case}cmpend */ + tt_assert(strcmpend("abcdef", "abcdef")==0); + tt_assert(strcmpend("abcdef", "def")==0); + tt_assert(strcmpend("abcdef", "deg")<0); + tt_assert(strcmpend("abcdef", "dee")>0); + tt_assert(strcmpend("ab", "aab")>0); + tt_assert(strcasecmpend("AbcDEF", "abcdef")==0); + tt_assert(strcasecmpend("abcdef", "dEF")==0); + tt_assert(strcasecmpend("abcdef", "Deg")<0); + tt_assert(strcasecmpend("abcDef", "dee")>0); + tt_assert(strcasecmpend("AB", "abb")<0); + + /* Test digest_is_zero */ + memset(buf,0,20); + buf[20] = 'x'; + tt_assert(tor_digest_is_zero(buf)); + buf[19] = 'x'; + tt_assert(!tor_digest_is_zero(buf)); + + /* Test mem_is_zero */ + memset(buf,0,128); + buf[128] = 'x'; + tt_assert(tor_mem_is_zero(buf, 10)); + tt_assert(tor_mem_is_zero(buf, 20)); + tt_assert(tor_mem_is_zero(buf, 128)); + tt_assert(!tor_mem_is_zero(buf, 129)); + buf[60] = (char)255; + tt_assert(!tor_mem_is_zero(buf, 128)); + buf[0] = (char)1; + tt_assert(!tor_mem_is_zero(buf, 10)); + + /* Test 'escaped' */ + tt_ptr_op(escaped(NULL), OP_EQ, NULL); + tt_str_op("\"\"",OP_EQ, escaped("")); + tt_str_op("\"abcd\"",OP_EQ, escaped("abcd")); + tt_str_op("\"\\\\ \\n\\r\\t\\\"\\'\"",OP_EQ, escaped("\\ \n\r\t\"'")); + tt_str_op("\"unnecessary \\'backslashes\\'\"",OP_EQ, + escaped("unnecessary \'backslashes\'")); + /* Non-printable characters appear as octal */ + tt_str_op("\"z\\001abc\\277d\"",OP_EQ, escaped("z\001abc\277d")); + tt_str_op("\"z\\336\\255 ;foo\"",OP_EQ, escaped("z\xde\xad\x20;foo")); + + /* Other cases of esc_for_log{,_len} */ + cp_tmp = esc_for_log(NULL); + tt_str_op(cp_tmp, OP_EQ, "(null)"); + tor_free(cp_tmp); + cp_tmp = esc_for_log_len("abcdefg", 3); + tt_str_op(cp_tmp, OP_EQ, "\"abc\""); + tor_free(cp_tmp); + cp_tmp = esc_for_log_len("abcdefg", 100); + tt_str_op(cp_tmp, OP_EQ, "\"abcdefg\""); + tor_free(cp_tmp); + + /* Test strndup and memdup */ + { + const char *s = "abcdefghijklmnopqrstuvwxyz"; + cp_tmp = tor_strndup(s, 30); + tt_str_op(cp_tmp,OP_EQ, s); /* same string, */ + tt_ptr_op(cp_tmp,OP_NE,s); /* but different pointers. */ + tor_free(cp_tmp); + + cp_tmp = tor_strndup(s, 5); + tt_str_op(cp_tmp,OP_EQ, "abcde"); + tor_free(cp_tmp); + + s = "a\0b\0c\0d\0e\0"; + cp_tmp = tor_memdup(s,10); + tt_mem_op(cp_tmp,OP_EQ, s, 10); /* same ram, */ + tt_ptr_op(cp_tmp,OP_NE,s); /* but different pointers. */ + tor_free(cp_tmp); + } + + /* Test str-foo functions */ + cp_tmp = tor_strdup("abcdef"); + tt_assert(tor_strisnonupper(cp_tmp)); + cp_tmp[3] = 'D'; + tt_assert(!tor_strisnonupper(cp_tmp)); + tor_strupper(cp_tmp); + tt_str_op(cp_tmp,OP_EQ, "ABCDEF"); + tor_strlower(cp_tmp); + tt_str_op(cp_tmp,OP_EQ, "abcdef"); + tt_assert(tor_strisnonupper(cp_tmp)); + tt_assert(tor_strisprint(cp_tmp)); + cp_tmp[3] = 3; + tt_assert(!tor_strisprint(cp_tmp)); + tor_free(cp_tmp); + + /* Test memmem and memstr */ + { + const char *haystack = "abcde"; + tt_ptr_op(tor_memmem(haystack, 5, "ef", 2), OP_EQ, NULL); + tt_ptr_op(tor_memmem(haystack, 5, "cd", 2),OP_EQ, haystack + 2); + tt_ptr_op(tor_memmem(haystack, 5, "cde", 3),OP_EQ, haystack + 2); + tt_ptr_op(tor_memmem(haystack, 4, "cde", 3), OP_EQ, NULL); + haystack = "ababcad"; + tt_ptr_op(tor_memmem(haystack, 7, "abc", 3),OP_EQ, haystack + 2); + tt_ptr_op(tor_memmem(haystack, 7, "ad", 2),OP_EQ, haystack + 5); + tt_ptr_op(tor_memmem(haystack, 7, "cad", 3),OP_EQ, haystack + 4); + tt_ptr_op(tor_memmem(haystack, 7, "dadad", 5), OP_EQ, NULL); + tt_ptr_op(tor_memmem(haystack, 7, "abcdefghij", 10), OP_EQ, NULL); + /* memstr */ + tt_ptr_op(tor_memstr(haystack, 7, "abc"),OP_EQ, haystack + 2); + tt_ptr_op(tor_memstr(haystack, 7, "cad"),OP_EQ, haystack + 4); + tt_ptr_op(tor_memstr(haystack, 6, "cad"), OP_EQ, NULL); + tt_ptr_op(tor_memstr(haystack, 7, "cadd"), OP_EQ, NULL); + tt_ptr_op(tor_memstr(haystack, 7, "fe"), OP_EQ, NULL); + tt_ptr_op(tor_memstr(haystack, 7, "ababcade"), OP_EQ, NULL); + } + + /* Test hex_str */ + { + char binary_data[68]; + size_t idx; + for (idx = 0; idx < sizeof(binary_data); ++idx) + binary_data[idx] = idx; + tt_str_op(hex_str(binary_data, 0),OP_EQ, ""); + tt_str_op(hex_str(binary_data, 1),OP_EQ, "00"); + tt_str_op(hex_str(binary_data, 17),OP_EQ, + "000102030405060708090A0B0C0D0E0F10"); + tt_str_op(hex_str(binary_data, 32),OP_EQ, + "000102030405060708090A0B0C0D0E0F" + "101112131415161718191A1B1C1D1E1F"); + tt_str_op(hex_str(binary_data, 34),OP_EQ, + "000102030405060708090A0B0C0D0E0F" + "101112131415161718191A1B1C1D1E1F"); + /* Repeat these tests for shorter strings after longer strings + have been tried, to make sure we're correctly terminating strings */ + tt_str_op(hex_str(binary_data, 1),OP_EQ, "00"); + tt_str_op(hex_str(binary_data, 0),OP_EQ, ""); + } + + /* Test strcmp_opt */ + tt_int_op(strcmp_opt("", "foo"), OP_LT, 0); + tt_int_op(strcmp_opt("", ""), OP_EQ, 0); + tt_int_op(strcmp_opt("foo", ""), OP_GT, 0); + + tt_int_op(strcmp_opt(NULL, ""), OP_LT, 0); + tt_int_op(strcmp_opt(NULL, NULL), OP_EQ, 0); + tt_int_op(strcmp_opt("", NULL), OP_GT, 0); + + tt_int_op(strcmp_opt(NULL, "foo"), OP_LT, 0); + tt_int_op(strcmp_opt("foo", NULL), OP_GT, 0); + + /* Test strcmp_len */ + tt_int_op(strcmp_len("foo", "bar", 3), OP_GT, 0); + tt_int_op(strcmp_len("foo", "bar", 2), OP_LT, 0); + tt_int_op(strcmp_len("foo2", "foo1", 4), OP_GT, 0); + tt_int_op(strcmp_len("foo2", "foo1", 3), OP_LT, 0); /* Really stop at len */ + tt_int_op(strcmp_len("foo2", "foo", 3), OP_EQ, 0); /* Really stop at len */ + tt_int_op(strcmp_len("blah", "", 4), OP_GT, 0); + tt_int_op(strcmp_len("blah", "", 0), OP_EQ, 0); + + done: + tor_free(cp_tmp); +} + +static void +test_util_parse_integer(void *arg) +{ + (void)arg; + int i; + char *cp; + + /* Test parse_long */ + /* Empty/zero input */ + tt_int_op(0L,OP_EQ, tor_parse_long("",10,0,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); + tt_int_op(0L,OP_EQ, tor_parse_long("0",10,0,100,&i,NULL)); + tt_int_op(1,OP_EQ, i); + /* Normal cases */ + tt_int_op(10L,OP_EQ, tor_parse_long("10",10,0,100,&i,NULL)); + tt_int_op(1,OP_EQ, i); + tt_int_op(10L,OP_EQ, tor_parse_long("10",10,0,10,&i,NULL)); + tt_int_op(1,OP_EQ, i); + tt_int_op(10L,OP_EQ, tor_parse_long("10",10,10,100,&i,NULL)); + tt_int_op(1,OP_EQ, i); + tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-100,100,&i,NULL)); + tt_int_op(1,OP_EQ, i); + tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-100,0,&i,NULL)); + tt_int_op(1,OP_EQ, i); + tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-50,0,&i,NULL)); + tt_int_op(1,OP_EQ, i); + /* Extra garbage */ + tt_int_op(0L,OP_EQ, tor_parse_long("10m",10,0,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); + tt_int_op(0L,OP_EQ, tor_parse_long("-50 plus garbage",10,-100,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); + tt_int_op(10L,OP_EQ, tor_parse_long("10m",10,0,100,&i,&cp)); + tt_int_op(1,OP_EQ, i); + tt_str_op(cp,OP_EQ, "m"); + tt_int_op(-50L,OP_EQ, tor_parse_long("-50 plus garbage",10,-100,100,&i,&cp)); + tt_int_op(1,OP_EQ, i); + tt_str_op(cp,OP_EQ, " plus garbage"); + /* Illogical min max */ + tor_capture_bugs_(1); + tt_int_op(0L,OP_EQ, tor_parse_long("10",10,50,4,&i,NULL)); + tt_int_op(0,OP_EQ, i); + tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); + tt_str_op("!(max < min)", OP_EQ, + smartlist_get(tor_get_captured_bug_log_(), 0)); + tor_end_capture_bugs_(); + tor_capture_bugs_(1); + tt_int_op(0L,OP_EQ, tor_parse_long("-50",10,100,-100,&i,NULL)); + tt_int_op(0,OP_EQ, i); + tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); + tt_str_op("!(max < min)", OP_EQ, + smartlist_get(tor_get_captured_bug_log_(), 0)); + tor_end_capture_bugs_(); + /* Out of bounds */ + tt_int_op(0L,OP_EQ, tor_parse_long("10",10,50,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); + tt_int_op(0L,OP_EQ, tor_parse_long("-50",10,0,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); + /* Base different than 10 */ + tt_int_op(2L,OP_EQ, tor_parse_long("10",2,0,100,NULL,NULL)); + tt_int_op(0L,OP_EQ, tor_parse_long("2",2,0,100,NULL,NULL)); + tt_int_op(68284L,OP_EQ, tor_parse_long("10abc",16,0,70000,NULL,NULL)); + tt_int_op(68284L,OP_EQ, tor_parse_long("10ABC",16,0,70000,NULL,NULL)); + tor_capture_bugs_(2); + tt_int_op(0L,OP_EQ, tor_parse_long("10",-2,0,100,NULL,NULL)); + tt_int_op(0,OP_EQ, tor_parse_long("10ABC",-1,0,70000,&i,NULL)); + tt_int_op(2, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); + tor_end_capture_bugs_(); + tt_int_op(i,OP_EQ, 0); + + /* Test parse_ulong */ + tt_int_op(0UL,OP_EQ, tor_parse_ulong("",10,0,100,NULL,NULL)); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("0",10,0,100,NULL,NULL)); + tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,0,100,NULL,NULL)); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("10",10,50,100,NULL,NULL)); + tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,0,10,NULL,NULL)); + tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,10,100,NULL,NULL)); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("8",8,0,100,NULL,NULL)); + tt_int_op(50UL,OP_EQ, tor_parse_ulong("50",10,50,100,NULL,NULL)); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("-50",10,0,100,NULL,NULL)); + tor_capture_bugs_(1); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("50",-1,50,100,&i,NULL)); + tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); + tor_end_capture_bugs_(); + tt_int_op(0,OP_EQ, i); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("-50",10,0,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); + + /* Test parse_uint64 */ + tt_assert(U64_LITERAL(10) == tor_parse_uint64("10 x",10,0,100, &i, &cp)); + tt_int_op(1,OP_EQ, i); + tt_str_op(cp,OP_EQ, " x"); + tt_assert(U64_LITERAL(12345678901) == + tor_parse_uint64("12345678901",10,0,UINT64_MAX, &i, &cp)); + tt_int_op(1,OP_EQ, i); + tt_str_op(cp,OP_EQ, ""); + tt_assert(U64_LITERAL(0) == + tor_parse_uint64("12345678901",10,500,INT32_MAX, &i, &cp)); + tt_int_op(0,OP_EQ, i); + tor_capture_bugs_(1); + tt_assert(U64_LITERAL(0) == + tor_parse_uint64("123",-1,0,INT32_MAX, &i, &cp)); + tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); + tor_end_capture_bugs_(); + tt_int_op(0,OP_EQ, i); + + { + /* Test parse_double */ + double d = tor_parse_double("10", 0, (double)UINT64_MAX,&i,NULL); + tt_int_op(1,OP_EQ, i); + tt_assert(DBL_TO_U64(d) == 10); + d = tor_parse_double("0", 0, (double)UINT64_MAX,&i,NULL); + tt_int_op(1,OP_EQ, i); + tt_assert(DBL_TO_U64(d) == 0); + d = tor_parse_double(" ", 0, (double)UINT64_MAX,&i,NULL); + tt_double_op(fabs(d), OP_LT, 1e-10); + tt_int_op(0,OP_EQ, i); + d = tor_parse_double(".0a", 0, (double)UINT64_MAX,&i,NULL); + tt_double_op(fabs(d), OP_LT, 1e-10); + tt_int_op(0,OP_EQ, i); + d = tor_parse_double(".0a", 0, (double)UINT64_MAX,&i,&cp); + tt_double_op(fabs(d), OP_LT, 1e-10); + tt_int_op(1,OP_EQ, i); + d = tor_parse_double("-.0", 0, (double)UINT64_MAX,&i,NULL); + tt_int_op(1,OP_EQ, i); + tt_assert(DBL_TO_U64(d) == 0); + d = tor_parse_double("-10", -100.0, 100.0,&i,NULL); + tt_int_op(1,OP_EQ, i); + tt_double_op(fabs(d - -10.0),OP_LT, 1E-12); + } + + { + /* Test tor_parse_* where we overflow/underflow the underlying type. */ + /* This string should overflow 64-bit ints. */ +#define TOOBIG "100000000000000000000000000" + tt_int_op(0L, OP_EQ, + tor_parse_long(TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL)); + tt_int_op(i,OP_EQ, 0); + tt_int_op(0L,OP_EQ, + tor_parse_long("-"TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL)); + tt_int_op(i,OP_EQ, 0); + tt_int_op(0UL,OP_EQ, tor_parse_ulong(TOOBIG, 10, 0, ULONG_MAX, &i, NULL)); + tt_int_op(i,OP_EQ, 0); + tt_u64_op(U64_LITERAL(0), OP_EQ, tor_parse_uint64(TOOBIG, 10, + 0, UINT64_MAX, &i, NULL)); + tt_int_op(i,OP_EQ, 0); + } + done: + tor_end_capture_bugs_(); +} + +static void +test_util_pow2(void *arg) +{ + /* Test tor_log2(). */ + (void)arg; + tt_int_op(tor_log2(64),OP_EQ, 6); + tt_int_op(tor_log2(65),OP_EQ, 6); + tt_int_op(tor_log2(63),OP_EQ, 5); + /* incorrect mathematically, but as specified: */ + tt_int_op(tor_log2(0),OP_EQ, 0); + tt_int_op(tor_log2(1),OP_EQ, 0); + tt_int_op(tor_log2(2),OP_EQ, 1); + tt_int_op(tor_log2(3),OP_EQ, 1); + tt_int_op(tor_log2(4),OP_EQ, 2); + tt_int_op(tor_log2(5),OP_EQ, 2); + tt_int_op(tor_log2(U64_LITERAL(40000000000000000)),OP_EQ, 55); + tt_int_op(tor_log2(UINT64_MAX),OP_EQ, 63); + + /* Test round_to_power_of_2 */ + tt_u64_op(round_to_power_of_2(120), OP_EQ, 128); + tt_u64_op(round_to_power_of_2(128), OP_EQ, 128); + tt_u64_op(round_to_power_of_2(130), OP_EQ, 128); + tt_u64_op(round_to_power_of_2(U64_LITERAL(40000000000000000)), OP_EQ, + U64_LITERAL(1)<<55); + tt_u64_op(round_to_power_of_2(U64_LITERAL(0xffffffffffffffff)), OP_EQ, + U64_LITERAL(1)<<63); + tt_u64_op(round_to_power_of_2(0), OP_EQ, 1); + tt_u64_op(round_to_power_of_2(1), OP_EQ, 1); + tt_u64_op(round_to_power_of_2(2), OP_EQ, 2); + tt_u64_op(round_to_power_of_2(3), OP_EQ, 2); + tt_u64_op(round_to_power_of_2(4), OP_EQ, 4); + tt_u64_op(round_to_power_of_2(5), OP_EQ, 4); + tt_u64_op(round_to_power_of_2(6), OP_EQ, 4); + tt_u64_op(round_to_power_of_2(7), OP_EQ, 8); + + done: + ; +} + +static void +test_util_compress_impl(compress_method_t method) +{ + char *buf1=NULL, *buf2=NULL, *buf3=NULL; + size_t len1, len2; + + tt_assert(tor_compress_supports_method(method)); + + if (method != NO_METHOD) { + tt_ptr_op(tor_compress_version_str(method), OP_NE, NULL); + tt_ptr_op(tor_compress_header_version_str(method), OP_NE, NULL); + } + + buf1 = tor_strdup("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ"); + tt_assert(detect_compression_method(buf1, strlen(buf1)) == UNKNOWN_METHOD); + + tt_assert(!tor_compress(&buf2, &len1, buf1, strlen(buf1)+1, method)); + tt_ptr_op(buf2, OP_NE, NULL); + if (method == NO_METHOD) { + // The identity transform doesn't actually compress, and it isn't + // detectable as "the identity transform." + tt_int_op(len1, OP_EQ, strlen(buf1)+1); + tt_int_op(detect_compression_method(buf2, len1), OP_EQ, UNKNOWN_METHOD); + } else { + tt_int_op(len1, OP_LT, strlen(buf1)); + tt_int_op(detect_compression_method(buf2, len1), OP_EQ, method); + } + + tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1, method, 1, LOG_INFO)); + tt_ptr_op(buf3, OP_NE, NULL); + tt_int_op(strlen(buf1) + 1, OP_EQ, len2); + tt_str_op(buf1, OP_EQ, buf3); + tt_int_op(buf3[len2], OP_EQ, 0); + + /* Check whether we can uncompress concatenated, compressed strings. */ + tor_free(buf3); + buf2 = tor_reallocarray(buf2, len1, 2); + memcpy(buf2+len1, buf2, len1); + tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1*2, method, 1, LOG_INFO)); + tt_int_op((strlen(buf1)+1)*2, OP_EQ, len2); + tt_mem_op(buf3, OP_EQ, + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0", + (strlen(buf1)+1)*2); + tt_int_op(buf3[len2], OP_EQ, 0); + + /* Check whether we can uncompress partial strings */ + + tor_free(buf1); + tor_free(buf2); + tor_free(buf3); + + size_t b1len = 1<<10; + if (method == ZSTD_METHOD) { + // zstd needs a big input before it starts generating output that it + // can partially decompress. + b1len = 1<<18; + } + buf1 = tor_malloc(b1len); + crypto_rand(buf1, b1len); + tt_assert(!tor_compress(&buf2, &len1, buf1, b1len, method)); + tt_int_op(len1, OP_GT, 16); + /* when we allow an incomplete output we should succeed.*/ + tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1-16, + method, 0, LOG_INFO)); + tt_int_op(len2, OP_GT, 5); + tt_int_op(len2, OP_LE, len1); + tt_assert(fast_memeq(buf1, buf3, len2)); + tt_int_op(buf3[len2], OP_EQ, 0); + + /* when we demand a complete output from a real compression method, this + * must fail. */ + tor_free(buf3); + if (method != NO_METHOD) { + tt_assert(tor_uncompress(&buf3, &len2, buf2, len1-16, + method, 1, LOG_INFO)); + tt_ptr_op(buf3, OP_EQ, NULL); + } + + done: + tor_free(buf1); + tor_free(buf2); + tor_free(buf3); +} + +static void +test_util_compress_stream_impl(compress_method_t method, + compression_level_t level) +{ + char *buf1=NULL, *buf2=NULL, *buf3=NULL, *cp1, *cp2; + const char *ccp2; + size_t len1, len2; + + tor_compress_state_t *state = NULL; + state = tor_compress_new(1, method, level); + tt_assert(state); + cp1 = buf1 = tor_malloc(1024); + len1 = 1024; + ccp2 = "ABCDEFGHIJABCDEFGHIJ"; + len2 = 21; + tt_int_op(tor_compress_process(state, &cp1, &len1, &ccp2, &len2, 0), + OP_EQ, TOR_COMPRESS_OK); + tt_int_op(0, OP_EQ, len2); /* Make sure we compressed it all. */ + tt_assert(cp1 > buf1); + + len2 = 0; + cp2 = cp1; + tt_int_op(tor_compress_process(state, &cp1, &len1, &ccp2, &len2, 1), + OP_EQ, TOR_COMPRESS_DONE); + tt_int_op(0, OP_EQ, len2); + if (method == NO_METHOD) { + tt_ptr_op(cp1, OP_EQ, cp2); + } else { + tt_assert(cp1 > cp2); /* Make sure we really added something. */ + } + + tt_int_op(tor_compress_state_size(state), OP_GT, 0); + + tt_assert(!tor_uncompress(&buf3, &len2, buf1, 1024-len1, + method, 1, LOG_WARN)); + /* Make sure it compressed right. */ + tt_str_op(buf3, OP_EQ, "ABCDEFGHIJABCDEFGHIJ"); + tt_int_op(21, OP_EQ, len2); + + done: + if (state) + tor_compress_free(state); + tor_free(buf1); + tor_free(buf2); + tor_free(buf3); +} + +/** Run unit tests for compression functions */ +static void +test_util_compress(void *arg) +{ + const char *methodname = arg; + tt_assert(methodname); + + compress_method_t method = compression_method_get_by_name(methodname); + tt_int_op(method, OP_NE, UNKNOWN_METHOD); + + if (! tor_compress_supports_method(method)) { + tt_skip(); + } + + compression_level_t levels[] = { + BEST_COMPRESSION, + HIGH_COMPRESSION, + MEDIUM_COMPRESSION, + LOW_COMPRESSION + }; + + test_util_compress_impl(method); + + for (unsigned l = 0; l < ARRAY_LENGTH(levels); ++l) { + compression_level_t level = levels[l]; + test_util_compress_stream_impl(method, level); + } + done: + ; +} + +static void +test_util_decompress_concatenated_impl(compress_method_t method) +{ + char input[4096]; + char *c1 = NULL, *c2 = NULL, *c3 = NULL; + char *result = NULL; + size_t sz1, sz2, sz3, szr; + int r; + + crypto_rand(input, sizeof(input)); + + /* Compress the input in two chunks. */ + r = tor_compress(&c1, &sz1, input, 2048, method); + tt_int_op(r, OP_EQ, 0); + r = tor_compress(&c2, &sz2, input+2048, 2048, method); + tt_int_op(r, OP_EQ, 0); + + /* concatenate the chunks. */ + sz3 = sz1 + sz2; + c3 = tor_malloc(sz3); + memcpy(c3, c1, sz1); + memcpy(c3+sz1, c2, sz2); + + /* decompress the concatenated result */ + r = tor_uncompress(&result, &szr, c3, sz3, method, 0, LOG_WARN); + tt_int_op(r, OP_EQ, 0); + tt_int_op(szr, OP_EQ, sizeof(input)); + tt_mem_op(result, OP_EQ, input, sizeof(input)); + + done: + tor_free(c1); + tor_free(c2); + tor_free(c3); + tor_free(result); +} + +static void +test_util_decompress_concatenated(void *arg) +{ + const char *methodname = arg; + tt_assert(methodname); + + compress_method_t method = compression_method_get_by_name(methodname); + tt_int_op(method, OP_NE, UNKNOWN_METHOD); + if (! tor_compress_supports_method(method)) { + tt_skip(); + } + + test_util_decompress_concatenated_impl(method); + done: + ; +} + +static void +test_util_decompress_junk_impl(compress_method_t method) +{ + char input[4096]; + char *result = NULL, *result2 = NULL; + size_t szr, szr2, sz; + int r; + + /* This shouldn't be a compressed string according to any method. */ + strlcpy(input, "This shouldn't be a compressed string by any means.", + sizeof(input)); + sz = strlen(input); + setup_capture_of_logs(LOG_WARN); + r = tor_uncompress(&result, &szr, input, sz, method, 0, LOG_WARN); + tt_int_op(r, OP_EQ, -1); + tt_ptr_op(result, OP_EQ, NULL); + expect_log_msg_containing("Error while uncompressing data: bad input?"); + mock_clean_saved_logs(); + + /* Now try again, with a compressed object that starts out good and turns to + junk. */ + crypto_rand(input, sizeof(input)); + r = tor_compress(&result, &szr, input, sizeof(input), method); + tt_int_op(r, OP_EQ, 0); + crypto_rand(result+szr/2, szr-(szr/2)); // trash the 2nd half of the result + r = tor_uncompress(&result2, &szr2, result, szr, method, 0, LOG_WARN); + tt_int_op(r, OP_EQ, -1); + expect_log_msg_containing("Error while uncompressing data: bad input?"); + + done: + teardown_capture_of_logs(); + tor_free(result); + tor_free(result2); +} + +static void +test_util_decompress_junk(void *arg) +{ + const char *methodname = arg; + tt_assert(methodname); + + compress_method_t method = compression_method_get_by_name(methodname); + tt_int_op(method, OP_NE, UNKNOWN_METHOD); + if (! tor_compress_supports_method(method)) { + tt_skip(); + } + + test_util_decompress_junk_impl(method); + done: + ; +} + +/* mock replacement for tor_compress_is_compression_bomb that doesn't + * believe in compression bombs. */ +static int +mock_is_never_compression_bomb(size_t in, size_t out) +{ + (void)in; + (void) out; + return 0; +} + +static void +test_util_decompress_dos_impl(compress_method_t method) +{ + char *input; + char *result = NULL, *result2 = NULL; + size_t szr, szr2; + int r; + + const size_t big = 1024*1024; + /* one megabyte of 0s. */ + input = tor_malloc_zero(big); + + /* Compress it into "result": it should fail. */ + setup_full_capture_of_logs(LOG_WARN); + r = tor_compress(&result, &szr, input, big, method); + tt_int_op(r, OP_EQ, -1); + expect_log_msg_containing( + "other Tors would think this was a compression bomb"); + teardown_capture_of_logs(); + + /* Try again, but this time suppress compression-bomb detection */ + MOCK(tor_compress_is_compression_bomb, mock_is_never_compression_bomb); + r = tor_compress(&result, &szr, input, big, method); + UNMOCK(tor_compress_is_compression_bomb); + tt_int_op(r, OP_EQ, 0); + tt_ptr_op(result, OP_NE, NULL); + + /* We should refuse to uncomrpess it again, since it looks like a + * compression bomb. */ + setup_capture_of_logs(LOG_WARN); + r = tor_uncompress(&result2, &szr2, result, szr, method, 0, LOG_WARN); + tt_int_op(r, OP_EQ, -1); + expect_log_msg_containing("bomb; abandoning stream"); + + done: + teardown_capture_of_logs(); + tor_free(input); + tor_free(result); + tor_free(result2); +} + +static void +test_util_decompress_dos(void *arg) +{ + const char *methodname = arg; + tt_assert(methodname); + + compress_method_t method = compression_method_get_by_name(methodname); + tt_int_op(method, OP_NE, UNKNOWN_METHOD); + if (! tor_compress_supports_method(method)) { + tt_skip(); + } + + test_util_decompress_dos_impl(method); + done: + ; +} + +static void +test_util_gzip_compression_bomb(void *arg) +{ + /* A 'compression bomb' is a very small object that uncompresses to a huge + * one. Most compression formats support them, but they can be a DOS vector. + * In Tor we try not to generate them, and we don't accept them. + */ + (void) arg; + size_t one_million = 1<<20; + char *one_mb = tor_malloc_zero(one_million); + char *result = NULL; + size_t result_len = 0; + tor_compress_state_t *state = NULL; + + /* Make sure we can't produce a compression bomb */ + setup_full_capture_of_logs(LOG_WARN); + tt_int_op(-1, OP_EQ, tor_compress(&result, &result_len, + one_mb, one_million, + ZLIB_METHOD)); + expect_single_log_msg_containing( + "We compressed something and got an insanely high " + "compression factor; other Tors would think this " + "was a compression bomb."); + teardown_capture_of_logs(); + + /* Here's a compression bomb that we made manually. */ + const char compression_bomb[1039] = + { 0x78, 0xDA, 0xED, 0xC1, 0x31, 0x01, 0x00, 0x00, 0x00, 0xC2, + 0xA0, 0xF5, 0x4F, 0x6D, 0x08, 0x5F, 0xA0 /* .... */ }; + tt_int_op(-1, OP_EQ, tor_uncompress(&result, &result_len, + compression_bomb, 1039, + ZLIB_METHOD, 0, LOG_WARN)); + + /* Now try streaming that. */ + state = tor_compress_new(0, ZLIB_METHOD, HIGH_COMPRESSION); + tor_compress_output_t r; + const char *inp = compression_bomb; + size_t inlen = 1039; + do { + char *outp = one_mb; + size_t outleft = 4096; /* small on purpose */ + r = tor_compress_process(state, &outp, &outleft, &inp, &inlen, 0); + tt_int_op(inlen, OP_NE, 0); + } while (r == TOR_COMPRESS_BUFFER_FULL); + + tt_int_op(r, OP_EQ, TOR_COMPRESS_ERROR); + + done: + tor_free(one_mb); + tor_compress_free(state); +} + +/** Run unit tests for mmap() wrapper functionality. */ +static void +test_util_mmap(void *arg) +{ + char *fname1 = tor_strdup(get_fname("mapped_1")); + char *fname2 = tor_strdup(get_fname("mapped_2")); + char *fname3 = tor_strdup(get_fname("mapped_3")); + const size_t buflen = 17000; + char *buf = tor_malloc(17000); + tor_mmap_t *mapping = NULL; + + (void)arg; + crypto_rand(buf, buflen); + + mapping = tor_mmap_file(fname1); + tt_ptr_op(mapping, OP_EQ, NULL); + + write_str_to_file(fname1, "Short file.", 1); + + mapping = tor_mmap_file(fname1); + tt_assert(mapping); + tt_int_op(mapping->size,OP_EQ, strlen("Short file.")); + tt_str_op(mapping->data,OP_EQ, "Short file."); +#ifdef _WIN32 + tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); + mapping = NULL; + tt_assert(unlink(fname1) == 0); +#else + /* make sure we can unlink. */ + tt_assert(unlink(fname1) == 0); + tt_str_op(mapping->data,OP_EQ, "Short file."); + tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); + mapping = NULL; +#endif /* defined(_WIN32) */ + + /* Now a zero-length file. */ + write_str_to_file(fname1, "", 1); + mapping = tor_mmap_file(fname1); + tt_ptr_op(mapping,OP_EQ, NULL); + tt_int_op(ERANGE,OP_EQ, errno); + unlink(fname1); + + /* Make sure that we fail to map a no-longer-existent file. */ + mapping = tor_mmap_file(fname1); + tt_ptr_op(mapping, OP_EQ, NULL); + + /* Now try a big file that stretches across a few pages and isn't aligned */ + write_bytes_to_file(fname2, buf, buflen, 1); + mapping = tor_mmap_file(fname2); + tt_assert(mapping); + tt_int_op(mapping->size,OP_EQ, buflen); + tt_mem_op(mapping->data,OP_EQ, buf, buflen); + tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); + mapping = NULL; + + /* Now try a big aligned file. */ + write_bytes_to_file(fname3, buf, 16384, 1); + mapping = tor_mmap_file(fname3); + tt_assert(mapping); + tt_int_op(mapping->size,OP_EQ, 16384); + tt_mem_op(mapping->data,OP_EQ, buf, 16384); + tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); + mapping = NULL; + + done: + unlink(fname1); + unlink(fname2); + unlink(fname3); + + tor_free(fname1); + tor_free(fname2); + tor_free(fname3); + tor_free(buf); + + tor_munmap_file(mapping); +} + +/** Run unit tests for escaping/unescaping data for use by controllers. */ +static void +test_util_control_formats(void *arg) +{ + char *out = NULL; + const char *inp = + "..This is a test\r\n.of the emergency \n..system.\r\n\rZ.\r\n"; + size_t sz; + + (void)arg; + sz = read_escaped_data(inp, strlen(inp), &out); + tt_str_op(out,OP_EQ, + ".This is a test\nof the emergency \n.system.\n\rZ.\n"); + tt_int_op(sz,OP_EQ, strlen(out)); + + done: + tor_free(out); +} + +#define test_feq(value1,value2) do { \ + double v1 = (value1), v2=(value2); \ + double tf_diff = v1-v2; \ + double tf_tolerance = ((v1+v2)/2.0)/1e8; \ + if (tf_diff<0) tf_diff=-tf_diff; \ + if (tf_tolerance<0) tf_tolerance=-tf_tolerance; \ + if (tf_diff 1 year are reported in days (warn?) */ + + /* ignore exact spelling of "days(s)," etc., if present */ + format_time_interval(dbuf, sizeof(dbuf), 758635154); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); + r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, + &day, label_d, &hour, label_h, &min, label_m); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 8780); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 11); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 59); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + + /* negative periods > 1 year are reported in days (warn?) */ + + format_time_interval(dbuf, sizeof(dbuf), -1427014922); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); + r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, + &day, label_d, &hour, label_h, &min, label_m); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 16516); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 9); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 2); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + +#if SIZEOF_LONG == 4 || SIZEOF_LONG == 8 + + /* We can try INT32_MIN/MAX */ + /* Always ignore second(s) */ + + /* INT32_MAX */ + format_time_interval(dbuf, sizeof(dbuf), 2147483647); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); + r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, + &day, label_d, &hour, label_h, &min, label_m); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 24855); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 3); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 14); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + /* and 7 seconds - ignored */ + + /* INT32_MIN: check that we get the absolute value of interval, + * which doesn't actually fit in int32_t. + * We expect INT32_MAX or INT32_MAX + 1 with 64 bit longs */ + format_time_interval(dbuf, sizeof(dbuf), -2147483647L - 1L); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); + r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, + &day, label_d, &hour, label_h, &min, label_m); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 24855); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 3); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 14); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + /* and 7 or 8 seconds - ignored */ + +#endif /* SIZEOF_LONG == 4 || SIZEOF_LONG == 8 */ + +#if SIZEOF_LONG == 8 + + /* We can try INT64_MIN/MAX */ + /* Always ignore second(s) */ + + /* INT64_MAX */ + format_time_interval(dbuf, sizeof(dbuf), 9223372036854775807L); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); + r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, + &day, label_d, &hour, label_h, &min, label_m); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 106751991167300L); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 15); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 30); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + /* and 7 seconds - ignored */ + + /* INT64_MIN: check that we get the absolute value of interval, + * which doesn't actually fit in int64_t. + * We expect INT64_MAX */ + format_time_interval(dbuf, sizeof(dbuf), + -9223372036854775807L - 1L); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); + r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, + &day, label_d, &hour, label_h, &min, label_m); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 106751991167300L); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 15); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 30); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + /* and 7 or 8 seconds - ignored */ + +#endif /* SIZEOF_LONG == 8 */ + + done: + ; +} + +#undef tt_char_op +#undef tt_ci_char_op +#undef DBUF_SIZE +#undef T_ +#undef LABEL_SIZE +#undef L_ +#undef TL_ + +static void +test_util_path_is_relative(void *arg) +{ + /* OS-independent tests */ + (void)arg; + tt_int_op(1,OP_EQ, path_is_relative("")); + tt_int_op(1,OP_EQ, path_is_relative("dir")); + tt_int_op(1,OP_EQ, path_is_relative("dir/")); + tt_int_op(1,OP_EQ, path_is_relative("./dir")); + tt_int_op(1,OP_EQ, path_is_relative("../dir")); + + tt_int_op(0,OP_EQ, path_is_relative("/")); + tt_int_op(0,OP_EQ, path_is_relative("/dir")); + tt_int_op(0,OP_EQ, path_is_relative("/dir/")); + + /* Windows */ +#ifdef _WIN32 + /* I don't have Windows so I can't test this, hence the "#ifdef + 0". These are tests that look useful, so please try to get them + running and uncomment if it all works as it should */ + tt_int_op(1,OP_EQ, path_is_relative("dir")); + tt_int_op(1,OP_EQ, path_is_relative("dir\\")); + tt_int_op(1,OP_EQ, path_is_relative("dir\\a:")); + tt_int_op(1,OP_EQ, path_is_relative("dir\\a:\\")); + tt_int_op(1,OP_EQ, path_is_relative("http:\\dir")); + + tt_int_op(0,OP_EQ, path_is_relative("\\dir")); + tt_int_op(0,OP_EQ, path_is_relative("a:\\dir")); + tt_int_op(0,OP_EQ, path_is_relative("z:\\dir")); +#endif /* defined(_WIN32) */ + + done: + ; +} + +/** Run unittests for memory area allocator */ +static void +test_util_memarea(void *arg) +{ + memarea_t *area = memarea_new(); + char *p1, *p2, *p3, *p1_orig; + void *malloced_ptr = NULL; + int i; + +#ifdef DISABLE_MEMORY_SENTINELS + /* If memory sentinels are disabled, this whole module is just an alias for + malloc(), which is free to lay out memory most any way it wants. */ + if (1) + tt_skip(); +#endif /* defined(DISABLE_MEMORY_SENTINELS) */ + + (void)arg; + tt_assert(area); + + p1_orig = p1 = memarea_alloc(area,64); + p2 = memarea_alloc_zero(area,52); + p3 = memarea_alloc(area,11); + + tt_assert(memarea_owns_ptr(area, p1)); + tt_assert(memarea_owns_ptr(area, p2)); + tt_assert(memarea_owns_ptr(area, p3)); + /* Make sure we left enough space. */ + tt_assert(p1+64 <= p2); + tt_assert(p2+52 <= p3); + /* Make sure we aligned. */ + tt_int_op(((uintptr_t)p1) % sizeof(void*),OP_EQ, 0); + tt_int_op(((uintptr_t)p2) % sizeof(void*),OP_EQ, 0); + tt_int_op(((uintptr_t)p3) % sizeof(void*),OP_EQ, 0); + tt_assert(!memarea_owns_ptr(area, p3+8192)); + tt_assert(!memarea_owns_ptr(area, p3+30)); + tt_assert(tor_mem_is_zero(p2, 52)); + /* Make sure we don't overalign. */ + p1 = memarea_alloc(area, 1); + p2 = memarea_alloc(area, 1); + tt_ptr_op(p1+sizeof(void*),OP_EQ, p2); + { + malloced_ptr = tor_malloc(64); + tt_assert(!memarea_owns_ptr(area, malloced_ptr)); + tor_free(malloced_ptr); + } + + /* memarea_memdup */ + { + malloced_ptr = tor_malloc(64); + crypto_rand((char*)malloced_ptr, 64); + p1 = memarea_memdup(area, malloced_ptr, 64); + tt_assert(p1 != malloced_ptr); + tt_mem_op(p1,OP_EQ, malloced_ptr, 64); + tor_free(malloced_ptr); + } + + /* memarea_strdup. */ + p1 = memarea_strdup(area,""); + p2 = memarea_strdup(area, "abcd"); + tt_assert(p1); + tt_assert(p2); + tt_str_op(p1,OP_EQ, ""); + tt_str_op(p2,OP_EQ, "abcd"); + + /* memarea_strndup. */ + { + const char *s = "Ad ogni porta batte la morte e grida: il nome!"; + /* (From Turandot, act 3.) */ + size_t len = strlen(s); + p1 = memarea_strndup(area, s, 1000); + p2 = memarea_strndup(area, s, 10); + tt_str_op(p1,OP_EQ, s); + tt_assert(p2 >= p1 + len + 1); + tt_mem_op(s,OP_EQ, p2, 10); + tt_int_op(p2[10],OP_EQ, '\0'); + p3 = memarea_strndup(area, s, len); + tt_str_op(p3,OP_EQ, s); + p3 = memarea_strndup(area, s, len-1); + tt_mem_op(s,OP_EQ, p3, len-1); + tt_int_op(p3[len-1],OP_EQ, '\0'); + } + + memarea_clear(area); + p1 = memarea_alloc(area, 1); + tt_ptr_op(p1,OP_EQ, p1_orig); + memarea_clear(area); + size_t total = 0, initial_allocation, allocation2, dummy; + memarea_get_stats(area, &initial_allocation, &dummy); + + /* Check for running over an area's size. */ + for (i = 0; i < 4096; ++i) { + size_t n = crypto_rand_int(6); + p1 = memarea_alloc(area, n); + total += n; + tt_assert(memarea_owns_ptr(area, p1)); + } + memarea_assert_ok(area); + memarea_get_stats(area, &allocation2, &dummy); + /* Make sure we can allocate a too-big object. */ + p1 = memarea_alloc_zero(area, 9000); + p2 = memarea_alloc_zero(area, 16); + total += 9000; + total += 16; + tt_assert(memarea_owns_ptr(area, p1)); + tt_assert(memarea_owns_ptr(area, p2)); + + /* Now test stats... */ + size_t allocated = 0, used = 0; + memarea_get_stats(area, &allocated, &used); + tt_int_op(used, OP_LE, allocated); + tt_int_op(used, OP_GE, total); /* not EQ, because of alignment and headers*/ + tt_int_op(allocated, OP_GT, allocation2); + + tt_int_op(allocation2, OP_GT, initial_allocation); + + memarea_clear(area); + memarea_get_stats(area, &allocated, &used); + tt_int_op(used, OP_LT, 128); /* Not 0, because of header */ + tt_int_op(allocated, OP_EQ, initial_allocation); + + done: + memarea_drop_all(area); + tor_free(malloced_ptr); +} + +/** Run unit tests for utility functions to get file names relative to + * the data directory. */ +static void +test_util_datadir(void *arg) +{ + char buf[1024]; + char *f = NULL; + char *temp_dir = NULL; + + (void)arg; + temp_dir = get_datadir_fname(NULL); + f = get_datadir_fname("state"); + tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"state", temp_dir); + tt_str_op(f,OP_EQ, buf); + tor_free(f); + f = get_datadir_fname2("cache", "thingy"); + tor_snprintf(buf, sizeof(buf), + "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy", temp_dir); + tt_str_op(f,OP_EQ, buf); + tor_free(f); + f = get_datadir_fname2_suffix("cache", "thingy", ".foo"); + tor_snprintf(buf, sizeof(buf), + "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy.foo", temp_dir); + tt_str_op(f,OP_EQ, buf); + tor_free(f); + f = get_datadir_fname_suffix("cache", ".foo"); + tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"cache.foo", + temp_dir); + tt_str_op(f,OP_EQ, buf); + + done: + tor_free(f); + tor_free(temp_dir); +} + +static void +test_util_strtok(void *arg) +{ + char buf[128]; + char buf2[128]; + int i; + char *cp1, *cp2; + + (void)arg; + for (i = 0; i < 3; i++) { + const char *pad1="", *pad2=""; + switch (i) { + case 0: + break; + case 1: + pad1 = " "; + pad2 = "!"; + break; + case 2: + pad1 = " "; + pad2 = ";!"; + break; + } + tor_snprintf(buf, sizeof(buf), "%s", pad1); + tor_snprintf(buf2, sizeof(buf2), "%s", pad2); + tt_ptr_op(tor_strtok_r_impl(buf, " ", &cp1), OP_EQ, NULL); + tt_ptr_op(tor_strtok_r_impl(buf2, ".!..;!", &cp2), OP_EQ, NULL); + + tor_snprintf(buf, sizeof(buf), + "%sGraved on the dark in gestures of descent%s", pad1, pad1); + tor_snprintf(buf2, sizeof(buf2), + "%sthey.seemed;;their!.own;most.perfect;monument%s",pad2,pad2); + /* -- "Year's End", Richard Wilbur */ + + tt_str_op("Graved",OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); + tt_str_op("they",OP_EQ, tor_strtok_r_impl(buf2, ".!..;!", &cp2)); +#define S1() tor_strtok_r_impl(NULL, " ", &cp1) +#define S2() tor_strtok_r_impl(NULL, ".!..;!", &cp2) + tt_str_op("on",OP_EQ, S1()); + tt_str_op("the",OP_EQ, S1()); + tt_str_op("dark",OP_EQ, S1()); + tt_str_op("seemed",OP_EQ, S2()); + tt_str_op("their",OP_EQ, S2()); + tt_str_op("own",OP_EQ, S2()); + tt_str_op("in",OP_EQ, S1()); + tt_str_op("gestures",OP_EQ, S1()); + tt_str_op("of",OP_EQ, S1()); + tt_str_op("most",OP_EQ, S2()); + tt_str_op("perfect",OP_EQ, S2()); + tt_str_op("descent",OP_EQ, S1()); + tt_str_op("monument",OP_EQ, S2()); + tt_ptr_op(NULL,OP_EQ, S1()); + tt_ptr_op(NULL,OP_EQ, S2()); + } + + buf[0] = 0; + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, "!", &cp1)); + + strlcpy(buf, "Howdy!", sizeof(buf)); + tt_str_op("Howdy",OP_EQ, tor_strtok_r_impl(buf, "!", &cp1)); + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(NULL, "!", &cp1)); + + strlcpy(buf, " ", sizeof(buf)); + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); + strlcpy(buf, " ", sizeof(buf)); + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); + + strlcpy(buf, "something ", sizeof(buf)); + tt_str_op("something",OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(NULL, ";", &cp1)); + done: + ; +} + +static void +test_util_find_str_at_start_of_line(void *ptr) +{ + const char *long_string = + "howdy world. how are you? i hope it's fine.\n" + "hello kitty\n" + "third line"; + char *line2 = strchr(long_string,'\n')+1; + char *line3 = strchr(line2,'\n')+1; + const char *short_string = "hello kitty\n" + "second line\n"; + char *short_line2 = strchr(short_string,'\n')+1; + + (void)ptr; + + tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, "")); + tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(short_string, "nonsense")); + tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "nonsense")); + tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "\n")); + tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "how ")); + tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "kitty")); + tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, "h")); + tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, "how")); + tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "he")); + tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "hell")); + tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "hello k")); + tt_ptr_op(line2,OP_EQ, + find_str_at_start_of_line(long_string, "hello kitty\n")); + tt_ptr_op(line2,OP_EQ, + find_str_at_start_of_line(long_string, "hello kitty\nt")); + tt_ptr_op(line3,OP_EQ, find_str_at_start_of_line(long_string, "third")); + tt_ptr_op(line3,OP_EQ, find_str_at_start_of_line(long_string, "third line")); + tt_ptr_op(NULL, OP_EQ, + find_str_at_start_of_line(long_string, "third line\n")); + tt_ptr_op(short_line2,OP_EQ, find_str_at_start_of_line(short_string, + "second line\n")); + done: + ; +} + +static void +test_util_string_is_C_identifier(void *ptr) +{ + (void)ptr; + + tt_int_op(1,OP_EQ, string_is_C_identifier("string_is_C_identifier")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_string_is_C_identifier")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_")); + tt_int_op(1,OP_EQ, string_is_C_identifier("i")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_____")); + tt_int_op(1,OP_EQ, string_is_C_identifier("__00__")); + tt_int_op(1,OP_EQ, string_is_C_identifier("__init__")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_0")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_0string_is_C_identifier")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_0")); + + tt_int_op(0,OP_EQ, string_is_C_identifier("0_string_is_C_identifier")); + tt_int_op(0,OP_EQ, string_is_C_identifier("0")); + tt_int_op(0,OP_EQ, string_is_C_identifier("")); + tt_int_op(0,OP_EQ, string_is_C_identifier(";")); + tt_int_op(0,OP_EQ, string_is_C_identifier("i;")); + tt_int_op(0,OP_EQ, string_is_C_identifier("_;")); + tt_int_op(0,OP_EQ, string_is_C_identifier("í")); + tt_int_op(0,OP_EQ, string_is_C_identifier("ñ")); + + done: + ; +} + +static void +test_util_asprintf(void *ptr) +{ +#define LOREMIPSUM \ + "Lorem ipsum dolor sit amet, consectetur adipisicing elit" + char *cp=NULL, *cp2=NULL; + int r; + (void)ptr; + + /* simple string */ + r = tor_asprintf(&cp, "simple string 100%% safe"); + tt_assert(cp); + tt_str_op("simple string 100% safe",OP_EQ, cp); + tt_int_op(strlen(cp),OP_EQ, r); + tor_free(cp); + + /* empty string */ + r = tor_asprintf(&cp, "%s", ""); + tt_assert(cp); + tt_str_op("",OP_EQ, cp); + tt_int_op(strlen(cp),OP_EQ, r); + tor_free(cp); + + /* numbers (%i) */ + r = tor_asprintf(&cp, "I like numbers-%2i, %i, etc.", -1, 2); + tt_assert(cp); + tt_str_op("I like numbers--1, 2, etc.",OP_EQ, cp); + tt_int_op(strlen(cp),OP_EQ, r); + /* don't free cp; next test uses it. */ + + /* numbers (%d) */ + r = tor_asprintf(&cp2, "First=%d, Second=%d", 101, 202); + tt_assert(cp2); + tt_int_op(strlen(cp2),OP_EQ, r); + tt_str_op("First=101, Second=202",OP_EQ, cp2); + tt_assert(cp != cp2); + tor_free(cp); + tor_free(cp2); + + /* Glass-box test: a string exactly 128 characters long. */ + r = tor_asprintf(&cp, "Lorem1: %sLorem2: %s", LOREMIPSUM, LOREMIPSUM); + tt_assert(cp); + tt_int_op(128,OP_EQ, r); + tt_int_op(cp[128], OP_EQ, '\0'); + tt_str_op("Lorem1: "LOREMIPSUM"Lorem2: "LOREMIPSUM,OP_EQ, cp); + tor_free(cp); + + /* String longer than 128 characters */ + r = tor_asprintf(&cp, "1: %s 2: %s 3: %s", + LOREMIPSUM, LOREMIPSUM, LOREMIPSUM); + tt_assert(cp); + tt_int_op(strlen(cp),OP_EQ, r); + tt_str_op("1: "LOREMIPSUM" 2: "LOREMIPSUM" 3: "LOREMIPSUM,OP_EQ, cp); + + done: + tor_free(cp); + tor_free(cp2); +} + +static void +test_util_listdir(void *ptr) +{ + smartlist_t *dir_contents = NULL; + char *fname1=NULL, *fname2=NULL, *fname3=NULL, *dir1=NULL, *dirname=NULL; + int r; + (void)ptr; + + fname1 = tor_strdup(get_fname("hopscotch")); + fname2 = tor_strdup(get_fname("mumblety-peg")); + fname3 = tor_strdup(get_fname(".hidden-file")); + dir1 = tor_strdup(get_fname("some-directory")); + dirname = tor_strdup(get_fname(NULL)); + + tt_int_op(0,OP_EQ, write_str_to_file(fname1, "X\n", 0)); + tt_int_op(0,OP_EQ, write_str_to_file(fname2, "Y\n", 0)); + tt_int_op(0,OP_EQ, write_str_to_file(fname3, "Z\n", 0)); +#ifdef _WIN32 + r = mkdir(dir1); +#else + r = mkdir(dir1, 0700); +#endif + if (r) { + fprintf(stderr, "Can't create directory %s:", dir1); + perror(""); + exit(1); + } + + dir_contents = tor_listdir(dirname); + tt_assert(dir_contents); + /* make sure that each filename is listed. */ + tt_assert(smartlist_contains_string_case(dir_contents, "hopscotch")); + tt_assert(smartlist_contains_string_case(dir_contents, "mumblety-peg")); + tt_assert(smartlist_contains_string_case(dir_contents, ".hidden-file")); + tt_assert(smartlist_contains_string_case(dir_contents, "some-directory")); + + tt_assert(!smartlist_contains_string(dir_contents, ".")); + tt_assert(!smartlist_contains_string(dir_contents, "..")); + + done: + tor_free(fname1); + tor_free(fname2); + tor_free(fname3); + tor_free(dir1); + tor_free(dirname); + if (dir_contents) { + SMARTLIST_FOREACH(dir_contents, char *, cp, tor_free(cp)); + smartlist_free(dir_contents); + } +} + +static void +test_util_parent_dir(void *ptr) +{ + char *cp; + (void)ptr; + +#define T(output,expect_ok,input) \ + do { \ + int ok; \ + cp = tor_strdup(input); \ + ok = get_parent_directory(cp); \ + tt_int_op(expect_ok, OP_EQ, ok); \ + if (ok==0) \ + tt_str_op(output, OP_EQ, cp); \ + tor_free(cp); \ + } while (0); + + T("/home/wombat", 0, "/home/wombat/knish"); + T("/home/wombat", 0, "/home/wombat/knish/"); + T("/home/wombat", 0, "/home/wombat/knish///"); + T("./home/wombat", 0, "./home/wombat/knish/"); + T("/", 0, "/home"); + T("/", 0, "/home//"); + T(".", 0, "./wombat"); + T(".", 0, "./wombat/"); + T(".", 0, "./wombat//"); + T("wombat", 0, "wombat/foo"); + T("wombat/..", 0, "wombat/../foo"); + T("wombat/../", 0, "wombat/..//foo"); /* Is this correct? */ + T("wombat/.", 0, "wombat/./foo"); + T("wombat/./", 0, "wombat/.//foo"); /* Is this correct? */ + T("wombat", 0, "wombat/..//"); + T("wombat", 0, "wombat/foo/"); + T("wombat", 0, "wombat/.foo"); + T("wombat", 0, "wombat/.foo/"); + + T("wombat", -1, ""); + T("w", -1, ""); + T("wombat", 0, "wombat/knish"); + + T("/", 0, "/"); + T("/", 0, "////"); + + done: + tor_free(cp); +} + +static void +test_util_ftruncate(void *ptr) +{ + char *buf = NULL; + const char *fname; + int fd = -1; + const char *message = "Hello world"; + const char *message2 = "Hola mundo"; + struct stat st; + + (void) ptr; + + fname = get_fname("ftruncate"); + + fd = tor_open_cloexec(fname, O_WRONLY|O_CREAT, 0600); + tt_int_op(fd, OP_GE, 0); + + /* Make the file be there. */ + tt_int_op(strlen(message), OP_EQ, write_all(fd, message, strlen(message),0)); + tt_int_op((int)tor_fd_getpos(fd), OP_EQ, strlen(message)); + tt_int_op(0, OP_EQ, fstat(fd, &st)); + tt_int_op((int)st.st_size, OP_EQ, strlen(message)); + + /* Truncate and see if it got truncated */ + tt_int_op(0, OP_EQ, tor_ftruncate(fd)); + tt_int_op((int)tor_fd_getpos(fd), OP_EQ, 0); + tt_int_op(0, OP_EQ, fstat(fd, &st)); + tt_int_op((int)st.st_size, OP_EQ, 0); + + /* Replace, and see if it got replaced */ + tt_int_op(strlen(message2), OP_EQ, + write_all(fd, message2, strlen(message2), 0)); + tt_int_op((int)tor_fd_getpos(fd), OP_EQ, strlen(message2)); + tt_int_op(0, OP_EQ, fstat(fd, &st)); + tt_int_op((int)st.st_size, OP_EQ, strlen(message2)); + + close(fd); + fd = -1; + + buf = read_file_to_str(fname, 0, NULL); + tt_str_op(message2, OP_EQ, buf); + + done: + if (fd >= 0) + close(fd); + tor_free(buf); +} + +static void +test_util_num_cpus(void *arg) +{ + (void)arg; + int num = compute_num_cpus(); + if (num < 0) + tt_skip(); + + tt_int_op(num, OP_GE, 1); + tt_int_op(num, OP_LE, 16); + + done: + ; +} + +#ifdef _WIN32 +static void +test_util_load_win_lib(void *ptr) +{ + HANDLE h = load_windows_system_library(_T("advapi32.dll")); + (void) ptr; + + tt_assert(h); + done: + if (h) + FreeLibrary(h); +} +#endif /* defined(_WIN32) */ + +#ifndef _WIN32 +static void +clear_hex_errno(char *hex_errno) +{ + memset(hex_errno, '\0', HEX_ERRNO_SIZE + 1); +} + +static void +test_util_exit_status(void *ptr) +{ + /* Leave an extra byte for a \0 so we can do string comparison */ + char hex_errno[HEX_ERRNO_SIZE + 1]; + int n; + + (void)ptr; + + clear_hex_errno(hex_errno); + tt_str_op("",OP_EQ, hex_errno); + + clear_hex_errno(hex_errno); + n = format_helper_exit_status(0, 0, hex_errno); + tt_str_op("0/0\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); + +#if SIZEOF_INT == 4 + + clear_hex_errno(hex_errno); + n = format_helper_exit_status(0, 0x7FFFFFFF, hex_errno); + tt_str_op("0/7FFFFFFF\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); + + clear_hex_errno(hex_errno); + n = format_helper_exit_status(0xFF, -0x80000000, hex_errno); + tt_str_op("FF/-80000000\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); + tt_int_op(n,OP_EQ, HEX_ERRNO_SIZE); + +#elif SIZEOF_INT == 8 + + clear_hex_errno(hex_errno); + n = format_helper_exit_status(0, 0x7FFFFFFFFFFFFFFF, hex_errno); + tt_str_op("0/7FFFFFFFFFFFFFFF\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); + + clear_hex_errno(hex_errno); + n = format_helper_exit_status(0xFF, -0x8000000000000000, hex_errno); + tt_str_op("FF/-8000000000000000\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); + tt_int_op(n,OP_EQ, HEX_ERRNO_SIZE); + +#endif /* SIZEOF_INT == 4 || ... */ + + clear_hex_errno(hex_errno); + n = format_helper_exit_status(0x7F, 0, hex_errno); + tt_str_op("7F/0\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); + + clear_hex_errno(hex_errno); + n = format_helper_exit_status(0x08, -0x242, hex_errno); + tt_str_op("8/-242\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); + + clear_hex_errno(hex_errno); + tt_str_op("",OP_EQ, hex_errno); + + done: + ; +} +#endif /* !defined(_WIN32) */ + +#ifndef _WIN32 +static void +test_util_string_from_pipe(void *ptr) +{ + int test_pipe[2] = {-1, -1}; + int retval = 0; + enum stream_status status = IO_STREAM_TERM; + ssize_t retlen; + char buf[4] = { 0 }; + + (void)ptr; + + errno = 0; + + /* Set up a pipe to test on */ + retval = pipe(test_pipe); + tt_int_op(retval, OP_EQ, 0); + + /* Send in a string. */ + retlen = write(test_pipe[1], "ABC", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "ABC"); + errno = 0; + + /* Send in a string that contains a nul. */ + retlen = write(test_pipe[1], "AB\0", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AB"); + errno = 0; + + /* Send in a string that contains a nul only. */ + retlen = write(test_pipe[1], "\0", 1); + tt_int_op(retlen, OP_EQ, 1); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, ""); + errno = 0; + + /* Send in a string that contains a trailing newline. */ + retlen = write(test_pipe[1], "AB\n", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AB"); + errno = 0; + + /* Send in a string that contains a newline only. */ + retlen = write(test_pipe[1], "\n", 1); + tt_int_op(retlen, OP_EQ, 1); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, ""); + errno = 0; + + /* Send in a string and check that we nul terminate return values. */ + retlen = write(test_pipe[1], "AAA", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AAA"); + tt_mem_op(buf, OP_EQ, "AAA\0", sizeof(buf)); + errno = 0; + + retlen = write(test_pipe[1], "B", 1); + tt_int_op(retlen, OP_EQ, 1); + + memset(buf, '\xff', sizeof(buf)); + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "B"); + tt_mem_op(buf, OP_EQ, "B\0\xff\xff", sizeof(buf)); + errno = 0; + + /* Send in multiple lines. */ + retlen = write(test_pipe[1], "A\nB", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "A\nB"); + errno = 0; + + /* Send in a line and close */ + retlen = write(test_pipe[1], "AB", 2); + tt_int_op(retlen, OP_EQ, 2); + retval = close(test_pipe[1]); + tt_int_op(retval, OP_EQ, 0); + test_pipe[1] = -1; + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AB"); + errno = 0; + + /* Check for EOF */ + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_CLOSED); + errno = 0; + + done: + if (test_pipe[0] != -1) + close(test_pipe[0]); + if (test_pipe[1] != -1) + close(test_pipe[1]); +} + +#endif /* !defined(_WIN32) */ + +/** + * Test for format_hex_number_sigsafe() + */ + +static void +test_util_format_hex_number(void *ptr) +{ + int i, len; + char buf[33]; + const struct { + const char *str; + unsigned int x; + } test_data[] = { + {"0", 0}, + {"1", 1}, + {"273A", 0x273a}, + {"FFFF", 0xffff}, + {"7FFFFFFF", 0x7fffffff}, + {"FFFFFFFF", 0xffffffff}, +#if UINT_MAX >= 0xffffffff + {"31BC421D", 0x31bc421d}, + {"FFFFFFFF", 0xffffffff}, +#endif + {NULL, 0} + }; + + (void)ptr; + + for (i = 0; test_data[i].str != NULL; ++i) { + len = format_hex_number_sigsafe(test_data[i].x, buf, sizeof(buf)); + tt_int_op(len,OP_NE, 0); + tt_int_op(len,OP_EQ, strlen(buf)); + tt_str_op(buf,OP_EQ, test_data[i].str); + } + + tt_int_op(4,OP_EQ, format_hex_number_sigsafe(0xffff, buf, 5)); + tt_str_op(buf,OP_EQ, "FFFF"); + tt_int_op(0,OP_EQ, format_hex_number_sigsafe(0xffff, buf, 4)); + tt_int_op(0,OP_EQ, format_hex_number_sigsafe(0, buf, 1)); + + done: + return; +} + +/** + * Test for format_hex_number_sigsafe() + */ + +static void +test_util_format_dec_number(void *ptr) +{ + int i, len; + char buf[33]; + const struct { + const char *str; + unsigned int x; + } test_data[] = { + {"0", 0}, + {"1", 1}, + {"1234", 1234}, + {"12345678", 12345678}, + {"99999999", 99999999}, + {"100000000", 100000000}, + {"4294967295", 4294967295u}, +#if UINT_MAX > 0xffffffff + {"18446744073709551615", 18446744073709551615u }, +#endif + {NULL, 0} + }; + + (void)ptr; + + for (i = 0; test_data[i].str != NULL; ++i) { + len = format_dec_number_sigsafe(test_data[i].x, buf, sizeof(buf)); + tt_int_op(len,OP_NE, 0); + tt_int_op(len,OP_EQ, strlen(buf)); + tt_str_op(buf,OP_EQ, test_data[i].str); + + len = format_dec_number_sigsafe(test_data[i].x, buf, + (int)(strlen(test_data[i].str) + 1)); + tt_int_op(len,OP_EQ, strlen(buf)); + tt_str_op(buf,OP_EQ, test_data[i].str); + } + + tt_int_op(4,OP_EQ, format_dec_number_sigsafe(7331, buf, 5)); + tt_str_op(buf,OP_EQ, "7331"); + tt_int_op(0,OP_EQ, format_dec_number_sigsafe(7331, buf, 4)); + tt_int_op(1,OP_EQ, format_dec_number_sigsafe(0, buf, 2)); + tt_int_op(0,OP_EQ, format_dec_number_sigsafe(0, buf, 1)); + + done: + return; +} + +/** + * Test that we can properly format a Windows command line + */ +static void +test_util_join_win_cmdline(void *ptr) +{ + /* Based on some test cases from "Parsing C++ Command-Line Arguments" in + * MSDN but we don't exercise all quoting rules because tor_join_win_cmdline + * will try to only generate simple cases for the child process to parse; + * i.e. we never embed quoted strings in arguments. */ + + const char *argvs[][4] = { + {"a", "bb", "CCC", NULL}, // Normal + {NULL, NULL, NULL, NULL}, // Empty argument list + {"", NULL, NULL, NULL}, // Empty argument + {"\"a", "b\"b", "CCC\"", NULL}, // Quotes + {"a\tbc", "dd dd", "E", NULL}, // Whitespace + {"a\\\\\\b", "de fg", "H", NULL}, // Backslashes + {"a\\\"b", "\\c", "D\\", NULL}, // Backslashes before quote + {"a\\\\b c", "d", "E", NULL}, // Backslashes not before quote + { NULL } // Terminator + }; + + const char *cmdlines[] = { + "a bb CCC", + "", + "\"\"", + "\\\"a b\\\"b CCC\\\"", + "\"a\tbc\" \"dd dd\" E", + "a\\\\\\b \"de fg\" H", + "a\\\\\\\"b \\c D\\", + "\"a\\\\b c\" d E", + NULL // Terminator + }; + + int i; + char *joined_argv = NULL; + + (void)ptr; + + for (i=0; cmdlines[i]!=NULL; i++) { + log_info(LD_GENERAL, "Joining argvs[%d], expecting <%s>", i, cmdlines[i]); + joined_argv = tor_join_win_cmdline(argvs[i]); + tt_str_op(cmdlines[i],OP_EQ, joined_argv); + tor_free(joined_argv); + } + + done: + tor_free(joined_argv); +} + +#define MAX_SPLIT_LINE_COUNT 4 +struct split_lines_test_t { + const char *orig_line; // Line to be split (may contain \0's) + int orig_length; // Length of orig_line + const char *split_line[MAX_SPLIT_LINE_COUNT]; // Split lines +}; + +/** + * Test that we properly split a buffer into lines + */ +static void +test_util_split_lines(void *ptr) +{ + /* Test cases. orig_line of last test case must be NULL. + * The last element of split_line[i] must be NULL. */ + struct split_lines_test_t tests[] = { + {"", 0, {NULL}}, + {"foo", 3, {"foo", NULL}}, + {"\n\rfoo\n\rbar\r\n", 12, {"foo", "bar", NULL}}, + {"fo o\r\nb\tar", 10, {"fo o", "b.ar", NULL}}, + {"\x0f""f\0o\0\n\x01""b\0r\0\r", 12, {".f.o.", ".b.r.", NULL}}, + {"line 1\r\nline 2", 14, {"line 1", "line 2", NULL}}, + {"line 1\r\n\r\nline 2", 16, {"line 1", "line 2", NULL}}, + {"line 1\r\n\r\r\r\nline 2", 18, {"line 1", "line 2", NULL}}, + {"line 1\r\n\n\n\n\rline 2", 18, {"line 1", "line 2", NULL}}, + {"line 1\r\n\r\t\r\nline 3", 18, {"line 1", ".", "line 3", NULL}}, + {"\n\t\r\t\nline 3", 11, {".", ".", "line 3", NULL}}, + {NULL, 0, { NULL }} + }; + + int i, j; + char *orig_line=NULL; + smartlist_t *sl=NULL; + + (void)ptr; + + for (i=0; tests[i].orig_line; i++) { + sl = smartlist_new(); + /* Allocate space for string and trailing NULL */ + orig_line = tor_memdup(tests[i].orig_line, tests[i].orig_length + 1); + tor_split_lines(sl, orig_line, tests[i].orig_length); + + j = 0; + log_info(LD_GENERAL, "Splitting test %d of length %d", + i, tests[i].orig_length); + SMARTLIST_FOREACH_BEGIN(sl, const char *, line) { + /* Check we have not got too many lines */ + tt_int_op(MAX_SPLIT_LINE_COUNT, OP_GT, j); + /* Check that there actually should be a line here */ + tt_ptr_op(tests[i].split_line[j], OP_NE, NULL); + log_info(LD_GENERAL, "Line %d of test %d, should be <%s>", + j, i, tests[i].split_line[j]); + /* Check that the line is as expected */ + tt_str_op(line,OP_EQ, tests[i].split_line[j]); + j++; + } SMARTLIST_FOREACH_END(line); + /* Check that we didn't miss some lines */ + tt_ptr_op(NULL,OP_EQ, tests[i].split_line[j]); + tor_free(orig_line); + smartlist_free(sl); + sl = NULL; + } + + done: + tor_free(orig_line); + smartlist_free(sl); +} + +static void +test_util_di_ops(void *arg) +{ +#define LT -1 +#define GT 1 +#define EQ 0 + const struct { + const char *a; int want_sign; const char *b; + } examples[] = { + { "Foo", EQ, "Foo" }, + { "foo", GT, "bar", }, + { "foobar", EQ ,"foobar" }, + { "foobar", LT, "foobaw" }, + { "foobar", GT, "f00bar" }, + { "foobar", GT, "boobar" }, + { "", EQ, "" }, + { NULL, 0, NULL }, + }; + + int i; + + (void)arg; + for (i = 0; examples[i].a; ++i) { + size_t len = strlen(examples[i].a); + int eq1, eq2, neq1, neq2, cmp1, cmp2; + tt_int_op(len,OP_EQ, strlen(examples[i].b)); + /* We do all of the operations, with operands in both orders. */ + eq1 = tor_memeq(examples[i].a, examples[i].b, len); + eq2 = tor_memeq(examples[i].b, examples[i].a, len); + neq1 = tor_memneq(examples[i].a, examples[i].b, len); + neq2 = tor_memneq(examples[i].b, examples[i].a, len); + cmp1 = tor_memcmp(examples[i].a, examples[i].b, len); + cmp2 = tor_memcmp(examples[i].b, examples[i].a, len); + + /* Check for correctness of cmp1 */ + if (cmp1 < 0 && examples[i].want_sign != LT) + TT_DIE(("Assertion failed.")); + else if (cmp1 > 0 && examples[i].want_sign != GT) + TT_DIE(("Assertion failed.")); + else if (cmp1 == 0 && examples[i].want_sign != EQ) + TT_DIE(("Assertion failed.")); + + /* Check for consistency of everything else with cmp1 */ + tt_int_op(eq1,OP_EQ, eq2); + tt_int_op(neq1,OP_EQ, neq2); + tt_int_op(cmp1,OP_EQ, -cmp2); + tt_int_op(eq1,OP_EQ, cmp1 == 0); + tt_int_op(neq1,OP_EQ, !eq1); + } + + { + uint8_t zz = 0; + uint8_t ii = 0; + int z; + + /* exhaustively test tor_memeq and tor_memcmp + * against each possible single-byte numeric difference + * some arithmetic bugs only appear with certain bit patterns */ + for (z = 0; z < 256; z++) { + for (i = 0; i < 256; i++) { + ii = (uint8_t)i; + zz = (uint8_t)z; + tt_int_op(tor_memeq(&zz, &ii, 1),OP_EQ, zz == ii); + tt_int_op(tor_memcmp(&zz, &ii, 1) > 0 ? GT : EQ,OP_EQ, + zz > ii ? GT : EQ); + tt_int_op(tor_memcmp(&ii, &zz, 1) < 0 ? LT : EQ,OP_EQ, + ii < zz ? LT : EQ); + } + } + } + + tt_int_op(1, OP_EQ, safe_mem_is_zero("", 0)); + tt_int_op(1, OP_EQ, safe_mem_is_zero("", 1)); + tt_int_op(0, OP_EQ, safe_mem_is_zero("a", 1)); + tt_int_op(0, OP_EQ, safe_mem_is_zero("a", 2)); + tt_int_op(0, OP_EQ, safe_mem_is_zero("\0a", 2)); + tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0a", 2)); + tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0", 8)); + tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 8)); + tt_int_op(0, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 9)); + + done: + ; +} + +static void +test_util_di_map(void *arg) +{ + (void)arg; + di_digest256_map_t *dimap = NULL; + uint8_t key1[] = "Robert Anton Wilson "; + uint8_t key2[] = "Martin Gardner, _Fads&fallacies"; + uint8_t key3[] = "Tom Lehrer, _Be Prepared_. "; + uint8_t key4[] = "Ursula Le Guin,_A Wizard of... "; + + char dflt_entry[] = "'You have made a good beginning', but no more"; + + tt_int_op(32, OP_EQ, sizeof(key1)); + tt_int_op(32, OP_EQ, sizeof(key2)); + tt_int_op(32, OP_EQ, sizeof(key3)); + + tt_ptr_op(dflt_entry, OP_EQ, dimap_search(dimap, key1, dflt_entry)); + + char *str1 = tor_strdup("You are precisely as big as what you love" + " and precisely as small as what you allow" + " to annoy you."); + char *str2 = tor_strdup("Let us hope that Lysenko's success in Russia will" + " serve for many generations to come as another" + " reminder to the world of how quickly and easily" + " a science can be corrupted when ignorant" + " political leaders deem themselves competent" + " to arbitrate scientific disputes"); + char *str3 = tor_strdup("Don't write naughty words on walls " + "if you can't spell."); + + dimap_add_entry(&dimap, key1, str1); + dimap_add_entry(&dimap, key2, str2); + dimap_add_entry(&dimap, key3, str3); + + tt_ptr_op(str1, OP_EQ, dimap_search(dimap, key1, dflt_entry)); + tt_ptr_op(str3, OP_EQ, dimap_search(dimap, key3, dflt_entry)); + tt_ptr_op(str2, OP_EQ, dimap_search(dimap, key2, dflt_entry)); + tt_ptr_op(dflt_entry, OP_EQ, dimap_search(dimap, key4, dflt_entry)); + + done: + dimap_free(dimap, tor_free_); +} + +/** + * Test counting high bits + */ +static void +test_util_n_bits_set(void *ptr) +{ + (void)ptr; + tt_int_op(0,OP_EQ, n_bits_set_u8(0)); + tt_int_op(1,OP_EQ, n_bits_set_u8(1)); + tt_int_op(3,OP_EQ, n_bits_set_u8(7)); + tt_int_op(1,OP_EQ, n_bits_set_u8(8)); + tt_int_op(2,OP_EQ, n_bits_set_u8(129)); + tt_int_op(8,OP_EQ, n_bits_set_u8(255)); + done: + ; +} + +/** + * Test LHS whitespace (and comment) eater + */ +static void +test_util_eat_whitespace(void *ptr) +{ + const char ws[] = { ' ', '\t', '\r' }; /* Except NL */ + char str[80]; + size_t i; + + (void)ptr; + + /* Try one leading ws */ + strlcpy(str, "fuubaar", sizeof(str)); + for (i = 0; i < sizeof(ws); ++i) { + str[0] = ws[i]; + tt_ptr_op(str + 1,OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); + } + str[0] = '\n'; + tt_ptr_op(str + 1,OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); + + /* Empty string */ + strlcpy(str, "", sizeof(str)); + tt_ptr_op(str,OP_EQ, eat_whitespace(str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_eos(str, str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str)); + + /* Only ws */ + strlcpy(str, " \t\r\n", sizeof(str)); + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + strlen(str),OP_EQ, + eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str + strlen(str) - 1,OP_EQ, + eat_whitespace_no_nl(str)); + tt_ptr_op(str + strlen(str) - 1,OP_EQ, + eat_whitespace_eos_no_nl(str, str + strlen(str))); + + strlcpy(str, " \t\r ", sizeof(str)); + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + strlen(str),OP_EQ, + eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str + strlen(str),OP_EQ, + eat_whitespace_eos_no_nl(str, str + strlen(str))); + + /* Multiple ws */ + strlcpy(str, "fuubaar", sizeof(str)); + for (i = 0; i < sizeof(ws); ++i) + str[i] = ws[i]; + tt_ptr_op(str + sizeof(ws),OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + sizeof(ws),OP_EQ, + eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str + sizeof(ws),OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str + sizeof(ws),OP_EQ, + eat_whitespace_eos_no_nl(str, str + strlen(str))); + + /* Eat comment */ + strlcpy(str, "# Comment \n No Comment", sizeof(str)); + tt_str_op("No Comment",OP_EQ, eat_whitespace(str)); + tt_str_op("No Comment",OP_EQ, eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); + + /* Eat comment & ws mix */ + strlcpy(str, " # \t Comment \n\t\nNo Comment", sizeof(str)); + tt_str_op("No Comment",OP_EQ, eat_whitespace(str)); + tt_str_op("No Comment",OP_EQ, eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); + + /* Eat entire comment */ + strlcpy(str, "#Comment", sizeof(str)); + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + strlen(str),OP_EQ, + eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); + + /* Blank line, then comment */ + strlcpy(str, " \t\n # Comment", sizeof(str)); + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + strlen(str),OP_EQ, + eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str + 2,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str + 2,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); + + done: + ; +} + +/** Return a newly allocated smartlist containing the lines of text in + * lines. The returned strings are heap-allocated, and must be + * freed by the caller. + * + * XXXX? Move to container.[hc] ? */ +static smartlist_t * +smartlist_new_from_text_lines(const char *lines) +{ + smartlist_t *sl = smartlist_new(); + char *last_line; + + smartlist_split_string(sl, lines, "\n", 0, 0); + + last_line = smartlist_pop_last(sl); + if (last_line != NULL && *last_line != '\0') { + smartlist_add(sl, last_line); + } else { + tor_free(last_line); + } + + return sl; +} + +/** Test smartlist_new_from_text_lines */ +static void +test_util_sl_new_from_text_lines(void *ptr) +{ + (void)ptr; + + { /* Normal usage */ + smartlist_t *sl = smartlist_new_from_text_lines("foo\nbar\nbaz\n"); + int sl_len = smartlist_len(sl); + + tt_want_int_op(sl_len, OP_EQ, 3); + + if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo"); + if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), OP_EQ, "bar"); + if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), OP_EQ, "baz"); + + SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); + smartlist_free(sl); + } + + { /* No final newline */ + smartlist_t *sl = smartlist_new_from_text_lines("foo\nbar\nbaz"); + int sl_len = smartlist_len(sl); + + tt_want_int_op(sl_len, OP_EQ, 3); + + if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo"); + if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), OP_EQ, "bar"); + if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), OP_EQ, "baz"); + + SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); + smartlist_free(sl); + } + + { /* No newlines */ + smartlist_t *sl = smartlist_new_from_text_lines("foo"); + int sl_len = smartlist_len(sl); + + tt_want_int_op(sl_len, OP_EQ, 1); + + if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo"); + + SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); + smartlist_free(sl); + } + + { /* No text at all */ + smartlist_t *sl = smartlist_new_from_text_lines(""); + int sl_len = smartlist_len(sl); + + tt_want_int_op(sl_len, OP_EQ, 0); + + SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); + smartlist_free(sl); + } +} + +static void +test_util_envnames(void *ptr) +{ + (void) ptr; + + tt_assert(environment_variable_names_equal("abc", "abc")); + tt_assert(environment_variable_names_equal("abc", "abc=")); + tt_assert(environment_variable_names_equal("abc", "abc=def")); + tt_assert(environment_variable_names_equal("abc=def", "abc")); + tt_assert(environment_variable_names_equal("abc=def", "abc=ghi")); + + tt_assert(environment_variable_names_equal("abc", "abc")); + tt_assert(environment_variable_names_equal("abc", "abc=")); + tt_assert(environment_variable_names_equal("abc", "abc=def")); + tt_assert(environment_variable_names_equal("abc=def", "abc")); + tt_assert(environment_variable_names_equal("abc=def", "abc=ghi")); + + tt_assert(!environment_variable_names_equal("abc", "abcd")); + tt_assert(!environment_variable_names_equal("abc=", "abcd")); + tt_assert(!environment_variable_names_equal("abc=", "abcd")); + tt_assert(!environment_variable_names_equal("abc=", "def")); + tt_assert(!environment_variable_names_equal("abc=", "def=")); + tt_assert(!environment_variable_names_equal("abc=x", "def=x")); + + tt_assert(!environment_variable_names_equal("", "a=def")); + /* A bit surprising. */ + tt_assert(environment_variable_names_equal("", "=def")); + tt_assert(environment_variable_names_equal("=y", "=x")); + + done: + ; +} + +/** Test process_environment_make */ +static void +test_util_make_environment(void *ptr) +{ + const char *env_vars_string = + "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/bin\n" + "HOME=/home/foozer\n"; + const char expected_windows_env_block[] = + "HOME=/home/foozer\000" + "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/bin\000" + "\000"; + size_t expected_windows_env_block_len = + sizeof(expected_windows_env_block) - 1; + + smartlist_t *env_vars = smartlist_new_from_text_lines(env_vars_string); + smartlist_t *env_vars_sorted = smartlist_new(); + smartlist_t *env_vars_in_unixoid_env_block_sorted = smartlist_new(); + + process_environment_t *env; + + (void)ptr; + + env = process_environment_make(env_vars); + + /* Check that the Windows environment block is correct. */ + tt_want(tor_memeq(expected_windows_env_block, env->windows_environment_block, + expected_windows_env_block_len)); + + /* Now for the Unixoid environment block. We don't care which order + * these environment variables are in, so we sort both lists first. */ + + smartlist_add_all(env_vars_sorted, env_vars); + + { + char **v; + for (v = env->unixoid_environment_block; *v; ++v) { + smartlist_add(env_vars_in_unixoid_env_block_sorted, *v); + } + } + + smartlist_sort_strings(env_vars_sorted); + smartlist_sort_strings(env_vars_in_unixoid_env_block_sorted); + + tt_want_int_op(smartlist_len(env_vars_sorted), OP_EQ, + smartlist_len(env_vars_in_unixoid_env_block_sorted)); + { + int len = smartlist_len(env_vars_sorted); + int i; + + if (smartlist_len(env_vars_in_unixoid_env_block_sorted) < len) { + len = smartlist_len(env_vars_in_unixoid_env_block_sorted); + } + + for (i = 0; i < len; ++i) { + tt_want_str_op(smartlist_get(env_vars_sorted, i), OP_EQ, + smartlist_get(env_vars_in_unixoid_env_block_sorted, i)); + } + } + + /* Clean up. */ + smartlist_free(env_vars_in_unixoid_env_block_sorted); + smartlist_free(env_vars_sorted); + + SMARTLIST_FOREACH(env_vars, char *, x, tor_free(x)); + smartlist_free(env_vars); + + process_environment_free(env); +} + +/** Test set_environment_variable_in_smartlist */ +static void +test_util_set_env_var_in_sl(void *ptr) +{ + /* The environment variables in these strings are in arbitrary + * order; we sort the resulting lists before comparing them. + * + * (They *will not* end up in the order shown in + * expected_resulting_env_vars_string.) */ + + const char *base_env_vars_string = + "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/bin\n" + "HOME=/home/foozer\n" + "TERM=xterm\n" + "SHELL=/bin/ksh\n" + "USER=foozer\n" + "LOGNAME=foozer\n" + "USERNAME=foozer\n" + "LANG=en_US.utf8\n" + ; + + const char *new_env_vars_string = + "TERM=putty\n" + "DISPLAY=:18.0\n" + ; + + const char *expected_resulting_env_vars_string = + "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/bin\n" + "HOME=/home/foozer\n" + "TERM=putty\n" + "SHELL=/bin/ksh\n" + "USER=foozer\n" + "LOGNAME=foozer\n" + "USERNAME=foozer\n" + "LANG=en_US.utf8\n" + "DISPLAY=:18.0\n" + ; + + smartlist_t *merged_env_vars = + smartlist_new_from_text_lines(base_env_vars_string); + smartlist_t *new_env_vars = + smartlist_new_from_text_lines(new_env_vars_string); + smartlist_t *expected_resulting_env_vars = + smartlist_new_from_text_lines(expected_resulting_env_vars_string); + + /* Elements of merged_env_vars are heap-allocated, and must be + * freed. Some of them are (or should) be freed by + * set_environment_variable_in_smartlist. + * + * Elements of new_env_vars are heap-allocated, but are copied into + * merged_env_vars, so they are not freed separately at the end of + * the function. + * + * Elements of expected_resulting_env_vars are heap-allocated, and + * must be freed. */ + + (void)ptr; + + SMARTLIST_FOREACH(new_env_vars, char *, env_var, + set_environment_variable_in_smartlist(merged_env_vars, + env_var, + tor_free_, + 1)); + + smartlist_sort_strings(merged_env_vars); + smartlist_sort_strings(expected_resulting_env_vars); + + tt_want_int_op(smartlist_len(merged_env_vars), OP_EQ, + smartlist_len(expected_resulting_env_vars)); + { + int len = smartlist_len(merged_env_vars); + int i; + + if (smartlist_len(expected_resulting_env_vars) < len) { + len = smartlist_len(expected_resulting_env_vars); + } + + for (i = 0; i < len; ++i) { + tt_want_str_op(smartlist_get(merged_env_vars, i), OP_EQ, + smartlist_get(expected_resulting_env_vars, i)); + } + } + + /* Clean up. */ + SMARTLIST_FOREACH(merged_env_vars, char *, x, tor_free(x)); + smartlist_free(merged_env_vars); + + smartlist_free(new_env_vars); + + SMARTLIST_FOREACH(expected_resulting_env_vars, char *, x, tor_free(x)); + smartlist_free(expected_resulting_env_vars); +} + +static void +test_util_weak_random(void *arg) +{ + int i, j, n[16]; + tor_weak_rng_t rng; + (void) arg; + + tor_init_weak_random(&rng, (unsigned)time(NULL)); + + for (i = 1; i <= 256; ++i) { + for (j=0;j<100;++j) { + int r = tor_weak_random_range(&rng, i); + tt_int_op(0, OP_LE, r); + tt_int_op(r, OP_LT, i); + } + } + + memset(n,0,sizeof(n)); + for (j=0;j<8192;++j) { + n[tor_weak_random_range(&rng, 16)]++; + } + + for (i=0;i<16;++i) + tt_int_op(n[i], OP_GT, 0); + done: + ; +} + +static void +test_util_mathlog(void *arg) +{ + double d; + (void) arg; + + d = tor_mathlog(2.718281828); + tt_double_op(fabs(d - 1.0), OP_LT, .000001); + d = tor_mathlog(10); + tt_double_op(fabs(d - 2.30258509), OP_LT, .000001); + done: + ; +} + +static void +test_util_fraction(void *arg) +{ + uint64_t a,b; + (void)arg; + + a = 99; b = 30; + simplify_fraction64(&a,&b); + tt_u64_op(a, OP_EQ, 33); + tt_u64_op(b, OP_EQ, 10); + + a = 3000000; b = 10000000; + simplify_fraction64(&a,&b); + tt_u64_op(a, OP_EQ, 3); + tt_u64_op(b, OP_EQ, 10); + + a = 0; b = 15; + simplify_fraction64(&a,&b); + tt_u64_op(a, OP_EQ, 0); + tt_u64_op(b, OP_EQ, 1); + + done: + ; +} + +static void +test_util_round_to_next_multiple_of(void *arg) +{ + (void)arg; + + tt_u64_op(round_uint64_to_next_multiple_of(0,1), OP_EQ, 0); + tt_u64_op(round_uint64_to_next_multiple_of(0,7), OP_EQ, 0); + + tt_u64_op(round_uint64_to_next_multiple_of(99,1), OP_EQ, 99); + tt_u64_op(round_uint64_to_next_multiple_of(99,7), OP_EQ, 105); + tt_u64_op(round_uint64_to_next_multiple_of(99,9), OP_EQ, 99); + + tt_u64_op(round_uint64_to_next_multiple_of(UINT64_MAX,2), OP_EQ, + UINT64_MAX); + + tt_int_op(round_uint32_to_next_multiple_of(0,1), OP_EQ, 0); + tt_int_op(round_uint32_to_next_multiple_of(0,7), OP_EQ, 0); + + tt_int_op(round_uint32_to_next_multiple_of(99,1), OP_EQ, 99); + tt_int_op(round_uint32_to_next_multiple_of(99,7), OP_EQ, 105); + tt_int_op(round_uint32_to_next_multiple_of(99,9), OP_EQ, 99); + + tt_int_op(round_uint32_to_next_multiple_of(UINT32_MAX,2), OP_EQ, + UINT32_MAX); + + tt_uint_op(round_to_next_multiple_of(0,1), OP_EQ, 0); + tt_uint_op(round_to_next_multiple_of(0,7), OP_EQ, 0); + + tt_uint_op(round_to_next_multiple_of(99,1), OP_EQ, 99); + tt_uint_op(round_to_next_multiple_of(99,7), OP_EQ, 105); + tt_uint_op(round_to_next_multiple_of(99,9), OP_EQ, 99); + + tt_uint_op(round_to_next_multiple_of(UINT_MAX,2), OP_EQ, + UINT_MAX); + done: + ; +} + +static void +test_util_laplace(void *arg) +{ + /* Sample values produced using Python's SciPy: + * + * >>> from scipy.stats import laplace + * >>> laplace.ppf([-0.01, 0.0, 0.01, 0.5, 0.51, 0.99, 1.0, 1.01], + ... loc = 24, scale = 24) + * array([ nan, -inf, -69.88855213, 24. , + * 24.48486498, 117.88855213, inf, nan]) + */ + const double mu = 24.0, b = 24.0; + const double delta_f = 15.0, epsilon = 0.3; /* b = 15.0 / 0.3 = 50.0 */ + (void)arg; + + tt_i64_op(INT64_MIN, OP_EQ, sample_laplace_distribution(mu, b, 0.0)); + tt_i64_op(-69, OP_EQ, sample_laplace_distribution(mu, b, 0.01)); + tt_i64_op(24, OP_EQ, sample_laplace_distribution(mu, b, 0.5)); + tt_i64_op(24, OP_EQ, sample_laplace_distribution(mu, b, 0.51)); + tt_i64_op(117, OP_EQ, sample_laplace_distribution(mu, b, 0.99)); + + /* >>> laplace.ppf([0.0, 0.1, 0.25, 0.5, 0.75, 0.9, 0.99], + * ... loc = 0, scale = 50) + * array([ -inf, -80.47189562, -34.65735903, 0. , + * 34.65735903, 80.47189562, 195.60115027]) + */ + tt_i64_op(INT64_MIN + 20, OP_EQ, + add_laplace_noise(20, 0.0, delta_f, epsilon)); + + tt_i64_op(-60, OP_EQ, add_laplace_noise(20, 0.1, delta_f, epsilon)); + tt_i64_op(-14, OP_EQ, add_laplace_noise(20, 0.25, delta_f, epsilon)); + tt_i64_op(20, OP_EQ, add_laplace_noise(20, 0.5, delta_f, epsilon)); + tt_i64_op(54, OP_EQ, add_laplace_noise(20, 0.75, delta_f, epsilon)); + tt_i64_op(100, OP_EQ, add_laplace_noise(20, 0.9, delta_f, epsilon)); + tt_i64_op(215, OP_EQ, add_laplace_noise(20, 0.99, delta_f, epsilon)); + + /* Test extreme values of signal with maximally negative values of noise + * 1.0000000000000002 is the smallest number > 1 + * 0.0000000000000002 is the double epsilon (error when calculating near 1) + * this is approximately 1/(2^52) + * per https://en.wikipedia.org/wiki/Double_precision + * (let's not descend into the world of subnormals) + * >>> laplace.ppf([0, 0.0000000000000002], loc = 0, scale = 1) + * array([ -inf, -35.45506713]) + */ + const double noscale_df = 1.0, noscale_eps = 1.0; + + tt_i64_op(INT64_MIN, OP_EQ, + add_laplace_noise(0, 0.0, noscale_df, noscale_eps)); + + /* is it clipped to INT64_MIN? */ + tt_i64_op(INT64_MIN, OP_EQ, + add_laplace_noise(-1, 0.0, noscale_df, noscale_eps)); + tt_i64_op(INT64_MIN, OP_EQ, + add_laplace_noise(INT64_MIN, 0.0, + noscale_df, noscale_eps)); + /* ... even when scaled? */ + tt_i64_op(INT64_MIN, OP_EQ, + add_laplace_noise(0, 0.0, delta_f, epsilon)); + tt_i64_op(INT64_MIN, OP_EQ, + add_laplace_noise(0, 0.0, + DBL_MAX, 1)); + tt_i64_op(INT64_MIN, OP_EQ, + add_laplace_noise(INT64_MIN, 0.0, + DBL_MAX, 1)); + + /* does it play nice with INT64_MAX? */ + tt_i64_op((INT64_MIN + INT64_MAX), OP_EQ, + add_laplace_noise(INT64_MAX, 0.0, + noscale_df, noscale_eps)); + + /* do near-zero fractional values work? */ + const double min_dbl_error = 0.0000000000000002; + + tt_i64_op(-35, OP_EQ, + add_laplace_noise(0, min_dbl_error, + noscale_df, noscale_eps)); + tt_i64_op(INT64_MIN, OP_EQ, + add_laplace_noise(INT64_MIN, min_dbl_error, + noscale_df, noscale_eps)); + tt_i64_op((-35 + INT64_MAX), OP_EQ, + add_laplace_noise(INT64_MAX, min_dbl_error, + noscale_df, noscale_eps)); + tt_i64_op(INT64_MIN, OP_EQ, + add_laplace_noise(0, min_dbl_error, + DBL_MAX, 1)); + tt_i64_op((INT64_MAX + INT64_MIN), OP_EQ, + add_laplace_noise(INT64_MAX, min_dbl_error, + DBL_MAX, 1)); + tt_i64_op(INT64_MIN, OP_EQ, + add_laplace_noise(INT64_MIN, min_dbl_error, + DBL_MAX, 1)); + + /* does it play nice with INT64_MAX? */ + tt_i64_op((INT64_MAX - 35), OP_EQ, + add_laplace_noise(INT64_MAX, min_dbl_error, + noscale_df, noscale_eps)); + + /* Test extreme values of signal with maximally positive values of noise + * 1.0000000000000002 is the smallest number > 1 + * 0.9999999999999998 is the greatest number < 1 by calculation + * per https://en.wikipedia.org/wiki/Double_precision + * >>> laplace.ppf([1.0, 0.9999999999999998], loc = 0, scale = 1) + * array([inf, 35.35050621]) + * but the function rejects p == 1.0, so we just use max_dbl_lt_one + */ + const double max_dbl_lt_one = 0.9999999999999998; + + /* do near-one fractional values work? */ + tt_i64_op(35, OP_EQ, + add_laplace_noise(0, max_dbl_lt_one, noscale_df, noscale_eps)); + + /* is it clipped to INT64_MAX? */ + tt_i64_op(INT64_MAX, OP_EQ, + add_laplace_noise(INT64_MAX - 35, max_dbl_lt_one, + noscale_df, noscale_eps)); + tt_i64_op(INT64_MAX, OP_EQ, + add_laplace_noise(INT64_MAX - 34, max_dbl_lt_one, + noscale_df, noscale_eps)); + tt_i64_op(INT64_MAX, OP_EQ, + add_laplace_noise(INT64_MAX, max_dbl_lt_one, + noscale_df, noscale_eps)); + /* ... even when scaled? */ + tt_i64_op(INT64_MAX, OP_EQ, + add_laplace_noise(INT64_MAX, max_dbl_lt_one, + delta_f, epsilon)); + tt_i64_op((INT64_MIN + INT64_MAX), OP_EQ, + add_laplace_noise(INT64_MIN, max_dbl_lt_one, + DBL_MAX, 1)); + tt_i64_op(INT64_MAX, OP_EQ, + add_laplace_noise(INT64_MAX, max_dbl_lt_one, + DBL_MAX, 1)); + /* does it play nice with INT64_MIN? */ + tt_i64_op((INT64_MIN + 35), OP_EQ, + add_laplace_noise(INT64_MIN, max_dbl_lt_one, + noscale_df, noscale_eps)); + + done: + ; +} + +static void +test_util_clamp_double_to_int64(void *arg) +{ + (void)arg; + + tt_i64_op(INT64_MIN, OP_EQ, clamp_double_to_int64(-INFINITY_DBL)); + tt_i64_op(INT64_MIN, OP_EQ, + clamp_double_to_int64(-1.0 * pow(2.0, 64.0) - 1.0)); + tt_i64_op(INT64_MIN, OP_EQ, + clamp_double_to_int64(-1.0 * pow(2.0, 63.0) - 1.0)); + tt_i64_op(((uint64_t) -1) << 53, OP_EQ, + clamp_double_to_int64(-1.0 * pow(2.0, 53.0))); + tt_i64_op((((uint64_t) -1) << 53) + 1, OP_EQ, + clamp_double_to_int64(-1.0 * pow(2.0, 53.0) + 1.0)); + tt_i64_op(-1, OP_EQ, clamp_double_to_int64(-1.0)); + tt_i64_op(0, OP_EQ, clamp_double_to_int64(-0.9)); + tt_i64_op(0, OP_EQ, clamp_double_to_int64(-0.1)); + tt_i64_op(0, OP_EQ, clamp_double_to_int64(0.0)); + tt_i64_op(0, OP_EQ, clamp_double_to_int64(NAN_DBL)); + tt_i64_op(0, OP_EQ, clamp_double_to_int64(0.1)); + tt_i64_op(0, OP_EQ, clamp_double_to_int64(0.9)); + tt_i64_op(1, OP_EQ, clamp_double_to_int64(1.0)); + tt_i64_op((((int64_t) 1) << 53) - 1, OP_EQ, + clamp_double_to_int64(pow(2.0, 53.0) - 1.0)); + tt_i64_op(((int64_t) 1) << 53, OP_EQ, + clamp_double_to_int64(pow(2.0, 53.0))); + tt_i64_op(INT64_MAX, OP_EQ, + clamp_double_to_int64(pow(2.0, 63.0))); + tt_i64_op(INT64_MAX, OP_EQ, + clamp_double_to_int64(pow(2.0, 64.0))); + tt_i64_op(INT64_MAX, OP_EQ, clamp_double_to_int64(INFINITY_DBL)); + + done: + ; +} + +#ifdef FD_CLOEXEC +#define CAN_CHECK_CLOEXEC +static int +fd_is_cloexec(tor_socket_t fd) +{ + int flags = fcntl(fd, F_GETFD, 0); + return (flags & FD_CLOEXEC) == FD_CLOEXEC; +} +#endif /* defined(FD_CLOEXEC) */ + +#ifndef _WIN32 +#define CAN_CHECK_NONBLOCK +static int +fd_is_nonblocking(tor_socket_t fd) +{ + int flags = fcntl(fd, F_GETFL, 0); + return (flags & O_NONBLOCK) == O_NONBLOCK; +} +#endif /* !defined(_WIN32) */ + +#define ERRNO_IS_EPROTO(e) (e == SOCK_ERRNO(EPROTONOSUPPORT)) +#define SOCK_ERR_IS_EPROTO(s) ERRNO_IS_EPROTO(tor_socket_errno(s)) + +/* Test for tor_open_socket*, using IPv4 or IPv6 depending on arg. */ +static void +test_util_socket(void *arg) +{ + const int domain = !strcmp(arg, "4") ? AF_INET : AF_INET6; + tor_socket_t fd1 = TOR_INVALID_SOCKET; + tor_socket_t fd2 = TOR_INVALID_SOCKET; + tor_socket_t fd3 = TOR_INVALID_SOCKET; + tor_socket_t fd4 = TOR_INVALID_SOCKET; + int n = get_n_open_sockets(); + + TT_BLATHER(("Starting with %d open sockets.", n)); + + (void)arg; + + fd1 = tor_open_socket_with_extensions(domain, SOCK_STREAM, 0, 0, 0); + int err = tor_socket_errno(fd1); + if (fd1 < 0 && (err == SOCK_ERRNO(EPROTONOSUPPORT) || + err == SOCK_ERRNO(EAFNOSUPPORT))) { + /* Assume we're on an IPv4-only or IPv6-only system, and give up now. */ + goto done; + } + fd2 = tor_open_socket_with_extensions(domain, SOCK_STREAM, 0, 0, 1); + tt_assert(SOCKET_OK(fd1)); + tt_assert(SOCKET_OK(fd2)); + tt_int_op(get_n_open_sockets(), OP_EQ, n + 2); + //fd3 = tor_open_socket_with_extensions(domain, SOCK_STREAM, 0, 1, 0); + //fd4 = tor_open_socket_with_extensions(domain, SOCK_STREAM, 0, 1, 1); + fd3 = tor_open_socket(domain, SOCK_STREAM, 0); + fd4 = tor_open_socket_nonblocking(domain, SOCK_STREAM, 0); + tt_assert(SOCKET_OK(fd3)); + tt_assert(SOCKET_OK(fd4)); + tt_int_op(get_n_open_sockets(), OP_EQ, n + 4); + +#ifdef CAN_CHECK_CLOEXEC + tt_int_op(fd_is_cloexec(fd1), OP_EQ, 0); + tt_int_op(fd_is_cloexec(fd2), OP_EQ, 0); + tt_int_op(fd_is_cloexec(fd3), OP_EQ, 1); + tt_int_op(fd_is_cloexec(fd4), OP_EQ, 1); +#endif /* defined(CAN_CHECK_CLOEXEC) */ +#ifdef CAN_CHECK_NONBLOCK + tt_int_op(fd_is_nonblocking(fd1), OP_EQ, 0); + tt_int_op(fd_is_nonblocking(fd2), OP_EQ, 1); + tt_int_op(fd_is_nonblocking(fd3), OP_EQ, 0); + tt_int_op(fd_is_nonblocking(fd4), OP_EQ, 1); +#endif /* defined(CAN_CHECK_NONBLOCK) */ + + tor_assert(tor_close_socket == tor_close_socket__real); + + /* we use close_socket__real here so that coverity can tell that we are + * really closing these sockets. */ + tor_close_socket__real(fd1); + tor_close_socket__real(fd2); + fd1 = fd2 = TOR_INVALID_SOCKET; + tt_int_op(get_n_open_sockets(), OP_EQ, n + 2); + tor_close_socket__real(fd3); + tor_close_socket__real(fd4); + fd3 = fd4 = TOR_INVALID_SOCKET; + tt_int_op(get_n_open_sockets(), OP_EQ, n); + + done: + if (SOCKET_OK(fd1)) + tor_close_socket__real(fd1); + if (SOCKET_OK(fd2)) + tor_close_socket__real(fd2); + if (SOCKET_OK(fd3)) + tor_close_socket__real(fd3); + if (SOCKET_OK(fd4)) + tor_close_socket__real(fd4); +} + +#if 0 +static int +is_there_a_localhost(int family) +{ + tor_socket_t s; + s = tor_open_socket(family, SOCK_STREAM, IPPROTO_TCP); + tor_assert(SOCKET_OK(s)); + + int result = 0; + if (family == AF_INET) { + struct sockaddr_in s_in; + memset(&s_in, 0, sizeof(s_in)); + s_in.sin_family = AF_INET; + s_in.sin_addr.s_addr = htonl(0x7f000001); + s_in.sin_port = 0; + + if (bind(s, (void*)&s_in, sizeof(s_in)) == 0) { + result = 1; + } + } else if (family == AF_INET6) { + struct sockaddr_in6 sin6; + memset(&sin6, 0, sizeof(sin6)); + sin6.sin6_family = AF_INET6; + sin6.sin6_addr.s6_addr[15] = 1; + sin6.sin6_port = 0; + } + tor_close_socket(s); + + return result; +} +#endif /* 0 */ + +/* Test for socketpair and ersatz_socketpair(). We test them both, since + * the latter is a tolerably good way to exersize tor_accept_socket(). */ +static void +test_util_socketpair(void *arg) +{ + const int ersatz = !strcmp(arg, "1"); + int (*const tor_socketpair_fn)(int, int, int, tor_socket_t[2]) = + ersatz ? tor_ersatz_socketpair : tor_socketpair; + int n = get_n_open_sockets(); + tor_socket_t fds[2] = {TOR_INVALID_SOCKET, TOR_INVALID_SOCKET}; + const int family = AF_UNIX; + int socketpair_result = 0; + + socketpair_result = tor_socketpair_fn(family, SOCK_STREAM, 0, fds); + +#ifdef __FreeBSD__ + /* If there is no 127.0.0.1, tor_ersatz_socketpair will and must fail. + * Otherwise, we risk exposing a socketpair on a routable IP address. (Some + * BSD jails use a routable address for localhost. Fortunately, they have + * the real AF_UNIX socketpair.) */ + if (ersatz && socketpair_result < 0) { + /* In my testing, an IPv6-only FreeBSD jail without ::1 returned EINVAL. + * Assume we're on a machine without 127.0.0.1 or ::1 and give up now. */ + tt_skip(); + } +#endif /* defined(__FreeBSD__) */ + tt_int_op(0, OP_EQ, socketpair_result); + + tt_assert(SOCKET_OK(fds[0])); + tt_assert(SOCKET_OK(fds[1])); + tt_int_op(get_n_open_sockets(), OP_EQ, n + 2); +#ifdef CAN_CHECK_CLOEXEC + tt_int_op(fd_is_cloexec(fds[0]), OP_EQ, 1); + tt_int_op(fd_is_cloexec(fds[1]), OP_EQ, 1); +#endif +#ifdef CAN_CHECK_NONBLOCK + tt_int_op(fd_is_nonblocking(fds[0]), OP_EQ, 0); + tt_int_op(fd_is_nonblocking(fds[1]), OP_EQ, 0); +#endif + + done: + if (SOCKET_OK(fds[0])) + tor_close_socket(fds[0]); + if (SOCKET_OK(fds[1])) + tor_close_socket(fds[1]); +} + +#undef SOCKET_EPROTO + +static void +test_util_max_mem(void *arg) +{ + size_t memory1, memory2; + int r, r2; + (void) arg; + + r = get_total_system_memory(&memory1); + r2 = get_total_system_memory(&memory2); + tt_int_op(r, OP_EQ, r2); + tt_uint_op(memory2, OP_EQ, memory1); + + TT_BLATHER(("System memory: "U64_FORMAT, U64_PRINTF_ARG(memory1))); + + if (r==0) { + /* You have at least a megabyte. */ + tt_uint_op(memory1, OP_GT, (1<<20)); + } else { + /* You do not have a petabyte. */ +#if SIZEOF_SIZE_T == SIZEOF_UINT64_T + tt_u64_op(memory1, OP_LT, (U64_LITERAL(1)<<50)); +#endif + } + + done: + ; +} + +static void +test_util_hostname_validation(void *arg) +{ + (void)arg; + + // Lets try valid hostnames first. + tt_assert(string_is_valid_hostname("torproject.org")); + tt_assert(string_is_valid_hostname("ocw.mit.edu")); + tt_assert(string_is_valid_hostname("i.4cdn.org")); + tt_assert(string_is_valid_hostname("stanford.edu")); + tt_assert(string_is_valid_hostname("multiple-words-with-hypens.jp")); + + // Subdomain name cannot start with '-' or '_'. + tt_assert(!string_is_valid_hostname("-torproject.org")); + tt_assert(!string_is_valid_hostname("subdomain.-domain.org")); + tt_assert(!string_is_valid_hostname("-subdomain.domain.org")); + tt_assert(!string_is_valid_hostname("___abc.org")); + + // Hostnames cannot contain non-alphanumeric characters. + tt_assert(!string_is_valid_hostname("%%domain.\\org.")); + tt_assert(!string_is_valid_hostname("***x.net")); + tt_assert(!string_is_valid_hostname("\xff\xffxyz.org")); + tt_assert(!string_is_valid_hostname("word1 word2.net")); + + // Test workaround for nytimes.com stupidity, technically invalid, + // but we allow it since they are big, even though they are failing to + // comply with a ~30 year old standard. + tt_assert(string_is_valid_hostname("core3_euw1.fabrik.nytimes.com")); + + // Firefox passes FQDNs with trailing '.'s directly to the SOCKS proxy, + // which is redundant since the spec states DOMAINNAME addresses are fully + // qualified. While unusual, this should be tollerated. + tt_assert(string_is_valid_hostname("core9_euw1.fabrik.nytimes.com.")); + tt_assert(!string_is_valid_hostname("..washingtonpost.is.better.com")); + tt_assert(!string_is_valid_hostname("so.is..ft.com")); + tt_assert(!string_is_valid_hostname("...")); + + // XXX: do we allow single-label DNS names? + // We shouldn't for SOCKS (spec says "contains a fully-qualified domain name" + // but only test pathologically malformed traling '.' cases for now. + tt_assert(!string_is_valid_hostname(".")); + tt_assert(!string_is_valid_hostname("..")); + + done: + return; +} + +static void +test_util_ipv4_validation(void *arg) +{ + (void)arg; + + tt_assert(string_is_valid_ipv4_address("192.168.0.1")); + tt_assert(string_is_valid_ipv4_address("8.8.8.8")); + + tt_assert(!string_is_valid_ipv4_address("abcd")); + tt_assert(!string_is_valid_ipv4_address("300.300.300.300")); + tt_assert(!string_is_valid_ipv4_address("8.8.")); + + done: + return; +} + +static void +test_util_writepid(void *arg) +{ + (void) arg; + + char *contents = NULL; + const char *fname = get_fname("tmp_pid"); + unsigned long pid; + char c; + + write_pidfile(fname); + + contents = read_file_to_str(fname, 0, NULL); + tt_assert(contents); + + int n = tor_sscanf(contents, "%lu\n%c", &pid, &c); + tt_int_op(n, OP_EQ, 1); + +#ifdef _WIN32 + tt_uint_op(pid, OP_EQ, _getpid()); +#else + tt_uint_op(pid, OP_EQ, getpid()); +#endif + + done: + tor_free(contents); +} + +static void +test_util_get_avail_disk_space(void *arg) +{ + (void) arg; + int64_t val; + + /* No answer for nonexistent directory */ + val = tor_get_avail_disk_space("/akljasdfklsajdklasjkldjsa"); + tt_i64_op(val, OP_EQ, -1); + + /* Try the current directory */ + val = tor_get_avail_disk_space("."); + +#if !defined(HAVE_STATVFS) && !defined(_WIN32) + tt_i64_op(val, OP_EQ, -1); /* You don't have an implementation for this */ +#else + tt_i64_op(val, OP_GT, 0); /* You have some space. */ + tt_i64_op(val, OP_LT, ((int64_t)1)<<56); /* You don't have a zebibyte */ +#endif /* !defined(HAVE_STATVFS) && !defined(_WIN32) */ + + done: + ; +} + +static void +test_util_touch_file(void *arg) +{ + (void) arg; + const char *fname = get_fname("touch"); + + const time_t now = time(NULL); + struct stat st; + write_bytes_to_file(fname, "abc", 3, 1); + tt_int_op(0, OP_EQ, stat(fname, &st)); + /* A subtle point: the filesystem time is not necessarily equal to the + * system clock time, since one can be using a monotonic clock, or coarse + * monotonic clock, or whatever. So we might wind up with an mtime a few + * microseconds ago. Let's just give it a lot of wiggle room. */ + tt_i64_op(st.st_mtime, OP_GE, now - 1); + + const time_t five_sec_ago = now - 5; + struct utimbuf u = { five_sec_ago, five_sec_ago }; + tt_int_op(0, OP_EQ, utime(fname, &u)); + tt_int_op(0, OP_EQ, stat(fname, &st)); + /* Let's hope that utime/stat give the same second as a round-trip? */ + tt_i64_op(st.st_mtime, OP_EQ, five_sec_ago); + + /* Finally we can touch the file */ + tt_int_op(0, OP_EQ, touch_file(fname)); + tt_int_op(0, OP_EQ, stat(fname, &st)); + tt_i64_op(st.st_mtime, OP_GE, now-1); + + done: + ; +} + +#ifndef _WIN32 +static void +test_util_pwdb(void *arg) +{ + (void) arg; + const struct passwd *me = NULL, *me2, *me3; + char *name = NULL; + char *dir = NULL; + + /* Uncached case. */ + /* Let's assume that we exist. */ + me = tor_getpwuid(getuid()); + tt_ptr_op(me, OP_NE, NULL); + name = tor_strdup(me->pw_name); + + /* Uncached case */ + me2 = tor_getpwnam(name); + tt_ptr_op(me2, OP_NE, NULL); + tt_int_op(me2->pw_uid, OP_EQ, getuid()); + + /* Cached case */ + me3 = tor_getpwuid(getuid()); + tt_ptr_op(me3, OP_NE, NULL); + tt_str_op(me3->pw_name, OP_EQ, name); + + me3 = tor_getpwnam(name); + tt_ptr_op(me3, OP_NE, NULL); + tt_int_op(me3->pw_uid, OP_EQ, getuid()); + + dir = get_user_homedir(name); + tt_ptr_op(dir, OP_NE, NULL); + + /* Try failing cases. First find a user that doesn't exist by name */ + char randbytes[4]; + char badname[9]; + int i, found=0; + for (i = 0; i < 100; ++i) { + crypto_rand(randbytes, sizeof(randbytes)); + base16_encode(badname, sizeof(badname), randbytes, sizeof(randbytes)); + if (tor_getpwnam(badname) == NULL) { + found = 1; + break; + } + } + tt_assert(found); + tor_free(dir); + + /* We should do a LOG_ERR */ + setup_full_capture_of_logs(LOG_ERR); + dir = get_user_homedir(badname); + tt_ptr_op(dir, OP_EQ, NULL); + expect_log_msg_containing("not found"); + tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); + teardown_capture_of_logs(); + + /* Now try to find a user that doesn't exist by ID. */ + found = 0; + for (i = 0; i < 1000; ++i) { + uid_t u; + crypto_rand((char*)&u, sizeof(u)); + if (tor_getpwuid(u) == NULL) { + found = 1; + break; + } + } + tt_assert(found); + + done: + tor_free(name); + tor_free(dir); + teardown_capture_of_logs(); +} +#endif /* !defined(_WIN32) */ + +static void +test_util_calloc_check(void *arg) +{ + (void) arg; + /* Easy cases that are good. */ + tt_assert(size_mul_check(0,0)); + tt_assert(size_mul_check(0,100)); + tt_assert(size_mul_check(100,0)); + tt_assert(size_mul_check(100,100)); + + /* Harder cases that are still good. */ + tt_assert(size_mul_check(SIZE_MAX, 1)); + tt_assert(size_mul_check(1, SIZE_MAX)); + tt_assert(size_mul_check(SIZE_MAX / 10, 9)); + tt_assert(size_mul_check(11, SIZE_MAX / 12)); + const size_t sqrt_size_max_p1 = ((size_t)1) << (sizeof(size_t) * 4); + tt_assert(size_mul_check(sqrt_size_max_p1, sqrt_size_max_p1 - 1)); + + /* Cases that overflow */ + tt_assert(! size_mul_check(SIZE_MAX, 2)); + tt_assert(! size_mul_check(2, SIZE_MAX)); + tt_assert(! size_mul_check(SIZE_MAX / 10, 11)); + tt_assert(! size_mul_check(11, SIZE_MAX / 10)); + tt_assert(! size_mul_check(SIZE_MAX / 8, 9)); + tt_assert(! size_mul_check(sqrt_size_max_p1, sqrt_size_max_p1)); + + done: + ; +} + +static void +test_util_monotonic_time(void *arg) +{ + (void)arg; + + monotime_t mt1, mt2; + monotime_coarse_t mtc1, mtc2; + uint64_t nsec1, nsec2, usec1, msec1; + uint64_t nsecc1, nsecc2, usecc1, msecc1; + uint32_t stamp1, stamp2; + + monotime_init(); + + monotime_get(&mt1); + monotime_coarse_get(&mtc1); + nsec1 = monotime_absolute_nsec(); + usec1 = monotime_absolute_usec(); + msec1 = monotime_absolute_msec(); + nsecc1 = monotime_coarse_absolute_nsec(); + usecc1 = monotime_coarse_absolute_usec(); + msecc1 = monotime_coarse_absolute_msec(); + stamp1 = monotime_coarse_to_stamp(&mtc1); + + tor_sleep_msec(200); + + monotime_get(&mt2); + monotime_coarse_get(&mtc2); + nsec2 = monotime_absolute_nsec(); + nsecc2 = monotime_coarse_absolute_nsec(); + stamp2 = monotime_coarse_to_stamp(&mtc2); + + /* We need to be a little careful here since we don't know the system load. + */ + tt_i64_op(monotime_diff_msec(&mt1, &mt2), OP_GE, 175); + tt_i64_op(monotime_diff_msec(&mt1, &mt2), OP_LT, 1000); + tt_i64_op(monotime_coarse_diff_msec(&mtc1, &mtc2), OP_GE, 125); + tt_i64_op(monotime_coarse_diff_msec(&mtc1, &mtc2), OP_LT, 1000); + tt_u64_op(nsec2-nsec1, OP_GE, 175000000); + tt_u64_op(nsec2-nsec1, OP_LT, 1000000000); + tt_u64_op(nsecc2-nsecc1, OP_GE, 125000000); + tt_u64_op(nsecc2-nsecc1, OP_LT, 1000000000); + + tt_u64_op(msec1, OP_GE, nsec1 / 1000000); + tt_u64_op(usec1, OP_GE, nsec1 / 1000); + tt_u64_op(msecc1, OP_GE, nsecc1 / 1000000); + tt_u64_op(usecc1, OP_GE, nsecc1 / 1000); + tt_u64_op(msec1, OP_LE, nsec1 / 1000000 + 1); + tt_u64_op(usec1, OP_LE, nsec1 / 1000 + 1000); + tt_u64_op(msecc1, OP_LE, nsecc1 / 1000000 + 1); + tt_u64_op(usecc1, OP_LE, nsecc1 / 1000 + 1000); + + uint64_t coarse_stamp_diff = + monotime_coarse_stamp_units_to_approx_msec(stamp2-stamp1); + tt_u64_op(coarse_stamp_diff, OP_GE, 120); + tt_u64_op(coarse_stamp_diff, OP_LE, 1200); + + done: + ; +} + +static void +test_util_monotonic_time_ratchet(void *arg) +{ + (void)arg; + monotime_init(); + monotime_reset_ratchets_for_testing(); + + /* win32, performance counter ratchet. */ + tt_i64_op(100, OP_EQ, ratchet_performance_counter(100)); + tt_i64_op(101, OP_EQ, ratchet_performance_counter(101)); + tt_i64_op(2000, OP_EQ, ratchet_performance_counter(2000)); + tt_i64_op(2000, OP_EQ, ratchet_performance_counter(100)); + tt_i64_op(2005, OP_EQ, ratchet_performance_counter(105)); + tt_i64_op(3005, OP_EQ, ratchet_performance_counter(1105)); + tt_i64_op(3005, OP_EQ, ratchet_performance_counter(1000)); + tt_i64_op(3010, OP_EQ, ratchet_performance_counter(1005)); + + /* win32, GetTickCounts32 ratchet-and-rollover-detector. */ + const int64_t R = ((int64_t)1) << 32; + tt_i64_op(5, OP_EQ, ratchet_coarse_performance_counter(5)); + tt_i64_op(1000, OP_EQ, ratchet_coarse_performance_counter(1000)); + tt_i64_op(5+R, OP_EQ, ratchet_coarse_performance_counter(5)); + tt_i64_op(10+R, OP_EQ, ratchet_coarse_performance_counter(10)); + tt_i64_op(4+R*2, OP_EQ, ratchet_coarse_performance_counter(4)); + + /* gettimeofday regular ratchet. */ + struct timeval tv_in = {0,0}, tv_out; + tv_in.tv_usec = 9000; + + ratchet_timeval(&tv_in, &tv_out); + tt_int_op(tv_out.tv_usec, OP_EQ, 9000); + tt_i64_op(tv_out.tv_sec, OP_EQ, 0); + + tv_in.tv_sec = 1337; + tv_in.tv_usec = 0; + ratchet_timeval(&tv_in, &tv_out); + tt_int_op(tv_out.tv_usec, OP_EQ, 0); + tt_i64_op(tv_out.tv_sec, OP_EQ, 1337); + + tv_in.tv_sec = 1336; + tv_in.tv_usec = 500000; + ratchet_timeval(&tv_in, &tv_out); + tt_int_op(tv_out.tv_usec, OP_EQ, 0); + tt_i64_op(tv_out.tv_sec, OP_EQ, 1337); + + tv_in.tv_sec = 1337; + tv_in.tv_usec = 0; + ratchet_timeval(&tv_in, &tv_out); + tt_int_op(tv_out.tv_usec, OP_EQ, 500000); + tt_i64_op(tv_out.tv_sec, OP_EQ, 1337); + + tv_in.tv_sec = 1337; + tv_in.tv_usec = 600000; + ratchet_timeval(&tv_in, &tv_out); + tt_int_op(tv_out.tv_usec, OP_EQ, 100000); + tt_i64_op(tv_out.tv_sec, OP_EQ, 1338); + + tv_in.tv_sec = 1000; + tv_in.tv_usec = 1000; + ratchet_timeval(&tv_in, &tv_out); + tt_int_op(tv_out.tv_usec, OP_EQ, 100000); + tt_i64_op(tv_out.tv_sec, OP_EQ, 1338); + + tv_in.tv_sec = 2000; + tv_in.tv_usec = 2000; + ratchet_timeval(&tv_in, &tv_out); + tt_int_op(tv_out.tv_usec, OP_EQ, 101000); + tt_i64_op(tv_out.tv_sec, OP_EQ, 2338); + + done: + ; +} + +static void +test_util_monotonic_time_zero(void *arg) +{ + (void) arg; + monotime_t t1; + monotime_coarse_t ct1; + monotime_init(); + /* Check 1: The current time is not zero. */ + monotime_get(&t1); + monotime_coarse_get(&ct1); + tt_assert(!monotime_is_zero(&t1)); + tt_assert(!monotime_coarse_is_zero(&ct1)); + + /* Check 2: The _zero() makes the time zero. */ + monotime_zero(&t1); + monotime_coarse_zero(&ct1); + tt_assert(monotime_is_zero(&t1)); + tt_assert(monotime_coarse_is_zero(&ct1)); + done: + ; +} + +static void +test_util_monotonic_time_add_msec(void *arg) +{ + (void) arg; + monotime_t t1, t2; + monotime_coarse_t ct1, ct2; + monotime_init(); + + monotime_get(&t1); + monotime_coarse_get(&ct1); + + /* adding zero does nothing */ + monotime_add_msec(&t2, &t1, 0); + monotime_coarse_add_msec(&ct2, &ct1, 0); + tt_i64_op(monotime_diff_msec(&t1, &t2), OP_EQ, 0); + tt_i64_op(monotime_coarse_diff_msec(&ct1, &ct2), OP_EQ, 0); + + /* Add 1337 msec; see if the diff function agree */ + monotime_add_msec(&t2, &t1, 1337); + monotime_coarse_add_msec(&ct2, &ct1, 1337); + tt_i64_op(monotime_diff_msec(&t1, &t2), OP_EQ, 1337); + tt_i64_op(monotime_coarse_diff_msec(&ct1, &ct2), OP_EQ, 1337); + + /* Add 1337 msec twice more; make sure that any second rollover issues + * worked. */ + monotime_add_msec(&t2, &t2, 1337); + monotime_coarse_add_msec(&ct2, &ct2, 1337); + monotime_add_msec(&t2, &t2, 1337); + monotime_coarse_add_msec(&ct2, &ct2, 1337); + tt_i64_op(monotime_diff_msec(&t1, &t2), OP_EQ, 1337*3); + tt_i64_op(monotime_coarse_diff_msec(&ct1, &ct2), OP_EQ, 1337*3); + + done: + ; +} + +static void +test_util_htonll(void *arg) +{ + (void)arg; +#ifdef WORDS_BIGENDIAN + const uint64_t res_be = 0x8877665544332211; +#else + const uint64_t res_le = 0x1122334455667788; +#endif + + tt_u64_op(0, OP_EQ, tor_htonll(0)); + tt_u64_op(0, OP_EQ, tor_ntohll(0)); + tt_u64_op(UINT64_MAX, OP_EQ, tor_htonll(UINT64_MAX)); + tt_u64_op(UINT64_MAX, OP_EQ, tor_ntohll(UINT64_MAX)); + +#ifdef WORDS_BIGENDIAN + tt_u64_op(res_be, OP_EQ, tor_htonll(0x8877665544332211)); + tt_u64_op(res_be, OP_EQ, tor_ntohll(0x8877665544332211)); +#else + tt_u64_op(res_le, OP_EQ, tor_htonll(0x8877665544332211)); + tt_u64_op(res_le, OP_EQ, tor_ntohll(0x8877665544332211)); +#endif /* defined(WORDS_BIGENDIAN) */ + + done: + ; +} + +static void +test_util_get_unquoted_path(void *arg) +{ + (void)arg; + + char *r = NULL; + + r = get_unquoted_path("\""); // " + tt_ptr_op(r, OP_EQ, NULL); + tor_free(r); + + r = get_unquoted_path("\"\"\""); // """ + tt_ptr_op(r, OP_EQ, NULL); + tor_free(r); + + r = get_unquoted_path("\\\""); // \" + tt_ptr_op(r, OP_EQ, NULL); + tor_free(r); + + r = get_unquoted_path("\\\"\\\""); // \"\" + tt_ptr_op(r, OP_EQ, NULL); + tor_free(r); + + r = get_unquoted_path("A\\B\\C\""); // A\B\C" + tt_ptr_op(r, OP_EQ, NULL); + tor_free(r); + + r = get_unquoted_path("\"A\\B\\C"); // "A\B\C + tt_ptr_op(r, OP_EQ, NULL); + tor_free(r); + + r = get_unquoted_path("\"A\\B\"C\""); // "A\B"C" + tt_ptr_op(r, OP_EQ, NULL); + tor_free(r); + + r = get_unquoted_path("A\\B\"C"); // A\B"C + tt_ptr_op(r, OP_EQ, NULL); + tor_free(r); + + r = get_unquoted_path(""); + tt_str_op(r, OP_EQ, ""); + tor_free(r); + + r = get_unquoted_path("\"\""); // "" + tt_str_op(r, OP_EQ, ""); + tor_free(r); + + r = get_unquoted_path("A\\B\\C"); // A\B\C + tt_str_op(r, OP_EQ, "A\\B\\C"); // A\B\C + tor_free(r); + + r = get_unquoted_path("\"A\\B\\C\""); // "A\B\C" + tt_str_op(r, OP_EQ, "A\\B\\C"); // A\B\C + tor_free(r); + + r = get_unquoted_path("\"\\\""); // "\" + tt_str_op(r, OP_EQ, "\\"); // \ /* comment to prevent line continuation */ + tor_free(r); + + r = get_unquoted_path("\"\\\"\""); // "\"" + tt_str_op(r, OP_EQ, "\""); // " + tor_free(r); + + r = get_unquoted_path("\"A\\B\\C\\\"\""); // "A\B\C\"" + tt_str_op(r, OP_EQ, "A\\B\\C\""); // A\B\C" + tor_free(r); + + r = get_unquoted_path("A\\B\\\"C"); // A\B\"C + tt_str_op(r, OP_EQ, "A\\B\"C"); // A\B"C + tor_free(r); + + r = get_unquoted_path("\"A\\B\\\"C\""); // "A\B\"C" + tt_str_op(r, OP_EQ, "A\\B\"C"); // A\B"C + + done: + tor_free(r); +} + +#define UTIL_LEGACY(name) \ + { #name, test_util_ ## name , 0, NULL, NULL } + +#define UTIL_TEST(name, flags) \ + { #name, test_util_ ## name, flags, NULL, NULL } + +#define COMPRESS(name, identifier) \ + { "compress/" #name, test_util_compress, 0, &passthrough_setup, \ + (char*)(identifier) } + +#define COMPRESS_CONCAT(name, identifier) \ + { "compress_concat/" #name, test_util_decompress_concatenated, 0, \ + &passthrough_setup, \ + (char*)(identifier) } + +#define COMPRESS_JUNK(name, identifier) \ + { "compress_junk/" #name, test_util_decompress_junk, 0, \ + &passthrough_setup, \ + (char*)(identifier) } + +#define COMPRESS_DOS(name, identifier) \ + { "compress_dos/" #name, test_util_decompress_dos, 0, \ + &passthrough_setup, \ + (char*)(identifier) } + +#ifdef _WIN32 +#define UTIL_TEST_NO_WIN(n, f) { #n, NULL, TT_SKIP, NULL, NULL } +#define UTIL_TEST_WIN_ONLY(n, f) UTIL_TEST(n, (f)) +#define UTIL_LEGACY_NO_WIN(n) UTIL_TEST_NO_WIN(n, 0) +#else +#define UTIL_TEST_NO_WIN(n, f) UTIL_TEST(n, (f)) +#define UTIL_TEST_WIN_ONLY(n, f) { #n, NULL, TT_SKIP, NULL, NULL } +#define UTIL_LEGACY_NO_WIN(n) UTIL_LEGACY(n) +#endif /* defined(_WIN32) */ + +struct testcase_t util_tests[] = { + UTIL_LEGACY(time), + UTIL_TEST(parse_http_time, 0), + UTIL_LEGACY(config_line), + UTIL_LEGACY(config_line_quotes), + UTIL_LEGACY(config_line_comment_character), + UTIL_LEGACY(config_line_escaped_content), + UTIL_LEGACY(config_line_crlf), + UTIL_LEGACY_NO_WIN(expand_filename), + UTIL_LEGACY(escape_string_socks), + UTIL_LEGACY(string_is_key_value), + UTIL_LEGACY(strmisc), + UTIL_TEST(parse_integer, 0), + UTIL_LEGACY(pow2), + COMPRESS(zlib, "deflate"), + COMPRESS(gzip, "gzip"), + COMPRESS(lzma, "x-tor-lzma"), + COMPRESS(zstd, "x-zstd"), + COMPRESS(none, "identity"), + COMPRESS_CONCAT(zlib, "deflate"), + COMPRESS_CONCAT(gzip, "gzip"), + COMPRESS_CONCAT(lzma, "x-tor-lzma"), + COMPRESS_CONCAT(zstd, "x-zstd"), + COMPRESS_CONCAT(none, "identity"), + COMPRESS_JUNK(zlib, "deflate"), + COMPRESS_JUNK(gzip, "gzip"), + COMPRESS_JUNK(lzma, "x-tor-lzma"), + COMPRESS_DOS(zlib, "deflate"), + COMPRESS_DOS(gzip, "gzip"), + COMPRESS_DOS(lzma, "x-tor-lzma"), + COMPRESS_DOS(zstd, "x-zstd"), + UTIL_TEST(gzip_compression_bomb, TT_FORK), + UTIL_LEGACY(datadir), + UTIL_LEGACY(memarea), + UTIL_LEGACY(control_formats), + UTIL_LEGACY(mmap), + UTIL_TEST(sscanf, TT_FORK), + UTIL_LEGACY(format_time_interval), + UTIL_LEGACY(path_is_relative), + UTIL_LEGACY(strtok), + UTIL_LEGACY(di_ops), + UTIL_TEST(di_map, 0), + UTIL_TEST(round_to_next_multiple_of, 0), + UTIL_TEST(laplace, 0), + UTIL_TEST(clamp_double_to_int64, 0), + UTIL_TEST(find_str_at_start_of_line, 0), + UTIL_TEST(string_is_C_identifier, 0), + UTIL_TEST(asprintf, 0), + UTIL_TEST(listdir, 0), + UTIL_TEST(parent_dir, 0), + UTIL_TEST(ftruncate, 0), + UTIL_TEST(num_cpus, 0), + UTIL_TEST_WIN_ONLY(load_win_lib, 0), + UTIL_TEST_NO_WIN(exit_status, 0), + UTIL_TEST_NO_WIN(string_from_pipe, 0), + UTIL_TEST(format_hex_number, 0), + UTIL_TEST(format_dec_number, 0), + UTIL_TEST(join_win_cmdline, 0), + UTIL_TEST(split_lines, 0), + UTIL_TEST(n_bits_set, 0), + UTIL_TEST(eat_whitespace, 0), + UTIL_TEST(sl_new_from_text_lines, 0), + UTIL_TEST(envnames, 0), + UTIL_TEST(make_environment, 0), + UTIL_TEST(set_env_var_in_sl, 0), + UTIL_TEST(read_file_eof_tiny_limit, 0), + UTIL_TEST(read_file_eof_one_loop_a, 0), + UTIL_TEST(read_file_eof_one_loop_b, 0), + UTIL_TEST(read_file_eof_two_loops, 0), + UTIL_TEST(read_file_eof_two_loops_b, 0), + UTIL_TEST(read_file_eof_zero_bytes, 0), + UTIL_TEST(write_chunks_to_file, 0), + UTIL_TEST(mathlog, 0), + UTIL_TEST(fraction, 0), + UTIL_TEST(weak_random, 0), + { "socket_ipv4", test_util_socket, TT_FORK, &passthrough_setup, + (void*)"4" }, + { "socket_ipv6", test_util_socket, TT_FORK, + &passthrough_setup, (void*)"6" }, + { "socketpair", test_util_socketpair, TT_FORK, &passthrough_setup, + (void*)"0" }, + { "socketpair_ersatz", test_util_socketpair, TT_FORK, + &passthrough_setup, (void*)"1" }, + UTIL_TEST(max_mem, 0), + UTIL_TEST(hostname_validation, 0), + UTIL_TEST(ipv4_validation, 0), + UTIL_TEST(writepid, 0), + UTIL_TEST(get_avail_disk_space, 0), + UTIL_TEST(touch_file, 0), + UTIL_TEST_NO_WIN(pwdb, TT_FORK), + UTIL_TEST(calloc_check, 0), + UTIL_TEST(monotonic_time, 0), + UTIL_TEST(monotonic_time_ratchet, TT_FORK), + UTIL_TEST(monotonic_time_zero, 0), + UTIL_TEST(monotonic_time_add_msec, 0), + UTIL_TEST(htonll, 0), + UTIL_TEST(get_unquoted_path, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_util_format.c b/src/wraith/src/test/test_util_format.c new file mode 100644 index 000000000..683d5fdac --- /dev/null +++ b/src/wraith/src/test/test_util_format.c @@ -0,0 +1,419 @@ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" + +#include "test.h" + +#define UTIL_FORMAT_PRIVATE +#include "util_format.h" + +#define NS_MODULE util_format + +static void +test_util_format_unaligned_accessors(void *ignored) +{ + (void)ignored; + char buf[9] = "onionsoup"; // 6f6e696f6e736f7570 + + tt_u64_op(get_uint64(buf+1), OP_EQ, + tor_htonll(U64_LITERAL(0x6e696f6e736f7570))); + tt_uint_op(get_uint32(buf+1), OP_EQ, htonl(0x6e696f6e)); + tt_uint_op(get_uint16(buf+1), OP_EQ, htons(0x6e69)); + tt_uint_op(get_uint8(buf+1), OP_EQ, 0x6e); + + set_uint8(buf+7, 0x61); + tt_mem_op(buf, OP_EQ, "onionsoap", 9); + + set_uint16(buf+6, htons(0x746f)); + tt_mem_op(buf, OP_EQ, "onionstop", 9); + + set_uint32(buf+1, htonl(0x78696465)); + tt_mem_op(buf, OP_EQ, "oxidestop", 9); + + set_uint64(buf+1, tor_htonll(U64_LITERAL(0x6266757363617465))); + tt_mem_op(buf, OP_EQ, "obfuscate", 9); + done: + ; +} + +static void +test_util_format_base64_encode(void *ignored) +{ + (void)ignored; + int res; + int i; + char *src; + char *dst; + + src = tor_malloc_zero(256); + dst = tor_malloc_zero(1000); + + for (i=0;i<256;i++) { + src[i] = (char)i; + } + + res = base64_encode(NULL, 1, src, 1, 0); + tt_int_op(res, OP_EQ, -1); + + res = base64_encode(dst, 1, NULL, 1, 0); + tt_int_op(res, OP_EQ, -1); + + res = base64_encode(dst, 1, src, 10, 0); + tt_int_op(res, OP_EQ, -1); + + res = base64_encode(dst, SSIZE_MAX-1, src, 1, 0); + tt_int_op(res, OP_EQ, -1); + + res = base64_encode(dst, SSIZE_MAX-1, src, 10, 0); + tt_int_op(res, OP_EQ, -1); + + res = base64_encode(dst, 1000, src, 256, 0); + tt_int_op(res, OP_EQ, 344); + tt_str_op(dst, OP_EQ, "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh" + "8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZH" + "SElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3" + "BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeY" + "mZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wM" + "HCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp" + "6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=="); + + res = base64_encode(dst, 1000, src, 256, BASE64_ENCODE_MULTILINE); + tt_int_op(res, OP_EQ, 350); + tt_str_op(dst, OP_EQ, + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v\n" + "MDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5f\n" + "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6P\n" + "kJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/\n" + "wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v\n" + "8PHy8/T19vf4+fr7/P3+/w==\n"); + + res = base64_encode(dst, 1000, src+1, 255, BASE64_ENCODE_MULTILINE); + tt_int_op(res, OP_EQ, 346); + + for (i = 0;i<50;i++) { + src[i] = 0; + } + src[50] = (char)255; + src[51] = (char)255; + src[52] = (char)255; + src[53] = (char)255; + + res = base64_encode(dst, 1000, src, 54, BASE64_ENCODE_MULTILINE); + tt_int_op(res, OP_EQ, 74); + + res = base64_encode(dst, 1000, src+1, 53, BASE64_ENCODE_MULTILINE); + tt_int_op(res, OP_EQ, 74); + + res = base64_encode(dst, 1000, src+2, 52, BASE64_ENCODE_MULTILINE); + tt_int_op(res, OP_EQ, 74); + + res = base64_encode(dst, 1000, src+3, 51, BASE64_ENCODE_MULTILINE); + tt_int_op(res, OP_EQ, 70); + + res = base64_encode(dst, 1000, src+4, 50, BASE64_ENCODE_MULTILINE); + tt_int_op(res, OP_EQ, 70); + + res = base64_encode(dst, 1000, src+5, 49, BASE64_ENCODE_MULTILINE); + tt_int_op(res, OP_EQ, 70); + + res = base64_encode(dst, 1000, src+6, 48, BASE64_ENCODE_MULTILINE); + tt_int_op(res, OP_EQ, 65); + + res = base64_encode(dst, 1000, src+7, 47, BASE64_ENCODE_MULTILINE); + tt_int_op(res, OP_EQ, 65); + + res = base64_encode(dst, 1000, src+8, 46, BASE64_ENCODE_MULTILINE); + tt_int_op(res, OP_EQ, 65); + + done: + tor_free(src); + tor_free(dst); +} + +static void +test_util_format_base64_decode_oddsize(void *ignored) +{ + (void)ignored; + int res; + int i; + char *src; + char *dst, real_dst[7]; + char expected[] = {0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65}; + char real_src[] = "ZXhhbXBsZQ"; + char expected40[] = "testing40characteroddsizebase64encoding!"; + char src40[] = "dGVzdGluZzQwY2hhcmFjdGVyb2Rkc2l6ZWJhc2U2NGVuY29kaW5nIQ"; + char pad40[] = "dGVzdGluZzQwY2hhcmFjdGVyb2Rkc2l6ZWJhc2U2NGVuY29kaW5nIQ=="; + + src = tor_malloc_zero(256); + dst = tor_malloc_zero(1000); + + for (i=0;i<256;i++) { + src[i] = (char)i; + } + + res = base64_decode(dst, 1, src, 5); + tt_int_op(res, OP_EQ, -1); + + const char *s = "SGVsbG8gd29ybGQ"; + res = base64_decode(dst, 1000, s, strlen(s)); + tt_int_op(res, OP_EQ, 11); + tt_mem_op(dst, OP_EQ, "Hello world", 11); + + s = "T3BhIG11bmRv"; + res = base64_decode(dst, 9, s, strlen(s)); + tt_int_op(res, OP_EQ, 9); + tt_mem_op(dst, OP_EQ, "Opa mundo", 9); + + res = base64_decode(real_dst, sizeof(real_dst), real_src, 10); + tt_int_op(res, OP_EQ, 7); + tt_mem_op(real_dst, OP_EQ, expected, 7); + + res = base64_decode(dst, 40, src40, strlen(src40)); + tt_int_op(res, OP_EQ, 40); + tt_mem_op(dst, OP_EQ, expected40, 40); + + res = base64_decode(dst, 40, pad40, strlen(pad40)); + tt_int_op(res, OP_EQ, 40); + tt_mem_op(dst, OP_EQ, expected40, 40); + + done: + tor_free(src); + tor_free(dst); +} + +static void +test_util_format_base64_decode(void *ignored) +{ + (void)ignored; + int res; + int i; + char *src; + char *dst, *real_dst; + uint8_t expected[] = {0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65}; + char real_src[] = "ZXhhbXBsZQ=="; + + src = tor_malloc_zero(256); + dst = tor_malloc_zero(1000); + real_dst = tor_malloc_zero(10); + + for (i=0;i<256;i++) { + src[i] = (char)i; + } + + res = base64_decode(dst, 1, src, 100); + tt_int_op(res, OP_EQ, -1); + + res = base64_decode(dst, 1, real_src, 10); + tt_int_op(res, OP_EQ, -1); + + const char *s = "T3BhIG11bmRv"; + res = base64_decode(dst, 9, s, strlen(s)); + tt_int_op(res, OP_EQ, 9); + tt_mem_op(dst, OP_EQ, "Opa mundo", 9); + + memset(dst, 0, 1000); + res = base64_decode(dst, 100, s, strlen(s)); + tt_int_op(res, OP_EQ, 9); + tt_mem_op(dst, OP_EQ, "Opa mundo", 9); + + s = "SGVsbG8gd29ybGQ="; + res = base64_decode(dst, 100, s, strlen(s)); + tt_int_op(res, OP_EQ, 11); + tt_mem_op(dst, OP_EQ, "Hello world", 11); + + res = base64_decode(real_dst, 10, real_src, 10); + tt_int_op(res, OP_EQ, 7); + tt_mem_op(real_dst, OP_EQ, expected, 7); + + done: + tor_free(src); + tor_free(dst); + tor_free(real_dst); +} + +static void +test_util_format_base16_decode(void *ignored) +{ + (void)ignored; + int res; + int i; + char *src; + char *dst, *real_dst; + char expected[] = {0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65}; + char real_src[] = "6578616D706C65"; + + src = tor_malloc_zero(256); + dst = tor_malloc_zero(1000); + real_dst = tor_malloc_zero(10); + + for (i=0;i<256;i++) { + src[i] = (char)i; + } + + res = base16_decode(dst, 3, src, 3); + tt_int_op(res, OP_EQ, -1); + + res = base16_decode(dst, 1, src, 10); + tt_int_op(res, OP_EQ, -1); + + res = base16_decode(dst, ((size_t)INT_MAX)+1, src, 10); + tt_int_op(res, OP_EQ, -1); + + res = base16_decode(dst, 1000, "", 0); + tt_int_op(res, OP_EQ, 0); + + res = base16_decode(dst, 1000, "aabc", 4); + tt_int_op(res, OP_EQ, 2); + tt_mem_op(dst, OP_EQ, "\xaa\xbc", 2); + + res = base16_decode(dst, 1000, "aabcd", 6); + tt_int_op(res, OP_EQ, -1); + + res = base16_decode(dst, 1000, "axxx", 4); + tt_int_op(res, OP_EQ, -1); + + res = base16_decode(real_dst, 10, real_src, 14); + tt_int_op(res, OP_EQ, 7); + tt_mem_op(real_dst, OP_EQ, expected, 7); + + done: + tor_free(src); + tor_free(dst); + tor_free(real_dst); +} + +static void +test_util_format_base32_encode(void *arg) +{ + (void) arg; + size_t real_dstlen = 32; + char *dst = tor_malloc_zero(real_dstlen); + + /* Basic use case that doesn't require a source length correction. */ + { + /* Length of 10 bytes. */ + const char *src = "blahbleh12"; + size_t srclen = strlen(src); + /* Expected result encoded base32. This was created using python as + * such (and same goes for all test case.): + * + * b = bytes("blahbleh12", 'utf-8') + * base64.b32encode(b) + * (result in lower case) + */ + const char *expected = "mjwgc2dcnrswqmjs"; + + base32_encode(dst, base32_encoded_size(srclen), src, srclen); + tt_mem_op(expected, OP_EQ, dst, strlen(expected)); + /* Encode but to a larger size destination. */ + memset(dst, 0, real_dstlen); + base32_encode(dst, real_dstlen, src, srclen); + tt_mem_op(expected, OP_EQ, dst, strlen(expected)); + } + + /* Non multiple of 5 for the source buffer length. */ + { + /* Length of 8 bytes. */ + const char *expected = "mjwgc2dcnrswq"; + const char *src = "blahbleh"; + size_t srclen = strlen(src); + + memset(dst, 0, real_dstlen); + base32_encode(dst, base32_encoded_size(srclen), src, srclen); + tt_mem_op(expected, OP_EQ, dst, strlen(expected)); + } + + done: + tor_free(dst); +} + +static void +test_util_format_base32_decode(void *arg) +{ + (void) arg; + int ret; + size_t real_dstlen = 32; + char *dst = tor_malloc_zero(real_dstlen); + + /* Basic use case. */ + { + /* Length of 10 bytes. */ + const char *expected = "blahbleh12"; + /* Expected result encoded base32. */ + const char *src = "mjwgc2dcnrswqmjs"; + + ret = base32_decode(dst, strlen(expected), src, strlen(src)); + tt_int_op(ret, OP_EQ, 0); + tt_str_op(expected, OP_EQ, dst); + } + + /* Non multiple of 5 for the source buffer length. */ + { + /* Length of 8 bytes. */ + const char *expected = "blahbleh"; + const char *src = "mjwgc2dcnrswq"; + + ret = base32_decode(dst, strlen(expected), src, strlen(src)); + tt_int_op(ret, OP_EQ, 0); + tt_mem_op(expected, OP_EQ, dst, strlen(expected)); + } + + /* Invalid values. */ + { + /* Invalid character '#'. */ + ret = base32_decode(dst, real_dstlen, "#abcde", 6); + tt_int_op(ret, OP_EQ, -1); + /* Make sure the destination buffer has been zeroed even on error. */ + tt_int_op(tor_mem_is_zero(dst, real_dstlen), OP_EQ, 1); + } + + done: + tor_free(dst); +} + +static void +test_util_format_encoded_size(void *arg) +{ + (void)arg; + uint8_t inbuf[256]; + char outbuf[1024]; + unsigned i; + + crypto_rand((char *)inbuf, sizeof(inbuf)); + for (i = 0; i <= sizeof(inbuf); ++i) { + /* XXXX (Once the return values are consistent, check them too.) */ + + base32_encode(outbuf, sizeof(outbuf), (char *)inbuf, i); + /* The "+ 1" below is an API inconsistency. */ + tt_int_op(strlen(outbuf) + 1, OP_EQ, base32_encoded_size(i)); + + base64_encode(outbuf, sizeof(outbuf), (char *)inbuf, i, 0); + tt_int_op(strlen(outbuf), OP_EQ, base64_encode_size(i, 0)); + base64_encode(outbuf, sizeof(outbuf), (char *)inbuf, i, + BASE64_ENCODE_MULTILINE); + tt_int_op(strlen(outbuf), OP_EQ, + base64_encode_size(i, BASE64_ENCODE_MULTILINE)); + } + + done: + ; +} + +struct testcase_t util_format_tests[] = { + { "unaligned_accessors", test_util_format_unaligned_accessors, 0, + NULL, NULL }, + { "base64_encode", test_util_format_base64_encode, 0, NULL, NULL }, + { "base64_decode_oddsize", test_util_format_base64_decode_oddsize, 0, + NULL, NULL }, + { "base64_decode", test_util_format_base64_decode, 0, NULL, NULL }, + { "base16_decode", test_util_format_base16_decode, 0, NULL, NULL }, + { "base32_encode", test_util_format_base32_encode, 0, + NULL, NULL }, + { "base32_decode", test_util_format_base32_decode, 0, + NULL, NULL }, + { "encoded_size", test_util_format_encoded_size, 0, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_util_process.c b/src/wraith/src/test/test_util_process.c new file mode 100644 index 000000000..68ce6cfd4 --- /dev/null +++ b/src/wraith/src/test/test_util_process.c @@ -0,0 +1,83 @@ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define UTIL_PROCESS_PRIVATE +#include "orconfig.h" +#include "or.h" + +#include "test.h" + +#include "util_process.h" + +#include "log_test_helpers.h" + +#ifndef _WIN32 +#define NS_MODULE util_process + +static void +temp_callback(int r, void *s) +{ + (void)r; + (void)s; +} + +static void +test_util_process_set_waitpid_callback(void *ignored) +{ + (void)ignored; + waitpid_callback_t *res1 = NULL, *res2 = NULL; + setup_full_capture_of_logs(LOG_WARN); + pid_t pid = (pid_t)42; + + res1 = set_waitpid_callback(pid, temp_callback, NULL); + tt_assert(res1); + + res2 = set_waitpid_callback(pid, temp_callback, NULL); + tt_assert(res2); + expect_single_log_msg( + "Replaced a waitpid monitor on pid 42. That should be " + "impossible.\n"); + + done: + teardown_capture_of_logs(); + clear_waitpid_callback(res1); + clear_waitpid_callback(res2); +} + +static void +test_util_process_clear_waitpid_callback(void *ignored) +{ + (void)ignored; + waitpid_callback_t *res; + setup_capture_of_logs(LOG_WARN); + pid_t pid = (pid_t)43; + + clear_waitpid_callback(NULL); + + res = set_waitpid_callback(pid, temp_callback, NULL); + clear_waitpid_callback(res); + expect_no_log_entry(); + +#if 0 + /* No. This is use-after-free. We don't _do_ that. XXXX */ + clear_waitpid_callback(res); + expect_log_msg("Couldn't remove waitpid monitor for pid 43.\n"); +#endif + + done: + teardown_capture_of_logs(); +} +#endif /* !defined(_WIN32) */ + +#ifndef _WIN32 +#define TEST(name) { #name, test_util_process_##name, 0, NULL, NULL } +#else +#define TEST(name) { #name, NULL, TT_SKIP, NULL, NULL } +#endif + +struct testcase_t util_process_tests[] = { + TEST(set_waitpid_callback), + TEST(clear_waitpid_callback), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_util_slow.c b/src/wraith/src/test/test_util_slow.c new file mode 100644 index 000000000..2cd68cf11 --- /dev/null +++ b/src/wraith/src/test/test_util_slow.c @@ -0,0 +1,391 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define UTIL_PRIVATE +#include "util.h" +#include "util_process.h" +#include "crypto.h" +#include "torlog.h" +#include "test.h" + +#ifndef BUILDDIR +#define BUILDDIR "." +#endif + +#ifdef _WIN32 +#define notify_pending_waitpid_callbacks() STMT_NIL +#define TEST_CHILD "test-child.exe" +#define EOL "\r\n" +#else +#define TEST_CHILD (BUILDDIR "/src/test/test-child") +#define EOL "\n" +#endif /* defined(_WIN32) */ + +#ifdef _WIN32 +/* I've assumed Windows doesn't have the gap between fork and exec + * that causes the race condition on unix-like platforms */ +#define MATCH_PROCESS_STATUS(s1,s2) ((s1) == (s2)) + +#else /* !(defined(_WIN32)) */ +/* work around a race condition of the timing of SIGCHLD handler updates + * to the process_handle's fields, and checks of those fields + * + * TODO: Once we can signal failure to exec, change PROCESS_STATUS_RUNNING to + * PROCESS_STATUS_ERROR (and similarly with *_OR_NOTRUNNING) */ +#define PROCESS_STATUS_RUNNING_OR_NOTRUNNING (PROCESS_STATUS_RUNNING+1) +#define IS_RUNNING_OR_NOTRUNNING(s) \ + ((s) == PROCESS_STATUS_RUNNING || (s) == PROCESS_STATUS_NOTRUNNING) +/* well, this is ugly */ +#define MATCH_PROCESS_STATUS(s1,s2) \ + ( (s1) == (s2) \ + ||((s1) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \ + && IS_RUNNING_OR_NOTRUNNING(s2)) \ + ||((s2) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \ + && IS_RUNNING_OR_NOTRUNNING(s1))) + +#endif /* defined(_WIN32) */ + +/** Helper function for testing tor_spawn_background */ +static void +run_util_spawn_background(const char *argv[], const char *expected_out, + const char *expected_err, int expected_exit, + int expected_status) +{ + int retval, exit_code; + ssize_t pos; + process_handle_t *process_handle=NULL; + char stdout_buf[100], stderr_buf[100]; + int status; + + /* Start the program */ +#ifdef _WIN32 + status = tor_spawn_background(NULL, argv, NULL, &process_handle); +#else + status = tor_spawn_background(argv[0], argv, NULL, &process_handle); +#endif + + notify_pending_waitpid_callbacks(); + + /* the race condition doesn't affect status, + * because status isn't updated by the SIGCHLD handler, + * but we still need to handle PROCESS_STATUS_RUNNING_OR_NOTRUNNING */ + tt_assert(MATCH_PROCESS_STATUS(expected_status, status)); + if (status == PROCESS_STATUS_ERROR) { + tt_ptr_op(process_handle, OP_EQ, NULL); + return; + } + + tt_ptr_op(process_handle, OP_NE, NULL); + + /* When a spawned process forks, fails, then exits very quickly, + * (this typically occurs when exec fails) + * there is a race condition between the SIGCHLD handler + * updating the process_handle's fields, and this test + * checking the process status in those fields. + * The SIGCHLD update can occur before or after the code below executes. + * This causes intermittent failures in spawn_background_fail(), + * typically when the machine is under load. + * We use PROCESS_STATUS_RUNNING_OR_NOTRUNNING to avoid this issue. */ + + /* the race condition affects the change in + * process_handle->status from RUNNING to NOTRUNNING */ + tt_assert(MATCH_PROCESS_STATUS(expected_status, process_handle->status)); + +#ifndef _WIN32 + notify_pending_waitpid_callbacks(); + /* the race condition affects the change in + * process_handle->waitpid_cb to NULL, + * so we skip the check if expected_status is ambiguous, + * that is, PROCESS_STATUS_RUNNING_OR_NOTRUNNING */ + tt_assert(process_handle->waitpid_cb != NULL + || expected_status == PROCESS_STATUS_RUNNING_OR_NOTRUNNING); +#endif /* !defined(_WIN32) */ + +#ifdef _WIN32 + tt_assert(process_handle->stdout_pipe != INVALID_HANDLE_VALUE); + tt_assert(process_handle->stderr_pipe != INVALID_HANDLE_VALUE); + tt_assert(process_handle->stdin_pipe != INVALID_HANDLE_VALUE); +#else + tt_assert(process_handle->stdout_pipe >= 0); + tt_assert(process_handle->stderr_pipe >= 0); + tt_assert(process_handle->stdin_pipe >= 0); +#endif /* defined(_WIN32) */ + + /* Check stdout */ + pos = tor_read_all_from_process_stdout(process_handle, stdout_buf, + sizeof(stdout_buf) - 1); + tt_assert(pos >= 0); + stdout_buf[pos] = '\0'; + tt_int_op(strlen(expected_out),OP_EQ, pos); + tt_str_op(expected_out,OP_EQ, stdout_buf); + + notify_pending_waitpid_callbacks(); + + /* Check it terminated correctly */ + retval = tor_get_exit_code(process_handle, 1, &exit_code); + tt_int_op(PROCESS_EXIT_EXITED,OP_EQ, retval); + tt_int_op(expected_exit,OP_EQ, exit_code); + // TODO: Make test-child exit with something other than 0 + +#ifndef _WIN32 + notify_pending_waitpid_callbacks(); + tt_ptr_op(process_handle->waitpid_cb, OP_EQ, NULL); +#endif + + /* Check stderr */ + pos = tor_read_all_from_process_stderr(process_handle, stderr_buf, + sizeof(stderr_buf) - 1); + tt_assert(pos >= 0); + stderr_buf[pos] = '\0'; + tt_str_op(expected_err,OP_EQ, stderr_buf); + tt_int_op(strlen(expected_err),OP_EQ, pos); + + notify_pending_waitpid_callbacks(); + + done: + if (process_handle) + tor_process_handle_destroy(process_handle, 1); +} + +/** Check that we can launch a process and read the output */ +static void +test_util_spawn_background_ok(void *ptr) +{ + const char *argv[] = {TEST_CHILD, "--test", NULL}; + const char *expected_out = "OUT"EOL "--test"EOL "SLEEPING"EOL "DONE" EOL; + const char *expected_err = "ERR"EOL; + + (void)ptr; + + run_util_spawn_background(argv, expected_out, expected_err, 0, + PROCESS_STATUS_RUNNING); +} + +/** Check that failing to find the executable works as expected */ +static void +test_util_spawn_background_fail(void *ptr) +{ + const char *argv[] = {BUILDDIR "/src/test/no-such-file", "--test", NULL}; + const char *expected_err = ""; + char expected_out[1024]; + char code[32]; +#ifdef _WIN32 + const int expected_status = PROCESS_STATUS_ERROR; +#else + /* TODO: Once we can signal failure to exec, set this to be + * PROCESS_STATUS_RUNNING_OR_ERROR */ + const int expected_status = PROCESS_STATUS_RUNNING_OR_NOTRUNNING; +#endif /* defined(_WIN32) */ + + memset(expected_out, 0xf0, sizeof(expected_out)); + memset(code, 0xf0, sizeof(code)); + + (void)ptr; + + tor_snprintf(code, sizeof(code), "%x/%x", + 9 /* CHILD_STATE_FAILEXEC */ , ENOENT); + tor_snprintf(expected_out, sizeof(expected_out), + "ERR: Failed to spawn background process - code %s\n", code); + + run_util_spawn_background(argv, expected_out, expected_err, 255, + expected_status); +} + +/** Test that reading from a handle returns a partial read rather than + * blocking */ +static void +test_util_spawn_background_partial_read_impl(int exit_early) +{ + const int expected_exit = 0; + const int expected_status = PROCESS_STATUS_RUNNING; + + int retval, exit_code; + ssize_t pos = -1; + process_handle_t *process_handle=NULL; + int status; + char stdout_buf[100], stderr_buf[100]; + + const char *argv[] = {TEST_CHILD, "--test", NULL}; + const char *expected_out[] = { "OUT" EOL "--test" EOL "SLEEPING" EOL, + "DONE" EOL, + NULL }; + const char *expected_err = "ERR" EOL; + +#ifndef _WIN32 + int eof = 0; +#endif + int expected_out_ctr; + + if (exit_early) { + argv[1] = "--hang"; + expected_out[0] = "OUT"EOL "--hang"EOL "SLEEPING" EOL; + } + + /* Start the program */ +#ifdef _WIN32 + status = tor_spawn_background(NULL, argv, NULL, &process_handle); +#else + status = tor_spawn_background(argv[0], argv, NULL, &process_handle); +#endif + tt_int_op(expected_status,OP_EQ, status); + tt_assert(process_handle); + tt_int_op(expected_status,OP_EQ, process_handle->status); + + /* Check stdout */ + for (expected_out_ctr = 0; expected_out[expected_out_ctr] != NULL;) { +#ifdef _WIN32 + pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, + sizeof(stdout_buf) - 1, NULL); +#else + /* Check that we didn't read the end of file last time */ + tt_assert(!eof); + pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, + sizeof(stdout_buf) - 1, NULL, &eof); +#endif /* defined(_WIN32) */ + log_info(LD_GENERAL, "tor_read_all_handle() returned %d", (int)pos); + + /* We would have blocked, keep on trying */ + if (0 == pos) + continue; + + tt_assert(pos > 0); + stdout_buf[pos] = '\0'; + tt_str_op(expected_out[expected_out_ctr],OP_EQ, stdout_buf); + tt_int_op(strlen(expected_out[expected_out_ctr]),OP_EQ, pos); + expected_out_ctr++; + } + + if (exit_early) { + tor_process_handle_destroy(process_handle, 1); + process_handle = NULL; + goto done; + } + + /* The process should have exited without writing more */ +#ifdef _WIN32 + pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, + sizeof(stdout_buf) - 1, + process_handle); + tt_int_op(0,OP_EQ, pos); +#else /* !(defined(_WIN32)) */ + if (!eof) { + /* We should have got all the data, but maybe not the EOF flag */ + pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, + sizeof(stdout_buf) - 1, + process_handle, &eof); + tt_int_op(0,OP_EQ, pos); + tt_assert(eof); + } + /* Otherwise, we got the EOF on the last read */ +#endif /* defined(_WIN32) */ + + /* Check it terminated correctly */ + retval = tor_get_exit_code(process_handle, 1, &exit_code); + tt_int_op(PROCESS_EXIT_EXITED,OP_EQ, retval); + tt_int_op(expected_exit,OP_EQ, exit_code); + + // TODO: Make test-child exit with something other than 0 + + /* Check stderr */ + pos = tor_read_all_from_process_stderr(process_handle, stderr_buf, + sizeof(stderr_buf) - 1); + tt_assert(pos >= 0); + stderr_buf[pos] = '\0'; + tt_str_op(expected_err,OP_EQ, stderr_buf); + tt_int_op(strlen(expected_err),OP_EQ, pos); + + done: + tor_process_handle_destroy(process_handle, 1); +} + +static void +test_util_spawn_background_partial_read(void *arg) +{ + (void)arg; + test_util_spawn_background_partial_read_impl(0); +} + +static void +test_util_spawn_background_exit_early(void *arg) +{ + (void)arg; + test_util_spawn_background_partial_read_impl(1); +} + +static void +test_util_spawn_background_waitpid_notify(void *arg) +{ + int retval, exit_code; + process_handle_t *process_handle=NULL; + int status; + int ms_timer; + + const char *argv[] = {TEST_CHILD, "--fast", NULL}; + + (void) arg; + +#ifdef _WIN32 + status = tor_spawn_background(NULL, argv, NULL, &process_handle); +#else + status = tor_spawn_background(argv[0], argv, NULL, &process_handle); +#endif + + tt_int_op(status, OP_EQ, PROCESS_STATUS_RUNNING); + tt_ptr_op(process_handle, OP_NE, NULL); + + /* We're not going to look at the stdout/stderr output this time. Instead, + * we're testing whether notify_pending_waitpid_calbacks() can report the + * process exit (on unix) and/or whether tor_get_exit_code() can notice it + * (on windows) */ + +#ifndef _WIN32 + ms_timer = 30*1000; + tt_ptr_op(process_handle->waitpid_cb, OP_NE, NULL); + while (process_handle->waitpid_cb && ms_timer > 0) { + tor_sleep_msec(100); + ms_timer -= 100; + notify_pending_waitpid_callbacks(); + } + tt_int_op(ms_timer, OP_GT, 0); + tt_ptr_op(process_handle->waitpid_cb, OP_EQ, NULL); +#endif /* !defined(_WIN32) */ + + ms_timer = 30*1000; + while (((retval = tor_get_exit_code(process_handle, 0, &exit_code)) + == PROCESS_EXIT_RUNNING) && ms_timer > 0) { + tor_sleep_msec(100); + ms_timer -= 100; + } + tt_int_op(ms_timer, OP_GT, 0); + + tt_int_op(retval, OP_EQ, PROCESS_EXIT_EXITED); + + done: + tor_process_handle_destroy(process_handle, 1); +} + +#undef TEST_CHILD +#undef EOL + +#undef MATCH_PROCESS_STATUS + +#ifndef _WIN32 +#undef PROCESS_STATUS_RUNNING_OR_NOTRUNNING +#undef IS_RUNNING_OR_NOTRUNNING +#endif + +#define UTIL_TEST(name, flags) \ + { #name, test_util_ ## name, flags, NULL, NULL } + +struct testcase_t slow_util_tests[] = { + UTIL_TEST(spawn_background_ok, 0), + UTIL_TEST(spawn_background_fail, 0), + UTIL_TEST(spawn_background_partial_read, 0), + UTIL_TEST(spawn_background_exit_early, 0), + UTIL_TEST(spawn_background_waitpid_notify, 0), + END_OF_TESTCASES +}; + diff --git a/src/wraith/src/test/test_workqueue.c b/src/wraith/src/test/test_workqueue.c new file mode 100644 index 000000000..2b0317371 --- /dev/null +++ b/src/wraith/src/test/test_workqueue.c @@ -0,0 +1,454 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "compat_threads.h" +#include "onion.h" +#include "workqueue.h" +#include "crypto.h" +#include "crypto_curve25519.h" +#include "compat_libevent.h" + +#include +#include + +#define MAX_INFLIGHT (1<<16) + +static int opt_verbose = 0; +static int opt_n_threads = 8; +static int opt_n_items = 10000; +static int opt_n_inflight = 1000; +static int opt_n_lowwater = 250; +static int opt_n_cancel = 0; +static int opt_ratio_rsa = 5; + +#ifdef TRACK_RESPONSES +tor_mutex_t bitmap_mutex; +int handled_len; +bitarray_t *handled; +#endif + +typedef struct state_s { + int magic; + int n_handled; + crypto_pk_t *rsa; + curve25519_secret_key_t ecdh; + int is_shutdown; +} state_t; + +typedef struct rsa_work_s { + int serial; + uint8_t msg[128]; + uint8_t msglen; +} rsa_work_t; + +typedef struct ecdh_work_s { + int serial; + union { + curve25519_public_key_t pk; + uint8_t msg[32]; + } u; +} ecdh_work_t; + +static void +mark_handled(int serial) +{ +#ifdef TRACK_RESPONSES + tor_mutex_acquire(&bitmap_mutex); + tor_assert(serial < handled_len); + tor_assert(! bitarray_is_set(handled, serial)); + bitarray_set(handled, serial); + tor_mutex_release(&bitmap_mutex); +#else /* !(defined(TRACK_RESPONSES)) */ + (void)serial; +#endif /* defined(TRACK_RESPONSES) */ +} + +static workqueue_reply_t +workqueue_do_rsa(void *state, void *work) +{ + rsa_work_t *rw = work; + state_t *st = state; + crypto_pk_t *rsa = st->rsa; + uint8_t sig[256]; + int len; + + tor_assert(st->magic == 13371337); + + len = crypto_pk_private_sign(rsa, (char*)sig, 256, + (char*)rw->msg, rw->msglen); + if (len < 0) { + rw->msglen = 0; + return WQ_RPL_ERROR; + } + + memset(rw->msg, 0, sizeof(rw->msg)); + rw->msglen = len; + memcpy(rw->msg, sig, len); + ++st->n_handled; + + mark_handled(rw->serial); + + return WQ_RPL_REPLY; +} + +static workqueue_reply_t +workqueue_do_shutdown(void *state, void *work) +{ + (void)state; + (void)work; + crypto_pk_free(((state_t*)state)->rsa); + tor_free(state); + return WQ_RPL_SHUTDOWN; +} + +static workqueue_reply_t +workqueue_do_ecdh(void *state, void *work) +{ + ecdh_work_t *ew = work; + uint8_t output[CURVE25519_OUTPUT_LEN]; + state_t *st = state; + + tor_assert(st->magic == 13371337); + + curve25519_handshake(output, &st->ecdh, &ew->u.pk); + memcpy(ew->u.msg, output, CURVE25519_OUTPUT_LEN); + ++st->n_handled; + mark_handled(ew->serial); + return WQ_RPL_REPLY; +} + +static workqueue_reply_t +workqueue_shutdown_error(void *state, void *work) +{ + (void)state; + (void)work; + return WQ_RPL_REPLY; +} + +static void * +new_state(void *arg) +{ + state_t *st; + (void)arg; + + st = tor_malloc(sizeof(*st)); + /* Every thread gets its own keys. not a problem for benchmarking */ + st->rsa = crypto_pk_new(); + if (crypto_pk_generate_key_with_bits(st->rsa, 1024) < 0) { + crypto_pk_free(st->rsa); + tor_free(st); + return NULL; + } + curve25519_secret_key_generate(&st->ecdh, 0); + st->magic = 13371337; + return st; +} + +static void +free_state(void *arg) +{ + state_t *st = arg; + crypto_pk_free(st->rsa); + tor_free(st); +} + +static tor_weak_rng_t weak_rng; +static int n_sent = 0; +static int rsa_sent = 0; +static int ecdh_sent = 0; +static int n_received = 0; +static int no_shutdown = 0; + +#ifdef TRACK_RESPONSES +bitarray_t *received; +#endif + +static void +handle_reply(void *arg) +{ +#ifdef TRACK_RESPONSES + rsa_work_t *rw = arg; /* Naughty cast, but only looking at serial. */ + tor_assert(! bitarray_is_set(received, rw->serial)); + bitarray_set(received,rw->serial); +#endif + + tor_free(arg); + ++n_received; +} + +/* This should never get called. */ +static void +handle_reply_shutdown(void *arg) +{ + (void)arg; + no_shutdown = 1; +} + +static workqueue_entry_t * +add_work(threadpool_t *tp) +{ + int add_rsa = + opt_ratio_rsa == 0 || + tor_weak_random_range(&weak_rng, opt_ratio_rsa) == 0; + + if (add_rsa) { + rsa_work_t *w = tor_malloc_zero(sizeof(*w)); + w->serial = n_sent++; + crypto_rand((char*)w->msg, 20); + w->msglen = 20; + ++rsa_sent; + return threadpool_queue_work_priority(tp, + WQ_PRI_MED, + workqueue_do_rsa, handle_reply, w); + } else { + ecdh_work_t *w = tor_malloc_zero(sizeof(*w)); + w->serial = n_sent++; + /* Not strictly right, but this is just for benchmarks. */ + crypto_rand((char*)w->u.pk.public_key, 32); + ++ecdh_sent; + return threadpool_queue_work(tp, workqueue_do_ecdh, handle_reply, w); + } +} + +static int n_failed_cancel = 0; +static int n_successful_cancel = 0; + +static int +add_n_work_items(threadpool_t *tp, int n) +{ + int n_queued = 0; + int n_try_cancel = 0, i; + workqueue_entry_t **to_cancel; + workqueue_entry_t *ent; + + to_cancel = tor_malloc(sizeof(workqueue_entry_t*) * opt_n_cancel); + + while (n_queued++ < n) { + ent = add_work(tp); + if (! ent) { + puts("Z"); + tor_event_base_loopexit(tor_libevent_get_base(), NULL); + return -1; + } + if (n_try_cancel < opt_n_cancel && + tor_weak_random_range(&weak_rng, n) < opt_n_cancel) { + to_cancel[n_try_cancel++] = ent; + } + } + + for (i = 0; i < n_try_cancel; ++i) { + void *work = workqueue_entry_cancel(to_cancel[i]); + if (! work) { + n_failed_cancel++; + } else { + n_successful_cancel++; + tor_free(work); + } + } + + tor_free(to_cancel); + return 0; +} + +static int shutting_down = 0; + +static void +replysock_readable_cb(tor_socket_t sock, short what, void *arg) +{ + threadpool_t *tp = arg; + replyqueue_t *rq = threadpool_get_replyqueue(tp); + + int old_r = n_received; + (void) sock; + (void) what; + + replyqueue_process(rq); + if (old_r == n_received) + return; + + if (opt_verbose) { + printf("%d / %d", n_received, n_sent); + if (opt_n_cancel) + printf(" (%d cancelled, %d uncancellable)", + n_successful_cancel, n_failed_cancel); + puts(""); + } +#ifdef TRACK_RESPONSES + tor_mutex_acquire(&bitmap_mutex); + for (i = 0; i < opt_n_items; ++i) { + if (bitarray_is_set(received, i)) + putc('o', stdout); + else if (bitarray_is_set(handled, i)) + putc('!', stdout); + else + putc('.', stdout); + } + puts(""); + tor_mutex_release(&bitmap_mutex); +#endif /* defined(TRACK_RESPONSES) */ + + if (n_sent - (n_received+n_successful_cancel) < opt_n_lowwater) { + int n_to_send = n_received + opt_n_inflight - n_sent; + if (n_to_send > opt_n_items - n_sent) + n_to_send = opt_n_items - n_sent; + add_n_work_items(tp, n_to_send); + } + + if (shutting_down == 0 && + n_received+n_successful_cancel == n_sent && + n_sent >= opt_n_items) { + shutting_down = 1; + threadpool_queue_update(tp, NULL, + workqueue_do_shutdown, NULL, NULL); + // Anything we add after starting the shutdown must not be executed. + threadpool_queue_work(tp, workqueue_shutdown_error, + handle_reply_shutdown, NULL); + { + struct timeval limit = { 2, 0 }; + tor_event_base_loopexit(tor_libevent_get_base(), &limit); + } + } +} + +static void +help(void) +{ + puts( + "Options:\n" + " -h Display this information\n" + " -v Be verbose\n" + " -N Run this many items of work\n" + " -T Use this many threads\n" + " -I Have no more than this many requests queued at once\n" + " -L Add items whenever fewer than this many are pending\n" + " -C Try to cancel N items of every batch that we add\n" + " -R Make one out of this many items be a slow (RSA) one\n" + " --no-{eventfd2,eventfd,pipe2,pipe,socketpair}\n" + " Disable one of the alert_socket backends."); +} + +int +main(int argc, char **argv) +{ + replyqueue_t *rq; + threadpool_t *tp; + int i; + tor_libevent_cfg evcfg; + struct event *ev; + uint32_t as_flags = 0; + + for (i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "-v")) { + opt_verbose = 1; + } else if (!strcmp(argv[i], "-T") && i+1 opt_n_inflight || opt_n_inflight > MAX_INFLIGHT || + opt_ratio_rsa < 0) { + help(); + return 1; + } + + if (opt_n_inflight > opt_n_items) { + opt_n_inflight = opt_n_items; + } + + init_logging(1); + network_init(); + if (crypto_global_init(1, NULL, NULL) < 0) { + printf("Couldn't initialize crypto subsystem; exiting.\n"); + return 1; + } + if (crypto_seed_rng() < 0) { + printf("Couldn't seed RNG; exiting.\n"); + return 1; + } + + rq = replyqueue_new(as_flags); + if (as_flags && rq == NULL) + return 77; // 77 means "skipped". + + tor_assert(rq); + tp = threadpool_new(opt_n_threads, + rq, new_state, free_state, NULL); + tor_assert(tp); + + crypto_seed_weak_rng(&weak_rng); + + memset(&evcfg, 0, sizeof(evcfg)); + tor_libevent_initialize(&evcfg); + + ev = tor_event_new(tor_libevent_get_base(), + replyqueue_get_socket(rq), EV_READ|EV_PERSIST, + replysock_readable_cb, tp); + + event_add(ev, NULL); + +#ifdef TRACK_RESPONSES + handled = bitarray_init_zero(opt_n_items); + received = bitarray_init_zero(opt_n_items); + tor_mutex_init(&bitmap_mutex); + handled_len = opt_n_items; +#endif /* defined(TRACK_RESPONSES) */ + + for (i = 0; i < opt_n_inflight; ++i) { + if (! add_work(tp)) { + puts("Couldn't add work."); + return 1; + } + } + + { + struct timeval limit = { 180, 0 }; + tor_event_base_loopexit(tor_libevent_get_base(), &limit); + } + + event_base_loop(tor_libevent_get_base(), 0); + + if (n_sent != opt_n_items || n_received+n_successful_cancel != n_sent) { + printf("%d vs %d\n", n_sent, opt_n_items); + printf("%d+%d vs %d\n", n_received, n_successful_cancel, n_sent); + puts("FAIL"); + return 1; + } else if (no_shutdown) { + puts("Accepted work after shutdown\n"); + puts("FAIL"); + } else { + puts("OK"); + return 0; + } +} + diff --git a/src/wraith/src/test/test_workqueue_cancel.sh b/src/wraith/src/test/test_workqueue_cancel.sh new file mode 100644 index 000000000..f7c663171 --- /dev/null +++ b/src/wraith/src/test/test_workqueue_cancel.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +${builddir:-.}/src/test/test_workqueue -C 1 + diff --git a/src/wraith/src/test/test_workqueue_efd.sh b/src/wraith/src/test/test_workqueue_efd.sh new file mode 100644 index 000000000..4d8939681 --- /dev/null +++ b/src/wraith/src/test/test_workqueue_efd.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +${builddir:-.}/src/test/test_workqueue \ + --no-eventfd2 --no-pipe2 --no-pipe --no-socketpair diff --git a/src/wraith/src/test/test_workqueue_efd2.sh b/src/wraith/src/test/test_workqueue_efd2.sh new file mode 100644 index 000000000..7cfff45ff --- /dev/null +++ b/src/wraith/src/test/test_workqueue_efd2.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +${builddir:-.}/src/test/test_workqueue \ + --no-eventfd --no-pipe2 --no-pipe --no-socketpair diff --git a/src/wraith/src/test/test_workqueue_pipe.sh b/src/wraith/src/test/test_workqueue_pipe.sh new file mode 100644 index 000000000..afcef8785 --- /dev/null +++ b/src/wraith/src/test/test_workqueue_pipe.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +${builddir:-.}/src/test/test_workqueue \ + --no-eventfd2 --no-eventfd --no-pipe2 --no-socketpair diff --git a/src/wraith/src/test/test_workqueue_pipe2.sh b/src/wraith/src/test/test_workqueue_pipe2.sh new file mode 100644 index 000000000..a20a1427e --- /dev/null +++ b/src/wraith/src/test/test_workqueue_pipe2.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +${builddir:-.}/src/test/test_workqueue \ + --no-eventfd2 --no-eventfd --no-pipe --no-socketpair diff --git a/src/wraith/src/test/test_workqueue_socketpair.sh b/src/wraith/src/test/test_workqueue_socketpair.sh new file mode 100644 index 000000000..76af79746 --- /dev/null +++ b/src/wraith/src/test/test_workqueue_socketpair.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +${builddir:-.}/src/test/test_workqueue \ + --no-eventfd2 --no-eventfd --no-pipe2 --no-pipe diff --git a/src/wraith/src/test/test_zero_length_keys.sh b/src/wraith/src/test/test_zero_length_keys.sh new file mode 100644 index 000000000..f85edb68d --- /dev/null +++ b/src/wraith/src/test/test_zero_length_keys.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# Check that tor regenerates keys when key files are zero-length + +exitcode=0 + +"${SHELL:-sh}" "${abs_top_srcdir:-.}/src/test/zero_length_keys.sh" "${builddir:-.}/src/or/tor" -z || exitcode=1 +"${SHELL:-sh}" "${abs_top_srcdir:-.}/src/test/zero_length_keys.sh" "${builddir:-.}/src/or/tor" -d || exitcode=1 +"${SHELL:-sh}" "${abs_top_srcdir:-.}/src/test/zero_length_keys.sh" "${builddir:-.}/src/or/tor" -e || exitcode=1 + +exit ${exitcode} diff --git a/src/wraith/src/test/testing_common.c b/src/wraith/src/test/testing_common.c new file mode 100644 index 000000000..142c68107 --- /dev/null +++ b/src/wraith/src/test/testing_common.c @@ -0,0 +1,330 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_common.c + * \brief Common pieces to implement unit tests. + **/ + +#include "orconfig.h" +#include "or.h" +#include "control.h" +#include "config.h" +#include "rephist.h" +#include "backtrace.h" +#include "test.h" +#include "channelpadding.h" + +#include +#ifdef HAVE_FCNTL_H +#include +#endif + +#ifdef _WIN32 +/* For mkdir() */ +#include +#else +#include +#endif /* defined(_WIN32) */ + +#include "or.h" + +#ifdef USE_DMALLOC +#include +#include "main.h" +#endif + +/** Temporary directory (set up by setup_directory) under which we store all + * our files during testing. */ +static char temp_dir[256]; +#ifdef _WIN32 +#define pid_t int +#endif +static pid_t temp_dir_setup_in_pid = 0; + +/** Select and create the temporary directory we'll use to run our unit tests. + * Store it in temp_dir. Exit immediately if we can't create it. + * idempotent. */ +static void +setup_directory(void) +{ + static int is_setup = 0; + int r; + char rnd[256], rnd32[256]; + if (is_setup) return; + +/* Due to base32 limitation needs to be a multiple of 5. */ +#define RAND_PATH_BYTES 5 + crypto_rand(rnd, RAND_PATH_BYTES); + base32_encode(rnd32, sizeof(rnd32), rnd, RAND_PATH_BYTES); + +#ifdef _WIN32 + { + char buf[MAX_PATH]; + const char *tmp = buf; + const char *extra_backslash = ""; + /* If this fails, we're probably screwed anyway */ + if (!GetTempPathA(sizeof(buf),buf)) + tmp = "c:\\windows\\temp\\"; + if (strcmpend(tmp, "\\")) { + /* According to MSDN, it should be impossible for GetTempPath to give us + * an answer that doesn't end with \. But let's make sure. */ + extra_backslash = "\\"; + } + tor_snprintf(temp_dir, sizeof(temp_dir), + "%s%stor_test_%d_%s", tmp, extra_backslash, + (int)getpid(), rnd32); + r = mkdir(temp_dir); + } +#else /* !(defined(_WIN32)) */ + tor_snprintf(temp_dir, sizeof(temp_dir), "/tmp/tor_test_%d_%s", + (int) getpid(), rnd32); + r = mkdir(temp_dir, 0700); + if (!r) { + /* undo sticky bit so tests don't get confused. */ + r = chown(temp_dir, getuid(), getgid()); + } +#endif /* defined(_WIN32) */ + if (r) { + fprintf(stderr, "Can't create directory %s:", temp_dir); + perror(""); + exit(1); + } + is_setup = 1; + temp_dir_setup_in_pid = getpid(); +} + +/** Return a filename relative to our testing temporary directory, based on + * name and suffix. If name is NULL, return the name of the testing temporary + * directory. */ +static const char * +get_fname_suffix(const char *name, const char *suffix) +{ + static char buf[1024]; + setup_directory(); + if (!name) + return temp_dir; + tor_snprintf(buf,sizeof(buf),"%s/%s%s%s",temp_dir,name,suffix ? "_" : "", + suffix ? suffix : ""); + return buf; +} + +/** Return a filename relative to our testing temporary directory. If name is + * NULL, return the name of the testing temporary directory. */ +const char * +get_fname(const char *name) +{ + return get_fname_suffix(name, NULL); +} + +/** Return a filename with a random suffix, relative to our testing temporary + * directory. If name is NULL, return the name of the testing temporary + * directory, without any suffix. */ +const char * +get_fname_rnd(const char *name) +{ + char rnd[256], rnd32[256]; + crypto_rand(rnd, RAND_PATH_BYTES); + base32_encode(rnd32, sizeof(rnd32), rnd, RAND_PATH_BYTES); + return get_fname_suffix(name, rnd32); +} + +/* Remove a directory and all of its subdirectories */ +static void +rm_rf(const char *dir) +{ + struct stat st; + smartlist_t *elements; + + elements = tor_listdir(dir); + if (elements) { + SMARTLIST_FOREACH_BEGIN(elements, const char *, cp) { + char *tmp = NULL; + tor_asprintf(&tmp, "%s"PATH_SEPARATOR"%s", dir, cp); + if (0 == stat(tmp,&st) && (st.st_mode & S_IFDIR)) { + rm_rf(tmp); + } else { + if (unlink(tmp)) { + fprintf(stderr, "Error removing %s: %s\n", tmp, strerror(errno)); + } + } + tor_free(tmp); + } SMARTLIST_FOREACH_END(cp); + SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); + smartlist_free(elements); + } + if (rmdir(dir)) + fprintf(stderr, "Error removing directory %s: %s\n", dir, strerror(errno)); +} + +/** Remove all files stored under the temporary directory, and the directory + * itself. Called by atexit(). */ +static void +remove_directory(void) +{ + if (getpid() != temp_dir_setup_in_pid) { + /* Only clean out the tempdir when the main process is exiting. */ + return; + } + + rm_rf(temp_dir); +} + +static void * +passthrough_test_setup(const struct testcase_t *testcase) +{ + /* Make sure the passthrough doesn't unintentionally fail or skip tests */ + tor_assert(testcase->setup_data); + tor_assert(testcase->setup_data != (void*)TT_SKIP); + return testcase->setup_data; +} +static int +passthrough_test_cleanup(const struct testcase_t *testcase, void *ptr) +{ + (void)testcase; + (void)ptr; + return 1; +} + +static void * +ed25519_testcase_setup(const struct testcase_t *testcase) +{ + crypto_ed25519_testing_force_impl(testcase->setup_data); + return testcase->setup_data; +} +static int +ed25519_testcase_cleanup(const struct testcase_t *testcase, void *ptr) +{ + (void)testcase; + (void)ptr; + crypto_ed25519_testing_restore_impl(); + return 1; +} +const struct testcase_setup_t ed25519_test_setup = { + ed25519_testcase_setup, ed25519_testcase_cleanup +}; + +const struct testcase_setup_t passthrough_setup = { + passthrough_test_setup, passthrough_test_cleanup +}; + +static void +an_assertion_failed(void) +{ + tinytest_set_test_failed_(); +} + +/** Main entry point for unit test code: parse the command line, and run + * some unit tests. */ +int +main(int c, const char **v) +{ + or_options_t *options; + char *errmsg = NULL; + int i, i_out; + int loglevel = LOG_ERR; + int accel_crypto = 0; + + /* We must initialise logs before we call tor_assert() */ + init_logging(1); + +#ifdef USE_DMALLOC + { + int r = crypto_use_tor_alloc_functions(); + tor_assert(r == 0); + } +#endif /* defined(USE_DMALLOC) */ + + update_approx_time(time(NULL)); + options = options_new(); + tor_threads_init(); + tor_compress_init(); + + network_init(); + + monotime_init(); + + struct tor_libevent_cfg cfg; + memset(&cfg, 0, sizeof(cfg)); + tor_libevent_initialize(&cfg); + + control_initialize_event_queue(); + configure_backtrace_handler(get_version()); + + for (i_out = i = 1; i < c; ++i) { + if (!strcmp(v[i], "--warn")) { + loglevel = LOG_WARN; + } else if (!strcmp(v[i], "--notice")) { + loglevel = LOG_NOTICE; + } else if (!strcmp(v[i], "--info")) { + loglevel = LOG_INFO; + } else if (!strcmp(v[i], "--debug")) { + loglevel = LOG_DEBUG; + } else if (!strcmp(v[i], "--accel")) { + accel_crypto = 1; + } else { + v[i_out++] = v[i]; + } + } + c = i_out; + + { + log_severity_list_t s; + memset(&s, 0, sizeof(s)); + set_log_severity_config(loglevel, LOG_ERR, &s); + /* ALWAYS log bug warnings. */ + s.masks[LOG_WARN-LOG_ERR] |= LD_BUG; + add_stream_log(&s, "", fileno(stdout)); + } + + options->command = CMD_RUN_UNITTESTS; + if (crypto_global_init(accel_crypto, NULL, NULL)) { + printf("Can't initialize crypto subsystem; exiting.\n"); + return 1; + } + crypto_set_tls_dh_prime(); + if (crypto_seed_rng() < 0) { + printf("Couldn't seed RNG; exiting.\n"); + return 1; + } + rep_hist_init(); + setup_directory(); + options_init(options); + options->DataDirectory = tor_strdup(temp_dir); + tor_asprintf(&options->KeyDirectory, "%s"PATH_SEPARATOR"keys", + options->DataDirectory); + options->CacheDirectory = tor_strdup(temp_dir); + options->EntryStatistics = 1; + if (set_options(options, &errmsg) < 0) { + printf("Failed to set initial options: %s\n", errmsg); + tor_free(errmsg); + return 1; + } + + tor_set_failed_assertion_callback(an_assertion_failed); + + init_pregenerated_keys(); + + channelpadding_new_consensus_params(NULL); + + predicted_ports_init(); + + atexit(remove_directory); + + int have_failed = (tinytest_main(c, v, testgroups) != 0); + + free_pregenerated_keys(); +#ifdef USE_DMALLOC + tor_free_all(0); + dmalloc_log_unfreed(); +#endif + crypto_global_cleanup(); + + if (have_failed) + return 1; + else + return 0; +} + diff --git a/src/wraith/src/test/testing_rsakeys.c b/src/wraith/src/test/testing_rsakeys.c new file mode 100644 index 000000000..7a24c0ed1 --- /dev/null +++ b/src/wraith/src/test/testing_rsakeys.c @@ -0,0 +1,546 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" +#include "test.h" + +/** Define this if unit tests spend too much time generating public keys. + * This module is meant to save time by using a bunch of pregenerated RSA +keys among */ +#define USE_PREGENERATED_RSA_KEYS + +#ifdef USE_PREGENERATED_RSA_KEYS + +static const char *PREGEN_KEYS_1024[] = { +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICWwIBAAKBgQCZa39BCgq7KWBWFSjGYHhqmTCHvQ7WNEFAb9Mujb6Xn/Zy01fu\n" +"WIpVvqmAKeLNEziItUm/gB8GwAN+/ZLwL9pufjIp2Ar+yqVXKySioZQxuCgTP2wm\n" +"Ku0OfmAra1Xbtrkc2OCJllxkyNPrJ/kxfwjWR96UP0+VMbOlkBoEH1FtvwIDAQAB\n" +"AoGAUXoygeMIYe+OdwkTt48CRHKIwH3aRE5KHSOGPyIOB05vvvmYqD8jcHgqYqNc\n" +"DNdZXdkRin9LevU8phObFq4DTXp08XggUx4Kk4AdsFKubQtJ8gHm3xlSKbZXX2m/\n" +"ZF0GRaZtVDQ3TRGh+OBLILt/2jT+BaFKGAyJ7al76F2nprECQQDJyLlteLDFBmrd\n" +"0kAjNBE50S5YskBCQeQACROfyTKW8lG1J57UBeYjXvbrDFBR4alIS9DEexGai9Gz\n" +"wxpgKg2nAkEAwqQmPstjHxvqGQRi41uXO026MLxY7dhEqs1aSw3tuT8v17pW3OEa\n" +"Qxv7JINePZ3+sNN+Ic+3RXBR0QuD7lSSKQJAZjVSF21GvMXfY7SX4D0DbLHUNAE2\n" +"I1mUz5/JXOpgwazETmpfPS4vwELd93kpRhBz2rbsbFmaNRoVgmSU+5jRiQJAZ1bV\n" +"g2NilgKxEGU2x3U6Xt8Oqo9lO6omEvUCKnUTsNWuZf/l3FGbKuQxO5qPr3Ex5tny\n" +"zqrEqBZRKgbOHfxCuQJAbJY5C3Nm5koemr031r00MY2YD1b6+hyKZyPdZ21HpyY8\n" +"z1kWShL0POjYPX/BnKE1FkpklWcKBb7wkK7dvAKkEQ==\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXQIBAAKBgQCyqMM2TfFGV5tVBTVabxLVln8146nDavIdR6q78DCUMh8Zfzkk\n" +"h9Lbl1NX4RU+AmrCZMPq21/EjIRxRQyRdgPYJVLdp96eGeYnEzmMkqvXiswXvDg/\n" +"tXqsjyJeYsoHMQWDTpCLfjYo4K1ol1sg8VIs4wQeq5og6QSdmhBoz7MyqQIDAQAB\n" +"AoGBAIJekey7nZeV8Bxva4ptSRIg+v0I/2VBUiG5nUX9NIW/uV/yrXERx/VDjKaw\n" +"8b5JJzxpKWnk4RJc83xwRYaT1qMYHiQfybxEI0K9SjhtaThAjtXkQGtZgLJILl3t\n" +"yh3LPTh1ocwafsKjU6eGYAe/DYn9/QwYHbtyaimcigu4etp9AkEA2DgC+HndoP1i\n" +"np26Lx+4TG0vAfrVYGSLT9FXwf2iBV3oJvdKqu6wr8ipb1SbshRPcOQd31/mCh6+\n" +"2BR+d4ddcwJBANOHrlBbGZdHnoEu6kKbPwwkc31IZYqyfSpkqm0Lb2oWZ9SInKfc\n" +"cz0qpH91p610XUpYmycaJr4K+N8jgrz86HMCQQCoqGBg1Ca2OpCf66bctWB8dTqS\n" +"z8d7rlIhC8npr1+f0hWRt5pN5Wx7YgoQpq3gZgllpPtMT7DQOhVh1fKkaDnTAkA4\n" +"XuskPPLX7t0dvhvtviOSH9CrLXTp/mD+wC7uumJpmij3aaSd01DelxOZaAhUYDNQ\n" +"UcafKAf1E0V5aaQ4qwljAkA9NVN6CtpzzcLrstTKxrx5P1Ylt/0UYQDo1lIaqwrT\n" +"aOFbXmOungiC9+p/4U7RbX0MEzjFDHCWlaHASviGVgta\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICWwIBAAKBgQDDt2V63APj3JSqaRgofUzhtB+prm0wII4uHyxfOxnpYIELOW5z\n" +"3UHmkr+B4D+Nif5jIp0i6W4OS4S+YHewKsDsXvXKRIW78KzOt6Le4JI9rSarNjy5\n" +"aJKksWQRALLCmxP/BdolaBFqF3fIPD5+Zxu8ESgxhkEQI4p7awUp3E730QIDAQAB\n" +"AoGAZktfAR4p8lkCYydW9yK2ommQ+xEuBK+fYL/uYz/yxSYpjIJSFsEYhrlA21Mo\n" +"JIRxr8MRuoOjgFk8YnztUeimuHpslDlZDaCBzjRjBRFCMepZNG9xqSEL0u7C+SH6\n" +"KU5f2x2P6PneBj6WaHZM+6Lf2xHlOoeuaVSUfq2Pk2VBF9kCQQDtawWWNwP0+xea\n" +"oCAQpanaLzYPjlqZfHJQ1AAI5eSkdf1qmlypIHwOtjAEa6XuEO/Or8RNkNy4nQdw\n" +"qhcQ7PXDAkEA0wjT6Z+Lrt67FnwPgoSvl4Nukcqw4OWHbBKhaQPsO9+oc3PAXLdD\n" +"SclUUqDF6NX1yONTV1KrPdz4zElmEua+2wJABm4inZnp2oW+cuqpU6oY+pbSwQMb\n" +"AxMyyWukgJkxYx7q+SsrHU2K7p8Sl9wOh28f/5oVGAC3aayfGfcRXtz8HwJAIqeO\n" +"dQzYGU1GF7kjquEzHIRewd4xEZ1fkaW1j9MvFd3ygZL+gbsud41yJWd1WHjaNbTu\n" +"2KYgrLX+vT1IX844hQJAbg0V7iHlttQqXL7yN09jIjQLprqVhDZCUHS9s9Dxe7fz\n" +"Ac0ZZD0D6EVNmSmBB71q7kLUWX/W/10d447TLnnfew==\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXgIBAAKBgQDhCAjPEockl4lqkvoIb5O3NJJG8NWD31c63e/cPWY6MX5nOM/q\n" +"avof2eWJxFOk0HQ2BRVwIgNex6kLxtsdw7XE0A5uZorTp9DbRCGMqUqHNhHH9ci2\n" +"mMPP9jptq3ieWg310bH4Tad8h3WE2npSCDBvxyV6EmuH2rlQW9ZlHNoiRQIDAQAB\n" +"AoGBAI4PgWggPTqng7PJF5mNvsYQpSutzE0VCL977nmuNUQVjMPjRLarVD4ZU+QW\n" +"EevhQQv9R5xjjJcgGqL5pchzjeKDm0/LA+AygnZoDMs2O68Neieqvr7cPqr5ALGs\n" +"WuZvSn+bRJTenvV9sUh2ii0/u3GQbL1v7GWDkIdD7itDbmRhAkEA8iijuEY+W67w\n" +"7JusjY2MQ2Cm6xxxR0YcnYPzT6UDm+Z7NNJwKscQ6AjayNmxmXGpbUdukzLzXf8y\n" +"fccI9t6iHQJBAO3kx9nZay0Ktl51QP5o2gwoqRIbnogGfR06KJOlzIPGR0aPn8cg\n" +"uKq2SiyjewEaSBM6S/4UlxYUmvc3VKnxCEkCQQDpTjg2YQ7RPGIIRA/iLV7Wx3bq\n" +"C/QjjCwjoi44LK6mdE9928WPoUzrkSRg4EQYpwZqL6kcDrmkdSuLPMipOGQNAkA3\n" +"KtzlujPOiDNuiEaAORSHyU4b8ue6p7aP9pK+Wq6oyGxzAo+NABuTCx78ZxT5Vnzs\n" +"aJKC44d+CV0+g0hQ+KJxAkEAqFYzNWIzTHX8DVDdK9BpUaBg1DFxIeP5Kk+/X3FF\n" +"5BafG08B6OiLf8qIGGsxLXNRjIE0GVp3Sy23FUKtUymP+A==\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXQIBAAKBgQDMDk01VwPxQq/BAwOBmfGUP/x5BQn+uxI0Aat6bdWuz/2CsjbS\n" +"CWD/YLCaPm+DpHp9RMwk4HONJaw4B2XOw3ELPx7y9DEgdC1wZ9wRkJmqr2IJZoZR\n" +"C7x43nNv+/IXTiRkkljCcMpoL1Tld+L2VbmWR29PdZwvspWRILkEZu1mNwIDAQAB\n" +"AoGANvFK3KfXSei4xfF3yjeXEmHAKx2uOUZJenNQpqBYPr+F9ODjXd5knZ59LqrM\n" +"/9cTnBMgHHXK5yBTpKppQSjikLeQ2BF04Ktff9oGqVcS9x/rKo0CREuxsEfawZOW\n" +"OzOWENp4YcDKGP1I/Ctr185QzStaWrXVQftxmYQ53T77ShECQQDnhabwtqW7rfe4\n" +"+MfkWEJ9Y2s6iMs3JWnwPOX9G9R39PiAD4vAghHJyHHttS9Ipxmvp0hThu0x7a4g\n" +"8BfUpqgjAkEA4aFAmzarWKigREAACVTYH2RHpXbuk05vF9WqfMPiEvQUd5a1q6vc\n" +"xkGZsE3v/TExLjPRZP4FeUNV5sD7THzA3QJBAJxPoRlNx3GCEAlDdfnWGPX9JI09\n" +"hC40RWUcSI7ttjJTI1+an1kWuBnLChhaRpU/tFjikTNLmmMmPHUihIRfDI8CQG7g\n" +"3WzpKr8A7vFbOilbxnF2yDaqAYfmTXW7DHMPl/OUetJh/5kDdhT/e9VGF5+nIvH/\n" +"iPFGW85Bpt8lCtmFnQkCQQDjpp9iy2qesE7KKX4Kv3++QfCJ2w3g7lwg4iyncoDd\n" +"JrM53p29HROM21R6eekvqeWIe9tEX754b+E/N60ZjpGm\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXgIBAAKBgQDdDn3H+Eu0AW5GKohqDBntw6ubnd3VaJwZGzZyga4J2kLg8peP\n" +"RAW6GDD6pcHzW+KZbFWHtRk70FSwvmyGcf+DY0r5tfyCHyDGmbJyPR0o6OVCgSFl\n" +"ccf4eDvbyszzMdlx3uL05ABIpCShoKtEUqvyIQla3Jon+QBwuVkizMzyVwIDAQAB\n" +"AoGACoKh4Fwh3VEkGRn0mnYw1Wk0Q5Xh8j+jDF6K3C7mQ3mpLGDca+dkDlEQIxq2\n" +"egeoYnsQJf+qT3m8TRsAtfO9nj7+7IX4BfCtdIi4RNcorbs5YMWtFyaywnM6SQjS\n" +"+1qf74aL4On9WRO2FtvnTMjFAAkiWNbQp7mWwTmB59i620ECQQDwde6/PwhUzvZh\n" +"dyslKJdna5RjkDQyDIuh0zD/tFZ0Iko7Luec8q6n52ev/n0OiTLGetUh8goePsPP\n" +"HVZHidNJAkEA61eMCmmu+GCAg2vJRtL5sDakAXsbP5M9Bf/QVHXtc4EVXHC6T2ld\n" +"bldOJriNbBThBuPNmlQbssn9FApkyWT4nwJBAIuHIv3+CUuMvBJaH8L0BsaP+g67\n" +"wk24Ud2Yujnl3rSMoR4uXV8IwqfS8quAs/gXTEs3QyzrUUuzh9NKZqIkK2ECQQCz\n" +"vivBEDKIlPvSZBJYO25kfXcJgoKvLb9fw5/TwjXXD/HGpnpFiI3JZnjT7gRlVhT/\n" +"9CDmC/MTvF3EXqPXhXy1AkEAo3a2me23Ljmub21jycSKaCk09dK85QTRRMe9c/hs\n" +"i+pcGi9ZZW0Mm7cyQo47oXjNurkkv0fEvXIobVTEXAGU7w==\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXAIBAAKBgQCv8R1IbfYnE3R3kNeezJ7m02XnyCBDDy0YfrQldQ+urdg1CFye\n" +"bO0iPniJb8fmV8NW7x6nUZTDznCg+igroKXtK/w0WYmJJiH4A7Oi5xNjAfRIPvJ/\n" +"J5GI8szS8rH8tp8pW1h8k/kNg2pnBjwQ2U9omhp95RGaHDQSRYzzH/fEFQIDAQAB\n" +"AoGAcy7+BcH/iZuB/xjzIIJDcUhqibCJ9n0D/+pLU85sYuZrCmUcBZe4M1gEn61v\n" +"iExilRJc1hthskL/l1POYql8lk+aqeeDuh38fWJj60TCV/sENiuXOsTmoFVA5pNn\n" +"lwlG8JlpBMsgr1fGqg1C/WLFfMmvXdKVGvpRqI06j7AYUa0CQQDfZ5rI+FhXBlxo\n" +"PR5CM1LB90DuHUMW+Kqoj0c9d2esXEQM7UqQ/9BiBQbL6Py7Z3VwCxibOqyz7+V7\n" +"2aGUMAKnAkEAyZy5Mu2tHs6YBBxPYam7huzMUYjddN7ixAZUyGwxQp9kTIF2NbSQ\n" +"yVDjKrco3s2lO4qj4pSumwVe3GGlsi6G4wJAOOS3pIqqZK84BUvbUtyjLMZ9AKbv\n" +"GQCG5ZpneB3ahyiQJAKiRL8BIJVLH87b3hYA8GHDCHUu2jwz4xCPd5+qbQJAV0TP\n" +"pYvb9AnZI25drhiaY7z8dA6aTYxs/A0Bhf/PEteLwtIHKRgP1BR/QG4n8slxTGSm\n" +"q91P9ypL9XkPECGzoQJBAIMvGEM7ZGevQHBjJ8HhU8IsgT4cYH/XEYb8jRy4F+Ui\n" +"jKxHPxLuFK4urAZunNUNrqhT0PxbB7hRjtHZrmFkrcc=\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXQIBAAKBgQDSpmV8ncLwc8gXzdFsZGPDtMO7C/IN9jKCIK13WIseMg1APlMt\n" +"PB5lMQ9fa3m9ZRU0L8HzRo+u/Xdos3yIBI38X2Avy0laGKnQxiOKaDT/5ZHeiBBh\n" +"nMZjP2WY5V1sgqNP9RD8enE6WaSvq1j0BM++mn9KEe//5+dWD8tboBKF4QIDAQAB\n" +"AoGBALgVoerdE1Z+WAY1XyaSNHz6o3H6ZnW9CTaex/jb7/dbVikmThnhx842qXCB\n" +"w8m3ZGhOs/edWkNaTde5wsI6+LhVGco/PWxN4v61jokxUU+5KvUvGacXhXIjzKwG\n" +"DrNCYmle62QCI1z4+TLQW/Lq+jw2Wzk70NWEvoP58gt5SJoBAkEA9wubRKRs49LW\n" +"5JNQZ9hjc+mAfP9YK/sMe4jkdloMMWXjSMlF3Z4mI9XQSpfbBqwWIBXsjU/15LIS\n" +"ftmujZsMKQJBANpJEZI7UFoRdSP7AlM0YJuXWnVGyn/K+VIeEso5AlZdKXCTpxqp\n" +"9blWq0UVC6jLesZ5UNPuBiAnrBaVwDA8YvkCQF+FQVfdK607TJO80g4VAP9EfcXX\n" +"BUScIUtytsN8NdKzzpnKGRWDnMOmXI87ABkoWLW3RGuvSyhOIhCiInfmR2ECQASc\n" +"FmroJcJBLCAeZOYs7P1cLOTdIdmhB7LcP7lVit8YCJAADj9Z536KfgNvdleSNH2M\n" +"glB3blmvfMrdTrm2DMECQQDj6GJ/Tc2rCsq534xknasVjrgtJMQFxmQCTVgBx9pc\n" +"gTflJAHAmNDvstacVqeObLCF2ZIvya8fSXGbDOJYeGDv\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXAIBAAKBgQDGgUJAm7vf/3focNGwzv4TkzYF2XwpAirnb61dyxvfug1zKv2k\n" +"AUg3qACiurR7JrI+kAbmxEnNaKV7ts7uO763wP9KE8YAuFZsp7NFA295rEZhw38T\n" +"rUlWHMCeaZ3mqW2q8gA14C/ZJCG4gS91SIHLjNGsbHwr2Jvri2ItwIP8FQIDAQAB\n" +"AoGAONceb32oiHWQkkBr6uL6ogRPPdGO2fdC7c5uqCLWsnOGEmpHAsVTNoym0fIA\n" +"aBsmgv+e2klukKDccdZg3prA+z7lHcc2a4bIFguF6ei80hLIis/dds66fFXofCzy\n" +"DMlkncSbJwIvQHG9gblxp9qSKElZF7XjABZEImarfUlakGkCQQD//msGy5N0ZhMI\n" +"yGMXkwXRJXfmRrIrOqHx6u1eUp4OuqDW+hBz4KCHnWfuRJkNGQIammSf18jPasP5\n" +"YHyr/LifAkEAxoJ8R8Vusexo9ZjuU44qXCSvJQ26UBV7mn6TGEAn2DRK1RWKDaHv\n" +"j2vnRjt3CO9WPDQL7SB/1HNAy+dIMPyqywJBAIB6tESIz8zPniX+TJ18UKMTZwXP\n" +"3YQMvVKpUdDRLjq+OBMtFizSRD9MJOlUzGvibUfkzTPcHRDcyNbUMj4vbIkCQBx4\n" +"6sqAjvgGKKfRX52sbnb47AYsieSisC/gp8h6qzxfg7w8cqix6WJw36M7ND+b1Iqe\n" +"DHfeiXc3cLvOWJRuKTECQCEYkujtSjXWb26xaESFWGtUI/nEvCyqYPQAFBpaGzQ3\n" +"tiTDeKHzypesWYoTxOiNQWCQMLrFGuUbDpYOuDOVNjw=\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXQIBAAKBgQCcwSAfytnspSSDX/sKmCPOMnpuCYeWA4wbz1wLyb63a8/KXhhG\n" +"6o2W0kt3x1vnGZkeWwZOeBFUqwoc+xHhoNcZFsMOyqbqA3UMZW5cx27MsexRTQHs\n" +"Go1newu/E+8NNCohY51G7z1Hdo0L6mi/Tldh7puuGsMwKqNG/Vvo/GQDgwIDAQAB\n" +"AoGBAIUdpBAbjXDe1OET0vYuOMnUKA/l29RS8tpy/zGrg1/0GCM8QNWIPfEEaL4w\n" +"+CSKonMazYI5iE4kaZQuygKXOdFqKxX8nrGK2hR0DIEUHhhiqyGMUKrf4ELkAJzK\n" +"tHtcO64OFEU2EGa72wCmyk2MhqhLxWxA7E00x24uvW6pen6xAkEAzHhbzlRgLZ+K\n" +"QuXmQHEqkGaS2Ccf6c9TA5Bf5S2/5zBl+OqVyJJQH0yrbPYR6Nn1NeSv3R4IDJYg\n" +"fSZLaVzWHQJBAMRCU6QtTnZoQ97pLvXCSKRYKJF+CnE3zDFTyoJrpK0W1FSnb1EE\n" +"DWjjdSdMLynf/InX+VOaLk3Gxwjme4NKjh8CQQCg2b4/HplayrsVzY3I/D2jw02Z\n" +"xY2RfYusrhMCU284DBbsLn8OfiuRs9rXqOyF5ZDFiNXgeROT8zYzvcBtbp7xAkBU\n" +"ZET9IvJLXjhZISItUXbVHIeNUIqC9sBaMbKx9EGioF97a2gliT2O7cgRtuPM+ODq\n" +"ETHILlNc5G3vuNRBt4x3AkBV98Y1SZA3TQlUVTsjGraxkFTfU1IlomiOdOwTQ+xZ\n" +"x+JxhhgZwZ+kgI3PidEufFCTZJ3WO6Wk9gk18Bx7CLjm\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXgIBAAKBgQDq/K7wNW3fcTbaRTjNZlM4W0G7tKeO+X0bca4+9uin3ML3ogNJ\n" +"6qT/B0QAZB6Vyi9kKa3E8plQkjmPuX8Q27zj2QjEuDZ12RGFnikeOosUhOYiDh3Z\n" +"T9CHnr6stozzgk79Xd6VI7bqRcgRwbY0uc9QVr6vwddyIfSploSpVcgspQIDAQAB\n" +"AoGBAJfUpo/sZc6uzxtfCKGmkPTj+ef3hSBbUZuu60AhtxfnC06HrwpOg0eJAUYj\n" +"aqOsHMziJTYQ7kDiCjE0UMaqxDNS5hueumznq2xM2mSN0nYoktU00kpANVkW4VPA\n" +"33TB16DyqlKq2/21Rs1g8/8+IKkKDbRLTC//1WqNHASQVoGNAkEA/+z4hxTVXZkr\n" +"9hz29tAHKURlqzxUEKLnS0eL+XGJRNfGJ+65eXL+gFiIbTnpVeidL1+lKWkZyYzl\n" +"75cNRdUHhwJBAOsOJ9mUOqTbLW5tzh18ewZGOa1JcxhOvf2E1d56N8tDK6lvoqkF\n" +"oUUb8kIweDxPLCVLCl8qFrbjn619fxDInXMCQAfEZGKNIlCd5nSoumIRPDZnagKB\n" +"aTe8CfMB7+CZLoZVWiE6IIzsDYdNqI5QFKHT1nlqmLOiCfNRAGV+GxwEdB8CQQDE\n" +"sHu4HclU2fMSTOAE3H01qt3om2WsGXfyBI3SNQMrG3IVvkymkwd4BQKbUGPMU5Pl\n" +"QP3U1CtdruuXCUSijrzxAkEAoqYub6+0zM8fakSQZcZ01TG9Fuo2xVFDCQsvqR3m\n" +"ZhRT/oinIvOxSh4fQs40bmt1RBmc2L1Is6YB2NTVQEBZDQ==\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICWwIBAAKBgQCrf0rPvHYaGYQrc1ciRwaONs8TUvSVmUU98HMYXoFEkBL4CAGH\n" +"4oNHFk8kXHEOsBED0eccSYegWhqKHSz7PbjmJaXloExWrtx5ea3Twf8VTgcfDWQP\n" +"0TzD3G1TYjAFPQ1/LAZCpQFmwpMmTGGxegUhOzkpEWXdLVEVc9Uw4C4L2QIDAQAB\n" +"AoGAZXAJZA5pHM7y6nBynYe9TOkGWru6h7H8zsImkcd0VoWRcrvpi+JjG+0KKsuy\n" +"46kop0XEmWq0mhgxknfnX0QG1MKTqGMIUGN4qCaezOabIpCOdA4d/pr/mWoNgOWw\n" +"9Kc/tNCrKxPKsQMAlWP6ktHN30XRSlHgAjSeUVUiNHztvTECQQDUNin2nyIvj8ZA\n" +"QAsFW9qW+TiTkeUK6yiZ9Gvgf20gwZRWOe5/xnMxVvtN6v7Av1ew/l4VhBoj/w5g\n" +"ydIZk+2LAkEAzuJwdt+ccllG19qmEcbo9XFafgi2PvlEjPJmT1rHV2ns/7HIMu27\n" +"PJY36GgExSfFco6VmicaoOt+RKg+5acgqwJBAKQxAEjcGWQ5VsgRhTVxO3DChX7Q\n" +"TColhrWPwwPhM/s7K92HVzwvvKL5TNmdr9xMb7n3Ja56FouxZVuH6/J0XT8CQAat\n" +"Mhnz/3WFQg8HRGLAe5YoMVZt64u+uaKe1ARtlo9QoNBjqWVTXL6IzocWjEjcjrey\n" +"uEtARdC5qNqIX3dD3H8CP3pVCPvpHOTxkUaktmLYowSA1HSfO9wkE6bMCHhkLwXF\n" +"yTIJ+N7c5u5YN1B6hhVqpKbdnSv+K0MQ0xbfwOWNMw==\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXAIBAAKBgQDGQmrKfO3WovoXkOTSh/shO9qjbX4izhg4pccVU3Tp45v/dgAE\n" +"uDUuaa/clToyH5AhOtuazO/asC3ZNajg1ia5VPzmQU3gtqiIZIEXFaOovPlOrXru\n" +"wyQnxaGORndJwfDXicG6bUwI+PDpNq8c4VOTujReeF0r74qMSc7TQLVlUQIDAQAB\n" +"AoGAakR/aTm9YibJVohbnl00xoOGlcLCsXU2lmaFZ3DsYdGWdD+TkvQJzW7ozJtQ\n" +"Lj2sy6L4wujGR7nXWW3hr2IaLpoc1UoyJpieAZM5os6bMN+N4MCqdcZMlazMtSWV\n" +"UDO7O7xQGFpcvvZmnfKCyluFaJ5K/tWxP+2TnS1/m0BDRIECQQD5DYvToA0eKBt+\n" +"7K4eEI8pzDot9NlcL21D86kNgpmuY4pifALU7GvXr299JpFFiYa2A1JVRfpQaoI3\n" +"hZzz0ze1AkEAy8opWJP+T2q4reD5Qq5UjjrHUXFID23KeJEjh5YF40/bHqyVpWVR\n" +"UMntNgAzs+13vRij48Zn6I8GRhStaQ3ArQJASPyFS8GN1paeaDXoWPs1WWR2cF1f\n" +"DbsAZHeVxVXOv+J//ZimI8wdVpodLCoPTLee+NxEVqUpVEPCYY8QjgwKOQJAATmj\n" +"6f5pxvxzQ8hYd0gpBfngfOLbdgxI7VSiDAyg2G8AeDy9YZMsW/n6zRpPNUO2NpLR\n" +"WWs18LX7aaxyJnGIuQJBAPPfy9pd4XEFsRBIIe3N23Gua1XkS/407RJtAGm73Vrt\n" +"QhtWh3i6D5gfpEApMoaE8aaQQ7H0z+0Uh1t8SWesy10=\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICWwIBAAKBgQCc/M/X8etUqrxnmH3PyuAYLIPZhwNySch8qz9NB47izYjxzuBG\n" +"GSls6H7WeKIrB8UJY1gW8TLkdOLcrI/0hTANNHEPaueOE0xdABFj7tAaiiGPIM25\n" +"N0wc76me0ZAMYJrZTHk8JZK153y9wInYBwVZreXCVSVf11RuVwe+iFQa5QIDAQAB\n" +"AoGAQC4XJtivdhDLL6snHFF7pkZkrQTGgu3pOhakrXA+mTigGQOTqvTUe8LdP/9X\n" +"hTIK+tiTheWcAcxLhx5BSB0/VDKjYhS0ROpTc33Iq9KalOQaTJbBYGA4eagpQjwU\n" +"jGwr9u2sUsM9WI/Jg0VvLSKhfnNwYIUzLpK3BbWb2qAdh+0CQQDQ2s/8DlibFSBK\n" +"UsFK7lLpV8UgMk9CkaNM2BPzI8Hsjpp6s3pULVRd36m4YTSg15EEHv7bZ1N/+krX\n" +"mXb9xUULAkEAwGy5wHsUSjTK+kntkNXjlCU/+9R+HFpzg9Bwm/PqXTBwEWeU24hV\n" +"iRjPvqPtWFZrWi/nfcviuMaqtdliw1I1zwJAZ2mQxhtMYC2LuYFUWAe9YfClmJWQ\n" +"jUOTef8bka5I3RqW/t5TWc7AEWMnpDXtWx6hnUrDolt9Cschu7MvKeQ9lQJAL18U\n" +"46PpPNN+XNuyVoOxgRkihVasrUI/SeYYsuv7eHGiRUagyOLpW9T139LvbV3pE8zT\n" +"So7VA/Q0towL2lX01QJAGcoBNNouSpum9+5NvGQK1XXsZweawE+pFR2BE5XcjG+n\n" +"FnaLEUBX7nTxhTU2cSQET1PKRNp568a281NEna0nxw==\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXAIBAAKBgQDFOqqGG/VtIScxayZYZ+BT+hcs5W1bD5qRxunbG9O36UVT18UE\n" +"CWw9HUf0Q5sDMGvVmBxwZ4GjbR5FDPfhIXaRCzobnejJXq/0k+O5NAVkcSPtJvhK\n" +"AaUqBrWA41vnjKOtJudTsZLfufKafzYwVonze7fXGyVsBRjVwHNS4iqq2QIDAQAB\n" +"AoGAJCoStI6R3RXUKvKb0GATuTJFZ50WBTmCPTK9FMkwdCuY47vPy2Ky7y3cUMTI\n" +"urf5PewrYs0H72CFyWGMXkKVi8aOYshsATEXMfGSqOcqXn+UDssRzvabZFlpnAUa\n" +"WDVt/iN092AdakXNna7/DxrLisDpq8HHJfjtlWGPfkXRg4ECQQDpHeKimTvwJcPc\n" +"iDa6Qb/n9gwLeRckfzhYtfX1luJYLIOHh+J9vjQN75thenBLQB/B6qlKtOn9ejxg\n" +"5z+3zIOpAkEA2JbxXVTCOA802p9khvHxDtLHdKi3w/BjjJiC7Mgqo69ZI+s3PB9E\n" +"F2HJA69kZqpGqvybWHDapjWsq7rcMlxrsQJBAME2yvR3y00VEAyGPc4M1vF8ZqlP\n" +"uRW/+ETWtEDUyU/JvU6lGt2bu2tdkEyv/cjxIiFIzP4litdT7B1pLc+6S9kCQBwE\n" +"usiWFGHoJbA6emiyl7qRLdg7kzo3uMkRWa6D3nA6WM+6t/SBHu/faH+fit91G5s2\n" +"/mmcf8yMmP/GNoIVTqECQFl4Pt6yGiz/YVoYSp35ljY5n3JB6T8o2pOmIrRLuPmT\n" +"6kgyygtJBAmx5nnQoeG8n08tl9QakWznKzkNJ0DIFKI=\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXQIBAAKBgQDCaOqJ0lsSAEBcnNB6X7BvVcEcol+evi/nJsPe0uT1SbtW50Ch\n" +"vYOHwK6aQR2C5x9VSs47cLynTL7tNt5d8oeryF3NpI8VTPLImDJCcvUZhS7p4bxn\n" +"JO+Wm+D/e3TWfyjreuWtdL+Mfimw2gzwWuBEtmj51GzQ89eYm7fh11SB6QIDAQAB\n" +"AoGAWaakMbZNxPlUtOCjyysBY/Y5vYira7rswD3CKak7aFn+CE9QIMYSN7IFUqEg\n" +"iNMoQd7jR8nvVX8wtJeO5+gF48W13C3n8FZSrW7c5N3bmfMIgo0xa/TGfeXHP98o\n" +"7vhH0I58j3ZZt0Q+3wTm7t7WPE/nJzgrCk30TqmoaEmstTkCQQDtV6YZ6juEK2Lp\n" +"LGUiqohcS/WJxvFrF5+LNpk86Xdgomf6FphZlkq42KYkvl7qibKDcfDqLKTbHHle\n" +"vQQeCgZ7AkEA0bFHi7F8o4iHtKleBvt4QCj1neA0q3CRDypCI5EqFSrNpxY4Krhh\n" +"WYSVX+xT00QYaCpKKWfYQztCw7Anylv96wJACl86Mwe5ch0zRV1bThiFvQLUyCCZ\n" +"jESMBFlueOr6/I4cXSF/puqaeVl+aTyoiTdbRcNE8/bffXPRGgLIm0d04QJBAJSY\n" +"lmTN789Lby99Xh6AkaSV4ghw26Ip8QHYJmph8npxjK69Niw/4Oy44cnKBVUPSmR2\n" +"o3tYFY7/Lb7S1D+4lOUCQQDbMQUGVsZT+ZjuOG1bAjIuXoAOfOd3mgH5VgQHjSgJ\n" +"ourZtlJ4OUpNrq9IfWqPkM+zSE8+0Dk8/9MS5ngBA/SJ\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXQIBAAKBgQDNbHjwg+7tVNr9erMLowXRnIcttp4pUJbr3B7Jo/u+kD/Yo3F3\n" +"4rIKhHpJl1uEHP1QmvAD+4ApFFI2hNG54xYI8dGflxL5HOs5xxyOPpkrwzQ8Qvnv\n" +"LPg7Gf6PAW9zF4McG4wK0TkrV28G6NhqcPs5VFY6UyvfZ0fEdWAeoWTIfQIDAQAB\n" +"AoGBAKOmkMp7MLLd8QAS6eSRYSdWHdLrMyES1MjduaFGBF4SKOr7en/Zl6ENXSaX\n" +"cA7V0XCPnjpt9/HCAKTyNupx4LCeFWiqdu8VGXhlzX8bdb896OSR2brKbxgRY5tF\n" +"36uL8akrZdrYgocykQCxmRARMB7/rHwDusiamjL6RUZ3+c45AkEA6UPTVmKZQRMr\n" +"A7Qgg5nXrXo9117Lpqf3FdZ1wdni9V59Ptf5xrx9oGZNZzctJPXSAH4M4cumSJrV\n" +"sZ1V8qE7AwJBAOFx+5luLrVKrdlG7MyOhTAdhKYUvKIvL4wvVSY6y+L2nNEx/cTx\n" +"KYbxGC+H1RJbkCS09rYir3VfDRWQ3W1c1n8CQH+X4hn2hO3blkPIW6CgniD+JKWR\n" +"7MOUTMtdK7yFemfM76VYbgAPSohabSxwOfllnSE30cQQqTw9tXYaIdE98BECQG+M\n" +"QWxSS0QillB6unIgVqBPCrJOcmNhK4qWZPBMiVNcqI0Nyj2nAeAl7MyfzfqOWY0A\n" +"CU5nbR+LD2NLUXRqSisCQQCN3IGv1WOWInmA5xhU6vCFDX5u48Dcji7VLJO/Nv/i\n" +"b/zHKAgjHk5Js7bi5ZWEGaUgA4Jt6cKmGdERheqTMKxx\n" +"-----END RSA PRIVATE KEY-----\n" +}; + +static const char *PREGEN_KEYS_2048[] = { +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIIEpAIBAAKCAQEAoksI1qIuIaFCqT4QbgDvOQCmr9Z9F0E7ku+U5Ep/5dWNANqB\n" +"bSzAOq0+cxiisfF+H4desoqiWDUwlOwXH74qD3ZsbChhvFUD78cQBWQkF+whLVHb\n" +"296QmF0LZqosqz9HMS9CdoMUc1brZb78Hb25QIOOjrg25KYHLZHaqcet1wfhHow6\n" +"Uehc6QTuWgOWFhJnfiXzYgen2o8lnLixxZozhk7Lm7Aix9ur2ckXdQ2Wgny4xw70\n" +"JW84Hapnd8oFUD98XXrExk4VFuIcA8qo7r7y18II6wx4Cw1suKru6bhW65cM/y51\n" +"KC4lB7VkvuoJCelRFdM1PfKZLv2tJP63oAqJrQIDAQABAoIBAQCWc38PEqw3avqU\n" +"UMAEaoNa0bq1Gd8/Nq8WqVnbRSFKHO2pk+cWIb1W6BITuwvgcGKesezdEV4s7apK\n" +"9I7/U1hEm2Ep50mrwRh0KZM1nD9Fmharn851Bt//D4qpMytT2caS1yADI8NKpZJ1\n" +"8VZh7+cT4qG+txHUaAIRgbw3VrBWvTIMu6SOSOZm+e3eOr5UU3du1KvjdJHJ2c2k\n" +"TceHvUdKxV7OYt+BBSN1oBOhs3ajUSRge1v3twRDg3cmbwG0DeXvwHNhGUTcF8IH\n" +"JO1RF5njbkFvyqdAi3ltjU41zYd4OMuPtrwzFOtxUjKT62Soz109HUXXE2CGKFPZ\n" +"PVi5/BIhAoGBANN1xqS5BgHszIB0nXbw5ImYpTRmyhO0KsTblBT9+8Q/B7BCK7bM\n" +"zl+dOPeyvEadSwE7RSMMt6CAlTakWIf3Quw/VZajvXy9C9/LHf52pEKXjxMFMPKE\n" +"aGLHpQnwMtDi8/H8AEAXxI3hpxB2KVR7sAYHWihSGjRJ6oPGvEmKEkb5AoGBAMR6\n" +"G2PKz0xk1vFrjfjSY+y13gH/t7xHaXUggjggUSGKaknQh2BDUllXjadeI0fi1eLW\n" +"r98ZImZZgntAgjaIZ4bAlooTDk4gRHaz9jI+z8lsRwOKnWdiigM7txiXZTMVwMqj\n" +"o5mMNGMA+A+ACkTViRHmkDI7S/9FqAvnbOqVwgFVAoGBALUcY6WDvwx5B3Jh7tgH\n" +"XIYpEh3+h8c2gYcX1g3gtvkPTwN8uToY0gz8eOVV1YHZiHsmi4GIi+HRH3usaRMT\n" +"COOVHzYlSc8Dj57+tdLTRL6wVl9hC9o647ju64DGlI9qQquYPZKniLZIdbFYsu9j\n" +"/JA9Tc/I+h6czFpPJccKlbrpAoGAAPWXrKUQ3g6f/g3IY66jTkSVEO1uuDyhBzFh\n" +"cWS3ALLsUe/yuUWa4VTMHEUZZwB0iucBdNVqlZVaTb/C4wFHgCDwmzv8leUScIHw\n" +"cc5ctV8R+bJzkk2o3tsrybLzi4xPpK2n3tgQaWtXyruVUUC5qpy1l4kylcyBRY2b\n" +"uomAqQECgYAiCNWtuWIDlRBcvtIB+kHguzcoFT3vTCCNhalTEn0zi/tbi+voQgVJ\n" +"SDJNptZv+6vRwQ/HfcQtljKIPO6hUZPYaFWRNhgbh7Ay85lRXYXQOottE8ayReBk\n" +"zZb0fl853Qah4DPsaOugAvhjjKeBmKg6bFWO1z6hj18I3UpDf2YnVQ==\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIIEpQIBAAKCAQEAssO0r37mSJNAkc/ISwXBsu9JjyLeWlsHPAhylQGkSAdp2rjz\n" +"E6AT0Eh3wrocNO31I4pvHReAuh1QedGY6T1cQwO/WAAhQtRCBQDK12qWRgfbC11y\n" +"Xu7zNYPd1Z7YIRy+FxhbL5f+lv3rEUv0HUG5c3CWhLtbANKg+jOieIDzA4Yp1s55\n" +"ynodQBUkTZrwQiT0P8yDSjiasf+clgJRfA1k2XK12KSAMRgyDuPTE4OtBxBvUM3L\n" +"Zvxs81PsmcOuAG4DLaFTg2a/QkCjt2VC1SYYuh/LVxpL41FFh3eMoK5g5deHkgRe\n" +"tlywKjAHIDJu/qgNzNgNW7ymwn2CfBvry9h0/wIDAQABAoIBAEMZ4wDdCWPEokAZ\n" +"Vn2Ss5qO53WrCPuxn42RPjFgZGIFJl7LfbKoK8fK6+lUIrJbf+DPXdX1tIQn7MVN\n" +"P7CNL8yX44MMyW9kbUOjgIBLqgyvdjFV6lBoMTKtRN+iuE31lATnR5Md4pqaxVnA\n" +"wOkaepoycM1x5j7w0SwZparF/HIdkYv0y/MysqT9ByupPA4Fqp/iRSrosHXahNtI\n" +"KZYj1TyERYtuDXq91P4dr/pWq3FmDNI8O3upblkL0YouvG/ZlFLdiNy77XbAyWcX\n" +"ps3YDddM+vECnXO3+sa3ZxgBYvXJdWrrIzM5A+jCkDRZQGsFAzK5I5/S7C2ljt6i\n" +"SmzqvMECgYEA16bGy2XTi6KBPb8aev/OBgK9XuGLwUqK1m15mS9Y2qPHmuc22qaZ\n" +"hw6zginPFrxAEtQWKanhZy4aVqlLkDPLwRnyeuMo1EZAc5B1gZ5ViSAKxBq99hA9\n" +"eqyakdb+IUQsEnRDxSc2gqUQ0EagksUyw5wGG5Q/CVEALmS/r1SU3KUCgYEA1DYf\n" +"6JYdzuRtule3vYeWXKf8sOJpdplgWV7tvLrKkQhdE564uwMCYB23HvYfwWqEdDYG\n" +"fsYg/ur/stk9MDZ3wZKffTEM8V3sX1t1JXnC3ogSAgMGhLZ3ILOLqkoO4BEZJnsS\n" +"dMdiNijlAtQkqs/BO/UVUAKysCtKP3v/+1775dMCgYEAvLjGFjApfnSbV/cK7IM6\n" +"wEXbhdIqZOCgOeEaXjVyM/zKbMRVW+oaR3hVHd8KzSG3jQKv1oxFpu9Qu3ByoWLC\n" +"uF3Ft0debs6ADuJoAyQWROeWpGGmxlUWCGpO5rxYL7KiQxAeUsXrTU+5NBvq4CbV\n" +"MxwyuCX3OGb7mp4upfiGQcUCgYEAuhVsDYv1P4LXJVvd5viKRV2ZG5KuYC1Ga5fu\n" +"aFxzXJI07At2eaa94oKsHR494mEBHNZzA5/BN0fiSHZuTWS1xqxH5oOokc6Gg2ez\n" +"ZdVLp88x20nD4YQPGkHW6tBeEuVrZG7vVC+yU0Ow7bYRISdkjqrusWZsQkbzqI+X\n" +"fFliEbkCgYEAu8x+47M1ordbI7NmbBGyiyP0r7nMRCZ+KEvGeCNYracWmsnCNnfV\n" +"zR2UzmwtSainw3Ho8Jv/rWDC8RIDauyBRYEi2VqOnUzT2ca0iymQyLeBCudAQuio\n" +"drOu4JU8RzZ3Ad6V3DNFnaqmX/7GA9Pa2GI8NJMyb8p1GAGv7Gi8nxc=\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIIEowIBAAKCAQEAt01S8JuEwWy/Hzb90yO2O7oGWq3GfvfDpFOF4OQnwG3kQ/BP\n" +"4MoPDCYHdqb3iI9aD3vykZA6Q8zpdfGwjm4+bHrgRdiSmZWv8NvRwuQ5Ji9xbiGn\n" +"hA1XwqH9hvgFTiy6tRvirWSJ7kzH3Q/bEGpCbHUQkwMog4v6yCNKNrjlwjN++eCi\n" +"gFK/0RMOJMLOs8BD3zY+lKjd/pd8LBRujkMyUF5SryeRueAFjD2sq4OXq8DPABGt\n" +"zdR6vbTcsi4JwP1Q6y4x0/LIWEprzzewNU63I5E2zj0WnoRGAIM4aF+VuqcHjWUx\n" +"VWnyLZldSen6lScZ4xj4seitiDbSFvtFkDF6VwIDAQABAoIBAGTP9im2ntDyyjqU\n" +"uA0DuxomOZBtupniEouyFBOX5/UBe2WSKZxsBNKdp8UuFz3X+aRCeyprtF/NtyjT\n" +"AFOVdmebPPWtIxOtK9LAUyFo+7VwqmXzxHnwDLBS/2jXx7MzDozFBWpvvRx+xf1i\n" +"1wy0JEwaJj90oTeYKRkhr5NhJZwkX8zCNYaemBd3kHB3aGWGJasI1Y81UezeRKCn\n" +"hSbn2CrWalI7pyJ4lsavM11nIq1Eu2ZthJiNCMghbYrHoBHd+iVWiCYchP2rNEWV\n" +"sdHtaVHtQ9zdZ43bao3OzPu7lAjd6UAbxsuhUe+a2YdDz/+Up+6+BvQf1FCfYIjW\n" +"KFUdCoECgYEA4t5O+u0V9gkMUhKsevYb0zgc7O/mo8ivN+V++EpAtL0mhiwxeO8p\n" +"oef0szLyhdULQeLN9pJQDCeAbkGdwIe3L+AKU8o8BFGEWLFysZjMg9In/UTrp5MN\n" +"mMDy2SRKKu5BqsvdYH302xpZfHq1T2cMNDWE8lrZffduH06Cgq/XEtECgYEAztbj\n" +"bhFneADnrvk609VnOQvoQEjySeCQKFQFRRI6k/FguqMisL2IRXnMaWammosdeCAg\n" +"m7eZchnszHIst9cwZUKXUFqmAqeDuWSNdTI7uKZH6nT/A6IDlgdjaHsqhvpK0Ac9\n" +"ngycdHONitOZh0ZG74pdWjf828Dwzf+CuYjl9KcCgYEAmIvI6ZqvkJ8m5Kzfw1Jn\n" +"BVCOypbJK8oOX3R2Orea6KzjEYb3wQx3nwFcHX6danYFOskpmqlpH7MT/Y8rZsEa\n" +"4RsxdoPedTzm08iFiXtn0R9nejp0hlov402iPXXUVSedih3IflBTa1w9XaEY9wog\n" +"P57ZBSknYzcTmgNtaDiaUnECgYA5sWauhNw/dMEq5QmrnJK2LsQRakdqo+CR3x25\n" +"LmR4b5Nze51pfvRLrLV/kMpXwQXvQ8bUqFl8og6S2CXxAWzWUcSy/RXhF6h+RbXP\n" +"Qru1vWvB0fBvqvklF9p6giBSle3YKKzfMNVTBggs+OiR+uA+YHG5gHRfN2nzi5mC\n" +"9tRtcQKBgBnDSi4lRCjRe9pPnyAYaa4iyBUGhjPysScSLY9orel89+qmTBQ/Py6J\n" +"0+sefL4ZJaOsuaR2mSSPP/lbSkF9DMFs4tHbBqY+WkVNYLshAkauHwqv26HTVCSd\n" +"QKzeb7uZw9lNaRIzDvy/3wfCLvXfdDozPFrOUgkyaBN5pJSA/4sv\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIIEogIBAAKCAQEA9qtiDoJWqU/eSlpj381eG6UcDzfMguFh/q4e4s7QVdRYj5J0\n" +"Msv0PCkti8JHuvQUyncRpOPccBkhNbVjNbjIgw1pHaIZNdVotUDhP0kseRyJ6z3M\n" +"qbZ5qKn+0mHjVjPNItVDDe6tebYMT1BZpVyRrCOqY2v5z1ecLC+ReygmHgDpzg+L\n" +"0rWfIxGT10IPZ8pAlcdEn6xt5aEhi7mPCX/xwqfQChPIJz6zVLEC8UaPtvDBohPR\n" +"6NQTBTeZZAAtzrQ7+oNxfz1v6Fz6RwMei7Q+qOBnMiwpQmbcDBKABM2RnXSpD0LA\n" +"1GR7/+CiV1HQoShWVvEwrSIlM6jVAJo6iqF6WQIDAQABAoIBAHqwcdxPnfUm4aTP\n" +"4r9NcZKEhDlZgqJSoiA/0OL1BRC7xrTanmspoLhPrvTF1FG715+Aq8j9AQbMqQUC\n" +"zG7LEwiEIhV4K9vn4uXMeHy206UFud/E5EhBl695pmJUB/Q3XcAGnQyP+77++o50\n" +"o7IpIdeiAbzj1uP3aplbq5u7M4JV7fUZWA/368G4HolqFTxcAfBJ05GXlp97BBwY\n" +"AnY3/pNrKMz0NiPf3nsJHYWK18up0JCLPL3tomc94wuNZ66spIazHIL9aaKY0q3V\n" +"LkBrelndfYM1m4xRTnSOy6STu0qKTPOpX0C8XBLYs6uiXjRsChqSYwndCCeASaH3\n" +"LGNIcbUCgYEA/m4qvt8tdT4wEvnE+QUxEELmBtT4UFa3NnQISrzNlhNeI0Zd2xlp\n" +"SG0/pcw83mG2uX+V5xSaWL5LYfLBkvy83Y0yIWgYbbIkyyCOUZnTpwaDGU/FjWip\n" +"3TfXf5qpAgiez94sV+MsFpKfG05yxJh5u+3sIyGTVUAxp0HPx4LVgbMCgYEA+DD1\n" +"fu6ttpuV1UMrsFdjuk6gBvSbyJ9OilY2jT+yE7hSRc/yP3O9ikuR74tNlVrWTnO2\n" +"0kcYbyLJXE2cGUC2q5e4r8TDGiozNfQ7/OC2M3XaJ+xJk4zMf/8PuDDpWr+18ZXA\n" +"Pf+ibXWTFvZ6ZeUmpbrrfCrXdvmIZnwVuOI0FcMCgYAZn26emksxq3mb75tumJ9A\n" +"S/xuY7Q+Iv2Adl7/Z9QscPbiBowdLIn1yUrHn7Hhk2WbeMXX57NDjKZ6zr+/1cQP\n" +"a9DInHsZUP9zlWu/vAYcpAM/4VC71PaGWMFTEHhExCl6NZ2xnCcsfseXMGdOdSyN\n" +"SICnaRI1W6mkdnQ+W2a1EQKBgGEKA3KVr6XuPy8bDEHuaTe29irCCQbwAq1j+ABS\n" +"HzZGoyRYocbdYgZoda7LMJJs6c3SwHCHC66oU0KbtaTKAKImuDdBH2djiJJX4/yD\n" +"f7mvIpTpdfsS2gJRn7vMo/CvdFv4ySl0gfV6OwCHbmPYrLuv0dLCjWwfNI2dhoC7\n" +"MNIxAoGAIPSIG4BrShzbeX4c2L18iwIg+NlOcUbtl0Ccr1t6uLGI+ge/6I6T/5XH\n" +"DPKqYIf0IRYV8suxpfQNKiz/C0NPffA1d1M2hvuAg2v09o2cSwvdcQwdmakKZ5bl\n" +"sdCuYKdCIwomEUOz/4XgQrJl4XDUqxftJT6/egAjWvcIYvfNCsY=\n" +"-----END RSA PRIVATE KEY-----\n", + +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIIEowIBAAKCAQEA1yHZMsgRLckL+v6rgpGq9qmxVBNDxeuul1V/QlFyOlcAk5n/\n" +"uduTalSqGQhc4NEePMxq6nFui4ucpkZOozmcEnhV0N9jld9IB9rLGt4erdg7RKl9\n" +"+gQ+zTn69j69U36E2I47H4dM69uxeSOyWP2Odxpw+biisa3o8mMz1zCmuj4GMDtG\n" +"DlnSpthFzgQR6N1pbvxLXrWg5F16GqFiJOD7kXDfy4/l6kB/mDs1T/3r8kav6DqR\n" +"c/t3aQZxgWGIpI7hc9Qgvp7coZRMey5dNOZEna3tqS8dn2tZlhkpYV5uyFUjmxjG\n" +"TERSULQ7hvUqW+eshGGsnxFtL7ANnTSc4xECowIDAQABAoIBAFhJJMhpQFuIySjd\n" +"AGeZ/g4x/3rgWQzNNp4WUR5XLEhy0eLA7ShJywp06kVRoEQGraEHxsyldldAGS5H\n" +"ZhgoGTufNKB+PHER646FpJpHE1IGjfQUloVW3qr8I1iQ0MOGBWCVpf+/V7rnMsLi\n" +"+lr421FXgYuJ0QKXuyRVv72M0q9U6i+ml3aVAhgW/19oFg+dW7YccX+9iVyD05Q5\n" +"KR64tX8xd4wrAqfAgYA3erbbE6GTyHYD5K54kIgfRr/+pIU4qc1L7XOCblnqc/rI\n" +"BilFysEC634r2MNe66uQvNui4oQTfBcFFlXg0zAmp7d5QE0ApOL6HpCsmbImm2uJ\n" +"sdFNYyECgYEA716kfEv7HfnF0P3pAP2AOuEsW6t8q0UtWvnHrwRQXQw8Yv90g7kD\n" +"pUV3/BjD9VQgsQZosbdSn5wbT4j7dypRdrzYk+8m/hBk4Q8M/tWoRGVOn46NudvK\n" +"/KX0A4ODLuulj8yAZVc7CM5Cdy4GCGJBVO+oVvBUAnHxfZziOyqBw9MCgYEA5hQg\n" +"HEORzdxvbbfAx1ggvH1Eg1lqRhmpI43PpRkaoqb8jLwXb2CyBeuv3RBft/X2Tr6F\n" +"mHpe0U1kN/5YEjii/Q/jUX8azIHaUNNSAjrriEeMQZOqFxmhCdiyeXuqg2fbFbhe\n" +"K3Q6/fsB1xj9OOSwyPMqm/M5U0LsoGjmg8TFE/ECgYAlImKUIdlwOgp1NJ7MF4eo\n" +"Gryd8AmkLFQv8+YFgb7R4I8RsJ2rva0SG6fUhScJTSbRL7RYNZ9swXP/L7oLL5Z5\n" +"vCxBLu22pmZv/7y9X/n9ulWrLRtRhQaFkV08mk9knQwPNeOJVTIEWLM49/vZmxyV\n" +"h6Ru8FOoGXMkUI1MLnj5HwKBgGJLkNhiacVYeuaWDa9c0EeXARFYvxWJ2wAMkvzG\n" +"9+ErlFQP+7ciyYvMAItidnJii8NilDLrfNzQwpNFf5zxQ3j4M7bapblfdMT5M10u\n" +"jPfhEWPm0VEjKvDI+p76HYQcd7YU2W6ZLqbZeRTLYUvQMFL5yGduBzyyJ+P0TR9Y\n" +"jpYRAoGBAM7vYGTprw4w2tTZPFICXVk1bQ0LO06oNRtwkiQTUT6UqPjWMFyvHnmN\n" +"11SVVBmRZ0RAk6e5eZLFX8WelJ4J4nSOGRcJheCtoEFlO7D1ewAUSbqWJ0pBqp2T\n" +"gV4oCS8LYe8zReVoYZJjuLwoHvxZzs/hUjc3SI2HRW2W/HQRPC25\n" +"-----END RSA PRIVATE KEY-----\n" +}; + +#define N_PREGEN_KEYS_1024 ARRAY_LENGTH(PREGEN_KEYS_1024) +static crypto_pk_t *pregen_keys_1024[N_PREGEN_KEYS_1024]; +static int next_key_idx_1024; +#define N_PREGEN_KEYS_2048 ARRAY_LENGTH(PREGEN_KEYS_2048) +static crypto_pk_t *pregen_keys_2048[N_PREGEN_KEYS_2048]; +static int next_key_idx_2048; +#endif /* defined(USE_PREGENERATED_RSA_KEYS) */ + +/** Generate and return a new keypair for use in unit tests. If we're using + * the key cache optimization, we might reuse keys. "idx" is ignored. + * Our only guarantee is that we won't reuse a key till this function has been + * called several times. The order in which keys are returned is slightly + * randomized, so that tests that depend on a particular order will not be + * reliable. */ +static crypto_pk_t * +pk_generate_internal(int bits) +{ + tor_assert(bits == 2048 || bits == 1024); + +#ifdef USE_PREGENERATED_RSA_KEYS + int *idxp; + int n_pregen; + crypto_pk_t **pregen_array; + if (bits == 2048) { + idxp = &next_key_idx_2048; + n_pregen = N_PREGEN_KEYS_2048; + pregen_array = pregen_keys_2048; + } else { + idxp = &next_key_idx_1024; + n_pregen = N_PREGEN_KEYS_1024; + pregen_array = pregen_keys_1024; + } + /* Either skip 1 or 2 keys. */ + *idxp += crypto_rand_int_range(1,3); + *idxp %= n_pregen; + return crypto_pk_dup_key(pregen_array[*idxp]); +#else /* !(defined(USE_PREGENERATED_RSA_KEYS)) */ + crypto_pk_t *result; + int res; + result = crypto_pk_new(); + res = crypto_pk_generate_key_with_bits__real(result, bits); + tor_assert(!res); + return result; +#endif /* defined(USE_PREGENERATED_RSA_KEYS) */ +} + +crypto_pk_t * +pk_generate(int idx) +{ + (void) idx; + return pk_generate_internal(1024); +} + +#ifdef USE_PREGENERATED_RSA_KEYS +static int +crypto_pk_generate_key_with_bits__get_cached(crypto_pk_t *env, int bits) +{ + if (bits == 1024 || bits == 2048) { + crypto_pk_t *newkey = pk_generate_internal(bits); + crypto_pk_assign_(env, newkey); + crypto_pk_free(newkey); + } else { + return crypto_pk_generate_key_with_bits__real(env, bits); + } + return 0; +} +#endif /* defined(USE_PREGENERATED_RSA_KEYS) */ + +/** Free all storage used for the cached key optimization. */ +void +free_pregenerated_keys(void) +{ +#ifdef USE_PREGENERATED_RSA_KEYS + unsigned idx; + for (idx = 0; idx < N_PREGEN_KEYS_1024; ++idx) { + if (pregen_keys_1024[idx]) { + crypto_pk_free(pregen_keys_1024[idx]); + pregen_keys_1024[idx] = NULL; + } + } + for (idx = 0; idx < N_PREGEN_KEYS_2048; ++idx) { + if (pregen_keys_2048[idx]) { + crypto_pk_free(pregen_keys_2048[idx]); + pregen_keys_2048[idx] = NULL; + } + } +#endif /* defined(USE_PREGENERATED_RSA_KEYS) */ +} + +void +init_pregenerated_keys(void) +{ +#ifdef USE_PREGENERATED_RSA_KEYS + const char *s; + crypto_pk_t *pk; + unsigned i; + for (i = 0; i < N_PREGEN_KEYS_1024; ++i) { + pk = pregen_keys_1024[i] = crypto_pk_new(); + s = PREGEN_KEYS_1024[i]; + int r = crypto_pk_read_private_key_from_string(pk, s, strlen(s)); + tor_assert(r == 0); + } + for (i = 0; i < N_PREGEN_KEYS_2048; ++i) { + pk = pregen_keys_2048[i] = crypto_pk_new(); + s = PREGEN_KEYS_2048[i]; + int r = crypto_pk_read_private_key_from_string(pk, s, strlen(s)); + tor_assert(r == 0); + } + + MOCK(crypto_pk_generate_key_with_bits, + crypto_pk_generate_key_with_bits__get_cached); +#endif /* defined(USE_PREGENERATED_RSA_KEYS) */ +} + diff --git a/src/wraith/src/test/vote_descriptors.inc b/src/wraith/src/test/vote_descriptors.inc new file mode 100644 index 000000000..895dc6c65 --- /dev/null +++ b/src/wraith/src/test/vote_descriptors.inc @@ -0,0 +1,94 @@ +static const char* VOTE_BODY_V3 = +"network-status-version 3\n" +"vote-status vote\n" +"consensus-methods 13 14 15 16 17 18 19 20 21\n" +"published 2015-09-02 19:34:15\n" +"valid-after 2015-09-02 19:50:55\n" +"fresh-until 2015-09-02 20:07:38\n" +"valid-until 2015-09-02 20:24:15\n" +"voting-delay 100 250\n" +"client-versions 0.1.2.14,0.1.2.17\n" +"server-versions 0.1.2.10,0.1.2.15,0.1.2.16\n" +"known-flags Authority Exit Fast Guard MadeOfCheese MadeOfTin Running Stable V2Dir Valid\n" +"flag-thresholds stable-uptime=0 stable-mtbf=0 fast-speed=0 guard-wfu=0.000% guard-tk=0 guard-bw-inc-exits=0 guard-bw-exc-exits=0 enough-mtbf=0 ignoring-advertised-bws=0\n" +"params circuitwindow=80 foo=660\n" +"dir-source Voter3 D867ACF56A9D229B35C25F0090BC9867E906BE69 3.4.5.6 3.4.5.6 80 9000\n" +"contact voter@example.com\n" +"legacy-dir-key 4141414141414141414141414141414141414141\n" +"dir-key-certificate-version 3\n" +"fingerprint D867ACF56A9D229B35C25F0090BC9867E906BE69\n" +"dir-key-published 2008-12-12 18:07:24\n" +"dir-key-expires 2009-12-12 18:07:24\n" +"dir-identity-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIIBigKCAYEAveMpKlw8oD1YqFqpJchuwSR82BDhutbqgHiez3QO9FmzOctJpV+Y\n" +"mpTYIJLS/qC+4GBKFF1VK0C4SoBrS3zri0qdXdE+vBGcyrxrjMklpxoqSKRY2011\n" +"4eqYPghKlo5RzuqteBclGCHyNxWjUJeRKDWgvh+U/gr2uYM6fRm5q0fCzg4aECE7\n" +"VP6fDGZrMbQI8jHpiMSoC9gkUASNEa6chLInlnP8/H5qUEW4TB9CN/q095pefuwL\n" +"P+F+1Nz5hnM7fa5XmeMB8iM4RriUmOQlLBZgpQBMpEfWMIPcR9F1Gh3MxERqqUcH\n" +"tmij+IZdeXg9OkCXykcabaYIhZD3meErn9Tax4oA/THduLfgli9zM0ExwzH1OooN\n" +"L8rIcJ+2eBo3bQiQUbdYW71sl9w7nSPtircbJUa1mUvWYLPWQxFliPiQSetgJLMj\n" +"VQqtPmV2hvN2Xk3lLfJO50qMTK7w7Gsaw8UtV4YDM1Hcjp/hQaIB1xfwhXgl+eUU\n" +"btUa4c+cUTjHAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-signing-key\n" +"-----BEGIN RSA PUBLIC KEY-----\n" +"MIGJAoGBALPSUInyuEu6NV3NjozplaniIEBzQXEjv1x9/+mqnwZABpYVmuy9A8nx\n" +"eoyY3sZFsnYwNW/IZjAgG23pEmevu3F+L4myMjjaa6ORl3MgRYQ4gmuFqpefrGdm\n" +"ywRCleh2JerkQ4VxOuq10dn/abITzLyaZzMw30KXWp5pxKXOLtxFAgMBAAE=\n" +"-----END RSA PUBLIC KEY-----\n" +"dir-key-crosscert\n" +"-----BEGIN ID SIGNATURE-----\n" +"FTBJNR/Hlt4T53yUMp1r/QCSMCpkHJCbYBT0R0pvYqhqFfYN5qHRSICRXaFFImIF\n" +"0DGWmwRza6DxPKNzkm5/b7I0de9zJW1jNNdQAQK5xppAtQcAafRdu8cBonnmh9KX\n" +"k1NrAK/X00FYywju3yl/SxCn1GddVNkHYexEudmJMPM=\n" +"-----END ID SIGNATURE-----\n" +"dir-key-certification\n" +"-----BEGIN SIGNATURE-----\n" +"pjWguLFBfELZDc6DywL6Do21SCl7LcutfpM92MEn4WYeSNcTXNR6lRX7reOEJk4e\n" +"NwEaMt+Hl7slgeR5wjnW3OmMmRPZK9bquNWbfD+sAOV9bRFZTpXIdleAQFPlwvMF\n" +"z/Gzwspzn4i2Yh6hySShrctMmW8YL3OM8LsBXzBhp/rG2uHlsxmIsc13DA6HWt61\n" +"ffY72uNE6KckDGsQ4wPGP9q69y6g+X+TNio1KPbsILbePv6EjbO+rS8FiS4njPlg\n" +"SPYry1RaUvxzxTkswIzdE1tjJrUiqpbWlTGxrH9N4OszoLm45Pc784KLULrjKIoi\n" +"Q+vRsGrcMBAa+kDowWU6H1ryKR7KOhzRTcf2uqLE/W3ezaRwmOG+ETmoVFwbhk2X\n" +"OlbXEM9fWP+INvFkr6Z93VYL2jGkCjV7e3xXmre/Lb92fUcYi6t5dwzfV8gJnIoG\n" +"eCHd0K8NrQK0ipVk/7zcPDKOPeo9Y5aj/f6X/pDHtb+Dd5sT+l82G/Tqy4DIYUYR\n" +"-----END SIGNATURE-----\n" +"r router2 AwMDAwMDAwMDAwMDAwMDAwMDAwM Tk5OTk5OTk5OTk5OTk5OTk5OTk4 2015-09-02 19:09:15 153.0.136.1 443 8000\n" +"s Running V2Dir\n" +"v 0.1.2.14\n" +"w Bandwidth=30 Measured=30\n" +"p reject 1-65535\n" +"id ed25519 none\n" +"m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa0\n" +"r router1 BQUFBQUFBQUFBQUFBQUFBQUFBQU TU1NTU1NTU1NTU1NTU1NTU1NTU0 2015-09-02 19:17:35 153.0.153.1 443 0\n" +"a [1:2:3::4]:4711\n" +"s Exit Fast Guard Running Stable Valid\n" +"v 0.2.0.5\n" +"w Bandwidth=120 Measured=120\n" +"p reject 1-65535\n" +"id ed25519 none\n" +"m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa1\n" +"r router3 MzMzMzMzMzMzMzMzMzMzMzMzMzM T09PT09PT09PT09PT09PT09PT08 2015-09-02 19:17:35 170.0.153.1 400 9999\n" +"s Authority Exit Fast Guard Running Stable V2Dir Valid\n" +"v 0.1.0.3\n" +"w Bandwidth=120\n" +"p reject 1-65535\n" +"id ed25519 none\n" +"m 9,10,11,12,13,14,15,16,17 " +"sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa2\n" +"r router4 NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ Ly8vLy8vLy8vLy8vLy8vLy8vLy8 2015-09-02 19:17:35 192.0.2.3 500 1999\n" +"s Running V2Dir\n" +"v 0.1.6.3\n" +"w Bandwidth=30\n" +"p reject 1-65535\n" +"id ed25519 none\n" +"m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa3\n" +"directory-footer\n" +"directory-signature D867ACF56A9D229B35C25F0090BC9867E906BE69 CBF56A83368A5150F1A9AAADAFB4D77F8C4170E2\n" +"-----BEGIN SIGNATURE-----\n" +"AHiWcHe+T3XbnlQqvqSAk6RY3XmEy1+hM2u9Xk6BNi7BpQkEQM1f0vzRpgn5Dnf2\n" +"TXQWGUq9Z7jdSVnzWT3xqPA4zjw6eZkj+DKUtwq+oEDZGlf8eHTFmr0NAWfwZbk9\n" +"NAjbMTUXUP37N2XAZwkoCWwFCrrfMwXrL7OhZbj7ifo=\n" +"-----END SIGNATURE-----\n"; + diff --git a/src/wraith/src/test/zero_length_keys.sh b/src/wraith/src/test/zero_length_keys.sh new file mode 100644 index 000000000..3c61f8d46 --- /dev/null +++ b/src/wraith/src/test/zero_length_keys.sh @@ -0,0 +1,126 @@ +#!/bin/sh +# Check that tor regenerates keys when key files are zero-length +# Test for bug #13111 - Tor fails to start if onion keys are zero length +# +# Usage: +# ./zero_length_keys.sh PATH_TO_TOR +# Run all the tests below +# ./zero_length_keys.sh PATH_TO_TOR -z +# Check tor will launch and regenerate zero-length keys +# ./zero_length_keys.sh PATH_TO_TOR -d +# Check tor regenerates deleted keys (existing behaviour) +# ./zero_length_keys.sh PATH_TO_TOR -e +# Check tor does not overwrite existing keys (existing behaviour) +# +# Exit Statuses: +# 0: test succeeded - tor regenerated/kept the files +# 1: test failed - tor did not regenerate/keep the files +# 2: test failed - tor did not generate the key files on first run +# 3: a command failed - the test could not be completed +# + +if [ $# -eq 0 ] || [ ! -f ${1} ] || [ ! -x ${1} ]; then + echo "Usage: ${0} PATH_TO_TOR [-z|-d|-e]" + exit 1 +elif [ $# -eq 1 ]; then + echo "Testing that tor correctly handles zero-length keys" + "$0" "${1}" -z && "$0" "${1}" -d && "$0" "${1}" -e + exit $? +else #[$# -gt 1 ]; then + TOR_BINARY="${1}" + shift +fi + +DATA_DIR=`mktemp -d -t tor_zero_length_keys.XXXXXX` +if [ -z "$DATA_DIR" ]; then + echo "Failure: mktemp invocation returned empty string" >&2 + exit 3 +fi +if [ ! -d "$DATA_DIR" ]; then + echo "Failure: mktemp invocation result doesn't point to directory" >&2 + exit 3 +fi +trap "rm -rf '$DATA_DIR'" 0 + +touch "$DATA_DIR"/empty_torrc + +# DisableNetwork means that the ORPort won't actually be opened. +# 'ExitRelay 0' suppresses a warning. +TOR="${TOR_BINARY} --hush --DisableNetwork 1 --ShutdownWaitLength 0 --ORPort 12345 --ExitRelay 0 -f $DATA_DIR/empty_torrc" + +if [ -s "$DATA_DIR"/keys/secret_id_key ] && [ -s "$DATA_DIR"/keys/secret_onion_key ] && + [ -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then + echo "Failure: Previous tor keys present in tor data directory" >&2 + exit 3 +else + echo "Generating initial tor keys" + $TOR --DataDirectory "$DATA_DIR" --list-fingerprint + + # tor must successfully generate non-zero-length key files + if [ -s "$DATA_DIR"/keys/secret_id_key ] && [ -s "$DATA_DIR"/keys/secret_onion_key ] && + [ -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then + true #echo "tor generated the initial key files" + else + echo "Failure: tor failed to generate the initial key files" + exit 2 + fi +fi + +#ls -lh "$DATA_DIR"/keys/ || exit 3 + +# backup and keep/delete/create zero-length files for the keys + +FILE_DESC="keeps existing" +# make a backup +cp -r "$DATA_DIR"/keys "$DATA_DIR"/keys.old + +# delete keys for -d or -z +if [ "$1" != "-e" ]; then + FILE_DESC="regenerates deleted" + rm "$DATA_DIR"/keys/secret_id_key || exit 3 + rm "$DATA_DIR"/keys/secret_onion_key || exit 3 + rm "$DATA_DIR"/keys/secret_onion_key_ntor || exit 3 +fi + +# create empty files for -z +if [ "$1" = "-z" ]; then + FILE_DESC="regenerates zero-length" + touch "$DATA_DIR"/keys/secret_id_key || exit 3 + touch "$DATA_DIR"/keys/secret_onion_key || exit 3 + touch "$DATA_DIR"/keys/secret_onion_key_ntor || exit 3 +fi + +echo "Running tor again to check if it $FILE_DESC keys" +$TOR --DataDirectory "$DATA_DIR" --list-fingerprint + +#ls -lh "$DATA_DIR"/keys/ || exit 3 + +# tor must always have non-zero-length key files +if [ -s "$DATA_DIR"/keys/secret_id_key ] && [ -s "$DATA_DIR"/keys/secret_onion_key ] && + [ -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then + # check if the keys are different to the old ones + diff -q -r "$DATA_DIR"/keys "$DATA_DIR"/keys.old > /dev/null + SAME_KEYS=$? + # if we're not testing existing keys, + # the current keys should be different to the old ones + if [ "$1" != "-e" ]; then + if [ $SAME_KEYS -ne 0 ]; then + echo "Success: test that tor $FILE_DESC key files: different keys" + exit 0 + else + echo "Failure: test that tor $FILE_DESC key files: same keys" + exit 1 + fi + else #[ "$1" == "-e" ]; then + if [ $SAME_KEYS -eq 0 ]; then + echo "Success: test that tor $FILE_DESC key files: same keys" + exit 0 + else + echo "Failure: test that tor $FILE_DESC key files: different keys" + exit 1 + fi + fi +else + echo "Failure: test that tor $FILE_DESC key files: no key files" + exit 1 +fi diff --git a/src/wraith/src/tools/Makefile.nmake b/src/wraith/src/tools/Makefile.nmake new file mode 100644 index 000000000..fda1990e0 --- /dev/null +++ b/src/wraith/src/tools/Makefile.nmake @@ -0,0 +1,19 @@ +all: tor-resolve.exe tor-gencert.exe + +CFLAGS = /I ..\win32 /I ..\..\..\build-alpha\include /I ..\common /I ..\or + +LIBS = ..\..\..\build-alpha\lib\libevent.lib \ + ..\..\..\build-alpha\lib\libcrypto.lib \ + ..\..\..\build-alpha\lib\libssl.lib \ + ..\..\..\build-alpha\lib\libz.lib \ + ws2_32.lib advapi32.lib shell32.lib \ + crypt32.lib gdi32.lib user32.lib + +tor-gencert.exe: tor-gencert.obj + $(CC) $(CFLAGS) $(LIBS) ..\common\*.lib tor-gencert.obj + +tor-resolve.exe: tor-resolve.obj + $(CC) $(CFLAGS) $(LIBS) ..\common\*.lib tor-resolve.obj + +clean: + del *.obj *.lib *.exe diff --git a/src/wraith/src/tools/include.am b/src/wraith/src/tools/include.am new file mode 100644 index 000000000..92cc3f10a --- /dev/null +++ b/src/wraith/src/tools/include.am @@ -0,0 +1,52 @@ +bin_PROGRAMS+= src/tools/tor-resolve src/tools/tor-gencert + +if COVERAGE_ENABLED +noinst_PROGRAMS+= src/tools/tor-cov-resolve src/tools/tor-cov-gencert +endif + +src_tools_tor_resolve_SOURCES = src/tools/tor-resolve.c +src_tools_tor_resolve_LDFLAGS = +src_tools_tor_resolve_LDADD = src/common/libor.a \ + src/common/libor-ctime.a \ + $(rust_ldadd) \ + @TOR_LIB_MATH@ @TOR_LIB_WS32@ @TOR_LIB_USERENV@ + +if COVERAGE_ENABLED +src_tools_tor_cov_resolve_SOURCES = src/tools/tor-resolve.c +src_tools_tor_cov_resolve_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS) +src_tools_tor_cov_resolve_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) +src_tools_tor_cov_resolve_LDADD = src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + @TOR_LIB_MATH@ @TOR_LIB_WS32@ +endif + +src_tools_tor_gencert_SOURCES = src/tools/tor-gencert.c +src_tools_tor_gencert_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ +src_tools_tor_gencert_LDADD = src/common/libor.a src/common/libor-crypto.a \ + src/common/libor-ctime.a \ + $(LIBKECCAK_TINY) \ + $(LIBDONNA) \ + $(rust_ldadd) \ + @TOR_LIB_MATH@ @TOR_ZLIB_LIBS@ @TOR_OPENSSL_LIBS@ \ + @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ @CURVE25519_LIBS@ + +if COVERAGE_ENABLED +src_tools_tor_cov_gencert_SOURCES = src/tools/tor-gencert.c +src_tools_tor_cov_gencert_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS) +src_tools_tor_cov_gencert_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) +src_tools_tor_cov_gencert_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ +src_tools_tor_cov_gencert_LDADD = src/common/libor-testing.a \ + src/common/libor-crypto-testing.a \ + src/common/libor-ctime-testing.a \ + $(LIBKECCAK_TINY) \ + $(LIBDONNA) \ + @TOR_LIB_MATH@ @TOR_ZLIB_LIBS@ @TOR_OPENSSL_LIBS@ \ + @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ +endif + +EXTRA_DIST += src/tools/tor-fw-helper/README + +if BUILD_LIBTORRUNNER +noinst_LIBRARIES += src/tools/libtorrunner.a +src_tools_libtorrunner_a_SOURCES = src/tools/tor_runner.c src/or/tor_api.c +endif diff --git a/src/wraith/src/tools/tor-fw-helper/README b/src/wraith/src/tools/tor-fw-helper/README new file mode 100644 index 000000000..6a1ecaa1e --- /dev/null +++ b/src/wraith/src/tools/tor-fw-helper/README @@ -0,0 +1,10 @@ + +We no longer recommend the use of this tool. Instead, please use the +pure-Go version of tor-fw-helper available at + https://gitweb.torproject.org/tor-fw-helper.git + +Why? + +The C code here was fine, but frankly: we don't trust the underlying +libraries. They don't seem to have been written with network security +in mind, and we have very little faith in their safety. diff --git a/src/wraith/src/tools/tor-gencert.c b/src/wraith/src/tools/tor-gencert.c new file mode 100644 index 000000000..fb7465c0e --- /dev/null +++ b/src/wraith/src/tools/tor-gencert.c @@ -0,0 +1,600 @@ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#include +#include + +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "compat.h" + +/* Some versions of OpenSSL declare X509_STORE_CTX_set_verify_cb twice in + * x509.h and x509_vfy.h. Suppress the GCC warning so we can build with + * -Wredundant-decl. */ +DISABLE_GCC_WARNING(redundant-decls) + +#include +#include +#include +#include +#include +#include + +ENABLE_GCC_WARNING(redundant-decls) + +#include +#if 0 +#include +#include +#include +#endif + +#include "compat.h" +#include "util.h" +#include "torlog.h" +#include "crypto.h" +#include "address.h" +#include "util_format.h" + +#define IDENTITY_KEY_BITS 3072 +#define SIGNING_KEY_BITS 2048 +#define DEFAULT_LIFETIME 12 + +/* These globals are set via command line options. */ +static char *identity_key_file = NULL; +static char *signing_key_file = NULL; +static char *certificate_file = NULL; +static int reuse_signing_key = 0; +static int verbose = 0; +static int make_new_id = 0; +static int months_lifetime = DEFAULT_LIFETIME; +static int passphrase_fd = -1; +static char *address = NULL; + +static char *passphrase = NULL; +static size_t passphrase_len = 0; + +static EVP_PKEY *identity_key = NULL; +static EVP_PKEY *signing_key = NULL; + +/** Write a usage message for tor-gencert to stderr. */ +static void +show_help(void) +{ + fprintf(stderr, "Syntax:\n" + "tor-gencert [-h|--help] [-v] [-r|--reuse] [--create-identity-key]\n" + " [-i identity_key_file] [-s signing_key_file] " + "[-c certificate_file]\n" + " [-m lifetime_in_months] [-a address:port] " + "[--passphrase-fd ]\n"); +} + +/* XXXX copied from crypto.c */ +static void +crypto_log_errors(int severity, const char *doing) +{ + unsigned long err; + const char *msg, *lib, *func; + while ((err = ERR_get_error()) != 0) { + msg = (const char*)ERR_reason_error_string(err); + lib = (const char*)ERR_lib_error_string(err); + func = (const char*)ERR_func_error_string(err); + if (!msg) msg = "(null)"; + if (!lib) lib = "(null)"; + if (!func) func = "(null)"; + if (doing) { + tor_log(severity, LD_CRYPTO, "crypto error while %s: %s (in %s:%s)", + doing, msg, lib, func); + } else { + tor_log(severity, LD_CRYPTO, "crypto error: %s (in %s:%s)", + msg, lib, func); + } + } +} + +/** Read the passphrase from the passphrase fd. */ +static int +load_passphrase(void) +{ + char *cp; + char buf[1024]; /* "Ought to be enough for anybody." */ + memset(buf, 0, sizeof(buf)); /* should be needless */ + ssize_t n = read_all(passphrase_fd, buf, sizeof(buf), 0); + if (n < 0) { + log_err(LD_GENERAL, "Couldn't read from passphrase fd: %s", + strerror(errno)); + return -1; + } + /* We'll take everything from the buffer except for optional terminating + * newline. */ + cp = memchr(buf, '\n', n); + if (cp == NULL) { + passphrase_len = n; + } else { + passphrase_len = cp-buf; + } + passphrase = tor_strndup(buf, passphrase_len); + memwipe(buf, 0, sizeof(buf)); + return 0; +} + +static void +clear_passphrase(void) +{ + if (passphrase) { + memwipe(passphrase, 0, passphrase_len); + tor_free(passphrase); + } +} + +/** Read the command line options from argc and argv, + * setting global option vars as needed. + */ +static int +parse_commandline(int argc, char **argv) +{ + int i; + log_severity_list_t s; + for (i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) { + show_help(); + return 1; + } else if (!strcmp(argv[i], "-i")) { + if (i+1>=argc) { + fprintf(stderr, "No argument to -i\n"); + return 1; + } + if (identity_key_file) { + fprintf(stderr, "Duplicate values for -i\n"); + return -1; + } + identity_key_file = tor_strdup(argv[++i]); + } else if (!strcmp(argv[i], "-s")) { + if (i+1>=argc) { + fprintf(stderr, "No argument to -s\n"); + return 1; + } + if (signing_key_file) { + fprintf(stderr, "Duplicate values for -s\n"); + return -1; + } + signing_key_file = tor_strdup(argv[++i]); + } else if (!strcmp(argv[i], "-c")) { + if (i+1>=argc) { + fprintf(stderr, "No argument to -c\n"); + return 1; + } + if (certificate_file) { + fprintf(stderr, "Duplicate values for -c\n"); + return -1; + } + certificate_file = tor_strdup(argv[++i]); + } else if (!strcmp(argv[i], "-m")) { + if (i+1>=argc) { + fprintf(stderr, "No argument to -m\n"); + return 1; + } + months_lifetime = atoi(argv[++i]); + if (months_lifetime > 24 || months_lifetime < 0) { + fprintf(stderr, "Lifetime (in months) was out of range.\n"); + return 1; + } + } else if (!strcmp(argv[i], "-r") || !strcmp(argv[i], "--reuse")) { + reuse_signing_key = 1; + } else if (!strcmp(argv[i], "-v")) { + verbose = 1; + } else if (!strcmp(argv[i], "-a")) { + uint32_t addr; + uint16_t port; + char b[INET_NTOA_BUF_LEN]; + struct in_addr in; + if (i+1>=argc) { + fprintf(stderr, "No argument to -a\n"); + return 1; + } + if (addr_port_lookup(LOG_ERR, argv[++i], NULL, &addr, &port)<0) + return 1; + in.s_addr = htonl(addr); + tor_inet_ntoa(&in, b, sizeof(b)); + tor_asprintf(&address, "%s:%d", b, (int)port); + } else if (!strcmp(argv[i], "--create-identity-key")) { + make_new_id = 1; + } else if (!strcmp(argv[i], "--passphrase-fd")) { + if (i+1>=argc) { + fprintf(stderr, "No argument to --passphrase-fd\n"); + return 1; + } + passphrase_fd = atoi(argv[++i]); + } else { + fprintf(stderr, "Unrecognized option %s\n", argv[i]); + return 1; + } + } + + memwipe(&s, 0, sizeof(s)); + if (verbose) + set_log_severity_config(LOG_DEBUG, LOG_ERR, &s); + else + set_log_severity_config(LOG_WARN, LOG_ERR, &s); + add_stream_log(&s, "", fileno(stderr)); + + if (!identity_key_file) { + identity_key_file = tor_strdup("./authority_identity_key"); + log_info(LD_GENERAL, "No identity key file given; defaulting to %s", + identity_key_file); + } + if (!signing_key_file) { + signing_key_file = tor_strdup("./authority_signing_key"); + log_info(LD_GENERAL, "No signing key file given; defaulting to %s", + signing_key_file); + } + if (!certificate_file) { + certificate_file = tor_strdup("./authority_certificate"); + log_info(LD_GENERAL, "No signing key file given; defaulting to %s", + certificate_file); + } + if (passphrase_fd >= 0) { + if (load_passphrase()<0) + return 1; + } + return 0; +} + +static RSA * +generate_key(int bits) +{ + RSA *rsa = NULL; + crypto_pk_t *env = crypto_pk_new(); + if (crypto_pk_generate_key_with_bits(env,bits)<0) + goto done; + rsa = crypto_pk_get_rsa_(env); + rsa = RSAPrivateKey_dup(rsa); + done: + crypto_pk_free(env); + return rsa; +} + +/** Try to read the identity key from identity_key_file. If no such + * file exists and create_identity_key is set, make a new identity key and + * store it. Return 0 on success, nonzero on failure. + */ +static int +load_identity_key(void) +{ + file_status_t status = file_status(identity_key_file); + FILE *f; + + if (make_new_id) { + open_file_t *open_file = NULL; + RSA *key; + if (status != FN_NOENT) { + log_err(LD_GENERAL, "--create-identity-key was specified, but %s " + "already exists.", identity_key_file); + return 1; + } + log_notice(LD_GENERAL, "Generating %d-bit RSA identity key.", + IDENTITY_KEY_BITS); + if (!(key = generate_key(IDENTITY_KEY_BITS))) { + log_err(LD_GENERAL, "Couldn't generate identity key."); + crypto_log_errors(LOG_ERR, "Generating identity key"); + return 1; + } + identity_key = EVP_PKEY_new(); + if (!(EVP_PKEY_assign_RSA(identity_key, key))) { + log_err(LD_GENERAL, "Couldn't assign identity key."); + return 1; + } + + if (!(f = start_writing_to_stdio_file(identity_key_file, + OPEN_FLAGS_REPLACE | O_TEXT, 0400, + &open_file))) + return 1; + + /* Write the key to the file. If passphrase is not set, takes it from + * the terminal. */ + if (!PEM_write_PKCS8PrivateKey_nid(f, identity_key, + NID_pbe_WithSHA1And3_Key_TripleDES_CBC, + passphrase, (int)passphrase_len, + NULL, NULL)) { + log_err(LD_GENERAL, "Couldn't write identity key to %s", + identity_key_file); + crypto_log_errors(LOG_ERR, "Writing identity key"); + abort_writing_to_file(open_file); + return 1; + } + finish_writing_to_file(open_file); + } else { + if (status != FN_FILE) { + log_err(LD_GENERAL, + "No identity key found in %s. To specify a location " + "for an identity key, use -i. To generate a new identity key, " + "use --create-identity-key.", identity_key_file); + return 1; + } + + if (!(f = fopen(identity_key_file, "r"))) { + log_err(LD_GENERAL, "Couldn't open %s for reading: %s", + identity_key_file, strerror(errno)); + return 1; + } + + /* Read the key. If passphrase is not set, takes it from the terminal. */ + identity_key = PEM_read_PrivateKey(f, NULL, NULL, passphrase); + if (!identity_key) { + log_err(LD_GENERAL, "Couldn't read identity key from %s", + identity_key_file); + fclose(f); + return 1; + } + fclose(f); + } + return 0; +} + +/** Load a saved signing key from disk. Return 0 on success, nonzero on + * failure. */ +static int +load_signing_key(void) +{ + FILE *f; + if (!(f = fopen(signing_key_file, "r"))) { + log_err(LD_GENERAL, "Couldn't open %s for reading: %s", + signing_key_file, strerror(errno)); + return 1; + } + if (!(signing_key = PEM_read_PrivateKey(f, NULL, NULL, NULL))) { + log_err(LD_GENERAL, "Couldn't read siging key from %s", signing_key_file); + fclose(f); + return 1; + } + fclose(f); + return 0; +} + +/** Generate a new signing key and write it to disk. Return 0 on success, + * nonzero on failure. */ +static int +generate_signing_key(void) +{ + open_file_t *open_file; + FILE *f; + RSA *key; + log_notice(LD_GENERAL, "Generating %d-bit RSA signing key.", + SIGNING_KEY_BITS); + if (!(key = generate_key(SIGNING_KEY_BITS))) { + log_err(LD_GENERAL, "Couldn't generate signing key."); + crypto_log_errors(LOG_ERR, "Generating signing key"); + return 1; + } + signing_key = EVP_PKEY_new(); + if (!(EVP_PKEY_assign_RSA(signing_key, key))) { + log_err(LD_GENERAL, "Couldn't assign signing key."); + return 1; + } + + if (!(f = start_writing_to_stdio_file(signing_key_file, + OPEN_FLAGS_REPLACE | O_TEXT, 0600, + &open_file))) + return 1; + + /* Write signing key with no encryption. */ + if (!PEM_write_RSAPrivateKey(f, key, NULL, NULL, 0, NULL, NULL)) { + crypto_log_errors(LOG_WARN, "writing signing key"); + abort_writing_to_file(open_file); + return 1; + } + + finish_writing_to_file(open_file); + + return 0; +} + +/** Encode key in the format used in directory documents; return + * a newly allocated string holding the result or NULL on failure. */ +static char * +key_to_string(EVP_PKEY *key) +{ + BUF_MEM *buf; + BIO *b; + RSA *rsa = EVP_PKEY_get1_RSA(key); + char *result; + if (!rsa) + return NULL; + + b = BIO_new(BIO_s_mem()); + if (!PEM_write_bio_RSAPublicKey(b, rsa)) { + crypto_log_errors(LOG_WARN, "writing public key to string"); + RSA_free(rsa); + return NULL; + } + + BIO_get_mem_ptr(b, &buf); + result = tor_malloc(buf->length + 1); + memcpy(result, buf->data, buf->length); + result[buf->length] = 0; + + BIO_free(b); + + RSA_free(rsa); + return result; +} + +/** Set out to the hex-encoded fingerprint of pkey. */ +static int +get_fingerprint(EVP_PKEY *pkey, char *out) +{ + int r = -1; + crypto_pk_t *pk = crypto_new_pk_from_rsa_(EVP_PKEY_get1_RSA(pkey)); + if (pk) { + r = crypto_pk_get_fingerprint(pk, out, 0); + crypto_pk_free(pk); + } + return r; +} + +/** Set out to the hex-encoded fingerprint of pkey. */ +static int +get_digest(EVP_PKEY *pkey, char *out) +{ + int r = -1; + crypto_pk_t *pk = crypto_new_pk_from_rsa_(EVP_PKEY_get1_RSA(pkey)); + if (pk) { + r = crypto_pk_get_digest(pk, out); + crypto_pk_free(pk); + } + return r; +} + +/** Generate a new certificate for our loaded or generated keys, and write it + * to disk. Return 0 on success, nonzero on failure. */ +static int +generate_certificate(void) +{ + char buf[8192]; + time_t now = time(NULL); + struct tm tm; + char published[ISO_TIME_LEN+1]; + char expires[ISO_TIME_LEN+1]; + char id_digest[DIGEST_LEN]; + char fingerprint[FINGERPRINT_LEN+1]; + FILE *f; + size_t signed_len; + char digest[DIGEST_LEN]; + char signature[1024]; /* handles up to 8192-bit keys. */ + int r; + + if (get_fingerprint(identity_key, fingerprint) < 0) { + return -1; + } + if (get_digest(identity_key, id_digest)) { + return -1; + } + char *ident = key_to_string(identity_key); + char *signing = key_to_string(signing_key); + + tor_localtime_r(&now, &tm); + tm.tm_mon += months_lifetime; + + format_iso_time(published, now); + format_iso_time(expires, mktime(&tm)); + + tor_snprintf(buf, sizeof(buf), + "dir-key-certificate-version 3" + "%s%s" + "\nfingerprint %s\n" + "dir-key-published %s\n" + "dir-key-expires %s\n" + "dir-identity-key\n%s" + "dir-signing-key\n%s" + "dir-key-crosscert\n" + "-----BEGIN ID SIGNATURE-----\n", + address?"\ndir-address ":"", address?address:"", + fingerprint, published, expires, ident, signing + ); + tor_free(ident); + tor_free(signing); + + /* Append a cross-certification */ + RSA *rsa = EVP_PKEY_get1_RSA(signing_key); + r = RSA_private_encrypt(DIGEST_LEN, (unsigned char*)id_digest, + (unsigned char*)signature, + rsa, + RSA_PKCS1_PADDING); + RSA_free(rsa); + + signed_len = strlen(buf); + base64_encode(buf+signed_len, sizeof(buf)-signed_len, signature, r, + BASE64_ENCODE_MULTILINE); + + strlcat(buf, + "-----END ID SIGNATURE-----\n" + "dir-key-certification\n", sizeof(buf)); + + signed_len = strlen(buf); + SHA1((const unsigned char*)buf,signed_len,(unsigned char*)digest); + + rsa = EVP_PKEY_get1_RSA(identity_key); + r = RSA_private_encrypt(DIGEST_LEN, (unsigned char*)digest, + (unsigned char*)signature, + rsa, + RSA_PKCS1_PADDING); + RSA_free(rsa); + strlcat(buf, "-----BEGIN SIGNATURE-----\n", sizeof(buf)); + signed_len = strlen(buf); + base64_encode(buf+signed_len, sizeof(buf)-signed_len, signature, r, + BASE64_ENCODE_MULTILINE); + strlcat(buf, "-----END SIGNATURE-----\n", sizeof(buf)); + + if (!(f = fopen(certificate_file, "w"))) { + log_err(LD_GENERAL, "Couldn't open %s for writing: %s", + certificate_file, strerror(errno)); + return 1; + } + + if (fputs(buf, f) < 0) { + log_err(LD_GENERAL, "Couldn't write to %s: %s", + certificate_file, strerror(errno)); + fclose(f); + return 1; + } + fclose(f); + return 0; +} + +/** Entry point to tor-gencert */ +int +main(int argc, char **argv) +{ + int r = 1; + init_logging(1); + + /* Don't bother using acceleration. */ + if (crypto_global_init(0, NULL, NULL)) { + fprintf(stderr, "Couldn't initialize crypto library.\n"); + return 1; + } + if (crypto_seed_rng()) { + fprintf(stderr, "Couldn't seed RNG.\n"); + goto done; + } + /* Make sure that files are made private. */ + umask(0077); + + if (parse_commandline(argc, argv)) + goto done; + if (load_identity_key()) + goto done; + if (reuse_signing_key) { + if (load_signing_key()) + goto done; + } else { + if (generate_signing_key()) + goto done; + } + if (generate_certificate()) + goto done; + + r = 0; + done: + clear_passphrase(); + if (identity_key) + EVP_PKEY_free(identity_key); + if (signing_key) + EVP_PKEY_free(signing_key); + tor_free(address); + tor_free(identity_key_file); + tor_free(signing_key_file); + tor_free(certificate_file); + tor_free(address); + + crypto_global_cleanup(); + return r; +} + diff --git a/src/wraith/src/tools/tor-resolve.c b/src/wraith/src/tools/tor-resolve.c new file mode 100644 index 000000000..1e2409a13 --- /dev/null +++ b/src/wraith/src/tools/tor-resolve.c @@ -0,0 +1,452 @@ +/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson + * Copyright (c) 2007-2017, The Tor Project, Inc. + */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "compat.h" +#include "util.h" +#include "address.h" +#include "torlog.h" +#include "sandbox.h" + +#include +#include +#include +#include +#include + +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include /* Must be included before sys/stat.h for Ultrix */ +#endif +#ifdef HAVE_ERRNO_H +#include +#endif + +#ifdef _WIN32 +#include +#include +#endif + +#define RESPONSE_LEN_4 8 +#define log_sock_error(act, _s) \ + STMT_BEGIN log_fn(LOG_ERR, LD_NET, "Error while %s: %s", act, \ + tor_socket_strerror(tor_socket_errno(_s))); STMT_END + +static void usage(void) ATTR_NORETURN; + +/** Set *out to a newly allocated SOCKS4a resolve request with + * username and hostname as provided. Return the number + * of bytes in the request. */ +static ssize_t +build_socks_resolve_request(char **out, + const char *username, + const char *hostname, + int reverse, + int version) +{ + size_t len = 0; + tor_assert(out); + tor_assert(username); + tor_assert(hostname); + + if (version == 4) { + len = 8 + strlen(username) + 1 + strlen(hostname) + 1; + *out = tor_malloc(len); + (*out)[0] = 4; /* SOCKS version 4 */ + (*out)[1] = '\xF0'; /* Command: resolve. */ + set_uint16((*out)+2, htons(0)); /* port: 0. */ + set_uint32((*out)+4, htonl(0x00000001u)); /* addr: 0.0.0.1 */ + memcpy((*out)+8, username, strlen(username)+1); + memcpy((*out)+8+strlen(username)+1, hostname, strlen(hostname)+1); + } else if (version == 5) { + int is_ip_address; + tor_addr_t addr; + size_t addrlen; + int ipv6; + is_ip_address = tor_addr_parse(&addr, hostname) != -1; + if (!is_ip_address && reverse) { + log_err(LD_GENERAL, "Tried to do a reverse lookup on a non-IP!"); + return -1; + } + ipv6 = reverse && tor_addr_family(&addr) == AF_INET6; + addrlen = reverse ? (ipv6 ? 16 : 4) : 1 + strlen(hostname); + if (addrlen > UINT8_MAX) { + log_err(LD_GENERAL, "Hostname is too long!"); + return -1; + } + len = 6 + addrlen; + *out = tor_malloc(len); + (*out)[0] = 5; /* SOCKS version 5 */ + (*out)[1] = reverse ? '\xF1' : '\xF0'; /* RESOLVE_PTR or RESOLVE */ + (*out)[2] = 0; /* reserved. */ + if (reverse) { + (*out)[3] = ipv6 ? 4 : 1; + if (ipv6) + memcpy((*out)+4, tor_addr_to_in6_addr8(&addr), 16); + else + set_uint32((*out)+4, tor_addr_to_ipv4n(&addr)); + } else { + (*out)[3] = 3; + (*out)[4] = (char)(uint8_t)(addrlen - 1); + memcpy((*out)+5, hostname, addrlen - 1); + } + set_uint16((*out)+4+addrlen, 0); /* port */ + } else { + tor_assert(0); + } + + return len; +} + +static void +onion_warning(const char *hostname) +{ + log_warn(LD_NET, + "%s is a hidden service; those don't have IP addresses. " + "You can use the AutomapHostsOnResolve option to have Tor return a " + "fake address for hidden services. Or you can have your " + "application send the address to Tor directly; we recommend an " + "application that uses SOCKS 5 with hostnames.", + hostname); +} + +/** Given a len-byte SOCKS4a response in response, set + * *addr_out to the address it contains (in host order). + * Return 0 on success, -1 on error. + */ +static int +parse_socks4a_resolve_response(const char *hostname, + const char *response, size_t len, + tor_addr_t *addr_out) +{ + uint8_t status; + tor_assert(response); + tor_assert(addr_out); + + if (len < RESPONSE_LEN_4) { + log_warn(LD_PROTOCOL,"Truncated socks response."); + return -1; + } + if (((uint8_t)response[0])!=0) { /* version: 0 */ + log_warn(LD_PROTOCOL,"Nonzero version in socks response: bad format."); + return -1; + } + status = (uint8_t)response[1]; + if (get_uint16(response+2)!=0) { /* port: 0 */ + log_warn(LD_PROTOCOL,"Nonzero port in socks response: bad format."); + return -1; + } + if (status != 90) { + log_warn(LD_NET,"Got status response '%d': socks request failed.", status); + if (!strcasecmpend(hostname, ".onion")) { + onion_warning(hostname); + return -1; + } + return -1; + } + + tor_addr_from_ipv4n(addr_out, get_uint32(response+4)); + return 0; +} + +/* It would be nice to let someone know what SOCKS5 issue a user may have */ +static const char * +socks5_reason_to_string(char reason) +{ + switch (reason) { + case SOCKS5_SUCCEEDED: + return "succeeded"; + case SOCKS5_GENERAL_ERROR: + return "general error"; + case SOCKS5_NOT_ALLOWED: + return "not allowed"; + case SOCKS5_NET_UNREACHABLE: + return "network is unreachable"; + case SOCKS5_HOST_UNREACHABLE: + return "host is unreachable"; + case SOCKS5_CONNECTION_REFUSED: + return "connection refused"; + case SOCKS5_TTL_EXPIRED: + return "ttl expired"; + case SOCKS5_COMMAND_NOT_SUPPORTED: + return "command not supported"; + case SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED: + return "address type not supported"; + default: + return "unknown SOCKS5 code"; + } +} + +/** Send a resolve request for hostname to the Tor listening on + * sockshost:socksport. Store the resulting IPv4 + * address (in host order) into *result_addr. + */ +static int +do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport, + int reverse, int version, + tor_addr_t *result_addr, char **result_hostname) +{ + int s = -1; + struct sockaddr_in socksaddr; + char *req = NULL; + ssize_t len = 0; + + tor_assert(hostname); + tor_assert(result_addr); + tor_assert(version == 4 || version == 5); + + tor_addr_make_unspec(result_addr); + *result_hostname = NULL; + + s = tor_open_socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); + if (s<0) { + log_sock_error("creating_socket", -1); + return -1; + } + + memset(&socksaddr, 0, sizeof(socksaddr)); + socksaddr.sin_family = AF_INET; + socksaddr.sin_port = htons(socksport); + socksaddr.sin_addr.s_addr = htonl(sockshost); + if (connect(s, (struct sockaddr*)&socksaddr, sizeof(socksaddr))) { + log_sock_error("connecting to SOCKS host", s); + goto err; + } + + if (version == 5) { + char method_buf[2]; + if (write_all(s, "\x05\x01\x00", 3, 1) != 3) { + log_err(LD_NET, "Error sending SOCKS5 method list."); + goto err; + } + if (read_all(s, method_buf, 2, 1) != 2) { + log_err(LD_NET, "Error reading SOCKS5 methods."); + goto err; + } + if (method_buf[0] != '\x05') { + log_err(LD_NET, "Unrecognized socks version: %u", + (unsigned)method_buf[0]); + goto err; + } + if (method_buf[1] != '\x00') { + log_err(LD_NET, "Unrecognized socks authentication method: %u", + (unsigned)method_buf[1]); + goto err; + } + } + + if ((len = build_socks_resolve_request(&req, "", hostname, reverse, + version))<0) { + log_err(LD_BUG,"Error generating SOCKS request"); + tor_assert(!req); + goto err; + } + if (write_all(s, req, len, 1) != len) { + log_sock_error("sending SOCKS request", s); + tor_free(req); + goto err; + } + tor_free(req); + + if (version == 4) { + char reply_buf[RESPONSE_LEN_4]; + if (read_all(s, reply_buf, RESPONSE_LEN_4, 1) != RESPONSE_LEN_4) { + log_err(LD_NET, "Error reading SOCKS4 response."); + goto err; + } + if (parse_socks4a_resolve_response(hostname, + reply_buf, RESPONSE_LEN_4, + result_addr)<0) { + goto err; + } + } else { + char reply_buf[16]; + if (read_all(s, reply_buf, 4, 1) != 4) { + log_err(LD_NET, "Error reading SOCKS5 response."); + goto err; + } + if (reply_buf[0] != 5) { + log_err(LD_NET, "Bad SOCKS5 reply version."); + goto err; + } + /* Give a user some useful feedback about SOCKS5 errors */ + if (reply_buf[1] != 0) { + log_warn(LD_NET,"Got SOCKS5 status response '%u': %s", + (unsigned)reply_buf[1], + socks5_reason_to_string(reply_buf[1])); + if (reply_buf[1] == 4 && !strcasecmpend(hostname, ".onion")) { + onion_warning(hostname); + } + goto err; + } + if (reply_buf[3] == 1) { + /* IPv4 address */ + if (read_all(s, reply_buf, 4, 1) != 4) { + log_err(LD_NET, "Error reading address in socks5 response."); + goto err; + } + tor_addr_from_ipv4n(result_addr, get_uint32(reply_buf)); + } else if (reply_buf[3] == 4) { + /* IPv6 address */ + if (read_all(s, reply_buf, 16, 1) != 16) { + log_err(LD_NET, "Error reading address in socks5 response."); + goto err; + } + tor_addr_from_ipv6_bytes(result_addr, reply_buf); + } else if (reply_buf[3] == 3) { + /* Domain name */ + size_t result_len; + if (read_all(s, reply_buf, 1, 1) != 1) { + log_err(LD_NET, "Error reading address_length in socks5 response."); + goto err; + } + result_len = *(uint8_t*)(reply_buf); + *result_hostname = tor_malloc(result_len+1); + if (read_all(s, *result_hostname, result_len, 1) != (int) result_len) { + log_err(LD_NET, "Error reading hostname in socks5 response."); + goto err; + } + (*result_hostname)[result_len] = '\0'; + } + } + + tor_close_socket(s); + return 0; + err: + tor_close_socket(s); + return -1; +} + +/** Print a usage message and exit. */ +static void +usage(void) +{ + puts("Syntax: tor-resolve [-4] [-5] [-v] [-x] [-p port] " + "hostname [sockshost[:socksport]]"); + exit(1); +} + +/** Entry point to tor-resolve */ +int +main(int argc, char **argv) +{ + uint32_t sockshost; + uint16_t socksport = 0, port_option = 0; + int isSocks4 = 0, isVerbose = 0, isReverse = 0; + char **arg; + int n_args; + tor_addr_t result; + char *result_hostname = NULL; + log_severity_list_t *s = tor_malloc_zero(sizeof(log_severity_list_t)); + + init_logging(1); + sandbox_disable_getaddrinfo_cache(); + + arg = &argv[1]; + n_args = argc-1; + + if (!n_args) + usage(); + + if (!strcmp(arg[0],"--version")) { + printf("Tor version %s.\n",VERSION); + return 0; + } + while (n_args && *arg[0] == '-') { + if (!strcmp("-v", arg[0])) + isVerbose = 1; + else if (!strcmp("-4", arg[0])) + isSocks4 = 1; + else if (!strcmp("-5", arg[0])) + isSocks4 = 0; + else if (!strcmp("-x", arg[0])) + isReverse = 1; + else if (!strcmp("-p", arg[0])) { + int p; + if (n_args < 2) { + fprintf(stderr, "No arguments given to -p\n"); + usage(); + } + p = atoi(arg[1]); + if (p<1 || p > 65535) { + fprintf(stderr, "-p requires a number between 1 and 65535\n"); + usage(); + } + port_option = (uint16_t) p; + ++arg; /* skip the port */ + --n_args; + } else { + fprintf(stderr, "Unrecognized flag '%s'\n", arg[0]); + usage(); + } + ++arg; + --n_args; + } + + if (isSocks4 && isReverse) { + fprintf(stderr, "Reverse lookups not supported with SOCKS4a\n"); + usage(); + } + + if (isVerbose) + set_log_severity_config(LOG_DEBUG, LOG_ERR, s); + else + set_log_severity_config(LOG_WARN, LOG_ERR, s); + add_stream_log(s, "", fileno(stderr)); + + if (n_args == 1) { + log_debug(LD_CONFIG, "defaulting to localhost"); + sockshost = 0x7f000001u; /* localhost */ + if (port_option) { + log_debug(LD_CONFIG, "Using port %d", (int)port_option); + socksport = port_option; + } else { + log_debug(LD_CONFIG, "defaulting to port 9050"); + socksport = 9050; /* 9050 */ + } + } else if (n_args == 2) { + if (addr_port_lookup(LOG_WARN, arg[1], NULL, &sockshost, &socksport)<0) { + fprintf(stderr, "Couldn't parse/resolve address %s", arg[1]); + return 1; + } + if (socksport && port_option && socksport != port_option) { + log_warn(LD_CONFIG, "Conflicting ports; using %d, not %d", + (int)socksport, (int)port_option); + } else if (port_option) { + socksport = port_option; + } else if (!socksport) { + log_debug(LD_CONFIG, "defaulting to port 9050"); + socksport = 9050; + } + } else { + usage(); + } + + if (network_init()<0) { + log_err(LD_BUG,"Error initializing network; exiting."); + return 1; + } + + if (do_resolve(arg[0], sockshost, socksport, isReverse, + isSocks4 ? 4 : 5, &result, + &result_hostname)) + return 1; + + if (result_hostname) { + printf("%s\n", result_hostname); + } else { + printf("%s\n", fmt_addr(&result)); + } + return 0; +} + diff --git a/src/wraith/src/tools/tor_runner.c b/src/wraith/src/tools/tor_runner.c new file mode 100644 index 000000000..9ed2ee577 --- /dev/null +++ b/src/wraith/src/tools/tor_runner.c @@ -0,0 +1,101 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * @file tor_runner.c + * @brief Experimental module to emulate tor_run_main() API with fork+exec + * + * The functions here are meant to allow the application developer to + * use the tor_run_main() API without having to care whether Tor is + * running in-process or out-of-process. For in-process usage, the + * developer can link Tor as a library and call tor_run_main(); for + * out-of-process usage, the developer can link this library instead. + * + * This interface is EXPERIMENTAL; please let us know if you would like + * to depend on it. We don't know yet whether it will be reliable in + * practice. + */ + +/* NOTE: This module is supposed to work without the standard Tor utility + * functions. Don't add more dependencies! + */ + +#include "tor_api.h" +#include "tor_api_internal.h" + +#include "orconfig.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_WAIT_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#include +#include + +#ifndef __GNUC__ +#define __attribute__(x) +#endif + +static void child(const tor_main_configuration_t *cfg) + __attribute__((noreturn)); + +int +tor_run_main(const tor_main_configuration_t *cfg) +{ + pid_t pid = fork(); + if (pid == 0) { + child(cfg); + exit(0); /* Unreachable */ + } + + pid_t stopped_pid; + int status = 0; + do { + stopped_pid = waitpid(pid, &status, 0); + } while (stopped_pid == -1); + + /* Note: these return values are not documented. No return value is + * documented! */ + + if (stopped_pid != pid) { + return -99999; + } + if (WIFSTOPPED(status)) { + return WEXITSTATUS(status); + } + if (WIFSIGNALED(status)) { + return -WTERMSIG(status); + } + + return -999988; +} + +/* circumlocution to avoid getting warned about calling calloc instead of + * tor_calloc. */ +#define real_calloc calloc + +static void +child(const tor_main_configuration_t *cfg) +{ + /* XXXX Close unused file descriptors. */ + + char **args = real_calloc(cfg->argc+1, sizeof(char *)); + memcpy(args, cfg->argv, cfg->argc * sizeof(char *)); + args[cfg->argc] = NULL; + + int rv = execv(BINDIR "/tor", args); + + if (rv < 0) { + exit(254); + } else { + abort(); /* Unreachable */ + } +} +